ZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9hYnN0ZWxscmF1bS5jIGIvZC9zZWhlci9oYWV1c2VyL2Fic3RlbGxyYXVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY3MWQ3NQotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci9hYnN0ZWxscmF1bS5jCkBAIC0wLDAgKzEsMTMgQEAKK2luaGVyaXQgIi9zdGQvcm9vbSI7CisjaW5jbHVkZSAiL2QvdW50ZXJ3ZWx0L3d1cnplbC93dXJ6ZWwuaCIgLy9ub2NoIHp1IGFlbmRlcm4uLi4KKworY3JlYXRlKCkgeworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfSEFVU19FUkxBVUJULDEpOworICBTZXRQcm9wKFBfSU5UX1NIT1JULCJEZXIgQWJzdGVsbHJhdW0gZnVlciBoZWltYXRsb3NlIFNlaGVyaGFldXNlciIpOworICBTZXRQcm9wKFBfSU5UX0xPTkcsQlMoIkhpZXIgbGFuZGVuIFNlaGVyaGFldXNlciwgZGllIGtlaW5lbiBQbGF0eiBtZWhyIGhhYmVuLiBXZW5uICIKKyAgKyJEZWluIEhhdXMgaGllciBzdGVodCwgd2VuZGUgRGljaCBhbSBiZXN0ZW4gYmFsZCBhbiBkZW4genVzdGFlbmRpZ2VuIE1hZ2llciBmdWVyIGRpZSAiCisgICsiSGFldXNlci5cbiIpKTsKKyAgQWRkRGV0YWlsKCJtYWdpZXIiLCJXdXJ6ZWwgb2RlciBXYXJnb24ga3VlbW1lcm4gc2ljaCBtb21lbnRhbiB1bSBkaWUgSGFldXNlci5cbiIpOworICBBZGRFeGl0KCJub3JkZW4iLCIvZ2lsZGVuL2FiZW50ZXVyZXIiKTsKK30KZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9hY2Nlc3NfcmlnaHRzLmMgYi9kL3NlaGVyL2hhZXVzZXIvYWNjZXNzX3JpZ2h0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFmNjA5N2QKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvYWNjZXNzX3JpZ2h0cy5jCkBAIC0wLDAgKzEsMTMgQEAKKy8qIDE1LjAzLjIwMDgsIEFyYXRob3JuCisgICAtIFdhcmdvbiB1bmQgV3VyemVsIGF1c2dldHJhZ2VuIGluIEFic3RpbW11bmcgbWl0IFpvb2sgKi8KKyNpbmNsdWRlICJoYXVzLmgiCisKK2ludCBhY2Nlc3NfcmlnaHRzKHN0cmluZyBldWlkLCBzdHJpbmcgZmlsZSkKK3sKKyAgLy8gcmV0dXJuICggZXVpZCA9PSAidmFuaW9uIiApOworCisgIC8vIERpZSBNYWludGFpbmVyIGRpZXNlcyBQYWtldHMgc2luZCBpbSBEZWZpbmUgTUFJTlRBSU5FUiAKKyAgLy8gaW4gL2Qvc2VoZXIvaGFldXNlci9oYXVzLmggemVudHJhbCBnZXBmbGVndAorICByZXR1cm4gKCBtZW1iZXIoTUFJTlRBSU5FUiwgZXVpZCkgIT0tMSk7Cit9CisKZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9iYXVzcGFydmVydHJhZy5jIGIvZC9zZWhlci9oYWV1c2VyL2JhdXNwYXJ2ZXJ0cmFnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRkOTk3NgotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci9iYXVzcGFydmVydHJhZy5jCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogIGJhdXNwYXJ2ZXJ0cmFnLmMgLS0gV2lyIGdlYmVuIHVuc2VybiBTZWhlcm4gZWluIFp1aGF1c2UuLi4KKyAqCisgKiAgR3J1bmR2ZXJzaW9uIHZvbiBKb2YsIHdlaXRlcmJlYXJiZWl0ZXQgdm9uIFdhcmdvbi4KKyAqCisgKiAkRGF0ZTogMTk5NC8xMi8xNyAxNTo1NjoxMSAkCisgKiAkUmV2aXNpb246IDEuNCAkCisgKiAkTG9nOiBiYXVzcGFydmVydHJhZy5jLHYgJAorICogUmV2aXNpb24gMS40ICAxOTk0LzEyLzE3ICAxNTo1NjoxMSAgV2FyZ29uCisgKiBFdHdhcyBtZWhyIFNpY2hlcmhlaXQgZ2VnZW4gWnVncmlmZmUgdm9uIGF1c3Nlbi4KKyAqCisgKiBSZXZpc2lvbiAxLjMgIDE5OTQvMTAvMjEgIDA5OjUyOjAzICBXYXJnb24KKyAqIHplcnJlaXNzZW4gZWluZ2ViYXV0LgorICoKKyAqIFJldmlzaW9uIDEuMiAgMTk5NC8xMC8wOSAgMjE6MDA6NTkgIFdhcmdvbgorICogTGF1ZnplaXQgZXRjLiBhdXNnZWJhdXQsIGRhIGRhcyB1ZWJlciBkZW4gQmxvY2sgYWJnZXdpY2tlbHQKKyAqIHdpcmQuCisgKiBGdW5rdGlvbiBFaW56YWhsdW5nKCkgZWluZ2ViYXV0ICh3aXJkIHZvbiBkZXIgQmFuayBhdWZnZXJ1ZmVuKS4KKyAqCisgKiBSZXZpc2lvbiAxLjEgIDE5OTQvMTAvMDkgIDIwOjQ5OjI4ICBXYXJnb24KKyAqIEluaXRpYWwgcmV2aXNpb24KKyAqCisgKi8KKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHJ0dF9jaGVja3MKKworI2luY2x1ZGUgImhhdXMuaCIKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bW92aW5nLmg+CisKK2luaGVyaXQgIi9zdGQvdGhpbmciOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuOworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfU0hPUlQsIkVpbiBCYXVzcGFydmVydHJhZyIpOworICBTZXRQcm9wKFBfTkFNRSwiQmF1c3BhcnZlcnRyYWciKTsKKyAgU2V0KFBfQVVUT0xPQURPQkosICh7MCwgVl9FUH0pICk7CisgIFNldChQX0FVVE9MT0FET0JKLCBTRUNVUkVELCBGX01PREUpOyAvLyBTaWNoZXIgaXN0IHNpY2hlci4uLgorICBTZXRQcm9wKFBfTk9EUk9QLDEpOworICBTZXRQcm9wKFBfTkVWRVJEUk9QLDEpOworICBTZXRQcm9wKFBfQVJUSUNMRSwxKTsKKyAgU2V0UHJvcChQX1dFSUdIVCwgMCk7CisgIFNldFByb3AoUF9HRU5ERVIsMSk7CisgIEFkZElkKCAoeyJiYXVzcGFydmVydHJhZyIsICJ2ZXJ0cmFnIiwgInNlaGVccnZlcnRyYWcifSkgKTsKKyAgQWRkQ21kKCJsaWVzIiwibGVzZW4iKTsKKyAgQWRkQ21kKCAoeyAidW50ZXJzY2hyZWliZSIsICJ1bnRlcnNjaHJlaWIiIH0pLCBsYW1iZGEoICh7fSksCisgICAgKHsjJywsICh7Iydub3RpZnlfZmFpbCwgIkhpZXIga2FubnN0IER1IGRlbiBWZXJ0cmFnIG5pY2h0IHVudGVyc2NocmVpYmVuIVxuIiB9KSwKKwkgICAoeyMncmV0dXJuLCAwfSkKKyAgICB9KSApICk7CisgIEFkZENtZCggKHsgInplcnJlaXNzIiwgInplcnJlaXNzZSIgfSksIGxhbWJkYSggKHsgJ3N0ciB9KSwKKyAgICAoeyMnLCwgKHsjJ25vdGlmeV9mYWlsLCAiV2FzIHdpbGxzdCBEdSB6ZXJyZWlzc2VuP1xuIn0pLAorCSAgICh7Iyc/ISwgKHsjJ2lkLCAnc3RyfSksICh7IydyZXR1cm4sIDB9KSB9KSwKKwkgICAoeyMnPSwgJ2JsaywgKHsjJ3ByZXNlbnQsICJcbiBibG9jayIsICh7Iyd0aGlzX3BsYXllcn0pIH0pIH0pLAorCSAgICh7Iyd3cml0ZSwgIkR1IHplcnJlaXNzdCBEZWluZW4gVmVydHJhZy5cbiJ9KSwKKwkgICAoeyMnd3JpdGVfZmlsZSwgUEFUSCsibG9nL0JBTksuTE9HIiwgKHsjJ3NwcmludGYsICIlcyAtIFZlcnRyYWc6ICVzIHplcnJpc3MgaWhuLlxuIiwKKwkgICAgICAgKHsjJ2R0aW1lLCAoeyMndGltZX0pIH0pLCAoeyMnZ2V0dWlkLCAoeyMndGhpc19wbGF5ZXJ9KX0pfSl9KSwKKwkgICAoeyMnPywgJ2JsaywgKHsjJ2NhbGxfb3RoZXIsICdibGssICJyZW1vdmUiLCAxfSkgfSksCisJICAgKHsjJ3JlbW92ZSwgMX0pLAorCSAgICh7IydyZXR1cm4sIDF9KQorICAgIH0pICkgKTsKK30KKworc3RyaW5nIF9xdWVyeV9sb25nKCkKK3sKKyAgaW50IG1heDsKKworICBtYXggPSAoUXVlcnkoUF9BVVRPTE9BRE9CSilbMV0gJiBWX0ZBU1QpID8gU1VNTUVfUyA6IFNVTU1FX0w7CisgIGlmIChRdWVyeShQX0FVVE9MT0FET0JKKVsxXSAmIFZfUkFVTSkKKyAgICBtYXggPSBtYXggKiA0LzEwOworICByZXR1cm4gc3ByaW50ZigKKyAgICAgICJEaWVzIGlzdCBlaW4gQmF1c3BhcnZlcnRyYWcuIER1IGhhc3QgYmlzaGVyICVkICh2b24gJWQpIFB1bmt0ZW4gZWluZ2V6YWhsdC5cbiIsCisgICAgICBRdWVyeVByb3AoUF9BVVRPTE9BRE9CSilbMF0sIG1heCk7Cit9CisKKyNpZiAwCitpbnQgcXVlcnlfcHJldmVudF9zaGFkb3cob2JqZWN0IG9iKQoreworICBITE9HKCJTSEFET1ciLCBzcHJpbnRmKCIlcywgdm9uICVPIGltIFZlcnRyYWcuXG4iLCBkdGltZSh0aW1lKCkpWzUuLl0sIG9iKSk7CisgIHJldHVybiAxOworfQorI2VuZGlmCisKK2ludCBsZXNlbihzdHJpbmcgc3RyKQoreworICBpZiAoaWQoc3RyKSkKKyAgeworICAgIGlmIChRdWVyeShQX0FVVE9MT0FET0JKKVsxXSAmIFZfUkFVTSkKKyAgICAgIHRoaXNfcGxheWVyKCktPk1vcmUoUEFUSCsidHh0L3ZlcnRyYWdfcmF1bS50eHQiLDEpOworICAgIGVsc2UKKyAgICAgIHRoaXNfcGxheWVyKCktPk1vcmUoUEFUSCsidHh0L3ZlcnRyYWcudHh0IiwxKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworaW50IEVpbnphaGx1bmcoKQoreworICBpbnQgKmFsOworICBvYmplY3QgZW52LCBwbzsKKworICBpZiAob2xkX2V4cGxvZGUob2JqZWN0X25hbWUocG89cHJldmlvdXNfb2JqZWN0KCkpLCIjIilbMF0gIT0gUEFUSCsic2JfZWluemFobHVuZyIpIHsKKyAgICBlbnYgPSBlbnZpcm9ubWVudCgpOworICAgIEhMT0coIChlbnYgPyBnZXR1aWQoZW52KSA6ICJCQU5LLkxPRyIpLCBzcHJpbnRmKCJWZXJ0cmFnOiBFaW56YWhsdW5nIHZvbiBhdXNzZW4hIFRJID0gJU8sIFBPID0gJU9cbiIsIHRoaXNfaW50ZXJhY3RpdmUoKSwgcHJldmlvdXNfb2JqZWN0KCkpKTsKKyAgfQorICBhbCA9IFF1ZXJ5KFBfQVVUT0xPQURPQkopOworICByZXR1cm4gU2V0KFBfQVVUT0xPQURPQkosICh7IGFsWzBdK1JBVEVOSE9FSEUsIGFsWzFdIH0pIClbMF07Cit9CisKK3ZvaWQgU2lnbihpbnQgZmxhZykKK3sKKyAgU2V0KFBfQVVUT0xPQURPQkosICh7IFF1ZXJ5KFBfQVVUT0xPQURPQkopWzBdLCBmbGFnIH0pICk7Cit9CisKK3B1YmxpYyBpbnQgbW92ZShtaXhlZCBkZXN0LCBpbnQgbWV0aCkKK3sKKyAgb2JqZWN0IHBlbnY7CisgIGludCByZXQ7CisKKyAgcGVudiA9IGVudmlyb25tZW50KCk7CisgIHJldCA9IDo6bW92ZShkZXN0LCBtZXRoKTsKKworICBpZiAocmV0ID09IDEgJiYgKHBlbnYgfHwgKG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSAhPSBQQVRIKyJzYl9hbnRyYWciICYmCisJCQkgICAgb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpICE9IChzdHJpbmdwKGRlc3QpID8gZGVzdCA6IG9iamVjdF9uYW1lKGRlc3QpKSkpKQorICAgIEhMT0coIk1PVklORyIsIHNwcmludGYoIlZlcnRyYWc6IHZvbiAlTyAtPiAlTyBtaXQgJU8gKCVPKVxuIiwgZW52aXJvbm1lbnQoKSwgZGVzdCwgcHJldmlvdXNfb2JqZWN0KCksIGdldHVpZChwcmV2aW91c19vYmplY3QoKSkpKTsKKyAgcmV0dXJuIHJldDsKK30KKworbWl4ZWQgX3NldF9hdXRvbG9hZG9iaihtaXhlZCBhbCkKK3sKKyAgLy8gTG9nZ2VuLCB3ZW5uIG5pY2h0IHZvbSBTcGllbGVyb2JqZWt0IHNlbGJlciB2aWEgZGVuCisgIC8vIEF1dG9sb2FkZXItTWVjaGFuaXNtdXMgZ2VzZXR6dC4KKyAgaWYgKHByZXZpb3VzX29iamVjdCgxKQorICAgICAgJiYgc3Ryc3RyKGxvYWRfbmFtZShwcmV2aW91c19vYmplY3QoMSkpLCIvc3RkL3NoZWxscyIpICE9IDApCisgICAgSExPRygiU0VUX0FMIixzcHJpbnRmKCJWZXJ0cmFnOiBUUCA9ICVPLCBQTyA9ICVPLCBFTlYgPSAlT1xuIiwKKyAgICAgICAgICB0aGlzX3BsYXllcigpLCBwcmV2aW91c19vYmplY3QoKSwgZW52aXJvbm1lbnQoKSkpOworCisgIC8qIEtvbXBhdGliaWxpdGFldCB6dSBhbHRlbiBWZXJ0cmFlZ2VuICovCisgIGlmIChwb2ludGVycChhbCkgJiYgIShhbFsxXSAmIFZfRVApKSB7CisgICAgYWxbMF0gKj0gNDsKKyAgICBhbFsxXSB8PSBWX0VQOworICAgIGNhbGxfb3V0KCJub3RpZnlDaGFuZ2UiLCAwLCB0aGlzX3BsYXllcigpKTsKKyAgfQorICByZXR1cm4gU2V0KFBfQVVUT0xPQURPQkosIGFsKTsKK30KKwordm9pZCBub3RpZnlDaGFuZ2Uob2JqZWN0IHdlbSkKK3sKKyAgdGVsbF9vYmplY3Qod2VtLAorICAgICAgICJcbk5BQ0hSSUNIVCBWT04gREVSIFNFSEVSQkFOSzpcbiIKKyAgICAgICsiRGllIFZlcnRyYWdzbW9kYWxpdGFldGVuIGhhYmVuIHNpY2ggZ2VhZW5kZXJ0ISBCaXR0ZSBsZXNlbiBTaWUgZGVuXG4iCisgICAgICArIlZlcnRyYWcgbm9jaCBlaW5tYWwgZ2VuYXUgZHVyY2ggKGluc2Jlcy4gQXJ0LiA0KSFcbiIKKyAgICAgICsiU3RhdHQgR2VsZCBoYWJlbiBTaWUgamV0enQgRXJmYWhydW5nc3B1bmt0ZSB6dSB6YWhsZW4hXG5cbiIgKTsKK30KKwpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL2Jsb2NrLmMgYi9kL3NlaGVyL2hhZXVzZXIvYmxvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjAxMWVkCi0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL2Jsb2NrLmMKQEAgLTAsMCArMSwzMjQgQEAKKy8vIGJsb2NrLmMgLS0gSGllciBzYW1tZWxuIHNpY2ggZGllIFJhdGVuIGZ1ZXIgZGFzIFNlaGVyaGF1cworLy8KKy8vIChjKSAxOTk0IFdhcmdvbkBNb3JnZW5HcmF1ZW4KKy8vCisvLyAkSWQ6IGJsb2NrLmMsdiAxLjIgMjAwMy8xMS8xNSAxMzo1NjowMSBtdWQgRXhwICQKKy8vCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8bW92aW5nLmg+CisjaW5jbHVkZSA8Y29tYmF0Lmg+CisjaW5jbHVkZSAiaGF1cy5oIgorCitpbmhlcml0ICJzdGQvY2xvdGhpbmciOworCitwcml2YXRlIG5vc2F2ZSBpbnQgc2hhZG93aW5nOworCitjcmVhdGUoKQoreworICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuOworCisgIDo6Y3JlYXRlKCk7CisKKyAgU2V0UHJvcCggUF9TSE9SVCwgIkRlciBNRyBNQVNURVItQkxPQ0siICk7CisgIFNldFByb3AoIFBfTkFNRSwgIk1BU1RFUkJMT0NLIiApOworICBTZXRQcm9wKCBQX1dFSUdIVCwgMTAwICk7CisgIFNldFByb3AoIFBfR0VOREVSLCBNQUxFICk7CisgIFNldFByb3AoIFBfTk9EUk9QLCAxICk7CisgIFNldFByb3AoIFBfTkVWRVJEUk9QLCAxICk7CisgIC8vIHdlbm4gZXMga2VpbmVuIFRQIGdpYnQsIG11c3MgZGFzIERpbmcgcGVyIFNldFByb3AoUF9BVVRPTE9BRE9CSikKKyAgLy8ga29uZmlndXJpZXJ0IHdlcmRlbiwgbmljaHQgaGllci4gWmVzc3RyYSwgMjAuMTAuMjAwNworICBpZiAob2JqZWN0cCh0aGlzX3BsYXllcigpKSkKKyAgICBTZXQoIFBfQVVUT0xPQURPQkosICh7IDAsIHRoaXNfcGxheWVyKCktPlF1ZXJ5UHJvcChQX0FHRSkgKyBNQVhfVElNRSwgCisJICAgICAgICAgICAgICAgICAgIE1BWF9USU1FLzIsIEJfRVAgfSkgKTsKKyAgU2V0KCBQX0FVVE9MT0FET0JKLCBTRUNVUkVELCBGX01PREUgKTsKKyAgU2V0UHJvcCggUF9OT0JVWSwgMSApOworICBTZXRQcm9wKFBfTUFURVJJQUwsIE1BVF9NQVJCTEUpOworCisgIFNldFByb3AoUF9XRUFSX0ZVTkMsIHRoaXNfb2JqZWN0KCkpOworICBTZXRQcm9wKFBfUkVNT1ZFX0ZVTkMsIHRoaXNfb2JqZWN0KCkpOworCisgIEFkZElkKCAoeyAiYmxvY2siLCAibWFzdGVyYmxvY2siLCAibWFzdGVyLWJsb2NrIiwgIk1HIE1BU1RFUi1CTE9DSyIsICJtZyBtYXN0ZXItYmxvY2siLCAiXG4gYmxvY2siIH0pICk7CisKKyAgQWRkQ21kKCAiIiwgInJlbWluZE1lIiwgMSk7Cit9CisKK2ludCBxdWVyeV9wcmV2ZW50X3NoYWRvdyhvYmplY3Qgb2IpCit7CisgIEhMT0coIlNIQURPVyIsIHNwcmludGYoIiVzLCB2b24gJU8gaW0gQmxvY2suXG4iLGR0aW1lKHRpbWUoKSlbNS4uXSwgb2IpKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludAorV2VhckZ1bmMob2JqZWN0IG1lKQoreworICBpZiAoIXNoYWRvd2luZyAmJiAoUXVlcnkoUF9BVVRPTE9BRE9CSilbVl9GTEFHU10gJiBCX0FDVElWRSkgKSB7CisgICAgY2xvbmVfb2JqZWN0KCIvc3RkL3BsYXllci9zaGFkb3dzL2Jsb2NrX3NoYWRvdyIpOworICAgIHNoYWRvd2luZyA9IDE7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2ludAorUmVtb3ZlRnVuYyhvYmplY3QgbWUpCit7CisgIC8vIG1hbmNobWFsIGdpYnRzIGtlaW5lbiBUUCB1bmQgbWFjaG1hbCBpc3QgVFAgbmljaHQgZGVyIFNwaWVsZXIsIGRlciBkZW4KKyAgLy8gQmxvY2sgdHJhZWd0LgorICBpZiAodGhpc19wbGF5ZXIoKSAmJiB0aGlzX3BsYXllcigpID09IGVudmlyb25tZW50KCkpIHsKKyAgICBzaGFkb3dpbmcgPSAwOworICAgIHRoaXNfcGxheWVyKCktPlNlaGVySGF0R2VudWcoKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorX3F1ZXJ5X3ZhbHVlKCkKK3sKKyAgcmV0dXJuKCBRdWVyeShQX0FVVE9MT0FET0JKKVswXSApOworfQorCitzdGF0aWMgaW50CitfcXVlcnlfY3Vyc2VkKCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK19zZXRfc2Nod2VyKGludCBzY2h3ZXIpCit7CisgIGludCAqYWw7CisKKyAgYWwgPSBRdWVyeShQX0FVVE9MT0FET0JKKTsKKyAgaWYgKHNjaHdlciAmJiAhKGFsW1ZfRkxBR1NdICYgQl9GQVNUKSkgeworICAgIGFsW1ZfRExJTkVdIC09IE1BWF9USU1FLzI7CisgICAgYWxbVl9XVElNRV0gLz0gMjsKKyAgICBhbFtWX0ZMQUdTXSB8PSBCX0ZBU1Q7CisgIH0KKyAgZWxzZSBpZiAoIXNjaHdlciAmJiAoYWxbVl9GTEFHU10gJiBCX0ZBU1QpKSB7CisgICAgYWxbVl9ETElORV0gKz0gTUFYX1RJTUUvMjsKKyAgICBhbFtWX1dUSU1FXSAqPSAyOworICAgIGFsW1ZfRkxBR1NdICY9IH5CX0ZBU1Q7CisgIH0KKyAgU2V0KCBQX0FVVE9MT0FET0JKLCBhbFswLi5dKTsKKyAgcmV0dXJuIGFsW1ZfRkxBR1NdICYgQl9GQVNUOworfQorCitzdGF0aWMgaW50CitfcXVlcnlfc2Nod2VyKCkKK3sKKyAgcmV0dXJuIChRdWVyeShQX0FVVE9MT0FET0JKKVtWX0ZMQUdTXSAmIEJfRkFTVCk7Cit9CisKK3N0YXRpYyBtaXhlZAorX3NldF9hdXRvbG9hZG9iaihtaXhlZCBhbCkKK3sKKyAgb2JqZWN0IHRpOworCisgIGlmICgodGkgPSB0aGlzX2ludGVyYWN0aXZlKCkpICYmIG9sZF9leHBsb2RlKG9iamVjdF9uYW1lKHRpKSwiIyIpWzBdICE9ICIvc2VjdXJlL2xvZ2luIikKKyAgICBITE9HKCJTRVRfQUwiLHNwcmludGYoIkJsb2NrOiBUSSA9ICVPLCBFTlYgPSAlT1xuIix0aGlzX2ludGVyYWN0aXZlKCksIGVudmlyb25tZW50KCkpKTsKKworICAvKiBLb21wYXRpYmlsaXRhZXQuLi4gKi8KKyAgaWYgKHBvaW50ZXJwKGFsKSAmJiAhKGFsW1ZfRkxBR1NdICYgQl9FUCkpIHsKKyAgICBhbFtWX01PTkVZXSAqPSA0OworICAgIGFsW1ZfRkxBR1NdIHw9IEJfRVA7CisgIH0KKyAgcmV0dXJuIFNldChQX0FVVE9MT0FET0JKLCBhbCk7Cit9CisKK3N0YXRpYyBzdHJpbmcKK19xdWVyeV9sb25nKCkKK3sKKyAgaW50ICphbDsKKyAgaW50IGxhdWZ6ZWl0LCBlaW56YWhsdW5nOworICBpbnQgcmF0ZW5ob2VoZTsKKyAgc3RyaW5nIHJldDsKKworICBhbCA9IFF1ZXJ5KFBfQVVUT0xPQURPQkopOworICByZXQgPSAiRGllcyBpc3QgZGVyIE1HIE1BU1RFUi1CTE9DSy4gRXIgYmVzdGVodCBhdXMgbWFzc2l2ZW0gTWFybW9yLCB1bSBkaWUgU2ljaGVyLVxuIgorICAgICAgICsiaGVpdCBkZXIgZWluZ2V6YWhsdGVuIFJhdGUgenUgZ2V3YWVocmxlaXN0ZW4uIE1pdCBlaW5lbSBHb2xka2V0dGNoZW4gdmVyc2VoZW4sXG4iCisgICAgICAgKyJrYW5uIG1hbiBpaG4gdHJhZ2VuIHdpZSBlaW4gQW11bGV0dC4gRGllcyBpc3QgYXVjaCBub2V0aWcsIHdlbm4gYXVmIGRlbiBCbG9ja1xuIgorICAgICAgICsiZWluZ2V6YWhsdCB3ZXJkZW4gc29sbC5cbiI7CisKKyAgcmF0ZW5ob2VoZSA9IFJBVEVOSE9FSEU7CisgIGlmIChhbFtWX0ZMQUdTXSAmIEJfRVhURU5EKQorICAgIHJhdGVuaG9laGUgKz0gKFJBVEVOSE9FSEUqNikvMTA7CisgIGxhdWZ6ZWl0ID0gMiooYWxbVl9ETElORV0tdGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKFBfQUdFKSk7CisgIGVpbnphaGx1bmcgPSBhbFtWX01PTkVZXTsKKworICBpZiAobGF1ZnplaXQgPCAwKQorICAgIHJldCArPSAiTGVpZGVyIGhhc3QgRHUgZGllIFphaGx1bmcgZGllc2VyIFJhdGUgdmVycGFzc3QhXG4iOworICBlbHNlIHsKKyAgICBpZiAoZWluemFobHVuZyA+PSByYXRlbmhvZWhlKQorICAgICAgcmV0ICs9ICJFciBpc3Qgdm9sbHN0YWVuZGlnIG1pdCBkZXIgUmF0ZSBnZWZ1ZWxsdC5cbiI7CisgICAgZWxzZQorICAgICAgcmV0ICs9IHNwcmludGYoICJEdSBoYXN0IGJpcyBqZXR6dCAlZCAodm9uICVkKSBQdW5rdGVuIGVpbmdlemFobHQuXG4iLCBlaW56YWhsdW5nLCByYXRlbmhvZWhlICk7CisKKyAgICByZXQgKz0gdGltZTJzdHJpbmcoIkRpZXNlIFJhdGUgbXVzcyBiaXMgaW4gJWggJUgsICVtICVNIHVuZCAlcyAlUyBhYmJlemFobHQgc2VpbiFcbiIsIGxhdWZ6ZWl0KTsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CityZW1pbmRNZSgpCit7CisgIGludCBub2NoLCBuZXh0LCAqYWwsIHJhdGVuaG9laGU7CisgIG9iamVjdCB2ZXJ0cmFnOworCisgIGFsID0gUXVlcnkoUF9BVVRPTE9BRE9CSik7CisgIG5leHQgPSBhbFtWX1dUSU1FXTsKKyAgcmF0ZW5ob2VoZSA9IFJBVEVOSE9FSEU7CisgIGlmIChhbFtWX0ZMQUdTXSAmIEJfRVhURU5EKQorICAgIHJhdGVuaG9laGUgKz0gKFJBVEVOSE9FSEUqNikvMTA7CisKKyAgaWYgKGFsW1ZfTU9ORVldIDwgcmF0ZW5ob2VoZSkgeworICAgIG5vY2ggPSBhbFtWX0RMSU5FXS10aGlzX3BsYXllcigpLT5RdWVyeVByb3AoUF9BR0UpOworICAgIGlmIChub2NoID49IDApIHsKKyAgICAgIGlmIChuZXh0ID4gbm9jaCkgeworCWNhbGxfb3V0KCJkb1JlbWluZCIsIDAsIHRoaXNfcGxheWVyKCksIHRpbWUyc3RyaW5nKCAiRGllIG5hZWNoc3RlIFJhdGUgd2lyZCBpbiAlaCAlSCwgJW0gJU0gdW5kICVzICVTIGZhZWxsaWchXG4iLCAyKm5vY2gpKTsKKwlkbyBuZXh0IC09IFdBUk5fVElNRTsgd2hpbGUgKG5leHQ+MCAmJiBuZXh0Pm5vY2gpOworCWlmIChuZXh0IDwgMCkKKwkgIG5leHQgPSAwOworCWFsW1ZfV1RJTUVdID0gbmV4dDsKKwlTZXQoUF9BVVRPTE9BRE9CSiwgYWxbMC4uXSk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgaWYgKGFsW1ZfRkxBR1NdICYgQl9FWFRFTkQpIHsKKwlzdHJpbmcgczsKKworCXdyaXRlKCAiRHUgaGFzdCBkaWUgU3RyYWZyYXRlIG5pY2h0IGJlemFobHQhXG4iICk7CisJaWYgKHZlcnRyYWcgPSBwcmVzZW50KCAic2VoZVxydmVydHJhZyIsIHRoaXNfcGxheWVyKCkpKSB7CisJICB3cml0ZSggIkRhbWl0IHZlcmZhZWxsdCBhdWNoIERlaW4gQmF1c3BhcnZlcnRyYWchIFVuZCBkYXMgaW0gd2FocnN0ZW4gU2lubmUgZGVzXG5Xb3J0ZXMuLi5cbiIgKTsKKwkgIHZlcnRyYWctPnJlbW92ZSgpOworCX0KKwlzID0gIkJsb2NrOiAiK2dldHVpZCh0aGlzX3BsYXllcigpKSsiIGhhdCB1ZWJlcnpvZ2VuLi4uIDspXG4iOworCUhMT0coZ2V0dWlkKHRoaXNfcGxheWVyKCkpLCBzKTsKKwlITE9HKCJCQU5LLkxPRyIsIHMpOworCXJlbW92ZSgxKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworCXdyaXRlKCAiRHUgaGFzdCBkaWUgbGV0enRlIFJhdGVuemFobHVuZyB2ZXJwYXNzdCFcbiIKKwkgICAgICArIkRpZSBSYXRlbmhvZWhlIGVyaG9laHQgc2ljaCB1bSBkaWUgU3RyYWZnZWJ1ZWhyLlxuIiApOworCWFsW1ZfRkxBR1NdIHw9IEJfRVhURU5EOworCWlmIChhbFtWX0ZMQUdTXSAmIEJfRkFTVCkgeworCSAgYWxbVl9ETElORV0gKz0gTUFYX1RJTUUvNDsKKwkgIGFsW1ZfV1RJTUVdID0gTUFYX1RJTUUvODsKKwl9CisJZWxzZSB7CisJICBhbFtWX0RMSU5FXSArPSBNQVhfVElNRS8yOworCSAgYWxbVl9XVElNRV0gPSBNQVhfVElNRS80OworCX0KKwlTZXQoIFBfQVVUT0xPQURPQkosIGFsWzAuLl0pOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiAwOworfQorCitpbnQKK0d1dHNjaHJlaWJlbihpbnQgbW9uZXkpCit7CisgIGludCBiYWNrLCByYXRlbmhvZWhlOworICBtaXhlZCBhbDsKKworICBpZiAoIVF1ZXJ5UHJvcChQX1dPUk4pKSAgLy8gWnVtIEd1dHNjaHJlaWJlbiBtdXNzIGRlciBCbG9jayBnZXRyYWdlbiB3ZXJkZW4hCisgICAgcmV0dXJuIG1vbmV5OworCisgIGFsID0gUXVlcnkoUF9BVVRPTE9BRE9CSik7CisgIGJhY2sgPSAwOworCisgIHJhdGVuaG9laGUgPSBSQVRFTkhPRUhFOworICBpZiAoYWxbVl9GTEFHU10gJiBCX0VYVEVORCkKKyAgICByYXRlbmhvZWhlICs9IChSQVRFTkhPRUhFKjYpLzEwOworCisgIGlmIChvbGRfZXhwbG9kZShvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSksIiMiKVswXSAhPSAiL3N0ZC9wbGF5ZXIvc2hhZG93cy9ibG9ja19zaGFkb3ciKSB7CisgICAgbWl4ZWQgZW52OworCisgICAgZW52ID0gZW52aXJvbm1lbnQoKTsKKyAgICBpZiAoZW52KQorICAgICAgZW52ID0gZ2V0dWlkKGVudik7CisgICAgZWxzZQorICAgICAgZW52ID0gIkJBTksuTE9HIjsKKyAgICBITE9HKGVudiwgc3ByaW50ZigiQmxvY2s6IEd1dHNjaHJpZnQgdm9uIGF1c3NlbiAoJWQgRVApLCBUSSA9ICVPKSFcbiIsIG1vbmV5LCB0aGlzX2ludGVyYWN0aXZlKCkpKTsKKyAgfQorICBhbFtWX01PTkVZXSArPSBtb25leTsKKyAgaWYgKGFsW1ZfTU9ORVldID49IHJhdGVuaG9laGUpIHsgIC8vIGdlbnVnIGVpbmdlemFobHQuLi4KKyAgICBiYWNrID0gYWxbVl9NT05FWV0tcmF0ZW5ob2VoZTsKKyAgICBhbFtWX01PTkVZXSA9IHJhdGVuaG9laGU7CisgICAgYWxbVl9GTEFHU10gJj0gfkJfQUNUSVZFOworICAgIG1vbmV5IC09IGJhY2s7CisgICAgY2FsbF9vdXQoImJsb2NrVm9sbCIsMCxlbnZpcm9ubWVudCgpKTsKKyAgfQorCisgIFNldChQX0FVVE9MT0FET0JKLCBhbFswLi5dKTsKKworICByZXR1cm4gYmFjazsKK30KKwordm9pZAorYmxvY2tWb2xsKG9iamVjdCBwbCkKK3sKKyAgdGVsbF9vYmplY3QocGwsICJEZXIgQmxvY2sgZnVlciBkaWVzZSBSYXRlIGlzdCBqZXR6dCB2b2xsIVxuIik7CisgIHBsLT5TZWhlckhhdEdlbnVnKCk7CS8vIHNoYWRvdyBlbnRmZXJuZW4KK30KKwordm9pZAorZG9SZW1pbmQob2JqZWN0IHBsLCBzdHJpbmcgc3RyKQoreworICB0ZWxsX29iamVjdChwbCwgc3RyKTsKK30KKworcHJvdGVjdGVkIGludCBQcmV2ZW50TW92ZShvYmplY3QgZGVzdCwgb2JqZWN0IG9sZGVudiwgaW50IG1ldGhvZCkgeworICBpZiAocHJldmlvdXNfb2JqZWN0KCkgJiYgcHJldmlvdXNfb2JqZWN0KCktPlF1ZXJ5QnV5RmFjdCgpKSAvLyBJbSBMYWRlbi4uLgorICAgIHJldHVybiBNRV9DQU5UX0JFX0RST1BQRUQ7CisgIHJldHVybiA6OlByZXZlbnRNb3ZlKGRlc3QsIG9sZGVudiwgbWV0aG9kKTsKK30KKworcHJvdGVjdGVkIHZvaWQgTm90aWZ5TW92ZShvYmplY3QgZGVzdCwgb2JqZWN0IG9sZGVudiwgaW50IG1ldGhvZCkgeworCisgIGlmIChvbGRlbnYgfHwgKG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSAhPSBQQVRIKyJzYl9hbnRyYWciICYmCisJCSAgb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpICE9IFBBVEgrInNiX2VpbnphaGx1bmciICYmCisJCSAgb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpICE9IG9iamVjdF9uYW1lKGRlc3QpKSkKKyAgICBITE9HKCJNT1ZJTkciLCBzcHJpbnRmKCJCbG9jazogdm9uICVPIC0+ICVPIG1pdCAlTyAoJU8pXG4iLAorCQkJICAgZW52aXJvbm1lbnQoKSwgZGVzdCwKKwkJCSAgIHByZXZpb3VzX29iamVjdCgpLCBnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpKSk7CisKKyAgcmV0dXJuIDo6Tm90aWZ5TW92ZShkZXN0LCBvbGRlbnYsIG1ldGhvZCk7Cit9CisKK2ludAorcmVtb3ZlKGludCBzaWxlbnQpCit7CisgIGlmIChjbG9uZXAodGhpc19vYmplY3QoKSkgJiYgZW52aXJvbm1lbnQoKSkKKyAgICBlbnZpcm9ubWVudCgpLT5TZWhlckhhdEdlbnVnKCk7CisKKyAgcmV0dXJuIDo6cmVtb3ZlKHNpbGVudCk7Cit9CisKKy8vICRMb2c6IGJsb2NrLmMsdiAkCisvLyBSZXZpc2lvbiAxLjIgIDIwMDMvMTEvMTUgMTM6NTY6MDEgIG11ZAorLy8gTUFUX01BUkJMRQorLy8KKy8vIFJldmlzaW9uIDEuMS4xLjEgIDIwMDAvMDgvMjAgMjA6MjI6NDIgIG11ZAorLy8gSW5zIENWUyBlaW5nZWNoZWNrdAorLy8KKy8vIFJldmlzaW9uIDEuNCAgMTk5NC8xMi8xNyAgMTU6NTY6NTggIFdhcmdvbgorLy8gRXR3YXMgbWVociBTaWNoZXJoZWl0IGdlZ2VuIFp1Z3JpZmZlIHZvbiBhdXNzZW4uCisvLworLy8gUmV2aXNpb24gMS4zICAxOTk0LzEwLzIxICAwOTo1MDoyMCAgV2FyZ29uCisvLyBsb25nKCktPl9xdWVyeV9sb25nKCkKKy8vIFNoYWRvdyB3aXJkIG51ciBha3Rpdiwgd2VubiBkZXIgQmxvY2sgZ2V6dWVja3QgaXN0LgorLy8KKy8vIFJldmlzaW9uIDEuMiAgMTk5NC8xMC8wOSAgMjE6MDQ6MjcgIFdhcmdvbgorLy8gTWFuIGthbm4gamV0enQgZWluc3RlbGxlbiwgb2IgZGVyIEJsb2NrIHp1IGVpbmVtIGxlaWNodGVuLCBhYmVyCisvLyB0ZXVyZXJlbiBvZGVyIHp1IGVpbmVtIHNjaHdlcmVuLCBhYmVyIGJpbGxpZ2VyZW4gVmVydHJhZyBnZWhvZXJ0LgorLy8gRmFsbHMgbWFuIGVpbmUgUmF0ZSB2ZXJwYXNzdCBoYXQsIHZlcmZhZWxsdCBkYW1pdCBhdWNoIGRlciBWZXItCisvLyB0cmFnLgorLy8gR3V0Z2VzY2hyaWViZW4gd2lyZCBudXIsIHdlbm4gZGVyIEJsb2NrIGdlenVlY2t0IGlzdC4KKy8vIEd1dHNjaHJlaWJlbigpIGxpZWZlcnQgdWViZXJ6YWVobGlnZXMgR2VsZCB6dXJ1ZWNrLgorLy8KKy8vIFJldmlzaW9uIDEuMSAgMTk5NC8xMC8wNyAgMTQ6MzU6MzQgIFdhcmdvbgorLy8gSW5pdGlhbCByZXZpc2lvbgorLy8KZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9oYWV1c2VyLnR4dCBiL2Qvc2VoZXIvaGFldXNlci9oYWV1c2VyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTQ1MTU3Ci0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL2hhZXVzZXIudHh0CkBAIC0wLDAgKzEsNjMzIEBACitJbmhhbHRzdmVyemVpY2huaXM6CisKKzEuLiBLdXJ6dWViZXJzaWNodCBkZXIgRmlsZXMKKzIuLiBEZXIgSGF1c3ZlcndhbHRlcgorMy4uIFNvbmRlcnJlY2h0ZQorNC4uIERpZSBUb29scworNGEuLi4gRGVyIEhhdXNtZWlzdGVyCis0Yi4uLiBsaXN0ZS5jCis0Yy4uLiBoYXVzdG9vbC5jCis1Li4gRGFzIEhhdXMKKzVhLi4uIEF1c3NlbmFuc2ljaHQgICAgLSBoYXVzLmMKKzViLi4uIERpZSBSYWV1bWUgICAgICAgLSByYXVtLmMKKzVjLi4uIERlciBFaW5nYW5nc3JhdW0gLSByYXVtMC5jCis1ZC4uLiBEaWUgVHJ1aGUgICAgICAgIC0gdHJ1aGUuYworNi4uIFNlaGVyYmFuay9IYXVzZXJ3ZXJiCis3Li4gQmVzY2hyZWlidW5nZW4KKzdhLi4uIERldGFpbHMvUmVhZERldGFpbHMvTGFuZy0gdW5kIEt1cnpiZXNjaHJlaWJ1bmcKKzdiLi4uIEF1c2dhZW5nZQorN2MuLi4gTGljaHQKKzdkLi4uIEJlZmVobGUKKzguLiBSdWVja21lbGR1bmdlbgorOS4uIEhpbGZlc2VpdGVuCisKKzEuIEt1cnp1ZWJlcnNpY2h0IGRlciBGaWxlcworPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy9kL3NlaGVyL2hhZXVzZXIvCisKKyAgLyogQW0gYWxsZXJ3aWNodGlnc3RlbjogKi8KKyAgaGF1cy5oIC4uLi4uLi4uLi4uLi4uLi4uLi4uIERlZmluaXRpb25lbiwgZGllIHVlYmVyYWxsIGJlbnV0enQgd2VyZGVuCisgIGFjY2Vzc19yaWdodHMuYyAuLi4uLi4uLi4uLiBEaWUgTGV1dGUgbWl0IEhhdXN6dWdyaWZmCisKKyAgLyogS2VpbmUgSGFldXNlciBvaG5lIFZlcndhbHR1bmcgKi8KKyAgaGF1c3ZlcndhbHRlci5jIC4uLi4uLi4uLi4uIERpZSBaZW50cmFsc3RlbGxlIGRlciBTZWhlcmhhZXVzZXIKKyAgSEFFVVNFUiAuLi4uLi4uLi4uLi4uLi4uLi4uIEluZm9zIHVlYmVyIEhhdXNiZXNpdHplciAoV2VyLCB3bywgd2llIGdyb3NzKQorCisgIHNhdmUvCisgICAgaGFldXNlci5vIC4uLi4uLi4uLi4uLi4uLi4uIERhcyBTYXZlZmlsZSBkZXMgSGF1c3ZlcndhbHRlcnMKKworICB0b29scy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4gU2FtbWVscGxhdHogZnVlciBUb29scyB6dSBkZW4gSGFldXNlcm4KKyAgICBoYXVzbWVpc3Rlci5jIC4uLi4uLi4uLi4uLi4gVmVybGVnZW4sIEFicmVpc3NlbiwgLmMtRmlsZXMgZXJzdGVsbGVuCisgICAgaGF1cy5hcHggLi4uLi4uLi4uLi4uLi4uLi4uIEZ1ZXIgLmMtRmlsZSBlaW5lcyBIYXVzZXMKKyAgICBsaXN0ZS5jIC4uLi4uLi4uLi4uLi4uLi4uLi4gWmVpZ3QgZ2Vsb2VzY2h0ZSB1bmQgZ2UtV2l6LXRlIEhhdXNiZXNpdHplcgorICAgIGhhdXN0b29sLmMgLi4uLi4uLi4uLi4uLi4uLiAob2Jzb2xldGUpCisKKyAgLyogRXJ3ZXJiIGVpbmVzIEhhdXNlcy9SYXVtZXMgKi8KKyAgc2VoZXJiYW5rLmMgLi4uLi4uLi4uLi4uLi4uIERhcyBCYW5rZ2ViYWV1ZGUKKworICBxdWV1ZS5jIC4uLi4uLi4uLi4uLi4uLi4uLi4gRGllIFNjaGxhbmdlbiB2b3IgZGVuIFNjaGFsdGVybgorICBxdWV1ZS5oCisKKyAgc2JfYW50cmFnLmMgLi4uLi4uLi4uLi4uLi4uIFNjaGFsdGVyIHp1bSBCZWFudHJhZ2VuIGVpbmVzIFZlcnRyYWdlcworICBzYl9laW56YWhsdW5nLmMgLi4uLi4uLi4uLi4gU2NoYWx0ZXIgenVtIEVpbnphaGxlbiBlaW5lciBSYXRlCisgIHNiX2F1c2dhYmUuYyAuLi4uLi4uLi4uLi4uLiBTY2hhbHRlciB6dW0gQWJob2xlbiBlaW5lcyBIYXVzZXMKKworICBiYXVzcGFydmVydHJhZy5jIC4uLi4uLi4uLi4gQXVmIGRlbSBWZXJ0cmFnIHdlcmRlbiBkaWUgUmF0ZW4gdmVybWVya3QKKyAga29tbWVudGFyLmMgLi4uLi4uLi4uLi4uLi4uIEtvbW1lbnRhcmUgenVtIHVua2xhcmVuIFZlcnRyYWdzdGV4dAorCisgIHR4dC8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiBIaWVyIHN0ZWhlbiBkaWUgZWlnZW50bGljaGVuIFZlcnRyYWdzdGV4dGUKKyAgICB2ZXJ0cmFnLnR4dCAuLi4uLi4uLi4uLi4uLi4gYSkgZnVlciBlaW5lbiBIYXVzLVZlcnRyYWcKKyAgICB2ZXJ0cmFnX3JhdW0udHh0IC4uLi4uLi4uLi4gYikgZnVlciBlaW5lbiBBdXNiYXV2ZXJ0cmFnCisgICAga29tbWVudGFyLnR4dCAuLi4uLi4uLi4uLi4uIGMpIGVya2xhZXJlbmRlIEJlbWVya3VuZ2VuIHp1IGRlbiBUZXh0ZW4KKworICBibG9jay5jIC4uLi4uLi4uLi4uLi4uLi4uLi4gRGVyIEJsb2NrIHZlcndhbHRldCBkaWUgbGF1ZmVuZGUgUmF0ZQorICAvc3RkL3BsYXllci9zaGFkb3dzL2Jsb2NrX3NoYWRvdy5jCisKKyAgdHJhZ2hhdXMuYyAuLi4uLi4uLi4uLi4uLi4uIERhcyBiZWtvbW10IG1hbiBhbSBBdXNnYWJlc2NoYWx0ZXIKKworICBsb2cvIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gTG9nZ2luZyBkZXIgQmFuaywgZGVzIEJsb2NrcywgZGVzIFZlcnRyYWdlcworCisgIC8qIERpZSBIYWV1c2VyIHNlbGJzdCAqLworICB2aXJ0dWFsX2NvbXBpbGVyLmMgLi4uLi4uLi4gT3JkbmV0IGRpZSBIYWV1c2VyIHBhc3NlbmQgenUKKyAgaGF1cy5jIC4uLi4uLi4uLi4uLi4uLi4uLi4uIERpZSBBdXNzZW5hbnNpY2h0IGRlcyBIYXVzZXMKKyAgcmF1bS5jIC4uLi4uLi4uLi4uLi4uLi4uLi4uIEFsbGdlbWVpbmUgRnVua3Rpb25lbiBkZXIgUmFldW1lCisgIHJhdW0wLmMgLi4uLi4uLi4uLi4uLi4uLi4uLiBEZXIgRWluZ2FuZ3NyYXVtIGhhdCBlaW5pZ2UgWnVzYXR6ZmVhdHVyZXMKKyAgbW9kdWxlcy8gLi4uLi4uLi4uLi4uLi4uLi4uIEhpbGZzbW9kdWxlOgorICAgIGhhdXN0dWVyLmMgLi4uLi4uLi4uLi4uLi4uLiBCZXNjaHJlaWJ1bmcgZGVyIEhhdXN0dWVyLCBPZWZmbmVuL1NjaGxpZXNzZW4KKyAgICBsb3NhLmMgLi4uLi4uLi4uLi4uLi4uLi4uLi4gRXJ3ZWl0ZXJ0ZXMgTGFkZW4gdW5kIFNwZWljaGVybiBkZXIgUmFldW1lCisgICAgdXNlcmNtZC5jIC4uLi4uLi4uLi4uLi4uLi4uIEFsbGVzIGZ1ZXIgYmVudXR6ZXJkZWZpbmllcnRlIEJlZmVobGUKKyAgdHJ1aGUuYyAuLi4uLi4uLi4uLi4uLi4uLi4uIERpZSBUcnVoZQorCisgIHNhdmUvCisgICAgbmFtZS5vIC4uLi4uLi4uLi4uLi4uLi4uLi4uIFNhdmVmaWxlIGRlciBBdXNzZW5hbnNpY2h0IGRlcyBIYXVzZXMKKyAgICBuYW1lMC5vIC4uLi4uLi4uLi4uLi4uLi4uLi4gU2F2ZWZpbGUgdm9uIFJhdW0gMAorCQkgICB1c3cuCisgICAgbmFtZTkubyAuLi4uLi4uLi4uLi4uLi4uLi4uIFNhdmVmaWxlIHZvbiBSYXVtIDkKKyAgICBuYW1ldHJ1aGUubyAuLi4uLi4uLi4uLi4uLi4gU2F2ZWZpbGUgZGVyIFRydWhlCisKKyAgc3BlY2lhbC8gLi4uLi4uLi4uLi4uLi4uLi4uIEJlc29uZGVyZSBPYmpla3RlCisgICAgcmouYyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uICJSb21lbyB1bmQgSnVsaWEiIHZvbiBFdGFpbgorICAgIHJvbV9qdWwvIC4uLi4uLi4uLi4uLi4uLi4uLiBIaWVyIGxpZWdlbiBkaWUgU2VpdGVuIGRlciBHZXNjaGljaHRlCisgICAgc2VoZXJmYXEuYyAuLi4uLi4uLi4uLi4uLi4uIERpZSBTZWhlci1GQVEgdm9uIFJ5bmUKKyAgICBmYXEvIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gRGllIFNlaXRlbiBkZXIgRkFRCisKKyAgcmVwLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIEhpZXIgbGFuZGVuIGRpZSAndHlwbyctTWVsZHVuZ2VuIGRlciBIYWV1c2VyCisKKyAgZG9jLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIEhpbGZlc2VpdGVuIChuYWNoIC9kb2Mvc2NtZCBrb3BpZXJlbikKKyAgICBoYXVzYmF1IC4uLi4uLi4uLi4uLi4uLi4uLi4gQWxsZ2VtZWluZSBJbmZvcm1hdGlvbmVuCisgICAgc2VoZXJoYXVzIC4uLi4uLi4uLi4uCisgICAgaW5zdGFudGhhdXMgLi4uLi4uLi4KKworICAgIGFlbmRlcmUgLi4uLi4uLgorICAgIGF1c2dhbmcgLi4uLi4uLi4KKyAgICBiZWZlaGwgLi4uLi4uLi4uLgorICAgIGJlc2NocmVpYmUgLi4uLi4uLgorICAgIGVybGF1YmUgLi4uLi4uLi4uLi4KKyAgICBrb3BpZXJlIC4uLi4uLi4uLi4uLgorICAgIGxpY2h0IC4uLi4uLi4uLi4uLi4uLgorICAgIGxvZXNjaGUgLi4uLi4uLi4uLi4uLi4uLi4uLiBTZWl0ZW4genUgZGVuIGVpbnplbG5lbiBCZWZlaGxlbgorICAgIG1lbGR1bmdlbiAuLi4uLi4uLi4uLgorICAgIG5vdGl6IC4uLi4uLi4uLi4uLi4uCisgICAgc2NoaWViZSAuLi4uLi4uLi4uLgorICAgIHNwZXJyZSAuLi4uLi4uLi4uLgorICAgIHNwaW9uIC4uLi4uLi4uLi4uCisgICAgdWViZXJzaWNodCAuLi4uLgorICAgIHZlcmJpZXRlIC4uLi4uLgorICAgIHdlcmZlIC4uLi4uLi4uCisKKy9zeXMvcGxheWVyL2Jhc2UuaCAuLi4uLi4uLi4uIEhpZXIgaXN0ICJIQVVTVkVSV0FMVEVSIiBkZWZpbmllcnQKKworMi4gRGVyIEhhdXN2ZXJ3YWx0ZXIKKz09PT09PT09PT09PT09PT09PT09CisKK0RpZXMgaXN0IGRpZSBaZW50cmFsc3RlbGxlIGRlciBTZWhlcmhhZXVzZXIuIEhpZXIgd2VyZGVuIHdpY2h0aWdlIERhdGVuCitkZXIgSGF1c2Jlc2l0emVyIHZlcndhbHRldCwgbmFlbWxpY2g6CistIGRlciBPcnQsIGFuIGRlbSBkYXMgSGF1cyBzdGVodAorLSBkaWUgWmFobCBkZXIgenVzYWV0emxpY2hlbiBSYWV1bWUsIHVlYmVyIGRpZSBkYXMgSGF1cyB2ZXJmdWVndAorLSBkaWUgTGV1dGUsIGRpZSBpbSBIYXVzIFNvbmRlcnJlY2h0ZSBiZXNpdHplbgorCitEaWUgRnVua3Rpb25lbiBkZXMgSGF1c3ZlcndhbHRlcnMgd2VyZGVuIHZvbiBkaXZlcnNlbiBPYmpla3RlbiBhdXMgYXVmLQorZ2VydWZlbi4gSW0gRWluemVsbmVuIHdhZXJlbiBkYToKKworc2VjdXJlKCkgLSBpbnRlcm4KKyAgU2ljaGVyaGVpdHNhYmZyYWdlIGZ1ZXIgZWluaWdlIEZ1bmt0aW9uZW4gZGVzIEhhdXN2ZXJ3YWx0ZXJzLiBadWdlbGFzc2VuCisgIHNpbmQgRU1zIHVuZCBkaWUgTGV1dGUsIGRpZSBpbSBhY2Nlc3NfcmlnaHRzLmMgc3RlaGVuLCBhdXNzZXJkZW0gZGFzCisgIEluc3RhbnRoYXVzIChmdWVyIE5ldWVzSGF1cygpKSB1bmQgZGVyIEF1c2dhYmVzY2hhbHRlciAoZnVlciBOZXVlclJhdW0oKSkuCisKK2R1bXAoKSAtIGludGVybgorICBCcmluZ3QgZGllIERhdGVpICJIQUVVU0VSIiBhdWYgZGVuIG5ldWVzdGVuIFN0YW5kIChuYWNoZGVtIGVpbiBuZXVlcyBIYXVzCisgIG9kZXIgZWluIG5ldWVyIFJhdW0gZGF6dWdla29tbWVuIGlzdCBvZGVyIGVpbiBIYXVzIHZlcmxlZ3QgYnp3LiBnZWxvZXNjaHQKKyAgd3VyZGUpLgorCitjaGVja19leGl0cygpIC0gaW50ZXJuCisgIEJlaW0gVmVybGVnZW4gdW5kIEFicmVpc3NlbiB2b24gSGFldXNlcm4gaXN0IGVzIG5vZXRpZywgZGFzcyBBdXNnYWVuZ2UgaW4KKyAgTmFjaGJhcmhhZXVzZXIgZW50ZmVybnQgd2VyZGVuLiBEYWZ1ZXIgc29yZ3QgZGllc2UgRnVua3Rpb24uCisKK05ldWVzSGF1cygpIC0gdHJhZ2hhdXMuYworICBFaW4gbmV1ZXMgU2VoZXJoYXVzIHdpcmQgZ2VzY2hhZmZlbjogZXMgd2lyZCBpbSBPYmplY3REYWVtb24gYW5nZW1lbGRldCwKKyAgZGllIFRydWhlIHdpcmQgaW0gRWluZ2FuZ3NyYXVtIHBsYXppZXJ0LCB1bmQgZGllICJIQUVVU0VSIi1EYXRlaSB3aXJkIGF1ZgorICBkZW4gbmV1ZXN0ZW4gU3RhbmQgZ2VicmFjaHQuCisgIFdlbm4gRHUgenUgVGVzdHp3ZWNrZW4gZWluIEhhdXMgaGFiZW4gd2lsbHN0LCBrYW5uc3QgRHUgZGllIEZ1bmt0aW9uIGF1Y2gKKyAgdm9uIEhhbmQgYXVmcnVmZW4uCisKK05ldWVyUmF1bSgpIC0gc2JfYXVzZ2FiZS5jCisgIEVpbmVtIEhhdXMgd2lyZCBlaW4gbmV1ZXIgUmF1bSBoaW56Z2VmdWVndC4KKyAgTWF4aW1hbCBzaW5kIDEwIFJhZXVtZSAocmF1bTAtcmF1bTkpIGVybGF1YnQuCisKK19MYWRlSGF1cygpIC0gdmlydHVhbF9jb21waWxlci5jCisgIFdlbm4gZGVyIHBvdGVudGllbGxlIEJlc2l0emVyIHdpcmtsaWNoIGVpbiBIYXVzIGhhdCB1bmQgc2ljaCBkZXNzZW4KKyAgRW52aXJvbm1lbnQgbGFkZW4gbGFlc3N0LCB3aXJkIGRhcyBIYXVzIGVyc3RlbGx0IHVuZCB6dXJ1ZWtnZWdlYmVuLgorCitfTGFkZVJhdW0oKSAtIHZpcnR1YWxfY29tcGlsZXIuYworICBBZWhubGljaCB3aWUgX0xhZGVIYXVzKCksIG51ciBmdWVyIGRlbiBSYXVtIG1pdCBkZXIgZ2V3dWVuc2NodGVuIE51bW1lci4KKyAgQmVpbSBFaW5nYW5nc3JhdW0gd2lyZCBub2NoIGRlciBBdXNnYW5nIG5hY2ggZHJhdXNzZW4gZ2VzZXR6dC4KKworRmluZGVIYXVzKCkgLSBoYXVzdmVyd2FsdGVyLmMsIHNiX2FudHJhZy5jLCBoYXVzbWVpc3Rlci5jLCAvc3RkL3BsYXllci9iYXNlLmMKKyAgR2lidCBkYXMgSGF1c29iamVrdCB6dXJ1ZWNrIG9kZXIgMCwgZmFsbHMgZGVyIFNwaWVsZXIga2VpbiBIYXVzIGhhdC4KKyAgRGFzIEhhdXMgd2lyZCBnZ2YuIGdlbGFkZW4uCisKK0xvZXNjaGVIYXVzKCkgLSBoYXVzbWVpc3Rlci5jCisgIEVpbiBIYXVzIHdpcmQgYWJnZXJpc3NlbjogRXMgd2lyZCBpbSBPYmplY3REYWVtb24gYWJnZW1lbGRldCwgc2FlbXRsaWNoZQorICBTYXZlZmlsZXMgd2VyZGVuIGdlbG9lc2NodCwgZWJlbnNvIGRhcyAucmVwLUZpbGUgZGVzIEhhdXNiZXNpdHplcnMuCisKKyAgUnVlY2tnYWJld2VydGU6CisgICAxIC0gYWxsZXMgT0ssIGRhcyBIYXVzIGlzdCB3ZWcKKyAgLTEgLSBzZWN1cmUoKSBzY2hsdWcgZmVobC4KKworVmVybGVnZUhhdXMoKSAtIGhhdXNtZWlzdGVyLmMKKyAgRWluIEhhdXMgd2lyZCBhbiBlaW5lbiBuZXVlbiBPcnQgdmVybGVndDogRXMgd2lyZCBpbSBPYmplY3REYWVtb24gYWItIHVuZAorICBhbSBuZXVlbiBPcnQgd2llZGVyIGFuZ2VtZWxkZXQsIHVuZCBkZXIgQXVzZ2FuZyBuYWNoIGRyYXVzc2VuIHdpcmQKKyAgYW5nZXBhc3N0LgorCisgIFJ1ZWNrZ2FiZXdlcnRlOgorICAgICAxIC0gYWxsZXMgT2ssIGRhcyBIYXVzIHN0ZWh0IGpldHp0IHdvYW5kZXJzCisgIC0xMTEgLSBzZWN1cmUoKSBzY2hsdWcgZmVobC4KKyAgICAtMSAtIGRlciBhbmdlYmxpY2hlIEJlc2l0emVyIGhhdCBnYXIga2VpbiBIYXVzCisgICAgLTIgLSBkYXMgSGF1cyBzdGVodCBnYXIgbmljaHQgZGEsIHdvIGVzIHNlaW4gc29sbHRlCisgICAgLTMgLSBkZXIgWmllbHJhdW0gZXhpc3RpZXJ0IG5pY2h0CisgICAgLTQgLSBpbSBaaWVscmF1bSBrYW5uIG5pY2h0IGdlYmF1dCB3ZXJkZW4KKyAgICAtNSAtIGVzIGdpYnQgQXVzZ2FlbmdlIGluIGJlbmFjaGJhcnRlIFNlaGVyaGFldXNlciAoZGllc2Ugd2VyZGVuIGJlaW0KKwkgVmVybGVnZW4gbmljaHQgYXV0b21hdGlzY2ggZ2Vsb2VzY2h0OyBkYXMgbXVzcyBkZXIgSGF1c2Jlc2l0emVyCisJIHNlbGJzdCBtYWNoZW4pCisKK1VuYmViYXViYXIoKSAtIGhhdXN2ZXJ3YWx0ZXIuYywgdHJhZ2hhdXMuYworICBEaWVzZSBGdW5rdGlvbiBlcm1pdHRlbHQsIG9iIGluIGVpbmVtIFJhdW0gZWluIEhhdXMgZ2ViYXV0IHdlcmRlbiBrYW5uLCB1bmQKKyAgd2VubiBuZWluLCB3YXJ1bSBuaWNodC4KKworICBSdWVja2dhYmV3ZXJ0ZToKKyAgICAwIC0gT0ssIGVzIGRhcmYgZ2ViYXV0IHdlcmRlbgorICAgIDEgLSBkZXIgWmllbHJhdW0gaXN0IGVudHdlZGVyIGVpbiBnZWNsb250ZXMgT2JqZWt0ICh1bmQgZGFtaXQgenVtaW5kZXN0CisJbmFjaCBkZW0gbmFlY2hzdGVuIFJlYm9vdCBhdWYgaW1tZXIgdmVybG9yZW4pIG9kZXIgZWluIE9iamVrdCwgZGFzcworCXZvbiBlaW5lbSB2aXJ0dWFsX2NvbXBpbGVyIGVyemV1Z3Qgd3VyZGUgKGRlciBPYmplY3REYWVtb24gd2lyZCB6dQorCWVpbmVtIFplaXRwdW5rdCBhYmdlZnJhZ3QsIGFuIGRlbSBkYXMgVkMtT2JqZWt0IG5vY2ggbmljaHQgc2VpbmVuCisJZW5kZ3VlbHRpZ2VuIE5hbWVuIGhhdCkuCisgICAgMiAtIEltIFppZWxyYXVtIGlzdCBQX0lORE9PUlMgZ2VzZXR6dCAod2VubiBpbiBzbyBlaW5lbSBSYXVtIHRyb3R6ZGVtCisJZ2ViYXV0IHdlcmRlbiBzb2xsLCB3ZWlsIGVzIHp1bSBCZWlzcGllbCBlaW5lIGdyb3NzZSBIb2VobGUgby5hZS4KKwlpc3QsIGthbm4gbWFuIFBfSU5ET1JSUyBpbW1lciBub2NoIHRlbXBvcmFlciBhdWYgMCBzZXR6ZW4pLgorICAgIDMgLSBJbSBaaWVscmF1bSBpc3QgUF9IQVVTX0VSTEFVQlQgbmljaHQgZ2VzZXR6dC4KKworRXJsYXViZSgpIC0gcmF1bTAuYworICBFaW5lbSBvZGVyIG1laHJlcmVuIFNwaWVsZXJuIHdlcmRlbiBTb25kZXJyZWNodGUgaW0gSGF1cyBlaW5nZXJhZXVtdC4KKyAgWnVydWVja2dlZ2ViZW4gd2lyZCBkaWUgbmV1ZSBlcmxhdWJlLUxpc3RlLgorCitWZXJiaWV0ZSgpIC0gcmF1bTAuYworICBFaW5lbSBvZGVyIG1laHJlcmVuIFNwaWVsZXJuIHdlcmRlbiBkaWUgUmVjaHRlIGVudHpvZ2VuLgorICBadXJ1ZWNrZ2VnZWJlbiB3aXJkIGRpZSBuZXVlIGVybGF1YmUtTGlzdGUuCisKK0hhdXNQcm9wKCkgLSBoYXVzLmMsIHJhdW0uYywgcmF1bTAuYywgc2JfYW50cmFnLmMsIGhhdXNtZWlzdGVyLmMKKyAgTWl0IGRpZXNlciBGdW5rdGlvbiBrb2VubmVuIGRpZSBJbmZvcm1hdGlvbmVuIHVlYmVyIGVpbmVuIEhhdXNiZXNpdHplcgorICBhYmdlZnJhZ3Qgd2VyZGVuLiBNb2VnbGljaCBzaW5kOgorICBIUF9FTlYgICAgIC0gZGVyIFJhdW0sIGluIGRlbSBkYXMgSGF1cyBzdGVodAorICBIUF9ST09NUyAgIC0gZGllIFphaGwgZGVyIHp1c2FldHpsaWNoZW4gUmFldW1lLCB1ZWJlciBkaWUgZGFzIEhhdXMgdmVyZnVlZ3QKKyAgSFBfQUxMT1dFRCAtIEFycmF5IG1pdCBkZW4gTGV1dGVuLCBkaWUgU29uZGVycmVjaHRlIGdlbmllc3NlbgorCitQQ3J1bmNoKCkgLSByYXVtLmMsIGxvc2EuYywgaGF1c21laXN0ZXIuYworICBVbSBQbGF0eiBiZWltIFNwZWljaGVybiB6dSBzcGFyZW4sIHdlcmRlbiBEZXRhaWxzLCBSZWFkRGV0YWlscyB1bmQgQmVmZWhsZSwKKyAgZGllIGRlbiBnbGVpY2hlbiBUZXh0IGVyZ2ViZW4sIHp1c2FtbWVuZ2VwYWNrdC4gQmVpbSBIYXVzbWVpc3RlciBoYXQgZGFzCisgIGRlbiBFZmZla3QsIGRhc3MgaW0gZ2VuZXJpZXJ0ZW4gUXVlbGx0ZXh0IHouQi4KKyAgICBBZGREZXRhaWwoICh7ICJmb28iLCAiYmFyIiB9KSwgImJsYWZhc2VsXG4iKTsKKyAgc3RlaHQgYW5zdGVsbGUgdm9uCisgICAgQWRkRGV0YWlsKCAiZm9vIiwgImJsYWZhc2VsXG4iKTsKKyAgICBBZGREZXRhaWwoICJiYXIiLCAiYmxhZmFzZWxcbiIpOworCiszLiBTb25kZXJyZWNodGUKKz09PT09PT09PT09PT09PQorCitEZXIgSGF1c2Jlc2l0emVyIGthbm4gdm9uIHNlaW5lbSBFaW5nYW5nc3JhdW0gYXVzIGFuZGVyZW4gTGV1dGVuIFJlY2h0ZSBpbgorc2VpbmVtIEhhdXMgZWlucmFldW1lbi4gRGF6dSBkaWVudCBkZXIgQmVmZWhsICJlcmxhdWJlIi4gTGV1dGUgbWl0IFNvbmRlci0KK3JlY2h0ZW4ga29lbm5lbjoKKy0gZGFzIEhhdXMgYXVmLSB1bmQgYWJzY2hsaWVzc2VuCistIGRpZSBUcnVoZSBvZWZmbmVuIChzY2hsaWVzc2VuIGRhcmYgc2llIGplZGVyKQorLSBuZXR6dG90IGltIEhhdXMgYmxlaWJlbgorLSBSdWVja21lbGR1bmdlbiBhdXMgZGVtIFJlcG9ydGZpbGUgYW5zZWhlbiAoYWJlciBuaWNodCBhZW5kZXJuKQorCitBdXNzZXJkZW0gbXVzcyBtYW4gU29uZGVycmVjaHRlIGluIGVpbmVtIE5hY2hiYXJoYXVzIGhhYmVuLCB3ZW5uIG1hbiB2b24KK3NlaW5lbSBIYXVzIGVpbmVuIEF1c2dhbmcgZG9ydGhpbiBsZWdlbiB3aWxsLgorCitEYXMgQXJyYXkgbWl0IGRlbiBOYW1lbiBkZXIgQmVyZWNodGlndGVuIGVyaGFlbHQgbWFuIHZvbSBIYXVzdmVyd2FsdGVyIHBlcgorSGF1c1Byb3AoPG93bmVyPiwgSFBfQUxMT1dFRCkuIEluIGRlbSBBcnJheSBzdGVoZW4gZGllIFVzZXItSURzIGRlciBMZXV0ZSwKK2FsbGVyZGluZ3MgbWl0IGdyb3NzZW0gQW5mYW5nc2J1Y2hzdGFiZW4uCisKKzQuIERpZSBUb29scworPT09PT09PT09PT09CisKKzRhLiBEZXIgSGF1c21laXN0ZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworRGVyIEhhdXNtZWlzdGVyIGVybGF1YnQgZGFzIGVpbmZhY2hlIEFicmVpc3NlbiB1bmQgVmVybGVnZW4gdm9uIEhhZXVzZXJuCitzb3dpZSBkYXMgR2VuZXJpZXJlbiB2b24gTFBDLVF1ZWxsdGV4dCBhdXMgZGVuIFNhdmVmaWxlcy4gRGF6dSBzdGVsbHQgZXIKK2RyZWkgS29tbWFuZG9zIHp1ciBWZXJmdWVndW5nOgorCit2ZXJsZWdlIDxuYW1lPiBuYWNoIDx6aWVsPgorICBEYXMgSGF1cyBkZXMgU3BpZWxlcnMgPG5hbWU+IHdpcmQgaW4gZGVuIFJhdW0gPHppZWw+IHZlcmxlZ3QuIDx6aWVsPiBpc3QKKyAgZGFiZWkgZW50d2VkZXIgZGVyIEZpbGVuYW1lIGRlcyBaaWVscmF1bWVzIG9kZXIgImhpZXIiLCB3ZW5uIGRhcyBIYXVzCisgIHp1IERlaW5lbSBha3R1ZWxsZW4gU3RhbmRvcnQgdmVybGVndCB3ZXJkZW4gc29sbC4KKyAgU29sbHRlIGRhcyBWZXJsZWdlbiBmZWhsc2NobGFnZW4gKHNpZWhlIFZlcmxlZ2VIYXVzKCkgaW0gSGF1c3ZlcndhbHRlcikKKyAgbWVsZGV0IHNpY2ggZGVyIEhhdXNtZWlzdGVyIGVudHNwcmVjaGVuZC4KKworcmVpc3NlIDxuYW1lPiBhYgorICBEYXMgSGF1cyBkZXMgU3BpZWxlcnMgPG5hbWU+IHdpcmQgYWJnZXJpc3Nlbi4KKyAgQUNIVFVORyEgRXMgZ2lidCBrZWluZSBTaWNoZXJoZWl0c2FiZnJhZ2UhCisKK2dlbmVyaWVyZSA8bmFtZT4gWzxucj5dIFtzb2Z0IHwgZ2Fuel0KKyAgR2VuZXJpZXJ0IGF1cyBkZW0gU2F2ZWZpbGUgZWluIExQQy1GaWxlLgorICBPaG5lIEFuZ2FiZSBlaW5lciBOdW1tZXIgd2lyZCBkaWUgQXVzc2VuYW5zaWNodCBnZW5lcmllcnQsIGFuc29uc3RlbiBkZXIKKyAgUmF1bSBtaXQgZGVyIGVudHNwcmVjaGVuZGVuIE51bW1lci4KKyAgQXVzc2VyIHdlbm4gInNvZnQiIGFuZ2VnZWJlbiB3dXJkZSwgd2VyZGVuIGRpZSBEYXRlaWVuIGluIGRhcyBWZXJ6ZWljaG5pcworICAicmVwLyIgZ2VzY2hyaWViZW4sIHVuZCB6d2FyIGFscyAiPG5hbWU+aGF1cy5jIiwgIjxuYW1lPnJhdW0wLmMiIGV0Yy4KKyAgQmVmaW5kZXQgc2ljaCBkaWUgVHJ1aGUgaW4gZGVtIGdlbmVyaWVydGVuIFJhdW0sIHdpcmQgYXVjaCBub2NoIGVpbmUgRGF0ZWkKKyAgIjxuYW1lPnRydWhlLmMiIGFuZ2VsZWd0LgorICBEaWUgRGF0ZWllbiBzaW5kIGltIHdlc2VudGxpY2hlbiBmdWVyIE1hZ2llciBnZWRhY2h0LCBkaWUgaWhyZSBIYWV1c2VyIGFscworICBMUEMtRmlsZXMgdW50ZXIgRWlnZW5yZWdpZSB3ZWl0ZXJmdWVocmVuIHdvbGxlbi9zb2xsZW4uIEF1c2dhZW5nZSBzaW5kCisgIHJlbGF0aXYgenUgIi9wbGF5ZXJzLzxuYW1lPi9zZWhlcmhhdXMiLgorICBNaXQgZGVtIFBhcmFtZXRlciAiZ2FueiIgbGFlc3N0IHNpY2ggZGFzIGdlc2FtdGUgSGF1cyBhdWYgZWluZW4gU2NobGFnCisgIHVtd2FuZGVsbi4KKyAgInNvZnQiIHN0YW1tdCBub2NoIGF1cyBkZXIgWmVpdCwgYWxzIGljaCBkaWUgVHlwb3MgZGVyIFNlaGVyIHNlbGJlciBmaXhlbgorICBtdXNzdGUuIERhcyBIYXVzIG9kZXIgZGVyIFJhdW0gd2lyZCBkYWJlaSBpbiBkaWUgRGF0ZWkgUEFUSCsiZml4ZWQuYyIKKyAgZ2VzY2hyaWViZW4uCisKKzRiLiBsaXN0ZS5jCistLS0tLS0tLS0tLQorCitBYiB1bmQgenUgc29sbHRlIG1hbiBtYWwgbmFjaHNlaGVuLCB3ZWxjaGUgU2VoZXIgc2ljaCBnZWxvZXNjaHQgaGFiZW4gb2RlcgorenUgTWFnaWVybiB3dXJkZW4uIERpZSBIYWV1c2VyIHZvbiBnZWxvZXNjaHRlbiBTZWhlcm4gc29sbHRlbiBlYmVuZmFsbHMKK2dlbG9lc2NodCB3ZXJkZW47IE1hZ2llciBrb2VubmVuIGlocmUgSGFldXNlciBhbHMgbm9ybWFsZSBMUEMtT2JqZWt0ZQord2VpdGVyZnVlaHJlbiAoc29iYWxkIGRpZSBMZXZlbCAyMSBvZGVyIDI1IGhhYmVuKS4KKworRGllIExpc3RlIHplaWd0IGFuLCB3ZWxjaGUgTGV1dGUgYmV0cm9mZmVuIHNpbmQuIERhenUgbXVzcyBzaWUgZWluZmFjaCBudXIKK2dlbGFkZW4gd2VyZGVuLgorCitad2VpIEF1c25haG1lbiBnaWJ0IGVzOgorLSBLcmlnaSBoYXQgc2ljaCB6d2FyIGdlbG9lc2NodCwgZXIgaGF0IGFiZXIgZGFydW0gZ2ViZXRlbiwgZGFzcyBzZWluIEhhdXMKKyAgd2VpdGVyIGJlc3RlaGVuIGthbm4gKGVyIGlzdCBqZXR6dCBEYXVlcmdhc3QpCistIEZyYWdnbGUgaXN0IHp3YXIgTWFnaWVyLCBoYXQgc2VpbiBIYXVzIGFiZXIgbWFsIHp1IFRlc3R6d2Vja2VuIGJla29tbWVuCisKKzRjLiBoYXVzdG9vbC5jCistLS0tLS0tLS0tLS0tLQorCitEaWVzZXMgVGVpbCBpc3QgbWl0dGxlcndlaWxlIHVlYmVyaG9sdDsgZXMgc3RhbW10IG5vY2ggYXVzIGRlciBaZWl0LCBhbHMKKyd0eXBvJy0gdW5kIGFlaG5saWNoZSBNZWxkdW5nZW4gbm9jaCBpbiBtZWluZW0gZWlnZW5lbiAucmVwLUZpbGUgbGFuZGV0ZW4KK3VuZCBpY2ggZGVuIEtyYW0gYXVjaCBhYmFyYmVpdGVuIG11c3N0ZS4gTWl0IGRlbSBUb29sIGtvbm50ZSBpY2ggZGllIE1lbC0KK2R1bmdlbiBhdXMgbWVpbmVtIC5yZXAtRmlsZSBhbnNlaGVuIHVuZCBlaW5lIEJlbmFjaHJpY2h0aWd1bmcgYW4gZGVuIEhhdXMtCitiZXNpdHplciBnZW5lcmllcmVuLgorCisKKzUuIERhcyBIYXVzCis9PT09PT09PT09PQorCitEYXMgSGF1cyBzZWxic3QgemVyZmFlbGx0LCB3YXMgZGllIEJlc2NocmVpYnVuZ2VuIGFuZ2VodCwgaW4gZHJlaSBncm9zc2UKK0JlcmVpY2hlOiBkZW4gdm9uIGF1c3NlbiBzaWNodGJhcmVuIFRlaWwsIGRpZSBSYWV1bWUgaW0gSW5uZXJlbiwgdW5kIGRpZQorVHJ1aGUuIEJlaSBkZW4gUmFldW1lbiBoYXQgZGVyIEVpbmdhbmdzcmF1bSBub2NoIGVpbiBwYWFyIFNvbmRlcmZ1bmt0aW9uZW4uCisKKzVhLiBBdXNzZW5hbnNpY2h0CistLS0tLS0tLS0tLS0tLS0tLQorCitEaWVzIGlzdCBkYXMgT2JqZWt0LCBkYXMgaW0gT2JqZWN0RGFlbW9uIGFuZ2VtZWxkZXQgd2lyZCAoIjxuYW1lPmhhdXMiKS4KK0RlciBIYXVzYmVzaXR6ZXIga2FubiBmb2xnZW5kZSBFaWdlbnNjaGFmdGVuIGJlc2NocmVpYmVuOgorLSBkaWUgTGFuZ2Jlc2NocmVpYnVuZyAoUF9MT05HKQorLSBlaW5lIFplaWxlLCB3aWUgZGllIEhhdXN0dWVyIGF1c3NlaGVuIHNvbGwgKEhfRE9PUikKKy0gZGllIFp1c3RhZW5kZSBkZXIgSGF1c3R1ZXIgKG9mZmVuLCBnZXNjaGxvc3NlbiwgYWJnZXNjaGxvc3NlbjsgSF9ET09STFNUQVQpCisKK0F1c3NlcmRlbSBzdGVoZW4gZm9sZ2VuZGUgS29tbWFuZG9zIHp1ciBWZXJmdWVndW5nOgorLSBiZXRyaXR0L2JldHJldGUgPGhhdXM+CisgIFNvbGx0ZSBrbGFyIHNlaW4uIEdlaHQgbnVyLCB3ZW5uIGRhcyBIYXVzIG9mZmVuIGlzdC4KKy0ga2xvcGZlIGFuIDxoYXVzPiBhbgorICBEYXMgS2xvcGZlbiBob2VydCBtYW4gaW0gZ2FuemUgSGF1cworLSBub3RpeiA8dGV4dD4KKyAgRGVyIEhhdXNiZXNpdHplciBrYW5uIGRhbWl0IGVpbmUga3VyemUgTm90aXogYW4gZGVyIEhhdXN0dWVyIGFuYnJpbmdlbi4KKworbW9kdWxlcy9oYXVzdHVlci5jIHN0ZWxsdCBkaWUgQmVmZWhsZSB6dW0gT2VmZm5lbiB1bmQgU2NobGllc3NlbiBkZXMgSGF1c2VzCit6dXIgVmVyZnVlZ3VuZy4gQXVmZ2VzY2hsb3NzZW4gd2VyZGVuIGthbm4gZGFzIEhhdXMgbnVyIHZvbiBMZXV0ZW4gbWl0CitzcGV6aWVsbGVyIEdlbmVobWlndW5nLgorCitXZW5uIGRpZSBLdXJ6YmVzY2hyZWlidW5nIGdlYWVuZGVydCB3ZXJkZW4gc29sbCwgbXVzcyBkYXMgZWluIE1hZ2llciBtYWNoZW4uCitPZmZpemllbGxlciBBbnNwcmVjaHBhcnRuZXIgZGFmdWVyIGlzdCBkZXIgSGF1c21haW50YWluZXIgKGFsc28gRFUgOi0pCitNYW4gc29sbHRlIGRhYmVpIGRhcmF1ZiBhY2h0ZW4sIGRhc3MgZGllIEJlc2NocmVpYnVuZyBhKSBpbiBkaWUgVW1nZWJ1bmcgdW5kCitiKSBhbGxnZW1laW4gaW4gZWluZSBGYW50YXN5d2VsdCBwYXNzdCAoZGFzIGlzdCBsZWlkZXIgbmljaHQgYmVpIGFsbGVuCitIYWV1c2VybiBkZXIgRmFsbC4uLikKK1dlbm4gZGllIEt1cnpiZXNjaHJlaWJ1bmcgZ2VhZW5kZXJ0IHdpcmQsIHNvbGx0ZW4gZ2dmLiBhdWNoIG5vY2ggZGllIElEcywgZGVyCitOYW1lIHVuZCBkYXMgR2VzY2hsZWNodCBhbmdlcGFzc3Qgd2VyZGVuLgorVW0gZWluIEhhdXMgdW5zaWNodGJhciB6dSBtYWNoZW4sIG11c3MgUF9TSE9SVCBhdWYgMCBnZXNldHp0IHdlcmRlbi4KK1dlbm4gbm9jaCBhbmRlcmUgU2VoZXJoYWV1c2VyIGltIGdsZWljaGVuIFJhdW0gc3RlaGVuLCB1bmQgaW4gZGVyIEJlc2NocmVpLQorYnVuZyBkZXMgZ2VhZW5kZXJ0ZW4gSGF1c2VzIG5pY2h0cyBtZWhyIGF1ZiBlaW4gImhhdXMiIGhpbndlaXN0LCBrYW5uIHVuZAorc29sbHRlIGRpZSBJRCAiaGF1cyIgZW50ZmVybnQgd2VyZGVuLgorVW0gZGllIEFlbmRlcnVuZ2VuIHp1IHNpY2hlcm4sIG11c3MgaW0gSGF1cyBTYXZlKCkgYXVmZ2VydWZlbiB3ZXJkZW4uCisKK1p3ZWkgSURzIHNvbGx0ZW4gbmllIGVudGZlcm50IHdlcmRlbjogInNlaGVccmhhdXMiIHVuZCAiXG48bmFtZT5oYXVzIgorCisKKzViLiBEaWUgUmFldW1lCistLS0tLS0tLS0tLS0tLQorCitQcm9ncmFtbXRlY2huaXNjaCBiZWZpbmRlbiBzaWNoIGhpZXIgaGF1cHRzYWVjaGxpY2ggRnVua3Rpb25lbiB6dW0gQmVzY2hyZWktCitiZW4gZGVzIFJhdW1lcywgSGluenVmdWVnZW4gdW5kIEVudGZlcm5lbiBkZXMgTGljaHRlcywgQW4tIHVuZCBBYnNjaGFsdGVuCitkZXMgTGljaHRlcyB1bmQgRWluc2VoZW4gZGVzIC5yZXAtRmlsZXMuCitBdXNzZXJkZW0ga2FubiBtYW4gUGVyc29uZW4sIEdlZ2Vuc3RhZW5kZSBvZGVyIGFsbGVzIGF1cyBkZW0gSGF1cyB3ZXJmZW4uCisKK0F1Y2ggZGllIFJhZXVtZSBoYWJlbiBkaWUgSUQgInNlaGVccmhhdXMiLgorCitFcndhZWhuZW5zd2VydGUgRnVua3Rpb25lbjoKKworbm9ybXN0cigpCisgIEVyc2V0enQgQEAgaW4gZGVuIEJlc2NocmVpYnVuZ2VuIGR1cmNoICoqIChkYW1pdCBrZWluIHByb2Nlc3Nfc3RyaW5nKCkKKyAgYXVzZ2VmdWVocnQgd2VyZGVuIGthbm4pCisKK2JyaygpCisgIEVyemV1Z3QgYXVzIGVpbmVyIGR1cmNoIEtvbW1hdGEgZ2V0cmVubnRlbiBMaXN0ZSBlaW4gQXJyYXkgdm9uIFN0cmluZ3MKKworYmVmQ2hlY2soKQorICBGYWVuZ3QgdmVyYm90ZW5lIEJlZmVobGUgYWIgKEtvbW1hbmRvcywgZGllIExlZXJ6ZWljaGVuIGVudGhhbHRlbjsgbmljaHQKKyAgZ2VzZXR6dGUgQXVzZ2FlbmdlOyBhbGxlIEtvbW1hbmRvcywgZGllIGRlciBSYXVtIGRlZmluaWVydCwgYXVzc2VyCisgICJvZWZmbmUiLCAic2NobGllc3MiLCAic2NobGllc3NlIikKKworb3duZXJfY2hlY2soKQorICBEYXJmIGRlciBTcGllbGVyIGRhcz8gRmFsbHMgb2huZSBBcmd1bWVudCBhdWZnZXJ1ZmVuLCBpc3QgZGllIEFrdGlvbiBudXIKKyAgZXJsYXVidCwgd2VubiB0aGlzX3BsYXllcigpIGRlciBIYXVzYmVzaXR6ZXIgaXN0LgorICBNaXQgQXJndW1lbnQgd2lyZCBhdWNoIGRpZSBlcmxhdWJlLUxpc3RlIGdlcHJ1ZWZ0LgorCithcnJfb3V0KCkKKyAgR2lidCBlaW4gQXJyYXkgdm9uIFN0cmluZ3MgYXVzIG9kZXIgenVydWVjaywgamUgbmFjaCBBbndlbmR1bmcKKworY2xlYW5fdXAoKQorICBTb3JndCBkYWZ1ZXIsIGRhc3MgbnVyIGxlZXJlIFJhZXVtZSB3ZWdnZXJhZXVtdCB3ZXJkZW4KKworQmVjb21lc05ldERlYWQoKQorICBOZXR6dG90ZSB2ZXJsYXNzZW4gZGFzIEhhdXMgKHNvd2VpdCBzaWUgbmljaHQgYXVmIGRlciBlcmxhdWJlLUxpc3RlIHN0ZWhlbikKKworaW5pdCgpL2ludF9sb25nKCkKKyAgTWVsZHVuZ2VuIHVlYmVyIHVuc2ljaHRiYXJlIE1hZ2llcgorCitsaWVzKCkKKyAgUmVhZERldGFpbHMgd2VyZGVuIG1pdCBNb3JlKCkgYXVzZ2VnZWJlbgorCitEaWUgQmVmZWhsZSB6dXIgQmVzY2hyZWlidW5nIGRhcmYgbnVyIGRlciBIYXVzYmVzaXR6ZXIgYmVudXR6ZW4uIERlbiBCZWZlaGwKKyJ1ZWJlcnNpY2h0IiBrb2VubmVuIGF1Y2ggZGllIE1hZ2llciwgZGllIGltIGFjY2Vzc19yaWdodHMuYyBzdGVoZW4sIHZlci0KK3dlbmRlbi4KK05hZWhlcmVzIHp1IGRlbiBtb2VnbGljaGVuIEJlc2NocmVpYnVuZ2VuIGZvbGdlbiB1bnRlbi4KKworCis1Yy4gRGVyIEVpbmdhbmdzcmF1bQorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRGVyIEVpbmdhbmdzcmF1bSBzdGVsbHQgenVzYWV0emxpY2ggbm9jaCBmb2xnZW5kZSBCZWZlaGxlIHVuZCBNb2VnbGljaGtlaXRlbgorenVyIFZlcmZ1ZWd1bmc6CisKKy0gT2VmZm5lbiwgU2NobGllc3NlbiB1bmQgQWJzY2hsaWVzc2VuIGRlcyBIYXVzZXMgdm9uIGlubmVuCistIEVpbnJhZXVtZW4gdW5kIEVudHppZWhlbiB2b24gU29uZGVycmVjaHRlbiBtaXQgImVybGF1YmUiIHVuZCAidmVyYmlldGUiCistIEJlbnV0emVuIGRlcyBHdWNrbG9jaHMgaW4gZGVyIFR1ZXIgbWl0IGRlbSBCZWZlaGwgInNwaW9uIgorLSBNaXR0ZWlsdW5nIHVlYmVyIGFuZ2VzYW1tZWx0ZSAndHlwbyctTWVsZHVuZ2VuIHNlaXQgZGVtIGxldHp0ZW4gQmV0cmV0ZW4KKy0gInVlYmVyc2ljaHQiIHplaWd0IHp1c2FldHpsaWNoIGRpZSBMZXV0ZSBhdWYgZGVyIGVybGF1YmUtTGlzdGUKKworCis1ZC4gRGllIFRydWhlCistLS0tLS0tLS0tLS0tCisKK0RpZSBUcnVoZSBrYW5uIHVuZW5kbGljaCB2aWVsZSBHZWdlbnN0YWVuZGUgYXVmbmVobWVuLgorQWVuZGVybiBsYXNzZW4gc2ljaCBHZXNjaGxlY2h0LCBOYW1lLCBBZGpla3RpdmUgKGF1cyBkaWVzZW4gZHJlaWVuIHdpcmQgZGllCitLdXJ6YmVzY2hyZWlidW5nIHp1c2FtbWVuZ2VzZXR6dCksIElEcywgTGFuZ2Jlc2NocmVpYnVuZyB1bmQgTWF0ZXJpYWwuCitEaWUgSUQgIlx0XHJ1aGUiIGlzdCBJTU1FUiBnZXNldHp0LgorRGllIFRydWhlIGxhZXNzdCBzaWNoIGlubmVyaGFsYiBkZXMgSGF1c2VzIGZyZWkgdmVyc2NoaWViZW4uIEluIGRlbSBSYXVtLAoraW4gZGVtIHNpZSBzdGVodCwgaXN0IGRpZSBQcm9wZXJ0eSBIX0NIRVNUIGF1ZiAxIGdlc2V0enQuCitUeXBvbWVsZHVuZ2VuIGRlciBUcnVoZSBnZWhlbiBpbiBkYXMgUmVwb3J0ZmlsZSBkZXMgSGF1c2Jlc2l0emVycy4KKworUHJvYmxlbTogQWIgdW5kIHp1IGdlYmVuIGVpbmlnZSBTcGV6aWFsaXN0ZW4gYmVpIGRlciBCZXNjaHJlaWJ1bmcgZGVyIElEcworc2Nob24gZGllIExhbmdiZXNjaHJlaWJ1bmcgZWluLiBEYW5hY2gga29lbm5lbiBzaWUgZGllIFRydWhlIG5pY2h0IG1laHIKK2Fuc3ByZWNoZW4uCitMb2VzdW5nOiBWb24gSGFuZCBlaW5lIElEIHNldHplbiB1bmQgZGllIFRydWhlIG1pdCBTYXZlKCkgc3BlaWNoZXJuLgorCitJZGVlbjogWnVzdGFuZCBkZXIgVHJ1aGUgKGdlb2VmZm5ldC9nZXNjaGxvc3NlbikgYmVzY2hyZWliYmFyIG1hY2hlbiB1bmQKK29wdGlvbmFsIGdhbnogd2VnbGFzc2VuLiBNYWNoYmFyIHVlYmVyIEhfRE9PUkxTVEFULiBJbiBzaG9ydCgpIHNpbmQgc2Nob24KK2RpZSBlbnRzcHJlY2hlbmRlbiBWb3JrZWhydW5nZW4gZ2V0cm9mZmVuOyAiYmVzY2hyZWliZSB0cnVoZSBzdGF0dXMiIHdpcmQKK2F1Y2ggc2Nob24gYWJnZWZyYWd0LCBhYmVyIG5vY2ggbmljaHQgYXVzZ2V3ZXJ0ZXQuIEF1c3NlcmRlbSBtdWVzc3RlIGRpZQorS3VyemJlc2NocmVpYnVuZyBkYW5uIGV4cGxpeml0IGFuZ2VnZWJlbiB3ZXJkZW4uCisKK09lZmZuZW4ga29lbm5lbiBkaWUgVHJ1aGUgbnVyIExldXRlIG1pdCBFcmxhdWJuaXMuIFNjaGxpZXNzZW4ga2FubiBzaWUKK2plZGVyLiBWZXJzY2hpZWJlbiBrYW5uIHNpZSBudXIgZGVyIEhhdXNiZXNpdHplci4KKworRGllIERhdGVuIGRlciBUcnVoZSB3ZXJkZW4gaW4gX3NldF9vd25lcigpIGdlbGFkZW4uIERpZXNlciBGdW5rdGlvbiB3aWVkZXJ1bQord2lyZCB2b24gZGVtIFJhdW0gYXVmZ2VydWZlbiwgaW4gZGVtIGRpZSBUcnVoZSBzdGVodCAobW9kdWxlcy9sb3NhOjpMb2FkKCkpLgorCisKKzYuIFNlaGVyYmFuay9IYXVzZXJ3ZXJiCis9PT09PT09PT09PT09PT09PT09PT09PQorCitEaWUgQmFuayBzdGVodCBpbiBEcmFjaGVuaG9ydC4gV2VzZW50bGljaGUgQmVzdGFuZHRlaWxlIHNpbmQgZHJlaSBTY2hhbHRlcgorbWl0IGVudHNwcmVjaGVuZGVuIFdhcnRlc2NobGFuZ2VuLgorCitEZXIgQW50cmFnc3NjaGFsdGVyIC0gc2JfYW50cmFnLmMKKyAgSGllciBlcmhhZWx0IG1hbiBkaWUgVmVydHJhZWdlIGZ1ZXIgZWluIEhhdXMgb2RlciBlaW5lbiBuZXVlbiBSYXVtLiBFaW5lbgorICBBdXNiYXV2ZXJ0cmFnIGJla29tbXQgbWFuIGFsbGVyZGluZ3MgZXJzdCBkYW5uLCB3ZW5uIGRhcyBIYXVzIHNjaG9uIHN0ZWh0LgorICBWZXJ0cmFlZ2Ugd2VyZGVuIG51ciBhbiBTZWhlciBhdXNnZWhhZW5kaWd0LCBkaWUga2VpbmVuIFBLIGhhYmVuLgorCitEZXIgVmVydHJhZyAtIGJhdXNwYXJ2ZXJ0cmFnLmMKKyAgRXJoYWVsdGxpY2ggYW0gQW50cmFnc3NjaGFsdGVyLgorICBEZXIgVmVydHJhZyBtdXNzIGF1Y2ggYW0gQW50cmFnc3NjaGFsdGVyIHVudGVyc2NocmllYmVuIHdlcmRlbi4gRGllIFVudGVyLQorICBzY2hyaWZ0IHdpcmQgbWl0IEJsdXQgYmVzdGFldGlndCwgd29kdXJjaCBlaW4gcmVkdWNlX2hpdF9wb2ludCg1MCkgZmFlbGxpZworICB3aXJkLiA7KQorICBBdWYgaWhtIHdpcmQgamVkZSBlaW5nZXphaGx0ZSBSYXRlIHZlcm1lcmt0LgorICBXaWxsIG1hbiBkb2NoIGtlaW4gSGF1cywga2FubiBtYW4gZGVuIFZlcnRyYWcgamVkZXJ6ZWl0IHplcnJlaXNzZW4uIERpZQorICBlaW5nZXphaGx0ZW4gRVAgc2luZCBkYW5uIGFsbGVyZGluZ3Mgd2VnLgorICBOYWNoIGRlciBVbnRlcnNjaHJpZnQgYmVrb21tdCBtYW4gZGVuIE1hc3Rlci1CbG9jayB1ZWJlcnJlaWNodC4KKworRGVyIE1hc3Rlci1CbG9jayAtIGJsb2NrLmMKKyAgRGVyIEJsb2NrIG5pbW10IGRpZSBha3R1ZWxsZW4gUmF0ZW4gYXVmLiBEYXp1IGRpZW50IGRlciBibG9ja19zaGFkb3cKKyAgKGluIC9zdGQvcGxheWVyL3NoYWRvd3MvKSwgZGVyIGltbWVyIGRhbm4gYWt0aXZpZXJ0IHdpcmQsIHdlbm4gbWFuIGRlbgorICBCbG9jayBhbnppZWh0IChlciBpc3QgZWluZSBBVF9NSVNDLVJ1ZXN0dW5nLCBzY2h1ZXR6dCBhbHNvIG5pY2h0KS4KKyAgRGVyIFNoYWRvdyBsZWl0ZXQgQWRkRXhwKCktQXVmcnVmZSBhbiBkZW0gQmxvY2sgdW0uIEJlaSBtaW5kZXN0ZW5zCisgIDMwLTQwIEVQIHdpcmQgYWxsZXMgYmlzIGF1ZiBkZW4gTWluZGVzdGFudGVpbCBhdWYgZGVuIEJsb2NrIGVpbmdlemFobHQsCisgIHVuZCBkZXIgTWluZGVzdGFudGVpbCBrb21tdCBkZW0gU3BpZWxlciB6dWd1dGUuCisKK0RlciBFaW56YWhsdW5nc3NjaGFsdGVyIC0gc2JfZWluemFobHVuZy5jCisgIElzdCBkaWUgTWFzdGVyLUJsb2NrIHZvbGwsIGthbm4gbWFuIGlobiBoaWVyIHZvcmxlZ2VuLiBEaWUgUmF0ZSB3aXJkIGRhbm4KKyAgYXVmIGRlbiBWZXJ0cmFnIGdlYnVjaHQsIHVuZCBtYW4gYmVrb21tdCBlaW5lbiBuZXVlbiBCbG9jayBmdWVyIGRpZQorICBuYWVjaHN0ZSBSYXRlIChzb3dlaXQgbWFuIG5vY2ggbmljaHQgZmVydGlnIGlzdCkuCisKK0RlciBBdXNnYWJlc2NoYWx0ZXIgLSBzYl9hdXNnYWJlLmMKKyAgSGF0IG1hbiBhbGxlIFJhdGVuIGVpbmdlemFobHQsIGthbm4gbWFuIGhpZXIgbmFjaCBWb3JsYWdlIGRlcyBWZXJ0cmFncyBkaWUKKyAgRnJ1ZWNodGUgc2VpbmVyIEFyYmVpdCBlcm50ZW4uCisgIEhhbmRlbHRlIGVzIHNpY2ggdW0gZWluZW4gSGF1c3ZlcnRyYWcsIGJla29tbXQgbWFuIGVpbiBJbnN0YW50aGF1cyBhdXNnZS0KKyAgaGFlbmRpZ3QuCisgIEhhbmRlbHRlIGVzIHNpY2ggdW0gZWluZW4gQXVzYmF1dmVydHJhZywgd2lyZCBkaWUgUmF1bXphaGwgZGVzIEhhdXNlcyB1bQorICBlaW5zIGVyaG9laHQgKG1hbiBiZWtvbW10IGtlaW4gT2JqZWt0IGluIGRpZSBIYW5kOyB2aWVsbWVociBrYW5uIG1hbiBpbgorICBzZWluZW0gSGF1cyBqZXR6dCBlaW5lbiBBdXNnYW5nIGluIGRlbiBuZXVlbiBSYXVtIGxlZ2VuKS4KKyAgQUxMRVJESU5HUzogVW0gSGF1cyBvZGVyIFJhdW0gYXVzenVnZWJlbiwgbXVlc3NlbiBpbiBkZXIgWmVudHJhbGJhbmsKKyAgbWluZGVzdGVucyAzMDAwMCBNdWVuemVuIHZvcmhhbmRlbiBzZWluIChkYW1pdCBkZWNrdCBkaWUgU2VoZXJiYW5rIGRpZQorICBNYXRlcmlhbGtvc3RlbikuIFNvbGFuZ2UgbmljaHQgZ2VudWcgR2VsZCBkYSBpc3QsIGdpYnRzIGF1Y2gga2VpbiBIYXVzLgorICBEZXIgU2VoZXIgaGF0IHp3ZWkgQWx0ZXJuYXRpdmVuOiBhKSB3YXJ0ZW4sIGJpcyBnZW51ZyBHZWxkIGRhIGlzdCwgb2RlcgorICBiKSB6dW0gRW5kZSBkZXIgV2VsdCByZWlzZW4gdW5kIGRhcyBHZWxkIGluIGRlbiBHZWxkc3BlaWNoZXIgZGVyIFplbnRyYWwtCisgIGJhbmsgd2VyZmVuLgorCitFaW5lIFJhdGUgdW1mYXNzdCA4MDAwMCBFUC4KK0VzIGdpYnQgendlaSBWZXJ0cmFnc3ZhcmlhbnRlbjogc2FuZnQgdW5kIHNjaG5lbGwuCitCZWkgZGVyIHNhbmZ0ZW4gVmFyaWFudGUgaGF0IG1hbiA0IFN0dW5kZW4gWmVpdCwgdW0gZGllIFJhdGUgenUgc2FtbWVsbiwgYmVpCitkZXIgc2NobmVsbGVuIFZhcmlhbnRlIHNpbmQgZXMgMiBTdHVuZGVuLgorRGllc2UgWmVpdGVuIHdlcmRlbiBuYWNoIE9ubGluZS1aZWl0IGdlbWVzc2VuLCBuaWNodCBuYWNoIFJMLVplaXQuIDopCitGdWVyIGVpbiBIYXVzIGJlbm9ldGlndCBtYW4gYmVpIGRlbiBzYW5mdGVuIFZhcmlhbnRlIDMwIFJhdGVuLCBiZWkgZGVyCitzY2huZWxsZW4gVmFyaWFudGUgMjUgUmF0ZW4uCitGdWVyIGVpbmVuIFJhdW0gc2luZCBlcyAxMiBSYXRlbiBiZWkgZGVyIHNhbmZ0ZW4gdW5kIDEwIFJhdGVuIGJlaSBkZXIKK3NjaG5lbGxlbiBWYXJpYW50ZS4KK1VlYmVyemllaHQgbWFuIGRpZSBaZWl0LCBlcmhvZWh0IHNpY2ggZGllIFJhdGVuaG9laGUgdW0gNjAlIGF1ZiAxMjgwMDAgRVAuCitNYW4gaGF0IGJlaSBiZWlkZW4gVmFyaWFudGVuIGVpbmUgU3R1bmRlIFplaXQsIGRpZSBSYXRlIG5vY2ggenUgZXJmdWVsbGVuLgorU2NoYWZmdCBtYW4gZXMgbmljaHQsIHZlcmZhZWxsdCBkZXIgVmVydHJhZyA9PiBhbGxlcyBpc3Qgd2VnLgorRGFzIFplaXRsaW1pdCBnaWx0IG51ciBmdWVyIGRhcyBGdWVsbGVuIGRlcyBCbG9ja3MuIFdlbm4gZXIgZXJzdCBtYW4gdm9sbAoraXN0LCBicmF1Y2h0IG1hbiBuaWNodCBpbm5lcmhhYiBkZXMgTGltaXRzIHp1ciBCYW5rLCB1bSBkZW4gbmFlY2hzdGVuCitCbG9jayB6dSBob2xlbi4KKworNy4gQmVzY2hyZWlidW5nZW4KKz09PT09PT09PT09PT09PT09CisKK0ZvbGdlbmRlIEFzcGVrdGUgZGVyIFJhdW1iZXNjaHJlaWJ1bmcgbGFzc2VuIHNpY2ggdmVyYWVuZGVybjoKKworLSBEZXRhaWxzICAgICAgImJlc2NocmVpYmUgZGV0YWlsIDxkZXQ+IiAgICAgICAgICAgICAgICAgICAgIFBfREVUQUlMUworLSBSZWFkRGV0YWlscyAgImJlc2NocmVpYmUgbGVzYmFyZXMgZGV0YWlsIDxkZXQ+IiAgICAgICAgICAgIFBfUkVBRF9ERVRBSUxTCistIExhbmdiZXNjaHIuICAiYmVzY2hyZWliZSBoYXVzL3JhdW0gbGFuZyIgKGF1Y2ggYXVzc2VuKSAgICAgUF8oSU5UXylMT05HCistIEt1cnpiZXNjaHIuICAiYmVzY2hyZWliZSBoYXVzL3JhdW0ga3VyeiIgICAgICAgICAgICAgICAgICAgUF9JTlRfU0hPUlQKKy0gQXVzZ2FlbmdlICAgICJhdXNnYW5nIDxyaWNodHVuZz4gPG5yPiIgLyAic3BlcnJlIHJpY2h0dW5nIiBQX0VYSVRTCistIExpY2h0ICAgICAgICAibGljaHQgYW4vYXVzIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUF9MSUdIVAorLSBCZWZlaGxlICAgICAgImJlc2NocmVpYmUgYmVmZWhsIDxiZWY+IiAgICAgICAgICAgICAgICAgICAgIEhfQ09NTUFORFMKKworRGV0YWlscywgUmVhZERldGFpbHMgdW5kIEJlZmVobGUgbGFzc2VuIHNpY2ggYXVjaCBrb3BpZXJlbiwgYWxsZXJkaW5ncyBpbW1lcgorbnVyIGlubmVyaGFsYiBkZXIgamV3ZWlsaWdlbiBQcm9wZXJ0eWdydXBwZSAoZXMgbGFlc3N0IHNpY2ggYWxzbyBrZWluIERldGFpbAorenUgZGVuIFJlYWREZXRhaWxzIGtvcGllcmVuKS4KKworQXVzc2VyZGVtIGxhc3NlbiBzaWNoIERldGFpbHMsIFJlYWREZXRhaWxzLCBCZWZlaGxlIHVuZCBkaWUgTGFuZ2Jlc2NocmVpYnVuZworYWVuZGVybi4gRGFzIGxhZXVmdCBhZWhubGljaCB3aWUgYmVpbSBCZXNjaHJlaWJlbiwgYWxsZXJkaW5ncyB3aXJkIGRlcgorYWt0dWVsbCB2b3JoYW5kZW5lIFRleHQgYWxzIFZvcmdhYmUgdmVyd2VuZGV0LgorCisKKzdhLiBEZXRhaWxzL1JlYWREZXRhaWxzL0xhbmctIHVuZCBLdXJ6YmVzY2hyZWlidW5nCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitIaWVyIHBhc3NpZXJ0IG5pY2h0IHZpZWwgbWl0IGRlbSBlaW5nZWdlYmVuZW4gVGV4dC4gQEAgd2VyZGVuIGR1cmNoICoqCitlcnNldHp0LCBkYW1pdCBuaWNodCBhdXMgVmVyc2VoZW4gb2RlciBiZWFic2ljaHRpZ3QgcHJvY2Vzc19zdHJpbmcoKQorYXVzZ2Vsb2VzdCB3aXJkLgorCitCZWkgZGVyIEt1cnpiZXNjaHJlaWJ1bmcgd2lyZCBub2NoIGdlcHJ1ZWZ0LCBvYiBzaWUgbGFlbmdlciBhbHMgNzUgWmVpY2hlbgorb2RlciBlaW5lIFplaWxlIGlzdCAoZmFsbHMgamEsIHdpcmQgc2llIG5pY2h0IHVlYmVybm9tbWVuKS4KKworTW9lZ2xpY2hlIEVyd2VpdGVydW5nZW46IFJhc3NlbnNwZXppZmlzY2hlIERldGFpbHMgKGRhcyBtdXNzIGJpc2hlciB1ZWJlcgorQmZlaGxlIGdlbWFjaHQgd2VyZGVuKSwgdW5kIGRhIEFkZFNtZWxscygpL0FkZFNvdW5kcygpIGpldHp0ICJvZmZpemllbGwiIGluCitzaW5kLCB2aWVsbGVpY2h0IGF1Y2ggZGllIE1vZWdsaWNoa2VpdCwgR2VydWVjaGUgdW5kIEdlcmFldXNjaGUgenUKK2Jlc2NocmVpYmVuLgorCis3Yi4gQXVzZ2FlbmdlCistLS0tLS0tLS0tLS0tCisKK01vZWdsaWNoZSBBdXNnYWVuZ2Ugc2luZCBkaWUgYWNodCBIaW1tZWxzcmljaHR1bmdlbiwgIm9iZW4iIHVuZCAidW50ZW4iLgorTGVndCBtYW4gZWluZW4gQXVzZ2FuZyBhbiwgd2lyZCBhdXRvbWF0aXNjaCBpbSBaaWVscmF1bSBlaW4gQXVzZ2FuZyBpbiBkaWUKK2VudHNwcmVjaGVuZGUgUnVlY2tyaWNodHVuZyBhbmdlbGVndC4KK0RhcyBBbmxlZ2VuIGtsYXBwdCBudXIsIHdlbm4gZXMgbm9jaCBrZWluZW4gQXVzZ2FuZyBpbiBkaWVzZSBSaWNodHVuZyBnaWJ0LAordW5kIGltIFppZWxyYXVtIG5vY2gga2VpbmVuIEF1c2dhbmcgaW4gZGllIFJ1ZWNrcmljaHR1bmcuCitTb2xsIGVpbiBBdXNnYW5nIGluIGVpbiBiZW5hY2hiYXJ0ZXMgU2VoZXJoYXVzIGdlbGVndCB3ZXJkZW4sIG11c3MgbWFuIGRvcnQKK2RhcnVlYmVyaGluYXVzIGF1ZiBkZXIgZXJsYXViZS1MaXN0ZSBzdGVoZW4uCitCZWltIFNwZXJyZW4gZWluZXMgQXVzZ2FuZ3Mgd2lyZCBkZXIgZW50c3ByZWNoZW5kZSBBdXNnYW5nIGltIFppZWxyYXVtCithdXRvbWF0aXNjaCBtaXQgZW50ZmVybnQuCisKK0RlciBHcnVuZCBmdWVyIGRpZXNlcyBzeW1tZXRyaXNjaGUgVmVyaGFsdGVuIGxpZWd0IGRhcmluLCBkYXNzIG1hbiBhdWYgZGllc2UKK1dlaXNlIGtlaW5lIFNwaWVsZXIgaW4gc2VpbmVtIEhhdXMgZWluc3BlcnJlbiBrYW5uIChBdXNnYW5nIGluIGVpbmVuIFJhdW0sCitvaG5lIGRhc3MgZXMgenVydWVjayBnZWh0KS4KK1VtIGRpZSBBdXNnYWVuZ2UgZWluYW5kZXIgZWluZmFjaCB6dW9yZG5lbiB6dSBrb2VubmVuLCBzaW5kIGF1Y2gga2VpbmUgc2VsYnN0CitlcmZ1bmRlbmVuIFJpY2h0dW5nZW4gbW9lZ2xpY2ggKGtvZW5udGUgbWFuIGFsbGVyZGluZ3MgaW1wbGVtZW50aWVyZW4sIGluZGVtCittYW4gZXhwbGl6aXQgbmFjaCBkZXIgUnVlY2tyaWNodHVuZyBmcmFndCkuCisKKworN2MuIExpY2h0CistLS0tLS0tLS0KKworUF9MSUdIVCB3aXJkIHNvIGdlc2V0enQsIGRhc3MgZXMgaW0gSGF1cyBtaXQgZGVtIG1vbWVudGFuZW4gTGljaHRsZXZlbCBnZXJhZGUKK2R1bmtlbCBvZGVyIGhlbGwgd2lyZC4gSGF0IG1hbiBhbHNvIG5lbiBHZXNhbXRsaWNodGxldmVsIHZvbiAyMCAoZHVyY2gKK2dlbnVlZ2VuZCBMaWNodGt1Z2VsbiBvLmFlLikgdW5kIG1hY2h0ICJsaWNodCBhdXMiLCB3aXJkIFBfTElHSFQgYXVmIC0yMAorZ2VzZXR6dC4KKworCis3ZC4gQmVmZWhsZQorLS0tLS0tLS0tLS0KKworVW0gZGllIEF1c3dlcnR1bmcgenUgdmVyZWluZmFjaGVuLCB3ZXJkZW4gZGllIFBsYXR6aGFsdGVyIGluIGRlbiBCZWZlaGxzLQordGV4dGVuIGluIGt1ZXJ6ZXJlIFRva2VuIHVtZ2V3YW5kZWx0IChGdW5rdGlvbiBwcmVwYXJzZSgpKS4KK0RpZSBBdXN3ZXJ0dW5nIGVyZm9sZ3Qgdm9uIG1vZHVsZXMvdXNlcmNtZC5jIGF1cy4KKworSW4gcHJlcGFyc2UoKSB3ZXJkZW4gaW0gd2VzZW50bGljaGVuIGRpZSBGYWVsbGUgZnVlciBOYW1lbiwgUGVyc29uYWwtIHVuZAorUG9zc2Vzc2l2cHJvbm9taW5hIGluIGRpZSBaYWhsZW4gdW1nZXNldHp0LCBkaWUgZGVuIGVudHNwcmVjaGVuZGVuCitGdW5rdGlvbmVuIChuYW1lKCksIFF1ZXJ5UHJvbm91bigpLCBRdWVyeVBvc3NQcm9ub3VuKCkpIHVlYmVyZ2ViZW4gd2VyZGVuLgorQXVzZ2V3ZXJ0ZXQgd2VyZGVuIHNpZSB2b24gdXNlcmNtZDo6dWNGaWx0ZXIoKS4KKworRGllIEF1c3dlcnR1bmcgcmFzc2Vuc3BlemlmaXNjaGVyIFRleHRlIG11c3MgYW5nZXBhc3N0IHdlcmRlbiwgd2VubiBuZXVlCitSYXNzZW4gaW5zIE1HIGtvbW1lbi4gQmV0cm9mZmVuIGRhdm9uIGlzdCB1c2VyY21kOjp1Y1RleHQoKS4KK0RpZSByYXNzZW5zcGV6aWZpc2NoZW4gVGV4dGUgd2VyZGVuIGR1cmNoIFBsYXR6aGFsdGVyIGRlciBGb3JtIEBSWCB2b25laW4tCithbmRlciBnZXRyZW5udCwgd29iZWkgWCBlaW4gQnVjaHN0YWJlIGZ1ZXIgZGllIFJhc3NlIGlzdC4KK0JlaSBlaW5lciBuZXVlbiBSYXNzZSBtdWVzc3RlIGRpZXNlciBCdWNoc3RhYmUgaW4gZGVyIHJlZ2V4cGxvZGUtWmVpbGUgYW0KK0FuZmFuZyB2b24gdWNUZXh0KCkgaW4gZGVuIGVja2lnZW4gS2xhbW1lcm4gZWluZ2VmdWVndCB3ZXJkZW4sIHVuZCBlaW5lCitlbnRzcHJlY2hlbmRlIEFiZnJhZ2UgaW4gZGllIHN3aXRjaCgpLUFud2Vpc3VuZyByZWluLgorVW5kIG5hdHVlcmxpY2ggc29sbHRlIGRpZSBIaWxmZXNlaXRlICgiYmVmZWhsIikgZ2V1cGRhdGVkIHdlcmRlbiA6KQorCitCaXNoZXIgc2luZCByZWluZSBUZXh0YXVzZ2FiZWJlZmVobGUgbW9lZ2xpY2guCitFaW5pZ2UgU2VoZXIgaGFiZW4gc2ljaCB3ZWl0ZXJlIE1vZWdsaWNoa2VpdGVuIGdld3VlbnNjaHQsIHouQi4gc28gZXR3YXMKK3dpZSBTcGVjaWFsRGV0YWlscyBvZGVyIFNwZWNpYWxFeGl0cy4gRGFmdWVyIG11ZXNzdGUgbWFuIFp1c3RhZW5kZSBzZXR6ZW4KK3VuZCBhZW5kZXJuIGtvZW5uZW4gKFByb3BlcnR5IEhfVkFSUyBvZGVyIHNvPykuIEFsbGVyZGluZ3Mgd2lyZCBkYWR1cmNoCitkaWUgQmVzY2hyZWlidW5nIGFuIHNpY2ggd2llZGVyIGtvbXBsaXppZXJ0ZXIuCisKKworOC4gUnVlY2ttZWxkdW5nZW4KKz09PT09PT09PT09PT09PT09CisKK0RpZSBSYWV1bWUsIGRpZSBBdXNzZW5hbnNpY2h0IGRlcyBIYXVzZXMgdW5kIGRpZSBUcnVoZSBoYWJlbiBlaW5lIEZ1bmt0aW9uCitTbWFydExvZygpLiBEaWVzZSBGdW5rdGlvbiB3aXJkIHZvbiAvc3RkL3BsYXllci9iYXNlOjpzbWFydF9sb2coKSBhdXMgYXVmLQorZ2VydWZlbiB1bmQgdWViZXJuaW1tdCBkYXMgTG9nZ2VuIGRlciBUeXBvLSwgSWRlZS0gdW5kIEZlaGxlcm1lbGR1bmdlbi4KK0RpZSBNZWxkdW5nZW4gd2VyZGVuIGludCAicmVwLzxuYW1lPi5yZXAiIGFiZ2VsZWd0LgorRGVyIEhhdXNiZXNpdHplciB3aXJkIGpld2VpbHMgYmVpbSBCZXRyZXRlbiBkZXMgRWluZ2FuZ3NyYXVtZXMgaW5mb3JtaWVydCwKK3dpZSB2aWVsZSBSdWVja21lbGR1bmdlbiBzaWNoIHNlaXQgZGVtIGxldHp0ZW4gQmV0cmV0ZW4gYW5nZXNhbW1lbHQgaGFiZW4uCitBbnNlaGVuIGthbm4gZXIgc2ljaCBkaWUgTWVsZHVuZ2VuIG1pdCBkZW0gQmVmZWhsICJtZWxkdW5nZW4iLCB1bmQgbWl0CisiYWVuZGVyZSIgb2RlciAiYmVzY2hyZWliZSIga2FubiBlciBkaWUgVHlwb3MgYmVoZWJlbi4KK01pdCAiYWVuZGVyZSBtZWxkdW5nZW4iIGthbm4gZXIgZGllIGFiZ2VhcmJlaXRldGVuIE1lbGR1bmdlbiBhdXMgc2VpbmVtCisucmVwLUZpbGUgZW50ZmVybmVuLgorCisKKzkuIEhpbGZlc2VpdGVuCis9PT09PT09PT09PT09PQorCitEaWUgIkFyYmVpdHN2ZXJzaW9uZW4iIGRlciBTZWl0ZW4gbGllZ2VuIGluIGRvYy8sIGRpZSAib2ZmaXppZWxsZW4iIFZlcnNpb25lbgoraW4gL2RvYy9zY21kLgorImJlc2NocmVpYmUgYmVmZWhsIiBoYXQgZWluZSBFeHRyYXNlaXRlICgiaGlsZmUgYmVmZWhsIiksIHdlaWwgZGllIFNlaXRlIGZ1ZXIKKyJiZXNjaHJlaWJlIiBzb25zdCB6dSBncm9zcyB3YWVyZS4KZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9oYXVzLmMgYi9kL3NlaGVyL2hhZXVzZXIvaGF1cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MTQ3MWMKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvaGF1cy5jCkBAIC0wLDAgKzEsMzYxIEBACisvLworLy8gIGhhdXMuYyAgLS0gRGFzIFJvaGdlcnVlc3QgZWluZXMgU2VoZXJoYXVzZXMuCisvLworLy8gIEdydW5kb2JqZWt0IChjKSAxOTk0IEJvaW5nQE1vcmdlbkdyYXVlbgorLy8gIEFic2NobGllc3NlbiB1bmQgUmF1c3dlcmZlbiB2b24gSm9mCisvLyAgRnVlciBBZW5kZXJ1bmdlbiBhYiBkZW0gMDYuMTAuOTQgdmVyYW50d29ydGxpY2g6IFdhcmdvbgorLy8KKy8vICREYXRlOiAxOTk2LzAyLzIxIDE4OjA5OjU1ICQKKy8vICRSZXZpc2lvbjogMi44ICQKKy8qICRMb2c6IGhhdXMuYyx2ICQKKyAqIFJldmlzaW9uIDIuOCAgMTk5Ni8wMi8yMSAgMTg6MDk6NTUgIFdhcmdvbgorICogU21hcnRMb2coKSBmdWVyIFJ1ZWNrbWVsZHVuZ2VuIGVpbmdlYmF1dC4KKyAqCisgKiBSZXZpc2lvbiAyLjcgIDE5OTUvMDcvMDYgIDExOjE4OjA3ICBXYXJnb24KKyAqIExhbmdiZXNjaHJlaWJ1bmcgYWVuZGVyYmFyLgorICoKKyAqIFJldmlzaW9uIDIuNiAgMTk5NS8wNC8yMSAgMTA6NDg6MjAgIFdhcmdvbgorICogQnVnZml4IGluICJiZXNjaHJlaWJlIHR1ZXJzdGF0dXMiLgorICoKKyAqIFJldmlzaW9uIDIuNSAgMTk5NS8wNC8yMSAgMDg6NTY6NTUgIFdhcmdvbgorICogSGF1c3R1ZXIgYXVzZ2VsYWdlcnQuCisgKiAnYmVzY2hyZWliZSB0dWVyenVzdGFuZCcgaXN0IGRhenVnZWtvbW1lbi4KKyAqCisgKiBSZXZpc2lvbiAyLjQgIDE5OTUvMDIvMjcgIDIwOjQ3OjMyICBXYXJnb24KKyAqIERpdmVyc2UgQnVncyBnZWZpeGVkLi4uCisgKgorICogUmV2aXNpb24gMi4yICAxOTk1LzAyLzE1ICAxMToxOToxNyAgV2FyZ29uCisgKiBEaWUgSGF1c3R1ZXIga2FubiBqZXR6dCBhdWNoIGJlc2NocmllYmVuIHdlcmRlbiAoSF9ET09SKS4KKyAqCisgKiBSZXZpc2lvbiAyLjEgIDE5OTUvMDIvMDQgIDE0OjUxOjE0ICBXYXJnb24KKyAqIFN0YXR0ICJIYXVzIiB3aXJkIHdlaXRlc3RnZWhlbmQgbmFtZSgpIHZlcndlbmRldC4KKyAqCisgKiBSZXZpc2lvbiAyLjAgIDE5OTUvMDIvMDEgIDIwOjQwOjI2ICBXYXJnb24KKyAqIERhcyBIYXVzIGlzdCBqZXR6dCBudXIgbm9jaCBlaW4gT2JqZWt0IGluIGVpbmVtIFJhdW0sIG5pY2h0CisgKiBtZWhyIGVpbiBSYXVtIGltIFJhdW0uCisgKgorICovCisjaW5jbHVkZSAiaGF1cy5oIgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKworaW5oZXJpdCAiL3N0ZC90aGluZyI7Citpbmhlcml0IEhBVVNUVUVSOworCitwcml2YXRlIG5vc2F2ZSBzdHJpbmcgdGV4dDsKK3ByaXZhdGUgbm9zYXZlIHN0cmluZyBvd25lcjsKKwordm9pZCBjcmVhdGUoKQoreworICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuOworCisgIHRoaW5nOjpjcmVhdGUoKTsKKyAgaGF1c3R1ZXI6OmNyZWF0ZSgpOworCisgIFNldFByb3AoUF9OQU1FLCAoeyAiSGF1cyIsICJIYXVzZXMiLCAiSGF1cyIsICJIYXVzIiB9KSk7CisgIFNldFByb3AoUF9JRFMsICh7ImhhdXMiLCJzZWhlXHJoYXVzIn0pKTsKKyAgU2V0UHJvcChQX0dFTkRFUiwgTkVVVEVSKTsKKyAgU2V0UHJvcChQX05PR0VULDEpOworCisgIFNldChQX0xPTkcsIFNBVkUsIEZfTU9ERSk7CisgIFNldChQX1NIT1JULCBTQVZFLCBGX01PREUpOworICBTZXQoUF9JRFMsIFNBVkUsIEZfTU9ERSk7CisgIFNldChQX0dFTkRFUiwgU0FWRSwgRl9NT0RFKTsKKyAgU2V0KFBfTkFNRSwgU0FWRSwgRl9NT0RFKTsKKworICB0ZXh0ID0gMDsKKworICBBZGRDbWQoICh7ImJldHJpdHQiLCAiYmV0cmV0ZSJ9KSwgImJldHJpdHQiICk7CisgIEFkZENtZCggKHsiYmVzY2hyZWliIiwgImJlc2NocmVpYmUifSksICJiZXNjaHJlaWJlbiIpOworICBBZGRDbWQoICh7ImFlbmRlciIsICJhZW5kZXJlIn0pLCAiYWVuZGVybiIpOworICBBZGRDbWQoICh7Imtsb3BmIiwia2xvcGZlIn0pLCAia2xvcGZlbiIpOworICBBZGRDbWQoImVybGF1YmUiLCAiZXJsYXViZW4iKTsKKyAgQWRkQ21kKCJ2ZXJiaWV0ZSIsICJ2ZXJiaWV0ZW4iKTsKKyAgQWRkQ21kKCJub3RpeiIsICJtZXJrdGV4dCIpOworfQorCit2YXJhcmdzIHZvaWQgU2F2ZShpbnQgY3J1bmNoZWQpCit7CisgIHNhdmVfb2JqZWN0KEhBVVNTQVZFUEFUSCtvd25lcik7Cit9CisKK3ZvaWQgTG9hZCgpCit7CisgIHJlc3RvcmVfb2JqZWN0KEhBVVNTQVZFUEFUSCtvd25lcik7Cit9CisKK3ZvaWQgaW5pdCgpCit7CisgIC8vIHN0YXR0IGltIEhhdXMgbGFuZGV0IG1hbiBpbSBIYXVwdHJhdW0gUmF1bSAwLCBzb2xsdGUgYW5zaWNoIG5pY2h0IHBhc3NpZXJlbgorICAvLyBkYSBtYW4gbm9tYWxlcndlaXNlIG5pY2h0IGlucyBIYXVzIHNvbmRlcm4gZGlyZWt0IGluIGRlbiBIYXVwdHJhdW0gZ2Vtb3ZlZCB3aXJkCisgIGlmIChlbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKSA9PSB0aGlzX29iamVjdCgpKSB7CisgICAgdGhpc19wbGF5ZXIoKS0+bW92ZShSQVVNTkFNRShvd25lciwwKSwgTV9HTyB8IE1fTk9fU0hPVyB8IE1fU0lMRU5UKTsKKyAgICByZXR1cm47CisgIH0KKyAgOjppbml0KCk7Cit9CisKKy8vIEV4dHJhIGZ1ZXIgQm9pbmchIDspCisvLyBTZXR6dCBtYW4gUF9TSE9SVCBkZXMgSGF1c2VzIGF1ZiAwLCBzbyB2ZXJzY2h3aW5kZXQgZXMgendhciBhdXMKKy8vIGRlciBCZXNjaHJlaWJ1bmcgZGVzIFJhdW1lcywgaXN0IGFiZXIgaW1tZXIgbm9jaCBhbnNwcmVjaGJhciEKK3N0cmluZyBzaG9ydCgpCit7CisgIHN0cmluZyByZXQ7CisKKyAgcmV0ID0gOjpzaG9ydCgpOworICBpZiAocHJldmlvdXNfb2JqZWN0KCkgIT0gZW52aXJvbm1lbnQoKSAmJiAhcmV0KQorICAgIHJldCA9IiI7CisKKyAgcmV0dXJuIHJldDsKK30KKworLy8gWnVzdGFuZCBkZXIgSGF1c3R1ZXIgdW5kIGV2dGwuIE5vdGl6IG1pdCBlaW5iYXVlbi4KK3ZhcmFyZ3Mgc3RyaW5nIGxvbmcoaW50IG1vZGUpCit7CisgIHN0cmluZyByZXQsIGRvb3I7CisKKyAgZG9vciA9IGhhdXN0dWVyOjpsb25nKG1vZGUpOworCisgIHJldCA9IFF1ZXJ5UHJvcChQX0xPTkcpK2Rvb3I7CisgIGlmICh0ZXh0KSB7CisgICAgcmV0ICs9IGJyZWFrX3N0cmluZyggIkFuICIrbmFtZShXRU0sMSkrIiBiZWZpbmRldCBzaWNoIGVpbmUgTm90aXo6ICciK3RleHQrIicuIiwgNzUpOworICB9CisgIHJldHVybiBicmVha19zdHJpbmcocmV0LCA3NSk7Cit9CisKKy8vIFNldHplIG5ldWVuIEJlc2l0emVyIGZ1ZXIgZGllc2VzIEhhdXMKKy8vIHNldHp0IERlZmF1bHQtU2hvcnQsIC1Mb25nIHVuZCBJZCBmdWVyIG5ldWVuIEJlc2l0emVyLAorLy8gbGVpdGV0IEJlc2l0emVyIGFuIEhhdXN0dWVyIHdlaXRlciB1bmQgbGFlZHQgZGVuIEhhdXB0cmF1bQordmFyYXJncyBzdHJpbmcgU2V0T3duZXIoc3RyaW5nIG8pCit7CisgIFNldFByb3AoUF9TSE9SVCwgIkRhcyBIYXVzIHZvbiAiK2NhcGl0YWxpemUobykpOworICBTZXRQcm9wKFBfTE9ORywgIkRhcyBIYXVzIHZvbiAiK2NhcGl0YWxpemUobykrIiwgZXMgc2llaHQgc2VociBuYWNoIGVpbmVtIFJvaGJhdSBhdXMuXG4iKTsKKyAgQWRkSWQoICh7ICJcbiIrbysiaGF1cyIsICJoYXVzIHZvbiAiK28gfSkgKTsKKyAgaGF1c3R1ZXI6OlNldFR1ZXJPd25lcihvKTsKKyAgbG9hZF9vYmplY3QoUkFVTU5BTUUobywwKSk7CisgIHJldHVybiBvd25lciA9IG87Cit9CisKKy8vIGxpZWZlcnQgZGVuIE5hbWUgZGVzIEhhdXMtQmVzaXR6ZXJzCitzdHJpbmcgUXVlcnlPd25lcigpIHsgcmV0dXJuIG93bmVyOyB9CisKK3ByaXZhdGUgaW50IHRwX293bmVyY2hlY2soKQoreworICBpZihnZXR1aWQodGhpc19wbGF5ZXIoKSkgIT0gb3duZXIpCisgIHsKKyAgICBub3RpZnlfZmFpbCggIkRhcyBpc3QgbmljaHQgRGVpbiBIYXVzIVxuIiApOworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiAxOworfQorCisvLyBBa3Rpb24genVtIEJldHJldGVuCitzdGF0aWMgaW50IGJldHJpdHQoc3RyaW5nIHN0cikKK3sKKyAgbm90aWZ5X2ZhaWwoIldhcyBtb2VjaHRlc3QgRHUgYmV0cmV0ZW4/XG4iKTsKKworICAvLyBIYXVzIHdhciBuaWNodCBhbmdlc3Byb2NoZW4KKyAgaWYgKCFzdHIgfHwgIWlkKHN0cikpCisgICAgcmV0dXJuIDA7CisKKyAgLy8gSGF1c3R1ZXIgaXN0IHp1CisgIGlmIChRdWVyeShIX0RPT1JTVEFUKSAmIERfQ0xPU0VEKSB7CisgICAgcHJpbnRmKCIlcyB2b24gJXMgaXN0IHp1LlxuIiwgY2FwaXRhbGl6ZShuYW1lKFdFUiwxKSksIGNhcGl0YWxpemUob3duZXIpKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICAvLyBiZXdlZ2UgU3BpZWxlciBpbiBIYXVwdHJhdW0KKyAgdGhpc19wbGF5ZXIoKS0+bW92ZShSQVVNTkFNRShvd25lciwwKSwgTV9HTywgMCwgImJldHJpdHQgIituYW1lKFdFTiwxKSwgImtvbW10IGhlcmVpbiIpOworICByZXR1cm4gMTsKK30KKworLy8gQWt0aW9uIHp1bSBTZXR6ZW4vTG9lc2NoZW4gdm9uIE5vdGl6ZW4gYW0gSGF1cworc3RhdGljIGludAorbWVya3RleHQoc3RyaW5nIHN0cikKK3sKKyAgLy8gZGFyZiBkZXIgU3BpZWxlciBkYXMsIGQuaC4gaXN0IGRhcyBzZWluIEhhdXM/CisgIGlmKCF0cF9vd25lcmNoZWNrKCkpCisgIHsKKyAgICBub3RpZnlfZmFpbCggIkR1IGthbm5zdCBrZWluZSBOb3RpeiBhbiAiK2NhcGl0YWxpemUobmFtZShXRU0sMSkpKyIgdm9uICIrY2FwaXRhbGl6ZShvd25lcikrIiBhbmJyaW5nZW4hXG4iICk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBzdHIgPSB0aGlzX3BsYXllcigpLT5fdW5wYXJzZWRfYXJncygpOworCisgIC8vIGtlaW4gVGV4dCA9PiBOb3RpeiBsb2VzY2hlbiwgYW5zb25zdGVuID0+IFRleHQgYWxzIE5vdGl6IHNldHplbgorICBpZiAoIXN0ciB8fCBzdHIgPT0gIiIpIHsKKyAgICB3cml0ZSggIk9LLCBOb3RpeiBpc3QgZ2Vsb2VzY2h0LlxuIiApOworICAgIHRleHQgPSAwOworICB9CisgIGVsc2UgeworICAgIHdyaXRlKCAiT0ssIE5vdGl6IGxhdXRldCAnIitzdHIrIidcbiIpOworICAgIHRleHQgPSBzdHI7CisgIH0KKworICByZXR1cm4gMTsKK30KKworLy8gQWt0aW9uIEFua2xvcGZlbiBhbSBIYXVzCitzdGF0aWMgaW50CitrbG9wZmVuKHN0cmluZyBzdHIpCit7CisgIGludCBpOworICBvYmplY3Qgcm9vbTsKKworICBub3RpZnlfZmFpbCggIlN5bnRheDoga2xvcGZlIGFuIDxoYXVzPiBhblxuIiApOworICAvLyBwYXJzZW4gdm9uIGtsb3BmZSBhbiA8aGF1cz4gYW4KKyAgaWYgKCFzdHIgfHwgc3NjYW5mKHN0ciwgImFuICVzIGFuIiwgc3RyKSAhPSAxKQorICAgIHJldHVybiAwOworCisgIGlmIChzdHIgPT0gInR1ZXIiIHx8IHN0ciA9PSAiaGF1c3R1ZXIiIHx8IGlkKHN0cikpIHsKKyAgICAvLyBNZWxkdW5nZW4gYW4gU3BpZWxlciB1bmQgUmF1bQorICAgIHByaW50ZiggIkR1IGtsb3Bmc3QgYW4gIituYW1lKFdFTSwxKSsiIHZvbiAiK2NhcGl0YWxpemUob3duZXIpKyIgYW4uXG4iKTsKKyAgICBzYXkoIGNhcGl0YWxpemUodGhpc19wbGF5ZXIoKS0+bmFtZShXRVIpKSsiIGtsb3BmdCBhbiAiK25hbWUoV0VNLDEpKyIgdm9uICIrY2FwaXRhbGl6ZShvd25lcikrIiBhbi5cbiIgKTsKKyAgICAvLyBpbiBhbGxlbiBnZWxhZGVuZW4gUmFldW1lbiBLbG9wZmVuIG1lbGRlbgorICAgIGZvciAoaT1WRVJXQUxURVItPkhhdXNQcm9wKG93bmVyLEhQX1JPT01TKTsgaT49MDsgaS0tKSB7CisgICAgICBpZiAocm9vbSA9IGZpbmRfb2JqZWN0KFJBVU1OQU1FKG93bmVyLGkpKSkKKwl0ZWxsX3Jvb20ocm9vbSwgIkR1IGhvZXJzdCwgd2llIGplbWFuZCBhbiBkZXIgSGF1c3R1ZXIgYW5rbG9wZnQuXG4iICk7CisgICAgfQorICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQorCisvLyBBa3Rpb24gVHVlci9IYXVzIGJlc2NocmVpYmVuCitzdGF0aWMgaW50CitiZXNjaHJlaWJlbihzdHJpbmcgc3RyKQoreworICBzdHJpbmcgKnAsICpkczsKKworICAvLyBkYXJmIGRlciBTcGllbGVyIGRhcywgZC5oLiBpc3QgZGFzIHNlaW4gSGF1cz8KKyAgaWYgKCF0cF9vd25lcmNoZWNrKCkpCisgICAgcmV0dXJuIDA7CisKKyAgbm90aWZ5X2ZhaWwoICJIaWVyIGRyYXVzc2VuIGZ1bmt0aW9uaWVydCBudXIgJ2Jlc2NocmVpYmUgPGhhdXM+IGxhbmcnLFxuIgorCSAgICAgICsiJ2Jlc2NocmVpYmUgaGF1c3R1ZXInIG9kZXIgJ2Jlc2NocmVpYmUgdHVlcnp1c3RhbmQnIVxuIik7CisKKyAgLy8genUgd2VuaWcgRWluZ2FiZSB6dW0gUGFyc2VuCisgIGlmICghc3RyIHx8IHN0ciA9PSAiIikKKyAgICByZXR1cm4gMDsKKworICBwID0gb2xkX2V4cGxvZGUoc3RyLCIgIik7CisKKyAgaWYgKHBbMF0gPT0gInR1ZXIiIHx8IHBbMF0gPT0gImhhdXN0dWVyIikgeworICAgIC8vIGJlc2NocmVpYmUgKGhhdXMpdHVlcgorICAgIHdyaXRlKCAiQmVzY2hyZWlidW5nIGRlciBIYXVzdHVlciBhbmdlYmVuLiBFcyBpc3QgbnVyIGVpbmUgWmVpbGUgbW9lZ2xpY2guXG4iCisJICArIkFscyBQbGF0emhhbHRlciBmdWVyIGRlbiBadXN0YW5kIGRlciBUdWVyIGRpZW50ICVzLiBGYWxscyBkaWUgVHVlclxuIgorCSAgKyJuaWNodCBpbiBkZXIgTGFuZ2Vic2NocmVpYnVuZyBkZXMgSGF1c2VzIGF1ZnRhdWNoZW4gc29sbCwgYml0dGUgZWluLVxuIgorCSAgKyJmYWNoIG51ciA8UkVUVVJOPiBkcnVlY2tlbi5cbl0iICk7CisgICAgaW5wdXRfdG8oImRvb3JEZXNjIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgZWxzZSBpZiAocFswXSA9PSAidHVlcnp1c3RhbmQiKSB7CisgICAgLy8gYmVzY2hyZWliZSB0dWVyenVzdGFuZAorICAgIGRzID0gUXVlcnkoSF9ET09STFNUQVQpOworICAgIHdyaXRlKCAiQmVzY2hyZWlidW5nIGRlcyBUdWVyenVzdGFuZGVzIGFuZ2ViZW4uIEVzIGlzdCBudXIgZWluZSBaZWlsZSBtb2VnLVxuIgorCSAgKyJsaWNoLiBEaWUgWnVzdGFlbmRlIG11ZXNzZW4gZHVyY2ggS29tbWF0YSBnZXRyZW5udCBpbiBkZXIgUmVpaGVuLVxuIgorCSAgKyJmb2xnZSAnb2ZmZW4nLCAnZ2VzY2hsb3NzZW4nLCAnYWJnZXNjaGxvc3NlbicgYW5nZWdlYmVuIHdlcmRlbi5cbiIKKwkgICsiTW9tZW50YW5lciBadXN0YW5kOlxuIik7CisgICAgcHJpbnRmKCInJXMnLCAnJXMnLCAnJXMnLlxuIiwgZHNbMF0sIGRzWzFdLCBkc1szXSk7CisgICAgd3JpdGUoICIoQWJicnVjaDogRWluZmFjaCA8UkVUVVJOPiBkcnVlY2tlbiEpXG5dIik7CisgICAgaW5wdXRfdG8oImRvb3JMRGVzYyIpOworICAgIHJldHVybiAxOworICB9CisgIGVsc2UgaWYgKHBbPDFdID09ICJsYW5nIiAmJiBpZChpbXBsb2RlKHBbMC4uPDJdLCIgIikpKSB7CisgICAgb2JqZWN0IGhvbWUgPSBsb2FkX29iamVjdChSQVVNTkFNRShvd25lciwwKSk7CisgICAgLy8gYmVzY2hyZWliZSA8aGF1cz4gbGFuZworICAgIGhvbWUtPmJlc2NocmVpYmVuKCJoYXVzIGxhbmciLCBBVVNTRU4pOworICAgIHJldHVybiAxOworICB9CisgIC8vIEVpbmdhYmUgU3ludGF4IG5pY2h0IHBhc3NlbmQgPT4gbm90aWZ5X2ZhaWwgdm9uIG9iZW4KKyAgcmV0dXJuIDA7Cit9CisKKy8vIEFrdGlvbiBIYXVzIEFlbmRlcm4KK3N0YXRpYyBpbnQKK2FlbmRlcm4oc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nICpwLCAqZHM7CisKKyAgLy8gRGFyZiBkZXIgU3BpZWxlciBkYXMsIGQuaC4gaXN0IGRhcyBzZWluIEhhdXM/CisgIGlmICghdHBfb3duZXJjaGVjaygpKQorICAgIHJldHVybiAwOworCisgIG5vdGlmeV9mYWlsKCAiSGllciBkcmF1c3NlbiBmdW5rdGlvbmllcnQgbnVyICdhZW5kZXJlIDxoYXVzPiBsYW5nJyFcbiIpOworICAvLyB6dSB3ZW5pZyBFaW5nYWJlIHp1bSBQYXJzZW4KKyAgaWYgKCFzdHIgfHwgc3RyID09ICIiKQorICAgIHJldHVybiAwOworCisgIHAgPSBvbGRfZXhwbG9kZShzdHIsIiAiKTsKKworICBpZiAocFs8MV0gPT0gImxhbmciICYmIGlkKGltcGxvZGUocFswLi48Ml0sIiAiKSkpIHsKKyAgICBvYmplY3QgaG9tZSA9IGxvYWRfb2JqZWN0KFJBVU1OQU1FKG93bmVyLDApKTsKKyAgICAvLyBhZW5kZXJlIDxoYXVzPiBsYW5nCisgICAgaG9tZS0+YWVuZGVybigiaGF1cyBsYW5nIiwgQVVTU0VOKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICAvLyBFaW5nYWJlIFN5bnRheCBuaWNodCBwYXNzZW5kID0+IG5vdGlmeV9mYWlsIHZvbiBvYmVuCisgIHJldHVybiAwOyAKK30KKworLy8gaW5wdXRfdG8genUgYmVzY2hyZWliZSAoaGF1cyl0dWVyCitzdGF0aWMgdm9pZCBkb29yRGVzYyhzdHJpbmcgc3RyKQoreworICBpZiAoIXN0cikKKyAgICBzdHIgPSAiIjsKKyAgaWYgKHNpemVvZihzdHIpKQorICAgIHN0ciArPSAiXG4iOworCisgIFNldChIX0RPT1IsIHN0cik7CisgIFNhdmUoKTsKKworICBpZiAoc3RyID09ICIiKQorICAgIHdyaXRlKCJPSywgSGF1c3R1ZXIgd3VyZGUgZ2Vsb2VzY2h0LlxuIik7CisgIGVsc2UKKyAgICB3cml0ZSgiT0ssIEJlc2NocmVpYnVuZyBkZXIgSGF1c3R1ZXIgd3VyZGUgZ2VzZXR6dC5cbiIpOworfQorCisvLyBpbnB1dF90byB6dSBiZXNjaHJlaWJlIHR1ZXJ6dXN0YW5kCitzdGF0aWMgdm9pZCBkb29yTERlc2Moc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nICpzOworCisgIGlmICghc3RyIHx8IHNpemVvZihzPW9sZF9leHBsb2RlKHN0ciwgIiwiKSkhPTMpIHsKKyAgICB3cml0ZSgiQUJCUlVDSCFcbk5pY2h0cyBnZWFlbmRlcnQhXG4iKTsKKyAgICByZXR1cm47CisgIH0KKyAgU2V0KEhfRE9PUkxTVEFULCAoeyBzWzBdLCBzWzFdLCAwLCBzWzJdIH0pKTsKKyAgcHJpbnRmKCJPSywgVHVlcnp1c3RhZW5kZSBzZWhlbiB3aWUgZm9sZ3QgYXVzOlxuJyVzJywgJyVzJywgJyVzJy5cbiIsCisJIHNbMF0sIHNbMV0sIHNbMl0pOworICBTYXZlKCk7Cit9CisKK2ludCBTbWFydExvZyhzdHJpbmcgb2ZpbGUsIHN0cmluZyB0eXAsIHN0cmluZyBtc2csIHN0cmluZyBkYXRlKQoreworICBvYmplY3QgaG9tZTsKKyAgc3RyaW5nIGZvbywgYmFyOworICAKKyAgc3RyaW5nIGhuPVJBVU1OQU1FKG93bmVyLDApOworCisgIHdyaXRlX2ZpbGUoUkVQRklMRShvd25lciksIHNwcmludGYoIiVzIHZvbiAlcyB2b3IgZGVtIEhhdXMgKCVzKTpcbiVzXG4iLAorCQkJCSAgICAgdHlwLAorCQkJCSAgICAgY2FwaXRhbGl6ZShnZXR1aWQodGhpc19wbGF5ZXIoKSkpLAorCQkJCSAgICAgZGF0ZSwKKwkJCQkgICAgIGJyZWFrX3N0cmluZyhtc2csNzgpKSk7CisKKyAgaWYgKElTX0xFQVJORVIob3duZXIpKSB7CisgICAgbG9nX2ZpbGUoInJlcG9ydC8iK293bmVyKyIucmVwIiwKKwkgICAgIHNwcmludGYoIk1FTERVTkcgdm9uICVzIGltIFNlaGVyaGF1cywgdm9yIGRlbSBIYXVzICglcyk6XG4iCisJCSAgICAgKyJCaXR0ZSB6dXIgS2VubnRuaXMgbmVobWVuISAoTWl0IGRlbSBCZWZlaGwgJ21lbGR1bmdlbicpICAtV2FyZ29uXG4iLAorCQkgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHRoaXNfcGxheWVyKCkpKSwKKwkJICAgICBkYXRlKSk7CisgIH0KKworICBob21lID0gbG9hZF9vYmplY3QoaG4pOworICBob21lLT5TZXQoSF9SRVBPUlQsIGhvbWUtPlF1ZXJ5KEhfUkVQT1JUKSsxKTsKKyAgaG9tZS0+U2F2ZSgpOworCisgIHJldHVybiAxOworfQorCisKZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9oYXVzLmggYi9kL3NlaGVyL2hhZXVzZXIvaGF1cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3Mzk1NmUKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvaGF1cy5oCkBAIC0wLDAgKzEsMTU2IEBACisvLyBoYXVzLmggLS0gRGVmaW5pdGlvbmVuIGZ1ZXIgZGllIFNlaGVyaGFldXNlcgorLy8KKy8vICBHcnVuZG9iamVrdCAoYykgMTk5NCBCb2luZ0BNb3JnZW5HcmF1ZW4KKy8vICBBYnNjaGxpZXNzZW4gdW5kIFJhdXN3ZXJmZW4gdm9uIEpvZgorLy8gIEZ1ZXIgQWVuZGVydW5nZW4gYWIgZGVtIDA2LjEwLjk0IHZlcmFudHdvcnRsaWNoOiBXYXJnb24KKy8vCisvLyAkSWQ6IGhhdXMuaCx2IDEuMiAyMDAzLzA1LzAzIDEzOjA5OjA1IG11ZCBFeHAgJAorLy8KKyNpZm5kZWYgX19IQVVTX0hfXworI2RlZmluZSBfX0hBVVNfSF9fCisKKy8vICNkZWZpbmUgREVCVUcoeCkJaWYgKGZpbmRfcGxheWVyKCJ2YW5pb24iKSkgdGVsbF9vYmplY3QoZmluZF9wbGF5ZXIoInZhbmlvbiIpLHgpOworLy8jZGVmaW5lIEhERUJVRyh4KSBpZihmaW5kX3BsYXllcigidmFuaW9uIikpIFwKKy8vCSAgICAgICAgICAgICAgdGVsbF9vYmplY3QoZmluZF9wbGF5ZXIoInZhbmlvbiIpLGJyZWFrX3N0cmluZygoeCksNzgsIkhEQkc6ICIsMSkpCisjZGVmaW5lIEhERUJVRyh4KQorCisvLyBNYWludGFpbmVyIHdpcmQgdS5hLiBiZW51dHp0LCB1bSBkaWUgYWNjZXNzX3JpZ2h0cyB6dSByZWdlbG4KKyNkZWZpbmUgTUFJTlRBSU5FUiAoeyJ2YW5pb24ifSkKKyNkZWZpbmUgSVNfTUFJTlRBSU5FUih4KSAobWVtYmVyKE1BSU5UQUlORVIsIGdldHVpZCh4KSkhPS0xKQorCisvKioqIFBmYWRlICoqKi8KKyNkZWZpbmUgSEFFVVNFUlBGQUQgICAgICIvZC9zZWhlci9oYWV1c2VyLyIKKyNkZWZpbmUgSEFVU1NBVkVQQVRICUhBRVVTRVJQRkFEKyJzYXZlLyIKKyNkZWZpbmUgU1BFQ0lBTFBBVEgJSEFFVVNFUlBGQUQrInNwZWNpYWwvIgorI2RlZmluZSBWRVJXQUxURVIJKEhBRVVTRVJQRkFEKyJoYXVzdmVyd2FsdGVyIikKKyNkZWZpbmUgSEFVUwkJSEFFVVNFUlBGQUQrImhhdXMiCisjZGVmaW5lIFJBVU0JCUhBRVVTRVJQRkFEKyJyYXVtIgorI2RlZmluZSBTQVZFRklMRQlIQVVTU0FWRVBBVEgrImhhZXVzZXIiCisjZGVmaW5lIEhBVVNOQU1FKHgpCShIQUVVU0VSUEZBRCt4KyJoYXVzIikKKyNkZWZpbmUgUkFVTU5BTUUoeCxuKQkoSEFFVVNFUlBGQUQreCsicmF1bSIrdG9fc3RyaW5nKG4pKQorI2RlZmluZSBSRVBGSUxFKHgpCShIQUVVU0VSUEZBRCsicmVwLyIreCsiLnJlcCIpCisjZGVmaW5lIEhMT0coZix4KSB3cml0ZV9maWxlKEhBRVVTRVJQRkFEKyJsb2cvIisoZiksIGR0aW1lKHRpbWUoKSkrIiAtICIrKHgpKQorCisvKiBQQVRIIGJpdHRlIG5pY2h0IG1laHIgYmVudXR6ZW4hCisgKiBEaWVzZXIgI2RlZmluZSBleGlzdGllcnQgbnVyIG5vY2ggYXVzIEtvbXBhdGliaWxpdGFldHNncnVlbmRlbi4KKyAqLworI2lmbmRlZiBQQVRICisjZGVmaW5lIFBBVEgJCUhBRVVTRVJQRkFECisjZW5kaWYKKworLyoqKiBNb2R1bGUgKioqLworI2RlZmluZSBVU0VSQ01EIEhBRVVTRVJQRkFEKyJtb2R1bGVzL3VzZXJjbWQiCisjZGVmaW5lIExPU0EJSEFFVVNFUlBGQUQrIm1vZHVsZXMvbG9zYSIKKyNkZWZpbmUgSEFVU1RVRVIgSEFFVVNFUlBGQUQrIm1vZHVsZXMvaGF1c3R1ZXIiCisKKy8qKiogQmF1c3BhcnZlcnRyYWcgdW5kIFJhdGVuYmxvY2sgKioqLworI2RlZmluZSBTVU1NRV9MIDMwKlJBVEVOSE9FSEUJICAvKiBTb3ZpZWwga29zdGV0IGRhcyBndXRlIFN0dWVjayAobGFuZ3NhbSkgKi8KKyNkZWZpbmUgU1VNTUVfUyAyNSpSQVRFTkhPRUhFCSAgLyogVW5kIHNvdmllbCBiZWkgZGVyIHNjaG5lbGxlbiBWYXJpYW50ZSAqLworI2RlZmluZSBSQVRFTkhPRUhFIDgwMDAwICAvKiBFaW56YWhsYmFyIHBlciBSYXRlbmJsb2NrICovCisjZGVmaW5lIE1BWF9USU1FIDcyMDAJICAvKiBMYXVmemVpdCBkZXIgUmF0ZW46IDQgU3R1bmRlbiA9IDcyMDAgaGVhcnRfYmVhdHMgKi8KKyNkZWZpbmUgV0FSTl9USU1FIDQ1MAkgIC8qIEFic3RhbmQgendpc2NoZW4gZGVuIFdhcm51bmdlbjogMTUgTWludXRlbiAqLworCisjZGVmaW5lIFZfTU9ORVkgMCAgIC8vIERhcyBzY2hvbiBlaW5nZXphaGx0ZSBHZWxkCisjZGVmaW5lIFZfRExJTkUgMSAgIC8vIGRpZSBEZWFkbGluZQorI2RlZmluZSBWX1dUSU1FIDIgICAvLyBaZWl0IGJpcyB6dXIgbmFlY2hzdGVuIEVyaW5uZXJ1bmcKKyNkZWZpbmUgVl9GTEFHUyAzICAgLy8gRGl2ZXJzZSBGbGFncworCisjZGVmaW5lIFZfU0lHTkVEIDEgIC8vIFZlcnRyYWcgc2Nob24gdW50ZXJzY2hyaWViZW4KKyNkZWZpbmUgVl9GQVNUCSAyICAvLyBTY2huZWxsZSBWYXJpYW50ZQorI2RlZmluZSBWX0NPTVBMICA0ICAvLyBWZXJ0cmFnIGVyZnVlbGx0CisjZGVmaW5lIFZfUkFVTQkgOCAgLy8gQXVzYmF1dmVydHJhZworI2RlZmluZSBWX0VQCTE2ICAvLyBFUC1WZXJ0cmFnCisKKyNkZWZpbmUgQl9GQVNUCSAxICAvLyBCbG9jayBnZWhvZXJ0IHp1ciBzY2h3ZXJlbiBWYXJpYW50ZQorI2RlZmluZSBCX0VYVEVORCAyICAvLyBTdHJhZnplaXQgbGFldWZ0CisjZGVmaW5lIEJfQUNUSVZFIDQgIC8vIFNoYWRvdyBsYWRlbgorI2RlZmluZSBCX1NIQURPVyA4ICAvLyBTaGFkb3cgbGFldWZ0Li4uCisjZGVmaW5lIEJfRVAJMTYgIC8vIEVQLVZlcnRyYWcKKworLyoqKiBUdWVyc3RhdHVzICoqKi8KKyNkZWZpbmUgRF9DTE9TRUQgMQorI2RlZmluZSBEX0xPQ0tFRCAyCisKKy8qKiogQmVzY2hyZWlidW5nc2ZsYWdzICoqKi8KKyNkZWZpbmUgQVVTU0VOCTEKKyNkZWZpbmUgS1VSWgkyCisjZGVmaW5lIExBTkcJNAorI2RlZmluZSBERVRBSUwJOAorI2RlZmluZSBSREVUQUlMIDE2CisjZGVmaW5lIEJFRkVITAkzMiAgLy8gTnVyIGFlbmRlcm4KKyNkZWZpbmUgUkVQT1JUCTY0ICAvLyBOdXIgYWVuZGVybgorCisvKioqIEZsYWdzIGZ1ZXIgSGF1c1Byb3AoKSAqKiovCisjZGVmaW5lIEhQX0VOVgkgICAgMCAvLyBOYW1lIGRlcyBSYXVtcywgaW4gZGVtIGRhcyBIYXVzIHN0ZWh0IChzdHJpbmcpCisjZGVmaW5lIEhQX1JPT01TICAgIDEgLy8gQW56YWhsIGRlciBSYWV1bWUsIGRpZSBkYXMgSGF1cyBiZXNpdHp0IChpbnQpCisjZGVmaW5lIEhQX0FMTE9XRUQgIDIgLy8gV2VyIGhhdCBTb25kZXJiZWZ1Z25pc3NlIGltIEhhdXM/IChzdHJpbmcgKikKKworLyoqKiBWZXJtaXNjaHRlcyAqKiovCisjZGVmaW5lIEhfQ0hFU1QgImhfY2hlc3QiICAgICAgICAgLy8gV2VubiBnZXNldHp0LCBzdGVodCBpbiBkaWVzZW0gUmF1bSBkaWUgVHJ1aGUKKyNkZWZpbmUgVFJVSEUgIlx0XHJ1aGUiICAgICAgICAgICAvLyBVbmQgZGllc2UgSUQgaGF0IGRpZSBUcnVoZSBpbiBqZWRlbSBGYWxsLgorI2RlZmluZSBIX0NPTU1BTkRTICJoX2NvbW1hbmRzIiAgIC8vIEVudGhhZWx0IG1hcHBpbmcgbWl0IEJlZmVobGVuLgorI2RlZmluZSBIX0RPT1IgImhfZG9vciIgICAgICAgICAgIC8vIEVudGhhZWx0IGRpZSBCZXNjaHJlaWJ1bmcgZGVyIFR1ZXIuCisjZGVmaW5lIEhfRE9PUlNUQVQgImhfZG9vcnN0YXQiICAgLy8gRW50aGFlbHQgZGVuIFp1c3RhbmQgZGVyIEhhdXN0dWVyLgorI2RlZmluZSBIX0RPT1JMU1RBVCAiaF9kb29ybHN0YXQiIC8vIFR1ZXJ6dXN0YW5kIGFscyBTdHJpbmdhcnJheS4KKyNkZWZpbmUgSF9SRVBPUlQgImhfcmVwb3J0IiAgICAgICAvLyBJbmZvIHVlYmVyIHR5cG8vYnVnL2lkZWUgaW0gSGF1cworI2RlZmluZSBIX1NQRUNJQUwgImhfc3BlY2lhbCIgICAgIC8vIEJlc29uZGVyaGVpdGVuIGltIEhhdXMKKyNkZWZpbmUgSF9GVVJOSVRVUkUgImhfZnVybml0dXJlIiAvLyBSZWJvb3RmZXN0ZSBTZWhlcm1vZWJlbAorCisvKioqIFR5cGVuIGZ1ZXIgSF9TUEVDSUFMICoqKi8KKyNkZWZpbmUgSFNfSVRFTSAxICAvLyBlaW4gYmVzdGltbXRlcyBPYmpla3QgKHBlciBBZGRJdGVtKCkpCisjZGVmaW5lIEhTX0VYSVQgMiAgLy8gZWluIEF1c2dhbmcgKHBlciBBZGRFeGl0KCkpCisKKy8qKiogRWluc3RlbGx1bmdlbiBmdWVyIEZ1cm5pdHVyZSAqKiovCisjZGVmaW5lIE1BWF9GVVJOSVRVUkVfUEVSX1JPT00gNQorCisvKioqIExhc3QgYnV0IG5vdCBsZWFzdC4uLiAqKiovCisjZGVmaW5lIFVQX0FSR1MobykgKChvKS0+X3VucGFyc2VkX2FyZ3MoMSkpCisKKyNlbmRpZgkvLyBfX0hBVVNfSF9fCisKKyNpZmRlZiBORUVEX1BST1RPVFlQRVMKKworI2lmbmRlZiBfX0hBVVNfSF9QUk9UT1NfXworI2RlZmluZSBfX0hBVVNfSF9QUk9UT1NfXworCit2YXJhcmdzIHZvaWQgU2F2ZShpbnQgY3J1bmNoZWQpOwordm9pZCBMb2FkKCk7Cit2YXJhcmdzIHN0cmluZyBRdWVyeU93bmVyKGludCB3aXRoTnIpOwordmFyYXJncyBzdHJpbmcgU2V0T3duZXIoc3RyaW5nIG8sIGludCBucik7Citwcm90ZWN0ZWQgdm9pZCBBZGRFeGl0Tm9DaGVjayhtaXhlZCBjbWQsIG1peGVkIGRlc3QpOwordm9pZCBSZW1vdmVFeGl0Tm9DaGVjayhtaXhlZCBjbWQpOworCisjZW5kaWYJLyogX19IQVVTX0hfUFJPVE9TX18gKi8KKyNlbmRpZgkvKiBORUVEX1BST1RPVFlQRVMgKi8KKworLy8gJExvZzogaGF1cy5oLHYgJAorLy8gUmV2aXNpb24gMS4yICAyMDAzLzA1LzAzIDEzOjA5OjA1ICBtdWQKKy8vIFBBVEggaW4gSEFFVVNFUlBGQUQgdW1iZW5hbm50CisvLworLy8gUmV2aXNpb24gMS4xLjEuMSAgMjAwMC8wOC8yMCAyMDoyMjo0MiAgbXVkCisvLyBJbnMgQ1ZTIGVpbmdlY2hlY2t0CisvLworLy8gUmV2aXNpb24gMi43ICAxOTk1LzA2LzI4ICAwODo1ODowNyAgV2FyZ29uCisvLyBIX1JFUE9SVCBmdWVyIFNwaWVsZXJydWVja21lbGR1bmdlbi4KKy8vIEZsYWdzIEJFRkVITCB1bmQgUkVQT1JUIGZ1ZXIgQWVuZGVydW5nZW4uCisvLworLy8gUmV2aXNpb24gMi42ICAxOTk1LzA0LzIxICAwODo1Mzo1NyAgV2FyZ29uCisvLyAjZGVmaW5lcyBmdWVyIE1vZHVsYXJpc2llcnVuZyB1bmQgbmV1ZSBUdWVyZmVhdHVyZXMuCisvLworLy8gUmV2aXNpb24gMi41ICAxOTk1LzAyLzI3ICAyMDo1NDo0OSAgV2FyZ29uCisvLyBVUF9BUkdTIGFuZ2VwYXNzdCwgZGEgUGFyc2VyIGpldHp0IGF1Y2ggZnVlciBTcGllbGVyIGFrdGl2LgorLy8KKy8vIFJldmlzaW9uIDIuMyAgMTk5NS8wMi8xNSAgMTE6MTU6MDggIFdhcmdvbgorLy8gSF9ET09SOiBFbnRoYWVsdCBkaWUgQmVzY2hyZWlidW5nIGRlciBIYXVzdHVlci4KKy8vCisvLyBSZXZpc2lvbiAyLjIgIDE5OTUvMDIvMDQgIDE3OjE4OjM5ICBXYXJnb24KKy8vIEhfQ09NTUFORFM6IGVudGhhZWx0IG1hcHBpbmcgbWl0IHNlbGJzdGRlZmluaWVydGVuIEhhdXNiZWZlaGxlbi4KKy8vIENIRVNUIGluIEhfQ0hFU1QgdW1iZW5hbm50LgorLy8KKy8vIFJldmlzaW9uIDIuMSAgMTk5NS8wMi8wNCAgMTU6MDY6MTggIFdhcmdvbgorLy8gRGVmaW5pdGlvbiB2b24gQ0hFU1QgYWxzIFByb3BlcnR5IGZ1ZXIgZGVuIFN0YW5kb3J0IGRlciBUcnVoZSB1bmQKKy8vIFRSVUhFIGFscyBmZXN0ZSBJRCBkZXIgVHJ1aGUuCisvLworLy8gUmV2aXNpb24gMi4wICAxOTk1LzAyLzAxICAyMDo0NToxOCAgV2FyZ29uCisvLyBVUF9BUkdTLU1ha3JvLCBsaWVmZXJ0IGZ1ZXIgQUxMRSBkYXMgRXJnZWJuaXMgdm9uIF91bnBhcnNlZF9hcmdzKDEpCisvLwpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL2hhdXN2ZXJ3YWx0ZXIuYyBiL2Qvc2VoZXIvaGFldXNlci9oYXVzdmVyd2FsdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY2NDNkMQotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci9oYXVzdmVyd2FsdGVyLmMKQEAgLTAsMCArMSw2MjEgQEAKKy8qCisgKiAgaGF1c3ZlcndhbHRlci5jIC0tIFZlcndhbHR1bmcgZGVyIFNlaGVyaGFldXNlcgorICoKKyAqICBEYXMgR3J1bmRvYmpla3Qgc3RhbW10IHZvbiBCb2luZywgRm9ydGZ1ZWhydW5nIGVyZm9sZ3RlIGR1cmNoIEpvZi4KKyAqICBMZXR6dGUgQWVuZGVydW5nZW4gdmVyc2NodWxkZXQgZHVyY2ggV2FyZ29uIDspCisgKgorICogJERhdGU6IDE5OTcvMDkvMDkgMTc6MTk6MjkgJAorICogJFJldmlzaW9uOiAyLjMgJAorICogJExvZzogaGF1c3ZlcndhbHRlci5jLHYgJAorICogUmV2aXNpb24gMi4zICAxOTk3LzA5LzA5IDE3OjE5OjI5ICBXYXJnb24KKyAqIEJ1Z2ZpeCBiZWltIFZlcmxlZ2VuL0xvZXNjaGVuIGVpbmVzIEhhdXNlcworICoKKyAqIFJldmlzaW9uIDIuMiAgMTk5Ni8wMi8yMSAgMTg6MTU6MDIgIFdhcmdvbgorICogKioqIGVtcHR5IGxvZyBtZXNzYWdlICoqKgorICoKKyAqIFJldmlzaW9uIDIuMCAgMTk5NC8xMS8xNyAgMTM6NDg6MjcgIFdhcmdvbgorICogTW9kaWZpa2F0aW9uZW4gZnVlciBkaWUgVHJlbm51bmcgSGF1cy9SYXVtLgorICoKKyAqIFJldmlzaW9uIDEuNSAgMTk5NC8xMC8yNCAgMDg6MjE6NTUgIFdhcmdvbgorICogUGFyYW1ldGVyIGZ1ZXIgTmV1ZXNIYXVzIGdlYWVuZGVydC4KKyAqIEZ1ZXIgU2ljaGVyaGVpdHNjaGVjayBzZWN1cmUoKSBlaW5nZWJhdXQuCisgKiBWZXJsZWdlSGF1cygpIGVpbmdlYmF1dCwgZmFsbHMgZWluIEhhdXMgbWFsIHZlcmxlZ3Qgd2VyZGVuIG11c3MuCisgKgorICogUmV2aXNpb24gMS40ICAxOTk0LzEwLzEwICAyMTo1MDo1OSAgV2FyZ29uCisgKiBOZXVlc0hhdXMoKSB1bmQgTG9lc2NoZUhhdXMoKSBiZWRpZW5lbiBudW4gYXVjaCBkZW4gT0JKRUNURC4KKyAqIFBydWVmZUhhdXMoKSB3dXJkZSBkYW1pdCBoaW5mYWVsbGlnLgorICoKKyAqIFJldmlzaW9uIDEuMyAgMTk5NC8xMC8wOSAgMjA6MTE6NDggIFdhcmdvbgorICogQmVzY2hyZWlidW5nIGRlciBIYWV1c2VyIHZvbSBIYXVzdmVyd2FsdGVyIGFiZ2Vrb3BwZWx0IQorICogRGllIG1lZ2FtYXAgZW50aGFlbHQgbnVyIG5vY2ggQmVzaXR6ZXIgdW5kIFN0YW5kb3J0IGRlcyBIYXVzZXMuCisgKiBJbmZvbGdlZGVzc2VuIHNpbmQgU2F2ZSgpIHVuZCBidWlsZCgpIHJhdXNnZWZsb2dlbi4uLgorICoKKyAqIFJldmlzaW9uIDEuMiAgMTk5NC8xMC8wNyAgMjI6MTk6NDggIFdhcmdvbgorICogQVVGQkFVIERFUyBNQVBQSU5HUyBHRUFFTkRFUlQhIERlciBGaWxlbmFtZSBkZXMgUmF1bWVzLCBpbiBkZW0gZGFzCisgKiBIYXVzIHN0ZWh0LCBzdGVodCBqZXR6dCBhbHMgZXJzdGVyIEVpbnRyYWcgaW0gTWFwcGluZyEgQWxsZSBhbmRlcmVuCisgKiBFaW50cmFlZ2Ugc2luZCB1bSAxIHdlaXRlcmdld2FuZGVydC4KKyAqIEJlaW0gTGFkZW4gZGVzIFZlcndhbHRlcnMgd2VyZGVuIG5pY2h0IG1laHIgYWxsZSBTZWhlcmhhZXVzZXIgZ2UtCisgKiBsYWRlbi4gRWluIEhhdXMgd2lyZCBlcnN0IGdlbGFkZW4sIHdlbm4gZGVyIFJhdW0sIGluIGRlbSBlcyBzdGVodCwKKyAqIGdlbGFkZW4gd2lyZCAoUHJ1ZWZlSGF1cygpLCBzaWVoZSBhdWNoIHN0ZC9yb29tOjpjcmVhdGUoKSkuCisgKgorICogUmV2aXNpb24gMS4xICAxOTk0LzEwLzA3ICAxNDoxOTozNiAgV2FyZ29uCisgKiBJbml0aWFsIHJldmlzaW9uCisgKgorICovCisjcHJhZ21hIHN0cmljdF90eXBlcworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxyb29tcy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgImhhdXMuaCIKKworI2RlZmluZSBIX01BWF9ST09NUyA5CisKK21hcHBpbmcgbWVnYW1hcDsKKworLy8gSGF1cyBmdWVyIG93bmVyIGltIFJhdW0gZW52IGVyc3RlbGxlbi4gV2lyZCBpLmQuUiBudXIgdm9tIEluc3RhbnRoYXVzIGdlbWFjaHQuCit2b2lkIE5ldWVzSGF1cyhzdHJpbmcgb3duZXIsIG9iamVjdCBlbnYpOworCisvLyBIYXVzIHZvbiBvd25lciBsb2VzY2hlbiAoc2FtdCBTYXZlZmlsZSEpLiBEaWVzZXIgVm9yZ2FuZyBpc3QgdW53aWRlcnJ1ZmxpY2ghCitpbnQgTG9lc2NoZUhhdXMoc3RyaW5nIG93bmVyKTsKKworLy8gTG9lc2NodCBkZW4gbGV0enRlbiBoaW56dWdlZnVlZ3RlbiBSYXVtIGltIFNlaGVyaGF1cyB2b24gJ293bmVyJy4KK3ZvaWQgTG9lc2NoZVJhdW0oc3RyaW5nIG93bmVyKTsKKworLy8gRnVlZ3QgZWluZW4gUmF1bSB6dW0gU2VoZXJoYXVzIHZvbiAnb3duZXInIGhpbnp1Lgordm9pZCBOZXVlclJhdW0oc3RyaW5nIG93bmVyKTsKKworLy8gSGF1cyB2b24gb3duZXIgdm9tIFJhdW0gJ3ZvbicgaW4gZGVuIFJhdW0gJ25hY2gnIHZlcnNjaGllYmVuLgoraW50IFZlcmxlZ2VIYXVzKHN0cmluZyBvd25lciwgc3RyaW5nIHZvbiwgc3RyaW5nIG5hY2gpOworCisvLyBLYW5uIGluIG9iIGVpbiBIYXVzIGdlYmF1dCB3ZXJkZW4/IDA6IEphLCBzb25zdCBGZWhsZXIhCitpbnQgVW5iZWJhdWJhcihvYmplY3Qgb2IpOworCisvLyBKZW1hbmRlbSBpbSBIYXVzIFp1c2F0enJlY2h0ZSBlaW5yYWV1bWVuL2VudHppZWhlbgorc3RyaW5nICpFcmxhdWJlKHN0cmluZyBvd25lciwgc3RyaW5nICp3ZXIpOworc3RyaW5nICpWZXJiaWV0ZShzdHJpbmcgb3duZXIsIHN0cmluZyAqd2VyKTsKKworLy8gRWlnZW5zY2hhZnRlbiBhdXMgZGVyIG1lZ2FtYXAgYWJmcmFnZW4KK21peGVkIEhhdXNQcm9wKHN0cmluZyBvd25lciwgaW50IHByb3ApOworCisvLyBQcm9wZXJ0eW1hcHBpbmcgZGVkdXBsaXppZXJlbgorbWl4ZWQgUENydW5jaChtYXBwaW5nIHByb3ApOworCisvLyBMYWRlIFNlaGVyaGF1cyB2b24gQmVzaXR6ZXIgJ293bmVyJworb2JqZWN0IF9MYWRlSGF1cyhzdHJpbmcgb3duZXIpOworCisvLyBMYWRlIGltIFNlaGVyaGF1cyB2b24gJ293bmVyJyBkZW4gUmF1bSBtaXQgZGVyIE51bW1lciAnbnVtJworb2JqZWN0IF9MYWRlUmF1bShzdHJpbmcgb3duZXIsIGludCBudW0pOworCisvLyByZXR1cm50IGRhcyBTZWhlcmhhdXMgdm9uIEJlc2l0emVyICdvd25lcicKK29iamVjdCBGaW5kZUhhdXMoc3RyaW5nIG93bmVyKTsKKwordm9pZCBjcmVhdGUoKQoreworICBpZiAoIXJlc3RvcmVfb2JqZWN0KFNBVkVGSUxFKSkKKyAgICBtZWdhbWFwID0gKFsgXSk7CisgIHNldGV1aWQoZ2V0dWlkKHRoaXNfb2JqZWN0KCkpKTsKK30KKworaW50IHF1ZXJ5X3ByZXZlbnRfc2hhZG93KG9iamVjdCBvYikKK3sKKyAgSExPRygiU0hBRE9XIixzcHJpbnRmKCAiJXMsIHZvbiAlTyBpbSBWZXJ3YWx0ZXIuXG4iLGR0aW1lKHRpbWUoKSlbNS4uXSwgb2IpKTsKKyAgcmV0dXJuIDE7Cit9CisKK3ByaXZhdGUgaW50CitzZWN1cmUoKQoreworICBpbnQgYXI7CisKKyAgaWYgKCF0aGlzX2ludGVyYWN0aXZlKCkpCisgICAgcmV0dXJuIDA7CisKKyAgLy8gZGFzIHRyYWdiYXJlIEluc3RhbnRoYXVzIHVuZCBkaWUgSGF1c2F1c2dhYmUgZHVlcmZlbjoKKyAgaWYgKChsb2FkX25hbWUocHJldmlvdXNfb2JqZWN0KCkpID09IFBBVEgrInRyYWdoYXVzIikgfHwKKyAgICAgIChsb2FkX25hbWUocHJldmlvdXNfb2JqZWN0KCkpID09IFBBVEgrInNiX2F1c2dhYmUiKSkgeworICAgIHJldHVybiAxOworICB9CisgIAorICBjYXRjaChhciA9IChpbnQpKFBBVEgrImFjY2Vzc19yaWdodHMiKS0+YWNjZXNzX3JpZ2h0cyhnZXRldWlkKHRoaXNfaW50ZXJhY3RpdmUoKSksICJoYXVzLmgiKSk7CisKKyAgLy8gRXJ6bWFnaWVyIHVuZCBhbGxlIG1pdCBTY2hyZWlicmVjaHRlbiBhdWYgaGF1cy5oIGR1ZXJmZW4KKyAgaWYgKCAodGhpc19pbnRlcmFjdGl2ZSgpID09IHRoaXNfcGxheWVyKCkpICYmCisgICAgICAoSVNfQVJDSCh0aGlzX2ludGVyYWN0aXZlKCkpIHx8IGFyICkgKQorICAgIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworLy8gZXJzZXR6dCBkYXMgSEFFVVNFUiBsb2dmaWxlIG1pdCBuZXVlciBTdGF0aXN0aWsKK3ByaXZhdGUgdm9pZAorZHVtcCgpCit7CisgIHN0cmluZyAqaW5kOworICBpbnQgaSwgaG51bSwgcm51bSA9IDA7CisKKyAgLy8gbG9lc2NoZSBsb2dmaWxlCisgIHJtKFBBVEgrIkhBRVVTRVIiKTsKKworICAvLyBiZXRyYWNodGUgYWxsZSBTZWhlcmhhZXVzZXIKKyAgaW5kID0gbV9pbmRpY2VzKG1lZ2FtYXApOworICBpZiAoaG51bT1zaXplb2YoaW5kKSkgeworICAgIHdyaXRlX2ZpbGUoUEFUSCsiSEFFVVNFUiIsIHNwcmludGYoIkVzIGdpYnQgJWQgU2VoZXJoYWV1c2VyOlxuIiwgaG51bSkpOworICAgIGluZCA9IHNvcnRfYXJyYXkoaW5kLCMnPik7IC8vJworICAgIC8vIGFsbGUgSGFldXNlciBzb3J0aWVydCBuYWNoIEJlc2l0emVybmFtZSBkdXJjaGdlaGVuOgorICAgIGZvcihpID0gMDsgaSA8IGhudW07ICsraSkgeworICAgICAgLy8gemFlaGxlIFJhZXVtZQorICAgICAgKytybnVtOyAvLyBIYXVwdHJhdW0KKyAgICAgIHJudW0gKz0gKG1lZ2FtYXBbaW5kW2ldLCBIUF9ST09NU10pOyAvLyBOZWJlbnJhZXVtZQorICAgICAgLy8gRWluZSBaZWlsZSBwcm8gSGF1czogQmVzaXR6ZXJuYW1lIChSYXVtYW56YWhsKSBTdGFuZG9ydC1QZmFkCisgICAgICB3cml0ZV9maWxlKFBBVEgrIkhBRVVTRVIiLAorICAgICAgICAgICAgICAgICBzcHJpbnRmKCAiJS0xM3MgKCVkKSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShpbmRbaV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtZWdhbWFwW2luZFtpXSxIUF9ST09NU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZ2FtYXBbaW5kW2ldLEhQX0VOVl0gKSApOworICAgIH0KKyAgICB3cml0ZV9maWxlKFBBVEgrIkhBRVVTRVIiLCBzcHJpbnRmKCJFcyBnaWJ0IGluc2dlc2FtdCAlZCBSYWV1bWUuXG4iLCBybnVtKSk7CisgIH0KKyAgZWxzZQorICAgIHdyaXRlX2ZpbGUoUEFUSCsiSEFFVVNFUiIsICJLRUlORSBIQUVVU0VSIVxuIik7Cit9CisKKy8vIEdlZ2VucmljaHR1bmdlbgorI2RlZmluZSBYX0VYSVQgKFsib2JlbiI6InVudGVuIiwgInVudGVuIjoib2JlbiIsXAorCQkgIndlc3RlbiI6Im9zdGVuIiwgIm9zdGVuIjoid2VzdGVuIixcCisJCSAic3VlZGVuIjoibm9yZGVuIiwgIm5vcmRlbiI6InN1ZWRlbiIsXAorCQkgIm5vcmRvc3RlbiI6InN1ZWR3ZXN0ZW4iLCAic3VlZHdlc3RlbiI6Im5vcmRvc3RlbiIsXAorCQkgIm5vcmR3ZXN0ZW4iOiJzdWVkb3N0ZW4iLCAic3VlZG9zdGVuIjoibm9yZHdlc3RlbiIgXSkKKworLy8gZnVlciBqZWRlbiBSYXVtIGltIEhhdXMgW21heCAuLiAwXSBiZXRyYWNodGUgYWxsZSBBdXNnYWVuZ2U7CisvLyB6YWVobGUgYWxsZSBBdXNnYWVuZ2UgYXVzc2VyIGRlciBIYXVzdHVlciBpbiBSYWV1bWUsCisvLyBkaWUgbmljaHQgenUgZGllc2VtIFNlaGVyaGF1cyBnZWhvZXJlbgorLy8gKGRpZXMgc29sbHRlbiBVZWJlcmdhZW5nZSB6dSBhbmRlcmVuIFNlaGVyaGFldXNlcm4gc2VpbikKKy8vIGZhbGxzIHJlbSAhPSAwIGxvZXNjaGUgZGllIEdlZ2VucmljaHR1bmcgenUgZGllc2VuIEF1c2dhZW5nZW4sCisvLyBkLmguIGthcHBlIGFsbGUgVWViZXJnYWVuZ2UgYXVzIGFuZGVyZW4gU2VoZXJoYWV1c2VybiBpbiBkaWVzZXMKK3ByaXZhdGUgaW50CitjaGVja19leGl0cyhzdHJpbmcgb3duZXIsIGludCBtYXgsIGludCByZW0pCit7CisgIGludCB4LCBuciwgYmFyOworICBzdHJpbmcgaG5hbWUsIGZvbzsKKyAgb2JqZWN0IGhlcmUsIHRoZXJlOworCisgIHggPSAwOworICBmb3IgKG5yID0gbWF4OyBuciA+PSAwOyAtLW5yKSB7CisgICAgLy8gYmV0cmFjaHRlIGplZGVuIFNlaGVyaGF1c3JhdW0gbWl0IGluZGV4IG1heCAuLiAwCisgICAgaG5hbWUgPSBSQVVNTkFNRShvd25lciwgbnIpOworCisgICAgaWYgKGNhdGNoKGhlcmUgPSBsb2FkX29iamVjdChobmFtZSk7cHVibGlzaCkpIHsKKyAgICAgIHByaW50ZigiZXJyb3IgbG9hZGluZyAlTyFcbiIsIGhuYW1lKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBmb3JlYWNoIChzdHJpbmcgZGlyLCBzdHJpbmcgcGF0aCA6IChtYXBwaW5nKShoZXJlLT5RdWVyeVByb3AoUF9FWElUUykpKSB7CisgICAgICAvLyBiZXRyYWNodGUgYWxsZSBBdXNnYWVuZ2UKKyAgICAgIGlmIChkaXIgPT0gInJhdXMiKSB7CisgICAgICAgIC8vIEhhdXN0dWVyIGF1cyBkZW0gSGF1cHRyYXVtIGRhcmYgbmF0dWVybGljaCByYXVzZnVlaHJlbgorICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmICgoc3NjYW5mKHBhdGgsIFBBVEgrIiVzcmF1bSVkIiwgZm9vLCBiYXIpICE9IDIpIHx8IChmb28gIT0gb3duZXIpKSB7CisgICAgICAgIC8vIFJhdW0gaW4gZGVuIGRlciBBdXNnYW5nIGZ1ZWhydCBpc3QgbmljaHQgaW4gZGllc2VtIFNlaGVyaGF1cworICAgICAgICArK3g7CisgICAgICAgIGlmIChyZW0pIHsKKyAgICAgICAgICBjYXRjaCh0aGVyZSA9IGxvYWRfb2JqZWN0KHBhdGgpO3B1Ymxpc2gpOworICAgICAgICAgIGlmICh0aGVyZSkgeworICAgICAgICAgICAgLy8gbG9lc2NoZSBkaWUgR2VnZW5yaWNodHVuZyB6dSBkZW0gQXVzZ2FuZworICAgICAgICAgICAgdGhlcmUtPlJlbW92ZUV4aXQoWF9FWElUW2Rpcl0pOworICAgICAgICAgICAgdGhlcmUtPlNhdmUoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHg7Cit9CisKKy8vIEhhdXMgZnVlciBvd25lciBpbSBSYXVtIGVudiBlcnN0ZWxsZW4uCisvLyBXaXJkIGkuZC5SIG51ciB2b20gSW5zdGFudGhhdXMgZ2VtYWNodC4KK3ZvaWQgTmV1ZXNIYXVzKHN0cmluZyBvd25lciwgb2JqZWN0IGVudikKK3sKKyAgb2JqZWN0IGg7CisKKyAgLy8ga2VpbmUgcGFzc2VuZGVuIFJlY2h0ZQorICBpZiAoIXNlY3VyZSgpKQorICAgIHJldHVybjsKKworICAvLyBuZXVlbiBFaW50cmFnIGltIFZlcndhbHRlci1NYXBwaW5nIGZ1ZXIgZGFzIEhhdXMgZXJzdGVsbGVuCisgIG1lZ2FtYXAgKz0gKFsgb3duZXIgOiBvYmplY3RfbmFtZShlbnYpOyAwOyAoe30pIF0pOworICAvLyBIYXVzIGFtIEJhdXBsYXR6IGxhZGVuLCBmYWxscyBtb2VnbGljaAorICBjYXRjaChoID0gbG9hZF9vYmplY3QoSEFVU05BTUUob3duZXIpKTtwdWJsaXNoKTsKKyAgaWYgKCFoKQorICAgIHJldHVybjsKKworICAvLyBIYXVzIFNwZWljaGVybiB1bmQgYWxzIFJhdW1hdXRvbG9hZGVyIGVpbnRyYWdlbgorICBoLT5TYXZlKCk7CisgIE9CSkVDVEQtPkFkZE9iamVjdChoLCBvYmplY3RfbmFtZShlbnYpKTsKKyAgLy8gQmF1cGxhdHogYXVmIG5ldmVyIGNsZWFuIHNldHplbiB1bmQgVmVyd2FsdGVyIGFic3BlaWNoZXJuCisgIGVudi0+U2V0UHJvcChQX05FVkVSX0NMRUFOLCAxKTsKKyAgc2F2ZV9vYmplY3QoU0FWRUZJTEUpOworCisgIC8vIEhhdXB0cmF1bSBkZXMgU2VoZXJoYXVzZXMgbGFkZW4KKyAgaCA9IGxvYWRfb2JqZWN0KFJBVU1OQU1FKG93bmVyLDApKTsKKyAgaC0+U2V0UHJvcChIX0NIRVNULDEpOworICAvLyBIYXVwdHJhdW0gc3BlaWNoZXJuCisgIGgtPlNhdmUoKTsKKyAgLy8gVHJ1aGUgbGFkZW4KKyAgaC0+TG9hZCgpOworICAvLyBTdGF0aXN0aWsgdWViZXIgYWxsZSBTZWhlcmhhZXVzZXIgZXJuZXVlcm4KKyAgZHVtcCgpOworfQorCisvLyBsb2VzY2h0IGRlbiBsZXR6dGVuIGhpbnp1ZnVlZ3RlbiBSYXVtIGltIFNlaGVyaGF1cyB2b24gJ293bmVyJwordm9pZCBMb2VzY2hlUmF1bShzdHJpbmcgb3duZXIpCit7CisgIG9iamVjdCByYXVtb2I7CisgIGludCBucjsKKworICAvLyBrZWluIHBhc3NlbmRlcyBTZWhlcmhhdXMgdmVyd2FsdGV0IG9kZXIga2VpbiBSZWNodCBkYXMgenUgdHVuCisgIGlmICghbWVtYmVyKG1lZ2FtYXAsIG93bmVyKSB8fCAhc2VjdXJlKCkpCisgICAgcmV0dXJuOworCisgIG5yID0gbWVnYW1hcFtvd25lciwgSFBfUk9PTVNdOworICAvLyBmYWxscyBkYXMgSGF1cyB1ZWJlcmhhdXB0IHp1c2FldHpsaWNoZSBSYWV1bWUgKG5lYmVuIEhhdXB0cmF1bSkgaGF0CisgIGlmIChuciA+IDAgKSB7CisgICAgLy8gZmFsbHMgZ2VsYWRlbiwgcmVtb3ZlIFJhdW0tT2JqZWt0CisgICAgcmF1bW9iID0gZmluZF9vYmplY3QoUkFVTU5BTUUob3duZXIsKG1lZ2FtYXBbb3duZXIsSFBfUk9PTVNdKSkpOyAgIAorICAgIGlmIChvYmplY3RwKHJhdW1vYikpCisgICAgICByYXVtb2ItPnJlbW92ZSgxKTsKKworICAgIC8vIGxvZXNjaGUgUmF1bSBhdXMgVmVyd2FsdGVyLU1hcHBpbmcgZHVyY2ggQW56YWhsIHVtIGVpbnMgZXJuaWVkcmlnZW4KKyAgICAtLW1lZ2FtYXBbb3duZXIsIEhQX1JPT01TXTsKKworICAgIC8vIHNhdmVmaWxlIG11c3MgcGVyIEhhbmQgZ2Vsb2VzY2h0IHdlcmRlbjoKKyAgICB0ZWxsX29iamVjdCh0aGlzX2ludGVyYWN0aXZlKCksCisgICAgICAgICAgICAgICAgYnJlYWtfc3RyaW5nKHNwcmludGYoIlZlcmdpc3MgbmljaHQsIGRhcyBTYXZlZmlsZSB6dSBsb2VzY2hlbiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbHNvOiAiK0hBVVNTQVZFUEFUSCsiJXMlZC5vXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyLCBuciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc4KSk7CisgICAgLy8gc3BlaWNoZXIgSGF1c3ZlcndhbHR1bmcgYWIgdW5kIGVybmV1ZXIgU3RhdGlzdGlrIHVlYmVyIGFsbGUgU2VoZXJoYWV1c2VyCisgICAgc2F2ZV9vYmplY3QoU0FWRUZJTEUpOworICAgIGR1bXAoKTsKKyAgfQorfQorCisvLyBGdWVndCBlaW5lbiBSYXVtIHp1bSBTZWhlcmhhdXMgdm9uICdvd25lcicgaGluenUuCit2b2lkIE5ldWVyUmF1bShzdHJpbmcgb3duZXIpCit7CisgIG9iamVjdCByYXVtb2I7CisKKyAgLy8ga2VpbiBwYXNzZW5kZXMgU2VoZXJoYXVzIHZlcndhbHRldCBvZGVyIGtlaW4gUmVjaHQgZGFzIHp1IHR1bgorICBpZiAoIW1lbWJlcihtZWdhbWFwLCBvd25lcikgfHwgIXNlY3VyZSgpKQorICAgIHJldHVybjsKKworICAvLyBpc3QgZGllIE1heGltYWxhbnphaGwgdm9uIFJhZXVtZW4gc2Nob24gZXJyZWljaHQ/CisgIGlmIChtZWdhbWFwW293bmVyLCBIUF9ST09NU10gPCBIX01BWF9ST09NUykKKyAgeworICAgIC8vIGVyaG9laGUgUmF1bXphZWhsZXIgaW4gVmVyd2FsdGVyLU1hcHBpbmcKKyAgICBtZWdhbWFwW293bmVyLCBIUF9ST09NU10rKzsKKyAgICAvLyBsYWRlIG5ldWVuIFJhdW0sIGZhbGxzIG1vZWdsaWNoCisgICAgY2F0Y2gocmF1bW9iID0gbG9hZF9vYmplY3QoKFJBVU1OQU1FKG93bmVyLChtZWdhbWFwW293bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUF9ST09NU10pKSkpO3B1Ymxpc2gpOworICAgIGlmKG9iamVjdHAocmF1bW9iKSkKKyAgICAgIC8vIHNwZWljaGVyIG5ldWVuIFJhdW0KKyAgICAgIHJhdW1vYi0+U2F2ZSgpOworCisgICAgLy8gc3BlaWNoZXIgVmVyd2FsdGVyLU1hcHBpbmcgdW5kIGVybmV1ZXIgU3RhdGlzdGlrIHVlYmVyIGFsbGUgU2VoZXJoYWV1c2VyCisgICAgc2F2ZV9vYmplY3QoU0FWRUZJTEUpOworICAgIGR1bXAoKTsKKyAgfQorfQorCisvLyBMYWRlIFNlaGVyaGF1cyB2b24gQmVzaXR6ZXIgJ293bmVyJworb2JqZWN0IF9MYWRlSGF1cyhzdHJpbmcgb3duZXIpCit7CisgIG9iamVjdCBoYXVzOworICBzdHJpbmcgbzsKKworICAvLyBlcyB3aXJkIGtlaW4gcGFzc2VuZGVzIFNlaGVyaGF1cyB2ZXJ3YWx0ZXQKKyAgaWYgKCFtZW1iZXIobWVnYW1hcCwgb3duZXIpKQorICAgIHJldHVybiAwOworCisgIC8vIEhhdXMgaXN0IGJlcmVpdHMgZ2VsYWRlbgorICBpZiAoaGF1cz1maW5kX29iamVjdChIQVVTTkFNRShvd25lcikpKQorICAgIHJldHVybiBoYXVzOworCisgIC8vIGxhZGUgQmF1cGxhdHoKKyAgbyA9IG1lZ2FtYXBbb3duZXJdOworICBpZiAoY2F0Y2gobG9hZF9vYmplY3Qobyk7cHVibGlzaCkpCisgIHsKKyAgICB3cml0ZV9maWxlKFBBVEgrImhhdXNlcnJvciIsIG8rIiBrb25udGUgbmljaHQgZ2VsYWRlbiB3ZXJkZW4uXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICAvLyBIYXVzIGlzdCBkdXJjaCBMYWRlbiBkZXMgQmF1cGxhdHplcyBudW4gZ2VsYWRlbgorICBpZiAoaGF1cyA9IGZpbmRfb2JqZWN0KEhBVVNOQU1FKG93bmVyKSkpCisgICAgcmV0dXJuIGhhdXM7CisKKyAgLy8gY2xvbmUgU3RhbmRhcmQtSGF1cywgc2V0emUgQmVzaXR6ZXIKKyAgaGF1cyA9IGNsb25lX29iamVjdChIQVVTKTsKKyAgaGF1cy0+bW92ZShvLCBNX05PQ0hFQ0spOworICBoYXVzLT5TZXRPd25lcihvd25lciwgZmluZF9vYmplY3QoUkFVTU5BTUUob3duZXIsMCkpKTsKKyAgLy8gbGFkZSBpbmRpdmlkdWFsaXNpZXJ0ZXMgSGF1cyBhdXMgZGVtIFNhdmVmaWxlCisgIGhhdXMtPkxvYWQoKTsKKworICByZXR1cm4gaGF1czsKK30KKworLy8gTGFkZSBpbSBTZWhlcmhhdXMgdm9uICdvd25lcicgZGVuIFJhdW0gbWl0IGRlciBOdW1tZXIgJ251bScKK29iamVjdCBfTGFkZVJhdW0oc3RyaW5nIG93bmVyLCBpbnQgbnVtKQoreworICBvYmplY3QgcmF1bTsKKworICAvLyBlcyB3aXJkIGtlaW4gcGFzc2VuZGVzIFNlaGVyaGF1cyB2ZXJ3YWx0ZXQKKyAgaWYgKCFtZW1iZXIobWVnYW1hcCwgb3duZXIpKQorICAgIHJldHVybiAwOworCisgIC8vIFJhdW1udW1tZXIgbmljaHQgendpc2NoZW4gMCB1bmQgbGV0enRlciBSYXVtbnVtbWVyCisgIGlmIChudW0gPCAwIHx8IG51bSA+IG1lZ2FtYXBbb3duZXIsSFBfUk9PTVNdKQorICAgIHJldHVybiAwOworCisgIC8vIFJhdW0gaXN0IGJlcmVpdHMgZ2VsYWRlbgorICBpZiAocmF1bSA9IGZpbmRfb2JqZWN0KFJBVU1OQU1FKG93bmVyLG51bSkpKQorICAgIHJldHVybiByYXVtOworCisgIC8vIGNsb25lIHBhc3NlbmRlbiBSYXVtICgwOiBIYXVwdHJhdW0sIFg6IE5lYmVucmF1bSBYKSB1bmQgc2V0emUgQmVzaXR6ZXIKKyAgcmF1bSA9IGNsb25lX29iamVjdChudW0gPyAoUkFVTSkgOiAoUEFUSCsicmF1bTAiKSk7CisgIHJhdW0tPlNldE93bmVyKG93bmVyLCBudW0pOworICAvLyBsYWRlIE1vZWJlbCwgei5CLiBTZWhlcmhhdXN0cnVoZQorICByYXVtLT5Mb2FkKCk7CisgIC8vIEhhdXB0cmF1bSBiZWtvbW10IEhhdXN0dWVyLUF1c2dhbmcgenVtIEJhdXBsYXR6CisgIGlmICghbnVtKQorICAgIHJhdW0tPkFkZEV4aXROb0NoZWNrKCJyYXVzIiwgbWVnYW1hcFtvd25lcl0pOworCisgIHJldHVybiByYXVtOworfQorCisvLyByZXR1cm50IGRhcyBTZWhlcmhhdXMtT2JqZWt0IHZvbiBCZXNpdHplciAnb3cnCisvLyBudXIgenVtIExvZXNjaGVuIG9kZXIgV2VnYmV3ZWdlbiBkYWhlciBlaW5mYWNoZXIgYWxzIF9MYWRlSGF1cworb2JqZWN0IEZpbmRlSGF1cyhzdHJpbmcgb3cpCit7CisgIC8vIGVzIHdpcmQga2VpbiBwYXNzZW5kZXMgU2VoZXJoYXVzIHZlcndhbHRldAorICBpZiAoIW1lbWJlcihtZWdhbWFwLCBvdykpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiBsb2FkX29iamVjdChIQVVTTkFNRShvdykpOworfQorCisvLyBIYXVzIHZvbiBvd25lciBsb2VzY2hlbiAoc2FtdCBTYXZlZmlsZSEpLiBEaWVzZXIgVm9yZ2FuZyBpc3QgdW53aWRlcnJ1ZmxpY2ghCitpbnQgTG9lc2NoZUhhdXMoc3RyaW5nIG93bmVyKQoreworICBvYmplY3QgaGF1czsKKyAgaW50IHJvb21zOworICBzdHJpbmcgdG1wOworCisgIC8vIGtlaW5lIHBhc3NlbmRlbiBSZWNodGUgZnVlcnMgTG9lc2NoZW4KKyAgaWYgKCFzZWN1cmUoKSkKKyAgICByZXR1cm4gLTE7CisKKyAgLy8gSGF1cy1PYmpla3QgZmluZGVuLCBhbHMgUmF1bWF1dG9sb2FkZXIgaW0gQmF1cGxhdHogYXVzdHJhZ2VuIHVuZCBlbnRmZXJuZW4KKyAgaGF1cyA9IEZpbmRlSGF1cyhvd25lcik7CisgIGlmICghaGF1cykKKyAgICByZXR1cm4gLTI7CisgIE9CSkVDVEQtPlJlbW92ZU9iamVjdChoYXVzLCBvYmplY3RfbmFtZShlbnZpcm9ubWVudChoYXVzKSkpOworICBlbnZpcm9ubWVudChoYXVzKS0+UmVtb3ZlSXRlbShvYmplY3RfbmFtZShoYXVzKSk7CisKKyAgLy8gUmF1bWFuemFobCBtZXJrZW4KKyAgcm9vbXMgPSBtZWdhbWFwW293bmVyLEhQX1JPT01TXTsKKworICAvLyBIYXVzIGF1cyBWZXJ3YWx0ZXItTWFwcGluZyBsb2VzY2hlbgorICBtZWdhbWFwID0gbV9kZWxldGUobWVnYW1hcCwgb3duZXIpOworCisgIC8vIFZlcndhbHRlci1NYXBwaW5nIGFic3BlaWNoZXJuCisgIHNhdmVfb2JqZWN0KFNBVkVGSUxFKTsKKworICAvLyBVZWJlcmdhZW5nZSB2b24gYW5kZXJlbiBTZWhlcmhhZXVzZXJuIHp1IGRpZXNlbSBlbnRmZXJuZW4KKyAgY2hlY2tfZXhpdHMob3duZXIsIHJvb21zLCAxKTsKKworICAvLyBTYXZlZmlsZSBmdWVyIGRhcyBIYXVzIGVudGZlcm5lbgorICBpZiAoZmlsZV9zaXplKEhBVVNTQVZFUEFUSCtvd25lcisiLm8iKT4wKQorICAgIHJtKEhBVVNTQVZFUEFUSCtvd25lcisiLm8iKTsKKworICAvLyBTYXZlZmlsZXMgZnVlciBkaWUgUmFldW1lIGVudGZlcm5lbgorICBkbyB7CisgICAgaWYgKGZpbGVfc2l6ZSh0bXAgPSBzcHJpbnRmKChIQVVTU0FWRVBBVEgrIiVzJWQubyIpLG93bmVyLHJvb21zKSk+MCkKKyAgICAgIHJtKHRtcCk7CisgIH0gd2hpbGUgKC0tcm9vbXMgPj0gMCk7CisKKyAgLy8gU2F2ZWZpbGUgZnVlciBkaWUgVHJ1aGUgbG9lc2NoZW4KKyAgaWYgKGZpbGVfc2l6ZShIQVVTU0FWRVBBVEgrb3duZXIrInRydWhlLm8iKT4wKQorICAgIHJtKEhBVVNTQVZFUEFUSCtvd25lcisidHJ1aGUubyIpOworCisgIC8vIFJlcGZpbGUgZnVlciBkYXMgU2VoZXJoYXVzIGxvZXNjaGVuCisgIC8vIFRPRE86IEVpbnRyYWVnZSBhdXMgRVJST1JEIGxvZXNjaGVuLgorICBpZiAoZmlsZV9zaXplKFBBVEgrInJlcC8iK293bmVyKyIucmVwIikgPiAwKQorICAgIHJtKFBBVEgrInJlcC8iK293bmVyKyIucmVwIik7CisKKyAgLy8gU3RhdGlzdGlrIHVlYmVyIGFsbGUgU2VoZXJoYWV1c2VyIGVybmV1ZXJuCisgIGR1bXAoKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIEhhdXMgdm9uIG93bmVyIHZvbSBSYXVtICd2b24nIGluIGRlbiBSYXVtICduYWNoJyB2ZXJzY2hpZWJlbi4KK2ludCBWZXJsZWdlSGF1cyhzdHJpbmcgb3duZXIsIHN0cmluZyB2b24sIHN0cmluZyBuYWNoKQoreworICBvYmplY3QgaCwgemllbDsKKworICAvLyBrZWluIFJlY2h0IGRhcyB6dSB0dW4KKyAgaWYgKCFzZWN1cmUoKSkKKyAgICByZXR1cm4gLTExMTsKKworICAvLyB6dSB2ZXJsZWdlbmRlcyBIYXVzIG5pY2h0IGF1ZmZpbmRiYXIKKyAgaWYgKCEoaD1GaW5kZUhhdXMob3duZXIpKSkKKyAgICByZXR1cm4gLTE7CisKKyAgLy8gYWt0dWVsbGVyIFN0YW5kb3J0IGRlcyBIYXVzZXMgaXN0IG5pY2h0IFN0YXJ0cHVua3Qgdm9uCisgIGlmIChvYmplY3RfbmFtZShlbnZpcm9ubWVudChoKSkgIT0gdm9uKQorICAgIHJldHVybiAtMjsKKworICAvLyBaaWVsLVN0YW5kb3J0IG5pY2h0IGxhZGJhcgorICBjYXRjaCh6aWVsID0gbG9hZF9vYmplY3QobmFjaCk7cHVibGlzaCk7CisgIGlmICghemllbCkKKyAgICByZXR1cm4gLTM7CisKKyAgLy8gQW0gWmllbG9ydCBkYXJmIGtlaW4gSGF1cyBnZWJhdXQgd2VyZGVuCisgIGlmIChVbmJlYmF1YmFyKHppZWwpKQorICAgIHJldHVybiAtNDsKKworICAvLyBTZWhlcmhhdXMgaXN0IG1pdCBhbmRlcmVtIFNlaGVyaGF1cyB2ZXJidW5kZW4gdW5kIGthbm4gZGFoZXIgbmljaHQKKyAgLy8gdmVyc2Nob2JlbiB3ZXJkZW4KKyAgaWYgKGNoZWNrX2V4aXRzKG93bmVyLCBtZWdhbWFwW293bmVyLEhQX1JPT01TXSwgMCkpCisgICAgcmV0dXJuIC01OworCisgIC8vIG5ldWVuIFN0YW5kb3J0IGluIFZlcndhbHRlci1NYXBwaW5nIGVpbnRyYWdlbgorICBtZWdhbWFwW293bmVyXSA9IG5hY2g7CisgIC8vIFJhdW1hdXRvbG9hZGVyIGFtIGFsdGVuIFN0YW5kb3J0IGF1c3RyYWdlbiB1bmQgYW0gbmV1ZW4gZWludHJhZ2VuCisgIE9CSkVDVEQtPlJlbW92ZU9iamVjdChoLCB2b24pOworICBPQkpFQ1RELT5BZGRPYmplY3QoaCwgbmFjaCk7CisgIC8vIEhhdXMgYmV3ZWdlbgorICBoLT5tb3ZlKG5hY2gsIE1fTk9DSEVDSyk7CisgIC8vIEhhdXN0dWVyLUF1c2dhbmcgdW10cmFnZW4gdW5kIEhhdXB0cmF1bSBzcGVpY2hlcm4KKyAgY2F0Y2goUkFVTU5BTUUob3duZXIsMCktPkFkZEV4aXROb0NoZWNrKCJyYXVzIiwgbmFjaCk7cHVibGlzaCk7CisgIGNhdGNoKFJBVU1OQU1FKG93bmVyLDApLT5TYXZlKCk7cHVibGlzaCk7CisgIC8vIFZlcndhbHRlci1NYXBwaW5nIHNwZWljaGVybgorICBzYXZlX29iamVjdChTQVZFRklMRSk7CisgIC8vIEhhdXMgYWxzIElubXZlbnRhciBkZXMgYWx0ZW4gQmF1cGxhdHplcyBhdXN0cmFnZW4KKyAgdm9uLT5SZW1vdmVJdGVtKG9iamVjdF9uYW1lKGgpKTsKKyAgLy8gU3RhdGlzdGlrIHVlYmVyIGFsbGUgU2VoZXJoYWV1c2VyIGVybmV1ZXJuCisgIGR1bXAoKTsKKworICByZXR1cm4gMTsKK30KKworLy8gS2FubiBpbiBvYiBlaW4gSGF1cyBnZWJhdXQgd2VyZGVuPyAwOiBKYSwgc29uc3QgRmVobGVyIQoraW50IFVuYmViYXViYXIob2JqZWN0IG9iKQoreworICAvLyBSYXVtIGlzdCBnZWNsb250IG9kZXIgaGF0IGtlaW4gZWlnZW5lcyBGaWxldCwgei5CLiBWQworICBpZiAoY2xvbmVwKG9iKSB8fCBmaWxlX3NpemUob2JqZWN0X25hbWUob2IpKyIuYyIpPDApCisgICAgcmV0dXJuIDE7CisKKyAgLy8gSW5uZW5yYXVtCisgIGlmIChvYi0+UXVlcnlQcm9wKFBfSU5ET09SUykpCisgICAgcmV0dXJuIDI7CisKKyAgLy8gQmF1cGxhdHotUHJvcGVydHkgbmljaHQgZ2VzZXR6dAorICBpZiAoIShvYi0+UXVlcnlQcm9wKFBfSEFVU19FUkxBVUJUKSkpCisgICAgcmV0dXJuIDM7CisKKyAgcmV0dXJuIDA7Cit9CisKKy8vIEplbWFuZGVtIGltIEhhdXMgWnVzYXR6cmVjaHRlIGVpbnJhZXVtZW4KK3N0cmluZyAqRXJsYXViZShzdHJpbmcgb3duZXIsIHN0cmluZyAqd2VyKQoreworICBzdHJpbmcgKmFsbDsKKworICAvLyBlcyB3aXJkIGtlaW4gcGFzc2VuZGVzIFNlaGVyaGF1cyB2ZXJ3YWx0ZXQKKyAgaWYgKCFtZW1iZXIobWVnYW1hcCwgb3duZXIpKQorICAgIHJldHVybiAwOworCisgIGFsbCA9IG1lZ2FtYXBbb3duZXIsIEhQX0FMTE9XRURdOworICAvLyBmdWVnZSB3ZXIgenUgYWxsIGRhenUgb2huZSBkb3BwZWx0ZSBFaW50cmFlZ2UgenUgZXJ6ZXVnZW46CisgIGFsbCArPSB3ZXItYWxsOworICAvLyBhZW5kZXIgUmVjaHRlbGlzdGUgaW4gZGVyIFZlcndhbHR1bmcKKyAgbWVnYW1hcFtvd25lciwgSFBfQUxMT1dFRF0gPSBhbGw7CisgIC8vIHNwZWljaGVyIFZlcndhbHRlci1NYXBwaW5nCisgIHNhdmVfb2JqZWN0KFNBVkVGSUxFKTsKKyAgLy8gcmV0dXJuIExpc3RlIGRlciBha3R1ZWxsZW4gUmVjaHRlaW5oYWJlcgorICByZXR1cm4gYWxsOworfQorCisvLyBKZW1hbmRlbSBpbSBIYXVzIFp1c2F0enJlY2h0ZSBlbnR6aWVoZW4KK3N0cmluZyAqVmVyYmlldGUoc3RyaW5nIG93bmVyLCBzdHJpbmcgKndlcikKK3sKKyAgLy8gZXMgd2lyZCBrZWluIHBhc3NlbmRlcyBTZWhlcmhhdXMgdmVyd2FsdGV0CisgIGlmICghbWVtYmVyKG1lZ2FtYXAsIG93bmVyKSkKKyAgICByZXR1cm4gMDsKKworICAvLyBhZW5kZXIgUmVjaHRlbGlzdGUgaW4gZGVyIFZlcndhbHR1bmcKKyAgbWVnYW1hcFtvd25lciwgSFBfQUxMT1dFRF0gLT0gd2VyOworICAvLyBzcGVpY2hlciBWZXJ3YWx0ZXItTWFwcGluZworICBzYXZlX29iamVjdChTQVZFRklMRSk7CisgIC8vIHJldHVybiBMaXN0ZSBkZXIgYWt0dWVsbGVuIFJlY2h0ZWluaGFiZXIKKyAgcmV0dXJuIG1lZ2FtYXBbb3duZXIsIEhQX0FMTE9XRURdOworfQorCisvLyBBYmZyYWdlIHZvbiBQcm9wZXJ0eSAncHJvcCcgaW0gSGF1cyB2b24gJ293bmVyJworLy8gcHJvcCBnbGVpY2ggSFBfRU5WLCBIUF9ST09NUyBvZGVyIEhQX0FMTE9XRUQgYXVzIGhhdXMuaAorbWl4ZWQgSGF1c1Byb3Aoc3RyaW5nIG93bmVyLCBpbnQgcHJvcCkKK3sKKyAgLy8gZXMgd2lyZCBrZWluIHBhc3NlbmRlcyBTZWhlcmhhdXMgdmVyd2FsdGV0CisgIGlmICghbWVtYmVyKG1lZ2FtYXAsIG93bmVyKSkKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gbWVnYW1hcFtvd25lcixwcm9wXTsKK30KKworLy8gemVybGVndCBkYXMgbWFwcGluZywgZmFzc3QgaW5kaWNlcyBtaXQgZ2xlaWNoZW4gdmFsdWVzIHp1c2FtbWVuCisvLyB1bmQgcGFja3QgZGFzIGdhbnplIGluIGVpbiBhcnJheSAtPiBEZWR1cGxpemllcmVuCisvLyBEYXMgRXJnZWJuaXMgZW50aGFlbHQKKy8vIGEpIGZ1ZXIgamVkZXMgRGV0YWlsIGVpbiBBcnJheSwgd2VsY2hlcyBhbHMgZXJzdGVzIEVsZW1lbnQgZWluIEFycmF5IHZvbgorLy8gU2NobHVlc3NlbG4gdW5kIGFscyB6d2VpdGVzIEVsZW1lbnQgZWluZW4gU3RyaW5nIGVudGhhZWx0LgorLy8gYikgZnVlciBqZWRlcyBLb21tYW5kbyBlaW4gQXJyYXksIHdlbGNoZXMgYWxzIGVyc3RlcyBFbGVtZW50IGVpbiBBcnJheSB2b24KKy8vIFN5bnRheGVuIHVuZCB6d2VpIGZvbGdlbmRlIEVsZW1lbnRlIG1pdCBTdHJpbmdzIChNZWxkdW5nZW4pIGVudGhhZWx0LgorLy8gQmVpZGVzIGlzdCBpbiBlaW5lbSBGb3JtYXQsIGRhc3MgZGllIEVsZW1lbnRlIHVubW9kaWZpemllcnQgYW4gZGllCisvLyBlbnRzcHJlY2hlbmRlbiBBZGQuLi4oKS1BdWZydWZlIGdlZ2ViZW4gd2VyZGVuIGtvZW5uZW4uCisKKy8vIChbICJrZXkxIiA6IEEsICJrZXkyIiA6IEIsICJrZXkzIiA6IEEgXSkKKy8vID0+ICh7ICh7ICh7ICJrZXkxIiwgImtleTMiIH0pLCBBICl9LCAoeyAoeyAia2V5MiIgfSksIEIgKX0gfSkKKworLy8gKFsgImtleTEiIDogKFsgImtleTExIiA6IEE7IEIsICJrZXkxMiIgOiBDOyBCLCAia2V5MTMiIDogQSwgQiBdKSwKKy8vICAgICJrZXkyIiA6IChbICJrZXkyMSIgOiBBOyBCLCAia2V5MjIiIDogQzsgQSBdKSBdKQorLy8gPT4gKHsgKHsgKHsgImtleTEga2V5MTEiLCAia2V5MSBrZXkxMyIsICJrZXkyIGtleTIxIiB9KSwgQSwgQiB9KSwKKy8vICAgICAgICh7ICh7ICJrZXkxIGtleTEyIiB9KSwgQywgQiB9KSwKKy8vICAgICAgICh7ICh7ICJrZXkyIGtleTIyIiB9KSwgQywgQSB9KSB9KQorbWl4ZWQgUENydW5jaChtYXBwaW5nIHByb3ApCit7CisgIG1peGVkIHJldCA9ICh7fSk7CisgIGludCBkb25lID0gMDsKKyAgZm9yZWFjaChzdHJpbmcga2V5LCBtaXhlZCBlbnRyeSA6IHByb3ApCisgIHsKKyAgICBpZihtYXBwaW5ncChlbnRyeSkpCisgICAgeworICAgICAgLy8gbWFwcGluZyBicmVpdGUgMiBpbSBtYXBwaW5nIGZ1ZXIgSF9DT01NQU5EUworICAgICAgZm9yZWFjaChzdHJpbmcgc3Via2V5LCBzdHJpbmcgdmFsMSwgc3RyaW5nIHZhbDIgOiBlbnRyeSkKKyAgICAgIHsKKyAgICAgICAgZG9uZSA9IDA7CisgICAgICAgIGZvcmVhY2gobWl4ZWQgcmV0c2V0IDogcmV0KQorICAgICAgICB7CisgICAgICAgICAgLy8gZmFsbHMgZXMgc2Nob24gaW0gZXJnZWJuaXMtYXJyYXkgZXR3YXMgbWl0IGRlbiBzZWxiZW4gd2VydGVuIGdpYnQsCisgICAgICAgICAgLy8gZnVlZ2UgZGVuIGluZGV4IGRvcnQgZGF6dQorICAgICAgICAgIGlmKHNpemVvZihyZXRzZXQpID09IDMgJiYgcmV0c2V0WzFdID09IHZhbDEgJiYgcmV0c2V0WzJdID09IHZhbDIpCisgICAgICAgICAgeworICAgICAgICAgICAgcmV0c2V0WzBdICs9ICh7IGtleSsiICIrc3Via2V5IH0pOworICAgICAgICAgICAgZG9uZSA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gZmFsbHMgZXMgbm9jaCBuaXggaW0gZXJnZWJuaXMtYXJyYXkgbWl0IGRlbiBzZWxiZW4gd2VydGVuIGdhYiwKKyAgICAgICAgLy8gZnVlZ2UgZWluZW4gbmV1ZW4gZWludHJhZyBoaW56dQorICAgICAgICBpZighZG9uZSkKKyAgICAgICAgICByZXQgKz0gKHsgKHsgKHsga2V5KyIgIitzdWJrZXkgfSksIHZhbDEsIHZhbDIgfSkgfSk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvLyBlaW56ZWxuZSBXZXJ0ZSBpbSBNYXBwaW5nIGZ1ZXIgUF9ERVRBSUxTIHVuZCBQX1JFQURfREVUQUlMUworICAgICAgZG9uZSA9IDA7CisgICAgICBmb3JlYWNoKG1peGVkIHJldHNldCA6IHJldCkKKyAgICAgIHsKKyAgICAgICAgLy8gZmFsbHMgZXMgc2Nob24gaW0gZXJnZWJuaXMtYXJyYXkgZXR3YXMgbWl0IGRlbSBzZWxiZW4gd2VydCBnaWJ0LAorICAgICAgICAvLyBmdWVnZSBkZW4gaW5kZXggZG9ydCBkYXp1CisgICAgICAgIGlmKHNpemVvZihyZXRzZXQpID09IDIgJiYgcmV0c2V0WzFdID09IGVudHJ5KQorICAgICAgICB7CisgICAgICAgICAgcmV0c2V0WzBdICs9ICh7IGtleSB9KTsKKyAgICAgICAgICBkb25lID0gMTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLy8gZmFsbHMgZXMgbm9jaCBuaXggaW0gZXJnZWJuaXMtYXJyYXkgbWl0IGRlbSBzZWxiZW4gd2VydCBnYWIsCisgICAgICAvLyBmdWVnZSBlaW5lbiBuZXVlbiBlaW50cmFnIGhpbnp1CisgICAgICBpZighZG9uZSkKKyAgICAgICAgcmV0ICs9ICh7ICh7ICh7IGtleSB9KSwgZW50cnkgfSkgfSk7CisgICAgfQorICB9CisgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIva29tbWVudGFyLmMgYi9kL3NlaGVyL2hhZXVzZXIva29tbWVudGFyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU3OWZhNAotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci9rb21tZW50YXIuYwpAQCAtMCwwICsxLDYyIEBACisvKgorICoga29tbWVudGFyLmMgLS0gRElFIEVyZ2Flbnp1bmcgenVtIEJhdXNwYXJ2ZXJ0cmFnCisgKgorICogKGMpIDE5OTQgQmVsZGluQE1vcmdlbkdyYXVlbgorICoKKyAqICREYXRlOiAxOTk0LzEwLzEzIDE0OjE0OjA2ICQKKyAqICRSZXZpc2lvbjogMS4yICQKKyAqICRMb2c6IGtvbW1lbnRhci5jLHYgJAorICogUmV2aXNpb24gMS4yICAxOTk0LzEwLzEzICAxNDoxNDowNiAgV2FyZ29uCisgKiBJbnMgU2VoZXJ2ZXJ6ZWljaG5pcyB2ZXJsZWd0LCBhbmdlcGFzc3QgdW5kICJyZWluZGVudGVkIi4KKyAqCisgKiBSZXZpc2lvbiAxLjEgIDE5OTQvMTAvMTMgIDE0OjEwOjAyICBXYXJnb24KKyAqIEluaXRpYWwgcmV2aXNpb24KKyAqCisgKi8KKworaW5oZXJpdCAic3RkL3RoaW5nIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgImhhdXMuaCIKKworY3JlYXRlKCkKK3sKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX0dFTkRFUixNQUxFKTsKKyAgU2V0UHJvcChQX1NIT1JULCJFaW4gS29tbWVudGFyIik7CisgIFNldFByb3AoUF9XRUlHSFQsIDUwMCk7CisgIFNldFByb3AoUF9WQUxVRSwgMCk7CisgIFNldFByb3AoUF9OQU1FLCJLb21tZW50YXIiKTsKKyAgU2V0UHJvcChQX0xPTkcsCisgICAgICJcbkRpZXMgaXN0IGVpbiBLb21tZW50YXIuIEVyIGJlc3RlaHQgYXVzIDEwMCUtcmVjeWNsZWZhZWhpZ2VtIEFsdHBhcGllciwgdW5kXG4iCisgICAgKyJpc3QgY2hsb3JmcmVpIGdlYmxlaWNodC4gRGFzIFBhcGllciBzY2hlaW50IGR1ZW5uIHp1IHNlaW4uXG4iCisgICAgKyJWaWVsbGVpY2h0IHNvbGx0ZXN0IER1IGlobiBzY2huZWxsIGxlc2VuIVxuXG4iCisgICAgICk7CisKKyAgQWRkSWQoICh7ImtvbW1lbnRhciIsICJrb21tZW50aWVydW5nIn0pKTsKKyAgQWRkQ21kKCJsaWVzIiwibGVzZW4iKTsKK30KKworcmVtKCkKK3sKKyAgY2FsbF9vdXQoInJlbW92ZSIsIDIpOworICB0ZWxsX29iamVjdChlbnZpcm9ubWVudCgpLCAiXG5cbkRlciBLb21tZW50YXIgbG9lc3Qgc2ljaCBpbiBXb2hsZ2VmYWxsZW4gYXVmLlxuXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK2xlc2VuKHN0cikKK3sKKyAgc3RyaW5nIGtvbW1lbnQ7CisgIGtvbW1lbnQ9UEFUSCsidHh0L2tvbW1lbnRhci50eHQiOworICBpZiAoIXN0cikgcmV0dXJuIDA7CisgIGlmIChpZChzdHIpKSB7CisgICAgdGhpc19wbGF5ZXIoKS0+TW9yZShrb21tZW50LDEsIydyZW0pOworICAgIHJldHVybiAxOworICAgIH0KKyAgZWxzZSB7CisgICAgbm90aWZ5X2ZhaWwoIldhcyB3aWxsc3QgRHUgbGVzZW4/Pz9cbiIpOworICAgIHJldHVybiAwOworICB9Cit9CisKZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9tb2R1bGVzL2hhdXN0dWVyLmMgYi9kL3NlaGVyL2hhZXVzZXIvbW9kdWxlcy9oYXVzdHVlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZDg3ODQKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvbW9kdWxlcy9oYXVzdHVlci5jCkBAIC0wLDAgKzEsMjE1IEBACisvLyAgaGF1c3R1ZXIuYyAtLSBCZXNjaHJlaWJ1bmcsIE9lZmZuZW4gdW5kIFNjaGxpZXNzZW4KKy8vCisvLyAgKGMpIDE5OTUgV2FyZ29uQE1vcmdlbkdyYXVlbgorLy8KKy8vICRJZDogaGF1c3R1ZXIuYyx2IDEuMS4xLjEgMjAwMC8wOC8yMCAyMDoyMjo0MiBtdWQgRXhwICQKKy8vCisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSAiLi4vaGF1cy5oIgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx0aGluZy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8dGhpbmcvZGVzY3JpcHRpb24uaD4KKyNpbmNsdWRlIDx0aGluZy9jb21tYW5kcy5oPgorCitzdGF0aWMgaW50IHZhbGlkSG91c2UgPSAwOworc3RhdGljIHN0cmluZyBvd25lcjsKKwordm9pZCBjcmVhdGUoKQoreworICBTZXQoIEhfRE9PUiwgIkRpZSBIYXVzdHVlciBpc3QgJXMuXG4iICk7CisgIFNldCggSF9ET09SU1RBVCwgMCk7CisgIFNldCggSF9ET09STFNUQVQsICh7ICJnZW9lZmZuZXQiLCAiZ2VzY2hsb3NzZW4iLCAwLCAiYWJnZXNjaGxvc3NlbiIgfSkpOworCisgIFNldCggSF9ET09SLCBTQVZFLCBGX01PREUpOworICBTZXQoIEhfRE9PUlNUQVQsIFNBVkUsIEZfTU9ERSk7CisgIFNldCggSF9ET09STFNUQVQsIFNBVkUsIEZfTU9ERSk7CisKKyAgQWRkQ21kKCAoeyJzY2hsaWVzcyIsICJzY2hsaWVzc2UifSksICJzY2hsaWVzc2UiKTsKKyAgQWRkQ21kKCJvZWZmbmUiLCJvZWZmbmUiKTsKKworICBvd25lciA9IGdldHVpZCh0aGlzX29iamVjdCgpKTsKK30KKwordmFyYXJncyBzdHJpbmcgbG9uZyhpbnQgbW9kZSkKK3sKKyAgcmV0dXJuIHNwcmludGYoUXVlcnkoSF9ET09SKSwgUXVlcnkoSF9ET09STFNUQVQpW1F1ZXJ5KEhfRE9PUlNUQVQpXSk7Cit9CisKK3N0YXRpYyBzdHJpbmcgU2V0VHVlck93bmVyKHN0cmluZyBvKQoreworICB2YWxpZEhvdXNlPTE7CisgIFNldCggSF9ET09SU1RBVCwgRF9DTE9TRUQgfCBEX0xPQ0tFRCk7CisgIHJldHVybiBvd25lcj1vOworfQorCitpbnQgb2VmZm5lKHN0cmluZyBzdHIpCit7CisgIGludCBkb29yc3RhdDsKKworICBub3RpZnlfZmFpbCgiV2FzIHdpbGxzdCBEdSBvZWZmbmVuP1xuIik7CisgIGRvb3JzdGF0ID0gUXVlcnkoSF9ET09SU1RBVCk7CisKKyAgaWYgKCFpZChzdHIpICYmIHN0ciAhPSAidHVlciIgJiYgc3RyICE9ICJoYXVzdHVlciIpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKCEoZG9vcnN0YXQgJiBEX0NMT1NFRCkpIHsKKyAgICBub3RpZnlfZmFpbChjYXBpdGFsaXplKG5hbWUoV0VSLDEpKSsiIGlzdCBnYXIgbmljaHQgZ2VzY2hsb3NzZW4hXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoZG9vcnN0YXQgJiBEX0xPQ0tFRCkgeworICAgIG5vdGlmeV9mYWlsKGNhcGl0YWxpemUobmFtZShXRVIsMSkpKyIgaXN0IGFiZ2VzY2hsb3NzZW4uXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGRvb3JzdGF0ICY9IH5EX0NMT1NFRDsKKyAgU2V0KEhfRE9PUlNUQVQsIGRvb3JzdGF0ICYgfkRfQ0xPU0VEKTsKKworICB3cml0ZSgiRHUgb2VmZm5lc3QgIituYW1lKFdFTiwxKSsiIHZvbiAiK2NhcGl0YWxpemUob3duZXIpKyIuXG4iKTsKKyAgdGVsbF9yb29tKGVudmlyb25tZW50KHRoaXNfb2JqZWN0KCkpLAorCSAgICBzcHJpbnRmKCIlcyBvZWZmbmV0ICVzIHZvbiAlcy5cbiIsCisJCSAgICB0aGlzX3BsYXllcigpLT5uYW1lKFdFUiksCisJCSAgICBuYW1lKFdFTiwxKSwKKwkJICAgIGNhcGl0YWxpemUob3duZXIpICksCisJICAgICh7dGhpc19wbGF5ZXIoKX0pKTsKKyAgaWYgKHZhbGlkSG91c2UpIHsKKyAgICB0ZWxsX3Jvb20oZmluZF9vYmplY3QoUkFVTU5BTUUob3duZXIsMCkpfHx0aGlzX29iamVjdCgpLAorCSAgICAgIHRoaXNfcGxheWVyKCktPm5hbWUoV0VSKSsiIG9lZmZuZXQgIituYW1lKFdFTikrIi5cbiIsCisJICAgICAgKHt0aGlzX3BsYXllcigpfSkpOworICAgIFNhdmUoKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworcHJpdmF0ZSBpbnQgY2xvc2VfZG9vcigpCit7CisgIGlmIChRdWVyeShIX0RPT1JTVEFUKSAmIERfQ0xPU0VEKSB7CisgICAgbm90aWZ5X2ZhaWwoY2FwaXRhbGl6ZShuYW1lKFdFUiwxKSkrIiBpc3QgZG9jaCBzY2hvbiB6dSFcbiIpOworICAgIHJldHVybiAwOworICB9CisgIFNldChIX0RPT1JTVEFULCBRdWVyeShIX0RPT1JTVEFUKSB8IERfQ0xPU0VEKTsKKworICB3cml0ZSgiRHUgc2NobGllc3N0ICIrbmFtZShXRU4sMSkrIiB2b24gIitjYXBpdGFsaXplKG93bmVyKSsiLlxuIik7CisgIHRlbGxfcm9vbShlbnZpcm9ubWVudCh0aGlzX29iamVjdCgpKSwKKwkgICAgc3ByaW50ZiggIiVzIHNjaGxpZXNzdCAlcyB2b24gJXMuXG4iLAorCQkgICAgIGNhcGl0YWxpemUodGhpc19wbGF5ZXIoKS0+bmFtZShXRVIpKSwKKwkJICAgICBuYW1lKFdFTiwxKSwgY2FwaXRhbGl6ZShvd25lcikpLAorCSAgICAoe3RoaXNfcGxheWVyKCl9KSk7CisgIGlmICh2YWxpZEhvdXNlKSB7CisgICAgdGVsbF9yb29tKGZpbmRfb2JqZWN0KFJBVU1OQU1FKG93bmVyLDApKXx8dGhpc19vYmplY3QoKSwKKwkgICAgICBjYXBpdGFsaXplKHRoaXNfcGxheWVyKCktPm5hbWUoV0VSKSkrIiBzY2hsaWVzc3QgIituYW1lKFdFTikrIi5cbiIsCisJICAgICAgKHt0aGlzX3BsYXllcigpfSkpOworICAgIFNhdmUoKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworcHJpdmF0ZSBpbnQgbG9ja19kb29yKCkKK3sKKyAgb2JqZWN0IHRwLCBob21lOworICBzdHJpbmcgbmFtOworICBpbnQgZG9vcnN0YXQ7CisKKyAgdHAgPSB0aGlzX3BsYXllcigpOworICBuYW0gPSBjYXBpdGFsaXplKHRwLT5uYW1lKFdFUikpOworCisgIGlmICh2YWxpZEhvdXNlKSB7CisgICAgY2FsbF9vdGhlcihSQVVNTkFNRShvd25lciwwKSwgIj8/PyIpOworICAgIGhvbWUgPSBmaW5kX29iamVjdChSQVVNTkFNRShvd25lciwwKSk7CisKKyAgICBpZiAoIWhvbWUtPmFsbG93ZWRfY2hlY2sodGhpc19wbGF5ZXIoKSkpIHsKKyAgICAgIG5vdGlmeV9mYWlsKCJEdSBkYXJmc3QgIituYW1lKFdFTiwxKSsiIHZvbiAiK2NhcGl0YWxpemUob3duZXIpKyIgYWJlciBuaWNodCBhYnNjaGxpZXNzZW4uXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorICBpZiAoKGRvb3JzdGF0ID0gUXVlcnkoSF9ET09SU1RBVCkpICYgRF9MT0NLRUQpIHsKKyAgICBub3RpZnlfZmFpbCgiRGllIFR1ZXIgaXN0IGFiZ2VzY2hsb3NzZW4uXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBkb29yc3RhdCB8PSAoRF9MT0NLRUR8RF9DTE9TRUQpOworICB3cml0ZSgiRHUgc2NobGllc3N0ICIrbmFtZShXRU4pKyIgYWIuXG4iKTsKKyAgU2V0KEhfRE9PUlNUQVQsIGRvb3JzdGF0KTsKKyAgdGVsbF9yb29tKGVudmlyb25tZW50KHRoaXNfb2JqZWN0KCkpLAorCSAgICBzcHJpbnRmKCAiJXMgc2NobGllc3N0ICVzIGFiLlxuIiwKKwkJICAgIG5hbSwKKwkJICAgIChnZXR1aWQodHApPT1vd25lciA/CisJCSAgICAgKHRwLT5RdWVyeVBvc3NQcm9ub3VuKHRoaXNfb2JqZWN0KCksIFdFTikrIiAiK25hbWUoUkFXKSkgOgorCQkgICAgIG5hbWUoV0VOLDEpICkpLAorCSAgICAoe3RwfSkpOworICBpZiAodmFsaWRIb3VzZSkgeworICAgIHRlbGxfcm9vbShob21lLCBuYW0rIiBzY2hsaWVzc3QgIituYW1lKFdFTikrIiBhYi5cbiIsKHt0cH0pKTsKKyAgICBTYXZlKCk7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3ByaXZhdGUgaW50IHVubG9ja19kb29yKCkKK3sKKyAgb2JqZWN0IHRwLCBob21lOworICBzdHJpbmcgbmFtOworICBpbnQgZG9vcnN0YXQ7CisKKyAgdHAgPSB0aGlzX3BsYXllcigpOworICBuYW0gPSBjYXBpdGFsaXplKHRwLT5uYW1lKFdFUikpOworCisgIGlmICh2YWxpZEhvdXNlKSB7CisgICAgY2FsbF9vdGhlcihSQVVNTkFNRShvd25lciwwKSwgIj8/PyIpOworICAgIGhvbWUgPSBmaW5kX29iamVjdChSQVVNTkFNRShvd25lciwwKSk7CisKKyAgICBpZiAoIWhvbWUtPmFsbG93ZWRfY2hlY2sodGhpc19wbGF5ZXIoKSkpIHsKKyAgICAgIG5vdGlmeV9mYWlsKCJEdSBkYXJmc3QgIituYW1lKFdFTiwxKSsiIHZvbiAiK2NhcGl0YWxpemUob3duZXIpKyIgYWJlciBuaWNodCBhdWZzY2hsaWVzc2VuLlxuIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICBpZiAoISgoZG9vcnN0YXQgPSBRdWVyeShIX0RPT1JTVEFUKSkgJiBEX0xPQ0tFRCkpIHsKKyAgICBub3RpZnlfZmFpbCgiRGllIFR1ZXIgaXN0IG5pY2h0IGFiZ2VzY2hsb3NzZW4uXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIFNldChIX0RPT1JTVEFULCBkb29yc3RhdCAmIH5EX0xPQ0tFRCk7CisgIHdyaXRlKCJEdSBzY2hsaWVzc3QgIituYW1lKFdFTikrIiBhdWYuXG4iKTsKKyAgdGVsbF9yb29tKGVudmlyb25tZW50KHRoaXNfb2JqZWN0KCkpLAorCSAgICBzcHJpbnRmKCIlcyBzY2hsaWVzc3QgJXMgYXVmLlxuIiwKKwkJICAgICBuYW0sCisJCSAgICAgKGdldHVpZCh0cCk9PW93bmVyID8KKwkJICAgICAgKHRwLT5RdWVyeVBvc3NQcm9ub3VuKHRoaXNfb2JqZWN0KCksIFdFTikrIiAiK25hbWUoUkFXKSkgOgorCQkgICAgICBuYW1lKFdFTiwxKSApKSwKKwkgICAgKHt0cH0pKTsKKyAgaWYodmFsaWRIb3VzZSkgeworICAgIHRlbGxfcm9vbShob21lLG5hbSsiIHNjaGxpZXNzdCAiK25hbWUoV0VOKSsiIGF1Zi5cbiIsKHt0cH0pKTsKKyAgICBTYXZlKCk7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2ludCBzY2hsaWVzc2Uoc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIHdhcywgd2VuLCAqczsKKworICBub3RpZnlfZmFpbCgiV2FzIHdpbGxzdCBEdSBzY2hsaWVzc2VuID9cbiIpOworICBpZiAoIXN0cnx8c3RyPT0iIikKKyAgICByZXR1cm4gMDsKKyAgcyA9IG9sZF9leHBsb2RlKHN0ciwgIiAiKTsKKyAgaWYgKCh3YXMgPSBzWzwxXSkgPT0gImF1ZiIgfHwgd2FzID09ICJhYiIpCisgICAgcyA9IHNbMC4uPDJdOworICBlbHNlCisgICAgd2FzID0gMDsKKworICB3ZW49aW1wbG9kZShzLCAiICIpOworICBpZiAoIWlkKHdlbikgJiYgd2VuICE9ICJ0dWVyIiAmJiB3ZW4gIT0gImhhdXN0dWVyIikKKyAgICByZXR1cm4gMDsKKyAgaWYgKCF3YXMgfHwgd2FzPT0iIikKKyAgICByZXR1cm4gY2xvc2VfZG9vcigpOworICBzd2l0Y2ggKHdhcykKKyAgeworICAgIGNhc2UgImF1ZiI6IHJldHVybiB1bmxvY2tfZG9vcigpOworICAgIGNhc2UgImFiIjogIHJldHVybiBsb2NrX2Rvb3IoKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworLy8gJExvZzogaGF1c3R1ZXIuYyx2ICQKKy8vIFJldmlzaW9uIDEuMS4xLjEgIDIwMDAvMDgvMjAgMjA6MjI6NDIgIG11ZAorLy8gSW5zIENWUyBlaW5nZWNoZWNrdAorLy8KZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9tb2R1bGVzL2xvc2EuYyBiL2Qvc2VoZXIvaGFldXNlci9tb2R1bGVzL2xvc2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTNjYTUxCi0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL21vZHVsZXMvbG9zYS5jCkBAIC0wLDAgKzEsMzc4IEBACisvLyAgbG9zYS5jIC0tIE1vZHVsIGZ1ZXIgTGFkZW4gdW5kIFNwZWljaGVybiBkZXIgSGF1c2RhdGVuCisvLworLy8gIChjKSAxOTk1IFdhcmdvbkBNb3JnZW5HcmF1ZW4KKy8vICAgICAgMjAwNiBWYW5pb25ATW9yZ2VuR3JhdWVuLCBmdWVyIGRpZSByZWJvb3RmZXN0ZW4gTW9lYmVsCisvLyAkSWQ6IGxvc2EuYyx2IDEuMS4xLjEgMjAwMC8wOC8yMCAyMDoyMjo0MiBtdWQgRXhwICQKKy8vCisjcHJhZ21hIHN0cm9uZ190eXBlcyxydHRfY2hlY2tzCisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSAiLi4vaGF1cy5oIgorI2luY2x1ZGUgPGNvbnRhaW5lci5oPgorI2luY2x1ZGUgPHRoaW5nL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxyb29tL2V4aXRzLmg+CisjaW5jbHVkZSA8dGhpbmcvZGVzY3JpcHRpb24uaD4KKyN1bmRlZiBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8bW92aW5nLmg+CisKK3N0YXRpYyB2b2lkIHN0YXJ0X3JlbG9hZF9mdXJuaXR1cmUoKTsKKworcHJpdmF0ZSBpbnQgY3NhdmVkOworCisvLyBWYXJpYWJsZW4genVyIFZlcndhbHR1bmcgZGVyIE1vZWJlbCBpbSBSYXVtLgorbWFwcGluZyBmdXJuaXR1cmU7CittYXBwaW5nIGJyb2tlbl9mdXJuaXR1cmU7CisKK3Byb3RlY3RlZCB2b2lkCitjcmVhdGUoKQoreworICBTZXQoSF9DSEVTVCwgU0FWRSwgRl9NT0RFKTsKKyAgU2V0KEhfQ0hFU1QsIDApOworCisgIFNldChIX0ZVUk5JVFVSRSwgU0FWRSwgRl9NT0RFKTsKKyAgU2V0KEhfRlVSTklUVVJFLCAwKTsKKworLy8gIFNldChIX1NQRUNJQUwsIFNBVkV8U0VDVVJFRCwgRl9NT0RFKTsKKy8vICBTZXQoSF9TUEVDSUFMLCAoWzoyXSksIEZfVkFMVUUpOworfQorCisvKiBTY2hlaW50IG5pcmdlbmR3byBiZW51dHp0IHp1IHdlcmRlbi4uLgordmFyYXJncyBpbnQgQWRkU3BlY2lhbChpbnQgdHlwLCBzdHJpbmcga2V5LCBzdHJpbmcgZXh0cmEpCit7CisgIGlmICghdGhpc19pbnRlcmFjdGl2ZSgpIHx8ICFJU19BUkNIKHRoaXNfaW50ZXJhY3RpdmUoKSkgfHwKKyAgICAgICEoUEFUSCsiYWNjZXNzX3JpZ2h0cyIpLT5hY2Nlc3NfcmlnaHRzKGdldGV1aWQodGhpc19pbnRlcmFjdGl2ZSgpKSwiIikpCisgICAgcmV0dXJuIC0xOworCisgIGlmICh0eXAgIT0gSFNfRVhJVCAmJiB0eXAgIT0gSFNfSVRFTSkKKyAgICByZXR1cm4gMDsKKworICBTZXQoSF9TUEVDSUFMLCBRdWVyeShIX1NQRUNJQUwpICsgKFsga2V5IDogdHlwOyBleHRyYSBdKSk7CisgIFNhdmUoKTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgUmVtb3ZlU3BlY2lhbChzdHJpbmcga2V5KQoreworICBpZiAoIXRoaXNfaW50ZXJhY3RpdmUoKSB8fCAhSVNfQVJDSCh0aGlzX2ludGVyYWN0aXZlKCkpIHx8CisgICAgICAhKFBBVEgrImFjY2Vzc19yaWdodHMiKS0+YWNjZXNzX3JpZ2h0cyhnZXRldWlkKHRoaXNfaW50ZXJhY3RpdmUoKSksIiIpKQorICAgIHJldHVybjsKKworICBTZXQoSF9TUEVDSUFMLCBtX2RlbGV0ZShRdWVyeShIX1NQRUNJQUwpLCBrZXkpKTsKKyAgU2F2ZSgpOworfQorKi8KKwordm9pZAorcmVzZXQoKQoreworICBpZiAoUXVlcnlPd25lcigpICYmCisgICAgICAhc2l6ZW9mKGZpbHRlcihhbGxfaW52ZW50b3J5KCksIydpbnRlcmFjdGl2ZSkpICYmCisgICAgICAhY3NhdmVkKQorICAgIFNhdmUoMSk7Cit9CisKKy8vIGNydW5jaGVkIGtvbXByaW1pZXJ0IGRhcyBTYXZlZmlsZQordmFyYXJncyB2b2lkCitTYXZlKGludCBjcnVuY2hlZCkKK3sKKyAgbWl4ZWQgbzEsIG8yLCBvMzsKKyAgY2xvc3VyZSBwYzsKKyAgb2JqZWN0ICpvYnM7CisgIGludCBpLCBmb3VuZDsKKworICBvMyA9IDA7CisKKyAgaWYgKCEobzEgPSBRdWVyeShQX0RFVEFJTFMpKSkKKyAgICBTZXQoUF9ERVRBSUxTLCBRdWVyeVByb3AoUF9ERVRBSUxTKSwgRl9WQUxVRSk7CisKKyAgaWYgKCEobzIgPSBRdWVyeShQX1JFQURfREVUQUlMUykpKQorICAgIFNldChQX1JFQURfREVUQUlMUywgUXVlcnlQcm9wKFBfUkVBRF9ERVRBSUxTKSwgRl9WQUxVRSk7CisKKyAgaWYgKGNzYXZlZCA9IGNydW5jaGVkKQorICB7CisgICAgcGMgPSBzeW1ib2xfZnVuY3Rpb24oIlBDcnVuY2giLCBWRVJXQUxURVIpOworICAgIFNldChQX0RFVEFJTFMsIGZ1bmNhbGwocGMsIFF1ZXJ5KFBfREVUQUlMUykpLCBGX1ZBTFVFKTsKKyAgICBTZXQoUF9SRUFEX0RFVEFJTFMsIGZ1bmNhbGwocGMsIFF1ZXJ5KFBfUkVBRF9ERVRBSUxTKSksIEZfVkFMVUUpOworICAgIG8zID0gUXVlcnkoSF9DT01NQU5EUywgRl9WQUxVRSk7CisgICAgU2V0KEhfQ09NTUFORFMsIGZ1bmNhbGwocGMsIG8zKSwgRl9WQUxVRSk7CisgIH0KKworICAvLyBBdXRvbG9hZC1FaW5yaWNodHVuZyBpZGVudGlmaXppZXJlbiB1bmQgc3BlaWNoZXJuCisgIC8vIENvZGUgaW4gQW5sZWhudW5nIGFuIGRlbSBBdXRvbG9hZC1NZWNoYW5pc211cyBmdWVyIFNwaWVsZXIKKyAgZnVybml0dXJlPShbXSk7CisKKyAgLy8gQWxsZSBBdXRvbG9hZGVyIGZpbHRlcm4KKyAgb2JzPWZpbHRlcl9vYmplY3RzKGFsbF9pbnZlbnRvcnkodGhpc19vYmplY3QoKSksICJRdWVyeVByb3AiLCBIX0ZVUk5JVFVSRSk7CisgIGZvdW5kID0gMDsKKworICAvLyBVZWJlciBhbGxlIE1vZWJlbCBpdGVyaXRpZXJlbgorICBmb3IoIGk9c2l6ZW9mKG9icyktMTtpPj0wO2ktLSkKKyAgeworICAgIGlmKCBjbG9uZXAob2JzW2ldKSkKKyAgICB7CisgICAgICBpZiAoICsrZm91bmQgPD0gTUFYX0ZVUk5JVFVSRV9QRVJfUk9PTSApCisgICAgICAgIGZ1cm5pdHVyZSArPSAoWyBvYmplY3RfbmFtZShvYnNbaV0pOm9ic1tpXS0+UXVlcnlQcm9wKEhfRlVSTklUVVJFKSBdKTsKKyAgICB9CisgIH0KKyAgaWYgKGZvdW5kID4gTUFYX0ZVUk5JVFVSRV9QRVJfUk9PTSkKKyAgeworICAgIHRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksIAorICAgICAgYnJlYWtfc3RyaW5nKCJEdSBoYXN0ICIrZm91bmQrIiBNb2ViZWxzdHVlY2tlIGltIFJhdW0gc3RlaGVuLiAiCisgICAgICAgICAgICAgICAgICAgIkdlc3BlaWNoZXJ0IHdlcmRlbiBudXIgIitNQVhfRlVSTklUVVJFX1BFUl9ST09NKyIuICIKKyAgICAgICAgICAgICAgICAgICAiRHUgc29sbHRlc3QgRGljaCB2b24gZWluaWdlbiBFaW5yaWNodHVuZ3NnZWdlbnN0YWVuZGVuICIKKyAgICAgICAgICAgICAgICAgICAidHJlbm5lbi4iLDc4KSk7CisKKyAgfQorICBIREVCVUcoIlNhdmluZyAiKyBzaXplb2YgKGZ1cm5pdHVyZSkgKyIgKHBsdXMgIitzaXplb2YoYnJva2VuX2Z1cm5pdHVyZSkrCisgICAgICAgICAiIGJyb2tlbikgb2JqZWN0cyBpbiByb29tICIrCisgICAgICAgICBvYmplY3RfbmFtZSh0aGlzX29iamVjdCgpKSArICIuIik7CisKKyAgc2F2ZV9vYmplY3QoIEhBVVNTQVZFUEFUSCtRdWVyeU93bmVyKDEpKTsKKworICBTZXQoUF9ERVRBSUxTLCBvMSwgRl9WQUxVRSk7CisgIFNldChQX1JFQURfREVUQUlMUywgbzIsIEZfVkFMVUUpOworICBpZiAobzMpCisgICAgU2V0KEhfQ09NTUFORFMsIG8zLCBGX1ZBTFVFKTsKK30KKwordm9pZAorTG9hZCgpCit7CisgIG1peGVkIHByb3A7CisgIGludCBpOworCisgIHJlc3RvcmVfb2JqZWN0KCBIQVVTU0FWRVBBVEgrUXVlcnlPd25lcigxKSk7CisKKyAgLy8gRGV0YWlscyB1bmQgS29tbWFuZG9zIHdlcmRlbiBiZWltIFNwZWljaGVybiBkZS1kdXBsaXppZXJ0IHVuZCBpbiBlaW5lbQorICAvLyBzcGV6aWVsbGVuIEZvcm1hdCBhYmdlc3BlaWNoZXJ0IChzLiBQQ3J1bmNoKCkgaW0gSGF1c3ZlcndhbHRlcikuIFNpZQorICAvLyBtdWVzc2VuIG5hY2ggZGVtIExhZGVuIGR1cmNoIGRpZSBlbnRzcHJlY2hlbmRlbiBBZGQuLi4oKS1BdWZydWZlCisgIC8vIHdpZWRlciBlaW5nZXRyYWdlbiB3ZXJkZW4uCisgIHByb3A9UXVlcnkoUF9ERVRBSUxTLCBGX1ZBTFVFKTsKKyAgUmVtb3ZlRGV0YWlsKDApOworICBpZiAocG9pbnRlcnAocHJvcCkpCisgIHsKKyAgICBmb3JlYWNoKDxzdHJpbmcqfHN0cmluZz4qIGl0ZW0gOiBwcm9wKQorICAgICAgQWRkRGV0YWlsKGl0ZW1bMF0sIGl0ZW1bMV0pOworICB9CisgIGVsc2UgaWYgKG1hcHBpbmdwKHByb3ApKQorICB7CisgICAgZm9yZWFjaChzdHJpbmcga2V5LCBtaXhlZCB2YWwgOiBwcm9wKQorICAgICAgQWRkRGV0YWlsKGtleSwgdmFsKTsKKyAgfQorICBlbHNlCisgICAgU2V0UHJvcChQX0RFVEFJTFMsIHByb3ApOworCisgIHByb3AgPSBRdWVyeShQX1JFQURfREVUQUlMUywgRl9WQUxVRSk7CisgIFJlbW92ZVJlYWREZXRhaWwoMCk7CisgIGlmIChwb2ludGVycChwcm9wKSkKKyAgeworICAgIGZvcmVhY2goPHN0cmluZyp8c3RyaW5nPiogaXRlbSA6IHByb3ApCisgICAgICBBZGREZXRhaWwoaXRlbVswXSwgaXRlbVsxXSk7CisgIH0KKyAgZWxzZSBpZiAobWFwcGluZ3AocHJvcCkpCisgIHsKKyAgICBmb3JlYWNoKHN0cmluZyBrZXksIG1peGVkIHZhbCA6IHByb3ApCisgICAgICBBZGRSZWFkRGV0YWlsKGtleSwgdmFsKTsKKyAgfQorICBlbHNlCisgICAgU2V0UHJvcChQX1JFQURfREVUQUlMUywgcHJvcCk7CisKKyAgcHJvcCA9IFF1ZXJ5KFBfRVhJVFMsIEZfVkFMVUUpOworICBSZW1vdmVFeGl0Tm9DaGVjaygwKTsKKyAgaWYgKG1hcHBpbmdwKHByb3ApKQorICB7CisgICAgaWYgKHdpZHRob2YocHJvcCkgPD0gMSkKKyAgICB7CisgICAgICBmb3JlYWNoKHN0cmluZyBrZXksIHN0cmluZyBkZXN0IDogcHJvcCkKKyAgICAgICAgQWRkRXhpdE5vQ2hlY2soa2V5LCBkZXN0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGZvcmVhY2goc3RyaW5nIGtleSwgc3RyaW5nIGRlc3QsIHN0cmluZyBtc2cgOiBwcm9wKQorICAgICAgeworICAgICAgICBpZiAoc3RyaW5ncChtc2cpKQorICAgICAgICAgIF9BZGRFeGl0KGtleSwgZGVzdCwgbXNnKTsKKyAgICAgICAgZWxzZSBpZiAoc3RyaW5ncChkZXN0KSAmJiBzdHJzdHIoZGVzdCwiIyIpICE9IC0xKQorICAgICAgICAgIEFkZEV4aXROb0NoZWNrKGtleSwgZGVzdCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBfQWRkRXhpdChrZXksIGRlc3QsIDApOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByb3A9UXVlcnkoSF9DT01NQU5EUywgRl9WQUxVRSk7CisgIGlmIChwb2ludGVycChwcm9wKSkKKyAgeworICAgIFNldChIX0NPTU1BTkRTLCAoW10pLCBGX1ZBTFVFKTsKKyAgICBmb3IgKGk9c2l6ZW9mKHByb3ApLTE7IGk+PTA7IGktLSkKKyAgICAgIHRoaXNfb2JqZWN0KCktPkFkZFVzZXJDbWQocHJvcFtpXVswXSwgMCwgcHJvcFtpXVsxXSwgcHJvcFtpXVsyXSk7CisgIH0KKworICBpZiAoZW52aXJvbm1lbnQoKSkKKyAgICBlbnZpcm9ubWVudCgpLT5TZXRQcm9wKFBfTkVWRVJfQ0xFQU4sIDEpOworCisgIGlmIChwcmV2aW91c19vYmplY3QoKSAmJiBvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSk9PVZFUldBTFRFUikKKyAgeworICAgIGlmIChRdWVyeShIX0NIRVNUKSkKKyAgICAgIHRoaXNfb2JqZWN0KCktPkFkZEl0ZW0oUEFUSCsidHJ1aGUiLFJFRlJFU0hfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFsgIm93bmVyIiA6IFF1ZXJ5T3duZXIoKSBdKSk7CisvKiBEYXMgc2NoZWludCBuaXJnZW5kd28gYmVudXR6dCB6dSB3ZXJkZW4gdW5kIGluIGFsbGVuIFNlaGVyaGFldXNlcm4gbGVlciB6dQorICogc2Vpbi4KKyAgICBtYXBwaW5nIHNwZWNpYWwgPSBRdWVyeShIX1NQRUNJQUwsIEZfVkFMVUUpOworICAgIGlmIChzcGVjaWFsKQorICAgIHsKKyAgICAgIGZvcmVhY2goc3RyaW5nIGtleSwgaW50IHR5cGUsIHN0cmluZyBleHRyYSA6IHNwZWNpYWwpCisgICAgICB7CisgICAgICAgIHN3aXRjaCh0eXBlKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSBIU19JVEVNOgorICAgICAgICAgICAgQWRkSXRlbShTUEVDSUFMUEFUSCArIGV4dHJhLCBSRUZSRVNIX0RFU1RSVUNUKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgSFNfRVhJVDoKKyAgICAgICAgICAgIEFkZEV4aXROb0NoZWNrKGtleSwgZXh0cmEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisqLworICB9CisKKyAgLy8gRGFzIExhZGVuIGRlciBBdXRvbG9hZGVyIHdpcmQgZXJzdCBhbSBFbmRlIGFuZ2VzdG9zc2VuLiAKKyAgLy8gRGFubiBpc3QgZXMgbmljaHQgc2NobGltbSwgd2VubiBhbGxlIEV2YWwgVGlja3MgdmVyYnJhdWNodCB3ZXJkZW4uCisgIHN0YXJ0X3JlbG9hZF9mdXJuaXR1cmUoKTsKK30KKworLy8gTWVocmVyZSBTYXZlLUFuZm9yZGVydW5nZW4genVzYW1tZW5mYXNzZW4uCitzdGF0aWMgdm9pZCBxdWV1ZWRfc2F2ZSgpCit7CisgICAgICAgIEhERUJVRygiUVMiKTsKKyAgICAgICAgd2hpbGUgKHJlbW92ZV9jYWxsX291dCgiU2F2ZSIpIT0tMSk7CisgICAgICAgIGNhbGxfb3V0KCJTYXZlIiwzKTsKK30KKworc3RhdGljIGludCByZWxvYWRfZXJyb3Ioc3RyaW5nIGZpbGUsIG1peGVkIGRhdGEsICBzdHJpbmcgbWVzc2FnZSkKK3sKKyAgICAgICAgSERFQlVHKG1lc3NhZ2UpOworICAgICAgICBicm9rZW5fZnVybml0dXJlKz0oW2ZpbGU6ZGF0YV0pOworICAgICAgICBsb2dfZmlsZSgic2VoZXIvaGFldXNlci9hdXRvbG9hZGVyX2Vycm9yIiwKKyAgICAgICAgICAgICAgICAgZHRpbWUodGltZSgpKSsiXG4iKworICAgICAgICAgICAgICAgICBicmVha19zdHJpbmcob2JqZWN0X25hbWUodGhpc19vYmplY3QoKSkrIiAoIitRdWVyeU93bmVyKDEpKyIpIiw3OCwgIiBGSUxFOiAiLDEpKworICAgICAgICAgICAgICAgICBicmVha19zdHJpbmcobWVzc2FnZSwgNzgsICIgTVNHOiAgIiwxKSsKKyAgICAgICAgICAgICAgICAgYnJlYWtfc3RyaW5nKHNwcmludGYoIiVPIiwgZGF0YSksNzgsICIgREFUQTogIiwxKSsiXG4iKTsKKyAgICAgICAgICAgICAgICAgCisgICAgICAgIHJldHVybiAwOyAvLyAwIGZ1ZXIgZGFzIGZpbHRlciwgZGFtaXQgZGllc2VyIEVpbnRyYWcgCisgICAgICAgICAgICAgICAgICAvLyBhdXMgZnVybml0dXJlIGdlbG9lc2NodCB3aXJkLgorfQorCisvLyBMYWVkdCBlaW4gZWluemVsbmVzIE1vZWJlbHN0dWVja3MKK3N0YXRpYyBpbnQgbG9hZF9mdXJuaXR1cmVfb2JqZWN0KCBzdHJpbmcgZmlsZSwgbWl4ZWQgZGF0YSApCit7CisgICAgb2JqZWN0IG9iOworICAgIHN0cmluZyBlcnJvcjsKKyAgICBzdHJpbmcgYmx1ZXByaW50OworICAgIGNsb3N1cmUgcGM7CisgICAgLy8gbWl4ZWQgZGF0YTsKKyAgICAKKyAgICAvLyBXZW5uIGdlbnVnIFRpY2tzIGZyZWkgc2luZCwgd2lyZCB2ZXJzdWNodCwgZGFzIE9iamVrdCB6dSBlcnpldWdlbi4KKyAgICAvLyBBbnNvbnN0ZW4gaXN0IGRpZSBHZWZhaHIgenUgZ3Jvc3MsIGRhc3MgZWluIEVyemV1Z3VuZ3MtUHJvemVzcyBhYmJyaWNodC4KKyAgICBpZiAoZ2V0X2V2YWxfY29zdCgpIDwgNTAwMDAwKSAKKyAgICB7CisgICAgICAvLyBIREVCVUcoIlN1c3BlbmRpbmcgT2JqZWN0OiAiK2ZpbGUrIi4gT25seSAiK3RvX3N0cmluZyhnZXRfZXZhbF9jb3N0KCkpKyIgdGlja3MgbGVmdC4iKTsKKyAgICAgIHJldHVybiAxOyAvLyAxIGJlZGV1dGV0LCBkYXNzIGRpZXNlciBFaW50cmFnIGVzIGltIE1hcHBpbmcgYmxlaWJ0LgorICAgIH0KKworICAgIC8vIEhERUJVRygiUHJvY2Vzc2luZyBPYmplY3Q6ICIrZmlsZSsiIHdpdGggRGF0YTogIitzcHJpbnRmKCIlTyIsZGF0YSkrIi4iKTsKKyAgICAKKyAgICAvLyBOdW1tZXJuIGRlciBDbG9uZXMgc2luZCBiZWltIFNwZWljaGVybiBub2V0aWcsIHVtIGRpZSBJZGVudGl0YWV0ZW4KKyAgICAvLyBkZXIgT2JqZWt0ZSB6dSBiZXN0aW1tZW4gKG1laHJlcmUgT2JqZWt0ZSB2b20gZ2xlaWNoZW4gQmx1ZXByaW50IAorICAgIC8vIHNwZWljaGVybikuIEhpZXIgYnJhdWNodCBtYW4gc2llIG5pY2h0IG1laHIgCisgICAgICAgICAgICAKKyAgICBibHVlcHJpbnQgPSBleHBsb2RlKGZpbGUsIiMiKVswXTsKKyAgICAKKyAgICAvLyBEYXRhIGF1cyBkZW0gTWFwcGluZyBob2xlbgorICAgIC8vIGRhdGE9ZnVybml0dXJlW2ZpbGVdOworICAgIAorICAgIC8vIE11c3MgaWNoIGRpZSBCbHVlcHJpbnQgc3VjaGVuPworICAgIG9iID0gZmluZF9vYmplY3QoZmlsZSk7CisgICAgCisgICAgLy8gTmVpbi4KKyAgICBpZiAoIW9iKQorICAgIHsKKyAgICAgICAgICAgIC8vIEV4aXN0aWVydCBkaWUgQlAgb2RlciBlaW4gVkMgZnVlcnMgRmlsZT8KKyAgICAgICAgaWYgKGZpbGVfc2l6ZShibHVlcHJpbnQrIi5jIik8MCYmCisgICAgICAgICAgIGZpbGVfc2l6ZShpbXBsb2RlKGV4cGxvZGUoYmx1ZXByaW50LCIvIilbMC4uPDJdLCIvIikrCisgICAgICAgICAgICAgICAgICAgICAiL3ZpcnR1YWxfY29tcGlsZXIuYyIpPDApCisgICAgICAgIHsKKyAgICAgICAgICAgcmV0dXJuIHJlbG9hZF9lcnJvcihmaWxlLCBkYXRhLCAiRXJyb3IgaW4gZmlsZTogIisgZmlsZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4gRmlsZSBkb2VzIG5vdCBleGlzdC4iKTsKKworICAgICAgICB9CisKKyAgICAgICAgLy8gRmlsZSBnZWZ1bmRlbi4gVmVyc3VjaCwgZXMgenUgbGFkZW4uCisgICAgICAgIGlmIChlcnJvciA9IGNhdGNoKGNhbGxfb3RoZXIoIGJsdWVwcmludCwiPz8/IikpKQorICAgICAgICB7CisgICAgICAgICAgIHJldHVybiByZWxvYWRfZXJyb3IoZmlsZSwgZGF0YSwgIkVycm9yIGxvYWRpbmcgZmlsZTogIitmaWxlKyIuICIrZXJyb3IpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8vIENsb25lIGVyemV1Z2VuCisgICAgaWYgKCBlcnJvciA9IGNhdGNoKG9iID0gY2xvbmVfb2JqZWN0KGJsdWVwcmludCkpICkKKyAgICB7CisgICAgICAgIHJldHVybiByZWxvYWRfZXJyb3IoZmlsZSwgZGF0YSwgIkVycm9yIGNsb25pbmcgb2JqZWN0OiAiK2ZpbGUrIi4gIitlcnJvcik7CisgICAgfQorIAorICAgIEhERUJVRyhzcHJpbnRmKCIlTyIsZnVybml0dXJlKSk7CisgICAgLy8gQXV0b2xvYWQtRGF0ZW4gc2V0emVuCisgICAgSERFQlVHKG9iamVjdF9uYW1lKG9iKSsiLT5TZXRQcm9wKCIrc3ByaW50ZigiJU8iLCBkYXRhKSsiKSIpOworICAgIGlmIChvYikKKyAgICAgICAgY2F0Y2gob2ItPlNldFByb3AoIEhfRlVSTklUVVJFLCBkYXRhICkpOworICAgICAgICAgICAKKyAgICAvLyBGdXJuaXR1cmUgaW4gZGFzIFNlaGVyaGF1cyBtb3ZlbgorICAgIGlmICggZXJyb3IgPSBjYXRjaChvYi0+bW92ZSggdGhpc19vYmplY3QoKSwgTV9OT0NIRUNLICkpICkgeworICAgICAgICBvYi0+cmVtb3ZlKCk7CisgICAgICAgIGlmKG9iKSBkZXN0cnVjdChvYik7CisgICAgICAgIHJldHVybiByZWxvYWRfZXJyb3IoZmlsZSwgZGF0YSwgIkVycm9yIG1vdmluZyBvYmplY3Q6ICIrZmlsZSsiLiAiK2Vycm9yKTsKKyAgICB9CisKKyAgICAvLyBwb3N0X2NyZWF0ZSBhbnN0b3NzZW4KKyAgICBwYz1zeW1ib2xfZnVuY3Rpb24oInBvc3RfY3JlYXRlIiwgb2IpOworICAgIGlmIChjbG9zdXJlcChwYykpCisgICAgICBjYWxsX291dChwYywgMSk7CisgICAgCisgICAgcmV0dXJuIDA7IC8vIDAgYmVkZXV0ZXQgaGllciwgZGllc2VzIE9iamVrdCBuaWNodCBub2NoIGVpbm1hbCBhbnN0b3NzZW4uCit9CisKK3N0YXRpYyB2b2lkIGxvYWRfZnVybml0dXJlKCkKK3sKKyAgICAgICAgaW50IGk7CisgICAgICAgIHN0cmluZyBydjsKKyAgICAgICAgc3RyaW5nIGN1cnJlbnRfa2V5OworICAgICAgICAKKyAgICAgICAgLy8gQWJicnVjaGJlZGluZ3VuZyBpc3QsIGRhc3MgbmljaHRzIG1laHIgenUgbGFkZW4gaXN0LgorICAgICAgICBpZiAoc2l6ZW9mKGZ1cm5pdHVyZSk9PTApIHJldHVybjsgCisgICAgICAgIAorICAgICAgICAvLyBBbnN0b8OfZW4gZGVzIG5hZWNoc3RlbiBEdXJjaGxhdWZzLCBmYWxscyBkaWUgVGlja3MgbmljaHQgcmVpY2hlbi4KKyAgICAgICAgd2hpbGUgKHJlbW92ZV9jYWxsX291dCgjJ2xvYWRfZnVybml0dXJlKSAhPSAtMSk7CisgICAgICAgIGNhbGxfb3V0KCMnbG9hZF9mdXJuaXR1cmUsIDEpOworICAgICAgICAKKyAgICAgICAgLy8gTGFkZW4gYWxsZXIgTW9lYmVsIGFuc3Rvw59lbgorICAgIGZ1cm5pdHVyZT1maWx0ZXIoZnVybml0dXJlLCAjJ2xvYWRfZnVybml0dXJlX29iamVjdCk7Cit9CisKKy8vIERpZXNlIEZ1bmt0aW9uIGJlcmVpdGV0IGRhcyBSZWxvYWRlbiBkZXIgRWlucmljaHR1bmcgdm9yCitzdGF0aWMgdm9pZCBzdGFydF9yZWxvYWRfZnVybml0dXJlKCkKK3sgIAorICAvLyBXZW5uIGVzIGtlaW5lIE1vZWJlbCBnaWJ0LCBpc3QgZGFzIExhZGVuIGJlZW5kZXQuCisgIGlmICghbWFwcGluZ3AoZnVybml0dXJlKSkgcmV0dXJuOworICBpZiAoYnJva2VuX2Z1cm5pdHVyZT09MCkgYnJva2VuX2Z1cm5pdHVyZT0oW10pOworICAKKyAgLy8gRmFsbHMgZWluIEtleSB2b24gZnVybml0dXJlIDAgaXN0LCB3aXJkIGRpZXNlciBnZWxvZXNjaHQuIAorICBtX2RlbGV0ZShmdXJuaXR1cmUsMCk7CisgIAorICAvLyBMYWRlbiBkZXMgRnVybml0dXJlIGFuc3Rvc3NlbgorICBsb2FkX2Z1cm5pdHVyZSgpOyAgCit9CisKKwpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL21vZHVsZXMvdXNlcmNtZC5jIGIvZC9zZWhlci9oYWV1c2VyL21vZHVsZXMvdXNlcmNtZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4M2I4MTkKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvbW9kdWxlcy91c2VyY21kLmMKQEAgLTAsMCArMSwzNDEgQEAKKy8vICB1c2VyY21kLmMgLS0gTW9kdWwgZnVlciBiZW51dHplcmRlZmluaWVydGUgQmVmZWhsZQorLy8KKy8vICAoYykgMTk5NSBXYXJnb25ATW9yZ2VuR3JhdWVuCisvLworLy8gJElkOiB1c2VyY21kLmMsdiAxLjQgMjAwMy8xMS8xNSAxMzo0ODo0NiBtdWQgRXhwICQKKy8vCisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSAiLi4vaGF1cy5oIgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDx0aGluZy9wcm9wZXJ0aWVzLmg+CisKK3ByaXZhdGUgc3RyaW5nIHVjRmlsdGVyKHN0cmluZyBzdHIpOworcHJpdmF0ZSBzdHJpbmcgdWNUZXh0KHN0cmluZyBzdHIpOworcHJpdmF0ZSB2b2lkIHNwbGl0Q21kKHN0cmluZyAqY21kLCBzdHJpbmcgKnZlcmIsIHN0cmluZyAqcGFyYSk7CisKK2NyZWF0ZSgpCit7CisgIFNldChIX0NPTU1BTkRTLCBTQVZFLCBGX01PREUpOworICBTZXQoSF9DT01NQU5EUywgKFtdKSk7CisKKyAgQWRkQ21kKCIiLCAidXNlckNvbW1hbmRzIiwgMSk7Cit9CisKKy8qCisgKiBBZGRVc2VyQ21kOiBlaWdlbmVzIEtvbW1hbmRvIGhpbnp1ZnVlZ2VuCisgKiAgY21kOiBTdHJpbmcgb2RlciBBcnJheSB2b24gU3RyaW5ncy4gRW50aGFlbHQgZW50d2VkZXIgbnVyIGRpZSBWZXJiZW4gb2RlcgorICogICAgICAgICBkaWUga29tcGxldHRlbiBCZWZlaGxlIChWZXJiICsgUGFyYW1ldGVyKS4gU2llaGUgYXVjaCBwYS4KKyAqICBwYTogIFphaGwgb2RlciBBcnJheSB2b24gU3RyaW5ncy4gRmFsbHMgcGEgZWluZSBaYWhsIGlzdCwgc28gZW50aGFlbHQgY21kCisgKiAgICAgICAgIGRpZSBrb21wbGV0dGVuIEJlZmVobGUgKHNhbXQgUGFyYW1ldGVybikuIEFuc29uc3RlbiBlbnRoYWVsdCBwYSBkaWUKKyAqICAgICAgICAgUGFyYW1ldGVyIGZ1ZXIgZGFzIGVudHNwcmVjaGVuZGUgVmVyYiBpbiBjbWQuCisgKiAgICAgICAgIElzdCBwYSA9ICh7ICJATkZAIn0pICwgc28gaGFuZGVsdCBlcyBzaWNoIHVtIGVpbiBub3RpZnlfZmFpbCwgZGFzIGFuCisgKiAgICAgICAgIGRpZSBCZXNjaHJlaWJ1bmcgZGVzIFZlcmJzIChmYWxscyB2b3JoYW5kZW4pIGFuZ2VoYWVuZ3Qgd2lyZC4KKyAqICBtZTogIFRleHQgZnVlciBkZW4gQXVzZnVlaHJlbmRlbi4gRGVyIFRleHQgbXVzcyBzY2hvbiBnZXBhcnNlZCB3b3JkZW4KKyAqICAgICAgICAgc2VpbiEKKyAqICBvdGg6IFRleHQgZnVlciBkaWUgVW1zdGVoZW5kZW4gb2RlciAwLiBEZXIgVGV4dCBtdXNzIHNjaG9uIGdlcGFyc2VkIHdvci0KKyAqICAgICAgICAgZGVuIHNlaW4hCisgKi8KK3ZhcmFyZ3Mgdm9pZAorQWRkVXNlckNtZChtaXhlZCBjbWQsIG1peGVkIHBhLCBzdHJpbmcgbWUsIHN0cmluZyBvdGgpCit7CisgIGludCB2LHA7CisgIG1hcHBpbmcgY21kcywgZGVzYzsKKyAgc3RyaW5nICp2ZXJiLCAqcGFyYSwgdHh0OworCisgIGNtZHMgPSBRdWVyeShIX0NPTU1BTkRTKTsKKyAgaWYgKHN0cmluZ3AoY21kKSkKKyAgICB2ZXJiID0gKHsgY21kIH0pOworICBlbHNlCisgICAgdmVyYiA9IGNtZDsKKworICBpZiAoaW50cChwYSkpCisgICAgc3BsaXRDbWQodmVyYlswLi5dLCAmdmVyYiwgJnBhcmEpOworICBlbHNlIHsKKyAgICBpZiAoc3RyaW5ncChwYSkpCisgICAgICBwYXJhID0gKHsgcGEgfSk7CisgICAgZWxzZSBpZiAocG9pbnRlcnAocGEpKQorICAgICAgcGFyYSA9IHBhOworICAgIGZvciAoZGVzYyA9IChbXSksIHA9c2l6ZW9mKHBhcmEpLTE7IHA+PTA7IHAtLSkKKyAgICAgIGRlc2MgKz0gKFsgcGFyYVtwXSA6IG1lOyBvdGggXSk7CisgIH0KKworICBmb3IgKHYgPSBzaXplb2YodmVyYiktMTsgdj49IDA7IHYtLSkgeworICAgIGlmIChtZW1iZXIoY21kcywgdmVyYlt2XSkpIHsKKyAgICAgIGlmIChpbnRwKHBhKSkKKyAgICAgICAgY21kc1t2ZXJiW3ZdXSArPSAoW3BhcmFbdl0gOiBtZTsgb3RoIF0pOworICAgICAgZWxzZQorICAgICAgICBjbWRzW3ZlcmJbdl1dICs9IGRlc2M7CisgICAgfQorICAgIGVsc2UgeworICAgICAgaWYgKGludHAocGEpKQorICAgICAgICBjbWRzICs9IChbIHZlcmJbdl0gOiAoW3BhcmFbdl0gOiBtZTsgb3RoIF0pIF0pOworICAgICAgZWxzZQorICAgICAgICBjbWRzICs9IChbIHZlcmJbdl0gOiBkZXNjIF0pOworICAgIH0KKyAgfQorICBTZXQoSF9DT01NQU5EUywgY21kcyk7Cit9CisKKy8qCisgKiBSZW1Vc2VyQ21kOiBLb21tYW5kbyhzKSB3aWVkZXIgZW50ZmVybmVuCisgKiAgY29tOiBTdHJpbmcgb2RlciBBcnJheSB2b24gU3RyaW5ncy4gRW50aGFlbHQgZGFzIHp1IGxvZXNjaGVuZGUgS29tbWFuZG8KKyAqICAgICAgICAgKFZlcmIgb2RlciBWZXJiICsgUGFyYW1ldGVyKS4KKyAqICBhbGw6IEZhbGxzICE9IDAsIHNvIHdlcmRlbiBkaWUgVmVyYmVuIGF1cyBjb20ga29tcGxldHQgbWl0IGFsbGVuIFBhcmEtCisgKiAgICAgICAgIG1ldGVybiBnZWxvZXNjaHQuCisgKi8KK3ZhcmFyZ3Mgdm9pZAorUmVtVXNlckNtZChtaXhlZCBjb20sIGludCBhbGwpCit7CisgIG1hcHBpbmcgY21kLCB0bXA7CisgIHN0cmluZyAqdmVyYiwgKnBhcmE7CisgIGludCB2LCBwOworCisgIGNtZCA9IFF1ZXJ5KEhfQ09NTUFORFMpOworICBzcGxpdENtZChzdHJpbmdwKGNvbSkgPyAoe2NvbX0pIDogY29tLCAmdmVyYiwgJnBhcmEpOworCisgIGlmIChhbGwpCisgICAgZm9yICh2PXNpemVvZih2ZXJiKS0xOyB2Pj0wOyB2LS0pCisgICAgICBjbWQgPSBtX2NvcHlfZGVsZXRlKGNtZCwgdmVyYlt2XSk7CisgIGVsc2UgeworICAgIGZvciAodj1zaXplb2YodmVyYiktMTsgdj49MDsgdi0tKSB7CisgICAgICBpZiAodG1wID0gY21kW3ZlcmJbdl1dKSB7CisgICAgICAgIGZvciAocD1zaXplb2YocGFyYSktMTsgcD49MDsgcC0tKQorICAgICAgICAgIHRtcCA9IG1fY29weV9kZWxldGUodG1wLCBwYXJhW3BdKTsKKyAgICAgICAgY21kW3ZlcmJbdl1dID0gdG1wOworICAgICAgfQorICAgIH0KKyAgfQorICBTZXQoSF9DT01NQU5EUyxjbWQpOworfQorCisvKgorICogdXNlckNvbW1hbmRzOiBBdXN3ZXJ0dW5nIGRlciBiZW51dHplcmRlZmluaWVydGVuIEJlZmVobGUuCisgKi8KK3N0YXRpYyBpbnQKK3VzZXJDb21tYW5kcyhzdHJpbmcgc3RyKQoreworICBtYXBwaW5nIHVjbWQsIHVwYXJtOworICBzdHJpbmcgKnBhcnRzLCB0ZXh0OworICBpbnQgaTsKKworICB1Y21kID0gUXVlcnlQcm9wKEhfQ09NTUFORFMpOworICBzdHIgPSB0aGlzX3BsYXllcigpLT5fdW5wYXJzZWRfYXJncygxKXx8IiI7CisgIGlmICh1cGFybSA9IHVjbWRbcXVlcnlfdmVyYigpXSkgeworICAgIGlmIChtZW1iZXIodXBhcm0sIHN0cikpIHsKKyAgICAgIHRleHQgPSB1Y1RleHQodXBhcm1bc3RyLDBdKTsKKyAgICAgIGlmIChzaXplb2Yob2xkX2V4cGxvZGUodGV4dCwgIlxuIikpID49IHRoaXNfcGxheWVyKCktPlF1ZXJ5UHJvcChQX1NDUkVFTlNJWkUpKQorICAgICAgICB0aGlzX3BsYXllcigpLT5Nb3JlKGNhcGl0YWxpemUodGV4dClbMC4uPDJdKTsKKyAgICAgIGVsc2UKKyAgICAgICAgd3JpdGUoY2FwaXRhbGl6ZSh0ZXh0KSk7CisKKyAgICAgIGlmICh1cGFybVtzdHIsMV0pCisgICAgICAgIHNheSh1Y1RleHQodXBhcm1bc3RyLDFdKSk7CisKKyAgICAgIGlmIChtZW1iZXIobV9pbmRpY2VzKFF1ZXJ5UHJvcChQX0VYSVRTKSksIHF1ZXJ5X3ZlcmIoKSkgPT0gLTEpCisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGlmIChzdHIgJiYgc3RyICE9ICIiICYmIHRleHQgPSB1cGFybVsiQE5GQCJdKQorICAgICAgICBub3RpZnlfZmFpbChpbXBsb2RlKG9sZF9leHBsb2RlKHRleHQsIkBGIiksc3RyKSk7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCisvKioqIEZ1bmN0aW9ucyBwcml2YXRlIHRvIHRoaXMgbW9kdWxlLi4uICoqKi8KKworLyoKKyAqIHVjRmlsdGVyOiBFcnNldHplbiB2b24gTmFtZSwgUGVyc29uYWwtIHVuZCBQb3NzZXNzaXZwcm9ub21lbi4KKyAqICBHaWJ0IGRlbiBlcnNldHp0ZW4gU3RyaW5nIHp1cnVlY2suCisgKi8KK3ByaXZhdGUgc3RyaW5nCit1Y0ZpbHRlcihzdHJpbmcgc3RyKQoreworICBpbnQgcCxnOworCisgIHN3aXRjaChzdHJbMC4uMV0pIHsKKyAgICBjYXNlICJAVyI6IC8vIE5hbWUgaW4gZW50c3ByZWNoZW5kZW0gRmFsbC4uLgorICAgICAgcmV0dXJuIHRoaXNfcGxheWVyKCktPm5hbWUodG9faW50KHN0clsyLi4yXSkpOworICAgIGNhc2UgIkBQIjogLy8gUGVyc29uYWxwcm9ub21lbiBpbiBlbnRwcmVjaGVuZGVtIEZhbGwuLi4KKyAgICAgIHJldHVybiB0aGlzX3BsYXllcigpLT5RdWVyeVByb25vdW4odG9faW50KHN0clsyLi4yXSkpOworICAgIGNhc2UgIkBCIjogLy8gUG9zc2VzaXZwcm9ub21lbiBpbiBlbnRwcmVjaGVuZGVtIEZhbGwuLi4KKyAgICAgIHAgPSB0b19pbnQoc3RyWzQuLjRdKTsKKyAgICAgIGcgPSB0b19pbnQoc3RyWzMuLjNdKTsKKyAgICAgIHJldHVybiB0aGlzX3BsYXllcigpLT5RdWVyeVBvc3NQcm9ub3VuKGcsIHRvX2ludChzdHJbMi4uMl0pLCBwKTsKKyAgfQorICByZXR1cm4gc3RyOworfQorCisvKgorICogdWNUZXh0OiBSYXNzZW4tIHVuZCBnZXNjaGxlY2h0c3NwZXppZmlzY2hlIFRlaWxlIGJlYXJiZWl0ZW4gc293aWUKKyAqICBOYW1lbiB1bmQgUHJvbm9taW5hIGVpbnNldHplbi4KKyAqCisgKiAgc3RyIGVudGhhZWx0IGRlbiBTdHJpbmcsIGRlciBiZWltIEJlc2NocmVpYmVuIGRlcyBCZWZlaGxzCisgKiAgZWluZ2VnZWJlbiB3dXJkZS4gQmlzIGF1ZiBkZW4gRGVmYXVsdC1UZXh0IHNpbmQgYWxsZSBUZWlsZQorICogIG9wdGlvbmFsLiBEZXIgU3RyaW5nIGthbm4gZm9sZ2VuZGVuIEF1ZmJhdSBoYWJlbjoKKyAqICAtLS0tLS0gc2NobmlwcCAtLS0tLS0KKyAqICBEZWZhdWx0LVRleHQsIGRlciBhdXNnZWdlYmVuIHdpcmQsIHdlbm4gZGllIGZvbGdlbmRlbiBzcGV6aWVsbGVyZW4KKyAqICBUZXh0ZSBuaWNodCBhdWZ0cmV0ZW4gb2RlciBhdWYgZGVuIEF1c2Z1ZWhyZW5kZW4gbmljaHQgenV0cmVmZmVuCisgKiAgQE5BTUU6bmFtZUEKKyAqICBUZXh0LCBkZXIgYXVzZ2VnZWJlbiB3aXJkLCB3ZW5uIGRlciBTcGllbGVyICJuYW1lQSIgZGFzIEtvbW1hbmRvCisgKiAgZWluZ2VnZWJlbiBoYXQKKyAqICBATkFNRTpuYW1lQgorICogIFVuZCBzbyB3ZWl0ZXIgZnVlciBTcGllbGVyICJuYW1lQiIgZXRjLi4uCisgKiAgQFJBCisgKiAgVGV4dCwgZGVyIGF1c2dlZ2ViZW4gd2lyZCwgd2VubiBkZXIgQXVzZnVlaHJlbmRlIGF1ZiBkZXIgRXJsYXViZS0KKyAqICBMaXN0ZSBkZXMgSGF1c2VzIHN0ZWh0LgorICogIEBSRQorICogIFRleHQsIGRlciBhdXNnZWdlYmVuIHdpcmQsIHdlbm4gZGVyIEF1c2Z1ZWhyZW5kZSBlaW4gRWxmCisgKiAgaXN0LiBFYmVuc28gZ2lidCBlcyBAUkQgZnVlciBEdW5rZWxlbGZlbiwgQFJGIGZ1ZXIgRmVsaW5lbiwKKyAqICBAUkggZnVlciBIb2JiaXRzLCBAUk0gZnVlciBNZW5zY2hlbiwgQFJHIGZ1ZXIgR29ibGlucyAgdW5kIEBSWiAKKyAqICBmdWVyIFp3ZXJnZS4KKyAqICAtLS0tLS0gc2NobmFwcCAtLS0tLS0KKyAqCisgKiAgRGVyIERlZmF1bHQtVGV4dCBtdXNzIGltbWVyIGFtIEFuZmFuZyBzdGVoZW4uIERpZSBhbmRlcmVuIEJsb2Vja2UKKyAqICBrb2VubmVuIGluIGJlbGllYmlnZXIgUmVpaGVuZm9sZ2UgZm9sZ2VuLiBEaWUgUmVpaGVuZm9sZ2UsIGluIGRlcgorICogIGRpZSBCbG9lY2tlIGJldHJhY2h0ZXQgd2VyZGVuLCBpc3QgZGFiZWkgZm9sZ2VuZGU6CisgKiAgLSB6dWVyc3Qgd2VyZGVuIEBOQU1FLUJsb2Vja2UgdW50ZXJzdWNodAorICogIC0gZGFubiB3aXJkIEBSQSAoRXJsYXViZS1MaXN0ZSkgZ2V0ZXN0ZXQKKyAqICAtIGRhbmFjaCB3aXJkIGRpZSBSYXNzZSB1ZWJlcnBydWVmdCAoQFJEL0BSRS9AUkYvQFJIL0BSTS9AUlovQFJHKQorICogIC0genVsZXR6dCB3aXJkIGRlciBEZWZhdWx0LVRleHQgYmV0cmFjaHRldAorICoKKyAqICBJbm5lcmhhbGIgamVkZXMgZGVyIEJsb2Vja2Uga2FubiBtYW4gbm9jaCBtaXQgQEcgendpc2NoZW4KKyAqICBtYWVubmxpY2hlbiB1bmQgd2VpYmxpY2hlbiBWZXJ0cmV0ZXJuIHVudGVyc2NoZWlkZW4gKGJlaSBATkFNRToKKyAqICBtYWNodCBkYXMgYWJlciB3ZW5pZyBTaW5uKS4gQmVpc3BpZWw6CisgKiAgLS0tLS0tIHNjaG5pcHAgLS0tLS0tCisgKiAgQFJaCisgKiAgRGVyIFp3ZXJnIHdhciBtYWVubmxpY2gKKyAqICBARworICogIERlciBad2VyZyB3YXIgd2VpYmxpY2gKKyAqICAtLS0tLS0gc2NobmFwcCAtLS0tLS0KKyAqCisgKiAgRGllIEZ1bmt0aW9uIGdpYnQgZGVuIGZ1ZXIgZGVuIEF1c2Z1ZWhyZW5kZW4genV0cmVmZmVuZGVuIFRleHQKKyAqICB6dXJ1ZWNrLgorICovCitwcml2YXRlIHN0cmluZwordWNUZXh0KHN0cmluZyBzdHIpCit7CisgIHN0cmluZyAqcGFydHMsICpuYW1lcywgKmxuYW1lczsKKyAgaW50IGksIG47CisKKyAgLy8gVGV4dCBuYWNoIE5hbWVuLSB1bmQgUmFzc2VudHJlbm5lcm4gYXVmdGVpbGVuCisgIHBhcnRzID0gcmVnZXhwbG9kZShzdHIsICIoQE5BTUU6W0EtWmEtejEtOV0qXG4pfChAUltBLVpdXG4pIik7CisgIGkgPSAtMTsKKworICBpZiAoc2l6ZW9mKHBhcnRzKSA+IDEpIHsKKworICAgIC8vIFp1ZXJzdCB3aXJkIG5hY2ggTmFtZW5zdHJlbm5lcm4gZ2VzdWNodAorICAgIG5hbWVzID0gcmVnZXhwKHBhcnRzLCAiQE5BTUU6Iik7CisKKyAgICBpZiAoc2l6ZW9mKG5hbWVzKSA+IDApIHsKKyAgICAgIC8vIGVpbiBrbGVpbmVyIFVtd2VnLCBkYSBkZXIgTmFtZSBpbSBFaW5nYWJlc3RyaW5nIG5pY2h0CisgICAgICAvLyBub3R3ZW5kaWdlcndlaXNlIGluIEtsZWluYnVjaHN0YWJlbiB2b3JsaWVndC4KKyAgICAgIGxuYW1lcyA9IG1hcChuYW1lcywgIydsb3dlcl9jYXNlKTsKKyAgICAgIG4gPSBtZW1iZXIobG5hbWVzLCAiQG5hbWU6IitnZXR1aWQodGhpc19wbGF5ZXIoKSkrIlxuIik7CisKKyAgICAgIGlmIChuID49IDApIHsKKyAgICAgICAgaSA9IG1lbWJlcihwYXJ0cywgbmFtZXNbbl0pOworICAgICAgfQorICAgIH0KKworICAgIC8vIEtlaW4gcGFzc2VuZGVyIE5hbWVuc3RyZW5uZXIgZ2VmdW5kZW46IEVybGF1YmUtTGlzdGUKKyAgICAvLyB1ZWJlcnBydWVmZW4KKyAgICBpZiAoaTwwICYmIGFsbG93ZWRfY2hlY2sodGhpc19wbGF5ZXIoKSkpIHsKKyAgICAgIGk9bWVtYmVyKHBhcnRzLCAiQFJBXG4iKTsKKyAgICB9CisKKyAgICAvLyBXZWRlciBOYW1lbnN0cmVubmVyIG5vY2ggRXJsYXViZS1MaXN0ZSBwYXNzZW46IFJhc3NlCisgICAgLy8gdWViZXJwcnVlZmVuCisgICAgaWYgKGk8MCkgeworICAgICAgc3dpdGNoKHRoaXNfcGxheWVyKCktPlF1ZXJ5UHJvcChQX1JBQ0UpKSB7CisgICAgICAgIGNhc2UgIlp3ZXJnIjoKKyAgICAgICAgICBpPW1lbWJlcihwYXJ0cywgIkBSWlxuIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgIkVsZiI6CisgICAgICAgICAgaT1tZW1iZXIocGFydHMsICJAUkVcbiIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICJGZWxpbmUiOgorICAgICAgICAgIGk9bWVtYmVyKHBhcnRzLCAiQFJGXG4iKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiSG9iYml0IjoKKyAgICAgICAgICBpID0gbWVtYmVyKHBhcnRzLCAiQFJIXG4iKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiRHVua2VsZWxmIjoKKyAgICAgICAgICBpID0gbWVtYmVyKHBhcnRzLCAiQFJEXG4iKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiR29ibGluIjoKKyAgICAgICAgICBpID0gbWVtYmVyKHBhcnRzLCAiQFJHXG4iKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiT3JrIjogCisgICAgICAgICAgaSA9IG1lbWJlcihwYXJ0cywgIkBST1xuIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgaT1tZW1iZXIocGFydHMsICJAUk1cbiIpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvLyBEZW4gcmljaHRpZ2VuIFRlaWwgZGVzIFN0cmluZ3MgaGVyYXVzcGlja2VuCisgICAgaWYgKGk+LTEpCisgICAgICBzdHIgPSBwYXJ0c1tpKzFdOworICAgIGVsc2UKKyAgICAgIHN0ciA9IHBhcnRzWzBdOworICB9CisgIGlmIChzaXplb2YocGFydHMgPSBvbGRfZXhwbG9kZShzdHIsICJAR1xuIikpPT0yKQorICAgIHN0ciA9IHBhcnRzWyh0aGlzX3BsYXllcigpLT5RdWVyeVByb3AoUF9HRU5ERVIpID09IE1BTEUgPyAwIDogMSldOworCisgIHBhcnRzID0gcmVnZXhwbG9kZShzdHIsICIoQFdbMC0zXXxAUFswLTNdfEBCWzAtM11bMC0yXVswLTFdKSIpOworICBwYXJ0cyA9IG1hcChwYXJ0cywgIyd1Y0ZpbHRlcik7CisgIHJldHVybiBpbXBsb2RlKHBhcnRzLCAiIik7Cit9CisKKy8qCisgKiBzcGxpdENtZDogS29tcGxldHRlcyBLb21tYW5kbyBpbiBBcnJheXMgdm9uIFZlcmJlbiB1bmQgUGFyYW1ldGVybiB6ZXJsZWdlbi4KKyAqICBjbWQ6IEFycmF5IHZvbiBTdHJpbmdzLiBEaWVzZXMgQXJyYXkgZW50aGFlbHQgZGllIGF1Znp1c3BhbHRlbmRlbiBCZWZlaGxlLgorICogIHZlcmI6IFJlZmVyZW56IGF1ZiBlaW4gQXJyYXkgdm9uIFN0cmluZ3MgZnVlciBkaWUgVmVyYmVuLgorICogIHBhcmE6IFJlZmVyZW56IGF1ZiBlaW4gQXJyYXkgdm9uIFN0cmluZ3MgZnVlciBkaWUgUGFyYW1ldGVyLgorICovCitwcml2YXRlIHZvaWQgc3BsaXRDbWQoc3RyaW5nICpjbWQsIHN0cmluZyAqdmVyYiwgc3RyaW5nICpwYXJhKQoreworICBpbnQgYywgc3A7CisKKyAgZm9yICh2ZXJiID0gKHt9KSwgcGFyYSA9ICh7fSksIGMgPSBzaXplb2YoY21kKS0xOyBjPj0wOyBjLS0pIHsKKyAgICBpZiAoKHNwPW1lbWJlcihjbWRbY10sICcgJykpID49IDApIHsKKyAgICAgIHZlcmIgKz0gKHsgY21kW2NdWzAuLnNwLTFdIH0pOworICAgICAgcGFyYSArPSAoeyBjbWRbY11bc3ArMS4uXSB9KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICB2ZXJiICs9ICh7IGNtZFtjXSB9KTsKKyAgICAgIHBhcmEgKz0gKHsgIiIgfSk7CisgICAgfQorICB9Cit9CisKKy8vICRMb2c6IHVzZXJjbWQuYyx2ICQKKy8vIFJldmlzaW9uIDEuNCAgMjAwMy8xMS8xNSAxMzo0ODo0NiAgbXVkCisvLyBAUkQgYWxzIFRyZW5uZXIgZnVlciBEdW5rZWxlbGZlbgorLy8KKy8vIFJldmlzaW9uIDEuMyAgMjAwMC8xMi8wMyAxNzoxNTo0MCAgbXVkCisvLyB1Y1RleHQ6IE5ldWVyIFRyZW5uZXIgQE5BTUU6Zm9vLCBtaXQgZGVtIG1hbiBpbiBTZWhlcmhhdXNiZWZlaGxlbgorLy8gVGV4dGUgZnVlciBiZXN0aW1tdGUgU3BpZWxlciB2b3JzZWhlbiBrYW5uLgorLy8KKy8vIFJldmlzaW9uIDEuMiAgMjAwMC8wOC8yMCAyMDozODo0MCAgbXVkCisvLyBAUkYgYWxzIFRyZW5uZXIgZnVlciBGZWxpbmVuCisvLworLy8gUmV2aXNpb24gMS4xLjEuMSAgMjAwMC8wOC8yMCAyMDoyMjo0MiAgbXVkCisvLyBJbnMgQ1ZTIGVpbmdlY2hlY2t0CisvLworLy8gUmV2aXNpb24gMS40ICAxOTk2LzA0LzE5ICAyMzoxMDo1MiAgV2FyZ29uCisvLyBAUkEgZnVlciBMZXV0ZSBtaXQgRXJsYXVibmlzCisvLworLy8gUmV2aXNpb24gMS4zICAxOTk1LzEwLzMxICAxMjo1OTo1MiAgV2FyZ29uCisvLyBAUkggZnVlciBIb2JiaXRzCisvLworLy8gUmV2aXNpb24gMS4yICAxOTk1LzA2LzIyICAxOTo0ODozMSAgV2FyZ29uCisvLyBCdWdmaXggaW4gdXNlckNvbW1hbmRzKCkKKy8vCisvLyBSZXZpc2lvbiAxLjEgIDE5OTUvMDQvMjEgIDA5OjIyOjUwICBXYXJnb24KKy8vIEluaXRpYWwgcmV2aXNpb24KKy8vCmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL2FjY2Vzc19yaWdodHMuYyBiL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvYWNjZXNzX3JpZ2h0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NWNkNTgKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL2FjY2Vzc19yaWdodHMuYwpAQCAtMCwwICsxLDUgQEAKK2ludCBhY2Nlc3NfcmlnaHRzKHN0cmluZyB1c2VyLCBzdHJpbmcgZmlsZSkgeworICBpZih1c2VyID09ICJzd2lmdCIgJiYgZmlsZSE9ImF1dG9sb2FkZXJ0cnVoZS5jIikKKyAgICByZXR1cm4gMTsgIC8vIFN3aWZ0IGhhdCBhdWYgZGllIE1vZWJlbCBadWdyaWZmLgorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvYXV0b2xvYWRlcnRydWhlLmMgYi9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL2F1dG9sb2FkZXJ0cnVoZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMmNlMTcKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL2F1dG9sb2FkZXJ0cnVoZS5jCkBAIC0wLDAgKzEsMTAxNSBAQAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTmFtZSBkZXMgT2JqZWN0czogICAgQXVmYmV3YWhydW5ndHJ1aGUgZnVlciBBdXRvbG9hZC1PYmpla3RlCisvLworLy8gTWFnaWVyOiAgICAgICAgICAgICAgWmVzc3RyYQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI3ByYWdtYSBzdHJvbmdfdHlwZXMscnR0X2NoZWNrcworCisjaW5jbHVkZSAic2NocmFua2xhZGVuLmgiCitpbmhlcml0IExBREVOKCJzd2lmdF9zdGRfY29udGFpbmVyIik7CisKKy8vI2luY2x1ZGUgPGFuc2kuaD4KKyNpbmNsdWRlIDxjbGFzcy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgIi9kL3NlaGVyL2hhZXVzZXIvaGF1cy5oIgorCisjZGVmaW5lIElEUyAgICAgMAorI2RlZmluZSBOQU1FICAgMQorI2RlZmluZSBBTERBVEEgIDIKKworI2RlZmluZSBMT0coeCx5KSBsb2dfZmlsZSh4LHNwcmludGYoIiVzIFslcywgJU8sICVPXTogJXNcbiIsZHRpbWUodGltZSgpKSxcCisgICAgICAodXVpZD91dWlkOiIgIiksUEwsb2JqZWN0X25hbWUoTUUpLHkpKQorI2RlZmluZSBTVE9SRUxPRyh4KSBMT0coInplc3N0cmEvQUxUUlVIRV9TVE9SRS5sb2ciLHgpCisjZGVmaW5lIFBJQ0tMT0coeCkgTE9HKCJ6ZXNzdHJhL0FMVFJVSEVfUElDSy5sb2ciLHgpCisKKyNkZWZpbmUgSVRFTUxPRyh4KSBsb2dfZmlsZSgiemVzc3RyYS9BTFRSVUhFX0lURU1TLmxvZyIsXAorICAgIHNwcmludGYoIiVzIFslT106ICVzXG4iLGR0aW1lKHRpbWUoKSksXAorICAgICAgdGhpc19pbnRlcmFjdGl2ZSgpfHxQTCx4KSkKKworI2RlZmluZSBFUlJMT0coeCkgTE9HKCJ6ZXNzdHJhL0FMVFJVSEUuRVJSIix4KQorCisjdW5kZWYgQlMKKyNkZWZpbmUgQlMoeCkgYnJlYWtfc3RyaW5nKHgsNzgpCisKKyNkZWZpbmUgVkVSU0lPTl9PQkogIjUiCisKKyNpZmRlZiBNQUlOVEFJTkVSCisjdW5kZWYgTUFJTlRBSU5FUgorI2VuZGlmCisjZGVmaW5lIE1BSU5UQUlORVIgKHsiemVzc3RyYSJ9KQorCisvLyBTYXZlZmlsZSBkZXIgQmx1ZXByaW50CisjaWZkZWYgU0FWRUZJTEUKKyN1bmRlZiBTQVZFRklMRQorI2VuZGlmCisjZGVmaW5lIFNBVkVGSUxFIF9fRklMRV9fWy4uPDNdCisKKyNkZWZpbmUgREVCVUcoeCkgICAgaWYgKGZ1bmNhbGwoc3ltYm9sX2Z1bmN0aW9uKCdmaW5kX3BsYXllciksTUFJTlRBSU5FUlswXSkpXAorICAgICAgICAgIHRlbGxfb2JqZWN0KGZ1bmNhbGwoc3ltYm9sX2Z1bmN0aW9uKCdmaW5kX3BsYXllciksTUFJTlRBSU5FUlswXSksXAorICAgICAgICAgICAgICAgICAgICAgICJBTFRydWhlOiAiK3grIlxuIikKKworI2RlZmluZSBBQ0NFU1MgKG15X3NlY3VyZV9sZXZlbCgpID49IEFSQ0hfTFZMKQorCisvLyBEaWVzZSA0IHNpbmQgZnVlciBkaWUgQmx1ZXByaW50IChNYXN0ZXIgYWxsZXIgVHJ1aGVuKQorbWFwcGluZyB3aGl0ZWxpc3Q9KFtdKTsgLy8gZXJsYXVidGUgQXV0b2xvYWRlciwgYWxsZSBhbmRlcmVuIG5pY2h0IGVybGF1YnQuCittYXBwaW5nIGJsYWNrbGlzdD0oW10pOyAvLyBiZXJlaXRzIGV4cGxpeml0IGR1cmNoIEVNKyBhYmdlbGVobnRlIEF1dG9sb2FkZXIKK21hcHBpbmcgdm9yc2NobGFlZ2U9bV9hbGxvY2F0ZSgxLDIpOyAvLyB2b3JzY2hsYWVnZSBkZXIgU3BpZWxlcgorbWFwcGluZyBkYXRhPShbXSk7ICAvLyBoaWVyIHNwZWljaGVydCBkaWUgQlAgYWxsZSBEYXRlbiBkZXIgVHJ1aGVuCisgICAgICAgICAgICAgICAgICAgIC8vIFdJQ0hUSUc6IGRpZXNlcyBNYXBwaW5nIHdpcmQgaW4gL3NlY3VyZS9tZW1vcnkKKyAgICAgICAgICAgICAgICAgICAgLy8gYWJnZWxlZ3QgdW5kIG11c3MgYXVjaCBiZWltIE5ldWxhZGVuIGdnZi4gdm9uIGRvcnQKKyAgICAgICAgICAgICAgICAgICAgLy8gd2llZGVyIGFiZ2Vob2x0IHdlcmRlbi4gQXVzc2VyZGVtIHRlaWxlbiBzaWNoIGFsbGUKKyAgICAgICAgICAgICAgICAgICAgLy8gVHJ1aGVuIGVpbmVzIFNwaWVsZXJzIHVuZCBkaWVzZSBCbHVlcHJpbnQgZGllIE1hcHBpbmdzCisgICAgICAgICAgICAgICAgICAgIC8vIGRhcmluLCBkYW1pdCBBZW5kZXJ1bmdlbiBzb2ZvcnQgaW4gYWxsZW4gVHJ1aGVuIHVuZCBkZW0KKyAgICAgICAgICAgICAgICAgICAgLy8gTWFzdGVyIGJla2FubnQgc2luZC4KKworLyogZGllIGVpbnplbG5lbiBUcnVoZW4gc3BlaWNoZXJuIGluIGF1dG9sb2FkZXIuIEZvcm1hdDogCisgICAzIFdlcnRlIHBybyBLZXksIEtleXMgc2luZCBkaWUgTmFtZW4gZGVyIEJsdWVwcmludHMgZGVyIE9iamVrdGU6CisgICAoWzxibHVlcHJpbnQ+OiA8UF9JRFM+OyA8b2ItPm5hbWUoKT47IDxQX0FVVE9MT0FET0JKPiBdKQorICAgKi8KK25vc2F2ZSBtYXBwaW5nIGF1dG9sb2FkZXI9bV9hbGxvY2F0ZSgxLDMpOworbm9zYXZlIHN0cmluZyB1dWlkOyAvLyBVVUlEIGRlcyBFaWdlbnR1ZW1lcnMKK25vc2F2ZSBvYmplY3Qgb2JfaW5fYmV3ZWd1bmc7IC8vIHVlYmxlciBIYWNrIGVpZ2VudGxpY2guIDotKAorCit2b2lkIE5vdGlmeUluc2VydChvYmplY3Qgb2IsIG9iamVjdCBvbGRlbnYpOworc3RhdGljIG1hcHBpbmcgUXVlcnlEYXRhKCk7CitzdGF0aWMgbWFwcGluZyBTZXREYXRhKG1peGVkIGRhdGEpOworcHJvdGVjdGVkIHZvaWQgc2F2ZV9tZSgpOworcHJvdGVjdGVkIHZvaWQgY2hlY2tfY29udGVudCgpOworCitub21hc2sgcHJpdmF0ZSBpbnQgbXlfc2VjdXJlX2xldmVsKCk7IC8vQXJncy4KKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkgeworCisgIC8vIEphLCBlcyBpcyBBYnNpY2h0LCBkYXNzIGRhcyBjcmVhdGUgZGVyIEJQIGVyc3Qgc3BhZXRlciBhYmdlYnJvY2hlbiB3aXJkIQorICBzd2lmdF9zdGRfY29udGFpbmVyOjpjcmVhdGUoKTsKKworICBzZXRldWlkKGdldHVpZChNRSkpOworCisgIC8vIGZhbGxzIGRpZXMgZGllIEJQIGlzdDoKKyAgLy8gMS4gZGFzIFNhdmVmaWxlIHp1IGxhZGVuLgorICAvLyAyLiB2ZXJzdWNoZW4sIGRpZSB0cnVoZW5kYXRlbiB2b24gL3NlY3VyZS9tZW1vcnkgenUgaG9sZW4sIGRhbWl0IG5hY2ggZGVtCisgIC8vICAgIE5ldWxhZGVuIGRlciBNYXN0ZXIgdW5kIGRpZSBDbGllbnQgaW1tZXIgbmFjaCBfZGllc2VsYmVuXyBNYXBwaW5ncworICAvLyAgICBoYWJlbi4KKyAgaWYgKCFjbG9uZXAoTUUpKQorICB7CisgICAgLy8gU2F2ZWZpbGUgcmVzdGF1cmllcmVuIChhdWNoIHdlbm4gZGF0YSBpbSBNZW1vcnkgaXN0LCBtdXNzIGRhcyBzZWluLAorICAgIC8vIGRhbWl0IGRpZSBhbmRlcmVuIFZhcmlhYmxlbiB3aWVkZXIgZWluZ2VsZXNlbiBzaW5kKS4KKyAgICByZXN0b3JlX29iamVjdChTQVZFRklMRSk7CisgICAgLy8gamV0enQgRGF0ZW4gYXVzIE1lbW9yeSBob2xlbiwgc29mZXJuIHZlcmZ1ZWdiYXIKKyAgICBtYXBwaW5nIHRtcCA9ICIvc2VjdXJlL21lbW9yeSItPkxvYWQoInRydWhlbmRhdGVuIik7CisgICAgaWYgKG1hcHBpbmdwKHRtcCkpCisgICAgeworICAgICAgLy8gRGF0ZW4gYXVzIFNhdmVmaWxlIGR1cmNoIGRpZSB2b20gTWVtb3J5IGVyc2V0emVuCisgICAgICBkYXRhID0gdG1wOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLy8gS2VpbmUgRGF0ZW4gaW4gTWVtb3J5LiBKZXR6dCBpbiBqZWRlbSBGYWxsIGRlbiBQb2ludGVyIGF1ZiBkYXMgTWFwcGluZyBkYXRhIGluCisgICAgICAvLyAvc2VjdXJlL21lbW9yeSBhYmxlZ2VuCisgICAgICBpZiAoIi9zZWN1cmUvbWVtb3J5Ii0+U2F2ZSgidHJ1aGVuZGF0ZW4iLGRhdGEpICE9IDEpCisgICAgICB7CisgICAgICAgIHJhaXNlX2Vycm9yKCJDb3VsZCBub3Qgc2F2ZSBtZW1vcnkgdG8gL3NlY3VyZS9tZW1vcnkuIik7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8vIGJyYXVjaGVuIENsb25lcyBuaWNodC4KKyAgICBzZXRfbmV4dF9yZXNldCgtMSk7CisgICAgZGF0YT0wOyAvLyBicmF1Y2hlbiBDbG9uZXMgbmljaHQuCisgIH0KKworICBTZXRQcm9wKFBfU0hPUlQsICJFaW5lIGtsZWluZSwgbWFnaXNjaGUgSG9senRydWhlIik7CisgIFNldFByb3AoImNudF92ZXJzaW9uX29iaiIsIFZFUlNJT05fT0JKKTsKKyAgU2V0UHJvcChQX05BTUUsICJIb2x6dHJ1aGUiKTsKKyAgU2V0UHJvcChQX0dFTkRFUiwgRkVNQUxFKTsKKyAgU2V0UHJvcChQX05BTUVfQURKLCh7ImtsZWluIiwgIm1hZ2lzY2gifSkpOworICBTZXRQcm9wKFBfTE9ORywgQlMoCisgICAgICJEaWUga2xlaW5lIEhvbHp0cnVoZSBpc3QgYXVzIHN0YWJpbGVtIEVpY2hlbmhvbHogZ2VmZXJ0aWd0LiBFaWdlbnRsaWNoICIKKyAgICAgInNhZWhlIHNpZSByZWNodCB1bnNjaGVpbmJhciBhdXMsIHdhZXJlbiBkYSBuaWNodCBkaWUgdmllbGVuIGt1bnN0dm9sbGVuICIKKyAgICAgIlJ1bmVuIGFuIGRlbiBTZWl0ZW4gdW5kIGF1ZiBkZW0gRGVja2VsLiIpCisgICAgKyJAQGNudF9zdGF0dXNAQCIpOworCisgIEFkZElkKCh7ImF1dG9sb2FkZXJ0cnVoZSIsICJob2x6dHJ1aGUiLCAidHJ1aGUifSkpOworCisgIC8vIGRlbiBSZXN0IHZvbSBDcmVhdGUgYnJhdWNodCBkaWUgQlAgbmljaHQuCisgIGlmICghY2xvbmVwKE1FKSkgcmV0dXJuOworCisgIFNldFByb3AoUF9MT0dfRklMRSwiemVzc3RyYS9BTFRSVUhFLnJlcCIpOworCisgIFNldFByb3AoUF9XRUlHSFQsIDMwMDApOyAgICAgICAgIC8vIEdld2ljaHQgNSBLZworICAvLyBkaWUgZHJlaSBoaWVyIHNpbmQgaW4gZGllc21lIEZhbGwgZWlnZW50bGljaCB2b2VsbGlnIG9obmUgQmVkZXV0dW5nCisgIFNldFByb3AoUF9NQVhfV0VJR0hULCAxMDAwMDAwKTsgIC8vIEVzIHBhc3NlbiBmdWVyIDEwMDAga2cgU2FjaGVuIHJlaW4uCisgIFNldFByb3AoUF9XRUlHSFRfUEVSQ0VOVCwgMTAwKTsKKyAgU2V0UHJvcChQX01BWF9PQkpFQ1RTLCAxMDApOyAgICAgLy8gc2luZCBlaCBpbW1lciAwIGVjaHRlIE9iamVrdGUgZHJpbi4KKworICBTZXRQcm9wKFBfVkFMVUUsIDApOyAgICAgICAgICAgICAvLyBLZWluIG1hdGVyaWVsbGVyIFdlcnQuIElzdCBlaCBuaWNodCB2ZXJrYXVmYmFyLgorICBTZXRQcm9wKFBfTk9CVVksIDEpOyAgICAgICAgICAgICAvLyBXaXJkIGltIExhZGVuIHplcnN0b2VydCwgZmFsbHMgZXIgdmVya2F1ZnQgd2lyZC4KKyAgU2V0UHJvcChQX05PR0VULCAiRGFzIGdlaHQgbmljaHQuICIrTmFtZShXRVIsMSkrIiBoYWZ0ZXQgd2llIG1hZ2lzY2ggYW0gQm9kZW4uXG4iKTsKKyAgU2V0UHJvcChQX01BVEVSSUFMLCAoW01BVF9PQUs6NDksIE1BVF9NSVNDX01BR0lDOjUwLCBNQVRfSk9GSVVNOiAxXSkgKTsKKyAgU2V0UHJvcChQX0lORk8sIEJTKCJJbiBkaWVzZSBzdGFiaWxlIFRydWhlIGthbm5zdCBEdSBiZXN0aW1tdGUgIgorICAgICAgICAiQXV0b2xvYWQtT2JqZWt0ZSBoaW5laW5sZWdlbiB1bmQgc2llIGxhZ2Vybiwgd2VubiBEdSBzaWUgZ2VyYWRlICIKKyAgICAgICAgIm5pY2h0IGJyYXVjaHN0LiAoTWl0ICdkZXBvbmllcmUgPHdhcz4nIGthbm5zdCBEdSBldHdhcyBpbiBkZXIgIgorICAgICAgICAiVHJ1aGUgenVyIEF1ZmJld2FocnVuZyBkZXBvbmllcmVuLCBtaXQgJ2VudG5laG1lIDx3YXM+IG9kZXIgIgorICAgICAgICAiJ25pbW0gPHdhcz4gYXVzIHRydWhlJyBrYW5uc3QgRHUgZWluZW4gR2VnZW5zdGFuZCB3aWVkZXIgIgorICAgICAgICAiaGVyYXVzbmVobWVuLikiKSk7CisKKyAgLy8gUHJvcCBmdWVyIHJlYm9vdGZlc3RlIE1vZWJlbAorICAvLyBEZXIgZW5kZ3VlbHRpZ2UgV2VydCAoVVVJRCBkZXMgU3BpZWxlcnMpIHdpcmQgcGVyIFNldEJlc2l0emVyKCkgZ2VzZXR6dCwKKyAgLy8gc29iYWxkIGRpZSBUcnVoZSBkYXMgZXJzdGUgTWFsIGluIGVpbiBTZWhlcmhhdXMgYmV3ZWd0IHd1cmRlLgorICBTZXRQcm9wKEhfRlVSTklUVVJFLCAxKTsKKworICBBRCgoeyJwbGF0eiIsImdyb2Vzc2UifSksIAorICAgICAgQlMoIkRpZSBUcnVoZSBpc3QgcmVjaHQga2xlaW4sIGFiZXIgbWVya3d1ZXJkaWdlcndlaXNlICIKKyAgICAgICAgInNjaGVpbnQgc2llIHZpZWwgbWVociBhbiBHZWdlbnN0YWVuZGVuIGF1Zm5laG1lbiB6dSBrb2VubmVuLCBhbHMgIgorICAgICAgICAiZXMgdm9uIGlocmVyIEdyb2Vzc2UgaGVyIHNjaGVpbnQuIikpOworICBBRCgoeyJnZWdlbnN0YW5kIiwiZ2VnZW5zdGFlbmRlIn0pLAorICAgICAgQlMoIkRpZSBUcnVoZSBzY2hlaW50IHp3YXIgdmllbGVuIEdlZ2Vuc3RhZW5kZW4gUGxhdHogenUgYmlldGVuLCBhYmVyICIKKyAgICAgICAgImRhZnVlciBuaW1tdCBzaWUgbmljaHQgamVkZW4gR2VnZW5zdGFuZCBhdWYuIikpOworICBBRCgoeyJob2x6IiwiZWljaGVuaG9seiJ9KSwKKyAgICAgIEJTKCJEYXMgRWljaGVuaG9seiBpc3Qgc2VociBzdGFiaWwuIEVzIGlzdCBnYW56IGdsYXR0IGdlc2NobGlmZmVuIHVuZCAiCisgICAgICAgICJ0cmFlZ3QgdmllbGUga3Vuc3R2b2xsZSBSdW5lbiBpbiBzaWNoLiIpKTsKKyAgQUQoKHsic2VpdGVuIiwic2VpdGUifSksCisgICAgICBCUygiRGllIFRydWhlIGhhdCA0IFNlaXRlbiwgZGllIGFsbGVzYW10IG1pdCBSdW5lbiB2ZXJ6aWVydCBzaW5kLiIpKTsKKyAgQUQoKHsiYm9kZW4ifSksCisgICAgICBCUygiRGVyIEJvZGVuIGRlciBUcnVoZSB0cmFlZ3Qga2VpbmVybGVpIFJ1bmVuLiIpKTsKKyAgQUQoKHsiZGVja2VsIn0pLAorICAgICAgQlMoIkF1Y2ggZGVyIERlY2tlbCBkZXIgVHJ1aGUgaXN0IG1pdCBSdW5lbiB2ZXJ6aWVydC4iKSk7CisgIEFEKCh7InJ1bmVuIiwicnVuZSJ9KSwKKyAgICAgIEJTKCJEaWUgUnVuZW4gYmVkZWNrZW4gYWxsZSA0IFNlaXRlbiB1bmQgZGVuIERlY2tlbCBkZXIgVHJ1aGUuIE1hbiAiCisgICAgICAgICJoYXQgc2llIHp3ZWlmZWxsb3MgaW4gbXVlaHNhbWVyIEFyYmVpdCBhdXMgZGVtIGhhcnRlbiBIb2x6ICIKKyAgICAgICAgImdlc2Nobml0enQuIEFuc2NobGllc3NlbmQgd3VyZGVuIHNpZSBvZmZlbmJhciBtaXQgZWluZW0gIgorICAgICAgICAiTWV0YWxsIGdlZnVlbGx0LiBEdSB2ZXJzdGVoc3QgendhciB1ZWJlcmhhdXB0IG5pY2h0LCB3YXMgIgorICAgICAgICAiZGllIFJ1bmVuIGJlZGV1dGVuLCBhYmVyIHNpZSBzaW5kIGJlc3RpbW10IG1hZ2lzY2gsIGRlbm4gd2FubiBpbW1lciAiCisgICAgICAgICJEdSBkZW4gRGVja2VsIG9lZmZuZXN0IG9kZXIgc2NobGllc3N0IG9kZXIgR2VnZW5zdGFlbmRlIGhpbmVpbmxlZ3N0ICIKKyAgICAgICAgIm9kZXIgaGVyYXVzbmltbXN0LCBsZXVjaHRlbiBkaWUgUnVuZW4gaGVsbCBhdWYuIikpOworICBBRCgoeyJtZXRhbGwifSksCisgICAgICBCUygiV2FzIGRhcyB3b2hsIGZ1ZXIgZWluIE1ldGFsbCBzZWluIG1hZz8gWndlaWZlbGxvcyBoYXQgZXMgYXVjaCB3YXMgIgorICAgICAgICAibWl0IE1hZ2llIHp1IHR1bi4iKSk7CisgIEFEKCh7Im1hZ2llIn0pLAorICAgICAgQlMoIkluIGRpZXNlciBUcnVoZSBzY2hlaW50IHZpZWwgTWFnaWUgenUgc3RlY2tlbiwgd2VubiBzZWxic3QgZWluICIKKyAgICAgICAgIldlbHR1bnRlcmdhbmcgaWhyIG5pY2h0cyBhbmhhYmVuIGthbm4uIikpOworICBBRCgoeyJhcmJlaXQiLCJmZXJ0aWd1bmcifSksCisgICAgICBCUygiRGllIEZlcnRpZ3VuZyBkaWVzZXIgVHJ1aGUgbXVzcyBzZWhyIGF1ZndlbmRpZyBnZXdlc2VuIHNlaW4uICIKKyAgICAgICAgIktlaW4gV3VuZGVyLCBkYXNzIGRpZSBUcnVoZSBzbyB0ZXVlciBpc3QuIikpOworICBBRCgoeyJ3dW5kZXIifSksCisgICAgICBCUygiRWluIFd1bmRlciBzY2hlaW50IGVzIHp1IHNlaW4uIikpOworICBBRCgoeyJ3ZWx0dW50ZXJnYW5nIiwiYXJtYWdlZGRvbiJ9KSwKKyAgICAgIEJTKCJEaXIgc2NoYXVkZXJ0IGJlaW0gR2VkYW5rZW4gYW4gZGVuIFdlbHR1bnRlcmdhbmcuIikpOworICBBRCgoeyJnZWRhbmtlbiJ9KSwKKyAgICAgIEJTKCJEZW5rIGRvY2ggbGllYmVyIGFuIHdhcyBhbmRlcmVzLi4uIikpOworCisgIEFkZENtZCgiZGVwb25pZXJ8ZGVwb25pZXJlJkBQUkVTRU5UIiwiY21kX2RlcG9uaWVyZSIsCisgICAgICAiV2FzIG1vZWNodGVzdCBEdSBpbiBkZXIgRWljaGVuaG9senRydWhlIGRlcG9uaWVyZW4/Iik7CisgIEFkZENtZCgiZW50bmltbXxlbnRuZWhtZXxlbnRuZWhtIiwiY21kX2VudG5laG1lbiIpOworCisgIC8vIGJlaSBkaWVzZXIgVHJ1aGUgd2FlcmUgZGFzIEVybGF1YmVuIHZvZWxsaWcgc2lubmxvcy4gOy0pCisgIFJlbW92ZUNtZCgoeyJzZXJsYXViZSJ9KSk7CisKK30KKworLy8ga2VpbmUgVHJ1aGVuIHplcnN0b2VyZW4sIGRpZSBpcmdlbmRlaW5lbiBJTmhhbHQgaGFiZW4uCitpbnQgemVydHJ1ZW1tZXJuKHN0cmluZyBzdHIpIHsKKyAgLy8gYXVzIHN3aWZ0X3N0ZF9jb250YWluZXIKKyAgc3RyaW5nIG5mX3N0cjsKKyAgbmZfc3RyPSJTeW50YXg6IHplcnRydWVtbWVyIFtPYmpla3QtSWRdXG4iCisgICAgICAgICsiQnNwLjogICB6ZXJ0cnVlbW1lciAiK1F1ZXJ5UHJvcChQX0lEUylbMV0rIlxuIjsKKyAgbm90aWZ5X2ZhaWwoIkZlaGxlcjogT2huZSBQYXJhbWV0ZXIga2xhcHB0IGRhcyBuaWNodC5cbiIrbmZfc3RyKTsKKyAgaWYoIXN0cikgcmV0dXJuIDA7CisgIG5vdGlmeV9mYWlsKCJGZWhsZXI6IER1IG11c3N0IGVpbmUgZ3VlbHRpZ2UgT2JqZWt0LUlkIGFuZ2ViZW4hXG4iK25mX3N0cik7CisgIGlmKHByZXNlbnQoc3RyKSE9VE8pICAgLy8gVWViZXJwcnVlZmUsIG9iIGF1Y2ggZGllc2VzIE9iamVrdCBnZW1laW50IGlzdCEKKyAgICByZXR1cm4gMDsKKyAgaWYoIFF1ZXJ5SGF1c2Jlc2l0emVyKCkgIT0gUXVlcnlUUCgpICYmICFRdWVyeVByb3AoInRlc3QiKSApCisgIHsKKyAgICB3cml0ZSggQlMoIk51ciAiK1F1ZXJ5SGF1c2Jlc2l0emVyKCkrIiBkYXJmICIrbmFtZShXRU4sMSkrIiB6ZXJ0cnVlbW1lcm4hIikpOworICAgIHJldHVybiAxOworICB9CisgIC8vIE9iamVrdGUgZW50aGFsdGVuPyBXZW5uIGphLCBhYmJydWNoLgorICBpZiAoc2l6ZW9mKGF1dG9sb2FkZXIpKSB7CisgICAgdGVsbF9vYmplY3QoUEwsQlMoIkR1IHdpbGxzdCBnZXJhZGUgenVtIFNjaGxhZyBhdXNob2xlbiwgdW0gIgorICAgICAgICAgICtuYW1lKFdFTiwxKSsgIiB6dSB6ZXJ0cnVlbW1lcm4sIGFscyBEaXIgZWluZmFlbGx0LCBkYXNzICIKKyAgICAgICAgICArUXVlcnlQcm9ub3VuKFdFUikrICIgamEgZ2FyIG5pY2h0IGxlZXIgaXN0ISBOZW5lLCB3ZXIgd2Vpc3MsIG9iICIKKyAgICAgICAgICAiRHUgZGFzIG5pY2h0IG5vY2ggYnJhdWNoZW4ga29lbm50ZXN0LiIpKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICAvLyBzb25zdCBnZWVyYnRlbiBLcmFtIGF1c2Z1ZWhyZW4uCisgIHJldHVybiA6OnplcnRydWVtbWVybihzdHIpOworfQorCisvLyBaZXNzdHJhLCAxLjcuMDcsIGZ1ZXJzIEhvZXJyb2hyCitzdHJpbmcgR2V0T3duZXIoKSB7cmV0dXJuICJ6ZXNzdHJhIjt9CisKKy8vIFBydWVmdCBkYXMgT2JqZWt0IGF1ZiBFaWdudW5nIGZ1ZXIgZGllIFRydWhlLCBzcGVpY2hlcnQgc2VpbmUgRGF0ZW4gdW5kCisvLyB6ZXJzdG9lcnQgZXMgYW5zY2hsaWVzc2VuZC4gTk9EUk9QLU9iamVrdGUga29lbm5lbiBudXIgc28gaW4gZGllIFRydWhlCisvLyBnZWxlZ3Qgd2VyZGVuLCBhbGxlIGFuZGVyZW4ga29lbm5lbiBhdWNoIG1pdCAic3RlY2tlIC4uLiBpbiB0cnVoZSIKKy8vIGRlcG9uaWVydCB3ZXJkZW4sIHdvcmF1ZmhpbiBlYmVuZmFsbHMgUHJldmVudEluc2VydCgpIHVuZCBOb3RpZnlJbnNlcnQoKQorLy8gZHVyY2hsYXVmZW4gd2VyZGVuLgorcHJvdGVjdGVkIGludCBjbWRfZGVwb25pZXJlKHN0cmluZyBjbWQsIG1peGVkIGFyZ3MpIHsKKyAgaWYgKCFvYmplY3RwKFBMKSkgcmV0dXJuIDA7CisKKyAgbm90aWZ5X2ZhaWwoTmFtZShXRVIsMSkrIiBpc3QgZG9jaCBnZXNjaGxvc3NlbiFcbiIpOworICBpZihRdWVyeVByb3AoUF9DTlRfU1RBVFVTKSE9Q05UX1NUQVRVU19PUEVOKSByZXR1cm4gMDsKKyAgCisgIG5vdGlmeV9mYWlsKCJXYXMgbW9lY2h0ZXN0IER1IGluIGRlciBFaWNoZW5ob2x6dHJ1aGUgZGVwb25pZXJlbj9cbiIpOworICBpZiAoIXN0cmluZ3AoY21kKSB8fCAhc2l6ZW9mKGNtZCkgCisgICAgICB8fCAhcG9pbnRlcnAoYXJncykgfHwgIXNpemVvZihhcmdzKSkgcmV0dXJuIDA7CisgIG9iamVjdCBvYj1hcmdzWzBdOworICBpZiAoIW9iamVjdHAob2IpKSByZXR1cm4gMDsKKyAgLy8gd3VlcmRlIGRpZSBUcnVoZSBkYXMgT2JqZWt0IHVlYmVyaGF1cHQgYXVmbmVobWVuPyBGZWhsZXJhdXNnYWJlIGR1cmNoCisgIC8vIFByZXZlbkluc2VydCgpCisgIGlmIChQcmV2ZW50SW5zZXJ0KG9iKSkgcmV0dXJuIDE7CisgIC8vIEF1c3ppZWhlbi4uLiBTY2hhZGUsIGRhc3MgRG9VbndlYXIgbml4IHZlcm51ZW5mdGlnZXMgYW4gUnVlY2tnYWJld2VydAorICAvLyBoYXQuIDotKAorICBpZiAob2JqZWN0cChvYi0+UXVlcnlQcm9wKFBfV09STikpKSB7CisgICAgb2ItPkRvVW53ZWFyKCk7CisgICAgaWYgKG9iamVjdHAob2ItPlF1ZXJ5UHJvcChQX1dPUk4pKSkgeworICAgICAgdGVsbF9vYmplY3QoUEwsIEJTKCJEdSBtdXNzdCAiKyBvYi0+bmFtZShXRU4sMSkrICJ6dW5hZWNoc3QgZWlubWFsICIKKyAgICAgICAgICAgICJhdXN6aWVoZW4hIikpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisgIC8vIHdlZ3N0ZWNrZW4KKyAgaWYgKG9iamVjdHAob2ItPlF1ZXJ5UHJvcChQX1dJRUxERUQpKSkgeworICAgIG9iLT5Eb1Vud2llbGQoKTsKKyAgICBpZiAob2JqZWN0cChvYi0+UXVlcnlQcm9wKFBfV0lFTERFRCkpKSB7CisgICAgICB0ZWxsX29iamVjdChQTCwgQlMoIkR1IG11c3N0ICIrIG9iLT5uYW1lKFdFTiwxKSsgInp1bmFlY2hzdCBlaW5tYWwgIgorICAgICAgICAgICAgIndlZ3N0ZWNrZW4hIikpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisgIC8vIE5PX0NIRUNLIHVuZCBTaWxlbnQtQmV3ZWd1bmcsIE1lbGR1bmdlbiBhbiBkZW4gU3BpZWxlciBzZWxiZXIgbWFjaGVuLgorICB0ZWxsX29iamVjdChQTCwgQlMoIkR1IHN0ZWNrc3QgIisgb2ItPm5hbWUoV0VOLDEpICsgIiBpbiAiICsgbmFtZShXRU4sMSkgKworICAgICAgIi4iKSk7CisgICAgCisgIHRlbGxfcm9vbShlbnZpcm9ubWVudCgpLEJTKFBMLT5OYW1lKFdFUikgKyAiIGxlZ3QgIiArIG9iLT5uYW1lKFdFTiwwKSArCisgICAgICAiIGluICIgKyBuYW1lKFdFTiwxKSArICIgaGluZWluLiIpLCh7UEx9KSk7CisgIG9iLT5tb3ZlKE1FLCBNX05PQ0hFQ0t8TV9TSUxFTlQpOworICByZXR1cm4gMTsKK30KKworLy8gYWx0ZXJuYXRpdmUgenVtICJuaW1tIGJsYSBhdXMgdHJ1aGUiLiBTcGllbGVyIHdvbGx0ZW4gd2FzIGt1cnplcyBkYWZ1ZXIKKy8vIGhhYmVuLgorcHJvdGVjdGVkIGludCBjbWRfZW50bmVobWVuKHN0cmluZyBjbWQpIHsKKyAgaW50IHJlczsKKyAgbWl4ZWQgbm9nZXQ7CisKKyAgaWYgKCFvYmplY3RwKFBMKSkgcmV0dXJuIDA7CisKKyAgbm90aWZ5X2ZhaWwoTmFtZShXRVIsMSkrIiBpc3QgZG9jaCBnZXNjaGxvc3NlbiFcbiIpOworICBpZihRdWVyeVByb3AoUF9DTlRfU1RBVFVTKSE9Q05UX1NUQVRVU19PUEVOKSByZXR1cm4gMDsKKworICBub3RpZnlfZmFpbChCUygiV2FzIG1vZWNodGVzdCBEdSBhdXMgIituYW1lKFdFTSwxKSsgIiBlbnRuZWhtZW4/XG4iKSk7CisgIGlmICghc3RyaW5ncChjbWQpIHx8ICFzaXplb2YoY21kKSkgcmV0dXJuIDA7CisKKyAgb2JqZWN0ICpvYnM9cHJlc2VudF9vYmplY3RzKGNtZCk7CisKKyAgaWYgKCFzaXplb2Yob2JzKSB8fCAhb2JqZWN0cChvYnNbMF0pKQorICAgIHJldHVybiAwOworCisgIC8vIE5PR0VUIGlzdCBoaWVyIGJsb2VkLiBTbyBpc3QgZXMgendhciBhdWNoIG5pY2h0IHJpY2h0aWcgZG9sbC4uLiAqc2V1ZnoqCisgIC8vIERpZSBoaWVyIGlzdC93YWVyZSBhYmVyIG5lbiB1ZWJsZXIgSGFjaywgZXJzdG1hbCBhdXNrb21tZW50aWVydCBsYXNzZW4uCisgIC8vIGFsc28sIFBfTk9HRVQgc2ljaGVybi4KKyAgLyppZiAoIWNsb3N1cmVwKG5vZ2V0PW9iLT5RdWVyeShQX05PR0VULEZfUVVFUllfTUVUSE9EKSkpIHsKKyAgICBub2dldD1vYi0+UXVlcnkoUF9OT0dFVCxGX1ZBTFVFKTsKKyAgICBvYi0+U2V0KFBfTk9HRVQsMCxGX1ZBTFVFKTsKKyAgfQorICBlbHNlIHsKKyAgICBvYi0+U2V0KFBfTk9HRVQsMCxGX1FVRVJZX01FVEhPRCk7CisgIH0qLworICAvLyBuZWhtZW4uCisgIHJlcz1QTC0+cGlja19vYmoob2JzWzBdKTsKKyAgLy8gUF9OT0dFVCB6dXJ1ZWNrc2NocmVpYmVuLiAoSmEsIHdlbm4gZWluZSBDbG9zdXJlIGFscyBGX1ZBTFVFIGRyaW5zdGVodCwKKyAgLy8gbGFuZGV0IGRpZSBqZXR6dCBhbHMgRl9RVUVSWV9NRVRIT0QgaW0gT2JqZWt0LgorICAvKmlmIChjbG9zdXJlcChub2dldCkpIHsKKyAgICBvYi0+U2V0KFBfTk9HRVQsbm9nZXQsRl9RVUVSWV9NRVRIT0QpOworICB9CisgIGVsc2UKKyAgICBvYi0+U2V0KFBfTk9HRVQsbm9nZXQsRl9WQUxVRSk7CisqLworICByZXR1cm4ocmVzKTsKK30KKworLy8gSGllciB3aXJkIGF1Y2ggZGFzIFByZXZlbnRJbnNlcnQoKSB2b24gZGVyIEJsdWVwcmludCBnZXJ1ZmVuLiBEYXMKKy8vIGVybGVpY2h0ZXJ0IGVzLCBkaWUgTGlzdGUgYW4gZXJsYXVidGVuIE9iamVrdGVuIHp1IGFlbmRlcm4sIG9obmUgZGFzcyBtYW4KKy8vIGFsbGUgQ2xvbmVzIGVyc2V0emVuIG11c3MuCit2YXJhcmdzIGludCBQcmV2ZW50SW5zZXJ0KG9iamVjdCBvYikgeworICBzdHJpbmcgb25hbWU7CisgIC8vIERhcyBPYmpla3QsIHdhcyBkaWUgVHJ1aGUgZ2VyYWRlIHNlbGJlciBiZXdlZ3QsIHdpcmQgaWdub3JpZXJ0LgorICBpZiAoIW9iamVjdHAob2IpIHx8IG9iX2luX2Jld2VndW5nPT1vYikgcmV0dXJuIDA7CisgIAorICBvbmFtZT1CTFVFX05BTUUob2IpOworICAKKyAgLy8gUHJ1ZWZ1bmcgaW4gQ2xvbmVuOgorICBpZiAoY2xvbmVwKE1FKSkKKyAgeworICAgIC8vIG51ciBFaWdlbnR1ZW1lcgorICAgIGlmICghc3RyaW5ncCh1dWlkKSB8fCAhc2l6ZW9mKHV1aWQpKSB7CisgICAgICBpZiAob2JqZWN0cChQTCkpCisgICAgICAgIHRlbGxfb2JqZWN0KFBMLEJTKHNwcmludGYoIiVzIGdlaG9lcnQgRGlyIG5pY2h0LCBkYWhlciBrYW5uc3QgRHUgIgorICAgICAgICAgICAgImF1Y2gga2VpbmUgR2VnZW5zdGFlbmRlIGluICVzIGxlZ2VuLiIsCisgICAgICAgICAgICBOYW1lKFdFUiwxKSxRdWVyeVByb25vdW4oV0VOKSkpKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoIW9iamVjdHAoUEwpIHx8IGdldHV1aWQoUEwpIT11dWlkKSB7CisgICAgICBpZiAob2JqZWN0cChQTCkpCisgICAgICAgIHRlbGxfb2JqZWN0KFBMLEJTKHNwcmludGYoIk51ciAlcyBkYXJmIEdlZ2Vuc3RhZW5kZSBpbiAlcyAiCisgICAgICAgICAgImhpbmVpbmxlZ2VuLiIsY2FwaXRhbGl6ZShleHBsb2RlKHV1aWQsIl8iKVswXSksbmFtZShXRU4sMSkpKSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgLy8gamVkZXMgT2JqZWt0IG51ciBlaW5tYWwuCisgICAgaWYgKG1lbWJlcihhdXRvbG9hZGVyLG9uYW1lKSkgeworICAgICAgaWYgKG9iamVjdHAoUEwpKQorICAgICAgICB0ZWxsX29iamVjdChQTCxCUyhOYW1lKFdFUiwxKSsgIiBrYW5uIHZvbiBlaW5lbSBHZWdlbnN0YW5kIGpld2VpbHMgIgorICAgICAgICAgICJudXIgZWluIEV4ZW1wbGFyIGF1Zm5laG1lbiwgZXMgaXN0IGFiZXIgYmVyZWl0cyAiCisgICAgICAgICAgK29iLT5uYW1lKFdFUiwwKSArICIgaW4gIiArIFF1ZXJ5UHJvbm91bihXRU0pICsgIi4iKSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgLy8gamV0enQgRXJsYXVibmlzbGlzdGUgZGVyIEJQIGZyYWdlbi4KKyAgICBpZiAob2JqZWN0cChibHVlcHJpbnQoTUUpKSkKKyAgICAgIHJldHVybiBibHVlcHJpbnQoTUUpLT5QcmV2ZW50SW5zZXJ0KG9iKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gbG9hZF9vYmplY3QobG9hZF9uYW1lKE1FKSktPlByZXZlbnRJbnNlcnQob2IpOworICB9CisgIC8vIEVuZGUgZnVlciBQcnVlZnVuZyBmdWVyIENsb25lLgorCisgIC8vIGFiIGhpZXIgamV0enQgZGllIFBydWVmdW5nIGR1cmNoIGRpZSBCUC4KKyAgLy8gS2VpbmUgKGZyZWlnZWdlYmVuZXIpIEF1dG9sb2FkZXI/IEhhdCBpbiBkaWVzZW0gQ29udGFpbmVyIG5peCB2ZXJsb3JlbiEKKyAgaWYoICFvYi0+UXVlcnlQcm9wKFBfQVVUT0xPQURPQkopICkgeworICAgIGlmIChvYmplY3RwKFBMKSkKKyAgICAgIHRlbGxfb2JqZWN0KFBMLEJTKCJJbiAiK25hbWUoV0VOLDEpCisgICAgICAgICAgICArIiBrYW5uc3QgRHUgbnVyIEF1dG9sb2FkLU9iamVrdGUgaGluZWlubGVnZW4uICIpKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBlbHNlIGlmIChtZW1iZXIoYmxhY2tsaXN0LG9uYW1lKSkgeworICAgIGlmIChvYmplY3RwKFBMKSkKKyAgICAgIHRlbGxfb2JqZWN0KFBMLEJTKCJJbiAiK25hbWUoV0VOLDEpCisgICAgICAgICAgICArIiBrYW5uc3QgRHUgbnVyIGRhZnVlciBlcmxhdWJ0ZSBBdXRvbG9hZC1PYmpla3RlIGhpbmVpbmxlZ2VuLiAiCisgICAgICAgICAgICArb2ItPk5hbWUoV0VSLDEpICsgIiB3dXJkZSBleHBsaXppdCBhbHMgbmljaHQgZXJ3dWVuc2NodCAiCisgICAgICAgICAgICAiYmVmdW5kZW4uIikpOworICAgIHJldHVybiAxOworICB9CisgIGVsc2UgaWYgKCFtZW1iZXIod2hpdGVsaXN0LG9uYW1lKSkgeworICAgIGlmICghbWVtYmVyKHZvcnNjaGxhZWdlLG9uYW1lKSkgeworICAgICAgdm9yc2NobGFlZ2Vbb25hbWUsMF09b2ItPm5hbWUoV0VSLDApIHx8ICIiOworICAgICAgdm9yc2NobGFlZ2Vbb25hbWUsMV09b2ItPnNob3J0KCkgfHwgIiI7CisgICAgfQorICAgIGlmIChvYmplY3RwKFBMKSkKKyAgICAgIHRlbGxfb2JqZWN0KFBMLEJTKCJJbiAiK25hbWUoV0VOLDEpCisgICAgICAgICAgICArIiBrYW5uc3QgRHUgbnVyIGRhZnVlciBlcmxhdWJ0ZSBBdXRvbG9hZC1PYmpla3RlIGhpbmVpbmxlZ2VuLiAiCisgICAgICAgICAgICArb2ItPk5hbWUoV0VSLDEpICsgIiBpc3QgbW9tZW50YW4gbmljaHQgYXVmIGRlciBMaXN0ZS4gRGVyICIKKyAgICAgICAgICAgICJHZWdlbnN0YW5kIHd1cmRlIGpldHp0IGFscyBWb3JzY2hsYWcgZ2VzcGVpY2hlcnQuIEJpdHRlIGhhYiAiCisgICAgICAgICAgICAiZXR3YXMgR2VkdWxkLCBiaXMgc2ljaCBqZW1hbmQgZGVuIEdlZ2Vuc3RhbmQgYW5nZXNjaGF1dCBoYXQuIikpOworICAgIC8vIGdnZi4gcmVzZXQgcmVha3RpdmllcmVuIHVuZCBNYWludGFpbmVyIGluZm9ybWllcmVuLgorICAgIGlmICghcXVlcnlfbmV4dF9yZXNldCgpKQorICAgICAgc2V0X25leHRfcmVzZXQoMSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgLy8gZ2V0cmFnZW5lcz8KKyAgaWYgKG9iLT5RdWVyeVByb3AoUF9XT1JOKSkgeworICAgICAgb2ItPkRvVW53ZWFyKDApOworICAgICAgaWYgKG9iLT5RdWVyeVByb3AoUF9XT1JOKSkgeyAvL0FSR0wuIEdSVU1NRUwuCisgICAgICAgIGlmIChvYmplY3RwKFBMKSkKKyAgICAgICAgICB0ZWxsX29iamVjdChQTCxCUygiV2lsbHN0IER1ICIrb2ItPm5hbWUoV0VOLDEpICsgIiBuaWNodCBlcnN0bWFsICIKKyAgICAgICAgICAgICAgICAiYXVzemllaGVuPyIpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgIH0KKyAgLy8gZW50aGFlbHQgZXMgaXJnZW5kd2VsY2hlIGFuZGVyZW4gT2JqZWt0ZT8KKyAgaWYgKHNpemVvZihhbGxfaW52ZW50b3J5KG9iKSkpIHsKKyAgICAgIGlmIChvYmplY3RwKFBMKSkKKyAgICAgICAgdGVsbF9vYmplY3QoUEwsQlMob2ItPk5hbWUoV0VSLDEpICsgIiBpc3QgbmljaHQgbGVlci4iKSk7CisgICAgICByZXR1cm4gMTsKKyAgfQorCisgIC8vIGFuZGVyZSBFaW5zY2hyYWVua3VuZ2VuLCBhbHMgaGllciBnZXBydWVmdCB3ZXJkZW4sIGdpYnQgZXMgbmljaHQuCisgIHJldHVybiAwOworfQorCisvLyBoaWVyIGlzdCBkYXMgT2JqZWt0IGpldHp0IGluIGRlciBUcnVoZSwgZC5oLiBEYXRlbiBzcGVpY2hlcm4gdW5kIE9iamVrdAorLy8gZGVzdHJ1Y3Rlbi4gOykKK3ZvaWQgTm90aWZ5SW5zZXJ0KG9iamVjdCBvYiwgb2JqZWN0IG9sZGVudikgeworCisgIC8vIERhcyBPYmpla3QsIHdhcyBkaWUgVHJ1aGUgZ2VyYWRlIHNlbGJlciBiZXdlZ3QsIHdpcmQgaWdub3JpZXJ0LgorICBpZiAoIW9iamVjdHAob2IpIHx8IG9iPT1vYl9pbl9iZXdlZ3VuZykKKyAgICByZXR1cm47CisgIFNUT1JFTE9HKHNwcmludGYoIiVzIGRlcG9uaWVydCAlcyBbJU9dLCBEYXRlbjogJU8iLGdldHVpZChQTCksb2ItPm5hbWUoV0VOLDApLAorICAgICAgICBvYixvYi0+UXVlcnlQcm9wKFBfQVVUT0xPQURPQkopKSk7CisgIC8vIG5vZXRpZyBzaW5kIGRpZSBJRHMsIGRlbiBOYW1lbiB1bmQgZGllIEFVVE9MT0FET0JKLURhdGVuIGRlcyBPYmpla3RzLgorICAvLyA7LSkKKyAgYXV0b2xvYWRlcltCTFVFX05BTUUob2IpLEFMREFUQV09b2ItPlF1ZXJ5UHJvcChQX0FVVE9MT0FET0JKKTsKKyAgYXV0b2xvYWRlcltCTFVFX05BTUUob2IpLElEU109b2ItPlF1ZXJ5UHJvcChQX0lEUyk7CisgIC8vIE9iamVrdGUsIGRpZSAwIGFscyBzaG9ydCBsaWVmZXJuLCBrcmllZ2VuIGVpbmUgU3RhbmRhcmQtU2hvcnQgdW5kIHdlcmRlbgorICAvLyBzaWNodGJhciBnZW1hY2h0LCBkYSBzaWUgc29uc3QgbmljaHQgd2llZGVyenVmaW5kZW4gc2luZC4gT2JqZWt0ZSwgZGllCisgIC8vIHVuc2ljaHRiYXIgc2VpbiBzb2xsZW4sIGR1ZXJmZW4gbmljaHQgZXJsYXVidCB3ZXJkZW4uCisgIC8vIFRPRE8gZWluZSBJRCBhbHMgU2hvcnQgbmVobWVuPworICBhdXRvbG9hZGVyW0JMVUVfTkFNRShvYiksTkFNRV09Y2FwaXRhbGl6ZSgob2ItPnNob3J0KCl8fCI8VW5iZWthbm50Pi5cbiIpWy4uPDNdKTsKKyAgLy8gbmFjaCBkZW0gTW92ZSBkaWUgcmVhbGVuIE9iamVrdGUgZGVzdHJ1Y3Rlbi4KKyAgY2FsbF9vdXQoIydjaGVja19jb250ZW50LCAwKTsKKyAgc2F2ZV9tZSgpOworfQorCisvLyBPYmpla3Qgd3VyZGUgZW50bm9tbWVuLCBhbHNvIGF1cyBkZXIgTGlzdGUgZGVyIGVudGhhbHRlbmVuIEF1dG9sb2FkZXIKKy8vIGxvZXNjaGVuLiBBdXNzZXJkZW0gT2JqZWt0IGtvbmZpZ3VyaWVyZW4uIERpZXMgd2lyZCBlcnN0IGhpZXIgZ2VtYWNodCB1bmQKKy8vIG5pY2h0IGluIGNyZWF0ZV9vYmplY3QoKSwgZGFtaXQgZXMgc28gYWVobmxpY2ggd2llIG1vZWdsaWNoIHp1bSBjbG9uZW4gZGVyCisvLyBBdXRvbG9hZGVyIGJlaW0gZXJzdGVsbGVuIGRlcyBTcGllbGVyb2JqZWt0ZXMgd2lyZCAoZG9ydCB3aXJkIGVyc3QgYmV3ZWd0LAorLy8gZGFubiBrb25maWd1cmllcnQpLgordm9pZCBOb3RpZnlMZWF2ZShvYmplY3Qgb2IsIG9iamVjdCBkZXN0KSB7CisgIHN0cmluZyBlcnJvciwgb25hbWU7CisgCisgIGlmICghb2JqZWN0cChvYikpCisgICAgcmV0dXJuOworICAKKyAgb25hbWU9QkxVRV9OQU1FKG9iKTsKKyAgaWYgKCFtZW1iZXIoYXV0b2xvYWRlcixvbmFtZSkpIHsKKyAgICAvLyBEYXMgc29sbHRlIGRlZmluaXRpdiBuaWNodCBwYXNzaWVyZW4uCisgICAgRVJSTE9HKHNwcmludGYoIkdlZ2Vuc3RhbmQgKCVPKSB3dXJkZSBlbnRub21tZW4sIGRlciBuaWNodCAiCisgICAgICAiZ2VzcGVpY2hlcnQgd2FyISIsb2IpKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyB3ZW5uIGtlaW4gRmVobGVyOiBPYmpla3QgYXVzIExpc3RlIGxvZXNjaGVuLiBTb25zdCB3aXJkIGRhcyBPYmpla3QKKyAgLy8gemVyc3RvZXJ0LiBEYW1pdCBibGVpYmVuIGRpZSBBdXRvbG9hZGVyLURhdGVuIGhpZXIgZXJoYWx0ZW4gdW5kIGRlcgorICAvLyBTcGllbGVyIGhhdCBrZWluIGRpc2Z1bmt0aW9uYWxlcyBPYmpla3QgaW0gSW52ZW50YXIuCisgIGlmIChlcnJvcikgeworICAgIEVSUkxPRyhzcHJpbnRmKCJGZWhsZXIgYmVpbSBLb25maWd1cmllcmVuIHZvbiAlTy4gRmVobGVybWVsZHVuZzogJU8uIgorICAgICAgICAiRGF0ZW46ICVPIixvYixlcnJvcixhdXRvbG9hZGVyW29uYW1lLEFMREFUQV0pKTsKKyAgICBvYi0+cmVtb3ZlKDEpOworICAgIGlmIChvYmplY3RwKG9iKSkKKyAgICAgIGRlc3RydWN0KG9iKTsKKyAgfQorICBlbHNlIHsKKyAgICBQSUNLTE9HKHNwcmludGYoIk9iamVrdCAoJU8pIHd1cmRlIGVudG5vbW1lbi4iLG9iKSk7CisgICAgbV9kZWxldGUoYXV0b2xvYWRlcixvbmFtZSk7CisgICAgLy8gc3BlaWNoZXJuCisgICAgc2F2ZV9tZSgpOworICB9Cit9CisKK3Byb3RlY3RlZCB2b2lkIGNoZWNrX2NvbnRlbnQoKSB7CisgIC8vIHdlbm4gT2JqZWt0ZSBub2NoIGluIGRlciBUcnVoZSBzaW5kLCBhbHNvIG5pY2h0IGVyZm9sZ3JlaWNoIGluCisgIC8vIGVpbmVuIFNwaWVsZXIgYmV3ZWd0IHd1cmRlbiwgd2VyZGVuIHplcnN0b2VydC4gRGF0ZW52ZXJsdXN0IGdpYnQgZXMKKyAgLy8gaGllcmJlaSBuaWNodCwgd2VpbCBkaWUgRGF0ZW4gZGVyIEF1dG9sb2FkZXIgbnVyIGR1cmNoIE5vdGlmeUxlYXZlKCkKKyAgLy8gZ2Vsb2VzY2h0IHdlcmRlbi4KKyAgZm9yZWFjaChvYmplY3Qgb2I6IGFsbF9pbnZlbnRvcnkoKSkgeworICAgIG9iLT5yZW1vdmUoMSk7CisgICAgaWYgKG9iamVjdHAob2IpKSBkZXN0cnVjdChvYik7CisgIH0KK30KKworLy8gaGllciBub2NobWFsIHNjaGF1ZW4sIG9iIGRhcyBPYmpla3QgYXVjaCBpbiBkZW4gcmljaHRpZ2VuIFNwaWVsZXIgYmV3ZWd0CisvLyB3aXJkLi4uIEZhbGxzIGRhcyBtb3ZlIGRhbm4gaGllciBhYmdlYnJvY2hlbiB3aXJkLCB3aXJkIGRhcyBPYmpla3QgaW0KKy8vIG5hZWNoc3RlbiBIQiB2b24gZGVyIFRydWhlIHplcnN0b2VydC4gKGNoa19jb250ZW50cygpKQordmFyYXJncyBpbnQgUHJldmVudExlYXZlKG9iamVjdCBvYiwgbWl4ZWQgZGVzdCkgeworICBvYmplY3Qgb2IyOworICAKKyAgLy9ERUJVRyhzcHJpbnRmKCJQcmV2ZW50TGVhdmUoKTogT2I6ICVPLCBEZXN0OiAlTyAoJU8pIiwKKyAgLy8gICAgICAgIG9iLGRlc3QsKG9iamVjdHAoZGVzdCk/Ik9iamVrdCI6Ik5vbi1PYmplY3QiKSkpOworCisgIGlmICghb2JqZWN0cChvYikpIHJldHVybiAwOyAKKyAgLy8gZmFsbHMgc3RyaW5nIHVlYmVyZ2ViZW4sIGVyc3RtYWwgenVnLiBTcGllbGVyIGZpbmRlbi4KKyAgaWYgKHN0cmluZ3AoZGVzdCkgJiYgc2l6ZW9mKGRlc3QpKQorICAgIGRlc3Q9ZmluZF9wbGF5ZXIoZGVzdCk7CisKKyAgLy8gcmljaHRpZ2VzIElOdGVyYWN0aXZlPyBEYW5uIGRhcmYgZGFzIE9iamVrdCByYXVzLiBTb25zdCBuaWNodC4gOy0pCisgIGlmICghb2JqZWN0cChkZXN0KSB8fCAhaW50ZXJhY3RpdmUoZGVzdCkgfHwgZ2V0dXVpZChkZXN0KSE9dXVpZCkKKyAgICAgIHJldHVybiAxOworCisgIC8vIHBydWVmZW4sIG9iIGRlciBTcGllbGVyIHNjaG9uIGVpbiBPYmpla3QgZGllc2VyIEJsdWVwcmludCBkYWJlaSBoYXQuIFdlbm4KKyAgLy8gamEsIEFiYnJ1Y2gsIGRhcyBrb2VubnRlIHNvbnN0IHp1dmllbGUgUHJvYmxlbWUgZ2ViZW4uCisgIGlmIChvYmplY3RwKG9iMj1wcmVzZW50X2Nsb25lKG9iLGRlc3QpKSkgeworICAgIHRlbGxfb2JqZWN0KGRlc3QsQlMoIkR1IGhhc3QgYmVyZWl0cyAiK29iMi0+bmFtZShXRU4sMCkgKworICAgICAgICAiIGRhYmVpLiBad2VpIEdlZ2Vuc3RhZW5kZSBkaWVzZXIgQXJ0IGthbm5zdCBkdSBuaWNodCBnbGVpY2h6ZWl0aWcgIgorICAgICAgICAibWl0IERpciBoZXJ1bXRyYWdlbi4iKSk7CisgICAgcmV0dXJuIDE7IC8vbmljaHQgcmF1c25laG1lbi4KKyAgfQorICByZXR1cm4gMDsKK30KKworLy8gT2JqZWt0ZSBhdXNnZWJlbiwgZGllIGhpZXIgYW5nZWJsaWNoIGRyaW4gc2luZC4gOy0pIEdpYnQgYWJlciBudXIgZGllCisvLyBBdXRvbG9hZGVyIGF1cywga2VpbmUgZWNodGVuIE9iamVrdCwgZGllIENvbnRhaW5lciBzaW5kLiBBbGxlcmRpbmdzIHNvbGx0ZQorLy8gc293YXMgZWggbmljaHQgdm9ya29tbWVuLiA7LSkKKy8vIGZsYWdzOiAxIC0gcmV0dXJuIGFycmF5LCAyIC0gZG9uJ3QgY29sbGVjdCBlcXVhbCBvYmplY3RzICcKKy8vIGZsYWdzOiA0IC0gZG9uJ3QgYXBwZW5kIGluZm9zIGZvciB3aXphcmRzCit2YXJhcmdzIG1peGVkIG1ha2VfaW52bGlzdChvYmplY3Qgdmlld2VyLCBtaXhlZCBpbnYsIGludCBmbGFncykgeworICBpbnQgaXN3aXo7CisgIG1peGVkIG9ianM7CisKKyAgaXN3aXogPSBJU19MRUFSTkVSKCB2aWV3ZXIgKSAmJiB2aWV3ZXItPlF1ZXJ5UHJvcChQX1dBTlRTX1RPX0xFQVJOKTsKKyAgLy8gTWFwcGluZyBiZW51dHplbiwgdW0gbXVsdGlwbGVuIE92ZXJoZWFkIGZ1ZXIgYWxsb2thdGlvbiBpbSBmb3JlYWNoKCkgenUKKyAgLy8gdmVybWVpZGVuLgorICBvYmpzPW1fYWxsb2NhdGUoc2l6ZW9mKGF1dG9sb2FkZXIpLDEpOworICBmb3JlYWNoKHN0cmluZyBvbmFtZSwgc3RyaW5nICppZHMsIHN0cmluZyBzaDogYXV0b2xvYWRlcikgeworICAgIGlmIChpc3dpeiAmJiAhKGZsYWdzICYgNCkpCisgICAgICBvYmpzW29uYW1lXT1zaCArICIuIFsiK29uYW1lKyJdIjsKKyAgICBlbHNlCisgICAgICBvYmpzW29uYW1lXT1zaCArICIuIjsKKyAgfQorICBpZihmbGFncyAmIDEpIHJldHVybihtX3ZhbHVlcyhvYmpzKS0oeyIifSkpOworICBpZighc2l6ZW9mKGF1dG9sb2FkZXIpKSByZXR1cm4gIiI7CisgIHJldHVybiBzcHJpbnRmKCIlIisoc2l6ZW9mKG9ianMpID4gNiA/ICIjIiA6ICI9IikrIi03OHMiLAorICAgICAgICAgICAgICAgICBpbXBsb2RlKG1fdmFsdWVzKG9ianMpLSh7IiJ9KSwgIlxuIikpICsgIlxuIjsKK30KKworLy8gZXJ6ZXVndCBkYXMgYmVuYW5udGUgT2JqZWt0IHVuZCBsaWVmZXJ0IGVzIHp1cnVlY2suIExpZWZlcnQgMCBpbSBGZWhsZXJmYWxsLgorLy8gYXVzc2VyZGVtIGJld2VndCBlcyBkYXMgT2JqZWt0IGluIGRpZSBUcnVoZSwgZGFtaXQgZXMgZWluIEVudiBoYXQgdW5kIGRpZQorLy8gVHJ1aGUgdmlhIE5vdGlmeUxlYXZlKCkgbWl0a3JpZWd0LCBkYXNzIGVzIHRhdHNhZWNobGljaCBlbnRub21tZW4gd3VyZGUuCitwcml2YXRlIG9iamVjdCBjcmVhdGVfb2JqZWN0KHN0cmluZyBvbmFtZSkgeworICBzdHJpbmcgZXJyb3I7CisgIG9iamVjdCBvYjsKKyAgbWl4ZWQgbm9nZXQ7CisgIGlmICghbWVtYmVyKGF1dG9sb2FkZXIsb25hbWUpKSByZXR1cm4gMDsKKworICAvL0JsdWVwcmludCBmaW5kZW4gKGphLCBkYXMgaXN0IG5pY2h0IHVuYmVkaW5ndCBub2V0aWcsIG1hbiBrb2VubnRlIGF1Y2gKKyAgLy9kaXJla3QgY2xvbmVuKQorICBpZiAoZXJyb3I9Y2F0Y2gob2I9bG9hZF9vYmplY3Qob25hbWUpO3B1Ymxpc2gpIHx8CisgICAgICAhb2JqZWN0cChvYikpIHsKKyAgICBFUlJMT0coc3ByaW50ZigiS29ubnRlICVzIG5pY2h0IGxhZGVuL2ZpbmRlbi4gRmVobGVyOiAlTyIsCisgICAgICAgICAgb25hbWUsZXJyb3IpKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICAvLyBjbG9uZW4KKyAgaWYgKGVycm9yPWNhdGNoKG9iPWNsb25lX29iamVjdChvbmFtZSk7cHVibGlzaCkgfHwKKyAgICAgICFvYmplY3RwKG9iKSkgeworICAgIEVSUkxPRyhzcHJpbnRmKCJLb25udGUgJXMgbmljaHQgY2xvbmVuLiBGZWhsZXI6ICVPIiwKKyAgICAgICAgb25hbWUsZXJyb3IpKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICAvLyBrb25maWd1cmllcmVuCisgIGVycm9yPWNhdGNoKG9iLT5TZXRQcm9wKFBfQVVUT0xPQURPQkosYXV0b2xvYWRlcltvbmFtZSxBTERBVEFdKTtwdWJsaXNoKTsKKworICAvL09iamVrdCBiZXdlZ2VuLCBkYWJlaSBPYmpla3QgaW4gZ2xvYi4gVmFyLiBtZXJrZW4sIGRhbWl0IFByZXZlbnRJbnNlcnQoKQorICAvL3VuZCBOb3RpZnlJbnNlcnQoKSBlcyBpZ25vcmllcmVuLiAqc2V1ZnoqCisgIG9iX2luX2Jld2VndW5nPW9iOworICBvYi0+bW92ZShNRSxNX05PQ0hFQ0spOworICBvYl9pbl9iZXdlZ3VuZz0wOworCisgIC8vIGpldHp0IG5vY2ggbmVuIENhbGxvdXQgc3RhcnRlbiwgZGFtaXQgZGFzIE9iamVrdCB6ZXJzdG9lcnQgd2lyZCwgd2VubiBlcworICAvLyBuaWNodCB3aXJrbGljaCBpbiBlaW5lbiBTcGllbGVyIGJld2VndCB3aXJkLgorICBjYWxsX291dCgjJ2NoZWNrX2NvbnRlbnQsMSk7CisKKyAgcmV0dXJuKG9iKTsKK30KKworLy8gU2NoYXVlbiwgb2IgZGllIHRydWhlIGVpbiBPYmpla3QgbWl0IHBhc3NlbmRlciBJRCBlbnRoYWVsdC4gV2VubgorLy8gamEsIGRhcyBPYmpla3QgZXJ6ZXVnZW4gdW5kIHp1cnVlY2tsaWVmZXJuLiAKKy8vIERpZXNlIEZ1bmt0aW9uIGhhdCBlaW5lIFJlaWhlIHZvbiBOYWNodGVpbGVuIGJ6dy4gRGVmaXppdGVuIGdndWUuIGRlcgorLy8gbm9ybWFsZXJ3ZWlzZSBpbiBDb250YWluZXJuIGRlZmluaWVydGVuIEZ1bmt0aW9uOgorLy8gLSBOdXIgZGFzIGVyc3RlIE9iamVrdCwgYXVmIGRhcyBpZCBwYXNzdC4gSWNoIGhhYiBlcnN0bWFsIGtlaW5lIEx1c3QsCisvLyAgIGhpZXIgbWVocmVyZSBPYmpla3RlIHp1IGVyemV1Z2VuLiBNYWwgc2NoYXVlbiwgb2IgZXMgc28gZ2VodC4gQXVjaCB3YWVyZQorLy8gICBlcyBlaW4gUHJvYmxlbSwgd2VubiB2aWVsZSBPYmpla3QgZGllIEV2YWxncmVuemUgYnp3LiBuaWNodCBhbGxlIGluIGRlbgorLy8gICBTcGllbGVyIGJld2VndCB3ZXJkZW4sIG5hY2hkZW0gc2llIGVyemV1Z3Qgd3VyZGVuLgorLy8gLSBrZWluZSBrb21wbGV4ZW4gQXVzZHJ1ZWNrZSwgbnVyIHJlaW5lIElEcy4KKy8vIEljaCBoYWx0ZSBkZW4gQXVmd2FuZCBmdWVyIG5pY2h0IGdlcmVjaHRmZXJ0aWd0Lgorb2JqZWN0ICpwcmVzZW50X29iamVjdHMoIHN0cmluZyBjb21wbGV4X2Rlc2MgKSB7CisgIG9iamVjdCBvYjsKKyAgaWYgKCFzdHJpbmdwKGNvbXBsZXhfZGVzYykgfHwgIXNpemVvZihjb21wbGV4X2Rlc2MpKQorICAgICAgcmV0dXJuICh7fSk7CisgIC8vIGRpZXNlIEZ1bmt0aW9uIGxpZWZlcnQgbnVyIE9iamV0ZSB6dXJ1ZWNrLCB3ZW5uIGRlciByaWNodGlnZSBJbnRlcmFjdGl2ZQorICAvLyB2ZXJzdWNodCwgc2llIHp1IGVudG5laG1lbi4gOy0pCisgIGlmICghb2JqZWN0cCh0aGlzX2ludGVyYWN0aXZlKCkpIHx8CisgICAgICBnZXR1dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSkhPXV1aWQpCisgICAgICByZXR1cm4gKHt9KTsKKworICAvLyAiYWxsZXMiIGxpZWZlcnQgZGFzIGVyc3RiZXN0ZSBPYmpla3QuCisgIGlmIChjb21wbGV4X2Rlc2M9PSJhbGxlcyIgJiYgc2l6ZW9mKGF1dG9sb2FkZXIpKQorICB7CisgICAgc3RyaW5nIG9uYW1lPW1faW5kaWNlcyhhdXRvbG9hZGVyKVswXTsKKyAgICBvYj1jcmVhdGVfb2JqZWN0KG9uYW1lKTsKKyAgICBpZiAob2JqZWN0cChvYikpIHJldHVybiAoe29ifSk7CisgIH0KKworICAvLyB1ZWJlciBhbGxlIEVpbnRyYWVnZSBnZWhlbiwgYmlzIGVpbmUgSUQgc3RpbW10LCBlcnN0ZXMgcGFzc2VuZGVzIE9iamVrdAorICAvLyBlcnpldWdlbiB1bmQgaW4gZWluZW0gQXJyYXkgenVydWVja2xpZWZlcm4uCisgIGZvcmVhY2goc3RyaW5nIG9uYW1lLCBzdHJpbmcgKmlkczogYXV0b2xvYWRlcikgeworICAgIGlmIChtZW1iZXIoaWRzLGNvbXBsZXhfZGVzYyk9PS0xKSBjb250aW51ZTsKKyAgICBvYj1jcmVhdGVfb2JqZWN0KG9uYW1lKTsKKyAgICBicmVhazsgLy9vYmpla3QgZ2VmdW5kZW4sIGZlcnRpZyBoaWVyCisgIH0KKyAgaWYgKG9iamVjdHAob2IpKSByZXR1cm4gKHtvYn0pOworICByZXR1cm4gKHt9KTsgLy8gbml4IGdlZnVuZGVuCit9CisKKworCisvLyAqKioqKioqKioqKioqKioqKioqIFZlcndhbHR1bmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKy8vIHJlZ2lzdHJpZXJ0IGRpZSBUcnVoZSBhdWYgZGVuIGpld2VpbGlnZW4gRWlnZW50dWVtZXIuCitwcm90ZWN0ZWQgdm9pZCBTZXRCZXNpdHplcihzdHJpbmcgdW51c2VkLCBzdHJpbmcgbmV3dXVpZCkgeworICBpZiAoIXN0cmluZ3AobmV3dXVpZCkgfHwgIXNpemVvZihuZXd1dWlkKSkgcmV0dXJuOworICAvLyB3ZW5uIHNjaG9uIHJlZ2lzdHJpZXJ0LCBhYmJyZWNoZW4KKyAgaWYgKHN0cmluZ3AodXVpZCkgJiYgc2l6ZW9mKHV1aWQpKSByZXR1cm47CisKKyAgdXVpZD1uZXd1dWlkOworICBTZXQoSF9GVVJOSVRVUkUsdXVpZCxGX1ZBTFVFKTsgLy9TZXRtZXRob2RlIHVtZ2VoZW4sIHNvbnN0IFJla3Vyc2lvbiAKKyAgLy8gYWIgamV0enQgbnVyIG5vY2ggdm9uIGRlciBUcnVoZSBzZWxiZXIuCisgIFNldChIX0ZVUk5JVFVSRSxTRUNVUkVELEZfTU9ERV9BUyk7CisgIAorICAvLyBEYXRlbiBmdWVyIGRlbiBCZW51dHplciBhdXMgZGVyIEJsdWVwcmludCBob2xlbiAoQlAgbGllZmVydCBLRUlORSBLb3BpZQorICAvLyB1bmQgZXMgZGFyZiBLRUlORSBnZW1hY2h0IHdlcmRlbiEpOgorICBhdXRvbG9hZGVyPShtYXBwaW5nKWxvYWRfbmFtZSgpLT5HZXREYXRhKHV1aWQpOworICAKKyAgLy8ga2VpbmUgRGF0ZW4gZ2VrcmllZ3Q/IC0+IEZlaGxlciBsb2dnZW4KKyAgaWYgKCFtYXBwaW5ncChhdXRvbG9hZGVyKSkKKyAgeworICAgIEVSUkxPRyhzcHJpbnRmKCJLZWluZSBndWVsdGlnZW4gRGF0ZW4gdm9tIFRydWhlbm1hc3RlciAoQlApIGVyaGFsdGVuLiAiCisgICAgICAgICJpbml0aWFsaXNpZXJlIG1pdCBsZWVyZW0gTWFwcGluZy4gOi0oIikpOworICAgIHJhaXNlX2Vycm9yKHNwcmludGYoCisgICAgICAgICAgIktlaW5lIGd1ZWx0aWdlbiBEYXRlbiB2b20gVHJ1aGVubWFzdGVyIChCUCkgZnVlciBVVUlEICVzICIKKyAgICAgICAgICAiZXJoYWx0ZW4uXG4iLHV1aWQpKTsKKyAgfQorfQorCisvLyBTZXQtRnVua3Rpb24KK3N0cmluZyBfc2V0X2hfZnVybml0dXJlKG1peGVkIGFyZykgeworICBpZiAoc3RyaW5ncChhcmcpKQorICB7CisgICAgU2V0QmVzaXR6ZXIoMCxhcmcpOyAvLyBicmljaHQgYWIsIHdlbm4gYmVyZWl0cyByZWdpc3RyaWVydC4KKyAgfQorICByZXR1cm4odXVpZCk7Cit9CisKKy8vIEZhbGxzIGRhcyBTcGVpY2hlcm4gaW4gZGVyIEJQIG5pY2h0IGtsYXBwdGUsIHJ1ZmVuIGRpZSBDbG9uZXMgZGllc2UKKy8vIEZ1bmt0aW9uLiBTY2hyZWliZW4gZGVyIERhdGVuIGluIGluIExvZ2ZpbGUgenVyIFJlc3RhdXJpZXJlbiBwZXIgSGFuZC4KK3ByaXZhdGUgdm9pZCBFbWVyZ2VuY3lTdG9yZShpbnQgcmVzKSB7CisgICAgRVJSTE9HKHNwcmludGYoIkVtZXJnZW5jeVN0b3JlKCkgY2FsbGVkLiBSdWVja2dhYmV3ZXJ0IGRlcyAiCisgICAgICAgICJUcnVoZW5tYXN0ZXIgKEJQKSB3YXI6ICVPLiBTcGVpY2hlcmUgRGF0ZW4gaW4gTG9nZmlsZS4gIixyZXMpKTsKKyAgICB3cml0ZV9maWxlKF9fRElSX18rIkFMVFJVSEUuTk9URkFMTERBVEVOIiwKKyAgICAgICAgc3ByaW50ZigiRGF0ZW4gZnVlciAlTzpcbiVPXG4iLHV1aWQsYXV0b2xvYWRlcikpOworfQorCitwcm90ZWN0ZWQgdm9pZCBzYXZlX21lKCkgeworICBpbnQgcmVzOworICAvLyBudXIgQlAgc3BlaWNoZXJuCisgIGlmICghY2xvbmVwKE1FKSkKKyAgICBzYXZlX29iamVjdChTQVZFRklMRSk7CisgIGVsc2UKKyAgeworICAgIGlmIChvYmplY3RwKGJsdWVwcmludChNRSkpKQorICAgICAgcmVzPShpbnQpYmx1ZXByaW50KE1FKS0+U3RvcmVEYXRhKHV1aWQsYXV0b2xvYWRlcik7CisgICAgZWxzZQorICAgICAgcmVzPShpbnQpbG9hZF9vYmplY3QobG9hZF9uYW1lKE1FKSktPlN0b3JlRGF0YSh1dWlkLGF1dG9sb2FkZXIpOworCisgICAgaWYgKHJlcyE9MSkKKyAgICAgIEVtZXJnZW5jeVN0b3JlKHJlcyk7IC8vIERhdGVuIGluIGVpbmVtIE5vdGZhbGwtTG9nZmlsZSBhYmxlZ2VuLgorICB9Cit9CisKKworLy8gZGllc2UgRnVua3Rpb24gd2lyZCB2b20gU2VoZXJoYXVzcmF1bSBnZXJ1ZmVuLCBzb2JhbGQgZWluIHJlYm9vdGZlc3RlcworLy8gTW9lYmVsc3R1ZWNrIGVyemV1Z3QgdW5kIGtvbmZpZ3VyaWVydCB3dXJkZS4KK3ZvaWQgcG9zdF9jcmVhdGUoKSB7CisgICAgaWYgKCFjbG9uZXAoKSkgcmV0dXJuOworCisgICAgLy8gd2VubiBqZXR6dCBrZWluIEVudjogZGVzdHJ1Y3RlbgorICAgIGlmICghb2JqZWN0cChlbnZpcm9ubWVudCgpKSkgeworICAgICAgICByZW1vdmUoMSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy9iZWltIFNjaHJhbmttYXN0ZXIgcmVnaXN0cmllcmVuCisgICAgU0NIUkFOS01BU1RFUi0+UmVnaXN0ZXJDbnQoTUUsIFF1ZXJ5UHJvcCgiY250X3ZlcnNpb25fc3RkIikKKyAgICAgICsiOiIrUXVlcnlQcm9wKCJjbnRfdmVyc2lvbl9vYmoiKSwgZW52aXJvbm1lbnQoKS0+UXVlcnlPd25lcigpLAorICAgICAgIGVudmlyb25tZW50KCkpOworfQorCisvLyBkaWVzZSBGdW5rdGlvbiB3aXJkIHZvbSBTY2hyYW5rbWFzdGVyIGdlcnVmZW4sIHdlbm4gZGllc2VyIG1laW50LCBkYXNzCisvLyBkaWVzZXMgT2JqZWt0IG5ldSBlcnN0ZWxsdCB3ZXJkZW4gc29sbHRlLgoraW50IFVwZGF0ZU1lKCkKK3sKKyAgaWYgKCFjbG9uZXAoKSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKCFvYmplY3RwKGVudmlyb25tZW50KCkpKQorICAgIHJldHVybiAxOworICBvYmplY3Qgb2I9Y2xvbmVfb2JqZWN0KGxvYWRfbmFtZShNRSkpOworICBpZiAob2JqZWN0cChvYikpIHsKKyAgICBvYmplY3Qgb2xkZW52PWVudmlyb25tZW50KCk7CisgICAgLy8gVVVJRCB1ZWJlcnRyYWdlbgorICAgIG9iLT5TZXRQcm9wKEhfRlVSTklUVVJFLCB1dWlkKTsKKyAgICAvLyBoaWVyaGllciBiZXdlZ2VuLCBkYWJlaSB3ZXJkZW4gVVVJRCB1bmQgRGF0ZW4gdm9uIGRlciBuZXVlbiBUcnVoZSBtZWlzdAorICAgIC8vIGF1dG9tYXRpc2NoIGdlaG9sdC4KKyAgICBvYi0+bW92ZShvbGRlbnYsTV9OT0NIRUNLKTsKKyAgICAvLyBqZXR6dCBlcnN0IHBvc3RfY3JlYXRlKCkgcnVmZW4hCisgICAgb2ItPnBvc3RfY3JlYXRlKCk7CisgICAgLy8gZGllc2VzIE9iamVrdCByYXVzYmV3ZWdlbiAoZGFtaXQgZGFzIFNlaGVyaGF1cyBlcyBhdXN0cmFlZ3QpLgorICAgIG1vdmUoIi9yb29tL3ZvaWQiLE1fTk9DSEVDSyk7CisgICAgLy8gU2VoZXJoYXVzcmF1bSBzcGVpY2hlcm4gKGtvZW5udGUgdGV1ZXIgc2VpbiEpCisgICAgb2xkZW52LT5TYXZlKDEpOworICAgIC8vIHNlbGJzdHplcnN0b2VyZW4KKyAgICAvLyBfX0lOVF9NQVhfXyBiZWRldXRldDogbmljaHQgc3BlaWNoZXJuLCBkaWUgbmV1ZSBUcnVoZSBoYXQgZGllIGRhdGVuCisgICAgLy8gc2Nob24gYXVzIGRlciBCUCBhYmdlZnJhZ3QuCisgICAgcmVtb3ZlKF9fSU5UX01BWF9fKTsKKyAgfQorICByZXR1cm4oMSk7Cit9CisKKy8vIGJlaSBTZWxic3R6ZXJzdG9lcnVuZyBzcGVpY2hlcm4gYnp3LiBEYXRlbiBhbiBkaWUgQmx1ZXByaW50IHVlYmVybWl0dGVsbgorLy8gdW5kIGJlaW0gU2NocmFua21hc3RlciBhYm1lbGRlbi4KK3ZhcmFyZ3MgaW50IHJlbW92ZShpbnQgc2lsZW50KSB7CisgIHN0cmluZyB1aWQ9IiI7CisKKyAgLy8gQmx1ZXByaW50IHNwZWljaGVybiBpbSBTYXZlZmlsZSwgQ2xvbmVzIHVlYmVydHJhZ2VuIGRpZSBEYXRlbiBoaWVyIGFuIGRpZQorICAvLyBCbHVlcHJpbnQuIENsb25lcyBudXIsIHdlbm4gbmljaHQgX19JTlRfTUFYX18gdWViZXJnZWJlbiB3dXJkZS4KKyAgaWYgKHNpbGVudCE9X19JTlRfTUFYX18gfHwgIWNsb25lcCgpKQorICAgIHNhdmVfbWUoKTsKKworICBpZiAoY2xvbmVwKCkpIHsKKyAgICAvLyBDbG9uZSBtZWxkZW4gc2ljaCBiZWltIFNjaHJhbmttYXN0ZXIgYWIuCisgICAgaWYgKG9iamVjdHAoZW52aXJvbm1lbnQoKSkpIHsKKyAgICAgICAgdWlkPWVudmlyb25tZW50KCktPlF1ZXJ5T3duZXIoKTsKKyAgICB9CisgICAgLy9iZWltIFNjaHJhbmttYXN0ZXIgZGVyZWdpc3RyaWVyZW4KKyAgICBTQ0hSQU5LTUFTVEVSLT5SZW1vdmVDbnQoTUUsdWlkKTsKKyAgfQorICByZXR1cm4oOjpyZW1vdmUoc2lsZW50KSk7Cit9CisKKy8vICoqKioqKioqKioqKioqKioqIE5VUiBCTFVFUFJJTlRTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisvLyBuZXVlbiBBdXRvbG9hZGVyIHp1bGFzc2VuIChudXIgRU0rISkKK3ZhcmFyZ3MgaW50IEFkZEF1dG9sb2FkZXIoc3RyaW5nIHBhdGgsc3RyaW5nIG5hbSkgeworICBvYmplY3Qgb2I7CisgIGlmIChjbG9uZXAoTUUpKSByZXR1cm4gMDsKKyAgaWYgKCFzdHJpbmdwKHBhdGgpIHx8ICFzaXplb2YocGF0aCkpIHJldHVybiAtMTsKKyAgaWYgKCFBQ0NFU1MpIHJldHVybiAtMjsKKyAgLy9pZiAoIUFSQ0hfU0VDVVJJVFkpIHJldHVybiAtMjsKKyAgaWYgKG1lbWJlcih3aGl0ZWxpc3QscGF0aCkpIHJldHVybiAtMzsKKyAgaWYgKGNhdGNoKG9iPWxvYWRfb2JqZWN0KHBhdGgpO3B1Ymxpc2gpCisgICAgICB8fCAhb2JqZWN0cChvYikpCisgICAgICByZXR1cm4gLTQ7CisgIC8vIHdlbm4gTmFtZSBuaWNodCBhbmdlZ2ViZW4gdW5kIGF1Y2ggbmljaHQgYXVzIEJQIGVybWl0dGVsYmFyOiBBYmJydWNoLgorICBpZiAoIXN0cmluZ3AobmFtKSB8fCAhc2l6ZW9mKG5hbSkpIHsKKyAgICAgIG5hbT1vYi0+bmFtZShXRVIsMCk7CisgICAgICBpZiAoIXN0cmluZ3AobmFtKSB8fCAhc2l6ZW9mKG5hbSkpIHJldHVybiAtNTsKKyAgfQorICBJVEVNTE9HKHNwcmludGYoIiVzIGVybGF1YnQ6ICVzICglcylcbiIsZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSksCisgICAgICAgICAgcGF0aCxuYW0pKTsKKyAgd2hpdGVsaXN0Kz0oW3BhdGg6Y2FwaXRhbGl6ZShuYW0pXSk7CisgIGlmIChtZW1iZXIodm9yc2NobGFlZ2UscGF0aCkpCisgICAgbV9kZWxldGUodm9yc2NobGFlZ2UscGF0aCk7CisgIHNhdmVfbWUoKTsKKyAgcmV0dXJuKDEpOworfQorCisvLyBBdXRvbG9hZGVyIGF1cyBFcmxhdWJuaXNsaXN0ZSBlbnRmZXJuZW4gKG51ciBFTSshKQoraW50IFJlbW92ZUF1dG9sb2FkZXIoc3RyaW5nIHBhdGgpIHsKKyAgaWYgKGNsb25lcChNRSkpIHJldHVybiAwOworICBpZiAoIXN0cmluZ3AocGF0aCkgfHwgIXNpemVvZihwYXRoKSkgcmV0dXJuIC0xOworICBpZiAoIUFDQ0VTUykgcmV0dXJuIC0yOworICAvL2lmICghQVJDSF9TRUNVUklUWSkgcmV0dXJuIC0yOworICBpZiAoIW1lbWJlcih3aGl0ZWxpc3QscGF0aCkpIHJldHVybiAtMzsKKyAgSVRFTUxPRyhzcHJpbnRmKCIlcyB3aWRlcnJ1ZnQgRXJsYXVibmlzOiAlcyAoJXMpXG4iLGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpLAorICAgICAgICAgIHBhdGgsd2hpdGVsaXN0W3BhdGhdKSk7CisgIHdoaXRlbGlzdC09KFtwYXRoXSk7CisgIHNhdmVfbWUoKTsKKyAgcmV0dXJuKDEpOworfQorCisvLyBlcmxhdWJ0ZSBBdXRvbG9hZGVyIGFiZnJhZ2VuCittYXBwaW5nIFF1ZXJ5QXV0b2xvYWRlcigpIHsKKyAgcmV0dXJuKGNvcHkod2hpdGVsaXN0KSk7Cit9CisKKy8vIG5ldWVuIEF1dG9sb2FkZXIgaW4gQmxhY2tsaXN0IGVpbnRyYWdlbiAobnVyIEVNKyEpCit2YXJhcmdzIGludCBBZGRCbGFja2xpc3Qoc3RyaW5nIHBhdGgsIHN0cmluZyBuYW0pIHsKKyAgb2JqZWN0IG9iOworICBpZiAoY2xvbmVwKE1FKSkgcmV0dXJuIDA7CisgIGlmICghc3RyaW5ncChwYXRoKSB8fCAhc2l6ZW9mKHBhdGgpKSByZXR1cm4gLTE7CisgIGlmICghQUNDRVNTKSByZXR1cm4gLTI7CisgIC8vaWYgKCFBUkNIX1NFQ1VSSVRZKSByZXR1cm4gLTI7CisgIAorICBpZiAobWVtYmVyKGJsYWNrbGlzdCxwYXRoKSkgcmV0dXJuIC0zOworCisgIGlmIChjYXRjaChvYj1sb2FkX29iamVjdChwYXRoKTtwdWJsaXNoKQorICAgICAgfHwgIW9iamVjdHAob2IpKQorICAgICAgcmV0dXJuIC00OworICAvLyB3ZW5uIE5hbWUgbmljaHQgYW5nZWdlYmVuIHVuZCBhdWNoIG5pY2h0IGF1cyBCUCBlcm1pdHRlbGJhcjogQWJicnVjaC4KKyAgaWYgKCFzdHJpbmdwKG5hbSkgfHwgIXNpemVvZihuYW0pKSB7CisgICAgICBuYW09b2ItPm5hbWUoV0VSLDApOworICAgICAgaWYgKCFzdHJpbmdwKG5hbSkgfHwgIXNpemVvZihuYW0pKSByZXR1cm4gLTU7CisgIH0KKyAgLy8gZ2dmLiBlcmxhdWJ0ZW4gZW50ZmVybmVuLgorICBpZiAobWVtYmVyKHdoaXRlbGlzdCxwYXRoKSkKKyAgICBSZW1vdmVBdXRvbG9hZGVyKHBhdGgpOworICBJVEVNTE9HKHNwcmludGYoIiVzIHZlcmJpZXRldDogJXMgKCVzKVxuIixnZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpKSwKKyAgICAgICAgICBwYXRoLG5hbSkpOworCisgIGJsYWNrbGlzdCs9KFtwYXRoOmNhcGl0YWxpemUobmFtKV0pOworCisgIGlmIChtZW1iZXIodm9yc2NobGFlZ2UscGF0aCkpCisgICAgbV9kZWxldGUodm9yc2NobGFlZ2UscGF0aCk7CisKKyAgc2F2ZV9tZSgpOworICByZXR1cm4oMSk7Cit9CisKKy8vIEF1dG9sb2FkZXIgYXVzIEJsYWNrbGlzdCBlbnRmZXJuZW4gKG51ciBFTSshKQoraW50IFJlbW92ZUJsYWNrbGlzdChzdHJpbmcgcGF0aCkgeworICBpZiAoY2xvbmVwKE1FKSkgcmV0dXJuIDA7CisgIGlmICghc3RyaW5ncChwYXRoKSB8fCAhc2l6ZW9mKHBhdGgpKSByZXR1cm4gLTE7CisgIGlmICghQUNDRVNTKSByZXR1cm4gLTI7CisgIC8vaWYgKCFBUkNIX1NFQ1VSSVRZKSByZXR1cm4gLTI7CisgIGlmIChtZW1iZXIoYmxhY2tsaXN0LHBhdGgpPT0tMSkgcmV0dXJuIC0zOworICBJVEVNTE9HKHNwcmludGYoIiVzIGxvZXNjaHQ6ICVzICglcykgdm9uIEJsYWNrbGlzdFxuIixnZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpKSwKKyAgICAgICAgICBwYXRoLGJsYWNrbGlzdFtwYXRoXSkpOworICBibGFja2xpc3QtPShbcGF0aF0pOworICBzYXZlX21lKCk7CisgIHJldHVybigxKTsKK30KKworLy8gZ2VzcGVycnRlIEF1dG9sb2FkZXIgYWJmcmFnZW4KK21hcHBpbmcgUXVlcnlCbGFja2xpc3QoKSB7CisgIHJldHVybihjb3B5KGJsYWNrbGlzdCkpOworfQorCisvLyB2b3JzY2hsYWVnZSBhYmZyYWdlbgordmFyYXJncyBtaXhlZCBRdWVyeVZvcnNjaGxhZWdlKGludCBmb3JtYXQpIHsKKyAgc3RyaW5nIHJlcz0iXG4iOworICBpZiAoIWZvcm1hdCkgcmV0dXJuKGNvcHkodm9yc2NobGFlZ2UpKTsKKworICBmb3JlYWNoKHN0cmluZyBvbmFtZSwgc3RyaW5nIG5hbSwgc3RyaW5nIHNoOiB2b3JzY2hsYWVnZSkgeworICAgIHJlcys9c3ByaW50ZigiJS43OHM6XG4gICAlLjM3cywlLjM3c1xuIixvbmFtZSxuYW0sc2gpOyAKKyAgfQorCisgIGlmIChmb3JtYXQ9PTIgJiYgb2JqZWN0cChQTCkpCisgICAgdGVsbF9vYmplY3QoUEwscmVzKTsKKyAgZWxzZQorICAgIHJldHVybiByZXM7CisgIHJldHVybiAwOworfQorCisvLyBXaXJkIGRpZXNlIGZ1bmt0aW9uIGluIGRlciBCbHVlcHJpbnQgZ2VydWZlbiwgbGllZmVydCBzaWUgZGllIERhdGVuIGZ1ZXIKKy8vIGVpbmUgVHJ1aGUgbWl0IGRpZXNlciBVVUlEIHp1cnVlY2suIEFiZXIgbnVyIGRhbm4sIHdlbm4gZGllIGF1Y2ggdm9uIGVpbmVyCisvLyB0cnVoZSBhYmdlcnVmZW4gd2lyZCB1bmQga2VpbmVtIGJlbGllYmlnZW4gYW5kZXJlbiBPYmpla3Qgb2RlciB3ZW5uIGVpbiBFTQorLy8gYWJmcmFndC4KK21hcHBpbmcgR2V0RGF0YShzdHJpbmcgdWlkKSB7CisgIGlmIChjbG9uZXAoTUUpKSByZXR1cm4gMDsKKyAgaWYgKGV4dGVybl9jYWxsKCkpCisgIHsKKyAgICBpZiAoIW9iamVjdHAocHJldmlvdXNfb2JqZWN0KCkpKSByZXR1cm4gMDsKKyAgICBpZiAoYmx1ZXByaW50KHByZXZpb3VzX29iamVjdCgpKSAhPSBNRQorICAgICAgICAmJiBsb2FkX25hbWUocHJldmlvdXNfb2JqZWN0KCkpICE9IF9fRklMRV9fWy4uPDNdCisgICAgICAgICYmICFBQ0NFU1MpCisgICAgICAgIHJldHVybigwKTsKKyAgfQorICBpZiAoIXN0cmluZ3AodWlkKSkgcmV0dXJuIChbXSk7CisKKyAgaWYgKCFtZW1iZXIoZGF0YSwgdWlkKSkKKyAgICBkYXRhW3VpZF0gPSBtX2FsbG9jYXRlKDEsMyk7CisKKyAgLy8gQWJzaWNodGxpY2gga2VpbmUgS29waWUsIGRhbWl0IGRpZSBUcnVoZW4gKGZhbGxzIGplbWFuZCBtZWhyZXJlIGthdWZ0KQorICAvLyBzaWNoIGFsbGUgZWluZSBLb3BpZSBkZXMgTWFwcGluZ3MgdGVpbGVuLgorICByZXR1cm4gZGF0YVt1aWRdOworfQorCisvLyBMb2VzdCBkaWUgU3BlaWNoZXJ1bmcgZGVyIERhdGVuIGltIFNhdmVmaWxlIGF1cywgZGVubiBpcmdlbmR3ZWxjaGUgRGF0ZW4KKy8vIGhhYmVuIHNpY2ggaW4gZWluZW0gQ2xvbmUgZ2VhZW5kZXJ0LCB3ZWxjaGUgbm9jaCBhdWYgZGllIFBsYXR0ZSBtdWVzc2VuLgorLy8gRGllc2UgRnVua3Rpb24gc3BlaWNoZXJ0ZSBmcnVlaGVyIERhdGVuIGF1cyBkZW4gQ2xvbmVzIHdpZWRlciBpbSBNYXBwaW5nCisvLyBkZXMgTWFzdGVycyAoZGVyIEJsdWVwcmludCkuIERpZXMgaXN0IGhldXRlIG5pY2h0IG1laHIgc28sIHdlaWwgYWxsZSBUcnVoZW4KKy8vIChlaW5lcyBCZW51dHplcnMpIHNpY2ggZGF0YVt1aWRdIHRlaWxlbi4gRGFoZXIgd2lyZCBoaWVyIGVpbiBGZWhsZXIKKy8vIGF1c2dlbG9lc3QsIHdlbm4gZXMgdm9uIGVpbmVyIFRydWhlIGVpbiBNYXBwaW5nIGtyaWVndCwgd2VsY2hlcyBuaWNodAorLy8gaWRlbnRpc2NoICghKSBtaXQgZGVtIGRhdGFbdWlkXSBpc3QuCisvLyBsaWVmZXJ0IDAgaW0gRmVobGVyZmFsbCEKK2ludCBTdG9yZURhdGEoc3RyaW5nIHVpZCwgbWFwcGluZyB0bXApIHsKKworICBpZiAoY2xvbmVwKE1FKSkgcmV0dXJuIDA7CisKKyAgLy8gQWJlciBudXIgZGFubiwgd2VubiBkaWUgYXVjaCB2b24gZWluZXIgdHJ1aGUgYWJnZXJ1ZmVuIHdpcmQgdW5kIGtlaW5lbQorICAvLyBiZWxpZWJpZ2VuIGFuZGVyZW4gT2JqZWt0IG9kZXIgd2VubiBlaW4gRU0gc2V0enQuCisgIGlmIChleHRlcm5fY2FsbCgpKQorICB7CisgICAgaWYgKCFvYmplY3RwKHByZXZpb3VzX29iamVjdCgpKSkKKyAgICAgIHJldHVybiAwOworICAgIGlmIChibHVlcHJpbnQocHJldmlvdXNfb2JqZWN0KCkpICE9IE1FIAorICAgICAgICAmJiBsb2FkX25hbWUocHJldmlvdXNfb2JqZWN0KCkpICE9IF9fRklMRV9fWy4uPDNdCisgICAgICAgICYmICFBQ0NFU1MpCisgICAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoIXN0cmluZ3AodWlkKSB8fCAhbWFwcGluZ3AodG1wKSkKKyAgICByZXR1cm4oMCk7CisKKyAgLy8gdG1wIG11c3MgYXVmIF9kYXNzZWxiZV8gTWFwcGluZyB6ZWlnZW4gd2llIGRhdGFbdWlkXS4gV2VubiBkYXMgbmljaHQgZGVyCisgIC8vIEZhbGwgaXN0LCBpc3Qgd2FzIHNjaGllZmdlbGF1ZmVuLiBKZWRlbmZhbGxzIHdpcmQgZGFubiBoaWVyIG5lbiBGZWhsZXIKKyAgLy8gYXVzZ2Vsb2VzdC4KKyAgaWYgKHRtcCAhPSBkYXRhW3VpZF0pCisgIHsKKy8vICAgIGlmKHByb2dyYW1fdGltZShwcmV2aW91c19vYmplY3QoKSkgPCAxNDAwNTI1Njk0KQorLy8gICAgICBkYXRhW3VpZF09dG1wOworLy8gICAgZWxzZQorICAgICAgcmFpc2VfZXJyb3IoIlN0b3JlRGF0YSgpIGdlcnVmZW4gdW5kIERhdGVuIHNpbmQgbmljaHQgaWRlbnRpc2NoICIKKyAgICAgICAgICAibWl0IGRlbiBiZXJlaXRzIGJla2FubnRlbi5cbiIpOworICB9CisKKyAgLy8gQWJzaWNodGxpY2gga2VpbmUgS29waWUsIGRhbWl0IHNpY2ggYWxsZSBUcnVoZW4gZGFzIE1hcHBpbmcgdGVpbGVuLgorICAvL2RhdGFbdWlkXT10bXA7CisKKyAgLy8gU2F2ZWZpbGUgbXVzcyBuYXR1ZXJsaWNoIGdlc2NocmllYmVuIHdlcmRlbiwgZnVlciBkZW4gbmFlY2hzdGVuIFJlYm9vdC4KKyAgaWYgKGZpbmRfY2FsbF9vdXQoIydzYXZlX21lKT09LTEpCisgICAgICBjYWxsX291dCgjJ3NhdmVfbWUsMTApOyAvLyBTcGVpY2hlcnZvcmdhZW5nZSBnZ2YuIHNhbW1lbG4gKHVwZCAtYXIgLi4uKQorICByZXR1cm4oMSk7Cit9CisKKy8vIE1haW50YWluZXIgdWViZXIgVHJ1aGVudm9yc2NobGFlZ2UgaW5mb3JtaWVyZW4KK3ZvaWQgcmVzZXQoKSB7CisKKyAgaWYgKGNsb25lcCgpIHx8ICFzaXplb2Yodm9yc2NobGFlZ2UpKSB7CisgICAgLy8gb2huZSBWb3JzY2hsYWVnZSBpc3QgYXVjaCBrZWluIHJlc2V0IG5vZXRpZy4KKyAgICBzZXRfbmV4dF9yZXNldCgtMSk7CisgICAgcmV0dXJuOworICB9CisgIHNldF9uZXh0X3Jlc2V0KDEyMDAwKTsgLy8gYWxsZSAzLTRoIHJlaWNodC4KKyAgZm9yZWFjaChzdHJpbmcgdWlkOiBNQUlOVEFJTkVSKSB7CisgICAgb2JqZWN0IHBsPWZpbmRfcGxheWVyKHVpZCk7CisgICAgaWYgKG9iamVjdHAocGwpICYmIHF1ZXJ5X2lkbGUocGwpIDwgMTgwMCkKKyAgICAgIHRlbGxfb2JqZWN0KHBsLEJTKCJFcyBnaWJ0IG5ldWUgT2JqZWt0dm9yc2NobGFlZ2UgZnVlciBkaWUgIgorICAgICAgICAiQXV0b2xvYWRlcnRydWhlLiBCaXR0IHNjaGF1IGRhIGRvY2ggYmVpIEdlbGVnZW5oZWl0IG1hbCBkcnVlYmVyLiIpKTsKKyAgfQorfQorCisKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworLy8gKioqKioqKioqKioqKioqKiBTT05TVElHRVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisvLyAqc2V1ZnoqCisvLyBzZWN1cmVfbGV2ZWwoKSBhdXMgZGVyIHNpbXVsX2VmdW4gaXN0IGhpZXIgbW9tZW50YW4gbmljaHQgYnJhdWNoYmFyLCB3ZWlsCisvLyBkb3J0IGF1Y2ggcC9zZWhlci9tb2ViZWwvYXV0b2xvYWRlcnRydWhlIGluIGRlciBDYWxsZXJrZXR0ZSBzdGVodCB1bmQgZGFzCisvLyBlaW4gbGV2bGUgdm9uIDAgaGF0LiAqc2V1ZnoqCitub21hc2sgcHJpdmF0ZSBpbnQgbXlfc2VjdXJlX2xldmVsKCkgeworICBpbnQgKmxldmVsOworICAvL2tldHRlIGRlciBDYWxsZXIgZHVyY2hsYXVmZW4sIGRlbiBuaWVkcmlnc3RlbiBMZXZlbCBpbiBkZXIgS2V0dGUKKyAgLy96dXJ1ZWNrZ2ViZW4uIFplcnN0b2VydGUgT2JqZWt0ZSAoU2VsYnN0emVyc3RvZXJlcikgZnVlaHJlbiB6dXIgUnVlY2tnYWJlCisgIC8vdm9uIDAuCisgIC8vY2FsbGVyX3N0YWNrKDEpIGZ1ZWd0IGRlbSBSdWVja2dhYmVhcnJheSB0aGlzX2ludGVyYWN0aXZlKCkgaGluenUgYnp3LiAwLAorICAvL3dlbm4gZXMga2VpbmVuIEludGVyYWN0aXZlIGdpYnQuIERpZSAwIGZ1ZWhydCBkYW5uIHdpZSBiZWkgemVyc3RvZXJ0ZW4KKyAgLy9PYmpla3RlbiB6dXIgUnVlY2tnYWJlIHZvbiAwLCB3YXMgZ2V3dWVuc2NodCBpc3QsIGRhIGVzIGhpZXIgZWluZW4KKyAgLy9JTnRlcmFjdGl2ZSBnZWJlbiBtdXNzLgorICBsZXZlbD1tYXAoY2FsbGVyX3N0YWNrKDEpLGZ1bmN0aW9uIGludCAob2JqZWN0IGNhbGxlcikKKyAgICAgIHtpZiAob2JqZWN0cChjYWxsZXIpKQorICAgICAgICByZXR1cm4ocXVlcnlfd2l6X2xldmVsKGdldGV1aWQoY2FsbGVyKSkpOworICAgICAgIHJldHVybigwKTsgLy8ga2VpbiBPYmpla3QgZGEsIDAuCisgICAgICB9ICk7CisgIHJldHVybihtaW4obGV2ZWwpKTsgLy9kZW4ga2xlaW5zdGVuIFdlcnQgaW0gQXJyYXkgenVydWVja2dlYmVuIChnZ2YuIDApCit9CisKKworLy8gZGVidWdrcmFtCittaXhlZCBfcXVlcnlfY29udGVudCgpIHsKKyAgLy9kZWVwX2NvcHksIGRhbWl0IG5pY2h0IGplbWFuZCBlaW5mYWNoIHNvIGFuIGRlbiBEYXRlbiBydW1iYXN0ZWxuIGthbm4uCisgIHJldHVybihkZWVwX2NvcHkoYXV0b2xvYWRlcikpOworfQorCittaXhlZCBfcXVlcnlfb3duZXIoKSB7CisgIHJldHVybih1dWlkKTsKK30KKworaW50IERlbGV0ZURhdGEoc3RyaW5nIHVpZCkgeworICBpZiAoY2xvbmVwKE1FKSkgcmV0dXJuIDA7CisgIGlmICghc3RyaW5ncCh1aWQpIHx8ICFzaXplb2YodWlkKSkgcmV0dXJuIC0xOworICBpZiAoIUFDQ0VTUykgcmV0dXJuIC0yOworICAvL2lmICghQVJDSF9TRUNVUklUWSkgcmV0dXJuIC0yOworICBtX2RlbGV0ZShkYXRhLHVpZCk7CisgIHNhdmVfbWUoKTsKKyAgcmV0dXJuKDEpOworfQorCittaXhlZCB0ZXN0ZnVuKCkge3JldHVybiAiYmluIGRhXG4iO30KKwpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL21vZWJlbC9rbGVpZGVyc2NocmFuay5jIGIvZC9zZWhlci9oYWV1c2VyL21vZWJlbC9rbGVpZGVyc2NocmFuay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MjA5YjQKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL2tsZWlkZXJzY2hyYW5rLmMKQEAgLTAsMCArMSwyMDggQEAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE5hbWUgZGVzIE9iamVjdHM6ICAgIEtsZWlkZXJzY2hyYW5rCisvLyBMZXR6dGUgQWVuZGVydW5nOiAgICAxNy4wMy4yMDAxCisvLyBNYWdpZXI6ICAgICAgICAgICAgICBTd2lmdAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI3ByYWdtYSBzdHJvbmdfdHlwZXMscnR0X2NoZWNrcworCisjaW5jbHVkZSAic2NocmFua2xhZGVuLmgiCisjaW5jbHVkZSA8YW5zaS5oPgoraW5oZXJpdCBMQURFTigic3dpZnRfc3RkX2NvbnRhaW5lciIpOworCisjZGVmaW5lIFZFUlNJT05fT0JKICIzIgorCitzdHJpbmcgc3RyYWxsOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICBpZiAoIWNsb25lcChUTykpIHJldHVybjsKKyAgc3dpZnRfc3RkX2NvbnRhaW5lcjo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9TSE9SVCwgIkVpbiBLbGVpZGVyc2NocmFuayIpOworICBTZXRQcm9wKFBfTE9ORywgQlMoCisgICAgICJJbiBkaWVzZW0gbWFzc2l2ZW4gSG9senNjaHJhbmsga2FubnN0IER1IGRpZSBBdXNydWVzdHVuZyBmdWVyIGVpbmUgIgorICAgICsiaGFsYmUgQXJtZWUgdW50ZXJicmluZ2VuLiBNZWhyZXJlIFJlZ2FsZSBzb3JnZW4gZGFmdWVyLCBkYXNzIGFsbGVzICIKKyAgICArInNlaW5lbiBnZW9yZG5ldGVuIFBsYXR6IGZpbmRldCwgZGFtaXQgRHUgZXMgYXVjaCBzY2huZWxsICIKKyAgICArIndpZWRlcmZpbmRlc3QuIikrIkBAY250X3N0YXR1c0BAIik7CisgIEFkZElkKCh7ImtsZWlkZXJzY2hyYW5rIiwgImhvbHpzY2hyYW5rIiwgInNjaHJhbmsifSkpOworICBTZXRQcm9wKCJjbnRfdmVyc2lvbl9vYmoiLCBWRVJTSU9OX09CSik7CisgIFNldFByb3AoUF9OQU1FLCAiS2xlaWRlcnNjaHJhbmsiKTsKKyAgU2V0UHJvcChQX0dFTkRFUiwgTUFMRSk7CisgIFNldFByb3AoUF9XRUlHSFQsIDUwMDApOyAgICAgICAgIC8vIEdld2ljaHQgNSBLZworICBTZXRQcm9wKFBfTUFYX1dFSUdIVCwgMTAwMDAwMCk7ICAvLyBFcyBwYXNzZW4gZnVlciAxMDAwIGtnIFNhY2hlbiByZWluLgorICBTZXRQcm9wKFBfV0VJR0hUX1BFUkNFTlQsIDEwMCk7ICAvLyBEYWZ1ZXIgbWFjaHQgZXIgYXVjaCBuaXggbGVpY2h0ZXIgOikKKyAgU2V0UHJvcChQX01BWF9PQkpFQ1RTLCAxMDApOyAgICAgLy8gTWVociBzb2xsdGUgbmljaHQgc2VpbiwgbHQuIFRpYW1hay4KKyAgU2V0UHJvcChQX1ZBTFVFLCAwKTsgICAgICAgICAgICAgLy8gS2VpbiBtYXRlcmllbGxlciBXZXJ0LiBJc3QgZWggbmljaHQgdmVya2F1ZmJhci4KKyAgU2V0UHJvcChQX05PQlVZLCAxKTsgICAgICAgICAgICAgLy8gV2lyZCBpbSBMYWRlbiB6ZXJzdG9lcnQsIGZhbGxzIGVyIHZlcmthdWZ0IHdpcmQuCisgIFNldFByb3AoUF9OT0dFVCwgIkRhcyBnZWh0IG5pY2h0LiAiK05hbWUoV0VSLDEpKyIgaGFmdGV0IHdpZSBtYWdpc2NoIGFtIEJvZGVuLlxuIik7CisgIFNldFByb3AoUF9NQVRFUklBTCwgKHtNQVRfTUlTQ19XT09ELCBNQVRfTUlTQ19NQUdJQ30pICk7CisgIFNldFByb3AoUF9JTkZPLCAiVmVyc3VjaHMgbWFsIG1pdDogXCJza29tbWFuZG9zICIrUXVlcnlQcm9wKFBfSURTKVsxXSsiXCIgIVxuIik7CisgIFNldFByb3AoIm9ial9jbWQiLCAic2xpc3RlIFtPYmpla3QtSWRdIFtLbGVpZHVuZ3MtL1J1ZXN0dW5nc3R5cHxcImFsbGVzXCJdXG4iCisgICAgICAgICAgICAgICAgICAgICsiICBLbGVpZHVuZ3MtL1J1ZXN0dW5nc3R5cGVuOiBIZWxtZSwgVW1oYWVuZ2UsIFJ1ZXN0dW5nZW4sIEhvc2VuLCBTY2h1aGUsXG4iCisgICAgICAgICAgICAgICAgICAgICsiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kc2NodWhlLCBHdWVydGVsLCBBbXVsZXR0ZSwgUmluZ2UsIEtvZWNoZXIsXG4iCisgICAgICAgICAgICAgICAgICAgICsiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hpbGRlLCBTb25zdGlnZXNcbiIpOworICBBRCgoeyJyZWdhbCIsICJyZWdhbGUifSksIEJTKCJEdXJjaCBkaWUgUmVnYWxlIGtvbW10IGV0d2FzIE9yZG51bmcgaW4gZGllICIKKyAgICArInZpZWxlbiBTYWNoZW4sIGRpZSBtYW4gaW4gZGVuIFNjaHJhbmsgc3RlY2tlbiBrYW5uLiBEdSBrYW5uc3QgRGlyIHouQi4gIgorICAgICsiZWluZSBMaXN0ZSBiZXN0aW1tdGVyIEtsZWlkdW5ncy0vUnVlc3R1bmdzdHlwZW4gZGVzIFNjaHJhbmtpbmhhbHRlcyAiCisgICAgKyJtaXQgZGVtIEJlZmVobCBcInNsaXN0ZVwiIGFuc2NoYXVlbi4gKERhcyBnZWh0IG5hdHVlcmxpY2ggbnVyIGJlaSAiCisgICAgKyJvZmZlbmVtIFNjaHJhbmshIikpOworCisgIEFkZENtZCgoeyJzbGlzdGUifSksICJhdWZsaXN0dW5nIik7Cit9CisKK3ZhcmFyZ3MgaW50IFByZXZlbnRJbnNlcnQob2JqZWN0IG9iKQoreworICAvLyBOdXIgUnVlc3R1bmcvS2xlaWR1bmcgaGF0IGluIGRpZXNlbSBDb250YWluZXIgd2FzIHZlcmxvcmVuIQorICBpZiAoKG9iLT5Jc0Nsb3RoaW5nKCkgfHwgb2ItPlF1ZXJ5UHJvcChQX0FSTU9VUl9UWVBFKSkKKyAgICAgICYmICFvYi0+UXVlcnlQcm9wKFBfV0VBUE9OX1RZUEUpICkKKyAgeworICAgIHJldHVybiA6OlByZXZlbnRJbnNlcnQob2IpOworICB9CisKKyAgd3JpdGUoIEJTKCJJbiAiK25hbWUoV0VOLDEpKyIga2FubnN0IER1IG51ciBSdWVzdHVuZ3MtL0tsZWlkdW5nc3N0dWVja2UgbGVnZW4hIikpOworICByZXR1cm4gMTsKK30KKworaW50IGF1Zmxpc3R1bmcyKHN0cmluZyB3YXMsIHN0cmluZyBuZl9zdHIxLCBzdHJpbmcgbmZfc3RyMiwgaW50IGFsbGVzKQoreworICBzdHJpbmcgb2JzaG9ydCwgc3VjaGUsICpzdHJzOworICBvYmplY3QgKm9iczsKKyAgaW50IGk7CisgIG1hcHBpbmcgc3VjaG9iczsKKyAgc3dpdGNoKHdhcykKKyAgeworICAgIGNhc2UgImhlbG1lIiAgICAgIDogc3VjaGU9QVRfSEVMTUVUOyBicmVhazsKKyAgICBjYXNlICJ1bWhhZW5nZSIgICA6IHN1Y2hlPUFUX0NMT0FLOyBicmVhazsKKyAgICBjYXNlICJydWVzdHVuZ2VuIiA6IHN1Y2hlPUFUX0FSTU9VUjsgYnJlYWs7CisgICAgY2FzZSAiaG9zZW4iICAgICAgOiBzdWNoZT1BVF9UUk9VU0VSUzsgYnJlYWs7CisgICAgY2FzZSAic2NodWhlIiAgICAgOiBzdWNoZT1BVF9CT09UOyBicmVhazsKKyAgICBjYXNlICJoYW5kc2NodWhlIiA6IHN1Y2hlPUFUX0dMT1ZFOyBicmVhazsKKyAgICBjYXNlICJndWVydGVsIiAgICA6IHN1Y2hlPUFUX0JFTFQ7IGJyZWFrOworICAgIGNhc2UgImFtdWxldHRlIiAgIDogc3VjaGU9QVRfQU1VTEVUOyBicmVhazsKKyAgICBjYXNlICJyaW5nZSIgICAgICA6IHN1Y2hlPUFUX1JJTkc7IGJyZWFrOworICAgIGNhc2UgImtvZWNoZXIiICAgIDogc3VjaGU9QVRfUVVJVkVSOyBicmVhazsKKyAgICBjYXNlICJzY2hpbGRlIiAgICA6IHN1Y2hlPUFUX1NISUVMRDsgYnJlYWs7CisgICAgY2FzZSAic29uc3RpZ2VzIiAgOiBzdWNoZT1BVF9NSVNDOyBicmVhazsKKyAgICBkZWZhdWx0ICAgICAgICAgICA6IHdyaXRlKCJGZWhsZXI6IFVuZ3VlbHRpZ2VyIEtsZWlkdW5ncy0vUnVlc3R1bmdzdHlwLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiRm9sZ2VuZGUgVHlwZW4gZ2lidCBlczpcbiIrbmZfc3RyMStuZl9zdHIyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOyBicmVhazsKKyAgfQorICBvYnM9YWxsX2ludmVudG9yeSgpOworICBzdWNob2JzPShbXSk7CisgIGZvcihpPTA7aTxzaXplb2Yob2JzKTtpKyspCisgIHsKKyAgICBvYnNob3J0PW9ic1tpXS0+UXVlcnlQcm9wKFBfU0hPUlQpOworICAgIGlmKG9ic2hvcnQ9PSJOaWNodHMgYmVzb25kZXJlcyIpIC8vIGtlaW5lIFBfU0hPUlQgPworICAgICAgb2JzaG9ydD1vYnNbaV0tPk5hbWUoV0VSKTsgICAgIC8vICAgSG9mZmVuIHdpciBtYWwgZGFzcyBkYXMgT2JqLiBuZW4gTmFtZW4gaGF0LgorICAgIGlmKG9ic1tpXS0+UXVlcnlQcm9wKFBfQVJNT1VSX1RZUEUpPT1zdWNoZSkgICAgLy8gR2VzdWNodGVyIEFybW91clR5cGUgZ2VmdW5kZW4uLi4KKyAgICB7CisgICAgICBpZihzdWNob2JzW29ic2hvcnRdKSAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQX1NIT1JUIGRlcyBPYmouIHNjaG9uIGltIG1hcHBpbmc/CisgICAgICB7CisgICAgICAgIGlmKCBvYnNbaV0tPlF1ZXJ5UHJvcChQX0FNT1VOVCkgKQorICAgICAgICAgIHN1Y2hvYnNbb2JzaG9ydF0rPW9ic1tpXS0+UXVlcnlQcm9wKFBfQU1PVU5UKTsgLy8gICBEYW5uIGRlbiBaYWVobGVyIHVtIEFtb3VudCBob2NoIQorICAgICAgICBlbHNlCisgICAgICAgICAgc3VjaG9ic1tvYnNob3J0XSs9MTsgICAgICAgICAgICAgICAgICAgICAvLyAgIERhbm4gZGVuIFphZWhsZXIgdW0gMSBob2NoIQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBpZiggb2JzW2ldLT5RdWVyeVByb3AoUF9BTU9VTlQpICkKKyAgICAgICAgICBzdWNob2JzKz0oW29ic2hvcnQ6IG9ic1tpXS0+UXVlcnlQcm9wKFBfQU1PVU5UKV0pOworICAgICAgICBlbHNlCisgICAgICAgICAgc3VjaG9icys9KFtvYnNob3J0OiAxXSk7CisgICAgICB9CisgICAgfQorICB9CisgIHN0cnM9bV9pbmRpY2VzKHN1Y2hvYnMpOworICBpZihzaXplb2Yoc3RycykpCisgIHsKKyAgICBpZighYWxsZXMpCisgICAgeworICAgICAgc3RyYWxsKz1OYW1lKFdFUiwxKSsiIGVudGhhZWx0IGZvbGdlbmRlICIrQ0FQKHdhcykrIjpcbiI7CisgICAgICBzdHJhbGwrPSItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiI7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHN0cmFsbCs9QU5TSV9CT0xEKyI9PT0gIitDQVAod2FzKSsiOlxuIitBTlNJX05PUk1BTDsKKyAgICBmb3IoaT0wO2k8c2l6ZW9mKHN0cnMpO2krKykKKyAgICB7CisgICAgICBpZihzdWNob2JzW3N0cnNbaV1dID4gMSkKKyAgICAgICAgc3RyYWxsKz1zdHJzW2ldKyIuICgiK3N1Y2hvYnNbc3Ryc1tpXV0rIilcbiI7CisgICAgICBlbHNlCisgICAgICAgIHN0cmFsbCs9c3Ryc1tpXSsiLlxuIjsKKyAgICB9CisgIH0KKyAgZWxzZQorICAgIGlmKCFhbGxlcykKKyAgICAgIHN0cmFsbCs9TmFtZShXRVIsMSkrIiBlbnRoYWVsdCBrZWluZSAiK0NBUCh3YXMpKyIhXG4iOworICByZXR1cm4gMTsKK30KKworaW50IGF1Zmxpc3R1bmcoc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nICpzdHJzLCBvYl9pZCwgd2FzLCBuZl9zdHIxLG5mX3N0cjI7CisgIHN0cmFsbD0iIjsKKyAgbmZfc3RyMT0iICAgKEhlbG1lLCBVbWhhZW5nZSwgUnVlc3R1bmdlbiwgSG9zZW4sIFNjaHVoZSwgSGFuZHNjaHVoZSxcbiIKKyAgICAgICAgICsiICAgIEd1ZXJ0ZWwsIEFtdWxldHRlLCBSaW5nZSwgS29lY2hlciwgU2NoaWxkZSwgU29uc3RpZ2VzKVxuIjsKKyAgbmZfc3RyMj0iU3ludGF4OiBzbGlzdGUgW09iamVrdC1JZF0gW0tsZWlkdW5ncy0vUnVlc3R1bmdzdHlwfFwiYWxsZXNcIl1cbiIKKyAgICAgICAgICsiQnNwLjogICBzbGlzdGUgIitRdWVyeVByb3AoUF9JRFMpWzFdKyIgIisiaGVsbWVcbiIKKyAgICAgICAgICsiICAgICAgICBzbGlzdGUgIitRdWVyeVByb3AoUF9JRFMpWzFdKyIgYWxsZXNcbiI7CisgIG5vdGlmeV9mYWlsKCJGZWhsZXI6IE9obmUgUGFyYW1ldGVyIGtsYXBwdCBkYXMgbmljaHQuXG4iK25mX3N0cjIpOworICBpZighc3RyKSByZXR1cm4gMDsKKyAgaWYocHJlc2VudChzdHIpPT1UTykgICAvLyBVZWJlcnBydWVmZSwgb2IgZGllc2VzIE9iamVrdCBnZW1laW50IGlzdCEKKyAgeworICAgIHdyaXRlKCJGZWhsZXI6IEVzIGZlaGx0IGVpbiBLbGVpZHVuZ3MtL1J1ZXN0dW5nc3R5cC4gRm9sZ2VuZGUgVHlwZW4gZ2lidCBlczpcbiIKKyAgICAgICAgICtuZl9zdHIxK25mX3N0cjIpOworICAgIHJldHVybiAxOworICB9CisgIHN0cnM9b2xkX2V4cGxvZGUoc3RyLCAiICIpOworICBub3RpZnlfZmFpbCgiRmVobGVyOiBEdSBtdXNzdCBlaW5lIGd1ZWx0aWdlIE9iamVrdC1JZCBhbmdlYmVuIVxuIgorICAgICAgICAgICAgICtuZl9zdHIyKTsKKyAgaWYoIHNpemVvZihzdHJzKSA8IDIgKSByZXR1cm4gMDsgICAvLyBOdXIgMSBQYXIuIHVuZCBkZXIgaXN0IG5pY2h0IGRpZSBPYmpla3QtSWQKKyAgaWYoIHNpemVvZihzdHJzKSA9PSAyICkgICAvLyBBbnphaGwgUGFyLiA9IDIKKyAgeworICAgIG9iX2lkPXN0cnNbMF07CisgICAgd2FzPXN0cnNbMV07CisgICAgaWYoIElTVF9aQUhMKHdhcykgKSAgICAgLy8gT2JqZWt0LUlkIHouQi4gbWl0ICJzY2hyYW5rIDIiIGFuZ2VzcHJvY2hlbj8KKyAgICAgIGlmKHByZXNlbnQob2JfaWQrIiAiK3dhcyk9PVRPKSAgIC8vIEZhbGxzIGRpZXNlcyBPYmpla3QgZ2VtZWludCBpc3QgdW5kIGtlaW4gMy4gUGFyIQorICAgICAgeworICAgICAgICB3cml0ZSgiRmVobGVyOiBFcyBmZWhsdCBlaW4gS2xlaWR1bmdzLS9SdWVzdHVuZ3N0eXAuIEZvbGdlbmRlIFR5cGVuIGdpYnQgZXM6XG4iCisgICAgICAgICAgICAgICtuZl9zdHIxK25mX3N0cjIpOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7CisgIH0KKyAgZWxzZSBpZiggc2l6ZW9mKHN0cnMpID09IDMgKQorICB7CisgICAgb2JfaWQ9c3Ryc1swXSsiICIrc3Ryc1sxXTsKKyAgICB3YXM9c3Ryc1syXTsKKyAgfQorICBlbHNlICAgICAgICAvLyBBbnphaGwgZXJmb3JkZXJsaWNoZXIgUGFyYW1ldGVyIHVlYmVyc2Nocml0dGVuIQorICAgIHJldHVybiAwOworICBpZihwcmVzZW50KG9iX2lkKSE9VE8pICAgLy8gVWViZXJwcnVlZmUsIG9iIGF1Y2ggZGllc2VzIE9iamVrdCBnZW1laW50IGlzdCEKKyAgICByZXR1cm4gMDsKKyAgaWYoUXVlcnlQcm9wKFBfQ05UX1NUQVRVUykhPUNOVF9TVEFUVVNfT1BFTikKKyAgeworICAgIHdyaXRlKCJEYXp1IG11ZXNzdGUgIituYW1lKFdFUiwxKSsiIGdlb2VmZm5ldCBzZWluLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKy8vLS0tIEhpZXIgaXN0IFBhcmFtZXRlcnBydWVmdW5nIHp1IEVuZGUuCisgIHdhcz1MT1dFUih3YXMpOworICBpZih3YXMhPSJhbGxlcyIpCisgICAgYXVmbGlzdHVuZzIod2FzLCBuZl9zdHIxLCBuZl9zdHIyLCAwKTsKKyAgZWxzZQorICB7CisgICAgYXVmbGlzdHVuZzIoImhlbG1lIiwgbmZfc3RyMSwgbmZfc3RyMiwgMSk7CisgICAgYXVmbGlzdHVuZzIoInVtaGFlbmdlIiwgbmZfc3RyMSwgbmZfc3RyMiwgMSk7CisgICAgYXVmbGlzdHVuZzIoInJ1ZXN0dW5nZW4iLCBuZl9zdHIxLCBuZl9zdHIyLCAxKTsKKyAgICBhdWZsaXN0dW5nMigiaG9zZW4iLCBuZl9zdHIxLCBuZl9zdHIyLCAxKTsKKyAgICBhdWZsaXN0dW5nMigic2NodWhlIiwgbmZfc3RyMSwgbmZfc3RyMiwgMSk7CisgICAgYXVmbGlzdHVuZzIoImhhbmRzY2h1aGUiLCBuZl9zdHIxLCBuZl9zdHIyLCAxKTsKKyAgICBhdWZsaXN0dW5nMigiZ3VlcnRlbCIsIG5mX3N0cjEsIG5mX3N0cjIsIDEpOworICAgIGF1Zmxpc3R1bmcyKCJhbXVsZXR0ZSIsIG5mX3N0cjEsIG5mX3N0cjIsIDEpOworICAgIGF1Zmxpc3R1bmcyKCJyaW5nZSIsIG5mX3N0cjEsIG5mX3N0cjIsIDEpOworICAgIGF1Zmxpc3R1bmcyKCJrb2VjaGVyIiwgbmZfc3RyMSwgbmZfc3RyMiwgMSk7CisgICAgYXVmbGlzdHVuZzIoInNjaGlsZGUiLCBuZl9zdHIxLCBuZl9zdHIyLCAxKTsKKyAgICBhdWZsaXN0dW5nMigic29uc3RpZ2VzIiwgbmZfc3RyMSwgbmZfc3RyMiwgMSk7CisgIH0KKyAgVFAtPk1vcmUoc3RyYWxsKTsKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL2tvbW1vZGUuYyBiL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwva29tbW9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYTJiNTAKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL2tvbW1vZGUuYwpAQCAtMCwwICsxLDQwIEBACisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBOYW1lIGRlcyBPYmplY3RzOiAgICBLb21tb2RlCisvLyBMZXR6dGUgQWVuZGVydW5nOiAgICAxNy4wMy4yMDAxCisvLyBNYWdpZXI6ICAgICAgICAgICAgICBTd2lmdAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI3ByYWdtYSBzdHJvbmdfdHlwZXMscnR0X2NoZWNrcworCisjaW5jbHVkZSAic2NocmFua2xhZGVuLmgiCitpbmhlcml0IExBREVOKCJzd2lmdF9zdGRfY29udGFpbmVyIik7CisKKyNkZWZpbmUgVkVSU0lPTl9PQkogIjMiCisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgIGlmICghY2xvbmVwKFRPKSkgcmV0dXJuOworICBzd2lmdF9zdGRfY29udGFpbmVyOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX1NIT1JULCAiRWluZSBLb21tb2RlIik7CisgIFNldFByb3AoUF9MT05HLCBCUygKKyAgICAgIkRpZXNlIHJvYnVzdGUgS29tbW9kZSBhdXMgRWljaGVuaG9seiBwYXNzdCBlaW5mYWNoIGluIGplZGVuIFJhdW0uICIKKyAgICArIk1hbiBrYW5uIGplZGUgTWVuZ2UgWmV1ZyBkYXJpbiB2ZXJzdGF1ZW4sIHVuZCBkaWUgdmllbGVuIFNjaHVibGFkZW4gIgorICAgICsibGFzc2VuIGVzIGVpbmZhY2ggdmVyc2Nod2luZGVuLiBTbyBlaW4gTW9lYmVsc3R1ZWNrIGdlaG9lcnQgZWluZmFjaCAiCisgICAgKyJpbiBqZWRlcyBIYXVzISIpKyJAQGNudF9zdGF0dXNAQCIpOworICBBZGRJZCgoeyJrb21tb2RlIn0pKTsKKyAgU2V0UHJvcCgiY250X3ZlcnNpb25fb2JqIiwgVkVSU0lPTl9PQkopOworICBTZXRQcm9wKFBfTkFNRSwgIktvbW1vZGUiKTsKKyAgU2V0UHJvcChQX0dFTkRFUiwgRkVNQUxFKTsKKyAgU2V0UHJvcChQX1dFSUdIVCwgNTAwMCk7ICAgICAgICAgLy8gR2V3aWNodCA1IEtnCisgIFNldFByb3AoUF9NQVhfV0VJR0hULCAxMDAwMDAwKTsgIC8vIEVzIHBhc3NlbiBmdWVyIDEwMDAga2cgU2FjaGVuIHJlaW4uCisgIFNldFByb3AoUF9XRUlHSFRfUEVSQ0VOVCwgMTAwKTsgIC8vIERhZnVlciBtYWNodCBlciBhdWNoIG5peCBsZWljaHRlciA6KQorICBTZXRQcm9wKFBfTUFYX09CSkVDVFMsIDEwMCk7ICAgICAvLyBNZWhyIHNvbGx0ZSBuaWNodCBzZWluLCBsdC4gVGlhbWFrLgorICBTZXRQcm9wKFBfVkFMVUUsIDApOyAgICAgICAgICAgICAvLyBLZWluIG1hdGVyaWVsbGVyIFdlcnQuIElzdCBlaCBuaWNodCB2ZXJrYXVmYmFyLgorICBTZXRQcm9wKFBfTk9CVVksIDEpOyAgICAgICAgICAgICAvLyBXaXJkIGltIExhZGVuIHplcnN0b2VydCwgZmFsbHMgZXIgdmVya2F1ZnQgd2lyZC4KKyAgU2V0UHJvcChQX05PR0VULCAiRGFzIGdlaHQgbmljaHQuICIrTmFtZShXRVIsMSkrIiBoYWZ0ZXQgd2llIG1hZ2lzY2ggYW0gQm9kZW4uXG4iKTsKKyAgU2V0UHJvcChQX01BVEVSSUFMLCAoe01BVF9PQUssIE1BVF9NSVNDX01BR0lDfSkgKTsKKyAgU2V0UHJvcChQX0lORk8sICJWZXJzdWNocyBtYWwgbWl0OiBcInNrb21tYW5kb3MgIitRdWVyeVByb3AoUF9JRFMpWzFdKyJcIiAhXG4iKTsKKworICBBRCgoeyJzY2h1YmxhZGVuIn0pLCBCUygiRXMgc2luZCB2aWVsZSwgYWJlciB6dW0gR2x1ZWNrIG11c3N0IER1IHNpZSBuaWNodCAiCisgICAgKyJlaW56ZWxuIGFuc3ByZWNoZW4uIER1IGthbm5zdCBlaW5mYWNoIGFsbGVzIGluICIrbmFtZShXRU4sMSkrIiBzdGVja2VuLiIpKTsKKyAgQUQoKHsibW9lYmVsc3R1ZWNrIn0pLCBCUyhOYW1lKFdFUiwxKSsiIGlzdCBnZW1laW50LiIpKTsKK30KZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwva3VlaGxzY2hyYW5rLmMgYi9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL2t1ZWhsc2NocmFuay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZjFkZjQKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL2t1ZWhsc2NocmFuay5jCkBAIC0wLDAgKzEsNDUgQEAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE5hbWUgZGVzIE9iamVjdHM6ICAgIEt1ZWhsc2NocmFuaworLy8gTGV0enRlIEFlbmRlcnVuZzogICAgMTcuMDMuMjAwMQorLy8gTWFnaWVyOiAgICAgICAgICAgICAgU3dpZnQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHJ0dF9jaGVja3MKKworI2luY2x1ZGUgInNjaHJhbmtsYWRlbi5oIgoraW5oZXJpdCBMQURFTigic3dpZnRfc3RkX2NvbnRhaW5lciIpOworCisjZGVmaW5lIFZFUlNJT05fT0JKICIzIgorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICBpZiAoIWNsb25lcChUTykpIHJldHVybjsKKyAgc3dpZnRfc3RkX2NvbnRhaW5lcjo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9TSE9SVCwgIkVpbiBLdWVobHNjaHJhbmsiKTsKKyAgU2V0UHJvcChQX0xPTkcsIEJTKAorICAgICAiRGllc2VyIHN0cmFobGVuZHdlaXNzZSBLdWVobHNjaHJhbmsgZGVyIEZpcm1hIEJyb3NjaCB1ZWJlcnpldWd0IGR1cmNoICIKKyAgICArImVpbiBsZWlzZXMgU3VtbWVuIHZvbiBzZWluZXIgRnVua3Rpb24sIGF1Y2ggd2VubiBEdSBuaWNodCB3ZWlzc3QsIHdvaGVyICIKKyAgICArImVyIGRlbiBTdHJvbSBkYWZ1ZXIgbmltbXQuIFZlcm11dGxpY2ggYXVmIG1hZ2lzY2hlIFdlaXNlLiBBYmVyIER1IGtlbm5zdCAiCisgICAgKyJkYXMgamEsIG1pdCBNYWdpZSBsYWVzc3Qgc2ljaCBmYXN0IGFsbGVzIGVya2xhZXJlbi4gR3V0IGRhc3MgZGVyICIKKyAgICArIkt1ZWhsc2NocmFuayBzbyBncm9zcyBpc3QsIG1hbiBrb2VubnRlIGVpbmVuIGF1c2dld2FjaHNlbmVuIEVpc2JhZXJlbiAiCisgICAgKyJkYXJpbiB1bnRlcmJyaW5nZW4gLSBhYmVyIGRlciBkdWVyZnRlIHdvaGwgd2FzIGRhZ2VnZW4gaGFiZW4uIikKKyAgICArIkBAY250X3N0YXR1c0BAIik7CisgIEFkZElkKCh7Imt1ZWhsc2NocmFuayIsICJzY2hyYW5rIn0pKTsKKyAgU2V0UHJvcCgiY250X3ZlcnNpb25fb2JqIiwgVkVSU0lPTl9PQkopOworICBTZXRQcm9wKFBfTkFNRSwgIkt1ZWhsc2NocmFuayIpOworICBTZXRQcm9wKFBfR0VOREVSLCBNQUxFKTsKKyAgU2V0UHJvcChQX1dFSUdIVCwgNTAwMCk7ICAgICAgICAgLy8gR2V3aWNodCA1IEtnCisgIFNldFByb3AoUF9NQVhfV0VJR0hULCAxMDAwMDAwKTsgIC8vIEVzIHBhc3NlbiBmdWVyIDEwMDAga2cgU2FjaGVuIHJlaW4uCisgIFNldFByb3AoUF9XRUlHSFRfUEVSQ0VOVCwgMTAwKTsgIC8vIERhZnVlciBtYWNodCBlciBhdWNoIG5peCBsZWljaHRlciA6KQorICBTZXRQcm9wKFBfTUFYX09CSkVDVFMsIDEwMCk7ICAgICAvLyBNZWhyIHNvbGx0ZSBuaWNodCBzZWluLCBsdC4gVGlhbWFrLgorICBTZXRQcm9wKFBfVkFMVUUsIDApOyAgICAgICAgICAgICAvLyBLZWluIG1hdGVyaWVsbGVyIFdlcnQuIElzdCBlaCBuaWNodCB2ZXJrYXVmYmFyLgorICBTZXRQcm9wKFBfTk9CVVksIDEpOyAgICAgICAgICAgICAvLyBXaXJkIGltIExhZGVuIHplcnN0b2VydCwgZmFsbHMgZXIgdmVya2F1ZnQgd2lyZC4KKyAgU2V0UHJvcChQX05PR0VULCAiRGFzIGdlaHQgbmljaHQuICIrTmFtZShXRVIsMSkrIiBoYWZ0ZXQgd2llIG1hZ2lzY2ggYW0gQm9kZW4uXG4iKTsKKyAgU2V0UHJvcChQX01BVEVSSUFMLCAoe01BVF9NSVNDX01FVEFMLCBNQVRfTUlTQ19NQUdJQ30pICk7CisgIFNldFByb3AoUF9JTkZPLCAiVmVyc3VjaHMgbWFsIG1pdDogXCJza29tbWFuZG9zICIrUXVlcnlQcm9wKFBfSURTKVsxXSsiXCIgIVxuIik7CisKKyAgQUQoKHsic3Ryb20ifSksIEJTKCJLZWluZSBBaG51bmcsIHdvICIrbmFtZShXRVIsMSkrIiBkZW4gaGVybmltbXQsIGFiZXIgIgorICAgICsid2llIGdlc2FndCwgYmVzdGltbXQgaXN0IE1hZ2llIGltIFNwaWVsLiIpKTsKKworICBBZGRTb3VuZHMoKHsic3VtbWVuIn0pLCBCUygiRGFzIFN1bW1lbiBkZXMgS3VlaGxzY2hyYW5rcyB1ZWJlcnpldWd0IERpY2ggZGF2b24sICIKKyAgICArImRhc3MgZXIgYW4gaXN0LiIpKTsKK30KZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvbGVzZXB1bHQuYyBiL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvbGVzZXB1bHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWI4MzAwCi0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL21vZWJlbC9sZXNlcHVsdC5jCkBAIC0wLDAgKzEsNTU5IEBACisvLyBFaW5pZ2VyIENvZGUgd3VyZGUgYXVzIGRlbSBRdWVzdHRhZ2VidWNoIGRlcyBUZW1wZWxzIHVlYmVybm9tbWVuLgorLy8gRGEgbWFuIGRhcyBCdWNoLCBzb2JhbGQgZXMgaW0gYXVmZ2VzdGVsbHRlbiBMZXNlcHVsdCBkZXMgU3BpZWxlcnMKKy8vIGFiZ2VsZWd0IHd1cmRlLCBhdWNoIGxlc2VuIGtvZW5uZW4gbXVzcywgc2luZCBkaWUgRnVua3Rpb25lbiB1bmQKKy8vIERldGFpbHMgYXVjaCB3ZWl0ZXJoaW4gc2lubnZvbGwuIEthdWZlbiBrYW5uIGVzIGplZGVyIFNlaGVyLCBhYmVyCisvLyBudXR6ZW4ga2FubiBtYW4gZXMgbnVyIG1pdCBkZW0gdm9uIEhlbHMgQXZhdGFyIHVlYmVycmVpY2h0ZW4gQnVjaC4KKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgIi9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL21vZWJlbC5oIgorI2luY2x1ZGUgIi9kL3NlaGVyL2hhZXVzZXIvaGF1cy5oIgorI2luY2x1ZGUgIi9kL2FuZmFlbmdlci9hcmsva25vY2hlbnRlbXBlbC9maWxlcy5oIgorI3ByYWdtYSBzdHJvbmdfdHlwZXMscnR0X2NoZWNrcworCitpbmhlcml0IExBREVOKCJzd2lmdF9zdGRfY29udGFpbmVyIik7CisKK3N0YXRpYyBzdHJpbmcgb3duZXI7CitzdHJpbmcgbGUoc3RyaW5nIGtleSk7CitzdHJpbmcgaW4oc3RyaW5nIGtleSk7CitpbnQgY21kX2VpbnRyYWdlbihzdHJpbmcgc3RyKTsKK2ludCBjbWRfbGVzZW4oc3RyaW5nIHN0cik7CitpbnQgdGFrZV9wYWdlKHN0cmluZyBzdHIpOworaW50IGRyb3BfYm9vayhzdHJpbmcgc3RyKTsKK2ludCBjbWRfYmxhZXR0ZXJuKHN0cmluZyBzdHIpOworaW50IGNtZF9vZWZmbmVuKHN0cmluZyBzdHIpOworaW50IGNtZF9zY2hsaWVzc2VuKHN0cmluZyBzdHIpOwordm9pZCBBZGRUaGVPbGREZXRhaWxzKCk7CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgaWYoIWNsb25lcCh0aGlzX29iamVjdCgpKSkKKyB7CisgIHNldF9uZXh0X3Jlc2V0KC0xKTsKKyAgcmV0dXJuOworIH0KKworIDo6Y3JlYXRlKCk7CisKK293bmVyPSJBbm9ueW11cyI7CisKK0FkZERldGFpbCgiZmluZ2VyIixCUygKKyJEZWluZSBGaW5nZXIgc29sbHRlbiBzY2hvbiB2b3JzaWNodGlnIHNlaW4sIHdlbm4gc2llIGRhcyBaZWRlciIrCisibmhvbHogYmVydWVocmVuLiBFaW5lcnNlaXRzLCBkYW1pdCBEdSBEaWNoIG5pY2h0IHZlcmxldHp0LCBhbmQiKworImVyZXJzZWl0cywgZGFtaXQgRHUgbmljaHRzIGJlc2NobXV0enQuIiw3OCkpOworQWRkRGV0YWlsKCh7ImhvbHoiLCJ6ZWRlcm5ob2x6IiwiemVkZXIifSksQlMoCisiQXVzIGVpbmVtIGVpbnppZ2VuIHN0YXJrZW4gU3RhbW0gZWluZXIgWmVkZXIgYmVhcmJlaXRldCwgaXN0IGQiKworImllc2VzIGVkbGUgTGVzZXB1bHQgc2Nob24gZXR3YXMgc2VociBGZWluZXMgdW5kIERla29yYXRpdmVzLiIsNzgpKTsKK0FkZERldGFpbCgoeyJzdGFtbSIsInplZGVybnN0YW1tIiwiaG9senN0YW1tIn0pLEJTKAorIkRlciBaZWRlcm5zdGFtbSBpc3Qgd2FocmxpY2gga3Vuc3R2b2xsIHZlcmVkZWx0IHdvcmRlbiwgc2VpbiBrIisKKyJyYWVmdGlnZXMgQnJhdW4gd3VyZGUgaGVydm9ycmFnZW5kIHp1ciBHZWx0dW5nIGdlYnJhY2h0LiIsNzgpKTsKK0FkZERldGFpbCgoeyJicmF1biIsImR1bmtlbGJyYXVuIn0pLEJTKAorIkRlciBkdW5rZWxicmF1bmUgU3RhbW0gZ2xhZW56dCB3dW5kZXJzY2hvZW4sIHdlbm4gTGljaHQgYXVmIGloIisKKyJuIGZhZWxsdC4gRWluIHNlaHIgYW5nZW5laG1lcyBIb2x6LCBkYXMgZnVlciBkYXMgTGVzZXB1bHQgdmVydyIrCisiZW5kZXQgd3VyZGUuIiw3OCkpOworQWRkRGV0YWlsKCJnZWx0dW5nIixCUygKKyJKYSwgZGllc2VzIEhvbHogZ2VmYWVsbHQgRGlyIHNlaHIsIGRhcyBnYW56ZSBQdWx0IGlzdCBlaW4gYmVtZSIrCisicmtlbnN3ZXJ0ZXMgS3Vuc3R3ZXJrLiIsNzgpKTsKK0FkZERldGFpbCgoeyJrdW5zdCIsIndlcmsiLCJrdW5zdHdlcmsifSksQlMoCisiSW1tZXIgd2llZGVyIGZhZWxsdCBEZWluIGJld3VuZGVybmRlciBCbGljayBhdWYgZGFzIExlc2VwdWx0LiIsNzgpKTsKK0FkZERldGFpbCgiYmxpY2siLEJTKAorIldhY2hzYW0gdW5kIGZsaW5rIHdpZSBpbW1lciwgaGF0IGVyIGplZG9jaCBlaW4gd2VuaWcgcGF1c2llcnQsIisKKyIgaW5kZW0gZXIgbXVlc3NpZyBhdWYgZGVtIExlc2VwdWx0IHJ1aHQuIiw3OCkpOworQWRkRGV0YWlsKCh7ImZlaW5lcyIsImRla29yYXRpdmVzIn0pLEJTKAorIkRhcyB0ZWlsd2Vpc2UgZWNraWdlIHVuZCBkYW5uIHdpZWRlciBzYW5mdCBnZXNjaHd1bmdlbmUsIHJ1bmRlIisKKyIgTGVzZXB1bHQgc2llaHQgc2Nob24gemllbWxpY2ggcmVwcmFlc2VudGF0aXYgYXVzLiIsNzgpKTsKK0FkZERldGFpbCgiemVkZXIiLEJTKAorIlZvbiBpaHIgaXN0IG51cm1laHIgZGFzIFB1bHQgZ2VibGllYmVuLCBhbGxlcmRpbmdzIGZpbmRlc3QgRHUsIisKKyIgZGFzcyBlcyBuaWNodCBkZXIgc2NobGVjaHRlc3RlIFRlaWwgaXN0LiIsNzgpKTsKK0FkZERldGFpbCgidGVpbCIsQlMoCisiRHUgc2llaHN0IG51ciBkZW4gYmVhcmJlaXRldGVuIFRlaWwgZGVyIFplZGVyIHZvciBEaXIuIiw3OCkpOworQWRkRGV0YWlsKCJleGVtcGxhciIsQlMoCisiRXMgaXN0IGdhbnoga2xhciB6dSBzZWhlbiwgZGFzcyBlcyBzaWNoIG51ciB1bSBlaW5lIFplZGVyIGhhbmQiKworImVsdCwgYXVzIGRlciBkaWVzZXMgUHVsdCBlbnRzdGFuZC4iLDc4KSk7CitBZGREZXRhaWwoKHsiaGFuZHdlcmsiLCJrdW5zdCJ9KSxCUygKKyJUYXRzYWVjaGxpY2ggaXN0IGRpZXNlcyBMZXNlcHVsdCBlaW4gc2VociBzY2hvZW5lcyBCZWlzcGllbCBobyIrCisiZWNoc3RlciBoYW5kd2Vya2xpY2hlciBLdW5zdC4iLDc4KSk7CitBZGREZXRhaWwoImJlaXNwaWVsIixCUygKKyJFaW4gd2VpdGVyZXMgc3RlaHQgaGllciBkdW1tZXJ3ZWlzZSBuaWNodCBoZXJ1bS4iLDc4KSk7CisKKyBTZXRQcm9wKCJjbnRfdmVyc2lvbl9vYmoiLCIxIik7CisgU2V0UHJvcChQX05BTUUsIkxlc2VwdWx0Iik7CisgU2V0UHJvcChQX0dFTkRFUixORVVURVIpOworIFNldFByb3AoUF9ORVZFUkRST1AsMSk7CisgU2V0UHJvcChQX1ZBTFVFLDEwKTsKKyBTZXRQcm9wKFBfV0VJR0hULDUwMDAwMCk7CisgU2V0UHJvcChQX05PR0VULCJEYXMgTGVzZXB1bHQgaXN0IERpciB2aWVsIHp1IHNjaHdlci5cbiIpOworIFNldFByb3AoUF9OT1NFTEwsIkR1IGJlaGFlbHRzdCBkYXMgTGVzZXB1bHQgbGllYmVyLlxuIik7CisgU2V0UHJvcChQX01BVEVSSUFMLChbTUFUX0NFREFSOjEwMF0pKTsKKyBTZXRQcm9wKEhfRlVSTklUVVJFLDEpOworIFNldFByb3AoUF9JTkZPLEJTKAorICJBdWYgZGllc2VzIExlc2VwdWx0IGthbm4gbWFuIGVpbiBnYW56IGJlc3RpbW10ZXMgc2Nod2FyemVzIEJ1IisKKyAiY2ggbGVnZW4uIERvcnQgbGllZ3QgZXMgcGVyZmVrdCwgdW0gZGFyaW4genUgYmxhZXR0ZXJuIHVuZCB6dSIrCisgIiBsZXNlbi4gQXVzc2VyZGVtIGJpcmd0IGVzIHNpY2hlciBub2NoIEdlaGVpbW5pc3NlLiIsNzgpKTsKKworIEFkZElkKCh7InB1bHQiLCJsZXNlcHVsdCIsIlxubGVzZXB1bHRfYXJrIn0pKTsKKworIEFkZENtZCgiZWludHJhZ2VuJnF1ZXN0fGF1ZmdhYmV8bG9lc3VuZ3xlcmxlYm5pc3xhYmVudGV1ZXIiLAorICMnY21kX2VpbnRyYWdlbiwiV2FzIHdpbGxzdCBEdSBoaWVyIGRlbm4gZWludHJhZ2VuID9cbiIpOworIEFkZENtZCgoeyJsaWVzIiwibGVzZSIsImxlcyJ9KSwjJ2NtZF9sZXNlbik7CisgQWRkQ21kKCJuaW1tIiwjJ3Rha2VfcGFnZSk7CisgQWRkQ21kKCh7ImxlZ2UiLCJsZWcifSksIydkcm9wX2Jvb2spOworIEFkZENtZCgiYmxhZXR0ZXJ8YmxhZXR0cmV8YmxhZXR0ZXJlJmluJmJ1Y2h8dGFnZWJ1Y2h8IgorICJ0ZW1wZWx0YWdlYnVjaCIsIydjbWRfYmxhZXR0ZXJuLCJXb3JpbiB3aWxsc3QgRHUgYmxhZXR0ZXJuID98IgorICJXaWxsc3QgRHUgaW0gVGFnZWJ1Y2ggYmxhZXR0ZXJuID8iKTsKKyBBZGRDbWQoIm9lZmZuZSZASUR8YnVjaHx0YWdlYnVjaHx0ZW1wZWx0YWdlYnVjaCIsIydjbWRfb2VmZm5lbiwKKyAiV2FzIHdpbGxzdCBEdSBvZWZmbmVuP1xuIik7CisgQWRkQ21kKCJzY2hsaWVzc2V8c2NobGllc3MmQElEfGJ1Y2h8dGFnZWJ1Y2h8dGVtcGVsdGFnZWJ1Y2giLAorICMnY21kX3NjaGxpZXNzZW4sIldhcyB3aWxsc3QgRHUgc2NobGllc3Nlbj9cbiIpOworCisgaWYgKE1RVEJNQVNURVItPlF1ZXJ5VGFnZWJ1Y2hBdWZQdWx0KHRoaXNfcGxheWVyKCkpKQorIEFkZFRoZU9sZERldGFpbHMoKTsKK30KKwordm9pZCBTZXRPd25lcihzdHJpbmcgc3RyKQoreworIG93bmVyPXN0cjsKK30KKworc3RyaW5nIFF1ZXJ5T3duZXIoKQoreworIHJldHVybiBvd25lcjsKK30KKworc3RyaW5nIF9xdWVyeV9zaG9ydCgpCit7CisgaWYgKChvd25lcj09IkFub255bXVzIil8fAorICAgICAgIXRoaXNfcGxheWVyKCl8fAorICAgICAgIShNUVRCTUFTVEVSLT5RdWVyeVRhZ2VidWNoQXVmUHVsdCh0aGlzX3BsYXllcigpKSkpCisgcmV0dXJuICJFaW4gd3VuZGVyc2Nob2VuZXMgTGVzZXB1bHQgYXVzIGR1bmtlbGJyYXVuZW0gWmVkZXJuaG9seiI7CisgaWYgKGdldHVpZCh0aGlzX3BsYXllcigpKT09b3duZXIpCisgcmV0dXJuCisgIkVpbiB3dW5kZXJzY2hvZW5lcyBMZXNlcHVsdCwgYXVmIGRlbSBEZWluIFRhZ2VidWNoIGRlcyBUZW1wZWxzIHJ1aHQiOworIGVsc2UgcmV0dXJuCisgIkVpbiB3dW5kZXJzY2hvZW5lcyBMZXNlcHVsdCwgZGFzIGVpbiBndWVsZGVuZXMgQnVjaCB0cmFlZ3QiOworfQorCitzdHJpbmcgX3F1ZXJ5X2xvbmcoKQoreworIGlmICgob3duZXI9PSJBbm9ueW11cyIpfHwKKyAgICAgICF0aGlzX3BsYXllcigpfHwKKyAgICAgICEoTVFUQk1BU1RFUi0+UXVlcnlUYWdlYnVjaEF1ZlB1bHQodGhpc19wbGF5ZXIoKSkpKQorIHJldHVybiBCUygKKyAiVm9yc2ljaHRpZyBmYWVocnN0IER1IG1pdCBkZW4gRmluZ2VybiB1ZWJlciBkYXMgZHVua2VsYnJhdW5lIEhvbHouIisKKyAiIFdhcyBEdSBzcHVlcnN0LCBmdWVobHQgc2ljaCBrdWVobCB1bmQgYW5nZW5laG0gYW4sIGRpZSBaZWRlciwgZGllIisKKyAiIGZ1ZXIgZGllc2VzIGJlc3RhdW5lbnN3ZXJ0ZSBMZXNlcHVsdCBoZXJoYWx0ZW4gbXVzc3RlLCB3dXJkZSB2b3JzIisKKyAiaWNodGlnIHVuZCBhZXVzc2Vyc3Qga3Vuc3RmZXJ0aWcgYmVhcmJlaXRldC4gRWluIHdpcmtsaWNoIHNjaG9lbmVzIisKKyAiIEV4ZW1wbGFyIGhvbHpoYW5kd2Vya2xpY2hlciBLdW5zdC4iLDc4KTsKKyBpZiAoZ2V0dWlkKHRoaXNfcGxheWVyKCkpPT1vd25lcikKKyB7CisgIGlmIChNUVRCTUFTVEVSLT5RdWVyeVRhZ2VidWNoQXVmUHVsdCh0aGlzX3BsYXllcigpKSkKKyAgcmV0dXJuIEJTKAorICAiVm9yc2ljaHRpZyBmYWVocnN0IER1IG1pdCBkZW4gRmluZ2VybiB1ZWJlciBkYXMgZHVua2VsYnJhdW5lIEhvbHoiKworICAiLiBXYXMgRHUgc3B1ZXJzdCwgZnVlaGx0IHNpY2gga3VlaGwgdW5kIGFuZ2VuZWhtIGFuLCBkaWUgWmVkZXIsIGQiKworICAiaWUgZnVlciBkaWVzZXMgYmVzdGF1bmVuc3dlcnRlIExlc2VwdWx0IGhlcmhhbHRlbiBtdXNzdGUsIHd1cmRlIHYiKworICAib3JzaWNodGlnIHVuZCBhZXVzc2Vyc3Qga3Vuc3RmZXJ0aWcgYmVhcmJlaXRldC4gRWluIHdpcmtsaWNoIHNjaG8iKworICAiZW5lcyBFeGVtcGxhciBob2x6aGFuZHdlcmtsaWNoZXIgS3Vuc3QsIER1IGJpc3QgZnJvaCwgZGllc2VzIExlc2UiKworICAicHVsdCBlcnN0YW5kZW4genUgaGFiZW4uIEF1ZiBkZW0gTGVzZXB1bHQgc2llaHN0IER1IERlaW4gc2Nod2FyemUiKworICAicyBUYWdlYnVjaCBkZXMgS25vY2hlbnRlbXBlbHMsIGluIGRlbSBEdSBudW4gbnVyIG5vY2ggbGVzZW4ga2FubnMiKworICAidCwgZGVubiBEZWluZSBBYmVudGV1ZXIgZG9ydCBzaW5kIHZvbGxzdGFlbmRpZyB6dSBQYXBpZXIgZ2VicmFjaHQiKworICAiLiBBbGxlcmRpbmdzIGthbm5zdCBEdSBhdWNoIG5vY2ggZWluIHdlbmlnIHdlaXRlciBkcmluIGhlcnVtYmxhZXQiKworICAidGVybiwgd2VubiBEdSBtYWdzdC4iLDc4KTsKKyAgcmV0dXJuIEJTKAorICAiVm9yc2ljaHRpZyBmYWVocnN0IER1IG1pdCBkZW4gRmluZ2VybiB1ZWJlciBkYXMgZHVua2VsYnJhdW5lIEhvbHoiKworICAiLiBXYXMgRHUgc3B1ZXJzdCwgZnVlaGx0IHNpY2gga3VlaGwgdW5kIGFuZ2VuZWhtIGFuLCBkaWUgWmVkZXIsIGQiKworICAiaWUgZnVlciBkaWVzZXMgYmVzdGF1bmVuc3dlcnRlIExlc2VwdWx0IGhlcmhhbHRlbiBtdXNzdGUsIHd1cmRlIHYiKworICAib3JzaWNodGlnIHVuZCBhZXVzc2Vyc3Qga3Vuc3RmZXJ0aWcgYmVhcmJlaXRldC4gRWluIHdpcmtsaWNoIHNjaG8iKworICAiZW5lcyBFeGVtcGxhciBob2x6aGFuZHdlcmtsaWNoZXIgS3Vuc3QsIER1IGJpc3QgZnJvaCwgZGllc2VzIExlc2UiKworICAicHVsdCBlcnN0YW5kZW4genUgaGFiZW4uIEVpbiB3ZW5pZyBncnVlYmVsbiBsYWVzc3QgRGljaCBkaWUgVGF0c2EiKworICAiY2hlLCBkYXNzIGRhcyBMZXNlcHVsdCBsZWVyIGlzdC4gV2FzIG1hbiBkb3J0IHdvaGwgcGxhdHppZXJlbiBrYW4iKworICAibiA/Iiw3OCk7CisgfQorIHJldHVybiBCUygKKyAiVm9yc2ljaHRpZyBmYWVocnN0IER1IG1pdCBkZW4gRmluZ2VybiB1ZWJlciBkYXMgZHVua2VsYnJhdW5lIEhvbHouIisKKyAiLiBXYXMgRHUgc3B1ZXJzdCwgZnVlaGx0IHNpY2gga3VlaGwgdW5kIGFuZ2VuZWhtIGFuLCBkaWUgWmVkZXIsIGRpIisKKyAiZSBmdWVyIGRpZXNlcyBiZXN0YXVuZW5zd2VydGUgTGVzZXB1bHQgaGVyaGFsdGVuIG11c3N0ZSwgd3VyZGUgdm9yIisKKyAic2ljaHRpZyB1bmQgYWV1c3NlcnN0IGt1bnN0ZmVydGlnIGJlYXJiZWl0ZXQuIEVpbiB3aXJrbGljaCBzY2hvZW5lIisKKyAicyBFeGVtcGxhciBob2x6aGFuZHdlcmtsaWNoZXIgS3Vuc3QsIER1IGJpc3QgZWluIHdlbmlnIG5laWRpc2NoLiIrCisgIiIrKE1RVEJNQVNURVItPlF1ZXJ5VGFnZWJ1Y2hBdWZQdWx0KHRoaXNfcGxheWVyKCkpPyIgQXVmIGRlbSBMZXNlcCIrCisgInVsdCB3dXJkZSBlaW4gc2Nod2FyemVzIEJ1Y2ggYWJnZWxlZ3QsIGRhcyBzZWhyIHdlcnR2b2xsIGF1c3NpZWh0LiI6CisgIiBEYXMgTGVzZXB1bHQgc2llaHQgb2huZSBkYXp1Z2Vob2VyaWdlcyBCdWNoIGVpbiB3ZW5pZyBlaW5zYW0gYXVzLiIpKyIuIiw3OCk7Cit9CisKK3ZvaWQgQWRkVGhlT2xkRGV0YWlscygpCit7CisgQWRkRGV0YWlsKCh7ImJ1Y2giLCJidWVjaGxlaW4iLCJ0YWdlYnVjaCJ9KSxCUygKKyAiRGllcyBpc3QgZWluIGtsZWluZXMgQnVlY2hsZWluIGF1cyBHb2xkLCBhdWYgZGVtIGVpbiBOYW1lIGluICIrCisgInNjaHdhcnplbiBMZXR0ZXJuIHN0ZWh0LiBBbnNvbnN0ZW4gaXN0IGRlciBFaW5iYW5kIHNjaGxpY2h0LCAiKworICJkYXMgUGFwaWVyIHNjaG9uIGF1c2Z1ZWhybGljaCBiZXNjaHJpZWJlbiB1bmQgdm9tIHZpZWxlbiBCbGFlIisKKyAidHRlcm4gaGllciB1bmQgZGEgYXVjaCBzY2hvbiBlaW4gd2VuaWcgZ2Vrbmlja3QuIiw3OCkpOworIEFkZERldGFpbCgiYmxhZXR0ZXJuIixCUygKKyAiSmEsIGRhcyBzY2hvZW5lIEJ1ZWNobGVpbiBpc3Qgdm9uIGhhZXVmaWdlbSBCbGFldHRlcm4gbmljaHQgcyIrCisgImNob2VuZXIgZ2V3b3JkZW4sIGFiZXIgaXJnZW5kZXR3YXMgTWFnaXNjaGVzIGhhdCBlcyBzY2hvbiBhbiAiKworICJzaWNoLiBBYiB1bmQgYW4gbWFnc3QgRHUgaW1tZXIgd2llZGVyIGVpbm1hbCBoZXJ1bWJsYWV0dGVybi4iLDc4KSk7CisgQWRkRGV0YWlsKCJtYWdpc2NoZXMiLEJTKAorICJFcyBpc3QgbmljaHQgc28gZWluZmFjaCB6dSBlcmdydWVuZGVuLCBpbmRlbSBtYW4gZWlubWFsIGdlbmF1IisKKyAiZXIgaGluc2llaHQuIiw3OCkpOworIEFkZERldGFpbCgibGVkZXIiLEJTKAorICJEYXMgTGVkZXIgaXN0IGdsYXR0IHVuZCB2b2xsa29tbWVuIGd1ZWxkZW4uIE51ciBkaWUgc2Nod2FyemVuIisKKyAiIExldHRlcm4gZ2ViZW4gZWluZW4gYW5nZW5laG1lbiBLb250cmFzdCBhYi4gSXJnZW5kd2llIHNlbHRzYSIrCisgIm0sIGRlbm4gRHUgZmluZGVzdCwgZGFzcyBTY2h3YXJ6IHVuZCBHb2xkIGVpZ2VudGxpY2ggdW1nZWtlaHIiKworICJ0IG1laHIgU2lubiBtYWNoZW4uIiw3OCkpOworIEFkZERldGFpbCgic2lubiIsQlMoCisgIlZpZWxsZWljaHQgaXN0IGFiZXIgYXVjaCBhbGxlcyBiZXN0ZW5zLCB1bmQgbnVyIERlaW4gVmVyc3RhbmQiKworICIgd2lsbCBkYXMgbmljaHQgbmFjaHZvbGx6aWVoZW4uIiw3OCkpOworIEFkZERldGFpbCgidmVyc3RhbmQiLEJTKAorICJKYSwgYXVjaCBEdSBrYW5uc3QgaWhtIG5pY2h0IGltbWVyIGZvbGdlbiwgYWxzbyB3dW5kZXJlIERpY2ggIisKKyAibmljaHQsIHdhcnVtIGRpZXNlcyBMZWRlciBoaWVyIGdvbGRlbiB2ZXJmYWVyYnQgaXN0IHVuZCBkaWUgQiIrCisgInVjaHN0YWJlbiBkYXJhdWYgc2Nod2Fyei4iLDc4KSk7CisgQWRkRGV0YWlsKCh7ImxldHRlcm4iLCJidWNoc3RhYmVuIn0pLEJTKAorICJEdSBrYW5uc3Qgc2llIGxlc2VuLiIsNzgpKTsKKyBBZGREZXRhaWwoKHsibmFtZSIsIm5hbWVuIn0pLEJTKAorICJNYW4ga2FubiBpaG4gZ2VuYXVzbyBsZXNlbiB3aWUgZGllIEJ1Y2hzdGFiZW4uIiw3OCkpOworIEFkZERldGFpbCgia29udHJhc3QiLEJTKAorICJEaWUgQnVjaHN0YWJlbiBoZWJlbiBzaWNoIHdpcmtsaWNoIGRldXRsaWNoIHZvbSBndWVsZGVuZW4gTGVkIisKKyAiZXIgZGVzIEVpbmJhbmRzIGFiLiIsNzgpKTsKKyBBZGREZXRhaWwoImVpbmJhbmQiLEJTKAorICJFcyBpc3Qga2VpbiBhdWZ3YWVuZGlnZXIgRWluYmFuZCwgZnVlcndhaHIuIERlbm5vY2ggZmFzemluaWVyIisKKyAidCBkaWUgUHJhY2h0LCBkaWUgbWl0IGRlbiBzY2h3YXJ6ZW4gTGV0dGVybiBrb250cmFzdGllcnQuIiw3OCkpOworIEFkZERldGFpbCgicHJhY2h0IixCUygKKyAiU28gbXVzcyBtYW4gZGVuIGdvbGRlbmVuIEVpbmJhbmQgd29obCBuZW5uZW4uIiw3OCkpOworIEFkZERldGFpbCgoeyJwYXBpZXIiLCJzZWl0ZW4iLCJidWNoc2VpdGVuIiwic2VpdGUiLCJidWNoc2VpdGUifSksQlMoCisgIkRhcyBQYXBpZXIgaXN0IHZvbiBndXRlciBRdWFsaXRhZXQsIGRpZSBCdWNoc2VpdGVuIGxhc3NlbiBzaWMiKworICJoIHNpY2hlciBlaW5mYWNoIGJlc2NocmVpYmVuLiIsNzgpKTsKKyBBZGREZXRhaWwoKHsic2Nod2FyemUgYnVjaHNlaXRlbiIsInNjaHdhcnplIGJ1Y2hzZWl0ZSIsCisgInNjaHdhcnplIGJ1Y2hzZWl0ZSJ9KSxCUygKKyAiVGF0c2FlY2hsaWNoLCBiZWltIEJsYWV0dGVybiBzaWVoc3QgRHUgZWluaWdlIHNjaHdhcnplIEJ1Y2hzZSIrCisgIml0ZW4sIGRpZSB1bmJlc2NocmllYmVuIHNpbmQuIFdhcyBoYXQgZGllcyB6dSBiZWRldXRlbiA/Iiw3OCkpOworIEFkZERldGFpbCgicXVhbGl0YWV0IixCUygKKyAiRHUgc2llaHN0LCBkYXNzIGRhcyBQYXBpZXIgZmVzdCB1bmQgYmx1ZXRlbndlaXNzIGlzdC4iLDc4KSk7CisgQWRkUmVhZERldGFpbCgoeyJidWNoIiwiYnVlY2hsZWluIiwidGFnZWJ1Y2gifSksQlMoCisgIkRhcyBCdWNoIGhhdCBlaW4gSW5oYWx0c3ZlcnplaWNobmlzLiBXZW5uIGRvcnQgZXR3YXMgc3RlaHQsIGsiKworICJhbm5zdCBEdSBkYXMgb2RlciBkaWUgS2FwaXRlbCBzaWNoZXIgbGVzZW4uIiw3OCkpOworIEFkZERldGFpbCgia2FwaXRlbCIsQlMoCisgIkxpZXMgbnVyIGltIEluaGFsdHN2ZXJ6ZWljaG5pcyBuYWNoLCB2aWVsbGVpY2h0IGhhdCBkYXMgQnVjaCAiKworICJiZXJlaXRzIGVpbiBvZGVyIG1laHJlcmUgS2FwaXRlbC4iLDc4KSk7CisgQWRkUmVhZERldGFpbCgia2FwaXRlbCIsQlMoCisgIldlbGNoZXMgS2FwaXRlbCB3aWxsc3QgRHUgZGVubiBsZXNlbiA/IFNpZSBzaW5kIHNpY2hlciBkdXJjaG4iKworICJ1bW1lcmllcnQsIHdlbm4gbWFuIHNjaG9uIGV0d2FzIGltIEJ1Y2ggbmllZGVyZ2VzY2hyaWViZW4gaGF0LiIsNzgpKTsKKyBBZGRSZWFkRGV0YWlsKCh7Im5hbWUiLCJuYW1lbiIsImJ1Y2hzdGFiZW4iLCJsZXR0ZXJuIn0pLCMnbGUpOworIEFkZFJlYWREZXRhaWwoKHsiaW5oYWx0IiwiaW5oYWx0c3ZlcnplaWNobmlzIn0pLCMnaW4pOworIFNldFByb3AoUF9NQVRFUklBTCwoW01BVF9MRUFUSEVSOjEwLE1BVF9QQVBFUjoxNSxNQVRfQ0VEQVI6NzVdKSk7Cit9CisKK2ludCBkcm9wX2Jvb2soc3RyaW5nIHN0cikKK3sKKyBpZiAoIXN0cmluZ3Aoc3RyKSkKKyByZXR1cm4gMDsKKyBpZiAoc3Ryc3RyKGxvd2VyX2Nhc2Uoc3RyKSwicHVsdCIsMCk9PS0xKQorIHJldHVybiAwOworIG5vdGlmeV9mYWlsKEJTKAorICJXaWxsc3QgRHUgZXR3YXMgYXVmIGRhcyBQdWx0IGxlZ2VuID8gRWluIEJ1Y2ggd2FlcmUgcGFzc2VuZCwgIisKKyAiYWJlciBlcyBzb2xsdGUgc2Nob24gZXR3YXMgQmVzb25kZXJlcyBzZWluLiIsNzgpKTsKKyBpZiAoc3Ryc3RyKGxvd2VyX2Nhc2Uoc3RyKSwiYnVjaCIsMCk9PS0xJiYKKyAgICAgc3Ryc3RyKGxvd2VyX2Nhc2Uoc3RyKSwiYnVlY2hsZWluIiwwKT09LTEpCisgcmV0dXJuIDA7Cisgbm90aWZ5X2ZhaWwoQlMoCisgIkRhcyBpc3QgbmljaHQgRGVpbiBMZXNlcHVsdCwgRHUgbGFlc3N0IGVzIGJlc3NlciBpbiBSdWhlLiIsNzgpKTsKKyBpZiAoZ2V0dWlkKHRoaXNfcGxheWVyKCkpIT1vd25lcikKKyByZXR1cm4gMDsKKyBub3RpZnlfZmFpbChCUygKKyAiQXVmIGRlbSBQdWx0IGxpZWd0IHNjaG9uIGVpbiBnb2xkZW5lcyBCdWNoLiIsNzgpKTsKKyBpZiAoTVFUQk1BU1RFUi0+UXVlcnlUYWdlYnVjaEF1ZlB1bHQodGhpc19wbGF5ZXIoKSkpCisgcmV0dXJuIDA7Cisgbm90aWZ5X2ZhaWwoQlMoCisgIkVudHdlZGVyIGhhc3QgRHUgRGljaCBub2NoIG5pY2h0IGFscyB3dWVyZGlnIGVyd2llc2VuLCBpbmRlbSAiKworICJEdSBhbGxlIEF1ZmdhYmVuIGltIEtub2NoZW50ZW1wZWwgZXJmdWVsbHQgaGFzdCBvZGVyIER1IGhhc3QgIisKKyAiZGVtIEF2YXRhciBkZXMgV2FlY2h0ZXJzIGRlciBOYWNodCwgTWh1bidkYWUgSGVsLCBub2NoIG5pY2h0ICIrCisgIkRlaW5lIEF1ZndhcnR1bmcgZ2VtYWNodCB1bmQgaWhtIGdlemVpZ3QsIGRhc3MgRHUgd3VlcmRpZyBiaXMiKworICJ0LCBlaW4gZ2VlaWduZXRlcyBCdWNoIHp1IGVtcGZhbmdlbi4gQXVmIGFsbGUgRmFlbGxlIGthbm5zdCBEIisKKyAidSBoaWVyIG5vY2ggbmljaHRzIGF1ZiBkYXMgUHVsdCBsZWdlbi4iLDc4KSk7CisgaWYgKCFwcmVzZW50X2Nsb25lKE9CSigiYnVlY2hsZWluX2ludmVycyIpLHRoaXNfcGxheWVyKCkpKQorIHJldHVybiAwOworIE1RVEJNQVNURVItPkFkZEJ1Y2hBdWZQdWx0KHRoaXNfcGxheWVyKCkpOworIHRoaXNfcGxheWVyKCktPlJlY2VpdmVNc2coQlMoCisgIlZvcnNpY2h0aWcgc2NobGFlZ3N0IER1IERlaW4gZ3VlbGRlbmVzIFRhZ2VidWNoIGF1ZiwgZGFzIERpciAiKworICJNaHVuJ2RhZSBIZWwsIGRhcyBBdmF0YXIgZGVzIFdhZWNodGVycyBkZXIgTmFjaHQsIHVlYmVycmVpY2h0IisKKyAiIGhhdC4gRHUgbGVnc3QgZXMgc2FjaHRlIGF1ZiBkYXMgUHVsdCB1bmQgbWVya3N0LCBkYXNzIGVzIHNvZiIrCisgIm9ydCBlaW5lIG1hZ2lzY2hlIFZlcmJpbmR1bmcgbWl0IGRlbSBMZXNlcHVsdCBlaW5nZWh0LiBFcyBpc3QiKworICIgbnVuIHVudHJlbm5iYXIgbWl0IGRpZXNlbSB2ZXJidW5kZW4uIiw3OCksTVRfTUFHSUMsTUFfVVNFKTsKKyB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSxCUygKKyB0aGlzX3BsYXllcigpLT5OYW1lKFdFUikrIiBsZWd0IHZvcnNpY2h0aWcgZWluIGd1ZWxkZW5lcyBCdWNoICIrCisgIm1pdCBzY2h3YXJ6ZW4gTGV0dGVybiBhdWZnZXNjaGxhZ2VuIGF1ZiBkZW0gTGVzZXB1bHQgYWIgdW5kIGIiKworICJldHJhY2h0ZXQgZGllc2VzIGRhbm4gZWhyZnVlcmNodGlnIHVuZCB6dXRpZWZzdCB6dWZyaWVkZW4uIiw3OCksCisgKHt0aGlzX3BsYXllcigpfSkpOworIHJldHVybiAxOworfQorCitpbnQgY21kX2JsYWV0dGVybihzdHJpbmcgc3RyKQoreworIG5vdGlmeV9mYWlsKEJTKAorICJBdWYgZGVtIExlc2VwdWx0IGxpZWd0IGRvY2ggZ2FyIGtlaW4gVGFnZWJ1Y2guIiw3OCkpOworIGlmICghKE1RVEJNQVNURVItPlF1ZXJ5VGFnZWJ1Y2hBdWZQdWx0KGZpbmRfcGxheWVyKG93bmVyKSkpKQorIHJldHVybiAwOworIG5vdGlmeV9mYWlsKEJTKAorICJEYXMgaXN0IG5pY2h0IERlaW4gVGFnZWJ1Y2gsIER1IGxhZXNzdCBlcyBsaWViZXIgaW4gRnJpZWRlbi4iLDc4KSk7CisgaWYgKGdldHVpZCh0aGlzX3BsYXllcigpKSE9b3duZXIpCisgcmV0dXJuIDA7CisgdGhpc19wbGF5ZXIoKS0+UmVjZWl2ZU1zZyhCUygKKyAiRHUgYmxhZXR0ZXJzdCBlaW4gd2VuaWcgZHVyY2ggRGVpbiBUYWdlYnVjaCB1bmQgc3RvZXNzdCBhdWYgZSIrCisgImluaWdlIHJhZXRzZWxoYWZ0ZSBzY2h3YXJ6ZSBTZWl0ZW4uIFdhcyBtYWcgZXMgZGFtaXQgYXVmIHNpY2giKworICIgaGFiZW4gPyBPYiBEdSBzaWUgaGVyYXVzbmVobWVuIGthbm5zdCA/Iiw3OCksTVRfTE9PSyxNQV9MT09LKTsKKyByZXR1cm4gMTsKK30KKworaW50IHRha2VfcGFnZShzdHJpbmcgc3RyKQoreworIGlmICghc3RyaW5ncChzdHIpKQorIHJldHVybiAwOworIGlmIChwcmVzZW50KHN0cixlbnZpcm9ubWVudCgpKSkKKyByZXR1cm4gMDsKKyBub3RpZnlfZmFpbChCUygKKyAiV28gc2llaHN0IER1IGRlbm4gaGllciBlaW4gQnVjaCA/Iiw3OCkpOworIGlmICghKE1RVEJNQVNURVItPlF1ZXJ5VGFnZWJ1Y2hBdWZQdWx0KHRoaXNfcGxheWVyKCkpKSYmCisgICAgIHN0cnN0cihsb3dlcl9jYXNlKHN0ciksImJ1Y2giKSE9LTEpCisgcmV0dXJuIDA7CisgaWYgKChvd25lciE9Z2V0dWlkKHRoaXNfcGxheWVyKCkpKSYmCisgICAgIHN0cnN0cihsb3dlcl9jYXNlKHN0ciksImJ1Y2giKSE9LTEpCisgbm90aWZ5X2ZhaWwoQlMoCisgIkRpZXMgaXN0IG5pY2h0IERlaW4gTGVzZXB1bHQgb2RlciBEZWluIEJ1Y2ggZGFyYXVmLCBkZXNoYWxiIGwiKworICJhZXNzdCBEdSBlcyB2b3JzaWNodHNoYWxiZXIgbGllZ2VuLiIsNzgpKTsKKyByZXR1cm4gMDsKKyBpZiAoKG93bmVyIT1nZXR1aWQodGhpc19wbGF5ZXIoKSkpJiYKKyAgICAgc3Ryc3RyKGxvd2VyX2Nhc2Uoc3RyKSwic2VpdGUiKSE9LTEpCisgbm90aWZ5X2ZhaWwoQlMoCisgIkRpZSBFaWdlbnR1ZW1lcmluIG9kZXIgZGVyIEVpZ2VudHVlbWVyIGRlcyBMZXNlcHVsdHMgaGFldHRlIHMiKworICJpY2hlciBldHdhcyBkYWdlZ2VuLCB3ZW5uIER1IGRhcyBCdWNoIHplcnN0b2Vyc3QsIGFsc28gbGFlc3N0IisKKyAiIER1IGVzIGxpZWJlci4iLDc4KSk7CisgcmV0dXJuIDA7CisgLy8gSGVpbHVuZyAxeCBhbGxlIDYgU3R1bmRlbi4KKyBpZiAodGhpc19wbGF5ZXIoKS0+Y2hlY2tfYW5kX3VwZGF0ZV90aW1lZF9rZXkoMjE2MDAsIkFya19IZWxzX1NjaHdhcnplc19CdWNoIik9PS0xKQorIHsKKyAgb2JqZWN0IG87CisgIHRoaXNfcGxheWVyKCktPlJlY2VpdmVNc2coQlMoCisgICJEdSByZWlzc3QgZXJzdCB2b3JzaWNodGlnIGVpbmUgc2Nod2FyemUgU2VpdGUgdW5kIGRhbm4gZWluZSIrCisgICIgd2VpdGVyZSBhdXMgZGVtIGdvbGRlbmVuIEJ1Y2guIERhbm4gdWViZXJmYWVsbHQgRGljaCBlaW5lICIrCisgICJrbGVpbmUgU2Nod2FlY2hlLCBkaWUgRGljaCB2b3Igd2VpdGVyZW0gWmVyc3RvZXJlbiBpbm5laGFsdCIrCisgICJlbiBsYWVzc3QuIER1IHNvbGx0ZXN0IEhlbHMgR3Jvc3N6dWVnaWdrZWl0IG5pY2h0IHVlYmVyc2NoYSIrCisgICJldHplbi4iLDc4KSxNVF9GRUVMLE1BX1RBS0UpOworICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSxCUygKKyAgdGhpc19wbGF5ZXIoKS0+TmFtZShXRVIpKyIgcmVpc3N0IHp3ZWkgU2VpdGVuIGF1cyBkZW0gQnVjaCwgIisKKyAgImRhcyBhdWYgZGVtIFB1bHQgbGllZ3QuIERhbm4gaGFlbHQgIit0aGlzX3BsYXllcigpLT5RdWVyeVByb25vdW4oV0VSKSsiIisKKyAgIiBpbm5lLCB3YWhyc2NoZWlubGljaCBmb2xndCAiK3RoaXNfcGxheWVyKCktPlF1ZXJ5UHJvbm91bihXRVIpKyIiKworICAiIGVpbmVyIGtsdWdlbiBFaW5nZWJ1bmcuIiw3OCkpOworICBvPWNsb25lX29iamVjdChPQkooInJlZ19zZWl0ZSIpKTsKKyAgaWYgKG8tPm1vdmUodGhpc19wbGF5ZXIoKSkhPU1PVkVfT0spCisgIHsKKyAgIG8tPnJlbW92ZSgxKTsKKyAgIHRoaXNfcGxheWVyKCktPlJlY2VpdmVNc2coQlMoCisgICAiRHUga2FubnN0IGRpZSBlcnN0ZSBTZWl0ZSBuaWNodCBtZWhyIHRyYWdlbiwgc2llIGxvZXN0IHNpYyIrCisgICAiaCBlaW5mYWNoIGF1Zi4iLDc4KSxNVF9NQUdJQyxNQV9SRU1PVkUpOworICB9CisgIC8vIERpZSBlcnN0ZSBTZWl0ZSBiZWhhbmRlbHQsIGhpZXIsIGZhbGxzIG1hbiBhdWNoIGRpZSB6d2VpdGUKKyAgLy8gU2VpdGUgbmljaHQgdHJhZ2VuIGthbm4gb2RlciBtaXQgZGVyIGVyc3RlbiBhbSBMaW1pdCBpc3QuCisgIG89Y2xvbmVfb2JqZWN0KE9CSigicmVnX3NlaXRlIikpOworICBpZiAoby0+bW92ZSh0aGlzX3BsYXllcigpKSE9TU9WRV9PSykKKyAgeworICAgby0+cmVtb3ZlKDEpOworICAgdGhpc19wbGF5ZXIoKS0+UmVjZWl2ZU1zZyhCUygKKyAgICJEdSBrYW5uc3QgZGllIHp3ZWl0ZSBTZWl0ZSBuaWNodCBtZWhyIHRyYWdlbiwgc2llIGxvZXN0IHNpIisKKyAgICJjaCBlaW5mYWNoIGF1Zi4iLDc4KSxNVF9NQUdJQyxNQV9SRU1PVkUpOworICB9CisgIHJldHVybiAxOworIH0KKyB0aGlzX3BsYXllcigpLT5SZWNlaXZlTXNnKEJTKAorICJWZXJnZWJsaWNoIHJlaXNzdCBEdSBtZWhyIG9kZXIgd2VuaWdlciB2b3JzaWNodGlnIGFuIGVpbmlnZW4iKworICIgc2Nod2FyemVuIFNlaXRlbiBpbSBCdWNoIGhlcnVtLCBkb2NoIHNpZSBibGVpYmVuIHN0b2VycmlzY2giKworICIuIEVzIHdpcmQgd29obCBlaW4gd2VuaWcgZGF1ZXJuLCBiaXMgRHUgZGFzIHdpZWRlciB2ZXJzdWNoZW4iKworICIga2FubnN0LiIsNzgpLE1UX01BR0lDLE1BX1VTRSk7CisgdGVsbF9yb29tKGVudmlyb25tZW50KCksQlMoCisgdGhpc19wbGF5ZXIoKS0+TmFtZShXRVIpKyIgcmVpc3N0IGltIEJ1Y2ggYXVmIGRlbSBMZXNlcHVsdCBoZSIrCisgInJ1bS4iLDc4KSwoe3RoaXNfcGxheWVyKCl9KSk7CisgcmV0dXJuIDE7Cit9CisKK2ludCBjbWRfbGVzZW4oc3RyaW5nIHN0cikKK3sKK2ludCBrOworIGlmKCFzdHIpIHJldHVybiAwOworIGlmIChvd25lcj09IkFub255bXVzIikKKyB7CisgIHdyaXRlIChCUygKKyAgIkRpZXNlcyBMZXNlcHVsdCBzY2hlaW50IG5pZW1hbmRlbSB6dSBnZWhvZXJlbiAuLi4gZXMgbG9lc3QgcyIrCisgICJpY2ggZGFoZXIgZWluZmFjaCBhdWYsIGFscyBEdSBkYXJhdWYgZXR3YXMgbGVzZW4gd2lsbHN0LiIsNzgpKTsKKyAgcmVtb3ZlKDEpOworICByZXR1cm4gMTsKKyB9CisgaWYgKGdldHVpZCh0aGlzX3BsYXllcigpKSE9b3duZXIpCisgeworICBub3RpZnlfZmFpbChCUygKKyAgIkRpZXNlcyBUYWdlYnVjaCBnZWhvZXJ0ICIrY2FwaXRhbGl6ZShvd25lcikrIiwgbmljaHQgRGlyLCBEdSIrCisgICIgYmlzdCBlaWdlbnRsaWNoIG5pY2h0IHNvIHJlY2h0IGFuIGRlbSBpbnRlcmVzc2llcnQsIHdhcyBtYW4iKworICAiIGluIGRlbSBCdWNoIG5pZWRlcmdlc2NocmllYmVuIGhhdC4gU2ljaGVyIGlzdCBlcyB1ZWJlcnRyaWViIisKKyAgImVuIGxhbmdhdG1pZyBmb3JtdWxpZXJ0IHVuZCBzdGltbXQgbmljaHQgZ2VuYXUgbWl0IGRlbSB1ZWJlciIrCisgICJlaW4sIHdhcyB3aXJrbGljaCBnZXNjaGFoLiBNYW4ga2VubnQgZGFzIGphLiIsNzgpKTsKKyAgcmV0dXJuIDA7CisgfQorIGlmIChzdHJzdHIobG93ZXJfY2FzZShzdHIpLCJrYXBpdGVsIiwwKSE9LTEmJgorICAgICBzc2NhbmYobG93ZXJfY2FzZShzdHIpLCJrYXBpdGVsICVkIixrKSE9MSkKKyB7CisgIHdyaXRlIChCUygKKyAgIldpbGxzdCBEdSBlaW4gS2FwaXRlbCBhdXMgZGVtIEJ1Y2ggbGVzZW4gPyBEYW5uIGdpYiBiaXR0ZSBlaSIrCisgICJuZSBaaWZmZXIgYW4uIiw3OCkpOworICByZXR1cm4gMTsKKyB9CisgaWYgKGs+MCkKKyB7CisgIE1RVEJNQVNURVItPkxpZXNRdWVzdChrLHRoaXNfcGxheWVyKCkpOworICByZXR1cm4gMTsKKyB9CisgcmV0dXJuIDA7Cit9CisKK2ludCBjbWRfZWludHJhZ2VuKHN0cmluZyBzdHIpCit7CitpbnQgaTsKKyBpZiAoIShNUVRCTUFTVEVSLT5RdWVyeVRhZ2VidWNoQXVmUHVsdCh0aGlzX3BsYXllcigpKSkpCisgeworICBub3RpZnlfZmFpbChCUygKKyAgIkR1IGZpbmRlc3QgaGllciBuaWNodHMsIHdvcmluIER1IGV0d2FzIGVpbnRyYWdlbiBrb2VubnRlc3QuIiw3OCkpOworICByZXR1cm4gMDsKKyB9CisgaWYgKGdldHVpZCh0aGlzX3BsYXllcigpKSE9b3duZXIpCisgeworICBub3RpZnlfZmFpbChCUygKKyAgIkRpZXNlcyBUYWdlYnVjaCBnZWhvZXJ0ICIrY2FwaXRhbGl6ZShvd25lcikrIiwgbmljaHQgRGlyLCBEdSIrCisgICIga2FubnN0IGRhcmluIG5pY2h0cyBlaW50cmFnZW4uIiw3OCkpOworICByZXR1cm4gMDsKKyB9Cisgbm90aWZ5X2ZhaWwoQlMoCisgIkRlaW5lIE1pc3Npb25lbiBpbSBLbm9jaGVudGVtcGVsIC4uLiBiZXNzZXIgZ2VzYWd0LCBkZW0gV3lybXQiKworICJlbXBlbCwgc2llIHNpbmQgYWxsZXNhbXQgdGFwZmVyIHZvbiBEaXIgZXJmdWVsbHQgd29yZGVuLiBEdSBrIisKKyAiYW5uc3QgaGllciBuaWNodHMgd2VpdGVyIG1laHIgZWludHJhZ2VuLCBzaWNoZXIgYWJlciB2b24gZGVyICIrCisgImFya2FuZW4gTWFjaHQgZGVzIEJ1Y2hlcyBwcm9maXRpZXJlbiwgd2VubiBEdSBlcyBlaW5tYWwgZHVyY2giKworICJibGFldHRlcnN0LiIsNzgpKTsKKyByZXR1cm4gMDsKK30KKworc3RyaW5nIGNhbGNfbmFtZSgpCit7CitzdHJpbmcgKm5hbTsKK3N0cmluZyByZXM7CitpbnQgaSxqOworIHJlcz0iIjsKKyBpZiAob3duZXI9PSIiKQorIHJldHVybiAiIjsKKyBuYW09ZXhwbG9kZSh1cHBlcnN0cmluZyhvd25lciksIiIpOworIGlmIChqPXNpemVvZihuYW0pKQorIHsKKyAgc3dpdGNoKGopCisgIHsKKyAgIGNhc2UgMy4uNDoKKyAgICByZXM9IiAgICAgICAgICAiOworICAgIGJyZWFrOworICAgY2FzZSA1OgorICAgIHJlcz0iICAgICAgICAiOworICAgIGJyZWFrOworICAgY2FzZSA3OgorICAgIHJlcz0iICAgICAgIjsKKyAgICBicmVhazsKKyAgIGNhc2UgOToKKyAgICByZXM9IiAgICAiOworICAgIGJyZWFrOworICAgZGVmYXVsdDoKKyAgICByZXM9IiAgICI7CisgIH0KKyAgZm9yIChpPTA7aTxqO2krKykKKyAgeworICAgcmVzKz1uYW1baV0rIiAiOworICB9CisgfQorIHJldHVybiByZXM7Cit9CisKK3N0cmluZyBsZShzdHJpbmcga2V5KQoreworIHJldHVybiAiXG4iKworICIgICAgRGUgVGVtcGx1bSBPcyBIZWxcblxuIisKKyBjYWxjX25hbWUoKSsiXG5cbiI7Cit9CisKK3N0cmluZyBpbihzdHJpbmcga2V5KQoreworIGlmIChvd25lciE9Z2V0dWlkKHRoaXNfcGxheWVyKCkpKQorIHJldHVybiAiRG9ydCBzdGVodCBhbGxlcmRpbmdzIG5pY2h0cy4gU2VsdHNhbS5cbiI7CisgcmV0dXJuIE1RVEJNQVNURVItPkxpZXNJbmhhbHQoZmluZF9wbGF5ZXIob3duZXIpKTsKK30KKworLy8gRGFzIGhpZXIgYmV6ZWljaG5ldCBkZW4gVXJoZWJlciBkZXMgTW9lYmVsc3R1ZWNrcy4KKy8vIE5pY2h0IG1laW5lIElkZWUhCitzdHJpbmcgR2V0T3duZXIoKSB7IHJldHVybiAiQXJrIjsgfQorCitpbnQgY21kX29lZmZuZW4oc3RyaW5nIHN0cikKK3sKKyBpZiAoc3Ryc3RyKGxvd2VyX2Nhc2Uoc3RyKSwicHVsdCIpIT0tMSkKKyB7CisgIHRoaXNfcGxheWVyKCktPlJlY2VpdmVNc2coCisgICJEdSBrYW5uc3QgZGFzIFB1bHQgbmljaHQgb2VmZm5lbiwgbnVyIGV0d2FzIHp1bSBMZXNlbiBkYXJhdWZsZWdlbi4iLAorICBNVF9MT09LLE1BX0ZFRUwpOworICByZXR1cm4gMTsKKyB9CisgaWYgKHN0cnN0cihsb3dlcl9jYXNlKHN0ciksImJ1Y2giKSE9LTEpCisgeworICBpZiAoIShNUVRCTUFTVEVSLT5RdWVyeVRhZ2VidWNoQXVmUHVsdCh0aGlzX3BsYXllcigpKSkpCisgIHJldHVybiAwOworICB0aGlzX3BsYXllcigpLT5SZWNlaXZlTXNnKAorICAiRGFzIHNjaHdhcnplIEJ1Y2ggaXN0IGRvY2ggc2Nob24gZ2VvZWZmbmV0LiIsTVRfTE9PSyxNQV9GRUVMKTsKKyAgcmV0dXJuIDE7CisgfQorIC8vIEFsbGVzIGFuZGVyZSBwZXIgRGVmYXVsdC4KKyByZXR1cm4gMDsKK30KKworaW50IGNtZF9zY2hsaWVzc2VuKHN0cmluZyBzdHIpCit7CisgaWYgKHN0cnN0cihsb3dlcl9jYXNlKHN0ciksInB1bHQiKSE9LTEpCisgeworICB0aGlzX3BsYXllcigpLT5SZWNlaXZlTXNnKAorICAiRHUga2FubnN0IGRhcyBQdWx0IG5pY2h0IHNjaGxpZXNzZW4uIixNVF9MT09LLE1BX0ZFRUwpOworICByZXR1cm4gMTsKKyB9CisgaWYgKHN0cnN0cihsb3dlcl9jYXNlKHN0ciksImJ1Y2giKSE9LTEpCisgeworICBpZiAoIShNUVRCTUFTVEVSLT5RdWVyeVRhZ2VidWNoQXVmUHVsdCh0aGlzX3BsYXllcigpKSkpCisgIHJldHVybiAwOworICB0aGlzX3BsYXllcigpLT5SZWNlaXZlTXNnKAorICAiRGFzIEJ1Y2ggYmxlaWJ0IHRyb3R6IERlaW5lciBCZW11ZWh1bmdlbiBlaW5mYWNoIG9mZmVuLiIsTVRfTE9PSyxNQV9GRUVMKTsKKyAgcmV0dXJuIDE7CisgfQorIGVsc2UgcmV0dXJuIDA7Cit9CisKK21peGVkIF9xdWVyeV9ub2dldCgpCit7CisgaWYgKGdldHVpZCh0aGlzX3BsYXllcigpKSE9b3duZXIpCisgcmV0dXJuIEJTKAorICJEaWVzIGlzdCBvZmZlbnNpY2h0bGljaCBuaWNodCBEZWluIFB1bHQsIGRlc2hhbGIgbGFlc3N0ICIrCisgIkR1IGVzIGF1Y2ggYmVzc2VyIGxpZWdlbi4iLDc4KTsKKyByZXR1cm4gMDsKK30KKworc3RyaW5nIF9xdWVyeV9hdXRvbG9hZG9iaigpCit7CisgcmV0dXJuIFF1ZXJ5T3duZXIoKTsKK30KKworc3RyaW5nIF9zZXRfYXV0b2xvYWRvYmooc3RyaW5nIHMpCit7CisgcmV0dXJuIFF1ZXJ5T3duZXIoKTsKK30KKworLy8gQmVpbSBLYXVmIHNldHplbiB3aXIgZXJzdG1hbCBudXIgZGVuIEVpZ2VudHVlbWVyLgorLy8gSXN0IGF1cyBTd2lmdHMgQ29udGFpbmVyLCBkZXIgZGllc2UgRnVua3Rpb24gaW0KKy8vIE5vdGlmeU1vdmUoKSBhdWZydWZ0LgorcHJvdGVjdGVkIHZvaWQgU2V0QmVzaXR6ZXIoc3RyaW5nIHVpZCwgc3RyaW5nIHV1aWQpCit7CisgU2V0T3duZXIodWlkKTsKKyBNUVRCTUFTVEVSLT5BZGRMZXNlcHVsdChmaW5kX3BsYXllcih1aWQpfHxmaW5kX25ldGRlYWQodWlkKSk7Cit9CmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL21vZWJlbC5oIGIvZC9zZWhlci9oYWV1c2VyL21vZWJlbC9tb2ViZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWJjNDc0Ci0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL21vZWJlbC9tb2ViZWwuaApAQCAtMCwwICsxLDEzIEBACisjaWZuZGVmIF9TRUhFUk1PRUJFTF9IXworI2RlZmluZSBfU0VIRVJNT0VCRUxfSF8KKworI2RlZmluZSBMQURFTih4KSAiL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvIit4CisjZGVmaW5lIFJBVU1fVk9SX0xBREVOICIvZC91bnRlcndlbHQvd3VyemVsL2RvcmYvbnN0cjIiCisjZGVmaW5lIElERUVOX0xPRyAiaWRlZW4ubG9nIgorI2RlZmluZSBTSFZFUldBTFRFUiAiL2Qvc2VoZXIvaGFldXNlci9oYXVzdmVyd2FsdGVyIgorI2RlZmluZSBWRVJBTlRXT1JUTElDSEVSX01BR0lFUiAiU2VsZXZlbiIgCisvLyBEZXIgRXJoYWVsdCBCdWctTWFpbHMgZGVyIFNwaWVsZXIhCisjZGVmaW5lIFNDSFJBTktNQVNURVIgbG9hZF9vYmplY3QoTEFERU4oInNjaHJhbmttYXN0ZXIiKSkKKworI2VuZGlmIC8vIF9TRUhFUk1PRUJFTF9IXworCmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL211ZWxsY29udGFpbmVyLmMgYi9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL211ZWxsY29udGFpbmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU5NWQxOAotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvbXVlbGxjb250YWluZXIuYwpAQCAtMCwwICsxLDkyIEBACisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBOYW1lIGRlcyBPYmplY3RzOiAgICBNdWVsbGNvbnRhaW5lcgorLy8gTGV0enRlIEFlbmRlcnVuZzogICAgMTcuMDMuMjAwMQorLy8gTWFnaWVyOiAgICAgICAgICAgICAgU3dpZnQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2luY2x1ZGUgInNjaHJhbmtsYWRlbi5oIgoraW5oZXJpdCBMQURFTigic3dpZnRfc3RkX2NvbnRhaW5lciIpOworCisjZGVmaW5lIFZFUlNJT05fT0JKICIuMDAzIgorCitjcmVhdGUoKQoreworICBpZiAoIWNsb25lcChUTykpIHJldHVybjsKKyAgc3dpZnRfc3RkX2NvbnRhaW5lcjo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9TSE9SVCwgIkVpbiBNdWVsbGNvbnRhaW5lciIpOworICBTZXRQcm9wKFBfTE9ORywgQlMoCisgICAgICJFaW4gZ3Jvc3NlciBDb250YWluZXIgYXVzIFN0YWhsLCBhdXMgZGVtIGVzIG5pY2h0IGdlcmFkZSBhbmdlbmVobSBkdWZ0ZXQuICIKKyAgICArIk9mZmVuc2ljaHRsaWNoIHdlcmRlbiBkb3J0IGFsbGUgU2FjaGVuIGVudHNvcmd0LCBkaWUgU2VoZXIgbmljaHQgZ2VybmUgaW4gIgorICAgICsiaWhyZW0gSGF1cyBvZGVyIGF1ZiBkZXIgU3RyYXNzZSBoZXJ1bWxpZWdlbiBzZWhlbi4iKQorICAgICsiQEBjbnRfc3RhdHVzQEAiKTsKKyAgQWRkSWQoKHsibXVlbGxjb250YWluZXIiLCAiY29udGFpbmVyIn0pKTsKKyAgU2V0UHJvcCgiY250X3ZlcnNpb25fb2JqIiwgVkVSU0lPTl9PQkopOworICBTZXRQcm9wKFBfTkFNRSwgIk11ZWxsY29udGFpbmVyIik7CisgIFNldFByb3AoUF9HRU5ERVIsIE1BTEUpOworICBTZXRQcm9wKFBfV0VJR0hULCA1MDAwKTsgICAgICAgICAvLyBHZXdpY2h0IDUgS2cKKyAgU2V0UHJvcChQX01BWF9XRUlHSFQsIDEwMDAwMDApOyAgLy8gRXMgcGFzc2VuIGZ1ZXIgMTAwMCBrZyBTYWNoZW4gcmVpbi4KKyAgU2V0UHJvcChQX1dFSUdIVF9QRVJDRU5ULCAxMDApOyAgLy8gRGFmdWVyIG1hY2h0IGVyIGF1Y2ggbml4IGxlaWNodGVyIDopCisgIFNldFByb3AoUF9NQVhfT0JKRUNUUywgMTAwKTsgICAgIC8vIE1laHIgc29sbHRlIG5pY2h0IHNlaW4sIGx0LiBUaWFtYWsuCisgIFNldFByb3AoUF9WQUxVRSwgMCk7ICAgICAgICAgICAgIC8vIEtlaW4gbWF0ZXJpZWxsZXIgV2VydC4gSXN0IGVoIG5pY2h0IHZlcmthdWZiYXIuCisgIFNldFByb3AoUF9OT0JVWSwgMSk7ICAgICAgICAgICAgIC8vIFdpcmQgaW0gTGFkZW4gemVyc3RvZXJ0LCBmYWxscyBlciB2ZXJrYXVmdCB3aXJkLgorICBTZXRQcm9wKFBfTk9HRVQsICJEYXMgZ2VodCBuaWNodC4gIitOYW1lKFdFUiwxKSsiIGhhZnRldCB3aWUgbWFnaXNjaCBhbSBCb2Rlbi5cbiIpOworICBTZXRQcm9wKFBfTUFURVJJQUwsICh7TUFUX1NURUVMLCBNQVRfTUlTQ19NQUdJQ30pICk7CisgIFNldFByb3AoUF9JTkZPLCAiVmVyc3VjaHMgbWFsIG1pdDogXCJza29tbWFuZG9zICIrUXVlcnlQcm9wKFBfSURTKVsxXSsiXCIgIVxuIik7CisKKyAgQWRkU21lbGxzKCh7ImNvbnRhaW5lciIsICJkdWZ0IiwgImdlc3RhbmsifSksIEJTKCJBdXMgIituYW1lKFdFTSwxKSsiIHN0aW5rdCBlcyAiCisgICAgKyJzY2hvbiBnYW56IHNjaG9lbiwgYWJlciBEZWluZSBOYXNlIGlzdCBqYSBhbGxlcmhhbmQgZ2V3b2VobnQuIikpOworCisgIEFkZENtZCgoeyJ3aXJmIiwgIndlcmYiLCAid2VyZmUifSksICJ3ZWd3ZXJmZW4iKTsKK30KKworaW50IHdlZ3dlcmZlbihzdHJpbmcgc3RyKQoreworICBzdHJpbmcgd2FzLGlud2FzOworICBub3RpZnlfZmFpbCgiV2FzIHdpbGxzdCBEdSB3byBoaW5laW4gd2VyZmVuP1xuIik7CisgIGlmKCFzdHIpIHJldHVybiAwOworICBpZiggc3NjYW5mKHN0ciwgIiVzIGluICVzIiwgd2FzLCBpbndhcykgIT0gMikKKyAgICByZXR1cm4gMDsKKyAgaWYoIHByZXNlbnQoaW53YXMpPT1UTyApICAgLy8gRGllcyBPYmpla3QgaXN0IGdlbWVpbnQhCisgIHsKKyAgICBUUC0+Y29tbWFuZF9tZSgic3RlY2tlICIrc3RyKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsgIAorfQorCit2YXJhcmdzIGludCBQcmV2ZW50SW5zZXJ0KG9iamVjdCBvYikKK3sKKyAgaWYoIGxpdmluZyhvYikgKQorICB7CisgICAgd3JpdGUoIEJTKCJMZWJld2VzZW4ga2FubnN0IER1IG5pY2h0IGluICIrbmFtZShXRU4sMSkrIiB3ZXJmZW4hIikpOworICAgIHJldHVybiAxOworICB9CisgIGVsc2UgaWYoIG9iLT5RdWVyeVByb3AoUF9WQUxVRSkgKQorICB7CisgICAgd3JpdGUoIEJTKCJOdXIgRGluZ2Ugb2huZSBtYXRlcmllbGxlbiBXZXJ0IGxhc3NlbiBzaWNoIGluICIKKyAgICAgICtuYW1lKFdFTiwxKSsiIHdlcmZlbi4iKSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgZWxzZSBpZiggb2ItPlF1ZXJ5UHJvcChQX0NVUlNFRCkgKQorICB7CisgICAgd3JpdGUoIEJTKCJWZXJmbHVjaHRlIERpbmdlIGthbm5zdCBEdSBuaWNodCBpbiAiK25hbWUoV0VOLDEpKyIgd2VyZmVuISIpKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBlbHNlCisgICAgcmV0dXJuIDo6UHJldmVudEluc2VydChvYik7Cit9CisKK3ZvaWQgcmVzZXQoKQoreworICBpbnQgaTsKKyAgb2JqZWN0ICppbnY7CisgIDo6cmVzZXQoKTsKKyAgaW52PWFsbF9pbnZlbnRvcnkoVE8pOworICBpZihpbnYgJiYgc2l6ZW9mKGludikpCisgIHsKKyAgICBmb3IoaT1zaXplb2YoaW52KS0xO2k+PTA7aS0tKQorICAgICAgZGVzdHJ1Y3QoaW52W2ldKTsKKyAgICB0ZWxsX3Jvb20oRVRPLCBCUygiQXVzICIrbmFtZShXRU0sMSkrIiBlcnRvZW50IGt1cnogZWluIEtuaXN0ZXJuIHVuZCBLbmFja2VuLCAiCisgICAgICAgICAgICsiZGFubiBpc3Qgd2llZGVyIFJ1aGUuIikpOworICB9Cit9CmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL3ByZWlzbGlzdGUudHh0IGIvZC9zZWhlci9oYWV1c2VyL21vZWJlbC9wcmVpc2xpc3RlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWU3ODM5Ci0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL21vZWJlbC9wcmVpc2xpc3RlLnR4dApAQCAtMCwwICsxLDEwMiBAQAorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorRCBFIFIgICBTIEMgSCBSIEEgRSBOIEsgRSBSICAgLSAgIFAgUiBFIEkgUyBMIEkgUyBUIEUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0hlcnpsaWNoIHdpbGxrb21tZW4gaW0gU0NIUkFFTktFUi4gQmVpIHVucyBmaW5kZW4gU2llCitkYXMgaWRlYWxlIE1vYmlsaWFyIGZ1ZXIgSWhyIFNlaGVyaGF1cy4gV2VnIG1pdCBkZXIKK1Vub3JkbnVuZyB6dWhhdXMsIGJyaW5nZW4gU2llIGlocmUgQXVzcnVlc3R1bmcgdWViZXItCitzaWNodGxpY2ggdW5kIHdvaGxzb3J0aWVydCBpbiB1bnNlcmVuIGVkbGVuIE1vZWJlbC0KK3N0dWVja2VuIHVudGVyLiBXaXIgaG9mZmVuLCB1bnNlcmUgQXVzd2FobCBmaW5kZXQKK0locmVuIEdlZmFsbGVuLgorCitBTk1FUktVTkc6IERpZSBXYXJlbiwgZGllIGhpZXIgYXVmZ2VsaXN0ZXQgc2luZCwgc2luZCBOSUNIVCBSRUJPT1RGRVNUICEKKyAgICAgICAgICAgRXZ0bC4gd2VyZGVuIHdpciBkaWVzIHp1IGVpbmVtIHNwYWV0ZXJlbiBaZWl0cHVua3QgaW5zIEF1Z2UKKyAgICAgICAgICAgZmFzc2VuLCBpbSBNb21lbnQgaXN0IGVzIG5pY2h0IHNvLCB3aXIgdmVyc3VjaGVuIGxpZWJlciwgZGllCisgICAgICAgICAgIE1vZWJlbHN0dWVja2UgenUgdmVyYmVzc2VybiwgdW0gc2llIGF1Y2ggYW4gZGllIHVuZ2V3b2VobmxpY2hzdGVuCisgICAgICAgICAgIE9iamVrdGUgaW0gTW9yZ2VuR3JhdWVuIGFuenVwYXNzZW4uCisKK0FydC4tTnIuICAgTmFtZSAgICAgICAgICAgICBCZXNjaHJlaWJ1bmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWlzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIDEgICAgICAgICBLb21tb2RlICAgICAgICAgIEVpbmUgcm9idXN0ZSBLb21tb2RlIGF1cyBFaWNoZW5ob2x6LiBTaWUgICAgMy43OTkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzdCBpbiBqZWRlbiBSYXVtIHVuZCBiaWV0ZXQgamVkZSBNZW5nZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYXR6IHp1bSBWZXJzdGF1ZW4gdm9uIERpbmdlbiBhbGxlciBBcnQuCisKKyAyICAgICAgICAgS2xlaWRlcnNjaHJhbmsgICBFaW4gbWFzc2l2ZXIgSG9senNjaHJhbmssIGluIGRlbSBTaWUgICAgICAgIDUuODk5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2xlaWRlciB1bmQgUnVlc3R1bmdlbiBhbGxlciBBcnQgdW50ZXItCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJpbmdlbiBrb2VubmVuLiBEZXIgU2NocmFuayB2ZXJmdWVndAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVlYmVyIGVpbiBLb21tYW5kbyB6dXIgQXVmbGlzdHVuZyB2b24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdWVzdHVuZ3N0eXBlbi4KKworIDMgICAgICAgICBTcGluZCAgICAgICAgICAgIEVpbiBncm9zc2VyLCBlaW5mYWNoZXIgU3RhaGxzY2hyYW5rLiBEYXJpbiAgNS4yOTkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXNzZW4gc2ljaCBLbGVpZGVyIHVuZCBSdWVzdHVuZ2VuIGFsbGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJ0IHVudGVyYnJpbmdlbi4gRGVyIFNwaW5kIHZlcmZ1ZWd0IHVlYmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWluIEtvbW1hbmRvIHp1ciBBdWZsaXN0dW5nIHZvbiBSdWVzdHVuZ3MtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW4uCisKKyA0ICAgICAgICAgS3VlaGxzY2hyYW5rICAgICBFaW4gc3RyYWhsZW5kd2Vpc3NlciBLdWVobHNjaHJhbmsgYXVzIGRlbSAgIDMuNDk5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGF1c2UgQnJvc2NoLiBQYXNzdCBpbiBqZWRlIEt1ZWNoZS4gRGFyaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGVpYmVuIElocmUgU3BlaXNlbiB1bmQgR2V0cmFlbmtlIGZyaXNjaCEKKworIDUgICAgICAgICBXYWZmZW5zY2hyYW5rICAgIEVpbiBtYXNzaXZlciBIb2x6c2NocmFuayBtaXQgRmFlY2hlcm4gZnVlciAgNS44OTkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXYWZmZW4gYWxsZXIgQXJ0LiBKZWRlIFdhZmZlbmdhdHR1bmcgaGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWhyZW4gZWluZW5lbiBQbGF0eiwgZXMgZ2lidCBlaW4gS29tbWFuZG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6dXIgQXVmbGlzdHVuZyB2b24gV2FmZmVudHlwZW4uCisKKyA2ICAgICAgICAgV2FmZmVudHJ1aGUgICAgICBFaW5lIFN0YWhsdHJ1aGUgbWl0IHZlcnNjaGllZGVuZW4gRmFlY2hlcm4gIDUuMzk5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgenVyIEF1Zm5haG1lIHZvbiBXYWZmZW4gYWxsZXIgQXJ0LiBEaWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcnVoZSB2ZXJmdWVndCB1ZWJlciBlaW4gS29tbWFuZG8genVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVmbGlzdHVuZyB2b24gV2FmZmVudHlwZW4uCisKKyA3ICAgICAgICAgVHJlc29yICAgICAgICAgICBTaWNoZXJuIFNpZSBJaHIgVmVybW9lZ2VuIGdlZ2VuIEVpbmJydWNoICAgIDQuNDk5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kIERpZWJzdGFobC4gV2llPyBHYW56IGVpbmZhY2g6IE1pdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZXNlbSBzdGFiaWxlbiwgZmV1ZXJzaWNoZXJlbiBUcmVzb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5kIElocmUgV2VydHNhY2hlbiBzaWNoZXIuCisKKyA4ICAgICAgICAgWmF1YmVya2lzdGUgICAgICBTaW5kIFNpZSBaYXViZXJlcj8gT2RlciBlaW5mYWNoIG51ciBTYW1tbGVyIDcuOTk5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGllciB2b24gWmF1YmVyZXItS29tcG9uZW50ZW4/IERhbm4gaGFiZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXIgZWluIE1vZWJlbHN0dWVjayBmdWVyIFNpZSwgZGFzIFNpZSBoYWJlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11ZXNzZW4hIEF1cyBtYWdpc2NoZW0gQmlybmJhdW1ob2x6IGdlZmVydGlndC4KKworIDkgICAgICAgICBNdWVsbGNvbnRhaW5lciAgIERlciBFcnNhdHogZnVlciBkZW4gTXVlbGxzY2hsdWNrZXIuICAgICAgICAgICA5OTkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOaWUgbWVociBicmF1Y2hlbiBTaWUgZWluZW4gTGFkZW4gYXVmc3VjaGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51ciB1bSB3ZXJ0bG9zZW4gUGx1bmRlciBsb3N6dXdlcmRlbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKzEwICAgICAgICAgU2NobHVlc3NlbGJyZXR0ICBTaWUgaGFiZW4gZHVyY2ggSWhyZSBBYmVudGV1ZXIgZWluZW4gU2FjayAgICAgNDk5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sbCBTY2hsdWVzc2VsPyBEaWVzZXMgQnJldHQgc2NoYWZmdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9yZG51bmcuCisKKzExICAgICAgICAgRHVzY2hrYWJpbmUgICAgICBFbmRsaWNoIGF1Y2ggZnVlciBJaHIgWnVoYXVzZTogICAgICAgICAgICAgIDMuNDk5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWluZSB1bHRyYW1vZGVybmUgV2FzY2hnZWxlZ2VuaGVpdC4gU2llIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtvZW5uZW4gc29nYXIgc2VsYnN0IGVpbnN0ZWxsZW4sIHdvbWl0IFNpZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaWNoIHdhc2NoZW4gd29sbGVuIQorCisxMiAgICAgICAgIG1hZy4gSG9senRydWhlICAgSGFiZW4gYXVjaCBTaWUgUHJvYmxlbWUgbWl0IGVpbmVtIHVlYmVyLSAgIDc0Ljk5OQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbGxlbiBJbnZlbnRhcj8gV2lyIGhhYmVuIGpldHp0IGRpZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZXN1bmcgZnVlciBTaWU6IGRpZXNlIGtsZWluZSBIb2x6dHJ1aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaW1tdCBpaHJlIGV3aWdlbiBPYmpla3RlIGF1ZiB1bmQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmV3YWhydCBzaWUgc2ljaGVyIHVlYmVyIGRlbiBuYWVjaHN0ZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWx0dW50ZXJnYW5nIGhpbmF1cyBhdWYhCisgCisxMyAgICAgICAgIFZpdHJpbmUgICAgICAgICAgR2Vob2VyZW4gU2llIGF1Y2ggenUgZGVuIHRhcGZlcmVuIEhlbGRlbiwgIDQ5Ljk5OQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZSBzaWNoIGJlcmVpdHMgUG9rYWxlIHZlcmRpZW50IGhhYmVuPyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYW5uIHNvbGx0ZW4gU2llIHNpY2ggZGllc2UgVml0cmluZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6dWxlZ2VuLCBkYW1pdCBJaHJlIFBva2FsZSBlaW5lIHBhc3NlbmRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW1nZWJ1bmcgZXJoYWx0ZW4gdW5kIGF1Y2ggYmVpbSBXZWx0LQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVudGVyZ2FuZyBnZXNjaHVldHp0IHNpbmQuCisKKzE0ICAgICAgICAgTGVzZXB1bHQgICAgICAgICBEYXMgaGF0IG1hbiBzaWNoIHJlZGxpY2ggdmVyZGllbnQhIEVpbmUgICAgNjAuMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nob2VuZSBCZWxvaG51bmcsIHdlbm4gbWFuIHNjaGxpZXNzbGljaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbiBrbm9lY2hlcm5lbiBUZW1wZWwgbWFsIHNvIHJpY2h0aWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWZnZXJhZXVtdCBoYXQuIFVuZCB6d2FyIHZvbGxzdGFlbmRpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyBkYXNzIHNlbGJzdCBkZXIgVG90ZW5nb3R0IHN0YXVudC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmRsaWNoIGtvZW5uZW4gU2llLCB3ZW5uIGVyIGVzIGRlbm4gZGFubgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1Y2ggenVmcmllZGVuIGlzdCwgZGFzIFRhZ2VidWNoIGhpZXJhdWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYmxlZ2VuIHVuZCBpbiBhbGxlciBSdWhlIGJsYWV0dGVybi4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBbm0uIGRlciBHZXNjaGFlZnRzbGVpdHVuZzoKK1dpciBiZW11ZWhlbiB1bnMsIElocmVtIEdlc2NobWFjayB1bmQgSWhyZW4gQmVkdWVyZm5pc3NlbiBnZXJlY2h0IHp1IHdlcmRlbi4KK0ZhbGxzIFNpZSBWZXJiZXNzZXJ1bmdzdm9yc2NobGFlZ2UgaGFiZW4sIG9kZXIgZmFsbHMgU2llIE1vZWJlbHN0dWVja2UgZnVlciBJaHIKK0hhdXMgaW4gdW5zZXJlbSBBbmdlYm90IHZlcm1pc3Nlbiwgc28gc2V0emVuIFNpZSBkb2NoIGJpdHRlIGVpbmUgZW50c3ByZWNoZW5kZQorSWRlZSBpbSBMYWRlbiBhYi4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL3NjaGx1ZXNzZWxicmV0dC5jIGIvZC9zZWhlci9oYWV1c2VyL21vZWJlbC9zY2hsdWVzc2VsYnJldHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2JhY2U2Ci0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL21vZWJlbC9zY2hsdWVzc2VsYnJldHQuYwpAQCAtMCwwICsxLDY3OSBAQAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE5hbWUgZGVzIE9iamVjdHM6ICAgIFNjaGx1ZXNzZWxicmV0dAorLy8gTGV0enRlIEFlbmRlcnVuZzogICAgMDIuMDYuMjAwMQorLy8gT3JpZ2luYWw6ICAgICAgICAgICAgU3dpZnQKKy8vIE5ldWUgVmVyc2lvbjogICAgICAgIFNlbGV2ZW4KKy8vINxiZXJub21tZW46ICAgICAgICAgIDIzLjAxLjIwMDYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiBDaGFuZ2Vsb2cKKyAgICogMjEuMDYuMjAwNywgWmVzc3RyYQorICAgICBpbSBpbmhlcml0IGFicy4gUGZhZCBkdXJjaCBMQURFTih4KSBlcnNldHp0LgorICAgKiAwMS4wNy4yMDA3LCBaZXNzdHJhCisgICAgIEdldE93bmVyKCkgZGVmaW5pZXJ0LgorICAgKiAxMS4wNS4yMDE1LCBBcmF0aG9ybgorICAgICB3ZWl0cmFldW1pZyB1ZWJlcmFyYmVpdGV0IHp1ciBCZWhlYnVuZyB2b24gRmVobGZ1bmt0aW9uZW4KKyovCisjcHJhZ21hIHN0cm9uZ190eXBlcywgcnR0X2NoZWNrcworCisjaW5jbHVkZSAiL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvc2NocmFua2xhZGVuLmgiCisjaW5jbHVkZSA8YW5zaS5oPgoraW5oZXJpdCAgTEFERU4oInN3aWZ0X3N0ZF9jb250YWluZXIiKTsKKworI2RlZmluZSBWRVJTSU9OX09CSiAiMyIKKy8vIFp1ciBJbmRpemllcnVuZyBkZXMgTWFwcGluZ3MgPGhha2VuPgorI2RlZmluZSBIT09LX09CICAgIDAKKyNkZWZpbmUgSE9PS19MQUJFTCAxCisKK3ByaXZhdGUgdmFyYXJncyBzdHJpbmcgS2V5RGVzY3JpcHRpb24oaW50IGtleW51bSk7Citwcml2YXRlIGludCBJc1ZhbGlkS2V5KG9iamVjdCBvYik7Citwcml2YXRlIGludCBHZXROZXh0RnJlZVNsb3QoKTsKK3ByaXZhdGUgb2JqZWN0IEdldEtleUZvckxhYmVsKHN0cmluZyBsYWJlbCk7Citwcml2YXRlIGludCBHZXRIb29rTnVtYmVyRm9yS2V5KG9iamVjdCBvYik7Citwcml2YXRlIHZvaWQgQ29uc29saWRhdGVJbnZlbnRvcnkoKTsKKworLy8gU3RydWt0dXI6IChbIGhha2VuX25yIDogb2JqZWt0OyBiZXNjaHJpZnR1bmcgXSkKK3ByaXZhdGUgbWFwcGluZyBoYWtlbj0oWzoyXSk7Citwcml2YXRlIGludCBob29rbGlzdF9sb25nID0gMDsKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkgeworICBpZiAoIWNsb25lcChUTykpIHsKKyAgICBzZXRfbmV4dF9yZXNldCgtMSk7CisgICAgcmV0dXJuOworICB9CisgIDo6Y3JlYXRlKCk7CisgIAorICBmb3JlYWNoKGludCBpOiAxLi4xNikgeworICAgIG1fYWRkKGhha2VuLCBpKTsKKyAgfQorCisgIC8vIERFQlVHISBTb25zdCBmdW5rdGlvbmllcnQncyBhdXNzZXJoYWxiIHZvbiBTZWhlcmhhZXVzZXJuIG5pY2h0LgorICBTZXRQcm9wKCJ0ZXN0IiwxKTsKKyAgU2V0UHJvcChQX1NIT1JULCAiRWluIFNjaGx1ZXNzZWxicmV0dCIpOworICBTZXQoUF9MT05HLCBmdW5jdGlvbiBzdHJpbmcgKCkgeworICAgIHN0cmluZyB0ZXh0ID0gQlMoCisgICAgICAiRWluIGtsZWluZXMgQnJldHQgYXVzIEhvbHosIGFuIGRlbSBpbiAyIFJlaWhlbiBqZSA4IEhha2VuIGJlZmVzdGlndCAiCisgICAgICAic2luZCwgYW4gZGllIG1hbiBpbnNnZXNhbXQgMTYgU2NobHVlc3NlbCBoYWVuZ2VuIGthbm4uIFVtIGRpZSAiCisgICAgICAiVWViZXJzaWNodCBuaWNodCB6dSB2ZXJsaWVyZW4sIGJlZmluZGV0IHNpY2ggdWViZXIgamVkZW0gZGVyIEhha2VuICIKKyAgICAgICJlaW4ga2xlaW5lcyBTY2hpbGRjaGVuIGF1cyBTY2hpZWZlciwgZGFzIHNpY2ggYmVzY2hyaWZ0ZW4gbGFlc3N0LiAiCisgICAgICAiQXVmIGRpZXNlIFdlaXNlIGdlaHQgZGVyIFNpbm4gdW5kIFp3ZWNrIGRlcyBTY2hsdWVzc2VscywgZGVyIGFuICIKKyAgICAgICJkaWVzZW0gSGFrZW4gcnVodCwgbmljaHQgdmVybG9yZW4uIFByYWt0aXNjaGVyd2Vpc2UgaGFlbmd0IGFuIGVpbmVyICIKKyAgICAgICJTY2hudXIgZWluIFN0dWVjayBLcmVpZGUgdm9uIGRlbSBCcmV0dCBoZXJhYiwgbWl0IGRlbSBEdSBkaWUgIgorICAgICAgIlNjaGlsZGNoZW4gYmVzY2hyaWZ0ZW4ga2FubnN0LiIpOworICAgIHRleHQgKz0gS2V5RGVzY3JpcHRpb24oMCk7CisgICAgcmV0dXJuIHRleHQ7IAorICB9LCBGX1FVRVJZX01FVEhPRCk7CisKKyAgQWRkSWQoKHsic2NobHVlc3NlbGJyZXR0IiwiYnJldHQifSkpOworICBTZXRQcm9wKCJjbnRfdmVyc2lvbl9vYmoiLCBWRVJTSU9OX09CSik7CisgIFNldFByb3AoUF9DTlRfU1RBVFVTLCAwKTsKKyAgU2V0UHJvcChQX05BTUUsICJTY2hsdWVzc2VsYnJldHQiKTsKKyAgU2V0UHJvcChQX0dFTkRFUiwgTkVVVEVSKTsKKyAgU2V0UHJvcChQX1dFSUdIVCwgMTAwMCk7ICAgICAgICAgLy8gR2V3aWNodCAxIEtnCisgIFNldFByb3AoUF9NQVhfV0VJR0hULCAxMDAwMDAwKTsgIC8vIEVzIHBhc3NlbiBmdWVyIDEwMDAga2cgU2FjaGVuIHJlaW4uCisgIFNldFByb3AoUF9XRUlHSFRfUEVSQ0VOVCwgMTAwKTsgIC8vIERhZnVlciBtYWNodCBlciBhdWNoIG5peCBsZWljaHRlciA6KQorICBTZXRQcm9wKFBfTUFYX09CSkVDVFMsIDE2KTsKKyAgLy8gTWFuIHNvbGwgbmljaHRzIHVlYmVyIGRlbiBub3JtYWxlbiBNZWNoYW5pc211cyByZWluc3RlY2tlbiBvZGVyIAorICAvLyByYXVzbmVobWVuIGtvZW5uZW4uIFdpcmQgdm9uIHB1dF9hbmRfZ2V0LmMgZ2VwcnVlZnQuCisgIFNldFByb3AoUF9DT05UQUlORVIsIDApOworICBTZXRQcm9wKFBfTk9JTlNFUlRfTVNHLCBCUygiQW4gZGFzIFNjaGx1ZXNzZWxicmV0dCBrYW5uc3QgRHUgbnVyICIKKyAgICAiU2NobHVlc3NlbCBoYWVuZ2VuLlxuU3ludGF4OiAnaGFlbmdlIDxzY2hsdWVzc2VsPiBhbiBicmV0dCcuIikpOworICBTZXRQcm9wKFBfTk9HRVQsICJEYXMgZ2VodCBuaWNodC4gIitOYW1lKFdFUiwxKSsKKyAgICAiIGxhZXNzdCBzaWNoIG5pY2h0IGJld2VnZW4uXG4iKTsKKyAgU2V0UHJvcChQX01BVEVSSUFMLCAoe01BVF9PQUssIE1BVF9NSVNDX01BR0lDfSkgKTsKKyAgU2V0UHJvcChQX0lORk8sICJWZXJzdWNoJ3MgbWFsIG1pdDogXCJza29tbWFuZG9zIHNjaGx1ZXNzZWxicmV0dFwiLlxuIik7CisKKyAgQUQoKHsiaG9seiJ9KSwgQlMoIkVjaHRlLCByb2J1c3RlIEVpY2hlLiIpKTsKKworICBSZW1vdmVDbWQoKHsic2NobGllc3NlIiwic2NobGllc3MiLCJvZWZmbmUifSkpOworCisgIEFkZENtZCgoeyJ1bnQiLCAidW50ZXJzdWNoZSIsICJiZXRyYWNodGUiLCAiYmV0cmFjaHQiLCAiYmV0ciIsCisgICAgICAgICAgICJzY2hhdWUiLCAic2NoYXUifSksICJ1bnRfaGFrZW4iKTsKKyAgQWRkQ21kKCh7ImhhZW5nIiwgImhhZW5nZSJ9KSwgInNjaGx1ZXNzZWxfYW5faGFrZW5faGFlbmdlbiIpOworICBBZGRDbWQoKHsibmltbSJ9KSwgInNjaGx1ZXNzZWxfdm9uX2hha2VuX25laG1lbiIpOworICBBZGRDbWQoInNiZXNjaHJpZnRlIiwgImNtZF9iZXNjaHJpZnRlbiIpOworICBBZGRDbWQoInNsaXN0ZSIsICJjbWRfc2xpc3RlIik7Cit9CisKKy8qKioqKiBLT01NQU5ET0ZVTktUSU9ORU4gKioqKiovCisKKy8vIEtvbmZpZ3VyYXRpb24gZGVyIFNjaGx1ZXNzZWxsaXN0ZSwgZW50d2VkZXIgImFsbGUiIGFuemVpZ2VuIG9kZXIgbnVyIGRpZQorLy8gYmVsZWd0ZW4gSGFrZW4uCitzdGF0aWMgaW50IGNtZF9zbGlzdGUoc3RyaW5nIHN0cikgeworICBub3RpZnlfZmFpbCgiU3ludGF4OiAnc2xpc3RlIGFsbGV8YmVsZWd0ZScuXG4iKTsKKyAgaWYgKCAhc3RyaW5ncChzdHIpIHx8ICFzaXplb2Yoc3RyKSApCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKCBzdHIgPT0gImFsbGUiICkgeworICAgIGlmICggIWhvb2tsaXN0X2xvbmcgKSB7CisgICAgICB0ZWxsX29iamVjdChUUCwgQlMoIk9rLCBlcyB3ZXJkZW4gamV0enQgaW1tZXIgYWxsZSBIYWtlbiAiCisgICAgICAgICJhdWZnZWxpc3RldC4iKSk7CisgICAgICBob29rbGlzdF9sb25nID0gMTsKKyAgICB9CisgICAgZWxzZSAKKyAgICAgIHRlbGxfb2JqZWN0KFRQLCBCUygiRGllIEVpbnN0ZWxsdW5nIHdhciBzY2hvbiAnYWxsZScuIikpOworICB9CisgIGVsc2UgaWYgKCBzdHIgPT0gImJlbGVndGUiICkgeworICAgIGlmICggaG9va2xpc3RfbG9uZyApIHsKKyAgICAgIHRlbGxfb2JqZWN0KFRQLCBCUygiT2ssIGVzIHdlcmRlbiBqZXR6dCBudXIgZGllIGJlbGVndGVuIEhha2VuICIKKyAgICAgICAgImF1ZmdlbGlzdGV0LiIpKTsKKyAgICAgIGhvb2tsaXN0X2xvbmcgPTA7CisgICAgfQorICAgIGVsc2UgCisgICAgICB0ZWxsX29iamVjdChUUCwgQlMoIkRpZSBFaW5zdGVsbHVuZyB3YXIgc2Nob24gJ2JlbGVndGUnLiIpKTsKKyAgfQorICBlbHNlIAorICAgIHJldHVybiAwOworICByZXR1cm4gMTsKK30KKworLy8gSGFrZW4gdW50ZXJzdWNoZW4uIE9obmUgQW5nYWJlIGRlciBOdW1tZXIgd2VyZGVuIGFsbGUgYXVzZ2VnZWJlbiwKKy8vIGFuc29uc3RlbiBkZXIgZ2V3dWVuc2NodGUsIHNvZmVybiBlcyBkaWVzZW4gZ2lidC4KK3N0YXRpYyBpbnQgdW50X2hha2VuKHN0cmluZyBzdHIpIHsKKyAgaWYgKCAhc3RyaW5ncChzdHIpIHx8ICFzaXplb2Yoc3RyKSB8fCBzdHJzdHIoc3RyLCAiaGFrZW4iKSA9PSAtMSApCisgICAgcmV0dXJuIDA7CisgIAorICBpbnQgaGFrZW5ucjsKKyAgaWYgKCBzc2NhbmYoc3RyLCAiaGFrZW4gJWQiLCBoYWtlbm5yKSAhPSAxICkgeworICAgIHN0cmluZyBkZXQgPSBLZXlEZXNjcmlwdGlvbihoYWtlbm5yKTsKKyAgICB0ZWxsX29iamVjdChUUCwgc2l6ZW9mKGRldCkgPyBkZXQgOiAiRGllIEhha2VuIHNpbmQgYWxsZSBsZWVyLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBub3RpZnlfZmFpbCgiV2VsY2hlbiBIYWtlbiBtb2VjaHRlc3QgRHUgdW50ZXJzdWNoZW4/IEVzIGdpYnQgbnVyIGRpZSAiCisgICAgIkhha2VuIDEgYmlzIDE2LlxuIik7CisgIGlmKCBoYWtlbm5yPDEgfHwgaGFrZW5uciA+IDE2ICkKKyAgICByZXR1cm4gMDsKKworLy8gIGF1c2dhYmVfaGFrZW4oaGFrZW5ucik7CisgIHRlbGxfb2JqZWN0KFRQLCBLZXlEZXNjcmlwdGlvbihoYWtlbm5yKSk7CisgIHJldHVybiAxOworfQorCisvLyBTY2hsdWVzc2VsIGF1ZmhhZW5nZW4uCitzdGF0aWMgaW50IHNjaGx1ZXNzZWxfYW5faGFrZW5faGFlbmdlbihzdHJpbmcgc3RyKSB7CisgIG5vdGlmeV9mYWlsKCJXYXMgd2lsbHN0IER1IHdvcmFuIGhhZW5nZW4/XG4iKTsKKyAgaWYoIXN0cmluZ3Aoc3RyKSB8fCAhc2l6ZW9mKHN0cikpCisgICAgcmV0dXJuIDA7CisgIAorICBub3RpZnlfZmFpbCgiRGFzIGRhcmZzdCBEdSBuaWNodC5cbiIpOworICBpZighZXJsYXVidCgpKQorICAgIHJldHVybiAwOworCisgIHN0cmluZyB3YXMsIHdvcmFuOworICBub3RpZnlfZmFpbCgiRm9sZ2VuZGUgU3ludGF4IHZlcnN0ZWh0IERlaW4gU2NobHVlc3NlbGJyZXR0OlxuIgorICAgICIgIFwiaGFlbmdlIDxzY2hsdWVzc2VsbmFtZT4gYW4gaGFrZW4gW25yXVwiIG9kZXJcbiIKKyAgICAiICBcImhhZW5nZSA8c2NobHVlc3NlbG5hbWU+IGFuIFtzY2hsdWVzc2VsXWJyZXR0XCIuXG4iKTsKKyAgaWYgKCBzc2NhbmYoc3RyLCAiJXMgYW4gJXMiLCB3YXMsIHdvcmFuKSAhPSAyICkKKyAgICByZXR1cm4gMDsKKworICBub3RpZnlfZmFpbCgiV2FzIG1vZWNodGVzdCBEdSBhbiBkYXMgU2NobHVlc3NlbGJyZXR0IGhhZW5nZW4/XG4iKTsKKyAgaWYgKCAhc3RyaW5ncCh3YXMpICkgCisgICAgcmV0dXJuIDA7CisKKyAgbm90aWZ5X2ZhaWwoIldvcmFuIHdpbGxzdCBEdSBkYXMgZGVubiBoYWVuZ2VuP1xuIik7CisgIGlmICggc3Ryc3RyKHdvcmFuLCAiaGFrZW4iLCAwKT09LTEgJiYgIWlkKHdvcmFuKSApCisgICAgcmV0dXJuIDA7CisKKyAgLy8gVGVzdCwgb2IgZXMgT2JqZWt0ZSBkaWVzZXMgTmFtZW5zIGdpYnQuCisgIG9iamVjdCAqb2JzID0gVFAtPmZpbmRfb2JzKHdhcywgUFVUX0dFVF9OT05FKTsKKyAgLy8gQXVzIGRlciBMaXN0ZSBkZXIgZ2VmdW5kZW5lbiBPYmpla3RlIGFsbGUgcmF1c2ZpbHRlcm4sIGRpZSBrZWluZQorICAvLyBTY2hsdWVzc2VsIHNpbmQuIEFscyBTY2hsdWVzc2VsIGdlbHRlbiBoaWVyIGFsbGUgT2JqZWt0ZSwgZGllIGRpZQorICAvLyBJRCAic2NobHVlc3NlbCIgaGFiZW4gb2RlciBkaWUgbWl0dGVscyBRdWVyeURvb3JLZXkoKSBlaW5lciBiZXN0aW1tdGVuCisgIC8vIFR1ZXIgenVnZW9yZG5ldCBzaW5kLgorICBvYnMgPSBmaWx0ZXIob2JzLCAjJ0lzVmFsaWRLZXkpOworICBub3RpZnlfZmFpbCgiS2VpbmUobikgU2NobHVlc3NlbCBtaXQgZGVtIE5hbWVuIGdlZnVuZGVuLlxuIik7CisgIGlmICggIXNpemVvZihvYnMpICkKKyAgICByZXR1cm4gMDsKKworICBpbnQgbnIgPSBHZXROZXh0RnJlZVNsb3QoKTsKKyAgbm90aWZ5X2ZhaWwoIkFtIFNjaGx1ZXNzZWxicmV0dCBpc3Qga2VpbiBIYWtlbiBtZWhyIGZyZWkuXG4iKTsKKyAgaWYgKCAhbnIgKQorICAgIHJldHVybiAwOworCisgIC8vIFdlbm4gbnVyIGVpbiBTY2hsdWVzc2VsIGdlZnVuZGVuIHd1cmRlLCB3aXJkIGdlbmF1ZXIgZ2VzY2hhdXQsIG9iCisgIC8vIGRlciBTcGllbGVyIGdlc2FndCBoYXQsIHdvIGRlciBoaW5zb2xsLgorICBpZiAoIHNpemVvZihvYnMpID09IDEgKSB7CisgICAgaWYgKCB3b3JhbiAhPSAiaGFrZW4iIHx8ICFpZCh3b3JhbikgKQorICAgICAgc3NjYW5mKHdvcmFuLCAiaGFrZW4gJWQiLCBucik7CisgIH0KKworICBub3RpZnlfZmFpbCgiRXMgZ2lidCBudXIgZGllIEhha2VuIDEgYmlzIDE2LlxuIik7CisgIGlmICggbnIgPCAxIHx8IG5yID4gMTYgKQorICAgIHJldHVybiAwOworCisgIG5vdGlmeV9mYWlsKCJEZXIgSGFrZW4gaXN0IG5pY2h0IG1laHIgZnJlaS5cbiIpOworICBpZiAoIG9iamVjdHAoaGFrZW5bbnIsSE9PS19PQl0pICkKKyAgICByZXR1cm4gMDsKKworICAvLyBBbGxlIGdlZnVuZGVuZW4gU2NobHVlc3NlbG9iamVrdGUgYW5zIEJyZXR0IGhhZW5nZW4uCisgIGZvcmVhY2goIG9iamVjdCBrZXkgOiBvYnMgKSB7CisgICAgc3dpdGNoIChrZXktPm1vdmUoTUUsIE1fUFVUKSkgeworICAgICAgLy8gRGllIEthcGF6aXRhZXQgaXN0IHVlYmVyIFBfTUFYX09CSkVDVFMgYmVncmVuenQuIEFsbGUKKyAgICAgIC8vIFNjaGxlaWZlbmR1cmNobGFldWZlLCBkaWUgZGllIEthcGF6aXRhZXRzZ3JlbnplIGVycmVpY2hlbiwgbGFuZGVuCisgICAgICAvLyBpbiBkZWZhdWx0IHVuZCBiZWVuZGVuIGRhbWl0IGRpZSBTY2hsZWlmZS4gRGFoZXIgbXVlc3NlbiBzaWUgCisgICAgICAvLyBuaWNodCBnZXNvbmRlcnQgYmVoYW5kZWx0IHdlcmRlbi4KKyAgICAgIGNhc2UgTU9WRV9PSyA6CisgICAgICAgIC8vIEZhbGxzIGRhcyBCcmV0dCB2b2xsIHNlaW4gc29sbHRlLCBhYmVyIGZhZWxzY2hsaWNoZXJ3ZWlzZSAKKyAgICAgICAgLy8gZGVubm9jaCBlaW4gd2VpdGVyZXIgU2NobHVlc3NlbCBoaW5laW5iZXdlZ3Qgd3VyZGUsIGlzdCBucj09MCwKKyAgICAgICAgLy8gdW5kIGVzIHdpcmQgZWluIEZlaGxlciBhdXNnZWxvZXN0LCBkYW1pdCBuaWNodCBoaW50ZXJoZXIgZWluCisgICAgICAgIC8vIFNjaGx1ZXNzZWwgYW4gSGFrZW4gMCBoYWVuZ3QuCisgICAgICAgIGlmICggIW5yICkgeworICAgICAgICAgIHJhaXNlX2Vycm9yKCJGZWhsZXI6IEhha2VuIDAgZGFyZiBuaWNodCBiZWxlZ3Qgd2VyZGVuLiIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHRlbGxfb2JqZWN0KFRQLCBCUygiRHUgaGFlbmdzdCAiK29ic1swXS0+bmFtZShXRU4sMSkrIiBhbiBIYWtlbiAiKworICAgICAgICAgIG5yKyIuIikpOworICAgICAgICAvLyBOdXIgd2VubiBlaW4gU2NobHVlc3NlbCBlcmZvbGdyZWljaCBkcmFuZ2VoYWVuZ3Qgd3VyZGUsIHdpcmQgZXIKKyAgICAgICAgLy8gaW4gZGllIExpc3RlIGVpbmdldHJhZ2VuLiBFdHdhaWdlIEJlc2NocmlmdHVuZ2VuIGJsZWliZW4gYmVzdGVoZW4sCisgICAgICAgIGhha2VuW25yLCBIT09LX09CXSA9IGtleTsKKyAgICAgICAgLy8gdW5kIG51ciBkYW5uIHdpcmQgZGVyIG5hZWNoc3RlIFNsb3QgcHJvYmllcnQuIFdlbm4gbnVyIGVpbiAKKyAgICAgICAgLy8gU2NobHVlc3NlbCB2ZXJhcmJlaXRldCB3aXJkLCBpc3QgZGFzIGhpZXIgdW5zY2hhZWRsaWNoLCB3ZWlsIGVzIAorICAgICAgICAvLyBuaWNodCBub2NobWFsIGF1c2dld2VydGV0IHdpcmQuCisgICAgICAgIG5yID0gR2V0TmV4dEZyZWVTbG90KCk7CisgICAgICAgIC8vIFNjaGx1ZXNzZWwgd3VyZGUgdmVyYXJiZWl0ZXQgdW5kIE1lbGR1bmcgYXVzZ2VnZWJlbgorICAgICAgICBvYnMgLT0gKHtrZXl9KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE1FX0NBTlRfTEVBVkVfRU5WIDoKKyAgICAgIGNhc2UgTUVfQ0FOVF9CRV9JTlNFUlRFRCA6CisgICAgICBjYXNlIE1FX0NBTlRfQkVfRFJPUFBFRCA6CisgICAgICAgIC8vIFNjaGx1ZXNzZWwgd3VyZGUgbmljaHQgZXJmb2xncmVpY2ggZHJhbmdlaGFlbmd0LgorICAgICAgICB0ZWxsX29iamVjdChUUCwgQlMoa2V5LT5OYW1lKFdFUiwxKSsiIHdlaWdlcnQgc2ljaCwgYW5zICIKKyAgICAgICAgICAiU2NobHVlc3NlbGJyZXR0IGdlaGFlbmd0IHp1IHdlcmRlbi4iKSk7CisgICAgICAgIC8vIE1lbGR1bmcgd3VyZGUgYXVzZ2VnZWJlbiwgbmljaHRzIHdlaXRlciB6dSB0dW4uCisgICAgICAgIG9icyAtPSAoe2tleX0pOworICAgICAgICBicmVhazsKKyAgICAgIC8vIFRPT19NQU5ZX09CSkVDVFMgd2lyZCBuaWNodCBoaWVyIGJlaGFuZGVsdCwgc29uZGVybiB3ZWl0ZXIgdW50ZW4sCisgICAgICAvLyB1bSBlaW5lIEF1Zmxpc3R1bmcgZGVyIFNjaGx1ZXNzZWxuYW1lbiBhdXNnZWJlbiB6dSBrb2VubmVuLCBzdGF0dAorICAgICAgLy8gZWluZSBaZWlsZSBwcm8gU2NobHVlc3NlbC4gRGllIGFuZGVyZW4gUnVlY2tnYWJld2VydGUgdm9uIG1vdmUoKSAKKyAgICAgIC8vIHNpbmQgYmVpIGRpZXNlciBBcnQgZGVyIEJld2VndW5nIG5pY2h0IHp1IGVyd2FydGVuLgorICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgfQorICB9CisgIC8vIEZ1ZXIgYWxsZSB1ZWJyaWdlbiB3YXIgd29obCBUT09fTUFOWV9PQkpFQ1RTIGRlciBSdWVja2dhYmV3ZXJ0LCBkZW5uCisgIC8vIGRhcyBTY2hsdWVzc2VsYnJldHQgZXJsYXVidCBudXIgUF9NQVhfT0JKRUNUUyA9IDE2LgorICBpZiAoIHNpemVvZihvYnMpICkgeworICAgIHRlbGxfb2JqZWN0KFRQLCBCUygiRnVlciAiK0NvdW50VXAob2JzLT5uYW1lKFdFTikpKyIgaXN0IGxlaWRlciBrZWluICIKKyAgICAgICJIYWtlbiBtZWhyIGFtIFNjaGx1ZXNzZWxicmV0dCBmcmVpLiIpKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworLy8gU2NobHVlc3NlbCBhYm5laG1lbgorc3RhdGljIGludCBzY2hsdWVzc2VsX3Zvbl9oYWtlbl9uZWhtZW4oc3RyaW5nIHN0cikgeworICBpZiggIXN0cmluZ3Aoc3RyKSB8fCAhc2l6ZW9mKHN0cikgKSAKKyAgICByZXR1cm4gMDsKKworICBzdHJpbmcgd2FzLCB3b3JhdXM7CisgIGlmICggc3NjYW5mKHN0ciwgIiVzIGF1cyAlcyIsIHdhcywgd29yYXVzKSAhPSAyICYmIAorICAgICAgIHNzY2FuZihzdHIsICIlcyB2b24gJXMiLCB3YXMsIHdvcmF1cykgIT0gMiApCisgICAgcmV0dXJuIDA7CisKKyAgbm90aWZ5X2ZhaWwoIkRhcyBkYXJmc3QgRHUgbmljaHQhXG4iKTsKKyAgaWYoIWVybGF1YnQoKSkgCisgICAgcmV0dXJuIDA7CisgCisgIG5vdGlmeV9mYWlsKCJXb3JhdXMgd2lsbHN0IER1IGRhcyBkZW5uIG5laG1lbj9cbiIpOworICBpZiAoICFpZCh3b3JhdXMpICYmIHN0cnN0cih3b3JhdXMsICJoYWtlbiIsIDApID09IC0xICkgCisgICAgcmV0dXJuIDA7CisKKyAgbm90aWZ5X2ZhaWwoIldhcyB3aWxsc3QgRHUgZGVubiB2b20gU2NobHVlc3NlbGJyZXR0IG5laG1lbj9cbiIpOworICBpZiggIXN0cmluZ3Aod2FzKSApIAorICAgIHJldHVybiAwOworICAKKyAgbm90aWZ5X2ZhaWwoIkRhcyBTY2hsdWVzc2VsYnJldHQgaXN0IGRvY2ggYWJlciBsZWVyLlxuIik7CisgIGlmICggIXNpemVvZihhbGxfaW52ZW50b3J5KE1FKSkgKQorICAgIHJldHVybiAwOworCisgIGludCBoYWtlbm5yOworICBvYmplY3QgKmtleXMgPSAoe30pOworICAvLyBFcyBtdWVzc2VuIGF1Y2ggU2NobHVlc3NlbCB2b24gYmVzdGltbXRlbiBIYWtlbiBhYmdlbm9tbWVuCisgIC8vIHdlcmRlbiBrb2VubmVuLCBuaWNodCBudXIgamV3ZWlscyBkZXIgZXJzdGUgbWl0IGRlciBhbmdlZ2ViZW5lbiBJRC4KKyAgLy8gRGllcyBoYXQgYXVjaCBQcmlvIGdlZ2VudWViZXIgZGVyIGFsbGdlbWVpbmVuIEJlZ3JpZmZzc3VjaGUgbWl0CisgIC8vIGZpbmRfb2JzKCkuCisgIGlmICggc3NjYW5mKHdvcmF1cywgImhha2VuICVkIiwgaGFrZW5ucikgPT0gMSApIHsKKyAgICBub3RpZnlfZmFpbCgiRXMgZ2lidCBudXIgZGllIEhha2VuIDEgYmlzIDE2LlxuIik7CisgICAgaWYgKCBoYWtlbm5yIDwgMSB8fCBoYWtlbm5yID4gMTYgKSAKKyAgICAgIHJldHVybiAwOworICAgIG5vdGlmeV9mYWlsKCJBbiBkaWVzZW0gSGFrZW4gaGFlbmd0IGFiZXIgZG9jaCBrZWluIFNjaGx1ZXNzZWwuXG4iKTsKKyAgICBpZiAoICFvYmplY3RwKGhha2VuW2hha2VubnIsSE9PS19PQl0pICkKKyAgICAgIHJldHVybiAwOworICAgIAorICAgIGtleXMgKz0gKHsgaGFrZW5baGFrZW5ucixIT09LX09CXSB9KTsKKyAgfQorCisgIC8vIEtlaW5lciBnZWZ1bmRlbj8gVmllbGxlaWNodCBpc3QgamEgZWluZXIgbWl0IGVpbmVyIGJlc3RpbW10ZW4gCisgIC8vIEJlc2NocmlmdHVuZyBnZW1laW50PworICBpZiAoICFzaXplb2Yoa2V5cykgKSB7CisgICAgLy8gU2NobHVlc3NlbCBtaXQgZGVtIGFuZ2VnZWJlbmVuIE5hbWVuIHN1Y2hlbgorICAgIGtleXMgPSBUUC0+ZmluZF9vYnMod2FzKyIgaW4gYnJldHQgaW4gcmF1bSIpOworICAgIC8vIEhha2VubnVtbWVyIGVybWl0dGVsbiwgd2VubiBlaW5lIEJlc2NocmlmdHVuZyBhbmdlZ2ViZW4gd3VyZGUuCisgICAgc3RyaW5nIHdhbnRlZF9kZXNjOworICAgIHNzY2FuZih3YXMsICJzY2hsdWVzc2VsIGZ1ZXIgJXMiLCB3YW50ZWRfZGVzYyk7CisgICAgb2JqZWN0IHdhbnRlZF9rZXkgPSBHZXRLZXlGb3JMYWJlbCh3YW50ZWRfZGVzYyk7CisgICAgaWYgKCBvYmplY3RwKHdhbnRlZF9rZXkpICkKKyAgICAgIGtleXMgKz0gKHt3YW50ZWRfa2V5fSk7CisgIH0KKyAgLy8gSW1tZXIgbm9jaCBuaXggZ2VmdW5kZW4/IERhbm4gbXVzcyBzaWNoIGRlciBTcGllbGVyIHdhcyBhbmRlcmVzIAorICAvLyBlaW5mYWxsZW4gbGFzc2VuLgorICBub3RpZnlfZmFpbCgiQW0gU2NobHVlc3NlbGJyZXR0IGhhZW5ndCBrZWluIHNvbGNoZXIgU2NobHVlc3NlbC5cbiIpOworICBpZiAoICFzaXplb2Yoa2V5cykgKQorICAgIHJldHVybiAwOworCisgIC8vIEFsbGUgZ2VmdW5kZW5lbiBTY2hsdWVzc2VsIHZlcmFyYmVpdGVuLiBBbGxlLCBkaWUgbmljaHQgYmV3ZWd0IHdlcmRlbgorICAvLyBrb2VubmVuLCB2ZXJibGVpYmVuIGluIGRlciBMaXN0ZS4KKyAgZm9yZWFjaCggb2JqZWN0IGtleSA6IGtleXMgKSB7CisgICAgaW50IGN1cnJlbnRfaG9vayA9IEdldEhvb2tOdW1iZXJGb3JLZXkoa2V5KTsKKyAgICBpZiAoIGtleS0+bW92ZShUUCxNX0dFVCkgPT0gTU9WRV9PSyApIHsKKyAgICAgIGtleXMgLT0gKHsga2V5IH0pOworICAgICAgdGVsbF9vYmplY3QoVFAsIEJTKCJEdSBuaW1tc3QgIitrZXktPm5hbWUoV0VOLDEpKyIgdm9uIEhha2VuICIrCisgICAgICAgIGN1cnJlbnRfaG9vaysiIGFiLiIpKTsKKyAgICAgIC8vIFNjaGx1ZXNzZWwgYXVzdHJhZ2VuOyBiZXN0ZWhlbmRlIEJlc2NocmlmdHVuZ2VuIGJsZWliZW4gZXJoYWx0ZW4KKyAgICAgIGhha2VuW2N1cnJlbnRfaG9vaywgSE9PS19PQl0gPSAwOworICAgIH0KKyAgfQorICAvLyBWb24gYWxsZW4gbmljaHQgdm9tIEhha2VuIGdlbm9tbWVuZW4gU2NobHVlc3NlbG4gZGllIE5hbWVuIGVybWl0dGVsbgorICAvLyB1bmQgYXVmbGlzdGVuLgorICBpZiAoIHNpemVvZihrZXlzKSApIHsKKyAgICB0ZWxsX29iamVjdChUUCwgQlMoY2FwaXRhbGl6ZShDb3VudFVwKGtleXMtPm5hbWUoV0VSLDEpKSkrIiAiKworICAgICAgKHNpemVvZihrZXlzKT09MT8ia29ubnRlIjoia29ubnRlbiIpKyIgbmljaHQgdm9tIFNjaGx1ZXNzZWxicmV0dCAiCisgICAgICAiYWJnZW5vbW1lbiB3ZXJkZW4uIikpOworICB9CisgIHJldHVybiAxOworfQorCisvLyBWZXJmdWVnYmFyZSBLb21tYW5kb3MgYXVmbGlzdGVuLgordmFyYXJncyBpbnQgc2tvbW1hbmRvcyhzdHJpbmcgc3RyKSB7CisgIG5vdGlmeV9mYWlsKCAiRmVobGVyOiBEaWVzZXIgQmVmZWhsIGJlbm9ldGlndCBlaW5lIGd1ZWx0aWdlIE9iamVrdC1JZCBhbHMgIgorICAgICsiUGFyYW1ldGVyLlxuQmVpc3BpZWw6IHNrb21tYW5kb3MgW3NjaGx1ZXNzZWxdYnJldHRcbiIpOworICAKKyAgaWYoICFpZChzdHIpICkgcmV0dXJuIDA7CisKKyAgd3JpdGUoCisgICAgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCisgICAgIj09PT09PT09PT1cbiIKKyAgICAiQWt0dWVsbGUgVmVyc2lvbjogIitRdWVyeVByb3AoImNudF92ZXJzaW9uX3N0ZCIpKworICAgICAgUXVlcnlQcm9wKCJjbnRfdmVyc2lvbl9vYmoiKSsiXG4iKworICAgIEJTKE5hbWUoV0VSLDEpKyIga2FubiBudXIgaW4gZGllc2VtIFNlaGVyaGF1cyB2ZXJ3ZW5kZXQgd2VyZGVuLCAiCisgICAgImRhICIrUXVlcnlQcm9ub3VuKFdFUikrIiBzcGV6aWVsbCBkYWZ1ZXIgZ2VrYXVmdCB3dXJkZS4gIisKKyAgICBDQVAoUXVlcnlQcm9ub3VuKFdFUikpKyIgdmVyZnVlZ3QgdWViZXIgZm9sZ2VuZGUgS29tbWFuZG9zOiIpKworICAgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorICAgICItLS0tLS0tXG4iCisgICAgInNlcmxhdWJlIFtzY2hsdWVzc2VsXWJyZXR0IFtzcGllbGVybmFtZXxcImhhdXNmcmV1bmRlXCJ8XCJ6d2VpdGllc1wiXVxuIgorICAgICIgIEVybGF1YnQgUGVyc29uZW4sICIrbmFtZShXRU4sMSkrIiBtaXR6dWJlbnV0emVuLlxuIgorICAgICIgIHNlcmxhdWJlIG9obmUgQW5nYWJlIGVpbmVzIEFyZ3VtZW50cyBsaXN0ZXQgYWxsZSBQZXJzb25lbiBtaXQgWnVncmlmZiAiCisgICAgICAiYXVmXG4gICIrbmFtZShXRU4sMSkrIiBhdWYuXG5cbiIKKyAgICAidmVyc2NoaWViZSBbc2NobHVlc3NlbF1icmV0dCBuYWNoIFthdXNnYW5nXVxuIgorICAgICIgIERhbWl0IGthbm5zdCBEdSAiK25hbWUoV0VOLDEpKyIgaW5uZXJoYWxiIERlaW5lcyBTZWhlcmhhdXNlcyAiCisgICAgInZlcnNjaGllYmVuLlxuXG4iCisgICAgInN2ZXJzdGVja2UgW3NjaGx1ZXNzZWxdYnJldHRcbiIKKyAgICAiICBEYW1pdCBtYWNoc3QgRHUgIituYW1lKFdFTiwxKSsiIHVuc2ljaHRiYXIuXG4iCisgICAgInNob2xlIFtzY2hsdWVzc2VsXWJyZXR0IGhlcnZvclxuIgorICAgICIgIERhbWl0IG1hY2hzdCBEdSAiK25hbWUoV0VOLDEpKyIgd2llZGVyIHNpY2h0YmFyLlxuIgorICAgICJ6ZXJ0cnVlbW1lciBbc2NobHVlc3NlbF1icmV0dFxuIgorICAgICIgIERhbWl0IHplcnN0b2Vyc3QgRHUgZGFzIFNjaGx1ZXNzZWxicmV0dC5cbiIKKyAgICAic2Jlc2NocmlmdGUgaGFrZW4gPG5yPiBtaXQgPHRleHQ+fG5pY2h0c1xuIgorICAgICIgIEVpbmUgQmVzY2hyaWZ0dW5nIGFuIGVpbmVtIEhha2VuIGFuYnJpbmdlbiBvZGVyIGxvZXNjaGVuLlxuIgorICAgICJzbGlzdGUgbGFuZ3xrdXJ6XG4iCisgICAgIiAgU2NobHVlc3NlbGFuemVpZ2Uga29uZmlndXJpZXJlbjogYWxsZSBvZGVyIG51ciBiZWxlZ3RlIGF1Zmxpc3Rlbi5cbiIKKyAgICAiaGFlbmdlIDxzY2hsdWVzc2VsbmFtZT4gYW4gaGFrZW4gW25yXVxuIgorICAgICJoYWVuZ2UgPHNjaGx1ZXNzZWxuYW1lPiBhbiBbc2NobHVlc3NlbF1icmV0dFxuIgorICAgICIgIERhbWl0IGhhZW5nc3QgRHUgZWluZW4gU2NobHVlc3NlbCBhbiBkYXMgQnJldHQuXG4iCisgICAgIm5pbW0gc2NobHVlc3NlbCB2b24gaGFrZW4gPG5yPlxuIgorICAgICJuaW1tIDxzY2hsdWVzc2VsbmFtZT4gdm9uIFtzY2hsdWVzc2VsXWJyZXR0XG4iCisgICAgIm5pbW0gc2NobHVlc3NlbCBmdWVyIDxiZXNjaHJpZnR1bmc+IHZvbiBbc2NobHVlc3NlbF1icmV0dC5cbiIKKyAgICAiICBEYW1pdCBuaW1tc3QgRHUgZWluZW4gU2NobHVlc3NlbCB2b20gU2NobHVlc3NlbGJyZXR0LlxuIgorICAgICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgorICAgICI9PT09PT09PT09XG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZXJsYXVibmlzX2xpc3RlKCkKK3sKKyAgaWYoIFF1ZXJ5SGF1c2Jlc2l0emVyKCkgIT0gUXVlcnlUUCgpICYmICFRdWVyeVByb3AoInRlc3QiKSApCisgIHsKKyAgICB0ZWxsX29iamVjdChUUCwgQlMoIk51ciAiK1F1ZXJ5SGF1c2Jlc2l0emVyKCkrIiBkYXJmIEJlcmVjaHRpZ3VuZ2VuICIKKyAgICAgICtuYW1lKFdFU1NFTiwxKSsiIGFiZnJhZ2VuISIpKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICAKKyAgc3RyaW5nICpzdHJzOworICBzdHJpbmcgc3RyID0gCisgICAgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCisgICAgIj09PT09PT09PT1cbiI7CisgIGlmICggaGF1c2VybGF1Ym5pcyApIHsKKyAgICBzdHJzID0gU0hWRVJXQUxURVItPkhhdXNQcm9wKExPV0VSKFF1ZXJ5SGF1c2Jlc2l0emVyKCkpLCAyKTsKKyAgICBzdHIgKz0gIkZvbGdlbmRlIEZyZXVuZGUgRGVpbmVzIEhhdXNlcyBkdWVyZmVuICIrbmFtZShXRU4sMSkrCisgICAgICAiIG1pdGJlbnV0emVuOlxuIjsKKyAgICBpZihzaXplb2Yoc3RycykpIHsKKyAgICAgIHN0ciArPSBCUyhDb3VudFVwKHN0cnMpKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBzdHIgKz0gQlMoIkR1IGhhc3Qga2VpbmVyIFBlcnNvbiBadWdyaWZmIGF1ZiBEZWluIEhhdXMgZ2V3YWVocnQuLi4iKTsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgc3RyKz0gQlMoIkRpZSBGcmV1bmRlIERlaW5lcyBIYXVzZXMgZHVlcmZlbiAiK25hbWUoV0VOLDEpKworICAgICAgIiBuaWNodCBtaXRiZW51dHplbi4iKTsKKyAgfQorCisgIHN0ciArPSAKKyAgICAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKyAgICAiLS0tLS0tLS0tLVxuIjsKKworICBpZiggendlaXRpZWVybGF1Ym5pcyE9IiIgKSB7CisgICAgaWYoIHp3ZWl0aWVlcmxhdWJuaXM9PWdldGV1aWQoVFApICkKKyAgICAgIHN0ciArPSBCUygiQWxsZSBEZWluZSBad2VpdGllcyBkdWVyZmVuICIrbmFtZShXRU4sMSkrIiBtaXRiZW51dHplbi4iKTsKKyAgICBlbHNlCisgICAgICBzdHIgKz0gQlMoIkFsbGUgWndlaXRpZXMgdm9uICIrQ0FQKHp3ZWl0aWVlcmxhdWJuaXMpKyIgZHVlcmZlbiAiCisgICAgICAgICtuYW1lKFdFTiwxKSsiIG1pdGJlbnV0emVuLiIpOworICAgIHN0ciArPQorICAgICAgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisgICAgICAiLS0tLS0tLS0tLVxuIjsKKyAgfQorICAKKyAgc3Rycz1RdWVyeVByb3AoImNudF9lcmxhdWJuaXMiKTsKKworICBpZihzaXplb2Yoc3RycykpIHsKKyAgICBzdHIgKz0gQlMoIkZvbGdlbmRlIHNvbnN0aWdlIFBlcnNvbmVuIGR1ZXJmZW4gIituYW1lKFdFTiwxKSsKKyAgICAgICIgbWl0YmVudXR6ZW46Iik7CisgICAgc3RyICs9IENvdW50VXAoc3Rycyk7CisgIH0KKyAgZWxzZSB7CisgICAgc3RyICs9IEJTKCJFcyBnaWJ0IGtlaW5lIHNvbnN0aWdlbiBQZXJzb25lbiwgZGllICIrbmFtZShXRU4sMSkrCisgICAgICAiIG1pdGJlbnV0emVuIGR1ZXJmZW4uIik7CisgIH0KKyAgc3RyICs9CisgICAgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCisgICAgIj09PT09PT09PT1cbiI7CisgIAorICByZXR1cm4gMTsKK30KKworLy8gSGFrZW4gYmVzY2hyaWZ0ZW4uCitzdGF0aWMgaW50IGNtZF9iZXNjaHJpZnRlbihzdHJpbmcgc3RyKSB7CisgIHN0cmluZyBuZm0gPSAiU3ludGF4OiBzYmVzY2hyaWZ0ZSBoYWtlbiA8aGFrZW5udW1tZXI+IG1pdCAiCisgICAgIjx0ZXh0PnxuaWNodHNcbiIKKyAgICAiRnVlciA8dGV4dD4ga2FubnN0IER1IGVpbmVuIGJlbGllYmlnZW4gVGV4dCBtaXQgYmlzIHp1IDMwIFplaWNoZW4gIgorICAgICJhbmdlYmVuLFxuIgorICAgICInbmljaHRzJyBsb2VzY2h0IGRpZSBCZXNjaHJpZnR1bmcgZWluZXMgU2NoaWxkZXMuXG4iOworCisgIG5vdGlmeV9mYWlsKCJEYXMgZGFyZnN0IER1IG5pY2h0IVxuIik7CisgIGlmKCFlcmxhdWJ0KCkpIAorICAgIHJldHVybiAwOworICAKKyAgc3RyaW5nIHRleHQ7CisgIGludCBobnI7CisgIHN0ciA9IFRQLT5fdW5wYXJzZWRfYXJncygwKTsKKyAgbm90aWZ5X2ZhaWwobmZtKTsKKyAgaWYgKCAhc3RyaW5ncChzdHIpIHx8ICFzaXplb2Yoc3RyKSApIAorICAgIHJldHVybiAwOworICBpZiAoIHNzY2FuZihzdHIsImhha2VuICVkIG1pdCAlcyIsIGhuciwgdGV4dCkhPTIgKQorICAgIHJldHVybiAwOworCisgIG5vdGlmeV9mYWlsKCJXZWxjaGVuIEhha2VuIG1vZWNodGVzdCBEdSBiZXNjaHJpZnRlbj9cbiIrbmZtKTsKKyAgaWYoIWhucikgCisgICAgcmV0dXJuIDA7CisgIAorICBub3RpZnlfZmFpbCgiRXMgZ2lidCBudXIgZGllIEhha2VuIDEgYmlzIDE2LlxuIik7CisgIGlmICggaG5yIDwgMSB8fCBobnIgPiAxNiApIAorICAgIHJldHVybiAwOworCisgIG5vdGlmeV9mYWlsKCJXb21pdCBtb2VjaHRlc3QgRHUgZGVuIEhha2VuIGJlc2NocmlmdGVuP1xuIituZm0pOworICBpZiggIXN0cmluZ3AodGV4dCkgfHwgIXNpemVvZih0ZXh0KSApCisgICAgcmV0dXJuIDA7CisKKyAgbm90aWZ5X2ZhaWwoIkRlciBUZXh0IHNvbGx0ZSBuaWNodCBsYWVuZ2VyIGFscyAzMCBaZWljaGVuIHNlaW4uXG4iKTsKKyAgaWYoc2l6ZW9mKHRleHQpID4gMzApIAorICAgIHJldHVybiAwOworCisgIGlmICggbG93ZXJfY2FzZSh0ZXh0KSA9PSAibmljaHRzIiApIHsKKyAgICBpZiAoIHN0cmluZ3AoaGFrZW5baG5yLEhPT0tfTEFCRUxdKSApIHsKKyAgICAgIHRlbGxfb2JqZWN0KFRQLCBCUygiU29yZ2ZhZWx0aWcgd2lzY2hzdCBEdSBkaWUgQmVzY2hyaWZ0dW5nIGRlcyAiCisgICAgICAgICJIYWtlbnMgIitobnIrIiB3ZWcuIikpOworICAgICAgaGFrZW5baG5yLEhPT0tfTEFCRUxdPTA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgdGVsbF9vYmplY3QoVFAsIEJTKCJEdSBtdXNzdCBEaWNoIGdlaXJydCBoYWJlbi4gSGFrZW4gIitobnIrIiBpc3QgIgorICAgICAgICAiZ2FyIG5pY2h0IGJlc2NocmlmdGV0LiIpKTsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoIGxvd2VyX2Nhc2UodGV4dCkgPT0gInNjaGx1ZXNzZWwiICkgeworICAgIHRlbGxfb2JqZWN0KFRQLCBCUygKKyAgICAgICJEdSBzb2xsdGVzdCBEaXIgZXR3YXMgQXVzc2FnZWtyYWVmdGlnZXJlcyBlaW5mYWxsZW4gbGFzc2VuLiIpKTsKKyAgfQorICBlbHNlIHsKKyAgICB0ZWxsX29iamVjdChUUCwgQlMoIkR1IGJlc2NocmlmdGVzdCBkYXMgU2NoaWxkY2hlbiB1ZWJlciBIYWtlbiAiK2hucisKKyAgICAgICIgbWl0ICIrdGV4dCsiLiIpKTsKKyAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSwgQlMoCisgICAgICBUUC0+TmFtZShXRVIpKyIgc2NocmVpYnQgZXR3YXMgYW5zIFNjaGx1ZXNzZWxicmV0dC4iKSwgKHtUUH0pKTsKKyAgICBoYWtlbltobnIsSE9PS19MQUJFTF0gPSB0ZXh0OworICB9CisgIHJldHVybiAxOworfQorCisvKioqKiogSElMRlNGVU5LVElPTkVOICoqKioqLworCisvLyBCZXNjaHJlaWJ1bmcgZWluZXMgSGFrZW5zIGVyemV1Z2VuLiBXZW5uIDxrZXludW0+IGFuZ2VnZWJlbiB3aXJkLCAKKy8vIHdpcmQgbnVyIGRlciBnZXN1Y2h0ZSBIYWtlbiBhbmdlemVpZ3QsIGVnYWwgb2IgbGVlciBvZGVyIG5pY2h0LiAKKy8vIEFuc29uc3RlbiB3ZXJkZW4gZGllIGJlbGVndGVuIEhha2VuIGFuZ2V6ZWlndCwgYXVzc2VyIHdlbm4gCisvLyA8aG9va2xpc3RfbG9uZz4gZ2VzZXR6dCBpc3QuIERhbm4gd2VyZGVuIGFsbGUgSGFrZW4gYXVmZ2VsaXN0ZXQuCitwcml2YXRlIHZhcmFyZ3Mgc3RyaW5nIEtleURlc2NyaXB0aW9uKGludCBrZXludW0pIHsKKyAgc3RyaW5nIGRlc2M9IiI7CisgIG1hcHBpbmcga2V5bGlzdD0oWzoyXSk7CisKKyAgLy8gTGlzdGUgZGVySGFrZW4gYXVmIGRlbi9kaWUgZ2VzdWNodGVuIGVpbnNjaHJhZW5rZW4uCisgIC8vIE51ciBlaW4gSGFrZW4gc29sbCBhbmdlc2NoYXV0IHdlcmRlbi4gRGllcyBoYXQgaW1tZXIgUHJpb3JpdGFldCwKKyAgLy8gZC5oLiBhdWNoIGJlaSA8c2xpc3RlIGFsbGU+IHdpcmQgbnVyIGVpbiBIYWtlbiBnZWxpc3RldC4KKyAgaWYgKCBrZXludW0gKSB7CisgICAgbV9hZGQoa2V5bGlzdCwga2V5bnVtLCBtX2VudHJ5KGhha2VuLCBrZXludW0pLi4uKTsKKyAgfQorICAvLyBXZW5uIDxzbGlzdGUgYWxsZT4gZ2VzZXR6dCBpc3QsIGFsbGUgYXVzZ2ViZW4uCisgIGVsc2UgaWYgKCBob29rbGlzdF9sb25nICkgeworICAgIGtleWxpc3QgPSBoYWtlbjsKKyAgfQorICAvLyBBbnNvbnN0ZXIgbnVyIGRpZSBiZWxlZ3Rlbi4KKyAgZWxzZSB7CisgICAga2V5bGlzdCA9IGZpbHRlcihoYWtlbiwgCisgICAgICBmdW5jdGlvbiBpbnQgKGludCBudW0sIDxzdHJpbmd8b2JqZWN0PiogdmFsdWVzKSB7CisgICAgICAgIHJldHVybiBvYmplY3RwKHZhbHVlc1swXSk7CisgICAgICB9KTsKKyAgfQorCisgIC8vIFVlYmVyIGRhcyBNYXBwaW5nIG1pdCBkZW4gc2VsZWt0aWVydGVuIEhha2VuIGxhdWZlbiB1bmQgQXVzZ2FiZW4KKyAgLy8gZXJ6ZXVnZW4uCisgIGZvcmVhY2goaW50IG51bSA6IDEuLjE2KSB7CisgICAgLy8gSGllciB3aXJkIGRlciBha3R1ZWxsZSBXZXJ0IHVlYmVyc3BydW5nZW4sIHdlbm4gZXIgbmljaHQgZW50aGFsdGVuIAorICAgIC8vIGlzdCwgZGEgZGllIFp1d2Vpc3VuZyBpbiA8a2V5PiB1bmQgPGtleWRlc2M+IGF1Y2ggZGFubiBlaW5lIDAgZXJnZWJlbgorICAgIC8vIHd1ZXJkZSwgdW5kIHNvbWl0IEtleXMgbWl0IGxlZXJlbiBWYWx1ZXMgbmljaHQgdm9uIG5pY2h0IGV4aXN0aWVyZW5kZW4KKyAgICAvLyBLZXlzIHp1IHVudGVyc2NoZWlkZW4gd2FlcmVuLgorICAgIGlmICggbWVtYmVyKG1faW5kaWNlcyhrZXlsaXN0KSwgbnVtKSA9PSAtMSApCisgICAgICBjb250aW51ZTsKKyAgICBzdHJpbmcga2V5ZGVzYyA9IGtleWxpc3RbbnVtLCBIT09LX0xBQkVMXTsKKyAgICBvYmplY3Qga2V5ID0ga2V5bGlzdFtudW0sIEhPT0tfT0JdOworICAgIGRlc2MgKz0gIkhha2VuICIgKyBudW0gKyAoc3RyaW5ncChrZXlkZXNjKT8iIFsiK2tleWRlc2MrIl06ICIgOiAiOiAiKTsKKyAgICBkZXNjICs9IChvYmplY3RwKGtleSkgPyBrZXktPnNob3J0KCkgOiAibGVlclxuIik7CisgIH0KKyAgcmV0dXJuIGRlc2M7Cit9CisKKy8vIFJ1ZWNrZ2FiZXdlcnQ6IDEsIHdlbm4gZXMgc2ljaCB1bSBlaW4gU2NobHVlc3NlbG9iamVrdCBoYW5kZWx0LCBzb25zdCAwLgorLy8gU2NobHVlc3NlbCB3ZXJkZW4gYW5oYW5kIGRlciBJRCAic2NobHVlc3NlbCIgZXJrYW5udCBvZGVyIGRhcmFuLCBkYXNzCisvLyBRdWVyeURvb3JLZXkoKSBlaW5lbiBXZXJ0IHp1cnVlY2tnaWJ0LCBkLmguIGRhc3MgZGllc2VzIE9iamVrdCBlaW5lCisvLyBTdGFuZGFyZC1Eb29ybWFzdGVyLVR1ZXIgb2VmZm5ldC4KK3ByaXZhdGUgaW50IElzVmFsaWRLZXkob2JqZWN0IG9iKSB7CisgIHJldHVybiAob2JqZWN0cChvYikgJiYgKG9iLT5pZCgic2NobHVlc3NlbCIpIHx8IG9iLT5RdWVyeURvb3JLZXkoKSE9MCkpOworfQorCisvLyBHaWJ0IGRpZSBOdW1tZXIgZGVzIG5hZWNoc3RlbiBmcmVpZW4gSGFrZW5zIHp1cnVlY2sgb2RlciAwLCB3ZW5uCisvLyBrZWluZXIgZnJlaSBpc3QuIERhIE1hcHBpbmdzIG5pY2h0IHNvcnRpZXJ0IHNpbmQsIG11c3Mgdm9uIDEtMTYgbnVtZXJpc2NoCisvLyBpdGVyaWVydCB3ZXJkZW4sIGRhbWl0IGltbWVyIGRlciBlcnN0ZSBmcmVpZSBIYWtlbiBnZWZ1bmRlbiB3aXJkIHVuZCBuaWNodCAKKy8vIGlyZ2VuZGVpbmVyLgorLy8gUnVlY2tnYWJld2VydDogSGFrZW5udW1tZXIgdm9uIDEtMTYgb2RlciAwLCB3ZW5uIGtlaW4gSGFrZW4gZnJlaSBpc3QuCitwcml2YXRlIGludCBHZXROZXh0RnJlZVNsb3QoKSB7CisgIGludCBzbG90OworICBmb3JlYWNoKGludCBpIDogMS4uMTYpIHsKKyAgICBpZiAoICFvYmplY3RwKGhha2VuW2ksSE9PS19PQl0pICkgeworICAgICAgc2xvdCA9IGk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHNsb3Q7Cit9CisKKy8vIEdpYnQgenUgZWluZXIgU2NoaWxkLUJlc2NocmlmdHVuZyBkaWUgenVnZWhvZXJpZ2UgSGFrZW5wb3NpdGlvbiBhdXMuCisvLyBFcyB3aXJkIGRpZSBrbGVpbmdlc2NocmllYmVuZSBWYXJpYW50ZSBnZXN1Y2h0LCBzbyBkYXNzIFNwaWVsZXIgendhcgorLy8gR3Jvc3NzY2hyZWlidW5nIGluIGRlbiBCZXNjaHJpZnR1bmdlbiB2ZXJ3ZW5kZW4ga29lbm5lbiwgZGllc2UgYWJlcgorLy8gbmljaHQgYmVydWVja3NpY2h0aWd0IHdpcmQuIEFuc29uc3RlbiBrb2VubnRlIGVzIHp1IFNjaHdpZXJpZ2tlaXRlbiBtaXQKKy8vIERvcHBsdW5nZW4gd2llICJWZXNyYXkiIHVuZCAidmVzcmF5IiBrb21tZW4uCisvLyBSdWVja2dhYmV3ZXJ0OiBIYWtlbm51bW1lciB2b24gMS0xNiBvZGVyIDAsIHdlbm4gZGVyIFRleHQgbmljaHQgZ2VmdW5kZW4KKy8vIHd1cmRlLgorcHJpdmF0ZSBvYmplY3QgR2V0S2V5Rm9yTGFiZWwoc3RyaW5nIGxhYmVsKSB7CisgIGlmICggbGFiZWwgKSAKKyAgICBsYWJlbCA9IGxvd2VyX2Nhc2UobGFiZWwpOworICBmb3JlYWNoKGludCBpOiAxLi4xNikgeworICAgIGlmICggaGFrZW5baSwgSE9PS19MQUJFTF0gJiYgbGFiZWwgJiYKKyAgICAgICAgIGxvd2VyX2Nhc2UoaGFrZW5baSxIT09LX0xBQkVMXSkgPT0gbGFiZWwgKQorICAgICAgcmV0dXJuIGhha2VuW2ksSE9PS19PQl07CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vIEdpYnQgenUgZGVtIHVlYmVyZ2ViZW5lbiBPYmpla3QgZGllIE51bW1lciBkZXMgSGFrZW5zIHp1cnVlY2ssIGFuIGRlbQorLy8gZXMgaGFlbmd0LgorcHJpdmF0ZSBpbnQgR2V0SG9va051bWJlckZvcktleShvYmplY3Qgb2IpIHsKKyAgZm9yZWFjaChpbnQgbnVtLCBvYmplY3Qga2V5IDogaGFrZW4pIHsKKyAgICBpZiAoIGtleSA9PSBvYiApCisgICAgICByZXR1cm4gbnVtOworICB9CisgIHJldHVybiAwOworfQorCisvLyBCZXJlaW5pZ3QgRGF0ZW5zdHJ1a3R1ciBpbiA8aGFrZW4+IHVuZCBkYXMgSW52ZW50YXIgZGVzIEJyZXR0ZXMsIGluZGVtCisvLyBhKSBnZXBydWVmdCB3aXJkLCBvYiBhbGxlIGluIDxoYWtlbj4gZWluZ2V0cmFnZW5lbiBPYmpla3RlIHNpY2ggYXVjaCBpbSAKKy8vICAgIEJyZXR0IGJlZmluZGVuIHVuZAorLy8gYikgZ2VwcnVlZnQgd2lyZCwgb2IgYWxsZSBpbSBJbnZlbnRhciBiZWZpbmRsaWNoZW4gT2JqZWt0ZSBhdWNoIGtvcnJla3QgaW4gCisvLyAgICA8aGFrZW4+IGVpbmdldHJhZ2VuIHNpbmQuCisvLyBVZWJlcnphZWhsaWdlIE9iamVrdGUgd2VyZGVuIHJhdXNnZXdvcmZlbi4KK3ByaXZhdGUgdm9pZCBDb25zb2xpZGF0ZUludmVudG9yeSgpIHsKKyAgZm9yZWFjaChpbnQgaSwgb2JqZWN0IG9iIDogaGFrZW4pIHsKKyAgICAvLyBPYmpla3QgZXhpc3RpZXJ0LCBpc3QgYWJlciBuaWNodCBpbSBTY2hsdWVzc2VsYnJldHQ/IERhbm4gYXVzdHJhZ2VuLgorICAgIGlmIChvYmplY3RwKG9iKSAmJiBlbnZpcm9ubWVudChvYikgIT0gTUUpIHsKKyAgICAgIG1fZGVsZXRlKGhha2VuLCBpKTsKKyAgICAgIC8vIFdpcmQgYXVjaCB2b20gcmVzZXQoKSBhdXMgZ2VydWZlbiwgZGFubiBpc3QgVFAgPT0gMC4KKyAgICAgIGlmICggb2JqZWN0cChUUCkgKQorICAgICAgICB0ZWxsX29iamVjdChUUCwgQlMoIkhvcHBsYSEgIitvYi0+TmFtZShXRVIsMSkrIiBzY2hlaW50IHZvbSAiCisgICAgICAgICAgIlNjaGx1ZXNzZWxicmV0dCB2ZXJzY2h3dW5kZW4genUgc2VpbiEiKSk7CisgICAgfQorICB9CisgIG9iamVjdCAqcmVzdGVyYW1wZSA9IGFsbF9pbnZlbnRvcnkoTUUpIC0gbV92YWx1ZXMoaGFrZW4sIEhPT0tfT0IpOworICBpZiAoc2l6ZW9mKHJlc3RlcmFtcGUpKSB7CisgICAgcmVzdGVyYW1wZS0+bW92ZShlbnZpcm9ubWVudCgpLE1fUFVUKTsKKyAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSwgQlMoIlBsb2V0emxpY2ggZmFlbGx0IGV0d2FzIHZvbSAiCisgICAgICAiU2NobHVlc3NlbGJyZXR0IHp1IEJvZGVuLCBkYXMgRHUgenV2b3IgZ2FyIG5pY2h0IGdlc2VoZW4gaGF0dGVzdC4iKSk7CisgIH0KK30KKworc3RyaW5nIHNob3J0KCkgeworICBzdHJpbmcgc2g9UXVlcnlQcm9wKFBfU0hPUlQpOworCisgIC8vIFVuc2ljaHRiYXI/IERhbm4gZ2lidHMgbmljaHRzIHp1IHNlaGVuIC4uLgorICBpZiAoIFF1ZXJ5UHJvcChQX0lOVklTKSB8fCAhc2ggKQorICAgIHJldHVybiAwOworICBpZiAoIFF1ZXJ5UHJvcCgidmVyc3RlY2t0IikgPT0gMSApIAorICAgIHNoID0gIiI7CisgIGVsc2UgCisgICAgc2ggKz0gIi4iOworCisgIHJldHVybiBwcm9jZXNzX3N0cmluZyhzaCkrIlxuIjsKK30KKworLy8gSW0gUmVzZXQgdm9yc2ljaHRzaGFsYmVyIGF1Y2ggbWFsIGF1ZnJhZXVtZW4uCit2b2lkIHJlc2V0KCkgeworICBDb25zb2xpZGF0ZUludmVudG9yeSgpOworICByZXR1cm4gOjpyZXNldCgpOworfQorCit2YXJhcmdzIGludCBQcmV2ZW50SW5zZXJ0KG9iamVjdCBvYikgeworICAvLyBLZWluIFNjaGx1ZXNzZWw/IEhhdCBpbiBkaWVzZW0gQ29udGFpbmVyIG5peCB2ZXJsb3JlbiEKKyAgaWYoICFJc1ZhbGlkS2V5KG9iICkpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorICBDb25zb2xpZGF0ZUludmVudG9yeSgpOworICByZXR1cm4gOjpQcmV2ZW50SW5zZXJ0KG9iKTsKK30KKworLy8gV2VubiBlaW4gU2NobHVlc3NlbCBzaWNoIGF1ZmxvZXN0LCBtdXNzIGRpZSBMaXN0ZSBhYmdlZ2xpY2hlbiB3ZXJkZW4uCit2b2lkIE5vdGlmeVJlbW92ZShvYmplY3Qgb2IpIHsKKyAgdGVsbF9yb29tKGVudmlyb25tZW50KE1FKSwgQlMoIkhvcHBsYSEgIitvYi0+TmFtZShXRVIsMSkrIiBoYXQgc2ljaCAiCisgICAgImdlcmFkZSBpbiBXb2hsZ2VmYWxsZW4gYXVmZ2Vsb2VzdC4iKSk7CisgIC8vIERhcyBPYmpla3QgPG9iPiB6ZXJzdG9lcnQgc2ljaCBlcnN0IG5hY2ggZGVtIEF1ZnJ1ZiBkaWVzZXIgRnVua3Rpb24sCisgIC8vIGRhaGVyIHBlciBjYWxsX291dCgpIGF1ZnJhZXVtZW4uCisgIGNhbGxfb3V0KCMnQ29uc29saWRhdGVJbnZlbnRvcnksIDEpOworfQorCisvLyBaZXNzdHJhLCAxLjcuMDcsIGZ1ZXJzIEhvZXJyb2hyCisvLyBEYXJmIGljaCBkYSBBcmF0aG9ybiBlaW50cmFnZW4/IDstKQorc3RyaW5nIEdldE93bmVyKCkgeworICByZXR1cm4gInNlbGV2ZW4iOworfQorCmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL3NjaHJhZW5rZXJfZ3V0c2NoZWluLmMgYi9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL3NjaHJhZW5rZXJfZ3V0c2NoZWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM4OTIwNAotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvc2NocmFlbmtlcl9ndXRzY2hlaW4uYwpAQCAtMCwwICsxLDQ0IEBACisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBOYW1lIGRlcyBPYmplY3RzOiAgICBTY2hyYWVuZ2VyLUd1dHNjaGVpbgorLy8gTGV0enRlIEFlbmRlcnVuZzogICAgMDUuMDUuMjAwMQorLy8gTWFnaWVyOiAgICAgICAgICAgICAgU3dpZnQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2luY2x1ZGUgInNjaHJhbmtsYWRlbi5oIgorI2luY2x1ZGUgPGFuc2kuaD4KK2luaGVyaXQgInN0ZC90aGluZyI7CisKK2NyZWF0ZSgpCit7CisgIGlmICghY2xvbmVwKFRPKSkgcmV0dXJuOworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfU0hPUlQsICJFaW4gR3V0c2NoZWluIik7CisgIFNldFByb3AoUF9MT05HLCAiQEBsb25ndGV4dEBAIik7CisgIEFkZElkKCh7Imd1dHNjaGVpbiJ9KSk7CisgIFNldFByb3AoUF9OQU1FLCAiR3V0c2NoZWluIik7CisgIFNldFByb3AoUF9HRU5ERVIsIE1BTEUpOworICBTZXRQcm9wKFBfV0VJR0hULCA1KTsgICAgICAgICAgICAvLyBHZXdpY2h0IDVnCisgIFNldFByb3AoUF9WQUxVRSwgMCk7ICAgICAgICAgICAgIC8vIEtlaW4gbWF0ZXJpZWxsZXIgV2VydC4gSXN0IGVoIG5pY2h0IHZlcmthdWZiYXIuCisgIFNldFByb3AoUF9OT0JVWSwgMSk7ICAgICAgICAgICAgIC8vIFdpcmQgaW0gTGFkZW4gemVyc3RvZXJ0LCBmYWxscyBlciB2ZXJrYXVmdCB3aXJkLgorICBTZXRQcm9wKFBfTUFURVJJQUwsICh7TUFUX1BBUEVSfSkgKTsKKyAgU2V0UHJvcChQX0lORk8sICJEaWVzZXIgR3V0c2NoZWluIGlzdCBudXIgZnVlciBlaW5lbiBTZWhlciBtaXQgRWlnZW5oZWltIHZvbiBJbnRlcmVzc2UhXG4iKTsKKyAgU2V0UHJvcChQX0FVVE9MT0FET0JKLCAxKTsKK30KKworc3RyaW5nIGxvbmd0ZXh0KCkKK3sKKyAgc3RyaW5nIHN0cixhdXNzdGVsbGVyLGluaGFiZXIsdGV4dDsKKyAgaW50IHdlcnQ7CisgIGF1c3N0ZWxsZXI9IlNlbGV2ZW4iOworICBpbmhhYmVyPSJGaWxsaSI7CisgIHdlcnQ9NTAwMDsKKyAgdGV4dD0iIjsKKyAgc3RyPSIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG4iCisgICAgICsiICBEIEUgUiAgIFMgQyBIIFIgQSBFIE4gSyBFIFJcblxuIgorICAgICArIiAgRSBJIE4gSyBBIFUgRiBTIC0gRyBVIFQgUyBDIEggRSBJIE4gICAgLlxuXG4iCisgICAgICsiICBBdXNnZXN0ZWxsdCB2b24gIithdXNzdGVsbGVyKyIgZnVlciAiK2luaGFiZXIrIi5cblxuIgorICAgICArIiAgV2VydDogIit0b19zdHJpbmcod2VydCkrIiBNdWVuemVuLlxuXG4iCisgICAgICt0ZXh0CisgICAgICsiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiI7CisgIHJldHVybiBzdHI7Cit9CmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL3NjaHJhbmtsYWRlbi5jIGIvZC9zZWhlci9oYWV1c2VyL21vZWJlbC9zY2hyYW5rbGFkZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2FmMjVjCi0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL21vZWJlbC9zY2hyYW5rbGFkZW4uYwpAQCAtMCwwICsxLDQzNiBAQAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBOYW1lIGRlcyBPYmplY3RzOiAgICBTQ0hSQUVOS0VSCisvLyBMZXR6dGUgQWVuZGVydW5nOiAgICAwNi4wNC4yMDA2IFBfTE9HX0ZJTEUgKFNlbGV2ZW4pCisvLyBNYWdpZXI6ICAgICAgICAgICAgICBTd2lmdAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjcHJhZ21hIHN0cm9uZ190eXBlcyxydHRfY2hlY2tzCitpbmhlcml0ICIvc3RkL3Jvb20iOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSAic2NocmFua2xhZGVuLmgiCisKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX0xPR19GSUxFLCJzZWxldmVuL3NjaHJhZW5rZXIiKTsgLy8gU2VsZXZlbiAwNi4wNC4yMDA2CisgIFNQKFBfSU5UX1NIT1JULCAiSW0gU0NIUkFFTktFUiIpOworICBTUChQX0lOVF9MT05HLCBCUygKKyAgICAgIkR1IHN0ZWhzdCBpbiBlaW5lbSBnZW11ZXRsaWNoZW4ga2xlaW5lbiBMYWRlbi4gRWluIGZsYXVzY2hpZ2VyICIKKyAgICArIlRlcHBpY2hib2RlbiBkYWVtcGZ0IERlaW5lIFNjaHJpdHRlLCB1bmQgZGVyIEdlcnVjaCB2ZXJzY2hpZWRlbmVyICIKKyAgICArIkhvZWx6ZXIga2l0emVsdCBhbmdlbmVobSBpbiBkZXIgTmFzZS4gSXJnZW5kd29oZXIgZXJrbGluZ3QgZWluZSAiCisgICAgKyJsZWlzZSwgYmVydWhpZ2VuZGUgTWVsb2RpZS4gQW4gZGVuIFdhZW5kZW4gaGFlbmdlbiBCaWxkZXIgdW5kICIKKyAgICArIlplaWNobnVuZ2VuIHZlcnNjaGllZGVuc3RlciBBcnQsIHNvd2llIGVpbmUgZ3Jvc3NlIFByZWlzbGlzdGUuICIKKyAgICArIldlbm4gRHUgbmljaHQgZGVuIEVpbmRydWNrIGhhZXR0ZXN0LCBkYXNzIG1hbiBoaWVyIGFuIERlaW5lIEJvZXJzZSAiCisgICAgKyJtb2VjaHRlLCBrb2VubnRlc3QgRHUgRGljaCBoaWVyIHJpY2h0aWcgd29obCBmdWVobGVuLiIsNzgpKTsKKworICBTUChQX0xJR0hULCAxKTsKKyAgU1AoUF9JTkRPT1JTLCAxKTsKKworICBBRCggKHsiemVpdCJ9KSwgQlMoCisgICAgICJEaWUgYWt0dWVsbGUgWmVpdDogIitjdGltZSh0aW1lKCkpLDc4KSk7CisgIEFEKCAoeyJhdXNnYW5nIn0pLCBCUygKKyAgICAgIk5hY2ggT3N0ZW4gZ2VodCdzIHJhdXMuIiw3OCkpOworICBBRCggKHsiYXVzZ2FlbmdlIn0pLCBCUygKKyAgICAgIlNvIHNlaHIgRHUgYXVjaCBzdWNoc3QsIG1laHIgYWxzIGRlbiBlaW5lbiBBdXNnYW5nIGZpbmRlc3QgRHUgIgorICAgICsiZWluZmFjaCBuaWNodC4iLDc4KSk7CisgIEFEKCAoeyJnZWxkYm9lcnNlIiwgImJvZXJzZSJ9KSwgQlMoCisgICAgICJNYW4gcmVkZXQgaGFsdCB2b24gQm9lcnNlLCBhdWNoIHdlbm4gRHUga2VpbmUgZGFiZWloYXN0LiBFcyBnZWh0ICIKKyAgICArImhhbHQgdW0gRGVpbiBHZWxkISIsNzgpKTsKKyAgQUQoICh7ImdlbGQifSksIEJTKAorICAgICAiSXJnZW5kd28gd2lyc3QgRHUgc2Nob24gS29obGUgaGFiZW4hIDopIiw3OCkpOworICBBRCggKHsia29obGUiLCAiemFzdGVyIiwgIm1vbmV0ZW4iLCAicGllcGVuIiwgIm1hZXVzZSJ9KSwgQlMoCisgICAgICJLb2hsZSwgWmFzdGVyLCBNb25ldGVuLCBQaWVwZW4sIE1hZXVzZS4uLiBhbGxlcyBkYXNzZWxiZSEgOikiLDc4KSk7CisgIEFEKCAoeyJib2RlbiJ9KSwgQlMoCisgICAgICJFaW4gZmxhdXNjaGlnZXIsIGFiZXIgYXVjaCBzZWhyIHN0cmFwYXppZXJmYWVoaWdlciBUZXBwaWNoIGJlZGVja3QgIgorICAgICsiZGVuIGdhbnplbiBCb2RlbiBkZXMgTGFkZW5zLiBCaWxsaWcgc2llaHQgZXIgbmljaHQgYXVzLiIsNzgpKTsKKyAgQUQoICh7InRlcHBpY2giLCAidGVwcGljaGJvZGVuIn0pLCBCUygKKyAgICAgIkVzIGhhbmRlbHQgc2ljaCB1bSBlaW5lbiBlY2h0ZW4gVm9yYmVyZy1UZXBwaWNoLiBFciB3dXJkZSAiCisgICAgKyJ2b24gZWluZW0gRmFjaG1hbm4gdmVybGVndCB1bmQgc2NoZWludCBhdXMgZWluZW0gZWluemlnZW4gZ3Jvc3NlbiAiCisgICAgKyJTdHVlY2sgenUgc2Vpbi4iLDc4KSk7CisgIEFEKCAoeyJzdHVlY2sifSksIEJTKAorICAgICAiRGVyIFRlcHBpY2ggc2NoZWludCBhdXMgZWluZW0gZWluemlnZW4gZ3Jvc3NlbiBTdHVlY2sgenUgc2Vpbi4gU28gZ3V0ICIKKyAgICArImthbm4gZGFzIGVpZ2VudGxpY2ggbnVyIGVpbiBGYWNobWFubi4iLDc4KSk7CisgIEFEKCAoeyJmYWNobWFubiJ9KSwgQlMoIkVzIGlzdCBrZWluZXIgenUgc2VoZW4sIGFiZXIgZXMgaXN0IGFuenVuZWhtZW4sIGRhc3MgIgorICAgICsiZXMgc2ljaCB1bSBlaW5lbiBwcm9mZXNzaW9uZWxsZW4gVGVwcGljaGxlZ2VyIGhhbmRlbHRlLiIpKTsKKyAgQUQoICh7InRlcHBpY2hsZWdlciJ9KSwgIldpZSBnZXNhZ3QsIGtlaW5lciB6dSBzZWhlbi4gRGVyIFRlcHBpY2ggbGllZ3QgamEgIgorICAgICsic2Nob24sIHVuZCBkZXIgd2lyZCBhdWNoIG5vY2ggZWluZSBXZWlsZSBoYWx0ZW4uXG4iKTsKKyAgQUQoICh7IndlaWxlIn0pLCAiU2Nob24gbm9jaCBlaW4gcGFhciBKYWVocmNoZW4hXG4iKTsKKyAgQUQoICh7ImphZWhyY2hlbiJ9KSwgIlRlcHBpY2hlIGRlciBGaXJtYSBWb3JiZXJnIGtvZW5uZW4gbGFuZ2UgaGFsdGVuLlxuIik7CisgIEFEKCAoeyJ2b3JiZXJnIiwgInZvcmJlcmd0ZXBwaWNoIiwgInZvcmJlcmctdGVwcGljaCJ9KSwgQlMoCisgICAgICJEaWUgRmlybWEgVm9yYmVyZyBzdGVsbHQsIGltIEdlZ2Vuc2F0eiB6dXIgRmlybWEgSGludGVyYmVyZywgc2VociBndXRlICIKKyAgICArIlRlcHBpY2hlIGhlciwgd2llIGplZGVyIHdlaXNzLiIsNzgpKTsKKyAgQUQoICh7ImdlZ2Vuc2F0eiJ9KSwgIkRhcyB3ZWlzcyB3aXJrbGljaCBKZWRlciFcbkR1IGtvZW5udGVzdCBJaG4gZnJhZ2VuLCAiCisgICAgKyJ3YWVyZSBlciBuaWNodCBnZWJhbmlzaHQuIDopXG4iKTsKKyAgQUQoICh7ImlobiJ9KSwgQlMoIldlbiBJSE4gPyBNZWluc3QgRHUgSmVkZXI/IERlciBpc3QgZG9jaCBnZWJhbmlzaHQuIEF1cyBndXRlbSAiCisgICAgKyJHcnVuZC4gV2VubiBpcmdlbmR3byB3YXMgd2Vna29tbXQsIGRhbm4ga29lbm50ZSBkYXMgSmVkZXIgZ2V3ZXNlbiBzZWluLiAiCisgICAgKyJEYXMgcmVpY2h0IGRvY2gsIHVtIGlobiB6dSBiYW5pc2hlbiwgb2Rlcj8gOikiKSk7CisgIEFEKCAoeyJoaW50ZXJiZXJnIiwgImhpbnRlcmJlcmd0ZXBwaWNoIiwgImhpbnRlcmJlcmctdGVwcGljaCJ9KSwgQlMoCisgICAgICJEYXMgaGllciBpc3QgZWluIFRlcHBpY2ggZGVyIEZpcm1hIFZvcmJlcmcuIE5pZW1hbmQgbWl0IEdlc2NobWFjayB3dWVyZGUgIgorICAgICsiZGVuIGJpbGxpZ2VuIEFia2xhdHNjaCBkZXIgRmlybWEgSGludGVyYmVyZyBrYXVmZW4uIiw3OCkpOworICBBRCggKHsiamVkZXIifSksIEJTKAorICAgICAiRGVyIGlzdCBuaWNodCBkYS4gU2llaHN0IER1IGlobiBldHdhPyIsNzgpKTsKKyAgQUQoICh7ImdydW5kIiwgImdydWVuZGUifSksIEJTKAorICAgICAiR3J1ZW5kZSBsYXNzZW4gc2ljaCBpbW1lciBmaW5kZW4sIHNlaSBhbHNvIHZvcnNpY2h0aWchIDopIiw3OCkpOworICBBRCggKHsiZ2VzY2htYWNrIn0pLCBCUygKKyAgICAgIlVlYmVyIGRlbiBsYWVzc3Qgc2ljaCBiZWthbm50bGljaCBzdHJlaXRlbi4iLDc4KSk7CisgIEFEKCAoeyJ0ZXBwaWNoZSJ9KSwgQlMoCisgICAgICJEdSBzaWVoc3QgaGllciBlaW5lbi4gRGVyIGFiZXIgZnVlbGx0IGRlbiBnYW56ZW4gUmF1bSBhdXMuIiw3OCkpOworICBBRCggKHsiYWJrbGF0c2NoIn0pLCBCUygKKyAgICAgIlZvcmJlcmctVGVwcGljaGUgc2luZCBoYWx0IGRhcyBlaW56aWcgV2FocmUhIiw3OCkpOworICBBRCggKHsibGFkZW4ifSksIEJTKAorICAgICAiRGVyIExhZGVuIGlzdCBiZWthbm50IHVudGVyIGRlbSBOYW1lbiBcIlNDSFJBRU5LRVJcIi4gQWJlciBkYXMgd2Vpc3N0ICIKKyAgICArIkR1IHNpY2hlci4iLDc4KSk7CisgIEFEKCAoeyJuYW1lbiJ9KSwgQlMoCisgICAgICJEZXIgTmFtZW4gZGVzIExhZGVucyBpc3QgXCJTQ0hSQUVOS0VSXCIuIiw3OCkpOworICBBRCggKHsic2NocmFlbmtlciJ9KSwgQlMoCisgICAgICJKYSwgc2NoYXUgRGljaCBudXIgdW0hIiw3OCkpOworICBBRCggKHsibWVsb2RpZSJ9KSwgQlMoCisgICAgICJMYXVzY2hlIGlociBiZXNzZXIuIiw3OCkpOworICBBRCggKHsiZ2VydWNoIn0pLCBCUygKKyAgICAgIlNlaGVuIGthbm5zdCBEdSBkZW4gbmljaHQuIFZpZWxsZWljaHQgc29sbHRlc3QgRHUgRGVpbmUgTmFzZSBiZW51dHplbj8iLDc4KSk7CisgIEFEKCAoeyJzY2hyaXR0ZSJ9KSwgQlMoCisgICAgICJEdSBnZWhzdCB0ZXN0d2Vpc2UgZWluIHBhYXIgU2Nocml0dGUsIGRlciBUZXBwaWNoIGRhZW1wZnQgc2llIHRhdHNhZWNobGljaCAiCisgICAgKyJzbyBndXQsIGRhc3MgRHUgbmljaHQgZGFzIGdlcmluZ3N0ZSBob2VyZW4ga2FubnN0LiIsNzgpKTsKKyAgQUQoICh7InNjaHJpdHQifSksIEJTKAorICAgICAiTWFjaCBkYXMgZG9jaCBpcmdlbmR3bywgd28gZXMga2VpbmVyIHNpZWh0ISIsNzgpKTsKKyAgQUQoICh7Im5hc2UifSksIEJTKAorICAgICAiRHUgZmFzc3QgRGlyIGFuIGRpZSBOYXNlLiBFaW4gR2x1ZWNrLCBzaWUgaXN0IG5vY2ggZGEhIiw3OCkpOworICBBRCggKHsiZ2x1ZWNrIn0pLCBCUygKKyAgICAgIk9obmUgTmFzZSBrb2VubnRlc3QgRHUgaGllciBnYXIgbmljaHRzIHJpZWNoZW4sIHN0ZWxsIERpciBkYXMgbnVyICIKKyAgICArIm1hbCB2b3IhIiw3OCkpOworICBBRCggKHsicmF1bSIsICJvcnQifSksIEJTKAorICAgICAiRHUgc3RlaHN0IGluIGVpbmVtIG5vYmxlbiBMYWRlbi4gTWFjaCBlaW5mYWNoIFwic2NoYXVcIi4iLDc4KSk7CisgIEFEKCAoeyJmaXJtYSJ9KSwgQlMoCisgICAgICJEdSBzdGVoc3QgaGllciBpbiBlaW5lbSBMYWRlbi4gTmF0dWVybGljaCBpc3QgZGFzIGVpbmUgRmlybWEsIHVuZCBkZXIgIgorICAgICsiTGFkZW5pbmhhYmVyIGlzdCBlYmVuc28gbmF0dWVybGljaCBkZXIgRmlybWVuYmVzaXR6ZXIuIEhhdHRlc3QgRHUgZGVubiAiCisgICAgKyJldHdhcyBhbmRlcmVzIGVyd2FydGV0PyIsNzgpKTsKKyAgQUQoICh7ImVpbmRydWNrIn0pLCBCUygKKyAgICAgIkVzIGlzdCBlaW4gTGFkZW4uIEVyIHNpZWh0IG5vYmVsIGF1cywgUHJlaXNlIHdpZSBiZWkgQUxESSB3aXJkJ3MgaGllciBhbHNvICIKKyAgICArIndvaGwgbmljaHQgZ2ViZW4uIFVuZCBhdXNzZXJkZW0gaXN0IGRlciBlcnN0ZSBFaW5kcnVjayBtZWlzdCBkZXIgcmljaHRpZ2UuIiw3OCkpOworICBBRCggKHsiYWxkaSJ9KSwgQlMoCisgICAgICJORUlOLCBEdSBiaXN0IGhpZXIgTklDSFQgYmVpIEFMREkgISEhIiw3OCkpOworICBBRCggKHsicHJlaXMiLCAicHJlaXNlIiwgImxpc3RlIiwgInByZWlzbGlzdGUifSksIEJTKAorICAgICAiQW4gZGVyIFdhbmQgaGFlbmd0IGVpbmUgZ3Jvc3NlIFByZWlzbGlzdGUuIFZpZWxsZWljaHQgc29sbHRlc3QgRHUgc2llICIKKyAgICArImxlc2VuPyIsNzgpKTsKKyAgQUQoICh7ImluaGFiZXIiLCAibGFkZW5pbmhhYmVyIiwgImJlc2l0emVyIiwgImZpcm1lbmJlc2l0emVyIiwgInZlcmthZXVmZXIifSksIEJTKAorICAgICAiSXN0IGRlciBkZW5uIGdlcmFkZSBuaWNodCBkYT8gRGFzIGlzdCBzZWhyIHZlcnd1bmRlcmxpY2gsIGVjaHQgZWhybGljaC4iLDc4KSk7CisgIEFEKCAoeyJlbGYiLCAiZWxmZW4iLCAicGVyc29uIn0pLCBCUygKKyAgICAgIlNjaGF1IERpciBoYWx0IGRhcyBQb3J0cmFpdCBhbiEiLDc4KSk7CisgIEFEKCAoeyJkYXJzdGVsbHVuZyIsICJkYXJzdGVsbHVuZ2VuIn0pLCBCUygKKyAgICAgIkRpZSBCaWxkZXIgemVpZ2VuIE1vZWJlbHN0dWVja2UsIGhhdXB0c2FlY2hsaWNoIFNjaHJhZW5rZS4iLDc4KSk7CisgIEFEKCAoeyJyZWloZSJ9KSwgQlMoCisgICAgICJCZWkgZGVuIG1laXN0ZW4gQmlsZGVybiBoYW5kZWx0IGVzIHNpY2ggdW0gRGFyc3RlbGx1bmcgdm9uIE1vZWJlbHN0dWVja2VuLiAiCisgICAgKyJOdXIgZWluIGVpbnppZ2VzIFBvcnRyYWl0IGlzdCBkYWJlaSwgZGFzIGVpbmUgUGVyc29uIHplaWd0LiIsNzgpKTsKKyAgQUQoICh7ImFydCJ9KSwgQlMoCisgICAgICJCZWkgZGVuIG1laXN0ZW4gQmlsZGVybiBoYW5kZWx0IGVzIHNpY2ggdW0gRGFyc3RlbGx1bmdlbiB2b24gTW9lYmVsc3R1ZWNrZW4sICIKKyAgICArInp1bWVpc3Qgdm9uIFNjaHJhZW5rZW4uIEVpbiBQb3J0cmFpdCBmYWVsbHQgRGlyIGFsbGVyZGluZ3MgYXVmLCBkYXMgbmljaHQgaW4gIgorICAgICsiZGllIFJlaWhlIGRlciBhbmRlcmVuIEJpbGRlciBwYXNzdC4iLDc4KSk7CisgIEFEKCAoeyJiaWxkZXIifSksIEJTKAorICAgICAiRXMgZ2lidCBtZWhyZXJlIERhcnN0ZWxsdW5nZW4gdm9uIHZlcnNjaGllZGVuZW4gTW9lYmVsc3R1ZWNrZW4uIFp1bWVpc3QgIgorICAgICsiaGFuZGVsdCBlcyBzaWNoIGRhYmVpIHVtIFNjaHJhZW5rZSB2ZXJzY2hpZWRlbmVyIEJhdXdlaXNlLiBBdXNzZXJkZW0gaXN0ICIKKyAgICArImRhIG5vY2ggZWluIFBvcnRyYWl0LiIsNzgpKTsKKyAgQUQoICh7ImJhdWFydCIsICJiYXV3ZWlzZSIsICJtb2ViZWxzdHVlY2siLCAibW9lYmVsc3R1ZWNrZSIsICJhcnRlbiJ9KSwgQlMoCisgICAgICJFcyBnaWJ0IFdhZmZlbnNjaHJhZW5rZSwgS2xlaWRlcnNjaHJhZW5rZSwgS3VlaGxzY2hyYWVua2UgKEpBISksIEtvbW1vZGVuLCAiCisgICAgKyJzb25zdGlnZSBTY2hyYWVua2UgKER1IGthbm5zdCBpaHJlbiBad2VjayBuaWNodCBtYWwgZXJhaG5lbikgdW5kIGVpbmlnZSAiCisgICAgKyJUcnVoZW4sIGRpZSB6d2FyIGtlaW5lIFNjaHJhZW5rZSBpbSBlaWdlbnRsaWNoZW4gU2lubmUgc2luZCwgYWJlciBaZXVnICIKKyAgICArImJyaW5ndCBtYW4gZGFyaW4gbWl0IFNpY2hlcmhlaXQgYXVjaCB1bnRlci4gU29nYXIgZWluZSBWaXRyaW5lIHNpZWhzdCAiCisgICAgKyJEdS4iLDc4KSk7CisgIEFEKCAoeyJ6d2VjayJ9KSwgQlMoCisgICAgICJTdGF1cmF1bSBmdWVyIGlyZ2VuZHdlbGNoZXMgWmV1Z3MuIERhcyBtdXNzIGVzIHNlaW4uIFdhcyBmdWVyIGVpbmVuICIKKyAgICArIlp3ZWNrIGtvZW5udGUgZXMgc29uc3Qgbm9jaCBnZWJlbj8iLDc4KSk7CisgIEFEKCAoeyJ2aXRyaW5lIn0pLCBCUygiRGllIFZpdHJpbmUgaXN0IGxlZXIsIGFiZXIgZGFzIGFlbmRlcnQgc2ljaCBzaWNoZXIsICIKKyAgICArInNvYmFsZCBEdSBlaW5lIGdla2F1ZnQgaGFzdC4iLDc4KSk7CisgIEFEKCAoeyJrbGVpZGVyc2NocmFuayIsICJrbGVpZGVyc2NocmFlbmtlIn0pLCBCUygKKyAgICAgIlNpY2hlciBlaWduZXQgc2ljaCBzb2xjaCBlaW4gU2NocmFuayBzZWhyIGd1dCwgdW0gZGFyaW4gUnVlc3R1bmdlbiAiCisgICAgKyJhdWZ6dWJld2FocmVuLiIsNzgpKTsKKyAgQUQoICh7IndhZmZlbnNjaHJhbmsiLCAid2FmZmVuc2NocmFlbmtlIn0pLCBCUygKKyAgICAgIkluIGVpbmVtIFdhZmZlbnNjaHJhbmsga2FubnN0IER1IGVpbmUgTWVuZ2UgdmVyc2NoaWVkZW5lciBXYWZmZW4gIgorICAgICsidW50ZXJicmluZ2VuLCB1bmQgZGVyIFZvcnRlaWwgZGFiZWkgaXN0LCBkYXNzIHNpZSBkYW5uIGF1Y2ggc2F1YmVyICIKKyAgICArInNvcnRpZXJ0IGltIFNjaHJhbmsgaGFlbmdlbi4iLDc4KSk7CisgIEFEKCAoeyJrb21tb2RlbiJ9KSwgQlMoCisgICAgICJEaWUga2FubiBtYW4gbmljaHQgbnVyIGluIGVpbmVuIEZsdXIgc3RlbGxlbiwgc29uZGVybiBhdWNoIGluIGplZGVuICIKKyAgICArImFuZGVyZW4gUmF1bSEiLDc4KSk7CisgIEFEKCAoeyJmbHVyIn0pLCBCUygKKyAgICAgIkRpZSBtZWlzdGVuIEhhZXVzZXIgaGFiZW4gZWluZW4uIiw3OCkpOworICBBRCggKHsiaGFldXNlciJ9KSwgQlMoCisgICAgICJISUVSID8/PyIsNzgpKTsKKyAgQUQoICh7Im1lbmdlIn0pLCBCUygKKyAgICAgIk1laHIgYWxzIER1IGJyYXVjaHN0LCBlcyBzZWkgZGVubiBEdSBiaXN0IFNhbW1sZXIuIiw3OCkpOworICBBRCggKHsiemV1Z3MiLCAiZGluZ2UifSksIEJTKAorICAgICAiRGluZ2UgaGFsdC4iLDc4KSk7CisgIEFEKCAoeyJ3YWZmZW4ifSksIEJTKAorICAgICAiRHUga2FubnN0IHNpZSBpbiBlaW5lbSBXYWZmZW5zY2hyYW5rIHVudGVyYnJpbmdlbiwgd2VubiBEdSBlaW5lbiAiCisgICAgKyJiZXNpdHp0LiBXZW5uIG5pY2h0IGthbm5zdCBEdSBqYSBlaW5lbiBrYXVmZW4uIiw3OCkpOworICBBRCggKHsid2FmZmUifSksIEJTKAorICAgICAiV2VsY2hlIFdhZmZlIG1laW5zdCBEdT8iLDc4KSk7CisgIEFEKCAoeyJydWVzdHVuZ2VuIn0pLCBCUygKKyAgICAgIkR1IGthbm5zdCBzaWUgaW4gZWluZW0gS2xlaWRlcnNjaHJhbmsgdW50ZXJicmluZ2VuLCB3ZW5uIER1IGVpbmVuICIKKyAgICArImJlc2l0enQuIFdlbm4gbmljaHQga29lbm50ZXN0IER1IERpciBlaW5lbiB6dWxlZ2VuLiIsNzgpKTsKKyAgQUQoICh7InJ1ZXN0dW5nIn0pLCBCUygKKyAgICAgIlZvbiB3ZWxjaGVyIFJ1ZXN0dW5nIHJlZGVzdCBEdT8iLDc4KSk7CisgIEFEKCAoeyJ2b3J0ZWlsIn0pLCBCUygKKyAgICAgIkplZGVyIGlzdCBkb2NoIGF1ZiBzZWluZW4gcGVyc29lbmxpY2hlbiBWb3J0ZWlsIGJlZGFjaHQuIiw3OCkpOworICBBRCggKHsia3VlaGxzY2hyYW5rIiwgImt1ZWhsc2NocmFlbmtlIn0pLCBCUygKKyAgICAgIkluIHNvIGVpbmVtIEt1ZWhsc2NocmFuayBrYW5uIG1hbiBlaWdlbnRsaWNoIGFsbGVzIHJlaW5zdGVja2VuLCBhYmVyICIKKyAgICArIm5hdHVlcmxpY2ggYmlldGV0IGVyIHNpY2ggYmVzb25kZXJzIGZ1ZXIgR2V0cmFlbmtlIHVuZCBTcGVpc2VuIGFsbGVyICIKKyAgICArIkFydCBhbi4gV2llIHouQi4gU2NobmVsbGhhZXJ0ZXIsIEJyb2V0Y2hlbiB1c3cuIiw3OCkpOworICBBRCggKHsiZ2V0cmFlbmtlIiwgInNwZWlzZW4ifSksIEJTKAorICAgICAiRGFzIGhpZXIgaXN0IGtlaW5lIEtuZWlwZS4gU293YXMgZ2lidCdzIGhpZXIgbmljaHQhIiw3OCkpOworICBBRCggKHsia25laXBlIn0pLCBCUygKKyAgICAgIkRhcyBoaWVyIGlzdCBLRUlORSBLbmVpcGUgISEhIiw3OCkpOworICBBRCggKHsidHJ1aGUiLCAidHJ1aGVuIn0pLCBCUygKKyAgICAgIkVzIGdpYnQgZ3Jvc3NlIHVuZCBrbGVpbmUsIGF1cyB2ZXJzY2hpZWRlbmVtIE1hdGVyaWFsLiIsNzgpKTsKKyAgQUQoICh7Im1hdGVyaWFsIn0pLCBCUygKKyAgICAgIlRvdGFsIHZlcnNjaGllZGVuLCB3aXJrbGljaC4iLDc4KSk7CisgIEFEKCAoeyJzY2huZWxsaGFlcnRlciIsICJicm9ldGNoZW4ifSksIEJTKAorICAgICAiQmVzb3JnIERpciB3ZWxjaGUsIGJldm9yIER1IHNpZSB1bnRlcnN1Y2hlbiB3aWxsc3QhIiw3OCkpOworICBBRCggKHsic2FtbWxlciJ9KSwgQlMoCisgICAgICJCaXN0IER1IGVpbmVyPyIsNzgpKTsKKyAgQUQoICh7InNpY2hlcmhlaXQifSksIEJTKAorICAgICAiSm8sIGluIHNvIGVpbmUgVHJ1aGUgcGFzc3QgdmllbCBaZXVnIHJlaW4uIiw3OCkpOworICBBRCggKHsiemV1ZyJ9KSwgQlMoCisgICAgICJBbGxlcywgd2FzIER1IHNvIG1pdCBEaXIgcnVtc2NobGVwcHN0LiBEYXMgbWVpc3RlIGRhdm9uIGJyYXVjaHN0ICIKKyAgICArIkR1IHNvd2llc28gbmllLiIsNzgpKTsKKyAgQUQoICh7ImJpbGQifSksIEJTKAorICAgICAiRXMgZ2lidCBtZWhyZXJlIERhcnN0ZWxsdW5nZW4gdm9uIHZlcnNjaGllZGVuZW4gTW9lYmVsc3R1ZWNrZW4gdW5kIGVpbiAiCisgICAgKyJQb3J0cmFpdC4gV2VsY2hlcyBCaWxkIG1laW5zdCBEdT8iLDc4KSk7CisgIEFEKCAoeyJwb3J0cmFpdCJ9KSwgQlMoCisgICAgICJFcyB6ZWlndCBlaW5lbiBFbGYgbWl0IHN0cmFobGVuZCBibGF1ZW4gQXVnZW4gdW5kIGRlbiB0eXBpc2NoIHNwaXR6ZW4gIgorICAgICsiRWxmZW5vaHJlbiwgZGllIGZyZWNoIGF1cyBlaW5lciBiZWVpbmRydWNrZW5kZW4sIHNpbGJlcmdyYXVlbiBMb2V3ZW5tYWVobmUgIgorICAgICsiaGVydm9yc2NoYXVlbi4gRGVyIFNwaXR6aHV0LCBkZXIgaWhtIGF1ZiBkZW0gS29wZiBzaXR6dCwgbGFlc3N0IGRhcmF1ZiAiCisgICAgKyJzY2hsaWVzc2VuLCBkYXNzIGVzIHNpY2ggdW0gZWluZW4gWmF1YmVyZXIgaGFuZGVsdC4gVW50ZW4gaW4gZGVyIHJlY2h0ZW4gIgorICAgICsiQmlsZGVja2UgaXN0IGVpbmUgV2lkbXVuZyBhbmdlYnJhY2h0LiIsNzgpKTsKKyAgQUQoICh7InNpbm4iLCAic2lubmUifSksIEJTKAorICAgICAiU2NocmFlbmtlIHVuZCBUcnVoZW4gc2VoZW4gc2Nob24gZXR3YXMgdmVzY2hpZWRlbiBhdXMuIiw3OCkpOworICBBRCggKHsic3dpZnQifSksIEJTKAorICAgICAiU2llaHN0IER1IGlobiBoaWVyIGV0d2EgZ2VyYWRlPyIsNzgpKTsKKyAgQUQoICh7ImJpbGRlY2tlIn0pLCBCUygKKyAgICAgIlVudGVuIGluIGRlciByZWNodGVuIEJpbGRlY2tlIGlzdCBlaW5lIFdpZG11bmcgYW5nZWJyYWNodC4iLDc4KSk7CisgIEFEKCAoeyJhdWdlbiJ9KSwgQlMoCisgICAgICJEZXIgRWxmIGF1ZiBkZW0gUG9ydHJhaXQgaGF0IHN0cmFobGVuZCBibGF1ZSBBdWdlbi4iLDc4KSk7CisgIEFEKCAoeyJ3aWRtdW5nIn0pLCBCUygKKyAgICAgIlNpZWh0IGF1cyBhbHMgb2IgbWFuIGRpZSBzb2dhciBsZXNlbiBrYW5uISIsNzgpKTsKKyAgQUQoICh7Im1hZWhuZSIsICJsb2V3ZW5tYWVobmUifSksIEJTKAorICAgICAiRGVyIEVsZiBhdWYgZGVtIEJpbGQgaGF0IGVpbmUgc2lsYmVyZ3JhdWUgTG9ld2VubWFlaG5lLiIsNzgpKTsKKyAgQUQoICh7InphdWJlcmVyIiwgInphdWJlcmh1dCIsICJ6YXViZXJlcmh1dCIsICJzcGl0emh1dCJ9KSwgQlMoCisgICAgICJEZXIgWmF1YmVyaHV0IG1hY2h0IGRlbiBFbGZlbiBhdWYgZGVtIFBvcnRyYWl0IGVyc3QgenUgZWluZW0gd2FzY2hlY2h0ZW4gIgorICAgICsiWmF1YmVyZXIuIiw3OCkpOworICBBRCggKHsib2hyZW4iLCAiZWxmZW5vaHJlbiJ9KSwgQlMoCisgICAgICJEaWUgT2hyZW4gZGVzIEVsZmVuIGF1ZiBkZW0gUG9ydHJhaXQgc2luZCBzbyBzcGl0eiwgd2llIG1hbiBkYXMgdm9uICIKKyAgICArImVpbmVtIEVsZmVuIGVyd2FydGV0LiIsNzgpKTsKKyAgQVJEKCAoeyJ3aWRtdW5nIn0pLAorICAgICAiRGFuayBhbiBHZW9yZGkgZnVlciBkaWVzZSBncm9zc2FydGlnZSBHZXNjaGFlZnRzaWRlZS5cbiIKKyAgICArIk1vZWdlbiBEaXIgRGVpbmUgWmF1YmVyIGdlbGluZ2VuIHVuZCBkaWUgU3BlbGxwdW5rdGUgbmllbWFscyBhdXNnZWhlbi5cbiIKKyAgICArIihEYXJ1bnRlciBoYXQgamVtYW5kIHVudGVyc2NocmllYmVuLCBhYmVyIGRhcyBHZWtyYWtlbCBrYW5uc3QgRHUgbmljaHQgIgorICAgICsiaWRlbnRpZml6aWVyZW4pXG4iKTsKKyAgQUQoICh7InVudGVyc2NocmlmdCJ9KSwgQlMoCisgICAgICJNZWluc3QgRHUgZGFzIEdla3Jha2VsPyIsNzgpKTsKKyAgQUQoICh7InJvdGZhZXJidW5nIiwgImZhcmJlIn0pLCBCUygKKyAgICAgIkRhcyBIb2x6IGhhdCBlaW5lIGxlaWNodCByb2V0bGljaGUgRmFyYmUuIiw3OCkpOworICBBRCggKHsicnVoZSJ9KSwgQlMoCisgICAgICJBYWFhaGhoaGguIFJ1aGUgdHV0IGd1dC4gVW5kIGRhbmsgZGVyIGxlaXNlbiBNZWxvZGllIGVudHNwYW5uc3QgRHUgIgorICAgICsiRGljaCBhbGxtYWVobGljaC4iLDc4KSk7CisgIEFEKCAoeyJjaGFvc2RhZW1vbiJ9KSwgQlMoCisgICAgICJLZWluZXIgZGEuIFdlZGVyIFN3aWZ0IG5vY2ggZWluIGFuZGVyZXIuIEdsdWVjayBmdWVyIERpY2ghIiw3OCkpOworICBBRCggKHsic2FjaGVuIn0pLCBCUygKKyAgICAgIldhcyBhdWNoIGltbWVyLiIsNzgpKTsKKyAgQUQoICh7ImtsYXVlIn0pLCBCUygKKyAgICAgIldhaHJzY2hlaW5saWNoIGthbm4gU3dpZnQgZGFtaXQgYW5kZXJlIFNhY2hlbiBiZXNzZXIgZXJsZWRpZ2VuIGFscyAiCisgICAgKyJzY2hyZWliZW4uIFNjaGxpZXNzbGljaCBpc3QgZXIgZWluIENoYW9zZGFlbW9uLiIsNzgpKTsKKyAgQUQoICh7Imdla3Jha2VsIn0pLCBCUygKKyAgICAgIkR1IG5pbW1zdCBEaXIgWmVpdCB1bmQgc2NoYXVzdCBkaWUgVW50ZXJzY2hyaWZ0IGRvY2ggbm9jaG1hbCBpbiBhbGxlciAiCisgICAgKyJSdWhlIGFuLiBFbmRsaWNoIGtvbW10IERpciBkaWUgRXJsZXVjaHR1bmcuIERhcyBzb2xsIFwiU3dpZnRcIiBoZWlzc2VuLiAiCisgICAgKyJNYW5uLCBoYXQgZGVyIG5lIEtsYXVlISAoTmFqYSwgYmVpIGVpbmVtIENoYW9zZGFlbW9uZW4gd3VuZGVydCBkYXMgIgorICAgICsiZWlnZW50bGljaCBuaWNodCkiLDc4KSk7CisgIEFEKCAoeyJlcmxldWNodHVuZyJ9KSwgQlMoCisgICAgICJTaWUgZmFuZCBpbiBEZWluZW0gS29wZiBzdGF0dC4gRGVuIG11ZXNzdGV0IER1IHNjaG9uIG9lZmZuZW4sIHdlbm4gRHUgIgorICAgICsiZGllIEVybGV1Y2h0dW5nIHBoeXNpc2NoIHVudGVyc3VjaGVuIG1vZWNodGVzdC4gVW5kIGRhcyBrYW5uIHNpY2ggIgorICAgICsibmVnYXRpdiBhdWYgRGVpbmUgR2VzdW5kaGVpdCBhdXN3aXJrZW4uIExhc3MgZXMgbGllYmVyISIsNzgpKTsKKyAgQUQoICh7Imdlc3VuZGhlaXQifSksIEJTKAorICAgICAiTWl0IEtvcGYgYmlzdCBEdSBnZXN1bmQuIERhcyBpc3QgZ2V3aXNzLiIsNzgpKTsKKyAgQUQoICh7IndhbmQiLCAid2FlbmRlIn0pLCBCUygKKyAgICAgIkRpZSBXYWVuZGUgYmVzdGVoZW4gYXVzIGVpbmVtIGZlaW5lbiwgZXhvdGlzY2hlbiBIb2x6IG1pdCBsZWljaHRlciAiCisgICAgKyJSb3RmYWVyYnVuZy4gU2llaHQgc2VociBlZGVsIGF1cy4gTWVocmVyZSBCaWxkZXIgd3VyZGVuIGFuIGRlbiBXYWVuZGVuICIKKyAgICArImF1ZmdlaGFlbmd0IHVuZCB2ZXJ0ZWlsZW4gc2ljaCBnbGVpY2htYWVzc2lnIHVlYmVyIGRlbiBSYXVtLiIsNzgpKTsKKyAgQUQoICh7ImtvcGYifSksIEJTKAorICAgICAiRWluIEdsdWVjaywgZXIgaXN0IG5vY2ggZHJhbi4gR2VuYXVzbyB3aWUgYmVpIGRlbSBFbGZlbiBhdWYgZGVtICIKKyAgICArIlBvcnRyYWl0ISIsNzgpKTsKKyAgQUQoICh7InNjaHJhbmsiLCAic2NocmFlbmtlIn0pLCBCUygKKyAgICAgIkVzIGdpYnQgdmVyc2NoaWVkZW5lIEFydGVuIHZvbiBTY2hyYWVua2VuLiIsNzgpKTsKKyAgQUQoICh7InplaWNobnVuZyJ9KSwgQlMoCisgICAgICJFcyBnaWJ0IG1laHJlcmUgZGF2b24uIiw3OCkpOworICBBRCggKHsiemVpY2hudW5nZW4ifSksIEJTKAorICAgICAiU2llIHplaWdlbiAtIHRlaWx3ZWlzZSBza2l6emVuaGFmdCAtIGRlbiBBdWZiYXUgdmVyc2NoaWVkZW5lciAiCisgICAgKyJNb2ViZWxzdHVlY2tlIC0gdm9yenVnc3dlaXNlIFNjaHJhZW5rZS4iLDc4KSk7CisgIEFEKCAoeyJhdWZiYXUiLCAienVzYW1tZW5zZXR6dW5nIn0pLCBCUygKKyAgICAgIk1pdCBkZW0gQXVmYmF1IGlzdCBkaWUgWnVzYW1tZW5zZXR6dW5nIGdlbWVpbnQgLSB1bmQgdW1nZWtlaHJ0LiIsNzgpKTsKKyAgQUQoICh7ImhvbHoiLCAiaG9lbHplciJ9KSwgQlMoCisgICAgICJTY2hvbiBoaWVyIGltIFJhdW0gd3VyZGUgbWl0IHZlcnNjaGllZGVuc3RlbiBIb2VsemVybiBnZWFyYmVpdGV0LCAiCisgICAgKyJpaHIgZWRsZXIgRHVmdCB2ZXJtaXNjaHQgc2ljaCB1bmQgYmlldGV0IGVpbmVuIGVyaGViZW5kZW4gR2VydWNoLiAiCisgICAgKyJMZWlkZXIgc2luZCBkaWUgbWVpc3RlbiBIb2x6YXJ0ZW4gc28gZXhvdGlzY2gsIGRhc3MgRHUgYmVpbSBiZXN0ZW4gIgorICAgICsiV2lsbGVuIG5pY2h0IHNhZ2VuIGthbm5zdCwgdW0gd2FzIGZ1ZXIgZWluZW4gQmF1bSBlcyBzaWNoIGRhIG1hbCAiCisgICAgKyJnZWhhbmRlbHQgaGF0LiIsNzgpKTsKKyAgQUQoICh7ImhvbHphcnQiLCAiaG9semFydGVuIn0pLCBCUygKKyAgICAgIlNlaHIgZXhvdGlzY2hlIEhvbHphcnRlbi4gRHUgYmlzdCBrZWluIEV4cGVydGUgZnVlciBzb3dhcywgdW5kICIKKyAgICArInZlcm11dGxpY2ggaGFzdCBEdSBhdWNoIGtlaW5lIEx1c3QsIGVpbmVyIHp1IHdlcmRlbi4iLDc4KSk7CisgIEFEKCAoeyJleHBlcnRlIn0pLCBCUygKKyAgICAgIktlaW5lciBkYS4iLDc4KSk7CisgIEFEKCAoeyJsdXN0In0pLCBCUygKKyAgICAgIldlbm4gamVtYW5kIHNlaW5lIEx1c3QgdW50ZXJzdWNodC91ZWJlcnBydWVmdCwgYmVrdW5kZXQgZXIgZGFtaXQgIgorICAgICsiZWlnZW50bGljaCBzY2hvbiBpbiBXaXJrbGljaGtlaXQgc2VpbmUgVW5sdXN0LiIsNzgpKTsKKyAgQUQoICh7InVubHVzdCJ9KSwgQlMoCisgICAgICJUamEsIFVubHVzdCBrZW5uemVpY2huZXQgZGVuIEZhdWxwZWx6LiIsNzgpKTsKKyAgQUQoICh7ImZhdWxwZWx6In0pLCBCUygKKyAgICAgIkR1IGJpc3QgZ2VtZWludCEiLDc4KSk7CisgIEFEKCAoeyJ3aXJrbGljaGtlaXQiLCAicmVhbGl0YWV0In0pLCBCUygKKyAgICAgIkRpZSBXaXJrbGljaGtlaXQgaXN0IGRpZSBSZWFsaXRhZXQgLSB1bmQgYW5kZXJzcnVtLiBNZWlzdGVucyAiCisgICAgKyJqZWRlbmZhbGxzLiIsNzgpKTsKKyAgQUQoICh7Im1laXN0ZW5zIn0pLCBCUygKKyAgICAgIkhpZXIgc2Nob24uIiw3OCkpOworICBBRCggKHsiaGllciJ9KSwgQlMoCisgICAgICJIaWVyIGhhbHQhIiw3OCkpOworICBBRCggKHsiYmF1bSIsICJiYWV1bWUifSksIEJTKAorICAgICAiSGllciBnaWJ0IGVzIGtlaW5lIEJhZXVtZS4gRGllIHd1cmRlbiBiZXJlaXRzIGFsbGUgdmVyYXJiZWl0ZXQuIiw3OCkpOworICBBRCggKHsiZHVmdCJ9KSwgQlMoCisgICAgICJSaWVjaGUgaGFsdCBtYWwhIiw3OCkpOworICBBRCggKHsid2lsbGUiLCAid2lsbGVuIn0pLCBCUygKKyAgICAgIkRlaW4gV2lsbGUgaXN0IHN0YXJrLi4uIiw3OCkpOworICBBRCggKHsiZGVja2UifSksIEJTKAorICAgICAiTWFlY2h0aWdlIEJhbGtlbiBiaWxkZW4gZGllIERlY2tlLiBFcyBrb2VubnRlIHNpY2ggdW0gRWljaGUgaGFuZGVsbiwgYWJlciAiCisgICAgKyJnZW5hdXNvZ3V0IGtvZW5udGUgZXMgaXJnZW5kZWluZSBhZWhubGljaGUsIGV4b3Rpc2NoZSBIb2x6YXJ0IHNlaW4uICIKKyAgICArIkVpbiBoZXJybGljaGVyIEtyb25sZXVjaHRlciBoYWVuZ3Qgdm9uIGRlciBNaXR0ZSBoZXJhYi4iLDc4KSk7CisgIEFEKCAoeyJlaWNoZSIsICJlaWNoZW5iYWxrZW4ifSksIEJTKAorICAgICAiRXMgaXN0IG5pY2h0IHNpY2hlciwgZGFzcyBlcyBzaWNoIHVtIEVpY2hlbmJhbGtlbiBoYW5kZWx0LCBhYmVyIEJhbGtlbiAiCisgICAgKyJzaW5kJ3MgYXVmIGplZGVuIEZhbGwuIiw3OCkpOworICBBRCggKHsiZmFsbCJ9KSwgQlMoCisgICAgICJFY2h0IGVocmxpY2guIiw3OCkpOworICBBRCggKHsiYmFsa2VuIn0pLCBCUygKKyAgICAgIlNpZSBiaWxkZW4gZGllIERlY2tlLiBFaW4gaGVycmxpY2ggYW56dXNlaGVuZGVyIEtyb25sZXVjaHRlciBoYWVuZ3QgIgorICAgICsiZGFyYW4gaGVyYWIuIiw3OCkpOworICBBRCggKHsia3JvbmxldWNodGVyIn0pLCBCUygKKyAgICAgIkVyIGhhZW5ndCB2b24gZGVyIERlY2tlIGhlcmFiIHVuZCBtdXNzIGVpbiBWZXJtb2VnZW4gd2VydCBzZWluLiBSZWluZXMgIgorICAgICsiQmVyZ2tyaXN0YWxsIG1pdCBlaW5lciBVbnphaGwgdm9uIEtlcnplbi4gV2FzIGRhcyBmdWVyIGVpbiBBdWZ3YW5kIHNlaW4gIgorICAgICsibXVzcywgZGllIGltbWVyIGFtIEJyZW5uZW4genUgaGFsdGVuLiIsNzgpKTsKKyAgQUQoICh7InZlcm1vZWdlbiJ9KSwgQlMoCisgICAgICJNZWhyIGFscyBEdSB0cmFnZW4ga2FubnN0LiIsNzgpKTsKKyAgQUQoICh7ImJlcmdrcmlzdGFsbCJ9KSwgQlMoCisgICAgICJOdXIgQmVyZ2tyaXN0YWxsIGhhdCBkaWVzZW4gR2xhbnouIiw3OCkpOworICBBRCggKHsiYnJlbm5lbiJ9KSwgQlMoCisgICAgICJEaWUgS2VyemVuIGZsYWNrZXJuIG11bnRlciB2b3Igc2ljaCBoaW4uIiw3OCkpOworICBBRCggKHsidW56YWhsIn0pLCBCUygKKyAgICAgIjEsIDIsIC4uLnZpZWxlISIsNzgpKTsKKyAgQUQoICh7ImdsYW56In0pLCBCUygKKyAgICAgIkhlcnJsaWNoISIsNzgpKTsKKyAgQUQoICh7Im1pdHRlIn0pLCBCUygKKyAgICAgIlZvbiBkZXIgTWl0dGUgZGVyIERlY2tlIGhhZW5ndCBlaW4gS3JvbmxldWNodGVyIGhlcmFiLiIsNzgpKTsKKyAgQUQoICh7ImtlcnplbiJ9KSwgQlMoCisgICAgICJEaXIgZmFlbGx0IGF1ZiwgZGFzcyBkaWUgS2VyemVuIHNpY2ggZ2FyIG5pY2h0IHZlcmJyYXVjaGVuLiBFcyBtdXNzICIKKyAgICArInNpY2ggdW0gbWFnaXNjaGUgS2VyemVuIGhhbmRlbG4uIiw3OCkpOworICBBRCggKHsiYXVmd2FuZCJ9KSwgQlMoCisgICAgICJFbnRzZXR6dCBkZW5rc3QgRHUgLiBvIE8gKERhcyBzY2hsYWVndCBzaWNoIGJlc3RpbW10IGF1ZiBkZW4gUHJlaXMgbmllZGVyLikiLDc4KSk7CisgIEFEKCAoeyJlY2tlbiJ9KSwgQlMoCisgICAgICJJbiBkZW4gRWNrZW4gZW50ZGVja3N0IER1IGtsZWluZSwgZWRsZSBMYXV0c3ByZWNoZXIsIGF1cyBkZW5lbiBkaWUgIgorICAgICsiTWVsb2RpZSB6dSBrb21tZW4gc2NoZWludC4iLDc4KSk7CisgIEFEKCAoeyJsYXV0c3ByZWNoZXIifSksIEJTKAorICAgICAiRHUgd3Vzc3Rlc3QgZ2FyIG5pY2h0LCBkYXNzIHNvd2FzIGltIE1vcmdlbkdyYXVlbiBzY2hvbiBlcmZ1bmRlbiB3dXJkZS4iLDc4KSk7CisgIEFEKCAoeyJtb3JnZW5ncmF1ZW4ifSksIEJTKAorICAgICAiVHVzdCBEdSBkYXMgbmljaHQgc2Nob24gZGllIGdhbnplIFplaXQ/Iiw3OCkpOworCisgIEFkZFNtZWxscyhTRU5TRV9ERUZBVUxULCAiRXMgcmllY2h0IGhpZXIgYW5nZW5laG0gbmFjaCB2ZXJzY2hpZWRlbmVuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKyJIb2VsemVybi5cbiIpOworICBBZGRTbWVsbHMoKHsiaG9lbHplciIsICJob2x6IiwgImhvbHphcnRlbiJ9KSwgQlMoIkR1IGthbm5zdCBuaWNodCBzYWdlbiwgIgorICAgICsidW0gd2FzIGZ1ZXIgSG9semFydGVuIGVzIHNpY2ggaGFuZGVsdCwgYWJlciBkZXIgR2VydWNoIGxhZXNzdCBhdWYgdmllbGUgIgorICAgICsidmVyc2NoaWVkZW5lIHNjaGxpZXNzZW4uIEVpbmUgVHJlbm51bmcgZGVzIEdlcnVjaHMgaXN0IERpciBuaWNodCBtb2VnbGljaC4iKSApOworICBBZGRTbWVsbHMoKHsiZ2VydWNoIiwgImdlcnVlY2hlIn0pLCBCUygiRXMgcmllY2h0IG5hY2ggdmVyc2NoaWVkZW5lbiAiCisgICAgKyJIb2x6YXJ0ZW4uIikgKTsKKworICBBZGRTb3VuZHMoU0VOU0VfREVGQVVMVCwgIkdhbnogbGVpc2UgaG9lcnN0IER1IGVpbmUgYW5nZW5laG1lLCBiZXJ1aGlnZW5kZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICsiTWVsb2RpZS5cbiIpOworICBBZGRTb3VuZHMoKHsibWVsb2RpZSJ9KSwgIlNpZSBzY2hlaW50IHZvbiBhbGxlbiBFY2tlbiBkZXMgTGFkZW5zIHp1IGtvbW1lbi5cbiIpOworCisgIEFkZEl0ZW0oIExBREVOKCJ2ZXJrYWV1ZmVyIiksIFJFRlJFU0hfREVTVFJVQ1QpOworCisgIEFkZENtZCgoeyJvZWZmbmUifSksICJrb3BmX29lZmZuZW4iKTsKKyAgQWRkQ21kKCh7ImxpZXMiLCAibGVzIiwgImxlc2UifSksICJwcmVpc2xpc3RlX2xlc2VuIik7CisgIEFkZENtZCgoeyJpZGVlIn0pLCAiaWRlZV9sb2dnZW4iKTsKKyAgQWRkQ21kKCh7InRyZW5uIiwgInRyZW5uZSJ9KSwgImdlcnVlY2hlX3RyZW5uZW4iKTsKKyAgQWRkQ21kKCh7IndlcmQiLCAid2VyZGUifSksICJleHBlcnRlX3dlcmRlbiIpOworICBBZGRDbWQoKHsiemFlaGwiLCAiemFlaGxlIn0pLCAia2VyemVuX3phZWhsZW4iKTsKKworICBBZGRTcGVjaWFsRXhpdCgib3N0ZW4iLCAicmF1c2dlaGVuIik7Cit9CisKK2ludCBrZXJ6ZW5femFlaGxlbihzdHJpbmcgc3RyKQoreworICBub3RpZnlfZmFpbCgiV2FzIG1vZWNodGVzdCBEdSB6YWVobGVuP1xuIik7CisgIGlmKCFzdHIpIHJldHVybiAwOworICBpZihzdHIhPSJrZXJ6ZW4iKSByZXR1cm4gMDsKKyAgd3JpdGUoIjEuLjIuLnZpZWxlLlxuIik7CisgIHJldHVybiAxOworfQorCitpbnQgcmF1c2dlaGVuKHN0cmluZyBkaXIpCit7CisgIHJldHVybiBUUC0+bW92ZShSQVVNX1ZPUl9MQURFTiwgTV9HTywgMCwKKyAgICAidmVybGFlc3N0IGRlbiBMYWRlbiIsICJrb21tdCBhdXMgZGVtIExhZGVuIik7Cit9CisKK3ZhcmFyZ3Mgc3RyaW5nIEdldEV4aXRzKCBvYmplY3Qgdmlld2VyICkKK3sKKyAgcmV0dXJuICJEZXIgQXVzZ2FuZyBiZWZpbmRldCBzaWNoIGltIE9zdGVuLlxuIjsKK30KKworaW50IGtvcGZfb2VmZm5lbihzdHJpbmcgc3RyKQoreworICBub3RpZnlfZmFpbCgiV2FzIG1vZWNodGVzdCBEdSBvZWZmbmVuP1xuIik7CisgIGlmKCFzdHIpIHJldHVybiAwOworICBpZihzdHIhPSJrb3BmIiAmJiBzdHIhPSJtZWluZW4ga29wZiIgJiYgc3RyIT0iZGVpbmVuIGtvcGYiKQorICAgIHJldHVybiAwOworICB3cml0ZSggQlMoIk5ldWdpZXJpZywgd2llIER1IGJpc3QsIGdyZWlmc3QgRHUgRGlyIGFuIGRlbiBLb3BmLiBEYSBmYWVsbHQgRGlyICIKKyAgICArImVpbiwgZGFzcyBkYXMgb2VmZm5lbiBEZWluZXMgS29wZmVzIGV2dGwuIGVpbmUgQ29weXJpZ2h0LVZlcmxldHp1bmcgIgorICAgICsiZGFyc3RlbGxlbiBrb2VubnRlLCBEdSBoZWlzc3QgamEgc2NobGllc3NsaWNoIG5pY2h0IEhhbm5pYmFsLiBBbHNvIGxhZXNzdCAiCisgICAgKyJEdSBlcyBkYW5uIGRvY2ggYmxlaWJlbi4iKSk7CisgIHJldHVybiAxOworfQorCitpbnQgcHJlaXNsaXN0ZV9sZXNlbihzdHJpbmcgc3RyKQoreworICBub3RpZnlfZmFpbCgiV2FzIG1vZWNodGVzdCBEdSBsZXNlbj9cbiIpOworICBpZighc3RyKSByZXR1cm4gMDsKKyAgaWYoc3RyIT0icHJlaXNsaXN0ZSIgJiYgc3RyIT0ibGlzdGUiKQorICAgIHJldHVybiAwOworICBUUC0+TW9yZSggcmVhZF9maWxlKExBREVOKCJwcmVpc2xpc3RlLnR4dCIpKSApOworICByZXR1cm4gMTsKK30KKworaW50IGlkZWVfbG9nZ2VuKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyB0eHQ7CisgIHN0cj1UUC0+X3VucGFyc2VkX2FyZ3MoKTsKKyAgdHh0PUJTKHN0ciwgNzgsIENBUChnZXRldWlkKFRQKSkrIi4uLi4uLi4uLi4uLi4iWzAuLjEyXSwgQlNfSU5ERU5UX09OQ0UpOworICB3cml0ZV9maWxlKCBMQURFTihJREVFTl9MT0cpLCB0eHQrIlxuIik7CisgIHdyaXRlKCJWaWVsZW4gRGFuayBmdWVyIERlaW5lIElkZWUhXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBnZXJ1ZWNoZV90cmVubmVuKHN0cmluZyBzdHIpCit7CisgIG5vdGlmeV9mYWlsKCJXYXMgd2lsbHN0IER1IHRyZW5uZW4/XG4iKTsKKyAgaWYoIXN0cikgcmV0dXJuIDA7CisgIGlmKHN0ciE9ImdlcnVjaCIgJiYgc3RyIT0iZ2VydWVjaGUiKQorICAgIHJldHVybiAwOworICB3cml0ZSgiRHUgdmVyc3VjaHN0IGVzLCBhYmVyIER1IHNjaGFmZnN0IGVzIGVpbmZhY2ggbmljaHQuXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBleHBlcnRlX3dlcmRlbihzdHJpbmcgc3RyKQoreworICBub3RpZnlfZmFpbCgiV2FzIHdpbGxzdCBEdSB3ZXJkZW4/XG4iKTsKKyAgaWYoIXN0cikgcmV0dXJuIDA7CisgIGlmKHN0ciE9ImV4cGVydGUiICYmIHN0ciE9ImZhY2htYW5uIikKKyAgICByZXR1cm4gMDsKKyAgd3JpdGUoIlRqYSwgc28gZWluZmFjaCBnZWh0IGRhcyBuaWNodCwgYWJlciBkYXMgaGFldHRlc3QgRHUgRGlyIGRlbmtlbiBrb2VubmVuLlxuIik7CisgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL21vZWJlbC9zY2hyYW5rbGFkZW4uaCBiL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvc2NocmFua2xhZGVuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZjNzZhOQotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvc2NocmFua2xhZGVuLmgKQEAgLTAsMCArMSwzNiBAQAorI2luY2x1ZGUgIm1vZWJlbC5oIgorCisjZGVmaW5lIFNDSFJBTktNQVNURVIyICIvcGxheWVycy9zd2lmdC93b3Jrcm9vbSIKKworI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPGNvbWJhdC5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDxyb29tcy5oPgorCisjZGVmaW5lIEJTICAgYnJlYWtfc3RyaW5nCisjZGVmaW5lIEVOVih4KSAgZW52aXJvbm1lbnQoeCkKKyNkZWZpbmUgRVRPIGVudmlyb25tZW50KHRoaXNfb2JqZWN0KCkpCisjZGVmaW5lIEVUUCBlbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKQorI2RlZmluZSBUUCAgIHRoaXNfcGxheWVyKCkKKyNkZWZpbmUgVE8gICB0aGlzX29iamVjdCgpCisKKyNkZWZpbmUgU1AgU2V0UHJvcAorI2RlZmluZSBRUCBRdWVyeVByb3AKKyNkZWZpbmUgQUQgQWRkRGV0YWlsCisjZGVmaW5lIEFSRCBBZGRSZWFkRGV0YWlsCisKKyNkZWZpbmUgU1VJRCBzZXRldWlkKGdldHVpZCh0aGlzX29iamVjdCgpKSkKKworLy8jZGVmaW5lIENBUCh4KSBjYXBpdGFsaXplKHgpCisjZGVmaW5lIExPV0VSKHgpIGxvd2VyX2Nhc2UoeCkKKworI2RlZmluZSBDTE9ORU1FKHgpIGNsb25lX29iamVjdCh4KS0+bW92ZShNRSkKKyNkZWZpbmUgQ0xPTkVPQih4KSBjbG9uZV9vYmplY3QoeCkKKyNkZWZpbmUgQ0xPTkUoeCx5KSBjbG9uZV9vYmplY3QoeCktPm1vdmUoeSkKKyNkZWZpbmUgSVNUX1pBSEwoeCkgKHN0cmluZyl0b19pbnQoeCk9PXgKKworI2RlZmluZSBSSUdIVCh4LHkpICh5PnNpemVvZih4KT94OmV4dHJhY3QoeCxzaXplb2YoeCkteSxzaXplb2YoeCktMSkpCisjZGVmaW5lIExFRlQoeCx5KSAoeT5zaXplb2YoeCk/eDpleHRyYWN0KHgsMCx5LTEpKQpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL21vZWJlbC9zY2hyYW5rbWFzdGVyLmMgYi9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL3NjaHJhbmttYXN0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjAyZGRjCi0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL21vZWJlbC9zY2hyYW5rbWFzdGVyLmMKQEAgLTAsMCArMSwyMzMgQEAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE5hbWUgZGVzIE9iamVjdHM6ICAgIFNjaHJhbmttYXN0ZXIKKy8vIExldHp0ZSBBZW5kZXJ1bmc6ICAgIDE5LjAzLjIwMDEKKy8vIE1hZ2llcjogICAgICAgICAgICAgIHd1cnplbAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogQ2hhbmdlbG9nOgorICAgKiAyMS4wNi4yMDA3LCBaZXNzdHJhCisgICAgICAgICAgIGNhbGxfb3V0IG9obmUgVmVyem9lZ2VydW5nIGJlaW0gVXBkYXRlbiBkdXJjaCBlaW5lcyBtaXQgMnMgVmVyem9lZ2VydW5nIGVyc2V0enQuCisqLworI3ByYWdtYSBzdHJvbmdfdHlwZXMscnR0X2NoZWNrcworCitpbmhlcml0ICIvc3RkL3Jvb20iOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSAic2NocmFua2xhZGVuLmgiCisKK21hcHBpbmcgc2NocmFlbmtlOworc3RyaW5nICpjbnRzOworaW50IHVwZGF0ZV9sYWV1ZnQ7CitpbnQgcmVzZXRfbGFldWZ0OworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSAKK3sKKyAgOjpjcmVhdGUoKTsKKyAgU1AoUF9JTlRfU0hPUlQsICJJcmdlbmR3byB1bmQgTmlyZ2VuZHMiKTsKKyAgU1AoUF9JTlRfTE9ORywKKyAgICAgIkRpZXMgaXN0IGRlciBNYXN0ZXItUmF1bSBmdWVyIGRlbiBTQ0hSQUVOS0VSLlxuIgorICAgICsiSGllciBtZXJrdCBzaWNoIEF1Z3VzdCBkaWUgQW56YWhsIGRlciB2ZXJrYXVmdGVuIENvbnRhaW5lci5cbiIKKyAgICArIkRhdm9uIHNpbmQgbW9tZW50YW4gQEBBTlpBSExAQCByZWdpc3RyaWVydGUgaW0gVW1sYXVmIVxuIgorICAgICsiRm9sZ2VuZGUgQmVmZWhsZSBzaW5kIHZlcmZ1ZWdiYXI6XG4iCisgICAgKyIgIHNjaHJhbmtsaXN0ZS4uLi4uLi4uLkxpc3RldCByZWdpc3RyaWVydGUsIGltIFNwaWVsIGJlZmluZGxpY2hlIENvbnRhaW5lci5cbiIKKyAgICArIiAgc2NocmFua3VwZGF0ZS4uLi4uLi4uRnVlaHJ0IGVpbiBVcGRhdGUgYWxsZXIgcmVnaXN0cmllcnRlbiBDb250YWluZXIgZHVyY2guXG4iKTsKKworICBTUChQX0xJR0hULCAxKTsKKyAgU1AoUF9JTkRPT1JTLCAxKTsKKyAgaWYoIFNDSFJBTktNQVNURVIyLT5RdWVyeVByb3AoInNjaHJhZW5rZSIpICkgIC8vIERlciBTaWNoZXJ1bmdzcmF1bSBoYXQgRGF0ZW4/CisgICAgc2NocmFlbmtlPVNDSFJBTktNQVNURVIyLT5RdWVyeVByb3AoInNjaHJhZW5rZSIpOyAgLy8gRGF0ZW4gaG9sZW4uLi4KKyAgZWxzZQorICAgIHNjaHJhZW5rZT0oW10pOworICBTZXRQcm9wKCJzY2hyYWVua2UiLCBzY2hyYWVua2UgKTsKKworICB1cGRhdGVfbGFldWZ0PTA7CisKKyAgLy8gdW5ub2V0aWcsIFNDSFJBTktNQVNURVIyIGlzdCBqZXR6dCBzY2hvbiBnZWxhZGVuLCBzLm8uCisgIC8vbG9hZF9vYmplY3QoU0NIUkFOS01BU1RFUjIpOworICBzZXRfbmV4dF9yZXNldCgzNjAwKTsgLy8gUmVzZXQgMSB4IHBybyBTdGQuCisKKyAgQWRkQ21kKCh7InNjaHJhbmtsaXN0ZSJ9KSwgIlNjaHJhbmtsaXN0ZSIpOworICBBZGRDbWQoKHsic2NocmFua3VwZGF0ZSJ9KSwgIlNjaHJhbmtVcGRhdGUiKTsKK30KKworcHVibGljIGludCBjbGVhbl91cChpbnQgcmVmKSB7cmV0dXJuIDA7fSAgIC8vIHZlcmhpbmRlcnQgQXVzc3dhcHBlbiBkZXMgUmF1bWVzCisKK3B1YmxpYyB2YXJhcmdzIHN0cmluZyBHZXRFeGl0cyggb2JqZWN0IHZpZXdlciApIAoreworICByZXR1cm4gIiI7Cit9CisKK3N0cmluZyBBTlpBSEwoKQoreworICByZXR1cm4gdG9fc3RyaW5nKCBzaXplb2Yoc2NocmFlbmtlKSApOworfQorCisKKy8vIGNudCA9IE9iamVjdCBkZXMgQ29udGFpbmVycworLy8gdmVyID0gVmVyc2lvbiBkZXMgQ29udGFpbmVycyAoVkVSU0lPTl9TVEQrVkVSU0lPTl9PQkogdm9uIHN0ZC5jb250LiArIG9iamVrdC4uLikKKy8vIHNlaGVyPURlciBCZXNpdHplci9LYWV1ZmVyCisvLyBzdGFuZG9ydD1SYXVtIGluIGRlbSBkZXIgQ29udGFpbmVyIHN0ZWh0Cit2b2lkIFJlZ2lzdGVyQ250KG1peGVkIGNudCwgbWl4ZWQgdmVyLCBtaXhlZCBzZWhlciwgbWl4ZWQgc3RhbmRvcnQpCit7CisgIGlmIChvYmplY3RwKHN0YW5kb3J0KSkgc3RhbmRvcnQ9b2JqZWN0X25hbWUoc3RhbmRvcnQpOworICBpZiggIW9iamVjdHAoY250KSB8fCAhc3RyaW5ncCh2ZXIpIHx8ICFzdHJpbmdwKHNlaGVyKSB8fCAhc3RyaW5ncChzdGFuZG9ydCkgKQorICB7CisgICAgbG9nX2ZpbGUoInN3aWZ0L3NjaHJhZW5rZXIvYnVncy5sb2ciLCAic2NocmFua21hc3RlciAoUmVnaXN0ZXJDbnQpICoiCisgICAgICArdG9fc3RyaW5nKGNudCkrIioiK3RvX3N0cmluZyh2ZXIpKyIqIit0b19zdHJpbmcoc2VoZXIpKyIqIgorICAgICAgK3RvX3N0cmluZyhzdGFuZG9ydCkrIipcbiIpOworICAgIHJldHVybjsKKyAgfQorICBtX2RlbGV0ZShzY2hyYWVua2Usb2JqZWN0X25hbWUoY250KSk7CisgIHNjaHJhZW5rZSs9KFtvYmplY3RfbmFtZShjbnQpOiB2ZXI7IHNlaGVyOyB0b19zdHJpbmcoc3RhbmRvcnQpXSk7CisgIFNldFByb3AoInNjaHJhZW5rZSIsIHNjaHJhZW5rZSApOworICBTQ0hSQU5LTUFTVEVSMi0+U2V0UHJvcCgic2NocmFlbmtlIiwgc2NocmFlbmtlICk7Cit9CisKK3ZvaWQgUmVtb3ZlQ250KG1peGVkIGNudCwgbWl4ZWQgc2VoZXIpCit7CisgIGlmKCAhb2JqZWN0cChjbnQpIHx8ICFzdHJpbmdwKHNlaGVyKSApCisgIHsKKyAgICBsb2dfZmlsZSgic3dpZnQvc2NocmFlbmtlci9idWdzLmxvZyIsICJzY2hyYW5rbWFzdGVyIChSZW1vdmVDbnQpICoiCisgICAgICArdG9fc3RyaW5nKGNudCkrIioiK3RvX3N0cmluZyhzZWhlcikrIipcbiIpOworICAgIHJldHVybjsKKyAgfQorICBzY2hyYWVua2UtPShbb2JqZWN0X25hbWUoY250KV0pOworICBTZXRQcm9wKCJzY2hyYWVua2UiLCBzY2hyYWVua2UgKTsKKyAgU0NIUkFOS01BU1RFUjItPlNldFByb3AoInNjaHJhZW5rZSIsIHNjaHJhZW5rZSApOworfQorCitzdHJpbmcgZm4oc3RyaW5nIHdhcykKK3sKKyAgc3RyaW5nIHN0ciwqc3RyczsKKyAgc3Rycz1vbGRfZXhwbG9kZSggd2FzLCAiLyIgKTsKKyAgc3RyPXN0cnNbc2l6ZW9mKHN0cnMpLTFdOworICBzdHJzPW9sZF9leHBsb2RlKCBzdHIsICIjIiApOworICBzdHI9c3Ryc1swXTsKKyAgcmV0dXJuIHN0cjsKK30KKworaW50IFNjaHJhbmtsaXN0ZSgpCit7CisgIGludCBpOworICBzdHJpbmcgc3RyLCAqc3RyczsKKyAgb2JqZWN0IGNudDsKKyAgaWYodXBkYXRlX2xhZXVmdCAmJiAhcmVzZXRfbGFldWZ0KSAvLyBOaWNodCB3YWVocmVuZCBlaW5lcyBVcGRhdGVzIGRlciBTY2hyYWVua2UhCisgIHsKKyAgICB3cml0ZSgiVXBkYXRlIHdpcmQgZHVyY2hnZWZ1ZWhydC4gQml0dGUgYmlzIHp1bSBFbmRlIHdhcnRlbiFcbiIpOworICAgIHJldHVybiAxOworICB9CisgIHN0cj0iLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIjsKKyAgc3Rycz1tX2luZGljZXMoc2NocmFlbmtlKTsKKyAgZm9yKGk9MDtpPHNpemVvZihzdHJzKTtpKyspCisgIHsKKyAgICBpZiggY250PWZpbmRfb2JqZWN0KHN0cnNbaV0pICkKKyAgICB7CisgICAgICBzdHIrPShmbihvYmplY3RfbmFtZShjbnQpKSsiLi4uLi4uLi4uLi4uLi4uLi4uLi4iKVswLi4yMF0rIiAiOworICAgICAgc3RyKz1zY2hyYWVua2Vbc3Ryc1tpXSwgMF0rIiAiOworICAgICAgc3RyKz0oc2NocmFlbmtlW3N0cnNbaV0sIDFdKyIuLi4uLi4uLi4uLi4uLi4uLi4uLiIpWzAuLjIwXSsiICI7CisgICAgICBzdHIrPWZuKHNjaHJhZW5rZVtzdHJzW2ldLCAyXSkrIlxuIjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHN0cis9Ik5pY2h0IGF1ZmZpbmRiYXJlbiBDb250YWluZXIgYXVzIExpc3RlIGdlbG9lc2NodCFcbiI7CisgICAgICBzY2hyYWVua2UtPShbc3Ryc1tpXV0pOworICAgICAgU2V0UHJvcCgic2NocmFlbmtlIiwgc2NocmFlbmtlICk7CisgICAgICBTQ0hSQU5LTUFTVEVSMi0+U2V0UHJvcCgic2NocmFlbmtlIiwgc2NocmFlbmtlICk7CisgICAgfQorICB9CisgIHN0cis9Ii0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiI7CisgIGlmKCBUUCAmJiBwcmVzZW50KFRQKSApIC8vd3VyemVsIDE5LjAzLjAxIAorICAgIFRQLT5Nb3JlKHN0cik7CisgIHJldHVybiAxOworfQorCit2b2lkIFVwZGF0ZV9uYWVjaHN0ZXJfU2NocmFuaygpCit7CisgIGludCBpOworICBvYmplY3QgY250LCBjbnRfbmV1LCAqaW52OworICBpZiggc2l6ZW9mKGNudHMpICkgICAgLy8gRXMgZ2lidCBub2NoIFNjaHJhZW5rZSB6dW0gYWJhcmJlaXRlbi4uLgorICB7CisgICAgY250PWZpbmRfb2JqZWN0KGNudHNbMF0pOyAvLyBTY2hyYW5rIGF1c3dhZWhsZW4gKyBPYmpla3Qgc3VjaGVuCisgICAgaWYoY250KQorICAgIHsKKyAgICAgIC8vIEF1dG9sb2FkZXJ0cnVoZSBpc3QgZXR3YXMgc3BlemllbGxlciB6dSB1cGRhdGVuLi4uIERhaGVyIGFsdGVybmF0aXZlcgorICAgICAgLy8gTWVjaGFuaXNtdXM6IFVwZGF0ZU1lKCkgaW0gTW9lYmVsc3R1ZWNrIGF1ZnJ1ZmVuLiBXZW5uIGRpZSBGdW5rdGlvbgorICAgICAgLy8gZXR3YXMgIT0gMCBsaWVmZXJ0LCB3aXJkIGFuZ2Vub21tZW4sIGRhc3MgZGllc2UgRnVua3Rpb24gZGFzIFVwZGF0ZQorICAgICAgLy8gZ2VtYWNodCBoYXQgb2RlciBzaWNoIGluIEt1ZXJ6ZSBkYXJ1bSBrdWVtbWVydC4gU29uc3Qgd2lyZCBkYXMgYWx0ZQorICAgICAgLy8gVXBkYXRlIGdlbWFjaHQuCisgICAgICAvLyBEYXMgbmV1ZSBNb2ViZWxvYmpla3QgaXN0IGRhZnVlciB2ZXJhbnR3b3J0bGljaCwgc2ljaCBiZWltCisgICAgICAvLyBTY2hyYW5rbWFzdGVyIHp1IChkZS0pcmVnaXN0cmllcmVuIQorICAgICAgb2JqZWN0IG9sZGVudj1lbnZpcm9ubWVudChjbnQpOworICAgICAgaWYgKGNudC0+VXBkYXRlTWUoKSkKKyAgICAgIHsKKyAgICAgICAgICB0ZWxsX3Jvb20oVE8sICIuLi5VcGRhdGUgIitDQVAoZm4oY250c1swXSkpCisgICAgICAgICAgICAgICsiIGluICIgKyBvYmplY3RfbmFtZShvbGRlbnYpICsgIlxuIiApOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgIHRlbGxfcm9vbShUTywgQ0FQKGZuKGNudHNbMF0pKQorICAgICAgICAgICAgICArIiBpbiAiICsgb2JqZWN0X25hbWUob2xkZW52KSAKKyAgICAgICAgICAgICAgKyAiIGhhdCBrZWluIFVwZGF0ZU1lKCkhXG4iICk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICB0ZWxsX3Jvb20oVE8sICJOaWNodCBhdWZmaW5kYmFyZW4gQ29udGFpbmVyIGF1cyBMaXN0ZSBnZWxvZXNjaHQhXG4iKTsKKyAgICAgIHNjaHJhZW5rZS09KFtjbnRzWzBdXSk7CisgICAgfQorICAgIGNudHMtPSh7Y250c1swXX0pOyAgIC8vIFNjaHJhbmsgYXVzIExpc3RlIG5laG1lbgorICAgIGNhbGxfb3V0KCJVcGRhdGVfbmFlY2hzdGVyX1NjaHJhbmsiLCAyKTsgIC8vIE51ciAxIFNjaHJhbmstVXBkYXRlIHBybyBoZWFydF9iZWF0IQorICB9CisgIGVsc2UgIC8vIEFsbGUgU2NocmFlbmtlIGFiZ2VhcmJlaXRldDoKKyAgeworICAgIHRlbGxfcm9vbShUTywgIioqKiBVcGRhdGUgYWJnZXNjaGxvc3Nlbi5cbiIpOworICAgIFNldFByb3AoInNjaHJhZW5rZSIsIHNjaHJhZW5rZSApOworICAgIFNDSFJBTktNQVNURVIyLT5TZXRQcm9wKCJzY2hyYWVua2UiLCBzY2hyYWVua2UgKTsKKyAgICB1cGRhdGVfbGFldWZ0PTA7CisgIH0KK30KKworaW50IFNjaHJhbmtVcGRhdGUoKQoreworICBpZih1cGRhdGVfbGFldWZ0KSAgIC8vIE5pY2h0IHdhZWhyZW5kIGVpbmVzIFVwZGF0ZXMgZGVyIFNjaHJhZW5rZSEKKyAgeworICAgIHdyaXRlKCJVcGRhdGUgd2lyZCBkdXJjaGdlZnVlaHJ0LiBCaXR0ZSBiaXMgenVtIEVuZGUgd2FydGVuIVxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgdXBkYXRlX2xhZXVmdD0xOyAgICAvLyBBYiBzb2ZvcnQgbGFldWZ0IFVwZGF0ZSEKKyAgY250cz1tX2luZGljZXMoc2NocmFlbmtlKTsKKyAgdGVsbF9yb29tKFRPLCAiKioqIFVwZGF0ZSB3aXJkIGdlc3RhcnRldC4uLlxuIik7CisgIFVwZGF0ZV9uYWVjaHN0ZXJfU2NocmFuaygpOworICByZXR1cm4gMTsKK30KKworCit2b2lkIHJlc2V0KCkKK3sKKyAgcmVzZXRfbGFldWZ0PTE7CisgIHNldF9uZXh0X3Jlc2V0KDM2MDApOyAvLyBSZXNldCAxIHggcHJvIFN0ZC4KKyAgOjpyZXNldCgpOworICAvLyBXaXJmdCBTY2hyYWVua2UgYXVzIGRlciBMaXN0ZSwgZGllIGF1cyB3ZWxjaGVtIEdydW5kIGF1Y2ggaW1tZXIgbmljaHQgbWVociBleGlzdGllcmVuCisgIFNjaHJhbmtsaXN0ZSgpOworICBpZiggIShzY2hyYWVua2U9PVF1ZXJ5UHJvcCgic2NocmFlbmtlIik9PVNDSFJBTktNQVNURVIyLT5RdWVyeVByb3AoInNjaHJhZW5rZSIpKSApCisgICAgbG9nX2ZpbGUoInN3aWZ0L3NjaHJhZW5rZXIvcmVzZXQubG9nIiwgInNjaHJhbmttYXN0ZXIgKHJlc2V0KSAiCisgICAgICArc2l6ZW9mKHNjaHJhZW5rZSkrIiAiCisgICAgICArc2l6ZW9mKFF1ZXJ5UHJvcCgic2NocmFlbmtlIikpKyIgIgorICAgICAgK3NpemVvZihTQ0hSQU5LTUFTVEVSMi0+UXVlcnlQcm9wKCJzY2hyYWVua2UiKSkrIlxuIik7CisgIGlmKCBwcmVzZW50KCJJbnRlcmFjdGl2ZSIpICkKKyAgICB0ZWxsX3Jvb20oVE8sICIqKiogUkVTRVQgKioqXG4iKTsKKyAgcmVzZXRfbGFldWZ0PTA7Cit9CisKKy8qCisvLyBWZXJhbHRldGUgRnVua3Rpb25lbiwgdW0gRmVobGVyIGFienVmYW5nZW4uIEthbm4gbmFjaCBkZW0gbmFlY2hzdGVuIFJlYm9vdAorLy8gZ2Vsb2VzY2h0IHdlcmRlbiAhISEKK3ZvaWQgQWRkQ250KG1peGVkIGNudCwgbWl4ZWQgdmVyLCBtaXhlZCBzZWhlciwgbWl4ZWQgc3RhbmRvcnQpCit7CisgIGxvZ19maWxlKCJzd2lmdC9zY2hyYWVua2VyL3ZlcmxvcmVuLmxvZyIsIHRvX3N0cmluZyhjbnQpKyJcbiIpOworfQordm9pZCBFZGl0Q250KG1peGVkIGNudCwgbWl4ZWQgdmVyLCBtaXhlZCBzZWhlciwgbWl4ZWQgc3RhbmRvcnQpCit7CisgIGxvZ19maWxlKCJzd2lmdC9zY2hyYWVua2VyL3ZlcmxvcmVuLmxvZyIsIHRvX3N0cmluZyhjbnQpKyJcbiIpOworfQorKi8KZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvc3BpbmQuYyBiL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvc3BpbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDczYjEwCi0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL21vZWJlbC9zcGluZC5jCkBAIC0wLDAgKzEsMjA4IEBACisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBOYW1lIGRlcyBPYmplY3RzOiAgICBTcGluZAorLy8gTGV0enRlIEFlbmRlcnVuZzogICAgMTcuMDMuMjAwMQorLy8gTWFnaWVyOiAgICAgICAgICAgICAgU3dpZnQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHJ0dF9jaGVja3MKKworI2luY2x1ZGUgInNjaHJhbmtsYWRlbi5oIgorI2luY2x1ZGUgImFuc2kuaCIKK2luaGVyaXQgTEFERU4oInN3aWZ0X3N0ZF9jb250YWluZXIiKTsKKworI2RlZmluZSBWRVJTSU9OX09CSiAiMyIKKworc3RyaW5nIHN0cmFsbDsKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAoVE8pKSByZXR1cm47CisgIHN3aWZ0X3N0ZF9jb250YWluZXI6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfU0hPUlQsICJFaW4gU3BpbmQiKTsKKyAgU2V0UHJvcChQX0xPTkcsIEJTKAorICAgICAiRGllc2VyIFN0YWhsc2NocmFuayBpc3Qgdm9yIGFsbGVtIGZ1ZXIgc3BhcnRhbmlzY2hlIFJhZXVtZSBnZWRhY2h0LiBFYmVuc28gIgorICAgICsid2llIHNlaW4gR2VnZW5zdHVlY2ssIGRlciBLbGVpZGVyc2NocmFuaywgdmVyZnVlZ3QgZXIgdWViZXIgZWluZSBNZW5nZSAiCisgICAgKyJSZWdhbGUsIGluIGRlbmVuIGVyIHJpZXNpZ2UgQXVzcnVlc3R1bmdzbWVuZ2VuIGF1Zm5laG1lbiBrYW5uLiIpCisgICAgKyJAQGNudF9zdGF0dXNAQCIpOworICBBZGRJZCgoeyJzcGluZCIsICJzY2hyYW5rIiwgInN0YWhsc2NocmFuayJ9KSk7CisgIFNldFByb3AoImNudF92ZXJzaW9uX29iaiIsIFZFUlNJT05fT0JKKTsKKyAgU2V0UHJvcChQX05BTUUsICJTcGluZCIpOworICBTZXRQcm9wKFBfR0VOREVSLCBNQUxFKTsKKyAgU2V0UHJvcChQX1dFSUdIVCwgNTAwMCk7ICAgICAgICAgLy8gR2V3aWNodCA1IEtnCisgIFNldFByb3AoUF9NQVhfV0VJR0hULCAxMDAwMDAwKTsgIC8vIEVzIHBhc3NlbiBmdWVyIDEwMDAga2cgU2FjaGVuIHJlaW4uCisgIFNldFByb3AoUF9XRUlHSFRfUEVSQ0VOVCwgMTAwKTsgIC8vIERhZnVlciBtYWNodCBlciBhdWNoIG5peCBsZWljaHRlciA6KQorICBTZXRQcm9wKFBfTUFYX09CSkVDVFMsIDEwMCk7ICAgICAvLyBNZWhyIHNvbGx0ZSBuaWNodCBzZWluLCBsdC4gVGlhbWFrLgorICBTZXRQcm9wKFBfVkFMVUUsIDApOyAgICAgICAgICAgICAvLyBLZWluIG1hdGVyaWVsbGVyIFdlcnQuIElzdCBlaCBuaWNodCB2ZXJrYXVmYmFyLgorICBTZXRQcm9wKFBfTk9CVVksIDEpOyAgICAgICAgICAgICAvLyBXaXJkIGltIExhZGVuIHplcnN0b2VydCwgZmFsbHMgZXIgdmVya2F1ZnQgd2lyZC4KKyAgU2V0UHJvcChQX05PR0VULCAiRGFzIGdlaHQgbmljaHQuICIrTmFtZShXRVIsMSkrIiBoYWZ0ZXQgd2llIG1hZ2lzY2ggYW0gQm9kZW4uXG4iKTsKKyAgU2V0UHJvcChQX01BVEVSSUFMLCAoe01BVF9NSVNDX01FVEFMLCBNQVRfTUlTQ19NQUdJQ30pICk7CisgIFNldFByb3AoUF9JTkZPLCAiVmVyc3VjaHMgbWFsIG1pdDogXCJza29tbWFuZG9zICIrUXVlcnlQcm9wKFBfSURTKVsxXSsiXCIgIVxuIik7CisgIFNldFByb3AoIm9ial9jbWQiLCAic2xpc3RlIFtPYmpla3QtSWRdIFtLbGVpZHVuZ3MtL1J1ZXN0dW5nc3R5cF1cbiIKKyAgICAgICAgICAgICAgICAgICAgKyIgIEtsZWlkdW5ncy0vUnVlc3R1bmdzdHlwZW46IEhlbG1lLCBVbWhhZW5nZSwgUnVlc3R1bmdlbiwgSG9zZW4sIFNjaHVoZSxcbiIKKyAgICAgICAgICAgICAgICAgICAgKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRzY2h1aGUsIEd1ZXJ0ZWwsIEFtdWxldHRlLCBSaW5nZSwgS29lY2hlcixcbiIKKyAgICAgICAgICAgICAgICAgICAgKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGlsZGUsIFNvbnN0aWdlc1xuIik7CisgIEFEKCh7InJlZ2FsIiwgInJlZ2FsZSJ9KSwgQlMoIkR1cmNoIGRpZSBSZWdhbGUga29tbXQgZXR3YXMgT3JkbnVuZyBpbiBkaWUgIgorICAgICsidmllbGVuIFNhY2hlbiwgZGllIG1hbiBpbiBkZW4gU2NocmFuayBzdGVja2VuIGthbm4uIER1IGthbm5zdCBEaXIgei5CLiAiCisgICAgKyJlaW5lIExpc3RlIGJlc3RpbW10ZXIgS2xlaWR1bmdzLS9SdWVzdHVuZ3N0eXBlbiBkZXMgU2NocmFua2luaGFsdGVzICIKKyAgICArIm1pdCBkZW0gQmVmZWhsIFwic2xpc3RlXCIgYW5zY2hhdWVuLiAoRGFzIGdlaHQgbmF0dWVybGljaCBudXIgYmVpICIKKyAgICArIm9mZmVuZW0gU2NocmFuayEiKSk7CisKKyAgQWRkQ21kKCh7InNsaXN0ZSJ9KSwgImF1Zmxpc3R1bmciKTsKK30KKwordmFyYXJncyBpbnQgUHJldmVudEluc2VydChvYmplY3Qgb2IpCit7CisgIC8vIE51ciBSdWVzdHVuZy9LbGVpZHVuZyBoYXQgaW4gZGllc2VtIENvbnRhaW5lciB3YXMgdmVybG9yZW4hCisgIGlmICgob2ItPklzQ2xvdGhpbmcoKSB8fCBvYi0+UXVlcnlQcm9wKFBfQVJNT1VSX1RZUEUpKQorICAgICAgJiYgIW9iLT5RdWVyeVByb3AoUF9XRUFQT05fVFlQRSkgKQorICB7CisgICAgcmV0dXJuIDo6UHJldmVudEluc2VydChvYik7CisgIH0KKworICB3cml0ZSggQlMoIkluICIrbmFtZShXRU4sMSkrIiBrYW5uc3QgRHUgbnVyIFJ1ZXN0dW5ncy0vS2xlaWR1bmdzc3R1ZWNrZSBsZWdlbiEiKSk7CisgIHJldHVybiAxOworfQorCitpbnQgYXVmbGlzdHVuZzIoc3RyaW5nIHdhcywgc3RyaW5nIG5mX3N0cjEsIHN0cmluZyBuZl9zdHIyLCBpbnQgYWxsZXMpCit7CisgIHN0cmluZyBvYnNob3J0LCBzdWNoZSwgKnN0cnM7CisgIG9iamVjdCAqb2JzOworICBpbnQgaTsKKyAgbWFwcGluZyBzdWNob2JzOworICBzd2l0Y2god2FzKQorICB7CisgICAgY2FzZSAiaGVsbWUiICAgICAgOiBzdWNoZT1BVF9IRUxNRVQ7IGJyZWFrOworICAgIGNhc2UgInVtaGFlbmdlIiAgIDogc3VjaGU9QVRfQ0xPQUs7IGJyZWFrOworICAgIGNhc2UgInJ1ZXN0dW5nZW4iIDogc3VjaGU9QVRfQVJNT1VSOyBicmVhazsKKyAgICBjYXNlICJob3NlbiIgICAgICA6IHN1Y2hlPUFUX1RST1VTRVJTOyBicmVhazsKKyAgICBjYXNlICJzY2h1aGUiICAgICA6IHN1Y2hlPUFUX0JPT1Q7IGJyZWFrOworICAgIGNhc2UgImhhbmRzY2h1aGUiIDogc3VjaGU9QVRfR0xPVkU7IGJyZWFrOworICAgIGNhc2UgImd1ZXJ0ZWwiICAgIDogc3VjaGU9QVRfQkVMVDsgYnJlYWs7CisgICAgY2FzZSAiYW11bGV0dGUiICAgOiBzdWNoZT1BVF9BTVVMRVQ7IGJyZWFrOworICAgIGNhc2UgInJpbmdlIiAgICAgIDogc3VjaGU9QVRfUklORzsgYnJlYWs7CisgICAgY2FzZSAia29lY2hlciIgICAgOiBzdWNoZT1BVF9RVUlWRVI7IGJyZWFrOworICAgIGNhc2UgInNjaGlsZGUiICAgIDogc3VjaGU9QVRfU0hJRUxEOyBicmVhazsKKyAgICBjYXNlICJzb25zdGlnZXMiICA6IHN1Y2hlPUFUX01JU0M7IGJyZWFrOworICAgIGRlZmF1bHQgICAgICAgICAgIDogd3JpdGUoIkZlaGxlcjogVW5ndWVsdGlnZXIgS2xlaWR1bmdzLS9SdWVzdHVuZ3N0eXAuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyJGb2xnZW5kZSBUeXBlbiBnaWJ0IGVzOlxuIituZl9zdHIxK25mX3N0cjIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7IGJyZWFrOworICB9CisgIG9icz1hbGxfaW52ZW50b3J5KCk7CisgIHN1Y2hvYnM9KFtdKTsKKyAgZm9yKGk9MDtpPHNpemVvZihvYnMpO2krKykKKyAgeworICAgIG9ic2hvcnQ9b2JzW2ldLT5RdWVyeVByb3AoUF9TSE9SVCk7CisgICAgaWYob2JzaG9ydD09Ik5pY2h0cyBiZXNvbmRlcmVzIikgLy8ga2VpbmUgUF9TSE9SVCA/CisgICAgICBvYnNob3J0PW9ic1tpXS0+TmFtZShXRVIpOyAgICAgLy8gICBIb2ZmZW4gd2lyIG1hbCBkYXNzIGRhcyBPYmouIG5lbiBOYW1lbiBoYXQuCisgICAgaWYob2JzW2ldLT5RdWVyeVByb3AoUF9BUk1PVVJfVFlQRSk9PXN1Y2hlKSAgICAvLyBHZXN1Y2h0ZXIgQXJtb3VyVHlwZSBnZWZ1bmRlbi4uLgorICAgIHsKKyAgICAgIGlmKHN1Y2hvYnNbb2JzaG9ydF0pICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBfU0hPUlQgZGVzIE9iai4gc2Nob24gaW0gbWFwcGluZz8KKyAgICAgIHsKKyAgICAgICAgaWYoIG9ic1tpXS0+UXVlcnlQcm9wKFBfQU1PVU5UKSApCisgICAgICAgICAgc3VjaG9ic1tvYnNob3J0XSs9b2JzW2ldLT5RdWVyeVByb3AoUF9BTU9VTlQpOyAvLyAgIERhbm4gZGVuIFphZWhsZXIgdW0gQW1vdW50IGhvY2ghCisgICAgICAgIGVsc2UKKyAgICAgICAgICBzdWNob2JzW29ic2hvcnRdKz0xOyAgICAgICAgICAgICAgICAgICAgIC8vICAgRGFubiBkZW4gWmFlaGxlciB1bSAxIGhvY2ghCisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGlmKCBvYnNbaV0tPlF1ZXJ5UHJvcChQX0FNT1VOVCkgKQorICAgICAgICAgIHN1Y2hvYnMrPShbb2JzaG9ydDogb2JzW2ldLT5RdWVyeVByb3AoUF9BTU9VTlQpXSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzdWNob2JzKz0oW29ic2hvcnQ6IDFdKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgc3Rycz1tX2luZGljZXMoc3VjaG9icyk7CisgIGlmKHNpemVvZihzdHJzKSkKKyAgeworICAgIGlmKCFhbGxlcykKKyAgICB7CisgICAgICBzdHJhbGwrPU5hbWUoV0VSLDEpKyIgZW50aGFlbHQgZm9sZ2VuZGUgIitDQVAod2FzKSsiOlxuIjsKKyAgICAgIHN0cmFsbCs9Ii0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIjsKKyAgICB9CisgICAgZWxzZQorICAgICAgc3RyYWxsKz1BTlNJX0JPTEQrIj09PSAiK0NBUCh3YXMpKyI6XG4iK0FOU0lfTk9STUFMOworICAgIGZvcihpPTA7aTxzaXplb2Yoc3Rycyk7aSsrKQorICAgIHsKKyAgICAgIGlmKHN1Y2hvYnNbc3Ryc1tpXV0gPiAxKQorICAgICAgICBzdHJhbGwrPXN0cnNbaV0rIi4gKCIrc3VjaG9ic1tzdHJzW2ldXSsiKVxuIjsKKyAgICAgIGVsc2UKKyAgICAgICAgc3RyYWxsKz1zdHJzW2ldKyIuXG4iOworICAgIH0KKyAgfQorICBlbHNlCisgICAgaWYoIWFsbGVzKQorICAgICAgc3RyYWxsKz1OYW1lKFdFUiwxKSsiIGVudGhhZWx0IGtlaW5lICIrQ0FQKHdhcykrIiFcbiI7CisgIHJldHVybiAxOworfQorCitpbnQgYXVmbGlzdHVuZyhzdHJpbmcgc3RyKQoreworICBzdHJpbmcgKnN0cnMsIG9iX2lkLCB3YXMsIG5mX3N0cjEsbmZfc3RyMjsKKyAgc3RyYWxsPSIiOworICBuZl9zdHIxPSIgICAoSGVsbWUsIFVtaGFlbmdlLCBSdWVzdHVuZ2VuLCBIb3NlbiwgU2NodWhlLCBIYW5kc2NodWhlLFxuIgorICAgICAgICAgKyIgICAgR3VlcnRlbCwgQW11bGV0dGUsIFJpbmdlLCBLb2VjaGVyLCBTY2hpbGRlLCBTb25zdGlnZXMpXG4iOworICBuZl9zdHIyPSJTeW50YXg6IHNsaXN0ZSBbT2JqZWt0LUlkXSBbS2xlaWR1bmdzLS9SdWVzdHVuZ3N0eXB8XCJhbGxlc1wiXVxuIgorICAgICAgICAgKyJCc3AuOiAgIHNsaXN0ZSAiK1F1ZXJ5UHJvcChQX0lEUylbMV0rIiAiKyJoZWxtZVxuIgorICAgICAgICAgKyIgICAgICAgIHNsaXN0ZSAiK1F1ZXJ5UHJvcChQX0lEUylbMV0rIiBhbGxlc1xuIjsKKyAgbm90aWZ5X2ZhaWwoIkZlaGxlcjogT2huZSBQYXJhbWV0ZXIga2xhcHB0IGRhcyBuaWNodC5cbiIrbmZfc3RyMik7CisgIGlmKCFzdHIpIHJldHVybiAwOworICBpZihwcmVzZW50KHN0cik9PVRPKSAgIC8vIFVlYmVycHJ1ZWZlLCBvYiBkaWVzZXMgT2JqZWt0IGdlbWVpbnQgaXN0IQorICB7CisgICAgd3JpdGUoIkZlaGxlcjogRXMgZmVobHQgZWluIEtsZWlkdW5ncy0vUnVlc3R1bmdzdHlwLiBGb2xnZW5kZSBUeXBlbiBnaWJ0IGVzOlxuIgorICAgICAgICAgK25mX3N0cjErbmZfc3RyMik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgc3Rycz1vbGRfZXhwbG9kZShzdHIsICIgIik7CisgIG5vdGlmeV9mYWlsKCJGZWhsZXI6IER1IG11c3N0IGVpbmUgZ3VlbHRpZ2UgT2JqZWt0LUlkIGFuZ2ViZW4hXG4iCisgICAgICAgICAgICAgK25mX3N0cjIpOworICBpZiggc2l6ZW9mKHN0cnMpIDwgMiApIHJldHVybiAwOyAgIC8vIE51ciAxIFBhci4gdW5kIGRlciBpc3QgbmljaHQgZGllIE9iamVrdC1JZAorICBpZiggc2l6ZW9mKHN0cnMpID09IDIgKSAgIC8vIEFuemFobCBQYXIuID0gMgorICB7CisgICAgb2JfaWQ9c3Ryc1swXTsKKyAgICB3YXM9c3Ryc1sxXTsKKyAgICBpZiggSVNUX1pBSEwod2FzKSApICAgICAvLyBPYmpla3QtSWQgei5CLiBtaXQgInNjaHJhbmsgMiIgYW5nZXNwcm9jaGVuPworICAgICAgaWYocHJlc2VudChvYl9pZCsiICIrd2FzKT09VE8pICAgLy8gRmFsbHMgZGllc2VzIE9iamVrdCBnZW1laW50IGlzdCB1bmQga2VpbiAzLiBQYXIhCisgICAgICB7CisgICAgICAgIHdyaXRlKCJGZWhsZXI6IEVzIGZlaGx0IGVpbiBLbGVpZHVuZ3MtL1J1ZXN0dW5nc3R5cC4gRm9sZ2VuZGUgVHlwZW4gZ2lidCBlczpcbiIKKyAgICAgICAgICAgICAgK25mX3N0cjErbmZfc3RyMik7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKKyAgfQorICBlbHNlIGlmKCBzaXplb2Yoc3RycykgPT0gMyApCisgIHsKKyAgICBvYl9pZD1zdHJzWzBdKyIgIitzdHJzWzFdOworICAgIHdhcz1zdHJzWzJdOworICB9CisgIGVsc2UgICAgICAgIC8vIEFuemFobCBlcmZvcmRlcmxpY2hlciBQYXJhbWV0ZXIgdWViZXJzY2hyaXR0ZW4hCisgICAgcmV0dXJuIDA7CisgIGlmKHByZXNlbnQob2JfaWQpIT1UTykgICAvLyBVZWJlcnBydWVmZSwgb2IgYXVjaCBkaWVzZXMgT2JqZWt0IGdlbWVpbnQgaXN0IQorICAgIHJldHVybiAwOworICBpZihRdWVyeVByb3AoUF9DTlRfU1RBVFVTKSE9Q05UX1NUQVRVU19PUEVOKQorICB7CisgICAgd3JpdGUoIkRhenUgbXVlc3N0ZSAiK25hbWUoV0VSLDEpKyIgZ2VvZWZmbmV0IHNlaW4uXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorLy8tLS0gSGllciBpc3QgUGFyYW1ldGVycHJ1ZWZ1bmcgenUgRW5kZS4KKyAgd2FzPUxPV0VSKHdhcyk7CisgIGlmKHdhcyE9ImFsbGVzIikKKyAgICBhdWZsaXN0dW5nMih3YXMsIG5mX3N0cjEsIG5mX3N0cjIsIDApOworICBlbHNlCisgIHsKKyAgICBhdWZsaXN0dW5nMigiaGVsbWUiLCBuZl9zdHIxLCBuZl9zdHIyLCAxKTsKKyAgICBhdWZsaXN0dW5nMigidW1oYWVuZ2UiLCBuZl9zdHIxLCBuZl9zdHIyLCAxKTsKKyAgICBhdWZsaXN0dW5nMigicnVlc3R1bmdlbiIsIG5mX3N0cjEsIG5mX3N0cjIsIDEpOworICAgIGF1Zmxpc3R1bmcyKCJob3NlbiIsIG5mX3N0cjEsIG5mX3N0cjIsIDEpOworICAgIGF1Zmxpc3R1bmcyKCJzY2h1aGUiLCBuZl9zdHIxLCBuZl9zdHIyLCAxKTsKKyAgICBhdWZsaXN0dW5nMigiaGFuZHNjaHVoZSIsIG5mX3N0cjEsIG5mX3N0cjIsIDEpOworICAgIGF1Zmxpc3R1bmcyKCJndWVydGVsIiwgbmZfc3RyMSwgbmZfc3RyMiwgMSk7CisgICAgYXVmbGlzdHVuZzIoImFtdWxldHRlIiwgbmZfc3RyMSwgbmZfc3RyMiwgMSk7CisgICAgYXVmbGlzdHVuZzIoInJpbmdlIiwgbmZfc3RyMSwgbmZfc3RyMiwgMSk7CisgICAgYXVmbGlzdHVuZzIoImtvZWNoZXIiLCBuZl9zdHIxLCBuZl9zdHIyLCAxKTsKKyAgICBhdWZsaXN0dW5nMigic2NoaWxkZSIsIG5mX3N0cjEsIG5mX3N0cjIsIDEpOworICAgIGF1Zmxpc3R1bmcyKCJzb25zdGlnZXMiLCBuZl9zdHIxLCBuZl9zdHIyLCAxKTsKKyAgfQorICBUUC0+TW9yZShzdHJhbGwpOworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvc3dpZnRfc3RkX2NvbnRhaW5lci5jIGIvZC9zZWhlci9oYWV1c2VyL21vZWJlbC9zd2lmdF9zdGRfY29udGFpbmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBmNDk4NgotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvc3dpZnRfc3RkX2NvbnRhaW5lci5jCkBAIC0wLDAgKzEsNjExIEBACisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE5hbWUgZGVzIE9iamVjdHM6ICAgIFN0YW5kYXJkX0NvbnRhaW5lcgorLy8gTGV0enRlIEFlbmRlcnVuZzogICAgMjEuMDMuMjAwMQorLy8gTWFnaWVyOiAgICAgICAgICAgICAgU3dpZnQKKy8vIERpZXNlcyBGaWxlIHdpcmQgYW5zdGVsbGUgdm9uIC9zdGQvY29udGFpbmVyIGluaGVyaXRlZCwgc28gZGFzcyBkZW0gT2JqZWt0CisvLyBlcndlaXRlcnRlIE1vZWdsaWNoa2VpdGVuIHp1ciBWZXJmdWVndW5nIHN0ZWhlbi4KKy8vCisvLyAwNy4xMi4yMDA1IChTZWxldmVuKTogS3VyemJlc2NocmVpYnVuZyBhdXNibGVuZGJhciBnZW1hY2h0CisvLyAzMC4wNi4yMDA3IChaZXNzdHJhKTogY3JlYXRlIGRlciBCUCB3aXJkIG5pY2h0IG1laHIgYWJnZWJyb2NoZW4uIEF1ZiBkaWUKKy8vICAgQXJ0IHdpcmQgZXMgZGVtIE51dHplciBkaWVzZXMgU3RhbmRhcmRvYmpla3QgdWViZXJsYXNzZW4sIG9iIGVyIGRpZSBCUAorLy8gICBpbml0aWFsaXNpZXJlbiB3aWxsIG9kZXIgbmljaHQuCisvLyAwMS4wNy4yMDA3IChaZXNzdHJhKTogVXBkYXRlIGRlciBNb2ViZWwgcnVmdCBlcnN0bWFsIFVwZGF0ZU1lKCkgaW4gZGVuCisvLyAgIE1vZWJlbG4gYXVmLiBXZW5uIGRhcyAhPSAwIGxpZWZlcnQsIGlzdCBVcGRhdGVNZSgpIGZ1ZXIgZGFzIFVwZGF0ZQorLy8gICB6dXN0YWVuZGlnIHVuZCBtdXNzIGRhcyBtYWNoZW4uCisvLyAgIEF1c3NlcmRlbSBrbGVpbmUgQWVuZGVydW5nIGltIFJlZ2lzdHJpZXJlbiAobmltbXQgYXVjaCBPYmVrdGUgYWxzCisvLyAgIFN0YW5kb3J0KQorLy8gICBXZWl0ZXJoaW4gTW9lYmVsIHVtZ2V6b2dlbiBuYWNoIC9wL3NlaGVyL21vZWJlbC8gdW5kIGluIGRpZXNlbSBGaWxlCisvLyAgIEdldE93bmVyKCkgZGVmaW5pZXJ0LCB3ZWxjaGVzICJTd2lmdCIgenVydWVja2dpYnQuIFdlciBoaWVydm9uIGVyYnQsCisvLyAgIHNvbGx0ZSBkYW1pdCBhbHNvIHNlaW4gZWlnZW5lcyBHZXRPd25lcigpIGRlZmluaWVyZW4uCisvLyAgIGdsb2IuIFZhcmlhYmxlbiBhdWYgJ25vc2F2ZScgZ2VhZW5kZXJ0LgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworLy8gRnVlciBUZXN0endlY2tlIGlzdCBlcyBtb2VnbGljaCwgZGVtIGVudHNwcmVjaGVuZGVuIE9iamVrdCBkaWUgUHJvcGVydHkKKy8vICJ0ZXN0IiBhdWYgMSB6dSBzZXR6ZW4sIGRhbWl0IGlzdCBkYW5uIHNvIHppZW1saWNoIGFsbGVzIGVybGF1YnQuCisvLyBNYW4gc29sbHRlIGRpZSBQcm9wZXJ0eSBhYmVyIHVuYmVkaW5ndCB3aWVkZXIgZW50ZmVybmVuLCBzb25zdCBpc3QgZXMgei5CLgorLy8gbW9lZ2xpY2gsIGVpbmVuIFNjaHJhbmsgdm9uIFNlaGVyaGF1cyBBIG5hY2ggU2VoZXJoYXVzIEIgb2RlciBzb2dhciBoaW5hdXMKKy8vIHp1IHZlcnNjaGllYmVuICEhIQorCisjcHJhZ21hIHN0cm9uZ190eXBlcyxzYXZlX3R5cGVzLHJ0dF9jaGVja3MKKworI2luY2x1ZGUgPGNvbnRhaW5lci5oPgoraW5oZXJpdCAiL3N0ZC9jb250YWluZXIiOworCisjaW5jbHVkZSAic2NocmFua2xhZGVuLmgiCisKKyNkZWZpbmUgVkVSU0lPTl9TVEQgIjkiCisKK25vc2F2ZSBpbnQgaGF1c2VybGF1Ym5pczsKK25vc2F2ZSBzdHJpbmcgendlaXRpZWVybGF1Ym5pczsKK25vc2F2ZSBzdHJpbmcgKmVybGF1Ym5pczsKKworaW50IGVybGF1YnQoKTsKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgLy9pZiAoIWNsb25lcChUTykpIHJldHVybjsKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX1NIT1JULCAiRWluIFN0YW5kYXJkX0NvbnRhaW5lciB2b24gU3dpZnQiKTsKKyAgU2V0UHJvcChQX0NOVF9TVEFUVVMsQ05UX1NUQVRVU19DTE9TRUQpOworICBTZXRQcm9wKFBfVFJBTlNQQVJFTlQsIDApOworICBTZXRQcm9wKFBfTE9HX0ZJTEUsInNlbGV2ZW4vc2NocmFlbmtlciIpOyAvLyBTZWxldmVuIDA2LjA0LjIwMDYKKyAgU2V0UHJvcCgiY250X2hhdXNmcmV1bmRlIiwgKHt9KSApOworICBTZXRQcm9wKCJjbnRfZXJsYXVibmlzIiwgKHt9KSApOworICBTZXRQcm9wKCJjbnRfendlaXRpZWVybGF1Ym5pcyIsICIiICk7CisgIFNldFByb3AoImNudF92ZXJzaW9uX3N0ZCIsIFZFUlNJT05fU1REKTsKKworICBoYXVzZXJsYXVibmlzPTA7CisgIHp3ZWl0aWVlcmxhdWJuaXM9IiI7CisgIGVybGF1Ym5pcz0oe30pOworCisgIHNldF9uZXh0X3Jlc2V0KDM2MDApOyAvLyAxIHggcHJvIFN0ZC4gUmVzZXQhCisKKyAgQWRkQ21kKCh7Im9lZmZuZSJ9KSwgIm9lZmZuZW4iKTsKKyAgQWRkQ21kKCh7InNjaGxpZXNzIiwgInNjaGxpZXNzZSJ9KSwgInNjaGxpZXNzZW4iKTsKKyAgQWRkQ21kKCh7InNlcmxhdWJlIn0pLCAiZXJsYXVibmlzIik7CisgIEFkZENtZCgoeyJza29tbWFuZG9zIn0pLCAic2tvbW1hbmRvcyIpOworICBBZGRDbWQoKHsidmVyc2NoaWViIiwgInZlcnNjaGllYmUifSksICJ2ZXJzY2hpZWJlbiIpOworICBBZGRDbWQoKHsiemVydHJ1ZW1tZXIiLCAiemVydHJ1ZW1tZXJlIn0pLCAiemVydHJ1ZW1tZXJuIik7CisgIC8vU2VsZXZlbiAwNy4xMi4yMDA1OgorICBBZGRDbWQoKHsic3ZlcnN0ZWNrZSIsInN2ZXJzdGVjayJ9KSwidmVyc3RlY2tlbiIpOworICBBZGRDbWQoKHsic2hvbGUiLCJzaG9sIn0pLCJ6ZWlnZW4iKTsKK30KKworLy8gWmVzc3RyYSwgMS43LjA3LCBmdWVycyBIb2Vycm9ocgorc3RyaW5nIEdldE93bmVyKCkge3JldHVybiAic3dpZnQiO30KKworc3RhdGljIHN0cmluZyBRdWVyeUhhdXNiZXNpdHplcigpCit7CisgIHJldHVybiBDQVAodG9fc3RyaW5nKEVUTy0+UXVlcnlPd25lcigpKSk7ICAgIC8vIHouQi46IFN3aWZ0Cit9CisKKworCitzdGF0aWMgc3RyaW5nIFF1ZXJ5VFAoKQoreworICByZXR1cm4gQ0FQKGdldGV1aWQoVFApKTsgIC8vIHouQi46IFN3aWZ0Cit9CisKK2ludCBvZWZmbmVuKHN0cmluZyBzdHIpCit7CisgIG5vdGlmeV9mYWlsKCJXYXMgbW9lY2h0ZXN0IER1IG9lZmZuZW4/XG4iKTsKKyAgaWYoIXN0cikgcmV0dXJuIDA7CisgIGlmKHByZXNlbnQoc3RyKSE9VE8pICAvLyBVZWJlcnBydWVmZSwgb2IgYXVjaCBkaWVzZXMgT2JqZWt0IGdlbWVpbnQgaXN0IQorICAgICAgcmV0dXJuIDA7CisgIGlmKFF1ZXJ5UHJvcChQX0NOVF9TVEFUVVMpPT1DTlRfU1RBVFVTX09QRU4pCisgIHsKKyAgICB3cml0ZShOYW1lKFdFUiwxKSsiIGlzdCBkb2NoIHNjaG9uIGdlb2VmZm5ldCFcbiIpOworICAgIHJldHVybiAxOworICB9CisgIGlmKCAhZXJsYXVidCgpICkKKyAgeworICAgIHdyaXRlKCJFaW4gbWFnaXNjaGVzIEtyYWZ0ZmVsZCB2ZXJoaW5kZXJ0IGRhcyBPZWZmbmVuICIrbmFtZShXRVNTRU4sMSkrIiFcbiIpOworICAgIHJldHVybiAxOworICB9CisgIHdyaXRlKCJEdSBvZWZmbmVzdCAiK25hbWUoV0VOKSsiLlxuIik7CisgIHNheShUUC0+TmFtZShXRVIpKyIgb2VmZm5ldCAiK25hbWUoV0VOKSsiLlxuIiwgKHtUUH0pICk7CisgIFNldFByb3AoUF9DTlRfU1RBVFVTLENOVF9TVEFUVVNfT1BFTik7CisgIFNldFByb3AoUF9UUkFOU1BBUkVOVCwgMSk7CisgIHJldHVybiAxOworfQorCitpbnQgc2NobGllc3NlbihzdHJpbmcgc3RyKQoreworICBub3RpZnlfZmFpbCgiV2FzIG1vZWNodGVzdCBEdSBzY2hsaWVzc2VuP1xuIik7CisgIGlmKCFzdHIpIHJldHVybiAwOworICBpZihwcmVzZW50KHN0cikhPVRPKSAgIC8vIFVlYmVycHJ1ZWZlLCBvYiBhdWNoIGRpZXNlcyBPYmpla3QgZ2VtZWludCBpc3QhCisgICAgcmV0dXJuIDA7CisgIGlmKFF1ZXJ5UHJvcChQX0NOVF9TVEFUVVMpPT1DTlRfU1RBVFVTX0NMT1NFRCkKKyAgeworICAgIHdyaXRlKE5hbWUoV0VSLDEpKyIgaXN0IGRvY2ggc2Nob24gZ2VzY2hsb3NzZW4hXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiggIWVybGF1YnQoKSApCisgIHsKKyAgICB3cml0ZSgiRWluIG1hZ2lzY2hlcyBLcmFmdGZlbGQgdmVyaGluZGVydCBkYXMgU2NobGllc3NlbiAiK25hbWUoV0VTU0VOLDEpKyIhXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICB3cml0ZSgiRHUgc2NobGllc3N0ICIrbmFtZShXRU4pKyIuXG4iKTsKKyAgc2F5KFRQLT5OYW1lKFdFUikrIiBzY2hsaWVzc3QgIituYW1lKFdFTikrIi5cbiIsICh7VFB9KSApOworICBTZXRQcm9wKFBfQ05UX1NUQVRVUyxDTlRfU1RBVFVTX0NMT1NFRCk7CisgIFNldFByb3AoUF9UUkFOU1BBUkVOVCwgMCk7CisgIHJldHVybiAxOworfQorCitzdHJpbmcgY250X3N0YXR1cygpCit7CisgIHJldHVybiBOYW1lKFdFUiwxKSsiIGlzdCAiCisgICAgKyhRdWVyeVByb3AoUF9DTlRfU1RBVFVTKT8iZ2VzY2hsb3NzZW4iOiJnZW9lZmZuZXQiKSsiLlxuIjsKK30KKworaW50IGVybGF1YnQoKQoreworICBpZiggUXVlcnlQcm9wKCJ0ZXN0IikgKSByZXR1cm4gMTsgICAgICAgLy8gWnUgVGVzdHp3ZWNrZW4hCisgIGlmKCBRdWVyeUhhdXNiZXNpdHplcigpPT0iMCIgKSAgICAgICAgICAvLyBTY2hyYW5rIHN0ZWh0IG5pY2h0IGluIGVpbmVtIFNlaGVyaGF1cyEKKyAgeworICAgIHRlbGxfcm9vbShFVE8sIE5hbWUoV0VSLDEpKyIgc29sbHRlIG5pY2h0IGF1c3NlcmhhbGIgZWluZXMgU2VoZXJoYXVzZXMgc3RlaGVuLlxuIgorICAgICAgKyJCaXR0ZSBNYWlsIGFuICIrVkVSQU5UV09SVExJQ0hFUl9NQUdJRVIrIiFcbiIpOworICAgIHJldHVybiAwOworICB9CisgIGlmKCBRdWVyeVRQKCkgPT0gUXVlcnlIYXVzYmVzaXR6ZXIoKSApICAvLyBEZXIgQmVzaXR6ZXIgZGVzIEhhdXNlcyBzZWxic3QKKyAgICByZXR1cm4gMTsKKyAgaWYoaGF1c2VybGF1Ym5pcykKKyAgeworICAgIGlmKCBtZW1iZXIoU0hWRVJXQUxURVItPkhhdXNQcm9wKExPV0VSKFF1ZXJ5SGF1c2Jlc2l0emVyKCkpLCAyKSwKKyAgICAgICAgUXVlcnlUUCgpKSAhPSAtMSApICAgICAgICAgICAgICAgIC8vIEhhdXNmcmV1bmRlCisgICAgICByZXR1cm4gMTsKKyAgfQorICBpZih6d2VpdGllZXJsYXVibmlzIT0iIikgICAgICAgICAgICAgICAgLy8gWndlaXRpZXMKKyAgeworICAgIGlmKCBUUC0+UXVlcnlQcm9wKFBfU0VDT05EKSA9PSB6d2VpdGllZXJsYXVibmlzICkKKyAgICAgIHJldHVybiAxOworICB9CisgIGlmKCBzaXplb2YoZXJsYXVibmlzKSApCisgIHsKKyAgICBpZiggbWVtYmVyKGVybGF1Ym5pcywgUXVlcnlUUCgpKSAhPSAtMSApIC8vIFNvbnN0aWdlIFBlcnNvbmVuIGRpZSBiZXJlY2h0aWd0IHNpbmQKKyAgICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQorCit2b2lkIGNudF9vcGVuKCkKK3sKKyAgU2V0UHJvcChQX0NOVF9TVEFUVVMsQ05UX1NUQVRVU19PUEVOKTsKKyAgU2V0UHJvcChQX1RSQU5TUEFSRU5ULCAxKTsKK30KKworaW50IGVybGF1Ym5pc19saXN0ZSgpCit7CisgIGludCBpOworICBzdHJpbmcgKnN0cnMsc3RyOworICBpZiggUXVlcnlIYXVzYmVzaXR6ZXIoKSAhPSBRdWVyeVRQKCkgJiYgIVF1ZXJ5UHJvcCgidGVzdCIpICkKKyAgeworICAgIHdyaXRlKCBCUygiTnVyICIrUXVlcnlIYXVzYmVzaXR6ZXIoKSsiIGRhcmYgQmVyZWNodGlndW5nZW4gIgorICAgICAgK25hbWUoV0VTU0VOLDEpKyIgYWJmcmFnZW4hIikpOworICAgIHJldHVybiAxOworICB9CisgIHdyaXRlKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisgIGlmKGhhdXNlcmxhdWJuaXMpCisgIHsKKyAgICBzdHJzPVNIVkVSV0FMVEVSLT5IYXVzUHJvcChMT1dFUihRdWVyeUhhdXNiZXNpdHplcigpKSwgMik7CisgICAgd3JpdGUoQlMoIkZvbGdlbmRlIEZyZXVuZGUgRGVpbmVzIEhhdXNlcyBkdWVyZmVuICIrbmFtZShXRU4sMSkKKyAgICAgICsiIG9lZmZuZW4vc2NobGllc3NlbjoiKSk7CisgICAgc3RyPSIiOworICAgIGlmKHNpemVvZihzdHJzKSkKKyAgICB7CisgICAgICBmb3IoaT0wO2k8c2l6ZW9mKHN0cnMpO2krKykKKyAgICAgIHsKKyAgICAgICAgc3RyKz1zdHJzW2ldOworICAgICAgICBpZihpPHNpemVvZihzdHJzKS0xKQorICAgICAgICAgIHN0cis9IiwgIjsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgc3RyPSJEdSBoYXN0IGtlaW5lciBQZXJzb24gWnVncmlmZiBhdWYgRGVpbiBIYXVzIGdld2FlaHJ0Li4uXG4iOworICAgIHdyaXRlKEJTKHN0cikpOworICB9CisgIGVsc2UKKyAgICB3cml0ZShCUygiRGllIEZyZXVuZGUgRGVpbmVzIEhhdXNlcyBkdWVyZmVuICIrbmFtZShXRU4sMSkKKyAgICAgICsiIG5pY2h0IG9lZmZuZW4vc2NobGllc3Nlbi4iKSk7CisgIHdyaXRlKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisgIGlmKHp3ZWl0aWVlcmxhdWJuaXMhPSIiKQorICB7CisgIGlmKCB6d2VpdGllZXJsYXVibmlzPT1nZXRldWlkKFRQKSApCisgICAgd3JpdGUoQlMoICJBbGxlIERlaW5lIFp3ZWl0aWVzIGR1ZXJmZW4gIituYW1lKFdFTiwxKSsiIG9lZmZuZW4vc2NobGllc3Nlbi4iKSk7CisgIGVsc2UKKyAgICB3cml0ZShCUyggIkFsbGUgWndlaXRpZXMgdm9uICIrQ0FQKHp3ZWl0aWVlcmxhdWJuaXMpKyIgZHVlcmZlbiAiK25hbWUoV0VOLDEpCisgICAgICArIiBvZWZmbmVuL3NjaGxpZXNzZW4uIikpOworICB3cml0ZSgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworICB9CisgIHN0cnM9UXVlcnlQcm9wKCJjbnRfZXJsYXVibmlzIik7CisgIGlmKHNpemVvZihzdHJzKSkKKyAgeworICAgIHdyaXRlKEJTKCJGb2xnZW5kZSBzb25zdGlnZSBQZXJzb25lbiBkdWVyZmVuICIrbmFtZShXRU4sMSkKKyAgICAgICsiIG9lZmZuZW4vc2NobGllc3NlbjoiKSk7CisgICAgc3RyPSIiOworICAgIGZvcihpPTA7aTxzaXplb2Yoc3Rycyk7aSsrKQorICAgIHsKKyAgICAgIHN0cis9c3Ryc1tpXTsKKyAgICAgIGlmKGk8c2l6ZW9mKHN0cnMpLTEpCisgICAgICAgIHN0cis9IiwgIjsKKyAgICB9CisgICAgd3JpdGUoQlMoc3RyKSk7CisgIH0KKyAgZWxzZQorICAgIHdyaXRlKEJTKCJFcyBnaWJ0IGtlaW5lIHNvbnN0aWdlbiBQZXJzb25lbiwgZGllICIrbmFtZShXRU4sMSkKKyAgICAgICsiIG9lZmZuZW4vc2NobGllc3NlbiBkdWVyZmVuLiIpKTsKKyAgd3JpdGUoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBlcmxhdWJuaXMoc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nICpzdHJzLHdlbixuZl9zdHI7CisgIG5mX3N0cj0iU3ludGF4OiBzZXJsYXViZSBbT2JqZWt0LUlkXSBbU3BpZWxlcm5hbWV8XCJoYXVzZnJldW5kZVwifFwiendlaXRpZXNcIl1cbiIKKyAgICAgICAgKyJCc3AuOiAgIHNlcmxhdWJlICIrUXVlcnlQcm9wKFBfSURTKVsxXSsiIGhhdXNmcmV1bmRlXG4iCisgICAgICAgICsiICAgICAgICBzZXJsYXViZSAiK1F1ZXJ5UHJvcChQX0lEUylbMV0rIiB6d2VpdGllc1xuIgorICAgICAgICArIiAgICAgICAgc2VybGF1YmUgIitRdWVyeVByb3AoUF9JRFMpWzFdKyIgZ2VvcmRpXG4iCisgICAgICAgICsiICAgICAgICBzZXJsYXViZSAiK1F1ZXJ5UHJvcChQX0lEUylbMV0rIiAgICAgIChMaXN0ZXQgU3BpZWxlciBtaXQgRXJsYXVibmlzKVxuIjsKKyAgbm90aWZ5X2ZhaWwoIkZlaGxlcjogT2huZSBQYXJhbWV0ZXIga2xhcHB0IGRhcyBuaWNodC5cbiIrbmZfc3RyKTsKKyAgaWYoIXN0cikgcmV0dXJuIDA7CisgIGlmKHByZXNlbnQoc3RyKT09VE8pICAgICAvLyBGYWxscyBQYXI9PU9iai4gdW5kIGtlaW4gMi4vMy4gUGFyLgorICB7CisgICAgZXJsYXVibmlzX2xpc3RlKCk7ICAgICAgICAgICAvLyAgIExpc3RlIGRlciBFcmxhdWJ0ZW4gYXVzZ2ViZW4hCisgICAgcmV0dXJuIDE7CisgIH0KKyAgbm90aWZ5X2ZhaWwoIkZlaGxlcjogRHUgbXVzc3QgZWluZSBndWVsdGlnZSBPYmpla3QtSWQgYW5nZWJlbiFcbiIrbmZfc3RyKTsKKyAgc3Rycz1vbGRfZXhwbG9kZShzdHIsICIgIik7CisgIGlmKCBzaXplb2Yoc3RycykgPCAyICkgICAgICAgICAgIC8vIEZhbGxzIG51ciAxIFBhci4KKyAgICByZXR1cm4gMDsgICAgICAgICAgICAgLy8gQW56YWhsIGVyZm9yZGVybGljaGVyIFBhcmFtZXRlciB1bnRlcnNjaHJpdHRlbiEKKyAgZWxzZSBpZiggc2l6ZW9mKHN0cnMpID09IDIgKQorICB7CisgICAgc3RyPXN0cnNbMF07CisgICAgd2VuPXN0cnNbMV07CisgICAgaWYoIElTVF9aQUhMKHdlbikgKQorICAgICAgaWYocHJlc2VudChzdHIrIiAiK3dlbik9PVRPKSAgIC8vIEZhbGxzIDIgUGFyLiB1bmQgZGllcyBkYXMgT2JqLiBpc3Qgb2huZSAzLiBQYXIuCisgICAgICB7CisgICAgICAgIGVybGF1Ym5pc19saXN0ZSgpOyAgICAgICAgICAgLy8gICBMaXN0ZSBkZXIgRXJsYXVidGVuIGF1c2dlYmVuIQorICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7CisgIH0KKyAgZWxzZSBpZiggc2l6ZW9mKHN0cnMpID09IDMgKQorICB7CisgICAgc3RyPXN0cnNbMF0rIiAiK3N0cnNbMV07CisgICAgd2VuPXN0cnNbMl07CisgIH0KKyAgZWxzZSAgICAgICAgLy8gQW56YWhsIGVyZm9yZGVybGljaGVyIFBhcmFtZXRlciB1ZWJlcnNjaHJpdHRlbiEKKyAgICByZXR1cm4gMDsKKyAgaWYocHJlc2VudChzdHIpIT1UTykgICAvLyBVZWJlcnBydWVmZSwgb2IgYXVjaCBkaWVzZXMgT2JqZWt0IGdlbWVpbnQgaXN0IQorICAgIHJldHVybiAwOworICBpZiggIWVybGF1YnQoKSAmJiAhUXVlcnlQcm9wKCJ0ZXN0IikgKQorICB7CisgICAgd3JpdGUoIEJTKCJOdXIgIitRdWVyeUhhdXNiZXNpdHplcigpKyIgZGFyZiBCZXJlY2h0aWd1bmdlbiAiCisgICAgICArbmFtZShXRVNTRU4sMSkrIiBhZW5kZXJuISIpKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZih3ZW49PSJoYXVzZnJldW5kZSIpCisgIHsKKyAgICBpZihoYXVzZXJsYXVibmlzKQorICAgIHsKKyAgICAgIGhhdXNlcmxhdWJuaXM9MDsKKyAgICAgIFNldFByb3AoImNudF9oYXVzZnJldW5kZSIsICh7fSkgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhhdXNlcmxhdWJuaXM9MTsKKyAgICAgIFNldFByb3AoImNudF9oYXVzZnJldW5kZSIsIFNIVkVSV0FMVEVSLT5IYXVzUHJvcChMT1dFUihRdWVyeUhhdXNiZXNpdHplcigpKSwgMikgKTsKKyAgICB9CisgICAgd3JpdGUoIEJTKCJEaWUgRnJldW5kZSBEZWluZXMgU2VoZXJoYXVzZXMgZHVlcmZlbiAiK25hbWUoV0VOLDEpKyIgamV0enQgIgorICAgICAgKyghaGF1c2VybGF1Ym5pcz8ibmljaHQgbWVociAiOiIiKSsib2VmZm5lbi9zY2hsaWVzc2VuLiIpKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZih3ZW49PSJ6d2VpdGllcyIpCisgIHsKKyAgICBpZih6d2VpdGllZXJsYXVibmlzIT0iIikgICAgICAgICAgICAgICAgICAgICAgICAvLyBad2VpdGllcyBlcmxhdWJ0PworICAgICAgendlaXRpZWVybGF1Ym5pcz0iIjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgZGFubiB2ZXJiaWV0ZW4hCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5zb25zdGVuOgorICAgIHsKKyAgICAgIGlmKCBUUC0+UXVlcnlQcm9wKFBfU0VDT05EKSApICAgICAgICAgICAgICAgICAvLyBTZWxic3QgZWluIFp3ZWl0aWU/CisgICAgICAgIHp3ZWl0aWVlcmxhdWJuaXM9TE9XRVIoVFAtPlF1ZXJ5UHJvcChQX1NFQ09ORCkpOyAvLyBEaWUgWndlaXRpZXMgdm9tIEVyc3RpZSBlcmxhdWJlbiEKKyAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzb25zdDoKKyAgICAgICAgendlaXRpZWVybGF1Ym5pcz1nZXRldWlkKFRQKTsgICAgICAgICAgICAgICAvLyAgIEVpZ2VuZSBFcnN0aWVzIGVybGF1YmVuIQorICAgIH0KKyAgICBTZXRQcm9wKCJjbnRfendlaXRpZWVybGF1Ym5pcyIsIHp3ZWl0aWVlcmxhdWJuaXMgKTsKKyAgICBpZih6d2VpdGllZXJsYXVibmlzIT0iIikKKyAgICAgIHdyaXRlKCBCUyhDQVAoendlaXRpZWVybGF1Ym5pcykrIidzIFp3ZWl0aWVzIGR1ZXJmZW4gIituYW1lKFdFTiwxKSsiIGpldHp0ICIKKyAgICAgICAgKyh6d2VpdGllZXJsYXVibmlzPT0iIj8ibmljaHQgbWVociAiOiIiKSsib2VmZm5lbi9zY2hsaWVzc2VuLiIpKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICB3ZW49Q0FQKHdlbik7CisgIGlmKCBmaWxlX3NpemUoIi8vc2F2ZS8vIitMT1dFUih3ZW5bMC4uMF0pKyIvLyIrTE9XRVIod2VuKSsiLm8iKSAhPSAtMSApIC8vIFNwaWVsZXIgZ2lidCBlcyBhdWNoIQorICB7CisgICAgaWYoIG1lbWJlcihlcmxhdWJuaXMsIHdlbikgIT0gLTEgKSAgLy8gU3BpZWxlciBoYXQgRXJsYXVibmlzIC0+IHZlcmJpZXRlbiEKKyAgICB7CisgICAgICBlcmxhdWJuaXMtPSh7d2VufSk7CisgICAgICB3cml0ZSggQlMoIHdlbisiIGRhcmYgIituYW1lKFdFTiwxKSsiIGpldHp0IG5pY2h0IG1laHIgb2VmZm5lbi9zY2hsaWVzc2VuLiIpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGVybGF1Ym5pcys9KHt3ZW59KTsKKyAgICAgIHdyaXRlKCBCUyggd2VuKyIgZGFyZiAiK25hbWUoV0VOLDEpKyIgamV0enQgb2VmZm5lbi9zY2hsaWVzc2VuLiIpKTsKKyAgICB9CisgICAgU2V0UHJvcCgiY250X2VybGF1Ym5pcyIsIGVybGF1Ym5pcyk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgZWxzZQorICAgIHdyaXRlKCJFcyBnaWJ0IGtlaW5lbiBTcGllbGVyIG5hbWVucyAiK3dlbisiIVxuIik7CisgIHJldHVybiAxOworfQorCit2YXJhcmdzIGludCBza29tbWFuZG9zKHN0cmluZyBzdHIpCit7CisgIG5vdGlmeV9mYWlsKCAiRmVobGVyOiBEaWVzZXIgQmVmZWhsIGJlbm9ldGlndCBlaW5lIGd1ZWx0aWdlIE9iamVrdC1JZCBhbHMgUGFyYW1ldGVyLlxuIgorICAgICsiQmVpc3BpZWw6IHNrb21tYW5kb3MgIitRdWVyeVByb3AoUF9JRFMpWzFdKyJcbiIpOworICBpZighc3RyKSByZXR1cm4gMDsKKyAgaWYocHJlc2VudChzdHIpIT1UTyApIC8vIEJpbiBpY2ggZ2VtZWludD8KKyAgICByZXR1cm4gMDsKKyAgd3JpdGUoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKyAgd3JpdGUoIkFrdHVlbGxlIFZlcnNpb246ICIrUXVlcnlQcm9wKCJjbnRfdmVyc2lvbl9zdGQiKStRdWVyeVByb3AoImNudF92ZXJzaW9uX29iaiIpKyJcbiIpOworICB3cml0ZSggQlMoTmFtZShXRVIsMSkrIiBrYW5uIG51ciBpbiBkaWVzZW0gU2VoZXJoYXVzIHZlcndlbmRldCB3ZXJkZW4sICIKKyAgICArImRhICIrUXVlcnlQcm9ub3VuKFdFUikrIiBzcGV6aWVsbCBkYWZ1ZXIgZ2VrYXVmdCB3dXJkZS4gIitDQVAoUXVlcnlQcm9ub3VuKFdFUikpCisgICAgKyIgdmVyZnVlZ3QgdWViZXIgZm9sZ2VuZGUgS29tbWFuZG9zOiIpCisgICAgKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgorICAgICsib2VmZm5lIFtPYmpla3QtSWRdXG4iCisgICAgKyIgIG9lZmZuZXQgIituYW1lKFdFTiwxKSsiXG5cbiIKKyAgICArInNjaGxpZXNzZSBbT2JqZWt0LUlkXVxuIgorICAgICsiICBzY2hsaWVzc3QgIituYW1lKFdFTiwxKSsiXG5cbiIKKyAgICArInNlcmxhdWJlIFtPYmpla3QtSWRdIFtTcGllbGVybmFtZXxcImhhdXNmcmV1bmRlXCJ8XCJ6d2VpdGllc1wiXVxuIgorICAgICsiICBFcmxhdWJ0IFBlcnNvbmVuLCAiK25hbWUoV0VOLDEpKyIgbWl0enViZW51dHplbi5cbiIKKyAgICArIiAgc2VybGF1YmUgKyBPYmpla3QtSWQgKG9obmUgU3BpZWxlcm5hbWUvaGF1c2ZyZXVuZGUpXG4iCisgICAgKyIgIGxpc3RldCBhbGxlIFBlcnNvbmVuIG1pdCBadWdyaWZmIGF1ZiAiK25hbWUoV0VOLDEpKyJcblxuIgorICAgICsidmVyc2NoaWViZSBbT2JqZWt0LUlkXSBuYWNoIFtBdXNnYW5nXVxuIgorICAgICsiICBEYW1pdCBrYW5uc3QgRHUgIituYW1lKFdFTiwxKSsiIGlubmVyaGFsYiBEZWluZXMgU2VoZXJoYXVzZXMgdmVyc2NoaWViZW4uXG5cbiIKKyAgLy9TZWxldmVuIDA3LjEyLjIwMDUKKyAgICArInN2ZXJzdGVja2UgW09iamVrdC1JZF1cbiIKKyAgICArIiAgRGFtaXQgbWFjaHN0IER1ICIrbmFtZShXRU4sMSkrIiB1bnNpY2h0YmFyLlxuIgorICAgICsic2hvbGUgW09iamVrdC1JZF0gaGVydm9yXG4iCisgICAgKyIgIERhbWl0IG1hY2hzdCBEdSAiK25hbWUoV0VOLDEpKyIgd2llZGVyIHNpY2h0YmFyLlxuIgorICAvLyBCaXMgaGllcgorICAgICsiemVydHJ1ZW1tZXIgW09iamVrdC1JZF1cbiIKKyAgICArIiAgRGFtaXQgemVyc3RvZXJzdCBEdSAiK25hbWUoV0VOLDEpKyIuXG5cbiIpOworCisKKyAgaWYoIFF1ZXJ5UHJvcCgib2JqX2NtZCIpICkKKyAgICB3cml0ZSggUXVlcnlQcm9wKCJvYmpfY21kIikrIlxuIiApOworCisgIHdyaXRlKCJbT2JqZWt0LUlkXSBtdXNzIGVpbmUgZ3VlbHRpZ2UgSWQgc2VpbiwgaW4gZGllc2VtIEZhbGwgei5CLiAiCisgICAgICArUXVlcnlQcm9wKFBfSURTKVsxXSsiXG4iKTsKKyAgd3JpdGUoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKworCisgIHJldHVybiAxOworfQorCitpbnQgdmVyc2NoaWViZW4oc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIHdhcywgd29oaW4sIHppZWxyYXVtLG5mX3N0cjsKKyAgbmZfc3RyPSJTeW50YXg6IHZlcnNjaGllYmUgW09iamVrdC1JZF0gbmFjaCBbUmljaHR1bmddXG4iCisgICAgICAgICsiQnNwLjogICB2ZXJzY2hpZWJlICIrUXVlcnlQcm9wKFBfSURTKVsxXSsiIG5hY2ggb3N0ZW5cbiI7CisgIG5vdGlmeV9mYWlsKCJGZWhsZXI6IE9obmUgUGFyYW1ldGVyIGtsYXBwdCBkYXMgbmljaHQuXG4iK25mX3N0cik7CisgIGlmKCFzdHIpIHJldHVybiAwOworICBpZihzc2NhbmYoc3RyLCIlcyBuYWNoICVzIiwgd2FzLCB3b2hpbikgIT0gMikKKyAgICByZXR1cm4gMDsKKyAgbm90aWZ5X2ZhaWwoIkZlaGxlcjogRHUgbXVzc3QgZWluZSBndWVsdGlnZSBPYmpla3QtSWQgYW5nZWJlbiFcbiIrbmZfc3RyKTsKKyAgaWYocHJlc2VudCh3YXMpIT1UTykgICAvLyBVZWJlcnBydWVmZSwgb2IgYXVjaCBkaWVzZXMgT2JqZWt0IGdlbWVpbnQgaXN0IQorICAgIHJldHVybiAwOworICBpZiggUXVlcnlIYXVzYmVzaXR6ZXIoKSAhPSBRdWVyeVRQKCkgJiYgIVF1ZXJ5UHJvcCgidGVzdCIpICkKKyAgeworICAgIHdyaXRlKCBCUygiTnVyICIrUXVlcnlIYXVzYmVzaXR6ZXIoKSsiIGRhcmYgIituYW1lKFdFTiwxKSsiIHZlcnNjaGllYmVuISIpKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiggbWVtYmVyKG1faW5kaWNlcyhFVE8tPlF1ZXJ5UHJvcChQX0VYSVRTKSksIHdvaGluKSAhPSAtMSApIC8vIEF1c2dhbmcgdm9yaGFuZGVuPworICB7CisgICAgemllbHJhdW09RVRPLT5RdWVyeVByb3AoUF9FWElUUylbd29oaW5dOworICAgIGlmKCBzdHJzdHIoemllbHJhdW0sIExPV0VSKFF1ZXJ5SGF1c2Jlc2l0emVyKCkpKyJyYXVtIiwgMCkgIT0gLTEgIHx8CisgICAgICAgIFF1ZXJ5UHJvcCgidGVzdCIpICkgIC8vIEdsZWljaGVzIFNlaGVyaGF1cz8gT2RlciBUZXN0PworICAgIHsKKyAgICAgIFRPLT5tb3ZlKHppZWxyYXVtLCBNX1BVVCk7CisgICAgICB3cml0ZSgiRHUgdmVyc2NoaWVic3QgIituYW1lKFdFTiwxKSsiIG5hY2ggIitDQVAod29oaW4pKyIuXG4iKTsKKyAgICAgIFRQLT5tb3ZlKHppZWxyYXVtLCBNX0dPLCAibmFjaCAiK0NBUCh3b2hpbiksICJzY2hpZWJ0ICIrbmFtZShXRU4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNjaGllYnQgIituYW1lKFdFTikrIiBoZXJlaW4iKTsKKyAgICAgIGlmKCBwcmVzZW50KCJJbnRlcmFjdGl2ZSIsIFNDSFJBTktNQVNURVIpICkKKyAgICAgICAgdGVsbF9yb29tKFNDSFJBTktNQVNURVIsIFRQLT5OYW1lKFdFUikrIiB2ZXJzY2hpZWJ0ICIrbmFtZShXRU4pKyIgbmFjaCAiCisgICAgICAgICAgK3RvX3N0cmluZyhFVE8pKyIuXG4iKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgd3JpdGUoIEJTKCJEdSBrYW5uc3QgIituYW1lKFdFTiwxKSsiIG5pY2h0IGluIGVpbmVuIFJhdW0gYXVzc2VyaGFsYiAiCisgICAgICAgICsiRGVpbmVzIEhhdXNlcyBzY2hpZWJlbiEiKSk7CisgIH0KKyAgZWxzZQorICAgIHdyaXRlKCBCUygiRXMgZ2lidCBrZWluZW4gQXVzZ2FuZyBuYW1lbnMgXCIiK3dvaGluKyJcIiwgd29oaW4gRHUgIgorICAgICAgK25hbWUoV0VOLDEpKyIgdmVyc2NoaWViZW4ga29lbm50ZXN0LiIsNzgsIkZlaGxlcjogIiwgQlNfSU5ERU5UX09OQ0UpKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCB6ZXJ0cnVlbW1lcm4oc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIG5mX3N0cjsKKyAgbmZfc3RyPSJTeW50YXg6IHplcnRydWVtbWVyIFtPYmpla3QtSWRdXG4iCisgICAgICAgICsiQnNwLjogICB6ZXJ0cnVlbW1lciAiK1F1ZXJ5UHJvcChQX0lEUylbMV0rIlxuIjsKKyAgbm90aWZ5X2ZhaWwoIkZlaGxlcjogT2huZSBQYXJhbWV0ZXIga2xhcHB0IGRhcyBuaWNodC5cbiIrbmZfc3RyKTsKKyAgaWYoIXN0cikgcmV0dXJuIDA7CisgIG5vdGlmeV9mYWlsKCJGZWhsZXI6IER1IG11c3N0IGVpbmUgZ3VlbHRpZ2UgT2JqZWt0LUlkIGFuZ2ViZW4hXG4iK25mX3N0cik7CisgIGlmKHByZXNlbnQoc3RyKSE9VE8pICAgLy8gVWViZXJwcnVlZmUsIG9iIGF1Y2ggZGllc2VzIE9iamVrdCBnZW1laW50IGlzdCEKKyAgICByZXR1cm4gMDsKKyAgaWYoIFF1ZXJ5SGF1c2Jlc2l0emVyKCkgIT0gUXVlcnlUUCgpICYmICFRdWVyeVByb3AoInRlc3QiKSApCisgIHsKKyAgICB3cml0ZSggQlMoIk51ciAiK1F1ZXJ5SGF1c2Jlc2l0emVyKCkrIiBkYXJmICIrbmFtZShXRU4sMSkrIiB6ZXJ0cnVlbW1lcm4hIikpOworICAgIHJldHVybiAxOworICB9CisgIHdyaXRlKCBCUygiRHUgemVydHJ1ZW1tZXJzdCAiK25hbWUoV0VOKSsiIG1pdCB3dWNodGlnZW4gU2NobGFlZ2VuLCBiaXMgIgorICAgICsibmljaHQgbWFsIG1laHIgS3J1ZW1lbCB2b24gIitRdWVyeVByb25vdW4oV0VNKSsiIHVlYnJpZyBzaW5kLiIpKTsKKyAgdGVsbF9yb29tKEVUTywgQlMoIFRQLT5OYW1lKFdFUikrIiB6ZXJ0cnVlbW1lcnQgIituYW1lKFdFTikrIi4iKSwgKHtUUH0pICk7CisgIGNhbGxfb3RoZXIoU0NIUkFOS01BU1RFUiwiPz8/IiwwKTsKKyAgaWYoIHByZXNlbnQoIkludGVyYWN0aXZlIiwgU0NIUkFOS01BU1RFUikgKQorICAgIHRlbGxfcm9vbShTQ0hSQU5LTUFTVEVSLCBUUC0+TmFtZShXRVIpKyIgemVydHJ1ZW1tZXJ0ICIrbmFtZShXRU4pKyIuXG4iKTsKKyAgU0NIUkFOS01BU1RFUi0+UmVtb3ZlQ250KFRPLCBnZXRldWlkKFRQKSApOworICByZW1vdmUoMSk7CisgIGlmKFRPKSBkZXN0cnVjdChUTyk7CisgIHJldHVybiAxOworfQorCitpbnQgcHJvcHMydmFycygpICAvLyBGdWVyIGRpZSBVcGRhdGUtRnVua3Rpb24gZGVzIFNjaHJhbmttYXN0ZXJzCit7CisgIHp3ZWl0aWVlcmxhdWJuaXM9UXVlcnlQcm9wKCJjbnRfendlaXRpZWVybGF1Ym5pcyIpfHwiIjsKKyAgZXJsYXVibmlzPVF1ZXJ5UHJvcCgiY250X2VybGF1Ym5pcyIpfHwoe30pOworICBpZiggc2l6ZW9mKFF1ZXJ5UHJvcCgiY250X2hhdXNmcmV1bmRlIikpICkKKyAgICBoYXVzZXJsYXVibmlzPTE7CisgIGVsc2UKKyAgICBoYXVzZXJsYXVibmlzPTA7CisgIGlmKCBRdWVyeVByb3AoUF9DTlRfU1RBVFVTKSA9PSBDTlRfU1RBVFVTX09QRU4pCisgICAgU2V0UHJvcChQX1RSQU5TUEFSRU5ULCAxKTsKKyAgZWxzZQorICAgIFNldFByb3AoUF9UUkFOU1BBUkVOVCwgMCk7CisgIHJldHVybiAxOworfQorCit2b2lkIHJlc2V0KCkKK3sKKyAgc2V0X25leHRfcmVzZXQoMzYwMCk7IC8vIDEgeCBwcm8gU3RkLiBSZXNldCEKKyAgOjpyZXNldCgpOworfQorCitwdWJsaWMgdmFyYXJncyBpbnQgcmVtb3ZlKGludCBzaWxlbnQpCit7CisgIC8vIEJlaW0gU2NocmFua21hc3RlciBhYm1lbGRlbiwgZGFubiB6ZXJzdG9lcmVuLgorICBzdHJpbmcgdWlkPSIiOworICBpZiAob2JqZWN0cChlbnZpcm9ubWVudCgpKSkKKyAgeworICAgIHVpZD1lbnZpcm9ubWVudCgpLT5RdWVyeU93bmVyKCk7ICAgICAgICAgICAgICAgIAorICB9CisgIFNDSFJBTktNQVNURVItPlJlbW92ZUNudChUTywgdWlkICk7CisgIHJldHVybiA6OnJlbW92ZShzaWxlbnQpOworfQorCitwdWJsaWMgaW50IFVwZGF0ZU1lKCkKK3sKKyAgaWYgKCFvYmplY3RwKGVudmlyb25tZW50KCkpKQorICAgIHJldHVybiAwOworICBvYmplY3QgY250X25ldT1jbG9uZV9vYmplY3QobG9hZF9uYW1lKE1FKSk7ICAvLyBOZXVlbiBTY2hyYW5rIGNsb25lbgorICBjbnRfbmV1LT5tb3ZlKCBlbnZpcm9ubWVudCgpLCBNX05PQ0hFQ0sgKTsgIC8vIEluIHNlbGJlbiBSYXVtIHdpZSBhbHRlbiBzY2hpZWJlbi4uLgorICBjbnRfbmV1LT5TZXRQcm9wKCJjbnRfc3RhdHVzIiwgUXVlcnlQcm9wKCJjbnRfc3RhdHVzIikgKTsKKyAgY250X25ldS0+U2V0UHJvcCgiY250X2hhdXNmcmV1bmRlIiwgUXVlcnlQcm9wKCJjbnRfaGF1c2ZyZXVuZGUiKSApOworICBjbnRfbmV1LT5TZXRQcm9wKCJjbnRfZXJsYXVibmlzIiwgUXVlcnlQcm9wKCJjbnRfZXJsYXVibmlzIikgKTsKKyAgY250X25ldS0+U2V0UHJvcCgiY250X3p3ZWl0aWVlcmxhdWJuaXMiLCBRdWVyeVByb3AoImNudF96d2VpdGllZXJsYXVibmlzIikgKTsKKyAgY250X25ldS0+cHJvcHMydmFycygpOyAgLy8gU2NocmFuayBsaWVzdCBnZXNldHp0ZSBQcm9wcyBhdXMgaW4gZWlnZW5lIFZhcnMKKyAgLy8gSW52ZW50YXIgYmV3ZWdlbgorICBmb3JlYWNoKG9iamVjdCBpbnY6IGFsbF9pbnZlbnRvcnkodGhpc19vYmplY3QoKSkpCisgIHsKKyAgICBpZiggaW52LT5Jc1VuaXQoKSApICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVbml0cworICAgICAgaW52LT5tb3ZlKGNudF9uZXUsIE1fTk9DSEVDS3xNX01PVkVfQUxMKTsKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3JtYWxlIE9iamVrdGUKKyAgICAgIGludi0+bW92ZShjbnRfbmV1LCBNX05PQ0hFQ0spOworICB9CisgIHJlbW92ZSgxKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIEVpbmdlYmF1dCAwNy4xMi4yMDA1IHZvbiBTZWxldmVuCisvLyBEaWUgS3VyemJlc2NocmVpYnVuZyBpbnZpcyBtYWNoZW46CitzdGF0aWMgaW50IHZlcnN0ZWNrZW4gKHN0cmluZyBzdHIpCit7CisgICBzdHJpbmcgbmZfc3RyOworICAgbmZfc3RyPSJTeW50YXg6IHN2ZXJzdGVja2UgW09iamVrdC1JZF1cbiIKKyAgICAgICAgICsiQnNwLjogICBzdmVyc3RlY2tlICIrUXVlcnlQcm9wKFBfSURTKVsxXSsiXG4iOworICAgbm90aWZ5X2ZhaWwoIkZlaGxlcjogT2huZSBQYXJhbWV0ZXIga2xhcHB0IGRhcyBuaWNodC5cbiIrbmZfc3RyKTsKKyAgIGlmKCFzdHIgfHwgc2l6ZW9mKHN0cikgPT0gMCB8fCAhc3RyaW5ncChzdHIpKSByZXR1cm4gMDsKKworICAgbm90aWZ5X2ZhaWwoIkZlaGxlcjogRHUgbXVzc3QgZWluZSBndWVsdGlnZSBPYmpla3QtSWQgYW5nZWJlbiFcbiIrbmZfc3RyKTsKKyAgIGlmKHByZXNlbnQoc3RyKSE9VE8pICAgLy8gVWViZXJwcnVlZmUsIG9iIGF1Y2ggZGllc2VzIE9iamVrdCBnZW1laW50IGlzdCEKKyAgICByZXR1cm4gMDsKKworICBpZiggUXVlcnlIYXVzYmVzaXR6ZXIoKSAhPSBRdWVyeVRQKCkgJiYgIVF1ZXJ5UHJvcCgidGVzdCIpICkKKyAgeworICAgIHdyaXRlKCBCUygiTnVyICIrUXVlcnlIYXVzYmVzaXR6ZXIoKSsiIGRhcmYgIituYW1lKFdFTiwxKSsiIHZlcnN0ZWNrZW4hIikpOworICAgIHJldHVybiAxOworICB9CisgIG5vdGlmeV9mYWlsKCJEdSBoYXN0ICIrbmFtZShXRU4sMSkrIiBkb2NoIHNjaG9uIHZlcnN0ZWNrdCFcbiIpOworICBpZihRdWVyeVByb3AoInZlcnN0ZWNrdCIpID09IDEpIHJldHVybiAwOworICB3cml0ZSgiRHUgdmVyc3RlY2tzdCAiK25hbWUoV0VOLDEpKyIuXG4iKTsKKyAgU2V0UHJvcCgidmVyc3RlY2t0IiwgMSk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHplaWdlbiAoc3RyaW5nIHN0cikKK3sKKyAgIHN0cmluZyBuZl9zdHI7CisgICBuZl9zdHI9IlN5bnRheDogc2hvbGUgW09iamVrdC1JZF0gaGVydm9yXG4iCisgICAgICAgICArIkJzcC46ICAgc2hvbGUgIitRdWVyeVByb3AoUF9JRFMpWzFdKyIgaGVydm9yXG4iOworICAgbm90aWZ5X2ZhaWwoIkZlaGxlcjogT2huZSBQYXJhbWV0ZXIga2xhcHB0IGRhcyBuaWNodC5cbiIrbmZfc3RyKTsKKyAgIGlmKCFzdHIgfHwgc2l6ZW9mKHN0cikgPT0gMCB8fCAhc3RyaW5ncChzdHIpKSByZXR1cm4gMDsKKyAgIGlmKHN0cnN0cihzdHIsImhlcnZvciIpICE9IC0xKQorICAgIHNzY2FuZihzdHIsIiVzIGhlcnZvciIsc3RyKTsKKyAgIG5vdGlmeV9mYWlsKCJGZWhsZXI6IER1IG11c3N0IGVpbmUgZ3VlbHRpZ2UgT2JqZWt0LUlkIGFuZ2ViZW4hXG4iK25mX3N0cik7CisgICBpZihwcmVzZW50KHN0cikhPVRPKSAgIC8vIFVlYmVycHJ1ZWZlLCBvYiBhdWNoIGRpZXNlcyBPYmpla3QgZ2VtZWludCBpc3QhCisgICAgcmV0dXJuIDA7CisKKyAgIGlmKCBRdWVyeUhhdXNiZXNpdHplcigpICE9IFF1ZXJ5VFAoKSAmJiAhUXVlcnlQcm9wKCJ0ZXN0IikgKQorICAgeworICAgICB3cml0ZSggQlMoIk51ciAiK1F1ZXJ5SGF1c2Jlc2l0emVyKCkrIiBkYXJmICIrbmFtZShXRU4sMSkrCisgICAgICAgICAgICAgICAiIHdpZWRlciBoZXJ2b3Job2xlbiEiKSk7CisgICAgIHJldHVybiAxOworICAgfQorICAgbm90aWZ5X2ZhaWwoTmFtZShXRVIsMSkrIiBpc3QgZG9jaCBnYXIgbmljaHQgdmVyc3RlY2t0IVxuIik7CisgICBpZihRdWVyeVByb3AoInZlcnN0ZWNrdCIpID09IDApIHJldHVybiAwOworICAgd3JpdGUoIkR1IGhvbHN0ICIrbmFtZShXRU4sMSkrIiBhdXMgZGVtIFZlcnN0ZWNrLlxuIik7CisgICBTZXRQcm9wKCJ2ZXJzdGVja3QiLCAwKTsKKyAgIHJldHVybiAxOworfQorCisKK21peGVkIHNob3J0KCkKK3sKKyAgc3RyaW5nIHNoOworCisgIC8vIFVuc2ljaHRiYXI/IERhbm4gZ2lidHMgbmljaHRzIHp1IHNlaGVuIC4uLgorICBpZiAoUXVlcnlQcm9wKFBfSU5WSVMpfHwhKHNoPVF1ZXJ5UHJvcChQX1NIT1JUKSkpCisgIHJldHVybiAwOworCisgIGlmKFF1ZXJ5UHJvcChQX0NOVF9TVEFUVVMpPT1DTlRfU1RBVFVTX09QRU4pCisgIHtzaCArPSAiIChnZW9lZmZuZXQpIjt9CisKKyAgaWYoUXVlcnlQcm9wKCJ2ZXJzdGVja3QiKSA9PSAxKSB7c2ggPSAiIjt9CisgIGVsc2Ugc2ggKz0gIi4iOworCisgIHJldHVybiBwcm9jZXNzX3N0cmluZyhzaCkrIlxuIjsKK30KKworLy8gaGllciBuaWNodCBnZW51dHp0LCB6dW0gVWViZXJzY2hyZWliZW4gZ2VkYWNodC4KK3Byb3RlY3RlZCB2b2lkIFNldEJlc2l0emVyKHN0cmluZyB1aWQsIHN0cmluZyB1dWlkKSB7IH0KKworLy8gbmFjaCBkZW0gbW92ZSBzY2hhdWVuLCBvYiBtYW4gaW4gZWluZW0gU2VoZXJoYXVzIGlzdC4gV2VubiBqYSwgd2lyZCBkaWUKKy8vIEZ1bmt0aW9uIFNldEJlc2l0emVyKCkgZ2VydWZlbiB1bmQgaWhyIFVJRCB1bmQgVVVJRCBkZXMgRWlnZW50dWVtZXJzCisvLyB1ZWJlcmdlYmVuLiBTb2xsdGVuIFVJRCB1bmQvb2RlciBVVUlEIG5pY2h0IGJlc3RpbW1iYXIgc2Vpbiwgd2lyZCBkaWUKKy8vIEZ1bmt0aW9uIG5pY2h0IGdlcnVmZW4uCitwcm90ZWN0ZWQgdm9pZCBOb3RpZnlNb3ZlKG9iamVjdCBkZXN0LCBvYmplY3Qgb2xkZW52LCBpbnQgbWV0aG9kKQoreworCisgIDo6Tm90aWZ5TW92ZShkZXN0LCBvbGRlbnYsIG1ldGhvZCk7CisKKyAgaWYgKGRlc3QKKyAgICAgICYmIHN0cnN0cihvYmplY3RfbmFtZShkZXN0KSwiL2Qvc2VoZXIvaGFldXNlci8iKSA9PSAwKQorICB7CisgICAgLy8gKHZlcm11dGxpY2gpIGluIGVpbmVtIFNlaGVyaGF1cworICAgIHN0cmluZyB1aWQgPSBkZXN0LT5RdWVyeU93bmVyKCk7CisgICAgLy8gZXJzdG1hbCBiZWltIFNjaHJhbmttYXN0ZXIgYW5tZWxkZW4uCisgICAgU0NIUkFOS01BU1RFUi0+UmVnaXN0ZXJDbnQoVE8sIFF1ZXJ5UHJvcCgiY250X3ZlcnNpb25fc3RkIikKKyAgICAgICAgKyI6IitRdWVyeVByb3AoImNudF92ZXJzaW9uX29iaiIpLCB1aWQsIGRlc3QpOworICAgIC8vIFVVSUQgcmF1c2ZpbmRlbgorICAgIG1peGVkIHJldCA9IChtaXhlZCltYXN0ZXIoKS0+Z2V0X3VzZXJpbmZvKHVpZCk7CisgICAgaWYgKCBwb2ludGVycChyZXQpICYmIHNpemVvZihyZXQpID49IDUgKQorICAgIHsKKyAgICAgIC8vIFVzZXJuYW1lICsgIl8iICsgQ3JlYXRpb25EYXRlCisgICAgICBTZXRCZXNpdHplcih1aWQsIHJldFswXSArICJfIiArIHJldFs1XSk7CisgICAgfQorICAgIC8vIGVsc2U6IFVzZXIgdW5iZWthbm50PyAtPiBqZWRlbmZhbGxzIGtlaW5lIGluaXRpYWxpc2llcnVuZyBtb2VnbGljaC4KKyAgfQorfQorCmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL3RyZXNvci5jIGIvZC9zZWhlci9oYWV1c2VyL21vZWJlbC90cmVzb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2FkNmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL21vZWJlbC90cmVzb3IuYwpAQCAtMCwwICsxLDc4IEBACisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBOYW1lIGRlcyBPYmplY3RzOiAgICBUcmVzb3IKKy8vIExldHp0ZSBBZW5kZXJ1bmc6ICAgIDE3LjAzLjIwMDEKKy8vIE1hZ2llcjogICAgICAgICAgICAgIFN3aWZ0CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjcHJhZ21hIHN0cm9uZ190eXBlcyxydHRfY2hlY2tzCisKKyNpbmNsdWRlICJzY2hyYW5rbGFkZW4uaCIKK2luaGVyaXQgTEFERU4oInN3aWZ0X3N0ZF9jb250YWluZXIiKTsKKworI2RlZmluZSBWRVJTSU9OX09CSiAiMyIKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAoVE8pKSByZXR1cm47CisgIHN3aWZ0X3N0ZF9jb250YWluZXI6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfU0hPUlQsICJFaW4gVHJlc29yIik7CisgIFNldFByb3AoUF9MT05HLCBCUygKKyAgICAgIkVpbiBzZWhyIHN0YWJpbGVyIHVuZCBmZXVlcnNpY2hlcmVyIFRyZXNvciwgYW4gZGVtIHNpY2ggc2ljaGVyIHNjaG9uIHNvICIKKyAgICArIm1hbmNoZXIgRWluYnJlY2hlciBlaW5lIEFiZnVociBnZWhvbHQgaGF0LiBEYXMgbWFnaXNjaGUgRmVsZCwgZGFzIGRlbiAiCisgICAgKyJUcmVzb3IgdW1naWJ0LCB2ZXJoaW5kZXJ0IHdvaGwgYXVjaCBBdHRhY2tlbiBtYWdpc2NoZXIgQXJ0LiBTbyB3dWNodGlnICIKKyAgICArInVuZCB3aWNodGlnLCB3aWUgZGllc2VyIEtsb3R6IGF1c3NpZWh0LCB2ZXJtdXRlc3QgRHUgd29obCB6dSBSZWNodCwgIgorICAgICsiZGFzcyBzaWNoIHVuc2FnYmFyZSBSZWljaHR1ZW1lciBpbiBzZWluZW0gSW5uZXJlbiB2ZXJiZXJnZW4gbXVlc3Nlbi4iKQorICAgICsiQEBjbnRfc3RhdHVzQEAiKTsKKyAgQWRkSWQoKHsidHJlc29yIn0pKTsKKyAgU2V0UHJvcCgiY250X3ZlcnNpb25fb2JqIiwgVkVSU0lPTl9PQkopOworICBTZXRQcm9wKFBfTkFNRSwgIlRyZXNvciIpOworICBTZXRQcm9wKFBfR0VOREVSLCBNQUxFKTsKKyAgU2V0UHJvcChQX1dFSUdIVCwgNTAwMCk7ICAgICAgICAgLy8gR2V3aWNodCA1IEtnCisgIFNldFByb3AoUF9NQVhfV0VJR0hULCAxMDAwMDAwKTsgIC8vIEVzIHBhc3NlbiBmdWVyIDEwMDAga2cgU2FjaGVuIHJlaW4uCisgIFNldFByb3AoUF9XRUlHSFRfUEVSQ0VOVCwgMTAwKTsgIC8vIERhZnVlciBtYWNodCBlciBhdWNoIG5peCBsZWljaHRlciA6KQorICBTZXRQcm9wKFBfTUFYX09CSkVDVFMsIDEwMCk7ICAgICAvLyBNZWhyIHNvbGx0ZSBuaWNodCBzZWluLCBsdC4gVGlhbWFrLgorICBTZXRQcm9wKFBfVkFMVUUsIDApOyAgICAgICAgICAgICAvLyBLZWluIG1hdGVyaWVsbGVyIFdlcnQuIElzdCBlaCBuaWNodCB2ZXJrYXVmYmFyLgorICBTZXRQcm9wKFBfTk9CVVksIDEpOyAgICAgICAgICAgICAvLyBXaXJkIGltIExhZGVuIHplcnN0b2VydCwgZmFsbHMgZXIgdmVya2F1ZnQgd2lyZC4KKyAgU2V0UHJvcChQX05PR0VULCAiRGFzIGdlaHQgbmljaHQuICIrTmFtZShXRVIsMSkrIiBoYWZ0ZXQgd2llIG1hZ2lzY2ggYW0gQm9kZW4uXG4iKTsKKyAgU2V0UHJvcChQX01BVEVSSUFMLCAoe01BVF9TVEVFTCwgTUFUX01JU0NfTUFHSUN9KSApOworICBTZXRQcm9wKFBfSU5GTywgIlZlcnN1Y2hzIG1hbCBtaXQ6IFwic2tvbW1hbmRvcyAiK1F1ZXJ5UHJvcChQX0lEUylbMV0rIlwiICFcbiIpOworCisgIEFEKCh7ImZlbGQifSksIEJTKCJFaW4gc3RhcmtlcyBtYWdpc2NoZXMgRmVsZCB1bWdpYnQgIituYW1lKFdFTiwxKSsiLiIpKTsKKyAgQUQoKHsia2xvdHoifSksIEJTKE5hbWUoV0VSLDEpKyIgaXN0IHdhaHJsaWNoIGVpbiBLbG90eiwgYXVzZ2VzcHJvY2hlbiB3dWNodGlnLiIpKTsKK30KKwordmFyYXJncyBpbnQgUHJldmVudEluc2VydChvYmplY3Qgb2IpCit7CisgIC8vIFp1ZXJzdCBtYWw6IERpbmdlLCBkZXJlbiBXZXJ0ID49IDUwMDAgTXVlbnplbiBpc3QsIGR1ZXJmZW4gcmVpbiwgc29sYW5nZQorICAvLyBlcyBrZWluZSBSdWVzdHVuZ2VuIG9kZXIgV2FmZmVuIHNpbmQhCisgIGlmKCBvYi0+UXVlcnlQcm9wKFBfVkFMVUUpID49IDUwMDAgJiYgIW9iLT5RdWVyeVByb3AoUF9BUk1PVVJfVFlQRSkgJiYKKyAgICAgIW9iLT5RdWVyeVByb3AoUF9XRUFQT05fVFlQRSkgKQorICAgICAgICByZXR1cm4gOjpQcmV2ZW50SW5zZXJ0KG9iKTsKKyAgaWYoIG9iLT5pZCgiXG5nZWxkIikgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2VsZD8KKyAgICAgIG9iLT5RdWVyeU1hdGVyaWFsR3JvdXAoTUFUR1JPVVBfUFJFQ0lPVVNfTUVUQUwpIHx8ICAgICAgLy8gRWRlbG1ldGFsbD8KKyAgICAgIG9iLT5RdWVyeU1hdGVyaWFsR3JvdXAoTUFUR1JPVVBfSkVXRUwpIHx8ICAgICAgICAgICAgICAgLy8gRWRlbHN0ZWluPworICAgICAgb2ItPlF1ZXJ5TWF0ZXJpYWwoTUFUX0NSWVNUQUwpIHx8ICAgICAgICAgICAgICAgICAgICAgICAvLyBLcmlzdGFsbD8KKyAgICAgIG9iLT5RdWVyeU1hdGVyaWFsKE1BVF9JVk9SWSkgKSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRWxmZW5iZWluPworICB7CisgICAgaWYoIW9iLT5RdWVyeVByb3AoUF9XRUFQT05fVFlQRSkgKSAgICAvLyBBdWYga2VpbmVuIEZhbGwgV2FmZmVuIQorICAgIHsKKyAgICAgIGlmKCBvYi0+UXVlcnlQcm9wKFBfQVJNT1VSX1RZUEUgKSApIC8vIEZhbGxzIFJ1ZXN0dW5nc3RlaWwuLi4KKyAgICAgIHsKKyAgICAgICAgaWYoIG9iLT5RdWVyeVByb3AoUF9BUk1PVVJfVFlQRSk9PUFUX1JJTkcgfHwKKyAgICAgICAgICAgIG9iLT5RdWVyeVByb3AoUF9BUk1PVVJfVFlQRSk9PUFUX0FNVUxFVCB8fAorICAgICAgICAgICAgb2ItPlF1ZXJ5UHJvcChQX0FSTU9VUl9UWVBFKT09QVRfTUlTQyApCisgICAgICAgICAgcmV0dXJuIDo6UHJldmVudEluc2VydChvYik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICB3cml0ZShCUygiTnVyIHdlcnR2b2xsZSBSaW5nZSB1bmQgQW11bGV0dGUga2FubnN0IER1IGluICIrbmFtZShXRU4sMSkKKyAgICAgICAgICAgICsiIHN0ZWNrZW4sIGV2dGwuIG5vY2ggYW5kZXJlIHdlcnR2b2xsZSBTYWNoZW4sIGFiZXIgYXVmIGtlaW5lbiAiCisgICAgICAgICAgICArIkZhbGwgUnVlc3R1bmdlbiBvZGVyIFdhZmZlbiEiKSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiA6OlByZXZlbnRJbnNlcnQob2IpOworICAgIH0KKyAgICBlbHNlCisgICAgICB3cml0ZSgiV2FmZmVuIGthbm5zdCBEdSBuaWNodCBpbiAiK25hbWUoV0VOLDEpKyIgdHVuIVxuIik7CisgIH0KKyAgd3JpdGUoIEJTKCJJbiAiK25hbWUoV0VOLDEpKyIga2FubnN0IER1IG51ciBHZWxkIHVuZCBFZGVsc3RlaW5lIGxlZ2VuLCBldnRsLiBhdWNoICIKKyAgICAgICAgICAgKyJ3ZXJ0dm9sbGUgT2JqZWt0ZSwgei5CLiBhdXMgRWRlbG1ldGFsbGVuLCBLcmlzdGFsbCBvZGVyIEVsZmVuYmVpbiEiKSk7CisgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL21vZWJlbC92ZXJrYWV1ZmVyLmMgYi9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL3ZlcmthZXVmZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTQzYWIyCi0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL21vZWJlbC92ZXJrYWV1ZmVyLmMKQEAgLTAsMCArMSwzMTEgQEAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE5hbWUgZGVzIE9iamVjdHM6ICAgIFZlcmthZXVmZXIgKEF1Z3VzdCB2b20gU0NIUkFFTktFUikKKy8vIExldHp0ZSBBZW5kZXJ1bmc6ICAgIDI0LjA4LjIwMDYKKy8vIE1hZ2llcjogICAgICAgICAgICAgIFNlbGV2ZW4KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHJ0dF9jaGVja3MKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPGJhbmsuaD4KKworI2luY2x1ZGUgInNjaHJhbmtsYWRlbi5oIgoraW5oZXJpdCAiL3N0ZC9ucGMiOworCisvLyBXZW5uIGltIExhZGVuIGJ6dy4gaW0gRW52aXJvbm1lbnQgdm9uIEF1Z3VzdCBkaWUgUHJvcCAidGVzdCIgYXVmIDEgZ2VzZXR6dAorLy8gd2lyZCwga29zdGV0IGRlciBLYXVmIG5pY2h0cy4gSmVkZXIgZGVyIGVpbiBTZWhlcmhhdXMgYmVzaXR6dCwga2FubiBrYXVmZW4uCisKKy8vIEZ1ZXIgUHJvcCBpbSBTcGllbGVyID0gaW5kaXZpZHVlbGxlcmUgQmVncnVlc3N1bmcKKyNkZWZpbmUgTEFTVFZJU0lUICJzY2hyYW5rbGFkZW5fbGFzdHZpc2l0IgorLy8gMTAlIFJhYmF0dCBmdWVyIExldXRlLCBkaWUgaW50ZW5zaXYgdGVzdGV0ZW4sIElkZWVuIGZ1ZXIgZGVuIExhZGVuIGJlaXN0ZXVlcnRlbiwKKy8vIG9kZXIgaGFsZmVuLCBncm9lc3NlcmUgQnVncyB6dSBiZWhlYmVuIQorI2RlZmluZSBSQUJBVFQgKHsiZ2VvcmRpIiwiZm9vYmFyIiwiYmxvb2QiLCJsdXJjaGkiLCAiZWxkYXJvbiJ9KQorCisvLyBrYXVmZS4uLiBhbmRlcmUgaW0gcmF1bSBzb2xsdGVuIHZvciBkZXIgYW50d29ydCBzZWhlbiB3ZXIgYXVndXN0IG5hY2ggd2FzIGZyYWd0CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgIGlmKCFjbG9uZXAoVE8pKSByZXR1cm47CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9MT0dfRklMRSwic2VsZXZlbi9zY2hyYWVua2VyIik7IC8vIFNlbGV2ZW4gMDYuMDQuMjAwNgorICBTUChQX1NIT1JULCAiQXVndXN0Iik7CisgIFNQKFBfTE9ORywgQlMoCisgICAgICJEYXMgaXN0IEF1Z3VzdCwgZWluIGtsZWluZXIgWndlcmcgdW5kIHNlaW5lcyBaZWljaGVucyBTZWhlci1CZXJhdGVyLiAiCisgICAgKyJFciB2ZXJzb3JndCBTZWhlciBtaXQgRWlnZW5oZWltIG1pdCBkZW0gTW9iaWxpYXIsIGRhcyBtYW4gYnJhdWNodCwgIgorICAgICsid2lsbCBtYW4gc2VpbiBIYXVzIHVlYmVyc2ljaHRsaWNoIGhhbHRlbiB1bmQgZXR3YXMgT3JkbnVuZyBpbiBkaWUgIgorICAgICsiU2FtbWx1bmdlbiBicmluZ2VuLCBkaWUgc2ljaCBpbiBzbyBlaW5lbSBTZWhlcmhhdXMgendhbmdzbGFldWZpZyAiCisgICAgKyJhbmhhZXVmZW4uIEltIEdlZ2Vuc2F0eiB6dSBkZW4gbWVpc3RlbiBad2VyZ2VuIHNpZWh0IEF1Z3VzdCBuaWNodCBudXIgIgorICAgICsiYXVzIHdpZSBmcmlzY2ggZ2VkdXNjaHQsIGVyIHN0ZWNrdCBhdWNoIGluIGVpbmVtIGZlaW5lbiBBbnp1Zy4gU28gIgorICAgICsiZWluZW4gZ2VwZmxlZ3RlbiBCYXJ0IHdpZSBkZW4gdm9uIEF1Z3VzdCBoYXN0IER1IHZvcmhlciBub2NoIG5pZSAiCisgICAgKyJnZXNlaGVuLiBVbmQgZGFubiBkdWZ0ZXQgZXIgYXVjaCBub2NoIG5hY2ggaXJnZW5kZWluZW0gZXhvdGlzY2hlbiAiCisgICAgKyJXYWVzc2VyY2hlbi4gV2FlcmUgbmljaHQgZGVyIGdpZXJpZ2UgQmxpY2sgaW4gc2VpbmVuIEF1Z2VuLCBrb2VubnRlc3QgIgorICAgICsiRHUgd2lya2xpY2ggendlaWZlbG4sIGRhc3MgZXMgc2ljaCBoaWVyIHdpcmtsaWNoIHVtIGVpbmVuIFp3ZXJnICIKKyAgICArImhhbmRlbHQuIiw3OCwwLDEpKTsKKyAgU1AoUF9OQU1FLCAiQXVndXN0Iik7CisgIFNQKFBfR0VOREVSLCBNQUxFKTsKKyAgU1AoUF9BUlRJQ0xFLCAwKTsKKyAgU1AoUF9SQUNFLCAiWndlcmciKTsKKyAgLy8gQXJhdGhvcm4sIDIwMTUtT2t0LTEzLCBaZWlsZSB2b3IgUF9YUCBnZXpvZ2VuLCBkYW1pdCBhdWNoIHNpY2hlciBrZWluCisgIC8vIEVLIGFuZ2V6ZWlndCB3aXJkLgorICBjcmVhdGVfZGVmYXVsdF9ucGMoMjApOworICBTUChQX1hQLCAwKTsKKyAgQWRkSWQoKHsiYXVndXN0IiwgImluaGFiZXIiLCAibGFkZW5pbmhhYmVyIiwgImJlc2l0emVyIiwKKyAgICAgICAgICAiZmlybWVuYmVzaXR6ZXIiLCAidmVya2FldWZlciIsICJ6d2VyZyIsICJzZWhlci1iZXJhdGVyIn0pKTsKKworICBTUChQX1NJWkUsIDEzMCk7CisgIFNQKFBfTk9fQVRUQUNLLCBCUygiRGllIGJlcnVoaWdlbmRlIE1lbG9kaWUgc2NoZWludCBuaWNodCBudXIgenVtICIKKyAgICArIlZlcmdudWVnZW4gZGVyIEt1bmRlbiB6dSBlcmtsaW5nZW4uIER1IGJyaW5nc3QgZXMgZWluZmFjaCAiCisgICAgKyJuaWNodCBmZXJ0aWcsIERlaW5lIEhhbmQgZ2VnZW4gQXVndXN0IHp1IGVyaGViZW4hIikpOworCisgIEFEKCh7ImFuenVnIn0pLCBCUyhOYW1lKFdFUikrIiBzdGVja3QgaW4gZWluZW0gZmVpbmVuIHJvdGJyYXVuZW4gQW56dWcsICIKKyAgICArImluIGRlbSB2ZXJtdXRsaWNoIGF1Y2ggZWluIEJldHRsZXIga29lbmlnbGljaCBhdWYgRGljaCB3aXJrZW4gd3VlcmRlLiAiCisgICAgKyJPZmZlbnNpY2h0bGljaCBpc3QgZXIgbmljaHQgZGVyIEFlcm1zdGVuIGVpbmVyLiIpKTsKKyAgQUQoKHsiYmV0dGxlciJ9KSwgQlMoIldpZSBlaW4gQmV0dGxlciB3aXJrdCBBdWd1c3QgbmljaHQgYXVmIERpY2guIikpOworICBBRCgoeyJ3YWVzc2VyY2hlbiJ9KSwgQlMoIkVzIHJpZWNodCBrb2VzdGxpY2guIFNjaG51cHBlciBkb2NoIG1hbCEiKSk7CisgIEFEKCh7ImJhcnQifSksIEJTKCJEZXIgdmVybXV0bGljaCB3ZWlzc2UgQmFydCB3dXJkZSB2b24gS3VlbnN0bGVyaGFuZCAiCisgICAgKyJyb2V0bGljaCBlaW5nZWZhZXJidCB1bmQgcGFzc3QgZmFyYmxpY2ggdm9yenVlZ2xpY2ggenVtIEFuenVnLiIpKTsKKyAgQUQoKHsia3VlbnN0bGVyaGFuZCJ9KSwgQlMoIkJlc3RpbW10IGhhdCBBdWd1c3QgZGFzIG5pY2h0IHNlbGJzdCBnZW1hY2h0LiIpKTsKKyAgQUQoKHsibW9iaWxpYXIifSksIEJTKCJEYXMgdmVya2F1ZnQgZXIgaGllci4iKSk7CisgIEFEKCh7ImF1Z2VuIn0pLCBCUygiT2J3b2hsICIrTmFtZShXRVIpKyIgcGVyZmVrdGUgTWFuaWVyZW4gYW4gZGVuIFRhZyAiCisgICAgKyJsZWd0LCBzZWluZSBBdWdlbiB2ZXJyYXRlbiBpaG4uIERpZSBEb2xsYXJ6ZWljaGVuIGluIHNlaW5lbSBCbGljayAiCisgICAgKyJzaW5kIG5pY2h0IHp1IHVlYmVyc2VoZW4uIikpOworICBBRCgoeyJkb2xsYXJ6ZWljaGVuIn0pLCBCUygiRWluZSBSZWRlbnNhcnQuIEtlaW5lIEFobnVuZyB3YXMgZGFzIHNlaW4gc29sbC4iKSk7CisgIEFEKCh7InJlZGVuc2FydCJ9KSwgQlMoIklyZ2VuZCBlaW4gU3BydWNoLCBkZW4gRHUgaXJnZW5kd28gYXVmZ2VzY2huYXBwdCBoYXN0LiIpKTsKKyAgQUQoKHsic3BydWNoIn0pLCBCUygiSW0gU3BydWVjaGVrbG9wZmVuIGJpc3QgRHUgZ3V0LCBvZGVyPyIpKTsKKyAgQUQoKHsic3BydWVjaGVrbG9wZmVuIn0pLCBCUygiT0ssIGljaCBnZWIgYXVmLiA6KSIpKTsKKyAgQUQoKHsibWFuaWVyZW4ifSksICJVbmQgZGFzIGJlaSBlaW5lbSBad2VyZyEhIVxuIik7CisKKyAgQWRkSW5mbygoeyJsYWRlbiIsICJzY2hyYWVua2VyIn0pLCAiRGVyIFNjaHJhZW5rZXIgaXN0IG1laW4gTGFkZW4sICIKKyAgICArInVuZCBpY2ggZGVua2UgZXMgaXN0IGVpbiBndXRlciBMYWRlbi4gRGFzIEdlc2NoYWVmdCBsYWV1ZnQsIHNlaXQgIgorICAgICsiamVkZXIgT3JkbnVuZyBpbiBzZWluZW0gU2VoZXJoYXVzIGhhYmVuIG1vZWNodGUuIFVuZCBTZWhlcmhhZXVzZXIgIgorICAgICsiZ2lidCBlcyBqYSBtZWhyIGFscyBnZW51ZyEgOikiLCAic2FndDogIik7CisgIEFkZEluZm8oKHsiaGFldXNlciIsICJzZWhlcmhhZXVzZXIifSksICJCZWkgbWlyIGtvZW5uZW4gU2VoZXIgIgorICAgICsiTW9iaWxpYXIgZnVlciBpaHIgU2VoZXJoYXVzIGthdWZlbi4gVW5zZXJlIFF1YWxpdGFldCBpc3Qgd2VpdGhpbiAiCisgICAgKyJiZXJ1ZWhtdC4gQXVzc2VyZGVtIHNpbmQgd2lyIGRpZSBlaW56aWdlbiBhdWYgZGVtIE1hcmt0LiIsICJncmluc3Q6ICIpOworICBBZGRJbmZvKCh7Im1lbG9kaWUifSksICJsYXVzY2h0IHZlcnRyYWV1bXQuXG4iKTsKKyAgQWRkSW5mbygoeyJnZWxkIn0pLCAiU2llIGhhYmVuIGRvY2ggd2VsY2hlcz9cbiIsICJmcmFndCBiZXNvcmd0OiAiKTsKKyAgLy8gU2VsZXZlbiAwMS4wNC4yMDA2OiBmcmFnZSBuYWNoIChzY2hsdWVzc2VsKWJyZXR0IGVpbmdlZnVlZ3QKKyAgQWRkSW5mbygoeyJtb2JpbGlhciIsICJzY2hyYW5rIiwgInNjaHJhZW5rZSIsICJ0cnVoZSIsICJ0cnVoZW4iLCAia29tbW9kZSIsCisgICAgICJrdWVobHNjaHJhbmsiLCAid2FmZmVuc2NocmFuayIsICJ3YWZmZW50cnVoZSIsICJzcGluZCIsICJrbGVpZGVyc2NocmFuayIsImJyZXR0Iiwic2NobHVlc3NlbGJyZXR0IiwKKyAgICAgIm11ZWxsY29udGFpbmVyIiwgInphdWJlcmtpc3RlIiwgInRyZXNvciIsICJob2x6dHJ1aGUiLCJ2aXRyaW5lIiwicHVsdCIsImxlc2VwdWx0In0pLAorICAgICAiTGVzZW4gU2llIGRvY2ggYml0dGUgZGllIFByZWlzbGlzdGUgYW4gZGVyIFdhbmQuIiwgInNhZ3Q6ICIpOworICBBZGRJbmZvKCh7ImxpZWZlcm4iLCAibGllZmVydW5nIn0pLCAiV2lyIGxpZWZlcm4gc29mb3J0LiIsICJzYWd0OiAiKTsKKyAgQWRkSW5mbygoeyJiYXJ0In0pLCAiRXMgaXN0IGVpbiBzY2hvZW5lciBCYXJ0LCBuaWNodD8gOikiLCAiZnJhZ3Q6ICIpOworICBBZGRJbmZvKCh7ImF1Z2VuIn0pLCAiV2FzIGhhYmVuIFNpZSBhbiBkZW5lbiBhdXN6dXNldHplbj8iLCAiZnJhZ3Q6ICIpOworICBBZGRJbmZvKCh7ImR1c2NoZSJ9KSwgIkplZGVuIE1vcmdlbi4gRGFzIGlzdCBsZWlkZXIgUGZsaWNodC4gVW5kIDM2NCBtYWwgIgorICAgICsienUgb2Z0IDooIiwgInNhZ3Q6ICIpOworICBBZGRJbmZvKCh7InBmbGljaHQiLCAicGZsaWNodGVuIn0pLCAiQWxzIExhZGVuaW5oYWJlciBoYXQgbWFuIGRlcmVuICIKKyAgICArInZpZWxlISIsICJzYWd0OiAiKTsKKyAgQWRkSW5mbygoeyJhbnp1ZyJ9KSwgIkVpbiBlY2h0ZXIgQXJtZ2FuaSEiLCAidmVya3VlbmRldCBzdG9sejogIik7CisgIEFkZEluZm8oKHsiYXJtZ2FuaSJ9KSwgIkR1IGtlbm5zdCBBcm1nYW5pIG5pY2h0PyIsICJmcmFndCBuYXNlcnVlbXBmZW5kOiAiKTsKKyAgQWRkSW5mbygoeyJnZW9yZGkifSksICJWb24gaWhtIHN0YW1tdCBkaWUgdXJzcHJ1ZW5nbGljaGUgR2VzY2hhZWZ0c2lkZWUgIgorICAgICsiZnVlciBkZW4gU0NIUkFFTktFUi4gRGFmdWVyIGJla29tbXQgZXIgYmVpIHVucyBhdWNoIFJhYmF0dCEiLCAiZXJ6YWVobHQ6ICIpOworICBBZGRJbmZvKCh7ImF1Z3VzdCJ9KSwgIldvbGxlbiBTaWUgc2ljaCB1ZWJlciBtaWNoIGx1c3RpZyBtYWNoZW4/IiwgImZyYWd0IGRyb2hlbmQ6ICIpOworICBBZGRJbmZvKCh7InJhYmF0dCJ9KSwgIk51ciBTdGFtbWt1bmRlbiwgZGllIHVucyBzY2hvbiBicmF1Y2hiYXJlIElkZWVuICIKKyAgICArImdlbGllZmVydCBoYWJlbiwgb2RlciBkaWUgdW5zIGJlaW0gQXVmYmF1IGRlcyBHZXNjaGFlZnRzIGdlaG9sZmVuIGhhYmVuLCAiCisgICAgKyJnZXdhZWhyZW4gd2lyIFJhYmF0dC4iLCAic2FndDogIik7CisgIEFkZEluZm8oKHsiaWRlZW4ifSksICJFcyBtdWVzc2VuIGJyYXVjaGJhcmUgSWRlZW4gc2Vpbi4iLCAic2FndDogIik7CisgIEFkZEluZm8oKHsic3RhbW1rdW5kZSIsICJzdGFtbWt1bmRlbiJ9KSwgIkVpbmlnZSBrb21tZW4gb2VmdGVyIHZvcmJlaS4iLCAic2FndDogIik7CisgIEFkZEluZm8oKHsiYXVmYmF1In0pLCAiRXMga29tbXQgbWlyIG5vY2ggc28gdm9yLCBhbHMgd2FlcnMgZ2VzdGVybiBnZXdlc2VuLiIsICJzYWd0OiAiKTsKKyAgQWRkSW5mbygoeyJrdW5kZSIsICJrdW5kZW4ifSksICJJY2ggaG9mZmUgbWFsLCBkYXNzIFNJRSBkZXIgS3VuZGUgc2luZCE/IiwgInNhZ3Q6ICIpOworCisgIEFkZENtZCgoeyJrYXVmIiwgImthdWZlIiwgImJlc3RlbGwiLCAiYmVzdGVsbGUifSksICJjb250YWluZXJfa2F1ZmVuIik7CisgIEFkZENtZCgoeyJzY2hudXBwZXIiLCAic2NobnVwcGVyZSJ9KSwgInNjaG51cHBlcm4iKTsKK30KKworaW50IHNjaG51cHBlcm4oKQoreworICB3cml0ZShCUygiRWluIGJldG9lcmVuZGVyIER1ZnQgdW1naWJ0IEF1Z3VzdCwgdW5kIHZlcmRlY2t0IGplZ2xpY2hlbiBHZXJ1Y2gsICIKKyAgICArImRlbiBEdSB2b24gc29uc3RpZ2VuIFp3ZXJnZW4gZ2V3b2hudCBiaXN0LiIpKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJpbmcgYW5yZWRlKCkKK3sKKyAgc3dpdGNoKCBUUC0+UXVlcnlQcm9wKFBfR0VOREVSKSApCisgIHsKKyAgICBjYXNlIE1BTEUgICA6IHJldHVybiAibWVpbiBIZXJyIjsgYnJlYWs7CisgICAgY2FzZSBGRU1BTEUgOiByZXR1cm4gIm1laW5lIERhbWUiOyBicmVhazsKKyAgfQorICByZXR1cm4gIm1laW4gSC4uLiBELi4uIFdhc2F1Y2hpbW1lciI7Cit9CisKK3ZvaWQgYmVncnVlc3N1bmcob2JqZWN0IHBsLCBzdHJpbmcgdHh0KQoreworICBpZiggb2JqZWN0cChwbCkgJiYgcHJlc2VudChwbCkgKQorICAgIHRlbGxfcm9vbShFVE8sICJcbiIrdHh0KTsKK30KKwordm9pZCBpbml0KCkKK3sKKyAgOjppbml0KCk7CisgIGlmICghaW50ZXJhY3RpdmUoVFApIHx8IFRQLT5RdWVyeVByb3AoUF9JTlZJUykpCisgICAgICByZXR1cm4gMDsgLy8gS2VpbmUgTWVsZHVuZ2VuIHdlbm4gaW52aXMgb2RlciBrZWluIFNwaWVsZXIhCisgIGlmKFRQLT5RdWVyeVByb3AoTEFTVFZJU0lUKSA8IHRpbWUoKS0zNjAwKSAgLy8gbGFlbmdlciBhbHMgMSBTdGQuIG5pY2h0IGRhIGdld2VzZW4KKyAgeworICAgIGlmKCBtZW1iZXIoUkFCQVRULCBnZXRldWlkKFRQKSkgIT0gLTEgKQorICAgICAgY2FsbF9vdXQoImJlZ3J1ZXNzdW5nIiwgMCwgVFAsIEJTKCJIZXJ6bGljaHN0IFdpbGxrb21tZW4gaW4gbWVpbmVtICIKKyAgICAgICAgKyJiZXNjaGVpZGVuZW4gTGFkZW4sICIrVFAtPm5hbWUoV0VSKSsiLiBFcyBpc3QgamVkZXNtYWwgZWluZSBGcmV1ZGUsICIKKyAgICAgICAgKyJTaWUgenUgc2VoZW4hIiw3OCwgTmFtZShXRVIpKyIgc2FndDogIikpOworICAgIGVsc2UKKyAgICAgIGNhbGxfb3V0KCJiZWdydWVzc3VuZyIsIDAsIFRQLCBCUygiV2lsbGtvbW1lbiBpbiBtZWluZW0gYmVzY2hlaWRlbmVuIExhZGVuLCAiCisgICAgICAgICthbnJlZGUoKSsiLiIsNzgsIE5hbWUoV0VSKSsiIHNhZ3Q6ICIpKTsKKyAgfQorICBlbHNlICAvLyBzY2hvbm1hbCBpbm5lcmhhbGIgMSBTdGQuIGRhIGdld2VzZW4/CisgIHsKKyAgICBpZiggbWVtYmVyKFJBQkFUVCwgZ2V0ZXVpZChUUCkpICE9IC0xICkKKyAgICAgIGNhbGxfb3V0KCJiZWdydWVzc3VuZyIsIDAsIFRQLCBCUygiSGFsbG8sICIrVFAtPm5hbWUoV0VSKSsiLiAiCisgICAgICAgICsiU2llIGtvbm50ZW4gZXMgamEgbmljaHQgbGFuZ2Ugb2huZSBtaWNoIGF1c2hhbHRlbiwgYWJlciBTdGFtbWt1bmRlbiAiCisgICAgICAgICsic2luZCBtaXIgZGllIGxpZWJzdGVuIEt1bmRlbi4gV29taXQga2FubiBpY2ggSWhuZW4gZGllc21hbCAiCisgICAgICAgICsiZGllbmVuPyIsNzgsIE5hbWUoV0VSKSsiIHNhZ3Q6ICIpKTsKKyAgICBlbHNlCisgICAgICBjYWxsX291dCgiYmVncnVlc3N1bmciLCAwLCBUUCwgQlMoIkd1dGVuIFRhZywgIithbnJlZGUoKSsiLiAiCisgICAgICAgICsiSWNoIGZyZXVlIG1pY2gsIGRhc3MgU2llIG1laW5lbiBMYWRlbiBzbyBiYWxkIHdpZWRlciBiZXN1Y2hlbiBrb21tZW4hICIKKyAgICAgICAgKyJXb21pdCBrYW5uIGljaCBJaG5lbiBkaWVzbWFsIGRpZW5lbj8iLDc4LCBOYW1lKFdFUikrIiBzYWd0OiAiKSk7CisgIH0KKworICBUUC0+U2V0UHJvcChMQVNUVklTSVQsIHRpbWUoKSApOworfQorCitpbnQgY29udGFpbmVyX2thdWZlbihzdHJpbmcgc3RyKQoreworICBzdHJpbmcgY250X2ZpbGU7CisgIGludCBwcmVpczsKKyAgb2JqZWN0IHppZWxyYXVtLGNudCxvYjsKKyAgdGVsbF9yb29tKEVUTywgVFAtPk5hbWUoV0VSKSsiIHdlbmRldCBzaWNoIHdlZ2VuIGVpbmVzIEthdWZzIGFuICIKKyAgICArTmFtZShXRU4pKyIuXG4iLCAoe1RQfSkgKTsKKyAgaWYoIChxdWVyeV93aXpfbGV2ZWwoVFApID49IFNFRVJfTFZMICYmIHF1ZXJ5X3dpel9sZXZlbChUUCkgPCBMRUFSTkVSX0xWTCkgfHwKKyAgICAgIEVUTy0+UXVlcnlQcm9wKCJ0ZXN0IikgKSAvLyBUUCBpc3QgU2VoZXIsIG9kZXIgVGVzdG1vZHVzLgorICB7CisgICAgY2F0Y2goY2FsbF9vdGhlcigiL2Qvc2VoZXIvaGFldXNlci8iK2dldGV1aWQoVFApKyJyYXVtMCIsICI/Pz8iLCAwKSk7CisgICAgaWYoICF6aWVscmF1bT1maW5kX29iamVjdCgiL2Qvc2VoZXIvaGFldXNlci8iK2dldGV1aWQoVFApKyJyYXVtMCIpICkKKyAgICB7CisgICAgICB0ZWxsX3Jvb20oRVRPLCBCUygiVHV0IG1pciBsZWlkLCAiK2FucmVkZSgpKyIuIFZvcmF1c3NldHp1bmcgZnVlciBlaW5lICIKKyAgICAgICAgKyJMaWVmZXJ1bmcgdW5zZXJlciBBcnRpa2VsIGlzdCBlaW4gYmVnZWhiYXJlcyAiCisgICAgICAgICsiU2VoZXJoYXVzLiIsNzgsIE5hbWUoV0VSKSsiIHNhZ3Q6ICIpKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBub3RpZnlfZmFpbCggQlMoIlR1dCBtaXIgbGVpZCwgIithbnJlZGUoKSsiLiBTbyBlaW5lbiBBcnRpa2VsIGZ1ZWhyZW4gd2lyIG5pY2h0LiAiCisgICAgICArIkJpdHRlIGxlc2VuIFNpZSBkaWUgUHJlaXNsaXN0ZSBhbiBkZXIgV2FuZC4gRG9ydCBrb2VubmVuIFNpZSBzaWNoIGdlbmF1ICIKKyAgICAgICsiZGFydWViZXIgaW5mb3JtaWVyZW4sIHVlYmVyIHdlbGNoZSBBcnRpa2VsIHdpciB6dXIgWmVpdCAiCisgICAgICArInZlcmZ1ZWdlbi4iLDc4LCBOYW1lKFdFUikrIiBzYWd0OiAiKSk7CisgICAgaWYoIXN0cikgcmV0dXJuIDA7CisgICAgc3dpdGNoKHN0cikKKyAgICB7CisgICAgICBjYXNlICIxIiA6CisgICAgICBjYXNlICJrb21tb2RlIiA6ICAgICAgIGNudF9maWxlPSJrb21tb2RlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlaXM9Mzc5OTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICIyIiA6CisgICAgICBjYXNlICJrbGVpZGVyc2NocmFuayI6IGNudF9maWxlPSJrbGVpZGVyc2NocmFuayI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWlzPTU4OTk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAiMyIgOgorICAgICAgY2FzZSAic3BpbmQiIDogICAgICAgICBjbnRfZmlsZT0ic3BpbmQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVpcz01Mjk5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgIjQiIDoKKyAgICAgIGNhc2UgImt1ZWhsc2NocmFuayIgOiAgY250X2ZpbGU9Imt1ZWhsc2NocmFuayI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWlzPTM0OTk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAiNSIgOgorICAgICAgY2FzZSAid2FmZmVuc2NocmFuayIgOiBjbnRfZmlsZT0id2FmZmVuc2NocmFuayI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWlzPTU4OTk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAiNiIgOgorICAgICAgY2FzZSAid2FmZmVudHJ1aGUiIDogICBjbnRfZmlsZT0id2FmZmVudHJ1aGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVpcz01Mzk5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgIjciIDoKKyAgICAgIGNhc2UgInRyZXNvciIgOiAgICAgICAgY250X2ZpbGU9InRyZXNvciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWlzPTQ0OTk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAiOCIgOgorICAgICAgY2FzZSAiemF1YmVya2lzdGUiIDogICBjbnRfZmlsZT0iemF1YmVya2lzdGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVpcz03OTk5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgIjkiIDoKKyAgICAgIGNhc2UgIm11ZWxsY29udGFpbmVyIjogY250X2ZpbGU9Im11ZWxsY29udGFpbmVyIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlaXM9OTk5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgIC8vIFNlbGV2ZW4gMDEuMDQuMjAwNgorICAgICAgY2FzZSAiMTAiIDoKKyAgICAgIGNhc2UgInNjaGx1ZXNzZWxicmV0dCI6IGNudF9maWxlPSJzY2hsdWVzc2VsYnJldHQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVpcz00OTk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAiMTEiIDoKKyAgICAgIGNhc2UgImR1c2Noa2FiaW5lIjogY250X2ZpbGU9Indhc2NoIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlaXM9MzQ5OTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICIxMiI6CisgICAgICBjYXNlICJob2x6dHJ1aGUiOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbnRfZmlsZT0iYXV0b2xvYWRlcnRydWhlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlaXM9NzQ5OTk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAiMTMiOgorICAgICAgY2FzZSAidml0cmluZSI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNudF9maWxlPSJ2aXRyaW5lIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlaXM9NDk5OTk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAiMTQiOgorICAgICAgY2FzZSAibGVzZXB1bHQiOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNudF9maWxlPSJsZXNlcHVsdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlaXM9NjAwMDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICByZXR1cm4gMDsgYnJlYWs7CisgICAgfQorICAgIGlmKCBtZW1iZXIoUkFCQVRULCBnZXRldWlkKFRQKSkgIT0gLTEgKSAgLy8gMTAlIFJhYmF0dCBmdWVyIGJlc3RpbW10ZSBMZXV0ZSwKKyAgICAgIHByZWlzPXByZWlzLzEwMCo5MDsgICAgICAgICAgICAgICAgICAgIC8vIGRpZSBJZGVlbiBmdWVyIGRlbiBMYWRlbiBiZWlzdGV1ZXJ0ZW4uCisgICAgaWYoICFFVE8tPlF1ZXJ5UHJvcCgidGVzdCIpICkKKyAgICB7CisgICAgICBpZiggIVRQLT5RdWVyeU1vbmV5KCkgKQorICAgICAgeworICAgICAgICB0ZWxsX3Jvb20oRVRPLCBCUygiT2huZSBHZWxkIGJla29tbWVuIFNpZSBiZWkgdW5zIG5pY2h0cywgIithbnJlZGUoKQorICAgICAgICAgICsiLiBXaXIgc2luZCBrZWluIFdvaGxmYWhydHNpbnN0aXR1dCEiLDc4LCBOYW1lKFdFUikrIiBzYWd0OiAiKSk7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgICAgaWYoIFRQLT5RdWVyeU1vbmV5KCkgPCBwcmVpcyApCisgICAgICB7CisgICAgICAgIHRlbGxfcm9vbShFVE8sIEJTKCBDQVAoYW5yZWRlKCkpKyIsIFNpZSBoYWJlbiB6dXdlbmlnIEdlbGQgZGFiZWkuICIKKyAgICAgICAgICArIkRlciBQcmVpcyBmdWVyIGRpZXNlcyBPYmpla3QgaXN0ICIrcHJlaXMKKyAgICAgICAgICArIiBNdWVuemVuLiIsNzgsIE5hbWUoV0VSKSsiIHNhZ3Q6ICIpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgICBUUC0+QWRkTW9uZXkoLXByZWlzKTsgICAgICAvLyBTcGllbGVyIEdlbGQgYWJ6aWVoZW4KKyAgICAgIFpFTlRSQUxCQU5LLT5QYXlJbihwcmVpcyk7IC8vIEdlbGQgYXVmIGRpZSBCYW5rLgorICAgIH0KKyAgICBjbnQ9Y2xvbmVfb2JqZWN0KCBMQURFTihjbnRfZmlsZSkgKTsKKyAgICBjbnQtPm1vdmUoemllbHJhdW0sIE1fUFVUfE1fU0lMRU5UKTsKKyAgICB0ZWxsX3Jvb20oRVRPLCBUUC0+TmFtZShXRVIpKyIga2F1ZnQgIitjbnQtPm5hbWUoV0VOKSsiLlxuIiwgKHtUUH0pICk7CisgICAgdGVsbF9yb29tKEVUTywgQlMoIkVzIGlzdCBlaW4gVmVyZ251ZWdlbiwgbWl0IElobmVuIEdlc2NoYWVmdGUgenUgbWFjaGVuLCAiCisgICAgICArYW5yZWRlKCkrIiEgV2VubiBTaWUgaW4gSWhyIEhhdXMgenVydWVja2tlaHJlbiwgd2VyZGVuIFNpZSBkaWUgV2FyZSBiZXJlaXRzICIKKyAgICAgICsidm9yZmluZGVuLCBzbyBzY2huZWxsIGFyYmVpdGVuIHdpci4iLDc4LCBOYW1lKFdFUikrIiBzYWd0OiAiKSk7CisgICAgdGVsbF9yb29tKHppZWxyYXVtLCBCUygiTWl0IEtuYWxsIHVuZCBTY2h3ZWZlbGR1ZnQgZXJzY2hlaW50IGVpbiBrbGVpbmVzLCAiCisgICAgICArInZlcmh1dHplbHRlcyBNYWVubmNoZW4uIEVzIHRyYWVndCBlaW5lbiBncnVlbmVuIEFuenVnIHVuZCBlaW5lIGdydWVuZSAiCisgICAgICArIkthcHBlLCBhdWYgZGVyIGluIGdlbGJlbSBTY2hyaWZ0enVnIFwiU0NIUkFFTktFUlwiIHN0ZWh0LiBEYXMgTWFlbm5jaGVuICIKKyAgICAgICsic3RlbGx0ICIrY250LT5uYW1lKFdFTikrIiBhYiB1bmQgdmVyc2Nod2luZGV0IGF1ZiBkZW0gZ2xlaWNoZW4gV2VnZSwgd2llICIKKyAgICAgICsiZXMgaGVyZWluZ2Vrb21tZW4gaXN0LiIpKTsKKyAgICBpZiggcHJlc2VudCgiSW50ZXJhY3RpdmUiLCBTQ0hSQU5LTUFTVEVSKSApCisgICAgICB0ZWxsX3Jvb20oU0NIUkFOS01BU1RFUiwgVFAtPk5hbWUoV0VSKSsiIGthdWZ0ICIrbmFtZShXRU4pKyIuXG4iKTsKKyAgICBTQ0hSQU5LTUFTVEVSLT5SZWdpc3RlckNudChjbnQsIGNudC0+UXVlcnlQcm9wKCJjbnRfdmVyc2lvbl9zdGQiKQorICAgICAgK2NudC0+UXVlcnlQcm9wKCJjbnRfdmVyc2lvbl9vYmoiKSwgZ2V0ZXVpZChUUCksCisgICAgICAgIi9kL3NlaGVyL2hhZXVzZXIvIitnZXRldWlkKFRQKSsicmF1bTAiKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBlbHNlIGlmKHF1ZXJ5X3dpel9sZXZlbChUUCkgPj0gTEVBUk5FUl9MVkwgKSAgLy8gVFAgaXN0IE1hZ2llci4KKyAgeworICAgIHRlbGxfcm9vbShFVE8sIEJTKCJUdXQgbWlyIGxlaWQsICIrYW5yZWRlKCkrIi4gQW4gTWFnaWVyIGxpZWZlcm4gd2lyIG5pY2h0cy4gIgorICAgICAgKyJEYXMgaXN0IGVpbiBQcmluemlwIGRlcyBIYXVzZXMsIHVuZCBQcmluemlwaWVuIHNpbmQgZGF6dSBkYSwgZGFzcyAiCisgICAgICArInNpZSBlaW5nZWhhbHRlbiB3ZXJkZW4uICIsNzgsIE5hbWUoV0VSKSsiIHNhZ3Q6ICIpKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBlbHNlICAvLyBUUCBpc3QgU3BpZWxlciwga2VpbiBTZWhlciBvZGVyIE1hZ2llci4KKyAgeworICAgIHRlbGxfcm9vbShFVE8sIEJTKCJUdXQgbWlyIGxlaWQsICIrYW5yZWRlKCkrIi4gV2lyIGxpZWZlcm4gbnVyIGFuIFNlaGVyLiAiCisgICAgICArIkFiZXIgZGEgaWNoIFNpZSBhbHMgc3RyZWJzYW1lIHVuZCBlcmZvbGdyZWljaGUgUGVyc29uIGFuc2VoZSwgIgorICAgICAgKyJiaW4gaWNoIHNpY2hlciwgZGFzcyB3aXIgdW5zIGJhbGQgd2llZGVyc2VoZW4hIiw3OCwgTmFtZShXRVIpKyIgc2FndDogIikpOworICAgIHJldHVybiAxOworICB9Cit9CmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL3ZpdHJpbmUuYyBiL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvdml0cmluZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNWJiOTYKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL3ZpdHJpbmUuYwpAQCAtMCwwICsxLDMzOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorVml0cmluZSBmdWVyIGRpZSBQb2thbGUKK0F1dG9yOiBNaXJpbAorbGV0enRlIEFlbmRlcnVuZzoKKzA1LjA5LjIwMTEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSAiL2QvZWJlbmUvbWlyaWwvZnJhdGVybml0YXMvZnJhdGVybml0YXMuaCIKKyNpbmNsdWRlICIvZC9lYmVuZS9taXJpbC9mcmF0ZXJuaXRhcy90cm9waHkuaCIKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHJ0dF9jaGVja3MKKyNpbmNsdWRlICIvZC9zZWhlci9oYWV1c2VyL21vZWJlbC9tb2ViZWwuaCIKKyNpbmNsdWRlICIvZC9zZWhlci9oYWV1c2VyL2hhdXMuaCIKKworaW5oZXJpdCBMQURFTigic3dpZnRfc3RkX2NvbnRhaW5lciIpOworCitzdHJpbmcgYmVzaXR6ZXI7CitpbnQgc3RhdWI7CitzdHJpbmcgKnRyb3BoeW5hbWVuOworCitzdGF0aWMgc3RyaW5nIG15X2xvbmcoKTsKK3N0YXRpYyBzdHJpbmcgc3RhdWJfZGVzY3IoKTsKK3ZvaWQgR2V0VHJvcGh5RGV0YWlscygpOworc3RyaW5nICpHZXRBbGxUcm9waHlOYW1lcygpOwordm9pZCBOZXVlRGV0YWlscygpOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSl7CisgICAgc2V0X25leHRfcmVzZXQoLTEpOworICAgIHJldHVybjsKKyAgfQorICBzZXRfbmV4dF9yZXNldCg4NjQwMCk7CisgIDo6Y3JlYXRlKCk7CisgIGJlc2l0emVyPSIiOworICBzdGF1Yj0wOworICBTZXRQcm9wKFBfTkFNRSwiVml0cmluZSIpOworICBTZXRQcm9wKFBfU0hPUlQsIkVpbmUgVml0cmluZSIpOworICBTZXQoUF9MT05HLCMnbXlfbG9uZyxGX1FVRVJZX01FVEhPRCk7CisgIFNldFByb3AoUF9HRU5ERVIsRkVNQUxFKTsKKyAgU2V0UHJvcChQX01BVEVSSUFMLChbTUFUX0dMQVNTOjUwLE1BVF9FQk9OWTo1MF0pKTsKKyAgU2V0UHJvcChQX1ZBTFVFLDEwMDAwKTsKKyAgU2V0UHJvcChQX1dFSUdIVCw1MDAwMDApOworICBTZXRQcm9wKFBfTUFYX09CSkVDVFMsMCk7CisgIFNldFByb3AoUF9NQVhfV0VJR0hULDApOworICBTZXRQcm9wKEhfRlVSTklUVVJFLDEpOworICBTZXRQcm9wKFBfTk9HRVQsIkRpZSBWaXRyaW5lIGlzdCB2aWVsIHp1IHNjaHdlci5cbiIpOworICBTZXRQcm9wKCJjbnRfdmVyc2lvbl9vYmoiLDIpOworICBHZXRUcm9waHlEZXRhaWxzKCk7CisgIEFkZElkKCh7IlxubWlyaWxfcG9rYWxfdml0cmluZSIsInZpdHJpbmUifSkpOworCisgIE5ldWVEZXRhaWxzKCk7CisKKyAgQWRkQ21kKCh7InNhZXViZXJlIiwic2FldWJlciIsInJlaW5pZ2UiLCJyZWluaWciLCJtYWNoIiwibWFjaGUifSksCisgICAgICAgICAgICJzYWV1YmVyX2NtZCIpOworCisgIEFkZENtZCgoeyJzdGVsbGUiLCJzdGVsbCJ9KSwic3RlbGxfY21kIik7CisgIFJlbW92ZUNtZCgoeyJzZXJsYXViZSJ9KSk7CisKK30KKwordm9pZCByZXNldCgpeworICArK3N0YXViOworICBzZXRfbmV4dF9yZXNldCg4NjQwMCk7CisgIDo6cmVzZXQoKTsKKyAgcmV0dXJuOworfQorCit2b2lkIFNldEJlc2l0emVyKHN0cmluZyB1aWQsc3RyaW5nIHV1aWQpeworICBiZXNpdHplcj11dWlkOworICBHZXRUcm9waHlEZXRhaWxzKCk7CisgIHJldHVybjsKK30KKworc3RyaW5nIFF1ZXJ5QmVzaXR6ZXIoKXsKKyAgcmV0dXJuIGJlc2l0emVyOworfQorCit2b2lkIE5ldWVEZXRhaWxzKCl7CisgIEFkZERldGFpbCgoeyJob2x6IiwiZWJlbmhvbHoifSksQlMoIkRpZSBWaXRyaW5lIGJlc3RlaHQgdGVpbHdlaXNlICIKKyAgICAiYXVzIEViZW5ob2x6LiBUdWVyZW4sIERlY2tlbCB1bmQgRWlubGVnZWJvZWRlbiBzaW5kIGF1cyBHbGFzLiIpKTsKKyAgQWRkRGV0YWlsKCh7InR1ZXJlbiIsInR1ZXIiLCJnbGFzdHVlcmVuIiwiZ2xhc3R1ZXIiLCJkZWNrZWwifSksQlMoCisgICAgICAgICAgICAiRHVyY2ggZGFzIEdsYXMga2FubnN0IER1IGlucyBJbm5lcmUgZGVyIFZpdHJpbmUgZ3Vja2VuLiIpKTsKKyAgQWRkRGV0YWlsKCh7ImlubmVyZXMiLCJnZWdlbnN0YWVuZGUiLCJnZWdlbnN0YW5kIn0pLAorICAgICAgICAgICAgQlMoIkRvcnQga2FubiBtYW4gUG9rYWxlIGhpbmVpbnN0ZWxsZW4sIGFiZXIgbmljaHQgd2llZGVyICIKKyAgICAgICAgICAgICJoZXJhdXNuZWhtZW4uIikpOworICBBZGREZXRhaWwoKHsiZ2xhcyIsInNjaGVpYmUiLCJzY2hlaWJlbiJ9KSwKKyAgICAgQlMoIkdsYXMgaXN0IHByYWt0aXNjaCwgc29sYW5nZSBlcyBzYXViZXIgaXN0OiAiCisgICAgICAgICJNYW4ga2FubiBkYWR1cmNoIGlucyBJbm5lcmUgc2NoYXVlbi4iKSk7CisgIEFkZERldGFpbCgoeyJyZWloZSIsInBsYXR6IiwiZWlubGVnZWJvZWRlbiIsImVpbmxlZ2Vib2RlbiIsImJvZWRlbiIsCisgICAgICAgICAgICAgICJib2RlbiJ9KSwKKyAgICAgICAgICAgQlMoIkRpZSB2aWVsZW4gQm9lZGVuIGJpZXRlbiBQbGF0eiBmdWVyIHZpZWxlIFBva2FsZSEiKSk7CisgIHJldHVybjsKK30KKworCitzdGF0aWMgc3RyaW5nIG15X2xvbmcoKXsKKyAgaWYoc3RhdWI8MjEpCisgIHJldHVybiBCUygKKyAgIkRpZSBzY2hsaWNodGUgVml0cmluZSBhdXMgZHVua2xlbSBIb2x6IGVpZ25ldCBzaWNoIGhlcnZvcnJhZ2VuZCwgdW0gIgorICAid2VydHZvbGxlIEdlZ2Vuc3RhZW5kZSBkYXJpbiBhdXN6dXN0ZWxsZW4uIEhpbnRlciBkZW4gYmVpZGVuIEdsYXN0dWVyZW4gIgorICAic2llaHN0IER1IGVpbmUgUmVpaGUgdm9uIEVpbmxlZ2Vib2VkZW4sIGRpZSBlYmVuZmFsbHMgYXVzIEdsYXMgYmVzdGVoZW4uICIrCisgIHN0YXViX2Rlc2NyKCkpOworICBlbHNlIHJldHVybiBCUyhzdGF1Yl9kZXNjcigpKTsKK30KKworCitzdGF0aWMgc3RyaW5nIHN0YXViX2Rlc2NyKCl7CisgIHN0cmluZyB0ZXh0OworICB0ZXh0PSIiOworICBzd2l0Y2goc3RhdWIpeworICAgIGNhc2UgMC4uMToKKyAgICAgIHRleHQ9CisgICAgICAgICJEaWUgVml0cmluZSBpc3QgaGVydm9ycmFnZW5kIGdlcGZsZWd0LiBEdSBzaWVoc3Qga2VpbmVybGVpIFN0YXViICIrCisgICAgICAgICJkYXJpbiwgdW5kIGRpZSBTY2hlaWJlbiBzaW5kIHZvZWxsaWcga2xhci5cbiI7CisgICAgICAgIEFkZERldGFpbCgoeyJzdGF1YiJ9KSxCUygiS2VpbmVyIHp1IHNlaGVuLiIpKTsKKyAgICBicmVhazsKKyAgICBjYXNlIDIuLjQ6CisgICAgICB0ZXh0PQorICAgICAgICAiRGllIFZpdHJpbmUgaXN0IGd1dCBnZXBmbGVndC4gRXMgbGllZ3Qga2F1bSBTdGF1YiBkYXJpbiwgdW5kIGRpZSAiKworICAgICAgICAiVHVlcmVuIHNpbmQga2xhci5cbiI7CisgICAgICAgIEFkZERldGFpbCgoeyJzdGF1YiJ9KSxCUygiTWFuIHNpZWh0IG51ciB3ZW5pZyBkYXZvbi4iKSk7CisgICAgYnJlYWs7CisgICAgY2FzZSA1Li43OgorICAgICAgdGV4dD0KKyAgICAgICAgIkRpZSBWaXRyaW5lIGlzdCBpbiBlaW5lbSBvcmRlbnRsaWNoZW4gWnVzdGFuZCwgYWxsZXJkaW5ncyBzYW1tZWx0ICIrCisgICAgICAgICJzaWNoIHNvIGxhbmdzYW0gU3RhdWIgYXVmIGRlbiBFaW5sZWdlYm9lZGVuLlxuIjsKKyAgICAgICAgQWRkRGV0YWlsKCh7InN0YXViIn0pLEJTKCJTbyBsYW5nc2FtIGtvZW5udGUgbWFuIGRpZSAiCisgICAgICAgICJWaXRyaW5lIHNhZXViZXJuISIpKTsKKyAgICAgICAgQWRkRGV0YWlsKCh7Inp1c3RhbmQifSksQlMoIk5vY2ggaXN0IGVyIG9yZGVudGxpY2guIikpOworICAgIGJyZWFrOworICAgIGNhc2UgOC4uMTA6CisgICAgICB0ZXh0PQorICAgICAgICAiRGllIFZpdHJpbmUgd2lya3Qgc2Nob24gZXR3YXMgc3RhdWJpZy4gTWFuIGVya2VubnQgYXVjaCwgZGFzcyAiKworICAgICAgICAiZGVyIGVpbiBvZGVyIGFuZGVyZSBGaW5nZXJhYmRydWNrIGRpZSBUdWVyZW4gemllcnQuIjsKKyAgICAgICAgQWRkRGV0YWlsKCh7InN0YXViIiwiZmluZ2VyYWJkcnVjayIsInR1ZXJlbiIsImdsYXN0dWVyZW4iLAorICAgICAgICAiZGVja2VsIiwiZ2xhc3R1ZXIiLCJ0dWVyIiwienVzdGFuZCJ9KSwKKyAgICAgICAgQlMoIkVzIGxvaG50IHNpY2ggamV0enQgc2Nob24sIGRpZSBWaXRyaW5lIHp1IHNhZXViZXJuLiIpKTsKKyAgICBicmVhazsKKyAgICBjYXNlIDExLi4xNToKKyAgICAgIHRleHQ9CisgICAgICAgICJEdSBoYXN0IGRlbiBFaW5kcnVjaywgZGFzcyBkaWUgVml0cmluZSBsYW5nc2FtIGVpbm1hbCBnZXNhZXViZXJ0ICIrCisgICAgICAgICJ3ZXJkZW4ga29lbm50ZS4gRGllIEVpbmxlZ2Vib2VkZW4gc2luZCBzdGF1YmlnIHVuZCB6YWhscmVpY2hlICIrCisgICAgICAgICJGaW5nZXJhYmRydWVja2Ugc2luZCBhdWYgZGVuIEdsYXN0dWVyZW4genUgc2VoZW4uIjsKKyAgICBicmVhazsKKyAgICBjYXNlIDE2Li4yMDoKKyAgICAgIHRleHQ9CisgICAgICAgICJEaWUgVml0cmluZSBtYWNodCBlaW5lbiByZWNodCB1bmdlcGZsZWd0ZW4gRWluZHJ1Y2suIElubmVuIGlzdCAiKworICAgICAgICAic2llIHNjaG9uIHNlaHIgdmVyc3RhdWJ0IHVuZCBhdWNoIGRpZSBUdWVyZW4gc2luZCBzY2hvbiByZWNodCAiKworICAgICAgICAiZHJlY2tpZyBnZXdvcmRlbi4iOworICAgICAgICBBZGREZXRhaWwoKHsic3RhdWIifSksQlMoIk51biB3aXJkIGVzIGFiZXIgd2lya2xpY2ggWmVpdCwgZGllICIKKyAgICAgICAgIlZpdHJpbmUgenUgc2FldWJlcm4uIFNvbnN0IHNpZWh0IG1hbiBiYWxkIG5pY2h0cyBtZWhyIGRhcmluLiIpKTsKKyAgICBicmVhazsKKyAgICBjYXNlIDIxLi4yNToKKyAgICAgIHRleHQ9CisgICAgICAgICJEaWUgVml0cmluZSBpc3QgdG90YWwgenVnZXN0YXVidC4gVWViZXIgZGVuIEdsYXN0dWVyZW4gc2luZCAiKworICAgICAgICAiZXJzdGUgU3Bpbm53ZWJlbiB6dSBlcmtlbm5lbiB1bmQgZGllIFNjaGVpYmVuIHNpbmQgc2Nob24gZmFzdCAiKworICAgICAgICAiYmxpbmQgdm9uIGFsbCBkZW4gRmluZ2VyYWJkcnVlY2tlbiB1bmF1Zm1lcmtzYW1lciBHYWVzdGUuIjsKKyAgICAgICAgIFJlbW92ZURldGFpbChtX2luZGljZXMoUXVlcnlQcm9wKFBfREVUQUlMUykpKTsKKyAgICAgICAgIEFkZERldGFpbCgoeyJzcGlubndlYmVuIiwiZHJlY2siLCJ2aXRyaW5lIiwiZ2xhc3R1ZXJlbiIsImdsYXN0dWVyIiwKKyAgICAgICAgICJ0dWVyZW4iLCJ0dWVyIiwic2NoZWliZSIsInNjaGVpYmVuIiwiZGVja2VsIn0pLAorICAgICAgICAgIlVudGVyIGRlbSBnYW56ZW4gRHJlY2sgaXN0IGxlaWRlciBuaWNodHMgbWVociB6dSBlcmtlbm5lbi5cbiIpOworICAgICAgICAgQWRkRGV0YWlsKCh7ImdhZXN0ZSIsImdhc3QiLCJmaW5nZXJhYmRydWNrIiwiZmluZ2VyYWJkcnVlY2tlIn0pLAorICAgICAgICAgIkRpZSBHYWVzdGUgc2luZCBzaWNoZXIgc2NodWxkIGFuIGRlbSBEcmVjay5cbiIpOworICAgIGJyZWFrOworICAgIGNhc2UgMjYuLjMwOgorICAgICAgdGV4dD0KKyAgICAgICAgIkR1IGthbm5zdCBkaWUgVml0cmluZSB1bnRlciBkZXIgZGlja2VuIFN0YXVic2NoaWNodCBrYXVtIG5vY2ggIisKKyAgICAgICAgImVya2VubmVuIHVuZCBkaWUgR2xhc3R1ZXJlbiBzaW5kIGJsaW5kIGdld29yZGVuLiI7CisgICAgICAgICBBZGREZXRhaWwoKHsic3RhdWJzY2hpY2h0Iiwic2NoaWNodCJ9KSwKKyAgICAgICAgIEJTKCJEaWUgaXN0IHZlcmRhbW10IGRpY2sgdW5kIHVuZHVyY2hzaWNodGlnLiIpKTsKKyAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGV4dD0KKyAgICAgICAgIkRhc3Mgc2ljaCB1bnRlciBkaWVzZXIgQW5zYW1tbHVuZyB2b24gU3Bpbm53ZWJlbiB1bmQgU3RhdWIgbm9jaCAiKworICAgICAgICAiZWluZSBWaXRyaW5lIG1pdCBHbGFzdHVlcmVuIHZlcmJlcmdlbiBzb2xsLCBrYW5uc3QgRHUga2F1bSBnbGF1YmVuLiAiKworICAgICAgICAiSmVkZW5mYWxscyBrYW5uIG1hbiBkdXJjaCBkaWUgdm9lbGxpZyBibGluZGVuIFNjaGVpYmVuIG5pY2h0cyAiKworICAgICAgICAibWVociBlcmtlbm5lbi4iOworICAgICAgQWRkRGV0YWlsKCh7ImRyZWNrIiwic3Bpbm53ZWJlbiIsInN0YXViIiwiYW5zYW1tbHVuZyJ9KSwiUGZ1aSBEZWliZWwhXG4iKTsKKyAgfQorICByZXR1cm4gdGV4dDsKK30KKworc3RhdGljIGludCBzYWV1YmVyX2NtZChzdHJpbmcgc3RyKXsKKyAgc3RyaW5nIHRleHQ7CisgIGlmKCFzdHIpIHJldHVybiAwOworICBpZihzdHJzdHIoc3RyLCJ2aXRyaW5lIik8MCkgcmV0dXJuIDA7CisgIHN3aXRjaChzdGF1Yil7CisgICAgY2FzZSAwOgorICAgICAgd3JpdGUoIkRhcyBpc3Qgbm9jaCBuaWNodCBub2V0aWchXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgIGJyZWFrOworICAgIGNhc2UgMS4uMjA6CisgICAgICB0ZXh0PSJEdSByZWluaWdzdCBkaWUgVml0cmluZSBncnVlbmRsaWNoLiBEYXMgd3VyZGUgYXVjaCBsYW5nc2FtICIKKyAgICAgICJaZWl0ISI7CisgICAgICBpZihnZXR1dWlkKFRQKSE9YmVzaXR6ZXIpCisgICAgICAgIHRleHQrPSJEdSBmcmFnc3QgRGljaCwgd2llc28gRHUgZnJlbWRlIE1vZWJlbCByZWluaWdzdC4iOworCisgICAgICB3cml0ZShCUyh0ZXh0KSk7CisgICAgICBzYXkoQlMoVFBOKyIgcmVpbmlndCBkaWUgVml0cmluZSBncnVlbmRsaWNoLiBEYXMgd3VyZGUgYXVjaCBsYW5nc2FtICIKKyAgICAgICJaZWl0IVxuIiksVFApOworICAgICAgc3RhdWI9MDsgLy9IaWVyIGRhcmYgbm9jaCBqZW1hbmQgaGVsZmVuIQorICAgIGJyZWFrOworICAgIGNhc2UgMjEuLjMwOgorICAgICAgdGV4dD0iRHUgYmVnaW5uc3QgZGllIFZpdHJpbmUgenUgcmVpbmlnZW4uICI7CisgICAgICBpZihnZXR1dWlkKFRQKSE9YmVzaXR6ZXIpeworICAgICAgICB0ZXh0Kz0iTmFjaCBlaW5pZ2VyIFplaXQgZnJhZ3N0IER1IERpY2gsIG9iIER1IGVpZ2VudGxpY2ggc3Bpbm5zdCwgIisKKyAgICAgICAgImRlbm4gZGFzIGlzdCB1ZWJlcmhhdXB0IG5pY2h0IERlaW5lIFZpdHJpbmUuIER1IGxhZXNzdCB2b24gZGVtICIrCisgICAgICAgICJWb3JoYWJlbiB3aWVkZXIgYWIuIjsKKyAgICAgICAgc2F5KEJTKFRQTisiIGZhZW5ndCBrdXJ6IGFuLCBkaWUgVml0cmluZSB6dSByZWluaWdlbiwgbGFlc3N0IGVzIGFiZXIgIgorICAgICAgICAic2NobmVsbCB3aWVkZXIgc2Vpbi4iKSxUUCk7CisgICAgICB9CisgICAgICBlbHNleworICAgICAgICB0ZXh0Kz0iRGFzIGRhdWVydCBlaW5lIGdhbnplIFdlaWxlLCBhYmVyIGRhbm4gc3RyYWhsdCBkaWUgVml0cmluZSAiCisgICAgICAgICJ3aWVkZXIuIjsKKyAgICAgICAgc2F5KEJTKFRQTisiIGJlZ2lubnQgZGllIFZpdHJpbmUgenUgcmVpbmlnZW4uIERhcyBkYXVlcnQgZWluZSBnYW56ZSAiCisgICAgICAgICJXZWlsZSwgYWJlciBkYW5uIHN0cmFobHQgc2llIHdpZWRlci4iKSxUUCk7CisgICAgICAgIHN0YXViPTA7CisgICAgICB9CisgICAgICB3cml0ZShCUyh0ZXh0KSk7CisgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGlmKGdldHV1aWQoVFApIT1iZXNpdHplcikKKyAgICAgICAgd3JpdGUoIkRhcyBkcmVja2lnZSBUZWlsIGZhc3N0IER1IG5pY2h0IGFuIVxuIik7CisgICAgICBlbHNleworICAgICAgICB3cml0ZShCUygKKyAgICAgICAgICAiRHUgc2NocnViYnN0IHVuZCBzY2hydWJic3QgdW5kIGVzIHNjaGVpbnQga2VpbiBFbmRlIHp1IG5laG1lbi4gIgorICAgICAgICAgICJBbHMgRHUgc2Nob24gbGFuZ3NhbSBhdWZnZWJlbiB3aWxsc3QsIGlzdCBzbyBsYW5nc2FtIGVpbiBrbGVpbmVyICIKKyAgICAgICAgICAiRXJmb2xnIHp1IHNlaGVuLiBEdSBuaW1tc3QgRGlyIHZvciwgZGllIFZpdHJpbmUgaW4gWnVrdW5mdCAiCisgICAgICAgICAgImhhZXVmaWdlciB6dSByZWluaWdlbiEiKSk7CisgICAgICAgIHNheShCUygKKyAgICAgICAgICBUUE4rIiBzY2hydWJidCBzdHVuZGVubGFuZyBhbiBkZXIgVml0cmluZSBydW0sIGJpcyBzaWUgZW5kbGljaCAiCisgICAgICAgICAgIndpZWRlciByaWNodGlnIHNhdWJlciBpc3QuIiksVFApOworICAgICAgICBzdGF1Yj0wOworICAgICAgfQorICB9CisgIGlmKHN0YXViPT0wKXsKKyAgICBSZW1vdmVEZXRhaWwobV9pbmRpY2VzKFF1ZXJ5UHJvcChQX0RFVEFJTFMpKSk7CisgICAgR2V0VHJvcGh5RGV0YWlscygpOworICAgIE5ldWVEZXRhaWxzKCk7CisgICB9CisgIHJldHVybiAxOworfQorCit2b2lkIEdldFRyb3BoeURldGFpbHMoKXsKKyAgc3RyaW5nICp0cm9waHlsaXN0ZSwqc2hvcnRzOworICBtYXBwaW5nIHRyb3BoeWRldGFpbHM7CisKKyAgc2hvcnRzPSh7fSk7CisKKyAgdHJvcGh5bGlzdGU9TUlSSUxfVFJPUEhZTUFTVEVSLT5HZXRQbGFjZWRUcm9waGllcyhiZXNpdHplcik7CisKKyAgZm9yZWFjaCggc3RyaW5nIHRyIDogdHJvcGh5bGlzdGUgKQorICAgIHNob3J0cys9KHsgTUlSSUxfVFJPUEhZTUFTVEVSLT5HZXRUcm9waHlTaG9ydCh0cikgfSk7CisKKyAgc2hvcnRzID0gc29ydF9hcnJheShzaG9ydHMsICMnPik7CisgIGlmKCFzaXplb2Yoc2hvcnRzKSkKKyAgICBBZGREZXRhaWwoKHsicG9rYWxlIiwicG9rYWwiLCJpbiB2aXRyaW5lIn0pLAorICAgICAgICAgICAgICAgICJCaXNsYW5nIGlzdCBkaWUgVml0cmluZSBub2NoIGxlZXIuXG4iKTsKKyAgZWxzZQorICBBZGREZXRhaWwoKHsicG9rYWxlIiwicG9rYWwiLCJpbiB2aXRyaW5lIn0pLAorICAgICJEdSBzaWVoc3QgZm9sZ2VuZGUgUG9rYWxlIGluIGRlciBWaXRyaW5lOlxuIgorICAgICtpbXBsb2RlKHNob3J0cywiLlxuIikrIi5cbiIpOworCisgIGZvcmVhY2goIHN0cmluZyB0ciA6IHRyb3BoeWxpc3RlICkKKyAgeworICAgIEFkZERldGFpbCggTUlSSUxfVFJPUEhZTUFTVEVSLT5HZXRUcm9waHlJZHModHIpLAorICAgICAgICAgICAgICAgQlMoTUlSSUxfVFJPUEhZTUFTVEVSLT5HZXRUcm9waHlMb25nKHRyKSkpOworCisgICAgdHJvcGh5ZGV0YWlscyA9IE1JUklMX1RST1BIWU1BU1RFUi0+R2V0VHJvcGh5RGV0YWlscyh0cik7CisgICAgaWYgKCAhc2l6ZW9mKHRyb3BoeWRldGFpbHMpICkKKyAgICAgIGNvbnRpbnVlOworICAgIGZvcmVhY2ggKCBtaXhlZCBkZXQsIHN0cmluZyBkZXRfZGVzYyA6IHRyb3BoeWRldGFpbHMgKQorICAgICAgQWRkRGV0YWlsKCBkZXQsIEJTKGRldF9kZXNjKSApOworICB9CisgIHJldHVybjsKK30KKworc3RyaW5nICpHZXRBbGxUcm9waHlOYW1lcygpeworICBpbnQgaSxhbnphaGw7CisgIHN0cmluZyAqdHJvcGh5bmFtZW47CisKKyAgdHJvcGh5bmFtZW49KHt9KTsKKworICBmb3JlYWNoKHN0cmluZyBibGE6TUlSSUxfVFJPUEhZTUFTVEVSLT5HZXRUcm9waHlMaXN0ZSgpKQorICAgIHRyb3BoeW5hbWVuKz1NSVJJTF9UUk9QSFlNQVNURVItPkdldFRyb3BoeUlkcyhibGEpOworCisgIHJldHVybiB0cm9waHluYW1lbjsKK30KKworc3RhdGljIGludCBzdGVsbF9jbWQoc3RyaW5nIHN0cil7CisgIHN0cmluZyB3YXMsaWRlbnRpZmllcjsKKyAgaW50IHJlc3VsdGF0OworICBvYmplY3Qgb2I7CisgIGlmKCFzdHIpIHJldHVybiAwOworICBpZihzdHJzdHIoc3RyLCJ2aXRyaW5lIik8MCkgcmV0dXJuIDA7CisgIG5vdGlmeV9mYWlsKCJEYXMgaXN0IG5pY2h0IERlaW5lIFZpdHJpbmUhXG4iKTsKKyAgaWYoZ2V0dXVpZChUUCkhPWJlc2l0emVyKQorICAgIHJldHVybiAwOworICBub3RpZnlfZmFpbCgiRGllIFN5bnRheCBpc3Q6IHN0ZWxsZSA8Z2VnZW5zdGFuZD4gaW4gdml0cmluZSFcbiIpOworICBpZihzc2NhbmYoc3RyLCIlcyBpbiB2aXRyaW5lIix3YXMpIT0xKQorICAgIHJldHVybiAwOworCisgIG5vdGlmeV9mYWlsKCJEaWUgVml0cmluZSBzb2xsdGUgc2Nob24gb2ZmZW4gc2Vpbi5cbiIpOworICBpZihRdWVyeVByb3AoUF9DTlRfU1RBVFVTKSE9Q05UX1NUQVRVU19PUEVOICYmICFJU19MRUFSTkVSKFRQKSkKKyAgICByZXR1cm4gMDsKKyAgbm90aWZ5X2ZhaWwoIkR1IHNvbGx0ZXN0IGRpZSBWaXRyaW5lIHZvcmhlciBlcnN0bWFsIHNhZXViZXJuIVxuIik7CisgIGlmKHN0YXViPjIwKQorICAgIHJldHVybiAwOworICBub3RpZnlfZmFpbCgiRGFzIGthbm5zdCBEdSBsZWlkZXIgbmljaHQgaW4gZGllIFZpdHJpbmUgc3RlbGxlbiFcbiIpOworICBpZihtZW1iZXIoR2V0QWxsVHJvcGh5TmFtZXMoKSxsb3dlcl9jYXNlKHdhcykpPDAKKyAgICAgJiYgbG93ZXJfY2FzZSh3YXMpIT0icG9rYWwiKQorICAgIHJldHVybiAwOworICBub3RpZnlfZmFpbCgiRGFzIGhhc3QgRHUgbmljaHQhXG4iKTsKKyAgaWYoIW9iPXByZXNlbnQod2FzLFRQKSkKKyAgICByZXR1cm4gMDsKKyAgbm90aWZ5X2ZhaWwoIkRhcyBrYW5uc3QgRHUgbGVpZGVyIG5pY2h0IGluIGRpZSBWaXRyaW5lIHN0ZWxsZW4hXG4iKTsKKyAgaWYoIW9iLT5pZCgiXG5taXJpbF9wb2thbCIpKQorICAgIHJldHVybiAwOworCisgIGlkZW50aWZpZXI9b2ItPlF1ZXJ5SWRlbnRpZmllcigpOworICByZXN1bHRhdD1NSVJJTF9UUk9QSFlNQVNURVItPlBsYWNlVHJvcGh5KGdldHV1aWQoVFApLGlkZW50aWZpZXIpOworCisgIG5vdGlmeV9mYWlsKCJIaWVyIHN0aW1tdCBldHdhcyBuaWNodCwgc2FnIGJpdHRlIGVpbmVtIEVyem1hZ2llciBCZXNjaGVpZCEgIgorICAiUmVzdWx0YXQ9IityZXN1bHRhdCsiXG4iKTsKKyAgaWYocmVzdWx0YXQhPTEpCisgICAgcmV0dXJuIDA7CisgIHdyaXRlKEJTKCJEdSBzdGVsbHN0IGRlbiBQb2thbCBpbiBkaWUgVml0cmluZSB1bmQgYmV3dW5kZXJzdCBpaG4gbm9jaCBlaW4gIgorICAid2VuaWcuXG4iKSk7CisgIHNheShUUE4rIiBzdGVsbHQgZWluZW4gUG9rYWwgaW4gZGllIFZpdHJpbmUuXG4iLFRQKTsKKyAgR2V0VHJvcGh5RGV0YWlscygpOworICBvYi0+cmVtb3ZlKCk7CisgIGlmKG9iKQorICAgIGRlc3RydWN0KG9iKTsKKyAgcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvd2FmZmVuc2NocmFuay5jIGIvZC9zZWhlci9oYWV1c2VyL21vZWJlbC93YWZmZW5zY2hyYW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM2YWJjOQotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvd2FmZmVuc2NocmFuay5jCkBAIC0wLDAgKzEsMjIwIEBACisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBOYW1lIGRlcyBPYmplY3RzOiAgICBXYWZmZW5zY2hyYW5rCisvLyBMZXR6dGUgQWVuZGVydW5nOiAgICAyMi4wMy4yMDAxCisvLyBNYWdpZXI6ICAgICAgICAgICAgICBTd2lmdAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogQ2hhbmdlbG9nCisgICAqIDIxLjA1LjIwMDcsIFplc3N0cmEKKyAgICAgS2FtcGZzdGFlYmUgYXVmIEhpbndlaXMgdm9uIHRhc3NyYW0gZXJnYWVuenQuCisqLworI3ByYWdtYSBzdHJvbmdfdHlwZXMscnR0X2NoZWNrcworCisjaW5jbHVkZSAic2NocmFua2xhZGVuLmgiCisjaW5jbHVkZSA8YW5zaS5oPgorI2luY2x1ZGUgPGNsYXNzLmg+Citpbmhlcml0IExBREVOKCJzd2lmdF9zdGRfY29udGFpbmVyIik7CisKKyNkZWZpbmUgVkVSU0lPTl9PQkogIjYiCisKK3N0cmluZyBzdHJhbGw7CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgIGlmICghY2xvbmVwKFRPKSkgcmV0dXJuOworICBzd2lmdF9zdGRfY29udGFpbmVyOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX1NIT1JULCAiRWluIFdhZmZlbnNjaHJhbmsiKTsKKyAgU2V0UHJvcChQX0xPTkcsIEJTKAorICAgICAiTWl0IGRlbiBXYWZmZW4sIGRpZSBpbiBkaWVzZW4gbWFzc2l2ZW4gSG9senNjaHJhbmsgcGFzc2VuLCBrb2VubnRlc3QgIgorICAgICsiRHUgZWluIGdhbnplcyBTb2VsZG5lcmhlZXIgYXVzcnVlc3Rlbi4gRnVlciBqZWRlIFdhZmZlbmdhdHR1bmcgZ2lidCAiCisgICAgKyJlcyBlaW5lbiBlaWdlbmVuIFBsYXR6LCBkYW1pdCBtYW4gYXVjaCBhbGxlcyBnbGVpY2ggZmluZGV0LCBzb2xsdGUgIgorICAgICsibWFuIGVzIGJyYXVjaGVuLiIpKyJAQGNudF9zdGF0dXNAQCIpOworICBBZGRJZCgoeyJ3YWZmZW5zY2hyYW5rIiwgImhvbHpzY2hyYW5rIiwgInNjaHJhbmsifSkpOworICBTZXRQcm9wKCJjbnRfdmVyc2lvbl9vYmoiLCBWRVJTSU9OX09CSik7CisgIFNldFByb3AoUF9OQU1FLCAiV2FmZmVuc2NocmFuayIpOworICBTZXRQcm9wKFBfR0VOREVSLCBNQUxFKTsKKyAgU2V0UHJvcChQX1dFSUdIVCwgNTAwMCk7ICAgICAgICAgLy8gR2V3aWNodCA1IEtnCisgIFNldFByb3AoUF9NQVhfV0VJR0hULCAxMDAwMDAwKTsgIC8vIEVzIHBhc3NlbiBmdWVyIDEwMDAga2cgU2FjaGVuIHJlaW4uCisgIFNldFByb3AoUF9XRUlHSFRfUEVSQ0VOVCwgMTAwKTsgIC8vIERhZnVlciBtYWNodCBlciBhdWNoIG5peCBsZWljaHRlciA6KQorICBTZXRQcm9wKFBfTUFYX09CSkVDVFMsIDEwMCk7ICAgICAvLyBNZWhyIHNvbGx0ZSBuaWNodCBzZWluLCBsdC4gVGlhbWFrLgorICBTZXRQcm9wKFBfVkFMVUUsIDApOyAgICAgICAgICAgICAvLyBLZWluIG1hdGVyaWVsbGVyIFdlcnQuIElzdCBlaCBuaWNodCB2ZXJrYXVmYmFyLgorICBTZXRQcm9wKFBfTk9CVVksIDEpOyAgICAgICAgICAgICAvLyBXaXJkIGltIExhZGVuIHplcnN0b2VydCwgZmFsbHMgZXIgdmVya2F1ZnQgd2lyZC4KKyAgU2V0UHJvcChQX05PR0VULCAiRGFzIGdlaHQgbmljaHQuICIrTmFtZShXRVIsMSkrIiBoYWZ0ZXQgd2llIG1hZ2lzY2ggYW0gQm9kZW4uXG4iKTsKKyAgU2V0UHJvcChQX01BVEVSSUFMLCAoe01BVF9NSVNDX1dPT0QsIE1BVF9NSVNDX01BR0lDfSkgKTsKKyAgU2V0UHJvcChQX0lORk8sICJWZXJzdWNocyBtYWwgbWl0OiBcInNrb21tYW5kb3MgIitRdWVyeVByb3AoUF9JRFMpWzFdKyJcIiAhXG4iKTsKKyAgU2V0UHJvcCgib2JqX2NtZCIsICJzbGlzdGUgW09iamVrdC1JZF0gW1dhZmZlbnR5cHxcImFsbGVzXCJdXG4iCisgICAgKyIgIFdhZmZlbnR5cGVuOiBTY2h3ZXJ0ZXIsIFNwZWVyZSwgQWV4dGUsIEtldWxlbiwgS2FtcGZzdGFlYmUsIE1lc3NlciwgUGVpdHNjaGVuLFxuIgorICAgICsiICAgICAgICAgICAgICAgRmVybndhZmZlbiwgTXVuaXRpb24sIFNvbnN0aWdlcywgVW56dW9yZGJhclxuIik7CisKKyAgQUQoKHsicGxhdHoifSksIEJTKCJEZXIgU2NocmFuayBiaWV0ZXQgUGxhdHogZnVlciBqZWRlIGVyZGVua2xpY2hlICIKKyAgICArIldhZmZlbmdhdHR1bmcuIikpOworCisgIEFkZENtZCgoeyJzbGlzdGUifSksICJhdWZsaXN0dW5nIik7Cit9CisKK3ZhcmFyZ3MgaW50IFByZXZlbnRJbnNlcnQob2JqZWN0IG9iKQoreworICAvLyBLZWluZSBXYWZmZT8gSGF0IGluIGRpZXNlbSBDb250YWluZXIgbml4IHZlcmxvcmVuIQorICBpZiggIW9iLT5RdWVyeVByb3AoUF9XRUFQT05fVFlQRSkgJiYgIW9iLT5RdWVyeVByb3AoUF9XQykgJiYKKyAgICAgICFvYi0+aWQoIlxuQnVtZXJhbmciKSAmJiAhb2ItPmlzX2NsYXNzX21lbWJlcihDTF9BTU1VTklUSU9OKSAmJgorICAgICAgIW9iLT5pZCgiXG5nb3JzZWlscGZlaWwiKSApCisgIHsKKyAgICB3cml0ZSggQlMoIkluICIrbmFtZShXRU4sMSkrIiBrYW5uc3QgRHUgbnVyIFdhZmZlbiArIE11bml0aW9uIGxlZ2VuISIpKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBlbHNlCisgICAgcmV0dXJuIDo6UHJldmVudEluc2VydChvYik7Cit9CisKK2ludCBhdWZsaXN0dW5nMihzdHJpbmcgd2FzLCBzdHJpbmcgbmZfc3RyMSwgc3RyaW5nIG5mX3N0cjIsIGludCBhbGxlcykKK3sKKyAgc3RyaW5nIG9ic2hvcnQsIHN1Y2hlLCAqc3RyczsKKyAgb2JqZWN0ICpvYnM7CisgIGludCBpOworICBtYXBwaW5nIHN1Y2hvYnM7CisgIHN3aXRjaCh3YXMpCisgIHsKKyAgICBjYXNlICJtdW5pdGlvbiIgICA6IHN1Y2hlPVdUX0FNTVU7IGJyZWFrOworICAgIGNhc2UgImFleHRlIiAgICAgIDogc3VjaGU9V1RfQVhFOyBicmVhazsKKyAgICBjYXNlICJrZXVsZW4iICAgICA6IHN1Y2hlPVdUX0NMVUI7IGJyZWFrOworICAgIGNhc2UgIm1lc3NlciIgICAgIDogc3VjaGU9V1RfS05JRkU7IGJyZWFrOworICAgIGNhc2UgImZlcm53YWZmZW4iIDogc3VjaGU9V1RfUkFOR0VEX1dFQVBPTjsgYnJlYWs7CisgICAgY2FzZSAic3BlZXJlIiAgICAgOiBzdWNoZT1XVF9TUEVBUjsgYnJlYWs7CisgICAgY2FzZSAic2Nod2VydGVyIiAgOiBzdWNoZT1XVF9TV09SRDsgYnJlYWs7CisgICAgY2FzZSAicGVpdHNjaGVuIiAgOiBzdWNoZT1XVF9XSElQOyBicmVhazsKKyAgICBjYXNlICJzb25zdGlnZXMiICA6IHN1Y2hlPVdUX01JU0M7IGJyZWFrOworICAgIGNhc2UgImthbXBmc3RhZWJlIjogc3VjaGU9V1RfU1RBRkY7IGJyZWFrOworICAgIGNhc2UgInVuenVvcmRiYXIiIDogc3VjaGU9InVuenVvcmRiYXIiOyBicmVhazsKKyAgICBkZWZhdWx0ICAgICAgICAgICA6IHdyaXRlKCJGZWhsZXI6IFVuZ3VlbHRpZ2VyIFdhZmZlbnR5cC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIkZvbGdlbmRlIFR5cGVuIGdpYnQgZXM6XG4iK25mX3N0cjErbmZfc3RyMik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsgYnJlYWs7CisgIH0KKyAgb2JzPWFsbF9pbnZlbnRvcnkoKTsKKyAgc3VjaG9icz0oW10pOworICBmb3IoaT0wO2k8c2l6ZW9mKG9icyk7aSsrKQorICB7CisgICAgb2JzaG9ydD10b19zdHJpbmcob2JzW2ldLT5RdWVyeVByb3AoUF9TSE9SVCkpOworICAgIGlmKG9ic2hvcnQ9PSJFaW4gQnVtZXJhbmdAQGZsaWVndEBAIikKKyAgICAgIG9ic2hvcnQ9IkVpbiBCdW1lcmFuZyI7CisgICAgZWxzZSBpZihvYnNob3J0PT0iTmljaHRzIGJlc29uZGVyZXMiIHx8IG9ic2hvcnQ9PSIwIikgLy8ga2VpbmUgUF9TSE9SVCA/CisgICAgICBvYnNob3J0PW9ic1tpXS0+TmFtZShXRVIpOyAgICAgLy8gICBIb2ZmZW4gd2lyIG1hbCBkYXNzIGRhcyBPYmouIG5lbiBOYW1lbiBoYXQuCisgICAgaWYob2JzW2ldLT5RdWVyeVByb3AoUF9XRUFQT05fVFlQRSk9PXN1Y2hlIHx8ICAvLyBHZXN1Y2h0ZXIgV2VhcG9uVHlwZSBnZWZ1bmRlbi4uLgorICAgICAgICghb2JzW2ldLT5RdWVyeVByb3AoUF9XRUFQT05fVFlQRSkgJiYgc3VjaGU9PSJ1bnp1b3JkYmFyIikgKQorICAgIHsKKyAgICAgIGlmKHN1Y2hvYnNbb2JzaG9ydF0pICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBfU0hPUlQgZGVzIE9iai4gc2Nob24gaW0gbWFwcGluZz8KKyAgICAgIHsKKyAgICAgICAgaWYoIG9ic1tpXS0+UXVlcnlQcm9wKFBfQU1PVU5UKSApCisgICAgICAgICAgc3VjaG9ic1tvYnNob3J0XSs9b2JzW2ldLT5RdWVyeVByb3AoUF9BTU9VTlQpOyAvLyAgIERhbm4gZGVuIFphZWhsZXIgdW0gQW1vdW50IGhvY2ghCisgICAgICAgIGVsc2UKKyAgICAgICAgICBzdWNob2JzW29ic2hvcnRdKz0xOyAgICAgICAgICAgICAgICAgICAgIC8vICAgRGFubiBkZW4gWmFlaGxlciB1bSAxIGhvY2ghCisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGlmKCBvYnNbaV0tPlF1ZXJ5UHJvcChQX0FNT1VOVCkgKQorICAgICAgICAgIHN1Y2hvYnMrPShbb2JzaG9ydDogb2JzW2ldLT5RdWVyeVByb3AoUF9BTU9VTlQpXSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzdWNob2JzKz0oW29ic2hvcnQ6IDFdKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgc3Rycz1tX2luZGljZXMoc3VjaG9icyk7CisgIGlmKHNpemVvZihzdHJzKSkKKyAgeworICAgIGlmKCFhbGxlcykKKyAgICB7CisgICAgICBpZihzdWNoZT09InVuenVvcmRiYXIiKQorICAgICAgICBzdHJhbGwrPU5hbWUoV0VSLDEpKyIgZW50aGFlbHQgZm9sZ2VuZGUgbmljaHQgenVvcmRiYXJlIFdhZmZlbjpcbiI7CisgICAgICBlbHNlCisgICAgICAgIHN0cmFsbCs9TmFtZShXRVIsMSkrIiBlbnRoYWVsdCBmb2xnZW5kZSAiK0NBUCh3YXMpKyI6XG4iOworICAgICAgc3RyYWxsKz0iLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaWYoc3VjaGU9PSJ1bnp1b3JkYmFyIikKKyAgICAgICAgc3RyYWxsKz1BTlNJX0JPTEQrIj09PSBOaWNodCB6dW9yZGJhcmUgV2FmZmVuOlxuIitBTlNJX05PUk1BTDsKKyAgICAgIGVsc2UKKyAgICAgICAgc3RyYWxsKz1BTlNJX0JPTEQrIj09PSAiK0NBUCh3YXMpKyI6XG4iK0FOU0lfTk9STUFMOworICAgIH0KKyAgICBmb3IoaT0wO2k8c2l6ZW9mKHN0cnMpO2krKykKKyAgICB7CisgICAgICBpZihzdWNob2JzW3N0cnNbaV1dID4gMSkKKyAgICAgICAgc3RyYWxsKz1zdHJzW2ldKyIuICgiK3N1Y2hvYnNbc3Ryc1tpXV0rIilcbiI7CisgICAgICBlbHNlCisgICAgICAgIHN0cmFsbCs9c3Ryc1tpXSsiLlxuIjsKKyAgICB9CisgIH0KKyAgZWxzZQorICAgIGlmKCFhbGxlcykKKyAgICAgIHN0cmFsbCs9TmFtZShXRVIsMSkrIiBlbnRoYWVsdCBrZWluZSAiK0NBUCh3YXMpKyIhXG4iOworICByZXR1cm4gMTsKK30KKworaW50IGF1Zmxpc3R1bmcoc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nICpzdHJzLCBvYl9pZCwgd2FzLCBuZl9zdHIxLG5mX3N0cjI7CisgIHN0cmFsbD0iIjsKKyAgbmZfc3RyMT0iICAgKFNjaHdlcnRlciwgU3BlZXJlLCBBZXh0ZSwgS2V1bGVuLCBLYW1wZnN0YWViZSwgTWVzc2VyLCBQZWl0c2NoZW4sXG4iCisgICAgICAgICArIiAgICBGZXJud2FmZmVuLCBNdW5pdGlvbiwgU29uc3RpZ2VzLCBVbnp1b3JkYmFyKVxuIjsKKyAgbmZfc3RyMj0iU3ludGF4OiBzbGlzdGUgW09iamVrdC1JZF0gW1dhZmZlbnR5cF1cbiIKKyAgICAgICAgICsiQnNwLjogICBzbGlzdGUgIitRdWVyeVByb3AoUF9JRFMpWzFdKyIgIisic2Nod2VydGVyXG4iCisgICAgICAgICArIiAgICAgICAgc2xpc3RlICIrUXVlcnlQcm9wKFBfSURTKVsxXSsiIGFsbGVzXG4iOworICBub3RpZnlfZmFpbCgiRmVobGVyOiBPaG5lIFBhcmFtZXRlciBrbGFwcHQgZGFzIG5pY2h0LlxuIituZl9zdHIyKTsKKyAgaWYoIXN0cikgcmV0dXJuIDA7CisgIGlmKHByZXNlbnQoc3RyKT09VE8pICAgLy8gVWViZXJwcnVlZmUsIG9iIGRpZXNlcyBPYmpla3QgZ2VtZWludCBpc3QhCisgIHsKKyAgICB3cml0ZSgiRmVobGVyOiBFcyBmZWhsdCBlaW4gV2FmZmVudHlwLiBGb2xnZW5kZSBUeXBlbiBnaWJ0IGVzOlxuIgorICAgICAgICAgK25mX3N0cjErbmZfc3RyMik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgc3Rycz1vbGRfZXhwbG9kZShzdHIsICIgIik7CisgIG5vdGlmeV9mYWlsKCJGZWhsZXI6IER1IG11c3N0IGVpbmUgZ3VlbHRpZ2UgT2JqZWt0LUlkIGFuZ2ViZW4hXG4iCisgICAgICAgICAgICAgK25mX3N0cjIpOworICBpZiggc2l6ZW9mKHN0cnMpIDwgMiApIHJldHVybiAwOyAgIC8vIE51ciAxIFBhci4gdW5kIGRlciBpc3QgbmljaHQgZGllIE9iamVrdC1JZAorICBpZiggc2l6ZW9mKHN0cnMpID09IDIgKSAgIC8vIEFuemFobCBQYXIuID0gMgorICB7CisgICAgb2JfaWQ9c3Ryc1swXTsKKyAgICB3YXM9c3Ryc1sxXTsKKyAgICBpZiggSVNUX1pBSEwod2FzKSApICAgICAvLyBPYmpla3QtSWQgei5CLiBtaXQgInNjaHJhbmsgMiIgYW5nZXNwcm9jaGVuPworICAgICAgaWYocHJlc2VudChvYl9pZCsiICIrd2FzKT09VE8pICAgLy8gRmFsbHMgZGllc2VzIE9iamVrdCBnZW1laW50IGlzdCB1bmQga2VpbiAzLiBQYXIhCisgICAgICB7CisgICAgICAgIHdyaXRlKCJGZWhsZXI6IEVzIGZlaGx0IGVpbiBXYWZmZW50eXAuIEZvbGdlbmRlIFR5cGVuIGdpYnQgZXM6XG4iCisgICAgICAgICAgICAgICtuZl9zdHIxK25mX3N0cjIpOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7CisgIH0KKyAgZWxzZSBpZiggc2l6ZW9mKHN0cnMpID09IDMgKQorICB7CisgICAgb2JfaWQ9c3Ryc1swXSsiICIrc3Ryc1sxXTsKKyAgICB3YXM9c3Ryc1syXTsKKyAgfQorICBlbHNlICAgICAgICAvLyBBbnphaGwgZXJmb3JkZXJsaWNoZXIgUGFyYW1ldGVyIHVlYmVyc2Nocml0dGVuIQorICAgIHJldHVybiAwOworICBpZihwcmVzZW50KG9iX2lkKSE9VE8pICAgLy8gVWViZXJwcnVlZmUsIG9iIGF1Y2ggZGllc2VzIE9iamVrdCBnZW1laW50IGlzdCEKKyAgICByZXR1cm4gMDsKKyAgaWYoUXVlcnlQcm9wKFBfQ05UX1NUQVRVUykhPUNOVF9TVEFUVVNfT1BFTikKKyAgeworICAgIHdyaXRlKCJEYXp1IG11ZXNzdGUgIituYW1lKFdFUiwxKSsiIGdlb2VmZm5ldCBzZWluLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKy8vLS0tIEhpZXIgaXN0IFBhcmFtZXRlcnBydWVmdW5nIHp1IEVuZGUuCisgIHdhcz1MT1dFUih3YXMpOworICBpZih3YXMhPSJhbGxlcyIpCisgICAgYXVmbGlzdHVuZzIod2FzLCBuZl9zdHIxLCBuZl9zdHIyLCAwKTsKKyAgZWxzZQorICB7CisgICAgYXVmbGlzdHVuZzIoImFleHRlIiwgbmZfc3RyMSwgbmZfc3RyMiwgMSk7CisgICAgYXVmbGlzdHVuZzIoImtldWxlbiIsIG5mX3N0cjEsIG5mX3N0cjIsIDEpOworICAgIGF1Zmxpc3R1bmcyKCJrYW1wZnN0YWViZSIsIG5mX3N0cjEsIG5mX3N0cjIsIDEpOworICAgIGF1Zmxpc3R1bmcyKCJtZXNzZXIiLCBuZl9zdHIxLCBuZl9zdHIyLCAxKTsKKyAgICBhdWZsaXN0dW5nMigic3BlZXJlIiwgbmZfc3RyMSwgbmZfc3RyMiwgMSk7CisgICAgYXVmbGlzdHVuZzIoInNjaHdlcnRlciIsIG5mX3N0cjEsIG5mX3N0cjIsIDEpOworICAgIGF1Zmxpc3R1bmcyKCJwZWl0c2NoZW4iLCBuZl9zdHIxLCBuZl9zdHIyLCAxKTsKKyAgICBhdWZsaXN0dW5nMigiZmVybndhZmZlbiIsIG5mX3N0cjEsIG5mX3N0cjIsIDEpOworICAgIGF1Zmxpc3R1bmcyKCJtdW5pdGlvbiIsIG5mX3N0cjEsIG5mX3N0cjIsIDEpOworICAgIGF1Zmxpc3R1bmcyKCJzb25zdGlnZXMiLCBuZl9zdHIxLCBuZl9zdHIyLCAxKTsKKyAgICBhdWZsaXN0dW5nMigidW56dW9yZGJhciIsIG5mX3N0cjEsIG5mX3N0cjIsIDEpOworICB9CisgIFRQLT5Nb3JlKHN0cmFsbCk7CisgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL21vZWJlbC93YWZmZW50cnVoZS5jIGIvZC9zZWhlci9oYWV1c2VyL21vZWJlbC93YWZmZW50cnVoZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5OGFhYTcKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL3dhZmZlbnRydWhlLmMKQEAgLTAsMCArMSw0MyBAQAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTmFtZSBkZXMgT2JqZWN0czogICAgV2FmZmVudHJ1aGUKKy8vIExldHp0ZSBBZW5kZXJ1bmc6ICAgIDIyLjAzLjIwMDEKKy8vIE1hZ2llcjogICAgICAgICAgICAgIFN3aWZ0CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiBDaGFuZ2Vsb2cKKyAgICogMjEuMDUuMjAwNywgWmVzc3RyYQorICAgICBEYSBXYWZmZW5zY2hyYW5rIHVuZCBXYWZmZW50cnVoZSBzaWNoIHByYWt0aXNjaCBuaWNodCB1bnRlcnNjaGVpZGVuLCBiaXMKKyAgICAgYXVmIDEwIFplaWxlbiBpbSBDcmVhdGUsIGVyYnQgbnVuIGRpZSBXYWZmZW50cnVoZSBkZW4gV2FmZmVuc2NocmFuayB1bmQKKyAgICAgdWViZXJzY2hyZWlidCBlaW5mYWNoIGRpZSBwYXNzZW5kZW4gUHJvcHMuCisqLworI3ByYWdtYSBzdHJvbmdfdHlwZXMscnR0X2NoZWNrcworCisjaW5jbHVkZSAic2NocmFua2xhZGVuLmgiCisjaW5jbHVkZSA8YW5zaS5oPgorI2luY2x1ZGUgPGNsYXNzLmg+CisvL2luaGVyaXQgTEFERU4oInN3aWZ0X3N0ZF9jb250YWluZXIiKTsKK2luaGVyaXQgTEFERU4oIndhZmZlbnNjaHJhbmsiKTsKKworI2RlZmluZSBWRVJTSU9OX09CSiAiNyIKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkgeworICBpZiAoIWNsb25lcChUTykpIHJldHVybjsKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX1NIT1JULCAiRWluZSBXYWZmZW50cnVoZSIpOworICBTZXRQcm9wKFBfTE9ORywgQlMoCisgICAgICJEaWVzZSBTdGFobHRydWhlIGlzdCBzcGV6aWVsbCB6dXIgQXVmbmFobWUgdm9uIGdyb3NzZW4gV2FmZmVubWVuZ2VuICIKKyAgICAgImdlZmVydGlndC4gVmVyc2NoaWVkZW5lIEZhZWNoZXIgZnVlciBkaWUgZWluemVsbmVuIFdhZmZlbnR5cGVuIGVybGVpY2h0ZXJuICIKKyAgICAgImRpZSBTdWNoZSBuYWNoIERlaW5lbSBiZXZvcnp1Z3RlbiBXYWZmZW50eXAuIikrIkBAY250X3N0YXR1c0BAIik7CisgIFJlbW92ZUlkKCh7IndhZmZlbnNjaHJhbmsiLCAiaG9senNjaHJhbmsiLCAic2NocmFuayJ9KSk7CisgIEFkZElkKCh7IndhZmZlbnRydWhlIiwgInN0YWhsdHJ1aGUiLCAidHJ1aGUifSkpOworICBTZXRQcm9wKCJjbnRfdmVyc2lvbl9vYmoiLCBWRVJTSU9OX09CSik7CisgIFNldFByb3AoUF9OQU1FLCAiV2FmZmVudHJ1aGUiKTsKKyAgU2V0UHJvcChQX0dFTkRFUiwgRkVNQUxFKTsgIAorICBTZXRQcm9wKFBfTUFURVJJQUwsICh7TUFUX01JU0NfTUVUQUwsIE1BVF9NSVNDX01BR0lDfSkgKTsKKyAgU2V0UHJvcChQX0lORk8sICJWZXJzdWNocyBtYWwgbWl0OiBcInNrb21tYW5kb3MgIitRdWVyeVByb3AoUF9JRFMpWzFdKworICAgICJcIiAhXG4iKTsKKyAgQUQoKHsiZmFlY2hlciJ9KSwgQlMoIkZ1ZXIgamVkZW4gV2FmZmVudHlwIGdpYnQgZXMgZWluIGVpZ2VuZXMgRmFjaCwgc28gZGFzcyAiCisgICAgIkR1IGVpbmUgYmVzc2VyZSBVZWJlcnNpY2h0IGhhc3QuIikpOworICBBRCgoeyJwbGF0eiJ9KSwgQlMoIkRpZSBXYWZmZW50cnVoZSBiaWV0ZXQgUGxhdHogZnVlciBqZWRlIGVyZGVua2xpY2hlICIKKwkiV2FmZmVuZ2F0dHVuZy4iKSk7Cit9CisKZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvd2FzY2guYyBiL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvd2FzY2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Nzg5MzUwCi0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL21vZWJlbC93YXNjaC5jCkBAIC0wLDAgKzEsMjIwIEBACisvLyBOYW1lIGRlcyBPYmplY3RzOiAgICBXYXNjaG9iamVrdAorLy8gTGV0enRlIEFlbmRlcnVuZzogICAgMDEuMDQuMjAwNQorLy8gTWFnaWVyOiAgICAgICAgICAgICAgU2VsZXZlbgorLy8gRGllc2VzIEZpbGUgZ2lidCBkZW0gU3BpZWxlciBkaWUgTW9lZ2xpY2hrZWl0LCBlaW5lIFdhc2NoZ2VsZWdlbmhlaXQgaW4KKy8vIHNlaW5lbSBTZWhlcmhhdXMgYXVmenVzdGVsbGVuLiBEYXMgYmVpbSBLb21tYW5kbyB3YXNjaChlKSwgZHVzY2goZSkgbGFlc3N0CisvLyBzaWNoIGRpZSBNZWR1bmcgdWViZXJzY2hyZWliZW4gKFRlc3QgcGVyIHJhdW0tPlF1ZXJ5UHJvcCgiaF9jb21tYW5kcyIpKQorLy8gMDEuMDcuMjAwNyAoWmVzc3RyYSk6IEdldE93bmVyKCkgZGVmaW5pZXJ0LgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjcHJhZ21hIHN0cm9uZ190eXBlcyxydHRfY2hlY2tzCisKKyNpbmNsdWRlICJzY2hyYW5rbGFkZW4uaCIKK2luaGVyaXQgTEFERU4oInN3aWZ0X3N0ZF9jb250YWluZXIiKTsKKworc3RyaW5nICp3Y21kOworc3RyaW5nICpvYmpla3RlID0KKyAgKCh7Ilxuc3RpbmtvYmoiLCJcbnplc3N0cmFfYXNjaGUiLCJzZWxldmVcbnNjaGVpc3NlIiwiXG5wb3BjIiwKKyAgICAgIlxuc3NwYm9sbGVuIiwic2VsZXZlXG5zdGlua29iaiIsIlxucTJwX2dlc3RhbmsiLCJiZXJcdHJhbV9za290IiwKKyAgICAgImJhbWJpXG5zY2htdXR6aWdlaGFlbmRlIn0pKTsKKy8qIFd1cnplbChLbG8vSW1iaXNzKSwgWmVzc3RyYShWdWxrYW4vSWxsdW1pbmF0b3MpLCBTZWxldmVuKEtsby9OZWJlbGVsZmVuKSwKKyAqIFNlbGV2ZW4oUG9wY29ybi9OZWJlbGVsZmVuKSwgQm9pbmcoU2NobGVpbXNjaG1laXNzZXIsU1NQKSwgU1RBTkRBUlQKKyAqLworCitzdGF0aWMgdm9pZCB3YXNjaF9mdW4oKTsKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgOjpjcmVhdGUoKTsKKworICB3Y21kID0gKCh7Indhc2NoZSIsIndhc2NoIiwiZHVzY2hlIiwiZHVzY2gifSkpOworICBBZGRJZCgoeyJkdXNjaGthYmluZSIsImthYmluZSIsImR1c2NoZSIsIndhc2NoZ2VsZWdlbmhlaXQifSkpOworICBTZXRQcm9wKFBfTkFNRSwiRHVzY2hrYWJpbmUiKTsKKyAgCisgIFNldFByb3AoImNudF92ZXJzaW9uX29iaiIsMSk7CisKKyAgU2V0UHJvcCgib2JqX2NtZCIsCisgICJ3YXNjaChlKSwgZHVzY2goZSlcbiIrCisgICIgICBEYW1pdCBsYWVzc3Qgc2ljaCBkYXMgU3RpbmtlbiBhdXMgZGVtIEltYmlzc2tsbyBiZXNlaXRpZ2VuLlxuIisKKyAgIiAgIFdlbm4ga2VpbiBCZWZlaGwgJ3dhc2NoKGUpJyBpbSBSYXVtIGJlc2NocmllYmVuIGlzdCwgZXJmb2xndCBlaW5lXG4iKworICAiICAgU3RhbmRhcnRtZWxkdW5nLCBzZWxiaWdlcyBnaWx0IGZ1ZXIgJ2R1c2NoKGUpJy5cbiIrCisgICJzc2V0eihlKSB3YXNjaGJlZmVobFxuIisKKyAgIiAgIERhbWl0IGthbm4gbWFuIGRpZSBCZWZlaGxzbGlzdGUgZXJ3ZWl0ZXJuLCBkaWUgZGFzIFdhc2NoZW4gXG4iKworICAiICAgYXVzbG9lc2VuXG4iKworICAic2xvZXNjaChlKSB3YXNjaGJlZmVobFxuIisKKyAgIiAgIERhbWl0IGthbm4gbWFuIGVpbmVuIEJlZmVobCBhdXMgZGVyIExpc3RlIGxvZXNjaGVuXG4iKworICAid2FzY2hiZWZlaGxzbGl0ZSwgd2JsIisKKyAgIiAgIFplaWd0IGVpbmUgTGlzdGUgZGVyIEJlZmVobGUgYW4sIGRpZSBkYXMgV2FzY2hlbiBhdXNsb2VzZW4uXG4iKTsKKworICBTZXRQcm9wKFBfU0hPUlQsIkVpbmUgRHVzY2hrYWJpbmUiKTsKKyAgU2V0UHJvcChQX0xPTkcsQlMoIkRpZSBEdXNjaGthYmluZSBoYXQgZWluZW4gUmFobWVuIGF1cyBoZWxsZW0gSG9sei4gIgorICAgIkRhendpc2NoZW4gd3VyZGVuIG1hdHRlIFNjaGVpYmVuIGVpbmdlbGFzc2VuLCBkYW1pdCBtYW4gbmllbWFuZGVuIGJlaW0gIgorICAgIkR1c2NoZW4gYmVvYmFjaHRlbiBrYW5uLiIpKTsKKyAgQWRkRGV0YWlsKCJyYWhtZW4iLCJEZXIgUmFobWVuIGlzdCBhdXMgaGVsbGVtIEhvbHouXG4iKTsKKyAgQWRkRGV0YWlsKCh7InNjaGVpYmVuIiwic2NoZWliZSJ9KSwiRGllIFNjaGVpYmVuIGRlciBEdXNjaGthYmluZSBzaW5kICIrCisgICAibWF0dCB1bmQgYWJzb2x1dCB1bmR1cmNoc2ljaHRpZyFcbiIpOworICBBZGREZXRhaWwoKHsiZHVzY2hlbiIsImJlaW0gZHVzY2hlbiJ9KSwKKyAgICJNYW4ga2FubiBuaWVtYW5kZW4gYmVpbSBEdXNjaGVuIGJlb2JhY2h0ZW4uXG4iKTsKKworICBTZXRQcm9wKFBfR0VOREVSLCBGRU1BTEUpOworICBTZXRQcm9wKFBfV0VJR0hULCA1MDAwKTsgICAgICAgICAvLyBHZXdpY2h0IDUgS2cKKyAgU2V0UHJvcChQX01BWF9XRUlHSFQsIDApOyAgICAgICAgLy8gU29sbCBudXIgbiBwc2V1ZG8tQ29udGFpbmVyCisgIFNldFByb3AoUF9XRUlHSFRfUEVSQ0VOVCwgMTAwKTsgIC8vIERhZnVlciBtYWNodCBlciBhdWNoIG5peCBsZWljaHRlciA6KQorICBTZXRQcm9wKFBfTUFYX09CSkVDVFMsIDApOyAgICAgICAvLyBLZWluIENvbnRhaW5lciA6KQorICBTZXRQcm9wKFBfVkFMVUUsIDApOyAgICAgICAgICAgICAvLyBJc3QgZWggbmljaHQgdmVya2F1ZmJhci4KKyAgU2V0UHJvcChQX05PQlVZLCAxKTsgICAgICAgICAgICAgLy8gRmFscyBkb2NoOiB6ZXJzdG9lcmVuIQorICBTZXRQcm9wKFBfTk9HRVQsCisgICAgIkRhcyBnZWh0IG5pY2h0LiAiK05hbWUoV0VSLDEpKyIgaGFmdGV0IHdpZSBtYWdpc2NoIGFtIEJvZGVuLlxuIik7CisgIFNldFByb3AoUF9NQVRFUklBTCwgKHtNQVRfTUlTQ19XT09ELCBNQVRfTUlTQ19NQUdJQ30pICk7CisgIFNldFByb3AoUF9JTkZPLCAiVmVyc3VjaHMgbWFsIG1pdDogXCJza29tbWFuZG9zICIrUXVlcnlQcm9wKFBfSURTKVsxXSsiXCIgIVxuIik7CisKKyAgQWRkQ21kKHdjbWQsImNtZF93YXNjaGVuIik7CisgIFJlbW92ZUNtZCgoeyJvZWZmbmUiLCJvZWZmbiIsInNjaGxpZXNzZSIsInNjaGxpZXNzIn0pKTsKKyAgQWRkQ21kKCh7InNzZXR6ZSIsInNzZXR6In0pLCJjbWRfc2V0emVuIik7CisgIEFkZENtZCgoeyJzbG9lc2NoZSIsInNsb2VzY2hlIn0pLCJjbWRfbG9lc2NoZW4iKTsKKyAgQWRkQ21kKCh7IndibCIsIndhc2NoYmVmZWhsc2xpc3RlIn0pLCJsaXN0ZSIpOworfQorCisvLyBaZXNzdHJhLCAxLjcuMDcsIGZ1ZXJzIEhvZXJyb2hyCitzdHJpbmcgR2V0T3duZXIoKSB7cmV0dXJuICJzZWxldmVuIjt9CisKK3ZhcmFyZ3MgaW50IFByZXZlbnRJbnNlcnQob2JqZWN0IG9iKSB7cmV0dXJuIDE7fSAvL0RhcyBpc3Qga2VpbiBDb250YWluZXIgOikKKworc3RhdGljIHZvaWQgd2FzY2hfZnVuKCkKK3sKKyAgaW50IGk7CisgIG9iamVjdCBvYjsKKyAgaSA9IHNpemVvZihvYmpla3RlKTsKKyAgaS0tOworICB3aGlsZShpID4gLTEpCisgIHsKKworICAgIGlmKCFUUCkgcmV0dXJuOworICAgIG9iID0gcHJlc2VudChvYmpla3RlW2ldLFRQKTsKKyAgICB3aGlsZShvYikKKyAgICB7CisgICAgICBpZihxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iKSkKKwkgIHsKKwkgICAgdGVsbF9vYmplY3QoVFAsQlMoIkR1IHNjaGVpbnN0IGplbWFuZGVuIGluIERlaW5lbSBJbnYgenUgaGFiZW4hXG4iCisJICAgICAiRGFzIHNvbGx0ZSBzaWNoIHZpZWxsZWljaHQgZWluIE1hZ2llciBhbnNjaGF1ZW4uIikpOworCSAgICBpLS07CisJICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIG9iLT5yZW1vdmUoMSk7CisgICAgICBpZihwcmVzZW50KG9iamVrdGVbaV0sVFApKTsKKyAgICAgICBvYiA9IHByZXNlbnQob2JqZWt0ZVtpXSxUUCk7CisgICAgfQorICAgIGktLTsKKworICB9Cit9CisKK2ludCBjbWRfd2FzY2hlbihzdHJpbmcgc3RyKQoreworICBzdHJpbmcgdmVyYjsKKyAgdmVyYiA9IHF1ZXJ5X3ZlcmIoKTsKKyAgaWYoIWVudmlyb25tZW50KCkpIHJldHVybiAwOworICBpZiggIWVybGF1YnQoKSApCisgIHsKKyAgICAgIHdyaXRlKCJEdSBzb2xsdGVzdCBkZW4gQmVzaXR6ZXIgdmllbGxlaWNodCB1bSBFcmxhdWJuaXMgYml0dGVuLlxuIik7CisgICAgICByZXR1cm4gMTsKKyAgfQorICBpZihtZW1iZXIoZW52aXJvbm1lbnQoKS0+UXVlcnlQcm9wKCJoX2NvbW1hbmRzIiksdmVyYikgPT0gMCkKKyAgeworICAgIHdyaXRlKAorICAgICAiRHUgc3ByaW5nc3Qgc2NobmVsbCB1bnRlciBkaWUgRHVzY2hlIHVuZCB3YWVzY2hzdCBEaWNoIGdydWVuZGxpY2guXG4iKTsKKyAgICBzYXkodGhpc19wbGF5ZXIoKS0+TmFtZShXRVIpKyIgc3ByaW5ndCBzY2huZWxsIHVudGVyIGRpZSBEdXNjaGUuXG4iKTsKKyAgICB3YXNjaF9mdW4oKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICB3YXNjaF9mdW4oKTsKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBjbWRfc2V0emVuKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyBiZWY7CisgIG5vdGlmeV9mYWlsKCJNb2VjaHRlc3QgRHUgZWluZW4gV2FzY2hiZWZlaGwgc2V0emVuP1xuIisKKyAgICAiU3ludGF4OiBzc2V0eihlKSB3YXNjaGJlZmVobCBbYmVmZWhsXVxuIik7CisgIGlmKCFzdHIgfHwgIXN0cmluZ3Aoc3RyKSB8fCBzaXplb2Yoc3RyKSA9PSAwKSByZXR1cm4gMDsKKyAgc3NjYW5mKHN0ciwid2FzY2hiZWZlaGwgJXMiLGJlZik7CisgIGlmKCFiZWYpIHJldHVybiAwOworICBpZihiZWZbc2l6ZW9mKGJlZikgLi4gc2l6ZW9mKGJlZiktMV0gPT0gImUiKQorICAgYmVmID0gYmVmW3NpemVvZihiZWYpIC4uIHNpemVvZihiZWYpLTJdOworICBub3RpZnlfZmFpbCgiRGVyIEJlZmVobCBzdGVodCBzY2hvbiBhdWYgZGVyIExpc3RlLlxuIik7CisgIGlmKG1lbWJlcih3Y21kLGJlZikgIT0gLTEpIHJldHVybiAwOworICB3Y21kICs9ICgoe2JlZixiZWYrImUifSkpOworICBBZGRDbWQod2NtZCwiY21kX3dhc2NoZW4iKTsKKyAgd3JpdGUoQlMoIkR1IGhhc3QgZGllIEJlZmVobGUgIitiZWYrIiB1bmQgIitiZWYrImUgYW4gZGllIExpc3RlICIKKyAgICJhbmdlZnVlZ3QuIikpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjbWRfbG9lc2NoZW4oc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIGJlZjsKKyAgbm90aWZ5X2ZhaWwoIk1vZWNodGVzdCBEdSBlaW5lbiBXYXNjaGJlZmVobCBsb2VzY2hlbj9cbiIrCisgICAgIlN5bnRheDogc2xvZXNjaChlKSB3YXNjaGJlZmVobCBbYmVmZWhsXVxuIik7CisgIGlmKCFzdHIgfHwgIXN0cmluZ3Aoc3RyKSB8fCBzaXplb2Yoc3RyKSA9PSAwKSByZXR1cm4gMDsKKyAgc3NjYW5mKHN0ciwid2FzY2hiZWZlaGwgJXMiLGJlZik7CisgIGlmKCFiZWYpIHJldHVybiAwOworICBub3RpZnlfZmFpbCgiRGVyIEJlZmVobCBzdGVodCBnYXIgbmljaHQgYXVmIGRlciBMaXN0ZS5cbiIpOworICBpZihtZW1iZXIod2NtZCxiZWYpID09IC0xKSByZXR1cm4gMDsKKyAgd2NtZCAtPSAoKHtiZWZ9KSk7CisgIFJlbW92ZUNtZChiZWYpOworICB3cml0ZShCUygiRHUgaGFzdCBkaWUgQmVmZWhsZSAiK2JlZisiIHVuZCAiK2JlZisiZSB2b24gZGVyIExpc3RlICIKKyAgICJlbnRmZXJudC4iKSk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGxpc3RlKHN0cmluZyBzdHIpCit7CisgIHdyaXRlKCJEdSBoYXN0IGZvbGdlbmRlIEJlZmVobGUgYXVmIGRlciBXYXNjaGxpc3RlIHN0ZWhlbjpcbiIrCisgICBicmVha19zdHJpbmcoaW1wbG9kZSh3Y21kLCIsICIpLDc4LDMpKTsKKyAgcmV0dXJuIDE7Cit9CisKKworCisvLyBvZWZmbmVuIHVuZCBzY2hsaWVzc2VuIGF1c2JhdWVuLgordmFyYXJncyBpbnQgc2tvbW1hbmRvcyhzdHJpbmcgc3RyKQoreworICBub3RpZnlfZmFpbCggIkZlaGxlcjogRGllc2VyIEJlZmVobCBiZW5vZXRpZ3QgZWluZSBndWVsdGlnZSBPYmpla3QtSWQgYWxzIFBhcmFtZXRlci5cbiIKKyAgICArIkJlaXNwaWVsOiBza29tbWFuZG9zICIrUXVlcnlQcm9wKFBfSURTKVsxXSsiXG4iKTsKKyAgaWYoIXN0cikgcmV0dXJuIDA7CisgIGlmKHByZXNlbnQoc3RyKSE9VE8gKSAvLyBCaW4gaWNoIGdlbWVpbnQ/CisgICAgcmV0dXJuIDA7CisgIHdyaXRlKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisgIHdyaXRlKCJBa3R1ZWxsZSBWZXJzaW9uOiAiK1F1ZXJ5UHJvcCgiY250X3ZlcnNpb25fc3RkIikrUXVlcnlQcm9wKCJjbnRfdmVyc2lvbl9vYmoiKSsiXG4iKTsKKyAgd3JpdGUoIEJTKE5hbWUoV0VSLDEpKyIga2FubiBudXIgaW4gZGllc2VtIFNlaGVyaGF1cyB2ZXJ3ZW5kZXQgd2VyZGVuLCAiCisgICAgKyJkYSAiK1F1ZXJ5UHJvbm91bihXRVIpKyIgc3BlemllbGwgZGFmdWVyIGdla2F1ZnQgd3VyZGUuICIrQ0FQKFF1ZXJ5UHJvbm91bihXRVIpKQorICAgICsiIHZlcmZ1ZWd0IHVlYmVyIGZvbGdlbmRlIEtvbW1hbmRvczoiKQorICAgICsiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKKyAgICArInNlcmxhdWJlIFtPYmpla3QtSWRdIFtTcGllbGVybmFtZXxcImhhdXNmcmV1bmRlXCJ8XCJ6d2VpdGllc1wiXVxuIgorICAgICsiICBFcmxhdWJ0IFBlcnNvbmVuLCAiK25hbWUoV0VOLDEpKyIgbWl0enViZW51dHplbi5cbiIKKyAgICArIiAgc2VybGF1YmUgKyBPYmpla3QtSWQgKG9obmUgU3BpZWxlcm5hbWUvaGF1c2ZyZXVuZGUpXG4iCisgICAgKyIgIGxpc3RldCBhbGxlIFBlcnNvbmVuIG1pdCBadWdyaWZmIGF1ZiAiK25hbWUoV0VOLDEpKyJcblxuIgorICAgICsidmVyc2NoaWViZSBbT2JqZWt0LUlkXSBuYWNoIFtBdXNnYW5nXVxuIgorICAgICsiICBEYW1pdCBrYW5uc3QgRHUgIituYW1lKFdFTiwxKSsiIGlubmVyaGFsYiBEZWluZXMgU2VoZXJoYXVzZXMgdmVyc2NoaWViZW4uXG5cbiIKKyAgLy9TZWxldmVuIDA3LjEyLjIwMDUKKyAgICArInN2ZXJzdGVja2UgW09iamVrdC1JZF1cbiIKKyAgICArIiAgRGFtaXQgbWFjaHN0IER1ICIrbmFtZShXRU4sMSkrIiB1bnNpY2h0YmFyLlxuIgorICAgICsic2hvbGUgW09iamVrdC1JZF0gaGVydm9yXG4iCisgICAgKyIgIERhbWl0IG1hY2hzdCBEdSAiK25hbWUoV0VOLDEpKyIgd2llZGVyIHNpY2h0YmFyLlxuIgorICAvLyBCaXMgaGllcgorICAgICsiemVydHJ1ZW1tZXIgW09iamVrdC1JZF1cbiIKKyAgICArIiAgRGFtaXQgemVyc3RvZXJzdCBEdSAiK25hbWUoV0VOLDEpKyIuXG5cbiIpOworCisKKyAgaWYoIFF1ZXJ5UHJvcCgib2JqX2NtZCIpICkKKyAgICB3cml0ZSggUXVlcnlQcm9wKCJvYmpfY21kIikrIlxuIiApOworCisgIHdyaXRlKCJbT2JqZWt0LUlkXSBtdXNzIGVpbmUgZ3VlbHRpZ2UgSWQgc2VpbiwgaW4gZGllc2VtIEZhbGwgei5CLiAiCisgICAgICArUXVlcnlQcm9wKFBfSURTKVsxXSsiXG4iKTsKKyAgd3JpdGUoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKworCisgIHJldHVybiAxOworfQorCmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL3phdWJlcmtpc3RlLmMgYi9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL3phdWJlcmtpc3RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNmNmY3NAotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvemF1YmVya2lzdGUuYwpAQCAtMCwwICsxLDU2IEBACisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBOYW1lIGRlcyBPYmplY3RzOiAgICBaYXViZXJraXN0ZQorLy8gTGV0enRlIEFlbmRlcnVuZzogICAgMTAuMDUuMjAwMgorLy8gTWFnaWVyOiAgICAgICAgICAgICAgVmFuaW9uCisvLyBXYXM6ICAgICAgICAgICAgICAgICBEaWUgSUQgZnVlciBkaWUgS29tcG9zIGRlciBaYXViZXJlciB1bWdlc3RlbGx0LgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI3ByYWdtYSBzdHJvbmdfdHlwZXMscnR0X2NoZWNrcworCisjaW5jbHVkZSAic2NocmFua2xhZGVuLmgiCisKKy8vIEZ1ZXIgZGllIElEcworI2luY2x1ZGUgIi9wL3phdWJlcmVyL3phdWJlcmVyLmgiCisKK2luaGVyaXQgTEFERU4oInN3aWZ0X3N0ZF9jb250YWluZXIiKTsKKworI2RlZmluZSBWRVJTSU9OX09CSiAiMyIKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAoVE8pKSByZXR1cm47CisgIHN3aWZ0X3N0ZF9jb250YWluZXI6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfU0hPUlQsICJFaW5lIFphdWJlcmtpc3RlIik7CisgIFNldFByb3AoUF9MT05HLCBCUygKKyAgICAgIkVpbmUga2xlaW5lIEtpc3RlIGF1cyBCaXJuYmF1bWhvbHouIERhIGRpZXNlbSBzZWx0ZW5lbiBIb2x6IHNlbGJzdCAiCisgICAgKyJtYWdpc2NoZSBGYWVoaWdrZWl0ZW4gbmFjaGdlc2FndCB3ZXJkZW4sIGlzdCBlcyB3b2hsIGRhcyBpZGVhbGUgTWF0ZXJpYWwsICIKKyAgICArInVtIGRpZSB0ZWlsd2Vpc2UgZ2VmYWVocmxpY2hlbiBLb21wb25lbnRlbiBlaW5lcyBaYXViZXJlcnMgZGFyaW4gIgorICAgICsidW50ZXJ6dWJyaW5nZW4uIikrIkBAY250X3N0YXR1c0BAIik7CisgIEFkZElkKCh7InphdWJlcmtpc3RlIiwgImtpc3RlIn0pKTsKKyAgU2V0UHJvcCgiY250X3ZlcnNpb25fb2JqIiwgVkVSU0lPTl9PQkopOworICBTZXRQcm9wKFBfTkFNRSwgIlphdWJlcmtpc3RlIik7CisgIFNldFByb3AoUF9HRU5ERVIsIEZFTUFMRSk7CisgIFNldFByb3AoUF9XRUlHSFQsIDUwMDApOyAgICAgICAgIC8vIEdld2ljaHQgNSBLZworICBTZXRQcm9wKFBfTUFYX1dFSUdIVCwgMTAwMDAwMCk7ICAvLyBFcyBwYXNzZW4gZnVlciAxMDAwIGtnIFNhY2hlbiByZWluLgorICBTZXRQcm9wKFBfV0VJR0hUX1BFUkNFTlQsIDEwMCk7ICAvLyBEYWZ1ZXIgbWFjaHQgZXIgYXVjaCBuaXggbGVpY2h0ZXIgOikKKyAgU2V0UHJvcChQX01BWF9PQkpFQ1RTLCAxMDApOyAgICAgLy8gTWVociBzb2xsdGUgbmljaHQgc2VpbiwgbHQuIFRpYW1hay4KKyAgU2V0UHJvcChQX1ZBTFVFLCAwKTsgICAgICAgICAgICAgLy8gS2VpbiBtYXRlcmllbGxlciBXZXJ0LiBJc3QgZWggbmljaHQgdmVya2F1ZmJhci4KKyAgU2V0UHJvcChQX05PQlVZLCAxKTsgICAgICAgICAgICAgLy8gV2lyZCBpbSBMYWRlbiB6ZXJzdG9lcnQsIGZhbGxzIGVyIHZlcmthdWZ0IHdpcmQuCisgIFNldFByb3AoUF9OT0dFVCwgIkRhcyBnZWh0IG5pY2h0LiAiK05hbWUoV0VSLDEpKyIgaGFmdGV0IHdpZSBtYWdpc2NoIGFtIEJvZGVuLlxuIik7CisgIFNldFByb3AoUF9NQVRFUklBTCwgKHtNQVRfUEVBUl9XT09ELCBNQVRfTUlTQ19NQUdJQ30pICk7CisgIFNldFByb3AoUF9JTkZPLCAiVmVyc3VjaHMgbWFsIG1pdDogXCJza29tbWFuZG9zICIrUXVlcnlQcm9wKFBfSURTKVsxXSsiXCIgIVxuIik7CisKKyAgQUQoKHsiaG9seiIsICJiaXJuYmF1bWhvbHoifSksIEJTKCJGYXN0IGtvZW5udGVzdCBEdSBtZWluZW4sIGRhc3MgIituYW1lKFdFUiwxKQorICAgICsiIGxlYnQhIikpOworfQorCit2YXJhcmdzIGludCBQcmV2ZW50SW5zZXJ0KG9iamVjdCBvYikKK3sKKyAgLy8gS2VpbmUgWmF1YmVya29tcG8/IEhhdCBpbiBkaWVzZW0gQ29udGFpbmVyIG5peCB2ZXJsb3JlbiEKKyAgaWYoICFvYi0+aWQoWl9JRF9aVVRBVCkgKQorICB7CisgICAgd3JpdGUoIEJTKCJJbiAiK25hbWUoV0VOLDEpKyIga2FubnN0IER1IG51ciBaYXViZXJlci1Lb21wb25lbnRlbiBsZWdlbiEiKSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgZWxzZQorICAgIHJldHVybiA6OlByZXZlbnRJbnNlcnQob2IpOworfQpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL3F1ZXVlLmMgYi9kL3NlaGVyL2hhZXVzZXIvcXVldWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjJjYTU2Ci0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL3F1ZXVlLmMKQEAgLTAsMCArMSw0MzMgQEAKKy8qCisgKiBxdWV1ZS5jIC0tIEVpbmUgU2NobGFuZ2UsIGFuIGRlciBtYW4gYW5zdGVoZW4ga2FubgorICoKKyAqIChjKSAxOTk0IFdhcmdvbkBNb3JnZW5HcmF1ZW4KKyAqCisgKi8KKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8bW92aW5nLmg+CisjaW5jbHVkZSAicXVldWUuaCIKKworI2RlZmluZSBUUCB0aGlzX3BsYXllcigpCisKK2luaGVyaXQgInN0ZC90aGluZy9tb3ZpbmciOworaW5oZXJpdCAic3RkL3Jvb20iOworCitzdGF0aWMgbWFwcGluZyBwZW9wbGVJblF1ZXVlOworc3RhdGljIG9iamVjdCBsYXN0TW92ZWQ7CisKKy8qIFNwaWVsZXJrb21tZW5kb3MgKi8KK3N0YXRpYyBpbnQgYW5zdGVsbGVuKHN0cmluZyBzdHIpOworc3RhdGljIGludCBkcmFlbmdlbG4oc3RyaW5nIHN0cik7CisKKy8qIFNwaWVsZXIgaW4gU2NobGFuZ2UgZWluZnVlZ2VuL2F1cyBTY2hsYW5nZSBlbnRmZXJuZW4gKi8KK3N0YXRpYyB2b2lkIGVucXVldWUob2JqZWN0IG9iKTsKK3ByaXZhdGUgdm9pZCBsZWF2ZVF1ZXVlKG9iamVjdCBvYiwgaW50IHNpbGVudCk7CisKK3ByaXZhdGUgb2JqZWN0ICpxdWV1ZWRQZW9wbGUoKTsKK3ByaXZhdGUgaW50IHF1ZXVlU2NhbigpOworcHJpdmF0ZSBvYmplY3QgYWRqdXN0KGludCB0aHJlc2gpOworCisvKiB3ZXJkZW4gYmVpICJzY2hsYWZlIGVpbiIgYnp3LiAiZW5kZSIgYXVmZ2VydWZlbiAqLwordm9pZCBCZWNvbWVzTmV0RGVhZChvYmplY3QgcGxheWVyKTsKK3ZvaWQgUGxheWVyUXVpdChvYmplY3QgcGxheWVyKTsKKworY3JlYXRlKCkKK3sKKyAgaWYgKElTX0JMVUUodGhpc19vYmplY3QoKSkpIHJldHVybjsKKworICA6OmNyZWF0ZSgpOworCisgIFNldFByb3AoIFBfSU5ET09SUywgMSApOworICBTZXRQcm9wKCBQX0xJR0hULCAxICk7CisgIFNldFByb3AoIFBfR0VOREVSLCBGRU1BTEUgKTsKKworICBTZXRQcm9wKCBQX1NIT1JULCAiRWluZSBTY2hsYW5nZSIgKTsKKyAgU2V0UHJvcCggUF9MT05HLCAiRHUgc2llaHN0IGVpbmUgU2NobGFuZ2UuXG4iICk7CisgIFNldFByb3AoIFBfSU5UX1NIT1JULCAiSW4gZGVyIFNjaGxhbmdlIiApOworICBTZXRQcm9wKCBQX0lOVF9MT05HLCAiRHUgc3RlaHN0IGluIGVpbmVyIFNjaGxhbmdlLlxuIiApOworICBTZXRQcm9wKCBQX05BTUUsICJTY2hsYW5nZSIgKTsKKyAgU2V0UHJvcCggUF9UUkFOU1BBUkVOVCwgMCApOworCisvLyBOZXR6dG90ZSB3ZXJkZW4gYmVpbSBkaXNjb25uZWN0ZW4gZWggYXVzIGRlciBTY2hsYW5nZSBlbnRmZXJudC4KKy8vIEhpZXJtaXQgd2lyZCBkaWUgQXVzZ2FiZSBkZXMgSGlud2Vpc2VzIHVudGVyZHJ1ZWNrdC4KKyAgU2V0UHJvcCggUF9ORVRERUFEX0lORk8sIDEgKTsKKworICBBZGRJZCggKHsgInF1ZXVlIiwgInNjaGxhbmdlIiB9KSApOworCisgIHBlb3BsZUluUXVldWUgPSAoWyBdKTsKKyAgbGFzdE1vdmVkID0gMDsKKworLy8gRGVmYXVsdHMgc2V0emVuCisgIFNldFByb3AoIFFfQ1lDTEVfVElNRSwgMTUgKTsKKyAgU2V0UHJvcCggUV9ERVNULCAiL2dpbGRlbi9hYmVudGV1cmVyIiApOworICBTZXRQcm9wKCBRX0xFTkdUSCwgMyApOworICBTZXRQcm9wKCBRX1NVU1BFTkQsIDAgKTsKKyAgU2V0UHJvcCggUV9NU0dTLCAoeyAiQEB3ZXJAQCBpc3QgYW4gZGVyIFJlaWhlISIsICJEdSBiaXN0IGpldHp0IGFuIGRlciBSZWloZSEiLAorICAgICAgIkRlciBOYWVjaHN0ZSBpc3QgYW4gZGVyIFJlaWhlLCB1bmQgZGllIGFuZGVyZW4gcnVlY2tlbiBhdWYuIiwKKyAgICAgICJEaWUgU2NobGFuZ2UgcnVlY2t0IHdlaXRlci4gU29nbGVpY2ggc3RlbGx0IHNpY2ggamVtYW5kIG5ldSBhbi4iIH0pICk7CisKKyAgQWRkU3BlY2lhbEV4aXQoICJyYXVzdHJldGVuIiwgInJhdXN0cmV0ZW4iICk7CisKKyAgQWRkQ21kKCAoeyAiYW5zdGVsbGVuIiwgInN0ZWxsIiwgInN0ZWxsZSIgfSksICJhbnN0ZWxsZW4iICk7CisgIEFkZENtZCggKHsgImRyYWVuZ2VsbiIsICJkcmFlbmdsZSIsICJkcmFlbmdlbCIsICJ2b3JkcmFlbmdlbG4iIH0pLCAiZHJhZW5nZWxuIiApOworfQorCitpbnQgY2xlYW5fdXAoaW50IGkpIHsgcmV0dXJuIDA7IH0KKworaW50CityZW1vdmUoKQoreworICBzdHJpbmcgKndlcjsKKyAgbWl4ZWQgcmF1czsKKyAgaW50IGk7CisKKyAgd2hpbGUoIHJlbW92ZV9jYWxsX291dCggInJvdGF0ZSIgKSAhPSAtMSApOworICB3aGlsZSggcmVtb3ZlX2NhbGxfb3V0KCAiZnVubnkiICkgIT0gLTEgKTsKKworICBpZiAoY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSB7CisgICAgaWYgKCEocmF1cyA9IGVudmlyb25tZW50KCkpKQorICAgICAgcmF1cyA9ICIvZ2lsZGVuL2FiZW50ZXVyZXIiOworCisgICAgaWYgKGkgPSBzaXplb2Yod2VyID0gbV9pbmRpY2VzKHBlb3BsZUluUXVldWUpKSkgeworICAgICAgdGVsbF9yb29tKHRoaXNfb2JqZWN0KCksICJEaWUgU2NobGFuZ2UgbG9lc3Qgc2ljaCBhdWYuXG4iICk7CisKKyAgICAgIHdoaWxlICgoLS1pKT4wKQorICBpZiAocGVvcGxlSW5RdWV1ZVt3ZXJbaV0sMV0pCisgICAgcGVvcGxlSW5RdWV1ZVt3ZXJbaV0sMV0tPm1vdmUocmF1cywgTV9HTyB8IE1fU0lMRU5UIHwgTV9OT19TSE9XKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDo6cmVtb3ZlKCk7Cit9CisKK3N0cmluZworX3F1ZXJ5X2xvbmcoKQoreworICBzdHJpbmcgcmV0LCBhZGQ7CisgIG1peGVkICpwZW9wbGUsIG9iOworICBjbG9zdXJlIG47CisKKyAgcGVvcGxlID0gZmlsdGVyKGFsbF9pbnZlbnRvcnkodGhpc19vYmplY3QoKSksICMnaW50ZXJhY3RpdmUvKicqLyk7CisKKyAgcmV0ID0gUXVlcnkoUF9MT05HKTsKKyAgYWRkID0gIkluIGRlciBTY2hsYW5nZSBzdGVoZW4gIiArIFF1ZXJ5UHJvcChRX0xFTkdUSCkgKyAiIExldXRlLiI7CisgIGlmIChzaXplb2YocGVvcGxlKSkgeworICAgIG4gPSBsYW1iZGEoICh7ICdvYiB9KSwgKHsjJ2NhbGxfb3RoZXIsICdvYiwgIk5hbWUiLCBXRVJ9KSApOworICAgIHBlb3BsZSA9IG1hcChwZW9wbGUsIG4pOworICAgIGFkZCArPSAiIFVudGVyIGFuZGVyZW0gc3RlaCI7CisgICAgaWYgKHNpemVvZihwZW9wbGUpID09IDEpCisgICAgICBhZGQgKz0gKCAidCBkb3J0ICIgKyBwZW9wbGVbMF0gKyAiLiIgKTsKKyAgICBlbHNlIHsKKyAgICAgIGFkZCArPSAoICJlbiBkb3J0ICIgKyBpbXBsb2RlKHBlb3BsZVswLi48Ml0sICIsICIpICsKKyAgICAgICAgICIgdW5kICIgKyBwZW9wbGVbPDFdICsgIi4iICk7CisgICAgfQorICB9CisgIHJldHVybiByZXQgKyBicmVha19zdHJpbmcoYWRkLCA3Nik7Cit9CisKK3N0cmluZworX3F1ZXJ5X2ludF9sb25nKCkKK3sKKyAgc3RyaW5nIHJldCwgYWRkOworICBpbnQgYWN0LCBjdXI7CisKKyAgcmV0ID0gUXVlcnkoUF9JTlRfTE9ORyk7CisgIGFkZCA9ICIiOworICBhY3QgPSBwZW9wbGVJblF1ZXVlW2dldHVpZChUUCksIDBdOworICBjdXIgPSBRdWVyeVByb3AoUV9MRU5HVEgpOworCisgIGlmIChhY3QgPT0gMCkKKyAgICBhZGQgKz0gKCAiRHUgYmlzdCBhbHMgbmFlY2hzdGVyIGFuIGRlciBSZWloZS4gSGludGVyIERpciIKKyAgICAgICsiIHN0ZWhlbiBub2NoICIgKyAoY3VyIC0gMSkgKyIgTGV1dGUgYW4uIiApOworICBlbHNlIHsKKyAgICBpZiAoYWN0ID09IDEpCisgICAgICBhZGQgKz0gIkVzIGlzdCBub2NoIGplbWFuZCB2b3IgRGlyIGRyYW4uIjsKKyAgICBlbHNlCisgICAgICBhZGQgKz0gKCAiRXMgc2luZCBub2NoICIgKyBhY3QgKyAiIExldXRlIHZvciBEaXIgZHJhbi4iICk7CisKKyAgICBpZiAoKGN1ciA9IGN1ciAtIGFjdCAtMSkgPiAwKSB7CisgICAgICBpZiAoY3VyID09IDEpCisgIGFkZCArPSAiIEVzIHN0ZWh0IG5vY2ggamVtYW5kIGhpbnRlciBEaXIuIjsKKyAgICAgIGVsc2UKKyAgYWRkICs9ICggIiBIaW50ZXIgRGlyIHN0ZWhlbiBub2NoICIgKyBjdXIgKyIgTGV1dGUgYW4uIiApOworICAgIH0KKyAgfQorICByZXR1cm4gcmV0ICsgYnJlYWtfc3RyaW5nKGFkZCwgNzYpOworfQorCitpbnQgX3F1ZXJ5X3FMZW5ndGgoKQoreworICByZXR1cm4gUXVlcnkoUV9MRU5HVEgpICsgc2l6ZW9mKGZpbHRlcihhbGxfaW52ZW50b3J5KHRoaXNfb2JqZWN0KCkpLCAjJ2ludGVyYWN0aXZlLyonKi8pKTsKK30KKworc3RhdGljIGludAorYW5zdGVsbGVuKHN0cmluZyBzdHIpCit7CisgIG9iamVjdCB0cDsKKyAgc3RyaW5nICpwYXJ0OworCisgIGlmIChxdWVyeV92ZXJiKCkgIT0gImFuc3RlbGxlbiIpIHsKKyAgICBub3RpZnlfZmFpbCggInN0ZWxsZSB3YXM/XG4iICk7CisgICAgaWYgKCFzdHIgfHwgc3RyID09ICIiKQorICAgICAgcmV0dXJuIDA7CisKKyAgICBwYXJ0ID0gb2xkX2V4cGxvZGUoc3RyLCAiICIpOworICAgIGlmIChwYXJ0WzBdICE9ICJhbiIgJiYgcGFydFs8MV0gIT0gImFuIikgeworICAgICAgbm90aWZ5X2ZhaWwoICJTeW50YXg6IHN0ZWxsZSBhbiA8c2NobGFuZ2U+IGFuXG4iICk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCFpZChpbXBsb2RlKHBhcnRbMS4uPDJdLCAiICIpKSkKKyAgICAgIHJldHVybiAwOworICB9CisgIGVucXVldWUoVFApOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludAorcmF1c3RyZXRlbigpCit7CisgIGlmIChlbnZpcm9ubWVudCh0aGlzX29iamVjdCgpKSkgeworICAgIGxlYXZlUXVldWUoVFAsIDApOworICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CitkcmFlbmdlbG4oc3RyaW5nIHN0cikKK3sKKyAgaW50IHByb2I7CisgIHN0cmluZyAqcGVvcGxlOworCisgIGlmIChlbnZpcm9ubWVudChUUCkgIT0gdGhpc19vYmplY3QoKSkKKyAgICByZXR1cm4gMDsKKworICBwcm9iID0gcmFuZG9tKDExKTsKKworICBpZiAoMTAgPT0gcHJvYikgeworICAgIHNheSggVFAtPk5hbWUoV0VSKSArICIgd2lsbCBzaWNoIHZvcmRyYWVuZ2Vsbi4gWnVyIFN0cmFmZSB3aXJkICIKKyAgICAgICtUUC0+UXVlcnlQcm9ub3VuKFdFUikgKyIgdm9uIGRlciBhdWYtXG4iCisgICAgICArImdlYnJhY2h0ZW4gTWVuZ2UgYXVzIGRlciBTY2hsYW5nZSBoaW5hdXNnZXdvcmZlbi4gRHUgZ3JpbnN0IERpciBlaW5zLlxuIiApOworICAgIHdyaXRlKCAiRHUgZHJhZW5nZWxzdCBEaWNoIHZvciwgd2lyc3QgYWJlciB2b24gZGVyIGF1ZmdlYnJhY2h0ZW4gIgorICAgICAgKyJNZW5nZSBhdXMgZGVyXG5TY2hsYW5nZSBoZXJhdXNnZWRyYWVuZ3QuXG4iICk7CisgICAgbGVhdmVRdWV1ZShUUCwgMCk7CisgIH0KKyAgZWxzZSBpZiAocHJvYiA8IDgpIHsKKyAgICBzYXkoIFRQLT5OYW1lKFdFUikgKyAiIHdpbGwgc2ljaCB2b3JkcmFlbmdlbG4uXG4iICk7CisgICAgd3JpdGUoICJEdSB3aWxsc3QgRGljaCB2b3JkcmFlbmdlbG4uXG4iICk7CisgICAgdGVsbF9yb29tKHRoaXNfb2JqZWN0KCksIHNwcmludGYoIkVzIGtvbW1lbiBSdWZlIGF1ZjogJXNcbiIsCisgICAgICAgKHsgIkhlISBXYXMgc29sbCBkZW5uIGRhcz8gVW5lcmhvZXJ0ISIsCisgICAgIkFsc28gd2lya2xpY2ghIFVudmVyc2NoYWVtdGhlaXQgc293YXMhIiwKKyAgICAiLi4uc29sbCduIGRhcz8gTWlzdGJhY2tlISIsCisgICAgIkphdSwgc293ZWl0IGtvbW10cyBub2NoISBJY2ggZ2xhdWInIGVzIGdlaHQgbG9zISIsCisgICAgIldpZWRlciBtYWwgdHlwaXNjaCAiK1RQLT5RdWVyeVByb3AoUF9SQUNFU1RSSU5HKVtXRVJdKyIhIiwKKyAgICAiV2VubiBzaWNoIGRhcyBqZWRlciBlcmxhdWJlbiB3dWVyZGUuLi4iLAorICAgICJOZSwgbmUsIGRhcyBnZWh0IGFiZXIgbmljaHQhIE1hbCBsYW5nc2FtLCAiKworICAgICAgIChUUC0+UXVlcnlQcm9wKFBfR0VOREVSKT09TUFMRSA/ICJCdWVyc2NoY2hlbiI6IkZyb2xsZWluIikrIiEiLAorICAgICJQT0xJWkVJISBISUxGQUVFRUghISEgQWxzbyBkaWUgSnVnZW5kIHZvbiBoZXV0ZS4uLiIgfSlbcHJvYl0gKSk7CisgICAgc2F5KCBjYXBpdGFsaXplKFRQLT5RdWVyeVByb25vdW4oKSkrIiB1ZWJlcmxlZ3QgZXMgc2ljaCBhbmRlcnMuXG4iICk7CisgICAgd3JpdGUoICJEdSB1ZWJlcmxlZ3N0IGVzIERpciBhbmRlcnMuXG4iICk7CisgIH0KKyAgZWxzZSB7CisgICAgc2F5KCBUUC0+TmFtZShXRVIpICsgIiBkcmFlbmdlbHQgc2ljaCB2b3IuXG4iICk7CisgICAgd3JpdGUoICJEdSBkcmFlbmdlbHN0IERpY2ggdm9yLlxuIiApOworICAgIHByb2IgPSBwZW9wbGVJblF1ZXVlW2dldHVpZChUUCldOworICAgIG1fZGVsZXRlKHBlb3BsZUluUXVldWUsIGdldHVpZChUUCkpOworICAgIGZvcihwZW9wbGUgPSBtX2luZGljZXMocGVvcGxlSW5RdWV1ZSk7IHNpemVvZihwZW9wbGUpOyBwZW9wbGUgPSBwZW9wbGVbMS4uXSApIHsKKyAgICAgIGlmKHBlb3BsZUluUXVldWVbcGVvcGxlWzBdLDBdIDwgcHJvYikKKyAgICAgIHBlb3BsZUluUXVldWVbcGVvcGxlWzBdLDBdKys7CisgICAgfQorICAgIHBlb3BsZUluUXVldWUgKz0gKFsgZ2V0dWlkKFRQKSA6IDA7IFRQIF0pOworICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAorZW5xdWV1ZShvYmplY3Qgb2IpCit7CisgIGludCBpOworCisgIGlmIChlbnZpcm9ubWVudChvYikgPT0gdGhpc19vYmplY3QoKSkgeworICAgIHNheShvYi0+TmFtZShXRVIpICsgIiBzdGVsbHQgc2ljaCB3aWVkZXIgaGludGVuIGFuLlxuIiwgb2IgKTsKKyAgICB0ZWxsX29iamVjdChvYiwgIkR1IHN0ZWxsc3QgRGljaCB3aWVkZXIgaGludGVuIGFuLlxuIiApOworCisgICAgaSA9IHBlb3BsZUluUXVldWVbZ2V0dWlkKG9iKSwwXTsKKyAgICBtX2RlbGV0ZShwZW9wbGVJblF1ZXVlLCBnZXR1aWQob2IpKTsKKyAgICBhZGp1c3QoaSk7CisgICAgcGVvcGxlSW5RdWV1ZSArPSAoWyBnZXR1aWQob2IpIDogUXVlcnlQcm9wKFFfTEVOR1RIKS0xOyBvYiBdKTsKKyAgfQorICBlbHNlIHsKKyAgICBwZW9wbGVJblF1ZXVlICs9IChbIGdldHVpZChvYikgOiBRdWVyeVByb3AoUV9MRU5HVEgpOyBvYiBdKTsKKyAgICBvYi0+bW92ZSh0aGlzX29iamVjdCgpLCBNX05PQ0hFQ0ssIDAsICJzdGVsbHQgc2ljaCBhbiAiK25hbWUoV0VNKSsiIGFuIiwKKyAgICAgICJzdGVsbHQgc2ljaCBoaW50ZW4gYW4iKTsKKyAgfQorICBpZiAoZmluZF9jYWxsX291dCgicm90YXRlIikgPT0gLTEpCisgICAgY2FsbF9vdXQoInJvdGF0ZSIsIFF1ZXJ5UHJvcChRX0NZQ0xFX1RJTUUpKTsKK30KKworcHJpdmF0ZSB2b2lkCitsZWF2ZVF1ZXVlKG9iamVjdCBvYiwgaW50IHNpbGVudCkKK3sKKyAgaW50IGk7CisKKyAgaWYgKHNpbGVudCkKKyAgICBvYi0+bW92ZShlbnZpcm9ubWVudCh0aGlzX29iamVjdCgpKSwgTV9OT0NIRUNLIHwgTV9TSUxFTlQpOworICBlbHNlCisgICAgb2ItPm1vdmUoZW52aXJvbm1lbnQodGhpc19vYmplY3QoKSksIE1fTk9DSEVDSywgMCwgInZlcmxhZXNzdCBkaWUgU2NobGFuZ2UiLAorICAgICJ2ZXJsYWVzc3QgIituYW1lKFdFTikrIiB1bmQgc3RlaHQgamV0enQgbmViZW4gRGlyIiApOworCisgIGkgPSBwZW9wbGVJblF1ZXVlW2dldHVpZChvYiksIDBdOworCisgIG1fZGVsZXRlKHBlb3BsZUluUXVldWUsIGdldHVpZChvYikpOworCisgIGlmIChzaXplb2YocGVvcGxlSW5RdWV1ZSkpCisgICAgYWRqdXN0KGkpOworICBlbHNlIHsKKyAgICB3aGlsZShyZW1vdmVfY2FsbF9vdXQoInJvdGF0ZSIpICE9IC0xKTsKKyAgICB3aGlsZShyZW1vdmVfY2FsbF9vdXQoImZ1bm55IikgIT0gLTEpOworICB9Cit9CisKK3ByaXZhdGUgaW50CitxdWV1ZVNjYW4oKQoreworICBzdHJpbmcgKnBlb3A7CisgIG9iamVjdCBhY3Q7CisgIGludCBpLCBhOworCisgIHBlb3AgPSBtX2luZGljZXMocGVvcGxlSW5RdWV1ZSk7CisKKyAgZm9yIChpPXNpemVvZihwZW9wKS0xOyBpPj0wOyBpLS0pIHsKKyAgICBpZiAoIW9iamVjdHAoYWN0ID0gcGVvcGxlSW5RdWV1ZVtwZW9wW2ldLDFdKSB8fAorICAoZW52aXJvbm1lbnQoYWN0KSAhPSB0aGlzX29iamVjdCgpKSkgeworICAgICAgYSA9IHBlb3BsZUluUXVldWVbcGVvcFtpXSwgMF07CisgICAgICBtX2RlbGV0ZShwZW9wbGVJblF1ZXVlLCBwZW9wW2ldKTsKKyAgICAgIGFkanVzdChhKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gc2l6ZW9mKHBlb3BsZUluUXVldWUpOworfQorCitwcml2YXRlIG9iamVjdAorYWRqdXN0KGludCB0aHJlc2gpCit7CisgIHN0cmluZyAqcGVvcDsKKyAgb2JqZWN0IHJldDsKKyAgaW50IGNudCwgaTsKKworICByZXQgPSAwOworICBwZW9wID0gbV9pbmRpY2VzKHBlb3BsZUluUXVldWUpOworCisgIGZvciAoaT1zaXplb2YocGVvcCktMTsgaT49MDsgaS0tKSB7CisgICAgY250ID0gcGVvcGxlSW5RdWV1ZVtwZW9wW2ldLDBdOworICAgIGlmIChjbnQgPiB0aHJlc2gpCisgICAgICBjbnQtLTsKKyAgICBpZiAoY250IDwgMCkKKyAgICAgIHJldCA9IHBlb3BsZUluUXVldWVbcGVvcFtpXSwxXTsKKyAgICBwZW9wbGVJblF1ZXVlW3Blb3BbaV0sMF0gPSBjbnQ7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworcm90YXRlKCkKK3sKKyAgb2JqZWN0IGljaDsKKyAgc3RyaW5nIG90aCwgKm1zZ3M7CisgIGludCByb3RhdGluZywgaW5EZXN0OworCisgIHJvdGF0aW5nID0gMTsKKworICBpZiAoUXVlcnlQcm9wKFFfU1VTUEVORCkpIHsKKyAgICBpZiAobGFzdE1vdmVkKSB7CisgICAgICByb3RhdGluZyA9IDA7CisgICAgICBpbkRlc3QgPSAob2JqZWN0X25hbWUoZW52aXJvbm1lbnQobGFzdE1vdmVkKSkgPT0gUXVlcnlQcm9wKFFfREVTVCkpOworICAgICAgaWYgKCFpbnRlcmFjdGl2ZShsYXN0TW92ZWQpIHx8ICFpbkRlc3QgKQorICByb3RhdGluZyA9IDE7CisgICAgICBpZiAoaW50ZXJhY3RpdmUobGFzdE1vdmVkKSAmJiBpbkRlc3QgJiYgZW52aXJvbm1lbnQoKSAmJiBxdWVyeV9pZGxlKGxhc3RNb3ZlZCkgPiAxODApIHsKKyAgdGVsbF9vYmplY3QobGFzdE1vdmVkLCAiRHUgd2lyc3QgcmF1c2dld29yZmVuLlxuIik7CisgIGxhc3RNb3ZlZC0+bW92ZShlbnZpcm9ubWVudCgpLCBNX0dPLCAwLCAiaWRsZXQgaGVyZWluIik7CisgIHJvdGF0aW5nID0gMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKHJvdGF0aW5nKSB7CisgICAgcXVldWVTY2FuKCk7CisgICAgbXNncyA9IFF1ZXJ5UHJvcChRX01TR1MpOworICAgIGlmIChpY2ggPSBhZGp1c3QoLTEpKSB7CisgICAgICBvdGggPSBpbXBsb2RlKGV4cGxvZGUobXNnc1tRTVNHX09USEVSXSwgIkBAd2VyQEAiKSwgaWNoLT5uYW1lKFdFUikgKTsKKyAgICAgIG90aCA9IGltcGxvZGUoZXhwbG9kZShvdGgsICJAQHdlc3NlbkBAIiksIGljaC0+bmFtZShXRVNTRU4pICk7CisgICAgICBvdGggPSBpbXBsb2RlKGV4cGxvZGUob3RoLCAiQEB3ZW1AQCIpLCBpY2gtPm5hbWUoV0VNKSApOworICAgICAgb3RoID0gaW1wbG9kZShleHBsb2RlKG90aCwgIkBAd2VuQEAiKSwgaWNoLT5uYW1lKFdFTikgKTsKKyAgICAgIHRlbGxfcm9vbSh0aGlzX29iamVjdCgpLCBjYXBpdGFsaXplKGJyZWFrX3N0cmluZyhvdGgsIDc4KSksICh7IGljaCB9KSApOworICAgICAgdGVsbF9vYmplY3QoaWNoLCBicmVha19zdHJpbmcobXNnc1tRTVNHX01FXSwgNzgpICk7CisgICAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSwgYnJlYWtfc3RyaW5nKG1zZ3NbUU1TR19PVVRTSURFXSwgNzgpICk7CisgICAgICBpY2gtPm1vdmUoUXVlcnlQcm9wKFFfREVTVCksIE1fR08pOworICAgICAgbGFzdE1vdmVkID0gaWNoOworICAgICAgbV9kZWxldGUocGVvcGxlSW5RdWV1ZSwgZ2V0dWlkKGljaCkpOworICAgICAgaWYgKCFzaXplb2YocGVvcGxlSW5RdWV1ZSkpCisgIHJldHVybjsKKyAgICB9CisgICAgZWxzZQorICAgICAgdGVsbF9yb29tKHRoaXNfb2JqZWN0KCksIGJyZWFrX3N0cmluZyhtc2dzW1FNU0dfREVGQVVMVF0sIDc4KSApOworICB9CisKKyAgaWYgKHJhbmRvbSgxMDApIDwgMjApCisgICAgY2FsbF9vdXQoImZ1bm55IiwgcmFuZG9tKFF1ZXJ5UHJvcChRX0NZQ0xFX1RJTUUpKSApOworCisgIGNhbGxfb3V0KCJyb3RhdGUiLCBRdWVyeVByb3AoUV9DWUNMRV9USU1FKSk7Cit9CisKK2Z1bm55KCkKK3sKKyAgc3RyaW5nIG07CisKKyAgc3dpdGNoKHJhbmRvbSg3KSkgeworICAgIGNhc2UgMDoKKyAgICAgIG09ICJKZW1hbmQgdm9yIERpciBsYWVzc3QgdGllcmlzY2ggZWluZW4gZmFocmVuLiBTZWx0c2FtZXJ3ZWlzZSB3aXJmdCBtYW5cbiIKKyAgKyJhYmVyIERpciBtaXNzYmlsbGlnZW5kZSBCbGlja2UgenUuXG4iOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgbT0gIlZvbiBoaW50ZW4gZHJhZW5nZWx0IHdlciEgV3VldGVuZCBkcmVoc3QgRHUgRGljaCB1bSwgc2NoYXVzdCBob2NoLCBzY2hhdXN0XG4iCisgICsiaG9laGVyLCBzY2hhdXN0IG5vY2ggaG9laGVyLi4uIHVuZCBzY2hvbiBpc3QgRGVpbmUgV3V0IHZlcmZsb2dlbiFcbiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBtPSAiVm9yIExhbmdld2VpbGUgcG9wZWx0IGplbWFuZCB2b3IgRGlyIGluIGRlciBOYXNlLiBEYXMgcXVpZXRzY2hlbmRlIEdlLVxuIgorICArInJhZXVzY2ggbGFlc3N0IERpciBkYXMgQmx1dCBpbiBkZW4gQWRlcm4gZ2VmcmllcmVuLlxuIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgIG09ICJFaW4gZmxpZWdlbmRlciBIYWVuZGxlciBsYW5kZXQgbmViZW4gZGVyIFNjaGxhbmdlIHVuZCBiaWV0ZXQgS3VyendhcmVuXG4iCisgICsiZmVpbC4gRGEgYWJlciBuaWVtYW5kIGV0d2FzIGthdWZlbiB3aWxsLCBoZWJ0IGVyIGt1cnogZGFyYXVmIHdpZWRlciBhYlxuIgorICArInVuZCBmbGllZ3QgenUgZWluZXIgYW5kZXJlbiBTY2hsYW5nZSwgdW0gZG9ydCBzZWluIEdsdWVjayB6dSB2ZXJzdWNoZW4uXG4iOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgbT0gIlZvbSBoaW50ZXJlbiBFbmRlIGRlciBTY2hsYW5nZSBzaWNrZXJ0IGRhcyBHZXJ1ZWNodCBkdXJjaCwgZGFzcyBkZXJcbiIKKyAgKyJTY2hhbHRlciBoZXV0ZSBnZXNjaGxvc3NlbiBpc3QuIER1IGhvZmZzdCBpbnN0YWVuZGlnLCBkYXNzIGRpZXMgbmljaHRcbiIKKyAgKyJ3YWhyIGlzdC5cbiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDU6CisgICAgICBtPSAiRmFzemluaWVydCBiZW9iYWNodGVzdCBEdSwgd2llIGVpbmUgU3Bpbm5lIHp3aXNjaGVuIERlaW5lbSBWb3JkZXJtYW5uIHVuZFxuIgorICArImRlciBXYW5kIGVpbiBrdW5zdHZvbGxlcyBOZXR6IHNwaW5udC5cbiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDY6CisgICAgICBtPSAiQm9haCwgaXNzIGRhdCBsYW5nd2VpbGljaC4uLlxuIjsKKyAgICAgIGJyZWFrOworICB9CisgIHRlbGxfcm9vbSh0aGlzX29iamVjdCgpLCBtKTsKK30KKwordm9pZAorQmVjb21lc05ldERlYWQob2JqZWN0IHBsYXllcikKK3sKKyAgaWYocHJlc2VudChwbGF5ZXIsdGhpc19vYmplY3QoKSkpbGVhdmVRdWV1ZShwbGF5ZXIsIDApOworfQorCit2b2lkCitQbGF5ZXJRdWl0KG9iamVjdCBwbGF5ZXIpCit7CisgIGlmKHByZXNlbnQocGxheWVyLHRoaXNfcGxheWVyKCkpKWxlYXZlUXVldWUocGxheWVyLCAxKTsKK30KKwpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL3F1ZXVlLmggYi9kL3NlaGVyL2hhZXVzZXIvcXVldWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjIyODNlCi0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL3F1ZXVlLmgKQEAgLTAsMCArMSwzNCBAQAorI2lmbmRlZiBfUVVFVUVfSF8KKyNkZWZpbmUgX1FVRVVFX0hfCisKKy8vIFplaXQsIGJpcyBkZXIgbmFlY2hzdGUgZHJhbiBpc3QgKERlZmF1bHQ6IDE1IFNla3VuZGVuKQorI2RlZmluZSBRX0NZQ0xFX1RJTUUgInFDeWNsZVRpbWUiCisKKy8vIFppZWxyYXVtIGRlciBTY2hsYW5nZSAoRGVmYXVsdDogIi9naWxkZW4vYWJlbnRldXJlciIpCisjZGVmaW5lIFFfREVTVAkgICAgICJxRGVzdCIKKworLy8gTGFlbmdlIGRlciBTY2hsYW5nZSAoRGVmYXVsdDogMykKKyNkZWZpbmUgUV9MRU5HVEggICAgICJxTGVuZ3RoIgorCisvLyBGYWxscyB1bmdsZWljaCBOdWxsLCB3aXJkIGdld2FydGV0LCBiaXMgZGVyIHp1bGV0enQgYmV3ZWd0ZSBTcGllbGVyCisvLyBkZW4gWmllbHJhdW0gdmVybGFzc2VuIGhhdCwgYmV2b3IgZXMgaW4gZGVyIFNjaGxhbmdlIHdlaXRlcmdlaHQKKyNkZWZpbmUgUV9TVVNQRU5EICAgICJxU3VzcGVuZCIKKworLy8gTWVsZHVuZ2VuLCBkaWUgYmVpbSBBdWZydWVja2VuIGF1c2dlZ2ViZW4gd2VyZGVuLiBWaWVyZWxlbWVudGlnZXMgQXJyYXk6CisvLyAxLiBNZWxkdW5nLCB3ZW5uIGVpbiBTcGllbGVyIGFuIGRlciBSZWloZSBpc3QKKy8vIDIuIE1lbGR1bmcgZnVlciBkZW4gU3BpZWxlciwgZGVyIGFuIGRlciBSZWloZSBpc3QKKy8vIDMuIE1lbGR1bmcsIHdlbm4gZWluIFNjaGxhbmdlc3RlaGVyIGFuIGRlciBSZWloZSBpc3QKKy8vIDQuIE1lbGR1bmcgZnVlciBMZXV0ZSBhdXNzZXJoYWxiIGRlciBTY2hsYW5nZQorLy8gSW4gZGllIGVyc3RlIE1lbGR1bmcga2FubiBtaXQgQEB3ZXJAQCwgQEB3ZXNzZW5AQCwgQEB3ZW1AQCB1bmQgQEB3ZW5AQCBkZXIKKy8vIE5hbWUgZGVzIFNwaWVsZXJzIGVpbmdlYXJiZWl0ZXQgd2VyZGVuLgorLy8gKERlZmF1bHQ6ICh7ICJAQHdlckBAIGlzdCBhbiBkZXIgUmVpaGUhIiwgIkR1IGJpc3QgamV0enQgYW4gZGVyIFJlaWhlISIsCisvLyAgICAiRGVyIE5hZWNoc3RlIGlzdCBhbiBkZXIgUmVpaGUsIHVuZCBkaWUgYW5kZXJlbiBydWVja2VuIGF1Zi4iLAorLy8gICAgIkRpZSBTY2hsYW5nZSBydWVja3Qgd2VpdGVyLiBTb2dsZWljaCBzdGVsbHQgc2ljaCBqZW1hbmQgbmV1IGFuLiIgfSkgKQorI2RlZmluZSBRX01TR1MJICAgICAicU1zZ3MiCisKKyNkZWZpbmUgUU1TR19PVEhFUiAgIDAKKyNkZWZpbmUgUU1TR19NRSAgICAgIDEKKyNkZWZpbmUgUU1TR19ERUZBVUxUIDIKKyNkZWZpbmUgUU1TR19PVVRTSURFIDMKKworI2VuZGlmIC8qIF9RVUVVRV9IXyAqLwpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL3JhdW0uYyBiL2Qvc2VoZXIvaGFldXNlci9yYXVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZkMGM1NQotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci9yYXVtLmMKQEAgLTAsMCArMSwxODQwIEBACisvLyAgcmF1bS5jICAtLSBEYXMgUm9oZ2VydWVzdCBlaW5lcyBTZWhlcmhhdXNlcy4KKy8vCisvLyAgR3J1bmRvYmpla3QgKGMpIDE5OTQgQm9pbmdATW9yZ2VuR3JhdWVuCisvLyAgQWJzY2hsaWVzc2VuIHVuZCBSYXVzd2VyZmVuIHZvbiBKb2YKKy8vICBGdWVyIEFlbmRlcnVuZ2VuIGFiIGRlbSAwNi4xMC45NCB2ZXJhbnR3b3J0bGljaDogV2FyZ29uCisvLyAgQWIgMDMuMDIuOTggV3VyemVsCisvLworLy8gJElkOiByYXVtLmMsdiAxLjUgMjAwMy8xMS8xNSAxNDowMzo1OCBtdWQgRXhwICQKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHJ0dF9jaGVja3MKKworI2luY2x1ZGUgImhhdXMuaCIKKworaW5oZXJpdCAiL3N0ZC9yb29tIjsKK2luaGVyaXQgVVNFUkNNRDsgICAgLy8gc2VsYnN0ZGVmaW5pZXJ0ZSBLb21tYW5kb3MKK2luaGVyaXQgTE9TQTsgICAgICAgLy8gTG9hZCgpIHVuZCBTYXZlKCkKK2luaGVyaXQgIi9tYWlsL25lZGl0IjsKKworI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8bW92aW5nLmg+CisKK3N0YXRpYyBtaXhlZCBkZXRhaWw7CitzdGF0aWMgc3RyaW5nIG93bmVyOworc3RhdGljIGludCBmbGFnLCBjc2F2ZWQ7CitzdGF0aWMgaW50IHJhdW1OcjsKK3N0YXRpYyBzdHJpbmcgKmF1c2dhZW5nZSA9ICh7ICJvYmVuIiwgIm5vcmRlbiIsICJub3Jkb3N0ZW4iLCAib3N0ZW4iLCAic3VlZG9zdGVuIiwKKyAgICAgICAgICAgICAgICAgICJ1bnRlbiIsICJzdWVkZW4iLCAic3VlZHdlc3RlbiIsICJ3ZXN0ZW4iLCAibm9yZHdlc3RlbiIgfSk7CisKKy8vIFByb3RvdHlwZXMgZnVlciBGdW5rdGlvbmVuIGF1cyBMT1NBCit2YXJhcmdzIHZvaWQgU2F2ZShpbnQgY3J1bmNoZWQpOwordm9pZCBMb2FkKCk7CisKKy8vIFByb3RvdHlwZQorLy8gRmFsbHMgbm9ldGlnLCBtYWNoZSBlaW5lbiBOb3RhdXNnYW5nLCBmYWxscyBuaWNodCBsb2VzY2hlIHZvcmhhbmRlbmVuCit2b2lkIG1ha2VfZW1lcmdlbmN5X2V4aXQoKTsKKworLy8gZXJzZXR6dCBAQCBkdXJjaCAqKgorcHJpdmF0ZSBzdHJpbmcgbm9ybXN0cihzdHJpbmcgc3RyKQoreworICByZXR1cm4gaW1wbG9kZShleHBsb2RlKHN0ciwiQEAiKSwiKioiKTsKK30KKworLy8gbGllZmVydCBrb21tYWdldHJlbm50ZSBUZWlsZSBvaG5lIHp1c2FldHpsaWNoZSBMZWVyemVpY2hlbgorLy8gIkJsYSBibHViYiAsICBmb28gYmFyLGJsdWJiZXIiID0+ICh7ICJCbGEgYmx1YmIiLCAiZm9vIGJhciIsICJibHViYmVyIiB9KQorcHJpdmF0ZSBzdHJpbmcgKmJyayhzdHJpbmcgc3RyKQoreworICBzdHJpbmcgKnQxOworCisgIHQxID0gZXhwbG9kZShzdHIsICIsIik7CisgIG1hcCh0MSwgIyd0cmltIC8qJyovKTsKKyAgcmV0dXJuIHQxOworfQorCisvLyB0ZXN0ZSBCZWZlaGwKK3ByaXZhdGUgaW50IGJlZkNoZWNrKHN0cmluZyBiZWYpCit7CisgIC8vIEJlZmVobCBlbnRoYWVsdCBMZWVyemVpY2hlbiA9PiByZXR1cm4gMAorICBpZiAobWVtYmVyKGJlZiwgJyAnKSA+IC0xKQorICAgIHJldHVybiAwOworCisgIC8vIEJlZmVobCBpc3QgYmVyZWl0cyBLb21tYW5kbyAoYXVzc2VyIE9lZmZuZW4vU2NobGllc3NlbikKKyAgLy8gb2RlciBSaWNodHVuZyBpbmNsdXNpdmUgInJhdXMiIGluIGRpZSBrZWluIEF1c2dhbmcgZnVlaHJ0CisgIC8vID0+IHJldHVybiAwCisgIGlmIChtZW1iZXIobV9pbmRpY2VzKFF1ZXJ5UHJvcChQX0NPTU1BTkRTKSkgLQorICAgICAgICAgICAgICAgICAgICAgICAoeyJvZWZmbmUiLCJzY2hsaWVzcyIsInNjaGxpZXNzZSJ9KSwgYmVmKSA+IC0xCisgICAgICB8fCAobWVtYmVyKGF1c2dhZW5nZSsoeyJyYXVzIn0pLCBiZWYpID4gLTEKKyAgICAgICAgICAmJiBtZW1iZXIobV9pbmRpY2VzKFF1ZXJ5UHJvcChQX0VYSVRTKSksIGJlZikgPT0gLTEpKQorICAgIHJldHVybiAwOworCisgIHJldHVybiAxOworfQorCisvLyBUZXN0IGF1ZiBIYXVzYmVzaXR6ZXIKK2ludCB0cF9vd25lcl9jaGVjaygpCit7CisgIGlmKGdldHVpZCh0aGlzX3BsYXllcigpKSAhPSBvd25lcikKKyAgeworICAgIG5vdGlmeV9mYWlsKCAiRGFzIGlzdCBuaWNodCBEZWluIEhhdXMhXG4iICk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8vIFRlc3QgYXVmIEhhdXNiZXNpdHplciBvZGVyIFBlcnNvbiBtaXQgRXJsYXVibmlzCitpbnQgYWxsb3dlZF9jaGVjayhvYmplY3QgX3Rlc3QpCit7CisgICBzdHJpbmcgKmV4dDsKKworICAgZXh0ID0gVkVSV0FMVEVSLT5IYXVzUHJvcChvd25lciwgSFBfQUxMT1dFRCkgKyAoeyBjYXBpdGFsaXplKG93bmVyKSB9KTsKKyAgIGlmKG1lbWJlcihleHQsIGNhcGl0YWxpemUoZ2V0dWlkKF90ZXN0KSkpIDwgMCkKKyAgIHsKKyAgICAgcmV0dXJuIDA7CisgICB9CisgICBlbHNlCisgICB7CisgICAgIHJldHVybiAxOworICAgfQorfQorCisvLyBGdW5rdGlvbiBlcnNldHp0IGR1cmNoIHRwX293bmVyX2NoZWNrKCkgdW5kIGFsbG93ZWRfY2hlY2sob2JqZWN0IF90ZXN0KQorLy8gZmFsbHMgYWxsb3dlZCA9PSAwID0+IHRlc3Qgb2IgdGhpc19wbGF5ZXIoKSBIYXVzYmVzaXR6ZXIKKy8vIGZhbGxzIGFsbG93ZWQgIT0gMCA9PiB0ZXN0IG9iIGFsbG93ZWQvdGhpc19wbGF5ZXIoKSBIYXVzYmVzaXR6ZXIKKy8vICAgICAgICAgICAgICAgICAgICAgICBvZGVyIFBlcnNvbiBtaXQgRXJsYXVibmlzCitkZXByZWNhdGVkIHZhcmFyZ3MgaW50IG93bmVyX2NoZWNrKG1peGVkIGFsbG93ZWQpCit7CisgIG9iamVjdCB0ZXN0OworCisgIGlmKG9iamVjdHAoYWxsb3dlZCkgJiYgcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShhbGxvd2VkKSkKKyAgeworICAgIC8vIFBhcmFtZXRlciBpc3QgU3BpZWxlcgorICAgIHRlc3QgPSBhbGxvd2VkOworICB9CisgIGVsc2UKKyAgeworICAgIC8vIGFuc29uc3RlbiBUUAorICAgIHRlc3QgPSB0aGlzX3BsYXllcigpOworICB9CisgIAorICBpZihhbGxvd2VkKQorICB7CisgICAgLy8gVGVzdCBhdWYgSGF1c2Jlc2l0emVyIG9kZXIgUGVyc29uIG1pdCBFcmxhdWJuaXMKKyAgICBpZighYWxsb3dlZF9jaGVjayh0ZXN0KSkKKyAgICB7CisgICAgICBub3RpZnlfZmFpbCggIkRhcyBkYXJmc3QgRHUgaW4gZGllc2VtIEhhdXMgbmljaHQhXG4iICk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgZWxzZSBpZihnZXR1aWQodGVzdCkgIT0gb3duZXIpCisgIHsKKyAgICAvLyBUZXN0IGF1ZiBIYXVzYmVzaXR6ZXIKKyAgICBub3RpZnlfZmFpbCggIkRhcyBpc3QgbmljaHQgRGVpbiBIYXVzIVxuIiApOworICAgIHJldHVybiAwOworICB9CisgIC8vIEVybGF1Ym5pcyBPSworICByZXR1cm4gMTsKK30KKworLy8gR2VzdGFsdGV0IE1lbGR1bmcgYXVzIFRleHRlbiBpbiBlaW5lbSBBcnJheToKKy8vIGFycmF5IGxlZXIgICAgICAgICAgICAgICAtPiBtZWxkZSBUZXh0IGluIG5vbmUKKy8vIGFycmF5IGhhdCBlaW4gRWxlbWVudCAgICAtPiBtZWxkZSBUZXh0IGluIG9uZSB1bmQgZXJzZXR6ZSAlcyBkdXJjaCBFbGVtZW50CisvLyBhcnJheSBoYXQgdmllbGUgRWxlbWVudGUgLT4gbWVsZGUgVGV4dCBpbiBtYW55IHVuZCBkYW5hY2gKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0aWVydGUgQXVmemFlaGx1bmcgZGVyIEVsZW1lbnRlCisvLyBmbGFnIGdlc2V0enRlcyBCaXQgMjogQXVmemFlaGx1bmcgbnVyIG1pdCBLb21tYSwga2VpbiAndW5kJworLy8gZmxhZyBnZXNldHp0ZXMgQml0IDE6IE1lbGR1bmcgd2lyZCBhbHMgU3RyaW5nIHJldHVybnQsIHNvbnN0IHBlciB3cml0ZSBhdXNnZWdlYmVuCit2YXJhcmdzIHN0cmluZyBhcnJfb3V0KG1peGVkIGFycmF5LCBzdHJpbmcgbm9uZSwgc3RyaW5nIG9uZSwgc3RyaW5nIG1hbnksIGludCBmbGFnKQoreworICBzdHJpbmcgdG1wLCBsYXN0c2VwOworICBtaXhlZCBhcnI7CisKKyAgc3dpdGNoKHNpemVvZihhcnJheSkpCisgIHsKKyAgICBjYXNlIDA6CisgICAgICB0bXAgPSBub25lOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgdG1wID0gc3ByaW50ZihvbmUsIGFycmF5WzBdKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0bXAgPSBtYW55OworICAgICAgYXJyID0gc29ydF9hcnJheShhcnJheSwgIyc+IC8qJyovKTsKKyAgICAgIGxhc3RzZXAgPSAoZmxhZyAmIDIpID8gIiwgIiA6ICIgdW5kICI7CisgICAgICB0bXAgKz0gQ291bnRVcChhcnIsICIsICIsIGxhc3RzZXApKyIuIjsKKyAgICAgIGJyZWFrOworICB9CisgIGlmIChmbGFnICYgMSkKKyAgICByZXR1cm4oYnJlYWtfc3RyaW5nKHRtcCwgNzUsIDAsIDEpKTsKKyAgZWxzZQorICAgIHdyaXRlKGJyZWFrX3N0cmluZyh0bXAsIDc1LCAwLCAxKSk7CisKKyAgcmV0dXJuIDA7Cit9CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpICYmIG9iamVjdF9uYW1lKHRoaXNfb2JqZWN0KCkpPT0oUkFVTSkpIHsKKyAgICAgIHNldF9uZXh0X3Jlc2V0KC0xKTsKKyAgICAgIHJldHVybjsKKyAgfQorICByb29tOjpjcmVhdGUoKTsKKyAgdXNlcmNtZDo6Y3JlYXRlKCk7CisgIGxvc2E6OmNyZWF0ZSgpOworCisgIFNldChQX0lOVF9MT05HLCBTQVZFLCBGX01PREVfQVMpOworICBTZXQoUF9JTlRfU0hPUlQsIFNBVkUsIEZfTU9ERV9BUyk7CisgIFNldChQX0VYSVRTLCBTQVZFLCBGX01PREVfQVMpOworICBTZXQoUF9ERVRBSUxTLCBTQVZFLCBGX01PREVfQVMpOworICBTZXQoUF9SRUFEX0RFVEFJTFMsIFNBVkUsIEZfTU9ERV9BUyk7CisgIFNldChQX0xJR0hULCBTQVZFLCBGX01PREVfQVMpOworCisgIFNldFByb3AoUF9JRFMsICh7InJhdW0iLCJzZWhlXHJoYXVzIn0pKTsKKyAgU2V0UHJvcChQX05BTUUsICJIYXVzIik7CisgIFNldFByb3AoUF9HRU5ERVIsIDApOworICBTZXRQcm9wKFBfVFJBTlNQQVJFTlQsIDApOworICBTZXRQcm9wKFBfTk9HRVQsIDEpOworICBTZXRQcm9wKFBfTElHSFQsIDEpOworICBTZXRQcm9wKFBfSU5ET09SUywgMSk7CisKKyAgQWRkQ21kKCAoeyAiYmVzY2hyZWliIiwgImJlc2NocmVpYmUiIH0pLCAiYmVzY2hyZWliZW4iICk7CisgIEFkZENtZCgidWViZXJzaWNodCIsICJ1ZWJlcnNpY2h0Iik7CisgIEFkZENtZCgiYXVzZ2FuZyIsICJhdXNnYW5nIik7CisgIEFkZENtZCggKHsibG9lc2NoZSIsICJsb2VzY2gifSksICJsb2VzY2giKTsKKyAgQWRkQ21kKCAoeyJ3aXJmIiwgIndlcmYiLCAid2VyZmUiIH0pLCAid2lyZiIpOworICBBZGRDbWQoICh7InNwZXJyIiwgInNwZXJyZSJ9KSwgInNwZXJyZW4iKTsKKyAgQWRkQ21kKCAoeyJrb3BpZXIiLCAia29waWVyZSIgfSksICJrb3BpZXJlbiIpOworICBBZGRDbWQoImxpY2h0IiwgImxpY2h0Iik7CisgIEFkZENtZCggKHsiYWVuZGVyZSIsICJhZW5kZXIiIH0pLCAiYWVuZGVybiIpOworICBBZGRDbWQoICh7Im1lbGR1bmciLCAibWVsZHVuZ2VuIn0pLCAicmVwb3J0Iik7Cit9CisKK3ZvaWQgaW5pdCgpCit7CisJb2JqZWN0IGhhdXM7CisgIAorICByb29tOjppbml0KCk7CisgIG5lZGl0Ojppbml0X3Jlc2N1ZSgpOworCisgIC8vIE1hZ2llciBiZXRyaXR0IGZyZW1kZXMgU2VoZXJoYXVzCisgIGlmIChxdWVyeV9vbmNlX2ludGVyYWN0aXZlKFBMKSAmJiBJU19MRUFSTkVSKFBMKSAmJiBnZXR1aWQoUEwpICE9IG93bmVyKSB7CisgICAgaWYgKFBMLT5RdWVyeVByb3AoUF9JTlZJUykpCisgICAgICAvLyBNYWdpZXIgaW52aXMgPT4gaW0gUmF1bSBtZWxkZW4KKyAgICAgIHRlbGxfcm9vbSh0aGlzX29iamVjdCgpLAorICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKFBMKSkrIiBiZXRyaXR0IHVuc2ljaHRiYXIgZGVuIFJhdW0uXG4iLAorICAgICAgICAgICh7UEx9KSk7CisKKyAgICBpZiAoKGhhdXMgPSBsb2FkX29iamVjdChIQVVTTkFNRShvd25lcikpKSAmJgorICAgICAgICAoaGF1cy0+UXVlcnlQcm9wKEhfRE9PUlNUQVQpICYgRF9MT0NLRUQpKQorICAgICAgLy8gVHVlciBpc3QgenUgPT4gTWFnaWVyIGVpbmVuIEhpbndlaXMgZ2ViZW4KKyAgICAgIHRlbGxfb2JqZWN0KFBMLCAiICoqKioqKiogQUNIVFVORyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqXG4gKiAiKworICAgICAgICBjYXBpdGFsaXplKG93bmVyKSsiIG1vZWNodGUgdmllbGxlaWNodCB1bmdlc3RvZXJ0IGJsZWliZW4hXG4gKlxuIgorICAgICAgICAiICoqKioqKiogQUNIVFVORyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpOworICB9Cit9CisgIAoraW50IFByZXZlbnRJbnNlcnRMaXZpbmcob2JqZWN0IG9iKQoreyAgCisgIHJldHVybiAwOworfQorCisvLyBHZWdlbnN0YWVuZGUga29tbWVuIGluIGRlbiBSYXVtCit2b2lkIE5vdGlmeUluc2VydChvYmplY3Qgb2IsIG9iamVjdCBvbGRlbnYpCit7CisJb2JqZWN0ICpmb3VuZDsKKworCWlmICghb2JqZWN0cChvYikpIHJldHVybjsKKwkKKwlpZiAob2ItPlF1ZXJ5UHJvcChIX0ZVUk5JVFVSRSkhPTApCisJeyAKKyAgICAvLyBkYXMgd2FzIHJlaW5rYW0gaXN0IGVpbiBhdXRvbG9hZCBNb2ViZWxzdHVlY2sKKyAgICAvLyBiZXRyYWNodGUgYWxsZSBzY2hvbiB2b3JoYW5kZW5lbiBhdXRvbG9hZCBNb2ViZWxzdHVlY2tlCisgICAgICBmb3VuZCA9IGZpbHRlcl9vYmplY3RzKGFsbF9pbnZlbnRvcnkodGhpc19vYmplY3QoKSksCisJCSAgICAgICAgIlF1ZXJ5UHJvcCIsIEhfRlVSTklUVVJFKTsKKwkgIGlmIChzaXplb2YoZm91bmQpPj1NQVhfRlVSTklUVVJFX1BFUl9ST09NKSAgICAgICAgCisgICAgICB7CisgICAgICAvLyBNYXhpbWFsLUFuemFobCB2b3JoYW5kZW5lciBhdXRvbG9hZCBTZWhlcmhhdXNtb2ViZWwgaXN0IHNjaG9uCisgICAgICAvLyBlcnJlaWNodAorCSAgICB0ZWxsX29iamVjdCh0aGlzX3BsYXllcigpLCBicmVha19zdHJpbmcoCisJICAgICAgIkVpbiBSYXVtIGthbm4gbnVyICIrTUFYX0ZVUk5JVFVSRV9QRVJfUk9PTSsiIHJlYm9vdGZlc3RlICIKKwkgICAgICAiTW9lYmVsIHNwZWljaGVybi4gSGllciBiZWZpbmRlbiBzaWNoIHNjaG9uICIrCisJICAgICAgQ291bnRVcChtYXBfb2JqZWN0cyhmb3VuZCwgIm5hbWUiKSkrIi4iKSk7CisJICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgCisgICAgICBxdWV1ZWRfc2F2ZSgpOyAvLyBTcGVpY2hlcm4gdm9yYmVyZWl0ZW4gKGZhbGxzIG1laHJlcmUgT2JqZWt0ZSAKKyAgICAgICAgICAgICAgICAgICAgIC8vIGdlZHJvcHB0IHdlcmRlbiwgd2lyZCBzbyBlaW4gb3ZlcmZsb3cgdmVyaGluZGVydC4KKwl9Cit9CisKKy8vIEdlZ2Vuc3RhZW5kZSB2ZXJsYXNzZW4gZGVuIFJhdW0KK3ZvaWQgTm90aWZ5TGVhdmUob2JqZWN0IG9iLCBvYmplY3QgZGVzdCkKK3sKKwlpZiAoIW9iICYmIW9iamVjdHAob2IpKSByZXR1cm4gMDsKKwkKKyAgLy8gcmVib290ZmVzdGVzIE1vZWJlbHN0dWVjayB2ZXJsYWVzc3QgZGVuIFJhdW0KKwlpZiAob2ItPlF1ZXJ5UHJvcChIX0ZVUk5JVFVSRSkhPTApCisJewkKKyAgICAvLyBTcGVpY2hlcm4gdm9yYmVyZWl0ZW4gKGZhbGxzIG1laHJlcmUgT2JqZWt0ZSAKKyAgICAvLyBnZWRyb3BwdCB3ZXJkZW4sIHdpcmQgc28gZWluIG92ZXJmbG93IHZlcmhpbmRlcnQuCisJCXF1ZXVlZF9zYXZlKCk7CisJfQorCXJldHVybiAwOworfQorCit2b2lkCityZXNldCgpCit7CisgIHJvb206OnJlc2V0KCk7CisgIGxvc2E6OnJlc2V0KCk7CisgIC8vIFdlbm4gZWluIE5vdGF1c2dhbmcgdm9yaGFuZGVuIGlzdCwgY2hlY2tlbiwgb2IgZGVyIG5vY2ggbm9ldGlnIGlzdC4KKyAgaWYgKG1lbWJlcihtX2luZGljZXMoUXVlcnlQcm9wKFBfRVhJVFMpKSwibm90YXVzZ2FuZyIpIT0tMSkKKyAgeworICAgICAgbWFrZV9lbWVyZ2VuY3lfZXhpdCgpOworICB9Cit9CisKK2ludCBjbGVhbl91cChpbnQgYXJnKQoreworICBtaXhlZCBpbnY7CisKKyAgaWYgKGFyZyA+IDEpCisgICAgcmV0dXJuIDE7CisKKyAgbG9zYTo6cmVzZXQoKTsgIC8vIEV2dGwuIGdlcGFja3Qgc3BlaWNoZXJuLi4uCisKKyAgLy8gbmljaHRzIGltIFJhdW0gb2RlciBudXIgbGVlcmUgU2VoZXJoYXVzdHJ1aGUgPT4gUmF1bSBrYW5uIHdlZworICBpZiAoKHNpemVvZihpbnY9YWxsX2ludmVudG9yeSgpKSA9PSAwKSB8fAorICAgICAgKHNpemVvZihpbnYpID09IDEgJiYgaW52WzBdLT5pZChUUlVIRSkgJiYKKyAgICAgICBzaXplb2YoYWxsX2ludmVudG9yeShpbnZbMF0pKT09MCkpCisgICAgcmVtb3ZlKDEpOworCisgIHJldHVybiAwOworfQorCisvLyBIYWV1ZnVuZ2VuIHZvbiBnbGVpY2hlbiBPYmpla3RlbiBzaW5kIGhpZXIgZWdhbCA9PiBuaXggdHVuCitwcm90ZWN0ZWQgdmFyYXJncyB2b2lkIHJlbW92ZV9tdWx0aXBsZShpbnQgbGltaXQpIHt9CisKKworLy8gU3BpZWxlciB3aXJkIGltIFJhdW0gTmV0enRvdAordm9pZCBCZWNvbWVzTmV0RGVhZChvYmplY3QgcGwpCit7CisvLyAgTmljaHQgZXJsYXVidGUgU3BpZWxlciB3ZXJkZW4gcmF1c2dld29yZmVuLCBhbGxlIGFuZGVyZW4gYmxlaWJlbiBkcmluLgorICBpZighYWxsb3dlZF9jaGVjayhwbCkpCisgICAgcGwtPm1vdmUoVkVSV0FMVEVSLT5IYXVzUHJvcChvd25lciwgSFBfRU5WKSwgTV9HTywgMCwgInNjaGxhZndhbmRlbHQgaGVyYXVzIiwgInNjaGxhZndhbmRlbHQgaGVyZWluIiApOworfQorCisKKy8qIElzdCBkaWVzZXIgUmF1bSBlaW4gQXVzZ2FuZz8gKi8KK2ludCBpc19leGl0KHN0cmluZyBwYXRoKQoreyAKKyAgcmV0dXJuIChzaXplb2YocGF0aCkgPiA0KSAmJiAocGF0aFs8NS4uXSA9PSAicmF1bTAiKTsKK30KKworLypQcnVlZnVuZywgb2IgZXMgZWluZW4gSGF1c2F1c2dhbmcgZ2lidCovCitpbnQgcm9vbV9oYXNfZXhpdCgpIHsKKworICAgIHN0cmluZyByb29tID0gb2JqZWN0X25hbWUodGhpc19vYmplY3QoKSk7CisgIC8vIHNpbmQgd2lyIHNjaG9uIGluIGVpbmVtIEhhdXB0cmF1bSBtaXQgQXVzZ2FuZz8KKyAgICBpZiAoaXNfZXhpdChyb29tKSkgcmV0dXJuIDE7CisKKyAgICBtYXBwaW5nIHJfdG9kbyA9IChbcm9vbV0pOworICAgIG1hcHBpbmcgcl9kb25lID0gKFs6MF0pOworICAgIC8qIERpZSBTY2hsZWlmZSBoYXQgbWF4aW1hbCA5ICogQW56YWhsIGRlciB2ZXJiLiBIYWV1c2VyIER1cmNobGFldWZlICovCisgICAgd2hpbGUgKHNpemVvZihyX3RvZG8pKQorICAgIHsKKyAgICAgIG1hcHBpbmcgcl9leGl0cyA9IChbXSk7CisKKyAgICAgIC8vIG5hZWNoc3RlbiBSYXVtcGZhZCBhYmFyYmVpdGVuLCBkLmguIGRlc3NlbiBBdXNnYWVuZ2UgYmV0cmFjaHRlbgorICAgICAgcm9vbSA9IG1faW5kaWNlcyhyX3RvZG8pWzBdOworICAgICAgLy8gYWJnZWFyYmVpdGV0ZW4gUmF1bXBmYWQgdm9uIHJfdG9kbyBuYWNoIHJfZG9uZSBzY2hpZWJlbgorICAgICAgcl9kb25lICs9IChbcm9vbV0pOworICAgICAgbV9kZWxldGUocl90b2RvLCByb29tKTsKKworICAgICAgLy8gYWxsZSBBdXNnYWVuZ2UgYmV0cmFjaHRlbgorICAgICAgZm9yZWFjaChzdHJpbmcgY29tbWFuZCwgc3RyaW5nIHN1YnBhdGggOiByb29tLT5RdWVyeVByb3AoUF9FWElUUykpCisgICAgICB7CisgICAgICAgIC8vIE5vdGF1c2dhZW5nZSBuaWNodCBiZXRyYWNodGVuLCBkYSAnZWNodGUnIEF1c2dhZW5nZSBnZXN1Y2h0IHNpbmQKKyAgICAgICAgaWYoY29tbWFuZCAhPSAibm90YXVzZ2FuZyIpCisgICAgICAgICAgLy8gYWxsZSBhbmRlcmVuIEF1c2dhZW5nZSBzYW1tZWxuCisgICAgICAgICAgcl9leGl0cyArPSAoWyBzdWJwYXRoIF0pOworICAgICAgfQorICAgICAgLy8gbnVyIFJhdW1wZmFkZSBkaWUgbm9jaCBuaWNodCBhYmdlYXJiZWl0ZXQgc2luZCB0ZXN0ZW4KKyAgICAgIHJfZXhpdHMgLT0gcl9kb25lOworICAgICAgLy8gaXN0IGRhIGVpbiBIYXVwdHJhdW0gKGRlciBkYW5uIEF1c2dhbmcgbGllZmVydCkgZGFiZWk/CisgICAgICBpZiAoc2l6ZW9mKGZpbHRlcl9pbmRpY2VzKHJfZXhpdHMsICMnaXNfZXhpdC8qJyovKSkpCisgICAgICAgIHJldHVybiAxOworCisgICAgICAvLyBuZXVlIFJhdW1wZmFkZSBpbiBkaWUgVE9ETy1MaXN0ZSBhdWZuZWhtZW4KKyAgICAgIHJfdG9kbyArPSByX2V4aXRzOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLy8gZGFtaXQgbWFuIFNwaWVsZXIgbmljaHQgZHVyY2ggRW50ZmVybmVuIHZvbiBBdXNnYWVuZ2VuIGVpbnNwZXJyZW4ga2FubgorLy8gd2VyZGVuIGJlaSBCZWRhcmYgTm90YXVzZ2FlbmdlIGluIGRlbiBIYXVwdHJhdW0gZXJnYWVuenQKK3ZvaWQgbWFrZV9lbWVyZ2VuY3lfZXhpdCgpCit7CisgIC8vIElzdCBkZXIgUmF1bSB3ZWRlciBIYXVwdHJhdW0gbWl0IEF1c2dhbmcgbm9jaCBmdWVocnQgZWluIFdlZyBkb3J0aGluPworICAvLyBkYW5uIE5vdGF1c2dhbmcgbWFjaGVuCisgIGlmKCFyb29tX2hhc19leGl0KCkpCisgIHsKKyAgICAvLyB0ZWxsX3Jvb20odGhpc19vYmplY3QoKSwiREVCVUc6IEVpbiBOb3RhdXNnYW5nIHd1cmRlIGFuZ2VsZWd0LlxuIik7CisgICAgcm9vbTo6QWRkRXhpdCgibm90YXVzZ2FuZyIsCisgICAgICAiZHVyY2ggZGVuIE5vdGF1c2dhbmcjIit0b19zdHJpbmcodGhpc19vYmplY3QoKSlbMC4uPDJdKyIwIik7CisgIH0KKyAgZWxzZQorICB7CisgICAgLy8gbmljaHQgbWVociBiZW5vZXRpZ3RlbiBOb3RhdXNnYW5nIGVudGZlcm5lbgorICAgIHJvb206OlJlbW92ZUV4aXQoIm5vdGF1c2dhbmciKTsKKyAgfQorfQorCisvLyBydWZ0IGRpcmVrdCBkYXMgZ2VlcmJ0ZSBBZGRFeGl0IGF1Ziwgb2huZSBnZ2YuIGVpbmVuIE5vdGF1c2dhbmcgenUKKy8vIGVyemV1Z2VuLiBEYXMgd2lyZCB2b20gSGF1cyB1bmQgdm9tIFZlcndhbHRlciBiZW51dHp0LCB1bSBBdXNnYWVuZ2UgenUKKy8vIGVyemV1Z2VuLiBEYXMgaXN0IG5vZXRpZywgd2VpbCBkZXIgTm90YXVzZ2FuZ21lY2hhbmlzbXVzIG5vY2ggbmljaHQKKy8vIGZ1bmt0b25pZXJ0LCB3ZW5uIGRlciBSYXVtIGdlcmFkZSBnZWxhZGVuIHdpcmQgKGhhdCBub2NoIG5pY2h0IGRlbgorLy8gZW5kZ3VlbHRpZ2VuIE5hbWVuKSB1bmQgZGVyIENoZWNrIHdhZXJlIG9obmVoaW4gdW5ub2V0aWcuCitwdWJsaWMgdm9pZCBBZGRFeGl0Tm9DaGVjayhtaXhlZCBjbWQsIG1peGVkIGRlc3QpCit7CisgIHJvb206OkFkZEV4aXQoY21kLCBkZXN0KTsKK30KKworLy8gV2lyZCBiZW51dHp0IGJlaW0gTGFkZW4gdm9uIFJhZXVtZW4sIHVtIGFsbGUgQXVzZ2FlbmdlIHp1IGxvZXNjaGVuLiBEYWJlaQorLy8gZGFyZiBfa2Vpbl8gTm90YXVzZ2FuZyBlcnN0ZWxsdCB3ZXJkZW4uCit2b2lkIFJlbW92ZUV4aXROb0NoZWNrKG1peGVkIGNtZCkKK3sKKyAgcm9vbTo6UmVtb3ZlRXhpdChjbWQpOworfQorCisvLyBiZWltIEF1c2dhbmcgc2V0enRlbiB0ZXN0ZW4gb2Igdm9yaGFuZGVybmVyIE5vdGF1c2dhbmcgbm9jaCBiZW5vZXRpZ3Qgd2lyZAordm9pZCBBZGRFeGl0KG1peGVkIGNtZCwgbWl4ZWQgZGVzdCkKK3sKKyAgcm9vbTo6QWRkRXhpdChjbWQsIGRlc3QpOworCisgIGlmIChtZW1iZXIobV9pbmRpY2VzKFF1ZXJ5UHJvcChQX0VYSVRTKSksIm5vdGF1c2dhbmciKSE9LTEpCisgIHsKKyAgICAvLyBsb2VzY2h0IE5vdGF1c2dhbmcgZmFsbHMgbmljaHQgbWVociBiZW5vZXRpZ3QKKyAgICAgbWFrZV9lbWVyZ2VuY3lfZXhpdCgpOworICB9Cit9CisKKy8vIGJlaW0gQXVzZ2FuZyBsb2VzY2hlbiB0ZXN0ZW4gb2IgTm90YXVzZ2FuZyBiZW5vZXRpZ3Qgd2lyZAordm9pZCBSZW1vdmVFeGl0KG1peGVkIGNtZCkKK3sKKyAgcm9vbTo6UmVtb3ZlRXhpdChjbWQpOworICAvLyBzZXR6dCBOb3RhdXNnYW5nIGZhbGxzIGJlbm9ldGlndAorICBtYWtlX2VtZXJnZW5jeV9leGl0KCk7Cit9CisKKy8vIGRlciBMYW5nYmVzY2hyZWlidW5nIHdlcmRlbiBhbGxlIHVuc2ljaHRiYXJlbiBNYWdpZXIKKy8vIChhdXNnZW5vbW1lbiBTZWhlcmhhdXNiZXNpdHplcikgaW4gS2xhbW1lcm4gYW5nZWZ1ZWd0Cit2YXJhcmdzIHN0cmluZyBpbnRfbG9uZyhtaXhlZCB2aWV3ZXIsIG1peGVkIHZpZXdwb2ludCwgaW50IGZsYWdzKQoreworICBzdHJpbmcgcmV0OworICBvYmplY3QgKmludjsKKyAgc3RyaW5nICp0bXA7CisKKyAgcmV0ID0gOjppbnRfbG9uZyh2aWV3ZXIsIHZpZXdwb2ludCwgZmxhZ3MpOworCisgIC8vIG51ciB3YXMgbWFjaGVuIHdlbm4gZGVyIEJldHJhY2h0ZXIgaW0gUmF1bSBpc3QKKyAgaWYgKCFyZXQgfHwgIW9iamVjdHAodmlld2VyKSB8fCBlbnZpcm9ubWVudCh2aWV3ZXIpICE9IHRoaXNfb2JqZWN0KCkpCisgICAgcmV0dXJuIHJldDsKKworICBpZih2aWV3cG9pbnQgPT0gMCkKKyAgICB2aWV3cG9pbnQgPSAoeyB2aWV3ZXIgfSk7CisgIGVsc2UgaWYoIXBvaW50ZXJwKHZpZXdwb2ludCkpCisgICAgdmlld3BvaW50ID0gKHsgdmlld3BvaW50IH0pOworCisgIC8vIGFsbGUgTGViZXdlc2VuIGF1c3NlciBkZW5lbiBhdXMgZGVyZW4gU2ljaHQgYmV0cmFjaHRldCB3aXJkCisgIGludiA9IGZpbHRlcihhbGxfaW52ZW50b3J5KHRoaXNfb2JqZWN0KCkpLCMnaW50ZXJhY3RpdmUpIC0gdmlld3BvaW50OworICBmb3JlYWNoKG9iamVjdCBwbCA6IGludikKKyAgeworICAgIC8vIHJhdXNzdWNoZW4gd2VyIGF1c3NlciBTZWhlcmhhdXNiZXNpdHplciB1bnNpY2h0YmFyIGlzdAorICAgIGlmKHBsICYmIElTX0xFQVJORVIocGwpICYmIHBsLT5RdWVyeVByb3AoUF9JTlZJUykgJiYgZ2V0dWlkKHBsKSE9b3duZXIpCisgICAgeworICAgICAgLy8gTmFtZSBpbiBLbGFtbWVyIHNhbW1lbG4KKyAgICAgIHRtcCArPSAoeyAiKCIrY2FwaXRhbGl6ZShnZXR1aWQocGwpKSsiKSIgfSk7CisgICAgfQorICB9CisgIHJldHVybiByZXQgKyBicmVha19zdHJpbmcoQ291bnRVcCh0bXApLCA3OCk7Cit9CisvKgorLy8gVE9ETzogVGVzdGVuIG9iIGRhcyBoaWVyIG5pY2h0IGRhcyBTdGFuZGFyZC1WZXJoYWx0ZW4gaXN0CitpbnQgbGllcyhzdHJpbmcgc3RyKQoreworICBzdHJpbmcgdHh0OworCisgIG5vdGlmeV9mYWlsKCJXYXMgbW9lY2h0ZXN0IER1IGxlc2VuP1xuIik7CisgIGlmICghc3RyKSByZXR1cm4gMDsKKworICBpZiAodGhpc19wbGF5ZXIoKS0+Q2Fubm90U2VlKCkpCisgICAgcmV0dXJuIDE7CisgIGlmICh0eHQgPSBRdWVyeVByb3AoUF9SRUFEX0RFVEFJTFMpW3N0cl0pIHsKKyAgICB0aGlzX3BsYXllcigpLT5Nb3JlKHR4dCk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisqLworLy8gQWt0aW9uIExlYmV3ZXNlbiBvZGVyIEdlZ2Vuc3RhZW5kZSBhdXMgZGVtIEhhdXMgd2VyZmVuCitpbnQgd2lyZihzdHJpbmcgc3RyKQoreworICBzdHJpbmcgd2VuLCBhcmdzOworICBvYmplY3QgcGwsIHRhcmdldCwgKmxpc3QsIHRwLCB0bzsKKworICB0cCA9IHRoaXNfcGxheWVyKCk7CisgIHRvID0gdGhpc19vYmplY3QoKTsKKyAgYXJncyA9IHRwLT5fdW5wYXJzZWRfYXJncygxKTsKKworICAvLyBrbGFwcHQgbnVyIHZvciBPcnQgdW5kIG1pdCBkZXIgcGFzc2VuZGVuIFN5bnRheAorICBpZiAoKGVudmlyb25tZW50KHRwKSE9dG8pIHx8CisgICAgICAhYXJncyB8fCBhcmdzID09ICIiIHx8CisgICAgICAoc3NjYW5mKGFyZ3MsIiVzIHJhdXMiLHdlbikgIT0gMSkgKQorICAgIHJldHVybiAwOworICAvLyBSYXVtLCBpbiBkZW0gZGFzIEhhdXMgc3RlaHQsIGVybWl0dGVsbgorICB0YXJnZXQ9ZmluZF9vYmplY3QoVkVSV0FMVEVSLT5IYXVzUHJvcChvd25lciwgSFBfRU5WKSk7CisgIGlmICghdGFyZ2V0KSB7CisgICAgbm90aWZ5X2ZhaWwoIkRpZXNlcyBIYXVzIHN0ZWh0IGxlaWRlciBnZXJhZGUgaW4gZWluZW0gIgorICAgICAgICAgICAgICAgICJGZWhsZXIgaW0gUmF1bS1aZWl0LUdlZnVlZ2UuXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICAvLyBSYXVzd2VyZmVuIGRhcmYgbnVyIGRlciBCZXNpdHplcgorICBpZiAoIXRwX293bmVyX2NoZWNrKCkpIHsKKyAgICBub3RpZnlfZmFpbCgiQWJlciBEdSBrYW5uc3QgZG9jaCBuaWVtYW5kZW4gYXVzIGRlbSBIYXVzIHZvbiAiK2NhcGl0YWxpemUob3duZXIpKyIgd2VyZmVuIVxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKHdlbj09ImFsbGUiKSB7CisgICAgLy8gYWxsZSBMZWJld2VzZW4gYXVzc2VyIHRwICg9PSBIYXVzYmVzaXR6ZXIpCisgICAgbGlzdD1maWx0ZXIoYWxsX2ludmVudG9yeSh0byksIydsaXZpbmcpLSh7dHAsMH0pOy8vJykKKyAgICBpZiAoc2l6ZW9mKGxpc3QpPT0wKSB7CisgICAgICBub3RpZnlfZmFpbCgiQWJlciBEdSBiaXN0IGRvY2ggYWxsZWluIGluIERlaW5lbSBIYXVzIVxuIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0gZWxzZSBpZiAod2VuID09ICJhbGxlcyIpIHsKKyAgICAvLyBhbGxlIEdlZ2Vuc3RhZW5kZSBhdXNzZXIgTGViZXdlc2VuIHVuZCBNb2ViZWwKKyAgICAvLyAoU2VoZXJoYXVzdHJ1aGUsIEF1dG9sb2FkZXItTW9lYmVsIG9kZXIgU2VoZXJoYXVzLU1vZWJlbCkKKyAgICBsaXN0ID0gZmlsdGVyKGFsbF9pbnZlbnRvcnkodG8pLAorICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaW50KG9iamVjdCBvYikKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0cChvYikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWxpdmluZyhvYikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIW9iLT5pZChUUlVIRSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyBUZXN0IGF1ZiBuaWNodCBTZWhlcmhhdXNtb2ViZWwgdm9uIEF1Z3VzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJzdHIobG9hZF9uYW1lKG9iKSwiL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSAwOworICAgICAgICAgICAgICAgICAgfSApOworCisgICAgaWYgKHNpemVvZihsaXN0KT09MCkgeworICAgICAgbm90aWZ5X2ZhaWwoIkFiZXIgaGllciBpc3QgbmljaHRzIHp1bSB3ZWd3ZXJmZW4hXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBwbD1wcmVzZW50KHdlbix0byk7CisgICAgaWYgKCFwbCkgeworICAgICAgbm90aWZ5X2ZhaWwoIlNvIGplbWFuZGVuIHNlaGUgaWNoIGhpZXIgbmljaHQuXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlIGlmIChwbC0+aWQoVFJVSEUpIHx8CisgICAgICAgICAgICAgLy8gVE9ETyBUZXN0IGF1ZiBTZWhlcmhhdXNtb2ViZWwgdm9uIEF1Z3VzdAorICAgICAgICAgICAgICBzdHJzdHIobG9hZF9uYW1lKHBsKSwiL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvIik9PTAKKyAgICAgICAgICAgICApIHsKKyAgICAgIG5vdGlmeV9mYWlsKCJEdSBrYW5uc3QgIitwbC0+bmFtZShXRU4pKyIgbmljaHQgd2Vnd2VyZmVuIVxuIiApOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGxpc3Q9KHtwbH0pOworICB9CisgIHN0cmluZyBtc2dfd2VuID0gc3ByaW50ZigiJXMgd2lyZnQgRGljaCBhdXMgJXMgSGF1cy5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+TmFtZShXRVIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPlF1ZXJ5UG9zc1Byb25vdW4oTkVVVEVSLFdFTSkpOworICAvLyBmdWVyIGFsbGUgcmF1c3p1d2VyZmVuZGVuIE9wZmVyIE1lbGR1bmdlbiBtYWNoZW4gdW5kIHJhdXNiZXdlZ2VuCisgIGZvcmVhY2gob2JqZWN0IG9iIDogbGlzdCkKKyAgeworICAgIHRlbGxfb2JqZWN0KG9iLCBtc2dfd2VuKTsKKyAgICB0ZWxsX3Jvb20odGFyZ2V0LAorICAgICAgICBzcHJpbnRmKCIlcyBrb21tdCBpbiBob2hlbSBCb2dlbiBhdXMgZGVtIEhhdXMgdm9uICVzIGdlZmxvZ2VuLlxuIiwKKyAgICAgICAgICAgICAgICAgb2ItPk5hbWUoV0VSKSx0cC0+bmFtZShXRU0pKSk7CisgICAgb2ItPm1vdmUodGFyZ2V0LE1fU0lMRU5UfE1fR08pOworICAgIHRlbGxfcm9vbSh0byxzcHJpbnRmKCIlcyB3aXJmdCAlcyBhdXMgJXMgSGF1cy5cbiIsCisgICAgICAgICAgICAgICAgICAgIHRwLT5OYW1lKFdFUiksCisgICAgICAgICAgICAgICAgICAgIG9iLT5uYW1lKFdFTiksdHAtPlF1ZXJ5UG9zc1Byb25vdW4oTkVVVEVSLFdFTSkpLAorICAgICAgICAgICAgICAoe3RwfSkpOworICAgIHByaW50ZigiRHUgd2lyZnN0ICVzIGF1cyBEZWluZW0gSGF1cy5cbiIsb2ItPm5hbWUoV0VOKSk7CisgICAgLy8gVmVyZm9sZ2VyIGFibWVsZGVuLCBkYW1pdCBzaWUgbmljaHQgZ2xlaWNoIHp1cnVlY2trb21tZW4KKyAgICAvLyBUT0RPIHdlbm4gbWFuIGVpbnplbG5lIExlYmV3ZXNlbiByYXVzd2lyZnQga2FubiBkYXMgamEgYXVjaAorICAgIC8vIGVpbiBWZXJmb2xnZXIgdm9uIGVpbmVtIGFuZGVyZW4gR2FzdCBzZWluLi4uCisgICAgdHAtPlJlbW92ZVB1cnN1ZXIob2IpOworICB9CisgIHJldHVybiAxOworfQorCisvLyBCZXNpdHplciB1bmQgUmF1bW51bW1lciBmdWVyIGRpZXNlbiBSYXVtIHNldHplbgordmFyYXJncyBzdHJpbmcgU2V0T3duZXIoc3RyaW5nIG8sIGludCBudW0pCit7CisgIC8vIERlZmF1bHQgS3Vyei0gdW5kIExhbmdiZXNjaHJlaWJ1bmcgc2V0emVuCisgIFNldFByb3AoUF9JTlRfU0hPUlQsICJJbSBIYXVzIHZvbiAiK2NhcGl0YWxpemUobykpOworICBTZXRQcm9wKFBfSU5UX0xPTkcsICJFaW4gdG90YWwgbGVlcmVyIFJhdW0uXG4iKTsKKyAgLy8gUmF1bW51bW1lciB1bmQgQmVzaXR6ZXIgbWVya2VuCisgIHJhdW1OciA9IG51bTsKKyAgcmV0dXJuIG93bmVyID0gbzsKK30KKworLy8gTGllZmVydCBkZW4gQmVzaXR6ZXIKKy8vIGZhbGxzIHdpdGhOciAhPSAwIG1pdCBhbmdlaGFlbmd0ZXIgUmF1bW51bW1lcgordmFyYXJncyBzdHJpbmcgUXVlcnlPd25lcihpbnQgd2l0aE5yKQoreworICByZXR1cm4gKHdpdGhOciA/IG93bmVyK3JhdW1OciA6IG93bmVyKTsKK30KKworLy8gUHJvdG90eXBlCitzdGF0aWMgaW50IGJlZkVpbmdhYmUoc3RyaW5nICpiZWYpOworCisvLyBBa3Rpb24genVtIEJlc2NocmVpYmVuIGRlcyBSYXVtZXMKK3ZhcmFyZ3MgaW50CitiZXNjaHJlaWJlbihzdHJpbmcgc3RyLCBpbnQgZikKK3sKKyAgc3RyaW5nICpwYXJ0czsKKyAgaW50IHNwLCByZXQ7CisKKyAgLy8gbnVyIGRlciBCZXNpdHplciBkYXJmCisgIGlmKCF0cF9vd25lcl9jaGVjaygpKQorICAgIHJldHVybiAwOworCisgIGlmICghZiAmJiAoIShzdHI9VVBfQVJHUyh0aGlzX3BsYXllcigpKSkgfHwgc3RyID09ICIiKSkgeworICAgIG5vdGlmeV9mYWlsKCJXYXMgd2lsbHN0IER1IGRlbm4gYmVzY2hyZWliZW4/XG4iICk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBzcCA9IHNpemVvZihwYXJ0cyA9IG9sZF9leHBsb2RlKHN0ciwgIiAiKSk7CisgIC8vIGplIG5hY2hkZW0gd2FzIGJlc2NocmllYmVuIHdpcmQsIHNldHplIGRldGFpbCB1bmQgZmxhZworICAvLyB1bmQgc3RhcnRlIGRhbWl0IEVkaXRvciwgYnp3LiBiZWhhbmRsZSBCZWZlaGxlIGV4dHJhCisgIGRldGFpbCA9IDA7CisgIGZsYWcgPSBmOworCisgIHN3aXRjaChwYXJ0c1swXVswLi4zXSkgeworICAgIGNhc2UgInJhdW0iOiAgICAgIC8vIExhbmctIG9kZXIgS3VyemJlc2NocmVpYnVuZworICAgIGNhc2UgImhhdXMiOgorICAgICAgaWYgKHNwID09IDEgfHwgcGFydHNbMV0gPT0gImxhbmciKQorICAgIGZsYWcgfD0gTEFORzsKKyAgICAgIGVsc2UgaWYgKHBhcnRzWzFdID09ICJrdXJ6IikKKyAgICBmbGFnIHw9IEtVUlo7CisgICAgICBwcmludGYoIkJpdHRlICVzYmVzY2hyZWlidW5nIGRlcyAlcyBlaW5nZWJlbi5cbiIsIChmbGFnICYgTEFORyA/ICJMYW5nIiA6ICJLdXJ6IiksIChmbGFnICYgQVVTU0VOID8gIkhhdXNlcyIgOiAiUmF1bWVzIikgKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgImRldGEiOiAgICAgIC8vIERldGFpbHMKKyAgICAgIGlmIChzcD09MSkgeworICAgIG5vdGlmeV9mYWlsKCJXZWxjaGVzIERldGFpbCB3aWxsc3QgRHUgZGVubiBiZXNjaHJlaWJlbj9cbiIpOworICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgZmxhZyB8PSBERVRBSUw7CisgICAgICBzdHIgPSBpbXBsb2RlKHBhcnRzWzEuLl0sIiAiKTsKKyAgICAgIHdyaXRlKCAiQml0dGUgQmVzY2hyZWlidW5nIGZ1ZXIgJyIrc3RyKyInIGVpbmdlYmVuLlxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICJsZXNiIjogICAgICAvLyBsZXNiYXJlIERldGFpbHMKKyAgICAgIG5vdGlmeV9mYWlsKCJXZWxjaGVzIGxlc2JhcmUgRGV0YWlsIHdpbGxzdCBEdSBkZW5uIGJlc2NocmVpYmVuP1xuIik7CisgICAgICBpZiAoc3AgPT0gMSkgcmV0dXJuIDA7CisgICAgICBpZiAocGFydHNbMV0gPT0gImRldGFpbHMiIHx8IHBhcnRzWzFdID09ICJkZXRhaWwiKSB7CisgICAgaWYgKHNwID09IDIpIHJldHVybiAwOworICAgIHN0ciA9IGltcGxvZGUocGFydHNbMi4uXSwiICIpOworICAgICAgfQorICAgICAgZWxzZQorICAgIHN0ciA9IGltcGxvZGUocGFydHNbMS4uXSwiICIpOworICAgICAgZmxhZyB8PSBSREVUQUlMOworICAgICAgd3JpdGUoICJCaXR0ZSBCZXNjaHJlaWJ1bmcgZnVlciAnIitzdHIrIicgZWluZ2ViZW4uXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgImJlZmUiOiAgICAgIC8vIEJlZmVobGUKKyAgICAgIHJldCA9IDA7CisgICAgICBpZiAoc3AgPT0gMSkKKyAgICBub3RpZnlfZmFpbCgiV2VsY2hlbiBCZWZlaGwgd2lsbHN0IER1IGRlbm4gYmVzY2hyZWliZW4/XG4iKTsKKyAgICAgIGVsc2UKKyAgICByZXQgPSBiZWZFaW5nYWJlKGJyayhpbXBsb2RlKHBhcnRzWzEuLl0sIiAiKSkpOworICAgICAgcmV0dXJuIHJldDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBub3RpZnlfZmFpbCgiRGFzIGthbm5zdCBEdSBuaWNodCBiZXNjaHJlaWJlbiEgRWluZSBMaXN0ZSBkZXIgRGluZ2UsIGRpZSBEdSBoaWVyXG4iCisgICAgICAgICArImJlc2NocmVpYmVuIGthbm5zdCwgZXJoYWVsdHN0IER1IG1pdCAnaGlsZmUgYmVzY2hyZWliZScuXG4iICk7CisgICAgICByZXR1cm4gMDsKKyAgICAgIGJyZWFrOworICB9CisgIGRldGFpbCA9IGJyayhzdHIpOworICB3cml0ZSggIihCZWVuZGVuIG1pdCAuIG9kZXIgKiosIEFiYnJ1Y2ggbWl0IH5xKVxuIiApOworICBuZWRpdCggImJlc2NocmVpYnVuZyIgKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIG5lZGl0IHZvbiBiZXNjaHJlaWJlIHh4eAorc3RhdGljIHZvaWQgYmVzY2hyZWlidW5nKHN0cmluZyBzdHIpCit7CisgIGlmICghc3RyKSB7CisgICAgd3JpdGUoIk5pY2h0cyBnZWFlbmRlcnQhXG4iKTsKKyAgICByZXR1cm47CisgIH0KKworICBzdHIgPSBub3Jtc3RyKHN0cik7CisKKyAgaWYgKGZsYWcgJiBMQU5HKQorICB7CisgICAgLy8gTGFuZ2Jlc2NocmVpYnVuZworICAgIGlmIChzaXplb2YoZXhwbG9kZShzdHIsIlxuIikpID4gMTAwCisgICAgICAgIHx8IHNpemVvZihzdHIpID4gNzgwMCkKKyAgICB7CisgICAgICAvLyB1ZWJlciAxMDAgWmVpbGVuIG9kZXIgdWViZXIgNzgwMCBaZWljaGVuCisgICAgICB3cml0ZSggIkRhcyBpc3QgZnVlciBlaW5lIExhbmdiZXNjaHJlaWJ1bmcgenUgbGFuZyFcbiIKKyAgICAgICAgICAgICAiU29ycnksIGJpdHRlIGRlbmtlIERpciBlaW5lIGFuZGVyZSBMYW5nYmVzY2hyZWlidW5nIGF1cy5cbiIgKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGZsYWcgJiBBVVNTRU4pIHsKKyAgICAgIC8vIExhbmdiZXNjaHJlaWJ1bmcgdm9tIEhhdXMKKyAgICAgIG9iamVjdCBoYXVzOworICAgICAgaGF1cyA9IGZpbmRfb2JqZWN0KEhBVVNOQU1FKG93bmVyKSk7CisgICAgICBoYXVzLT5TZXRQcm9wKFBfTE9ORywgc3RyKTsKKyAgICAgIGhhdXMtPlNhdmUoKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgLy8gTGFuZ2Jlc2NocmVpYnVuZyB2b24gZGllc2VtIFJhdW0KKyAgICAgIFNldFByb3AoUF9JTlRfTE9ORywgc3RyKTsKKyAgfQorICBlbHNlIGlmIChmbGFnICYgS1VSWikgeworICAgIC8vIEt1cnpiZXNjaHJlaWJ1bmcgdm9tIFJhdW0KKyAgICBpZiAoc2l6ZW9mKG9sZF9leHBsb2RlKHN0ciwiXG4iKSkgPiAxIHx8IHNpemVvZihvbGRfZXhwbG9kZShzdHIsIi4iKSkgPiAyIHx8IHNpemVvZihzdHIpID4gNzUpIHsKKyAgICAgIHdyaXRlKCAiRGFzIGlzdCBmdWVyIGVpbmUgS3VyemJlc2NocmVpYnVuZyB6dSBsYW5nIVxuU29ycnksIGJpdHRlIGRlbmtlIERpciBlaW5lIGFuZGVyZSBLdXJ6YmVzY2hyZWlidW5nIGF1cy5cbiIgKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZWxzZQorICAgICAgLy8gVmFuaW9uLCAyNy4wNy4wMiwgQnVnZml4CisgICAgICAvLyBEaWUgWmVpbGUgYnVnZ3RlLCB3ZW5uIG1hbiAiLiIgb2RlciAiXG4iIG9kZXIgIlxuLiIgb2RlciBzb3dhcworICAgICAgLy8gaW4gc3RyIGhhdC4gKGFsc28gei5CLiBiZWkgImJlc2NocmVpYmUgcmF1bSBrdXJ6IDxyZXR1cm4+IC4iKQorICAgICAgLy8gU2V0UHJvcChQX0lOVF9TSE9SVCwgb2xkX2V4cGxvZGUob2xkX2V4cGxvZGUoc3RyLCJcbiIpWzBdLCIuIilbMF0pOworICAgICAgU2V0UHJvcChQX0lOVF9TSE9SVCwgZXhwbG9kZShleHBsb2RlKHN0ciwiXG4iKVswXSwiLiIpWzBdKTsKKyAgfQorICBlbHNlIGlmIChmbGFnICYgREVUQUlMKQorICAgIC8vIFJhdW0tRGV0YWlsCisgICAgQWRkRGV0YWlsKGRldGFpbCwgc3RyKTsKKyAgZWxzZSBpZiAoZmxhZyAmIFJERVRBSUwpCisgICAgLy8gbGVzYmFyZXMgUmF1bS1EZXRhaWwKKyAgICBBZGRSZWFkRGV0YWlsKGRldGFpbCwgc3RyKTsKKyAgZWxzZSB7CisgICAgd3JpdGUoICJIdWNoISBVbmJla2FubnRlcyBGbGFnICgiK2ZsYWcrIikuLi4gU2FnIG1hbCAiCisgICAgICAgICAgKyBDb3VudFVwKE1BSU5UQUlORVIsICIsICIsICIgb2RlciAiKQorICAgICAgICAgICsgIiBCZXNjaGVpZC4uLlxuIik7CisgICAgcmV0dXJuOworICB9CisKKyAgd3JpdGUoIk9LLlxuIik7CisgIFNhdmUoKTsKK30KKworLy8gd2lyZCBpbiBiZXNjaHJlaWJlbihzdHIsIGludCkgJ2Jlc2NocmVpYmUgYmVmZWhsJyBhdWZnZXJ1ZmVuCitzdGF0aWMgaW50IGJlZkVpbmdhYmUoc3RyaW5nICpiZWZlaGxlKQoreworICBzdHJpbmcqIGNvbSA9ICh7fSk7CisKKyAgbm90aWZ5X2ZhaWwoIktlaW4gQmVmZWhsIHp1bSBCZXNjaHJlaWJlbiB1ZWJyaWcuLi4gOylcbiIpOworICBmb3JlYWNoKHN0cmluZyBiZWYgOiBiZWZlaGxlKQorICB7CisgICAgLy8gc2Nob24gdm9yaGFuZGVuZXIgQmVmZWhsIChhdXNzZXIgb2VmZm5lbi9zY2hsaXNzZW4pLAorICAgIC8vIFJpY2h0dW5nIG9obmUgenVnZWhvZXJpZ2VuIEF1c2dhbmcsCisgICAgLy8gb2RlciBCZWZlaGwgZW50aGFlbHQgTGVlcnplaWNoZW4gCisgICAgaWYgKCFiZWZDaGVjayhiZWYpKQorICAgICAgd3JpdGUoIkRlciBCZWZlaGwgJyIrYmVmKyInIGthbm4gbmljaHQgYmVzY2hyaWViZW4gd2VyZGVuIVxuIik7CisgICAgZWxzZQorICAgICAgY29tICs9ICh7IGJlZiB9KTsKKyAgfQorICBpZiAoIXNpemVvZihjb20pKQorICAgIHJldHVybiAwOworCisgIGFycl9vdXQoY29tLCAwLCAiWnUgYmVzY2hyZWliZW5kZXIgQmVmZWhsOiAlcyIsCisgICAgICAgICAgIlp1IGJlc2NocmVpYmVuZGUgQmVmZWhsZTpcbiIpOworCisgIHdyaXRlKCAiQml0dGUgUGFyYW1ldGVyIGVpbmdlYmVuIChldnRsLiBkdXJjaCBLb21tYXRhIGdldHJlbm50KS5cbl0iKTsKKyAgaW5wdXRfdG8oImdldEJlZlBhcmFtIiwgMCwgY29tKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIGlucHV0X3RvIGF1cyBiZWZFaW5nYWJlKHN0cmluZykgenUgYmVzY2hyZWliZSBiZWZlaGwgLi4uCitzdGF0aWMgdm9pZCBnZXRCZWZQYXJhbShzdHJpbmcgcGFyYW0sIHN0cmluZyAqYmVmKQoreworICBzdHJpbmcgdHh0ID0gIkdpYiBudW4gYml0dGUgZGVuIFRleHQgZWluLCBkZXIgZnVlciBkaWVzZW4gQmVmZWhsICIKKyAgICAgICJhdXNnZWdlYmVuIHdlcmRlbiBzb2xsLlxuIjsKKworICAvLyBGdWVocmVuZGUgdW5kIGFic2NobGllc3NlbmRlIExlZXJ6ZWljaGVuIGVudGZlcm5lbgorICBpZiAocGFyYW0pCisgICAgcGFyYW0gPSB0cmltKHBhcmFtKTsKKworICBpZiAoIXBhcmFtIHx8IHBhcmFtID09ICIiKQorICAgIC8vIGtlaW4gUGFyYW1ldGVyLCB6LmIuIGJlaSBiZXNjaHJlaWJlIGJlZmVobCBrbG9wZmUgCisgICAgZGV0YWlsID0gKHsgYmVmLCAiIiB9KTsKKyAgZWxzZSBpZiAocGFyYW0gPT0gIkBORkAiIHx8IHBhcmFtID09ICJAbmZAIikgeworICAgIC8vIFBhcmFtZXRlciBmdWVyIG5vdGlmeSBmYWlsIHp1bSBFcnNldHplbiB2b24gV2llIGJpdHRlPworICAgIC8vIHouQi4gYmVpIGJlc2NocmVpYmUgYmVmZWhsIGRydWVja2UKKyAgICAvLyBmdWVyIGRhbmFjaCBEdSBrYW5uc3QgaGllciBrZWluIEBQQVJBIGRydWVja2VuLCBudXIgZGVuIEtub3BmIQorICAgIGRldGFpbCA9ICh7IGJlZiwgMSB9KTsKKyAgICB0eHQgPSAiR2liIG51biBiaXR0ZSBkZW4gVGV4dCBlaW4sIGRlciBhbHMgRmVobGVybWVsZHVuZyAiCisgICAgICAgICAgImF1c2dlZ2ViZW4gd2VyZGVuIHNvbGwuXG5AUEFSQSBkaWVudCBkYWJlaSBhbHMgUGxhdHpoYWx0ZXIgZnVlciAiCisgICAgICAgICAgImRpZSB1bmd1ZWx0aWdlIEVpbmdhYmUuXG4iOworICB9CisgIGVsc2UKKyAgICAvLyBzb25zdGlnZSBQYXJhbWV0ZXIKKyAgICAvLyB6LkIuIGtub3BmLCBrbGluZ2VsIGJlaSBiZXNjaHJlaWJlIGJlZmVobCBkcnVlY2tlCisgICAgZGV0YWlsID0gKHsgYmVmIH0pICsgYnJrKGxvd2VyX2Nhc2UocGFyYW0pKTsKKworICBwcmludGYodHh0KyIoQmVlbmRlbiBtaXQgLiBvZGVyICoqLCBBYmJydWNoIG1pdCB+cSlcbiIpOworICBuZWRpdCgiZ2V0QmVmVGV4dCIpOworfQorCisvLyBQcm90b3R5cGUKK3ByaXZhdGUgc3RyaW5nIHByZXBhcnNlKHN0cmluZyBzdHIsIHN0cmluZyAqaW52YWxpZCk7CisKKy8vIG5lZGl0IGZ1ZXIgZGllIEVpbmdhYmUgZGVyIFRleHRlICAoRmVobGVybWVsZHVuZy9NZWxkdW5nZW4pIGZ1ZXIgZGVuIEJlZmVobAorc3RhdGljIHZvaWQgZ2V0QmVmVGV4dChzdHJpbmcgdGV4dCkKK3sKKyAgc3RyaW5nIG15LCAqdHh0LCAqd2FybjsKKyAgbWl4ZWQgYmVmOworCisgIGlmICghdGV4dCB8fCB0ZXh0ID09ICIiKSB7CisgICAgd3JpdGUoIioqIEFiYnJ1Y2ghICoqXG4iKTsKKyAgICBkZXRhaWwgPSAwOworICAgIHJldHVybjsKKyAgfQorICAvLyBnZW1lcmt0ZXMgQmVmZWhscy1BcnJheQorICBiZWYgPSBkZXRhaWxbMF07CisKKyAgdHh0ID0gb2xkX2V4cGxvZGUodGV4dCwgIkBAXG4iKTsKKworICB3YXJuID0gKHt9KTsKKworICAvLyBNZWxkdW5nIGFuIHRoaXNfcGxheWVyKCkgcGFyc2VuIHVuZCBpbiB3YXJuIGZhbHNjaGUgUGxhdHpoYWx0ZXIgc2FtbWVsbgorICBteSA9IHByZXBhcnNlKHR4dFswXSwgJndhcm4pOworICBzdHJpbmcgb3RoZXIgPSAwOworICBpZiAoc2l6ZW9mKHR4dCkgPiAxKQorICAgIC8vIE1lbGR1bmcgYW4gYW5kZXJlIHBhcnNlbiB1bmQgaW4gd2FybiBmYWxzY2hlIFBsYXR6aGFsdGVyIHNhbW1lbG4KKyAgICBvdGhlciA9IHByZXBhcnNlKHR4dFsxXSwgJndhcm4pOworCisgIEFkZFVzZXJDbWQoYmVmLCAoc3RyaW5ncChkZXRhaWxbMV0pID8gZGV0YWlsWzEuLl0gOiAoeyAiQE5GQCIgfSkpLCBteSwgb3RoZXIpOworICBTYXZlKCk7CisgIGFycl9vdXQod2FybiwgIk9LLiIsICJXQVJOVU5HISBVbmd1ZWx0aWdlciBQbGF0emhhbHRlcjogJXMiLAorICAgICAgICAgICAgICAgIldBUk5VTkchIFVuZ3VlbHRpZ2UgUGxhdHpoYWx0ZXI6ICIpOworCisgIGRldGFpbCA9IDA7Cit9CisKKy8vIGNoZWNrLCBvYiBhbiBQb3NpdGlvbiBwb3MgaW4gdHh0IGVpbiBCdWNoc3RhYmUgYXVzIGRlbSBhcnJheSBjaG9pY2Ugc3RlaHQKKy8vIHJldHVybiAwIGZhbGxzIG5pY2h0LCBwcmVmaXggKyBQb3NpdGlvbiBkZXMgQnVjaHN0YWJlbnMgaW4gY2hvaWNlIGFuc29uc3RlbgorLy8gY2hlY2tfcGxhY2Vob2xkZXIoKHsiUiIsIlMiLCJNIiwiTiJ9KSwgMiwgIldFU1NFTiIsICJYIik7IC0+IFgxCitzdHJpbmcgY2hlY2tfcGxhY2Vob2xkZXIoc3RyaW5nKiBjaG9pY2UsIGludCBwb3MsIHN0cmluZyB0eHQsIHN0cmluZyBwcmVmaXgpCit7CisgICBpbnQgaWR4OworICAgIAorICAgaWYoc2l6ZW9mKHR4dCkgPCBwb3MrMSB8fAorICAgICAgKChpZHg9bWVtYmVyKGNob2ljZSwgdHh0W3Bvcy4ucG9zXSkpIDwgMCkpCisgICB7CisgICAgIHJldHVybiAwOworICAgfQorICAgZWxzZQorICAgeworICAgICByZXR1cm4gcHJlZml4K3RvX3N0cmluZyhpZHgpOworICAgfQorfQorCisvLyBEYW5uIGRydWVja3QgQFBXRVIgZGVuIEtub3BmIC0+IERhbm4gZHJ1ZWNrdCBAUDAgZGVuIEtub3BmCitwcml2YXRlIHN0cmluZyBwcmVwYXJzZShzdHJpbmcgc3RyLCBzdHJpbmcgKmludmFsaWQpCit7CisgIHN0cmluZyAqdHh0OworCisgIHR4dCA9IGV4cGxvZGUoc3RyLCAiQCIpOworICAvLyBmdWVyIGplZGVuIFRleHR0ZWlsIG5hY2ggZWluZW0gQAorICAvLyBzdWNoZSBFcnNhdHogZnVlciBkZW4gQmVncmlmZiBkaXJla3QgbmFjaCBkZW0gQAorICAvLyBBTjogd3VlcmRlIGVzIG5pY2h0IHRoZW9yZXRpc2NoIHJlaWNoZW4sIGhpZXIgbnVyIGJpcyBpPjAKKyAgLy8gcnVudGVyenV6YWVobGVuPyBEYXMgZXJzdGUgRWxlbWVudCBkZXMgQXJyYXlzIGlzdCBpbW1lciBpcnJlbGV2YW50LCB3ZWlsCisgIC8vIGVudHdlZGVyIExlZXJzdHJpbmcgb2RlciBrZWluIHp1IGVyc2V0emVuZGVyIEF1c2RydWNrLgorICBmb3IgKGludCBpPXNpemVvZih0eHQpLTE7IGk+PTA7IGktLSkgeworICAgIGludCB3YXJuID0gMDsKKyAgICBzdHJpbmcgcnBsID0gMDsKKyAgICAvLyBmYWxscyBUZWlsIHp1IGt1cnogbml4IGVyc2V0emVuCisgICAgaWYgKHNpemVvZih0eHRbaV0pPDMpCisgICAgICBjb250aW51ZTsKKyAgICAvLyBhbmhhbmQgZGVyIGVyc3RlbiBCdWNoc3RhYmVuLCBFcnNhdHogYmVzdGltbWVuCisgICAgLy8gd2FybiBzaWduYWxpc2llcnQsIG9iIGRpZXMgc2NoaWVmZ2luZzoKKyAgICBzd2l0Y2godHh0W2ldWzAuLjFdKSB7CisgICAgY2FzZSAiV0UiOiAgLy8gTmFtZQorICAgICAgLy8gV0VSICAgICAgLT4gVzAKKyAgICAgIC8vIFdFUyhTRU4pIC0+IFcxCisgICAgICAvLyBXRU0gICAgICAtPiBXMgorICAgICAgLy8gV0VOICAgICAgLT4gVzMKKyAgICAgIHJwbCA9IGNoZWNrX3BsYWNlaG9sZGVyKCh7IlIiLCJTIiwiTSIsIk4ifSksIDIsIHR4dFtpXSwgIlciKTsgIAorICAgICAgd2FybiA9ICFycGw7CisgICAgICBicmVhazsKKyAgICBjYXNlICJQVyI6ICAvLyBQZXJzb25hbHByb25vbWVuCisgICAgICAvLyBQV0VSICAgICAgLT4gUDAKKyAgICAgIC8vIFBXRVMoU0VOKSAtPiBQMQorICAgICAgLy8gUFdFTSAgICAgIC0+IFAyCisgICAgICAvLyBQV0VOICAgICAgLT4gUDMKKyAgICAgIHJwbCA9IGNoZWNrX3BsYWNlaG9sZGVyKCh7IlIiLCJTIiwiTSIsIk4ifSksIDMsIHR4dFtpXSwgIlAiKTsgIAorICAgICAgd2FybiA9ICFycGw7CisgICAgICBicmVhazsKKyAgICBjYXNlICJCTiI6ICAvLyBQb3NzZXNzaXZwcm9ub21lbgorICAgIGNhc2UgIkJNIjoKKyAgICBjYXNlICJCRiI6CisgICAgICAvLyBCTlNXRVIgICAgICAtPiBCMDAwICBCTVNXRVIgICAgICAtPiBCMDEwICBCRlNXRVIgICAgICAtPiBCMDIwCisgICAgICAvLyBCTlNXRVMoU0VOKSAtPiBCMTAwICBCTVNXRVMoU0VOKSAtPiBCMTEwICBCRlNXRVMoU0VOKSAtPiBCMTIwCisgICAgICAvLyBCTlNXRU0gICAgICAtPiBCMjAwICBCTVNXRU0gICAgICAtPiBCMjEwICBCRlNXRU0gICAgICAtPiBCMjIwCisgICAgICAvLyBCTlNXRU4gICAgICAtPiBCMzAwICBCTVNXRU4gICAgICAtPiBCMzEwICBCRlNXRU4gICAgICAtPiBCMzIwCisgICAgICAvLyAKKyAgICAgIC8vIEJOUFdFUiAgICAgIC0+IEIwMDEgIEJNUFdFUiAgICAgIC0+IEIwMTEgIEJGUFdFUiAgICAgIC0+IEIwMjEKKyAgICAgIC8vIEJOUFdFUyhTRU4pIC0+IEIxMDEgIEJNUFdFUyhTRU4pIC0+IEIxMTEgIEJGUFdFUyhTRU4pIC0+IEIxMjEKKyAgICAgIC8vIEJOUFdFTSAgICAgIC0+IEIyMDEgIEJNUFdFTSAgICAgIC0+IEIyMTEgIEJGUFdFTSAgICAgIC0+IEIyMjEKKyAgICAgIHJwbCA9IGNoZWNrX3BsYWNlaG9sZGVyKCh7IlIiLCJTIiwiTSIsIk4ifSksIDUsIHR4dFtpXSwgIkIiKTsKKyAgICAgIHdhcm4gPSAhcnBsOworICAgICAgaWYoIXdhcm4pCisgICAgICB7CisgICAgICAgIHJwbCA9IGNoZWNrX3BsYWNlaG9sZGVyKCh7Ik4iLCJNIiwiRiJ9KSwgMSwgdHh0W2ldLCBycGwpOworICAgICAgICB3YXJuID0gIXJwbDsKKyAgICAgICAgaWYoIXdhcm4pCisgICAgICAgIHsKKyAgICAgICAgICBycGwgPSBjaGVja19wbGFjZWhvbGRlcigoeyJTIiwiUCJ9KSwgMiwgdHh0W2ldLCBycGwpOworICAgICAgICAgIHdhcm4gPSAhcnBsOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICJQQSI6CisgICAgICAvLyBQQVJBIC0+IEYKKyAgICAgIC8vIGtlaW4gRXJzYXR6LCBzb25kZXJuIFRleHR0ZWlsIGhpZXIgZGlyZWt0IGVyc2V0emVuOgorICAgICAgaWYoc2l6ZW9mKHR4dFtpXSkgPiA0KQorICAgICAgICB0eHRbaV0gPSAiRiIrdHh0W2ldWzQuLl07CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgLy8ga2VpbiBFcnNhdHosIG5peCBhZW5kZXJuCisgICAgICB3YXJuID0gMDsKKyAgICAgIHJwbCA9IDA7CisgICAgfQorCisgICAgLy8gZmFsbHMgRXJzYXR6IHZvcmhhbmRlbiwgZXJzZXR6ZSBQcm9ub21lbiBkdXJjaCAiIitycGwgdW5kIGxhc3NlIGRlbiBSZXN0IHQyWzJdIHdpZSBpc3QKKyAgICBpZiAocnBsKSB7CisgICAgICBzdHJpbmcqIHQyOworICAgICAgd2FybiA9IHNpemVvZih0MiA9IHJlZ2V4cGxvZGUodHh0W2ldLCAiKFdFUnxXRVNTRU58V0VNfFdFTikiKSkgPCAyOworICAgICAgaWYgKCF3YXJuKSB7CisgICAgICAgIHQyWzFdID0gcnBsOworICAgICAgICB0MlswXSA9ICIiOworICAgICAgICB0eHRbaV0gPSBpbXBsb2RlKHQyLCAiIik7CisgICAgICB9CisgICAgfQorICAgIC8vIGZhbGxzIGVzIFByb2JsZW1lIGdhYiwgZGllc2UgbWVya2VuCisgICAgaWYgKHdhcm4pCisgICAgICBpbnZhbGlkICs9ICh7ICJAIitvbGRfZXhwbG9kZSh0eHRbaV0sIiAiKVswXSB9KTsKKworICB9IC8vIGZvciAoaT1zaXplb2YodHh0KS0xOyBpPj0wOyBpLS0pCisgIC8vIGRpZSBldmVudHVlbGxlIHRlaWx3ZWlzZSBlcnNldHpldG4gVGVpbGUgd2llZGVyIHp1c2FtbWVuZnVlZ2VuCisgIHJldHVybiBpbXBsb2RlKHR4dCwgIkAiKTsKK30KKworc3RhdGljIHZvaWQgbG9lc2NoX2FsbGVzKHN0cmluZyBzdHIpCit7CisgIGlmIChzdHIgPT0gImphIiB8fCBzdHIgPT0gIkphIikgeworICAgIFJlbW92ZURldGFpbCgwKTsKKyAgICBSZW1vdmVSZWFkRGV0YWlsKDApOworICAgIC8vU2V0UHJvcChQX1JFQURfREVUQUlMUywgKFtdKSk7CisgICAgU2V0UHJvcChIX0NPTU1BTkRTLCAoW10pKTsKKyAgICB3cml0ZSggIk9LLCBhbGxlIERldGFpbHMsIGxlc2JhcmVuIERldGFpbHMgdW5kIEJlZmVobGUgZ2Vsb2VzY2h0IVxuIiApOworICAgIFNhdmUoKTsKKyAgfQorICBlbHNlCisgICAgd3JpdGUoICJOaWNodHMgZ2Vsb2VzY2h0IVxuIiApOworfQorCitzdGF0aWMgdm9pZCBsb2VzY2hfZXR3YXMoc3RyaW5nIHN0ciwgc3RyaW5nIHByb3ApCit7CisgIGlmIChzdHIgPT0gImphIiB8fCBzdHIgPT0gIkphIikgeworICAgIGlmICggcHJvcCA9PSBQX0RFVEFJTFMgKQorICAgICAgUmVtb3ZlRGV0YWlsKDApOworICAgIGVsc2UgaWYgKCBwcm9wID09IFBfUkVBRF9ERVRBSUxTICkKKyAgICAgIFJlbW92ZVJlYWREZXRhaWwoMCk7CisgICAgZWxzZQorICAgICAgU2V0UHJvcChwcm9wLCAoW10pKTsKKyAgICB3cml0ZSgiT0suXG4iKTsKKyAgICBTYXZlKCk7CisgIH0KKyAgZWxzZQorICAgIHdyaXRlKCAiTmljaHRzIGdlbG9lc2NodCFcbiIgKTsKK30KKworaW50IGxvZXNjaChzdHJpbmcgc3RyKQoreworICBzdHJpbmcgKnMsICp0LCBwLCBxOworICBpbnQgaSwgcmV0OworICBtYXBwaW5nIGNvbTsKKworICBpZiAoIXRwX293bmVyX2NoZWNrKCkpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKCEoc3RyPVVQX0FSR1ModGhpc19wbGF5ZXIoKSkpIHx8IHN0ciA9PSAiIikgeworICAgIG5vdGlmeV9mYWlsKCJXZWxjaGVzIERldGFpbCBvZGVyIHdlbGNoZW4gQmVmZWhsIG1vZWNodGVzdCBEdSBsb2VzY2hlbj9cbiIpOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKHN0ciA9PSAiYWxsZXMiKSB7CisgICAgd3JpdGUoICJXaXJrbGljaCBhbGxlcyBsb2VzY2hlbiAoamEvbmVpbik/XG5dIik7CisgICAgaW5wdXRfdG8oImxvZXNjaF9hbGxlcyIpOworICAgIHJldHVybiAxOworICB9CisKKyAgaWYoc3RyPT0ibWVsZHVuZ2VuIikgeworICAgIGlmKGZpbGVfc2l6ZShQQVRIKyJyZXAvIitvd25lcisiLnJlcCIpPjApIHsKKyAgICAgIHJtKFBBVEgrInJlcC8iK293bmVyKyIucmVwIik7CisgICAgICB3cml0ZSgiTWVsZHVuZ2VuIGdlbG9lc2NodC5cbiIpOworICAgIH1lbHNleworICAgICAgd3JpdGUoIktlaW5lIE1lbGR1bmdlbiBnZWZ1bmRlbi5cbiIpOworICAgIH0KKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHMgPSBicmsoc3RyKTsKKyAgcyA9ICh7ICh0PW9sZF9leHBsb2RlKHNbMF0sICIgIikpWzBdIH0pKyh7IGltcGxvZGUodFsxLi5dLCIgIikgfSkrc1sxLi5dOworICByZXQgPSAxOworICBmbGFnID0gMDsKKworICBzd2l0Y2goc1swXSkgeworICAgIGNhc2UgImRldGFpbCI6CisgICAgICBzID0gc1sxLi5dOworICAgICAgZmxhZyB8PSBERVRBSUw7CisgICAgICBicmVhazsKKyAgICBjYXNlICJsZXNiYXIiOgorICAgICAgZmxhZyB8PSBSREVUQUlMOworICAgICAgcyA9IHNbMS4uXTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgImxlc2JhcmVzIjoKKyAgICBjYXNlICJsZXNiYXJlIjoKKyAgICAgIGZsYWcgfD0gUkRFVEFJTDsKKyAgICAgIGlmIChzWzFdWzAuLjVdID09ImRldGFpbCIpIHsKKyAgICBzID0gKHsgb2xkX2V4cGxvZGUoc1sxXSwiICIpWzwxXSB9KTsKKyAgICBpZiAoc2l6ZW9mKHMpPjIpCisgICAgICBzICs9IHNbMi4uXTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICBzID0gc1sxLi5dOworICAgICAgYnJlYWs7CisgICAgY2FzZSAiYmVmZWhsIjoKKyAgICAgIHMgPSBzWzEuLl07CisgICAgICBicmVhazsKKyAgICBjYXNlICJhbGxlIjoKKyAgICAgIHN3aXRjaCAoc1sxXSkgeworICAgICAgY2FzZSAiZGV0YWlscyI6CisgICAgcSA9ICJEZXRhaWxzIjsKKyAgICBwID0gUF9ERVRBSUxTOworICAgIGJyZWFrOworICAgICAgY2FzZSAibGVzYmFyZW4gZGV0YWlscyI6CisgICAgcSA9ICJsZXNiYXJlbiBEZXRhaWxzIjsKKyAgICBwID0gUF9SRUFEX0RFVEFJTFM7CisgICAgYnJlYWs7CisgICAgICBjYXNlICJiZWZlaGxlIjoKKyAgICBxID0gIkJlZmVobGUiOworICAgIHAgPSBIX0NPTU1BTkRTOworICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICB3cml0ZSgiRHUga2FubnN0IGFsbGUgQmVmZWhsZSwgYWxsZSBEZXRhaWxzIHVuZCBhbGxlIGxlc2JhcmVuIERldGFpbHMgbG9lc2NoZW4hXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICAgIHByaW50ZigiV2lya2xpY2ggYWxsZSAlcyBsb2VzY2hlbiAoamEvbmVpbik/XG5dIiwgcSk7CisgICAgICBpbnB1dF90bygibG9lc2NoX2V0d2FzIiwgMCwgcCk7CisgICAgICByZXR1cm4gMTsKKyAgICBkZWZhdWx0OgorICAgICAgZmxhZyB8PSAoREVUQUlMfFJERVRBSUwpOworICAgICAgcmV0ID0gMDsgIC8vIEtvZW5udGUgYXVjaCBlaW4gQXJ0aWtlbCBpbiBkZXIgWmVpdHVuZyBzZWluLi4uCisgICAgICBicmVhazsKKyAgfQorICBmb3IgKGk9c2l6ZW9mKHMpLTE7IGk+PTA7IGktLSkgeworICAgIGlmICghZmxhZykgeyAgLy8gQmVmZWhsIHNvbGwgZ2Vsb2VzY2h0IHdlcmRlbi4uLgorICAgICAgaWYgKG1lbWJlcihjb209UXVlcnkoSF9DT01NQU5EUyksIHNbaV0pKSB7CisgICAgY29tID0gbV9jb3B5X2RlbGV0ZShjb20sIHNbaV0pOworICAgIHdyaXRlKCJCZWZlaGwgJyIrc1tpXSsiJyB3dXJkZSBnZWxvZXNjaHQuXG4iKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHNpemVvZih0PW9sZF9leHBsb2RlKHNbaV0sICIgIikpID4gMSAmJgorICAgICAgICAgICBtZW1iZXIoY29tLCB0WzBdKSAmJgorICAgICAgICAgICBtZW1iZXIoY29tW3RbMF1dLCBwPWltcGxvZGUodFsxLi5dLCAiICIpKSkgeworICAgIGNvbVt0WzBdXSA9IG1fY29weV9kZWxldGUoY29tW3RbMF1dLCBwKTsKKyAgICB3cml0ZSgiQmVmZWhsICciK3NbaV0rIicgd3VyZGUgZ2Vsb2VzY2h0LlxuIik7CisgICAgICB9CisgICAgICBTZXQoSF9DT01NQU5EUywgY29tKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBpZiAoZmxhZyAmIERFVEFJTCkgeworICAgIGlmICghUXVlcnlQcm9wKFBfREVUQUlMUylbc1tpXV0pCisgICAgICBub3RpZnlfZmFpbCgiRGFzIERldGFpbCAnIitzW2ldKyInIGdpYnQgZXMgbmljaHQuXG4iKTsKKyAgICBlbHNlIHsKKyAgICAgIFJlbW92ZURldGFpbChzW2ldKTsKKyAgICAgIHdyaXRlKCJEZXRhaWwgJyIrc1tpXSsiJyB3dXJkZSBnZWxvZXNjaHQuXG4iKTsKKyAgICAgIHJldCA9IDE7CisgICAgfQorICAgICAgfQorICAgICAgaWYgKGZsYWcgJiBSREVUQUlMKSB7CisgICAgaWYgKCFRdWVyeVByb3AoUF9SRUFEX0RFVEFJTFMpW3NbaV1dKQorICAgICAgbm90aWZ5X2ZhaWwoIkRhcyBsZXNiYXJlIERldGFpbCAnIitzW2ldKyInIGdpYnQgZXMgbmljaHQuXG4iKTsKKyAgICBlbHNlIHsKKyAgICAgIFJlbW92ZVJlYWREZXRhaWwoc1tpXSk7CisgICAgICB3cml0ZSgiTGVzYmFyZXMgRGV0YWlsICciK3NbaV0rIicgd3VyZGUgZ2Vsb2VzY2h0LlxuIik7CisgICAgICByZXQgPSAxOworICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgU2F2ZSgpOworICByZXR1cm4gcmV0OworfQorCitpbnQgYXVzZ2FuZyhzdHJpbmcgc3RyKQoreworICBpbnQgbnIsIG1heE5yLCBoaW4sIHp1cnVlY2s7CisgIHN0cmluZyBoaWVyLCBkYSwgZXh0OworICBjbG9zdXJlIGhhdXNQcm9wOworICBtYXBwaW5nIGtub3duX2V4aXRzOworCisgIGlmICghdHBfb3duZXJfY2hlY2soKSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgaGllciA9IGRhID0gMDsKKyAgaGF1c1Byb3AgPSBzeW1ib2xfZnVuY3Rpb24oIkhhdXNQcm9wIixWRVJXQUxURVIpOworCisgIGlmICghKHN0cj1VUF9BUkdTKHRoaXNfcGxheWVyKCkpKSB8fAorICAgICAgKHNzY2FuZihzdHIsICIlcyAlZCIsIGhpZXIsIG5yKSAhPSAyICYmCisgICAgICAgc3NjYW5mKHN0ciwgIiVzICVzICVkIixoaWVyLCBleHQsIG5yKSAhPSAzKSApIHsKKyAgICBub3RpZnlfZmFpbCggIlN5bnRheDogYXVzZ2FuZyA8cmljaHR1bmc+IFtuYW1lXSA8bnI+XG4iICk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoZXh0KSB7CisgICAgaWYgKGZ1bmNhbGwoaGF1c1Byb3AsIGV4dCwgSFBfRU5WKSAhPSBmdW5jYWxsKGhhdXNQcm9wLCBvd25lciwgSFBfRU5WKSkgeworICAgICAgcHJpbnRmKCJEYXMgSGF1cyB2b24gJXMgc3RlaHQgbmljaHQgaW0gZ2xlaWNoZW4gUmF1bSB3aWUgRGVpbiBIYXVzIVxuIiwKKyAgICAgICAgICAgICBjYXBpdGFsaXplKGV4dCkpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGRhID0gUkFVTU5BTUUoZXh0LCBucik7CisKKyAgICAvLyBkZXIgYWxsb3dlZF9jaGVjaygpIHdpcmQgaW0gRWluZ2FuZ3NyYXVtIGRlcyBaaWVsaGF1c2VzIGF1ZmdlcnVmZW4sCisgICAgLy8gZGEgd2lyIHZvbiBhbmRlcmVuIFJhdW1lbiBub2NoIG5pY2h0IHdpc3Nlbiwgb2Igc2llIHVlYmVyaGF1cHQKKyAgICAvLyBleGlzdGllcmVuLgorICAgIGlmICghKFJBVU1OQU1FKGV4dCwgMCktPmFsbG93ZWRfY2hlY2sodGhpc19wbGF5ZXIoKSkpKSB7CisgICAgICBwcmludGYoIkR1IGRhcmZzdCBrZWluZW4gQXVzZ2FuZyB2b24gRGVpbmVtIEhhdXMgenUgZGVtIHZvbiAlcyBsZWdlbiFcbiIsCisgICAgICAgICAgICAgY2FwaXRhbGl6ZShleHQpKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICBleHQgPSBvd25lcjsKKyAgICBkYSA9IFJBVU1OQU1FKGV4dCwgbnIpOworICB9CisKKyAgbWF4TnIgPSBmdW5jYWxsKGhhdXNQcm9wLCBleHQsIEhQX1JPT01TKTsKKworICBpZiAoIChoaW4gPSBtZW1iZXIoYXVzZ2FlbmdlLCBsb3dlcl9jYXNlKGhpZXIpKSkgPCAwKSB7CisgICAgYXJyX291dChhdXNnYWVuZ2UsIDAsIDAsICJFcyBzaW5kIG51ciBmb2xnZW5kZSBBdXNnYWVuZ2UgbW9lZ2xpY2g6XG4iICk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgZWxzZQorICAgIHp1cnVlY2sgPSAoaGluICsgc2l6ZW9mKGF1c2dhZW5nZSkvMikgJSBzaXplb2YoYXVzZ2FlbmdlKTsKKworICBoaWVyID0gUkFVTU5BTUUob3duZXIsIHJhdW1Ocik7CisKKyAgLy8gS29waWUgZGVzIEF1c2dhZW5nZS1NYXBwaW5ncyBlcnpldWdlbgorICBrbm93bl9leGl0cz1kZWVwX2NvcHkoUXVlcnlQcm9wKFBfRVhJVFMpKTsKKyAgLy8gdW5kIGRlbiBOb3RhdXNnYW5nIGVudGZlcm5lbi4gU29taXQgYmxlaWJlbiBudXIgZGllIHp1IGJldHJhY2h0ZW5kZW4gCisgIC8vIEF1c2dhZW5nZSB1ZWJlci4KKyAga25vd25fZXhpdHNbIm5vdGF1c2dhbmciXT0wOworCisgIGlmIChuciA8IDAgfHwgbnIgPiBtYXhOcikKKyAgICBwcmludGYoICJEaWUgTnVtbWVyIGRhcmYgc2ljaCBudXIgaW0gQmVyZWljaCB6d2lzY2hlbiAwIHVuZCAlZCBiZXdlZ2VuIVxuIiwKKyAgICAgICAgICAgIG1heE5yICk7CisgIGVsc2UgaWYgKCBleHQgPT0gb3duZXIgJiYgbnIgPT0gcmF1bU5yKQorICAgIHByaW50ZiggIkFiZXIgZGllcyBJU1QgUmF1bSAlZCFcbiIsIHJhdW1OciApOworICBlbHNlIGlmIChtZW1iZXIobV9pbmRpY2VzKGtub3duX2V4aXRzKSwgYXVzZ2FlbmdlW2hpbl0pICE9IC0xKQorICAgIHdyaXRlKCAiQXVzIGRpZXNlbSBSYXVtIGZ1ZWhydCBzY2hvbiBlaW4gQXVzZ2FuZyBpbiBkaWVzZSBSaWNodHVuZyFcbiIgKTsKKyAgLy9lbHNlIGlmIChtZW1iZXIobV92YWx1ZXMoUXVlcnlQcm9wKFBfRVhJVFMpKSwgZGEpICE9IC0xKQorICAvLyBOb3RhdXNnYW5nIHdpcmQgaGllciB6d2FyIGdlbG9lc2NodCwgYWJlciBpbSBBZGRFeGl0CisgIC8vIGdpYnQncyBlaCBlaW5lbiBuZXVlbiwgc28gZGFzIG5vZXRpZyBpc3QsIFYqCisgIGVsc2UgaWYgKG1lbWJlcihtX3ZhbHVlcyhrbm93bl9leGl0cyksIGRhKSAhPSAtMSkKKyAgICBwcmludGYoICJFcyBnaWJ0IGhpZXIgc2Nob24gZWluZW4gQXVzZ2FuZyB6dSBSYXVtICVkIVxuIiwgbnIgKTsKKyAgZWxzZSBpZiAobWVtYmVyKG1faW5kaWNlcyhkYS0+UXVlcnlQcm9wKFBfRVhJVFMpKSwgYXVzZ2FlbmdlW3p1cnVlY2tdKSAhPSAtMSkKKyAgICBwcmludGYoICJFcyBmdWVocnQgc2Nob24gaXJnZW5kd28gZWluIEF1c2dhbmcgaW4gUmljaHR1bmcgJyVzJ1xuIgorICAgICAgICAgICAgIm5hY2ggUmF1bSAlZCFcbiIsIGF1c2dhZW5nZVtoaW5dLCBucik7CisgIGVsc2UgeworICAgIEFkZEV4aXQoIGF1c2dhZW5nZVtoaW5dLCBkYSApOworICAgIFNhdmUoKTsKKyAgICBkYS0+QWRkRXhpdChhdXNnYWVuZ2VbenVydWVja10sIGhpZXIpOworICAgIGRhLT5TYXZlKCk7CisgICAgcHJpbnRmKCAiT0ssIGRlciBBdXNnYW5nICclcycgenVtIFJhdW0gJWQgd3VyZGUgZWluZ2VyaWNodGV0LlxuIiwKKyAgICAgICAgICAgIGF1c2dhZW5nZVtoaW5dLCBuciApOworICB9CisgIHJldHVybiAxOworfQorCitpbnQKK3NwZXJyZW4oc3RyaW5nIHN0cikKK3sKKyAgbWFwcGluZyBleCwgY21kczsKKyAgaW50IGhpbiwgenVydWVjazsKKworICBpZiAoIXRwX293bmVyX2NoZWNrKCkpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKCEoc3RyPVVQX0FSR1ModGhpc19wbGF5ZXIoKSkpIHx8IHN0ciA9PSAiIikgeworICAgIG5vdGlmeV9mYWlsKCAiU3ludGF4OiBzcGVycmUgPGF1c2dhbmc+XG4iICk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgc3RyID0gbG93ZXJfY2FzZShzdHIpOworICBleCA9IFF1ZXJ5UHJvcChQX0VYSVRTKTsKKworICBpZiAocmF1bU5yID09IDAgJiYgc3RyID09ICJyYXVzIikgeworICAgIHdyaXRlKCAiRHUga2FubnN0IGRvY2ggbmljaHQgRGVpbmUgSGF1c3R1ZXIgbG9lc2NoZW4hXG4iICk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKCFtZW1iZXIoZXgsc3RyKSB8fCAoaGluID0gbWVtYmVyKGF1c2dhZW5nZSxzdHIpKSA8IDApIHsKKyAgICBwcmludGYoICJFcyBnaWJ0IGhpZXIga2VpbmVuIEF1c2dhbmcgJyVzJyFcbiIsIHN0cik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgZWxzZQorICAgIHp1cnVlY2sgPSAoaGluICsgc2l6ZW9mKGF1c2dhZW5nZSkvMikgJSBzaXplb2YoYXVzZ2FlbmdlKTsKKworICBleFtzdHJdLT5SZW1vdmVFeGl0KGF1c2dhZW5nZVt6dXJ1ZWNrXSk7CisgIHRlbGxfcm9vbShmaW5kX29iamVjdChleFtzdHJdKSwgc3ByaW50ZigiRGVyIEF1c2dhbmcgJyVzJyB2ZXJzY2h3aW5kZXQgcGxvZXR6bGljaC4uLlxuIiwgYXVzZ2FlbmdlW3p1cnVlY2tdKSk7CisgIGNtZHMgPSBleFtzdHJdLT5RdWVyeVByb3AoSF9DT01NQU5EUyk7CisgIGNtZHMgPSBtX2NvcHlfZGVsZXRlKGNtZHMsIGF1c2dhZW5nZVt6dXJ1ZWNrXSk7CisgIGV4W3N0cl0tPlNldFByb3AoSF9DT01NQU5EUywgY21kcyk7CisgIGV4W3N0cl0tPlNhdmUoKTsKKyAgUmVtb3ZlRXhpdChzdHIpOworICBjbWRzID0gUXVlcnlQcm9wKEhfQ09NTUFORFMpOworICBjbWRzID0gbV9jb3B5X2RlbGV0ZShjbWRzLCBzdHIpOworICBTZXRQcm9wKEhfQ09NTUFORFMsIGNtZHMpOworICBTYXZlKCk7CisgIHByaW50ZiggIk9LLCBkZXIgQXVzZ2FuZyAnJXMnIHd1cmRlIGVudGZlcm50LlxuIiwgc3RyICk7CisKKyAgU2F2ZSgpOworCisgIHJldHVybiAxOworfQorCit2YXJhcmdzIGludAordWViZXJzaWNodChzdHJpbmcgZHVtbXksIHN0cmluZyBwcmUpCit7CisgIHN0cmluZyAqeGMsICp4ZCwgbywgcmF1cywgc3RyOworICBtaXhlZCAqY29tOworICBtYXBwaW5nIHRtcDsKKyAgaW50IGksaixrOworCisgIGlmICggKGdldHVpZCh0aGlzX3BsYXllcigpKSAhPSBvd25lcikgJiYKKyAgICAgICAhKFBBVEgrImFjY2Vzc19yaWdodHMiKS0+YWNjZXNzX3JpZ2h0cyhnZXRldWlkKHRoaXNfcGxheWVyKCkpLCAiIikgKQorICAgIHJldHVybiAwOworCisgIGkgPSBWRVJXQUxURVItPkhhdXNQcm9wKG93bmVyLCBIUF9ST09NUyk7CisKKyAgaWYgKGkpCisgICAgc3RyID0gc3ByaW50ZiggIkRlaW4gSGF1cyB2ZXJmdWVndCB1ZWJlciAlZCBSYWV1bWUuXG5EdSBzdGVoc3QgaW4gUmF1bSAlZCAoJXMpLlxuXG4iLCBpKzEsIHJhdW1OciwgUXVlcnlQcm9wKFBfSU5UX1NIT1JUKSApOworICBlbHNlCisgICAgc3RyID0gc3ByaW50ZiggIkRlaW4gSGF1cyB2ZXJmdWVndCB1ZWJlciBlaW5lbiBSYXVtICglcylcblxuIiwgUXVlcnlQcm9wKFBfSU5UX1NIT1JUKSk7CisKKyAgc3RyICs9IGFycl9vdXQobV9pbmRpY2VzKFF1ZXJ5UHJvcChQX0RFVEFJTFMpKSwKKyAgICAgICAgICJEdSBoYXN0IGtlaW5lIERldGFpbHMgYmVzY2hyaWViZW4uIiwKKyAgICAgICAgICJEdSBoYXN0IGRhcyBEZXRhaWwgJyVzJyBiZXNjaHJpZWJlbi4iLAorICAgICAgICAgIkR1IGhhc3QgZm9sZ2VuZGUgRGV0YWlscyBiZXNjaHJpZWJlbjpcbiIsIDEgKTsKKworICBzdHIgKz0gKCJcbiIgKyBhcnJfb3V0KG1faW5kaWNlcyhRdWVyeVByb3AoUF9SRUFEX0RFVEFJTFMpKSwKKyAgICAgICAgICJEdSBoYXN0IGtlaW5lIGxlc2JhcmVuIERldGFpbHMgYmVzY2hyaWViZW4uIiwKKyAgICAgICAgICJEdSBoYXN0IGRhcyBsZXNiYXJlIERldGFpbCAnJXMnIGJlc2NocmllYmVuLiIsCisgICAgICAgICAiRHUgaGFzdCBmb2xnZW5kZSBsZXNiYXJlbiBEZXRhaWxzIGJlc2NocmllYmVuOlxuIiwgMSApICk7CisKKyAgdG1wID0gUXVlcnkoSF9DT01NQU5EUyk7CisgIHhjID0gc29ydF9hcnJheShtX2luZGljZXModG1wKSwjJzwpOworICBpZiAoIXNpemVvZih4YykpCisgICAgc3RyICs9ICgiXG5EdSBoYXN0IGtlaW5lIEJlZmVobGUgYmVzY2hyaWViZW4uXG4iKTsKKyAgZWxzZSB7CisgICAgaWYgKHNpemVvZih4YykgPT0gMSAmJiBzaXplb2YoeGQ9bV9pbmRpY2VzKHRtcFt4Y1swXV0pKSA9PSAxKQorICAgICAgc3RyICs9ICgiXG5EdSBoYXN0IGRlbiBCZWZlaGwgJyIrCisgICAgICAgICAgeGNbMF0rKCh4ZFswXSA9PSAiIikgPyAiIiA6ICIgIit4ZFswXSkrCisgICAgICAgICAgIicgYmVzY2hyaWViZW4uXG4iKTsKKyAgICBlbHNlIHsKKyAgICAgIHN0ciArPSAiXG5EdSBoYXN0IGZvbGdlbmRlIEJlZmVobGUgYmVzY2hyaWViZW46XG4iOworCisgICAgICBmb3IgKGNvbSA9ICh7fSksIGo9c2l6ZW9mKHhjKS0xOyBqID49IDA7IGotLSkgeworICAgIHhkID0gc29ydF9hcnJheShtX2luZGljZXModG1wW3hjW2pdXSktKHsiQE5GQCJ9KSwjJz4pOworICAgIGlmICgoc2l6ZW9mKHhkKSA+IDEpICYmICh4ZFswXSA9PSAiIikpIHsKKyAgICAgIHJhdXMgPSAiKiAiK3hjW2pdKyIsICIreGNbal0rIiAiOworICAgICAgeGQgPSB4ZFsxLi5dOworICAgIH0KKyAgICBlbHNlCisgICAgICByYXVzID0gIiogIit4Y1tqXSsiICI7CisKKyAgICBzdHIgKz0gYXJyX291dCh4ZCwgIiIsIHJhdXMrIiVzIiwgcmF1cywgMyk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmF1cyA9IChtZW1iZXIoUXVlcnlQcm9wKFBfRVhJVFMpLCJyYXVzIikgPyAicmF1czogTmFjaCBkcmF1c3Nlbi5cbiIgOiAwICk7CisgIHRtcCA9IG1fY29weV9kZWxldGUoUXVlcnlQcm9wKFBfRVhJVFMpLCAicmF1cyIpOworICBtX2RlbGV0ZSh0bXAsICJub3RhdXNnYW5nIik7CisgIHhjID0gbV9pbmRpY2VzKHRtcCk7CisgIHhkID0gbV92YWx1ZXModG1wKTsKKworICBpZiAoIXNpemVvZih4YykgJiYgIXJhdXMpCisgICAgc3RyICs9ICJcbkVTIEdJQlQgS0VJTkUgQVVTR0FFTkdFIVxuIjsKKyAgZWxzZSB7CisgICAgc3RyICs9ICAiXG5FcyBnaWJ0IGZvbGdlbmRlIEF1c2dhZW5nZTpcbiI7CisgICAgZm9yIChpPXNpemVvZih4YyktMTsgaT49MDsgaS0tKQorICAgICAgc3RyICs9IHNwcmludGYoICIlczogTmFjaCBSYXVtICVkICVzKCVzKS5cbiIsCisgICAgICAgICAgICAgeGNbaV0sCisgICAgICAgICAgICAgKGo9dG9faW50KHhkW2ldWzwxLi5dKSksCisgICAgICAgICAgICAgKCgobz1vbGRfZXhwbG9kZSh4ZFtpXSwiLyIpWzwxXVswLi48Nl0pPT1vd25lcikgPworICAgICAgICAgICAgICIiIDogInZvbiAiK2NhcGl0YWxpemUobykrIiAiKSwKKyAgICAgICAgICAgICB4ZFtpXS0+UXVlcnlQcm9wKFBfSU5UX1NIT1JUKSApOworICB9CisgIHN0ciArPSAoKHJhdXN8fCIiKSsocHJlfHwiIikpOworICB0aGlzX3BsYXllcigpLT5Nb3JlKHN0cik7CisgIHJldHVybiAxOworfQorCitpbnQga29waWVyZW4oc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIHdhcywgYWx0LCBuLCAqbmV1LCAqcGFyLCBlcnI7CisgIG1peGVkIGRhczsKKyAgbWFwcGluZyBjb207CisKKyAgaWYgKCF0cF9vd25lcl9jaGVjaygpKQorICAgIHJldHVybiAwOworCisgIG5vdGlmeV9mYWlsKCIna29waWVyZSBkZXRhaWwgPHZvbj4gbmFjaCA8bmFjaD4nIG9kZXJcbiIKKyAgICAgICAgICsiJ2tvcGllcmUgbGVzYmFyZXMgZGV0YWlsIDx2b24+IG5hY2ggPG5hY2g+JyBvZGVyXG4iCisgICAgICAgICArIidrb3BpZXJlIGJlZmVobCA8YmVmZWhsPiBbPHBhcmFtZXRlcj5dIG5hY2ggPGJlZmVobD4gWzxwYXJhbWV0ZXI+XSchXG4iKTsKKworICBpZiAoIShzdHI9VVBfQVJHUyh0aGlzX3BsYXllcigpKSkgfHwgc3RyID09ICIiKQorICAgIHJldHVybiAwOworCisgIG5ldSA9IG9sZF9leHBsb2RlKHN0ciwgIiAiKTsKKyAgd2FzID0gbmV1WzBdWzAuLjVdOworICBpZiAod2FzID09ICJkZXRhaWwiIHx8IHdhcyA9PSAiYmVmZWhsIikKKyAgICBzdHIgPSBpbXBsb2RlKG5ldVsxLi5dLCAiICIpOworICBlbHNlIGlmICh3YXMgPT0gImxlc2JhciIpCisgICAgc3RyID0gaW1wbG9kZShuZXVbMi4uXSwgIiAiKTsKKyAgZWxzZQorICAgIHJldHVybiAwOworCisgIGlmIChzc2NhbmYoc3RyLCAiJXMgbmFjaCAlcyIsIGFsdCwgbikgIT0gMikKKyAgICByZXR1cm4gMDsKKworICBuZXUgPSBicmsobik7CisgIHN3aXRjaCh3YXMpIHsKKyAgICBjYXNlICJkZXRhaWwiOgorICAgICAgZXJyID0gIkRldGFpbCI7CisgICAgICBpZiAoZGFzID0gR2V0RGV0YWlsKGFsdCkpIHsKKyAgICBBZGREZXRhaWwobmV1LCBkYXMpOworICAgIFNhdmUoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgImxlc2JhciI6CisgICAgICBlcnIgPSAibGVzYmFyZXMgRGV0YWlsIjsKKyAgICAgIGlmIChkYXMgPSBRdWVyeVByb3AoUF9SRUFEX0RFVEFJTFMpW2FsdF0pIHsKKyAgICBBZGRSZWFkRGV0YWlsKG5ldSwgZGFzKTsKKyAgICBTYXZlKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICJiZWZlaGwiOgorICAgICAgZXJyID0gIkJlZmVobCI7CisgICAgICB3YXMgPSAocGFyPW9sZF9leHBsb2RlKGFsdCwgIiAiKSlbMF07CisgICAgICBpZiAobWVtYmVyKGNvbT1RdWVyeVByb3AoSF9DT01NQU5EUyksd2FzKSkgeworICAgIGludCBpOworICAgIGlmIChzaXplb2YocGFyKSA9PSAxKSB7IC8vIDxiZWY+IG5hY2ggPGJlZjEsYmVmMiwuLi4+CisgICAgICBkYXMgPSBjb21bd2FzXTsKKyAgICAgIGZvciAoaT1zaXplb2YobmV1KS0xOyBpPj0wOyBpLS0pIHsKKyAgICAgICAgaWYgKGJlZkNoZWNrKG5ldVtpXSkpIHsKKyAgICAgICAgICBpZiAoY29tW25ldVtpXV0pCisgICAgICAgIGNvbVtuZXVbaV1dICs9IGRhczsKKyAgICAgICAgICBlbHNlCisgICAgICAgIGNvbSArPSAoWyBuZXVbaV0gOiBkYXMgXSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIHdyaXRlKCJVbmd1ZWx0aWdlciBCZWZlaGw6ICciK25ldVtpXSsiJy5cbiIpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsgICAgICAgIC8vIDxiZWY+IDxwYXJhbWV0ZXI+IG5hY2ggPGJlZjEsYmVmMiwuLi4+CisgICAgICBhbHQgPSBpbXBsb2RlKHBhclsxLi5dLSh7IiJ9KSwiICIpOworICAgICAgaWYgKGRhcyA9IGNvbVt3YXNdW2FsdF0pIHsKKyAgICAgICAgZm9yIChpPXNpemVvZihuZXUpLTE7IGk+PTA7IGktLSkgeworICAgICAgICAgIGlmIChiZWZDaGVjayhuZXVbaV0pKSB7CisgICAgICAgIGRhcyA9IChbIGFsdCA6IGNvbVt3YXNdW2FsdF07Y29tW3dhc11bYWx0LDFdIF0pOworICAgICAgICBpZiAoY29tW25ldVtpXV0pCisgICAgICAgICAgY29tW25ldVtpXV0gKz0gZGFzOworICAgICAgICBlbHNlCisgICAgICAgICAgY29tICs9IChbIG5ldVtpXSA6IGRhcyBdKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSB7CisgICAgICAgIHBhciA9IG9sZF9leHBsb2RlKG5ldVtpXSwgIiAiKTsKKyAgICAgICAgbiA9IHBhclswXTsKKyAgICAgICAgaWYgKGJlZkNoZWNrKG4pKSB7CisgICAgICAgICAgZGFzID0gKFsgaW1wbG9kZShwYXJbMS4uXSwgIiAiKSA6IGNvbVt3YXNdW2FsdF07Y29tW3dhc11bYWx0LDFdIF0pOworICAgICAgICAgIGlmIChjb21bbl0pCisgICAgICAgICAgICBjb21bbl0gKz0gZGFzOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNvbSArPSAoWyBuIDogZGFzIF0pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICB3cml0ZSgiVW5ndWVsdGlnZXIgQmVmZWhsOiAnIituZXVbaV0rIicuXG4iKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgU2F2ZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHdyaXRlKCAiRHUga2FubnN0IG51ciBEZXRhaWxzLCBsZXNiYXJlIERldGFpbHMgdW5kIEJlZmVobGUga29waWVyZW4hXG4iICk7CisgICAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoIWRhcykKKyAgICBwcmludGYoICJLYW5uICVzICclcycgbmljaHQgZmluZGVuIVxuIiwgZXJyLCBhbHQpOworICBlbHNlCisgICAgd3JpdGUoICJPSyFcbiIgKTsKKworICByZXR1cm4gMTsKK30KKworaW50IGxpY2h0KHN0cmluZyBzdHIpCit7CisgIGludCBsbCwgdGw7CisKKyAgaWYgKCFhbGxvd2VkX2NoZWNrKHRoaXNfcGxheWVyKCkpKQorICAgIHJldHVybiAwOworCisgIGlmICghc3RyIHx8IChzdHIgIT0gImFuIiAmJiBzdHIgIT0gImF1cyIpKSB7CisgICAgbm90aWZ5X2ZhaWwoIlN5bnRheDogJ2xpY2h0IGFuJyBvZGVyICdsaWNodCBhdXMnXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGxsID0gUXVlcnlQcm9wKFBfTElHSFQpOworICB0bCA9IFBMLT5RdWVyeVByb3AoUF9QTEFZRVJfTElHSFQpOworCisgIHN3aXRjaChzdHIpIHsKKyAgY2FzZSAiYW4iOgorICAgIGlmICh0bCA+IDApCisgICAgICB3cml0ZSgiQWJlciBlcyBpc3QgZG9jaCBzY2hvbiBoZWxsIVxuIik7CisgICAgZWxzZSB7CisgICAgICBTZXRQcm9wKFBfTElHSFQsIDEpOworICAgICAgdGVsbF9yb29tKHRoaXNfb2JqZWN0KCksICJFcyB3aXJkIHdpZWRlciBoZWxsLlxuIik7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlICJhdXMiOgorICAgIGlmICh0bCA8PSAwKQorICAgICAgd3JpdGUoIkFiZXIgZXMgaXN0IGRvY2ggc2Nob24gZHVua2VsIVxuIik7CisgICAgZWxzZSB7CisgICAgICBTZXRQcm9wKFBfTElHSFQsIDApOworICAgICAgdGVsbF9yb29tKHRoaXNfb2JqZWN0KCksICJFcyB3aXJkIGR1bmtlbC5cbiIpOworICAgIH0KKyAgICBicmVhazsKKyAgfQorICByZXR1cm4gMTsKK30KKworI2RlZmluZSBDQVNVUyAoeyAiV0VSIiwgIldFU1NFTiIsICJXRU0iLCAiV0VOIiB9KQorc3RhdGljIHN0cmluZyBycFhjaGcoc3RyaW5nIHMpCit7CisgIGludCBjLHAsZzsKKworICBzd2l0Y2goc1swLi4xXSkgeworICAgIGNhc2UgIkBXIjoKKyAgICAgIGMgPSB0b19pbnQoc1syLi4yXSk7CisgICAgICByZXR1cm4gKCJAIitDQVNVU1tjXSk7CisgICAgY2FzZSAiQFAiOgorICAgICAgYyA9IHRvX2ludChzWzIuLjJdKTsKKyAgICAgIHJldHVybiAoIkBQIitDQVNVU1tjXSk7CisgICAgY2FzZSAiQEIiOgorICAgICAgYyA9IHRvX2ludChzWzIuLjJdKTsKKyAgICAgIGcgPSB0b19pbnQoc1szLi4zXSk7CisgICAgICBwID0gdG9faW50KHNbNC4uNF0pOworICAgICAgcmV0dXJuICgiQEIiKyh7Ik4iLCAiTSIsICJGIn0pW2ddKyh7IlMiLCAiUCJ9KVtwXStDQVNVU1tjXSk7CisgICAgY2FzZSAiQEYiOgorICAgICAgcmV0dXJuICJAUEFSQSI7CisgIH0KKyAgcmV0dXJuIHM7Cit9CisKK3ByaXZhdGUgc3RyaW5nIHJlUGFyc2Uoc3RyaW5nIHMxLCBzdHJpbmcgczIpCit7CisgIHN0cmluZyAqcDsKKworICBpZiAoczIpCisgICAgczEgPSBzMSsiQEBcbiIrczI7CisKKyAgcCA9IHJlZ2V4cGxvZGUoczEsICIoQFdbMC0zXXxAUFswLTNdfEBCWzAtM11bMC0yXVswLTFdKSIpOworICBwID0gbWFwKHAsICMncnBYY2hnKTsKKyAgcmV0dXJuIGltcGxvZGUocCwgIiIpOworfQorCitwcml2YXRlIHN0cmluZyBnZXRQcmVUZXh0KHN0cmluZyBwcm9wLCBzdHJpbmcgZXhwcikKK3sKKyAgbWl4ZWQgY3J1bmNoZWQ7CisgIGludCBpOworCisgIGNydW5jaGVkID0gVkVSV0FMVEVSLT5QQ3J1bmNoKFF1ZXJ5UHJvcChwcm9wKSk7CisgIGlmICghY3J1bmNoZWQgfHwgIXBvaW50ZXJwKGNydW5jaGVkKSkKKyAgICByZXR1cm4gMDsKKworICBpZiAocHJvcCA9PSBIX0NPTU1BTkRTICYmIHN0cnN0cihleHByLCAiICIpIDwgMCkKKyAgICBleHByID0gZXhwcisiICI7CisKKyAgZm9yIChpPXNpemVvZihjcnVuY2hlZCktMTsgaT49MDsgaS0tKQorICAgIGlmIChtZW1iZXIoY3J1bmNoZWRbaV1bMF0sIGV4cHIpID49IDApCisgICAgICBicmVhazsKKworICBpZiAoaTwwKQorICAgIHJldHVybiAwOworCisgIGRldGFpbCA9IGNydW5jaGVkW2ldWzBdOworCisgIGlmIChwcm9wID09IEhfQ09NTUFORFMpCisgICAgcmV0dXJuIHJlUGFyc2UoY3J1bmNoZWRbaV1bMV0sIGNydW5jaGVkW2ldWzJdKTsKKyAgZWxzZQorICAgIHJldHVybiBjcnVuY2hlZFtpXVsxXTsKK30KKwordmFyYXJncyBpbnQKK2FlbmRlcm4oc3RyaW5nIHN0ciwgaW50IGYpCit7CisgIHN0cmluZyAqcGFydHMsIHByZTsKKyAgaW50IHNwLCBzciwgcmV0OworCisgIGlmICghdHBfb3duZXJfY2hlY2soKSkKKyAgICByZXR1cm4gMDsKKworICBpZiAoIWYgJiYgKCEoc3RyPVVQX0FSR1ModGhpc19wbGF5ZXIoKSkpIHx8IHN0ciA9PSAiIikpIHsKKyAgICBub3RpZnlfZmFpbCgiV2FzIHdpbGxzdCBEdSBkZW5uIGFlbmRlcm4/XG4iICk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBzcCA9IHNpemVvZihwYXJ0cyA9IG9sZF9leHBsb2RlKHN0ciwgIiAiKSk7CisgIHNyID0gc2l6ZW9mKGJyayhzdHIpKTsKKyAgZGV0YWlsID0gMDsKKyAgZmxhZyA9IGY7CisKKyAgc3dpdGNoKHBhcnRzWzBdWzAuLjNdKSB7CisgICAgY2FzZSAicmF1bSI6ICAgICAgLy8gTGFuZy0gb2RlciBLdXJ6YmVzY2hyZWlidW5nCisgICAgY2FzZSAiaGF1cyI6CisgICAgICBpZiAoc3AgPT0gMSB8fCBwYXJ0c1sxXSA9PSAibGFuZyIpCisgICAgZmxhZyB8PSBMQU5HOworICAgICAgZWxzZSBpZiAocGFydHNbMV0gPT0gImt1cnoiKSB7CisgICAgd3JpdGUoIk5pbW0gZGF6dSBkb2NoIGJpdHRlICdiZXNjaHJlaWJlJyFcbiIpOworICAgIHJldHVybiAxOworICAgICAgfQorICAgICAgcHJlID0gKChmbGFnICYgQVVTU0VOKSA/IChmaW5kX29iamVjdChIQVVTTkFNRShvd25lcikpKS0+UXVlcnlQcm9wKFBfTE9ORykgOiBRdWVyeVByb3AoUF9JTlRfTE9ORykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAibWVsZCI6CisgICAgICBpZiAoZmlsZV9zaXplKFJFUEZJTEUob3duZXIpKSA+IDApCisgICAgcHJlID0gcmVhZF9maWxlKFJFUEZJTEUob3duZXIpKTsKKyAgICAgIGVsc2UgeworICAgIHdyaXRlKCJJY2ggZmluZGUga2VpbmUgTWVsZHVuZ2VuIGF1cyBEZWluZW0gSGF1cyFcbiIpOworICAgIHJldHVybiAxOworICAgICAgfQorICAgICAgZmxhZyB8PSBSRVBPUlQ7CisgICAgICBicmVhazsKKyAgICBjYXNlICJkZXRhIjogICAgICAvLyBEZXRhaWxzCisgICAgICBpZiAoc3A9PTEpIHsKKyAgICBub3RpZnlfZmFpbCgiV2VsY2hlcyBEZXRhaWwgd2lsbHN0IER1IGRlbm4gYWVuZGVybj9cbiIpOworICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgaWYgKHNyPjEpIHsKKyAgICBub3RpZnlfZmFpbCgiRHUga2FubnN0IGltbWVyIG51ciBlaW4gRGV0YWlsIGFlbmRlcm4hXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGZsYWcgfD0gREVUQUlMOworICAgICAgcHJlID0gZ2V0UHJlVGV4dChQX0RFVEFJTFMsIGltcGxvZGUocGFydHNbMS4uXSwgIiAiKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlICJsZXNiIjogICAgICAvLyBsZXNiYXJlIERldGFpbHMKKyAgICAgIG5vdGlmeV9mYWlsKCJXZWxjaGVzIGxlc2JhcmUgRGV0YWlsIHdpbGxzdCBEdSBkZW5uIGFlbmRlcm4/XG4iKTsKKyAgICAgIGlmIChzcCA9PSAxKSByZXR1cm4gMDsKKyAgICAgIGlmICgocGFydHNbMV0gPT0gImRldGFpbHMiIHx8IHBhcnRzWzFdID09ICJkZXRhaWwiKSAmJiAoc3A9PTIpKQorICAgIHJldHVybiAwOworICAgICAgaWYgKHNyPjEpIHsKKyAgICBub3RpZnlfZmFpbCgiRHUga2FubnN0IGltbWVyIG51ciBlaW4gbGVzYmFyZXMgRGV0YWlsIGFlbmRlcm4hXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGZsYWcgfD0gUkRFVEFJTDsKKyAgICAgIHByZSA9IGdldFByZVRleHQoUF9SRUFEX0RFVEFJTFMsIGltcGxvZGUocGFydHNbMS4uXSwgIiAiKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlICJiZWZlIjogICAgICAvLyBCZWZlaGxlCisgICAgICByZXQgPSAwOworICAgICAgaWYgKHNwID09IDEpIHsKKyAgICBub3RpZnlfZmFpbCgiV2VsY2hlbiBCZWZlaGwgd2lsbHN0IER1IGRlbm4gYWVuZGVybj9cbiIpOworICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgaWYgKHNyPjEpIHsKKyAgICBub3RpZnlfZmFpbCgiRHUga2FubnN0IGltbWVyIG51ciBlaW5lbiBCZWZlaGwgYWVuZGVybiFcbiIpOworICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgZmxhZyB8PSBCRUZFSEw7CisgICAgICBwcmUgPSBnZXRQcmVUZXh0KEhfQ09NTUFORFMsIGltcGxvZGUocGFydHNbMS4uXSwgIiAiKSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgbm90aWZ5X2ZhaWwoIkRhcyBrYW5uc3QgRHUgbmljaHQgYWVuZGVybiEgRWluZSBMaXN0ZSBkZXIgRGluZ2UsIGRpZSBEdSBoaWVyIGFlbmRlcm5cbiIKKyAgICAgICAgICsia2FubnN0LCBlcmhhZWx0c3QgRHUgbWl0ICdoaWxmZSBhZW5kZXJlJy5cbiIgKTsKKyAgICAgIHJldHVybiAwOworICAgICAgYnJlYWs7CisgIH0KKyAgaWYgKCFwcmUpCisgICAgd3JpdGUoIkhtLCBzb3dhcyBpc3QgaGllciBub2NoIG5pY2h0IGJlc2NocmllYmVuLi4uXG4iKTsKKyAgZWxzZSB7CisgICAgd3JpdGUoICJBZW5kZXJlIG51biBkZW4gVGV4dC5cbihCZWVuZGVuIG1pdCAuIG9kZXIgKiosIEFiYnJ1Y2ggbWl0IH5xLCBIaWxmZSBtaXQgfmgpXG4iICk7CisgICAgbmVkaXQoICJhZW5kZXJ1bmciLCBwcmUgKTsKKyAgfQorICByZXR1cm4gMTsKK30KKwordm9pZCBhZW5kZXJ1bmcoc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nICp3YXJuOworCisgIGlmICghc3RyKSB7CisgICAgd3JpdGUoIk5pY2h0cyBnZWFlbmRlcnQhXG4iKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoZmxhZyAmJiAhKGZsYWcgJiBCRUZFSEwpKQorICAgIHN0ciA9IG5vcm1zdHIoc3RyKTsKKworICB3YXJuID0gKHsgfSk7CisKKyAgaWYgKGZsYWcgJiBMQU5HKSB7CisgICAgaWYgKGZsYWcgJiBBVVNTRU4pIHsKKyAgICAgIG9iamVjdCBoYXVzOworICAgICAgaGF1cyA9IGZpbmRfb2JqZWN0KEhBVVNOQU1FKG93bmVyKSk7CisgICAgICBoYXVzLT5TZXRQcm9wKFBfTE9ORywgc3RyKTsKKyAgICAgIGhhdXMtPlNhdmUoKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgU2V0UHJvcChQX0lOVF9MT05HLCBzdHIpOworICB9CisgIGVsc2UgaWYgKGZsYWcgJiBERVRBSUwpIHsKKyAgICBpZiAoc3RyID09ICIiKQorICAgICAgUmVtb3ZlRGV0YWlsKGRldGFpbCk7CisgICAgZWxzZQorICAgICAgQWRkRGV0YWlsKGRldGFpbCwgc3RyKTsKKyAgfQorICBlbHNlIGlmIChmbGFnICYgUkRFVEFJTCkgeworICAgIGlmIChzdHIgPT0gIiIpCisgICAgICBSZW1vdmVSZWFkRGV0YWlsKGRldGFpbCk7CisgICAgZWxzZQorICAgICAgQWRkUmVhZERldGFpbChkZXRhaWwsIHN0cik7CisgIH0KKyAgZWxzZSBpZiAoZmxhZyAmIEJFRkVITCkgeworICAgIGlmIChzdHIgPT0gIiIpCisgICAgICBSZW1Vc2VyQ21kKGRldGFpbCk7CisgICAgZWxzZSB7CisgICAgICBzdHJpbmcgKnM7CisKKyAgICAgIHMgPSBvbGRfZXhwbG9kZShwcmVwYXJzZShzdHIsICZ3YXJuKSwgIkBAXG4iKTsKKyAgICAgIGlmIChzaXplb2YocykgPiAxICYmIHNbMV0gIT0gIiIpCisgICAgQWRkVXNlckNtZChkZXRhaWwsIDAsIG5vcm1zdHIoc1swXSksIG5vcm1zdHIoc1sxXSkpOworICAgICAgZWxzZQorICAgIEFkZFVzZXJDbWQoZGV0YWlsLCAwLCBub3Jtc3RyKHNbMF0pLCAwKTsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoZmxhZyAmIFJFUE9SVCkgeworICAgIHJtKFJFUEZJTEUob3duZXIpKTsKKyAgICBpZiAoc3RyICE9ICIiKQorICAgICAgd3JpdGVfZmlsZShSRVBGSUxFKG93bmVyKSwgc3RyKTsKKyAgfQorICBlbHNlCisgICAgd3JpdGUoICJIdWNoISBVbmJla2FubnRlcyBGbGFnICgiK2ZsYWcrIikuLi4gU2FnIG1hbCBXYXJnb24gQmVzY2hlaWQuLi5cbiIpOworCisgIGFycl9vdXQod2FybiwgIk9LLiIsICJXQVJOVU5HISBVbmd1ZWx0aWdlciBQbGF0emhhbHRlcjogJXMiLAorICAgICAgICAgICAgICAgIldBUk5VTkchIFVuZ3VlbHRpZ2UgUGxhdHpoYWx0ZXI6ICIpOworICBTYXZlKCk7Cit9CisKK2ludCBTbWFydExvZyhzdHJpbmcgb2ZpbGUsIHN0cmluZyB0eXAsIHN0cmluZyBtc2csIHN0cmluZyBkYXRlKQoreworICBvYmplY3QgaG9tZTsKKworICAvLyBzcGVpY2hlcmUgTWVsZHVuZyBpbSBSZXAtTG9nIGRlcyBTZWhlcmhhdXMtQmVzaXR6ZXJzCisgIHdyaXRlX2ZpbGUoUkVQRklMRShvd25lciksIHNwcmludGYoIiVzIHZvbiAlcyBpbiBSYXVtICVkICglcyk6XG4lc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIHR5cCwKKyAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHRoaXNfcGxheWVyKCkpKSwKKyAgICAgICAgICAgICAgICAgICAgIHJhdW1OciwKKyAgICAgICAgICAgICAgICAgICAgIGRhdGUsCisgICAgICAgICAgICAgICAgICAgICBicmVha19zdHJpbmcobXNnLDc4KSkpOworCisgIGlmIChJU19MRUFSTkVSKG93bmVyKSkgeworICAgIGxvZ19maWxlKCJyZXBvcnQvIitvd25lcisiLnJlcCIsCisgICAgICAgICBzcHJpbnRmKCJNRUxEVU5HIHZvbiAlcyBpbSBTZWhlcmhhdXMsIFJhdW0gJWQgKCVzKTpcbiIKKyAgICAgICAgICAgICArIkJpdHRlIHp1ciBLZW5udG5pcyBuZWhtZW4hIChNaXQgZGVtIEJlZmVobCAnbWVsZHVuZ2VuJykgIC1XYXJnb25cbiIsCisgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQodGhpc19wbGF5ZXIoKSkpLAorICAgICAgICAgICAgIHJhdW1OciwKKyAgICAgICAgICAgICBkYXRlKSk7CisgIH0KKworICAvLyBlcmhvZWhlIGltIEhhdXB0cmF1bSBkZW4gUmVwLVphZWhsZXIgdW5kIHNwZWljaGVyZQorICBob21lID0gbG9hZF9vYmplY3QoUkFVTU5BTUUob3duZXIsMCkpOworICBob21lLT5TZXQoSF9SRVBPUlQsIGhvbWUtPlF1ZXJ5KEhfUkVQT1JUKSsxKTsKKyAgaG9tZS0+U2F2ZSgpOworCisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHJlcG9ydChzdHJpbmcgc3RyKQoreworICBzdHJpbmcgcmVwLCAqbGluZXM7CisgIGludCByTnVtLCBsLCBzOworCisgIGlmICghYWxsb3dlZF9jaGVjayh0aGlzX3BsYXllcigpKSkKKyAgICByZXR1cm4gMDsKKworICBpZiAoZmlsZV9zaXplKFJFUEZJTEUob3duZXIpKSA8PSAwKSB7CisgICAgd3JpdGUoICJLZWluZSBNZWxkdW5nZW4genUgZmluZGVuLi4uIER1IGJpc3Qgd3Vuc2NobG9zIGdsdWVja2xpY2guXG4iICk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmVwID0gcmVhZF9maWxlKFJFUEZJTEUob3duZXIpKTsKKworICBpZiAoIXJlcCkgeworICAgIHdyaXRlKCAiT2hhISBEaWUgRGF0ZWkgbWl0IGRlbiBNZWxkdW5nZW4gaXN0IHp1IGdyb3NzISBTYWcgZG9jaCBiaXR0ZSBtYWxcbiIKKyAgICAgICsiV2FyZ29uIEJlc2NoZWlkIVxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBpZiAoc3RyKSB7CisgICAgc3RyaW5nIGQsICpuZXcsICp0bXAsIHByZXY7CisgICAgaW50IG5yLCBuZXh0TnIsIG07CisKKyAgICBpZiAoc3RyID09ICJoaWVyIikKKyAgICAgIHJOdW0gPSByYXVtTnI7CisgICAgZWxzZQorICAgICAgck51bSA9IHRvX2ludChzdHIpOworCisgICAgaWYgKHJOdW0gPiBWRVJXQUxURVItPkhhdXNQcm9wKG93bmVyLCBIUF9ST09NUykpIHsKKyAgICAgIHdyaXRlKCAiU28gdmllbGUgUmFldW1lIGhhc3QgRHUgZ2FyIG5pY2h0IVxuIik7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBsaW5lcyA9IG9sZF9leHBsb2RlKHJlcCwgIlxuIik7CisgICAgcyA9IHNpemVvZihsaW5lcyk7CisgICAgZm9yIChsPTA7IHByZXYgPT0gMDsgbCsrKQorICAgICAgaWYgKHNzY2FuZihsaW5lc1tsXSwgIiVzIHZvbiAlcyBpbiBSYXVtICVkICVzOiIsIGQsIGQsIG5yLCBkKT09NCkKKyAgICBwcmV2PWxpbmVzW2xdOworCisgICAgZm9yICggbmV3ID0gKHt9KSwgdG1wPSh7fSk7IGw8czsgbCsrKSB7CisgICAgICBtPXNzY2FuZihsaW5lc1tsXSwgIiVzIHZvbiAlcyBpbiBSYXVtICVkICVzOiIsIGQsIGQsIG5leHROciwgZCk7CisgICAgICBpZiAobSAhPSA0ICYmIG5yID09IHJOdW0pCisgICAgdG1wICs9ICh7IGxpbmVzW2xdIH0pOworCisgICAgICBpZiAobT09NCkgeworICAgIGlmIChzaXplb2YodG1wKSkgeworICAgICAgbmV3ID0gbmV3ICsgKHsgcHJldiB9KSArIHRtcDsKKyAgICAgIHRtcCA9ICh7fSk7CisgICAgfQorICAgIG5yID0gbmV4dE5yOworICAgIHByZXYgPSBsaW5lc1tsXTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHNpemVvZih0bXApKQorICAgICAgbmV3ID0gbmV3ICsgKHtwcmV2fSkgKyB0bXA7CisgICAgcmVwID0gaW1wbG9kZShuZXcsICJcbiIpOworICB9CisKKyAgdGhpc19wbGF5ZXIoKS0+TW9yZShyZXApOworICByZXR1cm4gMTsKK30KKworLy8gJExvZzogcmF1bS5jLHYgJAorLy8gUmV2aXNpb24gMS41ICAyMDAzLzExLzE1IDE0OjAzOjU4ICBtdWQKKy8vIExpY2h0YWVuZGVydW5nZW4gdm9uIFpvb2sKKy8vCisvLyBSZXZpc2lvbiAxLjQgIDIwMDMvMDIvMTcgMjA6MDA6MDAgIG11ZAorLy8gSW0gUmVzZXQgd2lyZCBudW4gZ2V0ZXN0ZXQsIG9iIGRlciBSYXVtIGVpbmVuIEF1c2dhbmcgaW4gZWluZW4gTnVsbC1SYXVtCisvLyBoYXQuIERpZXMgd3VyZGUgbm90d2VuZ2lnLCBkYW1pdCBTcGllbGVyIG5pY2h0IGluIFNlaGVyaGFldXNlciBlaW5nZXNwZXJydCAKKy8vIHdlcmRlbiBrb2VubmVuLiBEaWUgRnVua3Rpb25lbiBBZGRFeGl0KCksIFJlbW92ZUV4aXQoKSB1bmQgUmVzZXQgc3RhcnRlbiAKKy8vIGdlZ2ViZW5lbmZhbGxzIGRlbiBBdXNnYW5nc3Rlc3QuIEVpbmlnZSBGdW5zIG11c3N0ZW4gbGVpY2h0IGFuZ2VwYXNzdCAKKy8vIHdlcmRlbi4KKy8vIERpZSBGdW5rdGlvbmVuIHJvb21faGFzX2V4aXQoKSB1bmQgaXNfZXhpdCgpIHd1cmRlbiB2b24gVmFyZGlvbkBNRyAKKy8vIGVudHdpY2tlbHQgdW5kIHp1ciBWZXJmdWVndW5nIGdlc3RlbGx0LiAtIFZhbmlvbgorLy8KKy8vIFJldmlzaW9uIDEuMyAgMjAwMS8wMi8wNCAyMToyMTozNCAgbXVkCisvLyAoYnJrLGdldEJlZlBhcmFtKTogVm9ya2VocnVuZ2VuIGdlZ2VuIGZ1ZWhyZW5kZSB1bmQgc2NobGllc3NlbmRlCisvLyBMZWVyemVpY2hlbiBpbiBCZWZlaGxzcGFyYW1ldGVybiB1bmQgYW5kZXJlbiBMaXN0ZW4uCisvLworLy8gUmV2aXNpb24gMS4yICAyMDAxLzAxLzAxIDE4OjE3OjQ3ICBtdWQKKy8vIChhdXNnYW5nKTogV2VubiBlaW4gQXVzZ2FuZyB6dSBlaW5lbSBhbmRlcmVuIFNlaGVyaGF1cyBnZWxlZ3Qgd2lyZCwKKy8vIHdpcmQgZGllIEVybGF1Ym5pcyBpbiBkZXNzZW4gRWluZ2FuZ3NyYXVtIGFiZ2VmcmFndCwgdW5kIG5pY2h0IGluCisvLyBkZW0gYW5nZWZvcmRlcnRlbiBaaWVscmF1bSAoZGVyIEVpbmdhbmdzcmF1bSBleGlzdGllcnQgYXVmIGplZGVuCisvLyBGYWxsLCBkZXIgWmllbHJhdW0gdmllbGxlaWNodCBuaWNodCkuCisvLworLy8gUmV2aXNpb24gMS4xLjEuMSAgMjAwMC8wOC8yMCAyMDoyMjo0MiAgbXVkCisvLyBJbnMgQ1ZTIGVpbmdlY2hlY2t0CisvLworLy8gMDQuMDIuOTggTWVsZHVuZ2VuIGtvZW5uZW4gZ2Vsb2VzY2h0IHdlcmRlbi4KKy8vCisvLyBSZXZpc2lvbiAyLjE2ICAxOTk3LzExLzE1IDE5OjMzOjIzICBXYXJnb24KKy8vIGFycl9vdXQoKSwgcHJlcGFyc2UoKToga2xlaW5lIEJ1Z2ZpeGVzCisvLworLy8gUmV2aXNpb24gMi4xNSAgMTk5Ny8xMC8wNiAxNToyNDozOCAgV2FyZ29uCisvLyBVbnNpY2h0YmFyZSBNYWdpZXIgbWVsZGVuL2FuemVpZ2VuCisvLyBNZWxkdW5nIGJlaW0gQmV0cmV0ZW4gYWJnZXNjaGxvc3NlbmVyIEhhZXVzZXIgZnVlciBNYWdpZXIKKy8vCisvLyBSZXZpc2lvbiAyLjE0ICAxOTk2LzAyLzIxICAxODoxMjo0NyAgV2FyZ29uCisvLyBTbWFydExvZygpIHJlaW4sIGRhZnVlciBkaWUgZWlnZW5lbiBSdWVja21lbGR1bmdzYmVmZWhsZSByYXVzCisvLworLy8gUmV2aXNpb24gMi4xMyAgMTk5NS8xMC8zMSAgMTI6NTY6MTYgIFdhcmdvbgorLy8gUnVlY2ttZWxkdW5nZW4gZnVlciBPYmpla3RlIHdlcmRlbiBhbnMgU3BpZWxlcm9iamVrdCB3ZWl0ZXJnZWdlYmVuLgorLy8KKy8vIFJldmlzaW9uIDIuMTIgIDE5OTUvMDgvMDcgIDE4OjM1OjEyICBXYXJnb24KKy8vIEVpbmlnZSBCdWdzIGJlaSAiYWVuZGVyZSIgYmVob2Jlbi4KKy8vCisvLyBSZXZpc2lvbiAyLjExICAxOTk1LzA2LzI5ICAwODo1NzowNSAgV2FyZ29uCisvLyBIYXVzYmVzaXR6ZXIsIGRpZSBzY2hvbiBNYWdpZXIgc2luZCwgYmVrb21tZW4gYmVpIFJ1ZWNrbWVsZHVuZ2VuIGF1Y2ggZWluZW4KKy8vIEVpbnRyYWcgaW4gaWhyIC9sb2cvcmVwb3J0L3h5ei5yZXAtRmlsZQorLy8gImxpY2h0IGFuL2F1cyIgaXN0IHNlaXQgMi45IGRyaW4gOykKKy8vCisvLyBSZXZpc2lvbiAyLjEwICAxOTk1LzA2LzI4ICAwODo1OTo1NyAgV2FyZ29uCisvLyBOZXVlIEJlZmVobGUgYWVuZGVyZSwgbWVsZHVuZ2VuIGZ1ZXIgZGVuIEhhdXNiZXNpdHplci4KKy8vIHR5cG8sIGJ1Zy9mZWhsZXIsIGlkZWUgd2VyZGVuIGRlbSBIYXVzLS5yZXAtRmlsZSB6dWdlZnVlaHJ0LgorLy8gSmV0enQga29lbm5lbiBkaWUgU2VoZXIgaWhyZSBUeXBvcyBzZWxiZXIgZml4ZW4hIDteKQorLy8KKy8vIFJldmlzaW9uIDIuOSAgMTk5NS8wNi8yMCAgMDc6NDk6MTUgIFdhcmdvbgorLy8gKioqIGVtcHR5IGxvZyBtZXNzYWdlICoqKgorLy8KKy8vIFJldmlzaW9uIDIuOCAgMTk5NS8wNC8yMSAgMTA6NDg6MzkgIFdhcmdvbgorLy8gQnVnZml4IGluIGJlc2NocmVpYmVuKCksIHdlbm4gZGllIEhhdXNhdXNzZW5iZXNjaHJlaWJ1bmcKKy8vIHZlcmxhbmd0IHdpcmQgKHdhciBzY2hvbiBzZWl0IEV3aWdrZWl0ZW4gYnVnZ3kuLi4gOykKKy8vCisvLyBSZXZpc2lvbiAyLjcgIDE5OTUvMDQvMjEgIDA4OjU1OjMyICBXYXJnb24KKy8vIExvYWQoKS9TYXZlKCkgdW5kIGVpZ2VuZSBLb21tYW5kb3MgYXVzZ2VsYWdlcnQuCisvLyBLb21tYW5kb3Mga29lbm5lbiBtaXQgbm90aWZ5X2ZhaWwoKSB2ZXJzZWhlbiB3ZXJkZW4uCisvLworLy8gUmV2aXNpb24gMi42ICAxOTk1LzAzLzA3ICAxMzo1NTozNiAgV2FyZ29uCisvLyBBZGQvUmVtVXNlckNtZCgpLCBCZXNjaHJlaWJ1bmdlbiB3ZXJkZW4gYmVpIHJlc2V0KCkvY2xlYW5fdXAoKQorLy8gZ2VwYWNrdCBnZXNwZWljaGVydC4KKy8vIEJlaSBLb21tYW5kb3MgbnVyIG5vY2ggbW9yZSgpLCB3ZW5uIGVzIGF1Y2ggbm9ldGlnIGlzdC4KKy8vCisvLyBSZXZpc2lvbiAyLjUgIDE5OTUvMDIvMjcgIDIwOjQ4OjI2ICBXYXJnb24KKy8vIEtsZWluZSBTY2hvZW5oZWl0c2ZlaGxlciBpbiBzZWxic3RkZWZpbmllcnRlbiBCZWZlaGxlbiBiZXNlaXRpZ3QuCisvLworLy8gUmV2aXNpb24gMi40ICAxOTk1LzAyLzIyICAyMTozMDo1MiAgV2FyZ29uCisvLyBOb2NoIG1laHIgQWVuZGVydW5nZW4gYW4gZGVuIEJlZmVobGVuOgorLy8gLSBQcmVwYXJzaW5nIGRlciBQbGF0emhhbHRlcgorLy8gLSBQbGF0emhhbHRlciBmdWVyIFBvc3Nlc3NpdnByb25vbWVuCisvLyAtIE1lbGR1bmcgZnVlciBBdXNmdWVocmVuZGVuIHdpcmQgZ2VNb3JlKCl0CisvLyAtIFJhc3Nlbi0gdW5kIEdlc2NobGVjaHRlc3BlemlmaXNjaGUgTWVsZHVuZ2VuIG1vZWdsaWNoCisvLyAtIEF1Y2ggZnVlciBBdXNnYWVuZ2Uga29lbm5lbiBCZWZlaGxlIGRlZmluaWVydCB3ZXJkZW4KKy8vICAgKG51ciBmdWVyIGV4aXN0aWVyZW5kZTsgd2lyZCBkZXIgQXVzZ2FuZyBnZXNwZXJydCwgd2lyZCBhdWNoCisvLyAgIGRlciBCZWZlaGwgZ2Vsb2VzY2h0KQorLy8gSW0gWnVnZSBkZXMgUHJlcGFyc2luZ3MgaGF0IHNpY2ggZGllIEJlZmVobGF1c3dlcnR1bmcgZXR3YXMKKy8vIHZlcmVpbmZhY2h0LgorLy8KKy8vIFJldmlzaW9uIDIuMyAgMTk5NS8wMi8yMCAgMjI6MTU6NDQgIFdhcmdvbgorLy8gUkVBRF9ERVRBSUxTIHdlcmRlbiBqZXR6dCBtaXQgTW9yZSgpIGF1c2dlZ2ViZW4uCisvLyBTZWxic3RkZWZpbmllcnRlIEJlZmVobGU6IG1pdCBAUFdFUiwgLi4uIGtvZW5uZW4gZGllIFBlcnNvbmFscHJvbm9taW5hCisvLyBlaW5nZWJhdXQgd2VyZGVuOyBFaW5iYXUgamV0enQgYXVjaCBpbiBkaWUgTWVsZHVuZyBmdWVyIGRlbiBBdXNsb2VzZXIKKy8vIG1vZWdsaWNoOyBfdW5wYXJzZWRfYXJncygpIGluIGRlciBBdXN3ZXJ0dW5nLgorLy8KKy8vIFJldmlzaW9uIDIuMiAgMTk5NS8wMi8xNSAgMTE6MjM6MDQgIFdhcmdvbgorLy8gTkVVOiBTZWxic3RkZWZpbmllcmJhcmUgQmVmZWhsZS4KKy8vCisvLyBSZXZpc2lvbiAyLjEgIDE5OTUvMDIvMDQgIDE1OjAyOjM2ICBXYXJnb24KKy8vIERpZSBUcnVoZSB3aXJkIG51biB1ZWJlciBkaWUgUHJvcGVydHkgQ0hFU1QgdmVyd2FsdGV0LiBEZXIgQWRkSXRlbSgpLQorLy8gQXVmcnVmIHd1cmRlIGRlc2hhbGIgdm9uIGNyZWF0ZSgpIG5hY2ggTG9hZCgpIHZlcmxlZ3QuIEdlbGFkZW4gd2lyZAorLy8gc2llIG51ciwgd2VubiBkYXMgTG9hZCgpIHZvbiBIYXVzdmVyd2FsdGVyIGVyZm9sZ3RlLgorLy8gY2xlYW5fdXAoKSwgd2VubiBSYXVtIGxlZXIgaXN0IG9kZXIgbnVyIGVpbmUgbGVlcmUgVHJ1aGUgZHJpbiBzdGVodC4KKy8vCisvLyBSZXZpc2lvbiAyLjAgIDE5OTUvMDIvMDEgIDIwOjM2OjQ5ICBXYXJnb24KKy8vIEVudHJ1ZW1wZWx0IHVuZCBNYXNzbmFobWVuIGZ1ZXIgX3VucGFyc2VfYXJncygpIGdldHJvZmZlbi4KKwpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL3JhdW0wLmMgYi9kL3NlaGVyL2hhZXVzZXIvcmF1bTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjgyODE4Ci0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL3JhdW0wLmMKQEAgLTAsMCArMSwxNzMgQEAKKy8vCisvLyAgcmF1bTAuYyAgLS0gRGVyIEVpbmdhbmdzcmF1bSBkZXMgSGF1c2VzCisvLworLy8gIEdydW5kb2JqZWt0IChjKSAxOTk0IEJvaW5nQE1vcmdlbkdyYXVlbgorLy8gIEFic2NobGllc3NlbiB1bmQgUmF1c3dlcmZlbiB2b24gSm9mCisvLyAgRnVlciBBZW5kZXJ1bmdlbiBhYiBkZW0gMDYuMTAuOTQgdmVyYW50d29ydGxpY2g6IFdhcmdvbgorLy8gIEZ1ZXIgQWVuZGVydW5nZW4gYWIgZGVtIDAxLjAxLjA0IHZlcmFudHdvcnRsaWNoOiBWYW5pb24KKy8vCisvLyAkRGF0ZTogMTk5Ni8wMi8yMSAxODoxMzo0MSAkCisvLyAkUmV2aXNpb246IDIuNSAkCisvKiAkTG9nOiByYXVtMC5jLHYgJAorICogUmV2aXNpb24gMi41ICAxOTk2LzAyLzIxICAxODoxMzo0MSAgV2FyZ29uCisgKiAqKiogZW1wdHkgbG9nIG1lc3NhZ2UgKioqCisgKgorICogUmV2aXNpb24gMi40ICAxOTk1LzA2LzI5ICAwODo1NDo1NyAgV2FyZ29uCisgKiBOZXVlciBCZWZlaGw6ICJzcGlvbiIgemVpZ3QsIHdlciB2b3IgZGVyIFR1ZXIgc3RlaHQuCisgKgorICogUmV2aXNpb24gMi4zICAxOTk1LzA2LzI4ICAwODo1OToyNSAgV2FyZ29uCisgKiBpbml0KCkgbWVsZGV0IGRlbSBIYXVzYmVzaXR6ZXIgU3BpZWxlcnJ1ZWNrbWVsZHVuZ2VuLgorICoKKyAqIFJldmlzaW9uIDIuMiAgMTk5NS8wMi8yMiAgMjE6MzA6MTIgIFdhcmdvbgorICogInVlYmVyc2ljaHQiIGpldHp0IGF1Y2ggZnVlciBXYXJnb24gdWViZXJhbGwgbW9lZ2xpY2guIDspCisgKgorICogUmV2aXNpb24gMi4xICAxOTk1LzAyLzA0ICAxNDozMTo0NyAgV2FyZ29uCisgKiBBZGRJdGVtKHRydWhlKSByYXVzZ2Vub21tZW4uIFdpcmQgbnVuIGluIExvYWQoKSBlcmxlZGlndCAoc2llaGUgcmF1bS5jKS4KKyAqCisgKiBSZXZpc2lvbiAyLjAgIDE5OTUvMDIvMDEgIDIwOjM4OjI0ICBXYXJnb24KKyAqIFZvbiByYXVtLmMgYWJnZWtvcHBlbHQuCisgKgorICovCisvKgorTGV0enRlIEFlbmRlcnVuZzogVmFuaW9uLCAyOS4gRmViIDIwMDQKKyAgICAgICAgICAgICAgICAgLSAidWViZXJzaWNodCBlcmxhdWJ0IiB6ZWlndCBudW4gbnVyIGFuLCB3ZXIgZXJsYXVidCBpc3QuCisqLworCisjaW5jbHVkZSAiaGF1cy5oIgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKworaW5oZXJpdCBSQVVNOworCit2b2lkIGNyZWF0ZSgpCit7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpICYmIG9iamVjdF9uYW1lKHRoaXNfb2JqZWN0KCkpPT0oUEFUSCsicmF1bTAiKSkgeworICAgIHNldF9uZXh0X3Jlc2V0KC0xKTsKKyAgICByZXR1cm47CisgIH0KKyAgOjpjcmVhdGUoKTsKKworICBTZXQoSF9SRVBPUlQsIDApOworICBTZXQoSF9SRVBPUlQsIFNBVkUsIEZfTU9ERSk7CisKKyAgQWRkQ21kKCAiZXJsYXViZSIsICJlcmxhdWJlbiIgKTsKKyAgQWRkQ21kKCAidmVyYmlldGUiLCAidmVyYmlldGVuIiApOworICBBZGRDbWQoICJvZWZmbmUiLCAib2VmZm5lIiApOworICBBZGRDbWQoICh7ICJzY2hsaWVzcyIsICJzY2hsaWVzc2UiIH0pLCAic2NobGllc3NlIiApOworICBBZGRDbWQoICJzcGlvbiIsICJzcGlvbiIgKTsKK30KKwordm9pZCBub3RpZnlSZXAoaW50IHIpCit7CisgIHByaW50ZigiU2VpdCBEZWluZW0gbGV0enRlbiBCZXN1Y2ggZ2FiIGVzICVzIFJ1ZWNrbWVsZHVuZyVzIHZvbiBhbmRlcmVuIFNwaWVsZXJuXG5pbiBEZWluZW0gSGF1cy5cbiIsIChyPT0xKSA/ICJlaW5lIiA6IHRvX3N0cmluZyhyKSwgKHI9PTEpID8gIiIgOiAiZW4iKTsKK30KKwordm9pZCBpbml0KCkKK3sKKyAgaW50IHI7CisKKyAgOjppbml0KCk7CisKKyAgaWYgKHRwX293bmVyX2NoZWNrKCkgJiYgcj1RdWVyeShIX1JFUE9SVCkpIHsKKyAgICBjYWxsX291dCgibm90aWZ5UmVwIiwgMCwgcik7CisgICAgU2V0KEhfUkVQT1JULCAwKTsKKyAgICBTYXZlKCk7CisgIH0KK30KKworaW50IG9lZmZuZShzdHJpbmcgc3RyKQoreworICByZXR1cm4gKEhBVVNOQU1FKFF1ZXJ5T3duZXIoKSkpLT5vZWZmbmUoc3RyKTsKK30KKworaW50IHNjaGxpZXNzZShzdHJpbmcgc3RyKQoreworICByZXR1cm4gKEhBVVNOQU1FKFF1ZXJ5T3duZXIoKSkpLT5zY2hsaWVzc2Uoc3RyKTsKK30KKwordmFyYXJncyBpbnQKK3VlYmVyc2ljaHQoc3RyaW5nIHN0ciwgc3RyaW5nIHByZSkKK3sKKyAgaWYgKCAhKHRwX293bmVyX2NoZWNrKCkgfHwgSVNfTUFJTlRBSU5FUih0aGlzX3BsYXllcigpKSkgKQorICAgIHJldHVybiAwOworCisgIHByZSA9ICJcbiIrYXJyX291dChWRVJXQUxURVItPkhhdXNQcm9wKFF1ZXJ5T3duZXIoKSwgSFBfQUxMT1dFRCksCisJICAgICJOdXIgRHUga2FubnN0IERlaW4gSGF1cyBhdWYtIHVuZCBhYnNjaGxpZXNzZW4uXG4iLAorCSAgICAiRHUgdW5kICVzIGtvZW5uZW4gRGVpbiBIYXVzIGF1Zi0gdW5kIGFic2NobGllc3Nlbi5cbiIsCisJICAgICJOZWJlbiBEaXIga29lbm5lbiBub2NoIGZvbGdlbmRlIFBlcnNvbmVuIERlaW4gSGF1cyBhdWYtIHVuZCBhYnNjaGxpZXNzZW46XG4iLCAxICk7CisKKyAgaWYgKHN0cj09ImVybGF1YnQiKQorICB7CisgICAgIHRoaXNfcGxheWVyKCktPk1vcmUocHJlKTsKKyAgICAgcmV0dXJuIDE7CisgIH0KKyAgCisgIHJldHVybiA6OnVlYmVyc2ljaHQoc3RyLCBwcmUpOworfQorCitpbnQKK2VybGF1YmVuKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyAqZXJsYXVidDsKKworICBpZiAoIXRwX293bmVyX2NoZWNrKCkpIHsKKyAgICBub3RpZnlfZmFpbCggIkR1IGthbm5zdCBoaWVyIGdhciBuaWNodHMgZXJsYXViZW4hXG4iICk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoIShzdHI9VVBfQVJHUyh0aGlzX3BsYXllcigpKSkgfHwgc3RyID09ICIiKSB7CisgICAgbm90aWZ5X2ZhaWwoICJXZW0gd2lsbHN0IGRlbm4gZGFzIEF1Zi0gdW5kIEFic2NobGllc3NlbiBEZWluZXMgSGF1c2VzIGVybGF1YmVuP1xuIiApOworICAgIHJldHVybiAwOworICB9CisKKyAgZXJsYXVidCA9IFZFUldBTFRFUi0+RXJsYXViZShRdWVyeU93bmVyKCksCisJCQkgICAgICAgbWFwKChyZWdleHBsb2RlKHN0ciwgIlssIF0iKS0oeyIsIiwiICIsIiJ9KSksICMnY2FwaXRhbGl6ZSkpOworICBhcnJfb3V0KGVybGF1YnQsICJOdXIgRHUga2FubnN0IERlaW4gSGF1cyBhdWYtIHVuZCBhYnNjaGxpZXNzZW4uXG4iLAorCQkgICAiRHUgdW5kICVzIGtvZW5uZW4gRGVpbiBIYXVzIGF1Zi0gdW5kIGFic2NobGllc3Nlbi5cbiIsCisJCSAgICJOZWJlbiBEaXIga29lbm5lbiBub2NoIGZvbGdlbmRlIFBlcnNvbmVuIERlaW4gSGF1cyBhdWYtIHVuZCBhYnNjaGxpZXNzZW46XG4iICk7CisgIHJldHVybiAxOworfQorCitpbnQKK3ZlcmJpZXRlbihzdHJpbmcgc3RyKQoreworICBzdHJpbmcgKmVybGF1YnQ7CisKKyAgaWYgKCF0cF9vd25lcl9jaGVjaygpKSB7CisgICAgbm90aWZ5X2ZhaWwoICJEdSBrYW5uc3QgaGllciBnYXIgbmljaHRzIHZlcmJpZXRlbiFcbiIgKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmICghKHN0cj1VUF9BUkdTKHRoaXNfcGxheWVyKCkpKSB8fCBzdHIgPT0gIiIpIHsKKyAgICBub3RpZnlfZmFpbCggIldlbSB3aWxsc3QgZGVubiBkYXMgQXVmLSB1bmQgQWJzY2hsaWVzc2VuIERlaW5lcyBIYXVzZXMgdmVyYmlldGVuP1xuIiApOworICAgIHJldHVybiAwOworICB9CisgIGVybGF1YnQgPSBWRVJXQUxURVItPlZlcmJpZXRlKFF1ZXJ5T3duZXIoKSwKKwkJCQltYXAoKHJlZ2V4cGxvZGUoc3RyLCAiWywgXSIpLSh7IiwiLCIgIiwiIn0pKSwgIydjYXBpdGFsaXplKSk7CisgIGFycl9vdXQoZXJsYXVidCwgIk51ciBEdSBrYW5uc3QgRGVpbiBIYXVzIGF1Zi0gdW5kIGFic2NobGllc3Nlbi5cbiIsCisJCSAgICJEdSB1bmQgJXMga29lbm5lbiBEZWluIEhhdXMgYXVmLSB1bmQgYWJzY2hsaWVzc2VuLlxuIiwKKwkJICAgIk5lYmVuIERpciBrb2VubmVuIG5vY2ggZm9sZ2VuZGUgUGVyc29uZW4gRGVpbiBIYXVzIGF1Zi0gdW5kIGFic2NobGllc3NlbjpcbiIgKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludAorc3Bpb24oc3RyaW5nIHN0cikKK3sKKyAgb2JqZWN0IGVudiwgKmludjsKKyAgc3RyaW5nIG93OworCisgIG93ID0gUXVlcnlPd25lcigpOworICBzdHIgPSBWRVJXQUxURVItPkhhdXNQcm9wKG93LCBIUF9FTlYpOworICBjYWxsX290aGVyKHN0ciwgIj8/PyIpOworICBlbnYgPSBmaW5kX29iamVjdChzdHIpOworICBpbnYgPSBhbGxfaW52ZW50b3J5KGVudik7CisgIGlmIChlbnYgPSBwcmVzZW50KCJcbiIrb3crImhhdXMiLCBlbnYpKQorICAgIGludiAtPSAoeyBlbnYgfSk7CisgIGlmIChzaXplb2YoaW52KSkKKyAgICBwcmludGYoICJWb3IgZGVtIEhhdXMgc2llaHN0IER1OlxuJXMiLCBtYWtlX2ludmxpc3QodGhpc19wbGF5ZXIoKSwgaW52KSk7CisgIGVsc2UKKyAgICBwcmludGYoICJWb3IgZGVtIEhhdXMgaXN0IG5pY2h0cyB1bmQgbmllbWFuZCB6dSBzZWhlbi5cbiIgKTsKKworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9zYl9hbnRyYWcuYyBiL2Qvc2VoZXIvaGFldXNlci9zYl9hbnRyYWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTZkZDIwCi0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL3NiX2FudHJhZy5jCkBAIC0wLDAgKzEsMTc1IEBACisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgImhhdXMuaCIKKworaW5oZXJpdCAic3RkL3Jvb20iOworCitjcmVhdGUoKQoreworICA6OmNyZWF0ZSgpOworCisgIFNldFByb3AoIFBfSU5ET09SUywgMSApOworICBTZXRQcm9wKCBQX0xJR0hULCAxICk7CisgIFNldFByb3AoIFBfSU5UX1NIT1JULCAiQW0gQW50cmFnc3NjaGFsdGVyIiApOworICBTZXRQcm9wKCBQX0lOVF9MT05HLAorICAgICAiRHUgc3RlaHN0IGFtIEFudHJhZ3NzY2hhbHRlciBkZXIgQmFuay4gSGludGVyIGVpbmVyIFJhdWNoZ2xhc3NjaGVpYmUgc2NoZWludFxuIgorICAgICsic2ljaCBlaW4gU2NoYWx0ZXJiZWFtdGVyIHp1IGJlZmluZGVuLCBEdSBrYW5uc3QgYWJlciBuaWNodHMgZ2VuYXVlcmVzIGVyLVxuIgorICAgICsia2VubmVuLlxuIgorICAgICsiV2VubiBEdSBEaWNoIHRyYXVzdCwga2FubnN0IER1IGhpZXIgZWluZW4gQmF1c3BhcnZlcnRyYWcgYmVhbnRyYWdlbiB1bmQgZWluZW5cbiIKKyAgICArImJlYW50cmFndGVuIFZlcnRyYWcgdW50ZXJzY2hyZWliZW4uXG4iCisgICAgKyJEaWUgU3ludGF4IGRhenUgbGF1dGV0OlxuIgorICAgICsiYmVhbnRyYWdlIHZlcnRyYWcgKGZ1ZXIgZWluZW4gQmF1c3BhcnZlcnRyYWcpXG4iCisgICAgKyJiZWFudHJhZ2UgYXVzYmF1dmVydHJhZyAoZnVlciBkZW4gQXVzYmF1IGRlcyBIYXVzZXMpXG4iCisgICAgKyJ1bnRlcnNjaHJlaWJlIHZlcnRyYWcgKHVtIGRlbiBqZXdlaWxpZ2VuIFZlcnRyYWcgenUgdW50ZXJzY2hyZWliZW4pXG4iICk7CisKKyAgQWRkRGV0YWlsKCAoeyAiYm9kZW4iIH0pLAorICAgICAiRGVyIHRpZWZzY2h3YXJ6ZSBCb2RlbiBnaWJ0IERpciBkYXMgR2VmdWVobCwgaW0gYWJzb2x1dGVuIE5pY2h0cyB6dSBzdGVoZW4uXG4iICk7CisgIEFkZERldGFpbCggKHsgIndhbmQiLCAid2FlbmRlIiB9KSwKKyAgICAgIkR1bmtsZSBTY2hhdHRlbiB0YW56ZW4gdWViZXIgZGllIFdhZW5kZS5cbiIgKTsKKyAgQWRkRGV0YWlsKCAoeyAiZGVja2UiIH0pLAorICAgICAiU2llIHNjaGVpbnQgRGlyIGluIGRpZXNlciB1bmhlaW1saWNoZW4gVW1nZWJ1bmcgYXVmIGRlbiBLb3BmIGZhbGxlbiB6dVxuIgorICAgICsid29sbGVuLlxuIiApOworICBBZGREZXRhaWwoICh7ICJuaWNodHMiIH0pLAorICAgICAiRHUgc2llaHN0IG5pY2h0cy5cbiIgKTsKKyAgQWRkRGV0YWlsKCAoeyAic2NoYXR0ZW4iIH0pLAorICAgICAiRGllIFNjaGF0dGVuIGlycml0aWVyZW4gRGljaCBzZWhyLlxuIiApOworICBBZGREZXRhaWwoICh7ICJzY2hhbHRlciIgfSksCisgICAgICJBbiBkaWVzZW0gU2NoYWx0ZXIga2FubnN0IER1IGVpbmVuIEJhdXNwYXJ2ZXJ0cmFnIGJlYW50cmFnZW4gdW5kIHVudGVyLVxuIgorICAgICsic2NocmVpYmVuLlxuIiApOworICBBZGREZXRhaWwoICh7ICJiZWFtdGUiLCAiYmVhbXRlciIsICJiZWFtdGVuIiwgInNjaGFsdGVyYmVhbXRlIiwgInNjaGFsdGVyYmVhbXRlbiIsICJzY2hhbHRlcmJlYW10ZXIiIH0pLAorICAgICAiRHUga2FubnN0IGlobiBudXIgc2NoZW1lbmhhZnQgaGludGVyIGRlciBSYXVjaGdsYXNzY2hlaWJlIGRlcyBTY2hhbHRlcnMgZXItXG4iCisgICAgKyJrZW5uZW4uIERpZSBVbXJpc3NlIHNjaGVpbmVuIGFsbGVyZGluZ3MgenUga2VpbmVyIExlYmVuc2Zvcm0genUgZ2Vob2VyZW4sXG4iCisgICAgKyJkZXJlciBEdSBEaWNoIGVyaW5uZXJuIGtvZW5udGVzdC5cbiIgKTsKKyAgQWRkRGV0YWlsKCAoeyAic2NoZWliZSIsICJnbGFzc2NoZWliZSIsICJyYXVjaGdsYXMiLCAicmF1Y2hnbGFzc2NoZWliZSIgfSksCisgICAgICJFaW4gc2NoZW1lbmhhZnRlciBCZWFtdGVyIHNpdHp0IGRhaGludGVyLlxuIiApOworICBBZGREZXRhaWwoICh7ICJ1bXJpc3NlIiB9KSwKKyAgICAgIlNpZSBzaW5kIGFldXNzZXJzdCBiZXVucnVoaWdlbmQuXG4iICk7CisKKyAgQWRkQ21kKCAoeyAiYmVhbnRyYWdlIiB9KSwgImJlYW50cmFnZW4iICk7CisgIEFkZENtZCggKHsgInVudGVyc2NocmVpYiIsICJ1bnRlcnNjaHJlaWJlIiB9KSwgInVudGVyc2NocmVpYmVuIiApOworICBBZGRFeGl0KCAicmF1cyIsIFBBVEgrInNlaGVyYmFuayIgKTsKK30KKwordm9pZAorQmVjb21lc05ldERlYWQob2JqZWN0IHBsKQoreworICBwbC0+bW92ZShQQVRIKyJzZWhlcmJhbmsiLCBNX0dPLCAwLCAid2lyZCByYXVzZ2V3b3JmZW4iLCAic2NobGFmd2FuZGVsdCBoZXJlaW4iKTsKK30KKworaW50CitiZWFudHJhZ2VuKHN0cmluZyBzdHIpCit7CisgIG9iamVjdCB0cCwgdmVydHJhZzsKKyAgaW50IGhhdXM7CisKKyAgdHAgPSB0aGlzX3BsYXllcigpOworCisgIGlmICghc3RyIHx8IChoYXVzID0gbWVtYmVyKCAoeyJhdXNiYXV2ZXJ0cmFnIiwgInZlcnRyYWciLCAiYmF1c3BhcnZlcnRyYWcifSksIHN0cikpIDwwKSB7CisgICAgbm90aWZ5X2ZhaWwoICJWZXJzdWNoIG1hbCAnYmVhbnRyYWdlIHZlcnRyYWcnIVxuIiApOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKCFJU19TRUVSKHRwKSkgeworICAgIG5vdGlmeV9mYWlsKCAiTnVyIFNlaGVyIGtvZW5uZW4gZWluZW4gQmF1c3BhcnZlcnRyYWcgYmVhbnRyYWdlbiFcbiIgKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAodHAtPlF1ZXJ5UHJvcChQX0tJTExTKSkgeworICAgIHdyaXRlKCJWZXJicmVjaGVyIHdlcmRlbiBoaWVyIG5pY2h0IGJlZGllbnQhXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAodmVydHJhZyA9IHByZXNlbnQoInNlaGVccnZlcnRyYWciLCB0cCkpCisgICAgd3JpdGUoICJEZXIgQmVhbXRlIHNjaG5hcnJ0OiBBYmVyIFNpZSBoYWJlbiBkb2NoIHNjaG9uIGVpbmVuIFZlcnRyYWchXG4iICk7CisgIGVsc2UgaWYgKGhhdXMgJiYgKHByZXNlbnQoInNlaGVccmhhdXMiLCB0cCkgfHwgVkVSV0FMVEVSLT5GaW5kZUhhdXMoZ2V0dWlkKHRwKSkpKSB7CisgICAgd3JpdGUoICJEZXIgQmVhbXRlIHNjaG5hcnJ0OiBTaWUgZHVlcmZlbiBudXIgRUlOIEhhdXMgYmVzaXR6ZW4hXG4iICk7CisgICAgSExPRyggIkJBTksuTE9HIiwgIkFudHJhZzogIitnZXR1aWQodHApKyIgc3RlbGx0ZSB6d2VpdGVuIEFudHJhZy5cbiIgKTsKKyAgfQorICBlbHNlIGlmICghaGF1cyAmJiAhVkVSV0FMVEVSLT5GaW5kZUhhdXMoZ2V0dWlkKHRwKSkpIHsKKyAgICB3cml0ZSggIkRlciBCZWFtdGUgZmF1Y2h0OiBIYWJlbiBzaWUgZGVubiB1ZWJlcmhhdXB0IHNjaG9uIGVpbiBIYXVzIGF1Zmdlc3RlbGx0P1xuIgorCSAgKyJWb3JoZXIga29lbm5lbiBzaWUgbmF0dWVybGljaCBrZWluZSBFcndlaXRlcnVuZ2VuIGJlYW50cmFnZW4hXG4iICk7CisgIH0KKyAgZWxzZSB7CisgICAgaWYgKCFoYXVzICYmIFZFUldBTFRFUi0+SGF1c1Byb3AoZ2V0dWlkKHRwKSxIUF9ST09NUykgPT0gOSkgeworICAgICAgd3JpdGUoICJEZXIgQmVhbXRlIGRyb2VobnQ6IElociBIYXVzIGhhdCBzY2hvbiBkaWUgaG9lY2hzdGUgQXVzYmF1c3R1ZmUgZXJyZWljaHQhXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICAodmVydHJhZyA9IGNsb25lX29iamVjdChQQVRIKyJiYXVzcGFydmVydHJhZyIpKS0+bW92ZSh0cCwgTV9OT0NIRUNLKTsKKworICAgIHdyaXRlKCAiRGllIFNjaGF0dGVuIHZlcmRpY2h0ZW4gc2ljaCB6dSBlaW5lbSBCbGF0dCBQYXBpZXIsIHdlbGNoZXMgaW4gRGVpbmUgSGFlbmRlXG4iCisJICArImdld2VodCB3aXJkLiBNaXQgZHJvZWhuZW5kZXIgU3RpbW1lIGVya2xhZXJ0IGRlciBTY2hhbHRlcmJlYW10ZTpcbiIKKwkgICsiRGllcyBpc3QgSWhyIEJhdXNwYXJ2ZXJ0cmFnLiBCaXR0ZSBsZXNlbiBTaWUgaWhuIHNpY2ggZ3J1ZW5kbGljaCBkdXJjaCwgYmUtXG4iCisJICArInZvciBTaWUgaWhuIHVudGVyc2NocmVpYmVuISBXZW5uIFNpZSBpaG4gZXJzdCBlaW5tYWwgdW50ZXJzY2hyaWViZW4gaGFiZW4sXG4iCisJICArImtvZW5uZW4gc2llIG5pY2h0IHdpZWRlciBkYXZvbiB6dXJ1ZWNrdHJldGVuIChlcyBzZWkgZGVubiwgU2llIHplcnJlaXNzZW5cbiIKKwkgICsiaWhuIG9kZXIgdWViZXJ6aWVoZW4gZGllIFJhdGVuemFobHVuZ2VuKSEgU2llIHNpbmQgbmljaHQgZ2V6d3VuZ2VuLCBkZW4gVmVyLVxuIgorCSAgKyJ0cmFnIHNvZm9ydCB6dSB1bnRlcnNjaHJlaWJlbi4gSW0gSGF1cHRyYXVtIGRlciBCYW5rIGJlZmluZGV0IHNpY2ggZWluIEluLVxuIgorCSAgKyJmb3JtYXRpb25zc3RhbmQsIGFuIGRlbSBTaWUgS29tbWVudGFyZSB6dSBkaWVzZW0gVmVydHJhZyBrYWV1ZmxpY2ggZXJ3ZXJiZW5cbiIKKwkgICsia29lbm5lbi4gV2VubiBJaG5lbiBlaW5pZ2UgUGFzc2FnZW4gZGVzIFZlcnRyYWdzIHVudmVyc3RhZW5kbGljaCBzaW5kLCB3aXJkXG4iCisJICArIklobmVuIGluIGRlbiBLb21tZW50YXJlbiBzaWNoZXJsaWNoIGdlaG9sZmVuLlxuIgorCSAgKyJEYXMgTGVpc3RlbiBkZXIgVW50ZXJzY2hyaWZ0IGlzdCBqZWRvY2ggbnVyIGhpZXIgYW4gZGllc2VtIFNjaGFsdGVyXG4iCisJICArIm1vZWdsaWNoIVxuIiApOworICAgIGlmICghaGF1cykKKyAgICAgIHZlcnRyYWctPlNpZ24oVl9SQVVNKTsKKyAgICBITE9HKCAiQkFOSy5MT0ciLCAiQW50cmFnOiAiK2dldHVpZCh0cCkrIiBiZWthbSBlaW5lbiAiKyhoYXVzID8gIkhhdXMiIDogIlJhdW0iKSsidmVydHJhZy5cbiIgKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworaW50Cit1bnRlcnNjaHJlaWJlbihzdHJpbmcgc3RyKQoreworICBvYmplY3QgdHAsIHZlcnRyYWc7CisgIGludCBmbGFnOworCisgIHRwID0gdGhpc19wbGF5ZXIoKTsKKworICBub3RpZnlfZmFpbCggIldhcyB3aWxsc3QgRHUgZGVubiB1bnRlcnNjaHJlaWJlbj9cbiIgKTsKKyAgaWYgKCFzdHIgfHwgISh2ZXJ0cmFnID0gcHJlc2VudChzdHIsIHRwKSkgfHwgIXZlcnRyYWctPmlkKCJzZWhlXHJ2ZXJ0cmFnIikpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKChmbGFnID0gdmVydHJhZy0+UXVlcnlQcm9wKFBfQVVUT0xPQURPQkopWzFdKSAmIFZfU0lHTkVEKSB7CisgICAgd3JpdGUoICJEZXIgU2NoYWx0ZXJiZWFtdGUgc2FndDogQWJlciBkZXIgVmVydHJhZyBpc3QgZG9jaCBzY2hvbiB1bnRlcnNjaHJpZWJlbiFcbiIgKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHdyaXRlKCAiRGVyIFNjaGFsdGVyYmVhbXRlIHNhZ3Q6IEZ1ZXIgd2VsY2hlIFZlcnRyYWdzdmFyaWFudGUgaGFiZW4gc2llIHNpY2hcbiIKKwkrImVudHNjaGllZGVuPyBUaXBwZW4gU2llICdzYW5mdCcgZnVlciBkZW4gc2FuZnRlbiBXZWcgenVtIGVpZ2VuZW4gSGVpbVxuIgorCSsib2RlciAnc2NobmVsbCcgZnVlciBkZW4gc2NobmVsbGVuIFdlZy5cbl0gIiApOworICBpbnB1dF90bygic2lnbiIsIDAsIHZlcnRyYWcsIGZsYWd8Vl9FUCk7CisgIHJldHVybiAxOworfQorCit2b2lkCitzaWduKHN0cmluZyBzdHIsIG9iamVjdCB2ZXJ0cmFnLCBpbnQgZmxhZykKK3sKKyAgb2JqZWN0IGJsb2NrOworICBzdHJpbmcgczsKKyAgaW50ICphbDsKKworICBpZiAoc3RyID09ICJzYW5mdCIgfHwgc3RyID09ICJzY2huZWxsIikgeworICAgIHdyaXRlKCAiRGVyIFNjaGFsdGVyYmVhbXRlIGdpYnQgRGlyIGVpbmVuIEZ1ZWxsZmVkZXJoYWx0ZXIgc293aWUgZWluIFNrYWxwZWxsLlxuIgorCSAgKyJTY2h3dW5ndm9sbCBzZXR6dCBEdSBEZWluZSBVbnRlcnNjaHJpZnQgdW50ZXIgZGVuIFZlcnRyYWcuIERhbm4gcGlla3N0XG4iCisJICArIkR1IERpciBtaXQgZGVtIFNrYWxwZWxsIGluIGRlbiBGaW5nZXIgdW5kIGJlc3RhZXRpZ3N0IGRpZSBVbnRlcnNjaHJpZnRcbiIKKwkgICsibWl0IGVpbmVtIGR1bmtsZW4gVHJvcGZlbiBEZWluZXMgQmx1dGVzLlxuIgorCSAgKyJQbG9ldHpsaWNoIHp1Y2tlbiBCbGl0emUgdW0gRGljaCBoZXJ1bSBhdWYsIHVuZCBkZXIgU2NoYWx0ZXJiZWFtdGUgbGFjaHRcbiIKKwkgICsiZHJvZWhuZW5kIGF1Zi4gRHUgaGFzdCBkYXMgR2VmdWVobCwgZGFzcyBoaWVyIGV0d2FzIG5pY2h0IGdhbnogbWl0IHJlY2h0ZW5cbiIKKwkgICsiRGluZ2VuIHZvciBzaWNoIGdlaHQuIERhbm4gYmVzdGFldGlndCBkZXIgQmVhbXRlIGRpZSBVbnRlcnNjaHJpZnQgdW5kXG4iCisJICArInVlYmVyZ2lidCBEaXIgZGVuIGVyc3RlbiBCbG9jaywgYXVmIGRlbSBEZWluZSBSYXRlbiB2ZXJtZXJrdCB3ZXJkZW4uXG4iCisJICArIkRlciBCZWFtdGUgZXJrbGFlcnQ6IERhbWl0IGF1ZiBkZW4gQmxvY2sgYXVjaCBlaW5nZXphaGx0IHdpcmQsIG11c3MgbWFuXG4iCisJICArImlobiB3aWUgZWluZSBSdWVzdHVuZyBhbnppZWhlbiFcbiIgKTsKKworICAgIHRoaXNfcGxheWVyKCktPnJlZHVjZV9oaXRfcG9pbnRzKDUwKTsKKyAgICB2ZXJ0cmFnLT5TaWduKGZsYWcgfCAoc3RyID09ICJzYW5mdCIgPyBWX1NJR05FRCA6IFZfU0lHTkVEIHwgVl9GQVNUKSk7CisgICAgKGJsb2NrID0gY2xvbmVfb2JqZWN0KFBBVEgrImJsb2NrIikpLT5tb3ZlKHRoaXNfcGxheWVyKCksIE1fTk9DSEVDSyk7CisgICAgYmxvY2stPlNldFByb3AoInNjaHdlciIsIFZfRkFTVCAmIHZlcnRyYWctPlF1ZXJ5UHJvcChQX0FVVE9MT0FET0JKKVsxXSk7CisgICAgYWwgPSBibG9jay0+UXVlcnlQcm9wKFBfQVVUT0xPQURPQkopOworICAgIGFsW1ZfRkxBR1NdIHw9IEJfQUNUSVZFOworICAgIGJsb2NrLT5TZXRQcm9wKFBfQVVUT0xPQURPQkosIGFsKTsKKyAgICBzID0gIkFudHJhZzogIitnZXR1aWQodGhpc19wbGF5ZXIoKSkrIiB1bnRlcnNjaHJpZWIgZGVuIFZlcnRyYWcgKCIrc3RyKyIpLlxuIjsKKyAgICBITE9HKCAiQkFOSy5MT0ciLCBzICk7CisgICAgSExPRyggZ2V0dWlkKHRoaXNfcGxheWVyKCkpLCBzICk7CisgIH0KKyAgZWxzZSB7CisgICAgd3JpdGUoICJEZXIgU2NoYWx0ZXJiZWFtdGUgc2FndDogTnVyICdzYW5mdCcgb2RlciAnc2NobmVsbCcsIGJpdHRlIVxuIiApOworICAgIGlucHV0X3RvKCJzaWduIiwgMCwgdmVydHJhZywgZmxhZyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9zYl9hdXNnYWJlLmMgYi9kL3NlaGVyL2hhZXVzZXIvc2JfYXVzZ2FiZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZWQyMTkKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvc2JfYXVzZ2FiZS5jCkBAIC0wLDAgKzEsMTE1IEBACisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPGJhbmsuaD4KKyNpbmNsdWRlICJoYXVzLmgiCisKK2luaGVyaXQgInN0ZC9yb29tIjsKKworY3JlYXRlKCkKK3sKKyAgOjpjcmVhdGUoKTsKKworICBTZXRQcm9wKFBfSU5ET09SUywgMSk7CisgIFNldFByb3AoUF9MSUdIVCwgMSk7CisgIFNldFByb3AoUF9JTlRfU0hPUlQsICJBbSBBdXNnYWJlc2NoYWx0ZXIiICk7CisgIFNldFByb3AoUF9JTlRfTE9ORywKKyAgICAgIkFtIEF1c2dhYmVzY2hhbHRlci4gV2VubiBEdSBhbGxlIFJhdGVuIGZ1ZXIgRGVpbmVuIFZlcnRyYWcgZWluZ2V6YWhsdCBoYXN0LFxuIgorICAgICsia2FubnN0IER1IG51biBEZWluIEhhdXMgYWJob2xlbi4gRGF6dSBtdXNzdCBEdSBlaW5mYWNoIG51ciBEZWluZW4gVmVydHJhZ1xuIgorICAgICsidm9ybGVnZW4gKG1pdCAnbGVnZSB2ZXJ0cmFnIHZvcicpLlxuIgorICAgICsiRGVyIFNjaGVtZW4gYW0gU2NoYWx0ZXIga29lbm50ZSBlaW4gQmVhbXRlciBzZWluLCBhYmVyIGF1Y2ggZXR3YXMgdmllbCwgdmllbFxuIgorICAgICsiU2NobGltbWVyZXMuLi5cbiIgKTsKKworICBBZGREZXRhaWwoICh7ICJib2RlbiIgfSksCisgICAgICJEZXIgdGllZnNjaHdhcnplIEJvZGVuIGdpYnQgRGlyIGRhcyBHZWZ1ZWhsLCBpbSBhYnNvbHV0ZW4gTmljaHRzIHp1IHN0ZWhlbi5cbiIgKTsKKyAgQWRkRGV0YWlsKCAoeyAid2FuZCIsICJ3YWVuZGUiIH0pLAorICAgICAiRHVua2xlIFNjaGF0dGVuIHRhbnplbiB1ZWJlciBkaWUgV2FlbmRlLlxuIiApOworICBBZGREZXRhaWwoICh7ICJkZWNrZSIgfSksCisgICAgICJTaWUgc2NoZWludCBEaXIgaW4gZGllc2VyIHVuaGVpbWxpY2hlbiBVbWdlYnVuZyBhdWYgZGVuIEtvcGYgZmFsbGVuIHp1XG4iCisgICAgKyJ3b2xsZW4uXG4iICk7CisgIEFkZERldGFpbCggKHsgIm5pY2h0cyIgfSksCisgICAgICJEdSBzaWVoc3QgbmljaHRzLlxuIiApOworICBBZGREZXRhaWwoICh7ICJzY2hhdHRlbiIgfSksCisgICAgICJEaWUgU2NoYXR0ZW4gaXJyaXRpZXJlbiBEaWNoIHNlaHIuXG4iICk7CisgIEFkZERldGFpbCggKHsgInNjaGFsdGVyIiwgImF1c2dhYmVzY2hhbHRlciIgfSksCisgICAgICJEdSBzdGVoc3QgZGlyZWt0IHZvciBkZW0gQXVzZ2FiZXNjaGFsdGVyLlxuIiApOworICBBZGREZXRhaWwoICh7ICJiZWFtdGUiLCAiYmVhbXRlciIsICJiZWFtdGVuIiwgInNjaGFsdGVyYmVhbXRlciIsICJzY2hhbHRlcmJlYW10ZSIsICJzY2hhbHRlcmJlYW10ZW4iLCAic2NoZW1lbiIsICJzY2hsaW1tZXJlcyIgfSksCisgICAgICJEZXIgU2NoYWx0ZXJiZWFtdGUgc2NoYXV0IERpY2ggbWl0IGF1Zmdlc2V0enRlbSBMYWVjaGVsbiBhbi5cbiIgKTsKKworICBBZGRDbWQoICh7ICJsZWciLCAibGVnZSIgfSksICJsZWdlbiIgKTsKKyAgQWRkRXhpdCggInJhdXMiLCBQQVRIKyJzZWhlcmJhbmsiICk7Cit9CisKK3ZvaWQKK0JlY29tZXNOZXREZWFkKG9iamVjdCBwbCkKK3sKKyAgcGwtPm1vdmUoUEFUSCsic2VoZXJiYW5rIiwgTV9HTywgMCwgIndpcmQgcmF1c2dld29yZmVuIiwgInNjaGxhZndhbmRlbHQgaGVyZWluIik7Cit9CisKK2ludAorbGVnZW4oc3RyaW5nIHN0cikKK3sKKyAgb2JqZWN0IHZlcnRyYWcsIHRwOworCisgIHRwID0gdGhpc19wbGF5ZXIoKTsKKyAgdmVydHJhZyA9IHByZXNlbnQoInNlaGVccnZlcnRyYWciLCB0cCk7CisKKyAgaWYgKCFzdHIgfHwgc3RyICE9ICJ2ZXJ0cmFnIHZvciIpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKCFJU19TRUVSKHRwKSkgeworICAgIHdyaXRlKCAiRGVyIFNjaGFsdGVyYmVhbXRlIGJsaWNrdCBEaWNoIHNjaGFyZiBhbi4gRXIgc2FndDogTnVyIFNlaGVySW5uZW5cbiIKKwkgICsia29lbm5lbiBoaWVyIGVpbiBIYXVzIGFiaG9sZW4hXG4iICk7CisgICAgSExPRyggIkJBTksuTE9HIiwgIkF1c2dhYmU6ICIrZ2V0dWlkKHRwKSsiIGlzdCBrZWluIFNlaGVyLlxuIiApOworICB9CisgIGVsc2UgaWYgKHRwLT5RdWVyeVByb3AoUF9LSUxMUykpCisgICAgd3JpdGUoICJEZXIgU2NoZW1lbiBmYXVjaHQ6IFZlcmJyZWNoZXIgd2VyZGVuIGhpZXIgbmljaHQgYmVkaWVudCFcbiIgKTsKKyAgZWxzZSBpZiAoIXZlcnRyYWcpIHsKKyAgICB3cml0ZSggIkRlciBTY2hlbWVuIGJlbWVya3Q6IFNpZSBoYWJlbiBkb2NoIGdhciBrZWluZW4gVmVydHJhZyFcbiIgKTsKKyAgICBITE9HKCAiQkFOSy5MT0ciLCAiQXVzZ2FiZTogIitnZXR1aWQodHApKyIgaGF0dGUga2VpbmVuIFZldHJhZy5cbiIgKTsKKyAgfQorICBlbHNlIGlmIChvbGRfZXhwbG9kZShvYmplY3RfbmFtZSh2ZXJ0cmFnKSwiIyIpWzBdICE9IFBBVEgrImJhdXNwYXJ2ZXJ0cmFnIikgeworICAgIEhMT0coICJCQU5LLkxPRyIsICJBdXNnYWJlOiAiK2dldHVpZCh0cCkrIiBGYWxzY2hlciBWZXJ0cmFnIVxuIik7CisgICAgSExPRyggIlNDSFVNTUVMIiwgc3ByaW50ZigiQXVzZ2FiZTogVFA6ICVPLCBWOiAlT1xuIiwKKwkJICAgICAgdGhpc19wbGF5ZXIoKSwKKwkJICAgICAgdmVydHJhZy0+UXVlcnlQcm9wKFBfQ0xPTkVSKSkpOworICB9CisgIGVsc2UgaWYgKCEodmVydHJhZy0+UXVlcnlQcm9wKFBfQVVUT0xPQURPQkopWzFdICYgVl9DT01QTCkpIHsKKyAgICB3cml0ZSggIkRlciBTY2hhbHRlcmJlYW10ZSB3ZWlzdCBEaWNoIGRhcmF1ZiBoaW4sIGRhc3MgRHUgbm9jaCBuaWNodCBnZW51Z1xuIgorCSAgKyJhdWYgZGVuIFZlcnRyYWcgZWluZ2V6YWhsdCBoYXN0IVxuIiApOworICAgIEhMT0coICJCQU5LLkxPRyIsICJBdXNnYWJlOiAiK2dldHVpZCh0cCkrIiBoYXR0ZSB6dSB3ZW5pZyBlaW5nZXphaGx0LlxuIiApOworICB9CisgIGVsc2UgaWYgKFpFTlRSQUxCQU5LLT5fcXVlcnlfY3VycmVudF9tb25leSgpIDwgMzAwMDApIHsKKyAgICB3cml0ZSggIkRlciBTY2hhbHRlcmJlYW10ZSB3ZWlzdCBEaWNoIGRhcmF1ZiBoaW4sIGRhc3MgZGllIFplbnRyYWxiYW5rIGltXG4iCisJICArIk1vbWVudCBsZWlkZXIgbmljaHQgdWViZXIgZ2VudWcgQmFyZ2VsZHJlc2VydmVuIHZlcmZ1ZWd0LCB1bSBpaHJlblxuIgorCSAgKyJUZWlsIGRlciBBYm1hY2h1bmcgenUgZXJmdWVsbGVuLiBFciB2ZXJ0cm9lc3RldCBEaWNoIGF1ZiBzcGFldGVyLlxuIiApOworICB9CisgIGVsc2UgaWYgKHZlcnRyYWctPlF1ZXJ5UHJvcChQX0FVVE9MT0FET0JKKVsxXSAmIFZfUkFVTSkgeworICAgIFZFUldBTFRFUi0+TmV1ZXJSYXVtKGdldHVpZCh0aGlzX3BsYXllcigpKSk7CisgICAgd3JpdGUoICJEZXIgU2NoZW1lbiBoaW50ZXIgZGVtIFNjaGFsdGVyIHN0cmVja3QgZWluZW4gbGFuZ2VuLCBzY2hhdHRpZ2VuIEZpbmdlclxuIgorCSAgKyJuYWNoIERlaW5lbSBWZXJ0cmFnIGF1cy4gV2llIHZvbiBHZWlzdGVyaGFuZCBiZXdlZ3QgZ2xlaXRldCBkZXIgVmVydHJhZ1xuIgorCSAgKyJoaW51ZWJlci4gRGVyIFNjaGVtZW4gc2NoZWludCBkZW4gVmVydHJhZyBhdXNnaWViaWcgenUgcHJ1ZWZlbiwgZGFublxuIgorCSAgKyJ6ZXJyZWlzc3QgZXIgaWhuLCB3ZWRlbHQgZWlubWFsIG1pdCBzZWluZW4gc2NoYXR0ZW5oYWZ0ZW4gSGFlbmRlbiB1bmRcbiIKKwkgICsiYmVnaW5udCBtaXQgR3JhYmVzc3RpbW1lIHp1IHNwcmVjaGVuOlxuIgorCSAgKyJEZXIgbmV1ZSBSYXVtIGlzdCBpbiBpaHJlbSBIYXVzIGluc3RhbGxpZXJ0ISBIaW5mb3J0IG1pdCBJaG5lbiFcbiIgKTsKKyAgICBITE9HKCAiQkFOSy5MT0ciLCAiQXVzZ2FiZTogIitnZXR1aWQodHApKyIgYmVrYW0gZWluZW4gbmV1ZW4gUmF1bS5cbiIgKTsKKyAgICBITE9HKCBnZXR1aWQodHApLCAiQXVzZ2FiZTogIitnZXR1aWQodHApKyIgYmVrYW0gZWluZW4gbmV1ZW4gUmF1bS5cbiIgKTsKKyAgICAiL3AvZGFlbW9uL3plbnRyYWxiYW5rIi0+V2l0aERyYXcoMzAwMDApOworICAgIHZlcnRyYWctPnJlbW92ZSgpOworICB9CisgIGVsc2UgeworICAgIHdyaXRlKCAiRGVyIFNjaGVtZW4gaGludGVyIGRlbSBTY2hhbHRlciBzdHJlY2t0IGVpbmVuIGxhbmdlbiwgc2NoYXR0aWdlbiBGaW5nZXJcbiIKKwkgICsibmFjaCBEZWluZW0gVmVydHJhZyBhdXMuIFdpZSB2b24gR2Vpc3RlcmhhbmQgYmV3ZWd0IGdsZWl0ZXQgZGVyIFZlcnRyYWdcbiIKKwkgICsiaGludWViZXIuIERlciBTY2hlbWVuIHNjaGVpbnQgZGVuIFZlcnRyYWcgYXVzZ2llYmlnIHp1IHBydWVmZW4sIGRhbm5cbiIKKwkgICsiemVycmVpc3N0IGVyIGlobiwgd2VkZWx0IGVpbm1hbCBtaXQgc2VpbmVuIHNjaGF0dGVuaGFmdGVuIEhhZW5kZW4gdW5kXG4iCisJICArInZvciBEaXIgZXJzY2hlaW50IGVpbiBrbGVpbmVzLCB0cmFnYmFyZXMgSGF1cy4gWm9lZ2VybmQgbmltbXN0IER1IGVzIGluXG4iCisJICArIkRlaW5lIEhhZW5kZSwgZGEgZXJzY2hhbGx0IGVpbmUgZ3JvbGxlbmRlIFN0aW1tZTpcbiIKKwkgICsiRGFzIEhhdXMgZ2Vob2VydCBJaG5lbi4gQmVlaHJlbiBzaWUgdW5zIGJhbGQgd2llZGVyISBIYXIsIGhhciwgaGFyISEhXG4iICk7CisgICAgY2xvbmVfb2JqZWN0KFBBVEgrInRyYWdoYXVzIiktPm1vdmUodHAsIE1fTk9DSEVDSyk7CisgICAgSExPRyggIkJBTksuTE9HIiwgIkF1c2dhYmU6ICIrZ2V0dWlkKHRwKSsiIGJla2FtIGRhcyBIYXVzLlxuIiApOworICAgIEhMT0coIGdldHVpZCh0cCksICJBdXNnYWJlOiAiK2dldHVpZCh0cCkrIiBiZWthbSBkYXMgSGF1cy5cbiIgKTsKKyAgICAiL3AvZGFlbW9uL3plbnRyYWxiYW5rIi0+V2l0aERyYXcoMzAwMDApOworICAgIHZlcnRyYWctPnJlbW92ZSgpOworICB9CisgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL3NiX2VpbnphaGx1bmcuYyBiL2Qvc2VoZXIvaGFldXNlci9zYl9laW56YWhsdW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY4OTE5NgotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci9zYl9laW56YWhsdW5nLmMKQEAgLTAsMCArMSwxMzAgQEAKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8bW92aW5nLmg+CisjaW5jbHVkZSAiaGF1cy5oIgorCitpbmhlcml0ICJzdGQvcm9vbSI7CisKK2NyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7CisKKyAgU2V0UHJvcCggUF9JTkRPT1JTLCAxICk7CisgIFNldFByb3AoIFBfTElHSFQsIDEgKTsKKyAgU2V0UHJvcCggUF9JTlRfU0hPUlQsICJBbSBFaW56YWhsdW5nc3NjaGFsdGVyIiApOworICBTZXRQcm9wKCBQX0lOVF9MT05HLAorICAgICAiRHUgc3RlaHN0IGhpZXIgYW0gRWluemFobHVuZ3NzY2hhbHRlciBkZXIgQmFuay4gVW0gZWluZSBSYXRlIGVpbnp1emFobGVuLFxuIgorICAgICsibXVzc3QgRHUgZWluZmFjaCBudXIgRGVpbmVuIE1HIE1BU1RFUi1CTE9DSyB2b3JsZWdlbi4gR2liIGRhenUgZWluZmFjaCBudXJcbiIKKyAgICArIidsZWdlIGJsb2NrIHZvcicgZWluLlxuIgorICAgICsiRGVyIEJsaWNrIGVpbmVzIHNjaGVtZW5oYWZ0IGVya2VubmJhcmVuIEJlYW10ZW4gc2NoZWludCBEaWNoIHNlbGJzdCBkdXJjaFxuIgorICAgICsiZGllIGRpY2tlIFJhdWNoZ2xhc3NjaGVpYmUgaGluZHVyY2ggenUgZHVyY2hib2hyZW4uXG4iICk7CisKKyAgQWRkRGV0YWlsKCAoeyAiYm9kZW4iIH0pLAorICAgICAiRGVyIHRpZWZzY2h3YXJ6ZSBCb2RlbiBnaWJ0IERpciBkYXMgR2VmdWVobCwgaW0gYWJzb2x1dGVuIE5pY2h0cyB6dSBzdGVoZW4uXG4iICk7CisgIEFkZERldGFpbCggKHsgIndhbmQiLCAid2FlbmRlIiB9KSwKKyAgICAgIkR1bmtsZSBTY2hhdHRlbiB0YW56ZW4gdWViZXIgZGllIFdhZW5kZS5cbiIgKTsKKyAgQWRkRGV0YWlsKCAoeyAiZGVja2UiIH0pLAorICAgICAiU2llIHNjaGVpbnQgRGlyIGluIGRpZXNlciB1bmhlaW1saWNoZW4gVW1nZWJ1bmcgYXVmIGRlbiBLb3BmIGZhbGxlbiB6dVxuIgorICAgICsid29sbGVuLlxuIiApOworICBBZGREZXRhaWwoICh7ICJuaWNodHMiIH0pLAorICAgICAiRHUgc2llaHN0IG5pY2h0cy5cbiIgKTsKKyAgQWRkRGV0YWlsKCAoeyAic2NoYXR0ZW4iIH0pLAorICAgICAiRGllIFNjaGF0dGVuIGlycml0aWVyZW4gRGljaCBzZWhyLlxuIiApOworICBBZGREZXRhaWwoICh7ICJzY2hlaWJlIiwgInJhdWNoZ2xhcyIsICJnbGFzIiwgImdsYXNzY2hlaWJlIiwgInJhdWNoZ2xhc3NjaGVpYmUiIH0pLAorICAgICAiSGludGVyIGlociBzY2hlaW50IHNpY2ggZWluIEJlYW10ZXIgenUgdmVyYmVyZ2VuLlxuIiApOworICBBZGREZXRhaWwoICh7ICJzY2hhbHRlciIgfSksCisgICAgICJBbiBkaWVzZW0gU2NoYWx0ZXIga2FubnN0IER1IGVpbmUgUmF0ZSBmdWVyIERlaW4gSGF1cyBlaW56YWhsZW4uXG4iICk7CisgIEFkZERldGFpbCggKHsgImJlYW10ZSIsICJiZWFtdGVyIiwgImJlYW10ZW4iLCAic2NoYWx0ZXJiZWFtdGUiLCAic2NoYWx0ZXJiZWFtdGVyIiwgInNjaGFsdGVyYmVhbXRlbiIgfSksCisgICAgICJEZXIgU2NoYWx0ZXJiZWFtdGUgZHVyY2hib2hydCBEaWNoIG1pdCBzZWluZW4gQmxpY2tlbi5cbiIgKTsKKworICBBZGRDbWQoICh7ICJsZWciLCAibGVnZSIgfSksICJsZWdlbiIgKTsKKworICBBZGRFeGl0KCAicmF1cyIsIFBBVEgrInNlaGVyYmFuayIgKTsKK30KKwordm9pZAorQmVjb21lc05ldERlYWQob2JqZWN0IHBsKQoreworICBwbC0+bW92ZShQQVRIKyJzZWhlcmJhbmsiLCBNX0dPLCAwLCAid2lyZCByYXVzZ2V3b3JmZW4iLCAic2NobGFmd2FuZGVsdCBoZXJlaW4iKTsKK30KKworaW50CitsZWdlbihzdHJpbmcgc3RyKQoreworICBvYmplY3QgdHAsIGJsb2NrLCB2ZXJ0cmFnOworICBpbnQgKmFsLCAqdmwsIHJhdGU7CisKKyAgaWYgKCFzdHIgfHwgc3RyICE9ICJibG9jayB2b3IiKQorICAgIHJldHVybiAwOworCisgIHRwID0gdGhpc19wbGF5ZXIoKTsKKyAgYmxvY2sgPSBwcmVzZW50KCAiXG4gYmxvY2siLCB0cCk7CisgIHZlcnRyYWcgPSBwcmVzZW50KCAic2VoZVxydmVydHJhZyIsIHRwICk7CisKKyAgaWYgKCFJU19TRUVSKHRwKSkKKyAgICB3cml0ZSggIkRlciBTY2hhbHRlcmJlYW10ZSB3ZWlzdCBEaWNoIGRhcmF1ZiBoaW4sIGRhc3MgaGllciBudXIgU2VoZXIgYmUtXG4iCisJICArImRpZW50IHdlcmRlbi5cbiIgKTsKKyAgZWxzZSBpZiAodHAtPlF1ZXJ5UHJvcChQX0tJTExTKSkKKyAgICB3cml0ZSggIkVpbiBib2hyZW5kZXIgQmxpY2sgdmVya3VlbmRldDogVmVyYnJlY2hlciB3ZXJkZW4gaGllciBuaWNodCBiZWRpZW50IVxuIiApOworICBlbHNlIGlmICghYmxvY2spCisgICAgd3JpdGUoICJEdSBoYXN0IGtlaW5lbiBCbG9jaywgZGVuIER1IHZvcmxlZ2VuIGtvZW5udGVzdCFcbiIgKTsKKyAgZWxzZSBpZiAoIXZlcnRyYWcpIHsKKyAgICB3cml0ZSggIkRlciBTY2hhbHRlcmJlYW10ZSBzYWd0OiBTaWUgaGFiZW4ga2VpbmVuIEJhdXNwYXJ2ZXJ0cmFnISBXb3p1IHdvbGxlblxuIgorCSAgKyJTaWUgZGFubiBlaW5lIFJhdGUgZWluemFobGVuPyBXaWUgc2luZCBTaWUgdWViZXJoYXVwdCBhbiBkZW4gQmxvY2tcbiIKKwkgICsiZ2Vrb21tZW4/XG4iICk7CisgICAgSExPRyggIkJBTksuTE9HIiwgIkVpbnphaGx1bmc6ICIrZ2V0dWlkKHRwKSsiIEJsb2NrIG9obmUgVmVydHJhZyFcbiIgKTsKKyAgfQorICBlbHNlIGlmIChvbGRfZXhwbG9kZShvYmplY3RfbmFtZShibG9jayksIiMiKVswXSAhPSBQQVRIKyJibG9jayIgfHwKKwkgICBvbGRfZXhwbG9kZShvYmplY3RfbmFtZSh2ZXJ0cmFnKSwiIyIpWzBdICE9IFBBVEgrImJhdXNwYXJ2ZXJ0cmFnIikgeworICAgIHdyaXRlKCAiRGVyIFNjaGFsdGVyYmVhbXRlIGZhZWhydCBEaWNoIGFuOiBEVSBXSUxMU1QgU0NIVU1NRUxOPz8/XG4iICk7CisgICAgSExPRyggIkJBTksuTE9HIiwgIkVpbnphaGx1bmc6ICIrZ2V0dWlkKHRwKSsiIEZhbHNjaGVyIEJsb2NrL1ZlcnRyYWchXG4iKTsKKyAgICBITE9HKCAiU0NIVU1NRUwiLCBzcHJpbnRmKCJFaW56YWhsdW5nOiBUUDogJU8sIEI6ICVPLCBWOiAlT1xuIiwKKwkJICAgICAgdGhpc19wbGF5ZXIoKSwKKwkJICAgICAgYmxvY2stPlF1ZXJ5UHJvcChQX0NMT05FUiksCisJCSAgICAgIHZlcnRyYWctPlF1ZXJ5UHJvcChQX0NMT05FUikpKTsKKyAgfQorICBlbHNlIHsKKyAgICBhbCA9IGJsb2NrLT5RdWVyeShQX0FVVE9MT0FET0JKKTsKKyAgICByYXRlID0gUkFURU5IT0VIRTsKKyAgICBpZiAoYWxbVl9GTEFHU10gJiBCX0VYVEVORCkKKyAgICAgIHJhdGUgKz0gKDYqUkFURU5IT0VIRSkvMTA7CisKKyAgICBpZiAoYWxbVl9NT05FWV0gPCByYXRlKSB7CisgICAgICB3cml0ZSggIkRlciBTY2hhbHRlcmJlYW10ZSB3ZWlzdCBEaWNoIGRhcmF1ZiBoaW4sIGRhc3MgRHUgbm9jaCBuaWNodCBnZW51ZyBFcmZhaHJ1bmdcbiIKKwkgICAgKyJmdWVyIGRpZSBSYXRlIGdlbGFzc2VuIGhhc3QuXG4iICk7CisgICAgICBITE9HKCBnZXR1aWQodHApLCAiRWluemFobHVuZzogIitnZXR1aWQodHApKyIgaGF0dGUgbmljaHQgZ2VudWcgKCIrYWxbVl9NT05FWV0rIi8iK3JhdGUrIikuXG4iKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICB2bCA9IHZlcnRyYWctPlF1ZXJ5KFBfQVVUT0xPQURPQkopOworICAgICAgcmF0ZSA9IChhbFtWX0ZMQUdTXSAmIEJfRkFTVCkgPyBTVU1NRV9TIDogU1VNTUVfTDsKKyAgICAgIGlmICh2bFsxXSAmIFZfUkFVTSkKKwlyYXRlID0gcmF0ZSAqIDQgLzEwOworICAgICAgd3JpdGUoICJEdSB6YWhsc3QgRGVpbmUgUmF0ZSBlaW4uXG4iICk7CisgICAgICBibG9jay0+cmVtb3ZlKCk7CisgICAgICBpZiAodmVydHJhZy0+RWluemFobHVuZygpID49IHJhdGUpIHsKKwkgIHdyaXRlKCAiRGVyIFNjaGFsdGVyYmVhbXRlIHNhZ3Q6IFNpZSBoYWJlbiBlcyBnZXNjaGFmZnQhIFNpZSBoYWJlbiBudW4gZ2VudWdcbiIKKwkJKyJFcmZhaHJ1bmcgZXJ1ZWJyaWd0LiAiKTsKKwlpZiAodmxbMV0gJiBWX1JBVU0pCisJICB3cml0ZSggIkFtIEF1c2dhYmVzY2hhbHRlciBrb2VubmVuIFNpZSBudW4gZGVuIG5ldWVuIFJhdW1cbiIKKwkJKyJlaW50cmFnZW4gbGFzc2VuLlxuIiApOworCWVsc2UKKwkgIHdyaXRlKCAiQW0gSGF1c2F1c2dhYmVzY2hhbHRlciBrb2VubmVuIFNpZSBudW4gSWhyIG5ldWVzXG4iCisJCSsiSGVpbSBpbiBFbXBmYW5nIG5laG1lbi5cbiIgKTsKKwl2ZXJ0cmFnLT5TaWduKCB2bFsxXSB8IFZfQ09NUEwgKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworCXdyaXRlKCAiRGVyIFNjaGFsdGVyYmVhbXRlIGJlc2Nod29lcnQgQmxpdHogdW5kIERvbm5lciB2b20gSGltbWVsIGhlcmFiLiBFaW5cbiIKKwkgICAgICArImxhdXRlciBLbmFsbCwgdW5kIGVpbiBuZXVlciBSYXRlbmJsb2NrIGVyc2NoZWludCBpbiBEZWluZW0gSW52ZW50YXIuXG4iICk7CisJKGJsb2NrID0gY2xvbmVfb2JqZWN0KFBBVEgrImJsb2NrIikpLT5tb3ZlKHRwLCBNX05PQ0hFQ0spOworCWJsb2NrLT5TZXRQcm9wKCJzY2h3ZXIiLCB2bFsxXSAmIFZfRkFTVCk7CisJYWwgPSBibG9jay0+UXVlcnkoUF9BVVRPTE9BRE9CSik7CisJYWxbVl9GTEFHU10gfD0gQl9BQ1RJVkU7CisJYmxvY2stPlNldChQX0FVVE9MT0FET0JKLCBhbCk7CisgICAgICB9CisgICAgICBITE9HKGdldHVpZCh0cCksICJFaW56YWhsdW5nOiAiK2dldHVpZCh0cCkrIiB6YWhsdGUgZWluLlxuIiApOworICAgICAgdHAtPmZvcmNlX3NhdmUoKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9zY19zY2hhbHRlci5jIGIvZC9zZWhlci9oYWV1c2VyL3NjX3NjaGFsdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYyOTM0MAotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci9zY19zY2hhbHRlci5jCkBAIC0wLDAgKzEsMzMyIEBACisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDxiYW5rLmg+CisjaW5jbHVkZSAiaGF1cy5oIgorI2luY2x1ZGUgPG1vbmV5Lmg+CisKK2luaGVyaXQgInN0ZC9yb29tIjsKKworI2RlZmluZSBLT05UTyAic2VlcmNhcmRfa29udG9zdGFuZCIKKworLy8gUHJvdG90eXBlcworcHVibGljIHZvaWQgQmVjb21lc05ldERlYWQoIG9iamVjdCBwbCApOworc3RhdGljIGludCBfZ3V0aGFiZW4oKTsKK3N0YXRpYyBpbnQgX2VpbnphaGxlbiggc3RyaW5nIHN0ciApOworc3RhdGljIGludCBfYXVmbGFkZW4oIHN0cmluZyBzdHIgKTsKK3N0YXRpYyBpbnQgX2thdWZlbiggc3RyaW5nIHN0ciApOworCisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgICAgOjpjcmVhdGUoKTsKKworICAgIFNldFByb3AoIFBfSU5ET09SUywgMSApOworICAgIFNldFByb3AoIFBfTElHSFQsIDEgKTsKKyAgICBTZXRQcm9wKCBQX0xPR19GSUxFLCAicmVwb3J0L3RpYW1hay5yZXAiICk7CisgICAgU2V0UHJvcCggUF9JTlRfU0hPUlQsICJBbSBHZWxka2FydGVuc2NoYWx0ZXIiICk7CisgICAgU2V0UHJvcCggUF9JTlRfTE9ORywKKyAgICAgICAgICAgICBicmVha19zdHJpbmcoICJEYXMgaXN0IGFsc28gZGVyIEdlbGRrYXJ0ZW5zY2hhbHRlci4gSGludGVyIGVpbmVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJrYXVtIGR1cmNoc2ljaHRpZ2VuIFJhdWNoZ2xhc3NjaGVpYmUgc2NoZWludCBlaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJlYW10ZXIgKG9kZXIgenVtaW5kZXN0IGlyZ2VuZGVpbiBMZWJld2VzZW4pICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZWR1bGRpZyB6dSB3YXJ0ZW4uIE5lYmVuIGRlbSBTY2hhbHRlciBoYWVuZ3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImVpbmUgVGFmZWwuIiwgNzggKSApOworCisgICAgQWRkRGV0YWlsKCAoeyAiYm9kZW4iIH0pLAorICAgICAgICAgICAgICAgIkRlciB0aWVmc2Nod2FyemUgQm9kZW4gZ2lidCBEaXIgZGFzIEdlZnVlaGwsIGltIGFic29sdXRlbiAiCisgICAgICAgICAgICAgICAiTmljaHRzIHp1IHN0ZWhlbi5cbiIgKTsKKyAgICBBZGREZXRhaWwoICJnZWZ1ZWhsIiwgIktlaW4gc2Nob2VuZXMgR2VmdWVobC5cbiIgKTsKKyAgICBBZGREZXRhaWwoICh7ICJzY2h3YXJ6IiwgInNjaHdhZXJ6ZSIgfSksICJUaWVmc2Nod2Fyei5cbiIgKTsKKyAgICBBZGREZXRhaWwoICh7ICJ3YW5kIiwgIndhZW5kZSIgfSksCisgICAgICAgICAgICAgICAiRHVua2xlIFNjaGF0dGVuIHRhbnplbiB1ZWJlciBkaWUgV2FlbmRlLlxuIiApOworICAgIEFkZERldGFpbCggKHsgImRlY2tlIiB9KSwKKyAgICAgICAgICAgICAgICJTaWUgc2NoZWludCBEaXIgaW4gZGllc2VyIHVuaGVpbWxpY2hlbiBVbWdlYnVuZyBhdWYgZGVuICIKKyAgICAgICAgICAgICAgICJLb3BmIGZhbGxlbiB6dVxud29sbGVuLlxuIiApOworICAgIEFkZERldGFpbCggInVtZ2VidW5nIiwgIlNjaGF1IERpY2ggZG9jaCB1bS5cbiIgKTsKKyAgICBBZGREZXRhaWwoICh7ICJrb3BmIiB9KSwgIkRhcyBpc3QgZGVyIEdlZ2Vuc3RhbmQgYXVmIERlaW5lbSBIYWxzLlxuIiApOworICAgIEFkZERldGFpbCggImdlZ2Vuc3RhbmQiLCAiSWNoIG1laW5lIERlaW5lbiBLb3BmLlxuIiApOworICAgIEFkZERldGFpbCggImhhbHMiLCAiV2VubiBEdSBOYWNoaGlsZmUgaW4gQW5hdG9taWUgYnJhdWNoc3QsIHN1Y2ggRGlyICIKKyAgICAgICAgICAgICAgICJqZW1hbmQgYW5kZXJlbi5cbiIgKTsKKyAgICBBZGREZXRhaWwoICh7ICJqZW1hbmQiIH0pLCAiS2VpbmVyIGRhLlxuIiApOworICAgIEFkZERldGFpbCggIm5hY2hoaWxmZSIsICJEYXp1IG11c3N0IER1IHdvaGwgd29hbmRlcnMgc3VjaGVuLlxuIiApOworICAgIEFkZERldGFpbCggImFuYXRvbWllIiwgIlNjaGxhZyBlcyBpbiBlaW5lbSBMZXhpa29uIG5hY2guXG4iICk7CisgICAgQWRkRGV0YWlsKCAibGV4aWtvbiIsICJTb2V0d2FzIGhhc3QgRHUgYW5zY2hlaW5lbmQgbm9jaCBuaWUgZ2VzZWhlbi5cbiIgKTsKKyAgICBBZGREZXRhaWwoICh7ICJuaWNodHMiIH0pLAorICAgICAgICAgICAgICAgIkR1IGJpc3QgYmxpbmQhXG4iICk7CisgICAgQWRkRGV0YWlsKCAoeyAic2NoYXR0ZW4iIH0pLAorICAgICAgICAgICAgICAgIkRpZSBTY2hhdHRlbiBzaW5kIG51ciBkYXp1IGRhLCB1bSBEaWNoIHp1IGlycml0aWVyZW4uICIKKyAgICAgICAgICAgICAgICJVbmQgZGFzIG1hY2hlbiBzaWUgZ3V0LlxuIiApOworICAgIEFkZERldGFpbCggKHsgImJlYW10ZSIsICJiZWFtdGVyIiwgImJlYW10ZW4iLCAic2NoYWx0ZXJiZWFtdGUiLAorICAgICAgICAgICAgICAgICAgICAgICJzY2hhbHRlcmJlYW10ZW4iLCAic2NoYWx0ZXJiZWFtdGVyIiB9KSwKKyAgICAgICAgICAgICAgICJEdSBrYW5uc3QgaWhuIG51ciBzY2hlbWVuaGFmdCBoaW50ZXIgZGVyIFJhdWNoZ2xhc3NjaGVpYmUgIgorICAgICAgICAgICAgICAgImRlcyBTY2hhbHRlcnMgZXItXG5rZW5uZW4uIERpZSBVbXJpc3NlIHNjaGVpbmVuIGFsbGVyZGluZ3MgIgorICAgICAgICAgICAgICAgInp1IGtlaW5lciBMZWJlbnNmb3JtIHp1IGdlaG9lcmVuLFxuZGVyZXIgRHUgRGljaCBlcmlubmVybiAiCisgICAgICAgICAgICAgICAia29lbm50ZXN0LlxuIiApOworICAgIEFkZERldGFpbCggKHsgInNjaGVpYmUiLCAiZ2xhc3NjaGVpYmUiLCAicmF1Y2hnbGFzIiwgInJhdWNoZ2xhc3NjaGVpYmUiIH0pLAorICAgICAgICAgICAgICAgIkVpbiBzY2hlbWVuaGFmdGVyIEJlYW10ZXIgc2l0enQgZGFoaW50ZXIuXG4iICk7CisgICAgQWRkRGV0YWlsKCAoeyAidW1yaXNzZSIgfSksCisgICAgICAgICAgICAgICAiU2llIHNpbmQgYWV1c3NlcnN0IGJldW5ydWhpZ2VuZC5cbiIgKTsKKyAgICBBZGREZXRhaWwoICh7ICJsZWJlbnNmb3JtIiwgInNjaGVtZW4iLCAibGViZXdlc2VuIiB9KSwKKyAgICAgICAgICAgICAgICJEdSBtb2VjaHRlc3QgZ2FyIG5pY2h0IHdpc3NlbiwgdW0gd2FzIGVzIHNpY2ggZGFiZWkgIgorICAgICAgICAgICAgICAgImhhbmRlbHQuXG4iICk7CisgICAgQWRkRGV0YWlsKCAoeyAic2NoYWx0ZXIiLCAiZ2VsZGthcnRlbnNjaGFsdGVyIiB9KSwKKyAgICAgICAgICAgICAgICJBbiBkaWVzZW0gU2NoYWx0ZXIga2FubnN0IER1IGRpZSBiZXJ1ZWhtdGUiCisgICAgICAgICAgICAgICAiIFNlZXItQ2FyZCAoVE0pIGVyd2VyYmVuIHNvd2llXG5EZWluIEtvbnRvIGF1ZmxhZGVuLlxuIiApOworICAgIEFkZERldGFpbCggKHsgImtvbnRvIiwgImthcnRlIiwgImdlbGRrYXJ0ZSIsICJjYXJkIiwgInNlZXJjYXJkIiwKKyAgICAgICAgICAgICAgICAgICAgICAic2Vlci1jYXJkIiB9KSwgIldpZSBkYXMgZ2VodCwgc3RlaHQgYXVmIGRlciBUYWZlbC5cbiIgKTsKKyAgICBBZGREZXRhaWwoICJ0YWZlbCIsICJEdSBrYW5uc3Qgc2llIGxlc2VuLlxuIiApOworCisgICAgQWRkU21lbGxzKCBTRU5TRV9ERUZBVUxULCAiRXMgcmllY2h0IG5hY2ggYWx0ZW0gU3RhdWIuXG4iICk7CisgICAgQWRkU21lbGxzKCAic3RhdWIiLCAiSGllciBsYWdlcm4gc2ljaGVyIHZpZWxlIGFsdGUgQWt0ZW4uXG4iICk7CisgICAgQWRkU21lbGxzKCAiYWt0ZW4iLCAiRGllIHJpZWNoZW4gZGFubiBpcmdlbmR3YW5uIG5hY2ggU3RhdWIuXG4iICk7CisKKyAgICBBZGRTb3VuZHMoIFNFTlNFX0RFRkFVTFQsICJEaXJla3Qgdm9yIGRlbSBTY2hhbHRlciBpc3QgZXMgZXJzdGF1bmxpY2ggIgorICAgICAgICAgICAgICAgInJ1aGlnLlxuR2VyYWRlenUgZWhyZnVyY2h0c3ZvbGwgcnVoaWcuXG4iICk7CisgICAgQWRkU291bmRzKCAoeyAic2NoYWx0ZXIiLCAicnVoZSIsICJlaHJmdXJjaHQiIH0pLAorICAgICAgICAgICAgICAgIk9iIGRhcyBhbSBTY2hhbHRlcmJlYW10ZW4gbGllZ3Q/XG4iICk7CisgICAgQWRkU291bmRzKCAoeyAiYmVhbXRlciIsICJiZWFtdGVuIiwgInNjaGFsdGVyYmVhbXRlciIsICJzY2hhbHRlcmJlYW10ZW4iIH0pLAorICAgICAgICAgICAgICAgIklzdCBlciB1ZWJlcmhhdXB0IG5vY2ggZGE/XG4iICk7CisKKyAgICBBZGRSZWFkRGV0YWlsKCAoeyAidGFmZWwiLCAicHJlaXNsaXN0ZSIgfSksCisgICAgICAgICAgICAgICAgICAgIlByZWlzbGlzdGU6XG4iCisgICAgICAgICAgICAgICAgICAgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCisgICAgICAgICAgICAgICAgICAgIj09PT09PT09PT09PT09PT09PT09PVxuXG4iCisgICAgICAgICAgICAgICAgICAgIk5ldWUgR2VsZGthcnRlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iCisgICAgICAgICAgICAgICAgICAgIi4uLi4uLiAxMDAwMCBNdWVuemVuXG4iCisgICAgICAgICAgICAgICAgICAgIlN5bnRheDoga2F1ZmUgZ2VsZGthcnRlXG5cbiIKKyAgICAgICAgICAgICAgICAgICAiRWluemFobHVuZ2VuIGF1ZiBkYXMgR2VsZGthcnRlbi1Lb250byAuLi4uLi4uLi4uLiIKKyAgICAgICAgICAgICAgICAgICAiLi4uLi4uIDEwJSBHZWJ1ZWhyZW5cbiIKKyAgICAgICAgICAgICAgICAgICAiU3ludGF4OiB6YWhsZSA8bj4gbXVlbnplbiBlaW5cbiIKKyAgICAgICAgICAgICAgICAgICAib2RlciAgICBsYWRlIGthcnRlIGF1ZlxuXG4iICk7CisKKyAgICBBZGRDbWQoICh7ICJ6YWhsIiwgInphaGxlIiB9KSwgIl9laW56YWhsZW4iICk7CisgICAgQWRkQ21kKCAoeyAibGFkIiwgImxhZGUiIH0pLCAiX2F1ZmxhZGVuIiApOworICAgIEFkZENtZCggKHsgImthdWZlIiwgImthdWYiIH0pLCAiX2thdWZlbiIgKTsKKyAgICAKKyAgICBBZGRFeGl0KCAicmF1cyIsIFBBVEgrInNlaGVyYmFuayIgKTsKK30KKworCitwdWJsaWMgdm9pZCBCZWNvbWVzTmV0RGVhZCggb2JqZWN0IHBsICkKK3sKKyAgICBwbC0+bW92ZSggUEFUSCsic2VoZXJiYW5rIiwgTV9HT3xNX05PQ0hFQ0ssIDAsICJ3aXJkIHJhdXNnZXdvcmZlbiIsCisgICAgICAgICAgICAgICJzY2hsYWZ3YW5kZWx0IGhlcmVpbiIgKTsKK30KKworCitzdGF0aWMgaW50IF9ndXRoYWJlbigpCit7CisgICAgbWl4ZWQgd2VydDsKKworICAgIGlmICggISh0aGlzX3BsYXllcigpLT5RdWVyeShLT05UTywgRl9NT0RFKSAmIFNBVkUpICkKKyAgICAgICAgdGhpc19wbGF5ZXIoKS0+U2V0KCBLT05UTywgU0FWRSwgRl9NT0RFX0FTICk7CisgICAgCisgICAgd2VydCA9IHRoaXNfcGxheWVyKCktPlF1ZXJ5KCBLT05UTywgRl9WQUxVRSApOworCisgICAgaWYgKCAhaW50cCh3ZXJ0KSB8fCB3ZXJ0IDwgMCB8fCB3ZXJ0ID4gMTAwMDAwICkKKyAgICAgICAgcmV0dXJuIHRoaXNfcGxheWVyKCktPlNldCggS09OVE8sIDAsIEZfVkFMVUUgKTsKKworICAgIHJldHVybiB3ZXJ0OworfQorCisKK3N0YXRpYyBpbnQgX2VpbnphaGxlbiggc3RyaW5nIHN0ciApCit7CisgICAgaW50IG4sIGd1dGhhYmVuLCBnZWJ1ZWhyOworICAgIHN0cmluZyBkdW1teTsKKyAgICBvYmplY3Qgb2I7CisKKyAgICBpZiAoICF0aGlzX3BsYXllcigpIHx8IHRoaXNfcGxheWVyKCkgIT0gdGhpc19pbnRlcmFjdGl2ZSgpICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgCisgICAgaWYgKCAhc3RyIHx8ICFzdHJpbmdwKHN0cikgfHwgc3NjYW5mKCBzdHIsICIlZCAlcyIsIG4sIGR1bW15ICkgIT0gMiB8fAorICAgICAgICAgZHVtbXkgIT0gIm11ZW56ZW4gZWluIiApCisgICAgICAgIHJldHVybiBub3RpZnlfZmFpbCggIlN5bnRheDogemFobGUgPG4+IG11ZW56ZW4gZWluXG4iICksIDA7CisKKyAgICBpZiAoICFJU19TRUVSKHRoaXNfcGxheWVyKCkpICkKKyAgICAgICAgcmV0dXJuIG5vdGlmeV9mYWlsKCBicmVha19zdHJpbmcoIldlcmQgZG9jaCBlcnN0bWFsIFNlaGVyLiIsIDc4LCAiRGVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNjaGFsdGVyYmVhbXRlIGdyaW5zdCB1ZWJlcmhlYmxpY2g6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSApLCAwOworCisgICAgaWYgKCBuIDwgMTAwMCApCisgICAgICAgIHJldHVybiBub3RpZnlfZmFpbCggYnJlYWtfc3RyaW5nKCJNaXQgc28ga2xlaW5lbiBCZXRyYWVnZW4gZmFuZ2VuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpciBlcnN0IGdhciBuaWNodCBhbi4gRHUgbXVzc3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2Nob24gbWluZGVzdGVucyAxMDAwICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk11ZW56ZW4gZWluemFobGVuLiIsIDc4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGVyIFNjaGFsdGVyYmVhbXRlIGdydW1tZWx0OiAiKSApLCAwOworCisgICAgZ3V0aGFiZW4gPSB0aGlzX3BsYXllcigpLT5RdWVyeU1vbmV5KCk7CisKKyAgICAvLyBNYW4ga2FubiBzZWluIEtvbnRvIG5hdHVlcmxpY2ggbmljaHQgbWl0IGRlbSBHZWxkIHZvbSBLb250byBhdWZsYWRlbiA7LSkKKyAgICBpZiAoIG9iID0gcHJlc2VudCggIlxuZ2VsZGthcnRlIiwgdGhpc19wbGF5ZXIoKSApICkKKyAgICAgICAgZ3V0aGFiZW4gLT0gb2ItPlF1ZXJ5UHJvcCggUF9BTU9VTlQgKTsKKworICAgIGlmICggZ3V0aGFiZW4gPCBuICkKKyAgICAgICAgcmV0dXJuIG5vdGlmeV9mYWlsKCBicmVha19zdHJpbmcoIkR1IGhhc3QgamEgZ2FyIG5pY2h0IHNvdmllbCBHZWxkISIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc4LCAiRGVyIFNjaGFsdGVyYmVhbXRlIGZhdWNodCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaWNoIGFuOiAiKSApLCAwOworCisgICAgaWYgKCAoZ3V0aGFiZW4gPSBfZ3V0aGFiZW4oKSkgPT0gMTAwMDAwICkKKyAgICAgICAgcmV0dXJuIG5vdGlmeV9mYWlsKCBicmVha19zdHJpbmcoICJEZWluZSBTZWVyLUNhcmQgKFRNKSBpc3QgYmVyZWl0cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWF4aW1hbCBhdWZnZWxhZGVuLiBNZWhyIGFscyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTAwLjAwMCBNdWVuemVuIGtvZW5uZW4gZGFtaXQgYXVzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZWNobmlzY2hlbiBHcnVlbmRlbiBuaWNodCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmVyd2FsdGV0IHdlcmRlbi4iLCA3OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZXIgU2NoYWx0ZXJiZWFtdGUgc2FndDogIiApICksIDA7CisKKyAgICBnZWJ1ZWhyID0gdG9faW50KG4gLyAxMS4wICsgMC41KTsKKyAgICBuIC09IGdlYnVlaHI7CisKKyAgICBpZiAoIGd1dGhhYmVuICsgbiA+IDEwMDAwMCApCisgICAgICAgIHJldHVybiBub3RpZnlfZmFpbCggYnJlYWtfc3RyaW5nKCJUdXQgbWlyIGxlaWQsIGFiZXIgc28gaG9oZSBCZXRyYWVnZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrYW5uIGRpZSBHZWxka2FydGUgbmljaHQgdmVyd2FsdGVuLlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRHUga2FubnN0IGRpZSBTZWVyLUNhcmQgKFRNKSBtaXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWF4aW1hbCAxMDAuMDAwIE11ZW56ZW4gYXVmbGFkZW4uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF1c2dlaGVuZCB2b24gRGVpbmVtIG1vbWVudGFuZW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR3V0aGFiZW4gdm9uICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b19zdHJpbmcoZ3V0aGFiZW4pICsgIiBNdWVuemVuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInd1ZXJkZSBEaWNoIGRhcyAoaW5rbC4gdW5zZXJlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWZXJ3YWx0dW5nc2dlYnVlaHJlbikgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvX3N0cmluZyh0b19pbnQoKDEwMDAwMC1ndXRoYWJlbikgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMSArIDAuNSkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBNdWVuemVuIGtvc3Rlbi5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVtIERpciBkaWUgUmVjaG5lcmVpIHp1IGVyc3BhcmVuLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrYW5uc3QgRHUgYXVjaCBlaW5mYWNoIFwibGFkZSBrYXJ0ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdWZcIiBiZW51dHplbiwgdW0gRGVpbmUgR2VsZGthcnRlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heGltYWwgYXVmenVsYWRlbi4iLCA3OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlciBTY2hhbHRlcmJlYW10ZSBzYWd0OiAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCU19MRUFWRV9NWV9MRlMpICksIDA7CisKKyAgICBpZiAoIG9iamVjdHAob2IpICl7CisgICAgICAgIHdyaXRlKCAiRHUgemVpZ3N0IERlaW5lIEdlbGRrYXJ0ZSBrdXJ6IHZvci5cbiIgKTsKKyAgICAgICAgLy8gbm90d2VuZGlnLCBkYSBzb25zdCBkYXMgR2VsZCBldnRsLiB2b24gZGVyIEthcnRlIHNlbGJlciBhYmdlYnVjaHQKKyAgICAgICAgLy8gd2lyZCwgZmFsbHMgc2llIGFscyBvYmVyc3RlcyBpbSBJbnYgc3RlaHQKKyAgICAgICAgdGhpc19wbGF5ZXIoKS0+U2V0KCBLT05UTywgMCwgRl9WQUxVRSApOworICAgIH0KKworICAgIHRoaXNfcGxheWVyKCktPkFkZE1vbmV5KCAtKG4gKyBnZWJ1ZWhyKSApOworICAgIFpFTlRSQUxCQU5LLT5QYXlJbiggZ2VidWVociApOworICAgIHRoaXNfcGxheWVyKCktPlNldCggS09OVE8sIGd1dGhhYmVuICsgbiwgRl9WQUxVRSApOworCisgICAgd3JpdGUoIGJyZWFrX3N0cmluZyggIk9rYXksIERlaW5lIEdlbGRrYXJ0ZSBoYXQgbnVuIGVpbiBHdXRoYWJlbiB2b24gIgorICAgICAgICAgICAgICAgICAgICAgICAgICJpbnNnZXNhbXQgIiArIHRvX3N0cmluZyhfZ3V0aGFiZW4oKSkgKyAiIE11ZW56ZW4uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICA3OCwgIkRlciBTY2hhbHRlcmJlYW10ZSBzYWd0OiAiICkgKTsKKworICAgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgX2F1ZmxhZGVuKCBzdHJpbmcgc3RyICkKK3sKKyAgICBpbnQgbiwgZ3V0aGFiZW4sIGdlYnVlaHI7CisgICAgc3RyaW5nIGR1bW15OworICAgIG9iamVjdCBvYjsKKworICAgIGlmICggIXRoaXNfcGxheWVyKCkgfHwgdGhpc19wbGF5ZXIoKSAhPSB0aGlzX2ludGVyYWN0aXZlKCkgKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICggIXN0cmluZ3Aoc3RyKSB8fCBzc2NhbmYoIHN0ciwgIiVzIGF1ZiIsIGR1bW15ICkgIT0gMSB8fAorICAgICAgICAgZHVtbXkgIT0gImthcnRlIiAmJiBkdW1teSAhPSAiZ2VsZGthcnRlIiAmJiBkdW1teSAhPSAiY2FyZCIgJiYKKyAgICAgICAgIGR1bW15ICE9ICJzZWVyY2FyZCIgJiYgZHVtbXkgIT0gInNlZXItY2FyZCIgKQorICAgICAgICByZXR1cm4gbm90aWZ5X2ZhaWwoICJTeW50YXg6IGxhZGUgZ2VsZGthcnRlIGF1ZlxuIiApLCAwOworCisgICAgaWYgKCAhSVNfU0VFUih0aGlzX3BsYXllcigpKSApCisgICAgICAgIHJldHVybiBub3RpZnlfZmFpbCggYnJlYWtfc3RyaW5nKCJXZXJkIGRvY2ggZXJzdG1hbCBTZWhlci4iLCA3OCwgIkRlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTY2hhbHRlcmJlYW10ZSBncmluc3QgdWViZXJoZWJsaWNoOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgKSwgMDsKKworICAgIGlmICggKGd1dGhhYmVuID0gX2d1dGhhYmVuKCkpID09IDEwMDAwMCApCisgICAgICAgIHJldHVybiBub3RpZnlfZmFpbCggYnJlYWtfc3RyaW5nKCAiRGVpbmUgU2Vlci1DYXJkIChUTSkgaXN0IGJlcmVpdHMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heGltYWwgYXVmZ2VsYWRlbi4gTWVociBhbHMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEwMC4wMDAgTXVlbnplbiBrb2VubmVuIGRhbWl0IGF1cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVjaG5pc2NoZW4gR3J1ZW5kZW4gbmljaHQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZlcndhbHRldCB3ZXJkZW4uIiwgNzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGVyIFNjaGFsdGVyYmVhbXRlIHNhZ3Q6ICIgKSApLCAwOworCisgICAgbiA9IHRoaXNfcGxheWVyKCktPlF1ZXJ5TW9uZXkoKTsKKworICAgIC8vIE1hbiBrYW5uIHNlaW4gS29udG8gbmF0dWVybGljaCBuaWNodCBtaXQgZGVtIEdlbGQgdm9tIEtvbnRvIGF1ZmxhZGVuIDstKQorICAgIGlmICggb2IgPSBwcmVzZW50X2Nsb25lKCBTRUhFUktBUlRFLCB0aGlzX3BsYXllcigpICkgKQorICAgICAgICBuIC09IG9iLT5RdWVyeVByb3AoIFBfQU1PVU5UICk7CisKKyAgICBpZiAoIChnZWJ1ZWhyID0gdG9faW50KCAoMTAwMDAwIC0gZ3V0aGFiZW4pICogMS4xICsgMC41ICkpIDwgbiApCisgICAgICAgIG4gPSBnZWJ1ZWhyOworCisgICAgZ2VidWVociA9IHRvX2ludCggbiAvIDExLjAgKyAwLjUgKTsKKyAgICBuIC09IGdlYnVlaHI7CisKKyAgICBpZiAoIG4gKyBnZWJ1ZWhyIDwgMTAwMCApCisgICAgICAgIHJldHVybiBub3RpZnlfZmFpbCggYnJlYWtfc3RyaW5nKCJNaXQgc28ga2xlaW5lbiBCZXRyYWVnZW4gZmFuZ2VuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpciBlcnN0IGdhciBuaWNodCBhbi4gRHUgbXVzc3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2Nob24gbWluZGVzdGVucyAxMDAwICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk11ZW56ZW4gZWluemFobGVuLiIsIDc4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGVyIFNjaGFsdGVyYmVhbXRlIGdydW1tZWx0OiAiKSApLCAwOworCisgICAgaWYgKCBvYmplY3RwKG9iKSApeworICAgICAgICB3cml0ZSggIkR1IHplaWdzdCBEZWluZSBHZWxka2FydGUga3VyeiB2b3IuXG4iICk7CisgICAgICAgIC8vIG5vdHdlbmRpZywgZGEgc29uc3QgZGFzIEdlbGQgZXZ0bC4gdm9uIGRlciBLYXJ0ZSBzZWxiZXIgYWJnZWJ1Y2h0CisgICAgICAgIC8vIHdpcmQsIGZhbGxzIHNpZSBhbHMgb2JlcnN0ZXMgaW0gSW52IHN0ZWh0CisgICAgICAgIHRoaXNfcGxheWVyKCktPlNldCggS09OVE8sIDAsIEZfVkFMVUUgKTsKKyAgICB9CisKKyAgICB0aGlzX3BsYXllcigpLT5BZGRNb25leSggLShuICsgZ2VidWVocikgKTsKKyAgICBaRU5UUkFMQkFOSy0+UGF5SW4oIGdlYnVlaHIgKTsKKyAgICB0aGlzX3BsYXllcigpLT5TZXQoIEtPTlRPLCBndXRoYWJlbiArIG4sIEZfVkFMVUUgKTsKKworICAgIHdyaXRlKCBicmVha19zdHJpbmcoICJEdSB6YWhsc3QgIiArIHRvX3N0cmluZyhuK2dlYnVlaHIpICsgIiBNdWVuemVuIGVpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgInVuZCBlcmhvZWhzdCBEZWluIEd1dGhhYmVuIGRhbWl0IGF1ZiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICB0b19zdHJpbmcoX2d1dGhhYmVuKCkpICsgIiBNdWVuemVuIGluc2dlc2FtdC4iLCA3OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiRGVyIFNjaGFsdGVyYmVhbXRlIHNhZ3Q6ICIgKSApOworICAgIAorICAgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgX2thdWZlbiggc3RyaW5nIHN0ciApCit7CisgICAgaWYgKCAhdGhpc19pbnRlcmFjdGl2ZSgpIHx8IHRoaXNfcGxheWVyKCkgIT0gdGhpc19pbnRlcmFjdGl2ZSgpICkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoIHN0ciAhPSAiZ2VsZGthcnRlIiAmJiBzdHIgIT0gImthcnRlIiAmJiBzdHIgIT0gImNhcmQiICYmCisgICAgICAgICBzdHIgIT0gInNlZXJjYXJkIiAmJiBzdHIgIT0gInNlZXItY2FyZCIgKQorICAgICAgICByZXR1cm4gbm90aWZ5X2ZhaWwoICJTeW50YXg6IGthdWZlIGdlbGRrYXJ0ZVxuIiApLCAwOworCisgICAgaWYgKCAhSVNfU0VFUih0aGlzX3BsYXllcigpKSApCisgICAgICAgIHJldHVybiBub3RpZnlfZmFpbCggYnJlYWtfc3RyaW5nKCJXZXJkIGRvY2ggZXJzdG1hbCBTZWhlci4iLCA3OCwgIkRlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTY2hhbHRlcmJlYW10ZSBncmluc3QgdWViZXJoZWJsaWNoOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgKSwgMDsKKworICAgIGlmICggdGhpc19wbGF5ZXIoKS0+UXVlcnlNb25leSgpIDwgMTAwMDAgKQorICAgICAgICByZXR1cm4gbm90aWZ5X2ZhaWwoIGJyZWFrX3N0cmluZygiRHUgaGFzdCBuaWNodCBnZW51ZyBHZWxkIGJlaSEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3OCwgIkRlciBTY2hhbHRlcmJlYW10ZSBmYXVjaHQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGljaCBhbjogIikgKSwgMDsKKworICAgIG9iamVjdCBvYiA9IGNsb25lX29iamVjdCggU0VIRVJLQVJURSApOyAKKyAgICB0aGlzX3BsYXllcigpLT5BZGRNb25leSgtMTAwMDApOworICAgIFpFTlRSQUxCQU5LLT5QYXlJbigxMDAwMCk7CisgICAgCisgICAgaWYgKCBvYi0+bW92ZSggdGhpc19wbGF5ZXIoKSwgTV9HSVZFICkgIT0gMSApeworICAgICAgICB3cml0ZSggIkRlciBTY2hhbHRlcmJlYW10ZSBncnVtbWVsdDogRHUga2FubnN0IGRpZSBHZWxka2FydGUgbmljaHQgIgorICAgICAgICAgICAgICAgIm1laHIgdHJhZ2VuLlxuRGVyIFNjaGFsdGVyYmVhbXRlIHdpcmZ0IERpciBEZWluZSBTZWVyLUNhcmQgIgorICAgICAgICAgICAgICAgIihUTSkgdmVyYWVjaHRsaWNoIHZvciBkaWUgRnVlc3NlLlxuIiApOworICAgICAgICAvLyB0cm90emRlbSBlaW5tYWwgaW4ncyBJbnYgZGVzIFNwaWVsZXJzIGJld2VnZW4sIGRhbWl0IGRpZSBLYXJ0ZQorICAgICAgICAvLyBhdWYgc2VpbmVuIE5hbWVuIHJlZ2lzdHJpZXJ0IHdpcmQKKyAgICAgICAgb2ItPm1vdmUoIHRoaXNfcGxheWVyKCksIE1fR0lWRXxNX05PQ0hFQ0sgKTsKKyAgICAgICAgLy8gZGFubiBhdWYgZGVuIEJvZGVuIGxlZ2VuCisgICAgICAgIG9iLT5tb3ZlKCB0aGlzX29iamVjdCgpLCBNX1BVVCApOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHdyaXRlKCAiRGVyIEJlYW10ZSBoYWVuZGlndCBEaXIgZWluZSBTZWVyLUNhcmQgKFRNKSBhdXMuXG4iICk7CisKKyAgICB3cml0ZSggYnJlYWtfc3RyaW5nKCAiRGVyIFNjaGFsdGVyYmVhbXRlIG1hY2h0IERpY2ggbm9jaCBkYXJhdWYgIgorICAgICAgImF1Zm1lcmtzYW0sIGRhc3MgRGVpbmUgU2Vlci1DYXJkIChUTSkgaW1tZXIgZXJzdCBkYW5uIGFscyAiCisgICAgICAiWmFobHVuZ3NtaXR0ZWwgaW4gQW5zcHJ1Y2ggZ2Vub21tZW4gd2lyZCwgd2VubiBEZWluZSBpbiBCb2Vyc2VuIG9kZXIgIgorICAgICAgImluIGtsaW5nZW5kZXIgTXVlbnplIG1pdGdlZnVlaHJ0ZSBCYXJzY2hhZnQgYXVmZ2VicmF1Y2h0IHNlaW4gIgorICAgICAgInNvbGx0ZSAtIGVnYWwsIHdhcyBkYXZvbiBzaWNoIG9iZW4gaW0gSW52ZW50YXIgYmVmaW5kZXQuXG4iCisgICAgICAiV2FzIGltbWVyIGRhcyBhdWNoIGhlaXNzZW4gc29sbC4iLCA3OCwgMCwgQlNfTEVBVkVfTVlfTEZTICkgKTsKKworICAgIHRoaXNfcGxheWVyKCktPlNldCggS09OVE8sIFNBVkUsIEZfTU9ERV9BUyApOworCisgICAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvc2VoZXJiYW5rLmMgYi9kL3NlaGVyL2hhZXVzZXIvc2VoZXJiYW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU0NzI2NQotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci9zZWhlcmJhbmsuYwpAQCAtMCwwICsxLDE3NSBAQAorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxyb29tcy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlICJxdWV1ZS5oIgorI2luY2x1ZGUgImhhdXMuaCIKKworaW5oZXJpdCAiL3N0ZC9yb29tIjsKKworY3JlYXRlKCkKK3sKKyAgICBvYmplY3QgcTsKKyAgICAKKyAgICA6OmNyZWF0ZSgpOworICAgIAorICAgIFNldFByb3AoIFBfSU5ET09SUywgMSApOworICAgIFNldFByb3AoIFBfTElHSFQsIDEgKTsKKyAgICBTZXRQcm9wKCBQX0lOVF9TSE9SVCwgIkluIGRlciBNb3JnZW5HcmF1ZW4tQmFuayIgKTsKKyAgICBTZXRQcm9wKCBQX0lOVF9MT05HLAorICAgICAgICAgICAgIGJyZWFrX3N0cmluZyggIkR1bmtsZSBTY2hhdHRlbiBlcmZ1ZWxsZW4gZGllc2VuIFJhdW0sIG51ciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAic2NoZW1lbmhhZnQga2FubnN0IER1IGVpbmlnZSBTY2hsYW5nZW4gc293aWUgZWluZW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZm9ybWF0aW9uc3N0YW5kIGVya2VubmVuLiBEdSBiZWdpbm5zdCB6dSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmVncmVpZmVuOlxuRHUgYmVmaW5kZXN0IERpY2ggaW4gZGVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJNb3JnZW5HcmF1ZW4tQmFuaywgZGVyICdCYW5rIGluIElocmVtIFJ1ZWNrZW4nLlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIldlbm4gRHUgU2VoZXIgb2RlciBTZWhlcmluIGJpc3QsIGthbm5zdCBEdSBoaWVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJlaW5lbiBCYXVzcGFydmVydHJhZyBmdWVyIGVpbiBTZWhlcmhhdXMgZXJ3ZXJiZW4sICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJSYXRlbiBmdWVyIGVpbmVuIGxhdWZlbmRlbiBCYXVzcGFydmVydHJhZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiZWluemFobGVuIHVuZCBlaW4gYWJiZXphaGx0ZXMgSGF1cyBhYmhvbGVuLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXVzc2VyZGVtIGthbm5zdCBEdSBoaWVyIEdlbGRrYXJ0ZW4gZXJ3ZXJiZW4gdW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZWluIEtvbnRvIGF1ZmZ1ZWxsZW4uIERhenUgbXVzc3QgRHUgRGljaCBudXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgInp1IGRlbiBlbnRzcHJlY2hlbmRlbiBTY2hhbHRlcm4gYmVnZWJlbi4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5hY2ggU3VlZGVuIGthbm5zdCBEdSBkaWUgQmFuayB3aWVkZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgInZlcmxhc3Nlbi5cbiIsIDc4LCAwLCBCU19MRUFWRV9NWV9MRlMgKSApOworICAgIAorICAgIEFkZERldGFpbCggKHsgIndhbmQiLCAid2FlbmRlIiB9KSwKKyAgICAgICAgICAgICAgICJBbiBkZW4gV2FlbmRlbiB0cmVpYmVuIGRpZSBTY2hhdHRlbiB1bmhlaW1saWNoZSAiCisgICAgICAgICAgICAgICAiU3BpZWxjaGVuLlxuIiApOworICAgIEFkZERldGFpbCggKHsgImJvZGVuIiB9KSwKKyAgICAgICAgICAgICAgICJEZXIgQm9kZW4gaXN0IHNjaHdhcnogd2llIGRpZSBOYWNodC5cbiIgKTsKKyAgICBBZGREZXRhaWwoICh7ICJkZWNrZSIgfSksCisgICAgICAgICAgICAgICAiU2NobGVpbWlnZSBGYWVkZW4gc2NoZWluZW4gdm9uIGRlciBkdW5rbGVuIERlY2tlICIKKyAgICAgICAgICAgICAgICJ6dSBoYWVuZ2VuLlxuIiApOworICAgIEFkZERldGFpbCggKHsgInNjaGF0dGVuIiB9KSwKKyAgICAgICAgICAgICAgICJEaWUgU2NoYXR0ZW4gZXJmdWVsbGVuIGRlbiBnYW56ZW4gUmF1bSB1bmQgbGFzc2VuICIKKyAgICAgICAgICAgICAgICJEaWNoIG51ciBzY2hlbWVuaGFmdGUgRGV0YWlsc1xuZXJibGlja2VuLlxuIiApOworICAgIEFkZERldGFpbCggKHsgImRldGFpbHMiLCAic2NoZW1lbiIgfSksCisgICAgICAgICAgICAgICAiRWluIEluZm9ybWF0aW9uc3N0YW5kIHNvd2llIHZpZXIgU2NobGFuZ2VuIHZvbiAiCisgICAgICAgICAgICAgICAiTGV1dGVuIHNpbmQgYWxzIFNjaGVtZW4gaW5cbmRlbiBTY2hhdHRlbiBlcmtlbm5iYXIuXG4iICk7CisgICAgQWRkRGV0YWlsKCAoeyAic2NobGVpbSIsICJmYWVkZW4iLCAic2NobGVpbWZhZWRlbiIgfSksCisgICAgICAgICAgICAgICAiRGllIFNjaGxlaW1mYWVkZW4gaGFlbmdlbiB2b24gZGVyIERlY2tlIHVuZCBkcm9oZW4gRGlyIGF1ZiAiCisgICAgICAgICAgICAgICAiZGVuIEtvcGYgenVcbnRyb3BmZW4uIEVpbiBGcm9lc3RlbG4gc2NodWV0dGVsdCBEaWNoLlxuIiApOworICAgIEFkZERldGFpbCggKHsgInNjaGFsdGVyIiB9KSwKKyAgICAgICAgICAgICAgIGJyZWFrX3N0cmluZyggIlZvciBkZW4gU2NoYWx0ZXJuIHN0ZWhlbiBsYW5nZSBTY2hsYW5nZW4gdm9uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxldXRlbiwgZGllIGF1Y2ggZ2VybmUgZWluIEhhdXMgaGFldHRlbi4gRXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2lidCBlaW5lbiBBbnRyYWdzc2NoYWx0ZXIsIGVpbmVuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJhdGVuemFobHVuZ3NzY2hhbHRlciwgZWluZW4gQXVzZ2FiZXNjaGFsdGVyIHVuZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlaW5lbiBHZWxka2FydGVuc2NoYWx0ZXIuIFZvciBqZWRlbSBTY2hhbHRlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdGVodCBlaW5lIFNjaGxhbmdlIHZvbiBtZWhyIG9kZXIgd2VuaWdlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZWR1bGRpZyB3YXJ0ZW5kZW4gTGV1dGVuLiBEdSB3aXJzdCBEaWNoIHdvaGwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5zdGVsbGVuIG11ZXNzZW4uLi4iLCA3OCApICk7CisgICAgQWRkRGV0YWlsKCAoeyAic3RhbmQiLCAiaW5mb3JtYXRpb25zc3RhbmQiIH0pLAorICAgICAgICAgICAgICAgIkhpZXIga2FubnN0IER1IGZ1ZXIgZGVuIHVudmVyc2NoYWVtdGVuIFByZWlzIHZvbiAxMDAwMCAiCisgICAgICAgICAgICAgICAiTXVlbnplbiBkaWUgS29tbWVuLVxudGFyZSB6dW0gQmF1c3BhcnZlcnRyYWcgZXJ3ZXJiZW4uICIKKyAgICAgICAgICAgICAgICJEYXMgZ2VodCBtaXQgJ2thdWZlIGtvbW1lbnRhcicsIGlzdCBhYmVyXG4iCisgICAgICAgICAgICAgICAiYW5nZXNpY2h0cyBkZXMgaG9oZW4gUHJlaXNlcyBmYXN0IG5pY2h0IGFuenVyYXRlbi5cbiIgKTsKKyAgICBBZGREZXRhaWwoICh7ICJhdXNnYWJlc2NoYWx0ZXIiLCAiaGF1c2F1c2dhYmVzY2hhbHRlciIsICJoYXVzYXVzZ2FiZSIgfSksCisgICAgICAgICAgICAgICAiV2VubiBEdSBhbGxlIFJhdGVuIGZ1ZXIgRGVpbiBIYXVzIGVpbmdlemFobHQgaGFzdCwga2FubnN0ICIKKyAgICAgICAgICAgICAgICJEdSBlcyBoaWVyIGFiLVxuaG9sZW4gdW5kIG1pdG5laG1lbi4gRGFmdWVyIG11c3N0IER1IERpY2ggIgorICAgICAgICAgICAgICAgImFuIGRpZSBIYXVzYXVzZ2FiZXNjaGxhbmdlIGFuLVxuc3RlbGxlbi5cbiIgKTsKKyAgICBBZGREZXRhaWwoICh7ICJyYXRlbnNjaGFsdGVyIiwgInJhdGVuemFobHVuZ3NzY2hhbHRlciIgfSksCisgICAgICAgICAgICAgICAiSGllciBrYW5uc3QgRHUgZGllIFJhdGVuIGZ1ZXIgRGVpbiBTZWhlcmhhdXMgZWluemFobGVuLiAiCisgICAgICAgICAgICAgICAiRHUgd2lyc3QgRGljaFxuYWJlciBlcnN0IGFuIGRpZSBaYWhsdW5nc3NjaGxhbmdlIGFuc3RlbGxlbiAiCisgICAgICAgICAgICAgICAibXVlc3Nlbi5cbiIgKTsKKyAgICBBZGREZXRhaWwoICh7ICJhbnRyYWdzc2NoYWx0ZXIiIH0pLAorICAgICAgICAgICAgICAgIkFuIGRpZXNlbSBTY2hhbHRlciBrYW5uc3QgRHUgZWluZW4gQmF1c3BhcnZlcnRyYWcgYmVhbnRyYWdlbi4gIgorICAgICAgICAgICAgICAgIlN0ZWxsIERpY2hcbmRhenUgYW4gZGllIEFudHJhZ3NzY2hsYW5nZSBhbi5cbiIgKTsKKyAgICBBZGREZXRhaWwoICh7ICJnZWxka2FydGVuc2NoYWx0ZXIiLCAia2FydGVuc2NoYWx0ZXIiIH0pLAorICAgICAgICAgICAgICAgYnJlYWtfc3RyaW5nKCAiQW0gR2VsZGthcnRlbnNjaGFsdGVyIGthbm5zdCBEdSBkaWUgYmVydWVobXRlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlZXItQ2FyZCAoVE0pIGVyd2VyYmVuIHVuZCBEZWluIEd1dGhhYmVua29udG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXVmZnVlbGxlbi4gQWxsZXJkaW5ncyBoYWJlbiBkYXMgYXVjaCBub2NoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZGVyZSBMZXV0ZSB2b3IgLSBEdSB3aXJzdCBEaWNoIGFsc28gYnJhdiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoaW50ZW4gYW4gZGllIEdlbGRrYXJ0ZW5zY2hsYW5nZSBhbnN0ZWxsZW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXVlc3Nlbi4iLCA3OCApICk7CisKKyAgICBxPUFkZEl0ZW0oIFBBVEgrInF1ZXVlIiwgUkVGUkVTSF9OT05FLAorICAgICAgICAgICAgICAgKFsgUF9TSE9SVCA6ICJFaW5lIFNjaGxhbmdlIHZvciBkZW0gR2VsZGthcnRlbnNjaGFsdGVyIiwKKyAgICAgICAgICAgICAgICBQX0xPTkcgOiAiRGllIFNlZXItQ2FyZCAoVE0pIG11c3MgamEgd2lya2xpY2ggYmVnZWhydCBzZWluLiAiCisgICAgICAgICAgICAgICAgIlp1bWluZGVzdCBzdGVoZW4gbWVocmVyZVxuTGV1dGUgYW4gZGVyIFNjaGxhbmdlIHp1bSAiCisgICAgICAgICAgICAgICAgIkdlbGRrYXJ0ZW5zY2hhbHRlciBhbi5cbiIKKyAgICAgICAgICAgICAgICAiU3ludGF4OiAnc3RlbGwgYW4ga2FydGVuc2NobGFuZ2UgYW4nLlxuIiwKKyAgICAgICAgICAgICAgICBQX0lOVF9TSE9SVCA6ICJJbiBkZXIgU2NobGFuZ2Ugdm9yIGRlbSBHZWxka2FydGVuc2NoYWx0ZXIiLAorICAgICAgICAgICAgICAgIFBfSU5UX0xPTkcgOiAiRHUgc3RlaHQgaW4gZGVyIGxhbmdlbiBTY2hsYW5nZSB2b3IgZGVtICIKKyAgICAgICAgICAgICAgICAiR2VsZGthcnRlbnNjaGFsdGVyLiBXZW5pZ3N0ZW5zIGdlaHRcbmVzIGhhbGJ3ZWdzIGZsb3R0ICIKKyAgICAgICAgICAgICAgICAidm9yd2FlcnRzLlxuIiwKKyAgICAgICAgICAgICAgICBRX0xFTkdUSCA6IDcsCisgICAgICAgICAgICAgICAgUV9DWUNMRV9USU1FIDogOCwKKyAgICAgICAgICAgICAgICBRX1NVU1BFTkQgOiAxLAorICAgICAgICAgICAgICAgIFFfREVTVCA6IFBBVEgrInNjX3NjaGFsdGVyIgorICAgICAgICAgICAgICAgIF0pICk7CisKKyAgICBxLT5BZGRJZCggKHsiZ2VsZGthcnRlbnNjaGxhbmdlIiwgImthcnRlbnNjaGxhbmdlIn0pICk7CisKKyAgICBxPUFkZEl0ZW0oIFBBVEgrInF1ZXVlIiwgUkVGUkVTSF9OT05FLAorICAgICAgICAgICAgICAgKFsgUF9TSE9SVCA6ICJFaW5lIFNjaGxhbmdlIHZvciBkZW0gSGF1c2F1c2dhYmVzY2hhbHRlciIsCisgICAgICAgICAgICAgICAgUF9MT05HICA6ICJJbiBkaWVzZXIgU2NobGFuZ2Ugc3RlaGVuIExldXRlIHZvciBkZW0gIgorICAgICAgICAgICAgICAgICJIYXVzYXVzZ2FiZXNjaGFsdGVyIGFuLlxuIgorICAgICAgICAgICAgICAgICsiU3ludGF4OiAnc3RlbGwgYW4gYXVzZ2FiZXNjaGxhbmdlIGFuJy5cbiIsCisgICAgICAgICAgICAgICAgUF9JTlRfU0hPUlQgOiAiSW4gZGVyIFNjaGxhbmdlIHZvciBkZW0gSGF1c2F1c2dhYmVzY2hhbHRlciIsCisgICAgICAgICAgICAgICAgUF9JTlRfTE9ORyAgOiAiRHUgd2FydGVzdCB2b3IgZGVtIEhhdXNhdXNnYWJlc2NoYWx0ZXIuXG4iLAorICAgICAgICAgICAgICAgIFFfU1VTUEVORCA6IDEsCisgICAgICAgICAgICAgICAgUV9ERVNUIDogUEFUSCsic2JfYXVzZ2FiZSIKKyAgICAgICAgICAgICAgICBdKSApOworICAgIAorICAgIHEtPkFkZElkKCAoeyJoYXVzYXVzZ2FiZXNjaGxhbmdlIiwgImF1c2dhYmVzY2hsYW5nZSIgfSkgKTsKKworICAgIHE9QWRkSXRlbSggUEFUSCsicXVldWUiLCBSRUZSRVNIX05PTkUsCisgICAgICAgICAgICAgICAoWyBQX1NIT1JUIDogIkVpbmUgU2NobGFuZ2Ugdm9yIGRlbSBTY2hhbHRlciB6dXIgUmF0ZW56YWhsdW5nIiwKKyAgICAgICAgICAgICAgICBQX0xPTkcgIDogIldlbm4gRHUgZWluZSBSYXRlIGJlemFobGVuIHdpbGxzdCwgc29sbHRlc3QgRHUgIgorICAgICAgICAgICAgICAgICJEaWNoIGFuIGRpZXNlciBTY2hsYW5nZVxuYW5zdGVsbGVuLlxuIgorICAgICAgICAgICAgICAgICsiU3ludGF4OiAnc3RlbGwgYW4gcmF0ZW5zY2hsYW5nZSBhbicuXG4iLAorICAgICAgICAgICAgICAgIFBfSU5UX1NIT1JUIDogIkluIGRlciBTY2hsYW5nZSB2b3IgZGVtIFNjaGFsdGVyIHp1ciAiCisgICAgICAgICAgICAgICAgIlJhdGVuemFobHVuZyIsCisgICAgICAgICAgICAgICAgUF9JTlRfTE9ORyAgOiAiRHUgd3VuZGVyc3QgRGljaCBlaW4gd2VuaWcgdWViZXIgZGllICIKKyAgICAgICAgICAgICAgICAiTWFzc2VuIHBvdGVudGllbGxlciBSYXRlbnphaGxlci5cbiIsCisgICAgICAgICAgICAgICAgUV9MRU5HVEggOiA4LAorICAgICAgICAgICAgICAgIFFfQ1lDTEVfVElNRSA6IDEwLAorICAgICAgICAgICAgICAgIFFfREVTVCA6IFBBVEgrInNiX2VpbnphaGx1bmciLAorICAgICAgICAgICAgICAgIFFfU1VTUEVORCA6IDEKKyAgICAgICAgICAgICAgICBdKSApOworICAgIAorICAgIHEtPkFkZElkKCAoeyJyYXRlbnNjaGxhbmdlIiwgInJhdGVuemFobHVuZ3NzY2hsYW5nZSIsCisgICAgICAgICAgICAgICAgICAgICJ6YWhsdW5nc3NjaGxhbmdlIiB9KSApOworCisgICAgcT1BZGRJdGVtKCBQQVRIKyJxdWV1ZSIsIFJFRlJFU0hfTk9ORSwKKyAgICAgICAgICAgICAgIChbIFBfU0hPUlQgOiAiRWluZSBTY2hsYW5nZSB2b3IgZGVtIEFudHJhZ3NzY2hhbHRlciIsCisgICAgICAgICAgICAgICAgUF9MT05HICA6ICJEaWUgTGV1dGUgaW4gZGllc2VyIFNjaGxhbmdlIHdvbGxlbiBhbGxlIGVpbiAiCisgICAgICAgICAgICAgICAgImVpZ2VuZXMgSGVpbS5cbiIKKyAgICAgICAgICAgICAgICArIlN5bnRheDogJ3N0ZWxsIGFuIGFudHJhZ3NzY2hsYW5nZSBhbicuXG4iLAorICAgICAgICAgICAgICAgIFBfSU5UX1NIT1JUIDogIkluIGRlciBTY2hsYW5nZSB2b3IgZGVtIEFudHJhZ3NzY2hhbHRlciIsCisgICAgICAgICAgICAgICAgUF9JTlRfTE9ORyAgOiAiRHUgd2FydGVzdCBpbm1pdHRlbiBhbmRlcmVyIEFudHJhZ3NzdGVsbGVyICIKKyAgICAgICAgICAgICAgICAiZGFyYXVmLCBlbmRsaWNoIERlaW5lblxuQmF1c3BhcnZlcnRyYWcgYmVhbnRyYWdlbiB6dSAiCisgICAgICAgICAgICAgICAgImR1ZXJmZW4uXG4iLAorICAgICAgICAgICAgICAgIFFfTEVOR1RIIDogNSwKKyAgICAgICAgICAgICAgICBRX0NZQ0xFX1RJTUUgOiAyMCwKKyAgICAgICAgICAgICAgICBRX1NVU1BFTkQgOiAxLAorICAgICAgICAgICAgICAgIFFfREVTVCA6IFBBVEgrInNiX2FudHJhZyIKKyAgICAgICAgICAgICAgICBdKSApOworICAgIAorICAgIHEtPkFkZElkKCAoeyJhbnRyYWdzc2NobGFuZ2UifSkgKTsKKworICAgIEFkZEV4aXQoICJzdWVkZW4iLCAiL2QvZWJlbmUvcm9vbS9kcmFfc3RyMSIgKTsKKworICAgIEFkZENtZCggKHsgImthdWYiLCAia2F1ZmUiIH0pLCAia2F1ZmVuIiApOworfQorCitzdGF0aWMgaW50CitrYXVmZW4oc3RyaW5nIHN0cikKK3sKKyAgb2JqZWN0IHRwOworCisgIGlmICghc3RyIHx8IHN0ciAhPSAia29tbWVudGFyIikgeworICAgIG5vdGlmeV9mYWlsKCAiV2FzIHdpbGxzdCBEdSBrYXVmZW4/IEhpZXIgZ2lidCBlcyBudXIgS29tbWVudGFyZSFcbiIgKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHRwID0gdGhpc19wbGF5ZXIoKTsKKyAgaWYgKHRwLT5RdWVyeU1vbmV5KCk8MTAwMDApCisgICAgd3JpdGUoICJEdSBoYXN0IG5pY2h0IGdlbnVnIEdlbGQgZGFiZWkhXG4iICk7CisgIGVsc2UgeworICAgIGNsb25lX29iamVjdChQQVRIKyJrb21tZW50YXIiKS0+bW92ZSh0cCwgTV9OT0NIRUNLKTsKKyAgICB0cC0+QWRkTW9uZXkoLTEwMDAwKTsKKyAgICB3cml0ZSggIkR1IHphaGxzdCAxMDAwMCBNdWVuemVuIHVuZCBlcmhhZWx0c3QgZGFmdWVyIGVpbmVuIEtvbW1lbnRhci5cbiIgKTsKKyAgfQorICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL2ZhcS8wIGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvZmFxLzAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI2NzllMQotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL2ZhcS8wCkBAIC0wLDAgKzEsMTAgQEAKKzAuIE5FVUlHS0VJVEVOCistLS0tLS0tLS0tLS0tLQorCitIaWVyIGFrdHVlbGxlIEFlbmRlcnVuZ2VuIGRlciBTZWhlckZBUSAzLjAyIChTdGFuZCBKdWxpIDIwMDEpOgorCistIEVzIGdpYnQgendlaSBuZXVlIFBvcnRhbGUgKDM0IHVuZCAzNikKKworLSBEdXJjaCBlaW5lbiBSaXNzIGluIGRlbiBEaW1lbnNpb25lbiBpc3QgZGVyIFp1Z2FuZyB6dSBlaW5lcgorICBuZXVlbiBQYXJhbGVsbHdlbHQgbW9lZ2xpY2gKKwpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvZmFxLzEgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9mYXEvMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmY5YzNjCi0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvZmFxLzEKQEAgLTAsMCArMSw1NCBAQAorMS4gVFJBTlNQT1JUTU9FR0xJQ0hLRUlURU4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBbHMgU2VoZXIga2FubnN0IER1IG51bm1laHIgYXVmIGVpbmlnZSBuZXVlIEZvcnRiZXdlZ3VuZ3Ntb2VnbGljaGtlaXRlbgorenVncmVpZmVuLCB1bSBzY2huZWxsZXIgdm9uIGVpbmVtIE9ydCB6dW0gYW5kZXJlbiB6dSBnZWxhbmdlbjoKKworYSkgU2VoZXJwb3J0YWxlCistLS0tLS0tLS0tLS0tLS0KKworQWxzIFNlaGVyIGthbm5zdCBEdSBhYiBzb2ZvcnQgbWFnaXNjaGUgUG9ydGFsZSBudXR6ZW4sIHVtIHNjaG5lbGxlcgordm9uIGVpbmVtIE9ydCB6dW0gYW5kZXJlbiB6dSBnZWxhbmdlbi4gRXMgZ2lidCBpbSBNb21lbnQgMzMgVG9yZSwKK2RpZSBEdSBtaXQgZGVtIEJlZmVobCB0ZWxlcG9ydGllcmUgYmVudXR6ZW4ga2FubnN0LiBadXIgVmVyZnVlZ3VuZworc3RlaGVuIERpciBkYW5uIG1vbWVudGFuIGZvbGdlbmRlIE1vZWdsaWNoa2VpdGVuICh3ZW5uIGR1IGFsbGUgUG9ydGFsZSBoYXN0KToKKworICAwLiBuaWNodCB0ZWxlcG9ydGllcmVuICAgICAgICAgICAgICAgICAgMS4gVGFtaWJhciwgRGFyaWJpLURvcmYgKDEwIEtQKQorICAyLiBEcmFjaGVuemlubmVuICAgICAgICAgICAgICAgICAgICAgICAgMy4gUG9ydCBWYWluZXIgU3RhZHR0b3IKKyAgNC4gQW4gZWluZW0gQmFjaCBpbSBHZWJpcmdlICAgICAgICAgICAgIDUuIFBvbGFyZ2ViaWV0CisgIDYuIFR1bmRyYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3LiBEaWUgRmVlbnN0cmFzc2UKKyAgOC4gV2FsZHdlZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkuIEVpbmUgUnVpbmVuc3RhZHQKKyAxMC4gVm9ycGxhdHogdm9yIGRlciBBcmVuYSAgICAgICAgICAgICAgMTEuIEtsaXBwZW5wZmFkIGF1ZiBBdXJvcmEgKDEwIEtQKQorIDEyLiBTdm9sdmFlciAoMTAgS1ApICAgICAgICAgICAgICAgICAgICAxMy4gSW0gQmVyZ2RvcmYKKyAxNC4gVm9ycGxhdHogZGVyIFRyYXVrYXBlbGxlICAgICAgICAgICAgMTUuIExhc2gKKyAxNi4gRHNjaHVuZ2VsICAgICAgICAgICAgICAgICAgICAgICAgICAgMTcuIFVlYmVyIGRlbiBXb2xrZW4KKyAxOC4gQW0gRmx1c3MgVGFpbiBXZW4gVGFpICAgICAgICAgICAgICAgMTkuIFJpdHRlcmRlbmttYWwgYmVpIE9ya2hhdXNlbgorIDIwLiBSb2RlbGJhaG4gICAgICAgICAgICAgICAgICAgICAgICAgICAyMS4gSG9iYml0ZG9yZgorIDIyLiBFaW4gdGllZmVyIFdhbGQgKDEwIEtQKSAgICAgICAgICAgICAyMy4gVWViZXIgZGVtIFNjaGFjaHQKKyAyNC4gQW0gRW5kZSBkZXIgV2VsdCAoMTAgS1ApICAgICAgICAgICAgMjUuIEFtIEZyaWVkaG9mCisgMjYuIFVudGVyIFNoYWt5IElzbGFuZCAoMTAgS1ApICAgICAgICAgIDI3LiBJbiBkZXIgTmFlaGUgZGVyIEZlc3R1bmcKKyAyOC4gVG9ydHVnYXMgTGV1Y2h0dHVybSAoMTAgS1ApICAgICAgICAgMjkuIEthdHptYW5kdQorIDMwLiBJbiBlaW5lciBIb2VobGUgZGVyIFJpZXNlbmluc2VsICAgICAzMS4gQXVmIGVpbmVtIGtsZWluZW4gQmVyZ3BmYWQKKyAzMi4gUG9ydGFscmF1bSAgICAgICAgICAgICAgICAgICAgICAgICAgMzMuIEluIGRlciBOYWVoZSB2b24gVW1qYWsKKyAzNC4gRWluIEZlbHNlbiBhbSBCYWNoICAgICAgICAgICAgICAgICAgMzYuIElubnVpdC1TaWVkbHVuZworIDM3LiBCZWkgZGVuIFdlcndvZWxmZW4gICAgICAgICAgICAgICAgICAzOC4gTm9yZHN0cmFuZCB2b24gS3J5bGFpb3MKKyAzOS4gQmVpIGVpbmVtIHNjaHdhcnplbiBGZWxzZW4gICAgICAgICAgNDAuIERlciBBYmdydW5kIGRlcyBab3JucworCitEYXMgQmVudXR6ZW4gZGVyIFBvcnRhbGUgc2V0enQgYWxsZXJkaW5ncyB2b3JhdXMsIGRhc3MgRHUgZGllc2UgUG9ydGFsZQorYmVyZWl0cyBnZWZ1bmRlbiBoYXN0LiBEdSBtdXNzdCBkaWUgUG9ydGFsZSBhbHNvIHp1bmFlY2hzdCBlaW5tYWwKK3N1Y2hlbi4KK0VpbmlnZSBQb3J0YWxlIGF1ZiBkZW4gSW5zZWxuIGtvc3RlbiBLUHMsIGRpZSBtZWlzdGVuIGplZG9jaCBuaWNodHMuCitEYSBkYW5hY2ggaW1tZXIgd2llZGVyIGdlZnJhZ3Qgd2lyZDogTmF0dWVybGljaCBrYW5uIG1hbiBkaWUgUG9ydGFsZSBudXIKK2JlbnV0emVuLCB3ZW5uIG1hbiBzaWNoIGdlcmFkZSBiZWkgZWluZW0gYmVmaW5kZXQuCisKKworYikgU2llYmVubWVpbGVuc3RpZWZlbAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitEaWVzZSBrYW5uIG1hbiBpbSBTZWhlcmxhZGVuIGthdWZlbi4gU2llIGhhYmVuIGRpZSBFaWdlbnNjaGFmdCwKK2locmVuIFRyYWVnZXIgaW1tZXIgYmlzIHp1ciBuYWVjaHN0ZW4gS3JldXp1bmcgd2VpdGVyenV0cmFnZW4sIHdhcyBiZWkKK2xhbmdlbiBXZWdlbiBzaW5udm9sbCBzZWluIGthbm4sIGluIHZpZWxlbiBHZWdlbmRlbiBqZWRvY2ggbmljaHQKK2Z1bmt0aW9uaWVydCwgd2VpbCBpbiBqZWRlbSBSYXVtIG1laHIgYWxzIHp3ZWkgQXVzZ2FlbmdlIHZvcmtvbW1lbi4KK0F1c3NlcmRlbSBpc3QgZGFzIEdhbnplIGV4dHJlbSBnZXdvZWhudW5nc2JlZHVlcmZ0aWcsIGRhIG1hbiBiZWthbm50ZQorV2VnZSBqZXR6dCBtaXQgZ2FueiBhbmRlcmVuIFRhc3RlbmtvbWJpbmF0aW9uZW4gYWJnZWh0LCBhbHMgd2VubiBtYW4gZGllCitXZWdlIGVpbmZhY2ggd2llIGdld29obnQgJ3J1bnRlcnJhdHRlcnQnLiBFaW5mYWNoIG1hbCBhdXN0ZXN0ZW4sCitsdXN0aWcgaXN0cyBhbGxlbWFsLgpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvZmFxLzEwIGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvZmFxLzEwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZmZiNjEKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9mYXEvMTAKQEAgLTAsMCArMSw0MiBAQAorMTAuIFBBUkFMTEVMRElNRU5TSU9OCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2Fyc2NoZWlubGljaCBoYXN0IER1IHNjaG9uIGltbWVyIGdlZGFjaHQ6ICdFaW5lIFdlbHQgamVuc2VpdHMgZGVzCitNb3JnZW5HcmF1ZW5zIGdpYnQgZXMgZ2VuYXVzb3dlbmlnIHdpZSBHZWhlaW1idWVuZGUhJworTnVuLCBiZXp1ZWdsaWNoIGRlciBHZWhlaW1idWVuZGUga29lbm50ZSBkYXMgenV0cmVmZmVuLCB1bmQgbmF0dWVybGljaAorc29sbHN0IER1IGF1Y2gga2VpbmUgV2VsdCBoYWJlbiBuZWJlbiBkZW0gTW9yZ2VuR3JhdWVuLCBhYmVyIGVzIGdpYnQKK2ltIE1VRCBlaW5lIFdlbHQsIGRpZSBudXIgU2VoZXIgYmV0cmV0ZW4ga29lbm5lbjoKKworRGllIFBhcmFsbGVsZGltZW5zaW9uCisKK0RpZSBQYXJhbGxlbHdlbHQgaXN0IGltIFByaW56aXAgZGllIGdlbmF1IGdsZWljaGUgV2VsdCB3aWUgZGFzCisnbm9ybWFsZScgTW9yZ2VuZ3JhdWVuLCBtaXQgZGVtIFVudGVyc2NoaWVkLCBkYXNzIGFuIGJlc3RpbW10ZW4gU3RlbGxlbiwKK2FuIGRlbmVuIGluIGRlciAnTm9ybWFsd2VsdCcga2VpbmUgTlBDcyBzdGVoZW4sIG5ldWUgb2RlciBlYmVuIGFuZGVyZQorTW9uc3RlciBzdGVoZW4uIEluIGdhbnogc2VsdGVuZW4gRmFlbGxlbiAobGVpZGVyKSBpc3Qgc29nYXIgZGllIFJhdW0tCitiZXNjaHJlaWJ1bmcgaW4gZGVyIFBhcmFsbGVsd2VsdCBhbmRlcnMgYWxzIGluIGRlciBub3JtYWxlbiBXZWx0LgorCitCZWlzcGllbGUgZnVlciB1bnRlcnNjaGllZGxpY2hlIFJhZXVtZSBpbiBkZXIgUGFyYWxsZWx3ZWx0IHNpbmQgei5CLjoKKworLSBEcmFjaGVuc2NoaWxka3JvZXRlICh3LG4sbix3LHcgdm9tIFNhbmR0aWdlcikKKy0gV2VnaGllciAoTGljaHR1bmcgaW0gR3JpbW1zd2FsZCwgZGEsIHdvIGluIGRlciBOb3JtYWx3ZWx0IGRpZSBGJkUgaXN0KQorCitNb21lbnRhbiBpc3QgZGllIFBhcmFsbGVsZGltZW5zaW9uIHNjaG9uIGVpbmUgcmVsYXRpdiBncm9zc2UgV2VsdCwgZGllCithdWNoIHN0YWVuZGlnIHdhZWNoc3QuIEZ1ZXIga2xlaW5lcmUgU2VoZXIgaXN0IHNpZSB2aWVsbGVpY2h0IHp1IGhhcnQsCithbSBBbmZhbmcga29lbm5lbiBzaWUgc2ljaCBhYmVyIHouQi4gaW0gUGFyYWdvYmxpbmxhZ2VyIGJlaSBQb3J0IFZhaW4KK2F1c3RvYmVuLiBGdWVyIGRpZSBob2VoZXJlbiBTZWhlciBzaW5kIGVoZXIgc29sY2hlIFNhY2hlbiB3aWUgZGVyCitXZWdoaWVyIG9kZXIgZGllIFBhcmFncnVmdCB2b3IgZGVyIFBvbGFyd3Vlc3RlIGludGVyZXNzYW50LgorCitCZXRyZXRlbiBrYW5uIG1hbiBhbHMgU2VoZXIgZGllIFBhcmFsbGVsd2VsdCBhbSBlaW5mYWNoc3RlbiB1bmQKK3NpY2hlcnN0ZW4gdWViZXIgZGFzIFBvcnRhbCBpbSBvYmVyc3RlbiBHZXNjaG9zcyB2b24gTWlyaWxzIFR1cm0KKyhFYmVuZSBiZWkgRHJhY2hlbmhvcnQpCitBbGxlcmRpbmdzIHRyYW5zcG9ydGllcnQgZGFzIFBvcnRhbCBudXIgenUgOTglIFdhaHJzY2hlaW5saWNoa2VpdCwgdW5kCittYW4gc29sbHRlIGF1ZnBhc3NlbiwgZGEgZG9ydCBpbiBkZXIgTmFlaGUgZGllIFNlaGVyLVJhZXViZXIgdm9uIFJvY2h1cworaW0gR2VidWVzY2ggc2l0emVuLCBkaWUgZWluZW4gc2NobmVsbCB6dSBzaWNoIGdlem9nZW4gaGFiZW4sIGRvcnQga29tbXQKK21hbiBkYW5uIG51ciBub2NoIHJhdXMsIGluZGVtIG1hbiBkYXMgR2VsZCBhYmdpYnQgb2RlciBrYWVtcGZ0IDopCitBdXNzZXJkZW0gc3RlaHQgaW4gZGVyIFBhcmF3ZWx0IGFtIFBvcnRhbCAyIChkYXMgaXN0IGRhcyBuYWVjaHN0ZSBiZWkKK01pcmlscyBUdXJtKSBkZXIgc29nZW5hbm50ZSBIdW9ybiwgZGFzIGlzdCBlaW4gQmF1bSwgZGVyIGVpbmVtIFNhY2hlbgora2xhdXQgKGJvZXNlIHp1IFBhdHJ5biBydWViZXJzY2hpZWwgOikpIERlc2hhbGIgc29sbHRlIG1hbiBkYSBhdWNoIGF1ZnBhc3Nlbi4KKworR2VydWVjaHRlbiB6dWZvbGdlIHNvbGwgZXMgbWl0dGxlcndlaWxlIHNvZ2FyIGVpbmVuIG5ldWVuIFJpc3MgaW4gZGVuCitEaW1lbnNpb25lbiBnZWJlbiwgZGVyIFp1dHJpdHQgenUgZWluZXIgdmllbGxlaWNodCBub2NoIGdlZmFlaHJsaWNoZXJlbgorV2VsdCBlcm1vZWdsaWNodC4KZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL2ZhcS8xMSBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL2ZhcS8xMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzVmYzU3Ci0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvZmFxLzExCkBAIC0wLDAgKzEsMTMgQEAKKzExLiBQYXJhLVBvcnRhbCA4CistLS0tLS0tLS0tLS0tLS0tLQorCitWaWVsZSB3ZXJkZW4gc2ljaCBqZXR6dCB2aWVsbGVpY2h0IGZyYWdlbjogV2FydW0gd2lkbWV0IG1hbiBlaW5lbQorZWluZmFjaGVuIE1hZ2lzY2hlbiBQb3J0YWwgZWluIGdhbnplcyBVbnRlcmthcGl0ZWwsIGFiZXIgZXMgaXN0IG1laW5lcgorQW5zaWNodCBuYWNoIG5vdHdlbmRpZy4gRGFzIFBvcnRhbCA4IGlzdCBkYXMgYmlzIGpldHp0IGVpbnppZ2UgUG9ydGFsLCBkYXMKK2luIGRlciBQYXJhd2VsdCBhbmRlcnMgaXN0IGFscyBpbiBkZXIgTm9ybWFsd2VsdC4gRXMgaGF0IGFuZGVyZSwgenVtCitncm9lc3N0ZW4gVGVpbCBuaWNodCB1bmdlZmFlaHJsaWNoZSwgWmllbGUgYWxzIGRhcyBpbiBkZXIgTm9ybWFsd2VsdC4KK1dlbGNoZSBaaWVsZSBkaWVzIG51biBzaW5kLCB2ZXJyYXRlIGljaCBuYXR1ZXJsaWNoIG5pY2h0LCBkYXMgc29sbHRldAoraWhyIHNjaG9uIHNlbGJzdCBoZXJhdXNiZWtvbW1lbiAoZW50d2VkZXIgZnJhZ3QgaWhyIGFuZGVyZSBTZWhlciwgb2RlcgorcHJvYmllcnQgZXMgIVNFSFIgdm9yc2ljaHRpZyEgYXVzKS4gSWhyIHNvbGx0ZXQgZXMgZXVjaCBhdWYgamVkZW4gRmFsbCBtYWwKK2Fuc2NoYXVlbiwgZGVubiBlcyBoYXQgYXVjaCBzZWluZSBndXRlbiBTZWl0ZW4uLi4KKwpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvZmFxLzEyIGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvZmFxLzEyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NGZmNWEKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9mYXEvMTIKQEAgLTAsMCArMSwxMyBAQAorMTIuIEZJTkdFUi1CRUZFSEwKKy0tLS0tLS0tLS0tLS0tLS0KKworV2VubiBEdSBlaW5tYWwgcHJvYmllcnN0LCBlaW5lbiBhbmRlcmVuIFNwaWVsZXIgenUgZmluZ2Vybiwgd2lyc3QgRHUKK2Zlc3RzdGVsbGVuLCBkYXNzIER1IG51biBlaW5pZ2UgenVzYWV0emxpY2hlIEluZm9ybWF0aW9uZW4KK2VyaGFlbHN0LCBiZWkgbm9ybWFsZW4gU3BpZWxlcm4gaWhyIEFsdGVyLCB1bmQgYmVpIFNlaGVybiAvIE1hZ2llcm4KK3p1c2FldHpsaWNoIGRpZSB1ZWJlciBQbGFuIHVuZCBQcm9qZWt0IGVpbmdlZ2ViZW5lbiBJbmZvcm1hdGlvbmVuLgorCitTbywgdW5kIHdlbm4gRHUgZGFubiBhdWNoIG9iZW5kcmVpbiBuaWNodCBhbGx6dSB6aW1wZXJsaWNoIGJpc3QsIHVuZAorZ2VybmUgTGV1dGUgRGljaCBmaW5nZXJuIGxhZXNzdCwgc28gd2lyc3QgRHUgbmF0dWVybGljaCBhdWNoIGVpbmVuIFBsYW4KK3VuZCBlaW4gUHJvamVrdCBpbiBEZWluZW0gJ2ZpbmdlcicgZWluc2V0emVuLiBEaWVzIGthbm5zdCBEdSBtaXQgSGlsZmUKK2RlcyBQbGFuZWRpdG9ycyBtYWNoZW4sIGRlbiBEdSBpbSBTZWhlcmxhZGVuIGVyaGFlbHN0LgorCmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9mYXEvMTMgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9mYXEvMTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc2MzgyNwotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL2ZhcS8xMwpAQCAtMCwwICsxLDE3IEBACisxMy4gRUNITyAmIFItRU1PVEUKKy0tLS0tLS0tLS0tLS0tLS0tLQorCitTb2xsdGVzdCBEdSBpcmdlbmR3YW5uIGRpZSBRdWVzdCAiSGlsZiBkZW0gQXJjaGl0ZWt0ZW4iIGdlbG9lc3QgaGFiZW4KKyh3YXMgZHJpbmdlbmQgenUgZW1wZmVobGVuIGlzdCwgZGVubiBkYXMgaXN0IGRlZmluaXRpdiBlaW5lcyBkZXIgYmVzdGVuCitxdWVzdHMgaGllciwgSU1ITykgLSBkYW5uIHN0ZWh0IERpciBhbHMgU2VoZXIgaGludGVyaGVyIGRlciBFQ0hPLUJlZmVobAorenVyIFZlcmZ1ZWd1bmcsIG1pdCBkZXNzZW4gSGlsZmUgRHUgaW4gZGVyIExhZ2UgYmlzdCwgZWluZW4geC1CZWxpZWJpZ2VuCitUZXh0IGluIGRlbSBSYXVtIGFienVzZXR6ZW4sIGluIGRlbSBEdSBEaWNoIGJlZmluZGVzdCwgc28gZGFzcyBhdWNoIGFsbGUKK2FuZGVyZW4gU3BpZWxlciBkaWVzZW4gVGV4dCBsZXNlbiBrb2VubmVuLi4uCitOZXR0ZSBTcGllbGVyZWksIGRpZSBsZWlkZXIgNTAgTVAga29zdGV0LCBhYmVyIHRyb3R6ZGVtIGltbWVyIHp1IGVpbmVtCitrbGVpbmVuIEdhZyBndXQgaXN0LgorCitTb2xsdGVzdCBEdSBkaWUgU2VoZXJxdWVzdCAnRGllIEtyaXN0YWxsa3VnZWwnIGdlbG9lc3QgaGFiZW4sIHNvIHN0ZWh0CitEaXIgYXVjaCBkYXMgJ3ItZW1vdGUnIHp1ciBWZXJmdWVndW5nLCBkYXMgZXMgRGlyIGVybW9lZ2xpY2h0LCBkYXMgc2VpdAorZGVyIExvZXN1bmcgZGVzIEFtYXJ5bGxpcy1RdWVzdHMgKGhhc3QgRHUgZG9jaCB3b2hsICEhKSBtb2VnbGljaGUgJ2Vtb3RlJworYXVjaCBhdWYgU3BpZWxlciBhdXNzZXJoYWxiIGRlcyBSYXVtZXMgYW56dXdlbmRlbi4KKwpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvZmFxLzE0IGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvZmFxLzE0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZDE1YjMKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9mYXEvMTQKQEAgLTAsMCArMSw1NSBAQAorMTQuIFNFSEVSSEFFVVNFUgorLS0tLS0tLS0tLS0tLS0tLQorCitJbnRlcmVzc2FudGVzIFRoZW1hOiBEaWUgU2VoZXJoYXVzZXI6IFNpZSBnaWJ0IGVzIG51biBzZWl0IGNhLiBNaXR0ZQorT2t0b2JlciA5NCwgdW5kIGZvbGdlbmRlcyBpc3QgZGF6dSBhbnp1bWVya2VuOgorCitJbiBkZXIgQmF1c3Bhcmthc3NlIGluIERyYWNoZW5ob3J0IGdpYnQgZXMgZGllIG5vZXRpZ2VuIEluZm9ybWF0aW9uZW4genUKK2RlbiBIYXVlc2Vybi4gRGFzIEluZm9ybWF0aW9uc2JsYXR0IGZ1ZXIgMTAuMDAwIE11ZW56ZW4gc29sbHRlIG1hbiBzaWNoCitlYmVuIHp1bGVnZW4sIGF1Y2ggd2VubiBudXIgZWluZSBTZWl0ZSBJbmZvcyBkcmluc3RlaGVuLCB1bmQgZXMgbmFjaCBkZW0KK2Vyc3RlbiBMZXNlbiB3ZWcgaXN0IDooKC4KKworR3J1bmRzYWV0emxpY2ggZ2lidCBlcyB6d2VpIE1vZWdsaWNoa2VpdGVuLCB6dSBlaW5lbSBIYXVzIHp1IGtvbW1lbjoKKworYSkgRGVyIHNjaG5lbGxlIFZlcnRyYWc6IEtvc3RldCAyIE1pbyBFUHMsIG1hbiBtdXNzIGFsbGUgMiBvbmxpbmUgU3R1bmRlbgorZWluZSBSYXRlIHZvbiA4MC4wMDAgRVBzIGVpbnphaGxlbiAtIGluc2dlc2FtdCBhbHNvIDI1IFJhdGVuLiBEaWUgWmVpdCBrYW5uCit1LlUuIG5hY2ggZWluZW0gQ3Jhc2ggZXR3YXMga25hcHAgd2VyZGVuLCBkYSBtYW4gZGFubiBuaWNodCBkaWUgbm9ldGlnZQorWmVpdCBoYXQsIHVtIHNpY2ggc2VsYnN0IGVyc3RtYWwgQXVzcnVlc3R1bmcgenUgYmVzb3JnZW4sIHVuZCBqYSB2b3IgYWxsZW0KK2FsbGUgU3BpZWxlciBkYWJlaSBzaW5kLCBzaWNoIEF1c3J1ZXN0dW5nIHp1IGJlc2NoYWZmZW4sIHNvIGRhc3MgbmljaHQKK3ZpZWwgenUgaG9sZW4gaXN0LgorCitiKSBEZXIgbGFuZ3NhbWUgVmVydHJhZzogS29zdGV0IDIuNCBNaW8gRXBzIC0gYWxzbyAzMCBSYXRlbiwgbWFuIG11c3MgYWxsZQorNCBvbmxpbmUgU3R1bmRlbiBzZWluZSBSYXRlIHZvbiA4MC4wMDAgRVBzIGVpbnphaGxlbi4gU2ljaGVyIGJlc3NlciBnZWVpZ25ldAorZnVlciBkaWVqZW5pZ2VuLCBkaWUgb2Z0IHRhbGtlbiwgdW5kIG5pY2h0IGRpZSBuYWVjaHN0ZSBXb2NoZSBudXIgbWl0IG1ldHplbG4KK3ZlcmJyaW5nZW4gd29sbGVuIC0gR2VzY2htYWNrc3NhY2hlLi4uLiBuYXR1ZXJsaWNoIGthbm4gbWFuIGJlaSBiZWlkZW4KK1ZlcnRyYWdzYXJ0ZW4gYXVjaCBzY2huZWxsZXIgZWluemFobGVuLCBhbHNvIG11c3MgbWFuIHNpY2gga2VpbmUgU29yZ2UgbWFjaGVuLAorZGFzcyBtYW4gYmVpbSA0LXN0dW5kZW4gVmVydHJhZyBld2lnIHdhcnRlbiBtdXNzLCBiaXMgbWFuIGVpbmVuIG5ldWVuCitNYXN0ZXJibG9jayBrcmllZ3QsIGF1ZiBkZW0gZGllIEd1dGhhYmVuIGd1dGdlc2NocmllYmVuIHdlcmRlbi4KKworV2VsY2hlIFZlcnRyYWdzZm9ybSBtYW4gd2FlaGx0LCBpc3QgZWluZW0gc2VsYnN0IHVlYmVybGFzc2VuLi4uLiBhYmVyCit1ZWJlcmxlZ3MgRGlyIGd1dCwgb2IgRHUgZGllIFplaXQgenVtIHRhbGtlbiBiZWhhbHRlbiB3aWxsc3QsIGRlbm4gZGllIHdpcmQKK2JlaW0gMmggLSBWZXJ0cmFnIHNjaG5lbGwga25hcHAgLSBuaWNodCB6dSB2ZXJnZXNzZW4gZGllIFRhdHNhY2hlLCBkYXNzIGJlaQorVWViZXJ6aWVoZW4gZGVyIEVpbnphaGx1bmdzemVpdCBmdWVyIGRpZSBlaW56ZWxuZW4gUmF0ZW4genVuYWVjaHN0IGVpbmUKK3NhZnRpZ2UgU3RyYWZlIGZhZWxsaWcgd2lyZCAoZXMgc2VpIGRlbm4sIGRlciBNYXN0ZXJibG9jayBpc3Qgdm9sbCksCit1bmQgZGFubiBzb2dhciBkZXIgZ2FuemUgVmVydHJhZyBmbG9ldGVuIGdlaGVuIGthbm4uLi4uCisKK0ltIFNlaGVyaGF1cyBrb2VubmVuIGF1Y2ggRXh0cmEtUmFldW1lIGVpbmdlYmF1dCB3ZXJkZW4uIERpZXNlIGtvc3RlbiBwcm8KK1N0dWVjayBlbnR3ZWRlciAxMDE3NjAwIEVQcyAoMiBPbmxpbmVzdHVuZGVuKSBvZGVyIDg0ODAwMCBFUHMgKDEgT25saW5lc3R1bmRlKQorTWF4aW1hbCBrb2VubmVuIDkgUmFldW1lIGFuIGRhcyBIYXVzIGFuZ2ViYXV0IHdlcmRlbi4gU29mZXJuIGluIGVpbmVtIFJhdW0KK21laHJlcmUgSGFldXNlciBzdGVoZW4sIGJlc3RlaHQgYXVjaCBkaWUgTW9lZ2xpY2hrZWl0LCBkaWUgZHVyY2ggZGVuIEJlZmVobAorQXVzZ2FuZyBtaXRlaW5hbmRlciB6dSB2ZXJiaW5kZW4uCisKK0luIGRlbiBTZWhlcmhhZXVzZXJuIHNpbmQgc2VpdCBGZWJydWFyICcgOTUgZGFzIEJlc2NocmVpYmVuIHZvbgorQmVmZWhsZW4gdW5kIHNwZXppZmlzY2hlIEF1c2dhYmVuIG1vZWdsaWNoLiBTbyBrYW5uIG1hbiByYXNzZW4tIHVuZAorZ2VzY2hsZWNodHNzcGV6aWZpc2NoZSBBdXNnYWJlbiBtYWNoZW4uIEViZW5zbyBpc3QgZXMgbW9lZ2xpY2gsCitkdXJjaCBFaW5nYWJlIHZvbiBCZWZlaGxlbiBiZXN0aW1tdGUgQXVzZ2FiZW4genUgZXJyZWljaGVuLCB6LkIuCisnZHJ1ZWNrZSBrbm9wZicgLSAnIGVpbiBGYWRlbiBmYWVsbHQgdm9uIGRlciBEZWNrZScgdXN3LiBXaWUgZGFzIHZvcgorc2ljaCBnZWh0LCB3YWVyZSBoaWVyIHp1IHVtZmFzc2VuZCwgYXVzc2VyZGVtIGhhdCBXYXJnb24gZWluZQoraGVydm9ycmFnZW5kZSBIaWxmZXNlaXRlIHp1IGRlbiBIYWV1c2VybiBlcnN0ZWxsdCwgZGllIHNlaHIKK2RldGFpbGxpZXJ0IGVya2xhZXJ0LCB3aWUgbWFuIHZvcmdlaGVuIG11c3MuCisKK0Rlc3dlaXRlcmVuIGthbm4gbWFuIG51biBkaWUgVHJ1aGUgaW4gZGVuIFNlaGVyaGFldXNlcm4gdmVyc2NoaWViZW4sCit1bWJlbmVubmVuIHVuZCBpaHIgZWluZW4gRXh0cmFsb29rIGdlYmVuLiAgQXVzc2VyZGVtIGthbm4gZGllIEhhdXN0dWVyCittaXQgc3BlemllbGxlbiBGdW5rdGlvbmVuIGluIGRpZSBBdXNzZW5iZXNjaHJlaWJ1bmcgZGVzIEhhdXNlcyBlaW5nZWJhdXQKK29kZXIgdW5zaWNodGJhciBnZW1hY2h0IHdlcmRlbi4gQXVjaCBoaWVyenUgZW1wZmVobGUgaWNoIGRpZSBMZWt0dWVyZQorZGVyIEhpbGZlLSBTZWl0ZSB6dW0gU2VoZXJoYXVzLgpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvZmFxLzE1IGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvZmFxLzE1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYmI0N2MKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9mYXEvMTUKQEAgLTAsMCArMSwxMiBAQAorMTUuIE5BQ0hXT1JUCistLS0tLS0tLS0tLS0KKworRXJ3YWVobmVuIHdpbGwgaWNoIGF1Y2ggbm9jaCwgZGFzcyBtYW4gc2ljaCBhbHMgU2VoZXIgYXVjaCBuaWNodCBzY2hldWVuCitzb2xsdGUgZGllIGhvZWhlcmVuIFNlaGVyIHp1IGZyYWdlbiwgd2VubiBtYW4gZXR3YXMgbmljaHQgd2Vpc3MsIGRpZQorbWVpc3RlbiB3ZXJkZW4gZGFubiBhdWNoIGFudHdvcnRlbiwgc29sYW5nZSBkZXIgVW1nYW5nc3RvbiBpbiBPcmRudW5nCitpc3QgOikgTWFuIGthbm4gYWJlciBuaWNodCBudXIgZGlyZWt0IGRpZSBTZWhlciBmcmFnZW4sIHNvbmRlcm4gc29sbHRlCithdWNoIF9pbW1lcl8gZGllIFNlaGVyLUViZW5lICAoLWgrKSBlaW5nZXNjaGFsdGVuIGhhYmVuLCBkYSBkb3J0IG9mdAoraW50ZXJlc3NhbnRlIERpbmdlIGRpc2t1dGllcnQgd2VyZGVuIChuYXR1ZXJsaWNoIGF1Y2ggdmllbCBTdHVzcyA6KSkpCitBdWNoIHNvbGx0ZSBtYW4gcmVnZWxtYWVzc2lnIGRpZSBTZWhlci1SdWJyaWtlbiBpbiBkZXIgTVBBIGxlc2VuLCB3ZW5uIG1hbgorYXVmIGRlbSBsYXVmZW5kZW4gYmxlaWJlbiB3aWxsLgorCmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9mYXEvMTYgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9mYXEvMTYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVkMzY4MAotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL2ZhcS8xNgpAQCAtMCwwICsxLDE0IEBACisxNi4gREFOS1NBR1VOR0VOCistLS0tLS0tLS0tLS0tLS0tCisKK0Fic2NobGllc3NlbmQgbW9lY2h0ZSBpY2ggbm9jaCBlaW4gR1JPU1NFUyBEQU5LRVNDSE9FTiBhbiBSeW5lIHJpY2h0ZW4sIGRlcgorZGllIFZvcmZhc3N1bmcgZGllc2VyIEZBUSBnZXNjaHJpZWJlbiBoYXQsIHVuZCB2b24gZGVtIGljaCBhdWNoIG5vY2ggZWluaWdlcwordWViZXJub21tZW4gaGFiZSAoZmF1bCB3aWUgaWNoIGJpbiA6KSkKK1VuZCBhdWNoIGFuIFplcGh5ciBub2NoIGVpbiBncm9zc2VzIERhbmtlc2Nob2VuLCBkYSBzaWUgZGllc2UgRkFRIGZ1ZXIgbWljaAora29ycmVrdHVyZ2VsZXNlbiBoYXQsIHVuZCBtaWNoIGF1Y2ggbm9jaCBhdWYgZWluaWdlcyBoaW5nZXdpZXNlbiBoYXQgOikKK0RhcyBsZXR6dGUgRGFua2VzY2hvZW4gZ2VodCBhbiBSaWt1cywgZGVyIHNpY2ggZnJldW5kbGljaGVyd2Vpc2UgZGllIFplaXQKK2dlbm9tbWVuIGhhdCwgZGllc2UgRkFRIGluIGRlbiBTZWhlcmxhZGVuIHp1IGJyaW5nZW4sIHVuZCBtaXIgYXVjaAorZXJtb2VnbGljaHQgaGF0LCBzaWUgaW1tZXIgdXAgdG8gZGF0ZSB6dSBoYWx0ZW4gOikKKworCitTdGluZwpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvZmFxLzIgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9mYXEvMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjI4ZWIyCi0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvZmFxLzIKQEAgLTAsMCArMSwxOSBAQAorMi4gU0VIRVJRVUVTVAorLS0tLS0tLS0tLS0tLQorCitFaW5lIHJlY2h0IHNjaG9lbmUgUXVlc3QgbnVyIGZ1ZXIgU2VoZXIgaGF0IFRyb3kgaW0gRnJ1ZWhqYWhyIDE5OTUKK2dlc2NocmllYmVuLCBhbGxlcmRpbmdzIHd1cmRlIHNpZSBlcnN0IDQgTW9uYXRlIHNwYWV0ZXIKK2FuZ2VzY2hsb3NzZW4sIG5hY2hkZW0gQm9pbmcgZWluZSBNZW5nZSBCdWdzIGdlZml4dCBoYXR0ZS4gV2llIGF1Y2gKK2ltbWVyOgorRWluZSBsb2huZW5kZSBRdWVzdCwgbWl0IFNpY2hlcmhlaXQgZGllIHNjaG9lbnN0ZSwgZGllIFRyb3kgaGllcgorZ2VzY2hyaWViZW4gaGF0LCBzaWUgaXN0IGF1Y2ggc2VociBsb2dpc2NoIHVuZCBkaWUKK1N0aW1tdW5nIHZvciBPcnQgd2lya2xpY2ggZ3V0LiBBbHNvIHVuYmVkaW5ndCBzcGllbGVuLCBuaWNodCB6dWxldHp0LAord2VpbCBkaWUgQmVsb2hudW5nIGRhZnVlciB3aXJsaWNoIGdlbHVuZ2VuIGlzdCwgYmVzc2VyOiBkaWUgQmVsb2hudW5nZW4hCitEZW5uIGEpIGVyaGFlbHQgbWFuIGVpbmUgS3Jpc3RhbGxrdWdlbCwgbWl0IGRlciBtYW4gU3BpZWxlciBmdWVyIGVpbmVuCitNYWdpZXB1bmt0IGZpbmRlbiBrYW5uIChzaWVoZSBhdWNoOiBLYXAuIDY6IE1hZ2lzY2hlIEt1Z2VsKSwgdW5kIAorYikgZXJoYWVsdCBtYW4gZGFzIFItRW1vdGUsIG1pdCBkZW0gbWFuIHNlaW4gRW1vdGUsIGRhcyBtYW4gZnVlciBkaWUKK0FtYXJ5bGxpcy1RdWVzdCBlcmhhbHRlbiBoYXQsIGF1Y2ggYXVmIFNwaWVsZXIgYXVzc2VyaGFsYiBkZXMgUmF1bWVzIGluCitkZW0gbWFuIHNpY2ggYmVmaW5kZXQsIGFud2VuZGVuIGthbm4uIAorCitWaWVsIFNwYXNzIGJlaW0gUXVlc3RlbiAhISEKKwpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvZmFxLzMgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9mYXEvMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2ZjMTFhCi0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvZmFxLzMKQEAgLTAsMCArMSwyMyBAQAorMy4gRkxVQ0hUUklDSFRVTkcKKy0tLS0tLS0tLS0tLS0tLS0tCisKK0V0d2FzIHVuc2NoZWluYmFyLCBhYmVyIGluIG1laW5lbiBBdWdlbiBpc3QgZGllcyBpbW1lciBub2NoIGRlcgord2VydHZvbGxzdGUgQmVmZWhsLCBkZW4gbWFuIGFscyBTZWhlciBuZXUgZXJoYWVsdDoKKworZmx1Y2h0cmljaHR1bmcgPFJpY2h0dW5nL0JlZmVobD4KKworQWIgc29mb3J0IGthbm5zdCBEdSBkZW4gQmVmZWhsICdmbHVjaHRyaWNodHVuZycgYW53ZW5kZW4uCitTb2xsdGUgZGllc2VyIG5vY2ggbmljaHQgYWt0aXZpZXJ0IHNlaW4sIG11c3N0IGR1IGVpbm1hbCBFbmRlIG1hY2hlbi4KK0RhbmFjaCBrYW5uc3QgRHUgc2VsYnN0IGJlc3RpbW1lbiwgaW4gd2VsY2hlIFJpY2h0dW5nIGR1IGZsaWVoc3QsIHdlbm4gZGllCitBbmdzdCBEaWNoIG1hbCB1ZWJlcmtvbW1lbiBzb2xsdGUgKHdlbm4gZGllIFZvcnNpY2h0IHp1c2NobGFlZ3QpCitBYmVyIEFjaHR1bmc6IERlciBCZWZlaGwgZnVua3Rpb25pZXJ0IGVyc3QgYmVpIGVpbmVtIFNwaWVsZXJsZXZlbCB2b24gNTAKK29kZXIgaG9laGVyIG1pdCAxMDAlIFdhaHJzY2hlaW5saWNoa2VpdCwgZGFydW50ZXIgamV3ZWlscyBuaWVkcmlnZXIuCitUaXA6ICdmbHVjaHRyaWNodHVuZyBzY2hsYWZlIGVpbicgZnVua3Rpb25pZXJ0IGF1Y2gsIGViZW5zbyB3aWU6CisnZmx1Y2h0cmljaHR1bmcgdGVpbGUgQm9pbmcgbWl0IER1LCBpY2ggc3RlcmJlIGdsZWljaCcKK01hbiBtdXNzIGhhbHQgZGllIFByaW9yaXRhZXRlbiByaWNodGlnIHNldHplbiA7KSkuCisKK1dhcnVtIGRpZXNlciBCZWZlaGwgaW4gbWVpbmVuIEF1Z2VuIGJlc29uZGVycyB3aWNodGlnIGlzdD8gTnVuLCBlcgorYmVmcmVpdCBTcGllbGVyIG1pdCBzZWhyIGhvaGVyIFdhaHJzY2hlaW5saWNoa2VpdCB2b24gZGVtIFJpc2lrbywgZHVyY2gKK2VpbiBMYWcgenUgc3RlcmJlbiwgd2VubiBkaWUgRmx1Y2h0IGltIGVudHNjaGVpZGVuZGVuIE1vbWVudCBpbiBkaWUgZmFsc2NoZQorUmljaHR1bmcgenUgZ2VoZW4gZHJvaHQuIE1hbiBtdXNzIHNpZSB2b3JoZXIgbnVyIHJpY2h0aWcgZ2VzZXR6dCBoYWJlbi4KKwpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvZmFxLzQgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9mYXEvNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDg3OTZlCi0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvZmFxLzQKQEAgLTAsMCArMSw5IEBACis0LiBTRUhFUkxFVkVMCistLS0tLS0tLS0tLS0tCisKK0RpZSBCZWRldXR1bmcgZGVyIExldmVscyBpc3QgaW5zb2Zlcm4gaG9jaCwgYWxzIGRhc3MgZGllIEVyZm9sZ3NjaGFuY2UKK2RlciBaYXViZXJzcHJ1ZWNoZSBpbiBkZW4gbWVpc3RlbiBHaWxkZW4gdm9uIGRlbSBMZXZlbCBkZXMgU3BpZWxlcnMgYWJoYWVuZ2lnCitpc3QuIFNvIGlzdCBlcyBncnVuZHNhZXR6bGljaCBpbiBlaW5pZ2VuIEdpbGRlbiBtb2VnbGljaCwgZGllIG1heGltYWxlCitFcmZvbGdzd2FocnNjaGVpbmxpY2hrZWl0IGVpbmVzIFphdWJlcnNwcnVjaGVzIGVyc3QgZGFubiB6dSBlcnJlaWNoZW4sCit3ZW5uIG1hbiB6LkIuIFNlaGVybGV2ZWwgMzUgZXJyZWljaHQgaGF0LgorCmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9mYXEvNSBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL2ZhcS81Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNjdmMGIKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9mYXEvNQpAQCAtMCwwICsxLDM4IEBACis1LiBLT01NVU5JS0FUSU9OCistLS0tLS0tLS0tLS0tLS0tCisKK0FscyBTZWhlciBzdGVoZW4gRGlyIG5ldWUgTWl0dGVsIGRlciBLb21tdW5pa2F0aW9uIHp1ciBWZXJmdWVndW5nLAorbWl0dGVscyBkZXJlciBEdSBOYWNocmljaHRlbiBhbiBhbmRlcmUgU3BpZWxlciBzZW5kZW4ga2FubnN0OgorCithKSBNYWlsCistLS0tLS0tCisKK0FiIHNvZm9ydCBzdGVodCBEaXIgZGVyIGtvc3Rlbmxvc2UgS3VyaWVyZGllbnN0IGRlciBNRy1Qb3N0IHp1ciBWZXJmdWVndW5nIC0KK2R1cmNoIEVpbmdhYmUgdm9uICdtYWlsJyBrYW5uc3QgZHUgdm9uIHVlYmVyYWxsIFBvc3QgdmVyc2NoaWNrZW4gdW5kCitlbXBmYW5nZW4uIERpZXMgc2V0enQgYWJlciB2b3JhdXMsIGRhc3MgRHUgZWluZSBaZWl0dW5nIGJlaSBEaXIgdHJhZWdzdCwKK2RhIGRhcyAnbWFpbCcgZWluZSBadXNhdHpmdW5rdGlvbiBkZXIgTVBBIGlzdC4KKworYikgTVBBCistLS0tLS0KKworSW4gZGVyIFplaXR1bmcgc3RlaHQgRGlyIG51biBkaWUgbmV1ZSBSdWJyaWsgJ3NlaGVyLmVudHdpY2tsdW5nJyB6dXIKK1ZlcmZ1ZWd1bmcsIGluIGRlciBEdSBEZWluZSBWb3JzY2hsYWVnZSB6dXIgVmVyYmVzc2VydW5nIGRlcyBTZWhlcnR1bXMKK2VpbmJyaW5nZW4ga2FubnN0LCBzb3dpZSBkaWUgUnVicmlrICdzZWhlci51cmxhdWInLgorCitjKSBLYW5hZWxlCistLS0tLS0tLS0tCisKK1p1ciBkaXJla3RlbiBLb21tdW5pa2F0aW9uIG1pdCBkZW4gYW5kZXJlbiBTZWhlcm4gc3RlaHQgRGlyIG51biBhdWNoIGVpbgorbmV1ZXIgS2FuYWwgenVyIFZlcmZ1ZWd1bmcuIEVyIHdpcmQgbWl0ICctaCcgYW5nZXNwcm9jaGVuIChuZWluLCBuaWNodCBtaXQKK1Mgd2llIFNlaGVyIDspKS4KKworZCkgRmVybnNjaHJlaWJlcgorLS0tLS0tLS0tLS0tLS0tLQorCitNaXQgZGVtIEZlcm5zY2hyZWliZXIgYXVzIGRlbSBTZWhlcmxhZGVuIGthbm5zdCBEdSBnYW56ZSBOYWNocmljaHRlbmJsb2Vja2UKK2FuIGFuZGVyZSBTcGllbGVyIHNlbmRlbi4gRGllcyBpc3QgaGFldWZpZyBudWV0emxpY2gsIHdlbm4gbWFuIGxhZW5nZXJlCitUZXh0ZSBhbiBlaW5lbiBhbmRlcmVuIFNwaWVsZXIgc2VuZGVuIHdpbGwsIHdhZWhyZW5kIG1hbiB6LkIuIG1pdCBkaWVzZW0KK3p1c2FtbWVuIGVpbmUgbmV1ZSBSZWdpb24gb2RlciBlaW5lIFF1ZXN0IGVyZm9yc2NodC4gRGVyIEVpbnNhdHoga29zdGV0CisxNSBLUCBwcm8gU3BpZWxlciwgYW4gZGVuIGRpZSBOYWNocmljaHQgZ2VzZW5kZXQgd2lyZCwgbWFuIGthbm4gYXVjaCBhbgorbWVocmVyZSBTcGllbGVyIGdsZWljaHplaXRpZyBkaWUgTWVsZHVuZyBhdXNnZWJlbiBsYXNzZW4uCisKZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL2ZhcS82IGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvZmFxLzYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYyMGFlMgotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL2ZhcS82CkBAIC0wLDAgKzEsMTcgQEAKKzYuIE1BR0lTQ0hFIEtVR0VMCistLS0tLS0tLS0tLS0tLS0tLQorCitJbSBIYXVzIGRlciBIZXhlIGFtIEZyaWVkaG9mIGZpbmRlc3QgRHUgZWluZSBLdWdlbCwgZGllIER1IG1pdG5laG1lbgora2FubnN0IC0gbWl0IGlociBrYW5uc3QgZHUgZHVyY2ggZGVuIEJlZmVobCAnZmluZGUgPFNwaWVsZXJuYW1lPicKK2plZGVuIGVpbmdlbG9nZ3RlbiBTcGllbGVyIGxva2FsaXNpZXJlbiAtIGVpbiBFaW5zYXR6IGtvc3RldCBqZXdlaWxzIDkKK0tQLgorCitNaXQgZGVyIEVpbmZ1ZWhydW5nIGRlciBTZWhlcnF1ZXN0IHZvbiBUcm95IGVyaGFlbHQgbWFuIGFscyBRdWVzdGJlbG9obnVuZworZWluZSAtIGRlciBOYW1lIGRlcyBRdWVzdHMgbGFlc3N0IGVzIHZlcm11dGVuIC0gS3Jpc3RhbGxrdWdlbCwgZGllIGRpZXNlbGJlCitGdW5rdGlvbiB3aWUgZGllIFNlaGVya3VnZWwgZXJmdWVsbHQuIEFsbGVyZGluZ3Mga29zdGV0IGRpZXNlIHBybyBFaW5zYXR6CitudXIgMSBLUC4gRGFmdWVyIGVyaGFlbHQgYWxsZXJkaW5ncyBkZXIgYmVvYmFjaHRldGUgU3BpZWxlciBkaWUgTWVsZHVuZworJ0plbWFuZCBiZXNjaHdvZXJ0IERlaW4gQmlsZCBoZXJhdWYuJywgd2FzIGF1ZiBEYXVlciBldHdhcyBhdWZkcmluZ2xpY2gKK3dpcmQsIGRhIGRlciBCZXRyb2ZmZW5lIGphIG5pY2h0IHdlaXNzLCB3ZXIgaWhuIGRhIHN1Y2h0LgorV2VsY2hlIEt1Z2VsIGR1IGFscyBTZWhlciBiZW51dHp0LCBrb21tdCB3b2hsIGF1ZiBkaWUgZWlnZW5lIEVudHNjaGVpZHVuZyB1bmQKK2RlbiBqZXdlaWxpZ2VuIEZhbGwgYW4uCisKZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL2ZhcS83IGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvZmFxLzcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZkZmM2YwotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL2ZhcS83CkBAIC0wLDAgKzEsMTUgQEAKKzcuIFNFSEVSTEFERU4KKy0tLS0tLS0tLS0tLS0KKworQXVmIFN2b2x2YWVyIGZpbmRlc3QgRHUgZWluZW4gTGFkZW4sIGRlciBzcGV6aWVsbGUgSXRlbXMgbnVyIGZ1ZXIgU2VoZXIKK2FuYmlldGV0LiBJbnRlcmVzc2FudCBpc3QgaGllciBkZXIgQnVtZXJhbmcsIGRlciBXZWNrZXIsIGRpZSBQYXJ0eXRyb2V0ZSwKK2RlciBNYWdpc2NoZSBCZXV0ZWwgdW5kIGRlciBrbGVpbmUgZ3JhdWUgS2FzdGVuLgorCitGdWVyIGRhcyBBbmdlYm90IGltIFNlaGVybGFkZW4gaXN0IExvY28genVzdGVuZGlnLCBkZXIgZGFzIEFuZ2Vib3QKK3NpY2hlciBnZXJuZSBlcndlaXRlcm4gd3VlcmRlLCB1bmQgZGFoZXIgZnVlciBJZGVlbiBpbW1lciBhdWZnZXNjaGxvc3NlbgoraXN0IC0gZGFoZXIgc2NocmVpYmUgaWhtIHJ1aGlnIGVpbiBNYWlsLCB3ZW5uIER1IGVpbmUgSWRlZSBoYXN0LCB3YXMKK2RvcnQgenVrdWVuZnRpZyBub2NoIGFuZ2Vib3RlbiB3ZXJkZW4ga29lbm50ZS4KKworVWVicmlnZW5zIGdpYnRzIGF1Y2ggaW4gZGVyIFBhcmF3ZWx0IGluIFBvcnQgVmFpbiBuZW4gU2VoZXItTGFkZW4sIGRlbgorbXVlc3N0IGlociBhbGxlcmRpbmdzIHN1Y2hlbiA6KSkKKwpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvZmFxLzggYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9mYXEvOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDBlNTM3Ci0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvZmFxLzgKQEAgLTAsMCArMSw1MSBAQAorOC4gREVTSUdORVItU0VIRVIKKy0tLS0tLS0tLS0tLS0tLS0tCisKK051biwgdmllbGxlaWNodCBpc3QgZGllc2VyIFRpdGVsIGF1Y2ggZWluIHdlbmlnIHVlYmVydHJpZWJlbi4gQWJlciBhbHMKK1NlaGVyIGthbm5zdCBEdSAoZmFzdCkgRGVpbmUgZ2VzYW10ZSBFcnNjaGVpbnVuZyBpbSBNVUQgc2VsYnN0IGdlc3RhbHRlbjoKK051biwgRGVzaWduZXJ0eXBlbiBnbGFlbnplbiBkdXJjaCBpaHIgQWV1c3NlcmVzLCBhbHNvIGZhbmdlbiB3aXIgbWFsIGJlaW0KK0F1c3NlaGVuIGFuOiBXYXMgZGllIFNwaWVsZXIgc2VoZW4sIHdlbm4gc2llIERpY2ggdW50ZXJzdWNoZW4sIGthbm5zdCBEdQorbWl0IGRlbSBCZWZlaGwgJ2V4dHJhbG9vaycgYmVzdGltbWVuLiBEaWUgZG9ydCBlaW5nZWdlYmVuZSBCZXNjaHJlaWJ1bmcKK3dpcmQgZGVyIEF1Zmxpc3R1bmcgZGVzc2VuLCB3YXMgRHUgYmVpIERpciB0cmFlZ3N0LCB2b3Jhbmdlc3RlbGx0LgorCitadXIgRXJzY2hlaW51bmcgZ2Vob2VydCBhdWNoIGRhcyBBdWZ0cmV0ZW4sIGFsc28gZGVzaWduZW4gd2lyIG1hbCBlaW4KK2Jpc3NjaGVuIGFuIERlaW5lbiBNZWxkdW5nZW4gaGVydW0sIGRpZSBlcnNjaGVpbmVuLCB3ZW5uIER1IGVpbmVuIFJhdW0KK2JldHJpdHRzdCBvZGVyIHZlcmxhZXNzdC4gRGllcyBrYW5uc3QgRHUgbWl0OgorJ3NldG1pbiA8VEVYVD4nIGJ6dy4gJ3NldG1vdXQgPFRFWFQ+JyBzZXR6ZW4uCitVbmQgd2VubiBEdSBtb2VjaHRlc3QsIGthbm5zdCBEdSBtaXQgJ3NldG1tb3V0JyBiencuICdzZXRtbWluJworZGllIE1lbGR1bmdlbiBzZXR6ZW4sIGRpZSBlcnNjaGVpbmVuLCB3ZW5uIER1IGVpbmVuIE9ydCBtaXR0ZWxzIGVpbmVzCitUZWxlcG9ydHMgYmV0cml0dHN0L3ZlcmxhZXNzdC4KKworRG9jaCBhdWNoIERlc2lnbmVyc2VoZXIgbGViZW4gdW50ZXIgZGVtIEpvY2ggZGVzIEFybWFnZWRkb24sIHVuZCBzaW5kIGRhaGVyCittYW5jaG1hbCB3YWZmZW4tIHVuZCBydWVzdHVuZ3Nsb3MuIFdlciBlcyBhYmVyIG5pY2h0IGVydHJhZ2VuIGthbm4sIGluIGRpZXNlbgorYml0dGVyZW4gU3R1bmRlbiBpbW1lciBkaWUgTWVsZHVuZyAnZ3JlaWZ0IG1pdCBibG9zc2VuIEhhZW5kZW4gYW4nIHp1IHNlaGVuLAorZGVyIGthbm4gc2ljaCBtaXR0ZWxzIGRlcyBCZWZlaGxzICdzZXRoYW5kcyA8VEVYVD4nIGVpbmUgbWFydGlhbGlzY2hlcmUKKyhvZGVyIGF1Y2ggemFlcnRsaWNoZXJlLCBqZSBuYWNoIEdlc2NobWFjayA7KSkgS2FtcGZtZWxkdW5nIGZ1ZXIgc2VpbmUgSGFlbmRlCitzZXR6ZW4uCisKK051biwgZWluIHJpY2h0aWdlciBTZWhlciBoYXQgbmF0dWVybGljaCBhdWNoIGVpbmVuIGludGVyZXNzYW50ZXJlbgorTmFtZW4sIG5pY2h0IHNvIHdhcyBvZWRlcyB3aWUgJ1d1cnN0LCBkaWUgU2VoZXJpbicuIFVuZCBkZXNoYWxiIGtvZW5udGUKK3NpY2ggV3Vyc3QgZWluZW4gZWlnZW5lbiBOYW1lbiBnZWJlbiwgbWl0IGRlbSBCZWZlaGwgJ3RpdGVsIDxURVhUPicuCitEYW5uIGhpZXNzZSBzaWUgaGludGVyaGVyIGJlaXNwaWVsc3dlaXNlICdXdXJzdCBpc3QgbmUgV3Vyc3QnLgorVW5kIHdlbSBkYXMgbm9jaCBuaWNodCBsYWVzc2lnIGdlbnVnIGlzdCwgZGVyIHNldHp0IHNpY2ggbWl0CisncHJlc2F5IDxURVhUPicgYXVjaCBub2NoIGVpbmVuIE5hbWVuc3ZvcnNhdHouCitCZWlzcGllbDogJ0RpZSBPYmVyd3Vyc3RzZWhlcmluIFd1cnN0IGlzdCBuZSBXdXJzdCcuCitXZW5uZ2xlaWNoIGRhcyB2aWVsbGVpY2h0IGRvY2ggbmljaHQgU09PTyBjb29sIGlzdC4KK0dlc2NobWFja3NzYWNoZSBoYWx0IDspLgorCisKK0FjaCBqYSwgdW5kIHdlbm4gbWFuIGRhbm4gYmVpIGFsbCBkZXIgUnVtZGVzaWduZXJlaSB2ZXJnZXNzZW4gaGFiZW4gc29sbHRlLAord2FzIG1hbiB1ZWJlcmhhdXB0IGVpbmdlZ2ViZW4gaGF0LCBzbyBlcmhhZWx0IG1hbiBtaXQgZGVtIEJlZmVobCAncmV2aWV3JworZWluZW4gVWViZXJibGljayB1ZWJlciBkaWUgbWVpc3RlbiBFaW5zdGVsbHVuZ2VuLgorCitFaW5lIEFubWVya3VuZyBub2NoOiBEZXIgVG9ldGVyIGhhdCB2b3IgbGFuZ2VyIFplaXQgZWluZSBrbGVpbmUgRXJ3ZWl0ZXJ1bmcKK2luIGRlbiBCZWZlaGwgc2V0bW91dCBlaW5nZWJhdXQ6CitOdW5tZWhyIGlzdCBlcyBtb2VnbGljaCwgZGVuIFRleHQgJ25hY2ggKFJpY2h0dW5nKScgbmljaHQgbWVociBudXIgYW0gRW5kZSwKK3NvbmRlcm4gaXJnZW5kd28gaW0gVGV4dCBlcnNjaGVpbmVuIHp1IGxhc3NlbjogZGFubiBtdXNzIGltIFRleHQgZGVyCitvdXQtbWVzc2FnZSBlaW4gIyBlcnNjaGVpbmVuLCBkaWUgZGFubiBkdXJjaCAnbmFjaCAoUmljaHR1bmcpJyBlcnNldHp0IHdpcmQuCitVbnRlcmRydWVja2VuIGthbm5zdCBEdSBkaWUgUmljaHR1bmdzYW5nYWJlIGFsbGVyZGluZ3MgbmljaHQsIHdlbm4gRHUgZGFzICNyCit3ZWdsYWVzc3QsIHdpcmQgZGllc2UgQW5nYWJlIGVpbmZhY2ggaGludGVuIGFuZ2VoYWVuZ3QuLgorCitIaWxmZSBkYXp1IGxpZWZlcm4gYWJlciBuYXR1ZXJsaWNoIGF1Y2ggd2llZGVydW0gZGllIFNlaGVyaGlsZmVzZWl0ZW4gdW50ZXIKKydoaWxmZSBzZWhlcicKKwpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvZmFxLzkgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9mYXEvOQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjVjYTM1Ci0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvZmFxLzkKQEAgLTAsMCArMSwxMSBAQAorOS4gRkVITEVSTUVMRFVORworLS0tLS0tLS0tLS0tLS0tLQorCitFaW4gbmljaHQgYmVzb25kZXJzIHdpY2h0aWdlciwgYWJlciBpbiBzZWluZW4gQXVzd2lya3VuZ2VuIGhhZXVmaWcKK2FuZ2V0cm9mZmVuZXIgQmVmZWhsOiBGZWhsZXJtZWxkdW5nLiBXZW5uIERpciBkYXMgZXdpZ2UKKydXaWUgYml0dGUgPycgbGFuZ3NhbSB6dSBlaW50b2VuaWcgd2lyZCwgc28ga2FubnN0IER1IG1pdAorJ0ZlaGxlcm1lbGR1bmcgPFRFWFQ+JyBlaW5lbiBuZXVlbiBUZXh0IGZ1ZXIgRGVpbmUgRmVobGVybWVsZHVuZyBzZXR6ZW4gLQordWVicmlnZW5zIGdlbmF1c28gd2llIGZ1ZXIgZGllIFVocm1lbGR1bmcsIHdhcyBhbGxlcmRpbmdzIHNjaG9uIGFscworU3BpZWxlciBtb2VnbGljaCBpc3QsIHdhcyBqZWRvY2ggc2NoZWluYmFyIG51ciByZWNodCB3ZW5pZ2UgU3BpZWxlcgord2lzc2VuLgorCmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9mYXEvZmFxLm8gYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9mYXEvZmFxLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZjZDU5YQotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL2ZhcS9mYXEubwpAQCAtMCwwICsxLDMgQEAKKyMwOjAKK3Byb3BlcnRpZXMgKFs6Ml0pCitzeW5vbnltIChbImxldmVsIjoiNCIsImZpbmdlciI6IjEyIiwiaGF1cyI6IjE0IiwicXVlc3QiOiIyIiwia3VnZWwiOiI2IiwiZGVzaWduZXItc2VoZXIiOiI4IiwicG9ydGFsIjoiMTEiLCJlY2hvIjoiMTMiLCJmZWhsZXJtZWxkdW5nIjoiOSIsInF1ZXN0cyI6IjIiLCJyZW1vdGUiOiIxMyIsImZsdWNodHJpY2h0dW5nIjoiMyIsInRyYW5zcG9ydG1vZWdsaWNoa2VpdCI6IjEiLCJ0ZXN0IjoiMjAiLCJzZWhlcnF1ZXN0IjoiMiIsImhhZXVzZXIiOiIxNCIsInItZW1vdGUiOiIxMyIsInNlaGVyaGF1cyI6IjE0IiwicGFyYS1wb3J0YWwiOiIxMSIsInRyYW5zcG9ydCI6IjEiLCJzZWhlcmhhZXVzZXIiOiIxNCIsInNlaGVybGFkZW4iOiI3IiwibWFnaXNjaGUga3VnZWwiOiI2IiwidHJhbnNwb3J0bW9lZ2xpY2hrZWl0ZW4iOiIxIiwicGFyYWxsZWxkaW1lbnNpb24iOiIxMCIsImRhbmtzYWd1bmciOiIxNiIsInNlaGVycXVlc3RzIjoiMiIsInNlaGVybGV2ZWwiOiI0IiwibmFjaHdvcnQiOiIxNSIsImRhbmtzYWd1bmdlbiI6IjE2IiwiZGVzaWduZXJzZWhlciI6IjgiLCJmaW5nZXItYmVmZWhsIjoiMTIiLCJrb21tdW5pa2F0aW9uIjoiNSIsInBhcmFwb3J0YWwiOiIxMSIsImZpbmdlcmJlZmVobCI6IjEyIixdKQpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvZmFxL2luaGFsdCBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL2ZhcS9pbmhhbHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA3ODBiYwotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL2ZhcS9pbmhhbHQKQEAgLTAsMCArMSwyOCBAQAorSW5oYWx0IGRlciBTZWhlckZBUSAzLjAyOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAwLiBOZXVpZ2tlaXRlbgorICAgMS4gVHJhbnNwb3J0bW9lZ2xpY2hrZWl0ZW4KKyAgIDIuIFNlaGVycXVlc3RzCisgICAzLiBGbHVjaHRyaWNodHVuZworICAgNC4gU2VoZXJsZXZlbAorICAgNS4gS29tbXVuaWthdGlvbgorICAgNi4gTWFnaXNjaGUgS3VnZWwKKyAgIDcuIFNlaGVybGFkZW4KKyAgIDguIERlc2lnbmVyLVNlaGVyCisgICA5LiBGZWhsZXJtZWxkdW5nCisgIDEwLiBQYXJhbGxlbGRpbWVuc2lvbgorICAxMS4gUGFyYS1Qb3J0YWwgOAorICAxMi4gRmluZ2VyLUJlZmVobAorICAxMy4gRWNobywgUi1FbW90ZQorICAxNC4gU2VoZXJoYWV1c2VyCisgIDE1LiBOYWNod29ydAorICAxNi4gRGFua3NhZ3VuZ2VuCisKK0RpZSBlaW56ZWxuZW4gS2FwaXRlbCBsaWVzdCBEdSBlaW5mYWNoIG1pdCB6LkIuIGxpZXMgMTIuCitXZW5uIER1IGVpbmUgSWRlZSBoYXN0LCB3YXMgYW4gZGVyIEZBUSB2ZXJiZXNzZXJ0LCBnZWFlbmRlcnQgb2RlcgoraGluenVnZWZ1ZWd0IHdlcmRlbiBzb2xsdGUsIGRhbm4gd2FlcmUgaWNoIERpciBzZWhyIGRhbmtiYXIsCit3ZW5uIER1IG1pciBlaW5lIGt1cnplIE1haWwgc2NoaWNrZW4gd3VlcmRlc3QuCisKK1N0aW5nCisKZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL2ZhcS9zZWhlcmZhcSBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL2ZhcS9zZWhlcmZhcQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzkwOTQxCi0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvZmFxL3NlaGVyZmFxCkBAIC0wLDAgKzEgQEAKK01hY2ggbWFsICJsaWVzIGluaGFsdCIKZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3JqLmMgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9yai5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZjNiOTgKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9yai5jCkBAIC0wLDAgKzEsMjYgQEAKK2luaGVyaXQgIi9zdGQvdGhpbmciOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgIi4uL2hhdXMuaCIKKworY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgOjpjcmVhdGUoKTsKKworICBTZXRQcm9wKFBfU0hPUlQsMCk7CisgIFNldFByb3AoUF9OT0dFVCwgMSk7CisgIEFkZElkKCJyJmoiKTsKKyAgQWRkQ21kKCJsaWVzIiwgImxpZXMiKTsKK30KKworc3RhdGljIGludCBsaWVzKHN0cmluZyBzdHIpCit7CisgIGludCBucjsKKworICBpZiAoIXN0ciB8fCBzc2NhbmYoc3RyLCAic2VpdGUgJWQiLCBucikgIT0gMSkKKyAgICByZXR1cm4gbm90aWZ5X2ZhaWwoIlN5bnRheDogbGllcyBzZWl0ZSA8bnI+XG4iKSwgMDsKKworICB0aGlzX3BsYXllcigpLT5Nb3JlKFNQRUNJQUxQQVRIKyJyb21fanVsL3NlaXRlIituciwgMSk7CisgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc2VoZXJmYXEuYyBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NlaGVyZmFxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFlOTZlNgotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NlaGVyZmFxLmMKQEAgLTAsMCArMSwyNDcgQEAKK2luaGVyaXQgInN0ZC90aGluZyI7Citpbmhlcml0ICJzdGQvbW9yZSI7Citpbmhlcml0ICIvbWFpbC9uZWRpdCI7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSAiLi4vaGF1cy5oIgorCisjZGVmaW5lIEZBUShmKSAoU1BFQ0lBTFBBVEgrImZhcS8iKyhmKSkKKyNkZWZpbmUgRkFRVVNFUiAoeyAicnluZSIsICJ0b3NzIiwgInN0aW5nIiB9KQorI2RlZmluZSBJU19VU0VSKHBsKSAobWVtYmVyKEZBUVVTRVIsIGdldHVpZChwbCkpID49IDApCisKK3N0YXRpYyBzdHJpbmcgKnNlaXRlOworc3RhdGljIHN0cmluZyBmLCpzOworCittYXBwaW5nIHN5bm9ueW0gPSAoW10pOworCitjcmVhdGUoKQoreworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfTkFNRSwiU2VoZXJGQVEiKTsKKyAgU2V0UHJvcChQX0dFTkRFUixGRU1BTEUpOyAKKyAgU2V0UHJvcChQX05PR0VULDEpOworICBBZGRJZCggKHsiZmFxIiwic2VoZXJmYXEiLCJGQVEiLCJTZWhlckZBUSIgfSkgKTsKKyAgQWRkQ21kKCJsaWVzIiwibGVzZW4iKTsKKyAgQWRkQ21kKCh7ImJlc2NocmVpYiIsImJlc2NocmVpYmUifSksImJlc2NocmVpYmVuIik7CisgIEFkZENtZCgic2VpdGVuIiwic2VpdGVuIik7CisgIEFkZENtZCgoeyJsb2VzY2giLCJsb2VzY2hlIn0pLCJsb2VzY2hlbiIpOworICBBZGRDbWQoKHsia29waWVyIiwia29waWVyZSJ9KSwia29waWVyZW4iKTsKKyAgcmVzdG9yZV9vYmplY3QoRkFRKCJmYXEiKSk7CisgIHNlaXRlID0gZ2V0X2RpcihGQVEoIioiKSktKHsiLiIsIi4uIiwiZmFxLm8ifSk7Cit9CisKK2luaXQoKQoreworICB0aGluZzo6aW5pdCgpOworICBpZiAodGhpc19wbGF5ZXIoKSAmJiBJU19VU0VSKHRoaXNfcGxheWVyKCkpKQorICAgIG5lZGl0Ojppbml0X3Jlc2N1ZSgpOworfQorCitzdHJpbmcKK19xdWVyeV9zaG9ydCgpCit7CisgIGlmICh0aGlzX3BsYXllcigpICYmIElTX1NFRVIodGhpc19wbGF5ZXIoKSkpCisgICAgcmV0dXJuICJEaWUgU2VoZXJGQVEiOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKK3N0cmluZyAKK19xdWVyeV9sb25nKCkKK3sKKyAgaWYgKHRoaXNfcGxheWVyKCkgJiYgSVNfU0VFUih0aGlzX3BsYXllcigpKSkKKyAgICByZXR1cm4gIkRpZXMgaXN0IFJ5bmVzIFNlaGVyRkFRLlxuXAorV2VubiBEdSB3ZWl0ZXJlIEZyYWdlbiBvZGVyIEFucmVndW5nZW4genUgZGllc2VyIEZBUSBoYXN0LFxuXAorc2VpIHNvIG5ldHQgdW5kIHNjaGlja2UgUnluZSBlaW5lbiBrdXJ6ZW4gQnJpZWZcblxuXAorWnVtIEluaGFsdCBkZXIgRkFRIGtvbW1zdCBEdSBtaXQgPmxpZXMgaW5oYWx0PFxuIjsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCitpbnQKK2lkKHN0cmluZyBzdHIpCit7CisgIGlmICghSVNfU0VFUih0aGlzX3BsYXllcigpKSkKKyAgICByZXR1cm4gMDsKKyAgZWxzZQorICAgIHJldHVybiA6OmlkKHN0cik7Cit9CisKK2ludAorc2VpdGVuKHN0cmluZyBzdHIpCit7CisgIGludCBpLGo7CisgIHN0cmluZyAqc3luOworICBjbG9zdXJlIGZpbHRlcl9sZGZpZWQ7CisKKyAgaWYgKCFJU19VU0VSKHRoaXNfcGxheWVyKCkpKQorICAgIHJldHVybiAwOworCisgIGlmKCEoaSA9IHNpemVvZihzZWl0ZSkpKQorICAgIHdyaXRlKCJLZWluZSBTZWl0ZW4gYmVzY2hyaWViZW4hXG4iKTsKKyAgZWxzZSB7CisgICAgZmlsdGVyX2xkZmllZCA9IGxhbWJkYSgoeydpbmQsJ3BhZ2UsJ21hcF9sZGZpZWQvKicqL30pLAorCQkgICAgKHsjJz09LCdwYWdlLCh7IydbLypdJyovLCdtYXBfbGRmaWVkLCdpbmR9KX0pKTsKKyAgICBmb3IgKHN0ciA9ICIiLGktPTE7aT49MDtpLS0pIHsKKyAgICAgIHN5biA9IG1faW5kaWNlcyhmaWx0ZXJfaW5kaWNlcyhzeW5vbnltLGZpbHRlcl9sZGZpZWQsc2VpdGVbaV0sc3lub255bSkpOworICAgICAgcHJpbnRmKCJTZWl0ZSAnJXMnIC0gIixzZWl0ZVtpXSk7CisgICAgICBpZiAoaj1zaXplb2Yoc3luKSkgeworCWZvcihqLT0xO2o+PTA7ai0tKQorCSAgcHJpbnRmKCInJXMnICIsc3luW2pdKTsKKwl3cml0ZSgiXG4iKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKwl3cml0ZSggIihrZWluZSBTeW5vbnltZSBkZWZpbmllcnQpXG4iKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2ludAorbGVzZW4oc3RyaW5nIHN0cikKK3sKKyAgaWYgKCFJU19TRUVSKHRoaXNfcGxheWVyKCkpKQorICAgIHJldHVybiAwOworCisgIGlmICghc3RyIHx8IHN0ciA9PSAiIikgeworICAgIG5vdGlmeV9mYWlsKCJXYXMgd2lsbHN0IER1IGRlbm4gbGVzZW4/XG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBzdHIgPSBsb3dlcl9jYXNlKHRoaXNfcGxheWVyKCktPl91bnBhcnNlZF9hcmdzKCkpOworICBpZiAobWVtYmVyKHNlaXRlLHN0cik8MCkgeworICAgIGlmICghbWVtYmVyKHN5bm9ueW0sc3RyKSkgeworICAgICAgbm90aWZ5X2ZhaWwoIkRpZXNlIFNlaXRlIGdpYnQgZXMgbmljaHQuLi5cbiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UgCisgICAgICBzdHIgPSBzeW5vbnltW3N0cl07CisgIH0KKyAgdGhpc19wbGF5ZXIoKS0+TW9yZShGQVEoc3RyKSwxKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludAorYmVzY2hyZWliZW4oc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIGZhcSwqZGVzYzsKKyAgaW50IGk7CisKKyAgaWYgKCFJU19VU0VSKHRoaXNfcGxheWVyKCkpKQorICAgIHJldHVybiAwOworCisgIHN0ciA9IGxvd2VyX2Nhc2UodGhpc19wbGF5ZXIoKS0+X3VucGFyc2VkX2FyZ3MoKSk7CisKKyAgaWYgKCFzdHIgfHwgc3RyID09ICIiKSB7CisgICAgbm90aWZ5X2ZhaWwoIldhcyB3aWxsc3QgRHUgZGVubiBiZXNjaHJlaWJlbj9cbiIpOworICAgIHJldHVybiAwOworICB9CisgIGlmIChzc2NhbmYoc3RyLCIlcyAlcyIsZmFxLHN0cikhPTIgfHwgIWlkKGZhcSkpIHsKKyAgICBub3RpZnlfZmFpbCgiU3ludGF4OiBiZXNjaHJlaWJlIGZhcSA8c2VpdGU+XG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBzdHIgPSBpbXBsb2RlKG9sZF9leHBsb2RlKHN0ciwiICIpLSh7IiJ9KSwgIiAiKTsKKyAgZGVzYyA9IG9sZF9leHBsb2RlKGltcGxvZGUob2xkX2V4cGxvZGUoc3RyLCIsICIpLCIsIiksIiwiKTsKKyAgZiA9IDA7CisgIHMgPSAwOworCisgIGZvciAoaT1zaXplb2YoZGVzYyktMTtpPj0wO2ktLSkgeworICAgIGlmIChtZW1iZXIoc2VpdGUsZGVzY1tpXSk+PTApIHsKKyAgICAgIGYgPSBkZXNjW2ldOworICAgICAgcyA9IGRlc2MtKHtkZXNjW2ldfSk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKCFmKSB7CisgICAgZiA9IGRlc2NbMF07CisgICAgcyA9IGRlc2NbMS4uXTsKKyAgfQorICB3cml0ZSgiQml0dGUgQmVzY2hyZWlidW5nIGZ1ZXIgZGllIEZBUS1TZWl0ZSAnIitmKyInIGFuZ2ViZW5cbiIpOworICBuZWRpdCgiZmFxIik7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAorZmFxKHN0cmluZyBzdHIpCit7CisgIGludCBpOworICBzdHJpbmcgZmlsZTsKKworICBpZiAoIXN0ciB8fCBzdHIgPT0gMCkgeworICAgIHdyaXRlKCIqKiBBYmJydWNoISAqKlxuTmljaHRzIGdlYWVuZGVydCFcbiIpOworICAgIHJldHVybjsKKyAgfQorICAKKyAgaWYgKGZpbGVfc2l6ZShmaWxlPUZBUShmKSk+PTApCisgICAgcm0oZmlsZSk7CisgIHdyaXRlX2ZpbGUoZmlsZSwgc3RyKTsKKyAgaWYgKG1lbWJlcihzZWl0ZSxmKT09LTEpCisgICAgc2VpdGUgKz0gKHtmfSk7CisKKyAgZm9yIChpPXNpemVvZihzKS0xO2k+PTA7aS0tKSAKKyAgICBzeW5vbnltICs9IChbIHNbaV0gOiBmIF0pOworCisgIHNhdmVfb2JqZWN0KEZBUSgiZmFxIikpOworfQorCitpbnQKK2xvZXNjaGVuKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyAqc3luOworICBpbnQgaTsKKworICBpZighSVNfVVNFUih0aGlzX3BsYXllcigpKSkKKyAgICByZXR1cm4gMDsKKworICBzdHIgPSBsb3dlcl9jYXNlKHRoaXNfcGxheWVyKCktPl91bnBhcnNlZF9hcmdzKCkpOworICBpZiAoIXN0ciB8fCBzdHIgPT0gIiIpIHsKKyAgICBub3RpZnlfZmFpbCgiV2FzIHdpbGxzdCBEdSBkZW5uIGxvZXNjaGVuP1xuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKG1lbWJlcihzZWl0ZSxzdHIpPj0wKSB7CisgICAgc3luID0gbV9pbmRpY2VzKGZpbHRlcl9pbmRpY2VzKHN5bm9ueW0sCisJCQkJIGxhbWJkYSgoeydpbmQsJ3BhZ2UsJ21hcF9sZGZpZWQvKicqL30pLAorCQkJCQkoeyMnPT0sJ3BhZ2UsKHsjJ1svKl0nKi8sJ21hcF9sZGZpZWQsJ2luZH0pfSkpCisJCQkJICxzZWl0ZVtpXSxzeW5vbnltKSk7CisgICAgcm0oRkFRKHN0cikpOworICAgIHNlaXRlIC09ICh7c3RyfSk7CisgIH0KKyAgZWxzZSB7CisgICAgc3RyID0gaW1wbG9kZShvbGRfZXhwbG9kZShzdHIsIiAiKS0oeyIifSksICIgIik7CisgICAgc3luID0gb2xkX2V4cGxvZGUoaW1wbG9kZShvbGRfZXhwbG9kZShzdHIsIiwgIiksIiwiKSwiLCIpOworICB9CisgIGZvciAoaT1zaXplb2Yoc3luKS0xOyBpPj0wOyBpLS0pCisgICAgc3lub255bSA9IGZpbHRlcl9pbmRpY2VzKHN5bm9ueW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYSgoeydrZXksJ2NtcH0pLAorCQkJCSAgICAoeyMnIT0sJ2tleSwnY21wLyonKi99KSksCisJCQkgICAgIHN5bltpXSk7CisKKyAgc2F2ZV9vYmplY3QoRkFRKCJmYXEiKSk7CisgIHdyaXRlKCJPS1xuIik7CisgIHJldHVybiAxOworfQorCitpbnQKK2tvcGllcmVuKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyAqcGFydDsKKyAgaW50IGk7CisKKyAgaWYgKCFJU19VU0VSKHRoaXNfcGxheWVyKCkpKQorICAgIHJldHVybiAwOworCisgIHN0ciA9IGxvd2VyX2Nhc2UodGhpc19wbGF5ZXIoKS0+X3VucGFyc2VkX2FyZ3MoKSk7CisgIHBhcnQgPSBvbGRfZXhwbG9kZShzdHIsIiAiKS0oeyIifSk7CisgIGlmKHNpemVvZihwYXJ0KTw0IHx8ICFpZChwYXJ0WzBdKSB8fCBwYXJ0WzJdICE9ICJuYWNoIiB8fCAKKyAgICAgbWVtYmVyKHNlaXRlLHBhcnRbMV0pID09IC0xKSB7CisgICAgbm90aWZ5X2ZhaWwoImtvcGllcmUgZmFxIDxzZWl0ZT4gbmFjaCA8YWxpYXM+XG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBzdHIgPSBwYXJ0WzFdOworICBwYXJ0PW9sZF9leHBsb2RlKGltcGxvZGUob2xkX2V4cGxvZGUoaW1wbG9kZShwYXJ0WzMuLl0sIiAiKSwiLCAiKSwiLCIpLCIsIik7CisgIGZvcihpPXNpemVvZihwYXJ0KS0xO2k+PTA7aS0tKQorICAgIHN5bm9ueW0gKz0gKFsgcGFydFtpXSA6IHN0ciBdKTsKKyAgc2F2ZV9vYmplY3QoRkFRKCJmYXEiKSk7CisgIHdyaXRlKCJPSy5cbiIpOworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NlaGVyZmFxaW52aXMuYyBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NlaGVyZmFxaW52aXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWQzNjI1Ci0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc2VoZXJmYXFpbnZpcy5jCkBAIC0wLDAgKzEsMjM2IEBACitpbmhlcml0ICJzdGQvdGhpbmciOworaW5oZXJpdCAic3RkL21vcmUiOworaW5oZXJpdCAiL21haWwvbmVkaXQiOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgIi4uL2hhdXMuaCIKKworI2RlZmluZSBGQVEoZikgKFNQRUNJQUxQQVRIKyJmYXEvIisoZikpCisjZGVmaW5lIEZBUVVTRVIgKHsgInJ5bmUiLCAidG9zcyIsICJzdGluZyIgfSkKKyNkZWZpbmUgSVNfVVNFUihwbCkgKG1lbWJlcihGQVFVU0VSLCBnZXR1aWQocGwpKSA+PSAwKQorCitzdGF0aWMgc3RyaW5nICpzZWl0ZTsKK3N0YXRpYyBzdHJpbmcgZiwqczsKKworbWFwcGluZyBzeW5vbnltID0gKFtdKTsKKwordm9pZCBjcmVhdGUoKQoreworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfTkFNRSwiU2VoZXJGQVEiKTsKKyAgU2V0UHJvcChQX0dFTkRFUixGRU1BTEUpOyAKKyAgU2V0UHJvcChQX05PR0VULDEpOworICBBZGRJZCggKHsiZmFxIiwic2VoZXJmYXEiLCJGQVEiLCJTZWhlckZBUSIgfSkgKTsKKyAgQWRkQ21kKCJsaWVzIiwibGVzZW4iKTsKKyAgQWRkQ21kKCh7ImJlc2NocmVpYiIsImJlc2NocmVpYmUifSksImJlc2NocmVpYmVuIik7CisgIEFkZENtZCgic2VpdGVuIiwic2VpdGVuIik7CisgIEFkZENtZCgoeyJsb2VzY2giLCJsb2VzY2hlIn0pLCJsb2VzY2hlbiIpOworICBBZGRDbWQoKHsia29waWVyIiwia29waWVyZSJ9KSwia29waWVyZW4iKTsKKyAgcmVzdG9yZV9vYmplY3QoRkFRKCJmYXEiKSk7CisgIHNlaXRlID0gZ2V0X2RpcihGQVEoIioiKSktKHsiLiIsIi4uIiwiZmFxLm8ifSk7Cit9CisKK3ZvaWQgaW5pdCgpCit7CisgIHRoaW5nOjppbml0KCk7CisgIGlmICh0aGlzX3BsYXllcigpICYmIElTX1VTRVIodGhpc19wbGF5ZXIoKSkpCisgICAgbmVkaXQ6OmluaXRfcmVzY3VlKCk7Cit9CisKK3N0cmluZworX3F1ZXJ5X3Nob3J0KCkKK3sKKyAgICByZXR1cm4gMDsKK30KKworc3RyaW5nIAorX3F1ZXJ5X2xvbmcoKQoreworICAgIHJldHVybiAwOworfQorCitpbnQKK2lkKHN0cmluZyBzdHIpCit7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludAorc2VpdGVuKHN0cmluZyBzdHIpCit7CisgIGludCBpLGo7CisgIHN0cmluZyAqc3luOworICBjbG9zdXJlIGZpbHRlcl9sZGZpZWQ7CisKKyAgaWYgKCFJU19VU0VSKHRoaXNfcGxheWVyKCkpKQorICAgIHJldHVybiAwOworCisgIGlmKCEoaSA9IHNpemVvZihzZWl0ZSkpKQorICAgIHdyaXRlKCJLZWluZSBTZWl0ZW4gYmVzY2hyaWViZW4hXG4iKTsKKyAgZWxzZSB7CisgICAgZmlsdGVyX2xkZmllZCA9IGxhbWJkYSgoeydpbmQsJ3BhZ2UsJ21hcF9sZGZpZWQvKicqL30pLAorCQkgICAgKHsjJz09LCdwYWdlLCh7IydbLypdJyovLCdtYXBfbGRmaWVkLCdpbmR9KX0pKTsKKyAgICBmb3IgKHN0ciA9ICIiLGktPTE7aT49MDtpLS0pIHsKKyAgICAgIHN5biA9IG1faW5kaWNlcyhmaWx0ZXJfaW5kaWNlcyhzeW5vbnltLGZpbHRlcl9sZGZpZWQsc2VpdGVbaV0sc3lub255bSkpOworICAgICAgcHJpbnRmKCJTZWl0ZSAnJXMnIC0gIixzZWl0ZVtpXSk7CisgICAgICBpZiAoaj1zaXplb2Yoc3luKSkgeworCWZvcihqLT0xO2o+PTA7ai0tKQorCSAgcHJpbnRmKCInJXMnICIsc3luW2pdKTsKKwl3cml0ZSgiXG4iKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKwl3cml0ZSggIihrZWluZSBTeW5vbnltZSBkZWZpbmllcnQpXG4iKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2ludAorbGVzZW4oc3RyaW5nIHN0cikKK3sKKyAgaWYgKCFJU19VU0VSKHRoaXNfcGxheWVyKCkpKQorICAgIHJldHVybiAwOworCisgIGlmICghc3RyIHx8IHN0ciA9PSAiIikgeworICAgIG5vdGlmeV9mYWlsKCJXYXMgd2lsbHN0IER1IGRlbm4gbGVzZW4/XG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBzdHIgPSBsb3dlcl9jYXNlKHRoaXNfcGxheWVyKCktPl91bnBhcnNlZF9hcmdzKCkpOworICBpZiAobWVtYmVyKHNlaXRlLHN0cik8MCkgeworICAgIGlmICghbWVtYmVyKHN5bm9ueW0sc3RyKSkgeworICAgICAgbm90aWZ5X2ZhaWwoIkRpZXNlIFNlaXRlIGdpYnQgZXMgbmljaHQuLi5cbiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UgCisgICAgICBzdHIgPSBzeW5vbnltW3N0cl07CisgIH0KKyAgdGhpc19wbGF5ZXIoKS0+TW9yZShGQVEoc3RyKSwxKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludAorYmVzY2hyZWliZW4oc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIGZhcSwqZGVzYzsKKyAgaW50IGk7CisKKyAgaWYgKCFJU19VU0VSKHRoaXNfcGxheWVyKCkpKQorICAgIHJldHVybiAwOworCisgIGlmICghc3RyIHx8IHN0ciA9PSAiIikgeworICAgIG5vdGlmeV9mYWlsKCJXYXMgd2lsbHN0IER1IGRlbm4gYmVzY2hyZWliZW4/XG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICAKKyAgc3RyID0gbG93ZXJfY2FzZSh0aGlzX3BsYXllcigpLT5fdW5wYXJzZWRfYXJncygpKTsKKworICBpZiAoc3NjYW5mKHN0ciwiZmFxICVzIixzdHIpIT0xKSB7CisgICAgbm90aWZ5X2ZhaWwoIlN5bnRheDogYmVzY2hyZWliZSBmYXEgPHNlaXRlPlxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgc3RyID0gaW1wbG9kZShvbGRfZXhwbG9kZShzdHIsIiAiKS0oeyIifSksICIgIik7CisgIGRlc2MgPSBvbGRfZXhwbG9kZShpbXBsb2RlKG9sZF9leHBsb2RlKHN0ciwiLCAiKSwiLCIpLCIsIik7CisgIGYgPSAwOworICBzID0gMDsKKworICBmb3IgKGk9c2l6ZW9mKGRlc2MpLTE7aT49MDtpLS0pIHsKKyAgICBpZiAobWVtYmVyKHNlaXRlLGRlc2NbaV0pPj0wKSB7CisgICAgICBmID0gZGVzY1tpXTsKKyAgICAgIHMgPSBkZXNjLSh7ZGVzY1tpXX0pOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmICghZikgeworICAgIGYgPSBkZXNjWzBdOworICAgIHMgPSBkZXNjWzEuLl07CisgIH0KKyAgd3JpdGUoIkJpdHRlIEJlc2NocmVpYnVuZyBmdWVyIGRpZSBGQVEtU2VpdGUgJyIrZisiJyBhbmdlYmVuXG4iKTsKKyAgbmVkaXQoImZhcSIpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK2ZhcShzdHJpbmcgc3RyKQoreworICBpbnQgaTsKKyAgc3RyaW5nIGZpbGU7CisKKyAgaWYgKCFzdHIgfHwgc3RyID09IDApIHsKKyAgICB3cml0ZSgiKiogQWJicnVjaCEgKipcbk5pY2h0cyBnZWFlbmRlcnQhXG4iKTsKKyAgICByZXR1cm47CisgIH0KKyAgCisgIGlmIChmaWxlX3NpemUoZmlsZT1GQVEoZikpPj0wKQorICAgIHJtKGZpbGUpOworICB3cml0ZV9maWxlKGZpbGUsIHN0cik7CisgIGlmIChtZW1iZXIoc2VpdGUsZik9PS0xKQorICAgIHNlaXRlICs9ICh7Zn0pOworCisgIGZvciAoaT1zaXplb2YocyktMTtpPj0wO2ktLSkgCisgICAgc3lub255bSArPSAoWyBzW2ldIDogZiBdKTsKKworICBzYXZlX29iamVjdChGQVEoImZhcSIpKTsKK30KKworaW50Citsb2VzY2hlbihzdHJpbmcgc3RyKQoreworICBzdHJpbmcgKnN5bjsKKyAgaW50IGk7CisKKyAgaWYoIUlTX1VTRVIodGhpc19wbGF5ZXIoKSkpCisgICAgcmV0dXJuIDA7CisKKyAgc3RyID0gbG93ZXJfY2FzZSh0aGlzX3BsYXllcigpLT5fdW5wYXJzZWRfYXJncygpKTsKKyAgaWYgKCFzdHIgfHwgc3RyID09ICIiKSB7CisgICAgbm90aWZ5X2ZhaWwoIldhcyB3aWxsc3QgRHUgZGVubiBsb2VzY2hlbj9cbiIpOworICAgIHJldHVybiAwOworICB9CisgIGlmIChtZW1iZXIoc2VpdGUsc3RyKT49MCkgeworICAgIHN5biA9IG1faW5kaWNlcyhmaWx0ZXJfaW5kaWNlcyhzeW5vbnltLAorCQkJCSBsYW1iZGEoKHsnaW5kLCdwYWdlLCdtYXBfbGRmaWVkLyonKi99KSwKKwkJCQkJKHsjJz09LCdwYWdlLCh7IydbLypdJyovLCdtYXBfbGRmaWVkLCdpbmR9KX0pKQorCQkJCSAsc2VpdGVbaV0sc3lub255bSkpOworICAgIHJtKEZBUShzdHIpKTsKKyAgICBzZWl0ZSAtPSAoe3N0cn0pOworICB9CisgIGVsc2UgeworICAgIHN0ciA9IGltcGxvZGUob2xkX2V4cGxvZGUoc3RyLCIgIiktKHsiIn0pLCAiICIpOworICAgIHN5biA9IG9sZF9leHBsb2RlKGltcGxvZGUob2xkX2V4cGxvZGUoc3RyLCIsICIpLCIsIiksIiwiKTsKKyAgfQorICBmb3IgKGk9c2l6ZW9mKHN5biktMTsgaT49MDsgaS0tKQorICAgIHN5bm9ueW0gPSBmaWx0ZXJfaW5kaWNlcyhzeW5vbnltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGEoKHsna2V5LCdjbXB9KSwKKwkJCQkgICAgKHsjJyE9LCdrZXksJ2NtcC8qJyovfSkpLAorCQkJICAgICBzeW5baV0pOworCisgIHNhdmVfb2JqZWN0KEZBUSgiZmFxIikpOworICB3cml0ZSgiT0tcbiIpOworICByZXR1cm4gMTsKK30KKworaW50Citrb3BpZXJlbihzdHJpbmcgc3RyKQoreworICBzdHJpbmcgKnBhcnQ7CisgIGludCBpOworCisgIGlmICghSVNfVVNFUih0aGlzX3BsYXllcigpKSkKKyAgICByZXR1cm4gMDsKKworICBzdHIgPSBsb3dlcl9jYXNlKHRoaXNfcGxheWVyKCktPl91bnBhcnNlZF9hcmdzKCkpOworICBwYXJ0ID0gb2xkX2V4cGxvZGUoc3RyLCIgIiktKHsiIn0pOworICBpZihzaXplb2YocGFydCk8NCB8fCBwYXJ0WzBdIT0iZmFxIiB8fCBwYXJ0WzJdICE9ICJuYWNoIiB8fCAKKyAgICAgbWVtYmVyKHNlaXRlLHBhcnRbMV0pID09IC0xKSB7CisgICAgbm90aWZ5X2ZhaWwoImtvcGllcmUgZmFxIDxzZWl0ZT4gbmFjaCA8YWxpYXM+XG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBzdHIgPSBwYXJ0WzFdOworICBwYXJ0PW9sZF9leHBsb2RlKGltcGxvZGUob2xkX2V4cGxvZGUoaW1wbG9kZShwYXJ0WzMuLl0sIiAiKSwiLCAiKSwiLCIpLCIsIik7CisgIGZvcihpPXNpemVvZihwYXJ0KS0xO2k+PTA7aS0tKQorICAgIHN5bm9ueW0gKz0gKFsgcGFydFtpXSA6IHN0ciBdKTsKKyAgc2F2ZV9vYmplY3QoRkFRKCJmYXEiKSk7CisgIHdyaXRlKCJPSy5cbiIpOworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NlaGVyZmFxbW9iaWwuYyBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NlaGVyZmFxbW9iaWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTBkYjRiCi0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc2VoZXJmYXFtb2JpbC5jCkBAIC0wLDAgKzEsNzkgQEAKKy8vIHRyYWdiYXJlIFNlaGVyLUZBUSwgZ2lidCBlcyBpbSBTZWhlcmxhZGVuIHp1IGthdWZlbiBiencuIGF1dG9tYXRpc2NoIHp1ciBTZWhlcndlcmR1bmcKKy8vIFJpa3VzQG1nLm11ZC5kZQorCitpbmhlcml0ICJzdGQvdGhpbmciOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgIi4uL2hhdXMuaCIKKworI2RlZmluZSBGQVEoZikgKFNQRUNJQUxQQVRIKyJmYXEvIisoZikpCisKK3N0YXRpYyBzdHJpbmcgKnNlaXRlOworCittYXBwaW5nIHN5bm9ueW0gPSAoW10pOworCitjcmVhdGUoKQoreworLy8gIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9TSE9SVCwiRGllIFNlaGVyRkFRIik7CisgIFNldFByb3AoUF9OQU1FLCJTZWhlckZBUSIpOworICBTZXRQcm9wKFBfR0VOREVSLEZFTUFMRSk7IAorICBTZXRQcm9wKFBfTE9ORywiRGllcyBpc3QgZGllIFNlaGVyRkFRLiBXZW5uIER1IHdlaXRlcmUgRnJhZ2VuIG9kZXIgIisKKyAgICAgICAgICAiQW5yZWd1bmdlbiB6dSBkaWVzZXIgRkFRXG5oYXN0LCBzZWkgc28gbmV0dCB1bmQgc2NoaWNrZSBTdGluZyAiKworICAgICAgICAgICJlaW5lbiBrdXJ6ZW4gQnJpZWYuIFp1bSBJbmhhbHQgZGVyIEZBUVxua29tbXN0IER1IG1pdCAiKworICAgICAgICAgICI+bGllcyBpbmhhbHQ8XG4iKTsKKyAgU2V0UHJvcChQX1dFSUdIVCwxMDApOworICBTZXRQcm9wKFBfVkFMVUUsMTAwMCk7CisgIEFkZElkKCh7ImZhcSIsInNlaGVyZmFxIn0pKTsKKyAgQWRkQ21kKCJsaWVzIiwibGVzZW4iKTsKKyAgcmVzdG9yZV9vYmplY3QoRkFRKCJmYXEiKSk7CisgIHNlaXRlID0gZ2V0X2RpcihGQVEoIioiKSktKHsiLiIsIi4uIiwiZmFxLm8ifSk7Cit9CisKK2luaXQoKQoreworICBvYmplY3QgbzsKKyAgOjppbml0KCk7CisgIGlmICgobz1lbnZpcm9ubWVudCgpKSAmJiBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG8pICYmICFJU19TRUVSKG8pKQorICAgICBjYWxsX291dCgid2VjaCIsMCk7Cit9CisKK3dlY2goKQoreworICAgd3JpdGUoIkRpZSBTZWhlci1GQVEgbGFjaHQgRGljaCBhdXMgdW5kIGxvZXN0IHNpY2ggaW4gV29obGdlZmFsbGVuIGF1Zi5cbiIpOworICAgcmVtb3ZlKCk7Cit9CisKK2ludCBsZXNlbihzdHJpbmcgc3RyKQoreworICBpZiAoIXN0ciB8fCBzdHIgPT0gIiIpIHsKKyAgICBub3RpZnlfZmFpbCgiV2FzIHdpbGxzdCBEdSBkZW5uIGxlc2VuP1xuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGVudmlyb25tZW50KCkhPXRoaXNfcGxheWVyKCkpIAorICB7CisgICAgIG5vdGlmeV9mYWlsKCJEdSBtdXNzdCBkaWUgRkFRIHNjaG9uIGVyc3QgbmVobWVuIVxuIik7CisgICAgIHJldHVybiAwOworICB9CisgIHN0ciA9IGxvd2VyX2Nhc2UodGhpc19wbGF5ZXIoKS0+X3VucGFyc2VkX2FyZ3MoKSk7CisgIGlmIChtZW1iZXIoc2VpdGUsc3RyKTwwKSB7CisgICAgaWYgKCFtZW1iZXIoc3lub255bSxzdHIpKSB7CisgICAgICBub3RpZnlfZmFpbCgiRGllc2UgU2VpdGUgZ2lidCBlcyBuaWNodC4uLlxuIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZSAKKyAgICAgIHN0ciA9IHN5bm9ueW1bc3RyXTsKKyAgfQorICB0aGlzX3BsYXllcigpLT5Nb3JlKEZBUShzdHIpLDEpOworICByZXR1cm4gMTsKK30KKworc3RyaW5nIF9xdWVyeV9leHRyYWxvb2soKQoreworICAgb2JqZWN0IG87CisgICBpZiAoKG89ZW52aXJvbm1lbnQoKSkgJiYgKG8tPlF1ZXJ5UHJvcChQX0dFTkRFUik9PUZFTUFMRSkpCisgICAgICByZXR1cm4gIk1pdCBpaHJlciBTZWhlci1GQVEgb3V0ZXQgc2llIHNpY2ggYWxzIFd1cnN0c2VoZXJpbi5cbiI7CisgICByZXR1cm4gIk1pdCBzZWluZXIgU2VoZXItRkFRIG91dGV0IGVyIHNpY2ggYWxzIFd1cnN0c2VoZXIuXG4iOworfQpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9mYXEvMCBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvZmFxLzAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVlYzk3YgotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvZmFxLzAKQEAgLTAsMCArMSwxOCBAQAorMC4gTkVVSUdLRUlURU4KK0hpZXIgYWt0dWVsbGUgQWVuZGVydW5nZW4gZGVyIFNlaGVyRkFRIDIuMCAoU3RhbmQgMi4xMS4xOTk1KToKKworLSBadW5hZWNoc3QgZWluZW4gZ3Jvc3NlbiBEYW5rIGFuIEN1Y2h1bGxpbiwgZGVyIGVpbmUgZGV0YWlsbGllcnRlCisgIEJlc2NocmVpYnVuZyBkZXIgQXJ0aWtlbCBhdXMgZGVtIFNlaGVybGFkZW4genVyIEZBUSBiZWlnZXRyYWdlbiBoYXQuCistIEVuZGxpY2ggZGllIG5ldWUgRkFRISBEaWUgbWVpc3RlbiBJbmZvcm1hdGlvbmVuIHdhcmVuIGZhc3QgZWluIEphaHIgYWx0LAorICB1bmQgaWNoIGhvZmZlLCBhbGxlIHJlbGV2YW50ZW4gSW5mb3JtYXRpb25lbiBhdWYgZGVtIGFrdHVlbGxlbiBTdGFuZCB6dQorICBoYWJlbi4KKy0gTWVocmVyZSBTZWhlcnBvcnRhbGUgd3VyZGVuIGluIGxldHp0ZXIgWmVpdCBuZXUgYW5nZWhhZW5ndC4gV2VsY2hlIG51bm1laHIKKyAgdm9yaGFuZGVuIHNpbmQsIGthbm5zdCBkdSBpbiAnMS4gVHJhbnNwb3J0bW9lZ2xpY2hrZWl0ZW4nIG5hY2hsZXNlbi4KKy0gVG9ldGVyIGhhdCBkYXMgc2V0bW91dCBnZWFlbmRlcnQgLSBudW5tZWhyIGthbm4gZGllIFJpY2h0dW5nc2FuZ2FiZQorICB3ZWdnZWxhc3NlbiBvZGVyIGFuIGVpbmUgYmVsaWViaWdlIFN0ZWxsZSBpbSBUZXh0IGdlc2V0enQgd2VyZGVuLgorLSBJbSBTZWhlcmxhZGVuIGdpYnQgZXMgZWluaWdlIG5ldWUgQXJ0aWtlbDsgaGllcnp1ICc3LiBTZWhybGFkZW4nLgorLSBEaWUgUGFyYWxsZWxkaW1lbnNpb24gd2FlY2hzdCBzdGFlbmRpZzsgZWluaWdlIGludGVyZXNzYW50ZSBNb25zdGVyIGhpZXJhdXMKKyAgc2luZCBpbiAnMTAuIFBhcmFsbGVsZGltZW5zaW9uJyBhdWZnZWZ1ZWhydCwgYWJlciB3aWUgc28gb2Z0LCBzZWxic3QKKyAgc2NoYXVlbiwgdW5kIG1hbiBmaW5kZXQgd2FzIG5ldWVzIDstKS4KKworCmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL2ZhcS8xIGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9mYXEvMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTk1NGMwCi0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9mYXEvMQpAQCAtMCwwICsxLDQ3IEBACisxLiBUcmFuc3BvcnRtb2VnbGljaGtlaXRlbi4KKworQWxzIFNlaGVyIGthbm5zdCBEdSBudW5tZWhyIGF1ZiBlaW5pZ2UgbmV1ZSBGb3J0YmV3ZWd1bmdzbW9lZ2xpY2hrZWl0ZW4KK3p1Z3JlaWZlbiwgdW0gc2NobmVsbGVyIHZvbiBlaW5lbSBPcnQgenVtIGFuZGVyZW4genUgZ2VsYW5nZW46CisKK0EpIFNlaGVycG9ydGFsZQorQWxzIFNlaGVyIGthbm5zdCBEdSBhYiBzb2ZvcnQgbWFnaXNjaGUgUG9ydGFsZSBudXR6ZW4sIHVtIHNjaG5lbGxlcgordm9uIGVpbmVtIE9ydCB6dW0gYW5kZXJlbiB6dSBnZWxhbmdlbi4gZXMgZ2lidCBpbSBNb21lbnQgMjEgVG9yZSwKK2RpZSBhbiBmb2xnZW5kZW4gU3RlbGxlbiBsaWVnZW46CisKKyAxLiBUYW1pYmFyIERzY2h1bmdlbCAgICAgICAgICAgICAgMTEuIEtsaXBwZW5wZmFkIGF1ZiBBdXJvcmEKKyAyLiBCZWkgZGVuIERyYWNoZW56aW5uZW4gICAgICAgICAgMTIuIEhhdXB0c3RyYXNlIFN1ZWRlbmRlIGF1ZiBTdm9sdmFlcgorIDMuIFBvcnQgVmFpbmVyIFN0YWR0dG9yICAgICAgICAgICAxMy4gSW0gQmVyZ2RvcmYKKyA0LiBBbiBlaW5lbSBCYWNoIGltIEdlYmlyZ2UgICAgICAgMTQuIFZvcnBsYXR6IFRyYXVrYXBlbGxlCisgNS4gSW0gUG9sYXJnZWJpZXQgICAgICAgICAgICAgICAgIDE1LiBMYXNoCisgNi4gVHVuZHJhICAgICAgICAgICAgICAgICAgICAgICAgIDE2LiBJbSBEc2NodW5nZWwKKyA3LiBGZWVuc3RyYXNzZSAgICAgICAgICAgICAgICAgICAgMTcuIEF1ZiBkZW4gV29sa2VuCisgOC4gV2FsZHdlZyAgICAgICAgICAgICAgICAgICAgICAgIDE4LiBBbSBGbHVzcyBUYWluIFdlbiBUYWkKKyA5LiBSdWluZW5zdGFkdCAgICAgICAgICAgICAgICAgICAgMTkuIFJpdHRlcmRlbmttYWwgYmVpIE9ya2hhdXNlbgorMTAuIFZvcnBsYXR6IEFyZW5hICAgICAgICAgICAgICAgICAyMC4gUm9kZWxiYWhuCisyMS4gSG9iYml0ZG9yZgorCitEaWVzZSBUb3JlIGthbm5zdCBkdSBtaXQgZGVtIEJlZmVobCAndGVsZXBvcnRpZXJlJyBiZW51dHplbi5EaWVzIHNldHp0CithbGxlcmRpbmdzIHZvcmF1cywgZGFzcyBEdSBkaWVzZXMgUG9ydGFsIGJlcmVpdHMgZ2VmdW5kZW4gaGFzdC4gRHUgbXVzc3QgZGllCitQb3J0YWxlIGFsc28genVuYWVjaHN0IGVpbm1hbCBzdWNoZW4gOykuRWluIFRlbGVwb3J0aWVyZW4genUgZWluZW0gYW5kZXJlbgorUG9ydGFsIGtvc3RldCA1MCBNUC4gRGEgZGFuYWNoIGltbWVyIHdpZWRlciBnZWZyYWd0IHdpcmQ6IE5hdHVlcmxpY2gga2FubiBtYW4KK2RpZSBQb3J0YWxlIG51ciBiZW51dHplbiwgd2VubiBtYW4gc2ljaCBnZXJhZGUgYmVpIGVpbmVtIGJlZmluZGV0IDspKS4KKworQikgUGVnYXN1cworRHUga2FubnN0IGViZW5zbyBtaXQgUGVnYXN1cyBkdXJjaCBkaWUgR2VnZW5kIGZsaWVnZW4gLSBkYXMga29zdGV0IGtlaW5lCitNUCB1bmQgZ2VodCBhdWNoIHJlY2h0IGZpeGUgLSBIYWx0ZXN0ZWxsZW46IHZvciBkZW0gRWxmZW5kb3JmLCBpbQorUG9sYXJnZWJpZXQsIFp3ZXJnZW5zdGFkdCwgU3ZvbHZhZXIsIFBvcnQgVmFpbi4gRWlubWFsIG1pdGZsaWVnZW4KK2tvc3RldCAyMjIgTXVlbnplbiwgdW5kIG1hbiBrYW5uIGFscyBTZWhlciBlaW5lbiBub3JtYWxlbiBTcGllbGVyCit6dW0gTWl0ZmxpZWdlbiBlaW5sYWRlbi4gSWNoIGZsdWNoZSByZWdlbG1hZXNzaWcgdWViZXIgUGVnYXN1cywgd2VpbAorbWFuIGVzIGthdW0gc2NoYWZmdCwgPmJlc3RlaWdlIFBmZXJkPCBlaW56dWdlYmVuLCBzbyBzY2huZWxsIGhlYnQKK2RhcyBUaWVyY2hlbiB3aWVkZXIgYWIuIERlc2hhbGIgaGFiIGljaCBtaXIgZWluIGFsaSBkYXJhdWYgZ2VsZWd0LCBpc3QKK3dvaGwgZW1wZmVobGVuc3dlcnQuCisKK0MpIFNpZWJlbm1laWxlbnN0aWVmZWwKK0RpZXNlIGthbm4gbWFuIGltIFNlaGVyIGltIFNlaGVybGFkZW4ga2F1ZmVuOyBzaWUgaGFiZW4gZGllIEVpZ2Vuc2NoYWZ0LAoraWhyZW4gVHJhZWdlciBpbW1lciBiaXMgenVyIG5hZWNoc3RlbiBLcmV1enVuZyB3ZWl0ZXJ6dXRyYWdlbiwgd2FzIGJlaSBsYW5nZW4KK1dlZ2VuIHNpbm52b2xsIHNlaW4ga2FubiwgaW4gdmllbGVuIEdlZ2VuZGVuIGplZG9jaCBuaWNodCBmdW5rdGlvbmllcnQsIHdlaWwKK2luIGplZGVtIFJhdW0gbWVociBhbHMgendlaSBBdXNnYWVuZ2Ugdm9ya29tbWVuLiBBdXNzZXJkZW0gaXN0IGRhcyBHYW56ZQorZXh0cmVtIGdld29laG51bmdzYmVkdWVyZnRpZywgZGEgbWFuIGJla2FubnRlIFdlZ2UgamV0enQgbWl0IGdhbnogYW5kZXJlbgorVGFzdGVua29tYmluYXRpb25lbiBhYmdlaHQsIGFscyB3ZW5uIG1hbiBkaWUgV2VnZSBlaW5mYWNoIHdpZSBnZXdvaG50CisncnVudGVycmF0dGVydCcuIEVpbmZhY2ggbWFsIGF1c3Rlc3RlbiwgbHVzdGlnIGlzdHMgYWxsZW1hbC4KKwpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9mYXEvMTAgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL2ZhcS8xMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGU5NmY0Ci0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9mYXEvMTAKQEAgLTAsMCArMSwyMyBAQAorCisxMC4gUEFSQUxMRUxESU1FTlNJT04KKworV2Fyc2NoZWlubGljaCBoYXN0IER1IHNjaG9uIGltbWVyIGdlZGFjaHQ6ICdFaW5lIFdlbHQgamVuc2VpdHMgZGVzCitNb3JnZW5HcmF1ZW5zIGdpYnQgZXMgZ2VuYXVzb3dlbmlnIHdpZSBHZWhlaW1idWVuZGUhJyAtIE51biwgYmV6dWVnbGljaCBkZXIKK0dlaGVpbWJ1ZW5kZSBtYWcgZGFzIHp1dHJlZmZlbiwgdW5kIG5hdHVlcmxpY2ggc29sbHN0IER1IGF1Y2gga2VpbmUgV2VsdAoraGFiZW4gbmViZW4gZGVtIE1vcmdlbkdyYXVlbiwgYWJlciBlcyBnaWJ0IGltIE1VRCBlaW5lIFdlbHQsIGRpZSBudXIgU2VoZXIKK2JldHJldGVuIGtvZW5uZW46IERpZSBQYXJhbGxlbGRpbWVuc2lvbi4KKworTW9tZW50YW4gaXN0IGRpZSBQYXJhbGxlbGRpbWVuc2lvbiBub2NoIGVpbmUgcmVsYXRpdiBrbGVpbmUgV2VsdCwgZGllIHZvbiBkZW4KK21laXN0ZW4gU2VoZXJuIGVoZXIgcGVyIFp1ZmFsbCBiZXRyZXRlbiB3aXJkOyBtYW4gZXJyZWljaHQgc2llIG5hZW1saWNoIG51ciwKK3dlbm4gYmVpbSB0ZWxlcG9ydGllcmVuIGluIGVpbmVtIG1hZ2lzY2hlbiBQb3J0YWwgZXR3YXMgc2NoaWVmIGxhZXVmdC4uLiBudW4sCitkaWVzZW4gRWZmZWt0IGthbm4gbWFuIHVta2VocmVuLCBlcyBnaWJ0IGF1Y2ggZWluIHN0YXJyZXMgUG9ydGFsLCBkYXMgZWluZW0KK2RhcyBiZXd1c3N0ZSBCZXRyZXRlbiAvIFZlcmxhc3NlbiBkZXIgUGFyYWxsZWx3ZWx0IGVybW9lZ2xpY2h0LiBCZXZvciBtYW4KK2plZG9jaCBIYWxzIHVlYmVyIEtvcGYgaW4gYmVrYW5udGUgU3BoYWVyZW4genVydWVja2tlaHJ0LCBzb2xsdGUgbWFuIHNpY2gKK3NjaG9uIGVpbiB3ZW5pZyBpbiBkZXIgUGFyYWxsZWxkaW1lbnNpb24gdW1zY2hhdWVuLCBkYSBkaWVzZSBzdGV0aWcgYXVzZ2ViYXV0Cit3aXJkIHVuZCBtaXR0bGVyd2VpbGUgZWluaWdlIGludGVyZXNzYW50ZSBNb25zdGVyIGVudGhhZWx0LiBEaWVzZSBmaW5kZW4gc2ljaAorSGF1cHRzYWVjaGxpY2ggaW4gZGVyIEViZW5lLCB3byBtYW4gZWlubWFsIGRlbiBXZWdoaWVyLCBkZW4gQ3UgU2l0aCB1bmQgZGVuCisoZGVuID8gKERJRSEpKSBHb2JsaW5kcmFjaGVuIGF1ZnN1Y2hlbiBzb2xsdGU7IGFiZXIgYXVjaCBpbiB1bmQgdW0gU2NocnVtcGZpcworR3J1ZnQgZmluZGVuIHNpY2ggZWluaWdlIGludGVyZXNzYW50ZSBNb25zdGVyLgorCitVbmQ6IEhhdmUgZnVuLCBzY2h3YWNoZSBOZXJ2ZW4gc29sbHRlIG1hbiBkb3J0IG5pY2h0IG1pdGJyaW5nZW4gOi0pLgorCmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL2ZhcS8xMSBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvZmFxLzExCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MmI3NWEKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL2ZhcS8xMQpAQCAtMCwwICsxLDE0IEBACisKKzExLkZJTkdFUi1CRUZFSEwKKworV2VubiBEdSBlaW5tYWwgcHJvYmllcnN0LCBlaW5lbiBhbmRlcmVuIFNwaWVsZXIgenUgZmluZ2Vybiwgd2lyc3QgRHUKK2Zlc3RzdGVsbGVuLCBkYXNzIER1IG51biBlaW5pZ2UgenVzYWV0emxpY2hlIEluZm9ybWF0aW9uZW4gZXJoYWVsc3QsIGJlaQorbm9ybWFsZW4gU3BpZWxlcm4gaWhyIEFsdGVyLCB1bmQgYmVpIFNlaGVybiAvIE1hZ2llcm4genVzYWV0emxpY2ggZGllCit1ZWJlciBQbGFuIHVuZCBQcm9qZWt0IGVpbmdlZ2ViZW5lbiBJbmZvcm1hdGlvbmVuLgorCitTbywgdW5kIHdlbm4gRHUgZGFubiBhdWNoIG9iZW5kcmVpbiBuaWNodCBhbGx6dSB6aW1wZXJsaWNoIGJpc3QsIHVuZCBnZXJuZQorTGV1dGUgRGljaCBmaW5nZXJuIGxhZXNzdCwgc28gd2lyc3QgRHUgbmF0dWVybGljaCBhdWNoIGVpbmVuIFBsYW4gdW5kIGVpbgorUHJvamVrdCBpbiBEZWluZW0gJ2ZpbmdlcicgZWluc2V0emVuLiBEaWVzIGthbm5zdCBEdSBtaXQgSGlsZmUgZGVzCitQbGFuZWRpdG9ycyBtYWNoZW4sIGRlbiBEdSBpbSBTZWhlcmxhZGVuIGVyaGFlbHN0LgorCisKZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvZmFxLzEyIGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9mYXEvMTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU5M2Y2NAotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvZmFxLzEyCkBAIC0wLDAgKzEsMTUgQEAKKzEyLiBFQ0hPICYgUi1FTU9URQorU29sbHRlc3QgRHUgaXJnZW5kd2FubiBkZW4gQXJjaGllIGdlbG9lc3QgaGFiZW4gKHdhcyBkcmluZ2VuZCB6dQorZW1wZmVobGVuIGlzdCwgZGVubiBkYXMgaXN0IGRlZmluaXRpdiBlaW5lcyBkZXIgYmVzdGVuIHF1ZXN0cyBoaWVyIG5lYmVuCitkZW4gUHlyYXMgdW5kIFRhcmtvIC0gSU1ITykgLSBkYW5uIHN0ZWh0IERpciBhbHMgU2VoZXIgaGludGVyaGVyIGRlcgorRUNITy1CZWZlaGwgenVyIFZlcmZ1ZWd1bmcsIG1pdCBkZXNzZW4gSGlsZmUgRHUgaW4gZGVyIExhZ2UgYmlzdCwKK2VpbmVuIHgtQmVsaWViaWdlbiBUZXh0IGluIGRlbSBSYXVtIGFienVzZXR6ZW4sIGluIGRlbSBEdSBEaWNoCitiZWZpbmRlc3QsIHNvIGRhRGljaCBhdWNoIGFsbGUgYW5kZXJlbiBTcGllbGVyIGRpZXNlbiBUZXh0IGxlc2VuIGtvZW5uZW4uLi4KK05ldHRlIFNwaWVsZXJlaSwgZGllIGxlaWRlciA0OCBNUCBrb3N0ZXQsIGFiZXIgdHJvdHpkZW0gaW1tZXIgenUgZWluZW0KK2tsZWluZW4gR2FnIGd1dCBpc3QgKGdlbGxlLCBCbG9vZGdvcmUgPz8/KS4KKworU29sbHRlc3QgRHUgZGFzIFNlaGVycXVlc3QgJ0RpZSBLcmlzdGFsbGt1Z2VsJyBnZWxvZXN0IGhhYmVuLCBzbyBzdGVodCBEaXIKK2F1Y2ggZGFzICdyLWVtb3RlJyB6dXIgVmVyZnVlZ3VuZywgZGFzIGVzIERpciBlcm1vZWdsaWNodCwgZGFzIHNlaXQgZGVyCitMb2VzdW5nIGRlcyBBbWFyeWxsaXMtUXVlc3RzIChoYXN0IER1IGRvY2ggd29obCAhISkgbW9lZ2xpY2hlIGVtb3RlIGF1Y2ggYXVmCitTcGllbGVyIGF1c3NlcmhhbGIgZGVzIFJhdW1lcyBhbnp1d2VuZGVuLgorCmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL2ZhcS8xMyBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvZmFxLzEzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyODY2ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL2ZhcS8xMwpAQCAtMCwwICsxLDE0IEBACisxMy4gTUFHSVNDSEVSIEJFVVRFTAorSW4gZGVtIFNlaGVybGFkZW4gYXVmIFN2b2x2YWVyIGthbm5zdCBEdSBlaW5lbiBtYWdpc2NoZW4gQmV1dGVsIGthdWZlbiwgbWl0CitkZW0gRHUgT2JqZWt0ZSBlcnpldWdlbiBrYW5uc3QuIEdydW5kc2FldHpsaWNoIGlzdCBkaWVzIHp3YXIgbnVyIGVpbiBTcGFzcywKK2FiZXIgZXMgbGFzc2VuIHNpY2ggZGFtaXQgZ3J1bmRzYWV0emxpY2ggYXVjaCBPYmpla3RlIGVyemV1Z2VuLCBkaWUgaW0gU3BpZWwKK3ZlcndlbmRldCB3ZXJkZW4ga29lbm5lbi4gQWxsZXJkaW5ncyBoYWx0ZW4gZGllc2UgT2JqZWt0ZSBudXIga25hcHBlIDE1CittaW51dGVuLCBiZXZvciBzaWUgc2ljaCBpbiBMdWZ0IGF1ZmxvZXNlbi4KKworRGEgZGllIEFud2VuZHVuZyBkZXMgQmV1dGVscyBvZnRtYWxzIGRhcmFuIHNjaGVpdGVydCwgZGFzcyBlciBlaW4gd2VuaWcga29tLQorcGxpemllcnQgenUgQmVkaWVuZW4gdW5kIHNjaGxlY2h0IGRva3VtZW50aWVydCBpc3QsIGhhYmUgaWNoIGVpbmUgc3RlcC1ieS0KK3N0ZXAgQW5sZWl0dW5nIGRhenUgZ2VzY2hyaWViZW4sIGRpZSBhbGxlcmRpbmdzIHJlY2h0IGF1c2Z1ZWhybGljaCBpc3Q7Citzb2xsdGVzdCBEdSBkaWUgRkFRIG51ciBmdWVyIGVpbmVuIGt1cnplbiBVZWJlcmJsaWNrIGxlc2VuIHdvbGxlbiwgc28ga2FubnN0CitEdSBkaWUgQW5sZWl0dW5nIG5hdHVlcmxpY2ggYXVjaCBzcGFldGVyIGxlc2VuLiBBbnNvbnN0ZW46IERpZSBBbmxlaXR1bmcKK2xpZXN0IG1hbiBtaXQgJ2xpZXMgQW5sZWl0dW5nJyEhIDstKQorCmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL2ZhcS8xNCBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvZmFxLzE0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NDg1MGYKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL2ZhcS8xNApAQCAtMCwwICsxLDYxIEBACisxNC4gU0VIRVJIQUVVU0VSCitJbnRlcmVzc2FudGVzIFRoZW1hOiBEaWUgU2VoZXJoYXVzZXI6IFNpZSBnaWJ0IGVzIG51biBzZWl0IGNhLiBNaXR0ZQorT2t0b2JlciA5NCwgdW5kIGZvbGdlbmRlcyBpc3QgZGF6dSBhbnp1bWVya2VuOgorSS4gSW4gZGVyIEJhdXNwYXJrYXNzZSBpbiBEcmFjaGVuaG9ydCBnaWJ0IGVzIGRpZSBub2V0aWdlbiBJbmZvcm1hdGlvbmVuCit6dSBkZW4gSGF1ZXNlcm4uIERhcyBJbmZvcm1hdGlvbnNibGF0dCBmdWVyIDEwLjAwMCBNdWVuemVuIHNvbGx0ZSBtYW4KK3NpY2ggZWJlbiB6dWxlZ2VuLCBhdWNoIHdlbm4gbnVyIGVpbmUgU2VpdGUgSW5mb3MgZHJpbnN0ZWhlbiwgdW5kIGVzCituYWNoIGRlbSBlcnN0ZW4gTGVzZW4gd2VnIGlzdCA6KCguCitHcnVuZHNhZXR6bGljaCBnaWJ0IGVzIHp3ZWkgTW9lZ2xpY2hrZWl0ZW4sIHp1IGVpbmVtIEhhdXMgenUga29tbWVuOgorYSkuIERlciBzY2huZWxsZSBWZXJ0cmFnOiBLb3N0ZXQgMiBNaW8gRVBzLCBtYW4gbXVzcyBhbGxlIDIgb25saW5lIFN0dW5kZW4KK2VpbmUgUmF0ZSB2b24gODAuMDAwIEVQcyBlaW56YWhsZW4gLSBpbnNnZXNhbXQgYWxzbyAyNSBSYXRlbi4gRGllCitaZWl0IGthbm4gdS5VLiBuYWNoIGVpbmVtIENyYXNoIGV0d2FzIGtuYXBwIHdlcmRlbiwgZGEgbWFuIGRhbm4KK25pY2h0IGRpZSBub2V0aWdlIFplaXQgaGF0LCB1bSBzaWNoIHNlbGJzdCBlcnN0bWFsIEF1c3J1ZXN0dW5nIHp1CitiZXNvcmdlbiwgdW5kIGphIHZvciBhbGxlbSBhbGxlIFNwaWVsZXIgZGFiZWkgc2luZCwgc2ljaCBBdXNydWVzdHVuZyB6dQorYmVzY2hhZmZlbiwgc28gZGFzcyBuaWNodCB2aWVsIHp1IGhvbGVuIGlzdC4KK2IpLiBEZXIgbGFuZ3NhbWUgVmVydHJhZzogS29zdGV0IDIuNCBNaW8gRXBzIC0gYWxzbyAzMCBSYXRlbiwKK21hbiBtdXNzIGFsbGUgNCBvbmxpbmUgU3R1bmRlbiBzZWluZSBSYXRlIHZvbiA4MC4wMDAgRVBzCitlaW56YWhsZW4uIFNpY2hlciBiZXNzZXIgZ2VlaWduZXQgZnVlciBkaWVqZW5pZ2VuLCBkaWUgb2Z0IHRhbGtlbiwgdW5kIG5pY2h0CitkaWUgbmFlY2hzdGUgV29jaGUgbnVyIG1pdCBtZXR6ZWxuIHZlcmJyaW5nZW4gd29sbGVuIC0KK0dlc2NobWFja3NzYWNoZS4uLi4gbmF0dWVybGljaCBrYW5uIG1hbiBiZWkgYmVpZGVuIFZlcnRyYWdzYXJ0ZW4gYXVjaAorc2NobmVsbGVyIGVpbnphaGxlbiwgYWxzbyBtdXNzIG1hbiBzaWNoIGtlaW5lIFNvcmdlIG1hY2hlbiwgZGFzcyBtYW4KK2JlaW0gNC1zdHVuZGVuIFZlcnRyYWcgZXdpZyB3YXJ0ZW4gbXVzcywgYmlzIG1hbiBlaW5lbiBuZXVlbgorTWFzdGVyYmxvY2sga3JpZWd0LCBhdWYgZGVtIGRpZSBHdXRoYWJlbiBndXRnZXNjaHJpZWJlbiB3ZXJkZW4uCitjKSBXZWxjaGUgVmVydHJhZ3Nmb3JtIG1hbiB3YWVobHQsIGlzdCBlaW5lbSBzZWxic3QgdWViZXJsYXNzZW4uLi4uIGFiZXIKK3VlYmVybGVncyBEaXIgZ3V0LCBvYiBEdSBkaWUgWmVpdCB6dW0gdGFsa2VuIGJlaGFsdGVuIHdpbGxzdCwgZGVubiBkaWUKK3dpcmQgYmVpbSAyaCAtIFZlcnRyYWcgc2NobmVsbCBrbmFwcCAtIG5pY2h0IHp1IHZlcmdlc3NlbiBkaWUgVGF0c2FjaGUsCitkYXNzIGJlaSBVZWJlcnppZWhlbiBkZXIgRWluemFobHVuZ3N6ZWl0IGZ1ZXIgZGllIGVpbnplbG5lbiBSYXRlbgorenVuYWVjaHN0IGVpbmUgc2FmdGlnZSBTdHJhZmUgZmFlbGxpZyB3aXJkLCB1bmQgZGFubiBzb2dhciBkZXIgZ2FuemUKK1ZlcnRyYWcgZmxvZXRlbiBnZWhlbiBrYW5uLi4uLgorZCkuIE1laW5lIEFubWVya3VuZzogV2VyIHNvIHJpY2h0aWcgaGVpc3MgYXVmIGVpbiBIYXVzIGlzdCwgbWV0emVsdCBlaW5lCituYWNodCBkdXJjaC4gSWNoIGhhYiBkYW1hbHMgdW0gMC4wMCBVaHIgYW5nZWZhbmdlbiwgdW5kIG1vcmdlbnMgdW0gOAord2FyIGRhcyBIYXVzIGZlcnRpZyAtIG5hY2h0cyBzaW5kIHdlbmlnZXIgU3BpZWxlciBkYWJlaSwgdW5kIG1hbiBoYXQKK21laHIgT3BmZXIsIGRpZSBtYW4gYXVzc2NobGFjaHRlbiBrYW5uLi4uLi4uIER1cmNoc2Nobml0dHN6ZWl0IGZ1ZXIgZWluZQorUmF0ZSB3YXIgbGF1dCBsb2dmaWxlIDIzIG1pbnV0ZW4uLi4uIHNpY2hlcmxpY2ggZWluIEFyZ3VtZW50IGZ1ZXIgZGVuIDItCitTdHVuZGVuLSBWZXJ0cmFnLgorSUkuIFNlaXQgTWl0dGUgSmFudWFyIGtvZW5uZW4gaW4gZGVuIEhhZXVzZXJuIGF1Y2ggZXh0cmEtUmFldW1lIGVpbmdlYmF1dAord2VyZGVuLiBEaWVzZSBrb3N0ZW4gcHJvIFN0dWVjayAyMDAuMDAwIE11ZW56ZW4sIHVuZCBtYW4ga2Fubiwgd2llCithdWNoIGJlaW0gSGF1c2JhdSwgendpc2NoZW4gZWluZW0gc2NobmVsbGVuIHVuZCBlaW5lbSBzYW5mdGVuIFZlcnRyYWcKK3dhZWhsZW4uCitNYXhpbWFsIGtvZW5uZW4gOSBSYWV1bWUgYW4gZGFzIEhhdXMgYW5nZWJhdXQgd2VyZGVuLiBTb2Zlcm4gaW4gZWluZW0KK1JhdW0gbWVocmVyZSBIYWV1c2VyIHN0ZWhlbiwgYmVzdGVodCBhdWNoIGRpZSBNb2VnbGljaGtlaXQsIGRpZSBkdXJjaAorZGVuIEJlZmVobCBBdXNnYW5nIG1pdGVpbmFuZGVyIHp1IHZlcmJpbmRlbi4KK0lJSS4gSW4gZGVuIFNlaGVyaGFldXNlcm4gc2luZCBzZWl0IEZlYnJ1YXIgJyA5NSBkYXMgQmVzY2hyZWliZW4gdm9uIEJlZmVobGVuCit1bmQgc3BlemlmaXNjaGUgQXVzZ2FiZW4gbW9lZ2xpY2guIFNvIGthbm4gbWFuIFJhc3NlbiB1bmQgLSBHZXNjaGxlY2h0c3NwZS0KK3ppZmlzY2hlIEF1c2dhYmVuIG1hY2hlbi4gRWJlbnNvIGlzdCBlcyBtb2VnbGljaCwgZHVyY2ggRWluZ2FiZSB2b24gQmVmZWhsZW4KK2Jlc3RpbW10ZSBBdXNnYWJlbiB6dSBlcnJlaWNoZW4sIHouQi4gJ2RydWVja2Uga25vcGYnIC0gJyBlaW4gRmFkZW4gZmFlbGx0Cit2b24gZGVyIERlY2tlJyB1c3cuIFdpZSBkYXMgdm9yIHNpY2ggZ2VodCwgd2FlcmUgaGllciB6dSB1bWZhc3NlbmQsIGF1c3Nlci0KK2RlbSBoYXQgV2FyZ29uIGVpbmUgaGVydm9ycmFnZW5kZSBIaWxmZXNlaXRlIHp1IGRlbiBIYWV1c2VybiBlcnN0ZWxsdCwgZGllCitzZWhyIGRldGFpbGxpZXJ0IGVya2xlcnQsIHdpZSBtYW4gdm9yZ2VoZW4gbXVzcy4KK0lWLiBEZXN3ZWl0ZXJlbiBrYW5uIG1hbiBudW4gZGllIFRydWhlIGluIGRlbiBTZWhlcmhhZXVzZXJuIHZlcnNjaGllYmVuLAordW1iZW5lbm5lbiB1bmQgaWhyIGVpbmVuIEV4dHJhbG9vayBnZWJlbi4gQXVzc2VyZGVtIGthbm4gZGllIEhhdXN0dWVyIG1pdAorc3BlemllbGxlbiBGdW5rdGlvbmVuIGluIGRpZSBBdXNzZW5iZXNjaHJlaWJ1bmcgZGVzIEhhdXNlcyBlaW5nZWJhdXQgb2RlcgordW5zaWNodGJhciBnZW1hY2h0IHdlcmRlbi4gQXVjaCBoaWVyenUgZW1wZmVobGUgaWNoIGRpZSBMZWt0dWVyZSBkZXIgSGlsZmUtCitTZWl0ZSB6dW0gU2VoZXJoYXVzLgorVi4gRGllIE1vZWdsaWNoa2VpdGVuLCBkaWUgSW0gU2VoZXJoYXVzIHp1ciBWZXJmdWVndW5nIHN0ZWhlbiwgc2luZCBoaWVyIG51cgorcnVkaW1lbnRhZXIgZGFyc3RlbGxiYXIsIGluc2Jlc29uZGVyZSBkYSBzaWUgZGFuayBXYXJnb24ncyB0b2xsZXIgQXJiZWl0IGluCitkaWVzZW0gQmVyZWljaCBzdGV0aWcgd2FjaHNlbi4gSWNoIHBsYW5lIGluIG5hZWhlcmVyIFp1a3VuZnQgZWlubWFsIGVpbgorJ011c3RlcmhhdXMnIGF1Znp1YmF1ZW4sIGluIGRlbSBhbGxlIE1vZWdsaWNoa2VpdGVuLCBkaWUgZGllIFNlaGVyaGFldXNlcgorYmlldGVuLCBkYXJnZXN0ZWxsdCB3ZXJkZW4sIGFsbGVyZGluZ3Mgd2lyZCBkaWVzZXMgbmljaHQgdm9yIEphbnVhciAxOTk2CitmZXJ0aWcgd2VyZGVuOyBhbGxlcmRpbmdzIGthbm5zdCBEdSBlaW5lIE1lbmdlIEhpbGZlbiBhdWNoIGF1ZiBkZW4KK0hpbGZlc2VpdGVuIHp1bSBTZWhlcmhhdXMgZXJoYWx0ZW4sIGRpZSBzZWhyIGF1c2Z1ZWhybGljaCB1bmQgZ3V0IGdlc2NocmllYmVuCitzaW5kLgpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9mYXEvMTUgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL2ZhcS8xNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDkxMDljCi0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9mYXEvMTUKQEAgLTAsMCArMSwyNCBAQAorMTUuIFNFSEVSU1BJRUxQTEFUWgorCitNaXQgZGVtIFNlaGVyc3BpZWxwbGF0eiBpc3QgbnVubWVociBhdWNoIGVpbmUgUmVnaW9uIGVyb2VmZm5ldCB3b3JkZW4sCitkaWUgYXVzc2NobGllc3NsaWNoIHZvbiBkZW4gU2VoZXJuIGdlc3RhbHRldCB3ZXJkZW4gc29sbC4gRWluaWdlIGhhYmVuCitkaWUgSW5zZWwgYW0gT3N0cmFuZCBkZXIgV3Vlc3RlIGphIHNjaG9uIGdlc2VoZW4gdW5kIGRvcnQgc2Nob24gZWluaWdlcworZ2ViYXN0ZWx0LgorWndlaSBTYWNoZW4gZXJzY2hlaW5lbiBtaXIgaW0gWnVzYW1tZW5oYW5nIG1pdCBkZXIgSW5zZWwKK2Vyd2FlaG5lbnN3ZXJ0OiAxLiBEaWUgR2VzdGFsdHVuZyBkZXIgSW5zZWwga2FubiB3aXJrbGljaCBudXIgZ2VsaW5nZW4sCit3ZW5uIGFsbGUgU2VoZXIgenVzYW1tZW5hcmJlaXRlbi4gRGllcyBoZWlzc3QsIGRhc3MgbWFuIHNpY2gKK2luc2Jlc29uZGVyZSBiZWkgZGVuIGdld2FlaGx0ZW4gQXVzZ2FlbmdlbiBhYnNwcmljaHQsIHVtIGVpbgorZW50c3RhbmRlbmVzIGxhYiBuaWNodCBkdXJjaCBlaW5lbiBlaW5mYWNoZW4gQXVzZ2FuZyBrYXB1dHR6dW1hY2hlbi4KKzIuIFNvYmFsZCBkaWUgQXVzZ2FlbmdlIGdlbGVndCBzaW5kLCB1bmQgZGllIGVyc3RlbgorUmF1bWJlc2NocmVpYnVuZ2VuIGdlc2NocmllYmVuIHdlcmRlbiwgaGVpc3N0IGVzIGF1Y2ggd2llZGVyCithdWZwYXNzZW4uIEVzIHdhZXJlIHNjaG9lbiwgd2VubiBiZW5hY2hiYXJ0ZSBSYWV1bWUgaW4gZ2V3aXNzZXIKK0Zvcm0gYXVjaCB6dWVpbmFuZGVyIHBhc3NlbiAtIGFsc28gc2NoYXV0IEV1Y2ggdW0sIHdlbm4gaWhyIGVpbmVuCitSYXVtIGJlc2NocmVpYnQsIHdhcyBkb3J0IGluIGRlciBOYWNoYmFyc2NoYWZ0IGZ1ZXIgUmFldW1lIGV4aXN0aWVyZW4uCitXaWUgZnVua3Rpb25pZXJ0IGRlciBBdXRvbWF0IHZvciBkZXIgSW5zZWwgPworTmFqYSwgZGF6dSB3dXJkZW4gdGF1c2VuZCBGcmFnZW4gZ2VzdGVsbHQgLSBkYWJlaSBpc3RzIGdhbnogZWluZmFjaDoKK2EpIE1hbiBkcnVlY2t0IGVpbmVuIEtub3BmIGVudHNwcmVjaGVuZCBkZW0gaXRlbSwgZGFzIG1hbiBrYXVmZW4KK21vZWNodGUgKGxhbmdiZXNjaHJlaWJ1bmcsIGF1c2dhbmcsIGRldGFpbCkKK2IpIE1hbiB3aXJmdCBkaWUgZW50c3ByZWNoZW5kZSBNZW5nZSB2b24gTXVlbnplbiBlaW4gLSBkaWUgQW56ZWlnZQoremVpZ3QsIHdpZXZpZWwgZXMga29zdGV0LCB1bmQgd2lldmllbCBub2NoIGZlaGx0LgorYykgTWFuIG5pbW10IGRlbiBlcndvcmJlbmVuIEdlZ2Vuc3RhbmQgbWl0IHVuZCBzZXR6dCBpaG4gaW4gZGVtCitSYXVtIGVpbiwgZGVuIG1hbiBzaWNoIGRhZnVlciBhdXNnZXN1Y2h0IGhhdC4KZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvZmFxLzE2IGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9mYXEvMTYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE2YTFlYwotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvZmFxLzE2CkBAIC0wLDAgKzEsNDMgQEAKKworRGFtaXQgYmVpIGRlciBWaWVsemFobCB2b24gU2VoZXJuIG5pY2h0IGRlciBVZWJlcmJsaWNrIHZlcmxvcmVuCitnZWh0LCB3byBpaHJlIGdhbnplbiBIYWV1c2VyIHN0ZWhlbiwgaGllciBhdWNoIGVpbiBrbGVpbmVzCitBZHJlc3NlbnZlcnplaWNobmlzIC0gdm9lbGxpZyB1bnZvbGxzdGFlbmRpZywgYWxzbyBzY2hyZWlidCBtaXIgbWFsLAord2VubiBpaHIgdm9uIGVpbmVtIEhhdXMgd2lzc3QsIGRhcyBpY2ggYXVzZ2VsYXNzZW4gaGFiZSwgb2Rlcgord2VubiBFdWVyIEhhdXMgZWluZW4gYW5kZXJlbiBOYW1lbiBhbHMgZGVuIGhpZXIgYXVmZ2VmdWVocnRlbiBoYXQuCisKK0RhcyBIYXVzIHZvbiBBYXJnb24gICAgICAgICAgICAgICAgYXVmIGRlbSBXZWcgdm9yIGRlbSBaaWdldW5lcmxhZ2VyCitBcmFtZWFzIEZhY2h3ZXJraGF1cyAgICAgICAgICAgICAgIGJlaW0gSW1rZXIKK0RpZSBCbG9ja2h1ZXR0ZSB2b24gQXNtb2RpcyAgICAgICAgd2VzdGxpY2ggdm9tIEZhY2tlbGxhZGVuCitEYXMgSGF1cyB2b24gQmFtYnVsa28gICAgICAgICAgICAgIFRyYW1wZWxwZmFkIGJlaW0gRWxmZW5kb3JmCitEYXMgSGF1cyB2b24gQmFyYWsgICAgICAgICAgICAgICAgIGFtIFN0cmFuZCBkZXIgU29ubmVuaW5zZWwKK0RhcyBIYXVzIHZvbiBCZXJuaGFyZCAgICAgICAgICAgICAgV2FsZHdlZyBvZXN0bGljaCBHbG9ja2Vud2FsZAorQmxlZWx1bXBlcyBEcmVpbWFzdGVyICAgICAgICAgICAgICBhbSBTdHJhbmQgbm9lcmRsaWNoIHZvbiBQb3J0IFZhaW4KK0RhcyBIYXVzIHZvbiBEaW9uICAgICAgICAgICAgICAgICAgYXVmIGRlciBLcmV1enVuZyB2b3IgZGVtIEZyaWVkaG9mCitIb2VobGUgdm9uIEVyb3MgICAgICAgICAgICAgICAgICAgIE9zdHJhbmQgZGVzIE5lYW5kZXJ0YWxzCitEYXMgSGF1cyB2b24gR3JpbW1ib3JuICAgICAgICAgICAgIGF1ZiBTdm9sdmFlcgorSGFyZGlscyBCYXVtaGF1cyAgICAgICAgICAgICAgICAgICBhdWYgZGVtIEJhdW0gd2VzdGxpY2ggdm9tIEVsZmVuZG9yZgorRGFzIEhhdXMgdm9uIEhhd2sgICAgICAgICAgICAgICAgICBPYnN0d2llc2UgYmVpbSBPc3R3YWxsCitEYXMgSGF1cyB2b24gSGVsbG93ZWVuICAgICAgICAgICAgIGltIFNXIHZvbiBNb3JvbgorRGFzIEhhdXMgdm9uIElvbGFudGhlICAgICAgICAgICAgICBiZWltIEJlcm5oYXJkaW5lciBub2VyZGxpY2ggenVtIEtyYXRlcgorS2hvcm5lcyBTY2hyZWluICAgICAgICAgICAgICAgICAgICBpbSBub2VyZGxpY2hlbiBMdXBpbmVudGFsCitEZXIgU3RlaW5icnVjaCB2b24gS2llc2Vsc3RlaW4gICAgIGFtIFN0cmFuZCBpbiBQb3J0IFZhaW4KK0RhcyBIYXVzIHZvbiBLbGluZ2UgICAgICAgICAgICAgICAgYmVpbSBEcmFjaGVuYmFieSBhdWYgZGVyIEhFCitEYXMgSGF1cyB2b24gS290emJyb2NrZW4gICAgICAgICAgIHN1ZWRsaWNoIHZvbSB6dWdlZnJvcmVuZW4gV2VpaGVyCitMYU11ZXJ0ZXMgRmVsc2Jyb2NrZW4gICAgICAgICAgICAgICAgV2VnIGluIGRpZSBXdWVzdGUKK0xhdXJpbnMgWndlcmdlbmhvZWhsZSAgICAgICAgICAgICAgaW4gVmFsZ2Vzc2EKK01hZ2ljT2xsaXMgTWVkaXRhdGlvbnN0ZW1wZWwgICAgICAgV2FsZHdlZyBvZXN0bGljaCBHbG9ja2Vud2FsZAorTWlubmlzIFNjaGxvZXNzY2hlbiAgICAgICAgICAgICAgICBpbSBHbG9ja2Vud2FsZAorTXlzdGl4IFdvbGtlICAgICAgICAgICAgICAgICAgICAgICBFaW5nYW5nIFNjaHJlY2tlbnNzcGl0emUKK0RhcyBIYXVzIHZvbiBSYWZhZWwgICAgICAgICAgICAgICAgYmVpIGRlciBUYW5uZSBpbSBIZXhlbndhbGQKK0RhcyBIYXVzIHZvbiBSYXkgICAgICAgICAgICAgICAgICAgYXVmIGRlbSBXZWcgdm9yIGRlbSBaaWdldW5lcmxhZ2VyCitEYXMgSGF1cyB2b24gUnVkaXJhdHRlciAgICAgICAgICAgIHNjaGF1IG1hbCBuZWJlbmFuIG5hY2ggOykKK0RhcyBIYXVzIHZvbiBSeW5lICAgICAgICAgICAgICAgICAgZGEgc3RlaHN0IER1IGRyaW4gIQorRGllIFN0cmFuZHZpbGxhIHZvbiBSeHRlY2ggICAgICAgICBhbSBTdHJhbmQgbm9lcmRsaWNoIHZvbiBQb3J0IFZhaW4KK0RhcyBIYXVzIHZvbiBTbHlmb3ggICAgICAgICAgICAgICAgS3JldXp1bmcgdm9yIGRlbSBGcmllZGhvZgorRGFzIEhhdSB2b24gU25vb2tlciAgICAgICAgICAgICAgICBPZXN0bGljaCBkZXIgUGxhemEgaW4gTW9yb24KK1N0YWhsZG9ybnMgTW9ub2xpdGggICAgICAgICAgICAgICAgYmVpbSBCcnVubmVuIGltIEhleGVud2FsZAorRGFzIEhhdXMgZGVzIFRvZXRlcnMgICAgICAgICAgICAgICB6d2lzY2hlbiBQb3J0IFZhaW4gdW5kIEdvYmxpbmxhZ2VyCitUenVpb3BzIEh1ZXR0ZSAgICAgICAgICAgICAgICAgICAgIGF1ZiBkZW0gQmF1bSB3ZXN0bGljaCB2b20gRWxmZW5kb3JmCitEYXMgSGF1cyB2b24gV29lbGtjaGVuICAgICAgICAgICAgIHVudGVyIGRlbSBSZWdlbmJvZ2VuIGJlaW0gQmVyZ2RvcmYKK0RlciBFaW5nYW5nIHp1IGVpbmVyIEhvZWhsZSAgICAgICAgYmVpbSBHbGV0c2NoZXIgKGltbWVyIG5hY2ggTi0gdW5kKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWNodCB6dWZhZWxsaWcgaW4gZWluZSBhbmRlcmUgRGltZW5zaW9uKQpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9mYXEvMTcgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL2ZhcS8xNwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzNmYWZhCi0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9mYXEvMTcKQEAgLTAsMCArMSBAQAorRHUgc2llaHN0IGtlaW5lbiBGZWhsZXIgaW0gUmF1bS1aZWl0LUdlZnVlZ2UuCmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL2ZhcS8xOCBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvZmFxLzE4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlOGIyYTIKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL2ZhcS8xOApAQCAtMCwwICsxLDIzOSBAQAorCisKKworQWxwaGFiZXRpc2NoZSBBdWZsaXN0dW5nIGFsbGVyIFNlaGVyIGltIE1vcmdlbkdyYXVlbiwgU3RhbmQgMTguMDkuMTk5NQorCisoZ2VzYW10IDIzMiBTZWhlciwgenUgZGllc2VtIFplaXRwdW5rdCAyMTUgTWFnaWVyKQorQWFyZ29uICAgICAgICAgICAxNjkwICAzMzEzMjAzOSAoIDI4KSAgNDQgVGFnZSwgIDcgU3R1bmRlbiB1bmQgIDMgTWludXRlbgorQWNlZyAgICAgICAgICAgICAgOTA1ICAgIDczNDcxMCAoIDIwKSAgIDIgVGFnZSwgIDUgU3R1bmRlbiB1bmQgNTEgTWludXRlbgorQWNyaW1vbiAgICAgICAgICAxMzc1ICAgMTkwNjIxNyAoIDIxKSAgMzcgVGFnZSwgMTkgU3R1bmRlbiB1bmQgNDYgTWludXRlbgorQWVsbCAgICAgICAgICAgICAxMjg1ICAgIDg5OTAxNiAoIDIwKSAgMjEgVGFnZSwgIDcgU3R1bmRlbiB1bmQgMzUgTWludXRlbgorQWxlbWFubmUgICAgICAgICAxNDMwICAgMzg1MTQwOSAoIDIzKSAgMTkgVGFnZSwgIDAgU3R1bmRlbiB1bmQgMjAgTWludXRlbgorQWxpbmUgICAgICAgICAgICAxNDEwICAgMTA2NTI3NCAoIDIxKSAgMjQgVGFnZSwgIDIgU3R1bmRlbiB1bmQgMjAgTWludXRlbgorQWxrdWluICAgICAgICAgICAxNjE1ICAgMzQ3MTM5MiAoIDIzKSAgIDQgVGFnZSwgIDQgU3R1bmRlbiB1bmQgMTUgTWludXRlbgorQWxtdW5kaSAgICAgICAgICAxNjY1ICAxMjA0NTU2NyAoIDI2KSAgMjkgVGFnZSwgIDkgU3R1bmRlbiB1bmQgMzMgTWludXRlbgorQWx4eCAgICAgICAgICAgICAxMjc1ICAgIDIxMDY5NSAoIDIwKSAgIDggVGFnZSwgMTAgU3R1bmRlbiB1bmQgNTggTWludXRlbgorQW1hem9yYSAgICAgICAgICAgNzIwICAgNzYyMDk2NSAoIDI1KSAgNjAgVGFnZSwgMTQgU3R1bmRlbiB1bmQgNTkgTWludXRlbgorQW5haWQgICAgICAgICAgICAxMzc1ICAgIDI4MzkwNyAoIDIyKSAgMjMgVGFnZSwgIDIgU3R1bmRlbiB1bmQgNTAgTWludXRlbgorQW5ha2luICAgICAgICAgICAyMDAwICA5MTcyMDE2OCAoIDMxKSAgODYgVGFnZSwgMTAgU3R1bmRlbiB1bmQgMzYgTWludXRlbgorQW5jYWxhZ29uICAgICAgICAxNTAwICAgMzIwMzMyMyAoIDIzKSAgMjIgVGFnZSwgIDUgU3R1bmRlbiB1bmQgMzEgTWludXRlbgorQW5ubyAgICAgICAgICAgICAxMjUwICAgIDM3OTY3NyAoIDIwKSAgMjAgVGFnZSwgMjEgU3R1bmRlbiB1bmQgIDkgTWludXRlbgorQXF1YXRvbGwgICAgICAgICAxMjMwICAgMTAxNjgzMSAoIDIwKSAgMTIgVGFnZSwgIDcgU3R1bmRlbiB1bmQgNDQgTWludXRlbgorQXJhZ29uICAgICAgICAgICAxMjM1ICAgMTYxODc1NCAoIDIxKSAgMTMgVGFnZSwgMTkgU3R1bmRlbiB1bmQgMzcgTWludXRlbgorQXJhbWVhICAgICAgICAgICAxNTIwICAgNTYzNDU1OCAoIDI0KSAgMjYgVGFnZSwgIDAgU3R1bmRlbiB1bmQgMTIgTWludXRlbgorQXJrICAgICAgICAgICAgICAxNjIwICAgMTYxMjk1NCAoIDIxKSAgMTUgVGFnZSwgIDMgU3R1bmRlbiB1bmQgIDggTWludXRlbgorQXJ0eSAgICAgICAgICAgICAxOTQwICAyODA1MTQwMSAoIDI4KSAgMzAgVGFnZSwgIDYgU3R1bmRlbiB1bmQgMzcgTWludXRlbgorQXJ1biAgICAgICAgICAgICAxMjAwICAgMTAwMjk5MyAoIDIwKSAgIDkgVGFnZSwgMTggU3R1bmRlbiB1bmQgMjUgTWludXRlbgorQXNtb2RpbmEgICAgICAgICAxOTg1ICAgMzYwOTA0NCAoIDIzKSAgNDMgVGFnZSwgMTAgU3R1bmRlbiB1bmQgNDkgTWludXRlbgorQXNtb2RpcyAgICAgICAgICAxOTg1ICAyNjAzODQ0MiAoIDI4KSAxNjQgVGFnZSwgIDEgU3R1bmRlICB1bmQgMzUgTWludXRlbgorQXVncmEgICAgICAgICAgICAxNzkwICAgIDk4NzA4NyAoIDIwKSAgMzIgVGFnZSwgMTcgU3R1bmRlbiB1bmQgMjIgTWludXRlbgorQXVyaWFuICAgICAgICAgICAxNDk1ICAgMTU2NTg0OSAoIDIxKSAgIDIgVGFnZSwgMTMgU3R1bmRlbiB1bmQgNDAgTWludXRlbgorQmFyYWsgICAgICAgICAgICAxMTA1ICAgNDMxMzM2OCAoIDIzKSAgMjAgVGFnZSwgMjIgU3R1bmRlbiB1bmQgIDggTWludXRlbgorQmVsbGljdXMgICAgICAgICAxMzcwICAgNzMwOTg2OCAoIDI0KSAgNDcgVGFnZSwgIDIgU3R1bmRlbiB1bmQgIDEgTWludXRlCitCZXJuaGFyZCAgICAgICAgIDIwNjAgIDMwMDI1Mjc2ICggMjgpICA1OSBUYWdlLCAyMCBTdHVuZGVuIHVuZCA1OCBNaW51dGVuCitCaWJvICAgICAgICAgICAgIDE4NzUgIDMzMDAxMTk0ICggMjgpICA2NSBUYWdlLCAgMiBTdHVuZGVuIHVuZCAgOCBNaW51dGVuCitCaWVuY2hlbiAgICAgICAgIDEzMDUgICAxOTc5NDkwICggMjEpICAxMCBUYWdlLCAgOSBTdHVuZGVuIHVuZCAgOSBNaW51dGVuCitCaWcgICAgICAgICAgICAgIDE2OTAgICAyOTM3MDc1ICggMjIpICAxMSBUYWdlLCAxMSBTdHVuZGVuIHVuZCA1MCBNaW51dGVuCitCaWdmb290ICAgICAgICAgIDE2NjAgIDEyNjY3MDg1ICggMjYpICAzMCBUYWdlLCAyMCBTdHVuZGVuIHVuZCA1MyBNaW51dGVuCitCbGVlbHVtcGUgICAgICAgIDEyNjUgICA1MjU2OTU5ICggMjQpICAyMCBUYWdlLCAyMSBTdHVuZGVuIHVuZCAxNCBNaW51dGVuCitCbG9vZGdvcmUgICAgICAgIDE1NzAgICA2MDYxNDUwICggMjgpICA1NiBUYWdlLCAxNiBTdHVuZGVuIHVuZCA1OSBNaW51dGVuCitCbHVlbWVsICAgICAgICAgIDE0NTAgICAxNTQ3NzE3ICggMjEpICAyMCBUYWdlLCAxNiBTdHVuZGVuIHVuZCAxMyBNaW51dGVuCitCb2ViYmVsICAgICAgICAgIDE2NzUgICAxMjI0NTMzICggMjEpICAyOCBUYWdlLCAgMSBTdHVuZGUgIHVuZCAzNSBNaW51dGVuCitCb3R0b20gICAgICAgICAgIDEzNTUgICAxMDYyMTAyICggMjApICAxOCBUYWdlLCAxOSBTdHVuZGVuIHVuZCA1NyBNaW51dGVuCitCcml0ICAgICAgICAgICAgIDEyNjAgICAxOTczNzEyICggMjIpICAyMCBUYWdlLCAgNiBTdHVuZGVuIHVuZCAgMSBNaW51dGUKK0JydW1tZWwgICAgICAgICAgMTg1MCAgMTE3Nzk1NTAgKCAyNikgIDI1IFRhZ2UsICAxIFN0dW5kZSAgdW5kIDE1IE1pbnV0ZW4KK0NhZWwgICAgICAgICAgICAgMTMzNSAgIDE1MzY1NDggKCAyMSkgIDE3IFRhZ2UsICA3IFN0dW5kZW4gdW5kIDI3IE1pbnV0ZW4KK0NhcmFkaHJhcyAgICAgICAgMTkyMCAxMDEzODMzMzcgKCAzMikgMTEzIFRhZ2UsIDIzIFN0dW5kZW4gdW5kIDU3IE1pbnV0ZW4KK0NhcmVmcmVlICAgICAgICAgMTI4MCAgIDEzNTY5NjcgKCAyMCkgICA4IFRhZ2UsIDIxIFN0dW5kZW4gdW5kICAxIE1pbnV0ZQorQ2FzdGF3YXkgICAgICAgICAxMjIwICAgMjE5NjUwOCAoIDIyKSAgNDMgVGFnZSwgMjIgU3R1bmRlbiB1bmQgIDcgTWludXRlbgorQ2VsZWJkaWwgICAgICAgICAxMjUwICAxMTU3MzUwMyAoIDI1KSAgNDAgVGFnZSwgIDAgU3R1bmRlbiB1bmQgMjggTWludXRlbgorQ2hhcmx5ICAgICAgICAgICAxNDMwICAgMzc5Mzk3MiAoIDIyKSAgMTYgVGFnZSwgIDggU3R1bmRlbiB1bmQgNTEgTWludXRlbgorQ2hhdmV6ICAgICAgICAgICAxNjAwICAgIDI5OTAyMyAoIDIxKSAgMzMgVGFnZSwgMTIgU3R1bmRlbiB1bmQgIDAgTWludXRlbgorQ2hpY29sYSAgICAgICAgICAxNDUwICAyMzE1NzAwOCAoIDI3KSAgNjcgVGFnZSwgMTIgU3R1bmRlbiB1bmQgMTcgTWludXRlbgorQ292ZW4gICAgICAgICAgICAxMzEwICAgMTk0MDM0MyAoIDIyKSAgMTAgVGFnZSwgMjAgU3R1bmRlbiB1bmQgNTMgTWludXRlbgorQ3JhaWcgICAgICAgICAgICAxMzgwICAgNTQxNTEwNSAoIDI0KSAgMjIgVGFnZSwgMjAgU3R1bmRlbiB1bmQgIDggTWludXRlbgorQ3JvbGxhICAgICAgICAgICAyMDYwICAxNTA2MjQxMiAoIDI2KSAgMzIgVGFnZSwgMTIgU3R1bmRlbiB1bmQgMzYgTWludXRlbgorQ3ViICAgICAgICAgICAgICAxMzQwICAgMTQ1MzgxNyAoIDIwKSAgIDQgVGFnZSwgIDQgU3R1bmRlbiB1bmQgMTEgTWludXRlbgorQ3VjaHVsbGluICAgICAgICAyMDYwICAgOTM2NjM4MCAoIDI1KSAgNDEgVGFnZSwgIDggU3R1bmRlbiB1bmQgMjYgTWludXRlbgorRGFuaWVsICAgICAgICAgICAxNDIwICAgMjEyNTYxNCAoIDIyKSAgMTggVGFnZSwgMjMgU3R1bmRlbiB1bmQgIDYgTWludXRlbgorRGF0YSAgICAgICAgICAgICAxMjgwICAgMTM4MzYzMSAoIDIwKSAgMTYgVGFnZSwgMTEgU3R1bmRlbiB1bmQgIDYgTWludXRlbgorRGVpbW9zICAgICAgICAgICAxNTUwICAgMTYxNDk3MiAoIDIxKSAgIDQgVGFnZSwgMTggU3R1bmRlbiB1bmQgMTkgTWludXRlbgorRGVzYXN0YSAgICAgICAgICAxNTYwICAgOTgyMjcyOCAoIDI1KSAgMjQgVGFnZSwgMTUgU3R1bmRlbiB1bmQgMjcgTWludXRlbgorRGVzaWRlcmlhICAgICAgICAxMjc1ICAgMTM0MDIyOCAoIDIwKSAgIDEgVGFnICwgMTIgU3R1bmRlbiB1bmQgMzMgTWludXRlbgorRGhvamFrdCAgICAgICAgICAxNjI1ICAgNTYxMjEzOCAoIDI0KSAgNDIgVGFnZSwgMTYgU3R1bmRlbiB1bmQgNTcgTWludXRlbgorRGlnZWRhZyAgICAgICAgICAxMjAwICAgIDgxNzkxMSAoIDIwKSAgMTcgVGFnZSwgMjEgU3R1bmRlbiB1bmQgIDggTWludXRlbgorRGlvbiAgICAgICAgICAgICAxMDIwICAgMTM5NjQwMCAoIDIxKSAgMTEgVGFnZSwgIDggU3R1bmRlbiB1bmQgMjkgTWludXRlbgorRHJha29yICAgICAgICAgICAxNDEwICAgIDk3MzcyNyAoIDIwKSAgMTMgVGFnZSwgMTYgU3R1bmRlbiB1bmQgMjUgTWludXRlbgorRHVyaW4gICAgICAgICAgICAxODQwICAyNzAwMDI5MCAoIDI4KSAgNTUgVGFnZSwgIDQgU3R1bmRlbiB1bmQgNDUgTWludXRlbgorRHdpZ2h0ICAgICAgICAgICAyMDMwICAgNzMzNzYyNCAoIDI0KSAgNDIgVGFnZSwgMTggU3R1bmRlbiB1bmQgIDQgTWludXRlbgorRWFyZW5kaWwgICAgICAgICAxNjQwICAgMzI0MzcyOCAoIDIyKSAgIDcgVGFnZSwgMTQgU3R1bmRlbiB1bmQgMTEgTWludXRlbgorRW1pbCAgICAgICAgICAgICAxNDIwICAgMTE4OTQ4MCAoIDIwKSAgMTUgVGFnZSwgIDggU3R1bmRlbiB1bmQgMjYgTWludXRlbgorRW5neXd1Y2sgICAgICAgICAxNzU1ICAgMjQ4NTYzOSAoIDIzKSAgODMgVGFnZSwgMTQgU3R1bmRlbiB1bmQgNTEgTWludXRlbgorRW93aW4gICAgICAgICAgICAxMDQ1ICAgMTEyMzExNSAoIDIwKSAgIDMgVGFnZSwgMjEgU3R1bmRlbiB1bmQgMTQgTWludXRlbgorRXRhaW4gICAgICAgICAgICAxMjg1ICAgMTE4NDEyMyAoIDIxKSAgMjMgVGFnZSwgMTMgU3R1bmRlbiB1bmQgIDMgTWludXRlbgorRXVsZSAgICAgICAgICAgICAxMjkwICAgIDUzNDY2NiAoIDIwKSAgIDkgVGFnZSwgMTAgU3R1bmRlbiB1bmQgIDMgTWludXRlbgorRmFndXMgICAgICAgICAgICAxOTE1ICAgMTEzMDY5MCAoIDIwKSAgMTQgVGFnZSwgIDYgU3R1bmRlbiB1bmQgMjAgTWludXRlbgorRmFobmRlciAgICAgICAgICAxNTk1ICAgNzMwNDE4OCAoIDI1KSAgMzIgVGFnZSwgIDcgU3R1bmRlbiB1bmQgMzIgTWludXRlbgorRmFudGFib3kgICAgICAgICAxNDE1ICAgIDY5MTY2MiAoIDIwKSAgMTkgVGFnZSwgIDEgU3R1bmRlICB1bmQgMTMgTWludXRlbgorRmF1bGkgICAgICAgICAgICAxMjg1ICAgMjA0MjM4NiAoIDIyKSAgMzUgVGFnZSwgIDEgU3R1bmRlICB1bmQgMzAgTWludXRlbgorRmVscyAgICAgICAgICAgICAxNTc1ICAgNDI4ODQwMSAoIDIzKSAgMzAgVGFnZSwgMTIgU3R1bmRlbiB1bmQgNTAgTWludXRlbgorRmlwcHMgICAgICAgICAgICAxMzI1ICAgNjE4NzIwNCAoIDI0KSAgMjcgVGFnZSwgIDQgU3R1bmRlbiB1bmQgNDYgTWludXRlbgorRmxpbnRuYWlsICAgICAgICAxNDE1ICAgMTM5MjA5MCAoIDIxKSAgMjkgVGFnZSwgMTggU3R1bmRlbiB1bmQgIDEgTWludXRlCitGb25lcyAgICAgICAgICAgIDEzODUgICAxNjk1MzU5ICggMjEpICAxMSBUYWdlLCAyMyBTdHVuZGVuIHVuZCA0MyBNaW51dGVuCitGcnlkZXIgICAgICAgICAgIDE4MTAgIDIwMDc5MTI1ICggMjcpICA2NiBUYWdlLCAxOSBTdHVuZGVuIHVuZCA0MCBNaW51dGVuCitGeXQgICAgICAgICAgICAgIDE2MjUgMTAzNzk2Mzk5ICggMzIpIDEwNSBUYWdlLCAgOSBTdHVuZGVuIHVuZCA1MCBNaW51dGVuCitHYWJpICAgICAgICAgICAgIDE5ODUgICA0OTEyODMyICggMjQpICAxNCBUYWdlLCAxNiBTdHVuZGVuIHVuZCA1NSBNaW51dGVuCitHYW5kdWxmICAgICAgICAgIDE0MzUgICAyMzYzNzg5ICggMjIpICAxNSBUYWdlLCAxMiBTdHVuZGVuIHVuZCAzOSBNaW51dGVuCitHcmFuYXRhICAgICAgICAgIDE5MDAgICA4MTYzMzc1ICggMjUpICAyMiBUYWdlLCAyMyBTdHVuZGVuIHVuZCAyMCBNaW51dGVuCitHdW1weSAgICAgICAgICAgIDE2NTAgIDEyMDIyNzEzICggMjYpICAyMyBUYWdlLCAxMCBTdHVuZGVuIHVuZCAzNCBNaW51dGVuCitIYWNrZnJpZWQgICAgICAgIDIwNjAgICA3MjE4ODU2ICggMjQpICAyNyBUYWdlLCAgNCBTdHVuZGVuIHVuZCAyMiBNaW51dGVuCitIYWRyYSAgICAgICAgICAgIDIwMTAgICA4ODYzNTczICggMjUpICA0MSBUYWdlLCAxNSBTdHVuZGVuIHVuZCAzMSBNaW51dGVuCitIYXIgICAgICAgICAgICAgIDEyMDAgICAxNDM0MTkwICggMjEpICAzOSBUYWdlLCAxOCBTdHVuZGVuIHVuZCAgNyBNaW51dGVuCitIYXJkaWwgICAgICAgICAgIDExNzAgICA3Nzc1MTY0ICggMjUpICAzMSBUYWdlLCAyMyBTdHVuZGVuIHVuZCA1NCBNaW51dGVuCitIYXNlbmZ1c3MgICAgICAgIDEzMjUgICA3MjU5NDk1ICggMjQpICAzMCBUYWdlLCAgMyBTdHVuZGVuIHVuZCAzNyBNaW51dGVuCitIYXdrICAgICAgICAgICAgIDEyMzAgICAzNjE4NTI2ICggMjMpICAzMSBUYWdlLCAgMSBTdHVuZGUgIHVuZCAxNyBNaW51dGVuCitIZWxsb3dlZW4gICAgICAgIDE4MDUgIDE3NzQyODAyICggMjcpICAyOSBUYWdlLCAxOSBTdHVuZGVuIHVuZCAzMiBNaW51dGVuCitIZXJjdWxlcyAgICAgICAgIDE0NDAgICAyMTU3NzQxICggMjEpICAxMiBUYWdlLCAxNiBTdHVuZGVuIHVuZCAgMiBNaW51dGVuCitIb2xkZW4gICAgICAgICAgIDEzODAgICAgMjE4NTM5ICggNDApICAxMCBUYWdlLCAgMyBTdHVuZGVuIHVuZCAgNyBNaW51dGVuCitIb3BwbGEgICAgICAgICAgIDEyMjAgICAxMTc0OTM0ICggMjApICAgMiBUYWdlLCAgNyBTdHVuZGVuIHVuZCA1OCBNaW51dGVuCitIdW9yICAgICAgICAgICAgIDEyNDUgICAxNzcwNDg2ICggMjEpICAxMyBUYWdlLCAgOCBTdHVuZGVuIHVuZCA0MyBNaW51dGVuCitIdXJpbiAgICAgICAgICAgIDE0NjAgICAyMjg0NjQ4ICggMjIpICAyMiBUYWdlLCAgNSBTdHVuZGVuIHVuZCAzMyBNaW51dGVuCitJZHVyICAgICAgICAgICAgIDE5NjUgICAzMzc2ODQwICggMjMpICAgNSBUYWdlLCAgNiBTdHVuZGVuIHVuZCA1MCBNaW51dGVuCitJbmVsdWtpICAgICAgICAgIDE1NTUgICAxOTY5NzEwICggMjEpICAgMSBUYWcgLCAxNyBTdHVuZGVuIHVuZCAyNiBNaW51dGVuCitJbnNraXBwICAgICAgICAgIDE1ODUgICAyOTgyNzkwICggMjIpICAxMiBUYWdlLCAyMyBTdHVuZGVuIHVuZCAxNyBNaW51dGVuCitJb2xhbnRoZSAgICAgICAgIDE1NTUgICA1OTkyMjU4ICggMjQpICAzNSBUYWdlLCAgMyBTdHVuZGVuIHVuZCA1OSBNaW51dGVuCitJc2FiZWF1ICAgICAgICAgIDIwNjAgICAzMzgwNDk5ICggMjMpICAgOSBUYWdlLCAgMCBTdHVuZGVuIHVuZCAxNCBNaW51dGVuCitJc2FiZWxsZSAgICAgICAgIDEzOTAgICAgNTQ3NDc4ICggMjApICAgMyBUYWdlLCAxMSBTdHVuZGVuIHVuZCAgNSBNaW51dGVuCitJc25vZ29vZCAgICAgICAgIDE3NzUgICAyODgxMDE4ICggMjIpICAyNyBUYWdlLCAxOCBTdHVuZGVuIHVuZCAyNyBNaW51dGVuCitJc3NvbWFkICAgICAgICAgIDE5ODUgIDExMDIwNTE1ICggMjYpICAyMCBUYWdlLCAgNSBTdHVuZGVuIHVuZCAxMCBNaW51dGVuCitKYWYgICAgICAgICAgICAgIDExODAgICAgNDI5Njk2ICggMjApICA3MSBUYWdlLCAgNSBTdHVuZGVuIHVuZCAgNCBNaW51dGVuCitKYW5pY2UgICAgICAgICAgIDIwNjAgIDEzNTExNjUwICggMjYpICA1MyBUYWdlLCAxOSBTdHVuZGVuIHVuZCAzNyBNaW51dGVuCitKZXJyaWNvICAgICAgICAgIDE0ODUgICA0NTY3OTI1ICggMjQpICAzMSBUYWdlLCAgOSBTdHVuZGVuIHVuZCA0NyBNaW51dGVuCitKaW1kaWdyaXogICAgICAgIDIwMTUgICA0MjI5MDA1ICggMjMpIDEwMCBUYWdlLCAgMiBTdHVuZGVuIHVuZCAyNiBNaW51dGVuCitKaXJpa2kgICAgICAgICAgIDE1NzAgICAzODU4MjQxICggMjMpICAgMyBUYWdlLCAxNSBTdHVuZGVuIHVuZCA0MSBNaW51dGVuCitKdXJyeSAgICAgICAgICAgIDE0MTAgICA3MDczNTQ0ICggMjUpICAzMyBUYWdlLCAgOCBTdHVuZGVuIHVuZCA0MiBNaW51dGVuCitLYWZrYSAgICAgICAgICAgIDEyMTUgICAgNzY5MjYyICggMjEpICAgOSBUYWdlLCAgOCBTdHVuZGVuIHVuZCA1NSBNaW51dGVuCitLYWxsaW9wZSAgICAgICAgIDEzODUgICAxNTM5MzI5ICggMjApICAgMSBUYWcgLCAyMCBTdHVuZGVuIHVuZCAyNCBNaW51dGVuCitLYXJ0aWkgICAgICAgICAgIDE1NTUgICAxNzQ2OTE5ICggMjApICAxNiBUYWdlLCAxMyBTdHVuZGVuIHVuZCAgMSBNaW51dGUKK0tlbGRlciAgICAgICAgICAgMTk0NSAgIDUxMDk4MjUgKCAyMykgIDQ2IFRhZ2UsIDE3IFN0dW5kZW4gdW5kIDQ0IE1pbnV0ZW4KK0tlcm1pdCAgICAgICAgICAgMTc0NSAgIDYyMDMyNTYgKCAyNSkgIDQ4IFRhZ2UsICAzIFN0dW5kZW4gdW5kIDM5IE1pbnV0ZW4KK0toaWRhciAgICAgICAgICAgMTkyMCAgNTAxNDA5OTkgKCAyOSkgIDYyIFRhZ2UsIDIwIFN0dW5kZW4gdW5kIDM2IE1pbnV0ZW4KK0tob3JuZSAgICAgICAgICAgMTY0MCAgICAxMzAzNzYgKCAyNCkgIDYyIFRhZ2UsICA4IFN0dW5kZW4gdW5kICAzIE1pbnV0ZW4KK0tpZXNlbHN0ZWluICAgICAgMTIyMCAgIDc5MjUwMTEgKCAyNikgIDE2IFRhZ2UsIDEzIFN0dW5kZW4gdW5kICAzIE1pbnV0ZW4KK0tpd2kgICAgICAgICAgICAgMTQ5NSAgICA3MjM4MDQgKCAyMCkgIDMyIFRhZ2UsICA2IFN0dW5kZW4gdW5kIDU5IE1pbnV0ZW4KK0tsYXVzaSAgICAgICAgICAgMTc1MCAgIDYxODYzODIgKCAyNCkgIDE2IFRhZ2UsIDIwIFN0dW5kZW4gdW5kICA4IE1pbnV0ZW4KK0tvbnRvICAgICAgICAgICAgMTE5NSAgIDEzOTk2OTAgKCAyMSkgICA1IFRhZ2UsICAwIFN0dW5kZW4gdW5kICA2IE1pbnV0ZW4KK0tvdHpicm9ja2VuICAgICAgMTkyNSAgNDAxMDMzMTkgKCAyOSkgIDQxIFRhZ2UsICA4IFN0dW5kZW4gdW5kIDE2IE1pbnV0ZW4KK0xhdXJpbiAgICAgICAgICAgMTk0NSAgIDQyMzc3NTcgKCAyNCkgIDY2IFRhZ2UsIDE5IFN0dW5kZW4gdW5kIDE5IE1pbnV0ZW4KK0xlZnR5ICAgICAgICAgICAgMTY2MCAgMTE1ODAzMzkgKCAyNikgIDI3IFRhZ2UsIDE2IFN0dW5kZW4gdW5kIDIwIE1pbnV0ZW4KK0xlaWEgICAgICAgICAgICAgMTc0NSAgIDc4MzIzMTggKCAyNSkgIDIzIFRhZ2UsIDEyIFN0dW5kZW4gdW5kIDE5IE1pbnV0ZW4KK0xpdXRiZXJnYSAgICAgICAgMTcyNSAgIDIzNjk1NzEgKCAyMikgICAzIFRhZ2UsICA1IFN0dW5kZW4gdW5kIDI5IE1pbnV0ZW4KK0xvY3VsdXMgICAgICAgICAgMTQ4NSAgMTMzNjMyNjEgKCAyNikgIDM0IFRhZ2UsIDE1IFN0dW5kZW4gdW5kICA2IE1pbnV0ZW4KK0xva2FyICAgICAgICAgICAgMTI4MCAgIDE0MzI0OTUgKCAyMCkgICAzIFRhZ2UsIDEzIFN0dW5kZW4gdW5kIDE1IE1pbnV0ZW4KK0x1ZyAgICAgICAgICAgICAgMTY4NSAgIDE3MjMzODUgKCAyMSkgIDEzIFRhZ2UsICA0IFN0dW5kZW4gdW5kIDEyIE1pbnV0ZW4KK01hZ2ljb2xsaSAgICAgICAgMjA2MCAgMzQ5MjQzOTQgKCAyOCkgIDQyIFRhZ2UsICA3IFN0dW5kZW4gdW5kIDEwIE1pbnV0ZW4KK01hZ251bSAgICAgICAgICAgMTI4MCAgIDE0Mzg3OTQgKCAyMCkgICA3IFRhZ2UsIDE4IFN0dW5kZW4gdW5kICA4IE1pbnV0ZW4KK01haGF0bWEgICAgICAgICAgMTU3NSAgIDI5NzU2MTIgKCAyMikgIDE2IFRhZ2UsIDEyIFN0dW5kZW4gdW5kIDE5IE1pbnV0ZW4KK01hamVyZSAgICAgICAgICAgMTIxNSAgICA4OTA4MzIgKCAyMCkgICA1IFRhZ2UsIDE5IFN0dW5kZW4gdW5kIDE3IE1pbnV0ZW4KK01hcnMgICAgICAgICAgICAgMjA2MCAgMTQ2MTMzODkgKCAyNikgIDQ2IFRhZ2UsICA0IFN0dW5kZW4gdW5kIDU5IE1pbnV0ZW4KK01hcnUgICAgICAgICAgICAgMTQwMCAgIDE1MDMwOTggKCAyMSkgICA3IFRhZ2UsIDE1IFN0dW5kZW4gdW5kIDI1IE1pbnV0ZW4KK01heGluICAgICAgICAgICAgMTM2NSAgIDExMjA4OTkgKCAyMCkgIDE3IFRhZ2UsICAzIFN0dW5kZW4gdW5kIDU0IE1pbnV0ZW4KK01lbGxvcm4gICAgICAgICAgMTI5MCAgIDEwNjY0ODQgKCAyMCkgIDE4IFRhZ2UsICA4IFN0dW5kZW4gdW5kICA5IE1pbnV0ZW4KK01lcmlhZCAgICAgICAgICAgMTMwNSAgIDE0OTcwMDAgKCAyMCkgICA3IFRhZ2UsIDE3IFN0dW5kZW4gdW5kIDUxIE1pbnV0ZW4KK01lc2lyaWkgICAgICAgICAgMTU4NSAgIDYxMjQ1MjUgKCAyNCkgIDI1IFRhZ2UsICAzIFN0dW5kZW4gdW5kIDQ3IE1pbnV0ZW4KK01pZXplICAgICAgICAgICAgMTI3NSAgIDIxMjI5NjkgKCAyMikgIDI5IFRhZ2UsICAwIFN0dW5kZW4gdW5kIDMwIE1pbnV0ZW4KK01pbW8gICAgICAgICAgICAgMTE5NSAgIDExMjc0MTQgKCAyMCkgIDE1IFRhZ2UsIDExIFN0dW5kZW4gdW5kIDI1IE1pbnV0ZW4KK01pbm5pICAgICAgICAgICAgMTk4NSAgMTM5NDY2MDQgKCAyNikgIDI3IFRhZ2UsICA0IFN0dW5kZW4gdW5kIDM1IE1pbnV0ZW4KK01pc3NlbGxpICAgICAgICAgIDkxNSAgIDI2Mzg5MTIgKCAyMikgIDEwIFRhZ2UsIDIzIFN0dW5kZW4gdW5kICA4IE1pbnV0ZW4KK01pdGggICAgICAgICAgICAgMTI4NSAgIDEyMDIxOTkgKCAyMSkgICA2IFRhZ2UsIDEyIFN0dW5kZW4gdW5kICA0IE1pbnV0ZW4KK01vZ2xpICAgICAgICAgICAgMTA3NSAgIDE4MzYwNjYgKCAyMSkgIDEwIFRhZ2UsIDEzIFN0dW5kZW4gdW5kIDUyIE1pbnV0ZW4KK01vcmdvbiAgICAgICAgICAgMTgzNSAgMTA0MDI2MjIgKCAyNSkgIDI3IFRhZ2UsICA2IFN0dW5kZW4gdW5kIDE5IE1pbnV0ZW4KK01vc2ggICAgICAgICAgICAgMTQyMCAgIDI0Nzk5NTQgKCAyMikgIDE2IFRhZ2UsICA5IFN0dW5kZW4gdW5kIDIxIE1pbnV0ZW4KK011Y2tzICAgICAgICAgICAgMTMxMCAgIDM1Mzg0NjQgKCAyMykgIDEzIFRhZ2UsIDIyIFN0dW5kZW4gdW5kIDUzIE1pbnV0ZW4KK011bXBlbHMgICAgICAgICAgMTI3NSAgIDExOTA5MDIgKCAyMCkgICA5IFRhZ2UsIDEwIFN0dW5kZW4gdW5kIDE2IE1pbnV0ZW4KK05hdHVyZSAgICAgICAgICAgMTQ5MCAgIDE2MzIxNTQgKCAyMSkgICA2IFRhZ2UsIDEwIFN0dW5kZW4gdW5kIDQ5IE1pbnV0ZW4KK05pYWwgICAgICAgICAgICAgMTMzMCAgICA1NzM1MjQgKCAyMCkgICA4IFRhZ2UsIDIyIFN0dW5kZW4gdW5kIDM4IE1pbnV0ZW4KK05peGkgICAgICAgICAgICAgMTY5NSAgIDMzOTUyMzEgKCAyNCkgIDU4IFRhZ2UsIDEwIFN0dW5kZW4gdW5kIDI1IE1pbnV0ZW4KK05peGlob3UgICAgICAgICAgMTk2NSAgIDk0NTU5NTQgKCAyNSkgIDU2IFRhZ2UsICA4IFN0dW5kZW4gdW5kIDU1IE1pbnV0ZW4KK05vayAgICAgICAgICAgICAgMTU5NSAgIDEzMjIwNDggKCAyMCkgICAxIFRhZyAsICAxIFN0dW5kZSAgdW5kIDUwIE1pbnV0ZW4KK05vcndlZ2VyICAgICAgICAgMTU1NSAgIDYwNTc0NTkgKCAyNSkgIDMyIFRhZ2UsIDExIFN0dW5kZW4gdW5kIDMyIE1pbnV0ZW4KK05vc3RyYWRhbXVzICAgICAgMTgwMCAgOTMwNjc3OTAgKCAzMSkgIDU1IFRhZ2UsICA1IFN0dW5kZW4gdW5kIDExIE1pbnV0ZW4KK051bGxuZXVuZXIgICAgICAgMTM2MCAgIDUyMjA4OTQgKCAyNCkgIDEzIFRhZ2UsICA3IFN0dW5kZW4gdW5kIDM4IE1pbnV0ZW4KK09ya3RvZXRlciAgICAgICAgMTMzMCAgMjAyNzQwMjcgKCAyNykgIDQyIFRhZ2UsIDExIFN0dW5kZW4gdW5kIDMxIE1pbnV0ZW4KK1BhbnRvZmZlbCAgICAgICAgMTYyNSAgIDkyNDc1NjggKCAyNSkgIDI3IFRhZ2UsICA1IFN0dW5kZW4gdW5kIDExIE1pbnV0ZW4KK1BlbmVsb3BlICAgICAgICAgMTQ1MCAgIDE2OTY2NTYgKCAyMSkgIDQyIFRhZ2UsIDEyIFN0dW5kZW4gdW5kIDU5IE1pbnV0ZW4KK1BlcmxlICAgICAgICAgICAgMTQ5NSAgIDE1NDkzOTMgKCAyMSkgIDIwIFRhZ2UsIDIwIFN0dW5kZW4gdW5kIDEyIE1pbnV0ZW4KK1Bob2JvcyAgICAgICAgICAgMTY4NSAgIDE5NjM2MzkgKCAyMSkgICA0IFRhZ2UsIDE1IFN0dW5kZW4gdW5kIDIzIE1pbnV0ZW4KK1BoeWdvcyAgICAgICAgICAgMTQyMCAgIDM0MjM4MDYgKCAyMykgIDMxIFRhZ2UsICA5IFN0dW5kZW4gdW5kIDI3IE1pbnV0ZW4KK1BpZmYgICAgICAgICAgICAgMTMwMCAgIDMxMTg0ODkgKCAyMikgICA1IFRhZ2UsIDEwIFN0dW5kZW4gdW5kIDMwIE1pbnV0ZW4KK1BpcHBpbiAgICAgICAgICAgMTQxNSAgIDU0OTAzNDIgKCAyNCkgIDE5IFRhZ2UsICA3IFN0dW5kZW4gdW5kIDM3IE1pbnV0ZW4KK1Bsb2NrICAgICAgICAgICAgMTUwMCAgIDMwMDgwODQgKCAyMikgIDIxIFRhZ2UsIDEwIFN0dW5kZW4gdW5kIDE1IE1pbnV0ZW4KK1ByYSAgICAgICAgICAgICAgMTE5MCAgIDM4NDk2MDIgKCAyMykgIDMzIFRhZ2UsICAxIFN0dW5kZSAgdW5kIDQ5IE1pbnV0ZW4KK1ByaWFtb3MgICAgICAgICAgMTI3MCAgIDM0MTUxNjYgKCAyMykgIDEzIFRhZ2UsICAxIFN0dW5kZSAgdW5kIDU2IE1pbnV0ZW4KK1B1Y2sgICAgICAgICAgICAgMTI3MCAgIDEzNTM0OTEgKCAyMCkgICAxIFRhZyAsICAwIFN0dW5kZW4gdW5kIDQ0IE1pbnV0ZW4KK1F1ZW5naXN0dSAgICAgICAgMTE2MCAgIDI0ODA0MjkgKCAyMikgIDI4IFRhZ2UsIDE5IFN0dW5kZW4gdW5kIDM1IE1pbnV0ZW4KK1F1aWxsaWFuICAgICAgICAgMTMzMCAgMTMxNTk2ODAgKCAyNikgIDU2IFRhZ2UsICA4IFN0dW5kZW4gdW5kIDMzIE1pbnV0ZW4KK1JhZmFlbCAgICAgICAgICAgMjAxNSAgIDM1NTY0OTggKCAyMykgIDQ5IFRhZ2UsIDEwIFN0dW5kZW4gdW5kIDEzIE1pbnV0ZW4KK1JhaWJhICAgICAgICAgICAgMTMyNSAgIDEwMzIzNjggKCAyMCkgIDE4IFRhZ2UsICAzIFN0dW5kZW4gdW5kIDMwIE1pbnV0ZW4KK1JhdHogICAgICAgICAgICAgMTM4NSAgIDE1OTQ2MDEgKCAyMSkgIDQ0IFRhZ2UsIDE5IFN0dW5kZW4gdW5kIDUyIE1pbnV0ZW4KK1JheSAgICAgICAgICAgICAgMTY5MCAgMTY1MzMxNjkgKCAyNykgIDM2IFRhZ2UsIDE4IFN0dW5kZW4gdW5kIDI2IE1pbnV0ZW4KK1JlaW5lbGRlICAgICAgICAgMTYyMCAgMTE3NjA0NzYgKCAyNikgIDI3IFRhZ2UsICAyIFN0dW5kZW4gdW5kICA0IE1pbnV0ZW4KK1JleG9uICAgICAgICAgICAgMTM5NSAgIDMyODY0MTAgKCAyMykgIDE0IFRhZ2UsIDE1IFN0dW5kZW4gdW5kICAyIE1pbnV0ZW4KK1JvYWRydW5uZXIgICAgICAgMTY2MCAgIDkwMjUwMTcgKCAyNSkgIDU1IFRhZ2UsIDE3IFN0dW5kZW4gdW5kIDIxIE1pbnV0ZW4KK1Jvc2EgICAgICAgICAgICAgMTg1NSAgIDQzOTcyODEgKCAyNCkgICA2IFRhZ2UsIDEwIFN0dW5kZW4gdW5kIDM4IE1pbnV0ZW4KK1J1ZGlyYXR0ZXIgICAgICAgMjA2MCAgNDEyNDQ3NDUgKCAyOSkgIDM3IFRhZ2UsIDE5IFN0dW5kZW4gdW5kIDE0IE1pbnV0ZW4KK1J5bmUgICAgICAgICAgICAgMjA2MCAxOTMzNzYzNjggKCAzNSkgIDkxIFRhZ2UsIDE2IFN0dW5kZW4gdW5kIDU3IE1pbnV0ZW4KK1NhYyAgICAgICAgICAgICAgMTMyNSAgIDEwODE2NzQgKCAyMCkgICAzIFRhZ2UsIDE2IFN0dW5kZW4gdW5kIDI2IE1pbnV0ZW4KK1NjaGVsbSAgICAgICAgICAgMTQ2MCAgICA0NjEyNDcgKCAyMikgICA4IFRhZ2UsICA4IFN0dW5kZW4gdW5kIDIwIE1pbnV0ZW4KK1NjaGxhd2luZXIgICAgICAgMTM2NSAgICA1MzQ2NDggKCAyMSkgIDI5IFRhZ2UsIDEyIFN0dW5kZW4gdW5kIDQ4IE1pbnV0ZW4KK1Njb3R0eSAgICAgICAgICAgMTIxNSAgIDIyNDUxMDcgKCAyMikgIDEyIFRhZ2UsICAzIFN0dW5kZW4gdW5kIDI5IE1pbnV0ZW4KK1NlbGJzdG1vcmQgICAgICAgMTI2MCAgIDEyODEzOTIgKCAyMCkgICAyIFRhZ2UsIDEwIFN0dW5kZW4gdW5kIDE1IE1pbnV0ZW4KK1NlbWlyYSAgICAgICAgICAgMTcxMCAgIDgzNDYyOTMgKCAyNSkgIDM4IFRhZ2UsIDEwIFN0dW5kZW4gdW5kIDQzIE1pbnV0ZW4KK1NpYWJhdCAgICAgICAgICAgMTM0MCAgIDEzNDIxNjggKCAyMSkgIDE1IFRhZ2UsIDIwIFN0dW5kZW4gdW5kIDIxIE1pbnV0ZW4KK1NpYm9yaXQgICAgICAgICAgMTQwMCAgIDExMjA5MzEgKCAyMCkgIDE1IFRhZ2UsICAzIFN0dW5kZW4gdW5kIDI1IE1pbnV0ZW4KK1NraXBwZXIgICAgICAgICAgMTU3NSAgMzM1MjY2MjkgKCAyOCkgIDQ2IFRhZ2UsICA0IFN0dW5kZW4gdW5kIDMyIE1pbnV0ZW4KK1NreXdhbGtlciAgICAgICAgMTQ1NSAgIDI3NjA0ODMgKCAyMikgIDEyIFRhZ2UsICA1IFN0dW5kZW4gdW5kIDE5IE1pbnV0ZW4KK1NsYXNoICAgICAgICAgICAgMTcyMCAgIDYyMTg5OTkgKCAyNCkgIDM3IFRhZ2UsIDEyIFN0dW5kZW4gdW5kIDQyIE1pbnV0ZW4KK1NseWZveCAgICAgICAgICAgMTc4MCAgMjkyMTM3MDAgKCAyOCkgIDYzIFRhZ2UsIDIyIFN0dW5kZW4gdW5kIDIyIE1pbnV0ZW4KK1NtYXVnICAgICAgICAgICAgMTE4NSAgIDI2NTAxMjEgKCAyMikgIDE4IFRhZ2UsIDIzIFN0dW5kZW4gdW5kIDU2IE1pbnV0ZW4KK1NtaWxleSAgICAgICAgICAgMTM3NSAgMTA1MzQ4NTAgKCAyNSkgIDIyIFRhZ2UsIDEwIFN0dW5kZW4gdW5kIDQ1IE1pbnV0ZW4KK1Nub29rZXIgICAgICAgICAgMTUyMCAgMzA1NjgwNDggKCAyOCkgIDIxIFRhZ2UsICAxIFN0dW5kZSAgdW5kIDU5IE1pbnV0ZW4KK1NudWdnbGUgICAgICAgICAgMTUyNSAgIDkwNDg0OTMgKCAyNSkgIDMxIFRhZ2UsICA4IFN0dW5kZW4gdW5kIDUwIE1pbnV0ZW4KK1NvcnNoYSAgICAgICAgICAgMTQ0MCAgIDEzODYwNDggKCAyMCkgIDIwIFRhZ2UsICAwIFN0dW5kZW4gdW5kIDU2IE1pbnV0ZW4KK1NwZWVkeSAgICAgICAgICAgMTU1NSAgMTYxOTM5NzggKCAyNykgIDIwIFRhZ2UsIDE4IFN0dW5kZW4gdW5kIDQxIE1pbnV0ZW4KK1N0YWhsZG9ybiAgICAgICAgMTczNSAgNTQ3NjU0MTEgKCAyOSkgIDYwIFRhZ2UsIDIyIFN0dW5kZW4gdW5kIDQxIE1pbnV0ZW4KK1N0ZXZlICAgICAgICAgICAgMTk0NSAgIDYwNjg0NDEgKCAyNCkgIDY2IFRhZ2UsICA1IFN0dW5kZW4gdW5kIDM0IE1pbnV0ZW4KK1N1c2hpICAgICAgICAgICAgMTc3NSAgIDE2MDgyODEgKCAyMSkgIDE3IFRhZ2UsIDE2IFN0dW5kZW4gdW5kIDE3IE1pbnV0ZW4KK1N5bWJpb250ICAgICAgICAgMTMyMCAgIDM1MDQ4MzQgKCAyMykgIDEzIFRhZ2UsICA4IFN0dW5kZW4gdW5kIDU0IE1pbnV0ZW4KK1N5c29wICAgICAgICAgICAgMTMzNSAgIDE3MTkzMzYgKCAyMSkgIDE2IFRhZ2UsIDExIFN0dW5kZW4gdW5kIDQwIE1pbnV0ZW4KK1RheiAgICAgICAgICAgICAgMTUxNSAgICA3NjUxNzMgKCAyMikgIDMzIFRhZ2UsICAzIFN0dW5kZW4gdW5kIDUxIE1pbnV0ZW4KK1RlbGthICAgICAgICAgICAgMTU1MCAgIDEzNTc0NzYgKCAyMCkgIDE0IFRhZ2UsIDE5IFN0dW5kZW4gdW5kIDE0IE1pbnV0ZW4KK1RlcnJhbiAgICAgICAgICAgMTQ0MCAgIDEwOTQyNjQgKCAyMCkgIDEyIFRhZ2UsICAxIFN0dW5kZSAgdW5kIDE3IE1pbnV0ZW4KK1RvZGVzZW5nZWwgICAgICAgMTUzNSAgIDE3Mzg2NjIgKCAyMSkgICAzIFRhZ2UsICA3IFN0dW5kZW4gdW5kICA3IE1pbnV0ZW4KK1RvbW15ICAgICAgICAgICAgMTYwNSAgIDcxNDY5MDYgKCAyNSkgIDM1IFRhZ2UsIDEyIFN0dW5kZW4gdW5kIDU3IE1pbnV0ZW4KK1RvcndhbGwgICAgICAgICAgMTMzMCAgIDYxMjQwNTIgKCAyNCkgIDI4IFRhZ2UsIDExIFN0dW5kZW4gdW5kIDQ2IE1pbnV0ZW4KK1Rvc3MgICAgICAgICAgICAgMTg3NSAgIDc4MzA1NDggKCAyNikgIDU0IFRhZ2UsICA0IFN0dW5kZW4gdW5kIDIyIE1pbnV0ZW4KK1R3aWdneSAgICAgICAgICAgMTY2MCAgIDk2OTEzNDQgKCAyNSkgIDM1IFRhZ2UsIDE3IFN0dW5kZW4gdW5kIDIyIE1pbnV0ZW4KK1R5cmlvbiAgICAgICAgICAgMTU5NSAgMTkyMjAzOTcgKCAyNykgIDM1IFRhZ2UsIDE2IFN0dW5kZW4gdW5kIDUxIE1pbnV0ZW4KK1R6dWlvcCAgICAgICAgICAgMTE2NSAgMTQ3NDY3MzQgKCAyNikgIDgwIFRhZ2UsIDE4IFN0dW5kZW4gdW5kIDUyIE1pbnV0ZW4KK1VyemEgICAgICAgICAgICAgMTQ4NSAgMTI1ODk3MTMgKCAyNikgIDI5IFRhZ2UsIDEyIFN0dW5kZW4gdW5kIDU2IE1pbnV0ZW4KK1ZhbmlyICAgICAgICAgICAgMjA2MCAgIDI5MzMxNDMgKCAyMikgIDM1IFRhZ2UsICA0IFN0dW5kZW4gdW5kIDExIE1pbnV0ZW4KK1ZhbmphICAgICAgICAgICAgMTYxNSAgMTY0MjMzNTAgKCAyNikgIDIxIFRhZ2UsICA3IFN0dW5kZW4gdW5kICA0IE1pbnV0ZW4KK1ZlcmdvbiAgICAgICAgICAgMTMwNSAgIDEwNzE1MzUgKCAyMCkgICAxIFRhZyAsIDE1IFN0dW5kZW4gdW5kICA0IE1pbnV0ZW4KK1ZlcndpcnJ1bmcgICAgICAgMTkyNSAgIDQ0NTUyNDUgKCAyMykgIDE0IFRhZ2UsIDIwIFN0dW5kZW4gdW5kIDUyIE1pbnV0ZW4KK1ZydW1mb25kZWwgICAgICAgMTI1NSAgICA0NDc0MzggKCAyMCkgIDE4IFRhZ2UsIDE2IFN0dW5kZW4gdW5kIDQ4IE1pbnV0ZW4KK1dhaG4gICAgICAgICAgICAgMjA2MCAgIDMzMTI4MzIgKCAyMykgIDE2IFRhZ2UsICAxIFN0dW5kZSAgdW5kIDQ3IE1pbnV0ZW4KK1dhcmxvcmQgICAgICAgICAgMTI3NSAgICA2MzA3NTEgKCAyMSkgIDMwIFRhZ2UsICAzIFN0dW5kZW4gdW5kIDU0IE1pbnV0ZW4KK1dpbGxvdyAgICAgICAgICAgMTkwNSAgMjg3NDI2MzYgKCAyOCkgIDU0IFRhZ2UsIDEwIFN0dW5kZW4gdW5kIDI1IE1pbnV0ZW4KK1dvZWxrY2hlbiAgICAgICAgMTM3MCAgIDc5Mjk4MjggKCAyNCkgIDQwIFRhZ2UsICAzIFN0dW5kZW4gdW5kIDExIE1pbnV0ZW4KK1dvbGZlbmRhcnQgICAgICAgMTQxNSAgIDE1NzUzMDggKCAyMSkgIDExIFRhZ2UsICA4IFN0dW5kZW4gdW5kIDQ2IE1pbnV0ZW4KK1hhbmFkdSAgICAgICAgICAgMTUyNSAgIDE3ODQ3MzIgKCAyMSkgIDM3IFRhZ2UsICAzIFN0dW5kZW4gdW5kIDI4IE1pbnV0ZW4KK1hlcmEgICAgICAgICAgICAgMTUwMCAgIDE3NjU3MzkgKCAyMSkgIDE4IFRhZ2UsICA2IFN0dW5kZW4gdW5kIDI0IE1pbnV0ZW4KK1lhayAgICAgICAgICAgICAgMTIwMCAgIDEwMTIyNzggKCAyMCkgIDE2IFRhZ2UsIDE3IFN0dW5kZW4gdW5kIDM5IE1pbnV0ZW4KK1lhc21pbiAgICAgICAgICAgMTMzNSAgIDEyMjkzNDAgKCAyMSkgICA5IFRhZ2UsICAyIFN0dW5kZW4gdW5kIDM4IE1pbnV0ZW4KK1lldGkgICAgICAgICAgICAgMTQyMCAgIDYwMTA4NDAgKCAyNSkgIDQ4IFRhZ2UsIDE0IFN0dW5kZW4gdW5kIDI1IE1pbnV0ZW4KK1lldHkgICAgICAgICAgICAgMTI2MCAgIDIzODc2MTIgKCAyMikgIDE3IFRhZ2UsIDIzIFN0dW5kZW4gdW5kIDU1IE1pbnV0ZW4KK1plcGh5ciAgICAgICAgICAgMjA2MCAgMjkyNTcyNDkgKCAyOCkgIDY3IFRhZ2UsICA0IFN0dW5kZW4gdW5kICA1IE1pbnV0ZW4KK1pvcnJvICAgICAgICAgICAgMjA2MCAgIDU2NDQ2ODcgKCAyNCkgIDMzIFRhZ2UsIDEwIFN0dW5kZW4gdW5kIDUyIE1pbnV0ZW4KK1p3aXJjaCAgICAgICAgICAgMTY2NSAgIDk4MTgyNDcgKCAyNSkgIDE1IFRhZ2UsIDIzIFN0dW5kZW4gdW5kIDMxIE1pbnV0ZW4KKwpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9mYXEvMiBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvZmFxLzIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRiNzhiZAotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvZmFxLzIKQEAgLTAsMCArMSwxOCBAQAorMi4gU0VIRVJRVUVTVAorCitFaW5lIHJlY2h0IHNjaG9lbmUgcXVlc3QgbnVyIGZ1ZXIgU2VoZXIgaGF0IFRyb3kgaW0gRnJ1ZWhqYWhyIDE5OTUKK2dlc2NocmllYmVuLCBhbGxlcmRpbmdzIHd1cmRlIHNpZSBlcnN0IDQgTW9uYXRlIHNwYWV0ZXIgYW5nZXNjaGxvc3NlbiwKK25hY2hkZW0gQm9pbmcgZWluZSBNZW5nZSBCdWdzIGdlZml4dCBoYXR0ZS4gV2llIGF1Y2ggaW1tZXI6IEVpbmUgbG9obmVuZGUKK3F1ZXN0LCBtaXQgU2ljaGVyaGVpdCBkaWUgc2Nob2Vuc3RlIGRpZSBUcm95IGhpZXIgZ2VzY2hyaWViZW4gaGF0LCB1bmQKK2F1c25haG1zd2Vpc2UgaXN0IHNpZSBzaWdhciBsb2dpc2NoIHVuZCBkaWUgU3RpbW11bmcgdm9yIE9ydCBuaWNodCBzY2hsZWNodC4KK0Fsc28gdW5iZWRpbmd0IHNwaWVsZW4sIG5pY2h0IHp1bGV0enQsIHdlaWwgZGllIEJlbG9obnVuZyBkYWZ1ZXIgd2lybGljaAorZ2VsdW5nZW4gaXN0LCBiZXNzZXI6IGRpZSBCZWxvaG51bmdlbiEgRGVubiBhKSBlcmhhZWx0IG1hbiBlaW5lCitLcmlzdGFsbGt1Z2VsLCBtaXQgZGVyIG1hbiBTcGllbGVyIGZ1ZXIgZWluZW4gTWFnaWVwdW5rdCBmaW5kZW4ga2FubiwgdW5kIGIpCitlcmhhZWx0IG1hbiBkYXMgUi1FbW90ZSwgbWl0IGRlbSBtYW4gc2VpbiBFbW90ZSwgZGFzIG1hbiBmdWVyIGRpZSBBbWFyeWxsaXMtCitRdWVzdCBlcmhhbHRlbiBoYXQsIGF1Y2ggYXVmIFNwaWVsZXIgYXVzc2VyaGFsYiBkZXMgUmF1bWVzIGluIGRlbSBtYW4gc2ljaAorYmVmaW5kZXQsIGFud2VuZGVuIGthbm4gKHZnbC4gaGllcnp1IGF1Y2ggS2FwLiA2OiBNYWdpc2NoZSBLdWdlbCkuCisKK1ZpZWwgU3Bhc3MgYmVpbSBRdWVzdGVuICEhIQorKGFiZXIgZXJzdCBoaWVyYmxlaWJlbiB1bmQgRmFxIGZlcnRpZ2xlc2VuIDspIC0gdW5kIGRlciBCYWxscGFyayBsb2hudAordWVicmlnZW5zIGF1Y2ggbWFsIGVpbmVuIGtsZWluZW4gQmxpY2sgOykpCisKZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvZmFxLzMgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL2ZhcS8zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZWE1ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL2ZhcS8zCkBAIC0wLDAgKzEsMjMgQEAKKworMy4gRkxVQ0hUUklDSFRVTkcKKworRXR3YXMgdW5zY2hlaW5iYXIsIGFiZXIgaW4gbWVpbmVuIEF1Z2VuIGlzdCBkaWVzIGltbWVyIG5vY2ggZGVyIHdlcnR2b2xsc3RlCitCZWZlaGwsIGRlbiBtYW4gYWxzIFNlaGVyIG5ldSBlcmhhZWx0OiBGbHVjaHRyaWNodHVuZy4KKworQWIgc29mb3J0IGthbm5zdCBEdSBkZW4gQmVmZWhsICdGbHVjaHRyaWNodHVuZyAoUmljaHR1bmcpJyBhbndlbmRlbi4KK1NvbGx0ZSBkaWVzZXIgbm9jaCBuaWNodCBha3RpdmllcnQgc2VpbiwgbXVzc3QgZHUgZWlubWFsIEVuZGUgbWFjaGVuLgorRGFuYWNoIGthbm5zdCBEdSBzZWxic3QgYmVzdGltbWVuLCBpbiB3ZWxjaGUgUmljaHR1bmcgRHUgZmxpZWhzdCwKK3dlbm4gZGllIEFuZ3N0IERpY2ggbWFsIHVlYmVya29tbWVuIHNvbGx0ZSAuLi4uLgorQWJlciBBY2h0dW5nOiBEZXIgQmVmZWhsIGZ1bmt0aW9uaWVydCBtaXQgZWluZXIgV2Fyc2NoZWlubGljaGtlaXQgdm9uCis4MCBQcm96ZW50OyBmdWVyIGplZGVuIExldmVsIHVlYmVyIDIwIGVyaG9laHQgc2ljaCBkaWUgV2Fyc2NoZWlubGljaGtlaXQKK2Rhbm4gdW0gd2VpdGVyZSB6d2VpIFByb3plbnQuLi4gIFRpcDogRmx1Y2h0cmljaHR1bmcgPkVuZGU8IGZ1bmt0aW9uaWVydAorYXVjaCwgZWJlbnNvIHdpZTogRmx1Y2h0cmljaHR1bmcgPnRlaWxlIEJvaW5nIG1pdCBEdSwgaWNoIHN0ZXJiZSBnbGVpY2ggOig8CitNYW4gbXVzcyBoYWx0IGRpZSBQcmlvcml0YWV0ZW4gcmljaHRpZyBzZXR6ZW4gOykpLgorCitXYXJ1bSBkaWVzZXIgQmVmZWhsIGluIG1laW5lbiBBdWdlbiBiZXNvbmRlcnMgd2ljaHRpZyBpc3QgPyBOdW4sIGVyIGJlZnJlaXQKK1NwaWVsZXIgbWl0IHNlaHIgaG9oZXIgV2Fyc2NoZWlubGljaGtlaXQgdm9uIGRlbSBSaXNpa28sIGR1cmNoIGVpbmVuIExhZyB6dQorc3RlcmJlbiwgd2VubiBkaWUgRmx1Y2h0IGltIGVudHNjaGVpZGVuZGVuIE1vbWVudCBpbiBkaWUgZmFsc2NoZSBSaWNodHVuZyB6dQorZ2VoZW4gZHJvaHQuIE1hbiBtdXNzIHNpZSB2b3JoZXIgbnVyIHJpY2h0aWcgZ2VzZXR6dCBoYWJlbi4gQWxsZXJkaW5ncywgZWluCitrbGVpbmVzIFJpc2lrbyBibGVpYnQuLi4gZGVubiBlcnN0IGFiIExldmVsIDMwIGtsYXBwdCBkaWUgRmx1Y2h0cmljaHR1bmcgenUKKzEwMCUsIGFsc28gd2FjaGJsZWliZW4gOykuCisKZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvZmFxLzQgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL2ZhcS80Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMjQxMTgKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL2ZhcS80CkBAIC0wLDAgKzEsMzQgQEAKKzQuIFNFSEVSTEVWRUwKK0EgcHJvcG9zIExldmVscy0gendhciBpc3QgbWFuIG51biBTZWhlciwgYWJlciBkZW5ub2NoIGthbm4gbWFuCithdWNoIHdlaXRlcmhpbiBzZWluZSBTdHVmZW4gZXJob2VoZW4gLSBhbGxlcmRpbmdzIG1pdCBldHdhcyBtZWhyCitBdWZ3YW5kIGFscyBmcnVlaGVyIDooKCAtIGRpZSBMZXZlbHMgIHVuZCBpaHJlIEVQLUFuZm9yZGVydW5nZW46CisKKworU3R1ZmUgICBFcmZhaHJ1bmcgICAgICAgICAgU3R1ZmUgICBFcmZhaHJ1bmcgICAgICAgICAgU3R1ZmUgICBFcmZhaHJ1bmcKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorMjEgICAgICAgMTUwMDAwMCAgICAgICAgICAgMjYgICAgICAxMTAwMDAwMCAgICAgICAgICAgMzEgICAgICA4MDAwMDAwMAorMjIgICAgICAgMjI1MDAwMCAgICAgICAgICAgMjcgICAgICAxNzAwMDAwMCAgICAgICAgICAgMzIgICAgIDEwMDAwMDAwMAorMjMgICAgICAgMzM3NTAwMCAgICAgICAgICAgMjggICAgICAyNTAwMDAwMCAgICAgICAgICAgMzMgICAgIDEyNTAwMDAwMAorMjQgICAgICAgNTA2MjUwMCAgICAgICAgICAgMjkgICAgICA0MDAwMDAwMCAgICAgICAgICAgMzQgICAgIDE1MDAwMDAwMAorMjUgICAgICAgNzYwMDAwMCAgICAgICAgICAgMzAgICAgICA2MDAwMDAwMCAgICAgICAgICAgMzUgICAgIDE3NTAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzYgICAgIDIwMDAwMDAwMAorCitEaWUgQmVkZXV0dW5nIGRlciBMZXZlbHMgaXN0IGluc29mZXJuIGhvY2gsIGFscyBkYXNzIGRpZSBFcmZvbGdzLQorY2hhbmNlIGRlciBaYXViZXJzcHJ1ZWNoZSBpbiBkZW4gbmV1ZW4gR2lsZGVuIHZvbiBkZW0gTGV2ZWwgZGVzCitTcGllbGVycyBhYmhhZW5naWcgaXN0LiBTbyBpc3QgZXMgZ3J1bmRzYWV0emxpY2ggbnVyIG1vZWdsaWNoLCBkaWUgbWF4aW1hbGUKK0VyZm9sZ3N3YXJzY2hlaW5saWNoa2VpdCBlaW5lcyBaYXViZXJzcHJ1Y2hlcyBlcnN0IGRhbm4genUgZXJyZWljaGVuLCB3ZW5uCittYW4gU2VoZXJsZXZlbCAzMCBlcnJlaWNodCBoYXQuIEJlcmVjaG5ldCB3aXJkIGRhcyBnYW56ZSB3aWUgZm9sZ3Q6CitCZWkgTGV2ZWwgMjAgYmV0cmFlZ3QgZGllIEVyZm9sZ3N3YXJzY2hlaW5saWNoa2VpdCA4MCBQcm96ZW50LiBQcm8gTGV2ZWwKK3VlYmVyIDIwIHN0ZWlndCBkaWUgV2Fyc2NoZWlubGljaGtlaXQgZGFubiB1bSB3ZWl0ZXJlIDIgUHJvemVudCwgZXJyZWljaHQKK2Fsc28gYmVpIExldmVsIDMwIDEwMCBQcm96ZW50LgorRGllcyBmdWVocnQgaW0gRXJnZWJuaXMgZGF6dSwgZGFzcyBlaW4gWmF1YmVyc3BydWNoLCBkZW4gbWFuIGFuIHNpY2ggenUgOTAlCitiZWhlcnJzY2h0LCBpbiBMZXZlbCAyNSBudXIgbWl0IGVpbmVyIFdhcnNjaGVpbmxpY2hrZWl0IHZvbiA4MSBQcm96ZW50CitnZWxpbmd0ICg5MCUgQmVoZXJyc2NoZW4gZGVzIFNwcnVjaGVzICogOTAlIFdhcnNjaGVpbmxpY2hrZWl0IGF1cyBMZXZlbCAyNSkuCitBbGxlcmRpbmdzIGdpbHQgZGllc2UgRm9ybWVsIHNvIGdsb2JhbCBudXIgZnVlciBTdGFuZGFyZC1aYXViZXJzcHJ1ZWNoZSAoaW5zLQorYmVzb25kZXJlIGRpZSBpbiBkZXIgQWJlbnRldXJlcmdpbGRlKTsgZGllIE1hZ2llciBkZXIgZWluemVsbmVuIEdpbGRlbgora29lbm5lbiBkdXJjaCBkZW4gU2Nod2llcmlna2VpdHNncmFkIGVpbmVzIFphdWJlcnNwcnVjaGVzIGJlc3RpbW1lbiwgb2IKK2RpZXNlciBtaXQgaG9laGVyZXIgb2RlciBuaWVkcmlnZXJlciBXYXJzY2hlaW5saWNoa2VpdCBnZWxpbmd0LCBhbHMgZHVyY2ggZGllCitvYmVuIGFuZ2VmdWVocnRlIFJlY2hudW5nIHZvcmdlc2VoZW4uIEluIGRlciBLYXJhdGVnaWxkZSBpc3QgZXMgc29nYXIgc28KK2dlcmVnZWx0LCBkYXNzIGRlciBMZXZlbCBhbiBzaWNoIGZ1ZXIgZGllIEVyZm9sZ3N3YXJzY2hlaW5saWNoa2VpdCBlaW5lcworU3BydWNoZXMgdW5lcmhlYmxpY2ggaXN0LgorCmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL2ZhcS81IGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9mYXEvNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2YzMWE2Ci0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9mYXEvNQpAQCAtMCwwICsxLDMwIEBACis1LiBLb21tdW5pa2F0aW9uCisKK0FscyBTZWhlciBzdGVoZW4gRGlyIG5ldWUgTWl0dGVsIGRlciBLb21tdW5pa2F0aW9uIHp1ciBWZXJmdWVndW5nLCBtaXR0ZWxzCitkZXJlciBEdSBOYWNocmljaHRlbiBhbiBhbmRlcmUgU3BpZWxlciBzZW5kZW4ga2FubnN0OgorCitJLiBNQUlMCitBYiBzb2ZvcnQgc3RlaHQgRGlyIGRlciBrb3N0ZW5sb3NlIEt1cmllcmRpZW5zdCBkZXIgTUctUG9zdCB6dXIKK1ZlcmZ1ZWd1bmcgLSBkdXJjaCBFaW5nYWJlIHZvbiAnbWFpbCcga2FubnN0IGR1IHZvbiB1ZWJlcmFsbCBQb3N0Cit2ZXJzY2hpY2tlbiB1bmQgZW1wZmFuZ2VuLiBEaWVzIHNldHp0IGFiZXIgdm9yYXVzLCBkYXNzIER1IGVpbmUgWmVpdHVuZworYmVpIERpciB0cmFlZ3N0LCBkYSBkYXMgbWFpbCBlaW5lIFp1c2F0emZ1bmt0aW9uIGRlciBNUEEgaXN0LgorCitJSS4gTVBBCitJbiBkZXIgWmVpdHVuZyBzdGVodCBEaXIgbnVuIGRpZSBuZXVlIFJ1YnJpayAnc2VoZXIuZW50d2lja2x1bmcnIHp1cgorVmVyZnVlZ3VuZywgaW4gZGVyIER1IERlaW5lIFZvcnNjaGxhZWdlIHp1ciBWZXJiZXNzZXJ1bmcgZGVzCitTZWhlcnR1bXMgZWluYnJpbmdlbiBrYW5uc3QuCisKK0lJSS4gS2FuYWVsZQorWnVyIGRpcmVrdGVuIEtvbW11bmlrYXRpb24gbWl0IGRlbiBhbmRlcmVuIFNlaGVybiBzdGVodCBEaXIgbnVuIGF1Y2ggZWluCituZXVlciBLYW5hbCB6dXIgVmVyZnVlZ3VuZy4gRXIgd2lyZCBtaXQgJyAtaCAnIGFuZ2VzcHJvY2hlbgorKG5laW4sIG5pY2h0IG1pdCBTIHdpZSBTZWhlciwgZGFubiBrbmFsbHQgZGllIE1lbGR1bmcgendhciBhdWNoIHVlYmVyCitkZW4gU2VoZXJrYW5hbCwgYWJlciBlYmVuZmFsbHMgdWViZXIgU3BvcnQgdW5kIFNub29wIDspKS4KKworSVYuIEZlcm5zY2hyZWliZXIKK01pdCBkZW0gRmVybnNjaHJlaWJlciBhdXMgZGVtIFNlaGVybGFkZW4ga2FubnN0IER1IGdhbnplIE5hY2hyaWNodGVuYmxvZWNrZQorYW4gYW5kZXJlIFNwaWVsZXIgc2VuZGVuLiBEaWVzIGlzdCBoYWV1ZmlnIG51ZXR6bGljaCwgd2VubiBtYW4gbGFlbmdlcmUgVGV4dGUKK2FuIGVpbmVuIGFuZGVyZW4gU3BpZWxlciBzZW5kZW4gd2lsbCwgd2FlaHJlbmQgbWFuIHouQi4gbWl0IGRpZXNlbSB6dXNhbW1lbgorZWluZSBuZXVlIFJlZ2lvbiBvZGVyIGVpbiBRdWVzdCBlcmZvcnNjaHQuIERlciBFaW5zYXR6IGtvc3RldCAxNSBNUCBwcm8KK1NwaWVsZXIsIGFuIGRlbiBkaWUgTmFjaHJpY2h0IGdlc2VuZGV0IHdpcmQsIG1hbiBrYW5uIGF1Y2ggYW4gbWVocmVyZSBTcGllbGVyCitnbGVpY2h6ZWl0aWcgZGllIE1lbGR1bmcgYXVzZ2ViZW4gbGFzc2VuLgorCmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL2ZhcS82IGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9mYXEvNgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWI5ZGZjCi0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9mYXEvNgpAQCAtMCwwICsxLDE1IEBACis2LiBNQUdJU0NIRSBLVUdFTAorCitJbSBIYXVzIGRlciBIZXhlIGFtIEZyaWVkaG9mIHVuZCBpbiBad2Fja2VsbWFubnMgU2NobG9zcyBmaW5kZXN0CitEdSBlaW5lIEt1Z2VsLCBkaWUgRHUgbWl0bmVobWVuIGthbm5zdCAtIG1pdCBpaHIga2FubnN0IGR1IGR1cmNoIGRlbiBCZWZlaGwKKydmaW5kZSAoU3BpZWxlcm5hbWUpJyBqZWRlbiBlaW5nZWxvZ2d0ZW4gU3BpZWxlciBsb2thbGlzaWVyZW4gLSBlaW4gRWluc2F0egora29zdGV0IGpld2VpbHMgOSBNUC4KKworTWl0IGRlciBFaW5mdWVocnVuZyBkZXMgU2VoZXJxdWVzdHMgdm9uIFRyb3kgZXJoYWVsdCBtYW4gYWxzIFF1ZXN0YmVsb2hudW5nCitlaW5lIC0gZGVyIE5hbWUgZGVzIFF1ZXN0cyBsYWVzc3QgZXMgVmVybXV0ZW4gLSBLcmlzdGFsbGt1Z2VsLCBkaWUgZGllc2VsYmUKK0Z1bmt0aW9uIHdpZSBkaWUgU2VoZXJrdWdlbCBlcmZ1ZWxsdC4gQWxsZXJkaW5ncyBrb3N0ZXQgZGllc2UgcHJvIEVpbnNhdHogbnVyCisxIE1QLiBEYWZ1ZXIgZXJoYWVsdCBhbGxlcmRpbmdzIGRlciBiZW9iYWNodGV0ZSBTcGllbGVyIGRpZSBNZWxkdW5nICdKZW1hbmQKK2Jlc2Nod29lcnQgRGVpbiBCaWxkIGhlcmF1Zi4nLCB3YXMgYXVmIGRhdWVyIGV0d2FzIGF1ZmRyaW5nbGljaCB3aXJkLCBkYSBkZXIKK0JldHJvZmZlbmUgamEgbmljaHQgd2Vpc3MsIHdlciBpaG4gZGEgc3VjaHQuIEljaCBwZXJzb2VubGljaCBoYWx0ZSBkZW4KK0VpbnNhdHogZGVyICdub3JtYWxlbicgU2VoZXJrdWdlbCBmdWVyIGRpc2tyZXRlciwgaW5zYmVzb25kZXJlLCBkYSBzaWNoIGlocmUKK0tvc3RlbiBqYSBpbiBlaW5lbSB2ZXJ0cmV0YmFyZW4gUmFobWVuIGJld2VnZW4uCmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL2ZhcS83IGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9mYXEvNwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2VkMmNhCi0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9mYXEvNwpAQCAtMCwwICsxLDE2OSBAQAorNy4gU0VIRVJMQURFTgorQXVmIFN2b2x2YWVyIGZpbmRlc3QgRHUgZWluZW4gTGFkZW4sIGRlciBzcGV6aWVsbGUgaXRlbXMgbnVyIGZ1ZXIKK1NlaGVyIGFuYmlldGV0LiBJbnRlcmVzc2FudCBpc3QgaGllciBkZXIgQnVtZXJhbmcsIGRhenUgbm9jaCBkaWUKK1BhcnR5dHJvZXRlIC0gZGVyIFJlc3QgaXN0IG1laHIgb2RlciB3ZW5pZ2VyIGJyYXVjaGJhcmVzIFpldWdzIC0gYWJyYXRlbgord3VlcmRlIGljaCB2b24gZGVtIEthdWYgZGVyIFpULVd1ZW5zY2hlbHJ1dGUsIGRpZSB6d2FyIHJlbGF0aXYKK3ZlcmxhZXNzbGljaCBhcmJlaXRldCwgYWxsZXJkaW5ncyBwcm8gRWluc2F0eiA0NSBNUCBrb3N0ZXQsIHVuZCBzaWNoIGRhbWl0CitudXIgbG9obnQsIHdlbm4gbWFuIGluIGVpbmVtIGtvbmtyZXRlbiBSYXVtIGVpbmVuIFpUIHZlcm11dGV0LgorQW5zb25zdGVuIGlzdCBuYXR1ZXJsaWNoIGRlciBLYXVmIGRlcyB2b24gQk9JTkcgaGFuZGdlbmFlaHRlbgorS2lzc2VucyBlaW4gTVVTUyEKKworRWluZSBrdXJ6ZSBCZXNjaHJlaWJ1bmcgc2FlbXRsaWNoZXIgU2VoZXJsYWRlbmFydGlrZWwgZmluZGV0IHNpY2ggaGllciBpbQorQW5zY2hsdXNzOyBhbiBkaWVzZXIgU3RlbGxlIGVpbmVuIGhlcnpsaWNoZW4gRGFuayBhbiBDdWNodWxsaW4sIGRlciBkaWVzZQorTGlzdGUgZXJzdGVsbHQgdW5kIHNpY2ggZGFtaXQgc2VociB2aWVsIE11ZWhlIGdlZ2ViZW4gaGF0LgorCitGdWVyIGRhcyBBbmdlYm90IGltIFNlaGVybGFkZW4gaXN0IExvY28genVzdGVuZGlnLCBkZXIgZGFzIGJpc2hlciBldHdhcworc3BhZXJsaWNoZSBBbmdlYm90IGdlcm5lIGVyd2VpdGVybiBtb2VjaHRlLCB1bmQgZGFoZXIgZnVlciBJZGVlbgoraW1tZXIgYXVmZ2VzY2hsb3NzZW4gaXN0IC0gZGFoZXIgc2NocmVpYmUgaWhtIHJ1aGlnIGVpbiBtYWlsLCB3ZW5uIER1CitlaW5lIElkZWUgaGFzdCwgd2FzIGRvcnQgenVrdWVuZnRpZyBhbmdlYm90ZW4gd2VyZGVuIGtvZW5udGUuCisKK0FuZ2Vib3RlbmUgQXJ0aWtlbCBpbSBTZWhlcmxhZGVuIChUZXh0IHZvbiBDdWNodWxsaW46KQorCisxOiAgICAxNSBFaW5lIEZhY2tlbC4KKyAgICAgICAgICAgICAgICBFaW5lIGdhbnogbm9ybWFsZSBGYWNrZWwuIE1hbiBrYW5uIHNpZSBhbnp1ZW5kZW4gdW5kCisgICAgICAgICAgICAgICAgd2llZGVyIGxvZXNjaGVuLgorCisgMjogICAgMTAgRWluIHZvbiBCb2luZyBoYW5kZ2VuYWVodGVzIEtpc3NlbgorICAgICAgICAgICAgICAgIE1hbiBrYW5uIGVzIGFuZGVyZW4gc2VociBndXQgbmFjaHdlcmZlbiA7KQorCisgMzogIDE4MDAgRWluIFdlY2tlciAoTHV4dXNhdXNnYWJlKS4KKyAgICAgICAgICAgICAgICBaZWlndCBkaWUgVWhyemVpdCBhbiwgZGllbnQgYWxzIFN0b3BwdWhyIHVuZCBhbHMgVGltZXIuCisgICAgICAgICAgICAgICAgQXV0b2xvYWQuCisKKyA0OiAgICAxNSBFaW4gTG9sbGkuCisgICAgICAgICAgICAgICAgRWluIExvbGxpLCBzbyB3aWUgaWhuIGRhcyBQYXJ0eW1vbnN0ZXIgZ2VybmUgdmVydGVpbHQuCisKKyA1OiAgIDI0MCBFaW4gVC1TaGlydC4KKyAgICAgICAgICAgICAgICBSdWVzdHVuZ3NnYXR0dW5nIFVtaGFuZyB1bmQgZGVua2JhciBzY2hsZWNodC4uLiBhYmVyIGFscworICAgICAgICAgICAgICAgIFNlaGVyIGthbm4gbWFuIGVzIG1pdCBlaW5lbSBUZXh0IHZlcnNlaGVuIHVuZCBtYW4gc2llaHQncworICAgICAgICAgICAgICAgIGltIEV4dHJhbG9vay4uLiBOZXR0ZSBTYWNoZSBpbiBqZWRlbSBGYWxsLgorCisgNjogICAgIDggRWluIFd1ZXJmZWwuCisgICAgICAgICAgICAgICAgIkR1IHd1ZXJmZWxzdCBlaW5lIDYuIiBFaW4gZ2FueiBub3JtYWxlciBXdWVyZmVsLgorCisgNzogICAgMTggRWluIEZvZXJtY2hlbi4KKyAgICAgICAgICAgICAgICBFaW4gcm90ZXMgRm9lcm1jaGVuIGluIGRlciBGb3JtIGVpbmVzIEhlcnplbnMuCisgICAgICAgICAgICAgICAgTWVociBhbGxlcmRpbmdzIG5pY2h0LgorCisgODogIDU0MDAgRWluIEJ1bWVyYW5nLgorICAgICAgICAgICAgICAgIEVpZ2VudGxpY2ggbXVzcyBtYW4gZGF6dSBuaWNodCB2aWVsIHNhZ2VuLCBlaW5lIHdpcmtsaWNoCisgICAgICAgICAgICAgICAgLSBmYXN0IHp1IC0gZ3V0ZSBXYWZmZS4gV3VyZGUgYWxsZXJkaW5ncyBrdWVyemxpY2ggZXR3YXMKKyAgICAgICAgICAgICAgICBhYmdld2VydGV0LCBpc3QgamVkb2NoIGltbWVyIG5vY2ggd2VydHZvbGxlIEhpZmxlIGltIEthbXBmLgorICAgICAgICAgICAgICAgIE1hbiBrYW5uICh2b24gZGVuIGluc2dlc2FtdCB2aWVyZW4gcHJvIFJlc2V0IG51ciBlaW5lbiBCdW1lLQorICAgICAgICAgICAgICAgIHJhbmcga2F1ZmVuLiBEaWVzIHd1cmRlIGdlZ2VuIGRpZSBIYW1zdGVya2FldWZlIG5hY2ggZWluZW0KKyAgICAgICAgICAgICAgICBTaHV0ZG93biBlaW5nZWZ1ZWhydCAoRXMgZ2lidCBTZWhlciwgZGllIGthZW1wZmVuIG1pdCB2aWVyCisgICAgICAgICAgICAgICAgQnVtZXJhbmdzIHVuZCBoYWJlbiBub2NoIGRyZWkgYWxzIEVyc2F0eiBpbSBCZXV0ZWwuLi4pLiBOYWNoCisgICAgICAgICAgICAgICAgZWluZW0gcmVib290L2NyYXNoIGFsbGVyZGluZ3MgZXJoYWVsdCBqZWRlciBTZWhlciBtaW5kZXN0ZW5zCisgICAgICAgICAgICAgICAgZWluZW4gQnVtZXJhbmcuCisKKyA5OiAgICA2MCBFaW4gdHJhZ2JhcmVyIFBvc3RrYXJ0ZW5kcnVja2VyLgorICAgICAgICAgICAgICAgIE1hbiBrYW5uIGRhbWl0IHNlY2hzIFBvc3RrYXJ0ZW4gZXJ6ZXVnZW4sIG1pdCBUZXh0IHZlcnNlaGVuCisgICAgICAgICAgICAgICAgdW5kIHZlcnNjaGlja2VuLiBOZXR0ZXIgR2FnLgorCisxMDogIDE4MDAgRGllIFRyb2V0ZSBkZXMgUGFydHltb25zdGVycy4KKyAgICAgICAgICAgICAgICBFaW4gTXVzcyBmdWVyIFBhcnR5ZmFucyEgRGFzIFV0ZW5zaWwgenUgUGFydHltb25zdGVycnVmZW4uCisKKzExOiAgOTk5OSBFaW4gWmF1YmVyc3RhYi4KKyAgICAgICAgICAgICAgICBBIGxhIEhpbGJlcnQuIElzdCBkdXJjaCBkZW4gTGljaHQtWmF1YmVyc3BydWNoIHJlbGF0aXYKKyAgICAgICAgICAgICAgICB1bndpY2h0aWcgZ2V3b3JkZW4uIEF1c3NlcmRlbSBpc3QgZGVyIGdla2F1ZnRlIFN0YWIgbmljaHQKKyAgICAgICAgICAgICAgICBjcmFzaGZlc3QuCisKKzEyOiAgIDQ5OSBFaW4gUGxhbmVkaXRvci4KKyAgICAgICAgICAgICAgICBXZXIgc2VpbiBQcm9qZWt0IG9kZXIgc2VpbmVuIFBsYW4gZWRpdGllcmVuIHdpbGwsIGJyYXVjaHQKKyAgICAgICAgICAgICAgICBlaW5lbiBQbGFuZWRpdG9yLgorCisxMzogIDEyMDAgRWluIFBhYXIgU2llYmVubWVpbGVuc3RpZWZlbC4KKyAgICAgICAgICAgICAgICBFaW5lIEVybGVpY2h0ZXJ1bmcgZnVlciBkaWVqZW5pZ2VuLCBkaWUgbmljaHQgdWViZXIgaXJnZW5kLQorICAgICAgICAgICAgICAgIHdlbGNoZSBGcm9udGVuZC1Qcm9ncmFtbWUgdmVyZnVlZ2VuLiBNYW4gbGFldWZ0IGVpbmVuIFdlZworICAgICAgICAgICAgICAgIGltbWVyIGJpcyB6dXIgbmFlY2hzdGVuIEFiendlaWd1bmcuCisKKzE0OiAgIDUwMCBNYWdpc2NoZXIgQmV1dGVsLgorICAgICAgICAgICAgICAgIEVpbiBuZXR0ZXMgJ1Rvb2wnLCB1bSBhbmRlcmUgenUgYWVyZ2Vybi4gV2VyIGhhdCBuaWNodAorICAgICAgICAgICAgICAgIHNjaG9ubWFsIHZvciBlaW5lciBTY2hhdHRlbnJ1ZXN0dW5nIGdlc3RhbmRlbiwgdW5kIHNpY2gKKyAgICAgICAgICAgICAgICBnZWZyYWd0LCB3YXJ1bSBlciBzaWUgbmljaHQgbmVobWVuIG9kZXIgYW56aWVoZW4ga2Fubi4KKyAgICAgICAgICAgICAgICBBdXRvbG9hZC4KKworMTU6IDExMTExIEVpbmUgV3VlbnNjaGVscnV0ZS4KKyAgICAgICAgICAgICAgICBadW0gQXVmZmluZGVuIHZvbiBaYXViZXJ0cmFlbmtlbi4gRWlnbmV0IHNpY2ggbnVyIGJlaQorICAgICAgICAgICAgICAgIGtvbmtyZXRlbSBWZXJkYWNodCwgZGEgc2llIG51ciBhbnplaWd0LCBvYiBzaWNoIGVpbiBaVAorICAgICAgICAgICAgICAgIGltIFJhdW0gYmVmaW5kZXQuCisKKzE2OiAgMzAwMCBFaW4gVGVzdHJvZWhyY2hlbiAoZ2VicmF1Y2hzZmVydGlnKS4KKyAgICAgICAgICAgICAgICA8aGljaz4hIFdpZSBiZXNvZmZlbiBpc3QgbWFuIGVpZ2VudGxpY2g/IFdpZWRlcnZlcndlbmRiYXIuCisKKzE3OiAgMzAwMCBFaW4gU2NoaWViZXB1enpsZS4KKyAgICAgICAgICAgICAgICBXZXIgYWVyZ2VydCBzaWNoIG5pY2h0LCB3ZW5uIGRhcyBGcmV1bmRzY2hhZnRzYmFuZCBhdXMKKyAgICAgICAgICAgICAgICBpcmdlbmR3ZWxjaGVuIEdydWVuZGVuIHBsb2V0emxpY2ggZ2FueiBvYmVuIGltIEludmVudG9yeQorICAgICAgICAgICAgICAgIHN0ZWh0PyBIaWVybWl0IGthbm4gZGFzIEludiBuYWNoIEJlbGllYmVuIHVtc29ydGllcnQgd2VyZGVuLgorICAgICAgICAgICAgICAgIEF1dG9sb2FkLgorCisxODogICA1MDAgRWluIER1ZGVsc2Fjay4KKyAgICAgICAgICAgICAgICBEYXMga29tZm9ydGFiZWxzdGUgTXVzaWtpbnN0cnVtZW50IE1vcmdlbkdyYXVlbnMuCisgICAgICAgICAgICAgICAgTWFuIGthbm4gc29nYXIgZGllIHZvcmdlZmVydGlndGVuIFN0dWVja2UgZ2VuYXUKKyAgICAgICAgICAgICAgICBhbnNwcmVjaGVuLi4uCisKKzE5OiAgIDQ5OSBFaW4gaGFuZGdlYXJiZWl0ZXRlciBNaW5pLUZsYW1tZW53ZXJmZXIgKHRtKS4KKyAgICAgICAgICAgICAgICAnZmxhbWUnIEVpbiBuZXR0ZXIgR2FnLgorCisyMDogICAxOTkgRWluZSBidW50ZSBTcHJpdHpwaXN0b2xlLgorICAgICAgICAgICAgICAgICdzcGxhc2gnIFNpZWhlIEZsYW1tZW53ZXJmZXIuCisKKzIxOiAgIDkwMCBFaW4gUGFhciBmZXN0ZSBTY2h1aGUuCisgICAgICAgICAgICAgICAgRGFzICdydHJldGUnISBMZWlkZXIgd2VyZGVuIChub2NoKSBrZWluZSBBZGpla3RpdmUKKyAgICAgICAgICAgICAgICBha3plcHRpZXJ0LgorCisyMjogIDQ1MDAgRWluZSBTdGltbWdhYmVsLgorICAgICAgICAgICAgICAgIElkZWFsIGZ1ZXIgZGllLCBkaWUgSGlwcGUgbmljaHQgbW9lZ2VuLgorICAgICAgICAgICAgICAgIElzdCBldHdhcyBpbiBkZXIgUmljaHR1bmcgJ0FudGktSGlwcGUtQnV0dG9uJy4KKworMjM6ICAgMjk4IEVpbiBTdHJhbmRiYWxsLgorICAgICAgICAgICAgICAgIEthbm4gbWFuIGFuZGVyZW4gTGV1dGVuIHp1d2VyZmVuLiBJc3QgbmljaHQgc28gbHVzdGlnIHdpZQorICAgICAgICAgICAgICAgIEJvaW5ncyBoYW5kZ2VuYWVodGVzIEtpc3NlbiwgZGFmdWVyIGFiZXIgYXVjaCBuaWNodCBzbworICAgICAgICAgICAgICAgIHByb3Zva2FudC4KKworMjQ6ICAgNzk4IEVpbmUgbWFnaXNjaGUgQmllcmZsYXNjaGUuCisgICAgICAgICAgICAgICAgRnVlciBCaWVydHJpbmtlciBlaW4gTXVzcyEgRGllamVuaWdlbiwgZGllICdpaHIgQmllcicgbmljaHQKKyAgICAgICAgICAgICAgICBhdWYgZGVyIExpc3RlIGZpbmRlbiwga29lbm5lbiBqYSBkZW0gZW50c3ByZWNoZW5kZW4gTWFnaWVyCisgICAgICAgICAgICAgICAgbmUgTWFpbCBzY2hyZWliZW4uIEFjaGphIC0gU3ludGF4OiB3dWVuc2NoZSA8c29ydGU+CisKKzI1OiAgIDE1MCBFaW4gTWVzc2VyIE1hcmtlIFNhbXRoYW5kc2NodWguCisgICAgICAgICAgICAgICAgV2VyIG1pdCBkaWVzZXIgV2FmZmUgZ2VnZW4gZWluZW4gU2NobWV0dGVybGluZyBrYWVtcGZ0LCBkYXJmCisgICAgICAgICAgICAgICAgZ2V0cm9zdCBpZGVsbiwgZGVubiBzaWUgaGFlbHQsIHdhcyBzaWUgdmVyc3ByaWNodC4KKworMjY6ICAzMDAwIEVpbiBMYWctTy1NZXRlci4KKyAgICAgICAgICAgICAgICBJc3QgaW50ZXJlc3NhbnQsIGFiZXIgbGVpZGVyIG5pY2h0IGF1dG9sb2FkLiBXZXIgd29sbHRlCisgICAgICAgICAgICAgICAgbmljaHQgc2Nob24gaW1tZXIgd2lzc2VuLCB3aWV2aWVsIExhZyBtYW4gZGVubiBudW4gd2lya2xpY2gKKyAgICAgICAgICAgICAgICBoYXQuLi4KKworMjc6ICAgODk1IEVpbmUgRGlkZGwtS251ZGRlbC1NYXVzLgorICAgICAgICAgICAgICAgIEZ1ZXIgZGllLCBkaWUgc2ljaCBpbiBNb3JvbiBuaWNodCBhdXNrZW5uZW4gb2RlciBrZWluZSBMdXN0CisgICAgICAgICAgICAgICAgaGFiZW4sIHNpY2ggYW4gZW50c3ByZWNoZW5kZXIgU3RlbGxlIGFuenVzdGVsbGVuLgorCisyODogICAxNTAgRWluIDRHZXdpbm50LVNwaWVsLgorICAgICAgICAgICAgICAgIFNTUCBsZWVyZ2VyYWV1bXQgPyBLZWluIEZyZXVuZCBlaW5nZWxvZ2d0ID8gRWluIGtsZWluZXMKK1NwaWVsCisgICAgICAgICAgICAgICAga2FubiBkaWUgTGFuZ2V3ZWlsZSB2ZXJ0cmVpYmVuLgorCisyOTogICAzMDAgRWluZSBSb2VudGdlbmJyaWxsZS4KKyAgICAgICAgICAgICAgICBFcm1vZWdsaWNodCB0aWVmZSB1bmQgc2VociBpbnRlcmVzc2FudGUgQmxpY2tlIHVudGVyIGRpdmVyc2UKKyAgICAgICAgICAgICAgICBTY2hvdHRlbnJvZWNrZS4ganVzdCBmb3IgZnVuLgorCiszMDogIDUwNTIgRWluIGtsZWluZXIgZ3JhdWVyIEthc3Rlbi4KKyAgICAgICAgICAgICAgICBFaW5lcyBkZXIgYmVzdGVuIFNlaGVydG9vbHMuIE1hbiBrYW5uIG1pdCBpaG0gTmFjaHJpY2h0ZW4gaW4KKyAgICAgICAgICAgICAgICBGb3JtIGdhbnplciBUZXh0YmxvZWNrZSBhbiBhbmRlcmUgU3BpZWxlciBzZW5kZW4uIEF1dG9sb2FkLgorCiszMTogIDMwMDMgRWluIElrb25vZ3JhcGguCisgICAgICAgICAgICAgICAgRnVlciBrbGVpbmUgU2NobmFwcHNjaHVlc3NlIHp3aXNjaGVuZHVyY2guIEhhZWx0IGRhcyBQX0xvbmcKKyAgICAgICAgICAgICAgICBkZXMgYmV0cmFjaHRldGVuIE9iamVrdGVzIGZlc3QuCisKKworKDQvOTUsIEN1Y2h1bGxpbikKKworCitIYXZlIEZ1bgorCitDdWNodWxsaW4gKCkKKworCisKKwpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9mYXEvOCBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvZmFxLzgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VjZWFiYwotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvZmFxLzgKQEAgLTAsMCArMSw0MyBAQAorOC4gREVTSUdORVItU0VIRVIKKworTnVuLCB2aWVsbGVpY2h0IGlzdCBkaWVzZXIgVGl0ZWwgYXVjaCBlaW4gd2VuaWcgdWViZXJ0cmllYmVuLiBBYmVyIGFscyBTZWhlcgora2FubnN0IER1IERlaW5lIGdlc2FtdGUgRXJzY2hlaW51bmcgaW0gTVVEIHNlbGJzdCBnZXN0YWx0ZW46CisKK051biwgRGVzaWduZXJ0eXBlbiBnbGFlbnplbiBkdXJjaCBpaHIgQWV1c3NlcmVzLCBhbHNvIGZhbmdlbiB3aXIgbWFsIGJlaW0KK0F1c3NlaGVuIGFuOiBXYXMgZGllIFNwaWVsZXIgc2VoZW4sIHdlbm4gc2llIERpY2ggdW50ZXJzdWNoZW4sIGthbm5zdCBEdSBtaXQKK2RlbSBCZWZlaGwgJ2V4dHJhbG9vaycgYmVzdGltbWVuLiBEaWUgZG9ydCBlaW5nZWdlYmVuZSBCZXNjaHJlaWJ1bmcgd2lyZCBkZXIKK0F1Zmxpc3R1bmcgZGVzc2VuLCB3YXMgRHUgYmVpIERpciB0cmFlZ3N0LCB2b3Jhbmdlc3RlbGx0LgorCitadXIgRXJzY2hlaW51bmcgZ2Vob2VydCBhdWNoIGRhcyBBdWZ0cmV0ZW4sIGFsc28gZGVzaWduZW4gd2lyIG1hbCBlaW4gYmlzY2hlbgorYW4gRGVpbmVuIG1lc3NhZ2VzIGhlcnVtLCBkaWUgZXJzY2hlaW5lbiwgd2VubiBEdSBlaW5lbiBSYXVtIGJldHJpdHRzdCBvZGVyCit2ZXJsYWVzc3QuIERpZXMga2FubnN0IER1IG1pdCBzZXRtaW4gKHRleHQpIGJ6dy4gc2V0bW91dCAodGV4dCkgc2V0emVuLiBVbmQKK3dlbm4gRHUgbW9lY2h0ZXN0LCBrYW5uc3QgRHUgbWl0IHNldG1tb3V0IGJ6dy4gc2V0bW1pbiBkaWUgTWVsZHVuZ2VuIHNldHplbiwKK2RpZSBFcnNjaGVpbmVuLCB3ZW5uIER1IGVpbmVuIE9ydCBtaXR0ZWxzIGVpbmVzIHRlbGVwb3J0cyB2ZXJsYWVzc3QvCitiZXRyaXR0c3QuCisKK0RvY2ggYXVjaCBEZXNpZ25lcnNlaGVyIGxlYmVuIHVudGVyIGRlbSBKb2NoIGRlcyBBcm1hZ2VkZG9uLCB1bmQgc2luZCBkYWhlcgorbWFuY2htYWwgV2FmZmVuLSB1bmQgUnVlc3R1bmdzbG9zLiBXZXIgZXMgYWJlciBuaWNodCBlcnRyYWdlbiBrYW5uLCBpbiBkaWVzZW4KK2JpdHRlcmVuIFN0dW5kZW4gaW1tZXIgZGllIE1lbGR1bmcgJ2dyZWlmZnQgbWl0IGJsb3NzZW4gSGFlbmRlbiBhbicgenUgc2VoZW4sCitkZXIga2FubiBzaWNoIG1pdHRlbHMgZGVzIEJlZmVobHMgJ3NldGhhbmRzICh0ZXh0KScgZWluZSBtYXJ0aWFsaXNjaGVyZSAob2RlcgorYXVjaCB6YWVydGxpY2hlcmUsIGplIG5hY2ggR2VzY2htYWNrIDspKSBLYW1wZm1lbGR1bmcgZnVlciBzZWluZSBIYWVuZGUKK3NldHplbi4KKworTnVuLCBzb24gcmljaHRpZ2VyIFNjaGlnZ2ktTWlnZ2kgU2VoZXIgaGF0IG5hdHVlcmxpY2ggYXVjaCBlaW5lbiB0b3RhbAorbGFlc3NpZ2VuIE5hbWVuLCBuaWNodCBzbyB3YXMgb2VkZXMgd2llICdXdXJzdCwgZGllIFNlaGVyaW4nLiBVbmQgZGVzaGFsYgora29lbm50ZSBzaWNoIFd1cnN0IGVpbmVuIGVpZ2VuZW4gTmFtZW4gZ2ViZW4sIG1pdCBkZW0gQmVmZWhsICd0aXRlbCAodGV4dCknLgorRGFubiBoaWVzc2Ugc2llIGhpbnRlcmhlciBCZWlzcGllbHN3ZWlzZSAnV3Vyc3QgaXNzIG5lIFd1cnN0Jy4gVW5kIHdlbSBkYXMKK25vY2ggbmljaHQgbGFlc3NpZyBnZW51ZyBpc3QsIGRlciBzZXR6dCBzaWNoIG1pdCAncHJlc2F5ICh0ZXh0KScgYXVjaCBub2NoCitlaW5lbiBOYW1lbnN2b3JzYXR6LiBCZWlzcGllbDogJ01hY2ggbmUgV3Vyc3QsIGlzcyBuZSBXdXJzdCcuIFdlbm5nbGVpY2ggZGFzCit2aWVsbGVpY2h0IGRvY2ggbmljaHQgU08gY29vbCBpc3QuIEdlc2NobWFja3NzYWNoZSBoYWx0IDspLgorCitBY2ggamEsIHVuZCB3ZW5uIG1hbiBkYW5uIGJlaSBhbGwgZGVyIFJ1bWRlc2lnbmVyZWkgdmVyZ2Vzc2VuIGhhYmVuIHNvbGx0ZSwKK3dhcyBtYW4gdWViZXJoYXVwdCBlaW5nZWdlYmVuIGhhdCwgc28gZXJoYWVsdCBtYW4gbWl0IGRlbSBCZWZlaGwgJ3JldmlldycKK2VpbmVuIFVlYmVyYmxpY2sgdWViZXIgZGllIG1laXN0ZW4gRWluc3RlbGx1bmdlbi4KKworRWluZSBBbm1lcmt1bmcgbm9jaDogRGVyIFRvZXRlciAoSEFJTCwgSEFJTCBBTEwhKSBoYXQga3VlcnpsaWNoIGVpbmUga2xlaW5lCitFcndlaXRlcnVuZyBpbiBkZW4gQmVmZWhsIHNldG1vdXQgZWluZ2ViYXV0OiBOdW5tZWhyIGlzdCBlcyBtb2VnbGljaCwgZGVuCitUZXh0ICduYWNoIChSaWNodHVuZyknIG5pY2h0IG1laHIgbnVyIGFtIEVuZGUsIHNvbmRlcm4gaXJnZW5kd28gaW0gVGV4dAorZXJzY2hlaW5lbiB6dSBsYXNzZW47IGRhbm4gbXVzcyBpbSBUZXh0IGRlciBvdXQtbWVzc2FnZSBlaW4gIyBlcnNjaGVpbmVuLCBkaWUKK2Rhbm4gZHVyY2ggJ25hY2ggKFJpY2h0dW5nKScgZXJzZXR6dCB3aXJkLiBVbnRlcmRydWVja2VuIGthbm5zdCBEdSBkaWUKK1JpY2h0dW5nc2FuZ2FiZSBhbGxlcmRpbmdzIG5pY2h0LCB3ZW5uIER1IGRpZSAjIHdlZ2xhZXNzdCwgd2lyZCBkaWVzZQorQW5nYWJlIGVpbmZhY2ggaGludGVuIGFuZ2VoYWVuZ3QuLgpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9mYXEvOSBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvZmFxLzkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRiMDhkMQotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvZmFxLzkKQEAgLTAsMCArMSw5IEBACisKKzkuIEZFSExFUk1FTERVTkcKKworRWluIG5pY2h0IGJlc29uZGVycyB3aWNodGlnZXIsIGFiZXIgaW4gc2VpbmVuIEF1c3dpcmt1bmdlbiBoYWV1ZmlnCithbmdldHJvZmZlbmVyIEJlZmVobDogRmVobGVybWVsZHVuZy4gV2VubiBEaXIgZGFzIGV3aWdlICdXaWUgYml0dGUgPycgbGFuZ3NhbQorenUgZWludG9lbmlnIHdpcmQsIHNvIGthbm5zdCBEdSBtaXQgJ0ZlaGxlcm1lbGR1bmcgKFRleHQpJyBlaW5lbiBuZXVlbiBUZXh0CitmdWVyIERlaW5lIEZlaGxlcm1lbGR1bmcgc2V0emVuIC0gdWVicmlnZW5zIGdlbmF1c28gd2llIGZ1ZXIgZGllIFVocm1lbGR1bmcsCit3YXMgYWxsZXJkaW5ncyBzY2hvbiBhbHMgU3BpZWxlciBtZW9nbGljaCBpc3QsIHdhcyBqZWRvY2ggc2NoZWluYmFyIG51ciByZWNodAord2VuaWdlIFNwaWVsZXIgd2lzc2VuLgpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9mYXEvYW5sZWl0dW5nIGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9mYXEvYW5sZWl0dW5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYTYxYTcKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL2ZhcS9hbmxlaXR1bmcKQEAgLTAsMCArMSwyMTkgQEAKKworQU5MRUlUVU5HIE1BR0lTQ0hFUiBCRVVURUwKKworU3RlbGxlbiB3aXIgdW5zIHZvciwgV3Vyc3QsIGRpZSBTZWhlcmluLCB3b2xsdGUgZWluIEJsdXRzYXVnZXJzY2h3ZXJ0CitoZXJzdGVsbGVuLCBtaXQgZGVtIHNpZSBnaWVyaWdlIGtsZWluZSBBbmZlbmdlciBhZXJnZXJuIHdpbGw6CisKKy8ga29tbWVudGFyZSBzdGVoZW4gaW1tZXIgaGludGVyIGRlbSAvLy4uLgorLyBsb3MgZ2VodHM6ICdlcnNjaGFmZmUnIGVpbmdlYmVuLCBkYW5uIGlzdCBtYW4gaW0gQmV1dGVsZWRpdG9yLCBkZXIgZGVtCisvIGJla2FubnRlbiBlZGl0b3Igdm9uIE1QQSB1bmQgbWFpbCBnbGVpY2h0LgorLyBXdXJzdCBnaWJ0IHp1bmFlY2hzdCBlaW5lIElEIGZ1ZXIgZGFzIFNjaHdlcnQgZWluOgorCitCaXR0ZSBlaW4gU2NobHVlc3NlbHdvcnQgZWluZ2ViZW46CitdaWQKK11CaXR0ZSBlaW5lIG5ldWUgSUQgZWluZ2ViZW46Citdc2Nod2VydAorCisvIG51biBtb2VjaHRlIFd1cnN0IG5vY2ggZWluZSB3ZWl0ZXJlIElEIGVpbmdlYmVuOgorCitCaXR0ZSBlaW4gU2NobHVlc3NlbHdvcnQgZWluZ2ViZW4sIH5oIGZ1ZXIgSGlsZmUuCitdaWQKKworLyBudW4ga29tbWVuIGFscyBBdXNnYWJlIGF1Y2ggZGllIGJpc2hlciBlaW5nZWdlYmVuZW4gSURzLCBpbiB1bnNlcmVtIEZhbGw6CisKK0Jpc2hlcmlnZSBJRHM6CiswIHNjaHdlcnQKK0JpdHRlIGVpbmUgbmV1ZSBJRCBlaW5nZWJlbgorXWJsdXRzYXVnZXJzY2h3ZXJ0CisKKy8gV3Vyc3QgaGFldHRlIGhpZXIgdWVicmlnZW5zIGtlaW5lIElEIGVpbmdlYmVuIG11ZXNzZW4uIGhhZXR0ZSBzaWUgbnVyIGlkLAorLyB1bmQgZGFuYWNoIGVudGVyIGVpbmdlZ2ViZW4sIGhhZXR0ZSBkaWVzIGRhenUgZ2VkaWVudCwgZGllIGJpc2hlcgorLyBlaW5nZWdlYmVuZW4gSURzIGFuenVzY2hhdWVuLgorLyBXZWl0ZXIgZ2VodHMgbWl0IGRlciBMYW5nYmVzY2hyZWlidW5nIChkYXMgd2FzIG1hbiBzaWVodCwgd2VubiBtYW4KKy8gdW50ZXJzdWNoZSAoaWQpIGVpbmdpYnQpOgorCitCaXR0ZSBlaW4gU2NobHVlc3NlbHdvcnQgZWluZ2ViZW46CitdbGFuZworQml0dGUgZGllIGF1c2Z1ZWhybGljaGUgQmVzY2hyZWlidW5nIGFuZ2ViZW4uIEJlZW5kZW4gbWl0ICoqCitdRGllcyBpc3QgZGFzIFNjaHdlcnQgZWluZXMgZWluc3QgbWFlY2h0aWdlbiBWYW1waXJzLiBOdW4gaXN0IGVzCitdamVkb2NoIHNvIHdlcnRsb3MgZ2V3b3JkZW4sIGRhc3Mgc2ljaCBqZWRlciBTZWhlciBlcyBtaXQgc2VpbmVtCitdbWFnaXNjaGVuIEJldXRlbCBrbG9uZW4ga2Fubi4KK11FcyBoYXQgZWluZW4gZ29sZGVuZW4gU2NoYWZ0LgorXSoqCisKKy8gV3Vyc3QgbW9lY2h0ZSwgZGFzcyBkaWUgU3BpZWxlciBlaW5lIEVya2xhZXJ1bmcgZGFmdWVyIGtyaWVnZW4sIGRhc3MgZGFzCisvIFNjaHdlcnQgYXV0b21hdGlzY2ggZ2V6dWVja3QgaXN0Li4uIGtlaW4gUHJvYmxlbSwgZGFmdWVyIGJlc2NocmVpYnQgc2llIGRlbgorLyBTY2hhZnQgZGVzIFNjaHdlcnRlcyBnZW5hdWVyOgorCitCaXR0ZSBlaW4gU2NobHVlc3NlbHdvcnQgZWluZ2ViZW46CitdZGV0YWlsCitCaXR0ZSBkZW4gRGV0YWlsbmFtZW4gZWluZ2ViZW46CitzY2hhZnQKK11OdW4gYml0dGUgZWluZSBCZXNjaHJlaWJ1bmcgZnVlcjogIiBzY2hhZnQgIiBlaW5nZWJlbi4KK11EaWVzZXIgU2NoYWZ0IGlzdCB2b24gcHVyZXIgTWFnaWUuIFdlciBkYXMgU2Nod2VydCBiZXNpdHp0LCB6dWVja3QgZXMKK11hdXRvbWF0aXNjaC4KK10qKgorQml0dGUgZWluIFNjaGx1ZXNzZWx3b3J0IGVpbmdlYmVuLCB+aCBmdWVyIEhpbGZlLgorXQorCisvIERhcyB3YXJzLCBzY2hvbiBiZXNpdHp0IGRhcyBTY2h3ZXJ0IGVpbmVuIFNjaGFmdC4KKy8gRWJlbnNvIG11c3Mgbm9jaCBlaW5lIEt1cnpiZXNjaHJlaWJ1bmcgYW5nZWdlYmVuIHdlcmRlbjoKKworQml0dGUgZWluIFNjaGx1ZXNzZWx3b3J0IGVpbmdlYmVuLCB+aCBmdWVyIEhpbGZlLgorXWt1cnoKK0JpdHRlIGRpZSBLdXJ6YmVzY2hyZWlidW5nIGVpbmdlYmVuCitdRWluIEJsdXRzYXVnZXJzY2h3ZXJ0IChnZXp1ZWNrdCkKKworLyBVZWJlcnJhc2NodCA/IERpZSBLdXJ6YmVzY2hyZWlidW5nIG11c3MgZ2VuYXUgc28gZWluZ2VnZWJlbiB3ZXJkZW4sIHdpZSBzaWUKKy8gZGVyIFNwaWVsZXIgaW4gc2VpbmVtIGludmVudG9yeSBzaWVodC4gRGFtaXQgZGllc2UgQmVzY2hyZWlidW5nIGFiZXIgbmljaHQKKy8gZXJzY2hlaW50LCB3ZW5uIGRhcyBTY2h3ZXJ0IGFuIGRhcyAnT3BmZXInIHVlYmVyZ2ViZW4gd2lyZCwgbXVzcyBlaW4gTmFtZQorLyBlaW5nZWdlYmVuIHdlcmRlbjoKKworQml0dGUgZWluIFNjaGx1ZXNzZWx3b3J0IGVpbmdlYmVuLCB+aCBmdWVyIEhpbGZlLgorXW5hbWUKK0JpdHRlIGRlbiBOYW1lbiBlaW5nZWJlbgorXUJsdXRzYXVnZXJzY2h3ZXJ0CisKKy8gRXJnbzogV2lyZCBrZWluIE5hbWUgc3BlemllbGwgZWluZ2VnZWJlbiwgd2lyZCBlcnNjaGVpbnQsIHdlbm4gZGFzIE9iamVrdAorLyB3ZWl0ZXJnZWdlYmVuIG9kZXIgZmFsbGVuZ2VsYXNzZW4gd2lyZCwgZGllIGt1cnpiZXNjaHJlaWJ1bmcgZGFyZ2VzdGVsbHQuCisvIFVtIGRpZSB6dSB2ZXJtZWlkZW4sIGdpYnQgZXMgZGVuIEJlZmVobCAnbmFtZScuCisvIEFsbGVyZGluZ3Mgd3VlcmRlIGJlaW0gVWViZXJnZWJlbiBkZXMgU2Nod2VydGVzIGpldHp0IGVyc2NoZWluZW46ICdXdXJzdAorLyBnaWJ0IERpciBkZW4gU2Nod2VydCcsIGRhIG5vY2gga2VpbiBHZXNjaGxlY2h0IGdlc2V0enQgd3VyZGUsIHVuZCBkZWZhdWx0LQorLyBnZXNjaGxlY2h0IG1hZW5ubGljaCBpc3QuIERhaGVyIGZvbGd0IG51bjoKKworQml0dGUgZWluIFNjaGx1ZXNzZWx3b3J0IGVpbmdlYmVuLCB+aCBmdWVyIEhpbGZlLgorXWFydAorQml0dGUgZGllIEtlbm56aWZmZXIgZnVlciBkYXMgR2VzY2hsZWNodCBlaW5nZWJlbgorXW1hZW5ubGljaDogMSAgICAgIHdlaWJsaWNoOiAyICAgICAgIHNhZWNobGljaDogMAorXTAKKworLyBOdW4gaXN0IG1pdCBzYWVjaGxpY2ggYXVjaCBkYXMgcmljaHRpZ2UgR2VzY2hsZWNodCBnZXNldHp0LgorLyBOdW4sIHNvIGVpbiBTY2h3ZXJ0IHNvbGwgYXVjaCBldHdhcyB3aWVnZW4sIGFsc28gZ2lidCBXdXJzdCBub2NoIGVpbgorLyBHZXdpY2h0IG1pdCBhbjoKK0JpdHRlIGVpbiBTY2hsdWVzc2Vsd29ydCBlaW5nZWJlbiwgfmggZnVlciBIaWxmZS4KK11nZXdpY2h0CitCaXR0ZSBkYXMgR2V3aWNodCBpbiBHcmFtbSBlaW5nZWJlbiAoTWluaW11bSAxMDApCitdNTAwMAorCisvIG51biBtb2VjaHRlIHNpY2ggV3Vyc3Qgbm9jaCB2ZXJnZXdpc3Nlcm4sIGRhc3MgaWhyIFBsYW4gZ3V0IHZvcmJlcmVpdGV0CisvIGlzdC4gRGFoZXIgbGFlc3N0IHNpZSBzaWNoIG1pdCAnfnInIG5vY2htYWwgZWluZW4gVWViZXJibGljayB1ZWJlciBkYXMKKy8gU2Nod2VydCBnZWJlbjoKKworQml0dGUgZWluIFNjaGx1ZXNzZWx3b3J0IGVpbmdlYmVuOgorXX5yCitJRHM6CiswIGJsdXRzYXVnZXJzY2h3ZXJ0CisxIHNjaHdlcnQKK0t1cnpiZXNjaHJlaWJ1bmc6CitFaW4gQmx1dHNhdWdlcnNjaHdlcnQgKGdlenVlY2t0KQorTmFtZToKK0JsdXRzYXVnZXJzY2h3ZXJ0CitHZXdpY2h0OiA1MDAwIEdyYW1tCitHZXNjaGxlY2h0OiBzYWVjaGxpY2gKK0F1c2Z1ZWhybGljaGUgQmVzY2hyZWlidW5nOgorRGllcyBpc3QgZGFzIFNjaHdlcnQgZWluZXMgZWluc3QgbWFlY2h0aWdlbiBWYW1waXJzLiBOdW4gaXN0IGVzIGplZG9jaAord2VydGxvcyBnZXdvcmRlbiwgZGFzcyBzaWNoIGplZGVyIFNlaGVyIGVzIG1pdCBzZWluZW0gbWFnaXNjaGVuIEJldXRlbAora2xvbmVuIGthbm4uCitEZXRhaWxzOgorMDogc2NoYWZ0OgorRGllc2VyIFNjaGFmdCBpc3Qgdm9uIHB1cmVyIE1hZ2llLiBXZXIgZGFzIFNjaHdlcnQgYmVzaXR6dCwgenVlY2t0IGVzCithdXRvbWF0aXNjaC4KK10KKworLyBXdXJzdCBpc3QgenVmcmllZGVuLCB1bmQgbW9lY2h0ZSBudW4gZGllICdBa3Rpb24gQlNTIGZ1ZXIgYWxsZScgYmVnaW5uZW4sCisvIHVuZCBiZW51dHp0IGRlbiBCZWZlaGwgJ3N0YXJ0JywgdW0gZGFzIFNjaHdlcnQgZW5kZ3VlbHRpZyB6dSBlcnpldWdlbi4KKy8gQWxsZXJkaW5ncyBhY2h0ZXQgc2llIGRhYmVpIGRhcmF1ZiwgbmljaHQgaW0gc2VsYmVuIFJhdW0gd2llIGlociBPcGZlciB6dQorLyBzdGVoZW4sIGRlbm4gZGllIFVtc3RlaGVuZGVuIGVyaGFsdGVuIGJlaW0gRXJ6ZXVnZW4gZGVzIE9iamVrdGVzIGRpZQorLyBNZWxkdW5nOgorCis+IFd1cnN0IGRlbmt0IHNjaGFyZiBuYWNoIHVuZCB6aWVodCBkYW5uIGV0d2FzIGF1cyBkZW0gbWFnaXNjaGVuIEJldXRlbAorCisvIEFsbGVzIGtsYXIsIGRhcyBPYmpla3Qga2FubiBlcnNjaGFmZmVuIHdlcmRlbjoKKworXXN0YXJ0CitEdSBoYXN0IGVpbiBuZXVlcyBPYmpla3QgZ2VzY2hhZmZlbi4gRXMgaXN0OgorQmx1dHNhdWdlcnNjaHdlcnQKK0JpdHRlIGVpbiBTY2hsdWVzc2Vsd29ydCBlaW5nZWJlbiwgfmggZnVlciBIaWxmZS4KK10KKworLyBkdW1tZXJ3ZWlzZSBibGVpYnQgbWFuIG5hY2ggZGVtIEVyc2NoYWZmZW4gZWluZXMgT2JqZWt0ZXMgaW1tZXIgaW0gZWRpdG9yCisvIGRlcyBCZXV0ZWxzIGRyaW4uIEFiYnJlY2hlbiBtdXNzIG1hbiBhbHNvIG1pdCAnKionLCB3YXMgenUgZWluZXIgZXR3YXMKKy8gdmVyd2lycmVuZGVuIE1lbGR1bmcgZnVlaHJ0OgorCitdQml0dGUgZWluIFNjaGx1ZXNzZWx3b3J0IGVpbmdlYmVuLCB+aCBmdWVyIEhpbGZlLgorXSoqCitCZXNjaHJlaWJ1bmcgaXN0IGFiZ2Vicm9jaGVuLiBEaWUgV2VydGUgd3VyZGVuIGJlaWJlaGFsdGVuLgorPgorLyBXdXJzdCBoYWV0dGUgYXVjaCBvaG5lICdzdGFydCcgZWluenVnZWJlbiBkZW4gQmV1dGVsLWVkaXRvciB2ZXJsYXNzZW4KKy8ga29lbm5lbjsgc29mZXJuIG1hbiBkaWVzIG1pdCAnKionICh1bmQgbmljaHQgbWl0ICd+cScgdHV0IGthbm4gbWFuIG5hZW1saWNoCisvIG1pdCAnYmVhcmJlaXRlJyB3aWVkZXIgaW4gZGVuIEJldXRlbC1lZGl0b3IgaGluZWluZ2VoZW4sIHVuZCB1ZWJlcm5pbW10CisvZGFiZWkgZGllIGFsdGVuCisvIFdlcnRlLgorCisvIERhc3MgZGllIFdlcnRlIGJlaWJlaGFsdGVuIHd1cmRlbiwgaGF0IGF1Y2ggZWluZSBBdXN3aXJrdW5nIGRhcmF1ZiwgZGFzcworZGFzIGVyc2NoYWZmZW5lCisvIE9iamVrdCBhYmdlc3BlaWNoZXJ0IHdlcmRlbiBrYW5uLCB1bSBlcyBzcGFldGVyIG5vY2htYWwgenUgbGFkZW4uIERpZXMKK21vZWNodGUgV3Vyc3QKKy8gbmF0dWVybGljaCBnZXJuZSBtYWNoZW4sIGRhIHNpZSB6dSBmYXVsIGlzdCwgZGVuIGdhbnplbiBLcmFtIG5vY2htYWwgenUKK3RpcHBlbiAodW5kIHdlaWwKKy8gV3Vyc3QgamEgRElSIGFsbGUgRnVua3Rpb25lbiBkZXMgQmV1dGVscyB6ZWlnZW4gc29sbDspKSAtIGF1c3NlcmRlbSBpc3RzCityZWNodCBlaW5mYWNoIC0gbWl0CisvIGRlbSBCZWZlaGwgJ2VyaGFsdGUgKG5yLiknIGthbm4KKworPiBlcmhhbHRlIDEKKz4gRGFzIE9iamVrdCB3dXJkZSBhdWYgUGxhdHogMSBhYmdlc3BlaWNoZXJ0LgorCisvIHVtIHNpY2hlcnp1Z2VoZW4gc2NoYXV0IFd1cnN0IG5vY2htYWwgbWl0ICdzcGVpY2hlcnBsYWV0emUnIG5hY2gsIG9iIGRpZQorU3BlaWNoZXJ1bmcKKy8gZ2VrbGFwcHQgaGF0CisKKz5zcGVpY2hlcnBsYWV0emUKK1NwZWljaGVycGxhdHogMDogTmljaHQgYmVsZWd0LgorU3BlaWNoZXJwbGF0eiAxOiBFaW4gQmx1dHNhdWdlcnNjaHdlcnQgKGdlenVlY2t0KS4KK1NwZWljaGVycGxhdHogMjogTmljaHQgYmVsZWd0LgorU3BlaWNoZXJwbGF0eiAzOiBOaWNodCBiZWxlZ3QuCisoLi4uKQorCisvIG9mZmVuc2ljaHRsaWNoIGhhdCBlcyBmdW5rdGlvbmllcnQsIFNwZWljaGVycGxhdHogMSB3dXJkZSBiZWxlZ3QsIG1hbiBzaWVodAorZGllIEt1cnpiZS0KKy8gc2NocmVpYnVuZyBkZXMgT2JqZWt0ZXMuCisKKy0tLS0tLS0tLQorCisvIFdvY2hlbiBzcGFldGVyLiBXdXJzdCBtb2VjaHRlIGRhcyBnZXNwZWljaGVydGUgU2Nod2VydCBsYWRlbiwgdW0gZXMgbmV1IHp1CitlcnpldWdlbi4KKy8gZGF6dSBiZW51dHp0IHNpZSBkZW4gQmVmZWhsICdsYWRlIChuci4pJworCis+IGxhZGUgMQorPiBPYmpla3Qgdm9uIFNwZWljaGVycGxhdHogTnIuMSB3dXJkZSBnZWxhZGVuLgorCisvIERhcyByZWljaHQgYWxsZXJkaW5ncyBub2NoIG5pY2h0LiBKZXR6dCBzaW5kIG5hZW1saWNoIG51ciBkaWUgV2VydGUgaW0KK0JldXRlbCBnZWxhZGVuLCBhYmVyCisvIGRhcyBPYmpla3Qgbm9jaCBuaWNodCBlcnNjaGFmZmVuLiBEYWhlciBmb2xndCB6dW5hZWNoc3QgZGVyIEJlZmVobAorYmVhcmJlaXRlIChuaWNodAorLyAnZXJzY2hhZmZlJywgd2VpbCBkaWVzZXIgZGllIGV2dGwuIG5vY2ggdm9yaGFuZGVuZW4gV2VydGUgaW0gQmV1dGVsCitsb2VzY2h0ISkKKworPiBiZWFyYmVpdGUKK0JpdHRlIGVpbiBTY2hsdWVzc2Vsd29ydCBlaW5nZWJlbjoKK10KKworLyBhbiBkaWVzZXIgU3RlbGxlIGthbm4gV3Vyc3QgbnVuIGRhcyBhbHRlIEJsdXRzYXVnZXJzY2h3ZXJ0IGdlbmF1c28KK2JlYXJiZWl0ZW4gd2llIHZvcmhlciAtCisvIG5hdHVlcmxpY2gga2FubiBzaWUgZGllIHZvcmhhbmRlbmVuIERhdGVuIHVlYmVybmVobWVuLCBhYmVyIGF1Y2ggYWVuZGVybgorKHdhcyBkdXJjaAorLyBlaW5mYWNoZXMgbmV1IGVpbmdlYmVuIGdlc2NoaWVodCkuIFdlbm4gc2llIGRhcyBTY2h3ZXJ0IG5pY2h0IHdlaXRlcgorYmVhcmJlaXRlbiBtb2VjaHRlCisvIGthbm4gc2llIG51biBlaW5mYWNoICdzdGFydCcgZWluZ2ViZW4sIHVuZCBkZW4gZWRpdG9yIHZlcmxhc3Nlbi4KKy8gU28sIHVuZCB6dSBndXRlciBMZXR6dDogU29mZXJuIFd1cnN0IGRhcyB2ZXJhZXBwZWxuIHZvbiBBbmZhZW5nZXJuIGdlbnVnCitpc3QsIGthbm4gc2llIGRlbgorLyBTcGVpY2hlcnBsYXR6IGZ1ZXIgZGFzIFNjaHdlcnQgbmF0dWVybGljaCBhdWNoIGZyZWltYWNoZW4sIGRpZXMgZ2VzY2hpZWh0CitlaW5mYWNoIGR1cmNoIGRlbgorLyBCZWZlaGwgJ2VudGZlcm5lIChuci4pJworCitTbywgZGFzIHdhcnMhIEVpbmUgTWVuZ2UgVGV4dCBmdWVyIGVpbiBlaWdlbnRsaWNoIGJyYXVjaGJhcmVzIFNlaGVydG9vbCwgd2VubgorbWFuIG51ciB3dWVzc3RlLCB3aWUgZXMgZnVua3Rpb25pZXJ0IDspKQorCisKKworCmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL2ZhcS9hbnNpY2h0ZW4gYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL2ZhcS9hbnNpY2h0ZW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM1Y2E5NwotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvZmFxL2Fuc2ljaHRlbgpAQCAtMCwwICsxLDQgQEAKK0ZvbGdlbmRlIFJhZXVtZSBzaW5kIGJlcmVpdHMgYXVmIGRlciBTZWhlcmluc2VsIG1pdCBsYW5nYmVzY2hyZWlidW5nZW4KK3ZlcnNlaGVuOgorKEtvb3JkaW5hdGVuIHZlcnQuL2hvcml6Liwgd2llIGluIGRlciBLdXJ6YmVzY2hyZWlidW5nIGF1ZiBkZXIgSW5zZWwpCisxLDE6IFdvbHBpZS1SYXVtIDooCmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL2ZhcS9mYXEubyBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvZmFxL2ZhcS5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYzllZmIKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL2ZhcS9mYXEubwpAQCAtMCwwICsxLDMgQEAKKyMwOjAKK3Byb3BlcnRpZXMgKFs6Ml0pCitzeW5vbnltIChbImxldmVsIjoiNCIsIm1haWwiOiI1IiwiZmluZ2VyIjoiMTEiLCJxdWVzdHMiOiIyIiwiZWNobyI6IjEyIiwiZmVobGVybWVsZHVuZyI6IjkiLCJzZWhlciI6IjE4IiwicmVtb3RlIjoiMTIiLCJzZXRtaW4iOiI4IiwidGl0ZWwiOiI4IiwiZmx1Y2h0cmljaHR1bmciOiIzIiwiemVpdHVuZyI6IjkiLCJoYXVzIjoiMTQiLCJzZWhlcm5hbWVuIjoiMTgiLCJrdWdlbCI6IjYiLCJwZWdhc3VzIjoiMiIsInBvcnRhbGUiOiIxIiwicXVlc3QiOiIyIiwibG9va3MiOiI4IiwibmFtZW4iOiIxOCIsImJldXRlbCI6IjEzIiwibGFkZW4iOiI3IiwiMTYiOiJrYXJ0ZSIsImFkcmVzc2VudmVyemVpY2huaXMiOiIxNiIsIm5ldWlna2VpdGVuIjoiMCIsImZhcSI6ImluaGFsdCIsIm1hZ2lzY2hlIGt1Z2VsIjoiNiIsImhhZXVzZXIiOiIxNCIsImFkcmVzc2VuIjoiMTYiLCJzZWhlcmxhZGVuIjoiNyIsInJvZWhyY2hlbiI6IjEwIiwia2FuYWVsZSI6IjkiLCJtYWdpc2NoZSI6IjYiLCJzZWhlcnF1ZXN0cyI6IjIiLCJzcGllbHBsYXR6IjoiMTUiLCJsZXZlbHMiOiI0Iiwic2VoZXJxdWVzdCI6IjIiLCJwYXJhbGxlbGRpbWVuc2lvbiI6IjEwIiwiMTkiOiJrYXJ0ZSIsInItZW1vdGUiOiIxMiIsInNlaGVybGV2ZWwiOiI0Iiwic2VoZXJoYWV1c2VyIjoiMTQiLCJhbm1lcmt1bmciOiIxNSIsImZpbmdlci1iZWZlaGwiOiIxMSIsInNlaGVybGV2ZWxzIjoiNCIsInVlYmVyc2ljaHRza2FydGUiOiJrYXJ0ZSIsInNlaGVycG9ydGFsZSI6IjEiLCJkZXNpZ25lciI6IjgiLCJzZWhlcnNwaWVscGxhdHoiOiIxNSIsInNlaGVyaGF1cyI6IjE0Iiwic2VoZXJmYXEiOiJpbmhhbHQiLCJkZXNpZ25lci1zZWhlciI6IjgiLCJkZXNpZ24iOiI4Iiwia29tbXVuaWthdGlvbiI6IjUiLCJ0cmFuc3BvcnRtb2VnbGljaGtlaXRlbiI6IjEiLF0pCmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL2ZhcS9maWxlcyBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvZmFxL2ZpbGVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMTNiN2IKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL2ZhcS9maWxlcwpAQCAtMCwwICsxLDI4IEBACisKK2ZpbGVzIHNlaGVyZmFxOiBhbGxlICtQYXRoID0gLy4uL21vcmdlbmcvc2VoZXIvZmFxL2ZhcTItMAorCisKKworMC4gTmV1aWdrZWl0ZW46IG5ld3MudHh0CisKKzEuIFRyYW5zcG9ydG1vZWdsaWNoa2VpdGVuOiBpbmhhbHQudHh0CisKKzIuIFNlaGVycXVlc3RzOiBxdWVzdC50eHQKKzMuIEZsdWNodHJpY2h0dW5nOiBmbHVjaHQudHh0Cis0LiBzZWhlcmxldmVsOiBsZXZlbC50eHQKKzU6IEtvbW11bmlrYXRpb246IGtvbW11bi50eHQKKzY6IG1hZ2lzY2hlIGt1Z2VsOiBrdWdlbC50eHQKKzc6IFNlaGVybGFkZW46IHNsYWRlbi50eHQKKzg6IGRlc2lnbmVyLXNlaGVyOiBsb29rcy50eHQKKzk6IGZlaGxlcm1lbGR1bmc6IGVycm1lcy50eHQKKzEwOiBwYXJhbGxlbGRpbWVuc2lvbi50eHQ6IHBhcmEudHh0CisxMTogZmluZ2VyLWJlZmVobDogZmluZ2VyLnR4dAorMTI6IGVjaG8sIHItZW1vdGU6IGVjaG8udHh0CisxMzogbWFnaXNjaGVyIGJldXRlbDogYmV1dGVsLnR4dAorYW5sZWl0dW5nIG1hZ2lzY2hlciBiZXV0ZWw6IGFubGVpdC50eHQKKzE0OiBzZWhlcmhhZXVzZXI6IGhhZXVzZXIudHh0CisxNTogU2VoZXJzcGllbHBsYXR6OiBzcGxhdHoudHh0CisxNjogdWViZXJzaWNodHNrYXJ0ZSBzcGllbHBsYXR6OiBzbWFwLnR4dAorMTg6IGFsbGUgc2VoZXIgaW0gbWc6IHNhbGxlLnR4dAorMTkgenVzYW1tZW5mYXNzdW5nICYgbmFjaHdvcnQ6IHp1c2FtbS50eHQKK2ZpbGVzOiBmaWxlcy50eHQKZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvZmFxL2luaGFsdCBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvZmFxL2luaGFsdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzEwNWRlCi0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9mYXEvaW5oYWx0CkBAIC0wLDAgKzEsMjYgQEAKKworSW5oYWx0IGRlciBTZWhlckZBUSAyLjA6CisKKyAgIDAuIE5ldWlna2VpdGVuICAgICAgICAgICAgICAgICAgICAxMC4gUGFyYWxsZWxkaW1lbnNpb24KKyAgIDEuIFRyYW5zcG9ydG1vZWdsaWNoa2VpdGVuICAgICAgICAxMS4gRmluZ2VyLUJlZmVobAorICAgMi4gU2VoZXJxdWVzdHMgICAgICAgICAgICAgICAgICAgIDEyLiBFY2hvLCByLWVtb3RlCisgICAzLiBGbHVjaHRyaWNodHVuZyAgICAgICAgICAgICAgICAgMTMuIE1hZ2lzY2hlciBCZXV0ZWwKKyAgIDQuIFNlaGVybGV2ZWwgICAgICAgICAgICAgICAgICAgICAxNC4gU2VoZXJoYWV1c2VyCisgICA1LiBLb21tdW5pa2F0aW9uICAgICAgICAgICAgICAgICAgMTUuIFNlaGVyc3BpZWxwbGF0egorICAgNi4gTWFnaXNjaGUgS3VnZWwgICAgICAgICAgICAgICAgIDE2LiBVZWJlcnNpY2h0c2thcnRlIFNlaGVyc3BpZWxwbGF0egorICAgNy4gU2VoZXJsYWRlbiAgICAgICAgICAgICAgICAgICAgIDE3LgorICAgOC4gRGVzaWduZXItU2VoZXIgICAgICAgICAgICAgICAgIDE4LiBBbGxlIFNlaGVyIGltIE1HCisgICA5LiBGZWhsZXJtZWxkdW5nICAgICAgICAgICAgICAgICAgMTkuIFp1c2FtbWVuZmFzc3VuZyAmIE5hY2h3b3J0CisKK1VtIGRpZSBlbnRzcHJlY2hlbmRlbiBJbmhhbHRlIHp1IGxlc2VuLCBnaWIgYml0dGUgPmxpZXMgMjwgb2RlcgorPmxpZXMgc2VoZXJxdWVzdHM8IGVpbi4KK1p1IGRpZXNlciBTZWl0ZSBrb21tc3QgZHUgbWl0ID5saWVzIGluaGFsdDwgenVydWVjayEKKworTm9jaCBlaW5lIEFubWVya3VuZzogV2VubiBEdSBlaW5lIElkZWUgaGFzdCwgd2FzIGFuIGRlciBGQVEgdmVyYmVzc2VydCwKK2dlYWVuZGVydCBvZGVyIGhpbnp1Z2VmdWVndCB3ZXJkZW4gc29sbHRlLCBkYW5uIHdhZXJlIGljaCBEaXIgc2VociBkYW5rYmFyLAord2VubiBEdSBtaXIgZWluZSBrdXJ6ZSBtYWlsIHNjaGlja2VuIHd1ZXJkZXN0LCBvZGVyIG1pdCBkZW0gQmVmZWhsICdpZGVlJyBpbgorZGllc2VtIFJhdW0gYWJzZXR6ZW4gd3VlcmRlc3QgISEhCisKK1JZTkUKKworCmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL2ZhcS9rYXJ0ZSBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvZmFxL2thcnRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNWU1ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL2ZhcS9rYXJ0ZQpAQCAtMCwwICsxLDYzIEBACisgICAgICAgIFNFSEVSU1BJRUxQTEFUWjogVUVCRVJTSUNIVFNLQVJURQorICAgICAgICAoU3RhbmQ6IDIwLjEuOTUpCisgIDEgIDIgIDMgIDQgIDUgIDYgIDcgIDggIDkgIDEwIDExIDEyIDEzIDE0IDE1IDE2IDE3IDE4IDE5IDIwCisKKyAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWC0tWC0tWC0tWC0tWC0tWCAgWC0tWCAgWCAgWCAgWC0tWCAgWCAgICAxCisgICBcLyBcICAgICAgICAgICAgICAgLyAgIHxcICAgICAgICAgICBcIHwgICAgIHwgIHwgIHwgICAgLworICAgL1wgIFwgICAgICAgICAgICAgLyAgICB8IFwgICAgICAgICAgIFx8ICAgICB8ICB8ICB8ICAgLworICBYICBYLS1YICBYICBYICBYLS1YICBYICBYICBYICBYICBYICBYICBYLS1YLS1YLS1YLS1YICBYLS1YICAgIDIKKyAgfCAgICAgIFwgICAgICAvICAgICAgfCAgfCAgICAgICAgICAgICAgICAvICAgICAgICAgIFwgICAvCisgIHwgICAgICAgXCAgICAvICAgICAgIHwgIHwgICAgICAgICAgICAgICAvICAgICAgICAgICAgXCAvCisgIFggIFggIFggIFgtLVggIFggIFggIFggIFggIFggIFggIFggIFggIFggIFggIFggIFggIFggIFggIFggICAgMworICAgXCAgICAgICB8ICAgXCAgXCAgIC8gIC8gIC8gICAgICAgICAgICB8ICAgICAgICAgICAgICB8CisgICAgXCAgICAgIHwgICAgXCAgXCAvICAvICAvICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwKKyAgWCAgWCAgWC0tWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgICA0CisgICAgICBcLyAgICBcICAgICBcLyAgIHwgIHwgLyAgICAgICAgICAgLyAgICAgICAgICAgICAgIHwKKyAgICAgIC9cICAgICBcICAgIC9cICAgfCAgfC8gICAgICAgICAgIC8gICAgICAgICAgICAgICAgfAorICBYICBYICBYICBYICBYLS1YICBYICBYICBYICBYLS1YICBYICBYICBYICBYICBYICBYICBYICBYICBYICAgIDUKKyAgICAgfFwvIFwvIFwgICAgICAgIFwgfCAgfCAvICAgICAgICAgfCAgICAgICAgICAgICAgICAgfAorICAgICB8L1wgL1wgIFwgICAgICAgIFx8ICB8LyAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8CisgIFggIFggIFggIFggIFgtLVgtLVgtLVggIFggIFggIFggIFggIFggIFggIFggIFggIFggIFggIFggIFggICAgNgorICAgICAgICAgIC8gXCAgIC8gICAgICAgIC8gIC8gICAgICAgICAgXCAgICAgICAgICAgICAgIC98CisgICAgICAgICAvICAgXCAvICAgICAgICAvICAvICAgICAgICAgICAgXCAgICAgICAgICAgICAvIHwKKyAgWCAgWCAgWCAgWC0tWC0tWC0tWC0tWC0tWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgICA3CisgICAgICAgICAgLyAgICAgICAgIHxcICBcICBcLyAgICAgICAgICAgICBcICAgICAgICAgIHwKKyAgICAgICAgIC8gICAgICAgICAgfCBcICBcIC9cICAgICAgICAgICAgICBcICAgICAgICAgfAorICBYICBYICBYICBYICBYICBYICBYICBYICBYICBYICBYICBYICBYICBYICBYLS1YLS1YLS1YICBYICBYICAgIDgKKyAgICAgICAgfCAgfCAgfCAgfCAvIFwgICAgIFwKKyAgICAgICAgfCAgfCAgfCAgfC8gICBcICAgICBcCisgIFggIFggIFgtLVggIFgtLVggIFgtLVgtLVggIFggIFggIFggIFggIFggIFggIFggIFggIFggIFggIFggICAgOQorICAgICB8XCB8IC98ICAgIC98ICAgICB8CisgICAgIHwgXHwvIHwgICAvIHwgICAgIHwKKyAgWCAgWCAgWCAgWCAgWCAgWCAgWC0tWC0tWC0tWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgICAxMAorCisKKyAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgICAxMQorCisKKyAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgICAxMgorCisKKyAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgICAxMworCisKKyAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgICAxNAorCisKKyAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgICAxNQorCisKKyAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgICAxNgorCisKKyAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgICAxNworCisKKyAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgICAxOAorCisKKyAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgICAxOQorCisKKyAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgWCAgICAyMAorCmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL2ZhcS9zZWhlcmZhcSBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvZmFxL3NlaGVyZmFxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ODg5NTkKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL2ZhcS9zZWhlcmZhcQpAQCAtMCwwICsxLDE2IEBACisKKworSGFsbG8hCitIaWVyIGFsc28gc2llaHN0IER1IGRpZSBha3R1ZWxsZSBWZXJzaW9uIHZvbiBSeW5lcyBTZWhlckZBUS4KK1dlbm4gRHUgd2VpdGVyZSBGcmFnZW4gb2RlciBBbnJlZ3VuZ2VuIHp1IGRpZXNlciBGQVEgaGFzdCwKK3NlIHNvIG5ldHQgdW5kIHNjaGlja2UgbWlyIGVpbiBrdXJ6ZXMgbWFpbC4KK1ZpZWwgU3Bhc3MgYmVpbSBMZXNlbiAhISEKKworWnVyIEZBUSBrb21tc3QgRHUgbWl0ID5saWVzIEluaGFsdDwKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9yai5jIGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9yai5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZjNiOTgKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL3JqLmMKQEAgLTAsMCArMSwyNiBAQAoraW5oZXJpdCAiL3N0ZC90aGluZyI7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSAiLi4vaGF1cy5oIgorCitjcmVhdGUoKQoreworICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuOworICA6OmNyZWF0ZSgpOworCisgIFNldFByb3AoUF9TSE9SVCwwKTsKKyAgU2V0UHJvcChQX05PR0VULCAxKTsKKyAgQWRkSWQoInImaiIpOworICBBZGRDbWQoImxpZXMiLCAibGllcyIpOworfQorCitzdGF0aWMgaW50IGxpZXMoc3RyaW5nIHN0cikKK3sKKyAgaW50IG5yOworCisgIGlmICghc3RyIHx8IHNzY2FuZihzdHIsICJzZWl0ZSAlZCIsIG5yKSAhPSAxKQorICAgIHJldHVybiBub3RpZnlfZmFpbCgiU3ludGF4OiBsaWVzIHNlaXRlIDxucj5cbiIpLCAwOworCisgIHRoaXNfcGxheWVyKCktPk1vcmUoU1BFQ0lBTFBBVEgrInJvbV9qdWwvc2VpdGUiK25yLCAxKTsKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL3JvbV9qdWwvc2VpdGUxIGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9yb21fanVsL3NlaXRlMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Yjg3MGRjCi0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9yb21fanVsL3NlaXRlMQpAQCAtMCwwICsxLDQyIEBACitEaWVzZXIgVGV4dCBpc3Qgdm9uIEV0YWlucyBTcGllbGVyaW4gKExpc3NpIFBhZmZyYXRoKSBnZXNjaHJpZWJlbiB1bmQKK3NhZW10bGljaGUgUmVjaHRlLCBpbnNiZXNvbmRlcmUgZGllIGRlciBWZXJicmVpdHVuZyB1bmQgVmVybWFya3R1bmcsIGxpZWdlbgorYXVzc2NobGllc3NsaWNoIGJlaSBpaHIuCitBbm1lcmt1bmdlbiB1bmQga29uc3RydWt0aXZlIEtyaXRpayBiaXR0ZSBwZXIgbXVkbWFpbCBhbiBFdGFpbiBvZGVyIFNudWdnbGUuCitWaWVsIFNwYXNzIGJlaW0gTGVzZW4gd3VlbnNjaGVuIFNudWdnbGUgdW5kIEV0YWluLgorCitVbmQgaGllciBub2NoIGVpbmUgVWViZXJzaWNodCB1ZWJlciBkZW4gSW5oYWx0OgorCitTZWl0ZSAyOiAgUHJvbG9nCisKK1NlaXRlIDM6ICBFcnN0ZXIgQWt0LCBlcnN0ZSBTemVuZQorU2VpdGUgNDogIEVyc3RlciBBa3QsIHp3ZWl0ZSBTemVuZQorU2VpdGUgNTogIEVyc3RlciBBa3QsIGRyaXR0ZSBTemVuZQorU2VpdGUgNjogIEVyc3RlciBBa3QsIHZpZXJ0ZSBTemVuZQorU2VpdGUgNzogIEVyc3RlciBBa3QsIGZ1ZW5mdGUgU3plbmUKKworU2VpdGUgODogIFp3ZWl0ZXIgQWt0LCBFaW5sZWl0dW5nCitTZWl0ZSA5OiAgWndlaXRlciBBa3QsIGVyc3RlIFN6ZW5lCitTZWl0ZSAxMDogWndlaXRlciBBa3QsIHp3ZWl0ZSBTemVuZQorU2VpdGUgMTE6IFp3ZWl0ZXIgQWt0LCBkcml0dGUgU3plbmUKK1NlaXRlIDEyOiBad2VpdGVyIEFrdCwgdmllcnRlIFN6ZW5lCitTZWl0ZSAxMzogWndlaXRlciBBa3QsIGZ1ZW5mdGUgU3plbmUKK1NlaXRlIDE0OiBad2VpdGVyIEFrdCwgc2VjaHN0ZSBTemVuZQorCitTZWl0ZSAxNTogRHJpdHRlciBBa3QsIGVyc3RlIFN6ZW5lCitTZWl0ZSAxNjogRHJpdHRlciBBa3QsIHp3ZWl0ZSBTemVuZQorU2VpdGUgMTc6IERyaXR0ZXIgQWt0LCBkcml0dGUgU3plbmUKK1NlaXRlIDE4OiBEcml0dGVyIEFrdCwgdmllcnRlIFN6ZW5lCitTZWl0ZSAxOTogRHJpdHRlciBBa3QsIGZ1ZW5mdGUgU3plbmUKKworU2VpdGUgMjA6IFZpZXJ0ZXIgQWt0LCBlcnN0ZSBTemVuZQorU2VpdGUgMjE6IFZpZXJ0ZXIgQWt0LCB6d2VpdGUgU3plbmUKK1NlaXRlIDIyOiBWaWVydGVyIEFrdCwgZHJpdHRlIFN6ZW5lCitTZWl0ZSAyMzogVmllcnRlciBBa3QsIHZpZXJ0ZSBTemVuZQorU2VpdGUgMjQ6IFZpZXJ0ZXIgQWt0LCBmdWVuZnRlIFN6ZW5lCisKK1NlaXRlIDI1OiBGdWVuZnRlciBBa3QsIGVyc3RlIFN6ZW5lCitTZWl0ZSAyNjogRnVlbmZ0ZXIgQWt0LCB6d2VpdGUgU3plbmUKK1NlaXRlIDI3OiBGdWVuZnRlciBBa3QsIGRyaXR0ZSBTemVuZQorCitTZWl0ZSAyODogRXBpbG9nCisKZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvcm9tX2p1bC9zZWl0ZTEwIGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9yb21fanVsL3NlaXRlMTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU0ZjUxZAotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvcm9tX2p1bC9zZWl0ZTEwCkBAIC0wLDAgKzEsMzgxIEBACitERVIgWldFSVRFIEFLVAorCSAgRElFIFpXRUlURSBTWkVORQorCitBenp1cm8sICBkZXIgIG5pY2h0ICBHZWZhaHIgIGxhdWZlbiAgIHdvbGx0ZSwJc3RlbGx2ZXJ0cmV0ZW5kICAgZnVlcgkgZWluZW4KK01lbnNjaGVubWFubiB2b24gZGVuIGJlaWRlbiBGcmF1ZW4gemVycmlzc2VuIHp1IHdlcmRlbiwgbGllc3Mgc2ljaCAgYXVmICBlaW5lbQorQXN0IG5lYmVuIFJvbWVvcyBTY2h1bHRlciBuaWVkZXIuIEVyIGJldHJhY2h0ZXRlIGRlbiBKdW5nZW4gbWl0ICBlaW5lbQlCbGljaywKK2RlciBiZWkgTWVuc2NoZW4gaW1tZXIgZXJzdGF1bnRlICBBdXNydWZlICBwcm92b3ppZXJ0LAlkaWUgIHp1bWVpc3QgIG51ciAgZGllCit1bmVydHJhZWdsaWNoZSBBcnJvZ2FueiAgZGVyICBNZW5zY2hlbglrdW5kdHVuOiAgX1NpZWh0XyAgX2VyXyAgX25pY2h0XyAgRkFTVAorX2ludGVsbGlnZW50XyBfYXVzXz8KKworUm9tZW8gaGF0dGUga2VpbmVuIEJsaWNrIGZ1ZXIgQXp6dXJvIHVlYnJpZywgZGVubiAgSnVsaWEgIGJldHJhdCAgZGVuICBCYWxrb24uCitPZmZlbnNpY2h0bGljaCBoYXR0ZSBzaWUgbm9jaCBlaW4gd2VuaWcgTHVmdCBzY2huYXBwZW4gd29sbGVuLAliZXZvciAgc2llICB6dQorQmV0dCBnaW5nLCBkZW5uIHNpZSB0cnVnIG5pY2h0IG1laHIgYWxzIGVpbiBOYWNodGhlbWQsCWVpbmVuICBTY2hhbCAgdW5kICBlaW4KK3BhYXIgVHJvcGZlbiBQYXJmdW0uCisKKyJTaWVoIHNpZSBkaXIgYW4uIiwgaGF1Y2h0ZSBSb21lbyBhdGVtbG9zLiAiSXN0IHNpZSBuaWNodCB3dW5kZXJzY2hvZW4/IgorCitBenp1cm8gdmVyemljaHRldGUgYXVmIGVpbmUgQW50d29ydCwgZGVubiBpaG0gd3VyZGUgYmV3dXNzdCwgIGRhc3MgIFJvbWVvICBpaG4KK25pY2h0IG5hY2ggc2VpbmVyIE1laW51bmcgZ2VmcmFndCBoYXR0ZS4KKworIkp1bGlhLi4uIiBFciBmbHVlc3RlcnRlIGlocmVuIE5hbWVuIG51ci4gIlNpZSBnZWh0IGF1ZiB3aWUgZWluZSAgU29ubmUsICBhbHNvCittdXNzIGRhIE9zdGVuIHNlaW4uIiwgbWVpbnRlIFJvbWVvIHVuZCBkZXV0ZXRlIGF1ZiBkZW4gQmFsa29uLgorCisiRXMgaXN0IE5vcmRlbiwgYWJlciBpY2ggdmVyc3RlaGUsIHdhcyBkdSBtZWluc3QuIiwgYnJ1bW10ZSBBenp1cm8uCisKKyJXZW5uIHNpZSBpaHJlbiBTY2hhbCBmYWxsZW4gbGFlc3N0LCBtdXNzIGRlciBNb25kIHVudGVyZ2VoZW4sIGRlbm4gZGFubiAga2FubgorZXIgc2ljaCBuaWNodCBtZWhyIGFtIEhpbW1lbCBoYWx0ZW4uIgorCisiVW5kIGVyIGthbm4gbmlzc3N0IG1laHIgYW4gc3NzaXNzcyBoYWx0ZW4uIiwga2ljaGVydGUgV2xhZC4KKworIkljaCBsaWViZSBzaWUgdW5kIGljaCB3dWVuc2NodGUsIHNpZSAgd3Vlc3N0ZSAgZXMuIiwgIG11cm1lbHRlICBSb21lby4gICJEYW5uCit3YWVyZW4gaWhyZSBBdWdlbiBTdGVybmUgYW0gSGltbWVsIHVuZCBpY2ggZWluLi4uIGVpbmUuLi4iIEVyICBibGlja3RlICBBenp1cm8KK2FuLiAiV2llIGhlaXNzdCBkZW5uIGRhcyBUaWVyLCBkYXMgaW0gRHVua2VsbiBqYWd0PyIKKworIkZsZWRlcm1hdXMuIiwgYW50d29ydGV0ZSBBenp1cm8uCisKKyJHZW5hdS4gSWNoIHdhZXJlIGRhbm4gbnVyIHp1IGdlcm5lIGVpbmUgc3BpdHpvaHJpZ2UsIGxlZGVyZmx1ZWdsaWdlLCAgaGFhcmlnZQordW5kIG11ZWNrZW5mcmVzc2VuZGUgRmxlZGVybWF1cy4iCisKK1dsYWQgcGZpZmYgc2NocmlsbCB1bmQgd3VldGVuZC4gIldlbm4gZXIgamV0c3NzdCBub2NoIHNzc3RpbmtlbmQgc3NzYWd0LCB3ZXJkZQoraXNzcyBpaG4gYmVpc3Nzc2VuISIKKworIkRhbm4gd3VlcmRlIGljaCBkaWUgTXVlY2tlbiBmcmVzc2VuLCBkaWUgc2llICBzdGVjaGVuICB3b2xsZW4sICBkZW5uICBuaWVtYW5kCithdXNzZXIgbWlyIGRhcmYgaW4gaWhyZSBOYWVoZSBrb21tZW4sIGF1Y2gga2VpbmUgTXVlY2tlLiBBY2gsIHdhcnVtICBzYWd0ICBzaWUKK2Rlbm4gbmljaHRzPyIKKworIlZpZWxsZWljaHQsIHdlaWwgc2llIG5pY2h0IHdlaXNzLCBkYXNzIGR1ICBoaWVyICBiaXN0ICB1bSAgc2llICB6dSAgaG9lcmVuPyIsCit2ZXJtdXRldGUgQXp6dXJvLgorCisiSmEsIGljaCBiaW4gYXVjaCB3aXJrbGljaCB6dSBkcmVpc3QsIG1pY2ggZWluZmFjaCBoaWVyICBpbiAgaWhyZW0gIEdhcnRlbiAgenUKK3ZlcnN0ZWNrZW4gdW5kIHNpZSBhbnp1c3RhcnJlbiB3aWUgZWluIFNwYW5uZXIuIgorCitKdWxpYSBzdHVldHp0ZSBpaHJlIEVsbGJvZ2VuIGF1ZiBkYXMgR2VsYWVuZGVyIGRlcyBCYWxrb25zIHVuZCBpaHIgR2VzaWNodCAgaW4KK2RpZSBIYWVuZGUuIERlciBTY2hhbCBrbGFmZnRlIGF1ZiB1bmQgZW50aHVlbGx0ZSBlaW5lIHVuemllbWxpY2hlIE1lbmdlICBpaHJlcworQXVzc2Nobml0dHMsIHdhcyBSb21lbyB6dSBlaW5lbSB3ZWl0ZXJlbiB0aWVmZW4gU2V1ZnplciB2ZXJhbmxhc3N0ZS4KKworIkljaCB3b2xsdGUsIGljaCB3YWVyZSBkaWVzZXIgU2NoYWwhIgorCitBenp1cm8sIGRlciBzaWNoIGltbWVyIG5vY2ggbmljaHQgIGVudHNjaGxpZXNzZW4gIGtvbm50ZSwgIHNlaW4gIFVydGVpbCAgdWViZXIKK0p1bGlhcyBGaWd1ciB6dSByZXZpZGllcmVuLCBsYWVjaGVsdGUgbWl0bGVpZGlnLiAiV2VubiBtYW4gc28gZXR3YXMgbWFnLiIKKworIkFjaCwgZHVtbWUgS3JhZWhlLCB3YXMgd2Vpc3N0IGR1IHNjaG9uIHZvbiBMaWViZSEiLCBzYWd0ZSAgUm9tZW8gIHpvcm5pZyAgdW5kCitkdWNrdGUgc2ljaCB2b3IgQXp6dXJvcyBzY2hhcmZlbSBTY2huYWJlbC4gIldlbm4gIHNpZSAgZG9jaCAgbnVyICBldHdhcyAgc2FnZW4KK3d1ZXJkZS4iCisKK0p1bGlhIHRhdCBpaG0gZGVuIEdlZmFsbGVuLiAiQWNoLCB3aWUgZHVtbSBkYXMgZG9jaCBhbGxlcyBpc3QuIgorCitWb3IgRnJldWRlIHVlYmVyIGlocmUgU3RpbW1lIGJlZ2FubmVuIFJvbWVvcyBIYWVuZGUgenUgeml0dGVybiB1bmQgZGVyCUluaGFsdAoraWhyZXIgV29ydGUgZ2luZyB6dW0gZWluZW4gT2hyIGhpbmVpbiB1bmQgenVtIGFuZGVyZW4gaGluYXVzLCBvaG5lICBkZW4gIFVtd2VnCit1ZWJlciBkYXMgR2VoaXJuIHp1IG5laG1lbiwgd2llIGVzIGJlaSBWZXJsaWVidGVuIGhhZXVmaWcgZGVyIEZhbGwgIGlzdC4gICJTYWcKK25vY2ggZXR3YXMsIG1laW5lIExpZWJzdGUsIGRhbm4gZmFsbGUgaWNoIGJlc3RpbW10IGluIE9obm1hY2h0LiIKKworQXp6dXJvIGdyaW5zdGUuICJWZXJrbmVpZiBkaXIgZGFzICBsaWViZXIsICBkZW5uICBkZXIgIExhZXJtICB3dWVyZGUgIGJlc3RpbW10CitBdWZtZXJrc2Fta2VpdCBlcnJlZ2VuLiIKKworSnVsaWEgc2FoIG5hY2hkZW5rbGljaCB6dSBVbG8gaGludWViZXIuICJPaCwgUm9tZW8uIgorCisiSWNoIGhlaXNzZSBVbG8sIGFiZXIgZGFzIG1hY2h0IG5pY2h0cy4iCisKKyJLb2VubnRlc3QgZHUgZWluZW4gIE1vbWVudCAgc28gIHR1biwgIGFscyAgc2Vpc3QgIGR1ICBSb21lbz8iLCAgZnJhZ3RlICBKdWxpYQoraG9lZmxpY2guCisKKyJTaWNoZXIsIHdlbm4gZHUgZGljaCBkYW5uIGJlc3NlciBmdWVobHN0LiIKKworIkRhbmtlLiBBY2gsIFJvbWVvLCBpY2ggd3VlbnNjaHRlLCBkdSB3YWVyZXN0IG5pY2h0IFJvbWVvLiIKKworIldhcnVtIGRhcyBkZW5uPyIsIGZyYWd0ZSBVbG8gdmVyd2lycnQuCisKKyJXZW5uIGR1IG5pY2h0IFJvbWVvIHdhZXJlc3QsIGRhbm4gd2FlcmVzdCBkdSBhdWNoICBrZWluICBNb250YWd1ZSwgIHVuZCAgZGFubgora29lbm50ZSBpY2ggZGljaCBsaWViZW4sIG9obmUgZGFzcyBtZWluIFZhdGVyICBlaW5lbiAgSGVyemFuZmFsbCAgYmVrb21tdCAgdW5kCittZWluZSBNdXR0ZXIgaWhyZSBNaWdyYWVuZS4iCisKK1VsbyBuaWNrdGUuICJIbSwgYWJlciB3ZXIgc29sbCBpY2ggZGVubiBkYW5uIHNlaW4/IgorCisiSXN0IGRvY2ggZWdhbC4gV2VubiBkdSBlaW4gQnVlcmdlcmxpY2hlciB3YWVyZXN0LCBkYW5uIHd1ZXJkZSBpY2ggIGF1ZmhvZXJlbiwKK0NhcHVsZXQgenUgc2Vpbi4gRGFubiBrb2VubnRlbiB3aXIgZWluZmFjaCBzbyAgenVzYW1tZW4gIHNlaW4gIHVuZCAgdW5zICBlaW5lbgorVGV1ZmVsIHVtIGRpZSBLb252ZW50aW9uZW4gc2NoZXJlbi4iCisKKyJVbmQgd2VubiBtZWluZSBPbWEgZ3JvZXNzZXIgZ2V3ZXNlbiB3YWVyZSwgZGFubiBoYWV0dGV0IGlociBzaWUgZWluZW4gRHJhY2hlbgorZ2VzY2hpbXBmdC4iLCB2ZXJzZXR6dGUgVWxvLiAiTmljaHQsICBkYXNzICBzaWUgIGRhcyAgbmljaHQgIGdld2VzZW4gIHdhZXJlLiIsCitmdWVndGUgc2llIHZlcnNjaGFlbXQgaGluenUuCisKKyJXYXMgbWVpbnN0IGR1LCBzb2xsIGljaCBpaHIgYW50d29ydGVuPyIsIGZyYWd0ZSBSb21lbyBsZWlzZS4KKworIldhcnRlIG5vY2ggZWluIGJpc3NjaGVuLiIsIHJpZXQgQXp6dXJvLgorCisiVmVyc3RlaHN0IGR1IGRlbm4gbmljaHQ/IERpZSBDYXB1bGV0cyBsaWVnZW4gbWl0IGRlbiBNb250YWd1ZXMgaW4gRmVoZGUsIGFiZXIKK1JvbWVvIGlzdCBSb21lbyBpc3QgUm9tZW8gaXN0IFJvbWVvLCBhdWNoLCB3ZW5uIGVyIG5pY2h0IFJvbWVvIE1vbnRhZ3VlIGlzdC4iCisKKyJOZWluLCB2ZXJzdGVoZSBpY2ggbmljaHQuIiwgYW50d29ydGV0ZSBVbG8uCisKKyJEZXIgTmFtZSBhbGxlaW4gaXN0IGRvY2ggbmljaHQgZGVyIGdhbnplIE1lbnNjaC4gV2VubiBpY2ggZWluZW4gIFNjaHdlaXNzZnVzcworUm9zZSBuZW5uZSwgcmllY2h0IGVyIGRlc3dlZ2VuIG5pY2h0IGJlc3Nlci4iLCBlcmtsYWVydGUgSnVsaWEuCisKK1VsbyBuaWNrdGUuICJfRGFzXyB2ZXJzdGVoZSBpY2guIgorCisiSmEuIFVuZCB3ZW5uIFJvbWVvIG5pY2h0IFJvbWVvIE1vbnRhZ3VlIHdhZXJlLCAgc29uZGVybi4uLiIgIFNpZSAgdWViZXJsZWd0ZS4KKyJIYW5zIFNjaG1pdHosIHNvIHdhZXJlIGVyIGltbWVyIG5vY2ggZGVyIGdsZWljaGUgTWVuc2NoIHVuZCBpY2ggIGtvZW5udGUgIGlobgorb2huZSBQcm9ibGVtZSBsaWViZW4uIgorCisiSGFucyBTY2htaXR6PyIsIGZyYWd0ZSBSb21lbyB1bnRlbiBsZWlzZS4KKworQXp6dXJvIGdyaW5zdGUgbnVyLgorCisiQWxzbywgUm9tZW8sIHZlcmdpc3MgZGVuIE5hbWVuLCBkZW4gIGJyYXVjaHN0ICBkdSAgbmljaHQuICBTdGF0dCAgZGVzICBOYW1lbnMKK2thbm5zdCBkdSBtaWNoIGhhYmVuLiIgSnVsaWEgYnJlaXRldGUgdGhlYXRyYWxpc2NoIGRpZSBBcm1lIGF1cy4KKworUm9tZW8ga29ubnRlIHNpY2ggbmljaHQgbGFlbmdlciB6dXJ1ZWNraGFsdGVuLiAiR3V0LCBnYW56IHdpZSBkdSB3aWxsc3QuICBXZW5uCitkdSBtaWNoIEhhbnMgU2NobWl0eiBuZW5uZW4gd2lsbHN0LCBkYW5uIGJpbiBpY2ggZWJlbiBIYW5zIFNjaG1pdHouIgorCitKdWxpYSB3dXJkZSBmZXVlcnJvdC4gIlNwYW5uZXIhIiwgc2NoaW1wZnRlIHNpZS4KKworIlZvbiBtaXIgYXVzIGF1Y2ggSGFucyBTcGFubmVyLiIgUm9tZW8genVja3RlIGRpZSBTY2h1bHRlcm4uCisKK1VsbyBmaWVsIHZvciBMYWNoZW4gdm9tIEFzdCB1bmQgZmluZyBzaWNoIHdlbmlnZSBaZW50aW1ldGVyICB1ZWJlciAgZGVtICBCb2RlbgorYXVmLgorCisiV2Vpc3MgZXIsIHdhcyBlciBkYSBzYWd0PyIsIGZsdWVzdGVydGUgc2llIEF6enVybyB6dS4KKworIldhaHJzY2hlaW5saWNoIG5pY2h0LiIsIGdhYiBBenp1cm8genVydWVjay4gIklzdCBkb2NoICBhdWNoICBlZ2FsLCAgb2Rlcj8gIFNvCit3ZWdnZXRyZXRlbiwgd2llIGVyIGltIE1vbWVudCBpc3QsIGtvZW5udGUgc2llIGlobiBIYW5zIFd1cnN0ICBuZW5uZW4gIHVuZCAgZXIKK3d1ZXJkZSBlcyBsaWViZW4uIgorCitKdWxpYSBiZXVndGUgc2ljaCB1ZWJlciBkaWUgQnJ1ZXN0dW5nIGRlcyBCYWxrb25zIHVuZCBkZXIgU2NoYWwgIHJ1dHNjaHRlICBpaHIKK25vY2ggd2VpdGVyIHZvbiBkZW4gU2NodWx0ZXJuIGhlcnVudGVyLiAiT2gsICBNb21lbnQsICB3aXIgIGhhYmVuICBkb2NoICBoZXV0ZQorYWJlbmQgbWl0ZWluYW5kZXIgZ2VzcHJvY2hlbiwgbmljaHQ/IER1IGhhc3QgIG1pY2ggIG1pdCAgZWluZW0JV2VpaG5hY2h0c2JhdW0KK3ZlcmdsaWNoZW4uIiBTaWUgdWViZXJsZWd0ZS4gIkRhbm4gYmlzdCBkdSBSb21lbyBNb250YWd1ZS4iCisKK1JvbWVvIGdhYiBzaWNoIGFsbGUgTXVlaGUsIGRlbiBCbGljayBhdWYgIGlociAgR2VzaWNodAlnZXJpY2h0ZXQgIHp1ICBoYWx0ZW4uCisiTmVpbiwgZGVubiBkdSBoYXN0IGdlcmFkZSAgZXJzdCAgYmVzY2hsb3NzZW4sICBkYXNzICBpY2ggIEhhbnMgIFNwYW5uZXIgIHNlaW4KK3NvbGwuIiwgZXJrbGFlcnRlIGVyIGltIEJydXN0dG9uIGRlciBVZWJlcnpldWd1bmcuCisKKyJXaWUgYmlzdCBkdSB1ZWJlcmhhdXB0IGhpZXJoZXJnZWtvbW1lbj8iCisKKyJVZWJlciBkaWUgTWF1ZXI/IiBSb21lbyB3YXIgc2ljaCBzZWluZXIgIFNhY2hlICBuaWNodCAgdm9lbGxpZyAgc2ljaGVyLiAgIkphLAorZG9jaCwgaWNoIGJpbiB1ZWJlciBkaWUgTWF1ZXIgZ2VrbGV0dGVydC4iCisKK0p1bGlhIGthbm50ZSBkaWUgTWF1ZXIgdm9uIGlocmVuIGVpZ2VuZW4gRXhrdXJzaW9uZW4uICAiRGllICBpc3QgIGdhbnogIHNjaG9lbgoraG9jaC4iCisKKyJEaWUgRmx1ZWdlbCBkZXIgTGllYmUgaGFiZW4gbWljaCBoaW51ZWJlcmdldHJhZ2VuLiIKKworIldvIGhhc3QgZHUgZGFzIGRlbm4gZ2VsZXNlbj8iCisKKyJLZWluZSBBaG51bmcsIGFiZXIgZXMga2xpbmd0IGh1ZWJzY2gsIG5pY2h0PyIKKworIkphLCBzY2hvbi4iLCBhbnR3b3J0ZXRlIEp1bGlhLiAiV2VubiBtZWluZSBMZXV0ZSBkaWNoICBoaWVyICBmaW5kZW4sICByZWlzc2VuCitzaWUgZGlyIGRlbiBLb3BmIGFiLiIKKworIk9kZXIgZXR3YXMsIGRhcyAgZHUgIG1laHIgIHZlcm1pc3NlbiAgd3VlcmRlc3QuIiwgIHNldHp0ZSAgQXp6dXJvICBtaXQgIGVpbmVtCitib3NoYWZ0ZW4gR3JpbnNlbiBoaW56dS4KKworUm9tZW8gd3VyZGUgYmxhc3MsIGRvY2ggZGFubiBiZXNhbm4gZXIgc2ljaCBKdWxpYXMgdW5kIGRlciBUYXRzYWNoZSwgIGRhc3MgIGVyCitiZWkgaWhyIEVpbmRydWNrIG1hY2hlbiB3b2xsdGUuICJBY2gsIHdpcmQgc2Nob24gbmljaHQgc28gIHNjaGxpbW0gIHNlaW4uIiAgRXIKK3p1Y2t0ZSBtaXQgZGVuIFNjaHVsdGVybiB1bmQgIHZlcnN1Y2h0ZSwgIGhlbGRlbmhhZnQgIGF1c3p1c2VoZW4uICAiSWNoICBsaWViZQorZGljaCwgaWNoIHdpbGwgZGljaCwgZGVpbmUgVmVyd2FuZHRlbiBzaW5kIG1pciBlZ2FsLiIKKworIkR1IGJpc3QgZWluIEhvbHprb3BmLCB3ZW5uIGR1IGtlaW5lIEFuZ3N0IHZvciAgaWhuZW4gIGhhc3QuIiAgQXp6dXJvICB6d2lja3RlCitSb21lbyBzcGllbGVyaXNjaCBpbiAgZGVuICBPYmVyc2NoZW5rZWwgIHVuZCAgd2ljaCAgZ2VzY2hpY2t0ICBkZW4gIGFlbmdzdGxpY2gKK3p1Z3JlaWZlbmRlbiBIYWVuZGVuIGF1cy4KKworIkR1IGJpc3QgaW4gZ3Jvc3NlciBHZWZhaHIsIHdlbm4gZHUgaGllciBibGVpYnN0LiIsIG1laW50ZSBhdWNoIEp1bGlhLgorCisiSmEsIGFiZXIgbmljaHQgZGVpbmUgVmVyd2FuZHRlbiBzaW5kIGRpZSBHZWZhaHIsIHNvbmRlcm4gbWVpbmUgQXVnZW4uIiAgSnVsaWEKK2Vycm9ldGV0ZSBsZWljaHQuICJIbSwgaWNoIG11c3MgenVnZWJlbiwgZGFzcyBlcyBtaXIga2VpbmVzd2VncyAgcmVjaHQgIHdhZXJlLAord2VubiBzaWUgZGljaCBoaWVyIGZhZW5kZW4uIgorCisiV2FlcmUgZG9jaCBlaW4gcm9tYW5yZWlmZXIgVG9kLCBuaWNodD8gV2VubiAgZHUgIG1pY2ggIG5pY2h0ICBsaWViZW4gIHdpbGxzdCwKK2tvZW5uZW4gc2llIG1pY2ggaGFiZW4sIGRhbm4gaXN0IG1pciBzb3dpZXNvIGFsbGVzIGVnYWwuIgorCitVbG8gbGFjaHRlLiAiTWlyIGlzdCBhdWNoIGFsbGVzIGVnYWw6IEljaCBtYWNoZSBTY2hsdXNzIG1pdCAgZXVyZW0gIExlYmVuICB1bmQKK3J1ZmUgZGllIFZlcndhbmR0ZW4uIgorCisiVW50ZXJzdGVoIGRpY2ghIiByaWVmZW4gSnVsaWEsIFJvbWVvLCBBenp1cm8gdW5kIFdsYWQgIHdpZSAgYXVzICBlaW5lbSAgTXVuZCwKK2JlemllaHVuZ3N3ZWlzZSBNYXVsIG9kZXIgU2NobmFiZWwuCisKK0p1bGlhIGdyaWZmIGJlaGVyenQgenUgdW5kIHVtZmFzc3RlIFVsb3MgU2NobmFiZWwuICJXaXJzdCBkdSBydWhpZyBzZWluPyIKKworIk1tbW1tLiIgVWxvIHNjaGx1ZyBtaXQgZGVuIEZsdWVnZWxuLgorCisiTmEgZ3V0LiIgSnVsaWEgZW50ZmVybnRlIGlocmUgSGFuZCwgYmVyZWl0LCBzb2ZvcnQgd2llZGVyIHp1enVmYXNzZW4sICBzb2JhbGQKK1VsbyB0aWVmIEx1ZnQgaG9sdGUuICJXb2hlciB3dXNzdGVzdCBkdSB1ZWJlcmhhdXB0LCBkYXNzIGR1IG1pY2ggIGhpZXIgIGZpbmRlbgord3VlcmRlc3Q/IiwgZnJhZ3RlIHNpZS4KKworIkljaCBiaW4gZWluZmFjaCBkZXIgTmFzZSBuYWNoIGdlbGF1ZmVuLiIsIGFudHdvcnRldGUgUm9tZW8uCisKKyJOdXIgZ3V0LCBkYXNzIGR1IEp1bGlhIGdlZnVuZGVuIGhhc3QgdW5kICBuaWNodCAgZGllICBUb2lsZXR0ZS4iLCAgZmx1ZXN0ZXJ0ZQorQXp6dXJvIGlobSB6dSB1bmQgZ2Vub3NzIFJvbWVvcyAgdGllZnJvdGVzICBHZXNpY2h0LCAgZGFzICBpbiAgZGVyICBEdW5rZWxoZWl0CityZWdlbHJlY2h0IHp1IGxldWNodGVuIHNjaGllbi4KKworQXVjaCBKdWxpYSBzY2hpZW4gYWVobmxpY2ggR2VkYW5rZW4genUgaGVnZW4sIHNwcmFjaCBzaWUgYWxsZXJkaW5ncyBuaWNodCBhdXMuCisiTnVyIGd1dCwgZGFzcyBkdSBuaWNodCBzZWhlbiBrYW5uc3QsIHdpZSByb3QgaWNoIGJpbi4iCisKK1VsbyBiZWFldWd0ZSBrcml0aXNjaCBKdWxpYXMgR2VzaWNodCB1bmQgc3VjaHRlIGRpZSBSb2V0ZSB2ZXJnZWJsaWNoLgorCisiSWNoIGJpbiBuYWVtbGljaCBlaW4gYW5zdGFlbmRpZ2VzIE1hZWRjaGVuLiIsIGZ1aHIgIEp1bGlhICBmb3J0LiAgIkVpZ2VudGxpY2gKK3N0ZWhlIGljaCBuaWNodCBuYWNodHMgYXVmIHp1Z2lnZW4gQmFsa29uZW4gaGVydW0gdW5kIHJlZGUgbWl0IEtyYWVoZW4uIgorCisiRGFzIGthbm4gaWNoIGJlc3RhZXRpZ2VuLiIgVWxvIGdyaW5zdGUgYm9lc2UsIGRvY2ggYmV2b3IgIHNpZSAgd2VpdGVyc3ByZWNoZW4KK2tvbm50ZSwgem9nIEF6enVybyBpaHIgaGVmdGlnIGFtIFNjaHdhbnouCisKKyJJY2ggd2Vpc3MgZ2VuYXUsICBkYXNzICBpY2ggIGVpZ2VudGxpY2ggIGVpbiAgYmlzc2NoZW4gIHdpZGVyc3BlbnN0aWdlciAgc2VpbgorbXVlc3N0ZS4iIEp1bGlhIHpvZyBkZW4gIFNjaGFsICBlbmdlciAgdW0gIGRpZSAgU2NodWx0ZXJuICB1bmQgIGVybnRldGUgIGVpbmVuCitlbnR0YWV1c2NodGVuIEJsaWNrIHZvbiBSb21lby4gIkFiZXIsIHdlbm4gaWNoIGVocmxpY2ggIHNlaW4gIHNvbGwsICBoYWJlICBpY2gKK2RhenUgdWViZXJoYXVwdCBrZWluZSBMdXN0LiBEYXMgc2luZCBibG9zcyBTcGllbGNoZW4gdW5kIGljaCBtYWcgbmljaHQgbWl0IGRpcgorc3BpZWxlbi4iCisKKyJTY2hhZGUuIiwgd2FyZiBSb21lbyBlaW4uCisKKyJOZWluLCBuaWNodCBzY2hhZGUuIERlbm4gZGFkdXJjaCBrYW5uIGljaCBkaXIgZ2FueiBvZmZlbiBzYWdlbiwgZGFzcyBpY2ggZGljaAorYXVjaCBsaWViZS4gRGVua2UgamEgbmljaHQsIGljaCBzZWkgZWluIEZsaXR0Y2hlbiwgd2VpbCBpY2ggc28JZWhybGljaCAgYmluLiIKK0p1bGlhIGRyb2h0ZSBSb21lbyBzY2hlcnpoYWZ0IG1pdCBkZW0gRmluZ2VyLgorCisiQXVjaCBlaW5lIEFydCB6dSBzcGllbGVuLiIsIG11cm1lbHRlIFdsYWQgdm9yIHNpY2ggaGluLgorCisiV3VlcmRlIG1pciBuaWVtYWxzICBlaW5mYWxsZW4uIiwgIGFudHdvcnRldGUgIFJvbWVvICB1bmQgIG1laW50ZSAgZXMgIHZvZWxsaWcKK2VocmxpY2guCisKKyJJY2ggbXVzcyAgenVnZWJlbiwgIGRhc3MgIGR1ICBtaWNoICB6aWVtbGljaCAgYXVzICBkZXIgIEJhaG4gIGdld29yZmVuICBoYXN0LgorRGVpbmV0d2VnZW4gdHVlIGljaCBEaW5nZSwgZGllIG1pciBzb25zdCBuaWNodCBlaW5maWVsZW4uIgorCitSb21lbyBlcnJvZXRldGUgdGllZiB1bmQgd3Vzc3RlIGRhenUgbmljaHRzIHp1IHNhZ2VuLgorCitNaXQgc3RyZW5nZW0gR2VzaWNodHNhdXNkcnVjayBmdWhyIEp1bGlhIGZvcnQ6ICJXZW5uIGR1IG1pY2ggd2lya2xpY2ggIGxpZWJzdCwKK2Rhbm4uLi4iCisKKyJEYW5uPyIsIGZyYWd0ZSBSb21lbyBhdGVtbG9zLgorCisiRGFubiBzYWcgbWlyLCB3YXMgZHUgdm9uIG1pciBlcndhcnRlc3QuIiAgTnVuICB3YXIgIGRpZSAgUmVpaGUgIGFuICBKdWxpYSAgenUKK2Vycm9ldGVuLiAiSWNoIHdpbGwgZGlyIGRlbiBHZWZhbGxlbiB0dW4gdW5kIG1pY2ggc28gdmVyaGFsdGVuLCB3aWUgZHUgZXMgIHZvbgorZWluZW0gYW5zdGFlbmRpZ2VuIE1hZWRjaGVuIGVyd2FydGVzdC4iCisKK1JvbWVvIHNjaGx1ZyBzaWNoIHJhc2NoICBhbGxlICB1bmFuc3RhZW5kaWdlbiAgR2VkYW5rZW4gIGF1cyAgZGVtICBLb3BmLiAgIkljaAorc2Nod29lcmUgZGlyLi4uIgorCisiTmljaHQgc2Nod29lcmVuISIgSnVsaWEgZXJpbm5lcnRlIHNpY2ggbnVyIHp1IGd1dCBhbiBkaWUgdmllbGVuIFNjaHd1ZXJlLCBkaWUKK3NpZSBpbiBpaHJlbSBMZWJlbiBnZXRhbiBoYXR0ZS4gRGVyIFNjaHd1ciwgbmllbWFscyB3aWVkZXIgIE5vdWdhdHByYWxpbmVuICB6dQorZXNzZW4sIHZvbiBkZW5lbiAgc2llICBQaWNrZWwgIGJla2FtLCAgd2FyICBudXIgIGVpbmVyCWRhdm9uICAtICB1bmQgIGRlciAgYW0KK2xlaWNodGVzdGVuIGdlYnJvY2hlbmUuCisKKyJKYSwgYWJlci4uLiIgUm9tZW8gdWViZXJsZWd0ZSBhbmdlc3RyZW5ndC4gICJXZW5uICBpY2ggIGRpciAgbmljaHQgIHNjaHdvZXJlbgorZGFyZiwgZGFzcyBpY2ggZGljaCBsaWViZSwgd2FzIHNvbGwgaWNoIGRlbm4gc29uc3QgdHVuPyBJY2ggbWVpbmUuLi4iCisKK0p1bGlhIHVudGVyYnJhY2ggaWhuIHdpZWRlci4gIkljaCB3ZWlzcywgd2FzIGR1ICBtZWluc3QuICBBYmVyICB3ZW5uICBkdSAgbWljaAord2lya2xpY2ggbGllYnN0LCBkYW5uIGthbm4gZXMgbnVyIGVpbmVuIFNjaHd1ciBnZWJlbiwgZGVuIGljaCBha3plcHRpZXJlLiIKKworUm9tZW8gc2NobHVja3RlLiAiSGVpcmF0PyIKKworIlphY2ssIHNjaG9uIGhhdCBzaWUgZGljaC4iIEF6enVybyBraWNoZXJ0ZS4gIkdlaCBqZXR6dCwgIGJldm9yICBlcyAgenUgIHNwYWV0Citpc3QhIE9kZXIgbm9jaCBiZXNzZXI6IFJlbm4hIgorCitEb2NoIFJvbWVvIHdhciBzY2hvbiBqZW5zZWl0cyAgYWxsZXIgIGd1dGVuICBSYXRzY2hsYWVnZS4gICJKYS4uLiIsICBzYWd0ZSAgZXIKK2dlZGVobnQuCisKKyJXdW5kZXJiYXIuIiBKdWxpYSBzY2hlbmt0ZSBpaG0gaWhyIHN0cmFobGVuZHN0ZXMgTGFlY2hlbG4uICAiRGFubiAga2FubnN0ICBkdQorZGlyIGF1c3N1Y2hlbiwgd2FubiB1bmQgd28gZGllIEhvY2h6ZWl0IHN0YXR0ZmluZGVuIHNvbGwuIgorCisiS29tbSByZWluLCBLaW5kY2hlbiwgZGEgZHJhdXNzZW4gaG9sc3QgZHUgIGRpciAgZGVuICBUb2QuIiwgIHJpZWYgIFBvbGx5ICB2b24KK2RyaW5uZW4uCisKK1VsbyBsYWNodGUgdW5kIHN0aWVzcyBXbGFkIGFuLiAiRGVuIFRvZCBuaWNodCwgZWhlciBlaW5lbiBFaGVtYW5uLiIKKworIkRhcyBrYW5uIFBvbGx5IGRvY2ggbmljaHQgd2lzc2VuLiIsIGdhYiBXbGFkIGtpY2hlcm5kIHp1cnVlY2suCisKKyJXYXJ0ZSBlaW5lbiBNb21lbnQsIGljaCB3aWxsIGViZW4gUG9sbHkgYmVydWhpZ2VuLiIgIEp1bGlhICBsaWVzcyAgZGVuICBTY2hhbAorZmFsbGVuIHVuZCB2ZXJzY2h3YW5kIG5hY2ggZHJpbm5lbi4KKworIlVtcGYuIiwgbWFjaHRlIFJvbWVvIHVlYmVyd2FlbHRpZ3QuICJJY2ggZmFzc2UgZXMgbmljaHQuIgorCisiSWNoIGF1Y2ggbmljaHQuIiwgc2FndGUgQXp6dXJvIHRyYXVyaWcuICJXaWUga2FubnN0IGR1ICBkaWNoICBudXIgIHNvICBsZWljaHQKK2VpbmZhbmdlbiBsYXNzZW4/IgorCisiV2VyIGhhdCBkZW5uIGhpZXIgd2VuIGdlZmFuZ2VuPyIsIGZyYWd0ZSAgUm9tZW8uICAiSWNoICBoYWJlICBkb2NoICB3b2hsICBkaWUKK3d1bmRlcmJhcnN0ZSwgc2Nob2Vuc3RlLCBrbHVlZ3N0ZS4uLiIKKworIkFjaCBkdSBsaWViZXIgSGltbWVsISIgQXp6dXJvIHdhcmYgUm9tZW8gZWluZW4genV0aWVmc3QgZW50c2V0enRlbiAgQmxpY2sgIHp1Cit1bmQgdmVyc2Nod2FuZCBpbiBkZXIgRHVua2VsaGVpdC4KKworSnVsaWEgdGF1Y2h0ZSB3aWVkZXIgYXVmIGRlbSBCYWxrb24gYXVmIHVuZCBsZWd0ZSBzaWNoIGlocmVuIFNjaGFsICB3aWVkZXIgIHVtCitkaWUgU2NodWx0ZXJuLiAiV2VubiBkdSBlcyBhbGxlcmRpbmdzIG5pY2h0IGVybnN0IG1laW5zdCwgZGFubiBiaXR0ZS4uLiIKKworIkp1bGlhISIsIHJpZWYgUG9sbHkgd2llZGVyLgorCisiSmFqYSwgaWNoIGtvbW1lIGphIHNjaG9uISIgSnVsaWEgc2V1Znp0ZS4gIi4uLmljaCBkaWNoLCBsYXNzIG1pY2ggaW4gRnJpZWRlbi4KK01vcmdlbiBzY2hpY2tlIGljaCBqZW1hbmRlbiB6dSBkaXIsIGRlciBiZWkgZGlyIGRlbiBUZXJtaW4gZnVlciAgZGllICBIb2NoemVpdAorYWJob2xlbiBzb2xsLiBXZW5uIGR1IG1pciBrZWluZW4gVGVybWluIGdpYnN0LCBkYW5uIHdlcmRlIGljaCB3b2hsIGJpcyBhbiBtZWluCitMZWJlbnNlbmRlIGVpbnNhbSB1bmQgYWxsZWluIHdlaW5lbi4iIERpZSBWb3JzdGVsbHVuZyBhbGxlaW4gbGllc3MgZWluZSBUcmFlbmUKK3VlYmVyIGlocmUgV2FuZ2UgbGF1ZmVuLiAiVW5kIGpldHp0IHNjaGxhZiBndXQuIgorCitSb21lbyBzb2cgZGllIGZldWNodGUgTmFjaHRsdWZ0IGR1cmNoIGRpZSBOYXNlIHVuZCAgYmlsZGV0ZSAgc2ljaCAgZWluLCAgZWluZW4KK0hhdWNoIGlocmVzIFBhcmZ1bXMgenUgcmllY2hlbi4gQmVkYXVlcm5kIGJsaWNrdGUgZXIgenUgIEp1bGlhcyAgQmFsa29uICBob2NoLAorZGVyIG51biBhYmdlc2VoZW4gdm9uIGRlciBLcmFlaGUgYXVmIGRlciBCcnVlc3R1bmcgbGVlciB3YXIuICJBY2gsIEp1bGlhLCAgd2llCitnZXJuZSBiaW4gaWNoIGJlaSBkaXIgdW5kIHdpZSB0cmF1cmlnIGJpbiBpY2gsIHdlaWwgIGljaCAgamV0enQgIHdpZWRlciAgZ2VoZW4KK211c3MuIgorCisiSnVsaWE/IiBVbG8gdWViZXJsZWd0ZS4gIkFjaCBzbywgaWNoIHZlcnN0ZWhlLiBOYSAgZ3V0LCAgZGFubiAgYmluICBpY2ggIGViZW4KK2pldHp0IEp1bGlhLiIKKworIkhtPyIsIGZyYWd0ZSBKdWxpYSwgZGllIGVzIGltIFppbW1lciBuaWNodCBtZWhyIGF1c2dlaGFsdGVuIGhhdHRlLgorCisiQWNoLCBuaWNodHMuIiBVbG8gcnVlY2t0ZSB6dXIgU2VpdGUuCisKKyJCaXN0IGR1IG5vY2ggZGEsIFJvbWVvPyIsIGZsdWVzdGVydGUgSnVsaWEuICJXaWUgc2NoYWRlLCBkYXNzICBkdSAga2VpbiAgSHVuZAorYmlzdCB1bmQgaWNoIGtlaW5lIEh1bmRlcGZlaWZlIGhhYmUsIGRlbm4gZGFubiBrb2VubnRlIGljaCAgZGljaCAgcnVmZW4sICBvaG5lCitnbGVpY2ggZGllIGdhbnplIE5hY2hiYXJzY2hhZnQgcmViZWxsaXNjaCB6dSBtYWNoZW4uIgorCitXbGFkIGtpY2hlcnRlIGxlaXNlIGJlaSBkZXIgVm9yc3RlbGx1bmcgdm9uIFJvbWVvIGFscyBCZXJuaGFyZGluZXIgbWl0IHRyZXVlbiwKK3NjaHdlcm11ZXRpZ2VuIEF1Z2VuIHVuZCBlaW5lbSBGYWVzc2NoZW4gdW0gZGVuIEhhbHMsICBtaXQgIGRlc3NlbiAgSW5oYWx0ICBlcgorc2ljaCB3YWVocmVuZCBkZXIgbGFuZ2VuIE5hY2h0d2FjaGVuIHZvciBKdWxpYXMgRmVuc3RlciB3YWVybXRlLgorCisiUm9tZW8/IiBKdWxpYSByaWVmIG51biBlaW4gd2VuaWcgbGF1dGVyLgorCisiSWNoIGJpbiBzY2hvbiBkYS4iIEVyIHNhaCB6dSBKdWxpYXMgQmFsa29uIGhvY2guICJXYXMgc29sbCBpY2ggdHVuPyIKKworIklociBkaWUgWmVpdHVuZyB1bmQgZGllIFBhbnRvZmZlbG4gYnJpbmdlbi4iLCBtdXJtZWx0ZSBVbG8gdW5kIHp3aW5rZXJ0ZSBXbGFkCit6dS4KKworIldhbm4ga2FubiBpY2ggZGVubiBtZWluZW4gQm90ZW4genUgZGlyIHNjaGlja2VuPyIKKworIlNvIGdlZ2VuIG5ldW4gVWhyPyIsIHNjaGx1ZyBSb21lbyB2b3IuCisKKyJHdXQuIEFiZXIgaWNoIHdvbGx0ZSBub2NoIGV0d2FzIGFuZGVyZXMuLi4iIEF1ZiBpaHJlciBTdGlybiBiaWxkZXRlIHNpY2ggZWluZQorc3RlaWxlIEZhbHRlLgorCisiSWNoIGJsZWliZSBoaWVyLCBiaXMgZXMgZGlyIHdpZWRlciBlaW5mYWVsbHQuIiBSb21lbyBzY2hpZW4gdm9uIGRlbSAgR2VkYW5rZW4KK3NlaHIgYW5nZXRhbiB6dSBzZWluLgorCitKdWxpYSBraWNoZXJ0ZSBsZWlzZS4gIkRhbm4gZXJpbm5lcmUgaWNoIG1pY2ggbmllIG1laHIgZGFyYW4sIHdlaWwgZHUgbWljaCAgc28KK3ZvZWxsaWcgdmVyd2lycnN0IHVuZCBpY2ggc293aWVzbyBhbiBuaWNodHMgYW5kZXJlcyBhbHMgZGljaCBkZW5rZW4ga2Fubi4iCisKK1JvbWVvIGxpZXNzIHNpY2ggSnVsaWFzIFNhdHogbm9jaCBlaW5tYWwgZHVyY2ggZGVuIEtvcGYgZ2VoZW4gdW5kIG5pY2t0ZSwgIGFscworZXIgaWhuIGJlZ3JpZmZlbiBoYXR0ZS4gIkRhbm4gYmxlaWJlbiB3aXIgIGJlaWRlICBoaWVyICBmdWVyICBpbW1lciAgdW5kICBld2lnCitzdGVoZW4uIgorCisiVW5kIHZlcmh1bmdlcm4uIiwgd2FyZiBVbG8gdm9lbGxpZyB1bnBvZXRpc2NoIGVpbi4KKworIkRhbm4gd2FlcmVzdCBkdSB3aWUgZWluIGtsZWluZXIgSHVuZCwgd2Vpc3N0IGR1PyAgSW1tZXIsICB3ZW5uICBkdSAgbWFsICBlYmVuCithZWguLi4iIEp1bGlhIHpvZWdlcnRlLiAiLi4uZWluZW4gQmF1bSBtYXJraWVyZW4gd2lsbHN0LCB6b2VnZSBpY2ggIGFuICBkZWluZXIKK0xlaW5lLCB3ZWlsIGljaCBkaWNoIG5pY2h0IGFsbGVpbmUgZ2VoZW4gbGFzc2VuIHdpbGwuIgorCisiRGFzIHdhZXJlIHd1bmRlcnNjaG9lbi4iLCBzZXVmenRlIFJvbWVvLiAiSWNoIHdhZXJlIGdlcm5lIGRlaW4gSHVuZC4iCisKKyJKYSwgZGVyIEdlZGFua2UgaXN0IHJlaXp2b2xsLiIgSnVsaWEgcmllZiBlaW5lIEdlbmVyYWxtb2JpbG1hY2h1bmcgIGZ1ZXIgIGRpZQorZ2VzYW10ZSBWZXJudW5mdCBpbiBpaHJlbSBLb3BmIGF1cy4gIkFiZXIgd2FocnNjaGVpbmxpY2ggd3VlcmRlICBpY2ggIGRpY2ggIHNvCitzY2hyZWNrbGljaCAgdmVyd29laG5lbiwgIGRhc3MJZHUgIGluCWt1ZXJ6ZXN0ZXIgIFplaXQgIHdpZSAgZWluZSAgU29mYXJvbGxlCithdXNzaWVoc3QgdW5kIGFuIEhlcnp2ZXJmZXR0dW5nIGVpbmdlaHN0LiBXZW5uIGR1IG5pY2h0IGJhbGQgZ2Voc3QsICBzYWdlICBpY2gKK2RpciBndXRlIE5hY2h0LCBiaXMgZGllICBTb25uZQlhdWZnZWh0LCAgdW5kICBtYWNoZSAgZGFubiAgbWl0ICBndXRlbglNb3JnZW4KK3dlaXRlci4iIFNpZSBsYWVjaGVsdGUsIHdpbmt0ZSBlaW4gbGV0enRlcyBNYWwgdW5kIHZlcnNjaHdhbmQgd2llZGVyIGluICBpaHJlbQorWmltbWVyLgorCitSb21lbyBzYWggaWhyIG1pdCBsZWVyZW4gQXVnZW4gaGludGVyaGVyLiAiV2VubiBpY2ggZG9jaCBibG9zcyBpaHIgQmV0dCB3YWVyZSwKK29kZXIgaWhyZSBCZXR0ZGVja2UsIGRhbm4ga29lbm50ZSBpY2ggIGRpZSAgZ2FuemUgIE5hY2h0ICBiZWkgIGlociAgc2Vpbi4iICBFcgorc2V1Znp0ZS4gIkVzIHdhZXJlIG1pciBzY2hvbiBnZW51Zywgd2VubiBpY2ggIGVpbiAgVHJhdW0gIHNlaW4gIGR1ZXJmdGUsICBkYW5uCitrb2VubnRlIGljaCBkaWUgZ2FuemUgTmFjaHQgaW4gaWhyZW0gS29wZiBzZWluLiIKKworVWxvIGdyaW5zdGUuICJJbiBpaHJlbiBLb3BmIHdpbGwgZXIgYmVzdGltbXQgbmljaHQgaGluZWluLiIKKworIkZlcmtlbC4iLCB3aWVzIEF6enVybyBzaWUgenVyZWNodC4KKworIk5laW4sIEtyYWVoZS4gRmVya2VsIGhhYmVuIGtlaW5lIEZsdWVnZWwgdW5kIHNpbmQgYXVjaCBuaWNodCBzY2h3YXJ6LiIKKwpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9yb21fanVsL3NlaXRlMTEgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL3JvbV9qdWwvc2VpdGUxMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjVmNjJjCi0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9yb21fanVsL3NlaXRlMTEKQEAgLTAsMCArMSwxMzEgQEAKK0RFUiBaV0VJVEUgQUtUCisJICBESUUgRFJJVFRFIFNaRU5FCisKK0JydWRlciBMYXdyZW5jZSBob2Igc2VpbmUgRnVlc3NlIGluIGRlbiBTYW5kYWxlbiBiZXNvbmRlcnMgaG9jaCwgZGVubiBkYXMgR3Jhcword2FyIG5hc3MgdW5kIGthbHQgdm9tIFRhdS4gVWViZXIgc2VpbmVuIEFybSAgaGF0dGUgIGVyCWVpbmVuICBLb3JiICBnZWhhZW5ndCwKK3NlaW5lIEt1dHRlIHZvcm5lIHp1c2FtbWVuZ2VmYXNzdCB1bmQgaW4gZGVuICBTdHJpY2sgIGdlc3RlY2t0LCAgZGVyICBpaG0gIGFscworR3VlcnRlbCBkaWVudGUuIERpZSBTb25uZSwgZGllIHZvcnNpY2h0aWcgdWViZXIgZGllIEdhcnRlbm1hdWVyIGx1Z3RlLCBicmFjaHRlCitCcnVkZXIgTGF3cmVuY2VucyBUb25zdXIgenVtIFNjaGltbWVybiB1bmQgIGdsaXR6ZXJ0ZSAgYXVmICBzZWluZW4gIHRhdW5hc3NlbiwKK2hhYXJpZ2VuIEJlaW5lbiwgd2VubiBlciBzaWNoIG5pZWRlcmJ1ZWNrdGUgdW5kICBLcmFldXRlciAgYXVzcnVwZnRlLCAgZGllICBlcgorc29yZ2ZhZWx0aWcgaW4gc2VpbmVuIEtvcmIgbGVndGUuCisKKyJLb21tIG51ciBoZXIsIGR1IGh1ZWJzY2hlciAgQm9ycmV0c2NoLiIsICBzYWd0ZSAgQnJ1ZGVyICBMYXdyZW5jZSAgbWl0ICBlaW5lbQorTGFlY2hlbG4sIGRhcyBkaWUgUGZsYW56ZSBuaWNodCBlcndpZGVydGUuICJEdSBrb21tc3QgaGV1dGUgaW4gbWVpbmVuIFNhbGF0LiIKKworIkljaCBrb2VubnRlIG1pciBhbmdlbmVobWVyZXMgdm9yc3RlbGxlbi4iLCBtdXJtZWx0ZSBVbG8sIGRpZSAgYXVmICBkZXIgIE1hdWVyCitzYXNzIHVuZCBzaWNoIGRpZSBTb25uZSBhdWYgZGFzIEdlZmllZGVyIHNjaGVpbmVuIGxpZXNzLgorCitBenp1cm8sIGRlbSBkaWUgZHVyY2h3YWNodGUgTmFjaHQgenVzZXR6dGUsIHNjaHJlY2t0ZSAgbmViZW4gIGlociAgYXVzCXNlaW5lbQorTmlja2VyY2hlbiBob2NoLiAiV2FzIG1laW50ZXN0IGR1PyIsIGZyYWd0ZSBlciB2ZXJzY2hsYWZlbi4KKworVWxvIGFudHdvcnRldGUgbmljaHQsIHNvbmRlcm4gYmV0cmFjaHRldGUgQnJ1ZGVyIExhd3JlbmNlLCBkZXNzZW4gQmF1Y2ggZXMgaWhtCitzaWNodGxpY2ggc2Nod2VyIG1hY2h0ZSwgZGllIEdhZW5zZWJsdWVtY2hlbiB6dSBwZmx1ZWNrZW4sICBkaWUgIHNlaW5lbSAgU2FsYXQKK0ZhcmJlIGdlYmVuIHNvbGx0ZS4KKworIkhhYiBpY2ggZGljaC4iLCBtZWludGUgZGVyICBNb2VuY2ggIHRyaXVtcGhpZXJlbmQuICAiRHUgIGJpc3QgIG1pciAgYmVzb25kZXJzCitlcnd1ZW5zY2h0LCBrbGVpbmVzIEdhZW5zZWJsdWVtY2hlbi4gRGVubiBzYWd0CW5pY2h0ICBzY2hvbiAgTGVvbmhhcmQJRnVjaHM6CitfRGllXyBfR2VubnNzYmx1bV8gX2lzdF8gX2Z1ZXJ0cmVmZmxpY2hfIF9ndXRfIF96dV8gX2Rlbl8gIF9sYW1lbl8gIF9nbGlkZXJuXy4KK1VuZCBsYWhtIGZ1ZWhsZSBpY2ggbWljaCBoZXV0ZSBtb3JnZW4gZ2FueiBiZXN0aW1tdC4iIEVyIHJpZWIgc2ljaCBkZW4gUnVlY2tlbgordW5kIGxpZXNzIHNlaW5lbiBCbGljayB1ZWJlciBkZW4gS3JhZXV0ZXJnYXJ0ZW4gIHdhbmRlcm4sICBiaXMJZXIgIGF1ZiAgZWluZW0KK01haWdsb2Vja2NoZW4gIGhhZW5nZW5ibGllYi4gICJEaWNoICBlc3NlICBpY2ggIGxpZWJlciAgbmljaHQsICBhdWNoICB3ZW5uICBkdQoraHVlYnNjaGVyIGJpc3QsIGFscyBkYXMgR2FlbnNlYmx1ZW1jaGVuLiIsIHZlcnNpY2hlcnRlIGVyIGRlciBCbHVtZSwgIGRpZSAgaWhtCitqZWRvY2gga2VpbmUgQXVmbWVya3NhbWtlaXQgc2NoZW5rdGUuICJTbyBzY2hvZW4gZHUgIHJpZWNoc3QsICBzbyAgaHVlYnNjaCAgZHUKK2FuenVzY2hhdWVuIGJpc3QsIHNvIGJvZXNhcnRpZyBnaWZ0aWcgYmlzdCBkdSBhdWNoLiIgRXIgc2V1Znp0ZSB1bmQgZHJvaHRlIGRlcgorQmx1bWUgc2NoZXJ6aGFmdCBtaXQgZGVtIEZpbmdlci4gIkphamEsIHNvIGRpY2h0ICBsaWVnZW4gIFNjaG9lbmhlaXQgIHVuZCAgVG9kCittYW5jaG1hbCBuZWJlbmVpbmFuZGVyLiIKKworIkRlciBndXRlIEJydWRlciBpc3QgaGV1dGUgcGhpbG9zb3BoaXNjaCBhdWZnZWxlZ3QuIiwgIGluZm9ybWllcnRlICBVbG8gIGlocmVuCitHZWZhZWhydGVuLgorCisiSG1wZi4iLCBtYWNodGUgQXp6dXJvIG9obmUgZGVuIFNjaG5hYmVsIGF1cyBkZW0gR2VmaWVkZXIgenUgemllaGVuLgorCitVbG8gc3RpZXNzIGlobiBhbiB1bmQgYmVvYmFjaHRldGUgbWl0IGhhZW1pc2NoZW0gR3JpbnNlbiwgd2llIEF6enVybyAgc2ljaCAgdW0KK3NlaW4gR2xlaWNoZ2V3aWNodCBiZW11ZWh0ZS4gIlJvbWVvIGtvbW10LiIKKworIkxhc3MgaWhuIGtvbW1lbiB1bmQgbWljaCBzY2hsYWZlbi4iLCBicnVtbXRlIEF6enVybyB1bmdlaGFsdGVuLgorCisiV2FzIGJpc3QgZHUsIGVpbiBNYW5uIG9kZXIuLi4iCisKKyIuLi5laW5lIEtyYWVoZS4iLCB2ZXJ2b2xsc3RhZW5kaWd0ZSBBenp1cm8gZGVuICBTYXR6ICB1bmQgIGJlc2NobG9zcywgIGxpZWJlcgorYXVmenV3YWNoZW4sIGFscyBVbG8gd2VpdGVyaGluIEdlbGVnZW5oZWl0IHp1IGdlYmVuLCAgaWhuICB2b24JZGVyICBNYXVlciAgenUKK3N0b3NzZW4uCisKKyJHdXRlbiBNb3JnZW4sIEJydWRlciBMYXdyZW5jZS4iIFJvbWVvIHdpbmt0ZSBkZW0gTW9lbmNoIGZyb2VobGljaCB6dS4KKworIkR1IGJpc3QgYWJlciBoZXV0ZSBndXQgIGdlbGF1bnQsICBSb21lby4iLCAgd3VuZGVydGUgIHNpY2ggIEJydWRlciAgTGF3cmVuY2UuCisiU29uc3QgYmVrb21tdCBtYW4gZGljaCBkb2NoIG5pY2h0IHNvIGZydWVoIGF1cyBkZW0gQmV0dC4gSnVuZ2UgTGV1dGUgc2NobGFmZW4KK2xhbmcgdW5kIHZpZWwgdW5kIGRhcyBpc3QgYXVjaCBndXQgc28uCUFuZGVyZXJzZWl0cy4uLiIgIEVyICBtYXNzICBSb21lbyAgbWl0CitlaW5lbSBrcml0aXNjaGVuIEJsaWNrLiAiRHUgIGJpc3QgIHdvaGwgIGltICByaWNodGlnZW4gIEFsdGVyICB1bSAgZWluZSAgTmFjaHQKK2R1cmNoenVtYWNoZW4uIgorCisiR2VuYXUuIFVuZCBpY2ggaGFiZSBkdXJjaGdlbWFjaHQgdW5kIGZ1ZWhsZSBtaWNoIGZyaXNjaGVyLCBhbHMgd2VubiAgaWNoICBkaWUKK2dhbnplIE5hY2h0IGdlc2NobGFmZW4gaGFldHRlLiIKKworQnJ1ZGVyIExhd3JlbmNlLCBkZXIgc2ljaCBub2NoIGd1dCBkYXJhbiAgZXJpbm5lcnRlLCAgd2llICBlcyAgd2FyLCAgYmV2b3IgIGVyCitNb2VuY2ggd3VyZGUsIHNjaGlja3RlIGRhcyBHcmluc2VuLCBkYXNzIHNpY2ggYXVmICBzZWluZW0gIEdlc2ljaHQgIGF1c2JyZWl0ZW4KK3dvbGx0ZSBtaXQgZWluZW0gZW5lcmdpc2NoZW4gU3Rpcm5ydW56ZWxuIHp1cnVlY2sgdW5kIGJlc2FubiAgc2ljaCAgYXVmICBzZWluZQorUGZsaWNodGVuIGFscyBQcmllc3RlciB1bmQgZ2Vpc3RsaWNoZXIJQmVyYXRlci4gICJEdSAgaGFzdCAgZG9jaCAgbmljaHQgIGV0d2EKK2dlc3VlbmRpZ3QsIG1laW4gU29obj8iLCBmcmFndGUgZXIgc3RyZW5nLiAiV2Fyc3QgZHUgYmVpIFJvc2FsaW5lPyIKKworIldlciAgaXN0ICAgUm9zYWxpbmU/IiAgIFJvbWVvICAgcmllYiAgIHNpY2ggICBtaXQgICB1ZWJlcnRyaWViZW4gICB2ZXJ3aXJydGVtCitHZXNpY2h0c2F1c2RydWNrIGRpZSBTdGlybi4gIkFjaCBzbywgZGFzIHdhciBkaWUgRnJhdSwgZGllIG1pY2ggc28gc2NocmVja2xpY2gKK3RyYXVyaWcgZ2VtYWNodCBoYXQuIiBFciBsYWNodGUuICJOZWluLCBCcnVkZXIgTGF3cmVuY2UsIGRpZXNlIEZyYXUgIGhhYmUgIGljaAordmVyZ2Vzc2VuLiIKKworIlNpZWhzdCBkdSwgaWNoIGhhYmUgZGlyIGRvY2ggZ2xlaWNoIGdlc2FndCwgZGFzcyBkaWVzICBkYXMgIGJlc3RlICBmdWVyICBkaWNoCitzZWluIHd1ZXJkZS4iIE51biAgc3RhaGwgIHNpY2ggIHRyb3R6ICBhbGxlciAgQW5zdHJlbmd1bmdlbiwgIGRpZSAgZGVyICBNb2VuY2gKK3VudGVybmFobSwgZG9jaCBub2NoIE5ldWdpZXJkZSBpbiBzZWluZW4gQmxpY2suICJXbyBoYXN0ICBkdSAgZGljaCAgZGVubiAgZGFubgorcnVtZ2V0cmllYmVuPyIKKworIkljaCBoYWJlIGJlc2NobG9zc2VuLCBkZW4gQW53ZWlzdW5nZW4gZGVyIEJpYmVsIHp1IGZvbGdlbiB1bmQgbWVpbmUgRmVpbmRlIHp1CitsaWViZW4uIgorCisiRGFzIGlzdCBhbiB1bmQgZnVlciBzaWNoIHNlaHIgbG9lYmxpY2gsIGFiZXIgd2VubiBkdSBtaXIgbmljaHQgc2Fnc3QsIHdhcyAgZHUKK2dldGFuIGhhc3QsIGthbm4gaWNoIGRpciBhdWNoIG5pY2h0IHNhZ2VuLCB3YXMgaWNoIGRhdm9uIGhhbHRlLiBVbmQgbWVpbmVuIFJhdAorc3VjaHN0IGR1IGRvY2gsIHdlbm4gaWNoIGRpY2ggcmljaHRpZyB2ZXJzdGVoZS4iCisKKyJOZWluLCBlaWdlbnRsaWNoIG5pY2h0LiIsIGFudHdvcnRldGUgUm9tZW8gdW5kICBtdXNzdGUgIHVlYmVyICBkYXMgIHZlcndpcnJ0ZQorR2VzaWNodCBkZXMgTW9lbmNocyBsYWVjaGVsbi4gIkFsc28sIGdlc3Rlcm4gYWJlbmQgaGFiZSBpY2ggYmVpICBkZW4gIENhcHVsZXRzCitlaW5lIEZlaWVyIGJlc3VjaHQgdW5kIGRhYmVpIEp1bGlhIGtlbm5lbmdlbGVybnQuIgorCisiT2guIiwgbWFjaHRlIEJydWRlciBMYXdyZW5jZSB2ZXJzdGFlbmRuaXNsb3MuCisKKyJTaWUgaXN0IHd1bmRlcnNjaG9lbiwgaWNoIGxpZWJlIHNpZSwgc2llIGxpZWJ0IG1pY2ggdW5kIGFsbGVzICB3YXMgIHdpciAgbm9jaAorYnJhdWNoZW4sIHVtIGVuZGd1ZWx0aWcgZ2x1ZWNrbGljaCAgenUJd2VyZGVuLCAgaXN0ICBlaW4gIFByaWVzdGVyLCAgZGVyICB1bnMKK3ZlcmhlaXJhdGV0LiIsIHNwcnVkZWx0ZSBlcyBudW4gYXVzIFJvbWVvIGhlcmF1cy4KKworIkFoYS4iIE51biB2ZXJzdGFuZCBCcnVkZXIgTGF3cmVuY2UsIHdhcyAgc2VpbiAgU2NodWV0emxpbmcgIHdvbGx0ZS4gICJVbmQgIGFuCitkaWVzZXIgU3RlbGxlIGtvbW1lIGljaCBpbnMgU3BpZWwuIiBSb21lbyBsYWVjaGVsdGUgc2VpbmVuIHZhZXRlcmxpY2hlbiBGcmV1bmQKK3NvIHN0cmFobGVuZCBhbiwgZGFzcyBkZXNzZW4gSGVyeiBkYWhpbnNjaG1vbHouICJJY2ggbXVzcyBzY2hvbiBzYWdlbiwgZGFzIGlzdAorZWluZSB1ZWJlcnJhc2NoZW5kZSBXZW5kdW5nLiBFcnN0IGxpZWJzdCBkdSAgUm9zYWxpbmUgIHVuZCAgamFtbWVyc3QgIG1pciAgZGllCitPaHJlbiB2b2xsLCBkYW5uIGxlcm5zdCBkdSBlaW5lIGFuZGVyZSBGcmF1ICBrZW5uZW4gIHVuZCAgc2Nob24gIGlzdCAgUm9zYWxpbmUKK1NjaG5lZSB2b24gZ2VzdGVybi4gVGphLCBpY2ggc29sbHRlIG1pciB3b2hsIGFuZ2V3b2VobmVuLCBkaWUganVuZ2VuIExldXRlIG1pdAorZWluZW0gIEtvZXJuY2hlbiAgU2Fsegl6dSAgZ2VuaWVzc2VuLgladSAgbWVpbmVyICBaZWl0ICB3YXIgIG1hbiAgbmljaHQgICBzbworc3BydW5naGFmdC4iCisKKyJBYmVyIGR1IHdvbGx0ZXN0IGRvY2gsICBkYXNzICBpY2ggIFJvc2FsaW5lICBuaWNodCAgbWVociAgbGllYmUuIiAgUm9tZW8gIHdhcgordmVyd2lycnQuCisKKyJJbiBSb3NhbGluZSB3YXJzdCBkdSB2ZXJrbmFsbHQsIG5pY2h0IHZlcmxpZWJ0LiBEYXMgIGlzdCAgZWluICBlbnRzY2hlaWRlbmRlcgorVW50ZXJzY2hpZWQuIgorCisiU2llaHN0IGR1LCBqZXR6dCBoYXN0IGR1IGRvY2ggZGVpbmVuIFdpbGxlbi4gSWNoIGxpZWJlIEp1bGlhICB1bmQgIGJpbiAgbmljaHQKK3ZlcmtuYWxsdCBpbiBzaWUuIgorCisiRGFzIGhhc3QgZHUgdm9uIFJvc2FsaW5lIGF1Y2ggZ2VzYWd0LiIKKworUm9tZW8gdWViZXJsZWd0ZSwgZGVubiBkaWVzZXIgRWlud2FuZCB3b2cgc2Nod2VyLiAiSmEsIGFiZXIgUm9zYWxpbmUgaGF0ICBtaWNoCituaWNodCB6dXJ1ZWNrZ2VsaWVidC4iCisKK0JydWRlciBMYXdyZW5jZSB3aWVndGUgYmVkYWVjaHRpZyBzZWluZW4gS29wZiBoaW4gdW5kIGhlci4gIkRhcyBpc3Qgd29obCB3YWhyLgorTmEsIGljaCB3ZXJkZSBldWNoIHZlcmhlaXJhdGVuLCB6dW1pbmRlc3Qgd2lyZCBlcyBldXJlbiBFbHRlcm4JaGVsZmVuLCAgaWhyZW4KK1N0cmVpdCB6dSBiZWdyYWJlbi4iCisKKyJXb3JhdWYgd2FydGVuIHdpciBkYW5uIG5vY2g/IiBSb21lbyBsaWVmIGVpbiBwYWFyICBTY2hyaXR0ZSAgYXVmICBkaWUgIGtsZWluZQorS2FwZWxsZSB6dS4KKworIkltbWVyIGxhbmdzYW0gbWl0IGRlbiBqdW5nZW4gUGZlcmRlbi4iIEVyIHdpc2NodGUgc2ljaCBkZW4gU2Nod2Vpc3MgIHZvbiAgZGVyCitTdGlybiB1bmQgYmVkYWNodGUgUm9tZW8gbWl0IGVpbmVtIGxhbmdlbiBCbGljay4gIk5laW4sIGp1bmdlICBIZW5nc3RlICBsYXVmZW4KK3NjaG5lbGwsIGVzIHNpbmQgZGllIGFsdGVuIFdhbGxhY2hlLCBkaWUgbmljaHQgaGludGVyaGVya29tbWVuLiIsICBrb3JyaWdpZXJ0ZQorZXIgc2ljaCB1bmQgbGFlY2hlbHRlLgorCmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL3JvbV9qdWwvc2VpdGUxMiBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvcm9tX2p1bC9zZWl0ZTEyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3OTg5NmYKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL3JvbV9qdWwvc2VpdGUxMgpAQCAtMCwwICsxLDI2NiBAQAorREVSIFpXRUlURSBBS1QKKwkgIERJRSBWSUVSVEUgU1pFTkUKKworTWVyY3V0aW8gem9nIGVpbiB1bndpbGxpZ2VzIEdlc2ljaHQuICJJY2ggZnJhZ2UgIG1pY2gsICB3byAgenVtICBUZXVmZWwgIFJvbWVvCitzdGVja3QuIExldHp0ZSBOYWNodCB3YXIgZXIgbmljaHQgZGFoZWltLiIKKworIkplZGVuZmFsbHMgbmljaHQgYmVpIHNlaW5lbSBWYXRlci4iLCBncmluc3RlIEJlbmV2b2xpby4KKworIkJlc3RpbW10ICBpc3QgIGVyICBkcmF1c3NlbiAgaGVydW1nZXJhbm50ICB1bmQgIGhhdCAgdWViZXIgICBkaWVzZSAgIFJvc2FsaW5lCitnZWphbW1lcnQuIiBNZXJjdXRpbyBzcHVja3RlIGRlbiBOYW1lbiByZWdlbHJlY2h0IGF1cy4KKworIkVzIGtvbW10IG5vY2ggc2NobGltbWVyLiIgQmVuZXZvbGlvIHp1ZWNrdGUgZWluIFRhc2NoZW50dWNoIHVuZCAgcHV0enRlICBzaWNoCit1bXN0YWVuZGxpY2ggZGllIE5hc2UuICJFcyBpc3QgZWluIEJyaWVmIHZvbiBUeWJhbHQgYW5nZWtvbW1lbi4iCisKKyJBY2ggIGR1ICBkaWNrZXIuLi4iICBNZXJjdXRpbyAgIHd1cmRlICAgYmxhc3MuICAgIkRhcyAgIGlzdCAgIGJlc3RpbW10ICAgZWluZQorSGVyYXVzZm9yZGVydW5nLiIKKworU2llIHdpc3NlbiwgIGxpZWJlICBMZXNlcmluLCAgbGllYmVyICBMZXNlciwgIGRhc3MgIGluCW15dGhpc2NoZXIgIFplaXQgIGVpbmUKK0hlcmF1c2ZvcmRlcnVuZyBuaWNodCBtZWhyIHdhciwgYWxzIGhldXRlIGVpbmUgRWlubGFkdW5nIHp1IGVpbmVtICBUZW5uaXNtYXRjaAordW50ZXIgIEZlaW5kZW4uICBOYXR1ZXJsaWNoICBsaWVmICBlcyAgbmljaHQgIGdhbnogIHNvCXVuYmx1dGlnICBhYiAgd2llICBlaW4KK1Rlbm5pc21hdGNoLCBkYWZ1ZXIgYWJlciBoYXR0ZW4gZGllIEJlc3RhdHR1bmdzdW50ZXJuZWhtZXIgbWVociB6dSB0dW4gdW5kIGRpZQorR2VyaWNodGUgbXVzc3RlbiBzaWNoICBuaWNodCAgbWl0ICBCZWxlaWRpZ3VuZ3NrbGFnZW4gIGF1c2VpbmFuZGVyc2V0emVuLiAgRWluCitmaW5kaWdlciBLb3BmIGVyZmFuZCBkYW5uIGlyZ2VuZHdhbm4gZGllICBSZWNodHNjaHV0enZlcnNpY2hlcnVuZyAgdW5kCXNvcmd0ZQorZGFmdWVyLCAgZGFzcyAgRHVlbGxlICB2ZXJib3RlbiAgd3VyZGVuLiAgV2lyICBzY2h1bGRlbiAgZGVtICBFcmZpbmRlcglkaWVzZXIKK1ZlcnNpY2hlcnVuZyAgYmlzICBoZXV0ZSAgRGFuaywgIGRlbm4gIGFuc29uc3RlbiAgd2FlcmVuICBkaWUJUHJhZW1pZW4gICBkZXIKK1N0ZXJiZWthc3NlbiB1bmQgTGViZW5zdmVyc2ljaGVydW5nZW4gd2VzZW50bGljaCBob2VoZXIuCisKK0JlbmV2b2xpbyBuaWNrdGUgYmVkYWVjaHRpZy4gIlJvbWVvIHdpcmQgaWhtIHNjaG9uICBlaW5lICBhbmdlbWVzc2VuZSAgQW50d29ydAorZGFyYXVmIGdlYmVuLiIKKworIlNvbGFuZ2UgZXMga2VpbmUgYW5tYXNzZW5kZSBpc3QuIiAgTWVyY3V0aW8gIHNjaHVldHRlbHRlICBkZW4gIEtvcGYuICAiRGllc2VyCitUeWJhbHQgbWFjaHQgbWlyIFNvcmdlbi4iCisKKyJBY2ggd2FzLCBUeWJhbHQgaXN0IGVpbiBhdWZnZWJsYXNlbmVyIElkaW90LiIKKworIlZpZWxsZWljaHQuIEFiZXIgYXVzc2VyZGVtIGlzdCBlciBub2NoIGVpbiB2ZXJkYW1tdCBndXRlciBGZWNodGVyLiIKKworIlJvbWVvIGF1Y2guIgorCisiTmljaHQgZ3V0IGdlbnVnLCBmdWVyY2h0ZSBpY2guIiBNZXJjdXRpbyBoYWV0dGVyIGdlcm5lIGVpbmUgIGJlc3NlcmUgIE1laW51bmcKK3ZvbiBkZW4gRmVjaHRrdWVuc3RlbiAgc2VpbmVzICBGcmV1bmRlcyAgZ2VoYWJ0LCAgaGF0dGUgIGplZG9jaCAgVHliYWx0ICBzY2hvbgora2FlbXBmZW4gc2VoZW4uCisKKyJLb21tLCBtYWxlIG5pY2h0IHNjaHdhcnplIExldXRlIGFuIHdlaXNzZSBXYWVuZGUuIiBCZW5ldm9saW8gd2VkZWx0ZSBtaXQgIGRlbgorSGFlbmRlbiwgYWxzIHdvbGxlICBlcgllaW5lbiAgTXVlY2tlbnNjaHdhcm0gIHZlcnNjaGV1Y2hlbi4gICJTaWVoc3QgIGR1PyAgU28KK3ZlcnRyZWliZSBpY2ggZGVpbmUgdHJ1ZWJlbiBHZWRhbmtlbi4iCisKKyJVbmQgaG9sc3QgUm9tZW8gZGFtaXQgaGVyLiIsIGxhZWNoZWx0ZSBNZXJjdXRpby4gIkhhbGxvIFJvbWVvLiAgTmEsICBXaWUgIHdhcgorZGVpbmUgTmFjaHQ/IiBFaW4gbHVlc3Rlcm5lcyBHcmluc2VuIGJyZWl0ZXRlIHNpY2ggdWViZXIgc2VpbiBHZXNpY2h0IGF1cy4KKworIkludGVyZXNzYW50LiIsIGFudHdvcnRldGUgUm9tZW8gdW5iZXN0aW1tdC4KKworIkRhcyBrYW5uIGljaCBkaXIgYW5zZWhlbiwgbWVpbiBGcmV1bmQuIiBCZW5ldm9saW8gc3RyaWNoIGRpZSB6ZXJ6YXVzdGVuIEhhYXJlCitzZWluZXMgQ291c2lucyB6dXJlY2h0LgorCisiSGFzdCB1bnMgamEgZ2FueiAgc2Nob2VuICByZWluZ2VsZWd0LCAgbWVpbiAgTGllYmVyLiIsICB3aWVzICBNZXJjdXRpbyAgUm9tZW8KK3p1cmVjaHQuCisKKyJIYWJlIGljaD8gRGFzIHR1dCBtaXIgbGVpZCwgYWJlciBpY2ggYmluIGltIE1vbWVudCBzbyBzY2hyZWNrbGljaC4uLiAgYWVoLi4uIgorRXIgdWViZXJsZWd0ZSB1bmQgZnVlZ3RlIGRhbm4gbWl0IGVpbmVtIEdyaW5zZW4gaGluenU6ICIuLi5zdHJhcGF6aWVydC4iCisKK01lcmN1dGlvIGxhY2h0ZS4gIkRlaW5lIFN0cmFwYXplbiBtb2VjaHRlIGljaCBoYWJlbiEiCisKKyJEYW5uIHdhZXJlc3QgZHUgZ2VuYXVzbyBtdWVkZSB3aWUgaWNoLiIgIFJvbWVvICByaWViICBzaWNoICB1ZWJlcnRyaWViZW4gIGRpZQorQXVnZW4uCisKKyJVbmQgaGFldHRlIHdpZSBkdSBBZWhubGljaGtlaXQgbWl0IGRlciBLYXR6ZSwgZGllIGRlbiBTYWhuZXRvcGYgYXVzZ2VzY2hsZWNrdAoraGF0LiIKKworIk5hY2hkZW0gZGllIEtvZWNoaW4gZGFzIFZlcmJyZWNoZW4gZW50ZGVja3QgaGF0LCBrYW5uc3QgZHUgbWVpbmUgUm9sbGUgIGdlcm5lCitoYWJlbi4iLCBtZWludGUgUm9tZW8gZ3JpbnNlbmQuCisKKyJEYXMgaXN0IHVuZmFpcjogRGllIFNhaG5lIGJla29tbXN0IGR1IHVuZCBpY2ggZGVuIEFlcmdlciBtaXQgZGVyIEtvZWNoaW4uIgorCisiQmVzc2VyIGRlbiBBZXJnZXIgYWxzIGRpZSBLb2VjaGluLiIgUm9tZW8gc2NodWV0dGVsdGUgc2ljaC4KKworIkJlc3NlciBkaWUgU2FobmUgYWxzIGJlaWRlcy4iICBNZXJjdXRpbyAgd2llZ3RlICBzaWNoICBpbiAgZGVuICBIdWVmdGVuLiAgIlNvCitnZWZhZWxsc3QgZHUgbWlyIHNjaG9uIGJlc3NlciwgUm9tZW8uIEdlc3Rlcm4gaGFzdCBkdSBub2NoIHppZW1saWNoIHRydWViZSBhdXMKK2RlciBXYWVzY2hlIGdlc2NoYXV0LiIgRXIgZ3JpbnN0ZSBicmVpdC4gICJVbmQgIGhldXRlICBuYWNodCAgaW4gIGRpZSAgV2Flc2NoZQoraGluZWluLCBuZWhtZSBpY2ggYW4uIgorCitSb21lbyB0cmF0IG5hY2ggTWVyY3V0aW8sIGdhYiBzaWNoIGFiZXIga2VpbmUgYmVzb25kZXJlIE11ZWhlLCBpaG4genUgdHJlZmZlbi4KKyJOaWNodHMgZGEsIGljaCBiaW4gYW5zdGFlbmRpZy4iCisKKyJOaWNodCwgZGFzcyBkdSBlcyBmcmVpd2lsbGlnIHdhZXJlc3QuIgorCisiUGZmdC4iLCBtYWNodGUgUm9tZW8gdW5kIHdhbmR0ZSBzaWNoIGFiLiBTZWluIEJsaWNrIGJsaWViIGF1ZiBQb2xseSAgaGFlbmdlbiwKK2RpZSBzaWNoIGlocmVuIFdlZyB1ZWJlciBkZW4gTWFya3RwbGF0eiBiYWhudGUgdW5kIGRhYmVpIGFuIGVpbiBTY2hsYWNodHNjaGlmZgordW50ZXIgdm9sbGVuIFNlZ2VsbiBnZW1haG50ZS4gVmVyc2NoYWVtdCBkZXV0ZXRlIGVyIG1pdCBkZW0gRmluZ2VyIGF1ZglQb2xseS4KKyJTdHJlaWNodCBkaWUgRmxhZ2dlLCBMZXV0ZSwgZGVyIEtvcnNhciB3aXJkIHVucyBlbnRlcm4uIgorCitNZXJjdXRpbyB2ZXJiYXJnIHNlaW4gR2VzaWNodCBoaW50ZXIgZGVuICBIYWVuZGVuLiAgIkJlbWFubnQgIGRpZSAgQm9vdGUsICBzaWUKK3JhbW10IHVucyEiCisKK0JlbmV2b2xpbyBsYWNodGUuICJEb3J0IGJsYWVzdCBlciEiCisKK0F6enVybyBzY2h1ZXR0ZWx0ZSBzaWNoLCBhbHMgZXIgd2llZGVyIGVpbm1hbCBlaW4gZnJlbWRlcyBaaXRhdCBob2VydGUsICBibGllYgorYWJlciBzdHVtbS4KKworIldhcyBzb2xsIGRlbm4gZGFzLCBCZW5ldm9saW8/IiBSb21lbyBlcmdyaWZmIGRpZSBOYXNlIHNlaW5lcyBDb3VzaW5zIG1pdCB6d2VpCitGaW5nZXJuLCB6b2cgc2VpbiBHZXNpY2h0IGRhcmFuIG5hY2ggb2JlbiB1bmQgYmVzY2hhdXRlIHNpY2ggc293b2hsIGRpZSBaYWVobmUKK2FscyBhdWNoIGRpZSBBdWdlbi4gIkJpc3QgZHUgc2ljaGVyLCBkYXNzIGR1IGdhbnogZ2VzdW5kIGJpc3Q/IgorCisiSGUhIiBCZW5ldm9saW8gZ2FiIFJvbWVvIGVpbmVuIFN0b3NzLiAiTGFzcyBkYXMsIGR1IHR1c3QgbWlyIHdlaC4iCisKKyJJY2ggd29sbHRlIGRvY2ggbnVyIG5hY2hzZWhlbiwgb2IgZGlyIGlyZ2VuZGV0d2FzIGZlaGx0LiIKKworIkRhIG9iZW4gZmVobHQgaWhtIG5pY2h0cy4iLCBiZWxlaHJ0ZSAgTWVyY3V0aW8gIHNlaW5lbiAgRnJldW5kLiAgIlNjaG9uICBlaGVyCitmZWhsdCBpaG0gdW50ZW4gZXR3YXMsIGFiZXIgZGFydWViZXIgc3ByZWNoZW4gYW5zdGFlbmRpZ2UgTWFlbm5lciBqYSBuaWNodC4iCisKKyJBbnN0YWVuZGlnZSBNYWVubmVyIGJlbnV0emVuIGVzIHVuZCBzY2h3ZWlnZW4uIiwgbWVpbnRlIFJvbWVvLgorCisiQW5zdGFlbmRpZ2UgTWFlbm5lciBicmF1Y2hlbiBlcyBuaWNodC4iIEJlbmV2b2xpbyByaWViIHNpY2ggZGllIE5hc2UuCisKKyJBcm1lciBCZW5ldm9saW8sIGhhdCBtYW4gZGlyIGRhcyB6dW0gVHJvc3QgIGVyemFlaGx0PyIgIE1lcmN1dGlvICB0YWV0c2NoZWx0ZQorQmVuZXZvbGlvcyBLb3BmLgorCisiU2llaCBhbiwgZGllIEdhbGVvbmUgaGF0IG5vY2ggZWluZSBTY2hhbHVwcGUgaW0gU2NobGVwcHRhdS4iLCBiZW1lcmt0ZSBSb21lby4KKworIkRpZSBTY2hhbHVwcGUgaXN0IHdvaGwgZGFzIFByb3ZpYW50c2NoaWZmLiIgQmVuZXZvbGlvIGhhdHRlIGRlbiBncm9zc2VuICBLb3JiCitiZW1lcmt0LCBkZXIgdWViZXIgUGV0ZXJzIEFybSBoaW5nIHVuZCBtaXQgIEdlbXVlc2UgIHZvbGxnZXN0b3BmdCAgd2FyLiAgUm9tZW8KK25pY2t0ZSwgZG9jaCBkYSBQb2xseSBudW4gYXVmIEhvZXJ3ZWl0ZSBoZXJhbmdla29tbWVuICB3YXIsICB6b2cgIGVyICBlcyAgdm9yLAorbmljaHQgbWVociB6dSBhbnR3b3J0ZW4gdW5kIHNpY2ggc3RhdHQgZGVzc2VuIHZvciBQb2xseSB6dSB2ZXJuZWlnZW4uCisKKyJHdXRlbiBNb3JnZW4uIiwgZ3J1ZXNzdGUgUG9sbHkuCisKKyJFaGVyIGd1dGVuIEFiZW5kLiIsIGdhYiBNZXJjdXRpbyB6dXJ1ZWNrLgorCisiV2llc28/IEVzIGlzdCBkb2NoIG5vY2ggZnJ1ZWggYW0gVGFnLiIKKworIkFiZXIgTWl0dGFnIGlzdCB2aWVsIHp1IHVuYW5zdGFlbmRpZywgZGVuIHVlYmVyZ2VodCBlaW5lICBEYW1lICBiZXNzZXIuICBXZW5uCitkZXIgWmVpZ2VyIHNvIGF1ZmdlcmljaHRldCBpc3QuLi4iIE1lcmN1dGlvIGxpZXNzIGRlbiBSZXN0IGRlcyBTYXR6ZXMgIGluICBkZXIKK0x1ZnQgaGFlbmdlbi4KKworIlBldGVyLCBtZWluIEZhZWNoZXIuIiwgdmVybGFuZ3RlIFBvbGx5IHVuZCBtYXNzIE1lcmN1dGlvIG1pdCBlaW5lbSBCbGljaywgZGVuCittYW4gbmljaHQgaW4gV29ydGVuIGJlc2NocmVpYmVuIGthbm4uCisKK0VoZXIgaXN0IGVzIG1vZWdsaWNoLCBNZXJjdXRpb3MgRW50c2V0emVuIHp1IGJlc2NocmVpYmVuLCAgYWxzCWVyICBkZW4gIEJsaWNrCithdWZmaW5nIHVuZCB0aWVmcm90IHd1cmRlLiBFciBlcmlubmVydGUgc2ljaCBwbG9ldHpsaWNoIGFuIGRlbiBUYWcsIGFuIGRlbSBpaG4KK3NlaW5lIGVpZ2VuZSBLaW5kZXJmcmF1IG1pdCBkZXIgSGFuZCBpbiBkZXIgIEhvc2UgIGVyd2lzY2h0ICBoYXR0ZS4gIFVtICBzZWluZQorVmVybGVnZW5oZWl0IHp1IHVlYmVyc3BpZWxlbiwgcmllZiBlcjogIkphd29obCwgUGV0ZXIsIGRlbiBGYWVjaGVyICBkZXIgIERhbWUsCitkZXIgRmFlY2hlciBpc3Qgd2FocnNjaGVpbmxpY2ggZWluIHNjaG9lbmVyZXIgQW5ibGljayBhbHMgZGFzIEdlc2ljaHQuIgorCitQb2xseSBrbmlmZiBkaWUgQXVnZW4genVzYW1tZW4sIHNhZ3RlIGFiZXIgbmljaHRzLgorCisiTmVobWVuICBTaWUgIGlobiAgbmljaHQgIHp1ICBlcm5zdC4iLCAgcmlldCAgUm9tZW8gIHVuZCAgIHZlcnN1Y2h0ZSwgICBQb2xseXMKK0F1Zm1lcmtzYW1rZWl0IHZvbiBNZXJjdXRpbyBhYnp1bGVua2VuLgorCitQb2xseSBzZXVmenRlLiAiS2FubiBlaW5lciB2b24gSWhuZW4gbWlyIHdvaGwgc2FnZW4sIHdvIGljaCBlaW5lbiBqdW5nZW4gIE1hbm4KK25hbWVucyBSb21lbyBmaW5kZT8iCisKKyJXZW5uIFNpZSBudXIgc2VpbmVuIFZvcm5hbWVuIHdpc3Nlbiwgd2lyZCBlciB2ZXJtdXRsaWNoICBlaW4gIEdyYXViYXJ0ICBzZWluLAorYmV2b3Igc2llIGlobiAgZ2VmdW5kZW4gIGhhYmVuLiIsICBtZWludGUgIFJvbWVvICBsYWVjaGVsbmQuICAiQWJlciAgd2VubiAgU2llCitlaW5zdHdlaWxlbiBtaXQgbWlyIFZvcmxpZWIgbmVobWVuIHdvbGxlbj8iCisKKyJOaWNodCwgZGFzcyBpY2ggZWluZSBWb3JsaWViZSBmdWVyIFNpZSBoYWV0dGUsICBuZWluLCAgYWJlciAgd2VubiAgU2llICBSb21lbworaGVpc3NlbiwgZGFubiBuZWhtZSBpY2ggU2llLiIKKworTWVyY3V0aW8gbWFjaHRlICJIYSEiLCB1bmQga3J1ZW1tdGUgc2ljaCBkYW5uIGluIGVpbmVtIEh1c3RlbmFuZmFsbCwgIGRlciAgaWhtCitzb2ZvcnQgdm9uIEJlbmV2b2xpbyBlaW4gcGFhciBrcmFlZnRpZ2UgU2NobGFlZ2UgYXVmIGRlbiBSdWVja2VuIGVpbnRydWcuCisKKyJBZWgsIGljaCBicmluZ2UgTWVyY3V0aW8genUgZGlyIG5hY2ggSGF1c2UsIFJvbWVvLCBlciBzb2xsdGUgZXR3YXMgdHJpbmtlbi4iCisKK0JlbmV2b2xpbyBnYWIgc2ljaCBhbGxlIGVyZGVua2xpY2hlIE11ZWhlLCBzZWluIEdlc2ljaHQgZXJuc3QgenUgaGFsdGVuLiAgIldpcgordHJlZmZlbiB1bnMgZGFubiBkYSB6dW0gTWl0dGFnZXNzZW4uIiBFciBiZXVndGUgc2ljaCAgYmVzb3JndCAgdWViZXIgIE1lcmN1dGlvCit1bmQgc2NobGVwcHRlIGRpZXNlbiBhdXMgUG9sbHlzIFJlaWNod2VpdGUuCisKKyJXYXMgd2FyIGRlbm4gZGFzIGZ1ZXIgZWluIEZsZWdlbD8iLCBmcmFndGUgUG9sbHkuCisKKyJXaWUgaWNoIHNjaG9uIHNhZ3RlLCBuZWhtZW4gU2llIGlobiBuaWNodCBmdWVyIHZvbGwuIFdhcyBrYW5uICBpY2ggIGZ1ZXIgIFNpZQordHVuPyIgUm9tZW8gaGF0dGUgc2VsYnN0IFByb2JsZW1lLCBuaWNodCB6dSBsYWNoZW4uCisKKyJBbHNvIHdpcmtsaWNoLiIgUG9sbHkgd2FyIGltbWVyIG5vY2ggIG5pY2h0ICBiZXJlaXQsICBNZXJjdXRpb3MgIEJlbmVobWVuICB6dQordmVyZ2Vzc2VuLiAiV2llIGthbm4gZXIgc2ljaCBudXIgc28gZ2VnZW4gZWluZSBEYW1lIHZlcmhhbHRlbi4gQWxzIG9iIGljaCBlaW5lCitIZXJnZWxhdWZlbmUgd2FlcmUsIG1pdCBkZXIgZXIgbWFjaGVuICBrYW5uLCAgd2FzICBlciAgd2lsbC4iICBJaHJlICBFbXBvZXJ1bmcKK3NjaGx1ZyBpbiBXdXQgZ2VnZW4gUGV0ZXIgdW0gdW5kIHNpZSBzY2hsdWcgbWl0IGlocmVtIEZhZWNoZXIgbmFjaCAgaWhtLiAgIlVuZAorZHUgc3RlaHN0IGRhYmVpIHVuZCBoYWVsc3QgTWF1bGFmZmVuIGZlaWwsICB3YWVocmVuZCAgZGVyICBLZXJsICBtaXIgIHp1ICBuYWhlCit0cml0dC4iCisKK1BldGVyIHJpZWIgc2ljaCBkaWUgU3RlbGxlIGFuIHNlaW5lbSBBcm0sIGRpZSBQb2xseSBnZXRyb2ZmZW4gaGF0dGUuICJJY2ggIGhhYgorbml4IGdlc2VoZW4sIGhhYiBpY2ggbmljaC4gSXMgamEgbmljaCwgYWxzIHdhZXIgaWNoIG5pY2ggIGRpcmVrdCAgZGFiZWksICB3ZW5uCittYW4gSWhuZW4gdWViZXJoYXVwdCB6dSBuYWgga29tbWVuIGtvZW5udC4iIFNlaW4gQmxpY2sgcnVodGUgZWluZW4gIEF1Z2VuYmxpY2sKK2ludGVyZXNzaWVydCBhdWYgUG9sbHlzIHN0YXR0bGljaGVyIEZpZ3VyLiAiQWJlciBkZXIgSnVuZyBpcyBpaG5lbiBuaWNoIHp1IG5haAorZ2Vrb21tZW4sIGlzIGVyIG5pY2guIiBFciBuaWNrdGUgbm9jaCBlaW5tYWwgenVyIEJla3JhZWZ0aWd1bmcgIHVuZCAgendpbmtlcnRlCitSb21lbyB6dSwgZGVyIHNpY2ggdW1zdGFlbmRsaWNoIGRpZSBOYXNlIHB1dHp0ZSB1bmQgc2VpbiBHcmluc2VuIGhpbnRlciBzZWluZW0KK1Rhc2NoZW50dWNoIHZlcmJhcmcuCisKK1BvbGx5IGJldHJhY2h0ZXRlIFBldGVyIG5hY2hkZW5rbGljaCwgd2FuZHRlIHNpY2ggZGFubiBhYmVyIFJvbWVvICB6dS4JIkFsc28sCitqdW5nZXIgTWFubi4gU2llIHdpc3NlbiwgZGFzcyBKdWxpYSBtaWNoIHNjaGlja3QuIEljaCBzYWdlIElobmVuIGpldHp0CW5pY2h0LAord2FzIHNpZSBtaXIgZ2VzYWd0IGhhdCwgb2J3b2hsIGljaCBlcyBuaWNodCB2ZXJnZXNzZW4gaGFiZSwgZGVubiBpY2ggIHZlcmdlc3NlCituaWUgZXR3YXMuIEF1Y2ggIGRpZSAgQmVsZWlkaWd1bmdlbiAgZGllc2VzICBGbGVnZWxzICBuaWNodCwgIGRlciAgc28gIHNjaG5lbGwKK3ZlcnNjaHd1bmRlbiBpc3QsIG9obmUgc2ljaCB6dSBlbnRzY2h1bGRpZ2VuLiBXZW5uIFNpZSBlaW4gIGFuc3RhZW5kaWdlciAgTWFubgorc2luZCwgdW5kIGRhcyBob2ZmZSBpY2ggZnVlciBTaWUsIGRlbm4gYW5zb25zdGVuIGJla29tbWVuIFNpZSBlcyAgbWl0ICBtaXIgIHp1Cit0dW4sIGRhbm4gcmF0ZSBpY2ggSWhuZW4sIG1pciB6dSBzYWdlbiwgd2llIElocmUgQWJzaWNodGVuIHNpbmQuICBHbGF1YmVuICBTaWUKK21pciwgaWNoIHdlcmRlIEp1bGlhIHRyb2VzdGVuLCB3ZW5uIFNpZSBtaXQgaWhyIGVpbiAgZmFsc2NoZXMgIFNwaWVsICB0cmVpYmVuLAorYWJlciBTaWUgd2VyZGVuIHNpY2ggaW4gZGllc2VtIEZhbGwgd3VlbnNjaGVuLCBzaWUgaGFldHRlbiBlcyBuaWUgIGFuZ2VmYW5nZW4uCitBbHNvLCB3YXMgc2FnZW4gU2llPyIKKworUm9tZW8gdWViZXJsZWd0ZSBuaWNodCBsYW5nZS4gIldlbm4gU2llIG1pY2ggc28gZnJhZ2VuLCBkYW5uIGxhc3NlbiAgU2llICBtaWNoCitlcmtsYWVyZW4sIGRhc3MuLi4iCisKK1BvbGx5ICBrbGF0c2NodGUgIGluICBkaWUgIEhhZW5kZSAgdW5kCWJlb2JhY2h0ZXRlICBiZWZyaWVkaWd0LCAgIHdpZQkgUm9tZW8KK3p1c2FtbWVuenVja3RlLgorCisiR3V0LCBkYXMgaXN0IHNlaHIgZ3V0LCBkYSB3aXJkIG1laW4gTGFlbW1jaGVuIGF1c3NlciBzaWNoIHNlaW4gdm9yIEdsdWVjay4iCisKKyJJY2ggZ2xhdWJlLCBTaWUgaG9lcmVuIG1pciBuaWNodCB6dS4iCisKKyJXaWVzbz8gSWNoIGhhYmUgYWxsZXMgZ2Vob2VydCwgd2FzIGljaCBob2VyZW4gbXVzcy4gT2RlciBoYWJlbiBTaWUgZXR3YSBuaWNodAorZ2VzYWd0LCBkYXNzIFNpZSBzaWNoIGVya2xhZXJlbj8gU293ZWl0IGljaCB3ZWlzcywgc2FndCBlaW4gYW5zdGFlbmRpZ2VyICBNYW5uCitkb2NoLCBkYXNzIGVyIHNpY2ggZXJrbGFlcnQuIFdpZSBhdWNoIGltbWVyLCB3ZW5uICBTaWUJc2ljaCAgZXJrbGFlcmVuLCAgZGFubgoraGFiZW4gU2llIGxhdXRlcmUgQWJzaWNodGVuLCBhbHNvIGdlYmUgaWNoIG1pY2ggenVmcmllZGVuLiIKKworIkRhLCBqZXR6dCBnaWJ0IGVzIGtlaW5lbiBXZWcgenVydWVjay4iIFVsbyBncmluc3RlIGJvZXNlLgorCitBenp1cm8gc2NodWV0dGVsdGUgYmVkYXVlcm5kIGRlbiBLb3BmIHVuZCBzY2h3aWVnLgorCitBbHMgUm9tZW8gZGllIEJlZGV1dHVuZyB2b24gUG9sbHlzIFdvcnRlbiBkYWVtbWVydGUsIHd1cmRlIGVyLCBzb3ZpZWwgc29sbCAgenUKK3NlaW5lciBFaHJlbnJldHR1bmcgZ2VzYWd0IHNlaW4sIG51ciAgZnVlciAgZWluZW4gIGt1cnplbiAgTW9tZW50ICBibGVpY2guICBFcgorcmFldXNwZXJ0ZSBzaWNoLiAiTmEgIGd1dC4gIEJpdHRlbiAgU2llICBKdWxpYSwgIGhldXRlICBOYWNobWl0dGFnICB6dSAgQnJ1ZGVyCitMYXdyZW5jZSB6dSBrb21tZW4sIGRvcnQgd2VyZGVuIHdpciBoZWlyYXRlbi4iIEVyIGdydWIgaW4gc2VpbmVuICBUYXNjaGVuICB1bmQKK2ZvZXJkZXJ0ZSBlaW4gcGFhciBNdWVuemVuIHp1dGFnZSwgZGllIGVyIFBvbGx5IGluIGRpZSBIYW5kIGRydWVja3RlLiAiVW5kIGRhcworaXN0IGZ1ZXIgU2llLiIKKworIk5laW4sIGRhbmtlLiBJY2ggbmVobWUga2VpbiBHZWxkIGRhZnVlciwgZGFzcyBpY2ggSnVsaWEgZWluZW4gR2VmYWxsZW4gIHR1ZS4iCitBenp1cm8gZmxvZyBlaW5lIFJ1bmRlIHVtIFJvbWVvcyBLb3BmICB1bmQgIGZsdWVzdGVydGUJbGVpc2U6CSJEZW5rICBhbiAgZGllCitIb2NoemVpdHNuYWNodCwgZGFzIGlzdCBkb2NoIGRhcyBCZXN0ZSBhbSBIZWlyYXRlbi4iCisKK1JvbWVvcyBHZXNpY2h0IGxldWNodGV0ZSBhdWYuICJOYSBndXQsIGRhbm4gbmVobWVuIFNpZSAgZXMgIGRhZnVlciwgIGRhc3MgIFNpZQord2FlaHJlbmQgZGVyICBUcmF1dW5nICBpbiAgTGF3cmVuY2VucyAgR2FydGVuICBzdGVoZW4gIHVuZCAgZWluZSAgU3RyaWNrbGVpdGVyCitlbnRnZWdlbiAgIG5laG1lbi4iICAgUG9sbHkgICB3dXJkZSAgIHB1dGVycm90LiAgICJBaCwgICBpY2ggICB2ZXJzdGVoZSwgICBkaWUKK0hvY2h6ZWl0c25hY2h0LiIgIFJhc2NoICB2ZXJiYXJnICBzaWUgIGlociAgR2VzaWNodCAgaGludGVyICBkZW0gIEZhZWNoZXIgIHVuZAora2ljaGVydGUuICJFaW52ZXJzdGFuZGVuLiIgUG9sbHkgYmxpY2t0ZSB6dSBQZXRlciB1bmQgcnVuemVsdGUgZGllIFN0aXJuLiAiSG0sCit3ZXIgd2lyZCBkaWUgTGVpdGVyIGRlbm4gYnJpbmdlbj8gSWNoIG1laW5lLCAgd2lyZCAgZGVyamVuaWdlICBhdWNoICBzY2h3ZWlnZW4KK2tvZW5uZW4/IgorCisiQmVzdGltbXQsIGRhZnVlciB3ZXJkZSBpY2ggc29yZ2VuLiIgUm9tZW8gbGFlY2hlbHRlLgorCisiRGFubiBpc3QgZXMgamEgZ3V0LiBUamEsIGRhcmFuIGhhYmUgaWNoIG5pY2h0IGdlZGFjaHQsIGFscyBzaWUgYWxzICBLaW5kICBhdWYKK2RpZSBOYXNlIGZpZWwgdW5kIG1laW4JTWFubiAgR290dC1oYWItaWhuLXNlbGlnICBzYWd0ZS4uLiIgIFBvbGx5ICB1bnRlcmJyYWNoCitzaWNoLiAiQWNoIGphLCBkYSBnaWJ0IGVzIG5vY2ggZWluZW4ganVuZ2VuIE1hbm4sIGRlciBnZXJhZGUgIHp1ICBCZXN1Y2ggIGlzdC4KK1BhcmlzIGhlaXNzdCBlciwgdmllbGxlaWNodCBoYWJlbiBTaWUgc2Nob24gdm9uIGlobSBnZWhvZXJ0PyBFciBtYWNodCBnYW56IGRlbgorRWluZHJ1Y2ssIGFscyBoYWV0dGUgZXIgTHVzdCwgc2ljaCBiZWkgSnVsaWEgZWluenVuaXN0ZW4gdW5kICB3ZW5uICBlcglzb3dlaXQKK2lzdCBhdWNoIGdsZWljaCBiZWkgaWhyZW0gVmF0ZXIuIEltIEdlbGRiZXV0ZWwsIHdlbm4gU2llICB2ZXJzdGVoZW4sICB3YXMgIGljaAorbWVpbmUuIFdhcyBkZW5rZW4gU2llLCB3aWUgbmllZGxpY2ggYmxhc3MgSnVsaWEgd2lyZCwgd2VubiAgaWNoICBzaWUgIGF1ZnppZWhlCit1bmQgaWhyIHNhZ2UsIGRhc3MgIFBhcmlzICBlaW4JYmVzc2VyZXIgIE1hbm4JaXN0ICBhbHMgIFNpZT8iICBQb2xseSAgZ2Vub3NzCitzaWNodGxpY2ggUm9tZW9zIHZlcndpcnJ0ZW4gR2VzaWNodHNhdXNkcnVjay4gIlNpZSAgd2lsbCAgc28gIGdhciAgbmljaHRzICB2b24KK2VpbmVtIGFuZGVyZW4gTWFubiBob2VyZW4gdW5kIHNpZWh0IHdpcmtsaWNoIGFsbGVybGllYnN0IGF1cywgIHdlbm4gIHNpZSAgc2ljaAordWViZXIgbWljaCBhZXJnZXJ0LiIKKworIkFlaCwgamE/IgorCisiSmEsIGRhcyB0dXQgc2llLiBVbmQgbWVociBub2NoLCBTaWUgd3VlcmRlbiBJaHJlIGhlbGxlICBGcmV1ZGUgIGRhcmFuICBoYWJlbiwKK3dlbm4gU2llIGhvZXJlbiBrb2VubnRlbiwgd2llIHNpZSBpaHJlbSBIdW5kIHZvbiBJaG5lbiBlcnphZWhsdC4gR2FueiBuaWVkbGljaAorcm9sbHQgc2llIGRhYmVpIGRhcyAgUglpbiAgSWhyZW0gIE5hbWVuICB1bmQgIG1hY2h0ICBkYWJlaSAgZGFzICBLbnVycmVuICBkZXMKK0h1ZW5kY2hlbnMgbmFjaC4iIFJvbWVvIHpvZyBlcyB2b3IsICBuaWNodCAgd2VpdGVyICB1ZWJlciAgZGllICBBZWhubGljaGtlaXRlbgorendpc2NoZW4gc2VpbmVtIE5hbWVuIHVuZCBkZW0gS251cnJlbiBlaW5lcyBTY2hvc3NodWVuZGNoZW5zIG5hY2h6dWRlbmtlbiAgdW5kCitsYWVjaGVsdGUgbm9jaCBlaW4gTWFsIG1pdCBlcnp3dW5nZW5lcglGcmV1bmRsaWNoa2VpdC4gICJXaWUgIGRlbSAgYXVjaCAgc2VpLgorQml0dGUgcmljaHRlbiBTaWUgSnVsaWEgbWVpbmUgR3J1ZXNzZSBhdXMuIgorCisiTWVociBuaWNodD8iCisKKyJNZWhyIHNhZ2UgaWNoIGlociBkYW5uIGhldXRlIE5hY2h0LCBuYWNoZGVtIHdpciB2ZXJoZWlyYXRldCBzaW5kLiIKKworV2llZGVyIHd1cmRlIFBvbGx5IHJvdC4gIk9oLiIKKwpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9yb21fanVsL3NlaXRlMTMgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL3JvbV9qdWwvc2VpdGUxMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzA1OTkyCi0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9yb21fanVsL3NlaXRlMTMKQEAgLTAsMCArMSwxMjIgQEAKK0RFUiBaV0VJVEUgQUtUCisJICBESUUgRlVFTkZURSBTWkVORQorCitVbG8gdW5kIEF6enVybyBoYXR0ZW4gc2ljaCBpbSBHYXJ0ZW4gZGFtaXQgdmVyZ251ZWd0LCBKdWxpYSB6dSBiZW9iYWNodGVuLgorCisiSWNoIHNpdHplIHdpZSBhdWYgS29obGVuLiIsIGJla2xhZ3RlIHNpY2ggSnVsaWEgYmVpIFVsby4KKworIktyYWguIiwgbWFjaHRlbiBVbG8gdW5kIEF6enVybyB3aWUgYXVzIGVpbmVtIFNjaG5hYmVsLgorCitWZXJ3aXJydCBibGlja3RlIEp1bGlhIHp1IGlobmVuIGhvY2guICJMZXR6dGUgTmFjaHQga29ubnRldCAgaWhyICByZWRlbi4iICBTaWUKK3p1Y2t0ZSBkaWUgU2NodWx0ZXJuLiAiQWJlciBsZXR6dGUgTmFjaHQgd2FyIGphIG9obmVoaW4gbmljaHRzIHNvLCB3aWUgZXMgc2Vpbgorc29sbHRlLiBBbGxlcyB3YXIgIGdhbnouLi4iICBTaWUgIHpvZWdlcnRlLiAgIi4uLmdhbnogIHZlcnphdWJlcnQuIiAgU2ljaHRsaWNoCitlcmZyZXV0IHVlYmVyIGlocmUgcG9ldGlzY2hlIFdvcnR3YWhsIHJpZWYgc2llIGlocmVuICBIdW5kICB1bmQgIHNwaWVsdGUgIGVpbmUKK1plaXQgbGFuZyBtaXQgaWhtLiAiUG9sbHkgbWFjaHQgbWljaCBub2NoIGdhbnogdmVycnVlY2t0LiIsIGtsYWVydGUgSnVsaWEgIGRlbgorSHVuZCBhdWYuICJLYW5uc3QgZHUgZGlyIHZvcnN0ZWxsZW4sIGRhc3Mgc2llICBmdWVyICBlaW5lbiAgc2ltcGxlbiAgQm90ZW5nYW5nCitkcmVpIFN0dW5kZW4gYnJhdWNodD8iCisKK1N0YXR0IGVpbmVyIEFudHdvcnQgcm9sbHRlIHNpY2ggZGVyIEh1bmQgYXVmIGRlbiBSdWVja2VuIHVuZCB0YXQsIHdhcyBIdW5kZSBhbQorYmVzdGVuIGtvZW5uZW46IEVyIGhlY2hlbHRlLgorCitIdW5kZSwgbGllYmUgTGVzZXJpbiwgbGllYmVyICBMZXNlciwgIGdlaG9lcmVuCWluICBlaW5lICBHZXNjaGljaHRlICB3aWUgIGRlcgordW5zZXJlbiBlaW5mYWNoIGRhenUuIFNpZSBzaW5kIGRhcyBTYWx6IGluIGRlciBTdXBwZS4KKworV2VyICBqZW1hbHMgIExpZWJlc2t1bW1lciAgaGF0dGUsICB3ZWlzcyAgZGllICBHZXNlbGxzY2hhZnQgIGVpbmVzICBIdW5kZXMgIHp1CitzY2hhZXR6ZW4sIGRlbm4gbWl0IGlocmVuIHNlZWxlbnZvbGxlbiBicmF1bmVuIEF1Z2VuIGhhZW5nZW4gIHNpZSAgZ2ViYW5udCAgYW4KK2RlbiBMaXBwZW4gaWhyZXMgRnJhdWNoZW5zIG9kZXIgSGVycmNoZW5zIHVuZCBzY2hlaW5lbiB3YWhyaGFmdGlnICBqZWRlcyAgV29ydAorenUgdmVyc3RlaGVuLiBEaWVzIGlzdCBzZWxic3R2ZXJzdGFlbmRsaWNoIGVpbglUcmljaywJbWl0ICBkZW0gIEh1bmRlICBpaHJlbgorTWVuc2NoZW4gZGF6dSBicmluZ2VuLCBpaG5lbiBlaW5lbiBiZXNvbmRlcnMgc2Nob2VuZW4gS25vY2hlbiAgenUgIHNwZW5kaWVyZW4uCitEZW5ub2NoIGZhbGxlbiB3aXIgTWVuc2NoZW4gaW1tZXIgd2llZGVyICBhdWYgIEh1bmRlICBoZXJlaW4sICBkZW5uICB3aXIgIHNpbmQKK2xlaWNodCB6dSBkb21lc3RpemllcmVuLgorCitEaWUgZ2FuemUgVGllcndlbHQgem9sbHQgZGVuIEh1bmRlbiBmdWVyIGlocmVuIEVyZm9sZyAgbWl0ICBkZXIgIFphZWhtdW5nICBkZXMKK01lbnNjaGVuIGdyb3NzZW4gUmVzcGVrdC4gRGllIGVpbnppZ2VuIFRpZXJlLCBkaWUgZGVuICBIdW5kZW4gIGRpZXNlICBMZWlzdHVuZworYWJzcHJlY2hlbiwgIHNpbmQgIGRpZQlLYXR6ZW4sICBkb2NoICBkYXMgIGxpZWd0ICBlaGVyICBkYXJhbiwgIGRhc3MJS2F0emVuCitwcmluemlwaWVsbCBuaWVtYW5kZW4gcmVzcGVrdGllcmVuLiBKdWxpYSB0YWV0c2NoZWx0ZSBpaHJlbSBIdW5kIGdlaG9yc2FtICBkZW4KK0JhdWNoLiAiV2VubiBQb2xseSBibG9zcyBzY2huZWxsZXIgd2FlcmUuIEljaCBoYWx0ZSBlcyBrYXVtIG5vY2ggYXVzLiIKKworRGFzICBLbmFyemVuICB1bmQgIFF1aWV0c2NoZW4gIGRlcyAgR2FydGVudG9yZXMgIGdhYiAgZGllICBBbmt1bmZ0ICAgd2ljaHRpZ2VyCitOZXVpZ2tlaXRlbiBiZWthbm50LCBub2NoIGJldm9yIFBvbGx5IGhpbmR1cmNoIHRyYXQuIEp1bGlhIHNwcmFuZyBhdWYgd2llICB2b24KK2VpbmVyIEJyZW1zZSBnZXN0b2NoZW4gdW5kIHJhbm50ZSBhdWYgUG9sbHkgenUuICJQb2xseSwgbGllYmUgUG9sbHkhICBOYSwgIHNhZworc2Nob24sIHdhcyBoYXQgZXIgIGdlc2FndD8gIFdhcyAgc29sbCAgaWNoICBtYWNoZW4/ICBIYXN0ICBkdSAgaWhuICB1ZWJlcmhhdXB0CitnZXRyb2ZmZW4/IFJlZCBkb2NoISIKKworUG9sbHkgc2NobmF1ZnRlLiAiTnVuIG1hbCBsYW5nc2FtLiBTZXR6IGRpY2ggbGllYmVyIGVyc3QgZWlubWFsIGhpbi4iCisKKyJJY2gga2FubiBtaWNoIG5pY2h0IHNldHplbiwgYmV2b3IgZHUgbWlyIG5pY2h0IGdlc2FndCBoYXN0LCB3YXMgbG9zIGlzdC4iCisKKyJVbmQgaWNoIGthbm4gZGlyIG5pY2h0cyBzYWdlbiwgc29sYW5nZSBpY2ggbm9jaCBzbyAgYXVzc2VyICBBdGVtICBiaW4uICBKZXR6dAorc2V0eiBkaWNoIGhpbiwgZHUgbWFjaHN0IG1pY2ggdmVycnVlY2t0LiBXaWUgc29sbCBpY2ggZGVubiBMdWZ0IGhvbGVuIGtvZW5uZW4sCit3ZW5uIER1IHNvIGhlcnVtc3ByaW5nc3Q/IgorCitKdWxpYSBiZXRyYWNodGV0ZSBpaHJlIEFtbWUga3JpdGlzY2guICJTbyBzZWhyIGthbm5zdCBkdSBkb2NoIGdhciBuaWNodCBhdXNzZXIKK0F0ZW0gc2Vpbiwgd2VubiBkdSBtaXIgc2FnZW4ga2FubnN0LCBkYXNzIGR1IGF1c3NlciBBdGVtIGJpc3QuIgorCisiRGFzIHZlcnN0ZWhzdCBkdSBub2NoIG5pY2h0LiIgUG9sbHkgaG9sdGUgdGllZiBMdWZ0IHVuZCBkb25uZXJ0ZTogIlNldHogIGRpY2gKK2hpbiEiIEp1bGlhIHBsdW1wc3RlIGlucyBHcmFzLgorCisiU28gZG9jaCBuaWNodCwgZHUgbWFjaHN0IGphIEZsZWNrZW4gaW4gZGVpbiAgS2xlaWQuIiAgUG9sbHkgIHNldWZ6dGUuICAiS2luZCwKK0tpbmQsIHdpcnN0IGR1IGRlbm4gbmllIGVyd2FjaHNlbj8iCisKK1dvcnRsb3Mgc3RhbmQgSnVsaWEgYXVmIHVuZCBsaWVzcyBzaWNoIGF1ZiBlaW5lciBCYW5rIG5pZWRlci4gICJKZXR6dCAgYmVzc2VyPworS2FubnN0IGR1IGpldHp0IGVuZGxpY2ggcmVkZW4/IgorCitQb2xseSBsYWVjaGVsdGUuICJKYSwgamV0enQga2FubiBpY2ggcmVkZW4uIERhIGhhc3QgZHUgZGlyIGphICBlaW5lbiAgc2Nob2VuZW4KK0dhbGFuIGF1c2dlc3VjaHQsIEp1bGlhLiBBbHNvLCBpY2ggd2lsbCBpaG4gamEgbmljaHQgc2NobGVjaHRlciBtYWNoZW4gYWxzICBlcgoraXN0LCBhYmVyIGljaCBtdXNzIHNjaG9uIHNhZ2VuLCBlciBoYXQgZWluIHBhYXIgIHNlaHIgIHVuZXJmcmV1bGljaGUgIEZyZXVuZGUuCitPYndvaGwgZXIgZWluZW4ga25hY2tpZ2VuIC4uLiBHZWlzdCBoYXQuIEtuYWNraWcgaW0gU2lubmUgdm9uIGZyaXNjaCwgd2VubiAgZHUKK3ZlcnN0ZWhzdCwgd2FzIGljaCBtZWluZS4gRXIgaXN0IG5vY2ggbmljaHQgZ2FueiB0cm9ja2VuLiAgSGludGVyICBkZW4JT2hyZW4uCitTbywgamV0enQgZXJ6YWVobCBhYmVyLCB3YXMgZHUgaGV1dGUgZ2VmcnVlaHN0dWVja3QgaGFzdC4iCisKK1VsbyBncmluc3RlIGJyZWl0IGF1ZiAgaWhyZW0gIEFzdC4gICJQb2xseSAgdmVyc3RlaHQgIGVzICB3aXJrbGljaCwgIEp1bGlhICB6dQordHJpZXplbi4iCisKK0F6enVybywgIGRlciAgZmFzemluaWVydCAgYXVmICBQb2xseXMgIHJvdGVzICBHZXNpY2h0ICBibGlja3RlCXVuZCAgYXVmICAgZGVuCitTY2hsYWdhbmZhbGwgd2FydGV0ZSwgbmlja3RlIG51ci4KKworSnVsaWEsIGRpZSB3dXNzdGUsIHdhcyBQb2xseSBiZWFic2ljaHRpZ3RlLCBzZXVmenRlIHRpZWYuICJEYXMgd2Vpc3MgIGljaCAgdW5kCituaWNodHMuIgorCisiTmljaHRzPyBLaW5kLCBkdSBmYWVsbHN0IG1pciBqYSBnYW56IHZvbSBGbGVpc2NoLiBEYXMgIGlzdCAgYWJlciAgbmljaHQgIGd1dCwKK3dlbm4gUm9tZW8gc2ljaCBhbiBkaXIgYmxhdWUgRmxlY2tlbiBob2x0LiIKKworSnVsaWEgc2V0enRlIGVpbiB1bnNjaHVsZGlnZXMgR2VzaWNodCBhdWYuICJIb2x0IGVyIHNpY2ggZGVubiBibGF1ZSBGbGVja2VuPyIsCitmcmFndGUgc2llIHNjaGVpbmhlaWxpZy4KKworQXp6dXJvIG5pY2t0ZS4gIlR1dCBlci4iCisKK1BvbGx5IGtuaWZmIEp1bGlhIGluIGRpZSBTZWl0ZS4gIkFsc28sIHdlbm4gZHUgZXMgZ2VuYXUgd2lzc2VuIHdpbGxzdC4uLiIKKworIkphPyIKKworIkFsc28sIGRlaW4ganVuZ2VyIEZyZXVuZCBzYWd0LCBzbyB3aWUgZXMgZWluIGFuc3RhZW5kaWdlciBNYW5uIHNhZ2VuICBzb2xsdGUsCit3ZW5uIGVyIGF1ZiBzaWNoIGhhZWx0IHVuZCBhdXNzZXJkZW0gbm9jaCBkaWUgQ2hhbmNlIHNlaW5lcyBMZWJlbnMgIGJla29tbXQuLi4KK1dvIGlzdCBlaWdlbnRsaWNoIGRlaW5lIE11dHRlcj8iCisKKyJBbHNvLCBQb2xseSwgZGFzIGlzdCBqYSBudW4gc2ljaGVybGljaCBuaWNodCBzZWluZSAgQW50d29ydCwgIG9kZXI/ICAnV28gIGlzdAorZGVpbmUgTXV0dGVyJyIgSnVsaWEgc2NodWV0dGVsdGUgZGVuIEtvcGYuCisKKyJEdSBsaWViZXMgYmlzc2NoZW4sIGR1IGJpc3QgZ2FueiBzY2hvZW4gaGVpc3MuIEF1ZiBkaWUgIEFudHdvcnQsICBtZWluZSAgaWNoLgorV2VubiBkdSB2ZXJzdGVoc3QsIHdhcyBpY2ggbWVpbmUuIEFsc28sIGVyIHNhZ3QsIGdhbnogdW5kIGdhci4uLiIKKworVWxvIHN0b2VobnRlIG1pdCBKdWxpYSBpbSBDaG9yLgorCisiRHUgc29sbHN0IGhldXRlIG5hY2htaXR0YWcgaW4gZGllIEthcGVsbGUgZGllc2VzIE1pbm9yaXRlbiAga29tbWVuLiAgTGF3cmVuY2UKK2hlaXNzdCBlci4gVW5kIGRhIGJla29tbWUgaWNoIGVpbmVuIFJpbmcgdW5kIGR1IGVpbmUgTGVpdGVyLiIgU2llICBzY2h1ZXR0ZWx0ZQorZGVuIEtvcGYuICJOZWluLCB1bWdla2VocnQ6IER1IGJla29tbXN0IGRlbiBSaW5nIHVuZCBpY2ggZGllIExlaXRlciAgZnVlciAgZGllCitIb2NoemVpdHNuYWNodC4iCisKK0p1YmVsbmQgaHVlcGZ0ZSBKdWxpYSB1bSBQb2xseSBoZXJ1bSB1bmQgem9nIHVlYmVybXVldGlnIGFuICBBenp1cm9zICBTY2h3YW56LgorSWhyIEh1bmQsIGRlciBpaHJlIEZyZXVkZSBtaXNzdmVyc3RhbmQsIGtuaWZmIFBvbGx5IGluIGRpZSBXYWRlICB1bmQgIGhhbmRlbHRlCitzaWNoIGVpbmVuIFRyaXR0IGVpbi4KKworQXVmIFBvbGx5cyB2ZXJ3aXR0ZXJ0ZXMgR2VzaWNodCBzdGFobCBzaWNoIGVpbiBMYWVjaGVsbi4gIlNpZWh0IGdhbnogIHNvICBhdXMsCitLaW5kLCBhbHMgZmllbGVzdCBkdSBnbGVpY2ggYXVmIGRlbiBSdWVja2VuLiIKKworIkVyc3QgaGV1dGUgYWJlbmQuIiwgdmVyc2V0enRlIEF6enVyby4KKworIkhhdXB0c2FjaGUsICBzaWUgIGZhZWxsdC4iICBQb2xseSAgZ3JpbnN0ZSAgdW5kICBpaHJlICBXYW5nZW4gIGJla2FtZW4gIGVpbmVuCittYWVkY2hlbmhhZnQgcm9zaWdlbiBTY2hpbW1lci4gIkFlaCwgbmljaHQgaGVyZWluLCBtZWluZSBpY2ggbmF0dWVybGljaC4iCisKKyJOYXR1ZXJsaWNoLiIsIHN0aW1tdGUgQXp6dXJvIHp1IHVuZCBzY2hhZmZ0ZSBlcywgdm9lbGxpZyBlcm5zdCB6dSBibGVpYmVuLgorCmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL3JvbV9qdWwvc2VpdGUxNCBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvcm9tX2p1bC9zZWl0ZTE0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNmNhMWMKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL3JvbV9qdWwvc2VpdGUxNApAQCAtMCwwICsxLDkzIEBACitERVIgWldFSVRFIEFLVAorCSAgRElFIFNFQ0hTVEUgU1pFTkUKKworSW4gamVuZXIgbXl0aGlzY2hlbiBaZWl0IHdhcmVuIGhlaW1saWNoZSBIb2NoemVpdGVuIG5pY2h0IHNlbHRlbiwgIHNpZQloYXR0ZW4KK2RlbiBWb3J0ZWlsLCBkYXNzIGRhcyBQYWFyIG5pY2h0ICB6dXNhbW1lbiAgbGVidGUuICBOYXR1ZXJsaWNoCWVyc3BhcnRlICBlaW5lCitoZWltbGljaGUgIEhvY2h6ZWl0ICBhdWNoICBkaWUJS29zdGVuCWZ1ZXIgIGVpbiAgRmVzdC4gIEFsbGVyZGluZ3MgIHdhciAgZGllCitIb2NoemVpdHNuYWNodCB1bmFiZGluZ2JhcmVyIEJlc3RhbmR0ZWlsIGRlciBFaGU6IE9obmUgSG9jaHplaXRzbmFjaHQgZ2FsdCBkaWUKK0VoZSBuaWNodCBhbHMgZ2VzY2hsb3NzZW4uICBSb21lbyAgdW5kCUp1bGlhICB3YXJlbiAgZWluZSAgQXVzbmFobWUgIHZvbiAgZGVyCit1ZWJlcndpZWdlbmRlbiBNZWhyemFobCBkZXIgaGVpbWxpY2hlbiBIb2NoemVpdGVuOiBEaWUJbWVpc3RlbiAganVuZ2VuICBQYWFyZQordmVybGVndGVuIGRpZSBIb2NoemVpdHNuYWNodCB2b3IgdW5kIHNwYXJ0ZW4gYXVmIGRpZXNlIFdlaXNlIHNvZ2FyIGRpZSBiZWkgZGVyCitIb2NoemVpdCB1ZWJsaWNoZSBTcGVuZGUgYW4gZGllIEtpcmNoZS4KKworTGF3cmVuY2UgIHN0YW5kICBuZWJlbglkZXIgIFR1ZXIgIHNlaW5lciAga2xlaW5lbiAgS2FwZWxsZSAgdW5kICAgYmV0cmFjaHRldGUKK25hY2hkZW5rbGljaCBSb21lbywgZGVyIGRlbiBIdWVnZWwgaGluYXVmc3R1ZXJtdGUuCisKKyJFciByZW5udCwgYWxzIHNlaWVuIGFsbGUgVGV1ZmVsIGRlciBIb2VsbGUgaGludGVyIGlobSBoZXIuICBEYWJlaSAgaXN0ICBKdWxpYQorbm9jaCBnYXIgbmljaHQgaGllci4iIEF6enVybyByZWNrdGUgZ2VtYWVjaGxpY2ggZGllIEZsdWVnZWwuCisKK0xhd3JlbmNlLCBkZXIgd2llIHNlaW4gZ3Jvc3NlcyBWb3JiaWxkLCBkZXIgaGVpbGlnZSAgRnJhbnppc2t1cywgIHNpY2gJbmljaHRzCitkYWJlaSBkYWNodGUsIG1pdCBWb2VnZWxuIHp1IHJlZGVuLCBkcm9odGUgQXp6dXJvIG1pdCBkZW0gRmluZ2VyLiAgIlVuYmVydWZlbiEKK0p1bGlhIGlzdCBkb2NoIGVpbiBuZXR0ZXMgTWFlZGNoZW4uIgorCisiRGFzIHNpbmQgc2llIHZvciBkZXIgSG9jaHplaXQgYWxsZS4iLCBzdGVsbHRlIEF6enVybyBmZXN0LgorCisiS29tbSBzY2hvbiwgZGFzIHNhZ3N0IGR1IGpldHp0IG51ciwgd2VpbCBkZWluZSBGcmF1IG5pY2h0IGhpZXIgaXN0LiIgTGF3cmVuY2UKK2dyaW5zdGUuCisKKyJOYXR1ZXJsaWNoLiBTaWUgaXN0IGphIGF1Y2ggc2Nob24gbWl0IG1pciB2ZXJoZWlyYXRldC4iCisKK0xhd3JlbmNlIGJ1ZWNrdGUgc2ljaCB1bmQgenVwZnRlIGVpbmVuIFJlZ2Vud3VybSBhdXMgZGVtIHNhZnRpZ2VuICBCb2RlbiwgIGRlbgorZXIgQXp6dXJvIHJlaWNodGUuICJXbyBpc3QgZWlnZW50bGljaCBkZWluZSBGcmF1PyIKKworIkJlaSBKdWxpYS4gU2llIG1laW50LCBlaW4gTWFlZGNoZW4gc29sbHRlIGVpbmUgQnJhdXRqdW5nZmVyIGhhYmVuLiIKKworTGF3cmVuY2Ugbmlja3RlLiAiRWluIGtsdWdlciBHZWRhbmtlLiIKKworQXp6dXJvIGJlZGFjaHRlIGRlbiBSZWdlbnd1cm0gbWl0IGVpbmVtIGxhbmdlbiBCbGljay4gIkljaCB3ZWlzcyAgbmljaHQuICBXYXMsCit3ZW5uIHNpZSBkZW4gQnJhdXRzdHJhdXNzIGZhZW5ndD8iCisKKyJEYXMga2FubiBzaWUgb2huZSBIYWVuZGUgbmljaHQsIG1laW4gc2Nod2FyemVyIEZyZXVuZC4iLCAgdHJvZXN0ZXRlICBMYXdyZW5jZQoraWhuLgorCisiU2llIHdpcmQgZGlyIGVyaGFsdGVuIGJsZWliZW4uIgorCisiV2FocnNjaGVpbmxpY2guIiwgc3RpbW10ZSBBenp1cm8gdHJ1ZWJzaW5uaWcgenUuCisKKyJOdW4gbGFjaCAgZG9jaCAgbWFsLiIgIExhd3JlbmNlICBzdGllc3MgIEF6enVybyAgZnJldW5kc2NoYWZ0bGljaCAgYW4uICAiRWluZQorSG9jaHplaXQgaXN0IGVpbmUgZnJvZWhsaWNoZSBBbmdlbGVnZW5oZWl0LiIKKworIlNvbGFuZ2Ugc2llIGRhdWVydC4gRGFuYWNoIGtvbW10IGRhcyBWZXJoZWlyYXRldC1TZWluLiIKKworUm9tZW8sIGRlciBBenp1cm9zIGxldHp0ZSBXb3J0ZSBnZWhvZXJ0IGhhdHRlLCBsYWVjaGVsdGUgIHRvZXJpY2h0LiAgIkRhcyAgaXN0Citkb2NoIGRhcyBiZXN0ZSBhbiBkZXIgZ2FuemVuIEhlaXJhdGVyZWk6IERhbmFjaCAga2FubiAgc2llICBtaXIgIG5pZW1hbmQgIG1laHIKK3dlZ25laG1lbi4iCisKKyJFYmVuLCBtZWluIEp1bmdlLCBlYmVuLiIsIHZlcnNldHp0ZSBBenp1cm8uCisKK0F1Y2ggTGF3cmVuY2UgbWVpbnRlLCBzZWluZW0gQW10IGFscyBTZWVsc29yZ2VyICBnZXJlY2h0ICB3ZXJkZW4gIHp1ICBtdWVzc2VuLgorIkVpbmVuIGdpYnQgZXMsIGRlciBkaXIgYWxsZXMgd2VnbmVobWVuIGthbm4uIiwgIG1laW50ZSAgZXIgIHVuZCAgZGV1dGV0ZSAgenVtCitIaW1tZWwuCisKK1JvbWVvcyBCbGljayBmb2xndGUgTGF3cmVuY2VucyBGaW5nZXIgdW5kIGdld2FocnRlIGVpbmUgZHVua2xlIFdvbGtlLiAiQWNoLCBzbworZWluIGJpc3NjaGVuIFJlZ2VuIHdpcmQgSnVsaWEgc2Nob24gbmljaHQgYWJoYWx0ZW4uIgorCitUYXRzYWVjaGxpY2gga2FtIEp1bGlhIGRlbiBIYW5nIGhlcmF1ZiwgZ2Vmb2xndCB2b24gZWluZXIga2V1Y2hlbmRlbiBVbG8uICJTbywKK2hpZXIgYmluIGljaC4iCisKK1JvbWVvcyBBdWdlbiBzdHJhaGx0ZW4gdmVyZGFlY2h0aWcgaXJyZSwgYWxzIGVyIHNpZSBiZXRyYWNodGV0ZS4gIldpZSAgaHVlYnNjaAorZHUgYXVzc2llaHN0LiIKKworSnVsaWEgbGFlY2hlbHRlIGdlaXN0bG9zLiAiV2VyIGlzdCBkZW5uICBkZXIgIGh1ZWJzY2hlICBCdXJzY2hlICBoaWVyLCAgQnJ1ZGVyCitMYXdyZW5jZT8iCisKK0F6enVybyB2ZXJkcmVodGUgZGllIEF1Z2VuLiAiTmEsIHNpZWggenUsIGRhc3MgZHUgZmVydGlnIHdpcnN0LCBMYXdyZW5jZSwgIGljaAoraGFsdGUgZXMgbmljaHQgbWVociBhdXMhIgorCitVbG8gbGllc3Mgc2ljaCBhdWYgZWluZW0gQXN0IG5pZWRlciB1bmQgd2lzY2h0ZSBzaWNoIG1pdCBkZXIgRmx1ZWdlbHNwaXR6ZSBkaWUKK1RyYWVuZW4gYWIuICJBY2gsIEhvY2h6ZWl0ZW4gc2luZCBzbyBydWVocmVuZCEiCisKK0F6enVybywgaW1tZXIgbm9jaCBuaWVkZXJnZXNjaGxhZ2VuLCBuaWNrdGUuICJKYSwgbWlyIGtvbW1lbiAgYXVjaCAgamVkZXMgIE1hbAorZGllIFRyYWVuZW4sIHdlbm4gaWNoIHNlaGUsIGRhc3MgamVtYW5kIGxlYmVuc2xhZW5nbGljaCBiZWtvbW10LiIKKworIkotVS1MLUktQSwgaWNoIGxpZWIgZGljaCBzbyEiLCB0cmFlbGxlcnRlIFJvbWVvLgorCisiRGFzIG1hY2h0IGVyIG51ciwgdW0gbWljaCB6dSBhZXJnZXJuLiIsIGdyb2xsdGUgQXp6dXJvLgorCisiSWNoIHNlaCBlaW4gTGljaHQuLi4iLCBzYW5nIG51biBhdWNoIEp1bGlhLgorCitBenp1cm8sIGRlciBlcyBoYXNzdGUsIHdlbm4gZGllIE1lbnNjaGVuIGRlbiBmYWxzY2hlbiBUZXh0IGF1ZnNhZ3RlbiwgIGdyaW5zdGUKK25pZWRlcnRyYWVjaHRpZy4gIi4uLiBpbSBIYXVzZSBGcmFua2Vuc3RlaW4uIiwgdm9sbGVuZGV0ZSBlciAgZGllICBaZWlsZSAgZnVlcgorSnVsaWEuIFVlYmVybGFzc2VuIHdpciBkaWUgTGllYmVuZGVuIGpldHp0IGVpbmUgV2VpbGUgc2ljaCBzZWxic3QgIHVuZAl6aWVoZW4KK3VucyBkaXNrcmV0IHp1cnVlY2suCisKZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvcm9tX2p1bC9zZWl0ZTE1IGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9yb21fanVsL3NlaXRlMTUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM5ZmJhYwotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvcm9tX2p1bC9zZWl0ZTE1CkBAIC0wLDAgKzEsNDE0IEBACitERVIgRFJJVFRFIEFLVAorCSAgRElFIEVSU1RFIFNaRU5FCisKK0JlbmV2b2xpbyB3aXNjaHRlIHNpY2ggZGVuIFNjaHdlaXNzIHZvbiBkZXIgIFN0aXJuICB1bmQgIHNhaCAgdW5nbHVlY2tsaWNoICB6dQorTWVyY3V0aW8gaGludWViZXIsIGRlciBtaXQgaG9jaHJvdGVtIEdlc2ljaHQgbmViZW4gaWhtIGhlcm1hcnNjaGllcnRlLiAiRXMgaXN0Cit6dSBoZWlzcywgIHVtICBoaWVyICBkcmF1c3NlbiAgaGVydW16dWxhdWZlbiwgIE1lcmN1dGlvLiAgQXVzc2VyZGVtICBzaW5kICBkaWUKK0NhcHVsZXRlbiBsb3MuIgorCisiQW5nc3Q/IiwgZnJhZ3RlIE1lcmN1dGlvLgorCisiTmVpbiwgYWJlciBlcyBpc3QgenUgd2FybSBmdWVyIFBydWVnZWxlaWVuLiIKKworIkh1Y2g/IiBNZXJjdXRpbyBsZWd0ZSBCZW5ldm9saW8gZGllIEhhbmQgYW4gZGllIFN0aXJuLiAiRHUgIGJpc3QgIGRvY2ggIG5pY2h0CitldHdhIGtyYW5rPyBTb25zdCBnaWJ0IGVzIGRvY2ggbmljaHRzLCB3YXMgZGljaCB2b24gZWluZXIgenVlbmZ0aWdlbiBQcnVlZ2VsZWkKK2FiaGFsdGVuIGthbm4uIgorCitXaWVkZXIgenVlY2t0ZSBCZW5ldm9saW8gc2VpbiBUYXNjaGVudHVjaC4gIkRvY2gsIEhpdHplLiIKKworIkFjaCwga29tbSBzY2hvbiwgYXVzZ2VyZWNobmV0IGR1IHdpbGxzdCBqZXR6dCBpbnMgSGF1cyEiCisKKyJXaWVzbyBhdXNnZXJlY2huZXQgaWNoPyIKKworIk5hLCBzb25zdCBiZWd1Y2tzdCBkdSBkaXIgZGVpbiBNZXNzZXIgdW5kIHNhZ3N0OiAnV2FsdGUgSHVnbywgZGFzcyAgaWNoICBkaWNoCitudXIgenVtIGVzc2VuIGJyYXVjaGUuJyBVbmQgendhciBsYXV0IHVuZCB2ZXJuZWhtbGljaCwgZGFtaXQgZXMgYXVjaCBqYSAgamVkZXIKK1JhdWZib2xkIGhvZXJ0IHVuZCB3ZWlzcywgZGFzcyBkdSBhdWYgU3RyZWl0IGF1cyBiaXN0LiIKKworIlNvIHNjaGxpbW0gYmluIGljaCBkb2NoIGdhciBuaWNodC4iCisKK0hhZXR0ZSBNZXJjdXRpbyB1ZWJlciB1bnNlcmUgV2VsdCBCZXNjaGVpZCBnZXd1c3N0LCAgc28gIGhhZXR0ZSAgZXIgIEJlbmV2b2xpbworc2ljaGVybGljaCBhbHMgR3Jvc3NtYWNodCBiZXplaWNobmV0LCBkZW5uIG51ciBHcm9zc21hZWNodGUgc2luZCBpbiBkZXIgIExhZ2UsCitXYWZmZW4gaW4gU2ljaHR3ZWl0ZSBhbmRlcmVyICBHcm9zc21hZWNodGUgIGF1Znp1c3RlbGxlbiAgdW5kICBtaXQgIHVuYmV3ZWd0ZW0KK0dlc2ljaHQgenUgc2FnZW46ICJXaXIgYnJhdWNoZW4gZGllc2UgV2FmZmVuIGVpZ2VudGxpY2ggZ2FyIG5pY2h0LCB3ZWlsIHdpciBqYQorZnJpZWRsaWNoIHNpbmQsIHdpciB3b2xsZW4gc2llIGV1Y2ggbnVyIHplaWdlbiwgd2VpbCBzaWUgc28gaHVlYnNjaCBzaW5kLiIKKworIk5laW4sIG5hdHVlcmxpY2ggbmljaHQuIEVyaW5uZXJzdCBkdSBkaWNoIG5vY2ggYW4gZGVuIEtlcmwsIGRlbiAgZHUgIHZlcmhhdWVuCitoYXN0LCB3ZWlsIGVyIGFuIGRlaW5lciBSb3NlIHJvY2g/IgorCisiRGFzIG11c3N0ZSBpY2ggZG9jaCEgUm9zZSBpc3QgZWluIGFuc3RhZW5kaWdlcyBNYWVkY2hlbi4iCisKKyJJY2ggbWVpbmUgbmljaHQgZGllIFJvc2UgaW4gZGVpbmVtIEJldHQsIHNvbmRlcm4gZGllIGluIGV1cmVtIFZvcmdhcnRlbi4iCisKKyJIbXBmLiIsIG1hY2h0ZSBCZW5ldm9saW8uCisKK0luIE1lcmN1dGlvcyBBdWdlbiB0YW56dGVuIGtsZWluZSBUZXVmZWxjaGVuLCBhbHMgZXIgc2VpbmVuICBCbGljayAgdWViZXIgIGRlbgorUGxhdHogc2Nod2VpZmVuIGxpZXNzLiAiR3VjayBtYWwsIGRhIGlzdCBUeWJhbHQuIgorCisiVWgtb2guIgorCitUeWJhbHQgdHJhdCBhdWYgZGllICBiZWlkZW4gIHp1ICB1bmQgIGdyaW5zdGUgIGhvZWhuaXNjaCwgIGFscwllciAgQmVuZXZvbGlvcworc2Nod2Vpc3N1ZWJlcnN0cm9lbXRlcyBHZXNpY2h0IHNhaC4gIldpZSBzYWd0ZSBtZWluZSBHcm9zc211dHRlciBzbyAgdHJlZmZlbmQ6CisnU2NobGVjaHRlcyBGbGVpc2NoIHNjaGFldW10LiciCisKK0JlbmV2b2xpbyB3YW5kdGUgc2ljaCB6dW0gR2VoZW4uICJLb21tLCBNZXJjdXRpbywgaGllciBoZXVsdCBlaW4gV29sZiBkZW4gTW9uZAorYW4sIGRhcyBpc3QgbWlyIHp1IGxhdXQuIgorCisiTWl0bmljaHRlbiwgQmVuZXZvbGlvLCB3ZW5uIGRlciBndXRlIFR5YmFsdCBldHdhcyB2b24gdW5zIHdpbGwsIHNvbGwgZXIgIGZ1ZXIKK3VucyB0YW56ZW4uIgorCisiV2FzIGZ1ZXIgZWluZSBwcmFlY2h0aWdlIEhvY2h6ZWl0c2ZlaWVyLiIsIGtvbW1lbnRpZXJ0ZSBBenp1cm8gYml0dGVyLgorCisiU28gc2luZCBkaWUgTWVuc2NoZW4uIiBVbG8gd2FyIG5hY2hzaWNodGlnIHVuZCBtaWxkZSBnZXN0aW1tdC4KKworTWVyY3V0aW8gZmlzY2h0ZSBpbiBzZWluZXIgIEhvc2VudGFzY2hlICBuYWNoICBlaW5lciAgTXVlbnplLCAgZGllICBlcglUeWJhbHQKK3p1d2FyZi4gIk1hY2ggRmF4ZW4sIEFsdGVyLiIKKworIkZheGVuIGthbm5zdCBkdSBoYWJlbiEiIE51biBzY2hhZXVtdGUgYXVjaCBUeWJhbHQuCisKK0JlbmV2b2xpbyBob2IgZGllIEhhbmQuICJCZWhlcnJzY2h0IGV1Y2guIE1pdHRlbiBhdWYgZGVyIFN0cmFzc2UgIHp1ICBrYWVtcGZlbgoraXN0IGFldXNzZXJzdCB1bmZlaW4uIERhIGdlaG9lcnQgZG9jaCAgZWluZSAgV2llc2UgIGltCU1vcmdlbmdyYXVlbiAgdW5kICBlaW4KK3N0aWx2b2xsZXIgTmViZWwgZGF6dS4iCisKKyJBY2gsIE5lYmVsLiIgTWVyY3V0aW8gd29sbHRlIHNpY2ggc28gbGVpY2h0IG5pY2h0IGFibGVua2VuIGxhc3Nlbi4gICJJY2ggIGhhdQorVHliYWx0IGF1Y2ggb2huZSBOZWJlbCBtZWluZW4gU2FlYmVsIHVtIGRpZSBPaHJlbi4iCisKKyJIaWVyIGd1Y2t0IGRpciBqZWRlciB6dSwgTWVyY3V0aW8uIgorCisiTmEsIHZpZWxsZWljaHQgbGVybmVuIHNpZSBqYSBub2NoIHdhcy4gR2VuYXUgd2llIGljaCBUeWJhbHQgbGVocmVuIHdlcmRlLiIKKworUm9tZW8gYmV0cmF0IGRlbiBQbGF0eiBtaXQgZWluZW0gdW5pcmRpc2NoZW4gU3RyYWhsZW4gIGF1ZiAgZGVtICBHZXNpY2h0LiAgU2llCit3aXNzZW4gc2Nob246IERhcyBTdHJhaGxlbiwgZGFzIG1hbiBiZWkgTWVuc2NoZW4gc2VoZW4ga2FubiwgIGRpZSAgZ2VyYWRlICBlaW4KK2Jlc29uZGVycyBleG90aXNjaGVzIFBpbHpyYWdvdXQgZ2VnZXNzZW4gaGFiZW4gdW5kIGZlc3RzdGVsbGVuLCBkYXNzIGVzICBpaG5lbgord2lkZXIgRXJ3YXJ0ZW4gZ3V0IC0gYWxsenUgZ3V0IC0gYmVrb21tdC4gIkd1dGVuICBUYWcsICBpaHIgIGxpZWJlbiwgIGdvbGRpZ2VuCitNZW5zY2hlbiEiCisKK1R5YmFsdCBiZWRhY2h0ZSBSb21lbyBtaXQgZWluZW0gIEJsaWNrLCAgZGVyICBmdWVyICBnZXdvZWhubGljaCAgc2VsdGVuZW4gIHVuZAorYWJzdG9zc2VuZGVuIEthZWZlcm4gdm9yYmVoYWx0ZW4gYmxlaWJ0LiAiTGllYj8iCisKK0F1Y2ggTWVyY3V0aW8gc2FoIHNlaW5lbiBGcmV1bmQgaW50ZXJlc3NpZXJ0IGFuLCBhbGxlcmRpbmdzIGdsaWNoICBzZWluICBCbGljaworbWVociBkZW0gZWluZXMgQmlvbG9nZW4uICJMaWViLiBIYXQgZXIgZ2VzYWd0LiBVbmQgZ29sZGlnLiIKKworQXp6dXJvIHNjaHVldHRlbHRlIHNpY2guICJXYXJ0ZSBudXIgYWIsIGJpcyBpaG0gIGtsYXIgIHdpcmQsICBkYXNzICBpaG4gIEp1bGlhCitqZXR6dCBhbSBIYWtlbiBoYXQuIERhbm4gaXN0IFNjaGx1c3MgbWl0IGx1c3RpZy4iCisKK1VsbyBzdGllc3MgaWhyZW4gR2VmYWVocnRlbiBhbi4gIkF1Y2ggd2VubiBkdSBlcyBuaWNodCBmdWVyIG1vZWdsaWNoICBoYWVsdHN0LAorZXIgaXN0IGdsdWVja2xpY2guIgorCisiTm9jaC4iCisKK1R5YmFsdCB1ZWJlcndhbmQgc2VpbmUgVmVyd2lycnVuZyBhbHMgZXJzdGVyIHVuZCBnYWIgc2ljaCBhbGxlCU11ZWhlLAlzZWluZXIKK0F1ZmdhYmUgYWxzIFNjaHVya2UgZGllc2VyIEdlc2NoaWNodGUgZ2VyZWNodCB6dSB3ZXJkZW4uICJIdW5kLCBlbGVuZGVyISIKKworUm9tZW8sIGltbWVyIG5vY2ggbWl0IGRlbSBzZWxpZ2VuIEdlc2ljaHRzYXVzZHJ1Y2ssIGxhZWNoZWx0ZSBUeWJhbHQgYW4uICJBY2gsCitUeWJhbHQsIGR1IGFobnN0IGphIG5pY2h0LCB3aWUgZ2VybiBpY2ggZGljaCBoYWJlLiIKKworVWxvIHpvZyBkaWUgQnJhdWVuIGhvY2guICJBdWYgZWlubWFsPyIKKworIkZhbWlsaWVucGZsaWNodGVuLiIgQXp6dXJvIGthbm50ZSBkaWVzZSBTaXR0ZSwgZGllICB2ZXJoaW5kZXJuICBzb2xsdGUsICBkYXNzCitzaWNoICBHZWZhZWhydGVuICBlaW5lcyAgUnVkZWxzICBhbiAgIGRpZSAgIEtlaGxlICAgZ2VoZW4sICAgYXVjaCAgIHdlbm4gICBkaWUKK1J1ZGVsYW5nZWhvZXJpZ2VuIG5vY2ggc28gd2lkZXJsaWNoIHNpbmQuIEZvcm11bGllcmVuIHdpciBlcyBhbmRlcnM6IFNpZSBoYWJlbgorc2Nob24gYWxzIGtsZWluZXMgS2luZCBnZWxlcm50LCBkYXNzIFNpZSAgSWhyZQlUYW50ZSAgYXVjaCAgZGFubiAgbmljaHQgIHZvcnMKK1NjaGllbmJlaW4gdHJldGVuIGR1ZXJmZW4sIHdlbm4gc2llIElobmVuIG5vY2gJc28gIG9mdCAgdW5lcnd1ZW5zY2h0ZQlLdWVzc2UKK3ZlcnBhc3N0LiBWaWVsZSBNZW5zY2hlbiB6YWhsZW4gdGV1cmUgU2l0enVuZ2VuIGJlaSBQc3ljaG90aGVyYXBldXRlbiB1bSBpaHJlcgordWViZXJ0cmFnZW5lbiBUYW50ZSBlbmRsaWNoIGVpbm1hbCAtIG9obmUgbWl0IHNjaGFlcmZzdGVuIFNhbmt0aW9uZW4gYmVsZWd0IHp1Cit3ZXJkZW4gLSBzYWdlbiB6dSBrb2VubmVuLCBkYXNzIHNpZSBuaWNodCBnZWt1ZXNzdCB3ZXJkZW4gd29sbGVuLgorCitUeWJhbHQsIGRlciBzaWNoIGRpZSBHZWxlZ2VuaGVpdCBuaWNodCBlbnRnZWhlbiBsYXNzZW4gd29sbHRlLCBzY2hlbmt0ZSAgUm9tZW8KK2VpbiB6dWNrZXJzdWVzc2VzIExhZWNoZWxuLiAiRHUgaGFzdCB3b2hsIGRhcyAgVWZlciAgZ2V3ZWNoc2VsdD8gIFdpbGxzdCAgbWljaAorYmVsZWlkaWdlbiwgaW5kZW0gZHUgbWlyIHVudGVyc3RlbGxzdCwgaWNoLi4uIiBFciAgYnJhY2ggIGFiICB1bmQgIHN0cmVpY2hlbHRlCitlcndhcnR1bmdzdm9sbCBzZWluZW4gRGVnZW4uCisKKyJBYmVyIG5laW4hIiBSb21lbywgZGVyIG9mZmVuc2ljaHRsaWNoIFR5YmFsdHMgIFppZWwgIG5pY2h0ICBlcmtlbm5lbiAgd29sbHRlLAorc3RyYWhsdGUgd2VpdGVyaGluIHVtIGRpZSBXZXR0ZS4gIkR1IGtlbm5zdCBtaWNoIGViZW4gbmljaHQsICBUeWJhbHQgIENhcHVsZXQsCitzb25zdCB3dWVzc3Rlc3QgZHUsIGRhc3MgaWNoIGRpY2ggZWJlbnNvIGdlcm4gaGFiZSB3aWUgbWljaCBzZWxic3QuIgorCitNZXJjdXRpbyBzdG9laG50ZS4gIkhpbW1lbCwgaGlsZiwgZXIgaXN0IHVudGVyIGRpZSAgQmV0YnJ1ZWRlciAgZ2VnYW5nZW4hIiAgRXIKK3pvZyBibGFuay4gIkFiZXIgd2VubiBSb21lbyBzZWxic3QgZGllIEJlbGVpZGlndW5nIG5pY2h0ICByYWVjaGVuICB3aWxsLCAgZGFubgorbGFzc2UgaWNoIGlobiBuaWNodCBpbSBSZWdlbiBzdGVoZW4uIFppZWgsIFR5YmFsdCEiCisKKyJIb2VydCBhdWYuIiBSb21lbyByYW5nIGRpZSBIYWVuZGUuICJJaHIgd2lzc3QgZG9jaCwgZGFzcyBkZXIgRnVlcnN0ICB1bnMgIGRhcwordmVyYm90ZW4gaGF0ISIKKworVHliYWx0IHNjaGllbiBNZXJjdXRpbyBqZXR6dCBlcnN0IHp1IGJlbWVya2VuLiAiV2FzIHdpbGxzdCBkdSAgZGVubj8iLCAgZnJhZ3RlCitlciAgaW4JZWluZW0gIFRvbmZhbGwsICBkZW4gIG1hbmNoZSAgTWVuc2NoZW4Ja2xlaW5lbiAgS2luZGVybiAgdW5kCUh1bmRlbgordm9yYmVoYWx0ZW4uCisKKyJEZWluIExlYmVuLiBPZGVyIHdlbmlnc3RlbnMgZWluIGFuc2VobmxpY2hlcyBTdHVlY2sgZGF2b24uIgorCisiRGFzIG11c3N0IGR1ICBkaXIgIGVyc3QgIGhvbGVuISIgIFR5YmFsdHMgIERlZ2VuICBzY2hpZW4gIHBsb2V0emxpY2ggIEZsdWVnZWwKK2Jla29tbWVuIHp1IGhhYmVuLCBhbmRlcnMgbGllc3Mgc2ljaCBkYXMgVGVtcG8gbmljaHQgIGVya2xhZXJlbiwgIG1pdCAgZGVtICBlcgorc2VpbmVyIFNjaGVpZGUgbGVkaWcgd3VyZGUuCisKK051biBzaW5kIHdpciBhbiBkZXIgU3RlbGxlIGFuZ2VsYW5ndCwgYW4gIGRlciAgamVkZXIgIEF1dG9yICBkaWUgIEdyZW56ZW4gIGRlcworUGFwaWVycyB2ZXJmbHVjaHQgIHVuZAlzaWNoICBmcmFndCwgIG9iICBlciAgbmljaHQgIGRvY2ggIGxpZWJlciAgRHJlaGJ1ZWNoZXIKK3NjaHJlaWJlbiBzb2xsdGUuIE9kZXIgZGllIFRpbnRlbmtsZWNrc2VyZWkgZ2FueiAgYW4gIGRlbiAgTmFnZWwgIGhhZW5nZW4gIHVuZAordmllbGxlaWNodCBlaW5lciBlaHJiYXJlbiBBcmJlaXQgbmFjaGdlaGVuIHNvbGx0ZSwgZGllIC0gYWJnZXNlaGVuICB2b24gIGVpbmVtCityZWdlbG1hZXNzaWdlbiBFaW5rb21tZW4gLSBub2NoIGRlbiBSdWYgIGRlciAgVW5zdGV0aWdrZWl0ICB0aWxndCwgIGRlciAgamVkZW4KK1NjaHJlaWJlciAodW5kIGplZGUgU2NocmVpYmVyaW4gLSBuYXR1ZXJsaWNoIGhhYmUgaWNoIGRhcyB2ZXJzdGFuZGVuLCBVbG8pICBpbgorZGllIE5hZWhlIGRlcyBCYWhuaG9mc3ZpZXJ0ZWxzIHJ1ZWNrdC4gRGVtIFBhcGllciBmZWhsdCwgdHJvdHogc2VpbmVyICBiZXJlaXRzCitzcHJpY2h3b2VydGxpY2hlbiBHZWR1bGQsIGRpZSBGYWVoaWdrZWl0LCBFcmVpZ25pc3NlLCBkaWUgc2ljaCBpbiAgQnJ1Y2h0ZWlsZW4KK3ZvbiBTZWt1bmRlbiBhYnNwaWVsZW4sIGluIGFuZ2VtZXNzZW4ga3VyemVyIFplaXQgd2llZGVyenVnZWJlbi4gVW5kICBkYXMgIGlzdAora2VpbmUgdmVyc3RlY2t0ZSBCZWxlaWRpZ3VuZyBtZWluZXIgTGVzZXJJbm5lbi4KKworU3RlbGxlbiBTaWUgc2ljaCBhbHNvIHZvciwgc2llIHN0dWVuZGVuIGluIGVpbmVyICBEaXNrby4gIFZvciAgSWhuZW4gIGlzdCAgZGllCitUYW56ZmxhZWNoZSwgZGllIFNpZSBudXIgZGFyYW4gZXJrZW5uZW4sIGRhc3Mga2VpbmUgVGlzY2hlIGRhcmF1ZiBzdGVoZW4uICBJaHIKK01hZ2VuIG1hY2h0IGVpZ2VuYXJ0aWdlICBIdWVwZmJld2VndW5nZW4gIHVuZCAgd2VubiAgU2llICBzaWNoCWtvbnplbnRyaWVyZW4sCitrb2VubmVuICBTaWUgIGVya2VubmVuLCAgZGFzcyAgZGllICBIdWVwZmVyZWkgIGltICAgVGFrdCAgIHp1bQkgV3VtbWVybiAgIGRlcgorQmFzc2xhdXRzcHJlY2hlciBlcmZvbGd0LiBNZXNzZXJzY2hhcmYgZm9sZ2VybiBTaWUsIGRhc3MgZGllICBNdXNpayAgKD8pICBmdWVyCitkaWUgenVja2VuZGVuIEJld2VndW5nZW4gSWhyZXIgSW5uZXJlaWVuIHZlcmFudHdvcnRsaWNoIGlzdCB1bmQgbmljaHQgZXR3YSBkYXMKK0NoaWxpIGNvbiBDYXJuZSB2b24gZ2VzdGVybiBhYmVuZC4gSW0gU3Ryb2Jvc2tvcGxpY2h0LAlkYXNzICBkaWUgIFRhbnpmbGFlY2hlCitiZWxldWNodGV0LCB6dWNrZW4gZWluemVsbmUgR2xpZWRlciBkdXJjaGVpbmFuZGVyOiAgSGllciAgZWluICBBcm0sICBkb3J0ICBlaW4KK0JlaW4sIGVpbiBTdHVlY2tjaGVuIHdlaXRlciBlaW5lIHdlaGVuZGUgSGFhcm1hZWhuZSB1bmQgZGF6d2lzY2hlbiAgdmllbGxlaWNodAorbm9jaCBlaW4gaGVsbGVyIEZsZWNrLCBkZXIgZWluIEdlc2ljaHQgc2VpbiBrb2VubnRlLiBEaWUgRWluZHJ1ZWNrZSBmb2xnZW4gIHp1CitzY2huZWxsIGF1ZmVpbmFuZGVyLCBhbHMgZGFzcyBTaWUgZGllICBHbGllZGVyCXphZWhsZW4gIGtvZW5udGVuICAtICBnYW56ICB6dQorc2Nod2VpZ2VuIGRhdm9uLCBkYXNzIFNpZSBhdXMgIEFybWVuLCAgQmVpbmVuLAlIYWFyZW4JdW5kICBHZXNpY2h0ZXJuICBnYW56ZQorTWVuc2NoZW4ga29uc3RydWllcmVuIGtvZW5udGVuLiBBbHNvIG5laG1lbiBTaWUgZGllIEJpbGRlciAgc28JaGluLCAgd2llICBzaWUKK0lobmVuIGdlYm90ZW4gd2VyZGVuLiBFcyBibGVpYnQgZGVyIEdlZGFua2UsIGRhc3MgTWVuc2NoZW4genUgTXVzaWsgdGFuemVuLgorCitPZGVyIHN0ZWxsZW4gU2llIHNpY2ggZWluZW4gRmlsbSBtaXQgZGVuIE1hcngtQnJvdGhlcnMgdm9yLiBFcmlubmVybiBTaWUgc2ljaD8KK0VzIGthbSBkYXJpbiBpbW1lciB3aWVkZXIgenUgU3plbmVuLCBpbiBkZW5lbiAgc2ljaCAgZGllICBCcnVlZGVyICBnZWdlbnNlaXRpZworVG9ydGVuIGluIGRpZSBHZXNpY2h0ZXIgd2FyZmVuIG9kZXIgT2hyZmVpZ2VuICBhdXN0ZWlsdGVuLiAgU2NobmVsbGUgIFNjaG5pdHRlCithbnN0ZWxsZSB2b24gU2Nod2Vua3MgIHplaWd0ZW4JZGllICBHZXNjaHdpbmRpZ2tlaXQsICBpbiAgZGVyCWRhcyAgR2VzY2hlaGVuCitwYXNzaWVydGUuCisKK05hY2hkZW0gZXMgYWxzbyBrZWluZSBlY2h0ZSBNb2VnbGljaGtlaXQgZ2lidCwgSWhuZW4gZGFzIFRlbXBvIGRlciAgRXJlaWduaXNzZQorZGVyIG5hZWNoc3RlbiBwYWFyIE1pbnV0ZW4gYXVmIGplbmVtIFBsYXR6IGluIFZlcm9uYSB6dSAgdmVybWl0dGVsbiwgIGVybGF1YmVuCitTaWUgbWlyLCBkYXMgUGFwaWVyIHp1IHplcnNjaG5laWRlbiB1bmQgSWhuZW4gZGllIFNpdHVhdGlvbiBpbiBTY2huaXBwc2VsbiAgenUKK3ByYWVzZW50aWVyZW4uIEdhbnogc28sIGFscyBzdHVlbmRlbiBTaWUgZGFuZWJlbiB1bmQgIGxpZXNzZW4gIElocmUgIEF1Z2VuICBpbQorVGFrdCAgZGVyICBFcmVpZ25pc3NlICB2b24gIGVpbmVyICBQZXJzb24gIHp1cgluYWVjaHN0ZW4gIGh1ZXBmZW4sICBvaG5lICBkaWUKK0dlc2NoZWhuaXNzZSB1bmJlZGluZ3QgbWl0ZWluYW5kZXIgenUgdmVyYmluZGVuLgorCitSb21lb3MgQXVnZW4gd2VpdGVuIHNpY2ggdm9yIFNjaHJlY2suICJOZWluISBTdGVja3QgZGllIERpbmdlciB3ZWchIgorCitCZW5ldm9saW8sIG5pY2h0IHdlbmlnZXIgZW50c2V0enQgYWxzIHNlaW4gRnJldW5kLCB6dWVja3QgIGRlbglEZWdlbiAgdW0gIGRpZQorV2FmZmVuIFR5YmFsdHMgdW5kIE1lcmN1dGlvcyBoZXJ1bnRlcnp1c2NobGFnZW4uCisKK1R5YmFsdCwgZGVyIGRpZSBTaXR1YXRpb24gbWlzc3ZlcnN0ZWh0LCBmaW50ZXQgaW4gIFJpY2h0dW5nICBSb21lbywgIHZlcmZ1ZWhydAorZGFtaXQgQmVuZXZvbGlvIGRhenUsIHNlaW5lbiBEZWdlbiBtaXQgZGVtIHNlaW5lbiB6dSBiaW5kZW4uCisKK0F6enVybyBmbGF0dGVydCBhdWZnZXJlZ3QgbWl0IGRlbiBGbHVlZ2Vsbi4gIkp1Y2gtaHUhIiwga3JhZWh0IGVyIHZlcmdudWVndC4KKworUm9tZW8gZ2lidCBzaWNoIGFsbGUgTXVlaGUsIE1lcmN1dGlvIGF1cyBkZW0gR2VyYW5nZWwgIGZvcnR6dXppZWhlbiwgIGVycmVpY2h0CithbGxlcmRpbmdzIG51ciwgZGFzcyBNZXJjdXRpbyBpaG0gZWluZSBzYWZ0aWdlIE9ocmZlaWdlIHZlcnBhc3N0LgorCitVbG8sIGRpZSBSb21lbyBuaWNodCBhbiBzZWluZW0gSG9jaHplaXRzdGFnIHRvdCBzZWhlbiB3aWxsLCBmbGllZ3QgIHRvZGVzbXV0aWcKK2VpbmVuIFN0dXJ6YW5ncmlmZiBhdWYgVHliYWx0LgorCitUeWJhbHQgc2NobGFlZ3QgbmFjaCBkZW0gc2Nod2FyemVuIFNjaGVtZW4gdm9yIHNlaW5lbSBHZXNpY2h0IHVuZCBsZW5rdCAgZGFtaXQKK01lcmN1dGlvcyBBdWZtZXJrc2Fta2VpdCB3aWVkZXIgYXVmIHNpY2guCisKK01lcmN1dGlvIHNjaHVldHRlbHQgUm9tZW8gYWIgdW5kIHRyaXR0IEJlbmV2b2xpbyB2b3JzIFNjaGllbmJlaW4sICBkZXIJVHliYWx0CitVbG8gdWViZXJsYWVzc3QuCisKK0F6enVybyBoYXQgZXJmb2xncmVpY2ggZWluZW4gU3RlaW4gaW4gIGRpZSAgS2xhdWVuICBnZW5vbW1lbiAgdW5kICBsYWVzc3QgIGlobgorQmVuZXZvbGlvIGF1ZiBkZW4gS29wZiBmYWxsZW4uCisKK0JlbmV2b2xpbywgdm9uIGRlbSAgU3RlaW4gIHp3YXIgIG5pY2h0CWhhcnQgIGdldHJvZmZlbiwgIHdvaGwJYWJlciAgYXVzICBkZW0KK0dsZWljaGdld2ljaHQgZ2VicmFjaHQsIGxhZXNzdCBNZXJjdXRpb3MgQXJtIGxvcy4KKworTWVyY3V0aW8sIGRlciBzaWNoIGdlcmFkZSB2b24gIEJlbmV2b2xpbyAgbG9zcmVpc3NlbiAgd29sbHRlLCAgYmVrb21tdAl6dXZpZWwKK1NjaHd1bmcgdW5kIHJlbXBlbHQgUm9tZW8gYW4uCisKK1JvbWVvIHRhdW1lbHQgenVyIFNlaXRlLgorCitUeWJhbHQgd2l0dGVydCBNb3JnZW5sdWZ0LCBtYWNodCBlaW5lbiBzY2huZWxsZW4gQXVzZmFsbHNjaHJpdHQgIHVuZCAgdmVyc2Vua3QKK3NlaW5lbiBEZWdlbiBpbiBNZXJjdXRpb3MgQnJ1c3QuCisKK0FscyBUeWJhbHQga2xhciB3dXJkZSwgd2FzIGVyIGFuZ2VyaWNodGV0IGhhdHRlLCBuYWhtICBlciAgZGllCUJlaW5lICBpbiAgZGllCitIYW5kLgorCitTdGlsbGUuCisKK1N0aWxsZSEKKworU1RJTExFIQorCitNZXJjdXRpbyAgdGFzdGV0ZSAgbWl0CXppdHRlcm5kZXIgIEhhbmQgIG5hY2gJc2VpbmVyCVNjaHVsdGVyLiAgICJWZXJkYW1tdGUKK1NjaGVpc3NlLiIsIHNhZ3RlIGVyIGluIGRpZSBkb25uZXJuZGUgU3RpbGxlIGhpbmVpbi4gRWluZSB3ZWlzc2UgVGF1YmUgbGFuZGV0ZQord2VpY2ggbmViZW4gaWhtIHVuZCBzY2hhdXRlIGlobiBzbyB2b3J3dXJmc3ZvbGwgYW4sIGRhc3MgTWVyY3V0aW8gc2VpbmUgIFdvcnRlCitiZWRhdWVydGUuICJTY2hvbiBndXQsIGljaCBsYXNzZSBtaXIgZXR3YXMgYmVzc2VyZXMgZWluZmFsbGVuLiIKKworIkRhbWl0IHNvbGx0ZSBlciBzaWNoIGJlc3NlciBiZWVpbGVuLiIsIHJhdW50ZSBBenp1cm8gVWxvIHp1LgorCisiSXN0IGFiZXIgYXVjaCBlaW5lIFNjaGFuZGUsIGRhc3MgZGVuIE1lbnNjaGVuICBzbyAgd2VuaWcgIFplaXQgIGJsZWlidCwgIHNpY2gKK3d1ZXJkZXZvbGxlIGxldHp0ZSBXb3J0ZSBhdXN6dWRlbmtlbi4iIFVsbyBzY2huaWVmdGUgbGVpc2UuCisKK0VpbiBMZXVjaHRlbiBodXNjaHRlIHVlYmVyIE1lcmN1dGlvcyBHZXNpY2h0LCBhbHMgaWhtIGVpbmUgYnJhdWNoYmFyZSBJZGVlIGthbS4KKworIkFjaCwgUm9tZW8sIHdhZXJlc3QgZHUgbmljaHQgendpc2NoZW4gZGllc2VuIEJhLi4uIEVsZW5kZW4gdW5kIG1pY2ggZ2V0cmV0ZW4sCitpY2ggIGhhZXR0ZSAgbWljaCAgbmljaHQgIHp1cnVlY2toYWx0ZW4gIG11ZXNzZW4gIHVuZCAgc2ljaGVybGljaCAgIGRlbiAgIFNpZWcKK2Rhdm9uZ2V0cmFnZW4hIiwgc3RvZWhudGUgZXIgYW5nZW1lc3NlbiBmZWllcmxpY2guCisKKyJFciB0cmFlZ3QgenUgZGljayBhdWYuIiBBenp1cm8gYmVrYW0gZGVuIG1vcmRsdWVzdGVybmVuIEJsaWNrLCBkZW4gbWFuICBzb25zdAorYmVpIEtyaXRpa2VybiBiZW9iYWNodGV0LgorCitSb21lbywgZGVyIGF1c3Nlcmdld29laG5saWNoIHNjaG5lbGwgZXJrYW5udGUsIHdhcyAgdm9uICBpaG0gIGVyd2FydGV0CXd1cmRlLAorZmllbCBuZWJlbiBzZWluZW0gRnJldW5kIGF1ZiBkaWUgS25pZS4gIkljaCBoYWJzIGRvY2ggbnVyIGd1dCBnZW1laW50ISIKKworQXp6dXJvIG9lZmZuZXRlIGRlbiBTY2huYWJlbCwgZG9jaCBkaWUgVGF1YmUgd2FyZiAgaWhtCWVpbmVuICBCbGljayAgenUsICBkZXIKK3NlbGJzdCBlaW5lbiBLbGF0c2Noc3BhbHRlbi1SZWRha3RldXIgenVtIFNjaHdlaWdlbiBnZWJyYWNodCBoYWV0dGUuCisKKyIuLi4iLCBzYWd0ZSBNZXJjdXRpbyB1bmQgc2VpbiBLb3BmIHNhbmsgenVyIFNlaXRlLgorCitSb21lbyBzY2hsdWNrdGUuICJJc3QgZXIuLi4/IgorCitVbG8gbGllc3Mgc2ljaCBhdWYgc2VpbmVyIFNjaHVsdGVyIG5pZWRlciB1bmQgcmllYiBzYW5mdCAgZGVuICBTY2huYWJlbCAgdWViZXIKK3NlaW5lIFdhbmdlLgorCisiSmEuIgorCisiVW5kIG51ciwgd2VpbCBlciBuaWNodCB3b2xsdGUsIGRhc3MgaWNoIGJlbGVpZGlndCB3ZXJkZS4gRGFiZWkgd3Vzc3RlIGVyIGRvY2gKK2dhciBuaWNodCwgd2FydW0gaWNoIFR5YmFsdCBpbiBSdWhlIGxpZXNzLiIgRXIgc2V1Znp0ZS4gIkljaCBsaWViZSBKdWxpYSwgYWJlcgordW0gIGlocmV0d2lsbGVuICBoYWJlICBpY2ggICB6dWdlbGFzc2VuLCAgIGRhc3MgICBNZXJjdXRpbyAgIGZ1ZXIgICBtaWNoICAgZGllCitVbnZlcnNjaGFlbXRoZWl0ZW4gVHliYWx0cyBiZXphaGx0ZS4gVW5kIGpldHp0IGhhdCBlciBkYWZ1ZXIgYmV6YWhsdC4gSWNoIGhhYnMKK2RvY2ggbnVyIGd1dCBnZW1laW50LiIgVmVyendlaWZlbHQgc2NodWV0dGVsdGUgZXIgZGVuIEtvcGYuICJOdXIgZ3V0IGdlbWVpbnQuIgorCitEaWUgd2Vpc3NlIFRhdWJlIGxlZ3RlIGRlbiBLb3BmIHNjaGllZi4gRGEgTWVyY3V0aW8gbnVuIGZ1ZXIgZGllIE1lbnNjaGVuICBkZXIKK015dGhlbndlbHQgdG90IHdhciwgZHVyZnRlIGVyIGRhcyBFbmRlIGRlciBHZXNjaGljaHRlICBlaWdlbnRsaWNoICBuaWNodCAgbWVocgorbWl0IGFuc2VoZW4sIGRvY2ggc28gd2llIGVpbiBTY2hhdXNwaWVsZXIgZGVuIFJlc3QgZGVyIFZvcnN0ZWxsdW5nICBiZW9iYWNodGVuCit1bmQgc2NobGllc3NsaWNoIG1pdCBzZWluZW4gS29sbGVnZW4gZ2VtZWluc2FtIHZvciBkZW0gVm9yaGFuZyBkZW4gQXBwbGF1cyBkZXMKK1B1Ymxpa3VtcyBpbiBFbXBmYW5nIG5laG1lbiBkYXJmLCBibGllYiBkaWUgVGF1YmUgenVydWVjayAgdW5kCWdlc2VsbHRlICBzaWNoCitJaG5lbiB1bmQgbWlyIHp1LCBkaWUgd2lyIGRhcyBTdHVlY2sgYmVvYmFjaHRlbiwgIG9obmUJc2VsYnN0CWVpbmdyZWlmZW4gIHp1Citrb2VubmVuLiBEaWUgVGF1YmUgaXN0IGZ1ZXIgZGllIEdvZXR0ZXIgZGVyIE15dGhlbndlbHQsIHdhcyBkaWUgRGlza2V0dGUgIGZ1ZXIKK2RlbiBDb21wdXRlciAgaXN0OiAgRWluICBTcGVpY2hlciwgIGRlciAgZW50aGFlbHQsICB3YXMgIGVyc3QgIHNwYWV0ZXIJd2llZGVyCitnZWJyYXVjaHQgd2lyZC4gT2J3b2hsIENELVJPTSB3YWhyc2NoZWlubGljaCBlaW4gYmVzc2VyZXMgV29ydCB3YWVyZSwgZGVubiBiZWkKK2RlciBuYWVjaHN0ZW4gQXVmZnVlaHJ1bmcgZGllc2VyIEdlc2NoaWNodGUgd2lyZCBNZXJjdXRpbyB3aWVkZXIgZ2FueiBkZXIgQWx0ZQorc2VpbiwgZXIgd2lyZCBuaWNodHMgZ2VsZXJudCBoYWJlbiwga2VpbmUgVmVyYWVuZGVydW5nIGVyZmFocmVuLgorCitCZW5ldm9saW8gYmVydWVocnRlIFJvbWVvIGFuIGRlciBTY2h1bHRlci4gIlR5YmFsdC4iCisKK1JvbWVvIHNwcmFuZyBhdWYgd2llIHZvbiBkZXIgVGFyYW50ZWwgZ2VzdG9jaGVuLiAiTmEgd2FydGUsIGRlciBzb2xsIGJlemFobGVuIQorRXIgbGFldWZ0IGhpZXIgaGVydW0sICBhbHMgIHdhZXJlICBuaWNodHMgIHBhc3NpZXJ0LCAgd2FlaHJlbmQJTWVyY3V0aW8sICBkZXIKK2ltbWVyaGluIG1pdCB1bnNlcmVtIEZ1ZXJzdGVuIHZlcndhbmR0IGlzdC4uLiIgRXIgYnJhY2ggYWIgdW5kIHp1ZWNrdGUgIHNlaW5lbgorRGVnZW4uICJLb21tIGhlciwgVHliYWx0LCBqZXR6dCBzb2xsc3QgZHUgc2VoZW4sIHdhcyAgZHUgIGRhdm9uICBoYXN0LCAgbWVpbmVuCitGcmV1bmQgdW16dWJyaW5nZW4hIiBIYWx0ZW4gd2lyIFJvbWVvIHp1Z3V0ZSwgZGFzcyBlciBpbSAgQWZmZWt0ICBoYW5kZWx0ICB1bmQKK2tlaW5lIGJvZXNlIEFic2ljaHQgaGludGVyIHNlaW5lciAgRW50c2NoZWlkdW5nICB6dXIgIEx5bmNoanVzdGl6ICBzdGVja3QuICBFcgorZmljaHQgbWl0IFR5YmFsdCB1bmQgd2lyIHdvbGxlbiB1bnMgZWluZSAgZ2VuYXVlICBCZXNjaHJlaWJ1bmcJZGVyICBlaW56ZWxuZW4KK1NjaHJpdHRlLCBIaWViZSB1bmQgU3RpY2hlIGVyc3BhcmVuIC0gbmljaHQgbnVyLCB3ZWlsIGljaCB2b20gIEZlY2h0ZW4JbmljaHRzCit2ZXJzdGVoZSwgc29uZGVybiBhdWNoLCB3ZWlsIGljaCBkaWVqZW5pZ2VuIHVudGVyIElobmVuLCBkaWUgIGRhdm9uICBlYmVuZmFsbHMKK2tlaW5lIEFobnVuZyBoYWJlbiwgbmljaHQgbGFuZ3dlaWxlbiBtb2VjaHRlLiBFcnphZWhsZW4gd2lyIGFsc28gZGllIFN6ZW5lICBzbwora3VyeiBhbHMgbW9lZ2xpY2g6IFJvbWVvIHVuZCBUeWJhbHQgIGZlY2h0ZW4gIG1pdGVpbmFuZGVyICB1bmQJVHliYWx0cyAgVGF1YmUKK2dlc2VsbHQgc2ljaCB6dSBNZXJjdXRpb3MuCisKK0ZyYWdlbiBTaWUgbWljaCBqZXR6dCBuaWNodCwgd2FydW0gZGllIFRhdWJlbiBkaWUgS29lcGZlICB6dXNhbW1lbnN0ZWNrZW4sICBlcworaGF0IGplZGVuZmFsbHMgbWl0IHVuc2VyZXIgR2VzY2hpY2h0ZSBuaWNodHMgenUgdHVuLiBIb2ZmZW50bGljaC4KKworQmVuZXZvbGlvIHNhaCBkYXMgIFZlcmhhZW5nbmlzCWluICBHZXN0YWx0ICBhdWZnZWJyYWNodGVyICBQb2xpemlzdGVuCW5haGVuLgorIk1hY2gsIGRhc3MgZHUgd2Vna29tbXN0LCBSb21lbyEiCisKK1JvbWVvLCBkZXIgbm9jaCB2ZXJzdWNodGUsIHNlaW5lbiBEZWdlbiBhdXMgVHliYWx0cyBMZWljaGUgenUgemllaGVuLCBmbHVjaHRlLgorIkhpbGYgbWlyIGRvY2ggYmVpIGRlbSBEaW5nLiIKKworQmVuZXZvbGlvIHNjaHVldHRlbHRlIGRlbiBLb3BmLiAiTG9zLCBkdSBoYXN0IGtlaW5lIFplaXQgIHp1ICB2ZXJsaWVyZW4uICBXZW5uCitkaWUgUG9saXplaSBkaWNoIGVyd2lzY2h0LCBoYXN0IGR1IGVzIGdlbmF1c28gaGludGVyIGRpciB3aWUgZGllIGJlaWRlbiBoaWVyLiIKKworUm9tZW8sIGRlciBkaWUgZ2FuemUgVHJhZ3dlaXRlIGRlciBHZXNjaGVobmlzc2UgamV0enQgZXJzdCBiZWdyaWZmLCBuaWNrdGUgdW5kCityYW5udGUgbG9zLgorCitLZWluZSBTZXVjaGUga2FubiAgc2ljaCAgc2NobmVsbGVyICBhdXNicmVpdGVuCWFscyAgZGllICBOYWNocmljaHQsICBkYXNzICBlcworaXJnZW5kd28gZWluZSBMZWljaGUgenUgc2VoZW4gZ2lidCwgZG9jaCAgc2VsYnN0ICBkaWUgIEdlc2Nod2luZGlna2VpdAlkaWVzZXIKK05hY2hyaWNodCBpc3QgbmljaHRzIGdlZ2VuIGRhcyBUZW1wbywgbWl0IGRlbSBNZW5zY2hlbiBoZXJiZWloYXN0ZW4sIGRpZSBlaW5lbgorbGVpYmhhZnRpZ2VuIE1vZXJkZXIgc2VoZW4gd29sbGVuLiBOaWNodCBhbmRlcnMgd2FyIGVzIGF1Y2ggamV0enQ6IERpZSBCdWVyZ2VyCitWZXJvbmFzLCBzZW5zYXRpb25zbHVlc3Rlcm4gdW5kIGJsdXRnaWVyaWcgd2llIGFsbGUgTWVuc2NoZW4sIGZsb2dlbiAgZ2VyYWRlenUKK2F1ZiBkZW4gUGxhdHouIEF1cyBkZW0gdmllbHN0aW1taWdlbiBHZXNjaHJlaSB1bmQgZGVtIGdpZXJpZ2VuIEdsYW56IGRlciBBdWdlbgorbGllc3Mgc2ljaCBvaG5lIHdlaXRlcmVzICBkaWUgIFN0aW1tdW5nICBkZXIgIE1lbmdlICBpbiAgZWluZW4JZWluemlnZW4gIFNhdHoKK2tyaXN0YWxsaXNpZXJlbjogIldvIGlzdCBUeWJhbHQsIGRlciBNb2VyZGVyPyIKKworQmVuZXZvbGlvIHRyYXQgdW5iZWhhZ2xpY2ggdm9uIGVpbmVtIEZ1c3MgYXVmIGRlbiBhbmRlcmVuLCB3aWUgZXMgZGllICBtZWlzdGVuCitMZXV0ZSB0YWV0ZW4sIGRpZSBzaWNoIHVudmVyc2VoZW5zIG1pdCBlaW5lbSB3dWV0aWdlbiBNb2Iga29uZnJvbnRpZXJ0CXNlaGVuLgorRXIgZGV1dGV0ZSBhdWYgVHliYWx0cyBMZWljaGUuICJIaWVyLiIKKworRW50dGFldXNjaHVuZyBicmVpdGV0ZSBzaWNoIGF1ZiBkZW4gR2VzaWNodGVybiBhdXMuIEZ1ZXIgQmVuZXZvbGlvICBzY2hpZW4gIGVzCitqZXR6dCB1bmFuZ2VuZWhtIHp1IHdlcmRlbiAtIGVyIGthbm50ZSBzbyAgZ3V0CXdpZSAgamVkZXIgIGFuZGVyZSAgZGVuICBhbHRlbgorU3BydWNoLCBkYXNzIGRlciBzY2hyZWNrbGljaHN0ZSBhbGxlciBTY2hyZWNrZW4gIGVpbiAgTWVuc2NoZW5tb2IgIG9obmUgIE9wZmVyCitpc3QuIFp1IHNlaW5lbSBncm9zc2VuIEdsdWVjayBrYW1lbiBqZXR6dCBFc2NhbHVzIHVuZCBkaWUgSGFldXB0ZXIgZGVyIEhhZXVzZXIKK0NhcHVsZXQgdW5kIE1vbnRhZ3VlIHp1bSBQbGF0eiwgZGllIHZvbiAgaWhyZXIJSG9ub3JhdGlvcmVud3VlcmRlICBudXIgIHdlbmlnCitsYWVuZ2VyIHp1cnVlY2tnZWhhbHRlbiB3b3JkZW4gd2FyZW4gYWxzIGRpZSBhbmRlcmVuIEJ1ZXJnZXIuCisKK0VzY2FsdXMgc2Nob2Igc2ljaCBkdXJjaCBkaWUgTWVuZ2Ugd2llIGVpbiBFaXNicmVjaGVyIGR1cmNoIGRhcyAgTm9yZG1lZXIgIHVuZAorYmF1dGUgc2ljaCB2b3IgQmVuZXZvbGlvIGF1Zi4gIkFsc28/IgorCitCZW5ldm9saW8gd2FndGUga2F1bSB6dSBhdG1lbi4gSmVkZXIgYXVmIGRlbSBQbGF0eiBzY2hpZW4gZGVuIEF0ZW0gYW56dWhhbHRlbiwKK3NlbGJzdCBVbG8gdW5kIEF6enVybyBoYXR0ZSBlcyBlaW5lbiAgTW9tZW50ICBsYW5nICBkaWUgIFNwcmFjaGUgIHZlcnNjaGxhZ2VuLgorU2NobGllc3NsaWNoIGhvbHRlIEJlbmV2b2xpbyBMdWZ0IHVuZCBkaWVzZXIgQXRlbXp1ZyBlbnR3aWNrZWx0ZSBzaWNoIHp1IGVpbmVtCitrb2xsZWt0aXZlbiBTZXVmemVuLiBFciB3YXIgc2ljaCB1bmFuZ2VuZWhtIGRlciBUYXRzYWNoZSBiZXd1c3N0LCAgZGFzcyAgYWxsZXIKK0F1Z2VuIGF1ZiBpaG0gcnVodGVuLgorCisiQWVoLi4uIiwgYmVnYW5uIGVyLgorCisiSmE/IiBFc2NhbHVzZW5zIEdlZHVsZCBnbGljaCBkZW0gR3VtbWliYW5kIGltIEZsdWd6ZXVnIGVpbmVzIGtsZWluZW4gSnVuZ2VuLgorCisiQWxzbywgZGEgd2FyIE1lcmN1dGlvLiBVbmQgZGFubiB3YXIgZGEgVHliYWx0LiBVbmQgZGFzIFdldHRlciB3YXIgIHNvICBoZWlzcy4KK1VuZCBUeWJhbHQgd29sbHRlIHNpY2ggcHJ1ZWdlbG4uIEphLiBVbmQgamV0enQgaXN0IE1lcmN1dGlvIHRvdC4gVW5kIFR5YmFsdC4iCisKK0ZyYXUgQ2FwdWxldCwgIGRpZSAgYXVmZ3J1bmQgIGlocmVyICBFcmZhaHJ1bmcJbWl0ICBQb2xseSAgQmVuZXZvbGlvcwlTYWV0emUKK3NjaG5lbGxlciBzb3J0aWVydCBoYXR0ZSwgYWxzIGlyZ2VuZCBlaW4gYW5kZXJlciBhdWYgZGVtIFBsYXR6LCBzY2hyaWUgYXVmIHVuZAorUmFjaGVkdXJzdCB2ZXJ6ZXJydGUgaWhyZSBHZXNpY2h0c3p1ZWdlICB6dSAgZWluZXIgIEZyYXR6ZSwgIGRpZSAgc2VsYnN0ICBlaW5lCitNZWR1c2EgaGFldHRlIHp1IFN0ZWluIGVyc3RhcnJlbiBsYXNzZW4uICJUeWJhbHQhIE9oLCBUeWJhbHQhIiBTaWUgIHdhcmYgIHNpY2gKK2FuIEVzY2FsdXNlbnMgQnJ1c3QgdW5kIHRyb21tZWx0ZSBtaXQgZGVuIEZhZXVzdGVuIGF1ZiBpaG4gZWluLiAiRWluICBNb250YWd1ZQoraGF0IG1laW5lbiBWZXJ3YW5kdGVuIGVyc3RvY2hlbiEiIFNpZSB6ZXJyYXVmdGUgc2ljaCAgaG9lY2hzdCAgZHJhbWF0aXNjaCAgZGFzCitIYWFyLiAiRGFmdWVyIG11c3MgZGVyIFNjaHVsZGlnZSBoYWVuZ2VuISIKKworRXNjYWx1cyAgd2lzY2h0ZSAgZGllICBGYWV1c3RlCWRlciAgRnJhdSAgQ2FwdWxldCAgYmVpc2VpdGUuICAiV2VyICBoYXQgIGRlbm4KK2FuZ2VmYW5nZW4/IiwgZnJhZ3RlIGVyIGdlZHVsZGlnLgorCitCZW5ldm9saW8gc2NobHVja3RlLiAiVHliYWx0LiBVbmQgZGFubiBoYXQgUm9tZW8gdmVyc3VjaHQsIGlobiB1bmQgTWVyY3V0aW8genUKK3RyZW5uZW4uIEVyIGhhdCBzb2dhciBnZXNhZ3QsIGRhc3MgU2llIGVzIGdhciBuaWNodCAgZ2VybmUgIHNhZWhlbiwgIHdlbm4gIGRpZQorYmVpZGVuIHNpY2ggYXVmIG9mZmVuZXIgU3RyYXNzZSBwcnVlZ2VsdGVuLiIKKworIkF1ZiBvZmZlbmVyIFN0cmFzc2UuIFNvc28uIgorCitCZW5ldm9saW8gYmVtZXJrdGUsIGRhc3MgZGllc2UgQWV1c3NlcnVuZyBmYWxzY2ggYXVzZ2VsZWd0IHdlcmRlbiAga29ubnRlICB1bmQKK3JhbmcgZGllIEhhZW5kZS4gIlR5YmFsdCB3b2xsdGUgZWluZmFjaCBuaWNodCBob2VyZW4gIHVuZCAgaGF0ICBuYWNoICBNZXJjdXRpbworZ2V6aWVsdC4gTmFqYSwgTWVyY3V0aW8gaXN0IG5pY2h0IGdlcmFkZSAgc2FuZnQsICB3ZW5uCW1hbiAgaWhuICB6dSAgcmFzaWVyZW4KK3ZlcnN1Y2h0LCB1bmQgaGF0IHNpY2gJbmF0dWVybGljaCAgZ2V3ZWhydC4gIEFiZXIgIFR5YmFsdCAgd2FyICBlaW4gIGJlc3NlcmVyCitGZWNodGVyLCBkZXNoYWxiIHdvbGx0ZW4gZGllIGJlaWRlbiBnZXJhZGUgbWFlY2h0aWcgbG9zZmVjaHRlbiwgYWxzIFJvbWVvICBzaWUKK3p1IHRyZW5uZW4gdmVyc3VjaHRlLiAgTm9jaCAgbWFsICB6dSAgdHJlbm5lbiAgdmVyc3VjaHRlLiIgIFNlaW5lICBSZWRlICBoYXR0ZQorQmVuZXZvbGlvIGdhbnogYXRlbWxvcyBnZW1hY2h0IHVuZCBlciBob2x0ZSB0aWVmIEx1ZnQuICJNZXJjdXRpbyBzdGFuZCAgaGludGVyCitSb21lbyB1bmQgVHliYWx0IHZvciBpaG0uIEphLCB1bmQgZGFubiBzdGljaHQgVHliYWx0IHVudGVyICBSb21lb3MgIEFybSAgZHVyY2gKK3VuZCBlcndpc2NodCBNZXJjdXRpby4iCisKKyJVbmQgZGFubj8iCisKKyJEYW5uIGlzdCBUeWJhbHQgd2VnZ2VsYXVmZW4sIGFiZXIgd2VpbCBlciBSb21lbyBuaWNodCBzdGVoZW4gIGxhc3NlbiAgd29sbHRlLAora2FtIGVyIHp1cnVlY2sgdW5kIFJvbWVvIHNhaCByb3QuIFRqYSwgZGFubiBoYWJlbiBzaWUgZ2Vmb2NodGVuIHVuZCBSb21lbyAgaGF0CitnZXdvbm5lbi4gQWxsZXMgc28gc2NobmVsbCwgZGFzcyBpY2ggbmljaHQgZGF6d2lzY2hlbiBnZWhlbiBrb25udGUuIgorCisiVW5kIFJvbWVvPyIKKworIklzdCB3ZWcuIgorCitFc2NhbHVzZW5zIEdlc2ljaHQgaGF0dGUgamVuZW4gQXVzZHJ1Y2ssIGRlciBFcndhY2hzZW5lbiBlaWdlbglpc3QsICBkaWUgIGRlbgorU3RyZWl0IHZvbiBLaW5kZXJuIGF1cyBkZXJlbiBBdXNzYWdlbiBuYWNodm9sbHppZWhlbiB3b2xsZW4uICBEYSAgZGllICBtZWlzdGVuCitLaW5kZXIJZGllICBHZXNjaGVobmlzc2UsICBkaWUgIHp1ICBlaW5lbSAgU3RyZWl0ICBmdWVocmVuLCAgbmljaHQgIHVuYmVkaW5ndAorZm9sZ2VyaWNodGlnIHdpZWRlcmdlYmVuLCBmdWVocnQgZGVyIFZlcnN1Y2ggbWVpc3RlbnMgIGRhenUsICBkYXNzICBFcndhY2hzZW5lCitiZWlkZSBLaW5kZXIgZ2xlaWNoZXJtYXNzZW4gZXJtYWhuZW4sICBGcmllZGVuCXp1ICBoYWx0ZW4sICBnbGVpY2gsICB3ZXIgIGRlcgorU2NodWxkaWdlIGFtIFN0cmVpdCB3YXIuIERpZXMgamVkb2NoIGhhdHRlIEVzY2FsdXMgYmVyZWl0cyB2ZXJzdWNodCB1bmQgZXIgc2FoCitzaWNoIGFtIEVuZGUgc2VpbmVyIE1vZWdsaWNoa2VpdGVuLiAgX0Z1c3NiYWxsXywgIGRhY2h0ZSAgZXIsICBfaXN0XyAgX3NjaG9lbl8KK191bmRfIF9ndXRfLCBfYWJlcl8gX3dhc18gX3NvbGxfIF9pY2hfIF9tYWNoZW5fLCBfd2Vubl8gX3NpZV8gX3NpY2hfICBfU3Bpa2VzXworX3VudGVyXyBfZGllXyBfU2NodWhlXyBfbWFjaGVuXyBfdW5kXyBfYmVoYXVwdGVuXywgX3NpZV8gX3dhZXJlbl8gX251cl8gIF9hdXNfCitfVmVyc2VoZW5fICBfZGVtXyAgX2FuZGVybl8gIF9hdWZfICBfZGVuXyAgX0Z1c3NfICBfZ2V0cmV0ZW5fPwlfV2FzXwlfc2luZF8KK19laWdlbnRsaWNoXyBfU3Bpa2VzXz8KKworRnJhdSAgQ2FwdWxldCwJZGllICBkZW4gIG5hY2hkZW5rbGljaGVuICAgR2VzaWNodHNhdXNkcnVjayAgIEVzY2FsdXNlbnMgICBhbHMKK1Vuc2ljaGVyaGVpdCBpbnRlcnByZXRpZXJ0ZSwgd2l0dGVydGUgIEZydWVobGluZ3NsdWZ0LgkiSXN0ICBkb2NoICB2b2xsa29tbWVuCitnbGVpY2hndWVsdGlnLCB3ZXIgYW5nZWZhbmdlbiBoYXQhIEJlbmV2b2xpbyBpc3QgUm9tZW9zIEZyZXVuZCwgIGRhICBrYW5uICBtYW4KK3dvaGwga2F1bSBlcndhcnRlbiwgZGFzcyBlciBkaWUgV2FocmhlaXQgYXVzc2FndC4iCisKK0VzY2FsdXMgd2FyIHNpY2ggZGVyIEJlZmFuZ2VuaGVpdCBzZWluZXMgWmV1Z2VuIGR1cmNoYXVzIGJld3Vzc3QsIGFuZGVyZXJzZWl0cword3Vzc3RlIGVyIG51ciB6dSBnZW5hdSwgZGFzcyBlaW4gR2VoZW5rdGVyIG5pZW1hbHMgIGF1c3JlaWNodCwJZGVuICBCbHV0ZHVyc3QKK2RlcyBNb2JzIHp1IHN0aWxsZW4uIEVyICBob2IgIGRlbW9uc3RyYXRpdiAgZGllICBBcm1lLgkiVHliYWx0ICBoYXQgIE1lcmN1dGlvCitlcnN0b2NoZW4sIGJldm9yIGVyIHNlbGJzdCBlcnN0b2NoZW4gd3VyZGUuIE1pciBzY2hlaW50LCBsaWViZQlGcmF1ICBDYXB1bGV0LAorZGFzcyBSb21lbyBudXIgZGVtIFJhY2hld3Vuc2NoIGRlciBGYW1pbGllIE1vbnRhZ3VlIEdlbnVlZ2UgZ2V0YW4gaGF0LiIKKworSGVyciBNb250YWd1ZSB6YXVkZXJ0ZSBuaWNodCwgaW4gZGllIGdsZWljaGUgS2VyYmUgIHp1CWhhdWVuLgkiUm9tZW8gIGhhZXR0ZQord29obCBkaWUgQXJiZWl0IEhlcnJuIEVzY2FsdXMgdWViZXJsYXNzZW4gc29sbGVuLCBhYmVyIGVyICBoYXQJc2ljaGVybGljaCAgaW0KK0FmZmVrdCBnZWhhbmRlbHQuIFdhciBzb3p1c2FnZW4gbnVyIEhlbmtlci4iCisKK0ZyYXUgQ2FwdWxldCBzY2huYXBwdGUgbmFjaCBMdWZ0LiAiSGVua2VyPyIKKworRXNjYWx1cywgZGVtIGRpZSBTaXR1YXRpb24genUgZW50Z2xlaXRlbiBkcm9odGUsIGhvYiBkaWUgSGFuZC4gIlNjaGx1c3MuIFJvbWVvCitoYXQgbWVpbmUgR2VyaWNodHNob2hlaXQgdW50ZXJncmFiZW4uIEFsc28gdmVyYmFubmUgaWNoICBpaG4uICBGdWVyICBkZW4gIE1vcmQKK3dpbGwgaWNoICB3ZWl0ZXIgIGtlaW5lICBTdHJhZmUgIHZlcmhhZW5nZW4sICB3ZWlsICBpY2ggIFR5YmFsdCAgbmljaHQJYW5kZXJzCitiZWhhbmRlbHQgaGFldHRlLiIKKwpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9yb21fanVsL3NlaXRlMTYgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL3JvbV9qdWwvc2VpdGUxNgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzFkNGJhCi0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9yb21fanVsL3NlaXRlMTYKQEAgLTAsMCArMSwyMTIgQEAKK0RFUiBEUklUVEUgQUtUCisJRElFIFpXRUlURSBTWkVORQorCitKdWxpYSBzYXNzIGF1ZiBkZW0gUmFzZW4sIHN0YXJydGUgaW4gZWluZW4gWmllcnRlaWNoIHVuZCBzZXVmenRlIHRpZWYuCisKK1VsbyBrbmlmZiBlaW4gQXVnZSB6dS4gIldhcyBzaWUgd29obCBoYXQ/IiwgZmx1ZXN0ZXJ0ZSBzaWUgQXp6dXJvIHp1LgorCisiWnV2aWVsIFNvbm5lPyIsIHZlcm11dGV0ZSBBenp1cm8uCisKK0VpbiB3ZWl0ZXJlciBTZXVmemVyIEp1bGlhcyBsaWVzcyBkaWUgIEJlaWRlbiAgd2llZGVyICBoaW51bnRlciAgc2VoZW4uICBKdWxpYQorZXJncmlmZiBlaW5lbiBTdGVpbiwgd29nIGlobiBuYWNoZGVua2xpY2ggaW4gZGVyIEhhbmQgdW5kIHdhcmYgaWhuICBkYW5uICBuYWNoCitkZW0gU3BpZWdlbGJpbGQgZGVyICBTb25uZSAgaW0JVGVpY2guCSJHZWggIGRvY2ggIHdlZy4iLCAgZm9yZGVydGUgIHNpZSAgZGllCit1bm5hY2hnaWViaWdlIFNvbm5lIGF1Zi4KKworIkFiZXIgd2FydW0gZGVubiBibG9zcz8iLCBlbnRmdWhyIGVzIFVsbyBsYXV0ZXIgYWxzIGdlcGxhbnQuCisKK0p1bGlhIGJsaW56ZWx0ZS4gIldlaWwgZHUgc3RvZXJzdC4gV2VubiBkdSB1bnRlcmdlZ2FuZ2VuICBiaXN0LCAga29tbXQgIFJvbWVvLgorQWxzbyB0dSBtaXIgZWlubWFsIGVpbmVuIEdlZmFsbGVuIHVuZCBiZWVpbCBkaWNoLiIgU2llIHZlcmxlZ3RlIHNpY2ggYXVmIExpc3QuCisiR3VjayBtYWwsIHdlbm4gZHUgYXVjaCBudXIgZWluIGJpc3NjaGVuIHNjaG5lbGxlciB3YWVyZXN0LCBkYW5uIGtvZW5udGVzdCAgZHUKK2RpY2ggdmllbCBzY2huZWxsZXIgYXVzcnVoZW4gdW5kIHZpZWxsZWljaHQgbm9jaCBlaW5lIFdlaWxlIGxlc2VuLCBvZGVyIHNvLiIKKworQXp6dXJvIHN0b2VobnRlLiAiQWxzIG9iIGRpZSBTb25uZSBkYSBlaW5lbiBFaW5mbHVzcyBkcmF1ZiBoYWV0dGUuIFVuZCB3ZWxjaGVzCitCdWNoIHNvbGx0ZSBzaWUgd29obCBsZXNlbj8gVmVyYnJlbm50IGRvY2ggc29mb3J0LiIgRXIgIHNjaHVldHRlbHRlICBkZW4gIEtvcGYKK3VlYmVyIHNvdmllbCBVbnZlcm51bmZ0LgorCisiU2llIHdlaXNzIGVzIGphIG5pY2h0IGJlc3Nlci4iIFVsbyB3YXIgYmVyZWl0LCBKdWxpYSBkaWUgSWdub3JhbnogaWhyZXIgIFplaXQKK25pY2h0IGFuenVsYXN0ZW4uCisKK0p1bGlhIHNjaGF1dGUgbmFjaCBXZXN0ZW4uICJJY2ggd3Vlc3N0ZSB6dSBnZXJuZSwgd2FzICBkdSAgYW0gIGxpZWJzdGVuICBpc3N0LAorTmFjaHQsCWRhbm4gIGtvZW5udGUgIGljaCAgZGljaCAgYW5sb2NrZW4gIHVuZCAgZHUgIGthZW1lc3QgIHNjaG5lbGxlci4iICBTaWUKK2xhZWNoZWx0ZS4gIlVuZCBtaXQgZGlyIGtvbW10IFJvbWVvLiIKKworIlVuZCBvYiBlciAga29tbXQuIiAgQXp6dXJvICB2ZXJzdWNodGUgIGVpbiAgSGVjaGVsbiAgdW5kICB3YXJ0ZXRlICBhdWYgIGVpbmVuCitSaXBwZW5zdG9zcyB2b24gVWxvLiBBbHMgZGllc2VyIGF1c2JsaWViLCAgYmxpY2t0ZSAgZXIJdmVyYmx1ZWZmdCAgYXVmICBzZWluZQorR2VmYWVocnRpbi4gIFVsbyAgc2NoYXV0ZSAgYW5nZXN0cmVuZ3QJbmFjaCAgV2VzdGVuICB1bmQgICBzY2hpZW4gICBhZWhubGljaGUKK1VlYmVybGVndW5nZW4gYW56dXN0ZWxsZW4gd2llIEp1bGlhLgorCitFaW4gd2VpdGVyZXIgU3RlaW4gd2FuZGVydGUgaW4gSnVsaWFzIEhhbmQgdW5kIGFobnRlIG5pY2h0cyB2b24gZGVtIFNjaGlja3NhbCwKK2RhcyBpaG4gZXJ3YXJ0ZXRlOiBFciBmbG9nIHNlaW5lbSBCcnVkZXIgbmFjaCBpbiBkZW4gVGVpY2guICJEYSwgc28gd2VyZmUgIGljaAorZGljaCB3ZWcsIEp1bmdmcmFldWxpY2hrZWl0LiIKKworQXp6dXJvIGtpY2hlcnRlLiAiV2VubiBkb2NoIGFsbGUgRnJhdWVuLi4uIgorCitVbG8gc2NobmF1YnRlLgorCisiRnVlciBtZWluZW4gUm9tZW8uLi4iIEp1bGlhIGJyYWNoIGFiIHVuZCBlaW4gZ2llcmlnZXIgQXVzZHJ1Y2sgdHJhdCAgYXVmICBpaHIKK0dlc2ljaHQuICJNRUlOIFJvbWVvLCB3aWUgZGFzIGtsaW5ndCEiCisKK1dhZWhyZW5kIFVsbyB2ZXJzdGFlbmRuaXN2b2xsIG5pY2t0ZSwgd2FuZCBBenp1cm8gc2ljaCBiZWkgSnVsaWFzIFdvcnRlbi4KKworSnVsaWEgc2NoYXV0ZSBob2ZmbnVuZ3N2b2xsIHp1bSBIaW1tZWwsIGFscyBkaWVzZXIgZHVua2xlciAgd3VyZGUgIHVuZAlkcm9odGUKK2Rhbm4gZWluZXIgdm9yd2l0emlnZW4gV29sa2UgbWl0IGRlbSBGaW5nZXIuICJXaWxsc3QgbWljaCByZWlubGVnZW4sIHdpZT8gIEFscwora29lbm50ZXN0IGR1IGVpbmUgTmFjaHQgc2Vpbi4iIFNpZSB6b2cgZGllIE5hc2UgIGtyYXVzICB1bmQgIGxpZXNzICBzaWNoICBkYW5uCitoaW50ZW51ZWJlciBmYWxsZW4uICJBbGxlcmRpbmdzIHNpZWhzdCBkdSBmYXN0IGF1cyB3aWUgbWVpbiBSb21lby4iCisKK0F6enVybywgZGVyIGtlaW5lcmxlaSBBZWhubGljaGtlaXQgZmVzdHN0ZWxsZW4ga29ubnRlLCBzYWggUG9sbHksIGRpZSBzbyByYXNjaAoraWhyZSBhbHRlbiBCZWluZSBzaWUgdHJhZ2VuIHdvbGx0ZW4sIHp1IEp1bGlhIGdlbGF1ZmVuCWthbS4gIEluICBpaHJlbiAgQXJtZW4KK3RydWcgc2llIGVpbiBCdWVuZGVsLCBkYXMgc2ljaCBiZWltICBOYWVoZXJrb21tZW4gIGFscwllaW5lICBhdWZnZXJvbGx0ZSAgdW5kCitob2ZmbnVuZ3Nsb3MgaW5laW5hbmRlciB2ZXJrbm90ZXRlIFN0cmlja2xlaXRlciBlbnRwdXBwdGUuCisKK0p1bGlhLCBkaWUgZGFzIFNjaG5hdWZlbiBQb2xseXMgaG9lcnRlLCBub2NoIGVoZSBzaWUgIGlocmUgIEFtbWUgIHNhaCwJc3ByYW5nCithdWYuICJQb2xseSEgSGFzdCBkdSBkaWUgTGVpdGVyPyIKKworIkxlaXRlciwgamFqYWphLCBkaWUgTGVpdGVyIGhhYiBpY2guIFNvZmVybiBtYW4gZGllc2VuIFNlaWxrbnViYmVsICBub2NoICBlaW5lCitMZWl0ZXIgbmVubmVuIGthbm4uIiBQb2xseSBsaWVzcyAgZGllICBMZWl0ZXIgIGZhbGxlbiAgdW5kICB3aXNjaHRlICBzaWNoICBkZW4KK1NjaHdlaXNzIHZvbiBkZXIgU3Rpcm4uCisKK0p1bGlhIGJldHJhY2h0ZXRlIFBvbGx5ICBrcml0aXNjaC4gICJEdSAgc2llaHN0ICBhdXMsICBhbHMgIGhhZXR0ZXN0ICBkdSAgZWluZQorc2NobGVjaHRlIE5hY2hyaWNodC4iCisKKyJEdSBsaWViZSBHdWV0ZSwgamEsIGFsbGVyZGluZ3MgZWluZSBzY2hsZWNodGUgTmFjaHJpY2h0LiAgV2VpbCAgZXIgIHRvdCAgaXN0LgorQWNoLCBqZXR6dCBpc3QgYWxsZXMgdm9yYmVpIHVuZCB3aXIga29lbm5lbiB1bnMgZ2VyYWRlIHNvIGd1dCAgYXVmaGFlbmdlbiAgbWl0CitkaWVzZXIgdW5zZWxpZ2VuIExlaXRlci4iIFNpZSByYW5nIGRpZSBIYWVuZGUuICJXZWlsIGVyIG5hZW1saWNoIHRvdCAgaXN0ICB1bmQKK25pZSB3aWVkZXIga29tbXQuIgorCitKdWxpYSBlcmJsZWljaHRlIHVuZCBzY2hsdWNrdGUuICJXYXM/IgorCisiSWNoIHNhZyBkb2NoLCBlciBpc3QgdG90LiIKKworIkRhcyBrYW5uIGRvY2ggbmljaHQgd2FociBzZWluLiIgSnVsaWEgc2NodWV0dGVsdGUgZGVuIEtvcGYuCisKKyJEb2NoLCBhbGxlcmRpbmdzIGlzdCBlcyAgd2Foci4gIERhcyAgaGFldHRlICBpY2ggIFJvbWVvICBudW4gIHdpcmtsaWNoICBuaWNodAorenVnZXRyYXV0ISIKKworRGllIEJsYWVzc2UgaW4gSnVsaWFzIEdlc2ljaHQgd2ljaCBoZWt0aXNjaGVuIEZsZWNrZW4uICJEZXIgVGV1ZmVsICBzb2xsICBkaWNoCitob2xlbiwgUG9sbHkhIiwgc2NoaW1wZnRlIHNpZS4KKworIldhcywgbWljaCBhdWNoIG5vY2g/IiBQb2xseSB3YXIgZW50c2V0enQuICBTaWUgIHd1c3N0ZSAgendhciwgIGRhc3MgIHNpZSAgbWl0CitlaW5pZ2VyIFNpY2hlcmhlaXQgbmljaHQgZGFzIFBhcmFkaWVzIHNlaGVuIHd1ZXJkZSwgZG9jaCBzbyAgc2NobmVsbCAgZ2VkYWNodGUKK3NpZSBuaWNodCBpaHJlbiBQbGF0eiB6dSByYWV1bWVuLgorCisiU2NobGVjaHRlIE5hY2hyaWNodGVuICBrYW5uICBtYW4gIG5pY2h0ICBwcnVlZ2VsbiwgIHdvaGwgIGFiZXIgIGRlbiAgQm90ZW4uIiwKK2tvbW1lbnRpZXJ0ZSBVbG8uCisKKyJJY2ggd29sbHRlLCBkdSBiZWthZW1lc3QgZWluZW4gZWluemlnZW4gU2F0eiB6dXNhbW1lbmhhZW5nZW5kIGhlcmF1cywgUG9sbHkuIgorSnVsaWFzIEdlZHVsZCBoYXR0ZSBzaWNoICB2ZXJhYnNjaGllZGV0ICB1bmQgIHNpY2ggIHp1CUphbWVzICBpbiAgZGllCUt1ZWNoZQorYmVnZWJlbiwgd28gc2llIGdlbWVpbnNhbSBhbSAgU2hlcnJ5ICBuYXNjaHRlbi4gICJBbHNvLCAgZGEgIGR1ICBlaW5lciAga2xhcmVuCitBdXNzYWdlIG5pY2h0IGZhZWhpZyBiaXN0OiBMZWJ0IFJvbWVvPyBVbmQgd2VoZSwgZHUgIHNhZ3N0ICBuaWNodCAgZWluZmFjaCAgSmEKK29kZXIgTmVpbiEiIElociBCbGljayB3YW5kZXJ0ZSB6dSBkZW4gU2VpbGVuIHVuZCB2b24gZG9ydCB6dSBQb2xseS4KKworUG9sbHksIGRpZSBhaG50ZSwgd2FzICBKdWxpYXMgIEJsaWNrICBiZWRldXRldGUsICBob2x0ZSAgTHVmdC4JIkljaCAgaGFiICBpaG4KK2dlc2VoZW4sIGRhcyBnYW56ZSBIZW1kIHZvbGwgQmx1dC4gVW5kIGRhcyBpc3QgZG9jaCAgc28gIHNjaHdlciAgYXVzenV3YXNjaGVuLgorSGVycmplbWluZWgsIGVyIHNhaCBzbyB0cmF1cmlnIGF1cywgYmxhc3MgdW5kIHZvbGxlciBCbHV0IHdpZSBlciB3YXIuIiBUcmF1cmlnCitzYWggc2llIEp1bGlhIGFuIHVuZCBob2ZmdGUsIGVpbiB3ZW5pZyBNaXRsZWlkIHp1IGVycmVnZW4uICAiSWNoICBrb25udGUgIG1pY2gKK25pY2h0IG1laHIgYXVmIGRlbiBCZWluZW4gaGFsdGVuLiIKKworSnVsaWEgd3VyZGUgd2llZGVyIGJsZWljaC4gIkRhbm4gaXN0IHdpcmtsaWNoIGFsbGVzIGF1cy4iCisKK1BvbGx5IHplcmRydWVja3RlIGVpbiBwYWFyIFRyYWVuZW4gbWl0IGlocmVtIHZvbHVtaW5vZXNlbiAgVGFzY2hlbnR1Y2guICAiQWNoLAoraWNoIG1vY2h0ZSBpaG4gc28gZ2Vybiwgd2VpbCBlciBkb2NoIGltbWVyIGhvZWZsaWNoIHVuZCBmcmV1bmRsaWNoIHdhci4gIEFybWVyCitUeWJhbHQsIGpldHp0IGJpc3QgZHUgdG90IHVuZCBrYW5uc3QgbmllIG1laHIgbmV0dCBzZWluLiIKKworQWxzIEp1bGlhICBkYWVtbWVydGUsICB3YXMgIFBvbGx5ICBzYWd0ZSwgIGF0bWV0ZSAgdGllZiAgZWluICB1bmQgIGZsdWNodGUgIHNvCithdXNkYXVlcm5kLCBkYXNzIEF6enVybyBzaWUgc3RhdW5lbmQgYW5ibGlja3RlLiAiSWNoIGFobnRlIGphIG5pY2h0LCBkYXNzICBzaWUKK3NvbGNoZSBXb3J0ZSBrZW5udCEiLCBtdXJtZWx0ZSBlciBhbmVya2VubmVuZC4KKworQXVjaCBQb2xseSB3YXIgb2ZmZW5zaWNodGxpY2ggZW50c2V0enQuICJLaW5kLCB3aWUga2FubnN0IGR1IG51ciEiCisKK0p1bGlhIGhpbmdlZ2VuIHdhciBsYWVuZ3N0IGplbnNlaXRzIGFsbGVuIGdlc2l0dGV0ZW4gQmVuZWhtZW5zLiAiV2VubiBkdSBqZXR6dAorbmljaHQgYXVnZW5ibGlja2xpY2ggc2Fnc3QsIHdlciB0b3QgaXN0LCBtZWluIExpZWJsaW5nc3ZldHRlciBUeWJhbHQgb2RlciBtZWluCitIZXJ6bGllYnN0ZXIgUm9tZW8sIGRhbm4gYnJpbmdlIGljaCBkaWNoIHVtISIKKworUG9sbHkgendlaWZlbHRlIG5pY2h0IGRhcmFuLCBkYXNzIEp1bGlhIGdlbmF1IGRhcyB0dW4gd3VlcmRlLiAiVHliYWx0IGlzdCAgdG90Cit1bmQgUm9tZW8gaGF0IGlobiB1bWdlYnJhY2h0LiBSb21lbyBpc3QgdmVyYmFubnQuIgorCisiU2llaCBhbiwgd2FzIGVpbmUgZ2V6aWVsdGUgRHJvaHVuZyBuaWNodCBhbGxlcyBlcnJlaWNoZW4gIGthbm4uIiAgVWxvICBoYWV0dGUKK0p1bGlhIGFwcGxhdWRpZXJ0LCB3ZW5uIGlocmUgRmx1ZWdlbCAgZGFzICB6dWdlbGFzc2VuICBoYWV0dGVuLiAgIlNvZ2FyICBQb2xseQorYmVrb21tdCBlaW5lIGtsYXJlIEF1c3NhZ2UgenVzdGFuZGUuIgorCitHZXN0YXR0ZW4gU2llIG1pciwgbGllYmUgTGVzZXJpbm5lbiB1bmQgTGVzZXIsIGFuIGRpZXNlciBTdGVsbGUgIGVpbmVuCU1vbWVudAorenUgdmVyd2VpbGVuLiBCZXdlaXN0IGRpZSBHZXNjaGljaHRlIG5pY2h0IGFuIGRpZXNlciAgU3RlbGxlLCAgZGFzcyAgYXVjaCAgZGllCitHb2V0dGVyIGRlciBNeXRoZW4gZWluZW4gZ2V3aXNzZW4gU2lubiBmdWVyIEh1bW9yIGhhYmVuPyBEb2NoIGxhZW5nZXIgd2lsbCBpY2gKK1NpZSBuaWNodCBhdWZoYWx0ZW4sIHNjaG9uIHNlaGVuIFVsbyB1bmQgQXp6dXJvIG1pY2ggd3VldGVuZCBhbiwgd2VpbCBpY2ggIGRhcworQmFuZCBhbmdlaGFsdGVuIGhhYmUgdW5kIGRlbiBBbmJsaWNrIGVpbmVyIHZlcndpcnJ0ZW4gIFBvbGx5ICBlYmVuc28gIGdlbmllc3NlCit3aWUgZGVuIGRlciBpbm5lcmxpY2ggemVycmlzc2VuZW4gSnVsaWEuCisKKyJTaWUgc2l0enQgd2lya2xpY2ggaW4gZGVyIFBhdHNjaGUsIG5pY2h0PyIgVWxvICBrb25udGUgIHNpY2ggIGVpbiAgaGFlbWlzY2hlcworRmVkZXJzY2h1ZXR0ZWxuIG5pY2h0IHZlcmtuZWlmZW4uCisKK0p1bGlhIHJhbm50ZSB2ZXJ6d2VpZmVsdCB1bSBkZW4gVGVpY2ggaGVydW0uICJXYXMgc29sbCAgaWNoICBudW4gIGRlbmtlbj8gIFdpZQora29ubnRlIFJvbWVvIGRhcyBudXIgdHVuPyBIYXQgZXIgendlaSBHZXNpY2h0ZXI/IEhhdCBlciBtaWNoIGFuZ2Vsb2dlbj8gV29sbHRlCitlciBuaWNodCBzZWluZSBnYW56ZSBGYW1pbGllIGF1ZmdlYmVuPyBIYXQgZXIgbWljaCBzbyBoaW50ZXJnYW5nZW4/IEhhdCBlciAgYW0KK0VuZGUgbnVyIGdlc2FndCwgZXIgbGllYmUgbWljaCwgdW0gbWljaCB1bmQgbWVpbmUgRmFtaWxpZSBkYW1pdCB6dSAga3JhZW5rZW4/IgorU2llIGRyZWh0ZSBlaW5lIHdlaXRlcmUgUnVuZGUgdW0gZGVuIFRlaWNoLgorCisiTWFlbm5lciEiLCBmbHVjaHRlIFBvbGx5IG1pdCBFbGFuLiAiU28gc2luZCAgc2llICBkb2NoICBhbGxlOiAgSGludGVybGlzdGlnZSwKK2hldWNobGVyaXNjaGUsIGhhbGJzZWlkZW5lIEhhemFyZGV1cmUhIiBTaWUga3JhbXRlIGluICBpaHJlciAgSGFuZHRhc2NoZSAgbmFjaAorZWluZXIgZmxhY2hlbiBGbGFzY2hlLiAiRGEgaGlsZnQgbnVyIG5vY2ggTWVkaXppbi4iCisKK0F6enVybywgZGVyIGRlbiBHZXJ1Y2ggdm9uIFBvbGx5cyBNZWRpemluIGdlbnVlc3NsaWNoIGVpbnNvZywgaGFldHRlIGlociBzb2dhcgorZGllIFNjaG1hZWh1bmcgYWxsZXIgTWFlbm5lciB2ZXJnZWJlbiwgd2VubiAgc2llICBpaG0gIG51ciAgZWluICBwYWFyICBUcm9wZmVuCithYmdlZ2ViZW4gaGFldHRlLgorCisiTmljaHRzIGRhISIgSnVsaWEgc2NobHVnIFBvbGx5IGRpZSBGbGFzY2hlIGF1cyBkZXIgSGFuZC4gIkltICBIYWxzICBzb2xsICBkaXIKK2RhcyBaZXVnIHN0ZWNrZW4gYmxlaWJlbiwgd2VpbCBkdSBSb21lbyBzbyBldHdhcyBuYWNoc2Fnc3QuIgorCitCZWRhdWVybmQgc2NoYXV0ZW4gQXp6dXJvIHVuZCBQb2xseSAgYXVmICBkaWUgIEZsYXNjaGUsICBkaWUgIGlocmVuICBrb3N0YmFyZW4KK21lZGl6aW5pc2NoZW4gSW5oYWx0IGFuIGVpbiBwYWFyIFd1ZXJtZXIgIHZlcnRlaWx0ZS4gICJEdSAga2FubnN0ICBkb2NoICBuaWNodAorc2FnZW4sIGRhc3MgZGVyIE1hbm4sIGRlciAgZGVpbmVuICBWZXR0ZXIgIHVtZ2VicmFjaHQgIGhhdCwgIGVpbiAgYW5zdGFlbmRpZ2VyCitpc3QuIiwgbWVpbnRlIFBvbGx5IHZlcnN0YWVuZG5pc2xvcy4KKworIkltbWVyaGluIGlzdCBlciBtZWluIEVoZW1hbm4uIiwgd2llcyBKdWxpYSBpaHJlIEFtbWUgenVyZWNodC4gIlVuZCAgd2VubiAgaWNoCittaWNoIG5pY2h0IHNlaHIgdGFldXNjaGUsIHdpcmQgUm9tZW8gc2Nob24gIGVpbmVuICBHcnVuZCAgZ2VoYWJ0ICBoYWJlbi4iICBTaWUKK3VlYmVybGVndGUgdW5kIGlociBHZXNpY2h0IGhlbGx0ZSBzaWNoIGF1Zi4gIk5hdHVlcmxpY2gsIHNvICB3aXJkICBlcyAgZ2V3ZXNlbgorc2VpbiEgTm90d2VociEgVHliYWx0IHdvbGx0ZSBtZWluZW4gUm9tZW8gdW1icmluZ2VuIHVuZCAgUm9tZW8JaGF0ICBzaWNoICBudXIKK2dld2VocnQuIiBCZWZyaWVkaWd0IHVlYmVyIGRpZXNlIExlc2FydCBob2IgSnVsaWEgZGllIEZsYXNjaGUgd2llZGVyICBhdWYgIHVuZAorcmVpY2h0ZSBzaWUgUG9sbHksIGRpZSBkZW4gUmVzdCBkZXIgTWVkaXppbiBpbiBzaWNoIGhpbmVpbnNjaHVldHRldGUuCisKK0p1bGlhIHNhaCBuYWNoZGVua2xpY2ggYXVmIEF6enVybywgZGVyIHNpY2ggbWl0IGRlbiAgV3Vlcm1lcm4gIHVtICBkaWUJa2xlaW5lCitQZnVldHplIHN0cml0dC4gIlZpZWwgc2NobGltbWVyIGlzdCBlaW5lICBhbmRlcmUgIFNhY2hlLiAgUm9tZW8gIGlzdCAgdmVyYmFubnQKK3dvcmRlbi4gSmV0enQgYmluIGljaCBrYXVtIGRyZWkgU3R1bmRlbiB2ZXJoZWlyYXRldCwgYWJlciBtZWluZSBIb2NoemVpdHNuYWNodAorYmVrb21tZSBpY2ggbmljaHQuIgorCitVbG8ga29ubnRlIEp1bGlhcyBHZXNpY2h0c2F1c2RydWNrIG5pY2h0IGRldXRlbi4gIlNvIHNjaGxpbW0gaXN0IGRhcyBudW4gIGF1Y2gKK3dpZWRlciBuaWNodC4iCisKKyJEb2NoLiIgQXp6dXJvIHd1c3N0ZSB3b2hsLCAgZGFzcyAgSnVsaWEgIHdlbmlnZXIgIGRhcnVudGVyICBsaXR0LCAgZGFzcyAgaWhyZQorRWhlc2NobGllc3N1bmcgamV0enQgbmljaHRpZyB6dSBzZWluIGRyb2h0ZS4gIlNpZSBoYXQgT3ZpZCBnZWxlc2VuLiIKKworIk1ldGFtb3JwaG9zZW4/IiwgZnJhZ3RlIFVsby4KKworIkFycyBhbWFuZGkuIgorCisiT2guIiBVbG8gd2FyIGVyc3RhdW50LgorCisiV28gc2luZCBlaWdlbnRsaWNoIG1laW5lIEVsdGVybj8iLCBmcmFndGUgSnVsaWEuCisKKyJTaWUgaGFsdGVuIGJlaSBUeWJhbHQgZGllIFRvdGVud2FjaGUuIEljaCBrYW5uICBkaWNoICBoaW5icmluZ2VuLCAgYWxsZXJkaW5ncworc29sbHRlc3QgZHUgZGlyIHZvcmhlciBlaW4gZnJpc2NoZXMgVGFzY2hlbnR1Y2ggaG9sZW4uIgorCisiTmVpbiwgZXMgcmVpY2h0LCB3ZW5uICBzaWUgIEhldWxlbiAgdW5kICBaYWVobmVrbmlyc2NoZW4gIGRlbW9uc3RyaWVyZW4sICBpY2gKK2JyYXVjaGUgIGRhICBuaWNodCAgbWl0enVtYWNoZW4uICBBdXNzZXJkZW0gIG11ZXNzdGUgIGljaCAgbWljaCAgenVyICAgSGFlbGZ0ZQordmVyc3RlbGxlbi4iIEp1bGlhIHN0cmFmZnRlIGRpZSBTY2h1bHRlcm4uICJJY2ggZ2VoZSBhdWYgbWVpbiBaaW1tZXIgdW5kIHdhcnRlCithdWYgbWVpbiBFbmRlLiIKKworIkRhZnVlciBiaXN0IGR1IG5vY2ggenUganVuZywgS2luZC4gRXMgd2lyZCB3b2hsIG5vY2ggZWluZSBXZWlsZSBkYXVlcm4uIgorCisiV2VubiBSb21lbyBtZWluZSBKdW5nZnJhZXVsaWNoa2VpdCBuaWNodCBiZWtvbW10LCBkYW5uIGF1Y2gga2VpbiBhbmRlcmVyICBhbHMKK1RvZCwgZGVyIG9obmVoaW4gYW0gRW5kZSBhbGxlcyBiZWtvbW10LiIKKworIkhNPyIsIGZyYWd0ZSBlaW5lIGR1bXBmZSBTdGltbWUgYXVzIGRlbSBTY2hhdHRlbiBkZXIgR2FydGVubWF1ZXIuCisKKyJOaWNodCBqZXR6dC4iIFVsbyBzY2hldWNodGUgVG9kIGRhdm9uLgorCitQb2xseSwgZGllIEp1bGlhcyBCbGFlc3NlIG1pc3N2ZXJzdGFuZCB1bmQgYWxzIFN1aXppZGFic2ljaHQgIGRldXRldGUsCXVlYmVyLQorbGVndGUgYW5nZXN0cmVuZ3QuICJEYW5uIGdpYnQgZXMgd29obCBrZWluZSBhbmRlcmUgTW9lZ2xpY2hrZWl0LCBhbHMgZGFzcyBpY2gKK1JvbWVvIGhlcmJlaXNjaGFmZmUuIEVyIGhhdCBzaWNoIGJlaSBCcnVkZXIgTGF3cmVuY2UgdmVyc3RlY2t0LiIKKworIldhcnVtIGhhc3QgZHUgZGFzIG5pY2h0IGVoZXIgZ2VzYWd0PyIgSnVsaWEgcmlzcyBzaWNoIGRlbiAgUmluZyAgdm9tICBGaW5nZXIsCitkZW4gc2llIGdlcmFkZSBlcnN0IHZvbiBSb21lbyBiZWtvbW1lbiBoYXR0ZS4gIkJyaW5nIGlobSBkZW4gUmluZyB1bmQgc2FnIGlobSwKK2Rhc3MgZXIgaWhuIG1pciB3aWVkZXJnZWJlbiBzb2xsLiIKKwpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9yb21fanVsL3NlaXRlMTcgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL3JvbV9qdWwvc2VpdGUxNwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGQ4MTZlCi0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9yb21fanVsL3NlaXRlMTcKQEAgLTAsMCArMSwxNTAgQEAKK0RFUiBEUklUVEUgQUtUCisJRElFIERSSVRURSBTWkVORQorCitCcnVkZXIgTGF3cmVuY2UsIGRlciBuaWNodCB3ZW5pZ2VyIG5ldWdpZXJpZyB3YXIgYWxzIGFuZGVyZSwgIGhhdHRlICBzaWNoICBhdWYKK2RlbSBNYXJrdHBsYXR6IGhlcnVtZ2V0cmllYmVuLCBiaXMgZXIgdm9uIFJvbWVvcyBWZXJiYW5udW5nIGhvZXJ0ZS4gTnVuIHJhbm50ZQorZXIsIHNvIHNjaG5lbGwgaWhuIHNlaW5lIEJlaW5lIHRyYWdlbiB3b2xsdGVuIHp1IHNlaW5lciBLYXBlbGxlICB6dXJ1ZWNrLiAgQWxzCitlciBzaWUgdm9lbGxpZyBhdXNzZXIgQXRlbSBlcnJlaWNodGUsIGZhbmQgZXIgUm9tZW8sIGRlciBkYXMgIEdlc2ljaHQgIGluICBkZW4KK0hhZW5kZW4gdmVyZ3JhYmVuIGhpZWx0LgorCisiUm9tZW8hIiBMYXdyZW5jZSBidWVja3RlIHNpY2ggc3RvZWhuZW5kIHp1IHNlaW5lbSBGcmV1bmQgIGhlcnVudGVyLiAgIkhhc3QuLi4KK2Jpc3QuLi4gd2lyc3QuLi4/IiBFciBzY2huYXVmdGUuCisKK1JvbWVvIHNhaCBpaG4gbWl0IHRydWViZW4gQXVnZW4gYW4uICJEcmVpbWFsIGphLiIKKworVmVyd2lycnQgcnVuemVsdGUgTGF3cmVuY2UgZGllIFN0aXJuLgorCitFaW4gZHVlbm5lcyBMYWVjaGVsbiBodXNjaHRlIHVlYmVyIFJvbWVvcyBHZXNpY2h0LCBzYWggc2VpbmUgZ2VmdXJjaHRlCVN0aXJuLAorYmV0cmFjaHRldGUgZGllIHJhc3Rsb3Mga25ldGVuZGVuIEhhZW5kZSB1bmQgbWFjaHRlIHNpY2ggdm9uIGRhbm5lbi4gIkljaCBoYWJlCitUeWJhbHQgZXJzdG9jaGVuLCBpY2ggYmluIGdlZmxvaGVuICB1bmQgIGljaCAgd2VyZGUgIG1pY2ggIGF1ZmhhZW5nZW4gIGxhc3Nlbi4KK0RyZWltYWwgamEsIGFsc28uIgorCisiV2VyIHJlZGV0IGRlbm4gaGllciB2b24gQXVmaGFlbmdlbj8iCisKKyJJY2ggd2VyZGUgIG5pY2h0ICBkYXZvbmtvbW1lbiwgIHdlaXNzdCAgZHUuICBFc2NhbHVzICBoYXQgIHppZW1saWNoICBkZXV0bGljaAorZ2VtYWNodCwgd2FzIGVyIHZvbiBSYW5kYWxlIGluIGRlbiBTdHJhc3NlbiBoYWVsdC4iCisKKyJEb2NoLCBkb2NoLiIsIGJlcnVoaWd0ZSBCcnVkZXIgTGF3cmVuY2UgaWhuICJEdSBrb21tc3Qgc2Nob24gIGRhdm9uLiAgRXNjYWx1cword2FyIGRlciBBbnNpY2h0LCBkYXNzIGVyIFR5YmFsdCBvaG5laGluIGhhZXR0ZSBoYWVuZ2VuIG11ZXNzZW4sIHdlaWwgZXIgdm9yaGVyCitNZXJjdXRpbyB1bWdlYnJhY2h0IGhhdC4gSmV0enQgdmVydXJ0ZWlsdCBlciBkaWNoIG51ciB6dXIgVmVyYmFubnVuZywgd2VpbCAgZHUKK2lobSB2b3JnZWdyaWZmZW4gaGFzdC4iCisKK1JvbWVvcyBBdWdlbiB3ZWl0ZXRlbiBzaWNoLiAiVmVyYmFubnVuZz8gRGFzIGlzdCBqYSBub2NoIHNjaGxpbW1lciEiCisKKyJVbnNpbm4uIFdlbmlnc3RlbnMgYmxlaWJzdCBkdSBhbSBMZWJlbi4iCisKKyJVbmQgd2FzIGZ1ZXIgZWluIHd1bmRlcmJhcmVzIExlYmVuIGRhcyBpc3QuIiBSb21lbyBrbmlyc2NodGUgdm9yIFZlcmJpdHRlcnVuZworbWl0IGRlbiBaYWVobmVuLiAiSWNoIG11c3MgVmVyb25hIHZlcmxhc3NlbiB1bmQgSnVsaWEgYmxlaWJ0IGhpZXIuIgorCisiV2VubiBzY2hvbj8gRHUgbGVic3QsIHNpZSBsZWJ0OiBXYXMgd2lsbHN0IGR1IG1laHI/IgorCisiQmVpIGlociBzZWluLiIKKworIlNlaSBuaWNodCB1bmRhbmtiYXIsIEp1bmdlLiIgU28gd2FyIFJvbWVvIHNjaG9uIGxhbmdlIG5pY2h0IG1laHIgIHZvbiAgQnJ1ZGVyCitMYXdyZW5jZSBiZXplaWNobmV0IHdvcmRlbi4gIlNlbGJzdCB3ZW5uIGR1IFZlcm9uYSB2ZXJsYXNzZW4gIG11c3N0LCAgYmlzdCAgZHUKK2ltbWVyIG5vY2gganVuZyBnZW51Zy4gRHUgbGVic3QgdW5kIGthbm5zdCBpbiBSdWhlIGFid2FydGVuLCB3YXMgIHNpY2gJd2VpdGVyCitlcmdpYnQuIFZpZWxsZWljaHQga2FubnN0IGR1IGVpbmVzIFRhZ2VzIGphIHp1cnVlY2trb21tZW4uIgorCisiRWhlciBpc3QgZGllIEVyZGUgZWluZSBTY2hlaWJlLiIKKworQnJ1ZGVyIExhd3JlbmNlLCBkZXIsIGZlc3QgaW0gIERvZ21hICB2ZXJhbmtlcnQsICBzb2xjaCAga2V0emVyaXNjaGUgIEdlZGFua2VuCituaWNodCB2b24gc2VpbmVtIFNjaHVldHpsaW5nIGhvZXJlbiB3b2xsdGUsIHdhcmYgdmVyendlaWZlbHQgZGllIEhhZW5kZSBpbiBkaWUKK0x1ZnQuICJEYXMgaXN0IHNpZS4iCisKK1JvbWVvIGxhY2h0ZSBnYWNrZXJuZC4gIk5hdHVlcmxpY2guIgorCisiUm9tZW8sIHJlaXNzIGRpY2ggenVzYW1tZW4uIEVzIGlzdCBub2NoIG5pY2h0IGFsbGVyIFRhZ2UgQWJlbmQuIgorCisiRG9jaCwgZGFzIGlzdCBlcy4gT2huZSBKdWxpYSBpc3QgaW1tZXIgTmFjaHQsIG9obmUgc2llIGdpYnQgZXMga2VpbmUgU29ubmUuIgorCisiVWxvLCByZWljaCBtaXIgZWluZW4gTGFwcGVuLCBSb21lbyB0cmllZnQuIiwgZmx1ZXN0ZXJ0ZSBBenp1cm8uCisKKyJWb3IgVHJhZW5lbj8iCisKKyJWb3IgU2NobWFsei4iCisKK1VsbyBiZWFjaHRldGUgaWhuIG5pY2h0IHdlaXRlciwgc29uZGVybiByaWViIHNpY2ggZGVuIFNjaG5hYmVsIGFuIGVpbmVtIEJsYXR0LgorCitBdWNoIFJvbWVvIHdpc2NodGUgc2ljaCBkaWUgVHJhZW5lbiBhYi4gIlZlcmJhbm51bmcgaXN0IGRlc2hhbGIgc2NobGltbWVyICBhbHMKK0hhZW5nZW4sIHdlaWwgaWNoIGRhbm4gamVkZW4gVGFnIGRhcmFuCWRlbmtlbgltdXNzLCAgZGFzcyAgSnVsaWEgIGhpZXIgIGlzdC4KK1NlbGJzdCBpaHIgU2Nob3NzaHVuZCBpc3QgYmVzc2VyIGRyYW4gYWxzIGljaCwgd2VpbCBlcglpbiAgaWhyZXIgIE5hZWhlICBzZWluCitrYW5uLiBEYXMgaXN0IGVpbiBCYWVyZW5kaWVuc3QsICBkZW4gIEVzY2FsdXMgIHVuZCAgZHUJbWlyICBlcndlaXNlbiwJQnJ1ZGVyCitMYXdyZW5jZS4iCisKKyJJY2g/IiBMYXdyZW5jZSB3YXIgZWhybGljaCBlbnRzZXR6dC4KKworIkR1IGJyaW5nc3QgbWlyIGRpZSBOYWNocmljaHQsIG9kZXI/IgorCitFaW4gS2xvcGZlbiBiZXdhaHJ0ZSBCcnVkZXIgTGF3cmVuY2Ugdm9yIGRlbiBWb3J3dWVyZmVuLCBkaWUgIFJvbWVvICBub2NoICBhdWYKK2RlbiBMaXBwZW4gaGF0dGUuCisKKyJHZWggbmFjaCBoaW50ZW4sIFJvbWVvLCBpY2ggd2lsbCBuYWNoc2VoZW4sIHdlciBkYSBpc3QuIgorCitSb21lbyBoYXR0ZSBzaWNoIGF1ZiBkZW0gQm9kZW4genVzYW1tZW5nZXJvbGx0IHVuZCBzY2hsdWNoenRlIHN0aWxsICB2b3IgIHNpY2gKK2hpbi4KKworIlJvbWVvISIsIHppc2NodGUgQnJ1ZGVyIExhd3JlbmNlLiBFciB3YW5kdGUgIHNpY2ggIHp1ciAgVHVlci4gICJFaW5lbiAgTW9tZW50Citub2NoISIgVmVyendlaWZlbHQgYmxpY2t0ZSBlciB6d2lzY2hlbiBkZXIgVHVlciB1bmQgUm9tZW8gaGluICB1bmQgIGhlci4gICJXZXIKK2lzdCBkZW5uIGRhPyIKKworUG9sbHkgdHJhdCB3dWV0ZW5kIGdlZ2VuIGRpZSBUdWVyLiAiSWNoIGJyaW5nZSBlaW5lIE5hY2hyaWNodCB2b24gSnVsaWEuIgorCitSb21lbyBzY2hhdXRlIGF1Zi4KKworTGF3cmVuY2Ugb2VmZm5ldGUgZGllIFR1ZXIgdW5kIHZlcmRlY2t0ZSBtaXQgc2VpbmVyIExlaWJlc2Z1ZWxsZSBSb21lby4gQWxzIGVyCitQb2xseSBlcmthbm50ZSwgc2V1Znp0ZSBlci4gIldhcyBnaWJ0IGVzPyIKKworIkVyc3QgbXVzcyBpY2ggd2lzc2VuLCB3byBSb21lbyBpc3QuIgorCitMYXdyZW5jZSB0cmF0IHp1ciBTZWl0ZS4gIlNhbW1lbG4gU2llIGlobiBhdWYuIiwgc2NobHVnIGVyIHZvciB1bmQgZGV1dGV0ZSBhdWYKK2RhcyBIYWV1ZmNoZW4gRWxlbmQgenUgc2VpbmVuIEZ1ZXNzZW4uCisKK1BvbGx5IHNjaHVldHRlbHRlIGRlbiBLb3BmLiAiU293YXMgRHVtbWVzIGFiZXIgYXVjaCEgSmV0enQgc3RlY2tlbiAgSnVsaWEgIHVuZAorU2llIGltIGdsZWljaGVuIFNjaGxhbWFzc2VsLiBBYmVyIGRhcyBpc3QgdmVyZ29zc2VuZSBNaWxjaCwgamV0enQga25laWZlbiAgU2llCitkZW4gQS4uLiBSZWlzc2VuIFNpZSBzaWNoIHp1c2FtbWVuLCBtZWluZSBpY2ggbmF0dWVybGljaC4iCisKK1JvbWVvIHZlcnN1Y2h0ZSBlcyB1bmQgc2NoZWl0ZXJ0ZSBrbmFwcC4KKworIlNvIHNpZWh0IGVpbiBicmF2ZXIgUm9tZW8gYXVzLiIsIGxvYnRlIFBvbGx5LiAiRXMgaXN0IG5vY2ggbmljaHQgIGFsbGVyICBUYWdlCitBYmVuZCwgbWVpbiBKdW5nZS4iCisKKyJNZWluZSBSZWRlLiIsIGZ1ZWd0ZSBMYXdyZW5jZSBsYWVjaGVsbmQgaGluenUuCisKKyJXYXMgbWFjaHQgSnVsaWE/Iiwgd29sbHRlIFJvbWVvIHdpc3Nlbi4KKworIldhcyBzb2xsIHNpZSBzY2hvbiB0dW4/IFNpZSB3ZWludCB1bmQgdmVyZmx1Y2h0IFNpZSB1bmQgZGFubiB3ZWludCBzaWUgd2llZGVyCit1bmQuLi4iCisKKyJJY2gga2FubiBlcyBpaHIgbmljaHQgdmVyZGVua2VuLiBBYmVyIHdlbm4gc2VsYnN0IHNpZSBtaWNoICB2ZXJmbHVjaHQuLi4iICBFcgorYnJhY2ggYWIgdW5kIHJpc3Mgc2VpbiBNZXNzZXIgaGVyYXVzLiAiRGFubiBzYWcgaWhyLCBkYXNzIGljaCBtaXQgaWhyZW0gIE5hbWVuCithdWYgZGVuIExpcHBlbiBzdGVyYmVuIHdpbGwhIgorCitQb2xseSBvaHJmZWlndGUgaWhuLCBkYXMgTWVzc2VyIGZsb2cgaW4gZWluZSBFY2tlIHVuZCBSb21lbyBpbiBkaWUgYW5kZXJlLgorCitCcnVkZXIgTGF3cmVuY2UsIGRlc3NlbiBVZWJlcnpldWd1bmcgaWhtIGRhcyBnbGVpY2hlIEFyZ3VtZW50ICB2ZXJib3QsCXNldHp0ZQorenUgZWluZXIgUHJlZGlndCBhbi4gIkR1IGJpc3Qgd2lya2xpY2ggZWluIFZvbGx0cm90dGVsLCBSb21lby4gRXJzdCB1ZWJlcmxlYnN0CitkdSwgb2J3b2hsIFR5YmFsdCB3YWhyc2NoZWlubGljaCBkZXIgYmVzc2VyZSBGZWNodGVyIGlzdC4gRGEgaGFzdCBkdSAgR2x1ZWNrLiIKK0VyIHNjaGx1ZyBSb21lbyBkYXMgV29ydCB1bSBkaWUgT2hyZW4uICJFc2NhbHVzIGJlc3RyYWZ0IGRpY2ggbmljaHQgZnVlciBNb3JkLAorc29uZGVybiBmdWVyIFNlbGJzdGp1c3Rpei4gRGEgaGFzdCBkdSBHbHVlY2suIEp1bGlhIHRyYXVlcnQgdW0JaWhyZW4gIFZldHRlciwKK2FiZXIgUG9sbHkgaXN0IGJlc3RpbW10IG5pY2h0IGhpZXIsIHVtIGRpciB6dSBzYWdlbiwgZGFzcyBzaWUgZGljaCBuaWNodCAgbWVocgorc2VoZW4gd2lsbC4gRGEgaGFzdCBkdSBHbHVlY2suIgorCitQb2xseSBuaWNrdGUuICJBbGxlcmRpbmdzLiBIaWVyIGlzdCBkZWluIFJpbmcsIFJvbWVvLiIKKworIkp1bGlhIGdpYnQgaWhuIG1pciB6dXJ1ZWNrPyIgUm9tZW8gYmVnYW5uIGxhdXQgenUgamFtbWVybi4KKworIkR1IHNvbGxzdCBpaG4gaWhyIG5vY2ggZWlubWFsIGdlYmVuLCBUcm90dGVsLiIgIExhd3JlbmNlICBzY2hsdWcgIGRpZSAgSGFlbmRlCit6dXNhbW1lbiB1ZWJlciBzb3ZpZWwgVW52ZXJzdGFuZC4gIk1vcmdlbiByZWlzdCBkdSBhYiB1bmQgIHdhcnRlc3QgIGluLi4uIiAgRXIKK3VlYmVybGVndGUuICJTYWdlbiB3aXIsIE1hbnR1YSwgYmlzIFBvbGx5IHVuZCAgaWNoICBHZWxlZ2VuaGVpdCAgaGFiZW4sICBhbGxlbgorTGV1dGVuIHZvbiBKdWxpYXMgdW5kIGRlaW5lciBFaGUgenUgZXJ6YWVobGVuLiBEYW5uIGtvbW1zdCBkdSB6dXJ1ZWNrIHVuZCB3ZW5uCitpaHIgbmljaHQgc3RlcmJ0LCBsZWJ0IGlociBnbHVlY2tsaWNoIGJpcyB6dSBldXJlbSBFbmRlLiIgRXIgIHdhbmR0ZSAgc2ljaCAgYW4KK1BvbGx5LiAiR2VoIHp1IEp1bGlhIHVuZCBzYWcgaWhyLCBkYXNzIFJvbWVvIGtvbW10LiAgRXIgIHdlaXNzICBlcyAgendhciAgbm9jaAorbmljaHQsIGFiZXIgZXIga29tbXQuIiBXaWVkZXIgZmllbCBzZWluIEJsaWNrIGF1ZiBSb21lby4gIlNvLCBqZXR6dCAgaG9lciAgbWlyCittYWwgenUsIEp1bmdlLi4uIgorCitBenp1cm8gc3RpZXNzIFVsbyBhbi4gIktvbW0sIGRhcyBHZXdpdHRlciB3aWxsIGljaCBuaWNodCBtaXRlcmxlYmVuLiIKKworIldlbGNoZXMgR2V3aXR0ZXI/IiwgZnJhZ3RlIExhd3JlbmNlIHNjaGVpbmhlaWxpZy4KKworRGllIFR1cnRlbGtyYWVoZW4gbWFjaHRlbiBzaWNoIGViZW5zbyBzY2huZWxsIGF1cyBkZW0gU3RhdWIgd2llIFBvbGx5LgorCmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL3JvbV9qdWwvc2VpdGUxOCBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvcm9tX2p1bC9zZWl0ZTE4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZTY4NmYKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL3JvbV9qdWwvc2VpdGUxOApAQCAtMCwwICsxLDUzIEBACitERVIgRFJJVFRFIEFLVAorCURJRSBWSUVSVEUgU1pFTkUKKworQ2FwdWxldCB1bmQgUGFyaXMgc2Fzc2VuIHNpY2ggYmVpIGVpbmVtIEdsYXMgIFdlaW4gIGdlZ2VudWViZXIuICAiRXMgIHR1dCAgbWlyCit3aXJrbGljaCBsZWlkLCBkYXNzIEp1bGlhIGhldXRlIGFiZW5kIG5pY2h0IG1laHIgenUgdW5zIGtvbW10LglTaWUgIGlzdCAgc2VocgorYXVmZ2VicmFjaHQuIiBFciB3aWVndGUgZGVuIEtvcGYuICAiSWNoICBoYXR0ZSAgbm9jaCAga2VpbmUgIEdlbGVnZW5oZWl0LCAgaWhyCitrbGFyenVtYWNoZW4sIGRhc3Mgc2llIGRpY2ggaGVpcmF0ZW4gd2lyZC4iCisKKyJFciBrbGluZ3QsIGFscyBzZWkgaWhtIFR5YmFsdHMgVG9kIHZvZWxsaWcgZWdhbC4iLCBzdGVsbHRlIFVsbyBmZXN0LgorCisiRXIgaXN0IGVpbiBob21vIHBvbGl0aWN1cy4iCisKKyJTb2xjaGUgV29ydGUgc2Fnc3QgZHUgIG5pY2h0ICBpbiAgbWVpbmVtICBCZWlzZWluLCAgQXp6dXJvISIsICB2ZXJsYW5ndGUgIFVsbworZW50cnVlc3RldC4KKworQXp6dXJvIHNjaG5hcHB0ZSBuYWNoIEx1ZnQsIHNjaHdpZWcgYWJlci4KKworIlVuZ2x1ZWNrbGljaGUgVW1zdGFlbmRlIHNpbmQgZGFzLiIsIGJla2xhZ3RlIHNpY2ggUGFyaXMuICAiSWNoICBoYWV0dGUgIGdlcm5lCitlaW4gYmlzc2NoZW4gWmVpdCBtaXQgaWhyIHZlcmJyYWNodC4iCisKK0ZyYXUgQ2FwdWxldCBsYWVjaGVsdGUuICJLZWluZSBTb3JnZSwgaWNoIHdlcmRlIG1vcmdlbiBmcnVlaCBtaXQgaWhyIHJlZGVuIHVuZAorSnVsaWEgd2lyZCBtaXIgc2FnZW4sIGRhc3Mgc2llIHNpY2ggYXVmICBpaHJlICBIb2NoemVpdCAgZnJldXQuIiAgSWhyICBHZXNpY2h0CitsaWVzcyBrZWluZW4gWndlaWZlbCBkYXJhbiwgZGFzcyBKdWxpYSBzaWNoIGxpZWJlciBmcmV1ZW4gc29sbHRlLiAiSGV1dGUgYWJlbmQKK3dhZXJlIGVzIHNpY2hlcmxpY2ggZWluIHdlbmlnLi4uIiBTaWUgem9lZ2VydGUuICIuLi51bnBhc3NlbmQsIHNpZSB6dSBzdG9lcmVuLAorYWJlciBtb3JnZW4gc2llaHQgYWxsZXMgc2Nob24gd2llZGVyIGFuZGVycyBhdXMuIgorCitIZXJyIENhcHVsZXQgbmlja3RlLiAiSmEsIG1vcmdlbiAgc2llaHQgIGFsbGVzICBhbmRlcnMgIGF1cy4gIEljaCAgZGVua2UsICB3aXIKK3NvbGx0ZW4gbnVyIGVpbmUga2xlaW5lIEZlaWVyIGF1c3JpY2h0ZW4sIHVtIGV1cmUgSG9jaHplaXQgIHp1CWZlaWVybi4gIFdhZXJlCitkaXIgTWl0dHdvY2ggcmVjaHQsIFBhcmlzPyIKKworIkhldXRlIGlzdCBNb250YWcsIGlzdCBkYXMgbmljaHQgZWluIGJpc3NjaGVuIHNjaG5lbGw/Iiwgd2FuZHRlIFBhcmlzIGVpbi4KKworIkphLCBkcmVpIFRyYXVlcnRhZ2Ugc29sbHRlbiB3aXIgIGVpbmhhbHRlbiwgIHNjaGxpZXNzbGljaCAgc29sbCAgVHliYWx0ICBlcnN0CitiZWVyZGlndCBzZWluLiBBbHNvIERvbm5lcnN0YWcuIFVuZCB3YXMgZGllIEZlaWVyIGFuZ2VodCwgc28gd2VyZGVuIGRpZSAgTGV1dGUKK3JlZGVuLCB3ZW5uIHdpciBtZWhyIGFscyBlaW4gaGFsYmVzIER1dHplbmQgR2Flc3RlIGVpbmxhZGVuLiIKKworIldpciBrb2VubmVuIGphIGRpZSBncm9zc2UgRmVpZXIgc3BhZXRlciBhdXNyaWNodGVuLiIgRnJhdSBDYXB1bGV0IHdvbGx0ZSBzaWNoCitkaWUgR2VsZWdlbmhlaXQsIFN0aWNoZSBpbiBpaHJlciAgQmVrYW5udHNjaGFmdCAgYXVzenV0ZWlsZW4sICBuaWNodCAgZW50Z2VoZW4KK2xhc3Nlbi4KKworSGVyciBDYXB1bGV0IHNhaCBuYWNoIGRyYXVzc2VuLiAiU3BhZXRlciwgamEuIFVuZCBqZXR6dCBpc3QgZXMgc28gc3BhZXQsICBkYXNzCitpY2ggZmFzdCBzY2hvbiB3aWVkZXIgYXVmc3RlaGVuIG11c3MuICBBbHNvOiAgRG9ubmVyc3RhZyAgc2VoZW4gIHdpciAgdW5zICB6dXIKK0hvY2h6ZWl0IHVuZCBKdWxpYSB1ZWJlcmxhc3MgZ2V0cm9zdCBtaXIsIFBhcmlzLiIKKworVWxvIHNjaG5pZWZ0ZS4gIkFscyBvYiBKdWxpYSBlaW5lIEt1aCB3YWVyZSwgZGllIGVyIHp1bSBEZWNrZW4gd2VnZ2lidC4iCisKKyJJc3Qgc2llIGRvY2guIiwgbWVpbnRlIEF6enVyby4gIkluICBzZWluZW4gIEF1Z2VuLCAgbWVpbmUgIGljaC4iLCAgZnVlZ3RlICBlcgorc2NobmVsbCBoaW56dSwgYWxzIGVyIFVsb3MgQmxpY2sgYXVmZmluZy4KKworIlVuZCBzZWluZSBGcmF1IG1hY2h0IG1pdC4iCisKK0F6enVybyBuaWNrdGUgbnVyIGJldHJ1ZWJ0LgorCmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL3JvbV9qdWwvc2VpdGUxOSBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvcm9tX2p1bC9zZWl0ZTE5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NTY4MTgKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL3JvbV9qdWwvc2VpdGUxOQpAQCAtMCwwICsxLDI1MiBAQAorREVSIERSSVRURSBBS1QKKwlESUUgRlVFTkZURSBTWkVORQorCitKdWxpYSBrdXNjaGVsdGUgc2ljaCBpbiBSb21lb3MgQXJtZSB1bmQgIGxpZXNzCWRlbiAgQmxpY2sgIGR1cmNoICBpaHIJWmltbWVyCitzY2h3ZWlmZW4uIEJldm9yIFJvbWVvIHp1IGlociBrYW0sIGhhdHRlIHNpZSBlaWxpZyBpaHJlIFB1cHBlbgl2ZXJzdGVja3QgIHVuZAorc29nYXIgaWhyZSBIZWlsaWdlbmJpbGRlciB2b24gZGVyIFdhbmQgZ2Vub21tZW4uIEpldHp0IHNhaCBpaHIgWmltbWVyIGVoZXIgd2llCitkYXMgZWluZXIgRnJhdSBhdXMuIFNpZSBmdWVobHRlIHNpY2ggc28gd29obCwgZGFzcyBzaWUgYW0gbGllYnN0ZW4gIGdlc2NobnVycnQKK2hhZXR0ZS4KKworSnVsaWEga2l0emVsdGUgUm9tZW9zIE5hc2UgbWl0IGVpbmVyIFN0cmFlaG5lIGlocmVzICBIYWFyZXMgIHVuZCAgYmVvYmFjaHRldGUsCit3aWUgc2llIHp1Y2t0ZS4gU2NobGFlZnJpZyB3aXNjaHRlIFJvbWVvIHNpY2ggbWl0IGRlciBIYW5kIGRhcnVlYmVyLgorCitWb3IgZGVtIEZlbnN0ZXIgem9nIFVsbyBnZXJhZGUgZGVuIEtvcGYgYXVzIGRlbSBHZWZpZWRlciB1bmQgc3RpZXNzIEF6enVybyBhbi4KKyJTaWUgd2FjaGVuIGF1Zi4iCisKK0F6enVybyBtdXJtZWx0ZSB1bmQgdmVyc3VjaHRlLCBzaWNoIGRpZSBBdWdlbiBtaXQgZGVtIEZsdWVnZWwgenV6dWhhbHRlbi4KKworUm9tZW8gc2NobHVnIGRpZSBBdWdlbiBhdWYgIHVuZCAgbGluc3RlICBhdXMgIGRlbSAgRmVuc3Rlci4gICJJY2ggIGhvZXJlICBlaW5lCitMZXJjaGUuIgorCitKdWxpYSBzY2h1ZXR0ZWx0ZSBkZW4gS29wZi4gIkRhcyAgd2FyICBiZXN0aW1tdCAgZWluZSAgTmFjaHRpZ2FsbC4gIEd1Y2ssICBkaWUKK0tyYWVoZW4gZGEgZHJhdXNzZW4gc2NobGFmZW4gYXVjaCBub2NoLCBvYndvaGwgc2llIHNvbnN0IGltbWVyIG1pdCBkaWUJZXJzdGVuCitzaW5kLCBkaWUgYXVmd2FjaGVuLiIKKworWndlaWZlbG5kIGJsaWNrdGUgUm9tZW8gYXVmIHVuZCBiZWdlZ25ldGUgVWxvcyBCbGljay4gICJEaWUgIEtyYWVoZSAgZGEgIHNpZWh0CithYmVyIHppZW1saWNoIHdhY2ggYXVzLiBBbHNvIHdhciBlcyBkb2NoIGRpZSBMZXJjaGUuIgorCitVbG8gcGxpbmtlcnRlIG1pdCBkZW4gQXVnZW4sICB1bSAgYXVjaAlkaWUgIGxldHp0ZW4gIFJlc3RlICBkZXMgIFNjaGxhZmVzICB6dQordmVydHJlaWJlbi4KKworIlNpZSBoYXQgbnVyIGdldHJhZXVtdC4gSmV0enQgc2luZCAgaWhyZSAgQXVnZW4gIHdpZWRlciAgenUgIHVuZCAgZXMgIHdhciAgZGllCitOYWNodGlnYWxsLiIKKworQXp6dXJvIHN0cmVja3RlIHNpY2ggdW5kIGtsYXBwZXJ0ZSBtaXQgZGVtIFNjaG5hYmVsLiAiRGEuIiAgUm9tZW8gIHplaWd0ZSAgbWl0CitkZW0gRmluZ2VyLiAiSmV0enQgaXN0IGRpZSBhbmRlcmUgYXVjaCBub2NoIHdhY2guIiBBbHMgZXIgc2FoLCBkYXNzIEp1bGlhICBtaXQKK2RlbSBLaW5uIHppdHRlcnRlLCBzdHJlaWNoZWx0ZSBlciBpaHJlIFdhbmdlLiAiU2Nob24gZ3V0LCBzY2hvbiBndXQuICBXZW5uICBkdQorZXMgZ2VybmUgbW9lY2h0ZXN0LCBpc3QgZXMgbm9jaCBOYWNodCB1bmQgZGllIGJlaWRlbiBkYSBzaW5kIEZsZWRlcm1hZXVzZS4iCisKKyJXYXNzcyBpc3NzdD8iLCBmcmFndGUgV2xhZC4KKworIk5pY2h0cy4iLCB2ZXJzZXR6dGUgQXp6dXJvIG11ZXJyaXNjaC4gIkdlaCBzY2hsYWZlbi4iCisKK1dsYWQgenVja3RlIGRpZSBTY2h1bHRlcm4gdW5kIHZlcnNjaHdhbmQgdW50ZXIgZGVyIERhY2hyaW5uZS4KKworSnVsaWEsIGRpZSBXbGFkIGJlb2JhY2h0ZXQgaGF0dGUsIHN0b2VobnRlLiAiTGVpZGVyIGdlaHQgZGllIEZsZWRlcm1hdXMgZ2VyYWRlCitzY2hsYWZlbi4gV2FocnNjaGVpbmxpY2ggaXN0IGVzIGRvY2ggIE1vcmdlbiAgdW5kICBkdSAgc29sbHRlc3QgIGdlaGVuLCAgc29uc3QKK2Vyd2lzY2hlbiBkaWNoIG5vY2ggRXNjYWx1c2VucyBMZXV0ZSB1bmQgZHUgd2lyc3QgYXVmZ2VoYWVuZ3QuIgorCisiRXMga2FubiBhYmVyIGRvY2ggbmljaHQgTW9yZ2VuIHNlaW4uIER1IGhhc3QgIGdlcmFkZSAgZ2VzYWd0LCAgZGFzcyAgZXMgIG5vY2gKK05hY2h0IGlzdC4iLCBub2VyZ2VsdGUgUm9tZW8uCisKKyJVbmQgamV0enQgc2FnZSBpY2gsIGRhc3MgZXMgTW9yZ2VuIGlzdC4iCisKK1JvbWVvIG11cm1lbHRlIGV0d2FzIGRhcnVlYmVyLCBkYXNzIEZyYXVlbiBuaWNodCB3aXNzZW4sIHdhcyBzaWUgd29sbGVuLCBzdGFuZAorYWJlciBnZWhvcnNhbSBhdWYgdW5kIHpvZyBzaWNoIGFuLgorCisiSWNoIG1vZWNodGUgZGljaCBuaWNodCBnZWhlbiBsYXNzZW4uIgorCisiSWNoIHdpbGwgamEgYXVjaCBuaWNodCBnZWhlbi4gQWJlci4uLiIgRXIgYnJhY2ggYWIuCisKKyJFYmVuOiBBYmVyLiIgSnVsaWEgZ3JhYmJlbHRlIGF1ZiBkZW0gTmFjaHR0aXNjaCBuYWNoIGVpbmVtIFRhc2NoZW50dWNoLgorCisiV2VubiBzaWUgamV0enQgc2FndCwgZGFzcyBpaHJlIEhlcnplbiBpbW1lciBiZWllaW5hbmRlciBzaW5kLCBoYWNrZSAgaWNoICBpaHIKK2RpZSBBdWdlbiBhdXMuIiwgYnJ1bW10ZSBBenp1cm8uCisKK0p1bGlhIGxhZWNoZWx0ZSB1bnRlciBUcmFlbmVuLiAiV2Vpc3N0IGR1LCB1bnNlcmUgS29lcnBlciBtb2VnZW4gendhciBnZXRyZW5udAorc2VpbiwgYWJlci4uLiIKKworVWxvIHNwcmFuZyBhdWYgQXp6dXJvcyBSdWVja2VuIHVuZCBoaWVsdCBpaG4gZmVzdC4KKworIkViZW46IEFiZXIuIiwgdmVyc2V0enRlIFJvbWVvLgorCitQb2xseSBzdGVja3RlIGRlbiBLb3BmIHp1ciBUdWVyIGhlcmVpbi4gIkVzIHdpcmQgZ2xlaWNoICBoZWxsLiAgQXVzc2VyZGVtICBpc3QKK2RlaW5lIE11dHRlciBoaWVyaGVyIHVudGVyd2VncywgSnVsaWEuIgorCitSb21lbywgZGVyIHNjaG9uIGF1ZiBkZXIgIFN0cmlja2xlaXRlcglzdGFuZCwJcmVja3RlCXNpY2ggIEp1bGlhICBlbnRnZWdlbi4KKyJLb21tLCBnaWIgbWlyIG5vY2ggZWluZW4gS3Vzcy4iCisKK0p1bGlhIGdyYWJzY2h0ZSBlaW4gaGlsZmxvc2VzIEhvbHpwZmVyZGNoZW4sIGRhcyBzaWNoICBuaWNodCAgcmVjaHR6ZWl0aWcgIG1pdAorZGVuIGFuZGVyZW4gU3BpZWxzYWNoZW4gaW0gU2NocmFuayB2ZXJzdGVja3QgaGF0dGUgdW5kCWt1ZXNzdGUgIGVzICBoZXJ6aGFmdC4KKyJIaWVyLCBkYXMgUGZlcmQgYmVrb21tdCBnYW56IHZpZWxlICBLdWVzc2UgIG1pdCwgIGRhbm4gIGhhc3QgIGR1ICB3ZWxjaGUgIGF1ZgorVm9ycmF0LiIgU2llIHJlaWNodGUgUm9tZW8gZGFzIFBmZXJkY2hlbi4KKworUm9tZW8gbGFlY2hlbHRlLiAiSWNoIGtvbW1lIHp1cnVlY2ssIGJldm9yIHNpZSBhbGxlIGF1ZmdlYnJhdWNodCBzaW5kLiIKKworIldvaGwgaG9lcmUgaWNoIGRlciBCb3RzY2hhZnQgV29ydCwgYWxsZWluLCBtaXIgIGZlaGx0ICBkZXIgIEdsYXViZS4iLCAgbWVpbnRlCitKdWxpYS4KKworIkljaCBoYXNzZSBkaWVzZSBmYWxzY2hlIFppdGllcmVyZWkuIiwga251cnJ0ZSBBenp1cm8uCisKKyJOb2NoIGlzdCBQb2xlbiBuaWNodCB2ZXJsb3Jlbi4iIFJvbWVvIHp3aW5rZXJ0ZSBKdWxpYSBhdWZtdW50ZXJuZCB6dS4KKworIlRyb3R6ZGVtLCBldHdhcyBpc3QgZmF1bC4uLiIKKworIktSQUghIiwgc2NocmllIEF6enVybyBtaXQgTmFjaGRydWNrLgorCisiU2llaHN0IGR1LCBqZXR6dCBpc3QgTW9yZ2VuLiIgUm9tZW8gd2lua3RlLiAiSWNoIHNjaHJlaWJlIGRpci4iCisKK0p1bGlhIHdpbmt0ZSwgYmlzIFJvbWVvIHVlYmVyIGRpZSBHYXJ0ZW5tYXVlciB2ZXJzY2h3dW5kZW4gd2FyLCBkYW5uIGtsZXR0ZXJ0ZQorc2llIHZvbiBkZXIgRmVuc3RlcmJhbmsgdW5kIHdhbmR0ZSBzaWNoIGlocmVyIE11dHRlciB6dS4KKworRnJhdSBDYXB1bGV0LCBkaWUgb2ZmZW5iYXIgZ2Vob2ZmdCBoYXR0ZSwgSnVsaWEgbm9jaCBzY2hsYWZ0cnVua2VuICB1bmQgIHdlbmlnCit3aWRlcnNwZW5zdGlnIGFuenV0cmVmZmVuLCB2ZXJ6b2cgZGFzIEdlc2ljaHQsIGFscyBzaWUgaWhyZSBUb2NodGVyICBzYWguICAiRHUKK2Jpc3QgcmVpY2hsaWNoIGZydWVoIGF1Zi4iCisKKyJJY2gga29ubnRlIG5pY2h0IHNjaGxhZmVuLiIKKworIkhhZXR0ZSBzaWUgYXVjaCBnYXIgbmljaHQgZ2V3b2xsdC4iIEF6enVybyBraWNoZXJ0ZSBpbiBzaWNoIGhpbmVpbi4KKworIkR1IHRyYXVlcnN0IHVtIFR5YmFsdCwgaG0/IiBGcmF1IENhcHVsZXQgc3RyaWNoIEp1bGlhICB1ZWJlciAgZGFzICBIYWFyLiAgIkR1Citzb2xsdGVzdCBkaWNoIG5pY2h0IHNvIHNlaHIgZ3JhZW1lbi4iCisKKyJJY2ggaGFiZSAgZWluZW4gIE1lbnNjaGVuICB2ZXJsb3JlbiwgIGRlciAgbWlyICBzZWhyICB2aWVsICBiZWRldXRldC4iICBKdWxpYQorc2NobmllZnRlLgorCisiVW5kIG9iIHNpZSBkYXMgaGF0LiIgVWxvIHdhbmQgc2ljaCB2b3IgdW50ZXJkcnVlY2t0ZW0gTGFjaGVuLgorCisiRHUgc29sbHRlc3QgbmljaHQgbWVociB1bSBUeWJhbHQgd2VpbmVuLCBkYXMgbWFjaHQgaWhuIG5pY2h0IHdpZWRlciBsZWJlbmRpZy4KK0VoZXIgd2VpbnRlIGljaCwgd2VpbCBkaWVzZXIgUm9tZW8gbm9jaCBsZWJ0LiIKKworIkVzIHdhZXJlIGd1dCwgd2VubiBpY2ggUm9tZW8gZ2xlaWNoIGpldHp0IGluIG1laW5lbiAgSGFlbmRlbiAgaGFldHRlLiIgIEp1bGlhCit2ZXJiYXJnIGlociBMYWNoZW4gaGludGVyIGVpbmVtIHVtc3RhZW5kbGljaGVuIE5hc2VwdXR6ZW4uCisKKyJEYXMgbGFlc3N0IHNpY2ggbGVpZGVyIG5pY2h0IG1hY2hlbi4gQWxsZXJkaW5ncyB3ZXJkZSBpY2ggZGFmdWVyIHNvcmdlbiwgZGFzcworZXIgYXVjaCBpbSBFeGlsIG5pY2h0IGxhbmdlIHVlYmVybGVidCwgZ2xhdWIgbWlyLiIKKworSnVsaWEgbmlja3RlIGVybnN0aGFmdC4gIldlbm4gaWNoIG51ciB3dWVzc3RlLCB3aWUgaWNoIGVzIGFuc3RlbGxlbiBzb2xsLCBkYW5uCitzb3JndGUgaWNoIGRhZnVlciwgZGFzcyBSb21lbyBiYWxkIGVpbmUgZXdpZ2UgUnVoZSBmaW5kZXQuIgorCisiV2VubiBKdWxpYSBkYXMgaW4gZGllIEhhbmQgbmltbXQsIGthbm4gIFJvbWVvICBhbGxlcmRpbmdzICBydWhpZyAgc2NobGFmZW4uIiwKK21laW50ZSBBenp1cm8uCisKKyJJaHJlIE11dHRlciBtZXJrdCBhYmVyIGF1Y2ggZ2FyIG5pY2h0cywgaG0/IiAgVWxvICBsZWhudGUgIHNpY2ggIHp1cnVlY2sgIHVuZAorZ2Vub3NzIEp1bGlhcyBzcGl0emUgWnVuZ2UuCisKK0ZyYXUgQ2FwdWxldCBsYWVjaGVsdGUuICJEYXMgaXN0IGRlciByZWNodGUgR2Vpc3QsIEp1bGlhLiBXZW5uICBkdSAgc28gIHdlaXRlcgorbWFjaHN0LCB3aXJzdCBkdSBkaWUgQ2FwdWxldHMgd3VlcmRpZyB2ZXJ0cmV0ZW4uIgorCisiWkVSdHJldGVuIHdpbGwgaWNoIHNpZS4iIEp1bGlhIHN0YW1wZnRlIG1pdCAgZGVtICBGdXNzICBhdWYuICAiTWVpbmUgIEZlaW5kZSwKK25hdHVlcmxpY2guIgorCisiTmF0dWVybGljaC4iLCBzdGltbXRlIGlocmUgTXV0dGVyIHp1LiAiSWNoIGhhYmUgdWVicmlnZW5zIGVpbmUgZ3V0ZSBOYWNocmljaHQKK2Z1ZXIgZGljaC4iCisKKyJHaWJ0IGVzIGd1dGUgTmFjaHJpY2h0ZW4sIHdlbm4gZWluIGdlbGllYnRlciBNZW5zY2ggdW5lcnJlaWNoYmFyIGlzdD8iCisKKyJKZXR6dCB0cmFlZ3Qgc2llIHp1IGRpY2sgYXVmLiIgQXp6dXJvIHNjaHVldHRlbHRlIGRlbiBLb3BmLgorCisiRGVpbiBWYXRlciBtZWludCwgZGFzcyBkYXMgTGViZW4gd2VpdGVyZ2VoZW4gbXVzcy4gRXIgaGF0ICBiZXNjaGxvc3NlbiwgIGRhc3MKK2R1IFBhcmlzIGhlaXJhdGVzdC4gR2xlaWNoIGFtIERvbm5lcnN0YWcuIgorCitKdWxpYSB3dXJkZSBrcmVpZGVibGVpY2guICJEYXMgaXN0IGphICBzY2hvbiAgdWViZXJtb3JnZW4hICBEYXMgIGdlaHQgIG1pciAgenUKK3NjaG5lbGwuIgorCisiVW5zaW5uLiIgRnJhdSBDYXB1bGV0IHJ1bnplbHRlIHVud2lsbGlnIGRpZSBTdGlybi4gIkFiZXIgd2FydGUgbnVyLCBiaXMgIGRlaW4KK1ZhdGVyIGRhcyBob2VydC4iCisKK0hlcnIgQ2FwdWxldCBrYW0gaW5zIFppbW1lciB1bmQgc2NodWV0dGVsdGUgZGVuIEtvcGYuICJIZXVsc3QgIGR1ICBkZW5uICBpbW1lcgorbm9jaCwgSnVsaWE/IEhhdCBkZWluZSBNdXR0ZXIgZGlyIG5pY2h0IGdlc2FndCwgZGFzcyBkdSBhbGxlbiBHcnVuZCB6dXIgRnJldWRlCitoYXN0PyIKKworSnVsaWEgc2NobHVjaHp0ZSBub2NoIGxhdXRlci4KKworIlNpZSB3aWxsIFBhcmlzIG5pY2h0IGhlaXJhdGVuLiIsIGtsYWVydGUgRnJhdSBDYXB1bGV0ICBpaHJlbiAgTWFubiAgYXVmLiAgIkVzCitnZWh0IGlociB6dSBzY2huZWxsLCBzYWd0IHNpZS4iCisKK0luIEhlcnJuIENhcHVsZXQgZXJ3YWNodGUgZGVyIEphZWh6b3JuLCBkZW4gaW4gc2VpbmVyIEp1Z2VuZCBidWNoc3RhZWJsaWNoIGRpZQoraGFsYmUgU3RhZHQgZ2VmdWVyY2h0ZXQgaGF0dGUuCSJXYXM/ICBQYXJpcyAgaXN0ICBlaW4gIGd1dGVyICBNYW5uICB1bmQgIGVpbmUKK2hlcnZvcnJhZ2VuZGUgUGFydGllLiBVbmQgZHUgd2lsbHN0IG5pY2h0PyIgU2VpbiBHZXNjaHJlaSBlcmtsb21tIG5ldWUgSG9laGVuLgorIkR1IHdpcnN0IGRlbiBNYW5uIGhlaXJhdGVuLCBkZW4gaWNoIGRpciBuZW5uZSwgaGFzdCBkdSBtaWNoICB2ZXJzdGFuZGVuPyAgVW5kCit3ZW5uIGljaCBkaWNoIGFuIGRlbiBIYWFyZW4genVyIEtpcmNoZSB6ZXJyZSwgZHUgaGVpcmF0ZXN0IFBhcmlzISIKKworIkFiZXIsIGFiZXIuIiBGcmF1IENhcHVsZXQgIGJlb2JhY2h0ZXRlICBiZXNvcmd0ICBkaWUgIHBvY2hlbmRlICBBZGVyICBhbiAgZGVyCitTY2hsYWVmZSBpaHJlcyBNYW5uZXMgdW5kIHNhaCBzaWNoIGRlbSBXaXR3ZW5zdGFuZCBuYWVoZXIgYWxzICBpaHIgIGxpZWIgIHdhci4KKyJSZWcnIGRpY2ggbmljaHQgc28gYXVmLiIKKworSnVsaWEgZXJrYW5udGUsIGRhc3MgaWhyIFZhdGVyIGplbnNlaXRzIGFsbGVyIFZlcm51bmZ0IHdhci4gICJMYXNzICBtaWNoICBkb2NoCitlcmtsYWVyZW4uLi4iCisKKyJJY2ggc29sbCBtaWNoIG5pY2h0IGF1ZnJlZ2VuPyBOaWNodCBhdWZyZWdlbj8iICBFciAgcmFuZyAgbmFjaCAgTHVmdC4gICJNZWluZQorVG9jaHRlciB3aWxsLCBkYXNzIGljaCBtZWluIFdvcnQgbmljaHQgaGFsdGUsIHppZWh0IG1laW5lbiBndXRlbiBOYW1lbiBpbiAgZGVuCitTY2htdXR6IHVuZCBicmluZ3QgbWljaCB2b3IgZGVyIGdhbnplbiBTdGFkdCBpbiBWZXJydWYgLSAgdW5kICBpY2ggIHNvbGwgIG1pY2gKK25pY2h0IEFVRlJFR0VOPyIKKworUG9sbHksIGRpZSB3dXNzdGUsIGRhc3MgZXIgZ2xlaWNoIGFuZmFuZ2VuIHd1ZXJkZSAgenUgIGZsdWNoZW4sICBzdGVsbHRlICBzaWNoCitzY2h1ZXR6ZW5kIHZvciBKdWxpYS4gIkxhc3N0IHNpZSBkb2NoIHJlZGVuLiIKKworIlJlZGVuPyBJaHIgcmVkZXQgbWlyIGFsbGUgZHJlaSBzY2hvbiB6dXZpZWwuIERhIGlzdCBlaW4gZ3V0YXVzc2VoZW5kZXIgIE1hbm4sCitlcmZvbGdyZWljaCwgIG5ldHQsICBkZXIgIEp1bGlhICBhbGxlcwliaWV0ZW4Ja2FubiAgdW5kICBlaW5lbiAgYW5zdGFlbmRpZ2VuCitCcmF1dHByZWlzIHphaGx0Li4uIFVuZCBtZWluZXIgVG9jaHRlciBmYWVsbHQgbmljaHRzICBiZXNzZXJlcwllaW4sICBhbHMgIG1pcgordm9yenVoZXVsZW4sIGRhc3Mgc2llIGlobiBuaWNodCB3aWxsLiBXYXMgbWVpbnN0ICBkdSAgZWlnZW50bGljaCwgIGRhc3MgIGRpZXNlCitNYWVubmVyIGF1ZiBkZW4gQmFldW1lbiB3YWNoc2VuPyIKKworVWxvIGJsaWNrdGUgYXVmIEF6enVybyB1bmQgc2NodWV0dGVsdGUgZGVuIEtvcGYuICJEYSBoYXQgZXIgbGVpZGVyIFJlY2h0LiIKKworSGVyciBDYXB1bGV0IHNjaHVldHRlbHRlIGRlbiBLb3BmIHdpZSBlaW4gU3RpZXIsIGRlciBkZW0gcm90ZW4gVHVjaCAgaGludGVyaGVyCitzY2hhdXQuICJJY2ggd2lsbCBkaXIgbWFsIHdhcyBzYWdlbiwgSnVsaWE6IEVudHdlZGVyIGhlaXJhdGVzdCBkdSAgUGFyaXMgIG9kZXIKK2R1IGthbm5zdCBzZWhlbiB3byBkdSBibGVpYnN0LiIgRXIgZHJlaHRlIHNpY2ggdW0gdW5kIHN0YXBmdGUgenVyICBUdWVyLiAgIkljaAorZGFjaHRlIGVpZ2VudGxpY2gsIGRhc3MgaWNoIHZvbiBHbHVlY2sgcmVkZW4gIGthbm4sICB3ZW5pZ3N0ZW5zICBlaW4gIEtpbmQgIHp1CitoYWJlbiwgd2VubiBzY2hvbiBrZWluZW4gU29obiwgYWJlciB3ZW5uIGljaCBtaXIgZGljaCBzbyBhbnNlaGUsIEp1bGlhLCAgZnJhZ2UKK2ljaCBtaWNoLCBvYiBpY2ggZGljaCBuaWNodCBiZXNzZXIgZ2xlaWNoIG5hY2ggZGVyIEdlYnVydCBlcnNhZXVmdCBoYWV0dGUuIgorCitKdWxpYSB6dWNrdGUgenVzYW1tZW4sIGFscyBkaWUgVHVlciBoaW50ZXIgaWhyZW0gVmF0ZXIgaW5zIFNjaGxvc3Mgc2NoZXBwZXJ0ZS4KKyJNYW1hPyIKKworRnJhdSBDYXB1bGV0IHNldWZ6dGUgdW5kIHN0aWVzcyBkYW5uIGluIGRhcyBIb3JuIGlocmVzIE1hbm5lcywgd2llIHNpZSBlcyBpaHJlCitnYW56ZSBFaGUgbGFuZyBnZXRhbiBoYXR0ZS4gIk5laW4sIG5pY2h0IE1hbWEuIFNhZywgZGFzcyBkdSAgUGFyaXMgIGhlaXJhdGVzdCwKK2Rhbm4ga2FubnN0IGR1IGF1Y2ggd2llZGVyIE1hbWEgc2FnZW4uIgorCisiV2VubiBlcyBkYXMgaXN0LCB3YXMgZHUgd2lsbHN0LCBkYW5uIGthbm5zdCBkdSBtaWNoIGF1Y2ggZ2xlaWNoIG5lYmVuICBUeWJhbHQKK2JlZ3JhYmVuISIKKworRGllIFR1ZXIgZmxvZyBlaW4gendlaXRlcyBNYWwgbWl0IGxhdXRlbSAgS25hbGwgIHp1LiAgSnVsaWEgIHRyYXQgIHZlcnp3ZWlmZWx0CitkYWdlZ2VuLiAiV2FzIHNvbGwgaWNoIGpldHp0IGJsb3NzIHR1bj8gUG9sbHksIGhhc3QgZHUga2VpbmUgIElkZWU/ICBJY2ggIGthbm4KK2RvY2ggbmljaHQgUGFyaXMgaGVpcmF0ZW4hIgorCisiVW5kIHdhcnVtIG5pY2h0PyIgUG9sbHkgZmFuZCBlcyBsZWljaHRlciwgc2ljaCB2b20gU3R1cm0gdm9yd2FlcnRzIGJsYXNlbiAgenUKK2xhc3NlbiwgYWxzIHNpY2ggZ2VnZW4gaWhuIHp1IHN0ZW1tZW4uICJFciBpc3QgYmVzdGltbXQga2VpbiBzY2hsZWNodGVyICBNYW5uLgorRGVpbiBWYXRlciBoYXQgc2Nob24gUmVjaHQ6IEVyIHNpZWh0IGJlc3NlciBhdXMgYWxzIFJvbWVvLCBoYXQgZWluZW4gIGJlc3NlcmVuCitSdWYsIGlzdCBuaWNodCBtaXQgZGVpbmVyIEZhbWlsaWUgdmVyZmVpbmRldCB1bmQgYXVzc2VyZGVtIGlzdAllciAgaGllci4gIFdhcword2lsbHN0IGR1IG1laHI/IgorCitKdWxpYSBzdGFycnRlIGlocmUgYWx0ZSBWZXJ0cmF1dGUgdW5nbGFldWJpZyBhbi4gIkF1Y2ggZHUsIG1laW5lIEFtbWUgUG9sbHk/IgorCitBenp1cm8gc3RvZWhudGUuCisKK1BvbGx5IGhvYiBoaWxmbG9zIGRpZSBIYWVuZGUuICJXaXIgd29sbGVuIGFsbGUgbnVyIGRlaW4gYmVzdGVzLiIKKworIkRhcyBiZWtvbW10IGlociBhYmVyIG5pY2h0LiIsIG11cm1lbHRlIEp1bGlhLgorCisiV2FzIHNhZ3N0IGR1PyIKKworIkljaCBzYWd0ZSwgZGFzcyBpY2ggenUgQnJ1ZGVyIExhd3JlbmNlIGdlaGVuIHdpbGwuIFdlbm4gIGljaCAgaGVpcmF0ZW4gIHNvbGwsCitkYW5uIG11c3MgZXIgbWljaCBhdWYgZWluZSB3YWhyaGFmdCBjaHJpc3RsaWNoZSBFaGUgdm9yYmVyZWl0ZW4uIiBKdWxpYSBzZXR6dGUKK2VpbiBmYWxzY2hlcyBMYWVjaGVsbiBhdWYuCisKK1BvbGx5IHRyYXV0ZSBkZW0gcGxvZXR6bGljaGVuIEZyaWVkZW4gbmljaHQgZ2FueiwgenVja3RlIGFiZXIgIGRpZSAgU2NodWx0ZXJuLgorIkRhcyBpc3QgZ3V0LiBJY2ggd2VyZGUgZGVpbmVyIE11dHRlciBzYWdlbiwgZGFzcyBkdSBkaWNoIGJlc3Nlcm4gd2lsbHN0LiIgU2llCitnaW5nIHVuZCBzYWggbmljaHQsIHdpZSBzaWNoIEp1bGlhIHdlaW5lbmQgYXVmIGlociBCZXR0IHdhcmYuCisKKworSGllciBzdGVoZW4gc2llIG51biwgdW5zZXJlIEFrdGV1cmUuICBKdWxpYSAgd2VpbnQgIHNpY2ggIGRpZSAgQXVnZW4gIGF1cyAgZGVtCitHZXNpY2h0LCB3ZWlsIHNpZSBzaWNoIG5pY2h0IG9mZmVuICB6dQlSb21lbyAgYmVrZW5uZW4gIGRhcmYsCUp1bGlhcwlNdXR0ZXIKK3N0ZWxsdCBkZW4gaGFldXNsaWNoZW4gRnJpZWRlbgl1ZWJlciAgZGFzICBHbHVlY2sgIGlocmVzICBLaW5kZXMsICBQb2xseSAgaXN0Cit3ZXR0ZXJ3ZW5kaXNjaCwgUm9tZW8gdmVyYmFubnQsIFBhcmlzIHNpZWh0ICBkZXIgIFJldHR1bmcgIGZ1ZXIgIHNlaW5lbiAgYWxsenUKK2xlZXJlbiBHZWxkYmV1dGVsIGVudGdlZ2VuIHVuZCBCcnVkZXIgTGF3cmVuY2UgaXN0IGluIGVpbmVyIGJvZXNlbiBad2FuZ3NsYWdlLgorCitXaWUgZ2VybmUsIGxpZWJlIExlc2VyaW4sIGxpZWJlciBMZXNlciwgdmVyc2FlaGUgaWNoIGRpZSBHZXNjaGljaHRlIG1pdCAgZWluZW0KK2dsdWVja2xpY2hlbiBFbmRlLiBEb2NoIGRpZSBHb2V0dGVyIGRlciBNeXRoZW53ZWx0IGhhYmVuICBlcyAgYW5kZXJzICBiZXN0aW1tdAordW5kIHd1ZXJ6ZW4gdW5zZXJlIEdlc2NoaWNodGUgbWl0IHVuZW5kbGljaGVuIFNjaHdpZXJpZ2tlaXRlbi4gRXMgc2NoZWludCwgYWxzCitoYWV0dGVuIFJvbWVvIHVuZCBKdWxpYSBkaWUgR29ldHRlciB2ZXJhZXJnZXJ0LgorCmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL3JvbV9qdWwvc2VpdGUyIGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9yb21fanVsL3NlaXRlMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzRmZmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9yb21fanVsL3NlaXRlMgpAQCAtMCwwICsxLDg2IEBACitQUk9MT0cKK1dpciBiZWZpbmRlbiB1bnMgaW4gVmVyb25hLiBTdGVsbGVuIFNpZSBzaWNoIGRpZSBTdGFkdCB2b3IuIEtvZW5uZW4gU2llIG5pY2h0PworR3V0LCBmYW5nZW4gd2lyIGFtIEFuZmFuZyBhbiwgc28sIHdpZSBlcyBzaWNoIGdlaG9lcnQuCisKK0VpZ2VudGxpY2ggYmVmaW5kZW4gd2lyIHVucyBpbiBlaW5lbSBaZWl0YWx0ZXIsIGRlbSAgbWFuICBzcGFldGVyICBpcmdlbmRlaW5lbgorZ2VsZWhydGVuIHVuZCBlaWdlbmFydGlnIGtsaW5nZW5kZW4gTmFtZW4gZ2ViZW4gd2lyZCwgYWJlciBkYXMgdHV0IGhpZXIgbmljaHRzCit6dXIgU2FjaGUsIGRlbm4gd2llIGVzIHNpY2ggZnVlciBlaW5lIEdlc2NoaWNodGUgemllbXQsIGlzdCBkaWUgIFplaXQgIG9obmVoaW4KK2RpZSBHdXRlIEFsdGUuIERhcyBoZWlzc3QgbmljaHQsIGRhc3MgIGVzICBpbiAgaXJnZW5kZWluZXIgIFdlaXNlICBiZXNzZXIgIHVuZAorc2Nob2VuZXIgd2FlcmUsIGFscyBlcyBoZXV0ZSBpc3QsIGVzICBiZWRldXRldAlsZWRpZ2xpY2gsICBkYXNzICBzaWUgIHVuc2VyZW4KK1RyYWV1bWVuIGVudHNwcmljaHQuIFNpZSBpc3QgbXl0aGlzY2ggdW5kIHNvbWl0IGplbnNlaXRzIGFsbGVyIEtyaXRpay4KKworU3RlbGxlbiB3aXIgdW5zIGFsc28gVmVyb25hIHZvciwgIHdpZSAgZGllICBTdGFkdCAgaW4gIGRlciAgZ3V0ZW4gIGFsdGVuICBaZWl0CithdXNnZXNlaGVuIGhhYmVuIG1hZy4gRGllIFN0cmFzc2VuIHNpbmQgc2F1YmVyLCBzbyBzYXViZXIsIGRhc3MgbWFuIHZvbiAgaWhuZW4KK2Vzc2VuIGtvZW5udGUuIFdvbWl0IGljaCBuaWNodCB1bnRlcnN0ZWxsZW4gd2lsbCwgZGFzcwlTaWUgIHp1ICBkZW4gIE1lbnNjaGVuCitnZWhvZXJlbiwgZGllIGF1ZiBzb2xjaGUgR2VkYW5rZW4ga29tbWVuLiBJbSBHZWdlbnNhdHogenUgYWxsZXIgVWViZXJsaWVmZXJ1bmcKK3VuZCBhbGxlbiBoaXN0b3Jpc2NoZW4gRXJrZW5udG5pc3NlbiAgc2luZCAgZGllICBHb3NzZW4gIG5pY2h0CXNjaG11dHppZyAgdW5kCituaWVtYW5kIGdpZXNzdCBhdXMgZGVuIEZlbnN0ZXJuIGRlcyBlcnN0ZW4gU3RvY2tzIGVpbmUgdW5hdXNzcHJlY2hsaWNoZSwgIGFiZXIKK2ltIEdyb3NzZW4gdW5kIEdhbnplbiBicmF1bmUgdW5kIGdlbGJlIE1hc3NlLiAgVW5kICBiaXR0ZXNjaG9lbiwgIGRpZSAgSGFldXNlcgorYmV1Z2VuIHNpY2ggbmljaHQgd2llIHZlcmh1dHplbHRlIGFsdGUgTGV1dGUgdWViZXIgZGllIFN0cmFzc2VuIHVuZCBiZXRyYWNodGVuCitkaWUgTWVuc2NoZW4gbWl0IGRlbSBhcnJvZ2FudGVuIEdlc2ljaHRzYXVzZHJ1Y2ssIGRlbiBlaW4gQXV0b3IgZWluZXMgIGFuZGVyZW4KK0dlbnJlcyBpaG5lbiBhbmRpY2h0ZW4gd3VlcmRlLiBEYXMgZ2VuYXVlIEdlZ2VudGVpbCBpc3QgZGVyIEZhbGwuICBEaWUJTWF1ZXJuCitzaW5kIHdlaXNzLCBkaWUgRmVuc3RlciBzYXViZXIgZ2VwdXR6dCwgIGRpZSAgR2FyZGluZW4JZnJpc2NoCWdld2FzY2hlbiAgdW5kCitidW50ZSBLYWVzdGVuIG1pdCBub2NoIGJ1bnRlcmVuIEJsdW1lbiB6aWVyZW4gZGllIEZlbnN0ZXJiYWVua2UsICBkaWUgIGdlbmF1c28KK2ZyaXNjaCBnZXB1dHp0IHNpbmQgd2llIGRpZSBTdHJhc3Nlbi4gSmEsIFNpZSBoYWJlbiByaWNodGlnICBnZWhvZXJ0OiAgSW4gIGRlcgorZ3V0ZW4gYWx0ZW4gWmVpdCBwdXR6dGVuIGFuc3RhZW5kaWdlIE1lbnNjaGVuICBzb2dhciAgZGllICBGZW5zdGVyYmFlbmtlLiAgU2llCitoYWV0dGVuIHdhaHJzY2hlaW5saWNoIGF1Y2ggZGllIERhZWNoZXIgZ2VwdXR6dCwgd2VubiAgaWhyZSAgQXJtZSAgbGFuZyAgZ2VudWcKK2dld2VzZW4gd2FlcmVuIC0gZnJhZ2VuIFNpZSBkaWUgYWVsdGVyZW4gTWVuc2NoZW4gaW4gaWhyZW0gRG9yZiwgd2VubiBTaWUgIG1pcgorbmljaHQgZ2xhdWJlbi4KKworV29taXQgd2lyIGJlaW0gVGhlbWEgTGV1dGUgc2luZC4gSGFiZW4gU2llICBiZW1lcmt0LCAgd2llICBnZXNjaGlja3QgIGljaCAgZGllCitVZWJlcmxlaXR1bmcgZ2VtYWNodCBoYWJlPyBXaXIgYmVmaW5kZW4gdW5zIGluCWVpbmVyICBteXRoaXNjaGVuICBaZWl0LCAgYWxzbwora29lbm5lbiBTaWUgc2ljaCBkaWUgTWVuc2NoZW4gc2ljaGVybGljaCB2b3JzdGVsbGVuLiBLZWluZSBGcmF1LCBkaWUgc2ljaCBkb3J0CittaXQgUHJvYmxlbWVuIHdpZSBGYWx0ZW4gdW5kIE9yYW5nZW5oYXV0IGhlcnVtc2NobHVlZ2UsIGtlaW4gTWFubiwgZGVzc2VuIEJhcnQKK25pY2h0IGRpY2h0IGdlbnVnIHdhZXJlIG9kZXIgZGVzc2VuIE11c2tlbG4genUgdW5lbnR3aWNrZWx0LiBOZWluLCBtZWluZSBEYW1lbgordW5kIEhlcnJlbiwgaGllciBpc3QgVmVyb25hLiBFaWdlbnRsaWNoICBzb2xsdGUgIGljaCAgVkVST05BICBzY2hyZWliZW4uICBPZGVyCit3ZW5pZ3N0ZW5zIF9WZXJvbmFfLCB3ZW5uIElobmVuIGRpZSAgR3Jvc3NidWNoc3RhYmVuICB6dSAgcG9tcG9lcyAgc2luZC4gIEplZGUKK2VpbnplbG5lIGRlciBGcmF1ZW4gdmVyZGllbnRlIHNpY2ggaGV1dGUgIGVpbmUJZ29sZGVuZSAgTmFzZSAgYWxzICBNb2RlbCwgIHNvCitwZXJmZWt0IGlzdCBpaHJlIEZpZ3VyLCBzbyBlYmVubWFlc3NpZyBpaHIgR2VzaWNodCwgIHNvICBkZXplbnQgIGlociAgTWFrZS11cC4KK0locmUgSGF1dGZhcmJlIGlzdCBhbGxlcmRpbmdzIGhldXRlIG5pY2h0IG1laHIgZW4gVm9ndWUsIGFiZXIgZGFzIGlzdCAgbmljaHRzLAorZGVtIG5pY2h0IGVpbiBOYWNobWl0dGFnIGF1ZiBkZXIgU29ubmVuYmFuayBhYmhlbGZlbiBrb2VubnRlLiBVbmQgZGllIE1hZW5uZXIhCitIYWJlbiBTaWUgZWluZSBBdXNnYWJlIHZvbiBDYXBpdGFsIHp1ciBIYW5kPyBTY2hhdWVuIFNpZSBoaW5laW4gdW5kIHN1Y2hlbiBTaWUKK3NpY2ggZGVuIGF0dHJha3RpdnN0ZW4gTWFubiBoZXJhdXMuIEhhYmVuIFNpZT8gR3V0LiBOdW4gemllaGVuIFNpZSBpaG0JZGllc2VuCitncmF1c2lnZW4gQW56dWcgYXVzIHVuZCBzdGVja2VuIFNpZSBpaG4gaW4gZWluZSB6d2VpZmFyYmlnZSBTdHJ1bXBmaG9zZS4gIERhenUKK3ZlcnBhc3NlbiBTaWUgaWhtIG5vY2ggZWluICBiYXVzY2hpZ2VzCVJ1ZXNjaGVuaGVtZC4gIFVuZCAgc3RyZWljaGVuICBTaWUgIHVtCitHb3R0ZXMgV2lsbGVuIGRpZXNlcyBzY2hyZWNrbGljaGUgSGFuZHkhCisKK1NvIGFsc28gc2VoZW4gZGllIE1lbnNjaGVuIFZlcm9uYXMgYXVzLiBadW1pbmRlc3QgZGllLCB1bSB3ZWxjaGUgIHdpciAgdW5zICBpbgorZGllc2VyIEdlc2NoaWNodGUga3VlbW1lcm4gd29sbGVuLiBTaWUgZnJhZ2VuIG5hY2ggZGVuCWFuZGVyZW4/ICBBYmVyLCAgbGllYmUKK0xlc2VyaW4sIGxpZWJlciBMZXNlciwgd2VyIGZyYWd0IGluIGVpbmVyIEdlc2NoaWNodGUsIGRpZSBpbiAgbXl0aGlzY2hlciAgWmVpdAorc3BpZWx0LCAgbmFjaCAgZGVuICBOYW1lbmxvc2VuPyAgT2RlciAgZ2Vob2VyZW4gIFNpZSAgenUgIGRlbmVuLCAgIGRpZQkgZWluZW4KK2hpc3RvcmlzY2hlbiBGaWxtIG1pdCB2aWVsZW4gU3RhdGlzdGVuIG51ciBhbnNjaGF1ZW4sICB1bSAgZGVuCXVuYXVmbWVya3NhbWVuCitTdHVkZW50ZW4genUgZmluZGVuLCBkZXIgc2ljaCBzY2huZWxsIGVpbiBwYWFyIE1hcmsgdmVyZGllbmVuICB3b2xsdGUgIHVuZCAgaW4KK2RlciBBdWZyZWd1bmcgdmVyZ2FzcywgZGllIFVociBhdXN6dXppZWhlbj8gV2llIHByb2ZhbiwgbGllYmUgTGVzZXJpbiwJbGllYmVyCitMZXNlci4gQWJlciBndXQsIHdlbm4gU2llIGVzIGdhciBuaWNodCBhbmRlcnMgaGFiZW4gd29sbGVuLCAgZnVlZ2VuICB3aXIgIGhpZXIKK25vY2ggZWluIHBhYXIgU3RhdGlzdGVuIGVpbiB1bmQgZ2ViZW4gZGVyIFN6ZW5lIG5vY2ggZWluIHdlbmlnIExva2Fsa29sb3JpdC4KKworU2ljaGVybGljaCBlcmtlbm5lbiBTaWUgZGllIERhbWUsIGRpZSAgZG9ydCAgYXVmICBkZW0gIE1hcmt0ICBzdGVodC4gIFNpZSAgaXN0CitydW5kbGljaCwgdHJhZWd0IGVpbmUgd2Vpc3NlIFNjaHVlcnplIHVlYmVyIGRlbSB3ZWl0ZW4gUm9jayAgdW5kICBlaW5lCXdlaXNzZQorQmx1c2UsIGRpZSBodWVic2NoIG1pdCBpaHJlbSByb3RlbiBCdXN0aWVyICBrb250cmFzdGllcnQuICBTaWUJaGF0ICBhcGZlbHJvdGUKK1dhbmdlbiB1bmQgZWluIGZyZXVuZGxpY2hlcyBMYWVjaGVsbiwgYmVpIGRlbSB3ZWlzc2UgWmFlaG5lIGJsaXR6ZW4uIE5laW4sIGRpZQorRGFtZSAgaXN0ICBuaWNodCAgZGllICBHZXdpbm5lcmluICBlaW5lcyAgWmFobnBhc3RhLVdlcmJlZmlsbXMsICBzaWUgIGlzdCAgZGllCitHZW11ZXNldmVya2FldWZlcmluLiBTaWUgIGhhbmRlbHQgIHVudGVyICBhbmRlcmVtICBtaXQJQUVwZmVsbiAgdW5kICBpc3QgIGRpZQorVXJoZWJlcmluIGRlcyBTcHJ1Y2hlczogRGFtaXQgSWhyIGF1Y2ggbW9yZ2VuIG5vY2gga3JhZnR2b2xsIHp1YmVpc3NlbiBrb2VubnQsCitFdWVyIEV4emVsbGVuei4gRGVyIE5hbWUgZGllc2VyIEZyYXUgaXN0IGluIGRlbiBUaWVmZW4gZGVyIEhpc3RvcmllIGVydHJ1bmtlbiwKK3NvbnN0IGZ1ZWhydGVuIGlocmUgRXJiZW4gYmlzIGhldXRlIGVpbmVuIEthbXBmIHVtIGRhcyBVcmhlYmVycmVjaHQgIGFuICBpaHJlbQorV2VyYmVzbG9nYW4uCisKK1NlbGJzdHZlcnN0YWVuZGxpY2ggd29sbGVuIHdpciBlaW4gbW9lZ2xpY2hzdCAgYXV0aGVudGlzY2hlcyAgQmlsZCAgZW50d2VyZmVuLAorZGFoZXIgZnVlZ2VuIHdpciBudW4gYXVjaCBub2NoIGRpZSBkdW5rbGUgR2VzdGFsdCBhbSBhbmRlcmVuIEVuZGUgZGVzICBQbGF0emVzCitlaW4uIFdpZSBTaWUgc2ljaCBzY2hvbiBnZWRhY2h0IGhhYmVuLCBoYW5kZWx0IGVzICBzaWNoICBiZWkgIGRpZXNlbSAgTWFubiAgdW0KK2VpbmVuIERpZWIuIEVyIGhhdCBudXIgZnVlciBkaWVzZW4gQWJzYXR6IHNlaW5lbiBVcmxhdWIgIGF1ZiAgZGVyICBGZXJpZW5pbnNlbAorZGVyIE15dGhlbiB1bnRlcmJyb2NoZW4sIGFsc28gem9sbGVuIFNpZSBpaG0gZ2VidWVocmVuZGUgQXVmbWVya3NhbWtlaXQuIFNlaGVuCitTaWUsIGVyIHdpbmt0LiBXaW5rZW4gd2lyIHp1cnVlY2sgdW5kIGxhc3NlbiBpaG4gc2VpbmVuIHdvaGx2ZXJkaWVudGVuCVVybGF1YgorZm9ydHNldHplbi4KKworTW9tZW50LCB3YXMgaGF0IGRlciBkaWNrZSwgc29ubmVudmVyYnJhbm50ZSBNYW5uIGltIEhhd2FpaWhlbWQgbWl0IGRlcglLYW1lcmEKK2RhIHp1IHN1Y2hlbj8gSGFsdGVuIFNpZSBiaXR0ZQllaW5lbiAgQXVnZW5ibGljayAgbWl0CWRlbSAgTGVzZW4gIGlubmUsICBpY2gKK3NjaGFmZmUgaWhuIGViZW4gZG9ydGhpbiB6dXJ1ZWNrLCB3byBlciBoZXJrYW0uCisKK0RhbmtlLCBTaWUga29lbm5lbiBqZXR6dCB3ZWl0ZXJsZXNlbi4KKworQmV2b3IgU2llIGRhbmFjaCBmcmFnZW4sIHdpbGwgaWNoIElobmVuICBlcmtsYWVyZW4sICB3YXMgIGVzICBtaXQgIGRlbgliZWlkZW4KK0tyYWVoZW4gYXVmIHNpY2ggaGF0LCAgZGllICBhdWYgIGRlciAgV2luZGUgIGRlcyAgaHVlYnNjaGVuICBCcnVubmVucyAgaW4gIGRlcgorUGxhdHptaXR0ZSBzaXR6ZW4uIEVzIHNpbmQgVHVydGVsa3JhZWhlbi4gSWhyZSBOYW1lbiBzaW5kIFVsbyB1bmQgIEF6enVybyAgdW5kCitTaWUgd2VyZGVuIGRpZSBiZWlkZW4gbm9jaCBiZXNzZXIga2VubmVubGVybmVuLgorCmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL3JvbV9qdWwvc2VpdGUyMCBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvcm9tX2p1bC9zZWl0ZTIwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MWQ1OTUKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL3JvbV9qdWwvc2VpdGUyMApAQCAtMCwwICsxLDIwMSBAQAorREVSIFZJRVJURSBBS1QKKwlESUUgRVJTVEUgU1pFTkUKKworQnJ1ZGVyIExhd3JlbmNlIGJldHJhY2h0ZXRlIFBhcmlzIG1pdCBVbndpbGxlbi4gIkRvbm5lcnN0YWc/IEp1bGlhPyIKKworUGFyaXMgbmlja3RlLiAiU28gd2lsbCBlcyBpaHIgVmF0ZXIuIgorCisiRGFzIGlzdCBzZWhyIGt1cnpmcmlzdGlnLiIgRXIgd2llZ3RlIHNlaW5lbiBLb3BmICBoaW4gIHVuZCAgaGVyLiAgIkljaCAgd2Vpc3MKK25pY2h0LCBpY2ggd2Vpc3MgbmljaHQuIgorCisiV2FzIHdpc3NlbiBTaWUgbmljaHQ/IiBQYXJpcyB6b2cgZGllIFN0aXJuIGluIEZhbHRlbi4KKworIk5hLCBzbyBrdXJ6IG5hY2ggZGVtIFRvZCBpaHJlcyBWZXR0ZXJzLi4uIE1pciBrb21tdCBkYXMgZWluIHdlbmlnLCAgd2llICBzb2xsCitpY2ggc2FnZW4sIHNwYW5pc2NoIHZvci4iCisKKyJKdWxpYXMgIFZhdGVyICBpc3QgIGVudHNjaGxvc3Nlbi4gIEVyICBtZWludCwgIGRhc3MgIFR5YmFsdHMgIFRvZCAgc2llICAgbWVocgorYmV1bnJ1aGlndCwgYWxzIGd1dCBmdWVyIHNpZSBpc3QuIEF1c3NlcmRlbSBicmF1Y2h0IGVyIHdvaGwgZWluZW4gIG5ldWVuICBNYW5uCitpbiBkZW4gUmVpaGVuIHNlaW5lciBGYW1pbGllLiIKKworIkFscyBoYWV0dGVuIG5pY2h0IGRpZSBNb250YWd1ZXMgYXVjaCBlaW5lbiBWZXJsdXN0LCAgc2NobGllc3NsaWNoICBpc3QgIFJvbWVvCituaWNodCBtZWhyIGluIFZlcm9uYS4iCisKKyJXYXMgZnVlciBlaW4gUHJvYmxlbSBmdWVyIHVuc2VyZW4ga2xlaW5lbiAgUHJpZXN0ZXIsICBobT8iLCAgbXVybWVsdGUgIEF6enVybworbGVpc2UuCisKKyJXZW5uIGlobSBuaWNodCBzY2huZWxsIGV0d2FzIGVpbmZhZWxsdCwgbXVzcyBlciBKdWxpYSB6d2VpbWFsIHZlcmhlaXJhdGVuLiBPYgorc2VpbiBHb3R0IGRhcyBtYWc/IiBVbG8gZmx1ZXN0ZXJ0ZSBudXIsIGRvY2ggTGF3cmVuY2UgaGF0dGUgIHNpZSAgZ2Vob2VydCAgdW5kCitkcm9odGUgaWhyIG1pdCBkZW0gRmluZ2VyLgorCisiV2FzIHNhZ3QgSnVsaWEgc2VsYnN0IGRhenU/IiwgZnJhZ3RlIGVyIFBhcmlzLgorCisiSWNoIGhhYmUgbm9jaCBuaWNodCBtaXQgaWhyIGdlc3Byb2NoZW4uIgorCisiTmljaHQsIGRhc3Mgc2ljaCBpcmdlbmRqZW1hbmQgZGFydW0ga3VlbW1lcnRlLiIsIHJhdW50ZSBVbG8gZGVtIE1vZW5jaCB6dS4KKworQnJ1ZGVyIExhd3JlbmNlIG5pY2t0ZSBiZWRhZWNodGlnLiAiRXMgZ2VmYWVsbHQgbWlyICBuaWNodCwgIGVpbiAgTWFlZGNoZW4gIHp1Cit2ZXJoZWlyYXRlbiwgZGFzcyB1ZWJlcmhhdXB0IG5pY2h0IHdpbGwuIgorCisiSWNoIGhhYmUgbmljaHQgZ2VzYWd0LCBkYXNzIHNpZSBuaWNodCB3aWxsLiIKKworIkRhcyBoYXQgbWlyIGVpbiBWb2VnbGVpbiBpbnMgT2hyIGdlZmx1ZXN0ZXJ0LiIgTGF3cmVuY2UgZGV1dGV0ZSBhdWYgVWxvLgorCitQYXJpcywgZGVyIGVpbmVtIEZyYW56aXNrYW5lciBuYWhlenUgYWxsZXMgenV0cmF1dGUsIHNhaCBVbG8gYW4gdW5kIHZlcnN1Y2h0ZSwKK2RlbiBBdXNkcnVjayBWb2VnbGVpbiBtaXQgZGVyIHJpZXNpZ2VuIEtyYWVoZSBpbiBFaW5rbGFuZyB6dSBicmluZ2VuLiAiSWNoIGJpbgorc2ljaGVyLCAgSWhyICBWb2VnbGVpbgloYXQgIGRlciAgTmFjaHJpY2h0ICBHZXdpY2h0ICB2ZXJsaWVoZW4uIiwgIG1laW50ZSAgZXIKK2RpcGxvbWF0aXNjaC4KKworQnJ1ZGVyIExhd3JlbmNlIHJpZWIgc2ljaCBtaXQgZGVyIEhhbmQgdWViZXIgZGllICBBdWdlbiAgdW5kICBzYWggIGRlbglIdWVnZWwKK2hpbnVudGVyLiAiVGFldXNjaGUgaWNoIG1pY2gsIG9kZXIga29tbXQgZGEgSnVsaWE/IgorCitQYXJpcyBsYWVjaGVsdGUgSnVsaWEgenUuICAiV2llICBndXQsICBkYXNzICBkdSAga29tbXN0LCAgTGllYmxpbmdzYnJhdXQuICBXaXIKK3NwcmFjaGVuIGdlcmFkZSB2b24gZGlyLiIKKworIkRhcyBrYW5uIGljaCBtaXIgZGVua2VuLiIsIGFudHdvcnRldGUgSnVsaWEgdW50ZXJrdWVobHQuCisKKyJMaWVibGluZ3NicmF1dD8iIEF6enVybyBrcmFlY2h6dGUgdmVyZ251ZWd0LiAiT2IgZXIgbm9jaCBtZWhyIGRhdm9uIGhhdD8iCisKKyJXYWhyc2NoZWlubGljaCBuaWNodCwgc29uc3QgbGllc3NlIGVyIEp1bGlhIGluIEZyaWVkZW4uIiBVbG8gd2FyICBiZWVpbmRydWNrdAordm9uIEp1bGlhcyBIYWx0dW5nLgorCisiSWNoIGhhYmVuIGdlcmFkZSBkZW4gVGVybWluIGZ1ZXIgZGllIEhvY2h6ZWl0IGF1c2dlbWFjaHQuIgorCisiTXVzcyBkYXMgc2Vpbj8iIEp1bGlhIHZlcmRyZWh0ZSBkaWUgQXVnZW4uCisKKyJOYXR1ZXJsaWNoIG11c3MgaWNoLiIKKworIldhcnVtIGdlaHQgZXIgZGFubiBuaWNodCBoaW50ZXIgZGllIEJ1ZXNjaGU/IiwgbXVybWVsdGUgVWxvLgorCisiV2VubiBlcyBkZW5uIGdhciBuaWNodCBhbmRlcnMgZ2VodC4iCisKK1BhcmlzLCBkZXIgYW5uYWhtLCBKdWxpYSB3b2xsdGUgc2ljaCB2b3IgIGRlciAgSG9jaHplaXQgIHZvbiAgQnJ1ZGVyICBMYXdyZW5jZQorYmVyYXRlbiBsYXNzZW4sIGxhZWNoZWx0ZSBmcmV1bmRsaWNoLiAiU2FnIGVpbmZhY2ggQnJ1ZGVyICBMYXdyZW5jZSwgIGRhc3MgIGR1CittaWNoIGxpZWJzdCwgZGFubiBpc3QgYWxsZXMgaW4gT3JkbnVuZy4iCisKKyJXZW5uIGljaCBhbGxlcyBzbyBlaW5mYWNoIGluIE9yZG51bmcgYnJpbmdlbiBrb2VubnRlLCBpbmRlbSAgaWNoICBzYWdlLCAgZGFzcworaWNoIGlobiBsaWViZS4iIEp1bGlhIHNldWZ6dGUuCisKKyJOYSwgamV0enQgd2lyZCBpaHJlIFp1bmdlIHdpZWRlciAgc3ByaXR6aWdlci4iICBVbG8gIGZyZXV0ZSAgc2ljaCAgYXVmICBlaW5lbgorRGlzcHV0IG1pdCBQYXJpcy4KKworUGFyaXMgdmVyem9nIHNlaW4gR2VzaWNodCB6dSBlaW5lbSBkdWVtbWxpY2hlbiBMYWVjaGVsbi4gIkljaCBiaW4gc2ljaGVyLCBkYXNzCitkdSBtaWNoIGxpZWJzdC4iCisKKyJFaXRsZXIgUGZhdSEiLCBzY2huYXVidGUgVWxvIHZlcmFlY2h0bGljaC4KKworIldlbm4gZHUgZXMgc2Fnc3QsIFBhcmlzLiIsIG1laW50ZSBKdWxpYS4KKworIlNpZSB1ZWJ0IHNjaG9uIGZ1ZXIgZGllIFplaXQgbmFjaCBkZXIgSG9jaHplaXQuIiBVbG8gIGthbm50ZSAgZGVuICBUcmljaywgIHNvCitsYW5nZSBKYSB6dSBzYWdlbiwgYmlzIGRlciBhbmRlcmUgc2ljaCBlaW5lIFNhY2hlICBhbmRlcnMgIHVlYmVybGVndGUgIG51ciAgenUKK2d1dC4KKworIkpldHp0IHR1dCBtaXIgUGFyaXMgZmFzdCBsZWlkLiIgQXVjaCBBenp1cm8gaGF0dGUgbWl0IGRpZXNlciBNZXRob2RlICBiZXJlaXRzCitCZWthbm50c2NoYWZ0IGdlc2NobG9zc2VuLgorCitQYXJpcyBrdWVzc3RlIEp1bGlhIHp1ZWNodGlnIGF1ZiBkaWUgV2FuZ2UuICAiQW0gIERvbm5lcnN0YWcgIGJla29tbXQgIGR1ICBkZW4KK2dyb3NzZW4gQnJ1ZGVyIHZvbiBkaWVzZW0gS3Vzcy4iIEVyIHp3aW5rZXJ0ZSBpaHIgIGFuenVlZ2xpY2ggIHp1ICB1bmQgIGRyZWh0ZQorc2ljaCB1bS4KKworSnVsaWEgd2lzY2h0ZSBzaWNoIGRpZSBXYW5nZSBtaXQgZWluZW0gYW5nZXdpZGVydGVuIEdlc2ljaHRzYXVzZHJ1Y2sgIGFiLiAgIkVzCitzaWVodCBnYW56IGRhbmFjaCBhdXMuIgorCitBbHMgUGFyaXMgZGVuICBIdWVnZWwgIGhpbnVudGVyZ2VzdGFrc3QgIHdhciwgIGRyZWh0ZSAgSnVsaWEgIHNpY2ggIHp1CUJydWRlcgorTGF3cmVuY2UgdW0uICJTY2hlaXNzZS4iCisKK1VsbywgQXp6dXJvIHVuZCBCcnVkZXIgTGF3cmVuY2Ugc2NobmFwcHRlbiBnbGVpY2h6ZWl0aWcgbmFjaCBMdWZ0LgorCisiRGFzIGlzdCBhYmVyIGVpbiBzY2hsZWNodGVzIFdvcnQsIEp1bGlhLiIsIHRhZGVsdGUgQnJ1ZGVyIExhd3JlbmNlIG1pbGQuCisKKyJNaXIgZmFlbGx0IGtlaW4gYmVzc2VyZXMgZWluLiIKKworIk5hbmFuYS4iIExhd3JlbmNlIHN0cmljaCBpaHIgc2FuZnQgdWViZXIgZGFzIEhhYXIuCisKK0p1bGlhICBzYWggIEJydWRlciAgTGF3cmVuY2UgIGVybnN0ICBhbi4gICJJY2ggIGJpbiAgbWl0ICBSb21lbyAgIHJlY2h0bWFlc3NpZwordmVyaGVpcmF0ZXQsIG9kZXI/IgorCitEZXIgTW9lbmNoIG5pY2t0ZS4gIldlbm4gaWhyLi4uIiAgRXIgIGJsaWNrdGUgIGZyYWdlbmQgIHp1ICBBenp1cm8gIGhvY2gsICBkZXIKK2Jlc3RhZXRpZ2VuZCBuaWNrdGUuICJKYSwgZGFzIHNlaWQgaWhyIHdvaGwuIgorCisiRGFubiBrYW5uIGljaCBhdWNoIGtlaW5lbiBhbmRlcmVuIE1hbm4gaGVpcmF0ZW4uIFNjaG9uIGdhciAgbmljaHQsICB3ZW5uICBpY2gKK25pY2h0IHdpbGwuIgorCisiRXMgZ2lidCBQcmFlemVuZGVuemZhZWxsZSwgd2Vpc3N0IGR1LiBXZW5uIGVpbiBNYW5uICB2ZXJiYW5udCAgaXN0LCAga2FubiAgZXIKK2Z1ZXIgdG90IGVya2xhZXJ0IHdlcmRlbi4iCisKK0p1bGlhIHJpY2h0ZXRlIHNpY2ggYXVmIGVpbmUgbGFuZ2UgVm9ybGVzdW5nIGVpbiwgZG9jaCBhbHMgIExhd3JlbmNlICBzY2h3aWVnLAoraG9iIHNpZSBkaWUgSGFlbmRlLiAiTnVyLCB3ZW5uIG1hbiBlaW5lbiBBbnRyYWcgc3RlbGx0LiAgVW5kICBpY2ggIHN0ZWxsZSAgZGVuCitiZXN0aW1tdCBuaWNodC4iIEVuZXJnaXNjaCBwdXR6dGUgc2llIHNpY2ggZGllIE5hc2UuICJJY2ggIHdlcmRlICBQYXJpcyAgbmljaHQKK2hlaXJhdGVuLiBFciBpc3QgaGFlc3NsaWNoLCBhdWZnZWJsYXNlbiB1bmQgbmljaHQgUm9tZW8uIgorCitMYXdyZW5jZSBuaWNrdGUuICJEcmVpIGd1dGUgR3J1ZW5kZSwgYWJlciB3YXMga29lbm50ZXN0IGR1IHNvbnN0IHR1bj8iCisKKyJJY2ggYnJpbmcgbWljaCB1bS4iCisKKyJEYXMgbGFzc2UgaWNoIG5pY2h0IHp1LiBHb3R0IHZlcmJpZXRldCBlcyB1bmQgd2VubiBkdSAgbWlyICBkYXZvbiAgZXJ6YWVobHN0LAoraGFsdGUgaWNoIGRpY2ggYWIuIgorCisiVmVyc3VjaHMgbnVyLiIgSnVsaWEgc2NoYXV0ZSBCcnVkZXIgTGF3cmVuY2Ugc28gZHVyY2hkcmluZ2VuZCBhbiwgZGFzcyBkaWVzZXIKK3NpY2ggYW0gbGllYnN0ZW4gaW4gc2VpbmVyIEt1dHRlIHZlcmtyb2NoZW4gaGFldHRlIHdpZQllaW5lICBTY2hpbGRrcm9ldGUgIGluCitpaHJlbSBQYW56ZXIuCisKKyJMYXNzIG1pY2ggbmFjaGRlbmtlbiwgdmllbGxlaWNodCBoYWJlIGljaCBlaW5lIElkZWUuIgorCisiRGVuayBsaWViZXIgc2NobmVsbCwgZGVubiBpY2ggaGFsdGUgZXMgbmljaHQgbWVociBhdXMuIgorCisiV2VubiBkdSBkZW4gTXV0IGhhc3QsIGRpY2ggdW16dWJyaW5nZW4sIHdhcyBuYXR1ZXJsaWNoICBnZWdlbiAgR290dGVzICBHZXNldHoKK3dhZXJlLCBkYW5uIGhhc3QgZHUgZG9jaCBiZXN0aW1tdCBkZW4gTXV0LCBkaWNoIHNjaGVpbmJhciB1bXp1YnJpbmdlbiB1bmQgIG51cgorc2NoZWluYmFyIGdlZ2VuIEdvdHRlcyBHZXNldHogenUgaGFuZGVsbj8iCisKKyJLb21wbGl6aWVydGVyIGthbm4gZXIgZXMgd29obCBuaWNodCBhdXNkcnVlY2tlbi4iLCBtYXVsdGUgVWxvLgorCisiTGVnYWwsIGlsbGVnYWwuLi4iIEp1bGlhIHpvZWdlcnRlLgorCisiU2NoZWlzc2VnYWwuIiwgaGFsZiBBenp1cm8gYXVzIHVuZCAgZXJudGV0ZSAgZWluZW4gIHZlcm5pY2h0ZW5kZW4gIEJsaWNrICB2b24KK0JydWRlciBMYXdyZW5jZS4KKworSnVsaWEgbmlja3RlLiAiUmljaHRpZy4gSWNoIG5laG1lIGVzIG1pdCBhbGxlbSBhdWYsIEJydWRlciBMYXdyZW5jZS4gIFdlbm4gIGVzCitzZWluIG11c3MsIGRhbm4gc2V0emUgaWNoIG1pY2ggaW4gZWluZW4gQW1laXNlbmhhdWZlbiwgc3BpZWxlIEthcnRlbiBtaXQgZWluZXIKK0hleGUsIHRhbnplIGF1ZiBkZW0gRnJpZWRob2Ygb2RlciAtIGphLCBzb2dhciBkYXMgLSAgaWNoICBzYWdlCW1laW5lbQlWYXRlciwKK2Rhc3MgZXIgZWluICBoZXJ6bG9zZXIJVHlyYW5uCWlzdC4gIFdlbm4gIGR1CXdlaXNzdCwgIHdpZSAgaWNoICBhdXMJZGllc2VtCitTY2hsYW1hc3NlbCBoZXJhdXNrb21tZSwgZGFubiByZWRlLiIKKworQnJ1ZGVyCUxhd3JlbmNlICB2ZXJzY2h3YW5kICBpbiAgZGVyICBLYXBlbGxlCXVuZCAga3JhbXRlICBpbiAgZWluZXIJS2lzdGUuCitTY2hsaWVzc2xpY2gga2FtIGVyIG1pdCBlaW5lciBrbGVpbmVuIEZsYXNjaGUgd2llZGVyIGhlcmF1cy4gICJIaWVyLCAgZGFzICBpc3QKK2RpZSBMb2VzdW5nLiIKKworSnVsaWEgd29sbHRlIG5hY2ggZGVtIEZsYWVzY2hjaGVuIGdyZWlmZW4sIGRvY2ggTGF3cmVuY2Ugem9nICByYXNjaCAgZGllICBIYW5kCit6dXJ1ZWNrLiAiSG9lciBtaXIgZXJzdCB6dS4gRHUgZ2Voc3QgaGllcm1pdCBuYWNoIEhhdXNlIHVuZCB0dXN0IGdhbnogc28sICBhbHMKK2hhZXR0ZXN0IGR1IGVzIGRpciAgdWViZXJsZWd0LglOaWVtYW5kICBkYXJmICBWZXJkYWNodCAgc2Nob2VwZmVuLCAgYWxzbyAgc2VpCitmcm9laGxpY2ggdW5kIHR1Li4uIE5hLCB3YXMgaW1tZXIgZWluZSBCcmF1dCBzbyB0dXQuIEFtIE1pdHR3b2NoYWJlbmQgZ2Voc3QgZHUKK2lucyBCZXR0IHVuZCBzb3Jnc3QgZGFmdWVyLCBkYXNzIGR1ICBpbiAgZGVpbmVtICBaaW1tZXIgIGxhbmdlCWdlbnVnICBhbGxlaW5lCitiaXN0LiIgRXIgc2Nod2Vua3RlIGRpZSBGbGFzY2hlLiAiRGllc2VzIGtsZWluZSBTY2hhZXR6Y2hlbiBoaWVyICB3aXJrdCAgbmljaHQKK3NvIHNjaG5lbGwsIGRhc3MgbWFuIGRpZSBXaXJrdW5nIG5pY2h0CXZlcmhpbmRlcm4gIGtvZW5udGUsICBpbmRlbSAgbWFuICBkaWNoCit6dW0uLi4gaW5kZW0gbWFuIGRlaW5lbiBNYWdlbiBsZWVydC4iCisKK0p1bGlhIG5pY2t0ZSB0cmF1cmlnLiAiQWxzbyBicmluZ2UgaWNoIG1pY2ggZG9jaCB1bS4iCisKKyJOZWluLCBuZWluLiBEYWJlaSAgaHVlbGZlICBpY2ggIGRpciAgbmljaHQuIiAgTGF3cmVuY2UgIGxhZWNoZWx0ZS4gICJHYW56ICBpbQorR2VnZW50ZWlsLiBXZW5uIGR1IGVzIHRyaW5rc3QsIHdpcmtzdCBkdSBudXIgZnVlciB6d2VpdW5kdmllcnppZyAgU3R1bmRlbiAgd2llCit0b3QuIEVzIGxhZXNzdCBkZWluZW4gUHVscyBzbyBsYW5nc2FtIHdlcmRlbiwgZGFzcyBuaWVtYW5kICBpaG4gIG1laHIgIGZ1ZWhsZW4KK2thbm4sIGRlaW5lIE11c2tlbG4gd2VyZGVuIHN0ZWlmLCBkZWluIEF0ZW0gc2V0enQgIGF1cwl1bmQgIGRlaW5lICBIYXV0ICB3aXJkCitrYWx0LiBKZWRlciB3aXJkIGRlbmtlbiwgZHUgc2Vpc3QgdG90LiBOdXIsIGRhc3MgZHUgZXMgbmljaHQgYmlzdC4iCisKK0p1bGlhIG5pY2t0ZS4gIldhcyBudWV0enQgZGFzPyBJcmdlbmR3YW5uIHdlcmRlIGljaCB3YWNoICB1bmQgIGFsbGVzICBpc3QgIHdpZQordm9yaGVyLiIKKworQnJ1ZGVyIExhd3JlbmNlICBicmVpdGV0ZSAgZGllCUFybWUgIGF1cywgIGFscyAgaGllbHRlICBlciAgZWluICBncm9zc2FydGlnZXMKK0dlc2NoZW5rLiAiTmljaHQgZ2Fuei4gTWFuIHdpcmQgZGljaCBiZWdyYWJlbi4gV2VubiAgZGllICBXaXJrdW5nICBuYWNobGFlc3N0LAord2lyZCBSb21lbyBkaWNoICBhdXMgIGRlciAgR3J1ZnQgIGhvbGVuICB1bmQgIGlociAgYmVpZGUgIGtvZW5udCAgbmFjaAlNYW50dWEKK3ZlcnNjaHdpbmRlbiwgb2huZSBkYXNzIGplIGVpbiBNZW5zY2ggZGF2b24gZXJmYWVocnQuIgorCisiUm9tZW8/IFdpZSBzb2xsIGVyLi4uIgorCitMYXdyZW5jZSB1bnRlcmJyYWNoIHNpZS4gIkdhbnogZWluZmFjaDogSWNoIHdlcmRlIGlobSBzY2hyZWliZW4uIgorCitKdWxpYSBmaWVsIGRlbSBNb2VuY2ggdW0gZGVuIEhhbHMuICJJY2gga29lbm50ZSBkaWNoIGt1ZXNzZW4hIgorCisiTGllYmVyIG5pY2h0LCBzb25zdCBlcnd1ZXJnZW4gaWhuIHNlaW5lIEdlbHVlYmRlLiIsIG1laW50ZSBVbG8gc2NoYWRlbmZyb2guCisKKyJTaWVoIGlobiBkaXIgYW4uIiBBenp1cm8gZGV1dGV0ZSBtaXQgZGVtIFNjaG5hYmVsIGF1ZiBCcnVkZXIgIExhd3JlbmNlLiAgIkRhcwordHVuIHNpZSBzbyBvZGVyIHNvLiIKKwpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9yb21fanVsL3NlaXRlMjEgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL3JvbV9qdWwvc2VpdGUyMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjEyYmY1Ci0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9yb21fanVsL3NlaXRlMjEKQEAgLTAsMCArMSw1NyBAQAorREVSIFZJRVJURSBBS1QKKwlESUUgWldFSVRFIFNaRU5FCisKK0NhcHVsZXQgZ2luZyBtaXQgc2VpbmVyIEZyYXUgZGllIEdhZXN0ZWxpc3RlIGR1cmNoLiAiV2FzIG1laW5zdCBkdSwgc29sbGVuIHdpcgorQ291c2luZSBBZGVsZ3VuZCBlaW5sYWRlbj8iCisKKyJCaXN0IGR1IHdhaG5zaW5uaWc/IFdpciBoYWJlbiBUYW50ZSBGcmllZGEgZWluZ2VsYWRlbiEiIEZyYXUgIENhcHVsZXQgIGxpZWJ0ZQorendhciBkaWUga2xlaW5lbiBTdGljaGVsZWllbiBkZXIgR2VzZWxsc2NoYWZ0LCBlaW5lIEJvbWJlIGltIEhhdXNoYWx0IHdhciAgaWhyCithbGxlcmRpbmdzIHp1d2lkZXIuCisKKyJKYSwgIHdhaG5zaW5uaWcgIGJpbiAgaWNoICB3YWhyc2NoZWlubGljaC4iICBIZXJyICBDYXB1bGV0ICBzZXVmenRlLiAgIlNvdmllbAorQXVmaGViZW5zIHVuZCBKdWxpYSBoYXQgbm9jaCBuaWNodCBlaW5tYWwgZWluIG5ldHRlcyBXb3J0IGZ1ZXIgbWljaC4iCisKK0ZyYXUgQ2FwdWxldCB1ZWJlcndhbmQgc2ljaCB1bmQgbGVndGUgaWhyZW0gTWFubiBkaWUgSGFuZCAgYXVmCWRpZSAgU2NodWx0ZXIuCisiRWluZXMgVGFnZXMgd2lyZCBzaWUgZXMgdmVyc3RlaGVuLiIKKworIldhcyB2ZXJzdGVoZW4/IiwgZnJhZ3RlIEp1bGlhIHZvbiBkZXIgVHVlciBhdXMuCisKKyJXaWV2aWVsIE11ZWhlIHdpciB1bnMgZ2ViZW4sIHVtIGRpY2ggZ3V0IHVuZCBhbnN0YWVuZGlnIHVudGVyICBkaWUgIEhhdWJlICB6dQorYnJpbmdlbi4iIEFid2VzZW5kIHp1cGZ0ZSBGcmF1IENhcHVsZXQgSnVsaWFzIEtsZWlkIGdlcmFkZS4KKworIkRvY2gsIGljaCB2ZXJzdGVoZSBzY2hvbi4iIEp1bGlhIHNjaGVua3RlIGlocmVuIEVsdGVybiBlaW4gZWJlbnNvIHN0cmFobGVuZGVzCit3aWUgZmFsc2NoZXMgTGFlY2hlbG4uICJJY2ggdmVyc3RlaGUgc29nYXIgc28gZ3V0LCAgZGFzcyAgaWNoICBQYXJpcyAgaGVpcmF0ZW4KK3dlcmRlLCBvaG5lIGVpbmVuIEF1ZnN0YW5kIHp1IHByb2JpZXJlbi4iCisKK0hlcnIgQ2FwdWxldCBibGlja3RlIHVlYmVycmFzY2h0IHZvbiBkZXIgR2Flc3RlbGlzdGUgYXVmLiAiQmlzdCBkdSAgZG9jaCAgbm9jaAorenVyIFZlcm51bmZ0IGdla29tbWVuPyBJbiBkZW0gRmFsbCBmZWllcm4gIHdpcglkaWUgIEhvY2h6ZWl0ICBnbGVpY2ggIG1vcmdlbiwKK2RhbWl0IGR1IGVzIGRpciBuaWNodCBub2NoIGVpbm1hbCBhbmRlcnMgdWViZXJsZWdzdC4iCisKK0p1bGlhIG5pY2t0ZSBlcmdlYmVuLiAiR2FueiB3aWUgbWVpbiBWYXRlciB3dWVuc2NodC4iCisKK0hlcnIgQ2FwdWxldCB0YWV0c2NoZWx0ZSBpaHIgZGVuIEtvcGYuICJEYXMgaXN0IFBhcGFzICBrbGVpbmVzICBNYWVkY2hlbi4iICBFcgorYmVnYW5uIHp1IHN0YW1tZWxuLiBPZmZlbnNpY2h0bGljaCB3dXNzdGUgZXIgbmljaHQgbWVociwgd2FzIGVyIHNhZ2VuICB3b2xsdGUuCisiSmFqYSwgZGVyIGd1dGUgQnJ1ZGVyICBMYXdyZW5jZS4gIEJpcyAgamV0enQgIGhhdCAgZXIgIG5vY2ggIGplZGVtICBkZW4gIEtvcGYKK3p1cmVjaHRnZXJ1ZWNrdC4gSWNoIGJpbiBpaG0gZGFua2Jhci4iIEVyIHpvZWdlcnRlIHVuZCBmbHVlY2h0ZXRlIHNpY2ggZGFubiBpbgorUGhyYXNlbi4gIkFjaCB3YXMsIGdhbnogVmVyb25hIGlzdCBpaG0genUgRGFuayB2ZXJwZmxpY2h0ZXQuIgorCitKdWxpYSBuaWNrdGUuICJadW1pbmRlc3QgaWNoIHN0ZWhlIHRpZWYgaW4gc2VpbmVyIFNjaHVsZC4iIFNpZSBkYWNodGUgIGFuICBkaWUKK2tsZWluZSBGbGFzY2hlIGluIGlocmVyIEhhbmR0YXNjaGUgdW5kIGxhZWNoZWx0ZS4gIk1hbWEsIGthbm4gaWNoICBtb3JnZW4gIGVpbgorYmlzc2NoZW4gU2NobXVjayB2b24gZGlyIGhhYmVuPyIKKworRnJhdSAgQ2FwdWxldCAgbGFlY2hlbHRlLiAgIlN1Y2ggIGRpciAgbnVyICBhdXMsICB3YXMgIGR1ICBoYWJlbiAgIG1vZWNodGVzdC4iCitOYWNoZGVua2xpY2ggYmxpY2t0ZSBzaWUgSnVsaWEgbmFjaCB1bmQgd2FuZHRlIHNpY2ggZGFubiBhbiBpaHJlbiAgTWFubi4gICJJY2gKK2RlbmtlIG5pY2h0LCBkYXNzIHdpciBkZW4gVGVybWluIGF1ZiBtb3JnZW4gdmVyc2NoaWViZW4gIHNvbGx0ZW4uICBVZWJlcm1vcmdlbgord2FlcmUgaW1tZXIgbm9jaCBlaW4gZ3V0ZXIgVGFnIHVuZCBmdWVyIG1vcmdlbiBoYWJlbiB3aXIgYmVzdGltbXQgbmljaHQgIGdlbnVnCitWb3JyYWV0ZSBpbSBIYXVzLiIKKworIkFjaCwgZGFydW0ga3VlbW1lcmUgaWNoIG1pY2ggc2Nob24uIiBIZXJyIENhcHVsZXQgd2FyIGZlc3QgZW50c2NobG9zc2VuLCAgZGllCittaWxkZSBTdGltbXVuZyBzZWluZXIgVG9jaHRlciBhdXN6dW51dHplbiAgdW5kCWVpbmVuICBTa2FuZGFsCXp1ICB2ZXJtZWlkZW4uCisiU29yZyBkdSBkYWZ1ZXIsIGRhc3MgSnVsaWEgbW9yZ2VuIGhlcmF1c2dlcHV0enQgaXN0LCAgaWNoICBwdXR6ZSAgZGFmdWVyICBkYXMKK0hhdXMgdW5kIGVybGVkaWdlIGRlbiBSZXN0LiIKKworIlNlaXQgd2FubiBiaXN0IGR1IHVudGVyICBkaWUgIEhhdXNtYWVubmVyICBnZWdhbmdlbj8iLCAgZnJhZ3RlICBGcmF1ICBDYXB1bGV0Cit6d2VpZmVsbmQuCisKK0lociBNYW5uIGJydW1tdGUgbnVyIHVuZCBiZXVndGUgc2ljaCB3aWVkZXIgdWViZXIgZGllIEdhZXN0ZWxpc3RlLgorCmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL3JvbV9qdWwvc2VpdGUyMiBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvcm9tX2p1bC9zZWl0ZTIyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MjE5ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL3JvbV9qdWwvc2VpdGUyMgpAQCAtMCwwICsxLDE4MCBAQAorREVSIFZJRVJURSBBS1QKKwlESUUgRFJJVFRFIFNaRU5FCisKK1BvbGx5IGxlZ3RlIGRhcyBLbGVpZCwgZGFzIEp1bGlhcyBNdXR0ZXIgYmVpIGlocmVyIGVpZ2VuZW4gIEhvY2h6ZWl0ICBnZXRyYWdlbgoraGF0dGUsIHVlYmVyIGVpbmVuIFN0dWhsLiAiSHVlYnNjaCBpc3QgZGFzLiBCZXN0aW1tdCBmcmV1c3QgZHUgZGljaCwgIGRhc3MgIGR1CitlcyBtb3JnZW4gYW56aWVoZW4ga2FubnN0LiIKKworSnVsaWEgaGF0dGUgZGllIEFucHJvYmUgd2llIGVpbmUgS2xlaWRlcnB1cHBlIHVlYmVyIHNpY2ggIGVyZ2VoZW4gIGxhc3NlbiAgdW5kCityZWFnaWVydGUgYXVjaCBqZXR6dCBuaWNodCBhdWYgUG9sbHlzIFdvcnRlLiBPYndvaGwgIGVzICBpaHIgIHNjaHdlciAgZ2VmYWxsZW4KK3dhciwgaGF0dGUgc2llIG5pY2h0IGVpbm1hbCBFaW5zcHJ1Y2ggIGVyaG9iZW4sICBhbHMgIGRpZSAgU2NobmVpZGVyaW4JZGFyYXVmCitiZXN0YW5kLCBkYXNzIEp1bGlhIHp1dmllbCBPYmVyd2VpdGUgaGF0dGUgdW5kIGRhcyBLbGVpZCAgdW5iZWRpbmd0ICBnZWFlbmRlcnQKK3dlcmRlbiBtdXNzdGUuIEdsdWVja2xpY2hlcndlaXNlIHdhciBGcmF1IENhcHVsZXQgIGVpbmUgIHByYWt0aXNjaGUgIEZyYXUgIHVuZAoraGF0dGUgYmVpIGRlciBBbmZlcnRpZ3VuZyBkZXMgS2xlaWRlcyBkYXJhbiBnZWRhY2h0LCBhdXNyZWljaGVuZCBTdG9mZgl1ZWJyaWcKK3p1IGxhc3Nlbi4gTnVyIEp1bGlhIGhhdHRlIFVsb3MgdmVyYWVjaHRsaWNoZW4JS29tbWVudGFyICBnZWhvZXJ0LCAgZGFzcyAgZGVyCitTdG9mZiB3b2hsIHdlbmlnZXIgYXVzIEdydWVuZGVuIGRlciBTcGFyc2Fta2VpdCBkb3J0IHZlcmJsaWViZW4gIHdhciwgIHNvbmRlcm4KK3dlaWwgRnJhdSBDYXB1bGV0IGJlaSBkZXIgZGFtYWxpZ2VuIEFucHJvYmUgZ2Vtb2dlbHQgaGF0dGUuCisKK1VsbyBzY2h1ZXR0ZWx0ZSBhdWYgaWhyZW0gQXN0IHZvciBkZW0gRmVuc3RlciBkZW4gS29wZi4gIkRhcyAgYXJtZSAgRGluZy4gIFdpZQora2FubiBtYW4gaWhyIG51ciB6dW11dGVuLCB6dSBpaHJlciBIb2NoemVpdCBhYmdlbGVndGUgS2xlaWRlciB6dSB0cmFnZW4uIgorCisiRHUgaGFzdCBkaXIgbm9jaCBuaWNodCBlaW5tYWwgZWluIEJhbmQgdW0gZGVuICBIYWxzICBnZWJ1bmRlbiwgIGFscyAgd2lyICB1bnMKK3p1c2FtbWVuIGdldGFuIGhhYmVuLiIsIG11cnJ0ZSBBenp1cm8uCisKKyJXYXJ1bSBoYWV0dGUgaWNoIGF1Y2ggc29sbGVuPyIsIHNjaG5hcHB0ZSBVbG8uICJEdSBoYXR0ZXN0IGVzIGphICBhdWNoICBuaWNodAorbm9ldGlnLCAgbWlyICBlaW5lbiAgIEhlaXJhdHNhbnRyYWcgICB6dSAgIG1hY2hlbiwgICBnZXNjaHdlaWdlICAgZGVubgkgZWluZW4KK1ZlcmxvYnVuZ3NyaW5nIHp1IGJlc29yZ2VuLiIKKworQXp6dXJvLCBkZXIgc2ljaCBzZWhyIGdlbmF1IGRhcmFuIGVyaW5uZXJ0ZSwgZWluZW4gZ2xpdHplcm5kZW4gUmluZyBhdXMgIGVpbmVtCit1bmJlYXVmc2ljaHRpZ3RlbiBTY2htdWNra2Flc3RjaGVuIGdlc3RvaGxlbiB6dSBoYWJlbiwgZHJlaHRlIHNpY2ggIHNjaG1vbGxlbmQKK3VtLiAiSWNoIGhhYmUgZGlyIGltbWVyaGluIGVpbiBzY2hvZW5lcyBOZXN0IGdlYmF1dC4iCisKK1VsbyBpZ25vcmllcnRlIGlobiB1bmQgYmVvYmFjaHRldGUgRnJhdSBDYXB1bGV0LCBkaWUgSnVsaWFzIFppbW1lciBiZXRyYXQuCisKKyJLb21tdCAgaWhyICB6dXJlY2h0PyAgSGFidCAgaWhyICBhbGxlcyAgZ2VmdW5kZW4/IiwgICBmcmFndGUgICBGcmF1ICAgQ2FwdWxldAorYXVmZ2VrcmF0enQuCisKKyJXaXIgc2luZCBmZXJ0aWcuIiBKdWxpYSBnYWVobnRlIGhpbnRlciB2b3JnZWhhbHRlbmVyIEhhbmQuICJJY2ggYmluIG11ZWRlIHVuZAord2VubiBpY2ggbW9yZ2VuIGd1dCBhdXNzZWhlbiBzb2xsLCBtdXNzIGljaCBub2NoIGVpbiBiaXNzY2hlbiBzY2hsYWZlbi4iCisKKyJFcyBnaWJ0IGRhIG5vY2ggZXR3YXMsIHdvcnVlYmVyIHdpciAgcmVkZW4gIHNvbGx0ZW4uIiwgIGJlZ2FubiAgRnJhdSAgQ2FwdWxldAordW5zaWNoZXIuCisKKyJLZWluZSBTb3JnZSwgTWFtYSwgUG9sbHkgaGF0IG1pciAgc2Nob24gIGdlc2FndCwgIGRhc3MgIFBhcmlzICB3YWhyc2NoZWlubGljaAorc2NobmFyY2h0LiIKKworIkRhcyBpc3QgbmljaHQgZGFzIGVpbnppZ2UsIEp1bGlhLiIgRnJhdSBDYXB1bGV0IGVycm9ldGV0ZS4KKworIkhhdCBlciBTY2h3ZWlzc2Z1ZXNzZT8iCisKKyJOLW5laW4uIiAgRnJhdSAgQ2FwdWxldCAgd2FuZCAgc2ljaC4gICJEdSAgYnJhdWNoc3QgIGtlaW5lICBBbmdzdCAgIHZvciAgIGRlcgorSG9jaHplaXRzbmFjaHQgenUgaGFiZW4sIHdlaXNzdCBkdS4iIFNpZSAgYWVobmVsdGUgIGVpbmVtICBHZW5lcmFsLCAgZGVyICBlYmVuCitlaW5lbiBob2ZmbnVuZ3Nsb3NlbiBBdXNmYWxsIGJlZm9obGVuIGhhdC4KKworIk5hdHVlcmxpY2ggd2Vpc3MgaWNoLCBNYW1hLiIgSnVsaWEgZ2Vub3NzIGVzLCAgaWhyZSAgTXV0dGVyICBzbyAgdmVybGVnZW4gIHp1CitzZWhlbi4KKworIlBhcmlzIGlzdCBlaW4gZnJldW5kbGljaGVyIE1hbm4uIgorCisiVW5kIGFsdCBnZW51ZywgZGFzcyBzaWUgc2VsYnN0IEVyZmFocnVuZ2VuIG1pdCBpaG0gIGhhYmVuICBrb2VubnRlLiIsICBmdWVndGUKK0F6enVybyB1bmduYWVkaWcgaGluenUuCisKKyJJY2ggYmluIGpldHp0IG11ZWRlLCBNYW1hLiIgSnVsaWEgem9nIGRpZSAgVm9yaGFlbmdlICB2b20gIEJldHQgIHVuZCAgd2lua3RlLgorIkd1dGUgTmFjaHQuIgorCitGcmF1IENhcHVsZXQgd29sbHRlIG5vY2ggZXR3YXMJc2FnZW4sCXd1cmRlICBhbGxlcmRpbmdzICB2b24JUG9sbHkgIGFtICBBcm0KK2dlbm9tbWVuLiAiR2VoZW4gd2lyIHNjaGxhZmVuIHVuZCBsYXNzZW4gSnVsaWEgaWhyZSBSdWhlLiIsIHNjaGx1ZyBQb2xseSB2b3IuCisKK0p1bGlhIHNldWZ6dGUgbGF1dCwgYWxzIGRpZSBiZWlkZW4gIGdlZ2FuZ2VuICB3YXJlbi4gICJIb2ZmZW50bGljaCAgbmljaHQgIGJpcworbW9yZ2VuLiIKKworVWxvIHNjaG5pZWZ0ZSBsYXV0LgorCisiU28gc2NobGltbSBpc3QgZXMgbmljaHQsIEtyYWVoZS4iIEp1bGlhIHpvZyBlaW4gTGFlY2hlbG4gYXVzIGRlbiBUaWVmZW4gaWhyZXIKK0VyaW5uZXJ1bmcgdW5kIG5hZ2VsdGUgZXMgZW50c2NobG9zc2VuIGF1ZiBpaHJlbSBHZXNpY2h0IGZlc3QuICJJY2ggYmluICBmcm9oLAorZGFzcyBpaHIgaGllciBzZWlkLiBEYW5uIG11c3MgaWNoICBkYXMJWmV1ZyAgd2VuaWdzdGVucyAgbmljaHQgIGdhbnogIGFsbGVpbmUKK3RyaW5rZW4uIgorCisiQWVobSwgZXMgbWFjaHQgZGlyIGFiZXIgaG9mZmVudGxpY2ggbmljaHRzIGF1cywgd2VubiB3aXIgbmljaHQgIG1pdHRyaW5rZW4/IiwKK2ZyYWd0ZSBVbG8uCisKKyJBYmVyIGR1IGtvZW5udGVzdCBlcyBydWhpZyBtaXQgV2VpbiB2ZXJkdWVubmVuIHVuZCBtaXIgIGVpbmVuICBTY2hsdWNrICBkYXZvbgorYWJnZWJlbi4gVm9uIGRlbSBXZWluLCBuYXR1ZXJsaWNoLiIgQXp6dXJvIHJpZWIgc2ljaCBiZWlsYWV1ZmlnIG1pdCBkZXIgS3JhbGxlCit1ZWJlciBkZW4gU2NobmFiZWwuCisKK0p1bGlhIGhvZXJ0ZSBuaWNodCB6dSwgc29uZGVybiBiZXRyYWNodGV0ZSBkaWUgRmxhc2NoZS4gIldhcyAgbWVpbnQgIGlociwgIGhhdAorQnJ1ZGVyIExhd3JlbmNlIG1pY2ggcmVpbmdlbGVndD8iCisKKyJXYXJ1bSBzb2xsdGUgZXI/IiwgZnJhZ3RlIFVsby4KKworIldpZSBzdGFlbmRlIGVyIHdvaGwgZGEsIHdlbm4gaWNoIGFsbGVuIGVyemFlaGxlLCBkYXNzIGVyIG1pY2ggIGJpbm5lbiAgendlaWVyCitUYWdlIGdsZWljaCB6d2VpIE1hbCB2ZXJoZWlyYXRldCBoYXQ/IgorCisiQWNoIHdhcy4iIFVsbyBrbmlmZiBlaW4gQXVnZSB6dS4gICJXZXIgIHNvbGx0ZSAgZGlyICB3b2hsICBnbGF1YmVuLCAgZGFzcyAgZHUKK2F1c2dlcmVjaG5ldCBtaXQgUm9tZW8gTW9udGFndWUgdmVyaGVpcmF0ZXQgYmlzdD8gRGllIExldXRlIGdsYXViZW4gdmllbCwgYWJlcgorZGFzIGdpbmdlIGltIExlYmVuIG5pY2h0IGluIGlocmUgS29lcGZlLiIKKworSnVsaWEgbmlja3RlLiAiTWFnIHNlaW4uIEFsc28gc2NoZWlkZXQgZGFzIGF1czogIEJydWRlciAgTGF3cmVuY2UgIGhhdCAga2VpbmVuCitHcnVuZCBtaWNoIHp1IGhpbnRlcmdlaGVuLiBCb3NoZWl0IGlzdCBlcyBzaWNoZXJsaWNoIG5pY2h0LCAgc2NobGllc3NsaWNoICBpc3QKK2VyIGVpbiBQcmllc3RlciB1bmQgaGVpbGlnZXIgTWFubi4iCisKKyJIZWlsaWdlciBNYW5uISIsIHNjaG5hdWJ0ZSBBenp1cm8uICJIYXN0IGR1IHNjaG9uIG1hbCB3YXMgIHZvbiAgZGVuICBCb3JnaGlhcworZ2Vob2VydD8iCisKKyJTaWUgc2luZCBnbGF1YmUgaWNoIHdlaXRsYWV1ZmlnIG1pdCBtaXIgdmVyd2FuZHQuICBBbGxlcmRpbmdzICBoYWJlICBpY2ggIHNpZQorbm9jaCBuaWUgZ2V0cm9mZmVuLCBzaWUgbGViZW4gaW4gZWluZXIgYW5kZXJlbiBTdGFkdC4iIFNpZSBzYWd0ZSAgZXMgIHNvLCAgd2llCit3aXIgaGV1dGUgamVtYW5kZW4gZGFydWViZXIgIGF1ZmtsYWVyZW4sICBkYXNzCXdpciAgVmVyd2FuZHRlCWluICBBdXN0cmFsaWVuCitoYWJlbi4KKworIkplZGVuZmFsbHMuLi5BdWEhIiBBenp1cm8gdmVyc3R1bW10ZSB1bmQgYmxpY2t0ZSBVbG8gdmVybGV0enQgYW4uCisKKyJXaXNzdCBpaHIsIGRhcyBTY2hsaW1tc3RlIHdhZXJlLCB3ZW5uIGVzIG5pY2h0IHdpcmt0LiBJY2ggIG1laW5lLCAgd2FzLCAgd2VubgoraWNoIG1vcmdlbiBhdWZ3YWNoZSB1bmQgaGVpcmF0ZW4gbXVzcz8iIFNpZSBzYWggc2ljaCAgc3VjaGVuZCAgaW0gIFppbW1lciAgdW0sCitlcmJsaWNrdGUgZWluIHNjaGFyZmVzIEhhbmRhcmJlaXRzbWVzc2VyIHVuZCB3b2cgZXMgbmFjaGRlbmtsaWNoIGluIGRlciAgSGFuZC4KKyJOYSwgZWhlIGljaCBQYXJpcyBoZWlyYXRlLi4uIgorCisiRGFzIGdhZWJlIGVpbmUgemllbWxpY2hlIFNjaHdlaW5lcmVpLiIgVWxvICBzY2h1ZXR0ZWx0ZSAgZXMgIGFsbGVpbiAgYmVpICBkZW0KK0dlZGFua2VuIGRhcmFuLgorCisiQmVzc2VyIGFscyBQYXJpcyBoZWlyYXRlbi4iLCB2ZXJzZXR6dGUgSnVsaWEgc2NoYXJmLgorCisiU2Nob24gZ3V0LCBzY2hvbiBndXQuIiBVbG8gbXVzc3RlIGlociB3aWRlciBXaWxsZW4genVzdGltbWVuLgorCisiV2VubiBudXIgbWVpbiBWYXRlciBuaWNodCAgaW4gIGxldHp0ZXIgIE1pbnV0ZSAgbm9jaCAgZGVuICBUZXJtaW4gIHZvcmdlem9nZW4KK2hhZXR0ZS4iCisKKyJXYXMgc29sbCBkYXJhbiBzbyBzY2hsaW1tIHNlaW4/IiwgZnJhZ3RlIEF6enVyby4gIkR1IHRyaW5rc3QgZGFzIFpldWcgZWluZmFjaAorZWluZW4gVGFnIGZydWVoZXIuIgorCisiVW5kIHdlbm4gUm9tZW8gZGVuIEJyaWVmIG5pY2h0IHJlY2h0emVpdGlnIGJla29tbXQ/IEJydWRlciBMYXdyZW5jZSAgaGF0ICBpaG4KK2xvc2dlc2NoaWNrdCwgYWJlciBtYW4gd2Vpc3MgamEsIHdpZSBsYW5nc2FtIEtsb3N0ZXJicnVlZGVyIHZvcmFuIGtvbW1lbiwgd2Vubgorc2llIGF1ZiBSZWlzZW4gc2luZC4iCisKKyJBbGx6dSB2aWVsZSBXZWluc3R1YmVuIGdpYnQgZXMgYXVmIGRlbSBXZWcgbmFjaCBNYW50dWEgbmljaHQuIiwgYmVydWhpZ3RlIFVsbworc2llLgorCisiVHJvdHpkZW0uIE1pY2ggZ3JhdXN0IGVzIGJlaSBkZW0gR2VkYW5rZW4gYW4gZGllc2Ugc3RhdWJpZ2UgR3J1ZnQuICBMdWZ0ZGljaHQKK2lzdCBndXQsIHdlbm4gbWFuIGRlbiBHZXN0YW5rIGRyaW5uZW4gaGFsdGVuIHdpbGwsIGFiZXIgd2VubiBpY2ggZGFyaW4gYmluLi4uIgorCisiRHUgd2lyc3QgZXMgdWViZXJsZWJlbi4iIEF6enVybyB2ZXJzdWNodGUsIHNlaW5lciBTdGltbWUgIGVpbmVuICBiZXJ1aGlnZW5kZW4KK0tsYW5nIHp1IGdlYmVuLgorCisiVmllbGxlaWNodCB3YWVyZSBkYXMgZ2FyIG5pY2h0IHNvIGd1dC4gSWNoIGhhYmUgc2NocmVja2xpY2hlIEFuZ3N0IGRhdm9yLCAgZGEKK2RyaW5uZW4gYXVmenV3YWNoZW4uIEFtIEVuZGUgd2VyZGUgaWNoIHdhaG5zaW5uaWcuIiAgSWhyICBMYWVjaGVsbiAgdmVyc2Nod2FuZAordW5kIG1hY2h0ZSBlaW5lbSBiaXR0ZXJlbiBBdXNkcnVjayBQbGF0ei4gIkRhcyB3YWVyZSBzY2hsaW1tZXIgYWxzIHN0ZXJiZW4uIgorCitVbG8gdmVyc3VjaHRlLCBzaWUgenUgdHJvZXN0ZW4uICJEdSB3dWVyZGVzdCBlcyBuaWNodCBtZXJrZW4uIgorCitKdWxpYSBuaWNrdGUuICJWZXJtdXRsaWNoLiIgU2llIHpvZyBkaWUgTmFzZSBrcmF1cyB1bmQgZGFjaHRlIG5hY2guICJTYWd0IG1hbCwKK3N0aW1tdCBlcywgZGFzcyBkaWUgVG90ZW4gaW4gZGVyIEdydWZ0Li4uIiBTaWUgem9lZ2VydGUuICJJaHIgIHdpc3N0ICBzY2hvbi4uLgorRXMgaGVpc3N0LCBkYXMgZXMgZWluaWdlIFRhZ2UgZGF1ZXJ0LCBiaXMgc2ljaCBkZXIgVG90ZSAgbWl0ICBzZWluZW0gIC4uLlBsYXR6CithYmdlZnVuZGVuIGhhdC4iCisKKyJXb2hlciBzb2xsZW4gd2lyIGRhcyB3aXNzZW4/IFdpciB3YXJlbiBub2NoIG5pY2h0ICB0b3QuIiAgQXp6dXJvICB6dWNrdGUgIGRpZQorU2NodWx0ZXJuLiAiRXMgZ2lidCBkYSBzbyBldHdhcyB3aWUgR2FzZSwgZGllIG5vY2ggIHJ1bW9yZW4sICBhYmVyICB2aWVsbGVpY2h0Citpc3QgZGFzIGF1Y2ggbnVyIGVpbiBHZXJ1ZWNodC4iCisKK0p1bGlhIGRhY2h0ZSBtaXQgR3JhdXNlbiBhbiAgVHliYWx0LiAgIk9iICBpY2ggIEdlaXN0ZXIgIHNlaGVuICB3ZXJkZT8gIFR5YmFsdAordmllbGxlaWNodCwgZGVyIFJvbWVvIHN1Y2h0IHVuZCBpaG4gbmljaHQgZmluZGV0PyBXZW5uIGVyIGRhbm4gbWl0IG1pciBWb3JsaWViCituaW1tdD8iIFNpZSBzY2h1ZXR0ZWx0ZSBzaWNoLgorCisiRHUgd2lyc3Qgc2NobGFmZW4uIiBVbG8gbGllc3Mgc2ljaCBhdWYgSnVsaWFzIFNjaHVsdGVyIG5pZWRlciB1bmQgc3RyaWNoICBpaHIKK3NhbmZ0IG1pdCBkZW0gS29wZmdlZmllZGVyIHVlYmVyIGRpZSBXYW5nZS4KKworIkRhcyBraXR6ZWx0LiIgSnVsaWEga2ljaGVydGUsIGRhbm4gd3VyZGUgc2llIHdpZWRlciBlcm5zdC4gIkljaCBoYWJlIHNvICB2aWVsCitkYXJ1ZWJlciBnZWhvZXJ0LCB3YXMgbmFjaHRzIGF1ZiBGcmllZGhvZWZlbiB2b3JnZWh0LiBNYW5jaG1hbCBob2VydCAgbWFuICBkaWUKK1RvdGVuIGVudHNldHpsaWNoIHNjaHJlaWVuLCBoZWlzc3QgZXMuIgorCisiRGFzIHNpbmQgYmxvc3MgS2F0emVuLiIgQXp6dXJvIGhhdHRlIGRpZSByaWVzaWdlbiBUaWVyZSBnZXNlaGVuLCBkaWUgYXVmICBkZXIKK1N1Y2hlIG5hY2ggUmF0dGVuIHVlYmVyIGRpZSBHcmFlYmVyIGh1c2NodGVuICB1bmQgIGRpZQlMaWViZXNwYWFyZSAgc3RvZXJ0ZW4sCitmdWVyIGRpZSBkZXIgRnJpZWRob2YgZGVyIGVpbnppZ2Ugd2lya2xpY2ggdW5nZXN0b2VydGUgT3J0IHdhci4KKworIldlbm4gZHUgZXMgc2Fnc3QuIiwgbWVpbnRlIEp1bGlhICB6d2VpZmVsbmQuICAiTmFqYSwgIHdhaHJzY2hlaW5saWNoICBoYXQgIGVzCitrZWluZW4gU2lubiwgZXMgbm9jaCBsYWVuZ2VyIGhpbmF1c3p1c2NoaWViZW4uIiBTaWUgaG9iICBkaWUgIFBoaW9sZS4gICJQcm9zdCwKK2lociBiZWlkZW4uIEZhbGxzIGljaCBlcyBzZWxic3QgbmljaHQga2FubiwgZ3J1ZXNzdCBSb21lbyB2b24gbWlyLiIKKworVWxvIGh1ZXBmdGUgenVyIFNlaXRlLCBhbHMgSnVsaWEgbmllZGVyc2Fuay4gIkpldHp0ICBoYXQgIHNpZSAgenVtaW5kZXN0ICBpaHJlCitSdWhlLiIKKworIlNpZSBoYWV0dGUgZXMgd2lya2xpY2ggaW4gV2VpbiBuZWhtZW4ga29lbm5lbi4iLCBtdXJydGUgQXp6dXJvLgorCmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL3JvbV9qdWwvc2VpdGUyMyBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvcm9tX2p1bC9zZWl0ZTIzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzN2RiY2UKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL3JvbV9qdWwvc2VpdGUyMwpAQCAtMCwwICsxLDEzNCBAQAorREVSIFZJRVJURSBBS1QKKwlESUUgVklFUlRFIFNaRU5FCisKK0ZyYXUgQ2FwdWxldCBzY2hsZXVkZXJ0ZSBpaHJlIEJsaWNrZSB1ZWJlciBkYXMJU2NobGFjaHRmZWxkLCAgZGFzICBhdXMgIGlocmVtCitIYXVzIGdld29yZGVuIHdhciwgZmFuZCBQb2xseSB1bmQgYmFubnRlIHNpZSBtaXR0ZW4gaW0JU2Nocml0dC4gICJIaWVyLCAgbmltbQorZGllIFNjaGx1ZXNzZWwsIGluIGRlciBLdWVjaGUgd2VyZGVuIG5vY2ggS3JhZXV0ZXIgZ2VicmF1Y2h0LiIKKworUG9sbHkgbmFobSAgZGllICBJbnNpZ25pZW4gIGhhdXNmcmF1bGljaGVyICBNYWNodCAgYW5kYWVjaHRpZyAgZW50Z2VnZW4uICAiRGVyCitCYWVja2VyIG1vZWNodGUgYXVjaCBEYXR0ZWxuIHVuZCBRdWl0dGVuIGhhYmVuLiIKKworIkRhbm4gZ2liIHNpZSBpaG0uIiBGcmF1IENhcHVsZXQgc2FoIGlocmVuIE1hbm4gZGllIFRyZXBwZSBoZXJ1bnRlciBrb21tZW4gdW5kCitzdG9laG50ZS4gIkVyIGhhdCBtaXIgZ3JhZGUgbm9jaCBnZWZlaGx0LiIKKworSGVyciBDYXB1bGV0IG5haG0gbWl0IFNjaHd1bmcgIGRpZSAgS3VydmUgIHVtICBlaW5lbiAgRGllbmVyICBoZXJ1bSwgIGRlciAgZWluCitCaWVyZmFzcyBpbiBSaWNodHVuZyBTcGVpc2VzYWFsIHJvbGx0ZSwgZHVja3RlIHNpY2ggaW0JbGV0enRlbiAgTW9tZW50ICB1bnRlcgorZWluZW0gVGFibGV0dCBtaXQgR2xhZXNlcm4gZHVyY2ggdW5kIHdpY2ggdW0gIEhhYXJlc2JyZWl0ZSAgZWluZW0gIFRpc2NoICBhdXMsCitkZXIsIHZvbGxiZWxhZGVuIG1pdCBPYnN0LCB1bnNjaHVsZGlnIGlubWl0dGVuIGRlcyBSYXVtZXMgc3RhbmQuICJXYXMgaGF0IGRlbm4KK2RlciBUaXNjaCBoaWVyIHp1IHN1Y2hlbj8gU29uc3QgaXN0IGRlciBkb2NoICBhdWNoICBuaWNodCAgZGEuIiwgIHd1bmRlcnRlICBlcgorc2ljaC4KKworIk5hdHVlcmxpY2ggbmljaHQuIiBGcmF1IENhcHVsZXQgZmFzc3RlIHNpY2ggbWl0IHVlYmVydHJpZWJlbmVyIEdlc3RlICBhbiAgZGllCitTdGlybi4gIkFiZXIgbmFjaGRlbSB3aXIgc28gd2VuaWcgWmVpdCBoYWJlbiwgZGllIEhvY2h6ZWl0IHZvcnp1YmVyZWl0ZW4sIGthbm4KK3NjaG9uIGVpbm1hbCBlaW4gVGlzY2ggaW0gV2VnIHN0ZWhlbi4iCisKKyJTY2hvbiBndXQsIHNjaG9uIGd1dC4iIEhlcnIgQ2FwdWxldCBnZXdhaHJ0ZSBlaW5lbiBLdWVjaGVuanVuZ2VuLCBkZXIgc2ljaCBpbgorZWluZSBFY2tlIGRydWVja3RlIHVuZCB2ZXJzdWNodGUsIG1vZWdsaWNoc3QgdmllbCB2b24gZGVyIFBsYWVua2VsZWkgIHp3aXNjaGVuCitpaG0gdW5kIHNlaW5lciBGcmF1IHp1IGhvZXJlbi4gIkR1IGRhISIKKworIkljaD8iIERlciBLdWVjaGVuanVuZ2UgYmxpY2t0ZSBzaWNoIHVtLgorCisiSmEsIGR1LiBTaWVoIHp1LCBkYXNzIGR1IGF1ZiBkaWUgRnVlc3NlIGtvbW10LCB3aXIgaGFiZW4gbmljaHQgZGVuIGdhbnplbiBUYWcKK1plaXQuIiBIZXJyIENhcHVsZXQgd2VkZWx0ZSBtaXQgZGVuIEhhZW5kZW4gdW5kIG9ocmZlaWd0ZSAgZWluZW4gIERpZW5lciwgIGRlcgorc29yZ3NhbSBlaW5lbiBGdXNzIHZvciBkZW4gYW5kZXJlbiBzZXR6dGUgdW5kIG1pdCAgenVzYW1tZW5nZWtuaWZmZW5lbglMaXBwZW4KK2F1ZiBkaWUgU3VwcGVudGVycmluZSBpbiBzZWluZW4gSGFlbmRlbiBzdGFycnRlLgorCitQb2xseXMgR2VzaWNodCB2ZXJ6b2cgc2ljaCB6dSBlaW5lbSBJbmJpbGQgIGRlcyAgWm9ybnMsICBhbHMgIGRlciAgRGllbmVyICBkaWUKK1RlcnJpbmUgIGZhbGxlbiAgbGllc3MJdW5kICBlaW5lICBndXRlICBIYW5kdm9sbCAgYW5kZXJlciAgQmVkaWVuc3RldGVyICAgbWl0CiticnVlaGhlaXNzZXIgU3VwcGUgdWViZXJzY2h1ZXR0ZXRlLiBTaWUgc3RlbW10ZSBkaWUgIEFybWUgIGluICBkaWUgIFNlaXRlICB1bmQKK3dhcnRldGUgZ2VkdWxkaWcsIGJpcyBzaWNoIGRlciBBdWZydWhyIGdlbGVndCBoYXR0ZS4gICJIZXJyICBDYXB1bGV0PyIgIFBvbGx5cworU3RpbW1lIHdhciBmcmV1bmRsaWNoLgorCisiSmE/IgorCitQb2xseSBhdG1ldGUgdGllZiBkdXJjaCB1bmQgbWFuIHNhaCBpaHJlIExpcHBlbiBkaWUgWmFobGVuIHZvbiBlaW5zICBiaXMgIHplaG4KK2Zvcm1lbi4gIFNjaGxpZXNzbGljaCAga25pZmYgIHNpZSAgZGllCUF1Z2VuICB6dXNhbW1lbi4gICJTaWUgIHdvbGx0ZW4gIG5pY2h0Cit6dWZhZWxsaWcgZ2VyYWRlIGdlaGVuPyIsIHNhZXVzZWx0ZSBQb2xseS4KKworIktpZWxob2xlbiwga2llbGhvbGVuISIgVWxvIGphdWNoenRlLgorCisiTmVpbiwgZWlnZW50bGljaCBuaWNodC4iIEhlcnIgQ2FwdWxldCB3YXIgc2ljaHRsaWNoIHZlcndpcnJ0LgorCisiRWluIE1hbm4gd2llIFNpZSBoYXQgc2ljaGVybGljaCBrZWluZSByZWNodGUgRnJldWRlICBkYXJhbiwgIEZyYXVlbmFyYmVpdCAgenUKK3R1biwgb2Rlcj8iCisKKyJHaWJzIGlobSEiIEF6enVybyB2ZXJnYXNzIGdhbnogdW5kIGdhciwga3JhZWhpc2NoIHp1IHNwcmVjaGVuLgorCisiSGFiZSBpY2ggS2VrcyBnZXNhZ3QsIGRhc3MgZHUgS3J1ZW1lbCBkaWNoIG1lbGRlc3Q/IiwgZnJhZ3RlIFBvbGx5IHNjaGFyZiB1bmQKK2Vyd3Vlcmd0ZSBBenp1cm8gbWl0IGVpbmVtIEJsaWNrLgorCisiS3J1ZW1lbD8iIEF6enVybyB3YXIgZW50cnVlc3RldC4KKworIklyZ2VuZGplbWFuZCAgbXVzcyAgc2ljaCAgamEgIGRhcnVtICBrdWVtbWVybiwgIGRhc3MgIGFsbGVzICAgZ2xhdHQgICBnZWh0LiIsCit2ZXJ0ZWlkaWd0ZSBzaWNoIEhlcnIgQ2FwdWxldCwgZGVyIGRpZSBLcmFlaGVuIGdhciBuaWNodCBiZWFjaHRldGUuCisKKyJKYS1hLiIsIG1hY2h0ZSBQb2xseS4gIldpci4iCisKKyJXZW5uIGljaCBldWNoIFdlaWJlcm4gaGllciBkYXMgUmVnaW1lbnQgdWViZXJsYXNzZSwgZ2VodCAgYWxsZXMgIGRydW50ZXIgIHVuZAorZHJ1ZWJlci4iCisKK1BvbGx5IGJldHJhY2h0ZXRlIGJldG9udCBkaWUgU2NoZXJiZW4gZGVyIFRlcnJpbmUgdW5kIHNjaHdpZWcuCisKKyJTaWUgaGF0IEtydWVtZWwgZ2VzYWd0ISIsIGVtcG9lcnRlIHNpY2ggQXp6dXJvIGluIGRpZSBlaXNpZ2UgU3RpbGxlIGhpbmVpbi4KKworIlVlYmVyaGF1cHQgd2FyIGljaCB6dSBtZWluZXIgIFplaXQgIGR1cmNoYXVzICBpbiAgZGVyICBMYWdlLCAgbWljaCAgdW0gIGVpbmVuCitIYXVzaGFsdCB6dSBrdWVtbWVybi4iIEhlcnIgQ2FwdWxldCBob2IgdW5iZWhhZ2xpY2ggZGllIEFybWUuCisKKyJSaWNodGlnLCB6dSBJaHJlciBaZWl0LiBVbmQgbW9yZ2VuIGphbW1lcm4gU2llIHVlYmVyIGlociBaaXBwZXJsZWluLCB3ZWlsIFNpZQorZGllIE5hY2h0IGR1cmNoZ2VtYWNodCBoYWJlbi4iCisKKyJVbnNpbm4uIiAgSGVyciAgQ2FwdWxldCAgcnVuemVsdGUgIGRpZSAgU3Rpcm4uICAiRnVlcmNodGVzdCAgZHUsICBlcyAga29lbm50ZQorYXVmZmFsbGVuLCB3aWV2aWVsIGJlc3NlciBpY2ggZGFzIGthbm4gYWxzIGR1PyIKKworIkRhcyBKYW1tZXJuPyIgVWxvIGtpY2hlcnRlLgorCitBbGxlIEJsaWNrZSBzZW5rdGVuIHNpY2ggd2llZGVyIGF1ZiBkaWUgU2NoZXJiZW4uCisKKyJMaWVibGluZywgZGFzIHdhciBkaWUgVGVycmluZSBhdXMgZGVtICBTZXJ2aWNlLCAgZGFzICBtZWluZSAgTXV0dGVyICB1bnMgIHp1cgorSG9jaHplaXQgZ2VzY2hlbmt0IGhhdC4iLCBtaXNjaHRlIHNpY2ggRnJhdSBDYXB1bGV0IGVpbi4KKworIkhvZWNoc3RlIFplaXQsIGRhc3Mgd2lyIGVpbiAgbmV1ZXMgIGFuc2NoYWZmZW4uIiAgSGVyciAgQ2FwdWxldCAgd2FuZHRlICBzaWNoCiticnVtbWVuZCB6dSB6d2VpIERpZW5lcm4gdW0sIGRpZSBlaW4gIFNjaHdlaW4gIGF1ZiAgZWluZW0gIFNwaWVzcyAgenVyCUt1ZWNoZQordHJ1Z2VuLiAiV2FzIGlzdCBkYXM/Iiwgc2NobmF1enRlIGVyLgorCitEZXIgdm9yZGVyZSBEaWVuZXIgd2FuZHRlIHNpY2ggdW0gdW5kIGJldHJhY2h0ZXRlIGRhcyAgVGllciAgYXVmICBkZW0gIFNwaWVzcy4KKyJFaW4gU2Nod2Vpbiwgd2VubiBtaWNoIG5pY2h0IGFsbGVzIHRhZXVzY2h0LiIKKworIkVpbiBTY2h3ZWluLCBwYWghIiBQb2xseSBzY2huYXVidGUgdW5kIHNjaG9iIHNpY2ggYW4gZGVuICBEaWVuZXJuICB2b3JiZWkgIGluCitkaWUgS3VlY2hlLgorCisiV2VuIGhhdCBzaWUgZGFtaXQgd29obCBnZW1laW50PyIsIGZyYWd0ZSBVbG8gbGVpc2UuCisKKyJLcnVlbWVsLCBwYWghIiBBenp1cm8gc2NobHVnIG1pdCBkZW4gRmx1ZWdlbG4uCisKKyJOZWluLCBtaXQgZGVtIFNjaHdlaW4uIgorCisiV2VuIGludGVyZXNzaWVydCBkYXM/IFNpZSBoYXQgbWljaCBLcnVlbWVsIGdlbmFubnQhIgorCitIZXJybiBDYXB1bGV0cyBaZWlnZWZpbmdlciBtYWNodGUgZWluZW4gVm9yc3Rvc3MgYXVmIGVpbmUgTWFnZC4gICJXYXMgIGlzdCAgaW4KK2RlbSBLb3JiPyIKKworIktlaW5lIEFobnVuZywgaXN0IGZ1ZXIgZGllIEt1ZWNoZS4iCisKKyJEYW5uIGJyaW5nIGVzIGhpbi4iCisKKyJJY2ggYmluIGRhYmVpLiIsIHZlcnNldHp0ZSBkaWUgTWFnZC4KKworIkd1dCwgZ3V0LiIgSGVyciBDYXB1bGV0IGlnbm9yaWVydGUgc2VpbmUgRnJhdSwgZGllICBzaWNoICBtaXQgIHZlcnNjaHJhZW5rdGVuCitBcm1lbiBnZWdlbiBkaWUgV2FuZCBsZWhudGUuCisKKyJEYSBrb21tdCBQYXJpcy4iIFVsbyB3YW5kdGUgZGVuIEtvcGYgIHVuZCAgYmV0cmFjaHRldGUgIGRlbiAgYnVudGVuICBadWcgIHZvbgorTXVzaWthbnRlbiB1bmQgQWtyb2JhdGVuLCBkaWUgUGFyaXMgYmVnbGVpdGV0ZW4uCisKK0F1Y2ggSGVyciBDYXB1bGV0IGhhdHRlIGRpZSBNdXNpayBnZWhvZXJ0LiAiRHUgbGllYmVyIEhpbW1lbCwgZGEgaXN0IGphICBzY2hvbgorUGFyaXMhIiBFciBkcmVodGUgc2ljaCB1bSBzZWluZSBBY2hzZS4gIlBvbGx5ISIKKworUG9sbHkgc3RyZWNrdGUgZGVuIEtvcGYgZHVyY2ggZGllIEt1ZWNoZW50dWVyLiAiV2FzIGlzdCBkZW5uPyIKKworIlBhcmlzIGlzdCBsb3MgLSBuZWluLCBkYS4gTG9zLCBsb3MsIHdlY2tlIEp1bGlhLiBCcmluZyBzaWUgIGhlciEgIE5laW4sICB6aWVoCitzaWUgZXJzdCBhbiwgYnJpbmcgc2llIGRhbmFjaC4iIEhlcnIgQ2FwdWxldCBicmVpdGV0ZSBkaWUgQXJtZSBhdXMgdW5kICBkcmVodGUKK3NpY2ggdW0gc2VpbmUgQWNoc2UuCisKK1BvbGx5IGZpbmcgZGVuIEJsaWNrIEZyYXUgQ2FwdWxldHMgdW5kIHRpcHB0ZSBzaWNoIGJlZGFlY2h0aWcgbWl0IGVpbmVtIEZpbmdlcgorYW4gZGllIFN0aXJuLCBkYW5uIHZlcnNjaHdhbmQgc2llIGRpZSBUcmVwcGUgaGluYXVmLgorCmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL3JvbV9qdWwvc2VpdGUyNCBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvcm9tX2p1bC9zZWl0ZTI0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMmFkMDIKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL3JvbV9qdWwvc2VpdGUyNApAQCAtMCwwICsxLDIxNyBAQAorREVSIFZJRVJURSBBS1QKKwlESUUgRlVFTkZURSBTWkVORQorCitQb2xseSBoaWVsdCBzaWNoIG5pY2h0IGRhbWl0IGF1ZiwgYW4gSnVsaWFzIFR1ZXIgenUga2xvcGZlbiwgc29uZGVybiAgc3R1ZXJtdGUKK2dsZWljaCBpbnMgWmltbWVyLiAiSnVsaWEsIE1hdXNlc2Nod2FlbnpjaGVuLCBaZWl0IHp1bSAgQXVmc3RlaGVuLiIsICBmbG9ldGV0ZQorc2llLgorCisiV2llIGxhbmdlIHNpZSB3b2hsIGJyYXVjaHQ/IiBBenp1cm8gYmxpY2t0ZSBiZXRvbnQgIHp1ICBKdWxpYXMgIEJldHQsICBkZXNzZW4KK1ZvcmhhZW5nZSBudXIgZWluZW4gU3BhbHQgd2VpdCBvZmZlbiBzdGFuZGVuLgorCisiV2FydGVuIHdpcidzIGFiLiIgVWxvIGxlZ3RlIGJlZGFlY2h0aWcgZWluZSBGZWRlciB3aWVkZXIgYW4gIGlocmVuICByaWNodGlnZW4KK1BsYXR6LgorCisiSnVsaWEsIHRyb2VkZWwgbmljaHQsIGRlaW4gQnJhZXV0aWdhbSBpc3QgZGEuIiBQb2xseSBoaWVsdCBlaW5lbiBNb21lbnQgIGlubmUKK3VuZCBraWNoZXJ0ZS4gIkR1IHRhbmtzdCB3b2hsIGpldHp0IHNjaG9uIFNjaGxhZj8gUmVjaHQgaGFzdCAgZHUsICBQYXJpcyAgd2lyZAorc2ljaGVybGljaCBmdWVyIGRpZSBuYWVjaHN0ZSBaZWl0IGFuZGVyZSBQbGFlbmUgZnVlciBkaWUgIE5hZWNodGUgIGhhYmVuLiAgU28sCitqZXR6dCBhYmVyIHJhdXMgbWl0IGRpciwgZHUgU2NobGFmbXVldHplISBEdSB3aWxsc3QgIGRvY2ggIG5pY2h0LCAgZGFzcyAgUGFyaXMKK2RpY2ggaW0gQmV0dCBmaW5kZXQsIG9kZXI/IERhbm4ga29tbXQgaWhyIGJlaWRlIHZlcnNwYWV0ZXQgenVyIEhvY2h6ZWl0IC0gIHVuZAorenUgZnJ1ZWggenVyIEhvY2h6ZWl0c25hY2h0LiIgU2llIGtpY2hlcnRlIHdpZWRlci4KKworIkRhISIgQXp6dXJvIHdhY2tlbHRlIGF1ZmdlcmVndCBhdWYgc2VpbmVtICBBc3QgIGhpbiAgdW5kICBoZXIuICAiSmV0enQgIG1lcmt0CitzaWUncy4iCisKK1BvbGx5IHpvZyBkaWUgVm9yaGFlbmdlIHp1cnVlY2suICJXYXMgZGVubiwgaW1tZXIgIG5vY2ggIGFuZ2V6b2dlbj8gIFdhcnN0ICBkdQorZ2VzdGVybiBzbyBtdWVkZT8gU2NoYWVtZW4gc29sbHRlc3QgIGR1ICBkaWNoLAlkYXMgIHNjaG9lbmUgIEtsZWlkICBpc3QgIGdhbnoKK3ZlcmRydWVja3QuIFVuZCBpY2ggbXVzcyBlcyB3aWVkZXIgYnVlZ2Vsbi4iIFNpZSBydWV0dGVsdGUgYW4gSnVsaWFzIFNjaHVsdGVyLgorIkp1bGlhISIgUG9sbHlzIFN0aXJuIGtyYXVzdGUgc2ljaC4gIkp1bGlhPyIKKworIkFjaHR1bmcsIGpldHp0IGtvbW10J3MuIFdhcyBnYWViZSAgaWNoICBqZXR6dCAgZnVlciAgZWluICBQYWFyICBIYWVuZGUhIiAgVWxvCitzdG9laG50ZSwgYWxzIFBvbGx5IG1hcmtlcnNjaHVldHRlcm5kIHNjaHJpZS4KKworV2xhZCBzdHJlY2t0ZSBkZW4gS29wZiB1bnRlciBkZXIgUmVnZW5yaW5uZSBoZXJ2b3IuICJXZXIgc3NzY2hyZWl0IGRlbm4gbWl0dGVuCitpbiBkZXIgTmFjaHQ/IgorCisiU2NobGFmIHdlaXRlci4iIEF6enVybyB3YW5kdGUgIGRlbiAgQmxpY2sgIG5pY2h0ICB2b24gIGRlciAgU3plbmUgIGluICBKdWxpYXMKK1NjaGxhZnppbW1lci4KKworQnJ1bW1lbG5kIHpvZyBXbGFkIHNpY2ggenVydWVjay4KKworIldhcyBpc3QgZGVubiBkYXMgZnVlciBlaW4gTGFlcm0gaGllcj8iICBGcmF1ICBDYXB1bGV0cyAgbW9kaXNjaCAgd2Vpc3NlICBIYXV0Cityb2V0ZXRlIHNpY2ggdm9yIEFlcmdlci4KKworIk9oIEphbW1lciwgb2ggV2VoISIgUG9sbHkgemVycmF1ZnRlIHNpY2ggZGFzIEhhYXIuICJKdWxpYSEiCisKKyJIYXQgc2llIHdpZWRlciBGbG9laGUgaW0gS29wZj8iLCBmcmFndGUgSGVyciBDYXB1bGV0IHVuZ25hZWRpZywgIGFscyAgZXIgIGlucworWmltbWVyIGthbS4KKworIk5laW4sIGFiZXIgYmFsZCBXdWVybWVyLiBTaWUgaXN0IHRvdCEiIFBvbGx5IHpvZyBkYXMgbGV0enRlICBXb3J0ICBtaXQgIGVpbmVtCitTY2hsdWNoemVuIHNvIGxhbmcsIGRhc3MgbWFuIGVzIGthdW0gdmVyc3RlaGVuIGtvbm50ZS4KKworIlRvdC4iIEZyYXUgQ2FwdWxldCB3dXJkZSB3aWVkZXIgYmxlaWNoIHVuZCBwbHVtcHN0ZSBhdWYgZGVuIEJvZGVuLgorCitIZXJyIENhcHVsZXQgc2NobHVja3RlIHNjaHdlci4gIlRvdD8iCisKKyJWZXJzY2hpZWRlbiwgenUgaWhyZW4gQWhuZW4gZ2VnYW5nZW4sIGhhdCBkZW4gTG9lZmZlbCBhYmdlZ2ViZW4sIGRlbiAgbGV0enRlbgorVGFueiBnZXRhbnp0LCBpbiBkZW4gZXdpZ2VuIEphZ2RncnVlbmRlbi4uLiIgUG9sbHkgaG9sdGUgTHVmdC4gIlRvdC4iCisKK051biBkYWVtbWVydGUgYXVjaCBIZXJybiBDYXB1bGV0IGRpZSBCZWRldXR1bmcgaWhyZXIgV29ydGUuIEhpbGZsb3MgYmxpY2t0ZSBlcgorc2ljaCBpbSBSYXVtIHVtLCBmYW5kIHNjaGxpZXNzbGljaCBlaW5lICBXYXNjaHNjaHVlc3NlbCAgdW5kICBzY2hsZXVkZXJ0ZSAgc2llCitnZWdlbiBkaWUgV2FuZC4gIkRhcyBpc3QgbmljaHQgd2FociEiCisKK0ZyYXUgQ2FwdWxldCwgZGllIGRlbiBJbmhhbHQgZGVyIFdhc2Noc2NodWVzc2VsIGlucyAgR2VzaWNodCAgYmVrb21tZW4JaGF0dGUsCitvZWZmbmV0ZSBlaW4gQXVnZSB1bmQgZ3JpZmYgc2ljaCBhbiBkaWUgQnJ1c3QuICJNZWluZSBKdWxpYT8gSnVsaWEhIgorCisiS3Jva29kaWxzdHJhZW5lbi4iIFVsbyByZWNrdGUgdmVyYWVjaHRsaWNoIGRlbiBTY2huYWJlbCBpbiBkaWUgTHVmdC4KKworIkR1IGRlbmtzdCBhdWNoIGltbWVyIGRhcyBTY2hsaW1tc3RlLiIgQXp6dXJvIGtvbm50ZSBzaWNoIGVpbiBTY2huaWVmZW4gIG5pY2h0Cit2ZXJrbmVpZmVuLgorCisiSWNoIGtlbm5lIGRpZSBNZW5zY2hlbi4iLCB2ZXJzZXR6dGUgVWxvLgorCisiV2llIGtvbm50ZSBkYXMgIG51ciAgcGFzc2llcmVuPyIgIFBvbGx5ICB1bWZhc3N0ZSAgaWhyZSAga2xlaW5lICBGbGFzY2hlICBtaXQKK0xlYmVuc2VsaXhpciwgZGllIHNpZSBhdXMgaWhyZW4gZ3Jvc3NlbiBSb2NrdGFzY2hlbiBnZXpvZ2VuIGhhdHRlLgorCisiSGV5LCBkYXZvbiBrYW5uIHNpZSBtaXIgZXR3YXMgYWJnZWJlbi4iIEF6enVybyBiZXVndGUgc2ljaCBuYWNoIHZvcm5lLgorCisiUGFzcyBudXIgYXVmLCBkYXNzIGR1IG5pY2h0IHZvbSBBc3QgZmFlbGxzdCwgIEdpZXJzY2hsdW5kLiIgIFVsbyAgenVwZnRlICBpaG4KK21pc3NiaWxsaWdlbmQgIGFtICBTY2h3YW56LiAgICJEYSwgICBqZXR6dCAgIGtvbW10ICAgUGFyaXMuICAgRGEgICBrYW5uc3QgICBkdQorS3Jva29kaWxzdHJhZW5lbiBzZWhlbiEiCisKKyJBY2ggd2FzLiBFciBzYWd0IGRvY2gsIGRhc3MgZXIgc2llIGxpZWJ0LiIKKworIlJpY2h0aWcsIGVyIHNhZ3QgZXMuIERhcyBoZWlzc3QgYWJlciBuaWNodCwgZGFzcyBlciBlcyB3aXJrbGljaCB0dXQuIgorCisiV2VubiBlciBzaWUgbmljaHQgbGllYnQsIHdhcnVtIGhlaXJhdGV0IGVyICBzaWUgIGRhbm4/ICBTaWUgIGhhdCAgbm9jaCAgbmljaHQKK2Vpbm1hbCBFaWVyIGdlbGVndC4iCisKKyJNZW5zY2hlbiAgbGVnZW4gIGtlaW5lICBFaWVyLCAgc2llICB3ZXJkZW4gIHNjaHdhbmdlci4iLCAga2xhZXJ0ZSAgVWxvICBpaHJlbgorR2VmYWVocnRlbiBhdWYuICJQYXJpcyB3aWxsIEp1bGlhcyBTdGVsbHVuZyB1bmQgaWhyIEVyYmUuIEFuIGlociBzZWxic3QgaGF0IGVyCitrZWluIEludGVyZXNzZS4gQWJlciBqZXR6dCBtdXNzIGVyICB0cmF1ZXJuLCAgc29uc3QgIHJlZGV0ICBkaWUgIE5hY2hiYXJzY2hhZnQKK3VlYmVyIGlobi4iCisKK0JydWRlciBMYXdyZW5jZSBlcmZhc3N0ZSBiZWltIGVyc3RlbiBCbGljayBpbnMgWmltbWVyLCBkYXNzIEp1bGlhIGRpZSB2b24gIGlobQordmVyYWJyZWljaHRlIE1lZGl6aW4gZ2V0cnVua2VuIGhhdHRlLiBFciAgdmVya25pZmYgIHNpY2ggIGVpbiAgTGFlY2hlbG4uICAiV2llCitzdGVodCBlcz8gSXN0IHVuc2VyZSBodWVic2NoZSBCcmF1dCBmZXJ0aWc/IEVzIGlzdCBaZWl0IGZ1ZXIgc2llLCAgenVyCUtpcmNoZQorenUgZ2VoZW4uIgorCitIZXJyIENhcHVsZXQgcmllYiBzaWNoIHVlYmVyIGRhcyBHZXNpY2h0LiAiVGphLCBoaW5nZWhlbiB3aXJkICBzaWUgIHdvaGwsICBudXIKK2hlaW0ga29tbXQgc2llIG5pY2h0IG1laHIuIgorCitQYXJpcywgZGVyIGRhcyBTY2hsYWZ6aW1tZXIgZWluZXIgRGFtZSBuaWNodCB1bmF1ZmdlZm9yZGVydCAgYmV0cmV0ZW4gIHdvbGx0ZSwKK3dhciBhbiBkZXIgVHVlciBzdGVoZW4gZ2VibGllYmVuIHVuZCBhaG50ZSAgbm9jaCAgbmljaHQsICBkYXNzCWVyICBhdWYgIHNlaW5lCitIb2NoemVpdCB2ZXJ6aWNodGVuIG11c3N0ZS4gTnVuIGxhY2h0ZSBlci4gIkRvY2gsIGFiZXIgaW4gbWVpbiBIZWltLiIKKworSGVyciBDYXB1bGV0IHNjaHVldHRlbHRlIGRlbiBLb3BmLiAgIk5laW4sICBoZXV0ZSAgTmFjaHQgIGhhdCAgSnVsaWEgIGRlbiAgVG9kCitnZWhlaXJhdGV0LCB1bmQgZGVyIGhhdCBzaWUgZGFubiBnbGVpY2ggZGVmbG9yaWVydCwgbWVpbmUga2xlaW5lIEJsdW1lLiIKKworIlVtcGYuIiBBenp1cm8gd2FuZCBzaWNoLiAiRGVmbG9yaWVydCAtIHdpZSB1bnBhc3NlbmQuIgorCitQYXJpcyBtYWNodGUgZWluZW4gdGF1bWVsbmRlbiBTY2hyaXR0IGluIGRlbiBSYXVtIGhpbmVpbiB1bmQgIHNjaHVldHRlbHRlICBkaWUKK0ZhdXN0IGdlZ2VuIGRpZSBEZWNrZS4gIk9oLCBUb2QsIHdpZSBrb25udGVzdCBkdSBtaXIgZGFzIGFudHVuPyBXaWUgc2VociAgaGFiZQoraWNoIG1pY2ggZGFyYXVmIGdlZnJldXQsIG1laW5lIEJyYXV0IHp1IGt1ZXNzZW4sIHVuZCBqZXR6dCBuaW1tc3QgZHUgIHNpZSAgbWlyCit3ZWcuIgorCisiSUNIIEhBQkUgRE9DSCBHQVIgTklDSFRTIERBTUlUIFpVIFRVTi4iCisKK1VsbyB3YW5kdGUgc2ljaCB6dSBkZXIgZHVua2xlbiBHZXN0YWx0IHVtLCBkaWUgbmViZW4gaWhyIGF1ZiBkZW0gQXN0IHNhc3MgIHVuZAorbWl0IGRlbiBrbm9jaGlnZW4gQmVpbmVuIGJhdW1lbHRlLiAiRGFzIHdlaXNzIGVyIGFiZXIgbmljaHQuIgorCisiRHUgYmlzdCBlcnN0IHNwYWV0ZXIgZHJhbiwgd2FydW0gdHJpbmtzdCBkdSBuaWNodCBub2NoIGVpbmVuICBLYWZmZWUgIGluICBkZXIKK0dhcmRlcm9iZT8iLCBzY2hsdWcgQXp6dXJvIHZvci4KKworIldPIFNPTEwgSUNIICBERU4gIERFTk4gIEhJTlRVTj8iICBUb2QgIHZlcnNhbmsgIGluICBkaWUgIFNjaGF0dGVuICB1bnRlciAgZGVuCitCbGFldHRlcm4uCisKK0ZyYXUgQ2FwdWxldCBiZXR1cGZ0ZSBpaHJlIEF1Z2VuIG1pdCBlaW5lbSAgU3BpdHplbnR1ZWNobGVpbi4gICJXYXMgIGZ1ZXIgIGVpbgorc2NocmVja2xpY2hlciAgVGFnLiAgRGEgIGhhYmUgIGljaCAgZWluICBLaW5kLAllaW4gICBlaW56aWdlcywgICB3dW5kZXJiYXJlcywKK2ZyZXVuZGxpY2hlcywgc2Nob2VuZXMsIGZyb2VobGljaGVzIEtpbmQsIGRhcyBlaW56aWdlIEtpbmQsIGFuIGRlbSBpY2gJRnJldWRlCitoYWJlLCB1bmQga2F1bSBrYW5uIGljaCBzaWUgdmVyaGVpcmF0ZW4gc3RpcmJ0IHNpZS4iCisKK1dpZSBlaW4gdmVyc3RhZXJrdGVzIEVjaG8gdHJvbXBldGV0ZSBQb2xseSBsYXV0IGluIGlociBUYXNjaGVudHVjaC4gICJXaXJrbGljaAorZWluIHNjaHJlY2tsaWNoZXIsIHdpZGVybGljaGVyLCBzdGlua2VuZGVyLCBla2VsaGFmdGVyIFRhZy4gIERpZSAgYXJtZQlrbGVpbmUKK0p1bGlhLCBzdGF0dCBhdWYgZGVuIFJ1ZWNrZW4genUgZmFsbGVuIHVuZCBkaWUgRnVlc3NlIHp1ciBEZWNrZSAgenUgIHN0cmVja2VuLAorZmFlbGx0IHNpZSBhdWZzIEtyZXV6IHVuZCBibGVpYnQgbGllZ2VuLiIKKworUGFyaXMsIGRlciBzbyAgcmFzY2ggIGtlaW4gIFRhc2NoZW50dWNoICBoYXR0ZQlmaW5kZW4Ja29lbm5lbiwgIG5haG0JSnVsaWFzCitCcmF1dHNjaGxlaWVyIHVuZCB2ZXJncnViIHNlaW4gR2VzaWNodAlkYXJpbi4JIk5vY2ggIG5pY2h0ICB2ZXJoZWlyYXRldCAgdW5kCitzY2hvbiB2b24gbWVpbmVyIEJyYXV0IGdlc2NoaWVkZW4sIGljaCBmdWVobGUgbWljaCBiZXRyb2dlbi4iICBFciAgd2FyZiAgSGVycm4KK0NhcHVsZXQgZWluZW4gQmxpY2sgenUsIGRlbiBkaWVzZXIgc29nbGVpY2ggdmVyc3RhbmQuCisKKyJXZW0gc29sbCBpY2ggamV0enQgbWVpbiBWZXJtb2VnZW4gdmVyZXJiZW4/IFdhcnVtICBrb25udGUgIHNpZSAgbmljaHQgIHp1ZXJzdAoraGVpcmF0ZW4gdW5kIGRhbm4gc3RlcmJlbj8iIEhlcnIgQ2FwdWxldCBtYWNodGUgIHNpY2ggIG5pY2h0ICBkaWUgIE11ZWhlLCAgZWluCitUYXNjaGVudHVjaCB6dSBzdWNoZW4sIHNvbmRlcm4gc2NobmV1enRlIHNpY2ggaW4gc2VpbmVuIEFlcm1lbC4KKworIldhaHJzY2hlaW5saWNoIGhhdHRlc3QgZHUgUmVjaHQgbWl0IGRlbiBLcm9rb2RpbHN0cmFlbmVuLiIsIG1laW50ZSBBenp1cm8uCisKKyJJY2ggaGFiZSBpbW1lciBSZWNodC4iIFVsbyBzdGllc3MgaWhyZW4gR2VmYWVocnRlbiBtaXQgZGVtIEZsdWVnZWwgYW4uCisKK0JydWRlciBMYXdyZW5jZSB3YXIgenVtIEZlbnN0ZXIgZ2V0cmV0ZW4uICJXYW5uIGhhdCBzaWUncyBnZXRydW5rZW4/IiwgIHJhdW50ZQorZXIgZGVuIEtyYWVoZW4genUuCisKKyJVbmdlZmFlaHIgTWl0dGVybmFjaHQuIiwgYW50d29ydGV0ZSBVbG8uCisKK0xhd3JlbmNlIHJlY2huZXRlLiAiWmVobiBTdHVuZGVuLCBibGVpYmVuICBub2NoICB6d2VpdW5kZHJlaXNzaWcuICBHdXQuICBaZWl0LAorZGFzcyBzaWUgYmVlcmRpZ3Qgd2lyZCwgc29uc3Qgd2FjaHQgc2llIHVucyBub2NoIHdhZWhyZW5kIGRlciAgQmVlcmRpZ3VuZyAgYXVmCit1bmQgZGFzIHdhZXJlIHBlaW5saWNoLiIgRXIgd2FuZHRlIHNpY2ggdW0gdW5kIHNldHp0ZSBkaWUgTWllbmUgIGF1ZiwgIGRpZSAgZXIKK3NvbnN0IGZ1ZXIgUHJlZGlndGVuIGJlcmVpdGhpZWx0LiAiU28genUgamFtbWVybiBpc3QgIHdpcmtsaWNoICBuaWNodCAgbm9ldGlnLAorbGllYmUgQnJ1ZWRlciB1bmQgU2Nod2VzdGVybi4gSWhyIHdpc3N0IGRvY2gsIGRhc3MgSnVsaWEgamV0enQgaW0gIEhpbW1lbCAgaXN0Cit1bmQgbWl0IGRlbiBFbmdsZWluIEhhcmZlIHNwaWVsdC4iCisKK1VsbyB2ZXJkcmVodGUgZGllIEF1Z2VuLCBzY2h3aWVnIGFiZXIuCisKKyJMaWViZSBTY2h3ZXN0ZXJuIHVuZCBCcnVlZGVyLCBpaHIgc29sbHRldCBldWNoIGZyZXVlbiwgZGFzcyAgSnVsaWEgIGpldHp0ICBpbQorSGltbWVsIGlzdC4gV2llIGVpZ2Vuc3VlY2h0aWcgdm9uIGV1Y2gsIGhpZXIgenUgd2VpbmVuLiBHb2VubnQgaWhyIEp1bGlhICBkZW5uCituaWNodCwgZGFzcyBzaWUgamV0enQgaW0gUGFyYWRpZXMgaXN0PyIgRXIgbWFjaHRlIGVpbmUgUGF1c2UuIEFscyBGcmF1IENhcHVsZXQKK0x1ZnQgaG9sdGUsIHVtIHNlaW5lIEZyYWdlIHp1IGJlYW50d29ydGVuLCBmdWhyIExhd3JlbmNlIHNjaG5lbGwgZm9ydC4gIkVsdGVybgord3VlbnNjaGVuIHNpY2ggZG9jaCwgZGFzcyBpaHIgS2luZCBlcyBndXQgaGF0LiBVbmQgZGFzIGhhdCBzaWUgZXMgIGpldHp0LiAgU2llCitpc3QgYmVpbSBsaWViZW4gR290dCB1bmQgZGFyZiBqZXR6dCBmdWVyIGlobiBzaW5nZW4uIFN0YXR0IHp1IGphbW1lcm4sIHNvbGx0ZXQKK2lociBldWNoIGZyZXVlbiB1bmQgZmVpZXJuLiBOdXIgZGFzcyBpaHIgamV0enQgbmljaHQgSnVsaWFzIEhvY2h6ZWl0IG1pdCBlaW5lbQoraXJkaXNjaGVuIEJyYWV1dGlnYW0gZmVpZXJ0LCBzb25kZXJuIGlocmUgSG9jaHplaXQgbWl0IGVpbmVtIGhpbW1saXNjaGVuLiAgVW5kCitkZXIgaXN0IGFsbGVtYWwgYmVzc2VyIGFscyAgZWluICBpcmRpc2NoZXIuIiAgRXIgIHpvZyAgUG9sbHkgIGRhcyAgVGFzY2hlbnR1Y2gKK2hlcnVudGVyIHVuZCBlbnRodWVsbHRlIGRpZSBrbGVpbmUgRmxhc2NoZSwgZGllIHNpZSBpbSBTY2h1dHogZGVzIFR1Y2hlcyBpbW1lcgord2llZGVyIGFuIGlocmUgTGlwcGVuIGdlaG9iZW4gaGF0dGUuICJBbHNvLCBTY2hsdXNzIGpldHp0ICBtaXQgIGRlbSAgR2VqYW1tZXIsCit6aWVodCBKdWxpYSBodWVic2NoIGFuIHVuZCBicmluZ3Qgc2llIGluIGRpZSBLaXJjaGUsIGRhbWl0IHNpZSBiZWVyZGlndCB3ZXJkZW4KK2thbm4uIgorCitIZXJyIENhcHVsZXQgc2V1Znp0ZS4gIkphamEsIGRhcyBMZWJlbiBnZWh0IHdlaXRlci4iCisKKyJSaWNodGlnLiIgQnJ1ZGVyIExhd3JlbmNlIG5pY2t0ZSBpaG0genUuCisKKyJEYW5uIHdlcmRlbiB3aXIgYWxzbyBzdGF0dCB3ZWlzc2VyIFR1ZWNoZXIgc2Nod2FyemUgYXVmaGFlbmdlbiAgdW5kICB0cmF1cmlnZQorTGllZGVyCXN0YXR0ICBkZXIgIGZyb2VobGljaGVuICBzcGllbGVuLiAgTWl0CWRlbSAgRmVzdCAgd29sbGVuICB3aXIJSnVsaWFzCitnZWRlbmtlbi4iIEhlcnIgQ2FwdWxldCBzYWgga2VpbmVuIFNpbm4gZGFyaW4sIGRhcyAgZ3V0ZSAgRXNzZW4gIHZlcmtvbW1lbiAgenUKK2xhc3Nlbi4KKworIkdhbnogZ2VuYXUuIFVuZCBqZXR6dCB0cm9lZGVsdCBuaWNodCAgbGFlbmdlciwgIEdvdHQgIHdpbGwsICBkYXNzICBpaHIgIEp1bGlhCitzY2huZWxsIGJlZXJkaWd0LCBkYW1pdCBuaWNodHMgc2llICBtZWhyICB2b24gIGRlbiAgRW5nbGVpbiAgYWJsZW5rdC4iICBCcnVkZXIKK0xhd3JlbmNlIHNjaGV1Y2h0ZSBhbGxlIGhpbmF1cy4KKworUG9sbHkgc2FoIHNpY2ggaW0gRmVzdHNhYWwgdW0uICJUamEsIGRhIHdlcmRlbiB3aXIgd29obCBub2NoICBlaW4gIHBhYXIgIERpbmdlCithZW5kZXJuIG11ZXNzZW4uIiBJaHIgQmxpY2sgZmllbCBhdWYgZGllIE11c2lrZXIuICJJaHIga29lbm50IGRhbm4gZ2VoZW4sICB3aXIKK2JyYXVjaGVuIGV1Y2ggbmljaHQuIgorCitFaW4gYWx0ZXIgR2FlcnRuZXIsIGRlciBkaWUgIFRvcGZyb3NlbgloaW5hdXMJdW5kICBkYWZ1ZXIgIEJ1Y2hzYmF1bQloZXJlaW4KK2JyYWNodGUsIHNjaHVldHRlbHRlIGRlbiBLb3BmLiAiTmVpbiwgZ2VodCBub2NoIG5pY2h0LiBTcGllbHQgIG1pciAgZG9jaCAgJ0RpZQorTG9yZWxlaScuIgorCisiV2FydW0gYXVzZ2VyZWNobmV0IGRhcz8iLCB3b2xsdGUgZGVyIGVyc3RlIEdlaWdlciB3aXNzZW4uCisKKyJXZWlsIGljaCBlcyBtaWNoIGF1ZiBhbmRlcmUgR2VkYW5rZW4gYnJpbmd0LiBJY2ggaG9lcmUgIGluICBtZWluZW0gIEtvcGYgIGRpZQorZ2FuemUgWmVpdCBkZW4gVHJhdWVybWFyc2NoLiIgRGVyIGFsdGUgTWFubiBrcmF0enRlIHNpY2ggYW0gS29wZiB1bmQgZGFjaHRlIGFuCitkaWUgTWFyZ2FyaXRlbmJhZXVtY2hlbiBpbSBHZXdhZWNoc2hhdXMuIEp1bGlhIGhhdHRlIHNpZSBiZXNvbmRlcnMgZ2VybiBnZWhhYnQKK3VuZCBlciBiZXNjaGxvc3MsIHNpZSBoaWVyIGhlcmVpbiB6dSBzdGVsbGVuIHVuZCBzaWNoICBuaWNodCAgdW0gIGRhcyAgR2V6ZXRlcgorSGVycm4gQ2FwdWxldHMJenUgIGt1ZW1tZXJuLCAgZGVyICBNYXJnYXJpdGVuCXVucGFzc2VuZCAgZmluZGVuICB3dWVyZGUuICBFcgorc2NobmV1enRlIHNpY2ggdmVyc3RvaGxlbiB1bmQgbmFobSBlaW5lIHdlaXRlcmUgVG9wZnJvc2UgaG9jaC4KKworRGVyIEdlaWdlciBuaWNrdGUuICJLYW5uc3QgZHUgaGFiZW4sIGFiZXIgd2FzIGJla29tbWVuIHdpcj8iCisKKyJXaWUgd2FlcmUgZXMgbWl0IGVpbmVyIFJvc2U/IiBEZXIgR2FlcnRuZXIgc3B1ZXJ0ZSBab3JuICBhdWZzdGVpZ2VuLiAgIktvZW5udAoraWhyIGVpbmVtIGFsdGVuIE1hbm4gbmljaHQgZWluZmFjaCBlaW5lbiBHZWZhbGxlbiB0dW4/IgorCisiRGF2b24gd2VyZGVuIHdpciBuaWNodCBzYXR0LCBNYW5uLiIKKworRGVyIEJyYXRzY2hpc3QgaG9iIGJlc2Nod2ljaHRpZ2VuZCBzZWluZW4gQm9nZW4uICJLb21tLCAgbGFzcyAgZ3V0ICBzZWluLiAgV2lyCitzcGllbGVuIGRpZSBMb3JlbGVpIHdhZWhyZW5kIHdpciAgYXVmICBkaWUgIFRyYXVlcmdhZXN0ZSAgd2FydGVuLiAgV2FlcmUgIGRvY2gKK2dlbGFjaHQsIHdlbm4gd2lyIG5pY2h0IGVpbiBwYWFyIEhhcHBlbiBhYmJla2FlbWVuLiIKKwpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9yb21fanVsL3NlaXRlMjUgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL3JvbV9qdWwvc2VpdGUyNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTNhMDgwCi0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9yb21fanVsL3NlaXRlMjUKQEAgLTAsMCArMSwxMTcgQEAKK0RFUiBGVUVORlRFIEFLVAorCURJRSBFUlNURSBTWkVORQorCisiRGFzIHdhciBlaW5lIGJlc2NoZXVlcnRlIElkZWUuIiwgYmVzY2h3ZXJ0ZSAgc2ljaCAgQXp6dXJvLiAgIldpciAgaGFldHRlbiAgaW4KK1Zlcm9uYSBibGVpYmVuIHNvbGxlbi4iCisKKyJVbmQgZGllc2VuIGF1ZmdlYmxhc2VuZW4gQWZmZW4genVzZWhlbiwgd2llIHNpZSBUcmF1ZXIgaGV1Y2hlbG4/IiBVbG8gdGF1Y2h0ZQoraWhyZW4gU2NobmFiZWwgdGllZiBpbiBlaW5lIFBmdWV0emUgdW5kIHNjaG1hdHp0ZS4KKworIldhcnVtIG5pY2h0PyBTY2hsaWVzc2xpY2ggZ2lidCBlcyBuYWNoaGVyIGVpbiBGZXN0bWFobC4iCisKKyJEdSBiaXN0IHZlcmZyZXNzZW4uIgorCisiSmEuIiBBenp1cm8ga29ubnRlIGRpZXMgbmljaHQgYWJzdHJlaXRlbi4gIkFiZXIgbmFjaCBNYW50dWEgaXN0IGVzICB3ZWl0ICB1bmQKK2ljaCBiaW4gbXVlZGUuIgorCisiSWNoIG1vZWNodGUgUm9tZW8gc2VoZW4sIHdlbm4gZXIgendlaSBOYWNocmljaHRlbiBnbGVpY2h6ZWl0aWcgIGJla29tbXQuICBXYXMKK3dpcmQgZXIgd29obCBnbGF1YmVuLCBkYXNzIEp1bGlhIHRvdCBpc3Qgb2RlciBkYXNzIHNpZSBzY2hsYWVmdCAgdW5kICBhdWYgIGlobgord2FydGV0PyBVbmQgd2FzLCB3ZW5uIEJydWRlciBMYXdyZW5jZSBkZW4gQnJpZWYgdmVyZ2Vzc2VuIGhhdD8iCisKKyJLZWluZSBBaG51bmcuIFNhZ2VuIGthbm5zdCAgZHUgIGVzICBpaG0gIGplZGVuZmFsbHMgIG5pY2h0LCAgc29uc3QgIHNpbmQgIHdpcgorZHJhdXNzZW4uIiBFciBzY2h1ZXR0ZWx0ZSBzaWNoIGJlaSBkZW0gR2VkYW5rZW4uICJTaWVoICBtYWwsICBkYSAgZ2VodCAgQnJ1ZGVyCitKb2huLiIKKworIldlciBpc3QgZGFzIG51biB3aWVkZXI/IgorCisiTGF3cmVuY2UgaGF0IGlobSBkZW4gQnJpZWYgZnVlciBSb21lbyBnZWdlYmVuLiBHdXQsIGRhbm4gIGtvZW5uZW4gIHdpciAgamV0enQKK3VtZHJlaGVuLiIKKworIkljaCB3dWVyZGUgbWljaCBsaWViZXIgZGF2b24gdWViZXJ6ZXVnZW4sIGRhc3MgUm9tZW8gZGVuIEJyaWVmIGJla29tbXQuIgorCisiU2VpIG5pY2h0IGFsYmVybi4iIEF6enVybyBzdHJlY2t0ZSBkaWUgRmx1ZWdlbCB1bmQgaG9iIG5hY2ggIFZlcm9uYSAgYWIsICBkaWUKK3NldWZ6ZW5kZSBVbG8gZGljaHQgaGludGVyIHNpY2guCisKK0tlaHJlbiB3aXIgbmljaHQgbWl0IGRlbiBUdXJ0ZWxrcmFlaGVuIG5hY2ggVmVyb25hIHp1cnVlY2ssICBpY2ggIGJpbiAgc2ljaGVyLAorZGFzcyBTaWUsIGxpZWJlICBMZXNlcmluLCAgbGllYmVyICBMZXNlciwgIHNpY2ggIEVyc3ByaWVzc2xpY2hlcmVzICB2b3JzdGVsbGVuCitrb2VubmVuLCBhbHMgYmVpIEp1bGlhcyBCZWVyZGlndW5nIHp1enVzZWhlbi4gWnVtYWwgd2VkZXIgU2llIG5vY2ggIGljaCAgZXR3YXMKK3ZvbiBkZW0gRmVzdHNjaG1hdXMgaGludGVyaGVyIGJla29tbWVuIHdlcmRlbi4KKworUm9tZW8gd2lzY2h0ZSBzaWNoIGRlbglTY2hsYWYJYXVzICBkZW4gIEF1Z2VuLCAgYWxzICBzZWluICBEaWVuZXIgIEJhbHRoYXNhcgorZWludHJhdC4gIkd1dGVuIE1vcmdlbi4gTWVpbmUgR3VldGUsIGhhYmUgaWNoIGdlc2NobGFmZW4uIgorCisiR3V0LCBob2ZmZSBpY2g/IiBCYWx0aGFzYXIgd2FyIG5pY2h0IGRhbmFjaCB6dW11dGUsIHNlaW5lIE5hY2hyaWNodGVuIHNjaG5lbGwKK2xvc3p1d2VyZGVuLgorCisiSWNoIGhhdHRlIGVpbmVuIHZlcnJ1ZWNrdGVuIFRyYXVtLiBJY2ggbGFnIHRvdCBpbiBlaW5lbSBHcmFiIHVuZCBKdWxpYSBrYW0genUKK21pci4gSGFzdCBkdSBzY2hvbiBlaW5tYWwgc28gZXR3YXMgRHVtbWVzIGdlaG9lcnQ/IiBFciBnYWVobnRlIHVuZCBzY2h3YW5nIGRpZQorQmVpbmUgdWViZXIgZGllIEJldHRrYW50ZS4gIk5hLCBpY2ggYnJhdWNoZSBudXIgIGFuICBKdWxpYSAgenUgIGRlbmtlbiwgIHNjaG9uCitmdWVobGUgaWNoIG1pY2ggcHJhZWNodGlnLiBXYXMgZ2lidCBlcyBOZXVlcyBhdXMgVmVyb25hPyBXaWUgIGdlaHQgIGVzCUp1bGlhPworVW5kIHdhcyBtYWNodCBtZWluZSBGYW1pbGllPyIKKworQmFsdGhhc2FyIGdvc3MgV2Fzc2VyIGluIGRpZSBXYXNjaHNjaHVlc3NlbC4gIkljaCBoYWJlIHp3ZWkgTmFjaHJpY2h0ZW4sICBlaW5lCitndXRlIHVuZCBlaW5lIHNjaGxlY2h0ZS4iCisKKyJSYWV0c2VsIGFtIGZydWVoZW4gTW9yZ2VuISIsIHN0b2VobnRlIFJvbWVvLiAiS2FubnN0IGR1IGRhbWl0ICBuaWNodCAgd2FydGVuLAorYmlzIGljaCB3YWNoZXIgYmluPyIKKworIkp1bGlhIGdlaHQgZXMgc28gZ3V0LCBkYXNzIGVzIHNjaG9uIHdpZWRlciAgc2NobGVjaHQgIGlzdC4iICBCYWx0aGFzYXIgIGxlZ3RlCitsYW5nc2FtIGVpbiBIYW5kdHVjaCBuZWJlbiBkaWUgU2NodWVzc2VsLgorCisiS29tbSwgc3B1Y2sncyBhdXMuIiBSb21lbyB0YXVjaHRlIGRhcyBHZXNpY2h0IGlucyBXYXNzZXIuCisKKyJFcyBnZWh0IEp1bGlhIGd1dCwgZGVubiBzaWUgaXN0IGltICBIaW1tZWwuICBEYXMgIGlzdCAgZGllICBndXRlICBOYWNocmljaHQuIgorQmFsdGhhc2FyIHNwcmFjaCBzY2huZWxsLgorCisiSWNoIHZlcnN0ZWhlLiIgUm9tZW8gdmVyem9nIGtlaW5lICBNaWVuZS4gICJCZXNvcmcnICBtaXIgIFBhcGllciwgIG1laW5zICBpc3QKK2dlc3Rlcm4gYXVzZ2VnYW5nZW4uIgorCitCYWx0aGFzYXIgYmV0cmFjaHRldGUgUm9tZW8ga3JpdGlzY2guICJEdSBzaWVoc3QgbmljaHQgZ3V0IGF1cy4gVmllbCB6dSAgYmxhc3MKK3VtIGRpZSBOYXNlIGZ1ZXIgbWVpbmVuIEdlc2NobWFjay4iCisKK1JvbWVvLCBmZXN0IGVudHNjaGxvc3Nlbiwgc2ljaCBuaWNodHMgYW5tZXJrZW4genUgbGFzc2VuLCBncmluc3RlICBicmVpdC4gICJEdQorc29sbHN0IG1pY2ggamEgYXVjaCBuaWNodCBoZWlyYXRlbi4gTG9zIHNjaG9uLCBpY2ggYnJhdWNoZSBkYXMgUGFwaWVyLiIKKworQmFsdGhhc2FyICBnaW5nLCAgZG9jaAluaWNodCAgb2huZSAgUm9tZW8gIG5vY2ggIGVpbmVuICBtaXNzdHJhdWlzY2hlbiAgQmxpY2sKK3p1enV3ZXJmZW4uCisKK1JvbWVvIHpvZyBzZWluZSBIb3NlIGFuIHVuZCBzdG9wZnRlIGRhcyBIZW1kIGVuZXJnaXNjaAloaW5laW4uICAiSGV1dGUgIGFiZW5kCitiaW4gaWNoIGJlaSBKdWxpYSwga29tbWUgd2FzIHdvbGxlLiIsIG11cm1lbHRlIGVyLgorCitEaWUgU3RyYXNzZW4gTWFudHVhcyB3YXJlbiB1ZWJlcmZ1ZWxsdCB1bmQgUm9tZW8gd3VyZGUJc3RhZW5kaWcgIGFuZ2VyZW1wZWx0LAord2FlaHJlbmQgZXIgc2ljaCBlaW5lbiBXZWcgZHVyY2ggZGllIE1lbmdlIGJhaG50ZS4gU2NobGllc3NsaWNoICBlcnJlaWNodGUgIGVyCitzZWluIFppZWw6IEVpbmUgQXBvdGhla2UsIGRlcmVuIEdlc2NoYWVmdGUgc2NobGVjaHQgIGdlbnVnICBnaW5nZW4sICBkYXNzICBpaHIKK0Jlc2l0emVyIGRpZSBHZXNldHplIG1pc3NhY2h0ZW4gdW5kICBpaG0gIEdpZnQJdmVya2F1ZmVuICB3dWVyZGUuICBBZXJnZXJsaWNoCitiZXRyYWNodGV0ZSBlciBkYXMgR2VzY2hsb3NzZW4tU2NoaWxkIGFuIGRlciBUdWVyICB1bmQJc2NobHVnCWRhbm4gIG1pdCAgZGVyCitGYXVzdCBnZWdlbiBkZW4gUmFobWVuLiAiSGFsbG8/IgorCitEZXIgQXBvdGhla2VyIG9lZmZuZXRlLiAiSWNoIGhhYmUgaGV1dGUga2VpbmVuIE5vdGRpZW5zdC4iCisKKyJEb2NoLCBoYWJlbiBTaWUuIiBSb21lbyBoaWVsdCBkZW0gTWFubiBlaW4ga2xlaW5lcyBWZXJtb2VnZW4gdW50ZXIgZGllIE5hc2UuCisKKyJLb21tZW4gU2llIHJlaW4uIiBEZXIgIEFwb3RoZWtlciAgem9nICBpaG4gIGFtICBBZXJtZWwgIGhpbnRlciAgc2ljaCAgaW4gIGRlbgorVmVya2F1ZnNyYXVtIHVuZCBzY2hsdWcgZGllIFR1ZXIgenUuICJXYXMgd29sbGVuIFNpZT8iCisKKyJHaWZ0LiBFaW4gZ3V0ZXMsIHNjaG5lbGxlcyBHaWZ0LiIKKworRGVyIE1hbm4gc2NodWV0dGVsdGUgZGVuIEtvcGYuICJJY2ggYmluIGRvY2ggbmljaHQgd2FobnNpbm5pZy4gV2VubiBpY2ggIElobmVuCitHaWZ0IHZlcmthdWZlLCB2ZXJsaWVyZSBpY2ggbWVpbmUgWnVsYXNzdW5nLiIKKworIlp1bGFzc3VuZyBoaW4sIEdlbGQgaGVyLiIgUm9tZW8gc2Nod2Vua3RlIGRpZSBNdWVuemVuLiAiSWNoIHdlcmRlICBTaWUgIG5pY2h0Cit2ZXJyYXRlbi4iCisKK0RpZSBGaW5nZXIgZGVzIEFwb3RoZWtlcnMgenVja3Rlbi4gIkljaCBrYW5uIG5pY2h0LiIKKworIldhcz8gV2lkZXJzdGVoZW4/IiBSb21lbyBsYWVjaGVsdGUuICJLb2VubnRlIGljaCBhdWNoIG5pY2h0LCB3ZW5uICBpY2ggIHNlaGUsCit3aWUgc2NobGVjaHQgYXVzZ2VzdGF0dGV0IFNpZSBzaW5kLiBGdWVyIGRhcyBHZWxkIGtvZW5uZW4gU2llIGVpbmUgTWVuZ2UgV2FyZQora2F1ZmVuLiIKKworRGVyIEFwb3RoZWtlciBzY2hsb3NzIHVtc3RhZW5kbGljaCBlaW5lbiBTY2hyYW5rIGF1Zi4gICJEYSwgIG5laG1lbiAgU2llLiAgVW5kCitkYW5uIHZlcnNjaHdpbmRlbiBTaWUuIgorCitSb21lbyBuaWNrdGUuICJJY2ggdmVyc2Nod2luZGUgYXVmIGltbWVyLCBrZWluZSBTb3JnZS4gIFVuZCAgd2VubiAgamVtYW5kICBTaWUKK2ZyYWd0LCBoYWJlbiBTaWUgbWlyIGtlaW4gR2lmdCB2ZXJrYXVmdCwgc29uZGVybiBNZWRpemluLiIKKworIldvcmF1ZiBTaWUgc2ljaCB2ZXJsYXNzZW4ga29lbm5lbi4iIERlciBBcG90aGVrZXIgYmxpY2t0ZSBhdWYgZGllIE11ZW56ZW4gIGluCitzZWluZW4gSGFlbmRlbiwgZGVubiBTY2hlaW5lIHdhcmVuIG5vY2ggbmljaHQgZXJmdW5kZW4gd29yZGVuLgorCmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL3JvbV9qdWwvc2VpdGUyNiBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvcm9tX2p1bC9zZWl0ZTI2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MWQxODEKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL3JvbV9qdWwvc2VpdGUyNgpAQCAtMCwwICsxLDUxIEBACitERVIgRlVFTkZURSBBS1QKKwlESUUgWldFSVRFIFNaRU5FCisKK1dhaHJzY2hlaW5saWNoIGZyYWdlbiBTaWUgc2ljaCBqZXR6dCwgd28gQnJ1ZGVyIEpvaG4gIGFiZ2VibGllYmVuICBpc3QsICBuaWNodAord2Focj8gU2VoZW4gd2lyIGFsc28gbmFjaCwgd28gZXIgc2ljaCBoZXJ1bXRyZWlidC4KKworQnJ1ZGVyIEpvaG4gbWFyc2NoaWVydGUgIHNjaG5hdWZlbmQgIGRlbiAgQmVyZwloaW5hdWYuICBBbHMgIGVyICBMYXdyZW5jZSAgaW0KK0tyYWV1dGVyZ2FydGVuIHNhaCwgd2lua3RlIGVyLiAiTGF3cmVuY2UsIEJydWRlciBMYXdyZW5jZSEiCisKK0xhd3JlbmNlIHJpY2h0ZXRlIHNpY2ggc3RvZWhuZW5kIGF1Zi4gIkFoLCBkYSBiaXN0IGR1IGphLiIgRXIgIHJlaWNodGUgIHNlaW5lbQorT3JkZW5zYnJ1ZGVyIGxhZWNoZWxuZCBlaW5lbiAgS3J1ZyAgV2Vpbi4gICJIaWVyICB0cmluay4gIEhhc3QgIGR1ICBkZW4gIEJyaWVmCithYmdlbGllZmVydD8iCisKK0pvaG4gbmFobSBlaW5lbiB0aWVmZW4gWnVnIHVuZCBzY2h1ZXR0ZWx0ZSBkZW4gS29wZi4gIk5laW4sICBzbyAgbGVpZCAgZXMgIG1pcgordHV0LiIgRXIgZ3JpZmYgaW4gc2VpbmUgS3V0dGUgdW5kIGZvZXJkZXJ0ZSBkZW4gemVya25pdHRlcnRlbiAgdW5kICBuYWNoICBXZWluCityaWVjaGVuZGVuIEJyaWVmIHp1dGFnZS4gIkhpZXIgaXN0IGVyIHdpZWRlci4iCisKKyJIb2VsbGUgdW5kIFRldWZlbCEiIExhd3JlbmNlIGVyZ3JpZmYgZGVuIEtyYWdlbiBkZXIgS3V0dGUgc2VpbmVzICBNaXRicnVkZXJzLgorIldlaXNzdCBkdSwgd2llIHdpY2h0aWcgZGllc2VyIEJyaWVmIGlzdD8iCisKKyJJY2gga29ubnRlIG5pY2h0cyBkYWZ1ZXIhIiwgd2ltbWVydGUgSm9obi4gIkljaCB3YXIgc2Nob24gaGFsYiBpbiBNYW50dWEsIGFscworaWNoIGR1cmNoIGVpbiBEb3JmIGthbS4uLiIKKworIlVuZCBkdSBrb25udGVzdCBkZW0gV2VpbiBkYSBuaWNodCB3aWRlcnN0ZWhlbj8gIE5pY2h0ICBlaW4gIGVpbnppZ2VzICBNYWwgIGluCitkZWluZW0gTGViZW4/IiBMYXdyZW5jZSB3ZWRlbHRlIGFua2xhZ2VuZCBtaXQgZGVtIEJyaWVmIHVudGVyIEpvaG5zICBOYXNlICBoaW4KK3VuZCBoZXIuICJNZWluc3QgZHUsIGljaCByaWVjaGUgbmljaHQsIHdhcyBkdSBtaXQgZGVtIEJyaWVmIGFuZ2VzdGVsbHQgaGFzdD8iCisKKyJJbiBkZW0gRG9yZiB3YXIgZGFzIFdhc3NlciB2ZXJzZXVjaHQsIHdpciBrb25udGVuIG51ciBXZWluIHRyaW5rZW4sICB3YWVocmVuZAord2lyIGRpZSBLcmFua2VuIHZlcnNvcmd0ZW4uIgorCisiSmEsIG5hdHVlcmxpY2guIFVuZCBkaWUgRXJkZSAgaXN0ICBlaW5lICBLdWdlbC4iICBCcnVkZXIgIExhd3JlbmNlICBzY2huYXVidGUKK3ZlcmFlY2h0bGljaC4gIkhpbW1lbCwgd2FzIHNvbGwgaWNoIGpldHp0IG51ciB0dW4/IgorCisiVmllbGxlaWNodCBlaW5lbiBuZXVlbiBCcmllZiBzY2hyZWliZW4/Iiwgd2FndGUgSm9obiB2b3J6dXNjaGxhZ2VuLgorCisiSmEsIGFiZXIgZXJzdCBtdXNzIGljaCBKdWxpYSBhdXMgZGVtIEdyYWIgaG9sZW4uIgorCisiSnVsaWE/IiBCcnVkZXIgSm9obiB3YXIgZW50c2V0enQuICJEYXMgIGlzdCAgR3JhYnNjaGFlbmR1bmchICBEYXMgIGRhcmZzdCAgZHUKK25pY2h0IHR1bi4iCisKK0xhd3JlbmNlIHNjaHVldHRlbHRlIGRlbiBLb3BmLiAiSnVsaWEgbGVidC4gVW5kIGdlbmF1IGRhcyBzdGFuZCAgYXVjaCAgaW4gIGRlbQorQnJpZWYuIiBNaXQgZWluZW0gU3RvZWhuZW4gd2lzY2h0ZSBlciBzaWNoIGRlbiBTY2h3ZWlzcyBhYi4gIlVuZCBzaWUgIHdpcmQgIGluCit6aWVtbGljaCBnZW5hdSBkcmVpIFN0dW5kZW4gd2llZGVyIHdhY2ggd2VyZGVuLiIKKworIkFiZXIgZGF2b24gaGFzdCBkdSAgbWlyICBuaWNodHMgIGdlc2FndC4iICBCcnVkZXIgIEpvaG5zICBTdGltbWUgIHdhciAgdm9sbGVyCitWb3J3dXJmLgorCisiTmF0dWVybGljaCBuaWNodCwgc29uc3Qgd2Vpc3MgZXMgamEgYmlubmVuICBlaW5lciAgU3R1bmRlICBkaWUgIGdhbnplICBTdGFkdC4KK0Fsc28sIGJlc29yZyBtaXIgZWluIEJyZWNoZWlzZW4uICBJY2ggIGhvbGUgIEp1bGlhICBhdXMgIGRlciAgR3J1ZnQgIHVuZCAgZGFubgorc2NocmVpYmUgaWNoIGVpbmVuIG5ldWVuIEJyaWVmIGFuIFJvbWVvLiIKKwpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9yb21fanVsL3NlaXRlMjcgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL3JvbV9qdWwvc2VpdGUyNwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzUyMWU2Ci0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9yb21fanVsL3NlaXRlMjcKQEAgLTAsMCArMSwzOTEgQEAKK0RFUiBGVUVORlRFIEFLVAorCURJRSBGVUVORlRFIFNaRU5FCisKK0F6enVybwloYWVtbWVydGUgIG1pdAlkZW0gIFNjaG5hYmVsICBnZWdlbiAgZGllICBSZWdlbnJpbm5lCXVlYmVyCUp1bGlhcworU2NobGFmemltbWVyLiAiV2xhZCwgYXVmd2FjaGVuISIKKworV2xhZHMgd2VpbmVybGljaGUgU3RpbW1lIGVydG9lbnRlIHZvbiBkcmlubmVuLiAiTWVpbmUgQXVnZW4gIHNzc2luZCAgc3NzdHVtcGYsCittZWluIFJhZGFyIGlzc3N0IG11ZWRlIHVuZCBtZWluZSBTc3NhZWhuZSBzc3NpbmQgIHRhdWIuLi4gIFdlcglzc3N0b2VydCAgZWluZQorYXJtZSBhbHRlIEZsZWRlcm1hdXNzcyBtaXR0ZW4gaW4gZGVyIE5hY2h0PyIKKworIkhvZXIgc2Nob24gYXVmLCB3aXIgc2luZCdzOiBVbG8gdW5kIEF6enVybyEiLCByaWVmIEF6enVyby4KKworRGllIEZsZWRlcm1hdXMgc3RyZWNrdGUgZGVuIEtvcGYgaGVyYXVzLiAiQWNoIHNzc28sIHVuZCAgaWNoICBkYWNodGUgIHNzc2Nob24sCitlc3NzIHdhZXJlIGRpZSBQb2xpenp6ZWkuIFdhc3NzIGdpYnQgZXNzcyBkZW5uPyIKKworIktvbW1zdCBkdSBtaXQgenVtIEZyaWVkaG9mPyIsIGZyYWd0ZSBVbG8uCisKKyJQaWNrbmljaz8iCisKK0F6enVybyBydWVscHN0ZSB2ZXJoYWx0ZW4uICJOZWluLCBpY2ggYmVrb21tZSBrZWluZW4gQmlzc2VuIG1laHIgcnVudGVyLiIKKworIkljaCBob2ZmZSwgZHUgaGFzc3N0IG1pciBub2NoIGVpbmUgRmxpZWdlIHVlYnJpZyBnZWxhc3NzZW4/IgorCisiS2VpbmUgZWluemlnZS4uLiIKKworIldhc3NzPyIsIHVudGVyYnJhY2ggaWhuIFdsYWQgZW1wb2VydC4KKworIkljaCBoYWJlIGtlaW5lIGVpbnppZ2UgRmxpZWdlIGdlZ2Vzc2VuLiBXaXIgaGFiZW4gdW5zIGJlaSAgSnVsaWFzICBCZWdyYWVibmlzCitzY2hhZGxvcyBnZWhhbHRlbi4iCisKKyJXYXJ1bSBoYWJ0IGlociBtaXNzcyBuaXNzc3QgZ2V3ZWNrdD8gRGFzc3MgaGFldHRlICBpc3NzICBnZXJuZSAgZ2VzZWhlbi4gIFVuZAorYXVzc3NlcmRlbTogV2Fzc3Mgc3Nzb2xsIGlzc3MgZGFubiBqZXRzc3N0IG5vY2ggYXVmIGRlbSBGcmllZGhvZj8iCisKKyJTaG93ZG93biEiIEF6enVybyBtYWNodGUgZWluZSBkcmFtYXRpc2NoZSBHZWJhZXJkZS4KKworIldpZXNzc28/IgorCisiUm9tZW8gaGF0IGRlbiBCcmllZiBuaWNodCBiZWtvbW1lbiwgaW4gZGVtIHN0ZWh0LCBkYXNzIEp1bGlhIG5vY2ggIGxlYnQuICBVbmQKK1BhcmlzIHdpbGwgc2ljaCBoZXV0ZSBhYmVuZCBzZWhlbiBsYXNzZW4sIHdpZSBlciBKdWxpYSB6dWVuZnRpZyBiZWphbW1lcnQuIgorCisiS2xpbmd0IGludGVyZXNzc2FudC4iIFdsYWQgZ3JpbnN0ZS4gIkFsc3NzbywgZmxpZWdlbiB3aXIuIgorCitTaWUgZXJyZWljaHRlbiBkZW4gRnJpZWRob2YgenVzYW1tZW4gbWl0ICBQYXJpcyAgdW5kICBzZWluZW0gIHNjaHdhdHpoYWZ0ZXN0ZW4KK1BhZ2VuLgorCitQYXJpcyBuYWhtIGRlbSBKdW5nZW4gZWluZSBGbGFzY2hlIFBhcmZ1bSBhYi4gIkR1IGthbm5zdCBkYSBkcnVlYmVuICBhdWYgIG1pY2gKK3dhcnRlbi4gV2VubiBqZW1hbmQga29tbXQsIHBmZWlmIG5hY2ggbWlyLiIKKworIkVzIGlzdCBkdW5rZWwsIHdpciBzaW5kIGF1ZiBkZW0gRnJpZWRob2YgdW5kIGljaCAgaGFiZSAgQW5nc3QuIiwgIHdhbmR0ZSAgZGVyCitQYWdlIGVpbi4KKworIk5hdHVlcmxpY2ggaXN0IGVzIGR1bmtlbCwgc2NobGllc3NsaWNoIGlzdCBlcyBOYWNodC4iIFBhcmlzICBzY2h1ZXR0ZWx0ZSAgZGVuCitLb3BmLiAiV2VubiBkdSBHZXNwZW5zdGVyIHNpZWhzdCwga2FubnN0IGR1IGphIHBmZWlmZW4uIgorCitNdXJtZWxuZCB6b2cgZGVyIEp1bmdlIHNpY2ggenVydWVjayB1bmQgaG9ja3RlIHNpY2ggZWluIFN0dWVjayBlbnRmZXJudCAgdW50ZXIKK2VpbmUgRWliZS4KKworV2xhZCBraWNoZXJ0ZSBsZWlzZS4gIlBhc3NzdCBtYWwgYXVmLiIgU2llIGxpZXNzICBzaWNoICB2b24gIGRlbSAgQXN0ICBmYWxsZW4sCit1bnRlciBkZW0gc2llIGdlaGFuZ2VuIGhhdHRlIHVuZCBkcmVodGUgZWluZSAgaGFsc2JyZWNoZXJpc2NoZQlSdW5kZSAgdW0gIGRlbgorS29wZiBkZXMgUGFnZW4uIERlciAgSnVuZ2UgIHNwaXR6dGUgIGRpZSAgTGlwcGVuICB1bmQgIHZlcnN1Y2h0ZSAgenUgIHBmZWlmZW4sCitlcnJlaWNodGUgYWJlciBudXIgZWluIGthdW0gaG9lcmJhcmVzIFppc2NoZW4uIExhY2hlbmQgem9nICBXbGFkICBzaWNoCXdpZWRlcgorYXVmIGlocmVuIEFzdCB6dXJ1ZWNrLgorCisiRHUgYmlzdCBnZW1laW4uIiBBdWNoIFVsbyBncmluc3RlLgorCisiSmEuIiBXbGFkIHN0cmljaCBzaWNoIG1pdCBkZW0gRmx1ZWdlbCB1ZWJlciBkaWUgT2hyZW4uCisKKyJHdWNrdCBldWNoIFBhcmlzIGFuLiIgQXp6dXJvIGRldXRldGUgbWl0IGRlbSBTY2huYWJlbC4gIkljaCBoYWV0dGUgZWlnZW50bGljaAorZXJ3YXJ0ZXQsIGRhc3MgZXIgWnVzY2hhdWVyIG1pdGJyaW5ndC4iCisKKyJIYXQgZXIgZG9jaC4iIFVsbyB3aWVzIGF1ZiBkZW4gUGFnZW4uICJEZXIgS2xlaW5lIGlzdCBuaWNodCAgbnVyICBmdWVyICBzZWluZQorRmVpZ2hlaXQgYmVrYW5udCwgZXIga2FubiBhdWNoIG5pY2h0cyBmdWVyIHNpY2ggYmVoYWx0ZW4uIgorCisiT2guIiBBenp1cm8gbmlja3RlLgorCitQYXJpcyBkcnVlY2t0ZSBzaWNoIGVpbiBUdWVjaGxlaW4gYW5zIEdlc2ljaHQgdW5kIHZlcmdvc3MgZWluIHBhYXIgVHJhZW5lbi4KKworIlNzc2luZCBkYXNzcyBTc3N3aWViZWxuLCBkaWUgaXNzcyBkYSByaWVzc3NlPyIsIGZyYWd0ZSBXbGFkLgorCisiVW5kIEFtbW9uaWFrLiIgVWxvIHJpZWIgc2ljaCBkZW4gU2NobmFiZWwgbWl0IGRlciBLbGF1ZS4gIkRhcyB0cmVpYnQgZWluZW0gamEKK2RpZSBUcmFlbmVuIGluIGRpZSBBdWdlbi4iCisKKyJEYXJ1bSBoYXQgZXIgZXMgamEuIiBBenp1cm8ga25pZmYgZGllIEF1Z2VuIHp1c2FtbWVuLiAiUGFzc3QgYXVmLCBqZXR6dCBrb21tdAorZWluIEdlZGljaHQuIgorCitVbG8gdW5kIFdsYWQgc3RvZWhudGVuLgorCisiT2gsIEp1bGlhLCBzY2hvZW5zdGUgQmx1bWUgZHUsIG1pdCBUcmFlbmVuICBkZWNrZSAgaWNoICBkZWluICBHcmFiLi4uIiAgUGFyaXMKK3pvZWdlcnRlLiAiLi4ubWl0IFRyYWVuZW4gZGVjaycgZGVpbiBHcmFiIGljaCB6dS4gQmx1bWVuIHN0cmV1ICBpY2ggIGF1ZiAgZGVpbgorSGF1cHQsIHdlaWwgYm9lc2VyIFRvZCBkaWNoIGhhdCBnZXJhdWJ0LiIKKworIkF1YS4iLCBrb21tZW50aWVydGUgVWxvLgorCisiUmVpbSBkaXNzcywgb2RlciBpc3NzIGJlaXNzcyBkaXNzcy4iLCBzdGltbXRlIFdsYWQgaWhyIHp1LiAgR3JpbnNlbmQgIGRldXRldGUKK3NpZSBhdWYgZGVuIFBhZ2VuLiAiRXIgdmVyc3NzdWNodCdzc3MgaW1tZXIgbm9jaC4iIFNpZSBzcGl0enRlIGRpZSBMaXBwZW4gIHVuZAorcGZpZmYgc2NocmlsbC4gIlNzc3NvIGdlaHQgZGFzc3MuIgorCitEZXIgSnVuZ2Ugc2NoYXV0ZSBzaWUgYWVuZ3N0bGljaCBhbi4gUGFyaXMsIGRlciBmZXN0ZW4gTWVpbnVuZywgc2VpbiBQYWdlIGhhYmUKK2dlcGZpZmZlbiwgYmxpY2t0ZSBzaWNoIHVtIHVuZCBuYWhtIGVpbmVuIEZhY2tlbHNjaGVpbiB3YWhyLiBSYXNjaCBzdGVja3RlICBlcgorZGFzIFBhcmZ1bWZsYWVzY2hjaGVuIGVpbiB1bmQgZHVja3RlIHNpY2ggbmViZW4gZWluZW4gc3RlaW5lcm5lbiBFbmdlbC4KKworIkFoLCBkYSBpc3NzdCBSb21lby4iIFdsYWQgcmVja3RlIHNpY2ggc28gd2VpdCB2b3IsICBkYXNzICBzaWUgIGZhc3QgIHZvbSAgQXN0CitmaWVsLgorCitSb21lbyBuYWhtIGVpbmVuIEJyaWVmIGF1cyBzZWluZXIgIEphY2tlbnRhc2NoZSAgdW5kICByZWljaHRlICBpaG4gIEJhbHRoYXNhci4KKyJIaWVyLCBkZW4gZ2lic3QgZHUgZ2xlaWNoIG1vcmdlbiBmcnVlaCBtZWluZW0gVmF0ZXIuIgorCitCYWx0aGFzYXIgZnVlaGx0ZSBzaWNoIGFsbGVzIGFuZGVyZSBhbHMgd29obCBpbiAgc2VpbmVyICBIYXV0LgkiV2FzICBoYXN0ICBkdQordm9yPyIKKworIkljaCB3ZXJkZSBtaXIgSnVsaWFzIEVoZXJpbmcgaG9sZW4sIGRlbm4gc2NobGllc3NsaWNoIHN0ZWh0IG1pciBkZXIgYWxzIGlocmVtCitNYW5uIHp1LCB1bmQgaWhyIGRpZSBsZXR6dGUgRWhyZSBlcndlaXNlbi4gV2FzIHNvbnN0LCBtZWluc3QgZHU/IiAgUm9tZW8gIG5haG0KK0JhbHRoYXNhciBkYXMgU3RlbW1laXNlbiBhYi4gIkR1IG11c3N0IGhpZXIgdmVyc2Nod2luZGVuLCBpY2ggd2lsbCBuaWNodCwgZGFzcworZHUgbWVpbmV0d2VnZW4gaW4gU2Nod2llcmlna2VpdGVuIGtvbW1zdC4iCisKKyJBY2gsIG1pdCBTY2h3aWVyaWdrZWl0ZW4gd2VyZGUgaWNoIGZlcnRpZy4iIEJhbHRoYXNhciB6dWNrdGUgIGRpZSAgU2NodWx0ZXJuLgorIkFiZXIgZGljaCBhdWYgZGVtIGR1bmtsZW4gRnJpZWRob2YgYWxsZWluIHp1IGxhc3NlbiwgZGFzIGJlaGFndCBtaXIgbmljaHQuIgorCisiVmVybnVlbmZ0aWcsIGRlciBNYW5uLiIsIG1laW50ZSBBenp1cm8uCisKK1JvbWVvIGxlZ3RlIHNlaW5lbSBEaWVuZXIgZGllIEhhbmQgYXVmIGRpZSBTY2h1bHRlci4gIk1hY2ggZGlyIHVtICBtaWNoICBrZWluZQorU29yZ2VuLiBWZXJzY2h3aW5kZSBoaWVyLCB1bmQgd2VubiBpY2ggZGljaCBlcndpc2NoZSwgZGFzcyBkdSBkaWNoIGhpZXIgaW4gZGVyCitOYWVoZSBhdWZoYWVsc3QsIHJlaXNzZSBpY2ggZGlyIGRpZSBPaHJlbiBhYiwgdmVyc3RhbmRlbj8iCisKK0JhbHRoYXNhciBuaWNrdGUuICJKYSwgIGljaCAgaGFiZSAgdmVyc3RhbmRlbi4gIFRyb3R6ZGVtOiAgUm9tZW8sICBtYWNoICBrZWluZQorRHVtbWhlaXRlbi4iCisKKyJJY2ggd2FyIG5pZSBpbiBtZWluZW0gTGViZW4gdmVybnVlbmZ0aWdlci4gTWFjaCBkaWNoIHZvbSBBY2tlci4iIEVyIHNhaCwgIHdpZQorQmFsdGhhc2FyIHp1c2FtbWVuenVja3RlLiAiR290dGVzYWNrZXIsIHdvbGx0ZSBpY2ggc2FnZW4uIgorCitCYWx0aGFzYXIgbmlja3RlIGVyZ2ViZW4sIG1hY2h0ZSBhdWYgZGVtIEFic2F0eiBrZWhydCB1bmQgYmxpY2t0ZSAgYXVjaCAgbmljaHQKK3p1cnVlY2ssIGFscyBlciBob2VydGUsIHdpZSBSb21lbyBkYXMgR3JhYiBhdWZicmFjaC4KKworUGFyaXMgeml0dGVydGUgaGludGVyIGRlbSBSb2NrIGRlcyAgRW5nZWxzICB2b3IgIFd1dCwgIGFscyAgZXIJZGllICBoYWxsZW5kZW4KK1NjaGxhZWdlIGhvZXJ0ZSwgbWl0ICBkZW5lbiAgUm9tZW8gIGRhcyAgR3JhYiAgb2VmZm5ldGUuICAiRHUgIEdyYWJzY2hhZW5kZXIhIgorV3VldGVuZCBzcHJhbmcgZXIgbmFjaCB2b3JuZSB1bmQgem9nIHNlaW5lbiBEZWdlbi4KKworUm9tZW8gd2FuZHRlIHNpY2ggbGFuZ3NhbSB1bSwgZGFzIEJyZWNoZWlzZW4gaW4gZGVyICBSZWNodGVuLiAgIkhvZXIgIHp1LCAgaWNoCitoYWJlIG5pY2h0IHZvciwgZGFzIEdyYWIgenUgc2NoYWVuZGVuLiBXZW5uIGR1IG51ciBmdWVyIGZ1ZW5mIFBmZW5uaWcgVmVyc3RhbmQKK2hhc3QsIG1hY2hzdCBkdSwgZGFzcyBkdSB3ZWdrb21tc3QuIgorCisiUmVpY2h0IGVzIGRpciBuaWNodCwgZGFzcyBKdWxpYSB2b3IgbGF1dGVyIEt1bW1lciB1ZWJlciBkZWluZW4gTW9yZCBhbiAgaWhyZW0KK1ZldHRlcnMgVHliYWx0IFNlbGJzdG1vcmQgYmVnYW5nZW4gaGF0PyBNdXNzdCBkdSBqZXR6dAlhdWNoICBub2NoICBpaHJlICBSdWhlCitzdG9lcmVuPyIgRGllICBEZWdlbnNwaXR6ZSAgcmVja3RlICBzaWNoICBiZWdlaHJsaWNoICBSb21lb3MgIEtlaGxlICBlbnRnZWdlbi4KKyJFc2NhbHVzIGhhdCBkaWNoIHZlcmJhbm50IGZ1ZXIgZGllc2VzIFZlcmJyZWNoZW4sIGpldHp0IGtvbW1zdCBkdSB6dXJ1ZWNrLCB1bQorbm9jaCBtZWhyIFNjaGFuZHRhdGVuIHp1IGJlZ2VoZW4/IiBQYXJpcyBHZXNpY2h0IGxldWNodGV0ZSB3ZWlzcyB2b3IgIFpvcm4gIGltCitzY2h3YWNoZW4gU3Rlcm5lbmxpY2h0LiAiRGllc21hbCBrb21tc3QgZHUgbmljaHQgZGF2b24sIGRhcyBzY2h3b2VyZSBpY2ggIGRpci4KK0ljaCBuZWhtZSBkaWNoIGZlc3QgdW5kIG1vcmdlbiB3aXJkIEVzY2FsdXMgZGljaCB6dW0gVG9kIHZlcnVydGVpbGVuLiIKKworIkljaCBiaW4gbGFlbmdzdCAgenVtICBUb2QgIHZlcnVydGVpbHQsICBNYW5uLiIgIFJvbWVvICB2ZXJ6b2cgIGJlZGF1ZXJuZCAgZGFzCitHZXNpY2h0LiAiSWNoIGJpbiBudXIgaGllciwgd2VpbCBpY2ggc3RlcmJlbiB3aWxsLCAgdmVyc3RlaHN0ICBkdSAgZGFzICBuaWNodD8KK0Fsc28gdHUgbWlyIHVuZCBkaXIgIGRlbiAgR2VmYWxsZW4gIHVuZCAgendpbmcJbWljaCAgbmljaHQsICBkaWNoICBhdWNoICBub2NoCit1bXp1YnJpbmdlbi4iIEVyIGhvYiBkYXMgQnJlY2hlaXNlbi4KKworUGFyaXMgYW50d29ydGV0ZSBuaWNodCwgc29uZGVybiBoaWViIHdpbGQgbmFjaCBSb21lby4KKworRGVyIFBhZ2UgaG9lcnRlIGRlbiBMYWVybSB1bmQgcmljaHRldGUgc2ljaCBhYnJ1cHQgYXVmLCBkYW5uIGRyZWh0ZSBlciBzaWNoIHVtCit1bmQgcmFubnRlIGxhdXRoYWxzIG5hY2ggZGVyIFdhY2hlIHNjaHJlaWVuZCBkZW4gSHVlZ2VsIGhpbnVudGVyLgorCisiQWxzIEZlY2h0ZXIga2FubiBlciBub2NoIGV0d2FzIGxlcm5lbi4iIEF6enVybyBzY2h1ZXR0ZWx0ZSBkZW4gS29wZi4KKworIkVsZWdhbnQgaXN0IGVyIG5pY2h0LCBkYXMgc3RpbW10LiIgIFVsbyAga3JhZWNoenRlICBsZWlzZSwgIGFscyAgUGFyaXMgIGVpbmVuCitTY2hsYWcgbWlyIGRlbSBCcmVjaGVpc2VuIG51ciBtaXQga25hcHBlciBOb3QgYWJmaW5nLiBEZXIgbmFlY2hzdGUgU2NobGFnICBrYW0KK3NjaG5lbGxlciwgYWxzIFBhcmlzIGVzIGVyd2FydGV0IGhhdHRlLiAiVW5kIGxlcm5lbiB3aXJkIGVyIGF1Y2ggbmljaHRzIG1laHIuIgorCisiU3NzaWUgaGFldHRlbiBzc3Npc3NzIHJ1aGlnIGVpbiBiaXNzc2VuIG1laHIgYW5zdHJlbmdlbiBrb2VubmVuLiIsIGJlc2Nod2VydGUKK3NpY2ggV2xhZC4KKworUGFyaXMgc3RvZWhudGUsIGFscyBSb21lbyBzaWNoIHVlYmVyIGlobiBiZXVndGUuICJCZWdyYWIgbWljaCAgbmViZW4gIEp1bGlhLiIsCitmbHVlc3RlcnRlIGVyLgorCitSb21lbyBuaWNrdGUuICJWZXJzcHJvY2hlbi4iIEFscyBQYXJpcyBzdGFyYiwgc2FoIGVyICBnZW5hdWVyICBoaW4uICBFciAgd3VyZGUKK2JsYXNzLCBhbHMgZXIgUGFyaXMgZXJrYW5udGUuICJWZXJkYW1tdC4iCisKKyJKdWxpYSBzb2xsdGUgaWhuIGhlaXJhdGVuLiIsIGZsdWVzdGVydGUgQXp6dXJvIGxlaXNlIGluIFJvbWVvcyBPaHIuCisKK1JvbWVvIHN0YW1wZnRlIG1pdCBkZW0gRnVzcyBhdWYuICJWZXJkYW1tdCwgdmVyZGFtbXQsIHZlcmRhbW10LiAgV2llc28gIG11c3N0ZQoraWNoIGF1c2dlcmVjaG5ldCBpaG4gZXJ3aXNjaGVuPyIKKworIkhlLCBSb21lbywgaWNoIG11c3MgZGlyIGV0d2FzIHNhZ2VuLiIgVWxvIGh1ZXBmdGUgIGF1ZiAgZWluZW4gIFZvcnNwcnVuZyAgZGVyCitHcnVmdC4KKworUm9tZW8gYmxpY2t0ZSBhdWYuICJUdSdzIG5pY2h0LiIKKworIkRvY2guIiBBdWZnZXJlZ3QgdHJpcHBlbHRlIFVsbyBoaW4gdW5kIGhlci4gIkp1bGlhIGlzdC4uLiIKKworIlRvdCB1bmQgYmVlcmRpZ3QsIGljaCB3ZWlzcy4iLCB1bnRlcmJyYWNoIFJvbWVvIHNpZS4gIlVuZCBpY2ggYmluIGF1Y2ggIHNjaG9uCit0b3QuIFNvIGd1dCB3aWUuIiBFciBzZXVmenRlIHVuZCBob2IgUGFyaXMgaG9jaC4gIlVuZCAgUGFyaXMgIHdpcmQgIHZvbiAgZWluZW0KK1RvdGVuIGJlZXJkaWd0LiBXYXMgZnVlciBlaW5lIElyb25pZSBkZXMgU2NoaWNrc2Fscy4iIEVyIGxhY2h0ZSBiaXR0ZXIuCisKKyJOZWluLCBKdWxpYSBpc3QuLi4iCisKKyIuLi51bnRlbi4iLCBiZWVuZGV0ZSBBenp1cm8gZGVuIFNhdHogZnVlciBVbG8gdW5kIHdhcmYgIGlociAgZWluZW4gIGRyb2hlbmRlbgorQmxpY2sgenUuIEt1cnogZW50c2NobG9zc2VuIGxhbmRldGUgV2xhZCBhdWYgIFVsb3MgIEtvcGYgIHVuZCAgaGllbHQgIGlociAgZGVuCitTY2huYWJlbCBtaXQgZGVuIEZsdWVnZWxuIHp1LgorCitWZXJ3aXJydCBzYWggUm9tZW8genUgVWxvIGhvY2gsIGRpZSAgc2ljaCAgaGVmdGlnICBnZWdlbiAgV2xhZAl3ZWhydGUuICAiRWluZQorRmxlZGVybWF1cyBob2NrdCBhdWYgZWluZXIgS3JhZWhlLiBEYXMgaXN0IHdvaGwgZWluIFZvcnplaWNoZW4uIiBFciBzY2h1bHRlcnRlCitQYXJpcyBMZWljaG5hbSB1bmQgZ2luZyB2b3JzaWNodGlnIGRpZSBTdHVmZW4gZGVyIEdydWZ0IGhpbnVudGVyLgorCitVbnRlbiBzYWggUm9tZW8gc2ljaCBzY2hhdWRlcm5kIHVtIHVuZCBsZWd0ZSBkYW5uIFBhcmlzIG5lYmVuIFR5YmFsdCAgYXVmICBkZW4KK1N0ZWluLiAiU28sIGpldHp0IGhhc3QgZHUgZWluZW4gUGxhdHosIGRlciAgZGlyICBhbmdlbWVzc2VuICBpc3QuICBEZW5uIGRpcmVrdAorbmViZW4gSnVsaWEgbGllZ2UgaWNoIC0gdW5kIG5pZW1hbmQgYW5kZXJzLiIgRXIgYmV1Z3RlIHNpY2ggdWViZXIgIEp1bGlhLiAgIkR1CitoYXN0IGphIG5vY2ggZ2FueiByb3RlIExpcHBlbi4iIEVyIGxhZWNoZWx0ZSB1bmQga3Vlc3N0ZSBzaWUuICJTY2hhZGUsIGRhc3MgZXMKK2tlaW4gTWFlcmNoZW4gaXN0LCBzb25zdCB3YWNodGVzdCBkdSAgamV0enQgIGF1Zi4iICBOYWNoZGVua2xpY2ggIHdvZyAgZXIgIGRpZQorUGhpb2xlIG1pdCBkZW0gR2lmdCBpbiBkZXIgSGFuZC4gIldvIGR1IGJpc3QsIHdpbGwgaWNoIGF1Y2ggaGluZ2VoZW4sICBKdWxpYS4iCitFciB0cmFuayB1bmQgc2VpbiBMYWVjaGVsbiB2ZXJ0aWVmdGUgc2ljaCwgYmV2b3IgIGVyICBsZWJsb3MgIGluICBKdWxpYXMgIEFybWUKK3NhbmsuCisKK0RyYXVzc2VuIHdhciBlcyBVbG8gZW5kbGljaCBnZWx1bmdlbiwgV2xhZCBoZXJ1bnRlcnp1c2NodWJzZW4uICJEdS4uLiwgZHUuLi4iCisKKyJKYT8iLCBmcmFndGUgV2xhZCBmcmV1bmRsaWNoLgorCisiRGVpbmV0d2VnZW4gaXN0Li4uIgorCisiU3RpbGwsIGRhIGtvbW10IEJydWRlciBMYXdyZW5jZS4iLCB1bnRlcmJyYWNoIEF6enVybyBkZW4gU3RyZWl0LgorCitMYXdyZW5jZSBiZXVndGUgc2ljaCBuYWNoZGVua2xpY2ggdWViZXIgZGFzIEJsdXQgdW5kIGRhcyBCcmVjaGVpc2VuIGFtCUJvZGVuLgorIldhcyBpc3QgZGVubiBoaWVyIHBhc3NpZXJ0PyIKKworIlJvbWVvIHdhciBoaWVyLiIsIGtsYWVydGUgQXp6dXJvIGlobiBhdWYuCisKKyJXYXI/IiBCcnVkZXIgTGF3cmVuY2Ugc2FoIGlobiBlbnRzZXR6dCBhbi4gIkljaCBoYXR0ZSBzY2hvbiAgZGVuICBnYW56ZW4gIFRhZworZWluIHVuZ3V0ZXMgR2VmdWVobC4iIEVyIHNldWZ6dGUuICJXZW5pZ3N0ZW5zIG11c3MgaWNoIGpldHp0IGRpZSAgR3J1ZnQgIG5pY2h0CittZWhyIGF1ZmJyZWNoZW4uIiBCZWh1dHNhbSBzdGllZyBlciBoaW51bnRlci4KKworTWl0IEdyYXVzZW4gbGllc3MgTGF3cmVuY2UgZGVuIEJsaWNrIHVlYmVyIGRpZSBMZWljaGVuIHNjaHdlaWZlbiwgZGFubiBibGlja3RlCitlciB6dSBBenp1cm8gYXVmLiAiV2llIGxhbmdlPyIsIGZyYWd0ZSBlciBsZWlzZS4KKworIlVuZ2VmYWVociBlaW5lIGhhbGJlIFN0dW5kZS4iCisKK0JydWRlciBMYXdyZW5jZSBmbHVjaHRlIHNvIGhlcnpoYWZ0LCBkYXNzIFdsYWQgZGFzIE1hdWwgIG9mZmVuCXN0ZWhlbglibGllYi4KKyJGdWVyIGVpbmVuIFByaWVzc3N0ZXIgaGF0IGVyIGVpbmVuIGludGVyZXNzc3NhbnRlbiBXb3J0c3NzYXRzc3MuIiwgbWVpbnRlIHNpZQorYmVpZmFlbGxpZy4KKworIkRhc3MgZHUgZGFzIGphIG5pY2h0IHBldHp0LiIgQnJ1ZGVyIExhd3JlbmNlIGRyb2h0ZSBpaHIgbWl0IGRlbSBGaW5nZXIuCisKKyJJY2g/IiBXbGFkIHZlcnN1Y2h0ZSwgdW5zY2h1bGRpZyBhdXN6dXNlaGVuLgorCitKdWxpYSBzdG9laG50ZSB1bmQga2xhcHB0ZSBtdWVoc2FtIGVpbiBBdWdlIGF1Zi4gIldvLi4uPyIgIFNpZSAgb2VmZm5ldGUgIGF1Y2gKK2RhcyBhbmRlcmUgQXVnZS4gIk9oLCBqYS4gRWluZSBHcnVmdC4gTWVpbmUgR3J1ZnQuIiBBbHMgIHNpZSAgc2ljaCAgYXVmc2V0enRlLAorZmllbCBpaHIgQmxpY2sgYXVmICBMYXdyZW5jZSwgIGRlciAgc2llICBtaXQgIHNjaHJlY2tnZXdlaXRldGVuICBBdWdlbglhbnNhaC4KKyJCcnVkZXIgTGF3cmVuY2UuIEd1dC4gV28gaXN0IFJvbWVvPyIKKworV29ydGxvcyBkZXV0ZXRlIExhd3JlbmNlIGF1ZiBkaWUgTGVpY2hlLiBFciByYWV1c3BlcnRlIHNpY2gsIGFscyAgSnVsaWEgIGVpbmVuCitTY2hyZWkgYXVzc3RpZXNzLiAiSnVsaWEsIHdpciBzb2xsdGVuIGhpZXIgdmVyc2Nod2luZGVuLiBJY2ggIGJyaW5nZSAgZGljaCAgaW4KK2VpbiBLbG9zdGVyLiIKKworIktsb3N0ZXI/IEljaCB3aWxsIGJlaSBSb21lbyBzZWluISIKKworIlNlaSB2ZXJudWVuZnRpZywgZGFzIGdlaHQgZG9jaCBuaWNodC4gRXIgaXN0IHRvdC4iCisKKyJEYW5uIHdpbGwgaWNoIGRhcyBhdWNoIHNlaW4uIiBTaWUgYmV0cmFjaHRldGUgZGllIFBoaW9sZSBpbiAgUm9tZW9zICBGaW5nZXJuLgorIkxlZXIuIER1IEdlaXpoYWxzLCB3aWUgc29sbCBpY2ggamV0enQgenUgZGlyIGtvbW1lbj8iCisKK1JvbWVvIHJlYWdpZXJ0ZSBuaWNodCBhdWYgaWhyZSBWb3J3dWVyZmUsIGRvY2ggZWluZSBkZXIgZHJlaSAgVGF1YmVuICBhdWYgIGRlcgorV29sa2UgdWViZXIgaWhuZW4gc2FoIHNlaHIgYmV0cnVlYnQgYXVzLgorCisiSnVsaWEuLi4iIEJydWRlciBMYXdyZW5jZSBmYXNzdGUgc2llIGFuIGRlciBTY2h1bHRlci4KKworIk5laW4uIiBKdWxpYSB6b2cgUm9tZW9zIERvbGNoICBhdXMgIGRlciAgU2NoZWlkZSwgIHdpbmt0ZSAgZGVuICBLcmFlaGVuLCAgZGVyCitGbGVkZXJtYXVzIHVuZCBCcnVkZXIgTGF3cmVuY2UgenUgdW5kIGVyc3RhY2ggc2ljaC4KKworIlNpZSBoYXQgZ2V3dW5rZW4uIiBVbG8gc2NobHVja3RlLgorCisiV2FydGUsIGJpcyB3aXIgc2llIGhpbnRlciBkZXIgQnVlaG5lIHNlaGVuLiBEYXMgZ2lidCBBZXJnZXIuIiwgbWVpbnRlIEF6enVyby4KKworIktBTk4gSUNIIEpFVFpUPyIKKworIkJlZGllbiBkaXNzcywgc3NzaWUgd2FydGVuIHNzc29uLiIKKworIkRBTktFLiIKKworQnJ1ZGVyIExhd3JlbmNlIGhvZXJ0ZSBlaW5lbiBXYWNobWFubiB1bmQgYmxpY2t0ZSBzaWNoIHdpbGQgdW0uICJJY2ggbXVzcyAgd2VnCitoaWVyLCBkYXMgaXN0IG1pciB1bmhlaW1saWNoLiIgRXIgcmFmZnRlIHNlaW5lIEt1dHRlIHp1c2FtbWVuIHVuZCBrbGV0dGVydGUgc28KK2dlc2Nod2luZCBhdXMgZGVyIEdydWZ0LCBkYXNzIFVsbyBhbmVya2VubmVuZCBwZmlmZi4KKworRGVyICBXYWNoaGF1cHRtYW5uICBrYW0gIHp1c2FtbWVuICBtaXQJUGFyaXMgIFBhZ2VuICBoZXJhYi4gICJXYXMgIGZ1ZXIgIGVpbmUKK1NjaGVpc3NlLiIgRXIgc2V1Znp0ZSB1bmQgZ2luZyB6dSBzZWluZW4gS29sbGVnZW4gbmFjaCBvYmVuLiAiRHVyY2hrYWVtbXQgIGRlbgorRnJpZWRob2YuIFVudGVuIGxpZWdlbiBkcmVpIExlaWNoZW4sIGFsbGUgbm9jaAl3YXJtLiAgRGVyICBUYWV0ZXIgIGthbm4gIG5vY2gKK25pY2h0IHdlaXQgc2Vpbi4iIEVyIGRldXRldGUgYXVmIGVpbmVuIEdlZnJlaXRlbi4gIkR1IGdlaHN0IHVuZCAgaG9sc3QgIEZ1ZXJzdAorRXNjYWx1cywgZGllIENhcHVsZXRzIHVuZCBkaWUgTW9udGFndWVzLiIKKworIldlciBzaW5kIGRpZSBMZWljaGVuPyIsIHdvbGx0ZSBzZWluIFNlcmdlYW50IHdpc3Nlbi4KKworIkdyYWYgUGFyaXMsIFJvbWVvIE1vbnRhZ3VlIHVuZCAtIGhhbHRldCBldWNoIGZlc3QgLSBKdWxpYSBDYXB1bGV0LiIKKworIkp1bGlhPyIgRGVyIFNlcmdlYW50IHJ1bnplbHRlIGRpZSBTdGlybi4gIldpZSBrYW5uIHNpZSBub2NoICB3YXJtICBzZWluPyAgSWNoCitkZW5rZSwgc2llIGlzdCBzY2hvbiBzZWl0IHp3ZWkgVGFnZW4gdG90PyIKKworIk5laW4sIGlzdCBzaWUgbmljaHQuIiwga3JhZWNoenRlIFVsby4KKworIlRqYS4iLCBtZWludGUgZGVyIEhhdXB0bWFubi4gIkRlbmt0ICB3YXMgIGlociAgd29sbHQsICBhYmVyICBkaWUgIEtyYWVoZSAgaGF0CitSZWNodC4iCisKK0VzY2FsdXMsIGRlciBzaWNoIHp3YXIJZGllICBBbXRzcm9iZSAgdWViZXIgIGRpZSAgU2NodWx0ZXJuICBnZXdvcmZlbgloYXR0ZSwKK2FsbGVyZGluZ3MgaW4gZGVyIEF1ZnJlZ3VuZyB2ZXJnZXNzZW4gaGF0dGUsIHNpY2ggYXVjaCBTY2h1aGUgYW56dXppZWhlbiwgc2FoCitzaWNoIHZlcndpcnJ0IHVtLiAiV29taXQgaGF0IGRpZSBLcmFlaGUgUmVjaHQ/IgorCisiSGllciBpbiBkZXIgR3J1ZnQgbGllZ2VuIGRyZWkgZnJpc2NoZSBMZWljaGVuOiBSb21lbywgSnVsaWEgdW5kICBQYXJpcy4iICBEZXIKK0hhdXB0bWFubiBuYWhtIEhhbHR1bmcgYW4uCisKK0ZyYXUgQ2FwdWxldCwgZGllIHNpY2ggZ2VyYWRlIGVpbmVuIFdlZyBkdXJjaCBkaWUgIHZlcnNhbW1lbHRlCU1lbmdlICBiYWhudGUsCitzY2hyaWUgYXVmLiAiTWVpbmUgSnVsaWEgc3RpcmJ0IHp3ZWltYWw/IgorCitBdWNoICBFc2NhbHVzICBrb25udGUgIGVzICBrYXVtICBnbGF1YmVuLiAgIkFsc28gIHZvbiAgQW5mYW5nLiAgV2VyICBoYXQgICB3ZW4KK2Vyc2NobGFnZW4/IgorCitCcnVkZXIgTGF3cmVuY2UsIGRlciB6d2lzY2hlbiB6d2VpIFdhY2htYWVubmVybiBoZXJhbmdlc2NobGVwcHQgd3VyZGUgd2llICBlaW4KK1NhY2sgV2Flc2NoZSwgenVwZnRlIHNpY2ggdmVybGVnZW4gYW4gZGVyIE5hc2UuICJJY2ggc29sbHRlICB3b2hsICBldHdhcyAgZGF6dQorc2FnZW4uIgorCisiVmVybXV0bGljaC4iIEZ1ZXJzdCBFc2NhbHVzIG5pY2t0ZSBkZW0gTW9lbmNoIHp1LiAiV2VubiBTaWUgZXMga29lbm5lbi4iCisKK0JydWRlciBMYXdyZW5jZSBzZXVmenRlLiAiSWNoIGdsYXViZSwgaWNoIGJpbiBhbiBhbGxlbSBzY2h1bGQuIEFsc286IFJvbWVvIHVuZAorSnVsaWEgaGFiZW4gYW0gRGllbnN0YWcgaGVpbWxpY2ggZ2VoZWlyYXRldC4iCisKK1Nvd29obCBkaWUgRmFtaWxpZSBDYXB1bGV0IGFscyBhdWNoIEhlcnIgTW9udGFndWUgc3RvZWhudGVuIGF1ZiAgdW5kICBibGlja3RlbgordW5nbGFldWJpZyBpbiBkaWUgUnVuZGUuCisKK0hlcnIgTW9udGFndWUgc2FoIEZ1ZXJzdCBFc2NhbHVzICBhdXMgIGdyb3NzZW4sICB0cmF1cmlnZW4gIEF1Z2VuICBhbi4JIk5pY2h0CitnZW51ZywgZGFzcyBtZWluZSBGcmF1IGhldXRlIGdlc3RvcmJlbiBpc3QsIHdlaWwgc2llIGVzIG5pY2h0IGVydHJhZ2VuIGtvbm50ZSwKK2Rhc3MgUm9tZW8gdmVyYmFubnQgaXN0LCBzdGlyYnQgamV0enQgYXVjaCBub2NoIG1laW4gU29obi4iCisKK1JvbWVvLCBkZXIgbmViZW4gSnVsaWEgYXVmICBkZXIgIHdlaWNoZW4gIFdvbGtlICBzYXNzICB1bmQgIGRpZSAgVGF1YmVuZ2VzdGFsdAorYWJnZWxlZ3QgaGF0dGUsIHVtIGFid2VzZW5kIFVsb3MgR2VmaWVkZXIgenUga3JhdWxlbiwgIGxhY2h0ZSAgYXVmLiAgIkRhcyAgaXN0CitzdGFya2VyIFRvYmFrIGZ1ZXIgc2llLiIKKworSnVsaWEgbGVndGUgaWhyZSBIYW5kIGF1ZiBzZWluZW4gQXJtLiAiRGFzIG1pdCBkZWluZXIgTXV0dGVyIHR1dCBtaXIgbGVpZC4iCisKK0xhd3JlbmNlIG5pY2t0ZSBkZW4gRWx0ZXJuIHp1LiAiRXMgc3RpbW10LiBVbmQgYW0gTW9udGFnIGhhdCBSb21lbyBhdWNoIFR5YmFsdAorZXJzdG9jaGVuLiBEZXNoYWxiIG11c3N0ZSBlciBub2NoIHZvciBTb25uZW5hdWZnYW5nIGFtIERpZW5zdGFnbW9yZ2VuIGF1cyAgZGVyCitTdGFkdCAgdmVyc2Nod2luZGVuLiAgSWNoICBuZWhtZSAgZG9jaAlzdGFyayAgYW4sICBkYXNzICBkaWUJRWhlICAgdHJvdHpkZW0KK3JlY2h0c2d1ZWx0aWcgaXN0LiBQb2xseSB3ZWlzcyBkYXMgc2ljaGVyIGJlc3NlciBhbHMgaWNoLiIKKworSnVsaWEga2ljaGVydGUgdW5kIHd1cmRlIHJvdC4KKworIldlaWwgSGVyciBDYXB1bGV0IGRhbm4gYW0gRGllbnN0YWcgSnVsaWEgbWl0IFBhcmlzIHZlcmxvYnQgaGF0LCBrYW0gSnVsaWEgIHp1CittaXIgdW5kIHdvbGx0ZSwgZGFzcyBpY2ggaWhyIGhlbGZlLiIgQnJ1ZGVyICBMYXdyZW5jZSAgenVja3RlICBkaWUgIFNjaHVsdGVybi4KKyJJY2ggd3Vzc3RlIG5pY2h0cyBiZXNzZXJlcywgYWxzIGlociBlaW4gU2NobGFmbWl0dGVsIHp1IGdlYmVuLCAgZGFzcyAgc2llICBhbQorTWl0dHdvY2hhYmVuZCBuZWhtZW4gc29sbHRlLCBkYW1pdCBhbGxlICBnbGF1YmVuLCAgc2llCWhhYmUgIHNpY2ggIHZlcmdpZnRldC4KK0dsZWljaHplaXRpZyBoYWJlIGljaCBlaW5lbiBNaXRicnVkZXIgbWl0ICBlaW5lbSAgQnJpZWYgIHp1ICBSb21lbyAgZ2VzY2hpY2t0LgorTGVpZGVyIGhhdCBIZXJyIENhcHVsZXQgZGFubiBEaWVuc3RhZyBiZXNjaGxvc3NlbiwgZGFzcyBkaWUgSG9jaHplaXQgIHp3aXNjaGVuCitKdWxpYSB1bmQgUGFyaXMgYmVyZWl0cyAgYW0gIE1pdHR3b2NoICBzdGF0dGZpbmRlbiAgc29sbCwgIHdlc2hhbGIgIEp1bGlhICBkYXMKK1NjaGxhZm1pdHRlbCAgc2Nob24gIGFtICBEaWVuc3RhZyAgbmFobS4gIEVpZ2VudGxpY2ggIGhhZXR0ZSAgZGllICBGcmlzdCAgbm9jaAorYXVzZ2VyZWljaHQsIHVtIFJvbWVvIHp1IHdhcm5lbiwgZGFzcyBKdWxpYSBsZWJ0LCBhYmVyIG1laW4gQnJ1ZGVyIGhhdCBtaXIgZGVuCitCcmllZiB6dXJ1ZWNrZ2VnZWJlbi4iIExhd3JlbmNlIHNldWZ6dGUuICJIZXV0ZSBhYmVuZCBrYW0gaWNoIGhlciwgIGRhbWl0ICBpY2gKK0p1bGlhIGF1cyBkZXIgR3J1ZnQgaG9sZW4ga29ubnRlIHVuZCBmYW5kIFJvbWVvIHVuZCBQYXJpcyBiZXJlaXRzIHRvdCB2b3IuIgorCitFc2NhbHVzIG5pY2t0ZSBiZWRhZWNodGlnLiAiR3V0LiBPZGVyIHZpZWxtZWhyLCBuaWNodCBndXQuIFdlciBrYW5uIG1pciBzYWdlbiwKK3dpZSBQYXJpcyBoaWVyIGhpbiBrYW0/IgorCitQYXJpcyBQYWdlIHRyYXQgdm9yLiAiSWNoIGhhYmUgaWhuIGJlZ2xlaXRldCwgd2VpbCBlciBoaWVyIEJsdW1lbiAgYXVmICBKdWxpYXMKK0dyYWIgc3RyZXVlbiB3b2xsdGUuIgorCisiRGFiZWkgaGF0IFJvbWVvIGlobiB1bnRlcmJyb2NoZW4uIiwgIGZ1ZWd0ZSAgQmFsdGhhc2FyICBoaW56dS4gICJBbHMgIGljaCAgYW0KK0Rvbm5lcnN0YWcgaGllciB3YXIsIHVtIGZ1ZXIgUm9tZW8gTmV1aWdrZWl0ZW4genUgIGVyZmFocmVuLCAgaG9lcnRlICBpY2ggIHZvbgorSnVsaWFzIFRvZC4gSWNoIHJpdHQgYWxzbyBuYWNoIE1hbnR1YSB6dXJ1ZWNrIHVuZCBSb21lbywgbmVobWUgaWNoIGFuLAlrYXVmdGUKK3NpY2ggZGEgZWluIEdpZnQuIERhbm4ga2FtZW4gd2lyIGhpZXJoZXIsIHdvYmVpICBSb21lbwltaWNoICBnbGF1YmVuICBtYWNodGUsCitkYXNzIGVyIG51ciBKdWxpYSBkaWUgbGV0enRlIEVocmUgZXJ3ZWlzZW4gd29sbHRlLiBFciBzY2hpY2t0ZSBtaWNoIHdlZywgIGFiZXIKK2ljaCBzYWggbm9jaCwgZGFzcyBlciB1bmQgUGFyaXMgYW5laW5hbmRlcmdlcmlldGVuLiBFaW5lbiBCcmllZiAgaGF0ICBlciAgbm9jaAorZ2VzY2hyaWViZW4uIiBFciByZWljaHRlIEVzY2FsdXMgZGVuIFVtc2NobGFnLgorCisiQmlzdCBkZXIgYmVzc2VyZSBGZWNodGVyLiIgUGFyaXMga2xvcGZ0ZSBSb21lbyBhdWYgZGllIFNjaHVsdGVyLgorCisiV2lyIGhhYmVuIGVpbmUgRXdpZ2tlaXQgWmVpdCwgZGVpbmVuIFN0aWwgenUgdmVyYmVzc2Vybi4iLCBhbnR3b3J0ZXRlIFJvbWVvLgorCitFc2NhbHVzIGxhcyBkYXMgU2NocmVpYmVuIHVuZCBuaWNrdGUgd2llZGVyLiAiRGFzIGlzdCBlaW4gIEFic2NoaWVkc2JyaWVmLCAgaW4KK2RlbSBSb21lbyBzZWxic3Qgc2NocmVpYnQsIGRhc3MgZXIgbWl0IEp1bGlhIHZlcmhlaXJhdGV0IHdhci4iCisKK0hlcnIgTW9udGFndWUgc3RyZWNrdGUgaW1wdWxzaXYgc2VpbmUgSGFuZCBuYWNoIEhlcnJuIENhcHVsZXQgYXVzLiAgIlZlcmRhbW10ZQorU2NoZWlzc2UsIHdpZT8iCisKKyJKYSwgZGFzICBhdWNoLiIgIE1pc3N0cmF1aXNjaCAgYmxpY2t0ZSAgSGVyciAgQ2FwdWxldCAgYXVmICBkaWUgIEhhbmQgIHNlaW5lcworRXJ6ZmVpbmRlcywgIGVudGRlY2t0ZQlrZWluICBNZXNzZXIgIHVuZCAgc2NobG9zcyAgaWhuICBkYW5uICBpbiAgZGllCSBBcm1lLgorIlZlcnNvZWhuZW4gd2lyIHVucz8iCisKK05vY2ggZWhlIEhlcnIgTW9udGFndWUgYW50d29ydGVuIGtvbm50ZSwgaG9iIEVzY2FsdXMgZGllICBIYW5kLiAgIlVuZCAgb2IgIGlocgorZXVjaCB2ZXJzb2VobnQuIEFuc29uc3RlbiBzdGVja2UgaWNoIGV1Y2ggYmVpZGUgaW4gZWluZW4gU2FjayB1bmQgc2NobGFnZSAgbWl0CitlaW5lbSBLbnVlcHBlbCBkcmF1Zi4iCisKKyJUcmFlZmUgbmljaHQgZGllIFZlcmtlaHJ0ZW4uIiwgc3RpbW10ZSBpaG0gSGVyciBNb250YWd1ZSB6dS4KKworIkRhcyBoYWV0dGUgRXNjYWx1cyBsaWViZXIgZ2xlaWNoIHR1biBzb2xsZW4uIiwgbWF1bHRlIFVsby4KKworIkhhdXB0c2FjaGUsIGVzIGlzdCBlbmRsaWNoIFJ1aGUuIiBBenp1cm8gc2NobWllZ3RlIHNpY2ggYW4gIEp1bGlhICB1bmQgIGxpZXNzCitzaWNoIHZvbiBkaWVzZXIga3JhdWxlbi4KKworIkphd29obC4iIEp1bGlhIGxhZWNoZWx0ZS4gIkZyaWVkZW4gYXVmIEVyZGVuIHVuZCBkYXMgSGltbWVscmVpY2ggIGZ1ZXIgIFJvbWVvCit1bmQgbWljaC4iCisKZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvcm9tX2p1bC9zZWl0ZTI4IGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9yb21fanVsL3NlaXRlMjgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBhZWVhZQotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvcm9tX2p1bC9zZWl0ZTI4CkBAIC0wLDAgKzEsMTYgQEAKK0VQSUxPRworCitIaWVyIHZlcmxhc3NlbiB3aXIgbnVuIFZlcm9uYSwgZGFzIHNpY2ggd2llIGplZGUgYW5kZXJlIGFuc3RhZW5kaWdlIFN0YWR0ICBudW4KK251ciBub2NoIG1pdCBlaW5lbSBncm9zc2VuIEJ1Y2hzdGFiZW4gc2NocmVpYnQsIGJpcyB3aXIgIHVucyAgd2llZGVyc2VoZW4sICB1bQorZGllIEdlc2NoaWNodGUgbm9jaCBlaW5tYWwgenUgZXJsZWJlbi4KKworSWNoIGhvZmZlLCBTaWUsIGxpZWJlIExlc2VyaW4sIGxpZWJlciBMZXNlciwgbmVobWVuICBkZW4gIFR1cnRlbGtyYWVoZW4gIGlocmVuCitWb3J3aXR6IG5pY2h0IHVlYmVsLCBkZW5uIGRpZSBHb2V0dGVyIGRlciBNeXRoZW53ZWx0IGhhYmVuIGJlc2NobG9zc2VuLCAgdWViZXIKK2locmUgVmVyZmVobHVuZ2VuIGhpbndlZ3p1c2VoZW4uIEFsc28gd29sbGVuIHdpciBuaWNodCBrbGVpbmxpY2hlciBzZWluLgorCitFcyBibGVpYnQgbm9jaCBoaW56dXp1ZnVlZ2VuLCBkYXNzIHNpZSwgbnVuLCBkYSBzaWUgZ2VzdG9yYmVuIHNpbmQsIGJpcyB6dSBkZW0KK1RhZyBpbSBGZXJpZW5wYXJhZGllcyBkZXIgTXl0aGVuIGlocmUgIEZsaXR0ZXJ3b2NoZW4gIHZlcmxlYmVuLCAgYmlzICBzaWUgIGRhcworbmFlY2hzdGUgTWFsIGdlYnJhdWNodCB3ZXJkZW4uCisKK0F1ZiBXaWVkZXJzZWhlbi4KKwpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9yb21fanVsL3NlaXRlMyBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvcm9tX2p1bC9zZWl0ZTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIzOTQ0NgotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvcm9tX2p1bC9zZWl0ZTMKQEAgLTAsMCArMSwxMDIzIEBACitERVIgRVJTVEUgQUtUCisJICBESUUgRVJTVEUgU1pFTkUKK0FuIGRpZXNlciBTdGVsbGUgc29sbHRlIGVpZ2VudGxpY2ggZWluIENob3IgYXVmdHJldGVuLCBkZW5uIHNvIGdlaG9lcnQgZXMgc2ljaAorZnVlciBlaW5lIFRyYWdvZWRpZSwgZG9jaCBpbSBadWdlIGRlciAgYWxsZ2VtZWluZW4gIFNwYXJtYXNzbmFobWVuICB3dXJkZSAgZGVyCitDaG9yIGdlc3RyaWNoZW4gdW5kIFVsbyB1bmQgIEF6enVybyAgYmVrYW1lbiAgenVzYWV0emxpY2ggIHp1ICBpaHJlciAgbm9ybWFsZW4KK0F1ZmdhYmUgZGllIFBmbGljaHQgYXVmZ2VidWVyZGV0LCBTaWUsIHZlcmVocnRlIExlc2VySW5uZW4sIHVlYmVyIGRpZSAgamV3ZWlscworYWt0dWVsbGUgTGFnZSBhdWYgZGVtIExhdWZlbmRlbiB6dSAgaGFsdGVuLCAgZnVlciAgZGVuCUZhbGwsICBkYXNzICBTaWUgIGVpbmUKK1p1c2FtbWVuZmFzc3VuZyBvZGVyIGVpbmVuIEtvbW1lbnRhciAgd3VlbnNjaGVuLiAgQXVjaAl3ZW5uICBTaWUgIGRpZXMgIG5pY2h0Cit3b2xsZW4sIHdlcmRlbiBkaWUgYmVpZGVuIFNpZSBpbmZvcm1pZXJlbiwgZGVubiBkYWZ1ZXIgd2VyZGVuIHNpZSBzY2hsaWVzc2xpY2gKK2JlemFobHQuCisKK1VsbyBob2x0ZSB0aWVmIEx1ZnQgdW5kIHNldHp0ZSBzaWNoIGluIFBvc2l0dXIuICJUd28gaG91c2Vob2xkcywgYm90aCBhbGlrZSBpbgorZGlnbml0eSwgaW4gZmFpciBWZXJvbmEsIHdoZXJlIHdlIGxheSBvdXIgc2NlbmUuLi4iCisKKyJBY2gsIHNlaSBydWhpZy4iIGtudXJydGUgQXp6dXJvLgorCisiV2FzIGRlbm4sIHdhcyBkZW5uPyBTb25zdCBzdGVoc3QgZHUgZG9jaCBhdWYgZGllIEtsYXNzaWtlcj8iICBVbG8gIG1vY2h0ZSAgZXMKK2dhciBuaWNodCwgbWl0dGVuIGluIGVpbmVtIFppdGF0IHVudGVyYnJvY2hlbiB6dSB3ZXJkZW4uCisKKyJEZW5rIGRvY2ggbWFsIGFuIGRpZSBMZXNlciEiCisKKyJVbmQgTGVzZXJpbm5lbi4iCisKKyJKYSwgZGllIGF1Y2guIFNpZSB3b2xsZW4gZG9jaCBuaWNodCBlaW4gZW5nbGlzY2hlcyBaaXRhdCBsZXNlbi4iCisKKyJXb2hlciB3ZWlzc3QgZHUgZGFzPyIKKworQml0dGUgc3RlbGxlbiBTaWUgc2ljaCB2b3IsIGxpZWJlIExlc2VyaW4sIGxpZWJlciBMZXNlciwgZGFzcyBTaWUgIGltICBUaGVhdGVyCitzaXR6ZW4gdW5kIHNpY2ggVWxvIG51biBhbiBTaWUgd2VuZGV0LiAiU2FnZW4gU2llIG1pciwgd2FzIFNpZSBob2VyZW4gIHdvbGxlbi4KK0phamEsIGF1Y2ggU2llLCBkYWhpbnRlbiBpbiBkZXIgdmllcnppZ3N0ZW4gUmVpaGUgUGFya2V0dCwgZ2FueiBsaW5rcy4iCisKK051biwgaWNoIGdlaGUgZGF2b24gYXVzLCBkYXNzIFNpZSwgYXVjaCBkZXIgSGVyciBnYW56IGxpbmtzIGluIGRlciB2aWVyemlnc3RlbgorUmVpaGUgUGFya2V0dCwgbWl0IFNoYWtlc3BlYXJlIHZlcnRyYXV0IHNpbmQuICBEYWhlciAgZXJzcGFyZSAgaWNoICBpaG5lbiAgZGFzCitaaXRhdCB1bmQgZmFzc2UgZGVuIEluaGFsdCBrdXJ6IHp1c2FtbWVuLiBHZXJhZGUgc3RvZXNzdCBtaWNoICBBenp1cm8gIGFuICB1bmQKK3ZlcndlaXN0IGF1ZiBkaWUgR2V3ZXJrc2NoYWZ0LiBTaWUgZW50c2NodWxkaWdlbiBtaWNoICBiaXR0ZSwgIGljaCAgdWViZXJsYXNzZQorZGllIFp1c2FtbWVuZmFzc3VuZyB1bnNlcmVuIGJlaWRlbiBUdXJ0ZWxrcmFlaGVuLgorCisiRHUgb2RlciBpY2g/IiBVbG8gaXN0IHdlaWJsaWNoZW4gR2VzY2hsZWNodHMgdW5kIGltbWVyICBiZXJlaXQsICBBenp1cm8gIGVpbmUKK3VuYW5nZW5laG1lIEF1ZmdhYmUgenUgdWViZXJsYXNzZW4uCisKKyJFZ2FsLiIKKworIkRhbm4gZHUuIiBNZWlzdGVucyBoYXQgVWxvIEVyZm9sZyBtaXQgaWhyZXIgVGFrdGlrLgorCisiT0suIFdpciBmaW5kZW4gdW5zIGluIFZlcm9uYSB3aWVkZXIsIFplaXQgIGlyZ2VuZHdhbm4uICBad2VpICBGYW1pbGllbiAgbGViZW4KK2hpZXIuIgorCisiRXMgc2luZCBiZXN0aW1tdCBub2NoIG1laHIuIgorCisiRGFzIGlzdCBkb2NoIG5pY2h0IHdpY2h0aWcsIG9kZXI/ICBFcyAgZ2VodCAgbnVyICB1bSAgZGllICBDYXB1bGV0cyAgdW5kICBkaWUKK01vbnRhZ3Vlcy4iCisKKyJXaXJrbGljaD8iCisKKyJOZWluLCBuaWNodCB3aXJrbGljaCwgYWJlciBkaWUgYmVpZGVuIHNpbmQgZGllICB3aWNodGlnc3RlbiwgIGRlbm4gIHNpZSAgc2luZAorc2NodWxkIGRhcmFuLCBkYXNzIHNpY2ggZGllIGdhbnplIFN0YWR0IGluICB6d2VpICBmZWluZGxpY2hlICBMYWdlciAgZ2VzcGFsdGVuCitoYXQuIgorCisiRGFzIGlzdCBkb2NoIFVuc2lubi4gU2NodWxkIGRhcmFuIGlzdCBuaWVtYW5kIGFuZGVyZXIgYWxzIGRlciBBdXRvci4iCisKKyJVbG8hIgorCisiU2Nob24gZ3V0LiIKKworQXp6dXJvIHN0cmljaCBtaXQgZGVtIFNjaG5hYmVsCXVlYmVyICBkYXMgIEdlZmllZGVyLiAgIkF1cyAgaXJnZW5kZWluZW0gIGxhbmcKK3Zlcmdlc3NlbmVtIEdydW5kZSBsaWVnZW4gZGllIGJlaWRlbiBGYW1pbGllbiBpbiAgRmVoZGUgIG1pdGVpbmFuZGVyICB1bmQgIGRpZQoranVuZ2VuIExldXRlIGVpbmVyIGplZGVuIEdlbmVyYXRpb24gZmluZGVuIGltbWVyIHdpZWRlciBkaWUgTW9lZ2xpY2hrZWl0LCAgZGllCitGZWhkZSBuaWNodCBpbiBWZXJnZXNzZW5oZWl0IGdlcmF0ZW4genUgbGFzc2VuLiAgSW0gIExhdWZlICBkZXIgIHZlcnNjaGllZGVuZW4KK0hvY2h6ZWl0ZW4sIEdlYnVydGVuIHVuZCBUYXVmZW4gaGFiZW4gc2ljaCBhbGxlIEJld29obmVyIFZlcm9uYXMgaW4gaXJnZW5kZWluZQorQmV6aWVodW5nIHp1ZWluYW5kZXIgZ2VzZXR6dCB1bmQgZGEgZGllIENhcHVsZXRzIHVuZCBkaWUgTW9udGFndWVzIGRpZQliZWlkZW4KK2FlbHRlc3RlbiBGYW1pbGllbiBzaW5kLCBoYWJlbiBhbGxlIEJ1ZXJnZXIgYXVjaCBlaW5lIEJlemllaHVuZyB6dSAgZGVyICBlaW5lbgorb2RlciBhbmRlcmVuIEZhbWlsaWUuIFNlaSBlcywgZGFzcyBPbmtlbCBBZGFsYmVydCBkZXIgVmF0ZXIgZGVyIEZyYXUgd2FyLCAgZGllCitkZXIganVuZ2UgTW9udGFndWUgdm9yIHp3YW56aWcgSmFocmVuIGlucyBVbmdsdWVjayBnZXN0dWVyenQgaGF0LCB3ZWlsIGVyICBpaHIKK2RpZSBSb3NlbiBuaWNodCBnZWdlYmVuIGhhdCwgZGllIGRvY2ggZGVyIEJydWRlciAgZGVzICBDb3VzaW5zCXNlaW5lcwliZXN0ZW4KK0ZyZXVuZGVzIGlobSBhdXNkcnVlY2tsaWNoIGZ1ZXIgZGllc2UgRnJhdSB1ZWJlcmdlYmVuIGhhdHRlLiIKKworIkR1IHNjaHdlaWZzdCBhYi4iLCB0YWRlbHRlIFVsby4KKworIkFiZXIgd2llIHNvbGwgaWNoIGVzIGRlbm4gc29uc3QgZXJrbGFlcmVuPyIKKworIklzdCBkb2NoIGVpbmZhY2g6IFZlcm9uYSBpc3QgZWluIERvcmYuIgorCisiT2guIgorCitUcml1bXBoaWVyZW5kIGJsaWNrdGUgVWxvIGF1ZiBpaHJlbiBHZWZhZWhydGVuLiAiVW5kIGVpbiBEb3JmIGlzdCBlaW4gRG9yZiBpc3QKK2VpbiBEb3JmIGlzdCBlaW4gRG9yZi4iCisKKyJBbHNvIGd1dC4gVmVyb25hIGlzdCBlaW4gRG9yZiwgZGFzIGluIHp3ZWkgVGVpbGUgIGdlc3BhbHRlbiAgaXN0LiAgSmVkZXIgIGhhdAorZWluZW4gR3JvbGwgZ2VnZW4gamVkZW4gYW5kZXJlbi4iCisKKyJVbmQgamVkRSBoYXQgZWluZW4gR3JvbGwgZ2VnZW4gamVkRSBhbmRlcmUuIiAgVWxvICBoYXR0ZSAgZGllICBiZW1lcmtlbnN3ZXJ0ZQorRmFlaGlna2VpdCwgR3Jvc3NidWNoc3RhYmVuIGF1c3p1c3ByZWNoZW4uCisKKyJKYS4iIEF6enVybyBzZXVmenRlLiAiV2llIGF1Y2ggaW1tZXIuIERpZSBiZWlkZW4gRmFtaWxpZW4gIGhhYmVuICBqZWRlICBlaW5lbgorU3Byb2Vzc2xpbmcuIFJvbWVvIE1vbnRhZ3VlIGlzdCBlaW4gaHVlYnNjaGVyIEJlbmdlbCB2b24gYWNodHplaG4gSmFocmVuLCAgZGVyCitlaW5lcyBUYWdlcyBkYXMgR2VsZCB1bmQgZGllIEZlaGRlIHZvbiBzZWluZW0gVmF0ZXIgIGVyYmVuICB3aXJkLiAgSnVsaWEsICBkaWUKK2VpbnppZ2UgVG9jaHRlciBkZXMgSGF1c2VzIENhcHVsZXQsIHdpcmQgZWlubWFsIGJpbGRodWVic2NoLCB3ZW5uIG1hbiBzaWUgbm9jaAorZWluIHBhYXIgSmFocmUgYXVmIGRpZSBXZWlkZSBzY2hpY2t0LiIKKworIldpZSBrYW5uc3QgZHUgZGFzIHNhZ2VuPyIKKworIkhlLCBzaWUgaXN0IGVyc3QgZHJlaXplaG4hIgorCisiQWx0IGdlbnVnLCB1bSBkZW1uYWVjaHN0IHZlcmhlaXJhdGV0IHp1IHdlcmRlbi4gVW5kICBiZXJlaXRzICBqZXR6dCAgc2Nob2VuZXIKK2FscyBIZWxlbmEuIgorCisiV2FzIGhhdCBIZWxlbmEgZGFtaXQgenUgdHVuPyIgQXp6dXJvIGR1Y2t0ZSBzaWNoIHNpY2hlcmhlaXRzaGFsYmVyLgorCisiSGVsZW5hIHZvbiBUcm9qYS4iCisKKyJBY2ggc28sIGRpZS4gSmFqYSwgbWVpbmV0d2VnZW4gaXN0IHNpZSBzY2hvZW5lciBhbHMgSGVsZW5hLiIKKworIkFuIHdlbiBkYWNodGVzdCBkdSBkZW5uPyIsIHZlcmxhbmd0ZSBVbG8genUgd2lzc2VuLgorCitfU2llXyBfaGF0XyBfc2Nob25fIF93aWVkZXJfIF9kaWVzZW5fIF9Ub25mYWxsXywgIGRhY2h0ZSAgQXp6dXJvLiAgIk5pZW1hbmRlbiwKK3NlbGJzdHZlcnN0YWVuZGxpY2guIEF1c3NlciBkaXIgc2VoZSBpY2ggZG9jaCAga2VpbmUgIEZyYXUgIGFuLCAgTGllYnN0ZSwgIGRhcword2Vpc3N0IGR1IGRvY2guIgorCisiSXN0IGF1Y2ggYmVzc2VyIHNvLiIKKworWndlaSBNYWVubmVyIGJldHJhdGVuIGRlbiBQbGF0eiB1bmQgQXp6dXJvIGRldXRldGUgbWl0IGRlbSAgU2NobmFiZWwgIGF1ZiAgZGllCitiZWlkZW4uCisKKyJEYS4gU2Ftc29uIHVuZCBHcmVnb3J5LiIKKworIldhcyBpc3QgbWl0IGlobmVuPyIKKworIkdsZWljaCB3ZXJkZW4gc2llIG1pdCBpaHJlbiBTYWViZWxuIHJhc3NlbG4gdW5kLi4uIgorCisiU2NodCEiCisKK1ZlcmxlZ2VuIGJsaWNrdGUgQXp6dXJvIGF1ZiBkaWUgRnJhdSwgZGllIHNpY2ggZ2VyYWRlIHVlYmVyIGRlbiBCcnVubmVuIGJldWd0ZQordW5kIFdhc3NlciBzY2hvZXBmdGUuICJVcHMuIgorCisiRHUgd2Vpc3N0LCBkYXNzIF9zaWVfIHVucyBuaWNodCBob2VyZW4gZHVlcmZlbi4iCisKKyJKYS4iLCBhbnR3b3J0ZXRlIEF6enVybyBrbGVpbmxhdXQuICJJY2ggd2Vpc3MuIgorCitIaWVyIHVudGVyYnJlY2hlIGljaCBub2NoIGVpbm1hbCAgZGVuICBMYXVmICBkZXIgIEhhbmRsdW5nLCAgdW0gIElobmVuLCAgbGllYmUKK0xlc2VyaW4sIGxpZWJlciBMZXNlciwgenUgZXJrbGFlcmVuLCB3YXMgVHVydGVsa3JhZWhlbiBudW4gZWlnZW50bGljaCBzaW5kLgorCitUdXJ0ZWxrcmFlaGVuLCB3aWUgZGVyIE5hbWUgdmVybXV0ZW4gbGFlc3N0LCB0cmV0ZW4gaW1tZXIgcGFhcndlaXNlICBhdWYuICBFaW4KK01hZW5uY2hlbiwgaW4gdW5zZXJlbSBGYWxsICBBenp1cm8sICB1bmQgIGVpbiAgV2VpYmNoZW4sICBVbG8sCXdpZSAgU2llICBzaWNoCitiZXN0aW1tdCBzY2hvbiBnZWRhY2h0IGhhYmVuLiBXYXMgU2llIG5pY2h0ICB3aXNzZW4gIGtvZW5uZW4sICBpc3QsICBkYXNzICBkaWUKK1R1cnRlbGtyYWVoZW4gZWluIEdlc2NoZW5rIGRlciBHb2V0dGVyIHNpbmQsIHVuZCAgc29taXQgIGtlaW5lc3dlZ3MgIGRhcywgIHdhcworc2ljaCBlaW4gbm9ybWFsZXIgTWVuc2NoIHd1ZW5zY2hlbiB3dWVyZGUuIFNpZSBnZWhvZXJlbiB6dSAgamVkZXIgIEdlc2NoaWNodGUsCitpbiBkZXIgTGllYmVuZGUgYXVmdGF1Y2hlbi4gRnJhZ2VuIFNpZSBtaWNoIG5pY2h0LCB3YXJ1bSwgZGVubiBkYXMgIGhhYmVuICBkaWUKK0dvZXR0ZXIgdmVyZ2Vzc2VuIHp1IGVyd2FlaG5lbi4gRGllIEF1ZmdhYmUgIGRlciAgVHVydGVsa3JhZWhlbiAgaXN0ICBlcywgIGRpZQorR2VzY2hpY2h0ZSB6dSB2ZXJmb2xnZW4gdW5kIGRlbiBHb2V0dGVybiBkZXIgU2FnZW53ZWx0IEJlcmljaHQJenUgIGVyc3RhdHRlbi4KK0F1Y2ggZGllcyBpc3QgZWluZSBGdW5rdGlvbiwgZGllIHZvbiBkZW4gR29ldHRlcm4gdW5lcmtsYWVydCBibGllYiwgIGRvY2ggIGljaAord2FnZSBkaWUgVmVybXV0dW5nLCBkYXNzIEdvZXR0ZXIgendhciBhbGx3aXNzZW5kIHNpbmQsIGFiZXIgZGVubm9jaCAgbnVyICB6d2VpCitBdWdlbiBoYWJlbiwgZGllIG5vY2ggZGF6dSBuaWNodCB1bmFiaGFlbmdpZyB2b25laW5hbmRlciBmdW5rdGlvbmllcmVuLiAgT2RlciwKK3VtIGVzIGFuZGVycyBhdXN6dWRydWVja2VuLCBkaWUgR29ldHRlciBzaW5kIHdpZSBLYXVmaGF1c2RldGVrdGl2ZSwgaGFiZW4gaWhyZQorQXVnZW4gaW1tZXIgbnVyIGF1ZiBlaW5lbSBCZW5nZWwgaW4gemVyc2NobGlzc2VuZW4gSmVhbnMgdW5kIGhhYmVuICBkYWhlciAgZGllCitUdXJ0ZWxrcmFlaGVuIGFscyBlaW5lIEFydCBWaWRlb3VlYmVyd2FjaHVuZyBpbnN0YWxsaWVydC4gR2VzY2hpY2h0ZW4gc2luZCB3aWUKK2RhcyBFbmRsb3NiYW5kIGVpbmVyIHRlbGVmb25pc2NoZW4gV2FydGVzY2hsZWlmZS4gS2VubmVuIFNpZSBkYXM/ICBTaWUJd2FydGVuCitkYXJhdWYsICBlbmRsaWNoICBlaW5lCVZlcmJpbmR1bmcgIHp1CWJla29tbWVuICB1bmQgIGhvZXJlbiAgc2ljaCAgIHNjaGxlY2h0CitpbnRlcnByZXRpZXJ0ZSBNdXNpayBpbiBub2NoIHNjaGxlY2h0ZXJlciBRdWFsaXRhZXQgYW4sIGRpZSBpbW1lciAgd2llZGVyICB2b24KK2VpbmVyIG1laHIgb2RlciBtaW5kZXIgZnJldW5kbGljaGVuICBTdGltbWUgIG1pdCAgX0JpdHRlXyAgX3dhcnRlbl8sICBfcGxlYXNlXworX2hvbGRfCV90aGVfICBfbGluZV8gIHVudGVyYnJvY2hlbiAgd2lyZC4gIERpZSAgVW50ZXJicmVjaHVuZwlpc3QgIG5vY2ggIGRhcworYW5nZW5laG1zdGUgYW0gZ2FuemVuIEJhbmQuIFdhbm4gaW1tZXIgZGllc2UgUGF1c2Uga29tbXQsIGRpZSAgYW5kZXV0ZXQsICBkYXNzCitkYXMgQmFuZCBudW4gZWluIEVuZGUgZXJyZWljaHQgaGF0LCBzdGVpZ3QgSWhyZSAgU3Bhbm51bmcgIHVuZAlTaWUgIGVyd2FydGVuLAorZ2xlaWNoIGVpbmUgdmllbGxlaWNodCBuaWNodCBnYW56ICBzbyAgZnJldW5kbGljaGUsICBkYWZ1ZXIgIGFiZXIgIG1lbnNjaGxpY2hlCitTdGltbWUgenUgaG9lcmVuLCBkb2NoIGluIFdhaHJoZWl0IHNwdWx0IHNpY2ggZGFzIEJhbmQJbnVyICB6dXJ1ZWNrLCAgdW0gIGRlbQorQW5ydWZlciBkaWUgTGFuZ2V3ZWlsZSB6dSB2ZXJrdWVyemVuLiBGYWxscyBTaWUgc2ljaCBmcmFnZW4sICB3YXJ1bSAgZGFzICBCYW5kCitkYW5uIGVuZGxvcyBpc3QsIHdlcmRlbiBTaWUgd2VpdGVyIHJhdGxvcyBibGVpYmVuIG11ZXNzZW4sIGRlbm4gZGFyYXVmCXdpc3Nlbgorc2VsYnN0IGRpZSBHb2V0dGVyIGtlaW5lIEFudHdvcnQuIEJla2FubnRlcm1hc3NlbiBoYXR0ZW4gZGllICBHb2V0dGVyICBvaG5laGluCituaWNodCB2aWVsIGRhbWl0IHp1IHR1biwgZGllIFdhcnRlc2NobGVpZmUgenUgIGVyZmluZGVuLCAgZGllc2VzICB6d2VpZmVsaGFmdGUKK1ZlcmRpZW5zdCBpc3QgZGFzIGRlciBIb2VsbGUuIERhbWl0IHNvbGwgSWhuZW4gYXVjaCBudXIgbmFoZSBnZWJyYWNodCAgd2VyZGVuLAorZGFzcyBlaW5lIEdlc2NoaWNodGUgZW5kbG9zIHdlaXRlcmdlaHQsIGF1Y2gsIHdlbm4gc2llCWlociAgc2NoZWluYmFyZXMgIEVuZGUKK2VycmVpY2h0IGhhdC4gU29iYWxkIGRlciBlaW5lICBNZW5zY2ggIGRpZSAgV2FydGVzY2hsZWlmZSAgdmVybGFlc3N0ICB1bmQgIGRlcgorbmFlY2hzdGUgdm9tIEJlc2V0enR6ZWljaGVuIGRlciAgTGFuZ2V3ZWlsZSAgenVyICBLdXJ6d2VpbCAgZGVyICBXYXJ0ZXNjaGxlaWZlCit2b3JydWVja3QsIGJlZ2lubnQgZGllIEdlc2NoaWNodGUgdm9uIHZvcm5lLgorCitTbyBlcmtsYWVydCBzaWNoLCBkYXNzIFVsbyB1bmQgQXp6dXJvIHJlaWNobGljaCBaZWl0ICBoYXR0ZW4sICBkaWUgIEdlc2NoaWNodGUKK2tlbm5lbnp1bGVybmVuLiBXYWVocmVuZCBzaWUgZnVlciBkaWUgQWt0ZXVyZSB1bnNlcmVzICBEcmFtYXMgIGplZGVzICBNYWwgIG5ldQoraXN0LCBrZW5uZW4gZGllIFR1cnRlbGtyYWVoZW4gc2llIGF1c3dlbmRpZy4gV2FydW0gc2llIGRhbm4gdHJvdHpkZW0gd2VpdGVyaGluCitkZW4gRm9ydGdhbmcgYmVvYmFjaHRlbiBtdWVzc2VuLCBibGVpYnQgdW5rbGFyLCBvYndvaGwgZXMgdmVybXV0bGljaCAgbWl0ICBkZXIKK0dld2Vya3NjaGFmdCB6dXNhbW1lbmhhZW5ndC4KKworVWxvIHVuZCBBenp1cm8gc2l0emVuIGF1ZiBkZW0gQnJ1bm5lbiB1bmQgYmV0cmFjaHRlbiBkaWUgVHJhZ29lZGllLCAgZGllICBzaWNoCit2b3IgIGlocmVuICBBdWdlbiAgYWJzcHVsdCwgIHdpZSAgZWluICBhbHRlcyAgRWhlcGFhciAgZGllICBmdWVuZnVuZHp3YW56aWdzdGUKK1dpZWRlcmhvbHVuZyB2b24gVm9tIFdpbmRlIFZlcndlaHQgYW5zY2hhdXQ6IEplZGVyICh1bmQgamVkZSkgd2Vpc3MsIHdhbm4gIGRlcgorKG9kZXIgZGllKSBhbmRlcmUgVGFzY2hlbnR1ZWNoZXIgYmVub2V0aWd0IHVuZCB3YW5uIGVyIChvZGVyICBzaWUpICBkZW0gIChvZGVyCitkZXIpIGFuZGVyZW4gZGllIEF1Z2VuIHp1aGFsdGVuIG11c3MuIExlaWRlciBoYWJlbiBkaWUgVHVydGVsa3JhZWhlbiBhdWNoIGVpbmUKK2FuZGVyZSBFaWdlbnNjaGFmdCBkZXMgYWx0ZW4gRWhlcGFhcmVzOiBXYW5uIGltbWVyICBlaW5lICBiZXNvbmRlcnMgIGdlbHVuZ2VuZQorU3plbmUga29tbXQsIHdlaXNlbiBzaWUgZWluYW5kZXIgaW0gVm9yYXVzIGRhcmF1ZiBoaW4gdW5kIHZlcmRlcmJlbiBzaWNoIGRhbWl0CitqZWRlIFNwYW5udW5nLgorCitCaXR0ZSB2ZXJ6ZWloZW4gU2llIGRpZSB1bXN0YWVuZGxpY2hlIEtsYW1tZXJzZXR6dW5nLCBhYmVyIFVsbyBiZXN0ZWh0IGRhcmF1Zi4KK1NpZSwgbGllYmUgTGVzZXJpbiwgbGllYmVyIExlc2VyLCBrb2VubmVuIHNpY2ggbWl0IFNpY2hlcmhlaXQgdm9yc3RlbGxlbiwgIHdhcworZ2VzY2hhZWhlLCB3ZW5uIGVpbiBLaW5vYmVzdWNoZXIgU2NhcmxldHQgdmVycmlldGUsIHdpZSB3aWRlcmxpY2ggIFJoZXR0ICBzaWNoCitpaHIgZ2VnZW51ZWJlciB2ZXJoYWx0ZW4gd2lyZC4gU2llIGtvZW5uZW4gZXMsIG5pY2h0IHdhaHI/IFVuZAlkYWhlciAgaXN0ICBlcworVHVydGVsa3JhZWhlbiBzdHJpa3QgdmVyYm90ZW4sIHNpY2ggIHVlYmVyICBHZXNjaGVobmlzc2UsICBkaWUJZGVyICB3ZXJkZW5kZW4KK011dHRlciBadWt1bmZ0IG5vY2ggbmljaHQgIGVpbm1hbCAgV2VoZW4gIHZlcnVyc2FjaGVuLAl6dSAgdW50ZXJoYWx0ZW4uICBHYW56Cit1bmRlbmtiYXIsIHdlbm4gc2llIGdhciBkYXMgR2VzY2hsZWNodAlkZXMgIEtpbmRlcyAgdmVycmlldGVuLCAgZGFzcyAgWnVrdW5mdAorZ2ViYWVyZW4gd2lyZCEKKworS2VocmVuIHdpciBhbHNvIHp1cnVlY2sgenUgdW5zZXJlciBHZXNjaGljaHRlIHVuZCBob2ZmZW4sIGRhc3MgVWxvcyAgRXJtYWhudW5nCitBenp1cm8gdm9uIHdlaXRlcmVuIFZlcmZlaGx1bmdlbiBhYmhhbHRlbiB3aXJkLgorCitXaXIgZXJpbm5lcm4gdW5zLCBkYXNzIGdlcmFkZSBTYW1zb24gdW5kIEdyZWdvcnkgYXVmIGRlbiBQbGF0eglrYW1lbi4JU2Ftc29uCitwZmlmZiBlaW5lciBqdW5nZW4gRnJhdSBoaW50ZXJoZXIgdW5kICBoYW5kZWx0ZSAgc2ljaCAgZWluZW4gIFJpcHBlbnN0b3NzICB2b24KK3NlaW5lbSBGcmV1bmQgZWluLgorCisiTGFzcyBkaWUgTWFlZGVscyBpbiBSdWhlLCBTYW0uIiwgdmVybGFuZ3RlIEdyZWdvcnkuCisKKyJBY2gsIGtvbW0gc2Nob24sIHNpZSBpc3Qgd2lya2xpY2ggbmllZGxpY2guIgorCitHcmVnb3J5IHNjaGF1dGUgdWViZXIgZGllIFNjaHVsdGVyIHVuZCBrb25udGUgZGVtIG51ciB6dXN0aW1tZW4uICJIZXksICB3b25hY2gKK21pciBqZXR6dCB3aXJrbGljaCBkZXIgU2lubiBzdHVlbmRlLCBkYXMgd2FlcmUgZGVyIGVpbmUgb2RlciBhbmRlcmUgQ2FwdWxldC4iCisKK1NhbXNvbiBncmluc3RlLiAiQW0gU3BpZXNzPyIKKworIldhZXJlIGRvY2ggd2FzLCBuaWNodD8iCisKKyJVbmQgZGFubiBoYWV1dGVuIHdpciBpaHJlIEZyYXVlbj8iCisKKyJGYWVsbHQgZGlyIG5pY2h0cyBiZXNzZXJlcyBlaW4/IiwgZnJhZ3RlIEdyZWdvcnkuCisKKyJJY2ggd3Vlc3N0ZSBuaWNodHMgYmVzc2VyZXMsIGFscyBlaW5lIEZyYXUgbWl0IG1laW5lbSBTcGllc3MgenUgaGFldXRlbi4iCisKKyJPaCwgX2RpZV8gSGF1dCBtZWluc3QgZHUuIER1IHNvbGx0ZXN0IE1hZWRjaGVuIHNhZ2VuLiIKKworVWxvIHNjaHVldHRlbHRlIHNpY2ggdW5kIGxpZXNzIGV0d2FzIGZhbGxlbiwgd2FzIGhpZXIgYXVmIG1pdCAgUnVlY2tzaWNodCAgYXVmCitqdWdlbmRsaWNoZSBMZXNlciAoZW50c2NodWxkaWdlICBVbG8pICB1bmQgIExlc2VyaW5uZW4JbmljaHQgIG5hZWhlciAgYmVuYW5udAord2VyZGVuIHNvbGwuCisKKyJEaWUgS3JhZWhlIGhhdCBtaXIgYXVmIGRlbiBLb3BmIGdlLi4uIiBTYW1zb24gaG9sdGUgZWluIG5pY2h0IGFsbHp1ICBzYXViZXJlcworVGFzY2hlbnR1Y2ggaGVyYXVzIHVuZCB3aXNjaHRlIHNpY2ggdWViZXIgZGllIGJlZ2lubmVuZGUgR2xhdHplLgorCisiRGFzIHdpcmQgZGljaCBsZWhyZW4sIGR1IE1pc3RrZXJsISIsIGtyYWVjaHp0ZSBVbG8uCisKKyJVbmQgc2llICBsYWNodCAgYXVjaCAgbm9jaC4iICBTYW1zb24gIGZsdWNodGUuICBFciAgaGF0dGUgIFVsb3MgIFdvcnRlICBuaWNodAordmVyc3RhbmRlbiwgZGEgZGllc2Uga2x1ZyBnZW51ZyBnZXdlc2VuIHdhciwgS3JhZWhpc2NoIHp1IHNwcmVjaGVuLCAgZG9jaCAgZGVyCitUb25mYWxsIHdhciB1bnZlcmtlbm5iYXIuCisKKyJEdSBzcGlubnN0LCBtZWluIEZyZXVuZC4gU2VpdCB3YW5uIGxhY2hlbiBLcmFlaGVuPyBTdGVjayBkZW4gU2FlYmVsIHdlZy4iCisKKyJJY2ggYnJpbmcgZGFzIFZpZWggdW0hIiBTYW1zb24gd2FyIGtlaW5lc3dlZ3MgZGVyIE1hbm4sIGRlciAgc2VpbmUgIEVtb3Rpb25lbgora29udHJvbGxpZXJlbiBrb25udGUgb2RlciB3b2xsdGUuCisKKyJEYW5uIGxhc3MgZGFzIERpbmcgaGFsdCBkcmF1c3NlbiwgYWJlciBkYSBkcnVlYmVuIGZpbmRlc3QgZHUgIGVpbiAgZ3JvZXNzZXJlcworWmllbC4iIFNhbXNvbiBncmluc3RlIGJyZWl0IHVuZCBlbnRibG9lc3N0ZSBlaW4gR2ViaXNzLCBkYXMgZWluZW4gWmFobmFyenQgZWluCitKYWhyIGxhbmcgZXJuYWVocnQgaGFldHRlLiAiQ2FwdWxldHMhIExhc3N0IHNpZSBtaXIhIgorCisiV28gIG1hZyAgZXIgIGRhcyAgbnVyICBhdWZnZXNjaG5hcHB0ICBoYWJlbj8gICBJbSAgIE9yaWdpbmFsICAgc3RlaHQgICBuaWNodHMKK2RlcmdsZWljaGVuLiIsIGJlbWVya3RlIEF6enVybyB2ZXJkcmllc3NsaWNoLgorCisiSGFsdCEgV2VubiBkdSBzbyBlaW5mYWNoIGxvc3Jlbm5zdCwgaXN0IGRhcyBuaWNodCBndXQuIFZlcmdpc3MgbmllLCBkYXNzICB3aXIKK2RhcyBHZXNldHogYXVmIHVuc2VyZXIgU2VpdGUgaGFiZW4gd29sbGVuLiIgR3JlZ29yeSBoaWVsdCBzZWluZW4gS2FtZXJhZGVuICBhbQorQWVybWVsIHp1cnVlY2suCisKKyJXZW4/IgorCisiRGFzIEdlc2V0ei4gV2VubiBkdSBsb3NzdHVlcm1zdCB1bmQgIHNpZSAgZWluZmFjaCAgYW5ncmVpZnN0LCAgc2luZCAgd2lyICBkaWUKK0JvZXNlbiB1bmQgYmVrb21tZW4gU2Nod2llcmlna2VpdGVuLiBBbHNvIGxhc3MgbWljaCBtYWNoZW4sIGljaCBzb3JnZSAgZGFmdWVyLAorZGFzcyB3aXIgaW4gTm90d2VociBoYW5kZWxuLiIKKworU2Ftc29uCWJlZ3JpZmYgIG5pY2h0LCAgd2FzICBHcmVnb3J5ICBtaXQgIEdlc2V0emVuICB3b2xsdGUsICBhYmVyICBkYXMgIFdvcnQKK1NjaHdpZXJpZ2tlaXRlbiAgd2Vja3RlICBpbiAgaWhtICBqZW5lCVZvcnNpY2h0LCAgZGllCWFsbGVuICB1bnRlcmdlb3JkbmV0ZW4KK1NvbGRhdGVuIGRpZXNlciB1bmQgYWxsZXIgYW5kZXJlbiAgV2VsdGVuICBnZW1laW4gIGlzdC4gIFNjaHdpZXJpZ2tlaXRlbiwgIGRhcworaGF0dGUgZXR3YXMgbWl0IHd1ZXRlbmRlbiBWb3JnZXNldHp0ZW4sIExhdHJpbmVucHV0emVuIHVuZCBXb2NoZW5lbmRkaWVuc3QgIHp1Cit0dW4sIGRhdm9uIGhpZWx0IG1hbiBzaWNoIGJlc3NlciBmZXJuLgorCisiWmVpZyBpaG0gZGVuIFN0aW5rZWZpbmdlci4iLCBzY2hsdWcgU2Ftc29uIHZvci4KKworIkFiZXIgbmljaHQgZG9jaCwgZGFubiBoYWV0dGVuICB3aXIgIGRhcyAgR2VzZXR6ICBuaWNodCAgYXVmICB1bnNlcmVyICBTZWl0ZS4iCitHcmVnb3J5IHNjaHVldHRlbHRlICB2ZWhlbWVudCAgZGVuICBLb3BmICB1bmQgIHN0cmVja3RlICBuaWNodHNkZXN0b3Ryb3R6ICBkZW4KK01pdHRlbGZpbmdlciBpbiB1bm1pc3N2ZXJzdGFlbmRsaWNoZXIgR2VzdGUgdm9yLgorCisiSGV5LCBhYmVyIGR1IHplaWdzdCBpaG0gZGVuIEZpbmdlcj8gSWNoIGRlbmtlLCBkYXMgZHVlcmZlbiB3aXIgbmljaHQ/IiBTYW1zb24KK3ZlcnN0YW5kIHNlaW5lbiBLYW1lcmFkZW4gbmljaHQuCisKKyJXaWU/IFplaWdzdCBkdSBkZW4gU3RpbmtlZmluZ2VyPyIsIHZlcmxhbmd0ZSBhdWNoIEFicmFoYW0genUgd2lzc2VuLgorCisiSmF3b2xsLCBpY2ggemVpZ2UgZGVuIFN0aW5rZWZpbmdlci4iLCBncmluc3RlICBHcmVnb3J5ICB1bmQgIGJldHJhY2h0ZXRlICBkaWUKK0hhbmQgU2Ftc29ucywgZGVyIGlobSBhbGxlcyBuYWNoYWhtdGUuCisKKyJaZWlnc3QgZHUgaWhuIGFtIEVuZGUgX21pcl8/IiBBYnJhaGFtIGZyZXV0ZSBzaWNoIHNpY2h0bGljaCBhdWYgZGllIEFudHdvcnQuCisKK1NhbXNvbiBmbHVlc3RlcnRlOiAiSXN0IGRhcyBHZXNldHogYXVmIHVuc2VyZXIgU2VpdGUsIHdlbm4gaWNoIGphIHNhZ2U/IgorCisiTmVpbiwgYmxvc3MgbmljaHQuIiBHcmVnb3J5IHN0dXBzdGUgc2VpbmVuIEZyZXVuZCBpbiBkaWUgIFNlaXRlLiAgIkxhc3MgIG1pY2gKK21hY2hlbi4iCisKKyJBbHNvLCBpY2ggemVpZ2UgZGVuIFN0aW5rZWZpbmdlciwgYWJlciB3aWUga29tbXN0IGR1IG51ciBkYXJhdWYsIGRhc3MgaWNoIGlobgorZGlyIHplaWdlbiBrb2VubnRlPyBNZWluIGFybWVyIEZpbmdlciEgRGFzIHRhZXRlIGljaCBpaG0gbmllbWFscyBhbiEiCisKKyJXaWUgd2FyIGRhcz8gU3VjaHQgaWhyIFN0cmVpdD8iCisKKyJXZWxjaCBlaW5lIFVudGVyc3RlbGx1bmchIgorCisiU2NoYWRlLiIgQWJyYWhhbSBncmluc3RlLiAiSWNoIHNlaGUgZWluZSBndXRlICBHZWxlZ2VuaGVpdCwgIGV1Y2ggIGJlaWRlbiAgenUKK3plaWdlbiwgZGFzcyBDYXB1bGV0IGFsbGUgTWFsZSBiZXNzZXIgaXN0IGFscyBNb250YWd1ZS4iCisKKyJQYWguIiBHcmVnb3J5IHNjaG5hdWJ0ZS4KKworIkJsb2Vkc2lubiwgIGRpZSAgc3Bpbm5lbiwgIGRpZSAgQ2FwdWxldHMuIiwgIGZ1ZWd0ZSAgIFNhbXNvbiAgIGF1cyAgIHRpZWZzdGVyCitVZWJlcnpldWd1bmcgaGluenUuCisKKyJTY2hvbiB3aWVkZXIhIiwgZW1wb2VydGUgc2ljaCBBenp1cm8uCisKKyJPaCBkb2NoLCBkYXMgaXN0IGVzLiIKKworIklzdCBlcyBuaWNodC4iCisKKyJEb2NoLiIKKworIk5laW4uIgorCisuLi4KKworTGllYmUgTGVzZXJpbiwgbGllYmVyIExlc2VyLCBzZXR6ZW4gU2llIGluIEdlZGFua2VuICBkaWVzZXMgIEF1ZnRydW1wZmVuICBub2NoCitlaW4gd2VuaWcgZm9ydC4gSW4gQW5iZXRyYWNodCAgZGVyICBUYXRzYWNoZSwgIGRhc3MgIHdpciAgZXMgIG1pdCAgZXJ3YWNoc2VuZW4KK01hZW5uZXJuIHp1IHR1biBoYWJlbiwgd29sbGVuIHdpciB1bnMgbmljaHQgZXR3YSBLaW5kZXIgdm9yc3RlbGxlbiwgIGRpZSAgc2ljaAordWViZXIgZGllIEdyb2Vzc2UgZGVyICBBdXRvcyAgaWhyZXIgIFZhZXRlciAgc3RyZWl0ZW4sCXNvbmRlcm4gIHp1bSAgQmVpc3BpZWwKK0Z1c3NiYWxsZmFucywgZGllIHNpY2ggbmljaHQgZGFydWViZXIgZWluaWcgd2VyZGVuIGtvZW5uZW4sIHdlbGNoZXIgVmVyZWluICBlcworZWhlciB2ZXJkaWVudCBoYXQsIGRlbiBQb2thbCB6dSBnZXdpbm5lbi4gIFdpZQlqZWRlciAgZ2VzdGFuZGVuZSAgRnVzc2JhbGxmYW4KK0lobmVuIGJlc3RhZXRpZ2VuIGthbm4sIGhhZW5ndCBkZXIgR2V3aW5uIGRlcyBQb2thbHMgamEgaW4gIGtlaW5lciAgV2Vpc2UgIHZvbgorZGVuIEZhZWhpZ2tlaXRlbiBkZXIgU3BpZWxlciBvZGVyIGRlcyBUcmFpbmVycyBhYiwgc29uZGVybiBhdXNzY2hsaWVzc2xpY2ggdm9uCitkZXIgSW50ZW5zaXRhZXQgZGVzIEdsYXViZW5zIGRlciBiZWdlaXN0ZXJ0ZW4gWnVzY2hhdWVyLiBGdXNzYmFsbCwgIHNvCXdpc3Nlbgord2lyLCB3YXIgenUgamVuZXIgWmVpdCBub2NoIG5pY2h0IGVyZnVuZGVuLCBkb2NoIHdvICBpbW1lciAgendlaSAgTWFubnNjaGFmdGVuCitzaW5kLCBmaW5kZW4gc2ljaCBhdWNoIEZhbnMuIERlbiBSZXN0IHp1ICBlcmtsYWVyZW4gIHVlYmVybGFzc2UgIGljaCAgd2Vpc2VyZW4KK01lbnNjaGVuLgorCitFaW5lcyB3b2xsZW4gd2lyIGFiZXIgbmljaHQgdmVyZ2Vzc2VuOiBXbyBpbW1lciBzaWNoIHp3ZWkgVHJ1cHBzIHZvbiBIb29saWdhbnMKK2dlZ2VudWViZXJzdGVoZW4sIGlzdCBkZXIgRmFuYmV0cmV1ZXIgbmljaHQgIHdlaXQgIHVuZAl2ZXJzdWNodCwgIEZyaWVkZW4gIHp1CitzdGlmdGVuLiBHZXJhZGUgIGVyaW5uZXJ0ZSAgU2Ftc29uICBHcmVnb3J5ICBhbiAgc2VpbmVuICBMaWVibGluZ3N6aWVnZWxzdGVpbi4KK1ZlcnplaWh1bmcsIHNlaW5lbiBiZXN0ZW4gU2FlYmVsc3RyZWljaCwgYWxzIEJlbmV2b2xpbwlkYXMgIG5haGVuZGUgIFVuZ2x1ZWNrCitzYWguCisKKyJIb2VydCBpaHIgYXVmISIgQmVuZXZvbGlvIHpvZyBzZWluZW4gZWlnZW5lbiBTYWViZWwgdW5kICBzY2hsYWVndCAgZGFtaXQgIGRpZQorZGVyIEtvbWJhdHRhbnRlbiBoZXJ1bnRlci4gIklociBoYWJ0IHNpZSB3b2hsIG5pY2h0IG1laHIgYWxsZS4gRnJpZWRlbiAgamV0enQsCitzb25zdCBob2wgaWNoIGRpZSBQb2xpemVpLiIKKworIkhvbCBkaWUgQnVsbGVuLCAgbWVpbiAgSnVuZ2UsICBhYmVyICBzdGVjayAgZGVuICBaYWhuc3RvY2hlciAgd2VnLiIsICBrbnVycnRlCitHcmVnb3J5LgorCitCZW5ldm9saW8gcnVlbXBmdGUgZGllIE5hc2UgdWViZXIgZGllIHVuZ2VwZmxlZ3RlIEF1c2RydWNrc3dlaXNlLiAgIkxlcm4gIGVyc3QKK21hbCB2ZXJudWVuZnRpZyB6dSByZWRlbiwgZGFubiBob2VyZSBpY2ggZGlyIHZpZWxsZWljaHQgIGF1Y2ggIHp1LiAgVW5kICBqZXR6dAorZnJpZWRsaWNoIGhpZXIhIgorCitVbG8gc3RyZWNrdGUgZGVuIEtvcGYgdm9yLiAiSXN0IGVyIG5pY2h0IGVpbiBTY2hhZXR6Y2hlbiwgdW5zZXIgQmVuZXZvbGlvPyIKKworIkVpbiB3YWhyZXIgSGVsZC4iLCBtZWludGUgIEF6enVybyAgaG9laG5pc2NoLiAgIk5pY2h0LCAgZGFzcyAgZXIgIHZpZWwgIGRhbWl0CitlcnJlaWNodGUuIgorCisiV2llc28/IgorCisiR3VjayBtYWwgZGEgcnVlYmVyLiBUeWJhbHQga29tbXQuIgorCisiRGVyIFJhdWZib2xkIGRlciBDYXB1bGV0cz8gTmEsIGRhbm4gaGFiZW4gd2lyIGphIGdsZWljaCBkZW4gIHNjaG9lbnN0ZW4gIFRhbnoKK2hpZXIuIgorCitVbG8gcmVja3RlIGRlbiBLb3BmLgorCitUeWJhbHQgZnJhZ3RlIG5pY2h0IGxhbmdlLCBzb25kZXJuIHpvZyBzZWluZW4gU2FlYmVsIGJsYW5rLiAiSmEsIHdhcyBoYWJlbiB3aXIKK2Rlbm4gaGllcj8gQmVuZXZvbGlvIE1vbnRhZ3VlLCBzY2hhdSBhbi4gVW5kIGVyIGhhdCAgYXVjaCAgbm9jaCAgendlaSAgRnJldW5kZQorZGFiZWkuIERhcyBtYWNodCBkcmVpIGdlZ2VuIHp3ZWksIHdlbm4gaWNoIG1pY2ggbmljaHQgIHRhZXVzY2hlLiAgU2NoYWVtdCAgaWhyCitldWNoIG5pY2h0LCBvZGVyIGhhYnQgaWhyIGV0d2EgQW5nc3Q/IgorCisiU2NoYXUgYW4sIGVyIGthbm4gcmVjaG5lbi4iIFVsbyBsYWNodGUga3JhZWNoemVuZC4KKworIlZvbiBNdWZmZW5zYXVzZW4ga2FubiBrZWluZSBSZWRlIHNlaW4uIiwgbWVpbnRlIFNhbXNvbi4KKworQmVuZXZvbGlvIHNjaGVua3RlIFR5YmFsdCBlaW5lbiB2ZXJhZWNodGxpY2hlbiBCbGljay4gIk5laW4sIGtlaW5lIEFuZ3N0LCBtZWluCitMaWViZXIsIG51ciBkZXIgV3Vuc2NoLCBGcmllZGVuIHp1IHN0aWZ0ZW4uIgorCisiSW5kZW0gIGlociAgdW5zZXJlICBMZXV0ZSAgX3VtYnJpbmd0Xz8gIE5pY2h0ICBnZXJhZGUgIGRpZSAgZmVpbmUgIEFydCwgIEhlcnIKK0JlbmV2b2xpby4gSWNoIHdlcmRlIElobmVuIHNjaG9uIHplaWdlbiwgd2llICBmcmllZGxpY2ggIHdpciAgc2luZCwgIHdlbm4gIHdpcgorYW5nZWdyaWZmZW4gd2VyZGVuLiIKKworU2llIGtlbm5lbiBhbGxlIGRpZSBzY2hvZW5lbiBTY2hsYWVnZXJlaWVuLCBkaWUgenVtIFdlc3Rlcm4gZ2Vob2VyZW4sIHdpZSAgZGVyCityZWNodGUgU2NodWggenVtIGxpbmtlbj8gTWFuIHBydWVnZWx0IHNpY2ggdW5kIGFjaHRldCBuaWNodCB3ZWl0ZXIgZGFyYXVmLCB3ZW4KK21hbiBnZXJhZGUgdHJpZmZ0LCBzY2hsaWVzc2xpY2ggaXN0IGplZGVyLCBkZXIgc2ljaCBpbiBkaWUgTmFlaGUgZGVyICBLZWlsZXJlaQord2FndCBlbnR3ZWRlciBiZXRlaWxpZ3Qgb2RlciBzZWxiZXIgc2NodWxkLiBIYXJtbG9zZSBQYXNzYW50ZW4gZ2lidCBlcwluaWNodCwKK3dlciBzZWluZSBaYWVobmUgYmVoYWx0ZW4gd2lsbCwgaGF0IG51ciBlaW5lIE1vZWdsaWNoa2VpdCwgZGllcyB6dSAgZXJyZWljaGVuOgorRXIgbXVzcyB0b3Qgc3BpZWxlbiB1bmQgc2ljaCBkZXIgR2VmYWhyIGF1c3NldHplbiwgaGFydGUgVHJpdHRlICBnZWdlbgl3ZWljaGUKK1RlaWxlIHp1IGthc3NpZXJlbiBvZGVyIGVyIG11c3Mgc2NobmVsbGVyIHp1c2NobGFnZW4gYWxzIGFsbGUgYW5kZXJlbi4JQmlubmVuCitrdWVyemVzdGVyIEZyaXN0IGlzdCBlaW5lIFNjaGxhZWdlcmVpIGltIEdhbmdlLCBkaWUgaWhyZXNnbGVpY2hlbiBzdWNodC4KKworV2llIGltbWVyIGluIHNvbGNoZW4gRmFlbGxlbiBwbGF0enQgZGllIFBvbGl6ZWkgbWl0dGVuCWhpbmVpbiwgIHVuZCAgZGEgIGlocmUKK0FuZ2Vob2VyaWdlbiBlYmVuZmFsbHMgTWVuc2NoZW4gc2luZCwga29lbm5lbiBzaWUgbmljaHQgdW1oaW4sIGJlaSAgZGVyICBlaW5lbgorUGFydGVpIGVpbiB3ZW5pZyBtZWhyIEZyaWVkZW4genUgc3RpZnRlbiBhbHMgYmVpIGRlciBhbmRlcmVuLiBIYWx0ZW4gIHdpciAgZGVyCitQb2xpemVpLCBpbnNvZmVybiBtYW4gZnVlciBJbmRpdmlkdWVuIGVpbmVuIHNvbGNoICBnZW5lcmFsaXNpZXJlbmRlbiAgQXVzZHJ1Y2sKK3ZlcndlbmRlbiBrYW5uLCB6dWd1dGUsIGRhc3Mgc2llIGJlaSBhbGwgaWhyZXIgTWVuc2NobGljaGtlaXQgdW5kICBGZWhsYmFya2VpdAorbmljaHRzZGVzdG93ZW5pZ2VyIGF1ZiBBdXNnZWdsaWNoZW5oZWl0IGFjaHRldCwgc28gZGFzcyBmdWVyICBqZWRlbiAgQW5oYWVuZ2VyCitkZXIgQ2FwdWxldHMgYXVjaCBlaW5lciBkZXIgTW9udGFndWVzIGVpbmdlc3RlbGx0IHdpcmQuIE9kZXIsIHVtIGVzIGVpbiAgd2VuaWcKK3BvbGVtaXNjaGVyIGF1c3p1ZHJ1ZWNrZW4sIGtlaW5lIGRlciBiZWlkZW4gU2VpdGVuIGJla29tbXQgd2VuaWdlciBQb2xpemVpIGFscworZGllIGFuZGVyZS4KKworSGVyciBDYXB1bGV0LCBkZXIgZ2VyYWRlIHNlaW5lIEdhdHRpbiBhdWYgZWluZW0gU3BhemllcmdhbmcgYmVnbGVpdGV0ZSwgIGhhdHRlCitzZWluZSBoZWxsZSBGcmV1ZGUsIGFscyBlciBkaWUgd3VuZGVyc2Nob2VuZSBQcnVlZ2VsZWkgc2FoLiAiRGFzICBnaWJ0ICBlcyAgamEKK25pY2h0ISBDYS1QdS1MZXQsIENhLSBQdS1MZXQhIgorCisiSWRpb3QuIFVuZCBndWNrIG51ciwgZXIgaGF0IGVpbmVuIE1vcmdlbnJvY2sgIGFuLiIsICBrb21tZW50aWVydGUgIFVsby4gICJEZXIKK0tlcmwgaXN0IHdpcmtsaWNoIHNlbmlsLiIKKworIkxhc3MgaWhuIGRvY2guIERlciBhbHRlIEtub2NoZW4ga2FubiBudXIgbm9jaCBicnVlbGxlbi4iICBBenp1cm8gIHp1Y2t0ZSAgZGllCitTY2h1bHRlcm4uCisKKyJTb2xsdGUgbWljaCB3dW5kZXJuLCB3ZW5uIGVyIGVzIGRhYmVpIGJlbGllc3NlLiIgVWxvIGthbm50ZSBpaHJlIFBhcHBlbmhlaW1lci4KKworIlZlcmRhbW10LCB3aXIgdmVybGllcmVuISBNZWluIFNjaHdlcnQhIgorCitGcmF1IENhcHVsZXQsIGplZGVyIFpvbGwgZWluZSBEYW1lICB1bmQgIHNpY2ggIHZvZWxsaWcJaW0gIEtsYXJlbiAgdWViZXIgIGRlbgorWnVzdGFuZCBpaHJlcyBHYXR0ZW4sIGxhZWNoZWx0ZSBlaW4gd2VuaWcuICJEdSBtZWluc3QgIGdld2lzcyAgZGVpbmUgIEtydWVja2UsCittZWluIFNjaGF0ei4iICJJY2ggbWVpbmUgbWVpbiBTY2h3ZXJ0LiIKKworIlNhZyBpY2ggZG9jaC4iLCBlcndpZGVydGUgc2VpbmUgR2F0dGluIG1hbGl6aW9lcy4KKworSGVyciBDYXB1bGV0LCBkZXIgYWhudGUsIHdhcyBpaG4gZGFoZWltIGVyd2FydGV0ZSwgd2VubiBlciBzZWluZXIgR2F0dGluIGpldHp0Cit3aWRlcnNwcmFlY2hlLAl6dWNrdGUJbnVyICBkaWUgIFNjaHVsdGVybiAgdW5kICBiZWdudWVndGUgIHNpY2ggIGRhbWl0LCAgZGllCitDYXB1bGV0YW5oYWVuZ2VyIGFuenVmZXVlcm4gdW5kIHVlYmVyc2FoIGluIHNlaW5lbSBFaWZlciBnYW56ICB1bmQgIGdhciwgIGRhc3MKK2luendpc2NoZW4gYXVjaCBIZXJyIE1vbnRhZ3VlIG1pdCBzZWluZXIgRnJhdSBkYXMgU2NobGFjaHRmZWxkIGJldHJldGVuIGhhdHRlLgorSGVycm4gTW9udGFndWUgd2FyIGRpZSBHZXN0YWx0IHNlaW5lcyBMaWVibGluZ3NmZWluZGVzCWFsbGVyZGluZ3MgIGtlaW5lc3dlZ3MKK2VudGdhbmdlbi4gIkR1IGhpbnRlcmhhZWx0aWdlciBTYWNrISBXb3p1IGhhc3QgZHUgZGVpbmUgTGV1dGUgYW5nZXN0aWZ0ZXQhIiBFcgorc3R1ZXJ6dGUgbWl0IGVyaG9iZW5lciBGYXVzdCBhdWYgQ2FwdWxldCB6dS4gIkR1LCBkdS4uLiIKKworIkR1IENhcHVsZXQuIiwgc291ZmZsaWVydGUgQXp6dXJvIHVuZCBoYW5kZWx0ZSBzaWNoIGVpbmVuIHpvcm5pZ2VuICBCbGljayAgdm9uCitVbG8gZWluLiBEYW5rYmFyIG5haG0gTW9udGFndWUgZGllIEhpbGZlc3RlbGx1bmcgYW4uICJEdSBfQ2FwdWxldF8sICBkaXIgIHplaWcKK2ljaCwgd2FzIGVpbiBlY2h0ZXIgTW9udGFndWUgaXN0ISIKKworIkpldHp0IHdpcmQgZXMgZXJzdCBsdXN0aWcuIiwgZnJldXRlIHNpY2ggVWxvICB1bmQgIHNldHp0ZSAgc2ljaCAgaW4gIFBvc2l0dXIuCisiQmVzdGltbXQgYmVrb21tZW4gd2lyIGdsZWljaCBlaW5lIGJpbGRlcmJ1Y2hyZWlmZSBIZXJ6YXR0YWNrZSB6dSBzZWhlbi4iCisKKyJOaWNodHMgZGEuIiBBenp1cm8gZGV1dGV0ZSBtaXQgZGVtIFNjaG5hYmVsIGF1ZiBkaWUgUG9saXppc3Rlbi4gICJEYSwgIHNpZWhzdAorZHU/IFNpZSBoYWJlbiBlcyBnZXNjaGFmZnQsIGRpZSBiZWlkZW4gU2VpdGVuIHp1IHRyZW5uZW4uIgorCitVbG8gc2V1Znp0ZS4gIlNjaGFkZS4iCisKK0RpZSBQb2xpemlzdGVuIGhhdHRlbiBkaWUgYmVpZGVuIGZlaW5kbGljaGVuICBTZWl0ZW4gIHNhZXViZXJsaWNoICBhdXNzb3J0aWVydAordW5kIGFuIGRlbiBnZWdlbnVlYmVybGllZ2VuZGVuIFNlaXRlbiBkZXMgUGxhdHplcyBBdWZzdGVsbHVuZyAgbmVobWVuICBsYXNzZW4uCitadSAgamVuZXIgIFplaXQgIGhpZWx0CW1hbiAgc2ljaCAgbmljaHQgIGxhbmdlICBkYW1pdAlhdWYsICBkaWUgIFBlcnNvbmFsaWVuCitmZXN0enVzdGVsbGVuLCBkaWUgUmF1ZmJvbGRlICBhYnp1ZnVlaHJlbiwgIGF1c3p1bnVlY2h0ZXJuICB1bmQgIG5hY2ggIGVpbmlnZW4KK1dvY2hlbiBvZGVyIE1vbmF0ZW4gdm9yIEdlcmljaHQgenUgc3RlbGxlbiwgbWFuIHNhbW1lbHRlICBkaWUgIFVlYmVycmVzdGUgIGRlcgorUHJ1ZWdlbGVpIGVpbiB1bmQgZnVlaHJ0ZSBzaWUgZGVtIFJpY2h0ZXIgZWluZmFjaCAgdm9yLCAgZGVyICBsYW5nZSAgbmljaHQgIHNvCit1ZWJlcmxhc3RldCB3YXIsIHdpZSBlcyBkaWUgR2VyaWNodGUgaW4gdW5zZXJlciBsZWlkZ2VwbGFndGVuICBaZWl0ICBzaW5kLiAgU28KK2dlc2NoYWggZXMgYXVjaCBqZXR6dC4gRGFzIEdlcmljaHQsIGluCUdlc3RhbHQgIGRlcyAgQnVlcmdlcm1laXN0ZXJzICBFc2NhbHVzCitiZXRyYXQgZGVuIEdlcmljaHRzaG9mLCB3aWxsICBzYWdlbiwgIGRlbiAgTWFya3RwbGF0eiwJdW5kICBuYWhtICBhbSAgQnJ1bm5lbgorQXVmc3RlbGx1bmcuCisKKyJXYXMgaXN0IGhpZXIgbG9zPyIsIHZlcmxhbmd0ZSBFc2NhbHVzIHp1IHdpc3Nlbi4KKworIlNpZSBoYWJlbiBzaWNoIGdlcHJ1ZWdlbHQuIiwgYmVtZXJrdGUgVWxvIGxlaXNlLgorCisiRGFua2UsIHNvdmllbCBrYW5uIGljaCAgc2VsYmVyICBhdXMgIGRlbiAgYmx1dGlnZW4gIE5hc2VuICBhYmxlc2VuLiIgIEVzY2FsdXMKK2lnbm9yaWVydGUgZGllIGZyYWdlbmRlbiBCbGlja2UsIGRlbm4gZXIgd3Vzc3RlIGphIG5pY2h0LCBkYXNzIGVyIGFscyBFaW56aWdlcgorVWxvcyBXb3J0ZSBnZWhvZXJ0IGhhdHRlLiAiTWlyIHJlaWNodCBlcyBqZXR6dCwgSGVycnNjaGFmdGVuLiAgR2VodCAgZXMgIHNjaG9uCit3aWVkZXIgdW0gZGllIGFsdGUgRmVoZGU/IiBNb250YWd1ZSB1bmQgQ2FwdWxldCwgYmVpZGVzIE1hZW5uZXIsIGRpZSBmdWVyIGlocmUKK0FuZ2VzdGVsbHRlbiB1bmQgQW5oYWVuZ2VyIGVpbnN0YW5kZW4sIG5pY2t0ZW4gYmV0cmV0ZW4uCisKKyJJY2ggaGFiZSBkaWUgTmFzZSB2b2xsLiBTdGF0dCBldWNoICB3aWUgIGFuc3RhZW5kaWdlICBNZW5zY2hlbiAgenUgIGJlbmVobWVuLAorcHJ1ZWdlbHQgaWhyIGV1Y2ggYXVmIG9mZmVuZXIgU3RyYXNzZSwgYWxzIGdhZWJlIGVzICBrZWluZSAgeml2aWxpc2llcnRlICBBcnQsCitkaWUgQW5nZWxlZ2VuaGVpdCB6dSByZWdlbG4uIgorCisiSG9lcnQsIGhvZXJ0LiIgQXp6dXJvIGdyaW5zdGUuCisKKyJXYXJ1bSBlcmZpbmRlc3QgZHUgbmljaHQgZGVuIEZ1c3NiYWxsPyIsIGZyYWd0ZSBVbG8gc28gbGVpc2UsIGRhc3Mgd2llZGVyIG51cgorRXNjYWx1cyBzaWUgaG9lcmVuIGtvbm50ZS4KKworV2VubiBkaWUgR29ldHRlciBkZXIgTXl0aGVud2VsdCBVbG8gamV0enQgZ2Vob2VydCAgaGFldHRlbiwgIHdhZXJlICBzaWNoZXJsaWNoCitlaW4gQmxpdHogdm9tIEhpbW1lbCBnZWtvbW1lbiB1bmQgaGFldHRlICBzaWUgIGVyc2NobGFnZW4uICBEb2NoICBkaWUgIEdvZXR0ZXIKK3dhcmVuIGFuZGVyd2VpdGlnIGJlc2NoYWVmdGlndCwgc28ga2FtIGVzLCBkYXNzIFVsbyB1bmdlc2Nob3JlbiAgZGF2b25rYW0gIHVuZAorc3RhdHQgZGVzIHN0cmFmZW5kZW4gQmxpdHplcyBlaW5lciBkZXIgRWluZ2VidW5nIGVpbnNjaGx1Zy4gRXIgdHJhZiBhdWNoIG5pY2h0CitVbG8sIGluIGRlcmVuIEtvcGYgc2Nob24gZ2VudWcgbWVociAgb2RlciAgbWluZGVyICBkdW1tZSAgSWRlZW4gIGhlcnVtc3B1a3RlbiwKK3NvbmRlcm4gRXNjYWx1cywgZGVyIHRpZWYgTHVmdCBob2x0ZSB1bmQgZGllIGdyYW5kaW9zZQlJZGVlICBpbiAgc2VpbmVtICBIaXJuCitzcGVpY2hlcnRlLCB3byBzaWUgYmlzIHp1IGlocmVyICBSZWlmZQlsaWVnZW4Jc29sbHRlLiAgX0VpbmVzXyAgX1RhZ2VzXywgIHNvCitkYWNodGUgc2ljaCBFc2NhbHVzLCBfd2lyZF8gX2RpZV8gX1dlbHRfIF9mcmllZGxpY2hlcl8gX3NlaW5fLiBfRGFubl8gX3RyYWdlbl8KK193aXJfIF91bnNlcmVuXyBfU3RyZWl0XyBfbmljaHRfIF9tZWhyXyBfbWl0XyBfV2FmZmVuZ2V3YWx0XyBfYXVzXywgIF9zb25kZXJuXworX3NwaWVsZW5fICBfc3RhdHRfICBfZGVzc2VuXyAgX0Z1c3NiYWxsXy4gIF9EYXNfICBfd2lyZF8gICBfZWluZV8gICBfYmVzc2VyZV8sCitfd2Vpc2VyZV8gIF9XZWx0XyAgX3NlaW5fLCAgX2dhbnpfICBfYmVzdGltbXRfLiAgX0Rhbm5fLCAgX2VpbmVzXyAgIF9zY2hvZW5lbl8KK19UYWdlc18sICBfd2VyZGVuXyAgX3p3ZWlfICBfdmVyZmVpbmRldGVfICBfTGFnZXJfICBfaWhyZV8gIF9iZXN0ZW5fICAgX0xldXRlXworX2F1c3dhZWhsZW5fIF91bmRfIF9zaWVfIF9pbl8gX2ZhaXJlbV8gX1dldHRrYW1wZl8gX2locmVuXyBfU3RyZWl0XyBfYmVpbGVnZW5fCitfbGFzc2VuXy4gX0phXywgX2Rhc18gX3dpcmRfIF93aXJrbGljaF8gX2VpbmVfIF9iZXNzZXJlXyBfV2VsdF8gX3NlaW5fLiAgX0ljaF8KK19tdXNzXyBfbWlyXyBfbnVyXyAgX25vY2hfICBfdWViZXJsZWdlbl8sICBfd2llXyAgX21hbl8gIF9GdXNzYmFsbF8gIF9zcGllbGVuXworX3NvbGxfLgorCitIYWx0ZW4gd2lyIEVzY2FsdXMgenVndXRlLCBkYXNzIGVyIG5vY2ggbmljaHRzIHZvbiBGYW5zIHdpc3NlbiBrb25udGUuCisKKyJEYXMgaXN0IGpldHp0IGRhcyBkcml0dGUgTWFsLCBtZWluZSAgSGVycmVuLiAgRHJlaW1hbCAgaGF0ICBldWVyICB2ZXJmbHVjaHRlcgorSGFlbmRlbCBzY2hvbiBkaWUgZ2FuemUgU3RhZHQgaW4gQXVmcnVociBnZXN0dWVyenQuIgorCitFciBoYWV0dGUgaGluenVmdWVnZW4ga29lbm5lbiwJZGFzcyAgYmVpICBqZWRlciAgZGllc2VyICBBdXNlaW5hbmRlcnNldHp1bmdlbgorU3RldWVyemFobGVyIHN0YXJiZW4gb2RlciBmdWVyIGxhZW5nZXJlIFplaXQgYXJiZWl0c3VuZmFlaGlnIHd1cmRlbiwgIHNvICBkYXNzCittYW4gaWhtIHBlcnNvZW5saWNoZW4gU2NoYWRlbiB6dWZ1ZWd0ZSwgYWJlciAgZWluICBzb2xjaGVyICBNYW5uICB3YXIgIEVzY2FsdXMKK25pY2h0LiBTdGF0dCBkZXNzZW4gZGFjaHRlIGVyIG51ciBhbiBkaWUgTWVuc2NoZW4sICBkaWUgIGR1cmNoCWRpZXNlbglkdW1tZW4KK1N0cmVpdCBrZWluZSBSdWhlIGZhbmRlbiB1bmQgbmllIHd1c3N0ZW4sIG9iICBzaWUgIGFtICBuYWVjaHN0ZW4gIE1vcmdlbiAgaWhyZQorU3RhZHQgbm9jaCBzbyB2b3JmaW5kZW4gd3VlcmRlbiwgd2llIHNpZSAgYW0gIEFiZW5kLCAgYWxzICBzaWUJc2ljaCAgc2NobGFmZW4KK2xlZ3Rlbiwgbm9jaCBnZXdlc2VuIHdhci4gV2VyIGtvbm50ZSBzYWdlbiwgb2IgbmljaHQgYW0gbmFlY2hzdGVuIFRhZyBhbGxlcyBpbgorU2NodXR0IHVuZCBBc2NoZSBsYWcsICB3YXMgIG5vY2ggIGFtICBWb3J0YWcgIGFscyAgZnVlciAgZGllICBFd2lna2VpdAlnZWJhdXQKK2F1c2dlc2VoZW4gaGF0dGU/IFdlciB3dXNzdGUsIG9iIHVuZCAgd2FubiAgZGVyICBTdHJlaXQgIHp3aXNjaGVuICBkZW4JYmVpZGVuCitGYW1pbGllbiBlc2thbGllcnRlPyBXZXIga29ubnRlICBndXRlbglHZXdpc3NlbnMgIF9CaXNfICBfbW9yZ2VuXyAgenUJc2VpbmVuCitGcmV1bmRlbiBzYWdlbiwgd2VubiBlciBuaWNodCB3dXNzdGUsIG9iIGVyIG5pY2h0IGJlaW0gVWViZXJxdWVyZW4gZGVzIE1hcmt0ZXMKK2FsbGUgR2VkYW5rZW4gYW4gZWluIE1vcmdlbiBnZWdlbiBkaWUgdW5lbmRsaWNoZSBHbGVpY2hndWVsdGlna2VpdCAgZGVzICBUb2RlcworZWludGF1c2NodGU/IEhhYmVuIFNpZSwgbGllYmUgTGVzZXJpbiwgbGllYmVyIExlc2VyLCAgamVtYWxzICBlaW5lICBEb3Jma2lybWVzCitiZXN1Y2h0PyBXZW5uIG5pY2h0LCBlbXBmZWhsZSBpY2ggSWhuZW4sIHNpY2ggIGVpbiAgc29sY2hlcyAgU3Bla3Rha2VsCWVpbm1hbAorYW56dXNlaGVuLiBWaWVsbGVpY2h0IGdlaGVuIFNpZSBhbSBTYW1zdGFnYWJlbmQgaGluLCB3ZW5uIGRpZSAganVuZ2VuICBNYWVubmVyCitkZXMgT2JlcmRvcmZlcyBzaWNoIHp1bSBCaWVyIGFuIGVpbmVtIGRlciBkcmVpIEJpZXJzdGFlbmRlICB0cmVmZmVuLCAgd2FlaHJlbmQKK2RpZSBkZXMgVW50ZXJkb3JmZXMgYW0gendlaXRlbiBzdGVoZW4gIHVuZCAgZGllICBFcndhY2hzZW5lbiwgIERpc3Rpbmd1aWVydGVuLAorV2Vpc2VyZW4sIGluIGRlciBNaXR0ZSB6d2lzY2hlbiBkZW4gYmVpZGVuIEJpZXJzdGFlbmRlbiBiZWkgZWluZW0gR2xhcwlzaXR6ZW4KK3VuZCB1ZWJlciBQb2xpdGlrICBzcHJlY2hlbiwgIHdhZWhyZW5kCXNpZSAgZGFyYXVmICB3YXJ0ZW4sICBkYXNzICBkZXIgIFNwYXNzCithbmZhZW5ndC4gQmV0cmFjaHRlbiBTaWUgZGllIFN6ZW5lIHVuZCBzdGVsbGVuIFNpZSBzaWNoIHZvciwgIGRhc3MgIHN0YXR0ICBkZXIKK0ZhZXVzdGUgTWVzc2VyIHVuZCBEZWdlbiBpbSBFaW5zYXR6IHNpbmQsIGRhbm4ga29lbm5lbiBTaWUgc2ljaCBpbiAgRXNjYWx1c2VucworTGFnZSB2ZXJzZXR6ZW4sIGRlciBuaWNodHMgYW5kZXJlcyB3aWxsLCBhbHMgZW5kbGljaCBGcmllZGVuIGluIHNlaW5lciBTdGFkdCAtCit1bmQgYWxsZW4gTWVuc2NoZW4gZWluIFdvaGxnZWZhbGxlbi4KKworRXNjYWx1cyB3YXIgZWluIHByYWt0aXNjaGVyIE1hbm4sIGF1Y2ggd2VubiBpaG0gZGllIElkZWUgdm9uIGVpbmVtIFNwaWVsLCBkYXNzCitkaWUgR2VzY2hpY2tlIGRlciBNZW5zY2hoZWl0IGVudHNjaGllZGUsICBhdXNuZWhtZW5kICBndXQgIGdlZmllbC4gIE1vcmFsaXNjaGUKK1NrcnVwZWwgcGxhZ3RlbiBpaG4gd2VuaWdlciBhbHMgZGllIFByb2JsZW1lLCBkaWUgc2ljaCBhdXMgIGVpbmVyICBGb3J0c2V0enVuZworZGVzIFN0cmVpdHMgZXJnYWJlbi4gIkdlaHQgbWlyIGF1cyBkZW4gQXVnZW4gdW5kIHdpZWRlciBhbiBldXJlIEFyYmVpdCwgTGV1dGUuCitVbmQgIGJlbmVobXQgIGV1Y2ggIHdpZSAgTWVuc2NoZW4sICBzdGF0dCAgZXVjaCAgd2llICBUaWVyZSAgIGdlZ2Vuc2VpdGlnICAgenUKK3plcmZsZWlzY2hlbi4iIEVyICBzY2hpZWx0ZSAgZWluICB3ZW5pZywgIHVtICBiZWlkZSAgU2VpdGVuICBkZXMgIE1hcmt0cGxhdHplcworZ2xlaWNoemVpdGlnIHNjaGFyZiBpbnMgQXVnZSB6dSBmYXNzZW4uICJEYW1pdCBkYXMgZWluZSBrbGFyICBpc3Q6ICBJY2ggIGR1bGRlCituaWNodCwgZGFzcyBpaHIgZXVjaCB3ZWl0ZXJoaW4gZGFuZWJlbiBiZW5laG10LiBXZW5uIGljaCBlaW5lbgllcndpc2NoZSwgIGRlcgorc2ljaCBtaXQgZWluZW0gYW5kZXJlbiBzY2hsYWVndCwgc2NobGFnZSBpY2ggIG1pdCAgZGVyCUZhdXN0ICBkYXp3aXNjaGVuICB1bmQKK2xhc3NlIGlobiBhdWYgZGVyIFN0ZWxsZSBlbnRoYXVwdGVuLiBWZXJzdGFuZGVuPyIgIEVzY2FsdXMgIHdhcnRldGUgIHZlcmdlYmVucworYXVmICBkYXMgIHZlcmxlZ2VuZSAgRnVlc3Nlc2NoYXJyZW4sICBkYXMgIGVpbmUgIHNvbGNoZSAgIERyb2h1bmcgICBlaWdlbnRsaWNoCitoZXJ2b3JydWZlbiBzb2xsdGUuIExhbmdzYW0sIGVpbiB3ZW5pZyB3aWRlcnN0cmViZW5kIG1hY2h0ZW4gc2ljaCBkaWUgIEJ1ZXJnZXIKK3dpZWRlciBhdWYgZGVuIFdlZyB6dSBpaHJlbiBIYWV1c2VybiB1bmQgaWhyZXIgQXJiZWl0LiBDYXB1bGV0LCBpbW1lciBub2NoICBpbgorc2VpbmVtIGdhZW56bGljaCB1bnBhc3NlbmRlbiBNb3JnZW5tYW50ZWwsIGZvbGd0ZSBFc2NhbHVzIHp1IGRlc3NlbiBCdWVybywgIHVtCitkb3J0IHp1IGVpbmVyIEdlbGRzdHJhZmUgdmVyZG9ubmVydCB6dSB3ZXJkZW4sIGRlbm4gc2NobGllc3NsaWNoIHdhciAgYmVpICBkZW0KK1N0cmVpdCBlaW4gU2FjaHNjaGFkZW4JZW50c3RhbmRlbiwgIGRlbiAgRXNjYWx1cyAgZXJzZXR6dCAgc2VoZW4gIHdvbGx0ZS4gIEVzCitpbnRlcmVzc2llcnRlIEVzY2FsdXMgbmljaHQgaW0gZ2VyaW5nc3RlbiwgIHdlciAgZGVuICBTdHJlaXQgIGhldXRlICB2b20gIFphdW4KK2dlYnJvY2hlbiBoYXR0ZSwgc29sYW5nZSBlciBzb3dvaGwgdm9uIENhcHVsZXQJYWxzICBhdWNoICB2b24JTW9udGFndWUgIGVpbmUKK2ZpbmFuemllbGxlIEVudHNjaGFlZGlndW5nIGVyaGllbHQuIERhcmluIHVudGVyc2NoaWVkIHNpY2ggRXNjYWx1cyAgd2VuaWcgIHZvbgorZGVuIGhldXRpZ2VuIEtvbW11bmVuLCBkaWUgIHNpY2ggIGF1Y2gJbmljaHQgIGJlc29uZGVycyAgZGFydW0gIGt1ZW1tZXJuLCAgb2IKK05hY2hiYXJzIEh1bmQgYXVmIGRpZSBTdHJhc3NlIGxpZWYgdW5kIGRhbWl0IHVyc2FlY2hsaWNoIHZlcmFudHdvcnRsaWNoIGRhZnVlcgord2FyLCBkYXNzIEhlcnIgTXVlbGxlciBvZGVyIEZyYXUgU2NobWl0eiBnZWdlbglkaWUgIEFtcGVsICBmdWhyICAtICB6dW1pbmRlc3QKK3NvbGFuZ2UgbmljaHQsIHdpZSBkaWUgQW1wZWwgYmV6YWhsdCB3aXJkLgorCitMYXNzZW4gd2lyIGFsc28gRXNjYWx1cyBzZWluZW4gU2NoYWRlbmVyc2F0eiAga2Fzc2llcmVuICB1bmQgIGZvbGdlbiAgVWxvICB1bmQKK0F6enVybywgZGVuZW4gZXMgYXVmIGRlbSBNYXJrdHBsYXR6IHp1CWxhbmd3ZWlsaWcgIHd1cmRlLCAgYmlzICB6dSAgTW9udGFndWVzCitIYXVzLCB3byBzaWNoIEJlbmV2b2xpbyBIZXJybiBNb250YWd1ZSBnZWdlbnVlYmVyIHJlY2h0ZmVydGlnZW4gbXVzcy4KKworIkVocmxpY2gsIE9ua2VsLCBpY2ggaGF0dGUgdWViZXJoYXVwdCBuaWNodHMgbWl0IGRlciBnYW56ZW4gIEFuZ2VsZWdlbmhlaXQgIHp1Cit0dW4uIgorCisiRGFzIHNhZ3N0IGR1IGpldHp0LiIsIHJlZ3RlIHNpY2ggSGVyciBNb250YWd1ZSBhdWYuCisKK0ZyYXUgTW9udGFndWUgaGF0dGUgYWxzIGtsdWdlIEhhdXNmcmF1IG5pY2h0cyBkYWZ1ZXIgdWVicmlnLCB1ZWJlciAgdmVyZ29zc2VuZQorTWlsY2ggenUga2xhZ2VuLiAiV28gc3RlY2t0IGVpZ2VudGxpY2ggUm9tZW8/IgorCisiTGFzcyBSb21lbyBqZXR6dCwgTGllYnN0ZS4gQWxzbywgbWVpbiBsaWViZXIgTmVmZmUsIHdhcyB3YXIgbG9zPyIKKworIkFsc28sIGRhIHdhcmVuIGRpZXNlciBDYXB1bGV0LCBkZXIgIHNpY2ggIG1pdCAgU2Ftc29uICB1bmQgIEdyZWdvcnkgIGFuZ2VsZWd0CitoYXR0ZS4gT2ZmZW5iYXIgd29sbHRlIGVyIHNpY2ggcHJ1ZWdlbG4sIGFscyBpY2ggZGF6dSBrYW0uIgorCisiRWluZSBHZWxlZ2VuaGVpdCwgZGllIGR1IGRpciBuaWNodCBlbnRnZWhlbiBsYXNzZW4gIGtvbm50ZXN0LCAgbmljaHQgIHdhaHI/IiwKK2ZyYWd0ZSBIZXJyIE1vbnRhZ3VlIHNjaGFyZi4KKworIktlaW5lc3dlZ3MsIE9ua2VsLCBpY2ggaGFiZSBudXIgdmVyc3VjaHQsIGRpZSBkcmVpIHp1IHRyZW5uZW4uIFRqYSwgdW5kICBkYW5uCitrYW0gVHliYWx0IENhcHVsZXQgZGF6dS4iCisKKyJOdXIgZ3V0LCBkYXNzIFJvbWVvIG5pY2h0ICBkYWJlaSAgd2FyLCAgZGllc2VyICBUeWJhbHQgIGhhZXR0ZSAgaWhuICBhbSAgRW5kZQordmVybGV0enQuIiwgbGllc3Mgc2ljaCBGcmF1IENhcHVsZXQgdmVybmVobWVuLgorCisiRGllIHN0ZWxsdCBzaWNoIHZpZWxsZWljaHQgd2VnZW4gZGVzIEJlbmdlbHMgYW4uIiwga251cnJ0ZSBVbG8gdm9uIGVpbmVtIEFzdCwKK2RlciwgYWxzIGhhZXR0ZW4gZGllIEdvZXR0ZXIgaWhuIGV4dHJhIGRvcnQgd2FjaHNlbiBsYXNzZW4sIGdlcmFkZSBzbyB3ZWl0ICBhbgorZGFzIEZlbnN0ZXIgaGVyYW5yZWljaHRlLCBkYXNzCWRpZSAgYmVpZGVuICBUdXJ0ZWxrcmFlaGVuICBkYXMgIEdlc3ByYWVjaCAgaW0KK0lubmVybiBkZXMgSGF1c2VzIG1pdHZlcmZvbGdlbiBrb25udGVuLgorCisiU2llIGdpYnQgbmljaHQgYXVmLiIsIG1laW50ZSBBenp1cm8uICJXYXMgaGF0IHNpZSBkZW5uIG1pdCBkZW0gSnVuZ2VuPyIKKworIkFjaCwgd2FocnNjaGVpbmxpY2ggaXN0IGVyIHdpZWRlciBoaW50ZXIgaXJnZW5kZWluZXIgRnJhdSBoZXIgdW5kIGhldWx0ICBzaWNoCitkZXN3ZWdlbiBkaWUgQXVnZW4gYXVzLiIgVWxvIGhpZWx0IG5pY2h0IHZpZWwgdm9uIFJvbWVvLgorCisiRXIgaXN0IGhhbHQganVuZy4iIEF6enVybyBoYXR0ZSAgZnVlciAgZGFzICBWZXJoYWx0ZW4gIFJvbWVvcyAgZGV1dGxpY2ggIG1laHIKK1ZlcnN0YWVuZG5pcy4KKworIlR5YmFsdCBtaXNzdmVyc3RhbmQgZGllIFNpdHVhdGlvbiB1bmQgaG9lcnRlIG1pciBhdWNoIG5pY2h0IHp1LCAgYWxzICBpY2ggIGVzCitpaG0gZXJrbGFlcmVuIHdvbGx0ZS4iCisKKyJTaWVodCBpaG0gYWVobmxpY2guIiBIZXJyIE1vbnRhZ3VlIGthbm50ZSBUeWJhbHRzIHNjaGxlY2h0ZW4gUnVmLgorCisiTmFqYS4iLCAgbWFjaHRlICBCZW5ldm9saW8gIGdlZGVobnQuICAiSWNoICBtdXNzdGUgIG1pY2ggICBkb2NoICAgZ2VnZW4gICBpaG4KK3ZlcnRlaWRpZ2VuLiIKKworRXJpbm5lcm4gU2llIHNpY2gsIGxpZWJlIExlc2VyaW4sIGxpZWJlciAgTGVzZXIsICB3aWUgIEdyZWdvcnkJc2ljaCAgZWluZ2FuZ3MKK3VlYmVyIE5vdHdlaHIgYWV1c3NlcnRlPyBFciBoYXR0ZSBvZmZlbmJhciBFcmZvbGcgbWl0IHNlaW5lciBUYWt0aWsuICBOdXIgIG1pdAorQnVlcmdlcm1laXN0ZXIJRXNjYWx1cyAgaGF0ICBHcmVnb3J5ICBuaWNodCAgZ2VyZWNobmV0LiAgV2VubglIZXJyICBNb250YWd1ZQord3Vlc3N0ZSwgd2llIGRpZSBOb3R3ZWhyIHp1c3RhbmRlIGthbSwgem9lZ2UgZXIgZGllIEdlbGRzdHJhZmUsIGRpZSBlciBudW4gIHp1Cit6YWhsZW4gaGF0LCBzaWNoZXJsaWNoIHZvbiBHcmVnb3J5cyBTb2xkIGFiLgorCisiV28gaXN0IGRlbm4gbnVyIFJvbWVvPyIgRnJhdSBNb250YWd1ZSB3YXIgb2ZmZW5zaWNodGxpY2ggIG5pY2h0ICBiZXJlaXQsICBkaWUKK1NhY2hlIGF1ZiBzaWNoIGJlcnVoZW4genUgbGFzc2VuLgorCisiRXIgaGF0IHNpY2ggd2llZGVyIGVpbmdlc2NobG9zc2VuLiIsIGFudHdvcnRldGUgQmVuZXZvbGlvLgorCisiV2FzIGhlaXNzdCBkYXM/IiwgdmVybGFuZ3RlIEZyYXUgIE1vbnRhZ3VlICBtaXQgIGRlciAgVmVydmUgIGVpbmVyICBiZXNvcmd0ZW4KK011dHRlciB6dSB3aXNzZW4uCisKKyJXZWlzcyBzaWUgZXMgYW0gRW5kZSB3aXJrbGljaCBuaWNodD8iLCB1ZWJlcmxlZ3RlIFVsbyBsYXV0LgorCisiV2FocnNjaGVpbmxpY2ggbmljaHQuIE11ZXR0ZXIgbmVobWVuIGphIGltbWVyIG51ciBkYXMgYmVzdGUgdm9uIGlocmVuIEtpbmRlcm4KK2FuLiIgQXp6dXJvIHp1Y2t0ZSBtaXQgZGVuIFNjaHVsdGVybi4KKworIkVzIGhlaXNzdCwgZGFzcyBlciBzaWNoIGluIHNlaW5lbSBaaW1tZXIgIGVpbmdlc2NobG9zc2VuICB1bmQgIGRpZSAgVm9yaGFlbmdlCit6dWdlem9nZW4gaGF0LiIsIGFudHdvcnRldGUgQmVuZXZvbGlvLgorCisiRXIgIGhhdCAgZGllICBWb3JoYWVuZ2UgIHp1Z2V6b2dlbj8iICBGcmF1ICBNb250YWd1ZSAgbW9jaHRlICBhbiAgZWluICAgc29sY2gKK3Vuc2l0dGxpY2hlcyBWZXJoYWx0ZW4gYmVpIGlocmVtICBTb2huCW5pY2h0ICBnbGF1YmVuLiAgV2llICBJaG5lbiAgamVkZXJtYW5uCitiZXN0YWV0aWdlbiBrYW5uLCBzaW5kIGFtIGhlbGxpY2h0ZW4gVGFnZSB6dWdlem9nZW5lIFZvcmhhZW5nZSBlaW4gIGRldXRsaWNoZXMKK0FuemVpY2hlbiAgbGllZGVybGljaGVuICBMZWJlbnN3YW5kZWxzLCAgZGVuICBGcmF1ICBNb250YWd1ZSAgaWhyZW0gIFNvaG4gIG5pZQorZ2VzdGF0dGV0IGhhZXR0ZS4gWnVtaW5kZXN0LCBzbyBrb2VubmVuIFNpZSBlcyBpbiBqZWRlbSBEb3JmIGxlcm5lbiwgemllaHQgbWFuCittb3JnZW5zIGRpZSBWb3JoYWVuZ2UgYXVmIHVuZCB3YWhydCBkYW1pdCBkZW4gU2NoZWluLgorCisiU2FnZSBpY2ggZG9jaCwgbGllYmUgIFRhbnRlLiAgQXVzc2VyZGVtICBoYXQgIGVyICBlaW5lbiAgcmllc2lnZW4gIFZvcnJhdCAgYW4KK1Rhc2NoZW50dWVjaGVybi4iCisKKyJXYXMgd2lsbCBlciBkZW5uIGRhbWl0PyIsIHdvbGx0ZSBudW4gYXVjaCBIZXJyIE1vbnRhZ3VlIHdpc3Nlbi4KKworIklzdCBkb2NoIGtsYXIuIiwgbXVybWVsdGUgQXp6dXJvLgorCisiS29tbSwgZGFzIG11c3MgaWNoIG1pciBhbnNlaGVuLiIgVWxvIGdyaW5zdGUgaGFlbWlzY2guCisKK1NpZSBmbG9nZW4gdW0gZGFzIEhhdXMgaGVydW0sIGRlbm4gIGltCUdlZ2Vuc2F0eiAgenVtCVdvaG56aW1tZXIgIGxhZ2VuICBkaWUKK1NjaGxhZnppbW1lciBhdWYgZGVyIFJ1ZWNrc2VpdGUgZGVzIEhhdXNlcywgenVtIEdhcnRlbiBoaW5hdXMuCisKKyJIb2VyIGRpciBkYXMgYW4hIiBVbG8gaGF0dGUgaWhyZSBoZWxsZSBGcmV1ZGUgYW4gUm9tZW9zIGxhdXRlbSAgR2VqYW1tZXIgIHVuZAorR2VzdG9laG5lLgorCisiV2FzIGhhdCBlciBkZW5uLCBkZXIgYXJtZSAgS2xlaW5lLiIgIEF1Y2ggIEF6enVybyAgaGF0dGUgIGtlaW4gIE1pdGxlaWQgIGZ1ZXIKK01lbnNjaGVuLCBkaWUgZXMgc28gc2VociB1ZWJlcnRyaWViZW4uCisKKyJFciBoYXQgTGllYmVza3VtbWVyLiIKKworIk9jaCwgZGEgX3R1dF8gZXIgbWlyIGFiZXIgbGVpZC4iCisKKyJBY2gsIFJvc2FsaW5lISIsIGVyc2Nob2xsIGVzIHZvbiBkcmlubmVuLCBnZWZvbGd0IHZvbiBlaW5lbSB0aWVmZW4gU2V1Znplci4KKworIlJvc2FsaW5lIGhlaXNzdCBzaWUgYWxzby4iLCBiZW1lcmt0ZSBVbG8gdWViZXJmbHVlc3NpZ2Vyd2Vpc2UuCisKKyJOaWNodCBKdWxpYT8iCisKKyJOb2NoIG5pY2h0LCBkYXMga29tbXQgZXJzdCBub2NoLiIKKworUm9tZW8sIGRlciBkZW4gS29wZiBhdXMgZGVtIEZlbnN0ZXIgZ2VzdGVja3QgaGF0dGUsICB3YXJmICBlaW5lbiAgdmVyYmx1ZWZmdGVuCitCbGljayBhdWYgZGllICBLcmFlaGVuLiAgIk9oICBuZWluLCAgbWVpbmUgIGVpbnppZ2UgIHVuZCAgd2FocmUgIExpZWJlICBoZWlzc3QKK1Jvc2FsaW5lLiIKKworQXp6dXJvIHVlYmVybGVndGUsIHdpZSBlciBzZWluZW4gRmVobGVyIHdpZWRlciB3ZXR0IG1hY2hlbiBrb25udGUuIEVyICBzY2hhdXRlCitzY2huZWxsIHp1IFVsbywgZG9jaCBhdWNoIGRpZXNlIHNjaGllbiB6dSBiZXRyb2ZmZW4genUgc2VpbiwgdW0gc2VpbiAgVmVyZ2VoZW4KK2dlZ2VuIGRpZSAgZWxlbWVudGFyc3RlbiAgUmVnZWxuICBkZXMgIFR1cnRlbGtyYWVoZW5kYXNlaW5zICBkZW4gIEdvZXR0ZXJuICB6dQorcGV0emVuLgorCisiR2FueiBiZXN0aW1tdCBpc3Qgc2llIGRhcy4iLCB2ZXJzaWNoZXJ0ZSBBenp1cm8gc2NobmVsbC4gICJTaWUgIGlzdCAgamEgIGF1Y2gKK3d1bmRlcnNjaG9lbi4iCisKK0VyIHRyaXBwZWx0ZSB2ZXJsZWdlbiB2b24gZWluZW0gRnVzcyBhdWYgZGVuIGFuZGVyZW4uCisKKyJKYSwgZGFzIGlzdCBzaWUuIEFiZXIgd2VyIGlzdCBKdWxpYT8iCisKKyJEYXMgYnJhdWNodCBkaWNoIGRvY2ggbmljaHQgenUgaW50ZXJlc3NpZXJlbiwgc2NobGllc3NsaWNoIGlzdCBSb3NhbGluZSBkZWluZQorZWluemlnZSBMaWViZS4iCisKKyJIbS4iIFJvbWVvIHVlYmVybGVndGUgZWluZW4gTW9tZW50LCBkYW5uIGJyYWNoIGVyIHdpZWRlciBpbiBUcmFlbmVuIGF1cy4gIkphLAorZGFzIGlzdCBzaWUuIFVuZCBuaWUgaGF0IGVpbiBNYW5uIGVpbmUgc28gaGVyemxvc2UgRnJhdSBnZWxpZWJ0LiIKKworIlNpZSBpc3QgZ2VtZWluIHp1IGRpcj8iLCBmcmFndGUgQXp6dXJvLgorCisiR2VtZWluIGlzdCBnYXIga2VpbiBBdXNkcnVjay4gQWNoLCB3ZW5uIGljaCBudXIgd3Vlc3N0ZSwgd2FzIGljaCB0dW4gbXVzcywgdW0KK3NpZSB6dSB1ZWJlcnJlZGVuLiIKKworQmVuZXZvbGlvICBib2xsZXJ0ZSAgZ2VnZW4gIFJvbWVvcyAgVHVlciAgdW5kICB2ZXJsYW5ndGUgIHZvbiAgc2VpbmVtCUNvdXNpbgorZWluZ2VsYXNzZW4genUgd2VyZGVuLCB3YXMgVWxvIHVuZCBBenp1cm8genVtIEFubGFzcyBuYWhtZW4sIHNpY2ggIHNjaGxldW5pZ3N0Cit6dSB2ZXJkcnVlY2tlbi4KKworIkR1IGJpc3Qgd29obCB3YWhuc2lubmlnIGdld29yZGVuISIsIHNjaG5hdXp0ZSBVbG8gaWhyZW4gR2VmYWVocnRlbiBhbi4KKworIldlciBhaG50IGRlbm4sIGRhc3MgZGVyIGR1bW1lIEtlcmwgYXVzZ2VyZWNobmV0ICBpbiAgZGllc2VtICBNb21lbnQgIGF1cyAgZGVtCitGZW5zdGVyIGd1Y2t0LiIgdmVydGVpZGlndGUgc2ljaCBBenp1cm8uCisKKyJIb2ZmZW50bGljaCBnZWh0IGRhcyBndXQuIgorCisiQWNoLCBkYSBtYWNoIGRpciBtYWwga2VpbmUgU29yZ2VuLiBTbyAgd2llICBkZXIgIEp1bmdlICBnZWJhdXQgIGlzdCwgIGhhdCAgZXIKK1Jvc2FsaW5lIHVuZCBKdWxpYSBtb3JnZW4gdmVyZ2Vzc2VuIHVuZCByZW5udCBlaW5lciBkcml0dGVuIGhpbnRlcmhlci4iCisKKyJXaWUga29tbXN0IGR1IGRlbm4gZGFyYXVmPyIKKworIklzdCBkb2NoIGtsYXIuIEVyIGlzdCBhY2h0emVobiwgYXVzIGd1dGVyIEZhbWlsaWUgdW5kIHJlaWNoLiBXaWUgc29sbHRlIGVyIGRhCituaWNodCBhdXNyZWljaGVuZCBNYWVkY2hlbiBmaW5kZW4sIGRlbmVuIGVyIHVudGVyIGRpZSAgUm9lY2tlICBzY2hhdWVuCWthbm4/IgorQXp6dXJvIGJsaWNrdGUgYXVmIHNlaW5lbiBlaWdlbmVuIHJlaWNoZW4gRXJmYWhydW5nc3NjaGF0eiB6dXJ1ZWNrLgorCisiRHUgZGVua3N0IGF1Y2ggaW1tZXIgZGFzIHNjaGxlY2h0ZXN0ZS4iCisKKyJBYmVyIG5laW4uIFNvIHNpbmQgZGllIGp1bmdlbiBCdXJzY2hlbiBudW4gbWFsLiBGdWVyIGlobiBpc3QgZXMgZWluZmFjaCBjaGljLAorTGllYmVza3VtbWVyIHp1IGhhYmVuLiIKKworIkd1dCwgZGFzcyBkdSBkYXMgaGludGVyIGRpciBoYXN0LiIgIFVsb3MgIFN0aW1tZSAgbGllc3MgIHZlcm11dGVuLCAgZGFzcyAgc2llCitkaWVzZW4gU2F0eiBhbHMgTWFobnVuZyB2ZXJzdGFuZGVuIHdpc3NlbiB3b2xsdGUuCisKKyJIb2VmaXNjaGUgTWlubmUgaGF0IG1pciBub2NoIG5pZSBnZWxlZ2VuLiIsIHZlcnRlaWRpZ3RlIHNpY2ggQXp6dXJvLgorCisiSmEsIGljaCB3ZWlzcy4iIFVsbyBzZXVmenRlIHVuZCBnYWIgc2ljaCBmdWVyIGVpbmlnZSB3ZW5pZ2UgQXVnZW5ibGlja2UgaWhyZW4KK1RyYWV1bWVuIGhpbi4KKworIkhvZXIgYXVmIGRhbWl0LCBkdSB3ZWlzc3QgamEgZ2FyIG5pY2h0LCB3b3ZvbiBkdSBkYSB0cmFldW1zdC4iIEF6enVybyAga2FubnRlCitzZWluZSBHZWZhZWhydGluLgorCisiQWNoLCB3ZWlzcyBpY2ggbmljaHQ/IgorCisiTmVpbi4gV2VubiBkdSBnZXdvbGx0IGhhZXR0ZXN0LCBkYXNzIGljaCBkaWNoIG1pbm5lLCBkYW5uICBoYWV0dGVzdCAgZHUgIG1pY2gKK25pZW1hbHMgZXJob2VyZW4gZHVlcmZlbi4iCisKKyJIbSwgaGFldHRlIGljaCBiZXNzZXIgZ2V0YW4sIGphLiIKKworIlZlcnN0ZWggZG9jaC4gSWNoIGxpZWJlIGRpY2ggIGphLCAgYWJlciAgaWNoICBtaW5uZSAgZGljaCAgbmljaHQuICBadXIgIE1pbm5lCitnZWhvZXJ0LCBkYXNzIG1hbiBkaWUgYW5nZWJsaWNoZSBHZWxpZWJ0ZSBuaWUgYmVrb21tZW4ga2Fubi4iCisKKyJXaWUga29tbXN0IGR1IGRlbm4gZGFyYXVmPyIKKworIk5hLCBNaW5uZSBoYXQgbmljaHQgdmllbCBtaXQgIGVyZnVlbGx0ZXIgIExpZWJlICB6dSAgdHVuLCAgc29uZGVybiAgbWVociAgbWl0CitBdXMtRGVyLUZlcm5lLSBTY2htYWNodGVuLiIKKworIk9oPyIgVWxvcyBTdGltbWUgYmVrYW0gZWluZSBkZXV0bGljaGUgU3BpdHplLiAiRHUgdmVybWlzc3QgbWljaCAgYWxzbyAgbmljaHQsCit3ZW5uIGljaCBuaWNodCBiZWkgZGlyIGJpbj8iCisKKyJEdSBiaXN0IGRvY2ggbmllIHZvbiBtaXIgd2VnLiIsIHZlcnRlaWRpZ3RlICBzaWNoICBBenp1cm8uICAiVW5kICB1ZWJlcmhhdXB0LAorbGVuayBuaWNodCB2b20gVGhlbWEgYWIuIgorCisiV2VyIGxlbmt0IGRlbm4gIGhpZXIgIGFiPyAgV2FocnNjaGVpbmxpY2ggIHZlcmdudWVnc3QgIGR1ICBkaWNoICBvaG5laGluICBtaXQKK2lyZ2VuZGVpbmVtIFNwYXR6ZW5mbGl0dGNoZW4sIHdlbm4gaWNoIG1hbCBuaWNodCBpbiBkZXIgTmFlaGUgYmluLiIKKworQXp6dXJvLCBkZXIgZ2VuYXUgIHd1c3N0ZSwgIHdlbGNoZSAgUmljaHR1bmcgIGRpZSAgRGlza3Vzc2lvbiAgbmVobWVuICB3dWVyZGUsCitiZXRyYWNodGV0ZSBiZXRvbnQgaW50ZXJlc3NpZXJ0IGRpZSBWb3JnYWVuZ2UgaW5uZXJoYWxiIFJvbWVvcyBaaW1tZXIgdW5kICB6b2cKK2VzIHZvciwgbmljaHQgenUgYW50d29ydGVuLgorCitCZW5ldm9saW8gaGF0dGUgZXMgaW56d2lzY2hlbiBnZXNjaGFmZnQsIFJvbWVvIGRhenUgenUgdWViZXJyZWRlbiwgZGllIFR1ZXIgenUKK29lZmZuZW4gdW5kIGlobiBlaW56dWxhc3Nlbi4gIkd1dGVuICBNb3JnZW4sICBSb21lby4iLCAgYmVncnVlc3N0ZSAgZXIgIHNlaW5lbgorVmV0dGVyIGZyb2VobGljaC4KKworIklzdCBlcyBkZW5uIE1vcmdlbj8iLCBmcmFndGUgUm9tZW8gZHVlc3Rlci4KKworIlVuZCB3YXMgZnVlciBlaW5lci4gTG9zLCBtYWNoIGRpZSBWb3JoYWVuZ2UgYXVmIHVuZCBzY2hhdSBkaXIgZGVuIHd1bmRlcmJhcmVuCitTb25uZW5zY2hlaW4gYW4uIEhvZXIgbnVyLCB3aWUgZGllIFZvZWdlbCBzaW5nZW4uIiBCZW5ldm9saW8gcmlzcyBkaWUgc2Nod2VyZW4KK1ZvcmhhZW5nZSB6dXIgU2VpdGUgdW5kIGVyYmxpY2t0ZSBkaWUgYmVpZGVuIEtyYWVoZW4uICJOYWphLCB2aWVsbGVpY2h0IHNpbmdlbgorc2llIG5pY2h0IGdhbnogc28gc2Nob2VuLCBhYmVyIGRpZSBTb25uZSBzY2hlaW50IGF1ZiBqZWRlbiBGYWxsLiIKKworIkVzIGlzdCBzY2hyZWNrbGljaCwgYWJlciBpY2ggYmluIHNvIHRyYXVyaWcsIGRhc3MgaWNoIGdhciBuaWNodCAgc2VoZW4gIHdpbGwsCit3aWUgZGllIFNvbm5lIHNjaGVpbnQsIGRlbm4gZGFzIHNpZWh0IHNvIGF1cywgYWxzIHdvbGxlIHNpZSBtaWNoIHZlcnNwb3R0ZW4uIgorCisiS2VpbmVzd2VncyAgd2lsbCAgc2llICBkYXMuICBTaWUgIGhhdCAgbmljaHRzICBhbmRlcmVzICBpbSAgU2lubiwgIGFscyAgIGRpY2gKK2F1Znp1aGVpdGVybi4iCisKKyJJc3QgZXIgaXJyZT8iLCBmcmFndGUgVWxvIGxlaXNlLgorCisiQWJlciBuZWluLiBBbiAgaWhtICBpc3QgIGJsb3NzICBlaW5lICBLcmFua2Vuc2Nod2VzdGVyICB2ZXJsb3JlbiAgZ2VnYW5nZW4uIiwKK2JlbWVya3RlIEF6enVyby4KKworIldhcyBtYWNodCBkaWNoIGRlbm4gc28gdHJhdXJpZywgUm9tZW8/IFdpbGxzdCBkdSAgZXMgIG1pciAgbmljaHQgIGVyemFlaGxlbj8iCitmcmFndGUgQmVuZXZvbGlvLgorCisiRXIgaXN0IHdpcmtsaWNoIGVpbiBTY2hhZXR6Y2hlbi4iIEJlbmV2b2xpbyAgaGF0dGUgIHVuendlaWZlbGhhZnQgIFVsb3MgIEhlcnoKK2Z1ZXIgc2ljaCBnZXdvbm5lbi4KKworIkVpbiAgUHN5Y2hpYXRlciAga29lbm50ZSAgZXIgIGF1Y2ggIHNlaW4uIiAgQXp6dXJvICBrb25udGUgIGRlbSAgZnJldW5kbGljaGVuCitCZW5ldm9saW8gbmljaHQgZ2FueiBzbyB2aWVsIGFiZ2V3aW5uZW4uCisKKyJNaXIgaXN0ICBsYW5nd2VpbGlnLCAgd2VpbCAgaWNoICBkYXMgIG5pY2h0ICBoYWJlLCAgd2FzICBtaXIgIGRpZSAgTGFuZ2V3ZWlsZQordmVydHJlaWJ0LiIsIGFudHdvcnRldGUgUm9tZW8uCisKKyJFciB3aWxsIGVpbmUgTW9kZWxsZWlzZW5iYWhuPyIsIHZlcm11dGV0ZSBBenp1cm8uCisKK0JlbmV2b2xpbyBoYXR0ZSBvZmZlbmJhciBlYmVuZmFsbHMgIGtlaW5lICBWb3JzdGVsbHVuZwl2b24gIGRlbSwgIHdhcwlzZWluZW0KK0ZyZXVuZCBkaWUgTGFuZ2V3ZWlsZSB2ZXJ0cmVpYmVuIGtvZW5udGUuICJXYXMgbGllYnN0IGR1IGRlbm4gc28gc2Vocj8iCisKKyJOaWNodCB3YXMsIHNvbmRlcm4gd2VuLiIKKworIkxpZWJlIGlzdCBkb2NoIGV0d2FzIHNjaG9lbmVzLCB3YXJ1bSBtYWNodCBzaWUgZGljaCBibG9zcyBzbyB0cmF1cmlnPyIKKworIldlaWwgaWNoIExpZWJlIGdlYmUgdW5kICBrZWluZSAgYmVrb21tZS4gIEljaCAgZnVlaGxlICBtaWNoICB3aWUgIGVpbmUgIGxlZXJlCitGbGFzY2hlLiBEYXMsIHdhcyBlaW5tYWwgaW4gbWlyIHdhciwgd29sbHRlbiBhbGxlIGhhYmVuLCBhYmVyICBqZXR6dCwgIGRhICBpY2gKK251ciBub2NoIGVpbmUgbGVlcmUgRmxhc2NoZSBiaW4sIGdpYnQgIGVzICBuaWVtYW5kZW4gIG1laHIsICBkZXIgIG1pY2gJd2llZGVyCitmdWVsbGVuIHd1ZXJkZS4iCisKKyJFaW5lIEZsYXNjaGUgaXN0IGVyIGFsbGVyZGluZ3MuIiwgYmVtZXJrdGUgVWxvLgorCisiTmVpbiwgaXN0IGVyIG5pY2h0LiIsIHdpZXMgQmVuZXZvbGlvIHNpZSBzdHJlbmcgenVyZWNodC4gIk1vbWVudCwgIHNlaXQgIHdhbm4KK2tvZW5uZW4gS3JhZWhlbiByZWRlbj8iCisKKyJTZWl0IE1hZW5uZXIgRmxhc2NoZW4gc2luZC4iLCB2ZXJzZXR6dGUgVWxvIHNjaG5pcHBpc2NoLgorCisiTGFzcyBkb2NoIGRpZSBibG9lZGVuIEtyYWVoZW4sIEJlbmV2b2xpby4iIFJvbWVvIG1vY2h0ZSBlcyAgZ2FyICBuaWNodCwgIHdlbm4KK21hbiBzaWNoIG5pY2h0IHNvIGxlaWNodCB2b24gaWhtIGFibGVua2VuIGxpZXNzLgorCitBenp1cm8gc3RpZXNzIFVsbyBtaXQgZWluZW0gZ2Vrb25udGVuIFNjaHVicyB2b20gQXN0IHVuZCB0cmllYglzaWUgIHp1ICBlaW5lbQorQmF1bSBpbiBzaWNoZXJlciBFbnRmZXJudW5nIHZvbiBSb21lb3MgWmltbWVyLiAiSGFsdCAgYmxvc3MgIGRlaW5lbiAgdm9ybGF1dGVuCitTY2huYWJlbCEiCisKKyJFciBoYXQgdW5zIGJsb2VkIGdlbmFubnQuIgorCisiSmEuIgorCisiVW5kIGRhcyBhZXJnZXJ0IG1pY2guIgorCisiQWhhPyIKKworIldlaWwgaWNoIG5pY2h0IGJsb2VkIGJpbi4iCisKKyJEdSBkYXJmc3QgaW4gX2locmVtXyBCZWlzZWluIHRyb3R6ZGVtIGtlaW5lICBLb21tZW50YXJlICBtYWNoZW4sICBkYXMgIHdlaXNzdAorZHUuIgorCisiUGFoLiIKKworIldlaXNzdCBkdSBlcywgb2RlciBuaWNodD8iCisKKyJKYSwgaWNoIHdlaXNzIGVzLiBBYmVyIGVyIGlzdCB3aXJrbGljaCBlaW5lIEZsYXNjaGUuIgorCisiRGFzIGhhYmUgaWNoIG5pY2h0IGJlc3RyaXR0ZW4uIFdlbm4gZHUgamV0enQgZGVpbmVuIHZvcmxhdXRlbiBTY2huYWJlbCBoYWx0ZW4KK2thbm5zdCwga29lbm5lbiB3aXIgd2llZGVyIHp1cnVlY2sgdW5kIHVucyBkZW4gUmVzdCBhbnNlaGVuLiIKKworVWxvIGFudHdvcnRldGUgbmljaHQsIHNvbmRlcm4gZmxvZyB3aWVkZXIgenUgaWhyZW0gQXN0IHVuZCBzcGFlaHRlICBkdXJjaCAgZGFzCitGZW5zdGVyIGF1ZiBkaWUgenVja2VuZGVuIFNjaHVsdGVybiBCZW5ldm9saW9zLgorCisiTGFjaHN0IGR1IG1pY2ggYXVzPyIsIGZyYWd0ZSBSb21lby4KKworIk1pdG5pY2h0ZW4uIiBCZW5ldm9saW9zIFN0aW1tZSBrbGFuZyBzbyBlcm5zdCwgZGFzcyAgc2VsYnN0ICBpbiAgVWxvICBad2VpZmVsCitlcndhY2h0ZW4uCisKKyJFaWdlbnRsaWNoIHdlaW5lIGljaC4iCisKKyJXYXJ1bSBkZW5uIGRhcz8iCisKKyJXZWlsIGR1IHNvIGFybSBkcmFuIGJpc3QsIGxpZWJlciBSb21lby4iCisKKyJIb2VyIGF1ZiwgYml0dGUuIFdlbm4gZHUgamV0enQgYXVjaCBub2NoIHdlaW5zdCwgZnVlaGxlICBpY2ggIG1pY2ggIG51ciAgbm9jaAorZWxlbmRlci4gV2VubiBkYXMgdWViZXJoYXVwdCBnZWh0LiIKKworIkphamEsIHNvIGdlaHQgZGFzIG1pdCBkZXIgTGllYmUuIiBCZW5ldm9saW8gZ3JpbnN0ZSBkdWVtbWxpY2guCisKKyJKYSwgZ2VuYXUgc28uIExpZWJlLCBkYXMgaXN0IGVpbiBNZWVyLiIKKworIkVpbiBNZWVyPyBXaWUga29tbXN0IGR1IGRlbm4gZGFyYXVmPyIKKworQXp6dXJvIGxpZXNzIHNpY2ggbmViZW4gVWxvIG5pZWRlci4KKworIkFjaHR1bmcsIFJvbWVvIHdpcmQgcG9ldGlzY2guIiwgd2FybnRlIFVsbyBpaHJlbiBHZWZhZWhydGVuLgorCisiRWluIE1lZXIsIHdlaWwgVHJhZW5lbiBzYWx6aWcgc2luZCB1bmQgIHJlaWNobGljaCAgZmxpZXNzZW4sICB3ZW5uICBMaWViZSAgaW0KK1NwaWVsIGlzdC4iCisKKyJBaGEuIEphLCBpY2ggZ2xhdWJlLCBpY2ggd2Vpc3MsIHdhcyBkdSBtZWluc3QuIiBCZW5ldm9saW8gd2FyIHByb3NhaXNjaGVyIGFscworc2VpbiBGcmV1bmQuCisKKyJJY2ggZ2xhdWJlLCBpY2ggbWFjaGUgIGVpbmVuICBTcGF6aWVyZ2FuZy4iICBSb21lbyAgbWFjaHRlICBrZWluZSAgQW5zdGFsdGVuLAorYXVmenVzdGVoZW4sIHNvbmRlcm4gc2V1Znp0ZSBudXIgdGllZi4KKworIkltbWVyIGxhbmdzYW0sIGljaCB3ZWlzcyBkb2NoIG5vY2ggbmljaHQgYWxsZXMsIGRhcyAgd2FlcmUgIGdlbWVpbiwgIHdlbm4gIGR1CittaWNoIGpldHp0IHNvIHN0ZWhlbiBsaWVzc2VzdC4iCisKKyJJY2ggYmluIHNvd2llc28gbmljaHQgaGllci4gRGVyIGVjaHRlIFJvbWVvIGlzdCB3b2FuZGVycy4iCisKKyJVbmQgd28/IgorCisiRHUgd2lsbHN0IHdvaGwgd2lzc2VuLCB3aWUgc2llIGhlaXNzdD8iCisKKyJHdXQgZ2Vmb2xnZXJ0LCBsaWViZXIgV2F0c29uLiIKKworIkljaCB3ZXJkZSBub2NoIHdhaG5zaW5uaWchIiwgc3RvZWhudGUgQXp6dXJvLgorCisiV2FzIGlzdCBkZW5uIGxvcz8iIFVsbyB3YXJmIGlobSBlaW5lbiB2ZXJ3aXJydGVuIEJsaWNrIHp1LgorCisiRGF1ZXJuZCB6aXRpZXJlbiBzaWUgYXVzIGZyZW1kZW4gUXVlbGxlbiwgZGFzIG1hY2h0IG1pY2ggaXJyZS4iCisKKyJLZWluZSBTb3JnZSwgZHUgd2lyc3QgZGljaCBuaWNodCBhbmRlcnMgZnVlaGxlbiBhbHMgdm9yaGVyLiIgVWxvIGdyaW5zdGUuCisKKyJBbHNvIHNvbGwgaWNoIGRpciB2b3JzdG9laG5lbiwgd2llICBzaWUgIGhlaXNzdD8iLCAgZnJhZ3RlICBSb21lbyAgbWl0ICBlaW5lbQorR3JpbnNlbi4KKworIkVzIHJlaWNodCwgd2VubiBkdSBlcyBtaXIgZWluZmFjaCBzYWdzdC4iLCBhbnR3b3J0ZXRlIEJlbmV2b2xpby4KKworIktsYXIsIGljaCBtYWNoZSBqZXR6dCB2b2VsbGlnIGVpbmZhY2ggbWVpbiBUZXN0YW1lbnQuIgorCisiTmFuYSwgc28gd2VpdCBpc3QgZXMgbm9jaCBuaWNodC4gRHUgYmlzdCBqYSBub2NoICBncnVlbiAgaGludGVyICBkZW4gIE9ocmVuLiIKK0JlbmV2b2xpbyBsYWNodGUuCisKKyJQZmZ0LiIsIG1hY2h0ZSBSb21lby4gIlNvIGdydWVuIGJpbiBpY2ggbmljaHQgbWVociwgZGFzcyBpY2ggbmljaHQgd2Vpc3MsIHdpZQorbWFuIGxpZWJ0LiIKKworIkRhcyB3aWVkZXJ1bSBoYWJlIGljaCBuaWNodCBiZXp3ZWlmZWx0LiBOdW4gc2FnIGVuZGxpY2gsIHdpZSBoZWlzc3Qgc2llPyIKKworIlNpZSBpc3QgZWluZSBGcmF1LiIKKworIkhtLCAgZGFjaHRlICBpY2ggIG1pci4gIFp1bWluZGVzdCAgaGF0dGUgIGljaCAga2VpbmVuICBHcnVuZCwgIGV0d2FzICBhbmRlcmVzCithbnp1bmVobWVuLiIKKworUm9tZW8gc3RyZWNrdGUgc2VpbmVtIFZldHRlciBkaWUgWnVuZ2UgaGVyYXVzLiAiVW5kIHNjaG9lbiBpc3Qgc2llIGF1Y2guIgorCisiRXMgd2FyIG1pciBlYmVuZmFsbHMga2xhciwgZGFzcyBkdSBrZWluIEtvc3R2ZXJhZWNodGVyIGJpc3QuIgorCisiTmVpbiwgaWNoIHZlcmh1bmdlcmUgbGllYmVyLiBTaWUgd2lsbCBtaWNoIG5pY2h0LiIKKworIktsdWcgdW5kIGdlc2NoaWNrdCBpc3Qgc2llIGFsc28gYXVjaCBub2NoPyIKKworIlNvIGdlc2NoaWNrdCwgZGFzcyBDdXBpZG9zIFBmZWlsIHNpZSBuaWNodCB0cmlmZnQuIEltbWVyIGR1Y2t0IHNpZSBzaWNoIHdlZy4iCisKK1dpciAgd29sbGVuICBoaWVyICBhbm1lcmtlbiwgIGRhc3MgICBhdWNoICAgQ3VwaWRvICAgenUgICBqZWRlciAgIGFuc3RhZW5kaWdlbgorTGllYmVzZ2VzY2hpY2h0ZSBnZWhvZXJ0LiBBdWNoIHp1IGRlbiB1bmFuc3RhZW5kaWdlbiwgYWJlciB2b24gZGVuZW4gcmVkZW4gd2lyCitoaWVyIGxpZWJlciBuaWNodCwgZGVubiBlcyBtYWcgamEgc2VpbiwgZGFzcyB1bnRlciAgSWhuZW4sICBsaWViZSAgTGVzZXJpbm5lbiwKK2xpZWJlIExlc2VyLCBNaW5kZXJqYWVocmlnZSBzaW5kLiBLZW5uZW4gU2llIEN1cGlkbz8gRGFzIGlzdCBkZXIga2xlaW5lLCBkaWNrZQordW5kIG5hY2t0ZSBCZW5nZWwsIGRlbiBTaWUgYXVmIGZhc3QgamVkZW0gYmFyb2NrZW4gIEJpbGQgIGJldHJhY2h0ZW4gIGtvZW5uZW4uCitEYW1hbHMgaGF0dGUgbWFuIGVpbmUgVm9ybGllYmUgZnVlciBkYXMgS2VybGNoZW4sIHdlaWwgZWluICBuYWNrdGVyICBTYWV1Z2xpbmcKK21pdCBlaW5lbSAgQm9nZW4gIGVpbmZhY2ggIGx1c3RpZyAgYXVzc2llaHQuICBBdWYgIGRpZXNlICBXZWlzZSAgZ2FiZW4JdW5zZXJlCitWb3JmYWhyZW4gZGVtIGltIEdydW5kZSBlcm5zdGVuIERpbmcgTGllYmUgbm9jaCBlaW5lIGFtdWVzYW50ZSBXZW5kdW5nLiAgQml0dGUKK3ZlcndlY2hzZWxuIFNpZSB1bnNlcmVuIGtsZWluZW4gRnJldW5kIG5pY2h0IG1pdCBkZW4gIEVuZ2VsbiwgIGRpZSAgc2luZCAgendhcgorYXVjaCBuYWNrdCwga2xlaW4gIHVuZAlkaWNrLCAgaGFiZW4gIGFiZXIgIGtlaW5lbiAgQm9nZW4gIGluICBkZW4gIHB1bW1lbGlnZW4KK0ZhZXVzdGNoZW4uCisKK1JvbWVvIHN0ZWxsdCBzaWNoIEN1cGlkbyBub2NoIG5pY2h0IGdhbnogc28gZGljayB2b3IsIGRhZnVlciBzaW5kIHNlaW5lICBBdWdlbgordmVyYnVuZGVuLiBadSAgUm9tZW9zICBaZWl0ZW4sCWluICBqZW5lciAgbXl0aGlzY2hlbiAgdW5kICBzbwlnYW56ICB1bmQgIGdhcgordW53aXJrbGljaGVuIFplaXQsIHNhaCBDdXBpZG8gbm9jaCBuaWNodCwgd2VuIGVyIG1pdCBzZWluZW4gUGZlaWxlbiB0cmFmLiAgTWFuCitrb2VubnRlIGRlbmtlbiwgZGFzcyBkaWVzIHp1IGFsbGVybGVpIFZlcndpcnJ1bmcgZ2VmdWVocnQgIGhhYmVuICBtdXNzLCAgZXR3YSwKK3dlbm4gc2VpbiAgUGZlaWwgIGVpZ2VudGxpY2ggIGRlbSAgU2NoYWVmZXIgIGdhbHQsICBkZXIgIHVuYXVmbWVya3NhbWUJQmVuZ2VsCithbGxlcmRpbmdzIGVpbmVzIGRlciBTY2hhZmUgdHJhZiwgZG9jaCBzY2hlaW50IGRpZXMgc28gc2VsdGVuIGRlciBGYWxsIGdld2VzZW4KK3p1IHNlaW4sIGRhc3MgdW5zIHZvbiBzb2xjaGVuICBHZXNjaGVobmlzc2VuICBuaWNodHMgIHVlYmVybGllZmVydCAgd3VyZGUuICBTbworbXVlc3NlbiB3aXIgYW5uZWhtZW4sIGRhc3MgZGFtaXQgbGVkaWdsaWNoIGRhcyBTcHJpY2h3b3J0ICBpbGx1c3RyaWVydAl3ZXJkZW4KK3NvbGwsIGRhcyBzYWd0OiBXbyBkaWUgTGllYmUgaGluZmFlbGx0LCBkYSB3YWVjaHN0IGtlaW4gR3JhcyBtZWhyLgorCisiU2NobGltbWVyIG5vY2guIiBKZXR6dCBzdG9laG50ZSBSb21lbyB3aXJrbGljaC4gIlNpZSBpc3QgIGVpbmUgIHdhaHJlICBEaWFuYSwKK3dhcyBkYXMgQXVzd2VpY2hlbiBhbmdlaHQuIgorCitTaWUgZXJpbm5lcm4gc2ljaCBzaWNoZXIgYW4gRGlhbmEsIGxpZWJlIExlc2VyaW4sIGxpZWJlciBMZXNlci4gIFNpZSAgd2FyICBkaWUKK0dvZXR0aW4gZGVyIEphZ2QgdW5kIEp1bmdmcmF1IHZvbiBCZXJ1Zi4gTmljaHRzIHVuZCBuaWVtYW5kICBrb25udGUgIHNpZSAgZGF6dQorYnJpbmdlbiwgc2ljaCBtaXQgZWluZW0gTWFubiwgZ2xlaWNoIG9iICBHb3R0ICBvZGVyICBNZW5zY2gsICBlaW56dWxhc3Nlbi4gIFNvCitzY2hsaW1tIHRyaWViIHNpZSBlcywgZGFzcyBlaW4JTWFubiAgenVyICBTdHJhZmUsICB3ZWlsICBlciAgaWhyICBiZWltICBCYWRlbgorenVnZXNlaGVuIGhhdHRlLCBpbiBlaW5lbiBIaXJzY2ggdmVyd2FuZGVsdCAgdW5kICB2b24gIHNlaW5lbiAgZWlnZW5lbglIdW5kZW4KK2dlZnJlc3NlbiB3dXJkZS4gRGllc2UgQW5la2RvdGUgc2FndCBlYmVuc292aWVsIHVlYmVyICBkaWUgIEludGVsbGlnZW56ICBlaW5lcworSHVuZGVzIHdpZSB1ZWJlciBkaWUgIGRlcyAgTWFubmVzICBhdXMsICBkZW5uICBiZWlkZSAgdmVyZ2Fzc2VuICBpaHJlICBnZXNhbXRlCitFcnppZWh1bmcuIERpZSBIdW5kZSwgYWxzIHNpZSBkZW4gSGlyc2NoIHJvY2hlbiwgZGVyIE1hbm4sICBhbHMgIGVyICBkaWUgIEZyYXUKK3NhaC4KKworIkVpbmUgRGlhbmEsIHdpZT8gRGFubiBoYXQgc2llIHdvaGwgbGViZW5zbGFuZ2UgS2V1c2NoaGVpdCBnZWxvYnQ/IgorCitSb21lbyBnYWIgZWluIEdlcmFldXNjaCB2b24gc2ljaCwgZGFzcyBkZW0gZGVzCWdlc3RlbGx0ZW4gIEhpcnNjaGVzICBhZWhubGljaAorc2VpbiBtb2NodGUuICJXYXMgc29sbCBpY2ggIG51ciAgbWFjaGVuPyAgU2llICBpc3QgIHd1bmRlcnNjaG9lbiAgdW5kICBlcyAgaXN0CitnZXJhZGV6dSBlaW4gRnJldmVsLCBkYXNzIHNpZSBpbnMgS2xvc3RlciB3aWxsLCBkZW5uIGRhbWl0IHZlcnppY2h0ZXQgc2llIGF1Y2gKK2RhcmF1ZiwgaWhyZSBTY2hvZW5oZWl0IGFuIGRpZSBOYWNod2VsdCB6dSB1ZWJlcmxpZWZlcm4uIgorCisiTm9jaCBpc3QgbmljaHQgYWxsZXIgVGFnZSBBYmVuZC4gVmllbGxlaWNodCBiZWtvbW10IHNpZSBqYSB0cm90emRlbSBLaW5kZXIuIgorCisiVHJvdHogZGVyIEtldXNjaGhlaXQ/IERhcyBnZWh0IG5pY2h0LiIKKworIlN0aW1tdC4iLCBncmluc3RlIFVsby4gIkRhcyBndXRlIE1hZWRjaGVuIGlzdCB3b2hsIGxlc2Jpc2NoLCB3aWU/IgorCitBenp1cm8genVja3RlIGRpZSBTY2h1bHRlcm4uICJXZXIgd2Vpc3MgZGFzIHNjaG9uPyIKKworIkhtLCB3ZW5uIGljaCBudXIgdW50ZXIgRnJhdWVuIHNlaW4gd29sbHRlLCBnaW5nZSBpY2ggYXVjaCBpbnMgS2xvc3Rlci4iCisKK0F6enVybyBsYWNodGUuICJTcGllbHQgZXMgZWluZSBSb2xsZT8gSWNoIG1laW5lLCB3ZW5uIHNpZSBpaG4gbmljaHQgd2lsbCwgZGFubgora2FubiBlciBzaWNoIGF1ZiBkZW4gS29wZiBzdGVsbGVuIHVuZCBtaXQgZGVuIEZ1ZXNzZW4gSHVycmEgc2NocmVpZW4sIGVyICB3aXJkCituaWNodCBlcmhvZXJ0LiIKKworIkdyYXVzYW1lIFdlbHQuIiwgc2V1Znp0ZSBSb21lbyB2b24gZHJpbm5lbi4gIkljaCBrYW5uIGVpbmZhY2ggIG5pY2h0ICBhbiAgc2llCitoZXJhbmtvbW1lbi4gU2llIGlzdCBzY2hvZW4sIHNpZSBpc3Qga2x1ZyB1bmQgaWhyZSAgV2VzdGUgIGlzdAlzbyAgd2Vpc3MgIHdpZQorU2NobmVlLiBOaWNodHMsIGFiZXIgYXVjaCBnYXIgIG5pY2h0cyAgZ2lidCAgbWlyICBlaW5lCU1vZWdsaWNoa2VpdCwgIHNpZSAgenUKK2VycHIuLi4iIEVyIHVudGVyYnJhY2ggc2ljaCBzY2huZWxsLgorCisiV29sbHRlIGVyIGViZW4gZXJwcmVzc2VuIHNhZ2VuPyIgZnJhZ3RlIFVsby4KKworIkljaCBuZWhtZSBlcyBhbi4gV2FydW0/IgorCisiTWFlbm5lciEiCisKKyJEdSBtZWluc3QgTWVuc2NoZW4uIiBrb3JyaWdpZXJ0ZSBBenp1cm8gc2llLgorCisiSWNoIG1laW5lIE1hZW5uZXIuIFdlbm4gaWNoIG5vY2ggZWluIGVpbnppZ2VzIE1hbCBob2VyZSwgZGFzcyBlaW4gIE1hbm4gIGVpbmUKK0ZyYXUgcmVpbiB1bmQga2V1c2NoIG5lbm50LCB3ZWlzcyBpY2gsIHdhcyBpY2ggZGF2b24genUgaGFsdGVuIGhhYmUuIgorCisiU28gdHlwaXNjaCBpc3QgUm9tZW8gbnVuIGF1Y2ggd2llZGVyIG5pY2h0LiIKKworVWxvIHNjaG9iIGRlbiBFaW53YW5kIG1pdCBlaW5lciB1bmdlZHVsZGlnZW4gQmV3ZWd1bmcgaWhyZXMgRmx1ZWdlbHMgYmVpc2VpdGUuCisiSWNoIHdlcmRlIG5pZSB3aWVkZXIgZWluZW0gTWFubiB3ZWl0ZXIgdHJhdWVuLCBhbHMgaWNoIGlobiBzcHVja2VuIGthbm4uIgorCisiV2lyIGtvZW5uZW4gbmljaHQgc3B1Y2tlbiwgd2lyIHNpbmQgVm9lZ2VsLiIKKworIkViZW4uIgorCitBenp1cm8gc2NodWV0dGVsdGUgZGVuIEtvcGYgdWViZXIgc292aWVsICBVbnZlcm51bmZ0LiAgIkR1ICBicmF1Y2hzdCAgamEgIGF1Y2gKK2tlaW5lbSBNYW5uIHp1IHRyYXVlbiwgZHUgaGFzdCBqYSBtaWNoLiIKKworIlVtIHNvIHNjaGxpbW1lci4iCisKKyJIZSEiLCBtYWNodGUgQXp6dXJvLgorCitCZW5ldm9saW8gYmV0cmFjaHRldGUgc2VpbmVuIEZyZXVuZCBiZXNvcmd0LiAiTGFzcyBkaXIgZWluZW4gVGlwIGdlYmVuLCBSb21lby4KK1Zlcmdpc3Mgc2llLiIKKworIlZlcmdlc3Nlbj8gU2llPyBHZW5hdXNvIGd1dCBrb2VubnRlIGljaCBkYXMgQXRtZW4gdmVyZ2Vzc2VuLiIKKworIkthbm4gZXIgZG9jaCBnYXIgbmljaHQuIiwgbWVpbnRlIEF6enVyby4KKworIkRhcyB3aWxsIGVyIGRhbWl0IGphIHNhZ2VuLiIsIGluZm9ybWllcnRlIGlobiBVbG8uCisKKyJJY2ggc2FnIGRpciwgd2llIGR1IHNpZSB2ZXJnZXNzZW4ga2FubnN0LiIgQmVuZXZvbGlvIHNhaCBzaWNoIGdlbm9ldGlndCwgIGVpbgord2VuaWcgbGF1dGVyIHp1IHNwcmVjaGVuLCB1bSBkYXMgR2VzY2hyZWkgZGVyIGJlaWRlbiBLcmFlaGVuIHZvciAgZGVtICBGZW5zdGVyCit6dSB1ZWJlcnRvZW5lbi4gIlNjaGF1IGRpY2ggZWluZmFjaCBlaW4gd2VuaWcgdW0uIEFuZGVyZSAgTXVldHRlciAgaGFiZW4gIGF1Y2gKK3NjaG9lbmUgVG9lY2h0ZXIuIgorCisiQWNoLCBkYW1pdCBtYWNoc3QgZHUgZXMgamEgbnVyIG5vY2ggc2NobGltbWVyLiBXZW5uIGljaCBhbmRlcmUgIEZyYXVlbiAgc2VoZSwKK3ZlcmdsZWljaGUgaWNoIHNpZSBpbW1lciBtaXQgaWhyIHVuZCBkYW5uIGhhYmVuICBkaWUgIGFuZGVyZW4gIHZlcmxvcmVuLiAgTGFzcworbWljaCBsaWViZXIgYWxsZWluLCBpY2ggd2lsbCBpbiBtZWluZW0gU2NobWVyeiBlcnRyaW5rZW4uIgorCisiRXIga29lbm50ZSBpaG4gZXJzYWV1ZmVuLiIsIHNjaGx1ZyBVbG8gdm9yLgorCisiSW4gU2NobmFwcz8iLCBmcmFndGUgQXp6dXJvLgorCisiV29yaW4gc29uc3Q/IE1laW5zdCBkdSwgZXIgdmVyc3VjaHRlLCBpaG4gbWl0IGVpbmVtIFN0ZWluIHp1c2FtbWVuICBpbiAgZWluZW4KK1NhY2sgenUgc3RlY2tlbiB1bmQgaW4gZGVuIEZsdXNzIHp1IHdlcmZlbj8iCisKK0JlbmV2b2xpbyBrYW5udGUgZGFzIExlaWQgZGVyIEp1Z2VuZCB1bmQgZ3JpbnN0ZSB2ZXJzY2hhZW10LiAgIldhcnRlICBhYiwgIGljaAorbGFzc2UgbWlyIHdhcyBlaW5mYWxsZW4uIgorCitLYXVtIGhhdHRlIEJlbmV2b2xpbyBkZW4gUmF1bSB2ZXJsYXNzZW4sIGFscyBSb21lbyBzaWNoIGF1ZiBkYXMgQmV0dCB3YXJmICB1bmQKK3p1bSBTdGVpbmVyd2VpY2hlbiBzY2hsdWNoenRlLgorCisiU28gZWluIEphbW1lcmxhcHBlbi4iLCBiZW1lcmt0ZSBVbG8uCisKKyJOdW4gaG9lciBzY2hvbiBhdWYsIGVyIGlzdCBub2NoIGp1bmcgdW5kIGVyIGlzdCB2ZXJsaWVidC4iCisKKyJTY2hvbiBndXQsIGRhcyBpc3QgZGVyIEZyZWlicmllZiBmdWVyIGplZGUgbnVyIGRlbmtiYXJlIEJsb2VkaGVpdC4iCisKZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvcm9tX2p1bC9zZWl0ZTQgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL3JvbV9qdWwvc2VpdGU0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNDFkNTgKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL3JvbV9qdWwvc2VpdGU0CkBAIC0wLDAgKzEsMjU4IEBACitERVIgRVJTVEUgQUtUCisJICBESUUgWldFSVRFIFNaRU5FCisKK1VsbyB1bmQgQXp6dXJvIGJlc2NobG9zc2VuLCBSb21lbyBuaWNodCB3ZWl0ZXIgZGFiZWkgenV6dXNlaGVuLCAgd2llICBlciAgc2ljaAorc2VpbmVtIExpZWJlc2t1bW1lciBoaW5nYWIsIHNvbmRlcm4gbGllYmVyIHp1bSBIYXVzIENhcHVsZXRzICB6dSAgZmxpZWdlbi4gIEltCitXb2huemltbWVyIGRlciBWaWxsYSBDYXB1bGV0cyBmYW5kZW4gc2llIGRlbiBpbnp3aXNjaGVuIGFuZ2V6b2dlbmVuIEhhdXNoZXJyZW4KK21pdCBzZWluZW0gRnJldW5kIFBhcmlzLgorCisiTm9jaCBzbyBlaW4gU3R1dHplci4iLCBiZW1lcmt0ZSBBenp1cm8gIHVuZCAgZGV1dGV0ZSAgbWl0ICBkZW0gIFNjaG5hYmVsICBhdWYKK1BhcmlzLgorCisiV2FzIGhhc3QgIGR1ICBkZW5uICBnZWdlbiAgaWhuPyIsICBmcmFndGUgIFVsby4gICJJY2ggIGZpbmRlLCAgZXIgIGhhdCAgZWluZW4KK2tuYWNraWdlbi4uLiIKKworIlVsbyEiCisKKyIuLi5BdXNkcnVjayBpbSBHZXNpY2h0LiIsIHNjaGxvc3MgVWxvIGxhaG0uCisKKyJTZWl0IHdhbm4gZ2VmYWxsZW4gZGlyICBkZW5uICBNZW5zY2hlbj8iICBBenp1cm8gIHZlcnN0YW5kICBzZWluZSAgR2VmYWVocnRpbgorbmljaHQuCisKKyJFcyBpc3QgZ3V0LCBkYXNzIGljaCBzbyBhbHQgYmluLiIsIHJhZXNvbmllcnRlIENhcHVsZXQgZHJpbm5lbi4KKworIlBmZnQuIiwgbWFjaHRlIEF6enVyby4gIkRhcyBuZW5udCBtYW4gZGFubiBhdXMgZGVyIE5vdCBlaW5lIFR1Z2VuZCBtYWNoZW4uIgorCitVbG8gZ3JpbnN0ZSBudXIgenVyIEFudHdvcnQuCisKKyJXZW5uIGljaCBqdWVuZ2VyIHdhZXJlLCBmaWVsZSBlcyBtaXIgd2FocnNjaGVpbmxpY2ggc2Nod2VyZXIsIGVuZGxpY2ggRnJpZWRlbgorbWl0IE1vbnRhZ3VlIHp1IGhhbHRlbi4iIENhcHVsZXQgc2V1Znp0ZS4KKworVWxvIGxhY2h0ZSBrcmFlY2h6ZW5kLiAiS2FubnN0IGR1IGRpciB2b3JzdGVsbGVuLCB3aWUgZXMgIGF1c3NhZWhlLCAgd2VubiAgZGllCitiZWlkZW4gYWx0ZW4gTWFlbm5lciBhdWZlaW5hbmRlciBsb3NnaW5nZW4/IgorCitBenp1cm8JbGFjaHRlCW1pdC4gICJOdXIgIHp1ICBndXQuICBXYWhyc2NoZWlubGljaCAgd3VlcmRlbiAgc2llICBzaWNoICAgbWl0CitQaWxsZW5kb2VzY2hlbiBiZXdlcmZlbi4iCisKKyJPZGVyIGlocmUgS3Jhbmtlbmdlc2NoaWNodGUgYXVmc2NocmVpYmVuLiIKKworQXp6dXJvIHNjaHVldHRlbHRlIHNpY2guICJBbHNvIF9kYXNfIHdhZXJlIGRhbm4gd2lya2xpY2ggenV2aWVsLiIKKworIkVzIGlzdCBzY2hvbiBlaW5lIFNjaGFuZGUsIGRhc3MgIGRlciAgYWx0ZSAgU3RyZWl0ICBpbW1lciAgbm9jaCAgZXhpc3RpZXJ0LiIsCittZWludGUgUGFyaXMuCisKKyJTbyAgZ2VodCAgZXMgIG51biAgZWlubWFsLiAgSXJnZW5kd2FubiAgbWFjaGVuICBzaWNoICBzb2xjaGUgICBTdHJlaXRpZ2tlaXRlbgorc2VsYnN0YWVuZGlnLiIsIGFudHdvcnRldGUgQ2FwdWxldC4KKworIkRhcyBlcnN0ZSB2ZXJudWVuZnRpZ2UgV29ydCwgZGFzcyBkZXIgQWx0ZSBzYWd0LiIgSGFldHRlIFVsbyBIYWVuZGUgIGFuc3RlbGxlCitkZXIgRmx1ZWdlbCBnZWhhYnQsIHNvIGhhZXR0ZSBzaWUgd29obCBCZWlmYWxsIGdla2xhdHNjaHQuCisKK1BhcmlzIG5pY2t0ZSBiZWRhZWNodGlnLiAiRGFtaXQgaGFzdCBkdSB3YWhyc2NoZWlubGljaCBSZWNodCwgIGFiZXIgIGxhc3MgIHVucwordm9uIGV0d2FzIGFuZ2VuZWhtZXJlbiByZWRlbi4gV2FzIGhhZWx0c3QgZHUgdm9uIGRlbSBHZWRhbmtlbiwgZGFzcyBpY2ggIEp1bGlhCitoZWlyYXRlPyIKKworQXp6dXJvIHdhcmYgZWluZW4ga3JpdGlzY2hlbiBCbGljayBhdWYJUGFyaXMuCSJBYnN0YW5kICBoYWVsdCAgZXIsICB3ZW5uICBlcgorc2NobGF1IGlzdC4iCisKKyJJbSBHcnVuZCBoYWJlIGljaCBuaWNodHMgZGFnZWdlbiwgYWJlciBzaWUgIGlzdCAgbWVpbmUgIGVpbnppZ2UgIFRvY2h0ZXIgIHVuZAorYXVzc2VyZGVtIG5vY2ggenUganVuZy4gU2llIHdlaXNzIGphIG5vY2ggbmljaHQgZWlubWFsLCB3YXMgIGVzICBiZWRldXRldCwgIHp1CitoZWlyYXRlbi4gV2FydGUsIGJpcyBzaWUgc2VjaHplaG4gaXN0LCBkYW5uIGhhc3QgZHUgbWVpbmVuIFNlZ2VuLiIKKworIkhtLCBvYiBzaWUgdWViZXJoYXVwdCBzY2hvbiB3ZWlzcywgd2llIGRhcyBtaXQgZGVuIEJpZW5jaGVuIHVuZCBkZW4gQmx1ZW1jaGVuCitpc3Q/IiwgZnJhZ3RlIHNpY2ggVWxvLgorCisiU2llIHdpcmQgZXMgc2Nob24gaGVyYXVzZmluZGVuLiBJbW1lcmhpbiBsYWVzc3QgZGVyIEFsdGUgIGlociAgamEgIG5vY2ggIHp3ZWkKK0phaHJlLiIKKworIkljaCBrZW5uZSBGcmF1ZW4sIGRpZSBqdWVuZ2VyIHdhcmVuIiwgd2FuZHRlICBQYXJpcyAgZWluICAidW5kICB0cm90emRlbSAgbWl0CitlaW5lbSBTdGFsbCB2b2xsZXIgS2luZGVyIGdsdWVja2xpY2ggd3VyZGVuLiIKKworIlNpZWggZGlyIG51ciBtZWluZSBGcmF1IGFuLiBEdSBoYXN0IG5pY2h0IHZpZWwgdm9uIGlociwgd2VubiBkdSBzaWUgIHNvICBqdW5nCitoZWlyYXRlc3QsIGdsYXViIG1pci4iIENhcHVsZXQgenVja3RlIG1pdCBkZW4gU2NodWx0ZXJuLgorCisiRGllc2VyLi4uIiBVbG8gaG9sdGUgdGllZiBMdWZ0LgorCisiQmVoZXJyc2NoIGRpY2guIiBBenp1cm8genVwZnRlIHNpZSBhbiBkZW4gU2Nod2FuemZlZGVybi4KKworUGFyaXMgbmlja3RlLiAiV2VubiBkdSBtZWluc3QsIHdlcmRlIGljaCBtaWNoIG5hdHVlcmxpY2ggZGFuYWNoIHJpY2h0ZW4uIgorCisiSWNoIGtvZW5udGUgaWhuZW4uLi4iLCBncm9sbHRlIFVsby4KKworQXp6dXJvIGFobnRlLCB3YXMgamV0enQga2FtLiAiVHVzIG5pY2h0LiIKKworVWxvIHNldWZ6dGUgdGllZiB1bmQgdmVyZmx1Y2h0ZSBlaW5tYWwgbWVociBkaWUgR29ldHRlciwgZGllIHNpZSB6d2FuZ2VuLCBlaW5lCitzdHVtbWUgQmVvYmFjaHRlcmluIHp1IHNlaW4uCisKKyJWZXJ0cmF1IG1pciwgaWNoIGhhYmUgc2Nob24gbWFuY2hlIEZyYXUgZ2VzZWhlbi4iLCBtZWludGUgQ2FwdWxldC4KKworIkRhcyBnbGF1YiBpY2ggZGVtIGFsdGVuIEJvY2suIiwgZ3JpbnN0ZSBBenp1cm8uCisKKyJGYW5nIGR1IG5pY2h0IGF1Y2ggbm9jaCBhbiwgZGljaCB3aWUgZWluIE1hY2hvIHp1IGJlbmVobWVuLiIsIGZ1aHIgVWxvICBpaHJlbgorR2VmYWVocnRlbiBhbi4KKworIkhldXRlIGFiZW5kIGdlYmUgaWNoIGVpbiBGZXN0LCBQYXJpcywgZGEga2FubnN0IGR1ICBKdWxpYSAga2VubmVubGVybmVuLiIgIEVyCit6d2lua2VydGUgc2VpbmVtIEZyZXVuZCB6dS4gIlNjaGF1IGRpY2ggdW0gIHVuZCAgc3VjaCAgZGlyICB1bnRlciAgZGVuICBqdW5nZW4KK0ZyYXVlbiBlaW5lbiBhbmdlbmVobWVuIFplaXR2ZXJ0cmVpYiBmdWVyIGRpZSBuYWVjaHN0ZW4gYmVpZGVuIEphaHJlLiBVbmQgIHdhcworSnVsaWEgYW5nZWh0LCBzbyB1bXdpcmIgc2llIGVpbiBiaXNzY2hlbiwgIGRhbWl0ICBzaWUgIGluICB6d2VpICBKYWhyZW4gIG5pY2h0CitnbGVpY2ggaW4gVHJhZW5lbiBhdXNicmljaHQsIGRhbm4ga2FubnN0IGR1IHNpZSBoYWJlbi4iCisKKyJXZW5uIGRhcyBkZWluZSBFbnRzY2hlaWR1bmcgaXN0LCB3ZXJkZSBpY2ggbWljaCBuYXR1ZXJsaWNoIGRhcmFuIGhhbHRlbi4iCisKK0NhcHVsZXQgd2FuZHRlIHNpY2ggdW0gdW5kIHNjaHVldHRlbHRlIGhlZnRpZyBlaW5lIGtsZWluZSBHbG9ja2UsIGRpZSBhdWYgIGRlbQorVGlzY2ggc3RhbmQuIFVsbyBoYWV0dGUgc2ljaCBhbSBsaWVic3RlbiBkaWUgT2hyZW4genVnZWhhbHRlbiwgZGVubiBkaWUgR2xvY2tlCit3YXIgb2ZmZW5zaWNodGxpY2ggZ2Vicm9jaGVuIHVuZCBiZXdpZXMsIGRhc3MgQ2FwdWxldCBhbSBmYWxzY2hlbiBFbmRlIHNwYXJ0ZS4KK0FscyBkZXIgRGllbmVyIGRhcyBaaW1tZXIgYmV0cmF0LCBkcnVlY2t0ZSBDYXB1bGV0IGlobSBlaW5lIExpc3RlIGluIGRpZSBIYW5kLgorIkdlaCB1bmQgc3VjaGUgYWxsIGRpZSBMZXV0ZSBhdWYsIGRpZSBhdWYgZGllc2VyIExpc3RlICBzdGVoZW4sICByaWNodGUgIGlobmVuCithdXMsIGRhc3Mgc2llIGhlcnpsaWNoIGVpbmdlbGFkZW4gc2luZC4iCisKK0RlciBEaWVuZXIgd2FyZiBlaW5lbiB6d2VpZmVsbmRlbiBCbGljayAgYXVmICBkaWUgIExpc3RlICBpbiAgc2VpbmVuICBIYWVuZGVuLgorIkFsbGU/IgorCisiV2FzIGRhY2h0ZXN0IGR1IGRlbm4/IiBDYXB1bGV0IHNjaHVldHRlbHRlIGRlbiBLb3BmIHVuZCBoYWt0ZSBzaWNoIGJlaSAgUGFyaXMKK3VudGVyLiAiS29tbSBtaXQsIHdpciB3ZXJmZW4gZWluZW4gQmxpY2sgYXVmIGRpZSBSb3Nlbi4iCisKKyJBbGxlLi4uIiBEZXIgRGllbmVyLCBkZW4gd2lyLCBvYndvaGwgIGVyICBrZWluZSAgd2VpdGVyZSAgQmVkZXV0dW5nICBoYXQgIHVuZAorZWlnZW50bGljaCB6dSBkZW4gTmFtZW5sb3NlbiBnZWhvZXJ0LCBKYW1lcyBuZW5uZW4gd29sbGVuLCBzdGFycnRlICBkaWUgIExpc3RlCithbiwgYWxzIGtvZW5uZSBlciBzaWUgbWl0IHNlaW5lbiBCbGlja2VuICBpbiAgQnJhbmQgIHNldHplbi4gICJBbGxlICBzb2xsICBpY2gKK2VpbmxhZGVuLiIsIGJydW1tdGUgZXIuICJBbHMgb2IgaWNoIGxlc2VuIGtvZW5udGUuIgorCitVbG8gendpbmtlcnRlIGJlbHVzdGlndC4gIk5hLCBzbyBlaW4gIFBlY2guICBEYSAgd2lyZCAgUGFyaXMgIGphICBoZXV0ZSAgYWJlbmQKK2FsbGVpbmUgc2Vpbi4iCisKKyJXYXJ0ZW4gd2lycyBhYi4iLCBhbnR3b3J0ZXRlIEF6enVyby4KKworIkpldHp0IHN0ZWggaWNoIGhpZXIsIGljaCBhcm1lciBUb3IuIiBKYW1lcyBzZXVmenRlLgorCisiSWNoIGhhc3NlIGVzLCB3ZW5uIHNpZSBkaWUgWml0YXRlIHZlcnRhdXNjaGVuLiIgQXp6dXJvIHNjaHVldHRlbHRlIHNpY2guICJXaWUKK3NvbGwgbWFuIGRlbm4gZGEgZGVuIFVlYmVyYmxpY2sgYmVoYWx0ZW4uIgorCitEaWUgS3JhZWhlbiBmb2xndGVuIEphbWVzLCBhbHMgZXIgbWl0IGRlciBMaXN0ZSBpbiBkZXIgSGFuZCBkYXMgSGF1cyB2ZXJsaWVzcywKK3VtIGplbWFuZGVuIHp1IGZpbmRlbiwgZGVyIGlobSBzYWd0ZSwgd2VuIGVyIGVpbmxhZGVuICBzb2xsdGUuCVdpZSAgc28gIHZpZWxlCitNZW5zY2hlbiB3YXIgYXVjaCBIZXJyIENhcHVsZXQgamVtYW5kLCBkZXIgRGluZ2VuLCBkaWUgZXIgIHNjaHdhcnogIGF1ZiAgd2Vpc3MKK3ZvciBzaWNoIHNhaCwgdW5iZWRpbmd0ZXMgVmVydHJhdWVuIHNjaGVua3RlLiBXZXIgamVkb2NoIGplICBlcmxlYnQgIGhhdCwgIHdpZQorR2VydWVjaHRlICB3aXJrZW4sICB3ZWlzcywgIGRhc3MgIGRhcyAgZ2VzcHJvY2hlbmUgIHVuZCAgZXJpbm5lcnRlICBXb3J0ICAgZGVtCituaWVkZXJnZXNjaHJpZWJlbmVuIGltbWVyIHVlYmVybGVnZW4gaXN0LiBHZXNjaGljaHRlLCBzbyB3aXNzZW4gIHdpciwgIGJlc3RlaHQKK251ciB6dSBlaW5lbSB2ZXJzY2h3aW5kZW5kIGtsZWluZW4gVGVpbCBpbiBEb2t1bWVudGVuLiBTZWllbiBTaWUgZWhybGljaCwgIHdlbQorZ2xhdWJ0ZW4gU2llIGRlbm4gZWhlcjogZWluZW0gdmVyc3RhdWJ0ZW4gdW5kICBoYWxidmVyc2NoaW1tZWx0ZW4gIEJyaWVmLCAgZGVyCitiZXNhZ3QsICBkYXNzICBJaHIgIEdyb3NzdmF0ZXIJZ2FyICBuaWNodCAgSWhyICBHcm9zc3ZhdGVyICBpc3QsICAgb2RlciAgIGRlbgorRXJ6YWVobHVuZ2VuIGlocmVyIEdyb3NzbXV0dGVyLCBkaWUgZWluZW4gd3VuZGVyYmFyZW4gS3VjaGVuICBiYWNrdCwgIHVtICBpaHJlCitCZWhhdXB0dW5nIHp1IHVudGVybWF1ZXJuPworCisiV2VubiBKYW1lcyBzaWNoIGVpbmUgTWVuZ2UgQWVyZ2VyIGVyc3BhcmVuIHdpbGwsIGJyYXVjaHQgZXIgbnVyIGRpZSBMaXN0ZSBhbHMKK0tsb3BhcGllciB6dSBiZW51dHplbi4iLCBtZWludGUgVWxvLgorCitKYW1lcyBibGlja3RlIHZlcndpcnJ0IGF1Zi4gIldhcyBtZWluc3QgZHUgZGFtaXQ/IgorCisiS3JhaC4iLCBhbnR3b3J0ZXRlIEF6enVybyBhbiBVbG9zIHN0YXR0LgorCisiSWNoIGhhYiBnZW5hdSBnZWhvZXJ0LCBkYXNzIGR1IGdlcmVkZXQgaGFzdC4iCisKKyJLcmFocmFoLiIsIG1hY2h0ZSBudW4gYXVjaCBVbG8uCisKKyJKYWphamEsIEtyYWhyYWhyYWguIiBKYW1lcyB0cmF0IG1pc3NtdXRpZyBnZWdlbiBlaW5lbiBTdGVpbiB1bmQgIGZsdWNodGUsICBkYQorZGVyIFN0ZWluIGRlbiB1bmdsZWljaGVuIEthbXBmIGdld2Fubi4gIkljaCBoYWJlIGVzIGdlaG9lcnQsIGhhYmUgaWNoLiIKKworIk5pY2h0cyBoYXN0IGR1IGdlaG9lcnQuIiwgbWVpbnRlIFVsby4gIktyYWguIiwgZnVlZ3RlIHNpZSAgbmFjaCAgZWluZXIgIFBhdXNlCitoaW56dS4KKworIkFjaCwgbGVjayBtaWNoLiBFcnN0IGRpZSBkdW1tZSBMaXN0ZSB1bmQgZGFubiAgYXVjaCAgbm9jaCAgZWluZSAgS3JhZWhlLCAgZGllCityZWRldC4iCisKKyJOaWNodCB3ZW5pZ2VyIGR1bW0gYWxzIGRpZSBMaXN0ZS4iLCBrb21tZW50aWVydGUgQXp6dXJvIHNvICBsZWlzZSwgIGRhc3MgIG51cgorVWxvIGlobiB2ZXJzdGFuZC4KKworIkhlLCB3ZW5uIGVzIGRpZXNlIExpc3RlIG5pY2h0IGdhZWJlLCB3dWVyZGUgUm9tZW8uLi4iCisKKyJIYWx0IGRlbiBTY2huYWJlbCEiLCBmdWhyIEF6enVybyBzZWluZSBHZWZhZWhydGluIGFuLgorCisiV2VyIGlzdCBSb21lbz8iLCB2ZXJsYW5ndGUgSmFtZXMgenUgd2lzc2VuLCBkZXIgaW1tZXIgc2VociAgZ2VuYXUgIGhpbmhvZXJ0ZSwKK3dlbm4gZWluIEdlc3ByYWVjaCBuaWNodCBmdWVyIGlobiBiZXN0aW1tdCB3YXIuCisKK1p1IFVsb3MgdW5kIEF6enVyb3MgR2x1ZWNrIHJpZWYgZGllICBLb2VjaGluICBuYWNoICBKYW1lcyAgdW5kCWdhYiAgaWhtICBlaW5lCitmbHVlc3NpZ2UgU3RhZXJrdW5nIG1pdCBhdWYgZGVuIFdlZy4gU28gc2NobmVsbCwgd2llIGRlciBTY2huYXBzIHNlaW5lbiBXZWcgaW4KK0phbWVzZW5zIE1hZ2VuIGZhbmQsIHZlcmdhc3MgZGllc2VyIGRpZSBiZWlkZW4JS3JhZWhlbiAgdW5kICBtYWNodGUgIHNpY2ggIGFuCitzZWluZW4gQXVmdHJhZy4gQXVjaCBTaWUgdW5kIGljaCBoYWJlbiBHbHVlY2ssIGxpZWJlICBMZXNlcmluLAlsaWViZXIJTGVzZXIsCitkZW5uIGRlciBlcnN0ZSBNZW5zY2gsIGRlbSAgSmFtZXMgIGJlZ2VnbmV0ZSwgIHdhciAgQmVuZXZvbGlvLAlkZXIgIFJvbWVvICBpbQord2FocnN0ZW4gU2lubmUgZGVzIFdvcnRlcyBoaW50ZXIgc2ljaCBoZXJzY2hsZXBwdGUuIFN0ZWxsZW4gU2llIHNpY2ggbnVyICB2b3IsCitlcyBzZWkgamVtYW5kIGFuZGVycyBnZXdlc2VuLCBkZW0gSmFtZXMgdWViZXIgZGVuIFdlZyBsaWVmLiBWaWVsbGVpY2h0IGplbWFuZCwKK2RlbiBIZXJyIENhcHVsZXQgZWluenVsYWRlbiB2ZXJnZXNzZW4gaGF0dGUsIGRhbm4gdmVybGllZmUgIHVuc2VyZSAgR2VzY2hpY2h0ZQordm9uIGhpZXIgYWIgdm9lbGxpZyBhbmRlcnMsIGFscyBTaWUgc2llIGhvZXJlbgl3b2xsZW4JdW5kICBpY2ggIG11ZXNzdGUgIG1pcgorZWluZmFsbGVuIGxhc3Nlbiwgd2llIGljaCBkaWVzIGRlbiBHb2V0dGVybiBkZXIgTXl0aGVud2VsdCBlcmtsYWVyZS4KKworIlVuZCBkZXIgR2V3ZXJrc2NoYWZ0LiIsIHNhZ3QgVWxvIGFtdWVzaWVydC4KKworX1VuZF8gX2Rlcl8gX0dld2Vya3NjaGFmdF8sIF9qYV8uIF9TZWlfIF9nZXdhcm50XywgX1Vsb18uICBfV2Vubl8gIF9kdV8gIF9taXJfCitfbm9jaF8gX2Vpbm1hbF8gX2Rhendpc2NoZW5xdWFzc2Vsc3RfLCBfc3RyZWljaGVfICBfaWNoXyAgX2RpY2hfICBfYXVzXyAgX2Rlcl8KK19HZXNjaGljaHRlXyEKKworIkRhcyBnbGF1YnN0IGR1IGRvY2ggc2VsYnN0IG5pY2h0LiBXZW5uIGR1IGRhcyBtYWNoc3QsIHRyZXRlIGljaCBpbiAgU3RyZWlrLiIsCitrbnVycnQgQXp6dXJvIHVuZCBzY2h3ZW5rdCBlaW4gcm90ZXMgRmFlaG5jaGVuLgorCitfU2Nob25fIF9ndXRfLiBfVmVyc3VjaHRfIF93ZW5pZ3N0ZW5zXywgX2V1Y2hfIF9hbnN0YWVuZGlnXyBfenVfIF9iZW5laG1lbl8uCisKK0JlbmV2b2xpbyBncmluc3RlIHNlaW5lbiBDb3VzaW4gYW4uICAiSGFzdCAgZHUgIGRpY2ggIHNjaG9uICBlaW5tYWwgIGltICBLcmVpcworZ2VkcmVodCwgYmlzIGRpciBzY2h3aW5kbGlnIHd1cmRlPyIKKworIkFlaC4uLiIgUm9tZW8gdmVyc3RhbmQgbmljaHQsIHdvcmF1ZiBzZWluIEZyZXVuZCBoaW5hdXMgd29sbHRlLgorCisiV2VubiBtYW4gc2ljaCBkcmVodCwgYmlzIGVpbmVtIHNjaHdpbmRsaWcgd2lyZCwga2FubiBtYW4gc2ljaCAgaGVsZmVuLCAgaW5kZW0KK21hbiBzaWNoIGluIGRpZSBhbmRlcmUgUmljaHR1bmcgZHJlaHQuIgorCisiRGFzIHdlaXNzIGljaC4iCisKKyJHZW5hdXNvIGlzdCBlcyBhdWNoIG1pdCBkaXIuIFdlbm4gZHUgUm9zYWxpbmUgIG5pY2h0ICBiZWtvbW1lbiAga2FubnN0LCAgZGFubgorc2NoYXUgZGlyIGVpbmUgYW5kZXJlIGFuIHVuZCBzY2hvbiBmdWVobHN0IGR1IGRpY2ggYmVzc2VyLiIKKworIkRhcyB3YWVyZSBqYSBkZW4gVGV1ZmVsIG1pdCBCZWVsemVidWIgYXVzdHJlaWJlbi4iLCBrb21tZW50aWVydGUgQXp6dXJvLgorCisiV2VubidzIGRlbm4gaGlsZnQuIiBSb21lbyB6dWNrdGUgZGllIFNjaHVsdGVybi4KKworIlNpZSBrb2VubmVuIG5pY2h0IHp1ZmFlbGxpZyBsZXNlbj8iLCBmcmFndGUgSmFtZXMuICJHdXRlbiBUYWcsIHVlYnJpZ2Vucy4iCisKKyJLb21tdCBkYXJhdWYgYW4uIiwgYnJ1bW10ZSBSb21lbyBzY2hsZWNodGdlbGF1bnQuCisKKyJBY2gsIHNjaG9uIGd1dCwgZGFubiBzdWNoZSBpY2ggbWlyIGViZW4gamVtYW5kZW4sIGRlciBlcyBrYW5uLiIKKworIkljaCBrYW5uIGxlc2VuLiIgTnVuIGhhdHRlIGRpZSBOZXVnaWVyZGUgUm9tZW8gZ2VwYWNrdC4KKworUm9tZW8gbmFobSBIZXJybiBDYXB1bGV0cyBMaXN0ZSBlbnRnZWdlbiB1bmQgZW50emlmZmVydGUgIHVudGVyICBTdG9laG5lbiAgdW5kCitGbHVjaGVuIGRpZSBIYW5kc2NocmlmdC4gQWxzIGVyIGZlcnRpZyB3YXIsIGdhYiBlciBkaWUgTGlzdGUgenVydWVjay4KKworIkRhbmtlLCBhYmVyIGRhcyBicmF1Y2hlIGljaCBqZXR6dCBuaWNodCBtZWhyLCBzY2hsaWVzc2xpY2ggaGFiZSBpY2ggbWlyIGFsbGVzCitnZW1lcmt0LiIKKworSmFtZXMgd2FyIHNpY2h0bGljaCBzdG9seiBhdWYgc2VpbiBHZWRhZWNodG5pcy4KKworIldvaGluIHNvbGxlbiBkZW5uIGFsbCBkaWUgTGV1dGUga29tbWVuPyIsIHdvbGx0ZSBSb21lbyB3aXNzZW4uCisKKyJIZXJyIENhcHVsZXQgZ2lidCBoZXV0ZSBlaW4gRmVzdC4gV2lzc2VuIFNpZSwga29tbWVuIFNpZSBkb2NoIGVpbmZhY2ggdm9yYmVpLAord2VubiBzaWUgbmljaHQgZ2VyYWRlIGRlbiBNb250YWd1ZXMgZGllIFN0YW5nZSBoYWx0ZW4uIgorCitCZW5ldm9saW8gZ3JpbnN0ZS4gIkRhcyBpc3QgZGllIEdlbGVnZW5oZWl0LiIKKworIkR1IHNwcmljaHN0IGhldXRlIGluIFJhZXRzZWxuLiIKKworIkhhc3QgZHUgZGVubiBnYXIgbmljaHQgZGFyYXVmIGdlYWNodGV0LCB3YXMgZHUgdm9yZ2VsZXNlbiBoYXN0PyIKKworIkljaCB3YXIgbWl0IGRlciBIYW5kc2NocmlmdCBiZXNjaGFlZnRpZ3QuIgorCisiSGV1dGUgYWJlbmQgc2luZCBzb3dvaGwgUm9zYWxpbmUgYWxzIGF1Y2ggZGllIHNjaG9lbnN0ZW4gRnJhdWVuICBWZXJvbmFzICBiZWkKK0NhcHVsZXQgenUgR2FzdC4iCisKKyJKYSB1bmQ/IFNvbGxlbiB3aXIgamV0enQgZWluIGVpZ2VuZXMgRmVzdCBnZWJlbj8iCisKKyJOZWluLiBXaXIgZ2VoZW4gZGEgaGluIHVuZCBkYW5uIGthbm5zdCBkdSBtaXIgc2FnZW4sIG9iIFJvc2FsaW5lIHdpcmtsaWNoIGRpZQorU2Nob2Vuc3RlIGlzdC4gSWNoIGJpbiBnZXNwYW5udCwgd2FzIGR1IHNhZ3N0LCB3ZW5uIHdpciBlcnN0IGRhIHNpbmQuIgorCisiU2llIGlzdCBkaWUgQWxsZXJzY2hvZW5zdGUuIgorCisiU2ljaGVyLiIgQmVuZXZvbGlvIHRhZXRzY2hlbHRlIFJvbWVvcyBTY2h1bHRlci4gIkFiZXIgYmlzIGpldHp0IGhhc3QgIGR1ICBzaWUKK25vY2ggbmljaHQgZ2VzZWhlbiwgd2VubiBhbGxlIGFuZGVyZW4gU2Nob2VuaGVpdGVuIGRhYmVpIHdhcmVuLiIKKworIkhvZXJ0IHNpY2ggYW4gd2llIGVpbmUgTWlzcy1XYWhsLiIgbWVpbnRlIEF6enVyby4KKworUm9tZW8gdWViZXJsZWd0ZSBlaW5lIFdlaWxlLCBkYW5uIG5pY2t0ZSBlci4gIkljaCBrb21tZSBtaXQsIGFiZXIgbmljaHQsICB3ZWlsCitpY2ggbWlyIGRpZSBhbmRlcmVuIEZyYXVlbiBhbnNlaGVuIHdpbGwsIHNvbmRlcm4gYmxvc3MgdW0gUm9zYWxpbmUgenUgc2VoZW4uIgorCitCZW5ldm9saW8gc2V1Znp0ZS4gIldhcnRlbiB3aXIgYWIuIgorCmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL3JvbV9qdWwvc2VpdGU1IGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9yb21fanVsL3NlaXRlNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmYyOGIzCi0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9yb21fanVsL3NlaXRlNQpAQCAtMCwwICsxLDIxMyBAQAorREVSIEVSU1RFIEFLVAorCSAgRElFIERSSVRURSBTWkVORQorCitJbSBCb3Vkb2lyIEZyYXUgQ2FwdWxldHMgYmVvYmFjaHRldGVuIFVsbyB1bmQgQXp6dXJvIHp3ZWkgcmVpY2hsaWNoICB1bmdsZWljaGUKK0ZyYXVlbi4gRGllIGVpbmUgd2FyIEZyYXUgQ2FwdWxldCwgemllcmxpY2ggdW5kIHdlbm4gc2Nob24gbmljaHQgaHVlYnNjaCwgZGFubgorZG9jaCB3ZW5pZ3N0ZW5zIGdlc2NoaWNrdCBnZXNjaG1pbmt0LiBEaWUgYW5kZXJlIHdhciBQb2xseSwgSnVsaWFzICBBbW1lLCAgZGllCitkZW0gS2xpc2NoZWUgaWhyZXMgQmVydWZlcyBnZXJlY2h0IHd1cmRlLCBkZW5uIHNpZSB3YXIgZnJ1ZWggYWx0IGdld29yZGVuICB1bmQKK3dlbmlnZXIgZ2VzY2hpY2t0IGltIFVtZ2FuZyAgbWl0ICBTY2htaW5rZSAgYWxzICBGcmF1ICBDYXB1bGV0LiAgUnVuZGxpY2ggIHVuZAoraW56d2lzY2hlbiBmYXN0IHphaG5sb3MsIG1pdCB3aXJyZW0sIGZhc3QgZXJncmF1dGVtIEhhYXIgdW5kIEZhbHRlbiwgIGRpZSAgbWFuCitBbHBlbiBuZW5uZW4gd3VlcmRlLCB3ZW5uIHNpZSBudXIgZWluIHdlbmlnIGdyb2Vzc2VyIHdhZXJlbiwgd2lyYmVsdGUgIHNpZSAgc28KK3NjaG5lbGwgaWhyZSBrcmFtcGZhZHJpZ2VuIEJlaW5lIHNpZSB0cmFnZW4gd29sbHRlbiBkdXJjaCBkYXMgWmltbWVyLgorCisiSWNoIGhhYiBpaHIgZ2VzYWd0LCBkYXNzIHNpZSBoZXJrb21tZW4gc29sbC4gSmF3b2hsLCBkYXMgaGFiZSAgaWNoLiAgVW5kICBpY2gKK3Zlcmdlc3NlIG5pZSBldHdhcy4iLCBtdXJtZWx0ZSBzaWUgdm9yIHNpY2ggaGluLgorCisiU2llIGlzdCBqZWRlbmZhbGxzIG5pY2h0IGhpZXIuIiwga29tbWVudGllcnRlIEZyYXUgQ2FwdWxldC4KKworUG9sbHkgaG9sdGUgYXN0aG1hdGlzY2ggTHVmdCB1bmQgcmllZjogIkp1bGlhISBXbyBzdGVja3N0IGR1LCBTY2hhZXR6Y2hlbj8iCisKKyJJY2ggYmluIGphIHNjaG9uIGRhLiIsIG1laW50ZSBKdWxpYSB2b24gZGVyIFR1ZXIgaGVyLgorCisiT2guIFNpZSBtdXNzIGFiZXIgbm9jaCB6aWVtbGljaCBsYW5nZSBhdWYgZGllIFdlaWRlLiIgQXp6dXJvIHNjaHVldHRlbHRlICBkZW4KK0tvcGYuCisKKyJJc3QgamEgbm9jaCBlaW4gcmVjaHRlciBCYWNrZmlzY2guIgorCisiSWNoIGdlYicgZGlyIGdsZWljaCBCYWNrZmlzY2ggYXVmIGRlbiBTY2huYWJlbC4iLCBkcm9odGUgVWxvLgorCisiU2llaCBzaWUgZGlyIGRvY2ggYW4uIFdlbm4gc2llIGVpbmVuIFBmaXJzaWNoa2VybiB2ZXJzY2hsdWNrdCwgc2llaHQgc2llIGF1cywKK2FscyBzZWkgc2llIGltIGZ1ZW5mdGVuIE1vbmF0ISIKKworIkRhcyB3YWVjaHN0IHNpY2ggbm9jaCBhdXMuIgorCisiQmVzdGltbXQuIEFiZXIgYmlzIGRhaGluIGhvbHQgbWFuIHNpY2ggYmxhdWUgRmxlY2tlbi4iCisKK1VsbyBkcmVodGUgc2ljaCBlbXBvZXJ0IHVtIHVuZCBhbnR3b3J0ZXRlIG5pY2h0IG1laHIuCisKKyJXYXMgaXN0IGRlbm4sIE1hbWE/Iiwgd29sbHRlIEp1bGlhIHdpc3Nlbi4KKworIldpZSBhbHQgaXN0IEp1bGlhIGpldHp0LCBQb2xseT8iLCBmcmFndGUgRnJhdSBDYXB1bGV0LgorCisiRGllIFNjaG1pbmtlIGhhdCBpaHIgZGFzICBHZWhpcm4gIHZlcmtsZWlzdGVydC4iICBVbG8gIGtpY2hlcnRlLiAgIlNpZSAgd2Vpc3MKK3NjaG9uIG5pY2h0IG1laHIsIHdpZSBhbHQgaWhyZSBUb2NodGVyIGlzdC4iCisKKyJJY2ggdmVyZ2Vzc2UgbmllIGV0d2FzIHVuZCBpY2ggc2FnZSBJaG5lbiwgSnVsaWEgaXN0IG5vY2ggIG5pY2h0ICB2aWVyemVobi4iLAorYW50d29ydGV0ZSBQb2xseS4gIkFtIGVyc3RlbiBBdWd1c3QgIGlzdCAgc2llICBnZWJvcmVuLCAgZGEgIHdldHRlICBpY2ggIG1laW5lCityZXN0bGljaGVuIFphZWhuZSBkcmF1Zi4iCisKKyJFcnN0ZXIgQXVndXN0LCBqYS4gS29lbm50ZSBoaW5rb21tZW4uIiBGcmF1IENhcHVsZXQgIGhhdHRlICBzaWNodGxpY2ggIE11ZWhlLAorc2ljaCBhbiBkaWUgR2VidXJ0IEp1bGlhcyB6dSBlcmlubmVybi4KKworIkphd29obCwgZGEgYmluIGljaCBzaWNoZXIsIHVuZCBpY2ggdmVyZ2Vzc2UgbmllIGV0d2FzLiBJY2ggd2Vpc3Mgc29nYXIgIG5vY2gsCit3aWUgc2llIGFuIGlocmVtIGRyaXR0ZW4gR2VidXJ0c3RhZyBoaW5maWVsIHVuZCAgc2ljaCAgZWluZSAgQmV1bGUgIGhvbHRlLCAgc28KK2dyb3NzIHdpZSBtZWluZSBkaWNrZSBaZWhlLiBVbmQgZGFtYWxzLCBkYXMgd2Vpc3MgaWNoIGF1Y2ggbm9jaCwgaGF0IG1laW4gTWFubgorR290dC1oYWItaWhuLXNlbGlnIHNpZSBpbiBkZW4gQXJtIGdlbm9tbWVuLCB3ZWlsIHNpZSAgc28gIHNjaHJlY2tsaWNoICBnZXdlaW50CitoYXQuIFVuZCBlciBzYWd0ZSwgZGFzcyBzaWUgamV0enQgbm9jaCBqdW5nIGdlbnVnIHNlaSwgdW0gYXVmIGRhcyAgR2VzaWNodCAgenUKK2ZhbGxlbiwgYWJlciB3ZW5uIHNpZSBhZWx0ZXIgd3VlcmRlLCB3ZXJkZSBzaWUJZ2V3aXR6dGVyICBzZWluICB1bmQgIGF1ZiAgZGVuCitSdWVja2VuIGZhbGxlbi4gSmF3b2hsLCBkYXMgd2Vpc3MgaWNoIG5vY2gsICBhbHMgIHdhZXJlICBlcyAgZ2VzdGVybiAgZ2V3ZXNlbi4KK1NlaGVuIFNpZSwgd2FzIGljaCBmdWVyIGVpbiBndXRlcyBHZWRhZWNodG5pcyBoYWJlLiIKKworIkphLCBTaWUgaGFiZW4gZWluIGd1dGVzIEdlZGFlY2h0bmlzLiIgRnJhdSBDYXB1bGV0IHNjaGF1dGUgYWJ3ZXNlbmQgIGF1cyAgZGVtCitGZW5zdGVyIHVuZCB2ZXJzdWNodGUgdmVyZ2VibGljaCwgUG9sbHlzIE5lYmVuc2FldHplIHp1IHNvcnRpZXJlbi4KKworIkphamFqYS4gVW5kIG1laW4gTWFubiBzYWd0ZSBub2NoLCB3ZW5uIHNpZSBnZXdpdHp0IHNlaSwgIHdlcmRlICBzaWUgIGF1ZiAgZGVuCitSdWVja2VuIGZhbGxlbiB1bmQgbmljaHQgYXVmIGRhcyBHZXNpY2h0LiBVbmQgZGFzIEx1c3RpZ3N0ZSAgZGFyYW4gIHdhciwgIGRhc3MKK21laW5lIGtsZWluZSBKdWxpYSBnbGVpY2ggYXVmaG9lcnRlLCB6dSB3ZWluZW4gdW5kIG51ciBub2NoICdKYS4nIHNhZ3RlLiAgR2Fuegorc28sIGFscyBoYWJlIHNpZSBkYXMgYWxsZXMgIHNjaG9uICB2ZXJzdGFuZGVuLglJY2ggIG11c3N0ZSAgZ2FueiAgc2NocmVja2xpY2gKK2xhY2hlbiwgYWxzIG1laW4gTWFubiBzYWd0ZSwgZGFzcyBzaWUgYXVmIGRlbiBSdWVja2VuIGZhbGxlbiB3dWVyZGUsIHdlbm4gIHNpZQorYWVsdGVyIHdhZXJlLiIKKworTXV0dGVyIHVuZCBUb2NodGVyIHN0b2VobnRlbiB3aWUgYXVzICBlaW5lbSAgTXVuZGUgIHVuZCAgc2FoZW4Jc2ljaCAgZGFubiAgaW4KK3NlbHRlbmVtIEVpbnZlcnN0YWVuZG5pcyBncmluc2VuZCBhbi4KKworIkR1IHdhcnN0IGRhcyBodWVic2NoZXN0ZSBLaW5kLCBkYXMgIGljaCAgamUgIGdlc2VoZW4gIGhhYmUsICBKdWxpYS4gIFVuZCAgaWNoCit2ZXJnZXNzZSBuaWUgZXR3YXMuIE1laW4gZ3JvZXNzdGVyIFd1bnNjaCAgd2FlcmUsICBkaWNoICBub2NoICB2ZXJoZWlyYXRldCAgenUKK3NlaGVuLiIKKworIkRhcyBzb2xsdGUgc2llIGJlc3NlciBuaWNodCB3dWVuc2NoZW4uIiwgbWVpbnRlIEF6enVyby4KKworIldhcnVtIGRlbm4gbmljaHQ/IiB3b2xsdGUgVWxvIHdpc3Nlbi4KKworIldlaWwgZGllIEdvZXR0ZXIgc2llIHN0ZXJiZW4gbGFzc2VuIGtvZW5udGVuLCB3ZW5uIHNpZSBpaHJlbiBXdW5zY2ggIGhhdC4gIFNvCitnZWh0IGRhcyBkb2NoIGluIE15dGhlbi4iCisKKyJVbXMgSGVpcmF0ZW4gZ2VodCBlcyBnZXJhZGUuIiwgc2FndGUgRnJhdSBDYXB1bGV0LgorCitTb3dvaGwgaW0gWmltbWVyIGFscyBhdWNoIGF1ZiAgZGVtICBBc3QgIGRlciAgYmVpZGVuICBUdXJ0ZWxrcmFlaGVuICB3dXJkZSAgZXMKK3NjaGxhZ2FydGlnIHNvIHN0aWxsLCBkYXNzIG1hbiBkaWUgYmVydWVobXRlIFN0ZWNrbmFkZWwgaGFldHRlCWZhbGxlbglob2VyZW4KK2tvZW5uZW4uCisKKyJEYXMgd2FlcmUgamEgbm9jaCBzY2hvZW5lci4iLCBtZWludGUgSnVsaWEuCisKKyJOaWNodCB3YWhyPyIsIGZyYWd0ZSBQb2xseSwgZGllIHNpZSBhYnNpY2h0bGljaCBtaXNzdmVyc3RhbmQuICJXZW5uIGljaCBuaWNodAord3Vlc3N0ZSwgd2VyIGRpY2ggZ2VzdGlsbHQgaGF0LCBhbHMgZHUgbm9jaCBrbGVpbiB3YXJzdCwgdW5kIGljaCB2ZXJnZXNzZSAgbmllCitldHdhcywgZGFubiBzYWd0ZSBpY2gsIGRhc3MgZHUgZGllIEtsdWdoZWl0IG5pY2h0IG51ciBtaXQgTG9lZmZlbG4gIGdlZnJlc3NlbiwKK3NvbmRlcm4gc2Nob24gbWl0IGRlciBNaWxjaCBnZXRydW5rZW4gaGFldHRlc3QuIgorCisiSWNoIGRlbmtlIG5vY2ggbmljaHQgZWlubWFsIGRhcnVlYmVyICBuYWNoLiIgIEp1bGlhICBoYXR0ZSAgc2ljaHRsaWNoICBNdWVoZSwKK25pY2h0IGF1ZiBkaWUgQnJ1ZXN0ZSBpaHJlciBBbW1lIHp1IHN0YXJyZW4uCisKKyJXZW5uIGljaCBtaWNoIG5pY2h0IHZlcnJlY2huZSwgZGFubiB3YXIgaWNoIHNjaG9uIGRlaW5lIE11dHRlciwgYWxzIGljaCAgbm9jaAorbmljaHQgc28gYWx0IHdhciB3aWUgZHUuIgorCisiSW0gTGViZW4gbmljaHQuIiwgbWVpbnRlIEF6enVyby4KKworIk1pdCBkZW0gUmVjaG5lbiBzdGVodCBzaWUgYXVmIEtyaWVnc2Z1c3MsIHZlcmdpc3MgZGFzICBuaWNodC4gIEltbWVyaGluICBrYW5uCitzaWUgamEgbm9jaCBuaWNodCBlaW5tYWwgc2FnZW4sIHdpZSAgYWx0ICBKdWxpYSAgaXN0LiIgIFVsbyAgYmV0cmFjaHRldGUgIEZyYXUKK0NhcHVsZXQgZWluZ2VoZW5kLiAiQWJlciBzbyB1bmdlZmFlaHIga29lbm50ZSBlcyBoaW5rb21tZW4uIFNpZSAgaXN0ICBiZXN0aW1tdAorbmljaHQgaGFsYiBzbyBhbHQgd2llIGlociBNYW5uLiIKKworIldhaHJzY2hlaW5saWNoIHdhcnN0IGR1IHNjaG9uIHJlaWZlciwgTWFtYS4iCisKKyJXZW5uIHNpZSBuaWNodCBtZXJrdCwgZGFzcyBKdWxpYSBzaWUgYXVmIGRlbiAgQXJtICBuaW1tdCwgIGlzdCAgc2llICBiZXN0aW1tdAorc2Nob24gdW0gZWluaWdlcyByZWlmZXIuIiBBenp1cm8genVwZnRlIGJlZGFlY2h0aWcgZWluZSBGZWRlciB6dXJlY2h0LgorCisiVW0gd2VuIGdlaHQgZXMgdWViZXJoYXVwdD8iLCB3b2xsdGUgSnVsaWEgd2lzc2VuLgorCisiUGFyaXMgaGF0IHNpY2ggaW4gZGljaCB2ZXJsaWVidC4iLCBhbnR3b3J0ZXRlIGlocmUgTXV0dGVyLgorCisiT2guIiBKdWxpYSBzY2hpZW4gZGVuIEdlZGFua2VuIHp1IHZlcmFyYmVpdGVuLgorCitQb2xseSBicmFjaCBpbiBoZWxsZXMgRW50enVlY2tlbiBhdXMuICJFaW4gcmljaHRpZ2VyIE1hbm4sICBKdWxpYS4gIFN0ZWxsICBkaXIKK2RhcyBudXIgdm9yISBBdXNzZXJkZW0gZmluZGVzdCBkdSBiZXN0aW1tdCBrZWluZW4gQmVzc2VyZW4sIGVyIGlzdCAgd2VpY2ggIHdpZQorV2FjaHMuIgorCisiU2VsdHNhbWUgUHJpb3JpdGFldGVuLiIsIG11cm1lbHRlIEF6enVyby4KKworIlNpZSBoYXQgc2Nob24gcmVjaHQuIERhcyBpc3QgZXMsIHdvcmF1ZiAgZXMgIGJlaSAgZWluZW0gIE1hbm4gIGFua29tbXQuIiAgVWxvCitncmluc3RlIG5pZWRlcnRyYWVjaHRpZy4KKworIkFjaD8iCisKKyJXdWVzc3Rlc3QgZHUgZXR3YXMgYW5kZXJlcz8iIFVsbyAgemVyemF1c3RlICBkYXMgIEdlZmllZGVyICBpaHJlcyAgR2VmYWVocnRlbgord2llZGVyLgorCisiRGVuayBkYXJ1ZWJlciBuYWNoLCBKdWxpYS4gRXIgaXN0IHdpcmtsaWNoIGVpbmUgZ3V0ZSAgUGFydGllLiIgIEZyYXUgIENhcHVsZXQKK3dhbmR0ZSBzaWNoIGlocmVtIFNwaWVnZWwgenUuCisKKyJHYW56IHJpY2h0aWcsIGVpbmUgd3VuZGVyYmFyZSBQYXJ0aWUuIiwgc3RpbW10ZSBQb2xseSBhdXMgdm9sbGVtIEhlcnplbiB6dS4KKworRnJhdSBDYXB1bGV0IGJldHJhY2h0ZXRlIGltIFNwaWVnZWwgZGFzIHp3ZWlmZWxuZGUgR2VzaWNodCBpaHJlciBUb2NodGVyLiAgIkR1Cit3aXJzdCBpaG4gaGV1dGUgYWJlbmQga2VubmVubGVybmVuLiBTY2hhdSAgaWhuCWRpciAgYW4sICBkYW5uCXdpcnN0ICBkdSAgbWlyCit6dXN0aW1tZW4sIGRhc3MgZXIgd2lya2xpY2ggZWluIG5ldHRlciBNYW5uIGlzdC4iCisKKyJFciBoYXR0ZSBqYSBaZWl0IGdlbnVnLCBlaW5lciB6dSB3ZXJkZW4uIiwgdmVyc2V0enRlIEp1bGlhLgorCisiRXMgZmVobHQgaWhtIG51ciBub2NoIGVpbmVzIHp1IHNlaW5lbSBHbHVlY2suIERpZSByaWNodGlnZSBGcmF1LiIKKworIlVuZCBkYXMgc29sbCBpY2ggc2Vpbj8iCisKKyJFciBpc3QgZWluIEJ1Y2gsIGRhcyBub2NoIGtlaW5lbiBFaW5iYW5kIGhhdC4iCisKKyJadW1pbmRlc3QgaXN0IGVyIHNvIHZlcmtuaXR0ZXJ0LiIgSnVsaWEgem9nIGVpbiBHZXNpY2h0LgorCisiVW5kIHdlbm4gZHUgaWhuIGhlaXJhdGVzdCwgZGFubiBrYW5uIG1hbiBpaG4gbmFjaCBkZW0gIEVpbmJhbmQgIGJldXJ0ZWlsZW4uIiwKK3NwcmFuZyBQb2xseSBoaWxmcmVpY2ggZWluLgorCisiSWNoIG1laW5lIG1pY2ggenUgZXJpbm5lcm4sIGRhc3MgZHUgbWljaCBnZWxlaHJ0IGhhZXR0ZXN0LCBnZW5hdSBkYXMgbmljaHQgenUKK3R1bi4gTmF0dWVybGljaCBpc3QgbWVpbiBHZWRhZWNodG5pcyBuaWNodCBzbyBndXQgd2llIGRhcyBkZWluZSwgUG9sbHkuIgorCisiU2llaCBlcyBkb2NoIG1hbCBzbzogRXMgIGdpYnQgIGJlc3RpbW10ICBoYWVzc2xpY2hlcmUsICBhZWx0ZXJlICB1bmQgIGFlcm1lcmUKK01hZW5uZXIgYWxzIGlobi4iLCBzcHJhbmcgUG9sbHkgaGlsZnJlaWNoIGVpbi4KKworVWxvIHNjaHVldHRlbHRlIHNpY2ggYW5nZXdpZGVydC4gIkRhcyBrbGluZ3QgamEgZmFzdCB3aWUgZWluZSBEcm9odW5nLiIKKworIkVpbiBNYW5uIHdpZSBlciB3aXJkICBkZWluZSAgUG9zaXRpb24gIG5pY2h0ICB2ZXJzY2hsZWNodGVybi4iLCAgZnVlZ3RlICBGcmF1CitDYXB1bGV0IGhpbnp1LgorCisiTmljaHQgdmVyc2NobGVjaHRlcm4hIiBQb2xseSB3YXIgZW50c2V0enQuICJGcmF1ZW4gd2FjaHNlbiBhbiBpaHJlbiBNYWVubmVybiwKK2Fsc28gdmVyYmVzc2VydCBzaWNoIEp1bGlhcyBQb3NpdGlvbiBzb2dhci4iCisKKyJCZXN0aW1tdCB3ZXJkZSBpY2ggYmVpemVpdGVuIGVpbmlnZXMgdWViZXIgS3JhbmtlbnBmbGVnZSBsZXJuZW4uIgorCisiRHUgdHVzdCBnZXJhZGUgc28sIGFscyBzdHVlbmRlIGVyIHNjaG9uIG1pdCBlaW5lbSBCZWluIGltIEdyYWIuIiBGcmF1IENhcHVsZXQKK3NjaHVldHRlbHRlIHVud2lsbGlnIGRlbiBLb3BmLiAiU28gYWx0IGlzdCBlciB3aXJrbGljaCBub2NoIG5pY2h0LiIKKworIldlbm4gZHUgZGFyYXVmICBiZXN0ZWhzdCwgIHdlcmRlICBpY2ggIG1pciAgd29obCAgc2VpbmUgIEFubmFlaGVydW5nc3ZlcnN1Y2hlCitnZWZhbGxlbiBsYXNzZW4gbXVlc3NlbiwgTWFtYS4iCisKKyJEYXMgaXN0IGRvY2ggZWluZSBGYXJjZSEiLCBlbXBvZXJ0ZSBzaWNoIFVsby4KKworIldpZXNvPyIsIHZlcmxhbmd0ZSBBenp1cm8genUgd2lzc2VuLiAiSW1tZXJoaW4gaGF0IHNpZSBpaHJlIFRvY2h0ZXIgZ2VmcmFndC4iCisKKyJIYXQgc2llPyBJY2ggZmluZGUsIGRhcyBrbGFuZyBlaGVyIHdpZSBlaW4gQmVmZWhsLiBVbmQgUG9sbHkgIHNvbGx0ZSAgenUgIGlocgoraGFsdGVuLCBzdGF0dCBkZXNzZW4gbGFlc3N0IHNpZSBKdWxpYSBpbSBTdGljaC4iCisKKyJOZWluLCBkYXMgdHVlIGljaCBuaWNodC4iIFBvbGx5IHdhciAgenVtICBGZW5zdGVyICBnZXRyZXRlbiAgdW5kICBoYXR0ZSAgVWxvcworbGV0enRlIFdvcnRlIGdlaG9lcnQuCisKKyJEb2NoLiIKKworIk5laW4uIEp1bGlhIG11c3Mgc28gb2RlciBzbyBoZWlyYXRlbiwgZGEgaXN0IGVpbiBNYW5uICB3aWUgIFBhcmlzICBuaWNodCAgZGllCitzY2hsZWNodGVzdGUgYWxsZXIgTW9lZ2xpY2hrZWl0ZW4uIgorCisiVW5kIHdlbm4gc2llIGlobiBnYXIgbmljaHQgd2lsbD8iCisKKyJTaWUgd2lyZCBpaG4gc2Nob24gd29sbGVuLiBXaWUgbWVpbiBNYW5uIGRhbWFscyBzYWd0ZSwgc2llIHdpcmQgIHNjaGxhdSAgc2VpbgordW5kIGF1ZiBkZW4gUnVlY2tlbiBmYWxsZW4uIgorCitVbG8gc2NobmF1YnRlIHd1ZXRlbmQuCisKK19VbG9fISBfRGFzXyBfaXN0XyBfZGllXyBfbGV0enRlXyBfV2FybnVuZ18hCisKKyJQb2xseSwgd2VubiBkdSBzaWUgamV0enQgbWl0IGRpZXNlbSBQYXJpcyB2ZXJrdXBwZWxzdCwgYmVrb21tdCAgc2llICBuaWUgIGRlbgorTWFubiwgZGVyIGlociBiZXN0aW1tdCBpc3QuIiwgc2FndGUgVWxvLgorCitBenp1cm8gd2lyZnQgZWluZW4gbWlzc3RyYXVpc2NoZW4gQmxpY2sgYXVmIGRlbiBSYWRpZXJndW1taSwgZGVyIFVsbyAgYXVzICBkZXIKK0dlc2NoaWNodGUgZW50ZmVybmVuIHNvbGwgdW5kIGtudXJydCBudXIgZHJvaGVuZDogIlN0cmVpayBnZWZhZWxsaWc/IgorCisiRGFzIGlzdCBuaWNodCB3YWhyLiIsIHZlcnRlaWRpZ3RlIHNpY2ggUG9sbHkuCisKKyJEdSB3aXJzdCBlcyBzZWhlbi4iCisKZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvcm9tX2p1bC9zZWl0ZTYgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL3JvbV9qdWwvc2VpdGU2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwOTcyZGIKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL3JvbV9qdWwvc2VpdGU2CkBAIC0wLDAgKzEsMTA1IEBACitERVIgRVJTVEUgQUtUCisJICBESUUgVklFUlRFIFNaRU5FCisKKyJJY2ggbWFnIG5pY2h0LiIsIG11cnJ0ZSBSb21lbyB1bmQgdmVyc3VjaHRlLCBCZW5ldm9saW9zIEhhbmQgIGFienVzY2h1ZXR0ZWxuLAorZGllIGlobiBsYW5nc2FtIGFiZXIgc3RldGlnIGF1ZiBkaWUgVmlsbGEgZGVyIENhcHVsZXRzIHp1em9nLgorCisiQWNoIGtvbW0gc2Nob24sIHN0ZWxsIGRpY2ggbmljaHQgc28gYW4uIiBNZXJjdXRpbyBzdHVwc3RlICBzZWluZW4gIEZyZXVuZCAgaW4KK2RpZSBTZWl0ZS4gIldpciB3ZXJkZW4gdGFuemVuICB1bmQgIHVucyAgZGFydWViZXIgIGFtdWVzaWVyZW4sICB3aWUgIGRlciAgYWx0ZQorQ2FwdWxldCBzaWNoIHZvbGxhdWZlbiBsYWVzc3QuIgorCisiV2lyIGZsaWVnZW4gc293aWVzbyByYXVzLCBub2NoIGJldm9yIHdpciBkcmlubmVuIHNpbmQuIgorCisiRGFzIGdlaHQgbmljaHQuIiwga29tbWVudGllcnRlIEJlbmV2b2xpbywgZGVyIHNpY2ggIGZlc3QgIHZvcmdlbm9tbWVuICBoYXR0ZSwKK1JvbWVvIGF1Znp1aGVpdGVybi4gIkVzIHdpcmQgYmVzdGltbXQgbHVzdGlnLiIKKworIktsYXIuIFNvIGx1c3RpZywgd2llIG1laW4gVHJhdW0gbGV0enRlIE5hY2h0LiIKKworIkhleSwgVHJhZXVtZSBzaW5kIFNjaGFldW1lLiIsIG1laW50ZSBNZXJjdXRpby4KKworIldhcyBoYXN0IGR1IGRlbm4gZ2V0cmFldW10PyIgQmVuZXZvbGlvIG5haG0gc2VpbmVuIEZyZXVuZCBlcm5zdGVyLgorCisiQmVzdGltbXQgdm9uIGVpbmVyIEZyYXUuIiwgc2FndGUgTWVyY3V0aW8gbGFjaGVuZC4gIkRhdm9uIHRyYWV1bWVuICBkb2NoICBkaWUKK21laXN0ZW4gTGV1dGUuIgorCisiTmVpbiwgZWluZSBGcmF1IHdhciBlcyBuaWNodC4iCisKK01lcmN1dGlvIHJ1ZWNrdGUgYmV0b250IGVpbmVuIFNjaHJpdHQgdm9uIFJvbWVvIGFiLiAiQWVoLCBnaWJ0ICBlcyAgZGEgIGV0d2FzLAord2FzIGR1IHVucyBzYWdlbiBzb2xsdGVzdD8gTmljaHQsIGRhc3MgaWNoIGRpciB6dSBuYWhlCXRyZXRlbgl3b2xsdGUsICBhYmVyLAorYWVoLi4uIiBFciBncmluc3RlIGJyZWl0LgorCisiUm9tZW8sIGhvZXIgbWl0IGRlbSBVbnNpbm4gYXVmLiBKZWRlciB0cmFldW10IGVpbm1hbC4gRHUgIGhhc3QgIGJlc3RpbW10ICBudXIKK2V0d2FzIFVucmVjaHRlcyBnZWdlc3Nlbi4iCisKKyJJY2ggaGFiZSBnYXIgbmljaHQgZ2VnZXNzZW4uIgorCisiTmEsIHNpZWhzdCBkdSwgd2FzIHNhZ2UgaWNoPyIKKworQmVuZXZvbGlvIHdhcmYgZWluZW4gdmVyd2lycnRlbiBCbGljayBhdWYgTWVyY3V0aW8sIGJlc2NobG9zcyBkYW5uICBhYmVyLCAgZGFzCitUaGVtYSBuaWNodCB3ZWl0ZXIgenUgIHZlcmZvbGdlbiAgdW5kICB6dXBmdGUgIHN0YXR0ICBkZXNzZW4gIFJvbWVvcyAgS3Jhd2F0dGUKK3p1cmVjaHQuICJTbywgamV0enQgc2llaHN0IGR1IGd1dCBhdXMuIgorCisiSWNoIGhhYmUgd2lya2xpY2gga2VpbmUgTHVzdCB6dSB0YW56ZW4uIiBSb21lb3MgR2VzaWNodCBoYXR0ZSBlaW5lbiBBdXNkcnVjaywKK2RlbiBqZWRlIE11dHRlciBzb2ZvcnQgZXJrYW5udCB1bmQgbWl0IGVpbmVtIHN0cmVuZ2VuIEJsaWNrIGdlYWhuZGV0IGhhZXR0ZS4KKworIkRhbm4gZ2VoIHdlbmlnc3RlbnMgbWl0IGhpbmVpbiAgdW5kICB0dSAgc28sICBhbHMgIG9iICBkdSAgZGljaCAgYW11ZXNpZXJzdC4iCitCZW5ldm9saW8gcnVlY2t0ZSBhdWNoIHNlaW5lIGVpZ2VuZSBLcmF3YXR0ZSBnZXJhZGUuICJEZXIgIEFwcGV0aXQgIGtvbW10ICBtaXQKK2RlbSBFc3Nlbi4iCisKKyJTaWVoc3RlLCBzYWcgaWNoIGRvY2guIiBBenp1cm8gaW1pdGllcnRlIHVlYmVyemV1Z2VuZCBNZXJjdXRpb3MgU3RpbW1lLgorCisiSG0sIE1lcmN1dGlvLCB3aXIgc3ByZWNoZW4gaW56d2lzY2hlbiB1ZWJlciBldHdhcyBhbmRlcmVzLiIgUm9tZW8ga29ubnRlIHNpY2gKK2VpbiBHcmluc2VuIG5pY2h0IHZlcmtuZWlmZW4uCisKKyJJY2g/IiBNZXJjdXRpbyBkZXV0ZXRlIGF1ZiBzaWNoIHNlbGJzdC4gIkljaCBoYWJlIG5pY2h0cyBnZXNhZ3QuIgorCisiV2lzc3QgaWhyLCBpY2ggaGFiZSBnZXRyYWV1bXQsIGRhc3MgaWNoIGhldXRlICBtZWluZW0gIFZlcmhhZW5nbmlzICBiZWdlZ25lLiIKK1JvbWVvICBzY2hhZmZ0ZSAgZXMgIGVyc3RhdW5saWNoICBzY2huZWxsLCAgIHNlaW5lICAgbWVsYW5jaG9saXNjaGUgICBTdGltbXVuZword2llZGVyenViZWxlYmVuLgorCisiRGFzIFZlcmhhZW5nbmlzIGtlbm5lIGljaC4gRXMgZmFlbmd0IG1pdCBSIGFuIHVuZCBob2VydCAgbWl0ICBvc2FsaW5lICBhdWYuIiwKK21laW50ZSBCZW5ldm9saW8uICJXYXJ0ZSBlcyBlcnN0IGVpbm1hbCBhYiwgdmllbGxlaWNodCBnZWZhZWxsdCAgc2llICBkaXIgIGdhcgorbmljaHQgbWVociwgd2VubiBkdSBzaWUgZXJzdCBlaW5tYWwgYmV0cnVua2VuIHNpZWhzdC4iCisKKyJEaWUgZWRsZSwgZHVyY2hnZWlzdGlndGUgIHVuZCAgd3VuZGVyc2Nob2VuZSAgUm9zYWxpbmUgIHVuZCAgc2ljaCAgYmV0cmlua2VuPworQmVuZXZvbGlvLCB3aWUga2FubnN0IGR1IHNvIGV0d2FzIHVudGVyc3RlbGxlbiEiIE1lcmN1dGlvIGxlZ3RlICBkaWUgIEFybWUgIHVtCitzZWluZSBGcmV1bmRlLgorCisiV2FocnNjaGVpbmxpY2ggd2lyZCBlcyBSb21lbyB2aWVsIG1laHIgc3RvZXJlbiwgd2VubiBlciBzaWUgbWl0ICBkZW4gIGFuZGVyZW4KK2dhY2tlcm5kIGluIGRlciBFY2tlIHN0ZWhlbiBzaWVodC4iCisKKyJTaWUgZ2Fja2VydCBuaWNodC4iLCBicnVtbXRlIFJvbWVvIHZlcmFlcmdlcnQuCisKKyJPaCwgIGljaCAgdmVyZ2Fzcy4iICBNZXJjdXRpbyAgendpbmtlcnRlICBCZW5ldm9saW8gIHp1LiAgIlNpZSAga2ljaGVydCAgIG51cgorbWFlZGNoZW5oYWZ0IGhpbnRlciBkZXIgdm9yZ2VoYWx0ZW5lbiBIYW5kLiIKKworIkFjaCwgUm9tZW8sIHdhcyBzaW5kIFNpZSBhYmVyIGF1Y2ggZnVlciBlaW4gU2NobGltbWVyLiIsIHF1aWVrdGUgQmVuZXZvbGlvIGltCitGYWxzZXR0LgorCisiSG9lcnQgYXVmLCBpY2gga29tbWUgamEgc2Nob24gbWl0LCBhYmVyIHRhbnplbiB3ZXJkZSBpY2ggbmljaHQuIgorCisiRGFzIHdlcmRlbiB3aXIgamEgc2VoZW4uIFZpZWxsZWljaHQgZnJhZ2UgaWNoIFJvc2FsaW5lLCBvYiBzaWUgbWl0IG1pciB0YW56dCwKK2Rhbm4gd2V0dGUgaWNoLCBkYXNzIGR1IG5pY2h0cyBlaWxpZ2VyZXMgenUgdHVuIGhhc3QsICBhbHMgIG1pY2ggIGFienVsb2VzZW4uIgorTWVyY3V0aW8gbmFobSBCZW5ldm9saW9zIEhhbmQuICJBY2ggIGJpdHRlLCAgc2Nob2Vuc3RlICBSb3NhbGluZSwgIHdvbGxlbiAgU2llCituaWNodCBtaXQgbWlyIHRhbnplbj8iCisKKyJPaCwgbnVyIHp1IGdlcm5lLCBsaWVic3RlciBNZXJjdXRpby4iIEJlbmV2b2xpbyBtYWNodGUgIGVpbmVuICBLbmlja3MuICAiQWJlcgordHJldGVuIFNpZSBtaXIgbmljaHQgc28gYXVmIGRpZSBGdWVzc2Ugd2llIFJvbWVvISIKKworUm9tZW8gZXJncmlmZiBCZW5ldm9saW9zIEtyYXdhdHRlIHVuZCB6b2cga3JhZWZ0aWcgZGFyYW4uICJJY2ggIGJpbiAgaWhyICBub2NoCituaWUgYXVmIGRpZSBGdWVzc2UgZ2V0cmV0ZW4uIgorCisiV2VpbCBkdSBub2NoIG5pZSBtaXQgaWhyIGdldGFuenQgaGFzdC4iLCBncmluc3RlIEJlbmV2b2xpby4KKworIkF1c3NlcmRlbSwgd2VubiBkdSBpaHIgbm9jaCBuaWUgYXVmIGRpZSBGdWVzc2UgZ2V0cmV0ZW4gIGJpc3QsICB2ZXJzdGVoZSAgaWNoCituaWNodCwgd2FydW0gc2llIGRpY2ggbmljaHQgbGllYmVuIHdpbGwuIiwgZnVlZ3RlIE1lcmN1dGlvIGhpbnp1LgorCitSb21lbyB2ZXJ6b2cgc2NobW9sbGVuZCBkYXMgR2VzaWNodC4gIkRhcyB3ZWlzcyBpY2ggYXVjaCBuaWNodC4iCisKKyJTY2hsdXNzIGpldHp0LCB3aXIgZ2VoZW4gaGluZWluIHVuZCBkdSB3aXJzdCBkaWNoIHNjaG9uIGFtdWVzaWVyZW4sIFJvbWVvLiIKKworIkRhcyBrbGluZ3Qgd2llIGVpbmUgRHJvaHVuZywgQmVuZXZvbGlvLiIsIGxhY2h0ZSAgTWVyY3V0aW8uICAiQW11ZXNpZXIgIGRpY2gsCitSb21lbywgYmlzIGRpciBkYXMgTGFjaGVuIGltIEhhbHNlIHN0ZWNrZW4gYmxlaWJ0LiIKKworIkRhcyB0dXQgZXMgYmVzdGltbXQuIiwgbWVpbnRlIFJvbWVvIGR1ZXN0ZXIuCisKZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvcm9tX2p1bC9zZWl0ZTcgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL3JvbV9qdWwvc2VpdGU3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZmE2NGIKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL3JvbV9qdWwvc2VpdGU3CkBAIC0wLDAgKzEsNDIwIEBACitERVIgRVJTVEUgQUtUCisJICBESUUgRlVFTkZURSBTWkVORQorCitEZXIgQWJlbmQga2FtIHVuZCBtaXQgaWhtIGRpZSBHYWVzdGUsIGRpZSBKYW1lcyAgZGFuayAgUm9tZW9zICBIaWxmZSAgZ2VmdW5kZW4KK2hhdHRlLiBTaWUgd2lzc2VuLCB3aWUgZXMgYmVpIHNvbGNoZW4gRmVzdGVuIHp1Z2VodDogRGllICBNZW5zY2hlbiwgIGRpZSAgc2ljaAorZG9ydCB0cmVmZmVuLCBzaW5kIGVpbmFuZGVyIGhhZXVmaWcgc3Bpbm5lZmVpbmQgdW5kICBrb21tZW4gIG51ciAgZGVzaGFsYiAgenVyCitQYXJ0eSwgd2VpbCBzaWUgamVtYW5kIGFuZGVyZW0gQm9zaGVpdGVuIHNhZ2VuIHdvbGxlbiwgZGllICBuaWNodHNkZXN0b3dlbmlnZXIKK2ZyZXVuZGxpY2gga2xpbmdlbi4gTmllbWFuZCBnZWh0IGdlcm5lIHp1IGVpbmVyICBzb2xjaGVuICBWZXJhbnN0YWx0dW5nLCAgZG9jaAorbWFuIGthbm4gc2ljaCBuaWNodCAgZXJsYXViZW4sCWlociAgZmVybiAgenUgIGJsZWliZW4sICB3ZWlsICBtYW4gIHNvbnN0ICBkaWUKK0dlcnVlY2h0ZSB2ZXJwYXNzdCwgZGllIGJpcyB6dXIgbmFlY2hzdGVuIFBhcnR5IGRlbiBHZXNwcmFlY2hzc3RvZmYgIGZ1ZXIgIGRpZQorZ2FuemUgZ3V0ZSBHZXNlbGxzY2hhZnQgYmlsZGVuIHdlcmRlbi4KKworSmFtZXMgd2lyYmVsdGUgbWl0IGVpbmVtIFN0YXVidHVjaCBpbiBkZXIgIEhhbmQgIGVpbiAgbGV0enRlcyAgTWFsICBkdXJjaCAgZGFzCitXb2huemltbWVyIGRlciBDYXB1bGV0cywgYXVzIGRlbSBtYW4gd29obHdlaXNsaWNoIGFsbGVzIFplcmJyZWNobGljaGUgZW50ZmVybnQKK2hhdHRlLiAiV28gc3RlY2t0IFBvdHBhbj8iCisKKyJXYXMgd2Vpc3MgZGVubiBpY2g/IiwgZnJhZ3RlIHNlaW4gS29sbGVnZS4KKworIkRhIHN0ZWhlbiBqYSBub2NoIGRpZSBTdHVlaGxlISBNdXNzIGljaCAgZGVubiAgYWxsZXMgIHNlbGJzdCAgbWFjaGVuPyIgIEphbWVzCitzY2huYXBwdGUgc2ljaCBlaW5lbiBLdWVjaGVuanVuZ2VuIGJlaSBkZW4gSGFhcmVuIHVuZCBzY2h1YnN0ZSBpaG4gaW4gUmljaHR1bmcKK2RlciB1bnNjaHVsZGlnIGRhc3RlaGVuZGVuIFN0dWVobGUuICJMb3MsIGJyaW5nIHNpZSByYXVzLiIKKworIkphd29sbCwgSnVuZ2NoZW4sIGhvbCBpaG4gcmF1cy4iIEphbWVzZW5zIEtvbGxlZ2UgaGllbHQgc2ljaCBkZW4gQmF1Y2guCisKKyJLZWluZSBaZWl0IGpldHp0IGZ1ZXIgV2l0emUuIiwgZ3JvbGx0ZSBKYW1lcy4gIlNpZWggenUsIGRhc3MgZWluICBTdHVlY2sgIHZvbgorZGVtIE1hcnppcGFuIGZ1ZXIgbWljaCB1ZWJyaWdibGVpYnQuIgorCisiTWFjaCBpY2guIiwgYW50d29ydGV0ZSBkZXIgYW5kZXJlIHVuZCB2ZXJzY2h3YW5kIG1pdCBlaW5lbSAgVGFibGV0dCAgYXVmICBkZW0KK0FybSBpbiBSaWNodHVuZyBLdWVjaGUuCisKK0phbWVzIHN0YXBlbHRlIGRpZSBTdHVlaGxlIGF1ZmVpbmFuZGVyLiAiUG90cGFuISIKKworIkljaCBiaW4gamEgc2Nob24gZGEuIEtvbW0gbWFsIHdpZWRlciBydW50ZXIuIiBQb3RwYW4gbGVja3RlICBzaWNoICBkaWUgIFJlc3RlCitkZXIgU2Nob2tvbGFkZW5zb3NzZSB2b24gZGVuIEZpbmdlcm4uCisKKyJXbyBoYXN0IGR1IGVpZ2VudGxpY2ggbmljaHQgZGllIEZpbmdlciBkcmluPyIsIGZyYWd0ZSBKYW1lcy4gIkxvcywgIGxvcywgIHdpcgoraGFiZW4gbmljaHQgZXdpZyBaZWl0LiBJc3QgZGllIEJ1ZWhuZSBmZXJ0aWc/IgorCisiSXN0IHNpZS4iCisKKyJEdSBoYXN0IGF1Y2ggZGllIFJ1aGUgd2VnLiIKKworIkJlc3NlciBydWhpZyBibGVpYmVuIGFscyBlaW5lbiBIZXJ6aW5mYXJrdCBiZWtvbW1lbi4iLCBncmluc3RlICBQb3RwYW4uICAiSG0sCitpc3QgZGFzIE1hcnppcGFuPyIKKworIkVzIGlzdCBfbWVpbl8gTWFyemlwYW4uIiBKYW1lcyBzdG9wZnRlIHNpY2ggZGFzIFN0dWVjayBpbiBkZW4gTXVuZC4gIkJvIGVpYmVuCitpZSBlbm4/IgorCisiS2VpbiBHcnVuZCwgc2ljaCB6dSB1ZWJlcnNjaGxhZ2VuLCBpbSBNb21lbnQgc3RlaGVuIHNpZSBhdWYgZGVyIFRlcnJhc3NlICB1bmQKK3JhdWNoZW4uIFplaXQgZ2VudWcsIGhpZXIgZmVydGlnIHp1IHdlcmRlbi4iCisKK0phbWVzIHNjaGx1Y2t0ZSBkZW4gbGV0enRlbiBCaXNzZW4gaGludW50ZXIgdW5kIHJpZWIgc2ljaCBkZW4gQmF1Y2guICJEYXMgIHdhcgorZ3V0LiBBbHNvLCB3ZWl0ZXIgamV0enQsIGRlbiBsZXR6dGVuIGJlaXNzZW4gZGllIEh1bmRlLiIKKworIkRlbiBsZXR6dGVuIGJlaXNzdCBKYW1lcy4iLCBncmluc3RlIFBvdHBhbi4KKworRGllIE11c2lrZXIsIGRpZSBnZXJhZGUgbWl0IGRlbSAgU3RpbW1lbiAgaWhyZXIgIEluc3RydW1lbnRlICBmZXJ0aWcgIGdld29yZGVuCit3YXJlbiwgc3BpZWx0ZW4gZGVuIFJpdmVyIEt3YWkgTWFyc2NoIHVuZCBiZWdsZWl0ZXRlbiBkYW1pdCBKYW1lcyBBYmdhbmcuCisKKyJKZXR6dCB6aXRpZXJlbiBzaWUgbmljaHQgbnVyIGF1cyB2b2VsbGlnIGFuZGVyZW4gUXVlbGxlbiwgamV0enQgIHNwaWVsZW4gIHNpZQorYXVjaCBub2NoIGRpZSBmYWxzY2hlIE11c2lrLiIgQXp6dXJvIHNjaHVldHRlbHRlIHNpY2ggdmVyendlaWZlbHQuCisKKyJHb2VubiBpaG5lbiBkZW4gU3Bhc3MuIiwgbWVpbnRlIFVsby4gIk5hY2hoZXIgbXVlc3NlbiAgc2llICBlaCAgbnVyICBTY2hsYWdlcgorc3BpZWxlbi4iCisKK0F6enVybyBkZXV0ZXRlIGF1ZiBkaWUgVHVlci4gIkRhIGtvbW1lbiBzaWUuIEFiZXIgd28gc3RlY2t0IGRlbm4gUm9tZW8/IgorCisiRGVyIGtvbW10IGJlc3RpbW10IGdsZWljaC4iIFVsbyB6dWNrdGUgZGllIFNjaHVsdGVybi4gIkVyIHdpcmQgZGFzIFJlbmRlenZvdXMKK21pdCBzZWluZW0gU2NoaWNrc2FsIGthdW0gdmVycGFzc2VuIHdvbGxlbi4iCisKKyJLbGFuZyBhYmVyIHZvcmhpbiBnYW56IHNvLiBOYSwgd2lyIHdlcmRlbiBzZWhlbi4gSnVsaWEgaXN0IGplZGVuZmFsbHMgZGEuIgorCisiSW4gZGllc2VtIHdlaXNzZW4gS2xlaWQgc2llaHQgc2llIHppZW1saWNoIHNjaGxhbmsgYXVzLiIgVWxvIHNjaHVldHRlbHRlICBkZW4KK0tvcGYuICJTaWUgaGFldHRlIGJlc3NlciBldHdhcyBmYXJiaWdlcyBhbmdlem9nZW4uIgorCisiU2NobGFuaz8iICBBenp1cm8gIHNjaGF1dGUgIGhpbnVlYmVyLiAgIlNvICBuZXR0ICBrYW5uICBhdWNoICBudXIgIGVpbmUgIEZyYXUKK3VudGVydHJlaWJlbi4iCisKK0ZyYXUgQ2FwdWxldCwgZGVyZW4gYmxvbmRlcyBIYWFyICB1ZWJlciAgZGFzICBkdW5rZWxibGF1ZSAgS2xlaWQgIHp1ICBmbGllc3Nlbgorc2NoaWVuLCBiZXVndGUgc2ljaCB6dSBpaHJlciBDb3VzaW5lIGhlcnVlYmVyLiAiTWVpbmUgTGllYnN0ZSwgIHdhcyAgZnVlciAgZWluCit3dW5kZXJzY2hvZW5lcyBLbGVpZCBkdSBkYSB0cmFlZ3N0ISIgSWhyZSBBdWdlbiBmdW5rZWx0ZW4uICAiSWNoICBoYWJlICBkaWVzZW4KK1N0aWwgbGV0enRlcyBKYWhyIHNjaG9uIGFuIHVuc2VyZXIgUHV0emZyYXUgYmV3dW5kZXJ0LCBkdSBtdXNzdCBtaXIgIHVuYmVkaW5ndAorc2FnZW4sIHdvIGR1IGVzIGhhc3QgbWFjaGVuIGxhc3Nlbi4iCisKK0hlbGVuYSBsYWVjaGVsdGUgdW5kIHplaWd0ZSBkYWJlaSB6dSB2aWVsZSAgWmFlaG5lLiAgIkFiZXIgIG51ciAgd2VubiAgZHUgIG1pcgorc2Fnc3QsIHdlbGNoZXIgRnJpc2V1ciBkZWluIEhhYXIgenVyaWNodGV0LiIKKworVWxvIGJvZyBzaWNoIGF1ZiBpaHJlbSBBc3Qgdm9yIHVudGVyZHJ1ZWNrdGVtIExhY2hlbi4gIkhhc3QgIGR1ICBkYXMgIGdlaG9lcnQsCitBenp1cm8/IiBTaWUgcHJ1c3RldGUgbG9zLiAiWnVyaWNodGV0Li4uIgorCisiSG0/IiBBenp1cm9zIEF1Zm1lcmtzYW1rZWl0IGdhbHQgZGVuIGp1ZW5nZXJlbiB1bnRlciBkZW4gd2VpYmxpY2hlbiBHYWVzdGVuLgorCisiRGllc2UgIFN0aWNoZWxlaSAgaXN0ICBkb2NoICBkYXMgIHNjaG9lbnN0ZSAgYW4gIHNvICBlaW5lbSAgRmVzdC4iICBVbG8gICB3YXIKK29mZmVuc2ljaHRsaWNoIGluIGlocmVtIEVsZW1lbnQuCisKK0hlcnIgQ2FwdWxldCBicmVpdGV0ZSB0aGVhdHJhbGlzY2ggZGllIEFybWUgYXVzLiAiR2VnZXNzZW4gIGhhYmVuICB3aXIsICBqZXR6dAord29sbGVuIHdpciAgZGVuICBEYW1lbglHZWxlZ2VuaGVpdCAgZ2ViZW4sICBkaWUgIEthbG9yaWVuICBhYnp1YXJiZWl0ZW4uIiAgRXIKK3Zlcm5laWd0ZSBzaWNoIHVlYmVydHJpZWJlbiB2b3IgRnJhdSBDYXB1bGV0LiAiTWVpbmUgTGllYmU/IgorCitEYXMgR2VzaWNodCwgZGFzIEZyYXUgQ2FwdWxldCB6b2csIGxpZXNzIGtlaW5lbiBad2VpZmVsIGRhcmFuLAlkYXNzICBiZWkgIGRlbgorUXVhbGl0YWV0ZW4gaWhyZXMgR2F0dGVuIGFscyBUYWVuemVyIGRpZSBCZXRvbnVuZyBhdWYgIGRlciAgZXJzdGVuICBTaWxiZSAgdm9uCitRdWFsaXRhZXQgbGFnLiAiVmllbGxlaWNodCAgc29sbHRlbiAgd2lyICBoZXV0ZSAgZGllICBqdW5nZW4gIExldXRlICBkZW4gIFRhbnoKK2Vyb2VmZm5lbiBsYXNzZW4sIG1laW4gTGllYmVyLiIgU2llIHdpbmt0ZSBKdWxpYSB1bmQgIFBhcmlzICBoZXJhbi4gICJTZWlkICBzbworbGllYiwgS2luZGVyLiIKKworIkdhbnogcmVjaHQsIExpZWJzdGUsIHdpciB3ZXJkZW4gYWxsbWFlaGxpY2ggenUgIGFsdCAgZGFmdWVyLiIsICBzdGltbXRlICBIZXJyCitDYXB1bGV0IHp1IHVuZCBlcm50ZXRlIGRhZnVlciBlaW5lbiBnaWZ0aWdlbiBCbGljayB2b24Jc2VpbmVyCUZyYXUsICBkZW4gIGVyCitqZWRvY2ggdHVubGljaHN0IHVlYmVyc2FoLiAiV2FzLCBIZXJtYW5uLCBpc3Qgc2Nob24gZWluZSBnYW56ZSBaZWl0IGhlciwgIGRhc3MKK3dpciBudXIgenVtIFNwYXNzIGdldGFuenQgaGFiZW4sIG5pY2h0PyIKKworIkphIGRvY2guIiBTZWluIENvdXNpbiBIZXJtYW5uIGxpZXNzICBzaWNoICBzY2h3ZXIgIG5lYmVuICBpaG4gIGF1ZiAgZGllICBCYW5rCitmYWxsZW4uICJEYXMgaXN0IGJlc3RpbW10IHNjaG9uIHp3YW56aWcgSmFocmUgaGVyLiIKKworIkFjaCwgc28gbGFuZyBrYW5uIGRhcyBkb2NoIG5pY2h0IHNlaW4uIFNjaGxpZXNzbGljaCBoYWJlbiB3aXIgIGJlaSAgTHVjZW50aW9zCitIb2NoemVpdCBub2NoIG1hZWNodGlnIGRpZSBNYWVkY2hlbiBnZXdpcmJlbHQuIiwgbGFjaHRlIENhcHVsZXQuCisKKyJOZWluLCBkYSBiaW4gaWNoIGdhbnogc2ljaGVyLiBTY2hsaWVzc2xpY2ggd2FyICBMdWNlbnRpb3MgIEhvY2h6ZWl0ICBudXIgIGVpbgoraGFsYmVzCUphaHIgIG5hY2ggIEtsZWluLU1hcmt1cyAgVGF1ZmUsICB1bmQgIGRlciAgd2lyZCAgIGRlbW5hZWNoc3QJc2VsYmVyCitTY2h3aWVnZXJ2YXRlci4iCisKKyJEYXMga2FubiBkb2NoIG5pY2h0IHNlaW4uIEtpbmRlciwgS2luZGVyLCB3aWUgZGllIFplaXQgdmVyZ2VodC4iIEhlcnIgQ2FwdWxldAordGFldHNjaGVsdGUgZGllIEhhbmQgc2VpbmVyIEZyYXUgdW5kIGxhZWNoZWx0ZSBkdWVtbWxpY2gsIGFscyBpaG0gYXVmZ2luZywgd2FzCitlciBnZXJhZGUgZ2VzYWd0IGhhdHRlLiAiQWJlciBkYW1hbHMgZ2FiIGVzIGRpY2ggIGphICBub2NoICBnYXIgIG5pY2h0LCAgbWVpbmUKK0xpZWJlLiIKKworIlBmZnQuIiwgbWFjaHRlIEZyYXUgQ2FwdWxldCB1bmQgd2FuZHRlIHNpY2ggIHdpZWRlciAgaWhyZXIgIENvdXNpbmUgIHp1LCAgZGllCitlaW5lbiBNb21lbnQgbGFuZyBkaWUgQmVoZXJyc2NodW5nIHZlcmxvciB1bmQgdWViZXIgZGFzIGdhbnplIEdlc2ljaHQgZ3JpbnN0ZS4KKworIlNjaGF1IGFuLCBIZXJtYW5uLCB3aXIgYmVrb21tZW4gc29nYXIgIHVuZXJ3YXJ0ZXRlbiAgQmVzdWNoLiIgIENhcHVsZXQgIGVyaG9iCitzaWNoIHVuZCBnaW5nIGF1ZiBSb21lbyB1bmQgc2VpbmUgRnJldW5kZSB6dS4gIldpbGxrb21tZW4sIG1laW5lIEhlcnJlbiwgIGFiZXIKK251ciwgd2VubiBzaWUgYXVjaCB3aXNzZW4gd2llIG1hbiB0YW56dC4iCisKK01lcmN1dGlvIHZlcmJldWd0ZSBzaWNoIGFuZGV1dHVuZ3N3ZWlzZS4gIkphLCBkYXMgd2lzc2VuIHdpci4iCisKKyJEYW5uIGZ1ZWhsZW4gU2llIHNpY2ggZ2FueiB3aWUgZGFoZWltLiIKKworUm9tZW9zIEF1Z2VuIHNjaHdlaWZ0ZW4gZHVyY2ggZGVuIFNhYWwgdW5kIHN1Y2h0ZW4gUm9zYWxpbmUsIGJpcyBzaWUgYW4gIEp1bGlhCitoYWVuZ2VuYmxpZWJlbi4gRWluZW4gQXVnZW5ibGljayBsYW5nIGhpZWx0IGRpZSBXZWx0IGRlbiBBdGVtIGFuLiBEaWUgIE11c2lrZXIKK3ZlcnN0dW1tdGVuLCBkaWUgVGFlbnplciBzdGFuZGVuIHN0aWxsLCAgZGllICBhZWx0ZXJlbglNYWVubmVyICBsaWVzc2VuICBpaHJlCitXZWluZ2xhZXNlciBzaW5rZW4sIGRlbiBEYW1lbiBibGllYmVuIGZ1ZXIgZWluZW4gTW9tZW50IGRpZSBCb3NoZWl0ZW4gaW0gSGFsc2UKK3N0ZWNrZW4gdW5kICBzZWxic3QgIEphbWVzICB2ZXJnYXNzICBmdWVyICBkZW4JSGF1Y2ggIGVpbmVzICBBdWdlbmJsaWNrcyAgZGFzCitTY2huYXBzZ2xhcyBpbiBzZWluZXIgSGFuZC4gRWluZSBHYXNzZSBzY2hpZW4gc2ljaCBkdXJjaCBkaWUgTWVuc2NoZW4gaGluZHVyY2gKK2F1Znp1dHVuLCBpbiBkZXIgZGllIG1ldGFwaG9yaXNjaGVuIEJsaXR6ZSwgZGllIHp3aXNjaGVuIGRlbiBBdWdlbiBSb21lb3MgIHVuZAorSnVsaWFzIGhpbiB1bmQgaGVyc2Nob3NzZW4ga2VpbmVuIFNjaGFkZW4gYW5yaWNodGVuIGtvbm50ZW4uCisKK0Rhbm4gZmllbCBKYW1lcyBkYXMgR2xhcyBhdXMgZGVyIEhhbmQgdW5kIGRlciBCYW5uIHdhciBnZWJyb2NoZW4uCisKK1JvbWVvIGVyZ3JpZmYgZGVuIEFlcm1lbCBlaW5lcyBLZWxsbmVycy4gIldlciBpc3Qgc2llPyIKKworIkRpZSBvYmxpZ2F0b3Jpc2NoZSBGcmFnZS4iLCBtdXJtZWx0ZSBBenp1cm8gdW5kIHZlcnN1Y2h0ZSwgZGllIEZhc3ppbmF0aW9uIHp1Cit1ZWJlcnNwaWVsZW4sIGRpZSBhdWNoIGlobiBlcmZhc3N0IGhhdHRlLgorCisiS2VpbmUgQWhudW5nLCBpY2ggYmluIG51ciB6dXIgQXVzaGlsZmUgaGllci4iLCBhbnR3b3J0ZXRlIGRlciBLZWxsbmVyLgorCisiRGllIG9ibGlnYXRvcmlzY2hlIEFudHdvcnQuIiBVbG8gc2Nod2VsZ3RlIGluICBkZXIgIFJvbWFudGlrICBkZXIgIFNpdHVhdGlvbi4KKyJIYWx0IGRpY2ggZmVzdCwgQXp6dXJvLCBqZXR6dCBsZWd0IGVyIGxvcy4iCisKK0F6enVybyBzdG9laG50ZS4gIkljaCBnZWggbWlyIGRlcndlaWwgZWluZSBGbGllZ2UgZmFuZ2VuLiIKKworQXVjaCBNZXJjdXRpbyB3YXIgUm9tZW9zIHZlcnp1ZWNrdGVyIEdlc2ljaHRzYXVzZHJ1Y2sgbmljaHQgZW50Z2FuZ2VuLiAiV28gaXN0CitkZW5uIFJvc2FsaW5lPyIKKworIldlciBpc3QgUm9zYWxpbmU/IiwgZnJhZ3RlIFJvbWVvLiBFciBibGlja3RlIHp1IFVsbyBoaW51ZWJlciwgIGRpZSAgc2ljaCAgYXVmCitpaHJlbSBBc3Qgdm9ybGVobnRlLiAiU2llIGlzdCB3aWUgZWluZSBUYXViZSwgZGllIHp3aXNjaGVuIEtyYWVoZW4gZmxpZWd0LCBzbywKK3dpZSBzaWUgZGEgZHJ1ZWJlbiB6d2lzY2hlbiBkZW4gYW5kZXJlbiBGcmF1ZW4Jc3RlaHQuCVNvICBzY2hsYW5rICB3aWUgIGVpbmUKK2p1bmdlIEJpcmtlLiIKKworQXp6dXJvIGthbSBtaXQgZWluZXIgTW90dGUgaW0gU2NobmFiZWwgenVydWVjayB1bmQgcmVpY2h0ZSAgc2llICBVbG8uICAiQmlya2U/CitEYXMgc2luZCBkaWUgbWFnZXJlbiBEaW5nZXIsIGRpZSBiZWkgamVkZW0gU3R1cm0gU2Nod2llcmlna2VpdGVuIGhhYmVuLCBzdGVoZW4KK3p1IGJsZWliZW4sIG5pY2h0PyIKKworIkR1IGJpc3Qgd2lkZXJsaWNoLCBBenp1cm8uIiBVbG8gdmVyc3BlaXN0ZSBkaWUgIE1vdHRlLCAgb2huZSAgZGVuICBCbGljayAgdm9uCitSb21lbyB6dSBsYXNzZW4uCisKKyJJY2ggaGFiZSBub2NoIG5pZSBlaW5lIEZyYXUgd2llIHNpZSBnZXNlaGVuLiAgVW5kICBpY2ggIFRyb3R0ZWwgIGRhY2h0ZSwgIGljaAorbGllYnRlIFJvc2FsaW5lISIKKworIlRyb3R0ZWwgaXN0IGRhcyByaWNodGlnZSBXb3J0LiIsIG11cm1lbHRlIEF6enVyby4KKworIlNhZyBpY2ggZG9jaCBkaWUgZ2FuemUgWmVpdC4iLCB2ZXJzZXR6dGUgVWxvLgorCitUeWJhbHQgZHJlaHRlIGRlbiBLb3BmIHVuZCBlcmthbm50ZSBSb21lby4gIldhcyBkZW5uLCB3aWUgZGVubj8gRGFzICBpc3QgIGRvY2gKK1JvbWVvIE1vbnRhZ3VlLCBkYSBkcnVlYmVuPyIsIGZyYWd0ZSBlciBIZXJybiBDYXB1bGV0LgorCisiSmEgdW5kPyIgSGVyciBDYXB1bGV0IHZlcnN0YW5kIHNlaW5lbiBOZWZmZW4gbmljaHQuCisKKyJFciBpc3QgYmVzdGltbXQgbnVyIGhlcmdla29tbWVuLCB1bSB1bnMgZGFzIEZlc3QgenUgdmVyZGVyYmVuLiIgVHliYWx0IGxvZXN0ZQorc2VpbmVuIERlZ2VuIGluIGRlciBTY2hlaWRlLgorCisiV2llIGtvbW1zdCBkdSBkZW5uIGRhcmF1Zj8iCisKKyJFciBpc3QgZWluIE1vbnRhZ3VlLCBvZGVyPyBLYW5uc3QgZHUgZGlyIGV0d2FzIGFuZGVyZXMgdm9yc3RlbGxlbiwgIGFscyAgZGFzcworZXIga2VpbmUgR2VsZWdlbmhlaXQgYXVzbGFlc3N0LCB1bnMgenUgYWVyZ2Vybj8iCisKKyJEYXMgaWhyIGp1bmdlbiBMZXV0ZSBhdWNoIGltbWVyIG51ciBkYXMgU2NobGVjaHRlIGluIGFuZGVyZW4gc2VoZW4gbXVlc3N0LiBFcgoraXN0IGp1bmcsIGFsc28gd2lyZCBlciBoZXJnZWtvbW1lbiBzZWluLCB1bSB6dSB0YW56ZW4uIEdpYiBhbHNvIFJ1aGUuIgorCisiTGllYmVyIE9ua2VsLCBkZW0gd2VyZGUgaWNoJ3MgemVpZ2VuLiIsIGtudXJydGUgVHliYWx0LgorCisiV2VubiBkdSBkYXJhdWYgYmVzdGVoc3QsIGRhbm4gYmVzaWVnZSBpaG4gYXVmIGRlciBUYW56ZmxhZWNoZS4iCisKKyJNaXQgZWluZW0gRGVnZW4gaW4gZGVyIEhhbmQuIiwgZnJldXRlIHNpY2ggVHliYWx0LgorCisiTmVpbiwgbWl0IGVpbmVtIE1hZWRjaGVuIGltIEFybS4iIENhcHVsZXQgIGRhY2h0ZSAgYW4gIHNlaW5lICBHZWxkYm9lcnNlICB1bmQKK2RhcmFuLCBkYXNzIGVyIHNpY2ggZWluZSBuZXVlcmxpY2hlIEdlbGRzdHJhZmUgbmljaHQgbGVpc3RlbiBrb25udGUuICJJbW1lcmhpbgoraXN0IGVyIGVpbiBHYXN0IHVuZCBpbSBHZWdlbnNhdHogenUgZGlyIGlzdCBlcgltaXIgIGhldXRlICBhYmVuZCAgbm9jaCAgbmljaHQKK3VuYW5nZW5laG0gYXVmZ2VmYWxsZW4uIgorCisiQWJlci4uLiIgVHliYWx0IGtvbm50ZSBuaWNodCBhdXMgc2VpbmVyIEhhdXQuCisKKyJCZW5pbW0gZGljaCwgdmVyc3RlaHN0IGR1PyBKYSwgTGl2aWEsIGRhIGhhc3QgZHUgb2huZSBad2VpZmVsIHJlY2h0LiIgRXIgd2FyZgorVHliYWx0IGVpbmVuIGxldHp0ZW4gQmxpY2sgenUgdW5kIGthbSAgZGFubiAgc2VpbmVuICBQZmxpY2h0ZW4JYWxzICBHYXN0Z2ViZXIKK25hY2guCisKKyJPaC1vaC4iLCBtYWNodGUgVWxvLgorCisiRXIgaXN0IHNhdWVyLiIsIHN0aW1tdGUgQXp6dXJvIGlociB6dS4KKworIlNhdWVyPyBFciBpc3QgZGFlbWxpY2guIiBUeWJhbHQgYmV6b2cgQXp6dXJvcyBLb21tZW50YXIgYXVmIHNlaW5lbiBPbmtlbC4KKworIktyYWguIiwgYW50d29ydGV0ZSBVbG8uCisKKyJXZWlzc3QgZHUgd2FzLCBLcmFlaGU/IiBUeWJhbHRzIEF1Z2VuIGdsaXR6ZXJ0ZW4uCisKKyJLcmFoPyIKKworIkljaCB3ZXJkZSBSb21lbyB6ZWlnZW4sIHdhcyBpY2ggdm9uIGlobSBoYWx0ZS4gVmllbGxlaWNodCBuaWNodCAgamV0enQsICBkZW5uCittZWluIHR1ZWRkZWxpZ2VyIE9ua2VsIHdpbGwgbWljaCBqYSBuaWNodCBsYXNzZW4sIGFiZXIgYmFsZC4gU2VociBiYWxkLiIKKworQXp6dXJvIHNhaCBUeWJhbHQgbmFjaC4gIkRhcyBhbHNvIHdhciBkZXIgQXVmdHJpdHQgZGVzIEJvZXNld2ljaHRzLiIKKworIlZlcmdpc3MgaWhuLiBHdWNrIGxpZWJlciBkYSBydWViZXIuIFNpbmQgIHNpZSAgbmljaHQgIG5pZWRsaWNoPyIgIFVsb3MgIEF1Z2VuCitoYXR0ZW4gZWluZW4gIEF1c2RydWNrLCAgZGVuICBBenp1cm8gIHZvbiAgRnJhdWVuICBrYW5udGUsICBkaWUgIGVpbmFuZGVyICBtaXQKK0tpbmRlcndhZ2VuIGltIFBhcmsgYmVnZWduZXRlbiB1bmQgaWhyZSBLaW5kZXIgdmVyZ2xpY2hlbi4KKworUm9tZW8gaGF0dGUgaW56d2lzY2hlbiBkZW4gQnJlaSBpbiBzZWluZW4gQmVpbmVuICBiZXNpZWd0ICB1bmQJZXMgIGdlc2NoYWZmdCwKK3NpY2ggZHVyY2ggZGFzIEdlZHJhZW5nZSBkZXIgR2Flc3RlIHp1IEp1bGlhIHZvcnp1YXJiZWl0ZW4uIE51biBzdGFuZCAgZXIgIHZvcgoraWhyIHVuZCBzY2hpZW4gZWluZW4gZXJuc3RoYWZ0ZW4gVmVyc3VjaCB6dSB1bnRlcm5laG1lbiwgIGluICBpaHJlbiAgQXVnZW4gIHp1CitlcnRyaW5rZW4uCisKKyJFciBzaWVodCBsYWVjaGVybGljaCBhdXMuIiBBenp1cm8ga2FubnRlICBrZWluICBNaXRnZWZ1ZWhsICBmdWVyICBkZW4gIGZyaXNjaAorVmVybGllYnRlbi4gIlNjaG5hcHB0IG1pdCBvZmZlbmVtICBNdW5kICBuYWNoICBMdWZ0ICB3aWUgIGVpbiAgRmlzY2ggIGF1ZiAgZGVtCitUcm9ja2VuZW4uIgorCitOYWNoIGVpbmVyIFdlaWxlIHNhaCBSb21lbyBhdWYgc2VpbmUgSGFuZCAgaGluYWIgIHVuZCAgZWluZSAgRWluZ2VidW5nCXp1Y2t0ZQorZHVyY2ggc2VpbiBHZXNpY2h0IHdpZSBlaW4gQmxpdHogdWViZXIgZWluZW4gZHVua2xlbiBIaW1tZWwuICJEYXJmIGljaCBkaXIgZGllCitIYW5kIGdlYmVuPyIKKworQXp6dXJvIHN0b2VobnRlLgorCisiV2FydW0/IiBKdWxpYSBoYXR0ZSBSb21hbmUgZ2VsZXNlbi4KKworIkljaCBtb2VjaHRlIGRpciBndXRlbiBUYWcgc2FnZW4uIgorCisiQWguIEphLCBkdSBkYXJmc3QgbWlyIGRpZSBIYW5kIGdlYmVuLiIgSnVsaWFzIFNldWZ6ZXIgdmVyc2NobW9seiBtaXQgQXp6dXJvcywKK2RlciBzaWNoIGF1ZiBlaW5lciBaaW1tZXJwZmxhbnplIG5pZWRlcmdlbGFzc2VuIGhhdHRlLgorCisiV2VubiBpY2ggZGljaCBhbmZhc3NlLi4uIiwgZmx1ZXN0ZXJ0ZSBBenp1cm8uICJOZWluLCAgd2FydGUuICBXZW5uICBpY2ggIGRpY2gKK2JlcnVlaHJlLCBmdWVobGUgaWNoIG1pY2ggd2llIGVpbiBrbGVpbmVyIEp1bmdlIHZvciBlaW5lbSBXZWlobmFjaHRzYmF1bS4iCisKK1JvbWVvIHdpZWRlcmhvbHRlIEF6enVyb3MgV29ydGUuCisKKyJXZWlobmFjaHRzYmF1bT8gSGFiZSBpY2ggZGVubiBwaWVrc2lnZSBOYWRlbG4/IE9kZXIgYmluIGljaCB6dSBhdWZnZXB1dHp0PyIKKworIkFlaC4uIiwgbWFjaHRlIFJvbWVvIHVuZCB3YXJmIGVpbmVuIHZlcnp3ZWlmZWx0ZW4gQmxpY2sgYXVmIEF6enVybywgIGRlciAgbnVyCitoYWVtaXNjaCBncmluc3RlIHVuZCBkZW4gYW5nZWhlbmRlbiAgTGllYmhhYmVyCXNlaW5lbQlTY2hpY2tzYWwgIHVlYmVybGllc3MuCitSb21lbyBob2x0ZSB0aWVmIEx1ZnQgIHVuZCAgZ2luZyAgaW0gIEdlaXN0ZSAgYWxsZSAgbWl0ICBlaW5lbQlXZWlobmFjaHRzYmF1bQorYXNzb3ppaWVydGVuIEdlZGFua2VuIGR1cmNoLCBkb2NoIGFiZ2VzZWhlbiB2b24gZGVuIE5hZGVsbiAgdW5kICBkZW0gIFNjaG11Y2ssCitkaWUgSnVsaWEgYmVyZWl0cyBlcndhZWhudCBoYXR0ZSwgd29sbHRlIGlobSBudXIgZGVyIER1ZnQgIGVpbmZhbGxlbi4gIE1vbWVudCwKK2RhY2h0ZSBlciwgZGVyIER1ZnQhICJJY2ggd29sbHRlIHNhZ2VuLCBkdSBkdWZ0ZXN0IHdpZSBlaW4gV2VpaG5hY2h0c2JhdW0uIFNvLAorYWxzIHNlaSBlaW4gZ2FuemVyIFdhbGQgaW4gZWluZW0gZWluemlnZW4gWmltbWVyLiIgUm9tZW8gZnVlaGx0ZSBkaWUgQWxwZW4gdm9uCitzZWluZW0gSGVyemVuIGZhbGxlbi4KKworSnVsaWEgaG9sdGUgdGllZiBMdWZ0LCBiZXNhbm4gc2ljaCBkYW5uIGFiZXIgaWhyZXIgZ3V0ZW4gTWFuaWVyZW4gdW5kIHN0YXR0IHp1CiticnVlbGxlbiwgc2Vua3RlICBzaWUgIGRpZSAgU3RpbW1lICB6dQllaW5lbSAgdW5oZWlsdmVya3VlbmRlbmRlbiAgRmx1ZXN0ZXJuLgorIldpbGxzdCBkdSB3aXJrbGljaCBzYWdlbiwgZGFzcyBpY2ggbmFjaCBfSE8tRnJpc2NoXyAgcmllY2hlPyIKKworIldhcyBtZWludCBzaWUgbWl0IEhPLUZyaXNjaD8iLCBmcmFndGUgQXp6dXJvIHZlcndpcnJ0LgorCisiSGFpbWxpY2hlcy1PZXJ0Y2hlbi1GcmlzY2guIiwgYW50d29ydGV0ZSBVbG8sICBkaWUgIFJvbWVvcyAgTGVpZCAgbmljaHQgIG1laHIKK2VydHJhZ2VuIGtvbm50ZSB1bmQgaWhtIGxlaXNlIGlucyBPaHIgZmx1ZXN0ZXJ0ZTogIkljaCBzdGVoZSB2b3IgZGlyICB3aWUgIGVpbgorS2luZCB1bmQgYmV3dW5kZXJlIGRlaW5lIFNjaG9lbmhlaXQuIFdvIGR1IGJpc3QsIHdlcmRlbiBUcmFldW1lIHdhaHIuIgorCitSb21lb3MgTGlwcGVuIGJld2VndGVuIHNpY2gsIGFscyBlciBkaWUgV29ydGUgd2llZGVyaG9sdGUgdW5kIGFuIGRlciByaWNodGlnZW4KK0JldG9udW5nIHVlYmVybGVndGUuIFNjaGxpZXNzbGljaCBmYXNzdGUgZXIgc2ljaCBlaW4gSGVyeiB1bmQgc3ByYWNoIHNpZSAgbGF1dAorYXVzLiBKdWxpYSwgZGllIHNjaG9uIGhhbGIgZW50c2NobG9zc2VuIGdld2VzZW4gd2FyLCBkZW4ganVuZ2VuIE1hbm4sIGRlciBzaWNoCitzbyB0b2VscGVsaGFmdCBiZW5haG0gc3RlaGVuenVsYXNzZW4sIHNjaG1vbHogZGFoaW4uICJXaXJrbGljaD8iCisKKyJPaCwgamEuIiwgdmVyc2ljaGVydGUgaWhyIFJvbWVvLiAiVW5kIHN1ZXNzIHdpZSBlaW4gTWFyemlwYW5hcGZlbC4iICBOdW4sICBkYQorZXIgZWluZW4gSGlud2VpcyBiZWtvbW1lbiBoYXR0ZSwga2FtICBzZWluZSAgWnVuZ2UgIG1pdCAgZGVtICBBdXNzcHJlY2hlbiAgZGVyCitLb21wbGltZW50ZSBrYXVtIG5vY2ggbmFjaC4gIkRlaW4gSGFhciBpc3QgZ29sZGVuIHdpZSBkYXMgIEtsZWlkICBkZXMgIEVuZ2VscywKK2RlbiB3aXIgZGFoZWltIGltbWVyIGF1ZiBkaWUgU3BpdHplIHNldHplbi4gRGVpbmUgSGFlbmRlIHNpbmQgZ2VuYXVzbyB6aWVybGljaAord2llIHNlaW5lLiBXZWlzc3QgZHUsIGVyIGlzdCBhdXMgV2FjaHMsIHVuZCBsZWlkZXIgaXN0IGVyIGVpbm1hbCAgenUgIG5haGUgIGFuCitlaW5lIEtlcnplIGdlcmF0ZW4gdW5kIGRhYmVpIHNpbmQgZGllIEhhZW5kZSBlaW4gIGJpc3NjaGVuICBnZXNjaG1vbHplbi4gIEFiZXIKK21hbiBrYW5uIGltbWVyIG5vY2ggc2VoZW4sIGRhc3MgZXMgSGFlbmRlIHNpbmQuIERlaW4gS2xlaWQgIGdsaXR6ZXJ0ICB3aWUgIGRpZQorU3RhbmlvbHN0ZXJuZSwgZGllIHdpciBpbW1lciB3ZXJmZW4sIGRhbWl0IHNpZSBuaWNodCBzbyAgaGluZ2VzZXR6dCAgYXVzc2VoZW4uCitEZWluZSBBdWdlbiBzY2hpbW1lcm4gd2llIGRpZSBLZXJ6ZW4gdW5kIHNvd2llc28gaGFiZSBpY2ggIGRhcwlHZWZ1ZWhsLCAgZGFzcworc2llIG1pY2ggZ2xlaWNoIHZlcmJyZW5uZW4gd2VyZGVuLiIgQXVmIGRlbiBsZXR6dGVuIFNhdHogd2FyICBSb21lbyAgYmVzb25kZXJzCitzdG9seiwgZGVubiBlciBoYXR0ZSBlaW5tYWwgaW4gZWluZW0gUm9tYW4gc2VpbmVyIE11dHRlciAgZ2VzdG9lYmVydCAgdW5kICB3YXIKK3VlYmVyIGRpZSBXb3J0ZSBfYnJlbm5lbmRlXyBfTGllYmVfIGdlc3RvbHBlcnQuCisKK0p1bGlhIHVlYmVybGVndGUga3Vyeiwgb2Igc2llIGF1ZiBkaWUgZ2VzY2htb2x6ZW5lbiBIYWVuZGUgZGVzIEVuZ2VscyAgZ2VuYXVlcgorZWluZ2VoZW4gc29sbHRlLCBkb2NoIGRhbm4gc2Nob2Igc2llIGRlbiBHZWRhbmtlbiAgYmVpc2VpdGUuICAiV2VubiAgaWNoICBlaW5lCitLZXJ6ZSB3YWVyZSwgd3VlcmRlIGljaCBzY2htZWx6ZW4uIiwgc3RlbGx0ZSBzaWUgZmVzdC4KKworIkRhcmYgaWNoIGRpY2ggc2NobWVsemVuPyIsIGZyYWd0ZSBSb21lbywgZGVyIG51biBrZWNrIHd1cmRlLgorCisiV2VubiBkdSBkaWUgRmxhbW1lICBiaXN0LCAgZGllICBtaWNoICBzY2htaWx6dCwgIGdlaHN0ICBkdSAgYXVzLCAgc29iYWxkICBpY2gKK2dlc2NobW9semVuIGJpbi4iCisKK1JvbWVvIGRhY2h0ZSBlaW5lbiBNb21lbnQgbmFjaC4gIk9oLCBkYXMgaXN0IG5pY2h0IHNjaGxpbW0sIGRlbm4gd2VubiBpY2ggIGRhcworV2FjaHMgbmljaHQgbWVociBoYWJlLCBudWV0enQgbWlyIGF1Y2ggZGVyIERvY2h0IG5pY2h0cy4iCisKK0p1bGlhIHdhcmYgZWluZW4gendlaWZlbG5kZW4gQmxpY2sgYXVmIFJvbWVvcyBNaXR0ZS4gIkRvY2h0PyIKKworIkFlaC4uLiIgUm9tZW8gem9lZ2VydGUuICJOYWphLCBpY2ggbWVpbmUsIHdlbm4gZHUgbmljaHQgIGluICBkZXIgIFdlbHQgIGJpc3QsCitkYW5uIGthbm4gaWNoIHNvd2llc28gbmllIG1laHIgYnJlbm5lbi4iCisKKyJBY2ggc28uIgorCitQb2xseSwgZGllIG1pdCBBcmd1c2F1Z2VuIHVlYmVyIGRpZSBUdWdlbmQgZGVyCWJlaWRlbglqdW5nZW4JTGV1dGUgIGdld2FjaHQKK2hhdHRlLCB3YWVobHRlIGRpZXNlbiBBdWdlbmJsaWNrLCB1bSB6dSBKdWxpYSB6dSB0cmV0ZW4uICJEZWluZSBNdXR0ZXIgbW9lY2h0ZQorZGljaCBzcHJlY2hlbiwgU2NoYXR6LiIKKworSnVsaWEgZHJlaHRlIGRhcyBHZXNpY2h0IHp1ciBTZWl0ZSB1bmQgem9nIGVpbmUgU2NobnV0ZSwgZGFubiB6dWNrdGUgIHNpZSAgbWl0CitkZW4gIFNjaHVsdGVybgl1bmQgIGdpbmcgIHp1ICBpaHJlciAgTXV0dGVyLCAgZGllICBhbQlBdXNnYW5nICAgZGllCUdhZXN0ZQordmVyYWJzY2hpZWRldGUuCisKKyJXZXIgaXN0IGRlbm4gaWhyZSBNdXR0ZXI/IiwgZnJhZ3RlIFJvbWVvLgorCisiRGFzIHdpc3NlbiBTaWUgbmljaHQ/IiBQb2xseSB3YXIgZWhybGljaCAgZXJzdGF1bnQuICAiSWhyZSAgTXV0dGVyICBpc3QgIEZyYXUKK0NhcHVsZXQsIHVuZCB3ZW5uIGVzICBzdGltbXQsICBkYXNzICBUb2VjaHRlciAgZGllICBqdWVuZ2VyZW4gIEF1c2dhYmVuICBpaHJlcgorTXVldHRlciBzaW5kLCBkYW5uIGlzdCBzaWUgZWluZSB0dWdlbmRoYWZ0ZSB1bmQga2x1Z2UgRnJhdS4iCisKKyJIbS4iLCBtYWNodGUgUm9tZW8uCisKKyJOYWphLCB2aWVsbGVpY2h0IGhhdCBzaWUgYXVjaCAgZWluICBiaXNzY2hlbiAgdm9uICBtZWluZW0gIGd1dGVuICBHZWRhZWNodG5pcworbWl0YmVrb21tZW4uIFVuZCBhdXNzZXJkZW0gYmVrb21tdCBzaWUgaWhyZXMgVmF0ZXJzIE1vbmV0ZW4uIgorCisiV2FzIGthbm4gZWluIE1hbm4gc2ljaCBtZWhyIHd1ZW5zY2hlbi4iLCBtZWludGUgQXp6dXJvIGxlaXNlLgorCisiUHJpbWEuIiwgc2V1Znp0ZSBSb21lbyBiaXR0ZXIuICJEYW5uIGthbm4gaWNoIHNpZSBhbHNvIGdsZWljaCB2ZXJnZXNzZW4uIEFiZXIKK2RhcyB3aWxsIGljaCBuaWNodCwgdW5kIHdlbm4gc2llIHRhdXNlbmRtYWwgIGRpZSAgVG9jaHRlciAgZGVzCWFsdGVuICBDYXB1bGV0Cit3YWVyZS4iCisKK0JlbmV2b2xpbyBuYWhtIHNlaW5lbiBDb3VzaW4gYmVpbSBBcm0uICJLb21tLCBSb21lbywgd2lyICB3b2xsZW4gIGdlaGVuLiAgU2llaAorbnVyLCB3aXIgc2luZCBzY2hvbiBmYXN0IGRpZSBsZXR6dGVuLCBnbGVpY2ggYmVpc3NlbiB1bnMgZGllIEh1bmRlLiIKKworIkphLCBzbyBrb21tdCBlcyBtaXIgdm9yLiIsIG11cm1lbHRlIFJvbWVvIHVuZCBmb2xndGUgQmVuZXZvbGlvIHp1ciBUdWVyLgorCitIZXJyIENhcHVsZXQgbGFlY2hlbHRlIGJyZWl0LCBhbHMgZXIgc2VpbmUgR2Flc3RlIHNhaC4gIkFiZXIgbWVpbmUgSGVycmVuLCBTaWUKK3dvbGxlbiBkb2NoIG5pY2h0IHNjaG9uIGdlaGVuPyIgU2VpbiBHZXNpY2h0IGJla2FtIGVpbmVuIGVyc3RhdW50ZW4gIEF1c2RydWNrLAorYWxzIGlobSBUeWJhbHQgaW5zIE9ociBmbHVlc3RlcnRlLiAiVGF0c2FlY2hsaWNoPyIgIEVyICByaWViICBzaWNoICB1ZWJlciAgZGllCitHbGF0emUuICJOYSwgZGFubiBtdWVzc2VuIFNpZSB3b2hsIGdlaGVuLCBlcyB3YXIgbWlyIGVpbiBWZXJnbnVlZ2VuLCBTaWUgIGhpZXIKK2JlZ3J1ZXNzZW4genUgZHVlcmZlbi4iCisKK1R5YmFsdCBzY2hlbmt0ZSBSb21lbyBlaW4gTGFlY2hlbG4sIGRhcyBhbiBlaW5lbiBUaWdlciBnZW1haG50ZS4gIkd1dGUgIE5hY2h0LAorUm9tZW8uIgorCitGcmF1IENhcHVsZXQsIGRpZSB3ZWl0ZXJlIFp1c2FtbWVuc3RvZXNzZSB2ZXJtZWlkZW4gIHdvbGx0ZSwgIGhha3RlICBzaWNoICBiZWkKK2locmVtIE1hbm4gZWluLiAiS29tbSwgTGllYmVyLCB3aXIgd29sbGVuIHp1IEJldHQgIGdlaGVuLCAgaWNoICBiZWtvbW1lICBtZWluZQorTWlncmFlbmUuIgorCitKdWxpYSB2ZXJzdGF1dGUgZGVuIFRyaWNrIHp1bSBzcGFldGVyZW4gR2VicmF1Y2ggaW4gaWhyZW0gR2VkYWVjaHRuaXMgdW5kICB6b2cKK2FuIFBvbGx5cyBBZXJtZWwuICJXZXIgaXN0IGRlciBkYT8iIFNpZSB6ZWlndGUgdmVyc3RvaGxlbiBtaXQgZGVtIEZpbmdlci4KKworIkRhcyBpc3QgVGliZXJpbyBqdW5pb3IuIERlciBlaW56aWdlIFNvaG4gdW5kIEVyYmUgZGVzIGFsdGVuICBUaWJlcmlvLiIgIFBvbGx5CitsYWVjaGVsdGUuCisKKyJVbmQgZGVyPyIKKworIlBldHJ1Y2hpbywgYWJlciBkZXIgaXN0IG5pY2h0cyBiZXNvbmRlcmVzLiIKKworV2llZGVyIGRldXRldGUgSnVsaWEgbWl0IGRlbSBGaW5nZXIuICJVbmQgZGVyIGRhPyBEZXIgZGVuIGdhbnplbiAgQWJlbmQgIG5pY2h0CitlaW4gTWFsIGdldGFuenQgaGF0PyIKKworUG9sbHkgd2FyZiBpaHIgZWluZW4gbWlzc3RyYXVpc2NoZW4gQmxpY2sgenUuICJXYXJ1bSB3aWxsc3QgZHUgZGFzIGRlbm4gIGFsbGVzCit3aXNzZW4/IgorCisiT2NoLCBpY2ggbXVzcyBkb2NoIGRpZSBMZXV0ZSBrZW5uZW4sIG9kZXI/IiBKdWxpYSBzY2hhdXRlIGlocmUgQW1tZSAgbWl0ICBkZW0KK0JsaWNrIGFuLCBkZXIsIHdpZSBzaWUgd3Vzc3RlLCBhbSAgYmVzdGVuICBnZWVpZ25ldCAgd2FyLCAgamVkZW4gIFZlcmRhY2h0ICB6dQoremVyc3RyZXVlbi4KKworIkphLiBBYmVyIHdlciBkZXIgSnVuZ2UgaXN0LCB3ZWlzcyBpY2ggbmljaHQuIgorCisiRGFubiB0dSBtaXIgZGllIExpZWJlIHVuZCBmcmFnIGlobiBuYWNoICBzZWluZW0gIE5hbWVuLCAgamE/IiAgSnVsaWEgIHNldWZ6dGUKK3RpZWYuICJXZW5uIGVyIHNjaG9uIHZlcmhlaXJhdGV0IGlzdCwgd2VyZGUgaWNoIGlucyBLbG9zdGVyIGdlaGVuLiIgVW5kZXV0bGljaAorZXJpbm5lcnRlIHNpZSBzaWNoIGFuIGVpbmVuIFJvbWFuLCBpbiBkZW0gZGVyIEhlbGQsIG5hY2ggbGFuZ2VuIEphaHJlbiBlbmRsaWNoCitXaXR3ZXIsIGluIGVpbmVtIEtsb3N0ZXIgc2VpbmUgZWluemlnZSBHZWxpZWJ0ZSB0cmlmZnQgdW5kIGRpZXNlIGlocmUgR2VsdWViZGUKK3NvZm9ydCB2ZXJnaXNzdC4KKworIk5laW4sIGRhbm4gd2lyc3QgZHUgUGFyaXMgaGVpcmF0ZW4uIiwgbWVpbnRlIFBvbGx5IGJlc3RpbW10LiAgIkVyICBpc3QgIFJvbWVvCitNb250YWd1ZS4iCisKKyJEYXMgZ2lidCBlcyBkb2NoIG5pY2h0ISIgSW4gSnVsaWFzIEF1Z2VuIG1hY2h0ZSBzaWNoIFNjaHJlY2tlbiBicmVpdC4gIkVyIGlzdAorZGVyIGVpbnppZ2UgTWFubiwgZGVuIGljaCBsaWViZW4ga2FubiwgdW5kIGF1c2dlcmVjaG5ldCAgaWhuICBkYXJmICBpY2ggIG5pY2h0CitsaWViZW4sICB3ZWlsICBzb25zdCAgbWVpbiAgVmF0ZXIgIGVpbmVuICBIZXJ6YW5mYWxsICBiZWtvbW10LiIgIEVpbmUgIHdlaXRlcmUKK0VyaW5uZXJ1bmcgc2Nod2FtbSBpbiBpaHJlbSBIaXJuIG5hY2ggb2JlbiB3aWUgZWluZSBXYXNzZXJsZWljaGU6ICBFaW5lICBqdW5nZQorRnJhdSwgZGllIGhlaXJhdGV0IHVuZCB1bmdsdWVja2xpY2ggaXN0LCBiaXMgaWhyIEdlbGllYnRlciAgc2llICBhdXMgIGRlciAgRWhlCitlbnRmdWVocnQsIGRhbWl0IHNpZSBpbiBlaW5lbSBmZXJuZW4gTGFuZCBnbHVlY2tsaWNoIHd1ZXJkZW4uIFNpZSBzZXVmenRlIG5vY2gKK2Vpbm1hbC4gIldlbm4gZGFzIHNvIGlzdCwgd2VyZGUgIGljaCAgd29obCAgZnVlciAgaW1tZXIgIHVuZ2x1ZWNrbGljaCAgc2Vpbi4iLAorbWVpbnRlIHNpZSB1bmQgZ2VmaWVsIHNpY2ggYmVyZWl0cyBqZXR6dCBpbiBpaHJlciBSb2xsZSBhbHMgSXNvbGRlLgorCisiV2FzIHNvbGwgZGVubiBkZXIgVW5zaW5uLCBLaW5kPyIsIGZyYWd0ZSBQb2xseSB1bndpbGxpZy4KKworIkFjaCwgc2Nob24gZ3V0LCBkYXMgdmVyc3RlaHN0IGR1IHNvd2llc28gbmljaHQuIiwgYW50d29ydGV0ZSBKdWxpYSBtaXQgIGVpbmVtCit0cmFnaXNjaGVuIExhZWNoZWxuLgorCitEaWUgU3RpbW1lIEZyYXUgQ2FwdWxldHMgcmllZiBuYWNoIGlocmVyIFRvY2h0ZXIgdW5kIFBvbGx5IHNjaG9iICBKdWxpYSAgc2FuZnQKK2FiZXIgYmVzdGltbXQgaW5zIEhhdXMuICJLb21tLCBaZWl0LCBpbnMgQmV0dCB6dSBnZWhlbi4gQXVzc2VyZGVtICBzaW5kICBqZXR6dAorYWxsZSB3ZWcgdW5kIGVzIGdpYnQgbmljaHRzIG1laHIgenUgc2VoZW4uIgorCisiU3RpbW10LiIgQXp6dXJvIGdhZWhudGUuICJIb2VjaHN0ZSBaZWl0IGZ1ZXIgZWluZW4gZ2VtdWV0bGljaGVuIEFzdCwgTGllYmVzLiIKKworIkVzIGtvbW10IG5vY2ggd2FzLCBnZXNjaGxhZmVuIHdpcmQgc3BhZXRlci4iCisKKyJPaCwgbmVpbiwgbmljaHQgaGV1dGUuIiwgc3RvZWhudGUgQXp6dXJvLgorCisiX0Rhc18gbWVpbmUgaWNoIG5pY2h0LiIKKwpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9yb21fanVsL3NlaXRlOCBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvcm9tX2p1bC9zZWl0ZTgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA3ZjRkZgotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvcm9tX2p1bC9zZWl0ZTgKQEAgLTAsMCArMSw3MiBAQAorREVSIFpXRUlURSBBS1QKKworQW4gZGllc2VyIFN0ZWxsZSBzb2xsdGUgZWlnZW50bGljaCB3aWVkZXIgZWluIENob3IgYXVmdHJldGVuLCBkb2NoICBpbnp3aXNjaGVuCitoYWJlbiBTaWUgZ2V3aXNzIG5pY2h0cyBtZWhyIGdlZ2VuIGRpZSBLdWVyenVuZ2VuIGltIEV0YXQgdW5kIG5laG1lbiAgbWl0ICBVbG8KK3VuZCBBenp1cm8gdm9ybGllYi4gV2VubiBpY2ggZWhybGljaCBzZWluIHNvbGwsIG1pciBzaW5kICBkaWUgIGJlaWRlbiAgcmljaHRpZworYW5zIEhlcnogZ2V3YWNoc2VuLCBvYndvaGwgZWluIENob3Igd2FocnNjaGVpbmxpY2ggZnVlZ3NhbWVyIHdhZXJlLgorCisiTidBYmVuZCwgS29sbGVnZS4iIEF6enVybyBuaWNrdGUgZWluZXIgRmxlZGVybWF1cyB6dSwgIGRpZSAgaW0gIFNjaGltbWVyICBkZXIKK0xhbXBlbiBpbSBIYXVzIG5hY2ggSW5zZWt0ZW4gamFndGUuCisKKyJTc3NlaWQgc3NzcGFldCBkcmFuLiIsIGtvbW1lbnRpZXJ0ZSBkaWUgRmxlZGVybWF1cy4gIldvbGx0IGlociBuaXNzc3QgIGxpZWJlcgorc3NzbGFmZW4gZ2VoZW4/IgorCisiS29lbm5lbiB3aXIgbm9jaCBuaWNodC4iIFVsbyBnYWVobnRlIGhpbnRlciBkZW0gdm9yZ2VoYWx0ZW5lbiBGbHVlZ2VsLgorCisiV2Fzc3MgaXNzc3QgZGVubiBub2NoPyIgQmVkYXVlcm5kIGJsaWNrdGUgZGllIEZsZWRlcm1hdXMgaGludGVyICBlaW5lciAgTW90dGUKK2hlciwgZGllIEF6enVybyBpaHIgd2VnZ2VzY2huYXBwdCBoYXR0ZS4gICJXZW5uICBpaHIgIHNzc28gIHNzc3BhZXQgIG5vY2ggIGF1Zgorc3NzZWlkLCBkYW5uIGxhc3NzdCB3ZW5pZ3Nzc3RlbnNzcyBkaWUgU3NzbmFlYmVsIHZvbiAgbWVpbmVtICBGcnVlaHNzc3R1ZWNrLiIsCitzY2hhbHQgc2llLgorCisiSWNoIGhhYmUgSHVuZ2VyLiIsIGVudHNjaHVsZGlndGUgc2ljaCBBenp1cm8uCisKKyJJc3NzIGF1Y2guIEFiZXIgamV0c3NzdCBlcnNzc2FlaGx0LCB3YXNzcyBnZWh0IGRlbm4gdm9yPyIKKworIldpciBzZWhlbiBqZW1hbmRlbSB6dSwgZGVyIGdlcmFkZSBkaWUgQmVnaWVyZGUgZ2VnZW4gZGllICBMaWViZSAgZWluZ2V0YXVzY2h0CitoYXQuIgorCisiTmVpbiwgd2llIHJvbWFudGlzc3MhIiAgV2llICBhbGxlICBGbGVkZXJtYWV1c2UgIHdhciAgYXVjaCAgZGllc2UgIGhpZXIgIHNlaHIKK2dlZnVlaGxzYmV0b250LgorCisiSXNzcyBsaWViZSBzc3NvbHNzc2UgR2Vzc3Npc3NzdGVuLiIKKworIkphLCBpY2ggYXVjaC4iLCBmcmV1dGUgc2ljaCBVbG8uCisKKyJFcnNzc2FlaGwhIgorCisiUm9tZW8gaGF0IGZlc3RnZXN0ZWxsdCwgZGFzcyBMaWViZSB1bmQgQmVnZWhyZW4gbmljaHQgZGFzIGdsZWljaGUgaXN0LiIKKworIkRhc3NzIGhhZXR0ZSBpc3NzIGlobSB2b3JoZXIgc3NzYWdlbiBrb2Vubm5lbi4iCisKK1VsbyBuaWNrdGUgd2Vpc2UuICJJY2ggd2Vpc3MuIFdhaHJzY2hlaW5saWNoIGhhZXR0ZSBlcyAgaWhtICBqZWRlICBGcmF1ICBzYWdlbgora29lbm5lbi4iCisKK1NpZSAgd2FyZiAgQXp6dXJvICBlaW5lbiAgaXJvbmlzY2hlbiAgU2VpdGVuYmxpY2sgIHp1LgkiQWJlciAgIE1hZW5uZXIgICBzaW5kCitTa2xhdmVuLi4uIgorCisiLi4uIHdlbmlnZXIgYW5zc3N0YWVuZGlnZXIgQWJzc3Npc3NzdGVuLiIsIHZvbGxlbmRldGUgZGllIEZsZWRlcm1hdXMgZGVuIFNhdHoKK3ZlcnNjaGFlbXQuCisKKyJHZW5hdS4gTmEsIHVuZCBqZXR6dCBzdGVja3QgZXIgaW4gIGVpbmVyICBib2VzZW4gIEtsZW1tZS4iICBVbG8gIG1hY2h0ZSAgZWluZQorU3Bhbm51bmdzcGF1c2UuCisKKyJTc3NhZyBzc3NvbiEiCisKKyJFciBoYXQgc2ljaCBhdXNnZXJlY2huZXQgaW4gZWluZSBGcmF1IGVpbmVyICB2ZXJmZWluZGV0ZW4gIEZhbWlsaWUgIHZlcmxpZWJ0LAordW5kIHp1IGFsbGVtIFVlYmVyZHJ1c3MgbGllYnQgc2llIGlobiBhdWNoLiIKKworVHJhZW5lbiB0cmF0ZW4gaW4gZGllIGt1cnpzaWNodGlnZW4gQXVnZW4gZGVyICBGbGVkZXJtYXVzLiAgIldpZSAgc3NzcmVja2xpc3NzCitzc3NvZW4hIFdpZSBoZWlzc3N0IGVzc3M6IERpZSBMaWViZSBmaW5kZXQgZWluZW4gV2VnLiIKKworIldpciB3ZXJkZW4gc2VoZW4sIG9iIGVyIGVzIHNjaGFmZnQsIGRlbiBXdXJtIHZvbSBIYWtlbiAgenUgIGhvbGVuICBvaG5lICBzaWNoCithdWZ6dXNwaWVzc2VuLiIgQXp6dXJvIGZhbmQgc2VpbmUgRnJldWRlIGRhcmFuLCBkaWUgRnJhdWVuIG1pdCB3ZW5pZyAgc2Nob2VuZW4KK01ldGFwaGVybiB6dSBzY2hvY2tpZXJlbi4gIkVyIGthbm4gaWhyIG5pY2h0IG1hbCBlaW4gU3RhZW5kY2hlbiBicmluZ2VuLCAgZGVubgord2VubiBtYW4gaWhuIGhpZXIgaW0gR2FydGVuIGVyd2lzY2h0Li4uIiBBenp1cm8gbWFjaHRlIGVpbmUgIGVpbmRldXRpZ2UgIEdlc3RlCit1bmQgc2NoYXV0ZSBkaWUgRmxlZGVybWF1cyBlcndhcnR1bmdzdm9sbCBhbiwgZGllIHNlaW5lbiAgQmxpY2sgIGJlbWVya3RlICB1bmQKK3NpY2ggbWl0IHdlaWJsaWNoZW0gR3Jvc3NtdXQgZG9jaCBub2NoIHp1IGVpbmVtIGVudHNldHp0ZW4gS2V1Y2hlbiBlbnRzY2hsb3NzLgorCisiQWJlciBkYXNzcyBpc3NzdCBqYS4uLiIKKworIlN0aWxsISIgIFVsbyAgaGF0dGUgIFJvbWVvICBqZW5zZWl0cyAgZGVyICBNYXVlciAgZW50ZGVja3QsICBkaWUgIGRlbiAgR2FydGVuCit1bXNjaGxvc3MuCisKZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9zcGVjaWFsL3NwZWNpYWwvcm9tX2p1bC9zZWl0ZTkgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL3JvbV9qdWwvc2VpdGU5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YzFmNDEKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL3JvbV9qdWwvc2VpdGU5CkBAIC0wLDAgKzEsMTMwIEBACitERVIgWldFSVRFIEFLVAorCSAgRElFIEVSU1RFIFNaRU5FCisKK1JvbWVvIHN0ZWxsdGUgc2ljaCBhdWYgZGllIFplaGVuc3BpdHplbiB1bmQgc3BhZWh0ZSB1ZWJlciBkaWUgTWF1ZXIgaGlud2VnLiBFcgord3VuZGVydGUgc2ljaCBudXIgZWluZW4gTW9tZW50IGxhbmcgZGFydWViZXIsIGRhc3MgYXVmIGVpbiB1bmQJZGVtc2VsYmVuICBBc3QKK2VpbmUgRmxlZGVybWF1cyBrb3BmdWViZXIgIGhpbmcgIHVuZCAgZGlyZWt0ICB1ZWJlciAgaWhyICB6d2VpCUtyYWVoZW4uICBfSW5fCitfZGllc2VyXyBfTmFjaHRfLCBzbyBkYWNodGUgUm9tZW8gbWl0IGVpbmVtIFNjaHVsdGVyenVja2VuLCBfa2Fubl8gIF93aXJrbGljaF8KK19hbGxlc18gX3Bhc3NpZXJlbl8uIF9BdXNzZXJkZW1fOiBfRGFfIF9kcmluXyAgX2lyZ2VuZHdvXyAgX2lzdF8gIF9KdWxpYV8uICBFcgorendpbmtlcnRlIGRlbiBLcmFlaGVuIHp1LgorCisiV2lzc3QgaWhyLCBpY2ggZ2VoZSBoZXV0ZSBuYWNodCBuaWNodCAgbmFjaCAgSGF1c2UuICBTY2hsaWVzc2xpY2ggIGlzdCAgX3NpZV8KK2hpZXIsIGRhIGthbm4gaWNoIGVpbmZhY2ggbmljaHQgaW5zIEJldHQgZ2VoZW4sIGFscyBzZWkgbmljaHRzIHBhc3NpZXJ0LiIKKworTWVyY3V0aW8gIHVuZCAgQmVuZXZvbGlvICB0YXVjaHRlbiAgbWl0ICBkZW0gIExhZXJtLCAgZGVuICAgQmV0cnVua2VuZQkgaW1tZXIKK3ZlcmFuc3RhbHRlbiwgYW4gZGVyIFN0cmFzc2VuZWNrZSBhdWYuIFJvbWVvIGdsaXR0IG1pdCBlaW5lciBCZWhlbmRpZ2tlaXQsIGRpZQoraWhuIHNlbGJzdCBlcnN0YXVudGUsIGluIGRlbiBTY2hhdHRlbiBlaW5lcyBFaW5nYW5ncyB6dXJ1ZWNrICB1bmQgIGJldHJhY2h0ZXRlCitzZWluZSBGcmV1bmRlIG1pdCBlaW5lbSBHcmluc2VuLgorCisiUm9tZW8sIGhleSwgYWxkZXIgU2NodW5nZSwgd28gc2NodGVja3NjaHQgZHUgZGVubj8iLCByaWVmIEJlbmV2b2xpby4KKworIkVyIGlzY2h0IHNjaGxhdWVyIGdld2VzY2hlbiBhbHNjaCAgd2lyICB1bmQgIGhhdCAgc2NoaXNjaCAgc2Nob24gIGluc2NoICBCZWRkCitnZWxlc2NodC4uLiIKKworTWVyY3V0aW8gc2FoIGdhbnogZGFuYWNoIGF1cywgYWxzIGhhYmUgZXIgZnVlciBuaWNodHMgc28gZ3V0ZSAgVmVyd2VuZHVuZyAgd2llCitmdWVyIGVpbiBCZXR0LgorCisiU2VpbmVuIFNjaGFlZGVsIG1vZWNodGUgaWNoICBtb3JnZW4gIGZydWVoICBuaWNodCAgaGFiZW4uIiwgIGJlbWVya3RlICBBenp1cm8KK21pdGZ1ZWhsZW5kLgorCisiT2IgZXIgd29obCBnZW5hdXNzc28gc3NzbWVja3Qgd2llIGVpbmUgRmxpZWdlLCAgZGllICBhdXNzcyAgZWluZW0gIFdlaW5nbGFzc3MKK2dlc3NzbHVlcnJmdCBoYXQ/IiwgdWViZXJsZWd0ZSBkaWUgRmxlZGVybWF1cy4KKworIkR1IHdpbGxzdCBkb2NoIG5pY2h0IGV0d2EgIGRlbiAgUnVmICBkZXIgIEZsZWRlcm1hZXVzZSAgcnVpbmllcmVuICB1bmQgIGVpbmVuCitNZW5zY2hlbiBhbmtuYWJiZXJuPyIsIGZyYWd0ZSBVbG8gbWl0IGVpbmVtIGFuZ2Vla2VsdGVuIEdlc2ljaHRzYXVzZHJ1Y2suCisKKyJOZWluLCBlc3NzIHdhciBudXIgd2lzc3NzZW5zc3NhZmx0aXNzc2UgTmV1Z2llci4iCisKKyJIbS4iIFVsbyBzY2hlbmt0ZSAgZGVyICBGbGVkZXJtYXVzICBlaW5lbiAgbGFuZ2VuLCAgZm9yc2NoZW5kZW4gIEJsaWNrLiAgIlNhZworbWFsLHdpZSBoZWlzc3QgZHUgZWlnZW50bGljaD8iCisKKyJXbGFkLiIgIERpZSAgRmxlZGVybWF1cyAgZ3JpbnN0ZSAgdW5kICAgbGVja3RlICAgc2ljaCAgIHVlYmVyICAgaWhyZSAgIHphcnRlLAoraHVmZWlzZW5mb2VybWlnZSBOYXNlLgorCisiV2lyIHNpbmQgVWxvIHVuZCBBenp1cm8uIiBVbG8gcnVlY2t0ZSBlaW4ga2xlaW5lcyBTdHVlY2sgdm9uIFdsYWQgYWIuCisKKyJFciBob2x0IHNjaGlzY2ggZGVuIFRvZCwgd2VubiAgZXIgIGhpZXIgIGRyYXVzY2hlbiAgcnVtc2NocHJpbmd0LiIgIEJlbmV2b2xpbworbWFjaHRlIHNpY2ggZXJuc3RlIFNvcmdlbiB1bSBzZWluZW4gQ291c2luLiAiUnVmICBpaG4sICBzY2hlaW5lICBNdS4uLiAgTXV0dGVyCityZWlzY2h0IG1pciBkZW4gS29wZiBhYiwgd2VubiBpc2NoIG9obmUgaWhuIGFua29tbWUuIgorCisiSXNjaCAgd2Vpc2NoICB3YXNjaCAgYmVzY2hlcmVzY2guIiAgQXVjaCAgTWVyY3V0aW8gIGthbm50ZSAgIEZyYXUgICBNb250YWd1ZXMKK0VpbnN0ZWxsdW5nIHp1IFNhdWZ0b3VyZW4uICJJc2NoIGhhYmUgbWFsIGluIGVpbmVtIEJ1Y2ggZ2VsZXNjaGVuLi4uIgorCisiTmVpbiEiIEJlbmV2b2xpbyBsYWNodGUuCisKKyJEb2NoLiBQYXNjaCBhdWYsIGlzY2ggd2VyZGUgaWhuIGJlc2Nod29lcmVuLiIKKworIlVuZCB3YXNjaCBzY2hvbGwgZXIgdHVuPyIKKworIkhlcmtvbW1lbiwgU2NobmFwc2NobmFzY2hlLCB3YXNjaCBkZW5uIHNjaG9uc2NodD8iIE1lcmN1dGlvIGhvbHRlIEx1ZnQuCisKKyJSb21lbyEgIElzY2ggIGJlc2Nod29lcmUgIGRpc2NoICBiZWkgIGRlaW5lciAgIFZlcmxpZWJ0aGVpdCwgICBlcnNjaGVpbmUgICBkdQorU2NoZXVmdHNjaGVyLiIKKworIkVyIGlzY2h0IGRvY2ggZ2FyIGtlaW4gU2NoYWV1ZmVyLiIgIEJlbmV2b2xpbyAgZXJpbm5lcnRlICBzaWNoICBkdW5rZWwsICBkYXNzCitSb21lbyBkZW4gZ2FuemVuIEFiZW5kIGFuIGVpbmVtIGVpbnppZ2VuIEdsYXMgV2VpbiAgZ2VuaXBwdCAgaGF0dGUgIHVuZCAgc2Nob24KK25pY2h0IG1laHIgYmVpIGlobmVuIGdld2VzZW4gd2FyLCBhbHMgc2llIGRpZSBLbmVpcGUgZ2VmdW5kZW4gaGF0dGVuLgorCisiU2NoZXVmdHNjaGVyISIgTWVyY3V0aW8gdmVyZGV1dGxpY2h0ZSBzZWluZSBXb3J0ZSwgaW5kZW0gZXIgdGllZiBzZXVmenRlLiAiRHUKK2Jpc2NodCBibG9lZCB1bmQgYmVzY2hvZmZlbi4iCisKKyJTY2h0aW1tdC4iIEJlbmV2b2xpbyBncmluc3RlLgorCisiUm9tZW8hIFNjaGFnIHdhc2NoLiBFc2NoIHJlaXNjaHQsIHdlbm4gZHUgJ0xpZWJlJyBzY2hhZ3NjaHQsIHdhc2NoICBhbmRlcmVzY2gKK2Jla29tbXNjaHQgZHUgZWggbmlzY2h0IHJhdXNjaC4iIE1lcmN1dGlvICBraWNoZXJ0ZS4gICJEdSAga2FubnNjaHQgIGF1Y2ggIGVpbgorYmkuLi4gYmlzY2guLi4iICBFaW4gIGtvbnplbnRyaWVydGVyICBBdXNkcnVjayAgdHJhdCAgYXVmICBNZXJjdWl0b3MgIEdlc2ljaHQuCisiLi4uYmlzcy1jaGVuICBqYW1tZXJuLCAgZGFubiAgIGVya2VubmVuICAgd2lyICAgZGlzY2ggICBhdWNoLiAgIEFsc2NobywgICBiZWkKK1Jvc2NoYWxpbnNjaGVucyAgIGxhbmdlbiAgIEJlaW5lbiwgICBiZWkgICAgaWhyZXIgICAgU2NodHVwc2NobmFzY2hlLAkgaWhyZW4KK1NjaG9tbWVyc2NocHJvc2NoZW4gdW5kIGlocmVtIEJ1c2NoZW46IFJvbWVvLCBlcnNjaGVpbmUhIiAgQmVuZXZvbGlvICBydWVscHN0ZQordW5nZW5pZXJ0LiAiV2VubiBlciBkaXNjaCBqZXRzY2h0IGdlaG9lcnQgaGF0LCBiZWtvbW1zY2h0IGR1IFBydWVnZWwuIgorCisiUXVhdHNjaC4gVmllbCBzY2hsaW1tZXIgd2FlcmUgZXNjaCBkb2NoLCB3ZW5uIGlzY2ggaWhuICByaWVmZSAgdW5kICBpaG4gIGRhbm4KK3NjaHRlaGVuIGxpZXNjaGUuIFNjaG8gd2FzY2ggbWFjaGVuIG51ciBnZW1laW5lIEZyYXVlbi4iIFNlaW4gIEdlc2ljaHQgIHZlcnpvZworc2ljaCBpbiBlaW5lciB0cnVua2VuZW4gUGFyb2RpZSBkZXIgVHJhdWVyLiAiQWJlciAgbGVpZGVyICBzY2hpbmQgIHNjaG8gIHZpZWxlCitGcmF1ZW4gZ2VtZWluLiIgRWluZSBXZWlsZSBoaWVsdGVuIHNpY2ggZGllIGJlaWRlbiBNYWVubmVyIGluICBkZW4gIEFybWVuICB1bmQKK2dlZGFjaHRlbiB0cmFlbmVucmVpY2ggZnJ1ZWhlcmVyIEVudHRhZXVzY2h1bmdlbi4KKworTmFjaCBlaW5lciBXZWlsZSBwdXR6dGUgc2ljaCBCZW5ldm9saW8gdW1zdGFlbmRsaWNoIGRpZSBOYXNlLCBkaWUgamV0enQgIG5pY2h0CittZWhyIG51ciB2b20gQWxrb2hvbCBnZXJvZXRldCB3YXIuICJXZWlzY2h0IGR1IHdhc2NoLCBsYXNjaCB1bnNjaCBuYWNoIEhhdXNjaGUKK2dlaGVuLCBSb21lbyB3aWxsIGJlc2NodGltbXQgZGVuIE1vbmQgYW5oZXVsZW4sIGRhIHNjaHRvZXJlbiAgd2lyICBzY2hvd2llc2NobworbnVyLiIgTWVyY3V0aW8gc2NobmllZnRlLCBkYW5uLCBpbiBzZWluZW4gU3RpbW11bmdzd2VjaHNlbG4gIHNvICBzY2huZWxsLCAgd2llCitudXIgQmV0cnVua2VuZSBlcyBzZWluIGtvZW5uZW4sIGxhY2h0ZSBlci4gIldhaHJzY2hlaW5saXNjaCBzY2hpdHNjaHQgZXIgdW50ZXIKK2VpbmVtIEJhdW0gdW5kIHd1ZW5zY2h0IHNjaGlzY2gsIGVyIG11ZXNjaHRlICBuaXNjaHQgIGFsbGVzY2ggIHNjaGVsYmVyICB0dW4uIgorU2VpbmUgZWluZGV1dGlnZSBHZXN0ZSBsaWVzcyBrZWluZW4gWndlaWZlbCBhbSBJbmhhbHQgc2VpbmVyICBXb3J0ZS4gICJBbHNjaG8sCitmdWVyIG1pc2NoIHJlaXNjaHQgaGV1dGUgbmFjaHQgZGVyIEJldHJpZWIgaW4gbWVpbmVtICBCZXR0LiIgIEVyICBiZXVndGUgIHNpY2gKK25pZWRlciB1bmQgYmV0YXN0ZXRlIGRlbiBCb2Rlbi4gIk5lZSwgZGFzY2ggaXNjaHQgbWlyIHNjaHUgaGFydCwgIGxhc2NoICB1bnNjaAorbmFjaCBIYXVzY2hlIGdlaGVuIHVuZCBSb21lby4uLiIgRXIgdWViZXJsZWd0ZSBlaW5lbiAgTW9tZW50LCAgZGFubiAgcmllZiAgZXI6CisiU2NobGFmIGd1dCwgUm9tZW8uIFVuZCB3ZW5uIGR1IGhldXQgbmFjaHQgIGtsZW1wbmVyc2NodCwgIGRhbm4gIHZlcmxlZycgIGZ1ZXIKK21pY2ggZWluIFJvaHIgbWl0LiIKKworIldhcyBmdWVyIGVpbiBvcmRpbmFlcmVyLi4uIiBVbG8gc3VjaHRlIGluIGlocmVtIEdlZGFlY2h0bmlzIG5hY2ggQXVzZHJ1ZWNrZW4sCitkaWUgIGdsZWljaHplaXRpZyAgZGFtZW5oYWZ0ICB1bmQgIGlocmVyICBTdGltbXVuZyAgYW5nZW1lc3Nlbgkgd2FyZW4sICAgZmFuZAorYWxsZXJkaW5ncyBrZWluZS4KKworIlJlY2h0IGhhc3NzdCBkdS4iIEF1Y2ggV2xhZCB3YXIgZW1wb2VydC4gIlNzc28gIHdhc3NzICBzc3NvbGx0ZW4gIHdpciAgRnJhdWVuCit1bnNzcyBuaXNzc3QgZ2VmYWxsZW4gbGFzc3NzZW4uIgorCisiSXN0IFZsYWQgbmljaHQgZWluIE1hZW5uZXJuYW1lPyIsIHdvbGx0ZSBBenp1cm8gd2lzc2VuLgorCisiTWl0IFYgc3Nzb24sIGFiZXIgaXNzcyBzc3NyZWliZSBtaXNzcyBtaXQgVy4iCisKKyJPaC4iLCBtYWNodGUgVWxvIHVuZCBydWVja3RlIHZlcmxlZ2VuIHdpZWRlciBuYWVoZXIgYW4gV2xhZCBoZXJhbi4KKworIklzc3N0IFJvbWVvIGF1Y2ggc3NzbyBlaW4gU3Nzd2Vpbj8iCisKKyJLZWluZSBBaG51bmcuIiBVbG8genVja3RlIGRpZSBTY2h1bHRlcm4uICJFciBpc3QgZWluIE1hbm4sIHdhaHJzY2hlaW5saWNoIGlzdAorZXIgYWxzbyB1bSBrZWluZW4gRGV1dCBiZXNzZXIuIgorCisiV2FzIHdpbGxzdCBkdSBkYW1pdCBzYWdlbj8iLCBmcmFndGUgQXp6dXJvIHNhZXVlcmxpY2guCisKKyJBY2gsIG5pY2h0cy4gU3RpbGwsIFJvbWVvIGtvbW10IHdpZWRlci4iCisKK1JvbWVvLCBkZXIgYXVzIGRlbSBTY2hhdHRlbiB0cmF0LCAgd2FyCWViZW5zbwl3ZW5pZyAgYmVnZWlzdGVydCAgdm9uCXNlaW5lbgorRnJldW5kZW4gd2llIFVsbyB1bmQgV2xhZC4gIkRlciBoYXQgZ3V0IHJlZGVuLCBzbyB3aWUgZXIgZ2ViYXV0ICBpc3QsICBoYXQgIGVyCitkaWUgSGFlbmRlIGltbWVyIGZyZWkuIiwgbXVybWVsdGUgZXIuIFNlaW4gQmxpY2sgZmllbCBhdWYgZGVuIEJhbGtvbiBpbSBlcnN0ZW4KK1N0b2NrIHVuZCBkZW4gQmF1bSBkYXZvci4KKworIkVyIHVlYmVybGVndCwgb2IgZXIgZGEgcmF1ZiBrb21tdC4iLCBmbHVlc3RlcnRlIFVsby4KKworIkFsc3NzbyBpc3NzdCBlciBkb2NoIGVpbiBTc3N3ZWluLiIsIHN0ZWxsdGUgV2xhZCBlYmVuc28gbGVpc2UgZmVzdC4KKwpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9zZWhlcmZhcS5jIGIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc3BlY2lhbC9zZWhlcmZhcS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ODE2OTYKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zcGVjaWFsL3NlaGVyZmFxLmMKQEAgLTAsMCArMSwyNDcgQEAKK2luaGVyaXQgInN0ZC90aGluZyI7Citpbmhlcml0ICJzdGQvbW9yZSI7Citpbmhlcml0ICIvbWFpbC9uZWRpdCI7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSAiLi4vaGF1cy5oIgorCisjZGVmaW5lIEZBUShmKSAoU1BFQ0lBTFBBVEgrImZhcS8iKyhmKSkKKyNkZWZpbmUgRkFRVVNFUiAoeyAicnluZSIsICJ0b3NzIiB9KQorI2RlZmluZSBJU19VU0VSKHBsKSAobWVtYmVyKEZBUVVTRVIsIGdldHVpZChwbCkpID49IDApCisKK3N0YXRpYyBzdHJpbmcgKnNlaXRlOworc3RhdGljIHN0cmluZyBmLCpzOworCittYXBwaW5nIHN5bm9ueW0gPSAoW10pOworCitjcmVhdGUoKQoreworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfTkFNRSwiU2VoZXJGQVEiKTsKKyAgU2V0UHJvcChQX0dFTkRFUixGRU1BTEUpOyAKKyAgU2V0UHJvcChQX05PR0VULDEpOworICBBZGRJZCggKHsiZmFxIiwic2VoZXJmYXEiLCJGQVEiLCJTZWhlckZBUSIgfSkgKTsKKyAgQWRkQ21kKCJsaWVzIiwibGVzZW4iKTsKKyAgQWRkQ21kKCh7ImJlc2NocmVpYiIsImJlc2NocmVpYmUifSksImJlc2NocmVpYmVuIik7CisgIEFkZENtZCgic2VpdGVuIiwic2VpdGVuIik7CisgIEFkZENtZCgoeyJsb2VzY2giLCJsb2VzY2hlIn0pLCJsb2VzY2hlbiIpOworICBBZGRDbWQoKHsia29waWVyIiwia29waWVyZSJ9KSwia29waWVyZW4iKTsKKyAgcmVzdG9yZV9vYmplY3QoRkFRKCJmYXEiKSk7CisgIHNlaXRlID0gZ2V0X2RpcihGQVEoIioiKSktKHsiLiIsIi4uIiwiZmFxLm8ifSk7Cit9CisKK2luaXQoKQoreworICB0aGluZzo6aW5pdCgpOworICBpZiAodGhpc19wbGF5ZXIoKSAmJiBJU19VU0VSKHRoaXNfcGxheWVyKCkpKQorICAgIG5lZGl0Ojppbml0X3Jlc2N1ZSgpOworfQorCitzdHJpbmcKK19xdWVyeV9zaG9ydCgpCit7CisgIGlmICh0aGlzX3BsYXllcigpICYmIElTX1NFRVIodGhpc19wbGF5ZXIoKSkpCisgICAgcmV0dXJuICJEaWUgU2VoZXJGQVEiOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKK3N0cmluZyAKK19xdWVyeV9sb25nKCkKK3sKKyAgaWYgKHRoaXNfcGxheWVyKCkgJiYgSVNfU0VFUih0aGlzX3BsYXllcigpKSkKKyAgICByZXR1cm4gIkRpZXMgaXN0IFJ5bmVzIFNlaGVyRkFRLlxuXAorV2VubiBEdSB3ZWl0ZXJlIEZyYWdlbiBvZGVyIEFucmVndW5nZW4genUgZGllc2VyIEZBUSBoYXN0LFxuXAorc2VpIHNvIG5ldHQgdW5kIHNjaGlja2UgUnluZSBlaW5lbiBrdXJ6ZW4gQnJpZWZcblxuXAorWnVtIEluaGFsdCBkZXIgRkFRIGtvbW1zdCBEdSBtaXQgPmxpZXMgaW5oYWx0PFxuIjsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCitpbnQKK2lkKHN0cmluZyBzdHIpCit7CisgIGlmICghSVNfU0VFUih0aGlzX3BsYXllcigpKSkKKyAgICByZXR1cm4gMDsKKyAgZWxzZQorICAgIHJldHVybiA6OmlkKHN0cik7Cit9CisKK2ludAorc2VpdGVuKHN0cmluZyBzdHIpCit7CisgIGludCBpLGo7CisgIHN0cmluZyAqc3luOworICBjbG9zdXJlIGZpbHRlcl9sZGZpZWQ7CisKKyAgaWYgKCFJU19VU0VSKHRoaXNfcGxheWVyKCkpKQorICAgIHJldHVybiAwOworCisgIGlmKCEoaSA9IHNpemVvZihzZWl0ZSkpKQorICAgIHdyaXRlKCJLZWluZSBTZWl0ZW4gYmVzY2hyaWViZW4hXG4iKTsKKyAgZWxzZSB7CisgICAgZmlsdGVyX2xkZmllZCA9IGxhbWJkYSgoeydpbmQsJ3BhZ2UsJ21hcF9sZGZpZWQvKicqL30pLAorCQkgICAgKHsjJz09LCdwYWdlLCh7IydbLypdJyovLCdtYXBfbGRmaWVkLCdpbmR9KX0pKTsKKyAgICBmb3IgKHN0ciA9ICIiLGktPTE7aT49MDtpLS0pIHsKKyAgICAgIHN5biA9IG1faW5kaWNlcyhmaWx0ZXJfaW5kaWNlcyhzeW5vbnltLGZpbHRlcl9sZGZpZWQsc2VpdGVbaV0sc3lub255bSkpOworICAgICAgcHJpbnRmKCJTZWl0ZSAnJXMnIC0gIixzZWl0ZVtpXSk7CisgICAgICBpZiAoaj1zaXplb2Yoc3luKSkgeworCWZvcihqLT0xO2o+PTA7ai0tKQorCSAgcHJpbnRmKCInJXMnICIsc3luW2pdKTsKKwl3cml0ZSgiXG4iKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKwl3cml0ZSggIihrZWluZSBTeW5vbnltZSBkZWZpbmllcnQpXG4iKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2ludAorbGVzZW4oc3RyaW5nIHN0cikKK3sKKyAgaWYgKCFJU19TRUVSKHRoaXNfcGxheWVyKCkpKQorICAgIHJldHVybiAwOworCisgIGlmICghc3RyIHx8IHN0ciA9PSAiIikgeworICAgIG5vdGlmeV9mYWlsKCJXYXMgd2lsbHN0IER1IGRlbm4gbGVzZW4/XG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBzdHIgPSBsb3dlcl9jYXNlKHRoaXNfcGxheWVyKCktPl91bnBhcnNlZF9hcmdzKCkpOworICBpZiAobWVtYmVyKHNlaXRlLHN0cik8MCkgeworICAgIGlmICghbWVtYmVyKHN5bm9ueW0sc3RyKSkgeworICAgICAgbm90aWZ5X2ZhaWwoIkRpZXNlIFNlaXRlIGdpYnQgZXMgbmljaHQuLi5cbiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UgCisgICAgICBzdHIgPSBzeW5vbnltW3N0cl07CisgIH0KKyAgdGhpc19wbGF5ZXIoKS0+TW9yZShGQVEoc3RyKSwxKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludAorYmVzY2hyZWliZW4oc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIGZhcSwqZGVzYzsKKyAgaW50IGk7CisKKyAgaWYgKCFJU19VU0VSKHRoaXNfcGxheWVyKCkpKQorICAgIHJldHVybiAwOworCisgIHN0ciA9IGxvd2VyX2Nhc2UodGhpc19wbGF5ZXIoKS0+X3VucGFyc2VkX2FyZ3MoKSk7CisKKyAgaWYgKCFzdHIgfHwgc3RyID09ICIiKSB7CisgICAgbm90aWZ5X2ZhaWwoIldhcyB3aWxsc3QgRHUgZGVubiBiZXNjaHJlaWJlbj9cbiIpOworICAgIHJldHVybiAwOworICB9CisgIGlmIChzc2NhbmYoc3RyLCIlcyAlcyIsZmFxLHN0cikhPTIgfHwgIWlkKGZhcSkpIHsKKyAgICBub3RpZnlfZmFpbCgiU3ludGF4OiBiZXNjaHJlaWJlIGZhcSA8c2VpdGU+XG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBzdHIgPSBpbXBsb2RlKG9sZF9leHBsb2RlKHN0ciwiICIpLSh7IiJ9KSwgIiAiKTsKKyAgZGVzYyA9IG9sZF9leHBsb2RlKGltcGxvZGUob2xkX2V4cGxvZGUoc3RyLCIsICIpLCIsIiksIiwiKTsKKyAgZiA9IDA7CisgIHMgPSAwOworCisgIGZvciAoaT1zaXplb2YoZGVzYyktMTtpPj0wO2ktLSkgeworICAgIGlmIChtZW1iZXIoc2VpdGUsZGVzY1tpXSk+PTApIHsKKyAgICAgIGYgPSBkZXNjW2ldOworICAgICAgcyA9IGRlc2MtKHtkZXNjW2ldfSk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKCFmKSB7CisgICAgZiA9IGRlc2NbMF07CisgICAgcyA9IGRlc2NbMS4uXTsKKyAgfQorICB3cml0ZSgiQml0dGUgQmVzY2hyZWlidW5nIGZ1ZXIgZGllIEZBUS1TZWl0ZSAnIitmKyInIGFuZ2ViZW5cbiIpOworICBuZWRpdCgiZmFxIik7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAorZmFxKHN0cmluZyBzdHIpCit7CisgIGludCBpOworICBzdHJpbmcgZmlsZTsKKworICBpZiAoIXN0ciB8fCBzdHIgPT0gMCkgeworICAgIHdyaXRlKCIqKiBBYmJydWNoISAqKlxuTmljaHRzIGdlYWVuZGVydCFcbiIpOworICAgIHJldHVybjsKKyAgfQorICAKKyAgaWYgKGZpbGVfc2l6ZShmaWxlPUZBUShmKSk+PTApCisgICAgcm0oZmlsZSk7CisgIHdyaXRlX2ZpbGUoZmlsZSwgc3RyKTsKKyAgaWYgKG1lbWJlcihzZWl0ZSxmKT09LTEpCisgICAgc2VpdGUgKz0gKHtmfSk7CisKKyAgZm9yIChpPXNpemVvZihzKS0xO2k+PTA7aS0tKSAKKyAgICBzeW5vbnltICs9IChbIHNbaV0gOiBmIF0pOworCisgIHNhdmVfb2JqZWN0KEZBUSgiZmFxIikpOworfQorCitpbnQKK2xvZXNjaGVuKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyAqc3luOworICBpbnQgaTsKKworICBpZighSVNfVVNFUih0aGlzX3BsYXllcigpKSkKKyAgICByZXR1cm4gMDsKKworICBzdHIgPSBsb3dlcl9jYXNlKHRoaXNfcGxheWVyKCktPl91bnBhcnNlZF9hcmdzKCkpOworICBpZiAoIXN0ciB8fCBzdHIgPT0gIiIpIHsKKyAgICBub3RpZnlfZmFpbCgiV2FzIHdpbGxzdCBEdSBkZW5uIGxvZXNjaGVuP1xuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKG1lbWJlcihzZWl0ZSxzdHIpPj0wKSB7CisgICAgc3luID0gbV9pbmRpY2VzKGZpbHRlcl9pbmRpY2VzKHN5bm9ueW0sCisJCQkJIGxhbWJkYSgoeydpbmQsJ3BhZ2UsJ21hcF9sZGZpZWQvKicqL30pLAorCQkJCQkoeyMnPT0sJ3BhZ2UsKHsjJ1svKl0nKi8sJ21hcF9sZGZpZWQsJ2luZH0pfSkpCisJCQkJICxzZWl0ZVtpXSxzeW5vbnltKSk7CisgICAgcm0oRkFRKHN0cikpOworICAgIHNlaXRlIC09ICh7c3RyfSk7CisgIH0KKyAgZWxzZSB7CisgICAgc3RyID0gaW1wbG9kZShvbGRfZXhwbG9kZShzdHIsIiAiKS0oeyIifSksICIgIik7CisgICAgc3luID0gb2xkX2V4cGxvZGUoaW1wbG9kZShvbGRfZXhwbG9kZShzdHIsIiwgIiksIiwiKSwiLCIpOworICB9CisgIGZvciAoaT1zaXplb2Yoc3luKS0xOyBpPj0wOyBpLS0pCisgICAgc3lub255bSA9IGZpbHRlcl9pbmRpY2VzKHN5bm9ueW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYSgoeydrZXksJ2NtcH0pLAorCQkJCSAgICAoeyMnIT0sJ2tleSwnY21wLyonKi99KSksCisJCQkgICAgIHN5bltpXSk7CisKKyAgc2F2ZV9vYmplY3QoRkFRKCJmYXEiKSk7CisgIHdyaXRlKCJPS1xuIik7CisgIHJldHVybiAxOworfQorCitpbnQKK2tvcGllcmVuKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyAqcGFydDsKKyAgaW50IGk7CisKKyAgaWYgKCFJU19VU0VSKHRoaXNfcGxheWVyKCkpKQorICAgIHJldHVybiAwOworCisgIHN0ciA9IGxvd2VyX2Nhc2UodGhpc19wbGF5ZXIoKS0+X3VucGFyc2VkX2FyZ3MoKSk7CisgIHBhcnQgPSBvbGRfZXhwbG9kZShzdHIsIiAiKS0oeyIifSk7CisgIGlmKHNpemVvZihwYXJ0KTw0IHx8ICFpZChwYXJ0WzBdKSB8fCBwYXJ0WzJdICE9ICJuYWNoIiB8fCAKKyAgICAgbWVtYmVyKHNlaXRlLHBhcnRbMV0pID09IC0xKSB7CisgICAgbm90aWZ5X2ZhaWwoImtvcGllcmUgZmFxIDxzZWl0ZT4gbmFjaCA8YWxpYXM+XG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBzdHIgPSBwYXJ0WzFdOworICBwYXJ0PW9sZF9leHBsb2RlKGltcGxvZGUob2xkX2V4cGxvZGUoaW1wbG9kZShwYXJ0WzMuLl0sIiAiKSwiLCAiKSwiLCIpLCIsIik7CisgIGZvcihpPXNpemVvZihwYXJ0KS0xO2k+PTA7aS0tKQorICAgIHN5bm9ueW0gKz0gKFsgcGFydFtpXSA6IHN0ciBdKTsKKyAgc2F2ZV9vYmplY3QoRkFRKCJmYXEiKSk7CisgIHdyaXRlKCJPSy5cbiIpOworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci90b29scy9nZW5lcmF0b3IuYyBiL2Qvc2VoZXIvaGFldXNlci90b29scy9nZW5lcmF0b3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjU0YzJiCi0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL3Rvb2xzL2dlbmVyYXRvci5jCkBAIC0wLDAgKzEsNzQwIEBACisjaW5jbHVkZSAiLi4vaGF1cy5oIgorCitpbmhlcml0ICIvcC9zZXJ2aWNlL3dhcmdvbi9zbS9zdGF0ZW1hY2hpbmUiOworCisjaW5jbHVkZSAiL3Avc2VydmljZS93YXJnb24vc20vc3RhdGVtYWNoaW5lLmgiCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCisjZGVmaW5lIFNUQVRFX0lETEUgICAgICAgICAgIDAKKyNkZWZpbmUgU1RBVEVfSE9VU0UgICAgICAgICAgMQorI2RlZmluZSBTVEFURV9ST09NICAgICAgICAgICAyCisjZGVmaW5lIFNUQVRFX0NIRVNUICAgICAgICAgIDMKKyNkZWZpbmUgU1RBVEVfREVUQUlMICAgICAgICAgNAorI2RlZmluZSBTVEFURV9SREVUQUlMICAgICAgICA1CisjZGVmaW5lIFNUQVRFX0NPTU1BTkQgICAgICAgIDYKKyNkZWZpbmUgU1RBVEVfRklOQUxJWkUgICAgICAgNworI2RlZmluZSBTVEFURV9FWElUUyAgICAgICAgICA4CisKKyNkZWZpbmUgU0lHX0lOSVRJQUxJWkUgICAgICAgMAorI2RlZmluZSBTSUdfSE9VU0UgICAgICAgICAgICAxCisjZGVmaW5lIFNJR19IT1VTRV9ET05FICAgICAgIDIKKyNkZWZpbmUgU0lHX1JPT00gICAgICAgICAgICAgMworI2RlZmluZSBTSUdfRE9fQ0hFU1QgICAgICAgICA0CisjZGVmaW5lIFNJR19ET19ERVRBSUwgICAgICAgIDUKKyNkZWZpbmUgU0lHX0RFVEFJTF9ET05FICAgICAgNgorI2RlZmluZSBTSUdfUkRFVEFJTF9ET05FICAgICA3CisjZGVmaW5lIFNJR19DT01NQU5EX0RPTkUgICAgIDgKKyNkZWZpbmUgU0lHX0RPX0VYSVRTICAgICAgICAgOQorI2RlZmluZSBTSUdfUk9PTV9ET05FICAgICAgIDEwCisKK3ByaXZhdGUgbm9zYXZlIHN0cmluZyBmaWxlOworcHJpdmF0ZSBub3NhdmUgaW50ICAgIGZpbmFsOworcHJpdmF0ZSBub3NhdmUgb2JqZWN0IHJhdW07Citwcml2YXRlIG5vc2F2ZSBpbnQgICAgbnI7Citwcml2YXRlIG5vc2F2ZSBvYmplY3QgaGF1c21laXN0ZXI7Citwcml2YXRlIG5vc2F2ZSBtaXhlZCAgaG1hcmdzOworCitzdHJpbmcgZHVtcChvYmplY3QgZW52LCBpbnQgZmluYWwsIG1peGVkIGFyZ3MpOworCitwcml2YXRlIHN0cmluZyBzcGVjaWFsKHN0cmluZyBzdHIpOworcHJpdmF0ZSB2b2lkIHJlbW92ZU91dHB1dEZpbGUoKTsKK3ByaXZhdGUgdm9pZCBkdW1wSG91c2UoKTsKK3ByaXZhdGUgdm9pZCBkdW1wUm9vbUhlYWRlcigpOworcHJpdmF0ZSB2b2lkIGR1bXBDaGVzdCgpOworcHJpdmF0ZSB2b2lkIGR1bXBEZXRhaWxzKCk7Citwcml2YXRlIHZvaWQgZHVtcFJlYWREZXRhaWxzKCk7Citwcml2YXRlIHZvaWQgZHVtcENvbW1hbmRzKCk7Citwcml2YXRlIHZvaWQgZG9GaW5hbGl6ZSgpOworcHJpdmF0ZSB2b2lkIGR1bXBFeGl0cygpOworcHJpdmF0ZSB2b2lkIGR1bXBSb29tVHJhaWxlcigpOworcHJpdmF0ZSB2b2lkIGRvUmV0dXJuKCk7Citwcml2YXRlIHZvaWQgc1Byb3Aoc3RyaW5nIGZpbGUsIHN0cmluZyBwTmFtZSwgc3RyaW5nIHBTdHIpOworc3RhdGljIHZvaWQgbVByb3Aoc3RyaW5nIGZpbGUsIHN0cmluZyBwTmFtZSwgbWl4ZWQgbWFwX2xkZmllZCwgaW50IHBvcywgaW50IHNpZ25hbCk7CitzdGF0aWMgdm9pZCBjUHJvcChzdHJpbmcgZmlsZSwgc3RyaW5nIHBOYW1lLCBtaXhlZCBjbWQsIGludCBwb3MsIGludCBzaWduYWwpOworcHJpdmF0ZSB2b2lkIHByZXR0eVN0cmluZyhzdHJpbmcgZmlsZSwgc3RyaW5nICpzdHIsIGludCBpbmRlbnQpOworcHJpdmF0ZSB2b2lkIHByZXR0eUFycmF5KHN0cmluZyBmaWxlLCBzdHJpbmcgKmFyciwgaW50IHNlcCk7Citwcml2YXRlIHZvaWQgaGVhZGVyUm9vbSgpOworcHJpdmF0ZSB2b2lkIHRyYWlsZXJSb29tKCk7Citwcml2YXRlIHZvaWQgaGVhZGVySG91c2UoKTsKK3ByaXZhdGUgdm9pZCB0cmFpbGVySG91c2UoKTsKKworY3JlYXRlKCkKK3sKKyAgOjpjcmVhdGUoKTsKKyAgc2V0ZXVpZChnZXR1aWQoKSk7CisgIAorICBBZGRTdGF0ZShTVEFURV9JRExFLCAwLCAwKTsKKyAgQWRkU3RhdGUoU1RBVEVfSE9VU0UsICAgICMnZHVtcEhvdXNlLCAwKTsKKyAgQWRkU3RhdGUoU1RBVEVfUk9PTSwgICAgICMnZHVtcFJvb21IZWFkZXIsIDApOworICBBZGRTdGF0ZShTVEFURV9DSEVTVCwgICAgIydkdW1wQ2hlc3QsIDApOworICBBZGRTdGF0ZShTVEFURV9ERVRBSUwsICAgIydkdW1wRGV0YWlscywgMCk7CisgIEFkZFN0YXRlKFNUQVRFX1JERVRBSUwsICAjJ2R1bXBSZWFkRGV0YWlscywgMCk7CisgIEFkZFN0YXRlKFNUQVRFX0NPTU1BTkQsICAjJ2R1bXBDb21tYW5kcywgMCk7CisgIEFkZFN0YXRlKFNUQVRFX0ZJTkFMSVpFLCAjJ2RvRmluYWxpemUsIDApOworICBBZGRTdGF0ZShTVEFURV9FWElUUywgICAgIydkdW1wRXhpdHMsIDApOworCisgIEFkZFRyYW5zaXRpb24oU01fSU5WQUxJRCwgU0lHX0lOSVRJQUxJWkUsIFNUQVRFX0lETEUsIDApOworCisgIC8vIFp1c3RhbmRzdWViZXJnYWVuZ2UgenVtIFNjaHJlaWJlbiBkZXMgSGF1c2VzCisgIEFkZFRyYW5zaXRpb24oU1RBVEVfSURMRSwgU0lHX0hPVVNFLCBTVEFURV9IT1VTRSwgIydyZW1vdmVPdXRwdXRGaWxlKTsKKyAgQWRkVHJhbnNpdGlvbihTVEFURV9IT1VTRSwgU0lHX0hPVVNFX0RPTkUsIFNUQVRFX0lETEUsICMnZG9SZXR1cm4pOworCisgIC8vIFp1c3RhbmRzdWViZXJnYWVuZ2UgenVtIFNjaHJlaWJlbiBlaW5lcyBSYXVtcworICBBZGRUcmFuc2l0aW9uKFNUQVRFX0lETEUsICAgICBTSUdfUk9PTSwgICAgICBTVEFURV9ST09NLCAjJ3JlbW92ZU91dHB1dEZpbGUpOworICBBZGRUcmFuc2l0aW9uKFNUQVRFX1JPT00sICAgICBTSUdfRE9fQ0hFU1QsICBTVEFURV9DSEVTVCk7CisgIEFkZFRyYW5zaXRpb24oU1RBVEVfUk9PTSwgICAgIFNJR19ET19ERVRBSUwsIFNUQVRFX0RFVEFJTCk7CisgIEFkZFRyYW5zaXRpb24oU1RBVEVfQ0hFU1QsICAgIFNJR19ET19ERVRBSUwsIFNUQVRFX0RFVEFJTCk7CisgIEFkZFRyYW5zaXRpb24oU1RBVEVfREVUQUlMLCAgIFNJR19ERVRBSUxfRE9ORSwgIFNUQVRFX1JERVRBSUwpOworICBBZGRUcmFuc2l0aW9uKFNUQVRFX1JERVRBSUwsICBTSUdfUkRFVEFJTF9ET05FLCBTVEFURV9DT01NQU5EKTsKKyAgQWRkVHJhbnNpdGlvbihTVEFURV9DT01NQU5ELCAgU0lHX0NPTU1BTkRfRE9ORSwgU1RBVEVfRklOQUxJWkUpOworICBBZGRUcmFuc2l0aW9uKFNUQVRFX0ZJTkFMSVpFLCBTSUdfRE9fRVhJVFMsICBTVEFURV9FWElUUyk7CisgIEFkZFRyYW5zaXRpb24oU1RBVEVfRklOQUxJWkUsIFNJR19ST09NX0RPTkUsIFNUQVRFX0lETEUsICMnZG9SZXR1cm4pOworICBBZGRUcmFuc2l0aW9uKFNUQVRFX0VYSVRTLCAgICBTSUdfUk9PTV9ET05FLCBTVEFURV9JRExFLCAjJ2R1bXBSb29tVHJhaWxlcik7CisgIAorICBTdGF0ZVRyYW5zaXRpb24oU0lHX0lOSVRJQUxJWkUpOworfQorCisKKy8vIEVyemV1Z2Ugbm9ybWFsZW4gTFBDLVF1ZWxsY29kZSBhdXMgZWluZW0gSGF1cyBvZGVyIFJhdW0uCisvLworLy8gUGFyYW1ldGVyOgorLy8gICBlbnY6IERhcyBIYXVzIG9kZXIgZGVyIFJhdW0sIGF1cyBkZW0gUXVlbGxjb2RlIGVyemV1Z3Qgd2VyZGVuIHNvbGwKKy8vICAgZmluOiBGYWxscyBnbGVpY2ggMCwgc28gd2lyZCBRdWVsbGNvZGUgZnVlciBUeXBvZml4ZXMgby5hZS4KKy8vICAgICAgICBlcnpldWd0OyBkYXMgZXJ6ZXVndGUgRmlsZSBoZWlzc3QgaW1tZXIgJ2ZpeGVkLmMnLgorLy8gICAgICAgIEFuZGVybmZhbGxzIHdpcmQgUXVlbGxjb2RlIGZ1ZXIgZWluIGVpZ2Vuc3RhZW5kaWdlcyBPYmpla3QKKy8vICAgICAgICBlcnpldWd0LiBEaWVzZXMga2FubiB6LkIuIHp1bSBBbnNjaGx1c3MgYWxzICJNYWdpZXJoYXVzIgorLy8gICAgICAgIHZlcndlbmRldCB3ZXJkZW4uIERpZSBlcnpldWd0ZW4gRmlsZXMgaGVpc3NlbgorLy8gICAgICAgICdyZXAvPG5hbWU+cmF1bTxucj4uYycgYnp3LiAncmVwLzxuYW1lPmhhdXMuYycuIEJlZmluZGV0IHNpY2gKKy8vICAgICAgICBpbiBkZW0gUmF1bSBkaWUgVHJ1aGUsIHdpcmQgenVzYWV0emxpY2ggZGllIERhdGVpCisvLyAgICAgICAgJ3JlcC88bmFtZT50cnVoZS5jJyBnZXNjaHJpZWJlbi4KKy8vCisvLyBSdWVja2dhYmV3ZXJ0OgorLy8gICBEZXIgRGF0ZWluYW1lLCBpbiBkZW4gZGllIERhdGVuIGdlc2NocmllYmVuIHd1cmRlbi4KKworc3RyaW5nCitkdW1wKG9iamVjdCBlbnYsIGludCBmaW4sIG1peGVkIGFyZ3MpCit7CisgIHN0cmluZyBvdXQ7CisgIGludCBudW07CisKKyAgaGF1c21laXN0ZXIgPSBwcmV2aW91c19vYmplY3QoKTsKKyAgaG1hcmdzID0gYXJnczsKKyAgCisgIGlmIChRdWVyeVN0YXRlKCkgIT0gU1RBVEVfSURMRSkKKyAgeworICAgIHdyaXRlKCJEZXIgR2VuZXJhdG9yIGFyYmVpdGV0IG5vY2guLi5cbkJpdHRlIHdhcnRlbiFcbiIpOworICAgIHJldHVybiAiPGtlaW5lIERhdGVpIGdlbmVyaWVydD5cbiI7CisgIH0KKyAgCisgIC8vIEZhbGxzIGVpbiBSYXVtIGdlbmVyaWVydCB3aXJkLCBlcmhhZWx0IDxucj4gZGllIFJhdW1udW1tZXIuCisgIC8vIEJlaSBkZXIgQXVzc2VuYW5zaWNodCBkZXMgSGF1c2VzIHdpcmQgPG5yPiBhdWYgLTEgZ2VzZXR6dC4KKyAgaWYgKHNzY2FuZihvYmplY3RfbmFtZShlbnYpLCAiJXNyYXVtJWQiLCBvdXQsIG51bSkgPCAyKQorICB7CisgICAgbnVtID0gLTE7CisgIH0KKyAgCisgIGlmIChmaW4pCisgIHsKKyAgICBvdXQgPSBQQVRIKyJyZXAvIitlbnYtPlF1ZXJ5T3duZXIoKTsKKworICAgIGlmIChudW0gPj0gMCkKKyAgICB7CisgICAgICBvdXQgKz0gInJhdW0iK251bSsiLmMiOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgb3V0ICs9ICJoYXVzLmMiOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBvdXQgPSBQQVRIKyJmaXhlZC5jIjsKKyAgfQorCisgIC8vIEluZm9ybWF0aW9uZW4gZnVlciBkaWUgU3RhdGVtYWNoaW5lIHNldHplbgorICBmaWxlID0gb3V0OworICBmaW5hbCA9IGZpbjsKKyAgcmF1bSA9IGVudjsKKyAgbnIgPSBudW07CisKKyAgaWYgKG51bSA+PSAwKQorICB7CisgICAgU3RhdGVUcmFuc2l0aW9uKFNJR19ST09NKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBTdGF0ZVRyYW5zaXRpb24oU0lHX0hPVVNFKTsKKyAgfQorICByZXR1cm4gb3V0OworfQorCisvLyBTb25kZXJ6ZWljaGVuIFwsICIgdW5kIFRBQiBrb3JyZWt0IHVtd2FuZGVsbgorcHJpdmF0ZSBzdHJpbmcgc3BlY2lhbChzdHJpbmcgcykKK3sKKyAgcyA9IGltcGxvZGUoZXhwbG9kZShzLCAiXFwiKSwgIlxcXFwiKTsKKyAgcyA9IGltcGxvZGUoZXhwbG9kZShzLCAiXHQiKSwgIlxcdCIpOworICBzID0gaW1wbG9kZShleHBsb2RlKHMsICJcIiIpLCAiXFxcIiIpOworCisgIHJldHVybiBzOworfQorCisvKioqIEZ1bmt0aW9uZW4genVtIEdlbmVyaWVyZW4gZWluZXIgRGF0ZWkgYXVzIGRlbiBQcm9wZXJ0aWVzIGRlcyBIYXVzZXMgKioqLworCisjZGVmaW5lIEVYSVRfVE1QTCAiXCIvcGxheWVycy8lcy9zZWhlcmhhdXMvJXNyYXVtJWRcIiIKKworcHJpdmF0ZSB2b2lkCityZW1vdmVPdXRwdXRGaWxlKCkKK3sKKyAgY2F0Y2gocm0oZmlsZSkpOworfQorCitwcml2YXRlIHZvaWQKK2R1bXBIb3VzZSgpCit7CisgIGhlYWRlckhvdXNlKCk7CisgIAorICBzUHJvcChmaWxlLCAiUF9TSE9SVCIsIHJhdW0tPlF1ZXJ5UHJvcChQX1NIT1JUKSk7CisgIHdyaXRlX2ZpbGUoZmlsZSwgIlxuIik7CisgIHNQcm9wKGZpbGUsICJQX0xPTkciLCByYXVtLT5RdWVyeVByb3AoUF9MT05HKSk7CisgIHdyaXRlX2ZpbGUoZmlsZSwgIlxuIik7CisKKyAgaWYgKGZpbmFsKQorICB7CisgICAgbWl4ZWQgbjsKKworICAgIHdyaXRlX2ZpbGUoZmlsZSwgIiAgU2V0UHJvcChQX05PR0VULCAxKTtcbiIpOworICAgIHdyaXRlX2ZpbGUoZmlsZSwKKyAgICAgICAgICAgICAgICIgIFNldFByb3AoUF9HRU5ERVIsICIrCisgICAgICAgICAgICAgICAoeyJORVVURVIiLCJNQUxFIiwiRkVNQUxFIn0pW3JhdW0tPlF1ZXJ5UHJvcChQX0dFTkRFUildKworICAgICAgICAgICAgICAgIiApO1xuICBTZXRQcm9wKFBfTkFNRSwgIik7CisgICAgbiA9IHJhdW0tPlF1ZXJ5UHJvcChQX05BTUUpOworCisgICAgaWYgKHN0cmluZ3AobikpCisgICAgeworICAgICAgd3JpdGVfZmlsZShmaWxlLCAiXCIiK24rIlwiIik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBwcmV0dHlBcnJheShmaWxlLCBuLCAwKTsKKyAgICB9CisgICAgd3JpdGVfZmlsZShmaWxlLCAiICk7XG5cbiAgQWRkSWQoICIpOworICAgIHByZXR0eUFycmF5KGZpbGUsCisgICAgICAgICAgICAgICAgcmF1bS0+UXVlcnlQcm9wKFBfSURTKS0oeyAic2VoZVxyaGF1cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG4iK3JhdW0tPlF1ZXJ5T3duZXIoKSsiaGF1cyIgfSksCisgICAgICAgICAgICAgICAgMCk7CisgICAgd3JpdGVfZmlsZShmaWxlLCAiICk7XG4iKTsKKyAgfQorICB0cmFpbGVySG91c2UoKTsKKworICBTdGF0ZVRyYW5zaXRpb24oU0lHX0hPVVNFX0RPTkUpOworfQorCitwcml2YXRlIHZvaWQKK2R1bXBSb29tSGVhZGVyKCkKK3sKKyAgaGVhZGVyUm9vbSgpOworICAKKyAgc1Byb3AoZmlsZSwgIlBfSU5UX1NIT1JUIiwgcmF1bS0+UXVlcnlQcm9wKFBfSU5UX1NIT1JUKSk7CisgIHdyaXRlX2ZpbGUoZmlsZSwgIlxuIik7CisgIHNQcm9wKGZpbGUsICJQX0lOVF9MT05HIiwgcmF1bS0+UXVlcnlQcm9wKFBfSU5UX0xPTkcpKTsKKyAgd3JpdGVfZmlsZShmaWxlLCAiXG4iKTsKKworICBpZiAoZmluYWwgJiYgcmF1bS0+UXVlcnlQcm9wKEhfQ0hFU1QpKQorICB7CisgICAgU3RhdGVUcmFuc2l0aW9uKFNJR19ET19DSEVTVCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgU3RhdGVUcmFuc2l0aW9uKFNJR19ET19ERVRBSUwpOworICB9Cit9CisKK3ByaXZhdGUgdm9pZAorZHVtcENoZXN0KCkKK3sKKyAgbWl4ZWQgbjsKKyAgc3RyaW5nIGNmaWxlOworICBvYmplY3QgY2hlc3Q7CisKKyAgY2ZpbGUgPSBQQVRIKyJyZXAvIityYXVtLT5RdWVyeU93bmVyKCkrInRydWhlLmMiOworICBjaGVzdCA9IHByZXNlbnQoVFJVSEUsIHJhdW0pOworICAKKyAgY2F0Y2gocm0oY2ZpbGUpKTsKKworICB3cml0ZV9maWxlKGNmaWxlLAorICAgICAgICAgICAgICIjaW5jbHVkZSA8cHJvcGVydGllcy5oPlxuI2luY2x1ZGUgPG1vdmluZy5oPlxuXG4iCisgICAgICAgICAgICAgImluaGVyaXQgXCIvZC93dWVzdGUvZHVyaWFuL2JlaGFlbHRlclwiO1xuXG4iCisgICAgICAgICAgICAgInZvaWQgY3JlYXRlKClcbntcbiAgaWYoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuO1xuXG4iCisgICAgICAgICAgICAgIiAgOjpjcmVhdGUoKTtcblxuIiApOworICBzUHJvcChjZmlsZSwgIlBfU0hPUlQiLCBjaGVzdC0+UXVlcnlQcm9wKFBfU0hPUlQpKTsKKyAgc1Byb3AoY2ZpbGUsICJQX0xPTkciLCAgY2hlc3QtPlF1ZXJ5UHJvcChQX0xPTkcpKTsKKworICB3cml0ZV9maWxlKGNmaWxlLCAiICBTZXRQcm9wKFBfTk9HRVQsIDEpO1xuIik7CisgIHdyaXRlX2ZpbGUoY2ZpbGUsCisgICAgICAgICAgICAgIiAgU2V0UHJvcChQX0dFTkRFUiwgIisKKyAgICAgICAgICAgICAoeyJORVVURVIiLCJNQUxFIiwiRkVNQUxFIn0pW2NoZXN0LT5RdWVyeVByb3AoUF9HRU5ERVIpXSsKKyAgICAgICAgICAgICAiICk7XG4gIFNldFByb3AoUF9OQU1FLCAiKTsKKworICBuID0gY2hlc3QtPlF1ZXJ5UHJvcChQX05BTUUpOworICBpZiAoc3RyaW5ncChuKSkKKyAgeworICAgIHdyaXRlX2ZpbGUoY2ZpbGUsICJcIiIrbisiXCIiKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBwcmV0dHlBcnJheShmaWxlLCBuLCAwKTsKKyAgfQorICB3cml0ZV9maWxlKGNmaWxlLCAiICk7XG5cbiAgQWRkSWQoICIpOworICBwcmV0dHlBcnJheShjZmlsZSwgY2hlc3QtPlF1ZXJ5UHJvcChQX0lEUyktKHsgVFJVSEUgfSksIDApOworICB3cml0ZV9maWxlKGNmaWxlLCAiICk7XG4iKTsKKworICBpZiAoKG49Y2hlc3QtPlF1ZXJ5UHJvcChQX0FESkVDVElWRVMpKSAmJiBzaXplb2YobikpCisgIHsKKyAgICB3cml0ZV9maWxlKGNmaWxlLCAiXG4gIEFkZEFkamVjdGl2ZSggIik7CisgICAgcHJldHR5QXJyYXkoY2ZpbGUsIG4sIDApOworICAgIHdyaXRlX2ZpbGUoY2ZpbGUsICIgKTtcbiIpOworICB9CisgIGlmICgobj1jaGVzdC0+UXVlcnlQcm9wKFBfTkFNRV9BREopKSAmJiBzaXplb2YobikpCisgIHsKKyAgICB3cml0ZV9maWxlKGNmaWxlLCAiXG4gIFNldFByb3AoUF9OQU1FX0FESiwgIik7CisgICAgcHJldHR5QXJyYXkoY2ZpbGUsIG4sIDApOworICAgIHdyaXRlX2ZpbGUoY2ZpbGUsICIgKTtcbiIpOworICB9CisgIHdyaXRlX2ZpbGUoY2ZpbGUsICJ9XG4iKTsKKworICBTdGF0ZVRyYW5zaXRpb24oU0lHX0RPX0RFVEFJTCk7Cit9CisKK3ByaXZhdGUgdm9pZAorZHVtcERldGFpbHMoKQoreworICBtYXBwaW5nIHByb3A7CisgIG1peGVkIGRldDsKKyAgCisgIHByb3AgPSByYXVtLT5RdWVyeVByb3AoUF9ERVRBSUxTKTsKKworICBpZiAoc2l6ZW9mKHByb3ApKQorICB7CisgICAgZGV0ID0gVkVSV0FMVEVSLT5QQ3J1bmNoKHByb3ApOworICAgIC8vIG5leHQgc3RhdGUgdHJhbnNpdGlvbiBoYXBwZW5zIHdoZW4gZG9fbVByb3AgaXMgZG9uZQorICAgIG1Qcm9wKGZpbGUsICJBZGREZXRhaWwiLCBkZXQsIHNpemVvZihkZXQpLTEsIFNJR19ERVRBSUxfRE9ORSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgU3RhdGVUcmFuc2l0aW9uKFNJR19ERVRBSUxfRE9ORSk7CisgIH0KK30KKworcHJpdmF0ZSB2b2lkCitkdW1wUmVhZERldGFpbHMoKQoreworICBtYXBwaW5nIHByb3A7CisgIG1peGVkIHJkZXQ7CisgIAorICBwcm9wID0gcmF1bS0+UXVlcnlQcm9wKFBfUkVBRF9ERVRBSUxTKTsKKworICBpZiAoc2l6ZW9mKHByb3ApKQorICB7CisgICAgcmRldCA9IFZFUldBTFRFUi0+UENydW5jaChwcm9wKTsKKyAgICAvLyBuZXh0IHN0YXRlIHRyYW5zaXRpb24gaGFwcGVucyB3aGVuIGRvX21Qcm9wIGlzIGRvbmUKKyAgICBtUHJvcChmaWxlLCAiQWRkUmVhZERldGFpbCIsIHJkZXQsIHNpemVvZihyZGV0KS0xLCBTSUdfUkRFVEFJTF9ET05FKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBTdGF0ZVRyYW5zaXRpb24oU0lHX1JERVRBSUxfRE9ORSk7CisgIH0KK30KKworcHJpdmF0ZSB2b2lkCitkdW1wQ29tbWFuZHMoKQoreworICBtYXBwaW5nIGNvbW07CisgIG1peGVkIGNtZDsKKyAgCisgIGNvbW0gPSByYXVtLT5RdWVyeVByb3AoSF9DT01NQU5EUyk7CisKKyAgaWYgKHNpemVvZihjb21tKSkKKyAgeworICAgIGNtZCA9IFZFUldBTFRFUi0+UENydW5jaChjb21tKTsKKyAgICAvLyBuZXh0IHN0YXRlIHRyYW5zaXRpb24gaGFwcGVucyB3aGVuIGRvX2NQcm9wIGlzIGRvbmUKKyAgICBjUHJvcChmaWxlLCAiQWRkVXNlckNtZCIsIGNtZCwgc2l6ZW9mKGNtZCktMSwgU0lHX0NPTU1BTkRfRE9ORSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgU3RhdGVUcmFuc2l0aW9uKFNJR19DT01NQU5EX0RPTkUpOworICB9Cit9CisKK3ByaXZhdGUgdm9pZAorZG9GaW5hbGl6ZSgpCit7CisgIGlmIChmaW5hbCkKKyAgeworICAgIFN0YXRlVHJhbnNpdGlvbihTSUdfRE9fRVhJVFMpOworICB9CisgIGVsc2UKKyAgeworICAgIFN0YXRlVHJhbnNpdGlvbihTSUdfUk9PTV9ET05FKTsKKyAgfQorfQorCitwcml2YXRlIHZvaWQKK2R1bXBFeGl0cygpCit7CisgIHN0cmluZyAqaywgbzsKKyAgbWFwcGluZyBwcm9wOworICBpbnQgaSwgbnVtOworCisgIHByb3AgPSByYXVtLT5RdWVyeVByb3AoUF9FWElUUyk7CisgIGsgPSBtX2luZGljZXMocHJvcCk7CisgIGlmIChtZW1iZXIoaywgInJhdXMiKSA+PSAwKQorICB7CisgICAgayAtPSAoeyAicmF1cyIgfSk7CisgICAgd3JpdGVfZmlsZShmaWxlLCBzcHJpbnRmKCIgIEFkZEV4aXQoIFwicmF1c1wiLCBcIiVzXCIpO1xuIiwgcHJvcFsicmF1cyJdKSk7CisgIH0KKyAgCisgIGZvciAoaT1zaXplb2YoayktMTsgaT49MDsgaS0tKQorICB7CisgICAgaWYgKHNzY2FuZihwcm9wW2tbaV1dLCBQQVRIKyIlc3JhdW0lZCIsIG8sIG51bSkgIT0gMikKKyAgICB7CisgICAgICBwcmludGYoIktvbWlzY2hlciBFeGl0ICglTylcbiVzIC0+ICVzXG4iLCByYXVtLCBrW2ldLCBwcm9wW2tbaV1dKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmIChvID09IHJhdW0tPlF1ZXJ5T3duZXIoKSkKKyAgICAgIHsKKyAgICAgICAgbyA9IHNwcmludGYoRVhJVF9UTVBMLCBvLCBvLCBudW0pOworICAgICAgICB3cml0ZV9maWxlKGZpbGUsIHNwcmludGYoIiAgQWRkRXhpdCggXCIlc1wiLCAlcyk7XG4iLCBrW2ldLCBvKSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHdyaXRlX2ZpbGUoZmlsZSwKKyAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCIgIEFkZEV4aXQoIFwiJXNcIiwgXCIlc1wiKTtcbiIsIGtbaV0sIHByb3Bba1tpXV0pKTsKKyAgICAgICAgcHJpbnRmKCJFeGl0IHZvbiAlTyBuYWNoICVzIVxuIiwgcmF1bSwgcHJvcFtrW2ldXSk7CisgICAgICB9CisgICAgfQorICB9CisgIFN0YXRlVHJhbnNpdGlvbihTSUdfUk9PTV9ET05FKTsKK30KKworcHJpdmF0ZSB2b2lkCitkdW1wUm9vbVRyYWlsZXIoKQoreworICB0cmFpbGVyUm9vbSgpOworICBkb1JldHVybigpOworfQorCitwcml2YXRlIHZvaWQKK2RvUmV0dXJuKCkKK3sKKyAgaWYgKGhhdXNtZWlzdGVyICE9IDApCisgIHsKKyAgICBhcHBseSgjJ2NhbGxfb3RoZXIsIGhhdXNtZWlzdGVyLCAiR2VuZXJhdGlvbkRvbmUiLCBobWFyZ3MpOworICB9CisgIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOworfQorCitwcml2YXRlIHZvaWQKK3NQcm9wKHN0cmluZyBmLCBzdHJpbmcgcE5hbWUsIHN0cmluZyBwU3RyKQoreworICBzdHJpbmcgKnN0cjsKKworICB3cml0ZV9maWxlKGYsICIgIFNldFByb3AoICIrcE5hbWUrIiwiKTsKKworICBpZiAoIXBTdHIpCisgIHsKKyAgICB3cml0ZV9maWxlKGYsICIwICk7XG4iKTsKKyAgICByZXR1cm47CisgIH0KKworICBwU3RyID0gc3BlY2lhbChwU3RyKTsKKworICBpZiAoc2l6ZW9mKHN0cj1vbGRfZXhwbG9kZShwU3RyLCJcbiIpKSA+IDEpCisgIHsKKyAgICBwcmV0dHlTdHJpbmcoZiwgc3RyLCA0KTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBpZiAoc2l6ZW9mKHN0cik9PTApCisgICAgeworICAgICAgc3RyID0gKHsiIn0pOworICAgIH0KKyAgICB3cml0ZV9maWxlKGYsICJcbiAgICAgXCIiK3N0clswXSk7CisKKyAgICBpZiAocFN0cls8MV0gPT0gJ1xuJykKKyAgICB7CisgICAgICB3cml0ZV9maWxlKGYsICJcXG5cIiIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgd3JpdGVfZmlsZShmLCAiXCIiKTsKKyAgICB9CisgIH0KKyAgd3JpdGVfZmlsZShmLCAiICk7XG4iKTsKK30KKworc3RhdGljIHZvaWQKK21Qcm9wKHN0cmluZyBmaWxlLCBzdHJpbmcgcE5hbWUsIG1peGVkIGNtZCwgaW50IHBvcywgaW50IHNpZ25hbCkKK3sKKyAgaW50IGk7CisgIHN0cmluZyAqZXEsIHQxOworICAKKyAgZm9yIChpID0gcG9zOyAoaSA+PSAwKSAmJiAoZ2V0X2V2YWxfY29zdCgpID4gMTAwMDApOyAtLWkpCisgIHsKKyAgICB3cml0ZV9maWxlKGZpbGUsICIgICIrcE5hbWUrIihcbiAgICAiKTsKKyAgICBlcSA9IGNtZFtpXVswXTsKKyAgICB0MSA9IGNtZFtpXVsxXTsKKworICAgIHByZXR0eUFycmF5KGZpbGUsIGVxLCAwKTsKKyAgICB3cml0ZV9maWxlKGZpbGUsICIsICIpOworCisgICAgcHJldHR5U3RyaW5nKGZpbGUsIG9sZF9leHBsb2RlKHNwZWNpYWwodDEpLCAiXG4iKSwgNik7CisgICAgd3JpdGVfZmlsZShmaWxlLCAiICk7XG4iKTsKKyAgfQorCisgIC8vIEZhbGxzIHdpciBkaWUgZXZhbF9jb3N0IGF1c2dlcmVpenQgaGFiZW4sIGFiZXIgbm9jaCBuaWNodAorICAvLyBhbGxlIEVpbnRy5GdlIGJlYXJiZWl0ZXQgd3VyZGVuLCB3aXJkIGpldHp0IGRpZSBuYWVjaHN0ZQorICAvLyBSdW5kZSBnZXN0YXJ0ZXQKKyAgaWYgKGkgPj0gMCkKKyAgeworICAgIGNhbGxfb3V0KCJtUHJvcCIsIDEsIGZpbGUsIHBOYW1lLCBjbWQsIGksIHNpZ25hbCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLy8gQW5zb25zdGVuIHdlY2hzZWxuIHdpciBqZXR6dCBpbiBkZW4gbmFlY2hzdGVuIFp1c3RhbmQKKyAgICB3cml0ZV9maWxlKGZpbGUsICJcbiIpOworICAgIFN0YXRlVHJhbnNpdGlvbihzaWduYWwpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitjUHJvcChzdHJpbmcgZmlsZSwgc3RyaW5nIHBOYW1lLCBtaXhlZCBjbWQsIGludCBwb3MsIGludCBzaWduYWwpCit7CisgIHN0cmluZyB0MSwgdDI7CisgIG1peGVkICBlcTsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gcG9zOyAoaSA+PSAwKSAmJiAoZ2V0X2V2YWxfY29zdCgpID4gMTAwMDApOyAtLWkpCisgIHsKKyAgICB3cml0ZV9maWxlKGZpbGUsICIgICIrcE5hbWUrIihcbiAgICAiKTsKKyAgICBlcSA9IGNtZFtpXVswXTsKKyAgICB0MSA9IGNtZFtpXVsxXTsKKyAgICB0MiA9IGNtZFtpXVsyXTsKKworICAgIHByZXR0eUFycmF5KGZpbGUsIGVxLCAxKTsKKyAgICB3cml0ZV9maWxlKGZpbGUsICIsIDAsICIpOworCisgICAgcHJldHR5U3RyaW5nKGZpbGUsIG9sZF9leHBsb2RlKHNwZWNpYWwodDEpLCAiXG4iKSwgNCk7CisgICAgd3JpdGVfZmlsZShmaWxlLCAiLCAiKTsKKyAgICAKKyAgICBpZiAodDIpCisgICAgeworICAgICAgcHJldHR5U3RyaW5nKGZpbGUsIG9sZF9leHBsb2RlKHNwZWNpYWwodDIpLCAiXG4iKSwgNCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICB3cml0ZV9maWxlKGZpbGUsICIwIik7CisgICAgfQorICAgIAorICAgIHdyaXRlX2ZpbGUoZmlsZSwgIiApO1xuIik7CisgIH0KKworICAvLyBGYWxscyB3aXIgZGllIGV2YWxfY29zdCBhdXNnZXJlaXp0IGhhYmVuLCBhYmVyIG5vY2ggbmljaHQKKyAgLy8gYWxsZSBFaW50cuRnZSBiZWFyYmVpdGV0IHd1cmRlbiwgd2lyZCBqZXR6dCBkaWUgbmFlY2hzdGUKKyAgLy8gUnVuZGUgZ2VzdGFydGV0CisgIGlmIChpID49IDApCisgIHsKKyAgICBjYWxsX291dCgiY1Byb3AiLCAxLCBmaWxlLCBwTmFtZSwgY21kLCBpLCBzaWduYWwpOworICB9CisgIGVsc2UKKyAgeworICAgIC8vIEFuc29uc3RlbiB3ZWNoc2VsbiB3aXIgamV0enQgaW4gZGVuIG5hZWNoc3RlbiBadXN0YW5kCisgICAgd3JpdGVfZmlsZShmaWxlLCAiXG4iKTsKKyAgICBTdGF0ZVRyYW5zaXRpb24oc2lnbmFsKTsKKyAgfQorfQorCitwcml2YXRlIHZvaWQKK3ByZXR0eVN0cmluZyhzdHJpbmcgZiwgc3RyaW5nICpzdHIsIGludCBpbmRlbnQpCit7CisgIHN0cmluZyBpbmQ7CisgIGludCBpOworCisgIGluZCA9IGV4dHJhY3QoIlxuICAgICAgICAgICIsMCxpbmRlbnQpOworCisgIGlmICghc2l6ZW9mKHN0cikpCisgIHsKKyAgICB3cml0ZV9maWxlKGYsIGluZCsiIFwiXFxuXCIiKTsKKyAgICByZXR1cm47CisgIH0KKworICB3cml0ZV9maWxlKGYsIGluZCsiIFwiIitzdHJbMF0rIlxcblwiIik7CisKKyAgZm9yIChpPTE7IGk8c2l6ZW9mKHN0cik7IGkrKykKKyAgeworICAgIHdyaXRlX2ZpbGUoZiwgaW5kKyIrXCIiK3N0cltpXSsiXFxuXCIiKTsKKyAgfQorfQorCitwcml2YXRlIHZvaWQKK3ByZXR0eUFycmF5KHN0cmluZyBmLCBzdHJpbmcgKmFyciwgaW50IHNlcCkKK3sKKyAgaW50IGksajsKKyAgc3RyaW5nIHJlcywgdDEsIHQyOworCisgIHdyaXRlX2ZpbGUoZiwgIih7Iik7CisKKyAgaWYgKHNpemVvZihhcnIpKQorICB7CisgICAgdDEgPSAoIlwiIithcnJbMF0rIlwiIik7CisgICAgcmVzID0gIiAiK3QxOworICAgIHQyID0gIiI7CisKKyAgICBmb3IgKGk9MSwgaj1zaXplb2YoYXJyKTsgaTxqOyBpKyspCisgICAgeworICAgICAgdDIgPSAiXCIiK2FycltpXSsiXCIiOworICAgICAgaWYgKCFzZXApCisgICAgICB7CisJaWYgKChzaXplb2YodDEpICsgc2l6ZW9mKHQyKSkgPiA2OSkKKyAgICAgICAgeworCSAgcmVzICs9ICgiLFxuICAgICAgICIrdDIpOworCSAgdDEgPSB0MjsKKwkgIHQyID0gIiI7CisJfQorCWVsc2UgeworCSAgdDEgKz0gKCIsICIrdDIpOworCSAgcmVzICs9ICgiLCAiK3QyKTsKKwl9CisgICAgICB9CisgICAgICBlbHNlIHsKKwlyZXMgKz0gKCIsXG4gICAgICAgIit0Mik7CisgICAgICB9CisgICAgfQorICB9CisgIHdyaXRlX2ZpbGUoZiwgcmVzICsgIiB9KSIgKTsKK30KKworcHJpdmF0ZSB2b2lkCitoZWFkZXJSb29tKCkKK3sKKyAgaWYgKGZpbmFsKQorICB7CisgICAgd3JpdGVfZmlsZShmaWxlLAorICAgICAgICAgICAgICAgIiNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+XG5cbiIKKyAgICAgICAgICAgICAgICJpbmhlcml0IFwic3RkL3Jvb21cIjtcbiIKKyAgICAgICAgICAgICAgICJpbmhlcml0IFwiIitQQVRIKyJtb2R1bGVzL3VzZXJjbWRcIjtcblxuIgorICAgICAgICAgICAgICAgImNyZWF0ZSgpXG4iCisgICAgICAgICAgICAgICAie1xuIgorICAgICAgICAgICAgICAgIiAgcm9vbTo6Y3JlYXRlKCk7XG4iCisgICAgICAgICAgICAgICAiICB1c2VyY21kOjpjcmVhdGUoKTtcblxuIgorICAgICAgICAgICAgICAgIiAgU2V0UHJvcChQX0xJR0hULCAxKTtcbiIKKyAgICAgICAgICAgICAgICIgIFNldFByb3AoUF9JTkRPT1JTLCAxKTtcblxuIik7CisgIH0KKyAgZWxzZQorICB7CisgICAgd3JpdGVfZmlsZShmaWxlLAorICAgICAgICAgICAgICAgIiNpbmNsdWRlIFwiaGF1cy5oXCJcbiIKKyAgICAgICAgICAgICAgICIjaW5jbHVkZSA8cHJvcGVydGllcy5oPlxuXG4iCisgICAgICAgICAgICAgICAiaW5oZXJpdCBSQVVNO1xuIgorICAgICAgICAgICAgICAgImluaGVyaXQgXCIvc3RkL3RoaW5nL21vdmluZ1wiO1xuXG4iCisgICAgICAgICAgICAgICAiY3JlYXRlKClcbiIKKyAgICAgICAgICAgICAgICJ7XG4iCisgICAgICAgICAgICAgICAiICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuO1xuIgorICAgICAgICAgICAgICAgIiAgOjpjcmVhdGUoKTtcblxuIgorICAgICAgICAgICAgICAgIiAgU2V0T3duZXIoXCIiK3JhdW0tPlF1ZXJ5T3duZXIoKSsiXCIsICIrbnIrIik7XG4iCisgICAgICAgICAgICAgICAiICBMb2FkKCk7XG5cbiIKKyAgICAgICAgICAgICAgICIgIFNldFByb3AoUF9ERVRBSUxTLCAoW10pKTtcbiIKKyAgICAgICAgICAgICAgICIgIFNldFByb3AoUF9SRUFEX0RFVEFJTFMsIChbXSkpO1xuXG4iKTsKKyAgfQorfQorCitwcml2YXRlIHZvaWQKK3RyYWlsZXJSb29tKCkKK3sKKyAgaWYgKGZpbmFsKQorICB7CisgICAgd3JpdGVfZmlsZShmaWxlLCAifVxuIik7CisgIH0KKyAgZWxzZQorICB7CisgICAgd3JpdGVfZmlsZShmaWxlLAorICAgICAgICAgICAgICAgIiAgU2F2ZSgxKTtcblxuIgorICAgICAgICAgICAgICAgIiAgeyBvYmplY3QgcmF1bTtcbiIKKyAgICAgICAgICAgICAgICIgICAgaWYgKHJhdW0gPSBmaW5kX29iamVjdChSQVVNTkFNRSgiCisgICAgICAgICAgICAgICAiXCIiK3JhdW0tPlF1ZXJ5T3duZXIoKSsiXCIsICIrbnIrIikpKVxuIgorICAgICAgICAgICAgICAgIiAgICAgIHJhdW0tPkxvYWQoKTtcbiIKKyAgICAgICAgICAgICAgICIgIH1cblxuIgorICAgICAgICAgICAgICAgIiAgY2FsbF9vdXQoXCJyZW1vdmVcIiwwKTtcbiIKKyAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgfQorfQorCitwcml2YXRlIHZvaWQKK2hlYWRlckhvdXNlKCkKK3sKKyAgaWYgKGZpbmFsKQorICB7CisgICAgd3JpdGVfZmlsZShmaWxlLAorICAgICAgICAgICAgICAgIiNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+XG4iCisgICAgICAgICAgICAgICAiI2luY2x1ZGUgPG1vdmluZy5oPlxuIgorICAgICAgICAgICAgICAgIiNpbmNsdWRlIFwiIitQQVRIKyJoYXVzLmhcIlxuXG4iCisgICAgICAgICAgICAgICAiaW5oZXJpdCBcInN0ZC90aGluZ1wiO1xuIgorICAgICAgICAgICAgICAgImluaGVyaXQgSEFVU1RVRVI7XG5cbiIKKyAgICAgICAgICAgICAgICJjcmVhdGUoKVxuIgorICAgICAgICAgICAgICAgIntcbiIKKyAgICAgICAgICAgICAgICIgIHRoaW5nOjpjcmVhdGUoKTtcbiIKKyAgICAgICAgICAgICAgICIgIGhhdXN0dWVyOjpjcmVhdGUoKTtcblxuIik7CisgIH0KKyAgZWxzZQorICB7CisgICAgd3JpdGVfZmlsZShmaWxlLAorICAgICAgICAgICAgICAgIiNpbmNsdWRlIFwiaGF1cy5oXCJcbiIKKyAgICAgICAgICAgICAgICIjaW5jbHVkZSA8cHJvcGVydGllcy5oPlxuXG4iCisgICAgICAgICAgICAgICAiaW5oZXJpdCBIQVVTO1xuIgorICAgICAgICAgICAgICAgImluaGVyaXQgXCIvc3RkL3RoaW5nL21vdmluZ1wiO1xuXG4iCisgICAgICAgICAgICAgICAiY3JlYXRlKClcbiIKKyAgICAgICAgICAgICAgICJ7XG4iCisgICAgICAgICAgICAgICAiICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuO1xuIgorICAgICAgICAgICAgICAgIiAgOjpjcmVhdGUoKTtcblxuIgorICAgICAgICAgICAgICAgIiAgU2V0T3duZXIoXCIiK3JhdW0tPlF1ZXJ5T3duZXIoKSsiXCJcbiIKKyAgICAgICAgICAgICAgICIgIExvYWQoKTtcblxuIik7CisgIH0KK30KKworcHJpdmF0ZSB2b2lkCit0cmFpbGVySG91c2UoKQoreworICBpZiAoZmluYWwpCisgIHsKKyAgICB3cml0ZV9maWxlKGZpbGUsIHJlYWRfZmlsZShQQVRIKyJ0b29scy9oYXVzLmFweCIpKTsKKyAgICB3cml0ZV9maWxlKGZpbGUsICIgIHRoaXNfcGxheWVyKCktPm1vdmUoIik7CisgICAgd3JpdGVfZmlsZShmaWxlLCBzcHJpbnRmKEVYSVRfVE1QTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF1bS0+UXVlcnlPd25lcigpLCByYXVtLT5RdWVyeU93bmVyKCksIDApKTsKKyAgICB3cml0ZV9maWxlKGZpbGUsCisgICAgICAgICAgICAgICAiLFxuXHRcdFx0TV9HTywgMCwgXCJiZXRyaXR0IFwiK25hbWUoV0VOLDEpLCBcImtvbW10IGhlcmVpblwiKTtcbiIKKyAgICAgICAgICAgICAgICIgIHJldHVybiAxO1xufVxuIik7CisgICAgaWYgKCFyYXVtLT5RdWVyeVByb3AoUF9TSE9SVCkpCisgICAgeworICAgICAgd3JpdGVfZmlsZShmaWxlLAorICAgICAgICAgICAgICAgICAiXG5zdHJpbmcgc2hvcnQoKVxuIgorICAgICAgICAgICAgICAgICAie1xuIgorICAgICAgICAgICAgICAgICAiICBzdHJpbmcgcmV0O1xuXG4iCisgICAgICAgICAgICAgICAgICIgIHJldCA9IDo6c2hvcnQoKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgaWYgKHByZXZpb3VzX29iamVjdCgpICE9IGVudmlyb25tZW50KCkgJiYgIXJldClcbiIKKyAgICAgICAgICAgICAgICAgIiAgICByZXQgPVwiXCI7XG5cbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIHJldDtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICB3cml0ZV9maWxlKGZpbGUsCisgICAgICAgICAgICAgICAiICBTYXZlKDEpO1xuXG4iCisgICAgICAgICAgICAgICAiICB7IG9iamVjdCByYXVtO1xuIgorICAgICAgICAgICAgICAgIiAgICBpZiAocmF1bSA9IGZpbmRfb2JqZWN0KEhBVVNOQU1FKCIKKyAgICAgICAgICAgICAgICJcIiIrcmF1bS0+UXVlcnlPd25lcigpKyJcIikpKVxuIgorICAgICAgICAgICAgICAgIiAgICAgIHJhdW0tPkxvYWQoKTtcbiIKKyAgICAgICAgICAgICAgICIgIH1cblxuIgorICAgICAgICAgICAgICAgIiAgY2FsbF9vdXQoXCJyZW1vdmVcIiwwKTtcbn1cbiIpOworICB9Cit9CmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvdG9vbHMvaGF1cy5hcHggYi9kL3NlaGVyL2hhZXVzZXIvdG9vbHMvaGF1cy5hcHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRlMjg3NwotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci90b29scy9oYXVzLmFweApAQCAtMCwwICsxLDI1IEBACisKKyAgQWRkQ21kKCAoeyAiYmV0cml0dCIsICJiZXRyZXRlIiB9KSwgImJldHJpdHQiKTsKK30KKworc3RyaW5nIGxvbmcoKQoreworICBzdHJpbmcgZG9vcjsKKworICBkb29yID0gaGF1c3R1ZXI6OmxvbmcoKTsKKworICByZXR1cm4gUXVlcnlQcm9wKFBfTE9ORykrZG9vcjsKK30KKworc3RhdGljIGludCBiZXRyaXR0KHN0cmluZyBzdHIpCit7CisgIG5vdGlmeV9mYWlsKCJXYXMgbW9lY2h0ZXN0IER1IGJldHJldGVuP1xuIik7CisKKyAgaWYgKCFzdHIgfHwgIWlkKHN0cikpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKFF1ZXJ5KEhfRE9PUlNUQVQpICYgRF9DTE9TRUQpIHsKKyAgICBwcmludGYoIiVzIHZvbiAlcyBpc3QgenUuXG4iLCBjYXBpdGFsaXplKG5hbWUoV0VSLDEpKSwgY2FwaXRhbGl6ZShvd25lcikpOworICAgIHJldHVybiAxOworICB9CisKZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci90b29scy9oYXVzbWVpc3Rlci5jIGIvZC9zZWhlci9oYWV1c2VyL3Rvb2xzL2hhdXNtZWlzdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM5ZGUwZQotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci90b29scy9oYXVzbWVpc3Rlci5jCkBAIC0wLDAgKzEsMjQ3IEBACisjaW5jbHVkZSAiLi4vaGF1cy5oIgorCitpbmhlcml0ICJzdGQvdGhpbmciOworaW5oZXJpdCAiL3Avc2VydmljZS93YXJnb24vc20vc3RhdGVtYWNoaW5lIjsKKworI2luY2x1ZGUgIi9wL3NlcnZpY2Uvd2FyZ29uL3NtL3N0YXRlbWFjaGluZS5oIgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKworI2RlZmluZSBTVEFURV9JRExFICAgICAgIDAKKyNkZWZpbmUgU1RBVEVfR0VORVJBVElORyAxCisKKyNkZWZpbmUgU0lHX0lOSVQgICAgICAwCisjZGVmaW5lIFNJR19HRU5FUkFURSAgMQorI2RlZmluZSBTSUdfRE9ORSAgICAgIDIKKworcHJpdmF0ZSBzdHJpbmcgZHVtcChpbnQgaGF1cywgaW50IGZpbmFsKTsKK3ByaXZhdGUgdm9pZCBlbnRlckdlbmVyYXRpbmcoc3RyaW5nIG93LCBvYmplY3QgZW52LCBpbnQgbnIsIGludCBmaW4sIGludCBhbGwpOworcHJpdmF0ZSB2b2lkIGRvR2VuZXJhdGluZyhzdHJpbmcgb3csIG9iamVjdCBlbnYsIGludCBuciwgaW50IGZpbiwgaW50IGFsbCk7CisKK2NyZWF0ZSgpCit7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgIHRoaW5nOjpjcmVhdGUoKTsKKyAgc3RhdGVtYWNoaW5lOjpjcmVhdGUoKTsKKyAgCisgIFNldFByb3AoIFBfTkFNRSwgIkhhdXNtZWlzdGVyIik7CisgIFNldFByb3AoIFBfU0hPUlQsICJFaW4gSGF1c21laXN0ZXIiICk7CisgIFNldFByb3AoIFBfTE9ORywKKyAgICAgIkRpZXMgaXN0IGRlciBIYXVzbWVpc3RlciBhbGxlciBTZWhlcmhhZXVzZXIuIEVyIGhpbGZ0IFd1cnplbCBiZWkgZGVyXG4iCisgICAgKyJWZXJ3YWx0dW5nIGRlciBIYWV1c2VyLlxuIgorICAgICsiRGVyIEhhdXNtZWlzdGVyIGhhdCBlaW5lbiBibGF1ZW4gS2l0dGVsIGFuIHVuZCBlaW5lIEFicmlzc2Jpcm5lIGdlenVlY2t0LlxuIiApOworICBTZXRQcm9wKCBQX0dFTkRFUixNQUxFKTsKKyAgU2V0UHJvcCggUF9OT0dFVCwgMSk7CisKKyAgQWRkSWQoICJoYXVzbWVpc3RlciIgKTsKKworICBBZGRTdGF0ZShTVEFURV9JRExFLCAwLCAwKTsKKyAgQWRkU3RhdGUoU1RBVEVfR0VORVJBVElORywgIydkb0dlbmVyYXRpbmcsIDApOworCisgIEFkZFRyYW5zaXRpb24oU01fSU5WQUxJRCwgU0lHX0lOSVQsIFNUQVRFX0lETEUpOworICBBZGRUcmFuc2l0aW9uKFNUQVRFX0lETEUsIFNJR19HRU5FUkFURSwgU1RBVEVfR0VORVJBVElORywgIydlbnRlckdlbmVyYXRpbmcpOworICBBZGRUcmFuc2l0aW9uKFNUQVRFX0dFTkVSQVRJTkcsIFNJR19HRU5FUkFURSwgU1RBVEVfR0VORVJBVElORywgIydlbnRlckdlbmVyYXRpbmcpOworICBBZGRUcmFuc2l0aW9uKFNUQVRFX0dFTkVSQVRJTkcsIFNJR19ET05FLCBTVEFURV9JRExFKTsKKworICBTdGF0ZVRyYW5zaXRpb24oU0lHX0lOSVQpOworICAKKyAgQWRkQ21kKCAiZ2VuZXJpZXJlIiwgImdlbmVyaWVyZW4iICk7CisgIEFkZENtZCggKHsgInJlaXNzIiwgInJlaXNzZSIgfSksICJhYnJlaXNzZW4iICk7CisgIEFkZENtZCggInZlcmxlZ2UiLCAidmVybGVnZW4iICk7Cit9CisKK3N0YXRpYyBpbnQKK2Jld2VnZShtaXhlZCBkZXN0LCBpbnQgZmxhZ3MsIHN0cmluZyBtc2cxLCBzdHJpbmcgbXNnMikKK3sKKyAgaW50IHJldDsKKworICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSwgY2FwaXRhbGl6ZShuYW1lKFdFUikpKyIgIittc2cxKyIuXG4iKTsKKyAgaWYgKChyZXQgPSBtb3ZlKGRlc3QsIGZsYWdzKSkgPT0gMSkKKyAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSwgY2FwaXRhbGl6ZShuYW1lKFdFUikpKyIgIittc2cyKyIuXG4iKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdlbmVyaWVyZW4oc3RyaW5nIHN0cikKK3sKKyAgb2JqZWN0IGVudjsKKyAgaW50IG5yLCBmaW4sIGFsbDsKKyAgc3RyaW5nIG93LCAqcGFybTsKKworICBlbnYgPSBlbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKTsKKworICBub3RpZnlfZmFpbCggIlN5bnRheDogZ2VuZXJpZXJlIDxuYW1lPiBbPG5yPl0gW3NvZnQgfCBnYW56XVxuIiApOworCisgIGlmICghc3RyIHx8IHN0ciA9PSAiIikKKyAgICByZXR1cm4gMDsKKworICBwYXJtID0gb2xkX2V4cGxvZGUoc3RyLCAiICIpOworICBmaW4gPSAxOworCisgIHN3aXRjaCAoc2l6ZW9mKHBhcm0pKSB7CisgICAgY2FzZSAzOgorICAgICAgaWYgKHBhcm1bMl0gPT0gInNvZnQiKQorCWZpbiA9IDA7CisgICAgY2FzZSAyOgorICAgICAgaWYgKHBhcm1bMV0gPT0gInNvZnQiKQorCWZpbiA9IDA7CisgICAgICBlbHNlIGlmIChwYXJtWzFdID09ICJnYW56IikgeworCW93ID0gcGFybVswXTsKKwluciA9IChWRVJXQUxURVIpLT5IYXVzUHJvcChvdywgSFBfUk9PTVMpOworCXN0ciA9IG93KyJyYXVtIitucjsKKwlhbGwgPSAxOworCWJyZWFrOworICAgICAgfQorICAgICAgZWxzZSB7CisJbnIgPSB0b19pbnQocGFybVsxXSk7CisJc3RyID0gcGFybVswXSsicmF1bSIrcGFybVsxXTsKKwlvdyA9IHBhcm1bMF07CisJYnJlYWs7CisgICAgICB9CisgICAgY2FzZSAxOgorICAgICAgb3cgPSBwYXJtWzBdOworICAgICAgbnIgPSAtMTsKKyAgICAgIHN0ciA9IG93KyJoYXVzIjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoZmlsZV9zaXplKEhBVVNTQVZFUEFUSCtvdysiLm8iKTwwKSB7CisgICAgd3JpdGUoICJFcyBnaWJ0IGtlaW4gJyIrc3RyKyInIVxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgU3RhdGVUcmFuc2l0aW9uKFNJR19HRU5FUkFURSwgKHtvdywgZW52LCBuciwgZmluLCBhbGwgfSkgKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGVudGVyR2VuZXJhdGluZyhzdHJpbmcgb3csIG9iamVjdCBlbnYsIGludCBuciwgaW50IGZpbiwgaW50IGFsbCkKK3sKKyAgc3RyaW5nIHN0cjsKKyAgCisgIGlmIChuciA+PSAwKQorICAgIHN0ciA9IG93KyJyYXVtIitucjsKKyAgZWxzZQorICAgIHN0ciA9IG93KyJoYXVzIjsKKworICBiZXdlZ2UoUEFUSCtzdHIsIE1fTk9DSEVDSywgImdlaHQgenVyIEFyYmVpdCIsICJrb21tdCBhbiIpOworICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSwKKyAgICAgICAgICAgIE5hbWUoV0VSKSsiIHp1ZWNrdCBlaW5lbiBCbG9jaywgc2llaHQgc2ljaCBhbGxlcyBnZW5hdSBhbiB1bmQgbWFjaHRcbiIKKyAgICAgICAgICAgICsic2ljaCBoaW4gdW5kIHdpZWRlciBOb3RpemVuLiBEYW5uIG5pY2t0IGVyIHp1ZnJpZWRlbiB1bmQgc3RlY2t0IHNlaW5lblxuIgorICAgICAgICAgICAgIkJsb2NrIHdpZWRlciB3ZWcuXG4iICk7Cit9CisKK3N0YXRpYyB2b2lkIGRvR2VuZXJhdGluZyhzdHJpbmcgb3csIG9iamVjdCBlbnYsIGludCBuciwgaW50IGZpbiwgaW50IGFsbCkKK3sKKyAgb2JqZWN0IGdlbjsKKyAgc3RyaW5nIHN0ciwgb3V0OworCisgIGdlbiA9IGNsb25lX29iamVjdChQQVRIKyJ0b29scy9nZW5lcmF0b3IiKTsKKyAgb3V0ID0gZ2VuLT5kdW1wKGVudmlyb25tZW50KCksIGZpbiwgKHsgb3csIGVudiwgbnIsIGZpbiwgYWxsIH0pKTsKKyAgCisgIGlmIChuciA+PSAwKQorICAgIHN0ciA9IG93KyJyYXVtIitucjsKKyAgZWxzZQorICAgIHN0ciA9IG93KyJoYXVzIjsKKworICBiZXdlZ2UoZW52LCBNX05PQ0hFQ0ssICJnZWh0IHp1IHNlaW5lbSBBdWZ0cmFnZ2ViZXIgenVydWVjayIsICJrb21tdCBhbiIpOworICB3cml0ZSggIkRlciBIYXVzbWVpc3RlciBzYWd0OiBJY2ggaGFiZSAnIitzdHIrIicgaW4gZGllIERhdGVpXG4iCisJKyJEZXIgSGF1c21laXN0ZXIgc2FndDogJyIrb3V0KyInIGdlc2NocmllYmVuLCBDaGVmIVxuIik7Cit9CisKK3ZvaWQKK0dlbmVyYXRpb25Eb25lKHN0cmluZyBvdywgb2JqZWN0IGVudiwgaW50IG5yLCBpbnQgZmluLCBpbnQgYWxsKQoreworICBpZiAoYWxsKQorICB7CisgICAgaWYgKG5yID4gMCkKKyAgICB7CisgICAgICBjYWxsX291dCgiU3RhdGVUcmFuc2l0aW9uIiwgMSwKKyAgICAgICAgICAgICAgIFNJR19HRU5FUkFURSwgKHsgb3csIGVudiwgbnItMSwgZmluLCAxIH0pICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBjYWxsX291dCgiU3RhdGVUcmFuc2l0aW9uIiwgMSwKKyAgICAgICAgICAgICAgIFNJR19HRU5FUkFURSwgKHsgb3csIGVudiwgLTEsIGZpbiwgMCB9KSApOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBTdGF0ZVRyYW5zaXRpb24oU0lHX0RPTkUsICh7IG93LCBlbnYsIC0xLCBmaW4sIDAgfSkgKTsKKyAgfQorfQorCitzdGF0aWMgaW50IGFicmVpc3NlbihzdHJpbmcgc3RyKQoreworICBvYmplY3QgaGF1cywgZW52OworICBzdHJpbmcgaWNoLCBtc2c7CisKKyAgaWYgKCFzdHIgfHwgc3RyID09ICIiIHx8IHNzY2FuZihzdHIsICIlcyBhYiIsc3RyKSAhPSAxKSB7CisgICAgbm90aWZ5X2ZhaWwoICJTeW50YXg6IHJlaXNzZSA8bmFtZT4gYWJcbiIgKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBzdHIgPSBsb3dlcl9jYXNlKHN0cik7CisgIGlmICghKGhhdXMgPSBWRVJXQUxURVItPkZpbmRlSGF1cyhzdHIpKSkgeworICAgIHdyaXRlKCBjYXBpdGFsaXplKHN0cikrIiBoYXQga2VpbiBIYXVzIVxuIiApOworICAgIHJldHVybiAxOworICB9CisgIGljaCA9IGNhcGl0YWxpemUobmFtZShXRVIpKTsKKyAgZW52ID0gZW52aXJvbm1lbnQoKTsKKyAgYmV3ZWdlKGVudmlyb25tZW50KGhhdXMpLCBNX05PQ0hFQ0ssICJnZWh0IHp1ciBBcmJlaXQiLCAia29tbXQgYW4iKTsKKyAgbXNnID0gaGF1cy0+TmFtZShXRVIpOworCisgIGlmIChWRVJXQUxURVItPkxvZXNjaGVIYXVzKHN0cikgPT0gLTEpIHsKKyAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSwgaWNoKyIgdmVyc3VjaHQgdmVyZ2VibGljaCwgZWluIEhhdXMgYWJ6dXJlaXNzZW4uXG4iICk7CisgICAgbXNnID0gIkRlciBBYnJpc3N2ZXJzdWNoIGlzdCBmZWhsZ2VzY2hsYWdlbiwgQ2hlZiFcbiI7CisgIH0KKyAgZWxzZSB7CisgICAgdGVsbF9yb29tKGVudmlyb25tZW50KCksIGljaCsiIGJldGFldGlndCBlaW5lIFNpcmVuZS5cbiIrbXNnKyIgd2lyZCB2b24gIituYW1lKFdFTSkrIiBlaW5nZWVibmV0LlxuIik7CisgICAgbXNnID0gbXNnKyIgaXN0IGFiZ2VyaXNzZW4sIENoZWYhXG4iOworICAgIGlmIChoYXVzKSBoYXVzLT5yZW1vdmUoKTsKKyAgfQorICBiZXdlZ2UoZW52LCBNX05PQ0hFQ0ssICJnZWh0IHp1IHNlaW5lbSBBdWZ0cmFnZ2ViZXIgenVydWVjayIsICJrb21tdCBhbiIpOworICB3cml0ZSggIkRlciBIYXVzbWVpc3RlciBzYWd0OiAiK21zZyk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHZlcmxlZ2VuKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyBuYW1lLCB2b24sIG5hY2g7CisgIG9iamVjdCBoYXVzOworICBpbnQgcmV0OworCisgIGlmICghc3RyIHx8IHNzY2FuZihzdHIsICIlcyBuYWNoICVzIiwgbmFtZSwgbmFjaCkgIT0gMikgeworICAgIG5vdGlmeV9mYWlsKCAiU3ludGF4OiB2ZXJsZWdlIDxuYW1lPiBuYWNoIDx6aWVsPlxuIiApOworICAgIHJldHVybiAwOworICB9CisgIGlmIChuYWNoID09ICJoaWVyIikKKyAgICBuYWNoID0gb2JqZWN0X25hbWUoZW52aXJvbm1lbnQodGhpc19wbGF5ZXIoKSkpOworCisgIG5hbWUgPSBsb3dlcl9jYXNlKG5hbWUpOworCisgIGlmICghKGhhdXMgPSBWRVJXQUxURVItPkZpbmRlSGF1cyhuYW1lKSkpIHsKKyAgICB3cml0ZSggIkRlciBIYXVzbWVpc3RlciBzYWd0OiAiK2NhcGl0YWxpemUobmFtZSkrIiBoYXQga2VpbiBIYXVzIVxuIiApOworICAgIHJldHVybiAxOworICB9CisgIHZvbiA9IG9iamVjdF9uYW1lKGVudmlyb25tZW50KGhhdXMpKTsKKyAgcmV0ID0gVkVSV0FMVEVSLT5WZXJsZWdlSGF1cyhuYW1lLCB2b24sIG5hY2gpOworICB3cml0ZSggIkRlciBIYXVzbWVpc3RlciBzYWd0OiAiICk7CisgIHN3aXRjaChyZXQpIHsKKyAgICBjYXNlIC0xMTE6CisgICAgICB3cml0ZSggIkRhcyBoYXN0IER1IG5pY2h0IHp1IGJlc3RpbW1lbiFcbiIgKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgLTM6CisgICAgICB3cml0ZSggIkRlciBaaWVscmF1bSBsYWVzc3Qgc2ljaCBuaWNodCBsYWRlbiEgVmVybGVnZW4gYWJnZWJyb2NoZW4hXG4iICk7CisgICAgICBicmVhazsKKyAgICBjYXNlIC00OgorICAgICAgd3JpdGUoICJJbSBaaWVscmF1bSBrYW5uIG5pY2h0IGdlYmF1dCB3ZXJkZW4hXG4iICk7CisgICAgICBicmVhazsKKyAgICBjYXNlIC01OgorICAgICAgd3JpdGUoICJJbSBIYXVzIHZvbiAiK2NhcGl0YWxpemUobmFtZSkrIiBnaWJ0IGVzIG5vY2ggQXVzZ2FlbmdlIGluIGFuZGVyZSBIYWV1c2VyIVxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICB3cml0ZSggIk9LLCBDaGVmLCBpY2ggaGFiZSBkYXMgSGF1cyB2ZXJsZWd0IVxuIiApOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci90b29scy9oYXVzbWVpc3RlcjIuYyBiL2Qvc2VoZXIvaGFldXNlci90b29scy9oYXVzbWVpc3RlcjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWM1NDUwCi0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL3Rvb2xzL2hhdXNtZWlzdGVyMi5jCkBAIC0wLDAgKzEsNTM0IEBACisjaW5jbHVkZSAiLi4vaGF1cy5oIgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKworaW5oZXJpdCAic3RkL3RoaW5nIjsKKworc3RhdGljIHZvaWQgZG9fZ2VuKHN0cmluZyBvdywgb2JqZWN0IGVudiwgaW50IG5yLCBpbnQgZmluLCBpbnQgYWxsKTsKK3ByaXZhdGUgc3RyaW5nIHNwZWNpYWwoc3RyaW5nIHN0cik7Citwcml2YXRlIHN0cmluZyBkdW1wKGludCBoYXVzLCBpbnQgZmluYWwpOworcHJpdmF0ZSB2b2lkIGhlYWRlcihzdHJpbmcgZiwgaW50IGZpbmFsLCBvYmplY3QgaGF1cywgaW50IG5yKTsKK3ByaXZhdGUgdm9pZCB0cmFpbGVyKHN0cmluZyBmLCBpbnQgZmluYWwsIG9iamVjdCBoYXVzLCBpbnQgbnIpOworcHJpdmF0ZSB2b2lkIHNQcm9wKHN0cmluZyBmLCBzdHJpbmcgcE5hbWUsIHN0cmluZyBwU3RyKTsKK3ByaXZhdGUgdm9pZCBtUHJvcChzdHJpbmcgZiwgc3RyaW5nIHBOYW1lLCBtYXBwaW5nIHBNYXApOworcHJpdmF0ZSB2b2lkIGNQcm9wKHN0cmluZyBmLCBzdHJpbmcgcE5hbWUsIG1hcHBpbmcgY01hcCk7Citwcml2YXRlIHZvaWQgcHJldHR5U3RyaW5nKHN0cmluZyBmLCBzdHJpbmcgKnN0ciwgaW50IGluZGVudCk7Citwcml2YXRlIHZvaWQgcHJldHR5QXJyYXkoc3RyaW5nIGYsIHN0cmluZyAqYXJyLCBpbnQgc2VwKTsKKworY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgOjpjcmVhdGUoKTsKKworICBTZXRQcm9wKCBQX05BTUUsICJIYXVzbWVpc3RlciIpOworICBTZXRQcm9wKCBQX1NIT1JULCAiRWluIEhhdXNtZWlzdGVyIiApOworICBTZXRQcm9wKCBQX0xPTkcsCisgICAgICJEaWVzIGlzdCBkZXIgSGF1c21laXN0ZXIgYWxsZXIgU2VoZXJoYWV1c2VyLiBFciBoaWxmdCBXdXJ6ZWwgYmVpIGRlclxuIgorICAgICsiVmVyd2FsdHVuZyBkZXIgSGFldXNlci5cbiIKKyAgICArIkRlciBIYXVzbWVpc3RlciBoYXQgZWluZW4gYmxhdWVuIEtpdHRlbCBhbiB1bmQgZWluZSBBYnJpc3NiaXJuZSBnZXp1ZWNrdC5cbiIgKTsKKyAgU2V0UHJvcCggUF9HRU5ERVIsTUFMRSk7CisgIFNldFByb3AoIFBfTk9HRVQsIDEpOworCisgIEFkZElkKCAiaGF1c21laXN0ZXIiICk7CisKKyAgQWRkQ21kKCAiZ2VuZXJpZXJlIiwgImdlbmVyaWVyZW4iICk7CisgIEFkZENtZCggKHsgInJlaXNzIiwgInJlaXNzZSIgfSksICJhYnJlaXNzZW4iICk7CisgIEFkZENtZCggInZlcmxlZ2UiLCAidmVybGVnZW4iICk7Cit9CisKK3N0YXRpYyBpbnQKK2Jld2VnZShtaXhlZCBkZXN0LCBpbnQgZmxhZ3MsIHN0cmluZyBtc2cxLCBzdHJpbmcgbXNnMikKK3sKKyAgaW50IHJldDsKKworICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSwgY2FwaXRhbGl6ZShuYW1lKFdFUikpKyIgIittc2cxKyIuXG4iKTsKKyAgaWYgKChyZXQgPSBtb3ZlKGRlc3QsIGZsYWdzKSkgPT0gMSkKKyAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSwgY2FwaXRhbGl6ZShuYW1lKFdFUikpKyIgIittc2cyKyIuXG4iKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdlbmVyaWVyZW4oc3RyaW5nIHN0cikKK3sKKyAgb2JqZWN0IGVudjsKKyAgaW50IG5yLCBmaW4sIGFsbDsKKyAgc3RyaW5nIG93LCAqcGFybTsKKworICBlbnYgPSBlbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKTsKKworICBub3RpZnlfZmFpbCggIlN5bnRheDogZ2VuZXJpZXJlIDxuYW1lPiBbPG5yPl0gW3NvZnQgfCBnYW56XVxuIiApOworCisgIGlmICghc3RyIHx8IHN0ciA9PSAiIikKKyAgICByZXR1cm4gMDsKKworICBwYXJtID0gb2xkX2V4cGxvZGUoc3RyLCAiICIpOworICBmaW4gPSAxOworCisgIHN3aXRjaCAoc2l6ZW9mKHBhcm0pKSB7CisgICAgY2FzZSAzOgorICAgICAgaWYgKHBhcm1bMl0gPT0gInNvZnQiKQorCWZpbiA9IDA7CisgICAgY2FzZSAyOgorICAgICAgaWYgKHBhcm1bMV0gPT0gInNvZnQiKQorCWZpbiA9IDA7CisgICAgICBlbHNlIGlmIChwYXJtWzFdID09ICJnYW56IikgeworCW93ID0gcGFybVswXTsKKwluciA9IChWRVJXQUxURVIpLT5IYXVzUHJvcChvdywgSFBfUk9PTVMpOworCXN0ciA9IG93KyJyYXVtIitucjsKKwlhbGwgPSAxOworCWJyZWFrOworICAgICAgfQorICAgICAgZWxzZSB7CisJbnIgPSB0b19pbnQocGFybVsxXSk7CisJc3RyID0gcGFybVswXSsicmF1bSIrcGFybVsxXTsKKwlvdyA9IHBhcm1bMF07CisJYnJlYWs7CisgICAgICB9CisgICAgY2FzZSAxOgorICAgICAgb3cgPSBwYXJtWzBdOworICAgICAgbnIgPSAtMTsKKyAgICAgIHN0ciA9IG93KyJoYXVzIjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoZmlsZV9zaXplKEhBVVNTQVZFUEFUSCtvdysiLm8iKTwwKSB7CisgICAgaWYgKG5yID49IDAgJiYgZmlsZV9zaXplKEhBVVNTQVZFUEFUSCtvdytucisiLm8iKTwwKSB7CisgICAgICB3cml0ZSggIkVzIGdpYnQga2VpbiAnIitzdHIrIichXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorICBkb19nZW4ob3csIGVudiwgbnIsIGZpbiwgYWxsKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGRvX2dlbihzdHJpbmcgb3csIG9iamVjdCBlbnYsIGludCBuciwgaW50IGZpbiwgaW50IGFsbCkKK3sKKyAgc3RyaW5nIHN0ciwgb3V0OworCisgIGlmIChuciA+PSAwKQorICAgIHN0ciA9IG93KyJyYXVtIitucjsKKyAgZWxzZQorICAgIHN0ciA9IG93KyJoYXVzIjsKKworICBiZXdlZ2UoUEFUSCtzdHIsIE1fTk9DSEVDSywgImdlaHQgenVyIEFyYmVpdCIsICJrb21tdCBhbiIpOworICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSwgTmFtZShXRVIpKyIgenVlY2t0IGVpbmVuIEJsb2NrLCBzaWVodCBzaWNoIGFsbGVzIGdlbmF1IGFuIHVuZCBtYWNodFxuIgorICAgICsic2ljaCBoaW4gdW5kIHdpZWRlciBOb3RpemVuLiBEYW5uIG5pY2t0IGVyIHp1ZnJpZWRlbiB1bmQgc3RlY2t0IHNlaW5lblxuQmxvY2sgd2llZGVyIHdlZy5cbiIgKTsKKyAgb3V0ID0gZHVtcChuciwgZmluKTsKKyAgYmV3ZWdlKGVudiwgTV9OT0NIRUNLLCAiZ2VodCB6dSBzZWluZW0gQXVmdHJhZ2dlYmVyIHp1cnVlY2siLCAia29tbXQgYW4iKTsKKyAgd3JpdGUoICJEZXIgSGF1c21laXN0ZXIgc2FndDogSWNoIGhhYmUgJyIrc3RyKyInIGluIGRpZSBEYXRlaVxuIgorCSsiRGVyIEhhdXNtZWlzdGVyIHNhZ3Q6ICciK291dCsiJyBnZXNjaHJpZWJlbiwgQ2hlZiFcbiIpOworCisgIGlmIChhbGwpIHsKKyAgICBpZiAobnIgPiAwKQorICAgICAgY2FsbF9vdXQoImRvX2dlbiIsIDEsIG93LCBlbnYsIG5yLTEsIGZpbiwgYWxsKTsKKyAgICBlbHNlCisgICAgICBjYWxsX291dCgiZG9fZ2VuIiwgMSwgb3csIGVudiwgLTEsIGZpbik7CisgIH0KK30KKworc3RhdGljIGludCBhYnJlaXNzZW4oc3RyaW5nIHN0cikKK3sKKyAgb2JqZWN0IGhhdXMsIGVudjsKKyAgc3RyaW5nIGljaCwgbXNnOworCisgIGlmICghc3RyIHx8IHN0ciA9PSAiIiB8fCBzc2NhbmYoc3RyLCAiJXMgYWIiLHN0cikgIT0gMSkgeworICAgIG5vdGlmeV9mYWlsKCAiU3ludGF4OiByZWlzc2UgPG5hbWU+IGFiXG4iICk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgc3RyID0gbG93ZXJfY2FzZShzdHIpOworICBpZiAoIShoYXVzID0gVkVSV0FMVEVSLT5GaW5kZUhhdXMoc3RyKSkpIHsKKyAgICB3cml0ZSggY2FwaXRhbGl6ZShzdHIpKyIgaGF0IGtlaW4gSGF1cyFcbiIgKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpY2ggPSBjYXBpdGFsaXplKG5hbWUoV0VSKSk7CisgIGVudiA9IGVudmlyb25tZW50KCk7CisgIGJld2VnZShlbnZpcm9ubWVudChoYXVzKSwgTV9OT0NIRUNLLCAiZ2VodCB6dXIgQXJiZWl0IiwgImtvbW10IGFuIik7CisgIG1zZyA9IGhhdXMtPk5hbWUoV0VSKTsKKworICBpZiAoVkVSV0FMVEVSLT5Mb2VzY2hlSGF1cyhzdHIpID09IC0xKSB7CisgICAgdGVsbF9yb29tKGVudmlyb25tZW50KCksIGljaCsiIHZlcnN1Y2h0IHZlcmdlYmxpY2gsIGVpbiBIYXVzIGFienVyZWlzc2VuLlxuIiApOworICAgIG1zZyA9ICJEZXIgQWJyaXNzdmVyc3VjaCBpc3QgZmVobGdlc2NobGFnZW4sIENoZWYhXG4iOworICB9CisgIGVsc2UgeworICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudCgpLCBpY2grIiBiZXRhZXRpZ3QgZWluZSBTaXJlbmUuXG4iK21zZysiIHdpcmQgdm9uICIrbmFtZShXRU0pKyIgZWluZ2VlYm5ldC5cbiIpOworICAgIG1zZyA9IG1zZysiIGlzdCBhYmdlcmlzc2VuLCBDaGVmIVxuIjsKKyAgICBpZiAoaGF1cykgaGF1cy0+cmVtb3ZlKCk7CisgIH0KKyAgYmV3ZWdlKGVudiwgTV9OT0NIRUNLLCAiZ2VodCB6dSBzZWluZW0gQXVmdHJhZ2dlYmVyIHp1cnVlY2siLCAia29tbXQgYW4iKTsKKyAgd3JpdGUoICJEZXIgSGF1c21laXN0ZXIgc2FndDogIittc2cpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCB2ZXJsZWdlbihzdHJpbmcgc3RyKQoreworICBzdHJpbmcgbmFtZSwgdm9uLCBuYWNoOworICBvYmplY3QgaGF1czsKKyAgaW50IHJldDsKKworICBpZiAoIXN0ciB8fCBzc2NhbmYoc3RyLCAiJXMgbmFjaCAlcyIsIG5hbWUsIG5hY2gpICE9IDIpIHsKKyAgICBub3RpZnlfZmFpbCggIlN5bnRheDogdmVybGVnZSA8bmFtZT4gbmFjaCA8emllbD5cbiIgKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAobmFjaCA9PSAiaGllciIpCisgICAgbmFjaCA9IG9iamVjdF9uYW1lKGVudmlyb25tZW50KHRoaXNfcGxheWVyKCkpKTsKKworICBuYW1lID0gbG93ZXJfY2FzZShuYW1lKTsKKworICBpZiAoIShoYXVzID0gVkVSV0FMVEVSLT5GaW5kZUhhdXMobmFtZSkpKSB7CisgICAgd3JpdGUoICJEZXIgSGF1c21laXN0ZXIgc2FndDogIitjYXBpdGFsaXplKG5hbWUpKyIgaGF0IGtlaW4gSGF1cyFcbiIgKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICB2b24gPSBvYmplY3RfbmFtZShlbnZpcm9ubWVudChoYXVzKSk7CisgIHJldCA9IFZFUldBTFRFUi0+VmVybGVnZUhhdXMobmFtZSwgdm9uLCBuYWNoKTsKKyAgd3JpdGUoICJEZXIgSGF1c21laXN0ZXIgc2FndDogIiApOworICBzd2l0Y2gocmV0KSB7CisgICAgY2FzZSAtMTExOgorICAgICAgd3JpdGUoICJEYXMgaGFzdCBEdSBuaWNodCB6dSBiZXN0aW1tZW4hXG4iICk7CisgICAgICBicmVhazsKKyAgICBjYXNlIC0zOgorICAgICAgd3JpdGUoICJEZXIgWmllbHJhdW0gbGFlc3N0IHNpY2ggbmljaHQgbGFkZW4hIFZlcmxlZ2VuIGFiZ2Vicm9jaGVuIVxuIiApOworICAgICAgYnJlYWs7CisgICAgY2FzZSAtNDoKKyAgICAgIHdyaXRlKCAiSW0gWmllbHJhdW0ga2FubiBuaWNodCBnZWJhdXQgd2VyZGVuIVxuIiApOworICAgICAgYnJlYWs7CisgICAgY2FzZSAtNToKKyAgICAgIHdyaXRlKCAiSW0gSGF1cyB2b24gIitjYXBpdGFsaXplKG5hbWUpKyIgZ2lidCBlcyBub2NoIEF1c2dhZW5nZSBpbiBhbmRlcmUgSGFldXNlciFcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgd3JpdGUoICJPSywgQ2hlZiwgaWNoIGhhYmUgZGFzIEhhdXMgdmVybGVndCFcbiIgKTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiAxOworfQorCisvKioqIEZ1bmt0aW9uZW4genVtIEdlbmVyaWVyZW4gZWluZXIgRGF0ZWkgYXVzIGRlbiBQcm9wZXJ0aWVzIGRlcyBIYXVzZXMgKioqLworCisjZGVmaW5lIEVYSVRfVE1QTCAiXCIvcGxheWVycy8lcy9zZWhlcmhhdXMvJXNyYXVtJWRcIiIKKworcHJpdmF0ZSB2b2lkIGR1bXBfY2hlc3Qoc3RyaW5nIG91dCwgb2JqZWN0IGNoZXN0KQoreworICBtaXhlZCBuOworCisgIGNhdGNoKHJtKG91dCkpOworCisgIHdyaXRlX2ZpbGUob3V0LCAiI2luY2x1ZGUgPHByb3BlcnRpZXMuaD5cbiNpbmNsdWRlIDxtb3ZpbmcuaD5cblxuIgorCQkgICJpbmhlcml0IFwiL2Qvd3Vlc3RlL2R1cmlhbi9iZWhhZWx0ZXJcIjtcblxuIgorCQkgICJ2b2lkIGNyZWF0ZSgpXG57XG4gIGlmKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjtcblxuIgorCQkgICIgIDo6Y3JlYXRlKCk7XG5cbiIgKTsKKyAgc1Byb3Aob3V0LCAiUF9TSE9SVCIsIGNoZXN0LT5RdWVyeVByb3AoUF9TSE9SVCkpOworICBzUHJvcChvdXQsICJQX0xPTkciLCAgY2hlc3QtPlF1ZXJ5UHJvcChQX0xPTkcpKTsKKworICB3cml0ZV9maWxlKG91dCwgIiAgU2V0UHJvcChQX05PR0VULCAxKTtcbiIpOworICB3cml0ZV9maWxlKG91dCwgIiAgU2V0UHJvcChQX0dFTkRFUiwgIisKKwkJICAgICh7Ik5FVVRFUiIsIk1BTEUiLCJGRU1BTEUifSlbY2hlc3QtPlF1ZXJ5UHJvcChQX0dFTkRFUildKworCQkgICAgIiApO1xuICBTZXRQcm9wKFBfTkFNRSwgIik7CisKKyAgbiA9IGNoZXN0LT5RdWVyeVByb3AoUF9OQU1FKTsKKyAgaWYgKHN0cmluZ3AobikpCisgICAgd3JpdGVfZmlsZShvdXQsICJcIiIrbisiXCIiKTsKKyAgZWxzZQorICAgIHByZXR0eUFycmF5KG91dCwgbiwgMCk7CisgIHdyaXRlX2ZpbGUob3V0LCAiICk7XG5cbiAgQWRkSWQoICIpOworICBwcmV0dHlBcnJheShvdXQsIGNoZXN0LT5RdWVyeVByb3AoUF9JRFMpLSh7IFRSVUhFIH0pLCAwKTsKKyAgd3JpdGVfZmlsZShvdXQsICIgKTtcbiIpOworCisgIGlmICgobj1jaGVzdC0+UXVlcnlQcm9wKFBfQURKRUNUSVZFUykpICYmIHNpemVvZihuKSkgeworICAgIHdyaXRlX2ZpbGUob3V0LCAiXG4gIEFkZEFkamVjdGl2ZSggIik7CisgICAgcHJldHR5QXJyYXkob3V0LCBuLCAwKTsKKyAgICB3cml0ZV9maWxlKG91dCwgIiApO1xuIik7CisgIH0KKyAgaWYgKChuPWNoZXN0LT5RdWVyeVByb3AoUF9OQU1FX0FESikpICYmIHNpemVvZihuKSkgeworICAgIHdyaXRlX2ZpbGUob3V0LCAiXG4gIFNldFByb3AoUF9OQU1FX0FESiwgIik7CisgICAgcHJldHR5QXJyYXkob3V0LCBuLCAwKTsKKyAgICB3cml0ZV9maWxlKG91dCwgIiApO1xuIik7CisgIH0KKyAgd3JpdGVfZmlsZShvdXQsICJ9XG4iKTsKK30KKworcHJpdmF0ZSBzdHJpbmcgZHVtcChpbnQgbnIsIGludCBmaW5hbCkKK3sKKyAgc3RyaW5nIG91dDsKKyAgb2JqZWN0IGVudjsKKyAgbWFwcGluZyBwcm9wOworCisgIGVudiA9IGVudmlyb25tZW50KHRoaXNfb2JqZWN0KCkpOworCisgIGlmIChmaW5hbCAmJiBlbnYtPlF1ZXJ5UHJvcChIX0NIRVNUKSkKKyAgICBkdW1wX2NoZXN0KFBBVEgrInJlcC8iK2Vudi0+UXVlcnlPd25lcigpKyJ0cnVoZS5jIiwgcHJlc2VudChUUlVIRSwgZW52KSk7CisKKyAgaWYgKGZpbmFsKSB7CisgICAgb3V0ID0gUEFUSCsicmVwLyIrZW52LT5RdWVyeU93bmVyKCk7CisgICAgaWYgKG5yIDwgMCkKKyAgICAgIG91dCArPSAiaGF1cy5jIjsKKyAgICBlbHNlCisgICAgICBvdXQgKz0gInJhdW0iK25yKyIuYyI7CisgIH0KKyAgZWxzZQorICAgIG91dCA9IFBBVEgrImZpeGVkLmMiOworCisgIGNhdGNoKHJtKG91dCkpOworCisgIGhlYWRlcihvdXQsIGZpbmFsLCBlbnYsIG5yKTsKKyAgaWYgKG5yPDApIHsKKyAgICBzUHJvcChvdXQsICJQX1NIT1JUIiwgZW52LT5RdWVyeVByb3AoUF9TSE9SVCkpOworICAgIHdyaXRlX2ZpbGUob3V0LCAiXG4iKTsKKyAgICBzUHJvcChvdXQsICJQX0xPTkciLCBlbnYtPlF1ZXJ5UHJvcChQX0xPTkcpKTsKKyAgICB3cml0ZV9maWxlKG91dCwgIlxuIik7CisKKyAgICBpZiAoZmluYWwpIHsKKyAgICAgIG1peGVkIG47CisKKyAgICAgIHdyaXRlX2ZpbGUob3V0LCAiICBTZXRQcm9wKFBfTk9HRVQsIDEpO1xuIik7CisgICAgICB3cml0ZV9maWxlKG91dCwgIiAgU2V0UHJvcChQX0dFTkRFUiwgIisKKwkJICAgICAgKHsiTkVVVEVSIiwiTUFMRSIsIkZFTUFMRSJ9KVtlbnYtPlF1ZXJ5UHJvcChQX0dFTkRFUildKworCQkgICAgICAiICk7XG4gIFNldFByb3AoUF9OQU1FLCAiKTsKKyAgICAgIG4gPSBlbnYtPlF1ZXJ5UHJvcChQX05BTUUpOworICAgICAgaWYgKHN0cmluZ3AobikpCisJd3JpdGVfZmlsZShvdXQsICJcIiIrbisiXCIiKTsKKyAgICAgIGVsc2UKKwlwcmV0dHlBcnJheShvdXQsIG4sIDApOworICAgICAgd3JpdGVfZmlsZShvdXQsICIgKTtcblxuICBBZGRJZCggIik7CisgICAgICBwcmV0dHlBcnJheShvdXQsIGVudi0+UXVlcnlQcm9wKFBfSURTKS0oeyAic2VoZVxyaGF1cyIsICJcbiIrZW52LT5RdWVyeU93bmVyKCkrImhhdXMiIH0pLCAwKTsKKyAgICAgIHdyaXRlX2ZpbGUob3V0LCAiICk7XG4iKTsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgc1Byb3Aob3V0LCAiUF9JTlRfU0hPUlQiLCBlbnYtPlF1ZXJ5UHJvcChQX0lOVF9TSE9SVCkpOworICAgIHdyaXRlX2ZpbGUob3V0LCAiXG4iKTsKKyAgICBzUHJvcChvdXQsICJQX0lOVF9MT05HIiwgZW52LT5RdWVyeVByb3AoUF9JTlRfTE9ORykpOworICAgIHdyaXRlX2ZpbGUob3V0LCAiXG4iKTsKKyAgICBpZiAoc2l6ZW9mKHByb3AgPSBlbnYtPlF1ZXJ5UHJvcChQX0RFVEFJTFMpKSkgeworICAgICAgbVByb3Aob3V0LCAiQWRkRGV0YWlsIiwgcHJvcCk7CisgICAgICB3cml0ZV9maWxlKG91dCwgIlxuIik7CisgICAgfQorICAgIGlmIChzaXplb2YocHJvcCA9IGVudi0+UXVlcnlQcm9wKFBfUkVBRF9ERVRBSUxTKSkpIHsKKyAgICAgIG1Qcm9wKG91dCwgIkFkZFJlYWREZXRhaWwiLCBwcm9wKTsKKyAgICAgIHdyaXRlX2ZpbGUob3V0LCAiXG4iKTsKKyAgICB9CisgICAgaWYgKHNpemVvZihwcm9wID0gZW52LT5RdWVyeVByb3AoSF9DT01NQU5EUykpKQorICAgICAgY1Byb3Aob3V0LCAiQWRkVXNlckNtZCIsIHByb3ApOworCisgICAgd3JpdGVfZmlsZShvdXQsICJcbiIpOworICAgIGlmIChmaW5hbCkgeworICAgICAgc3RyaW5nICprLCBvOworICAgICAgaW50IGksIG51bTsKKworICAgICAgcHJvcCA9IGVudi0+UXVlcnlQcm9wKFBfRVhJVFMpOworICAgICAgayA9IG1faW5kaWNlcyhwcm9wKTsKKyAgICAgIGlmIChtZW1iZXIoaywgInJhdXMiKSA+PSAwKSB7CisJayAtPSAoeyAicmF1cyIgfSk7CisJd3JpdGVfZmlsZShvdXQsIHNwcmludGYoIiAgQWRkRXhpdCggXCJyYXVzXCIsIFwiJXNcIik7XG4iLCBwcm9wWyJyYXVzIl0pKTsKKyAgICAgIH0KKyAgICAgIGZvciAoaT1zaXplb2YoayktMTsgaT49MDsgaS0tKSB7CisJaWYgKHNzY2FuZihwcm9wW2tbaV1dLCBQQVRIKyIlc3JhdW0lZCIsIG8sIG51bSkgIT0gMikKKwkgIHByaW50ZigiS29taXNjaGVyIEV4aXQgKCVPKVxuJXMgLT4gJXNcbiIsIGVudiwga1tpXSwgcHJvcFtrW2ldXSk7CisJZWxzZSB7CisJICBpZiAobyA9PSBlbnYtPlF1ZXJ5T3duZXIoKSkgeworCSAgICBvID0gc3ByaW50ZihFWElUX1RNUEwsIG8sIG8sIG51bSk7CisJICAgIHdyaXRlX2ZpbGUob3V0LCBzcHJpbnRmKCIgIEFkZEV4aXQoIFwiJXNcIiwgJXMpO1xuIiwga1tpXSwgbykpOworCSAgfQorCSAgZWxzZSB7CisJICAgIHdyaXRlX2ZpbGUob3V0LCBzcHJpbnRmKCIgIEFkZEV4aXQoIFwiJXNcIiwgXCIlc1wiKTtcbiIsIGtbaV0sIHByb3Bba1tpXV0pKTsKKwkgICAgcHJpbnRmKCJFeGl0IHZvbiAlTyBuYWNoICVzIVxuIiwgZW52LCBwcm9wW2tbaV1dKTsKKwkgIH0KKwl9CisgICAgICB9CisgICAgfQorICB9CisgIHRyYWlsZXIob3V0LCBmaW5hbCwgZW52LCBucik7CisKKyAgcmV0dXJuIG91dDsKK30KKworcHJpdmF0ZSB2b2lkIGhlYWRlcihzdHJpbmcgZiwgaW50IGZpbmFsLCBvYmplY3QgaGF1cywgaW50IG5yKQoreworICBpZiAoZmluYWwpIHsKKyAgICB3cml0ZV9maWxlKGYsICIjaW5jbHVkZSA8cHJvcGVydGllcy5oPiIgKTsKKyAgICBpZiAobnIgPj0gMCkgeworICAgICAgd3JpdGVfZmlsZShmLCAiXG5cbmluaGVyaXQgXCJzdGQvcm9vbVwiO1xuaW5oZXJpdCBcIiIrUEFUSCsibW9kdWxlcy91c2VyY21kXCI7Iik7CisgICAgICB3cml0ZV9maWxlKGYsICJcblxuY3JlYXRlKClcbntcbiAgcm9vbTo6Y3JlYXRlKCk7XG4gIHVzZXJjbWQ6OmNyZWF0ZSgpO1xuXG4iKTsKKyAgICAgIHdyaXRlX2ZpbGUoZiwgIiAgU2V0UHJvcChQX0xJR0hULCAxKTtcbiAgU2V0UHJvcChQX0lORE9PUlMsIDEpO1xuXG4iKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICB3cml0ZV9maWxlKGYsICJcbiNpbmNsdWRlIDxtb3ZpbmcuaD5cbiNpbmNsdWRlIFwiIitQQVRIKyJoYXVzLmhcIlxuXG4iICk7CisgICAgICB3cml0ZV9maWxlKGYsICJpbmhlcml0IFwic3RkL3RoaW5nXCI7XG5pbmhlcml0IEhBVVNUVUVSO1xuXG4iICk7CisgICAgICB3cml0ZV9maWxlKGYsICJjcmVhdGUoKVxue1xuICB0aGluZzo6Y3JlYXRlKCk7XG4gIGhhdXN0dWVyOjpjcmVhdGUoKTtcblxuIik7CisgICAgfQorICB9CisgIGVsc2UgeworICAgIHdyaXRlX2ZpbGUoZiwgIiNpbmNsdWRlIFwiaGF1cy5oXCJcbiNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+XG5cbmluaGVyaXQgIik7CisgICAgd3JpdGVfZmlsZShmLCAoKG5yIDwgMCkgPyAiSEFVUyIgOiAiUkFVTSIgKSApOworICAgIHdyaXRlX2ZpbGUoZiwgIjtcbmluaGVyaXQgXCIvc3RkL3RoaW5nL21vdmluZ1wiO1xuXG4iKTsKKyAgICB3cml0ZV9maWxlKGYsICJjcmVhdGUoKVxue1xuICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuO1xuICA6OmNyZWF0ZSgpO1xuXG4iKTsKKyAgICB3cml0ZV9maWxlKGYsICIgIFNldE93bmVyKFwiIitoYXVzLT5RdWVyeU93bmVyKCkrIlwiIik7CisgICAgaWYgKG5yID49IDApCisgICAgICB3cml0ZV9maWxlKGYsICIsICIrbnIpOworICAgIHdyaXRlX2ZpbGUoZiwgIik7XG4gIExvYWQoKTtcblxuIik7CisgICAgaWYgKG5yID49IDApCisgICAgICB3cml0ZV9maWxlKGYsICIgIFNldFByb3AoUF9ERVRBSUxTLCAoW10pKTtcbiAgU2V0UHJvcChQX1JFQURfREVUQUlMUywgKFtdKSk7XG5cbiIpOworICB9Cit9CisKK3ByaXZhdGUgdm9pZCB0cmFpbGVyKHN0cmluZyBmLCBpbnQgZmluYWwsIG9iamVjdCBoYXVzLCBpbnQgbnIpCit7CisgIGlmIChmaW5hbCkgeworICAgIGlmIChuciA+PSAwKQorICAgICAgd3JpdGVfZmlsZShmLCAifVxuIik7CisgICAgZWxzZSB7CisgICAgICB3cml0ZV9maWxlKGYsIHJlYWRfZmlsZShQQVRIKyJ0b29scy9oYXVzLmFweCIpKTsKKyAgICAgIHdyaXRlX2ZpbGUoZiwgIiAgdGhpc19wbGF5ZXIoKS0+bW92ZSgiKTsKKyAgICAgIHdyaXRlX2ZpbGUoZiwgc3ByaW50ZihFWElUX1RNUEwsIGhhdXMtPlF1ZXJ5T3duZXIoKSwgaGF1cy0+UXVlcnlPd25lcigpLCAwKSk7CisgICAgICB3cml0ZV9maWxlKGYsICIsXG5cdFx0XHRNX0dPLCAwLCBcImJldHJpdHQgXCIrbmFtZShXRU4sMSksIFwia29tbXQgaGVyZWluXCIpO1xuIgorCQkgICAgIiAgcmV0dXJuIDE7XG59XG4iKTsKKyAgICAgIGlmICghaGF1cy0+UXVlcnlQcm9wKFBfU0hPUlQpKQorCXdyaXRlX2ZpbGUoZiwgIlxuc3RyaW5nIHNob3J0KClcbntcbiAgc3RyaW5nIHJldDtcblxuIgorCQkgICAgICAiICByZXQgPSA6OnNob3J0KCk7XG4iCisJCSAgICAgICIgIGlmIChwcmV2aW91c19vYmplY3QoKSAhPSBlbnZpcm9ubWVudCgpICYmICFyZXQpXG4iCisJCSAgICAgICIgICAgcmV0ID1cIlwiO1xuXG4gIHJldHVybiByZXQ7XG59XG4iKTsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgd3JpdGVfZmlsZShmLCAiICBTYXZlKDEpO1xuXG4iKTsKKyAgICB3cml0ZV9maWxlKGYsICIgIHsgb2JqZWN0IHJhdW07XG4gICAgaWYgKHJhdW0gPSBmaW5kX29iamVjdCgiKTsKKyAgICBpZiAobnIgPj0gMCkKKyAgICAgIHdyaXRlX2ZpbGUoZiwgIlJBVU1OQU1FKFwiIitoYXVzLT5RdWVyeU93bmVyKCkrIlwiLCAiK25yKyIpKSlcbiIpOworICAgIGVsc2UKKyAgICAgIHdyaXRlX2ZpbGUoZiwgIkhBVVNOQU1FKFwiIitoYXVzLT5RdWVyeU93bmVyKCkrIlwiKSkpXG4iKTsKKyAgICB3cml0ZV9maWxlKGYsICIgICAgICByYXVtLT5Mb2FkKCk7XG4gIH1cblxuICBjYWxsX291dChcInJlbW92ZVwiLDApO1xufVxuIik7CisgIH0KK30KKworcHJpdmF0ZSBzdHJpbmcgc3BlY2lhbChzdHJpbmcgcykKK3sKKyAgcyA9IGltcGxvZGUoZXhwbG9kZShzLCAiXFwiKSwgIlxcXFwiKTsKKyAgcyA9IGltcGxvZGUoZXhwbG9kZShzLCAiXHQiKSwgIlxcdCIpOworICBzID0gaW1wbG9kZShleHBsb2RlKHMsICJcIiIpLCAiXFxcIiIpOworCisgIHJldHVybiBzOworfQorCitwcml2YXRlIHZvaWQgc1Byb3Aoc3RyaW5nIGYsIHN0cmluZyBwTmFtZSwgc3RyaW5nIHBTdHIpCit7CisgIHN0cmluZyAqc3RyOworICB3cml0ZV9maWxlKGYsICIgIFNldFByb3AoICIrcE5hbWUrIiwiKTsKKyAgaWYgKCFwU3RyKSB7CisgICAgd3JpdGVfZmlsZShmLCAiMCApO1xuIik7CisgICAgcmV0dXJuOworICB9CisgIHBTdHIgPSBzcGVjaWFsKHBTdHIpOworICBpZiAoc2l6ZW9mKHN0cj1vbGRfZXhwbG9kZShwU3RyLCJcbiIpKSA+IDEpCisgICAgcHJldHR5U3RyaW5nKGYsIHN0ciwgNCk7CisgIGVsc2UgeworICAgIGlmIChzaXplb2Yoc3RyKT09MCkKKyAgICAgIHN0ciA9ICh7IiJ9KTsKKyAgICB3cml0ZV9maWxlKGYsICJcbiAgICAgXCIiK3N0clswXSk7CisgICAgaWYgKHBTdHJbPDFdID09ICdcbicpCisgICAgICB3cml0ZV9maWxlKGYsICJcXG5cIiIpOworICAgIGVsc2UKKyAgICAgIHdyaXRlX2ZpbGUoZiwgIlwiIik7CisgIH0KKyAgd3JpdGVfZmlsZShmLCAiICk7XG4iKTsKK30KKworcHJpdmF0ZSB2b2lkIG1Qcm9wKHN0cmluZyBmLCBzdHJpbmcgcE5hbWUsIG1hcHBpbmcgcE1hcCkKK3sKKyAgc3RyaW5nICplcSwgdDE7CisgIG1peGVkIGNtZDsKKyAgaW50IGksajsKKworICBpZiAoc2l6ZW9mKHBNYXApID09IDApCisgICAgcmV0dXJuOworCisgIGNtZCA9IFZFUldBTFRFUi0+UENydW5jaChwTWFwKTsKKworICBmb3IgKGk9c2l6ZW9mKGNtZCktMTsgaT49MDsgaS0tKSB7CisgICAgd3JpdGVfZmlsZShmLCAiICAiK3BOYW1lKyIoXG4gICAgIik7CisgICAgZXEgPSBjbWRbaV1bMF07CisgICAgdDEgPSBjbWRbaV1bMV07CisKKyAgICBwcmV0dHlBcnJheShmLCBlcSwgMCk7CisgICAgd3JpdGVfZmlsZShmLCAiLCAiKTsKKworICAgIHByZXR0eVN0cmluZyhmLCBvbGRfZXhwbG9kZShzcGVjaWFsKHQxKSwgIlxuIiksIDYpOworICAgIHdyaXRlX2ZpbGUoZiwgIiApO1xuIik7CisgIH0KK30KKworcHJpdmF0ZSB2b2lkIGNQcm9wKHN0cmluZyBmLCBzdHJpbmcgcE5hbWUsIG1hcHBpbmcgY01hcCkKK3sKKyAgc3RyaW5nIHQxLCB0MjsKKyAgbWl4ZWQgY21kLCBlcTsKKyAgaW50IGksajsKKworICBjbWQgPSBWRVJXQUxURVItPlBDcnVuY2goY01hcCk7CisKKyAgZm9yKCBpPXNpemVvZihjbWQpLTE7IGk+PTA7IGktLSkgeworICAgIHdyaXRlX2ZpbGUoZiwgIiAgIitwTmFtZSsiKFxuICAgICIpOworICAgIGVxID0gY21kW2ldWzBdOworICAgIHQxID0gY21kW2ldWzFdOworICAgIHQyID0gY21kW2ldWzJdOworCisgICAgcHJldHR5QXJyYXkoZiwgZXEsIDEpOworICAgIHdyaXRlX2ZpbGUoZiwgIiwgMCwgIik7CisKKyAgICBwcmV0dHlTdHJpbmcoZiwgb2xkX2V4cGxvZGUoc3BlY2lhbCh0MSksICJcbiIpLCA0KTsKKyAgICB3cml0ZV9maWxlKGYsICIsICIpOworICAgIGlmICh0MikKKyAgICAgIHByZXR0eVN0cmluZyhmLCBvbGRfZXhwbG9kZShzcGVjaWFsKHQyKSwgIlxuIiksIDQpOworICAgIGVsc2UKKyAgICAgIHdyaXRlX2ZpbGUoZiwgIjAiKTsKKyAgICB3cml0ZV9maWxlKGYsICIgKTtcbiIpOworICB9Cit9CisKK3ByaXZhdGUgdm9pZCBwcmV0dHlTdHJpbmcoc3RyaW5nIGYsIHN0cmluZyAqc3RyLCBpbnQgaW5kZW50KQoreworICBzdHJpbmcgaW5kOworICBpbnQgaTsKKworICBpbmQgPSBleHRyYWN0KCJcbiAgICAgICAgICAiLDAsaW5kZW50KTsKKworICBpZiAoIXNpemVvZihzdHIpKSB7CisgICAgd3JpdGVfZmlsZShmLCBpbmQrIiBcIlxcblwiIik7CisgICAgcmV0dXJuOworICB9CisgIHdyaXRlX2ZpbGUoZiwgaW5kKyIgXCIiK3N0clswXSsiXFxuXCIiKTsKKyAgZm9yIChpPTE7IGk8c2l6ZW9mKHN0cik7IGkrKykgeworICAgIHdyaXRlX2ZpbGUoZiwgaW5kKyIrXCIiK3N0cltpXSsiXFxuXCIiKTsKKyAgfQorfQorCitwcml2YXRlIHZvaWQgcHJldHR5QXJyYXkoc3RyaW5nIGYsIHN0cmluZyAqYXJyLCBpbnQgc2VwKQoreworICBpbnQgaSxqOworICBzdHJpbmcgcmVzLCB0MSwgdDI7CisKKyAgd3JpdGVfZmlsZShmLCAiKHsiKTsKKworICBpZiAoc2l6ZW9mKGFycikpIHsKKyAgICB0MSA9ICgiXCIiK2FyclswXSsiXCIiKTsKKyAgICByZXMgPSAiICIrdDE7CisgICAgdDIgPSAiIjsKKworICAgIGZvciAoaT0xLCBqPXNpemVvZihhcnIpOyBpPGo7IGkrKykgeworICAgICAgdDIgPSAiXCIiK2FycltpXSsiXCIiOworICAgICAgaWYgKCFzZXApIHsKKwlpZiAoKHNpemVvZih0MSkrc2l6ZW9mKHQyKSk+NjkpIHsKKwkgIHJlcyArPSAoIixcbiAgICAgICAiK3QyKTsKKwkgIHQxID0gdDI7CisJICB0MiA9ICIiOworCX0KKwllbHNlIHsKKwkgIHQxICs9ICgiLCAiK3QyKTsKKwkgIHJlcyArPSAoIiwgIit0Mik7CisJfQorICAgICAgfQorICAgICAgZWxzZSB7CisJcmVzICs9ICgiLFxuICAgICAgICIrdDIpOworICAgICAgfQorICAgIH0KKyAgfQorICB3cml0ZV9maWxlKGYsIHJlcyArICIgfSkiICk7Cit9CisKZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci90b29scy9oYXVzdG9vbC5jIGIvZC9zZWhlci9oYWV1c2VyL3Rvb2xzL2hhdXN0b29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBmNmUxZQotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci90b29scy9oYXVzdG9vbC5jCkBAIC0wLDAgKzEsMTgyIEBACisjaW5jbHVkZSAiLi4vaGF1cy5oIgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKworaW5oZXJpdCAic3RkL3NlY3VyZV90aGluZyI7CisKK3ByaXZhdGUgaW50IHNlY3VyZSgpCit7CisgIHJldHVybiAodGhpc19pbnRlcmFjdGl2ZSgpICYmIChJU19BUkNIKHRoaXNfaW50ZXJhY3RpdmUoKSkgfHwKKwkJCQkgZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSkgPT0gInd1cnplbCIpKTsKK30KKworY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgOjpjcmVhdGUoKTsKKworICBTZXRQcm9wKFBfU0hPUlQsICJFaW4gQWRyZXNzdmVyemVpY2huaXMiICk7CisgIFNldFByb3AoUF9MT05HLAorICAgICAiTWl0IGRpZXNlbSBBZHJlc3N2ZXJ6ZWljaG5pcyBrb2VubmVuIGRpZSByaWNodGlnZW4gTGV1dGUgT3JkbnVuZyBpbiBkZW5cbiIKKyAgICArIld1c3QgZGVyIFNlaGVyaGF1c2FuZ2VsZWdlbmhlaXRlbiBicmluZ2VuLlxuIgorICAgICsiRGllIHJpY2h0aWdlbiBMZXV0ZT9cbiIKKyAgICArIkphOiBNYW4gbXVzcyBzY2hvbiBFcnptYWdpZXIgc2VpbiBvZGVyIFd1cnplbCBoZWlzc2VuISA7KVxuIgorICAgICsiRHUga2FubnN0IGVzIHVlYnJpZ2VucyBsZXNlbiFcbiIgKTsKKyAgU2V0UHJvcChQX05BTUUsICJBZHJlc3N2ZXJ6ZWljaG5pcyIpOworICBTZXRQcm9wKFBfUkVBRF9NU0csCisgICAgICJFcyBzdGVoZW4gZm9sZ2VuZGUgQmVmZWhsZSB6dXIgVmVyZnVlZ3VuZzpcbiIKKyAgICArImNoZWNrZWQgPG5hbWU+IFsrLy1dIDxucj5cbiIKKyAgICArInJlcFxuIgorICAgICsibWttYWlsIDxuYW1lPlxuIgorICAgICk7CisgIFNldFByb3AoUF9HRU5ERVIsIE5FVVRFUik7CisgIFNldFByb3AoUF9XRUlHSFQsIDEwMCk7CisgIFNldFByb3AoUF9BVVRPTE9BRE9CSiwgMSk7CisgIFNldFByb3AoUF9ORVZFUkRST1AsIDEpOworICBTZXRQcm9wKFBfTk9EUk9QLCAxKTsKKworICBBZGRJZCggKHsgInZlcnplaWNobmlzIiwgImFkcmVzc3ZlcnplaWNobmlzIiwgImhhdXN0b29sIiB9KSApOworCisgIEFkZENtZCgiY2hlY2tlZCIsICJjaGVja2VkIik7CisgIEFkZENtZCgicmVwIiwgInJlcG9ydCIpOworICBBZGRDbWQoIm1rbWFpbCIsICJta21haWwiKTsKK30KKworI2RlZmluZSBDSEVDS0VEIFBBVEgrImxvZy9DSEVDS0VEIgorc3RhdGljIGludAorY2hlY2tlZChzdHJpbmcgc3RyKQoreworICBtYXBwaW5nIGRyaW47CisgIHN0cmluZyBuYW1lLCAqbGluZXMsICppbmQsIHBtOworICBpbnQgbnIsIGk7CisgIGNsb3N1cmUgaHA7CisKKyAgaWYgKCFzZWN1cmUoKSkKKyAgICByZXR1cm4gMDsKKworICBub3RpZnlfZmFpbCgiU3ludGF4OiBjaGVja2VkIDxuYW1lPiBbKy8tXSA8bnI+XG4iICk7CisgIGlmICghc3RyIHx8IHN0ciA9PSAiIikKKyAgICByZXR1cm4gMDsKKworICBpZiAoZmlsZV9zaXplKENIRUNLRUQpID4gMCkKKyAgICBsaW5lcyA9IGV4cGxvZGUocmVhZF9maWxlKENIRUNLRUQpLCAiXG4iKSAtICh7IiJ9KTsKKyAgZWxzZQorICAgIGxpbmVzID0gKHt9KTsKKworICBmb3IgKGRyaW4gPSAoW10pLCBpPXNpemVvZihsaW5lcyktMTsgaT49MDsgaS0tKSB7CisgICAgaWYgKHNzY2FuZihsaW5lc1tpXSwgIiVzJXQlZCIsIG5hbWUsIG5yKSA9PSAyKQorICAgICAgZHJpbiArPSAoWyBuYW1lIDogbnItMSBdKTsKKyAgfQorICBsaW5lcyA9ICh7IH0pOworICBwbSA9ICIiOworICBocCA9IHN5bWJvbF9mdW5jdGlvbigiSGF1c1Byb3AiLCBWRVJXQUxURVIpOworCisgIGlmIChzc2NhbmYoc3RyLCAiJXMgJWQiLCBuYW1lLCBucik9PTIgfHwgc3NjYW5mKHN0ciwgIiVzICVzICVkIiwgbmFtZSwgcG0sIG5yKSA9PSAzKSB7CisgICAgaWYgKCFmdW5jYWxsKGhwLCBuYW1lLCBIUF9FTlYpKSB7CisgICAgICB3cml0ZShjYXBpdGFsaXplKG5hbWUpKyIgaGF0IGdhciBrZWluIEhhdXMhXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAobnIgPCAwKSB7CisgICAgICB3cml0ZSgiWnVtIEFiemllaGVuIG5pbW0gYml0dGUgJ2NoZWNrZWQgPG5hbWU+IC0gPG5yPichXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAobWVtYmVyKGRyaW4sIG5hbWUpKQorICAgICAgaSA9IGRyaW5bbmFtZV07CisgICAgc3dpdGNoKHBtKSB7CisgICAgICBjYXNlICIrIjoKKwlpZiAoaStuciA+IGZ1bmNhbGwoaHAsIG5hbWUsIEhQX1JPT01TKSkgeworCSAgcHJpbnRmKCIlZCBSYWV1bWU/IFdpZSBzb2xsIGRhcyBnZWhlbj9cbiIsIGkrbnIpOworCSAgcmV0dXJuIDE7CisJfQorCWRyaW5bbmFtZV0gKz0gbnI7CisJYnJlYWs7CisgICAgICBjYXNlICItIjoKKwlpZiAoaS1uciA8IDApIHsKKwkgIHdyaXRlKCJTb3ZpZWxlIFJhZXVtZSBrYW5uc3QgRHUgIitjYXBpdGFsaXplKG5hbWUpKyIgZ2FyIG5pY2h0IGFiemllaGVuLi4uXG4iKTsKKwkgIHJldHVybiAxOworCX0KKwlkcmluW25hbWVdIC09IG5yOworCWJyZWFrOworICAgICAgZGVmYXVsdDoKKwlpZiAobnIgPiBmdW5jYWxsKGhwLCBuYW1lLCBIUF9ST09NUykpIHsKKwkgIHByaW50ZigiJXMgbmF0IGtlaW5lICVkIFJhZXVtZSFcbiIsY2FwaXRhbGl6ZShuYW1lKSxucik7CisJICByZXR1cm4gMTsKKwl9CisJZHJpbltuYW1lXSA9IG5yOworICAgIH0KKyAgICBybShDSEVDS0VEKTsKKyAgICBmb3IgKGk9c2l6ZW9mKGluZD1zb3J0X2FycmF5KG1faW5kaWNlcyhkcmluKSwjJzwpKS0xOyBpPj0wOyBpLS0pCisgICAgICB3cml0ZV9maWxlKENIRUNLRUQsIHNwcmludGYoIiVzICVkXG4iLGluZFtpXSwgMStkcmluW2luZFtpXV0pKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3JlcG9ydCgpCit7CisgIHN0cmluZyAqcmVwLCAqaGVhZCwgbmFtZTsKKyAgaW50IGksIGxwLCBucjsKKworICBpZiAoZmlsZV9zaXplKCIvbG9nL3JlcG9ydC93dXJ6ZWwucmVwIik8PTApIHsKKyAgICB3cml0ZSgiS2VpbiB3dXJ6ZWwucmVwIChKaXBwaWVoISA7KVxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKworICByZXAgPSBvbGRfZXhwbG9kZShyZWFkX2ZpbGUoIi9sb2cvcmVwb3J0L3d1cnplbC5yZXAiKSwiXG4iKTsKKyAgbHAgPSBzaXplb2YoUEFUSCktMTsKKworICBmb3IgKGk9c2l6ZW9mKHJlcCktMjsgaT49MDsgaS09MikgeworICAgIGhlYWQgPSBvbGRfZXhwbG9kZShyZXBbaV0sICIgIik7CisgICAgaWYgKGhlYWRbNF1bMC4ubHBdID09IFBBVEgpIHsKKyAgICAgIG5hbWUgPSBvbGRfZXhwbG9kZShoZWFkWzRdLCIvIilbPDFdOworICAgICAgbnIgPSB0b19pbnQobmFtZVs8MS4uPDFdKTsKKyAgICAgIG5hbWUgPSBuYW1lWzAuLjw2XTsKKyAgICAgIGhlYWRbMl0gPSBjYXBpdGFsaXplKGhlYWRbMl0pOworICAgICAgd3JpdGVfZmlsZShQQVRIKyJyZXAvIituYW1lLAorCQkgc3ByaW50ZigiJXMgaW4gUmF1bSAlZDpcbiVzXG4iLAorCQkJIGltcGxvZGUoaGVhZFswLi4yXSwiICIpLG5yLHJlcFtpKzFdKSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHdyaXRlX2ZpbGUoUEFUSCsicmVwL3d1cnplbC5yZXAiLHNwcmludGYoIiVzXG4lc1xuIiwgcmVwW2ldLCByZXBbaSsxXSkpOworICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50Citta21haWwoc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIGYsZm07CisKKyAgaWYgKCFzdHIgfHwgc3RyID09ICIiKSB7CisgICAgbm90aWZ5X2ZhaWwoICJTeW50YXg6IG1rbWFpbCA8bmFtZT5cbiIpOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKCEoZj0oVkVSV0FMVEVSKS0+SGF1c1Byb3Aoc3RyLCBIUF9FTlYpKSkgeworICAgIHByaW50ZigiJXMgaGF0IGtlaW4gSGF1cyFcbiIsIHN0cik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgZm0gPSBQQVRIK3N0cisiLm1haWwiOworCisgIHdyaXRlX2ZpbGUoZm0sICJcCisgIEh1aHUhXG5cCitcblwKK0RhIER1IE1hZ2llciBiaXN0LCBicmF1Y2hzdCBEdSBhdWNoIGtlaW4gU2VoZXJoYXVzIG1laHIuIERhbWl0IERlaW5lXG5cCitCZXNjaHJlaWJ1bmdlbiBhYmVyIG5pY2h0IHZlcmxvcmVuIHNpbmQsIGZpbmRlc3QgRHUgZGllIEZpbGVzIERlaW5lc1xuXAorSGF1c2VzIGluIC9wbGF5ZXJzLyIrc3RyKyIvc2VoZXJoYXVzLy5cblwKK1xuXAorU29sbCBEZWluIEhhdXMgd2VpdGVyaGluIGFuIGRlciBqZXR6aWdlbiBTdGVsbGUgc3RlaGVuIGJsZWliZW5cblwKKygiK2YrIiksXG5cCitzbyBrbGFlcmUgZGFzIGJpdHRlIG1pdCBkZW0gZG9ydCB6dXN0YWVuZGlnZW4gTWFnaWVyIHNvd2llIGRlbiB6dXN0YWVuLVxuXAorZGlnZW4gUmVnaW9uc21hZ2llcm4gKHdlaWwgZXMgc2ljaCBqZXR6dCB1bSBkZW4gQW5zY2hsdXNzIHZvbiBGaWxlcyBhblxuXAorZWluIEdlYmlldCBoYW5kZWx0KS5cblwKK1xuXAorISEgRGFzIEhhdXMgd2lyZCBhdWYgamVkZW4gRmFsbCBuYWNoIEVuZGUgZGVyIEhhdXNzcGVycmUgYWJnZXJpc3NlbiAhIVxuXAorXG5cCisgIFdhcmdvbi5cbiIpOworCisgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL3Rvb2xzL2xpc3RlLmMgYi9kL3NlaGVyL2hhZXVzZXIvdG9vbHMvbGlzdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMmIzOWEyCi0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL3Rvb2xzL2xpc3RlLmMKQEAgLTAsMCArMSwyNSBAQAorI2luY2x1ZGUgIi4uL2hhdXMuaCIKKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKworbWFwcGluZyBtZWdhbWFwOworCitjcmVhdGUoKSB7CisgIHNldGV1aWQoZ2V0dWlkKHRoaXNfb2JqZWN0KCkpKTsKKyAgcmVzdG9yZV9vYmplY3QoU0FWRUZJTEUpOworICBkb19kdW1wKCk7Cit9CisKK2RvX2R1bXAoKQoreworICBzdHJpbmcgKm93LCB0eXA7CisgIGludCBpLCByLCByMjsKKyAgb3cgPSBtX2luZGljZXMobWVnYW1hcCk7CisgIG93ID0gc29ydF9hcnJheShvdywjJzwpOworICBpID0gc2l6ZW9mKG93KS0xOworICBmb3Iocj0wLCByMj0wOyBpPj0wOyBpLS0pIHsKKyAgICByID0gbWVnYW1hcFtvd1tpXSxIUF9ST09NU107CisgICAgaWYgKElTX0xFQVJORVIob3dbaV0pKSBwcmludGYoIiUxM3MgJWQgTUFHSUVSKCVkKVxuIiwgb3dbaV0scixxdWVyeV93aXpfbGV2ZWwob3dbaV0pKTsKKyAgICBlbHNlIGlmICghSVNfU0VFUihvd1tpXSkpIHByaW50ZigiJTEzcyAlZCBLRUlOIFNFSEVSIE1FSFJcbiIsIG93W2ldLCByKTsKKyAgfQorICBkZXN0cnVjdCh0aGlzX29iamVjdCgpKTsKK30KZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci90cmFnaGF1cy5jIGIvZC9zZWhlci9oYWV1c2VyL3RyYWdoYXVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc5ZmIzNgotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci90cmFnaGF1cy5jCkBAIC0wLDAgKzEsMTg3IEBACisvKgorICogdHJhZ2hhdXMuYyAtLSBXaWUgc3Vlc3MhIDspCisgKgorICogKGMpIDE5OTQgQm9pbmdATW9yZ2VuR3JhdWVuCisgKiBCZS0gdW5kIHVlYmVyYXJiZWl0ZXQgdm9uIEpvZiB1bmQgV2FyZ29uLgorICoKKyAqIEhJTldFSVM6IFVtIGVpbmVuIEJhdXBsYXR6IHp1IGtlbm56ZWljaG5lbiwgbXVzcyBkb3J0IGRpZQorICogIFByb3BlcnRpZSAiaGF1c19lcmxhdWJ0IiBhdWYgMSBnZXNldHp0IHdlcmRlbiEKKyAqCisgKiAxNy4xMS4yMDAzIEZlaWdsaW5nIC0gQnVnZml4OiBGZWhsZW5kZW4gUmVnaW9uc21hZ2llciBhYmdlZmFuZ2VuCisgKgorICogJERhdGU6IDE5OTQvMTAvMjQgMDg6MjU6MTggJAorICogJFJldmlzaW9uOiAxLjUgJAorICogJExvZzogdHJhZ2hhdXMuYyx2ICQKKyAqIFJldmlzaW9uIDEuNSAgMTk5NC8xMC8yNCAgMDg6MjU6MTggIFdhcmdvbgorICogTWFjaHQgamV0enQgR2VicmF1Y2ggdm9uIFZFUldBTFRFUi0+VW5iZWJhdWJhcigpIHVuZCBkZW0gZ2VhZW5kZXJ0ZW4KKyAqIFZFUldBTFRFUi0+TmV1ZXNIYXVzKCkuCisgKgorICogUmV2aXNpb24gMS40ICAxOTk0LzEwLzE5ICAxMDowMzoyOSAgV2FyZ29uCisgKiBIaW53ZWlzIGVpbmdlYmF1dCAocy5vLikKKyAqIEJlc2NocmFlbmt1bmcgYXVmIGVpbiBTZWhlcmhhdXMgcHJvIFJhdW0gcmF1c2dlbm9tbWVuLgorICoKKyAqIFJldmlzaW9uIDEuMyAgMTk5NC8xMC8wOSAgMjA6MTc6MDMgIFdhcmdvbgorICogSW4gYmxhcygpIGhhdXMtPlNhdmUoKSBlaW5nZWZ1ZWd0LgorICoKKyAqIFJldmlzaW9uIDEuMiAgMTk5NC8xMC8wNyAgMjI6MTM6MTcgIFdhcmdvbgorICogRXR3YXMgYXVmZ2VyYWV1bXQuCisgKiBUZXh0IGJlaW0gR2llc3NlbiBnZWFlbmRlcnQuCisgKiBGYWxscyBpbiBkZW0gUmF1bSBzY2hvbiBlaW4gU2VoZXJoYXVzIHN0ZWh0LCBrYW5uIGtlaW4gd2VpdGVyZXMgbWVocgorICogYXVmZ2VzdGVsbHQgd2VyZGVuLgorICoKKyAqIFJldmlzaW9uIDEuMSAgMTk5NC8xMC8wNyAgMTQ6NDA6NTQgIFdhcmdvbgorICogSW5pdGlhbCByZXZpc2lvbgorICoKKyAqLworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlICJoYXVzLmgiCisKK2luaGVyaXQgInN0ZC90aGluZyI7CisKK3N0YXRpYyBzdHJpbmcgb3duZXI7CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgICA6OmNyZWF0ZSgpOworICAgb3duZXIgPSBnZXR1aWQodGhpc19wbGF5ZXIoKSk7CisgICBTZXRQcm9wKFBfU0hPUlQsICJFaW4gdHJhZ2JhcmVzIEluc3RhbnRoYXVzIik7CisgICBTZXRQcm9wKFBfTE9ORywgIkRpZXMgaXN0IERlaW4gSGF1cy4gRHUga2FubnN0IGVzIGFic3RlbGxlbiB1bmQgZ2llc3NlbiwgZGFubiB3aXJkIGRhcmF1cyBlaW5cblwKK3JpY2h0aWdlcyBTZWhlcmhhdXMsIGluIGRhcyBEdSBzb2ZvcnQgZWluemllaGVuIGthbm5zdC4gRXMgaXN0IGFsbGVyZGluZ3NcblwKK25vZXRpZywgZGFzcyBkZXIgTWFnaWVyLCBkZXIgZGVuIFJhdW0gZXJzY2hhZmZlbiBoYXQsIGluIGRlbSBEdSBlcyBhYnN0ZWxsZW5cblwKK21vZWNodGVzdCwgZGVtIEJhdSBlaW5lcyBTZWhlcmhhdXNlcyBpbiBkaWVzZW0gUmF1bSB6dXN0aW1tdC5cbiIpOworICAgU2V0UHJvcChQX05BTUUsICJIYXVzIik7CisgICBTZXRQcm9wKFBfTkVWRVJEUk9QLCAxKTsKKyAgIFNldFByb3AoUF9HRU5ERVIsIDApOworICAgQWRkSWQoKHsiaGF1cyIsICJzZWhlXHJoYXVzIn0pKTsKKyAgIFNldFByb3AoUF9WQUxVRSwgMCk7CisgICBTZXRQcm9wKFBfV0VJR0hULCAwKTsKKyAgIEFkZENtZCgoeyJnaWVzIiwgImdpZXNzIiwgImdpZXNzZSJ9KSwgImJsYXMiKTsKK30KKworc3RyaW5nIFNldE93bmVyKHN0cmluZyBvKQoreworICAgcmV0dXJuIG93bmVyID0gbzsKK30KKworc3RyaW5nIFF1ZXJ5T3duZXIoKQoreworICByZXR1cm4gb3duZXI7Cit9CisKK3N0cmluZyBnZXRfbWFnKG1peGVkIGRlc3QpCit7CisgIG1hcHBpbmcgcmVnOworICBzdHJpbmcgKm1hZzsKKyAgc3RyaW5nIHJldDsKKyAgaW50IGksIGo7CisKKyAgY2F0Y2gocmVnID0gIi9vYmovbWxpc3RlIi0+UXVlcnlQcm9wKCJNYWdpZXJsaXN0ZSIpKTsKKworICBpZiAobWFwcGluZ3AocmVnKSAmJiBtZW1iZXIocmVnLCBnZXR1aWQoZGVzdCkpKQorICAgIG1hZyA9IHJlZ1tnZXR1aWQoZGVzdCldOworICBlbHNlCisgICAgcmV0dXJuIGNhcGl0YWxpemUoZ2V0dWlkKGRlc3QpKTsKKworCisgIGlmICghc2l6ZW9mKG1hZykpIAorICAgIHJldHVybiBjYXBpdGFsaXplKGdldHVpZChkZXN0KSk7IC8vSGluenVnZWZ1ZWd0IEZlaWdsaW5nCisgIAorICBpZiAoKGk9c2l6ZW9mKG1hZykpID09IDEpCisgICAgcmV0dXJuIGNhcGl0YWxpemUobWFnWzBdKTsKKyAgZWxzZSB7CisgICAgcmV0ID0gY2FwaXRhbGl6ZShtYWdbMF0pOworICAgIGogPSAxOworICAgIHdoaWxlIChqIDwgaS0xKSB7CisgICAgICByZXQgKz0gIiwgIitjYXBpdGFsaXplKG1hZ1tqXSk7CisgICAgICBqKys7CisgICAgfQorICAgIHJldCArPSAiIHVuZCAiK2NhcGl0YWxpemUobWFnWzwxXSk7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworaW50IG1vdmUobWl4ZWQgZGVzdCwgaW50IG1ldGhvZCkKK3sKKyAgaW50IG5peDsKKworICBpZiAoKG1ldGhvZCAmIE1fR0lWRSkgPT0gTV9HSVZFKQorICB7CisgICAgd3JpdGUoIkRlaW4gc2F1ZXIgdmVyZGllbnRlcyBTZWhlcmhhdXMgd2VnZ2ViZW4/IE5JRU1BTFMhXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoKG1ldGhvZCAmIE1fUFVUKSA9PSBNX1BVVCkKKyAgeworICAgIGlmICgobml4ID0gVkVSV0FMVEVSLT5VbmJlYmF1YmFyKGRlc3QpKSkKKyAgICB7CisgICAgICB3cml0ZSggKHsgIkhpZXIgaXN0IGRhcyBCYXVlbiB2b24gSGFldXNlcm4gdW50ZXJzYWd0IVxuIiwKKwkJIkR1IGthbm5zdCBkYXMgSGF1cyBuaWNodCBpbiBnZXNjaGxvc3NlbmVuIFJhZXVtZW4gYWJzdGVsbGVuLlxuIiwKKwkJIkRpZXNlciBQbGF0eiBpc3QgbmljaHQgYWxzIEJhdXBsYXR6IGdla2VubnplaWNobmV0LCBEdSBzb2xsdGVzdCBtYWxcbm1pdCBkZW0gdmVyYW50d29ydGxpY2hlbiBNYWdpZXIgcmVkZW4uIERpZSBadXN0YWVuZGlna2VpdCBmdWVyIGRpZXNlbiBPcnRcbmxpZWd0IGJlaSAiK2dldF9tYWcoZGVzdCkrIi5cbiIKKwkgICAgIH0pW25peC0xXSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDo6bW92ZShkZXN0LCBtZXRob2QpOworICB9CisgIGlmICgobWV0aG9kICYgTV9HRVQpID09IE1fR0VUKQorICB7CisgICAgaWYgKGdldHVpZCh0aGlzX3BsYXllcigpKSE9b3duZXIpCisgICAgeworICAgICAgd3JpdGUoIkRpZXMgaXN0IG5pY2h0IERlaW4gSGF1cy5cbiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisgIHJldHVybiA6Om1vdmUoZGVzdCwgbWV0aG9kKTsKK30KKworaW50IGJsYXMoc3RyaW5nIHN0cikKK3sKKyAgb2JqZWN0IGhhdXM7CisKKyAgbm90aWZ5X2ZhaWwoIldhcyBtb2VjaHRlc3QgRHUgZ2llc3Nlbj9cbiIpOworICBpZiAoIXN0ciB8fCBzdHIhPSJoYXVzIikKKyAgICByZXR1cm4gMDsKKyAgaWYgKGxpdmluZyhlbnZpcm9ubWVudCgpKSkKKyAgeworICAgIHdyaXRlKCJEdSBzb2xsdGVzdCBkYXMgSGF1cyB2aWVsbGVpY2h0IGVyc3QgbWFsIGFic3RlbGxlbi5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIGlmIChnZXR1aWQodGhpc19wbGF5ZXIoKSkhPW93bmVyKQorICB7CisgICAgd3JpdGUoIk1hY2hzdCBEdSBpbW1lciBmcmVtZGUgSGFldXNlciBuYXNzP1xuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKCFlbnZpcm9ubWVudCgpLT5RdWVyeVByb3AoUF9IQVVTX0VSTEFVQlQpKQorICB7CisgICAgd3JpdGUoIkRpZXNlciBQbGF0eiBpc3QgbmljaHQgYWxzIEJhdXBsYXR6IGdla2VubnplaWNobmV0LCBEdSBzb2xsdGVzdCBtYWxcblwKK21pdCBkZW0gZW50c3ByZWNoZW5kZW4gTWFnaWVyIHJlZGVuLlxuRnJhZyBtYWwgIitjYXBpdGFsaXplKGdldHVpZChlbnZpcm9ubWVudCgpKSkrIi5cbiIpOworICAgIHJldHVybiAwOworICB9CisgIHdyaXRlKCAiVm9sbGVyIFZvcmZyZXVkZSBncmVpZnN0IER1IG5hY2ggRGVpbmVyIEdpZXNza2FubmUgdW5kIGJlZ2lubnN0LCBEZWluIG11ZWgtXG5cCitzYW0gZXJzcGFydGVzIEluc3RhbnRoYXVzIHp1IGJlZ2llc3Nlbi4gTW9tZW50Li4uIEdpZXNza2FubmU/IFJlaWNobGljaCB2ZXItXG5cCitkdXR6dCBzY2hhdXN0IER1IGF1ZiBkaWUga2xlaW5lIGdydWVuZSBLYW5uZSBpbiBEZWluZW4gSGFlbmRlbi4gV28gbWFnIHNpZVxuXAorbnVyIGhlcmdla29tbWVuIHNlaW4/IERvY2gga2F1bSBlcnJlaWNoZW4gZGllIGVyc3RlbiBUcm9wZmVuIGRhcyBJbnN0YW50aGF1cyxcblwKK3dpcmQgRGVpbmUgQXVmbWVya3NhbWtlaXQgYXVjaCBzY2hvbiB3aWVkZXIgdm9uIGRlciBLYW5uZSBhYmdlbGVua3Q6XG5cCitEYXMgVHJvY2tlbmhhdXMgYmVnaW5udCB6dSBzY2hhZXVtZW4gdW5kIHNpY2ggdWViZXIgZGVuIEJvZGVuIGF1c3p1YnJlaXRlbi5cblwKK0luIGRlbSBTY2hhdW0gZW50c3RlaGVuIHVuZCB2ZXJnZWhlbiBXYWVuZGUsIERlY2tlbiB1bmQgRmVuc3RlciwgYWxzIG9iIHNpZVxuXAorc2ljaCBub2NoIG5pY2h0IHJlY2h0IGVudHNjaGVpZGVuIGtvZW5udGVuLCB3aWUgc2ljaCBzaWNoIHp1IGVpbmVtIEdhbnplbiB6dS1cblwKK3NhbW1lbmZ1ZWdlbiBzb2xsZW4uXG5cCitEYW5uIGVyaGVidCBzaWNoIGRvcnQsIHdvIER1IGRhcyBUcm9ja2VuaGF1cyBhYmdlc3RlbGx0IGhhdHRlc3QsIGVpbmUgZ3Jvc3NlLFxuXAorc2NoYXVtaWdlIEJsYXNlISBTaWUgd2lyZCBncm9lc3NlciB1bmQgZ3JvZXNzZXIsIGJpcyBzaWUgRGljaCBzY2hsaWVzc2xpY2hcblwKK3N0cmVpZnQuIERhYmVpIHBsYXR6dCBzaWUgbWl0IGVpbmVtIGxlaXNlbiAqUExPUFAqIC0gdW5kIGVzIGJsZWlidCBlaW4gYmUtXG5cCit6dWdzZmVydGlnZXMgU2VoZXJoYXVzIHp1cnVlY2shXG5cCitEdSB3aXJmc3Qgbm9jaCBlaW5tYWwgZWluZW4gdmVyc3RvaGxlbmVuIEJsaWNrIGF1ZiBkaWUgR2llc3NrYW5uZSwgbXVzc3QgYWJlclxuXAorZmVzdHN0ZWxsZW4sIGRhc3Mgc2llIHZlcnNjaHd1bmRlbiBpc3QgdW5kIGF1Y2ggdmVyc2Nod3VuZGVuIGJsZWlidC5cbiIgKTsKKworICBzYXkoY2FwaXRhbGl6ZSgoc3RyaW5nKSh0aGlzX3BsYXllcigpLT5uYW1lKCkpKSsiIHZlcndhbmRlbHQgbWl0IGVpbmVtIFRyb3BmZW4gV2Fzc2VyICIrCisgICAgICB0aGlzX3BsYXllcigpLT5RdWVyeVBvc3NQcm9ub3VuKHRoaXNfb2JqZWN0KCksIFdFTikgKyAiIEhhdXMuXG4iKTsKKworICBWRVJXQUxURVItPk5ldWVzSGF1cyhvd25lciwgZW52aXJvbm1lbnQodGhpc19vYmplY3QoKSkpOworICByZW1vdmUoKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJpbmcgX3F1ZXJ5X2F1dG9sb2Fkb2JqKCkKK3sKKyAgcmV0dXJuIG93bmVyOworfQpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL3RydWhlLmMgYi9kL3NlaGVyL2hhZXVzZXIvdHJ1aGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWFiOGFkCi0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL3RydWhlLmMKQEAgLTAsMCArMSwzNjUgQEAKKyNpbmNsdWRlICJoYXVzLmgiCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorCitpbmhlcml0ICIvZC93dWVzdGUvZHVyaWFuL2JlaGFlbHRlciI7Citpbmhlcml0ICIvcC9zZXJ2aWNlL3dhcmdvbi9tYXRfZWQiOworaW5oZXJpdCAiL21haWwvbmVkaXQiOworCitzdGF0aWMgc3RyaW5nIG93bmVyOworCit2b2lkIGNyZWF0ZSgpCit7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisKKyAgOjpjcmVhdGUoKTsKKworICBTZXQoUF9OQU1FLCBTQVZFLCBGX01PREVfQVMpOworICBTZXQoUF9TSE9SVCwgU0FWRSwgRl9NT0RFX0FTKTsKKyAgU2V0KFBfTE9ORywgU0FWRSwgRl9NT0RFX0FTKTsKKyAgU2V0KFBfR0VOREVSLCBTQVZFLCBGX01PREVfQVMpOworICBTZXQoUF9JRFMsIFNBVkUsIEZfTU9ERV9BUyk7CisgIFNldChQX0lOVklTLCBTQVZFLCBGX01PREVfQVMpOworICBTZXQoUF9OQU1FX0FESiwgU0FWRSwgRl9NT0RFX0FTKTsKKyAgU2V0KFBfTUFURVJJQUwsIFNBVkUsIEZfTU9ERV9BUyk7CisgIFNldChIX0RPT1JMU1RBVCwgU0FWRSwgRl9NT0RFX0FTKTsKKworICBTZXRQcm9wKCBQX05BTUUsICJUcnVoZSIgKTsKKyAgU2V0UHJvcCggUF9TSE9SVCwgIkVpbmUgVHJ1aGUiICk7CisgIFNldFByb3AoIFBfTE9ORywKKyAgICAgIkVpbmUgc3RhYmlsZSBIb2x6dHJ1aGUgbWl0IGVpbmVtIFNpY2hlcmhlaXRzc2NobG9zcy4gTnVyIGF1c2dld2FlaGx0ZVxuIgorICAgICsiUGVyc29uZW4gZHVlcmZlbiBkaWUgVHJ1aGUgb2VmZm5lbiB1bmQgU2FjaGVuIGluIGlociBsYWdlcm4gb2RlciBhdXNcbiIKKyAgICArImlociBuZWhtZW4uXG4iICk7CisgIFNldFByb3AoIFBfR0VOREVSLCBGRU1BTEUgKTsKKyAgU2V0UHJvcCggUF9OT0dFVCwgMSApOworICBTZXRQcm9wKCBQX0lEUywgKHsgInRydWhlIiwiaG9senRydWhlIiwgVFJVSEV9KSApOworICBTZXRQcm9wKCBQX01BVEVSSUFMLCAoWyBNQVRfTUlTQ19XT09EIDogMTAwIF0pICk7CisgIFNldFByb3AoIEhfRE9PUkxTVEFULCAoeyAiZ2VzY2hsb3NzZW4iLCAiZ2VvZWZmbmV0In0pICk7CisKKyAgQWRkQ21kKCAoeyAic2NoaWViIiwic2NoaWViZSJ9KSwgInNjaGllYmVuIiApOworICBBZGRDbWQoICh7ICJiZXNjaHJlaWIiLCAiYmVzY2hyZWliZSIgfSksICJiZXNjaHJlaWJlbiIgKTsKKyAgQWRkQ21kKCAoeyAiYWVuZGVyIiwgImFlbmRlcmUiIH0pLCAiYWVuZGVybiIgKTsKK30KKworbWl4ZWQKK19zZXRfb3duZXIoc3RyaW5nIG93KQoreworICBzdHJpbmcgKm5hLCAqYTsKKyAgaW50IGk7CisKKyAgaWYgKG93ICYmIHN0cmluZ3Aob3cpKQorICAgIHJlc3RvcmVfb2JqZWN0KEhBVVNTQVZFUEFUSCtvdysidHJ1aGUiKTsKKworICBpZiAoKG5hID0gUXVlcnlQcm9wKFBfTkFNRV9BREopKSAmJiAoaT1zaXplb2YobmEpKSkgeworICAgIGZvciAoYSA9ICh7IH0pLCBpLT0xOyBpPj0wOyBpLS0pCisgICAgICBhICs9ICh7IERlY2xBZGoobmFbaV0sIFdFUilbMC4uPDJdLCBEZWNsQWRqKG5hW2ldLCBXRU0pWzAuLjwyXSwgRGVjbEFkaihuYVtpXSxXRU4pWzAuLjwyXSB9KTsKKworICAgIGEgPSBtX2luZGljZXMobWttYXBwaW5nKGEpKTsKKyAgICBpZiAoc2l6ZW9mKGEpKQorICAgICAgQWRkQWRqZWN0aXZlKGEpOworICB9CisKKyAgU2V0WnUoKTsKKyAgcmV0dXJuIG93bmVyPW93OworfQorCitzdHJpbmcKK3Nob3J0KCkKK3sKKyAgaW50IG9wZW47CisgIHN0cmluZyBzaCwgKnN0YXQ7CisKKyAgb3BlbiA9IChRdWVyeVByb3AoUF9DTlRfU1RBVFVTKSA9PSBDTlRfU1RBVFVTX09QRU4pOworICBzaCA9IFF1ZXJ5UHJvcChQX1NIT1JUKTsKKyAgc3RhdCA9IFF1ZXJ5UHJvcChIX0RPT1JMU1RBVCk7CisgIGlmICghc3RhdCkKKyAgICBzdGF0ID0gKHsgIiIsICIifSk7CisgIGVsc2UgaWYgKHN0cnN0cihzaCwgIiVzIikgPT0gLTEpCisgICAgc2ggKz0gIiAoJXMpIjsKKyAgaWYoUXVlcnlQcm9wKFBfSU5WSVMpKSByZXR1cm4gIiI7CisgIHJldHVybiBzcHJpbnRmKHNoLCBzdGF0W29mZmVuXSkrIi5cbiI7Cit9CisKK29lZmZuZShzdHJpbmcgc3RyKQoreworICBvYmplY3QgZW52OworCisgIG5vdGlmeV9mYWlsKCJXQVMgbW9lY2h0ZXN0IER1IG9lZmZuZW4/XG4iKTsKKworICAvLyBiaW4gaWNoIGdlbWVpbnQ/CisgIGlmICghc3RyIHx8IHByZXNlbnQoc3RyLCBlbnZpcm9ubWVudCgpKSAhPSB0aGlzX29iamVjdCgpKQorICAgIHJldHVybiAwOworCisgIGlmICgoZW52PWVudmlyb25tZW50KCkpICYmIGVudi0+aWQoInNlaGVccmhhdXMiKSkgeworICAgIGlmICghZW52LT5hbGxvd2VkX2NoZWNrKHRoaXNfcGxheWVyKCkpKSB7CisgICAgICB3cml0ZSgiRHUgZGFyZnN0ICIrbmFtZShXRU4pKyIgbmljaHQgb2VmZm5lbiFcbiIgKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorICByZXR1cm4gOjpvZWZmbmUoc3RyKTsKK30KKworaW50IE1heUFkZFdlaWdodChpbnQgdykKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NjaGllYmVuKHN0cmluZyByaWNodHVuZykKK3sKKyAgc3RyaW5nICphdXM7CisgIG1hcHBpbmcgZXhpdHM7CisKKyAgaWYgKCFlbnZpcm9ubWVudCgpIHx8ICghZW52aXJvbm1lbnQoKS0+aWQoInNlaGVccmhhdXMiKSkgfHwKKyAgICAgICFlbnZpcm9ubWVudCgpLT50cF9vd25lcl9jaGVjaygpKQorICAgIHJldHVybiAwOworCisgIG5vdGlmeV9mYWlsKCAiU3ludGF4OiBzY2hpZWJlIDx0cnVoZT4gbmFjaCA8cmljaHR1bmc+XG4iKTsKKworICBpZiAoIXJpY2h0dW5nIHx8IHJpY2h0dW5nID09ICIiKQorICAgIHJldHVybiAwOworCisgIGF1cyA9IG9sZF9leHBsb2RlKHJpY2h0dW5nLCAiICIpOworICByaWNodHVuZyA9IGF1c1s8MV07CisgIGlmIChzaXplb2YoYXVzKSA8IDMgfHwgIWlkKGltcGxvZGUoYXVzWzAuLjwzXSwiICIpKSkKKyAgICByZXR1cm4gMDsKKworICBpZiAobWVtYmVyKGF1cyA9IG1faW5kaWNlcyhleGl0cyA9IGVudmlyb25tZW50KCktPlF1ZXJ5UHJvcChQX0VYSVRTKSkscmljaHR1bmcpPT0tMSkKKyAgICB3cml0ZSggIkR1IGthbm5zdCAiK25hbWUoV0VOLDEpKyIgbmljaHQgbmFjaCAnIityaWNodHVuZysiJyBzY2hpZWJlbiFcbiIpOworICBlbHNlIGlmICghZXhpdHNbcmljaHR1bmddLT50cF9vd25lcl9jaGVjaygpKQorICAgIHdyaXRlKCAiRHUga2FubnN0ICIrbmFtZShXRU4sMSkrIiBuaWNodCBhdXMgRGVpbmVtIEhhdXMgaGluYXVzc2NoaWViZW4hXG4iKTsKKyAgZWxzZSB7CisgICAgd3JpdGUoICJEdSBzY2hpZWJzdCAiK25hbWUoV0VOLDEpKyIgaW4gZWluZW4gYW5kZXJlbiBSYXVtLiBEYW5uIGtlaHJzdFxuIgorCSAgKyJEdSB3aWVkZXIgenVydWVjay5cbiIpOworICAgIHNheShjYXBpdGFsaXplKHRoaXNfcGxheWVyKCktPm5hbWUoV0VSKSkrIiBzY2hpZWJ0ICIrbmFtZShXRU4pKyIgaW4gZWluZW4gYW5kZXJlblxuIgorCSsiUmF1bSwga2VocnQgYWJlciBzZWxiZXIgd2llZGVyLlxuIik7CisgICAgZW52aXJvbm1lbnQoKS0+U2V0KEhfQ0hFU1QsMCk7CisgICAgZW52aXJvbm1lbnQoKS0+U2F2ZSgpOworICAgIG1vdmUoZXhpdHNbcmljaHR1bmddLCBNX05PQ0hFQ0spOworICAgIGVudmlyb25tZW50KCktPlNldChIX0NIRVNULDEpOworICAgIGVudmlyb25tZW50KCktPlNhdmUoKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworcHJpdmF0ZSBzdHJpbmcgKmJyayhzdHJpbmcgc3RyKQoreworICBpbnQgaTsKKyAgc3RyaW5nICp0MSwgKnQyOworCisgIHQxID0gcmVnZXhwbG9kZShzdHIsICIsICoiKTsKKyAgZm9yICh0MiA9ICh7fSksIGk9c2l6ZW9mKHQxKS0xOyBpPj0wOyBpLT0yKQorICAgIHQyID0gKHt0MVtpXX0pICsgdDI7CisKKyAgcmV0dXJuIHQyOworfQorCitzdGF0aWMgdm9pZCBnZXRTaG9ydCgpOworCitzdGF0aWMgaW50IGJlc2NocmVpYmVuKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyAqeDsKKworICBpZiAoIXN0ciB8fCBnZXR1aWQodGhpc19wbGF5ZXIoKSkgIT0gb3duZXIpCisgICAgcmV0dXJuIDA7CisKKyAgeCA9IG9sZF9leHBsb2RlKHN0ciwgIiAiKTsKKworICBpZiAoeFs8MV0gPT0gInN0YXR1cyIgJiYgIWlkKGltcGxvZGUoeFswLi48Ml0sIiAiKSkpCisgICAgcmV0dXJuIDA7CisgIGVsc2UgaWYgKCFpZChzdHIpICYmIChzdHIgIT0gInRydWhlIikpCisgICAgcmV0dXJuIDA7CisKKyAgd3JpdGUoICJCZXNjaHJlaWJ1bmcgIituYW1lKFdFU1NFTiwxKSsiXG4iCisJKyJXZW5uIGRpZSBWb3JnYWJlbiBuaWNodCBnZWFlbmRlcnQgd2VyZGVuIHNvbGxlbiwgZWluZmFjaCB3ZWl0ZXJcbiIKKwkrIm1pdCA8UkVUVVJOPi5cblxuIik7CisgIGdldFNob3J0KCk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBnZXRTaG9ydCgpCit7CisgIHdyaXRlKCJHZXNjaGxlY2h0IChtLCB3LCBzKTogWyIKKwkrKHsgInMiLCJtIiwidyIgfSlbUXVlcnlQcm9wKFBfR0VOREVSKV0rIl1cbl0iICk7CisgIGlucHV0X3RvKCJnb3RHZW5kZXIiKTsKK30KKworc3RhdGljIHZvaWQgZ290R2VuZGVyKHN0cmluZyBzdHIpCit7CisgIGludCBnZW47CisgIG1peGVkIG5hbWU7CisKKyAgaWYgKCFzdHIgfHwgc3RyID09ICIiKQorICAgIHdyaXRlKCJHZXNjaGxlY2h0IG5pY2h0IGdlYWVuZGVydC5cbiIpOworICBlbHNlIGlmICgoZ2VuID0gbWVtYmVyKCh7J3MnLCdtJywndyd9KSxzdHJbMF0pKSA9PSAtMSkgeworICAgIHdyaXRlKCAiQml0dGUgbnVyICdtJywgJ3cnIG9kZXIgJ3MnIGVpbmdlYmVuIVxuR2VzY2hsZWNodDpcbl0iKTsKKyAgICBpbnB1dF90bygiZ290R2VuZGVyIik7CisgICAgcmV0dXJuOworICB9CisgIGVsc2UgeworICAgIFNldFByb3AoUF9HRU5ERVIsIGdlbik7CisgICAgd3JpdGUoICJEYXMgR2VzY2hsZWNodCBpc3QgamV0enQgIitRdWVyeUdlbmRlclN0cmluZygpKyIuXG4iKTsKKyAgfQorCisgIG5hbWUgPSBRdWVyeVByb3AoUF9OQU1FKTsKKyAgd3JpdGUoIk51biBtdXNzdCBEdSBkZW4gTmFtZW4gZWluZ2ViZW4uIFNvbGx0ZSBkZXIgTmFtZSB1bnJlZ2VsbWFlc3NpZyBkZWtsaW5pZXJ0XG4iCisgICAgICAgKyJ3ZXJkZW4sIG11c3N0IER1IGRlbiBOYW1lbiBpbiBhbGxlbiB2aWVyIEZhZWxsZW4gaW4gZGVyIFJlaWhlbmZvbGdlIE5vbWktXG4iCisgICAgICAgKyJuYXRpdiwgR2VuaXRpdiwgRGF0aXYsIEFra3VzYXRpdiB1bmQgZHVyY2ggS29tbWF0YSBnZXRyZW5udCBlaW5nZWJlbi5cbiIKKyAgICAgICArIk5hbWU6IFsiKyhwb2ludGVycChuYW1lKSA/IGltcGxvZGUobmFtZSwgIiwgIikgOiBuYW1lKSsgIl1cbl0iKTsKKyAgaW5wdXRfdG8oImdvdE5hbWUiKTsKK30KKworc3RhdGljIHZvaWQgZ290TmFtZShzdHJpbmcgc3RyKQoreworICBzdHJpbmcgKm47CisKKyAgaWYgKCFzdHIgfHwgbWVtYmVyKCh7ICIiLCAiLiIsICIqKiIsICJ+cSJ9KSwgc3RyKSA+PSAwKQorICAgIHdyaXRlKCJOYW1lIHd1cmRlIG5pY2h0IGdlYWVuZGVydC5cbiIpOworICBlbHNlIHsKKyAgICBuID0gYnJrKHN0cik7CisKKyAgICBpZiAoc2l6ZW9mKG4pID09IDEpCisgICAgICBTZXRQcm9wKFBfTkFNRSwgblswXSk7CisgICAgZWxzZSB7CisgICAgICBpZiAoc2l6ZW9mKG4pID4gNCkKKwluID0gblswLi4zXTsKKyAgICAgIGVsc2UKKwl3aGlsZSAoc2l6ZW9mKG4pICE9IDQpCisJICBuID0gbiArICh7IG5bMF0gfSk7CisgICAgICBTZXRQcm9wKFBfTkFNRSxuKTsKKyAgICB9CisgICAgcHJpbnRmKCJEZXIgTmFtZSBpc3QgamV0enQgJyVzJ1xuIiwgaW1wbG9kZShuLCAiLCAiKSk7CisgIH0KKyAgd3JpdGUoIkR1IGthbm5zdCBqZXR6dCBub2NoIE5hbWVuc2FkamVrdGl2ZSBhbmdlYmVuLiBIaWVyIGRhcmZzdCBEdSBudXIgZGVuIFdvcnQtXG4iCisgICAgICAgKyJzdGFtbSBhbmdlYmVuLCBkYSBkaWUgQWRqZWt0aXZlIGF1dG9tYXRpc2NoIGRla2xpbmllcnQgd2VyZGVuIChhbHNvIGZ1ZXJcbiIKKyAgICAgICArImVpbmUgJ2FsdGUgVHJ1aGUnIG11ZXNzdGVzdCBEdSAnYWx0JyBhbmdlYmVuKS5cbiIKKyAgICAgICArIkR1IGthbm5zdCBhdWNoIG1laHJlcmUgQWRqZWt0aXZlLCBkdXJjaCBLb21tYXRhIGdldHJlbm50LCBhbmdlYmVuLlxuIgorICAgICAgICsiVW0gYWxsZSBOYW1lbnNhZGpla3RpdmUgenUgbG9lc2NoZW4sIGdpYiBiaXR0ZSAnbml4JyBlaW4uXG4iCisgICAgICAgKyJOYW1lbnNhZGpla3RpdmU6IFsiK2ltcGxvZGUoUXVlcnlQcm9wKFBfTkFNRV9BREopLCIsICIpKyJdXG4iKTsKKyAgaW5wdXRfdG8oImdvdEFkaiIpOworfQorCitzdGF0aWMgdm9pZCBnb3RBZGooc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nICpuOworCisgIGlmICghc3RyIHx8IG1lbWJlcigoeyAiIiwgIi4iLCAiKioiLCAifnEifSksIHN0cikgPj0gMCkKKyAgICB3cml0ZSgiQWRqZWt0aXZlIG5pY2h0IGdlYWVuZGVydC5cbiIpOworICBlbHNlIHsKKyAgICBuID0gYnJrKHN0cik7CisKKyAgICBpZiAobWVtYmVyKG4sICJuaXgiKSA9PSAtMSkgeworICAgICAgU2V0UHJvcChQX05BTUVfQURKLCBuKTsKKyAgICAgIHByaW50ZigiTmFtZW5zYWRqZWt0aXZlIGxhdXRlbiAlcy5cbiIsIGltcGxvZGUobiwiLCAiKSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgU2V0UHJvcChQX05BTUVfQURKLCAoe30pICk7CisgICAgICB3cml0ZSgiTmFtZW5zYWRqZWt0aXZlIGdlbG9lc2NodC5cbiIpOworICAgIH0KKyAgfQorICBTZXRQcm9wKFBfU0hPUlQsIGNhcGl0YWxpemUobmFtZShXRVIpKSk7CisgIHdyaXRlKCAiRGllIEt1cnpiZXNjaHJlaWJ1bmcgbGF1dGV0IGRhbWl0OlxuIitzaG9ydCgpKTsKKyAgd3JpdGUoICJGYWxscyBkYXMgRXJnZWJuaXMgbmljaHQgRGVpbmVuIFZvcnN0ZWxsdW5nZW4gZW50c3ByaWNodCwgZ2VsYW5nc3QgRHVcbiIKKwkrIm1pdCAnbicgd2llZGVyIGluIGRpZSBHZXNjaGxlY2h0c2FiZnJhZ2UsIGFuc29uc3RlbiBnZWh0IGVzIGluIGRlclxuIgorCSsiQmVzY2hyZWlidW5zc2VxdWVueiB3ZWl0ZXIuXG4iCisJKyJTdGltbXQgZGllIEt1cnpiZXNjaHJlaWJ1bmcgc28/IChqL24pXG5dIik7CisgIGlucHV0X3RvKCJnb3RLdXJ6Iik7Cit9CisKK3N0YXRpYyB2b2lkIGdvdEt1cnooc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIGFydCwgbmFtLCAqcDsKKyAgaW50IGdlbjsKKworICBpZiAoc3RyICYmIHNpemVvZihzdHIpICYmIHN0clswXSA9PSAnbicpIHsKKyAgICB3cml0ZSggIk5ldWVzIFNwaWVsLCBuZXVlcyBHbHVlY2suLi4gOylcbiIpOworICAgIGdldFNob3J0KCk7CisgICAgcmV0dXJuOworICB9CisgIHdyaXRlKCJcbklEcyAoZHVyY2ggS29tbWF0YSBnZXRyZW5udCk6XG5bIitpbXBsb2RlKFF1ZXJ5UHJvcChQX0lEUyktKHtUUlVIRX0pLCAiLCIpKyJdXG5dIik7CisgIGlucHV0X3RvKCJnb3RJRHMiKTsKK30KKworc3RhdGljIHZvaWQgZ290SURzKHN0cmluZyBzdHIpCit7CisgIGlmICghc3RyIHx8IG1lbWJlciggKHsgIiIsICIuIiwgIioqIiwgIn5xIiB9KSwgc3RyKSA+PSAwICkKKyAgICB3cml0ZSgiSURzIG5pY2h0IGdlYWVuZGVydC5cbiIpOworICBlbHNlIHsKKyAgICBzdHIgPSBpbXBsb2RlKG9sZF9leHBsb2RlKGxvd2VyX2Nhc2Uoc3RyKSwiICIpLSh7IiJ9KSwiICIpOworICAgIHN0ciA9IGltcGxvZGUob2xkX2V4cGxvZGUoc3RyLCIsICIpLCIsIik7CisgICAgU2V0UHJvcChQX0lEUywgb2xkX2V4cGxvZGUoc3RyLCAiLCIpKyh7VFJVSEV9KSk7CisgICAgd3JpdGUoIk9LLCBJRHMgbGF1dGVuICciK3N0cisiJ1xuIik7CisgIH0KKyAgd3JpdGUoIlxuQml0dGUgTGFuZ2Jlc2NocmVpYnVuZyBlaW5nZWJlbiAoQWJicnVjaCBtaXQgfnEsIEVuZGUgbWl0IC4gb2RlciAqKik6XG4iKTsKKyAgbmVkaXQoImdvdExhbmciKTsKK30KKworc3RhdGljIHZvaWQgZ290TWF0KG1hcHBpbmcgbWF0KTsKKworc3RhdGljIHZvaWQgZ290TGFuZyhzdHJpbmcgc3RyKQoreworICBpZiAoIXN0ciB8fCBzdHIgPT0gIiIpCisgICAgd3JpdGUoIkRpZSBMYW5nYmVzY2hyZWlidW5nIHd1cmRlIG5pY2h0IHZlcmFlbmRlcnQuXG4iKTsKKyAgZWxzZQorICAgIFNldFByb3AoUF9MT05HLGltcGxvZGUob2xkX2V4cGxvZGUoc3RyLCAiQEAiKSwiKioiKSk7CisKKyAgd3JpdGUoIlxuQml0dGUgZGFzIE1hdGVyaWFsICIrbmFtZShXRVNTRU4sMSkrIiBiZXN0aW1tZW46XG4iCisJIig8UkVUVVJOPiBmYWxscyBuaWNodHMgZ2VhZW5kZXJ0IHdlcmRlbiBzb2xsKVxuXG4iKTsKKworICBFZGl0TWF0ZXJpYWwoUXVlcnlQcm9wKFBfTUFURVJJQUwpLCAjJ2dvdE1hdCwgMCwgKHtNQVRHUk9VUF9HQVMsTUFUR1JPVVBfRVhQTE9TSVZFfSkpOworfQorCitzdGF0aWMgdm9pZCBnb3RNYXQobWFwcGluZyBtYXQpCit7CisgIGlmIChtYXBwaW5ncChtYXQpKSB7CisgICAgU2V0UHJvcChQX01BVEVSSUFMLCBtYXQpOworICAgIHdyaXRlKCJPSy5cbiIpOworICB9CisgIGVsc2UKKyAgICB3cml0ZSgiRGFzIE1hdGVyaWFsIHd1cmRlIG5pY2h0IHZlcmFlbmRlcnQuXG4iKTsKKworICBzYXZlX29iamVjdChIQVVTU0FWRVBBVEgrb3duZXIrInRydWhlIik7Cit9CisKK3N0YXRpYyBpbnQgYWVuZGVybihzdHJpbmcgc3RyKQoreworICBpZiAoZ2V0dWlkKHRoaXNfcGxheWVyKCkpIT1vd25lciB8fCAhaWQoc3RyKSkKKyAgICByZXR1cm4gMDsKKworICB3cml0ZSgiQml0dGUgTGFuZ2Jlc2NocmVpYnVuZyBhZW5kZXJuLlxuKEFiYnJ1Y2ggbWl0IH5xLCBFbmRlIG1pdCAuIG9kZXIgKiosIEhpbGZlIG1pdCB+aClcbiIpOworICBuZWRpdCgiZ290TGFuZyIsIFF1ZXJ5UHJvcChQX0xPTkcpKTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgU2F2ZSgpCit7CisgIHNhdmVfb2JqZWN0KEhBVVNTQVZFUEFUSCtvd25lcisidHJ1aGUiKTsKK30KKworaW50IFNtYXJ0TG9nKHN0cmluZyBvZmlsZSwgc3RyaW5nIHR5cCwgc3RyaW5nIG1zZywgc3RyaW5nIGRhdGUpCit7CisgIG9iamVjdCBob21lOworICBzdHJpbmcgZm9vLCBiYXI7CisKKyAgd3JpdGVfZmlsZShSRVBGSUxFKG93bmVyKSwgc3ByaW50ZigiJXMgdm9uICVzIGFuIGRlciBUcnVoZSAoJXMpOlxuJXNcbiIsCisJCQkJICAgICB0eXAsCisJCQkJICAgICBjYXBpdGFsaXplKGdldHVpZCh0aGlzX3BsYXllcigpKSksCisJCQkJICAgICBkYXRlLAorCQkJCSAgICAgYnJlYWtfc3RyaW5nKG1zZyw3OCkpKTsKKworICBpZiAoSVNfTEVBUk5FUihvd25lcikpIHsKKyAgICBsb2dfZmlsZSgicmVwb3J0LyIrb3duZXIrIi5yZXAiLAorCSAgICAgc3ByaW50ZigiTUVMRFVORyB2b24gJXMgaW0gU2VoZXJoYXVzLCBhbiBkZXIgVHJ1aGUgKCVzKTpcbiIKKwkJICAgICArIkJpdHRlIHp1ciBLZW5udG5pcyBuZWhtZW4hIChNaXQgZGVtIEJlZmVobCAnbWVsZHVuZ2VuJykgIC1XYXJnb25cbiIsCisJCSAgICAgY2FwaXRhbGl6ZShnZXR1aWQodGhpc19wbGF5ZXIoKSkpLAorCQkgICAgIGRhdGUpKTsKKyAgfQorCisgIGhvbWUgPSBsb2FkX29iamVjdChSQVVNTkFNRShvd25lciwwKSk7CisgIGhvbWUtPlNldChIX1JFUE9SVCwgaG9tZS0+UXVlcnkoSF9SRVBPUlQpKzEpOworICBob21lLT5TYXZlKCk7CisKKyAgcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci90eHQva29tbWVudGFyLnR4dCBiL2Qvc2VoZXIvaGFldXNlci90eHQva29tbWVudGFyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2E0ZTA5Ci0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL3R4dC9rb21tZW50YXIudHh0CkBAIC0wLDAgKzEsNjggQEAKKwkJICAgIEpvZidzY2hlIEt1cnotS29tbWVudGFyZQorCisJICAgIEtvbW1lbnRhciB6dW0gQmF1c3BhcnZlcnRyYWcgZnVlciBTZWhlcgorCitiZWFyYmVpdGV0IHZvbjoKKworQXVmc2ljaHRzcmF0c3ZvcnNjaHdpdHplbmRlciBEci4gZmFjLiBqdS4gQmVsZGluCitPYmVyanVyaXNkaWt0aW9uc3NjaHJhdCBEci4gaGNsLiBPbGltCisKK1p1IEFydC4gMSAgKEdlZ2Vuc3RhbmQgZGVzIFZlcnRyYWdlcyk6CUR1IHphaGxzdCBFcmZhaHJ1bmcgZWluCit1bmQgYmVrb21tc3QgYW0gRW5kZSAodmllbGxlaWNodCkgRGVpbiBIYXVzIGRhZnVlci4gIERpZSBFcmZhaC0KK3J1bmdzcHVua3RlIHNpbmQgYXVmIGplZGVuIEZhbGwgZXJzdG1hbCB3ZWcuCisKK1p1IEFydC4gMiAoUGFydGVpZW4pOiBFcyBnaWJ0IHp3ZWkgUGFydGVpZW4sIERpY2ggdW5kIGRpZSBCYW5rLgorRGllIEJhbmsgaXN0IGltbWVyIGdsZWljaGJlcmVjaHRpZ3RlciBhbHMgRHUuCisKK1p1IEFydC4gMyAoV29obnN0YWV0dGUpOiBFaW4gSGF1cy4KKworWnUgQXJ0LiA0IChGaW5hbnppZXJ1bmcpOgorCisgQWJzLjEgKEthcGl0YWx2b2x1bWVuKSAgSW5zZ2VzYW10ICBrb3N0ZXQgZGFzIEhhdXMgMjU0NDAwMCAgRVAKKyAoT3B0aW9uIEEpIGJ6dy4gMjEyMDAwMCBFUCAoT3B0aW9uIEIpLgorCisgQWJzLjIgKFJhdGVuemFobHVuZy9MYXVmemVpdCkJRHUgbXVzc3QgIGltbWVyIDgwMDAwICBwcm8gUmF0ZQorIHphaGxlbi4gRGFiZWkgaGFzdCBEdSB6d2VpIE1vZWdsaWNoa2VpdGVuOgorCisgQTogNCAgU3R1bmRlbglaZWl0ICBmdWVyIGplZGUgIFJhdGUuIFplaXQgIGF1Y2ggIGZ1ZXIgIGFuZGVyZQorIEFrdGl2aXRhZXRlbiAgaW0gTXVkICBhdXNzZXIgenUgTWV0emVsbi4gIEFscyBTdHJhZmUgZGFyZnN0IER1CisgZGFmdWVyIGluc2dlc2FtdCBldHdhcyBtZWhyIGxvZWhuZW4gYWxzIGJlaSBPcHRpb24gQi4KKyBCOiAyIFN0dW5kZW4gIFplaXQgIGZ1ZXIgIGplZGUgIFJhdGUuCUJydXRhbCwgIGFiZXIgIER1ICBiaXN0Cisgc2NobmVsbGVyICBmZXJ0aWcgbWl0CWRlbSBLcmFtLiBXYWVobCwgdW50ZXJzY2hyZWliLAl1bmQgZGllCisgWmVpdCBsYWV1ZnQgYmlzIGFsbGVzIGVpbmdlemFobHQgaXN0LgorCisgQWJzLjMgKFppbnNlcnRyYWcpICA2JSBaaW5zZW4gZC5oLiAgRHUgbXVzc3QgbmljaHQgZGVuICBnYW56ZW4KKyBCZXRyYWcgICgyNTQ0MDAwIGJ6dy4gMjEyMDAwMAlFUCksICBzb25kZXJuICBudXIgIGVpbmVuICBUZWlsCisgKDI0MDAwMDAgYnp3LiAyMDAwMDAwIEVQKSB6YWhsZW4uCisKKyBBYnMuNCAoRWluemFobHVuZykgIERpZSBFcmZhaHJ1bmcsICBkaWUgZGllIEJhbmsgaW50ZXJlc3NpZXJ0LAorIG11c3N0IER1ICBiZWltIE1ldHplbG4gIHVuZCBRdWVzdGVuIGF1ZmJyaW5nZW4uICBXb3JhdWYgRHUgZGVuCisgU2Nod2VycHVua3QgbGVnc3QsIGJsZWlidCBEaXIgZ2FueiBzZWxic3QgdWViZXJsYXNzZW4uIEVzIHdpcmQKKyB3YWVocmVuZCBkZXMgS2FtcGZlcyBhdXRvbWF0aXNjaCAgZWluIFRlaWwgZGVyIERpciB6dXN0ZWhlbmRlbgorIEVyZmFocnVuZyBhdWYgZGVuICBCTE9DSyB1bWdlYnVjaHQuICBEaWVzZW4gbXVzc3QgRHUgZGF6dSBhYmVyCisgZXJzdCBlaW5tYWwgYW56aWVoZW4uIFZvciBkZW0gS2FtcGYuICBEdSBrYW5uc3QgbmF0dWVybGljaCBudXIKKyBzb3ZpZWwgRXJmYWhydW5nIGltIEJsb2NrIHNwZWljaGVybiwgd2llIERlaW5lIFJhdGUgenVsYWVzc3QuCisKKyBBYnMuNSAoU2FldW1uaXNzKSAgRXMgZ2lidCB6d2VpICBNb2VnbGljaGtlaXRlbiAgYmVpIGRlciAgQmFuaworIG1laHIgRXJmYWhydW5nIHp1IGxhc3NlbjoKKyAxLiBEdQl1ZWJlcnppZWhzdCAgZWluZSAgUmF0ZW5mcmlzdCAgLT4gIEVpbmUgIFZlcnRyYWdzc3RyYWZlCisgaS5ILnYuIDQ4MDAwIEVQICg2MCUpIGlzdCAgaW5uZXJoYWxiIHZvbiAyIGJ6dy4gMSBPbmxpbmVzdHVuZGUKKyBiZWl6dWJyaW5nZW4uCisgMi4gRHUJdWViZXJ6aWVoc3QgIGF1Y2ggIGRpZQlTdHJhZmUgLT4gRGVpbmUgZ2VzYW10ZSAgYmlzaGVyCisgZWluZ2V6YWhsdGUgRXJmYWhydW5nIGlzdCBWRVJMT1JFTi4KKworWnUgQXJ0LiA1IChVbnRlcnNjaHJpZnQpOiAgRHUgbXVzc3QgZGVuIFZlcnRyYWcgIHVudGVyc2NocmVpYmVuCisoU1lOVEFYOiB1bnRlcnNjaHJlaWJlIHZlcnRyYWcpLgorCitadSBBcnQuIDYgKEVyZnVlbGx1bmcgZGVzIFZlcnRyYWdlcyk6ICBXZW5uIER1IGFsbGVzIGVpbmdlemFobHQKK2hhc3QgYmVrb21tc3QgRHUgRGVpbiBIYXVzLgorCitadSBBcnQuIDcgKEFuc3BydWVjaGUgIGRlcyBLdW5kZW4pOiBEdQloYXN0IGtlaW5lICBBbnNwcnVlY2hlLgorR2VuYXUgZGFzIHN0ZWh0IGF1Y2ggaW4gZGVuIEFHQi4KKworWnUgQW5oYW5nIEE6IER1ICBrYW5uc3QgIGRhcyAgSGF1cyAgaW4JZWluZW0gIGdld2lzc2VuICBSYWhtZW4KK3ZlcmFlbmRlcm4uCisKK1p1IEFuaGFuZyBCOiBNdW1waXR6ISAgS2VpbmUgIEdhcmFudGllCWZ1ZXIgIGdhciAgbmljaHRzICAoRGllCitHZmdXYm1iSCBpc3QgZWluZSAxMDAlIFRvY2h0ZXIgZGVyIE1vcmdlbkdyYXVlbi1CYW5rKSEKKwpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL3R4dC92ZXJ0cmFnLnR4dCBiL2Qvc2VoZXIvaGFldXNlci90eHQvdmVydHJhZy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNiY2QwNwotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci90eHQvdmVydHJhZy50eHQKQEAgLTAsMCArMSwxMzkgQEAKKyAgICAgICAgICAgICAgICAgICBCQVVTUEFSVkVSVFJBRyBmdWVyIFNFSEVSCisgICAgICAgICBNb3JnZW5HcmF1ZW4tQmFuaywgJ0RpZSBCYW5rIGluIElocmVtIFJ1ZWNrZW4nCisKK0FydC4gMSAoR2VnZW5zdGFuZCAgZGVzIFZlcnRyYWdlcyk6ICBHZWdlbnN0YW5kIGRpZXNlcyAgVmVydHJhZ2VzCitpc3QgZGllICB2ZXJ6aW5zbGljaGUgQW5zcGFydW5nIHZvbiAgRXJmYWhydW5nc3dlcnRlbiB6dW0gIFp3ZWNrZQorZGVyICAgRXJyaWNodHVuZyAgIGVpbmVyICAgZ2VlaWduZXRlbiAgIFdvaG5zdGFldHRlICAgZnVlciAgICBkZW4KK3VudGVyemVpY2huZW5kZW4gIFNlaGVyLiAgRWluZSAgdm9yemVpdGlnZSAgQXVzemFobHVuZyAoZC5oLiAgdm9yCitBYmxhdWYgIGRlcyBWZXJ0cmFnZXMpIGlzdCBuaWNodCB2b3JnZXNlaGVuLiBadXIgV29obnN0YWV0dGUgcy51LgorQXJ0LiAgMywgenVyICAgTGF1ZnplaXQgIHMudS4gQXJ0LiAgNCBBYnMuMiwgIHp1ciBFcmZ1ZWxsdW5nICBkZXMKK1ZlcnRyYWdlcyBzLnUuIEFydC4gNi4KKworQXJ0LiAgIDIgICAoUGFydGVpZW4pOiAgIFBhcnRlaWVuICBkaWVzZXMgICBWZXJ0cmFnZXMgIHNpbmQgICBkaWUKK01vcmdlbkdyYXVlbi1CYW5rIGF1ZiBkZXIgZWluZW4gU2VpdGUgKGltIGZvbGdlbmRlbiBCYW5rIGdlbmFubnQpCit1bmQgU2llLCAgZGVyIHVudGVyemVpY2huZW5kZSAgU2VoZXIgYXVmICBkZXIgIGFuZGVyZW4gU2VpdGUgIChpbQorZm9sZ2VuZGVuIFNlaGVyIGdlbmFubnQpLiBHZW1hZXNzIHVuc2VyZXIgVW50ZXJuZWhtZW5zcGhpbG9zb3BoaWUKK3NpbmQgQmFuayB1bmQgU2VoZXIgYmVpIGRpZXNlbSBSZWNodHNnZXNjaGFlZnQgIGdsZWljaGJlcmVjaHRpZ3RlCitQYXJ0bmVyLgorCitBcnQuICAzICAoV29obnN0YWV0dGUpOiAgQWxzICBnZWVpZ25ldGUgIFdvaG5zdGFldHRlIGkuUy4gIGRpZXNlcworVmVydHJhZ2VzICBnaWx0ICBkYXMgIE1vcmdlbkdyYXVlbi1TZWhlci1FaW5oZWl0c2hhdXMgICAoTUlOLU5vcm0KKzE1NjQ3KSwgd2VsY2hlcyAgamVkb2NoIGJlc2NocmFlbmt0ICAgbW9kaWZpemllcmJhciAgaXN0LiBadSAgZGVuCittb2VnbGljaGVuICBNb2RpZmlrYXRpb25lbiAgcy51LiBBbmhhbmcgIEEuIFp1bSAgVm9sdW1lbiB1bmQgIGRlbQorWmluc2VydHJhZyBkZXMgQmF1c3BhcnZlcnRyYWdlcyBzLnUuIEFydC4gNCBBYnMuMSB1bmQgIEFicy4zLgorCitBcnQuICA0IChGaW5hbnppZXJ1bmcpOiAgQWJzLjEgKEthcGl0YWx2b2x1bWVuKSAgRGFzIFZvbHVtZW4gIGRlcworVmVydHJhZ2VzIGlzdCB2YXJpYWJlbC4gRXMgYmVsYWV1ZnQgc2ljaCBiZWkgIE9wdGlvbiBBIChzLiBBYnMuMikKK2F1ZiAgMjU0NDAwMCwgIHVuZCBiZWkgT3B0aW9uIEIgIChzLiBBYnMuMikgIGF1ZiAyMTIwMDAwICBNb3JnZW4tCitHcmF1ZW4tRXJmYWhydW5nc3B1bmt0ZSAgKEVQKS4gIEluIGRpZXNlbiAgQmV0cmFnICBlaW5nZXNjaGxvc3Nlbgorc2luZCAgc293b2hsICBJaHJlIHp1ICBsZWlzdGVuZGVuIFphaGx1bmdlbiAgYWxzIGF1Y2ggZGVyIGVyd2lydC0KK3NjaGFmdGV0ZSBaaW5zZXJ0cmFnLgorCisgIEFicy4yICAoUmF0ZW56YWhsdW5nL0xhdWZ6ZWl0KSAgRGllICBCYW5rICBiaWV0ZXQgIElobmVuICAgendlaQorICB1bnRlcnNjaGllZGxpY2hlIE1vZWdsaWNoa2VpdGVuIGRlciBGaW5hbnppZXJ1bmc6CisgIE9wdGlvbiBBOiBERVIgU0FORlRFIFdFRyBaVU0gRUlHRU5IRUlNICAgIEJlaSBlaW5lciAgUmF0ZW5ob2VoZQorICB2b24gODAwMDAgRVAgIGlubmVyaGFsYiB2b24gamV3ZWlscyA0IE9ubGluZS1TdHVuZGVuIHVuZCAgZWluZXIKKyAgUmF0ZW5hbnphaGwgdm9uIDMwICBiZXRyYWVndCBkaWUgIEdlc2FtdGxhdWZ6ZWl0ICBkZXMgVmVydHJhZ2VzCisgIDEyMCBPbmxpbmUtU3R1bmRlbi4KKyAgT3B0aW9uIEI6IERFUiBTQ0hORUxMRSBXRUcgWlVNIEVJR0VOSEVJTSAgQmVpIGVpbmVyICBSYXRlbmhvZWhlCisgIHZvbiA4MDAwMCBFUCAgaW5uZXJoYWxiIHZvbiBqZXdlaWxzIDIgT25saW5lLVN0dW5kZW4gdW5kICBlaW5lcgorICBSYXRlbmFuemFobCAgdm9uIDI1IGJldHJhZWd0IGRpZSAgR2VzYW10bGF1ZnplaXQgZGVzICBWZXJ0cmFnZXMKKyAgNTAgT25saW5lLVN0dW5kZW4uCisgIERpZSBMYXVmemVpdCAgYmVnaW5udCBtaXQgZGVtIElua3JhZnR0cmV0ZW4gIGRlcyBWZXJ0cmFnZXMgIHVuZAorICBlbmRldCBtaXQgZGVyIEVyc3RlbGx1bmcgZGVzIGdld3VlbnNjaHRlbiBIYXVzZXMuIEJlaSBTYWV1bW5pc3MKKyAgZGVzIFNlaGVycyBzaW5kIGRpZSBCZXN0aW1tdW5nZW4gIGRlcyBBcnQuIDQgQWJzLjUgIGFuenV3ZW5kZW4uCisgIERlciAgVmVydHJhZyB3aXJkICBtaXQgZGVyIFVudGVyc2NocmlmdCAgZGVzIGpld2VpbGlnZW4gIFNlaGVycworICB3aXJrc2FtLiBadSBkZW4gQmVzdGltbXVuZ2VuICB1ZWJlciBkaWUgIFVudGVyc2NocmlmdCB3aXJkICBhdWYKKyAgQXJ0LiA1IHZlcndpZXNlbi4KKworICBBYnMuMyAoWmluc2VydHJhZykgRGVyIFppbnNzYXR6IGJlbGFldWZ0ICBzaWNoICBhdWYgNiwwMCUuICBEaWUKKyAgWmluc2VuIHdlcmRlbiBtaXQgRWluemFobHVuZyBkZXMgbGV0enRlbiBFcmZhaHJ1bmdzcHVua3RlcyAgYmUtCisgIHJlY2huZXQuIEhpZXJhdXMgZXJnaWJ0IHNpY2ggZWluIFppbnNlcnRyYWcgdm9uIGdlbmF1IDE0NDAwMCBFUAorICBiZWkgT3B0aW9uIEEgdW5kIDEyMDAwMCBiZWkgT3B0aW9uIEIuCisKKyAgQWJzLjQgIChFaW56YWhsdW5nKSAgRGllICBCYW5rICBiaWV0ZXQgIElobmVuICBlaW5lIGJpc2hlciAgbmllCisgIGRhZ2V3ZXNlbmUgIGZpbmFuemllbGxlIEZsZXhpYmlsaXRhZXQgbWl0IGRlbSBNRyAgTUFTVEVSLUJMT0NLLgorICBBdWNoIGJlaSB1bnZvcmhlcmdlc2VoZW5lbiB1bmQgc3BvbnRhbmVuIFJhdWJ6dWVnZW4ga29lbm5lbiBTaWUKKyAgc2ljaCBqZWRlcnplaXQgRXJmYWhydW5nc3B1bmt0ZSBndXRzY2hyZWliZW4gbGFzc2VuLiBTaWUgdHJhZ2VuCisgIG51ciAgSWhyZW4gIEJsb2NrIHdpZSBlaW4gIHVlYmxpY2hlcyBBbXVsZXR0IHVuZCAgd2FlaHJlbmQgIGRlcworICBLYW1wZmVzIG9kZXIgYXVjaCAgYmVpbSBMb2VzZW4gZWluZXIgUXVlc3QgIHdpcmQgaWhuZW4gZWluIFRlaWwKKyAgZGVyICBFcmZhaHJ1bmdzcHVua3RlICBndXRnZXNjaHJpZWJlbiAgKGJpcyAgenVyICBSYXRlbmhvZWNoc3QtCisgIGdyZW56ZSkuIEJhcmVpbnphaGx1bmcgZGVyIFJhdGVuIGlzdCBuaWNodCBtb2VnbGljaC4KKworICBBYnMuNSAoU2FldW1uaXNzKSBTYWV1bW5pc3MgaS5TLiBkaWVzZXMgVmVydHJhZ2VzIGJlc3RlaHQgaW1tZXIKKyAgZGFubiwgd2VubiAgZGVyIFVudGVyemVpY2huZW5kZSBkZW4gaW4gIEFydC4zICBBYnMuMiAgZ2VuYW5udGVuCisgIE1pbmRlc3RyYXRlbnplaXRyYXVtICB1ZWJlcnNjaHJlaXRldC4gRGFiZWkgd2lyZCB6dW5hZWNoc3QgZWluZQorICBWZXJ0cmFnc3N0cmFmZSBpbiBIb2VoZSB2b24gNjAlIGRlciAgUmF0ZSBmYWVsbGlnLiBXaXJkICBkYXJhdWYKKyAgZGllIFN0cmFmZSBuaWNodCAgaW5uZXJoYWxiIHZvbiAyIE9ubGluZS1TdHVuZGVuIChiZWkgT3B0aW9uIEEpCisgIG9kZXIgIDEgT25saW5lLVN0dW5kZSAgKGJlaSBPcHRpb24gQikgIHdhZWhyZW5kIGRlciAgbmF0dWVybGljaAorICB3ZWl0ZXJsYXVmZW5kZW4sICBub3JtYWxlbiAgUmF0ZW56YWhsdW5nc2ZyaXN0ICBiZWdsaWNoZW4sIGdpbHQKKyAgZGVyICBWZXJ0cmFnIGV4ICBudW5jICBhbHMgaGluZmFlbGxpZy4gQmVpICBIaW5mYWVsbGlna2VpdCAgZGVzCisgIFZlcnRyYWdzICB3aXJkICBkYXMgIGJpc2hlciBlaW5nZXphaGx0ZSAgS2FwaXRhbCB2b24gIGRlciAgQmFuaworICBlaW5iZWhhbHRlbi4KKworQXJ0LiA1ICAoVW50ZXJzY2hyaWZ0KTogQWxzICBndWVsdGlnZSBVbnRlcnNjaHJpZnQgIHdpcmQgbnVyICBlaW4KK2luZGl2aWR1ZWxsZXMgIFplaWNoZW4gIGF1ZiAgZGVtICBkYWZ1ZXIgIHZvcmdlc2VoZW5lbiAgUGxhdHogIGFtCit1bnRlcmVuLCAgcmVjaHRlbiAgUmFuZCAgZGVyICBsZXR6dGVuICAgU2VpdGUgIGRpZXNlcyAgIFZlcnRyYWdlcworenVnZWxhc3NlbiAoTUlOLU5vcm0gMzI0NTQpLiBadXIgU2ljaGVydW5nIGRlciBBdXRoZW50aXppdGFldCBkZXMKK0Rva3VtZW50cyBpc3QgZGllIFVudGVyc2NocmlmdCB3ZWl0ZXJoaW4gbWl0IEhlcnpibHV0IHp1IGxlaXN0ZW4uCitBbHMgU2NocmVpYnV0ZW5zaWwgd2VyZGVuIHNvd29obCBlaW5lIEZlZGVyIGFscyBhdWNoIGVpbiBTa2FscGVsbAordm9uIGRlciAgQmFuayB6dXIgVmVyZnVlZ3VuZyBnZXN0ZWxsdC4gRGllIFVudGVyc2NocmlmdCBrYW5uICBudXIKK2luIEFud2VzZW5oZWl0ICBlaW5lcyBhdXRvcmlzaWVydGVuICBBbmdlc3RlbGx0ZW4gdW5zZXJlcyAgSGF1c2VzCitnZWxlaXN0ZXQgd2VyZGVuLgorCitBcnQuIDYgKEVyZnVlbGx1bmcgZGVzIFZlcnRyYWdlcyk6IEJlaSAgRXJmdWVsbHVuZyBkZXMgIFZlcnRyYWdlcworbHQuIGRlbiBvLmEuIEFydC4gd2lyZCBkZW0gU2VoZXIgIGRhcyBIYXVzICBhbiBkZXIgIEF1c2dhYmVzdGVsbGUKK3NjaGx1ZXNzZWxmZXJ0aWcgYXVzZ2VsaWVmZXJ0LiBEZXIgRXJoYWx0IGlzdCB6dSBxdWl0dGllcmVuLgorCitBcnQuIDcgKEFuc3BydWVjaGUgIGRlcyBLdW5kZW4pICBGdWVyIGV0d2FpZ2UgIFNjaGFlZGVuIGFtICBMZXNlcgorZGllc2VzICBWZXJ0cmFnZXMgIHVlYmVybmltbXQgIGRpZSAgQmFuayAga2VpbmUgIEhhZnR1bmcsIGRhICBzaWUKK2F1c3NjaGxpZXNzbGljaCAgIGF1ZiAgIGZlaGxlcmhhZnRlcyAgIExlc2VuICAgb2RlciAgICBNaXNzYnJhdWNoCit6dXJ1ZWNrenVmdWVocmVuIHNpbmQuIEFuc29uc3RlbiBnYXJhbnRpZXJ0IGRpZSAgQmFuaywgZGFzcyAgc2ljaAorZGVyIFZlcnRyYWcgaW0gd2VzZW50bGljaGVuICAodW5kICAgbmljaHQgZXR3YSAga29tcGxldHQpIGFuICBkaWUKK2RlcnplaXRpZyAgIGd1ZWx0aWdlbiAgIFJlZ2VsbiAgIGRlciAgIGRldXRzY2hlbiAgICAgICBHcmFtbWF0aWssCitPcnRob2dyYXBoaWUsIHVuZCBTdGlsaXN0aWsgICh1bmQgbmljaHQgZXR3YSAgYW4gZGllICBSZWdlbG4gIGRlcworZ2VzdW5kZW4gIE1lbnNjaGVudmVyc3RhbmRlcykgIGhhZWx0LiAgQmV6dWVnbGljaCBhbGxlciAgdW5rbGFyZW4KK0JlZ3JpZmZlIGluIGRlbiBvLmEuIEFydC4sIHdlbGNoZSBzaWNoICBhdWYgYmFua2ludGVybmUgIEFibGFldWZlCitiZXppZWhlbiwgaGFiZW4gU2llIGRhcyBSZWNodCwgZGllIGluIGRlciBCYW5rICBhdXNoYWVuZ2VuZGVuIEFHQgorenUgIGxlc2VuLiAgVW5zZXJlICBmcmV1bmRsaWNoZW4gIGdlc2NodWx0ZW4gIE1pdGFyYmVpdGVyICB3ZXJkZW4KK3NpY2hlcmxpY2ggZ2VybmUgYXVmIGRpZSAgd2VuaWdlbiBub2NoICBvZmZlbmVuIEZyYWdlbiAgZWluZ2VoZW4uCitJbiBqZWRlbSBGYWxsIGdpbHQgZGFzICBSZWNodCBlaW5lciAgdm9uIHVucyAgaW0gU2NoYWRlbnNmYWxsICB6dQorYmVuZW5uZW5kZW4gUmVnaW9uLgorCitXaXIgZGFua2VuIElobmVuIGZ1ZXIgZGFzIGVudGdlZ2VuZ2VicmFjaHRlIFZlcnRyYXVlbgorCitpLkEuCitBdWZzaWNodHNyYXRzdm9yc2Nod2l0emVuZGVyIERyLiBmYWMuIGp1LiBCZWxkaW4KK09iZXJqdXJpc2Rpa3Rpb25zc2NocmF0IERyLiBoY2wuIE9saW0KKworCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVbnRlcnNjaHJpZnQgdm9uICoqKioqKioqKioqKQorCisKK0FuaGFuZyBBIChBdXN6dWcgYXVzICBkZW4gQmVzY2hsdWVzc2VuICBkZXIgTUctTm9ybWVua29uZmVyZW56KQorIk1vZGlmaWthdGlvbjoiCitbLi4uXQorRGFzICAgSGF1cyAgIHdpcmQgIGluICBlaW5oZWl0bGljaGVyICBHcm9lc3NlICAgdW5kICAgQXVzc3RhdHR1bmcKK2FuZ2VsaWVmZXJ0ICAoTUlOLU5vcm0gIDE1NjQ3KS4gIE1vZGVybmUgICBXZXJrc3RvZmZlICB3aWUgICB6LkIuCitkcmFjaGVub2RlbWdlYnJhbm50ZSAgTmFibGEtU2NobGFtbS1aaWVnZWwgIGdld2FlaHJsZWlzdGVuIHNvd29obAora29zdGVuZ3VlbnN0aWdlICBQcm9kdWt0aW9uLCAgYWxzICAgYXVjaCAgZWluZSAgZmFzdCAgdW5iZWdyZW56dGUKK0hhbHRiYXJrZWl0LiAgQWxsZSAgIEJhdXRlaWxlICAgc2luZCAgIG51bWVyaWVydCwgIHVtICAgbW9lZ2xpY2hlCitNb2RpZmlrYXRpb25lbiB6dSBlcmxlaWNodGVybi4gWy4uLl0KK0RlbSAgQmVzaXR6ZXIgaXN0IGVzICBlcmxhdWJ0IHNvd29obCAgYW4gZGVyIEZhc3NhZGUgd2llIGF1Y2ggIGltCitJbm5lcmVuIGdld2lzc2UsIGluZGl2aWR1ZWxsZSBNZXJrbWFsZSBlaW56dWJyaW5nZW4uCisKK0FuaGFuZyBCIChMaWVmZXJiZXN0aW1tdW5nIGRlciAgR2VzZWxsc2NoYWZ0IGZ1ZXIgZ2VtZWlubnVldHppZ2VuCisgICAgICAgICAgV29obnVuZ3NiYXUgbS5iLkguKQorWy4uLl0KK0lWLiBHYXJhbnRpZQorRGllIEdmZ1dibWJIIHVlYmVybmltbXQga2VpbmUgR2FyYW50aWUgZnVlciBkYXMgdW5laW5nZXNjaHJhZW5rdGUKK0Z1bmt0aW9uaWVyZW4gIGRlcyAgTW9yZ2VuZ3JhdWVuLVNlaGVyLUVpbmhlaXRzaGF1c2VzICAgKE1JTi1Ob3JtCisxNTY0NykgYmVpIGRlciBBdXNsaWVmZXJ1bmcuIEZlaGxlciBpbSwgc293aWUgYW0gIEhhdXMgc2luZCAgbmFjaAorZGVtIGRlcnplaXRpZ2VuIFN0YW5kICBkZXIgQmF1dGVjaG5payAgdW52ZXJtZWlkbGljaCB1bmQgIGZ1ZWhyZW4KK25pY2h0ICAgenUgICBFcnNhdHphbnNwcnVlY2hlbi4gICBGdWVyICAgZXR3YWlnZSAgIFNjaGFlZGVuICAgIGFtCitNb3JnZW5HcmF1ZW4tU2VoZXItRWluaGVpdHNoYXVzICAoTUlOLU5vcm0gIDE1NjQ3KSAgbmFjaCAgIGRlc3NlbgorQXVzbGllZmVydW5nICB1ZWJlcm5pbW10ICBkaWUgIEdmZ1dibWJIICBrZWluZSAgSGFmdHVuZywgIGRhICBzaWUKK2F1c3NjaGxpZXNzbGljaCAgIGF1ZiAgZmVobGVyaGFmdGVzICAgQmV3b2huZW4gIG9kZXIgICBNaXNzYnJhdWNoCit6dXJ1ZWNrenVmdWVocmVuICBzaW5kLgpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL3R4dC92ZXJ0cmFnX3JhdW0udHh0IGIvZC9zZWhlci9oYWV1c2VyL3R4dC92ZXJ0cmFnX3JhdW0udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzOTNmMzgKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvdHh0L3ZlcnRyYWdfcmF1bS50eHQKQEAgLTAsMCArMSwxNDIgQEAKKyAgICAgICAgICAgICAgICAgICBCQVVTUEFSVkVSVFJBRyBmdWVyIFNFSEVSCisgICAgICAgICAgICAgICAgICAgICAgLS0gQVVTQkFVVkVSVFJBRyAtLQorICAgICAgICAgTW9yZ2VuR3JhdWVuLUJhbmssICdEaWUgQmFuayBpbiBJaHJlbSBSdWVja2VuJworCitBcnQuIDEgKEdlZ2Vuc3RhbmQgIGRlcyBWZXJ0cmFnZXMpOiAgR2VnZW5zdGFuZCBkaWVzZXMgIFZlcnRyYWdlcworaXN0IGRpZSAgdmVyemluc2xpY2hlIEFuc3BhcnVuZyB2b24gIEVyZmFocnVuZ3N3ZXJ0ZW4genVtICBad2Vja2UKK2RlcyAgQXVzYmF1ZXMgIGRlciBXb2huc3RhZXR0ZSBkZXMgdW50ZXJ6ZWljaG5lbmRlbiAgU2VoZXJzLiBFaW5lCit2b3J6ZWl0aWdlICBBdXN6YWhsdW5nIChkLmguICB2b3IgQWJsYXVmIGRlcyBWZXJ0cmFnZXMpIGlzdCBuaWNodAordm9yZ2VzZWhlbi4gWnVtIEF1c2JhdSBkZXIgV29obnN0YWV0dGUgcy51LkFydC4gIDMsIHp1ciAgTGF1ZnplaXQKK3MudS4gQXJ0LiA0IEFicy4yLCB6dXIgRXJmdWVsbHVuZyBkZXMgVmVydHJhZ2VzIHMudS4gQXJ0LiA2LgorCitBcnQuICAgMiAgIChQYXJ0ZWllbik6ICAgUGFydGVpZW4gIGRpZXNlcyAgIFZlcnRyYWdlcyAgc2luZCAgIGRpZQorTW9yZ2VuR3JhdWVuLUJhbmsgYXVmIGRlciBlaW5lbiBTZWl0ZSAoaW0gZm9sZ2VuZGVuIEJhbmsgZ2VuYW5udCkKK3VuZCBTaWUsICBkZXIgdW50ZXJ6ZWljaG5lbmRlICBTZWhlciBhdWYgIGRlciAgYW5kZXJlbiBTZWl0ZSAgKGltCitmb2xnZW5kZW4gU2VoZXIgZ2VuYW5udCkuIEdlbWFlc3MgdW5zZXJlciBVbnRlcm5laG1lbnNwaGlsb3NvcGhpZQorc2luZCBCYW5rIHVuZCBTZWhlciBiZWkgZGllc2VtIFJlY2h0c2dlc2NoYWVmdCAgZ2xlaWNoYmVyZWNodGlndGUKK1BhcnRuZXIuCisKK0FydC4gIDMgKEF1c2JhdSBkZXIgV29obnN0YWV0dGUpOiBBbHMgQXVzYmF1IGRlciBXb2huc3RhZXR0ZSBpLlMuCitkaWVzZXMgICBWZXJ0cmFnZXMgICBnaWx0ICAgZGVyICAgTW9yZ2VuR3JhdWVuLVNlaGVyLUVpbmhlaXRzcmF1bQorKE1JTi1Ob3JtIDE1NjQ4KSwgd2VsY2hlciBqZWRvY2ggYmVzY2hyYWVua3QgIG1vZGlmaXppZXJiYXIgIGlzdC4KK1p1IGRlbiBtb2VnbGljaGVuIE1vZGlmaWthdGlvbmVuIHMudS4gQW5oYW5nICBBLiBadW0gIFZvbHVtZW4gdW5kCitkZW0gWmluc2VydHJhZyBkZXMgQmF1c3BhcnZlcnRyYWdlcyBzLnUuIEFydC4gNCBBYnMuMSB1bmQgIEFicy4zLgorCitBcnQuICA0IChGaW5hbnppZXJ1bmcpOiAgQWJzLjEgKEthcGl0YWx2b2x1bWVuKSAgRGFzIFZvbHVtZW4gIGRlcworVmVydHJhZ2VzIGlzdCB2YXJpYWJlbC4gRXMgYmVsYWV1ZnQgc2ljaCBiZWkgIE9wdGlvbiBBIChzLiBBYnMuMikKK2F1ZiAxMDE3NjAwLCB1bmQgYmVpIE9wdGlvbiBCIChzLkFicy4yKSBhdWYgODQ4MDAwICBNb3JnZW5HcmF1ZW4tCitFcmZhaHJ1bmdzcHVua3RlICAoRVApLiAgSW4gIGRpZXNlbiAgQmV0cmFnICBlaW5nZXNjaGxvc3NlbiAgc2luZAorc293b2hsIElocmUgenUgIGxlaXN0ZW5kZW4gWmFobHVuZ2VuIGFscyBhdWNoIGRlciBlcndpcnRzY2hhZnRldGUKK1ppbnNlcnRyYWcuCisKKyAgQWJzLjIgIChSYXRlbnphaGx1bmcvTGF1ZnplaXQpICBEaWUgIEJhbmsgIGJpZXRldCAgSWhuZW4gICB6d2VpCisgIHVudGVyc2NoaWVkbGljaGUgTW9lZ2xpY2hrZWl0ZW4gZGVyIEZpbmFuemllcnVuZzoKKyAgT3B0aW9uIEE6IERFUiBTQU5GVEUgV0VHIFpVTSBBVVNCQVUgICAgICAgQmVpIGVpbmVyICBSYXRlbmhvZWhlCisgIHZvbiA4MDAwMCBFUCAgaW5uZXJoYWxiIHZvbiBqZXdlaWxzIDQgT25saW5lLVN0dW5kZW4gdW5kICBlaW5lcgorICBSYXRlbmFuemFobCB2b24gMTIgIGJldHJhZWd0IGRpZSAgR2VzYW10bGF1ZnplaXQgIGRlcyBWZXJ0cmFnZXMKKyAgNDggT25saW5lLVN0dW5kZW4uCisgIE9wdGlvbiBCOiBERVIgU0NITkVMTEUgV0VHIFpVTSBBVVNCQVUgICAgIEJlaSBlaW5lciAgUmF0ZW5ob2VoZQorICB2b24gODAwMDAgRVAgIGlubmVyaGFsYiB2b24gamV3ZWlscyAyIE9ubGluZS1TdHVuZGVuIHVuZCAgZWluZXIKKyAgUmF0ZW5hbnphaGwgIHZvbiAxMCBiZXRyYWVndCBkaWUgIEdlc2FtdGxhdWZ6ZWl0IGRlcyAgVmVydHJhZ2VzCisgIDIwIE9ubGluZS1TdHVuZGVuLgorICBEaWUgTGF1ZnplaXQgIGJlZ2lubnQgbWl0IGRlbSBJbmtyYWZ0dHJldGVuICBkZXMgVmVydHJhZ2VzICB1bmQKKyAgZW5kZXQgbWl0IGRlbSAgRWluYmF1IGRlcyBBdXNiYXVzLiAgQmVpIFNhdW1uaXMgZGVzIFNlaGVycyBzaW5kCisgIHNpbmQgZGllIEJlc3RpbW11bmdlbiAgZGVzIEFydC4gNCBBYnMuNSAgYW56dXdlbmRlbi4KKyAgRGVyICBWZXJ0cmFnIHdpcmQgIG1pdCBkZXIgVW50ZXJzY2hyaWZ0ICBkZXMgamV3ZWlsaWdlbiAgU2VoZXJzCisgIHdpcmtzYW0uIFp1IGRlbiBCZXN0aW1tdW5nZW4gIHVlYmVyIGRpZSAgVW50ZXJzY2hyaWZ0IHdpcmQgIGF1ZgorICBBcnQuIDUgdmVyd2llc2VuLgorCisgIEFicy4zIChaaW5zZXJ0cmFnKSBEZXIgWmluc3NhdHogYmVsYWV1ZnQgIHNpY2ggIGF1ZiA2LDAwJS4gIERpZQorICBaaW5zZW4gd2VyZGVuIG1pdCBFaW56YWhsdW5nIGRlcyBsZXR6dGVuIEVyZmFocnVuZ3NwdW5rdGVzICBiZS0KKyAgcmVjaG5ldC4gSGllcmF1cyBlcmdpYnQgc2ljaCBlaW4gWmluc2VydHJhZyB2b24gZ2VuYXUgIDU3NjAwIEVQCisgIGJlaSBPcHRpb24gQSB1bmQgNDgwMDAgYmVpIE9wdGlvbiBCLgorCisgIEFicy40ICAoRWluemFobHVuZykgIERpZSAgQmFuayAgYmlldGV0ICBJaG5lbiAgZWluZSBiaXNoZXIgIG5pZQorICBkYWdld2VzZW5lICBmaW5hbnppZWxsZSBGbGV4aWJpbGl0YWV0IG1pdCBkZW0gTUcgIE1BU1RFUi1CTE9DSy4KKyAgQXVjaCBiZWkgdW52b3JoZXJnZXNlaGVuZW4gdW5kIHNwb250YW5lbiBSYXVienVlZ2VuIGtvZW5uZW4gU2llCisgIHNpY2ggamVkZXJ6ZWl0IEVyZmFocnVuZ3NwdW5rdGUgZ3V0c2NocmVpYmVuIGxhc3Nlbi4gU2llIHRyYWdlbgorICBudXIgIElocmVuICBCbG9jayB3aWUgZWluICB1ZWJsaWNoZXMgQW11bGV0dCB1bmQgIHdhZWhyZW5kICBkZXMKKyAgS2FtcGZlcyBvZGVyIGF1Y2ggIGJlaW0gTG9lc2VuIGVpbmVyIFF1ZXN0ICB3aXJkIGlobmVuIGVpbiBUZWlsCisgIGRlciAgRXJmYWhydW5nc3B1bmt0ZSAgZ3V0Z2VzY2hyaWViZW4gIChiaXMgIHp1ciAgUmF0ZW5ob2VjaHN0LQorICBncmVuemUpLiBCYXJlaW56YWhsdW5nIGRlciBSYXRlbiBpc3QgbmljaHQgbW9lZ2xpY2guCisKKyAgQWJzLjUgKFNhZXVtbmlzcykgU2FldW1uaXNzIGkuUy4gZGllc2VzIFZlcnRyYWdlcyBiZXN0ZWh0IGltbWVyCisgIGRhbm4sIHdlbm4gIGRlciBVbnRlcnplaWNobmVuZGUgZGVuIGluICBBcnQuMyAgQWJzLjIgIGdlbmFubnRlbgorICBNaW5kZXN0cmF0ZW56ZWl0cmF1bSAgdWViZXJzY2hyZWl0ZXQuIERhYmVpIHdpcmQgenVuYWVjaHN0IGVpbmUKKyAgVmVydHJhZ3NzdHJhZmUgaW4gSG9laGUgdm9uIDYwJSBkZXIgIFJhdGUgZmFlbGxpZy4gV2lyZCAgZGFyYXVmCisgIGRpZSBTdHJhZmUgbmljaHQgIGlubmVyaGFsYiB2b24gMiBPbmxpbmUtU3R1bmRlbiAoYmVpIE9wdGlvbiBBKQorICBvZGVyICAxIE9ubGluZS1TdHVuZGUgIChiZWkgT3B0aW9uIEIpICB3YWVocmVuZCBkZXIgIG5hdHVlcmxpY2gKKyAgd2VpdGVybGF1ZmVuZGVuLCAgbm9ybWFsZW4gIFJhdGVuemFobHVuZ3NmcmlzdCAgYmVnbGljaGVuLCBnaWx0CisgIGRlciAgVmVydHJhZyBleCAgbnVuYyAgYWxzIGhpbmZhZWxsaWcuIEJlaSAgSGluZmFlbGxpZ2tlaXQgIGRlcworICBWZXJ0cmFncyAgd2lyZCAgZGFzICBiaXNoZXIgZWluZ2V6YWhsdGUgIEthcGl0YWwgdm9uICBkZXIgIEJhbmsKKyAgZWluYmVoYWx0ZW4uCisKK0FydC4gNSAgKFVudGVyc2NocmlmdCk6IEFscyAgZ3VlbHRpZ2UgVW50ZXJzY2hyaWZ0ICB3aXJkIG51ciAgZWluCitpbmRpdmlkdWVsbGVzICBaZWljaGVuICBhdWYgIGRlbSAgZGFmdWVyICB2b3JnZXNlaGVuZW4gIFBsYXR6ICBhbQordW50ZXJlbiwgIHJlY2h0ZW4gIFJhbmQgIGRlciAgbGV0enRlbiAgIFNlaXRlICBkaWVzZXMgICBWZXJ0cmFnZXMKK3p1Z2VsYXNzZW4gKE1JTi1Ob3JtIDMyNDU0KS4gWnVyIFNpY2hlcnVuZyBkZXIgQXV0aGVudGl6aXRhZXQgZGVzCitEb2t1bWVudHMgaXN0IGRpZSBVbnRlcnNjaHJpZnQgd2VpdGVyaGluIG1pdCBIZXJ6Ymx1dCB6dSBsZWlzdGVuLgorQWxzIFNjaHJlaWJ1dGVuc2lsIHdlcmRlbiBzb3dvaGwgZWluZSBGZWRlciBhbHMgYXVjaCBlaW4gU2thbHBlbGwKK3ZvbiBkZXIgIEJhbmsgenVyIFZlcmZ1ZWd1bmcgZ2VzdGVsbHQuIERpZSBVbnRlcnNjaHJpZnQga2FubiAgbnVyCitpbiBBbndlc2VuaGVpdCAgZWluZXMgYXV0b3Jpc2llcnRlbiAgQW5nZXN0ZWxsdGVuIHVuc2VyZXMgIEhhdXNlcworZ2VsZWlzdGV0IHdlcmRlbi4KKworQXJ0LiA2IChFcmZ1ZWxsdW5nIGRlcyBWZXJ0cmFnZXMpOiBCZWkgIEVyZnVlbGx1bmcgZGVzICBWZXJ0cmFnZXMKK2x0LiAgZGVuIG8uYS4gQXJ0LiB3aXJkIGJlaSAgVm9ybGFnZSBkZXMgIFZlcnRyYWdlcyBhbiBkZXIgZGFmdWVyCitlaW5nZXJpY2h0ZXRlbiAgU3RlbGxlIGRlciBBdXNiYXUgZGVyICBIZWltc3RhdHQgZGVzIFNlaGVycyBkdXJjaAordW5zZXJlbiAgIEF1c2JhdXNlcnZpY2UgICBuYWNoICAgTUlOLU5vcm0gICAyMDgxNSAgIHVudmVyenVlZ2xpY2gKK3Zvcmdlbm9tbWVuLiAgIERlbSAgU2VoZXIgIGVudHN0ZWhlbiAgaGllcmR1cmNoICAga2VpbmUgIHdlaXRlcmVuCitWZXJwZmxpY2h0dW5nZW4uCisKK0FydC4gNyAoQW5zcHJ1ZWNoZSAgZGVzIEt1bmRlbikgIEZ1ZXIgZXR3YWlnZSAgU2NoYWVkZW4gYW0gIExlc2VyCitkaWVzZXMgIFZlcnRyYWdlcyAgdWViZXJuaW1tdCAgZGllICBCYW5rICBrZWluZSAgSGFmdHVuZywgZGEgIHNpZQorYXVzc2NobGllc3NsaWNoICAgYXVmICAgZmVobGVyaGFmdGVzICAgTGVzZW4gICBvZGVyICAgIE1pc3NicmF1Y2gKK3p1cnVlY2t6dWZ1ZWhyZW4gc2luZC4gQW5zb25zdGVuIGdhcmFudGllcnQgZGllICBCYW5rLCBkYXNzICBzaWNoCitkZXIgVmVydHJhZyBpbSB3ZXNlbnRsaWNoZW4gICh1bmQgICBuaWNodCBldHdhICBrb21wbGV0dCkgYW4gIGRpZQorZGVyemVpdGlnICAgZ3VlbHRpZ2VuICAgUmVnZWxuICAgZGVyICAgZGV1dHNjaGVuICAgICAgIEdyYW1tYXRpaywKK09ydGhvZ3JhcGhpZSwgdW5kIFN0aWxpc3RpayAgKHVuZCBuaWNodCBldHdhICBhbiBkaWUgIFJlZ2VsbiAgZGVzCitnZXN1bmRlbiAgTWVuc2NoZW52ZXJzdGFuZGVzKSAgaGFlbHQuICBCZXp1ZWdsaWNoIGFsbGVyICB1bmtsYXJlbgorQmVncmlmZmUgaW4gZGVuIG8uYS4gQXJ0Liwgd2VsY2hlIHNpY2ggIGF1ZiBiYW5raW50ZXJuZSAgQWJsYWV1ZmUKK2JlemllaGVuLCBoYWJlbiBTaWUgZGFzIFJlY2h0LCBkaWUgaW4gZGVyIEJhbmsgIGF1c2hhZW5nZW5kZW4gQUdCCit6dSAgbGVzZW4uICBVbnNlcmUgIGZyZXVuZGxpY2hlbiAgZ2VzY2h1bHRlbiAgTWl0YXJiZWl0ZXIgIHdlcmRlbgorc2ljaGVybGljaCBnZXJuZSBhdWYgZGllICB3ZW5pZ2VuIG5vY2ggIG9mZmVuZW4gRnJhZ2VuICBlaW5nZWhlbi4KK0luIGplZGVtIEZhbGwgZ2lsdCBkYXMgIFJlY2h0IGVpbmVyICB2b24gdW5zICBpbSBTY2hhZGVuc2ZhbGwgIHp1CitiZW5lbm5lbmRlbiBSZWdpb24uCisKK1dpciBkYW5rZW4gSWhuZW4gZnVlciBkYXMgZW50Z2VnZW5nZWJyYWNodGUgVmVydHJhdWVuCisKK2kuQS4KK0F1ZnNpY2h0c3JhdHN2b3JzY2h3aXR6ZW5kZXIgRHIuIGZhYy4ganUuIEJlbGRpbgorT2Jlcmp1cmlzZGlrdGlvbnNzY2hyYXQgRHIuIGhjbC4gT2xpbQorCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVudGVyc2NocmlmdCB2b24gKioqKioqKioqKiopCisKKworQW5oYW5nIEEgKEF1c3p1ZyBhdXMgIGRlbiBCZXNjaGx1ZXNzZW4gIGRlciBNRy1Ob3JtZW5rb25mZXJlbnopCisiTW9kaWZpa2F0aW9uOiIKK1suLi5dCitEZXIgIEF1c2JhdSAgd2lyZCAgaW4gIGVpbmhlaXRsaWNoZXIgIEdyb2Vzc2UgICB1bmQgICBBdXNzdGF0dHVuZworYW5nZWxpZWZlcnQgIChNSU4tTm9ybSAgMTU2NDgpLiAgIERlciAgRWluYmF1ICBkZXMgICBBdXNiYXVzICBpc3QKK2plZG9jaCAgIG51ciAgICB1bmQgICBhdXNzY2hsaWVzc2xpY2ggICAgZ2VzdGF0dGV0ICAgIGluICAgIGVpbmVtCitNb3JnZW5HcmF1ZW4tU2VoZXItRWluaGVpdHNoYXVzIChNSU4tTm9ybSAxNTY0OCkuICAgVW0gICBldHdhaWdlbQorTWlzc2JyYXVjaCB2b3J6dWJldWdlbiwgIGhhdCBkZXIgIEVpbmJhdSBkZXMgIEF1c2JhdXMgIG51ciAgZHVyY2gKK2dlc2NodWx0ZXMgRmFjaHBlcnNvbmFsIHp1IGVyZm9sZ2VuLiBbLi4uXQorRGVtICBCZXNpdHplciBpc3QgZXMgIGVybGF1YnQgaW0gIElubmVyZW4gIGdld2lzc2UsICBpbmRpdmlkdWVsbGUKK01lcmttYWxlIGVpbnp1YnJpbmdlbi4KKworQW5oYW5nIEIgKExpZWZlcmJlc3RpbW11bmcgZGVyICBHZXNlbGxzY2hhZnQgZnVlciBnZW1laW5udWV0emlnZW4KKyAgICAgICAgICBXb2hudW5nc2JhdSBtLmIuSC4pCitbLi4uXQorSVYuIEdhcmFudGllCitEaWUgR2ZnV2JtYkggdWViZXJuaW1tdCBrZWluZSBHYXJhbnRpZSBmdWVyIGRhcyB1bmVpbmdlc2NocmFlbmt0ZQorRnVua3Rpb25pZXJlbiAgZGVzICBNb3JnZW5ncmF1ZW4tU2VoZXItRWluaGVpdHNyYXVtZXMgICAoTUlOLU5vcm0KKzE1NjQ4KSBiZWkgZGVyIEF1c2xpZWZlcnVuZy4gRmVobGVyIGltLCBzb3dpZSBhbSAgUmF1bSBzaW5kICBuYWNoCitkZW0gZGVyemVpdGlnZW4gU3RhbmQgIGRlciBCYXV0ZWNobmlrICB1bnZlcm1laWRsaWNoIHVuZCAgZnVlaHJlbgorbmljaHQgICB6dSAgIEVyc2F0emFuc3BydWVjaGVuLiAgIEZ1ZXIgICBldHdhaWdlICAgU2NoYWVkZW4gICAgYW0KK01vcmdlbkdyYXVlbi1TZWhlci1FaW5oZWl0c3JhdW0gIChNSU4tTm9ybSAgMTU2NDgpICBuYWNoICAgZGVzc2VuCitFaW5iYXUgICB1ZWJlcm5pbW10ICAgZGllICAgR2ZnV2JtYkggICBrZWluZSAgIEhhZnR1bmcsICAgZGEgIHNpZQorYXVzc2NobGllc3NsaWNoICAgYXVmICBmZWhsZXJoYWZ0ZXMgICBCZXdvaG5lbiAgb2RlciAgIE1pc3NicmF1Y2gKK3p1cnVlY2t6dWZ1ZWhyZW4gIHNpbmQuCmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvdmlydHVhbF9jb21waWxlci5jIGIvZC9zZWhlci9oYWV1c2VyL3ZpcnR1YWxfY29tcGlsZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWQxYWI4Ci0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL3ZpcnR1YWxfY29tcGlsZXIuYwpAQCAtMCwwICsxLDE2NCBAQAorLyoqIExldHp0ZSBBZW5kZXJ1bmc6CisvLyAwMS4wNC4yMDA4IC0gT2JqZWt0ZSBkZXMgVkMgd2VyZGVuIGpldHp0IGltIG1lbW9yeSBnZXNwZWljaGVydAorLy8gICAgICAgICAgICAtIEtsZWluZXJlIEFlbmRlcnVuZ2VuIGltIENvZGUuCisvLyAwMS4wMS4yMDA3IC0gR3J1bmRsZWdlbmRlIFVlYmVyYXJiZWl0dW5nLCBWYW5pb24KKy8vICAgICAgICAgICAgLSBWZXJ3YWx0dW5nIGRlciBPYmpla3RlIGluIGVpbmVyIExpc3RlCisvLyAgICAgICAgICAgICAgRGFkdXJjaCBrYW5uIGxzIGRpZSBWQy1PYmpla3RlIGRhcnN0ZWxsZW4KKy8vICAgICAgICAgICAgLSBHZW5hdWVyZSBVZWJlcnBydWVmdW5nIGRlciBEYXRlaW5hbWVuIGF1ZiAKKy8vICAgICAgICAgICAgICBLb3JyZWt0aGVpdC4gRmFsbHMgZWluIGlsbGVnYWxlciBadWdyaWZmCisvLyAgICAgICAgICAgICAgc3RhdHRmaW5kZXQsIHdpcmRzIGdlbG9nZ3QuCisvLworKi8KKworI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgbm9fc2hhZG93CisjcHJhZ21hIG5vX2luaGVyaXQKKyNwcmFnbWEgdmVyYm9zZV9lcnJvcnMKKyNwcmFnbWEgY29tYmluZV9zdHJpbmdzCisjcHJhZ21hIHBlZGFudGljCisjcHJhZ21hIHdhcm5fZGVwcmVjYXRlZAorCisjaW5jbHVkZSAiaGF1cy5oIgorI2luY2x1ZGUgPHRoaW5nL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKworI2RlZmluZSBNRU1PUlkgIi9zZWN1cmUvbWVtb3J5IgorCitwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIG9iamVjdHM7Citwcml2YXRlIG5vc2F2ZSBpbnQgc2hvd19jbG9uZV9saXN0OworCisvKioKKyBJbml0aWFsaXNpZXJ1bmcKKyovCit2b2lkIGNyZWF0ZSgpCit7CisgIHNldGV1aWQoZ2V0dWlkKCkpOworCisgIC8vIFplaWdlciBhdWYgQ2xvbmVsaXN0ZSBob2xlbgorICBpZiAoY2FsbF9vdGhlcihNRU1PUlksIkhhdmVSaWdodHMiKSkgeworICAgIC8vIE9iamVrdHBvaW50ZXIgbGFkZW4KKyAgICBvYmplY3RzID0gKG1peGVkKSBjYWxsX290aGVyKE1FTU9SWSwiTG9hZCIsIm9iamVjdHMiKTsKKworICAgIC8vIEhhdHMgZ2VrbGFwcHQ/CisgICAgaWYgKCFtYXBwaW5ncChvYmplY3RzKSkgCisgICAgLy8gdmVybXV0bGljaCBub2NoIG5pY2h0IGluaXRpYWxpc2llcnQuCisgICAgLy8gWmVpZ2VyIGVyemV1Z2VuCisgICAgb2JqZWN0cyA9IChbXSk7IAorICAgIGNhbGxfb3RoZXIoTUVNT1JZLCJTYXZlIiwib2JqZWN0cyIsb2JqZWN0cyk7IC8vIFVuZCBpbiBkZW4gTWVtb3J5IHNjaHJlaWJlbgorICB9IGVsc2UgeworICAgIC8vIFdlbm4gaWNoIGtlaW5lbiBaZWlnZXIgaGFiZSwgbXVzcyBpY2ggaGFsdCBlaW5lbiBsb2thbGVuIG5laG1lbi4KKworICAgIG9iamVjdHMgPSAoW10pOworICB9CisKKyAgc2hvd19jbG9uZV9saXN0ID0gMDsgCit9CisKKy8qKgorIERpZSBGdW5rdGlvbiB3aXJkIHZvbSBHYW1lRHJpdmVyIGF1ZmdlcnVmZW4uIFdlbm4gZGllIE5hbWVuLQorIGtvbnZlbnRpb25lbiBwYXNzZW4sIGVyemV1Z3QgY29tcGlsZV9vYmplY3QgZWluIHBhc3NlbmRlcyBPYmpla3QKKyB1bmQgZ2lidCBlcyB6dXJ1ZWNrCisgXHBhcmFtIG5hbWUgTmFtZSBkZXMgenUgbGFkZW5kZW4gT2JqZWt0cworIFxyZXR1cm4gRGFzIGdlbGFkZW5lIHVuZCBpbml0aWFsaXNpZXJ0ZSBPYmpla3QKKyovCitvYmplY3QgY29tcGlsZV9vYmplY3Qoc3RyaW5nIG5hbWUpCit7CisgIG9iamVjdCBvYjsKKworICBpZiAobmFtZVs8Ni4uPDNdID09ICJoYXVzIiApCisgIHsKKyAgICBvYiA9IChvYmplY3QpIChWRVJXQUxURVIpLT5fTGFkZUhhdXMobmFtZVswLi48N10pOworICB9CisgIGVsc2UgaWYgKG5hbWVbPDcuLjw0XSA9PSAicmF1bSIgKQorICB7CisgICAgb2IgPSAob2JqZWN0KSAoVkVSV0FMVEVSKS0+X0xhZGVSYXVtKG5hbWVbMC4uPDhdLCB0b19pbnQobmFtZVs8My4uPDNdKSk7CisgIH0gCisgIGVsc2UgCisgIHsKKyAgICBsb2dfZmlsZSgic2VoZXIvaGFldXNlci92Y19sb2FkX2Vycm9yIiwgCisgICAgICBkdGltZSh0aW1lKCkpKyJcbiBGYWxzY2hlciBPYmpla3RuYW1lOiAiK25hbWUrIlxuIisKKyAgCSAgICAgICAgICIgUE86ICAiK29iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgxKSkrIixcbiIrCisgIAkgICAgICAgICAiIFBQTzogIitvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoMikpKyIsXG4iKworICAJICAgICAgICAgIiBUSTogICIrb2JqZWN0X25hbWUodGhpc19pbnRlcmFjdGl2ZSgpKSsiLlxuXG4iKTsKKyAgCXJldHVybiAwOworICB9CisgIAorICAvLyBPYmpla3Qgc3BlaWNoZXJuIChmdWVyIGxzKQorICBpZiAob2JqZWN0cChvYikpIG9iamVjdHNbbmFtZV0gPSBvYjsKKworICByZXR1cm4gb2I7Cit9CisKKy8qKgorICBTb2xsIGRpZSBMaXN0ZSBkZXIgT2JqZWt0ZSB6dW0gVkMgcGVyIFF1ZXJ5T2JqZWN0cyBhdXNnZWdlYmVuIHdlcmRlbiBvZGVyIG5pY2h0PworKi8KKyAgCitpbnQgVG9nZ2xlQ2xvbmVMaXN0KCkKK3sKKyAgc2hvd19jbG9uZV9saXN0IF49IDE7CisgIHRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksICJEaWUgQ2xvbmUgTGlzdCB3aXJkIG51biAiKworICAgICAgICAoc2hvd19jbG9uZV9saXN0PyIiOiJuaWNodCBtZWhyICIpKyJhbmdlemVpZ3QuXG4iKTsKK30KKworLyoqCisgcmV0dXJuIGFsbCBjbG9uZWQgdmlydHVhbCBvYmplY3RzLCB3aXJkIHp1bSBCZWlzcGllbCBmdWVyICJscyIgYmVudXR6dC4KKyovCittaXhlZCBRdWVyeU9iamVjdHMoKQoreworICBpZiAoc2hvd19jbG9uZV9saXN0KQorICAgIHJldHVybiBtX3ZhbHVlcyhvYmplY3RzKS0oezB9KTsKKyAgZWxzZSAKKyAgICByZXR1cm4gKHt9KTsKK30KKworLyoqCisgIE51ciBFTSB1bmQgTWFpbnRhaW5lciBkdWVyZmVuIGRpZSBzaWNoZXJlbiBGdW5rdGlvbmVuIG51dHplbgorKi8KK2ludCBzZWN1cmUoKQoreworCWlmIChBUkNIX1NFQ1VSSVRZIHx8IElTX01BSU5UQUlORVIodGhpc19pbnRlcmFjdGl2ZSgpKSkgCisJICByZXR1cm4gMTsKKwllbHNlICAKKwkgIHJldHVybiAwOworfQorCisvKgorLyoqCisgRGllIEZ1bmt0aW9uIHZlcnN1Y2h0LCBkaWUgQ2xvbmVzIGRpZXNlcyBWQ3MgYXVzIGRlciBPYmpla3QgTGlzdCAKKyB6dSByZWdlbmVyaWVyZW4KKyovCisvKgoraW50IHJlZ2VuZXJhdGVfY2xvbmVfbGlzdCgpCit7CisJaWYgKHNpemVvZihvYmplY3RzKT09MCkKKwlIREVCVUcoIlRiZDogcmVnZW5lcmF0ZV9jbG9uZV9saXN0IGltIHZjIik7CisJCisJcmV0dXJuIDE7Cit9CisqLworCisvKioKKyAgRGllIEZ1bmt0aW9uIHplcnN0b2VydCBhbGxlIGJlcmVpdHMgZ2VjbG9udGVuIFNlaGVyaGF1c29iamVrdGUKKyAgRGFzIGdpYnQgd2lya2xpY2ggbnVyIGlycmUgd2VuaWdlIE1vbWVudGUsIHdvIGRhcyBuaWNodCBzY2hsZWNodCBpc3QuCisqLworaW50IGRlc2N0cnVjdF9hbGxfbXlfY2xvbmVzKCkKK3sKKyAgbWl4ZWQgb2I7CisKKyAgaWYgKCFzZWN1cmUoKSkgcmV0dXJuIDA7CisKKyAgaWYoIW1hcHBpbmdwKG9iamVjdHMpKSByZXR1cm4gMDsKKyAgCisgIGZvcihvYiA9IFF1ZXJ5T2JqZWN0cygpOyBzaXplb2Yob2IpOyBvYiA9IG9iWzEuLl0pCisgIHsKKyAgICBpZihvYmplY3RwKG9iWzBdKSkKKyAgICB7CisgICAgICBvYlswXS0+cmVtb3ZlKCk7CisgICAgICBpZihvYmplY3RwKG9iWzBdKSkgZGVzdHJ1Y3Qob2JbMF0pOworICAgIH0KKyAgfQorICAgCisgIHJldHVybiAxOworfQorCmRpZmYgLS1naXQgYS9kb2MvLmlkeCBiL2RvYy8uaWR4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYjYyNDUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvLmlkeApAQCAtMCwwICsxLDEyMTggQEAKKy4JCitHcnVuZGxhZ2VuCUdydW5kbGFnZW4KK09iamVrdGUJR3J1bmRsYWdlbi9PYmpla3RlCitFZmZpemllbnoJR3J1bmRsYWdlbi9FZmZpemllbnoKK0VmZml6aWVuei4wCUdydW5kbGFnZW4vRWZmaXppZW56LjAKK2VmdW4JZWZ1bgordHJhbnNwb3NlX2FycmF5CWVmdW4vdHJhbnNwb3NlX2FycmF5CitmaW5kX3BsYXllcgllZnVuL2ZpbmRfcGxheWVyCit3cml0ZV9maWxlCWVmdW4vd3JpdGVfZmlsZQord3JpdGVfYnl0ZXMJZWZ1bi93cml0ZV9ieXRlcword3JpdGUJZWZ1bi93cml0ZQord2l6bGlzdF9pbmZvCWVmdW4vd2l6bGlzdF9pbmZvCit1c2VycwllZnVuL3VzZXJzCit3aXpsaXN0CWVmdW4vd2l6bGlzdAord2Fsa19tYXBwaW5nCWVmdW4vd2Fsa19tYXBwaW5nCit1bmlxdWVfYXJyYXkJZWZ1bi91bmlxdWVfYXJyYXkKK3Vuc2hhZG93CWVmdW4vdW5zaGFkb3cKK3VuYm91bmRfbGFtYmRhCWVmdW4vdW5ib3VuZF9sYW1iZGEKK3R5cGVvZgllZnVuL3R5cGVvZgordHJhY2VwcmVmaXgJZWZ1bi90cmFjZXByZWZpeAordHJhbnNmZXIJZWZ1bi90cmFuc2ZlcgordG9fc3RyaW5nCWVmdW4vdG9fc3RyaW5nCit0cmFjZQllZnVuL3RyYWNlCit0b19pbnQJZWZ1bi90b19pbnQKK3RoaXNfcGxheWVyCWVmdW4vdGhpc19wbGF5ZXIKK3RvX2Zsb2F0CWVmdW4vdG9fZmxvYXQKK3RvX2FycmF5CWVmdW4vdG9fYXJyYXkKK3RpbWUJZWZ1bi90aW1lCit0aHJvdwllZnVuL3Rocm93Cit0aGlzX2ludGVyYWN0aXZlCWVmdW4vdGhpc19pbnRlcmFjdGl2ZQordGFuCWVmdW4vdGFuCit0aGlzX29iamVjdAllZnVuL3RoaXNfb2JqZWN0Cit0ZWxsX29iamVjdAllZnVuL3RlbGxfb2JqZWN0Cit0ZWxsX3Jvb20JZWZ1bi90ZWxsX3Jvb20KK3Rlc3RfYml0CWVmdW4vdGVzdF9iaXQKK3N5bWJvbHAJZWZ1bi9zeW1ib2xwCit0YWlsCWVmdW4vdGFpbAorc2h1dGRvd24JZWZ1bi9zaHV0ZG93bgorc2luCWVmdW4vc2luCitzeW1ib2xfZnVuY3Rpb24JZWZ1bi9zeW1ib2xfZnVuY3Rpb24KK3N3YXAJZWZ1bi9zd2FwCitzdHJzdHIJZWZ1bi9zdHJzdHIKK3N0cmxlbgllZnVuL3N0cmxlbgorc3RyaW5ncAllZnVuL3N0cmluZ3AKK3NzY2FuZgllZnVuL3NzY2FuZgorc3ByaW50ZgllZnVuL3NwcmludGYKK3NxcnQJZWZ1bi9zcXJ0Citzb3J0X2FycmF5CWVmdW4vc29ydF9hcnJheQorc25vb3AJZWZ1bi9zbm9vcAorc2xpY2VfYXJyYXkJZWZ1bi9zbGljZV9hcnJheQorc2l6ZW9mCWVmdW4vc2l6ZW9mCitzZXRldWlkCWVmdW4vc2V0ZXVpZAorc2hhZG93CWVmdW4vc2hhZG93CitzaG91dAllZnVuL3Nob3V0CitzZXRfZXh0cmFfd2l6aW5mb19zaXplCWVmdW4vc2V0X2V4dHJhX3dpemluZm9fc2l6ZQorc2V0X3RoaXNfcGxheWVyCWVmdW4vc2V0X3RoaXNfcGxheWVyCitzZXRfdGhpc19vYmplY3QJZWZ1bi9zZXRfdGhpc19vYmplY3QKK3NpemVvZgllZnVuL3NpemVvZgorc2F5CWVmdW4vc2F5CitzZXRfbW9kaWZ5X2NvbW1hbmQJZWZ1bi9zZXRfbW9kaWZ5X2NvbW1hbmQKK3NldF9wcm9tcHQJZWZ1bi9zZXRfcHJvbXB0CitybQllZnVuL3JtCitzZXRfbGlnaHQJZWZ1bi9zZXRfbGlnaHQKK3NldF9saXZpbmdfbmFtZQllZnVuL3NldF9saXZpbmdfbmFtZQorc2V0X2hlYXJ0X2JlYXQJZWZ1bi9zZXRfaGVhcnRfYmVhdAorc2V0X2lzX3dpemFyZAllZnVuL3NldF9pc193aXphcmQKK3NldF9leHRyYV93aXppbmZvCWVmdW4vc2V0X2V4dHJhX3dpemluZm8KK3NhdmVfb2JqZWN0CWVmdW4vc2F2ZV9vYmplY3QKK3NldF9iaXQJZWZ1bi9zZXRfYml0CityZW5hbWUJZWZ1bi9yZW5hbWUKK3NldF9hdXRvX2luY2x1ZGVfc3RyaW5nCWVmdW4vc2V0X2F1dG9faW5jbHVkZV9zdHJpbmcKK3NlbmRfaW1wCWVmdW4vc2VuZF9pbXAKK3JtZGlyCWVmdW4vcm1kaXIKK3J1c2FnZQllZnVuL3J1c2FnZQorcmVzdG9yZV9vYmplY3QJZWZ1bi9yZXN0b3JlX29iamVjdAorcXVlcnlfb25jZV9pbnRlcmFjdGl2ZQllZnVuL3F1ZXJ5X29uY2VfaW50ZXJhY3RpdmUKK3JlcGxhY2VfcHJvZ3JhbQllZnVuL3JlcGxhY2VfcHJvZ3JhbQorcmVuYW1lX29iamVjdAllZnVuL3JlbmFtZV9vYmplY3QKK3JlbW92ZV9jYWxsX291dAllZnVuL3JlbW92ZV9jYWxsX291dAorcmVtb3ZlX2FjdGlvbgllZnVuL3JlbW92ZV9hY3Rpb24KK3JlbW92ZV9hbGlzdAllZnVuL3JlbW92ZV9hbGlzdAorcmVmZXJlbmNlcAllZnVuL3JlZmVyZW5jZXAKK3JlbW92ZV9pbnRlcmFjdGl2ZQllZnVuL3JlbW92ZV9pbnRlcmFjdGl2ZQorcmVhZF9maWxlCWVmdW4vcmVhZF9maWxlCityZWdleHBsb2RlCWVmdW4vcmVnZXhwbG9kZQorcmVnZXhwCWVmdW4vcmVnZXhwCityZWFkX2J5dGVzCWVmdW4vcmVhZF9ieXRlcworcmFpc2VfZXJyb3IJZWZ1bi9yYWlzZV9lcnJvcgorcmFuZG9tCWVmdW4vcmFuZG9tCitxdWVyeV92ZXJiCWVmdW4vcXVlcnlfdmVyYgorcXVvdGUJZWZ1bi9xdW90ZQorcXVlcnlfbG9hZF9hdmVyYWdlCWVmdW4vcXVlcnlfbG9hZF9hdmVyYWdlCitxdWVyeV9zbm9vcAllZnVuL3F1ZXJ5X3Nub29wCitxdWVyeV9tdWRfcG9ydAllZnVuL3F1ZXJ5X211ZF9wb3J0CitxdWVyeV9pbnB1dF9wZW5kaW5nCWVmdW4vcXVlcnlfaW5wdXRfcGVuZGluZworcXVlcnlfaXBfbnVtYmVyCWVmdW4vcXVlcnlfaXBfbnVtYmVyCitxdWVyeV9pcF9uYW1lCWVmdW4vcXVlcnlfaXBfbmFtZQorcXVlcnlfaW1wX3BvcnQJZWZ1bi9xdWVyeV9pbXBfcG9ydAorcXVlcnlfZWRpdGluZwllZnVuL3F1ZXJ5X2VkaXRpbmcKK3F1ZXJ5X2lkbGUJZWZ1bi9xdWVyeV9pZGxlCitpbnRlcmFjdGl2ZQllZnVuL2ludGVyYWN0aXZlCitsb2cJZWZ1bi9sb2cKK3F1ZXJ5X2FjdGlvbnMJZWZ1bi9xdWVyeV9hY3Rpb25zCitwcm9ncmFtX3RpbWUJZWZ1bi9wcm9ncmFtX3RpbWUKK3ByaW50ZgllZnVuL3ByaW50ZgorcXVlcnlfaG9zdF9uYW1lCWVmdW4vcXVlcnlfaG9zdF9uYW1lCitwcm9jZXNzX3N0cmluZwllZnVuL3Byb2Nlc3Nfc3RyaW5nCitwcmV2aW91c19vYmplY3QJZWZ1bi9wcmV2aW91c19vYmplY3QKK3BvaW50ZXJwCWVmdW4vcG9pbnRlcnAKK3Blb3BsZQllZnVuL3Blb3BsZQorcHJlc2VudAllZnVuL3ByZXNlbnQKK3BhcnNlX2NvbW1hbmQJZWZ1bi9wYXJzZV9jb21tYW5kCitwYXJzZV9jb21tYW5kLjEJZWZ1bi9wYXJzZV9jb21tYW5kLjEKK29yZGVyX2FsaXN0CWVmdW4vb3JkZXJfYWxpc3QKK29iamVjdHAJZWZ1bi9vYmplY3RwCituZWdhdGUJZWZ1bi9uZWdhdGUKK25vdGlmeV9mYWlsCWVmdW4vbm90aWZ5X2ZhaWwKK25leHRfaW52ZW50b3J5CWVmdW4vbmV4dF9pbnZlbnRvcnkKK21rZGlyCWVmdW4vbWtkaXIKK21vdmVfb2JqZWN0CWVmdW4vbW92ZV9vYmplY3QKK21lbWJlcl9hcnJheQllZnVuL21lbWJlcl9hcnJheQorbWttYXBwaW5nCWVmdW4vbWttYXBwaW5nCittYXBwaW5ncAllZnVuL21hcHBpbmdwCittX2NvbnRhaW5zCWVmdW4vbV9jb250YWlucworbWVtYmVyCWVmdW4vbWVtYmVyCittYXAJZWZ1bi9tYXAKK21fdmFsdWVzCWVmdW4vbV92YWx1ZXMKK21hcF9pbmRpY2VzCWVmdW4vbWFwX2luZGljZXMKK21hcF9vYmplY3RzCWVmdW4vbWFwX29iamVjdHMKK21faW5kaWNlcwllZnVuL21faW5kaWNlcworbV9kZWxldGUJZWZ1bi9tX2RlbGV0ZQorbG9nX2ZpbGUJZWZ1bi9sb2dfZmlsZQorbG93ZXJfY2FzZQllZnVuL2xvd2VyX2Nhc2UKK2xpdmluZwllZnVuL2xpdmluZworbGFtYmRhCWVmdW4vbGFtYmRhCitpbnRwCWVmdW4vaW50cAorZnVuY3Rpb25fZXhpc3RzCWVmdW4vZnVuY3Rpb25fZXhpc3RzCitpbnRlcnNlY3RfYWxpc3QJZWZ1bi9pbnRlcnNlY3RfYWxpc3QKK2luc2VydF9hbGlzdC5vcmlnCWVmdW4vaW5zZXJ0X2FsaXN0Lm9yaWcKK2luc2VydF9hbGlzdC5yZWoJZWZ1bi9pbnNlcnRfYWxpc3QucmVqCitpbmhlcml0X2xpc3QJZWZ1bi9pbmhlcml0X2xpc3QKK2lucHV0X3RvCWVmdW4vaW5wdXRfdG8KK2ltcGxvZGUJZWZ1bi9pbXBsb2RlCitpbnNlcnRfYWxpc3QJZWZ1bi9pbnNlcnRfYWxpc3QKK2hlYXJ0X2JlYXRfaW5mbwllZnVuL2hlYXJ0X2JlYXRfaW5mbworZ2V0X3R5cGVfaW5mbwllZnVuL2dldF90eXBlX2luZm8KK2dldGV1aWQJZWZ1bi9nZXRldWlkCitnZXR1aWQJZWZ1bi9nZXR1aWQKK2dldF9lcnJvcl9maWxlCWVmdW4vZ2V0X2Vycm9yX2ZpbGUKK2dldF9leHRyYV93aXppbmZvCWVmdW4vZ2V0X2V4dHJhX3dpemluZm8KK2dldF9ldmFsX2Nvc3QJZWZ1bi9nZXRfZXZhbF9jb3N0CitnZXRfZGlyCWVmdW4vZ2V0X2RpcgorZ2FyYmFnZV9jb2xsZWN0aW9uCWVmdW4vZ2FyYmFnZV9jb2xsZWN0aW9uCitmdW5jYWxsCWVmdW4vZnVuY2FsbAorZmluZF9vYmplY3QJZWZ1bi9maW5kX29iamVjdAorZmlyc3RfaW52ZW50b3J5CWVmdW4vZmlyc3RfaW52ZW50b3J5CitmdW5jdGlvbmxpc3QJZWZ1bi9mdW5jdGlvbmxpc3QKK2Zsb2F0cAllZnVuL2Zsb2F0cAorZW5hYmxlX2NvbW1hbmRzCWVmdW4vZW5hYmxlX2NvbW1hbmRzCitmaWx0ZXJfb2JqZWN0cwllZnVuL2ZpbHRlcl9vYmplY3RzCitmaW5kX2xpdmluZwllZnVuL2ZpbmRfbGl2aW5nCitmaW5kX2NhbGxfb3V0CWVmdW4vZmluZF9jYWxsX291dAorZmlsdGVyCWVmdW4vZmlsdGVyCitmaWx0ZXJfaW5kaWNlcwllZnVuL2ZpbHRlcl9pbmRpY2VzCitmaWxlX3NpemUJZWZ1bi9maWxlX3NpemUKK29iamVjdF9uYW1lCWVmdW4vb2JqZWN0X25hbWUKK2ZpbGVfdGltZQllZnVuL2ZpbGVfdGltZQorZXhwb3J0X3VpZAllZnVuL2V4cG9ydF91aWQKK2V4dHJhY3QJZWZ1bi9leHRyYWN0CitleHBsb2RlCWVmdW4vZXhwbG9kZQorZXhjbHVkZV9hcnJheQllZnVuL2V4Y2x1ZGVfYXJyYXkKK2V4cAllZnVuL2V4cAorZXhlYwllZnVuL2V4ZWMKK2V4Y2x1ZGVfYWxpc3QJZWZ1bi9leGNsdWRlX2FsaXN0CitlZAllZnVuL2VkCitlbnZpcm9ubWVudAllZnVuL2Vudmlyb25tZW50CitkZWJ1Z19pbmZvCWVmdW4vZGVidWdfaW5mbworZWZ1bgllZnVuL2VmdW4KK2NvcwllZnVuL2NvcworZGVzdHJ1Y3QJZWZ1bi9kZXN0cnVjdAorY3J5cHQJZWZ1bi9jcnlwdAorZGlzYWJsZV9jb21tYW5kcwllZnVuL2Rpc2FibGVfY29tbWFuZHMKK2NhbGxlcl9zdGFja19kZXB0aAllZnVuL2NhbGxlcl9zdGFja19kZXB0aAorZGVlcF9pbnZlbnRvcnkJZWZ1bi9kZWVwX2ludmVudG9yeQorY3RpbWUJZWZ1bi9jdGltZQorY3JlYXRlX3dpemFyZAllZnVuL2NyZWF0ZV93aXphcmQKK2NyZWF0b3IJZWZ1bi9jcmVhdG9yCitjb3B5CWVmdW4vY29weQorY29tbWFuZAllZnVuL2NvbW1hbmQKK2Nsb25lX29iamVjdAllZnVuL2Nsb25lX29iamVjdAorY2xvc3VyZXAJZWZ1bi9jbG9zdXJlcAorY2F0Y2gJZWZ1bi9jYXRjaAorY2xlYXJfYml0CWVmdW4vY2xlYXJfYml0CitjaW5kZW50CWVmdW4vY2luZGVudAorY2F0CWVmdW4vY2F0CitjYWxsX3Jlc29sdmVkCWVmdW4vY2FsbF9yZXNvbHZlZAorY2FsbF9vdXRfaW5mbwllZnVuL2NhbGxfb3V0X2luZm8KK2NhcGl0YWxpemUJZWZ1bi9jYXBpdGFsaXplCitjYWxsX290aGVyCWVmdW4vY2FsbF9vdGhlcgorY2FsbF9vdXQJZWZ1bi9jYWxsX291dAorYWxsb2NhdGVfbWFwcGluZwllZnVuL2FsbG9jYXRlX21hcHBpbmcKK2JyZWFrX3N0cmluZwllZnVuL2JyZWFrX3N0cmluZworYXNzb2MJZWZ1bi9hc3NvYworYmluZF9sYW1iZGEJZWZ1bi9iaW5kX2xhbWJkYQorYXRhbgllZnVuL2F0YW4KK2FwcGx5CWVmdW4vYXBwbHkKK2JyZWFrX3BvaW50CWVmdW4vYnJlYWtfcG9pbnQKK2FsbG9jYXRlCWVmdW4vYWxsb2NhdGUKK2FkZF93b3J0aAllZnVuL2FkZF93b3J0aAorYXNpbgllZnVuL2FzaW4KK2FsbF9pbnZlbnRvcnkJZWZ1bi9hbGxfaW52ZW50b3J5CithZGRfeHZlcmIJZWZ1bi9hZGRfeHZlcmIKK3NlbmRfZXJxCWVmdW4vc2VuZF9lcnEKK2FkZF92ZXJiCWVmdW4vYWRkX3ZlcmIKK2Fjb3MJZWZ1bi9hY29zCithZGRfYWN0aW9uCWVmdW4vYWRkX2FjdGlvbgorYXR0YWNoX2VycV9kZW1vbgllZnVuL2F0dGFjaF9lcnFfZGVtb24KK2JpbmFyeV9tZXNzYWdlCWVmdW4vYmluYXJ5X21lc3NhZ2UKK2RlYnVnX21lc3NhZ2UJZWZ1bi9kZWJ1Z19tZXNzYWdlCitzZXRfZW52aXJvbm1lbnQJZWZ1bi9zZXRfZW52aXJvbm1lbnQKK2V4dGVybl9jYWxsCWVmdW4vZXh0ZXJuX2NhbGwKK2xhc3RfaW5zdHJ1Y3Rpb25zCWVmdW4vbGFzdF9pbnN0cnVjdGlvbnMKK3F1ZXJ5X3NoYWRvd2luZwllZnVuL3F1ZXJ5X3NoYWRvd2luZworc2V0X2J1ZmZlcl9zaXplCWVmdW4vc2V0X2J1ZmZlcl9zaXplCitzZXRfY29ubmVjdGlvbl9jaGFyc2V0CWVmdW4vc2V0X2Nvbm5lY3Rpb25fY2hhcnNldAorc2V0X2RyaXZlcl9ob29rCWVmdW4vc2V0X2RyaXZlcl9ob29rCitzeW1ib2xfdmFyaWFibGUJZWZ1bi9zeW1ib2xfdmFyaWFibGUKK3RvX29iamVjdAllZnVuL3RvX29iamVjdAorZGVlcF9wcmVzZW50CWVmdW4vZGVlcF9wcmVzZW50CitlZnVuOjptX2RlbGV0ZQllZnVuL2VmdW46Om1fZGVsZXRlCitlZnVuOjpleHBsb2RlCWVmdW4vZWZ1bjo6ZXhwbG9kZQorYWxsX2Vudmlyb25tZW50CWVmdW4vYWxsX2Vudmlyb25tZW50CitkdGltZQllZnVuL2R0aW1lCitmaW5kX2xpdmluZ3MJZWZ1bi9maW5kX2xpdmluZ3MKK2ZpbmRfbmV0ZGVhZAllZnVuL2ZpbmRfbmV0ZGVhZAoraXNfY2xvbmUJZWZ1bi9pc19jbG9uZQorbG93ZXJjaGFyCWVmdW4vbG93ZXJjaGFyCitsb3dlcnN0cmluZwllZnVuL2xvd2Vyc3RyaW5nCittYXRjaF9saXZpbmcJZWZ1bi9tYXRjaF9saXZpbmcKK25ld19leHBsb2RlCWVmdW4vbmV3X2V4cGxvZGUKK29sZF9leHBsb2RlCWVmdW4vb2xkX2V4cGxvZGUKK3F1ZXJ5X3dpel9ncnAJZWZ1bi9xdWVyeV93aXpfZ3JwCitxdWVyeV93aXpfbGV2ZWwJZWZ1bi9xdWVyeV93aXpfbGV2ZWwKK3NldF9vYmplY3RfaGVhcnRfYmVhdAllZnVuL3NldF9vYmplY3RfaGVhcnRfYmVhdAordXBkYXRlX2FjdGlvbnMJZWZ1bi91cGRhdGVfYWN0aW9ucwordXBwZXJzdHJpbmcJZWZ1bi91cHBlcnN0cmluZwordXB0aW1lCWVmdW4vdXB0aW1lCit0aW1lMnN0cmluZwllZnVuL3RpbWUyc3RyaW5nCityZWdyZXBsYWNlCWVmdW4vcmVncmVwbGFjZQorZHVtcF9uZXRkZWFkCWVmdW4vZHVtcF9uZXRkZWFkCitzdGQJc3RkCityb29tLmRva3UJc3RkL3Jvb20uZG9rdQord2VhcG9uCXN0ZC93ZWFwb24KK3RyYW5zcG9ydAlzdGQvdHJhbnNwb3J0Cityb29tCXN0ZC9yb29tCit0aGluZwlzdGQvdGhpbmcKK2FybW91cglzdGQvYXJtb3VyCit1bml0CXN0ZC91bml0Cit0dWVyCXN0ZC90dWVyCitydWVzdHVuZwlzdGQvcnVlc3R1bmcKK3NlcXVlbmNlcglzdGQvc2VxdWVuY2VyCitzY2hsdWVzc2VsCXN0ZC9zY2hsdWVzc2VsCitsaXZpbmcJc3RkL2xpdmluZworZG9vcglzdGQvZG9vcgorY29ycHNlCXN0ZC9jb3Jwc2UKK2NvbnRhaW5lcglzdGQvY29udGFpbmVyCit2ZXJlcmJ1bmdzYmFldW1lCXN0ZC92ZXJlcmJ1bmdzYmFldW1lCit2aXJ0dWFsX2NvbXBpbGVyCXN0ZC92aXJ0dWFsX2NvbXBpbGVyCitNRwlNRworZ2lsZGVuLWRva3UJTUcvZ2lsZGVuLWRva3UKK3dhZmZlbl93ZXJ0ZQlNRy93YWZmZW5fd2VydGUKK3phdWJlcnRyYWVua2UJTUcvemF1YmVydHJhZW5rZQorb2JqX2dlcnVlc3QJTUcvb2JqX2dlcnVlc3QKK25ldHoJTUcvbmV0egorcHV0X2FuZF9nZXQJTUcvcHV0X2FuZF9nZXQKK2F1dG9sb2FkCU1HL2F1dG9sb2FkCitHT09EX1NUWUxFCU1HL0dPT0RfU1RZTEUKK2JlbmVubnVuZwlNRy9iZW5lbm51bmcKK2JhbmlzaAlNRy9iYW5pc2gKK2FuZ3JpZmYJTUcvYW5ncmlmZgorbXVzdGVyX3JhdW0uYwlNRy9tdXN0ZXJfcmF1bS5jCitza2lsbHMuZG9jCU1HL3NraWxscy5kb2MKK3B1dF9hbmRfZ2V0LmMJTUcvcHV0X2FuZF9nZXQuYworcXVlc3RzLmRvYwlNRy9xdWVzdHMuZG9jCit0b2Rlc3NlcXVlbnoJTUcvdG9kZXNzZXF1ZW56CitzZW5zaXRpdmUJTUcvc2Vuc2l0aXZlCitjb25jZXB0cwljb25jZXB0cworZXJxCWNvbmNlcHRzL2VycQoraG9va3MJY29uY2VwdHMvaG9va3MKK3Byb3BlcnRpZXMubmV3CWNvbmNlcHRzL3Byb3BlcnRpZXMubmV3Cit0ZXJtaW5hbHMJY29uY2VwdHMvdGVybWluYWxzCit1aWRzCWNvbmNlcHRzL3VpZHMKK3NpbXVsX2VmdW4JY29uY2VwdHMvc2ltdWxfZWZ1bgorb29wCWNvbmNlcHRzL29vcAorcHJvcGVydGllcwljb25jZXB0cy9wcm9wZXJ0aWVzCittZW1vcnkJY29uY2VwdHMvbWVtb3J5CituZXdzCWNvbmNlcHRzL25ld3MKK29iamVjdHMJY29uY2VwdHMvb2JqZWN0cworbmF0aXZlCWNvbmNlcHRzL25hdGl2ZQorbWFpbAljb25jZXB0cy9tYWlsCitscGMJY29uY2VwdHMvbHBjCitmaWxlcwljb25jZXB0cy9maWxlcworY29uY2VwdHMJY29uY2VwdHMvY29uY2VwdHMKK2ltcAljb25jZXB0cy9pbXAKK25lZ290aWF0aW9uCWNvbmNlcHRzL25lZ290aWF0aW9uCitsZnVuCWxmdW4KK1F1ZXJ5RGFtYWdlCWxmdW4vUXVlcnlEYW1hZ2UKK1NldEhpdEZ1bmMJbGZ1bi9TZXRIaXRGdW5jCitIaXRGdW5jCWxmdW4vSGl0RnVuYworY3JlYXRlX2RlZmF1bHRfbnBjCWxmdW4vY3JlYXRlX2RlZmF1bHRfbnBjCitTZXREZWZlbmRGdW5jCWxmdW4vU2V0RGVmZW5kRnVuYworRGVmZW5kRnVuYwlsZnVuL0RlZmVuZEZ1bmMKK1F1ZXJ5RGVmZW5kCWxmdW4vUXVlcnlEZWZlbmQKK0RlZmVuZAlsZnVuL0RlZmVuZAorQXR0YWNrCWxmdW4vQXR0YWNrCitBZGRDbWQJbGZ1bi9BZGRDbWQKK2hlYXJ0X2JlYXQJbGZ1bi9oZWFydF9iZWF0CituYW1lCWxmdW4vbmFtZQorcmVzZXQJbGZ1bi9yZXNldAorcmVtb3ZlCWxmdW4vcmVtb3ZlCittdXN0ZXIJbGZ1bi9tdXN0ZXIKK2xvbmcJbGZ1bi9sb25nCitxdWVyeV9yZWFsX25hbWUJbGZ1bi9xdWVyeV9yZWFsX25hbWUKK3JlZHVjZV9oaXRfcG9pbnQJbGZ1bi9yZWR1Y2VfaGl0X3BvaW50Cittb3ZlCWxmdW4vbW92ZQoraWQJbGZ1bi9pZAorbW9kaWZ5X2NvbW1hbmQJbGZ1bi9tb2RpZnlfY29tbWFuZAorbGZ1bglsZnVuL2xmdW4KK2xvZ29uCWxmdW4vbG9nb24KK2luaXQJbGZ1bi9pbml0Citkb19kYW1hZ2UJbGZ1bi9kb19kYW1hZ2UKK2V4aXQJbGZ1bi9leGl0CitoZWFsX3NlbGYJbGZ1bi9oZWFsX3NlbGYKK2V4dHJhX2xvb2sJbGZ1bi9leHRyYV9sb29rCitjbGVhbl91cAlsZnVuL2NsZWFuX3VwCitjcmVhdGUJbGZ1bi9jcmVhdGUKK0Rpc2NvdmVyRG9vcglsZnVuL0Rpc2NvdmVyRG9vcgorY2F0Y2hfdGVsbAlsZnVuL2NhdGNoX3RlbGwKK2NhdGNoX21zZwlsZnVuL2NhdGNoX21zZworVGVsZXBvcnQJbGZ1bi9UZWxlcG9ydAorX19JTklUCWxmdW4vX19JTklUCitTZXRQcm9wCWxmdW4vU2V0UHJvcAorU2hvd0Rvb3JzCWxmdW4vU2hvd0Rvb3JzCitLaWxsCWxmdW4vS2lsbAorTmV3RG9vcglsZnVuL05ld0Rvb3IKK1F1ZXJ5UG9zc1Byb25vdW4JbGZ1bi9RdWVyeVBvc3NQcm9ub3VuCitDaGVja1Jlc2lzdGFuY2UJbGZ1bi9DaGVja1Jlc2lzdGFuY2UKK0Rvb3JJc0tub3duCWxmdW4vRG9vcklzS25vd24KK0FkZFB1cnN1ZXIJbGZ1bi9BZGRQdXJzdWVyCitBZGRSb29tQ21kCWxmdW4vQWRkUm9vbUNtZAorQWRkSW5mbwlsZnVuL0FkZEluZm8KK1JlbW92ZVJ1cnN1ZXIJbGZ1bi9SZW1vdmVSdXJzdWVyCitQcmV2ZW50Rm9sbG93CWxmdW4vUHJldmVudEZvbGxvdworTWVzc2FnZQlsZnVuL01lc3NhZ2UKK0luRmlnaHQJbGZ1bi9JbkZpZ2h0CitBZGRBbW91bnQJbGZ1bi9BZGRBbW91bnQKK2FjY2Vzc19yaWdodHMJbGZ1bi9hY2Nlc3NfcmlnaHRzCit0cmlnZ2VyX3NlbnNpdGl2ZV9hdHRhY2sJbGZ1bi90cmlnZ2VyX3NlbnNpdGl2ZV9hdHRhY2sKK1F1ZXJ5RG9vclN0YXR1cwlsZnVuL1F1ZXJ5RG9vclN0YXR1cworUXVlcnlBbGxEb29ycwlsZnVuL1F1ZXJ5QWxsRG9vcnMKK1NldERvb3JTdGF0dXMJbGZ1bi9TZXREb29yU3RhdHVzCitRdWVyeURvb3JLZXkJbGZ1bi9RdWVyeURvb3JLZXkKK0FkZEFkamVjdGl2ZQlsZnVuL0FkZEFkamVjdGl2ZQorQWRkQ2xhc3MJbGZ1bi9BZGRDbGFzcworQWRkRGV0YWlsCWxmdW4vQWRkRGV0YWlsCitBZGREcmluawlsZnVuL0FkZERyaW5rCitBZGRFeGl0CWxmdW4vQWRkRXhpdAorQWRkRm9vZAlsZnVuL0FkZEZvb2QKK0FkZEZ1ZWwJbGZ1bi9BZGRGdWVsCitBZGRGdW4JbGZ1bi9BZGRGdW4KK0FkZElkCWxmdW4vQWRkSWQKK0FkZEl0ZW0JbGZ1bi9BZGRJdGVtCitBZGRNc2cJbGZ1bi9BZGRNc2cKK0FkZFBsdXJhbElkCWxmdW4vQWRkUGx1cmFsSWQKK0FkZFJlYWREZXRhaWwJbGZ1bi9BZGRSZWFkRGV0YWlsCitBZGRSb29tTWVzc2FnZQlsZnVuL0FkZFJvb21NZXNzYWdlCitBZGRSb3V0ZQlsZnVuL0FkZFJvdXRlCitBZGRTaW5ndWxhcklkCWxmdW4vQWRkU2luZ3VsYXJJZAorQWRkU3BlY2lhbERldGFpbAlsZnVuL0FkZFNwZWNpYWxEZXRhaWwKK0RlY2xBZGoJbGZ1bi9EZWNsQWRqCitBZGRTcGVjaWFsRXhpdAlsZnVuL0FkZFNwZWNpYWxFeGl0CitEb1Vud2VhcglsZnVuL0RvVW53ZWFyCitEb1Vud2llbGQJbGZ1bi9Eb1Vud2llbGQKK0RvV2VhcglsZnVuL0RvV2VhcgorRW50ZXIJbGZ1bi9FbnRlcgorR2V0RGV0YWlsCWxmdW4vR2V0RGV0YWlsCitHZXRFeGl0cwlsZnVuL0dldEV4aXRzCitIYWx0CWxmdW4vSGFsdAorSWRlbnRpZnkJbGZ1bi9JZGVudGlmeQorSXNVbml0CWxmdW4vSXNVbml0CitMZWF2ZQlsZnVuL0xlYXZlCitNYXlBZGRXZWlnaHQJbGZ1bi9NYXlBZGRXZWlnaHQKK1ByZXZlbnRJbnNlcnQJbGZ1bi9QcmV2ZW50SW5zZXJ0CitRdWVyeQlsZnVuL1F1ZXJ5CitRdWVyeUFycml2ZWQJbGZ1bi9RdWVyeUFycml2ZWQKK1F1ZXJ5QXJ0aWNsZQlsZnVuL1F1ZXJ5QXJ0aWNsZQorUXVlcnlCdXlGYWN0CWxmdW4vUXVlcnlCdXlGYWN0CitRdWVyeUNvaW5zUGVyVW5pdHMJbGZ1bi9RdWVyeUNvaW5zUGVyVW5pdHMKK1F1ZXJ5RHUJbGZ1bi9RdWVyeUR1CitRdWVyeUZsYXcJbGZ1bi9RdWVyeUZsYXcKK1F1ZXJ5R2VuZGVyU3RyaW5nCWxmdW4vUXVlcnlHZW5kZXJTdHJpbmcKK1F1ZXJ5R3JhbXNQZXJVbml0cwlsZnVuL1F1ZXJ5R3JhbXNQZXJVbml0cworUXVlcnlOYW1lCWxmdW4vUXVlcnlOYW1lCitRdWVyeVBhc3NlbmdlcnMJbGZ1bi9RdWVyeVBhc3NlbmdlcnMKK1F1ZXJ5UG9zaXRpb24JbGZ1bi9RdWVyeVBvc2l0aW9uCitRdWVyeVByb25vdW4JbGZ1bi9RdWVyeVByb25vdW4KK1F1ZXJ5UHJvcAlsZnVuL1F1ZXJ5UHJvcAorUXVlcnlQcm9wZXJ0aWVzCWxmdW4vUXVlcnlQcm9wZXJ0aWVzCitSZW1vdmVBZGplY3RpdmUJbGZ1bi9SZW1vdmVBZGplY3RpdmUKK1JlbW92ZUlkCWxmdW4vUmVtb3ZlSWQKK1JlbW92ZUNsYXNzCWxmdW4vUmVtb3ZlQ2xhc3MKK1JlbW92ZUNtZAlsZnVuL1JlbW92ZUNtZAorUmVtb3ZlRGV0YWlsCWxmdW4vUmVtb3ZlRGV0YWlsCitSZW1vdmVFeGl0CWxmdW4vUmVtb3ZlRXhpdAorUmVtb3ZlRnVuYwlsZnVuL1JlbW92ZUZ1bmMKK1JlbW92ZVJlYWREZXRhaWwJbGZ1bi9SZW1vdmVSZWFkRGV0YWlsCitSZW1vdmVSb3V0ZQlsZnVuL1JlbW92ZVJvdXRlCitSZW1vdmVTcGVjaWFsRGV0YWlsCWxmdW4vUmVtb3ZlU3BlY2lhbERldGFpbAorUmVtb3ZlU3BlY2lhbEV4aXQJbGZ1bi9SZW1vdmVTcGVjaWFsRXhpdAorU2V0CWxmdW4vU2V0CitTZXRCdXlGYWN0CWxmdW4vU2V0QnV5RmFjdAorU2V0Q29pbnNQZXJVbml0cwlsZnVuL1NldENvaW5zUGVyVW5pdHMKK1NldEdyYW1zUGVyVW5pdHMJbGZ1bi9TZXRHcmFtc1BlclVuaXRzCitTZXRQcm9wZXJ0aWVzCWxmdW4vU2V0UHJvcGVydGllcworU2V0U3RvcmFnZVJvb20JbGZ1bi9TZXRTdG9yYWdlUm9vbQorU2hvd1Byb3BMaXN0CWxmdW4vU2hvd1Byb3BMaXN0CitTdGFydAlsZnVuL1N0YXJ0CitTdWdnZXN0QXJ0aWNsZQlsZnVuL1N1Z2dlc3RBcnRpY2xlCitUYWtlRmxhdwlsZnVuL1Rha2VGbGF3CitVbndpZWxkRnVuYwlsZnVuL1Vud2llbGRGdW5jCitXZWFyRnVuYwlsZnVuL1dlYXJGdW5jCitXaWVsZEZ1bmMJbGZ1bi9XaWVsZEZ1bmMKK2RvX3Vud2VhcglsZnVuL2RvX3Vud2VhcgorZG9fd2VhcglsZnVuL2RvX3dlYXIKK2ludF9sb25nCWxmdW4vaW50X2xvbmcKK2ludF9zaG9ydAlsZnVuL2ludF9zaG9ydAoraXNfY2xhc3NfbWVtYmVyCWxmdW4vaXNfY2xhc3NfbWVtYmVyCitsb2NhdGVfb2JqZWN0cwlsZnVuL2xvY2F0ZV9vYmplY3RzCittYWtlX2ludmxpc3QJbGZ1bi9tYWtlX2ludmxpc3QKK3BhcmFtb3ZlCWxmdW4vcGFyYW1vdmUKK3ByZXNlbnRfb2JqZWN0cwlsZnVuL3ByZXNlbnRfb2JqZWN0cworcXVlcnlfd2VpZ2h0X2NvbnRlbnRzCWxmdW4vcXVlcnlfd2VpZ2h0X2NvbnRlbnRzCitzaG9ydAlsZnVuL3Nob3J0Cit0cmlnZ2VyX3NlbnNpdGl2ZV9pbnYJbGZ1bi90cmlnZ2VyX3NlbnNpdGl2ZV9pbnYKK3dpZWxkX21lCWxmdW4vd2llbGRfbWUKK0FkZFNwZWxsCWxmdW4vQWRkU3BlbGwKK1JlbW92ZUl0ZW0JbGZ1bi9SZW1vdmVJdGVtCitOb3RpZnlHaXZlUXVlc3QJbGZ1bi9Ob3RpZnlHaXZlUXVlc3QKK0RhbWFnZQlsZnVuL0RhbWFnZQorU2V0Q2hhdHMJbGZ1bi9TZXRDaGF0cworU2V0QXR0YWNrQ2hhdHMJbGZ1bi9TZXRBdHRhY2tDaGF0cworUmVtb3ZlUGx1cmFsSWQJbGZ1bi9SZW1vdmVQbHVyYWxJZAorUmVtb3ZlU2luZ3VsYXJJZAlsZnVuL1JlbW92ZVNpbmd1bGFySWQKK1F1ZXJ5TWF0ZXJpYWwJbGZ1bi9RdWVyeU1hdGVyaWFsCitNYXRlcmlhbExpc3QJbGZ1bi9NYXRlcmlhbExpc3QKK1F1ZXJ5TWF0ZXJpYWxHcm91cAlsZnVuL1F1ZXJ5TWF0ZXJpYWxHcm91cAorbWlzYwltaXNjCitjYWxsZWRfYnlfcGxheWVyCW1pc2MvY2FsbGVkX2J5X3BsYXllcgorc2ltdWxfZWZ1bnMJbWlzYy9zaW11bF9lZnVucworQ0xFQU5fVVAJbWlzYy9DTEVBTl9VUAorbWVtCW1pc2MvbWVtCitiZWlzcGllbGUJYmVpc3BpZWxlCitic3BydWVzdDEuYwliZWlzcGllbGUvYnNwcnVlc3QxLmMKK2JzcG1vbjIuYwliZWlzcGllbGUvYnNwbW9uMi5jCityYXVtMS5jCWJlaXNwaWVsZS9yYXVtMS5jCit3b2xrZS5jCWJlaXNwaWVsZS93b2xrZS5jCitic3B3YWZmZTEuYwliZWlzcGllbGUvYnNwd2FmZmUxLmMKK2JzcG1vbjEuYwliZWlzcGllbGUvYnNwbW9uMS5jCitMUEMJTFBDCithbGlzdHMJTFBDL2FsaXN0cworYXJyYXlzCUxQQy9hcnJheXMKK2Jsb2NrCUxQQy9ibG9jaworY2xvc3VyZXMJTFBDL2Nsb3N1cmVzCitjbG9zdXJlcy1leGFtcGxlCUxQQy9jbG9zdXJlcy1leGFtcGxlCitkby13aGlsZQlMUEMvZG8td2hpbGUKK2VkMAlMUEMvZWQwCitlZDEJTFBDL2VkMQorZWQyCUxQQy9lZDIKK2VkMwlMUEMvZWQzCitlZDQJTFBDL2VkNAorZWQ1CUxQQy9lZDUKK2VkNglMUEMvZWQ2CitlZnVucwlMUEMvZWZ1bnMKK2ZvcglMUEMvZm9yCitmdW5jdGlvbnMJTFBDL2Z1bmN0aW9ucworaW5oZXJpdAlMUEMvaW5oZXJpdAoraW5oZXJpdGFuY2UJTFBDL2luaGVyaXRhbmNlCitpbml0aWFsaXNhdGlvbglMUEMvaW5pdGlhbGlzYXRpb24KK2xmdW5zCUxQQy9sZnVucworbHBjCUxQQy9scGMKK21hcHBpbmdzCUxQQy9tYXBwaW5ncworb3BlcmF0b3JzCUxQQy9vcGVyYXRvcnMKK3ByYWdtYQlMUEMvcHJhZ21hCitwcmVwcm9jZXNzb3IJTFBDL3ByZXByb2Nlc3NvcgorcmVmZXJlbmNlcwlMUEMvcmVmZXJlbmNlcworc3dpdGNoCUxQQy9zd2l0Y2gKK3R5cGVzCUxQQy90eXBlcword2hpbGUJTFBDL3doaWxlCittYXN0ZXIJbWFzdGVyCit2YWxpZF9xdWVyeV9zbm9vcAltYXN0ZXIvdmFsaWRfcXVlcnlfc25vb3AKK3ZhbGlkX3Nub29wCW1hc3Rlci92YWxpZF9zbm9vcAordmFsaWRfd3JpdGUJbWFzdGVyL3ZhbGlkX3dyaXRlCit2YWxpZF9yZWFkCW1hc3Rlci92YWxpZF9yZWFkCit2YWxpZF9zZXRldWlkCW1hc3Rlci92YWxpZF9zZXRldWlkCitzbG93X3NodXRfZG93bgltYXN0ZXIvc2xvd19zaHV0X2Rvd24KK3ZhbGlkX2V4ZWMJbWFzdGVyL3ZhbGlkX2V4ZWMKK3JldHJpZXZlX2VkX3NldHVwCW1hc3Rlci9yZXRyaWV2ZV9lZF9zZXR1cAorc2F2ZV9lZF9zZXR1cAltYXN0ZXIvc2F2ZV9lZF9zZXR1cAorcnVudGltZV9lcnJvcgltYXN0ZXIvcnVudGltZV9lcnJvcgorcmVtb3ZlX3BsYXllcgltYXN0ZXIvcmVtb3ZlX3BsYXllcgorcXVlcnlfcGxheWVyX2xldmVsCW1hc3Rlci9xdWVyeV9wbGF5ZXJfbGV2ZWwKK3JlY2VpdmVfaW1wCW1hc3Rlci9yZWNlaXZlX2ltcAorcXVvdGFfZGVtb24JbWFzdGVyL3F1b3RhX2RlbW9uCitwcmVsb2FkCW1hc3Rlci9wcmVsb2FkCitwcml2aWxlZ2VfdmlvbGF0aW9uCW1hc3Rlci9wcml2aWxlZ2VfdmlvbGF0aW9uCityZWFjdGl2YXRlX2Rlc3RydWN0ZWRfbWFzdGVyCW1hc3Rlci9yZWFjdGl2YXRlX2Rlc3RydWN0ZWRfbWFzdGVyCitxdWVyeV9hbGxvd19zaGFkb3cJbWFzdGVyL3F1ZXJ5X2FsbG93X3NoYWRvdworaGVhcnRfYmVhdF9lcnJvcgltYXN0ZXIvaGVhcnRfYmVhdF9lcnJvcgorb2JqZWN0X25hbWUJbWFzdGVyL29iamVjdF9uYW1lCitwcmVwYXJlX2Rlc3RydWN0CW1hc3Rlci9wcmVwYXJlX2Rlc3RydWN0CitwYXJzZV9jb21tYW5kX2FsbF93b3JkCW1hc3Rlci9wYXJzZV9jb21tYW5kX2FsbF93b3JkCitwYXJzZV9jb21tYW5kX3ByZXBvc19saXN0CW1hc3Rlci9wYXJzZV9jb21tYW5kX3ByZXBvc19saXN0CittYWtlX3BhdGhfYWJzb2x1dGUJbWFzdGVyL21ha2VfcGF0aF9hYnNvbHV0ZQorbWFzdGVyCW1hc3Rlci9tYXN0ZXIKK2dldF9yb290X3VpZAltYXN0ZXIvZ2V0X3Jvb3RfdWlkCitsb2dfZXJyb3IJbWFzdGVyL2xvZ19lcnJvcgorZXh0ZXJuYWxfbWFzdGVyX3JlbG9hZAltYXN0ZXIvZXh0ZXJuYWxfbWFzdGVyX3JlbG9hZAoraW5hdWd1cmF0ZV9tYXN0ZXIJbWFzdGVyL2luYXVndXJhdGVfbWFzdGVyCitnZXRfd2l6X25hbWUJbWFzdGVyL2dldF93aXpfbmFtZQorZ2V0X3NpbXVsX2VmdW4JbWFzdGVyL2dldF9zaW11bF9lZnVuCitnZXRfYmJfdWlkCW1hc3Rlci9nZXRfYmJfdWlkCitmbGFnCW1hc3Rlci9mbGFnCitlcGlsb2cJbWFzdGVyL2VwaWxvZworZ2V0X2VkX2J1ZmZlcl9zYXZlX29iamVjdF9uYW1lCW1hc3Rlci9nZXRfZWRfYnVmZmVyX3NhdmVfb2JqZWN0X25hbWUKK2Nvbm5lY3QJbWFzdGVyL2Nvbm5lY3QKK2RhbmdsaW5nX2xmdW5fY2xvc3VyZQltYXN0ZXIvZGFuZ2xpbmdfbGZ1bl9jbG9zdXJlCitkZWZpbmVfaW5jbHVkZV9kaXJzCW1hc3Rlci9kZWZpbmVfaW5jbHVkZV9kaXJzCitkaXNjb25uZWN0CW1hc3Rlci9kaXNjb25uZWN0CitjcmVhdG9yX2ZpbGUJbWFzdGVyL2NyZWF0b3JfZmlsZQorY29tcGlsZV9vYmplY3QJbWFzdGVyL2NvbXBpbGVfb2JqZWN0CittYXN0ZXItMy4yCW1hc3Rlci9tYXN0ZXItMy4yCitHcmVwLVByaXZpbGVnZQltYXN0ZXIvR3JlcC1Qcml2aWxlZ2UKK0dyZXAtQXBwbHktTWFzdGVyCW1hc3Rlci9HcmVwLUFwcGx5LU1hc3RlcgorR3JlcC1DaGVja1ZhbGlkUGF0aC1NYXN0ZXIJbWFzdGVyL0dyZXAtQ2hlY2tWYWxpZFBhdGgtTWFzdGVyCitnZXRfbWFzdGVyX3VpZAltYXN0ZXIvZ2V0X21hc3Rlcl91aWQKK2luaXRpYWxpc2F0aW9uCW1hc3Rlci9pbml0aWFsaXNhdGlvbgorbWFzdGVyLTMuMi4xCW1hc3Rlci9tYXN0ZXItMy4yLjEKK25vdGlmeV9zaHV0ZG93bgltYXN0ZXIvbm90aWZ5X3NodXRkb3duCitzdGFsZV9lcnEJbWFzdGVyL3N0YWxlX2VycQorZWQJZWQKK2VkNAllZC9lZDQKK2VkMQllZC9lZDEKK2VkMAllZC9lZDAKK2VkMwllZC9lZDMKK2VkMgllZC9lZDIKK2RyaXZlcglkcml2ZXIKK2NvbW1hbmRsaW5lCWRyaXZlci9jb21tYW5kbGluZQorZHJpdmVyCWRyaXZlci9kcml2ZXIKK2RlYnVnbWFsbG9jCWRyaXZlci9kZWJ1Z21hbGxvYworZHVtcGFsbG9iaglkcml2ZXIvZHVtcGFsbG9iagorbWFsbG9jCWRyaXZlci9tYWxsb2MKK29wY2R1bXAJZHJpdmVyL29wY2R1bXAKK3ByZWRlZmluZWQJZHJpdmVyL3ByZWRlZmluZWQKK3Nob3dzbWFsbG5ld21hbGxvY2VkCWRyaXZlci9zaG93c21hbGxuZXdtYWxsb2NlZAorc3RhdHVzCWRyaXZlci9zdGF0dXMKK0tVUlMJS1VSUworTFBDLUtVUlMyCUtVUlMvTFBDLUtVUlMyCitjaGFwdGVyNQlLVVJTL0xQQy1LVVJTMi9jaGFwdGVyNQorY2hhcHRlcjQJS1VSUy9MUEMtS1VSUzIvY2hhcHRlcjQKK2NoYXB0ZXIzCUtVUlMvTFBDLUtVUlMyL2NoYXB0ZXIzCitjaGFwdGVyNwlLVVJTL0xQQy1LVVJTMi9jaGFwdGVyNworY2hhcHRlcjYJS1VSUy9MUEMtS1VSUzIvY2hhcHRlcjYKK2NoYXB0ZXIyCUtVUlMvTFBDLUtVUlMyL2NoYXB0ZXIyCitDb3B5cmlnaHQJS1VSUy9MUEMtS1VSUzIvQ29weXJpZ2h0CitjaGFwdGVyMQlLVVJTL0xQQy1LVVJTMi9jaGFwdGVyMQorQ29udGVudHMJS1VSUy9MUEMtS1VSUzIvQ29udGVudHMKK0xQQy1LVVJTCUtVUlMvTFBDLUtVUlMKK0ludHJvZHVjdGlvbglLVVJTL0xQQy1LVVJTL0ludHJvZHVjdGlvbgorY2hhcHRlcjQJS1VSUy9MUEMtS1VSUy9jaGFwdGVyNAorY2hhcHRlcjIJS1VSUy9MUEMtS1VSUy9jaGFwdGVyMgorY2hhcHRlcjgJS1VSUy9MUEMtS1VSUy9jaGFwdGVyOAorY2hhcHRlcjcJS1VSUy9MUEMtS1VSUy9jaGFwdGVyNworY2hhcHRlcjYJS1VSUy9MUEMtS1VSUy9jaGFwdGVyNgorY2hhcHRlcjUJS1VSUy9MUEMtS1VSUy9jaGFwdGVyNQorY2hhcHRlcjMJS1VSUy9MUEMtS1VSUy9jaGFwdGVyMworY2hhcHRlcjEJS1VSUy9MUEMtS1VSUy9jaGFwdGVyMQorQ29udGVudHMJS1VSUy9MUEMtS1VSUy9Db250ZW50cworb2JqZWt0ZQlLVVJTL29iamVrdGUKK3JhdW0xCUtVUlMvcmF1bTEKK2VpbmxlaXR1bmcJS1VSUy9laW5sZWl0dW5nCitSVUxFUwlLVVJTL1JVTEVTCitSVUxFUy5XSVoJS1VSUy9SVUxFUy5XSVoKK0NPTU1FTlRTCUtVUlMvQ09NTUVOVFMKK0dVSURFLm9sZAlLVVJTL0dVSURFLm9sZAorMy4wCTMuMAorbXVkbGliX291dGxpbmUJMy4wL211ZGxpYl9vdXRsaW5lCitwcm9ibGVtcwkzLjAvcHJvYmxlbXMKK2xmdW5fZWZ1bi5tYW4JMy4wL2xmdW5fZWZ1bi5tYW4KK2xmdW5fZWZ1bi5tZQkzLjAvbGZ1bl9lZnVuLm1lCithdXRvX2Rlc3RydWN0CTMuMC9hdXRvX2Rlc3RydWN0CitMUG11ZC5kb2MubWUJMy4wL0xQbXVkLmRvYy5tZQorTFBtdWQuZG9jLm1hbgkzLjAvTFBtdWQuZG9jLm1hbgorMy4wLmluZm8JMy4wLzMuMC5pbmZvCitAUkVBRE1FCUBSRUFETUUKK2Fib3V0LWVmdW4rbGZ1bi1kb2NzCWFib3V0LWVmdW4rbGZ1bi1kb2NzCitjbG9zdXJlcwljbG9zdXJlcworZnVuY19zcGVjCWZ1bmNfc3BlYworaGVscAloZWxwCithYmVudGV1ZXIJaGVscC9hYmVudGV1ZXIKK2FiZW50ZXVyZXIJaGVscC9hYmVudGV1cmVyCithdHRyaWJ1dGUJaGVscC9hdHRyaWJ1dGUKK2Jld2VndW5nCWhlbHAvYmV3ZWd1bmcKK2JpZXJzY2h1ZXR0bGVyCWhlbHAvYmllcnNjaHVldHRsZXIKK2J1ZWNoZXIJaGVscC9idWVjaGVyCitjaGFvcwloZWxwL2NoYW9zCitlZGl0b3IJaGVscC9lZGl0b3IKK2Vyem1hZ2llcgloZWxwL2Vyem1hZ2llcgorZmFxCWhlbHAvZmFxCitmb3JzY2hlcnB1bmt0ZQloZWxwL2ZvcnNjaGVycHVua3RlCitnaWxkZW4JaGVscC9naWxkZW4KK2thZW1wZmVyCWhlbHAva2FlbXBmZXIKK2thcmF0ZQloZWxwL2thcmF0ZQora2xlcnVzCWhlbHAva2xlcnVzCitrb256ZXB0CWhlbHAva29uemVwdAorbWFnaWVyCWhlbHAvbWFnaWVyCitwb3N0CWhlbHAvcG9zdAorcmVnaW9uZW4JaGVscC9yZWdpb25lbgorc2NyaXB0ZQloZWxwL3NjcmlwdGUKK3NlaGVyCWhlbHAvc2VoZXIKK3N0dWZlbgloZWxwL3N0dWZlbgorc3R1ZmVucHVua3RlCWhlbHAvc3R1ZmVucHVua3RlCitzeW50YXgJaGVscC9zeW50YXgKK3phdWJlcmVpCWhlbHAvemF1YmVyZWkKK3phdWJlcmVyCWhlbHAvemF1YmVyZXIKK3phdWJlcnRyYWVua2UJaGVscC96YXViZXJ0cmFlbmtlCit2ZXJlaW4JaGVscC92ZXJlaW4KK3Byb3BzCXByb3BzCitQX0NPTUJBVENNRFMJcHJvcHMvUF9DT01CQVRDTURTCitQX0lOVklTCXByb3BzL1BfSU5WSVMKK1BfQ09NQkFUQ01EUy5vbGQJcHJvcHMvUF9DT01CQVRDTURTLm9sZAorUF9ISURFX0VYSVRTCXByb3BzL1BfSElERV9FWElUUworUF9JTlZJUy5vbGQJcHJvcHMvUF9JTlZJUy5vbGQKK1BfSElERV9FWElUUy5vbGQJcHJvcHMvUF9ISURFX0VYSVRTLm9sZAorUF9BQwlwcm9wcy9QX0FDCitQX1dPUk4JcHJvcHMvUF9XT1JOCitQX0FSTU9VUl9UWVBFCXByb3BzL1BfQVJNT1VSX1RZUEUKK1BfREVGRU5EX0ZVTkMJcHJvcHMvUF9ERUZFTkRfRlVOQworUF9XRUFSX0ZVTkMJcHJvcHMvUF9XRUFSX0ZVTkMKK1BfUkVNT1ZFX0ZVTkMJcHJvcHMvUF9SRU1PVkVfRlVOQworUF9OT19HTE9CQUxfQVRUQUNLCXByb3BzL1BfTk9fR0xPQkFMX0FUVEFDSworUF9EQU1BR0VECXByb3BzL1BfREFNQUdFRAorUF9FRkZFQ1RJVkVfV0MJcHJvcHMvUF9FRkZFQ1RJVkVfV0MKK1BfRUZGRUNUSVZFX0FDCXByb3BzL1BfRUZGRUNUSVZFX0FDCitQX01BWF9XRUlHSFQJcHJvcHMvUF9NQVhfV0VJR0hUCitQX0NPTlRFTlRTCXByb3BzL1BfQ09OVEVOVFMKK1BfQ05UX1NUQVRVUwlwcm9wcy9QX0NOVF9TVEFUVVMKK1BfVFJBTlNQQVJFTlQJcHJvcHMvUF9UUkFOU1BBUkVOVAorUF9ET09SX0lORk9TCXByb3BzL1BfRE9PUl9JTkZPUworUF9XQVRFUglwcm9wcy9QX1dBVEVSCitQX0ZJU0gJcHJvcHMvUF9GSVNICitQX0xJUVVJRAlwcm9wcy9QX0xJUVVJRAorUF9MT05HX0VNUFRZCXByb3BzL1BfTE9OR19FTVBUWQorUF9MT05HX0ZVTEwJcHJvcHMvUF9MT05HX0ZVTEwKK1BfR1VBUkQJcHJvcHMvUF9HVUFSRAorUF9FVkFMX09GRlNFVFMJcHJvcHMvUF9FVkFMX09GRlNFVFMKK1BfRVZBTF9GQUNUT1JTCXByb3BzL1BfRVZBTF9GQUNUT1JTCitQX0lOUENfTEFTVF9QTEFZRVJfQ09OVEFDVAlwcm9wcy9QX0lOUENfTEFTVF9QTEFZRVJfQ09OVEFDVAorUF9JTlBDX0xBU1RfRU5WSVJPTk1FTlQJcHJvcHMvUF9JTlBDX0xBU1RfRU5WSVJPTk1FTlQKK1BfSU5QQ19XQUxLX01PREUJcHJvcHMvUF9JTlBDX1dBTEtfTU9ERQorUF9JTlBDX1dBTEtfREVMQVlTCXByb3BzL1BfSU5QQ19XQUxLX0RFTEFZUworUF9JTlBDX1dBTEtfRkxBR1MJcHJvcHMvUF9JTlBDX1dBTEtfRkxBR1MKK1BfSU5QQ19XQUxLX0FSRUEJcHJvcHMvUF9JTlBDX1dBTEtfQVJFQQorUF9JTlBDX1dBTEtfUk9VVEUJcHJvcHMvUF9JTlBDX1dBTEtfUk9VVEUKK1BfSU5QQ19IT01FCXByb3BzL1BfSU5QQ19IT01FCitQX0FSVElDTEUJcHJvcHMvUF9BUlRJQ0xFCitQX0dFTkRFUglwcm9wcy9QX0dFTkRFUgorUF9BVFRSSUJVVEVTCXByb3BzL1BfQVRUUklCVVRFUworUF9BVFRSSUJVVEVTX09GRlNFVFMJcHJvcHMvUF9BVFRSSUJVVEVTX09GRlNFVFMKK1BfWF9BVFRSX01PRAlwcm9wcy9QX1hfQVRUUl9NT0QKK1BfQVRUUklCVVRFU19NT0RJRklFUglwcm9wcy9QX0FUVFJJQlVURVNfTU9ESUZJRVIKK1BfQUJJTElUSUVTCXByb3BzL1BfQUJJTElUSUVTCitQX1JFU0lTVEFOQ0UJcHJvcHMvUF9SRVNJU1RBTkNFCitQX1JFU0lTVEFOQ0VfU1RSRU5HSFRTCXByb3BzL1BfUkVTSVNUQU5DRV9TVFJFTkdIVFMKK1BfVlVMTkVSQUJJTElUWQlwcm9wcy9QX1ZVTE5FUkFCSUxJVFkKK1BfVE9UQUxfQUMJcHJvcHMvUF9UT1RBTF9BQworUF9IQU5EUwlwcm9wcy9QX0hBTkRTCitQX01BWF9IQU5EUwlwcm9wcy9QX01BWF9IQU5EUworUF9VU0VEX0hBTkRTCXByb3BzL1BfVVNFRF9IQU5EUworUF9BVFRBQ0tfQlVTWQlwcm9wcy9QX0FUVEFDS19CVVNZCitQX1BSRUZFUkVEX0VORU1ZCXByb3BzL1BfUFJFRkVSRURfRU5FTVkKK1BfUkVTSVNUQU5DRV9TVFJFTkdUSFMJcHJvcHMvUF9SRVNJU1RBTkNFX1NUUkVOR1RIUworUF9BR0UJcHJvcHMvUF9BR0UKK1BfQUxJR04JcHJvcHMvUF9BTElHTgorUF9ERUFEUwlwcm9wcy9QX0RFQURTCitQX0dIT1NUCXByb3BzL1BfR0hPU1QKK1BfRlJPRwlwcm9wcy9QX0ZST0cKK1BfRk9PRAlwcm9wcy9QX0ZPT0QKK1BfTUFYX0ZPT0QJcHJvcHMvUF9NQVhfRk9PRAorUF9EUklOSwlwcm9wcy9QX0RSSU5LCitQX01BWF9EUklOSwlwcm9wcy9QX01BWF9EUklOSworUF9BTENPSE9MCXByb3BzL1BfQUxDT0hPTAorUF9NQVhfQUxDT0hPTAlwcm9wcy9QX01BWF9BTENPSE9MCitQX0hQCXByb3BzL1BfSFAKK1BfTUFYX0hQCXByb3BzL1BfTUFYX0hQCitQX1NQCXByb3BzL1BfU1AKK1BfTUFYX1NQCXByb3BzL1BfTUFYX1NQCitQX1hQCXByb3BzL1BfWFAKK1BfVkFMSURfR1VJTERTCXByb3BzL1BfVkFMSURfR1VJTERTCitQX0dVSUxEX1NLSUxMUwlwcm9wcy9QX0dVSUxEX1NLSUxMUworUF9HVUlMRF9SRVNUUklDVElPTlMJcHJvcHMvUF9HVUlMRF9SRVNUUklDVElPTlMKK1BfR1VJTERfREVGQVVMVF9TUEVMTEJPT0sJcHJvcHMvUF9HVUlMRF9ERUZBVUxUX1NQRUxMQk9PSworUF9HVUlMRF9NQUxFX1RJVExFUwlwcm9wcy9QX0dVSUxEX01BTEVfVElUTEVTCitQX0dVSUxEX0ZFTUFMRV9USVRMRVMJcHJvcHMvUF9HVUlMRF9GRU1BTEVfVElUTEVTCitQX0dVSUxEX0xFVkVMUwlwcm9wcy9QX0dVSUxEX0xFVkVMUworUF9TQl9TUEVMTFMJcHJvcHMvUF9TQl9TUEVMTFMKK1BfR0xPQkFMX1NLSUxMUFJPUFMJcHJvcHMvUF9HTE9CQUxfU0tJTExQUk9QUworUF9HVUlMRF9MRVZFTAlwcm9wcy9QX0dVSUxEX0xFVkVMCitQX0dVSUxEX1RJVExFCXByb3BzL1BfR1VJTERfVElUTEUKK1BfR1VJTERfUkFUSU5HCXByb3BzL1BfR1VJTERfUkFUSU5HCitQX05FV1NLSUxMUwlwcm9wcy9QX05FV1NLSUxMUworUF9ORVhUX1NQRUxMX1RJTUUJcHJvcHMvUF9ORVhUX1NQRUxMX1RJTUUKK1BfVE1QX0FUVEFDS19IT09LCXByb3BzL1BfVE1QX0FUVEFDS19IT09LCitQX1RNUF9BVFRBQ0tfTU9ECXByb3BzL1BfVE1QX0FUVEFDS19NT0QKK1BfTEVQCXByb3BzL1BfTEVQCitQX1RNUF9ERUZFTkRfSE9PSwlwcm9wcy9QX1RNUF9ERUZFTkRfSE9PSworUF9UTVBfRElFX0hPT0sJcHJvcHMvUF9UTVBfRElFX0hPT0sKK1BfREVGRU5ERVJTCXByb3BzL1BfREVGRU5ERVJTCitQX1NLSUxMX0FUVFJJQlVURVMJcHJvcHMvUF9TS0lMTF9BVFRSSUJVVEVTCitQX0lHTk9SRQlwcm9wcy9QX0lHTk9SRQorUF9MQVNUX0NPTU1BTkRfRU5WCXByb3BzL1BfTEFTVF9DT01NQU5EX0VOVgorUF9ISVNUTUlOCXByb3BzL1BfSElTVE1JTgorUF9TSE9XX0FMSUFTX1BST0NFU1NJTkcJcHJvcHMvUF9TSE9XX0FMSUFTX1BST0NFU1NJTkcKK1BfREVGQVVMVF9OT1RJRllfRkFJTAlwcm9wcy9QX0RFRkFVTFRfTk9USUZZX0ZBSUwKK1BfTkVUREVBRF9JTkZPCXByb3BzL1BfTkVUREVBRF9JTkZPCitQX0lQX05BTUUJcHJvcHMvUF9JUF9OQU1FCitQX0FVVEhfSU5GTwlwcm9wcy9QX0FVVEhfSU5GTworUF9MQVNUX0tJTExFUglwcm9wcy9QX0xBU1RfS0lMTEVSCitQX0FDVFVBTF9OT1RJRllfRkFJTAlwcm9wcy9QX0FDVFVBTF9OT1RJRllfRkFJTAorUF9MRVBfTUFMVVMJcHJvcHMvUF9MRVBfTUFMVVMKK1BfTEFTVF9MT0dJTglwcm9wcy9QX0xBU1RfTE9HSU4KK1BfTEFTVF9MT0dPVVQJcHJvcHMvUF9MQVNUX0xPR09VVAorUF9TSE9XX0VYSVRTCXByb3BzL1BfU0hPV19FWElUUworUF9XQU5UU19UT19MRUFSTglwcm9wcy9QX1dBTlRTX1RPX0xFQVJOCitQX0FVVE9MT0FET0JKCXByb3BzL1BfQVVUT0xPQURPQkoKK1BfVFRZCXByb3BzL1BfVFRZCitQX0FVVE9MT0FECXByb3BzL1BfQVVUT0xPQUQKK1BfTUFJTEFERFIJcHJvcHMvUF9NQUlMQUREUgorUF9IT01FUEFHRQlwcm9wcy9QX0hPTUVQQUdFCitQX0ZPTExPV19TSUxFTlQJcHJvcHMvUF9GT0xMT1dfU0lMRU5UCitQX1NFQ09ORAlwcm9wcy9QX1NFQ09ORAorUF9URVNUUExBWUVSCXByb3BzL1BfVEVTVFBMQVlFUgorUF9TVEFSVF9IT01FCXByb3BzL1BfU1RBUlRfSE9NRQorUF9DTVNHCXByb3BzL1BfQ01TRworUF9ETVNHCXByb3BzL1BfRE1TRworUF9DTE9ORV9NU0cJcHJvcHMvUF9DTE9ORV9NU0cKK1BfREVTVFJVQ1RfTVNHCXByb3BzL1BfREVTVFJVQ1RfTVNHCitQX0NBUlJJRURfVkFMVUUJcHJvcHMvUF9DQVJSSUVEX1ZBTFVFCitQX1BST01QVAlwcm9wcy9QX1BST01QVAorUF9TQ1JFRU5TSVpFCXByb3BzL1BfU0NSRUVOU0laRQorUF9GTEFHUwlwcm9wcy9QX0ZMQUdTCitQX0NBTl9GTEFHUwlwcm9wcy9QX0NBTl9GTEFHUworUF9SRUFEX05FV1MJcHJvcHMvUF9SRUFEX05FV1MKK1BfTkVFREVEX1FQCXByb3BzL1BfTkVFREVEX1FQCitQX0lOVEVSTVVECXByb3BzL1BfSU5URVJNVUQKK1BfQlVGRkVSCXByb3BzL1BfQlVGRkVSCitQX0RFQUYJcHJvcHMvUF9ERUFGCitQX1BFUk1fU1RSSU5HCXByb3BzL1BfUEVSTV9TVFJJTkcKK1BfRVhUUkFfTE9PSwlwcm9wcy9QX0VYVFJBX0xPT0sKK1BfUFJFU0FZCXByb3BzL1BfUFJFU0FZCitQX1RJVExFCXByb3BzL1BfVElUTEUKK1BfQVZFUkFHRV9TSVpFCXByb3BzL1BfQVZFUkFHRV9TSVpFCitQX1JFRkVSRU5DRV9PQkpFQ1QJcHJvcHMvUF9SRUZFUkVOQ0VfT0JKRUNUCitQX01TR0lOCXByb3BzL1BfTVNHSU4KK1BfTVNHT1VUCXByb3BzL1BfTVNHT1VUCitQX01NU0dJTglwcm9wcy9QX01NU0dJTgorUF9NTVNHT1VUCXByb3BzL1BfTU1TR09VVAorUF9QT1RJT05ST09NUwlwcm9wcy9QX1BPVElPTlJPT01TCitQX1RSQU5LX0ZJTkRFTglwcm9wcy9QX1RSQU5LX0ZJTkRFTgorUF9WSVNJVEVEX1BPVElPTlJPT01TCXByb3BzL1BfVklTSVRFRF9QT1RJT05ST09NUworUF9CT05VU19QT1RJT05TCXByb3BzL1BfQk9OVVNfUE9USU9OUworUF9RVUVTVFMJcHJvcHMvUF9RVUVTVFMKK1BfUVAJcHJvcHMvUF9RUAorUF9TS0lMTFMJcHJvcHMvUF9TS0lMTFMKK1BfQkxJTkQJcHJvcHMvUF9CTElORAorUF9CUklFRglwcm9wcy9QX0JSSUVGCitQX09SSUdfTkFNRQlwcm9wcy9QX09SSUdfTkFNRQorUF9LSUxMRVIJcHJvcHMvUF9LSUxMRVIKK1BfTVVSREVSX01TRwlwcm9wcy9QX01VUkRFUl9NU0cKK1BfS0lMTF9NU0cJcHJvcHMvUF9LSUxMX01TRworUF9LSUxMX05BTUUJcHJvcHMvUF9LSUxMX05BTUUKK1BfQ09SUFNFCXByb3BzL1BfQ09SUFNFCitQX0VORU1ZX0RFQVRIX1NFUVVFTkNFCXByb3BzL1BfRU5FTVlfREVBVEhfU0VRVUVOQ0UKK1BfTElHSFQJcHJvcHMvUF9MSUdIVAorUF9DTE9ORVIJcHJvcHMvUF9DTE9ORVIKK1BfVE9UQUxfTElHSFQJcHJvcHMvUF9UT1RBTF9MSUdIVAorUF9MQVNUX0NPTlRFTlRfQ0hBTkdFCXByb3BzL1BfTEFTVF9DT05URU5UX0NIQU5HRQorUF9WQUxVRQlwcm9wcy9QX1ZBTFVFCitQX0ZPUkNFX0RFTU9OU1QJcHJvcHMvUF9GT1JDRV9ERU1PTlNUCitQX0lORk8JcHJvcHMvUF9JTkZPCitQX1JFQURfTVNHCXByb3BzL1BfUkVBRF9NU0cKK1BfRldfQUxXQVlTX1JFQURBQkxFCXByb3BzL1BfRldfQUxXQVlTX1JFQURBQkxFCitQX05PQlVZCXByb3BzL1BfTk9CVVkKK1BfTkVWRVJEUk9QCXByb3BzL1BfTkVWRVJEUk9QCitQX01BR0lDCXByb3BzL1BfTUFHSUMKK1BfV0VJR0hUX1BFUkNFTlQJcHJvcHMvUF9XRUlHSFRfUEVSQ0VOVAorUF9ERVRBSUxTCXByb3BzL1BfREVUQUlMUworUF9TUEVDSUFMX0RFVEFJTFMJcHJvcHMvUF9TUEVDSUFMX0RFVEFJTFMKK1BfUkVBRF9ERVRBSUxTCXByb3BzL1BfUkVBRF9ERVRBSUxTCitQX0VYSVRTCXByb3BzL1BfRVhJVFMKK1BfU1BFQ0lBTF9FWElUUwlwcm9wcy9QX1NQRUNJQUxfRVhJVFMKK1BfRE9PUlMJcHJvcHMvUF9ET09SUworUF9ET09SUzIJcHJvcHMvUF9ET09SUzIKK1BfSVRFTVMJcHJvcHMvUF9JVEVNUworUF9OT19UUE9SVAlwcm9wcy9QX05PX1RQT1JUCitQX1RQT1JUX0NPU1RfSU4JcHJvcHMvUF9UUE9SVF9DT1NUX0lOCitQX1RQT1JUX0NPU1RfT1VUCXByb3BzL1BfVFBPUlRfQ09TVF9PVVQKK1BfSU5ET09SUwlwcm9wcy9QX0lORE9PUlMKK1BfTk9NQUdJQwlwcm9wcy9QX05PTUFHSUMKK1BfT1JBS0VMCXByb3BzL1BfT1JBS0VMCitQX1JBQ0UJcHJvcHMvUF9SQUNFCitQX1RPVEFMX1dDCXByb3BzL1BfVE9UQUxfV0MKK1BfWkFQX01TRwlwcm9wcy9QX1pBUF9NU0cKK1BfQVdBWQlwcm9wcy9QX0FXQVkKK1BfV0VBUE9OCXByb3BzL1BfV0VBUE9OCitQX0FSTU9VUlMJcHJvcHMvUF9BUk1PVVJTCitQX05QQwlwcm9wcy9QX05QQworUF9XSU1QWQlwcm9wcy9QX1dJTVBZCitQX1dJTVBZX0RJUkVDVElPTglwcm9wcy9QX1dJTVBZX0RJUkVDVElPTgorUF9IRUFMCXByb3BzL1BfSEVBTAorUF9IQglwcm9wcy9QX0hCCitQX1BPSVNPTglwcm9wcy9QX1BPSVNPTgorUF9NQVhfUE9JU09OCXByb3BzL1BfTUFYX1BPSVNPTgorUF9ESVNBQkxFX0FUVEFDSwlwcm9wcy9QX0RJU0FCTEVfQVRUQUNLCitQX0RJRV9NU0cJcHJvcHMvUF9ESUVfTVNHCitQX0tJTExTCXByb3BzL1BfS0lMTFMKK1BfQ0FMTEVEX0ZST01fSVAJcHJvcHMvUF9DQUxMRURfRlJPTV9JUAorUF9ERVNDUklQVElPTglwcm9wcy9QX0RFU0NSSVBUSU9OCitQX0dVSUxECXByb3BzL1BfR1VJTEQKK1BfTEVWRUwJcHJvcHMvUF9MRVZFTAorUF9DQVBfTkFNRQlwcm9wcy9QX0NBUF9OQU1FCitQX0VBUk1VRkZTCXByb3BzL1BfRUFSTVVGRlMKK1BfTUFSUklFRAlwcm9wcy9QX01BUlJJRUQKK1BfQU1PVU5UCXByb3BzL1BfQU1PVU5UCitQX1ZBTFVFX1BFUl9VTklUCXByb3BzL1BfVkFMVUVfUEVSX1VOSVQKK1BfV0VJR0hUX1BFUl9VTklUCXByb3BzL1BfV0VJR0hUX1BFUl9VTklUCitQX0ZVRUwJcHJvcHMvUF9GVUVMCitQX0xJR0hUREVTQwlwcm9wcy9QX0xJR0hUREVTQworUF9ET19ERVNUUlVDVAlwcm9wcy9QX0RPX0RFU1RSVUNUCitQX0xJR0hURUQJcHJvcHMvUF9MSUdIVEVECitQX0NIQVRTCXByb3BzL1BfQ0hBVFMKK1BfQ0hBVF9DSEFOQ0UJcHJvcHMvUF9DSEFUX0NIQU5DRQorUF9BQ0hBVFMJcHJvcHMvUF9BQ0hBVFMKK1BfQUNIQVRfQ0hBTkNFCXByb3BzL1BfQUNIQVRfQ0hBTkNFCitQX0JPRFkJcHJvcHMvUF9CT0RZCitQX0FHR1JFU1NJVkUJcHJvcHMvUF9BR0dSRVNTSVZFCitQX05PQ09SUFNFCXByb3BzL1BfTk9DT1JQU0UKK1BfUkVKRUNUCXByb3BzL1BfUkVKRUNUCitQX1JBQ0VfREVTQ1JJUFRJT04JcHJvcHMvUF9SQUNFX0RFU0NSSVBUSU9OCitQX1JBQ0VTVFJJTkcJcHJvcHMvUF9SQUNFU1RSSU5HCitQX0NPTlRBSU5FUglwcm9wcy9QX0NPTlRBSU5FUgorUF9GV19VTkRFUlNUQU5ECXByb3BzL1BfRldfVU5ERVJTVEFORAorUF9UUkFZCXByb3BzL1BfVFJBWQorUF9ERUZBVUxUX0lORk8JcHJvcHMvUF9ERUZBVUxUX0lORk8KK1BfTE9HX0lORk8JcHJvcHMvUF9MT0dfSU5GTworUF9QVVJTVUVSUwlwcm9wcy9QX1BVUlNVRVJTCitQX0hQX0hPT0tTCXByb3BzL1BfSFBfSE9PS1MKK1BfR0lWRU5fQU1PVU5UCXByb3BzL1BfR0lWRU5fQU1PVU5UCitQX0dJVkVOX09CSkVDVAlwcm9wcy9QX0dJVkVOX09CSkVDVAorUF9DVVJTRUQJcHJvcHMvUF9DVVJTRUQKK1BfS0VFUF9PTl9TRUxMCXByb3BzL1BfS0VFUF9PTl9TRUxMCitQX1NQRUxMUwlwcm9wcy9QX1NQRUxMUworUF9TUEVMTFJBVEUJcHJvcHMvUF9TUEVMTFJBVEUKK1BfSU5GT1JNTUUJcHJvcHMvUF9JTkZPUk1NRQorUF9XQUlURk9SCXByb3BzL1BfV0FJVEZPUgorUF9MT0NBTENNRFMJcHJvcHMvUF9MT0NBTENNRFMKK1BfQ0xPQ0tNU0cJcHJvcHMvUF9DTE9DS01TRworUF9QQVJBCXByb3BzL1BfUEFSQQorUF9TSVpFCXByb3BzL1BfU0laRQorUF9JTlRfU0hPUlQJcHJvcHMvUF9JTlRfU0hPUlQKK1BfSU5UX0xPTkcJcHJvcHMvUF9JTlRfTE9ORworUF9ST09NX01TRwlwcm9wcy9QX1JPT01fTVNHCitQX0ZVTkNfTVNHCXByb3BzL1BfRlVOQ19NU0cKK1BfTVNHX1BST0IJcHJvcHMvUF9NU0dfUFJPQgorUF9IQVVTX0VSTEFVQlQJcHJvcHMvUF9IQVVTX0VSTEFVQlQKK1BfU0VOU0lUSVZFX0lOVkVOVE9SWQlwcm9wcy9QX1NFTlNJVElWRV9JTlZFTlRPUlkKK1BfU0VOU0lUSVZFX0lOVkVOVE9SWV9UUklHR0VSCXByb3BzL1BfU0VOU0lUSVZFX0lOVkVOVE9SWV9UUklHR0VSCitQX1NFTlNJVElWRV9BVFRBQ0sJcHJvcHMvUF9TRU5TSVRJVkVfQVRUQUNLCitQX0NVUlJFTlRESVIJcHJvcHMvUF9DVVJSRU5URElSCitQX1NIT1JUX0NXRAlwcm9wcy9QX1NIT1JUX0NXRAorUF9TTk9PUEZMQUdTCXByb3BzL1BfU05PT1BGTEFHUworUF9DT01NQU5EUwlwcm9wcy9QX0NPTU1BTkRTCitQX05BTUUJcHJvcHMvUF9OQU1FCitQX05BTUVfQURKCXByb3BzL1BfTkFNRV9BREoKK1BfU0hPUlQJcHJvcHMvUF9TSE9SVAorUF9MT05HCXByb3BzL1BfTE9ORworUF9JRFMJcHJvcHMvUF9JRFMKK1BfQURKRUNUSVZFUwlwcm9wcy9QX0FESkVDVElWRVMKK1BfU0hPV19JTlYJcHJvcHMvUF9TSE9XX0lOVgorUF9DTEFTUwlwcm9wcy9QX0NMQVNTCitQX05PRFJPUAlwcm9wcy9QX05PRFJPUAorUF9OT0dFVAlwcm9wcy9QX05PR0VUCitQX1NFTlNJVElWRQlwcm9wcy9QX1NFTlNJVElWRQorUF9VSUQJcHJvcHMvUF9VSUQKK1BfRVVJRAlwcm9wcy9QX0VVSUQKK1BfV0VJR0hUCXByb3BzL1BfV0VJR0hUCitQX1RPVEFMX1dFSUdIVAlwcm9wcy9QX1RPVEFMX1dFSUdIVAorUF9FTlRFUk1TRwlwcm9wcy9QX0VOVEVSTVNHCitQX0xFQVZFTVNHCXByb3BzL1BfTEVBVkVNU0cKK1BfTEVBVkVGQUlMCXByb3BzL1BfTEVBVkVGQUlMCitQX0VOVEVSRkFJTAlwcm9wcy9QX0VOVEVSRkFJTAorUF9BUlJJVkVNU0cJcHJvcHMvUF9BUlJJVkVNU0cKK1BfREVQQVJUTVNHCXByb3BzL1BfREVQQVJUTVNHCitQX0VOVEVSQ01EUwlwcm9wcy9QX0VOVEVSQ01EUworUF9MRUFWRUNNRFMJcHJvcHMvUF9MRUFWRUNNRFMKK1BfTUFYX1BBU1NFTkdFUlMJcHJvcHMvUF9NQVhfUEFTU0VOR0VSUworUF9TVERfT0JKRUNUCXByb3BzL1BfU1REX09CSkVDVAorUF9DT01QSUxFUl9QQVRICXByb3BzL1BfQ09NUElMRVJfUEFUSAorUF9OUl9IQU5EUwlwcm9wcy9QX05SX0hBTkRTCitQX1dDCXByb3BzL1BfV0MKK1BfV0VBUE9OX1RZUEUJcHJvcHMvUF9XRUFQT05fVFlQRQorUF9EQU1fVFlQRQlwcm9wcy9QX0RBTV9UWVBFCitQX1dJRUxERUQJcHJvcHMvUF9XSUVMREVECitQX0hJVF9GVU5DCXByb3BzL1BfSElUX0ZVTkMKK1BfV0lFTERfRlVOQwlwcm9wcy9QX1dJRUxEX0ZVTkMKK1BfVU5XSUVMRF9GVU5DCXByb3BzL1BfVU5XSUVMRF9GVU5DCitQX0hJREVfRVhJVFMucmVzCXByb3BzL1BfSElERV9FWElUUy5yZXMKK1BfRlJJRU5ECXByb3BzL1BfRlJJRU5ECitQX0RBTV9ERVNDCXByb3BzL1BfREFNX0RFU0MKK1BfUVVBTElUWQlwcm9wcy9QX1FVQUxJVFkKK1BfQUxDT0hPTF9ERUxBWQlwcm9wcy9QX0FMQ09IT0xfREVMQVkKK1BfRFJJTktfREVMQVkJcHJvcHMvUF9EUklOS19ERUxBWQorUF9GT09EX0RFTEFZCXByb3BzL1BfRk9PRF9ERUxBWQorUF9IUF9ERUxBWQlwcm9wcy9QX0hQX0RFTEFZCitQX1NQX0RFTEFZCXByb3BzL1BfU1BfREVMQVkKK1BfUE9JU09OX0RFTEFZCXByb3BzL1BfUE9JU09OX0RFTEFZCitQX01BVEVSSUFMCXByb3BzL1BfTUFURVJJQUwKK29iaglvYmoKK2Rvb3JtYXN0ZXIJb2JqL2Rvb3JtYXN0ZXIKK1JFR0VMTglSRUdFTE4KK1JFQURNRQlSRUdFTE4vUkVBRE1FCit6d2VpdGllcwlSRUdFTE4vendlaXRpZXMKK1NjcmlwdGUJUkVHRUxOL1NjcmlwdGUKK2JhbGFuY2UJUkVHRUxOL2JhbGFuY2UKK25wY3MJUkVHRUxOL25wY3MKK3dhZmZlbglSRUdFTE4vd2FmZmVuCitydWVzdHVuZ2VuCVJFR0VMTi9ydWVzdHVuZ2VuCitwcm9wZXJ0aWVzLmgJcHJvcGVydGllcy5oCitnLmFiZW50ZXVyZXIJZy5hYmVudGV1cmVyCithdXN3ZWljaGVuCWcuYWJlbnRldXJlci9hdXN3ZWljaGVuCitmZXVlcmJhbGwJZy5hYmVudGV1cmVyL2ZldWVyYmFsbAoraWRlbnRpZml6aWVyZQlnLmFiZW50ZXVyZXIvaWRlbnRpZml6aWVyZQora2FtcGZzY2hyZWkJZy5hYmVudGV1cmVyL2thbXBmc2NocmVpCitsaWNodAlnLmFiZW50ZXVyZXIvbGljaHQKK3BmZWlsCWcuYWJlbnRldXJlci9wZmVpbAorc2NoYWV0eglnLmFiZW50ZXVyZXIvc2NoYWV0egorc2NobmVsbAlnLmFiZW50ZXVyZXIvc2NobmVsbAorZy5iaWVyc2NodWV0dGxlcglnLmJpZXJzY2h1ZXR0bGVyCithYnN0dWZ1bmdlbglnLmJpZXJzY2h1ZXR0bGVyL2Fic3R1ZnVuZ2VuCithbGtvaG9sZ2lmdAlnLmJpZXJzY2h1ZXR0bGVyL2Fsa29ob2xnaWZ0CitiZWxpZWZlcmUJZy5iaWVyc2NodWV0dGxlci9iZWxpZWZlcmUKK2Jlb2JhY2h0ZQlnLmJpZXJzY2h1ZXR0bGVyL2Jlb2JhY2h0ZQorYmVydWhpZ2UJZy5iaWVyc2NodWV0dGxlci9iZXJ1aGlnZQorYmllcnNjaHVlcnplCWcuYmllcnNjaHVldHRsZXIvYmllcnNjaHVlcnplCitibHViYmVyCWcuYmllcnNjaHVldHRsZXIvYmx1YmJlcgorZXJkYmViZW4JZy5iaWVyc2NodWV0dGxlci9lcmRiZWJlbgorZmxpZXNzZQlnLmJpZXJzY2h1ZXR0bGVyL2ZsaWVzc2UKK2Zsb2Vzc2UJZy5iaWVyc2NodWV0dGxlci9mbG9lc3NlCitmcmVpYmllcglnLmJpZXJzY2h1ZXR0bGVyL2ZyZWliaWVyCitoYWFyd3VjaHMJZy5iaWVyc2NodWV0dGxlci9oYWFyd3VjaHMKK2hpdHplc2NobGFnCWcuYmllcnNjaHVldHRsZXIvaGl0emVzY2hsYWcKK2xpY2h0CWcuYmllcnNjaHVldHRsZXIvbGljaHQKK21hc3NpZXJlCWcuYmllcnNjaHVldHRsZXIvbWFzc2llcmUKK25lYmVsCWcuYmllcnNjaHVldHRsZXIvbmViZWwKK251ZWNodGVybglnLmJpZXJzY2h1ZXR0bGVyL251ZWNodGVybgorcGFydHkJZy5iaWVyc2NodWV0dGxlci9wYXJ0eQorcmthdWZlCWcuYmllcnNjaHVldHRsZXIvcmthdWZlCitzYW5kCWcuYmllcnNjaHVldHRsZXIvc2FuZAorc2NoaW1tZXIJZy5iaWVyc2NodWV0dGxlci9zY2hpbW1lcgorc2NodWV0dGVsZQlnLmJpZXJzY2h1ZXR0bGVyL3NjaHVldHRlbGUKK3NjaHVldHRlbHN0YXJyZQlnLmJpZXJzY2h1ZXR0bGVyL3NjaHVldHRlbHN0YXJyZQoremF1YmVyc3BydWVjaGUJZy5iaWVyc2NodWV0dGxlci96YXViZXJzcHJ1ZWNoZQorZy5rYXJhdGUJZy5rYXJhdGUKK2Fid2VocglnLmthcmF0ZS9hYndlaHIKK2FuZ3JpZmYJZy5rYXJhdGUvYW5ncmlmZgora29uemVudHJhdGlvbglnLmthcmF0ZS9rb256ZW50cmF0aW9uCitnLmtsZXJ1cwlnLmtsZXJ1cworYmVpc3RhbmQJZy5rbGVydXMvYmVpc3RhbmQKK2JldGUJZy5rbGVydXMvYmV0ZQorYmxpdHoJZy5rbGVydXMvYmxpdHoKK2Rvbm5lcglnLmtsZXJ1cy9kb25uZXIKK2VsZW1lbnRhcnNjaGlsZAlnLmtsZXJ1cy9lbGVtZW50YXJzY2hpbGQKK2VsZW1lbnRhcnNwaGFlcmUJZy5rbGVydXMvZWxlbWVudGFyc3BoYWVyZQorZW50Zmx1Y2hlCWcua2xlcnVzL2VudGZsdWNoZQorZW50ZnJvc2NoZQlnLmtsZXJ1cy9lbnRmcm9zY2hlCitlbnRnaWZ0ZQlnLmtsZXJ1cy9lbnRnaWZ0ZQoraGVpbGUJZy5rbGVydXMvaGVpbGUKK2hlaWxpZ2Vuc2NoZWluCWcua2xlcnVzL2hlaWxpZ2Vuc2NoZWluCitoZWlsdHJhbmsJZy5rbGVydXMvaGVpbHRyYW5rCitpZGVudGlmaXppZXJlCWcua2xlcnVzL2lkZW50aWZpemllcmUKK2t1cmllcmUJZy5rbGVydXMva3VyaWVyZQorbGFldXRlcmUJZy5rbGVydXMvbGFldXRlcmUKK2xlYmVuc2tyYWZ0CWcua2xlcnVzL2xlYmVuc2tyYWZ0CitsZXVjaHRlbglnLmtsZXJ1cy9sZXVjaHRlbgorbWVzc2Vya3JlaXMJZy5rbGVydXMvbWVzc2Vya3JlaXMKK3JlZ2VuZXJpZXJlCWcua2xlcnVzL3JlZ2VuZXJpZXJlCitzY2hhZXR6CWcua2xlcnVzL3NjaGFldHoKK3NjaHV0emhhbmQJZy5rbGVydXMvc2NodXR6aGFuZAorc2VnbmUJZy5rbGVydXMvc2VnbmUKK3Nvbm5lbnNjaHV0eglnLmtsZXJ1cy9zb25uZW5zY2h1dHoKK3NwYWx0dW5nCWcua2xlcnVzL3NwYWx0dW5nCit0cmF1ZQlnLmtsZXJ1cy90cmF1ZQord2VpaGUJZy5rbGVydXMvd2VpaGUKK3d1bmRlcglnLmtsZXJ1cy93dW5kZXIKK2cuY2hhb3MJZy5jaGFvcworZy56YXViZXJlcglnLnphdWJlcmVyCitvbGQuYXBwbGllZAlvbGQuYXBwbGllZAorYXBwbGllZAlvbGQuYXBwbGllZC9hcHBsaWVkCityZW1vdmUJb2xkLmFwcGxpZWQvcmVtb3ZlCitsb2dvbglvbGQuYXBwbGllZC9sb2dvbgorbW9kaWZ5X2NvbW1hbmQJb2xkLmFwcGxpZWQvbW9kaWZ5X2NvbW1hbmQKK3F1ZXJ5X2xldmVsCW9sZC5hcHBsaWVkL3F1ZXJ5X2xldmVsCitjYXRjaF90ZWxsCW9sZC5hcHBsaWVkL2NhdGNoX3RlbGwKK2NsZWFuX3VwCW9sZC5hcHBsaWVkL2NsZWFuX3VwCitjcmVhdGUJb2xkLmFwcGxpZWQvY3JlYXRlCitoZWFydF9iZWF0CW9sZC5hcHBsaWVkL2hlYXJ0X2JlYXQKK2luaXQJb2xkLmFwcGxpZWQvaW5pdAorcmVzZXQJb2xkLmFwcGxpZWQvcmVzZXQKK19fSU5JVAlvbGQuYXBwbGllZC9fX0lOSVQKK3BhcnNlX2NvbW1hbmRfaWRfbGlzdAlvbGQuYXBwbGllZC9wYXJzZV9jb21tYW5kX2lkX2xpc3QKK3BhcnNlX2NvbW1hbmRfYWRqZWN0aXZfaWRfbGlzdAlvbGQuYXBwbGllZC9wYXJzZV9jb21tYW5kX2FkamVjdGl2X2lkX2xpc3QKK3BhcnNlX2NvbW1hbmRfcGx1cmFsX2lkX2xpc3QJb2xkLmFwcGxpZWQvcGFyc2VfY29tbWFuZF9wbHVyYWxfaWRfbGlzdAorY2F0Y2hfbXNnCW9sZC5hcHBsaWVkL2NhdGNoX21zZworYWRkX3dlaWdodAlvbGQuYXBwbGllZC9hZGRfd2VpZ2h0CitxdWVyeV9yZWFsX25hbWUJb2xkLmFwcGxpZWQvcXVlcnlfcmVhbF9uYW1lCitleGl0CW9sZC5hcHBsaWVkL2V4aXQKK3F1ZXJ5X3dlaWdodAlvbGQuYXBwbGllZC9xdWVyeV93ZWlnaHQKK2Ryb3AJb2xkLmFwcGxpZWQvZHJvcAorZ2V0CW9sZC5hcHBsaWVkL2dldAoraWQub2xkCW9sZC5hcHBsaWVkL2lkLm9sZAorY2FuX3B1dF9hbmRfZ2V0CW9sZC5hcHBsaWVkL2Nhbl9wdXRfYW5kX2dldAorcHJldmVudF9pbnNlcnQJb2xkLmFwcGxpZWQvcHJldmVudF9pbnNlcnQKK2hpbGZlLm1hZ2llcgloaWxmZS5tYWdpZXIKK2hpbGZlLnNlaGVyCWhpbGZlLnNlaGVyCitoaWxmZS5zcGllbGVyCWhpbGZlLnNwaWVsZXIKK21jbWQJbWNtZAorYWRkbWFzdGVyCW1jbWQvYWRkbWFzdGVyCithdAltY21kL2F0CitiYW5pc2gJbWNtZC9iYW5pc2gKK2NhdAltY21kL2NhdAorY2QJbWNtZC9jZAorY2xvbmUJbWNtZC9jbG9uZQorY3AJbWNtZC9jcAorZGVzdHJ1Y3QJbWNtZC9kZXN0cnVjdAorZG8JbWNtZC9kbworZWNob2FsbAltY21kL2VjaG9hbGwKK2VjaG90bwltY21kL2VjaG90bworZWQJbWNtZC9lZAorZXhlYwltY21kL2V4ZWMKK2ZyaWVkZW4JbWNtZC9mcmllZGVuCitnb3RvCW1jbWQvZ290bworZ3JlcAltY21kL2dyZXAKK2hlYWQJbWNtZC9oZWFkCitoZWlsZQltY21kL2hlaWxlCitob21lCW1jbWQvaG9tZQoraW4JbWNtZC9pbgoraW52aXMJbWNtZC9pbnZpcworbG9hZAltY21kL2xvYWQKK2xvY2FsY21kCW1jbWQvbG9jYWxjbWQKK2xzCW1jbWQvbHMKK21hbgltY21kL21hbgorbWJhbmlzaAltY21kL21iYW5pc2gKK21lY2hvCW1jbWQvbWVjaG8KK21rZGlyCW1jbWQvbWtkaXIKK21vcmUJbWNtZC9tb3JlCittc2NoYXUJbWNtZC9tc2NoYXUKK212CW1jbWQvbXYKK29yb3BheAltY21kL29yb3BheAorcGVvcGxlCW1jbWQvcGVvcGxlCitwaW5nCW1jbWQvcGluZworcHJvbXB0CW1jbWQvcHJvbXB0Citwcm90ZWN0CW1jbWQvcHJvdGVjdAorcHdkCW1jbWQvcHdkCitwd2hvCW1jbWQvcHdobworcmVtb3ZlbWFzdGVyCW1jbWQvcmVtb3ZlbWFzdGVyCitybQltY21kL3JtCitybWRpcgltY21kL3JtZGlyCitzYWxsb3cJbWNtZC9zYWxsb3cKK3NldAltY21kL3NldAorc2V0Y21zZwltY21kL3NldGNtc2cKK3NldGRtc2cJbWNtZC9zZXRkbXNnCitzaG93cHJlc2F5CW1jbWQvc2hvd3ByZXNheQorc2h1dGRvd24JbWNtZC9zaHV0ZG93bgorc25vb3AJbWNtZC9zbm9vcAordGFpbAltY21kL3RhaWwKK3RyYWVua2UJbWNtZC90cmFlbmtlCit0cmFucwltY21kL3RyYW5zCit1ZHBxCW1jbWQvdWRwcQordXBkCW1jbWQvdXBkCit1cGRhdGUJbWNtZC91cGRhdGUKK3ZlcmZvbGdlCW1jbWQvdmVyZm9sZ2UKK3ZpcwltY21kL3ZpcworemFwCW1jbWQvemFwCit6d2luZ2UJbWNtZC96d2luZ2UKK3BjbWQJcGNtZAorYWR2ZXJiCXBjbWQvYWR2ZXJiCithbGlhcwlwY21kL2FsaWFzCithbnR3b3J0ZQlwY21kL2FudHdvcnRlCithdXNnYWVuZ2UJcGNtZC9hdXNnYWVuZ2UKK2JlaGFsdGUJcGNtZC9iZWhhbHRlCitlYmVuZW4JcGNtZC9lYmVuZW4KK2VtYWlsCXBjbWQvZW1haWwKK2Vtb3RlCXBjbWQvZW1vdGUKK2VuZGUJcGNtZC9lbmRlCitlbnRnaWZ0ZQlwY21kL2VudGdpZnRlCitlcnNldHp1bmdzYW56ZWlnZQlwY21kL2Vyc2V0enVuZ3NhbnplaWdlCitlcndhcnRlCXBjbWQvZXJ3YXJ0ZQorZXJ3aWRlcmUJcGNtZC9lcndpZGVyZQorZmVobGVyCXBjbWQvZmVobGVyCitmaW5nZXIJcGNtZC9maW5nZXIKK2ZsdWVzdGVyZQlwY21kL2ZsdWVzdGVyZQorZnJhZ2UJcGNtZC9mcmFnZQorZ2VzcHJhZWNoCXBjbWQvZ2VzcHJhZWNoCitnaWIJcGNtZC9naWIKK2hpbGZlCXBjbWQvaGlsZmUKK2hpc3RvcnkJcGNtZC9oaXN0b3J5Citob2xlCXBjbWQvaG9sZQoraWRlZQlwY21kL2lkZWUKK2lnbm9yaWVyZQlwY21kL2lnbm9yaWVyZQoraW5mbwlwY21kL2luZm8KK2luZm9ybQlwY21kL2luZm9ybQoraW52ZW50dXIJcGNtZC9pbnZlbnR1cgora2t3ZXIJcGNtZC9ra3dlcgora2xldHRlcmUJcGNtZC9rbGV0dGVyZQora29ib2xkCXBjbWQva29ib2xkCitrdXJ6CXBjbWQva3Vyegora3dlcglwY21kL2t3ZXIKK2xhbmcJcGNtZC9sYW5nCittcnVmZQlwY21kL21ydWZlCittdWRzCXBjbWQvbXVkcworbmltbQlwY21kL25pbW0KK3Bhc3N3b3J0CXBjbWQvcGFzc3dvcnQKK3JrbnVkZGxlCXBjbWQvcmtudWRkbGUKK3J1ZmUJcGNtZC9ydWZlCityd2lua2UJcGNtZC9yd2lua2UKK3NhZ2UJcGNtZC9zYWdlCitzY2hhdQlwY21kL3NjaGF1CitzY2hsYWZlCXBjbWQvc2NobGFmZQorc2VsYnN0bG9lc2NodW5nCXBjbWQvc2VsYnN0bG9lc2NodW5nCitzcGVpY2hlcm4JcGNtZC9zcGVpY2hlcm4KK3NwaWVscGF1c2UJcGNtZC9zcGllbHBhdXNlCitzdGVja2UJcGNtZC9zdGVja2UKK3N0b3AJcGNtZC9zdG9wCitzdHR5CXBjbWQvc3R0eQordGVpbGUJcGNtZC90ZWlsZQordG9ldGUJcGNtZC90b2V0ZQordHJhZ2UJcGNtZC90cmFnZQordHlwbwlwY21kL3R5cG8KK3Vocm1lbGR1bmcJcGNtZC91aHJtZWxkdW5nCit1bHRyYWt1cnoJcGNtZC91bHRyYWt1cnoKK3VuYWxpYXMJcGNtZC91bmFsaWFzCit1cmwJcGNtZC91cmwKK3ZlcmJlbglwY21kL3ZlcmJlbgordm9yc2ljaHQJcGNtZC92b3JzaWNodAord2VnCXBjbWQvd2VnCit3ZXIJcGNtZC93ZXIKK3dpcmYJcGNtZC93aXJmCit6ZWlsZW4JcGNtZC96ZWlsZW4KK3plaXQJcGNtZC96ZWl0Cit6aWVoZQlwY21kL3ppZWhlCit6dWVja2UJcGNtZC96dWVja2UKK2VudGdpZnRlLmRlYWt0aXZpZXJ0CXBjbWQvZW50Z2lmdGUuZGVha3RpdmllcnQKK1JFQURNRQlSRUFETUUKK3NjbWQJc2NtZAorYWVuZGVyZQlzY21kL2FlbmRlcmUKK2F1c2dhbmcJc2NtZC9hdXNnYW5nCitiZWZlaGwJc2NtZC9iZWZlaGwKK2Jlc2NocmVpYmUJc2NtZC9iZXNjaHJlaWJlCitlY2hvCXNjbWQvZWNobworZXJsYXViZQlzY21kL2VybGF1YmUKK2V4dHJhbG9vawlzY21kL2V4dHJhbG9vaworZmVobGVybWVsZHVuZwlzY21kL2ZlaGxlcm1lbGR1bmcKK2ZsdWNodHJpY2h0dW5nCXNjbWQvZmx1Y2h0cmljaHR1bmcKK2hhdXNiYXUJc2NtZC9oYXVzYmF1CitpbnN0YW50aGF1cwlzY21kL2luc3RhbnRoYXVzCitrb3BpZXJlCXNjbWQva29waWVyZQorbGljaHQJc2NtZC9saWNodAorbG9lc2NoZQlzY21kL2xvZXNjaGUKK21lbGR1bmdlbglzY21kL21lbGR1bmdlbgorbm90aXoJc2NtZC9ub3RpegorcHJlc2F5CXNjbWQvcHJlc2F5CityZW1vdGUJc2NtZC9yZW1vdGUKK3JldmlldwlzY21kL3Jldmlldworc2NoaWViZQlzY21kL3NjaGllYmUKK3NlaGVyaGF1cwlzY21kL3NlaGVyaGF1cworc2V0aGFuZHMJc2NtZC9zZXRoYW5kcworc2V0bWluCXNjbWQvc2V0bWluCitzZXRtbWluCXNjbWQvc2V0bW1pbgorc2V0bW1vdXQJc2NtZC9zZXRtbW91dAorc2V0bW91dAlzY21kL3NldG1vdXQKK3NwZXJyZQlzY21kL3NwZXJyZQorc3Bpb24Jc2NtZC9zcGlvbgordGl0ZWwJc2NtZC90aXRlbAordWViZXJzaWNodAlzY21kL3VlYmVyc2ljaHQKK3ZlcmJpZXRlCXNjbWQvdmVyYmlldGUKK3dlcmZlCXNjbWQvd2VyZmUKK3dpegl3aXoKK2JhbGFuY2UJd2l6L2JhbGFuY2UKK2ZvcnNjaGVycHVua3RlCXdpei9mb3JzY2hlcnB1bmt0ZQordGVzdHNwaWVsZXIJd2l6L3Rlc3RzcGllbGVyCit6d2VpdHNwaWVsZXIJd2l6L3p3ZWl0c3BpZWxlcgorbHVwZQl3aXovbHVwZQora25ldGUJd2l6L2tuZXRlCittYXRlcmlhbAl3aXovbWF0ZXJpYWwKK21hdGVyaWFsbGlzdGUJd2l6L21hdGVyaWFsbGlzdGUKK3JlZ2lvbnNtYWdpZXIJd2l6L3JlZ2lvbnNtYWdpZXIKK21hdGVyaWFsZ3J1cHBlbgl3aXovbWF0ZXJpYWxncnVwcGVuCittYXRlcmlhbGVya2VubnVuZwl3aXovbWF0ZXJpYWxlcmtlbm51bmcKK21hdGVyaWFsZGIJd2l6L21hdGVyaWFsZGIKZGlmZiAtLWdpdCBhL2RvYy8ucHJvcGRlc2MgYi9kb2MvLnByb3BkZXNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNjA1MzUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvLnByb3BkZXNjCkBAIC0wLDAgKzEsMTAzMyBAQAorUF9MSUdIVAorLy8gR3JlaWZ0IGF1ZiBkZW4gTGljaHRsZXZlbCB6dS4gSGFuZGxlIHdpdGggY2FyZSAhISEKKworUF9OQU1FCisvLyBJbiBkaWVzZXIgUHJvcGVydHkgd2lyZCBkZXIgTmFtZSBkZXMgT2JqZWt0ZXMgZ2VzcGVpY2hlcnQuIEVyCisvLyBzb2xsdGUgbnVyIGF1cyBlaW5lbSBXb3J0IGJlc3RlaGVuLiBEZXIgTmFtZSBkaWVudCBkYXp1LCBkYXMKKy8vIE9iamVrdCBpbiBlaW5lbSBTYXR6IHp1IGVyd2FlaG5lbiB1bmQgd2lyZCBhdWNoIGRla2xpbmllcnQuCisKK1BfTkFNRV9BREoKKy8vIEluIGRpZXNlciBQcm9wZXJ0eSBrYW5uIGVpbiBBZGpla3RpdiBhYmdlbGVndCB3ZXJkZW4sIGRhc3MgZGFubgorLy8gYmVpIGRlciBBdXNnYWJlIG1pdHRlbHMgbmFtZSgpIG1pdGJlbnV0enQgd2lyZC4KKy8vIChJbiBkZXIgUmVnZWwgbmljaHQgbm9ldGlnLikKKworUF9TSE9SVAorLy8gSW4gZGllc2VyIFByb3BlcnR5IHdpcmQgZGllIEt1cnpiZXNjaHJlaWJ1bmcgZGVzIE9iamVrdGVzCisvLyBnZXNwZWljaGVydCwgZGllIGJlaW0gVW1zY2hhdWVuIGltIFJhdW0gb2RlciBiZWkgZGVyIEF1c2dhYmUKKy8vIGRlcyBJbnZlbnRhcnMgYXVzZ2VnZWJlbiB3aXJkLiBGdWVyIHVuc2ljaHRiYXJlIE9iamVrdGUKKy8vIHNvbGx0ZSBzaWUgMCBzZWluLgorCitQX0xPTkcKKy8vIFVudGVyIGRpZXNlciBQcm9wZXJ0eSB3aXJkIGRpZSBCZXNjaHJlaWJ1bmcgZ2VzcGVpY2hlcnQsIGRpZQorLy8gYmVpIGRlciBVbnRlcnN1Y2h1bmcgZGVzIE9iamVrdGVzIGF1c2dlZ2ViZW4gd2lyZC4KKworUF9XRUlHSFQKKy8vIERhcyBHZXdpY2h0IGVpbmVzIE9iamV0ZXMgaW4gR3JhbW0uCisKK1BfVkFMVUUKKy8vIFdlcnQgZGVzIE9iamVrdGVzIGluIEdvbGRtdWVuemVuLiBEaWVzZW4gV2VydCBlcmhhZWx0IG1hbiBiZWltCisvLyBWZXJrYXVmLiBLYXVmZW4ga29zdGV0IGVpbiBWaWVsZmFjaGVzIGhpZXJ2b24uCisKK1BfSURTCisvLyBIaWVyIHdlcmRlbiBkaWUgQmV6ZWljaG51bmdlbiBhYmdlc3BlaWNoZXJ0LCB1bnRlciBkZW5lbiBzaWNoIGRhcworLy8gT2JqZWt0IGFuZ2VzcHJvY2hlbiBmdWVobHQuCisvLyBTb2xsdGUgbnVyIG1pdHRlbHMgQWRkSWQoIGlkICk7IGdlc2V0enQgd2VyZGVuLgorCitQX0FESkVDVElWRVMKKy8vIEhpZXIgd2VyZGVuIEFkamVrdGl2ZSBnZXNwZWljaGVydCwgdW50ZXIgZGVuZW4gc2ljaCBkYXMgT2JqZWt0CisvLyBhbmdlc3Byb2NoZW4gZnVlaGx0LiBTbyBzaW5kIEtvbWJpbmF0aW9uZW4gZGVyIFN5bm9ueW1lIG1pdAorLy8gbWVocmVyZW4gQWRqZWt0aXZlbiBtb2VnbGljaC4gR2dmIHNvbGx0ZSBhdWNoIGRlciBkZWtsaW5pZXJ0ZQorLy8gRmFsbCBkZXMgQWRqZWt0aXZlcyBlaW5nZWdlYmVuIHdlcmRlbi4KKy8vIFNvbGx0ZSBudXIgbWl0dGVscyBBZGRBZGplY3RpdmUoIGFkamVjdGl2ZSApOyBnZXNldHp0IHdlcmRlbi4KKworUF9JTkZPCisvLyBHZWhlaW1lIEluZm9ybWF0aW9uLCBkaWUgZ2dmLiB1ZWJlciBlaW5lbiBaYXViZXJzcHJ1Y2gKKy8vIHZvbiBTcGllbGVybiBlcm1pdHRlbHQgd2VyZGVuIGthbm4uCisKK1BfUkVBRF9NU0cKKy8vIEhpZXIga29lbm5lbiBJbmZvcm1hdGlvbmVuIGdlc3BlaWNoZXJ0IHdlcmRlbiwgZGllIGJlaW0gTGVzZW4KKy8vIGRlcyBPYmpla3RlcyBhdXNnZWdlYmVuIHdlcmRlbi4KKworUF9VSUQKKy8vIFNpbXVsYXRpb24gZGVzIFp1Z3JpZmZzIGF1ZiBkaWUgdWlkLgorCitQX0VVSUQKKy8vIFNpbXVsYXRpb24gZGVzIFp1Z3JpZmZzIGF1ZiBkaWUgZXVpZC4KKworUF9BVVRPTE9BRE9CSgorLy8gTWl0IGRpZXNlciBQcm9wZXJ0eSB3ZXJkZW4gQXV0b2xvYWRvYmpla3RlIHZlcndhbHRldC4KKy8vIERlciBJbmhhbHQgZGVyIFByb3BlcnR5IHNpbmQgZGllIHBlcm1hbmVudGVuIEVpZ2Vuc2NoYWZ0ZW4gZGVzCisvLyBPYmpla3RlcywgZGllIGRlciBTcGllbGVyIHVlYmVycyBhdXNsb2dnZW4gaGlud2VnIGJlaWJlaGFlbHQuCisvLyBCZWltIEVpbmxvZ2dlbiB3ZXJkZW4gc2llIGF1dG9tYXRpc2NoIG5ldSBnZXNldHp0LiAoQUNIVFVORzoKKy8vIERpZSBQcm9wZXJ0eSBtdXNzIGludGVybiBzZWxic3QgdmVyd2FsdGV0IHdlcmRlbi4pCisvLyBBdXRvbG9hZG9iamVrdGUgd2VyZGVuIGJlaW0gQXVzbG9nZ2VuIG5pY2h0IGZhbGxlbmdlbGFzc2VuIQorCitQX05PR0VUCisvLyBEaWVzZSBQcm9wZXJ0eSBlbnRoYWVsdCBlaW5lIE1lbGR1bmcsIGRpZSBhdXNnZWdlYmVuIHdpcmQsIHdlbm4KKy8vIGplbWFuZCB2ZXJzdWNodCwgZGllc2VzIE9iamVrdCB6dSBuZWhtZW4uIFdpcmQgZGllIFByb3AuIGF1ZiBlaW5lbgorLy8gbmljaHQtU3RyaW5nLVdlcnQgZ2VzZXR6dCwgc28gd2lyZCBlaW5lIERlZmF1bHRtZWxkdW5nIGF1c2dlZ2ViZW4uCisKK1BfTk9EUk9QCisvLyBEaWVzZSBQcm9wZXJ0eSBlbnRoYWVsdCBlaW5lIE1lbGR1bmcsIGRpZSBhdXNnZWdlYmVuIHdpcmQsIHdlbm4KKy8vIGplbWFuZCB2ZXJzdWNodCwgZGFzIE9iamVrdCBmYWxsZW4genUgbGFzc2VuLiBXaXJkIGRpZSBQcm9wLiAgYXVmIGVpbmVuCisvLyBuaWNodC1TdHJpbmctV2VydCBnZXNldHp0LCBzbyB3aXJkIGVpbmUgRGVmYXVsdG1lbGR1bmcgYXVzZ2VnZWJlbi4KKworUF9OT0JVWQorLy8gV2VubiBkaWVzZSBQcm9wZXJ0eSBnZXNldHp0IGlzdCwgd2lyZCBkYXMgT2JqZWt0IG5hY2ggZWluZW0KKy8vIFZlcmthdWYgaW0gTGFkZW4gemVyc3RvZXJ0LCBkYW1pdCBlcyBuaWNodCB3aWVkZXIgdm9uIGVpbmVtIFNwaWVsZXIKKy8vIGdla2F1ZnQgd2VyZGVuIGthbm4uCisKK1BfTkVWRVJEUk9QCisvLyBPYmpla3RlIG1pdCBkaWVzZXIgUHJvcGVydHkgd2VyZGVuIGJlaW0gVG9kIGRlcyBTcGllbGVycyBuaWNodAorLy8gaW4gZGVuIExlaWNobmFtIGdlbGVndC4KKy8vIFBfTk9EUk9QIHdpcmQgYXV0b21hdGlzY2ggbWl0Z2VzZXR6dC4KKworUF9OUl9IQU5EUworLy8gQW56YWhsIGRlciBIYWVuZGUsIGRpZSBtYW4genVyIEJlbnV6dHVuZyBkZXMgT2JqZWt0ZXMgYmVub2V0aWd0LgorCitQX01BR0lDCisvLyBEaWVzZXMgT2JqZWt0IGlzdCBtYWdpc2NoLgorCitQX01BWF9XRUlHSFQKKy8vIE1heGltYWxlcyBHZXdpY2h0IGluIEdyYW1tLCBkYXMgaW4gZGVtIENvbnRhaW5lciB2ZXJzdGF1dCB3ZXJkZW4KKy8vIGthbm4uCisKK1BfVE9UQUxfV0VJR0hUCisvLyBHZXdpY2h0IGluY2wuIEluaGFsdCBpbiBHcmFtbS4gUF9XRUlHSFRfUEVSQ0VOVCB3aXJkIGJlcnVlY2tzaWNodGlndC4KKworUF9UUkFOU1BBUkVOVAorLy8gaXN0ICE9IDAsIHdlbm4gaGluZWluIG9kZXIgaGluYXVzZ2VzY2hhdXQgd2VyZGVuIGthbm4uCisKK1BfQ05UX1NUQVRVUworLy8gU3RhdHVzIGRlcyBDb250YWluZXJzIChvZmZlbiwgZ2VzY2hsb3NzZW4sIGFiZ2VzY2hsb3NzZW4pCisvLyBzaWVoZSBhdWNoIC9zeXMvY29udGFpbmVyLmgKKworUF9XRUlHSFRfUEVSQ0VOVAorLy8gRGllc2UgUHJvcGVydHkgZ2lidCBhbiwgd2lldmllbCBQcm96ZW50IGRlcyBHZXdpY2h0cyBkZXMgSW5oYWx0ZXMKKy8vICJuYWNoIGF1c3NlbiIgd2llZGVyZ2VnZWJlbiB3ZXJkZW4uCisKK1BfSU5UX1NIT1JUCisvLyBLdXJ6YmVzY2hyZWlidW5nLCB3ZW5uIG1hbiBzaWNoIGltIElubmVyZW4gZGVzIENvbnRhaW5lcnMKKy8vIGJlZmluZGV0LgorCitQX0lOVF9MT05HCisvLyBCZXNjaHJlaWJ1bmcsIGRpZSBtYW4gYmVrb21tdCwgd2VubiBtYW4gc2ljaCBpbiBkZW0gQ29udGFpbmVyCisvLyB1bXNjaGF1dC4KKworUF9ERVRBSUxTCisvLyBEaWVzZSBQcm9wZXJ0eSBlbnRoYWVsdCBlaW4gbWFwcGluZywgaW4gZGVyIE9iamVrdGUgaW0gUmF1bQorLy8gZGVmaW5pZXJ0IHdlcmRlbiB1bmQgQmVzY2hyZWlidW5nZW4sIGRpZSBhdXNnZWdlYmVuIHdlcmRlbiwKKy8vIHdlbm4gbWFuIHNpY2ggZGllc2UgRGV0YWlscyBhbnNjaGF1dC4KKworUF9TUEVDSUFMX0RFVEFJTFMKKy8vIE1hcHBpbmcgdm9uIERldGFpbHMsIGRpZSBiZWltIEFuc2NoYXVlbiBlaW5lIEZ1bmt0aW9uIHN0YXJ0ZW4uCisKK1BfUkVBRF9ERVRBSUxTCisvLyBEZXRhaWxzLCBkaWUgZHVyY2ggTGVzZW4gZXJtaXR0ZWx0IHdlcmRlbiBrb2VubmVuLgorCitQX1JPT01fTVNHCisvLyBMaXN0ZSBtaXQgTWVsZHVuZ2VuLCBkaWUgenVmYWVsbGlnIGltIFJhdW0gYXVzZ2VnZWJlbiB3ZXJkZW4uCisKK1BfRlVOQ19NU0cKKy8vIExpc3RlIG1pdCBGdW5rdGlvbmVuLCBkaWUgenVmYWVsbGlnIGltIFJhdW0gYXVmZ2VydWZlbiB3ZXJkZW4uCisKK1BfTVNHX1BST0IKKy8vIE51bWVyaXNjaGVyIFdlcnQgZnVlciBXYWhyc2NoZWlubGljaGtlaXQsIG1pdCBkZXIgZGllIE1lbGR1bmdlbgorLy8gdW5kL29kZXIgZGllIEZ1bmt0aW9uZW4gYXVzZ2VnZWJlbi9hdWZnZXJ1ZmVuIHdlcmRlbi4KKworUF9FWElUUworLy8gTWFwcGluZyBhbGxlciB1bm1pdHRlbGJhciBzaWNodGJhcmVuIEF1c2dhZW5nZSBtaXQgenVnZWhvZXJpZ2VuCisvLyBOYWNoYmFycmFldW1lbi4gU29sbHRlIG51ciBtaXR0ZWxzIEFkZEV4aXQoKSBiZW51dHp0IHdlcmRlbi4KKworUF9TUEVDSUFMX0VYSVRTCisvLyBEaXRvLCBhYmVyIGFuc3RhdHQgZGVzIE5hY2hiYXJyYXVtcyB3aXJkIGVpbmUgRnVua3Rpb24gKGltIFJhdW0pCisvLyBhbmdlZ2ViZW0sIGRpZSBiZWkgRWluZ2FiZSBkZXIgUmljaHR1bmcgYXVzZ2VmdWVocnQgd2lyZC4KKworUF9ET09SUworLy8gKioqIE9CU09MRVQhICoqKgorLy8gU2llaGUgUF9ET09SX0lORk9TCisKK1BfQ09NTUFORFMKKy8vIE1hcHBpbmcgdm9uIEtvbW1hbmRvcywgZGllIGltIE9iamVrdCBkZWZpbmllcnQgc2luZC4KKy8vIFNvbGx0ZSBudXIgbWl0dGVscyBBZGRDbWQoKSBiZW51dHp0IHdlcmRlbi4KKworUF9JVEVNUworLy8gRGVmaW5pdGlvbiB2b24gR2VnZW5zdGFlbmRlbiwgZGllIGluIGRlbSBSYXVtIGxpZWdlbiBzb2xsZW4uCisvLyBFcmtsYWVydW5nIGluIGVpbmVtIEV4dHJhZmlsZS4KKworUF9OT19UUE9SVAorLy8gS2FubiBmb2xnZW5kZSBXZXJ0ZSBhbm5uZWhtZW4gKGRlZmluaWVydCBpbiBtb3ZpbmcuaCk6CisvLyBOT19UUE9SVF9JTgk9IE1hbiBrYW5uIG5pY2h0IGluIGRlbiBSYXVtIGhpbmVpbiB0ZWxlcG9ydGllcmVuLgorLy8gTk9fVFBPUlRfT1VUID0gTWFuIGthbm4gbmljaHQgYXVzIGRlbSBSYXVtIGhpbmF1cyB0ZWxlcG9ydGllcmVuLgorLy8gTk9fVFBPUlQJPSBXZWRlciBub2NoLgorCitQX0lORE9PUlMKKy8vIEdlc2V0enQsIHdlbm4gdm9uIGRlbSBSYXVtIGF1cyBkZXIgSGltbWVsIG5pY2h0IHNpY2h0YmFyIGlzdC4KKy8vIERpbmdlIHdpZSBXZXR0ZXIgb2RlciBNb25kYXVmZ2FlbmdlIHdlcmRlbiBpbiBzb2xjaGVuIFJhZXVtZW4KKy8vIG5pY2h0IGdlemVpZ3QuCisvLyBBdXNzZXJkZW0KKworUF9OT01BR0lDCisvLyBBbmdhYmUgaW4gUHJvemVudCwgbWl0IHdlbGNoZXIgV2FocnNjaGVpbmxpY2hrZWl0IGluIGVpbmVtCisvLyBSYXVtIG5pY2h0IGdlemF1YmVydCB3ZXJkZW4ga2Fubi4gQmVpIE5QQydzIHplaWd0IGVzIGRpZQorLy8gUmVzaXN0ZW56IGdlZ2VuIE1hZ2llIGFuLgorLy8gKE5vY2ggbmljaHQgaW1wbGVtZW50aWVydCkKKworUF9PUkFLRUwKKy8vIFdlbm4gZGllc2UgUHJvcGVydHkgZ2VzZXR6dCBpc3QsIGthbm4gZGVyIFdhbmRlcmVyIGluIGRpZXNlbgorLy8gUmF1bSBoaW5laW4uCisKK1BfQUxJR04KKy8vIE51bWVyaXNjaGVyIFdlcnQgZnVlciBHdXQtIG9kZXIgQm9lc2hlaXQgZGVzIFdlc2Vucy4KKworUF9SQUNFCisvLyBTdHJpbmcgbWl0IGRlciBSYXNzZSBkZXMgV2VzZW5zLgorCitQX0dFTkRFUgorLy8gR3JhbW1hdGlrYWxpc2NoZXMgR2VzY2hsZWNodCBkZXMgT2JqZWt0ZXM6CisvLyAoRGVmaW5pZXJ0IGluIGxhbmd1YWdlLmgpIE1BTEUsIEZFTUFMRSBvZGVyIE5FVVRFUgorCitQX0FUVFJJQlVURVMKKy8vIE1hcHBpbmcgbWl0IGRlbiBBdHRyaWJ1dGVuIGRlcyBXZXNlbnMuCisKK1BfRk9PRAorLy8gTnVtZXJpc2NoZXIgV2VydCBmdWVyIFNhZXR0aWd1bmdzZ3JhZCBkZXMgV2VzZW5zLgorCitQX0RSSU5LCisvLyBOdW1lcmlzY2hlciBXZXJ0IGZ1ZXIgU2FldHRpZ3VuZyBkZXMgV2VzZW5zIG1pdCBHZXRyYWVua2VuLgorCitQX0FMQ09IT0wKKy8vIE51bS4gV2VydCBmdWVyIEJlc29mZmVuaGVpdC4KKworUF9NQVhfRk9PRAorLy8gTnVtZXJpc2NoZXIgV2VydCBmdWVyIGRpZSBtYXhpbWFsZSBTYWV0dGlndW5nIGRlcyBXZXNlbnMuCisKK1BfTUFYX0RSSU5LCisvLyBOdW1lcmlzY2hlciBXZXJ0IGZ1ZXIgZGllIG1heGltYWxlICdXYXNzZXJtZW5nZScgaW0gV2VzZW4uCisKK1BfTUFYX0FMQ09IT0wKKy8vIE51bWVyaXNjaGVyIFdlcnQgZnVlciBkaWUgQWxrb2hvbHZlcnRyYWVnbGljaGtlaXQgZGVzIFdlc2Vucy4KKworUF9IUAorLy8gQW56YWhsIGRlciBMZWJlbnNwdW5rdGUgZGVzIFdlc2Vucy4KKworUF9TUAorLy8gQW56YWhsIGRlciBNYWdpZXB1bmt0ZSBkZXMgV2VzZW5zLgorCitQX01BWF9IUAorLy8gTWF4aW1hbGUgQW56YWhsIGRlciBMZWJlbnNwdW5rdGUuCisKK1BfTUFYX1NQCisvLyBNYXhpbWFsZSBBbnphaGwgZGVyIE1hZ2llcHVua3RlLgorCitQX1hQCisvLyBBbnphaGwgZGVyIEVyZmFocnVuZ3NwdW5rdGUuCisKK1BfVE9UQUxfQUMKKy8vIE51bWVyaXNjaGVyIFdlcnQgZGVyIEFid2VocnN0YWVya2UgZGVzIFdlc2Vucy4KKworUF9UT1RBTF9XQworLy8gTnVtZXJpc2NoZXIgV2VydCBkZXIgQW5ncmlmZnNzdGFlcmtlIGRlcyBXZXNlbnMuCisKK1BfTVNHSU4KKy8vIFN0cmluZyBtaXQgZGVyIE1lbGR1bmcsIGRpZSBiZWltIFZlcmxhc3NlbiBlaW5lcyBSYXVtZXMgbWl0IE1fR08KKy8vIGFuIGRpZSB1ZWJyaWdlbiBBbndlc2VuZGVuIGF1c2dlZ2ViZW4gd2lyZC4KKworUF9NU0dPVVQKKy8vIFN0cmluZyBtaXQgZGVyIE1lbGR1bmcsIGRpZSBiZWltIEJldHJldGVuIGVpbmVzIFJhdW1lcyBtaXQgTV9HTworLy8gYW4gZGllIHVlYnJpZ2VuIEFud2VzZW5kZW4gYXVzZ2VnZWJlbiB3aXJkLgorCitQX01NU0dJTgorLy8gU3RyaW5nIG1pdCBkZXIgTWVsZHVuZywgZGllIGJlaW0gVmVybGFzc2VuIGVpbmVzIFJhdW1lcyBtaXQgTV9UUE9SVAorLy8gYW4gZGllIHVlYnJpZ2VuIEFud2VzZW5kZW4gYXVzZ2VnZWJlbiB3aXJkLgorCitQX01NU0dPVVQKKy8vIFN0cmluZyBtaXQgZGVyIE1lbGR1bmcsIGRpZSBiZWltIEJldHJldGVuIGVpbmVzIFJhdW1lcyBtaXQgTV9UUE9SVAorLy8gYW4gZGllIHVlYnJpZ2VuIEFud2VzZW5kZW4gYXVzZ2VnZWJlbiB3aXJkLgorCitQX1RJVExFCisvLyBUaXRlbCBkZXMgU3BpZWxlcnMuIEVyc2NoZWludCBoaW50ZXIgZGVtIE5hbWVuIGluIEt1cnovTGFuZ2Jlc2NocmVpYnVuZy4KKworUF9QUkVTQVkKKy8vIFByZXNheSBkZXMgU3BpZWxlcnMuIEVyc2NoZWludCB2b3IgZGVtIE5hbWVuIGluIEt1cnovTGFuZ2Jlc2NocmVpYnVuZy4KKy8vIEVyc2NoZWludCBhdWNoIGluIG5hbWUoKSwgYWxzbyBpbiBzYWcsIHJ1ZiwgdGVpbGUgbWl0IHVzdy4KKworUF9aQVBfTVNHCisvLyBEcmVpZWxlbWVudGlnZXMgQXJyYXk6CisvLyAxLikgTWVsZHVuZywgZGllIGRlciBNYWdpZXIgYmVpbSBaYXBwZW4gYmVrb21tdC4KKy8vIDIuKSBNZWxkdW5nLCBkaWUgZGllIFNwaWVsZXIgaW0gUmF1bSBiZWltIFphcHBlbiBiZWtvbW1lbi4KKy8vIDMuKSBNZWxkdW5nLCBkaWUgZGFzIE9wZmVyIGJlaW0gWmFwcGVuIGJla29tbXQuCisvLyBNaXQgQEB3ZXJAQCwgQEB3ZXNzZW5AQCwgLi4uIGthbm4gZGVyIE5hbWUgZGVzIE9wZmVycyB1bmQgbWl0CisvLyBAQGljaEBAIGRlciBOYW1lIGRlcyBNYWdpZXJzIGluIGRpZSBNZWxkdW5nIGVpbmdld2VidCB3ZXJkZW4uCisKK1BfVFJBTktfRklOREVOCisvLyBXZW5uIGRpZSBQcm9wZXJ0eSBhdWYgMSBzdGVodCBrYW5uIGltbWVyIGVpbiBaYXViZXJ0cmFuayBnZWZ1bmRlbgorLy8gd2VyZGVuLCBhdWNoIHdlbm4gZXIgbmljaHQgaW4gZGVyIExpc3RlIGRlcyBTcGllbGVycyBzdGVodC4KKworUF9BV0FZCisvLyBTdHJpbmcgZGVyIGF1c2dlZ2ViZW4gd2lyZCwgd2VubiBtYW4gd2VnIGlzdCB1bmQgZWluZSBNaXR0ZWlsdW5nIGJla29tbXQuCisKK1BfSUdOT1JFCisvLyBBcnJheSBkZXIgU3BpZWxlciwgZGVyZW4gTWl0dGVpbHVuZ2VuIGlnbm9yaWVydCB3ZXJkZW4uCisKK1BfV0VBUE9OCisvLyBNb21lbnRhbiBnZXp1ZWNrdGUgV2FmZmUuCisKK1BfQ09NQkFUQ01EUworLy8gRnVlciBkZW4gS2FtcGYgZ2VicmF1Y2hiYXJlIEJlZmVobGUgc3BlemllbGxlciBPYmpla3RlIChkYW1pdCBhdWNoCisvLyBNb25zdGVyIHNpZSBhdXRvbWF0aXNjaCByaWNodGlnIGFud2VuZGVuIGtvZW5uZW4pCisvLyBEZXIgSW5oYWx0IHZvbiBQX0NPTUJBVENNRFMgaXN0IGVpbiBNYXBwaW5nLCBkZXIgS2V5IGlzdCBkYXMgS29tbWFuZG8sCisvLyB1bSBkZW4gR2VnZW5zdGFuZCB6dSBiZW51dHplbiAoYWxzbyB6LkIuICJ3aXJmIGZsYW1tZW5rdWdlbCIpLCB1bmQgZGVyCisvLyBWYWx1ZSBlaW4gd2VpdGVyZXMgTWFwcGluZyBtaXQgWnVzYXR6aW5mb3MgKGRlZmluaWVydCBpbiAvc3lzL2NvbWJhdC5oKS4KKy8vIEZvbGdlbmRlIEtleXMgc2luZCBkZWZpbmllcnQ6CisvLyAtIENfTUlOLCBDX0FWRywgQ19NQVg6CisvLyAgIG1pbmltYWxlciwgbWl0dGxlcmVyIHVuZCBtYXhpbWFsZXIgU2NoYWRlbiwgZGVuIGRhcworLy8gICBPYmpla3QgbWFjaHQuIEFsbGUgQW5nYWJlbiBpbiBMRUJFTlNQVU5LVEVOLCBkLmguIERlZmVuZC1FaW5oZWl0ZW4vMTAuCisvLyAgIEJlaSBlaW5lbSBBdWZydWYgd2llICdlbmVteS0+RGVmZW5kKDIwMCtyYW5kb20oMjAwKSwgLi4uKScgaXN0IGRhbm4KKy8vICAgQ19NSU49MjAsIENfQVZHPTMwLCBDX01BWD00MC4KKy8vIC0gQ19EVFlQRVM6CisvLyAgIEFycmF5IG1pdCBkZW0gU2NoYWRlbnN0eXAgb2RlciBkZW4gU2NoYWRlbnN0eXBlbi4gQmVpbSBFaXNzdGFiCisvLyAgIHd1ZXJkZSBkZXIgRWludHJhZyBkYW5uICdDX0RUWVBFUzooe0RUX0NPTER9KScgbGF1dGVuLgorLy8gLSBDX0hFQUw6CisvLyAgIFNvbGx0ZSBkYXMgS2FtcGZvYmpla3QgdWViZXIgZGllIE1vZWdsaWNoa2VpdCB2ZXJmdWVnZW4sIGRlbiBBbndlbmRlcgorLy8gICBpcmdlbmR3aWUgenUgaGVpbGVuLCBzbyB3aXJkIGhpZXIgZGllIEhlaWx1bmcgaW4gTFAvTVAgZWluZ2V0cmFnZW4uCisvLyAgIERhcyBmdW5rdGlvbmllcnQgYXVjaCBiZWkgT2JqZWt0ZW4sIGRpZSBudXIgaGVpbGVuLCBhbHNvIHNvbnN0CisvLyAgIG5pY2h0cyBtaXQgS2FtcGYgenUgdHVuIGhhYmVuLgorLy8gICBJbSBMdXBpbmVudGFsIHouQi4gZ2lidCBlcyBQZmlyc2ljaGUsIGRpZSBiZWltIEVzc2VuIDVMUCBoZWlsZW4uIERhCisvLyAgIGthbm4gbWFuIGRhbm4gJ1NldFByb3AoUF9DT01CQVRDTURTLCAoWyJpc3MgcGZpcnNpY2giOihbQ19IRUFMOjVdKV0pKScKKy8vICAgZWludHJhZ2VuLgorLy8gRXMgc2luZCBhdWNoIG1laHJlcmUgS29tbWFuZG9zIG1vZWdsaWNoLCB6LkIuIGJlaSBPYmpla3RlbiwgZGllIHNvd29obAorLy8gaGVpbGVuIGFscyBhdWNoIEthbXBmd2lya3VuZyBoYWJlbi4KKworUF9BUk1PVVJTCisvLyBMaXN0ZSBkZXIgZ2V0cmFnZW5lbiBTY2h1dHpiZWtsZWlkdW5nZW4uCisKK1BfSEFORFMKKy8vIDMtZWxlbS4gQXJyYXkKKy8vIDEuIEVsZW0uOiBTdHJpbmcgbWl0IGRlciBNZWxkdW5nLCB3ZW5uIG9obmUgV2FmZmVuIGFuZ2VncmlmZmVuIHdpcmQuCisvLyAyLiBFbGVtLjogV2VhcG9uY2xhc3MsIHdlbm4gb2huZSBXYWZmZW4gYW5nZWdyaWZmZW4gd2lyZC4KKy8vIDMuIEVsZW0uOiBBbmdyaWZmcy10eXAsIGRlZmF1bHQgaXN0IERUX0JMVURHRU9OCisKK1BfUkVTSVNUQU5DRQorLy8gQXJyYXkgbWl0IEFuZ3JpZmZzYXJ0ZW4sIGdlZ2VuIGRpZSBkYXMgTGViZXdlc2VuIHRlaWx3ZWlzZQorLy8gcmVzaXN0ZW50IGlzdC4KKworUF9WVUxORVJBQklMSVRZCisvLyBBcnJheSBtaXQgQW5ncmlmZnNhcnRlbiwgZ2VnZW4gZGllIGRhcyBMZWJld2VzZW4gZW1wZmluZGxpY2gKKy8vIGlzdC4KKworUF9SRVNJU1RBTkNFX1NUUkVOR1RIUworLy8gTWFwcGluZyBtaXQgU2NoYWRlbnNmYWt0b3JlbiBtaW51cyAxLjAgZnVlciBqZWRlbiBTY2hhZGVuc3R5cAorLy8gLTAuNSBlbnRzcHJpY2h0IGFsc28gUmVzaXN0YW5jZSAoRmFrdG9yIDAuNSkKKy8vIDEuMCBlbnRzcHJpY2h0IGFsc28gVnVsbmVyYWJpbGl0eSAoRmFrdG9yIDIuMCkKKworUF9NQVhfSEFORFMKKy8vIEFuemFobCBkZXIgSGFlbmRlLCBkaWUgZWluIFdlc2VuIGhhdC4KKworUF9VU0VEX0hBTkRTCisvLyBBbnphaGwgZGVyIEhhZW5kZSBpbiBCZW51dHp0dW5nCisKK1BfQUJJTElUSUVTCisvLyAqKiogT0JTT0xFVCEgKioqCisvLyBTaWVoZSBQX05FV1NLSUxMUy4KKworUF9FTkVNWV9EQU1BR0UKKy8vIEdpYnQgZWluZSBLb3BpZSBkZXMgTWFwcGluZ3MgenVydWVjaywgaW4gZGVtIHZlcm1lcmt0IHdpcmQsIHdlcgorLy8gZGllc2VtIExlYmV3ZXNlbiB3ZWxjaGVuIFNjaGFkZW4genVnZWZ1ZWd0IGhhdC4KKworUF9OUEMKKy8vIEdlc2V0enQgYmVpIE1vbnN0ZXJuLgorCitQX1dJTVBZCisvLyBOdW1lcmlzY2hlciBXZXJ0LiBEYXMgV2VzZW4gZmxpZWh0LCB3ZW5uIGRpZSBMZWJlbnNwdW5rdGUKKy8vIHVudGVyIGRpZXNlbiBXZXJ0IHNpbmtlbi4KKworUF9CUklFRgorLy8gSXN0IGdlc2V0enQsIHdlbm4gZGVyIFNwaWVsZXIgbnVyIGRpZSBLdXJ6YmVzY2hyZWlidW5nIHNlaGVuIHdpbGwuCisKK1BfSEVBTAorLy8gTnVtZXJpc2NoZXIgV2VydCwgZGVyIGJlaW0gVmVyemVociBkaWVzZXMgT2JqZWt0ZXMgenUgZGVuCisvLyBMZWJlbnNwdW5rdGVuIGhpbnp1Z2V6YWVobHQgd2lyZC4gKGthbm4gYXVjaCBuZWdhdGl2IHNlaW4pCisvLyBEZXIgV2VydCBzb2xsdGUgendpc2NoZW4gKzQgdW5kIC00IGxpZWdlbiB1bmQgYmVpIGxlaWNodGVuCisvLyBNb25zdGVybiAwIHNlaW4uCisKK1BfRElTQUJMRV9BVFRBQ0sKKy8vIERhcyBMZWJld2VzZW4ga2FubiBuaWNodCBhbmdyZWlmZW4uCisKK1BfRElFX01TRworLy8gU3RyaW5nIG1pdCBkZXIgTWVsZHVuZywgZGllIGF1c2dlZ2ViZW4gd2lyZCwgd2VubiBkYXMgV2VzZW4gc3RpcmJ0LgorLy8gaXN0IGRpZSBQcm9wZXJ0eSBuaWNodCBnZXNldHp0LCBzbyBuZWhtZSAiIGZhZWxsdCB0b3QgenUgQm9kZW4uXG4iLgorCitQX0tJTExTCisvLyBBbnphaGwgZGVyIFNwaWVsZXIsIGRpZSBkaWVzZXIgU3BpZWxlciBzY2hvbiBnZXRvZXRldCBoYXQuCisvLyBVbmVybGF1YnRlIE1hbmlwdWxhdGlvbiBpc3QgZWluIFNDSFdFUkVTIFZFUkdFSEVOIGdlZ2VuCisvLyBkaWUgTXVkcmVnbGVuLgorCitQX01BSUxBRERSCisvLyBFTWFpbGFkcmVzc2UgZGVzIFNwaWVsZXJzLgorCitQX0NBTExFRF9GUk9NX0lQCisvLyBMZXR6dGUgSVAtQWRyLCB2b24gZGVyIGF1cyBzaWNoIGRlciBTcGllbGVyIGVpbmdlbG9nZ3QgaGF0LgorCitQX0NVUlJFTlRESVIKKy8vIE1vbWVudGFuZXMgVmVyemVpY2huaXMgaW4gZGVtIGRlciBTcGllbGVyIGlzdC4gKG51ciBmdWVyCisvLyBNYWdpZXIgdm9uIEJlbGFuZykKKworUF9BVVRPTE9BRAorLy8gTWFwcGluZyBtaXQgZGVyIE1lbmdlIGRlciBBdXRvbG9hZG9iamVrdGUgdW5kIGRlbiB6dWdlaC4KKy8vIFByb3BlcnRpZXMuCisKK1BfRlJPRworLy8gR2VzZXR6dCwgd2VubiBkZXIgU3BpZWxlciBlaW4gRnJvc2NoIGlzdC4KKworUF9JTlZJUworLy8gRGllIFByb3BlcnR5IFBfSU5WSVMgZGllbnQgZGF6dSwgT2JqZWt0ZSAoaW5zYmVzb25kZXJlIE1hZ2llcikgYWxzCisvLyB1bnNpY2h0YmFyIHp1IGtlbm56ZWljaG5lbi4gTWFuIHNvbGx0ZSBkcmVpIEFydGVuIHZvbiB1bnNpY2h0YmFyZW4KKy8vIE9iamVrdGVuIHVudGVyc2NoZWlkZW46CisvLyAtIEdlZ2Vuc3RhZW5kZQorLy8gICBHZWdlbnN0YWVuZGUgbWFjaHQgbWFuIHVuc2ljaHRiYXIsIGluZGVtIG1hbiBpbiBpaG5lbiBkaWUgUHJvcGVydHkKKy8vICAgUF9TSE9SVCBhdWYgMCBzZXR6dDsgd2lsbCBtYW4gZWluIE9iamVrdCB1bnNpY2h0YmFyIG1hY2hlbiwgb2huZQorLy8gICBzZWluZSBLdXJ6YmVzY2hyZWlidW5nIHp1IGFlbmRlcm4sIGthbm4gbWFuIGFiZXIgYXVjaCBQX0lOVklTIGF1ZgorLy8gICBlaW5lbiBXZXJ0IHVuZ2xlaWNoIDAgc2V0emVuLgorLy8gLSBOUENzCisvLyAgIE5QQ3MgbWFjaHQgbWFuIGViZW5mYWxscyB1bnNpY2h0YmFyLCBpbmRlbSBtYW4gaW4gaWhuZW4gZGllIFByb3BlcnR5CisvLyAgIFBfU0hPUlQgYXVmIDAgc2V0enQuIEdHZi4ga2FubiBtYW4gYXVjaCBub2NoIGRpZSBQcm9wZXJ0eSBQX0lOVklTIGF1ZgorLy8gICAxIHNldHplbi4KKy8vICAgRGVyIFVudGVyc2NoaWVkOiBCZWkgZ2VzZXR6dGVtIFBfSU5WSVMgd2lyZCBhbHMgTmFtZSAnSmVtYW5kJyB2ZXItCisvLyAgIHdlbmRldCwgYW5zb25zdGVuIGRlciBub3JtYWxlIE5hbWUgZGVzIE5QQ3MuCisvLyAtIFNwaWVsZXIgLyBNYWdpZXIKKy8vICAgU3BpZWxlciB1bmQgTWFnaWVyIG1hY2h0IG1hbiB1bnNpY2h0YmFyLCBpbmRlbSBtYW4gaWhuZW4gZGllIFByb3BlcnR5CisvLyAgIFBfSU5WSVMgYXVmIGVpbmVuIFdlcnQgPD4wIHNldHp0LgorLy8gICBTcGllbGVyIGR1ZXJmZW4gbmljaHQgdW5zaWNodGJhciBnZW1hY2h0IHdlcmRlbiEJCQkgIQorLy8gICBXaXJkIGVpbiBNYWdpZXIgdW5zaWNodGJhciBnZW1hY2h0LCBtdXNzIG1hbiBpaG0gZGllIFByb3BlcnR5CSAhCisvLyAgIFBfSU5WSVMgYXVmIGRlbiBXZXJ0IHNldHplbiwgZGVuIGRpZSBQcm9wZXJ0eSBQX0FHRSB6dSBkaWVzZW0JICEKKy8vICAgWmVpdHB1bmt0IGhhdCAoa2VpbmUgRl9RVUVSWV9NRVRIT0QgISkuCQkJCSAhCisvLyAgIFNldHp0IG1hbiBkaWUgUHJvcGVydHkgYXVmIGRlbiBXZXJ0IDEsIHNvIGVyaGFlbHQgZWluIFNwaWVsZXIsCisvLyAgIHdlbm4gZXIgZGVuIGVudHNwLiBNYWdpZXIgZmluZ2VydCwgZGllIEF1c2dhYmU6IEFsdGVyOiAwMDowMDowMiwKKy8vICAgd2FzIGdlbmF1c28gdmVycmFldGVyaXNjaCBpc3QsIHdpZSBlaW4gQWx0ZXIsIGRhc3MgYmVpIGVpbmVtCisvLyAgIHNjaGVpbmJhciBuaWNodCBlaW5nZWxvZ2d0ZW4gTWFnaWVyIGltbWVyIHdlaXRlciBob2NoZ2V6YWVobHQKKy8vICAgd2lyZC4KKworUF9HSE9TVAorLy8gR2VzZXR6dCwgd2VubiBkZXIgU3BpZWxlciB0b3QgaXN0LgorCitQX0VYVFJBX0xPT0sKKy8vIFN0cmluZywgZGVyIGVpbmVuIHp1c2FldHpsaWNoZW4gVGV4dCBpbiBkZXIgbG9uZygpLUJlc2NocmVpYnVuZworLy8gZWluZXMgU3BpZWxlcnMgZXJ6ZXVndC4KKworUF9HVUlMRAorLy8gR2lsZGUsIGRlciBkZXIgU3BpZWxlciBhbmdlaG9lcnQuCisvLyBEZXIgTmFtZSBkZXIgR2lsZGUgaXN0IGhpZXIgYWxzIFN0cmluZyBkZWZpbmllcnQuIEJlaSBTcGllbGVybgorLy8gaXN0IGRlciBXZXJ0IGRpZXNlciBQcm9wZXJ0eSBuaWVtYWxzIDAgKERlZmF1bHRtYWVzc2lnIGdlaG9lcnQKKy8vIGVpbiBTcGllbGVyIGRlciBBYmVudGV1cmVyZ2lsZGUgYW4pLgorCitQX0xFVkVMCisvLyBTcGllbGVyLUxldmVsICghPSBNYWdpZXJsZXZlbCkKKworUF9RVUVTVFMKKy8vIExpc3RlIGRlciBnZWxvZXN0ZW4gUXVlc3RzLgorCitQX0NBUF9OQU1FCisvLyBOYW1lIGRlcyBTcGllbGVycywgZGVyIGRla2xpbmllcnQgdW5kIGF1c2dlZ2VuIHdpcmQuCisvLyBOT1QgWUVUIElNUExFTUVOVEVELgorCitQX1RUWQorLy8gTmFtZSBkZXIgVGVybWluYWxlbXVsYXRpb24sIGRpZSBkZXIgU3BpZWxlciBudXR6dC4KKy8vIE5PVCBZRVQgSU1QTEVNRU5URUQuCisKK1BfU0hPV19FWElUUworLy8gR2VzZXR6dCwgd2VubiBkZXIgU3BpZWxlciBkaWUgb2ZmZW5zaWNodGxpY2hlbiBBdXNnYWVuZ2UKKy8vIGltbWVyIGF1dG9tYXRpc2NoIHNlaGVuIHdpbGwuCisKK1BfQ0FOX0VNT1RFCisvLyBHZXNldHp0LCB3ZW5uIGRlciBTcGllbGVyICdlbW90ZW4nIGthbm4uCisKK1BfRUFSTVVGRlMKKy8vIFNob3V0cyB2b24gTWFnaWVybiBtaXQgTGV2ZWwgPCBlYXJtdWZmcyB3ZXJkZW4gYWJnZWJsb2NrdAorLy8gKE51ciBmdWVyIE1hZ2llcikKKworUF9XQU5UU19UT19MRUFSTgorLy8gR2VzZXR6dCwgd2VubiBkZXIgTWFnaWVyIGRpZSBGaWxlbmFtZW4gc2VoZW4gd2lsbC4KKy8vIChOdXIgZnVlciBNYWdpZXIpLiBXaXJkIGRpZXNlIFByb3BlcnR5IGF1ZiAwIGdlc2V0enQsIGdlaGVuIGF1Y2gKKy8vIGVpbmlnZSBhbmRlcmUgRGluZ2UgbmljaHQgbWVociAtIHZlcmZvbGdlIHpCLiBFaWdlbnRsaWNoIHNvbGx0ZW4KKy8vIGRhbm4gYXVjaCBkaWUgTWFnaWVyYmVmZWhsZSB3aWUgImdvdG8iIHVzdyB1bnRlcmJ1bmRlbiB3ZXJkZW4gLQorLy8gZGFzIGtvbW10IHZpZWxsZWljaHQgbm9jaC4KKworUF9URVNUUExBWUVSCisvLyBHZXNldHp0LCB3ZW5uIGRlciBTcGllbGVyIG5pY2h0IGluIGRlciBCZXN0ZW5saXN0ZSBhdWZ0YXVjaGVuIHNvbGwuCisKK1BfQUdFCisvLyBBbHRlciBkZXMgU3BpZWxlcnMgaW4gSGVhcnQtQmVhdHMgKDEgSEIgPT0gMiBTZWt1bmRlbikKKworUF9CTElORAorLy8gVFJVRSwgd2VubiBkZXIgU3BpZWxlciBuaWNodHMgc2VoZW4ga2Fubi4KKworUF9NQVJSSUVECisvLyBFbnRoYWVsdCBlaW5lbiBTdHJpbmcgbWl0IGRlciB1aWQgZGVzIFBhcnRuZXJzCisvLyAoc29mZXJuIHZvcmhhbmRlbikKKworUF9XQworLy8gTnVtZXJpc2NoZXIgV2VydCBmdWVyIGRpZSBTdGFlcmtlIGRlciBXYWZmZS4KKworUF9EQU1fVFlQRQorLy8gU3RyaW5nIG1pdCBkZXIgQXJ0IGRlciBWZXJsZXR6dW5nLgorCitQX1dFQVBPTl9UWVBFCisvLyBBcnQgZGVyIFdhZmZlCisKK1BfV0lFTERFRAorLy8gRmxhZyBvYiBkaWUgV2FmZmUgZ2V6dWVja3QgaXN0LgorCitQX0FDCisvLyBOdW1lcmlzY2hlciBXZXJ0IGZ1ZXIgZGllIEFid2VocnN0YWVya2UgZGVyIFJ1ZXN0dW5nLgorCitQX0FSTU9VUl9UWVBFCisvLyBTdHJpbmcgZnVlciBBcnQgZGVyIFJ1ZXN0dW5nOyB3ZWxjaGVyIEtvZXJwZXJ0ZWlsIHdpcmQKKy8vIGdlc2NodWV0enQ/CisKK1BfV09STgorLy8gRmxhZywgb2IgZGllIFJ1ZXN0dW5nIGltIE1vbWVudCBnZXRyYWdlbiB3aXJkLiBGYWxscyBqYSwKKy8vIGVudGhhZWx0IGRpZSBQcm9wZXJ0eSBkYXMgVHJhZWdlcm9iamVrdC4KKworUF9BTU9VTlQKKy8vIEFuemFobCBkZXIgT2JqZWt0ZSwgZnVlciBkaWUgZGFzIE9iamVrdCBzdGVodC4KKworUF9WQUxVRV9QRVJfVU5JVAorLy8gV2VydCBpbiBHb2xkc3R1ZWNrZW4gcHJvIFVudGVyZWluaGVpdC4KKworUF9XRUlHSFRfUEVSX1VOSVQKKy8vIEdld2ljaHQgaW4gR3JhbW0gcHJvIFVudGVyZWluaGVpdC4KKworUF9GVUVMCisvLyBOdW1lcmlzY2hlciBXZXJ0IGZ1ZXIgZGllIFplaXRkYXVlciwgZGllIGRpZSBMaWNodHF1ZWxsZSBub2NoCisvLyBsZXVjaHRlbiBrYW5uLgorCitQX0xJR0hUREVTQworLy8gU3RyaW5nIG1pdCBkZXIgQmV6ZWljaG51bmcgZGVzIExldWNodHZvcmdhbmdzLCBkZW4gZGllIExpY2h0LQorLy8gcXVlbGxlIGF1c2Z1ZWhydCAobGV1Y2h0ZW5kLCBicmVubmVuZCwgZ2x1ZWhlbmQgLi4uKQorCitQX0RPX0RFU1RSVUNUCisvLyBGbGFnLCBvYiBzaWNoIGRpZSBMaWNodHF1ZWxsZSBhbSBFbmRlIGRlciBMZXVjaHR6ZWl0IHNlbGJzdAorLy8gemVyc3RvZXJ0LiAoT2RlciBzb2dhciBtaXQgU3RyaW5nIGZ1ZXIgZGllIE1lbGR1bmcsIGRpZSBiZWkKKy8vIGRlciBaZXJzdG9lcnVuZyBhbmdlZ2ViZW4gd2lyZD8pCisKK1BfTElHSFRFRAorLy8gRmxhZywgb2IgZGllIExpY2h0cXVlbGxlIGluIEJldHJpZWIgaXN0LgorCitQX0NIQVRTCisvLyBBbGlzdCBtaXQgU3RyaW5ncywgZGllIGRhcyBNb25zdGVyIHp1ZmFlbGxpZyBhdXNnaWJ0LgorCitQX0NIQVRfQ0hBTkNFCisvLyBXYWhyc2NoZWlubGljaGtlaXQsIG1pdCBkZXIgZGllIENoYXRzIGF1c2dlZ2ViZW4gd2VyZGVuLgorCitQX0FDSEFUUworLy8gQ2hhdHMsIGRpZSBkYXMgTW9uc3RlciBpbSBLYW1wZiBhdXNnaWJ0LgorCitQX0FDSEFUX0NIQU5DRQorLy8gV2FocnNjaGVpbmxpY2hrZWl0IGZ1ZXIgZGllIEF0dGFjay1DaGF0LUF1c2dhYmUuCisKK1BfQk9EWQorLy8gTnVtZXJpc2NoZXIgV2VydCBmdWVyIGRpZSBBYndlaHJzdGFlcmtlIGRlcyBibGFua2VuIEtvZXJwZXJzCisvLyBkZXMgV2VzZW5zLgorCitQX0hCCisvLyBEaWVzZSBQcm9wZXJ0eSB3aXJkIGdlc2V0enQsIHdlbm4gZGFzIE1vbnN0ZXIgaW1tZXIgZWluZW4KKy8vIGhlYXJ0X2JlYXQgaGFiZW4gc29sbC4gKFZPUlNJQ0hULCBudXIgd2VubiBlcyBXSVJLTElDSCBzZWluIG11c3MhKQorCitQX0FHR1JFU1NJVkUKKy8vIEdlc2V0enQsIHdlbm4gZGFzIFdlc2VuIHZvbiBzaWNoIGF1cyBBbmdyaWZmZSBzdGFydGV0LgorCitQX05PQ09SUFNFCisvLyBHZXNldHp0LCB3ZW5uIGltIFRvZGVzZmFsbCBrZWluIExlaWNobmFtIGVyemV1Z3Qgd2VyZGVuIHNvbGwuCisKK1BfUkVKRUNUCisvLyBFaW4gQXJyYXkgYXVzIDIgRWxlbWVudGVuLCBkYXMgYmVzdGltbXQsIGRhcyBkZXIgbnBjIG1pdCBEaW5nZW4KKy8vIHR1ZW4gc29sbCwgZGllIGlobSBnZWdlYmVuIHdlcmRlbi4KKy8vIERlZmF1bHQsIGRlciBucGMgYmVoYWVsdCBkaWUgRGluZ2UgZWluZmFjaC4KKy8vIFdlbm4gZ2VzZXR6dDoKKy8vIDEuRWxlbWVudDogQXJ0IGRlciBIYW5kbHVuZy4gKGF1cyA8bW92aW5nLmg+KQorLy8JUkVKRUNUX0dJVkU6IERlciBOUEMgZ2lidCBkYXMgT2JqZWt0IHp1cnVlY2suCisvLwlSRUpFQ1RfRFJPUDogRGVyIE5QQyBsYWVzc3QgZGFzIE9iamVrdCBmYWxsZW4uCisvLwlSRUpFQ1RfS0VFUDogRGVyIE5QQyBiZWhhZWx0IGRhcyBPYmpla3QgZG9jaC4KKy8vIDIuQXJyYXllbGVtZW50OiBNZWxkdW5nLCBtaXQgZGVyIGRlciBOUEMgZGllIEhhbmRsdW5nIGtvbW1lbnRpZXJ0LgorCitQX0VOVEVSTVNHCisvLyBBcnJheSBtaXQgendlaSBNZWxkdW5nZW4sIGVpbmUgZnVlciBkZW4gUmF1bSwgZGVuIGRlciBTcGllbGVyCisvLyB2ZXJsYWVzc3QsIHVuZCBlaW5lIGZ1ZXIgZGVuIFRyYW5zcG9ydGVyLCBpbiBkZW4gZXIgZ2VodC4KKworUF9MRUFWRU1TRworLy8gQXJyYXkgbWl0IHp3ZWkgTWVsZHVuZ2VuLCBlaW5lIGZ1ZXIgZGVuIFRyYW5zcG9ydGVyLCBkZW4gZXIgdmVybGFlc3N0LAorLy8gdW5kIGVpbmUgZnVlciBkZW4gUmF1bSBpbiBkZW4gZXIga29tbXQuCisKK1BfTEVBVkVGQUlMCisvLyBNZWxkdW5nIGFuIGVpbiBXZXNlbiwgd2VubiBlcyBhdXNzZXJoYWxiIGRlciBBbmxlZ2V6ZWl0ZW4gZGVuIFRyYW5zcG9ydGVyCisvLyB2ZXJsYXNzZW4gd2lsbC4gSXN0IGRpZSBQcm9wLiBlaW4gQXJyYXksIHNvIHdpcmQgZGFzIGVyc3RlIEVsZW1lbnQgYWxzCisvLyBtZWxkdW5nIGFuIGRhcyBXZXNlbiwgZGFzIHp3ZWl0ZSBhbHMgTWVsZHVuZyBhbiBkaWUgTWl0c3BpZWxlciBpbQorLy8gVHJhbnNwb3J0ZXIgZ2VzY2hpY2t0LgorCitQX0VOVEVSRkFJTAorLy8gTWVsZHVuZyBhbiBlaW4gV2VzZW4sIHdlbm4gZGVuIHZvbGxlbiBUcmFuc3BvcnRlciBiZXRyZXRlbiB3aWxsLgorLy8gSXN0IGRpZSBQcm9wLiBlaW4gQXJyYXksIHNvIHdpcmQgZGFzIGVyc3RlIEVsZW1lbnQgYWxzCisvLyBtZWxkdW5nIGFuIGRhcyBXZXNlbiwgZGFzIHp3ZWl0ZSBhbHMgTWVsZHVuZyBhbiBkaWUgTWl0c3BpZWxlciBpbQorLy8gUmF1bSBnZXNjaGlja3QuCisKK1BfQVJSSVZFTVNHCisvLyBNZWxkdW5nLCB3ZW5uIGRlciBUcmFuc3BvcnRlciBhbmxlZ3QuCisKK1BfREVQQVJUTVNHCisvLyBNZWxkdW5nLCBtaXQgZGVyIGVpbiBUcmFuc3BvcnRlciBhYmxlZ3QuCisKK1BfRU5URVJDTURTCisvLyBCZWZlaGxzbGlzdGUsIGRpZSB6dW0gQmV0cmV0ZW4gZGVzIFRyYW5zcG9ydGVycyBmdWVocnQuCisKK1BfTEVBVkVDTURTCisvLyBCZWZlaGxzbGlzdGUsIGRpZSB6dW0gVmVybGFzc2VuIGRlcyBUcmFuc3BvcnRlcnMgZnVlaHJ0LgorCitQX01BWF9QQVNTRU5HRVJTCisvLyBOdW1lcmlzY2hlciBXZXJ0IGZ1ZXIgZGllIG1heGltYWxlIEFuemFobCB2b24gV2VzZW4gaW4gZGVtIFRyYW5zcG9ydGVyLgorLy8gMCBiZWRldXRldCB1bmJlc2NoYWVua3RlIFNwaWVsZXJ6YWhsLgorCitQX0FSVElDTEUKKy8vIEdpYnQgYW4sIG9iIGluIGRlciBCZXNjaHJlaWJ1bmcgZWluIEFydGlrZWwgYXVzZ2VnZWJlbiB3ZXJkZW4gc29sbAorLy8gb2RlciBuaWNodC4KKworUF9MQVNUX0NPTU1BTkRfRU5WCisvLyBEZXIgUmF1bSwgaW4gZGVtIGRhcyBsZXR6dGUgS29tbWFuZG8gZWluZ2VnZWJlbiB3dXJkZS4KKworUF9ORVRERUFEX0lORk8KKy8vIEhpZXIga2FubiBlaW4gUmF1bSBJbmZvcm1hdGlvbmVuIGluIGVpbmVtIFNwaWVsZXIgendpc2NoZW5zcGVpY2hlcm4sIHdlbm4KKy8vIGRpZXNlciBpbiBkZW4gTmV0enRvdGVucmF1bSBnZW1vdmVkIHdpcmQuCisKK1BfRk9MTE9XX1NJTEVOVAorLy8gV2VubiBkaWVzZSBQcm9wZXJ0eSAxIGlzdCwgd2lyZCBkZXIgTU9WRSB2b20gdmVyZm9sZ2UgU2lsZW50IGF1c2dlLQorLy8gZnVlaHJ0LgorCitQX1NUQVJUX0hPTUUKKy8vIFJhdW0sIGluIGRlbSBkZXIgU3BpZWxlciBuYWNoIGRlbSBFaW5sb2dnZW4gbGFuZGVuIHNvbGwKKworUF9DQVJSSUVEX1ZBTFVFCisvLyBFbnRzY2hhZWRpZ3VuZywgZGllIGRlciBTcGllbGVyIGJlaW0gRWlubG9nZ2VuIGVyaGFlbHQuCisKK1BfUFJPTVBUCisvLyBEYXMgUHJvbXB0IChOdXIgZnVlciBNYWdpZXIpLgorCitQX0NBTkVDSE8KKy8vIFplaWd0IGFuLCBvYiBkZXIgU2VoZXIgImVjaG8iIGJlbnV0emVuIGthbm4gb2RlciBuaWNodC4KKworUF9QT1RJT05ST09NUworLy8gQWxpc3QgbWl0IGRlbiBOdW1tZXJuIGRlciBSYWV1bWUsIGluIGRlbmVuIGRlciBTcGllbGVyIG5vY2ggWmF1YmVyLQorLy8gdHJhZW5rZSBmaW5kZW4ga2Fubi4KKworUF9RUAorLy8gQW56YWhsIGRlciBRdWVzdHB1bmt0ZSwgZGllIGVpbiBTcGllbGVyIGhhdC4KKworUF9FTkVNWV9ERUFUSF9TRVFVRU5DRQorLy8gV2VubiBtYW4gamVtYW5kZW4gdG9ldGV0LCB3aXJkIGRpZXNlcyBpbiBzZWluZSBUb2Rlc3NlcXVlbnogZWluZ2VmdWVndC4KKworUF9DTE9ORVIKKy8vIEVudGhhZWx0IGVpbmVuIFN0cmluZyBtaXQgZGVtIE5hbWVuIGRlc2plbmlnZW4sIGRlciBkYXMgT2JqZWt0IGdlY2xvbmVkIGhhdC4KKworUF9SQUNFX0RFU0NSSVBUSU9OCisvLyBCZXNjaHJlaWJ1bmcgZGVyIFZvci9OYWNodGVpbGUgZWluZXIgUmFzc2UuCisKK1BfRE9PUl9JTkZPUworLy8gSGF0IHdhcyBtaXQgZGVuIFR1ZXJlbiB6dSB0dW4gLT4gTXVzcyBSb2NodXMgbWFsIGRva3VtZW50aWVyZW4KKworUF9BVFRSSUJVVEVTX09GRlNFVFMKKy8vIE1hcHBpbmcgbWl0IE9mZnNldHMsIGRpZSB6dSBkZW4gQXR0cmlidXRlbiBhZGRpZXJ0IHdlcmRlbiAoa29lbm5lbiBhdWNoCisvLyBuZWdhdGl2IHNlaW4pIC0gekIgUmFzc2VuYm9uaS4KKworUF9ERUFEUworLy8gQW56YWhsIGRlciBUb2RlIGRlcyBTcGllbGVycyBzZWl0IEVpbmZ1ZWhydW5nIGRpZXNlciBQcm9wZXJ0eSAoaXJnZW5kd2FubgorLy8gaW0gRGV6ZW1iZXIgOTQpCisKK1BfTEFTVF9MT0dJTgorLy8gWmVpdHB1bmt0IGRlcyBsZXR6ZW4gTG9naW5zCisKK1BfTEFTVF9MT0dPVVQKKy8vIFplaXRwdW5rdCBkZXMgbGV0emVuIExvZ291dHMKKworUF9TRUNPTkQKKy8vIFNwaWVsZXIgaXN0IFp3ZWl0aWVhCisKK1BfU0NSRUVOU0laRQorLy8gQmlsZHNjaGlybWdyb2Vzc2UgaW4gWmVpbGVuIChmdWVyIE1vcmUpCisKK1BfRkxBR1MKKy8vIEZsYWdzIGRlcyBTcGllbGVycworCitQX0NBTl9GTEFHUworLy8gRmxhZ3MsIG9iIFNwaWVsZXIgZWNob2VuL2Vtb3RlbiBrYW5uCisKK1BfTkVFREVEX1FQCisvLyBBUHMsIGRpZSBtYW4gZnVlciBkZW4gU2VoZXJzdGF0dXMgYnJhdWNodAorCitQX0lOVEVSTVVECisvLyBPYnNvbGV0PworCitQX0JVRkZFUgorLy8gRW50aGFlbHQgS29ib2xkLU5hY2hyaWNodGVuCisKK1BfQ0xBU1MKKy8vIEVudGhhZWx0IGRpZSBLbGFzc2UgKGRlZmluaWVydCBpbiBjbGFzcy5oKSwgenUgZGVyIGVpbiBPYmpla3QgZ2Vob2VydC4KKy8vIFNvbGx0ZSBudXIgbWl0IEFkZENsYXNzKCkgZ2VzZXR6dCB3ZXJkZW4uCisvLyBEYXMgc2V0emVuIGlzdCBudXIgbm9ldGlnLCB3ZW5uIGRpZSBLbGFzc2UgbmljaHQgc2Nob24gYXVzIGRlbiBJZHMKKy8vIG9kZXIgKGJlaSBMZWJld2VzZW4pIGRlciBSYXNzZSBlcnNpY2h0bGljaCBpc3QuCisKK1BfQ09OVEVOVFMKKy8vICoqKiBPQlNPTEVUISAqKioKKworUF9LSUxMRVIKKy8vID8/PworCitQX01VUkRFUl9NU0cKKy8vIFdlbGNoZSBNZWxkdW5nIHNvbGwgYXVmIGRlbSBNb2VyZGVyLUthbmFsIGVyc2NoZWluZW4/CisKK1BfS0lMTF9NU0cKKy8vIE1lbGR1bmcgYXVmIGRlbSBUb2Rlc2thbmFsLCB3ZW5uIGplbWFuZCB2b24gdW5zIGdlb3RldGV0IHdpcmQKKworUF9DT1JQU0UKKy8vIFdlbGNoZW4gQ29ycHNlIGhpbnRlcmxhc3NlbiB3aXI/CisKK1BfV0lNUFlfRElSRUNUSU9OCisvLyBGbHVjaHRyaWNodHVuZworCitQX1BPSVNPTgorLy8gV2llIHN0YXJrIHdpciB2ZXJnaWZ0ZXQgc2luZCAoMC0xMSkKKworUF9SQUNFX0RFU0NSSVBUSU9OCisvLyBSYXNzZW5iZXNjaHJlaWJ1bmcsIGRpZSBtYW4gYmVpIGRlciBXYWhsIGRlciBSYXNzZSBhYnJ1ZmVuIGthbm4KKworUF9ERUZBVUxUX0lORk8KKy8vIE5QQy1JbmZvLVN5c3RlbTogRGVmYXVsdC1BbnR3b3J0IGF1ZiBkdW1tZSBGcmFnZW4KKworUF9QVVJTVUVSUworLy8gRW50aGFlbHQgVmVyZm9sZ2VyIC0gbmljaHQgdm9uIEhhbmQgbWFuaXB1bGllcmVuIQorCitQX0hQX0hPT0tTCisvLyBXZWxjaGUgT2JqZWt0ZSBzb2xsZW4gYmVpIEhQLUFlbmRlcnVuZ2VuIGJlbmFjaHJpY2h0aWd0IHdlcmRlbj8KKworUF9DVVJTRUQKKy8vIFZlcmZsdWNodGUgV2FmZmVuL1J1ZXN0dW5nZW4ga2FubiBtYW4gbmljaHQgYXVzemllaGVuL3dlZ3N0ZWNrZW4KKworUF9TUEVMTFMKKy8vIE5QQy1TcGVsbHMKKworUF9TUEVMTFJBVEUKKy8vIE5QQy1TcGVsbHJhdGUgKGluICUpCisKK1BfSU5GT1JNTUUKKy8vIEluZm9ybWllcmVuIHVlYmVyIFNwaWVsZXIsIGRpZSBpbnMgTXVkIGtvbW1lbi9hdXMgZGVtIE11ZCBnZWhlbj8KKworUF9XQUlURk9SCisvLyBEaWUgRXJ3YXJ0ZS1MaXN0ZQorCitQX0hBVVNfRVJMQVVCVAorLy8gSGllciBkYXJmIGdlYmF1dCB3ZXJkZW4KKworUF9TSE9SVF9DV0QKKy8vIC5yZWFkbWUgYmVpIGNkIGF1c2dlYmVuIG9kZXIgbmljaHQKKworUF9QQVJBCisvLyBOdW1tZXIgZGVyIFBhcmFsbGVsd2VsdCBpbiBkZXIgZWluIFNwaWVsZXIgaXN0LgorCitQX0xPR19JTkZPCisvLyBXZW5uIGRpZXNlIFByb3BlcnR5IGdlc2V0enQgaXN0IHdpcmQgamVkZSBGcmFnZSwgZGllIGVpbgorLy8gTW9uc3RlciBuaWNodCBiZWFudHdvcnRlbiBrYW5uLCBpbSBSZXBvcnQtRmlsZSBkZXMKKy8vIHp1c3RhZW5kaWdlbiBNYWdpZXJzIGdlbG9nZ3QuCisKK1BfQ09NQkFUQ01EUworLy8gQmVmZWhsZSwgZGllIG1hbiBtaXQgU3BlemlhbHdhZmZlbiBhdXNmdWVocmVuIGthbm4gdW5kIGdlbmF1ZXJlCisvLyBJbmZvcm1hdGlvbmVuIGhpZXJ6dS4KKworUF9ERUFGCisvLyBEZXIgU3BpZWxlciBpc3QgdGF1Yi4gRmFsbHMgaGllciBlaW4gU3RyaW5nIHN0ZWh0LCB3aXJkIGRpZXNlciBiZWkKKy8vICJ0ZWlsZSAuLi4gbWl0IiBhbiBkZW4gTWl0dGVpbGVuZGVuIGF1c2dlZ2ViZW4sIGFuc29uc3RlbiBrb21tdCBudXIKKy8vICJTb3VuZHNvIGlzdCBsZWlkZXIgZ2VyYWRlIHRhdWIuXG4iCisKK1BfQVRUQUNLX0JVU1kKKy8vIEthbm4gZGVyIFNwaWVsZXIgbm9jaCBTcGV6aWFsd2FmZmVuICh6QiBGbGFtbWVua3VnZWwpIGVpbnNldHplbj8KKworUF9QUkVGRVJFRF9FTkVNWQorLy8gQXJyYXk6IDEuIEVsZW1lbnQ6IFdhaHJzY2hlaW5saWNoa2VpdCwgZGFzcyBlaW5lciBkZXIgYmV2b3J6dWd0ZW4KKy8vIEZlaW5kZSAocmVzdGxpY2hlIEVsZW1lbnRlKSBnZW5vbW1lbiB3aXJkLgorCitQX0hJU1RNSU4KKy8vIE1pbmltYWxlIExhZW5nZSwgZGllIGVpbmUgWmVpbGUgaGFiZW4gbXVzcywgdW0gaW4gZGllIEhpc3RvcnkgenUga29tbWVuCisKK1BfU0hPV19BTElBU19QUk9DRVNTSU5HCisvLyBBcmJlaXQgZGVzIFBhcnNlcnMgYmVvYmFjaHRlbiAoZGVidWdnaW5nKQorCitQX0RFRkFVTFRfTk9USUZZX0ZBSUwKKy8vIFdlbGNoZSBGZWhsZXJtZWxkdW5nIGtvbW10LCB3ZW5uIGtlaW4gT2JqZWt0IGVpbiBub3RpZnlfZmFpbCBtYWNodD8KKworUF9JUF9OQU1FCisvLyBSZWNobmVybmFtZSBkZXMgSW50ZXJhY3RpdmVzCisKK1BfQVVUSF9JTkZPCisvLyBVc2VybmFtZSBkZXMgU3BpZWxlcnMsIHdlbm4gYmVpIGlobSBlaW4gQVVUSEQgbGFldWZ0CisKK1BfTEFTVF9LSUxMRVIKKy8vIExldHp0ZXIgTW9lcmRlcyBkZXMgV2VzZW5zCisKK1BfQ0xPTkVfTVNHCisvLyBNZWxkdW5nLCBkaWUgYmVpbSBDbG9uZW4gZWluZXMgT2JqIGF1c2dlZ2VnZW4gd2lyZCAobnVyIE1hZ2llcikKKworUF9DTVNHCisvLyAqKiogT0JTT0xFVCEgKioqIFNpZWhlIFBfQ0xPTkVfTVNHCisKK1BfREVTVFJVQ1RfTVNHCisvLyBNZWxkdW5nLCBkaWUgYmVpbSBEZXN0cnVjdGVuIE9iaiBhdXNnZWdlZ2VuIHdpcmQgKG51ciBNYWdpZXIpCisKK1BfRE1TRworLy8gKioqIE9CU09MRVQhICoqKiBTaWVoZSBQX0RFU1RSVUNUX01TRworCitQX1JFQURfTkVXUworLy8gV2VsY2hlIEFydGlrZWwgYmVyZWl0cyBnZWxlc2VuIHd1cmRlIChmcnVlaGVyOiBpbiBkZXIgTVBBKQorCitQX0xBU1RfQ09OVEVOVF9DSEFOR0UKKy8vIFdhbm4gd3VyZGUgenVtIGxldHp0ZW4gTWFsIHdhcyBpbnMgT2JqIGdlc3RvcGZ0IG9kZXIgcmF1c2dlbm9tbWVuPworLy8gV2ljaHRpZyBmdWVyIGRlbiBXZWlnaHQtQ2FjaGUKKworUF9NQVhfUE9JU09OCisvLyBNYXhpbWFsZSBWZXJnaWZ0dW5nCisKK1BfREVTQ1JJUFRJT04KKy8vIEJlc2NocmVpYnVuZyBkZXMgU3BpZWxlcnMKKworUF9LRUVQX09OX1NFTEwKKy8vIEJlaSAidmVya2F1ZmUgYWxsZXMiIHdpcmQgZGFzIE9iamVrdCBiZWhhbHRlbi4KKworUF9ERVNDUklQVElPTgorLy8gQmVzY2hyZWlidW5nIGRlcyBTcGllbGVycworCitQX0tFRVBfT05fU0VMTAorLy8gT2JqZWt0IHNvbGwgYmVpIHZlcmthdWZlIGFsbGVzIGJlaGFsdGVuIHdlcmRlbgorCitQX0NMT0NLTVNHCisvLyBEaWUgTWVsZHVuZyB3aXJkIHp1ciB2b2xsZW4gU3R1bmRlIGF1c2dlZ2ViZW4KKworUF9TSVpFCisvLyBHcm9lc3NlIGRlcyBMZWJld2VzZW5zIChpbiBjbSkKKworUF9BVkVSQUdFX1NJWkUKKy8vIER1cmNoc2Nobml0dGxpY2hlIEdyb2Vzc2UgZWluZXMgV2VzZW5zIGRpZXNlciBSYXNzZSAoZGVyemVpdCBudXIgUGxheWVyKQorCitQX1BFUk1fU1RSSU5HCisvLyBGdWVyIFNwcmFjaGZsdWVjaGUuIEluIGRlbSBPYmpla3QsIGRhcyBpbiBQX1BFUk1fU1RSSU5HIHZlcm1lcmt0IGlzdCwKKy8vIHdpcmQgYmVpIFNwcmFjaGJlZmVobGVuIHBlcm11dGF0ZV9zdHJpbmcoc3RyKSBhdWZnZXJ1ZmVuIHVuZCBkZXIKKy8vIHp1cnVlY2tnZWdlYmVuZSBTdHJpbmcgc3RhdHQgZGVzc2VuIGF1c2dlZ2ViZW4uCisKK1BfUkFDRVNUUklORworLy8gR2lidCBlaW5lIGRlbSBHZXNjaGxlY2h0IGFuZ2VwYXNzdGUgQmVzY2hyZWlidW5nIGRlciBSYXNzZSB6dXJ1ZWNrCisvLyAoIlp3ZXJnIiBvZGVyICJad2VyZ2luIiBldGMuKQorCitQX1dBVEVSCisvLyBHZXdhZXNzZXJ0eXAuIEVybGFldHVlcnVuZ2VuIGluIGZpc2hpbmcuaAorCitQX0ZJU0gKKy8vIEZpc2NoZGljaHRlLiBFcmxhZXV0ZXJ1bmdlbiBpbiBmaXNoaW5nLmgKKworUF9TQ1JFRU5TSVpFCisvLyBaYWhsIGRlciBaZWlsZW4gKHdpZSBtaXQgZGVtICJ6ZWlsZW4iLUJlZmVobCBlaW5nZXN0ZWxsdCkuCisvLyBOdXIgaW0gU3BpZWxlcm9iamVrdCBzaW5udm9sbCA7KQorCitQX1NLSUxMUworLy8gKioqIE9CU09MRVQhICoqKgorLy8gU2llaGUgUF9ORVdTS0lMTFMuCisKK1BfVkFMSURfR1VJTERTCisvLyBFbnRoYWVsdCBkaWUgenVnZWxhc3NlbmVuIEdpbGRlbiB1bmQgaXN0IG51ciBmdWVyIGRlbiBHaWxkZW5tYXN0ZXIKKy8vIHZvbiBCZWRldXR1bmcuCisKK1BfR1VJTERfU0tJTExTCisvLyBHaWxkZW5wcm9wZXJ0eQorLy8gRW50aGFlbHQgZWluIE1hcHBpbmcgbWl0IGFsbGVuIFNwcnVlY2hlbiB1bmQgRmFlaGlna2VpdGVuIGRlciBHaWxkZS4KKy8vIFdpcmQgbWl0IEFkZFNraWxsKCkvQWRkU3BlbGwoKSBtb2RpZml6aWVydC4KKworUF9HVUlMRF9SRVNUUklDVElPTlMKKy8vIEdpbGRlbnByb3BlcnR5CisvLyBFbnRoYWVsdCBlaW4gTWFwcGluZyBtaXQgZGVuIEVpbnRyaXR0YmVzY2hyYWVua3VuZ2VuIGVpbmVyIEdpbGRlLgorCitQX0dVSUxEX0RFRkFVTFRfU1BFTExCT09LCisvLyBHaWxkZW5wcm9wZXJ0eQorLy8gRGVyIE5hbWUgZGVzIFNwZWxsYm9va3MsIGRhcyB2b24gZGVyIEdpbGRlIHN0YW5kYXJkbWFlc3NpZyB2ZXJ3ZW5kZXQKKy8vIHdpcmQgKGthbm4gYmVpIFNwZWxscyBtaXQgU0lfU1BFTExCT09LIHVlYmVyc2NocmllYmVuIHdlcmRlbikuCisKK1BfR1VJTERfTUFMRV9USVRMRVMKKy8vIEdpbGRlbnByb3BlcnR5CisvLyBFaW4gTWFwcGluZyBtaXQgZGVuIFN0dWZlbmJlemVpY2hudW5nZW4gZnVlciBtYWVubmxpY2hlIEdpbGRlbm1pdGdsaWVkZXIuCisvLyBBbHMgS2V5IGRpZW50IGRlciBHaWxkZW5sZXZlbC4KKworUF9HVUlMRF9GRU1BTEVfVElUTEVTCisvLyBHaWxkZW5wcm9wZXJ0eQorLy8gRWluIE1hcHBpbmcgbWl0IGRlbiBTdHVmZW5iZXplaWNobnVuZ2VuIGZ1ZXIgd2VpYmxpY2hlIEdpbGRlbm1pdGdsaWVkZXIuCisvLyBBbHMgS2V5IGRpZW50IGRlciBHaWxkZW5sZXZlbC4KKworUF9HVUlMRF9MRVZFTFMKKy8vIEdpbGRlbnByb3BlcnR5CisvLyBFaW4gTWFwcGluZyBtaXQgZGVuIFN0dWZlbmJlc2NocmFlbmt1bmdlbiBmdWVyIGRpZSBHaWxkZW5sZXZlbC4KKy8vIEFscyBLZXkgZGllbnQgZGVyIGpld2VpbGlnZSBHaWxkZW5sZXZlbC4KKworUF9TQl9TUEVMTFMKKy8vIFNwZWxsYm9va3Byb3BlcnR5CisvLyBIaWVyIHNpbmQgc2FlbXRsaWNoZSBTcGVsbHMgZGVzIFNwZWxsYm9va3MgdmVybWVya3QgKHdpcmQgbWl0IEFkZFNwZWxsKCkKKy8vIHZlcmFlbmRlcnQpLgorCitQX0dMT0JBTF9TS0lMTFBST1BTCisvLyBHaWxkZW4tIHVuZCBTcGVsbGJvb2twcm9wZXJ0eQorLy8gRWlnZW5zY2hhZnRlbiwgZGllIEFMTEUgU3BlbGxzIGVpbmVzIFNwZWxsYm9va3MgYnp3LiBBTExFIFNraWxscyB1bmQKKy8vIFNwZWxscyBlaW5lciBHaWxkZSBoYWJlbiBzb2xsZW4uCisKK1BfR1VJTERfTEVWRUwKKy8vIEdpbGRlbmxldmVsIGRlcyBTcGllbGVycyAobmljaHQgdW5iZWRpbmd0IGlkZW50aXNjaCBtaXQgZGVtIFNwaWVsZXJsZXZlbCkKKworUF9HVUlMRF9USVRMRQorLy8gR2lsZGVudGl0ZWwsIGRlciBkZW0gR2lsZGVubGV2ZWwgZGVzIFNwaWVsZXJzIGVudHNwcmljaHQuIFdpcmQgbnVyCisvLyBhbmdlemVpZ3QsIHdlbm4gUF9USVRMRT0wIGlzdC4KKworUF9HVUlMRF9SQVRJTkcKKy8vIEVpbnN0dWZ1bmcgZGVzIFNwaWVsZXJzIGluIGRlciBHaWxkZSAoendpc2NoZW4gMCB1bmQgMTAwMDApLgorLy8gV2llIHNpY2ggZGllIEVpbnN0dWZ1bmcgenVzYW1tZW5zZXR6dCwgaXN0IFNhY2hlIGRlciBqZXdlaWxpZ2VuIEdpbGRlLgorCitQX05FV1NLSUxMUworLy8gSGllciBzaW5kIHNhZW10bGljaGUgU2tpbGxzIHVuZCBTcGVsbHMgdmVybWVya3QsIGRpZSBkZXIgU3BpZWxlciBrZW5udC4KKworUF9ORVhUX1NQRUxMX1RJTUUKKy8vIFdhbm4ga2FubiBkYXMgbmFlY2hzdGUgTWFsIGdlemF1YmVydCB3ZXJkZW4/CisKK1BfSElUX0ZVTkMKKy8vIEVudGhhZWx0IGRhcyBPYmpla3QsIGRhcyBlaW5lIEhpdEZ1bmMoKSBkZWZpbmllcnQKKy8vIChmdWVyIFdhZmZlbikKKworUF9XSUVMRF9GVU5DCisvLyBFbnRoYWVsdCBkYXMgT2JqZWt0LCBkYXMgZWluZSBXaWVsZEZ1bmMoKSBkZWZpbmllcnQKKy8vIChmdWVyIFdhZmZlbikKKworUF9VTldJRUxEX0ZVTkMKKy8vIEVudGhhZWx0IGRhcyBPYmpla3QsIGRhcyBlaW5lIFVud2llbGRGdW5jKCkgZGVmaW5pZXJ0CisvLyAoZnVlciBXYWZmZW4pCisKK1BfREVGRU5EX0ZVTkMKKy8vIEVudGhhZWx0IGRhcyBPYmpla3QsIGRhcyBlaW5lIERlZmVuZEZ1bmMoKSBkZWZpbmllcnQKKy8vIChmdWVyIFJ1ZXN0dW5nZW4pCisKK1BfV0VBUl9GVU5DCisvLyBFbnRoYWVsdCBkYXMgT2JqZWt0LCBkYXMgZWluZSBXZWFyRnVuYygpIGRlZmluaWVydAorLy8gKGZ1ZXIgUnVlc3R1bmdlbikKKworUF9SRU1PVkVfRlVOQworLy8gRW50aGFlbHQgZGFzIE9iamVrdCwgZGFzIGVpbmUgUmVtb3ZlRnVuYygpIGRlZmluaWVydAorLy8gKGZ1ZXIgUnVlc3R1bmdlbikKKworUF9MRVAKKy8vIExldmVscHVua3RlIGVpbmVzIFNwaWVsZXJzCisvLyBOSUNIVCBWT04gSEFORCBTRVRaRU4hISEKKworUF9MRVBfTUFMVVMKKy8vIE1hbHVzIGF1ZiBkaWUgTGV2ZWxwdW5rdGUKKy8vIE5JQ0hUIFZPTiBIQU5EIFNFVFpFTiEhIQorCitQX09SSUdfTkFNRQorLy8gSW4gZWluZXIgTGVpY2hlIGRlciBOYW1lIGRlcyBHZXN0b3JiZW5lbi4gKG5hbWUoUkFXKSkKKworUF9OT19HTE9CQUxfQVRUQUNLCisvLyBGYWxscyBkaWVzZSBQcm9wZXJ0aWUgaW4gZWluZW0gTlBDIGdlc2V0enQgaXN0LCB3aXJkIGRpZXNlciBiZWkgZWluZW0KKy8vICJ0b2V0ZSBhbGxlIiBuaWNodCBtaXQgYW5nZWdyaWZmZW4KKy8vIChkYXMgaXN0IHpCLiBiZWkgQmVnbGVpdE5QQ3MgZ2FueiBudWV0emxpY2gpCisKK1BfREFNQUdFRAorLy8gR3JhZCBkZXIgQmVzY2hhZWRpZ3VuZyBlaW5lciBXYWZmZS9SdWVzdHVuZy4KKy8vIERpZSBQcm9wZXJ0aWUgc29sbHRlIHNvIGdlc2V0enQgc2VpbiwgZGFzcyBQX0RBTUFHRUQgKyBha3R1ZWxsZXMgUF9XQy9BQworLy8gZGllIHVyc3BydWVuZ2xpY2hlIFBfV0MvQUMgZXJnaWJ0CisKK1BfRUZGRUNUSVZFX1dDCisvLyBEaWUgZHVyY2hzY2huaXR0bGljaGUgV2lya3VuZyBlaW5lciBXYWZmZSwgYmFzaWVyZW5kIGF1ZiBQX1dDIHVuZAorLy8gZWluZXIgZ2dmLiB2b3JoYW5kZW5lbiBIaXRGdW5jKCkuCisKK1BfRUZGRUNUSVZFX0FDCisvLyBEaWUgZHVyY2hzY2huaXR0bGljaGUgV2lya3VuZyBlaW5lciBSdWVzdHVuZywgYmFzaWVyZW5kIGF1ZiBQX0FDCisvLyB1bmQgZWluZXIgZ2dmLiB2b3JoYW5kZW5lbiBEZWZlbmRGdW5jKCkuCisKK1BfSE9NRVBBR0UKKy8vIERpZSBIb21lcGFnZSBlaW5lcyBTcGllbGVycyAobWl0IGRlbSBCZWZlaGwgJ3VybCcgenUgc2V0emVuKS4KKworUF9UUE9SVF9DT1NUX0lOCisvLyBJbiBlaW5lbSBSYXVtIG1pdCBTZWhlcnRvcjogS29zdGVuYW50ZWlsLCB1bSBzaWNoIGluIGRlbiBSYXVtIHp1CisvLyB0ZWxlcG9ydGllcmVuCisKK1BfVFBPUlRfQ09TVF9PVVQKKy8vIEluIGVpbmVtIFJhdW0gbWl0IFNlaGVydG9yOiBLb3N0ZW5hbnRlaWwsIHNpY2ggYXVzIGRlbSBSYXVtIGhlcmF1cworLy8genUgdGVsZXBvcnRpZXJlbgorCitQX0hJREVfRVhJVFMKKy8vIElzdCBkaWVzZSBQcm9wZXJ0eSBpbiBlaW5lbSBSYXVtIGF1ZiBlaW5lbiBXZXJ0IHVuZ2xlaWNoIDAsIGdlc2V0enQsCisvLyB3ZXJkZW4gZWluZW0gU3BpZWxlciBmdWVyIGRpZXNlbiBSYXVtIGtlaW5lIEF1c2dhZW5nZSBhbmdlemVpZ3QuCisKK1BfVE1QX0FUVEFDS19IT09LCisvLyBNaW5kZXN0ZW5zIDMtZWxlbWVudGlnZXMgQXJyYXkgKHt6ZWl0cHVua3QsIG9iamVrdCwgZnVua3Rpb24sIC4uLn0pLgorLy8gRGllIEZ1bmt0aW9uIHdpcmQgaW0gJ29iamVrdCcgbWl0IGRlbSBGZWluZCBkZXMgTGViZXdlc2VucyBhbHMgUGFyYW1ldGVyCisvLyB6dSBCZWdpbm4gdm9uIEF0dGFjaygpIChkZXMgTGViZXdlc2VucykgYXVmZ2VydWZlbiwgd2VubiBkZXIgJ3plaXRwdW5rdCcKKy8vIG5vY2ggbmljaHQgdWViZXJzY2hyaXR0ZW4gaXN0LiBXZW5uIGRpZSBGdW5rdGlvbiAwIHp1cnVlY2tnaWJ0LCB3aXJkCisvLyBBdHRhY2soKSBhYmdlYnJvY2hlbi4gVWViZXIgb3B0aW9uYWxlIEFycmF5ZWxlbWVudGUga29lbm5lbiBkZXIgRnVua3Rpb24KKy8vIHdlaXRlcmUgUGFyYW1ldGVyIHVlYmVyZ2ViZW4gd2VyZGVuLgorCitQX1RNUF9ERUZFTkRfSE9PSworLy8gTWluZGVzdGVucyAzLWVsZW1lbnRpZ2VzIEFycmF5ICh7emVpdHB1bmt0LCBvYmpla3QsIGZ1bmt0aW9uLCAuLi59KS4KKy8vIERpZSBGdW5rdGlvbiB3aXJkIGltICdvYmpla3QnIG1pdCBkZW4gZ2xlaWNoZW4gUGFyYW1ldGVybiB3aWUgRGVmZW5kKCkKKy8vIHp1IEJlZ2lubiB2b24gRGVmZW5kKCkgKGRlcyBMZWJld2VzZW5zKSBhdWZnZXJ1ZmVuLCB3ZW5uIGRlciAnemVpdHB1bmt0JworLy8gbm9jaCBuaWNodCB1ZWJlcnNjaHJpdHRlbiBpc3QuIFdlbm4gZGllIEZ1bmt0aW9uIDAgenVydWVja2dpYnQsIHdpcmQKKy8vIERlZmVuZCgpIGFiZ2Vicm9jaGVuLCBhbnNvbnN0ZW4gd2lyZCBhbHMgUnVlY2tnYWJlIGVpbiAzLWVsZW1lbnRpZ2VzCisvLyBBcnJheSAoe3NjaGFkZW4sIHNjaGFkZW5zdHlwZW4sIHNwZWxsfSkgZXJ3YXJ0ZXQsIGRpZSBhbnN0ZWxsZSBkZXIKKy8vIERlZmVuZCgpIHVlYmVyZ2ViZW5lbiBXZXJ0ZSB2ZXJ3ZW5kZXQgd2VyZGVuLiBVZWJlciBvcHRpb25hbGUgQXJyYXktCisvLyBlbGVtZW50ZSBrb2VubmVuIGRlciBGdW5rdGlvbiB3ZWl0ZXJlIFBhcmFtZXRlciB1ZWJlcmdlYmVuIHdlcmRlbi4KKworUF9UTVBfRElFX0hPT0sKKy8vIE1pbmRlc3RlbnMgMy1lbGVtZW50aWdlcyBBcnJheSAoe3plaXRwdW5rdCwgb2JqZWt0LCBmdW5rdGlvbiwgLi4ufSkuCisvLyBEaWUgRnVua3Rpb24gd2lyZCBpbSAnb2JqZWt0JyBtaXQgZGVtIGdsZWljaGVuIFBhcmFtZXRlciB3aWUgZGllKCkKKy8vIHp1IEJlZ2lubiB2b24gZGllKCkgKGRlcyBMZWJld2VzZW5zKSBhdWZnZXJ1ZmVuLCB3ZW5uIGRlciAnemVpdHB1bmt0JworLy8gbm9jaCBuaWNodCB1ZWJlcnNjaHJpdHRlbiBpc3QuIFdlbm4gZGllIEZ1bmt0aW9uIDEgenVydWVja2dpYnQsIHdpcmQKKy8vIGRpZSgpIGFiZ2Vicm9jaGVuLiBVZWJlciBvcHRpb25hbGUgQXJyYXllbGVtZW50ZSBrb2VubmVuIGRlciBGdW5rdGlvbgorLy8gd2VpdGVyZSBQYXJhbWV0ZXIgdWViZXJnZWJlbiB3ZXJkZW4uCisKK1BfREFNX0RFU0MKKy8vIEJlc2NocmVpYnVuZyBiZXNjaGFlZGlndGVyIFdhZmZlbi9SdWVzdHVuZ2VuLgorCitQX0xBU1RfREFNVFlQRVMKKy8vIFNjaGFkZW5zdHlwZW4sIG1pdCBkZW5lbiBkYXMgbGV0enRlIGRvX2RhbWFnZSgpIHZvbiBEZWZlbmQoKSBhdXMKKy8vIGF1c2dlbG9lc3Qgd3VyZGUgKGthbm4gdm9uIExlaWNoZW4gYWJnZWZyYWd0IHdlcmRlbikuCisvLyBFbnR3ZWRlciBlaW4gQXJyYXkgbWl0IGRlbiBTY2hhZGVuc3R5cGVuIG9kZXIgMC4KKworUF9URUFNCisvLyBUZWFtb2JqZWt0LCBmYWxscyBTcGllbGVyIGluIGVpbmVtIFRlYW0gaXN0LgorCitQX1RFQU1fTkVXTUVNQkVSCisvLyBTcGllbGVyIG1vZWNodGUgaW5zIFRlYW0gdm9uIGRpZXNlbSBPYmpla3QgYXVmZ2Vub21tZW4gd2VyZGVuLgorCitQX1RFQU1fQVRUQUNLX0NNRAorLy8gQW5ncmlmZnNiZWZlaGwgZGVzIFNwaWVsZXJzLCBuaWNodCBzZXR6YmFyLgorCitQX1RFQU1fQVVUT0ZPTExPVworLy8gRm9sZ2V3dW5zY2ggZGVzIFNwaWVsZXJzLCBuaWNodCBzZXR6YmFyLgorCitQX1RFQU1fV0FOVEVEX1JPVworLy8gR2V3dWVuc2NodGUgUmVpaGUgZGVzIFNwaWVsZXJzICh2b24gMSBiaXMgTUFYX1RFQU1ST1dTKQorCitQX1RFQU1fV0lNUFlfUk9XCisvLyBGbHVjaHRyZWloZSBkZXMgU3BpZWxlcnMgKHZvbiAxIGJpcyBNQVhfVEVBTVJPV1MpCisvLyBXZW5uIGRpZSBGbHVjaHRyZWloZSA8PTEgaXN0IGlzdCBkaWUgRmx1Y2h0IGluIGVpbmUgaGludGVyZSBSZWloZQorLy8gZGVha3RpdmllcnQuCisKK1BfVEVBTV9MRUFERVIKKy8vIFRlYW1vYmpla3QsIGZhbGxzIFNwaWVsZXIgQW5mdWVocmVyIGVpbmVzIFRlYW1zIGlzdC4KKworUF9URUFNX0FTU09DX01FTUJFUlMKKy8vIEFycmF5IG1pdCBkZW4genVnZW9yZG5ldGVuIE5QQ3MgZGVzIFNwaWVsZXJzIGJ6dy4KKy8vIGRlciBTcGllbGVyLCBkZW0gZGllc2VyIE5QQyB6dWdlb3JkbmV0IGlzdC4KKy8vIFp1Z2VvcmRuZXRlIE5QQ3Mgc2luZCBhdXRvbWF0aXNjaCBpbSBUZWFtIGRlcyBTcGllbGVycy4KKy8vIERlciBadWdyaWZmIGF1ZiBkaWVzZSBQcm9wZXJ0eSBzb2xsdGUgdWViZXIgQXNzb2NNZW1iZXIoKQorLy8gYnp3LiBEZUFzc29jTWVtYmVyKCkgZXJmb2xnZW4uCisKK1BfVEVBTV9DT0xPUlMKKy8vIEdyZW56d2VydGUgZnVlciBmYXJiaWdlIEFuemVpZ2UgaW0gVGVhbWluZm8uCisvLyBBcnJheSBtaXQgNCBXZXJ0ZW4gKHsgbHBfcm90LCBscF9nZWxiLCBzcF9yb3QsIHNwX2dlbGIgfSkKZGlmZiAtLWdpdCBhL2RvYy8ucmVhZG1lIGIvZG9jLy5yZWFkbWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlkM2FiZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy8ucmVhZG1lCkBAIC0wLDAgKzEsMjUgQEAKK0Rva3VtZW50YXRpb24gdm9uIEJlZmVobGVuIHVuZCBUaGVtZW4gaW5uZXJoYWxiIGRlcyBTcGllbHM6CisgKiBoZWxwLyAgLSBhbGxnZW1laW5lIFRoZW1lbiwgZGllIEFMTEUgYmV0cmVmZmVuCisgKiBwY21kLyAgLSBkaWUgQmVmZWhsZSwgdWViZXIgZGllIG1hbiBzY2hvbiBhbHMgZWluZmFjaGVyIFNwaWVsZXIgdmVyZnVlZ3QKKyAqIHNjbWQvICAtIFNlaGVyYmVmZWhsZSB1bmQgSGlsZmVuIHp1bSBIYXVzYmF1CisgKiBtY21kLyAgLSBoaWVyIHNpbmQgZGllIE1hZ2llcmJlZmVobGUgYmVzY2hyaWViZW4KKyAqIHdpei8gICAtIGFsbGdlbWVpbmUgVGhlbWVuIGZ1ZXIgTWFnaWVyCisgKiBnLlhZWi8gLSBIaWxmZXNlaXRlbiwgZGllIHp1ciBHaWxkZSBYWVogZ2Vob2VyZW4KKworVWViZXJzaWNodCB1ZWJlciBPYmpla3RlIHVuZCBGdW5rdGlvbmVuIE11ZExpYgorICogZWZ1bi8gICAtIEZ1bmt0aW9uZW4sIGRpZSBkZXIgR2FtZURyaXZlciB6dXIgVmVyZnVlZ3VuZyBzdGVsbHQKKyAqIGxmdW4vICAgLSBGdW5rdGlvbmVuLCBkaWUgZGllIE9iamVrdGUgZGVyIE11ZExpYiB6dXIgVmVyZnVlZ3VuZyBzdGVsbGVuCisgKiBtYXN0ZXIvIC0gRnVua3Rpb25lbiwgZGllIGRhcyBNYXN0ZXJvYmplY3QgenVyIFZlcmZ1ZWd1bmcgc3RlbGx0CisKKyAqIHN0ZC8gICAgLSBEaWUgT2JqZWt0ZSBkZXMgQmFzaXMtTXVkTGliCisgKiBvYmovICAgIC0gRWluaWdlIGhpbGZyZWljaGUgWnVzYXR6b2JqZWt0ZQorCisgKiBwcm9wcy8gIC0gRGllIFByb3BlcnRpZXMKKworIEFsbGdlbWVpbmVzCisgKiBiZWlzcGllbGUvIC0gZWluaWdlIGhpbGZyZWljaGUgQmVpc3BpZWxlIGZ1ZXIgZGVuIFN0YXJ0IGlucyBNYWdpZXJsZWJlbgorCitCZWkgQWVuZGVydW5nZW4gYml0dGUgR2xvaW5zb24gQmVzY2hlaWQgZ2ViZW4gb2RlciBlaW5lIE1haWwgYW4KK0Rva3VATW9yZ2VuR3JhdWVuIHNjaGlja2VuLiBFaW5lIGdlbmF1ZXJlIFVlYmVyc2ljaHQgdWViZXIgZGFzCitIaWxmc3ZlcnplaWNobmlzIGZpbmRlc3QgRHUgaW4gZGVyIERhdGVpIC9kb2MvUkVBRE1FLgorCmRpZmYgLS1naXQgYS9kb2MvLnN5bm9ueW0gYi9kb2MvLnN5bm9ueW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJkM2U3ZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy8uc3lub255bQpAQCAtMCwwICsxIEBACitscGMgTFBDCmRpZmYgLS1naXQgYS9kb2MvS1VSUy9DT01NRU5UUyBiL2RvYy9LVVJTL0NPTU1FTlRTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZjljYTkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvS1VSUy9DT01NRU5UUwpAQCAtMCwwICsxLDc1IEBACisJQkVNRVJLVU5HRU4gWlVNIFRIRU1BIFNQSUVMVkVSREVSQkVSCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlFaW5lIGtvbnNlcXVlbnRlIFZlcndlbmR1bmcgZGVyIFdvcnRlIE1vZXJkZXIsIFZlcmJyZWNoZXIsCisJby5hZS4gdmVya2VubnQgZGVuIHdhaHJlbiBDaGFyYWt0ZXI6CisJRXMgc2luZCBlaW5mYWNoIG51ciBTcGllbHZlcmRlcmJlciwgdW5kIHNvbGx0ZW4gYXVjaCAKKwlkZW1lbnRzcHJlY2hlbmQgYmVoYW5kZWx0IHdlcmRlbi4KKworCUltIE1vbWVudCB3aXJkIG5vY2ggbmljaHQgZ2VzcGllbHQuCisJRXJnbyBnaWJ0IGVzIG5vY2gga2VpbmUgU3BpZWx2ZXJkZXJiZXIuCisKKwlXZW5uIGVzIGRlbm4gd2VsY2hlIGdpYnQsIHdpZSBnZWh0IG1hbiBtaXQgaWhuZW4gdW0gPworCS0JTWFuIHNwaWVsdCBuaWNodCBtZWhyIG1pdCBJaG5lbi4KKwktCU1hbiBuaW1tdCBpaG5lbiBkZW4gU3Bhc3MsIHNvZGFzcyBzaWUgdm9uIHNlbGJlcgorCQlhdWZob2VyZW4gbWl0enVzcGllbGVuLCBiencuIGFuZGVyZW4gZGFzIFNwaWVsCisJCXp1IHZlcmRlcmJlbi4KKworCVZvcnNjaGxhZWdlKCEpIGZ1ZXIgTWFzc25haG1lbjoKKwkKKwktCUJlbGVnZW4gbWl0IEZsdWVjaGVuLgorCisJKHpCIEVya2FlbHR1bmdlbiwgb2RlciB6ZWl0d2VpbGlnZXIgVmVybHVzdCBkZXIgRmFlaGlna2VpdCwKKwlXYWZmZW4genUgdHJhZ2VuLCBTY2hsZWNodGVzIEdld2lzc2VuLCBkYXNzIG1hbiBpbW1lciB3aWVkZXIKKwlkYXJhbiBlcmlubmVydCB3aXJkLCB3YXMgbWFuIGJvZXNlcyBnZXRhbiBoYXQuIGV0Yy4pCisJV2VyIGhhdCB3ZWl0ZXJlIElkZWVuID8/CisKKwlWb3J0ZWlsZToKKworCQkrCURpZSBCZXN0cmFmdW5nIGVyZm9sZ3QgaW5uZXJoYWxiIGRlcyBTcGllbGVzLgorCQkrCUR1cmNoIGRpZSBEYXVlciBrYW5uIGRpZSBTdHJhZmUgZmVpbiBkb3NpZXJ0CisJCQl3ZXJkZW4uCisKKwlOYWNodGVpbDogCisKKwkJKwlNYWdpZXIgc2luZCBhdWYgZGllc2UgV2Vpc2Ugc2Nod2VyIHp1CisJCQliZXN0cmFmZW4uCisKKworCS0JR2VsZCBvZGVyIFhQIHdlZ25laG1lbi4KKworCS0JSGVyYWJzdHVmdW5nLiBOdXIgaW0gTk9URkFMTAorCisJLQlBdXNzc2NobHVzcyB2b20gU3BpZWwuIE51ciBpbSBBRVVTU0VSU1RFTiBOT1RGQUxMCisKKworCVdlciBlaW4gU3BpZWx2ZXJkZXJiZXIgaXN0LCBlbnRzY2hlaWRldCBpbSBhbGxnZW1laW5lbgorCWRpZSBHZW1laW5zY2hhZnQgZGVyIFNwaWVsZW5kZW4uIERlc2hhbGIgZGFyZiBlcyBrZWluZQorCWZhdGFsZW4gRWluZ3JpZmZlIGluIGRhcyBTcGllbCBkdXJjaCBkaWUgRW50c2NoZWlkdW5nIAorCWVpbnplbG5lciBTcGllbGVyIGdlYmVuIQorCisJQkVNRVJLVU5HRU4gWlVNIFRIRU1BIEZMRUlTUyBWT04gTUFHSUVSTgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCVdlbm4gZWluIE1hZ2llciBzZWx0ZW4gaW0gU3BpZWwgaXN0LCBoZWlzc3QgZGFzIG5pY2h0LAorCWRhc3MgZXIgc2ljaCwgd2VubiBlciBlaW5tYWwgZGEgaXN0LCB1bSBzbyBzdGFlcmtlcgorCWJlbWVya2JhciBtYWNoZW4gbXVzcy4KKworCisJQkVNRVJLVU5HRU4gWlUgR0VOQVVFUkVOIFJFR0VMTgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCU1hbiBzb2xsdGUgc2ljaCBuaWNodCBhbiBpcmdlbmR3ZWxjaGVuIFphaGxlbiAod2l6X2xldmVscyksCisJVmVyb3JkbnVuZ2VuLCBHZXNjaGFlZnRzb3JkbnVnbmVuIGV0Yy4gZmVzdGhhbHRlbiwgc29uZGVybiBzaWNoCisJaW1tZXIgdm9yIEF1Z2VuIGhhbHRlbiwgZGFzcyBlcyBzaWNoIGltIGVpbiBTcGllbCBoYW5kZWx0LgorCUVzIGhhYmVuIHNpY2ggTGV1dGUgenVzYW1tZW5nZWZ1bmRlbiwgdW0gbWl0ZWluYW5kZXIgU3Bhc3MgenUKKwloYWJlbi4gRGllc2VzIFNwaWVsIGlzdCBrZWluZSBzbyBrb21wbGV4ZSBHZXNlbGxzY2hhZnQgd2llIGRpZQorCXJlYWxlOyBkZXNoYWxiIHNvbGx0ZSBlcyBhdWNoIGtlaW5lciBzbyBrb21wbGV4ZW4gUmVnZWxuCisJYmVkdWVyZmVuLgorCisJT2xwcCwgU2hlcmlmZiBkZXMgTW9yZ2VuR3JhdWVucworCVJ1bWF0YSwgTXVkQWRtIGRlcyBNb3JnZW5HcmF1ZW5zCisKKwlQLlMuOgorCQlLb21tZW50YXJlIHVuZCB3ZWl0ZXJlIFZvcnNjaGxhZWdlIHNpbmQgaGVyemxpY2gKKwkJd2lsbGtvbW1lbi4KZGlmZiAtLWdpdCBhL2RvYy9LVVJTL0xQQy1LVVJTL0NvbnRlbnRzIGIvZG9jL0tVUlMvTFBDLUtVUlMvQ29udGVudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRkNGVmYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9LVVJTL0xQQy1LVVJTL0NvbnRlbnRzCkBAIC0wLDAgKzEsMTMgQEAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDIEJhc2ljcworICAgICAgICAgICAgICAgICAgICAgIFdyaXR0ZW4gYnkgRGVzY2FydGVzIG9mIEJvcmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMyBhcHJpbCAxOTkzCisKK0ludHJvZHVjdGlvbgorQ2hhcHRlciAxOiBJbnRyb2R1Y3Rpb24gdG8gdGhlIENvZGluZyBFbnZpcm9ubWVudAorQ2hhcHRlciAyOiBUaGUgTFBDIFByb2dyYW0KK0NoYXB0ZXIgMzogTFBDIERhdGEgVHlwZXMKK0NoYXB0ZXIgNDogRnVuY3Rpb25zCitDaGFwdGVyIDU6IFRoZSBCYXNpY3Mgb2YgSW5oZXJpdGFuY2UKK0NoYXB0ZXIgNjogVmFyaWFibGUgSGFuZGxpbmcKK0NoYXB0ZXIgNzogRmxvdyBDb250cm9sCitDaGFwdGVyIDg6IFRoZSBEYXRhIFR5cGUgT2JqZWN0CmRpZmYgLS1naXQgYS9kb2MvS1VSUy9MUEMtS1VSUy9JbnRyb2R1Y3Rpb24gYi9kb2MvS1VSUy9MUEMtS1VSUy9JbnRyb2R1Y3Rpb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUzYzdmZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9LVVJTL0xQQy1LVVJTL0ludHJvZHVjdGlvbgpAQCAtMCwwICsxLDEwNiBAQAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEMgQmFzaWNzCisgICAgICAgICAgICAgICAgICAgICBXcml0dGVuIGJ5IERlc2NhcnRlcyBvZiBCb3JnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjMgYXByaWwgMTk5MworIAorIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVFJPRFVDVElPTgorICAgICAgICAgICAgICAgVGhpcyBtYW51YWwsIGhvdyB0byB1c2UgaXQsIGFuZCBpdHMgdGVybXMKKyAKK0kgaGF2ZSBzZWVuIGEgbG90IG9mIHJlcXVlc3RzIGxhdGVseSBvbiBVU0VORVQgZm9yIExQQyBtYW51YWxzLiAgSW4gYWRkaXRpb24sCit0aGUgaW1tb3J0YWxzIG9uIG15IG11ZCBoYXZlIGJlZW4gdGVsbGluZyBob3cgZ29vZCB0aGUgYnVpbGRpbmcgZG9jdW1lbnRhdGlvbgorb2YgTmlnaHRtYXJlIGlzLCBidXQgdGhhdCB0aGVyZSB3YXMganVzdCBubyBhZGVxdWF0ZSBleHBsYW5hdGlvbiBvZiB0aGUKK0xQQyBwcm9ncmFtbWluZyBsYW5ndWFnZS4gIFNvIEkgZGVjaWRlZCB0byB0cnkgbXkgaGFuZCBhdCB3cml0aW5nIGEgbWFudWFsLgorU29tZSB0aGluZ3MgeW91IHNob3VsZCBrZWVwIGluIG1pbmQuCitMUEMgaXMgYSB2ZXJ5IGVhc3kgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgdG8gbGVhcm4sIGFuZCBpdCBoYXMgcmVhbAordmFsdWUgaW4gdGhhdCBwbGFjZSBtb3N0IG9mIHVzIGtub3cgYXMgdGhlIHJlYWwgd29ybGQuICBJIGJlZ2FuIHBsYXlpbmcKK211ZHMgaW4gMTk5MSwgYW5kIGluIHRoZSBzcGFjZSBvZiBhIG1vbnRoIGNyZWF0ZWQgYW4gdW5pbXByZXNzaXZlIGFyZWEKK2FuZCBtdXNpY2lhbidzIGd1aWxkIG9uIHRoZSBvcmlnaW5hbCBCYXRlcyBDb2xsZWdlIE1VRCBjYWxsZWQgT3JsaXRoLgorQWZ0ZXIgdGhhdCwgSSBtb3ZlZCB0byBMb3MgQW5nZWxlcyBmb3IgYSB5ZWFyIGFuZCBoYWQgbm8gY29udGFjdCB3aXRoCittdWRkaW5nIG9yIGNvbXB1dGVycy4gIEluIEp1bmUgb2YgMTk5MiwgSSB3YXMgYmFjayBvbiB0aGUgaW50ZXJuZXQgYW5kCithIHdpemFyZCBvZiBJZ29yLiAgSW4gU2VwdGVtYmVyIG9mIDE5OTIgSSBiZWdhbiBjb2RpbmcgdGhlIE5pZ2h0bWFyZQorbXVkbGliIGZvciBvdXIgdXNlLCBhbmQgdGhlbiBsYXRlciBkZWNpZGVkIHRvIGRpc3RyaWJ1dGUgaXQgZHVlIHRvIHRoZXJlCitub3QgYmVpbmcgYW55IG11ZGxpYnMgZm9yIE11ZE9TIGF0IHRoZSB0aW1lIHRoYXQgYSBwZXJzb24gY291bGQganVzdCB0aHJvdwordXAgYSBydW5uaW5nIG11ZCB3aXRoIChub3csIHRoYXQgb2YgY291cnNlIGlzIG5vdCB0aGUgY2FzZSA6KSkuCitTbywgSSBoYXZlIGJlZW4gZG9pbmcgc2VyaW91cyBjb2RpbmcgZm9yIGxlc3MgdGhhbiBhIHllYXIuICBBcyBhCitQaGlsb3NvcGh5IG1ham9yIGluIGEgd29ybGQgb2YgQ29tcHV0ZXIgU2NpZW5jZSBtYWpvcnMsIEkganVzdCB3YW50IHRvCittYWtlIGNsZWFyIHRoYXQgaXQgaXMgbm90IGF0IGFsbCByZXF1aXJlZCB0aGF0IHlvdSBoYXZlIGV2ZXIgZG9uZSBhbnl0aGluZword2l0aCB5b3VyIGNvbXB1dGVyIHRoYW4gbG9nIGludG8gYSBtdWQgaW4gb3JkZXIgZm9yIHlvdSB0byByZWFsbHkgY29tZQordG8gdW5kZXJzdGFuZCBMUEMgY29kaW5nLiAgVGhpcyBtYW51YWwgbWFrZXMgdGhlIGZvbGxvd2luZyBhc3N1bXB0aW9uczoKK1NvbWVvbmUgaGFzIHRhdWdodCB5b3UgYmFzaWMgVU5JWCBjb21tYW5kcyBsaWtlIGxzLCBjZCwgbWtkaXIsIG12LCBybSwgZXRjLgorWW91IGtub3cgaG93IHRvIGVudGVyIHlvdXIgbXVkJ3MgZWRpdG9yIGFuZCB3cml0ZSBhIGZpbGUuICBObyBvdGhlcgorYXNzdW1wdGlvbnMgYXJlIG1hZGUuICBJZiB5b3Uga25vdyBDLCB5b3UgYXJlIGhhbmRpY2FwcGVkIGluIHRoYXQgTFBDCitsb29rcyBhIGxvdCBsaWtlIEMsIGJ1dCBpdCBpcyBub3QgQy4gIFlvdXIgcHJlY29uY2VwdGlvbnMgYWJvdXQKK21vZHVsYXIgcHJvZ3JhbW1pbmcgZGV2ZWxvcG1lbnQgd2lsbCBiZSBhIGhpbmRlcmVuY2UgeW91IHdpbGwgaGF2ZSB0bworb3ZlcmNvbWUuICBJZiB5b3UgaGF2ZSBuZXZlciBoZWFyZCBvZiB0aGUgQyBwcm9ncmFtbWluZyBsYW5ndWFnZSAobGlrZQorbWUgaW4gTWF5IG9mIDE5OTEpLCB0aGVuIHlvdSBhcmUgb25seSBtaXNzaW5nIGFuIHVuZGVyc3RhbmRpbmcgb2YgdGhlCitzaW1wbGUgY29uc3RydWN0cyBvZiBDIGxpa2UgdGhlIGZsb3cgb2YgcHJvZ3JhbSBleGVjdXRpb24gYW5kIGxvZ2ljYWwKK29wZXJhdG9ycyBhbmQgc3VjaC4gIFNvIGEgQyBndXJ1IGhhcyBubyByZWFsIGFkdmFudGFnZSBvdmVyIHlvdSwgc2luY2UKK3doYXQgdGhleSBrbm93IGZyb20gQyB3aGljaCBpcyBhcHBsaWNhYmxlIHRvIExQQyBpcyBlYXN5IHRvIHBpY2sgdXAuCitUaGUgc3R1ZmYgdGhleSBrbm93IGFib3V0IEMgd2hpY2ggbWFrZXMgdGhlbSBhIGd1cnUgaXMgaXJyZWxldmFudCB0bworTFBDLgorIAorVGhlIGNoYXB0ZXJzIG9mIHRoaXMgbWFudWFsIGFyZSBtZWFudCB0byBiZSByZWFkIGluIG9yZGVyLiAgU3RhcnRpbmcgd2l0aAordGhlIGludHJvZHVjdGlvbiwgZ29pbmcgc2VxdWVudGlhbGx5IHRocm91Z2ggdGhlIGNoYXB0ZXIgbnVtYmVycyBhcworb3JkZXJlZCBpbiB0aGUgY29udGVudHMgZmlsZS4gIEVhY2ggY2hhcHRlciBiZWdpbnMgd2l0aCBhIHBhcmFncmFwaCBvcgordHdvIGV4cGxhaW5pbmcgd2hhdCB5b3Ugc2hvdWxkIGhhdmUgY29tZSB0byB1bmRlcnN0YW5kIGJ5IHRoYXQgcG9pbnQKK2luIHlvdXIgc3R1ZGllcy4gIEFmdGVyIHRob3NlIGludHJvZHVjdG9yeSBwYXJhZ3JhcGhzLCB0aGUgY2hhcHRlciB0aGVuCitiZWdpbnMgdG8gZGlzY3VzcyBpdHMgc3ViamVjdCBtYXR0ZXIgaW4gbmF1c2VhdGluZyBkZXRhaWwuICBBdCB0aGUgZW5kCitvZiB0aGUgY2hhcHRlciBpcyBhIGJyaWVmbHkgd29yZGVkIHN1bW1hcnkgb2Ygd2hhdCB5b3Ugc2hvdWxkIHVuZGVyc3RhbmQKK2Zyb20gdGhhdCBjaGFwdGVyIGlmIEkgaGF2ZSBiZWVuIHN1Y2Nlc3NmdWwuICBGb2xsb3dpbmcgdGhhdCBtYXkgb3IgbWF5Citub3QgYmUgc29tZSBzaWRlbm90ZXMgcmVsZXZhbnQgdG8gdGhlIHN1YmplY3QgYXQgaGFuZCwgYnV0IG5vdCBuZWNlc3NhcnkKK3RvIGl0cyB1bmRlcnN0YW5kaW5nLgorIAorSWYgYXQgYW55IHRpbWUgeW91IGdldCB0byBhIGNoYXB0ZXIgaW50cm8sIGFuZCB5b3UgaGF2ZSByZWFkIHRoZSBwcmVjZWVkaW5nCitjaGFwdGVycyB0aG9yb3VnaGx5IGFuZCB5b3UgZG8gbm90IHVuZGVyc3RhbmQgd2hhdCBpdCBzYXlzIHlvdSBzaG91bGQKK3VuZGVyc3RhbmQgYnkgdGhhdCBwb2ludCwgcGxlYXNlIG1haWwgbWUhICBDbGVhcmx5LCBJIGhhdmUgZmFpbGVkIGF0IHRoYXQKK3BvaW50IGFuZCBJIG5lZWQgdG8ga25vdyB3aGVyZSBpdCBpcyBJIGhhdmUgZ29uZSB3cm9uZyBzbyBJIGNhbiByZXZpc2UKK2l0IHByb3Blcmx5LiAgU2ltaWxhcmx5LCBpZiB5b3UgZG8gbm90IHVuZGVyc3RhbmQgd2hhdCB0aGUgY2hhcHRlciBzdW1tYXJ5CitzYXlzIHlvdSBzaG91bGQsIHBsZWFzZSBtYWlsIG1lLiAgSWYgeW91ciBtdW11ZCBpcyBvbiB0aGUgTXVkT1MgaW50ZXJtdWQKK3N5c3RlbSwgbWFpbCBkZXNjYXJ0ZXNAbmlnaHRtYXJlLiAgT3RoZXJ3aXNlIG1haWwgYm9yZ0BoZWJyb24uY29ubmVjdGVkLmNvbS4KKyAKK1NvbWUgYmFzaWMgdGVybXMgdGhpcyBtYW51YWwgdXNlczoKK2RyaXZlci0KK1RoaXMgaXMgdGhlIEMgcHJvZ3JhbSB3aGljaCBpcyB0aGUgZ2FtZS4gIEl0IGFjY2VwdHMgaW5jb21pbmcgc29ja2V0cworKGxpbmtzIHRvIG90aGVyIGNvbXB1dGVycyksIGludGVycHJldHMgTFBDIGNvZGUgZGVmaW5lZCBieSB0aGUgbXVkbGliLAora2VlcHMgbXVkIG9iamVjdHMgaW4gbWVtb3J5LCBtYWtlcyBwZXJpb2RpYyBhdHRlbXB0cyB0byBjbGVhbiB1bnVzZWQKK211ZCBvYmplY3RzIGZyb20gbWVtb3J5LCBtYWtlcyBwZXJpb2RpYyBjYWxscyB0byBvYmplY3RzLCBhbmQgc28gb24uCisgCittdWRsaWItCitMUEMgY29kZSB3aGljaCBkZWZpbmVzIHRoZSB3b3JsZCBpbiB3aGljaCB5b3UgYXJlIGluLiAgVGhlIGRyaXZlciBvZiBpdHNlbGYKK2lzIG5vdCBhIGdhbWUuICBJdCBpcyBqdXN0IGEgcHJvZ3JhbSB3aGljaCBhbGxvd3MgdGhlIGNyZWF0aW9uIG9mIGEKK211bHRpLXVzZXIgZW52aXJvbm1lbnQuICBJbiBzb21lIHNlbnNlLCB0aGUgZHJpdmVyIGlzIGxpa2UgYW4gTFBDCitjb21waWxlciwgYW5kIHRoZSBtdWRsaWIgaXMgbGlrZSBhIGNvbXBpbGVyJ3MgbGlicmFyeSAoYSB2ZXJ5IGxvb3NlCithbmFsb2d5KS4gIFRoZSBtdWRsaWIgZGVmaW5lcyBiYXNpYyBvYmplY3RzIHdoaWNoIHdpbGwgbGlrZWx5IGJlIHVzZWQKK292ZXIgYW5kIG92ZXIgYWdhaW4gYnkgcGVvcGxlIGNyZWF0aW5nIGluIHRoZSBtdWQgd29ybGQuICBFeGFtcGxlcyBvZgorc3VjaCBvYmplY3RzIGFyZSAvc3RkL3Jvb20gKG9yIC9yb29tL3Jvb20pLCAvc3RkL3VzZXIuYyAob3IgL29iai9wbGF5ZXIuYyksCithbmQgc28gb24uCisgCithcmVhIG9yIGNhc3RsZToKK1NwZWNpZmljIGNyZWF0b3IgY29kZWQgb2JqZWN0cyB3aGljaCBvZnRlbiB1c2UgYSBmZWF0dXJlIG9mIExQQyBjYWxsZWQKK2luaGVyaXRhbmNlIHRvIG1ha2UgdXNlIG9mIHRoZSBwcm9wZXJ0aWVzIG9mIGJhc2ljIG11ZGxpYiBvYmplY3RzIGFuZAordHVybiB0aGVtIGludG8gc3BlY2lmaWMgb2JqZWN0cyB0byBiZSB1c2VkIGJ5IHBsYXllcnMgaW4gdGhlIGdhbWUKKyAKK29iamVjdDoKK2Egcm9vbSwgYSB3ZWFwb24sIGEgbW9uc3RlciwgYSBwbGF5ZXIsIGEgYmFnLCBldGMuICBNb3JlIGltcG9ydGFudGx5LAorZXZlcnkgaW5kaXZpZHVhbCBmaWxlIHdpdGggYSAuYyBleHRlbnNpb24gaXMgYW4gb2JqZWN0LiAgT2JqZWN0cyBhcmUKK3VzZWQgaW4gZGlmZmVyZW50IHdheXMuICBPYmplY3RzIGxpa2UgL3N0ZC9saXZpbmcuYyBhcmUgaW5oZXJpdGVkIGJ5CitvYmplY3RzIGxpa2UgbW9uc3Rlci5jIGFuZCB1c2VyLmMuICBPdGhlcnMgYXJlIGNsb25lZCwgd2hpY2ggbWVhbnMgYQorZHVwbGljYXRlIG9mIHRoYXQgY29kZSBpcyBsb2FkZWQgaW50byBtZW1vcnkuICBBbmQgc3RpbGwgb3RoZXJzIGFyZQorc2ltcGx5IGxvYWRlZCBpbnRvIG1lbW9yeSB0byBiZSByZWZlcmVuY2VkIGJ5IG90aGVyIG9iamVjdHMuCisgCituYXRpdmUgYW5kIGNvbXBhdDoKK3RoZXNlIHR3byB0ZXJtcyByZWZlciB0byB0d28gcG9wdWxhciBmbGF2b3VycyBvZiBkcml2ZXJzLiAgTmF0aXZlIG1vZGUKK211ZGxpYnMgbWFrZSB1c2Ugb2Ygb24gdGhlIGRlc2lnbiBvZiBMUE11ZCBkcml2ZXIgMy4wIGFuZCBsYXRlci4gIFlvdSBtYXkKK2hhdmUgYSAzLjAgZHJpdmVyIGhvd2V2ZXIsIGJ1dCBoYXZlIGEgMi40LjUgc3R5bGUgbXVkbGliLiAgVGhpcyBpcyB3aGF0CitpcyBtZWFudCBieSBjb21wYXQgbW9kZS4gIE11ZGxpYnMgd2hpY2ggYXJlIG5hdGl2ZSBtb2RlIGFyZSBhbnkgZm9yCitNdWRPUywgQ0QsIGFuZCBMUE11ZCBtdWRsaWJzIHRoYXQKK2FyZSBsaXN0ZWQgYXMgbmF0aXZlLiAgQ29tcGF0IG11ZGxpYnMgYXJlIGFueSBMUE11ZCBtdWRsaWIgYmVmb3JlIDMuMCBhbmQKK3Rob3NlIHdoaWNoIGFyZSAzLiogY29tcGF0IG11ZGxpYnMuICBJIGJlbGlldmUgQW15bGFhcidzIGlzIGNvbXBhdC4KK1sgTm90IHRydWUsIEFteWxhYXIgc3VwcG9ydHMgbmF0aXZlIGFuZCBjb21wYXQgbXVkbGlicywgTW9yZ2VuR3JhdWVuCisgIGlzIG5hdGl2ZSAtIEJvaW5nIF0KKworR29vZCBMdWNrIQorR2VvcmdlIFJlZXNlCisoRGVzY2FydGVzIG9mIEJvcmcpCisxMiBqdWx5IDE5OTMKK2JvcmdAaGVicm9uLmNvbm5lY3RlZC5jb20KZGlmZiAtLWdpdCBhL2RvYy9LVVJTL0xQQy1LVVJTL2NoYXB0ZXIxIGIvZG9jL0tVUlMvTFBDLUtVUlMvY2hhcHRlcjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYyMzNkMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9LVVJTL0xQQy1LVVJTL2NoYXB0ZXIxCkBAIC0wLDAgKzEsOTAgQEAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQyBCYXNpY3MKKyAgICAgICAgICAgICAgICAgIFdyaXR0ZW4gYnkgRGVzY2FydGVzIG9mIEJvcmcKKyAgICAgICAgICAgICAgICAgIGZpcnN0IGVkaXRpb246IDIzIGFwcmlsIDE5OTMKKyAgICAgICAgICAgICAgICAgIHNlY29uZCBlZGl0aW9uOiAyNSBtYXkgMTk5MworCitDSEFQVEVSIDE6IEludHJvZHVjdGlvbiB0byB0aGUgQ29kaW5nIEVudmlyb25tZW50CisKKzEuMSBVTklYIGZpbGUgc3RydWN0dXJlCitMUE11ZHMgdXNlIGJhc2ljIFVOSVggY29tbWFuZHMgYW5kIGl0cyBmaWxlIHN0cnVjdHVyZS4gIElmIHlvdSBrbm93CitVTklYIGNvbW1hbmRzIGFscmVhZHksIHRoZW4gbm90ZSAod2l0aCBhIGZldyBleGNlcHRpb25zKSBvcHRpb25zIGFyZQorbm90IGF2YWlsYWJsZSB0byB0aGUgY29tbWFuZHMuICBMaWtlIERPUywgVU5JWCBpcyBoZWlyYXJjaGljYWwuICBUaGUKK3Jvb3QgZGlyZWN0b3J5IG9mIHdoaWNoIGFsbCBkaXJlY3RvcmllcyBhcmUgc3ViLWRpcmVjdG9yaWVzIGlzIGNhbGxlZAorcm9vdCgvKS4gIEFuZCBmcm9tIHRob3NlIHN1Yi1kaXJlY3RvcmllcyB5b3UgbWF5IGhhdmUgZnVydGhlcgorc3ViLWRpcmVjdG9yaWVzLiAgQSBkaXJlY3RvcnkgbWF5IGJlIHJlZmVycmVkIHRvIGluIHR3byBkaWZmZXJlbnQgd2F5czoKKzEpIGJ5IGl0cyBmdWxsIG5hbWUsIG9yIGFic29sdXRlIG5hbWUsIG9yIDIpIGJ5IGl0cyByZWxhdGl2ZSBuYW1lLgorQWJzb2x1dGUgbmFtZSByZWZlcnMgdG8gdGhlIGRpcmVjdG9yeSdzIGZ1bGwgcGF0aCBzdGFydGluZyBmcm9tIC8gd2luZGluZworZG93biB0aGUgZGlyZWN0b3J5IHRyZWUgdW50aWwgeW91IG5hbWUgdGhlIGRpcmVjdG9yeSBpbiBxdWVzdGlvbi4gIEZvcgorZXhhbXBsZToKKworICAgIC9wbGF5ZXJzL2Rlc2NhcnRlcy9vYmovbW9uc3RlcgorCityZWZlcnMgdG8gdGhlIGRpcmVjdG9yeSBtb25zdGVyIHdoaWNoIGlzIGEgc3ViLWRpcmVjdG9yeSBvZiBvYmogd2hpY2gKK2lzIGEgc3ViLWRpcmVjdG9yeSBvZiBkZXNjYXJ0ZXMgd2hpY2ggaXMgYSBzdWItZGlyZWN0b3J5IG9mIHBsYXllcnMKK3doaWNoIGlzIGEgc3VkaXJlY3Rvcnkgb2YgLy4KKworVGhlIHJlbGF0aXZlIG5hbWUgcmVmZXJzIHRvIHRoZSBuYW1lIHJlbGF0aXZlIHRvIGFub3RoZXIgZGlyZWN0b3J5LgorVGhlIGFib3ZlIGV4YW1wbGUgaXMgY2FsbGVkIG1vbnN0ZXIgcmVsYXRpdmUgdG8gL3BsYXllcnMvZGVzY2FydGVzL29iaiwKK2J1dCBpdCBpcyBhbHNvIGNhbGxlZCBvYmovbW9uc3RlciByZWxhdGl2ZSB0byAvcGxheWVycy9kZXNjYXJ0ZXMsCitkZXNjYXJ0ZXMvb2JqL21vbnN0ZXIgcmVsYXRpdmUgdG8gL3BsYXllcnMsIGFuZCBmaW5hbGx5CitwbGF5ZXJzL2Rlc2NhcnRlcy9vYmovbW9uc3RlciByZWxhdGl2ZSB0byAvLiAgWW91IGNhbiB0ZWxsIHRoZQorZGlmZmVyZW5jZSBiZXR3ZWVuIGFic29sdXRlIG5hbWVzIGFuZCByZWxhdGl2ZSBuYW1lcyBiZWNhdXNlIGFic29sdXRlCituYW1lcyBhbHdheXMgc3RhcnQgd2l0aCAvLiAgSW4gb3JkZXIgdG8ga25vdyBleGFjdGx5IHdoaWNoIGRpcmVjdG9yeQoraXMgYmVpbmcgbmFtZWQgYnkgYSByZWxhdGl2ZSBuYW1lLCB5b3UgbmF0dXJhbGx5IG11c3Qga25vdyB3aGF0CitkaXJlY3RvcnkgaXQgaXMgcmVsYXRpdmUgdG8uCisKK0EgZGlyZWN0b3J5IGNvbnRhaW5zIHN1Yi1kaXJlY3RvcmllcyBhbmQgZmlsZXMuICBMUE11ZHMgb25seSB1c2UgdGV4dCBmaWxlcworaW5zaWRlIHRoZSBtdWRsaWIuICBMaWtlIGRpcmVjdG9yaWVzLCBmaWxlcyBoYXZlIGJvdGggYWJzb2x1dGUgYW5kCityZWxhdGl2ZSBuYW1lcy4gIFRoZSBtb3N0IGJhc2ljIHJlbGF0aXZlIG5hbWUgaXMgb2Z0ZW4gcmVmZXJyZWQgdG8gYXMgdGhlIGZpbGUKK25hbWUsIHdpdGggdGhlIHJlc3Qgb2YgdGhlIGFic29sdXRlIG5hbWUgYmVpbmcgcmVmZXJyZWQgdG8gYXMgdGhlIHBhdGguICBTbywKK2ZvciB0aGUgZmlsZTogL3BsYXllcnMvZGVzY2FydGVzL2Nhc3RsZS5jLCBjYXN0bGUuYyBpcyB0aGUgZmlsZSBuYW1lLCBhbmQKKy9wbGF5ZXJzL2Rlc2NhcnRlcyBpcyB0aGUgcGF0aC4KKworT24gc29tZSBtdWRzLCBhIGZpbGUgd2l0aCBhIGZpbGUgbmFtZSBiZWdpbm5pbmcgd2l0aCBhIC4gKGxpa2UgLnBsYW4pIGlzCitub3QgdmlzaWJsZSB3aGVuIHlvdSBsaXN0IGZpbGVzIHdpdGggdGhlIHJlZ3VsYXIgZmlsZSBsaXN0aW5nIGNvbW1hbmQuCisKKzEuMiBVTklYIENvbW1hbmRzCitBbG9uZyB3aXRoIHRoZSBVTklYIGZpbGUgc3RydWN0dXJlLCBMUE11ZHMgdXNlIG1hbnkgVU5JWCBjb21tYW5kcy4gIFR5cGljYWwKK1VOSVggY29tbWFuZHMgb24gbW9zdCBtdWRzIGFyZToKK3B3ZCwgY2QsIGxzLCBybSwgbXYsIGNwLCBta2Rpciwgcm1kaXIsIG1vcmUsIGhlYWQsIGNhdCwgZWQKK0lmIHlvdSBoYXZlIG5ldmVyIGJlZm9yZSBzZWVuIFVOSVggY29tbWFuZHMsIHlvdSBwcm9iYWJseSBhcmUgdGhpbmtpbmcgdGhpcworaXMgYWxsIG5vbnNlbnNlLiAgV2VsbCwgaXQgaXMsIGJ1dCB5b3UgZ290IHRvIHVzZSB0aGVtLiAgQmVmb3JlIGdldHRpbmcKK2ludG8gd2hhdCB0aGV5IG1lYW4gdGhvdWdoLCBmaXJzdCBhIGRpc2N1c3Npb24gb2YgY3VycmVudCBkaXJlY3RvcnkuCitJZiB5b3Uga25vdyBET1MsIHRoZW4geW91IGtub3cgd2hhdCBhIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgaXMuCitBdCBhbnkgZ2l2ZW4gcG9pbnQsIHlvdSBhcmUgY29uc2lkZXJlZCB0byBiZSAiaW4iIHNvbWUgZGlyZWN0b3J5LiAgVGhpcworbWVhbnMgdGhhdCBhbnkgcmVsYXRpdmUgZmlsZSBvciBkaXJlY3RvcnkgbmFtZXMgeW91IGdpdmUgaW4gVU5JWCBjb21tYW5kcworYXJlIHJlbGF0aXZlIHRvIHRoYXQgZGlyZWN0b3J5LiAgRm9yIGV4YW1wbGUsIGlmIG15IGN1cnJlbnQgZGlyZWN0b3J5IGlzCisvcGxheWVycy9kZXNjYXJ0ZXMgYW5kIEkgdHlwZSAiZWQgY2FzdGxlLmMiIChlZCBpcyB0aGUgY29tbWFuZCB0byBlZGl0KSwKK3RoZW4gaXQgYXNzdW1lcyBJIG1lYW4gdGhlIGZpbGUgL3BsYXllcnMvZGVzY2FydGVzL2Nhc3RsZS5jCisKK3B3ZDogc2hvd3MgeW91IHlvdXIgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeQorY2Q6IGNoYW5nZXMgeW91ciBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiAgWW91IG1heSBnaXZlIGVpdGhlciByZWxhdGl2ZQorICAgIG9yIGFic29sdXRlIHBhdGggbmFtZXMuICBXaXRoIG5vIGFyZ3VtZW50cywgaXQgY2hhbmdlcyB0byB5b3VyIGhvbWUKKyAgICBkaXJlY3RvcnkuCitsczogbGlzdHMgYWxsIGZpbGVzIGluIHRoZSBkaXJlY3RvcnkgbmFtZWQuICBJZiBubyBkaXJlY3RvcnkgaXMgbmFtZWQsCisgICAgaXQgbGlzdHMgdGhlIGZpbGVzIG9mIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5CitybTogZGVsZXRlcyB0aGUgZmlsZSBuYW1lZAorbXY6IHJlbmFtZXMgdGhlIGZpbGUgbmFtZWQKK2NwOiBjb3BpZXMgdGhlIGZpbGUgbmFtZWQKK21rZGlyOiBtYWtlcyBhIG5ldyBkaXJlY3RvcnkKK3JtZGlyOiBkZWxldGVzIGEgZGlyZWN0b3J5LiAgQWxsIGZpbGVzIG11c3QgaGF2ZSBiZWVuIGZpcnN0IHJlbW92ZWQuCittb3JlOiBwYWdlcyB0aGUgZmlsZSBuYW1lZCBzbyB0aGF0IHRoZSBmaWxlIGFwcGVhcnMgb24geW91ciBzY3JlZW4gb25lCisgICAgcGFnZSBhdCBhIHRpbWUuCitjYXQ6IHNob3dzIHRoZSB3aG9sZSBmaWxlIHRvIHlvdSBhdCBvbmNlCitoZWFkOiBzaG93cyB5b3UgdGhlIGZpcnN0IHNldmVyYWwgbGluZXMgb2YgYSBmaWxlCit0YWlsOiBzaG93cyB5b3UgdGhlIGxhc3Qgc2V2ZXJhbCBsaW5lcyBvZiBhIGZpbGUKK2VkOiBhbGxvd3MgeW91IHRvIGVkaXQgYSBmaWxlIHVzaW5nIHRoZSBtdWQgZWRpdG9yCisKKzEuMyBDaGFwdGVyIFN1bW1hcnkKK1VOSVggdXNlcyBhIGhlaXJhcmNoaWNhbCBmaWxlIHN0cnVjdHVyZSB3aXRoIHRoZSByb290IG9mIHRoZSB0cmVlIGJlaW5nCituYW1lZCAvLiAgT3RoZXIgZGlyZWN0b3JpZXMgYnJhbmNoIG9mZiBmcm9tIHRoYXQgcm9vdCBkaXJlY3RvcnkgYW5kCitpbiB0dXJuIGhhdmUgdGhlaXIgb3duIHN1Yi1kaXJlY3Rvcmllcy4gIEFsbCBkaXJlY3RvcmllcyBtYXkgY29udGFpbgorZGlyZWN0b3JpZXMgYW5kIGZpbGVzLiAgRGlyZWN0b3JpZXMgYW5kIGZpbGVzIGFyZSByZWZlcnJlZCB0byBlaXRoZXIKK2J5IHRoZWlyIGFic29sdXRlIG5hbWUsIHdoaWNoIGFsd2F5cyBiZWdpbnMgd2l0aCAvLCBvciBieSB0aGVpciByZWxhdGl2ZQorbmFtZSB3aGljaCBnaXZlcyB0aGUgZmlsZSdzIG5hbWUgcmVsYXRpdmUgdG8gYSBwYXJ0aWN1bGFyIGRpcmVjdG9yeS4KK0luIG9yZGVyIHRvIGdldCBhcm91bmQgaW4gdGhlIFVOSVggZmlsZXMgc3RydWN0dXJlLCB5b3UgaGF2ZSB0aGUKK3R5cGljYWwgVU5JWCBjb21tYW5kcyBmb3IgbGlzdGluZyBmaWxlcywgeW91ciBjdXJyZW50IGRpcmVjdG9yeSwgZXRjLgorT24geW91ciBtdWQsIGFsbCBvZiB0aGUgYWJvdmUgY29tbWFuZHMgc2hvdWxkIGhhdmUgZGV0YWlsZWQgaGVscCBjb21tYW5kcwordG8gaGVscCB5b3UgZXhwbG9yZSBleGFjdGx5IHdoYXQgdGhleSBkby4gIEluIGFkZGl0aW9uLCB0aGVyZSBzaG91bGQKK2JlIGEgdmVyeSBkZXRhaWxlZCBmaWxlIG9uIHlvdXIgbXVkJ3MgZWRpdG9yLiAgSWYgeW91IGFyZSB1bmZhbWlsaWFyCit3aXRoIGVkLCB5b3Ugc2hvdWxkIGdvIG92ZXIgdGhpcyBjb252b2x1dGVkIGZpbGUuCmRpZmYgLS1naXQgYS9kb2MvS1VSUy9MUEMtS1VSUy9jaGFwdGVyMiBiL2RvYy9LVVJTL0xQQy1LVVJTL2NoYXB0ZXIyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5YWQ1NjYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvS1VSUy9MUEMtS1VSUy9jaGFwdGVyMgpAQCAtMCwwICsxLDE5NSBAQAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDIEJhc2ljcworICAgICAgICAgICAgICAgICAgV3JpdHRlbiBieSBEZXNjYXJ0ZXMgb2YgQm9yZworICAgICAgICAgICAgICAgICAgZmlyc3QgZWRpdGlvbjogMjMgYXByaWwgMTk5MworICAgICAgICAgICAgICAgICAgc2Vjb25kIGVkaXRpb246IDE2IGp1bmUgMTk5MworCitDSEFQVEVSIDI6IFRoZSBMUEMgUHJvZ3JhbQorCisyLjEgQWJvdXQgcHJvZ3JhbXMKK1RoZSB0aXRsZSBvZiB0aGlzIGNoYXB0ZXIgb2YgdGhlIHRleHRib29rIGlzIGFjdHVhbGx5IHBvb3JseSBuYW1lZCwgc2luY2UKK29uZSBkb2VzIG5vdCB3cml0ZSBwcm9ncmFtcyBpbiBMUEMuICBBbiBMUEMgY29kZXIgaW5zdGVhZCB3cml0ZXMgKm9iamVjdHMqLgorV2hhdCBpcyB0aGUgZGlmZmVyZW5jZT8gIFdlbGwsIGZvciBvdXIgcHVycG9zZXMgbm93LCB0aGUgZGlmZmVyZW5jZSBpcworaW4gdGhlIHdheSB0aGUgZmlsZSBpcyBleGVjdXRlZC4gIFdoZW4geW91ICJydW4iIGEgcHJvZ3JhbSwgZXhlY3V0aW9uCitiZWdpbnMgYXQgYSBkZWZpbml0ZSBwbGFjZSBpbiB0aGUgcHJvZ3JhbS4gIEluIG90aGVyIHdvcmRzLCB0aGVyZQoraXMgYSBwbGFjZSBpbiBhbGwgcHJvZ3JhbXMgdGhhdCBpcyBub3RlZCBhcyB0aGUgYmVnaW5uaW5nIHdoZXJlIHByb2dyYW0KK2V4ZWN1dGlvbiBzdGFydHMuICBJbiBhZGRpdGlvbiwgcHJvZ3JhbXMgaGF2ZSBkZWZpbml0ZSBlbmQgcG9pbnRzLAorc28gdGhhdCB3aGVuIGV4ZWN1dGlvbiByZWFjaGVzIHRoYXQgcG9pbnQsIHRoZSBleGVjdXRpb24gb2YgdGhlIHByb2dyYW0KK3Rlcm1pbmF0ZXMuICBTbywgaW4gc2hvcnQsIGV4ZWN1dGlvbiBvZiBhIHByb2dyYW0gcnVucyBmcm9tIGEgZGVmaW5pdGUKK2JlZ2lubmluZyBwb2ludCB0aHJvdWdoIHRvIGEgZGVmaW5pdGUgZW5kIHBvaW50LiAgVGhpcyBpcyBub3Qgc28gd2l0aAorTFBDIG9iamVjdHMuCisKK1dpdGggbXVkcywgTFBDIG9iamVjdHMgYXJlIHNpbXBseSBkaXN0aW5jdCBwYXJ0cyBvZiB0aGUgQyBwcm9ncmFtIHdoaWNoCitpcyBydW5uaW5nIHRoZSBnYW1lICh0aGUgZHJpdmVyKS4gIEluIG90aGVyIHdvcmRzLCBleGVjdXRpb24gb2YgdGhlIG11ZAorcHJvZ3JhbSBiZWdpbnMgYW5kIGVuZHMgaW4gdGhlIGRyaXZlci4gIEJ1dCB0aGUgZHJpdmVyIGluIGZhY3QgZG9lcwordmVyeSBsaXR0bGUgaW4gdGhlIHdheSBvZiBjcmVhdGluZyB0aGUgd29ybGQgeW91IGtub3cgd2hlbiB5b3UgcGxheQorYSBtdWQuICBJbnN0ZWFkLCB0aGUgZHJpdmVyIHJlbGllcyBoZWF2aWx5IG9uIHRoZSBjb2RlIGNyZWF0ZWQgaW4gTFBDLAorZXhlY3V0aW5nIGxpbmVzIG9mIHRoZSBvYmplY3RzIGluIHRoZSBtdWQgYXMgbmVlZGVkLiAgTFBDIG9iamVjdHMgdGh1cworaGF2ZSBubyBwbGFjZSB0aGF0IGlzIG5lY2Vzc2FyaWx5IHRoZSBiZWdpbm5pbmcgcG9pbnQsIG5vciBkbyB0aGV5CitoYXZlIGEgZGVmaW5pdGUgZW5kaW5nIHBvaW50LgorCitMaWtlIG90aGVyIHByb2dyYW1taW5nIGxhbmd1YWdlcywgYW4gTFBDICJwcm9ncmFtIiBtYXkgYmUgbWFkZSB1cCBvZgorb25lIG9yIG1vcmUgZmlsZXMuICBGb3IgYW4gTFBDIG9iamVjdCB0byBnZXQgZXhlY3V0ZWQsIGl0IHNpbXBsZQorbmVlZHMgdG8gYmUgbG9hZGVkIGludG8gdGhlIGRyaXZlcidzIG1lbW9yeS4gIFRoZSBkcml2ZXIgd2lsbCBjYWxsIGxpbmVzCitmcm9tIHRoZSBvYmplY3QgYXMgaXQgbmVlZHMgYWNjb3JkaW5nIHRvIGEgc3RydWN0dXJlIHdoaWNoIHdpbGwgYmUKK2RlZmluZWQgdGhyb3VnaG91dCB0aGlzIHRleHRib29rLiAgVGhlIGltcG9ydGFudCB0aGluZyB5b3UgbmVlZCB0bwordW5kZXJzdGFuZCBhdCB0aGlzIHBvaW50IGlzIHRoYXQgdGhlcmUgaXMgbm8gImJlZ2lubmluZyIgdG8gYW4gTFBDCitvYmplY3QgaW4gdGVybXMgb2YgZXhlY3V0aW9uLCBhbmQgdGhlcmUgaXMgbm8gImVuZCIuCisKKzIuMiBEcml2ZXItbXVkbGliIGludGVyYWN0aW9uCitBcyBJIGhhdmUgbWVudGlvbmVkIGVhcmxpZXIsIHRoZSBkcml2ZXIgaXMgdGhlIEMgcHJvZ3JhbSB0aGF0IHJ1bnMgb24KK3RoZSBob3N0IG1hY2hpbmUuICBJdCBjb25uZWN0cyB5b3UgaW50byB0aGUgZ2FtZSBhbmQgcHJvY2Vzc2VzIExQQyBjb2RlLgorTm90ZSB0aGF0IHRoaXMgaXMgb25lIHRoZW9yeSBvZiBtdWQgcHJvZ3JhbW1pbmcsIGFuZCBub3QgbmVjZXNzYXJpbHkKK2JldHRlciB0aGFuIG90aGVycy4gIEl0IGNvdWxkIGJlIHRoYXQgdGhlIGVudGlyZSBnYW1lIGlzIHdyaXR0ZW4gaW4gQy4KK1N1Y2ggYSBnYW1lIHdvdWxkIGJlIG11Y2ggZmFzdGVyLCBidXQgaXQgd291bGQgYmUgbGVzcyBmbGV4aWJsZSBpbgordGhhdCB3aXphcmRzIGNvdWxkIG5vdCBhZGQgdGhpbmdzIHRvIHRoZSBnYW1lIHdoaWxlIGl0IHdhcyBydW5uaW5nLiBUaGlzCitpcyB0aGUgdGhlb3J5IGJlaGluZCBEaWt1TVVEcy4gIEluc3RlYWQsIExQTVVEcyBydW4gb24gdGhlIHRoZW9yeSB0aGF0Cit0aGUgZHJpdmVyIHNob3VsZCBpbiBubyBkZWZpbmUgdGhlIG5hdHVyZSBvZiB0aGUgZ2FtZSwgdGhhdCB0aGUgbmF0dXJlCitvZiB0aGUgZ2FtZSBpcyB0byBiZSBkZWNpZGVkIGJ5IHRoZSBpbmRpdmlkdWFscyBpbnZvbHZlZCwgYW5kIHRoYXQKK3lvdSBzaG91bGQgYmUgYWJsZSB0byBhZGQgdG8gdGhlIGdhbWUgKmFzIGl0IGlzIGJlaW5nIHBsYXllZCouICBUaGlzCitpcyB3aHkgTFBNVURzIG1ha2UgdXNlIG9mIHRoZSBMUEMgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuICBJdCBhbGxvd3MKK3lvdSB0byBkZWZpbmUgdGhlIG5hdHVyZSBvZiB0aGUgZ2FtZSBpbiBMUEMgZm9yIHRoZSBkcml2ZXIgdG8gcmVhZCBhbmQKK2V4ZWN1dGUgYXMgbmVlZGVkLiAgSXQgaXMgYWxzbyBhIG11Y2ggc2ltcGxlciBsYW5ndWFnZSB0byB1bmRlcnN0YW5kCit0aGFuIEMsIHRodXMgbWFraW5nIHRoZSBwcm9jZXNzIG9mIHdvcmxkIGNyZWF0aW9uIG9wZW4gdG8gYSBncmVhdGVyCitudW1iZXIgb2YgcGVvcGxlLgorCitPbmNlIHlvdSBoYXZlIHdyaXR0ZW4gYSBmaWxlIGluIExQQyAoYXNzdW1pbmcgaXQgaXMgY29ycmVudCBMUEMgKSwgaXQganVzdHMKK3NpdHMgdGhlcmUgb24gdGhlIGhvc3QgbWFjaGluZSdzIGhhcmQgZHJpdmUgdW50aWwgc29tZXRoaW5nIGluIHRoZSBnYW1lCittYWtlcyByZWZlcmVuY2UgdG8gaXQuICBXaGVuIHNvbWV0aGluZyBpbiB0aGUgZ2FtZSBmaW5hbGx5IGRvZXMgbWFrZQorcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QsIGEgY29weSBvZiB0aGUgZmlsZSBpcyBsb2FkZWQgaW50byBtZW1vcnkgYW5kCithIHNwZWNpYWwgKmZ1bmN0aW9uKiBvZiB0aGF0IG9iamVjdCBpcyBjYWxsZWQgaW4gb3JkZXIgdG8gaW5pdGlhbGl6ZQordGhlIHZhbHVlcyBvZiB0aGUgdmFyaWFibGVzIGluIHRoZSBvYmplY3QuICBOb3csIGRvIG5vdCBiZSBjb25jZXJuZWQKK2lmIHRoYXQgbGFzdCBzZW50ZW5jZSB3ZW50IHJpZ2h0IG92ZXIgeW91ciBoZWFkLCBzaW5jZSBzb21lb25lIGJyYW5kCituZXcgdG8gcHJvZ3JhbW1pbmcgd291bGQgbm90IGtub3cgd2hhdCB0aGUgaGVsbCBhIGZ1bmN0aW9uIG9yIGEgdmFyaWFibGUKK2lzLiAgVGhlIGltcG9ydGFudCB0aGluZyB0byB1bmRlcnN0YW5kIHJpZ2h0IG5vdyBpcyB0aGF0IGEgY29weSBvZiB0aGUKK29iamVjdCBmaWxlIGlzIHRha2VuIGJ5IHRoZSBkcml2ZXIgZnJvbSB0aGUgbWFjaGluZSdzIGhhcmQgZHJpdmUgYW5kCitzdG9yZWQgaW50byBtZW1vcnkgKHNpbmNlIGl0IGlzIGEgY29weSwgbXVsdGlwbGUgdmVyc2lvbnMgb2YgdGhhdAorb2JqZWN0IG1heSBleGlzdCkuICBZb3Ugd2lsbCBsYXRlciB1bmRlcnN0YW5kIHdoYXQgYSBmdW5jdGlvbiBpcywgd2hhdAorYSB2YXJpYWJsZSBpcywgYW5kIGV4YWN0bHkgaG93IGl0IGlzIHNvbWV0aGluZyBpbiB0aGUgZ2FtZSBtYWRlIHJlZmVyZW5jZQordG8geW91ciBvYmplY3QuCisKKzIuMyBMb2FkaW5nIGFuIG9iamVjdCBpbnRvIG1lbW9yeQorQWx0aG91Z2ggdGhlcmUgaXMgbm8gcGFydGljdWxhciBwbGFjZSBpbiBhbiBvYmplY3QgY29kZSB0aGF0IG11c3QgZXhpc3QKK2luIG9yZGVyIGZvciB0aGUgZHJpdmVyIHRvIGJlZ2luIGV4ZWN1dGluZyBpdCwgdGhlcmUgaXMgYSBwbGFjZSBmb3Igd2hpY2gKK3RoZSBkcml2ZXIgd2lsbCBzZWFyY2ggaW4gb3JkZXIgdG8gaW5pdGlhbGl6ZSB0aGUgb2JqZWN0LiAgT24gY29tcGF0IAorZHJpdmVycywgaXQgaXMgdGhlIGZ1bmN0aW9uIGNhbGxlZCByZXNldCgpLiAgT24gbmF0aXZlIG11ZHMgaXQgaXMgdGhlCitmdW5jdGlvbiBjYWxsZWQgY3JlYXRlKCkuIFsgTW9yZ2VuR3JhdWVuIGlzIG5hdGl2ZSAtIEJvaW5nIF0KKworTFBDIG9iamVjdHMgYXJlIG1hZGUgdXAgb2YgdmFyaWFibGVzICh2YWx1ZXMgd2hpY2ggY2FuIGNoYW5nZSkgYW5kCitmdW5jdGlvbnMgd2hpY2ggYXJlIHVzZWQgdG8gbWFuaXB1bGF0ZSB0aG9zZSB2YXJpYWJsZXMuICBGdW5jdGlvbnMKK21hbmlwdWxhdGUgdmFyaWFibGVzIHRocm91Z2ggdGhlIHVzZSBvZiBMUEMgZ3JhbW1hdGljYWwgc3RydWN0dXJlcywKK3doaWNoIGluY2x1ZGUgY2FsbGluZyBvdGhlciBmdW5jdGlvbnMsIHVzaW5nIGV4dGVybmFsbHkgZGVmaW5lZAorZnVuY3Rpb25zIChlZnVucyksIGFuZCBiYXNpYyBMUEMgZXhwcmVzc2lvbnMgYW5kIGZsb3cgY29udHJvbCAKK21lY2hhbmlzbXMuCisKK0RvZXMgdGhhdCBzb3VuZCBjb252b2x1dGVkPyAgRmlyc3QgbGV0cyBzdGFydCB3aXRoIGEgdmFyaWFibGUuICBBCit2YXJpYWJsZSBtaWdodCBiZSBzb21ldGhpbmcgbGlrZTogbGV2ZWwuICBJdCBjYW4gInZhcnkiIGZyb20gc2l0YXRpb24KK3RvIHNpdHVhdGlvbiBpbiB2YWx1ZSwgYW5kIGRpZmZlcmVudCB0aGluZ3MgdXNlIHRoZSB2YWx1ZSBvZiB0aGUgcGxheWVyJ3MKK2xldmVsIHRvIG1ha2UgZGlmZmVyZW50IHRoaW5ncyBoYXBwZW4uICBGb3IgaW5zdGFuY2UsIGlmIHlvdSBhcmUgYQorbGV2ZWwgMTkgcGxheWVyLCB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIGxldmVsIHdpbGwgYmUgMTkuICBOb3cKK2lmIHlvdXIgbXVkIGlzIG9uIHRoZSBvbGQgTFBNdWQgMi40LjUgc3lzdGVtIHdoZXJlIGxldmVscyAxLTE5IGFyZQorcGxheWVycyBhbmQgMjArIGFyZSB3aXphcmRzLCB0aGluZ3MgY2FuIGFzayBmb3IgeW91ciBsZXZlbCB2YWx1ZSB0bworc2VlIGlmIHlvdSBjYW4gcGVyZm9ybSB3aXphcmQgdHlwZSBhY3Rpb25zLiAgQmFzaWNhbGx5LCBlYWNoIG9iamVjdAoraW4gTFBDIGlzIGEgcGlsZSBvZiB2YXJpYWJsZXMgd2l0aCB2YWx1ZXMgd2hpY2ggY2hhbmdlIG92ZXIgdGltZS4KK1RoaW5ncyBoYXBwZW4gdG8gdGhlc2Ugb2JqZWN0cyBiYXNlZCBvbiB3aGF0IHZhbHVlcyBpdHMgdmFyaWFibGVzCitob2xkLiAgT2Z0ZW4sIHRoZW4gdGhpbmdzIHRoYXQgaGFwcGVuIGNhdXNlIHRoZSB2YXJpYWJsZXMgdG8gY2hhbmdlLgorCitTbywgd2hlbmV2ZXIgYW4gb2JqZWN0IGluIExQQyBpcyByZWZlcmVuY2VkIGJ5IGFub3RoZXIgb2JqZWN0IGN1cnJlbnRseQoraW4gbWVtb3J5LCB0aGUgZHJpdmVyIHNlYXJjaGVzIHRvIHNlZSB3aGF0IHBsYWNlcyBmb3IgdmFsdWVzIHRoZQorb2JqZWN0IGhhcyAoYnV0IHRoZXkgaGF2ZSBubyB2YWx1ZXMgeWV0KS4gIE9uY2UgdGhhdCBpcyBkb25lLCB0aGUgZHJpdmVyCitjYWxscyBhIGZ1bmN0aW9uIGluIHRoZSBvYmplY3QgY2FsbGVkIHJlc2V0KCkgb3IgY3JlYXRlKCkgKGRlcGVuZGluZworb24geW91ciBkcml2ZXIpIHdoaWNoIHdpbGwgc2V0IHVwIHRoZSBzdGFydGluZyB2YWx1ZXMgZm9yIHRoZSBvYmplY3QncwordmFyaWFibGVzLiAgSXQgaXMgdGh1cyB0aHJvdWdoICpjYWxscyogdG8gKmZ1bmN0aW9ucyogdGhhdCB2YXJpYWJsZQordmFsdWVzIGdldCBtYW5pcHVsYXRlZC4KKworQnV0IGNyZWF0ZSgpIG9yIHJlc2V0KCkgaXMgTk9UIHRoZSBzdGFydGluZyBwbGFjZSBvZiBMUEMgY29kZSwgYWx0aG91Z2gKK2l0IGlzIHdoZXJlIG1vc3QgTFBDIGNvZGUgZXhlY3V0aW9uIGRvZXMgYmVnaW4uICBUaGUgZmFjdCBpcywgdGhvc2UKK2Z1bmN0aW9ucyBuZWVkIG5vdCBleGlzdC4gIElmIHlvdXIgb2JqZWN0IGRvZXMganVzdCBmaW5lIHdpdGggaXRzCitzdGFydGluZyB2YWx1ZXMgYWxsIGJlaW5nIE5VTEwgcG9pbnRlcnMgKG1lYW5pbmcsIGZvciBvdXIgcHVycG9zZXMKK2hlcmUsIDApLCB0aGVuIHlvdSBkbyBub3QgbmVlZCBhIGNyZWF0ZSgpIG9yIHJlc2V0KCkgZnVuY3Rpb24uICBUaHVzCit0aGUgZmlyc3QgYml0IG9mIGV4ZWN1dGlvbiBvZiB0aGUgb2JqZWN0J3MgY29kZSBtYXkgYmVnaW4gc29tZXdoZXJlCitjb21wbGV0ZWx5IGRpZmZlcmVudC4KKworTm93IHdlIGdldCB0byB3aGF0IHRoaXMgY2hhcHRlciBpcyBhbGwgYWJvdXQuICBUaGUgcXVlc3Rpb246IFdoYXQKK2NvbnNpc3RzIGEgY29tcGxldGUgTFBDIG9iamVjdD8gIFdlbGwsIGFuIExQQyBvYmplY3QgaXMgc2ltcGx5CitvbmUgb3IgbW9yZSBmdW5jdGlvbnMgZ3JvdXBlZCB0b2dldGhlciBtYW5pcHVsYXRpbmcgMCBvciBtb3JlCit2YXJpYWJsZXMuICBUaGUgb3JkZXIgaW4gd2hpY2ggZnVuY3Rpb25zIGFyZSBwbGFjZWQgaW4gYW4gb2JqZWN0CityZWxhdGl2ZSB0byBvbmUgYW5vdGhlciBpcyBpcnJlbGV2YW50LiAgSW4gb3RoZXIgd29yZHM6CisKKy0tLS0tCit2b2lkIGluaXQoKSB7IGFkZF9hY3Rpb24oInNtaWxlIiwgInNtaWxlIik7IH0KKwordm9pZCBjcmVhdGUoKSB7IHJldHVybjsgfQorCitpbnQgc21pbGUoc3RyaW5nIHN0cikgeyByZXR1cm4gMDsgfQorLS0tLS0KKworaXMgZXhhY3RseSB0aGUgc2FtZSBhczoKKworLS0tLS0KK3ZvaWQgY3JlYXRlKCkgeyByZXR1cm47IH0KKworaW50IHNtaWxlKHN0cmluZyBzdHIpIHsgcmV0dXJuIDA7IH0KKwordm9pZCBpbml0KCkgeyBhZGRfYWN0aW9uKCJzbWlsZSIsICJzbWlsZSIpOyB9CitfX19fXworCitBbHNvIGltcG9ydGFudCB0byBub3RlLCB0aGUgb2JqZWN0IGNvbnRhaW5pbmcgb25seToKKworLS0tLS0KK3ZvaWQgbm9uc2Vuc2UoKSB7fQorLS0tLS0KKworaXMgYSB2YWxpZCwgYnV0IHRyaXZpYWwgb2JqZWN0LCBhbHRob3VnaCBpdCBwcm9iYWJseSB3b3VsZCBub3QgaW50ZXJhY3QKK3Byb3Blcmx5IHdpdGggb3RoZXIgb2JqZWN0cyBvbiB5b3VyIG11ZCBzaW5jZSBzdWNoIGFuIG9iamVjdCBoYXMgbm8KK3dlaWdodCwgaXMgaW52aXNpYmxlLCBldGMuLgorCisyLjQgQ2hhcHRlciBzdW1tYXJ5CitMUEMgY29kZSBoYXMgbm8gYmVnaW5uaW5nIHBvaW50IG9yIGVuZGluZyBwb2ludCwgc2luY2UgTFBDIGNvZGUgaXMgdXNlZAordG8gY3JlYXRlIG9iamVjdHMgdG8gYmUgdXNlZCBieSB0aGUgZHJpdmVyIHByb2dyYW0gcmF0aGVyIHRoYW4gY3JlYXRlCitpbmRpdmlkdWFsIHByb2dyYW1zLiAgTFBDIG9iamVjdHMgY29uc2lzdCBvZiBvbmUgb3IgbW9yZSBmdW5jdGlvbnMgd2hvc2UKK29yZGVyIGluIHRoZSBjb2RlIGlzIGlycmVsZXZhbnQsIGFzIHdlbGwgYXMgb2YgemVybyBvciBtb3JlIHZhcmlhYmxlcyB3aG9zZQordmFsdWVzIGFyZSBtYW5pcHVsYXRlZCBpbnNpZGUgdGhvc2UgZnVuY3Rpb25zLiAgTFBDIG9iamVjdHMgc2ltcGx5IHNpdAorb24gdGhlIGhvc3QgbWFjaGluZSdzIGhhcmQgZHJpdmVyIHVudGlsIHJlZmVyZW5jZWQgYnkgYW5vdGhlciBvYmplY3QgaW4KK3RoZSBnYW1lIChpbiBvdGhlciB3b3JkcywgdGhleSBkbyBub3QgcmVhbGx5IGV4aXN0KS4gIE9uY2UgdGhlIG9iamVjdAoraXMgcmVmZXJlbmNlZCwgaXQgaXMgbG9hZGVkIGludG8gdGhlIG1hY2hpbmUncyBtZW1vcnkgd2l0aCBlbXB0eQordmFsdWVzIGZvciB0aGUgdmFyaWFibGVzLiAgVGhlIGZ1bmN0aW9uIHJlc2V0KCkgaW4gY29tcGF0IG11ZHMgb3IKK2NyZWF0ZSgpIGluIG5hdGl2ZSBtdWRzIGlzIGNhbGxlZCBpbiB0aGF0IG9iamVjdCBpZiBpdCBleGlzdHMgdG8gYWxsb3cKK3RoZSB2YXJpYWJsZXMgdG8gdGFrZSBvbiBpbml0aWFsIHZhbHVlcy4gIE90aGVyIGZ1bmN0aW9ucyBpbiB0aGUgb2JqZWN0CithcmUgdXNlZCBieSB0aGUgZHJpdmVyIGFuZCBvdGhlciBvYmplY3RzIGluIHRoZSBnYW1lIHRvIGFsbG93IGludGVyYWN0aW9uCithbW9uZyBvYmplY3RzIGFuZCB0aGUgbWFuaXB1bGF0aW9uIG9mIHRoZSBMUEMgdmFyaWFibGVzLgorCitBIG5vdGUgb24gcmVzZXQoKSBhbmQgY3JlYXRlKCk6CitjcmVhdGUoKSBpcyBvbmx5IHVzZWQgYnkgbXVkcyBpbiBuYXRpdmUgbW9kZSAoc2VlIHRoZSB0ZXh0Ym9vayBJbnRyb2R1Y3Rpb24KK2ZvciBtb3JlIGluZm9ybWF0aW9uIG9uIG5hdGl2ZSBtb2RlIHZzLiBjb21wYXQgbW9kZSkuICBJdCBpcyBvbmx5IHVzZWQKK3RvIGluaXRpYWxpemUgbmV3bHkgcmVmZXJlbmNlZCBvYmplY3RzLgorCityZXNldCgpIGlzIHVzZWQgYnkgYm90aCBtdWRzIGluIGNvbXBhdCBtb2RlIGFuZCBuYXRpdmUgbW9kZS4gIEluIGNvbXBhdAorbW9kZSwgcmVzZXQoKSBwZXJmb3JtcyB0d28gZnVuY3Rpb25zLiAgRmlyc3QsIGl0IGlzIHVzZWQgdG8gaW5pdGlhbGl6ZQorbmV3bHkgcmVmZXJlbmNlZCBvYmplY3RzLiAgSW4gYWRkaXRpb24sIGhvd2V2ZXIsIGNvbXBhdCBtb2RlIG11ZHMgdXNlCityZXNldCgpIHRvICJyZXNldCIgdGhlIG9iamVjdC4gIEluIG90aGVyIHdvcmRzLCByZXR1cm4gaXQgdG8gaXRzIGluaXRpYWwKK3N0YXRlIG9mIGFmZmFpcnMuICBUaGlzIGFsbG93cyBtb25zdGVycyB0byByZWdlbmVyYXRlIGluIGEgcm9vbSBhbmQgZG9vcnMKK3RvIHN0YXJ0IGJhY2sgaW4gdGhlIHNodXQgcG9zaXRpb24sIGV0Yy4uICBOYXRpdmUgbW9kZSBtdWRzIHVzZSByZXNldCgpCit0byBwZXJmb3JtIHRoZSBzZWNvbmQgZnVuY3Rpb24gKGFzIGl0cyBuYW1lIGltcGxpZXMpLgorCitTbyB0aGVyZSBhcmUgdHdvIGltcG9ydGFudCB0aGluZ3Mgd2hpY2ggaGFwcGVuIGluIExQIHN0eWxlIG11ZHMgd2hpY2gKK2NhdXNlIHRoZSBkcml2ZXIgdG8gbWFrZSBjYWxscyB0byBmdW5jdGlvbnMgaW4gb2JqZWN0cy4gIFRoZSBmaXJzdCBpcwordGhlIGNyZWF0aW9uIG9mIHRoZSBvYmplY3QuICBBdCB0aGlzIHRpbWUsIHRoZSBkcml2ZXIgY2FsbHMgYSBmdW5jdGlvbgordG8gaW5pdGFsaXplIHRoZSB2YWx1ZXMgaW4gdGhlIG9iamVjdC4gIEZvciBjb21wYXQgbW9kZSBtdWRzLCB0aGlzCitpcyBwZXJmb3JtZWQgYnkgdGhlIGZ1bmN0aW9uIG5hbWVkIHJlc2V0KCkgKHdpdGggYW4gYXJndW1lbnQgb2YgMCwKK21vcmUgb24gdGhpcyBsYXRlciB0aG91Z2gpLiAgRm9yIG11ZHMgcnVubmluZyBpbiBuYXRpdmUgbW9kZSwgdGhpcyBpcworcGVyZm9ybWVkIGJ5IHRoZSBmdW5jdGlvbiBjcmVhdGUoKS4KKworVGhlIHNlY29uZCBpcyB0aGUgcmV0dXJuaW5nIG9mIHRoZSByb29tIHRvIHNvbWUgYmFzZSBzdGF0ZSBvZiBhZmZhaXJzLgorVGhpcyBiYXNlIHNldCBvZiBhZmZhaXJzIG1heSBvciBtYXkgbm90IGJlIGRpZmZlcmVudCBmcm9tIHRoZSBpbml0aWFsCitzdGF0ZSBvZiBhZmZhaXJzLCBhbmQgY2VydGFpbmx5IHlvdSB3b3VsZCBub3Qgd2FudCB0byB0YWtlIHVwIHRpbWUKK2RvaW5nIHJlZHVuZGFudCB0aGluZ3MgKGxpa2UgcmVzZXR0aW5nIHZhcmlhYmxlcyB0aGF0IG5ldmVyIGNoYW5nZSkuCitDb21wYXQgbW9kZSBtdWRzIG5ldmVydGhlbGVzcyB1c2UgdGhlIHNhbWUgZnVuY3Rpb24gdGhhdCB3YXMgdXNlZCB0bworY3JlYXRlIHRoZSBvYmplY3QgdG8gcmVzZXQgaXQsIHRoYXQgYmVpbmcgcmVzZXQoKS4gIE5hdGl2ZSBtb2RlIG11ZHMsCit3aG8gdXNlIGNyZWF0ZSgpIHRvIGNyZWF0ZSB0aGUgcm9vbSwgaW5zdGVhZCB1c2UgcmVzZXQoKSB0byByZXNldCBpdC4KK0FsbCBpcyBub3QgbG9zdCBpbiBjb21wYXQgbW9kZSB0aG91Z2gsIGFzIHRoZXJlIGlzIGEgd2F5IHRvIHRlbGwgdGhlCitkaWZmZXJlbmNlIGJldHdlZW4gY3JlYXRpb24gYW5kIHJlc2V0dGluZy4gIEZvciByZXNldCBwdXJwb3NlcywgdGhlCitkcml2ZXIgcGFzc2VzIGVpdGhlciAxIG9yIHRoZSByZXNldCBudW1iZXIgYXMgYW4gYXJndW1lbnQgdG8gcmVzZXQoKQoraW4gY29tcGF0IG1vZGUuICBOb3cgdGhpcyBpcyBtZWFuaW5nbGVzcyB0byB5b3Ugbm93LCBidXQganVzdCBrZWVwIGluCittaW5kIHRoYXQgeW91IGNhbiBpbiBmYWN0IHRlbGwgdGhlIGRpZmZlcmVuY2UgaW4gY29tcGF0IG1vZGUuICBBbHNvCitrZWVwIGluIG1pbmQgdGhhdCB0aGUgYXJnbWVudCBpbiB0aGUgY3JlYXRpb24gdXNlIG9mIHJlc2V0IGlzIDAgYW5kCit0aGUgYXJndW1lbnQgaW4gdGhlIHJlc2V0IHVzZSBpcyBhIG5vbnplcm8gbnVtYmVyLgpkaWZmIC0tZ2l0IGEvZG9jL0tVUlMvTFBDLUtVUlMvY2hhcHRlcjMgYi9kb2MvS1VSUy9MUEMtS1VSUy9jaGFwdGVyMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2U4OWE0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL0tVUlMvTFBDLUtVUlMvY2hhcHRlcjMKQEAgLTAsMCArMSwxODUgQEAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQyBCYXNpY3MKKyAgICAgICAgICAgICAgICAgIFdyaXR0ZW4gYnkgRGVzY2FydGVzIG9mIEJvcmcKKyAgICAgICAgICAgICAgICAgIGZpcnN0IGVkaXRpb246IDIzIGFwcmlsIDE5OTMKKyAgICAgICAgICAgICAgICAgIHNlY29uZCBlZGl0aW9uOiAxNyBqdW5lIDE5OTMKKworQ0hBUFRFUiAzOiBMUEMgRGF0YSBUeXBlcworCiszLjEgV2hhdCB5b3Ugc2hvdWxkIGtub3cgYnkgbm93CitMUEMgb2JqZWN0IGFyZSBtYWRlIHVwIG9mIHplcm8gb3IgbW9yZSB2YXJpYWJsZXMgbWFuaXB1bGF0ZWQgYnkgb25lIG9yCittb3JlIGZ1bmN0aW9ucy4gIFRoZSBvcmRlciBpbiB3aGljaCB0aGVzZSBmdW5jdGlvbnMgYXBwZWFyIGluIGNvZGUgaXMKK2lycmVsZXZhbnQuICBUaGUgZHJpdmVyIHVzZXMgdGhlIExQQyBjb2RlIHlvdSB3cml0ZSBieSBsb2FkaW5nIGNvcGllcyBvZgoraXQgaW50byBtZW1vcnkgd2hlbmV2ZXIgaXQgaXMgZmlyc3QgcmVmZXJlbmNlZCBhbmQgYWRkaXRpb25hbCBjb3BpZXMKK3Rocm91Z2ggY2xvbmluZy4gIFdoZW4gZWFjaCBvYmplY3QgaXMgbG9hZGVkIGludG8gbWVtb3J5LCBhbGwgdGhlIHZhcmlhYmxlcworaW5pdGlhbGx5IHBvaW50IHRvIG5vIHZhbHVlLiAgVGhlIHJlc2V0KCkgZnVuY3Rpb24gaW4gY29tcGF0IG11ZHMsIGFuZAorY3JlYXRlKCkgaW4gbmF0aXZlIG11ZHMgYXJlIHVzZWQgdG8gZ2l2ZSBpbml0aWFsIHZhbHVlcyB0byB2YXJpYWJsZXMgaW4KK29iamVjdHMuICBUaGUgZnVuY3Rpb24gZm9yIGNyZWF0aW9uIGlzIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgb2JqZWN0CitpcyBsb2FkZWQgaW50byBtZW1vcnkuICBIb3dldmVyLCBpZiB5b3UgYXJlIHJlYWRpbmcgdGhpcyB0ZXh0Ym9vayB3aXRoIG5vCitwcmlvciBwcm9ncmFtbWluZyBleHBlcmllbmNlLCB5b3UgbWF5IG5vdCBrbm93IHdoYXQgYSBmdW5jdGlvbiBpcyBvciBob3cKK2l0IGdldHMgY2FsbGVkLiAgQW5kIGV2ZW4gaWYgeW91IGhhdmUgcHJvZ3JhbW1pbmcgZXhwZXJpZW5jZSwgeW91IG1heQorYmUgd29uZGVyaW5nIGhvdyB0aGUgcHJvY2VzcyBvZiBmdW5jdGlvbnMgY2FsbGluZyBlYWNoIG90aGVyIGdldHMgc3RhcnRlZAoraW4gbmV3bHkgY3JlYXRlZCBvYmplY3RzLiAgQmVmb3JlIGFueSBvZiB0aGVzZSBxdWVzdGlvbnMgZ2V0IGFuc3dlcmVkLAoraG93ZXZlciwgeW91IG5lZWQgdG8ga25vdyBtb3JlIGFib3V0IHdoYXQgaXQgaXMgdGhlIGZ1bmN0aW9ucyBhcmUKK21hbmlwdWxhdGluZy4gIFlvdSB0aGVyZWZvcmUgc2hvdWxkIHRob3Vyb3VnaGx5IGNvbWUgdG8ga25vdyB0aGUgY29uY2VwdAorYmVoaW5kIExQQyBkYXRhIHR5cGVzLiAgQ2VydGFpbmx5IHRoZSBtb3N0IGJvcmluZyBzdWJqZWN0IGluIHRoaXMgbWFudWFsLAoreWV0IGl0IGlzIHRoZSBtb3N0IGNydWNpYWwsIGFzIDkwJSBvZiBhbGwgZXJyb3JzIChleGNlcHRpbmcgbWlzcGxhY2VkCit7fSBhbmQgKCkpIGludm9sdmUgdGhlIGltcHJvcGVyIHVzYWdlIG9mIExQQyBkYXRhIHR5cGVzLiAgU28gYmVhciB0aHJvdWdoCit0aGlzIGltcG9ydGFudCBjaGFwdGVyLCBiZWNhdXNlIGl0IGlzIG15IGZlZWxpbmcgdGhhdCB1bmRlcnN0YW5kaW5nIHRoaXMKK2NoYXB0ZXIgYWxvbmUgY2FuIGhlbHAgeW91IGZpbmQgY29kaW5nIG11Y2gsIG11Y2ggZWFzaWVyLgorCiszLjIgQ29tbXVuaWNhdGluZyB3aXRoIHRoZSBjb21wdXRlcgorWW91IHBvc3NpYmx5IGFscmVhZHkga25vdyB0aGF0IGNvbXB1dGVycyBjYW5ub3QgdW5kZXJzdGFuZCB0aGUgbGV0dGVycworYW5kIG51bWJlcnMgdXNlZCBieSBodW1hbnMuICBJbnN0ZWFkLCB0aGUgImxhbmd1YWdlIiBzcG9rZW4gYnkgY29tcHV0ZXJzCitjb25zaXN0cyBvZiBhbiAiYWxwaGFiZXQiIG9mIDAncyBhbmQgMSdzLiAgQ2VydGFpbmx5IHlvdSBrbm93IGNvbXB1dGVycworZG8gbm90IHVuZGVyc3RhbmQgbmF0dXJhbCBodW1hbiBsYW5ndWFnZXMuICBCdXQgaW4gZmFjdCwgdGhleSBkbyBub3QKK3VuZGVyc3RhbmQgdGhlIGNvbXB1dGVyIGxhbmd1YWdlcyB3ZSB3cml0ZSBmb3IgdGhlbSBlaXRoZXIuICBDb21wdXRlcgorbGFuZ3VhZ2VzIGxpa2UgQkFTSUMsIEMsIEMrKywgUGFzY2FsLCBldGMuIGFyZSBhbGwgaW50ZXJtZWRpYXRlCitsYW5ndWFnZXMuICBUaGV5IGFsbG93IHlvdSB0byBzdHJ1Y3R1cmUgeW91ciB0aG91Z2h0cyBtb3JlIGNvaGVyZW50bHkKK2ZvciB0cmFuc2xhdGlvbiBpbnRvIHRoZSAwJ3MgYW5kIDEncyBvZiB0aGUgY29tcHV0ZXIncyBsYW5ndWFnZXMuCisKK1RoZXJlIGFyZSB0d28gbWV0aG9kcyBpbiB3aGljaCB0cmFuc2xhdGlvbiBpcyBkb25lOiBjb21waWxhdGlvbiBhbmQKK2ludGVycHJldGF0aW9uLiAgVGhlc2Ugc2ltcGx5IGFyZSBkaWZmZXJlbmNlcyBiZXR3ZWVtIHdoZW4gdGhlIAorcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgaXMgdHJhbnNsYXRlZCBpbnRvIGNvbXB1dGVyIGxhbmd1YWdlLiAgV2l0aAorY29tcGlsZWQgbGFuZ3VhZ2VzLCB0aGUgcHJvZ3JhbW1lciB3cml0ZXMgdGhlIGNvZGUgdGhlbiB1c2VzIGEgcHJvZ3JhbQorY2FsbGVkIGEgY29tcGlsZXIgdG8gdHJhbnNsYXRlIHRoZSBwcm9ncmFtIGludG8gdGhlIGNvbXB1dGVyJ3MKK2xhbmd1YWdlLiAgVGhpcyB0cmFuc2xhdGlvbiBvY2N1cnMgYmVmb3JlIHRoZSBwcm9ncmFtIGlzIHJ1bi4gIFdpdGgKK2ludGVycHJldGVkIGxhbmd1YWdlcyBob3dldmVyLCB0aGUgcHJvY2VzcyBvZiB0cmFuc2xhdGlvbiBvY2N1cnMgYXMKK3RoZSBwcm9ncmFtIGlzIGJlaW5nIHJ1bi4gIFNpbmNlIHRoZSB0cmFuc2xhdGlvbiBvZiB0aGUgcHJvZ3JhbSBpcworb2NjdXJyaW5nIGR1cmluZyB0aGUgdGltZSBvZiB0aGUgcHJvZ3JhbSdzIHJ1bm5pbmcgaW4gaW50ZXJwcmV0ZWQKK2xhbmd1YWdlcywgaW50ZXJwcmV0ZWQgbGFuZ3VhZ2VzIG1ha2UgbXVjaCBzbG93ZXIgcHJvZ3JhbXMgdGhhbgorY29tcGlsZWQgbGFuZ3VhZ2VzLgorCitUaGUgYm90dG9tIGxpbmUgaXMsIG5vIG1hdHRlciB3aGF0IGxhbmd1YWdlIHlvdSBhcmUgd3JpdGluZyBpbiwgYXQKK3NvbWUgcG9pbnQgdGhpcyBoYXMgdG8gYmUgY2hhbmdlZCBpbnRvIDAncyBhbmQgMSdzIHdoaWNoIGNhbiBiZQordW5kZXJzdG9vZCBieSB0aGUgY29tcHV0ZXIuICBCdXQgdGhlIHZhcmlhYmxlcyB3aGljaCB5b3Ugc3RvcmUgaW4KK21lbW9yeSBhcmUgbm90IHNpbXBseSAwJ3MgYW5kIDEncy4gIFNvIHlvdSBoYXZlIHRvIGhhdmUgYSB3YXkgaW4KK3lvdXIgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIG9mIHRlbGxpbmcgdGhlIGNvbXB1dGVyIHdoZXRoZXIgb3Igbm90Cit0aGUgMCdzIGFuZCAxJ3Mgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgZGVjaW1hbCBudW1iZXJzIG9yIGNoYXJhY3RlcnMgb3IKK3N0cmluZ3Mgb3IgYW55dGhpbmcgZWxzZS4gIFlvdSBkbyB0aGlzIHRocm91Z2ggdGhlIHVzZSBvZiBkYXRhIHR5cGVzLgorCitGb3IgZXhhbXBsZSwgc2F5IHlvdSBoYXZlIGEgdmFyaWFibGUgd2hpY2ggeW91IGNhbGwgJ3gnIGFuZCB5b3UgZ2l2ZQoraXQgdGhlIGRlY2ltYWwgd2hvbGUgbnVtYmVyIHZhbHVlIDY1LiAgSW4gTFBDIHlvdSB3b3VsZCBkbyB0aGlzIHRocm91Z2gKK3RoZSBzdGF0ZW1lbnQ6CisKKy0tLS0tCit4ID0gNjU7CistLS0tLQorCitZb3UgY2FuIGxhdGVyIGRvIHRoaW5ncyBsaWtlOgorCitfX19fXword3JpdGUoeCsiXG4iKTsgICAgICAgIC8qIFxuIGlzIHN5bWJvbGljYWxseSByZXByZXNlbnRzIGEgY2FycmlhZ2UgcmV0dXJuICovCit5ID0geCArIDU7CistLS0tLQorCitUaGUgZmlyc3QgbGluZSBhbGxvd3MgeW91IHRvIHNlbmQgNjUgYW5kIGEgY2FycmlhZ2UgcmV0dXJuIHRvIHNvbWVvbmUncyBzY3JlZW4uCitUaGUgc2Vjb25kIGxpbmUgbGV0cyB5b3Ugc2V0IHRoZSB2YWx1ZSBvZiB5IHRvIDcwLgorVGhlIHByb2JsZW0gZm9yIHRoZSBjb21wdXRlciBpcyB0aGF0IGl0IGRvZXMgbm90IGtub3cgd2hhdCAnNjUnIG1lYW5zIHdoZW4KK3lvdSB0ZWxsIGl0IHggPSA2NTsuICBXaGF0IHlvdSB0aGluayBvZiA2NSwgaXQgbWlnaHQgdGhpbmsgb2YgYXM6CiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMQorQnV0LCBhbHNvLCB0byB0aGUgY29tcHV0ZXIsIHRoZSBsZXR0ZXIgJ0EnIGlzIHJlcHJlc2VudGVkIGFzOgorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDEKK1NvLCB3aGVuZXZlciB5b3UgaW5zdHJ1Y3QgdGhlIGNvbXB1dGVyIHdyaXRlKHgrIlxuIik7LCBpdCBtdXN0IGhhdmUgc29tZQord2F5IG9mIGtub3dpbmcgdGhhdCB5b3Ugd2FudCB0byBzZWUgJzY1JyBhbmQgbm90ICdBJy4KKworVGhlIGNvbXB1dGVyIGNhbiB0ZWxsIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gJzY1JyBhbmQgJ0EnIHRocm91Z2ggdGhlIHVzZQorb2YgZGF0YSB0eXBlcy4gIEEgZGF0YSB0eXBlcyBzaW1wbHkgc2F5cyB3aGF0IHR5cGUgb2YgZGF0YSBpcyBiZWluZyBzdG9yZWQKK2J5IHRoZSBtZW1vcnkgbG9jYXRpb24gcG9pbnRlZCB0byBieSBhIGdpdmVuIHZhcmlhYmxlLiAgVGh1cywgZWFjaCBMUEMKK3ZhcmlhYmxlIGhhcyBhIHZhcmlhYmxlIHR5cGUgd2hpY2ggZ3VpZGVzIGNvbnZlcnNpb25zLiAgSW4gdGhlIGV4YW1wbGUKK2dpdmVuIGFib3ZlLCB5b3Ugd291bGQgaGF2ZSBoYWQgdGhlIGZvbGxvd2luZyBsaW5lIHNvbWV3aGVyZSBpbiB0aGUKK2NvZGUgKmJlZm9yZSogdGhlIGxpbmVzIHNob3duIGFib3ZlOgorCistLS0tLQoraW50IHg7CistLS0tLQorCitUaGlzIG9uZSBsaW5lIHRlbGxzIHRoZSBkcml2ZXIgdGhhdCB3aGF0ZXZlciB2YWx1ZSB4IHBvaW50cyB0bywgaXQgd2lsbAorYmUgdXNlZCBhcyB0aGUgZGF0YSB0eXBlICJpbnQiLCB3aGljaCBpcyBzaG9ydCBmb3IgaW50ZWdlciwgb3Igd2hvbGUKK251bWJlci4gIFNvIHlvdSBoYXZlIGEgYmFzaWMgaW50cm9kdWN0aW9uIGludG8gdGhlIHJlYXNvbiB3aHkgZGF0YSB0eXBlcworZXhpc3QuICBUaGV5IGV4aXN0IHNvIHRoZSBkcml2ZXIgY2FuIG1ha2Ugc2Vuc2Ugb2YgdGhlIDAncyBhbmQgMSdzIHRoYXQKK3RoZSBjb21wdXRlciBpcyBzdG9yaW5nIGluIG1lbW9yeS4KKworMy4zIFRoZSBkYXRhIHR5cGVzIG9mIExQQworQWxsIExQTXVkIGRyaXZlcnMgaGF2ZSB0aGUgZm9sbG93aW5nIGRhdGEgdHlwZXM6CisKK3ZvaWQsIHN0YXR1cywgaW50LCBzdHJpbmcsIG9iamVjdCwgaW50ICosIHN0cmluZyAqLCBvYmplY3QgKiwgbWl4ZWQgKgorCitNYW55IGRyaXZlcnMsIGJ1dCBub3QgYWxsIGhhdmUgdGhlIGZvbGxvd2luZyBpbXBvcnRhbnQgZGF0YSB0eXBlcyB3aGljaAorYXJlIGltcG9ydGFudCB0byBkaXNjdXNzOgorCitmbG9hdCwgbWFwcGluZywgZmxvYXQgKiwgbWFwcGluZyAqCisKK0FuZCB0aGVyZSBhcmUgYSBmZXcgZHJpdmVycyB3aXRoIHRoZSBmb2xsb3dpbmcgcmFyZWx5IHVzZWQgZGF0YSB0eXBlcword2hpY2ggYXJlIG5vdCBpbXBvcnRhbnQgdG8gZGlzY3VzczoKKworZnVuY3Rpb24sIGVudW0sIHN0cnVjdCwgY2hhcgorCiszLjQgU2ltcGxlIGRhdGEgdHlwZXMKK1RoaXMgaW50cm9kdWN0b3J5IHRleHRib29rIHdpbGwgZGVhbCB3aXRoIHRoZSBkYXRhIHR5cGVzIHZvaWQsIHN0YXR1cywKK2ludCwgZmxvYXQsIHN0cmluZywgb2JqZWN0LCBtYW5kIG1peGVkLiAgWW91IGNhbiBmaW5kIG91dCBhYm91dCB0aGUKK21vcmUgY29tcGxleCBkYXRhIHR5cGVzIGxpa2UgbWFwcGluZ3MgYW5kIGFycmF5cyBpbiB0aGUgaW50ZXJtZWRpYXRlCit0ZXh0Ym9vay4gIFRoaXMgY2hhcHRlciBkZWFscyB3aXRoIHRoZSB0d28gc2ltcGxlc3QgZGF0YSB0eXBlcyAoZnJvbSB0aGUKK3BvaW50IG9mIHZpZXcgb2YgdGhlIExQQyBjb2RlciksIGludCBhbmQgc3RyaW5nLgorCitBbiBpbnQgaXMgYW55IHdob2xlIG51bWJlci4gIFRodXMgMSwgNDIsIC0xNywgMCwgLTEwMDAwMDIzIGFyZSBhbGwgdHlwZSBpbnQuCitBIHN0cmluZyBpcyBvbmUgb3IgbW9yZSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4gIFRodXMgImEiLCAid2UgYXJlIGJvcmciLAorIjQyIiwgIlRoaXMgaXMgYSBzdHJpbmciIGFyZSBhbGwgc3RyaW5ncy4gIE5vdGUgdGhhdCBzdHJpbmdzIGFyZSBhbHdheXMKK2VuY2xvc2VkIGluICIiIHRvIGFsbG93IHRoZSBkcml2ZXIgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgaW50IDQyIGFuZAordGhlIHN0cmluZyAiNDIiIGFzIHdlbGwgYXMgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB2YXJpYWJsZSBuYW1lcyAobGlrZSB4KQorYW5kIHN0cmluZ3MgYnkgdGhlIHNhbWUgbmFtZXMgKGxpa2UgIngiKS4KKworV2hlbiB5b3UgdXNlIGEgdmFyaWFibGUgaW4gY29kZSwgeW91IG11c3QgZmlyc3QgbGV0IHRoZSBkcml2ZXIga25vdword2hhdCB0eXBlIG9mIGRhdGEgdG8gd2hpY2ggdGhhdCB2YXJpYWJsZSBwb2ludHMuICBUaGlzIHByb2Nlc3MgaXMKK2NhbGxlZCAqZGVjbGFyYXRpb24qLiAgWW91IGRvIHRoaXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZnVuY3Rpb24KK29yIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG9iamVjdCBjb2RlIChvdXRzaWRlIG9mIGZ1bmN0aW9ucyBiZWZvcmUgYWxsCitmdW5jdGlvbnMgd2hpY2ggdXNlIGl0KS4gIFRoaXMgaXMgZG9uZSBieSBwbGFjaW5nIHRoZSBuYW1lIG9mIHRoZSBkYXRhIHR5cGUKK2JlZm9yZSB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgbGlrZSBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CisKKy0tLS0tCit2b2lkIGFkZF90d29fYW5kX3R3bygpIHsKKyAgICBpbnQgeDsKKyAgICBpbnQgeTsKKworICAgIHggPSAyOworICAgIHkgPSB4ICsgeDsKK30KKy0tLS0tCisKK05vdywgdGhpcyBpcyBhIGNvbXBsZXRlIGZ1bmN0aW9uLiAgVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGlzIAorYWRkX3R3b19hbmRfdHdvKCkuICBUaGUgZnVuY3Rpb24gYmVnaW5zIHdpdGggdGhlIGRlY2xhcmF0aW9uIG9mIGFuCitpbnQgdmFyaWFibGUgbmFtZWQgeCBmb2xsb3dlZCBieSB0aGUgZGVjbGFyYXRpb24gb2YgYW4gaW4gdmFyaWFibGUKK25hbWVkIHkuICBTbyBub3csIGF0IHRoaXMgcG9pbnQsIHRoZSBkcml2ZXIgbm93IGhhcyB0d28gdmFyaWFibGVzIHdoaWNoCitwb2ludCB0byBOVUxMIHZhbHVlcywgYW5kIGl0IGV4cGVjdHMgd2hhdCBldmVyIHZhbHVlcyBlbmQgdXAgdGhlcmUgdG8gYmUKK29mIHR5cGUgaW50LgorCitBIG5vdGUgYWJvdXQgdGhlIGRhdGEgdHlwZXMgdm9pZCBhbmQgc3RhdHVzOgorVm9pZCBpcyBhIHRyaXZpYWwgZGF0YSB0eXBlIHdoaWNoIHBvaW50cyB0byBub3RoaW5nLiAgSXQgaXMgbm90IHVzZWQKK3dpdGggcmVzcGVjdCB0byB2YXJpYWJsZXMsIGJ1dCBpbnN0ZWFkIHdpdGggcmVzcGVjdCB0byBmdW5jdGlvbnMuICBZb3UKK3dpbGwgY29tZSB0byB1bmRlcnN0YW5kIHRoaXMgYmV0dGVyIGxhdGVyLiAgRm9yIG5vdywgeW91IG5lZWQgb25seQordW5kZXJzdGFuZCB0aGF0IGl0IHBvaW50cyB0byBubyB2YWx1ZS4gIAorCitUaGUgZGF0YSB0eXBlIHN0YXR1cyBpcyBhIGJvb2xlYW4gZGF0YSB0eXBlLiAgVGhhdCBpcywgaXQgY2FuIG9ubHkgaGF2ZQorMSBvciAwIGFzIGEgdmFsdWUuICBUaGlzIGlzIG9mdGVuIHJlZmVycmVkIHRvIGFzIGJlaW5nIHRydWUgb3IgZmFsc2UuCisKKzMuNSBDaGFwdGVyIHN1bW1hcnkKK0ZvciB2YXJpYWJsZXMsIHRoZSBkcml2ZXIgbmVlZHMgdG8ga25vdyBob3cgdGhlIDAncyBhbmQgMSdzIHRoZSBjb21wdXRlcgorc3RvcmVzIGluIG1lbW9yeSBnZXQgY29udmVydGVkIGludG8gdGhlIGZvcm1zIGluIHdoaWNoIHlvdSBpbnRlbmQgdGhlbQordG8gYmUgdXNlZC4gIFRoZSBzaW1wbGVzdCBMUEMgZGF0YSB0eXBlcyBhcmUgdm9pZCwgc3RhdHVzLCBpbnQsIGFuZCBzdHJpbmcuCitZb3UgZG8gbm90IHVzZXIgdmFyaWFibGVzIG9mIHR5cGUgdm9pZCwgYnV0IHRoZSBkYXRhIHR5cGUgZG9lcyBjb21lCitpbnRvIHBsYXkgd2l0aCByZXNwZWN0IHRvIGZ1bmN0aW9ucy4gIEluIGFkZGl0aW9uIHRvIGJlaW5nIHVzZWQgZm9yCit0cmFuc2xhdGlvbiBmcm9tIG9uZSBmb3JtIHRvIHRoZSBuZXh0LCBkYXRhIHR5cGVzIGFyZSB1c2VkIGluIGRldGVybWluaW5nCit3aGF0IHJ1bGVzIHRoZSBkcml2ZXIgdXNlcyBmb3Igc3VjaCBvcGVyYXRpb25zIGFzICssIC0sIGV0Yy4gIEZvciBleGFtcGxlLAoraW4gdGhlIGV4cHJlc3Npb24gNSs1LCB0aGUgZHJpdmVyIGtub3dzIHRvIGFkZCB0aGUgdmFsdWVzIG9mIDUgYW5kIDUKK3RvZ2V0aGVyIHRvIG1ha2UgMTAuICBXaXRoIHN0cmluZ3MgaG93ZXZlciwgdGhlIHJ1bGVzIGZvciBpbnQgYWRkaXRpb24KK21ha2Ugbm8gc2Vuc2UuICBTbyBpbnN0ZWFkLCB3aXRoICJhIisiYiIsIGl0IGFwcGVuZHMgImIiIHRvIHRoZSBzdHJpbmcgImEiCitzbyB0aGF0IHRoZSBmaW5hbCBzdHJpbmcgaXMgImFiIi4gIEVycm9ycyBjYW4gdGh1cyByZXN1bHQgaWYgeW91IG1pc3Rha2VubHkKK3RyeSB0byBhZGQgIjUiKzUuICBTaW5jZSBpbnQgYWRkaXRpb24gbWFrZXMgbm8gc2Vuc2Ugd2l0aCBzdHJpbmdzLCB0aGUKK2RyaXZlciB3aWxsIGNvbnZlcnQgdGhlIHNlY29uZCA1IHRvICI1IiBhbmQgdXNlIHN0cmluZyBhZGRpdGlvbi4gIFRoZSBmaW5hbAorcmVzdWx0IHdvdWxkIGJlICI1NSIuICBJZiB5b3Ugd2VyZSBsb29raW5nIGZvciAxMCwgeW91IHdvdWxkIHRoZXJlZm9yZQoraGF2ZSBlbmRlZCB1cCB3aXRoIGVycm9uZW91cyBjb2RlLiAgS2VlcCBpbiBtaW5kLCBob3dldmVyLCB0aGF0IGluIG1vc3QKK2luc3RhbmNlcywgdGhlIGRyaXZlciB3aWxsIG5vdCBkbyBzb21ldGhpbmcgc28gdXNlZnVsIGFzIGNvbWluZyB1cCB3aXRoCisiNTUiLiAgSXQgY29tZXMgdXAgd2l0aCAiNTUiIGNhdXNlIGl0IGhhcyBhIHJ1bGUgZm9yIGFkZGluZyBhIHN0cmluZwordG8gYW4gaW50LCBuYW1lbHkgdG8gdHJlYXQgdGhlIGludCBhcyBhIHN0cmluZy4gIEluIG1vc3QgY2FzZXMsIGlmIHlvdQordXNlIGEgZGF0YSB0eXBlIGZvciB3aGljaCBhbiBvcGVyYXRpb24gb3IgZnVuY3Rpb24gaXMgbm90IGRlZmluZWQKKyhsaWtlIGlmIHlvdSB0cmllZCB0byBkaXZpZGUgInRoaXMgaXMiIGJ5ICJub25zZW5zZSIsICJ0aGlzIGlzIi8ibm9uc2Vuc2UiKSwKK3RoZSBkcml2ZXIgd2lsbCBiYXJmIGFuZCByZXBvcnQgYW4gZXJyb3IgdG8geW91LgpkaWZmIC0tZ2l0IGEvZG9jL0tVUlMvTFBDLUtVUlMvY2hhcHRlcjQgYi9kb2MvS1VSUy9MUEMtS1VSUy9jaGFwdGVyNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjQ0Y2RjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL0tVUlMvTFBDLUtVUlMvY2hhcHRlcjQKQEAgLTAsMCArMSwyMjUgQEAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQyBCYXNpY3MKKyAgICAgICAgICAgICAgICAgIFdyaXR0ZW4gYnkgRGVzY2FydGVzIG9mIEJvcmcKKyAgICAgICAgICAgICAgICAgIGZpcnN0IGVkaXRpb246IDIzIGFwcmlsIDE5OTMKKyAgICAgICAgICAgICAgICAgIHNlY29uZCBlZGl0aW9uOiAyMiBqdW5lIDE5OTMKKworQ0hBUFRFUiA0OiBGdW5jdGlvbnMKKworNC4xIFJldmlldworQnkgdGhpcyBwb2ludCwgeW91IHNob3VsZCBiZSBhd2FyZSB0aGF0IExQQyBvYmplY3RzIGNvbnNpc3Qgb2YgZnVuY3Rpb25zCit3aGljaCBtYW5pcHVsYXRlIHZhcmlhYmxlcy4gIFRoZSBmdW5jdGlvbnMgbWFuaXB1bGF0ZSB2YXJpYWJsZXMgd2hlbiB0aGV5CithcmUgZXhlY3V0ZWQsIGFuZCB0aGV5IGdldCBleGVjdXRlZCB0aHJvdWdoICpjYWxscyogdG8gdGhvc2UgZnVuY3Rpb25zLgorVGhlIG9yZGVyIGluIHdoaWNoIHRoZSBmdW5jdGlvbnMgYXJlIHBsYWNlZCBpbiBhIGZpbGUgZG9lcyBub3QgbWF0dGVyLgorSW5zaWRlIGEgZnVuY3Rpb24sIHRoZSB2YXJpYWJsZXMgZ2V0IG1hbmlwdWxhdGVkLiAgVGhleSBhcmUgc3RvcmVkIGluCitjb21wdXRlciBtZW1vcnkgYW5kIHVzZWQgYnkgdGhlIGNvbXB1dGVyIGFzIDAncyBhbmQgMSdzIHdoaWNoCitnZXQgdHJhbnNsYXRlZCB0byBhbmQgZnJvbSB1c2VhYmxlIG91dHB1dCBhbmQgaW5wdXQgdGhyb3VnaCBhIGRldmljZQorY2FsbGVkIGRhdGEgdHlwaW5nLiAgU3RyaW5nIGRhdGEgdHlwZXMgdGVsbCB0aGUgZHJpdmVyIHRoYXQgdGhlCitkYXRhIHNob3VsZCBhcHBlYXIgdG8geW91IGFuZCBjb21lIGZyb20geW91IGluIHRoZSBmb3JtIG9mIGFscGhhbnVtZXJpYworY2hhcmFjdGVycy4gIFZhcmlhYmxlcyBvZiB0eXBlIGludCBhcmUgcmVwcmVzZW50ZWQgdG8geW91IGFzIHdob2xlCitudW1iZXIgdmFsdWVzLiAgVHlwZSBzdGF0dXMgaXMgcmVwcmVzZW50ZWQgdG8geW91IGFzIGVpdGhlciAxIG9yIDAuCitBbmQgZmluYWxseSB0eXBlIHZvaWQgaGFzIG5vIHZhbHVlIHRvIHlvdSBvciB0aGUgbWFjaGluZSwgYW5kIGlzIG5vdAorcmVhbGx5IHVzZWQgd2l0aCB2YXJpYWJsZSBkYXRhIHR5cGVzLgorCis0LjIgV2hhdCBpcyBhIGZ1bmN0aW9uPworTGlrZSBtYXRoIGZ1bmN0aW9ucywgTFBDIGZ1bmN0aW9ucyB0YWtlIGlucHV0IGFuZCByZXR1cm4gb3V0cHV0LgorTGFuZ3VhZ2VzIGxpa2UgUGFzY2FsIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlIGNvbmNlcHQgb2YgcHJvY2VlZHVyZSBhYmQKK3RoZSBjb25jZXB0IG9mIGZ1bmN0aW9uLiAgTFBDIGRvZXMgbm90LCBob3dldmVyLCBpdCBpcyB1c2VmdWwgdG8KK3VuZGVyc3RhbmQgdGhpcyBkaXN0aW5jdGlvbi4gIFdoYXQgUGFzY2FsIGNhbGxzIGEgcHJvY2VlZHVyZSwgTFBDCitjYWxscyBhIGZ1bmN0aW9uIG9mIHR5cGUgdm9pZC4gIEluIG90aGVyIHdvcmRzLCBhIHByb2NlZWR1cmUsIG9yIGZ1bmN0aW9uCitvZiB0eXBlIHZvaWQgcmV0dXJucyBubyBvdXRwdXQuICBXaGF0IFBhc2NhbCBjYWxscyBhIGZ1bmN0aW9uIGRpZmZlcnMKK2luIHRoYXQgaXQgZG9lcyByZXR1cm4gb3V0cHV0LiAgSW4gTFBDLCB0aGUgbW9zdCB0cml2aWFsLCBjb3JyZWN0CitmdW5jdGlvbiBpczoKKworLS0tLS0KK3ZvaWQgZG9fbm90aGluZygpIHsgfQorLS0tLS0KKworVGhpcyBmdW5jdGlvbiBhY2NlcHRzIG5vIGlucHV0LCBwZXJmb3JtcyBubyBpbnN0cnVjdGlvbnMsIGFuZCByZXR1cm5zIG5vCit2YWx1ZS4KKworVGhlcmUgYXJlIHRocmVlIHBhcnRzIHRvIGV2ZXJ5IHByb3Blcmx5IHdyaXR0ZW4gTFBDIGZ1bmN0aW9uOgorMSkgVGhlIGRlY2xhcmF0aW9uCisyKSBUaGUgZGVmaW5pdGlvbgorMykgVGhlIGNhbGwKKworTGlrZSB3aXRoIHZhcmlhYmxlcywgZnVuY3Rpb25zIG11c3QgYmUgZGVjbGFyZWQuICBUaGlzIHdpbGwgYWxsb3cgdGhlCitkcml2ZXIgdG8ga25vdyAxKSB3aGF0IHR5cGUgb2YgZGF0YSB0aGUgZnVuY3Rpb24gaXMgcmV0dXJuaW5nIGFzIG91dHB1dCwKK2FuZCAyKSBob3cgbWFueSBpbnB1dChzKSBhbmQgb2Ygd2hhdCB0eXBlIHRob3NlIGlucHV0KHMpIGFyZS4gIFRoZQorbW9yZSBjb21tb24gd29yZCBmb3IgaW5wdXQgaXMgcGFyYW1ldGVycy4KK0EgZnVuY3Rpb24gZGVjbGFyYXRpb24gdGhlcmVmb3JlIGNvbnNpc3RzIG9mOgordHlwZSBuYW1lKHBhcmFtZXRlcjEsIHBhcmFtZXRlcjIsIC4uLiwgcGFyYW1ldGVyTik7CitUaGUgZGVjbGFyYXRpb24gb2YgYSBmdW5jdGlvbiBjYWxsZWQgZHJpbmtfd2F0ZXIoKSB3aGljaCBhY2NlcHRzIGEgc3RyaW5nIGFzCitpbnB1dCBhbmQgYW4gaW50IGFzIG91dHB1dCB3b3VsZCB0aHVzIGxvb2sgbGlrZSB0aGlzOgorCistLS0tLQoraW50IGRyaW5rX3dhdGVyKHN0cmluZyBzdHIpOworLS0tLS0KKword2hlcmUgc3RyIGlzIHRoZSBuYW1lIG9mIHRoZSBpbnB1dCBhcyBpdCB3aWxsIGJlIHVzZWQgaW5zaWRlIHRoZSBmdW5jdGlvbi4KKworVGhlIGZ1bmN0aW9uIGRlZmluaXRpb24gaXMgdGhlIGNvZGUgd2hpY2ggZGVzY3JpYmVzIHdoYXQgdGhlIGZ1bmN0aW9uIGFjdHVhbGx5Citkb2VzIHdpdGggdGhlIGlucHV0IHNlbnQgdG8gaXQuICAKK1RoZSBjYWxsIGlzIGFueSBwbGFjZSBpbiBvdGhlciBmdW5jdGlvbnMgd2hpY2ggaW52b2tlcyB0aGUgZXhlY3V0aW9uIG9mIHRoZQorZnVuY3Rpb24gaW4gcXVlc3Rpb24uICBGb3IgdHdvIGZ1bmN0aW9ucyB3cml0ZV92YWxzKCkgYW5kIGFkZCgpLCB5b3UgdGh1cworbWlnaHQgaGF2ZSB0aGUgZm9sbG93aW5nIGJpdCBvZiBjb2RlOgorCistLS0tLQorLyogRmlyc3QsIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4gIFRoZXkgdXN1YWxseSBhcHBlYXIgYXQgdGhlIGJlZ2lubmluZworICAgb2Ygb2JqZWN0IGNvZGUuIAorKi8KK3ZvaWQgd3JpdGVfdmFscygpOworaW50IGFkZChpbnQgeCwgaW50IHkpOworCisvKiBOZXh0LCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgZnVuY3Rpb24gd3JpdGVfdmFscygpLiAgV2UgYXNzdW1lIHRoYXQKKyAgIHRoaXMgZnVuY3Rpb24gaXMgZ29pbmcgdG8gYmUgY2FsbGVkIGZyb20gb3V0c2lkZSB0aGUgb2JqZWN0CisqLwordm9pZCB3cml0ZV92YWxzKCkgeworICAgIGludCB4OworCisgICAgLypOIE5vdyB3ZSBhc3NpZ24geCB0aGUgdmFsdWUgb2YgdGhlIG91dHB1dCBvZiBhZGQoKSB0aHJvdWdoIGEgY2FsbCAqLworICAgIHggPSBhZGQoMiwgMik7CisgICAgd3JpdGUoeCsiXG4iKTsKK30KKworLyogRmluYWxseSwgdGhlIGRlZmluaXRpb24gb2YgYWRkKCkgKi8KK2ludCBhZGQoaW50IHgsIGludCB5KSB7CisgICAgcmV0dXJuICh4ICsgeSk7Cit9CistLS0tLQorCitSZW1lbWJlciwgaXQgZG9lcyBub3QgbWF0dGVyIHdoaWNoIGZ1bmN0aW9uIGRlZmluaXRpb24gYXBwZWFycyBmaXJzdCBpbiB0aGUKK2NvZGUuICBUaGlzIGlzIGJlY2F1c2UgZnVuY3Rpb25zIGFyZSBub3QgZXhlY3V0ZWQgY29uc2VjdXRpdmVseS4gIEluc3RlYWQsCitmdW5jdGlvbnMgYXJlIGV4ZWN1dGVkIGFzIGNhbGxlZC4gIFRoZSBvbmx5IHJlcXVpcmVtZW50IGlzIHRoYXQgdGhlCitkZWNsYXJhdGlvbiBvZiBhIGZ1bmN0aW9uIGFwcGVhciBiZWZvcmUgaXRzIGRlZmluaXRpb24gYW5kIGJlZm9yZSB0aGUKK2RlZmluaXRpb24gb2YgYW55IGZ1bmN0aW9uIHdoaWNoIG1ha2VzIGEgY2FsbCB0byBpdC4KKworNC4zIEVmdW5zCitQZXJoYXBzIHlvdSBoYXZlIGhlYXJkIHBlb3BsZSByZWZlciB0byBlZnVucy4gIFRoZXkgYXJlIGV4dGVybmFsbHkgZGVmaW5lZAorZnVuY3Rpb25zLiAgTmFtZWx5LCB0aGV5IGFyZSBkZWZpbmVkIGJ5IHRoZSBtdWQgZHJpdmVyLiAgSWYgeW91IGhhdmUKK3BsYXllZCBhcm91bmQgYXQgYWxsIHdpdGggY29kaW5nIGluIExQQywgeW91IGhhdmUgcHJvYmFibHkgZm91bmQgc29tZQorZXhwcmVzc2lvbnMgeW91IHdlcmUgdG9sZCB0byB1c2UgbGlrZSB0aGlzX3BsYXllcigpLCB3cml0ZSgpLCBzYXkoKSwKK3RoaXNfb2JqZWN0KCksIGV0Yy4gbG9vayBhIGxvdCBsaWtlIGZ1bmN0aW9ucy4gIFRoYXQgaXMgYmVjYXVzZSB0aGV5IGFyZQorZWZ1bnMuICBUaGUgdmFsdWUgb2YgZWZ1bnMgaXMgdGhhdCB0aGV5IGFyZSBtdWNoIGZhc3RlciB0aGFuIExQQyBmdW5jdGlvbnMsCitzaW5jZSB0aGV5IGFscmVhZHkgZXhpc3QgaW4gdGhlIGJpbmFyeSBmb3JtIHRoZSBjb21wdXRlciB1bmRlcnN0YW5kcy4KKworSW4gdGhlIGZ1bmN0aW9uIHdyaXRlX3ZhbHMoKSBhYm92ZSwgdHdvIGZ1bmN0aW9ucyBjYWxscyB3ZXJlIG1hZGUuICBUaGUgZmlyc3Qgd2FzIHRvCit0aGUgZnVuY3Rpb25zIGFkZCgpLCB3aGljaCB5b3UgZGVjbGFyZWQgYW5kIGRlZmluZWQuICBUaGUgc2Vjb25kIGNhbGwsIGhvd2V2ZXIsCit3YXMgdG8gYSBmdW5jdGlvbiBjYWxsZWQgd3JpdGUoKSwgYW5kIGVmdW4uICBUaGUgZHJpdmVyIGhhcyBhbHJlYWR5IGRlY2xhcmVkCithbmQgZGVmaW5lZCB0aGlzIGZ1bmN0aW9uIGZvciB5b3UuICBZb3UgbmVlZHMgb25seSB0byBtYWtlIGNhbGxzIHRvIGl0LgorCitFZnVucyBhcmUgY3JlYXRlZCB0byBoYW5sZGxlIGNvbW1vbiwgZXZlcnkgZGF5IGZ1bmN0aW9uIGNhbGxzLCB0byBoYW5kbGUKK2lucHV0L291dHB1dCB0byB0aGUgaW50ZXJuZXQgc29ja2V0cywgYW5kIG90aGVyIG1hdHRlcnMgZGlmZmljdWx0IHRvIGJlCitkZWFsdCB3aXRoIGluIExQQy4gIFRoZXkgYXJlIHdyaXR0ZW4gaW4gQyBpbiB0aGUgZ2FtZSBkcml2ZXIgYW5kIGNvbXBpbGVkCithbG9uZyB3aXRoIHRoZSBkcml2ZXIgYmVmb3JlIHRoZSBtdWQgY29tZXMgdXAsIG1ha2luZyB0aGVtIG11Y2ggZmFzdGVyCitpbiBleGVjdXRpb24uICBCdXQgZm9yIHlvdXIgcHVycG9zZXMsIGVmdW4gY2FsbHMgYXJlIGp1c3QgbGlrZSBjYWxscworbWFkZSB0byB5b3VyIGZ1bmN0aW9ucy4gIFN0aWxsLCBpdCBpcyBpbXBvcnRhbnQgdG8ga25vdyB0d28gdGhpbmdzIG9mIGFueQorZWZ1bjogMSkgd2hhdCByZXR1cm4gdHlwZSBkb2VzIGl0IGhhdmUsIGFuZCAyKSB3aGF0IHBhcmFtZXRlcnMgb2Ygd2hhdAordHlwZXMgZG9lcyBpdCB0YWtlLgorCitJbmZvcm1hdGlvbiBvbiBlZnVucyBzdWNoIGFzIGlucHV0IHBhcmFtZXRlcnMgYW5kIHJldHVybiB0eXBlcyBpcyBvZnRlbgorZm91bmQgaW4gYSBkaXJlY3RvcnkgY2FsbGVkIC9kb2MvZWZ1biBvbiB5b3VyIG11ZC4gIEkgY2Fubm90CitkZXRhaWwgZWZ1bnMgaGVyZSwgYmVjYXVzZSBlZnVucyB2YXJ5IGZyb20gZHJpdmVyIHRvIGRyaXZlci4gIEhvd2V2ZXIsCit5b3UgY2FuIG9mdGVuIGFjY2VzcyB0aGlzIGluZm9ybWF0aW9uIHVzaW5nIHRoZSBjb21tYW5kcyAibWFuIiBvciAiaGVscCIKK2RlcGVuZGluZyBvbiB5b3VyIG11ZGxpYi4gIEZvciBpbnN0YW5jZSwgdGhlIGNvbW1hbmQgIm1hbiB3cml0ZSIgd291bGQKK2dpdmUgeW91IGluZm9ybWF0aW9uIG9uIHRoZSB3cml0ZSBlZnVuLiAgQnV0IGlmIGFsbCBlbHNlIGZhaWxzLAorIm1vcmUgL2RvYy9lZnVuL3dyaXRlIiBzaG91bGQgd29yay4KKworQnkgbG9va2luZyBpdCB1cCwgeW91IHdpbGwgZmluZCB3cml0ZSBpcyBkZWNsYXJlZCBhcyBmb2xsb3dzOgorCistLS0tLQordm9pZCB3cml0ZShzdHJpbmcpOworLS0tLS0KKworVGhpcyB0ZWxscyB5b3UgYW4gYXBwcm9wcmlhdGUgY2FsbCB0byB3cml0ZSBleHBlY3RzIG5vIHJldHVybiB2YWx1ZSBhbmQKK3Bhc3NlcyBhIHNpbmdsZSBwYXJhbWV0ZXIgb2YgdHlwZSBzdHJpbmcuCisKKzQuNCBEZWZpbmluZyB5b3VyIG93biBmdW5jdGlvbnMKK0FsdGhvdWdoIG9yZGVyaW5nIHlvdXIgZnVuY3Rpb25zIHdpdGhpbiB0aGUgZmlsZSBkb2VzIG5vdCBtYXR0ZXIsIG9yZGVyaW5nCit0aGUgY29kZSB3aGljaCBkZWZpbmVzIGEgZnVuY3Rpb24gaXMgbW9zdCBpbXBvcnRhbnQuICBPbmNlIGEgZnVuY3Rpb24KK2hhcyBiZWVuIGNhbGxlZCwgZnVuY3Rpb24gY29kZSBpcyBleGVjdXRlZCBpbiB0aGUgb3JkZXIgaXQgYXBwZWFycworaW4gdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24uICBJbiB3cml0ZV92YWxzKCkgYWJvdmUsIHRoZSBpbnN0cnVjdGlvbjoKKyAgICAKKy0tLS0tCit4ID0gYWRkKDIsIDIpOworLS0tLS0KKworTXVzdCBjb21lIGJlZm9yZSB0aGUgd3JpdGUoKSBlZnVuIGNhbGwgaWYgeW91IHdhbnQgdG8gc2VlIHRoZSBhcHByb3ByaWF0ZQordmFsdWUgb2YgeCB1c2VkIGluIHdyaXRlKCkuICAKKworV2l0aCByZXNwZWN0IHRvIHZhbHVlcyByZXR1cm5lZCBieSBmdW5jdGlvbiwgdGhpcyBpcyBkb25lIHRocm91Z2ggdGhlICJyZXR1cm4iCitpbnN0cnVjdGlvbiBmb2xsb3dlZCBieSBhIHZhbHVlIG9mIHRoZSBzYW1lIGRhdGEgdHlwZSBhcyB0aGUgZnVuY3Rpb24uICBJbgorYWRkKCkgYWJvdmUsIHRoZSBpbnN0cnVjdGlvbiBpcyAicmV0dXJuICh4K3kpOyIsIHdoZXJlIHRoZSB2YWx1ZSBvZiAoeCt5KQoraXMgdGhlIHZhbHVlIHJldHVybmVkIHRvIHdyaXRlX3ZhbHMoKSBhbmQgYXNzaWduZWQgdG8geC4gIE9uIGEgbW9yZQorZ2VuZXJhbCBsZXZlbCwgInJldHVybiIgaGFsdHMgdGhlIGV4ZWN1dGlvbiBvZiBhIGZ1bmN0aW9uIGFuZCByZXR1cm5zCitjb2RlIGV4ZWN1dGlvbiB0byB0aGUgZnVuY3Rpb24gd2hpY2ggY2FsbGVkIHRoYXQgZnVuY3Rpb24uICBJbiBhZGRpdGlvbiwKK2l0IHJldHVybnMgdG8gdGhlIGNhbGxpbmcgZnVuY3Rpb24gdGhlIHZhbHVlIG9mIGFueSBleHByZXNzaW9uIHRoYXQgZm9sbG93cy4KK1RvIHN0b3AgdGhlIGV4ZWN1dGlvbiBvZiBhIGZ1bmN0aW9uIG9mIHR5cGUgdm9pZCBvdXQgb2Ygb3JkZXIsIHVzZQorInJldHVybiI7IHdpdGhvdXQgYW55IHZhbHVlIGZvbGxvd2luZy4gIE9uY2UgYWdhaW4sIHJlbWVtYmVyLCB0aGUgZGF0YQordHlwZSBvZiB0aGUgdmFsdWUgb2YgYW55IGV4cHJlc3Npb24gcmV0dXJuZWQgdXNpbmcgInJldHVybiIgTVVTVCBiZSB0aGUKK3NhbWUgYXMgdGhlIGRhdGEgdHlwZSBvZiB0aGUgZnVuY3Rpb24gaXRzZWxmLgorCis0LjUgQ2hhcHRlciBTdW1tYXJ5CitUaGUgZmlsZXMgd2hpY2ggZGVmaW5lIExQQyBvYmplY3RzIGFyZSBtYWRlIG9mIG9mIGZ1bmN0aW9ucy4gIEZ1bmN0aW9ucywgaW4KK3R1cm4sIGFyZSBtYWRlIHVwIG9mIHRocmVlIHBhcnRzOgorICAgIDEpIFRoZSBkZWNsYXJhdGlvbgorICAgIDIpIFRoZSBkZWZpbml0aW9uCisgICAgMykgVGhlIGNhbGwKK0Z1bmN0aW9uIGRlY2xhcmF0aW9ucyBnZW5lcmFsbHkgYXBwZWFyIGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUgYmVmb3JlIGFueQorZGVmaW50aW9ucywgYWx0aG91Z2ggdGhlIHJlcXVpcmVtZW50IGlzIHRoYXQgdGhlIGRlY2xhcmF0aW9uIG11c3QgYXBwZWFyCitiZWZvcmUgdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24gYW5kIGJlZm9yZSB0aGUgZGVmaW5pdGlvbiBvZiBhbnkgZnVuY3Rpb24KK3doaWNoIGNhbGxzIGl0LgorRnVuY3Rpb24gZGVmaW5pdGlvbnMgbWF5IGFwcGVhciBpbiB0aGUgZmlsZSBpbiBhbnkgb3JkZXIgc28gbG9uZyBhcyB0aGV5Citjb21lIGFmdGVyIHRoZWlyIGRlY2xhcmF0aW9uLiAgSW4gYWRkaXRpb24sIHlvdSBtYXkgbm90IGRlZmluZSBvbmUgZnVuY3Rpb24KK2luc2lkZSBhbm90aGVyIGZ1bmN0aW9uLgorRnVuY3Rpb24gY2FsbHMgYXBwZWFyIGluc2lkZSB0aGUgZGVmaW5pdGlvbiBvZiBvdGhlciBmdW5jdGlvbnMgd2hlcmUgeW91Cit3YW50IHRoZSBjb2RlIHRvIGJlZ2luIGV4ZWN1dGlvbiBvZiB5b3VyIGZ1bmN0aW9uLiAgVGhleSBtYXkgYWxzbyBhcHBlYXIKK3dpdGhpbiB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgZnVuY3Rpb24gaXRzZWxmLCBidXQgdGhpcyBpcyBub3QgcmVjb21tZW5kZWQKK2ZvciBuZXcgY29kZXJzLCBhcyBpdCBjYW4gZWFzaWx5IGxlYWQgdG8gaW5maW5pdGUgbG9vcHMuCisKK1RoZSBmdW5jdGlvbiBkZWZpbml0aW9uIGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgaW4gdGhpcyBvcmRlcjoKKyAgICAxKSBmdW5jdGlvbiByZXR1cm4gdHlwZQorICAgIDIpIGZ1bmN0aW9uIG5hbWUKKyAgICAzKSBvcGVuaW5nICggZm9sbG93ZWQgYnkgYSBwYXJhbWV0ZXIgbGlzdCBhbmQgYSBjbG9zaW5nICkKKyAgICA0KSBhbiBvcGVuaW5nIHsgaW5zdHJ1Y3RpbmcgdGhlIGRyaXZlciB0aGF0IGV4ZWN1dGlvbiBiZWdpbnMgaGVyZQorICAgIDUpIGRlY2xhcmF0aW9ucyBvZiBhbnkgdmFyaWFibGVzIHRvIGJlIHVzZWQgb25seSBpbiB0aGF0IGZ1bmN0aW9uCisgICAgNikgaW5zdHJ1Y3Rpb25zLCBleHByZXNzaW9ucywgYW5kIGNhbGxzIHRvIG90aGVyIGZ1bmN0aW9ucyBhcyBuZWVkZWQKKyAgICA3KSBhIGNsb3NpbmcgfSBzdGF0aW5nIHRoYXQgdGhlIGZ1bmN0aW9uIGNvZGUgZW5kcyBoZXJlIGFuZCwgaWYgbm8KKyAgICAgICAicmV0dXJuIiBpbnN0cnVjdGlvbiBoYXMgYmVlbiBnaXZlbiBhdCB0aGlzIHBvaW50ICh0eXBlIHZvaWQgZnVuY3Rpb25zCisgICAgICAgb25seSksIGV4ZWN1dGlvbiByZXR1cm5zIHRvIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGFzIGlmIGEgciJyZXR1cm4iCisgICAgICAgaW5zdHJ1Y3Rpb24gd2FzIGdpdmVuCisKK1RoZSB0cml2aWFsIGZ1bmN0aW9uIHdvdWxkIHRodXMgYmU6CisKKy0tLS0tCit2b2lkIGRvX25vdGhpbmcoKSB7fQorLS0tLS0KKworc2luY2UgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBhY2NlcHQgYW55IGlucHV0LCBwZXJmb3JtIGFueSBpbnN0cnVjdGlvbnMsIG9yCityZXR1cm4gYW55IG91dHB1dC4KKworQW55IGZ1bmN0aW9uIHdoaWNoIGlzIG5vdCBvZiB0eXBlIHZvaWQgTVVTVCByZXR1cm4gYSB2YWx1ZSBvZiBhIGRhdGEgdHlwZQorbWF0Y2hpbmcgdGhlIGZ1bmN0aW9uJ3MgZGF0YSB0eXBlLgorCitFYWNoIGRyaXZlciBoYXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFscmVhZHkgZGVmaW5lZCBmb3IgeW91IGNhbGxlZCBlZnVucworVGhlc2UgeW91IG5lZWQgbmVpdGhlciBuZWVkIHRvIGRlY2xhcmUgbm9yIGRlZmluZSBzaW5jZSBpdCBoYXMgYWxyZWFkeQorYmVlbiBkb25lIGZvciB5b3UuICBGdXJ0aGVybW9yZSwgZXhlY3V0aW9uIG9mIHRoZXNlIGZ1bmN0aW9ucyBpcyBmYXN0ZXIKK3RoYW4gdGhlIGV4ZWN1dGlvbiBvZiB5b3VyIGZ1bmN0aW9ucyBzaW5jZSBlZnVucyBhcmUgaW4gdGhlIGRyaXZlci4KK0luIGFkZGl0aW9uLCBlYWNoIG11ZGxpYiBoYXMgc3BlY2lhbCBmdW5jdGlvbnMgbGlrZSBlZnVucyBpbiB0aGF0IHRoZXkKK2FyZSBhbHJlYWR5IGRlZmluZWQgYW5kIGRlY2xhcmVkIGZvciB5b3UsIGJ1dCBkaWZmZXJlbnQgaW4gdGhhdCB0aGV5CithcmUgZGVmaW5lZCBpbiB0aGUgbXVkbGliIGFuZCBpbiBMUEMuICBUaGV5IGFyZSBjYWxsZWQgc2ltdWxfZWZ1bnMsIG9yCitzaW11bGF0ZWQgZWZ1bnMuICBZb3UgY2FuIGZpbmQgb3V0IGFsbCBhYm91dCBlYWNoIG9mIHRoZXNlIGFzIHRoZXkgYXJlCitsaXN0ZWQgaW4gdGhlIC9kb2MvZWZ1biBkaXJlY3Rvcnkgb24gbW9zdCBtdWRzLiAgSW4gYWRkaXRpb24gbWFueQorbXVkcyBoYXZlIGEgY29tbWFuZCBjYWxsZWQgIm1hbiIgb3IgYSAiaGVscCIgY29tbWFuZCB3aGljaCBhbGxvd3MgeW91CitzaW1wbHkgdG8gY2FsbCB1cCB0aGUgaW5mbyBmaWxlcyBvbiB0aGVtLgorCitOb3RlIG9uIHN0eWxlOgorU29tZSBkcml2ZXJzIG1heSBub3QgcmVxdWlyZSB5b3UgdG8gZGVjbGFyZSB5b3VyIGZ1bmN0aW9ucywgYW5kIHNvbWUKK21heSBub3QgcmVxdWlyZSB5b3UgdG8gc3BlY2lmeSB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIGZ1bmN0aW9uIGluIGl0cworZGVmaW5pdGlvbi4gIFJlZ2FyZGxlc3Mgb2YgdGhpcyBmYWN0LCB5b3Ugc2hvdWxkIG5ldmVyIG9taXQgdGhpcyBpbmZvcm1hdGlvbgorZm9yIHRoZSBmb2xsb3dpbmcgcmVhc29uczoKKyAgICAxKSBJdCBpcyBlYXNpZXIgZm9yIG90aGVyIHBlb3BsZSAoYW5kIHlvdSBhdCBsYXRlciBkYXRlcykgdG8gcmVhZCB5b3VyCisgICAgICAgY29kZSBhbmQgdW5kZXJzdGFuZCB3aGF0IGlzIG1lYW50LiAgVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsCisgICAgICAgZm9yIGRlYnVnZ2luZywgd2hlcmUgYSBsYXJnZSBwb3J0aW9uIG9mIGVycm9ycyAob3V0c2lkZSBvZiBtaXNwbGFjZWQKKyAgICAgICBwYXJlbnRoZXNlcyBhbmQgYnJhY2tldHMpIGludm9sdmUgcHJvYmxlbXMgd2l0aCBkYXRhIHR5cGVzIChFdmVyCisgICAgICAgZ290dGVuICJCYWQgYXJnIDEgdG8gZm9vKCkgbGluZSAzMiI/KS4KKyAgICAyKSBJdCBpcyBzaW1wbHkgY29uc2lkZXJlZCBnb29kIGNvZGluZyBmb3JtLgpkaWZmIC0tZ2l0IGEvZG9jL0tVUlMvTFBDLUtVUlMvY2hhcHRlcjUgYi9kb2MvS1VSUy9MUEMtS1VSUy9jaGFwdGVyNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWQyYTBjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL0tVUlMvTFBDLUtVUlMvY2hhcHRlcjUKQEAgLTAsMCArMSwxNjEgQEAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQyBCYXNpY3MKKyAgICAgICAgICAgICAgICAgIFdyaXR0ZW4gYnkgRGVzY2FydGVzIG9mIEJvcmcKKyAgICAgICAgICAgICAgICAgIGZpcnN0IGVkaXRpb246IDIzIGFwcmlsIDE5OTMKKyAgICAgICAgICAgICAgICAgIHNlY29uZCBlZGl0aW9uOiAwMSBqdWx5IDE5OTMKKworQ0hBUFRFUiA1OiBUaGUgQmFzaWNzIG9mIEluaGVyaXRhbmNlCisKKzUuMSBSZXZpZXcKK1lvdSBzaG91bGQgbm93IHVuZGVyc3RhbmQgdGhlIGJhc2ljIHdvcmtpbmdzIG9mIGZ1bmN0aW9ucy4gIFlvdSBzaG91bGQgYmUKK2FibGUgdG8gZGVjbGFyZSBhbmQgY2FsbCBvbmUuICBJbiBhZGRpdGlvbiwgeW91IHNob3VsZCBiZSBhYmxlIHRvIHJlY29nbml6ZQorZnVuY3Rpb24gZGVmaW5pdGlvbnMsIGFsdGhvdWdoLCBpZiB0aGlzIGlzIHlvdXIgZmlyc3QgZXhwZXJpZW5jZSB3aXRoIExQQywKK2l0IGlzIHVubGlrZWx5IHRoYXQgeW91IHdpbGwgYXMgeWV0IGJlIGFibGUgdG8gZGVmaW5lIHlvdXIgb3duIGZ1bmN0aW9ucy4KK1RoZXJlIGZ1bmN0aW9ucyBmb3JtIHRoZSBiYXNpYyBidWlsZGluZyBibG9ja3Mgb2YgTFBDIG9iamVjdHMuICBDb2RlCitpbiB0aGVtIGlzIGV4ZWN1dGVkIHdoZW4gYW5vdGhlciBmdW5jdGlvbiBtYWtlcyBhIGNhbGwgdG8gdGhlbS4gIEluIG1ha2luZworYSBjYWxsLCBpbnB1dCBpcyBwYXNzZWQgZnJvbSB0aGUgY2FsbGluZyBmdW5jdGlvbiBpbnRvIHRoZSBleGVjdXRpb24gb2YKK3RoZSBjYWxsZWQgb25lLiAgVGhlIGNhbGxlZCBmdW5jdGlvbiB0aGVuIGV4ZWN1dGVzIGFuZCByZXR1cm5zIGEgdmFsdWUKK29mIGEgY2VydGFpbiBkYXRhIHR5cGUgdG8gdGhlIGNhbGxpbmcgZnVuY3Rpb24uICBGdW5jdGlvbnMgd2hpY2ggcmV0dXJuCitubyB2YWx1ZSBhcmUgb2YgdHlwZSB2b2lkLgorCitBZnRlciBleGFtaW5pbmcgeW91ciB3b3Jrcm9vbSBjb2RlLCBpdCBtaWdodCBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXMKKyhkZXBlbmRpbmcgb24gdGhlIG11ZGxpYik6CisKKy0tLS0tCitpbmhlcml0ICIvc3RkL3Jvb20iOworCit2b2lkIGNyZWF0ZSgpIHsKKyAgICA6OmNyZWF0ZSgpOworICAgIHNldF9wcm9wZXJ0eSgibGlnaHQiLCAyKTsKKyAgICBzZXRfcHJvcGVydHkoImluZG9vcnMiLCAxKTsKKyAgICBzZXQoInNob3J0IiwgIkRlc2NhcnRlcycgV29ya3Jvb20iKTsKKyAgICBzZXQoImxvbmciLCAiVGhpcyBpcyB3aGVyZSBEZXNjYXJ0ZXMgd29ya3MuXG5JdCBpcyBhIGN1YmUuXG4iKTsKKyAgICBzZXRfZXhpdHMoICh7ICIvZC9zdGFuZGFyZC9zcXVhcmUiIH0pLCAoeyAic3F1YXJlIiB9KSApOworfQorLS0tLS0KKworSWYgeW91IHVuZGVyc3RhbmQgdGhlIGVudGlyZSB0ZXh0Ym9vayB0byB0aGlzIHBvaW50LCB5b3Ugc2hvdWxkIHJlY29nbml6ZQorb2YgdGhlIGNvZGUgdGhlIGZvbGxvd2luZzoKKyAgICAxKSBjcmVhdGUoKSBpcyB0aGUgZGVmaW5pdGlvbiBvZiBhIGZ1bmN0aW9uIChoZXkhIGhlIGRpZCBub3QgZGVjbGFyZSBpdCkKKyAgICAyKSBJdCBtYWtlcyBjYWxscyB0byBzZXRfcHJvcGVydHkoKSwgc2V0KCksIGFuZCBzZXRfZXhpdHMoKSwgbm9uZQorICAgICAgIG9mIHdoaWNoIGFyZSBkZWNsYXJlZCBvciBkZWZpbmVkIGluIHRoZSBjb2RlLgorICAgIDMpIFRoZXJlIGlzIGEgbGluZSBhdCB0aGUgdG9wIHRoYXQgaXMgbm8gdmFyaWFibGUgb3IgZnVuY3Rpb24gZGVjbGFyYXRpb24KKyAgICAgICBub3IgaXMgaXQgYSBmdW5jdGlvbiBkZWZpbml0aW9uIQorCitUaGlzIGNoYXB0ZXIgd2lsbCBzZWVrIHRvIGFuc3dlciB0aGUgcXVlc3Rpb25zIHRoYXQgc2hvdWxkIGJlIGluIHlvdXIgaGVhZAorYXQgdGhpcyBwb2ludDoKKyAgICAxKSBXaHkgaXMgdGhlcmUgbm8gZGVjbGFyYXRpb24gb2YgY3JlYXRlKCk/CisgICAgMikgV2hlcmUgYXJlIHRoZSBmdW5jdGlvbnMgc2V0X3Byb3BlcnR5KCksIHNldCgpLCBhbmQgc2V0X2V4aXRzKCkgZGVjbGFyZWQKKyAgICAgICBhbmQgZGVmaW5lZD8KKyAgICAzKSBXaGF0IHRoZSBoZWxsIGlzIHRoYXQgbGluZSBhdCB0aGUgdG9wIG9mIHRoZSBmaWxlPworCis1LjIgT2JqZWN0IG9yaWVudGVkIHByb2dyYW1taW5nCitJbmhlcml0YW5jZSBpcyBvbmUgb2YgdGhlIHByb3BlcnRpZXMgd2hpY2ggZGVmaW5lIHRydWUgb2JqZWN0IG9yaWVudGVkCitwcm9ncmFtbWluZyAoT09QKS4gIEl0IGFsbG93cyB5b3UgdG8gY3JlYXRlIGdlbmVyaWMgY29kZSB3aGljaCBjYW4gYmUgdXNlZAoraW4gbWFueSBkaWZmZXJlbnQgd2F5cyBieSBtYW55IGRpZmZlcmVudCBwcm9ncmFtcy4gIFdoYXQgYSBtdWRsaWIgZG9lcyBpcworY3JlYXRlIHRoZXNlIGdlbmVyYWxpemVkIGZpbGVzIChvYmplY3RzKSB3aGljaCB5b3UgdXNlIHRvIG1ha2UgdmVyeSBzcGVjaWZpYworb2JqZWN0cy4KKworSWYgeW91IGhhZCB0byB3cml0ZSB0aGUgY29kZSBuZWNlc3NhcnkgZm9yIHlvdSB0byBkZWZpbmUgdGhlIHdvcmtyb29tIGFib3ZlLAoreW91IHdvdWxkIGhhdmUgdG8gd3JpdGUgYWJvdXQgMTAwMCBsaW5lcyBvZiBjb2RlIHRvIGdldCBhbGwgdGhlIGZ1bmN0aW9uYWxpdHkKK29mIHRoZSByb29tIGFib3ZlLiAgQ2xlYXJseSB0aGF0IGlzIGEgd2FzdGUgb2YgZGlzayBzcGFjZS4gIEluIGFkZGl0aW9uLAorc3VjaCBjb2RlIGRvZXMgbm90IGludGVyYWN0IHdlbGwgd2l0aCBwbGF5ZXJzIGFuZCBvdGhlciByb29tcyBzaW5jZSBldmVyeQorY3JlYXRvciBpcyBtYWtpbmcgdXAgaGlzIG9yIGhlciBvd24gZnVuY3Rpb25zIHRvIHBlcmZvcm0gdGhlIGZ1bmN0aW9uYWxpdHkKK29mIGEgcm9vbS4gIFRodXMsIHdoYXQgeW91IG1pZ2h0IHVzZSB0byB3cml0ZSBvdXQgdGhlIHJvb20ncyBsb25nIGRlc2NyaXB0aW9uLAorcXVlcnlfbG9uZygpLCBhbm90aGVyIHdpemFyZCBtaWdodCBiZSBjYWxsaW5nIGxvbmcoKS4gIFRoaXMgaXMgdGhlIHByaW1hcnkKK3JlYXNvbiBtdWRsaWJzIGFyZSBub3QgY29tcGF0aWJsZSwgc2luY2UgdGhleSB1c2UgZGlmZmVyZW50IHByb3RvY29scyBmb3IKK29iamVjdCBpbnRlcmFjdGlvbi4KKworT09QIG92ZXJjb21lcyB0aGVzZSBwcm9ibGVtcy4gIEluIHRoZSBhYm92ZSB3b3Jrcm9vbSwgeW91IGluaGVyaXQgdGhlCitmdW5jdGlvbnMgYWxyZWFkeSBkZWZpbmVkIGluIGEgZmlsZSBjYWxsZWQgIi9zdGQvcm9vbS5jIi4gIEl0IGhhcyBhbGwKK3RoZSBmdW5jdGlvbnMgd2hpY2ggYXJlIGNvbW1vbmx5IG5lZWRlZCBieSBhbGwgcm9vbXMgZGVmaW5lZCBpbiBpdC4gIFdoZW4KK3lvdSBnZXQgdG8gbWFrZSBhIHNwZWNpZmljIHJvb20sIHlvdSBhcmUgdGFraW5nIHRoZSBnZW5lcmFsIGZ1bmN0aW9uYWxpdHkKK29mIHRoYXQgcm9vbSBmaWxlIGFuZCBtYWtpbmcgYSB1bmlxdWUgcm9vbSBieSBhZGRpbmcgeW91ciBvd24gZnVuY3Rpb24sCitjcmVhdGUoKS4KKworNS4zIEhvdyBpbmhlcml0YW5jZSB3b3JrcworQXMgeW91IG1pZ2h0IGhhdmUgZ3Vlc3NlZCBieSBub3csIHRoZSBsaW5lOgorCistLS0tLQoraW5oZXJpdCAiL3N0ZC9yb29tIjsKKy0tLS0tCisKK2hhcyB5b3UgaW5oZXJpdCB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgcm9vbSAiL3N0ZC9yb29tLmMiLiAgQnkgaW5oZXJpdGluZwordGhlIGZ1bmN0aW9uYWxpdHksIGl0IG1lYW5zIHRoYXQgeW91IGNhbiB1c2UgdGhlIGZ1bmN0aW9ucyB3aGljaCBoYXZlCitiZWVuIGRlY2xhcmVkIGFuZCBkZWZpbmVkIGluIHRoZSBmaWxlICIvc3RkL3Jvb20uYyIgIEluIHRoZSBOaWdodG1hcmUgTXVkbGliLAorIi9zdGQvcm9vbS5jIiBoYXMsIGFtb25nIG90aGVyIGZ1bmN0aW9ucywgc2V0X3Byb3BlcnR5KCksIHNldCgpLCBhbmQKK3NldF9leGl0cygpIGRlY2xhcmVkIGFuZCBkZWZpbmVkLiAgSW4geW91ciBmdW5jdGlvbiBjcmVhdGUoKSwgeW91IGFyZQorbWFraW5nIGNhbGxzIHRvIHRob3NlIGZ1bmN0aW9ucyBpbiBvcmRlciB0byBzZXQgdmFsdWVzIHlvdSB3YW50IHlvdXIKK3Jvb20gdG8gc3RhcnQgd2l0aC4gIFRoZXNlIHZhbHVlcyBtYWtlIHlvdXIgcm9vbSBkaWZmZXJlbnQgZnJvbSBvdGhlcnMsIHlldAorYWJsZSB0byBpbnRlcmFjdCB3ZWxsIHdpdGggb3RoZXIgb2JqZWN0cyBpbiBtZW1vcnkuCisKK0luIGFjdHVhbCBwcmFjdGljZSwgZWFjaCBtdWRsaWIgaXMgZGlmZmVyZW50LCBhbmQgdGh1cyByZXF1aXJlcyB5b3UgdG8gdXNlCithIGRpZmZlcmVudCBzZXQgb2Ygc3RhbmRhcmQgZnVuY3Rpb25zLCBvZnRlbiB0byBkbyB0aGUgc2FtZSB0aGluZy4gIEl0IGlzCit0aGVyZWZvcmUgYmV5b25kIHRoZSBzY29wZSBvZiB0aGlzIHRleHRib29rIGV2ZW4gdG8gZGVzY3JpYmUgd2hhdAorZnVuY3Rpb25zIGV4aXN0IGFuZCB3aGF0IHRoZXkgZG8uICBJZiB5b3VyIG11ZGxpYiBpcyB3ZWxsIGRvY3VtZW50ZWQsCitob3dldmVyLCB0aGVuIChwcm9iYWJseSBpbiAvZG9jL2J1aWxkKSB5b3Ugd2lsbCBoYXZlIHR1dG9yaWFscyBvbiBob3cKK3RvIHVzZSB0aGUgaW5oZXJpdGFibGUgZmlsZXMgdG8gY3JlYXRlIHN1Y2ggb2JqZWN0cy4gIFRoZXNlIHR1dG9yaWFscworc2hvdWxkIHRlbGwgeW91IHdoYXQgZnVuY3Rpb25zIGV4aXN0LCB3aGF0IGlucHV0IHRoZXkgdGFrZSwgdGhlIGRhdGEKK3R5cGUgb2YgdGhlaXIgb3V0cHV0LCBhbmQgd2hhdCB0aGV5IGRvLgorCis1LjQgQ2hhcHRlciBzdW1tYXJ5CitUaGlzIGlzIGZhciBmcm9tIGEgY29tcGxldGUgZXhwbGFuYXRpb24gb2YgdGhlIGNvbXBsZXggc3ViamVjdCBvZiBpbmhlcml0YW5jZS4KK1RoZSBpZGVhIGhlcmUgaXMgZm9yIHlvdSB0byBiZSBhYmxlIHRvIHVuZGVyc3RhbmQgaG93IHRvIHVzZSBpbmhlcml0YW5jZSBpbgorY3JlYXRpbmcgeW91ciBvYmplY3RzLiAgQSBmdWxsIGRpc2N1c3Npb24gd2lsbCBmb2xsb3cgaW4gYSBsYXRlciB0ZXh0Ym9vay4KK1JpZ2h0IG5vdyB5b3Ugc2hvdWxkIGtub3cgdGhlIGZvbGxvd2luZzoKKyAgICAxKSBFYWNoIG11ZGxpYiBoYXMgYSBsaWJyYXJ5IG9mIGdlbmVyaWMgb2JqZWN0cyB3aXRoIHRoZWlyIG93biBnZW5lcmFsCisgICAgICAgZnVuY3Rpb25zIHVzZWQgYnkgY3JlYXRvcnMgdGhyb3VnaCBpbmhlcml0YW5jZSB0byBtYWtlIGNvZGluZyBvYmplY3RzCisgICAgICAgZWFzaWVyIGFuZCB0byBtYWtlIGludGVyYWN0aW9uIGJldHdlZW4gb2JqZWN0cyBzbW9vdGhlci4KKyAgICAyKSBUaGUgZnVuY3Rpb25zIGluIHRoZSBpbmhlcml0YWJsZSBmaWxlcyBvZiBhIG11ZGxpYiB2YXJ5IGZyb20gbXVkbGliCisgICAgICAgdG8gbXVkbGliLiAgVGhlcmUgc2hvdWxkIGV4aXN0IGRvY3VtZW50YXRpb24gb24geW91ciBtdWQgb24gaG93IHRvCisgICAgICAgdXNlIGVhY2ggaW5oZXJpdGFibGUgZmlsZS4gIElmIHlvdSBhcmUgdW5hd2FyZSB3aGF0IGZ1bmN0aW9ucyBhcmUKKyAgICAgICBhdmFpbGFibGUsIHRoZW4gdGhlcmUgaXMgc2ltcGx5IG5vIHdheSBmb3IgeW91IHRvIHVzZSB0aGVtLiAgQWx3YXlzCisgICAgICAgcGF5IHNwZWNpYWwgYXR0ZW50aW9uIHRvIHRoZSBkYXRhIHR5cGVzIG9mIHRoZSBpbnB1dCBhbmQgdGhlIGRhdGEKKyAgICAgICB0eXBlcyBvZiBheSBvdXRwdXQuCisgICAgMykgWW91IGluaGVyaXQgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW5vdGhlciBvYmplY3QgdGhyb3VnaCB0aGUgbGluZToKKworLS0tLS0KK2luaGVyaXQgImZpbGVuYW1lIjsKKy0tLS0tCisgICAgICAgCisgICAgICAgd2hlcmUgZmlsZW5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgb2YgdGhlIG9iamVjdCB0byBiZSBpbmhlcml0ZWQuCisgICAgICAgVGhpcyBsaW5lIGdvZXMgYXQgdGhlIGJlZ2lubmluZyBvZiB5b3VyIGNvZGUuCisKK05vdGU6CitZb3UgbWF5IHNlZSB0aGUgc3ludGF4IDo6Y3JlYXRlKCkgb3IgOjppbml0KCkgb3IgOjpyZXNldCgpIGluIHBsYWNlcy4KK1lvdSBkbyBub3QgbmVlZCBmdWxseSB0byB1bmRlcnN0YW5kIGF0IHRoaXMgcG9pbnQgdGhlIGZ1bGwgbnVhbmNlcyBvZiB0aGlzLAorYnV0IHlvdSBzaG91bGQgaGF2ZSBhIGNsdWUgYXMgdG8gd2hhdCBpdCBpcy4gVGhlICI6OiIgb3BlcmF0b3IgaXMgYSB3YXkKK3RvIGNhbGwgYSBmdW5jdGlvbiBzcGVjaWZpY2FsbHkgaW4gYW4gaW5oZXJpdGVkIG9iamVjdCAoY2FsbGVkIHRoZSBzY29wZQorcmVzb2x1dGlvbiBvcGVyYXRvcikuICBGb3IgaW5zdGFuY2UsIG1vc3QgbXVkcycgcm9vbS5jIGhhcyBhIGZ1bmN0aW9uCitjYWxsZWQgY3JlYXRlKCkuICBXaGVuIHlvdSBpbmhlcml0IHJvb20uYyBhbmQgY29uZmlndXJlIGl0LCB5b3UgYXJlIGRvaW5nCit3aGF0IGlzIGNhbGxlZCBvdmVycmlkaW5nIHRoZSBjcmVhdGUoKSBmdW5jdGlvbiBpbiByb29tLmMuICBUaGlzIG1lYW5zCit0aGF0IHdoZW5ldmVyIEFOWVRISU5HIGNhbGxzIGNyZWF0ZSgpLCBpdCB3aWxsIGNhbGwgKnlvdXIqIHZlcnNpb24gYW5kIG5vdAordGhlIG9uZSBpbiByb29tLmMuICBIb3dldmVyLCB0aGVyZSBtYXkgYmUgaW1wb3J0YW50IHN0dWZmIGluIHRoZSByb29tLmMKK3ZlcnNpb24gb2YgY3JlYXRlKCkuICBUaGUgOjogb3BlcmF0b3IgYWxsb3dzIHlvdSB0byBjYWxsIHRoZSBjcmVhdGUoKSBpbgorcm9vbS5jIGluc3RlYWQgb2YgeW91ciBjcmVhdGUoKS4KK0FuIGV4YW1wbGU6CisKKy0tLS0tCisjMQorCitpbmhlcml0ICIvc3RkL3Jvb20iOworCit2b2lkIGNyZWF0ZSgpIHsgY3JlYXRlKCk7IH0KKy0tLS0tCisKKy0tLS0tCisjMgorCitpbmhlcml0ICIvc3RkL3Jvb20iOworCit2b2lkIGNyZWF0ZSgpIHsgOjpjcmVhdGUoKTsgfQorLS0tLS0KKworRXhhbXBsZSAxIGlzIGEgaG9ycm9yLiAgV2hlbiBsb2FkZWQsIHRoZSBkcml2ZXIgY2FsbHMgY3JlYXRlKCksIGFuZCB0aGVuCitjcmVhdGUoKSBjYWxscyBjcmVhdGUoKSwgd2hpY2ggY2FsbHMgY3JlYXRlKCksIHdoaWNoIGNhbGxzIGNyZWF0ZSgpLi4uCitJbiBvdGhlciB3b3JkcywgYWxsIGNyZWF0ZSgpIGRvZXMgaXMga2VlcCBjYWxsaW5nIGl0c2VsZiB1bnRpbCB0aGUgZHJpdmVyCitkZXRlY3RzIGEgdG9vIGRlZXAgcmVjdXJzaW9uIGFuZCBleGl0cy4KKworRXhhbXBsZSAyIGlzIGJhc2ljYWxseSBqdXN0IGEgd2FzdGUgb2YgUkFNLCBhcyBpdCBpcyBubyBkaWZmZXJlbnQgZnJvbSByb29tLmMKK2Z1bmN0aW9uYWxseS4gIFdpdGggaXQsIHRoZSBkcml2ZXIgY2FsbHMgaXRzIGNyZWF0ZSgpLCB3aGljaCBpbiB0dXJuIGNhbGxzCis6OmNyZWF0ZSgpLCB0aGUgY3JlYXRlKCkgaW4gcm9vbS5jLiAgT3RoZXJ3aXNlIGl0IGlzIGZ1bmN0aW9uYWxseQorZXhhY3RseSB0aGUgc2FtZSBhcyByb29tLmMuCmRpZmYgLS1naXQgYS9kb2MvS1VSUy9MUEMtS1VSUy9jaGFwdGVyNiBiL2RvYy9LVVJTL0xQQy1LVVJTL2NoYXB0ZXI2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNjQyMTUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvS1VSUy9MUEMtS1VSUy9jaGFwdGVyNgpAQCAtMCwwICsxLDMzMyBAQAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDIEJhc2ljcworICAgICAgICAgICAgICAgICAgV3JpdHRlbiBieSBEZXNjYXJ0ZXMgb2YgQm9yZworICAgICAgICAgICAgICAgICAgZmlyc3QgZWRpdGlvbjogMjMgYXByaWwgMTk5MworICAgICAgICAgICAgICAgICAgc2Vjb25kIGVkaXRpb246IGp1bHkgNSAxOTkzCisKK0NIQVBURVIgNjogVmFyaWFibGUgSGFuZGxpbmcKKworNi4xIFJldmlldworQnkgbm93IHlvdSBzaG91bGQgYmUgYWJsZSB0byBjb2RlIHNvbWUgc2ltcGxlIG9iamVjdHMgdXNpbmcgeW91ciBtdWRzIHN0YW5kYXJkCitvYmplY3QgbGlicmFyeS4gIEluaGVyaXRhbmNlIGFsbG93cyB5b3UgdG8gdXNlIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRob3NlCitvYmplY3RzIHdpdGhvdXQgaGF2aW5nIHRvIGdvIGFuZCBkZWZpbmUgeW91cnNlbGYuICBJbiBhZGRpdGlvbiwKK3lvdSBzaG91bGQga25vdyBob3cgdG8gZGVjbGFyZSB5b3VyIG93biBmdW5jdGlvbnMuICBUaGlzCitjaGFwdGVyIHdpbGwgdGVhY2ggeW91IGFib3V0IHRoZSBiYXNpYyBlbGVtZW50cyBvZiBMUEMgd2hpY2ggd2lsbCBhbGxvdyB5b3UgdG8KK2RlZmluZSB5b3VyIG93biBmdW5jdGlvbnMgdXNpbmcgdGhlIG1hbmlwdWxhdGlvbiBvZiB2YXJpYWJsZXMuCisKKzYuMiBWYWx1ZXMgYW5kIG9iamVjdHMKK0Jhc2ljYWxseSwgd2hhdCBtYWtlcyBvYmplY3RzIG9uIHRoZSBtdWQgZGlmZmVyZW50IGFyZSB0d28gdGhpbmdzOgorMSkgU29tZSBoYXZlIGRpZmZlcmVudCBmdW5jdGlvbnMKKzIpIEFsbCBoYXZlIGRpZmZlcmVudCB2YWx1ZXMKKworTm93LCBhbGwgcGxheWVyIG9iamVjdHMgaGF2ZSB0aGUgc2FtZSBmdW5jdGlvbnMuICBUaGV5IGFyZSB0aGVyZWZvcmUKK2RpZmZlcmVudGlhdGVkIGJ5IHRoZSB2YWx1ZXMgdGhleSBob2xkLiAgRm9yIGluc3RhbmNlLCB0aGUgcGxheWVyCituYW1lZCAiRm9ybG9jayIgaXMgZGlmZmVyZW50IGZyb20gIkRlc2NhcnRlcyIgKmF0IGxlYXN0KiBpbiB0aGF0IHRoZXkKK2hhdmUgZGlmZmVyZW50IHZhbHVlcyBmb3IgdGhlIHZhcmlhYmxlIHRydWVfbmFtZSwgdGhvc2UgYmVpbmcKKyJkZXNjYXJ0ZXMiIGFuZCAiZm9ybG9jayIuCisKK1RoZXJlZm9yZSwgY2hhbmdlcyBpbiB0aGUgZ2FtZSBpbnZvbHZlIGNoYW5nZXMgaW4gdGhlIHZhbHVlcyBvZiB0aGUgb2JqZWN0cworaW4gdGhlIGdhbWUuICBGdW5jdGlvbnMgYXJlIHVzZWQgdG8gbmFtZSBzcGVjaWZpYyBwcm9jZXNzIGZvciBtYW5pcHVsYXRpbmcKK3ZhbHVlcy4gIEZvciBpbnN0YW5jZSwgdGhlIGNyZWF0ZSgpIGZ1bmN0aW9uIGlzIHRoZSBmdW5jdGlvbiB3aG9zZQorcHJvY2VzcyBpcyBzcGVjaWZpY2FsbHkgdG8gaW5pdGlhbGl6ZSB0aGUgdmFsdWVzIG9mIGFuIG9iamVjdC4KK1dpdGhpbiBhIGZ1bmN0aW9uLCBpdCBpcyBzcGVjaWZpY2FsbHkgdGhpbmdzIGNhbGxlZCBpbnN0cnVjdGlvbnMgd2hpY2ggYXJlCityZXNwb25zaWJsZSBmb3IgdGhlIGRpcmVjdCBtYW5pcHVsYXRpb24gb2YgdmFyaWFibGVzLgorCis2LjMgTG9jYWwgYW5kIGdsb2JhbCB2YXJpYWJsZXMKK0xpa2UgdmFyaWFibGVzIGluIG1vc3QgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UsIExQQyB2YXJpYWJsZXMgbWF5IGJlIGRlY2xhcmVkCithcyB2YXJpYWJsZXMgImxvY2FsIiB0byBhIHNwZWNpZmljIGZ1bmN0aW9uLCBvciAiZ2xvYmFsbHkiIGF2YWlsYWJsZQordG8gYWxsIGZ1bmN0aW9ucy4gIExvY2FsIHZhcmlhYmxlcyBhcmUgZGVjbGFyZWQgaW5zaWRlIHRoZSBmdW5jdGlvbiB3aGljaAord2lsbCB1c2UgdGhlbS4gIE5vIG90aGVyIGZ1bmN0aW9uIGtub3dzIGFib3V0IHRoZWlyIGV4aXN0ZW5jZSwgc2luY2UKK3RoZSB2YWx1ZXMgYXJlIG9ubHkgc3RvcmVkIGluIG1lbW9yeSB3aGlsZSB0aGF0IGZ1bmN0aW9uIGlzIGJlaW5nIGV4ZWN1dGVkLgorQSBnbG9iYWwgdmFyaWFibGUgaXMgYXZhaWxhYmxlIHRvIGFueSBmdW5jdGlvbiB3aGljaCBjb21lcyBhZnRlciBpdHMKK2RlY2xhcmF0aW9uIGluIHRoZSBvYmplY3QgY29kZS4gIFNpbmNlIGdsb2JhbCB2YXJpYWJsZXMgdGFrZSB1cCBSQU0gZm9yCit0aGUgZW50aXJlIGV4aXN0ZW5jZSBvZiB0aGUgb2JqZWN0LCB5b3Ugc2hvdWxkIHVzZSB0aGVtIG9ubHkgd2hlbgoreW91IG5lZWQgYSB2YWx1ZSBzdG9yZWQgZm9yIHRoZSBlbnRpcmUgZXhpc3RlbmNlIG9mIHRoZSBvYmplY3QuCitIYXZlIGEgbG9vayBhdCB0aGUgZm9sbG93aW5nIDIgYml0cyBvZiBjb2RlOgorCistLS0tLQoraW50IHg7CisKK2ludCBxdWVyeV94KCkgeyByZXR1cm4geDsgfQorCit2b2lkIHNldF94KGludCB5KSB7IHggPSB5OyB9CistLS0tLQorCistLS0tLQordm9pZCBzZXRfeChpbnQgeSkgeworICAgIGludCB4OworCisgICAgeCA9IHk7CisgICAgd3JpdGUoInggaXMgc2V0IHRvIHgiK3grIiBhbmQgd2lsbCBub3cgYmUgZm9yZ290dGVuLlxuIik7Cit9CistLS0tLQorCitJbiB0aGUgZmlyc3QgZXhhbXBsZSwgeCBpcyBkZWNsYXJlZCBvdXRzaWRlIG9mIGFueSBmdW5jdGlvbnMsIGFuZCB0aGVyZWZvcmUKK3dpbGwgYmUgYXZhaWxhYmxlIHRvIGFueSBmdW5jdGlvbiBkZWNsYXJlZCBhZnRlciBpdC4gIEluIHRoYXQgZXhhbXBsZSwKK3ggaXMgYSBnbG9iYWwgdmFyaWFibGUuCitJbiB0aGUgc2Vjb25kIGV4YW1wbGUsIHggaXMgZGVjbGFyZWQgaW5zaWRlIHRoZSBmdW5jdGlvbiBzZXRfeCgpLiAgSXQKK29ubHkgZXhpc3RzIHdoaWxlIHRoZSBmdW5jdGlvbiBzZXRfeCgpIGlzIGJlaW5nIGV4ZWN1dGVkLiAgQWZ0ZXJ3YXJkcywKK2l0IGNlYXNlcyB0byBleGlzdC4gIEluIHRoYXQgZXhhbXBsZSwgeCBpcyBhIGxvY2FsIHZhcmlhYmxlLgorCis2LjQgTWFuaXB1bGF0aW5nIHRoZSB2YWx1ZXMgb2YgdmFyaWFibGVzCitJbnN0cnVjdGlvbnMgdG8gdGhlIGRyaXZlciBhcmUgdXNlZCB0byBtYW5pcHVsYXRlIHRoZSB2YWx1ZXMgb2YgdmFyaWFibGVzLgorQW4gZXhhbXBsZSBvZiBhbiBpbnN0cnVjdGlvbiB3b3VsZCBiZToKKworLS0tLS0KK3ggPSA1OworLS0tLS0KKworVGhlIGFib3ZlIGluc3RydWN0aW9uIGlzIHNlbGYtZXhwbGFuYXRvcnkuICBJdCBhc3NpZ25zIHRvIHRoZSB2YXJpYWJsZQoreCB0aGUgdmFsdWUgNS4gIEhvd2V2ZXIsIHRoZXJlIGFyZSBzb21lIGltcG9ydGFudCBjb25jZXB0cyBpbiBpbnZvbHZlZAoraW4gdGhhdCBpbnN0cnVjdGlvbiB3aGljaCBhcmUgaW52b2x2ZWQgaW4gaW5zdHJ1Y3Rpb25zIGluIGdlbmVyYWwuCitUaGUgZmlyc3QgaW52b2x2ZXMgdGhlIGNvbmNlcHQgb2YgYW4gZXhwcmVzc2lvbi4gIEFuIGV4cHJlc3Npb24gaXMKK2FueSBzZXJpZXMgb2Ygc3ltYm9scyB3aGljaCBoYXZlIGEgdmFsdWUuICBJbiB0aGUgYWJvdmUgaW5zdHJ1Y3Rpb24sCit0aGUgdmFyaWFibGUgeCBpcyBhc3NpZ25lZCB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gNS4gIENvbnN0YW50Cit2YWx1ZXMgYXJlIHRoZSBzaW1wbGVzdCBmb3JtcyBpbiB3aGljaCBleHByZXNzaW9ucyBjYW4gYmUgcHV0LiAgQSBjb25zdGFudAoraXMgYSB2YWx1ZSB0aGF0IG5ldmVyIGNoYW5nZXMgbGlrZSB0aGUgaW50IDUgb3IgdGhlIHN0cmluZyAiaGVsbG8iLgorVGhlIGxhc3QgY29uY2VwdCBpcyB0aGUgY29uY2VwdCBvZiBhbiBvcGVyYXRvci4gIEluIHRoZSBhYm92ZSBleGFtcGxlLAordGhlIGFzc2lnbm1lbnQgb3BlcmF0b3IgPSBpcyB1c2VkLgorCitUaGVyZSBhcmUgaG93ZXZlciBtYW55IG1vcmUgb3BlcmF0b3JzIGluIExQQywgYW5kIGV4cHJlc3Npb25zIGNhbiBnZXQKK3F1aXRlIGNvbXBsZXguICBJZiB3ZSBnbyB1cCBvbmUgbGV2ZWwgb2YgY29tcGxleGl0eSwgd2UgZ2V0OgorCistLS0tLQoreSA9IDU7Cit4ID0geSArMjsKKy0tLS0tCisKK1RoZSBmaXJzdCBpbnN0cnVjdGlvbiB1c2VzIHRoZSBhc3NpZ25tZW50IG9wZXJhdG9yIHRvIGFzc2lnbiB0aGUgdmFsdWUKK29mIHRoZSBjb25zdGFudCBleHByZXNzaW9uIDUgdG8gdGhlIHZhcmlhYmxlIHkuICBUaGUgc2Vjb25kIG9uZQordXNlcyB0aGUgYXNzaWdubWVudCBvcGVyYXRvciB0byBhc3NpZ24gdG8geCB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24KKyh5KzIpIHdoaWNoIHVzZXMgdGhlIGFkZGl0aW9uIG9wZXJhdG9yIHRvIGNvbWUgdXAgd2l0aCBhIHZhbHVlIHdoaWNoCitpcyB0aGUgc3VtIG9mIHRoZSB2YWx1ZSBvZiB5IGFuZCB0aGUgdmFsdWUgb2YgdGhlIGNvbnN0YW50IGV4cHJlc3Npb24gMi4KK1NvdW5kIGxpa2UgYSBsb3Qgb2YgaG90IGFpcj8KKworSW4gYW5vdGhlciBtYW5uZXIgb2Ygc3BlYWtpbmcsIG9wZXJhdG9ycyBjYW4gYmUgdXNlZCB0byBmb3JtIGNvbXBsZXgKK2V4cHJlc3Npb25zLiAgSW4gdGhlIGFib3ZlIGV4YW1wbGUsIHRoZXJlIGFyZSB0d28gZXhwcmVzc2lvbnMgaW4gdGhlCitvbmUgaW5zdHJ1Y3Rpb24geCA9IHkgKyAyOzoKKyAgICAxKSB0aGUgZXhwcmVzc2lvbiB5KzIKKyAgICAyKSB0aGUgZXhwcmVzc2lvbiB4ID0geSArIDIKK0FzIHN0YXRlZCBiZWZvcmUsIGFsbCBleHByZXNzaW9ucyBoYXZlIGEgdmFsdWUuICBUaGUgZXhwcmVzc2lvbgoreSsyIGhhcyB0aGUgdmFsdWUgb2YgdGhlIHN1bSBvZiB5IGFuZCAyIChoZXJlLCA3KTsKK1RoZSBleHByZXNzaW9uIHggPSB5ICsgMiAqYWxzbyogaGFzIHRoZSB2YWx1ZSBvZiA3LgorU28gb3BlcmF0b3JzIGhhdmUgdG8gaW1wb3J0YW50IHRhc2tzOgorICAgIDEpIFRoZXkgKm1heSogYWN0IHVwb24gaW5wdXQgbGlrZSBhIGZ1bmN0aW9uCisgICAgMikgVGhleSBldmFsdWF0ZSBhcyBoYXZpbmcgYSB2YWx1ZSB0aGVtc2VsdmVzLgorTm93LCBub3QgYWxsIG9wZXJhdG9ycyBkbyB3aGF0IDEgZG9lcy4gIFRoZSA9IG9wZXJhdG9ycyBkb2VzIGFjdCB1cG9uCit0aGUgdmFsdWUgb2YgNyBvbiBpdHMgcmlnaHQgYnkgYXNzaWduaW5nIHRoYXQgdmFsdWUgdG8geC4gIFRoZSBvcGVyYXRvcgorKyBob3dldmVyIGRvZXMgbm90aGluZy4gIFRoZXkgYm90aCwgaG93ZXZlciwgaGF2ZSB0aGVpciBvd24gdmFsdWVzLgorCis2LjUgQ29tcGxleCBleHByZXNzaW9ucworQXMgeW91IG1heSBoYXZlIG5vdGljZWQgYWJvdmUsIHRoZSBleHByZXNzaW9uIHggPSA1ICppdHNlbGYqIGhhcyBhIHZhbHVlCitvZiA1LiAgSW4gZmFjdCwgc2luY2UgTFBDIG9wZXJhdG9ycyB0aGVtc2VsdmVzIGhhdmUgdmFsdWUgYXMgZXhwcmVzc2lvbnMsCit0aGV5IGNhbCBhbGxvdyB5b3UgdG8gd3JpdGUgc29tZSByZWFsbHkgY29udm9sdXRlZCBsb29raW5nIG5vbnNlbnNlIGxpa2U6CisgICAgaSA9ICggKHg9c2l6ZW9mKHRtcD11c2VycygpKSkgPyAtLXggOiBzaXplb2YodG1wPWNoaWxkcmVuKCIvc3RkL21vbnN0ZXIiKSktMSkKK3doaWNoIHNheXMgYmFzaWNhbGx5OgorICAgIGFzc2luZyB0byB0bXAgdGhlIGFycmF5IHJldHVybmVkIGJ5IHRoZSBlZnVuIHVzZXJzKCksIHRoZW4gYXNzaWduIHRvIHgKKyAgICB0aGUgdmFsdWUgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBlbGVtZW50cyB0byB0aGF0IGFycmF5LiAgSWYgdGhlIHZhbHVlCisgICAgb2YgdGhlIGV4cHJlc3Npb24gYXNzaWduaW5nIHRoZSB2YWx1ZSB0byB4IGlzIHRydWUgKG5vdCAwKSwgdGhlbiBhc3NpZ24KKyAgICB4IGJ5IDEgYW5kIGFzc2lnbiB0aGUgdmFsdWUgb2YgeC0xIHRvIGkuICBJZiB4IGlzIGZhbHNlIHRob3VnaCwKKyAgICB0aGVuIHNldCB0bXAgdG8gdGhlIGFycmF5IHJldHVybmVkIGJ5IHRoZSBlZnVuIGNoaWxkcmVuKCksIGFuZCB0aGVuCisgICAgYXNzaWduIHRvIGkgdGhlIHZhbHVlIG9mIHRoZSBudW1iZXIgb2YgbWVtYmVycyBpbiB0aGUgYXJyYXkgdG1wIC0xLgorV291bGQgeW91IGV2ZXIgdXNlIHRoZSBhYm92ZSBzdGF0ZW1lbnQ/IEkgZG91YnQgaXQuICBIb3dldmVyIHlvdSBtaWdodAorc2VlIG9yIHVzZSBleHByZXNzaW9ucyBzaW1pbGFyIHRvIGl0LCBzaW5jZSB0aGUgYWJpbGl0eSB0byBjb25zb2xpZGF0ZQorc28gbXVjaCBpbmZvcm1hdGlvbiBpbnRvIG9uZSBzaW5nbGUgbGluZSBoZWxwcyB0byBzcGVlZCB1cCB0aGUgZXhlY3V0aW9uIG9mCit5b3VyIGNvZGUuICBBIG1vcmUgb2Z0ZW4gdXNlZCB2ZXJzaW9uIG9mIHRoaXMgcHJvcGVydHkgb2YgTFBDIG9wZXJhdG9ycword291bGQgYmUgc29tZXRoaW5nIGxpa2U6CisgICAgeCA9IHNpemVvZih0bXAgPSB1c2VycygpKTsKKyAgICB3aGlsZShpLS0pIHdyaXRlKChzdHJpbmcpdG1wW2ldLT5xdWVyeV9uYW1lKCkrIlxuIik7CitpbnN0ZWFkIG9mIHdyaXRpbmcgc29tZXRoaW5nIGxpa2U6CisgICAgdG1wID0gdXNlcnMoKTsKKyAgICB4ID0gc2l6ZW9mKHRtcCk7CisgICAgZm9yKGk9MDsgaTx4OyBpKyspIHdyaXRlKChzdHJpbmcpdG1wW2ldLT5xdWVyeV9uYW1lKCkrIlxuIik7CitUaGluZ3MgbGlrZSBmb3IoKSwgd2hpbGUoKSwgYXJyYXlzIGFuZCBzdWNoIHdpbGwgYmUgZXhwbGFpbmVkIGxhdGVyLgorQnV0IHRoZSBmaXJzdCBiaXQgb2YgY29kZSBpcyBtb3JlIGNvbmNpc2UgYW5kIGl0IGV4ZWN1dGVkIGZhc3Rlci4KKworTk9URTogQSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhbGwgYmFzaWMgTFBDIG9wZXJhdG9ycyBmb2xsb3dzIHRoZSBjaGFwdGVyCitzdW1tYXJ5LgorCisKKzYuNiBDaGFwdGVyIFN1bW1hcnkKK1lvdSBub3cga25vdyBob3cgdG8gZGVjbGFyZSB2YXJpYWJsZXMgYW5kIHVuZGVyc3RhbmQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgorZGVjbGFyaW5nIGFuZCB1c2luZyB0aGVtIGdsb2JhbGx5IG9yIGxvY2FsbHkuICBPbmNlIHlvdSBiZWNvbWUgZmFtaWxpYXIKK3dpdGggeW91ciBkcml2ZXIncyBlZnVucywgeW91IGNhbiBkaXNwbGF5IHRob3NlIHZhbHVlcyBpbiBtYW55IGRpZmZlcmVudAord2F5cy4gIEluIGFkZGl0aW9uLCB0aHJvdWdoIHRoZSBMUEMgb3BlcmF0b3JzLCB5b3Uga25vdyBob3cgdG8gY2hhbmdlCithbmQgZXZhbHVhdGUgdGhlIHZhbHVlcyBjb250YWluZWQgaW4gdmFyaWFibGVzLiAgVGhpcyBpcyB1c2VmdWwgb2YgY291cnNlCitpbiB0aGF0IGl0IGFsbG93cyB5b3UgdG8gZG8gc29tZXRoaW5nIGxpa2UgY291bnQgaG93IG1hbnkgYXBwbGVzIGhhdmUKK2JlZW4gcGlja2VkIGZyb20gYSB0cmVlLCBzbyB0aGF0IG9uY2UgYWxsIGFwcGxlcyBoYXZlIGJlZW4gcGlja2VkLCBubworcGxheWVycyBjYW4gcGljayBtb3JlLiAgVW5mb3J0dW5hdGVseSwgeW91IGRvIG5vdCBrbm93IGhvdyB0byBoYXZlCitjb2RlIGV4ZWN1dGVkIGluIGFueXRoaW5nIG90aGVyIHRoYW4gYSBsaW5lcmEgZmFzaGlvbi4gIEluIG90aGVyIHdvcmRzLAoraG9sZCBvZmYgb24gdGhhdCBhcHBsZSB1bnRpbCB0aGUgbmV4dCBjaGFwdGVyLCBjYXVzZSB5b3UgZG8gbm90IGtub3cKK2hvdyB0byBjaGVjayBpZiB0aGUgYXBwbGVzIHBpY2tlZCBpcyBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGFwcGxlcyBpbiB0aGUKK3RyZWUuICBZb3UgYWxzbyBkbyBub3Qga25vdyBhYm91dCB0aGUgc3BlY2lhbCBmdW5jdGlvbiBpbml0KCkgd2hlcmUgeW91CitnaXZlIG5ldyBjb21tYW5kcyB0byBwbGF5ZXJzLiAgQnV0IHlvdSBhcmUgYWxtb3N0IHJlYWR5IHRvIGNvZGUgYSBuaWNlLAorZmFpcmx5IGNvbXBsZXggYXJlYS4KKworNi43IExQQyBvcGVyYXRvcnMKK1RoaXMgc2VjdGlvbiBjb250YWlucyBhIGRldGFpbGVkIGxpc3Rpbmcgb2YgdGhlIHNpbXBsZXIgTFBDIG9wZXJhdG9ycywKK2luY2x1ZGluZyB3aGF0IHRoZXkgZG8gdG8gdGhlIHZhbHVlcyB0aGV5IHVzZSAoaWYgYW55dGhpbmcpIGFuZCB0aGUgdmFsdWUKK3RoYXQgdGhleSBoYXZlLgorCitUaGUgb3BlcmF0b3JzIGRlc2NyaWJlZCBoZXJlIGFyZToKKz0gICAgKyAgICAtICAgICogICAgLyAgICAlICAgICs9ICAgIC09ICAgICo9ICAgIC89ICAgICU9CistLSAgICArKyAgICA9PSAgICAhPSAgICA+ICAgIDwgICAgPj0gICAgPD0gICAgISAgICAmJiAgICB8fAorLT4gICAgPyA6CisKK1Rob3NlIG9wZXJhdG9ycyBhcmUgYWxsIGRlc2NyaWJlZCBpbiBhIHJhdGhlciBkcnkgbWFubmVyIGJlbG93LCBidXQgaXQgaXMgYmVzdAordG8gYXQgbGVhc3QgbG9vayBhdCBlYWNoIG9uZSwgc2luY2Ugc29tZSBtYXkgbm90IGJlaGF2ZSAqZXhhY3RseSogYXMKK3lvdSB0aGluay4gIEJ1dCBpdCBzaG91bGQgbWFrZSBhIHJhdGhlciBnb29kIHJlZmVyZW5jZSBndWlkZS4KKworPSBhc3NpZ25tZW50IG9wZXJhdG9yOgorICAgIGV4YW1wbGU6IHggPSA1OworICAgIHZhbHVlOiB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIG9uIHRoZSAqbGVmdCogYWZ0ZXIgaXRzIGZ1bmN0aW9uIGlzIGRvbmUKKyAgICBleHBsYW5hdGlvbjogSXQgdGFrZXMgdGhlIHZhbHVlIG9mIGFueSBleHByZXNzaW9uIG9uIHRoZSAqcmlnaHQqIGFuZAorICAgICAgYXNzaWducyBpdCB0byB0aGUgdmFyaWFibGUgb24gdGhlICpsZWZ0Ki4gIE5vdGUgdGhhdCB5b3UgbXVzdCB1c2UKKyAgICAgIGEgc2luZ2xlIHZhcmlhYmxlIG9uIHRoZSBsZWZ0LCBhcyB5b3UgY2Fubm90IGFzc2lnbiB2YWx1ZXMgdG8gCisgICAgICBjb25zdGFudHMgb3IgY29tcGxleCBleHByZXNzaW9ucy4KKworKyBhZGRpdGlvbiBvcGVyYXRvcjoKKyAgICBleGFtcGxlOiB4ICsgNworICAgIHZhbHVlOiBUaGUgc3VtIG9mIHRoZSB2YWx1ZSBvbiB0aGUgbGVmdCBhbmQgdGhlIHZhbHVlIG9uIHRoZSByaWdodAorICAgIGV4YXBsYW5hdGlvbjogSXQgdGFrZXMgdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uIG9uIHRoZSByaWdodCBhbmQKKyAgICAgIGFkZHMgaXQgdG8gdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uIG9uIHRoZSBsZWZ0LiBGb3IgdmFsdWVzCisgICAgICBvZiB0eXBlIGludCwgdGhpcyBtZWFucyB0aGUgbnVtZXJpY2FsIHN1bS4gIEZvciBzdHJpbmdzLAorICAgICAgaXQgbWVhbnMgdGhhdCB0aGUgdmFsdWUgb24gdGhlIHJpZ2h0IGlzIHN0dWNrIG9udG8gdGhlIHZhbHVlIG9uCisgICAgICB0aGUgbGVmdCAoImFiIiBpcyB0aGUgdmFsdWUgb2YgImEiKyJiIikuICBUaGlzIG9wZXJhdG9yIGRvZXMgbm90CisgICAgICBtb2RpZnkgYW55IG9mIHRoZSBvcmlnaW5hbCB2YWx1ZXMgKGkuZS4gdGhlIHZhcmlhYmxlIHggZnJvbQorICAgICAgYWJvdmUgcmV0YWlucyBpdHMgb2xkIHZhbHVlKS4KKworLSBzdWJ0cmFjdGlvbiBvcGVyYXRvcjoKKyAgICBleGFtcGxlOiB4IC0gNworICAgIHZhbHVlOiB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gb24gdGhlIGxlZnQgcmVkdWNlZCBieSB0aGUgcmlnaHQKKyAgICBleHBsYW5hdGlvbjogIFNhbWUgY2hhcmFjdGVyaXN0aWNzIGFzIGFkZGl0aW9uLCBleGNlcHQgaXQgc3VidHJhY3RzLgorICAgICAgV2l0aCBzdHJpbmdzOiAiYSIgaXMgdGhlIHZhbHVlIG9mICJhYiIgLSAiYiIKKworKiBtdWx0aXBsaWNhdGlvbiBvcGVyYXRvcjoKKyAgICBleGFtcGxlOiB4KjcKKyAgICB2YWx1ZSBhbmQgZXhwbGFuYXRpb246IHNhbWUgYXMgd2l0aCBhZGRpbmcgYW5kIHN1YnRyYWN0aW5nIGV4Y2VwdAorICAgICAgdGhpcyBvbmUgcGVyZm9ybXMgdGhlIG1hdGggb2YgbXVsdGlwbGljYXRpb24KKworLyBkaXZpc2lvbiBvcGVyYXRvcjoKKyAgICBleGFtcGxlOiB4LzcKKyAgICB2YWx1ZSBhbmQgZXhwbGFuYXRpb246IHNlZSBhYm92ZQorCisrPSBhZGRpdGl2ZSBhc3NpZ25tZW50IG9wZXJhdG9yOgorICAgIGV4YW1wbGU6IHggKz0gNQorICAgIHZhbHVlOiB0aGUgc2FtZSBhcyB4ICsgNQorICAgIGV4YXBsYW5hdGlvbjogSXQgdGFrZXMgdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSBvbiB0aGUgbGVmdAorICAgICAgYW5kIHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiBvbiB0aGUgcmlnaHQsIGFkZHMgdGhlbSB0b2dldGhlcgorICAgICAgYW5kIGFzc2lnbnMgdGhlIHN1bSB0byB0aGUgdmFyaWFibGUgb24gdGhlIGxlZnQuCisgICAgICBleGFtcGxlOiBpZiB4ID0gMi4uLiB4ICs9IDUgYXNzaWducyB0aGUgdmFsdWUKKyAgICAgICAgNyB0byB0aGUgdmFyaWFibGUgeC4gIFRoZSB3aG9sZSBleHByZXNzaW9uCisgICAgICAgIGhhcyB0aGUgdmFsdWUgb2YgNy4KKworLT0gc3VidHJhY3Rpb24gYXNzaWdubWVudCBvcGVyYXRvcgorICAgIGV4YW1wbGU6IHgtPTcKKyAgICB2YWx1ZTogdGhlIHZhbHVlIG9mIHRoZSBsZWZ0IHZhbHVlIHJlZHVjZWQgYnkgdGhlIHJpZ2h0IHZhbHVlCisgICAgZXhhbXBsYW5hdGlvbjogVGhlIHNhbWUgYXMgKz0gZXhjZXB0IGZvciBzdWJ0cmFjdGlvbi4KKworKj0gbXVsdGlwbGljYXRpdmUgYXNzaWdubWVudCBvcGVyYXRvcgorICAgIGV4YW1wbGU6IHggKj0gNworICAgIHZhbHVlOiB0aGUgdmFsdWUgb2YgdGhlIGxlZnQgdmFsdWUgbXVsdGlwbGllZCBieSB0aGUgcmlnaHQKKyAgICBleHBsYW5hdGlvbjogU2ltaWxhciB0byAtPSBhbmQgKz0gZXhjZXB0IGZvciBhZGRpdGlvbi4KKworLz0gZGl2aXNpb24gYXNzaWdubWVudCBvcGVyYXRvcgorICAgIGV4YW1wbGU6IHggLz0gNworICAgIHZhbHVlOiB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIG9uIHRoZSBsZWZ0IGRpdmlkZWQgYnkgdGhlIHJpZ2h0IHZhbHVlCisgICAgZXhwbGFuYXRpb246IHNpbWlsYXIgdG8gYWJvdmUsIGV4Y2VwdCB3aXRoIGRpdmlzaW9uCisKKysrIHBvc3QvcHJlLWluY3JlbWVudCBvcGVyYXRvcnMKKyAgICBleGFtcGxlczogaSsrIG9yICsraQorICAgIHZhbHVlczogCisgICAgICBpKysgaGFzIHRoZSB2YWx1ZSBvZiBpCisgICAgICArK2kgaGFzIHRoZSB2YWx1ZSBvZiBpKzEKKyAgICBleHBsYW5hdGlvbjogKysgY2hhbmdlcyB0aGUgdmFsdWUgb2YgaSBieSBpbmNyZWFzaW5nIGl0IGJ5IDEuCisgICAgICBIb3dldmVyLCB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gZGVwZW5kcyBvbiB3aGVyZSB5b3UKKyAgICAgIHBsYWNlIHRoZSArKy4gICsraSBpcyB0aGUgcHJlLWluY3JlbWVudCBvcGVyYXRvci4gIFRoaXMgbWVhbnMKKyAgICAgIHRoYXQgaXQgcGVyZm9ybXMgdGhlIGluY3JlbWVudCAqYmVmb3JlKiBnaXZpbmcgYSB2YWx1ZS4KKyAgICAgIGkrKyBpcyB0aGUgcG9zdC1uY3JlbWVudCBvcGVyYXRvci4gIEl0IGV2YWx1dGVzIGJlZm9yZSBpbmNyZW1lbnRpbmcKKyAgICAgIGkuICBXaGF0IGlzIHRoZSBwb2ludD8gIFdlbGwsIGl0IGRvZXMgbm90IG11Y2ggbWF0dGVyIHRvIHlvdSBhdAorICAgICAgdGhpcyBwb2ludCwgYnV0IHlvdSBzaG91bGQgcmVjb2duaXplIHdoYXQgaXQgbWVhbnMuCisKKy0tIHBvc3QvcHJlLWRlY3JlbWVudCBvcGVyYXRvcnMKKyAgICBleGFtcGxlczogaS0tIG9yIC0taQorICAgIHZhbHVlczoKKyAgICAgIGktLSB0aGUgdmFsdWUgb2YgaQorICAgICAgLS1pIHRoZSB2YWx1ZSBvZiBpIHJlZHVjZWQgYnkgMQorICAgIGV4cGxhbmF0aW9uOiBsaWtlICsrIGV4Y2VwdCBmb3Igc3VidHJhY3Rpb24KKworPT0gZXF1YWxpdHkgb3BlcmF0b3IKKyAgICBleGFtcGxlOiB4ID09IDUKKyAgICB2YWx1ZTogdHJ1ZSBvciBmYWxzZSAobm90IDAgb3IgMCkKKyAgICBleHBsYW5hdGlvbjogaXQgZG9lcyBub3RoaW5nIHRvIGVpdGhlciB2YWx1ZSwgYnV0CisgICAgICBpdCByZXR1cm5zIHRydWUgaWYgdGhlIDIgdmFsdWVzIGFyZSB0aGUgc2FtZS4KKyAgICAgIEl0IHJldHVybnMgZmFsc2UgaWYgdGhleSBhcmUgbm90IGVxdWFsLgorCishPSBpbmVxdWFsaXR5IG9wZXJhdG9yCisgICAgZXhhbXBsZTogeCAhPSA1CisgICAgdmFsdWU6IHRydWUgb3IgZmFsc2UKKyAgICBleHBsYW5hdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlIGxlZnQgZXhwcmVzc2lvbiBpcyBub3QgZXF1YWwgdG8gdGhlIHJpZ2h0CisgICAgICBleHByZXNzaW9uLiAgSXQgcmV0dXJucyBmYWxzIGlmIHRoZXkgYXJlIGVxdWFsCisKKz4gZ3JlYXRlciB0aGFuIG9wZXJhdG9yCisgICAgZXhhbXBsZTogeCA+IDUKKyAgICB2YWx1ZTogdHJ1ZSBvciBmYWxzZQorICAgIGV4cGxhbmF0aW9uOiB0cnVlIG9ubHkgaWYgeCBoYXMgYSB2YWx1ZSBncmVhdGVyIHRoYW4gNQorICAgICAgZmFsc2UgaWYgdGhlIHZhbHVlIGlzIGVxdWFsIG9yIGxlc3MKKworPCBsZXNzIHRoYW4gb3BlcmF0b3IKKz49IGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBvcGVyYXRvcgorPD0gbGVzcyB0aGFuIG9yIGVxdWFsIHRvIG9wZXJhdG9yCisgICAgZXhhbXBsZXM6IHggPCB5ICAgIHggPj0geSAgICB4IDw9IHkKKyAgICB2YWx1ZXM6IHRydWUgb3IgZmFsc2UKKyAgICBleHBsYW5hdGlvbjogc2ltaWxhciBhcyB0byA+IGV4Y2VwdAorICAgICAgPCB0cnVlIGlmIGxlZnQgaXMgbGVzcyB0aGFuIHJpZ2h0CisgICAgICA+PSB0cnVlIGlmIGxlZnQgaXMgZ3JlYXRlciB0aGFuICpvciBlcXVhbCB0byogcmlnaHQKKyAgICAgIDw9IHRydWUgaWYgdGhlIGxlZnQgaXMgbGVzcyB0aGFuICpvciBlcXVhbCB0byogdGhlIHJpZ2h0CisKKyYmIGxvZ2ljYWwgYW5kIG9wZXJhdG9yCit8fCBsb2dpY2FsIG9yIG9wZXJhdG9yCisgICAgZXhhbXBsZXM6IHggJiYgeSAgICAgIHggfHwgeQorICAgIHZhbHVlczogdHJ1ZSBvciBmYWxzZQorICAgIGV4cGxhbmF0aW9uOiBJZiB0aGUgcmlnaHQgdmFsdWUgYW5kIGxlZnQgdmFsdWUgYXJlIG5vbi16ZXJvLCAmJiBpcyB0cnVlLgorICAgICAgSWYgZWl0aGVyIGFyZSBmYWxzZSwgdGhlbiAmJiBpcyBmYWxzZS4KKyAgICAgIEZvciB8fCwgb25seSBvbmUgb2YgdGhlIHZhbHVlcyBtdXN0IGJlIHRydWUgZm9yIGl0IHRvIGV2YWx1YXRlCisgICAgICBhcyB0cnVlLiAgSXQgaXMgb25seSBmYWxzZSBpZiBib3RoIHZhbHVlcyBpbmRlZWQKKyAgICAgIGFyZSBmYWxzZQorCishIG5lZ2F0aW9uIG9wZXJhdG9yCisgICAgZXhhbXBsZTogIXgKKyAgICB2YWx1ZTogdHJ1ZSBvciBmYWxzZQorICAgIGV4cGxhbmF0aW9uOiBJZiB4IGlzIHRydWUsIHRoZW4gIXggaXMgZmFsc2UKKyAgICAgIElmIHggaXMgZmFsc2UsICF4IGlzIHRydWUuCisKK0EgcGFpciBvZiBtb3JlIGNvbXBsaWNhdGVkIG9uZXMgdGhhdCBhcmUgaGVyZSBqdXN0IGZvciB0aGUgc2FrZSBvZiBiZWluZworaGVyZS4gIERvIG5vdCB3b3JyeSBpZiB0aGV5IHV0dGVybHkgY29uZnVzZSB5b3UuCisKKy0+IHRoZSBjYWxsIG90aGVyIG9wZXJhdG9yCisgICAgZXhhbXBsZTogdGhpc19wbGF5ZXIoKS0+cXVlcnlfbmFtZSgpCisgICAgdmFsdWU6IFRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgZnVuY3Rpb24gYmVpbmcgY2FsbGVkCisgICAgZXhwbGFuYXRpb246ICBJdCBjYWxscyB0aGUgZnVuY3Rpb24gd2hpY2ggaXMgb24gdGhlIHJpZ2h0IGluIHRoZSBvYmplY3QKKyAgICAgIG9uIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIG9wZXJhdG9yLiAgVGhlIGxlZnQgZXhwcmVzc2lvbiAqbXVzdCogYmUKKyAgICAgIGFuIG9iamVjdCwgYW5kIHRoZSByaWdodCBleHByZXNzaW9uICptdXN0KiBiZSB0aGUgbmFtZSBvZiBhIGZ1bmN0aW9uLgorICAgICAgSWYgbm90IHN1Y2ggZnVuY3Rpb24gZXhpc3RzIGluIHRoZSBvYmplY3QsIGl0IHdpbGwgcmV0dXJuIDAgKG9yCisgICAgICBtb3JlIGNvcnJlY3RseSwgdW5kZWZpbmVkKS4KKworPyA6IGNvbmRpdGlvbmFsIG9wZXJhdG9yCisgICAgZXhhbXBsZTogeCA/IHkgOiB6CisgICAgdmFsdWVzOiBpbiB0aGUgYWJvdmUgZXhhbXBsZSwgaWYgeCBpcyB0cnksIHRoZSB2YWx1ZSBpcyB5CisgICAgICBpZiB4IGlzIGZhbHNlLCB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gaXMgegorICAgIGV4cGxhbmF0aW9uOiBJZiB0aGUgbGVmdG1vc3QgdmFsdWUgaXMgdHJ1ZSwgaXQgd2lsbCBnaXZlIHRoZSBleHByZXNzaW9uIGFzCisgICAgICBhIHdob2xlIHRoZSB2YWx1ZSBvZiB0aGUgbWlkZGxlIGV4cHJlc3Npb24uICBFbHNlLCBpdCB3aWxsIGdpdmUgdGhlCisgICAgICBleHByZXNzaW9uIGFzIGEgd2hvbGUgdGhlIHZhbHVlIG9mIHRoZSByaWdodG1vc3QgZXhwcmVzc2lvbi4KKworQSBub3RlIG9uIGVxdWFsaXR5OiAgQSB2ZXJ5IG5hc3R5IGVycm9yIHBlb3BsZSBtYWtlIHRoYXQgaXMgVkVSWSBkaWZmaWN1bHQKK3RvIGRlYnVnIGlzIHRoZSBlcnJvciBvZiBwbGFjaW5nID0gd2hlcmUgeW91IG1lYW4gPT0uICBTaW5jZQorb3BlcmF0b3JzIHJldHVybiB2YWx1ZXMsIHRoZXkgYm90aCBtYWtlIHNlbnNlIHdoZW4gYmVpbmcgZXZhbHVhdGVkLgorSW4gb3RoZXIgd29yZHMsIG5vIGVycm9yIG9jY3Vycy4gIEJ1dCB0aGV5IGhhdmUgdmVyeSBkaWZmZXJlbnQgdmFsdWVzLiAgRm9yIGV4YW1wbGU6CisgIGlmKHggPT0gNSkgICAgaWYoeCA9IDUpCitUaGUgdmFsdWUgb2YgeCA9PSA1IGlzIHRydWUgaWYgdGhlIHZhbHVlIG9mIHggaXMgNSwgZmFsc2Ugb3RoZXdpc2UuCitUaGUgdmFsdWUgb2YgeCA9IDUgaXMgNSAoYW5kIHRoZXJlZm9yZSBhbHdheXMgdHJ1ZSkuCitUaGUgaWYgc3RhdGVtZW50IGlzIGxvb2tpbmcgZm9yIHRoZSBleHByZXNzaW9uIGluICgpIHRvIGJlIGVpdGhlciB0cnVlIG9yIGZhbHNlLAorc28gaWYgeW91IGhhZCA9IGFuZCBtZWFudCA9PSwgeW91IHdvdWxkIGVuZCB1cCB3aXRoIGFuIGV4cHJlc3Npb24gdGhhdCBpcworYWx3YXlzIHRydWUuICBBbmQgeW91IHdvdWxkIHB1bGwgeW91ciBoYWlyIG91dCB0cnlpbmcgdG8gZmlndXJlIG91dAord2h5IHRoaW5ncyB3ZXJlIG5vdCBoYXBwZW5pbmcgbGlrZSB0aGV5IHNob3VsZCA6KQpkaWZmIC0tZ2l0IGEvZG9jL0tVUlMvTFBDLUtVUlMvY2hhcHRlcjcgYi9kb2MvS1VSUy9MUEMtS1VSUy9jaGFwdGVyNwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWYzMTFiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL0tVUlMvTFBDLUtVUlMvY2hhcHRlcjcKQEAgLTAsMCArMSw0MzIgQEAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQyBCYXNpY3MKKyAgICAgICAgICAgICAgICAgIFdyaXR0ZW4gYnkgRGVzY2FydGVzIG9mIEJvcmcKKyAgICAgICAgICAgICAgICAgIGZpcnN0IGVkaXRpb246IDIzIGFwcmlsIDE5OTMKKyAgICAgICAgICAgICAgICAgIHNlY29uZCBlZGl0aW9uOiAxMCBqdWx5IDE5OTMKKworQ0hBUFRFUiA3OiBGbG93IENvbnRyb2wKKworNy4xIFJldmlldyBvZiB2YXJpYWJsZXMKK1ZhcmlhYmxlcyBtYXkgYmUgbWFuaXB1bGF0ZWQgYnkgYXNzaWduaW5nIG9yIGNoYW5naW5nIHZhbHVlcyB3aXRoIHRoZQorZXhwcmVzc2lvbnMgPSwgKz0sIC09LCArKywgLS0uICBUaG9zZSBleHByZXNzaW9ucyBtYXkgYmUgY29tYmluZWQgd2l0aAordGhlIGV4cHJlc3Npb25zIC0sICssICosIC8sICUuICBIb3dldmVyLCBzbyBmYXIsIHlvdSBoYXZlIG9ubHkgYmVlbgorc2hvd24gaG93IHRvIHVzZSBhIGZ1bmN0aW9uIHRvIGRvIHRoZXNlIGluIGEgbGluZWFyIHdheS4gIEZvciBleGFtcGxlOgorIAoraW50IGhlbGxvKGludCB4KSB7CisgICAgeC0tOworICAgIHdyaXRlKCJIZWxsbywgeCBpcyAiK3grIi5cbiIpOworICAgIHJldHVybiB4OworfQorIAoraXMgYSBmdW5jdGlvbiB5b3Ugc2hvdWxkIGtub3cgaG93IHRvIHdyaXRlIGFuZCB1bmRlcnN0YW5kLiAgQnV0IHdoYXQKK2lmIHlvdSB3YW50ZWQgdG8gd3JpdGUgdGhlIHZhbHVlIG9mIHggb25seSBpZiB4ID0gMT8gIE9yIHdoYXQgaWYKK3lvdSB3YW50ZWQgaXQgdG8ga2VlcCB3cml0aW5nIHggb3ZlciBhbmQgb3ZlciB1bnRpbCB4ID0gMSBiZWZvcmUKK3JldHVybmluZz8gIExQQyB1c2VzIGZsb3cgY29udHJvbCBpbiBleGFjdGx5IHRoZSBzYW1lIHdheSBhcyBDIGFuZCBDKysuCisKKzcuMiBUaGUgTFBDIGZsb3cgY29udHJvbCBzdGF0ZW1lbnRzCitMUEMgdXNlcyB0aGUgZm9sbG93aW5nIGV4cHJlc3Npb25zOgorIAoraWYoZXhwcmVzc2lvbikgaW5zdHJ1Y3Rpb247CisgCitpZihleHByZXNzaW9uKSBpbnN0cnVjdGlvbjsKK2Vsc2UgaW5zdHJ1Y3Rpb247CisgCitpZihleHByZXNzaW9uKSBpbnN0cnVjdGlvbjsKK2Vsc2UgaWYoZXhwcmVzc2lvbikgaW5zdHJ1Y3Rpb247CitlbHNlIGluc3RydWN0aW9uOworIAord2hpbGUoZXhwcmVzc2lvbikgaW5zdHJ1Y3Rpb247CisgCitkbyB7IGluc3RydWN0aW9uOyB9IHdoaWxlKGV4cHJlc3Npb24pOworIAorc3dpdGNoKGV4cHJlc3Npb24pIHsKKyAgICBjYXNlIChleHByZXNzaW9uKTogaW5zdHJ1Y3Rpb247IGJyZWFrOworICAgIGRlZmF1bHQ6IGluc3RydWN0aW9uOworfQorIAorQmVmb3JlIHdlIGRpc2N1c3MgdGhlc2UsIGZpcnN0IHNvbWV0aGluZyBvbiB3aGF0IGlzIG1lYW50IGJ5IGV4cHJlc3Npb24gYW5kCitpbnN0cnVjdGlvbi4gIEFuIGV4cHJlc3Npb24gaXMgYW55dGhpbmcgd2l0aCBhIHZhbHVlIGxpa2UgYSB2YXJpYWJsZSwKK2EgY29tcGFyaXNvbiAobGlrZSB4PjUsIHdoZXJlIGlmIHggaXMgNiBvciBtb3JlLCB0aGUgdmFsdWUgaXMgMSwgZWxzZSB0aGUKK3ZhbHVlIGlzIDApLCBvciBhbiBhc3NpZ25tZW50KGxpa2UgeCArPSAyKS4gIEFuIGluc3RydWN0aW9uIGNhbiBiZSBhbnkKK3NpbmdsZSBsaW5lIG9mIGxwYyBjb2RlIGxpa2UgYSBmdW5jdGlvbiBjYWxsLCBhIHZhbHVlIGFzc2lnbm1lbnQgb3IKK21vZGlmaWNhdGlvbiwgZXRjLgorIAorWW91IHNob3VsZCBrbm93IGFsc28gdGhlIG9wZXJhdG9ycyAmJiwgfHwsID09LCAhPSwgYW5kICEuICBUaGVzZSBhcmUgdGhlCitsb2dpY2FsIG9wZXJhdG9ycy4gIFRoZXkgcmV0dXJuIGEgbm9uemVybyB2YWx1ZSB3aGVuIHRydWUsIGFuZCAwIHdoZW4gZmFsc2UuCitNYWtlIG5vdGUgb2YgdGhlIHZhbHVlcyBvZiB0aGUgZm9sbG93aW5nIGV4cHJlc3Npb25zOgorIAorKDEgJiYgMSkgdmFsdWU6IDEgICAoMSBhbmQgMSkKKygxICYmIDApIHZhbHVlOiAwICAgKDEgYW5kIDApCisoMSB8fCAwKSB2YWx1ZTogMSAgICgxIG9yIDApCisoMSA9PSAxKSB2YWx1ZTogMSAgICgxIGlzIGVxdWFsIHRvIDEpCisoMSAhPSAxKSB2YWx1ZTogMCAgICgxIGlzIG5vdCBlcXVhbCB0byAxKQorKCExKSB2YWx1ZTogMCAgICAgICAobm90IDEpCisoITApIHZhbHVlOiAxICAgICAgIChub3QgMCkKKyAKK0luIGV4cHJlc3Npb25zIHVzaW5nICYmLCBpZiB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGl0ZW0gYmVpbmcgY29tcGFyZWQKK2lzIDAsIHRoZSBzZWNvbmQgaXMgbmV2ZXIgdGVzdGVkIGV2ZW4uICBXaGVuIHVzaW5nIHx8LCBpZiB0aGUgZmlyc3QgaXMKK3RydWUgKDEpLCB0aGVuIHRoZSBzZWNvbmQgaXMgbm90IHRlc3RlZC4KKyAKKzcuMyBpZigpCitUaGUgZmlyc3QgZXhwcmVzc2lvbiB0byBsb29rIGF0IHRoYXQgYWx0ZXJzIGZsb3cgY29udHJvbCBpcyBpZigpLiAgVGFrZQorYSBsb29rIGF0IHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKKyAKKzEgdm9pZCByZXNldCgpIHsKKzIgICAgIGludCB4OworMworNCAgICAgOjpyZXNldCgpOworNSAgICAgeCA9IHJhbmRvbSgxMCk7Cis2ICAgICBpZih4ID4gNTApIHNldF9zZWFyY2hfZnVuYygiZmxvb3Jib2FyZHMiLCAic2VhcmNoX2Zsb29yIik7Cis3IH0KKyAKK1RoZSBsaW5lIG51bWJlcnMgYXJlIGZvciByZWZlcmVuY2Ugb25seS4KK0luIGxpbmUgMiwgb2YgY291cnNlIHdlIGRlY2xhcmUgYSB2YXJpYWJsZSBvZiB0eXBlIGludCBjYWxsZWQgeC4gIExpbmUgMworaXMgYWV0aGV0aWMgd2hpdGVzcGFjZSB0byBjbGVhcmx5IHNob3cgd2hlcmUgdGhlIGRlY2xhcmF0aW9ucyBlbmQgYW5kIHRoZQorZnVuY3Rpb24gY29kZSBiZWdpbnMuICBUaGUgdmFyaWFibGUgeCBpcyBvbmx5IGF2YWlsYWJsZSB0byB0aGUgZnVuY3Rpb24KK3Jlc2V0KCkuCitMaW5lIDQgbWFrZXMgYSBjYWxsIHRvIHRoZSByb29tLmMgdmVyc2lvbiBvZiByZXNldCgpLgorTGluZSA1IHVzZXMgdGhlIGRyaXZlciBlZnVuIHJhbmRvbSgpIHRvIHJldHVybiBhIHJhbmRvbSBudW1iZXIgYmV0d2VlbgorMCBhbmQgdGhlIHBhcmFtZXRlciBtaW51cyAxLiAgU28gaGVyZSB3ZSBhcmUgbG9va2luZyBmb3IgYSBudW1iZXIgYmV0d2VlbgorMCBhbmQgOTkuCitJbiBsaW5lIDYsIHdlIHRlc3QgdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uICh4PjUwKSB0byBzZWUgaWYgaXQgaXMgdHJ1ZQorb3IgZmFsc2UuICBJZiBpdCBpcyB0cnVlLCB0aGVuIGl0IG1ha2VzIGEgY2FsbCB0byB0aGUgcm9vbS5jIGZ1bmN0aW9uCitzZXRfc2VhcmNoX2Z1bmMoKS4gIElmIGl0IGlzIGZhbHNlLCB0aGUgY2FsbCB0byBzZXRfc2VhcmNoX2Z1bmMoKSBpcyBuZXZlcgorZXhlY3V0ZWQuCitJbiBsaW5lIDcsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGRyaXZlciBjb250cm9sIHRvIHRoZSBjYWxsaW5nIGZ1bmN0aW9uCisodGhlIGRyaXZlciBpdHNlbGYgaW4gdGhpcyBjYXNlKSB3aXRob3V0IHJldHVybmluZyBhbnkgdmFsdWUuCisgCitJZiB5b3UgaGFkIHdhbnRlZCB0byBleGVjdXRlIG11bHRpcGxlIGluc3RydWN0aW9ucyBpbnN0ZWFkIG9mIGp1c3QgdGhlIG9uZSwKK3lvdSB3b3VsZCBoYXZlIGRvbmUgaXQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXI6CisgCitpZih4PjUwKSB7CisgICAgc2V0X3NlYXJjaF9mdW5jKCJmbG9vcmJvYXJkcyIsICJzZWFyY2hfZmxvb3IiKTsKKyAgICBpZighcHJlc2VudCgiYmVnZ2FyIiwgdGhpc19vYmplY3QoKSkpIG1ha2VfYmVnZ2FyKCk7Cit9CisgCitOb3RpY2UgdGhlIHt9IGVuY2Fwc3VsYXRlIHRoZSBpbnN0cnVjdGlvbnMgdG8gYmUgZXhlY3V0ZWQgaWYgdGhlIHRlc3QKK2V4cHJlc3Npb24gaXMgdHJ1ZS4gIEluIHRoZSBleGFtcGxlLCBhZ2FpbiB3ZSBjYWxsIHRoZSByb29tLmMgZnVuY3Rpb24KK3doaWNoIHNldHMgYSBmdW5jdGlvbiAoc2VhcmNoX2Zsb29yKCkpIHRoYXQgeW91IHdpbGwgbGF0ZXIgZGVmaW5lIHlvdXJzZWxmCit0byBiZSBjYWxsZWQgd2hlbiB0aGUgcGxheWVyIHR5cGVzICJzZWFyY2ggZmxvb3Jib2FyZHMiIChOT1RFOiBUaGlzIGlzCitoaWdobHkgbXVkbGliIGRlcGVuZGVudC4gIE5pZ2h0bWFyZSBtdWRsaWJzIGhhdmUgdGhpcyBmdW5jdGlvbiBjYWxsLgorT3RoZXJzIG1heSBoYXZlIHNvbWV0aGluZyBzaW1pbGFyLCB3aGlsZSBvdGhlcnMgbWF5IG5vdCBoYXZlIHRoaXMgZmVhdHVyZQordW5kZXIgYW55IG5hbWUpLiAgTmV4dCwgdGhlcmUgaXMgYW5vdGhlciBpZigpIGV4cHJlc3Npb24gdGhhdCB0ZXN0cyB0aGUKK3RydXRoIG9mIHRoZSBleHByZXNzaW9uICghcHJlc2VudCgiYmVnZ2FyIix0aGlzX29iamVjdCgpKSkuICBUaGUgISBpbiB0aGUKK3Rlc3QgZXhwcmVzc2lvbiBjaGFuZ2VzIHRoZSB0cnV0aCBvZiB0aGUgZXhwcmVzc2lvbiB3aGljaCBmb2xsb3dzIGl0LiAgSW4KK3RoaXMgY2FzZSwgaXQgY2hhbmdlcyB0aGUgdHJ1dGggb2YgdGhlIGVmdW4gcHJlc2VudCgpLCB3aGljaCB3aWxsIHJldHVybgordGhlIG9iamVjdCB0aGF0IGlzIGEgYmVnZ2FyIGlmIGl0IGlzIGluIHRoZSByb29tICh0aGlzX29iamVjdCgpKSwgb3IgaXQKK3dpbGwgcmV0dXJuIDAgaWYgdGhlcmUgaXMgbm8gYmVnZ2FyIGluIHRoZSByb29tLiAgU28gaWYgdGhlcmUgaXMgYSBiZWdnYXIKK3N0aWxsIGxpdmluZyBpbiB0aGUgcm9vbSwgKHByZXNlbnQoImJlZ2dhciIsIHRoaXNfb2JqZWN0KCkpKSB3aWxsIGhhdmUKK2EgdmFsdWUgZXF1YWwgdG8gdGhlIGJlZ2dhciBvYmplY3QgKGRhdGEgdHlwZSBvYmplY3QpLCBvdGhlcndpc2UgaXQgd2lsbAorYmUgMC4gIFRoZSAhIHdpbGwgY2hhbmdlIGEgMCB0byBhIDEsIG9yIGFueSBub256ZXJvIHZhbHVlIChsaWtlIHRoZQorYmVnZ2FyIG9iamVjdCkgdG8gYSAwLiAgVGhlcmVmb3JlLCB0aGUgZXhwcmVzc2lvbgorKCFwcmVzZW50KCJiZWdnYXIiLCB0aGlzX29iamVjdCgpKSkgaXMgdHJ1ZSBpZiB0aGVyZSBpcyBubyBiZWdnYXIgaW4gdGhlCityb29tLCBhbmQgZmFsc2UgaWYgdGhlcmUgaXMuICBTbywgaWYgdGhlcmUgaXMgbm8gYmVnZ2FyIGluIHRoZSByb29tLAordGhlbiBpdCBjYWxscyB0aGUgZnVuY3Rpb24geW91IGRlZmluZSBpbiB5b3VyIHJvb20gY29kZSB0aGF0IG1ha2VzIGEKK25ldyBiZWdnYXIgYW5kIHB1dHMgaXQgaW4gdGhlIHJvb20uIChJZiB0aGVyZSBpcyBhIGJlZ2dhciBpbiB0aGUgcm9vbSwKK3dlIGRvIG5vdCB3YW50IHRvIGFkZCB5ZXQgYW5vdGhlciBvbmUgOikpCisgCitPZiBjb3Vyc2UsIGlmKCkncyBvZnRlbiBjb21lcyB3aXRoIGFuZHMgb3IgYnV0cyA6KS4gIEluIExQQywgdGhlIGZvcm1hbAorcmVhZGluZyBvZiB0aGUgaWYoKSBzdGF0ZW1lbnQgaXM6CisgCitpZihleHByZXNzaW9uKSB7IHNldCBvZiBpbnRydWN0aW9ucyB9CitlbHNlIGlmKGV4cHJlc3Npb24pIHsgc2V0IG9mIGluc3RydWN0aW9ucyB9CitlbHNlIHsgc2V0IG9mIGluc3RydWN0aW9ucyB9CisgCitUaGlzIG1lYW5zOgorIAorSWYgZXhwcmVzc2lvbiBpcyB0cnVlLCB0aGVuIGRvIHRoZXNlIGluc3RydWN0aW9ucy4KK090aGVyaXNlLCBpZiB0aGlzIHNlY29uZCBleHByZXNzaW9uIGlzIHRydWUsIGRvIHRoaXMgc2Vjb25kIHNldC4KK0FuZCBpZiBub25lIG9mIHRob3NlIHdlcmUgdHJ1ZSwgdGhlbiBkbyB0aGlzIGxhc3Qgc2V0LgorIAorWW91IGNhbiBoYXZlIGlmKCkgYWxvbmU6CisgCitpZih4PjUpIHdyaXRlKCJGb28sXG4iKTsKKyAKK3dpdGggYW4gZWxzZSBpZigpOgorIAoraWYoeCA+IDUpIHdyaXRlKCJYIGlzIGdyZWF0ZXIgdGhhbiA1LlxuIik7CitlbHNlIGlmKHggPjIpIHdyaXRlKCJYIGlzIGxlc3MgdGhhbiA2LCBidXQgZ3JlYXRlciB0aGFuIDIuXG4iKTsKKyAKK3dpdGggYW4gZWxzZToKKyAKK2lmKHg+NSkgd3JpdGUoIlggaXMgZ3JlYXRlciB0aGFuIDUuXG4iKTsKK2Vsc2Ugd3JpdGUoIlggaXMgbGVzcyB0aGFuIDYuXG4iKTsKKyAKK29yIHRoZSB3aG9sZSBsb3Qgb2YgdGhlbSBhcyBsaXN0ZWQgYWJvdmUuICBZb3UgY2FuIGhhdmUgYW55IG51bWJlciBvZgorZWxzZSBpZigpJ3MgaW4gdGhlIGV4cHJlc3Npb24sIGJ1dCB5b3UgbXVzdCBoYXZlIG9uZSBhbmQgb25seSBvbmUKK2lmKCkgYW5kIGF0IG1vc3Qgb25lIGVsc2UuICBPZiBjb3Vyc2UsIGFzIHdpdGggdGhlIGJlZ2dhciBleGFtcGxlLAoreW91IG1heSBuZXN0IGlmKCkgc3RhdGVtZW50cyBpbnNpZGUgaWYoKSBpbnN0cnVjdGlvbnMuIChGb3IgZXhhbXBsZSwKKyAgICBpZih4PjUpIHsKKyAgICAgICAgaWYoeD09Nykgd3JpdGUoIkx1Y2t5IG51bWJlciFcbiIpOworICAgICAgICBlbHNlIHdyaXRlKCJSb2xsIGFnYWluLlxuIik7CisgICAgfQorICAgIGVsc2Ugd3JpdGUoIllvdSBsb3NlLlxuIik7CisgCis3LjQgVGhlIHN0YXRlbWVudHM6IHdoaWxlKCkgYW5kIGRvIHt9IHdoaWxlKCkKK1Byb3RvdHlwZToKK3doaWxlKGV4cHJlc3Npb24pIHsgc2V0IG9mIGluc3RydWN0aW9ucyB9CitkbyB7IHNldCBvZiBpbnN0cnVjdGlvbnMgfSB3aGlsZShleHByZXNzaW9uKTsKKyAKK1RoZXNlIGFsbG93IHlvdSB0byBjcmVhdGUgYSBzZXQgb2YgaW5zdHJ1Y3Rpb25zIHdoaWNoIGNvbnRpbnVlIHRvCitleGVjdXRlIHNvIGxvbmcgYXMgc29tZSBleHByZXNzaW9uIGlzIHRydWUuICBTdXBwb3NlIHlvdSB3YW50ZWQgdG8KK3NldCBhIHZhcmlhYmxlIGVxdWFsIHRvIGEgcGxheWVyJ3MgbGV2ZWwgYW5kIGtlZXAgc3VidHJhY3RpbmcgcmFuZG9tCithbW91bnRzIG9mIGVpdGhlciBtb25leSBvciBocCBmcm9tIGEgcGxheWVyIHVudGlsIHRoYXQgdmFyaWFibGUgZXF1YWxzCiswIChzbyB0aGF0IHBsYXllcidzIG9mIGhpZ2hlciBsZXZlbHMgd291bGQgbG9zZSBtb3JlKS4gIFlvdSBtaWdodCBkbyBpdAordGhpcyB3YXk6CisgCisxICAgIGludCB4OworMgorMyAgICB4ID0gKGludCl0aGlzX3BsYXllcigpLT5xdWVyeV9sZXZlbCgpOyAgLyogdGhpcyBoYXMgeWV0IHRvIGJlIGV4cGxhaW5lZCAqLworNCAgICB3aGlsZSh4ID4gMCkgeworNSAgICAgICAgaWYocmFuZG9tKDIpKSB0aGlzX3BsYXllcigpLT5hZGRfbW9uZXkoInNpbHZlciIsIC1yYW5kb20oNTApKTsKKzYgICAgICAgIGVsc2UgdGhpc19wbGF5ZXIoKS0+YWRkX2hwKC0ocmFuZG9tKDEwKSk7Cis3ICAgICAgICB4LS07Cis4ICAgIH0KKyAKK1RoZSBleHByZXNzaW9uIHRoaXNfcGxheWVyKCktPnF1ZXJ5X2xldmVsKCkgY2FsSW4gbGluZSA0LCB3ZSBzdGFydCBhIGxvb3AgdGhhdCBleGVjdXRlcyBzbyBsb25nIGFzIHggaXMgZ3JlYXRlciB0aGFuIDAuCisgICAgQW5vdGhlciB3YXkgd2UgY291bGQgaGF2ZSBkb25lIHRoaXMgbGluZSB3b3VsZCBiZToKKyAgICAgICAgd2hpbGUoeCkgeworICAgIFRoZSBwcm9ibGVtIHdpdGggdGhhdCB3b3VsZCBiZSBpZiB3ZSBsYXRlciBtYWRlIGEgY2hhbmdlIHRvIHRoZSBmdW50aW9uCit5IGFueXdoZXJlIGJldHdlZW4gMCBhbmQgNDkgY29pbnMuCitJbiBsaW5lIDYsIGlmIGluc3RlYWQgaXQgcmV0dXJucyAwLCB3ZSBjYWxsIHRoZSBhZGRfaHAoKSBmdW5jdGlvbiBpbiB0aGUKKyAgICBwbGF5ZXIgd2hpY2ggcmVkdWNlcyB0aGUgcGxheWVyJ3MgaGl0IHBvaW50cyBhbnl3aGVyZSBiZXR3ZWVuIDAgYW5kIDkgaHAuCitJbiBsaW5lIDcsIHdlIHJlZHVjZSB4IGJ5IDEuCitBdCBsaW5lIDgsIHRoZSBleGVjdXRpb24gY29tZXMgdG8gdGhlIGVuZCBvZiB0aGUgd2hpbGUoKSBpbnN0cnVjdGlvbnMgYW5kCisgICAgZ29lcyBiYWNrIHVwIHRvIGxpbmUgNCB0byBzZWUgaWYgeCBpcyBzdGlsbCBncmVhdGVyIHRoYW4gMC4gIFRoaXMKKyAgICBsb29wIHdpbGwga2VlcCBleGVjdXRpbmcgdW50aWwgeCBpcyBmaW5hbGx5IGxlc3MgdGhhbiAxLgorIAorWW91IG1pZ2h0LCBob3dldmVyLCB3YW50IHRvIHRlc3QgYW4gZXhwcmVzc2lvbiAqYWZ0ZXIqIHlvdSBleGVjdXRlIHNvbWUKK2luc3RydWN0aW9ucy4gIEZvciBpbnN0YW5jZSwgaW4gdGhlIGFib3ZlLCBpZiB5b3Ugd2FudGVkIHRvIGV4ZWN1dGUKK3RoZSBpbnN0cnVjdGlvbnMgYXQgbGVhc3Qgb25jZSBmb3IgZXZlcnlvbmUsIGV2ZW4gaWYgdGhlaXIgbGV2ZWwgaXMKK2JlbG93IHRoZSB0ZXN0IGxldmVsOgorIAorICAgIGludCB4OworIAorICAgIHggPSAoaW50KXRoaXNfcGxheWVyKCktPnF1ZXJ5X2xldmVsKCk7CisgICAgZG8geworICAgICAgICBpZihyYW5kb20oMikpIHRoaXNfcGxheWVyKCktPmFkZF9tb25leSgic2lsdmVyIiwgLXJhbmRvbSg1MCkpOworICAgICAgICBlbHNlIHRoaXNfcGxheWVyKCktPmFkZF9ocCgtcmFuZG9tKDEwKSk7CisgICAgICAgIHgtLTsKKyAgICB9IHdoaWxlKHggPiAwKTsKKyAKK1RoaXMgaXMgYSByYXRoZXIgYml6YXJyZSBleGFtcGxlLCBiZWluZyBhcyBmZXcgbXVkcyBoYXZlIGxldmVsIDAgcGxheWVycy4KK0FuZCBldmVuIHN0aWxsLCB5b3UgY291bGQgaGF2ZSBkb25lIGl0IHVzaW5nIHRoZSBvcmlnaW5hbCBsb29wIHdpdGgKK2EgZGlmZmVyZW50IHRlc3QuICBOZXZlcnRoZWxlc3MsIGl0IGlzIGludGVuZGVkIHRvIHNob3cgaG93IGEgZG97fSB3aGlsZSgpCit3b3Jrcy4gIEFzIHlvdSBzZWUsIGluc3RlYWQgb2YgaW5pdGlhdGluZyB0aGUgdGVzdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQorbG9vcCAod2hpY2ggd291bGQgaW1tZWRpYXRlbHkgZXhjbHVkZSBzb21lIHZhbHVlcyBvZiB4KSwgaXQgdGVzdHMgYWZ0ZXIKK3RoZSBsb29wIGhhcyBiZWVuIGV4ZWN1dGVkLiAgVGhpcyBhc3N1cmVzIHRoYXQgdGhlIGluc3RydWN0aW9ucyBvZiB0aGUgbG9vcAorZ2V0IGV4ZWN1dGVkIGF0IGxlYXN0IG9uZSB0aW1lLCBubyBtYXR0ZXIgd2hhdCB4IGlzLgorIAorNy41IGZvcigpIGxvb3BzCitQcm90b3R5cGU6Citmb3IoaW5pdGlhbGl6ZSB2YWx1ZXMgOyB0ZXN0IGV4cHJlc3Npb24gOyBpbnN0cnVjdGlvbikgeyBpbnN0cnVjdGlvbnMgfQorIAoraW5pdGlhbGl6ZSB2YWx1ZXM6CitUaGlzIGFsbG93cyB5b3UgdG8gc2V0IHN0YXJ0aW5nIHZhbHVlcyBvZiB2YXJpYWJsZXMgd2hpY2ggd2lsbCBiZSB1c2VkCitpbiB0aGUgbG9vcC4gIFRoaXMgcGFydCBpcyBvcHRpb25hbC4KKyAKK3Rlc3QgZXhwcmVzc2lvbjoKK1NhbWUgYXMgdGhlIGV4cHJlc3Npb24gaW4gaWYoKSBhbmQgd2hpbGUoKS4gIFRoZSBsb29wIGlzIGV4ZWN1dGVkCithcyBsb25nIGFzIHRoaXMgZXhwcmVzc2lvbiAob3IgZXhwcmVzc2lvbnMpIGlzIHRydWUuIFlvdSBtdXN0IGhhdmUgYQordGVzdCBleHByZXNzaW9uLgorIAoraW5zdHJ1Y3Rpb246CitBbiBleHByZXNzaW9uIChvciBleHByZXNzaW9ucykgd2hpY2ggaXMgdG8gYmUgZXhlY3V0ZWQgYXQgdGhlIGVuZCBvZiBlYWNoCitsb29wLiAgVGhpcyBpcyBvcHRpb25hbC4KKyAKK05vdGU6Citmb3IoO2V4cHJlc3Npb247KSB7fQorSVMgRVhBQ1RMWSBUSEUgU0FNRSBBUword2hpbGUoZXhwcmVzc2lvbikge30KKyAKK0V4YW1wbGU6CisgCisxICAgIGludCB4OworMgorMyAgICBmb3IoeD0gKGludCl0aGlzX3BsYXllcigpLT5xdWVyeV9sZXZlbCgpOyB4PjA7IHgtLSkgeworNCAgICAgICAgaWYocmFuZG9tKDIpKSB0aGlzX3BsYXllcigpLT5hZGRfbW9uZXkoInNpbHZlciIsIC1yYW5kb20oNTApKTsKKzUgICAgICAgIGVsc2UgdGhpc19wbGF5ZXIoKS0+YWRkX2hwKC1yYW5kb20oMTApKTsKKzYgICAgfQorIAorVGhpcyBmb3IoKSBsb29wIGJlaGF2ZXMgRVhBQ1RMWSBsaWtlIHRoZSB3aGlsZSgpIGV4YW1wbGUuCitBZGRpdGlvbmFsbHksIGlmIHlvdSB3YW50ZWQgdG8gaW5pdGlhbGl6ZSAyIHZhcmlhYmxlczoKKyAKK2Zvcih4PTAsIHk9cmFuZG9tKDIwKTsgeDx5OyB4KyspIHsgd3JpdGUoeCsiXG4iKTsgfQorIAorSGVyZSwgd2UgaW5pdGlhbGl6ZSAyIHZhcmlhYmxlcywgeCBhbmQgeSwgYW5kIHdlIHNlcGFyYXRlIHRoZW0gYnkgYQorY29tbWEuICBZb3UgY2FuIGRvIHRoZSBzYW1lIHdpdGggYW55IG9mIHRoZSAzIHBhcnRzIG9mIHRoZSBmb3IoKQorZXhwcmVzc2lvbi4KKyAKKzcuNiBUaGUgc3RhdGVtZW50OiBzd2l0Y2goKQorUHJvdG90eXBlOgorc3dpdGNoKGV4cHJlc3Npb24pIHsKKyAgICBjYXNlIGNvbnN0YW50OiBpbnN0cnVjdGlvbnMKKyAgICBjYXNlIGNvbnN0YW50OiBpbnN0cnVjdGlvbnMKKyAgICAuLi4KKyAgICBjYXNlIGNvbnN0YW50OiBpbnN0cnVjdGlvbnMKKyAgICBkZWZhdWx0OiBpbnN0cnVjdGlvbnMKK30KKyAKK1RoaXMgaXMgZnVuY3Rpb25hbGx5IG11Y2ggbGlrZSBpZigpIGV4cHJlc3Npb25zLCBhbmQgbXVjaCBuaWNlciB0byB0aGUKK0NQVSwgaG93ZXZlciBtb3N0IHJhcmVseSB1c2VkIGJlY2F1c2UgaXQgbG9va3Mgc28gZGFtbiBjb21wbGljYXRlZC4KK0J1dCBpdCBpcyBub3QuCisgCitGaXJzdCBvZmYsIHRoZSBleHByZXNzaW9uIGlzIG5vdCBhIHRlc3QuICBUaGUgY2FzZXMgYXJlIHRlc3RzLiAgQSBFbmdsaXNoCitzb3VuZGluZyB3YXkgdG8gcmVhZDoKKyAKKzEgICAgaW50IHg7CisyCiszICAgIHggPSByYW5kb20oNSk7Cis0ICAgIHN3aXRjaCh4KSB7Cis1ICAgICAgICBjYXNlIDE6IHdyaXRlKCJYIGlzIDEuXG4iKTsKKzYgICAgICAgIGNhc2UgMjogeCsrOworNyAgICAgICAgZGVmYXVsdDogeC0tOworOCAgICB9Cis5ICAgIHdyaXRlKHgrIlxuIik7CisgCitpczoKKyAKK3NldCB2YXJpYWJsZSB4IHRvIGEgcmFuZG9tIG51bWJlciBiZXR3ZWVuIDAgYW5kIDQuCitJbiBjYXNlIDEgb2YgdmFyaWFibGUgeCB3cml0ZSBpdHMgdmFsdWUgYWRkIDEgdG8gaXQgYW5kIHN1YnRyYWN0IDEuCitJbiBjYXNlIDIgb2YgdmFyaWFibGUgeCwgYWRkIDEgdG8gaXRzIHZhbHVlIGFuZCB0aGVuIHN1YnRyYWN0IDEuCitJbiBvdGhlciBjYXNlcyBzdWJ0cmFjdCAxLgorV3JpdGUgdGhlIHZhbHVlIG9mIHguCisgCitzd2l0Y2goeCkgYmFzaWNhbGx5IHRlbGxzIHRoZSBkcml2ZXIgdGhhdCB0aGUgdmFyaWFibGUgeCBpcyB0aGUgdmFsdWUKK3dlIGFyZSB0cnlpbmcgdG8gbWF0Y2ggdG8gYSBjYXNlLgorT25jZSB0aGUgZHJpdmVyIGZpbmRzIGEgY2FzZSB3aGljaCBtYXRjaGVzLCB0aGF0IGNhc2UgKmFuZCBhbGwgZm9sbG93aW5nCitjYXNlcyogd2lsbCBiZSBhY3RlZCB1cG9uLiAgWW91IG1heSBicmVhayBvdXQgb2YgdGhlIHN3aXRjaCBzdGF0ZW1lbnQKK2FzIHdlbGwgYXMgYW55IG90aGVyIGZsb3cgY29udHJvbCBzdGF0ZW1lbnQgd2l0aCBhIGJyZWFrIGluc3RydWN0aW9uIGluCitvcmRlciBvbmx5IHRvIGV4ZWN1dGUgYSBzaW5nbGUgY2FzZS4gIEJ1dCB0aGF0IHdpbGwgYmUgZXhwbGFpbmVkIGxhdGVyLgorVGhlIGRlZmF1bHQgc3RhdGVtZW50IGlzIG9uZSB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgZm9yIGFueSB2YWx1ZSBvZgoreCBzbyBsb25nIGFzIHRoZSBzd2l0Y2goKSBmbG93IGhhcyBub3QgYmVlbiBicm9rZW4uICBZb3UgbWF5IHVzZSBhbnkKK2RhdGEgdHlwZSBpbiBhIHN3aXRjaCBzdGF0ZW1lbnQ6CisgCitzdHJpbmcgbmFtZTsKKyAKK25hbWUgPSAoc3RyaW5nKXRoaXNfcGxheWVyKCktPnF1ZXJ5X25hbWUoKTsKK3N3aXRjaChuYW1lKSB7CisgICAgY2FzZSAiZGVzY2FydGVzIjogd3JpdGUoIllvdSBib3JnLlxuIik7CisgICAgY2FzZSAiZmxhbW1lIjoKKyAgICBjYXNlICJmb3Jsb2NrIjoKKyAgICBjYXNlICJzaGFkb3d3b2xmIjogd3JpdGUoIllvdSBhcmUgYSBOaWdodG1hcmUgaGVhZCBhcmNoLlxuIik7CisgICAgZGVmYXVsdDogd3JpdGUoIllvdSBleGlzdC5cbiIpOworfQorIAorRm9yIG1lLCBJIHdvdWxkIHNlZToKK1lvdSBib3JnLgorWW91IGFyZSBhIE5pZ2h0bWFyZSBoZWFkIGFyY2guCitZb3UgZXhpc3QuCisgCitGbGFtbWUsIEZvcmxvY2ssIG9yIFNoYWRvd3dvbGYgd291bGQgc2VlOgorWW91IGFyZSBhIE5pZ2h0bWFyZSBoZWFkIGFyY2guCitZb3UgZXhpc3QuCisgCitFdmVyeW9uZSBlbHNlIHdvdWxkIHNlZToKK1lvdSBleGlzdC4KKyAKKzcuNyBBbHRlcmluZyB0aGUgZmxvdyBvZiBmdW5jdGlvbnMgYW5kIGZsb3cgY29udHJvbCBzdGF0ZW1lbnRzCitUaGUgZm9sbG93aW5nIGluc3RydWN0aW9uczoKK3JldHVybiAgICBjb250aW51ZSAgICBicmVhaworIAorYWx0ZXIgdGhlIG5hdHVyYWwgZmxvdyBvZiB0aGluZ3MgYXMgZGVzY3JpYmVkIGFib3ZlLgorRmlyc3Qgb2YgYWxsLAorcmV0dXJuCitubyBtYXR0ZXIgd2hlcmUgaXQgb2NjdXJzIGluIGEgZnVuY3Rpb24sIHdpbGwgY2Vhc2UgdGhlIGV4ZWN1dGlvbiBvZiB0aGF0CitmdW5jdGlvbiBhbmQgcmV0dXJuIGNvbnRyb2wgdG8gdGhlIGZ1bmN0aW9uIHdoaWNoIGNhbGxlZCB0aGUgb25lIHRoZQorcmV0dXJuIHN0YXRlbWVudCBpcyBpbi4gIElmIHRoZSBmdW5jdGlvbiBpcyBOT1Qgb2YgdHlwZSB2b2lkLCB0aGVuIGEKK3ZhbHVlIG11c3QgZm9sbG93IHRoZSByZXR1cm4gc3RhdGVtZW50LCBhbmQgdGhhdCB2YWx1ZSBtdXN0IGJlIG9mIGEKK3R5cGUgbWF0Y2hpbmcgdGhlIGZ1bmN0aW9uLiAgQW4gYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gd291bGQgbG9vaworbGlrZSB0aGlzOgorIAoraW50IGFic29sdXRlX3ZhbHVlKGludCB4KSB7CisgICAgaWYoeD4tMSkgcmV0dXJuIHg7CisgICAgZWxzZSByZXR1cm4gLXg7Cit9CisgCitJbiB0aGUgc2Vjb25kIGxpbmUsIHRoZSBmdW5jdGlvbiBjZWFzZXMgZXhlY3V0aW9uIGFuZCByZXR1cm5zIHRvIHRoZSBjYWxsaW5nCitmdW5jdGlvbiBiZWNhdXNlIHRoZSBkZXNpcmVkIHZhbHVlIGhhcyBiZWVuIGZvdW5kIGlmIHggaXMgYSBwb3NpdGl2ZQorbnVtYmVyLgorIAorY29udGludWUgaXMgbW9zdCBvZnRlbiB1c2VkIGluIGZvcigpIGFuZCB3aGlsZSBzdGF0ZW1lbnRzLiAgSXQgc2VydmVzCit0byBzdG9wIHRoZSBleGVjdXRpb24gb2YgdGhlIGN1cnJlbnQgbG9vcCBhbmQgc2VuZCB0aGUgZXhlY3V0aW9uIGJhY2sKK3RvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxvb3AuICBGb3IgaW5zdGFuY2UsIHNheSB5b3Ugd2FudGVkIHRvIGF2b2lkCitkaXZpc2lvbiBieSAwOgorIAoreD0gNDsKK3doaWxlKCB4ID4gLTUpIHsKKyAgICB4LS0KKyAgICBpZigheCkgY29udGludWU7CisgICAgd3JpdGUoKDEwMC94KSsiXG4iKTsKK30KK3dyaXRlKCJEb25lLlxuIikKKyAKK1lvdSB3b3VsZCBzZWUgdGhlIGZvbGxvd2luZyBvdXRwdXQ6CiszMworNTAKKzEwMAorLTEwMAorLTUwCistMzMKKy0yNQorRG9uZS4KK1RvIGF2b2lkIGFuIGVycm9yLCBpdCBjaGVja3MgaW4gZWFjaCBsb29wIHRvIG1ha2Ugc3VyZSB4IGlzIG5vdCAwLgorSWYgeCBpcyB6ZXJvLCB0aGVuIGl0IHN0YXJ0cyBiYWNrIHdpdGggdGhlIHRlc3QgZXhwcmVzc2lvbiB3aXRob3V0CitmaW5pc2hpbmcgaXRzIGN1cnJlbnQgbG9vcC4KKyAKK0luIGEgZm9yKCkgZXhwcmVzc2lvbgorIGZvcih4PTM7IHg+LTU7IHgtLSkgeworICAgIGlmKCF4KSBjb250aW51ZTsKKyAgICB3cml0ZSgoMTAwL3gpKyJcbiIpOworIH0KKyB3cml0ZSgiRG9uZS5cbiIpOworSXQgd29ya3MgbXVjaCB0aGUgc2FtZSB3YXkuICBOb3RlIHRoaXMgZ2l2ZXMgZXhhY3RseSB0aGUgc2FtZSBvdXRwdXQKK2FzIGJlZm9yZS4gQXQgeD0xLCBpdCB0ZXN0cyB0byBzZWUgaWYgeCBpcyB6ZXJvLCBpdCBpcyBub3QsIHNvIGl0Cit3cml0ZXMgMTAwL3gsIHRoZW4gZ29lcyBiYWNrIHRvIHRoZSB0b3AsIHN1YnRyYWN0cyBvbmUgZnJvbSB4LCBjaGVja3MgdG8KK3NlZSBpZiBpdCBpcyB6ZXJvIGFnYWluLCBhbmQgaXQgaXMgemVybywgc28gaXQgZ29lcyBiYWNrIHRvIHRoZSB0b3AKK2FuZCBzdWJ0cmFjdHMgMSBhZ2Fpbi4KKyAKK2JyZWFrCitUaGlzIG9uZSBjZWFzZXMgdGhlIGZ1bmN0aW9uIG9mIGEgZmxvdyBjb250cm9sIHN0YXRlbWVudC4gIE5vIG1hdHRlcgord2hlcmUgeW91IGFyZSBpbiB0aGUgc3RhdGVtZW50LCB0aGUgY29udHJvbCBvZiB0aGUgcHJvZ3JhbSB3aWxsIGdvCit0byB0aGUgZW5kIG9mIHRoZSBsb29wLiAgU28sIGlmIGluIHRoZSBhYm92ZSBleGFtcGxlcywgd2UgaGFkCit1c2VkIGJyZWFrIGluc3RlYWQgb2YgY29udGludWUsIHRoZSBvdXRwdXQgd291bGQgaGF2ZSBsb29rZWQgbGlrZSB0aGlzOgorIAorMzMKKzUwCisxMDAKK0RvbmUuCisgCitjb250aW51ZSBpcyBtb3N0IG9mdGVuIHVzZWQgd2l0aCB0aGUgZm9yKCkgYW5kIHdoaWxlKCkgc3RhdGVtZW50cy4KK2JyZWFrIGhvd2V2ZXIgaXMgbW9zdGx5IHVzZWQgd2l0aCBzd2l0Y2goKQorIAorc3dpdGNoKG5hbWUpIHsKKyAgICBjYXNlICJkZXNjYXJ0ZXMiOiB3cml0ZSgiWW91IGFyZSBib3JnLlxuIik7IGJyZWFrOworICAgIGNhc2UgImZsYW1tZSI6IHdyaXRlKCJZb3UgYXJlIGZsYW1tZS5cbiIpOyBicmVhazsKKyAgICBjYXNlICJmb3Jsb2NrIjogd3JpdGUoIllvdSBhcmUgZm9ybG9jay5cbiIpOyBicmVhazsKKyAgICBjYXNlICJzaGFkb3d3b2xmIjogd3JpdGUoIllvdSBhcmUgc2hhZG93d29sZi5cbiIpOyBicmVhazsKKyAgICBkZWZhdWx0OiB3cml0ZSgiWW91IHdpbGwgYmUgYXNzaW1pbGF0ZWQuXG4iKTsKK30KKyAKK1RoaXMgZnVuY3Rpb25zIGp1c3QgbGlrZToKKyAKK2lmKG5hbWUgPT0gImRlc2NhcnRlcyIpIHdyaXRlKCJZb3UgYXJlIGJvcmcuXG4iKTsKK2Vsc2UgaWYobmFtZSA9PSAiZmxhbW1lIikgd3JpdGUoIllvdSBhcmUgZmxhbW1lLlxuIik7CitlbHNlIGlmKG5hbWUgPT0gImZvcmxvY2siKSB3cml0ZSgiWW91IGFyZSBmb3Jsb2NrLlxuIik7CitlbHNlIGlmKG5hbWUgPT0gInNoYWRvd3dvbGYiKSB3cml0ZSgiWW91IGFyZSBzaGFkb3d3b2xmLlxuIik7CitlbHNlIHdyaXRlKCJZb3Ugd2lsbCBiZSBhc3NpbWlsYXRlZC5cbiIpOworIAorZXhjZXB0IHRoZSBzd2l0Y2ggc3RhdGVtZW50IGlzIG11Y2ggYmV0dGVyIG9uIHRoZSBDUFUuCitJZiBhbnkgb2YgdGhlc2UgYXJlIHBsYWNlZCBpbiBuZXN0ZWQgc3RhdGVtZW50cywgdGhlbiB0aGV5IGFsdGVyIHRoZQorZmxvdyBvZiB0aGUgbW9zdCBpbW1lZGlhdGUgc3RhdGVtZW50LgorIAorNy44IENoYXB0ZXIgc3VtbWFyeQorVGhpcyBjaGFwdGVyIGNvdmVyZWQgb25lIGhlbGwgb2YgYSBsb3QsIGJ1dCBpdCB3YXMgc3R1ZmYgdGhhdCBuZWVkZWQgdG8KK2JlIHNlZW4gYWxsIGF0IG9uY2UuICBZb3Ugc2hvdWxkIG5vdyBjb21wbGV0ZWx5IHVuZGVyc3RhbmQgaWYoKSBmb3IoKQord2hpbGUoKSBkb3t9IHdoaWxlKCkgYW5kIHN3aXRjaCgpLCBhcyB3ZWxsIGFzIGhvdyB0byBhbHRlciB0aGVpciBmbG93Cit1c2luZyByZXR1cm4sIGNvbnRpbnVlLCBhbmQgYnJlYWsuICBFZmZlY2llbmN5IHNheXMgaWYgaXQgY2FuIGJlIGRvbmUgaW4KK2EgbmF0dXJhbCB3YXkgdXNpbmcgc3dpdGNoKCkgaW5zdGVhZCBvZiBhIGxvdCBvZiBpZigpIGVsc2UgaWYoKSdzLCB0aGVuCitieSBhbGwgbWVhbnMgZG8gaXQuICBZb3Ugd2VyZSBhbHNvIGludHJvZHVjZWQgdG8gdGhlIGlkZWEgb2YgY2FsbGluZworZnVuY3Rpb25zIGluIG90aGVyIG9iamVjdHMuICBUaGF0IGhvd2V2ZXIsIGlzIGEgdG9waWMgdG8gYmUgZGV0YWlsZWQgbGF0ZXIuCitZb3Ugbm93IHNob3VsZCBiZSBjb21wbGV0ZWx5IGF0IGVhc2Ugd3JpdGluZyBzaW1wbGUgcm9vbXMgKGlmIHlvdSBoYXZlCityZWFkIHlvdXIgbXVkbGliJ3Mgcm9vbSBidWlsZGluZyBkb2N1bWVudCksIHNpbXBsZSBtb25zdGVycywgYW5kCitvdGhlciBzb3J0cyBvZiBzaW1wbGUgb2JqZWN0cy4KZGlmZiAtLWdpdCBhL2RvYy9LVVJTL0xQQy1LVVJTL2NoYXB0ZXI4IGIvZG9jL0tVUlMvTFBDLUtVUlMvY2hhcHRlcjgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc5NDcxMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9LVVJTL0xQQy1LVVJTL2NoYXB0ZXI4CkBAIC0wLDAgKzEsMTk1IEBACisgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEMgQmFzaWNzCisgICAgICAgICAgICAgICAgICBXcml0dGVuIGJ5IERlc2NhcnRlcyBvZiBCb3JnCisgICAgICAgICAgICAgICAgICBmaXJzdCBlZGl0aW9uOiAyMyBhcHJpbCAxOTkzCisgICAgICAgICAgICAgICAgICBzZWNvbmQgZWRpdGlvbjogMTIganVseSAxOTkzCisKK0NIQVBURVIgODogVGhlIGRhdGEgdHlwZSAib2JqZWN0IgorCis4LjEgUmV2aWV3CitZb3Ugc2hvdWxkIG5vdyBiZSBhYmxlIHRvIGRvIGFueXRoaW5nIHNvIGxvbmcgYXMgeW91IHN0aWNrIHRvIGNhbGxpbmcKK2Z1bmN0aW9ucyB3aXRoaW4geW91ciBvd24gb2JqZWN0LiAgWW91IHNob3VsZCBhbHNvIGtub3csIHRoYXQgYXQgdGhlCitiYXJlIG1pbmltdW0geW91IGNhbiBnZXQgdGhlIGNyZWF0ZSgpIChvciByZXNldCgpKSBmdW5jdGlvbiBpbiB5b3VyIG9iamVjdAorY2FsbGVkIHRvIHN0YXJ0IGp1c3QgYnkgbG9hZGluZyBpdCBpbnRvIG1lbW9yeSwgYW5kIHRoYXQgeW91ciByZXNldCgpCitmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBldmVyeSBub3cgYW5kIHRoZW4gc28gdGhhdCB5b3UgbWF5IHdyaXRlIHRoZQorY29kZSBuZWNlc3NhcnkgdG8gcmVmcmVzaCB5b3VyIHJvb20uICBOb3RlIHRoYXQgbmVpdGhlciBvZiB0aGVzZQorZnVuY3Rpb25zIE1VU1QgYmUgaW4geW91ciBvYmplY3QuICBUaGUgZHJpdmVyIGNoZWNrcyB0byBzZWUgaWYgdGhlCitmdW5jdGlvbiBleGlzdHMgaW4geW91ciBvYmplY3QgZmlyc3QuICBJZiBpdCBkb2VzIG5vdCwgdGhlbiBpdCBkb2VzIG5vdAorYm90aGVyLiAgWW91IGFyZSBhbHNvIGFjcXVhaW50ZWQgd2l0aCB0aGUgZGF0YSB0eXBlcyB2b2lkLCBpbnQsIGFuZCBzdHJpbmcuCisgCis3LjIgT2JqZWN0cyBhcyBkYXRhIHR5cGVzCitJbiB0aGlzIGNoYXB0ZXIgeW91IHdpbGwgYmUgYWNxdWFpbnRlZCB3aXRoIGEgbW9yZSBjb21wbGV4IGRhdGEgdHlwZSwKK29iamVjdC4gIEFuIG9iamVjdCB2YXJpYWJsZSBwb2ludHMgdG8gYSByZWFsIG9iamVjdCBsb2FkZWQgaW50byB0aGUKK2RyaXZlcidzIG1lbW9yeS4gIFlvdSBkZWNsYXJlIGl0IGluIHRoZSBzYW1lIG1hbm5lciBhcyBvdGhlciBkYXRhIHR5cGVzOgorICAgIG9iamVjdCBvYjsKK0l0IGRpZmZlcnMgaW4gdGhhdCB5b3UgY2Fubm90IHVzZSArLCAtLCArPSwgLT0sICosIG9yIC8gKHdoYXQgd291bGQgaXQKK21lYW4gdG8gZGl2aWRlIGEgbW9uc3RlciBieSBhbm90aGVyIG1vbnN0ZXI/KS4gIEFuZCBzaW5jZSBlZnVucyBsaWtlCitzYXkoKSBhbmQgd3JpdGUoKSBvbmx5IHdhbnQgc3RyaW5ncyBvciBpbnRzLCB5b3UgY2Fubm90IHdyaXRlKCkgb3IKK3NheSgpIHRoZW0gKGFnYWluLCB3aGF0IHdvdWxkIGl0IG1lYW4gdG8gc2F5IGEgbW9uc3Rlcj8pLgorQnV0IHlvdSBjYW4gdXNlIHRoZW0gd2l0aCBzb21lIG90aGVyIG9mIHRoZSBtb3N0IGltcG9ydGFudCBlZnVucyBvbiBhbnkKK0xQTXVkLgorIAorOC4zIFRoZSBlZnVuOiB0aGlzX29iamVjdCgpCitUaGlzIGlzIGFuIGVmdW4gd2hpY2ggcmV0dXJucyBhbiBvYmplY3QgaW4gd2hpY2ggdGhlIGZ1bmN0aW9uIGJlaW5nIGV4ZWN1dGVkCitleGlzdHMuICBJbiBvdGhlciB3b3JkcywgaW4gYSBmaWxlLCB0aGlzX29iamVjdCgpIHJlZmVycyB0byB0aGUgb2JqZWN0IHlvdXIKK2ZpbGUgaXMgaW4gd2hldGhlciB0aGUgZmlsZSBnZXRzIGNsb25lZCBpdHNlbGYgb3IgaW5oZXJ0ZWQgYnkgYW5vdGhlciBmaWxlLgorSXQgaXMgb2Z0ZW4gdXNlZnVsIHdoZW4geW91IGFyZSB3cml0aW5nIGEgZmlsZSB3aGljaCBpcyBnZXR0aW5nIGluaGVyaXRlZAorYnkgYW5vdGhlciBmaWxlLiAgU2F5IHlvdSBhcmUgd3JpdGluZyB5b3VyIG93biBsaXZpbmcuYyB3aGljaCBnZXRzCitpbmhlcml0ZWQgYnkgdXNlci5jIGFuZCBtb25zdGVyLmMsIGJ1dCBuZXZlciB1c2VkIGFsb25lLiAgWW91IHdhbnQgdG8gbG9nCit0aGUgZnVuY3Rpb24gc2V0X2xldmVsKCkgaXQgaXMgYSBwbGF5ZXIncyBsZXZlbCBiZWluZyBzZXQgKGJ1dCB5b3UgZG8gbm90CitjYXJlIGlmIGl0IGlzIGEgbW9uc3Rlci4KK1lvdSBtaWdodCBkbyB0aGlzOgorIAordm9pZCBzZXRfbGV2ZWwoaW50IHgpIHsKKyAgICBpZih0aGlzX29iamVjdCgpLT5pc19wbGF5ZXIoKSkgbG9nX2ZpbGUoImxldmVscyIsICJmb29cbiIpOworICAgIGxldmVsID0geDsKK30KKyAKK1NpbmNlIGlzX3BsYXllcigpIGlzIG5vdCBkZWZpbmVkIGluIGxpdmluZy5jIG9yIGFueXRoaW5nIGl0IGluaGVyaXRzLAoranVzdCBzYXlpbmcgaWYoaXNfcGxheWVyKCkpIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yIHNpbmNlIHRoZSBkcml2ZXIKK2RvZXMgbm90IGZpbmQgdGhhdCBmdW5jdGlvbiBpbiB5b3VyIGZpbGUgb3IgYW55dGhpbmcgaXQgaW5oZXJpdHMuCit0aGlzX29iamVjdCgpIGFsbG93cyB5b3UgdG8gYWNjZXNzIGZ1bmN0aW9ucyB3aGljaCBtYXkgb3IgbWF5IG5vdCBiZQorcHJlc2VudCBpbiBhbnkgZmluYWwgcHJvZHVjdHMgYmVjYXVzZSB5b3VyIGZpbGUgaXMgaW5oZXJpdGVkIGJ5IG90aGVycword2l0aG91dCByZXN1bHRpbmcgaW4gYW4gZXJyb3IuCisgCis4LjQgQ2FsbGluZyBmdW5jdGlvbnMgaW4gb3RoZXIgb2JqZWN0cworVGhpcyBvZiBjb3Vyc2UgaW50cm9kdWNlcyB1cyB0byB0aGUgbW9zdCBpbXBvcnRhbnQgY2hhcmFjdGVyaXN0aWMgb2YKK3RoZSBvYmplY3QgZGF0YSB0eXBlLiAgSXQgYWxsb3dzIHVzIHRvIGFjY2VzcyBmdW5jdGlvbnMgaW4gb3RoZXIgb2JqZWN0cy4KK0luIHByZXZpb3VzIGV4YW1wbGVzIHlvdSBoYXZlIGJlZW4gYWJsZSB0byBmaW5kIG91dCBhYm91dCBhIHBsYXllcidzIGxldmVsLAorcmVkdWNlIHRoZSBtb25leSB0aGV5IGhhdmUsIGFuZCBob3cgbXVjaCBocCB0aGV5IGhhdmUuCitDYWxscyB0byBmdW5jdGlvbnMgaW4gb3RoZXIgb2JqZWN0cyBtYXkgYmUgZG9uZSBpbiB0d28gd2F5czoKKyAKK29iamVjdC0+ZnVuY3Rpb24ocGFyYW1ldGVycykKK2NhbGxfb3RoZXIob2JqZWN0LCAiZnVuY3Rpb24iLCBwYXJhbWV0ZXJzKTsKKyAKK2V4YW1wbGU6Cit0aGlzX3BsYXllcigpLT5hZGRfbW9uZXkoInNpbHZlciIsIC01KTsKK2NhbGxfb3RoZXIodGhpc19wbGF5ZXIoKSwgImFkZF9tb25leSIsICJzaWx2ZXIiLCAtNSk7CisgCitJbiBzb21lICh2ZXJ5IGxvb3NlIHNlbnNlKSwgdGhlIGdhbWUgaXMganVzdCBhIGNoYWluIHJlYWN0aW9uIG9mIGZ1bmN0aW9uCitjYWxscyBpbml0aWF0ZWQgYnkgcGxheWVyIGNvbW1hbmRzLiAgV2hlbiBhIHBsYXllciBpbml0aWF0ZXMgYSBjaGFpbiBvZgorZnVuY3Rpb24gY2FsbHMsIHRoYXQgcGxheWVyIGlzIHRoZSBvYmplY3Qgd2hpY2ggaXMgcmV0dXJuZWQgYnkKK3RoZSBlZnVuIHRoaXNfcGxheWVyKCkuICBTbywgc2luY2UgdGhpc19wbGF5ZXIoKSBjYW4gY2hhbmdlIGRlcGVuZGluZworb24gd2hvIGluaXRpYXRlZCB0aGUgc2VxdWVuY2Ugb2YgZXZlbnRzLCB5b3Ugd2FudCB0byBiZSB2ZXJ5IGNhcmVmdWwKK2FzIHRvIHdoZXJlIHlvdSBwbGFjZSBjYWxscyB0byBmdW5jdGlvbnMgaW4gdGhpc19wbGF5ZXIoKS4gIFRoZSBtb3N0IGNvbW1vbgorcGxhY2UgeW91IGRvIHRoaXMgaXMgdGhyb3VnaCB0aGUgbGFzdCBpbXBvcnRhbnQgbGZ1biAod2UgaGF2ZSBtZW50aW9uZWQKK2NyZWF0ZSgpIGFuZCByZXNldCgpKSBpbml0KCkuCisgCis4LjUgVGhlIGxmdW46IGluaXQoKQorQW55IHRpbWUgYSBsaXZpbmcgdGhpbmcgZW5jb3VudGVycyBhbiBvYmplY3QgKGVudGVycyBhIG5ldyByb29tLCBvciBlbnRlcnMKK3RoZSBzYW1lIHJvb20gYXMgYSBjZXJ0YWluIG90aGVyIG9iamVjdCksIGluaXQoKSBpcyBjYWxsZWQgaW4gYWxsIG9mCit0aGUgb2JqZWN0cyB0aGUgbGl2aW5nIGJlaW5nIG5ld2x5IGVuY291bnRlcnMuICBJdCBpcyBhdCB0aGlzIHBvaW50Cit0aGF0IHlvdSBjYW4gYWRkIGNvbW1hbmRzIHRoZSBwbGF5ZXIgY2FuIGlzc3VlIGluIG9yZGVyIHRvIGFjdC4KK0hlcmUgaXMgYSBzYW1wbGUgaW5pdCgpIGZ1bmN0aW9uIGluIGEgZmxvd2VyLgorIAordm9pZCBpbml0KCkgeworICAgIDo6aW5pdCgpOworICAgIGFkZF9hY3Rpb24oInNtZWxsX2Zsb3dlciIsICJzbWVsbCIpOworfQorIAorSXRvIHNtZWxsX2Zsb3dlcigpLiAgU28geW91IHNob3VsZCBoYXZlIHNtZWxsX2Zsb3dlcigpIGxvb2sgbGlrZSB0aGlzOgorIAorMSBpbnQgc21lbGxfZmxvd2VyKHN0cmluZyBzdHIpOyAgICAgICAgLyogYWN0aW9uIGZ1bmN0aW9ucyBhcmUgdHlwZSBpbnQgKi8KKzIKKzMgaW50IHNtZWxsX2Zsb3dlcihzdHJpbmcgc3RyKSB7Cis0ICAgIGlmKHN0ciAhPSAiZmxvd2VyIikgcmV0dXJuIDA7ICAgICAvKiBpdCBpcyBub3QgdGhlIGZsb3dlciBiZWluZyBzbWVsbGVkICovCis1ICAgIHdyaXRlKCJZb3Ugc25pZmYgdGhlIGZsb3dlci5cbiIpOworNiAgICBzYXkoKHN0cmluZyl0aGlzX3BsYXllcigpLT5xdWVyeV9jYXBfbmFtZSgpKyIgc21lbGxzIHRoZSBmbG93ZXIuXG4iKTsKKzcgICAgdGhpc19wbGF5ZXIoKS0+YWRkX2hwKHJhbmRvbSg1KSk7Cis4ICAgIHJldHVybiAxOworOSB9CisgCitJbiBsaW5lIDEsIHdlIGhhdmUgb3VyIGZ1bmN0aW9uIGRlY2xhcmVkLgorSW4gbGluZSAzLCBzbWVsbF9mbG93ZXIoKSBiZWdpbnMuICBzdHIgYmVjb21lcyB3aGF0ZXZlciBjb21lcyBhZnRlciB0aGUKKyAgICBwbGF5ZXJzIGNvbW1hbmQgKG5vdCBpbmNsdWRpbmcgdGhlIGZpcnN0IHdoaXRlIHNwYWNlKS4KK0luIGxpbmUgNCwgaXQgY2hlY2tzIHRvIHNlZSBpZiB0aGUgcGxheWVyIGhhZCB0eXBlZCAic21lbGwgZmxvd2VyIi4gIElmCisgICAgdGhlIHBsYXllciBoYWQgdHlwZWQgInNtZWxsIGNoZWVzZSIsIHRoZW4gc3RyIHdvdWxkIGJlICJjaGVlc2UiLiAgSWYKKyAgICBpdCBpcyBub3QgaW4gZmFjdCAiZmxvd2VyIiB3aGljaCBpcyBiZWluZyBzbWVsbGVkLCB0aGVuIDAgaXMgcmV0dXJuZWQsCisgICAgbGV0dGluZyB0aGUgZHJpdmVyIGtub3cgdGhhdCB0aGlzIHdhcyBub3QgdGhlIGZ1bmN0aW9uIHdoaWNoIHNob3VsZAorICAgIGhhdmUgYmVlbiBjYWxsZWQuICBJZiBpbiBmYWN0IHRoZSBwbGF5ZXIgaGFkIGEgcGllY2Ugb2YgY2hlZXNlIGFzIHdlbGwKKyAgICB3aGljaCBoYWQgYSBzbWVsbCBjb21tYW5kIHRvIGl0LCB0aGUgZHJpdmVyIHdvdWxkIHRoZW4gY2FsbCB0aGUgZnVuY3Rpb24KKyAgICBmb3Igc21lbGxpbmcgaW4gdGhhdCBvYmplY3QuICBUaGUgZHJpdmVyIHdpbGwga2VlcCBjYWxsaW5nIGFsbCBmdW5jdGlvbnMKKyAgICB0aWVkIHRvIHNtZWxsIGNvbW1hbmRzIHVudGlsIG9uZSBvZiB0aGVtIHJldHVybnMgMS4gIElmIHRoZXkgYWxsIHJldHVybgorICAgIDAsIHRoZW4gdGhlIHBsYXllciBzZWVzICJXaGF0PyIKK0luIGxpbmUgNSwgdGhlIGVmdW4gd3JpdGUoKSBpcyBjYWxsZWQuICB3cml0ZSgpIHByaW50cyB0aGUgc3RyaW5nIHdoaWNoCisgICAgaXMgcGFzc2VkIHRvIGl0IHRvIHRoaXNfcGxheWVyKCkuICBTbyB3aG9ldmVyIHR5cGVkIHRoZSBjb21tYW5kIGhlcmUKKyAgICBzZWVzICJZb3Ugc25pZmYgdGhlIGZsb3dlci4iCitJbiBsaW5lIDYsIHRoZSBlZnVuIHNheSgpIGlzIGNhbGxlZC4gIHNheSgpIHByaW50cyB0aGUgc3RyaW5nIHdoaWNoIGlzCisgICAgZG9pbmcgdGhlIHNuaWZmaW5nLCB3ZSBoYXZlIHRvIGNhbGwgdGhlIHF1ZXJ5X2NhcF9uYW1lKCkgZnVuY3Rpb24KKyAgICBpbiB0aGlzX3BsYXllcigpLiAgVGhhdCB3YXkgaWYgdGhlIHBsYXllciBpcyBpbnZpcywgaXQgd2lsbCBzYXkKKyAgICAiU29tZW9uZSIgKG9yIHNvbWV0aGluZyBsaWtlIHRoYXQpLCBhbmQgaXQgd2lsbCBhbHNvIGJlIHByb3Blcmx5CisgICAgY2FwaXRhbGl6ZWQuCitJbiBsaW5lIDcsIHdlIGNhbGwgdGhlIGFkZF9ocCgpIGZ1bmN0aW9uIGluIHRoZSB0aGlzX3BsYXllcigpIG9iamVjdCwKKyAgICBzaW5jZSB3ZSB3YW50IHRvIGRvIGEgbGl0dGxlIGhlYWxpbmcgZm9yIHRoZSBzbmlmZiAoTm90ZTogZG8gbm90CisgICAgY29kZSB0aGlzIG9iamVjdCBvbiB5b3VyIG11ZCwgd2hvZXZlciBiYWxhbmNlcyB5b3VyIG11ZCB3aWxsIHNob290IHlvdSkuCitJbiBsaW5lIDgsIHdlIHJldHVybiBjb250cm9sIG9mIHRoZSBnYW1lIHRvIHRoZSBkcml2ZXIsIHJldHVybmluZyAxIHRvCisgICAgbGV0IGl0IGtub3cgdGhhdCB0aGlzIHdhcyBpbiBmYWN0IHRoZSByaWdodCBmdW5jdGlvbiB0byBjYWxsLgorIAorOC42IEFkZGluZyBvYmplY3RzIHRvIHlvdXIgcm9vbXMKK0FuZCBub3csIHVzaW5nIHRoZSBkYXRhIHR5cGUgb2JqZWN0LCB5b3UgY2FuIGFkZCBtb25zdGVycyB0byB5b3VyIHJvb21zOgorIAordm9pZCBjcmVhdGUoKSB7CisgICAgOjpjcmVhdGUoKTsKKyAgICBzZXRfcHJvcGVydHkoImxpZ2h0IiwgMyk7CisgICAgc2V0KCJzaG9ydCIsICJLcmFzbmEgU3F1YXJlIik7CisgICAgc2V0KCJsb25nIiwgIldlbGNvbWUgdG8gdGhlIENlbnRyYWwgU3F1YXJlIG9mIHRoZSB0b3duIG9mIFByYXhpcy5cbiIpOworICAgIHNldF9leGl0cyggKHsgImQvc3RhbmRhcmQvaGFsbCIgfSksICh7ICJlYXN0IiB9KSApOworfQorIAordm9pZCByZXNldCgpIHsKKyAgICBvYmplY3Qgb2I7CisgCisgICAgOjpyZXNldCgpOworICAgIGlmKHByZXNlbnQoImd1YXJkIikpIHJldHVybjsgICAgIC8qIERvIG5vdCB3YW50IHRvIGFkZCBhIGd1YXJkIGlmICovCisgICAgb2IgPSBuZXcoIi9zdGQvbW9uc3RlciIpOyAgICAgICAgLyogb25lIGlzIGFscmVhZHkgaGVyZSAgICAgICAgICAgKi8KKyAgICBvYi0+c2V0X25hbWUoImd1YXJkIik7CisgICAgb2ItPnNldCgiaWQiLCAoeyAiZ3VhcmQiLCAidG93biBndWFyZCIgfSkgKTsKKyAgICBvYi0+c2V0KCJzaG9ydCIsICJUb3duIGd1YXJkIik7CisgICAgb2ItPnNldCgibG9uZyIsICJIZSBndWFyZHMgUHJheGlzIGZyb20gbm90aGluZ25lc3MuXG4iKTsKKyAgICBvYi0+c2V0X2dlbmRlcigibWFsZSIpOworICAgIG9iLT5zZXRfcmFjZSgiaHVtYW4iKTsKKyAgICBvYi0+c2V0X2xldmVsKDEwKTsKKyAgICBvYi0+c2V0X2FsaWdubWVudCgyMDApOworICAgIG9iLT5zZXRfaHVtYW5vaWQoKTsKKyAgICBvYi0+c2V0X2hwKDE1MCk7CisgICAgb2ItPnNldF93aWVsZGluZ19saW1icyggKHsgInJpZ2h0IGhhbmQiLCAibGVmdCBoYW5kIiB9KSApOworICAgIG9iLT5tb3ZlKHRoaXNfb2JqZWN0KCkpOworfQorIAorTm93LCB0aGlzIHdpbGwgYmUgd2lsZGx5IGRpZmZlcmVudCBvbiBtb3N0IG11ZHMuICBTb21lLCBhcyBub3RlZCBiZWZvcmUsCitpbiB0aGF0IG9iamVjdCBzbyB5b3UgaGF2ZSBhIHVuaXF1ZWx5IGNvbmZpZ3VyZWQgbW9uc3RlciBvYmplY3QuICBUaGUKK2xhc3QgYWN0IGluIG5hdGl2ZSBtdWRzIGlzIHRvIGNhbGwgbW92ZSgpIGluIHRoZSBtb25zdGVyIG9iamVjdCB0byBtb3ZlCitpdCB0byB0aGlzIHJvb20gKHRoaXNfb2JqZWN0KCkpLiAgSW4gY29tcGF0IG11ZHMsIHlvdSBjYWxsIHRoZSBlZnVuCittb3ZlX29iamVjdCgpIHdoaWNoIHRha2VzIHR3byBwYXJhbWV0ZXJzLCB0aGUgb2JqZWN0IHRvIGJlIG1vdmVkLCBhbmQgdGhlCitvYmplY3QgaW50byB3aGljaCBpdCBpcyBiZWluZyBtb3ZlZC4KKyAKKzguNyBDaGFwdGVyIHN1bW1hcnkKK0F0IHRoaXMgcG9pbnQsIHlvdSBub3cgaGF2ZSBlbm91Z2gga25vd2xlZGdlIHRvIGNvZGUgc29tZSByZWFsbHkgbmljZQorc3R1ZmYuICBPZiBjb3Vyc2UsIGFzIEkgaGF2ZSBiZWVuIHN0cmVzc2luZyBhbGwgYWxvbmcsIHlvdSByZWFsbHkgbmVlZAordG8gcmVhZCB0aGUgZG9jdW1lbnRzIG9uIGJ1aWxkaW5nIGZvciB5b3VyIG11ZCwgYXMgdGhleSBkZXRhaWwgd2hpY2gKK2Z1bmN0aW9ucyBleGlzdCBpbiB3aGljaCB0eXBlcyBvZiBvYmplY3RzIGZvciB5b3UgdG8gY2FsbC4gIE5vIG1hdHRlcgord2hhdCB5b3VyIGtub3dsZWRnZSBvZiB0aGUgbXVkbGliIGlzLCB5b3UgaGF2ZSBlbm91Z2gga25vdy1ob3cgdG8KK2dpdmUgYSBwbGF5ZXIgZXh0cmEgdGhpbmdzIHRvIGRvIGxpa2Ugc25pZmZpbmcgZmxvd2VycyBvciBnbHVlIG9yIHdoYXRldmVyLgorQXQgdGhpcyBwb2ludCB5b3Ugc2hvdWxkIGdldCBidXN5IGNvZGluZyBzdHVmZi4gIEJ1dCB0aGUgbW9tZW50IHRoaW5ncworZXZlbiBsb29rIHRvIGJlY29tZSB0ZWRpb3VzLCB0aGF0IG1lYW5zIGl0IGlzIHRpbWUgZm9yIHlvdSB0byBtb3ZlIHRvCit0aGUgbmV4dCBsZXZlbCBhbmQgZG8gbW9yZS4gIFJpZ2h0IG5vdyBjb2RlIHlvdXJzZWxmIGEgc21hbGwgYXJlYS4KK01ha2UgZXh0ZW5zaXZlIHVzZSBvZiB0aGUgc3BlY2lhbCBmdW5jdGlvbnMgY29kZWQgaW4geW91ciBtdWQncworcm9vbS5jIChzZWFyY2ggdGhlIGRvY3MgZm9yIG9ic2N1cmUgb25lcyBubyBvbmUgZWxzZSBzZWVtcyB0byB1c2UpLgorQWRkIGxvdHMgbycgbmVhdCBhY3Rpb25zLiAgQ3JlYXRlIHdlYXBvbnMgd2hpY2ggaGF2ZSBtYWdpYyBwb3dlcnMgd2hpY2gKK2dyYWR1YWxseSBmYWRlIGF3YXkuICBBbGwgb2YgdGhpcyB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gZG8gbm93LiAgT25jZQordGhpcyBiZWNvbWVzIHJvdXRpbmUgZm9yIHlvdSwgaXQgd2lsbCBiZSB0aW1lIHRvIG1vdmUgb24gdG8gaW50ZXJtZWRpYXRlCitzdHVmZi4gIE5vdGUgdGhhdCBmZXcgcGVvcGxlIGFjdHVhbGx5IGdldCB0byB0aGUgaW50ZXJtZWRpYXRlIHN0dWZmLgorSWYgeW91IGhhdmUgcGxheWVkIGF0IGFsbCwgeW91IG5vdGljZSB0aGVyZSBhcmUgZmV3IGFyZWFzIG9uIHRoZSBtdWQKK3doaWNoIGRvIHdoYXQgSSBqdXN0IHRvbGQgeW91IHlvdSBzaG91bGQgYmUgYWJsZSB0byBkby4gIEl0IGlzIG5vdAorYmVjYXVzZSBpdCBpcyBoYXJkLCBidXQgYmVjYXVzZSB0aGVyZSBpcyBhIGxvdCBvZiBhcnJvZ2FuY2Ugb3V0IHRoZXJlCitvbiB0aGUgcGFydCBvZiBwZW9wbGUgd2hvIGhhdmUgZ290dGVuIGJleW9uZCB0aGlzIHBvaW50LCBhbmQgdmVyeSBsaXR0bGUKK2NvbW11bmljYXRpbmcgb2YgdGhhdCBrbm93bGVkZ2UuICBUaGUgdHJpY2sgaXMgdG8gcHVzaCB5b3Vyc2VsZiBhbmQKK3RoaW5rIG9mIHNvbWV0aGluZyB5b3Ugd2FudCB0byBkbyB0aGF0IGlzIGltcG9zc2libGUuICBJZiB5b3UgYXNrIHNvbWVvbmUKK2luIHRoZSBrbm93IGhvdyB0byBkbyBYLCBhbmQgdGhleSBzYXkgdGhhdCBpcyBpbXBvc3NpYmxlLCBmaW5kIG91dAoreW91c2VsZiBob3cgdG8gY29kZSBpdCBieSBleHBlcmltZW50aW5nLgorCitHZW9yZ2UgUmVlc2UKK0Rlc2NhcnRlcyBvZiBCb3JnCisxMiBqdWx5IDE5OTMKK2JvcmdAaGVicm9uLmNvbm5lY3RlZC5jb20KK0Rlc2NhcnRlc0BOaWdodG1hcmUgKGludGVybXVkKQorRGVzY2FydGVzQElnb3IgKG5vdCBpbnRlcm11ZCkKZGlmZiAtLWdpdCBhL2RvYy9LVVJTL0xQQy1LVVJTMi9Db250ZW50cyBiL2RvYy9LVVJTL0xQQy1LVVJTMi9Db250ZW50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjU4YThhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL0tVUlMvTFBDLUtVUlMyL0NvbnRlbnRzCkBAIC0wLDAgKzEsMTUgQEAKK0ludGVybWVkaWF0ZSBMUEMKK0Rlc2NhcnRlcyBvZiBCb3JnIAorTm92ZW1iZXIgMTk5MworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRzCisKKzE6IEludHJvZHVjdGlvbgorMjogVGhlIExQTXVkIERyaXZlcgorMzogQ29tcGxleCBEYXRhIFR5cGVzCis0OiBUaGUgTFBDIFByZS1Db21waWxlcgorNTogQWR2YW5jZWQgU3RyaW5nIEhhbmRsaW5nCis2OiBJbnRlcm1lZGlhdGUgSW5oZXJpdGFuY2UKKzc6IERlYnVnZ2luZworCitDb3B5cmlnaHQgKGMpIEdlb3JnZSBSZWVzZSAxOTkzCmRpZmYgLS1naXQgYS9kb2MvS1VSUy9MUEMtS1VSUzIvQ29weXJpZ2h0IGIvZG9jL0tVUlMvTFBDLUtVUlMyL0NvcHlyaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWEyNjIwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL0tVUlMvTFBDLUtVUlMyL0NvcHlyaWdodApAQCAtMCwwICsxLDYyIEBACisgICAgICAgICAgICAgICAgICAgICAgSW50ZXJtZWRpYXRlIExQQyBmaXJzdCBlZGl0aW9uCisKK0NvcHlyaWdodCAoYykgMTk5MyBHZW9yZ2UgUmVlc2UKK0FsbCByaWdodHMgdG8gdGhpcyB0ZXh0IGFyZSByZXRhaW5lZCBieSB0aGUgYXV0aG9yLgorCisKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBkaXN0cnVidXRlIGFuZCBkaXNwbGF5IHRoZSBjb250ZW50cyBvZiB0aGlzCitkb2N1bWVudCBpbiBmdWxsIHNvIGxvbmcgYXMgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisxKSBObyBwYXltZW50IG1heSBiZSByZWNlaXZlZCBmb3IgdGhlIHJlZGlzdHJpYnV0aW9uIG9yIGRpc3BsYXkgb2YgdGhpcyB0ZXh0LAorZXhjZXB0IHRvIGNvdmVyIHRoZSBjb3N0cyBmb3IgZGlzdHJpYnV0aW9uIG1lZGlhIGFuZCBhbmQgc2hpcHBpbmcgYW5kL29yCit0cmFuc21pc3Npb24gY2hhcmdlcy4KKzIpIFRoZSB0ZXh0Ym9vayBtdXN0IGJlIGRpc3RyaWJ1dGVkIG9yIGRpc3BsYXllZCBpbiBpdHMgZW50aXJldHkgaW4gaXRzIG9yaWdpbmFsCitmb3JtLiAgQ2hhbmdlcyBtYXkgb25seSBiZSBtYWRlIHRvIHByaXZhdGUsIGluZGl2aWR1YWwgY29waWVzLCBleGNlcHQgYXMKK291dGxpbmVkIGJlbG93LgorCitBY2NlcHRhYmxlIGNoYW5nZXMgYXJlIGRlZmluZWQgYXMgdGhlIGZvbGxvd2luZzoKKzEpIEZvcm1hdCBjaGFuZ2VzLCBzdWNoIGFzIGNoYW5naW5nIGZyb20gV29yZFBlcmZlY3QgdG8gV29yZCAKKzIpIE1lZGl1bSBjaGFuZ2VzLCBzdWNoIGFzIGZyb20gZWxlY3Ryb25pYyBjb3B5IHRvIHBhcGVyCiszKSBDb250ZW50IGNoYW5nZXMgYXJlIG9ubHkgYWNjZXB0YWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIGNpcmN1bXN0YW5jZXM6CisJYSkgSW4gZWxlY3Ryb25pYyBtZWRpYTogbm9uZSBvZiB0aGUgb3JpZ2luYWwgdGV4dCBtYXkgYmUgb21taXR0ZWQuIAorICAgICAgICBZb3UgbWF5IGFkZCBjb21tZW50cworCWFzIHlvdSBmZWVsIG5lY2Vzc2FyeSwgc28gbG9uZyBhcyBjb21tZW50cyBhcmUgZW5jbG9zZWQgaW4gPCogKj4KKyAgICAgICAgYW5kIGFyZSBhY2NvbXBhbmllZCBieQorCXRoZSBnYW1lIG5hbWUgb3IgcmVhbCBuYW1lIG9mIHRoZSBhdXRob3Igb2YgdGhlIGNvbW1lbnRzCisJYikgSW4gaGFyZCBjb3B5OiBub25lIG9mIHRoZSBvcmlnaW5hbCB0ZXh0IG1heSBiZSBvbWl0dGVkLCBidXQgaXQgbWF5CisgICAgICAgIGJlIHN0cnVjayBvdXQgc28gbG9uZworCWFzIHRoZSBjb250ZW50IG9mIHRoZSBvcmlnaW5hbCB0ZXh0IGlzIHZpc2libGUuICBDb21tZW50cyBtYXkgYmUgbWFkZQorICAgICAgICBpbiBhbnkgZm9ybSBzbyBsb25nIAorCWFzIHRoZXkgYXJlIG1hZGUgaW4gaGFuZHdyaXRpbmcgYW5kIHRoZXkgYXJlIHNpZ25lZCBieSB0aGUgYXV0aG9yLiAKKyAgICAgICAgQ29tbWVudHMgd2hpY2ggYXJlIHR5cGVkIG9yIHByaW50ZWQgbXVzdCBiZSBtYWRlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKKyAgICAgICAgZm9ybWF0IGZvciBlbGVjdHJvbmljIG1lZGlhLgorCitQcmFjdGljYWxseSBzcGVha2luZywgdGhpcyBpcyB3aGF0IEkgbWVhbjoKK0ZpcnN0LCBJIHdyb3RlIHRoaXMgbW9zdGx5IGZvciBtdWQgYWRtaW5zIHRvIHB1dCBvbnRvIHRoZWlyIG11ZHMgZm9yIGxlYXJuaW5nCitjb2RlcnMgdG8gcmVhZCBhcyB0aGV5IGFyZSBsZWFybmluZyB0byBidWlsZCByZWFsbXMuICBJIGRpZCBub3QgZG8gdGhpcyBmb3IKK3NvbWVvbmUgZWxzZSB0byBtYWtlIGEgYnVjay4gIFNvIGlmIHlvdSBjaGFyZ2UgbW9uZXkgZm9yIHJlZGlzdHJpYnV0aW5nIGl0CitvciBhbGxvd2luZyBzb21lb25lIGVsc2UgdG8gc2VlIGl0LCB5b3UgYXJlIGluIHZpb2xhdGlvbiBvZiB0aGlzIGNvcHlyaWdodC4gCitVbmxlc3MgeW91IGFyZSBzaW1wbHkgY2hhcmdpbmcgZm9yIHdoYXQgaXQgY29zdCB5b3UgdG8gcHJpbnQgdXAgYSBjb3B5IG9yCit3aGF0IHRoZSBkaXNrZXR0ZXMgYW5kIHBvc3RhZ2UgY29zdCB0byBtYWlsIGl0LgorU2Vjb25kLCBJIHdyb3RlIHRoaXMgdGV4dGJvb2ssIGFuZCBJIHNob3VsZCByZWNlaXZlIGNyZWRpdC9ibGFtZSBmb3Igd2hhdCBJCitzYXksIGFuZCBvdGhlcnMgc2hvdWxkIHJlY2VpdmUgY3JlZGl0L2JsYW1lIGZvciB3aGF0IHRoZXkgc2F5LiAgRm9yIGV4YW1wbGUsCitpZiBJIHNhaWQgc29tZXRoaW5nIGNvbXBsZXRlbHkgd3JvbmcsIGFuZCB5b3Ugc2ltcGx5IGNvcnJlY3RlZCBpdCwgSSB3b3VsZAorYmUgZ2V0dGluZyBjcmVkaXQgZm9yIHNvbWV0aGluZyBJIGRpZCBub3QgZG8uICBZZXQsIGlmIHlvdSBjb21tZW50IGFjY29yZGluZwordG8gdGhlIG91dGxpbmUgYWJvdmUsIHlvdSB3aWxsIGJlIHByb3Blcmx5IGNyZWRpdGVkIGZvciB5b3VyIGNvbW1lbnRzLiAKK01vcmUgaW1wb3J0YW50IHRvIG1lLCBob3dldmVyLCBpcyB0aGUgcHJhY3RpY2FsIGVmZmVjdCBvZiBoYXZpbmcgaHVuZHJlZHMgb2YKK2NvcGllcyBvZiB0aGlzIHRleHRib29rIGV2ZXJ5d2hlcmUuICBJZiB5b3UgY2hhbmdlIHNvbWV0aGluZyBJIGhhZCByaWdodAord2l0aG91dCBub3RpbmcgaXQgYXMgYSBjb21tZW50LCBJIHdpbGwgYmUgYmxhbWVkIGZvciBzcHJlYWRpbmcKK21pc2luZm9ybWF0aW9uLiAgVGhpcyBwcm9ibGVtIGlzIG9ubHkgY29tcHVuZGVkIGlmIHRoZSB0ZXh0IGlzIHJlZGlzdHJpYnV0ZWQuIAorU28gSSBwcmVmZXIgbXkgd29yZHMgdG8gcmVtYWluIG15IG93bi4gIEJ1dCwgd2hlbiBJIG1ha2UgbWlzdGFrZXMsIG9yIGlmCitzb21ldGhpbmcgSSBzYXkgZG9lcyBub3QgZml0IHlvdXIgZHJpdmVyL211ZGxpYiwgcGxlYXNlIGNvbW1lbnQgaXQgc28gcGVvcGxlCit3aWxsIGtub3cuICBJbiBhZGRpdGlvbiwgaGF2aW5nIHRoZSBjb21tZW50cyBzaWRlLWJ5LXNpZGUgYWxsb3dzIHBlb3BsZSB0bworc2VlIG90aGVyIGlkZWFzLCBsaWtlIGhvdyBhbm90aGVyIGRyaXZlciBtaWdodCBoYW5kbGUgc29tZXRoaW5nLgorCisKK0kgd2FudCB0byBwbGVhc2Ugbm90ZSBhZ2FpbiwgeW91IG1heSBkaXNwbGF5IHRoaXMgb24geW91ciBtdWQgKGxpa2UgaW4gL2RvYykuIAorWW91IGRvIG5vdCBuZWVkIHRvCittYWlsIG1lIGZvciBwZXJtaXNzaW9uLiAgSSB3b3VsZCBub3QgbWluZCBlbWFpbCwgc2luY2UgaXQgaXMgbmljZSB0byBrbm93CitwZW9wbGUgYXJlIHVzaW5nIGl0LCBidXQgdGhhdCBpcyBub3QgcmVxdWlyZWQuICBBbHNvLCBpZiB5b3UgcmVhbGx5IGZlZWwgSSBoYXZlCitkb25lIHN1Y2ggYSB3b25kZXJmdWwgam9iIHRoYXQgeW91IHNob3VsZCBwYXkgbW9uZXkgdG8gdXNlIHRoaXMsIHRoZW4gZ2l2ZQorJDUgdG8geW91ciBsb2NhbCBBU1BDQSAob3IgaW50ZXJuYXRpb25hbCBlcXVpdmFsZW50KS4KKworU2VlIHRoZSBmaWxlIHRpdGxlZCBDb250ZW50cyBmb3IgYSBmdWxsIGxpc3Qgb2YgdGV4dGJvb2sgY2hhcHRlcnMuCmRpZmYgLS1naXQgYS9kb2MvS1VSUy9MUEMtS1VSUzIvY2hhcHRlcjEgYi9kb2MvS1VSUy9MUEMtS1VSUzIvY2hhcHRlcjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM0NTljZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9LVVJTL0xQQy1LVVJTMi9jaGFwdGVyMQpAQCAtMCwwICsxLDE0MyBAQAorSW50ZXJtZWRpYXRlIExQQworRGVzY2FydGVzIG9mIEJvcmcKK05vdmVybWJlciAxOTkzCisKKyAgICAgICAgICAgICAgICAgICAgICAgICBDaGFwdGVyIDE6IEludHJvZHVjdGlvbgorCisxLjEgTFBDIEJhc2ljcworQW55b25lIHJlYWRpbmcgdGhpcyB0ZXh0Ym9vayBzaG91bGQgZWl0aGVyIGhhdmUgcmVhZCB0aGUgdGV4dGJvb2sgTFBDCitCYXNpY3Mgb3IgYmUgZmFtaWxpYXIgZW5vdWdoIHdpdGggbXVkIHJlYWxtIGNvZGluZyBzdWNoIHRoYXQgbm90IG9ubHkgYXJlCit0aGV5IGNhcGFibGUgb2YgYnVpbGRpbmcgcm9vbXMgYW5kIG90aGVyIHN1Y2ggb2JqZWN0cyBpbnZvbHZlZCBpbiBhcmVhCitjb2RpbmcsIGJ1dCB0aGV5IGFsc28gaGF2ZSBhIGdvb2QgaWRlYSBvZiB3aGF0IGlzIGdvaW5nIG9uIHdoZW4gdGhlIGNvZGUKK3RoZXkgd3JpdGUgaXMgZXhlY3V0aW5nLiAgSWYgeW91IGRvIG5vdCBmZWVsIHlvdSBhcmUgYXQgdGhpcyBwb2ludCwgdGhlbiBnbworYmFjayBhbmQgcmVhZCBMUEMgQmFzaWNzIGJlZm9yZSBjb250aW51aW5nLiAgSWYgeW91IGRvIHNvLCB5b3Ugd2lsbCBmaW5kCit0aGF0IHdoYXQgeW91IHJlYWQgaGVyZSB3aWxsIGJlIG11Y2ggbW9yZSBtZWFuaW5nZnVsIHRvIHlvdS4KKworMS4yIEdvYWxzIG9mIFRoaXMgVGV4dGJvb2sKK1RoZSBpbnRyb2R1Y3RvcnkgdGV4dGJvb2sgd2FzIG1lYW50IHRvIHRha2UgcGVvcGxlIG5ldyB0byBMUEMgZnJvbQora25vd2luZyBub3RoaW5nIHRvIGJlaW5nIGFibGUgdG8gY29kZSBhIG5pY2UgcmVhbG0gb24gYW55IExQTXVkLiAgVGhlcmUKK2lzIG5hdHVyYWxseSBtdWNoIG1vcmUgdG8gTFBDIGFuZCB0byBMUE11ZCBidWlsZGluZywgaG93ZXZlciwgdGhhbgorYnVpbGRpbmcgcm9vbXMsIGFybW91cnMsIG1vbnN0ZXJzLCBhbmQgd2VhcG9ucy4gIEFzIHlvdSBnZXQgaW50byBtb3JlCitjb21wbGljYXRlZCBjb25jZXB0cyBsaWtlIGd1aWxkcywgb3IgZGVzaXJlIHRvIGRvIG1vcmUgaW52b2x2ZWQgdGhpbmdzIHdpdGgKK3lvdXIgcmVhbG0sIHlvdSB3aWxsIGZpbmQgdGhlIGNvbmNlcHRzIGRldGFpbGVkIGluIExQQyBCYXNpY3MgdG8gYmUgbGFja2luZworaW4gc3VwcG9ydCBmb3IgdGhlc2UgcHJvamVjdHMuICBJbnRlcm1lZGlhdGUgTFBDIGlzIGRlc2lnbmVkIHRvIHRha2UgeW91CitiZXlvbmQgdGhlIHNpbXBsZSByZWFsbSBidWlsZGluZyBwcm9jZXNzIGludG8gYSBmdWxsIGtub3dsZWRnZSBvZiBMUEMgZm9yCitmdW5jdGlvbmluZyBhcyBhIHJlYWxtIGJ1aWxkZXIgb24gYW4gTFBNdWQuICBUaGUgdGFzayBvZiBtdWRsaWIgYnVpbGRpbmcKK2l0c2VsZiBpcyBsZWZ0IHRvIGEgbGF0ZXIgdGV4dC4gIEFmdGVyIHJlYWRpbmcgdGhpcyB0ZXh0Ym9vayBhbmQgd29ya2luZyB0aHJvdWdoCitpdCBieSBleHBlcmltZW50aW5nIHdpdGggYWN0dWFsIGNvZGUsIHRoZSByZWFkZXIgc2hvdWxkIGJlIGFibGUgdG8gY29kZSBnYW1lCitvYmplY3RzIHRvIGZpdCBhbnkgZGVzaWduIG9yIGlkZWEgdGhleSBoYXZlIGluIG1pbmQsIHNvIGxvbmcgYXMgSSBoYXZlIGJlZW4KK3N1Y2Nlc3NmdWwuCisKKzEuMyBBbiBPdmVydmlldworV2hhdCBtb3JlIGlzIHRoZXJlPyAgV2VsbCBtYW55IG9mIHlvdSBhcmUgcXVpdGUgYXdhcmUgdGhhdCBMUEMgc3VwcG9ydHMKK21hcHBpbmdzIGFuZCBhcnJheXMgYW5kIGhhdmUgYmVlbiBhc2tpbmcgbWUgd2h5IHRob3NlIHdlcmUgbm90IGRldGFpbGVkCitpbiBMUEMgQmFzaWNzLiAgSSBmZWx0IHRoYXQgdGhvc2UgY29uY2VwdHMgd2VyZSBiZXlvbmQgdGhlIHNjb3BlIG9mIHdoYXQgSQord2FzIHRyeWluZyB0byBkbyB3aXRoIHRoYXQgdGV4dGJvb2sgYW5kIHdlcmUgbW9yZSBmaXR0aW5nIHRvIHRoaXMgdGV4dGJvb2suIAorQnV0IG5ldyB0b29scyBhcmUgYWxsIGZpbmUgYW5kIGRhbmR5LCB3aGF0IG1hdHRlcnMsIGhvd2V2ZXIsIGlzIHdoYXQgeW91CitjYW4gZG8gd2l0aCB0aG9zZSB0b29scy4gIFRoZSBnb2FsIG9mIExQQyBCYXNpY3Mgd2FzIHRvIGdldCB5b3UgdG8gYnVpbGRpbmcKK3F1YWxpdHkgTFBNdWQgcmVhbG1zLiAgTWFwcGluZ3MgYW5kIGFycmF5cyBhcmUgbm90IG5lY2Vzc2FyeSB0byBkbyB0aGF0LiAKK1RoZSBnb2FsIG9mIHRoaXMgYm9vayBpcyB0byBhbGxvdyB5b3UgdG8gY29kZSBhbnkgaWRlYSB5b3UgbWlnaHQgd2FudCB0bworY29kZSBpbiB5b3VyIGFyZWEuICBUaGF0IGFiaWxpdHkgcmVxdWlyZXMgdGhlIGtub3dsZWRnZSBvZiBtYXBwaW5ncyBhbmQKK2FycmF5cy4KKworQW55IGlkZWEgeW91IHdhbnQgdG8gY29kZSBpbiBhbiBMUE11ZCBpcyBwb3NzaWJsZS4gIExQQyBpcyBhIGxhbmd1YWdlCit3aGljaCBpcyBhbWF6aW5nbHkgd2VsbCBzdWl0ZWQgdG8gdGhpcyB0YXNrLiAgQWxsIHRoYXQgcHJldmVudHMgeW91IGZyb20KK2NvZGluZyB5b3VyIGlkZWFzIGlzIHlvdXIga25vd2xlZGdlIG9mIExQQyBvciBhbiBpbmFkZXF1YXRlIG11ZGxpYiBvcgoreW91ciBtdWTVcyB0aGVtZSBvciBhZG1pbmlzdHJhdGl2ZSBwb2xpY2llcy4gIFRoaXMgdGV4dGJvb2sgY2Fubm90IG1ha2UKK3RoZSBtdWRsaWIgeW91IGFyZSB3b3JraW5nIHdpdGggYW55IGJldHRlciwgYW5kIGl0IGNhbm5vdCBjaGFuZ2UgdGhlIG11ZAordGhlbWUgb3IgdGhlIG11ZNVzIGFkbWluaXN0cmF0aXZlIHBvbGljaWVzLiAgTmV2ZXIgb25jZSB0aGluayB0aGF0IExQQyBpcworaW5jYXBhYmxlIG9mIGRvaW5nIHdoYXQgeW91IHdhbnQgdG8gZG8uICBJZiB5b3VyIGlkZWEgaXMgcHJldmVudGVkIGJ5CithZG1pbmlzdHJhdGl2ZSBwb2xpY2llcyBvciB0aGVtZXMsIHRoZW4gaXQgaXMgc2ltcGx5IG5vdCBhbiBpZGVhIGZvciB5b3VyCitjdXJyZW50IG11ZC4gIElmIHRoZSBtdWRsaWIgaXMgaW5hZGVxdWF0ZSwgdGFsayB0byB0aGUgcGVvcGxlIGluIGNoYXJnZSBvZgoreW91ciBtdWRsaWIgYWJvdXQgd2hhdCBjYW4gYmUgZG9uZSBhdCB0aGUgbXVkbGliIGxldmVsIHRvIGZhY2lsaXRhdGUgaXQuICBZb3UKK3dvdWxkIGJlIHN1cnByaXNlZCBieSB3aGF0IGlzIGFjdHVhbGx5IGluIHRoZSBtdWRsaWIgeW91IGRpZCBub3Qga25vdworYWJvdXQuICBNb3JlIGltcG9ydGFudCwgYWZ0ZXIgcmVhZGluZyB0aGlzIHRleHRib29rLCB5b3Ugc2hvdWxkIGJlIGFibGUgdG8KK3JlYWQgYWxsIG9mIHRoZSBtdWRsaWIgY29kZSBpbiB5b3VyIG11ZNVzIG11ZGxpYiBhbmQgdW5kZXJzdGFuZCB3aGF0IGlzCitnb2luZyBvbiBhdCBlYWNoIGxpbmUgaW4gdGhlIG11ZGxpYiBjb2RlLiAgWW91IG1heSBub3QgYXMgeWV0IGJlIGFibGUgdG8KK3JlcHJvZHVjZSB0aGF0IGNvZGUgb24geW91ciBvd24sIGJ1dCBhdCBsZWFzdCB5b3UgY2FuIHVuZGVyc3RhbmQgd2hhdCBpcworZ29pbmcgb24gYXQgdGhlIG11ZGxpYiBsZXZlbC4KKworVGhpcyB0ZXh0Ym9vayBzdGFydHMgb3V0IHdpdGggYSBkaXNjdXNzaW9uIGFib3V0IHdoYXQgdGhlIExQTXVkIGRyaXZlciBpcworZG9pbmcuICBPbmUgbmljZSB0aGluZyBhYm91dCB0aGlzIHRleHRib29rLCBpbiBnZW5lcmFsIGl0IGlzIGNvbXBsZXRlbHkgZHJpdmVyCithbmQgbXVkbGliIGluZGVwZW5kZW50IChleGNlcHRpbmcgZm9yIHRoZSBEd29ya2luIEdhbWUgRHJpdmVyKS4gIFRoZQorY2hhcHRlciBvbiB0aGUgZ2FtZSBkcml2ZXIgZG9lcyBub3QgZ2V0IGludG8gYWN0dWFsIGltcGxlbWVudGF0aW9uLCBidXQKK2luc3RlYWQgZGVhbHMgd2l0aCB3aGF0IGFsbCBnYW1lIGRyaXZlcnMgYmFzaWNhbGx5IGRvIGluIG9yZGVyIHRvIHJ1biB0aGUKK211ZC4KKworTmV4dCBJIGRpc2N1c3MgdGhvc2UgbWFnaWMgdG9waWNzIGV2ZXJ5b25lIHdhbnRzIHRvIGtub3cgbW9yZSBhYm91dCwKK2FycmF5cyBhbmQgbWFwcGluZ3MuICBNYXBwaW5ncyBtYXkgYmUgc2ltdWx0YW5lb3VzbHkgdGhlIGVhc2llc3QgYW5kCittb3N0IGRpZmZpY3VsdCBkYXRhIHR5cGUgdG8gdW5kZXJzdGFuZC4gIFNpbmNlIHRoZXkgYXJlIHNvcnQgb2YgY29tcGxleCBhcnJheXMKK2luIGEgbG9vc2Ugc2Vuc2UsIHlvdSByZWFsbHkgbmVlZCB0byB1bmRlcnN0YW5kIGFycmF5cyBiZWZvcmUgZGlzY3Vzc2luZwordGhlbS4gIEFsbCB0aGUgc2FtZSwgb25jZSB5b3UgdW5kZXJzdGFuZCB0aGVtLCB0aGV5IGFyZSBtdWNoIGVhc2llciB0aGFuCithcnJheXMgdG8gdXNlIGluIHJlYWwgc2l0dWF0aW9ucy4gIEF0IGFueSByYXRlLCBzcGVuZCBtb3N0IG9mIHlvdXIgdGltZQord29ya2luZyB3aXRoIHRoYXQgY2hhcHRlciwgYmVjYXVzZSBpdCBpcyBwcm9iYWJseSB0aGUgbW9zdCBkaWZmaWN1bHQsIHlldCBtb3N0Cit1c2VmdWwgY2hhcHRlciBpbiB0aGUgYm9vay4KKworQWZ0ZXIgdGhhdCBmb2xsb3dzIGEgYnJpZWYgY2hhcHRlciBvbiB0aGUgTFBDIHByZS1jb21waWxlciwgYSB0b29sIHlvdSBjYW4KK3VzZSBmb3Igc29ydGluZyBvdXQgaG93IHlvdXIgY29kZSB3aWxsIGxvb2sgYmVmb3JlIGl0IGdldHMgc2VudCB0byB0aGUKK2NvbXBpbGVyLiAgRGVzcGl0ZSBteSBob3JyaWQgaW50cm8gdG8gaXQgaGVyZSwgdGhpcyBjaGFwdGVyIGlzIHBlcmhhcHMgdGhlCitlYXNpZXN0IGNoYXB0ZXIgaW4gdGhlIHRleHRib29rLiAgSSBwdXQgaXQgYWZ0ZXIgdGhlIG1hcHBpbmdzIGFuZCBhcnJheXMKK2NoYXB0ZXIgZm9yIGV4YWN0bHkgdGhhdCByZWFzb24uCisKK1N0cmluZ3MgYXJlIHJlLWludHJvZHVjZWQgbmV4dCwgZ29pbmcgaW50byBtb3JlIGRldGFpbCB3aXRoIGhvdyB5b3UgY2FuIGRvCitzdWNoIHRoaW5ncyBhcyBhZHZhbmNlZCBjb21tYW5kIGhhbmRsaW5nIGJ5IGJyZWFraW5nIHVwIHN0cmluZ3MuICBPbmNlCit5b3UgdW5kZXJzdGFuZCBhcnJheXMgZmFpcmx5IHdlbGwsIHRoaXMgY2hhcHRlciBzaG91bGQgYmUgcmVhbGx5IHNpbXBsZS4KKworVGhlIG5leHQgY2hhcHRlciBpcyB0aGUgc2Vjb25kIG1vc3QgaW1wb3J0YW50IGluIHRoZSBib29rLiAgSXQgbWF5IGJlIHRoZQorbW9zdCBpbXBvcnRhbnQgaWYgeW91IGV2ZXIgaW50ZW5kIHRvIGdvIGJleW9uZCB0aGUgaW50ZXJtZWRpYXRlIHN0YWdlIGFuZAorZGl2ZSBpbnRvIG11ZGxpYiBjb2RpbmcuICBUaGF0IGNoYXB0ZXIgaW52b2x2ZXMgdGhlIGNvbXBsZXggaWRlYXMgYmVoaW5kCitMUEMgaW5oZXJpdGFuY2UuICBTaW5jZSB0aGUgZ29hbCBvZiB0aGlzIHRleHRib29rIGlzIG5vdCB0byB0ZWFjaCBtdWRsaWIKK3Byb2dyYW1taW5nLCB0aGUgY2hhcHRlciBpcyBub3QgYSBkZXRhaWxlZCBkaXNjdXNzaW9uIG9uIG9iamVjdCBvcmllbnRlZAorcHJvZ3JhbW1pbmcuICBVbmRlcnN0YW5kaW5nIHRoaXMgY2hhcHRlciwgaG93ZXZlciwgd2lsbCBnaXZlIHlvdSBzb21lCitnb29kIGluc2lnaHRzIGludG8gd2hhdCBpcyBpbnZvbHZlZCB3aXRoIG9iamVjdCBvcmllbnRlZCBwcm9ncmFtbWluZywgYXMKK3dlbGwgYXMgYWxsb3cgeW91IHRvIGJ1aWxkIG1vcmUgY29tcGxleCBvYmplY3RzIGJ5IG92ZXJyaWRpbmcgZnVuY3Rpb25zCithbmQgZGVmaW5pbmcgeW91ciBvd24gYmFzZSBjbGFzc2VzLgorCitGaW5hbGx5LCB0aGUgdGV4dGJvb2sgZW5kcyB3aXRoIGEgc2ltcGxlIGRpc2N1c3Npb24gb2YgY29kZSBkZWJ1Z2dpbmcuIAorVGhpcyBpcyBub3QgYW4gZXNzZW50aWFsIGNoYXB0ZXIsIGJ1dCBpbnN0ZWFkIGl0IGlzIG1lYW50IGFzIG1vcmUgb2YgYW4KK2F1eGlsaWFyeSBzdXBwbGVtZW50IHRvIHdoYXQgdGhlIGtub3dsZWRnZSB5b3UgaGF2ZSBhY2N1bXVsYXRlZCBzbyBmYXIuCisKKzEuNCBOb3QgQXBwZWFyaW5nIGluIFRoaXMgVGV4dGJvb2sKK1BlcmhhcHMgd2hhdCBtaWdodCBhcHBlYXIgdG8gc29tZSBhcyB0aGUgbW9zdCBnbGFyaW5nIG9taXNzaW9uIG9mIHRoaXMKK3RleHRib29rIGlzIGxhcmdlbHkgYSBwb2xpdGljYWwgb21pc3Npb24sIHNoYWRvd3MuICBOZXZlciBoYXZlIEkgZXZlcgorZW5jb3VudGVyZWQgYW4gZXhhbXBsZSBvZiB3aGVyZSBhIHNoYWRvdyB3YXMgZWl0aGVyIHRoZSBiZXN0IG9yIG1vc3QKK2VmZmVjaWVudCBtYW5uZXIgb2YgZG9pbmcgYW55dGhpbmcuICBJdCBkb2VzIG5vdCBmb2xsb3cgZnJvbSB0aGF0LCBob3dldmVyLAordGhhdCB0aGVyZSBhcmUgbm8gdXNlcyBmb3Igc2hhZG93cy4gIE15IHJlYXNvbmluZyBmb3Igb21pdHRpbmcgc2hhZG93cworZnJvbSB0aGlzIHRleHRib29rIGlzIHRoYXQgdGhlIGxlYXJuZXIgaXMgYmVzdCBzZXJ2ZWQgYnkgbGVhcm5pbmcgdGhlIGNvbmNlcHRzCitpbiB0aGlzIHRleHRib29rIGZpcnN0IGFuZCBoYXZpbmcgc3BlbnQgdGltZSB3aXRoIHRoZW0gYmVmb3JlIGRlYWxpbmcgd2l0aAordGhlIHN1YmplY3Qgb2Ygc2hhZG93cy4gIEluIHRoYXQgd2F5LCBJIGZlZWwgdGhlIHBlcnNvbiBsZWFybmluZyBMUEMgd2lsbCBiZQorYmV0dGVyIGNhcGFibGUgb2YganVkZ2luZyB0aGUgbWVyaXRzIG9mIHVzaW5nIGEgc2hhZG93IGRvd24gdGhlIHJvYWQuICBJCit3aWxsIGRpc2N1c3Mgc2hhZG93cyBpbiBhIGZ1dHVyZSB0ZXh0Ym9vay4KKworSWYgeW91IGFyZSBzb21lb25lIHdobyB1c2VzIHNoYWRvd3Mgc29tZSBvciBhIGxvdCwgcGxlYXNlIGRvIG5vdCB0YWtlIHRoZQorYWJvdmUgcGFyYWdyYXBoIGFzIGEgcGVyc29uYWwgYXR0YWNrLiAgVGhlcmUgbWF5IGJlIHNvbWUgcGVyZmVjdGx5IHZhbGlkCit1c2VzIGZvciBzaGFkb3dzIHNvbWV3aGVyZSB3aGljaCBJIGhhdmUgeWV0IHRvIGVuY291bnRlci4gIE5ldmVydGhlbGVzcywKK3RoZXkgYXJlIG5vdCB0aGUgaWRlYWwgd2F5IHRvIGFjY29tcGxpc2ggYW55IGdpdmVuIHRhc2ssIGFuZCB0aGVyZWZvcmUgdGhleQorYXJlIG5vdCBjb25zaWRlcmVkIGZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyB0ZXh0Ym9vayBhbiBpbnRlcm1lZGlhdGUgY29kaW5nCit0b29sLgorCitJIGhhdmUgYWxzbyBvbWl0dGVkIGRpc2N1c3Npb25zIG9mIHNlY3VyaXR5IGFuZCBvYmplY3Qgb3JpZW50ZWQKK3Byb2dyYW1taW5nLiAgQm90aCBhcmUgcXVpdGUgb2J2aW91c2x5IG11ZGxpYiBpc3N1ZXMuICBNYW55IHBlb3BsZSwKK2hvd2V2ZXIsIG1pZ2h0IHRha2UgZXhjZXB0aW9uIHdpdGggbXkgbGVhdmluZyBvdXQgYSBkaXNjdXNzaW9uIG9mIG9iamVjdAorb3JpZW50ZWQgcHJvZ3JhbW1pbmcuICBJIGNob3NlIHRvIGxlYXZlIHRoYXQgZm9yIGEgbGF0ZXIgdGV4dCwgc2luY2UgbW9zdCBhcmVhCitidWlsZGVycyBjb2RlIGZvciB0aGUgY3JlYXRpdml0eSwgbm90IGZvciB0aGUgY29tcHV0ZXIgc2NpZW5jZSB0aGVvcnkuICBJbiBib3RoCit0aGUgaW50ZXJtZWRpYXRlIGFuZCBiZWdpbm5lciB0ZXh0Ym9va3MsIEkgaGF2ZSBjaG9zZW4gb25seSB0byBkaXNjdXNzCit0aGVvcnkgd2hlcmUgaXQgaXMgZGlyZWN0bHkgYXBwbGljYWJsZSB0byBwcmFjdGljYWwgTFBDIHByb2dyYW1taW5nLiAgRm9yCitwZW9wbGUgd2hvIGFyZSBzdGFydGluZyBvdXQgZ3JlZW4gaW4gTFBDIGFuZCB3YW50IHRvIGNvZGUgdGhlIG5leHQgZ3JlYXQKK211ZGxpYiwgcGVyaGFwcyB0aGVvcnkgd291bGQgYmUgbW9yZSB1c2VmdWwuICBCdXQgZm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzCitib29rLCBhIGRpc2N1c3Npb24gb2Ygb2JqZWN0IG9yaWVudGVkIHByb2dyYW1taW5nIGlzIHNpbXBseSBhIHNub296ZXIuICBJCitkbyBwbGFuIHRvIGdldCBoZWF2eSBpbnRvIHRoZW9yeSB3aXRoIHRoZSBuZXh0IHRleHRib29rLgorCisxLjUgU3VtbWFyeQorTFBDIGlzIG5vdCBkaWZmaWN1bHQgdG8gbGVhcm4uICBJdCBpcyBhIGxhbmd1YWdlIHdoaWNoLCBhbHRob3VnaCBwYXRoZXRpYworY29tcGFyZWQgdG8gYW55IG90aGVyIGxhbmd1YWdlIGZvciBwZXJmb3JtaW5nIG1vc3QgY29tcHV0ZXIgbGFuZ3VhZ2UKK3Rhc2tzLCBpcyBpbmNyZWRpYmx5IHBvd2VyZnVsIGFuZCB1bmVxdWFsbGVkIGZvciB0aGUgdGFza3Mgb2YgYnVpbGRpbmcgYW4KK2FyZWEgaW4gTVVEIHR5cGUgZ2FtZXMuICBGb3IgdGhlIGJlZ2lubmVyLCBpdCBhbGxvd3MgeW91IHRvIGVhc2lseSBqdW1wIGluCithbmQgY29kZSB1c2VmdWwgb2JqZWN0cyB3aXRob3V0IGV2ZW4ga25vd2luZyB3aGF0IHlvdSBhcmUgZG9pbmcuICBGb3IgdGhlCitpbnRlcm1lZGlhdGUgcGVyc29uLCBpdCBhbGxvd3MgeW91IHRvIHR1cm4gYW55IGlkZWEgeW91IGhhdmUgaW50byB0ZXh0dWFsCit2aXJ0dWFsIHJlYWxpdHkuICBBbmQgZm9yIHRoZSBhZHZhbmNlZCBwZXJzb24sIGl01XMgb2JqZWN0IG9yaWVudGVkIGZlYXR1cmVzCitjYW4gYWxsb3cgeW91IHRvIGJ1aWxkIG9uZSBvZiB0aGUgbW9zdCBwb3B1bGFyIGdhbWVzIG9uIHRoZSBpbnRlcm5ldC4gIFdoYXQKK3lvdSBjYW4gZG8gaXMgc2ltcGx5IGxpbWl0ZWQgYnkgaG93IG11Y2ggeW91IGtub3cuICBBbmQgbGVhcm5pbmcgbW9yZQorZG9lcyBub3QgcmVxdWlyZSBhIGNvbXB1dGVyIHNjaWVuY2UgZGVncmVlLgorCitDb3B5cmlnaHQgKGMpIEdlb3JnZSBSZWVzZSAxOTkzCmRpZmYgLS1naXQgYS9kb2MvS1VSUy9MUEMtS1VSUzIvY2hhcHRlcjIgYi9kb2MvS1VSUy9MUEMtS1VSUzIvY2hhcHRlcjIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFhNGMzYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9LVVJTL0xQQy1LVVJTMi9jaGFwdGVyMgpAQCAtMCwwICsxLDIyMyBAQAorSW50ZXJtZWRpYXRlIExQQworRGVzY2FydGVzIG9mIEJvcmcKK05vdmVybWJlciAxOTkzCisKKyAgICAgICAgICAgICAgICAgICAgICAgICBDaGFwdGVyIDI6IFRoZSBMUE11ZCBEcml2ZXIKKworMi4xIFJldmlldyBvZiBCYXNpYyBEcml2ZXIvTXVkbGliIEludGVyYWN0aW9uCitJbiB0aGUgTFBDIEJhc2ljcyB0ZXh0Ym9vaywgeW91IGxlYXJuZWQgYSBsb3QgYWJvdXQgdGhlIHdheSB0aGUgbXVkbGliCit3b3Jrcywgc3BlY2lmaWNhbGx5IGluIHJlbGF0aW9uIHRvIG9iamVjdHMgeW91IGNvZGUgaW4gb3JkZXIgdG8gYnVpbGQgeW91cgorcmVhbG0uICBOb3QgbXVjaCB3YXMgZGlzY3Vzc2VkIGFib3V0IHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoZQorbXVkbGliIGFuZCB0aGUgZHJpdmVyLiAgWW91IHNob3VsZCBrbm93LCBob3dldmVyLCB0aGF0IHRoZSBkcml2ZXIKK2RvZXMgdGhlIGZvbGxvd2luZzoKKzEpIFdoZW4gYW4gb2JqZWN0IGlzIGZpcnN0IGxvYWRlZCBpbnRvIG1lbW9yeSwgdGhlIGRyaXZlciB3aWxsIGNhbGwKK2NyZWF0ZSgpIGluIG5hdGl2ZSBtdWRzIGFuZCByZXNldCgpIGluIGNvbXBhdCBtdWRzLiAgQSBjcmVhdG9yCit1c2VzIGNyZWF0ZSgpIG9yIHJlc2V0KCkgdG8gZ2l2ZSBpbml0aWFsIHZhbHVlcyB0byB0aGUgb2JqZWN0LgorMikgQXQgYW4gaW50ZXJ2YWwgc2V0dXAgYnkgdGhlIGdhbWUgYWRtaW5pc3RyYXRvciwgdGhlIGRyaXZlciBjYWxscyB0aGUKK2Z1bmN0aW9uIHJlc2V0KCkuICBUaGlzIGFsbG93cyB0aGUgb2JqZWN0IHRvIHJlZ2VuZXJhdGUgbW9uc3RlcnMgYW5kCitzdWNoLiAgTm90aWNlIHRoYXQgaW4gYSBjb21wYXQgbXVkLCB0aGUgc2FtZSBmdW5jdGlvbiBpcyB1c2VkIHRvIHNldCB1cAoraW5pdGlhbCB2YWx1ZXMgYXMgaXMgdXNlZCB0byByZXNldCB0aGUgcm9vbS4KKzMpIEFueSB0aW1lIGEgbGl2aW5nIG9iamVjdCBjb21lcyBpbiBjb250YWN0IHdpdGggYW4gb2JqZWN0IG9mIGFueSBzb3J0LAordGhlIGRyaXZlciBjYWxscyBpbml0KCkgaW4gdGhlIG5ld2x5IGVuY291bnRlcmVkIG9iamVjdC4gIFRoaXMgYWxsb3dzCituZXdseSBlbmNvdW50ZXJlZCBvYmplY3RzIHRvIGdpdmUgbGl2aW5nIG9iamVjdHMgY29tbWFuZHMgdG8gZXhlY3V0ZQordGhyb3VnaCB0aGUgYWRkX2FjdGlvbigpIGVmdW4sIGFzIHdlbGwgYXMgcGVyZm9ybSBvdGhlciBhY3Rpb25zIHdoaWNoCitzaG91bGQgaGFwcGVuIHdoZW5ldmVyIGEgbGl2aW5nIHRoaW5nIGVuY291bnRlcnMgYSBnaXZlbiBvYmplY3QuCis0KSBUaGUgZHJpdmVyIGRlZmluZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGtub3duIGFzIGVmdW5zIHdoaWNoIGFyZQorYXZhaWxhYmxlIHRvIGFsbCBvYmplY3RzIGluIHRoZSBnYW1lLiAgRXhhbXBsZXMgb2YgY29tbW9ubHkgdXNlZCBlZnVucworYXJlOiB0aGlzX3BsYXllcigpLCB0aGlzX29iamVjdCgpLCB3cml0ZSgpLCBzYXkoKSwgZXRjLgorCisyLjIgVGhlIERyaXZlciBDeWNsZQorVGhlIGRyaXZlciBpcyBhIEMgcHJvZ3JhbSB3aGljaCBydW5zIHRoZSBnYW1lLiAgSXRzIGJhc2ljIGZ1bmN0aW9ucyBhcmUKK3RvIGFjY2VwdCBjb25uZWN0aW9ucyBmcm9tIHRoZSBvdXRzaWRlIHdvcmxkIHNvIHBlb3BsZSBjYW4gbG9naW4sCitpbnRlcnByZXQgdGhlIExQQyBjb2RlIHdoaWNoIGRlZmluZXMgTFBDIG9iamVjdHMgYW5kIGhvdyB0aGV5CitmdW5jdGlvbiBpbiB0aGUgZ2FtZSwgYW5kIGFjY2VwdCB1c2VyIGlucHV0IGFuZCBjYWxsIHRoZSBhcHByb3ByaWF0ZSBMUEMKK2Z1bmN0aW9ucyB3aGljaCBtYXRjaCB0aGUgZXZlbnQuICBJbiBpdHMgbW9zdCBzaW1wbGVzdCBlc3NlbmNlLCBpdCBpcyBhbgordW5lbmRpbmcgbG9vcC4KKworT25jZSB0aGUgZ2FtZSBoYXMgYm9vdGVkIHVwIGFuZCBpcyBwcm9wZXJseSBmdW5jdGlvbmluZyAodGhlIGJvb3QgdXAKK3Byb2Nlc3Mgd2lsbCBiZSBkaXNjdXNzZWQgaW4gYSBmdXR1cmUsIGFkdmFuY2VkIExQQyB0ZXh0Ym9vayksIHRoZQorZHJpdmVyIGVudGVycyBhIGxvb3Agd2hpY2ggZG9lcyBub3QgdGVybWluYXRlIHVudGlsIHRoZSBzaHV0ZG93bigpIGVmdW4KK2lzIGxlZ2FsbHkgY2FsbGVkIG9yIGEgYnVnIGNhdXNlcyB0aGUgZHJpdmVyIHByb2dyYW0gdG8gY3Jhc2guICBGaXJzdCBvZmYsCit0aGUgZHJpdmVyIGhhbmRsZXMgYW55IG5ldyBpbmNvbWluZyBjb25uZWN0aW9ucyBhbmQgcGFzc2VzIGNvbnRyb2wgb2YKK3RoZSBjb25uZWN0aW9uIHRvIGEgbG9naW4gb2JqZWN0LiAgQWZ0ZXIgdGhhdCwgdGhlIGRyaXZlciBwdXRzIHRvZ2V0aGVyIGEKK3RhYmxlIG9mIGNvbW1hbmRzIHdoaWNoIGhhdmUgYmVlbiBlbnRlcmVkIGJ5IHVzZXJzIHNpbmNlIHRoZSBsYXN0IGN5Y2xlCitvZiB0aGUgZHJpdmVyLiAgQWZ0ZXIgdGhlIGNvbW1hbmQgdGFibGUgaXMgYXNzZW1ibGVkLCBhbGwgbWVzc2FnZXMKK3NjaGVkdWxlZCB0byBiZSBzZW50IHRvIHRoZSBjb25uZWN0aW9uIGZyb20gdGhlIGxhc3QgZHJpdmVyIGN5Y2xlIGFyZSBzZW50CitvdXQgdG8gdGhlIHVzZXIuICBBdCB0aGlzIHBvaW50LCB0aGUgZHJpdmVyIGdvZXMgdGhyb3VnaCB0aGUgdGFibGUgb2YKK2NvbW1hbmRzIHRvIGJlIGV4ZWN1dGVkIGFuZCBleGVjdXRlcyBlYWNoIHNldCBvZiBjb21tYW5kcyBlYWNoCitvYmplY3QgaGFzIHN0b3JlZCB0aGVyZS4gIFRoZSBkcml2ZXIgZW5kcyBpdHMgY3ljbGUgYnkgY2FsbGluZyB0aGUgZnVuY3Rpb24KK2hlYXJ0X2JlYXQoKSBpbiBldmVyeSBvYmplY3Qgd2l0aCBhIGhlYXJ0X2JlYXQoKSBzZXQgYW5kIGZpbmFsbHkKK3BlcmZvcm1pbmcgYWxsIHBlbmRpbmcgY2FsbCBvdXRzLiAgVGhpcyBjaGFwdGVyIHdpbGwgbm90IGRlYWwgd2l0aCB0aGUKK2hhbmRsaW5nIG9mIGNvbm5lY3Rpb25zLCBidXQgaW5zdGVhZCB3aWxsIGZvY3VzIG9uIGhvdyB0aGUgZHJpdmVyCitoYW5kbGVzIHVzZXIgY29tbWFuZHMgYW5kIGhlYXJ0YmVhdHMgYW5kIGNhbGwgb3V0cy4KKworMi4zIFVzZXIgQ29tbWFuZHMKK0FzIG5vdGVkIGluIHNlY3Rpb24gMS4yLCB0aGUgZHJpdmVyIHN0b3JlcyBhIGxpc3Qgb2YgY29tbWFuZHMgZm9yIGVhY2gKK3VzZXIgdG8gYmUgZXhlY3V0ZWQgZWFjaCBjeWNsZS4gIFRoZSBjb21tYW5kcyBsaXN0IGhhcyB0aGUgbmFtZSBvZiB0aGUKK2xpdmluZyBvYmplY3QgcGVyZm9ybWluZyB0aGUgY29tbWFuZCwgdGhlIG9iamVjdCB3aGljaCBnYXZlIHRoZSBsaXZpbmcKK29iamVjdCB0aGF0IGNvbW1hbmQsIGFuZCB0aGUgZnVuY3Rpb24gd2hpY2ggaXMgdG8gYmUgZXhlY3V0ZWQgaW4gb3JkZXIKK3RvIHBlcmZvcm0gdGhlIGNvbW1hbmQuICBUaGUgZHJpdmVyIHJlZmVycyB0byB0aGUgb2JqZWN0IHdoaWNoIHR5cGVkIGluCit0aGUgY29tbWFuZCBhcyB0aGUgY29tbWFuZCBnaXZlci4gIEl0IGlzIHRoZSBjb21tYW5kIGdpdmVyIHdoaWNoCitnZXRzIHJldHVybmVkIGFzIHRoaXNfcGxheWVyKCkgaW4gbW9zdCBjYXNlcy4KKworVGhlIGRyaXZlciBzdGFydHMgYXQgdGhlIHRvcCBvZiB0aGUgbGlzdCBvZiBsaXZpbmcgb2JqZWN0cyB3aXRoIHBlbmRpbmcKK2NvbW1hbmRzLCBhbmQgc3VjY2Vzc2l2ZWx5IHBlcmZvcm1zIGVhY2ggY29tbWFuZCBpdCB0eXBlZCBieSBjYWxsaW5nCit0aGUgZnVuY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBjb21tYW5kIGFuZCBwYXNzaW5nIGFueSBhcmd1bWVudHMKK3RoZSBjb21tYW5kIGdpdmVyIGdhdmUgYXMgYXJndW1lbnRzIHRvIHRoZSBmdW5jdGlvbi4gIEFzIHRoZSBkcml2ZXIKK3N0YXJ0cyB3aXRoIHRoZSBjb21tYW5kcyBpc3N1ZWQgYnkgYSBuZXcgbGl2aW5nIG9iamVjdCwgdGhlIGNvbW1hbmQKK2dpdmVyIHZhcmlhYmxlIGlzIGNoYW5nZWQgdG8gYmUgZXF1YWwgdG8gdGhlIG5ldyBsaXZpbmcgb2JqZWN0LCBzbyB0aGF0CitkdXJpbmcgdGhlIHNlcXVlbmNlIG9mIGZ1bmN0aW9ucyBpbml0aWF0ZWQgYnkgdGhhdCBjb21tYW5kLCB0aGUgZWZ1bgordGhpc19wbGF5ZXIoKSByZXR1cm5zIHRoZSBvYmplY3Qgd2hpY2ggaXNzdWVkIHRoZSBjb21tYW5kLgorCitMZXQncyBsb29rIGF0IHRoZSBjb21tYW5kIGJ1ZmZlciBmb3IgYW4gZXhhbXBsZSBwbGF5ZXIuICBTaW5jZSB0aGUKK2V4ZWN1dGlvbiBvZiBoaXMgbGFzdCBjb21tYW5kLCBCb3pvIGhhcyB0eXBlZCAibm9ydGgiIGFuZCAidGVsbAorZGVzY2FydGVzIHdoZW4gaXMgdGhlIG5leHQgcmVib290Ii4gIFRoZSBjb21tYW5kICJub3J0aCIgaXMgYXNzb2NpYXRlZAord2l0aCB0aGUgZnVuY3Rpb24gIkRvX01vdmUoKSIgaW4gdGhlIHJvb20gQm96byBpcyBpbiAodGhlIGNvbW1hbmQKKyJub3J0aCIgaXMgYXV0b21hdGljYWxseSBzZXR1cCBieSB0aGUgc2V0X2V4aXRzKCkgZWZ1biBpbiB0aGF0IHJvb20pLiAgVGhlCitjb21tYW5kICJ0ZWxsIiBpcyBub3Qgc3BlY2lmaWNhbGx5IGxpc3RlZCBhcyBhIGNvbW1hbmQgZm9yIHRoZSBwbGF5ZXIsCitob3dldmVyLCBpbiB0aGUgcGxheWVyIG9iamVjdCB0aGVyZSBpcyBhIGZ1bmN0aW9uIGNhbGxlZCAiY21kX2hvb2soKSIKK3doaWNoIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29tbWFuZCAiIiwgd2hpY2ggbWF0Y2hlcyBhbnkgcG9zc2libGUKK3VzZXIgaW5wdXQuCisKK09uY2UgdGhlIGRyaXZlciBnZXRzIGRvd24gdG8gQm96bywgdGhlIGNvbW1hbmQgZ2l2ZXIgdmFyaWFibGUgaXMgc2V0IHRvCit0aGUgb2JqZWN0IHdoaWNoIGlzIEJvem8uICBUaGVuLCBzZWVpbmcgQm96byB0eXBlZCAibm9ydGgiIGFuZCB0aGUKK2Z1bmN0aW9uICJub3J0aCIgaXMgYXNzb2NpYXRlZCB3aXRoLCB0aGUgZHJpdmVyIGNhbGxzIEJvem8nc19Sb29tLQorPkRvX01vdmUoMCkuICBBbiBhcmd1bWVudCBvZiAwIGlzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24gc2luY2UgQm96bworb25seSB0eXBlZCB0aGUgY29tbWFuZCAibm9ydGgiIHdpdGggbm8gYXJndW1lbnRzLiAgVGhlIHJvb20KK25hdHVyYWxseSBjYWxscyBzb21lIGZ1bmN0aW9ucyBpdCBuZWVkcywgYWxsIHRoZSB3aGlsZSBzdWNoIHRoYXQgdGhlIGVmdW4KK3RoaXNfcGxheWVyKCkgcmV0dXJucyB0aGUgb2JqZWN0IHdoaWNoIGlzIEJvem8uICBFdmVudHVhbGx5LCB0aGUgcm9vbQorb2JqZWN0IHdpbGwgY2FsbCBtb3ZlX3BsYXllcigpIGluIEJvem8sIHdoaWNoIGluIHR1cm4gY2FsbHMgdGhlCittb3ZlX29iamVjdCgpIGVmdW4uICBUaGlzIGVmdW4gaXMgcmVzcG9uc2libGUgZm9yIGNoYW5naW5nIGFuIG9iamVjdCdzCitlbnZpcm9ubWVudC4KKworV2hlbiB0aGUgZW52aXJvbm1lbnQgb2YgYW4gb2JqZWN0IGNoYW5nZXMsIHRoZSBjb21tYW5kcyBhdmFpbGFibGUgdG8KK2l0IGZyb20gb2JqZWN0cyBpbiBpdHMgcHJldmlvdXMgZW52aXJvbm1lbnQgYXMgd2VsbCBhcyBmcm9tIGl0cyBwcmV2aW91cworZW52aXJvbm1lbnQgYXJlIHJlbW92ZWQgZnJvbSB0aGUgb2JqZWN0LiAgT25jZSB0aGF0IGlzIGRvbmUsIHRoZSBkcml2ZXIKK2NhbGxzIHRoZSBlZnVuIGluaXQoKSBpbiB0aGUgbmV3IGVudmlyb25tZW50IGFzIHdlbGwgYXMgaW4gZWFjaCBvYmplY3QgaW4KK3RoZSBuZXcgZW52aXJvbm1lbnQuICBEdXJpbmcgZWFjaCBvZiB0aGVzZSBjYWxscyB0byBpbml0KCksIHRoZSBvYmplY3QKK0Jvem8gaXMgc3RpbGwgdGhlIGNvbW1hbmQgZ2l2ZXIuICBUaHVzIGFsbCBhZGRfYWN0aW9uKCkgZWZ1bnMgZnJvbSB0aGlzCittb3ZlIHdpbGwgYXBwbHkgdG8gQm96by4gIE9uY2UgYWxsIHRob3NlIGNhbGxzIGFyZSBkb25lLCBjb250cm9sIHBhc3NlcworYmFjayBmcm9tIHRoZSBtb3ZlX29iamVjdCgpIGVmdW4gdG8gdGhlIG1vdmVfcGxheWVyKCkgbGZ1biBpbiBCb3pvLiAKK21vdmVfcGxheWVyKCkgcmV0dXJucyBjb250cm9sIGJhY2sgdG8gRG9fTW92ZSgpIGluIHRoZSBvbGQgcm9vbSwKK3doaWNoIHJldHVybnMgMSB0byBzaWduaWZ5IHRvIHRoZSBkcml2ZXIgdGhhdCB0aGUgY29tbWFuZCBhY3Rpb24gd2FzCitzdWNjZXNzZnVsLiAgSWYgdGhlIERvX01vdmUoKSBmdW5jdGlvbiBoYWQgcmV0dXJuZWQgMCBmb3Igc29tZSByZWFzb24sCit0aGUgZHJpdmVyIHdvdWxkIGhhdmUgd3JpdHRlbiAiV2hhdD8iIChvciB3aGF0ZXZlciB5b3VyIGRyaXZlcidzCitkZWZhdWx0IGJhZCBjb21tYW5kIG1lc3NhZ2UgaXMpIHRvIEJvem8uCisKK09uY2UgdGhlIGZpcnN0IGNvbW1hbmQgcmV0dXJucyAxLCB0aGUgZHJpdmVyIHByb2NlZWRzIG9uIHRvIEJvem8ncworc2Vjb25kIGNvbW1hbmQsIGZvbGxvd2luZyBtdWNoIHRoZSBzYW1lIHN0cnVjdHVyZS4gIE5vdGUgdGhhdCB3aXRoCisidGVsbCBkZXNjYXJ0ZXMgd2hlbiBpcyB0aGUgbmV4dCByZWJvb3QiLCB0aGUgZHJpdmVyIHBhc3NlcyAiZGVzY2FydGVzCit3aGVuIGlzIHRoZSBuZXh0IHJlYm9vdCIgdG8gdGhlIGZ1bmN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0ZWxsLiAgVGhhdAorZnVuY3Rpb24gaW4gdHVybiBoYXMgdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aCB0aGF0IGFyZ3VtZW50LiAgQWZ0ZXIgdGhhdAorY29tbWFuZCByZXR1cm5zIGVpdGhlciAxIG9yIDAsIHRoZSBkcml2ZXIgdGhlbiBwcm9jZWVkcyBvbiB0byB0aGUgbmV4dAorbGl2aW5nIG9iamVjdCB3aXRoIGNvbW1hbmRzIHBlbmRpbmcsIGFuZCBzbyBvbiB1bnRpbCBhbGwgbGl2aW5nIG9iamVjdHMKK3dpdGggcGVuZGluZyBjb21tYW5kcyBoYXZlIGhhZCB0aGVpciBjb21tYW5kcyBwZXJmb3JtZWQuCisKKzIuNCBUaGUgRWZ1bnMgc2V0X2hlYXJ0X2JlYXQoKSBhbmQgY2FsbF9vdXQoKQorT25jZSBhbGwgY29tbWFuZHMgYXJlIHBlcmZvcm1lZCBmb3Igb2JqZWN0cyB3aXRoIGNvbW1hbmRzIHBlbmRpbmcsCit0aGUgZHJpdmVyIHRoZW4gcHJvY2VlZHMgdG8gY2FsbCB0aGUgaGVhcnRfYmVhdCgpIGZ1bmN0aW9uIGluIGFsbCBvYmplY3RzCitsaXN0ZWQgd2l0aCB0aGUgZHJpdmVyIGFzIGhhdmluZyBoZWFydGJlYXRzLiAgV2hlbmV2ZXIgYW4gb2JqZWN0IGNhbGxzIHRoZQorZWZ1biBzZXRfaGVhcnRfYmVhdCgpIHdpdGggYSBub24temVybyBhcmd1bWVudCAoZGVwZW5kaW5nIG9uIHlvdXIKK2RyaXZlciwgd2hhdCBub24temVybyBudW1iZXIgbWF5IGJlIGltcG9ydGFudCwgYnV0IGluIG1vc3QgY2FzZXMgeW91CitjYWxsIGl0IHdpdGggdGhlIGludCAxKS4gIFRoZSBlZnVuIHNldF9oZWFydF9iZWF0KCkgYWRkcyB0aGUgb2JqZWN0IHdoaWNoCitjYWxscyBzZXRfaGVhcnRfYmVhdCgpIHRvIHRoZSBsaXN0IG9mIG9iamVjdHMgd2l0aCBoZWFydGJlYXRzLiAgSWYgeW91IGNhbGwgaXQKK3dpdGggYW4gYXJndW1lbnQgb2YgMCwgdGhlbiBpdCByZW1vdmVzIHRoZSBvYmplY3QgZnJvbSB0aGUgbGlzdCBvZiBvYmplY3RzCit3aXRoIGhlYXJ0YmVhdHMuCisKK1RoZSBtb3N0IGNvbW1vbiB1c2UgZm9yIGhlYXJ0YmVhdHMgaW4gdGhlIG11ZGxpYiBpcyB0byBoZWFsIHBsYXllcnMgYW5kCittb25zdGVycyBhbmQgcGVyZm9ybSBjb21iYXQuICBPbmNlIHRoZSBkcml2ZXIgaGFzIGZpbmlzaGVkIGRlYWxpbmcgd2l0aAordGhlIGNvbW1hbmQgbGlzdCwgaXQgZ29lcyB0aHJvdWdoIHRoZSBoZWFydGJlYXQgbGlzdCBjYWxsaW5nIGhlYXJ0X2JlYXQoKSBpbgorZWFjaCBvYmplY3QgaW4gdGhlIGxpc3QuICBTbyBmb3IgYSBwbGF5ZXIsIGZvciBleGFtcGxlLCB0aGUgZHJpdmVyIHdpbGwgY2FsbAoraGVhcnRfYmVhdCgpIGluIHRoZSBwbGF5ZXIgd2hpY2ggd2lsbDoKKzEpIGFnZSB0aGUgcGxheWVyCisyKSBoZWFsIHRoZSBwbGF5ZXIgYWNjb3JkaW5nIHRvIGEgaGVhbCByYXRlCiszKSBjaGVjayB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSBodW50ZWQsIGh1bnRpbmcsIG9yIGF0dGFja2luZyBvYmplY3RzCithcm91bmQKKzQpIHBlcmZvcm0gYW4gYXR0YWNrIGlmIHN0ZXAgMyByZXR1cm5zIHRydWUuCis1KSBhbnkgb3RoZXIgdGhpbmdzIHdoaWNoIG5lZWQgdG8gaGFwcGVuIGF1dG9tYXRpY2FsbHkgcm91Z2hseSBldmVyeQorc2Vjb25kCisKK05vdGUgdGhhdCB0aGUgbW9yZSBvYmplY3RzIHdoaWNoIGhhdmUgaGVhcnRiZWF0cywgdGhlIG1vcmUgcHJvY2Vzc2luZword2hpY2ggaGFzIHRvIGhhcHBlbiBldmVyeSBjeWNsZSB0aGUgbXVkIGlzIHVwLiAgT2JqZWN0cyB3aXRoIGhlYXJ0YmVhdHMKK2FyZSB0aHVzIGtub3duIGFzIHRoZSBtYWpvciBob2cgb2YgQ1BVIHRpbWUgb24gbXVkcy4gIAorCitUaGUgY2FsbF9vdXQoKSBlZnVuIGlzIHVzZWQgdG8gcGVyZm9ybSB0aW1lZCBmdW5jdGlvbiBjYWxscyB3aGljaCBkbyBub3QKK25lZWQgdG8gaGFwcGVuIGFzIG9mdGVuIGFzIGhlYXJ0YmVhdHMsIG9yIHdoaWNoIGp1c3QgaGFwcGVuIG9uY2UuICBDYWxsCitvdXRzIGxldCB5b3Ugc3BlY2lmeSB0aGUgZnVuY3Rpb24gaW4gYW4gb2JqZWN0IHlvdSB3YW50IGNhbGxlZC4gIFRoZQorZ2VuZXJhbCBmb3JtdWxhIGZvciBjYWxsIG91dHMgaXM6CitjYWxsX291dChmdW5jLCB0aW1lLCBhcmdzKTsKK1RoZSB0aGlyZCBhcmd1bWVudCBzcGVjaWZ5aW5nIGFyZ3VtZW50cyBpcyBvcHRpb25hbC4gIFRoZSBmaXJzdCBhcmd1bWVudAoraXMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQuICBUaGUgc2Vjb25kCithcmd1bWVudCBpcyBob3cgbWFueSBzZWNvbmRzIHNob3VsZCBwYXNzIGJlZm9yZSB0aGUgZnVuY3Rpb24gZ2V0cworY2FsbGVkLgorCitQcmFjdGljYWxseSBzcGVha2luZywgd2hlbiBhbiBvYmplY3QgY2FsbHMgY2FsbF9vdXQoKSwgaXQgaXMgYWRkZWQgdG8gYSBsaXN0CitvZiBvYmplY3RzIHdpdGggcGVuZGluZyBjYWxsIG91dHMgd2l0aCB0aGUgYW1vdW50IG9mIHRpbWUgb2YgdGhlIGNhbGwgb3V0CithbmQgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZC4gIEVhY2ggY3ljbGUgb2YgdGhlIGRyaXZlciwgdGhlCit0aW1lIGlzIGNvdW50ZWQgZG93biB1bnRpbCBpdCBiZWNvbWVzIHRpbWUgZm9yIHRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQuIAorV2hlbiB0aGUgdGltZSBjb21lcywgdGhlIGRyaXZlciByZW1vdmVzIHRoZSBvYmplY3QgZnJvbSB0aGUgbGlzdCBvZgorb2JqZWN0cyB3aXRoIHBlbmRpbmcgY2FsbCBvdXRzIGFuZCBwZXJmb3JtcyB0aGUgY2FsbCB0byB0aGUgY2FsbCBvdXQKK2Z1bmN0aW9uLCBwYXNzaW5nIGFueSBzcGVjaWFsIGFyZ3Mgb3JpZ2luYWxseSBzcGVjaWZpZWQgYnkgdGhlIGNhbGwgb3V0CitmdW5jdGlvbi4KKworSWYgeW91IHdhbnQgYSB0byByZW1vdmUgYSBwZW5kaW5nIGNhbGwgYmVmb3JlIGl0IG9jY3VycywgeW91IG5lZWQgdG8gdXNlCit0aGUgcmVtb3ZlX2NhbGxfb3V0KCkgZWZ1biwgcGFzc2luZyB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gYmVpbmcKK2NhbGxlZCBvdXQuICBUaGUgZHJpdmVyIHdpbGwgcmVtb3ZlIHRoZSBuZXh0IHBlbmRpbmcgY2FsbCBvdXQgdG8gdGhhdAorZnVuY3Rpb24uICBUaGlzIG1lYW5zIHlvdSBtYXkgaGF2ZSBzb21lIGFtYmlndWl0eSBpZiBtb3JlIHRoYW4gb25lCitjYWxsIG91dCBpcyBwZW5kaW5nIGZvciB0aGUgc2FtZSBmdW5jdGlvbi4KKworSW4gb3JkZXIgdG8gbWFrZSBhIGNhbGwgb3V0IGN5Y2xpY2FsLCB5b3UgbXVzdCByZWlzc3VlIHRoZSBjYWxsX291dCgpIGVmdW4KK2luIHRoZSBmdW5jdGlvbiB5b3UgY2FsbGVkIG91dCwgc2luY2UgdGhlIGRyaXZlciBhdXRvbWF0aWNhbGx5IHJlbW92ZXMgdGhlCitmdW5jdGlvbiBmcm9tIHRoZSBjYWxsIG91dCB0YWJsZSB3aGVuIGEgY2FsbCBvdXQgaXMgcGVyZm9ybWVkLiAgRXhhbXBsZToKKwordm9pZCBmb28oKSB7IGNhbGxfb3V0KCJoZWxsbyIsIDEwKTsgfQorCit2b2lkIGhlbGxvKCkgeyBjYWxsX291dCgiaGVsbG8iLCAxMCk7IH0KKword2lsbCBzZXQgdXAgaGVsbG8oKSB0byBiZSBjYWxsZWQgZXZlcnkgMTAgc2Vjb25kcyBhZnRlciBmb28oKSBpcyBmaXJzdCBjYWxsZWQuIAorVGhlcmUgYXJlIHNldmVyYWwgdGhpbmdzIHRvIGJlIGNhcmVmdWwgYWJvdXQgaGVyZS4gIEZpcnN0LCB5b3UgbXVzdCB3YXRjaAordG8gbWFrZSBzdXJlIHlvdSBkbyBub3Qgc3RydWN0dXJlIHlvdXIgY2FsbCBvdXRzIHRvIGJlIHJlY3Vyc2l2ZSBpbiBhbnkKK3VuaW50ZW5kZWQgZmFzaGlvbi4gIFNlY29uZCwgY29tcGFyZSB3aGF0IGEgc2V0X2hlYXJ0X2JlYXQoKSBkb2VzCit3aGVuIGNvbXBhcmVkIGRpcmVjdGx5IHRvIHdoYXQgY2FsbF9vdXQoKSBkb2VzLgorCitzZXRfaGVhcnRfYmVhdCgpOgorYSkgQWRkcyB0aGlzX29iamVjdCgpIHRvIGEgdGFibGUgbGlzdGluZyBvYmplY3RzIHdpdGggaGVhcnRiZWF0cy4KK2IpIFRoZSBmdW5jdGlvbiBoZWFydF9iZWF0KCkgaW4gdGhpc19vYmplY3QoKSBnZXRzIGNhbGxlZCBldmVyeSBzaW5nbGUKK2RyaXZlciBjeWNsZS4KKworY2FsbF9vdXQoKToKK2EpIEFkZHMgdGhpc19vYmplY3QoKSwgdGhlIG5hbWUgb2YgYSBmdW5jdGlvbiBpbiB0aGlzX29iamVjdCgpLCBhIHRpbWUKK2RlbGF5LCBhbmQgYSBzZXQgb2YgYXJndW1lbnRzIHRvIGEgdGFibGUgbGlzdGluZyBmdW5jdGlvbnMgd2l0aCBwZW5kaW5nCitjYWxsIG91dHMuICAKK2IpIFRoZSBmdW5jdGlvbiBuYW1lZCBpcyBjYWxsZWQgb25seSBvbmNlLCBhbmQgdGhhdCBjYWxsIGNvbWVzIGFmdGVyIHRoZQorc3BlY2lmaWVkIGRlbGF5LgorCitBcyB5b3UgY2FuIHNlZSwgdGhlcmUgaXMgYSBtdWNoIGdyZWF0ZXIgbWVtb3J5IG92ZXJoZWFkIGFzc29jaWF0ZWQKK3dpdGggY2FsbCBvdXRzIGZvciBwYXJ0IChhKSwgeWV0IHRoYXQgdGhlcmUgaXMgYSBtdWNoIGdyZWF0ZXIgQ1BVIG92ZXJoZWFkCithc3NvY2lhdGVkIHdpdGggaGVhcnRiZWF0cyBhcyBzaG93biBpbiBwYXJ0IChiKSwgYXNzdW1pbmcgdGhhdCB0aGUgZGVsYXkKK2ZvciB0aGUgY2FsbCBvdXQgaXMgZ3JlYXRlciB0aGFuIGEgc2luZ2xlIGRyaXZlciBjeWNsZS4gCisKK0NsZWFybHksIHlvdSBkbyBub3Qgd2FudCB0byBiZSBpc3N1aW5nIDEgc2Vjb25kIGNhbGwgb3V0cywgZm9yIHRoZW4geW91CitnZXQgdGhlIHdvcnN0IG9mIGJvdGggd29ybGRzLiAgU2ltaWxhcmx5LCB5b3UgZG8gbm90IHdhbnQgdG8gYmUgaGF2aW5nCitoZWFydCBiZWF0cyBpbiBvYmplY3RzIHRoYXQgY2FuIHBlcmZvcm0gdGhlIHNhbWUgZnVuY3Rpb25zIHdpdGggY2FsbCBvdXRzCitvZiBhIGdyZWF0ZXIgZHVyYXRpb24gdGhhbiAxIHNlY29uZC4gIEkgcGVyc29uYWxseSBoYXZlIGhlYXJkIG11Y2ggdGFsaworYWJvdXQgYXQgd2hhdCBwb2ludCB5b3Ugc2hvdWxkIHVzZSBhIGNhbGwgb3V0IG92ZXIgYSBoZWFydGJlYXQuICBXaGF0IEkKK2hhdmUgbW9zdGx5IGhlYXJkIGlzIHRoYXQgZm9yIHNpbmdsZSBjYWxscyBvciBmb3IgY3ljbGVzIG9mIGEgZHVyYXRpb24KK2dyZWF0ZXIgdGhhbiAxMCBzZWNvbmRzLCBpdCBpcyBiZXN0IHRvIHVzZSBhIGNhbGwgb3V0LiAgRm9yIHJlcGV0aXRpdmUgY2FsbHMgb2YKK2R1cmF0aW9ucyBsZXNzIHRoYW4gMTAgc2Vjb25kcywgeW91IGFyZSBiZXR0ZXIgb2ZmIHVzaW5nIGhlYXJ0YmVhdHMuICBJIGRvCitub3Qga25vdyBpZiB0aGlzIGlzIHRydWUsIGJ1dCBJIGRvIG5vdCB0aGluayBmb2xsb3dpbmcgdGhpcyBjYW4gZG8gYW55CitoYXJtLgorCisyLjUgU3VtbWFyeQorQmFzaWMgdG8gYSBtb3JlIGluIGRlcHRoIHVuZGVyc3RhbmRpbmcgb2YgTFBDIGlzIGFuZCB1bmRlcnN0YW5kaW5nIG9mCit0aGUgd2F5IGluIHdoaWNoIHRoZSBkcml2ZXIgaW50ZXJhY3RzIHdpdGggdGhlIG11ZGxpYi4gIFlvdSBzaG91bGQgbm93Cit1bmRlcnN0YW5kIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZHJpdmVyIHBlcmZvcm1zIGZ1bmN0aW9ucywgYXMgd2VsbCBhcyBhCittb3JlIGRldGFpbGVkIGtub3dsZWRnZSBvZiB0aGUgZWZ1bnMgdGhpc19wbGF5ZXIoKSwgYWRkX2FjdGlvbigpLCBhbmQKK21vdmVfb2JqZWN0KCkgYW5kIHRoZSBsZnVuIGluaXQoKS4gIEluIGFkZGl0aW9uIHRvIHRoaXMgYnVpbGRpbmcgdXBvbgora25vd2xlZGdlIHlvdSBnb3QgZnJvbSB0aGUgTFBDIEJhc2ljcyB0ZXh0Ym9vaywgdGhpcyBjaGFwdGVyIGhhcworaW50cm9kdWNlZCBjYWxsIG91dHMgYW5kIGhlYXJ0YmVhdHMgYW5kIHRoZSBtYW5uZXIgaW4gd2hpY2ggdGhlIGRyaXZlcgoraGFuZGxlcyB0aGVtLiAgWW91IHNob3VsZCBub3cgaGF2ZSBhIGJhc2ljIHVuZGVyc3RhbmRpbmcgb2YgY2FsbCBvdXRzCithbmQgaGVhcnRiZWF0cyBzdWNoIHRoYXQgeW91IGNhbiBleHBlcmltZW50IHdpdGggdGhlbSBpbiB5b3VyIHJlYWxtCitjb2RlLgorCitDb3B5cmlnaHQgKGMpIEdlb3JnZSBSZWVzZSAxOTkzCmRpZmYgLS1naXQgYS9kb2MvS1VSUy9MUEMtS1VSUzIvY2hhcHRlcjMgYi9kb2MvS1VSUy9MUEMtS1VSUzIvY2hhcHRlcjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk4NjczNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9LVVJTL0xQQy1LVVJTMi9jaGFwdGVyMwpAQCAtMCwwICsxLDQ4MSBAQAorSW50ZXJtZWRpYXRlIExQQworRGVzY2FydGVzIG9mIEJvcmcKK05vdmVtYmVyIDE5OTMKKworICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcHRlciAzOiBDb21wbGV4IERhdGEgVHlwZXMKKworMy4xIFNpbXBsZSBEYXRhIFR5cGVzCitJbiB0aGUgdGV4dGJvb2sgTFBDIEJhc2ljcywgeW91IGxlYXJuZWQgYWJvdXQgdGhlIGNvbW1vbiwgYmFzaWMgTFBDCitkYXRhIHR5cGVzOiBpbnQsIHN0cmluZywgb2JqZWN0LCB2b2lkLiAgTW9zdCBpbXBvcnRhbnQgeW91IGxlYXJuZWQgdGhhdAorbWFueSBvcGVyYXRpb25zIGFuZCBmdW5jdGlvbnMgYmVoYXZlIGRpZmZlcmVudGx5IGJhc2VkIG9uIHRoZSBkYXRhIHR5cGUKK29mIHRoZSB2YXJpYWJsZXMgdXBvbiB3aGljaCB0aGV5IGFyZSBvcGVyYXRpbmcuICBTb21lIG9wZXJhdG9ycyBhbmQKK2Z1bmN0aW9ucyB3aWxsIGV2ZW4gZ2l2ZSBlcnJvcnMgaWYgeW91IHVzZSB0aGVtIHdpdGggdGhlIHdyb25nIGRhdGEKK3R5cGVzLiAgRm9yIGV4YW1wbGUsICJhIisiYiIgaXMgaGFuZGxlZCBtdWNoIGRpZmZlcmVudGx5IHRoYW4gMSsxLiAKK1doZW4geW91IGFzcyAiYSIrImIiLCB5b3UgYXJlIGFkZGluZyAiYiIgb250byB0aGUgZW5kIG9mICJhIiB0byBnZXQKKyJhYiIuICBPbiB0aGUgb3RoZXIgaGFuZCwgd2hlbiB5b3UgYWRkIDErMSwgeW91IGRvIG5vdCBnZXQgMTEsIHlvdSBnZXQKKzIgYXMgeW91IHdvdWxkIGV4cGVjdC4KKworSSByZWZlciB0byB0aGVzZSBkYXRhIHR5cGVzIGFzIHNpbXBsZSBkYXRhIHR5cGVzLCBiZWNhdXNlIHRoZXkgYXRvbWljIGluCit0aGF0IHRoZXkgY2Fubm90IGJlIGJyb2tlbiBkb3duIGludG8gc21hbGxlciBjb21wb25lbnQgZGF0YSB0eXBlcy4gCitUaGUgb2JqZWN0IGRhdGEgdHlwZSBpcyBhIHNvcnQgb2YgZXhjZXB0aW9uLCBidXQgeW91IHJlYWxseSBjYW5ub3QgcmVmZXIKK2luZGl2aWR1YWxseSB0byB0aGUgY29tcG9uZW50cyB3aGljaCBtYWtlIGl0IHVwLCBzbyBJIHJlZmVyIHRvIGl0IGFzIGEKK3NpbXBsZSBkYXRhIHR5cGUuCisKK1RoaXMgY2hhcHRlciBpbnRyb2R1Y2VzIHRoZSBjb25jZXB0IG9mIHRoZSBjb21wbGV4IGRhdGEgdHlwZSwgYSBkYXRhIHR5cGUKK3doaWNoIGlzIG1hZGUgdXAgb2YgdW5pdHMgb2Ygc2ltcGxlIGRhdGEgdHlwZXMuICBMUEMgaGFzIHR3byBjb21tb24KK2NvbXBsZXggZGF0YSB0eXBlcywgYm90aCBraW5kcyBvZiBhcnJheXMuICBGaXJzdCwgdGhlcmUgaXMgdGhlIHRyYWRpdGlvbmFsCithcnJheSB3aGljaCBzdG9yZXMgdmFsdWVzIGluIGNvbnNlY3V0aXZlIGVsZW1lbnRzIGFjY2Vzc2VkIGJ5IGEgbnVtYmVyCityZXByZXNlbnRpbmcgd2hpY2ggZWxlbWVudCB0aGV5IGFyZSBzdG9yZWQgaW4uICBTZWNvbmQgaXMgYW4gYXNzb2NpYXRpdmUKK2FycmF5IGNhbGxlZCBhIG1hcHBpbmcuICBBIG1hcHBpbmcgYXNzb2NpYXRlcyB0byB2YWx1ZXMgdG9nZXRoZXIgdG8KK2FsbG93IGEgbW9yZSBuYXR1cmFsIGFjY2VzcyB0byBkYXRhLgorCiszLjIgVGhlIFZhbHVlcyBOVUxMIGFuZCAwCitCZWZvcmUgZ2V0dGluZyBmdWxseSBpbnRvIGFycmF5cywgdGhlcmUgZmlyc3Qgc2hvdWxkIGJlIGEgZnVsbCB1bmRlcnN0YW5kaW5nCitvZiB0aGUgY29uY2VwdCBvZiBOVUxMIHZlcnN1cyB0aGUgY29uY2VwdCBvZiAwLiAgSW4gTFBDLCBhIG51bGwgdmFsdWUgaXMKK3JlcHJlc2VudGVkIGJ5IHRoZSBpbnRlZ2VyIDAuICBBbHRob3VnaCB0aGUgaW50ZWdlciAwIGFuZCBOVUxMIGFyZSBvZnRlbgorZnJlZWx5IGludGVyY2hhbmdlYWJsZSwgdGhpcyBpbnRlcmNoYW5nZWFiaWxpdHkgb2Z0ZW4gbGVhZHMgdG8gc29tZSBncmVhdAorY29uZnVzaW9uIHdoZW4geW91IGdldCBpbnRvIHRoZSByZWFsbSBvZiBjb21wbGV4IGRhdGEgdHlwZXMuICBZb3UgbWF5CitoYXZlIGV2ZW4gZW5jb3VudGVyZWQgc3VjaCBjb25mdXNpb24gd2hpbGUgdXNpbmcgc3RyaW5ncy4KKworMCByZXByZXNlbnRzIGEgdmFsdWUgd2hpY2ggZm9yIGludGVnZXJzIG1lYW5zIHRoZSB2YWx1ZSB5b3UgYWRkIHRvCithbm90aGVyIHZhbHVlIHlldCBzdGlsbCByZXRhaW4gdGhlIHZhbHVlIGFkZGVkLiAgVGhpcyBmb3IgYW55IGFkZGl0aW9uCitvcGVyYXRpb24gb24gYW55IGRhdGEgdHlwZSwgdGhlIFpFUk8gdmFsdWUgZm9yIHRoYXQgZGF0YSB0eXBlIGlzIHRoZSB2YWx1ZQordGhhdCB5b3UgY2FuIGFkZCB0byBhbnkgb3RoZXIgdmFsdWUgYW5kIGdldCB0aGUgb3JpZ2luYWwgdmFsdWUuICBUaHVzOiAgIEEKK3BsdXMgWkVSTyBlcXVhbHMgQSB3aGVyZSBBIGlzIHNvbWUgdmFsdWUgb2YgYSBnaXZlbiBkYXRhIHR5cGUgYW5kCitaRVJPIGlzIHRoZSBaRVJPIHZhbHVlIGZvciB0aGF0IGRhdGEgdHlwZS4gIFRoaXMgaXMgbm90IGFueSBzb3J0IG9mCitvZmZpY2lhbCBtYXRoZW1hdGljYWwgZGVmaW5pdGlvbi4gIFRoZXJlIGV4aXN0cyBvbmUsIGJ1dCBJIGFtIG5vdCBhCittYXRoZW1hdGljaWFuLCBzbyBJIGhhdmUgbm8gaWRlYSB3aGF0IHRoZSB0ZXJtIGlzLiAgVGh1cyBmb3IgaW50ZWdlcnMsIDAKK2lzIHRoZSBaRVJPIHZhbHVlIHNpbmNlIDEgKyAwIGVxdWFscyAxLgorCitOVUxMLCBvbiB0aGUgb3RoZXIgaGFuZCwgaXMgdGhlIGFic2VuY2Ugb2YgYW55IHZhbHVlIG9yIG1lYW5pbmcuICBUaGUKK0xQQyBkcml2ZXIgd2lsbCBpbnRlcnByZXQgTlVMTCBhcyBhbiBpbnRlZ2VyIDAgaWYgaXQgY2FuIG1ha2Ugc2Vuc2Ugb2YgaXQKK2luIHRoYXQgY29udGV4dC4gIEluIGFueSBjb250ZXh0IGJlc2lkZXMgaW50ZWdlciBhZGRpdGlvbiwgQSBwbHVzIE5VTEwKK2NhdXNlcyBhbiBlcnJvci4gIE5VTEwgY2F1c2VzIGFuIGVycm9yIGJlY2F1c2UgYWRkaW5nIHZhbHVlbGVzcyBmaWVsZHMKK2luIG90aGVyIGRhdGEgdHlwZXMgdG8gdGhvc2UgZGF0YSB0eXBlcyBtYWtlcyBubyBzZW5zZS4KKworTG9va2luZyBhdCB0aGlzIGZyb20gYW5vdGhlciBwb2ludCBvZiB2aWV3LCB3ZSBjYW4gZ2V0IHRoZSBaRVJPIHZhbHVlCitmb3Igc3RyaW5ncyBieSBrbm93aW5nIHdoYXQgYWRkZWQgdG8gImEiIHdpbGwgZ2l2ZSB1cyAiYSIgYXMgYSByZXN1bHQuIAorVGhlIGFuc3dlciBpcyBub3QgMCwgYnV0IGluc3RlYWQgIiIuICBXaXRoIGludGVnZXJzLCBpbnRlcmNoYW5naW5nIE5VTEwKK2FuZCAwIHdhcyBhY2NlcHRhYmxlIHNpbmNlIDAgcmVwcmVzZW50cyBubyB2YWx1ZSB3aXRoIHJlc3BlY3QgdG8gdGhlCitpbnRlZ2VyIGRhdGEgdHlwZS4gIFRoaXMgaW50ZXJjaGFuZ2VhYmlsaXR5IGlzIG5vdCB0cnVlIGZvciBvdGhlciBkYXRhIHR5cGVzLAorc2luY2UgdGhlaXIgWkVSTyB2YWx1ZXMgZG8gbm90IHJlcHJlc2VudCBubyB2YWx1ZS4gIE5hbWVseSwgIiIKK3JlcHJlc2VudHMgYSBzdHJpbmcgb2Ygbm8gbGVuZ3RoIGFuZCBpcyB2ZXJ5IGRpZmZlcmVudCBmcm9tIDAuICAKKworV2hlbiB5b3UgZmlyc3QgZGVjbGFyZSBhbnkgdmFyaWFibGUgb2YgYW55IHR5cGUsIGl0IGhhcyBubyB2YWx1ZS4gIEFueQorZGF0YSB0eXBlIGV4Y2VwdCBpbnRlZ2VycyB0aGVyZWZvcmUgbXVzdCBiZSBpbml0aWFsaXplZCBzb21laG93IGJlZm9yZQoreW91IHBlcmZvcm0gYW55IG9wZXJhdGlvbiBvbiBpdC4gIEdlbmVyYWxseSwgaW5pdGlhbGl6YXRpb24gaXMgZG9uZSBpbiB0aGUKK2NyZWF0ZSgpIGZ1bmN0aW9uIGZvciBnbG9iYWwgdmFyaWFibGVzLCBvciBhdCB0aGUgdG9wIG9mIHRoZSBsb2NhbCBmdW5jdGlvbgorZm9yIGxvY2FsIHZhcmlhYmxlcyBieSBhc3NpZ25pbmcgdGhlbSBzb21lIHZhbHVlLCBvZnRlbiB0aGUgWkVSTyB2YWx1ZQorZm9yIHRoYXQgZGF0YSB0eXBlLiAgRm9yIGV4YW1wbGUsIGluIHRoZSBmb2xsb3dpbmcgY29kZSBJIHdhbnQgdG8gYnVpbGQgYQorc3RyaW5nIHdpdGggcmFuZG9tIHdvcmRzOgorCitzdHJpbmcgYnVpbGRfbm9uc2Vuc2UoKSB7CisgICAgc3RyaW5nIHN0cjsKKyAgICBpbnQgaTsKKworICAgIHN0ciA9ICIiOyAvKiBIZXJlIHN0ciBpcyBpbml0aWFsaXplZCB0byB0aGUgc3RyaW5nCitaRVJPIHZhbHVlICovCisgICAgZm9yKGk9MDsgaTw2OyBpKyspIHsKKyAgICAgICAgc3dpdGNoKHJhbmRvbSgzKSsxKSB7CisgICAgICAgICAgICBjYXNlIDE6IHN0ciArPSAiYmluZyI7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOiBzdHIgKz0gImJvcmciOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzogc3RyICs9ICJmb28iOyBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZihpPT01KSBzdHIgKz0gIi5cbiI7CisgICAgICAgIGVsc2Ugc3RyICs9ICIgIjsKKyAgICB9CisgICAgcmV0dXJuIGNhcGl0YWxpemUoc3RyKTsKK30KKworSWYgd2UgaGFkIG5vdCBpbml0aWFsaXplZCB0aGUgdmFyaWFibGUgc3RyLCBhbiBlcnJvciB3b3VsZCBoYXZlIHJlc3VsdGVkCitmcm9tIHRyeWluZyB0byBhZGQgYSBzdHJpbmcgdG8gYSBOVUxMIHZhbHVlLiAgSW5zdGVhZCwgdGhpcyBjb2RlIGZpcnN0Citpbml0aWFsaXplcyBzdHIgdG8gdGhlIFpFUk8gdmFsdWUgZm9yIHN0cmluZ3MsICIiLiAgQWZ0ZXIgdGhhdCwgaXQgZW50ZXJzIGEKK2xvb3Agd2hpY2ggbWFrZXMgNiBjeWNsZXMsIGVhY2ggdGltZSByYW5kb21seSBhZGRpbmcgb25lIG9mIHRocmVlCitwb3NzaWJsZSB3b3JkcyB0byB0aGUgc3RyaW5nLiAgRm9yIGFsbCB3b3JkcyBleGNlcHQgdGhlIGxhc3QsIGFuIGFkZGl0aW9uYWwKK2JsYW5rIGNoYXJhY3RlciBpcyBhZGRlZC4gIEZvciB0aGUgbGFzdCB3b3JkLCBhIHBlcmlvZCBhbmQgYSByZXR1cm4KK2NoYXJhY3RlciBhcmUgYWRkZWQuICBUaGUgZnVuY3Rpb24gdGhlbiBleGl0cyB0aGUgbG9vcCwgY2FwaXRhbGl6ZXMgdGhlCitub25zZW5zZSBzdHJpbmcsIHRoZW4gZXhpdHMuCisKKzMuMyBBcnJheXMgaW4gTFBDCitBbiBhcnJheSBpcyBhIHBvd2VyZnVsIGNvbXBsZXggZGF0YSB0eXBlIG9mIExQQyB3aGljaCBhbGxvd3MgeW91IHRvCithY2Nlc3MgbXVsdGlwbGUgdmFsdWVzIHRocm91Z2ggYSBzaW5nbGUgdmFyaWFibGUuICBGb3IgaW5zdGFuY2UsCitOaWdodG1hcmUgaGFzIGFuIGluZGVmaW5pdGUgbnVtYmVyIG9mIGN1cnJlbmNpZXMgaW4gd2hpY2ggcGxheWVycyBtYXkKK2RvIGJ1c2luZXNzLiAgT25seSBmaXZlIG9mIHRob3NlIGN1cnJlbmNpZXMsIGhvd2V2ZXIsIGNhbiBiZSBjb25zaWRlcmVkCitoYXJkIGN1cnJlbmNpZXMuICBBIGhhcmQgY3VycmVuY3kgZm9yIHRoZSBzYWtlIG9mIHRoaXMgZXhhbXBsZSBpcyBhCitjdXJyZW5jeSB3aGljaCBpcyByZWFkaWx5IGV4Y2hhbmdlYWJsZSBmb3IgYW55IG90aGVyIGhhcmQgY3VycmVuY3ksCit3aGVyZWFzIGEgc29mdCBjdXJyZW5jeSBtYXkgb25seSBiZSBib3VnaHQsIGJ1dCBub3Qgc29sZC4gIEluIHRoZSBiYW5rLAordGhlcmUgaXMgYSBsaXN0IG9mIGhhcmQgY3VycmVuY2llcyB0byBhbGxvdyBiYW5rIGtlZXBlcnMgdG8ga25vdyB3aGljaAorY3VycmVuY2llcyBhcmUgaW4gZmFjdCBoYXJkIGN1cnJlbmNpZXMuICBXaXRoIHNpbXBsZSBkYXRhIHR5cGVzLCB3ZSB3b3VsZAoraGF2ZSB0byBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgbmFzdHkgb3BlcmF0aW9uIGZvciBldmVyeSBleGNoYW5nZQordHJhbnNhY3Rpb246CisKK2ludCBleGNoYW5nZShzdHJpbmcgc3RyKSB7CisgICAgc3RyaW5nIGZyb20sIHRvOworICAgIGludCBhbXQ7CisKKyAgICBpZighc3RyKSByZXR1cm4gMDsKKyAgICBpZihzc2NhbmYoc3RyLCAiJWQgJXMgZm9yICVzIiwgYW10LCBmcm9tLCB0bykgIT0gMykKKyAgICAgIHJldHVybiAwOworICAgIGlmKGZyb20gIT0gInBsYXRpbnVtIiAmJiBmcm9tICE9ICJnb2xkIiAmJiBmcm9tICE9CisgICAgICAic2lsdmVyIiAmJgorICAgICAgZnJvbSAhPSAiZWxlY3RydW0iICYmIGZyb20gIT0gImNvcHBlciIpIHsKKyAgICAgICAgbm90aWZ5X2ZhaWwoIldlIGRvIG5vdCBidXkgc29mdCBjdXJyZW5jaWVzIVxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAuLi4KK30KKworV2l0aCBmaXZlIGhhcmQgY3VycmVuY2llcywgd2UgaGF2ZSBhIHJhdGhlciBzaW1wbGUgZXhhbXBsZS4gIEFmdGVyIGFsbCBpdAordG9vayBvbmx5IHR3byBsaW5lcyBvZiBjb2RlIHRvIHJlcHJlc2VudCB0aGUgaWYgc3RhdGVtZW50IHdoaWNoIGZpbHRlcmVkCitvdXQgYmFkIGN1cnJlbmNpZXMuICBCdXQgd2hhdCBpZiB5b3UgaGFkIHRvIGNoZWNrIGFnYWluc3QgYWxsIHRoZSBuYW1lcword2hpY2ggY2Fubm90IGJlIHVzZWQgdG8gbWFrZSBjaGFyYWN0ZXJzIGluIHRoZSBnYW1lPyAgVGhlcmUgbWlnaHQgYmUKKzEwMCBvZiB0aG9zZTsgd291bGQgeW91IHdhbnQgdG8gd3JpdGUgYSAxMDAgcGFydCBpZiBzdGF0ZW1lbnQ/CitXaGF0IGlmIHlvdSB3YW50ZWQgdG8gYWRkIGEgY3VycmVuY3kgdG8gdGhlIGxpc3Qgb2YgaGFyZCBjdXJyZW5jaWVzPyAgVGhhdAorbWVhbnMgeW91IHdvdWxkIGhhdmUgdG8gY2hhbmdlIGV2ZXJ5IGNoZWNrIGluIHRoZSBnYW1lIGZvciBoYXJkCitjdXJyZW5jaWVzIHRvIGFkZCBvbmUgbW9yZSBwYXJ0IHRvIHRoZSBpZiBjbGF1c2VzLiAgQXJyYXlzIGFsbG93IHlvdQorc2ltcGxlIGFjY2VzcyB0byBncm91cHMgb2YgcmVsYXRlZCBkYXRhIHNvIHRoYXQgeW91IGRvIG5vdCBoYXZlIHRvIGRlYWwKK3dpdGggZWFjaCBpbmRpdmlkdWFsIHZhbHVlIGV2ZXJ5IHRpbWUgeW91IHdhbnQgdG8gcGVyZm9ybSBhIGdyb3VwCitvcGVyYXRpb24uCisKK0FzIGEgY29uc3RhbnQsIGFuIGFycmF5IG1pZ2h0IGxvb2sgbGlrZSB0aGlzOgorICAgICh7ICJwbGF0aW51bSIsICJnb2xkIiwgInNpbHZlciIsICJlbGVjdHJ1bSIsICJjb3BwZXIiIH0pCit3aGljaCBpcyBhbiBhcnJheSBvZiB0eXBlIHN0cmluZy4gIEluZGl2aWR1YWwgZGF0YSB2YWx1ZXMgaW4gYXJyYXlzIGFyZQorY2FsbGVkIGVsZW1lbnRzLCBvciBzb21ldGltZXMgbWVtYmVycy4gIEluIGNvZGUsIGp1c3QgYXMgY29uc3RhbnQKK3N0cmluZ3MgYXJlIHJlcHJlc2VudGVkIGJ5IHN1cnJvdW5kaW5nIHRoZW0gd2l0aCAiIiwgY29uc3RhbnQgYXJyYXlzIGFyZQorcmVwcmVzZW50ZWQgYnkgYmVpbmcgc3Vycm91bmRlZCBieSAoeyB9KSwgd2l0aCBpbmRpdmlkdWFsIGVsZW1lbnRzIG9mCit0aGUgYXJyYXkgYmVpbmcgc2VwYXJhdGVkIGJ5IGEgLC4KKworWW91IG1heSBoYXZlIGFycmF5cyBvZiBhbnkgTFBDIGRhdGEgdHlwZSwgc2ltcGxlIG9yIGNvbXBsZXguICBBcnJheXMKK21hZGUgdXAgb2YgbWl4ZXMgb2YgdmFsdWVzIGFyZSBjYWxsZWQgYXJyYXlzIG9mIG1peGVkIHR5cGUuICBJbiBtb3N0CitMUEMgZHJpdmVycywgeW91IGRlY2xhcmUgYW4gYXJyYXkgdXNpbmcgYSB0aHJvdy1iYWNrIHRvIEMgbGFuZ3VhZ2UKK3N5bnRheCBmb3IgYXJyYXlzLiAgVGhpcyBzeW50YXggaXMgb2Z0ZW4gY29uZnVzaW5nIGZvciBMUEMgY29kZXJzCitiZWNhdXNlIHRoZSBzeW50YXggaGFzIGEgbWVhbmluZyBpbiBDIHRoYXQgc2ltcGx5IGRvZXMgbm90IHRyYW5zbGF0ZSBpbnRvCitMUEMuICBOZXZlcnRoZWxlc3MsIGlmIHdlIHdhbnRlZCBhbiBhcnJheSBvZiB0eXBlIHN0cmluZywgd2Ugd291bGQKK2RlY2xhcmUgaXQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXI6CisKK3N0cmluZyAqYXJyOworCitJbiBvdGhlciB3b3JkcywgdGhlIGRhdGEgdHlwZSBvZiB0aGUgZWxlbWVudHMgaXQgd2lsbCBjb250YWluIGZvbGxvd2VkIGJ5CithIHNwYWNlIGFuZCBhbiBhc3Rlcmlzay4gIFJlbWVtYmVyLCBob3dldmVyLCB0aGF0IHRoaXMgbmV3bHkgZGVjbGFyZWQKK3N0cmluZyBhcnJheSBoYXMgYSBOVUxMIHZhbHVlIGluIGl0IGF0IHRoZSB0aW1lIG9mIGRlY2xhcmF0aW9uLgorCiszLjQgVXNpbmcgQXJyYXlzCitZb3Ugbm93IHNob3VsZCB1bmRlcnN0YW5kIGhvdyB0byBkZWNsYXJlIGFuZCByZWNvZ25pemUgYW4gYXJyYXkgaW4KK2NvZGUuICBJbiBvcmRlciB0byB1bmRlcnN0YW5kIGhvdyB0aGV5IHdvcmsgaW4gY29kZSwgbGV0J3MgcmV2aWV3IHRoZQorYmFuayBjb2RlLCB0aGlzIHRpbWUgdXNpbmcgYXJyYXlzOgorCitzdHJpbmcgKmhhcmRfY3VycmVuY2llczsKKworaW50IGV4Y2hhbmdlKHN0cmluZyBzdHIpIHsKKyAgICBzdHJpbmcgZnJvbSwgdG87CisgICAgaW50IGFtdDsKKworICAgIGlmKCFzdHIpIHJldHVybiAwOworICAgIGlmKHNzY2FuZihzdHIsICIlZCAlcyBmb3IgJXMiLCBhbXQsIGZyb20sIHRvKSAhPSAzKQorcmV0dXJuIDA7CisgICAgaWYobWVtYmVyX2FycmF5KGZyb20sIGhhcmRfY3VycmVuY2llcykgPT0gLTEpIHsKKyAgICAgICAgbm90aWZ5X2ZhaWwoIldlIGRvIG5vdCBidXkgc29mdCBjdXJyZW5jaWVzIVxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAuLi4KK30KKworVGhpcyBjb2RlIGFzc3VtZXMgaGFyZF9jdXJyZW5jaWVzIGlzIGEgZ2xvYmFsIHZhcmlhYmxlIGFuZCBpcyBpbml0aWFsaXplZAoraW4gY3JlYXRlKCkgYXM6CisgICAgaGFyZF9jdXJyZW5jaWVzID0gKHsgInBsYXRpbnVtIiwgImdvbGQiLCAiZWxlY3RydW0iLCAic2lsdmVyIiwKKyAgICJjb3BwZXIiIH0pOworSWRlYWxseSwgeW91IHdvdWxkIGhhdmUgaGFyZCBjdXJyZW5jaWVzIGFzIGEgI2RlZmluZSBpbiBhIGhlYWRlciBmaWxlIGZvcgorYWxsIG9iamVjdHMgdG8gdXNlLCBidXQgI2RlZmluZSBpcyBhIHRvcGljIGZvciBhIGxhdGVyIGNoYXB0ZXIuCisKK09uY2UgeW91IGtub3cgd2hhdCB0aGUgbWVtYmVyX2FycmF5KCkgZWZ1biBkb2VzLCB0aGlzIG1ldGhvZAorY2VydGFpbmx5IGlzIG11Y2ggZWFzaWVyIHRvIHJlYWQgYXMgd2VsbCBhcyBpcyBtdWNoIG1vcmUgZWZmaWNpZW50IGFuZAorZWFzaWVyIHRvIGNvZGUuICBJbiBmYWN0LCB5b3UgY2FuIHByb2JhYmx5IGd1ZXNzIHdoYXQgdGhlCittZW1iZXJfYXJyYXkoKSBlZnVuIGRvZXM6ICBJdCB0ZWxscyB5b3UgaWYgYSBnaXZlbiB2YWx1ZSBpcyBhIG1lbWJlciBvZgordGhlIGFycmF5IGluIHF1ZXN0aW9uLiAgU3BlY2lmaWNhbGx5IGhlcmUsIHdlIHdhbnQgdG8ga25vdyBpZiB0aGUgY3VycmVuY3kKK3RoZSBwbGF5ZXIgaXMgdHJ5aW5nIHRvIHNlbGwgaXMgYW4gZWxlbWVudCBpbiB0aGUgaGFyZF9jdXJlbmNpZXMgYXJyYXkuIAorV2hhdCBtaWdodCBiZSBjb25mdXNpbmcgdG8geW91IGlzLCBub3Qgb25seSBkb2VzIG1lbWJlcl9hcnJheSgpIHRlbGwgdXMKK2lmIHRoZSB2YWx1ZSBpcyBhbiBlbGVtZW50IGluIHRoZSBhcnJheSwgYnV0IGl0IGluIGZhY3QgdGVsbHMgdXMgd2hpY2ggZWxlbWVudAorb2YgdGhlIGFycmF5IHRoZSB2YWx1ZSBpcy4KKworSG93IGRvZXMgaXQgdGVsbCB5b3Ugd2hpY2ggZWxlbWVudD8gIEl0IGlzIGVhc2llciB0byB1bmRlcnN0YW5kIGFycmF5cyBpZgoreW91IHRoaW5rIG9mIHRoZSBhcnJheSB2YXJpYWJsZSBhcyBob2xkaW5nIGEgbnVtYmVyLiAgSW4gdGhlIHZhbHVlIGFib3ZlLAorZm9yIHRoZSBzYWtlIG9mIGFyZ3VtZW50LCB3ZSB3aWxsIHNheSB0aGF0IGhhcmRfY3VycmVuY2llcyBob2xkcyB0aGUKK3ZhbHVlIDE3OTAwMC4gIFRoaXMgdmFsdWUgdGVsbHMgdGhlIGRyaXZlciB3aGVyZSB0byBsb29rIGZvciB0aGUgYXJyYXkKK2hhcmRfY3VycmVuY2llcyByZXByZXNlbnRzLiAgVGh1cywgaGFyZF9jdXJyZW5jaWVzIHBvaW50cyB0byBhIHBsYWNlCit3aGVyZSB0aGUgYXJyYXkgdmFsdWVzIG1heSBiZSBmb3VuZC4gIFdoZW4gc29tZW9uZSBpcyB0YWxraW5nIGFib3V0Cit0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgYXJyYXksIHRoZXkgd2FudCB0aGUgZWxlbWVudCBsb2NhdGVkIGF0IDE3OTAwMC4gCitXaGVuIHRoZSBvYmplY3QgbmVlZHMgdGhlIHZhbHVlIG9mIHRoZSBzZWNvbmQgZWxlbWVudCBvZiB0aGUgYXJyYXksIGl0Citsb29rcyBhdCAxNzkwMDAgKyBvbmUgdmFsdWUsIHRoZW4gMTc5MDAwIHBsdXMgdHdvIHZhbHVlcyBmb3IgdGhlIHRoaXJkLAorYW5kIHNvIG9uLiAgV2UgY2FuIHRoZXJlZm9yZSBhY2Nlc3MgaW5kaXZpZHVhbCBlbGVtZW50cyBvZiBhbiBhcnJheSBieQordGhlaXIgaW5kZXgsIHdoaWNoIGlzIHRoZSBudW1iZXIgb2YgdmFsdWVzIGJleW9uZCB0aGUgc3RhcnRpbmcgcG9pbnQgb2YKK3RoZSBhcnJheSB3ZSBuZWVkIHRvIGxvb2sgdG8gZmluZCB0aGUgdmFsdWUuICBGb3IgdGhlIGFycmF5CitoYXJkX2N1cnJlbmNpZXMgYXJyYXk6CisicGxhdGludW0iIGhhcyBhbiBpbmRleCBvZiAwLgorImdvbGQiIGhhcyBhbiBpbmRleCBvZiAxLgorImVsZWN0cnVtIiBoYXMgYW4gaW5kZXggb2YgMi4KKyJzaWx2ZXIiIGhhcyBhbiBpbmRleCBvZiAzLgorImNvcHBlciIgaGFzIGFuIGluZGV4IG9mIDQuCisKK1RoZSBlZnVuIG1lbWJlcl9hcnJheSgpIHRodXMgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgYmVpbmcKK3Rlc3RlZCBpZiBpdCBpcyBpbiB0aGUgYXJyYXksIG9yIC0xIGlmIGl0IGlzIG5vdCBpbiB0aGUgYXJyYXkuICBJbiBvcmRlciB0bworcmVmZXJlbmNlIGFuIGluZGl2aWR1YWwgZWxlbWVudCBpbiBhbiBhcnJheSwgeW91IHVzZSBpdHMgaW5kZXggbnVtYmVyIGluCit0aGUgZm9sbG93aW5nIG1hbm5lcjoKK2FycmF5X25hbWVbaW5kZXhfbm9dCitFeGFtcGxlOgoraGFyZF9jdXJyZW5jaWVzWzNdCit3aGVyZSBoYXJkX2N1cnJlbmNpZXNbM10gd291bGQgcmVmZXIgdG8gInNpbHZlciIuCisKK1NvLCB5b3Ugbm93IHNob3VsZCBub3cgc2V2ZXJhbCB3YXlzIGluIHdoaWNoIGFycmF5cyBhcHBlYXIgZWl0aGVyIGFzCithIHdob2xlIG9yIGFzIGluZGl2aWR1YWwgZWxlbWVudHMuICBBcyBhIHdob2xlLCB5b3UgcmVmZXIgdG8gYW4gYXJyYXkKK3ZhcmlhYmxlIGJ5IGl0cyBuYW1lIGFuZCBhbiBhcnJheSBjb25zdGFudCBieSBlbmNsb3NpbmcgdGhlIGFycmF5IGluICh7IH0pCithbmQgc2VwYXJhdGluZyBlbGVtZW50cyBieSAsLiAgSW5kaXZpZHVhbGx5LCB5b3UgcmVmZXIgdG8gYXJyYXkgdmFyaWFibGVzCitieSB0aGUgYXJyYXkgbmFtZSBmb2xsb3dlZCBieSB0aGUgZWxlbWVudCdzIGluZGV4IG51bWJlciBlbmNsb3NlZCBpbgorW10sIGFuZCB0byBhcnJheSBjb25zdGFudHMgaW4gdGhlIHNhbWUgd2F5IHlvdSB3b3VsZCByZWZlciB0byBzaW1wbGUgZGF0YQordHlwZXMgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGUgY29uc3RhbnQuICBFeGFtcGxlczoKKworV2hvbGUgYXJyYXlzOgordmFyaWFibGU6ICBhcnIKK2NvbnN0YW50OiAoeyAicGxhdGludW0iLCAiZ29sZCIsICJlbGVjdHJ1bSIsICJzaWx2ZXIiLCAiY29wcGVyIiB9KQorCitJbmRpdmlkdWFsIG1lbWJlcnMgb2YgYXJyYXlzOgordmFyaWFibGU6IGFyclsyXQorY29uc3RhbnQ6ICJlbGVjdHJ1bSIKKworWW91IGNhbiB1c2UgdGhlc2UgbWVhbnMgb2YgcmVmZXJlbmNlIHRvIGRvIGFsbCB0aGUgdGhpbmdzIHlvdSBhcmUgdXNlZCB0bworZG9pbmcgd2l0aCBvdGhlciBkYXRhIHR5cGVzLiAgWW91IGNhbiBhc3NpZ24gdmFsdWVzLCB1c2UgdGhlIHZhbHVlcyBpbgorb3BlcmF0aW9ucywgcGFzcyB0aGUgdmFsdWVzIGFzIHBhcmFtZXRlcnMgdG8gZnVuY3Rpb25zLCBhbmQgdXNlIHRoZQordmFsdWVzIGFzIHJldHVybiB0eXBlcy4gIEl0IGlzIGltcG9ydGFudCB0byByZW1lbWJlciB0aGF0IHdoZW4geW91IGFyZQordHJlYXRpbmcgYW4gZWxlbWVudCBhbG9uZSBhcyBhbiBpbmRpdmlkdWFsLCB0aGUgaW5kaXZpZHVhbCBlbGVtZW50IGlzIG5vdAoraXRzZWxmIGFuIGFycmF5ICh1bmxlc3MgeW91IGFyZSBkZWFsaW5nIHdpdGggYW4gYXJyYXkgb2YgYXJyYXlzKS4gIEluIHRoZQorZXhhbXBsZSBhYm92ZSwgdGhlIGluZGl2aWR1YWwgZWxlbWVudHMgYXJlIHN0cmluZ3MuICBTbyB0aGF0OgorICAgIHN0ciA9IGFyclszXSArICIgYW5kICIgKyBhcnJbMV07Cit3aWxsIGNyZWF0ZSBzdHIgdG8gZXF1YWwgInNpbHZlciBhbmQgZ29sZCIuICBBbHRob3VnaCB0aGlzIHNlZW1zIHNpbXBsZQorZW5vdWdoLCBtYW55IHBlb3BsZSBuZXcgdG8gYXJyYXlzIHN0YXJ0IHRvIHJ1biBpbnRvIHRyb3VibGUgd2hlbiB0cnlpbmcKK3RvIGFkZCBlbGVtZW50cyB0byBhbiBhcnJheS4gIFdoZW4geW91IGFyZSB0cmVhdGluZyBhbiBhcnJheSBhcyBhIHdob2xlCithbmQgeW91IHdpc2ggdG8gYWRkIGEgbmV3IGVsZW1lbnQgdG8gaXQsIHlvdSBtdXN0IGRvIGl0IGJ5IGFkZGluZworYW5vdGhlciBhcnJheS4KKworTm90ZSB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CitzdHJpbmcgc3RyMSwgc3RyMjsKK3N0cmluZyAqYXJyOworCitzdHIxID0gImhpIjsKK3N0cjIgPSAiYnllIjsKKy8qIHN0cjEgKyBzdHIyIGVxdWFscyAiaGlieWUiICovCithcnIgPSAoeyBzdHIxIH0pICsgKHsgc3RyMiB9KTsKKy8qIGFyciBpcyBlcXVhbCB0byAoeyBzdHIxLCBzdHIyIH0pICovCitCZWZvcmUgZ29pbmcgYW55IGZ1cnRoZXIsIEkgaGF2ZSB0byBub3RlIHRoYXQgdGhpcyBleGFtcGxlIGdpdmVzIGFuCitleHRyZW1lbHkgaG9ycmlibGUgd2F5IG9mIGJ1aWxkaW5nIGFuIGFycmF5LiAgWW91IHNob3VsZCBzZXQgaXQ6IGFyciA9ICh7CitzdHIxLCBzdHIyIH0pLiAgVGhlIHBvaW50IG9mIHRoZSBleGFtcGxlLCBob3dldmVyLCBpcyB0aGF0IHlvdSBtdXN0IGFkZAorbGlrZSB0eXBlcyB0b2dldGhlci4gIElmIHlvdSB0cnkgYWRkaW5nIGFuIGVsZW1lbnQgdG8gYW4gYXJyYXkgYXMgdGhlIGRhdGEKK3R5cGUgaXQgaXMsIHlvdSB3aWxsIGdldCBhbiBlcnJvci4gIEluc3RlYWQgeW91IGhhdmUgdG8gdHJlYXQgaXQgYXMgYW4gYXJyYXkgb2YKK2Egc2luZ2xlIGVsZW1lbnQuCisKKzMuNSBNYXBwaW5ncworT25lIG9mIHRoZSBtYWpvciBhZHZhbmNlcyBtYWRlIGluIExQTXVkcyBzaW5jZSB0aGV5IHdlcmUgY3JlYXRlZCBpcwordGhlIG1hcHBpbmcgZGF0YSB0eXBlLiAgUGVvcGxlIGFsdGVybmF0ZWx5IHJlZmVyIHRvIHRoZW0gYXMgYXNzb2NpYXRpdmUKK2FycmF5cy4gIFByYWN0aWNhbGx5IHNwZWFraW5nLCBhIG1hcHBpbmcgYWxsb3dzIHlvdSBmcmVlZG9tIGZyb20gdGhlCithc3NvY2lhdGlvbiBvZiBhIG51bWVyaWNhbCBpbmRleCB0byBhIHZhbHVlIHdoaWNoIGFycmF5cyByZXF1aXJlLiAKK0luc3RlYWQsIG1hcHBpbmdzIGFsbG93IHlvdSB0byBhc3NvY2lhdGUgdmFsdWVzIHdpdGggaW5kaWNlcyB3aGljaAorYWN0dWFsbHkgaGF2ZSBtZWFuaW5nIHRvIHlvdSwgbXVjaCBsaWtlIGEgcmVsYXRpb25hbCBkYXRhYmFzZS4KKworSW4gYW4gYXJyYXkgb2YgNSBlbGVtZW50cywgeW91IGFjY2VzcyB0aG9zZSB2YWx1ZXMgc29sZWx5IGJ5IHRoZWlyIGludGVnZXIKK2luZGljZXMgd2hpY2ggY292ZXIgdGhlIHJhbmdlIDAgdG8gNC4gIEltYWdpbmUgZ29pbmcgYmFjayB0byB0aGUgZXhhbXBsZQorb2YgbW9uZXkgYWdhaW4uICBQbGF5ZXJzIGhhdmUgbW9uZXkgb2YgZGlmZmVyZW50IGFtb3VudHMgYW5kIGRpZmZlcmVudAordHlwZXMuICBJbiB0aGUgcGxheWVyIG9iamVjdCwgeW91IG5lZWQgYSB3YXkgdG8gc3RvcmUgdGhlIHR5cGVzIG9mIG1vbmV5Cit0aGF0IGV4aXN0IGFzIHdlbGwgYXMgcmVsYXRlIHRoZW0gdG8gdGhlIGFtb3VudCBvZiB0aGF0IGN1cnJlbmN5IHR5cGUgdGhlCitwbGF5ZXIgaGFzLiAgVGhlIGJlc3Qgd2F5IHRvIGRvIHRoaXMgd2l0aCBhcnJheXMgd291bGQgaGF2ZSBiZWVuIHRvCitzdG9yZSBhbiBhcnJheSBvZiBzdHJpbmdzIHJlcHJlc2VudGluZyBtb25leSB0eXBlcyBhbmQgYW4gYXJyYXkgb2YKK2ludGVnZXJzIHJlcHJlc2VudGluZyB2YWx1ZXMgaW4gdGhlIHBsYXllciBvYmplY3QuICBUaGlzIHdvdWxkIHJlc3VsdCBpbgorQ1BVLWVhdGluZyB1Z2x5IGNvZGUgbGlrZSB0aGlzOgorCitpbnQgcXVlcnlfbW9uZXkoc3RyaW5nIHR5cGUpIHsKKyAgICBpbnQgaTsKKworICAgIGkgPSBtZW1iZXJfYXJyYXkodHlwZSwgY3VycmVuY2llcyk7CisgICAgaWYoaT4tMSAmJiBpIDwgc2l6ZW9mKGFtb3VudHMpKSAgLyogc2l6ZW9mIGVmdW4KK3JldHVybnMgIyBvZiBlbGVtZW50cyAqLworICAgICAgICByZXR1cm4gYW1vdW50c1tpXTsKKyAgICBlbHNlIHJldHVybiAwOworfQorCitBbmQgdGhhdCBpcyBhIHNpbXBsZSBxdWVyeSBmdW5jdGlvbi4gIExvb2sgYXQgYW4gYWRkIGZ1bmN0aW9uOgorCit2b2lkIGFkZF9tb25leShzdHJpbmcgdHlwZSwgaW50IGFtdCkgeworICAgIHN0cmluZyAqdG1wMTsKKyAgICBpbnQgKiB0bXAyOworICAgIGludCBpLCB4LCBqLCBtYXhqOworICAgIAorICAgIGkgPSBtZW1iZXJfYXJyYXkodHlwZSwgY3VycmVuY2llcyk7CisgICAgaWYoaSA+PSBzaXplb2YoYW1vdW50cykpIC8qICBjb3JydXB0IGRhdGEsIHdlIGFyZSBpbgorICAgICAgYSBiYWQgd2F5ICovCisgICAgICAgIHJldHVybjsKKyAgICBlbHNlIGlmKGk9PSAtMSkgeworICAgICAgICBjdXJyZW5jaWVzICs9ICh7IHR5cGUgfSk7CisgICAgICAgIGFtb3VudHMgKz0gKHsgYW10IH0pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBhbW91bnRzW2ldICs9IGFtdDsKKyAgICAgICAgaWYoYW1vdW50c1tpXSA8IDEpIHsKKyAgICAgICAgICAgIHRtcDEgPSBhbGxvY2F0ZShzaXplb2YoY3VycmVuY2llcyktMSk7CisgICAgICAgICAgICB0bXAyID0gYWxsb2NhdGUoc2l6ZW9mKGFtb3VudHMpLTEpOworICAgICAgICAgICAgZm9yKGo9MCwgeCA9MCwgbWF4aj1zaXplb2YodG1wMSk7IGogPCBtYXhqOworICAgICAgICAgICAgICBqKyspIHsKKyAgICAgICAgICAgICAgICBpZihqPT1pKSB4ID0gMTsKKyAgICAgICAgICAgICAgICB0bXAxW2pdID0gY3VycmVuY2llc1tqK3hdOworICAgICAgICAgICAgICAgIHRtcDJbal0gPSBhbW91bnRzW2oreF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdXJyZW5jaWVzID0gdG1wMTsKKyAgICAgICAgICAgIGFtb3VudHMgPSB0bXAyOworICAgICAgICB9CisgICAgfQorfQorCitUaGF0IGlzIHJlYWxseSBzb21lIG5hc3R5IGNvZGUgdG8gcGVyZm9ybSB0aGUgcmF0aGVyIHNpbXBsZSBjb25jZXB0IG9mCithZGRpbmcgc29tZSBtb25leS4gIEZpcnN0LCB3ZSBmaWd1cmUgb3V0IGlmIHRoZSBwbGF5ZXIgaGFzIGFueSBvZiB0aGF0CitraW5kIG9mIG1vbmV5LCBhbmQgaWYgc28sIHdoaWNoIGVsZW1lbnQgb2YgdGhlIGN1cnJlbmNpZXMgYXJyYXkgaXQgaXMuIAorQWZ0ZXIgdGhhdCwgd2UgaGF2ZSB0byBjaGVjayB0byBzZWUgdGhhdCB0aGUgaW50ZWdyaXR5IG9mIHRoZSBjdXJyZW5jeSBkYXRhCitoYXMgYmVlbiBtYWludGFpbmVkLiAgSWYgdGhlIGluZGV4IG9mIHRoZSB0eXBlIGluIHRoZSBjdXJyZW5jaWVzIGFycmF5IGlzCitncmVhdGVyIHRoYW4gdGhlIGhpZ2hlc3QgaW5kZXggb2YgdGhlIGFtb3VudHMgYXJyYXksIHRoZW4gd2UgaGF2ZSBhCitwcm9ibGVtIHNpbmNlIHRoZSBpbmRpY2VzIGFyZSBvdXIgb25seSB3YXkgb2YgcmVsYXRpbmcgdGhlIHR3byBhcnJheXMuIAorT25jZSB3ZSBrbm93IG91ciBkYXRhIGlzIGluIHRhY3QsIGlmIHRoZSBjdXJyZW5jeSB0eXBlIGlzIG5vdCBjdXJyZW50bHkKK2hlbGQgYnkgdGhlIHBsYXllciwgd2Ugc2ltcGx5IHRhY2sgb24gdGhlIHR5cGUgYXMgYSBuZXcgZWxlbWVudCB0byB0aGUKK2N1cnJlbmNpZXMgYXJyYXkgYW5kIHRoZSBhbW91bnQgYXMgYSBuZXcgZWxlbWVudCB0byB0aGUgYW1vdW50cyBhcnJheS4gCitGaW5hbGx5LCBpZiBpdCBpcyBhIGN1cnJlbmN5IHRoZSBwbGF5ZXIgY3VycmVudGx5IGhhcywgd2UganVzdCBhZGQgdGhlCithbW91bnQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgaW5kZXggaW4gdGhlIGFtb3VudHMgYXJyYXkuICBJZiB0aGUgbW9uZXkKK2dldHMgYmVsb3cgMSwgbWVhbmluZyBoYXZpbmcgbm8gbW9uZXkgb2YgdGhhdCB0eXBlLCB3ZSB3YW50IHRvIGNsZWFyCit0aGUgY3VycmVuY3kgb3V0IG9mIG1lbW9yeS4KKworU3VidHJhY3RpbmcgYW4gZWxlbWVudCBmcm9tIGFuIGFycmF5IGlzIG5vIHNpbXBsZSBtYXR0ZXIuICBUYWtlLCBmb3IKK2V4YW1wbGUsIHRoZSByZXN1bHQgb2YgdGhlIGZvbGxvd2luZzoKKworc3RyaW5nICphcnI7CisKK2FyciA9ICh7ICJhIiwgImIiLCAiYSIgfSk7CithcnIgLT0gKHsgYXJyWzJdIH0pOworCitXaGF0IGRvIHlvdSB0aGluayB0aGUgZmluYWwgdmFsdWUgb2YgYXJyIGlzPyBXZWxsLCBpdCBpczoKKyAgICAoeyAiYiIsICJhIiB9KQorU3VidHJhY3RpbmcgYXJyWzJdIGZyb20gdGhlIG9yaWdpbmFsIGFycmF5IGRvZXMgbm90IHJlbW92ZSB0aGUgdGhpcmQKK2VsZW1lbnQgZnJvbSB0aGUgYXJyYXkuICBJbnN0ZWFkLCBpdCBzdWJ0cmFjdHMgdGhlIHZhbHVlIG9mIHRoZSB0aGlyZAorZWxlbWVudCBvZiB0aGUgYXJyYXkgZnJvbSB0aGUgYXJyYXkuICBBbmQgYXJyYXkgc3VidHJhY3Rpb24gcmVtb3ZlcyB0aGUKK2ZpcnN0IGluc3RhbmNlIG9mIHRoZSB2YWx1ZSBmcm9tIHRoZSBhcnJheS4gIFNpbmNlIHdlIGRvIG5vdCB3YW50IHRvIGJlCis8KiBOT1RFIEhpZ2hsYW5kZXJATW9yZ2VuR3JhdWVuIDExLjIuOTQ6CisJV1JPTkcgaW4gTW9yZ2VuR3JhdWVuIChhdCBsZWFzdCkuIFRoZSByZXN1bHQgaXMgYWN0dWFsbHkgKHsgImIiIH0pLiBBcnJheQorCXN1YnRyYWN0aW9uIHJlbW92ZXMgQUxMIGluc3RhbmNlcyBvZiB0aGUgc3VidHJhY3RlZCB2YWx1ZSBmcm9tIHRoZSBhcnJheS4KKwlUaGlzIGhvbGRzIHRydWUgZm9yIGFsbCBBbXlsYWFyLWRyaXZlciBMUE11ZHMuCisqPgorZm9yY2VkIG9uIGNvdW50aW5nIG9uIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXkgYXMgYmVpbmcgdW5pcXVlLCB3ZSBhcmUKK2ZvcmNlZCB0byBnbyB0aHJvdWdoIHNvbWUgc29tZXJzYXVsdHMgdG8gcmVtb3ZlIHRoZSBjb3JyZWN0IGVsZW1lbnQKK2Zyb20gYm90aCBhcnJheXMgaW4gb3JkZXIgdG8gbWFpbnRhaW4gdGhlIGNvcnJlc3BvbmRlbmNlIG9mIHRoZSBpbmRpY2VzCitpbiB0aGUgdHdvIGFycmF5cy4KKworTWFwcGluZ3MgcHJvdmlkZSBhIGJldHRlciB3YXkuICBUaGV5IGFsbG93IHlvdSB0byBkaXJlY3RseSBhc3NvY2lhdGUgdGhlCittb25leSB0eXBlIHdpdGggaXRzIHZhbHVlLiAgU29tZSBwZW9wbGUgdGhpbmsgb2YgbWFwcGluZ3MgYXMgYXJyYXlzCit3aGVyZSB5b3UgYXJlIG5vdCByZXN0cmljdGVkIHRvIGludGVnZXJzIGFzIGluZGljZXMuICBUcnV0aCBpcywgbWFwcGluZ3MKK2FyZSBhbiBlbnRpcmVseSBkaWZmZXJlbnQgY29uY2VwdCBpbiBzdG9yaW5nIGFnZ3JlZ2F0ZSBpbmZvcm1hdGlvbi4gIEFycmF5cworZm9yY2UgeW91IHRvIGNob29zZSBhbiBpbmRleCB3aGljaCBpcyBtZWFuaW5nZnVsIHRvIHRoZSBtYWNoaW5lIGZvcgorbG9jYXRpbmcgdGhlIGFwcHJvcHJpYXRlIGRhdGEuICBUaGUgaW5kaWNlcyB0ZWxsIHRoZSBtYWNoaW5lIGhvdyBtYW55CitlbGVtZW50cyBiZXlvbmQgdGhlIGZpcnN0IHZhbHVlIHRoZSB2YWx1ZSB5b3UgZGVzaXJlIGNhbiBiZSBmb3VuZC4gIFdpdGgKK21hcHBpbmdzLCB5b3UgY2hvb3NlIGluZGljZXMgd2hpY2ggYXJlIG1lYW5pbmdmdWwgdG8geW91IHdpdGhvdXQKK3dvcnJ5aW5nIGFib3V0IGhvdyB0aGF0IG1hY2hpbmUgbG9jYXRlcyBhbmQgc3RvcmVzIGl0LgorCitZb3UgbWF5IHJlY29nbml6ZSBtYXBwaW5ncyBpbiB0aGUgZm9sbG93aW5nIGZvcm1zOgorCitjb25zdGFudCB2YWx1ZXM6Cit3aG9sZTogKFsgaW5kZXg6dmFsdWUsIGluZGV4OnZhbHVlIF0pIEV4OiAoWyAiZ29sZCI6MTAsICJzaWx2ZXIiOjIwIF0pCitlbGVtZW50OiAgMTAKKwordmFyaWFibGUgdmFsdWVzOgord2hvbGU6ICAgIG1hcCAgICh3aGVyZSBtYXAgaXMgdGhlIG5hbWUgb2YgYSBtYXBwaW5nIHZhcmlhYmxlKQorZWxlbWVudDogbWFwWyJnb2xkIl0KKworU28gbm93IG15IG1vbmV0YXJ5IGZ1bmN0aW9ucyB3b3VsZCBsb29rIGxpa2U6CisKK2ludCBxdWVyeV9tb25leShzdHJpbmcgdHlwZSkgeyByZXR1cm4gbW9uZXlbdHlwZV07IH0KKwordm9pZCBhZGRfbW9uZXkoc3RyaW5nIHR5cGUsIGludCBhbXQpIHsKKyAgICBpZighbW9uZXlbdHlwZV0pIG1vbmV5W3R5cGVdID0gYW10OworICAgIGVsc2UgbW9uZXlbdHlwZV0gKz0gYW10OworICAgIGlmKG1vbmV5W3R5cGVdIDwgMSkKKyAgICAgIG1hcF9kZWxldGUobW9uZXksIHR5cGUpOyAgICAgICAgICAvKiB0aGlzIGlzIGZvcgorICAgICAgICAgIE11ZE9TICovCisgICAgICAgICAgICAuLi5PUi4uLiAKKyAgICAgICAgICAgIG1vbmV5ID0gbV9kZWxldGUobW9uZXksIHR5cGUpICAvKiBmb3Igc29tZQorICAgICAgICAgIExQTXVkIDMuKiB2YXJpZXRpZXMgKi8KKyAgICAgICAgICAgIC4uLiBPUi4uLiAKKyAgICAgICAgIG1fZGVsZXRlKG1vbmV5LCB0eXBlKTsgICAgLyogZm9yIG90aGVyIExQTXVkIDMuKgorICAgICAgICAgIHZhcmlldGllcyAqLworfQorCitQbGVhc2Ugbm90aWNlIGZpcnN0IHRoYXQgdGhlIGVmdW5zIGZvciBjbGVhcmluZyBhIG1hcHBpbmcgZWxlbWVudCBmcm9tIHRoZQorbWFwcGluZyB2YXJ5IGZyb20gZHJpdmVyIHRvIGRyaXZlci4gIENoZWNrIHdpdGggeW91ciBkcml2ZXIncworZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGV4YWN0IG5hbWUgYW4gc3ludGF4IG9mIHRoZSByZWxldmFudCBlZnVuLgorCitBcyB5b3UgY2FuIHNlZSBpbW1lZGlhdGVseSwgeW91IGRvIG5vdCBuZWVkIHRvIGNoZWNrIHRoZSBpbnRlZ3JpdHkgb2YKK3lvdXIgZGF0YSBzaW5jZSB0aGUgdmFsdWVzIHdoaWNoIGludGVyZXN0IHlvdSBhcmUgaW5leHRyaWNhYmx5IGJvdW5kIHRvCitvbmUgYW5vdGhlciBpbiB0aGUgbWFwcGluZy4gIFNlY29uZGx5LCBnZXR0aW5nIHJpZCBvZiB1c2VsZXNzIHZhbHVlcyBpcyBhCitzaW1wbGUgZWZ1biBjYWxsIHJhdGhlciB0aGFuIGEgdHJpY2t5LCBDUFUtZWF0aW5nIGxvb3AuICBGaW5hbGx5LCB0aGUKK3F1ZXJ5IGZ1bmN0aW9uIGlzIG1hZGUgdXAgc29sZWx5IG9mIGEgcmV0dXJuIGluc3RydWN0aW9uLiAKKworWW91IG11c3QgZGVjbGFyZSBhbmQgaW5pdGlhbGl6ZSBhbnkgbWFwcGluZyBiZWZvcmUgdXNpbmcgaXQuIAorRGVjbGFyYXRpb25zIGxvb2sgbGlrZToKK21hcHBpbmcgbWFwOworV2hlcmVhcyBjb21tb24gaW5pdGlhbGl6YXRpb25zIGxvb2sgbGlrZToKK21hcCA9IChbXSk7CittYXAgPSBtX2FsbG9jYXRlKDEwKSAgIC4uLk9SLi4uICAgbWFwID0gbV9hbGxvY2F0ZSgxMCk7CittYXAgPSAoWyAiZ29sZCI6IDIwLCAic2lsdmVyIjogMTUgXSk7CisKK0FzIHdpdGggb3RoZXIgZGF0YSB0eXBlcywgdGhlcmUgYXJlIHJ1bGVzIGRlZmluaW5nIGhvdyB0aGV5IHdvcmsgaW4KK2NvbW1vbiBvcGVyYXRpb25zIGxpa2UgYWRkaXRpb24gYW5kIHN1YnRyYWN0aW9uOgorICAgIChbICJnb2xkIjoyMCwgInNpbHZlciI6MzAgXSkgKyAoWyAiZWxlY3RydW0iOjUgXSkgCitnaXZlczoKKyAgICAoWyJnb2xkIjoyMCwgInNpbHZlciI6MzAsICJlbGVjdHJ1bSI6NV0pICAgCitBbHRob3VnaCBteSBkZW1vbnN0cmF0aW9uIHNob3dzIGEgY29udGludWl0eSBvZiBvcmRlciwgdGhlcmUgaXMgaW4gZmFjdAorbm8gZ3VhcmFudGVlIG9mIHRoZSBvcmRlciBpbiB3aGljaCBlbGVtZW50cyBvZiBtYXBwaW5ncyB3aWxsIHN0b3JlZC4gCitFcXVpdmFsZW5jZSB0ZXN0cyBhbW9uZyBtYXBwaW5ncyBhcmUgdGhlcmVmb3JlIG5vdCBhIGdvb2QgdGhpbmcuCisKKzMuNiBTdW1tYXJ5CitNYXBwaW5ncyBhbmQgYXJyYXlzIGNhbiBiZSBidWlsdCBhcyBjb21wbGV4IGFzIHlvdSBuZWVkIHRoZW0gdG8gYmUuIAorWW91IGNhbiBoYXZlIGFuIGFycmF5IG9mIG1hcHBpbmdzIG9mIGFycmF5cy4gIFN1Y2ggYSB0aGluZyB3b3VsZCBiZQorZGVjbGFyZWQgbGlrZSB0aGlzOgorCittYXBwaW5nICptYXBfb2ZfYXJyczsKK3doaWNoIG1pZ2h0IGxvb2sgbGlrZToKKyh7IChbIGluZDE6ICh7IHZhbEExLCB2YWxBMn0pLCBpbmQyOiAoe3ZhbEIxLCB2YWxCMn0pIF0pLCAoWyBpbmRYOgorKHt2YWxYMSx2YWxYMn0pIF0pIH0pCisKK01hcHBpbmdzIG1heSB1c2UgYW55IGRhdGEgdHlwZSBhcyBhbiBpbmRleCwgaW5jbHVkaW5nIG9iamVjdHMuIAorTWFwcGluZyBpbmRpY2VzIGFyZSBvZnRlbiByZWZlcnJlZCB0byBhcyBrZXlzIGFzIHdlbGwsIGEgdGVybSBmcm9tCitkYXRhYmFzZXMuICBBbHdheXMga2VlcCBpbiBtaW5kIHRoYXQgd2l0aCBhbnkgbm9uLWludGVnZXIgZGF0YSB0eXBlLAoreW91IG11c3QgZmlyc3QgaW5pdGlhbGl6ZSBhIHZhcmlhYmxlIGJlZm9yZSBtYWtpbmcgdXNlIG9mIGl0IGluIGNvbW1vbgorb3BlcmF0aW9ucyBzdWNoIGFzIGFkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbi4gIEluIHNwaXRlIG9mIHRoZSBlYXNlIGFuZAorZHluYW1pY3MgYWRkZWQgdG8gTFBDIGNvZGluZyBieSBtYXBwaW5ncyBhbmQgYXJyYXlzLCBlcnJvcnMgY2F1c2VkCitieSBmYWlsaW5nIHRvIGluaXRpYWxpemUgdGhlaXIgdmFsdWVzIGNhbiBiZSB0aGUgbW9zdCBtYWRkZW5pbmcgZXhwZXJpZW5jZQorZm9yIHBlb3BsZSBuZXcgdG8gdGhlc2UgZGF0YSB0eXBlcy4gIEkgd291bGQgdmVudHVyZSB0aGF0IGEgdmVyeSBoaWdoCitwZXJjZW50YWdlIG9mIGFsbCBlcnJvcnMgcGVvcGxlIGV4cGVyaW1lbnRpbmcgd2l0aCBtYXBwaW5ncyBhbmQgYXJyYXlzCitmb3IgdGhlIGZpcnN0IHRpbWUgZW5jb3VudGVyIGFyZSBvbmUgb2YgdGhyZWUgZXJyb3IgbWVzc2FnZXM6CisJSW5kZXhpbmcgb24gaWxsZWdhbCB0eXBlLgorCUlsbGVnYWwgaW5kZXguCisJQmFkIGFyZ3VtZW50IDEgdG8gKCsgKz0gLSAtPSkgLyogaW5zZXJ0IHlvdXIgZmF2b3VyaXRlIG9wZXJhdG9yICovCitFcnJvciBtZXNzYWdlcyAxIGFuZCAzIGFyZSBkYXJuIG5lYXIgYWxtb3N0IGFsd2F5cyBjYXVzZWQgYnkgYSBmYWlsdXJlCit0byBpbml0aWFsaXplIHRoZSBhcnJheSBvciBtYXBwaW5nIGluIHF1ZXN0aW9uLiAgRXJyb3IgbWVzc2FnZSAyIGlzIGNhdXNlZAorZ2VuZXJhbGx5IHdoZW4geW91IGFyZSB0cnlpbmcgdG8gdXNlIGFuIGluZGV4IGluIGFuIGluaXRpYWxpemVkIGFycmF5Cit3aGljaCBkb2VzIG5vdCBleGlzdC4gIEFsc28sIGZvciBhcnJheXMsIG9mdGVuIHBlb3BsZSBuZXcgdG8gYXJyYXlzIHdpbGwKK2dldCBlcnJvciBtZXNzYWdlIDMgYmVjYXVzZSB0aGV5IHRyeSB0byBhZGQgYSBzaW5nbGUgZWxlbWVudCB0byBhbiBhcnJheQorYnkgYWRkaW5nIHRoZSBpbml0aWFsIGFycmF5IHRvIHRoZSBzaW5nbGUgZWxlbWVudCB2YWx1ZSBpbnN0ZWFkIG9mIGFkZGluZworYW4gYXJyYXkgb2YgdGhlIHNpbmdsZSBlbGVtZW50IHRvIHRoZSBpbml0aWFsIGFycmF5LiAgUmVtZW1iZXIsIGFkZCBvbmx5CithcnJheXMgdG8gYXJyYXlzLgorCitBdCB0aGlzIHBvaW50LCB5b3Ugc2hvdWxkIGZlZWwgY29tZm9ydGFibGUgZW5vdWdoIHdpdGggbWFwcGluZ3MgYW5kCithcnJheXMgdG8gcGxheSB3aXRoIHRoZW0uICBFeHBlY3QgdG8gZW5jb3VudGVyIHRoZSBhYm92ZSBlcnJvciBtZXNzYWdlcworYSBsb3Qgd2hlbiBmaXJzdCBwbGF5aW5nIHdpdGggdGhlc2UuICBUaGUga2V5IHRvIHN1Y2Nlc3Mgd2l0aCBtYXBwaW5ncyBpcworaW4gZGVidWdnaW5nIGFsbCBvZiB0aGVzZSBlcnJvcnMgYW5kIHNlZWluZyBleGFjdGx5IHdoYXQgY2F1c2VzIHdob2xlcworaW4geW91ciBwcm9ncmFtbWluZyB3aGljaCBhbGxvdyB5b3UgdG8gdHJ5IHRvIHdvcmsgd2l0aCB1bmluaXRpYWxpemVkCittYXBwaW5ncyBhbmQgYXJyYXlzLiAgRmluYWxseSwgZ28gYmFjayB0aHJvdWdoIHRoZSBiYXNpYyByb29tIGNvZGUgYW5kCitsb29rIGF0IHRoaW5ncyBsaWtlIHRoZSBzZXRfZXhpdHMoKSAob3IgdGhlIGVxdWl2YWxlbnQgb24geW91ciBtdWRsaWIpCitmdW5jdGlvbi4gIENoYW5jZXMgYXJlIGl0IG1ha2VzIHVzZSBvZiBtYXBwaW5ncy4gIEluIHNvbWUgaW5zdGFuY2VzLCBpdAord2lsbCB1c2UgYXJyYXlzIGFzIHdlbGwgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBtdWRsaWIubi4KKworQ29weXJpZ2h0IChjKSBHZW9yZ2UgUmVlc2UgMTk5MwpkaWZmIC0tZ2l0IGEvZG9jL0tVUlMvTFBDLUtVUlMyL2NoYXB0ZXI0IGIvZG9jL0tVUlMvTFBDLUtVUlMyL2NoYXB0ZXI0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZTk5MDUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvS1VSUy9MUEMtS1VSUzIvY2hhcHRlcjQKQEAgLTAsMCArMSwxOTUgQEAKK0ludGVybWVkaWF0ZSBMUEMKK0Rlc2NhcnRlcyBvZiBCb3JnCitOb3ZlbWJlciAxOTkzCisKKyAgICAgICAgICAgICAgICAgICAgICAgQ2hhcHRlciA0OiBUaGUgTFBDIFByZS1Db21waWxlcgorCis0LjEgUmV2aWV3CitUaGUgcHJldmlvdXMgY2hhcHRlciB3YXMgcXVpdGUgaGVhdnksIHNvIG5vdyBJIHdpbGwgc2xvdyBkb3duIGEgYml0IHNvCit5b3UgY2FuIGRpZ2VzdCBhbmQgcGxheSB3aXRoIG1hcHBpbmdzIGFuZCBhcnJheXMgYnkgdGFraW5nIG9uIHRoZQorcmF0aGVyIHNpbXBsZSB0b3BpYyBvZiB0aGUgTFBDIHByZS1jb21waWxlci4gIEJ5IHRoaXMgcG9pbnQsIGhvd2V2ZXIsCit5b3Ugc2hvdWxkIHdlbGwgdW5kZXJzdGFuZCBob3cgdGhlIGRyaXZlciBpbnRlcmFjdHMgd2l0aCB0aGUgbXVkbGliIGFuZAorYmUgYWJsZSB0byBjb2RlIG9iamVjdHMgd2hpY2ggdXNlIGNhbGwgb3V0cyBhbmQgaGVhcnQgYmVhdHMuICBJbiBhZGRpdGlvbiwKK3lvdSBzaG91bGQgYmUgY29kaW5nIHNpbXBsZSBvYmplY3RzIHdoaWNoIHVzZSBtYXBwaW5ncyBhbmQgYXJyYXlzLAorbm90aW5nIGhvdyB0aGVzZSBkYXRhIHR5cGVzIHBlcmZvcm0gaW4gb2JqZWN0cy4gIEl0IGlzIGFsc28gYSBnb29kIGlkZWEgdG8KK3N0YXJ0IGxvb2tpbmcgaW4gZGV0YWlsIGF0IHRoZSBhY3R1YWwgbXVkbGliIGNvZGUgdGhhdCBtYWtlcyB1cCB5b3VyIG11ZC4gCitTZWUgaWYgeW91IHVuZGVyc3RhbmQgZXZlcnl0aGluZyB3aGljaCBpcyBnb2luZyBvbiBpbiB5b3VyIG11ZGxpYnMKK3Jvb20gYW5kIG1vbnN0ZXIgY29kZXMuICBGb3IgdGhpbmdzIHlvdSBkbyBub3QgdW5kZXJzdGFuZCwgYXNrIHRoZQorcGVvcGxlIG9uIHlvdXIgbXVkIGRlc2lnbmF0ZWQgdG8gYW5zd2VyIGNyZWF0b3IgY29kaW5nIHF1ZXN0aW9ucy4KKworUHJlLWNvbXBpbGVyIGlzIGFjdHVhbGx5IGEgYml0IG9mIGEgbWlzbm9tZXIgc2luY2UgTFBDIGNvZGUgaXMgbmV2ZXIKK3RydWx5IGNvbXBpbGVkLiAgQWx0aG91Z2ggdGhpcyBpcyBjaGFuZ2luZyB3aXRoIHByb3RvdHlwZXMgb2YgbmV3ZXIKK0xQQyBkcml2ZXJzLCBMUEMgZHJpdmVycyBpbnRlcnByZXQgdGhlIExQQyBjb2RlIHdyaXR0ZW4gYnkgY3JlYXRvcnMKK3JhdGhlciB0aGFuIGNvbXBpbGUgaXQgaW50byBiaW5hcnkgZm9ybWF0LiAgTmV2ZXJ0aGVsZXNzLCB0aGUgTFBDIHByZS0KK2NvbXBpbGVyIGZ1bmN0aW9ucyBzdGlsbCBwZXJmb3JtIG11Y2ggbGlrZSBwcmUtY29tcGlsZXJzIGZvciBjb21waWxlZAorbGFuZ3VhZ2VzIGluIHRoYXQgcHJlLWNvbXBpbGVyIGRpcmVjdGl2ZXMgYXJlIGludGVycHJldGVkIGJlZm9yZSB0aGUgZHJpdmVyCitldmVuIHN0YXJ0cyB0byBsb29rIGF0IG9iamVjdCBjb2RlLiAKKworNC4yIFByZS1jb21waWxlciBEaXJlY3RpdmVzCitJZiB5b3UgZG8gbm90IGtub3cgd2hhdCBhIHByZS1jb21waWxlciBpcywgeW91IHJlYWxseSBkbyBub3QgbmVlZCB0bword29ycnkuICBXaXRoIHJlc3BlY3QgdG8gTFBDLCBpdCBpcyBiYXNpY2FsbHkgYSBwcm9jZXNzIHdoaWNoIGhhcHBlbnMKK2JlZm9yZSB0aGUgZHJpdmVyIGJlZ2lucyB0byBpbnRlcnByZXQgTFBDIGNvZGUgd2hpY2ggYWxsb3dzIHlvdSB0bworcGVyZm9ybSBhY3Rpb25zIHVwb24gdGhlIGVudGlyZSBjb2RlIGZvdW5kIGluIHlvdXIgZmlsZS4gIFNpbmNlIHRoZSBjb2RlCitpcyBub3QgeWV0IGludGVycHJldGVkLCB0aGUgcHJlLWNvbXBpbGVyIHByb2Nlc3MgaXMgaW52b2x2ZWQgYmVmb3JlIHRoZSBmaWxlCitleGlzdHMgYXMgYW4gb2JqZWN0IGFuZCBiZWZvcmUgYW55IExQQyBmdW5jdGlvbnMgb3IgaW5zdHJ1Y3Rpb25zIGFyZSBldmVyCitleGFtaW5lZC4gIFRoZSBwcmUtY29tcGlsZXIgaXMgdGh1cyB3b3JraW5nIGF0IHRoZSBmaWxlIGxldmVsLCBtZWFuaW5nCit0aGF0IGl0IGRvZXMgbm90IGRlYWwgd2l0aCBhbnkgY29kZSBpbiBpbmhlcml0ZWQgZmlsZXMuCisKK1RoZSBwcmUtY29tcGlsZXIgc2VhcmNoZXMgYSBmaWxlIHNlbnQgdG8gaXQgZm9yIHByZS1jb21waWxlciBkaXJlY3RpdmVzLiAKK1RoZXNlIGFyZSBsaXR0bGUgaW5zdHJ1Y3Rpb25zIGluIHRoZSBmaWxlIG1lYW50IG9ubHkgZm9yIHRoZSBwcmUtY29tcGlsZXIKK2FuZCBhcmUgbm90IHJlYWxseSBwYXJ0IG9mIHRoZSBMUEMgbGFuZ3VhZ2UuICBBIHByZS1jb21waWxlciBkaXJlY3RpdmUgaXMKK2FueSBsaW5lIGluIGEgZmlsZSBiZWdpbm5pbmcgd2l0aCBhIHBvdW5kICgjKSBzaWduLiAgUHJlLWNvbXBpbGVyCitkaXJlY3RpdmVzIGFyZSBnZW5lcmFsbHkgdXNlZCB0byBjb25zdHJ1Y3Qgd2hhdCB0aGUgZmluYWwgY29kZSBvZiBhIGZpbGUgd2lsbAorbG9vayBhdC4gIFRoZSBtb3N0IGNvbW1vbiBwcmUtY29tcGlsZXIgZGlyZWN0aXZlcyBhcmU6CisKKyNkZWZpbmUKKyN1bmRlZmluZQorI2luY2x1ZGUKKyNpZmRlZgorI2lmbmRlZgorI2lmCisjZWxzZWlmCisjZWxzZQorI2VuZGlmCisjcHJhZ21hCisKK01vc3QgcmVhbG0gY29kZXJzIG9uIG11ZHMgdXNlIGV4Y2x1c2l2ZWx5IHRoZSBkaXJlY3RpdmVzICNkZWZpbmUgYW5kCisjaW5jbHVkZS4gIFRoZSBvdGhlciBkaXJlY3RpdmVzIHlvdSBtYXkgc2VlIG9mdGVuIGFuZCBzaG91bGQgdW5kZXJzdGFuZAord2hhdCB0aGV5IG1lYW4gZXZlbiBpZiB5b3UgbmV2ZXIgdXNlIHRoZW0uCisKK1RoZSBmaXJzdCBwYWlyIG9mIGRpcmVjdGl2ZXMgYXJlOgorI2RlZmluZQorI3VuZGVmaW5lCisKK1RoZSAjZGVmaW5lIGRpcmVjdGl2ZSBzZXRzIHVwIGEgc2V0IG9mIGNoYXJhY3RlcnMgd2hpY2ggd2lsbCBiZSByZXBsYWNlZAorYW55IHdoZXJlIHRoZXkgZXhpc3QgaW4gdGhlIGNvZGUgYXQgcHJlY29tcGlsZXIgdGltZSB3aXRoIHRoZWlyIGRlZmluaXRpb24uIAorRm9yIGV4YW1wbGUsIHRha2U6CisKKyNkZWZpbmUgT0JfVVNFUiAiL3N0ZC91c2VyIgorCitUaGlzIGRpcmVjdGl2ZSBoYXMgdGhlIHByZS1jb21waWxlciBzZWFyY2ggdGhlIGVudGlyZSBmaWxlIGZvciBpbnN0YW5jZXMgb2YKK09CX1VTRVIuICBFdmVyeXdoZXJlIGl0IHNlZXMgT0JfVVNFUiwgaXQgcmVwbGFjZXMgd2l0aCAiL3N0ZC91c2VyIi4gCis8KiBOT1RFIEhpZ2hsYW5kZXJATW9yZ2VuR3JhdWVuIDExLjIuOTQ6CisJV1JPTkcuIE9CX1VTRVIgd2lsbCBfbm90XyBiZSByZXBsYWNlZCBpZiB3aXRoaW4gIiIgaW4gd2hpY2ggY2FzZSBpdCBpcworCXRyZWF0ZWQgYXMgYSBub3JtYWwgc3RyaW5nLiBTbyBpdCBpcyBwb3NzaWJsZSB0byB3cml0ZSB0aGUgdGV4dCBPQl9VU0VSLgorKj4KK05vdGUgdGhhdCBpdCBkb2VzIG5vdCBtYWtlIE9CX1VTRVIgYSB2YXJpYWJsZSBpbiB0aGUgY29kZS4gIFRoZSBMUEMKK2ludGVycHJldGVyIG5ldmVyIHNlZXMgdGhlIE9CX1VTRVIgbGFiZWwuICBBcyBzdGF0ZWQgYWJvdmUsIHRoZSBwcmUtCitjb21waWxlciBpcyBhIHByb2Nlc3Mgd2hpY2ggdGFrZXMgcGxhY2UgYmVmb3JlIGNvZGUgaW50ZXJwcmV0YXRpb24uICBTbword2hhdCB5b3Ugd3JvdGUgYXM6CisKKyNkZWZpbmUgT0JfVVNFUiAiL3N0ZC91c2VyIgorCit2b2lkIGNyZWF0ZSgpIHsKKyAgICBpZighZmlsZV9leGlzdHMoT0JfVVNFUisiLmMiKSkgd3JpdGUoIk1lcmRlISBObyB1c2VyIGZpbGUhIik7CisgICAgZWxzZSB3cml0ZSgiR29vZCEgVXNlciBmaWxlIHN0aWxsIGV4aXN0cyEiKTsKK30KKword291bGQgYXJyaXZlIGF0IHRoZSBMUEMgaW50ZXJwcmV0ZXIgYXM6CisKK3ZvaWQgY3JlYXRlKCkgeworICAgIGlmKCFmaWxlX2V4aXN0cygiL3N0ZC91c2VyIisiLmMiKSkgd3JpdGUoIk1lcmRlISBObyB1c2VyIGZpbGUhIik7CisgICAgZWxzZSB3cml0ZSgiR29vZCEgVXNlciBmaWxlIHN0aWxsIGV4aXN0cyEiKTsKK30KKworPCogTk9URSBIaWdobGFuZGVyQE1vcmdlbkdyYXVlbiAxMS4yLjk0CisJQnV0OiB3cml0ZSgiVGV4dCBpcyBPQl9VU0VSIGZvbyBiYXJcbiIpOworCXNpbXBseSB3cml0ZXMgIlRleHQgaXMgT0JfVVNFUiBmb28gYmFyIi4gQ29uZmVyIHByZXZpb3VzIG5vdGUuCisqPgorCitTaW1wbHkgcHV0LCAjZGVmaW5lIGp1c3QgbGl0ZXJhbGx5IHJlcGxhY2VzIHRoZSBkZWZpbmVkIGxhYmVsIHdpdGggd2hhdGV2ZXIKK2ZvbGxvd3MgaXQuICBZb3UgbWF5IGFsc28gdXNlICNkZWZpbmUgaW4gYSBzcGVjaWFsIGluc3RhbmNlIHdoZXJlIG5vCit2YWx1ZSBmb2xsb3dzLiAgVGhpcyBpcyBjYWxsZWQgYSBiaW5hcnkgZGVmaW5pdGlvbi4gIEZvciBleGFtcGxlOgorCisjZGVmaW5lIF9fTklHSFRNQVJFCisKK2V4aXN0cyBpbiB0aGUgY29uZmlnIGZpbGUgZm9yIHRoZSBOaWdodG1hcmUgTXVkbGliLiAgVGhpcyBhbGxvd3MgZm9yIHByZS0KK2NvbXBpbGVyIHRlc3RzIHdoaWNoIHdpbGwgYmUgZGVzY3JpYmVkIGxhdGVyIGluIHRoZSBjaGFwdGVyLgorCitUaGUgb3RoZXIgcHJlLWNvbXBpbGVyIGRpcmVjdGl2ZSB5b3UgYXJlIGxpa2VseSB0byB1c2Ugb2Z0ZW4gaXMgI2luY2x1ZGUuIAorQXMgdGhlIG5hbWUgaW1wbGllcywgI2luY2x1ZGUgaW5jbHVkZXMgdGhlIGNvbnRlbnRzIG9mIGFub3RoZXIgZmlsZSByaWdodAoraW50byB0aGUgZmlsZSBiZWluZyBwcmUtY29tcGlsZWQgYXQgdGhlIHBvaW50IGluIHRoZSBmaWxlIHdoZXJlIHRoZSBkaXJlY3RpdmUKK2lzIHBsYWNlZC4gIEZpbGVzIG1hZGUgZm9yIGluY2x1c2lvbiBpbnRvIG90aGVyIGZpbGVzIGFyZSBvZnRlbiBjYWxsZWQgaGVhZGVyCitmaWxlcy4gIFRoZXkgc29tZXRpbWVzIGNvbnRhaW4gdGhpbmdzIGxpa2UgI2RlZmluZSBkaXJlY3RpdmVzIHVzZWQgYnkKK211bHRpcGxlIGZpbGVzIGFuZCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgZm9yIHRoZSBmaWxlLiAgVGhlIHRyYWRpdGlvbmFsIGZpbGUKK2V4dGVuc2lvbiB0byBoZWFkZXIgZmlsZXMgaXMgLmguCisKK0luY2x1ZGUgZGlyZWN0aXZlcyBmb2xsb3cgb25lIG9mIDIgc3ludGF4J3M6CisKKyNpbmNsdWRlIDxmaWxlbmFtZT4KKyNpbmNsdWRlICJmaWxlbmFtZSIKKworSWYgeW91IGdpdmUgdGhlIGFic29sdXRlIG5hbWUgb2YgdGhlIGZpbGUsIHRoZW4gd2hpY2ggc3ludGF4IHlvdSB1c2UgaXMKK2lycmVsZXZhbnQuICBIb3cgeW91IGVuY2xvc2UgdGhlIGZpbGUgbmFtZSBkZXRlcm1pbmVzIGhvdyB0aGUgcHJlLQorY29tcGlsZXIgc2VhcmNoZXMgZm9yIHRoZSBoZWFkZXIgZmlsZXMuICBUaGUgcHJlLWNvbXBpbGVyIGZpcnN0IHNlYXJjaGVzIGluCitzeXN0ZW0gaW5jbHVkZSBkaXJlY3RvcmllcyBmb3IgZmlsZXMgZW5jbG9zZWQgaW4gPD4uICBGb3IgZmlsZXMgZW5jbG9zZWQgaW4KKyIiLCB0aGUgcHJlLWNvbXBpbGVyIGJlZ2lucyBpdHMgc2VhcmNoIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgZmlsZQorZ29pbmcgdGhyb3VnaCB0aGUgcHJlLWNvbXBpbGVyLiAgRWl0aGVyIHdheSwgdGhlIHByZS1jb21waWxlciB3aWxsCitzZWFyY2ggdGhlIHN5c3RlbSBpbmNsdWRlIGRpcmVjdG9yaWVzIGFuZCB0aGUgZGlyZWN0b3J5IG9mIHRoZSBmaWxlIGZvciB0aGUKK2hlYWRlciBmaWxlIGJlZm9yZSBnaXZpbmcgdXAuICBUaGUgc3ludGF4IHNpbXBseSBkZXRlcm1pbmVzIHRoZSBvcmRlci4KKzwqIE5PVEUgSGlnaGxhbmRlckBNb3JnZW5HcmF1ZW4gMTEuMi45NAorCVdoZW4gdXNpbmcgc3RhbmRhcmQtaGVhZGVyZmlsZXMgb25lIHNob3VsZCBjaG9vc2UgPD4uICIiIGlzIGFwcHJvcHJpYXRlCisJd2hlbiBkZWFsaW5nIHdpdGggc2VsZmRlZmluZWQgaGVhZGVyZmlsZXMuCisqPgorCitUaGUgc2ltcGxlc3QgcHJlLWNvbXBpbGVyIGRpcmVjdGl2ZSBpcyB0aGUgI3ByYWdtYSBkaXJlY3RpdmUuICBJdCBpcworZG91YnRmdWwgeW91IHdpbGwgZXZlciB1c2UgdGhpcyBvbmUuICBCYXNpY2FsbHksIHlvdSBmb2xsb3cgdGhlIGRpcmVjdGl2ZQord2l0aCBzb21lIGtleXdvcmQgd2hpY2ggaXMgbWVhbmluZ2Z1bCB0byB5b3VyIGRyaXZlci4gIFRoZSBvbmx5CitrZXl3b3JkIEkgaGF2ZSBldmVyIHNlZW4gaXMgc3RyaWN0X3R5cGVzLCB3aGljaCBzaW1wbHkgbGV0cyB0aGUgZHJpdmVyCitrbm93IHlvdSB3YW50IHRoaXMgZmlsZSBpbnRlcnByZXRlZCB3aXRoIHN0cmljdCBkYXRhIHR5cGluZy4gIEkgZG91YnQgeW91Cit3aWxsIGV2ZXIgbmVlZCB0byB1c2UgdGhpcywgYW5kIHlvdSBtYXkgbmV2ZXIgZXZlbiBzZWUgaXQuICBJIGp1c3QgaW5jbHVkZWQKK2l0IGluIHRoZSBsaXN0IGluIHRoZSBldmVudCB5b3UgZG8gc2VlIGl0IHNvIHlvdSBkbyBub3QgdGhpbmsgaXQgaXMgZG9pbmcKK2FueXRoaW5nIHRydWx5IG1lYW5pbmdmdWwuCisKK1RoZSBmaW5hbCBncm91cCBvZiBwcmUtY29tcGlsZXIgZGlyZWN0aXZlcyBhcmUgdGhlIGNvbmRpdGlvbmFsIHByZS0KK2NvbXBpbGVyIGRpcmVjdGl2ZXMuICBUaGV5IGFsbG93IHlvdSB0byBwcmUtY29tcGlsZSB0aGUgZmlsZSBvbmUgd2F5CitnaXZlbiB0aGUgdHJ1dGggdmFsdWUgb2YgYW4gZXhwcmVzc2lvbiwgb3RoZXJ3aXNlIHByZS1jb21waWxlIHRoZSBmaWxlCithbm90aGVyIHdheS4gIFRoaXMgaXMgbW9zdGx5IHVzZWZ1bCBmb3IgbWFraW5nIGNvZGUgcG9ydGFibGUgYW1vbmcKK211ZGxpYnMsIHNpbmNlIHB1dHRpbmcgdGhlIG1fZGVsZXRlKCkgZWZ1biBpbiBjb2RlIG9uIGEgTXVkT1MgbXVkCit3b3VsZCBub3JtYWxseSBjYXVzZSBhbiBlcnJvciwgZm9yIGV4YW1wbGUuICBTbyB5b3UgbWlnaHQgd3JpdGUgdGhlCitmb2xsb3dpbmc6CisKKyNpZmRlZiAgTVVET1MKKyAgICBtYXBfZGVsZXRlKG1hcCwga2V5KTsKKyNlbHNlCisgICAgbWFwID0gbV9kZWxldGUobWFwLCBrZXkpOworI2VuZGlmCisKK3doaWNoIGFmdGVyIGJlaW5nIHBhc3NlZCB0aHJvdWdoIHRoZSBwcmUtY29tcGlsZXIgd2lsbCBhcHBlYXIgdG8gdGhlCitpbnRlcnByZXRlciBhczoKKworICAgIG1hcF9kZWxldGUobWFwLCBrZXkpOyAgIAorCitvbiBhIE11ZE9TIG11ZCwgYW5kOgorICAKKyAgICBtYXAgPSBtX2RlbGV0ZShtYXAsIGtleSk7CisKK29uIG90aGVyIG11ZHMuICBUaGUgaW50ZXJwcmV0ZXIgbmV2ZXIgc2VlcyB0aGUgZnVuY3Rpb24gY2FsbCB0aGF0IHdvdWxkCitjYXVzZSBpdCB0byBzcGFtIG91dCBpbiBlcnJvci4gCisKK05vdGljZSB0aGF0IG15IGV4YW1wbGUgbWFkZSB1c2Ugb2YgYSBiaW5hcnkgZGVmaW5pdGlvbiBhcyBkZXNjcmliZWQKK2Fib3ZlLiAgQmluYXJ5IGRlZmluaXRpb25zIGFsbG93IHlvdSB0byBwYXNzIGNlcnRhaW4gY29kZSB0byB0aGUKK2ludGVycHJldGVyIGJhc2VkIG9uIHdoYXQgZHJpdmVyIG9yIG11ZGxpYiB5b3UgYXJlIHVzaW5nLCBhbW9uZyBvdGhlcgorY29uZGl0aW9ucy4KKworNC4zIFN1bW1hcnkKK1RoZSBwcmUtY29tcGlsZXIgaXMgYSB1c2VmdWwgTFBDIHRvb2wgZm9yIG1haW50YWluaW5nIG1vZHVsYXJpdHkgYW1vbmcKK3lvdXIgcHJvZ3JhbXMuICBXaGVuIHlvdSBoYXZlIHZhbHVlcyB0aGF0IG1pZ2h0IGJlIHN1YmplY3QgdG8gY2hhbmdlLAorYnV0IGFyZSB1c2VkIHdpZGVseSB0aHJvdWdob3V0IHlvdXIgZmlsZXMsIHlvdSBtaWdodCBzdGljayBhbGwgb2YgdGhvc2UKK3ZhbHVlcyBpbiBhIGhlYWRlciBmaWxlIGFzICNkZWZpbmUgc3RhdGVtZW50cyBzbyB0aGF0IGFueSBuZWVkIHRvIG1ha2UgYQorZnV0dXJlIGNoYW5nZSB3aWxsIGNhdXNlIHlvdSB0byBuZWVkIHRvIGNoYW5nZSBqdXN0IHRoZSAjZGVmaW5lIGRpcmVjdGl2ZS4gCitBIHZlcnkgZ29vZCBleGFtcGxlIG9mIHdoZXJlIHRoaXMgd291bGQgYmUgdXNlZnVsIHdvdWxkIGJlIGEgaGVhZGVyCitmaWxlIGNhbGxlZCBtb25leS5oICB3aGljaCBpbmNsdWRlcyB0aGUgZGlyZWN0aXZlOgorI2RlZmluZSBIQVJEX0NVUlJFTkNJRVMgKHsgImdvbGQiLCAicGxhdGludW0iLCAic2lsdmVyIiwKKyJlbGVjdHJ1bSIsICJjb3BwZXIiIH0pCitzbyB0aGF0IGlmIGV2ZXIgeW91IHdhbnRlZCB0byBhZGQgYSBuZXcgaGFyZCBjdXJyZW5jeSwgeW91IG9ubHkgbmVlZAorY2hhbmdlIHRoaXMgZGlyZWN0aXZlIGluIG9yZGVyIHRvIHVwZGF0ZSBhbGwgZmlsZXMgbmVlZGluZyB0byBrbm93IHdoYXQgdGhlCitoYXJkIGN1cnJlbmNpZXMgYXJlLgorCitUaGUgTFBDIHByZS1jb21waWxlciBhbHNvIGFsbG93cyB5b3UgdG8gd3JpdGUgY29kZSB3aGljaCBjYW4gYmUKK3BvcnRlZCB3aXRob3V0IGNoYW5nZSBhbW9uZyBkaWZmZXJlbnQgbXVkbGlicyBhbmQgZHJpdmVycy4gIEZpbmFsbHksCit5b3Ugc2hvdWxkIGJlIGF3YXJlIHRoYXQgdGhlIHByZS1jb21waWxlciBvbmx5IGFjY2VwdHMgbGluZXMgZW5kaW5nIGluCitjYXJyaWFnZSByZXR1cm5zLiAgSWYgeW91IHdhbnQgYSBtdWx0aXBsZSBsaW5lIHByZS1jb21waWxlciBkaXJlY3RpdmUsIHlvdQorbmVlZCB0byBlbmQgZWFjaCBpbmNvbXBsZXRlIGxpbmUgd2l0aCBhIGJhY2tzbGFzaChcKS4KKworQ29weXJpZ2h0IChjKSBHZW9yZ2UgUmVlc2UgMTk5MwpkaWZmIC0tZ2l0IGEvZG9jL0tVUlMvTFBDLUtVUlMyL2NoYXB0ZXI1IGIvZG9jL0tVUlMvTFBDLUtVUlMyL2NoYXB0ZXI1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NWI2ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvS1VSUy9MUEMtS1VSUzIvY2hhcHRlcjUKQEAgLTAsMCArMSwxODYgQEAKK0ludGVybWVkaWF0ZSBMUEMKK0Rlc2NhcnRlcyBvZiBCb3JnCitOb3ZlbWJlciAxOTkzCisKKyAgICAgICAgICAgICAgICAgICAgIENoYXB0ZXIgNTogQWR2YW5jZWQgU3RyaW5nIEhhbmRsaW5nCisKKzUuMSBXaGF0IGEgU3RyaW5nIElzCitUaGUgTFBDIEJhc2ljcyB0ZXh0Ym9vayB0YXVnaHQgc3RyaW5ncyBhcyBzaW1wbGUgZGF0YSB0eXBlcy4gIExQQworZ2VuZXJhbGx5IGRlYWxzIHdpdGggc3RyaW5ncyBpbiBzdWNoIGEgbWF0dGVyLiAgVGhlIHVuZGVybHlpbmcgZHJpdmVyCitwcm9ncmFtLCBob3dldmVyLCBpcyB3cml0dGVuIGluIEMsIHdoaWNoIGhhcyBubyBzdHJpbmcgZGF0YSB0eXBlLiAgVGhlCitkcml2ZXIgaW4gZmFjdCBzZWVzIHN0cmluZ3MgYXMgYSBjb21wbGV4IGRhdGEgdHlwZSBtYWRlIHVwIG9mIGFuIGFycmF5IG9mCitjaGFyYWN0ZXJzLCBhIHNpbXBsZSBDIGRhdGEgdHlwZS4gIExQQywgb24gdGhlIG90aGVyIGhhbmQgZG9lcyBub3QKK3JlY29nbml6ZSBhIGNoYXJhY3RlciBkYXRhIHR5cGUgKHRoZXJlIG1heSBhY3R1YWxseSBiZSBhIGRyaXZlciBvciB0d28gb3V0Cit0aGVyZSB3aGljaCBkbyByZWNvZ25pemUgdGhlIGNoYXJhY3RlciBhcyBhIGRhdGEgdHlwZSwgYnV0IGluIGdlbmVyYWwgbm90KS4gCitUaGUgbmV0IGVmZmVjdCBpcyB0aGF0IHRoZXJlIGFyZSBzb21lIGFycmF5LWxpa2UgdGhpbmdzIHlvdSBjYW4gZG8gd2l0aAorc3RyaW5ncyB0aGF0IHlvdSBjYW5ub3QgZG8gd2l0aCBvdGhlciBMUEMgZGF0YSB0eXBlcy4KKworVGhlIGZpcnN0IGVmdW4gcmVnYXJkaW5nIHN0cmluZ3MgeW91IHNob3VsZCBsZWFybiBpcyB0aGUgc3RybGVuKCkgZWZ1bi4gCitUaGlzIGVmdW4gcmV0dXJucyB0aGUgbGVuZ3RoIGluIGNoYXJhY3RlcnMgb2YgYW4gTFBDIHN0cmluZywgYW5kIGlzIHRodXMKK3RoZSBzdHJpbmcgZXF1aXZhbGVudCB0byBzaXplb2YoKSBmb3IgYXJyYXlzLiAgSnVzdCBmcm9tIHRoZSBiZWhhdmlvdXIgb2YKK3RoaXMgZWZ1biwgeW91IGNhbiBzZWUgdGhhdCB0aGUgZHJpdmVyIHRyZWF0cyBhIHN0cmluZyBhcyBpZiBpdCB3ZXJlIG1hZGUgdXAKK29mIHNtYWxsZXIgZWxlbWVudHMuICBJbiB0aGlzIGNoYXB0ZXIsIHlvdSB3aWxsIGxlYXJuIGhvdyB0byBkZWFsIHdpdGgKK3N0cmluZ3Mgb24gYSBtb3JlIGJhc2ljIGxldmVsLCBhcyBjaGFyYWN0ZXJzIGFuZCBzdWIgc3RyaW5ncy4KKworNS4yIFN0cmluZ3MgYXMgQ2hhcmFjdGVyIEFycmF5cworWW91IGNhbiBkbyBuZWFybHkgYW55dGhpbmcgd2l0aCBzdHJpbmdzIHRoYXQgeW91IGNhbiBkbyB3aXRoIGFycmF5cywKK2V4Y2VwdCBhc3NpZ24gdmFsdWVzIG9uIGEgY2hhcmFjdGVyIGJhc2lzLiAgQXQgdGhlIG1vc3QgYmFzaWMsIHlvdSBjYW4KK2FjdHVhbGx5IHJlZmVyIHRvIGNoYXJhY3RlciBjb25zdGFudHMgYnkgZW5jbG9zaW5nIHRoZW0gaW4gJycgKHNpbmdsZQorcXVvdGVzKS4gICdhJyBhbmQgImEiIGFyZSB0aGVyZWZvcmUgdmVyeSBkaWZmZXJlbnQgdGhpbmdzIGluIExQQy4gICdhJworcmVwcmVzZW50cyBhIGNoYXJhY3RlciB3aGljaCBjYW5ub3QgYmUgdXNlZCBpbiBhc3NpZ25tZW50IHN0YXRlbWVudHMgb3IKK2FueSBvdGhlciBvcGVyYXRpb25zIGV4Y2VwdCBjb21wYXJpc29uIGV2YWx1YXRpb25zLiAgImEiIG9uIHRoZSBvdGhlcgoraGFuZCBpcyBhIHN0cmluZyBtYWRlIHVwIG9mIGEgc2luZ2xlIGNoYXJhY3Rlci4gIFlvdSBjYW4gYWRkIGFuZCBzdWJ0cmFjdAorb3RoZXIgc3RyaW5ncyB0byBpdCBhbmQgYXNzaWduIGl0IGFzIGEgdmFsdWUgdG8gYSB2YXJpYWJsZS4KKworV2l0aCBzdHJpbmcgdmFyaWFibGVzLCB5b3UgY2FuIGFjY2VzcyB0aGUgaW5kaXZpZHVhbCBjaGFyYWN0ZXJzIHRvIHJ1bgorY29tcGFyaXNvbnMgYWdhaW5zdCBjaGFyYWN0ZXIgY29uc3RhbnRzIHVzaW5nIGV4YWN0bHkgdGhlIHNhbWUgc3ludGF4Cit0aGF0IGlzIHVzZWQgd2l0aCBhcnJheXMuICBJbiBvdGhlciB3b3JkcywgdGhlIHN0YXRlbWVudDoKKyAgICBpZihzdHJbMl0gPT0gJ2EnKQoraXMgYSB2YWxpZCBMUEMgc3RhdGVtZW50IGNvbXBhcmluZyB0aGUgc2Vjb25kIGNoYXJhY3RlciBpbiB0aGUgc3RyIHN0cmluZwordG8gdGhlIGNoYXJhY3RlciAnYScuICBZb3UgaGF2ZSB0byBiZSB2ZXJ5IGNhcmVmdWwgdGhhdCB5b3UgYXJlIG5vdAorY29tcGFyaW5nIGVsZW1lbnRzIG9mIGFycmF5cyB0byBjaGFyYWN0ZXJzLCBub3IgYXJlIHlvdSBjb21wYXJpbmcKK2NoYXJhY3RlcnMgb2Ygc3RyaW5ncyB0byBzdHJpbmdzLgorCitMUEMgYWxzbyBhbGxvd3MgeW91IHRvIGFjY2VzcyBzZXZlcmFsIGNoYXJhY3RlcnMgdG9nZXRoZXIgdXNpbmcgTFBDJ3MKK3JhbmdlIG9wZXJhdG9yIC4uOgorICAgIGlmKHN0clswLi4xXSA9PSAiYWIiKQorSW4gb3RoZXIgd29yZHMsIHlvdSBjYW4gbG9vayBmb3IgdGhlIHN0cmluZyB3aGljaCBpcyBmb3JtZWQgYnkgdGhlCitjaGFyYWN0ZXJzIDAgdGhyb3VnaCAxIGluIHRoZSBzdHJpbmcgc3RyLiAgQXMgd2l0aCBhcnJheXMsIHlvdSBtdXN0IGJlCitjYXJlZnVsIHdoZW4gdXNpbmcgaW5kZXhpbmcgb3IgcmFuZ2Ugb3BlcmF0b3JzIHNvIHRoYXQgeW91IGRvIG5vdCB0cnkgdG8KK3JlZmVyZW5jZSBhbiBpbmRleCBudW1iZXIgbGFyZ2VyIHRoYW4gdGhlIGxhc3QgaW5kZXguICBEb2luZyBzbyB3aWxsCityZXN1bHQgaW4gYW4gZXJyb3IuCisKK05vdyB5b3UgY2FuIHNlZSBhIGNvdXBsZSBvZiBzaW1pbGFyaXRpZXMgYmV0d2VlbiBzdHJpbmdzIGFuZCBhcnJheXM6CisxKSBZb3UgbWF5IGluZGV4IG9uIGJvdGggdG8gYWNjZXNzIHRoZSB2YWx1ZXMgb2YgaW5kaXZpZHVhbCBlbGVtZW50cy4KKwlhKSBUaGUgaW5kaXZpZHVhbCBlbGVtZW50cyBvZiBzdHJpbmdzIGFyZSBjaGFyYWN0ZXJzCisJYikgVGhlIGluZGl2aWR1YWwgZWxlbWVudHMgb2YgYXJyYXlzIG1hdGNoIHRoZSBkYXRhIHR5cGUgb2YgdGhlCithcnJheS4KKzIpIFlvdSBtYXkgb3BlcmF0ZSBvbiBhIHJhbmdlIG9mIHZhbHVlcworCWEpIEV4OiAiYWJjZGVmIlsxLi4zXSBpcyB0aGUgc3RyaW5nICJiY2QiCisJYikgRXg6ICh7IDEsIDIsIDMsIDQsIDUgfSlbMS4uM10gaXMgdGhlIGludCBhcnJheSAoeyAyLCAzLCA0IH0pCis8KiBOT1RFIEhpZ2hsYW5kZXJATW9yZ2VuR3JhdWVuCisJQWxzbyBwb3NzaWJsZSBpbiBNb3JnZW5HcmF1ZW4gKGluIGNvbW1vbjogQW15bGFhci1kcml2ZXIgTFBNdWRzKToKKwkiYWJjZGVmIlsyLi5dICAgIC0+ICJjZGVmIiBhbmQKKwkiYWJjZGVmIlsxLi48Ml0gIC0+ICJiY2RlIiAgKDwgbWVhbnMgc3RhcnQgY291bnRpbmcgZnJvbSB0aGUgZW5kIGFuZCB3aXRoIDEpCisqPgorCitBbmQgb2YgY291cnNlLCB5b3Ugc2hvdWxkIGFsd2F5cyBrZWVwIGluIG1pbmQgdGhlIGZ1bmRhbWVudGFsCitkaWZmZXJlbmNlOiBhIHN0cmluZyBpcyBub3QgbWFkZSB1cCBvZiBhIG1vcmUgZnVuZGFtZW50YWwgTFBDIGRhdGEgdHlwZS4gCitJbiBvdGhlciB3b3JkcywgeW91IG1heSBub3QgYWN0IG9uIHRoZSBpbmRpdmlkdWFsIGNoYXJhY3RlcnMgYnkKK2Fzc2lnbmluZyB0aGVtIHZhbHVlcy4KKworNS4zIFRoZSBFZnVuIHNzY2FuZigpCitZb3UgY2Fubm90IGRvIGFueSBkZWNlbnQgc3RyaW5nIGhhbmRsaW5nIGluIExQQyB3aXRob3V0IHVzaW5nCitzc2NhbmYoKS4gIFdpdGhvdXQgaXQsIHlvdSBhcmUgbGVmdCB0cnlpbmcgdG8gcGxheSB3aXRoIHRoZSBmdWxsIHN0cmluZ3MKK3Bhc3NlZCBieSBjb21tYW5kIHN0YXRlbWVudHMgdG8gdGhlIGNvbW1hbmQgZnVuY3Rpb25zLiAgSW4gb3RoZXIKK3dvcmRzLCB5b3UgY291bGQgbm90IGhhbmRsZSBhIGNvbW1hbmQgbGlrZTogImdpdmUgc3dvcmQgdG8gbGVvIiwgc2luY2UKK3lvdSB3b3VsZCBoYXZlIG5vIHdheSBvZiBzZXBhcmF0aW5nICJzd29yZCB0byBsZW8iIGludG8gaXRzIGNvbnN0aXR1ZW50CitwYXJ0cy4gIENvbW1hbmRzIHN1Y2ggYXMgdGhlc2UgdGhlcmVmb3JlIHVzZSB0aGlzIGVmdW4gaW4gb3JkZXIgdG8gdXNlCitjb21tYW5kcyB3aXRoIG11bHRpcGxlIGFyZ3VtZW50cyBvciB0byBtYWtlIGNvbW1hbmRzIG1vcmUKKyJFbmdsaXNoLWxpa2UiLgorCitNb3N0IHBlb3BsZSBmaW5kIHRoZSBtYW51YWwgZW50cmllcyBmb3Igc3NjYW5mKCkgdG8gYmUgcmF0aGVyIGRpZmZpY3VsdAorcmVhZGluZy4gIFRoZSBmdW5jdGlvbiBkb2VzIG5vdCBsZW5kIGl0c2VsZiB3ZWxsIHRvIHRoZSBmb3JtYXQgdXNlZCBieQorbWFudWFsIGVudHJpZXMuICBBcyBJIHNhaWQgYWJvdmUsIHRoZSBmdW5jdGlvbiBpcyB1c2VkIHRvIHRha2UgYSBzdHJpbmcgYW5kCiticmVhayBpdCBpbnRvIHVzYWJsZSBwYXJ0cy4gIFRlY2huaWNhbGx5IGl0IGlzIHN1cHBvc2VkIHRvIHRha2UgYSBzdHJpbmcgYW5kCitzY2FuIGl0IGludG8gb25lIG9yIG1vcmUgdmFyaWFibGVzIG9mIHZhcnlpbmcgdHlwZXMuICBUYWtlIHRoZSBleGFtcGxlCithYm92ZToKKworaW50IGdpdmUoc3RyaW5nIHN0cikgeworICAgIHN0cmluZyB3aGF0LCB3aG9tOworCisgICAgaWYoIXN0cikgcmV0dXJuIG5vdGlmeV9mYWlsKCJHaXZlIHdoYXQgdG8gd2hvbT9cbiIpOworICAgIGlmKHNzY2FuZihzdHIsICIlcyB0byAlcyIsIHdoYXQsIHdob20pICE9IDIpIAorICAgICAgcmV0dXJuIG5vdGlmeV9mYWlsKCJHaXZlIHdoYXQgdG8gd2hvbT9cbiIpOworICAgIC4uLiByZXN0IG9mIGdpdmUgY29kZSAuLi4KK30KKworVGhlIGVmdW4gc3NjYW5mKCkgdGFrZXMgdGhyZWUgb3IgbW9yZSBhcmd1bWVudHMuICBUaGUgZmlyc3QgYXJndW1lbnQgaXMKK3RoZSBzdHJpbmcgeW91IHdhbnQgc2Nhbm5lZC4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgY2FsbGVkIGEgY29udHJvbAorc3RyaW5nLiAgVGhlIGNvbnRyb2wgc3RyaW5nIGlzIGEgbW9kZWwgd2hpY2ggZGVtb25zdHJhdGVzIGluIHdoYXQgZm9ybQordGhlIG9yaWdpbmFsIHN0cmluZyBpcyB3cml0dGVuLCBhbmQgaG93IGl0IHNob3VsZCBiZSBkaXZpZGVkIHVwLiAgVGhlIHJlc3QKK29mIHRoZSBhcmd1bWVudHMgYXJlIHZhcmlhYmxlcyB0byB3aGljaCB5b3Ugd2lsbCBhc3NpZ24gdmFsdWVzIGJhc2VkCit1cG9uIHRoZSBjb250cm9sIHN0cmluZy4KKworVGhlIGNvbnRyb2wgc3RyaW5nIGlzIG1hZGUgdXAgb2YgdGhyZWUgZGlmZmVyZW50IHR5cGVzIG9mIGVsZW1lbnRzOiAxKQorY29uc3RhbnRzLCAyKSB2YXJpYWJsZSBhcmd1bWVudHMgdG8gYmUgc2Nhbm5lZCwgYW5kIDMpIHZhcmlhYmxlCithcmd1bWVudHMgdG8gYmUgZGlzY2FyZGVkLiAgWW91IG11c3QgaGF2ZSBhcyBtYW55IG9mIHRoZSB2YXJpYWJsZQorYXJndW1lbnRzIGluIHNzY2FuZigpIGFzIHlvdSBoYXZlIGVsZW1lbnRzIG9mIHR5cGUgMiBpbiB5b3VyIGNvbnRyb2wKK3N0cmluZy4gIEluIHRoZSBhYm92ZSBleGFtcGxlLCB0aGUgY29udHJvbCBzdHJpbmcgd2FzICIlcyB0byAlcyIsIHdoaWNoCitpcyBhIHRocmVlIGVsZW1lbnQgY29udHJvbCBzdHJpbmcgbWFkZSB1cCBvZiBvbmUgY29uc3RhbnQgcGFydCAoIiB0byAiKSwKK2FuZCB0d28gdmFyaWFibGUgYXJndW1lbnRzIHRvIGJlIHNjYW5uZWQgKCIlcyIpLiAgVGhlcmUgd2VyZSBubwordmFyaWFibGVzIHRvIGJlIGRpc2NhcmRlZC4KKworVGhlIGNvbnRyb2wgc3RyaW5nIGJhc2ljYWxseSBpbmRpY2F0ZXMgdGhhdCB0aGUgZnVuY3Rpb24gc2hvdWxkIGZpbmQgdGhlCitzdHJpbmcgIiB0byAiIGluIHRoZSBzdHJpbmcgc3RyLiAgV2hhdGV2ZXIgY29tZXMgYmVmb3JlIHRoYXQgY29uc3RhbnQgd2lsbAorYmUgcGxhY2VkIGludG8gdGhlIGZpcnN0IHZhcmlhYmxlIGFyZ3VtZW50IGFzIGEgc3RyaW5nLiAgVGhlIHNhbWUgdGhpbmcKK3dpbGwgaGFwcGVuIHRvIHdoYXRldmVyIGNvbWVzIGFmdGVyIHRoZSBjb25zdGFudC4KKworVmFyaWFibGUgZWxlbWVudHMgYXJlIG5vdGVkIGJ5IGEgIiUiIHNpZ24gZm9sbG93ZWQgYnkgYSBjb2RlIGZvcgorZGVjb2RpbmcgdGhlbS4gIElmIHRoZSB2YXJpYWJsZSBlbGVtZW50IGlzIHRvIGJlIGRpc2NhcmRlZCwgdGhlICIlIiBzaWduCitpcyBmb2xsb3dlZCBieSB0aGUgIioiIGFzIHdlbGwgYXMgdGhlIGNvZGUgZm9yIGRlY29kaW5nIHRoZSB2YXJpYWJsZS4gCitDb21tb24gY29kZXMgZm9yIHZhcmlhYmxlIGVsZW1lbnQgZGVjb2RpbmcgYXJlICJzIiBmb3Igc3RyaW5ncyBhbmQgImQiCitmb3IgaW50ZWdlcnMuICBJbiBhZGRpdGlvbiwgeW91ciBtdWRsaWIgbWF5IHN1cHBvcnQgb3RoZXIgY29udmVyc2lvbgorY29kZXMsIHN1Y2ggYXMgImYiIGZvciBmbG9hdC4gIFNvIGluIHRoZSB0d28gZXhhbXBsZXMgYWJvdmUsIHRoZSAiJXMiIGluCit0aGUgY29udHJvbCBzdHJpbmcgaW5kaWNhdGVzIHRoYXQgd2hhdGV2ZXIgbGllcyBpbiB0aGUgb3JpZ2luYWwgc3RyaW5nIGluIHRoZQorY29ycmVzcG9uZGluZyBwbGFjZSB3aWxsIGJlIHNjYW5uZWQgaW50byBhIG5ldyB2YXJpYWJsZSBhcyBhIHN0cmluZy4KKworQSBzaW1wbGUgZXhlcmNpc2UuICBIb3cgd291bGQgeW91IHR1cm4gdGhlIHN0cmluZyAiMTQ1IiBpbnRvIGFuCitpbnRlZ2VyPworCitBbnN3ZXI6CitpbnQgeDsKK3NzY2FuZigiMTQ1IiwgIiVkIiwgeCk7CisKK0FmdGVyIHRoZSBzc2NhbmYoKSBmdW5jdGlvbiwgeCB3aWxsIGVxdWFsIHRoZSBpbnRlZ2VyIDE0NS4KKworV2hlbmV2ZXIgeW91IHNjYW4gYSBzdHJpbmcgYWdhaW5zdCBhIGNvbnRyb2wgc3RyaW5nLCB0aGUgZnVuY3Rpb24KK3NlYXJjaGVzIHRoZSBvcmlnaW5hbCBzdHJpbmcgZm9yIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiB0aGUgZmlyc3QgY29uc3RhbnQgaW4KK3RoZSBvcmlnaW5hbCBzdHJpbmcuICBGb3IgZXhhbXBsZSwgaWYgeW91ciBzdHJpbmcgaXMgIm1hZ2ljIGF0dGFjayAxMDAiIGFuZAoreW91IGhhdmUgdGhlIGZvbGxvd2luZzoKK2ludCBpbXByb3ZlKHN0cmluZyBzdHIpIHsKKyAgICBzdHJpbmcgc2tpbGw7CisgICAgaW50IHg7CisKKyAgICBpZihzc2NhbmYoc3RyLCAiJXMgJWQiLCBza2lsbCwgeCkgIT0gMikgcmV0dXJuIDA7CisgICAgLi4uCit9Cit5b3Ugd291bGQgZmluZCB0aGF0IHlvdSBoYXZlIGNvbWUgdXAgd2l0aCB0aGUgd3JvbmcgcmV0dXJuIHZhbHVlIGZvcgorc3NjYW5mKCkgKG1vcmUgb24gdGhlIHJldHVybiB2YWx1ZXMgbGF0ZXIpLiAgVGhlIGNvbnRyb2wgc3RyaW5nLCAiJXMgJWQiLAoraXMgbWFkZSB1cCBvZiB0byB2YXJpYWJsZXMgdG8gYmUgc2Nhbm5lZCBhbmQgb25lIGNvbnN0YW50LiAgVGhlIGNvbnN0YW50CitpcyAiICIuICBTbyB0aGUgZnVuY3Rpb24gc2VhcmNoZXMgdGhlIG9yaWdpbmFsIHN0cmluZyBmb3IgdGhlIGZpcnN0IGluc3RhbmNlCitvZiAiICIsIHBsYWNpbmcgd2hhdGV2ZXIgY29tZXMgYmVmb3JlIHRoZSAiICIgaW50byBza2lsbCwgYW5kIHRyeWluZyB0bworcGxhY2Ugd2hhdGV2ZXIgY29tZXMgYWZ0ZXIgdGhlICIgIiBpbnRvIHguICBUaGlzIHNlcGFyYXRlcyAibWFnaWMgYXR0YWNrCisxMDAiIGludG8gdGhlIGNvbXBvbmVudHMgIm1hZ2ljIiBhbmQgImF0dGFjayAxMDAiLiAgVGhlIGZ1bmN0aW9uLAoraG93ZXZlciwgY2Fubm90IG1ha2UgaGVhZHMgb3IgdGFsZXMgb2YgImF0dGFjayAxMDAiIGFzIGFuIGludGVnZXIsIHNvIGl0CityZXR1cm5zIDEsIG1lYW5pbmcgdGhhdCAxIHZhcmlhYmxlIHZhbHVlIHdhcyBzdWNjZXNzZnVsbHkgc2Nhbm5lZAorKCJtYWdpYyIgaW50byBza2lsbCkuCisKK1BlcmhhcHMgeW91IGd1ZXNzZWQgZnJvbSB0aGUgYWJvdmUgZXhhbXBsZXMsIGJ1dCB0aGUgZWZ1biBzc2NhbmYoKQorcmV0dXJucyBhbiBpbnQsIHdoaWNoIGlzIHRoZSBudW1iZXIgb2YgdmFyaWFibGVzIGludG8gd2hpY2ggdmFsdWVzIGZyb20KK3RoZSBvcmlnaW5hbCBzdHJpbmcgd2VyZSBzdWNjZXNzZnVsbHkgc2Nhbm5lZC4gIFNvbWUgZXhhbXBsZXMgd2l0aAorcmV0dXJuIHZhbHVlcyBmb3IgeW91IHRvIGV4YW1pbmU6CisKK3NzY2FuZigic3dvICByZCBkZXNjYXJ0ZXMiLCAiJXMgdG8gJXMiLCBzdHIxLCBzdHIyKSAgICAgICAgICAgcmV0dXJuOiAwCitzc2NhbmYoInN3byAgcmQgZGVzY2FydGVzIiwgIiVzICVzIiwgc3RyMSwgc3RyMikgICAgICAgICAgICAgIHJldHVybjogMgorc3NjYW5mKCIyMDAgZ29sZCB0byBkZXNjYXJ0ZXMiLCAiJWQgJXMgdG8gJXMiLCB4LCBzdHIxLCBzdHIyKSByZXR1cm46IDMKK3NzY2FuZigiMjAwIGdvbGQgdG8gZGVzY2FydGVzIiwgIiVkICUqcyB0byAlcyIsIHgsIHN0cjEpICAgICAgcmV0dXJuOiAyCit3aGVyZSB4IGlzIGFuIGludCBhbmQgc3RyMSBhbmQgc3RyMiBhcmUgc3RyaW5nCisKKzUuNCBTdW1tYXJ5CitMUEMgc3RyaW5ncyBjYW4gYmUgdGhvdWdodCBvZiBhcyBhcnJheXMgb2YgY2hhcmFjdGVycywgeWV0IGFsd2F5cwora2VlcGluZyBpbiBtaW5kIHRoYXQgTFBDIGRvZXMgbm90IGhhdmUgdGhlIGNoYXJhY3RlciBkYXRhIHR5cGUgKHdpdGgKK21vc3QsIGJ1dCBub3QgYWxsIGRyaXZlcnMpLiAgU2luY2UgdGhlIGNoYXJhY3RlciBpcyBub3QgYSB0cnVlIExQQyBkYXRhCit0eXBlLCB5b3UgY2Fubm90IGFjdCB1cG9uIGluZGl2aWR1YWwgY2hhcmFjdGVycyBpbiBhbiBMUEMgc3RyaW5nIGluIHRoZQorc2FtZSBtYW5uZXIgeW91IHdvdWxkIGFjdCB1cG9uIGRpZmZlcmVudCBkYXRhIHR5cGVzLiAgTm90aWNpbmcgdGhlCitpbnRpbWF0ZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBzdHJpbmdzIGFuZCBhcnJheXMgbmV2ZXJ0aGVsZXNzIG1ha2VzIGl0CitlYXNpZXIgdG8gdW5kZXJzdGFuZCBzdWNoIGNvbmNlcHRzIGFzIHRoZSByYW5nZSBvcGVyYXRvciBhbmQgaW5kZXhpbmcgb24KK3N0cmluZ3MuCisKK1RoZXJlIGFyZSBlZnVucyBvdGhlciB0aGFuIHNzY2FuZigpIHdoaWNoIGludm9sdmUgYWR2YW5jZWQgc3RyaW5nCitoYW5kbGluZywgaG93ZXZlciwgdGhleSBhcmUgbm90IG5lZWRlZCBuZWFybHkgYXMgb2Z0ZW4uICBZb3Ugc2hvdWxkCitjaGVjayBvbiB5b3VyIG11ZCBmb3IgbWFuIG9yIGhlbHAgZmlsZXMgb24gdGhlIGVmdW5zOiBleHBsb2RlKCksCitpbXBsb2RlKCksIHJlcGxhY2Vfc3RyaW5nKCksIHNwcmludGYoKS4gIEFsbCBvZiB0aGVzZSBhcmUgdmVyeSB2YWx1YWJsZQordG9vbHMsIGVzcGVjaWFsbHkgaWYgeW91IGludGVuZCB0byBkbyBjb2RpbmcgYXQgdGhlIG11ZGxpYiBsZXZlbC4KKworQ29weXJpZ2h0IChjKSBHZW9yZ2UgUmVlc2UgMTk5MwpkaWZmIC0tZ2l0IGEvZG9jL0tVUlMvTFBDLUtVUlMyL2NoYXB0ZXI2IGIvZG9jL0tVUlMvTFBDLUtVUlMyL2NoYXB0ZXI2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YjM1NTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvS1VSUy9MUEMtS1VSUzIvY2hhcHRlcjYKQEAgLTAsMCArMSwyNzYgQEAKK0ludGVybWVkaWF0ZSBMUEMKK0Rlc2NhcnRlcyBvZiBCb3JnCitOb3ZlbWJlciAxOTkzCisKKyAgICAgICAgICAgICAgICAgICAgICAgQ2hhcHRlciA2OiBJbnRlcm1lZGlhdGUgSW5oZXJpdGFuY2UKKworNi4xIEJhc2ljcyBvZiBJbmhlcml0YW5jZQorSW4gdGhlIHRleHRib29rIExQQyBCYXNpY3MsIHlvdSBsZWFybmVkIGhvdyBpdCBpcyB0aGUgbXVkbGliIG1haW50YWlucworY29uc2lzdGVuY3kgYW1vdW5nIG11ZCBvYmplY3RzIHRocm91Z2ggaW5oZXJpdGFuY2UuICBJbmhlcml0YW5jZQorYWxsb3dzIHRoZSBtdWQgYWRtaW5pc3RyYXRvcnMgdG8gY29kZSB0aGUgYmFzaWMgZnVuY3Rpb25zIGFuZCBzdWNoIHRoYXQKK2FsbCBtdWRsaWIgb2JqZWN0cywgb3IgYWxsIG11ZGxpYiBvYmplY3RzIG9mIGEgY2VydGFpbiB0eXBlIG11c3QgaGF2ZSBzbwordGhhdCB5b3UgY2FuIGNvbmNlbnRyYXRlIG9uIGNyZWF0aW5nIHRoZSBmdW5jdGlvbnMgd2hpY2ggbWFrZSB0aGVzZQorb2JqZWN0cyBkaWZmZXJlbnQuICBXaGVuIHlvdSBidWlsZCBhIHJvb20sIG9yIGEgd2VhcG9uLCBvciBhIG1vbnN0ZXIsCit5b3UgYXJlIHRha2luZyBhIHNldCBvZiBmdW5jdGlvbnMgYWxyZWFkeSB3cml0dGVuIGZvciB5b3UgYW5kIGluaGVyaXRpbmcKK3RoZW0gaW50byB5b3VyIG9iamVjdC4gIEluIHRoaXMgd2F5LCBhbGwgb2JqZWN0cyBvbiB0aGUgbXVkIGNhbiBjb3VudCBvbgorb3RoZXIgb2JqZWN0cyB0byBiZWhhdmUgaW4gYSBjZXJ0YWluIG1hbm5lci4gIEZvciBpbnN0YW5jZSwgcGxheWVyIG9iamVjdHMKK2NhbiByZWx5IG9uIHRoZSBmYWN0IHRoYXQgYWxsIHJvb20gb2JqZWN0cyB3aWxsIGhhdmUgYSBmdW5jdGlvbiBpbiB0aGVtCitjYWxsZWQgcXVlcnlfbG9uZygpIHdoaWNoIGRlc2NyaWJlcyB0aGUgcm9vbS4gIEluaGVyaXRhbmNlIHRodXMga2VlcHMKK3lvdSBmcm9tIGhhdmluZyB0byB3b3JyeSBhYm91dCB3aGF0IHRoZSBmdW5jdGlvbiBxdWVyeV9sb25nKCkgc2hvdWxkCitsb29rIGxpa2UuCisKK05hdHVyYWxseSwgdGhpcyB0ZXh0Ym9vayB0cmllcyB0byBnbyBiZXlvbmQgdGhpcyBmdW5kYW1lbnRhbCBrbm93bGVkZ2UKK29mIGluaGVyaXRhbmNlIHRvIGdpdmUgdGhlIGNvZGVyIGEgYmV0dGVyIHVuZGVydHN0YW5kaW5nIG9mIGhvdworaW5oZXJpdGFuY2Ugd29ya3MgaW4gTFBDIHByb2dyYW1taW5nLiAgV2l0aG91dCBnZXR0aW5nIGludG8gZGV0YWlsIHRoYXQKK3RoZSBhZHZhbmNlZCBkb21haW4gY29kZXIvYmVnaW5uZXIgbXVkbGliIGNvZGVyIHNpbXBseSBkb2VzIG5vdCB5ZXQKK25lZWQsIHRoaXMgY2hhcHRlciB3aWxsIHRyeSB0byBleHBsYWluIGV4YWN0bHkgd2hhdCBoYXBwZW5zIHdoZW4geW91Citpbmhlcml0IGFuIG9iamVjdC4KKworNi4yIENsb25pbmcgYW5kIEluaGVyaXRhbmNlCitXaGVuZXZlciBhIGZpbGUgaXMgcmVmZXJlbmNlZCBmb3IgdGhlIGZpcnN0IHRpbWUgYXMgYW4gb2JqZWN0IChhcyBvcHBvc2VkCit0byByZWFkaW5nIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSksIHRoZSBnYW1lIHRyaWVzIHRvIGxvYWQgdGhlIGZpbGUgaW50bworbWVtb3J5IGFuZCBjcmVhdGUgYW4gb2JqZWN0LiAgSWYgdGhlIG9iamVjdCBpcyBzdWNjZXNzZnVsbHkgbG9hZGVkIGludG8KK21lbW9yeSwgaXQgYmVjb21lcyBhcyBtYXN0ZXIgY29weS4gIE1hc3RlciBjb3BpZXMgb2Ygb2JqZWN0cyBtYXkgYmUKK2Nsb25lZCBidXQgbm90IHVzZWQgYXMgYWN0dWFsIGdhbWUgb2JqZWN0cy4gIFRoZSBtYXN0ZXIgY29weSBpcyB1c2VkIHRvCitzdXBwb3J0IGFueSBjbG9uZSBvYmplY3RzIGluIHRoZSBnYW1lLgorCitUaGUgbWFzdGVyIGNvcHkgaXMgdGhlIHNvdXJjZSBvZiBvbmUgb2YgdGhlIGNvbnRyb3ZlcnNpZXMgb2YgbXVkIExQQworY29kaW5nLCB0aGF0IGlzIHdoZXRoZXIgdG8gY2xvbmUgb3IgaW5oZXJpdC4gIFdpdGggcm9vbXMsIHRoZXJlIGlzIG5vCitxdWVzdGlvbiBvZiB3aGF0IHlvdSB3aXNoIHRvIGRvLCBzaW5jZSB0aGVyZSBzaG91bGQgb25seSBiZSBvbmUgaW5zdGFuY2UKK29mIGVhY2ggcm9vbSBvYmplY3QgaW4gdGhlIGdhbWUuICBTbyB5b3UgZ2VuZXJhbGx5IHVzZSBpbmhlcml0YW5jZSBpbgorY3JlYXRpbmcgcm9vbXMuICBNYW55IG11ZCBhZG1pbmlzdHJhdG9ycywgaW5jbHVkaW5nIG15c2VsZiwgaG93ZXZlcgorZW5jb3VyYWdlIGNyZWF0b3JzIHRvIGNsb25lIHRoZSBzdGFuZGFyZCBtb25zdGVyIG9iamVjdCBhbmQgY29uZmlndXJlIGl0Citmcm9tIGluc2lkZSByb29tIG9iamVjdHMgaW5zdGVhZCBvZiBrZWVwaW5nIG1vbnN0ZXJzIGluIHNlcGFyYXRlIGZpbGVzCit3aGljaCBpbmhlcml0IHRoZSBzdGFuZGFyZCBtb25zdGVyIG9iamVjdC4KKworQXMgSSBzdGF0ZWQgYWJvdmUsIGVhY2ggdGltZSBhIGZpbGUgaXMgcmVmZXJlbmNlZCB0byBjcmVhdGUgYW4gb2JqZWN0LCBhCittYXN0ZXIgY29weSBpcyBsb2FkZWQgaW50byBtZW1vcnkuICBXaGVuIHlvdSBkbyBzb21ldGhpbmcgbGlrZToKK3ZvaWQgcmVzZXQoKSB7CisgICAgb2JqZWN0IG9iOworICAgIG9iID0gbmV3KCIvc3RkL21vbnN0ZXIiKTsKKyAgICAgIC8qIGNsb25lX29iamVjdCgiL3N0ZC9tb25zdGVyIikgc29tZSBwbGFjZXMgKi8KKyAgICBvYi0+c2V0X25hbWUoImZvbyBtb25zdGVyIik7CisgICAgLi4uICByZXN0IG9mIG1vbnN0ZXIgY29uZmlnIGNvZGUgZm9sbG93ZWQgYnkgbW92aW5nCitpdCB0byB0aGUgcm9vbSAuLi4KK30KK3RoZSBkcml2ZXIgc2VhcmNoZXMgdG8gc2VlIGlmIHRoZWlyIGlzIGEgbWFzdGVyIG9iamVjdCBjYWxsZWQgIi9zdGQvbW9uc3RlciIuIAorSWYgbm90LCBpdCBjcmVhdGVzIG9uZS4gIElmIGl0IGRvZXMgZXhpc3QsIG9yIGFmdGVyIGl0IGhhcyBiZWVuIGNyZWF0ZWQsIHRoZQorZHJpdmVyIHRoZW4gY3JlYXRlcyBhIGNsb25lIG9iamVjdCBjYWxsZWQgIi9zdGQvbW9uc3RlciM8bnVtYmVyPiIuICBJZgordGhpcyBpcyB0aGUgZmlyc3QgdGltZSAiL3N0ZC9tb25zdGVyIiBpcyBiZWluZyByZWZlcmVuY2VkLCBpbiBlZmZlY3QsIHR3bworb2JqZWN0cyBhcmUgYmVpbmcgY3JlYXRlZDogdGhlIG1hc3RlciBvYmplY3QgYW5kIHRoZSBjbG9uZWQgaW5zdGFuY2UuCisKK09uIHRoZSBvdGhlciBoYW5kLCBsZXQncyBzYXkgeW91IGRpZCBhbGwgeW91ciBjb25maWd1cmluZyBpbiB0aGUgY3JlYXRlKCkKK29mIGEgc3BlY2lhbCBtb25zdGVyIGZpbGUgd2hpY2ggaW5oZXJpdHMgIi9zdGQvbW9uc3RlciIuICBJbnN0ZWFkIG9mCitjbG9uaW5nIHRoZSBzdGFuZGFyZCBtb25zdGVyIG9iamVjdCBmcm9tIHlvdXIgcm9vbSwgeW91IGNsb25lIHlvdXIKK21vbnN0ZXIgZmlsZS4gIElmIHRoZSBzdGFuZGFyZCBtb25zdGVyIGhhcyBub3QgYmVlbiBsb2FkZWQsIGl0IGdldHMgbG9hZGVkCitzaW5jZSB5b3VyIG1vbnN0ZXIgaW5oZXJpdHMgaXQuICBJbiBhZGRpdGlvbiwgYSBtYXN0ZXIgY29weSBvZiB5b3VyIGZpbGUKK2dldHMgbG9hZGVkIGludG8gbWVtb3J5LiAgRmluYWxseSwgYSBjbG9uZSBvZiB5b3VyIG1vbnN0ZXIgaXMgY3JlYXRlZAorYW5kIG1vdmVkIGludG8gdGhlIHJvb20sIGZvciBhIHRvdGFsIG9mIHRocmVlIG9iamVjdHMgYWRkZWQgdG8gdGhlIGdhbWUuIAorTm90ZSB0aGF0IHlvdSBjYW5ub3QgbWFrZSB1c2Ugb2YgdGhlIG1hc3RlciBjb3B5IGVhc2lseSB0byBnZXQgYXJvdW5kCit0aGlzLiAgSWYsIGZvciBleGFtcGxlLCB5b3Ugd2VyZSB0byBkbzoKKyAgICAiL3dpemFyZHMvZGVzY2FydGVzL215X21vbnN0ZXIiLT5tb3ZlKHRoaXNfb2JqZWN0KCkpOworaW5zdGVhZCBvZgorICAgIG5ldygiL3dpemFyZHMvZGVzY2FydGVzL215X21vbnN0ZXIiKS0+bW92ZSh0aGlzX29iamVjdCgpKTsKK3lvdSB3b3VsZCBub3QgYmUgYWJsZSB0byBtb2RpZnkgdGhlIGZpbGUgIm15X21vbnN0ZXIuYyIgYW5kIHVwZGF0ZSBpdCwKK3NpbmNlIHRoZSB1cGRhdGUgY29tbWFuZCBkZXN0cm95cyB0aGUgY3VycmVudCBtYXN0ZXIgdmVyc2lvbiBvZiBhbgorb2JqZWN0LiAgT24gc29tZSBtdWRsaWJzIGl0IGFsc28gbG9hZHMgdGhlIG5ldyB2ZXJzaW9uIGludG8gbWVtb3J5LiAKK0ltYWdpbmUgdGhlIGxvb2sgb24gYSBwbGF5ZXIncyBmYWNlIHdoZW4gdGhlaXIgbW9uc3RlciBkaXNhcHBlYXJzIGluCittaWQtY29tYmF0IGNhdXNlIHlvdSB1cGRhdGVkIHRoZSBmaWxlIQorCitDbG9uaW5nIGlzIHRoZXJlZm9yZSBhIHVzZWZ1bCB0b28gd2hlbiB5b3UgcGxhbiBvbiBkb2luZyBqdXN0IHRoYXQtCitjbG9uaW5nLiAgSWYgeW91IGFyZSBkb2luZyBub3RoaW5nIHNwZWNpYWwgdG8gYSBtb25zdGVyIHdoaWNoIGNhbm5vdCBiZQorZG9uZSB0aHJvdWdoIGEgZmV3IGNhbGwgb3RoZXJzLCB0aGVuIHlvdSB3aWxsIHNhdmUgdGhlIG11ZCBmcm9tIGdldHRpbmcKK2xvYWRlZCB3aXRoIHVzZWxlc3MgbWFzdGVyIGNvcGllcy4gIEluaGVyaXRhbmNlLCBob3dldmVyLCBpcyB1c2VmdWwgaWYKK3lvdSBwbGFuIHRvIGFkZCBmdW5jdGlvbmFsaXR5IHRvIGFuIG9iamVjdCAod3JpdGUgeW91ciBvd24gZnVuY3Rpb25zKSBvcgoraWYgeW91IGhhdmUgYSBzaW5nbGUgY29uZmlndXJhdGlvbiB0aGF0IGdldHMgdXNlZCBvdmVyIGFuZCBvdmVyIGFnYWluCisoeW91IGhhdmUgYW4gYXJteSBvZiBvcmMgZ3VhcmRzIGFsbCB0aGUgc2FtZSwgc28geW91IHdyaXRlIGEgc3BlY2lhbCBvcmMKK2ZpbGUgYW5kIGNsb25lIGl0KS4KKworNi4zIEluc2lkZSBJbmhlcml0YW5jZQorV2hlbiBvYmplY3RzIEEgYW5kIEIgaW5oZXJpdCBvYmplY3QgQywgYWxsIHRocmVlIG9iamVjdHMgaGF2ZSB0aGVpciBvd24KK3NldCBvZiBkYXRhIHNoYXJpbmcgb25lIHNldCBvZiBmdW5jdGlvbiBkZWZpbml0aW9ucyBmcm9tIG9iamVjdCBDLiAgSW4KK2FkZGl0aW9uLCBBIGFuZCBCIHdpbGwgaGF2ZSBzZXBhcmF0ZSBmdW5jdGlvbnMgZGVmaW5pdGlvbnMgd2hpY2ggd2VyZQorZW50ZXJlZCBzZXBhcmF0ZWx5IGludG8gdGhlaXIgY29kZS4gIEZvciB0aGUgc2FrZSBvZiBleGFtcGxlIHRocm91Z2hvdXQKK3RoZSByZXN0IG9mIHRoZSBjaGFwdGVyLCB3ZSB3aWxsIHVzZSB0aGUgZm9sbG93aW5nIGNvZGUuICBEbyBub3QgYmUKK2Rpc3R1cmJlZCBpZiwgYXQgdGhpcyBwb2ludCwgc29tZSBvZiB0aGUgY29kZSBtYWtlcyBubyBzZW5zZToKKworT0JKRUNUIEMKK3ByaXZhdGUgc3RyaW5nIG5hbWUsIGNhcF9uYW1lLCBzaG9ydCwgbG9uZzsKK3ByaXZhdGUgaW50IHNldHVwOworCit2b2lkIHNldF9uYW1lKHN0cmluZyBzdHIpCitub21hc2sgc3RyaW5nIHF1ZXJ5X25hbWUoKTsKK3ByaXZhdGUgaW50IHF1ZXJ5X3NldHVwKCk7CitzdGF0aWMgdm9pZCB1bnNldHVwKCk7Cit2b2lkIHNldF9zaG9ydChzdHJpbmcgc3RyKTsKK3N0cmluZyBxdWVyeV9zaG9ydCgpOwordm9pZCBzZXRfbG9uZyhzdHJpbmcgc3RyKTsKK3N0cmluZyBxdWVyeV9sb25nKCk7CisKKwordm9pZCBzZXRfbmFtZShzdHJpbmcgc3RyKSB7IAorICAgIGlmKCFxdWVyeV9zZXR1cCgpKSB7CisgICAgICAgIG5hbWUgPSBzdHI7CisgICAgc2V0dXAgPSAxOworfQorCitub21hc2sgc3RyaW5nIHF1ZXJ5X25hbWUoKSB7IHJldHVybiBuYW1lOyB9CisKK3ByaXZhdGUgcXVlcnlfc2V0dXAoKSB7IHJldHVybiBzZXR1cDsgfQorCitzdGF0aWMgdm9pZCB1bnNldHVwKCkgeyBzZXR1cCA9IDA7IH0KKworc3RyaW5nIHF1ZXJ5X2NhcF9uYW1lKCkgeworICAgIHJldHVybiAobmFtZSA/IGNhcGl0YWxpemUobmFtZSkgOiAiIik7IH0KK30KKwordm9pZCBzZXRfc2hvcnQoc3RyaW5nIHN0cikgeyBzaG9ydCA9IHN0cjsgfQorCitzdHJpbmcgcXVlcnlfc2hvcnQoKSB7IHJldHVybiBzaG9ydDsgfQorCit2b2lkIHNldF9sb25nKHN0cmluZyBzdHIpIHsgbG9uZyA9IHN0cjsgfQorCitzdHJpbmcgcXVlcnlfbG9uZygpIHsgcmV0dXJuIHN0cjsgfQorCit2b2lkIGNyZWF0ZSgpIHsgc2V0ZXVpZChnZXR1aWQoKSk7IH0KKworT0JKRUNUIEIKK2luaGVyaXQgIi9zdGQvb2JqZWN0YyI7CisKK3ByaXZhdGUgaW50IHdjOworCit2b2lkIHNldF93YyhpbnQgd2MpOworaW50IHF1ZXJ5X3djKCk7CitpbnQgd2llbGR3ZWFwb24oc3RyaW5nIHN0cik7CisKK3ZvaWQgY3JlYXRlKCkgeyA6OmNyZWF0ZSgpOyB9CisKK3ZvaWQgaW5pdCgpIHsKKyAgICBpZihlbnZpcm9ubWVudCh0aGlzX29iamVjdCgpKSA9PSB0aGlzX3BsYXllcigpKQorICAgICAgYWRkX2FjdGlvbigid2llbGR3ZWFwb24iLCAid2llbGQiKTsKK30KKwordm9pZCBzZXRfd2MoaW50IHgpIHsgd2MgPSB4OyB9CisKK2ludCBxdWVyeV93YygpIHsgcmV0dXJuIHdjOyB9CisKK2ludCB3aWVsZHdlYXBvbihzdHJpbmcgc3RyKSB7CisgICAgLi4uIGNvZGUgZm9yIHdpZWxkaW5nIHRoZSB3ZWFwb24gLi4uCit9CisKK09CSkVDVCBBCitpbmhlcml0ICIvc3RkL29iamVjdGMiOworCitpbnQgZ2hvc3Q7CisKK3ZvaWQgY3JlYXRlKCkgeyA6OmNyZWF0ZSgpOyB9CisKK3ZvaWQgY2hhbmdlX25hbWUoc3RyaW5nIHN0cikgeworICAgIGlmKCEoKGludCl0aGlzX29iamVjdCgpLT5pc19wbGF5ZXIoKSkpIHVuc2V0dXAoKTsKKyAgICBzZXRfbmFtZShzdHIpOworfQorCitzdHJpbmcgcXVlcnlfY2FwX25hbWUoKSB7CisgICAgaWYoZ2hvc3QpIHJldHVybiAiQSBnaG9zdCI7CisgICAgZWxzZSByZXR1cm4gOjpxdWVyeV9jYXBfbmFtZSgpOworfQorCitBcyB5b3UgY2FuIHNlZSwgb2JqZWN0IEMgaXMgaW5oZXJpdGVkIGJvdGggYnkgb2JqZWN0IEEgYW5kIG9iamVjdCBCLiAKK09iamVjdCBDIGlzIGEgcmVwcmVzZW50YXRpb24gb2YgYSBtdWNoIG92ZXJzaW1wbGlmaWVkIGJhc2Ugb2JqZWN0LCB3aXRoIEIKK2JlaW5nIGFuIGVxdWFsbHkgb3ZlcnNpbXBsaWZpZWQgd2VhcG9uIGFuZCBBIGJlaW5nIGFuIGVxdWFsbHkKK3NpbXBsaWZpZWQgbGl2aW5nIG9iamVjdC4gIE9ubHkgb25lIGNvcHkgb2YgZWFjaCBmdW5jdGlvbiBpcyByZXRhaW5lZCBpbgorbWVtb3J5LCBldmVuIHRob3VnaCB3ZSBoYXZlIGhlcmUgdGhyZWUgb2JqZWN0cyB1c2luZyB0aGUgZnVuY3Rpb25zLiAKK1RoZXJlIGFyZSBvZiBjb3Vyc2UsIHRocmVlIGluc3RhbmNlcyBvZiB0aGUgdmFyaWFibGVzIGZyb20gT2JqZWN0IEMgaW4KK21lbW9yeSwgd2l0aCBvbmUgaW5zdGFuY2Ugb2YgdGhlIHZhcmlhYmxlcyBvZiBPYmplY3QgQSBhbmQgT2JqZWN0IEIgaW4KK21lbW9yeS4gIEVhY2ggb2JqZWN0IHRodXMgZ2V0cyBpdHMgb3duIGRhdGEuICAKKworNi40IEZ1bmN0aW9uIGFuZCBWYXJpYWJsZSBMYWJlbHMKK05vdGljZSB0aGF0IG1hbnkgb2YgdGhlIGZ1bmN0aW9ucyBhYm92ZSBhcmUgcHJvY2VlZGVkIHdpdGggbGFiZWxzIHdoaWNoCitoYXZlIG5vdCB5ZXQgYXBwZWFyZWQgaW4gZWl0aGVyIHRoaXMgdGV4dCBvciB0aGUgYmVnaW5uZXIgdGV4dCwgdGhlIGxhYmVscworc3RhdGljLCBwcml2YXRlLCBhbmQgbm9tYXNrLiAgVGhlc2UgbGFiZWxzIGRlZmluZSBzcGVjaWFsIHByaXZlbGVkZ2VzCit3aGljaCBhbiBvYmplY3QgbWF5IGhhdmUgdG8gaXRzIGRhdGEgYW5kIG1lbWJlciBmdW5jdGlvbnMuICBGdW5jdGlvbnMKK3lvdSBoYXZlIHVzZWQgdXAgdG8gdGhpcyBwb2ludCBoYXZlIHRoZSBkZWZhdWx0IGxhYmVsIHB1YmxpYy4gIFRoaXMgaXMKK2RlZmF1bHQgdG8gc3VjaCBhIGRlZ3JlZSwgc29tZSBkcml2ZXJzIGRvIG5vdCBzdXBwb3J0IHRoZSBsYWJlbGluZy4KKworQSBwdWJsaWMgdmFyaWFibGUgaXMgYXZhaWxhYmxlIHRvIGFueSBvYmplY3QgZG93biB0aGUgaW5oZXJpdGFuY2UgdHJlZQorZnJvbSB0aGUgb2JqZWN0IGluIHdoaWNoIHRoZSB2YXJpYWJsZSBpcyBkZWNsYXJlZC4gIFB1YmxpYyB2YXJpYWJsZXMgaW4KK29iamVjdCBDIG1heSBiZSBhY2Nlc3NlZCBieSBib3RoIG9iamVjdHMgQSBhbmQgQi4gIFNpbWlsYXJseSwgcHVibGljCitmdW5jdGlvbnMgbWF5IGJlIGNhbGxlZCBieSBhbnkgb2JqZWN0IGRvd24gdGhlIGluaGVyaXRhbmNlIHRyZWUgZnJvbSB0aGUKK29iamVjdCBpbiB3aGljaCB0aGV5IGFyZSBkZWNsYXJlZC4gCisKK1RoZSBvcHBvc2l0ZSBvZiBwdWJsaWMgaXMgb2YgY291cnNlIHByaXZhdGUuICBBIHByaXZhdGUgdmFyaWFibGUgb3IKK2Z1bmN0aW9uIG1heSBvbmx5IGJlIHJlZmVyZW5jZWQgZnJvbSBpbnNpZGUgdGhlIG9iamVjdCB3aGljaCBkZWNsYXJlcyBpdC4gCitJZiBvYmplY3QgQSBvciBCIHRyaWVkIHRvIG1ha2UgYW55IHJlZmVyZW5jZSB0byBhbnkgb2YgdGhlIHZhcmlhYmxlcyBpbgorb2JqZWN0IEMsIGFuIGVycm9yIHdvdWxkIHJlc3VsdCwgc2luY2UgdGhlIHZhcmlhYmxlcyBhcmUgc2FpZCB0byBiZSBvdXQgb2YKK3Njb3BlLCBvciBub3QgYXZhaWxhYmxlIHRvIGluaGVyaXRpbmcgY2xhc3NlcyBkdWUgdG8gdGhlaXIgcHJpdmF0ZSBsYWJlbHMuIAorRnVuY3Rpb25zLCBob3dldmVyLCBwcm92aWRlIGEgdW5pcXVlIGNoYWxsZW5nZSB3aGljaCB2YXJpYWJsZXMgZG8gbm90LiAKK0V4dGVybmFsIG9iamVjdHMgaW4gTFBDIGhhdmUgdGhlIGFiaWxpdHkgdG8gY2FsbCBmdW5jdGlvbnMgaW4gb3RoZXIgb2JqZWN0cwordGhyb3VnaCBjYWxsIG90aGVycy4gIFRoZSBwcml2YXRlIGxhYmVsIGRvZXMgbm90IHByb3RlY3QgYWdhaW5zdCBjYWxsCitvdGhlcnMuCisKK1RvIHByb3RlY3QgYWdhaW5zdCBjYWxsIG90aGVycywgZnVuY3Rpb25zIHVzZSB0aGUgbGFiZWwgc3RhdGljLiAgQSBmdW5jdGlvbgord2hpY2ggaXMgc3RhdGljIG1heSBvbmx5IGJlIGNhbGxlZCBmcm9tIGluc2lkZSB0aGUgY29tcGxldGUgb2JqZWN0IG9yCitmcm9tIHRoZSBnYW1lIGRyaXZlci4gIEJ5IGNvbXBsZXRlIG9iamVjdCwgSSBtZWFuIG9iamVjdCBBIGNhbiBjYWxsCitzdGF0aWMgZnVuY3Rpb25zIGluIHRoZSBvYmplY3QgQyBpdCBpbmhlcml0cy4gIFRoZSBzdGF0aWMgb25seSBwcm90ZWN0cyBhZ2FpbnN0CitleHRlcm5hbCBjYWxsIG90aGVycy4gIEluIGFkZGl0aW9uLCB0aGlzX29iamVjdCgpLT5mb28oKSBpcyBjb25zaWRlcmVkIGFuCitpbnRlcm5hbCBjYWxsIGFzIGZhciBhcyB0aGUgc3RhdGljIGxhYmVsIGdvZXMuCisKK1NpbmNlIHZhcmlhYmxlcyBjYW5ub3QgYmUgcmVmZXJlbmNlZCBleHRlcm5hbGx5LCB0aGVyZSBpcyBubyBuZWVkIGZvciBhbgorZXF1aXZhbGVudCBsYWJlbCBmb3IgdGhlbS4gIFNvbWV3aGVyZSBhbG9uZyB0aGUgbGluZSwgc29tZW9uZSBkZWNpZGVkCit0byBtdWRkeSB1cCB0aGUgd2F0ZXJzIGFuZCB1c2UgdGhlIHN0YXRpYyBsYWJlbCB3aXRoIHZhcmlhYmxlcyB0byBoYXZlIGEKK2NvbXBsZXRlbHkgc2VwYXJhdGUgbWVhbmluZy4gIFdoYXQgaXMgZXZlbiBtb3JlIG1hZGRlbmluZyBpcyB0aGF0IHRoaXMKK2xhYmVsIGhhcyBub3RoaW5nIHRvIGRvIHdpdGggd2hhdCBpdCBtZWFucyBpbiB0aGUgQyBwcm9ncmFtbWluZworbGFuZ3VhZ2UuICBBIHN0YXRpYyB2YXJpYWJsZSBpcyBzaW1wbHkgYSB2YXJpYWJsZSB0aGF0IGRvZXMgbm90IGdldCBzYXZlZCB0bworZmlsZSB0aHJvdWdoIHRoZSBlZnVuIHNhdmVfb2JqZWN0KCkgYW5kIGRvZXMgbm90IGdldCByZXN0b3JlZCB0aHJvdWdoCityZXN0b3JlX29iamVjdCgpLiAgR28gZmlndXJlLgorCitJbiBnZW5lcmFsLCBpdCBpcyBnb29kIHByYWN0aWNlIHRvIGhhdmUgcHJpdmF0ZSB2YXJpYWJsZXMgd2l0aCBwdWJsaWMKK2Z1bmN0aW9ucywgdXNpbmcgcXVlcnlfKigpIGZ1bmN0aW9ucyB0byBhY2Nlc3MgdGhlIHZhbHVlcyBvZiBpbmhlcml0ZWQKK3ZhcmlhYmxlcywgYW5kIHNldF8qKCksIGFkZF8qKCksIGFuZCBvdGhlciBzdWNoIGZ1bmN0aW9ucyB0byBjaGFuZ2UKK3Rob3NlIHZhbHVlcy4gIEluIHJlYWxtIGNvZGluZyB0aGlzIGlzIG5vdCBzb21ldGhpbmcgb25lIHJlYWxseSBoYXMgdG8KK3dvcnJ5IGEgbG90IGFib3V0LiAgQXMgYSBtYXR0ZXIgb2YgZmFjdCwgaW4gcmVhbG0gY29kaW5nIHlvdSBkbyBub3QgaGF2ZQordG8ga25vdyBtdWNoIG9mIGFueXRoaW5nIHdoaWNoIGlzIGluIHRoaXMgY2hhcHRlci4gIFRvIGJlIGNvbWUgYSByZWFsbHkKK2dvb2QgcmVhbG0gY29kZXIsIGhvd2V2ZXIsIHlvdSBoYXZlIHRvIGJlIGFibGUgdG8gcmVhZCB0aGUgbXVkbGliCitjb2RlLiAgQW5kIG11ZGxpYiBjb2RlIGlzIGZ1bGwgb2YgdGhlc2UgbGFiZWxzLiAgU28geW91IHNob3VsZCB3b3JrCithcm91bmQgd2l0aCB0aGVzZSBsYWJlbHMgdW50aWwgeW91IGNhbiByZWFkIGNvZGUgYW5kIHVuZGVyc3RhbmQgd2h5IGl0CitpcyB3cml0dGVuIHRoYXQgd2F5IGFuZCB3aGF0IGl0IG1lYW5zIHRvIG9iamVjdHMgd2hpY2ggaW5oZXJpdCB0aGUgY29kZS4KKworVGhlIGZpbmFsIGxhYmVsIGlzIG5vbWFzaywgYW5kIGl0IGRlYWxzIHdpdGggYSBwcm9wZXJ0eSBvZiBpbmhlcml0YW5jZQord2hpY2ggYWxsb3dzIHlvdSB0byByZXdyaXRlIGZ1bmN0aW9ucyB3aGljaCBoYXZlIGFscmVhZHkgYmVlbiBkZWZpbmVkLiAKK0ZvciBleGFtcGxlLCB5b3UgY2FuIHNlZSBhYm92ZSB0aGF0IG9iamVjdCBBIHJld3JvdGUgdGhlIGZ1bmN0aW9uCitxdWVyeV9jYXBfbmFtZSgpLiAgQSByZXdyaXRlIG9mICBmdW5jdGlvbiBpcyBjYWxsZWQgb3ZlcnJpZGluZyB0aGUKK2Z1bmN0aW9uLiAgVGhlIG1vc3QgY29tbW9uIG92ZXJyaWRlIG9mIGEgZnVuY3Rpb24gd291bGQgYmUgaW4gYSBjYXNlCitsaWtlIHRoaXMsIHdoZXJlIGEgY29uZGl0aW9uIHBlY3VsaWFyIHRvIG91ciBvYmplY3QgKG9iamVjdCBBKSBuZWVkcyB0bworaGFwcGVuIG9uIGEgY2FsbCBvdCB0aGUgZnVuY3Rpb24gdW5kZXIgY2VydGFpbiBjaXJjdW1zdGFuY2VzLiAgUHV0dGluZyB0ZXN0Citjb2RlIGludG8gb2JqZWN0IEMganVzdCBzbyBvYmplY3QgQSBjYW4gYmUgYSBnaG9zdCBpcyBwbGFpbiBzaWxseS4gIFNvCitpbnN0ZWFkLCB3ZSBvdmVycmlkZSBxdWVyeV9jYXBfbmFtZSgpIGluIG9iamVjdCBBLCB0ZXN0aW5nIHRvIHNlZSBpZiB0aGUKK29iamVjdCBpcyBhIGdob3N0LiAgSWYgc28sIHdlIGNoYW5nZSB3aGF0IGhhcHBlbnMgd2hlbiBhbm90aGVyIG9iamVjdAorcXVlcmllcyBmb3IgdGhlIGNhcCBuYW1lLiAgSWYgaXQgaXMgbm90IGEgZ2hvc3QsIHRoZW4gd2Ugd2FudCB0aGUgcmVndWxhcgorb2JqZWN0IGJlaGF2aW91ciB0byBoYXBwZW4uICBXZSB0aGVyZWZvcmUgdXNlIHRoZSBzY29wZSByZXNvbHV0aW9uCitvcGVyYXRvciAoOjopIHRvIGNhbGwgdGhlIGluaGVyaXRlZCB2ZXJzaW9uIG9mIHRoZSBxdWVyeV9jYXBfbmFtZSgpCitmdW5jdGlvbiBhbmQgcmV0dXJuIGl0cyB2YWx1ZS4KKworQSBub21hc2sgZnVuY3Rpb24gaXMgb25lIHdoaWNoIGNhbm5vdCBiZSBvdmVycmlkZGVuIGVpdGhlciB0aHJvdWdoCitpbmhlcml0YW5jZSBvciB0aHJvdWdoIHNoYWRvd2luZy4gIFNoYWRvd2luZyBpcyBhIHNvcnQgb2YgYmFja3dhcmRzCitpbmhlcml0YW5jZSB3aGljaCB3aWxsIGJlIGRldGFpbGVkIGluIHRoZSBhZHZhbmNlZCBMUEMgdGV4dGJvb2suICBJbiB0aGUKK2V4YW1wbGUgYWJvdmUsIG5laXRoZXIgb2JqZWN0IEEgbm9yIG9iamVjdCBCIChub3IgYW55IG90aGVyIG9iamVjdCBmb3IKK3RoYXQgbWF0dGVyKSBjYW4gb3ZlcnJpZGUgcXVlcnlfbmFtZSgpLiAgU2luY2Ugd2Ugd2FudCB0byB1c2UKK3F1ZXJ5X25hbWUoKSBhcyBhIHVuaXF1ZSBpZGVudGlmaWVyIG9mIG9iamVjdHMsIHdlIGRvbid0IHdhbnQgcGVvcGxlCitmYWtpbmcgdXMgdGhyb3VnaCBzaGFkb3dpbmcgb3IgaW5oZXJpdGFuY2UuICBUaGUgZnVuY3Rpb24gdGhlcmVmb3JlIGdldHMKK3RoZSBub21hc2sgbGFiZWwuCisKKzYuNSBTdW1tYXJ5CitUaHJvdWdoIGluaGVyaXRhbmNlLCBhIGNvZGVyIG1heSBtYWtlIHVzZXIgb2YgZnVuY3Rpb25zIGRlZmluZWQgaW4KK290aGVyIG9iamVjdHMgaW4gb3JkZXIgdG8gcmVkdWNlIHRoZSB0ZWRpdW0gb2YgcHJvZHVjaW5nIG1hc3NlcyBvZgorc2ltaWxhciBvYmplY3RzIGFuZCB0byBpbmNyZWFzZSB0aGUgY29uc2lzdGVuY3kgb2Ygb2JqZWN0IGJlaGF2aW91ciBhY3Jvc3MKK211ZGxpYiBvYmplY3RzLiAgTFBDIGluaGVyaXRhbmNlIGFsbG93cyBvYmplY3RzIG1heGltdW0gcHJpdmVsZWRnZXMgaW4KK2RlZmluaW5nIGhvdyB0aGVpciBkYXRhIGNhbiBiZSBhY2Nlc3NlZCBieSBleHRlcm5hbCBvYmplY3RzIGFzIHdlbGwgYXMKK29iamVjdHMgaW5oZXJpdGluZyB0aGVtLiAgVGhpcyBkYXRhIHNlY3VyaXR5IGlzIG1haW50YWluZWQgdGhyb3VnaCB0aGUKK2tleXdvcmRzLCBub21hc2ssIHByaXZhdGUsIGFuZCBzdGF0aWMuCisKK0luIGFkZGl0aW9uLCBhIGNvZGVyIGlzIGFibGUgdG8gY2hhbmdlIHRoZSBmdW5jdGlvbmFsaXR5IG9mIG5vbi1wcm90ZWN0ZWQKK2Z1bmN0aW9ucyBieSBvdmVycmlkaW5nIHRoZW0uICBFdmVuIGluIHRoZSBwcm9jZXNzIG9mIG92ZXJyaWRpbmcgYQorZnVuY3Rpb24sIGhvd2V2ZXIsIGFuIG9iamVjdCBtYXkgYWNjZXNzIHRoZSBvcmlnaW5hbCBmdW5jdGlvbiB0aHJvdWdoCit0aGUgc2NvcGUgcmVzb2x1dGlvbiBvcGVyYXRvci4KKworQ29weXJpZ2h0IChjKSBHZW9yZ2UgUmVlc2UgMTk5MwpkaWZmIC0tZ2l0IGEvZG9jL0tVUlMvTFBDLUtVUlMyL2NoYXB0ZXI3IGIvZG9jL0tVUlMvTFBDLUtVUlMyL2NoYXB0ZXI3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhOGNjMGUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvS1VSUy9MUEMtS1VSUzIvY2hhcHRlcjcKQEAgLTAsMCArMSwyOTggQEAKK0ludGVybWVkaWF0ZSBMUEMKK0Rlc2NhcnRlcyBvZiBCb3JnCitOb3ZlbWJlciAxOTkzCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFwdGVyIDc6IERlYnVnZ2luZworCis3LjEgVHlwZXMgb2YgRXJyb3JzCitCeSBub3csIHlvdSBoYXZlIGxpa2VseSBydW4gaW50byBlcnJvcnMgaGVyZSwgdGhlcmUsIGFuZCBldmVyeXdoZXJlLiAgSW4KK2dlbmVyYWwsIHRoZXJlIGFyZSB0aHJlZSBzb3J0cyBvZiBlcnJvcnMgeW91IG1pZ2h0IHNlZTogY29tcGlsZSB0aW1lCitlcnJvcnMsIHJ1biB0aW1lIGVycm9ycywgYW5kIG1hbGZ1bmN0aW9uaW5nIGNvZGUuICBPbiBtb3N0IG11ZHMgeW91Cit3aWxsIGZpbmQgYSBwZXJzb25hbCBmaWxlIHdoZXJlIHlvdXIgY29tcGlsZSB0aW1lIGVycm9ycyBhcmUgbG9nZ2VkLiAgRm9yCit0aGUgbW9zdCBwYXJ0LCB0aGlzIGZpbGUgY2FuIGJlIGZvdW5kIGVpdGhlciBpbiB5b3VyIGhvbWUgZGlyZWN0b3J5IGFzIHRoZQorZmlsZSBuYW1lZCAibG9nIiBvciAiLmxvZyIsIG9yIHNvbWV3aGVyZSBpbiB0aGUgZGlyZWN0b3J5ICIvbG9nIiBhcyBhIGZpbGUKK3dpdGggeW91ciBuYW1lLi4gIEluIGFkZGl0aW9uLCBtdWRzIHRlbmQgdG8ga2VlcCBhIGxvZyBvZiBydW4gdGltZSBlcnJvcnMKK3doaWNoIG9jY3VyIHdoaWxlIHRoZSBtdWQgaXMgdXAuICBBZ2FpbiwgdGhpcyBpcyBnZW5lcmFsbHkgZm91bmQgaW4KKyIvbG9nIi4gIE9uIE11ZE9TIG11ZHMgaXQgaXMgY2FsbGVkICJkZWJ1Zy5sb2ciLiAgT24gb3RoZXIgbXVkcyBpdCBtYXkKK2JlIGNhbGxlZCBzb21ldGhpbmcgZGlmZmVyZW50IGxpa2UgImxwbXVkLmxvZyIuICBBc2sgeW91ciBhZG1pbmlzdHJhdG9ycword2hlcmUgY29tcGlsZSB0aW1lIGFuZCBydW4gdGltZSBlcnJvcnMgYXJlIGVhY2ggbG9nZ2VkIGlmIHlvdSBkbyBub3QKK2FscmVhZHkga25vdy4KKworQ29tcGlsZSB0aW1lIGVycm9ycyBhcmUgZXJyb3JzIHdoaWNoIG9jY3VyIHdoZW4gdGhlIGRyaXZlciB0cmllcyB0byBsb2FkCithbiBvYmplY3QgaW50byBtZW1vcnkuICBJZiwgd2hlbiB0aGUgZHJpdmVyIGlzIHRyeWluZyB0byBsb2FkIGFuIG9iamVjdAoraW50byBtZW1vcnksIGl0IGVuY291bnRlcnMgdGhpbmdzIHdoaWNoIGl0IHNpbXBseSBkb2VzIG5vdCB1bmRlcnN0YW5kCit3aXRoIHJlc3BlY3QgdG8gd2hhdCB5b3Ugd3JvdGUsIGl0IHdpbGwgZmFpbCB0byBsb2FkIGl0IGludG8gbWVtb3J5IGFuZCBsb2cKK3doeSBpdCBjb3VsZCBub3QgbG9hZCB0aGUgb2JqZWN0IGludG8geW91ciBwZXJzb25hbCBlcnJvciBsb2cuICBUaGUgbW9zdAorY29tbW9uIGNvbXBpbGUgdGltZSBlcnJvcnMgYXJlIHR5cG9zLCBtaXNzaW5nIG9yIGV4dHJhICgpLCB7fS4gW10sIG9yICIiLAorYW5kIGZhaWx1cmUgdG8gZGVjbGFyZSBwcm9wZXJseSBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcyB1c2VkIGJ5IHRoZQorb2JqZWN0LgorCitSdW4gdGltZSBlcnJvcnMgb2NjdXIgd2hlbiBzb21ldGhpbmcgd3JvbmcgaGFwcGVucyB0byBhbiBvYmplY3QgaW4KK21lbW9yeSB3aGlsZSBpdCBpcyBleGVjdXRpbmcgYSBzdGF0ZW1lbnQuICBGb3IgZXhhbXBsZSwgdGhlIGRyaXZlcgorY2Fubm90IHRlbGwgd2hldGhlciB0aGUgc3RhdGVtZW50ICJ4L3kiIHdpbGwgYmUgdmFsaWQgaW4gYWxsIGNpcmN1bXN0YW5jZXMuIAorSW4gZmFjdCwgaXQgaXMgYSB2YWxpZCBMUEMgZXhwcmVzc2lvbi4gIFlldCwgaWYgdGhlIHZhbHVlIG9mIHkgaXMgMCwgdGhlbiBhCitydW4gdGltZSBlcnJvciB3aWxsIG9jY3VyIHNpbmNlIHlvdSBjYW5ub3QgZGl2aWRlIGJ5IDAuICBXaGVuIHRoZSBkcml2ZXIKK3J1bnMgYWNyb3NzIGFuIGVycm9yIGR1cmluZyB0aGUgZXhlY3V0aW9uIG9mIGEgZnVuY3Rpb24sIGl0IGFib3J0cworZXhlY3V0aW9uIG9mIHRoZSBmdW5jdGlvbiBhbmQgbG9ncyBhbiBlcnJvciB0byB0aGUgZ2FtZSdzIHJ1biB0aW1lIGVycm9yCitsb2cuICBJdCB3aWxsIGFsc28gc2hvdyB0aGUgZXJyb3IgdG8gdGhpc19wbGF5ZXIoKSwgaWYgZGVmaW5lZCwgaWYgdGhlIHBsYXllcgoraXMgYSBjcmVhdG9yLCBvciBpdCB3aWxsIHNob3cgIldoYXQ/IiB0byBwbGF5ZXJzLiAgTW9zdCBjb21tb24gY2F1c2VzCitmb3IgcnVuIHRpbWUgZXJyb3JzIGFyZSBiYWQgdmFsdWVzIGFuZCB0cnlpbmcgdG8gcGVyZm9ybSBvcGVyYXRpb25zIHdpdGgKK2RhdGEgdHlwZXMgZm9yIHdoaWNoIHRob3NlIG9wZXJhdGlvbnMgYXJlIG5vdCBkZWZpbmVkLgorCitUaGUgbW9zdCBpbnNpZGVvdXMgdHlwZSBvZiBlcnJvciwgaG93ZXZlciwgaXMgcGxhaW4gbWFsZnVuY3Rpb25pbmcKK2NvZGUuICBUaGVzZSBlcnJvcnMgZG8gbm90IGxvZywgc2luY2UgdGhlIGRyaXZlciBuZXZlciByZWFsbHkgcmVhbGl6ZXMgdGhhdAorYW55dGhpbmcgaXMgd3JvbmcuICBJbiBzaG9ydCwgdGhpcyBlcnJvciBoYXBwZW5zIHdoZW4geW91IHRoaW5rIHRoZSBjb2RlCitzYXlzIG9uZSB0aGluZywgYnV0IGluIGZhY3QgaXQgc2F5cyBhbm90aGVyIHRoaW5nLiAgUGVvcGxlIHRvbyBvZnRlbgorZW5jb3VudGVyIHRoaXMgYnVnIGFuZCBhdXRvbWF0aWNhbGx5IGluc2lzdCB0aGF0IGl0IG11c3QgYmUgYSBtdWRsaWIgb3IKK2RyaXZlciBidWcuICBFdmVyeW9uZSBtYWtlcyBhbGwgdHlwZXMgb2YgZXJyb3JzIHRob3VnaCwgYW5kIG1vcmUgb2Z0ZW4KK3RoYW4gbm90IHdoZW4gY29kZSBpcyBub3QgZnVuY3Rpb25pbmcgdGhlIHdheSB5b3Ugc2hvdWxkLCBpdCB3aWxsIGJlCitiZWNhdXNlIHlvdSBtaXNyZWFkIGl0LiAgCisKKzcuMiBEZWJ1Z2dpbmcgQ29tcGlsZSBUaW1lIEVycm9ycworQ29tcGlsZSB0aW1lIGVycm9ycyBhcmUgY2VydGFpbmx5IHRoZSBtb3N0IGNvbW1vbiBhbmQgc2ltcGxlc3QgYnVncyB0bworZGVidWcuICBOZXcgY29kZXJzIG9mdGVuIGdldCBmcnVzdHJhdGVkIGJ5IHRoZW0gZHVlIHRvIHRoZSBvYnNjdXJlCituYXR1cmUgb2Ygc29tZSBlcnJvciBtZXNzYWdlcy4gIE5ldmVydGhlbGVzcywgb25jZSBhIHBlcnNvbiBiZWNvbWVzCit1c2VkIHRvIHRoZSBlcnJvciBtZXNzYWdlcyBnZW5lcmF0ZWQgYnkgdGhlaXIgZHJpdmVyLCBkZWJ1Z2dpbmcgY29tcGlsZQordGltZSBlcnJvcnMgYmVjb21lcyB1dHRlcmx5IHJvdXRpbmUuCisKK0luIHlvdXIgZXJyb3IgbG9nLCB0aGUgZHJpdmVyIHdpbGwgdGVsbCB5b3UgdGhlIHR5cGUgb2YgZXJyb3IgYW5kIG9uIHdoaWNoCitsaW5lIGl0IGZpbmFsbHkgbm90aWNlZCB0aGVyZSB3YXMgYW4gZXJyb3IuICBOb3RlIHRoYXQgdGhpcyBpcyBub3Qgb24gd2hpY2gKK2xpbmUgdGhlIGFjdHVhbCBlcnJvciBuZWNlc3NhcmlseSBleGlzdHMuICBUaGUgbW9zdCBjb21tb24gY29tcGlsZSB0aW1lCitlcnJvciwgYmVzaWRlcyB0aGUgdHlwbywgaXMgdGhlIG1pc3Npbmcgb3Igc3VwZXJmbHVvdXMgcGFyZW50aGVzZXMsCiticmFja2V0cywgYnJhY2VzLCBvciBxdW90ZXMuICBZZXQgdGhpcyBlcnJvciBpcyB0aGUgb25lIHRoYXQgbW9zdCBiYWZmbGVzCituZXcgY29kZXJzLCBzaW5jZSB0aGUgZHJpdmVyIHdpbGwgbm90IG5vdGljZSB0aGUgbWlzc2luZyBvciBleHRyYSBwaWVjZQordW50aWwgd2VsbCBhZnRlciB0aGUgb3JpZ2luYWwuICBUYWtlIGZvciBleGFtcGxlIHRoZSBmb2xsb3dpbmcgY29kZToKKworMSBpbnQgdGVzdChzdHJpbmcgc3RyKSB7CisyICAgIGludCB4OworMyAgICBmb3IoeCA9MDsgeDwxMDsgeCsrKQorNCAgICAgICAgd3JpdGUoeCsiXG4iKTsKKzUgICAgfQorNiAgICB3cml0ZSgiRG9uZS5cbiIpOworNyB9CisKK0RlcGVuZGluZyBvbiB3aGF0IHlvdSBpbnRlbmRlZCwgdGhlIGFjdHVhbCBlcnJvciBoZXJlIGlzIGVpdGhlciBhdCBsaW5lIDMKKyhtZWFuaW5nIHlvdSBhcmUgbWlzc2luZyBhIHspIG9yIGF0IGxpbmUgNSAobWVhaW5nIHlvdSBoYXZlIGFuIGV4dHJhIH0pLiAKK05ldmVydGhlbGVzcywgdGhlIGRyaXZlciB3aWxsIHJlcG9ydCB0aGF0IGl0IGZvdW5kIGFuIGVycm9yIHdoZW4gaXQgZ2V0cyB0bworbGluZSA2LiAgVGhlIGFjdHVhbCBkcml2ZXIgbWVzc2FnZSBtYXkgdmFyeSBmcm9tIGRyaXZlciB0byBkcml2ZXIsIGJ1dCBubworbWF0dGVyIHdoaWNoIGRyaXZlciwgeW91IHdpbGwgc2VlIGFuIGVycm9yIG9uIGxpbmUgNiwgc2luY2UgdGhlIH0gaW4gbGluZSA1CitpcyBpbnRlcnByZXRlZCBhcyBlbmRpbmcgdGhlIGZ1bmN0aW9uIHRlc3QoKS4gIEF0IGxpbmUgNiwgdGhlIGRyaXZlciBzZWVzIHRoYXQKK3lvdSBoYXZlIGEgd3JpdGUoKSBzaXR0aW5nIG91dHNpZGUgYW55IGZ1bmN0aW9uIGRlZmluaXRpb24sIGFuZCB0aHVzCityZXBvcnRzIGFuIGVycm9yLiAgR2VuZXJhbGx5LCB0aGUgZHJpdmVyIHdpbGwgYWxzbyBnbyBvbiB0byByZXBvcnQgdGhhdCBpdAorZm91bmQgYW4gZXJyb3IgYXQgbGluZSA3IGluIHRoZSBmb3JtIG9mIGFuIGV4dHJhIH0uCisKK1RoZSBzZWNyZXQgdG8gZGVidWdnaW5nIHRoZXNlIGlzIGNvZGluZyBzdHlsZS4gIEhhdmluZyBjbG9zaW5nIH0gbWF0Y2gKK3VwIHZlcnRpY2FsbHkgd2l0aCB0aGUgY2xhdXNlcyB0aGV5IGNsb3NlIG91dCBoZWxwcyB5b3Ugc2VlIHdoZXJlIHlvdSBhcmUKK21pc3NpbmcgdGhlbSB3aGVuIHlvdSBhcmUgZGVidWdnaW5nIGNvZGUuICBTaW1pbGFybHksIHdoZW4gdXNpbmcKK211bHRpcGxlIHNldHMgb2YgcGFyZW50aGVzZXMsIHNwYWNlIG91dCBkaWZmZXJlbnQgZ3JvdXBzIGxpa2UgdGhpczoKKyAgICBpZiggKHg9c2l6ZW9mKHdobz11c2VycygpKSA+ICggKHkreikvKGEtYikgKyAoLShyYW5kb20oNykpKSApICkgCitBcyB5b3UgY2FuIHNlZSwgdGhlIHBhcmVudGhlc2VzIGZvciB0aGUgZm9yKCkgc3RhdGVtZW50LCBhcmUgc3BhY2VkIG91dAorZnJvbSB0aGUgcmVzdCBvZiB0aGUgc3RhdGVtZW50LiAgSW4gYWRkaXRpb24sIGluZGl2aWR1YWwgc3ViLWdyb3VwcyBhcmUKK3NwYWNlZCBzbyB0aGV5IGNhbiBlYXNpbHkgYmUgc29ydGVkIG91dCBpbiB0aGUgZXZlbnQgb2YgYW4gZXJyb3IuCisKK09uY2UgeW91IGhhdmUgYSBjb2Rpbmcgc3R5bGUgd2hpY2ggYWlkcyBpbiBwaWNraW5nIHRoZXNlIG91dCwgeW91IGxlYXJuCit3aGljaCBlcnJvciBtZXNzYWdlcyB0ZW5kIHRvIGluZGljYXRlIHRoaXMgc29ydCBvZiBlcnJvci4gIFdoZW4KK2RlYnVnZ2luZyB0aGlzIHNvcnQgb2YgZXJyb3IsIHlvdSB0aGVuIHZpZXcgYSBzZWN0aW9uIG9mIGNvZGUgYmVmb3JlIGFuZAorYWZ0ZXIgdGhlIGxpbmUgaW4gcXVlc3Rpb24uICBJbiBtb3N0IGFsbCBjYXNlcywgeW91IHdpbGwgY2F0Y2ggdGhlIGJ1ZyByaWdodAorb2ZmLgorCitBbm90aGVyIGNvbW1vbiBjb21waWxlIHRpbWUgZXJyb3IgaXMgd2hlcmUgdGhlIGRyaXZlciByZXBvcnRzIGFuCit1bmtub3duIGlkZW50aWZpZXIuICBHZW5lcmFsbHksIHR5cG9zIGFuZCBmYWlsdXJlIHRvIGRlY2xhcmUgdmFyaWFibGVzCitjYXVzZXMgdGhpcyBzb3J0IG9mIGVycm9yLiAgRm9ydHVuYXRlbHksIHRoZSBlcnJvciBsb2cgd2lsbCBhbG1vc3QgYWx3YXlzCit0ZWxsIHlvdSBleGFjdGx5IHdoZXJlIHRoZSBlcnJvciBpcy4gIFNvIHdoZW4gZGVidWdnaW5nIGl0LCBlbnRlciB0aGUKK2VkaXRvciBhbmQgZmluZCB0aGUgbGluZSBpbiBxdWVzdGlvbi4gIElmIHRoZSBwcm9ibGVtIGlzIHdpdGggYSB2YXJpYWJsZSBhbmQKK2lzIG5vdCBhIHR5cG8sIG1ha2Ugc3VyZSB5b3UgZGVjbGFyZWQgaXQgcHJvcGVybHkuICBPbiB0aGUgb3RoZXIgaGFuZCwgaWYKK2l0IGlzIGEgdHlwbywgc2ltcGx5IGZpeCBpdCEKKworT25lIHRoaW5nIHRvIGJld2FyZSBvZiwgaG93ZXZlciwgaXMgdGhhdCB0aGlzIGVycm9yIHdpbGwgc29tZXRpbWVzIGJlCityZXBvcnRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGEgbWlzc2luZyBwYXJlbnRoZXNlcywgYnJhY2tldHMsIG9yIGJyYWNlcwordHlwZSBlcnJvci4gIEluIHRoZXNlIHNpdHVhdGlvbnMsIHlvdXIgcHJvYmxlbSB3aXRoIGFuIHVua25vd24gaWRlbnRpZmllcgoraXMgb2Z0ZW4gYm9ndXMuICBUaGUgZHJpdmVyIG1pc3JlYWRzIHRoZSB3YXkgdGhlIHt9IG9yIHdoYXRldmVyIGFyZQorc2V0dXAsIGFuZCB0aHVzIGdldHMgdmFyaWFibGUgZGVjbGFyYXRpb25zIGNvbmZ1c2VkLiAgVGhlcmVmb3JlIG1ha2UKK3N1cmUgYWxsIG90aGVyIGNvbXBpbGUgdGltZSBlcnJvcnMgYXJlIGNvcnJlY3RlZCBiZWZvcmUgYm90aGVyaW5nIHdpdGgKK3RoZXNlIHR5cGVzIG9mIGVycm9ycy4KKworSW4gdGhlIHNhbWUgY2xhc3Mgd2l0aCB0aGUgYWJvdmUgZXJyb3IsIGlzIHRoZSBnZW5lcmFsIHN5bnRheCBlcnJvci4gIFRoZQorZHJpdmVyIGdlbmVyYXRlcyB0aGlzIGVycm9yIHdoZW4gaXQgc2ltcGx5IGZhaWxzIHRvIHVuZGVyc3RhbmQgd2hhdCB5b3UKK3NhaWQuICBBZ2FpbiwgdGhpcyBpcyBvZnRlbiBjYXVzZWQgYnkgdHlwb3MsIGJ1dCBjYW4gYWxzbyBiZSBjYXVzZWQgYnkgbm90Citwcm9wZXJseSB1bmRlcnN0YW5kaW5nIHRoZSBzeW50YXggb2YgYSBjZXJ0YWluIGZlYXR1cmUgbGlrZSB3cml0aW5nIGEgZm9yKCkKK3N0YXRlbWVudDogZm9yKHg9MCwgeDwxMCwgeCsrKS4gIElmIHlvdSBnZXQgYW4gZXJyb3IgbGlrZSB0aGlzIHdoaWNoIGlzCitub3QgYSBzeW50YXggZXJyb3IsIHRyeSByZXZpZXdpbmcgdGhlIHN5bnRheCBvZiB0aGUgc3RhdGVtZW50IGluIHdoaWNoIHRoZQorZXJyb3IgaXMgb2NjdXJyaW5nLgorCis3LjMgRGVidWdnaW5nIFJ1biBUaW1lIEVycm9ycworUnVuIHRpbWUgZXJyb3JzIGFyZSBtdWNoIG1vcmUgY29tcGxleCB0aGFuIHRoZWlyIGNvbXBpbGUgdGltZQorY291bnRlcnBhcnRzLiAgRm9ydHVuYXRlbHkgdGhlc2UgZXJyb3JzIGRvIGdldCBsb2dnZWQsIHRob3VnaCBtYW55CitjcmVhdG9ycyBkbyBub3QgcmVhbGlzZSBvciB0aGV5IGRvIG5vdCBrbm93IHdoZXJlIHRvIGxvb2suICBUaGUgZXJyb3IgbG9nCitmb3IgcnVuIHRpbWUgZXJyb3JzIGFyZSBhbHNvIGdlbmVyYWxseSBtdWNoIG1vcmUgZGV0YWlsZWQgdGhhbiBjb21waWxlCit0aW1lIGVycm9ycywgbWVhbmluZyB0aGF0IHlvdSBjYW4gdHJhY2UgdGhlIGhpc3Rvcnkgb2YgdGhlIGV4ZWN1dGlvbiB0cmFpbgorZnJvbSB3aGVyZSBpdCBzdGFydGVkIHRvIHdoZXJlIGl0IHdlbnQgd3JvbmcuICBZb3UgdGhlcmVmb3JlIGNhbiBzZXR1cAorZGVidWdnaW5nIHRyYXBzIHVzaW5nIHByZWNvbXBpbGVyIHN0YXRlbWVudHMgbXVjaCBlYXNpZXIgdXNpbmcgdGhlc2UKK2xvZ3MuICBSdW4gdGltZSBlcnJvcnMsIGhvd2V2ZXIsIHRlbmQgdG8gcmVzdWx0IGZyb20gdXNpbmcgbW9yZQorY29tcGxleCBjb2RpZ24gdGVjaG5pcXVlcyB0aGFuIGJlZ2lubmVycyB0ZW5kIHRvIHVzZSwgd2hpY2ggbWVhbnMgeW91CithcmUgbGVmdCB3aXRoIGVycm9ycyB3aGljaCBhcmUgZ2VuZXJhbGx5IG1vcmUgY29tcGxpY2F0ZWQgdGhhbiBzaW1wbGUKK2NvbXBpbGUgdGltZSBlcnJvcnMuCisKK1J1biB0aW1lIGVycm9ycyBhbG1vc3QgYWx3YXlzIHJlc3VsdCBmcm9tIG1pc3VzaW5nIExQQyBkYXRhIHR5cGVzLiAKK01vc3QgY29tbW9ubHksIHRyeWluZyB0byBkbyBjYWxsIG90aGVycyB1c2luZyBvYmplY3QgdmFyaWFibGVzIHdoaWNoIGFyZQorTlVMTCwgaW5kZXhpbmcgb24gbWFwcGluZywgYXJyYXksIG9yIHN0cmluZyB2YXJpYWJsZXMgd2hpY2ggYXJlCitOVUxMLCBvciBwYXNzaW5nIGJhZCBhcmd1bWVudHMgdG8gZnVuY3Rpb25zLiAgV2Ugd2lsbCBsb29rIGF0IGEgcmVhbAorcnVuIHRpbWUgZXJyb3IgbG9nIGZyb20gTmlnaHRtYXJlOgorCitCYWQgYXJndW1lbnQgMSB0byBleHBsb2RlKCkKK3Byb2dyYW06IGJpbi9zeXN0ZW0vX2dyZXAuYywgb2JqZWN0OiBiaW4vc3lzdGVtL19ncmVwCitsaW5lIDMyCisnICAgICAgIGNtZF9ob29rJyBpbiAnICAgICAgICBzdGQvbGl2aW5nLmMnICgnICAgICAgCitzdGQvdXNlciM0MDAyJylsaW5lIDgzCisnICAgICAgIGNtZF9ncmVwJyBpbiAnICBiaW4vc3lzdGVtL19ncmVwLmMnICgnICAgCitiaW4vc3lzdGVtL19ncmVwJylsaW5lIDMyICAgICAKK0JhZCBhcmd1bWVudCAyIHRvIG1lc3NhZ2UoKQorcHJvZ3JhbTogYWRtL29iai9zaW11bF9lZnVuLmMsIG9iamVjdDogYWRtL29iai9zaW11bF9lZnVuCitsaW5lIDM0CisnICAgICAgIGNtZF9ob29rJyBpbiAnICAgICAgICBzdGQvbGl2aW5nLmMnICgnICAgICAgCitzdGQvdXNlciM0OTU3JylsaW5lIDgzCisnICAgICAgIGNtZF9sb29rJyBpbiAnICBiaW4vbW9ydGFsL19sb29rLmMnICgnICAgCitiaW4vbW9ydGFsL19sb29rJylsaW5lIDIzCisnIGV4YW1pbmVfb2JqZWN0JyBpbiAnICBiaW4vbW9ydGFsL19sb29rLmMnICgnICAgCitiaW4vbW9ydGFsL19sb29rJylsaW5lIDc4CisnICAgICAgICAgIHdyaXRlJyBpbiAnYWRtL29iai9zaW11bF9lZnVuLmMnICgnIAorYWRtL29iai9zaW11bF9lZnVuJylsaW5lIDM0CitCYWQgYXJndW1lbnQgMSB0byBjYWxsX290aGVyKCkKK3Byb2dyYW06IGJpbi9zeXN0ZW0vX2Nsb25lLmMsIG9iamVjdDogYmluL3N5c3RlbS9fY2xvbmUKK2xpbmUgMjUKKycgICAgICAgY21kX2hvb2snIGluICcgICAgICAgIHN0ZC9saXZpbmcuYycgKCcgICAgICAKK3N0ZC91c2VyIzM3MzQnKWxpbmUgODMKKycgICAgICBjbWRfY2xvbmUnIGluICcgYmluL3N5c3RlbS9fY2xvbmUuYycgKCcgIAorYmluL3N5c3RlbS9fY2xvbmUnKWxpbmUgMjUKK0lsbGVnYWwgaW5kZXgKK3Byb2dyYW06IHN0ZC9tb25zdGVyLmMsIG9iamVjdDoKK3dpemFyZHMvemFrbmFpZmVuL3NweSM3MjA1IGxpbmUgNzYKKycgICAgIGhlYXJ0X2JlYXQnIGluICcgICAgICAgc3RkL21vbnN0ZXIuYycKKygnd2l6YXJkcy96YWtuYWlmZW4vc3B5IzcyMDUnKWxpbmUKKzc2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCitBbGwgb2YgdGhlIGVycm9ycywgZXhjZXB0IHRoZSBsYXN0IG9uZSwgaW52b2x2ZSBwYXNzaW5nIGEgYmFkIGFyZ3VtZW50IHRvIGEKK2Z1bmN0aW9uLiAgVGhlIGZpcnN0IGJ1ZywgaW52b2x2ZXMgcGFzc2luZyBhIGJhZCBmaXJzdCBhcnVtZW50IHRvIHRoZSBlZnVuCitleHBsb2RlKCkuICBUaGlzIGVmdW4gZXhwZWN0cyBhIHN0cmluZyBhcyBpdHMgZmlyc3QgYXJnbWVudC4gIEluIGRlYnVnZ2luZwordGhlc2Uga2luZHMgb2YgZXJyb3JzLCB3ZSB3b3VsZCB0aGVyZWZvcmUgZ28gdG8gbGluZSAzMiBpbgorL2Jpbi9zeXN0ZW0vX2dyZXAuYyBhbmQgY2hlY2sgdG8gc2VlIHdoYXQgdGhlIGRhdGEgdHlwZSBvZiB0aGUgZmlyc3QKK2FyZ3VtZW50IGJlaW5nIHBhc3NlZCBpbiBmYWN0IGlzLiAgSW4gdGhpcyBwYXJ0aWN1bGFyIGNhc2UsIHRoZSB2YWx1ZSBiZWluZworcGFzc2VkIHNob3VsZCBiZSBhIHN0cmluZy4KKworSWYgZm9yIHNvbWUgcmVhc29uIEkgaGFzIGFjdHVhbGx5IHBhc3NlZCBzb21ldGhpbmcgZWxzZSwgSSB3b3VsZCBiZSBkb25lCitkZWJ1Z2dpbmcgYXQgdGhhdCBwb2ludCBhbmQgZml4IGl0IHNpbXBseSBieSBtYWtpbmcgc3VyZSB0aGF0IEkgd2FzCitwYXNzaW5nIGEgc3RyaW5nLiAgVGhpcyBzaXR1YXRpb24gaXMgbW9yZSBjb21wbGV4LiAgSSBub3cgbmVlZCB0byB0cmFjZQordGhlIGFjdHVhbCB2YWx1ZXMgY29udGFpbmVkIGJ5IHRoZSB2YXJpYWJsZSBiZWluZyBwYXNzZWQgdG8gZXhwbG9kZSwgc28KK3RoYXQgSSBjYW4gc2VlIHdoYXQgaXQgaXMgdGhlIGV4cGxvZGUoKSBlZnVuIHNlZXMgdGhhdCBpdCBpcyBiZWluZyBwYXNzZWQuCisKK1RoZSBsaW5lIGlzIHF1ZXN0aW9uIGlzIHRoaXM6CisgYm9yZ1tmaWxlc1tpXV0gPSByZWdleHAoZXhwbG9kZShyZWFkX2ZpbGUoZmlsZXNbaV0pLCAiXG4iKSwgZXhwKTsKK3doZXJlIGZpbGVzIGlzIGFuIGFycmF5IGZvciBzdHJpbmdzLCBpIGlzIGFuIGludGVnZXIsIGFuZCBib3JnIGlzIGEgbWFwcGluZy4gCitTbyBjbGVhcmx5IHdlIG5lZWQgdG8gZmluZCBvdXQgd2hhdCB0aGUgdmFsdWUgb2YgcmVhZF9maWxlKGZpbGVzW2ldKSBpcy4gCitXZWxsLCB0aGlzIGVmdW4gcmV0dXJucyBhIHN0cmluZyB1bmxlc3MgdGhlIGZpbGUgaW4gcXVlc3Rpb24gZG9lcyBub3QgZXhpc3QsCit0aGUgb2JqZWN0IGluIHF1ZXN0aW9uIGRvZXMgbm90IGhhdmUgcmVhZCBhY2Nlc3MgdG8gdGhlIGZpbGUgaW4gcXVlc3Rpb24sIG9yCit0aGUgZmlsZSBpbiBxdWVzdGlvbiBpcyBhbiBlbXB0eSBmaWxlLCBpbiB3aGljaCBjYXNlcyB0aGUgZnVuY3Rpb24gd2lsbAorcmV0dXJuIE5VTEwuICBDbGVhcmx5LCBvdXIgcHJvYmxlbSBpcyB0aGF0IG9uZSBvZiB0aGVzZSBldmVudHMgbXVzdAoraGF2ZSBoYXBwZW5lZC4gIEluIG9yZGVyIHRvIHNlZSB3aGljaCwgd2UgbmVlZCB0byBsb29rIGF0IGZpbGVzW2ldLgorCitFeGFtaW5pbmcgdGhlIGNvZGUsIHRoZSBmaWxlcyBhcnJheSBnZXRzIGl0cyB2YWx1ZSB0aHJvdWdoIHRoZSBnZXRfZGlyKCkKK2VmdW4uICBUaGlzIHJldHVybnMgYWxsIHRoZSBmaWxlcyBpbiBhIGRpcmVjdG9yeSBpZiB0aGUgb2JqZWN0IGhhcyByZWFkIGFjY2VzcwordG8gdGhlIGRpcmVjdG9yeS4gIFRoZXJlZm9yZSB0aGUgcHJvYmxlbSBpcyBuZWl0aGVyIGxhY2sgb2YgYWNjZXNzIG9yIG5vbi0KK2V4aXN0ZW50IGZpbGVzLiAgVGhlIGZpbGUgd2hpY2ggY2F1c2VkIHRoaXMgZXJyb3IgdGhlbiBtdXN0IGhhdmUgYmVlbiBhbgorZW1wdHkgZmlsZS4gIEFuZCwgaW4gZmFjdCwgdGhhdCBpcyBleGFjdGx5IHdoYXQgY2F1c2VkIHRoaXMgZXJyb3IuICBUbworZGVidWcgdGhhdCwgd2Ugd291bGQgcGFzcyBmaWxlcyB0aHJvdWdoIHRoZSBmaWx0ZXIoKSBlZnVuIGFuZCBtYWtlCitzdXJlIHRoYXQgb25seSBmaWxlcyB3aXRoIGEgZmlsZSBzaXplIGdyZWF0ZXIgdGhhbiAwIHdlcmUgYWxsb3dlZCBpbnRvIHRoZQorYXJyYXkuCisKK1RoZSBrZXkgdG8gZGVidWdnaW5nIGEgcnVuIHRpbWUgZXJyb3IgaXMgdGhlcmVmb3JlIGtub3dpbmcgZXhhY3RseSB3aGF0Cit0aGUgdmFsdWVzIG9mIGFsbCB2YXJpYWJsZXMgaW4gcXVlc3Rpb24gYXJlIGF0IHRoZSBleGFjdCBtb21lbnQgd2hlcmUgdGhlCitidWcgY3JlYXRlZC4gIFdoZW4gcmVhZGluZyB5b3VyIHJ1biB0aW1lIGxvZywgYmUgY2FyZWZ1bCB0byBzZXBhcmF0ZSB0aGUKK29iamVjdCBmcm9tIHRoZSBmaWxlIGluIHdoaWNoIHRoZSBidWcgb2NjdXJyZWQuICBGb3IgZXhhbXBsZSwgdGhlCitpbmRleGluZyBlcnJvciBhYm92ZSBjYW1lIGFib3V0IGluIHRoZSBvYmplY3QgL3dpemFyZHMvemFrbmFpZmVuL3NweSwKK2J1dCB0aGUgZXJyb3Igb2NjdXJlZCB3aGlsZSBydW5uaW5nIGEgZnVuY3Rpb24gaW4gL3N0ZC9tb25zdGVyLmMsIHdoaWNoCit0aGUgb2JqZWN0IGluaGVyaXRlZC4KKworNy40IE1hbGZ1bmN0aW9uaW5nIENvZGUKK1RoZSBuYXN0aWVzdCBwcm9ibGVtIHRvIGRlYWwgd2l0aCBpcyB3aGVuIHlvdXIgY29kZSBkb2VzIG5vdCBiZWhhdmUgdGhlCit3YXkgeW91IGludGVuZGVkIGl0IHRvIGJlaGF2ZS4gIFRoZSBvYmplY3QgbG9hZHMgZmluZSwgYW5kIGl0IHByb2R1Y2VzIG5vCitydW4gdGltZSBlcnJvcnMsIGJ1dCB0aGluZ3Mgc2ltcGx5IGRvIG5vdCBoYXBwZW4gdGhlIHdheSB0aGV5IHNob3VsZC4gCitTaW5jZSB0aGUgZHJpdmVyIGRvZXMgbm90IHNlZSBhIHByb2JsZW0gd2l0aCB0aGlzIHR5cGUgb2YgY29kZSwgbm8gbG9ncworYXJlIHByb2R1Y2VkLiAgWW91IHRoZXJlZm9yZSBuZWVkIHRvIGdvIHRocm91Z2ggdGhlIGNvZGUgbGluZSBieSBsaW5lCithbmQgZmlndXJlIG91dCB3aGF0IGlzIGhhcHBlbmluZy4KKworU3RlcCAxOiBMb2NhdGUgdGhlIGxhc3QgbGluZSBvZiBjb2RlIHlvdSBrbmV3IHN1Y2Nlc3NmdWxseSBleGVjdXRlZAorU3RlcCAyOiBMb2NhdGUgdGhlIGZpcnN0IGxpbmUgb2YgY29kZSB3aGVyZSB5b3Uga25vdyB0aGluZ3MgYXJlIGdvaW5nCit3cm9uZworU3RlcCAzOiBFeGFtaW5lIHRoZSBmbG93IG9mIHRoZSBjb2RlIGZyb20gdGhlIGtub3duIHN1Y2Nlc3NmdWwgcG9pbnQgdG8KK3RoZSBmaXJzdCBrbm93biB1bnN1Y2Nlc3NmdWwgcG9pbnQuCisKK01vcmUgb2Z0ZW4gdGhhbiBub3QsIHRoZXNlIHByb2JsZW1zIG9jY3VyciB3aGVuIHlvdSBhcmUgdXNpbmcgaWYoKQorc3RhdGVtZW50cyBhbmQgbm90IGFjY291bnRpbmcgZm9yIGFsbCBwb3NzaWJpbGl0aWVzLiAgRm9yIGV4YW1wbGU6CisKK2ludCBjbWQoc3RyaW5nIHRtcCkgeworICAgIGlmKHN0cmluZ3AodG1wKSkgcmV0dXJuIGRvX2EoKQorICAgIGVsc2UgaWYoaW50cCh0bXApKSByZXR1cm4gZG9fYigpCisgICAgcmV0dXJuIDE7Cit9CisKK0luIHRoaXMgY29kZSwgd2UgZmluZCB0aGF0IGl0IGNvbXBpbGVzIGFuZCBydW5zIGZpbmUuICBQcm9ibGVtIGlzIG5vdGhpbmcKK2hhcHBlbnMgd2hlbiBpdCBpcyBleGVjdXRlZC4gIFdlIGtub3cgZm9yIHN1cmUgdGhhdCB0aGUgY21kKCkgZnVuY3Rpb24KK2lzIGdldHRpbmcgZXhlY3V0ZWQsIHNvIHdlIGNhbiBzdGFydCB0aGVyZS4gIFdlIGFsc28ga25vdyB0aGF0IGEgdmFsdWUgb2YKKzEgaXMgaW4gZmFjdCBiZWluZyByZXR1cm5lZCwgc2luY2Ugd2UgZG8gbm90IHNlZSAiV2hhdD8iIHdoZW4gd2UgZW50ZXIKK3RoZSBjb21tYW5kLiAgSW1tZWRpYXRlbHksIHdlIGNhbiBzZWUgdGhhdCBmb3Igc29tZSByZWFzb24gdGhlCit2YXJpYWJsZSB0bXAgaGFzIGEgdmFsdWUgb3RoZXIgdGhhbiBzdHJpbmcgb3IgaW50LiAgQXMgaXQgdHVybnMgb3V0LCB3ZQoraXNzdWVkIHRoZSBjb21tYW5kIHdpdGhvdXQgcGFyYW1ldGVycywgc28gdG1wIHdhcyBOVUxMIGFuZCBmYWlsZWQKK2FsbCB0ZXN0cy4KKworVGhlIGFib3ZlIGV4YW1wbGUgaXMgcmF0aGVyIHNpbXBsaXN0aWMsIGJvcmRlcmluZyBvbiBzaWxseS4gCitOZXZlcnRoZWxlc3MsIGl0IGdpdmVzIHlvdSBhbiBpZGVhIG9mIGhvdyB0byBleGFtaW5lIHRoZSBmbG93IG9mIHRoZQorY29kZSB3aGVuIGRlYnVnZ2luZyBtYWxmdW5jdGlvbmluZyBjb2RlLiAgT3RoZXIgdG9vbHMgYXJlIGF2YWlsYWJsZSBhcword2VsbCB0byBoZWxwIGluIGRlYnVnZ2luZyBjb2RlLiAgVGhlIG1vc3QgaW1wb3J0YW50IHRvb2wgaXMgdGhlIHVzZSBvZgordGhlIHByZWNvbXBpbGVyIHRvIGRlYnVnIGNvZGUuICBXaXRoIHRoZSBjb2RlIGFib3ZlLCB3ZSBoYXZlIGEgY2xhdXNlCitjaGVja2luZyBmb3IgaW50ZWdlcnMgYmVpbmcgcGFzc2VkIHRvIGNtZCgpLiAgV2hlbiB3ZSB0eXBlICJjbWQgMTAiLAord2UgYXJlIGV4cGVjdGluZyBkb19iKCkgdG8gZXhlY3V0ZS4gIFdlIG5lZWQgdG8gc2VlIHdoYXQgdGhlIHZhbHVlIG9mCit0bXAgaXMgYmVmb3JlIHdlIGdldCBpbnRvIHRoZSBsb29wOgorCisjZGVmaW5lIERFQlVHCitpbnQgY21kKHN0cmluZyB0bXApIHsKKyNpZmRlZiBERUJVRworICAgIHdyaXRlKHRtcCk7CisjZW5kaWYKKyAgICBpZihzdHJpbmdwKHRtcCkpIHJldHVybiBkb19hKCk7CisgICAgZWxzZSBpZihpbnRwKHRtcCkpIHJldHVybiBkb19iKCk7CisgICAgZWxzZSByZXR1cm4gMTsKK30KKworV2UgZmluZCBvdXQgaW1tZWRpYXRlbHkgdXBvbiBpc3N1aW5nIHRoZSBjb21tYW5kLCB0aGF0IHRtcCBoYXMgYQordmFsdWUgb2YgIjEwIi4gIExvb2tpbmcgYmFjayBhdCB0aGUgY29kZSwgd2Ugc2xhcCBvdXJzZWx2ZXMgc2lsbHksCitmb3JnZXR0aW5nIHRoYXQgd2UgaGF2ZSB0byBjaGFuZ2UgY29tbWFuZCBhcmd1bWVudHMgdG8gaW50ZWdlcnMgdXNpbmcKK3NzY2FuZigpIGJlZm9yZSBldmFsdWF0aW5nIHRoZW0gYXMgaW50ZWdlcnMuCisKKzcuNSBTdW1tYXJ5CitUaGUga2V5IHRvIGRlYnVnZ2luZyBhbnkgTFBDIHByb2JsZW0gaXMgYWx3YXlzIGJlaW5nIGF3YXJlIG9mIHdoYXQKK3RoZSB2YWx1ZXMgb2YgeW91ciB2YXJpYWJsZXMgYXJlIGF0IGFueSBnaXZlbiBzdGVwIGluIHlvdXIgY29kZS4gIExQQworZXhlY3V0aW9uIHJlZHVjZXMgb24gdGhlIHNpbXBsZXN0IGxldmVsIHRvIGNoYW5nZXMgaW4gdmFyaWFibGUgdmFsdWVzLCBzbworYmFkIHZhbHVlcyBhcmUgd2hhdCBjYXVzZXMgYmFkIHRoaW5ncyB0byBoYXBwZW4gb25jZSBjb2RlIGhhcyBiZWVuCitsb2FkZWQgaW50byBtZW1vcnkuICBJZiB5b3UgZ2V0IGVycm9ycyBhYm91dCBiYWQgYXJndW1lbnRzIHRvCitmdW5jdGlvbnMsIG1vcmUgbGlrZWx5IHRoYW4gbm90IHlvdSBhcmUgcGFzc2luZyBhIE5VTEwgdmFsdWUgdG8gYQorZnVuY3Rpb24gZm9yIHRoYXQgYXJndW1lbnQuICBUaGlzIGhhcHBlbnMgbW9zdCBvZnRlbiB3aXRoIG9iamVjdHMsIHNpbmNlCitwZW9wbGUgd2lsbCBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAgICAxKSB1c2UgYSB2YWx1ZSB0aGF0IHdhcyBzZXQgdG8gYW4gb2JqZWN0IHRoYXQgaGFzIHNpbmNlIGRlc3RydWN0ZWQKKyAgICAyKSB1c2UgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzX3BsYXllcigpIHdoZW4gdGhlcmUgaXMgbm8gdGhpc19wbGF5ZXIoKQorICAgIDMpIHVzZSB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoaXNfb2JqZWN0KCkganVzdCBhZnRlciB0aGlzX29iamVjdCgpIHdhcworICAgIGRlc3RydWN0ZWQKKworSW4gYWRkaXRpb24sIHBlb3BsZSB3aWxsIG9mdGVuIHJ1biBpbnRvIGVycm9ycyBpbnZvbHZpbmcgaWxsZWdhbCBpbmRleGluZyBvcgoraW5kZXhpbmcgb24gaWxsZWdhbCB0eXBlcy4gIE1vc3Qgb2Z0ZW4sIHRoaXMgaXMgYmVjYXVzZSB0aGUgbWFwcGluZyBvcgorYXJyYXkgaW4gcXVlc3Rpb24gd2FzIG5vdCBpbml0aWFsaXplZCwgYW5kIHRoZXJlZm9yZSBjYW5ub3QgYmUgaW5kZXhlZC4gCitUaGUga2V5IGlzIHRvIGtub3cgZXhhY3RseSB3aGF0IHRoZSBmdWxsIHZhbHVlIG9mIHRoZSBhcnJheSBvciBtYXBwaW5nCitzaG91bGQgYmUgYXQgdGhlIHBvaW50IGluIHF1ZXN0aW9uLiAgSW4gYWRkaXRpb24sIHdhdGNoIGZvciB1c2luZyBpbmRleAorbnVtYmVycyBsYXJnZXIgdGhhbiB0aGUgc2l6ZSBvZiBnaXZlbiBhcnJheXMKKworRmluYWxseSwgbWFrZSB1c2Ugb2YgdGhlIHByZWNvbXBpbGVyIHRvIHRlbXBvcmFybHkgdGhyb3cgb3V0IGNvZGUsIG9yCitpbnRyb2R1Y2UgY29kZSB3aGljaCB3aWxsIHNob3cgeW91IHRoZSB2YWx1ZXMgb2YgdmFyaWFibGVzLiAgVGhlCitwcmVjb21waWxlciBtYWtlcyBpdCBlYXN5IHRvIGdldCByaWQgb2YgZGVidWdnaW5nIGNvZGUgcXVpY2tseSBvbmNlIHlvdQorYXJlIGRvbmUuICBZb3UgY2FuIHNpbXBseSByZW1vdmUgdGhlIERFQlVHIGRlZmluZSB3aGVuIHlvdSBhcmUKK2RvbmUuCisKK0NvcHlyaWdodCAoYykgR2VvcmdlIFJlZXNlIDE5OTMKZGlmZiAtLWdpdCBhL2RvYy9LVVJTL1JVTEVTIGIvZG9jL0tVUlMvUlVMRVMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM4OGNmYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9LVVJTL1JVTEVTCkBAIC0wLDAgKzEsNjAgQEAKKwkJRElFIFpXRUkgR0VCT1RFIElOIE1PUkdFTkdSQVVFTgorCQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlXYXMgc29sbGVuIEdlYm90ZT8KKwktLS0tLS0tLS0tLS0tLS0tLS0KKworCVdpZSBpbiBqZWRlbSBTcGllbCBzbyBoYWJlbiBzaWNoIGF1Y2ggaW4gdW5zZXJlbSBNVUQgYWxsZQorCU1pdHNwaWVsZXIgKE1hZ2llciBlaW5nZXNjaGxvc3NlbikgYW4gU3BpZWxyZWdlbG4genUgaGFsdGVuLgorCUFsbGVyZGluZ3MgbWFjaGVuIGRpZSBTcGllbGUgYW0gbWVpc3RlbiBTcGFzcywgZGllIGRpZQorCXdlbmlnc3RlbiBSZWdlbG4gYmVzaXR6ZW4uIAorCisJVW0genUgdmVyaGluZGVybiwgZGFzcyBqZXR6dCBzY2hvbiBhbmdlZmFuZ2VuIHdpcmQsIGRhc3MKKwl1bnNlciBNVUQgaW4gZmVzdGUgUmVnZWxuIGdlZHJhZW5ndCB3aXJkLCBoYWJlIGljaCBtaWNoIAorCWVudHNjaGxvc3Nlbiwgc2VsYmVyIGRlbSBTcGllbCBlaW4gUmVnZWx3ZXJrIHp1IGdlYmVuLgorCUFiZXIgaWNoIHdlcmRlIGRhZnVlciBzb3JnZW4sIGRhc3Mgc2llIGt1cnogYmxlaWJlbi4KKwkKKwkxLkdlYm90ICkJRFUgU09MTFNUIE5FVFQgU0VJTi4KKworCURhcyBNVUQgaXN0IGVpbiBTcGllbDsgdW5kIFNwaWVsZSBtYWNoZW4gbnVyIGRhbm4gU3Bhc3MsCisJd2VubiBtYW4gc2ljaCBuaWNodCBnZWdlbnNlaXRpZyB2ZXJzdWNodCBpbiBkaWUgUGZhbm5lIHp1CisJaGF1ZW47IHNvbWl0IGdpbHQgZGllc2UgUmVnZWwgZnVlciBTcGllbGVyIHdpZSBmdWVyIE1hZ2llci4KKworCTIuR2Vib3QgKQlEVSBTT0xMU1QgRElFIE1VRExJQiBFSFJFTiBVTkQgVkVSTUVIUkVOLgorCisJRGFzIE1VRCBzdGVodCB1bmQgZmFlbGx0IG1pdCBkZXIgR3VldGUgc2VpbmVyIE11ZGxpYjsgdW5kIGRhCisJdW5zZXIgSGF1cHR6aWVsIGVpbiBzY2hvZW5lcyBNVUQgaXN0LCBpc3QgZXMgZGllIHZvcnJhbmdpZ2UKKwlBdWZnYWJlIGFsbGVyIE1hZ2llciwgZnVlciBkZW4gQXVmYmF1LCBkaWUgV2FydHVuZyB1bmQgZGllCisJRXJoYWx0dW5nIGRlciBNdWRsaWIgenUgc29yZ2VuLgorCisJWnVtIFRoZW1hIFZlcm1laHJ1bmc6CisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlFcyBnaWJ0IGluIGVpbmVtIE1VRCBuYXR1ZXJsaWNoIGF1Y2ggbm9jaCBhbmRlcmUgQXVmZ2FiZW46CisJLQlSZWdpb25za29vcmRpbmF0aW9uCisJCShSZWdpb25zbWFnaWVyLEVyem1hZ2llciBkZXMgVmVya2VocnMpCisJLQlXYWhydW5nIGRlcyBHbGVpY2hnZXdpY2h0ZXMgZGVyIEtyYWVmdGUKKwkJKFdhZmZlbixSdWVzdHVuZ2VuLEdlbGQsWFAsTW9uc3Rlcix1LnMudy4pCisJLQlTY2h1dHogZGVzIE1VRHMgdm9yIFNwaWVsdmVyZGVyYmVybi4KKwkJKFNoZXJpZmYpCisKKwlEaWVzZSBBdWZnYWJlbiBzaW5kIGFiZXIga2VpbmUgTGViZW5zYXVmZ2FiZW47IHNpZSBzaW5kCisJQXVmZ2FiZW4sIGRpZSBzaWNoIGRlbiBHZWJvdGVuIHVudGVyenVvcmRuZW4gaGFiZW4uCisJSW5zYmVzb25kZXJlIHNvbGxlbiBNYWdpZXIsIGRpZSBuaWNodHMgenVyIFZlcm1laHJ1bmcgZGVyCisJTXVkbGliIGJlaXRyYWdlbiwgbmljaHQgdWViZXIgYW5kZXJlIHVydGVpbGVuLgorCisJWnVtIFRoZW1hIEVocnVuZzoKKwktLS0tLS0tLS0tLS0tLS0tLQorCisJSGllcm1pdCBtZWluZSBpY2ggZGVuIEF1ZnJ1ZiBhbiBkaWUgTWFnaWVyLCBrZWluZSBPYmpla3RlCisJenUgc2NocmVpYmVuLCBkaWUgZGFzIEdsZWljaHRnZXdpY2h0IGRlciBLcmFlZnRlIHZlcmxldHplbi4KKworCVVuZCBpY2ggbWVpbmUgZGVuIEF1ZnJ1ZiBhbiBkaWUgTWFnaWVyLCBkYWZ1ZXIgenUgc29yZ2VuLAorCWRhc3MgZXMgaW4gZGllc2VtIE1VRCBIZXJhdXNmb3JkZXJ1bmdlbiBnaWJ0LCBkaWUgKHp1bWluZGVzdAorCXRlaWx3ZWlzZSkgbmljaHQgdW1nYW5nZW4gd2VyZGVuIGtvZW5uZW4uCisJTmF0dWVybGljaCBpc3QgZGFtaXQgYXVjaCBnZW1laW50LCBkYXNzIFNwaWVsZXJuIG51ciBpbiBkZW4KKwlGYWVsbGVuIGdlaG9sZmVuIHdpcmQsIHdvIEZlaGxlciBvZGVyIEx1ZWNrZW4gaW4gZGVyIE11ZGxpYgorCWF1ZnRhdWNoZW4uCisKKwlPbHBwLCBTaGVyaWZmIGRlcyBNb3JnZW5HcmF1ZW5zCisJUnVtYXRhLCBNdWRBZG0gZGVzIE1vcmdlbkdyYXVlbnMKZGlmZiAtLWdpdCBhL2RvYy9LVVJTL1JVTEVTLldJWiBiL2RvYy9LVVJTL1JVTEVTLldJWgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDlmMGI2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL0tVUlMvUlVMRVMuV0laCkBAIC0wLDAgKzEsNDYgQEAKK1RoZXNlIGFyZSB0aGUgcnVsZXMgZm9yIGEgd2l6YXJkLgorKFdpcmQgbm9jaCB1ZWJlcmFyYmVpdGV0LCBhbSBiZXN0ZW4gT2xwcCBvZGVyIFJ1bWF0YSBmcmFnZW4sIHdhcword2lya2xpY2ggU2FjaGUgaXN0LiBBYmVyIGVpbmUgZ3JvYmUgUmljaHR1bmcgd2Vpc2VuIGRpZXNlICJhbHRlbiIKK1JlZ2VsbiBzY2hvbiA6LSkKKworMS4gWW91IG1heSBub3QgaGVscCBvdGhlciBwbGF5ZXJzLCBldmVuIGlmIHRoZXkgbG9zdCBwb2ludHMgZHVlIHRvCisgICBsb3N0IGNvbm5lY3Rpb24uIFRoZXkgaGF2ZSB0byBnbyB0byB0aGUgcG9zdCBvZmZpY2UgYW5kIGFzayBMYXJzLAorICAgb3IgdXNlIGJ1Zy4KKworMi4gTmV2ZXIgYXR0YWNrIGEgcGxheWVyIG9yIGtpbGwgaGltLiBJZiBhIHBsYXllciBiZWhhdmVzIGJhZGx5LCBmaWxlCisgICB0aGUgY29tcGxhaW50IHRvIExhcnMuCisKKzMuIERvIG5vdCBtYWtlICdkZWFkbHknIHRyYXBwcy4gQSBwbGF5ZXIgbXVzdCBuZXZlciBkaWUgYmVjYXVzZSBoZSBkaWRuJ3QKKyAgIGtub3cgd2hhdCBoYXBwZW5zIGluIHRoZSBuZXh0IHJvb20uIElmIHNvbWUgcm9vbSBpcyB2ZXJ5IGRhbmdlcm91cywKKyAgIG1ha2Ugc29tZSBoaW50IChsaWtlIHRoZSBnaWFudCBmb290cHJpbnRzIGJlc2lkZSB0aGUgZ2lhbnQgbGFpcikuCisKKzQuIE5ldmVyIGluaXRpYWxpemUgdGhlIGRlc3RpbmF0aW9uIG9mIGFuIG9iamVjdCBvdXRzaWRlIHlvdXIgY2FzdGxlLiBJZiB5b3UKKyAgIG1ha2UgYSBtb25zdGVyIHRoYXQgY2FuIHdhbGsgb3V0IG9mIHRoZSBjYXN0bGUsIGJlIHN1cmUgdGhhdCBpdCBpcyBhCisgICB2ZXJ5IG5pY2UgbW9uc3Rlci4KKworNS4gTmV2ZXIgZ2VuZXJhdGUgbWVzc2FnZXMgdGhhdCBsb29rcyBsaWtlIHNvbWV0aGluZyBpdCBpc24ndCAoZ29vZCBhbmQgcHJlY2lzZQorICAgcnVsZSA6LSkuIFRoYXQgaXMsIGRvbid0IHRyeSB0byBmb29sIHRoZSBwbGF5ZXIgdGhhdCBzb21lb25lIHNheXMgc29tZXRoaW5nCisgICB3aGVuIGl0IGlzbid0IHRydWUgZXRjLgorCis2LiBJZiB5b3UgaGF2ZSBhICJ0ZXN0IiBjaGFyYWN0ZXIsIG1ha2Ugc3VyZSBpcyBpc24ndCBzZWVuIGluIHRoZSB0b3Agc2NvcmUKKyAgIGxpc3QuIEhlIG11c3Qgbm8gYmUgd2l6YXJkIGVpdGhlci4KKworNy4gVHJ5IHRvIGF2b2lkIG1ha2luZyBkZXZpY2VzLCBzaXR1YXRpb25zIHdoaWNoIG1ha2VzIHRoZSBwbGF5ZXJzIGxvb3NlCisgICBleHBlcmllbmNlIGlmIHRoZXkgYXJlIGFkdmVudHVyaW5nIG9yIGV4YW1pbmluZyBvYmplY3RzLiBQbGF5ZXJzIHNob3VsZCBiZQorICAgcmV3YXJkZWQgZm9yIGFkdmVudHVyaW5nIGFuZCBkaXNjb3ZlcmluZyB0aGluZ3MuIElmIHRoZXkgZ2V0IGtpbGxlZC4uLgorICAgV2VsbCwgdGhleSB3aWxsIHRoZW4gbG9vc2Ugc29tZSBleHBlcmllbmNlLCBidXQgdGhpcyBpcyBhIHNwZWNpYWwgY2FzZSEKKworOC4gVGhlIGdhbWUgaXMgc3VwcG9zZWQgdG8gYmUgaW4gdGhlICJsb25nIGRpc3RhbnQgcGFzdCIsIGFuZCB0aHVzIG5vCisgICBtb2Rlcm4gdGhpbmdzIHNob3VsZCBleGlzdC4gSWYgeW91IHdhbnQgc29tZSBraW5kIG9mIGFpcnBsYW5lLCB1c2UgYQorICAgZmx5aW5nIGhvcnNlIGluIHN0ZWFkIGV0Yy4KKworOS4gSWYgeW91IG1ha2UgYXZhaWxhYmxlIHNvbWUga2luZCBvZiByZXN0YXVyYW50IHRoYXQgc2VsbHMgZm9vZCB0aGF0CisgICBoZWFscywgdGhlbiB0aGUgaGVhbGluZyBtdXN0IGNvc3Qgb24gYXZlcmFnZSA0IGdwL2hwIChvciBtb3JlKS4gVGhlIGFtb3VudAorICAgb2YgaGVhbGluZyBtdXN0IGFsc28gYmUgbGltaXRlZCBwZXIgcmVzZXQuIEdlbmVyYXRpbmcgaGVhbGluZyBpdGVtcyBmb3IKKyAgIGZyZWUgaXMgb25seSBhbGxvd2VkIGlmIHRoZXkgaGVhbCBhdCBtb3N0IDIwIHBvaW50cywgYW5kIGFyZSBkZXN0cnVjdGVkLgorICAgTm90IG1vcmUgdGhhbiBvbmUgc3VjaCBpdGVtIG1heSBiZSBnZW5lcmF0ZWQgcGVyIHJvb20gYW5kIHJlc2V0LgorCisxMC5UZWxlcG9ydGluZyBpdGVtcyBzaG91bGQgYmUgVkVSWSByZXN0cmljdGVkLCBhbmQgdmVyeSByYXJlLiBUaGV5IG11c3QKKyAgIG5vdCBhbGxvdyB0ZWxlcG9ydGF0aW9ucyB0byBhbnl3aGVyZSwgYnV0IG9ubHkgdG8gb25lIG9yIG1vcmUgcHJlZGVmaW5lZAorICAgcm9vbS4gTmV2ZXIgdG8gYSBzcGVjaWZpYyBwbGF5ZXIuIEl0IG11c3QgY29zdCBhdCBsZWFzdCA1MCBzcGVsbCBwb2ludHMKKyAgIHRvIHVzZSBlYWNoIHRpbWUuCmRpZmYgLS1naXQgYS9kb2MvS1VSUy9laW5sZWl0dW5nIGIvZG9jL0tVUlMvZWlubGVpdHVuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDgzMTU1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL0tVUlMvZWlubGVpdHVuZwpAQCAtMCwwICsxLDQ1IEBACisJRWluZnVlaHJ1bmcgaW4gZGllIFByb2dybW1pZXJ1bmcgZGVyIE1vcmdlbmdyYXVlbi1NdWRsaWIKKwl2b24gRG9uIFJ1bWF0YSwgTXVkQWRtIGRlcyBNb3JnZW5HcmF1ZW5zCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCUVJTkxFSVRVTkc6CisJLS0tLS0tLS0tLS0KKworCUhlcnpsaWNoIHdpbGxrb21tZW4gYWxzIE1hZ2llciBpbSBNb3JnZW5HcmF1ZW4uIER1IGJpc3QKKwlnZXJhZGUgTWFnaWVyIGdld29yZGVuLiBEaWVzZXIgS3VycyBzb2xsIERpciBoZWxmZW4sCisJaW4gZGllc2VtIE1VRCBhbGxlcyBNb2VnbGljaGUgenUgcHJvZ3JhbW1pZXJlbi4gCisKKworCVdJQ0hUSUdFIElORk9STUFUSU9ORU4gRlVFUiBERU4gQU5GQU5HOgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJRWluIE1hZ2llciBoYXQgc2ljaCBnZXdpc3NlbiBSZWdlbG4genUgdW50ZXJ3ZXJmZW4sIHdpZSBtYW4KKwlzaWNoIGJlaW4gZWluZW0gU3BpZWwgYXVjaCBpbiBkaWUgU3BpZWxyZWdlbG4genUgaGFsdGVuIGhhdC4KKwlEaWVzZSBTcGllbHJlZ2VsbiBzdGVoZW4gaW4gUlVMRVMgKGRhcyBzaW5kIGRpZSB3aWNodGlnZW4pCisJdW5kIGluIFJVTEVTLldJWiAoZGFzIHNpbmQgZGllIHRlY2huaXNjaGVuIEhpbndlaXNlKS4KKworCVdlbm4gRHUgRmlsZXMgZWRpdGllcmVuIHdpbGxzdCwgZ2lidCBlcyBtZWhyZXJlIE1vZWdsaWNoLQorCWtlaXRlbjoKKworCTEuKSBNaXQgZGVtIEJlZmVobCAiZWQgPGZpbGVuYW1lPiI6CisJICAgIEVpbmUgRWlubGVpdHVuZyBmdWVyIGVkIGthbm5zdCBEdSBpbiAvZG9jL2VkLyogZmluZGVuLgorCisJMi4pIEZpbGV1ZWJlcnRyYWd1bmcgcGVyIGZ0cAorCTMuKSBGaWxldWViZXJ0cmFndW5nIHBlciBtdHAKKwkgICAgZnJhZ2UgYW0gYmVzdGVuIGVpbmVuIGRlciBlcmZhaHJlbmVuIE1hZ2llci4KKworCisJS1VSU1VFQkVSQkxJQ0s6CisJLS0tLS0tLS0tLS0tLS0tCisKKwlJCVByb2dyYW1taWVydW5nIHZvbiBSYWV1bWVuCisJICAgICAxLglFaW4gZWluZmFjaGVyIFJhdW0KKwkgCisJSUkJUHJvZ3JhbW1pZXJ1bmcgdm9uIE9iamVrdGVuCisJCisJSUlJCVByb2dyYW1taWVydW5nIHZvbiBNb25zdGVybgorCisKKwlBY2hqYTogSWNoIGJpdHRlIGZsZWhlbnRsaWNoIHVtIEtvcnJla3R1cmxlc2VuIHVuZAorCVZlcmJlc3NlcnVuZ3MvRXJnYWVuenVuZ3N2b3JzY2hsYWVnZS4gVW5kIG5vY2ggbWVocgorCXVtIE1pdGFyYmVpdC4gKEljaCBoYWIgc2Nob24gamV0enQgd3VuZGUgRmluZ2VyIDotKQpkaWZmIC0tZ2l0IGEvZG9jL0tVUlMvb2JqZWt0ZSBiL2RvYy9LVVJTL29iamVrdGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJiMTFkMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9LVVJTL29iamVrdGUKQEAgLTAsMCArMSwyOSBAQAorCU9CSkVLVEUKKwkKKwlBbHMgZXJzdGVzIG11c3N0IER1IHdpc3NlbiwgZGFzcyBqZWRlcyBPYmpla3QgaW4gZGllc2VtCisJTXVkIGR1cmNoIGVpbiBGaWxlIHJlcHJhZXNlbnRpZXJ0IHdpcmQuIERpZXNlcyBGaWxlCisJd2lyZCBhdWNoIGRpZSAiQmx1ZXByaW50IiBnZW5hbm50LiBEdSBrYW5uc3QgbmV1ZSBPYmpla3RlCisJYXVmIDIgQXJ0ZW4gZXJzY2hhZmZlbi4KKworCTEuKSAiY2xvbmUibiB2b24gQmx1ZXByaW50cy4gRGFzIGJlZGV1dGV0LCBkYXNzIER1IGVpbgorCSAgICBPYmpla3QgZXJzY2hhZmZzdCwgZGFzIGRpZSBFaWdlbnNjaGFmdGVuIGhhdCwgZGllIGluCisJICAgIGRlciBCbHVlcHJpbnQgcHJvZ3JhbW1pZXJ0IHdvcmRlbiBzaW5kLiBWb24gZWluZXIKKwkgICAgQmx1ZXByaW50IGtvZW5uZW4gbWVocmVyZSAiQ2xvbmVzIiBleGlzdGllcmVuLgorCSAgICBUeXBpc2NoZSBCZWlzcGllbGUgZnVlciAiQ2xvbmVzIiBzaW5kIFdhZmZlbiwKKwkgICAgTW9uc3RlciwgR2VsZCBvZGVyIFNwaWVsZXIuCisKKwkyLikgImxvYWQiZW4gdm9uIEJsdWVwcmludHMuIERhcyBiZWRldXRldCwgZGFzcyBEdQorCSAgICBkaWVzZSBCbHVlcHJpbnQgenUgTGViZW4gZXJ3ZWNrc3QuIEluIGdld2lzc2VyIFdlaXNlCisJICAgIGJlbmVobWVuIHNpY2ggZGllc2UgT2JqZWt0ZSBnZW5hdXNvIHdpZSBkaWUgIkNsb25lcyIsCisJICAgIGFsbGVyZGluZ3Mga29lbm5lbiB2b24gZWlubWFsIGdlbGFkZW5lbiBCbHVlcHJpbnRzCisJICAgIGtlaW5lICJDbG9uZXMiIG1laHIgZXJzY2hhZmZlbiB3ZXJkZW4uCisJICAgIFR5cGlzY2hlIGdlbGFkZW5lIE9iamVrdGUgc2luZCBSYWVtZS4KKworCUtOSUdHRSBGVUVSIE1BR0lFUgorCisJRGFkdXJjaCwgZGFzcyBEdSBiZWxpZWJpZ2UgRmlsZXMgbGFkZW4gb2RlciBjbG9uZW4ga2FubnN0LAorCWJpc3QgRHUgaW4gZGVyIExhZ2UsIGplZGVtIFNwaWVsZXIgZGFzIGdld3VlbnNjaHRlIE9iamVrdAorCXp1IGJlc2NoYWZmZW4uIEFiZXIgZGFzIGlzdCBuYXR1ZXJsaWNoIG5pY2h0IGRlciBTaW5uIGRlcgorCVNhY2hlLiBBbHMgTWFnaWVyIGJpc3QgRHUgdmVycGZsaWNodGV0LCBkZW4gU3BpZWxlcm4gbnVyCisJbm9jaCBkYW5uIHp1IGhlbGZlbiwgd2VubiBzaWUgYXVmZ3J1bmQgdm9uIFByb2dyYW1taWVyLQorCWZlaGxlcm4gaW4gU2Nod2llcmlna2VpdGVuIGdlcmF0ZW4uCmRpZmYgLS1naXQgYS9kb2MvS1VSUy9yYXVtMSBiL2RvYy9LVVJTL3JhdW0xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MjNjMzUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvS1VSUy9yYXVtMQpAQCAtMCwwICsxLDEzNyBAQAorCisJUFJPR1JBTU1JRVJVTkcgVk9OIFJBRVVNRU4gLSBURUlMIDEKKwl2b24gRG9uIFJ1bWF0YSwgTXVkQWRtIGRlcyBNb3JnZW5HcmF1ZW5zCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJRWluIFJhdW0gaXN0IHNlaHIgZWluZmFjaCB6dSBwcm9ncmFtbWllcmVuLiBNYW4gZnVlbGx0CisJaWhuIG1pdCBkZW4gSW5mb3JtYXRpb25lbiwgZGllIG1hbiBpbiBpaG0gaGFiZW4gd2lsbC4KKworCUFtIGJlc3RlbiBlcmtsYWVydCBzaWNoIGFsbGVzIGFuIGVpbmVtIEJlaXNwaWVsLiBadSBkZW4KKwlGdW5rdGlvbmVuIHNpbmQgaW4gL2RvYy9lZnVucyB1bmQgL2RvYy9sZnVucyB3ZWl0ZXJlCisJSW5mb3JtYXRpb25lbiBlcmhhZWx0bGljaC4KKworCU5hY2hmb2xnZW5kIGthbm5zdCBEdSBlaW5lbiAoenVnZWdlYmVuZWVybWFzc2VuIHVlYmVyLQorCWF1c2Z1ZWhybGljaCkgZG9rdW1lbnRpZXJ0ZW4gQmVpc3BpZWxyYXVtIGZpbmRlbi4KKwlJbiAvZG9jL2JlaXNwaWVsZS9yYXVtMS5jIGthbm5zdCBEdSBkZW4gc2VsYmVuIFJhdW0KKwlub2NoIGVpbm1hbCAob2huZSBLb21tZW50YXJlKSBmaW5kZW4uIERlbiBSYXVtCisJa2FubnN0IER1IHVlYnJpZ2VucyBhdWNoIGJldHJldGVuLgorCisvKiBiZWlzcGllbHJhdW0uYyB2b24gUnVtYXRhICovCisKK2luaGVyaXQgInN0ZC9yb29tIjsKKwkvLyBBbGxlIFJhZXVtZSBtdWVzc2VuIGRpZXNlIFplaWxlIGVudGhhbHRlbiwgZGEgaW4gZGVtCisJLy8gU3RhbmRhcmRyYXVtIHdpY2h0aWdlIEZ1bmt0aW9uZW4gZGVmaW5pZXJ0IHdlcmRlbiwgZGllCisJLy8gaW5uZXJoYWxiIGRlcyBTcGllbGVzIGJlbm9ldGlndCB3ZXJkZW4uCisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisJLy8gSW4gZGllc2VtIEZpbGUgc2luZCBkaWUgTmFtZW4gZGVyIFByb3BlcnRpZXMgZGVmaW5pZXJ0LgorCS8vIEZ1ZXIgbmFlaHJlIEluZm9ybWF0aW9uZW4ga2FubnN0IER1IGluCisJLy8gL2RvYy9jb25jZXB0cy9wcm9wZXJ0aWVzIHVuZCBpbiAvZG9jL3Byb3BlcnRpZXMuaAorCS8vIG5hY2hzY2hhdWVuLCBkYSBlcyBzZWhyIHZpZWxlIHZlcnNjaGllZGVuZSBQcm9wZXJ0aWVzCisJLy8gZ2lidC4KKworI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisJLy8gRGllc2UgTW9kdWxlIGVudGhhbHRlbiBhbGxlIERlZmluaXRpb25lbiBpbSBadXNhbW1lbmhhbmcKKwkvLyBtaXQgU3ByYWNoZS4gU2llaGUgL2RvYy9sYW5ndWFnZS5oCisKK2NyZWF0ZSgpCisvLyBEaWVzZSBGdW5rdGlvbiB3aXJkIGF1dG9tYXRpc2NoIGF1ZmdlcnVmZW4sIHdlbm4gZGVyIFJhdW0gZ2VsYWRlbgorLy8gd2lyZC4gRGFzIHBhc3NpZXJ0IGJlaW0gS29tbWFuZG8gImxvYWQgL2RvYy9iZWlzcGllbC9ic3ByYXVtMSIgb2RlcgorLy8gd2VubiBlaW4gU3BpZWxlciBkZW4gUmF1bSBhbHMgZXJzdGVyIGJldHJpdHQuCit7CisJOjpjcmVhdGUoKTsKKwkvLyBEaWVzZSBGdW5rdGlvbiBkYXJmIE5JRU1BTFMgZmVobGVuISBTaWUgc29yZ3QgZGFmdWVyLCBkYXNzCisJLy8gZGVyIFJhdW0gYXVjaCBkaWUgYWxsZ2VtZWluZSBJbml0aWFsaXNpZXJ1bmcgZHVyY2hmdWVocnQsCisJLy8gZGEgZGllc2UgaGllciBkaWUgZGVyICJNdXR0ZXItS2xhc3NlIiBzdGQvcm9vbSB1ZWJlcmxhZWR0LgorCisJU2V0UHJvcCggUF9JTlRfU0hPUlQsICJFaW4ga2xlaW5lcyBTY2hyZWliemltbWVyIiApOworCVNldFByb3AoIFBfSU5UX0xPTkcsCisJCSJEdSBzdGVoc3QgaW4gZWluZW0ga2xlaW5lbiBTY2hyZWliemltbWVyLlxuIgorCSsJIkVzIGdlaG9lcnRlIHdvaGwgaXJnZW5kd2FubiBlaW5tYWwgZWluZW0gTWFnaWVyLCBhYmVyIG51blxuIgorCSsJImlzdCBkaWVzZXIgUmF1bSB2ZXJ3YWlzdCB1bmQgcm90dGV0IHZvciBzaWNoIGhpbi5cbiIKKwkrCSJFaW4gZ3Jvc3NlciBTY2hyZWlidGlzY2ggaW4gZGVyIE1pdHRlIGRlcyBSYXVtZXMgc2NoZWludFxuIgorCSsJIm5vY2ggZWluaWdlcm1hc3NlbiBndXQgZXJoYWx0ZW4genUgc2Vpbi4gRHVyY2ggZGllIFR1ZXJcbiIKKwkrCSJpbSBOb3JkZW4gZmFlbGx0IGV0d2FzIExpY2h0IGhpbmVpbi5cbiIKKwkpOworCVNldFByb3AoIFBfTElHSFQsIDEgKTsKKwlTZXRQcm9wKCBQX0lORE9PUlMsIDEgKTsKKwkvLyBEaWVzZSBQcm9wZXJ0aWVzIE1VRVNTRU4gaW4gSkVERU0gUmF1bSBnZXNldHp0IHdlcmRlbi4KKwkvLyBQX0lOVF9TSE9SVAk9IEJlc2NocmVpYnVuZyBmdWVyIFNwaWVsZXIgaW0gImt1cnoiLU1vZHVzLgorCS8vIFBfSU5UX0xPTkcJPSBCZXNjaHJlaWJ1bmcgZnVlciBTcGllbGVyIGltICJsYW5nIi1Nb2R1cy4KKwkvLyBQX0xJR0hUCT0gMSBmdWVyIEhlbGwsIDAgZnVlciBEdW5rZWwKKwkvLyBQX0lORE9PUlMJPSAxLCB3ZW5uIG1hbiBkZW4gSGltbWVsIG5pY2h0IHNlaGVuIGthbm4uCisKKwlBZGREZXRhaWwoICh7ICJzY2hyZWlidGlzY2giLCAidGlzY2giIH0pLAorCQkiQXVmIGRlbSBUaXNjaCBsaWVndCBlaW5lIGRpY2tlIFN0YXVic2NoaWNodC5cbiIKKwkrCSJFaW5lIFNjaHVibGFkZSBmaW5kZXN0IER1IGViZW5mYWxscy5cbiIKKwkpOworCUFkZERldGFpbCggKHsgInN0YXViIiwgInN0YXVic2NoaWNodCIsICJzY2hpY2h0IiB9KSwKKwkJIkR1IG1hbHN0IGdlbGFuZ3dlaWx0IGVpbmlnZSBLcmVpc2UgaW4gZGVuIFN0YXViLlxuIgorCSk7CisJQWRkRGV0YWlsKCAic2NodWJsYWRlIiwKKwkJIlNvIHNlaHIgRHUgRGljaCBhbnN0cmVuZ3N0OyBEdSBrYW5uc3Qgc2llIG5pY2h0IGJld2VnZW4uXG4iCisJKTsKKwlBZGREZXRhaWwoICJ0dWVyIiAsCisJCSJTaWUgc3RlaHQgc2VpdCBKYWhyZW4gb2ZmZW4gdW5kIGlzdCBpbiBkaWVzZXIgTGFnZVxuIgorCSsJImhvZmZudW5nc2xvcyBmZXN0Z2Vyb3N0ZXQuXG4iCisJKTsKKwkvLyBEZXRhaWxzIHNpbmQgRGluZ2UsIGRpZSBtYW4gc2ljaCBpbiBlaW5lbSBSYXVtIGFuc2NoYXVlbgorCS8vIGFiZXIgbmljaHQgbmVobWVuIGthbm4uIEplIG1laHIgRGV0YWlscyBlaW4gUmF1bSBoYXQsIGRlc3RzbworCS8vIHNjaG9lbmVyIGlzdCBlci4gU2NoYXV0IHNpY2ggZWluIFNwaWVsZXIgZWluIERldGFpbCBhbiwKKwkvLyBzbyBiZWtvbW10IGRlciBkaWUgYW5nZWdlYmVuZSBCZXNjaHJlaWJ1bmcuCisKKwlBZGRSb29tQ21kKCAoeyAic2NobGllc3NlIiwgIm9lZmZuZSIsICJiZXdlZ2UiLAorCQkic2NobGllc3MiLCAiYmV3ZWciIH0pLCAiYmV3ZWdfZXR3YXMiICk7CisJLy8gUm9vbUNvbW1hbmRzIHNpbmQgQmVmZWhsZSwgZGllIG1hbiBpbiBkaWVzZW0gYXVzZnVlaHJlbiBrYW5uLgorCS8vIEVzIHdpcmQgZGllIGFuZ2VnZWJlbmUgRnVua3Rpb24gYXVzZ2VmdWVocnQuCisJLy8gV0lDSFRJRzogQWxzIFZlcmJlbiBzb2xsdGVuIGltbWVyIGRpZSBJTVBFUkFUSVZFIGJlbnV0enQKKwkvLwl3ZXJkZW4hIEFsc28gbmljaHQgImxlc2UiLCBzb25kZXJuICJsaWVzIi4KKwkKKwlBZGRFeGl0KCAibm9yZGVuIiwgInBsYXllcnMvcnVtYXRhL3dvcmtyb29tIiApOworCS8vIERlZmluaXRpb24gZWluZXMgQXVzZ2FuZ3MuIERhcyB6ZWl0ZSBBcmd1bWVudCBiZXN0aW1tdCBkZW4KKwkvLyBSYXVtLCBkZW4gZWluIFNwaWVsZXIgZXJyZWljaHQsIHdlbm4gZXIgaW4gZGllIGFuZ2VnZWJlbmUKKwkvLyBSaWNodHVuZyBnZWh0LgorCit9CisKK2Jld2VnX2V0d2FzKCBzdHIgKQorLy8gV2VubiBlaW4gU3BpZWxlciBlaW4gS29tbWFuZG8gYXVzZnVlaHJ0LCBzbyB3aXJkIGFsbGVzLCB3YXMgaGludGVyCisvLyBkZW0gVmVyYiBzdGVodCBhbHMgU3RyaW5nIHVlYmVyZ2ViZW4sIGVzIGxhbmRldCBhbHNvIGhpZXIgaW4gInN0ciIuCisvLyBXSUNIVElHOiBXZW5uIGRlciBCZWZlaGwgYWJnZWFyYmVpdGV0IHdpcmQsIE1VU1MgZXIgZWluZSAxIHp1cnVlY2stCisvLyAgICAgICAgICBnZWJlbi4gV2VubiBkZXIgQmVmZWhsIG5pY2h0cyBTaW5udm9sbGVzIHR1ZW4ga29ubnRlLCBlaW5lIDAuCit7CisJbm90aWZ5X2ZhaWwoICJXYXMgd2lsbHN0IER1IGRlbm4gYmV3ZWdlbiA/IiApOworCS8vIE1lbGR1bmcsIGRpZSBkZXIgU3BpZWxlciBiZWtvbW10LCB3ZW5uIGF1c3NlciBkZW0gUmF1bSBhdWNoCisJLy8ga2VpbiBhbmRlcmVzIE9iamVrdCBkZW4gQmVmZWhsIHZlcmFyYmVpdGVuIGtvbm50ZS4KKwlpZiggc3RyID09ICJ0dWVyIiApCisJeworCQl3cml0ZSggIkRpZSBUdWVyIGlzdCBob2ZmbnVuZ3Nsb3MgZmVzdGdlcm9zdGV0LlxuIiApOworCQkvLyBXcml0ZSBnaWJ0IGVpbmUgTWVsZHVuZyBhbiBkZW4gU3BpZWxlciAodW5kIG51ciBhbiBpaG4pCisJCS8vIGF1cy4KKwkJcmV0dXJuIDE7CisJCS8vIERhcyBLb21tYW5kbyBiZXdpcmt0IHp3YXIgYXVzIFNpY2h0IGRlcyBTcGllbGVycworCQkvLyBuaWNodHMsIGFiZXIgZXMga29ubnRlIGFiZ2VhcmJlaXRldCB3ZXJkZW4uCisJCS8vIEFsc28gZ2liIGVpbmUgMSB6dXJ1ZWNrLgorCX0KKwlpZiAoIHN0ciA9PSAibGFkZSIgfHwgc3RyID09ICJzY2h1YmxhZGUiICkKKwl7CisJCXdyaXRlKCAiRGllIFNjaHVibGFkZSBrbGVtbXQgZWluZmFjaCBudXIuXG4iICk7CisJCXJldHVybiAxOworCX0KKwlpZiAoIHF1ZXJ5X3ZlcmIoKSA9PSAiYmV3ZWdlIiAmJgorCQkoIHN0ciA9PSAidGlzY2giIHx8IHN0ciA9PSAic2NocmVpYnRpc2NoIiApICkKKwl7CisJCXdyaXRlKAorCQkJIkRlciBUaXNjaCBzY2hlaW50IGFtIEJvZGVuIGZlc3RnZXNjaHJhdWJ0IHp1IHNlaW4uXG4iCisJCSk7CisJCXNheSgKKwkJCXRoaXNfcGxheWVyKCktPm5hbWUoV0VSLDIpKyIgemVycnQgYW0gU2NocmVpYnRpc2NoLlxuIgorCQkpOworCQkvLyBzYXkgZ2lidCBlaW5lIE1lbGR1bmcgYW4gYWxsZSBTcGllbGVyIGltIHNlbGJlbgorCQkvLyBSYXVtIHdpZSBkZXIgU3BpZWxlciAoYWJlciBuaWNodCBhbiBpaG4gc2VsYnN0KSBhdXMuCisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKKwkvLyBEZXIgUmF1bSBrb25udGUgbmljaHRzIG1pdCBkZW0gS29tbWFuZG8gYW5mYW5nZW4sIGFsc28gZ2liCisJLy8gZWluZSAwIHp1cnVlY2suCit9CmRpZmYgLS1naXQgYS9kb2MvTFBDLy5zeW5vbnltIGIvZG9jL0xQQy8uc3lub255bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDA5MTZiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL0xQQy8uc3lub255bQpAQCAtMCwwICsxLDI2IEBACithcnJheSBhcnJheXMKK3ZlcmVyYnVuZyBpbmhlcml0YW5jZQorZXJiZW4gaW5oZXJpdGFuY2UKK2ludGVnZXIgaW50ZWdlcnMKK21hcHBpbmcgbWFwcGluZ3MKK21vZHVsbyBvcGVyYXRvcnMKK29wZXJhdG9yZW4gb3BlcmF0b3JzCitpbmNyZW1lbnQgb3BlcmF0b3JzCitkZWNyZW1lbnQgb3BlcmF0b3JzCitzdHJpbmcgc3RyaW5ncworY2FzZSBzd2l0Y2gKK3ByaXZhdGUgbW9kaWZpZXJzCitwdWJsaWMgbW9kaWZpZXJzCitzdGF0aWMgbW9kaWZpZXJzCitub21hc2sgbW9kaWZpZXJzCitwcm90ZWN0ZWQgbW9kaWZpZXJzCitub3NhdmUgbW9kaWZpZXJzCit2aXJ0dWFsIG1vZGlmaWVycworc3RydWN0IHN0cnVjdHMKK3N0cm9uZ190eXBlcyBwcmFnbWEKK3N0cmljdF90eXBlcyBwcmFnbWEKK3NhdmVfdHlwZXMgcHJhZ21hCitwZWRhbnRpYyBwcmFnbWEKK3JhbmdlX2NoZWNrIHByYWdtYQorcnR0YyBwcmFnbWEKK3J0dF9jaGVja3MgcHJhZ21hCmRpZmYgLS1naXQgYS9kb2MvTFBDL2FsaXN0cyBiL2RvYy9MUEMvYWxpc3RzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NTBkZTcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvTFBDL2FsaXN0cwpAQCAtMCwwICsxLDUzIEBACitDT05DRVBUCisgICAgICAgIGFsaXN0cworCitMQVNUIFVQREFURQorICAgICAgICAyIE1hciA5MiAyMToxMDoyMSBHTVQKKworQVVUSE9SCisgICAgICAgIEZyb206IGFteWxhYXJAbWNzaGguaGFuc2UuZGUgKEpvZXJuIFJlbm5lY2tlKQorICAgICAgICBTdWJqZWN0OiBnZW5lcmFsIGRvY3VtZW50YXRpb24gb24gYWxpc3RzCisKK0RFU0NSSVBUSU9OCisgICAgICAgIEFsaXN0cyBwcm92aWRlIGEgZmFzdCBhbmQgY29udmVuaWVudCB3YXkgdG8gYWNjZXNzIGRhdGEKKyAgICAgICAgYXNzb2NpYXRpdmVseS4KKworICAgICAgICBBbGlzdHMgYXJlIGltcGxlbWVudGVkIGFzIGFycmF5cyBvZiBhcnJheXMsIHRoZSBmaXJzdCBiZWluZworICAgICAgICB0aGUgYXJyYXkgaG9sZGluZyB0aGUga2V5cywgdGhlIG90aGVycyBhcnJheXMgaG9sZGluZworICAgICAgICBhc3NvY2lhdGVkIGRhdGEuIEFuIGVtcHR5IGFsaXN0IGlzIGFuIGFycmF5IG9mIGVtcHR5IGFycmF5cy4KKworICAgICAgICBOb3RlIHRoYXQgdGhlIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBhcnJheXMgYXJlIHVzZWQgdGhlIG90aGVyCisgICAgICAgIHdheSB0aGFuIGluIGxpc3AgdG8gYWxsb3cgZm9yIGZhc3RlciBzZWFyY2hpbmcuCisKKyAgICAgICAgS2V5cyBoYXZlIHRvIGJlIG9mIHR5cGUgaW50ZWdlciwgc3RyaW5nIG9yIG9iamVjdC4gVHlwZXMgY2FuCisgICAgICAgIGJlIG1peGVkLgorCisgICAgICAgIFRoZSBzZWFyY2ggZnVuY3Rpb25zIHJldHVybiBhbiB1bmRlZmluZWQgdmFsdWUgd2hlbiBhbm90aGVyCisgICAgICAgIGxpc3QgaXMgZ2l2ZW4gaW4gcGxhY2Ugb2YgYSBwcmVzb3J0ZWQga2V5IGxpc3QuCisKKyAgICAgICAgQSBsaXN0IHdpdGggbm9uLW51bWVyaWMga2V5cyByZXRyaWV2ZWQgYnkgcmVzdG9yZV9vYmplY3QoKSBoYXMKKyAgICAgICAgdG8gYmUgcmVhZGp1c3RlZCBieSB1c2luZyBvcmRlcl9hbGlzdCgpLCBlc3BlY2lhbGx5IGFmdGVyCisgICAgICAgIHJlYm9vdC4KKworICAgICAgICBEZWxldGluZyBhbiBlbnRyeSBjYW4gc2FmZWx5IGJlIGRvbmUgd2l0aCBleGNsdWRlX2FycmF5IGFzCisgICAgICAgIGxvbmcgYXMgYWxsIGFzc29jaWF0ZWQgZGF0YSBsaXN0cyBhcmUgdHJlYXRlZCBsaWtlIHRoZSBrZXkKKyAgICAgICAgYXJyYXk7IGluZGV4IGZpbmRpbmcgZm9yIHN1Y2ggcHVycG9zZXMgY2FuIGJlIGRvbmUgd2l0aCBhc3NvYy4KKworICAgICAgICBUeXBpY2FsIGFwcGxpY2F0aW9uczogaG9sZGluZyBhZG1pbmlzdHJhcnkgaW5mb3JtYXRpb24gYWJvdXQKKyAgICAgICAgd2l6YXJkcywgbGlzdCBvZiB2aXNpdG9ycyBpbiBhIHB1YiwgbGlzdCBvZiBjdXN0b21lcnMgaGF2aW5nCisgICAgICAgIHNvbWUgc29ydCBvZiBjcmVkaXQsIGluZm9ybWF0aW9uIHJlbWVtYmVyZWQgYWJvdXQgaXRlbXMgZXRjLgorCitOT1RFCisgICAgICAgIFRoZSBtYWluIHVzZSBvZiBhbGlzdHMsIHN0b3JpbmcgZGF0YSBhc3NvY2lhdGl2ZWx5LCBpcyBub3cKKyAgICAgICAgYmV0dGVyIHBlcmZvcm1lZCBieSBtYXBwaW5ncy4gQWxpc3RzIGFyZSBuZWVkZWQgZm9yIG1vcmUKKyAgICAgICAgZXh0cmVtZSBzaXR1YXRpb25zIG9ubHkuCisKKyAgICAgICAgQWxpc3RzIGFyZSBhdmFpbGFibGUgb25seSBpZiB0aGUgZHJpdmVyIGlzIGNvbXBpbGVkIHdpdGgKKyAgICAgICAgYWxpc3Qgc3VwcG9ydC4gSW4gdGhhdCBjYXNlLCBfX0FMSVNUU19fIGlzIGRlZmluZWQuCisKK0hJU1RPUlkKKyAgICAgICAgTERNdWQgMy4zIG1hZGUgYWxpc3RzIGFuIG9wdGlvbmFsIGVmdW4uCisKK1NFRSBBTFNPCisgICAgICAgIG1hcHBpbmdzKExQQyksIG9yZGVyX2FsaXN0KEUpLCBpbnNlcnRfYWxpc3QoRSksIGFzc29jKEUpLAorICAgICAgICB0cmFuc3Bvc2VfYXJyYXkoRSkKZGlmZiAtLWdpdCBhL2RvYy9MUEMvYXJyYXlzIGIvZG9jL0xQQy9hcnJheXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgzZGRkYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9MUEMvYXJyYXlzCkBAIC0wLDAgKzEsMTE2IEBACitDT05DRVBUCisgICAgICAgIGFycmF5cworCitERVNDUklQVElPTgorICAgICAgICBUaGVyZSBpcyBzdXBwb3J0IGZvciBhcnJheXMuIFRoZSBhcnJheXMgY2FuJ3QgYmUgZGVjbGFyZWQsIGJ1dAorICAgICAgICBzaG91bGQgYmUgYWxsb2NhdGVkIGR5bmFtaWNhbGx5IHdpdGggdGhlIGZ1bmN0aW9uICdhbGxvY2F0ZSgpJworICAgICAgICAoc2VlIGVmdW4vYWxsb2NhdGUpLgorCisgICAgICAgIEFycmF5cyBhcmUgc3RvcmVkIGJ5IHJlZmVyZW5jZSwgc28gYWxsIGFzc2lnbm1lbnRzIG9mIHdob2xlCisgICAgICAgIGFycmF5cyB3aWxsIGp1c3QgY29weSB0aGUgYWRkcmVzcy4gVGhlIGFycmF5IHdpbGwgYmUKKyAgICAgICAgZGVhbGxvY2F0ZWQgd2hlbiBubyB2YXJpYWJsZSBwb2ludHMgdG8gaXQgYW55IGxvbmdlci4KKworICAgICAgICBXaGVuIGEgdmFyaWFibGUgcG9pbnRzIHRvIGFuIGFycmF5LCBpdGVtcyBjYW4gYmUgYWNjZXNzZWQgd2l0aAorICAgICAgICBpbmRleGluZzogJ2FyclszXScgYXMgYW4gZXhhbXBsZS4gVGhlIG5hbWUgb2YgdGhlIGFycmF5IGJlaW5nCisgICAgICAgIGluZGV4ZWQgY2FuIGJlIGFueSBleHByZXNzaW9uLCBldmVuIGEgZnVuY3Rpb24gY2FsbDoKKyAgICAgICAgJ2Z1bmMoKVsyXScuIEl0IGNhbiBhbHNvIGJlIGFub3RoZXIgYXJyYXksIGlmIHRoaXMgYXJyYXkgaGFzCisgICAgICAgIHBvaW50ZXJzIHRvIGFycmF5czoKKworICAgICAgICBhcnIgPSBhbGxvY2F0ZSgyKTsKKyAgICAgICAgYXJyWzBdID0gYWxsb2NhdGUoMyk7CisgICAgICAgIGFyclsxXSA9IGFsbG9jYXRlKDMpOworCisgICAgICAgIE5vdyAnYXJyWzFdWzJdJyBpcyBhIHZhbGlkIHZhbHVlLgorCisgICAgICAgIFRoZSAnc2l6ZW9mKCknIGZ1bmN0aW9uIChpbiB0cnVlIEMgYSBjb21waWxlci1kaXJlY3RpdmUsIG5vdCBhCisgICAgICAgIGZ1bmN0aW9uKSB3aWxsIGdpdmUgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhbiBhcnJheSAoc2VlCisgICAgICAgIGVmdW4vc2l6ZW9mKS4KKworTk9URQorICAgICAgICBOb3dhZGF5cyBpdCBpcyBtb3N0IG9mIHRoZSB0aW1lIHByZWZlcmFibGUgdG8gdXNlIGFuIGFycmF5CisgICAgICAgIGNvbnN0cnVjdG9yLCBhIGxpc3Qgc3Vycm91bmRlZCBieSAnKHsnIGFuZCAnfSknLAorICAgICAgICBlLmcuICh7IDEsICJ4eCIsIDIgfSkgd2lsbCBjb25zdHJ1Y3QgYSBuZXcgYXJyYXkgd2l0aCBzaXplIDMsCisgICAgICAgIGluaXRpYWxpemVkIHdpdGggMSwgInh4IiBhbmQgMiByZXNwZWN0aXZlbHkuCisKKworT1BFUkFUSU9OUworCisgICAgICAgIElOREVYSU5HCisgICAgICAgIFRoZXJlIGFyZSBzZXZlcmFsIHZlcnkgdXNlZnVsIG9wZXJhdGlvbnMgZGVmaW5lZCBvbiBhcnJheXMuCisgICAgICAgIFRoZSBtb3N0IHVzZWQgaXMgdGhlIGluZGV4aW5nOgorICAgICAgICAgICAgICAgIGE9KHsgMCwxLDIsMyB9KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYVsyXTsgICAgICAvLyB0aGlzIHdpbGwgcmV0dXJuIDIKKyAgICAgICAgWW91IGFsc28gY2FuIGNvdW50IGZyb20gdGhlIGVuZCBvZiB0aGUgYXJyYXkuIFVzZSA8MSB0byBzcGVjaWZ5CisgICAgICAgIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlIGFycmF5OgorICAgICAgICAgICAgICAgIGE9KHsgMCwxLDIsMyB9KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYVs8M107ICAgICAvLyB0aGlzIHdpbGwgcmV0dXJuIDEKKyAgICAgICAgV2l0aCBpbmRleGluZyB5b3UgY2FuIGFsc28gY3JlYXRlIHN1Yi1hcnJheXM6CisgICAgICAgICAgICAgICAgYT0oeyAwLDEsMiwzLDQsNSw2LDcgfSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFbMy4uNV07ICAgLy8gdGhpcyB3aWxsIHJldHVybiAoeyAzLDQsNSB9KQorICAgICAgICAgICAgICAgIHJldHVybiBhWzIuLjwyXTsgIC8vIHRoaXMgd2lsbCByZXR1cm4gKHsgMiwzLDQsNSw2IH0pCisgICAgICAgICAgICAgICAgcmV0dXJuIGFbPDUuLjwzXTsgLy8gdGhpcyB3aWxsIHJldHVybiAoeyAzLDQsNSB9KQorICAgICAgICAgICAgICAgIHJldHVybiBhWzw2Li41XTsgIC8vIHRoaXMgd2lsbCByZXR1cm4gKHsgMiwzLDQsNSB9KQorICAgICAgICAgICAgICAgIHJldHVybiBhWzMuLjNdOyAgIC8vIHRoaXMgd2lsbCByZXR1cm4gKHsgMyB9KQorICAgICAgICAgICAgICAgIHJldHVybiBhWzMuLjJdOyAgIC8vIHRoaXMgd2lsbCByZXR1cm4gKHsgfSkKKyAgICAgICAgICAgICAgICByZXR1cm4gYVszLi4wXTsgICAvLyB0aGlzIHdpbGwgcmV0dXJuICh7IH0pCisgICAgICAgICAgICAgICAgcmV0dXJuIGFbNS4uMTAwXTsgLy8gdGhpcyB3aWxsIHJldHVybiAoeyA1LDYsNyB9KQorICAgICAgICAgICAgICAgIFt4Li5dIGlzIGludGVycHJldGVkIGFzIFt4Li48MV0KKworICAgICAgICBBRERJTkcKKyAgICAgICAgWW91IGNhbiBhZGQgdHdvIGFycmF5cy4gVGhlIHJlc3VsdCBpcyBvbmUgYXJyYXkgd2l0aCB0aGUgZWxlbWVudHMKKyAgICAgICAgb2YgYm90aCB0aGUgZm9ybWVyIGFycmF5czoKKyAgICAgICAgICAgICAgICBhPSh7IDAsMSB9KTsKKyAgICAgICAgICAgICAgICBiPSh7ICJhIiwiYiIgfSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGErYjsgICAgICAgLy8gdGhpcyB3aWxsIHJldHVybiAoeyAwLDEsImEiLCJiIiB9KQorICAgICAgICAgICAgICAgIHJldHVybiBiK2E7ICAgICAgIC8vIHRoaXMgd2lsbCByZXR1cm4gKHsgImEiLCJiIiwwLDEgfSkKKworICAgICAgICBTVUJUUkFDVElORworICAgICAgICBZb3UgY2FuIGVyYXNlIGFsbCBlbGVtZW50cyBvZiBvbmUgYXJyYXkgdGhhdCBvY2N1ciBpbiBhbm90aGVyCisgICAgICAgIGFycmF5OgorICAgICAgICAgICAgICAgIGE9KHsgMCwxLDIsMyw0LDUsNiw3IH0pOworICAgICAgICAgICAgICAgIGI9KHsgNywyLDUsOCwxLDkgfSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGEtYjsgICAgICAgLy8gdGhpcyB3aWxsIHJldHVybiAoeyAwLDMsNCw2IH0pCisgICAgICAgICAgICAgICAgcmV0dXJuIGItYTsgICAgICAgLy8gdGhpcyB3aWxsIHJldHVybiAoeyA4LDkgfSkKKworICAgICAgICBJTlRFUkpVTkNUSU9OCisgICAgICAgIFVzZSB0aGUgJi1vcGVyYXRvciB0byBjcmVhdGUgdGhlIGludGVyanVuY3Rpb24gb2YgdHdvIGFycmF5czoKKyAgICAgICAgICAgICAgICBhPSh7IDUsMiw4LDEsOSw0IH0pCisgICAgICAgICAgICAgICAgYj0oeyAxLDYsNywzLDQsNSB9KQorICAgICAgICAgICAgICAgIHJldHVybiBhJmI7ICAgICAgIC8vIHRoaXMgd2lsbCByZXR1cm4gKHsgMSw0LDUgfSkKKworICAgICAgICBBU1NJR05JTkcKKyAgICAgICAgQXNzaWduaW5nIGNhbiBhbHNvIGJlIGRvbmUgdG8gc3ViLWFycmF5cyBhbmQgaXMgdGh1cyB2ZXJ5IHBvd2VyZnVsOgorICAgICAgICAgICAgICAgIGE9KHsgMCwxLDIsMyw0LDUsNiw3IH0pOworICAgICAgICAgICAgICAgIGFbPDQuLjwzXT0oeyA4LDkgfSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGE7ICAgICAgICAgLy8gdGhpcyB3aWxsIHJldHVybiAoeyAwLDEsMiwzLDgsOSw2LDcgfSkKKworICAgICAgICAgICAgICAgIGE9KHsgMCwxLDIsMyw0LDUsNiw3IH0pOworICAgICAgICAgICAgICAgIGFbMi4uNV09KHsgfSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGE7ICAgICAgICAgLy8gdGhpcyB3aWxsIHJldHVybiAoeyAwLDEsNiw3IH0pCisKKyAgICAgICAgICAgICAgICBhPSh7IDAsMSwyLDMsNCB9KTsKKyAgICAgICAgICAgICAgICBhWzMuLjJdPSh7IDgsOSB9KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYTsgICAgICAgICAvLyB0aGlzIHdpbGwgcmV0dXJuICh7IDAsMSwyLDgsOSwzLDQgfSkKKworICAgICAgICAgICAgICAgIGE9KHsgMCwxLDIsMyw0IH0pOworICAgICAgICAgICAgICAgIGFbMy4uMF09KHsgOCw5IH0pOworICAgICAgICAgICAgICAgIHJldHVybiBhOyAgICAgICAgIC8vIHRoaXMgd2lsbCByZXR1cm4gKHsgMCwxLDIsOCw5LDEsMiwzLDQgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHF1aXRlIGZ1bm55IGJ1dCB0cnVlIDstKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdBUk5JTkc6IElmIGRvbmUgdW5pbnRlbnRpb25hbGx5IGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGhpbiBhIGxvb3AsIHlvdSBjYW4gcXVpY2tseSBjYXVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBnYW1lIHRvIHJ1biBvdXQgb2YgbWVtb3J5IQorCisgICAgICAgIEdFTkVSQUwKKyAgICAgICAgT2YgY291cnNlIGZvciBhbnkgb2YgdGhlIG9wZXJhdG9ycyBleHBsYWluZWQgYWJvdmUgeW91IGNhbiB1c2UKKyAgICAgICAgdGhlIGNvbWJpbmVkIGZvcm0gb2YgYXNzaWduaW5nIGFuZCBvcGVyYXRpbmc7IHRoYXQgbWVhbnMgdGhlCisgICAgICAgIG9wZXJhdG9ycyArPSwgLT0gYW5kICY9IHdvcmsuCisKKworVElQUworICAgICAgICBJZiB5b3Ugd2FudCB0byBtYWtlIHN1cmUgdGhhdCBubyBlbGVtZW50IGlzIG1vcmUgdGhhbiBvbmNlIGluIGFuCisgICAgICAgIGFycmF5IHlvdSBjYW4gdXNlIHRoZSBmb2xsb3dpbmc6CisgICAgICAgICAgICAgICAgYSA9IG1faW5kaWNlcyhta21hcHBpbmcoYSkpOworICAgICAgICBUaGlzIGNyZWF0ZXMgYSBtYXBwaW5nIG91dCBvZiB0aGUgYXJyYXkgYW5kIHJlY3JlYXRlcyB0aGUgYXJyYXkKKyAgICAgICAgYXQgb25jZS4gVGhlIGVsZW1lbnRzIGluIHRoZSBhcnJheSBjYW4gYmUgc2h1ZmZsZWQgYnkgdGhpcworICAgICAgICBwcm9jZWR1cmUuCisKZGlmZiAtLWdpdCBhL2RvYy9MUEMvYmxvY2sgYi9kb2MvTFBDL2Jsb2NrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZWIzODIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvTFBDL2Jsb2NrCkBAIC0wLDAgKzEsNDggQEAKK05BTUUKKyAgICAgICAgYmxvY2sKKworREVTQ1JJUFRJT04KKyAgICAgICAgQSBibG9jayBpcyBhIHNwZWNpYWwgc3RhdG1lbnQsIHRoYXQgYmVnaW5zIHdpdGggJ3snLCBjb250YWlucworICAgICAgICBhIGxpc3Qgb2Ygc3RhdGVtZW50cywgYW5kIGVuZHMgd2l0aCAnfScuCisKKyAgICAgICAgVGhlIGJsb2NrIG1heSBkZWZpbmUgbG9jYWwgdmFyaWFibGVzLiBJZiBmb3IgYSB2YXJpYWJsZSBubworICAgICAgICBpbml0aWFsaXNhdGlvbiBpcyBnaXZlbiwgdGhlIHZhcmlhYmxlIGlzIGluaXRpYWxpc2VkIHRvIDAgZXZlcnkKKyAgICAgICAgdGltZSB0aGUgYmxvY2sgaXMgZW50ZXJlZC4gT3RoZXJ3aXNlLCB0aGUgaW5pdGlhbGlzYXRpb24KKyAgICAgICAgZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQgYW5kIGl0cyByZXN1bHQgYXNzaWduZWQgdG8gdGhlIHZhcmlhYmxlCisgICAgICAgIGV2ZXJ5dGltZSB0aGUgYmxvY2sgaXMgZW50ZXJlZC4KKworICAgICAgICBFeGFtcGxlIGRlZmluaXRpb25zIGFyZToKKworICAgICAgICAgIGludCBpOworICAgICAgICAgIGludCBqID0gMzsKKyAgICAgICAgICBpbnQgayA9IDMgKiBqLCBsOworCisgICAgICAgICAgSGVyZSwgaSBhbmQgbCBhcmUgYm90aCBpbml0aWFsaXNlZCB0byAwOyBqIGlzIGluaXRpYWxpc2VkCisgICAgICAgICAgdG8gMywgYW5kIGsgaXMgaW5pdGlhbGlzZWQgdG8gOSAoMyAqIGopLgorCisgICAgICAgIExvY2FsIHZhcmlhYmxlcyBkZWZpbmVkIGluIGEgYmxvY2sgYXJlIHZpc2libGUgb25seSB1bnRpbCB0aGUKKyAgICAgICAgZW5kIG9mIHRoZSBibG9jay4gRGVmaW5pdGlvbnMgaW4gYW4gaW5uZXIgYmxvY2sgaGlkZSBkZWZpbml0aW9ucyBpbgorICAgICAgICBvdXRlciBibG9ja3MuCisKK0hJU1RPUlkKKyAgICAgICAgVXAgdG8gMy4yLjcgbG9jYWwgdmFyaWFibGVzIHdlcmUgdmlzaWJsZSAoZnJvbSB0aGVpciBwb2ludCBvZgorICAgICAgICBkZWZpbml0aW9uKSBpbiB0aGUgd2hvbGUgZnVuY3Rpb24uIFRoYXQgaXMsIGNvZGUgbGlrZQorCisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IHJlczsKKworICAgICAgICAgICAgICAgIHJlcyA9IC4uLgorICAgICAgICAgICAgfSB3aGlsZSAocmVzID09IDUpOworICAgICAgICAgICAgd3JpdGUocmVzKTsKKworICAgICAgICB3YXMgcGVyZmVjdGx5IGxlZ2FsLiBJdCBpcyBubyBsb25nZXIsIGFzICdyZXMnIGNlYXNlcyB0byBleGlzdAorICAgICAgICB3aXRoIHRoZSBjbG9zaW5nICd9JyBvZiB0aGUgd2hpbGUoKS4KKworICAgICAgICBVcCB0byAzLjUuMCB5b3UgY291bGQgZ2V0IHRoaXMgb2xkIGJlaGF2aW91ciBiYWNrIHdpdGggdGhlIAorICAgICAgICAjcHJhZ21hIG5vX2xvY2FsX3Njb3BlcyBhbmQgc3dpdGNoIGl0IG9mZiBhZ2FpbiB3aXRoIAorICAgICAgICAjcHJhZ21hIGxvY2FsX3Njb3Blcy4KKworICAgICAgICBTaW5jZSAzLjUuMCBpdCBpcyBub3QgcG9zc2libGUgdG8gZGlzYWJsZSB0aGUgbG9jYWwgc2NvcGUgYmVoYXZpb3VyLgorCisgICAgICAgIFVwIHRvIDMuMi44LCBsb2NhbCB2YXJpYWJsZXMgY291bGQgbm90IGJlIGluaXRpYWxpc2VkIGluIHRoZWlyCisgICAgICAgIGRlZmluaXRpb24uCmRpZmYgLS1naXQgYS9kb2MvTFBDL2Nsb3N1cmVfZ3VpZGUgYi9kb2MvTFBDL2Nsb3N1cmVfZ3VpZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM4YmE0NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9MUEMvY2xvc3VyZV9ndWlkZQpAQCAtMCwwICsxLDczMCBAQAorQ2xvc3VyZSBHdWlkZSBmb3IgTFBDCisKK1RhYmxlIG9mIENvbnRlbnRzCisKKyAgICAgICAgMSBJbmRyb2R1Y3Rpb24sIE92ZXJ2aWV3IGFuZCBFZnVuLUNsb3N1cmVzCisKKyAgICAgICAgMiBMZnVuLSwgSW5saW5lIGFuZCBMYW1iZGEtQ2xvc3VyZXMKKyAgICAgICAgMi4xIExmdW4tQ2xvc3VyZXMKKyAgICAgICAgMi4yIElubGluZS1DbG9zdXJlcworICAgICAgICAyLjMgTGFtYmRhLUNsb3N1cmVzCisgICAgICAgIDIuMy4xIEFkdmFudGFnZXMgb2YgTGFtYmRhLUNsb3N1cmVzCisgICAgICAgIDIuMy4yIEZyZWUgVmFyaWFibGVzIGluIExhbWJkYS1DbG9zdXJlIENvbnN0cnVjdHMKKyAgICAgICAgMi4zLjMgU3BlY2lhbCBFZnVuLUNsb3N1cmVzIGFuZCBPcGVyYXRvci1DbG9zdXJlcyBmb3IgTGFtYmRhcworICAgICAgICAyLjQgQ2xvc3VyZXMgd2l0aCBTdHJhbmdlIE5hbWVzCisgICAgICAgIDIuNSBPcGVyYXRvci1DbG9zdXJlcworICAgICAgICAyLjYgVmFyaWFibGUtQ2xvc3VyZXMKKworICAgICAgICAzIEV4YW1wbGVzCisgICAgICAgIDMuMSBMZnVuLUNsb3N1cmUKKyAgICAgICAgMy4yIExhbWJkYS1DbG9zdXJlCisKKzEgSW50cm9kdWN0aW9uLCBPdmVydmlldyBhbmQgRWZ1bi1DbG9zdXJlcworCisgIEEgY2xvc3VyZSBpcyBhIHBvaW50ZXIgdG8gYSBmdW5jdGlvbi4gVGhhdCBtZWFucyB0aGF0IGl0IGlzIGRhdGEgbGlrZSBhbgorICBpbnQgb3IgYSBzdHJpbmcgYXJlLiBJdCBtYXkgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvciBnaXZlbiB0byBhbm90aC0KKyAgZXIgZnVuY3Rpb24gYXMgYXJndW1lbnQuCisKKyAgVG8gY3JlYXRlIGEgY2xvc3VyZSB0aGF0IHBvaW50cyB0byBhbiBlZnVuIGxpa2Ugd3JpdGUoKSB5b3UgY2FuIHdyaXRlCisgIHRoZSBuYW1lIG9mIHRoZSBlZnVuIHByZXBlbmRlZCB3aXRoICJoYXNoLXRpY2siOiAjJy4gIyd3cml0ZSBpcyBhIGNsby0KKyAgc3VyZSB0aGF0IHBvaW50cyB0byB0aGUgZWZ1biB3cml0ZSgpLgorCisgIEkgdmVyeSBvZnRlbiBwdXQgcGFyZW50aGVzZXMgYXJvdW5kIHN1Y2ggYSBjbG9zdXJlLW5vdGF0aW9uIGJlY2F1c2UKKyAgb3RoZXJ3aXNlIG15IGVkaXRvciBnZXRzIGNvbmZ1c2VkIGJ5IHRoZSBoYXNobWFyazogKCMnd3JpdGUpLiBUaGlzIGlzCisgIGVzcGVjaWFsbHkgb2YgaW50ZXJlc3Qgd2l0aGluIGxhbWJkYS1jbG9zdXJlcyAoc2VlIGJlbG93KS4KKworICBBIGNsb3N1cmUgY2FuIGJlIGV2YWx1YXRlZCAod2hpY2ggbWVhbnMgdGhhdCB0aGUgZnVuY3Rpb24gaXQgcG9pbnRzIHRvCisgIGlzIGNhbGxlZCkgdXNpbmcgdGhlIGVmdW5zIGZ1bmNhbGwoKSBvciBhcHBseSgpLCB3aGljaCBhbHNvIGFsbG93IHRvCisgIGdpdmUgYXJndW1lbnRzIHRvIHRoZSBmdW5jdGlvbi4gRXhhbXBsZToKKworICAgIGZ1bmNhbGwoIyd3cml0ZSwiaGVsbG8iKTsKKworICBUaGlzIHdpbGwgcmVzdWx0IGluIHRoZSBzYW1lIGFzIHdyaXRlKCJoZWxsbyIpOyBhbG9uZS4gVGhlIHN0cmluZworICAiaGVsbG8iIGlzIGdpdmVuIGFzIGZpcnN0IChhbmQgb25seSkgYXJndW1lbnQgdG8gdGhlIGZ1bmN0aW9uIHRoZSBjbG8tCisgIHN1cmUgIyd3cml0ZSBwb2ludHMgdG8uCisKKyAgVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gdGhlIGNsb3N1cmUgcG9pbnRzIHRvIGlzIHJldHVybmVkIGJ5CisgIHRoZSBlZnVuIGZ1bmNhbGwoKSBvciBhcHBseSgpLiAoU2luY2Ugd3JpdGUoKSBhbHdheXMgcmV0dXJucyAwIHRoZSByZS0KKyAgdHVybiB2YWx1ZSBvZiB0aGUgZXhhbXBsZSBhYm92ZSB3aWxsIGJlIDAuKQorCisgIFdoYXQgYXJlIGNsb3N1cmVzIGdvb2QgZm9yPyBXaXRoIGNsb3N1cmVzIHlvdSBjYW4gbWFrZSBtdWNoIG1vcmUgdW5pdmVyLQorICBzYWxseSB1c2FibGUgZnVuY3Rpb25zLiBBIGdvb2QgZXhhbXBsZSBpcyB0aGUgZnVuY3Rpb24gZmlsdGVyKCkuCisgIEl0IGdldHMgYW4gYXJyYXkgYW5kIGEgY2xvc3VyZSBhcyBhcmd1bWVudHMuIFRoZW4gaXQgY2FsbHMgdGhlIGZ1bmN0aW9uCisgIHRoZSBjbG9zdXJlIHBvaW50cyB0byBmb3IgZWFjaCBlbGVtZW50IG9mIHRoZSBhcnJheToKKworICAgIGZpbHRlcigoeyAiYmxhIiwiZm9vIiwiYmFyIiB9KSwjJ3dyaXRlKTsKKworICBUaGlzIHdpbGwgY2FsbCB3cml0ZSgiYmxhIiksIHdyaXRlKCJmb28iKSBhbmQgd3JpdGUoImJhciIpIGluIGFueSBvcmRlcjsKKyAgdGhlIG9yZGVyIGlzIHVuZGVmaW5lZC4KKyAgKEluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHRoZSBnaXZlbiBjbG9zdXJlIGlzIGV2YWx1YXRlZCBmb3IgYWxsCisgIGVsZW1lbnRzIGZyb20gdGhlIGZpcnN0IHRvIHRoZSBsYXN0LCBzbyB0aGUgb3V0cHV0IHdpbGwgYmUgImJsYWZvb2JhciIuKQorCisgIEZ1cnRoZXJtb3JlIHRoZSBlZnVuIGZpbHRlcigpIGV4YW1pbmVzIHRoZSByZXR1cm4gdmFsdWUgb2YgZWFjaAorICBjYWxsIG9mIHRoZSBmdW5jdGlvbiB0aGUgY2xvc3VyZSBwb2ludHMgdG8gKHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlCisgIHdyaXRlKClzKS4gSWYgdGhlIHZhbHVlIGlzIHRydWUgKG5vdCAwKSB0aGVuIHRoaXMgZWxlbWVudCBpcyBwdXQgaW50bworICBhbm90aGVyIGFycmF5IHdoaWNoIGZpbHRlcigpIGJ1aWxkcyB1cC4gSWYgdGhlIHJldHVybiB2YWx1ZSBpcworICBmYWxzZSAoPT0gMCkgdGhlbiB0aGlzIGVsZW1lbnQgaXMgX25vdF8gcHV0IGludG8gdGhpcyBhcnJheS4gV2hlbiBhbGwKKyAgY2FsbHMgYXJlIGRvbmUgdGhlIHNsb3dseSBidWlsdCB1cCBhcnJheSBpcyByZXR1cm5lZC4gVGh1cywKKyAgZmlsdGVyKCkgZmlsdGVycyBmcm9tIHRoZSBnaXZlbiBhcnJheSBhbGwgZWxlbWVudHMgdGhhdCB0aGUgZ2l2ZW4KKyAgY2xvc3VyZSBldmFsdWF0ZXMgInRydWUiIGZvciBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiB0aG9zZS4gKFRoZSBhcnJheQorICBnaXZlbiB0byBmaWx0ZXIoKSBpdHNlbGYgaXMgX25vdF8gY2hhbmdlZCEpCisKKyAgQSBtb3JlIHNlbnNpY2FsIGV4YW1wbGUgZm9yIGZpbHRlcndvdWxkIGJlIHRoaXM6CisKKyAgICB4ID0gZmlsdGVyKHVzZXJzKCksIydxdWVyeV9pc193aXphcmQpOworCisgIHVzZXJzKCkgaXMgYW4gZWZ1biB0aGF0IGdldHMgbm8gYXJndW1lbnRzIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIGFsbAorICBsb2dnZWQgaW4gcGxheWVycyAod2l6YXJkcyBhbmQgcGxheWVycykuIHF1ZXJ5X2lzX3dpemFyZCgpIGlzIGEKKyAgc2ltdWxfZWZ1biB0aGF0IGdldHMgYW4gb2JqZWN0IGFzIGZpcnN0IChhbmQgb25seSkgYXJndW1lbnQgYW5kIHJldHVybnMKKyAgdHJ1ZSAoMSkgaWYgdGhpcyBvYmplY3QgaXMgYSB3aXphcmQgYW5kIDAgb3RoZXJ3aXNlLgorCisgIFNvLCBmb3IgZWFjaCBlbGVtZW50IG9mIHRoZSBhcnJheSByZXR1cm5lZCBieSB1c2VycygpIHRoZSBmdW5jdGlvbgorICBxdWVyeV9pc193aXphcmQoKSBpcyBjYWxsZWQgYW5kIG9ubHkgdGhvc2UgZm9yIHdoaWNoIDEgd2FzIHJldHVybmVkIGFyZQorICBjb2xsZWN0ZWQgaW50byB0aGUgcmVzdWx0IGFuZCB0aGVuIHB1dCBpbnRvIHRoZSB2YXJpYWJsZSB4LgorCisgIFdlIG5vdyBoYXZlIGFsbCBsb2dnZWQgaW4gd2l6YXJkcyBzdG9yZWQgYXMgYXJyYXkgaW4gdGhlIHZhcmlhYmxlIHguCisKKyAgQW5vdGhlciBleGFtcGxlOiBXZSB3YW50IHRvIGZpbHRlciBvdXQgYWxsIG51bWJlcnMgdGhhdCBhcmUgZ3JlYXRlciB0aGFuCisgIDQyIGZyb20gdGhlIGFycmF5IGEgb2YgaW50ZWdlcnM6CisKKyAgICB4ID0gZmlsdGVyKCh7IDEwLDUwLDMwLDcwIH0pLCMnPiw0Mik7CisKKyAgKHggd2lsbCBub3cgYmUgKHsgNTAsNzAgfSkuKQorCisgIEhlcmUgdHdvIHRoaW5ncyBhcmUgbmV3OiBmaXJzdDogd2UgY3JlYXRlIGEgY2xvc3VyZSB0aGF0IHBvaW50cyB0byBhbgorICBvcGVyYXRvcjsgc2Vjb25kOiB3ZSB1c2UgdGhlIHBvc3NpYmlsaXR5IHRvIGdpdmUgZXh0cmEgYXJndW1lbnRzIHRvCisgIGZpbHRlcigpLgorCisgIExpa2UgYWxsIGVmdW5zIHRoZSB1c3VhbCBvcGVyYXRvcnMgY2FuIGJlIHBvaW50ZWQgdG8gd2l0aCBhIGNsb3N1cmUgYnkKKyAgcHJlcGVuZGluZyAjJyB0byB0aGVtLiBmdW5jYWxsKCMnPiw0LDUpIGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgKDQ+NSkuCisKKyAgVGhlIGV4dHJhIGFyZ3VtZW50cyBnaXZlbiBhcyB0aGlyZCB0byBsYXN0IGFyZ3VtZW50IChhcyBtYW55IGFzIHlvdQorICBsaWtlKSB0byBmaWx0ZXIoKSBhcmUgZ2l2ZW4gYXMgc2Vjb25kIHRvIGxhc3QgYXJndW1lbnQgdG8gdGhlCisgIGZ1bmN0aW9uIHBvaW50ZWQgdG8gYnkgdGhlIGNsb3N1cmUgZWFjaCB0aW1lIGl0IGlzIGNhbGxlZC4KKworICBUaHVzIHdlIG5vdyBjYWxsICgoeyAxMCw1MCwzMCw3MCB9KVswXT40MiksICgoeyAxMCw1MCwzMCw3MCB9KVsxXT40MikgLi4uCisgICh3aGljaCBpcyAoMTA+NDIpLCAoNTA+NDIpIC4uLikgYW5kIHJldHVybiBhbiBhcnJheSBvZiBhbGwgZWxlbWVudHMgdGhpcworICByZXR1cm5zIHRydWUgZm9yIGFuZCBzdG9yZSBpdCBpbnRvIHguCisKKyAgSWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgY2xvc3VyZSB0byBhbiBlZnVuIG9mIHdoaWNoIHlvdSBoYXZlIHRoZSBuYW1lCisgIHN0b3JlZCBpbiBhIHN0cmluZyB5b3UgY2FuIGNyZWF0ZSBzdWNoIGFuIGVmdW4tY2xvc3VyZSB3aXRoIHRoZSBlZnVuCisgIHN5bWJvbF9mdW5jdGlvbigpOgorCisgICAgc3ltYm9sX2Z1bmN0aW9uKCJ3cml0ZSIpIC8vIHRoaXMgd2lsbCByZXR1cm4gIyd3cml0ZQorCisgICAgZnVuY2FsbChzeW1ib2xfZnVuY3Rpb24oIndyaXRlIiksImZvb2JhciIpOyAgLy8gPT0gd3JpdGUoImZvb2JhciIpOworCisgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgdmVyeSBvZnRlbiBvY2N1ciBpbiBub3JtYWwgY29kZSBidXQgaXQgaXMgdmVyeQorICB1c2VmdWwgZm9yIHRvb2wtcHJvZ3JhbW1pbmcgKGVnIHRoZSByb2JlIHVzZXMgc3ltYm9sX2Z1bmN0aW9uKCkgdG8gYWxsb3cKKyAgeW91IGNhbGwgYW55IGVmdW4geW91IGdpdmUpLgorCisyIExmdW4tIGFuZCBMYW1iZGEtQ2xvc3VyZXMKKworICBWZXJ5IG9mdGVuIHRoZSBwb3NzaWJpbGl0aWVzIGNsb3N1cmVzIHRvIGVmdW5zIG9mZmVyIGFyZSBub3Qgc3VmZmljaWVudAorICBmb3IgdGhlIHB1cnBvc2Ugb25lIGhhcy4gSW4gbmVhcmx5IGFsbCBjYXNlcyB0aHJlZSBwb3NzaWJpbGl0aWVzIGV4aXN0IGluCisgIHN1Y2ggY2FzZXM6IHVzZSBhbiBsZnVuLSBvciBpbmxpbmUtY2xvc3VyZSwgb3IgYSBsYW1iZGEtY2xvc3VyZS4KKworMi4xIExmdW4tQ2xvc3VyZXMKKworICAgIFRoZSBmaXJzdCBwb3NzaWJpbGl0eSBpcyByYXRoZXIgZWFzeTogbGlrZSB3aXRoIHRoZSBlZnVuLWNsb3N1cmVzIHlvdQorICAgIGNhbiBjcmVhdGUgYSBwb2ludGVyIHRvIGEgZnVuY3Rpb24gaW4gdGhlIHNhbWUgb2JqZWN0IHlvdSBhcmUgYnkgdXNpbmcKKyAgICB0aGUgIycgdG8gcHJlcGVuZCBpdCB0byBhIGZ1bmN0aW9uIG5hbWUgb2YgYSBmdW5jdGlvbiBkZWNsYXJlZCBhYm92ZS4KKyAgICBFeGFtcGxlOgorCisgICAgICBzdGF0dXMgZm9vKGludCB4KSB7CisgICAgICAgIHJldHVybiAoKHgqMikgPiA0Mik7CisgICAgICB9CisKKyAgICAgIGludCAqYmFyKCkgeworICAgICAgICByZXR1cm4gZmlsdGVyKCh7IDEwLDUwLDMwLDcwIH0pLCMnZm9vKTsKKyAgICAgIH0KKworICAgIFRodXMsICMnZm9vIGlzIHVzZWQgbGlrZSB0aGVyZSB3YXMgYW4gZWZ1biBvZiB0aGlzIG5hbWUgYW5kIGRvaW5nIHRoZQorICAgIGpvYiB0aGF0IGlzIGRvbmUgaW4gZm9vKCkuCisKKzIuMiBJbmxpbmUgQ2xvc3VyZQorCisgICAgSW5saW5lIGNsb3N1cmVzIGFyZSBhIHZhcmlhbnQgb2YgbGZ1biBjbG9zdXJlcywgdGhlIGRpZmZlcmVuY2UgYmVpbmcKKyAgICB0aGF0IHRoZSBmdW5jdGlvbiB0ZXh0IGlzIHdyaXR0ZW4gcmlnaHQgd2hlcmUgdGhlIGNsb3N1cmUgaXMgdXNlZCwKKyAgICBlbmNsb3NlZCBpbiBhIHBhaXIgb2YgJyg6JyBhbmQgJzopJy4gVGhlIGNvbXBpbGVyIHdpbGwgdGhlbiB0YWtlIGNhcmUKKyAgICBvZiBjcmVhdGluZyBhIHByb3BlciBsZnVuIGFuZCBsZnVuLWNsb3N1cmUuIFRoZSBhcmd1bWVudHMgcGFzc2VkIHRvCisgICAgc3VjaCBhbiBpbmxpbmUgY2xvc3VyZSBhcmUgYWNjZXNzaWJsZSBieSBwb3NpdGlvbjogJDEgd291bGQgYmUgdGhlCisgICAgZmlyc3QgYXJndW1lbnQsICQyIHRoZSBzZWNvbmQsIGFuZCBzbyBvbi4gV2l0aCB0aGlzLCB0aGUKKyAgICBhYm92ZSBleGFtcGxlIHdvdWxkIHJlYWQ6CisKKyAgICAgIGludCAqIGJhcigpIHsKKyAgICAgICAgcmV0dXJuIGZpbHRlcigoeyAxMCw1MCwzMCw3MCB9KSwgKDogKCQxICogMikgPiA0MiA6KSk7CisgICAgICB9CisKKyAgICBvciBhbHRlcm5hdGl2ZWx5OgorCisgICAgICBpbnQgKiBiYXIoKSB7CisgICAgICAgIHJldHVybiBmaWx0ZXIoKHsgMTAsNTAsMzAsNzAgfSksICg6IHJldHVybiAoJDEgKiAyKSA+IDQyOyA6KSk7CisgICAgICB9CisKKyAgICBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gdmVyc2lvbnMgaXMgdGhhdCBpbiB0aGUgZmlyc3QgZm9ybSB0aGUgdGV4dAorICAgIG9mIHRoZSBpbmxpbmUgY2xvc3VyZSBtdXN0IGJlIGFuIGV4cHJlc3Npb24gb25seSwgd2hlcmVhcyBpbiB0aGUgc2Vjb25kCisgICAgZm9ybSBhbnkgbGVnYWwgc3RhdGVtZW50IGlzIGFsbG93ZWQuIFRoZSBjb21waWxlciBkaXN0aW5ndWlzaGVzIHRoZSB0d28KKyAgICBmb3JtcyBieSB0aGUgbGFzdCBjaGFyYWN0ZXIgYmVmb3JlIHRoZSAnOiknOiBpZiBpdCdzIGEgJzsnIG9yICd9JywgdGhlCisgICAgY29tcGlsZXIgdHJlYXRzIHRoZSBjbG9zdXJlIGFzIHN0YXRlbWVudChzKSwgb3RoZXJ3aXNlIGFzIGV4cHJlc3Npb24uCisKKyAgICBJbmxpbmUgY2xvc3VyZXMgbWF5IGFsc28gbmVzdGVkLCBzbyB0aGF0IHRoZSBmb2xsb3dpbmcgKG5vdCB2ZXJ5IHVzZWZ1bCkKKyAgICBleGFtcGxlIGlzIGxlZ2FsLCB0b286CisKKyAgICAgIHJldHVybiBmaWx0ZXIoICh7IDEwLCA1MCwgMzAsIDcwIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgLCAoOiBzdHJpbmcgKnM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gbWFwKHVzZXJzKCksICg6ICQxLT5xdWVyeV9uYW1lKCkgOikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNbcmFuZG9tKHNpemVvZihzKSldICsgKCQxICogMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOikpOworCisgICAgVGhlIG5vdGF0aW9uIG9mIGlubGluZSBjbG9zdXJlcyBpcyBtb2RlbGxlZCBhZnRlciB0aGUgTXVkT1MgZnVuY3Rpb25hbHMsCisgICAgYnV0IHRoZXJlIGFyZSBhIGZldyBpbXBvcnRhbnQgZGlmZmVyZW5jZXMgaW4gYmVoYXZpb3VyLgorCisKKzIuMyBMYW1iZGEtQ2xvc3VyZXMKKworICAgIExhbWJkYS1DbG9zdXJlcyB0YWtlIHRoZSBpZGVhIG9mICdkZWZpbmUgaXQgd2hlcmUgeW91IHVzZSBpdCcgb25lIHN0ZXAKKyAgICBmdXJ0aGVyLiBPbiBmaXJzdCBnbGFuY2UgdGhleSBtYXkgbG9vayBsaWtlIGlubGluZSBjbG9zdXJlcyB3aXRoIGFuIHVnbGllcgorICAgIG5vdGF0aW9uLCBidXQgdGhleSBvZmZlciBhIGZldyBpbmNyZWFzZWQgcG9zc2liaWxpdGllcy4gQnV0IGZpcnN0IHRoaW5ncworICAgIGZpcnN0LgorCisgICAgVGhlIGVmdW4gbGFtYmRhKCkgY3JlYXRlcyBhIGZ1bmN0aW9uIHRlbXBvcmFyaWx5IGFuZCByZXR1cm5zIGEgY2xvc3VyZQorICAgIHBvaW50aW5nIHRvIHRoaXMgZnVuY3Rpb24uIGxhbWJkYSgpIHRoZXJlZm9yIGdldHMgdHdvIGFycmF5cyBhcworICAgIGFyZ3VtZW50cywgdGhlIGZpcnN0IGlzIGEgbGlzdCBvZiBhbGwgYXJndW1lbnRzIHRoZSBmdW5jdGlvbiBzaGFsbCBleHBlY3QKKyAgICBhbmQgdGhlIHNlY29uZCBhcnJheSBpcyB0aGUgY29kZSBvZiB0aGUgZnVuY3Rpb24gKGluIGEgbW9yZSBvciBsZXNzCisgICAgY29tcGxpY2F0ZWQgZm9ybTsgYXQgbGVhc3Qgbm90IGluIEMtIG9yIExQQy1zeW50YXgpLiBUaGUgY2xvc3VyZSAjJ2ZvbworICAgIGZyb20gdGhlIGV4YW1wbGUgYWJvdmUgY291bGQgYmUgbm90YXRlZCBhcyBsYW1iZGEtY2xvc3VyZToKKworICAgICAgbGFtYmRhKCh7ICd4IH0pLCh7ICgjJz4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICh7ICgjJyopLCd4LDIgfSksCisgICAgICAgICAgICAgICAgICAgICAgICAgNDIKKyAgICAgICAgICAgICAgICAgICAgICB9KSkKKworICAgIE5vdywgdGhlIGZpcnN0IGFyZ3VtZW50IGlzICh7ICd4IH0pLCBhbiBhcnJheSBvZiBhbGwgYXJndW1lbnRzIHRoZQorICAgIGZ1bmN0aW9uIHNoYWxsIGV4cGVjdDogMSBhcmd1bWVudCAoY2FsbGVkICd4KSBpcyBleHBlY3RlZC4gTm90aWNlIHRoZQorICAgIHN0cmFuZ2Ugbm90YXRpb24gZm9yIHRoaXMgYXJndW1lbnQgd2l0aCBvbmUgc2luZ2xlIGxlYWRpbmcgdGljay4gTGlrZQorICAgIFRoZSBoYXNoLXRpY2sgdG8gZGVub3RlIGNsb3N1cmVzIHRoZSBsZWFkaW5nIHRpY2sgaXMgdXNlZCB0byBkZW5vdGUKKyAgICB0aGluZ3MgY2FsbGVkICJzeW1ib2xzIi4gVGhleSBkbyBub3QgZGlmZmVyIG11Y2ggZnJvbSBzdHJpbmdzIGFuZCBpZgorICAgIHlvdSBkbyBub3Qgd2FudCB0byBoYXZlIGEgZGVlcGVyIGxvb2sgaW50byBjbG9zdXJlcyB5b3UgY2FuIGxlYXZlIGl0CisgICAgdGhpcyB3YXkuCisKKyAgICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIGFuIGFycmF5LiBUaGUgZmlyc3QgZWxlbWVudCBvZiBzdWNoIGFuIGFycmF5CisgICAgbXVzdCBiZSBhbiBlZnVuLSBvciBhbiBsZnVuLWNsb3N1cmUsIHRoZSBmdXJ0aGVyIGVsZW1lbnRzIGFyZSB0aGUKKyAgICBhcmd1bWVudHMgZm9yIHRoZSBmdW5jdGlvbiB0aGlzIGNsb3N1cmUgcG9pbnRzIHRvLiBJZiBzdWNoIGFuIGFyZ3UtCisgICAgbWVudCBpcyBhbiBhcnJheSwgaXQgaXMgdHJlYXRlZCBhbGlrZTsgdGhlIGZpcnN0IGVsZW1lbnQgbXVzdCBiZSBhCisgICAgY2xvc3VyZSBhbmQgdGhlIHJlbWFpbmluZyBlbGVtZW50cyBhcmUgYXJndW1lbnRzICh3aGljaCBvZiBjb3Vyc2UKKyAgICBhbHNvIG1pZ2h0IGJlIGFycmF5cyAuLi4pLgorCisgICAgVGhpcyBsZWFkcyB0byBhIHByb2JsZW06IHNvbWV0aW1lcyB5b3Ugd2FudCB0byBnaXZlIGFuIGFycmF5IGFzIGFuCisgICAgYXJndW1lbnQgdG8gYSBmdW5jdGlvbi4gQnV0IGFycmF5cyBpbiBhbiBhcnJheSBnaXZlbiB0byBsYW1iZGEoKSBhcmUKKyAgICBpbnRlcnByZXRlZCBhcyBjb2RlLWFycmF5cy4gVG8gYWxsb3cgeW91IHRvIGdpdmUgYW4gYXJyYXkgYXMgYW4gYXJndS0KKyAgICBtZW50IHdpdGhpbiBhbiBhcnJheSBnaXZlbiB0byBsYW1iZGEoKSwgeW91IGNhbiB1c2UgdGhlIGZ1bmN0aW9uCisgICAgcXVvdGUoKSB0byBtYWtlIHlvdXIgYXJyYXkgdG8gYSBxdW90ZWQgYXJyYXkgKGEgcXVvdGVkIGFycmF5IGlzIGZvcgorICAgIGFuIGFycmF5IHdoYXQgYSBzeW1ib2wgaXMgZm9yIGEgc3RyaW5nKToKKworICAgICAgbGFtYmRhKDAsKHsgKCMnc2l6ZW9mKSwKKyAgICAgICAgICAgICAgICAgIHF1b3RlKCh7IDEwLDUwLDMwLDcwIH0pKQorICAgICAgICAgICAgICAgfSkpCisKKyAgICBGb3IgYXJyYXkgY29uc3RhbnRzLCB5b3UgY2FuIGFsc28gdXNlIGEgc2luZ2xlIHF1b3RlIHRvIHRoZSBzYW1lCisgICAgZWZmZWN0OgorCisgICAgICBsYW1iZGEoMCwoeyAoIydzaXplb2YpLAorICAgICAgICAgICAgICAgICAgJyh7IDEwLDUwLDMwLDcwIH0pCisgICAgICAgICAgICAgICB9KSkKKworICAgIFRoaXMgbGFtYmRhLWNsb3N1cmUgcG9pbnRzIHRvIGEgZnVuY3Rpb24gdGhhdCB3aWxsIHJldHVybiA0IChpdCB3aWxsCisgICAgY2FsbCBzaXplb2YoKSBmb3IgdGhlIGFycmF5ICh7IDEwLDUwLDMwLDcwIH0pKS4gQW5vdGhlciB0aGluZzogaWYKKyAgICB3ZSB3YW50IHRvIGNyZWF0ZSBhIGZ1bmN0aW9uIHRoYXQgZXhwZWN0cyBubyBhcmd1bWVudHMsIHdlIGNhbiBnaXZlCisgICAgYW4gZW1wdHkgYXJyYXkgYXMgZmlyc3QgYXJndW1lbnQgdG8gbGFtYmRhKCkgYnV0IHdlIGNhbiBnaXZlIDAgYXMKKyAgICB3ZWxsIHRvIGF0dGFpbiB0aGlzLiBUaGlzIGlzIGp1c3QgYW4gYWJicmV2aWF0aW9uLgorCisgICAgTGFtYmRhLWNsb3N1cmUgY29uc3RydWN0cyBjYW4gYmVjb21lIHF1aXRlIGxhcmdlIGFuZCBoYXJkIHRvIHJlYWQuIFRoZQorICAgIGxhcmdlciB0aGV5IGJlY29tZSB0aGUgaGFyZGVyIHRoZSBjb2RlIGlzIHRvIHJlYWQgYW5kIHlvdSBzaG91bGQgYXZvaWQKKyAgICBleHRyZW1lIGNhc2VzLiBWZXJ5IG9mdGVuIHRoZSBwb3NzaWJpbGl0eSB0byB1c2UgYW4gbGZ1biBvciBhbiBpbmxpbmUKKyAgICBpbnN0ZWFkIG9mIGEgbGFyZ2UgbGFtYmRhIHNob3J0ZW5zIHRoZSBjb2RlIGRyYW1hdGljYWxseS4gRXhhbXBsZToKKworICAgICAgc3RhdHVzIGZvbyhvYmplY3QgbykgeworICAgICAgICByZXR1cm4gZW52aXJvbm1lbnQobyktPnF1ZXJ5X2xldmVsKCk+V0xfQVBQUkVOVElDRTsKKyAgICAgIH0KKworICAgICAgeD1maWx0ZXIoYSwjJ2Zvbyk7CisKKyAgICBkb2VzIHRoZSBzYW1lIGFzCisKKyAgICAgIHg9ZmlsdGVyKGEsbGFtYmRhKCh7ICdvIH0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHsgKCMnPiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeyAoIydjYWxsX290aGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7ICgjJ2Vudmlyb25tZW50KSwnbyB9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJxdWVyeV9sZXZlbCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xfQVBQUkVOVElDRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpKTsKKworICAgIChOb3RlIHRoYXQgdGhlIHN5bnRheCB3aXRoIHRoZSBhcnJvdyAiLT4iIGZvciBjYWxsX290aGVyKClzIGNhbm5vdCBiZQorICAgIHVzZWQsICMnLT4gZG9lcyBub3QgZXhpc3QuIFlvdSBoYXZlIHRvIHVzZSAjJ2NhbGxfb3RoZXIgZm9yIHRoaXMgYW5kCisgICAgZ2l2ZSB0aGUgbmFtZSBvZiB0aGUgbGZ1biB0byBiZSBjYWxsZWQgYXMgYSBzdHJpbmcuKQorCisgICAgVGhpcyBleGFtcGxlIGFsc28gZGVtb25zdHJhdGVzIHRoZSB0d28gZGlzYWR2YW50YWdlcyBvZiBsYW1iZGEgY2xvc3VyZXMuCisgICAgRmlyc3QsIHRoZXkgYXJlIHZlcnkgZGlmZmljdWx0IHRvIHJlYWQsIGV2ZW4gZm9yIGEgc2ltcGxlIGV4YW1wbGUgbGlrZQorICAgIHRoaXMuIFNlY29uZCwgdGhlIGxhbWJkYSBjbG9zdXJlIGlzIHJlLWNyZWF0ZWQgZXZlcnl0aW1lIHRoZQorICAgIGZpbHRlcigpIGlzIGV4ZWN1dGVkLCBldmVuIHRob3VnaCB0aGUgY3JlYXRlZCBjb2RlIGlzIGFsd2F5cyB0aGUKKyAgICBzYW1lLgorCisgICAgJ1doeSB1c2UgbGFtYmRhcyBhdCBhbGwgdGhlbj8nIHlvdSBtYXkgYXNrIG5vdy4gV2VsbCwgcmVhZCBvbi4KKworCisyLjMuMSBBZHZhbnRhZ2VzIG9mIExhbWJkYSBDbG9zdXJlcworCisgICAgVGhlIGFkdmFudGFnZXMgb2YgbGFtYmRhcyBzdGVtIGZyb20gdGhlIGZhY3QgdGhhdCB0aGV5IGFyZSBjcmVhdGVkCisgICAgYXQgcnVudGltZSBmcm9tIG5vcm1hbCBhcnJheXMuCisKKyAgICBUaGlzIG1lYW5zIHRoYXQgdGhlIGJlaGF2aW91ciBvZiBhIGxhbWJkYSBjYW4gYmUgbWFkZSBkZXBlbmRhbnQgb24gZGF0YQorICAgIGF2YWlsYWJsZSBvbmx5IGF0IHJ1bnRpbWUuIEZvciBleGFtcGxlOgorCisgICAgICBjbG9zdXJlIGM7CisgICAgICBjID0gbGFtYmRhKDAsICh7IyctLCAoeyAjJ3RpbWUgfSksIHRpbWUoKSB9KSApOworCisgICAgV2hlbmV2ZXIgeW91IG5vdyBjYWxsIHRoaXMgY2xvc3VyZSAoJ2Z1bmNhbGwoYyknKSBpdCB3aWxsIHJldHVybiB0aGUKKyAgICBlbGFwc2VkIHRpbWUgc2luY2UgdGhlIGNsb3N1cmUgd2FzIGNyZWF0ZWQuCisKKyAgICBUaGUgc2Vjb25kIGFkdmFudGFnZSBvZiBsYW1iZGFzIGlzIHRoYXQgdGhlIGFycmF5cyBmcm9tIHdoaWNoIHRoZXkKKyAgICBhcmUgY29tcGlsZWQgY2FuIGJlIGNvbnN0cnVjdGVkIGF0IHJ1bnRpbWUuIEltYWdpbmUgYSBjdXN0b21pemFibGUgcHJvbXB0CisgICAgd2hpY2ggY2FuIGJlIGNvbmZpZ3VyZWQgdG8gZGlzcGxheSB0aGUgdGltZSwgdGhlIGVudmlyb25tZW50LCBvciBib3RoOgorCisgICAgICBtaXhlZCBjb2RlOworCisgICAgICBjb2RlID0gKHsgIj4gIiB9KTsKKyAgICAgIGlmICh1c2VyX3dhbnRzX3RpbWUpCisgICAgICAgIGNvZGUgPSAoeyAjJyssICh7ICMnY3RpbWUgfSksIGNvZGUgfSk7CisgICAgICBpZiAodXNlcl93YW50c19lbnZpcm9ubWVudCkKKyAgICAgICAgY29kZSA9ICh7ICMnKywgKHsjJ3RvX3N0cmluZywgKHsjJ2Vudmlyb25tZW50LCAoeyMndGhpc19wbGF5ZXIgfSkgfSkgfSkKKyAgICAgICAgICAgICAgICAgICAgICwgY29kZSB9KTsKKyAgICAgIHNldF9wcm9tcHQobGFtYmRhKDAsIGNvZGUpKTsKKworCisyLjMuMiBGcmVlIFZhcmlhYmxlcyBpbiBMYW1iZGEtQ2xvc3VyZSBDb25zdHJ1Y3RzCisKKyAgICAgIFlvdSBjYW4gdXNlIGxvY2FsIHZhcmlhYmxlcyBpbiBsYW1iZGEgY29uc3RydWN0cyB3aXRob3V0IGRlY2xhcmluZworICAgICAgdGhlbSwganVzdCB1c2UgdGhlbS4gVGhlIG9ubHkgbGltaXRhdGlvbiBpcyB0aGF0IHlvdSBhdCBmaXJzdCBoYXZlCisgICAgICB0byBhc3NpZ24gc29tZXRoaW5nIHRvIHRoZW0uIEdpdmUgdGhlbSBhcyBzeW1ib2xzIGxpa2UgeW91IGRvIHdpdGgKKyAgICAgIHRoZSBhcmd1bWVudHMuIFRoaXMgZmVhdHVyZSBkb2VzIG5vdCBtYWtlIG11Y2ggc2Vuc2Ugd2l0aG91dCB0aGUgdXNlCisgICAgICBvZiBjb21wbGV4ZXIgZmxvdyBjb250cm9sbGluZyBmZWF0dXJlcyBkZXNjcmliZWQgYmVsb3cuCisKKyAgICAgIFRoZSBjbG9zdXJlICMnPSBpcyB1c2VkIHRvIGFzc2lnbiBhIHZhbHVlIHRvIHNvbWV0aGluZyAobGlrZSB0aGUKKyAgICAgIExQQy1vcGVyYXRvciA9IGlzKS4KKworMi4zLjMgU3BlY2lhbCBFZnVuLUNsb3N1cmVzIGFuZCBPcGVyYXRvci1DbG9zdXJlcyBmb3IgTGFtYmRhcworCisgICAgICBUaGVyZSBhcmUgc29tZSBzcGVjaWFsIGNsb3N1cmVzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIHVzZWQgb25seQorICAgICAgd2l0aGluIGEgbGFtYmRhIGNvbnN0cnVjdC4gV2l0aCB0aGVtIHlvdSBjYW4gY3JlYXRlIG5lYXJseSBhbGwgY29kZQorICAgICAgeW91IGNhbiB3aXRoIHJlZ3VsYXIgTFBDLWNvZGUgbGlrZSBsb29wcyBhbmQgY29uZGl0aW9ucy4KKworICAgICAgIyc/IGFjdHMgbGlrZSB0aGUgImlmIiBzdGF0ZW1lbnQgaW4gTFBDLiBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlCisgICAgICAgICAgY29uZGl0aW9uLCB0aGUgc2Vjb25kIGlzIHRoZSBjb2RlIHRvIGJlIGV4ZWN1dGVkIGlmIHRoZSBjb25kaXRpb24KKyAgICAgICAgICByZXR1cm5zIHRydWUuIFRoZSBmb2xsb3dpbmcgYXJndW1lbnRzIGNhbiBhbHNvIGJlIHN1Y2ggY291cGxlcyBvZgorICAgICAgICAgIGNvZGUtYXJyYXlzIHRoYXQgc3RhdGUgYSBjb25kaXRpb24gYW5kIGEgcG9zc2libGUgcmVzdWx0LiBJZiBhdAorICAgICAgICAgIHRoZSBlbmQgdGhlcmUgaXMgYSBzaW5nbGUgYXJndW1lbnQsIGl0IGlzIHVzZWQgYXMgdGhlIGVsc2UtY2FzZQorICAgICAgICAgIGlmIG5vIGNvbmRpdGlvbiByZXR1cm5lZCB0cnVlLgorCisgICAgICAgICAgbGFtYmRhKCh7ICd4IH0pLCh7ICgjJz8pLCAgICAgICAgICAgICAvLyBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeyAoIyc+KSwneCw1IH0pLCAgLy8gICAgKHggPiA1KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeyAoIycqKSwneCwyIH0pLCAgLy8gICAgICAgcmVzdWx0IGlzIHggKiAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeyAoIyc8KSwneCwtNSB9KSwgLy8gZWxzZSBpZiAoeCA8IC01KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeyAoIycvKSwneCwyIH0pLCAgLy8gICAgcmVzdWx0IGlzIHgvMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ggICAgICAgICAgICAgICAgIC8vIGVsc2UgcmVzdWx0IGlzIHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKQorCisgICAgICAjJz8hIGlzIGxpa2UgdGhlICMnPyBidXQgaXQgbmVnYXRlcyBhbGwgY29uZGl0aW9ucyBhZnRlciBldmFsdWF0aW9uCisgICAgICAgICAgIGFuZCB0aHVzIGlzIGxpa2UgYW4gaWZub3QgaW4gTFBDIChpZiB0aGVyZSB3ZXJlIG9uZSkuCisKKyAgICAgICMnLCAod2hpY2ggbG9va3MgYSBiaXQgc3RyYW5nZSkgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIGNvbW1hLW9wZXJhdG9yCisgICAgICAgICAgaW4gTFBDIGFuZCBzYXlzOiBldmFsdWF0ZSBhbGwgYXJndW1lbnRzIGFuZCByZXR1cm4gdGhlIHZhbHVlIG9mCisgICAgICAgICAgdGhlIGxhc3QuIEl0IGlzIHVzZWQgdG8gZG8gc2V2ZXJhbCB0aGluZ3MgaW5zaWRlIGEgbGFtYmRhLWNsb3N1cmUuCisKKyAgICAgICAgICBsYW1iZGEoKHsgJ3ggfSksKHsgKCMnLCksICAvLyB0d28gY29tbWFzIG5lY2Vzc2FyeSEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmUgZm9yIHRoZSBjbG9zdXJlIGFuZCBvbmUgYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxpbWl0ZXIgaW4gdGhlIGFycmF5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7ICgjJ3dyaXRlKSwiaGVsbG8gd29ybGQhIiB9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHsgKCMnc2F5KSwiRm9vYmFyLiIgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpCisKKyAgICAgICMnd2hpbGUgYWN0cyBsaWtlIHRoZSBMUEMgc3RhdGVtZW50ICJ3aGlsZSIgYW5kIHJlcGVhdHMgZXhlY3V0aW5nIG9uZQorICAgICAgICAgICAgICBjb2RlLWFycmF5IHdoaWxlIGFub3RoZXIgcmV0dXJucyB0cnVlLgorICAgICAgICAgICAgICAjJ3doaWxlIGV4cGVjdHMgdHdvIG9yIG1vcmUgYXJndW1lbnRzOiB0aGUgY29uZGl0aW9uIGFzIGZpcnN0CisgICAgICAgICAgICAgIGFyZ3VtZW50LCB0aGVuIHRoZSByZXN1bHQgdGhlIHdob2xlIGV4cHJlc3Npb24gc2hhbGwgaGF2ZSBhZnRlcgorICAgICAgICAgICAgICB0aGUgY29uZGl0aW9uIHR1cm5zIGZhbHNlICh0aGlzIGlzIGluIG1hbnkgY2FzZXMgb2Ygbm8gaW50ZXJlc3QpCisgICAgICAgICAgICAgIGFuZCBhcyB0aGlyZCB0byBsYXN0IGFyZ3VtZW50IHRoZSBib2R5IG9mIHRoZSBsb29wLgorCisgICAgICAgICAgICAgIGxhbWJkYSgwLCh7ICgjJywpLCAgICAgICAgICAgIC8vIHNldmVyYWwgdGhpbmdzIHRvIGRvIC4uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAoeyAoIyc9KSwnaSwwIH0pLCAgICAvLyBpIGlzIGEgbG9jYWwgdmFyaWFibGUgb2YgdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsYW1iZGEtY2xvc3VyZSBhbmQgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZWQgd2l0aCAwIG5vdy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHsgKCMnd2hpbGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeyAoIyc8KSwnaSwxMCB9KSwgICAvLyBjb25kaXRpb246IGkgPCAxMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MiwgICAgICAgICAgICAgICAgICAvLyByZXN1bHQgaXMgbm90IGludGVyZXN0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgd2UgbXVzdCBnaXZlIG9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeyAoIyd3cml0ZSksJ2kgfSksICAvLyBnaXZlIG91dCBpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7ICgjJys9KSwnaSwxIH0pICAgIC8vIGluY3JlYXNlIGkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgfSkpCisKKyAgICAgICAgICAgICAgIFRoZSBmdW5jdGlvbiB0aGlzIGNsb3N1cmUgcG9pbnRzIHRvIHdpbGwgZ2l2ZSBvdXQgdGhlCisgICAgICAgICAgICAgICBudW1iZXJzIGZyb20gMCB0byA5IGFuZCB0aGVuIHJldHVybiA0Mi4KKworICAgICAgIydkbyBpcyBsaWtlIHRoZSBkby13aGlsZSBzdGF0ZW1lbnQgaW4gTFBDIGFuZCBpcyB2ZXJ5IG11Y2ggbGlrZSB0aGUKKyAgICAgICAgICAgIyd3aGlsZS4gVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCAjJ3doaWxlIHRlc3RzIHRoZSBjb25kaXRpb24gYWwtCisgICAgICAgICAgIHJlYWR5IGJlZm9yZSB0aGUgYm9keSBpcyBldmFsdWF0ZWQgZm9yIHRoZSBmaXJzdCB0aW1lLCB0aGlzIG1lYW5zCisgICAgICAgICAgIHRoYXQgdGhlIGJvZHkgbWlnaHQgbm90IGJlIGV2YWx1YXRlZCBldmVuIG9uY2UuICMnZG8gZXZhbHVhdGVzCisgICAgICAgICAgIHRoZSBib2R5IGZpcnN0IGFuZCB0aGVuIHRoZSBjb25kaXRpb24sIHRodXMgdGhlIGJvZHkgaXMgZXZhbHVhdGVkCisgICAgICAgICAgIGF0IGxlYXN0IG9uZSB0aW1lLgorICAgICAgICAgICBGdXJ0aGVybW9yZSwgdGhlIGFyZ3VtZW50cyBmb3IgIydkbyBhcmUgY2hhbmdlZCBpbiBvcmRlci4gIydkbworICAgICAgICAgICBleHBlY3RzIGFzIGZpcnN0IHRvIGxhc3QgYnV0IHR3byB0aGUgYm9keSBvZiB0aGUgbG9vcCwgdGhlbiB0aGUKKyAgICAgICAgICAgY29uZGl0aW9uIChhcyBsYXN0LWJ1dC1vbmUndGggYXJndW1lbnQpIGFuZCB0aGUgcmVzdWx0IHZhbHVlIGFzCisgICAgICAgICAgIGxhc3QgYXJndW1lbnQuIFNvICMnZG8gbXVzdCBoYXZlIGF0IGxlYXN0IHR3byBhcmd1bWVudHM6IHRoZQorICAgICAgICAgICBjb25kaXRpb24gYW5kIHRoZSByZXN1bHQuCisKKyAgICAgICAgICAgbGFtYmRhKDAsKHsgKCMnLCksICAgICAgICAgIC8vIHNldmVyYWwgdGhpbmdzIHRvIGRvIC4uLgorICAgICAgICAgICAgICAgICAgICAgICAoeyAoIyc9KSwnaSwwIH0pLCAgLy8gaSBpcyBhIGxvY2FsIHZhcmlhYmxlIG9mIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhbWJkYS1jbG9zdXJlIGFuZCBpcyBpbml0aWFsaXplZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCAwIG5vdy4KKyAgICAgICAgICAgICAgICAgICAgICAgKHsgKCMnZG8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoeyAoIyd3cml0ZSksJ2kgfSksICAvLyBnaXZlIG91dCBpCisgICAgICAgICAgICAgICAgICAgICAgICAgICh7ICgjJys9KSwnaSwxIH0pICAgIC8vIGluY3JlYXNlIGkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHsgKCMnPCksJ2ksMTAgfSksICAgLy8gY29uZGl0aW9uOiBpIDwgMTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgNDIgICAgICAgICAgICAgICAgICAgLy8gcmVzdWx0IGlzIG5vdCBpbnRlcmVzdGluZworICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICB9KSkKKworICAgICAgTk9URTogVGhlcmUgaXMgbm8gIydmb3IgaW4gTFBDLCB5b3Ugc2hvdWxkIHVzZSAjJ3doaWxlIGZvciB0aGlzLgorCisgICAgICAjJ2ZvcmVhY2ggaXMgbGlrZSB0aGUgZm9yZWFjaCgpIHN0YXRlbWVudCBpbiBMUEMuIEl0IGV2YWx1YXRlcyBvbmUgb3IKKyAgICAgICAgICAgbW9yZSBib2RpZXMgcmVwZWF0ZWRseSBmb3IgZXZlcnkgdmFsdWUgaW4gYSBnaXZpbmcgc3RyaW5nLCBhcnJheQorICAgICAgICAgICBvciBtYXBwaW5nLiBUaGUgcmVzdWx0IG9mIHRoZSBjbG9zdXJlIGlzIDAuCisKKyAgICAgICAgICAgIydmb3JlYWNoIGV4cGVjdHMgdHdvIG9yIG1vcmUgYXJndW1lbnRzOgorICAgICAgICAgICAgLSBhIHNpbmdsZSB2YXJpYWJsZSBzeW1ib2wsIG9yIGFuIGFycmF5IHdpdGggc2V2ZXJhbCB2YXJpYWJsZQorICAgICAgICAgICAgICBzeW1ib2xzCisgICAgICAgICAgICAtIHRoZSB2YWx1ZSB0byBpdGVyYXRlIG92ZXIKKyAgICAgICAgICAgIC0gemVybyBvciBtb3JlIGJvZGVzIHRvIGV2YWx1YXRlIGluIGVhY2ggaXRlcmF0aW9uLgorCisgICAgICAgICAgIFRoZSBzaW5nbGUgdmFsdWVzIHJldHJpZXZlZCBmcm9tIHRoZSBnaXZlbiB2YWx1ZSBhcmUgYXNzaWduZWQKKyAgICAgICAgICAgb25lIGFmdGVyIGFub3RoZXIgdG8gdGhlIHZhcmlhYmxlKHMpLCB0aGVuIHRoZSBib2RpZXMgYXJlIGV4ZWN1dGVkCisgICAgICAgICAgIGZvciBlYWNoIGFzc2lnbm1lbnQuCisKKyAgICAgICAgICAgbGFtYmRhKDAsICh7Iydmb3JlYWNoLCAnbywgKHsjJ3VzZXJzfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgKHsjJ2NhbGxfb3RoZXIsICdvLCAiZGllIiB9KQorICAgICAgICAgICAgICAgICAgICAgfSkpOworCisgICAgICAgICAgIGxhbWJkYSgwLCAoeyMnZm9yZWFjaCwgKHsnaywgJ3Z9KSwgKHsgLi4ubWFwcGluZy4uLn0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICh7IydwcmludGYsICIlTzolT1xuIiwgJ2ssICd2IH0pCisgICAgICAgICAgICAgICAgICAgICB9KSk7CisKKyAgICAgICMncmV0dXJuIGdldHMgb25lIGFyZ3VtZW50IGFuZCBhY3RzIGxpa2UgdGhlICJyZXR1cm4iIHN0YXRlbWVudCBpbiBMUEMKKyAgICAgICAgICAgICAgIGluIHRoZSBmdW5jdGlvbiB0aGF0IGlzIGNyZWF0ZWQgYnkgbGFtYmRhKCkuIEl0IGFib3J0cyB0aGUKKyAgICAgICAgICAgICAgIGV4ZWN1dGlvbiBvZiB0aGlzIGZ1bmN0aW9uIGFuZCByZXR1cm5zIHRoZSBhcmd1bWVudC4KKworICAgICAgICAgICAgICAgbGFtYmRhKDAsKHsgKCMnd2hpbGUpLC8vIGxvb3AKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsICAgICAgICAvLyBjb25kaXRpb24gaXMgMSA9PT4gZW5kbGVzIGxvb3AKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDQyLCAgICAgICAvLyByZXR1cm4gdmFsdWUgKHdoaWNoIHdpbGwgbmV2ZXIgYmUgdXNlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh7ICgjJ3dyaXRlKSwiZ3JpbiIgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh7ICgjJz8hKSwgICAgICAgICAgICAgICAvLyBpZm5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHsgKCMncmFuZG9tKSwxMCB9KSwgIC8vICAgICAgIChyYW5kb20oMTApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHsgKCMncmV0dXJuKSwxMDAgfSkgIC8vICAgcmV0dXJuIDEwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICB9KSkKKworICAgICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gd2lsbCBlbnRlciBhbiBlbmRsZXMgbG9vcCB0aGF0IHdpbGwgaW4gZWFjaAorICAgICAgICAgICAgICAgIHR1cm4gZ2l2ZSBvdXQgImdyaW4iIGFuZCBpZiByYW5kb20oMTApIHJldHVybnMgMCAod2hpY2ggd2lsbAorICAgICAgICAgICAgICAgIG9mIGNvdXJzZSBoYXBwZW4gdmVyeSBzb29uKSBpdCB3aWxsIGxlYXZlIHRoZSBmdW5jdGlvbiB3aXRoCisgICAgICAgICAgICAgICAgInJldHVybiAxMDAiLiBUaGUgdmFsdWUgNDIgdGhhdCBpcyBnaXZlbiBhcyByZXN1bHQgb2YgdGhlCisgICAgICAgICAgICAgICAgbG9vcCB3b3VsZCBiZSByZXR1cm5lZCBpZiB0aGUgY29uZGl0aW9uIHdvdWxkIGV2YWx1YXRlIHRvIDAKKyAgICAgICAgICAgICAgICB3aGljaCBjYW5ub3QgYmUuICgxIGlzIG5ldmVyIDAgOy0pCisKKyAgICAgICMnYnJlYWsgaXMgdXNlZCBsaWtlIHRoZSAiYnJlYWsiIHN0YXRlbWVudCBpbiBMUEMgYW5kIGFib3J0cyB0aGUgZXhlLQorICAgICAgICAgICAgICBjdXRpb24gb2YgbG9vcHMgYW5kIHN3aXRjaGVzLgorICAgICAgICAgICAgICBJdCBtdXN0IG5vdCBhcHBlYXIgb3V0c2lkZSBhIGxvb3Agb3Igc3dpdGNoIG9mIHRoZSBsYW1iZGEKKyAgICAgICAgICAgICAgY2xvc3VyZSBpdHNlbGYsIGl0IGNhbm5vdCBhYm9ydCB0aGUgZXhlY3V0aW9uIG9mIHRoZSBmdW5jdGlvbgorICAgICAgICAgICAgICB0aGUgY2xvc3VyZSBwb2ludHMgdG8hCisKKyAgICAgICAgICAgICAgICBsYW1iZGEoMCwoeyAoIyc/KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeyAoIydyYW5kb20pLDIgfSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHsgKCMnYnJlYWspIH0pLCAvLyB0aGlzIHdpbGwgY2F1c2UgdGhlIGVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAiVW5pbXBsZW1lbnRlZCBvcGVyYXRvciBicmVhaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGxhbWJkYSgpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyYW5kb20gd2FzIGZhbHNlISIKKyAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CisKKyAgICAgICAgICAgICAgWW91IGNhbiB1c2UgKHsgIydyZXR1cm4sMCB9KSBpbnN0ZWFkIG9mICh7ICMnYnJlYWsgfSkgaW4gc3VjaAorICAgICAgICAgICAgICBjYXNlcy4KKworICAgICAgIydjb250aW51ZSBpcyB1c2VkIGxpa2UgdGhlICJjb250aW51ZSIgc3RhdGVtZW50IGluIExQQyBhbmQganVtcHMgdG8KKyAgICAgICAgICAgICAgICAgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBsb29wIGFuZCBjb250aW51ZXMgd2l0aCB0aGUgbG9vcAorICAgICAgICAgICAgICAgICBjb25kaXRpb24uCisKKyAgICAgICMnZGVmYXVsdCBtYXkgYmUgdXNlZCB3aXRoaW4gYSAjJ3N3aXRjaC1jb25zdHJ1Y3QgYnV0IGJlIGNhcmVmdWwhCisgICAgICAgICAgICAgICAgVG8gY2FsbCBzeW1ib2xfZnVuY3Rpb24oImRlZmF1bHQiKSAod2hpY2ggaXMgZG9uZSB1c3VhbGx5CisgICAgICAgICAgICAgICAgYnkgdG9vbHMgdGhhdCBhbGxvdyBjbG9zdXJlLWNyZWF0aW9uKSBtaWdodCBjcmFzaCB0aGUKKyAgICAgICAgICAgICAgICBkcml2ZXIhIFNvIHBsZWFzZSBkbyBvbmx5IHVzZSBpdCB3aXRoaW4geW91ciBMUEMtZmlsZXMuCisgICAgICAgICAgICAgICAgKE5PVEU6IFRoaXMgZHJpdmVyIGJ1ZyBpcyBmaXhlZCBzb21ld2hlcmUgYmVsb3cgMy4yLjFAMTMxLikKKworICAgICAgIycuLiBtYXkgYmUgdXNlZCB3aXRoaW4gYSAjJ3N3aXRjaC1jb25zdHJ1Y3QgYnV0IGlzIG5vdCBpbXBsZW1lbnRlZAorICAgICAgICAgICB5ZXQgKDMuMi4xQDEzMSkuIEJ1dCAjJ1suLl0gd29ya3Mgd2VsbCBpbnN0ZWFkIG9mIGl0LgorCisgICAgICAjJ3N3aXRjaCBpcyB1c2VkIHRvIGNyZWF0ZSBjbG9zdXJlcyB3aGljaCBiZWhhdmUgdmVyeSBtdWNoIGxpa2UgdGhlCisgICAgICAgICAgICAgICBzd2l0Y2gtY29uc3RydWN0IGluIExQQy4gVG8gdW5kZXJzdGFuZCB0aGUgZm9sbG93aW5nIHlvdQorICAgICAgICAgICAgICAgc2hvdWxkIGFscmVhZHkga25vdyB0aGUgc3ludGF4IGFuZCBwb3NzaWJpbGl0aWVzIG9mIHRoZQorICAgICAgICAgICAgICAgbGF0dGVyIG9uZSAod2hpY2ggaXMgbWlnaHRpZXIgdGhhbiB0aGUgQy12ZXJzaW9uIG9mIHN3aXRjaCkuCisKKyAgICAgICAgICAgICAgIEkgd2lsbCBjb25mcm9udCBzb21lIExQQyB2ZXJzaW9ucyBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgY2xvLQorICAgICAgICAgICAgICAgc3VyZSB2ZXJzaW9ucyBiZWxvdy4KKworICAgICAgICAgICAgICAgTFBDOiAgICAgICAgICAgICAgICAgIENsb3N1cmU6CisgICAgICAgICAgICAgICAgIHN3aXRjaCAoeCkgeyAgICAgICAgICBsYW1iZGEoMCwoeyAoIydzd2l0Y2gpLCB4LAorICAgICAgICAgICAgICAgICBjYXNlIDU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgKHsgNSB9KSwKKyAgICAgICAgICAgICAgICAgICByZXR1cm4gImZpdmUiOyAgICAgICAgICAgICAgICAgICh7ICgjJ3JldHVybiksImZpdmUiIH0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCMnLCksCisgICAgICAgICAgICAgICAgIGNhc2UgNi4uOTogICAgICAgICAgICAgICAgICAgICAgICAoeyA2LCAoIydbLi5dKSwgOSB9KSwKKyAgICAgICAgICAgICAgICAgICByZXR1cm4gInNpeCB0byBuaW5lIjsgICAgICAgICAgICh7ICgjJ3JldHVybiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2l4IHRvIG5pbmUiIH0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCMnLCksCisgICAgICAgICAgICAgICAgIGNhc2UgMTogICAgICAgICAgICAgICAgICAgICAgICAgICAoeyAxIH0pLAorICAgICAgICAgICAgICAgICAgIHdyaXRlKCJvbmUiKTsgICAgICAgICAgICAgICAgICAgKHsgKCMnd3JpdGUpLCJvbmUiIH0pLAorICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaCAgICAgICAgICAgICAgICAgKCMnLCksCisgICAgICAgICAgICAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgICAgICAoeyAyLAorICAgICAgICAgICAgICAgICBjYXNlIDEwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAgfSksCisgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ0d28gb3IgdGVuIjsgICAgICAgICAgICAoeyAoIydyZXR1cm4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR3byBvciB0ZW4iIH0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCMnLCksCisgICAgICAgICAgICAgICAgIGNhc2UgMy4uNDogICAgICAgICAgICAgICAgICAgICAgICAoeyAzLCAoIydbLi5dKSwgNCB9KSwKKyAgICAgICAgICAgICAgICAgICB3cml0ZSgidGhyZWUgdG8gZm91ciIpOyAgICAgICAgICh7ICgjJ3dyaXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aHJlZSB0byBmb3VyIiB9KSwKKyAgICAgICAgICAgICAgICAgICBicmVhazsgIC8vIGxlYXZlIHN3aXRjaCAgICAgICAgICgjJ2JyZWFrKSwKKyAgICAgICAgICAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICh7ICgjJ2RlZmF1bHQpIH0pLAorICAgICAgICAgICAgICAgICAgIHdyaXRlKCJzb21ldGhpbmcgZWxzZSIpOyAgICAgICAgKHsgKCMnd3JpdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvbWV0aGluZyBlbHNlIiB9KSwKKyAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICgjJ2JyZWFrKQorICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpCisKKyAgICAgICMnJiYgZXZhbHVhdGVzIHRoZSBhcmd1bWVudHMgZnJvbSB0aGUgZmlyc3Qgb24gYW5kIHN0b3BzIGlmIG9uZSBldmFsdS0KKyAgICAgICAgICAgYXRlcyB0byAwIGFuZCByZXR1cm5zIDAuIElmIG5vbmUgZXZhbHVhdGVzIHRvIDAgaXQgcmV0dXJucyB0aGUKKyAgICAgICAgICAgcmVzdWx0IG9mIHRoZSBsYXN0IGFyZ3VtZW50LgorCisgICAgICAjJ3x8IGV2YWx1YXRlcyB0aGUgYXJndW1lbnRzIGZyb20gdGhlIGZpcnN0IG9uIGFuZCBzdG9wcyBpZiBvbmUgZXZhbHUtCisgICAgICAgICAgIGF0ZXMgdG8gdHJ1ZSAobm90IDApIGFuZCByZXR1cm5zIGl0LiBJZiBhbGwgZXZhbHVhdGUgdG8gMCBpdAorICAgICAgICAgICByZXR1cm5zIDAuCisKKyAgICAgICMnY2F0Y2ggZXhlY3V0ZXMgdGhlIGNsb3N1cmUgZ2l2ZW4gYXMgYXJndW1lbnQsIGJ1dCBjYXRjaGVzIGFueQorICAgICAgICAgICBydW50aW1lIGVycm9yIChzZWUgY2F0Y2goRSkpLiBPcHRpb25hbGx5IHRoZSBzeW1ib2xzICdub2xvZywKKyAgICAgICAgICAgJ3B1Ymxpc2ggYW5kICdyZXNlcnZlIG1heSBiZSBnaXZlbiBhcyBhZGRpdGlvbmFsIGFyZ3VtZW50cyB0bworICAgICAgICAgICBtb2RpZnkgdGhlIGJlaGF2aW91ciBvZiB0aGUgY2F0Y2guCisKKyAgICAgICMnc3NjYW5mIGFjdHMgc2ltaWxhciB0byBob3cgYSBmdW5jYWxsIHdvdWxkLCBidXQgcGFzc2VzIHRoZSB0aGlyZAorICAgICAgICAgICBhbmQgZm9sbG93aW5nIGFyZ3VtZW50cyBhcyBsdmFsdWVzLCB0aGF0IGlzLCB2YWx1ZXMgd2hpY2ggY2FuCisgICAgICAgICAgIGJlIGFzc2lnbmVkIHRvLgorCisgICAgICAjJz0gYW5kIHRoZSAjJzxvcD49IHZhcmlhbnRzIGFyZSBhbHNvIHNwZWNpYWwgYmVjYXVzZSB0aGUgZmlyc3QKKyAgICAgICAgICAgYXJndW1lbnQgaGFzIHRvIGJlIGFuIGx2YWx1ZS4KKworMi40IENsb3N1cmVzIHdpdGggU3RyYW5nZSBOYW1lcworCisgICAgIyduZWdhdGUgaXMgdGhlIHVuYXJ5IG1pbnVzIHRoYXQgcmV0dXJucyAteCBmb3IgdGhlIGFyZ3VtZW50IHguCisKKyAgICAgICAgICAgICBtYXAoKHsgMSwyLDMgfSksIyduZWdhdGUpCisKKyAgICAgICAgICAgICBUaGlzIHJldHVybnMgKHsgLTEsLTIsLTMgfSkuCisKKyAgICAjJ1sgaXMgdXNlZCBmb3IgdGhlIHRoaW5ncyB0aGF0IGluIExQQyBhcmUgZG9uZSB3aXRoCisgICAgICAgICAgICAgdGhlIFtdLW9wZXJhdG9yIChpdCBpbmRleGVzIGFuIGFycmF5IG9yIGEgbWFwcGluZykuCisKKyAgICAgICAgICAgICBsYW1iZGEoMCwoeyAjJ1sscXVvdGUoKHsgMTAsNTAsMzAsNzAgfSkpLDIgfSkpID09PiAzMAorICAgICAgICAgICAgIGxhbWJkYSgwLCh7ICMnWywoWyAieCI6MTA7NTAsICJ5IjozMDs3MCBdKSwieCIsMSB9KSkgPT0+IDUwCisKKyAgICAjJ1s8IGlzIHRoZSBzYW1lIGFzICMnWyBidXQgY291bnRzIHRoZSBlbGVtZW50cyBmcm9tIHRoZQorICAgICAgICAgICAgICAgZW5kIChsaWtlIGluZGV4aW5nIHdpdGggW10gYW5kIHRoZSAiPCIpLgorCisgICAgIydbLi5dIHJldHVybnMgYSBzdWJhcnJheSBvZiB0aGUgYXJndW1lbnQgZnJvbSB0aGUgb25lCisgICAgICAgICAgICAgZ2l2ZW4gaW5kZXggdG8gdGhlIG90aGVyIGdpdmVuIGluZGV4LCBib3RoIGNvdW50ZWQgZnJvbSB0aGUKKyAgICAgICAgICAgICBiZWdpbm5pbmcgb2YgdGhlIGFycmF5LgorCisgICAgIydbLi48XQorICAgICMnWzwuLl0KKyAgICAjJ1s8Li48XSBzYW1lIGFzIGFib3ZlLCBidXQgdGhlIGluZGV4ZXMgYXJlIGNvdW50ZWQgZnJvbSB0aGUgZW5kLAorCisgICAgICAgICAgICAgICAgbGFtYmRhKDAsKHsgIydbLi48XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdW90ZSgoeyAwLDEsMiwzLDQsNSw2LDcgfSkpLDIsMworICAgICAgICAgICAgICAgICAgICAgICAgIH0pKQorCisgICAgICAgICAgICAgICAgVGhpcyB3aWxsIHJldHVybiAoeyAyLDMsNCw1IH0pLgorICAgICMnWy4uCisgICAgIydbPC4uIHNhbWUgYXMgYWJvdmUsIGJ1dCBvbmx5IHRoZSBmaXJzdCBpbmRleCBpcyBnaXZlbiwgdGhlCisgICAgICAgICAgICAgICBzdWJhcnJheSB3aWxsIGdvIHRpbGwgdGhlIGVuZCBvZiB0aGUgb3JpZ2luYWwgKGxpa2Ugd2l0aAorICAgICAgICAgICAgICAgW3guLl0pLgorCisgICAgIycoeyBpcyB1c2VkIHRvIGNyZWF0ZSBhcnJheXMgKGFzIHdpdGggKHsgfSkgaW4gTFBDKS4gQWxsIGFyZ3VtZW50cworICAgICAgICAgICAgIGJlY29tZSB0aGUgZWxlbWVudHMgb2YgdGhlIGFycmF5LgorCisgICAgICAgICAgICAgbGFtYmRhKDAsKHsgIycoeywKKyAgICAgICAgICAgICAgICAgICAgICAgICAoeyAoIydyYW5kb20pLDEwIH0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICh7ICgjJ3JhbmRvbSksNTAgfSksCisgICAgICAgICAgICAgICAgICAgICAgICAgKHsgKCMncmFuZG9tKSwzMCB9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoeyAoIydyYW5kb20pLDcwIH0pCisgICAgICAgICAgICAgICAgICAgICAgfSkpCisKKyAgICAgICAgICAgICBUaGlzIHJldHVybnMgKHsgcmFuZG9tKDEwKSxyYW5kb20oNTApLHJhbmRvbSgzMCkscmFuZG9tKDcwKSB9KS4KKworICAgICMnKFsgaXMgdXNlZCB0byBjcmVhdGUgbWFwcGluZ3Mgb3V0IG9mIHNpbmdsZSBlbnRyaWVzICh3aXRoIHNldmUtCisgICAgICAgICAgICAgICByYWwgdmFsdWVzKSBsaWtlIHRoZSAoWyBdKSBpbiBMUEMuIFZlcnkgdW51c3VhbCBpcyB0aGUgZmFjdAorICAgICAgICAgICAgICAgdGhhdCB0aGlzIGNsb3N1cmUgZ2V0cyBhcnJheXMgYXMgYXJndW1lbnQgdGhhdCBhcmUgbm90IGV2YWwtCisgICAgICAgICAgICAgICB1YXRlZCwgYWx0aG91Z2ggdGhleSBhcmUgbm90IHF1b3RlZC4KKworICAgICAgICAgICAgICAgbGFtYmRhKDAsKHsgIycoWywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh7ICJ4IiwxLDIsMyB9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh7ICJ5Iiw0LDUsNiB9KQorICAgICAgICAgICAgICAgICAgICAgICAgfSkpOworCisgICAgICAgICAgICAgICBUaGlzIHJldHVybnMgKFsgIngiOiAxOzI7MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieSI6IDQ7NTs2IF0pLgorCisgICAgICAgICAgICAgICBIb3dldmVyLCB0aGUgZWxlbWVudHMgb2YgdGhlIGFycmF5cyBhcmUgZXZhbHVhdGVkIGFzIGxhbWJkYQorICAgICAgICAgICAgICAgZXhwcmVzc2lvbnMsIHNvIGlmIHlvdSB3YW50IHRvIGNyZWF0ZSBhIG1hcHBpbmcgZnJvbSB2YWx1ZXMKKyAgICAgICAgICAgICAgIGV2YWx1YXRlZCBhdCBjYWxsIHRpbWUsIHdyaXRlIHRoZW0gYXMgbGFtYmRhIGNsb3N1cmVzOgorCisgICAgICAgICAgICAgICBsYW1iZGEoMCwgKHsgIycoWywgKHsgMSwgKHsgIydjdGltZSB9KSB9KSB9KSApCisKKyAgICAgICAgICAgICAgIHdpbGwgcmV0dXJuIChbIDE6IDxyZXN1bHQgb2YgY3RpbWUoKSBhdCBjYWxsIHRpbWUgXSkuCisKKyAgICAgICAgICAgICAgIEFycmF5cyBjYW4gYmUgcHV0IGludG8gdGhlIG1hcHBpbmcgYnkgcXVvdGluZzoKKworICAgICAgICAgICAgICAgbGFtYmRhKDAsICh7ICMnKFssICh7IDEsICcoeyAyIH0pIH0pIH0pICkKKworICAgICAgICAgICAgICAgd2lsbCByZXR1cm4gKFsgMTogKHsgMiB9KSBdKQorCisKKyAgICAjJ1ssXSBpcyBuZWFybHkgdGhlIHNhbWUgYXMgIydbLiBUaGUgb25seSBkaWZmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgICBzaG93cyB1cCBpZiB5b3Ugd2FudCB0byBpbmRleCBhIG1hcHBpbmcgd2l0aCBhIHdpZHRoCisgICAgICAgICAgICAgICAgICAgICBncmVhdGVyIHRoYW4gMSAod2l0aCBtb3JlIHRoYW4ganVzdCBvbmUgdmFsdWUgcGVyCisgICAgICAgICAgICAgICAgICAgICBrZXkpIGRpcmVjdGx5IHdpdGggZnVuY2FsbCgpLiBFeGFtcGxlOgorICAgICAgICAgICAgICAgICAgICAgZnVuY2FsbCgjJ1ssKFsgMDoxOzIsIDM6NDs1IF0pLDAsMSkKKyAgICAgICAgICAgICAgICAgICAgIFRoaXMgd2lsbCBub3Qgd29yay4gVXNlICMnWyxdIGFuZCBpdCB3aWxsCisgICAgICAgICAgICAgICAgICAgICB3b3JrLiBJZiB5b3Ugd2FudCB0byB1c2UgaXQgaW4gYSBsYW1iZGEgY2xvc3VyZSB5b3UKKyAgICAgICAgICAgICAgICAgICAgIGRvIG5vdCBoYXZlIHRvIHVzZSAjJ1ssXSBhbmQgIydbIHdpbGwKKyAgICAgICAgICAgICAgICAgICAgIGRvIGZpbmUuIE9uIHRoZSBvdGhlciBoYW5kLCAjJ1ssXSBjYW5ub3QKKyAgICAgICAgICAgICAgICAgICAgIHdvcmsgd2l0aCBhcnJheXMsIHNvIGluIG5lYXJseSBhbGwgY2FzZXMgdXNlICMnWworICAgICAgICAgICAgICAgICAgICAgYW5kIGp1c3QgaW4gdGhlIGRlc2NyaWJlZCBzcGVjaWFsIGNhc2UsIHVzZQorICAgICAgICAgICAgICAgICAgICAgIydbLF0uCisgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIGEgc3RyYW5nZSB0aGluZyBhbmQgSSBkZWVtIGl0IGEgYnVnLCBzbyBpdAorICAgICAgICAgICAgICAgICAgICAgbWlnaHQgY2hhbmdlIGluIHRoZSBmdXR1cmUuCisKKzIuNSBPcGVyYXRvci1DbG9zdXJlcworCisgICAgTW9zdCBvZiB0aGUgY2xvc3VyZXMgdGhhdCBhcmUgdXNlZCBmb3IgdGhpbmdzIHdoaWNoIGFyZSBkb25lIGJ5IG9wZXJhLQorICAgIHRvcnMgYXJlIGluIGZhY3Qgbm90IG9wZXJhdG9yLWNsb3N1cmVzIGJ1dCBlZnVuLWNsb3N1cmVzLiBCdXQgdGhlcmUgYXJlCisgICAgYSBmZXcgd2hpY2ggZG8gbm90IGhhdmUgdGhlIHN0YXRlIG9mIGVmdW4tY2xvc3VyZXMgYnV0IGFyZSBjYWxsZWQKKyAgICAib3BlcmF0b3ItY2xvc3VyZXMiLiAjJ3JldHVybiBpcyBhbiBleGFtcGxlLCBhIGNvbXBsZXRlIGxpc3Qgb2YgdGhlbSBpcworICAgIGdpdmVuIGJlbG93LgorCisgICAgVGhlc2UgY2xvc3VyZXMgY2Fubm90IGJlIGNhbGxlZCBkaXJlY3RseSB1c2luZyBmdW5jYWxsKCkgb3IgYXBwbHkoKSAob3IKKyAgICBvdGhlciBlZnVucyBsaWtlIGZpbHRlcigpKSwgYnV0IG11c3QgYXBwZWFyIG9ubHkgaW4gbGFtYmRhLWNvbi0KKyAgICBzdHJ1Y3RzLgorCisgICAgICBmdW5jYWxsKCMncmV0dXJuLDQpOyAgLy8gZG9lcyBub3Qgd29yayEgVGhpcyB3aWxsIHJhaXNlIGFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVW5jYWxsYWJsZS1jbG9zdXJlIGVycm9yLgorICAgICAgZnVuY2FsbChsYW1iZGEoMCwgICAgIC8vIHRoaXMgaXMgYSBjb3JyZWN0IGV4YW1wbGUKKyAgICAgICAgICAgICAgICAgICAgICh7ICgjJ3JldHVybiksNCB9KQorICAgICAgICAgICAgICAgICAgICApKTsKKworICAgIEFsbCBvcGVyYXRvci1jbG9zdXJlczoKKyAgICAjJyYmCisgICAgIyd8fAorICAgICMnLAorICAgICMnPworICAgICMnPyEKKyAgICAjJz0KKyAgICAjJzxvcD49CisgICAgIycrKworICAgICMnLS0KKyAgICAjJ2JyZWFrCisgICAgIydjYXRjaAorICAgICMnY29udGludWUKKyAgICAjJ2RlZmF1bHQKKyAgICAjJ2RvCisgICAgIydmb3JlYWNoCisgICAgIydyZXR1cm4KKyAgICAjJ3NzY2FuZgorICAgICMnc3dpdGNoCisgICAgIyd3aGlsZQorICAgICMnKHsKKyAgICAjJyhbCisKKyAgICAjJy4uIGlzIHZlcnkgbGlrZWx5IHRvIGJlIGFuIG9wZXJhdG9yIGNsb3N1cmUgdG9vLCBidXQgc2luY2UgaXQgaXMKKyAgICBub3QgaW1wbGVtZW50ZWQgeWV0LCBJIGNhbm5vdCBzYXkgZm9yIHN1cmUuCisKKzIuNiBWYXJpYWJsZS1DbG9zdXJlcworCisgICAgQWxsIG9iamVjdC1nbG9iYWwgdmFyaWFibGVzIG1pZ2h0IGJlICJjbG9zdXJlZCIgYnkgcHJlcGVuZGluZyBhICMnIHRvCisgICAgdGhlbSB0byBhbGxvdyBhY2Nlc3MgYW5kL29yIG1hbmlwdWxhdGlvbiBvZiB0aGVtLiBTbyBpZiB5b3VyIG9iamVjdCBoYXMKKyAgICBhIGdsb2JhbCB2YXJpYWJsZSB4IHlvdSBjYW4gdXNlICMneCB3aXRoaW4gYSBjbG9zdXJlLgorCisgICAgTm9ybWFsbHkgeW91IHdpbGwgdHJlYXQgdGhvc2UgZXhwcmVzc2lvbnMgbGlrZSBsZnVuLWNsb3N1cmVzOiBwdXQgdGhlbQorICAgIGludG8gYW4gYXJyYXkgdG8gZ2V0IHRoZSB2YWx1ZToKKworICAgIG9iamVjdC5jOgorICAgICAgICAgICAgICBpbnQgeDsKKyAgICAgICAgICAgICAgaW50IGZvbygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGFtYmRhKDAsKHsgKCMnd3JpdGUpLCh7ICgjJ3gpIH0pIH0pKTsKKyAgICAgICAgICAgICAgfQorCisgICAgQW55Ym9keSB3aG8gbm93IGNhbGxzIG9iamVjdC0+Zm9vKCkgd2lsbCBnZXQgYSBjbG9zdXJlIHdoaWNoIHdpbGwsIHdoZW4KKyAgICBldmFsdWF0ZWQsIHdyaXRlIHRoZSBhY3R1YWwgdmFsdWUgb2Ygb2JqZWN0J3MgZ2xvYmFsIHZhcmlhYmxlIHguCisKKyAgICBWYXJpYWJsZSBjbG9zdXJlcyBkbyBub3QgYWNjZXB0IGFyZ3VtZW50cy4KKworMyBFeGFtcGxlcworCisgIEluIHRoaXMgc2VjdGlvbiBJIHdpbGwgZ2l2ZSBhbmQgZXhwbGFpbiBzb21lIGV4YW1wbGVzIGNvbWluZyBvdXQgb2YKKyAgcHJheGlzLiBJZiB0aGUgZXhwbGFuYXRpb24gc2VlbXMgdG8gYmUgaW4gc29tZSBjYXNlcyB0b28gZGV0YWlsZWQgdGhpcworICBjYW4gYmUgZXhwbGFpbmVkIGJ5IHRoZSB0cmlhbCB0byBhbGxvdyB0aGUgcmVhZGVyIHRvIHJlYWQgdGhlIGV4YW1wbGVzCisgIHNlY3Rpb24gZmlyc3QgOy0pCisKKzMuMSBMZnVuLUNsb3N1cmUKKworICAgIEFuIGl0ZW0gd2l0aCBhIGNvbXBsZXggbG9uZy1kZXNjcmlwdGlvbiBsaWtlIGEgd2F0Y2ggdGhhdCBzaGFsbCBhbHdheXMKKyAgICBzaG93IHRoZSBhY3R1YWwgdGltZSB3aWxsIHVzdWFsbHkgYmFzZSB1cG9uIHRoZSBjb21wbGV4L2l0ZW0tY2xhc3MgYW5kCisgICAgZ2l2ZSBhbiBsZnVuLWNsb3N1cmUgYXMgYXJndW1lbnQgdG8gdGhlIHNldF9sb25nKCktbWV0aG9kLgorCisgICAgd2F0Y2guYzoKKyAgICAgICAgICAgICBpbmhlcml0ICJjb21wbGV4L2l0ZW0iOworCisgICAgICAgICAgICAgc3RyaW5nIG15X2xvbmcoKSB7CisgICAgICAgICAgICAgICByZXR1cm4gKCJUaGUgd2F0Y2ggaXMgc21hbGwgYW5kIGhhcyBhIHN0cmFuZ2Ugb3RoZXJ3b3JsZGx5IgorICAgICAgICAgICAgICAgICAgICAgICAiIGF1cmEgYWJvdXQgaXQuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICJUaGUgY3VycmVudCB0aW1lIGlzOiAiK2N0aW1lKCkrIi5cbiIpOworICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgIHZvaWQgY3JlYXRlKCkgeworICAgICAgICAgICAgICAgc2V0X3Nob3J0KCJhIGxpdHRsZSB3YXRjaCIpOworICAgICAgICAgICAgICAgc2V0X2lkKCh7ICJ3YXRjaCIsImxpdHRsZSB3YXRjaCIgfSkpOworICAgICAgICAgICAgICAgc2V0X2xvbmcoIydteV9sb25nKTsgIC8vIHRoZSBsZnVuLWNsb3N1cmUgdG8gdGhlIGxmdW4gbXlfbG9uZygpCisgICAgICAgICAgICAgfQorCiszLjIgTGFtYmRhLUNsb3N1cmUKKworICAgIFRoZSBleGFtcGxlIGZyb20gMy4xIGNhbiBhbHNvIGJlIHdyaXR0ZW4gdXNpbmcgYSBsYW1iZGEtY2xvc3VyZS4KKworICAgIHdhdGNoLmM6CisgICAgICAgICAgICAgaW5oZXJpdCAiY29tcGxleC9pdGVtIjsKKworICAgICAgICAgICAgIHZvaWQgY3JlYXRlKCkgeworICAgICAgICAgICAgICAgc2V0X3Nob3J0KCJhIGxpdHRsZSB3YXRjaCIpOworICAgICAgICAgICAgICAgc2V0X2lkKCh7ICJ3YXRjaCIsImxpdHRsZSB3YXRjaCIgfSkpOworICAgICAgICAgICAgICAgc2V0X2xvbmcobGFtYmRhKDAsKHsgKCMnKyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIHdhdGNoIGlzIHNtYWxsIGFuZCBoYXMgYSBzdHJhbmdlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBvdGhlcndvcmxkbHkgYXVyYSBhYm91dCBpdC5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgY3VycmVudCB0aW1lIGlzOiAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHsgKCMnKyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeyAoIydjdGltZSkgfSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSk7CisgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvZG9jL0xQQy9jbG9zdXJlcyBiL2RvYy9MUEMvY2xvc3VyZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE1ZDgwNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9MUEMvY2xvc3VyZXMKQEAgLTAsMCArMSwzMzEgQEAKK0NPTkNFUFQKKyAgICAgICAgY2xvc3VyZXMKKworTk9URQorICAgICAgICBUaGlzIGlzIHRoZSBvZmZpY2lhbCBtYW4gcGFnZSBjb25jZXJuaW5nIGNsb3N1cmVzLiBJZiB5b3UgZmluZAorICAgICAgICBpdCBoYXJkIHRvIHJlYWQgbWF5YmUgdGhlIENsb3N1cmUgR3VpZGUgaXMgYW4gZWFzaWVyIGludHJvZHVjdGlvbgorICAgICAgICBmb3IgeW91OiBTZWUgY2xvc3VyZV9ndWlkZShMUEMpIGFuZCBjbG9zdXJlcy1leGFtcGxlKExQQykuCisKK0RFU0NSSVBUSU9OCisgICAgICAgIENsb3N1cmVzIHByb3ZpZGUgYSBtZWFucyBvZiBjcmVhdGluZyBjb2RlIGR5bmFtaWNhbGx5IGFuZAorICAgICAgICBwYXNzaW5nIHBpZWNlcyBvZiBjb2RlIGFzIHBhcmFtZXRlcnMsIHN0b3JpbmcgdGhlbSBpbgorICAgICAgICB2YXJpYWJsZXMuIE9uZSBtaWdodCB0aGluayBvZiB0aGVtIGFzIGEgdmVyeSBhZHZhbmNlZCBmb3JtIG9mCisgICAgICAgIHByb2Nlc3Nfc3RyaW5nKCkuIEhvd2V2ZXIsIHRoaXMgZmFsbHMgc2hvcnQgb2Ygd2hhdCB5b3UgY2FuCisgICAgICAgIGFjdHVhbGx5IGRvIHdpdGggdGhlbS4KKworICAgICAgICBUaGUgc2ltcGxlc3Qga2luZCBvZiBjbG9zdXJlcyBhcmUgZWZ1bnMsIGxmdW5zIG9yIG9wZXJhdG9ycy4KKyAgICAgICAgRm9yIGV4YW1wbGUsICMndGhpc19wbGF5ZXIgaXMgYW4gZXhhbXBsZSBvZiBhIGNsb3N1cmUuIFlvdSBjYW4KKyAgICAgICAgYXNzaWduIGl0IHRvIGEgdmFyaWFibGUgYXMgaW4KKworICAgICAgICAgICAgICAgIGNsb3N1cmUgZjsKKyAgICAgICAgICAgICAgICBvYmplY3QgcDsKKyAgICAgICAgICAgICAgICBmID0gIyd0aGlzX3BsYXllcjsKKworICAgICAgICBhbmQgbGF0ZXIgdXNlIGVpdGhlciB0aGUgZnVuY2FsbCgpIG9yIGFwcGx5KCkgZWZ1biB0byBldmFsdWF0ZQorICAgICAgICBpdC4gTGlrZQorCisgICAgICAgICAgICAgICAgcCA9IGZ1bmNhbGwoZik7CisKKyAgICAgICAgb3IKKworICAgICAgICAgICAgICAgIHAgPSBhcHBseShmKTsKKworICAgICAgICBJbiBib3RoIGNhc2VzIHRoZXJlIHAgd2lsbCBhZnRlcndhcmRzIGhvbGQgdGhlIHZhbHVlIG9mCisgICAgICAgIHRoaXNfcGxheWVyKCkuICBPZiBjb3Vyc2UsIHRoaXMgaXMgb25seSBhIHJhdGhlciBzaW1wbGUKKyAgICAgICAgYXBwbGljYXRpb24uCisKKyAgICAgICAgSW5saW5lIGNsb3N1cmVzIGFyZSBhIHZhcmlhbnQgb2YgbGZ1biBjbG9zdXJlcywgdGhlIGRpZmZlcmVuY2UKKyAgICAgICAgYmVpbmcgdGhhdCB0aGUgZnVuY3Rpb24gdGV4dCBpcyB3cml0dGVuIHJpZ2h0IHdoZXJlIHRoZQorICAgICAgICBjbG9zdXJlIGlzIHVzZWQuICBTaW5jZSB0aGV5IGFyZSBwcmV0dHkgcG93ZXJmdWwgYnkKKyAgICAgICAgdGhlbXNlbHZlcywgaW5saW5lIGNsb3N1cmVzIGhhdmUgdGhlaXIgb3duIG1hbnBhZ2UuCisKKyAgICAgICAgTW9yZSB1c2VmdWwgaW5zdGFuY2VzIG9mIGNsb3N1cmVzIGNhbiBiZSBjcmVhdGVkCisgICAgICAgIHVzaW5nIHRoZSBsYW1iZGEoKSBlZnVuLiBJdCBpcyBtdWNoIGxpa2UgdGhlIGxhbWJkYSBmdW5jdGlvbgorICAgICAgICBpbiBMSVNQLiBGb3IgZXhhbXBsZSwgeW91IGNhbiBkbyB0aGUgZm9sbG93aW5nOgorCisgICAgICAgICAgICAgICAgZiA9IGxhbWJkYSggKHsgJ3ggfSksICh7ICMnZW52aXJvbm1lbnQsICd4IH0pICk7CisKKyAgICAgICAgVGhpcyB3aWxsIGNyZWF0ZSBhIGxhbWJkYSBjbG9zdXJlIGFuZCBhc3NpZ24gaXQgdG8gZi4gVGhlCisgICAgICAgIGZpcnN0IGFyZ3VtZW50IHRvIGxhbWJkYSBpcyBhbiBhcnJheSBkZXNjcmliaW5nIHRoZSBhcmd1bWVudHMKKyAgICAgICAgKHN5bWJvbHMpIHBhc3NlZCB0byB0aGUgY2xvc3VyZSB1cG9uIGV2YWx1YXRpb24gYnkgZnVuY2FsbCgpCisgICAgICAgIG9yIGFwcGx5KCkuIFlvdSBjYW4gbm93IGV2YWx1YXRlIGYsIGZvciBleGFtcGxlIGJ5IG1lYW5zIG9mCisgICAgICAgIGZ1bmNhbGwoZix0aGlzX29iamVjdCgpKS4gVGhpcyB3aWxsIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nCisgICAgICAgIHN0ZXBzOgorCisgICAgICAgICAgICAgICAgMS4gVGhlIHZhbHVlIG9mIHRoaXNfb2JqZWN0KCkgd2lsbCBiZSBib3VuZCB0byBzeW1ib2wgeC4KKyAgICAgICAgICAgICAgICAyLiBlbnZpcm9ubWVudCh4KSBldmFsdWF0ZXMgdG8gZW52aXJvbm1lbnQodGhpc19vYmplY3QoKSkKKyAgICAgICAgICAgICAgICAgICBhbmQgaXMgcmV0dXJuZWQgYXMgdGhlIHJlc3VsdCBvZiB0aGUgZnVuY2FsbCgpLgorCisgICAgICAgIE9uZSBtaWdodCB3b25kZXIgd2h5IHRoZXJlIGFyZSB0d28gZnVuY3Rpb25zLCBmdW5jYWxsKCkgYW5kCisgICAgICAgIGFwcGx5KCksIHRvIHBlcmZvcm0gdGhlIHNlZW1pbmdseSBzYW1lIGpvYiwgbmFtZWx5IGV2YWx1YXRpbmcKKyAgICAgICAgYSBjbG9zdXJlLiBPZiBjb3Vyc2UgdGhlcmUgaXMgYSBzdWJ0bGUgZGlmZmVyZW5jZS4gSWYgdGhlIGxhc3QKKyAgICAgICAgYXJndW1lbnQgdG8gYXBwbHkoKSBpcyBhbiBhcnJheSwgdGhlbiBlYWNoIG9mIGl0cyBlbGVtZW50cworICAgICAgICBnZXRzIGV4cGFuZGVkIHRvIGFuIGFkZGl0aW9uYWwgcGFyYW1hdGVyLiBUaGUgb2J2aW91cyB1c2UKKyAgICAgICAgd291bGQgYmUgIydjYWxsX290aGVyIGFzIGluOgorCisgICAgICAgICAgICAgICAgbWl4ZWQgZXZhbChvYmplY3Qgb2Isc3RyaW5nIGZ1bmMsbWl4ZWQgKmFyZ3MpIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBhcHBseSgjJ2NhbGxfb3RoZXIsb2IsZnVuYyxhcmdzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgVGhpcyB3aWxsIHJlc3VsdCBpbiBjYWxsaW5nCisgICAgICAgIG9iLT5mdW5jKGFyZ3NbMF0sYXJnc1sxXSwuLi4sYXJnc1tzaXplb2YoYXJncyktMV0pLiAgVXNpbmcKKyAgICAgICAgZnVuY2FsbCgpIGluc3RlYWQgb2YgYXBwbHkoKSB3b3VsZCBoYXZlIGdpdmVuIHVzCisgICAgICAgIG9iLT5mdW5jKGFyZ3MpLgorCisgICAgICAgIE9mIGNvdXJzZSwgYmVzaWRlcyBlZnVucyB0aGVyZSBhcmUgY2xvc3VyZXMgZm9yIG9wZXJhdG9ycywKKyAgICAgICAgbGlrZSAjJyssICctLCAjJzwsICMnJiYsIGV0Yy4KKworICAgICAgICBXZWxsLCBzbyBmYXIgY2xvc3VyZXMgaGF2ZSBiZWVuIHByZXR0eSBtdWNoIGxpbWl0ZWQgZGVzcGl0ZQorICAgICAgICB0aGVpciBvYnZpb3VzIGZsZXhpYmlsaXR5LiBUaGlzIGNoYW5nZXMgbm93IHdpdGggdGhlCisgICAgICAgIGludHJvZHVjdGlvbiBvZiBjb25kaXRpb25hbCBhbmQgbG9vcCBvcGVyYXRvcnMuIEZvciBleGFtcGxlLAorICAgICAgICB0cnk6CisKKyAgICAgICAgICAgICAgICBjbG9zdXJlIG1heDsKKyAgICAgICAgICAgICAgICBtYXggPSBsYW1iZGEoICh7ICd4LCAneSB9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7ICMnPyAsKHsgIyc+LCAneCwgJ3kgfSksICd4LCAneSB9KSApOworICAgICAgICAgICAgICAgIHJldHVybiBmdW5jYWxsKG1heCw3LDMpOworCisgICAgICAgIFRoZSBhYm92ZSBleGFtcGxlIHdpbGwgcmV0dXJuIDcuIFdoYXQgaGFwcGVuZWQ/IE9mIGNvdXJzZSAjJz8KKyAgICAgICAgaXMgdGhlIGNvbmRpdGlvbmFsIG9wZXJhdG9yIGFuZCBpdHMgJ3N5bnRheCcgaXMgYXMgZm9sbG93czoKKworICAgICAgICAgICAgICAgICh7ICMnPywgY29uZDEsIHZhbDEsIGNvbmQyLCB2YWwyLCAuLi4sIGNvbmRuLCB2YWxuLAorICAgICAgICAgICAgICAgICAgdmFsZGVmYXVsdCB9KTsKKworICAgICAgICBJdCBldmFsdWF0ZXMgY29uZDEsIGNvbmQyLCAuLi4sIGNvbmRuIHN1Y2Nlc3NpdmVseSB1bnRpbCBpdAorICAgICAgICBnZXRzIGEgbm9uemVybyByZXN1bHQgYW5kIHRoZW4gcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZworICAgICAgICB2YWx1ZS4gSWYgdGhlcmUgaXMgbm8gY29uZGl0aW9uIGV2YWx1YXRpbmcgdG8gYSBub256ZXJvCisgICAgICAgIHJlc3VsdCwgdmFsZGVmYXVsdCBnZXRzIHJldHVybmVkLiBJZiB2YWxkZWZhdWx0IGlzIG9taXR0ZWQsIDAKKyAgICAgICAgZ2V0cyByZXR1cm5lZC4gIyc/ISB3b3JrcyBqdXN0IGxpa2UgIyc/LCBleGNlcHQgdGhhdCB0aGUgIQorICAgICAgICBvcGVyYXRvciBpcyBhcHBsaWVkIHRvIGNvbmRpdGlvbnMgYmVmb3JlIHRlc3RpbmcuIFRoZXJlZm9yZSwKKyAgICAgICAgd2hpbGUgIyc/IGlzIHNvbWV3aGF0IGxpa2UgYW4gaWYgc3RhdGVtZW50LCAjJz8hIHJlc2VtYmxlcyBhbgorICAgICAgICBpZl9ub3Qgc3RhdGVtZW50IGlmIHRoZXJlIHdlcmUgb25lLgorCisgICAgICAgIFRoZXJlIGFyZSBhbHNvIGxvb3BzOgorCisgICAgICAgICAgICAgICAgKHsgIydkbywgbG9vcGJvZHkxLCAuLi4sIGxvb3Bib2R5TiwgbG9vcGNvbmQsIGxvb3ByZXN1bHQgfSkKKworICAgICAgICB3aWxsIGV2YWx1YXRlIHRoZSBsb29wYm9kaWVzIHVudGlsIGxvb3Bjb25kIGV2YWx1YXRlcyB0byAwIGFuZAorICAgICAgICB0aGVuIHJldHVybiB0aGUgdmFsdWUgb2YgbG9vcHJlc3VsdC4gU3ltYm9scyBtYXkgYmUgdXNlZCBhcworICAgICAgICB2YXJpYWJsZXMsIG9mIGNvdXJzZS4KKworICAgICAgICAgICAgICAgICh7ICMnd2hpbGUsIGxvb3Bjb25kLCBsb29wcmVzdWx0LCBsb29wYm9keTEsIC4uLiwgbG9vcGJvZHlOIH0pCisKKyAgICAgICAgd29ya3Mgc2ltaWxhciBidXQgZXZhbHVhdGVzIGxvb3Bjb25kIGJlZm9yZSB0aGUgbG9vcGJvZGllcy4KKworICAgICAgICBUaGUgZm9yZWFjaCgpIGxvb3AgYWxzbyBleGlzdHM6CisKKyAgICAgICAgICAgICAgICAoeyAjJ2ZvcmVhY2gsICd2YXIsIGV4cHIsIGxvb3Bib2R5MSwgLi4uLCBsb29wYm9keU4gfSkKKyAgICAgICAgICAgICAgICAoeyAjJ2ZvcmVhY2gsICh7ICd2YXIxLCAuLi4sICd2YXJOfSkgLCBleHByCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBsb29wYm9keTEsIC4uLiwgbG9vcGJvZHlOIH0pCisKKworICAgICAgICBOb3cgb24gdG8gYSBjb3VwbGUgb2YgdHJpY2t5IHRoaW5nczoKKworICAgICAgICBhKSBIb3cgZG8gSSB3cml0ZSBkb3duIGFuIGFycmF5IHdpdGhpbiBhIGxhbWJkYSBjbG9zdXJlIHRvCisgICAgICAgICAgIGF2b2lkIGludGVycHJldGF0aW9uIGFzIGEgc3ViY2xvc3VyZT8KKworICAgICAgICAgICAoeyAjJ21lbWJlciwgKHsgImFiYyIsICJ4eXoiIH0pLCAneCB9KSB3aWxsIG9idmlvdXNseQorICAgICAgICAgICByZXN1bHQgaW4gYW4gZXJyb3IgYXMgc29vbiBhcyBsYW1iZGEoKSB0cmllcyB0byBpbnRlcnByZXQKKyAgICAgICAgICAgImFiYyIgYXMgYSBjbG9zdXJlIG9wZXJhdG9yLiBUaGUgc29sdXRpb24gaXMgdG8gcXVvdGUgdGhlCisgICAgICAgICAgIGFycmF5LCBhcyBpbjogKHsgIydtZW1iZXIsICcoeyAiYWJjIiwgInh5eiIgfSksICd4IH0pLgorICAgICAgICAgICBBcHBseWluZyBsYW1iZGEoKSB0byB0aGlzIHdpbGwgbm90IHJlc3VsdCBpbiBhbiBlcnJvci4KKyAgICAgICAgICAgSW5zdGVhZCwgdGhlIHF1b3RlIHdpbGwgYmUgc3RyaXBwZWQgZnJvbSB0aGUgYXJyYXkgYW5kIHRoZQorICAgICAgICAgICByZXN1bHQgcmVnYXJkZWQgYXMgYSBub3JtYWwgYXJyYXkgbGl0ZXJhbC4gVGhlIHNhbWUgY2FuIGJlCisgICAgICAgICAgIGFjaGlldmVkIGJ5IHVzaW5nIHRoZSBlZnVuIHF1b3RlKCksIGUuZy46CisKKyAgICAgICAgICAgKHsgIydtZW1iZXIsIHF1b3RlKCAoeyAiYWJjIiwgInh5eiIgfSksICd4ICkgfSkKKworICAgICAgICBiKSBJc24ndCBpdCBhIHNlY3VyaXR5IHJpc2sgdG8gcGFzcywgc2F5LCBhIGNsb3N1cmUgdG8gdGhlCisgICAgICAgICAgIG1hc3RlciBvYmplY3Qgd2hpY2ggdGhlbiBldmFsdWF0ZXMgaXQgd2l0aCBhbGwgdGhlCisgICAgICAgICAgIHBlcm1pc3Npb25zIGl0IGdvdD8KKworICAgICAgICAgICBMdWNraWx5LCBuby4gRWFjaCBjbG9zdXJlIGdldHMgdXBvbiBjb21waWxhdGlvbiBib3VuZCB0bworICAgICAgICAgICB0aGUgb2JqZWN0IGRlZmluaW5nIGl0LiBUaGF0IG1lYW5zIHRoYXQgZXhlY3V0aW5nIGl0IGZpcnN0CisgICAgICAgICAgIHNldHMgdGhpc19vYmplY3QoKSB0byB0aGUgb2JqZWN0IHRoYXQgZGVmaW5lZCBpdCBhbmQgdGhlbgorICAgICAgICAgICBldmFsdWF0ZXMgdGhlIGNsb3N1cmUuIFRoaXMgYWxzbyBhbGxvd3MgdXMgdG8gY2FsbCBsZnVucworICAgICAgICAgICB3aGljaCBtaWdodCBvdGhlcndpc2UgYmUgdW5kZWZpbmVkIGluIHRoZSBjYWxsaW5nIG9iamVjdC4KKworICAgICAgICAgICBUaGVyZSBpcyBob3dldmVyLCBhIHZhcmlhbnQgb2YgbGFtYmRhKCksIGNhbGxlZAorICAgICAgICAgICB1bmJvdW5kX2xhbWJkYSgpLCB3aGljaCB3b3JrcyBzaW1pbGFyIGJ1dCBkb2VzIG5vdCBhbGxvdworICAgICAgICAgICB0aGUgdXNlIG9mIGxmdW5zIGFuZCBkb2VzIG5vdCBiaW5kIHRoZSBjbG9zdXJlIHRvIHRoZQorICAgICAgICAgICBkZWZpbmluZyBvYmplY3QuIFRoZSBkcmF3YmFjayBpcyB0aGF0IHRyeWluZyB0byBldmFsdWF0ZSBpdAorICAgICAgICAgICBieSBhcHBseSgpIG9yIGZ1bmNhbGwoKSB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4gVGhlCisgICAgICAgICAgIGNsb3N1cmUgZmlyc3QgbmVlZHMgdG8gYmUgYm91bmQgYnkgY2FsbGluZyBiaW5kX2xhbWJkYSgpLgorICAgICAgICAgICBiaW5kX2xhbWJkYSgpIG5vcm1hbGx5IHRha2VzIG9uZSBhcmd1bWVudCBhbmQgdHJhbnNmb3JtcyBhbgorICAgICAgICAgICB1bmJvdW5kIGNsb3N1cmUgaW50byBhIGNsb3N1cmUgYm91bmQgdG8gdGhlIG9iamVjdAorICAgICAgICAgICBleGVjdXRpbmcgdGhlIGJpbmRfbGFtYmRhKCkuCisKKyAgICAgICAgICAgUHJpdmlsZWdlZCBvYmplY3RzLCBsaWtlIHRoZSBtYXN0ZXIgYW5kIHRoZSBzaW11bF9lZnVuCisgICAgICAgICAgIG9iamVjdCAob3IgdGhvc2UgYXV0aG9yaXplZCBieSB0aGUgcHJpdmlsZWdlX3Zpb2xhdGlvbigpCisgICAgICAgICAgIGZ1bmN0aW9uIGluIHRoZSBtYXN0ZXIpIG1heSBhbHNvIGdpdmUgYW4gb2JqZWN0IGFzIHRoZQorICAgICAgICAgICBzZWNvbmQgYXJndW1lbnQgdG8gYmluZF9sYW1iZGEoKS4gVGhpcyB3aWxsIGJpbmQgdGhlCisgICAgICAgICAgIGNsb3N1cmUgdG8gdGhhdCBvYmplY3QuIEEgc2FtcGxlIGFwcGxpY2F0aW9uIGlzOgorCisgICAgICAgICAgIGR1bXBfb2JqZWN0KG9iKQorICAgICAgICAgICAvLyB3aWxsIGR1bXAgdGhlIHZhcmlhYmxlcyBvZiBvYiB0byAvZHVtcC5vCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICBjbG9zdXJlIHNhdmU7CisgICAgICAgICAgICAgc2F2ZSA9IHVuYm91bmRfbGFtYmRhKCAoeyB9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7ICMnc2F2ZV9vYmplY3QsICIvb3Blbi9kdW1wIiB9KSApOworICAgICAgICAgICAgIGJpbmRfbGFtYmRhKHNhdmUsb2IpOworICAgICAgICAgICAgIGZ1bmNhbGwoc2F2ZSk7CisgICAgICAgICAgIH0KKworICAgICAgICAgICBiaW5kX2xhbWJkYSgpIGNhbiBhbHNvIGJlIHVzZWQgd2l0aCBlZnVuIGNsb3N1cmVzLgorCisgICAgICAgIGMpIEl0IG1pZ2h0IGJlIGFuIGludGVyZXN0aW5nIGFwcGxpY2F0aW9uIHRvIGNyZWF0ZSBjbG9zdXJlcworICAgICAgICAgICBkeW5hbWljYWxseSBhcyBhbiBhbHRlcm5hdGl2ZSB0byB3cml0aW5nIExQQyBjb2RlIHRvIGEgZmlsZQorICAgICAgICAgICBhbmQgdGhlbiBsb2FkaW5nIGl0LiAgSG93ZXZlciwgaG93IGRvIEkgYXZvaWQgZG9pbmcgZXhhY3RseQorICAgICAgICAgICB0aGF0IGlmIEkgbmVlZCBzeW1ib2xzIGxpa2UgJ3ggb3IgJ3k/CisKKyAgICAgICAgICAgVG8gZG8gdGhhdCBvbmUgdXNlcyB0aGUgcXVvdGUoKSBlZnVuLiBJdCB0YWtlcyBhIHN0cmluZyBhcworICAgICAgICAgICBpdHMgYXJndW1lbnQgYW5kIHRyYW5zZm9ybXMgaXQgaW50byBhIHN5bWJvbC4gRm9yIGV4YW1wbGUsCisgICAgICAgICAgIHdyaXRpbmcgcXVvdGUoIngiKSBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIHdyaXRpbmcgJ3guCisKKyAgICAgICAgZCkgSG93IGRvIEkgdGVzdCBpZiBhIHZhcmlhYmxlIGhvbGRzIGEgY2xvc3VyZT8KKworICAgICAgICAgICBVc2UgdGhlIGNsb3N1cmVwKCkgZWZ1biB3aGljaCB3b3JrcyBsaWtlIGFsbCB0aGUgb3RoZXIgdHlwZQorICAgICAgICAgICB0ZXN0aW5nIGVmdW5zLiBGb3Igc3ltYm9scyB0aGVyZSBpcyBhbHNvIHN5bWJvbHAoKQorICAgICAgICAgICBhdmFpbGFibGUuCisKKyAgICAgICAgZSkgVGhhdCBtZWFucywgSSBjYW4gZG86CisgICAgICAgICAgIGlmIChjbG9zdXJlcChmKSkgcmV0dXJuIGZ1bmNhbGwoZik7IGVsc2UgcmV0dXJuIGY7ID8KKworICAgICAgICAgICBZZXMsIGJ1dCBpbiB0aGUgY2FzZSBvZiBmdW5jYWxsKCkgaXQgaXMgdW5uZWNlc3NhcnkuIElmCisgICAgICAgICAgIGZ1bmNhbGwoKSBnZXRzIG9ubHkgb25lIGFyZ3VtZW50IGFuZCBpdCBpcyBub3QgYSBjbG9zdXJlIGl0CisgICAgICAgICAgIHdpbGwgYmUgcmV0dXJuZWQgdW5jaGFuZ2VkLiBTbyByZXR1cm4gZnVuY2FsbChmKTsgd291bGQKKyAgICAgICAgICAgc3VmZmljZS4KKworICAgICAgICBmKSBJIHdhbnQgdG8gdXNlIGEgZnVuY3Rpb24gaW4gc29tZSBvYmplY3QgYXMgYSBjbG9zdXJlLiBIb3cgZG8gSSBkbworICAgICAgICAgICB0aGF0PworCisgICAgICAgICAgIFRoZXJlIGFyZSBzZXZlcmFsIHdheXMuIElmIHRoZSBmdW5jdGlvbiByZXNpZGVzIGluCisgICAgICAgICAgIHRoaXNfb2JqZWN0KCksIGp1c3QgdXNlICMnZnVuY19uYW1lLiBJZiBub3QsIG9yIGlmIHlvdSB3YW50CisgICAgICAgICAgIHRvIGNyZWF0ZSB0aGUgZnVuY3Rpb24gZG55bmFtaWNhbGx5LCB1c2UgdGhlIGVmdW4KKyAgICAgICAgICAgc3ltYm9sX2Z1bmN0aW9uKCkuIEl0IHRha2VzIGEgc3RyaW5nIGFzIGl0IGZpcnN0IGFuZCBhbgorICAgICAgICAgICBvYmplY3QgYXMgaXRzIHNlY29uZCBhcmd1bWVudCBhbmQgcmV0dXJucyBhIGNsb3N1cmUgd2hpY2gKKyAgICAgICAgICAgdXBvbiBldmFsdWF0aW9uIGNhbGxzIHRoZSBnaXZlbiBmdW5jdGlvbiBpbiB0aGUgZ2l2ZW4KKyAgICAgICAgICAgb2JqZWN0IChhbmQgZmFzdGVyIHRoYW4gY2FsbF9vdGhlcigpLCB0b28sIGlmIGRvbmUgZnJvbQorICAgICAgICAgICBpbnNpZGUgYSBsb29wLCBzaW5jZSBmdW5jdGlvbiBzZWFyY2ggd2lsbCBiZSBkb25lIG9ubHkgd2hlbgorICAgICAgICAgICBjYWxsaW5nIHN5bWJvbF9mdW5jdGlvbigpLgorCisgICAgICAgIGcpIENhbiBJIGNyZWF0ZSBlZnVuIGNsb3N1cmVzIGR5bmFtaWNhbGx5LCB0b28/CisKKyAgICAgICAgICAgWWVzLCBqdXN0IHVzZSBzeW1ib2xfZnVuY3Rpb24oKSB3aXRoIGEgc2luZ2xlIGFyZ3VtZW50LgorICAgICAgICAgICBNb3N0IHVzZWZ1bCBmb3IgbWFya2VyIG9iamVjdHMgYW5kIHRoZSBsaWtlLiBCdXQKKyAgICAgICAgICAgdGhlb3JldGljYWxseSBhIHNlY3VyaXR5IHJpc2sgaWYgbm90IHVzZWQgcHJvcGVybHkgYW5kIGZyb20KKyAgICAgICAgICAgaW5zaWRlIGEgc2VjdXJpdHkgcmVsZXZhbnQgb2JqZWN0LiAgVGFrZSBjYXJlLCBob3dldmVyLAorICAgICAgICAgICB0aGF0LCBpZiB0aGVyZSBpcyBhIHNpbXVsX2VmdW4gd2l0aCB0aGUgc2FtZSBuYW1lLCBpdCB3aWxsCisgICAgICAgICAgIGJlIHByZWZlcnJlZCBhcyBpbiB0aGUgY2FzZSBvZiAjJ2Z1bmN0aW9uLiBVc2UgdGhlIGVmdW46OgorICAgICAgICAgICBtb2RpZmllciB0byBnZXQgdGhlIGVmdW4gaWYgeW91IG5lZWQgaXQuCisKKyAgICAgICAgaCkgQXJlIHRoZXJlIG90aGVyIHVzZXMgb2YgY2xvc3VyZXMgZXhjZXB0IHVzaW5nIHRoZW0gdG8gc3RvcmUKKyAgICAgICAgICAgY29kZT8KKworICAgICAgICAgICBMb3RzLiBGb3IgZXhhbXBsZSwgeW91IGNhbiB1c2UgdGhlbSB3aXRoaW4gYWxtb3N0IGFsbCBvZgorICAgICAgICAgICB0aGUgZWZ1bnMgd2hlcmUgeW91IGdpdmUgYSBmdW5jdGlvbiBhcyBhbiBhcmd1bWVudCwgbGlrZQorICAgICAgICAgICBmaWx0ZXIoKSwgc29ydF9hcnJheSgpIG9yIHdhbGtfbWFwcGluZygpLgorICAgICAgICAgICBzb3J0X2FycmF5KGFycmF5LCMnPikgZG9lcyBpbmRlZWQgd2hhdCBpcyBleHBlY3RlZC4gQW5vdGhlcgorICAgICAgICAgICBhcHBsaWNhdGlvbiBpcyBzZXRfcHJvbXB0KCksIHdoZXJlIGEgY2xvc3VyZSBjYW4gb3V0cHV0CisgICAgICAgICAgIHlvdXIgb3duIHByb21wdCBiYXNlZCBvbiB0aGUgY3VycmVudCB0aW1lIGFuZCBvdGhlciBzdHVmZgorICAgICAgICAgICB3aGljaCBjaGFuZ2VzIGFsbCB0aGUgdGltZS4KKworICAgICAgICBGaW5hbGx5LCB0aGVyZSBhcmUgc29tZSBzcGVjaWFsIGVmdW4vb3BlcmF0b3IgY2xvc3VyZXM6CisKKyAgICAgICAgIydbIDogaW5kZXhlcyBhbiBhcnJheS4KKyAgICAgICAgIydbPCA6IGRvZXMgdGhlIHNhbWUsIGJ1dCBzdGFydGluZyBhdCB0aGUgZW5kLgorICAgICAgICAjJ1suLl0gOiBnZXRzIGFuIGFycmF5IGFuZCB0d28gbnVtYmVycworICAgICAgICAgICAgICAgIGFuZCByZXR1cm5zIGEgc3ViLWFycmF5LgorICAgICAgICAjJ1suLjxdIDogc2FtZSBhcyBhYm92ZSBidXQgdGhlIHNlY29uZCBpbmRleCBpcworICAgICAgICAgICAgICAgIGludGVycHJldGVkIGFzIGNvdW50ZWQgZnJvbSB0aGUgbGVmdCBlbmQuCisgICAgICAgICMnWzwuLl0gIGFuZAorICAgICAgICAjJ1s8Li48XSA6IHNob3VsZCBiZSBjbGVhciBub3cuCisgICAgICAgICMnWy4uIDogdGFrZXMgb25seSBvbmUgaW5kZXggYW5kIHJldHVybnMgdGhlIHN1Yi0KKyAgICAgICAgICAgICAgICBhcnJheSBmcm9tIHRoaXMgaW5kZXggdG8gdGhlIGVuZC4KKyAgICAgICAgIydbPC4uIDogc2FtZSBhcyBhYm92ZSBidXQgdGhlIGluZGV4IGlzIGludGVycHJldGVkCisgICAgICAgICAgICAgICAgYXMgY291bnRlZCBmcm9tIHRoZSBsZWZ0IGVuZC4KKyAgICAgICAgIycoeyA6IHB1dHMgYWxsIGFyZ3VtZW50cyBpbnRvIGFuIGFycmF5LgorICAgICAgICAjJyhbIDogZ2V0cyBhbiB1bnF1b3RlZCAoISkgYXJyYXkgd2hpY2ggbXVzdCBpbmNsdWRlCisgICAgICAgICAgICAgICAgYXQgbGVhc3Qgb25lIGVsZW1lbnQgYXMgYXJndW1lbnQgYW5kIHJldHVybnMgYSBtYXBwaW5nIG9mCisgICAgICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSBnaXZlbiBhcnJheSdzIHNpemUgd2l0aCBvbmUgZW50cnkgdGhhdAorICAgICAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBmaXJzdCBlbGVtZW50IGFzIGtleSBhbmQgdGhlIG90aGVyIGVsZW1lbnRzCisgICAgICAgICAgICAgICAgYXMgdmFsdWVzIHRvIHRoZSBrZXkuCisKKyAgICAgICAgIyduZWdhdGUgaXMgZm9yIHVuYXJ5IG1pbnVzLgorICAgICAgICAjJywgbWF5IGJlIGZvbGxvd2VkIGJ5IGFueSBudW1iZXIgb2YgY2xvc3VyZXMsCisgICAgICAgIGUuZy46ICh7ICgjJywpLAorICAgICAgICAgICAgICAgICAoeyMnPSAnaCwgJ2EsIH0pLCAoeyMnPSwgJ2EsICdiIH0pLCAoeyMnPSwgJ2IsICdoIH0pIH0pCisgICAgICAgIHdpbGwgc3dhcCAnYSBhbmQgJ2Igd2hlbiBjb21waWxlZCBhbmQgZXhlY3V0ZWQuCisKKworICAgICAgICBQcm9jZWR1cmFsIGVsZW1lbnRzOgorICAgICAgICA9PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgIGRlZmluaXRpb24gb2YgdGVybXM6CisgICAgICAgICAgPGJsb2NrPiAgOiB6ZXJvIG9yIG1vcmUgdmFsdWVzIHRvIGJlIGV2YWx1YXRlZC4KKyAgICAgICAgICA8dGVzdD4gICA6IG9uZSB2YWx1ZSB0byBiZSBldmFsdWF0ZWQgYXMgYnJhbmNoIG9yIGxvb3AgY29uZGl0aW9uLgorICAgICAgICAgIDxyZXN1bHQ+IDogb25lIHZhbHVlIHRvIGJlIGV2YWx1YXRlZCBhdCB0aGUgZW5kIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uIG9mIHRoZSBmb3JtOyB0aGUgdmFsdWUgaXMgcmV0dXJuZWQuCisgICAgICAgICAgPGx2YWx1ZT4gOiBsb2NhbCB2YXJpYWJsZS9wYXJhbWV0ZXIsIGdsb2JhbCB2YXJpYWJsZSwgb3IgYW4KKyAgICAgICAgICAgICAgICAgICAgIGluZGV4ZWQgbHZhbHVlLgorICAgICAgICB1c2VkZWQgRUJORiBvcGVyYXRvcnM6CisgICAgICAgIHsgfSAgICAgaXRlcmF0aW9uCisgICAgICAgIFsgXSAgICAgb3B0aW9uCisKKyAgICAgICAgZm9ybXM6CisgICAgICAgICAgKHsjJywgPGJvZHk+IDxyZXN1bHQ+fSkKKyAgICAgICAgICAoeyMnPyB7IDx0ZXN0PiA8cmVzdWx0PiB9IFsgPHJlc3VsdD4gXSB9KQorICAgICAgICAgICh7Iyc/ISB7IDx0ZXN0PiA8cmVzdWx0PiB9IFsgPHJlc3VsdD4gXSB9KQorICAgICAgICAgICh7IycmJiB7IHRlc3QgfSB9KQorICAgICAgICAgICh7Iyd8fCB7IHRlc3QgfSB9KQorICAgICAgICAgICh7Iyd3aGlsZSA8dGVzdD4gPHJlc3VsdD4gPGJvZHk+fSkgICAgbG9vcCB3aGlsZSB0ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmFsdWF0ZXMgbm9uLXplcm8uCisgICAgICAgICAgKHsjJ2RvIDxib2R5PiA8dGVzdD4gPHJlc3VsdD59KSAgICAgICBsb29wIHRpbGwgdGVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZhbHVhdGVzIHplcm8uCisgICAgICAgICAgKHsjJz0geyA8bHZhbHVlPiA8dmFsdWU+IH0gfSkgICAgICAgICBhc3NpZ25tZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlciBhc3NpZ25tZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcnMgd29yaywgdG9vLgorCisgICAgICAgIGxpc3Agc2ltaWxhcnM6CisgICAgICAgICAgIycsICAgICAgICAgICBwcm9nbgorICAgICAgICAgICMnPyAgICAgICAgICAgY29uZAorICAgICAgICAgICMnJiYgICAgICAgICAgYW5kCisgICAgICAgICAgIyd8fCAgICAgICAgICBvcgorICAgICAgICAgICMnd2hpbGUgICAgICAgZG8gICAgICAvKiBidXQgbGlzcCBoYXMgbW9yZSBzeW50YWN0aWMgY2FuZHkgaGVyZSAqLworICAgICAgICAgICMnPSAgICAgICAgICAgc2V0cQorCisgICAgICAgIEEgcGFyYW1ldGVyIC8gbG9jYWwgdmFyaWFibGUgJ2ZvbycgaXMgcmVmZXJlbmNlZCBhcyAnZm9vICwgYQorICAgICAgICBnbG9iYWwgdmFyaWFibGUgYXMgKHsjJ2Zvb30pIC4gSW4gbHZhbHVlIHBvc2l0aW9ucworICAgICAgICAoYXNzaWdubWVudCksIHlvdSBuZWVkIG5vdCBlbmNsb3NlIGdsb2JhbCB2YXJpYWJsZSBjbG9zdXJlcyBpbgorICAgICAgICBhcnJheXMuCisKKyAgICAgICAgQ2FsbCBieSByZWZlcmVuY2UgcGFyYW1ldGVycyBhcmUgZ2l2ZW4gd2l0aCAoeyMnJiwgPGx2YWx1ZT59KQorCisgICAgICAgIFNvbWUgc3BlY2lhbCBlZnVuczoKKyAgICAgICAgIydbICAgICAgICAgICAgIGluZGV4aW5nCisgICAgICAgICMnWzwgICAgICAgICAgICBpbmRleGluZyBmcm9tIHRoZSBlbmQKKyAgICAgICAgIyduZWdhdGUgICAgICAgIHVuYXJ5IC0KKworICAgICAgICBVbmJvdW5kIGxhbWJkYSBjbG9zdXJlcworICAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgIFRoZXNlIGNsb3N1cmVzIGFyZSBub3QgYm91bmQgdG8gYW55IG9iamVjdC4gVGhleSBhcmUgY3JlYXRlZAorICAgICAgICB3aXRoIHRoZSBlZnVuIHVuYm91bmRfbGFtYmRhKCkgLiBUaGV5IGNhbm5vdCBjb250YWluCisgICAgICAgIHJlZmVyZW5jZXMgdG8gZ2xvYmFsIHZhcmlhYmxlcywgYW5kIGFsbCBsZnVuIGNsb3N1cmVzIGFyZQorICAgICAgICBpbnNlcnRlZCBhcyBpcywgc2luY2UgdGhlcmUgaXMgbm8gbmF0aXZlIG9iamVjdCBmb3IgdGhpcworICAgICAgICBjbG9zdXJlLiAgWW91IGNhbiBiaW5kIGFuZCByZWJpbmQgdW5ib3VuZCBsYW1iZGEgY2xvc3VyZXMgdG8KKyAgICAgICAgYW4gb2JqZWN0IHdpdGggZWZ1biBiaW5kX2xhbWJkYSgpIFlvdSBuZWVkIHRvIGJpbmQgaXQgYmVmb3JlCisgICAgICAgIGl0IGNhbiBiZSBjYWxsZWQuIE9yZGluYXJ5IG9iamVjdHMgY2FuIG9ibHkgYmluZCB0bworICAgICAgICB0aGVtc2VsdmVzLCBiaW5kaW5nIHRvIG90aGVyIG9iamVjdHMgY2F1c2VzIGEgcHJpdmlsZWdlCisgICAgICAgIHZpb2xhdGlvbigpLiAgVGhlIHBvaW50IGlzIHRoYXQgcHJldmlvdXNfb2JqZWN0IGZvciBjYWxscyBkb25lCisgICAgICAgIGZyb20gaW5zaWRlIHRoZSBjbG9zdXJlIHdpbGwgcmVmbGVjdCB0aGUgb2JqZWN0IGRvaW5nCisgICAgICAgIGJpbmRfbGFtYmRhKCksIGFuZCBhbGwgb2JqZWN0IC8gdWlkIGJhc2VkIHNlY3VyaXR5IHdpbGwgYWxzbworICAgICAgICByZWZlciB0byB0aGlzIG9iamVjdC4KKworCitBVVRIT1IKKyAgICAgICAgTWFjQmV0aCwgQW15bGFhciwgSHlwCisKK1NFRSBBTFNPCisgICAgICAgIGNsb3N1cmVzLWFic3RyYWN0KExQQyksIGNsb3N1cmVzLWV4YW1wbGUoTFBDKSwgY2xvc3VyZV9ndWlkZShMUEMpCisgICAgICAgIGlubGluZS1jbG9zdXJlcyhMUEMpCmRpZmYgLS1naXQgYS9kb2MvTFBDL2Nsb3N1cmVzLWFic3RyYWN0IGIvZG9jL0xQQy9jbG9zdXJlcy1hYnN0cmFjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjFkOTMyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL0xQQy9jbG9zdXJlcy1hYnN0cmFjdApAQCAtMCwwICsxLDgyIEBACitQcm9jZWR1cmFsIGVsZW1lbnRzOgorPT09PT09PT09PT09PT09PT09PT0KKworZGVmaW5pdGlvbiBvZiB0ZXJtczoKKyAgPGJsb2NrPiAgICAgOiB6ZXJvIG9yIG1vcmUgdmFsdWVzIHRvIGJlIGV2YWx1YXRlZC4KKyAgPHRlc3Q+ICAgICAgOiBvbmUgdmFsdWUgdG8gYmUgZXZhbHVhdGVkIGFzIGJyYW5jaCBvciBsb29wIGNvbmRpdGlvbi4KKyAgPHJlc3VsdD4gICAgOiBvbmUgdmFsdWUgdG8gYmUgZXZhbHVhdGVkIGF0IHRoZSBlbmQgb2YgdGhlIGV4ZWN1dGlvbiBvZgorICAgICAgICAgICAgICAgIHRoZSBmb3JtOyB0aGUgdmFsdWUgaXMgcmV0dXJuZWQuCisgIDxsdmFsdWU+ICAgIDogbG9jYWwgdmFyaWFibGUvcGFyYW1ldGVyLCBnbG9iYWwgdmFyaWFibGUsIG9yIGFuIGluZGV4ZWQKKyAgICAgICAgICAgICAgICBsdmFsdWUuCisgIDxleHByZXNzaW9uPjogb25lIHZhbHVlIHRvIGJlIGV2YWx1YXRlZC4KKyAgPGludGVnZXI+ICAgOiBhbiBpbnRlZ2VyIGNvbnN0YW50CisgIDxzdHJpbmc+ICAgIDogYSBzdHJpbmcgY29uc3RhbnQsIG9yIDAuCit1c2VkIEVCTkYgb3BlcmF0b3JzOgoreyB9ICAgICAgICBpdGVyYXRpb24KK1sgXSAgICAgICAgb3B0aW9uCit8ICAgICAgICBhbHRlcm5hdGl2ZQorCitmb3JtczoKKyAgKHsjJywgPGJvZHk+IDxyZXN1bHQ+fSkKKyAgKHsjJz8geyA8dGVzdD4gPHJlc3VsdD4gfSBbIDxyZXN1bHQ+IF0gfSkKKyAgKHsjJz8hIHsgPHRlc3Q+IDxyZXN1bHQ+IH0gWyA8cmVzdWx0PiBdIH0pCisgICh7IycmJiB7IHRlc3QgfSB9KQorICAoeyMnfHwgeyB0ZXN0IH0gfSkKKyAgKHsjJ3doaWxlIDx0ZXN0PiA8cmVzdWx0PiA8Ym9keT4uLi59KSAgICAgICAgbG9vcCB3aGlsZSB0ZXN0IGV2YWx1YXRlcyBub24temVyby4KKyAgKHsjJ2RvIDxib2R5PiA8dGVzdD4gPHJlc3VsdD59KSAgICAgICAgbG9vcCB0aWxsIHRlc3QgZXZhbHVhdGVzIHplcm8uCisgICh7Iydmb3JlYWNoIDx2YXI+IDxleHByPiA8Ym9keT4uLi59KSAgICAgICAgbG9vcCBvdmVyIGFsbCB2YWx1ZXMgb2YgPGV4cHI+LgorICAoeyMnZm9yZWFjaCAoeyA8dmFyPi4uLjx2YXI+IH0pIDxleHByPiA8Ym9keT4uLi59KQorICAoeyMnPSB7IDxsdmFsdWU+IDx2YWx1ZT4gfSB9KSAgICAgICAgICAgICAgICBhc3NpZ25tZW50CisgICAgICAgICAgICAgICAgCQkJb3RoZXIgYXNzaWdubWVudCBvcGVyYXRvcnMgd29yayB0b28uCisgIGNhc2VfbGFiZWw6IDxpbnRlZ2VyPiB8IDxzdHJpbmc+IHwgIydkZWZhdWx0CisgIGdlbmVyYWxpemVkX2Nhc2VfbGFiZWw6IGNhc2VfbGFiZWwgfCA8aW50ZWdlcj4gIycuLiA8aW50ZWdlcj4KKyAgY2FzZV9sYWJlbF9saXN0OiBjYXNlX2xhYmVsIHwgKHsgeyBnZW5lcmFsaXplZF9jYXNlX2xhYmVsIH0gfSkKKyAgY2FzZV9kZWxpbWl0ZXI6ICMnLCB8ICMnYnJlYWsKKyAgKHsjJ3N3aXRjaCA8ZXhwcmVzc2lvbj4geyBjYXNlX2xhYmVsX2xpc3QgPHJlc3VsdD4gY2FzZV9kZWxpbWl0ZXIgfSB9KQorICAgICAgICBFdmFsdWF0ZSBleHByZXNzaW9uLCB0aGVuIGV2YWx1YXRlIHRoZSByZXN1bHQgZm9ybSBsYWJlbGVkIHdpdGgKKyAgICAgICAgdGhlIHZhbHVlIGVxdWFsIHRvIHRoZSB2YWx1ZSBldmFsdWF0ZWQgZnJvbSBleHByZXNzaW9uLgorICAgICAgICBJZiBubyBtYXRjaGluZyBsYWJlbCBleGlzdHMsIHRoZSB2YWx1ZSBvZiAjJ3N3aXRjaCBpcyAwLgorICAoeyMnY2F0Y2gsIDxib2R5PiBbLCAnbm9sb2cgXSBbLCAncHVibGlzaCBdLCBbLCAncmVzZXJ2ZSwgPGV4cHI+ICB9KQorICAgICAgICBFdmFsdWF0ZXMgdGhlIDxib2R5PiBhbmQgY2F0Y2hlcyBhbnkgcnVudGltZSBlcnJvci4gSWYgdGhlIHN5bWJvbAorICAgICAgICAnbm9sb2cgaXMgYWxzbyBnaXZlbiwgYSBjYXVnaHQgZXJyb3IgaXMgbm90IGxvZ2dlZC4gSWYgdGhlCisgICAgICAgIHN5bWJvbCAncHVibGlzaCBpcyBhbHNvIGdpdmVuLCBtYXN0ZXI6OnJ1bnRpbWVfZXJyb3IoKSBpcworICAgICAgICBjYWxsZWQgZm9yIHRoZSBjYXVnaHQgZXJyb3IuIElmIHRoZSBzeW1ib2wgJ3Jlc2VydmUgd2l0aCBhCisgICAgICAgIGZvbGxvd2luZyBleHByZXNzaW9uIGlzIGdpdmVuLCB0aGlzIHZhbHVlIGlzIHVzZWQgYXMgdGhlCisgICAgICAgIGNvbXB1dGluZyByZXNlcnZlLgorCisKK2xpc3Agc2ltaWxhcnM6CisgICMnLCAgICAgICAgICAgICAgICBwcm9nbgorICAjJz8gICAgICAgICAgICAgICAgY29uZAorICAjJyYmICAgICAgICAgICAgICAgIGFuZAorICAjJ3x8ICAgICAgICAgICAgICAgIG9yCisgICMnd2hpbGUgICAgICAgIGRvICAgICAgICAgLyogYnV0IGxpc3AgaGFzIG1vcmUgc3ludGFjdGljIGNhbmR5IGhlcmUgKi8KKyAgIyc9ICAgICAgICAgICAgICAgIHNldHEKKworQSBwYXJhbWV0ZXIgLyBsb2NhbCB2YXJpYWJsZSAnZm9vJyBpcyByZWZlcmVuY2VkIGFzICdmb28gLCBhIGdsb2JhbAordmFyaWFibGUgYXMgKHsjJ2Zvb30pIC4gSW4gbHZhbHVlIHBvc2l0aW9ucyAoYXNzaWdubWVudCksIHlvdSBuZWVkIG5vdAorZW5jbG9zZSBnbG9iYWwgdmFyaWFibGUgY2xvc3VyZXMgaW4gYXJyYXlzLgorCitDYWxsIGJ5IHJlZmVyZW5jZSBwYXJhbWV0ZXJzIGFyZSBnaXZlbiB3aXRoICh7IycmLCA8bHZhbHVlPn0pCisKK1NvbWUgc3BlY2lhbCBlZnVuczoKKyMnWyAgICAgICAgICAgICAgICBpbmRleGluZworIydbPCAgICAgICAgICAgICAgICBpbmRleGluZyBmcm9tIHRoZSBlbmQKKyMnbmVnYXRlICAgICAgICB1bmFyeSAtCisKK1VuYm91bmQgbGFtYmRhIGNsb3N1cmVzCis9PT09PT09PT09PT09PT09PT09PT09PQorCitUaGVzZSBjbG9zdXJlcyBhcmUgbm90IGJvdW5kIHRvIGFueSBvYmplY3QuIFRoZXkgYXJlIGNyZWF0ZWQgd2l0aCB0aGUgZWZ1bgordW5ib3VuZF9sYW1iZGEoKSAuIFRoZXkgY2Fubm90IGNvbnRhaW4gcmVmZXJlbmNlcyB0byBnbG9iYWwgdmFyaWFibGVzLCBhbmQKK2FsbCBsZnVuIGNsb3N1cmVzIGFyZSBpbnNlcnRlZCBhcyBpcywgc2luY2UgdGhlcmUgaXMgbm8gbmF0aXZlIG9iamVjdCBmb3IKK3RoaXMgY2xvc3VyZS4KK1lvdSBjYW4gYmluZCBhbmQgcmViaW5kIHVuYm91bmQgbGFtYmRhIGNsb3N1cmVzIHRvIGFuIG9iamVjdCB3aXRoIGVmdW4KK2JpbmRfbGFtYmRhKCkgWW91IG5lZWQgdG8gYmluZCBpdCBiZWZvcmUgaXQgY2FuIGJlIGNhbGxlZC4gT3JkaW5hcnkgb2JqZWN0cworY2FuIG9ibHkgYmluZCB0byB0aGVtc2VsdmVzLCBiaW5kaW5nIHRvIG90aGVyIG9iamVjdHMgY2F1c2VzIGEgcHJpdmlsZWdlCit2aW9sYXRpb24oKS4KK1RoZSBwb2ludCBpcyB0aGF0IHByZXZpb3VzX29iamVjdCBmb3IgY2FsbHMgZG9uZSBmcm9tIGluc2lkZSB0aGUgY2xvc3VyZQord2lsbCByZWZsZWN0IHRoZSBvYmplY3QgZG9pbmcgYmluZF9sYW1iZGEoKSwgYW5kIGFsbCBvYmplY3QgLyB1aWQgYmFzZWQKK3NlY3VyaXR5IHdpbGwgYWxzbyByZWZlciB0byB0aGlzIG9iamVjdC4KKworCmRpZmYgLS1naXQgYS9kb2MvTFBDL2Nsb3N1cmVzLWV4YW1wbGUgYi9kb2MvTFBDL2Nsb3N1cmVzLWV4YW1wbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUwZmQzNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9MUEMvY2xvc3VyZXMtZXhhbXBsZQpAQCAtMCwwICsxLDIwMiBAQAorQ09OQ0VQVAorICAgICAgICBjbG9zdXJlcyBleGFtcGxlCisKK0RFU0NSSVBUSU9OCisgICAgICAgIFRoaXMgZG9jdW1lbnQgY29udGFpbnMgc21hbGwgZXhhbXBsZXMgb2YgdGhlIHVzYWdlIG9mCisgICAgICAgIChsYW1iZGEtKWNsb3N1cmVzLiBGb3IgdGVjaG5pY2FsIGRldGFpbHMgc2VlIHRoZSBjbG9zdXJlcyhMUEMpCisgICAgICAgIGRvYy4gRm9yIGhpbnRzIHdoZW4gdG8gdXNlIHdoaWNoIHR5cGUgb2YgY2xvc3VyZSwgc2VlIHRoZSBlbmQKKyAgICAgICAgb2YgdGhpcyBkb2MuCisKKworICAgICAgICBNYW55IE11ZHMgdXNlICdkZXRhaWxzJyB0byBhZGQgbW9yZSBmbGF2b3VyLiAnRGV0YWlscycgYXJlCisgICAgICAgIGl0ZW1zIHdoaWNoIGNhbiBiZSBsb29rZWQgYXQsIGJ1dCBhcmUgbm90IGltcGxlbWVudGVkIGFzIG93bgorICAgICAgICBvYmplY3RzLCBidXQgaW5zdGVhZCBzaW11bGF0ZWQgYnkgdGhlIGVudmlyb25tZW50LgorICAgICAgICBMZXRzIGFzc3VtZSB0aGF0IHRoZSBmdW5jdGlvbgorCisgICAgICAgICAgQWRkRGV0YWlsKHN0cmluZyBrZXl3b3JkLCBzdHJpbmd8Y2xvc3VyZSBkZXNjKQorCisgICAgICAgIGFkZHMgdGhlIGRldGFpbCAna2V5d29yZCcgdG8gdGhlIHJvb20sIHdoaWNoLCB3aGVuIGxvb2sgYXQsCisgICAgICAgIHJldHVybnMgdGhlIHN0cmluZyAnZGVzYycgcmVzcC4gdGhlIHJlc3VsdCBvZiB0aGUgZXhlY3V0aW9uIG9mCisgICAgICAgIGNsb3N1cmUgJ2Rlc2MnIGFzIHRoZSBkZXRhaWwgZGVzY3JpcHRpb24gdG8gdGhlIHBsYXllci4KKworICAgICAgICBOb3cgaW1hZ2luZSB0aGF0IG9uZSB3YW50cyB0byBlcXVpcCBhIHJvb20gd2l0aCBtYWdpYyBydW5lcywKKyAgICAgICAgd2hpY2ggcmVhZCBhcyAnSGVsbG8gPHBsYXllcm5hbWU+IVxuIiB3aGVuIGxvb2tlZCBhdC4KKyAgICAgICAgT2J2aW91c2x5CisKKyAgICAgICAgICBBZGREZXRhaWwoInJ1bmVzIiwgc3ByaW50ZiggIkhlbGxvICVzIVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCB0aGlzX3BsYXllcigpLT5RdWVyeU5hbWUoKSkpOworCisgICAgICAgIGlzIG5vdCBzdWZmaWNpZW50LCBhcyB0aGUgJ3RoaXNfcGxheWVyKCknIGlzIGV4ZWN1dGVkIHRvIGVhcmx5CisgICAgICAgIGFuZCBqdXN0IG9uY2U6IGZvciB0aGUgcGxheWVyIGxvYWRpbmcgdGhlIHJvb20uCisKKyAgICAgICAgVGhlIHNvbHV0aW9uIGlzIHRvIHVzZSBjbG9zdXJlcy4gRmlyc3QsIHRoZSBzb2x1dGlvbiB1c2luZworICAgICAgICBsZnVuLWNsb3N1cmVzOgorCisgICAgICAgICAgcHJpdmF0ZSBzdHJpbmcgX2RldGFpbF9ydW5lcyAoKSB7CisgICAgICAgICAgICByZXR1cm4gc3ByaW50ZigiSGVsbG8gJXMhXG4iLCB0aGlzX3BsYXllcigpLT5RdWVyeU5hbWUoKSk7CisgICAgICAgICAgfQorICAgICAgICAgICAgLi4uCisgICAgICAgICAgQWRkRGV0YWlsKCJydW5lcyIsICMnX2RldGFpbF9ydW5lcyk7CisKKyAgICAgICAgb3Igd2l0aCBhbiBpbmxpbmUgY2xvc3VyZToKKworICAgICAgICAgIEFkZERldGFpbCgicnVuZXMiCisgICAgICAgICAgICAgICAgICAgLCAoOiBzcHJpbnRmKCJIZWxsbyAlcyFcbiIsIHRoaXNfcGxheWVyKCktPlF1ZXJ5TmFtZSgpKSA6KQorICAgICAgICAgICAgICAgICAgICk7CisKKworICAgICAgICBTaW1wbGU/IEhlcmUgaXMgdGhlIHNhbWUgY29kZSwgdGhpcyB0aW1lIGFzIGxhbWJkYS1jbG9zdXJlOgorCisgICAgICAgICAgQWRkRGV0YWlsKCAicnVuZXMiCisgICAgICAgICAgICAgICAgICAgLCBsYW1iZGEoMAorICAgICAgICAgICAgICAgICAgICAgLCAoeyMnc3ByaW50ZiwgIkhlbGxvICVzIVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgKHsjJ2NhbGxfb3RoZXIsICh7Iyd0aGlzX3BsYXllcn0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIlF1ZXJ5TmFtZSIgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICApKTsKKworICAgICAgICBXaHkgdGhlIGV4dHJhICh7IH0pIGFyb3VuZCAnIyd0aGlzX3BsYXllcic/ICMndGhpc19wbGF5ZXIKKyAgICAgICAgYWxvbmUgaXMganVzdCBhIHN5bWJvbCwgc3ltYm9saXppbmcgdGhlIGVmdW4gdGhpc19wbGF5ZXIoKSwKKyAgICAgICAgYnV0IGNhbGxfb3RoZXIoKSBuZWVkcyBhbiBvYmplY3QgYXMgZmlyc3QgYXJndW1lbnQuIFRoZXJlZm9yZSwKKyAgICAgICAgdGhlICMndGhpc19wbGF5ZXIgaGFzIHRvIGJlIGludGVycHJldGVkIGFzIGZ1bmN0aW9uIHRvCisgICAgICAgIGV2YWx1YXRlLCB3aGljaCBpcyBlbmZvcmNlZCBieSBlbmNsb3NpbmcgaXQgaW4gKHsgfSkuIFRoZSBzYW1lCisgICAgICAgIHJlYXNvbiBhbHNvIGRpY3RhdGVzIHRoZSBlbmNsb3Npbmcgb2YgdGhlIHdob2xlICMnY2FsbF9vdGhlcgorICAgICAgICBleHByZXNzaW9uIGludG8gKHsgfSkuCisgICAgICAgIE5vdGUgYWxzbyB0aGUgbWlzc2luZyAjJ3JldHVybjogaXQgaXMgbm90IG5lZWRlZC4gVGhlIHJlc3VsdAorICAgICAgICBvZiBhIGxhbWJkYS1jbG9zdXJlIGlzIHRoZSBsYXN0IHZhbHVlIGNvbXB1dGVkLgorCisKKyAgICAgICAgQW5vdGhlciBleGFtcGxlOiBUYXNrIGlzIHRvIHJlZHVjZSB0aGUgSFAgb2YgZXZlcnkgbGl2aW5nIGluIGEKKyAgICAgICAgcm9vbSBieSAxMCwgdW5sZXNzIHRoZSByZXN1bHQgd291bGQgYmUgbmVnYXRpdmUuCisgICAgICAgIFNlbGVjdGluZyBhbGwgbGl2aW5ncyBpbiBhIHJvb20gaXMgc2ltcGx5CisKKyAgICAgICAgICBmaWx0ZXIoYWxsX2ludmVudG9yeShyb29tKSwgIydsaXZpbmcpCisKKyAgICAgICAgVGhlIHRyaWNreSBwYXJ0IGlzIHRvIHJlZHVjZSB0aGUgSFAuIEFnYWluLCBmaXJzdCB0aGUKKyAgICAgICAgbGZ1bi1jbG9zdXJlIHNvbHV0aW9uOgorCisgICAgICAgICAgcHJpdmF0ZSBfcmVkdWNlX2hwIChvYmplY3QgbGl2KSB7CisgICAgICAgICAgICBpbnQgaHA7CisgICAgICAgICAgICBocCA9IGxpdi0+UXVlcnlIUCgpOworICAgICAgICAgICAgaWYgKGhwID4gMTApCisgICAgICAgICAgICAgIGxpdi0+U2V0SFAoaHAtMTApOworICAgICAgICAgIH0KKyAgICAgICAgICAgIC4uLgorCisgICAgICAgICAgbWFwKCBmaWx0ZXIoYWxsX2ludmVudG9yeShyb29tKSwgIydsaXZpbmcpCisgICAgICAgICAgICAgICAgICAgLCAjJ19yZWR1Y2VfaHApCisKKyAgICAgICAgb3IgYXMgYW4gaW5saW5lIGNsb3N1cmU6CisKKyAgICAgICAgICBtYXAoIGZpbHRlcihhbGxfaW52ZW50b3J5KHJvb20pLCAjJ2xpdmluZykKKyAgICAgICAgICAgICAgICAgICAsICg6IGludCBocDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhwID0gbGl2LT5RdWVyeUhQKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaHAgPiAxMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGl2LT5TZXRIUChocCAtIDEwKTsKKyAgICAgICAgICAgICAgICAgICAgICA6KSApOworCisgICAgICAgIEJvdGggZmlsdGVyKCkgYW5kIG1hcCgpIHBhc3MgdGhlIGFjdHVhbCBhcnJheSBpdGVtCisgICAgICAgIGJlaW5nIGZpbHRlcmVkL21hcHBlZCBhcyBmaXJzdCBhcmd1bWVudCB0byB0aGUgY2xvc3VyZS4KKworICAgICAgICBOb3csIHRoZSBsYW1iZGEtY2xvc3VyZSBzb2x1dGlvbjoKKworICAgICAgICAgIG1hcCggZmlsdGVyKGFsbF9pbnZlbnRvcnkocm9vbSksICMnbGl2aW5nKQorICAgICAgICAgICwgbGFtYmRhKCAoeyAnbGl2IH0pCisgICAgICAgICAgICAsICh7JyMsICwgKHsjJz0sICdocCwgKHsjJ2NhbGxfb3RoZXIsICdsaXYsICJRdWVyeUhQIiB9KSB9KQorICAgICAgICAgICAgICAgICAgICAsICh7Iyc/LCAoeyMnPiwgJ2hwLCAxMCB9KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAoeyMnY2FsbF9vdGhlciwgJ2xpdiwgIlNldEhQIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgKHsjJy0sICdocCwgMTAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgKSAvLyBvZiBsYW1iZGEoKQorICAgICAgICAgICk7CisKKyAgICAgICAgSXQgaXMgd29ydGh5IHRvIHBvaW50IG91dCBob3cgbG9jYWwgdmFyaWFibGVzIGxpa2UgJ2hwJyBhcmUKKyAgICAgICAgZGVjbGFyZWQgaW4gYSBsYW1iZGEtY2xvc3VyZTogbm90IGF0IGFsbC4gVGhleSBhcmUganVzdCB1c2VkCisgICAgICAgIGJ5IHdyaXRpbmcgdGhlaXIgc3ltYm9sICdocCAuIFNhbWUgYXBwbGllcyB0byB0aGUgY2xvc3VyZXMKKyAgICAgICAgcGFyYW1ldGVyICdsaXYgLgorICAgICAgICBUaGUgbGFtYmRhLWNsb3N1cmUgc29sdXRpb24gaXMgbm90IHJlY29tbWVuZGVkIGZvciB0aHJlZQorICAgICAgICByZWFzb25zOiBpdCBpcyBjb21wbGljYXRlZCwgZG9lcyBub3QgdXNlIHRoZSBwb3dlcnMgb2YKKyAgICAgICAgbGFtYmRhKCksIGFuZCB0aGUgbGFtYmRhKCkgaXMgcmVjb21waWxlZCBldmVyeSB0aW1lIHRoaXMKKyAgICAgICAgc3RhdGVtZW50IGlzIGV4ZWN1dGVkIQorCisKKyAgICAgICAgU28gZmFyLCBsYW1iZGEtY2xvc3VyZXMgc2VlbSB0byBiZSBqdXN0IGNvbXBsaWNhdGVkLCBhbmQgaW4KKyAgICAgICAgZmFjdDogdGhleSBhcmUuIFRoZWlyIHBvd2VycyBsaWUgZWxzZXdoZXJlLgorCisgICAgICAgIEltYWdpbmUgYSBjb21wdXRhdGlvbiwgbGlrZSBmb3Igc2tpbGwgcmVzb2x1dGlvbiwgd2hpY2gKKyAgICAgICAgaW52b2x2ZXMgdHdvIG9iamVjdCBwcm9wZXJ0aWVzIG11bHRpcGxpZWQgd2l0aCBmYWN0b3JzIGFuZAorICAgICAgICB0aGVuIGFkZGVkLgorICAgICAgICBUaGUgc3RyYWlnaHRmb3J3YXJkIHNvbHV0aW9uIHdvdWxkIGJlIGEgZnVuY3Rpb24gbGlrZToKKworICAgICAgICAgIGludCBDb21wdXRlIChvYmplY3Qgb2JqLCBzdHJpbmcgc3RhdDEsIGludCBmYWN0b3IxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIHN0cmluZyBzdGF0MiwgaW50IGZhY3RvcjIpCisgICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICAgY2FsbF9vdGhlcihvYmosICJRdWVyeSIrc3RhdDEpICogZmFjdG9yMQorICAgICAgICAgICAgICAgICAgICsgY2FsbF9vdGhlcihvYmosICJRdWVyeSIrc3RhdDIpICogZmFjdG9yMjsKKyAgICAgICAgICB9CisKKyAgICAgICAgRWFjaCBjYWxsIHRvIENvbXB1dGUoKSBpbnZvbHZlcyBzZXZlcmFsIG9wZXJhdGlvbnMgKGNvbXB1dGluZworICAgICAgICB0aGUgZnVuY3Rpb24gbmFtZXMgYW5kIHJlc29sdmluZyB0aGUgY2FsbF9vdGhlcigpcykgd2hpY2ggaW4KKyAgICAgICAgZmFjdCBuZWVkIHRvIGJlIGRvbmUganVzdCBvbmNlLiBVc2luZyBsYW1iZGEtY2xvc3VyZXMsIG9uZSBjYW4KKyAgICAgICAgY29uc3RydWN0IGFuZCBjb21waWxlIGEgcGllY2Ugb2YgY29kZSB3aGljaCBiZWhhdmVzIGxpa2UgYQorICAgICAgICBDb21wdXRlKCkgdGFpbG9yZWQgZm9yIGEgc3BlY2lmaWMgc3RhdC9mYWN0b3IgY29tYmluYXRpb246CisKKyAgICAgICAgICBjbG9zdXJlIENvbnN0cnVjdENvbXB1dGUgKG9iamVjdCBvYmosIHN0cmluZyBzdGF0MSwgaW50IGZhY3RvcjEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIHN0cmluZyBzdGF0MiwgaW50IGZhY3RvcjIpCisgICAgICAgICAgeworICAgICAgICAgICAgbWl4ZWQgY29kZTsKKworICAgICAgICAgICAgLy8gQ29uc3RydWN0IHRoZSBmaXJzdCBtdWx0aXBsaWNhdGlvbi4KKyAgICAgICAgICAgIC8vIFRoZSBzeW1ib2xfZnVuY3Rpb24oKSBjcmVhdGVzIGEgc3ltYm9sIGZvciB0aGUKKyAgICAgICAgICAgIC8vIGxmdW4gJ1F1ZXJ5PHN0YXQxPicsIHNwZWVkaW5nIHVwIGxhdGVyIGNhbGxzLgorICAgICAgICAgICAgLy8gTm90ZSBhZ2FpbiB0aGUgZXh0cmEgKHsgfSkgYXJvdW5kIHRoZSBjcmVhdGVkIHN5bWJvbC4KKworICAgICAgICAgICAgY29kZSA9ICh7IycqLCAoeyBzeW1ib2xfZnVuY3Rpb24oIlF1ZXJ5IitzdGF0MSwgb2JqKSB9KQorICAgICAgICAgICAgICAgICAgICAgICAgLCBmYWN0b3IxIH0pOworCisgICAgICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIHNlY29uZCBtdWx0aXBsaWNhdGlvbiwgYW5kIHRoZSBhZGRpdGlvbgorICAgICAgICAgICAgLy8gb2YgYm90aCB0ZXJtcy4KKworICAgICAgICAgICAgY29kZSA9ICh7IycrLCBjb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAsICh7IycqLCAoeyBzeW1ib2xfZnVuY3Rpb24oIlF1ZXJ5IitzdGF0Miwgb2JqKSB9KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgZmFjdG9yMiB9KQorICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAvLyBDb21waWxlIHRoZSBjb2RlIGFuZCByZXR1cm4gdGhlIGdlbmVyYXRlZCBjbG9zdXJlLgorICAgICAgICAgICAgcmV0dXJuIGxhbWJkYSgwLCBjb2RlKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgT25jZSB0aGUgY2xvc3VyZSBpcyBjb21waWxlZCwKKworICAgICAgICAgIHN0cl9kZXhfZnVuID0gQ29uc3RydWN0Q29tcHV0ZShvYmosICJTdHIiLCAxMCwgIkRleCIsIDkwKTsKKworICAgICAgICBpdCBjYW4gYmUgdXNlZCB3aXRoIGEgc2ltcGxlICdmdW5jYWxsKHN0cl9kZXhfZnVuKScuCisKKworREVTQ1JJUFRJT04gLS0gV2hlbiB0byB1c2Ugd2hpY2ggY2xvc3VyZT8KKyAgICAgICAgRmlyc3QsIGEgY2xvc3VyZSBpcyBvbmx5IHRoZW4gdXNlZnVsIGlmIGl0IG5lZWRuJ3QgdG8gbGl2ZSBhbnkKKyAgICAgICAgbG9uZ2VyIHRoYW4gdGhlIG9iamVjdCBkZWZpbmluZyBpdC4gUmVhc29uOiB3aGVuIHRoZSBkZWZpbmluZworICAgICAgICBvYmplY3QgZ2V0cyBkZXN0cnVjdGVkLCB0aGUgY2xvc3VyZSB3aWxsIHZhbmlzaCwgdG9vLgorCisgICAgICAgIEVmdW4tLCBsZnVuLSBhbmQgaW5saW5lIGNsb3N1cmVzIHNob3VsZCBiZSB1c2VkIHdoZXJlIHVzZWZ1bCwgYXMgdGhleQorICAgICAgICBtb3N0bHkgZG8gdGhlIGpvYiBhbmQgYXJlIGVhc3kgdG8gcmVhZC4gVGhlIGRpc2FkdmFudGFnZSBvZiBsZnVuLSBhbmQKKyAgICAgICAgaW5saW5lIGNsb3N1cmVzIGlzIHRoYXQgdGhleSBtYWtlIGEgcmVwbGFjZV9wcm9ncmFtKCkgaW1wb3NzaWJsZQorICAgICAgICAtIGJ1dCBzaW5jZSBzdWNoIG9iamVjdHMgdGVuZCB0byBub3QgYmVpbmcgcmVwbGFjZWFibGUgYXQgYWxsLCB0aGlzIGlzCisgICAgICAgIG5vIHJlYWwgbG9zcy4KKworICAgICAgICBMYW1iZGEgY2xvc3VyZXMgYXJlIG5lZWRlZCBpZiB0aGUgYWN0aW9ucyBvZiB0aGUgY2xvc3VyZSBhcmUKKyAgICAgICAgaGVhdmlseSBkZXBlbmRpbmcgb24gc29tZSBkYXRhIGF2YWlsYWJsZSBvbmx5IGF0IHJ1bnRpbWUsIGxpa2UKKyAgICAgICAgdGhlIGFjdHVhbCBpbnZlbnRvcnkgb2YgYSBjZXJ0YWluIHBsYXllci4KKyAgICAgICAgSWYgeW91IHVzZSBsZnVuLWNsb3N1cmVzIGFuZCBmaW5kIHlvdXJzZWxmIHNob3ZpbmcgYXJvdW5kCisgICAgICAgIHJ1bnRpbWUgZGF0YSBpbiBhcmd1bWVudHMgb3IgKGdhc3AhKSBnbG9iYWwgdmFyaWFibGVzLCBpdCBpcworICAgICAgICB0aW1lIHRvIHRoaW5rIGFib3V0IHVzaW5nIGEgbGFtYmRhLWNsb3N1cmUsIGNvbXBpbGluZyB0aGUKKyAgICAgICAgdmFsdWUgaGFyZCBpbnRvIGl0LgorICAgICAgICBUaGUgZGlzYWR2YW50YWdlcyBvZiBsYW1iZGEgY2xvc3VyZXMgYXJlIGNsZWFyOiB0aGV5IGFyZSBkYW1uCisgICAgICAgIGhhcmQgdG8gcmVhZCwgYW5kIGVhY2ggbGFtYmRhKCkgc3RhdGVtZW50IHJlcXVpcmVzIGV4dHJhIHRpbWUgdG8KKyAgICAgICAgY29tcGlsZSB0aGUgY2xvc3VyZS4KKworCitTRUUgQUxTTworICAgICAgICBjbG9zdXJlcyhMUEMpLCBjbG9zdXJlX2d1aWRlKExQQyksIGNsb3N1cmVzLWFic3RyYWN0KExQQykKZGlmZiAtLWdpdCBhL2RvYy9MUEMvY2xvc3VyZXMyIGIvZG9jL0xQQy9jbG9zdXJlczIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM1Mjg5NAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9MUEMvY2xvc3VyZXMyCkBAIC0wLDAgKzEsMzY5IEBACitDbG9zdXJlcyBwcm92aWRlIGEgbWVhbnMgb2YgY3JlYXRpbmcgY29kZSBkeW5hbWljYWxseSBhbmQgcGFzc2luZyBwaWVjZXMKK29mIGNvZGUgYXMgcGFyYW1ldGVycywgc3RvcmluZyB0aGVtIGluIHZhcmlhYmxlcy4gT25lIG1pZ2h0IHRoaW5rIG9mIHRoZW0KK2FzIGEgdmVyeSBhZHZhbmNlZCBmb3JtIG9mIHByb2Nlc3Nfc3RyaW5nKCkuIEhvd2V2ZXIsIHRoaXMgZmFsbHMgc2hvcnQgb2YKK3doYXQgeW91IGNhbiBhY3R1YWxseSBkbyB3aXRoIHRoZW0uCisKK1RoZSBzaW1wbGVzdCBraW5kIG9mIGNsb3N1cmVzIGFyZSBlZnVucywgbGZ1bnMgb3Igb3BlcmF0b3JzLiBGb3IKK2V4YW1wbGUsICMndGhpc19wbGF5ZXIgaXMgYW4gZXhhbXBsZSBvZiBhIGNsb3N1cmUuIFlvdSBjYW4gYXNzaWduIGl0Cit0byBhIHZhcmlhYmxlIGFzIGluCisKKwljbG9zdXJlIGY7CisJb2JqZWN0IHA7CisJZiA9ICMndGhpc19wbGF5ZXI7CisKK2FuZCBsYXRlciB1c2UgZWl0aGVyIHRoZSBmdW5jYWxsKCkgb3IgYXBwbHkoKSBlZnVuIHRvIGV2YWx1YXRlIGl0LiBMaWtlCisKKwlwID0gZnVuY2FsbChmKTsKKworb3IKKwlwID0gYXBwbHkoZik7CisKK0luIGJvdGggY2FzZXMgdGhlcmUgcCB3aWxsIGFmdGVyd2FyZHMgaG9sZCB0aGUgdmFsdWUgb2YgdGhpc19wbGF5ZXIoKS4KK09mIGNvdXJzZSwgdGhpcyBpcyBvbmx5IGEgcmF0aGVyIHNpbXBsZSBhcHBsaWNhdGlvbi4gTW9yZSB1c2VmdWwKK2luc3RhbmNlcyBvZiBjbG9zdXJlcyBjYW4gYmUgY3JlYXRlZCB1c2luZyB0aGUgbGFtYmRhKCkgZWZ1bi4gSXQgaXMgbXVjaAorbGlrZSB0aGUgbGFtYmRhIGZ1bmN0aW9uIGluIExJU1AuIEZvciBleGFtcGxlLCB5b3UgY2FuIGRvIHRoZSBmb2xsb3dpbmc6CisKKwlmID0gbGFtYmRhKCAoeyAneCB9KSwgKHsgIydlbnZpcm9ubWVudCwgJ3ggfSkgKTsKKworVGhpcyB3aWxsIGNyZWF0ZSBhIGxhbWJkYSBjbG9zdXJlIGFuZCBhc3NpZ24gaXQgdG8gZi4gVGhlIGZpcnN0IGFyZ3VtZW50Cit0byBsYW1iZGEgaXMgYW4gYXJyYXkgZGVzY3JpYmluZyB0aGUgYXJndW1lbnRzIChzeW1ib2xzKSBwYXNzZWQgdG8gdGhlCitjbG9zdXJlIHVwb24gZXZhbHVhdGlvbiBieSBmdW5jYWxsKCkgb3IgYXBwbHkoKS4gWW91IGNhbiBub3cgZXZhbHVhdGUgZiwKK2ZvciBleGFtcGxlIGJ5IG1lYW5zIG9mIGZ1bmNhbGwoZix0aGlzX29iamVjdCgpKS4gVGhpcyB3aWxsIHJlc3VsdCBpbgordGhlIGZvbGxvd2luZyBzdGVwczoKKworCTEuIFRoZSB2YWx1ZSBvZiB0aGlzX29iamVjdCgpIHdpbGwgYmUgYm91bmQgdG8gc3ltYm9sIHguCisJMi4gZW52aXJvbm1lbnQoeCkgZXZhbHVhdGVzIHRvIGVudmlyb25tZW50KHRoaXNfb2JqZWN0KCkpCisJICAgYW5kIGlzIHJldHVybmVkIGFzIHRoZSByZXN1bHQgb2YgdGhlIGZ1bmNhbGwoKS4KKworT25lIG1pZ2h0IHdvbmRlciB3aHkgdGhlcmUgYXJlIHR3byBmdW5jdGlvbnMsIGZ1bmNhbGwoKSBhbmQgYXBwbHkoKSwgdG8KK3BlcmZvcm0gdGhlIHNlZW1pbmdseSBzYW1lIGpvYiwgbmFtZWx5IGV2YWx1YXRpbmcgYSBjbG9zdXJlLiBPZiBjb3Vyc2UKK3RoZXJlIGlzIGEgc3VidGxlIGRpZmZlcmVuY2UuIElmIHRoZSBsYXN0IGFyZ3VtZW50IHRvIGFwcGx5KCkgaXMgYW4gYXJyYXksCit0aGVuIGVhY2ggb2YgaXRzIGVsZW1lbnRzIGdldHMgZXhwYW5kZWQgdG8gYW4gYWRkaXRpb25hbCBwYXJhbWF0ZXIuIFRoZQorb2J2aW91cyB1c2Ugd291bGQgYmUgIydjYWxsX290aGVyIGFzIGluOgorCisJbWl4ZWQgZXZhbChvYmplY3Qgb2Isc3RyaW5nIGZ1bmMsbWl4ZWQgKmFyZ3MpCisJeworCSAgcmV0dXJuIGFwcGx5KCMnY2FsbF9vdGhlcixvYixmdW5jLGFyZ3MpOworCX0KKworVGhpcyB3aWxsIHJlc3VsdCBpbiBjYWxsaW5nIG9iLT5mdW5jKGFyZ3NbMF0sYXJnc1sxXSwuLi4sYXJnc1tzaXplb2YoYXJncyktMV0pLgorVXNpbmcgZnVuY2FsbCgpIGluc3RlYWQgb2YgYXBwbHkoKSB3b3VsZCBoYXZlIGdpdmVuIHVzIG9iLT5mdW5jKGFyZ3MpLgorCitPZiBjb3Vyc2UsIGJlc2lkZXMgZWZ1bnMgdGhlcmUgYXJlIGNsb3N1cmVzIGZvciBvcGVyYXRvcnMsIGxpa2UgIycrLAorIyctLCAjJzwsICMnJiYsIGV0Yy4KKworV2VsbCwgc28gZmFyIGNsb3N1cmVzIGhhdmUgYmVlbiBwcmV0dHkgbXVjaCBsaW1pdGVkIGRlc3BpdGUgdGhlaXIKK29idmlvdXMgZmxleGliaWxpdHkuIFRoaXMgY2hhbmdlcyBub3cgd2l0aCB0aGUgaW50cm9kdWN0aW9uIG9mCitjb25kaXRpb25hbCBhbmQgbG9vcCBvcGVyYXRvcnMuIEZvciBleGFtcGxlLCB0cnk6CisKKwljbG9zdXJlIG1heDsKKwltYXggPSBsYW1iZGEoICh7ICd4LCAneSB9KSwgKHsgIyc/ICwoeyAjJz4sICd4LCAneX0pLCAneCwgJ3kgfSkgfSk7CisJcmV0dXJuIGZ1bmNhbGwobWF4LDcsMyk7CisKK1RoZSBhYm92ZSBleGFtcGxlIHdpbGwgcmV0dXJuIDcuIFdoYXQgaGFwcGVuZWQ/IE9mIGNvdXJzZSAjJz8gaXMgdGhlCitjb25kaXRpb25hbCBvcGVyYXRvciBhbmQgaXRzICdzeW50YXgnIGlzIGFzIGZvbGxvd3M6CisKKwkoeyAjJz8sIGNvbmQxLCB2YWwxLCBjb25kMiwgdmFsMiwgLi4uLCBjb25kbiwgdmFsbiwgdmFsZGVmYXVsdCB9KTsKKworSXQgZXZhbHVhdGVzIGNvbmQxLCBjb25kMiwgLi4uLCBjb25kbiBzdWNjZXNzaXZlbHkgdW50aWwgaXQgZ2V0cyBhCitub256ZXJvIHJlc3VsdCBhbmQgdGhlbiByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlLiBJZiB0aGVyZSBpcyBubworY29uZGl0aW9uIGV2YWx1YXRpbmcgdG8gYSBub256ZXJvIHJlc3VsdCwgdmFsZGVmYXVsdCBnZXRzIHJldHVybmVkLiBJZgordmFsZGVmYXVsdCBpcyBvbWl0dGVkLCAwIGdldHMgcmV0dXJuZWQuICMnPyEgd29ya3MganVzdCBsaWtlICMnPywgZXhjZXB0Cit0aGF0IHRoZSAhIG9wZXJhdG9yIGlzIGFwcGxpZWQgdG8gY29uZGl0aW9ucyBiZWZvcmUgdGVzdGluZy4gVGhlcmVmb3JlLAord2hpbGUgIyc/IGlzIHNvbWV3aGF0IGxpa2UgYW4gaWYgc3RhdGVtZW50LCAjJz8hIHJlc2VtYmxlcyBhbiBpZl9ub3QKK3N0YXRlbWVudCBpZiB0aGVyZSB3ZXJlIG9uZS4KKworCVRoZXJlIGFyZSBhbHNvIGxvb3BzOgorCSh7ICMnZG8sIGxvb3Bib2R5LCBsb29wY29uZCwgbG9vcHJlc3VsdCB9KQorCXdpbGwgZXZhbHVhdGUgbG9vcGJvZHkgdW50aWwgbG9vcGNvbmQgZXZhbHVhdGVzIHRvIDAgYW5kCisJdGhlbiByZXR1cm4gdGhlIHZhbHVlIG9mIGxvb3ByZXN1bHQuIFN5bWJvbHMgbXkgYmUgdXNlZAorCWFzIHZhcmlhYmxlcywgb2YgY291cnNlLgorCisJKHsgIyd3aGlsZSwgbG9vcGNvbmQsIGxvb3ByZXN1bHQsIGxvb3Bib2R5IH0pCisJd29ya3Mgc2ltaWxhciBidXQgZXZhbHVhdGVzIGxvb3Bjb25kIGJlZm9yZSBsb29wYm9keS4KKworVGhlcmUgYXJlLCBob3dldmVyLCBzb21lIHF1ZXN0aW9ucyBvcGVuOgorCithKSBIb3cgZG8gSSB3cml0ZSBkb3duIGFuIGFycmF5IHdpdGhpbiBhIGxhbWJkYSBjbG9zdXJlIHRvIGF2b2lkCisgICBpbnRlcnByZXRhdGlvbiBhcyBhIHN1YmNsb3N1cmU/CisgICAoeyAjJ21lbWJlcl9hcnJheSwgJ3gsICh7ICJhYmMiLCAieHl6IH0pIH0pIHdpbGwgb2J2aW91c2x5IHJlc3VsdCBpbgorICAgYW4gZXJyb3IgYXMgc29vbiBhcyBsYW1iZGEoKSB0cmllcyB0byBpbnRlcnByZXQgImFiYyIgYXMgYSBjbG9zdXJlCisgICBvcGVyYXRvci4gVGhlIHNvbHV0aW9uIGlzIHRvIHF1b3RlIHRoZSBhcnJheSwgYXMgaW46CisgICAoeyAjJ21lbWJlcl9hcnJheSwgJ3gsICcoeyAiYWJjIiwgInh5eiB9KSB9KS4gQXBwbHlpbmcgbGFtYmRhKCkgdG8KKyAgIHRoaXMgd2lsbCBub3QgcmVzdWx0IGluIGFuIGVycm9yLiBJbnN0ZWFkLCB0aGUgcXVvdGUgd2lsbCBiZSBzdHJpcHBlZAorICAgZnJvbSB0aGUgYXJyYXkgYW5kIHRoZSByZXN1bHQgcmVnYXJkZWQgYXMgYSBub3JtYWwgYXJyYXkgbGl0ZXJhbC4gVGhlCisgICBzYW1lIGNhbiBiZSBhY2hpZXZlZCBieSB1c2luZyB0aGUgZWZ1biBxdW90ZSgpLCBlLmcuOgorICAgKHsgIydtZW1iZXJfYXJyYXksICd4LCBxdW90ZSggKHsgImFiYyIsICJ4eXogfSkgKSB9KQorYikgSXNuJ3QgaXQgYSBzZWN1cml0eSByaXNrIHRvIHBhc3MsIHNheSwgYSBjbG9zdXJlIHRvIHRoZSBtYXN0ZXIgb2JqZWN0CisgICB3aGljaCB0aGVuIGV2YWx1YXRlcyBpdCB3aXRoIGFsbCB0aGUgcGVybWlzc2lvbnMgaXQgZ290PworICAgTHVja2lseSwgbm8uIEVhY2ggY2xvc3VyZSBnZXRzIHVwb24gY29tcGlsYXRpb24gYm91bmQgdG8gdGhlIG9iamVjdAorICAgZGVmaW5pbmcgaXQuIFRoYXQgbWVhbnMgdGhhdCBleGVjdXRpbmcgaXQgZmlyc3Qgc2V0cyB0aGlzX29iamVjdCgpCisgICB0byB0aGUgb2JqZWN0IHRoYXQgZGVmaW5lZCBpdCBhbmQgdGhlbiBldmFsdWF0ZXMgdGhlIGNsb3N1cmUuIFRoaXMKKyAgIGFsc28gYWxsb3dzIHVzIHRvIGNhbGwgbGZ1bnMgd2hpY2ggbWlnaHQgb3RoZXJ3aXNlIGJlIHVuZGVmaW5lZCBpbgorICAgdGhlIGNhbGxpbmcgb2JqZWN0LgorICAgVGhlcmUgaXMgaG93ZXZlciwgYSB2YXJpYW50IG9mIGxhbWJkYSgpLCBjYWxsZWQgdW5ib3VuZF9sYW1iZGEoKSwKKyAgIHdoaWNoIHdvcmtzIHNpbWlsYXIgYnV0IGRvZXMgbm90IGFsbG93IHRoZSB1c2Ugb2YgbGZ1bnMgYW5kIGRvZXMgbm90CisgICBiaW5kIHRoZSBjbG9zdXJlIHRvIHRoZSBkZWZpbmluZyBvYmplY3QuIFRoZSBkcmF3YmFjayBpcyB0aGF0IHRyeWluZworICAgdG8gZXZhbHVhdGUgaXQgYnkgYXBwbHkoKSBvciBmdW5jYWxsKCkgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuIFRoZQorICAgY2xvc3VyZSBmaXJzdCBuZWVkcyB0byBiZSBib3VuZCBieSBjYWxsaW5nIGJpbmRfbGFtYmRhKCkuCisgICBiaW5kX2xhbWJkYSgpIG5vcm1hbGx5IHRha2VzIG9uZSBhcmd1bWVudCBhbmQgdHJhbnNmb3JtcyBhbiB1bmJvdW5kCisgICBjbG9zdXJlIGludG8gYSBjbG9zdXJlIGJvdW5kIHRvIHRoZSBvYmplY3QgZXhlY3V0aW5nIHRoZQorICAgYmluZF9sYW1iZGEoKS4KKyAgIFByaXZpbGVnZWQgb2JqZWN0cywgbGlrZSB0aGUgbWFzdGVyIGFuZCB0aGUgc2ltdWxfZWZ1biBvYmplY3QgKG9yCisgICB0aG9zZSBhdXRob3JpemVkIGJ5IHRoZSBwcml2aWxlZ2VfdmlvbGF0aW9uKCkgZnVuY3Rpb24gaW4gdGhlIG1hc3RlcikKKyAgIG1heSBhbHNvIGdpdmUgYW4gb2JqZWN0IGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYmluZF9sYW1iZGEoKS4gVGhpcworICAgd2lsbCBiaW5kIHRoZSBjbG9zdXJlIHRvIHRoYXQgb2JqZWN0LiBBIHNhbXBsZSBhcHBsaWNhdGlvbiBpczoKKworICAgZHVtcF9vYmplY3Qob2IpCisgICAvLyB3aWxsIGR1bXAgdGhlIHZhcmlhYmxlcyBvZiBvYiB0byAvZHVtcC5vCisgICB7CisgICAgIGNsb3N1cmUgc2F2ZTsKKyAgICAgc2F2ZSA9IHVuYm91bmRfbGFtYmRhKCAoeyB9KSwgKHsgIydzYXZlX29iamVjdCwgIi9vcGVuL2R1bXAiIH0pICk7CisgICAgIGJpbmRfbGFtYmRhKHNhdmUsb2IpOworICAgICBmdW5jYWxsKHNhdmUpOworICAgfQorCisgICBiaW5kX2xhbWJkYSgpIGNhbiBhbHNvIGJlIHVzZWQgd2l0aCBlZnVuIGNsb3N1cmVzLgorCitjKSBJdCBtaWdodCBiZSBhbiBpbnRlcmVzdGluZyBhcHBsaWNhdGlvbiB0byBjcmVhdGUgY2xvc3VyZXMgZHluYW1pY2FsbHkKKyAgIGFzIGFuIGFsdGVybmF0aXZlIHRvIHdyaXRpbmcgTFBDIGNvZGUgdG8gYSBmaWxlIGFuZCB0aGVuIGxvYWRpbmcgaXQuCisgICBIb3dldmVyLCBob3cgZG8gSSBhdm9pZCBkb2luZyBleGFjdGx5IHRoYXQgaWYgSSBuZWVkIHN5bWJvbHMgbGlrZSAneAorICAgb3IgJ3k/CisgICBUbyBkbyB0aGF0IG9uZSB1c2VzIHRoZSBxdW90ZSgpIGVmdW4uIEl0IHRha2VzIGEgc3RyaW5nIGFzIGl0cworICAgYXJndW1lbnQgYW5kIHRyYW5zZm9ybXMgaXQgaW50byBhIHN5bWJvbC4gRm9yIGV4YW1wbGUsIHdyaXRpbmcKKyAgIHF1b3RlKCJ4IikgaXMgZXhhY3RseSB0aGUgc2FtZSBhcyB3cml0aW5nICd4LgorCitkKSBIb3cgZG8gSSB0ZXN0IGlmIGEgdmFyaWFibGUgaG9sZHMgYSBjbG9zdXJlPworICAgVXNlIHRoZSBjbG9zdXJlcCgpIGVmdW4gd2hpY2ggd29ya3MgbGlrZSBhbGwgdGhlIG90aGVyIHR5cGUgdGVzdGluZworICAgZWZ1bnMuIEZvciBzeW1ib2xzIHRoZXJlIGlzIGFsc28gc3ltYm9scCgpIGF2YWlsYWJsZS4KKworZSkgVGhhdCBtZWFucywgSSBjYW4gZG86CisgICBpZiAoY2xvc3VyZXAoZikpIHJldHVybiBmdW5jYWxsKGYpOyBlbHNlIHJldHVybiBmOyA/CisgICBZZXMsIGJ1dCBpbiB0aGUgY2FzZSBvZiBmdW5jYWxsKCkgaXQgaXMgdW5uZWNlc3NhcnkuIElmIGZ1bmNhbGwoKQorICAgZ2V0cyBvbmx5IG9uZSBhcmd1bWVudCBhbmQgaXQgaXMgbm90IGEgY2xvc3VyZSBpdCB3aWxsIGJlIHJldHVybmVkCisgICB1bmNoYW5nZWQuIFNvIHJldHVybiBmdW5jYWxsKGYpOyB3b3VsZCBzdWZmaWNlLgorCitmKSBJIHdhbnQgdG8gdXNlIGEgZnVuY3Rpb24gaW4gc29tZSBvYmplY3QgYXMgYSBjbG9zdXJlLiBIb3cgZG8gSSBkbworICAgdGhhdD8KKyAgIFRoZXJlIGFyZSBzZXZlcmFsIHdheXMuIElmIHRoZSBmdW5jdGlvbiByZXNpZGVzIGluIHRoaXNfb2JqZWN0KCksCisgICBqdXN0IHVzZSAjJ2Z1bmNfbmFtZS4gSWYgbm90LCBvciBpZiB5b3Ugd2FudCB0byBjcmVhdGUgdGhlIGZ1bmN0aW9uCisgICBkbnluYW1pY2FsbHksIHVzZSB0aGUgZWZ1biBzeW1ib2xfZnVuY3Rpb24oKS4gSXQgdGFrZXMgYSBzdHJpbmcgYXMKKyAgIGl0IGZpcnN0IGFuZCBhbiBvYmplY3QgYXMgaXRzIHNlY29uZCBhcmd1bWVudCBhbmQgcmV0dXJucyBhIGNsb3N1cmUKKyAgIHdoaWNoIHVwb24gZXZhbHVhdGlvbiBjYWxscyB0aGUgZ2l2ZW4gZnVuY3Rpb24gaW4gdGhlIGdpdmVuIG9iamVjdAorICAgKGFuZCBmYXN0ZXIgdGhhbiBjYWxsX290aGVyKCksIHRvbywgaWYgZG9uZSBmcm9tIGluc2lkZSBhIGxvb3AsCisgICBzaW5jZSBmdW5jdGlvbiBzZWFyY2ggd2lsbCBiZSBkb25lIG9ubHkgd2hlbiBjYWxsaW5nIHN5bWJvbF9mdW5jdGlvbigpLgorCitnKSBDYW4gSSBjcmVhdGUgZWZ1biBjbG9zdXJlcyBkeW5hbWljYWxseSwgdG9vPworICAgWWVzLCBqdXN0IHVzZSBzeW1ib2xfZnVuY3Rpb24oKSB3aXRoIGEgc2luZ2xlIGFyZ3VtZW50LiBNb3N0IHVzZWZ1bAorICAgZm9yIG1hcmtlciBvYmplY3RzIGFuZCB0aGUgbGlrZS4gQnV0IHRoZW9yZXRpY2FsbHkgYSBzZWN1cml0eSByaXNrCisgICBpZiBub3QgdXNlZCBwcm9wZXJseSBhbmQgZnJvbSBpbnNpZGUgYSBzZWN1cml0eSByZWxldmFudCBvYmplY3QuCisgICBUYWtlIGNhcmUsIGhvd2V2ZXIsIHRoYXQsIGlmIHRoZXJlIGlzIGEgc2ltdWxfZWZ1biB3aXRoIHRoZSBzYW1lCisgICBuYW1lLCBpdCB3aWxsIGJlIHByZWZlcnJlZCBhcyBpbiB0aGUgY2FzZSBvZiAjJ2Z1bmN0aW9uLiBVc2UgdGhlCisgICBlZnVuOjogbW9kaWZpZXIgdG8gZ2V0IHRoZSBlZnVuIGlmIHlvdSBuZWVkIGl0LgorCitoKSBBcmUgdGhlcmUgb3RoZXIgdXNlcyBvZiBjbG9zdXJlcyBleGNlcHQgdXNpbmcgdGhlbSB0byBzdG9yZSBjb2RlPworICAgTG90cy4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gdXNlIHRoZW0gd2l0aGluIGFsbW9zdCBhbGwgb2YgdGhlCisgICBlZnVucyB3aGVyZSB5b3UgZ2l2ZSBhIGZ1bmN0aW9uIGFzIGFuIGFyZ3VtZW50LCBsaWtlIGZpbHRlcigpLAorICAgc29ydF9hcnJheSgpIG9yIHdhbGtfbWFwcGluZygpLiBzb3J0X2FycmF5KGFycmF5LCMnPikgZG9lcyBpbmRlZWQKKyAgIHdoYXQgaXMgZXhwZWN0ZWQuIEFub3RoZXIgYXBwbGljYXRpb24gaXMgc2V0X3Byb21wdCgpLCB3aGVyZSBhCisgICBjbG9zdXJlIGNhbiBvdXRwdXQgeW91ciBvd24gcHJvbXB0IGJhc2VkIG9uIHRoZSBjdXJyZW50IHRpbWUgYW5kIG90aGVyCisgICBzdHVmZiB3aGljaCBjaGFuZ2VzIGFsbCB0aGUgdGltZS4KKworRmluYWxseSwgdGhlcmUgYXJlIHNvbWUgc3BlY2lhbCBlZnVuL29wZXJhdG9yIGNsb3N1cmVzOgorCisjJ1sgaW5kZXhlcyBhbiBhcnJheS4KKyMnWzwgZG9lcyB0aGUgc2FtZSwgYnV0IHN0YXJ0aW5nIGF0IHRoZSBlbmQuCisjJ25lZ2F0ZSBpcyBmb3IgdW5hcnkgbWludXMuCisjJywgbWF5IGJlIGZvbGxvd2VkIGJ5IGFueSBudW1iZXIgb2YgY2xvc3VyZXMsCitlLmcuOiAoeyAjJywgKHsjJz0gJ2gsICdhLCB9KSwgKHsjJz0sICdhLCAnYiB9KSwgKHsjJz0sICdiLCAnaCB9KSB9KQord2lsbCBzd2FwICdhIGFuZCAnYiB3aGVuIGNvbXBpbGVkIGFuZCBleGVjdXRlZC4KKworLS0tLS0tLS0tLS0tCitBbiBleGFtcGxlIGZyb20gQW15bGFhcjoKKworI0kgaGF2ZSB0ZXN0ZWQgdGhlIHJlcGxhY2VfcHJvZ3JhbSgpIGZ1bmN0aW9uYWxpdHkgd2l0aCBvbmUgZXhhbXBsZSwgd2hpY2ggSQorI2luY2x1ZGUgYmVsb3cuIFRoZSByb29tIGlzIGNvbW1vbmx5IGtub3duIGFzIC9yb29tL29yY192YWxsZXkuYyAuCisjQSBwcmVyZXF1aXNpdGUgdG8gbWFrZSB0aGlzIHdvcmsgaXMgdG8gaGF2ZSB2YWx1ZWQgcHJvcGVydGllcyBpbiByb29tLmMgLgorI1RoZSBwcm9wZXJ0eSBDX0VYVFJBX1JFU0VULCBpZiBkZWZpbmVkLCBpcyBldmFsdWF0ZWQgYXQgcmVzZXQgdGltZSBpbgorI3RoZSByZXNldCgpIG9mIHRoZSB1c2VkIHJvb20uYyAuCisjTW9yZW92ZXIsIHlvdSBuZWVkIGEgZnVuY3Rpb24gdG8gcXVlcnkgYW4gdW5wcm9jZXNzZWQgcHJvcGVydHkgdG8gdXNlCisjb3JjX3ZhbGxleS5jIGZyb20gZm9ydHJlc3MuYyAoVGhhdCBpcywgZG9uJ3QgZG8gYW4gYXV0b21hdGljIGZ1bmNhbGwgdGhlcmUuKQorI0lmIHlvdSBjYW4ndCBzdXBwbHkgc3VjaCBhIGZ1bmN0aW9uLCB5b3UgaGF2ZSB0byBzZXQgdGhlIHByb3BlcnR5ICJnZXRfb3JjIgorI2F0IHRoZSBlbmQgb2Ygb3JjX3ZhbGxleS5jICdzIGV4dHJhX3Jlc2V0KCkgd2l0aDoKKyMgICAgYWRkX3Byb3AoImdldF9vcmMiLCBsYW1iZGEoMCwgZ2V0X29yYykgKTsKKyN3aGljaCB3aWxsIHNldCB0aGUgcHJvcGVydHkgdG8gYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGZ1bmN0aW9uIHRoYXQKKyNpcyBpbiB0aGUgdmFyaWFibGUgZ2V0X29yYyBhdCB0aGUgdGltZSB5b3UgZG8gdGhlIGFkZF9wcm9wKCkgY2FsbC4KKyMKKyNCYWNrIHRvIGZvcnRyZXNzLmMgOiBBc3N1bWUgeW91IGhhdmUgdGhlIGZ1bmN0aW9uIHN1Y2Nlc3NmdWxseSBxdWVyaWVkIGFuZAorI3N0b3JlZCBpbiB0aGUgdmFyaWFibGUgZ2V0X29yYy4gTm93IHlvdSBjYW4gY29tcHV0ZSB5b3VyIGV4dHJhX3Jlc2V0KCkKKyNmdW5jdGlvbiBieToKKyMgICAgZ2V0X29yYyA9IGxhbWJkYSggMCwgKHsjJ2Z1bmNhbGwsIGdldF9vcmMsIDgsIDQwfSkgKTsKKyN3aGljaCBjcmVhdGVzIHRoZSB1c3VhbCA4IG9yY3Mgd2l0aCBhbiBhX2NoYXQgY2hhbmNlIG9mIDQwLgorIworI0hlcmUgY29tZXMgdGhlIG9yY192YWxsZXkuYyBzb3VyY2U6CisjCisjICAgIC0tLS0tLS0tLS0tIGN1dCBoZXJlIC0tLS0tLS0gY3V0IGhlcmUgLS0tLS0tLS0gY3V0IGhlcmUgLS0tLS0tLS0tLS0tCisjCisjI2luY2x1ZGUgInJvb20uaCIKKyMjaW5jbHVkZSAiL3N5cy9zdGRwcm9wZXJ0aWVzLmgiCisjI3VuZGVmIEVYVFJBX1JFU0VUCisjI2RlZmluZSBFWFRSQV9SRVNFVCBleHRyYV9yZXNldCgpOworIworI2V4dHJhX3Jlc2V0KCkgeworIyAgICBjbG9zdXJlIGdldF9vcmM7CisjCisjICAgIHJlcGxhY2VfcHJvZ3JhbSgicm9vbS9yb29tIik7IC8qIE11c3QgY29tZSBmaXJzdC4gKi8KKyMgICAgZ2V0X29yYyA9IGxhbWJkYSggKHsnbnVtX29yY3MsICdjaGF0X2NoYW5jZX0pLAorIyAgICAgICAoeyMnPyEsICh7IydwcmVzZW50LCAib3JjIiwgKHsjJ3ByZXZpb3VzX29iamVjdH0pIH0pLAorIyAgICAgICAgICAgKHsjJ2RvLAorIyAgICAgICAgICAgICAgICh7Iyc9LCAnb3JjLCAoeyMnY2xvbmVfb2JqZWN0LCAib2JqL21vbnN0ZXIifSkgfSksCisjICAgICAgICAgICAgICAgKHsjJz0sICdpLCA5fSksCisjICAgICAgICAgICAgICAgKHsjJ2RvLAorIyAgICAgICAgICAgICAgICAgICAoeyMnY2FsbF9vdGhlciwgJ29yYywgInNldF9sZXZlbCIsCisjICAgICAgICAgICAgICAgICAgICAgICAoeyMnKywgKHsjJ3JhbmRvbSwgMn0pLCAxfSkgfSksCisjICAgICAgICAgICAgICAgICAgICh7IydjYWxsX290aGVyLCAnb3JjLAorIyAgICAgICAgICAgICAgICAgICAgICAgKHsjJ1ssCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGUoKHsic2V0X2FnZ3Jlc3NpdmUiLCAic2V0X2FjIiwgInNldF9zaG9ydCIsCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldF9hbCIsICJzZXRfZXAiLCAic2V0X2hwIiwgInNldF9yYWNlIiwKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0X2FsaWFzIiwgInNldF9uYW1lIn0pKSwgKHsjJy09LCAnaSwgMX0pIH0pLAorIyAgICAgICAgICAgICAgICAgICAgICAgKHsjJ1ssCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGUoKHsxLCAwLCAiQW4gb3JjIiwgLTYwLCAxMDE0LCAzMCwgIm9yYyIsCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpcnR5IGNyYXAiLCAib3JjIn0pKSwgJ2l9KSB9KSwKKyMgICAgICAgICAgICAgICAnaSwgMH0pLAorIyAgICAgICAgICAgICAgICh7IydjYWxsX290aGVyLCAnb3JjLCAibG9hZF9hX2NoYXQiLCAnY2hhdF9jaGFuY2UsCisjICAgICAgICAgICAgICAgICAgIHF1b3RlKCh7ICJPcmMgc2F5czogS2lsbCAnZW0hXG4iLAorIyAgICAgICAgICAgICAgICAgICAgICAgIk9yYyBzYXlzOiBCbG9vZHkgaHVtYW5zIVxuIiwKKyMgICAgICAgICAgICAgICAgICAgICAgICJPcmMgc2F5czogU3RvcCAnZW0hXG4iLAorIyAgICAgICAgICAgICAgICAgICAgICAgIk9yYyBzYXlzOiBHZXQgJ2VtIVxuIiwKKyMgICAgICAgICAgICAgICAgICAgICAgICJPcmMgc2F5czogTGV0J3MgcmlwIG91dCBoaXMgZ3V0cyFcbiIsCisjICAgICAgICAgICAgICAgICAgICAgICAiT3JjIHNheXM6IEtpbGwgJ2VtIGJlZm9yZSB0aGV5IHJ1biBhd2F5IVxuIiwKKyMgICAgICAgICAgICAgICAgICAgICAgICJPcmMgc2F5czogV2hhdCBpcyB0aGF0IGh1bWFuIGRvaW5nIGhlcmUhXG4iLAorIyAgICAgICAgICAgICAgICAgICB9KSkgfSksCisjICAgICAgICAgICAgICAgKHsjJz0sICduLCAoeyMnKiwgKHsjJ3JhbmRvbSwgM30pLCA1fSkgfSksCisjICAgICAgICAgICAgICAgKHsjJz0sICd3ZWFwb24sICh7IydjbG9uZV9vYmplY3QsICJvYmovd2VhcG9uIn0pIH0pLAorIyAgICAgICAgICAgICAgICh7Iyc9LCAnaSwgNX0pLAorIyAgICAgICAgICAgICAgICh7IydkbywKKyMgICAgICAgICAgICAgICAgICAgKHsjJ2NhbGxfb3RoZXIsICd3ZWFwb24sCisjICAgICAgICAgICAgICAgICAgICAgICAoeyMnWywKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICBxdW90ZSgoeyAic2V0X2FsdF9uYW1lIiwgInNldF93ZWlnaHQiLCAic2V0X3ZhbHVlIiwKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldF9jbGFzcyIsICJzZXRfbmFtZSJ9KSksICh7IyctPSwgJ2ksIDF9KSB9KSwKKyMgICAgICAgICAgICAgICAgICAgICAgICh7IydbLAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RlKCh7ICJrbmlmZSIsIDEsIDgsICA1LCAia25pZmUiLAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAia25pZmUiLCAxLCAxNSwgNywgImN1cnZlZCBrbmlmZSIsCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJheGUiLCAgIDIsIDI1LCA5LCAiaGFuZCBheGUiLCAgfSkpLAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICh7IycrLCAnbiwgJ2l9KSB9KSB9KSwKKyMgICAgICAgICAgICAgICAnaSwgMH0pLAorIyAgICAgICAgICAgICAgICh7Iyd0cmFuc2ZlciwgJ3dlYXBvbiwgJ29yY30pLAorIyAgICAgICAgICAgICAgICh7Iydjb21tYW5kLAorIyAgICAgICAgICAgICAgICAgICAoeyMnKywgIndpZWxkICIsCisjICAgICAgICAgICAgICAgICAgICAgICAoeyMnY2FsbF9vdGhlciwgJ3dlYXBvbiwgInF1ZXJ5X25hbWUifSkgfSksICdvcmN9KSwKKyMgICAgICAgICAgICAgICAoeyMnbW92ZV9vYmplY3QsICdvcmMsICh7IydwcmV2aW91c19vYmplY3R9KSB9KSwKKyMgICAgICAgICAgICh7IyctPSwgJ251bV9vcmNzLCAxfSksIDB9KQorIyAgICAgICB9KQorIyAgICApOworIyAgICBhZGRfcHJvcCgiZ2V0X29yYyIsIGdldF9vcmMpOworIyAgICBnZXRfb3JjID0gbGFtYmRhKCAwLCAoeyMnZnVuY2FsbCwgZ2V0X29yYywgMiwgNTB9KSApOworIyAgICBhZGRfcHJvcChDX0VYVFJBX1JFU0VULCBnZXRfb3JjKTsKKyMgICAgZnVuY2FsbChnZXRfb3JjKTsKKyN9CisjCisjVFdPX0VYSVQoInJvb20vc2xvcGUiLCAiZWFzdCIsCisjICAgICAgICAicm9vbS9mb3J0cmVzcyIsICJub3J0aCIsCisjICAgICAgICAiVGhlIG9yYyB2YWxsZXkiLAorIyAgICAgICAgIllvdSBhcmUgaW4gdGhlIG9yYyB2YWxsZXkuIFRoaXMgcGxhY2UgaXMgaW5oYWJpdGVkIGJ5IG9yY3MuXG4iICsKKyMgICAgICAgICJUaGVyZSBpcyBhIGZvcnRyZXNzIHRvIHRoZSBub3J0aCwgd2l0aCBsb3Qgb2Ygc2lnbnMgb2Ygb3Jjcy5cbiIsIDEpCisjCisjICAgIC0tLS0tLS0tLS0tIGN1dCBoZXJlIC0tLS0tLS0gY3V0IGhlcmUgLS0tLS0tLS0gY3V0IGhlcmUgLS0tLS0tLS0tLS0tCisjCitQcm9jZWR1cmFsIGVsZW1lbnRzOgorPT09PT09PT09PT09PT09PT09PT0KKworZGVmaW5pdGlvbiBvZiB0ZXJtczoKKyAgPGJsb2NrPiAgOiB6ZXJvIG9yIG1vcmUgdmFsdWVzIHRvIGJlIGV2YWx1YXRlZC4KKyAgPHRlc3Q+ICAgOiBvbmUgdmFsdWUgdG8gYmUgZXZhbHVhdGVkIGFzIGJyYW5jaCBvciBsb29wIGNvbmRpdGlvbi4KKyAgPHJlc3VsdD4gOiBvbmUgdmFsdWUgdG8gYmUgZXZhbHVhdGVkIGF0IHRoZSBlbmQgb2YgdGhlIGV4ZWN1dGlvbiBvZiB0aGUKKyAgICAgICAgICAgICBmb3JtOyB0aGUgdmFsdWUgaXMgcmV0dXJuZWQuCisgIDxsdmFsdWU+IDogbG9jYWwgdmFyaWFibGUvcGFyYW1ldGVyLCBnbG9iYWwgdmFyaWFibGUsIG9yIGFuIGluZGV4ZWQgbHZhbHVlLgordXNlZGVkIEVCTkYgb3BlcmF0b3JzOgoreyB9ICAgICBpdGVyYXRpb24KK1sgXSAgICAgb3B0aW9uCisKK2Zvcm1zOgorICAoeyMnLCA8Ym9keT4gPHJlc3VsdD59KQorICAoeyMnPyB7IDx0ZXN0PiA8cmVzdWx0PiB9IFsgPHJlc3VsdD4gXSB9KQorICAoeyMnPyEgeyA8dGVzdD4gPHJlc3VsdD4gfSBbIDxyZXN1bHQ+IF0gfSkKKyAgKHsjJyYmIHsgdGVzdCB9IH0pCisgICh7Iyd8fCB7IHRlc3QgfSB9KQorICAoeyMnd2hpbGUgPHRlc3Q+IDxyZXN1bHQ+IDxib2R5Pn0pICAgIGxvb3Agd2hpbGUgdGVzdCBldmFsdWF0ZXMgbm9uLXplcm8uCisgICh7IydkbyA8Ym9keT4gPHRlc3Q+IDxyZXN1bHQ+fSkgICAgICAgbG9vcCB0aWxsIHRlc3QgZXZhbHVhdGVzIHplcm8uCisgICh7Iyc9IHsgPGx2YWx1ZT4gPHZhbHVlPiB9IH0pICAgICAgICAgYXNzaWdubWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyIGFzc2lnbm1lbnQgb3BlcmF0b3JzIHdvcmsgdG9vLgorCitsaXNwIHNpbWlsYXJzOgorICAjJywgICAgICAgICAgIHByb2duCisgICMnPyAgICAgICAgICAgY29uZAorICAjJyYmICAgICAgICAgIGFuZAorICAjJ3x8ICAgICAgICAgIG9yCisgICMnd2hpbGUgICAgICAgZG8gICAgICAvKiBidXQgbGlzcCBoYXMgbW9yZSBzeW50YWN0aWMgY2FuZHkgaGVyZSAqLworICAjJz0gICAgICAgICAgIHNldHEKKworQSBwYXJhbWV0ZXIgLyBsb2NhbCB2YXJpYWJsZSAnZm9vJyBpcyByZWZlcmVuY2VkIGFzICdmb28gLCBhIGdsb2JhbAordmFyaWFibGUgYXMgKHsjJ2Zvb30pIC4gSW4gbHZhbHVlIHBvc2l0aW9ucyAoYXNzaWdubWVudCksIHlvdSBuZWVkIG5vdAorZW5jbG9zZSBnbG9iYWwgdmFyaWFibGUgY2xvc3VyZXMgaW4gYXJyYXlzLgorCitDYWxsIGJ5IHJlZmVyZW5jZSBwYXJhbWV0ZXJzIGFyZSBnaXZlbiB3aXRoICh7IycmLCA8bHZhbHVlPn0pCisKK1NvbWUgc3BlY2lhbCBlZnVuczoKKyMnWyAgICAgICAgICAgICBpbmRleGluZworIydbPCAgICAgICAgICAgIGluZGV4aW5nIGZyb20gdGhlIGVuZAorIyduZWdhdGUgICAgICAgIHVuYXJ5IC0KKworVW5ib3VuZCBsYW1iZGEgY2xvc3VyZXMKKz09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZXNlIGNsb3N1cmVzIGFyZSBub3QgYm91bmQgdG8gYW55IG9iamVjdC4gVGhleSBhcmUgY3JlYXRlZCB3aXRoIHRoZSBlZnVuCit1bmJvdW5kX2xhbWJkYSgpIC4gVGhleSBjYW5ub3QgY29udGFpbiByZWZlcmVuY2VzIHRvIGdsb2JhbCB2YXJpYWJsZXMsIGFuZAorYWxsIGxmdW4gY2xvc3VyZXMgYXJlIGluc2VydGVkIGFzIGlzLCBzaW5jZSB0aGVyZSBpcyBubyBuYXRpdmUgb2JqZWN0IGZvcgordGhpcyBjbG9zdXJlLgorWW91IGNhbiBiaW5kIGFuZCByZWJpbmQgdW5ib3VuZCBsYW1iZGEgY2xvc3VyZXMgdG8gYW4gb2JqZWN0IHdpdGggZWZ1bgorYmluZF9sYW1iZGEoKSBZb3UgbmVlZCB0byBiaW5kIGl0IGJlZm9yZSBpdCBjYW4gYmUgY2FsbGVkLiBPcmRpbmFyeSBvYmplY3RzCitjYW4gb2JseSBiaW5kIHRvIHRoZW1zZWx2ZXMsIGJpbmRpbmcgdG8gb3RoZXIgb2JqZWN0cyBjYXVzZXMgYSBwcml2aWxlZ2UKK3Zpb2xhdGlvbigpLgorVGhlIHBvaW50IGlzIHRoYXQgcHJldmlvdXNfb2JqZWN0IGZvciBjYWxscyBkb25lIGZyb20gaW5zaWRlIHRoZSBjbG9zdXJlCit3aWxsIHJlZmxlY3QgdGhlIG9iamVjdCBkb2luZyBiaW5kX2xhbWJkYSgpLCBhbmQgYWxsIG9iamVjdCAvIHVpZCBiYXNlZAorc2VjdXJpdHkgd2lsbCBhbHNvIHJlZmVyIHRvIHRoaXMgb2JqZWN0LgorCisKK1RoZSBmb2xsb3dpbmcgaXMgbW9zdGx5IHZhcG91cndhcmUuCitXZWxsLCBhbm90aGVyIGFwcGxpY2F0aW9uIHdvdWxkIGJlIHRoYXQgc29tZSB0aGluZ3MgaW4gdGhlIGRyaXZlciBjYW4gYmUsCitzb3J0IG9mLCBtaWNyb3Byb2dyYW1tZWQuCitUaGUgbWFzdGVyIG9iamVjdCBjb3VsZCBzZXQgc29tZSBob29rcyBpbiBpbmF1Z3VyYXRlX21hc3RlcigpLCBsaWtlIGNyZWF0aW5nCit0aGUgY29kZSBmb3IgbW92ZV9vYmplY3QoKSwgdXNpbmcgYSBwcmltaXRpdmUgbG93X21vdmVfb2JqZWN0KCkgb3IKK19fbW92ZV9vYmplY3QoKSBvciBzdWNoLiBBbGwgY2FsbHMgb2YgaW5pdCgpLCBleGl0KCksIGV0Yy4gY2FuIHRodXMgYmUKK2NvbnRyb2xsZWQgb24gbXVkbGliIGxldmVsLgorVGhlIGRyaXZlciB3b3VsZCBkbyBhbiBpbXBsaWNpdCBiaW5kX2xhbWJkYSgpIHRvIHRoZSB2aWN0aW0gd2hlbiB0aGUgY2xvc3VyZQoraXMgdXNlZC4KKworZS5nLgorKHsjJz8sICh7Iyc9LCAnb2IsICh7IydmaXJzdF9pbnZlbnRvcnksICdkZXN0aW5hdGlvbn0pIH0pLAorICAgICh7IydkbywKKyAgICAgICAgKHsjJ2NhbGxfb3RoZXIsICdvYiwgImluaXQifSksCisgICAgKHsjJz0sICdvYiwgKHsjJ25leHRfaW52ZW50b3J5LCAnb2J9KSB9KSwgMCB9KQorfSkKKworb3IKKworKHsjJ2ZpbHRlcl9vYmplY3RzLCAoeyMnYWxsX2ludmVudG9yeSwgJ2Rlc3RpbmF0aW9ufSksICJpbml0In0pCisvKiBXb24ndCBzaG93IGluaXQgZmFpbHVyZXMgZHVlIHRvIG1vdmUvZGVzdHJ1Y3QgKi8KKworaXMgZXF1aXZhbGVudCB0bworCitpZiAob2IgPSBmaXJzdF9pbnZlbnRvcnkoZGVzdGluYXRpb24pICkgeworICAgIGRvIHsKKyAgICAgICAgb2ItPmluaXQoKTsKKyAgICB9IHdoaWxlKG9iID0gbmV4dF9pbnZlbnRvcnkob2IpICk7Cit9CisKK2FuZCBpdCdzIHNwZWVkIGlzIG1haW5seSBkZXRlcm1pbmVkIGJ5IHRoZSBjYWxsX290aGVyLiBUaHVzLCBpdCBzaG91bGRuJ3QgYmUKK25vdGljYWJseSBzbG93ZXIgdGhhbiB0aGUgY3VycmVudCBDIGNvZGUgaW4gbW92ZV9vYmplY3QoKS4KKwpkaWZmIC0tZ2l0IGEvZG9jL0xQQy9jb21tZW50cyBiL2RvYy9MUEMvY29tbWVudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNiMGZkMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9MUEMvY29tbWVudHMKQEAgLTAsMCArMSw0NCBAQAorTkFNRQorICAgICAgICBjb21tZW50cworCitTWU5UQVgKKyAgICAgICAgLyogYmxvY2sgY29tbWVudCB0ZXh0ICovCisgICAgICAgIC8vIGxpbmUgY29tbWVudCB0ZXh0IDxlbmQgb2YgbGluZT4KKworCitERVNDUklQVElPTgorICAgICAgICBDb21tZW50cyBhcmUgdXNlZCB0byBzdG9yZWQgYXJiaXRyYXJ5IHRleHQgaW4gdGhlIExQQyBwcm9ncmFtCisgICAgICAgIHNvdXJjZS4gSXQgaXMgYSBnb29kIGlkZWEgaWYgc29tZSBpZiB0aGlzIHRleHQgZXhwbGFpbnMgdGhlCisgICAgICAgIGRlZXBlciBpbnRlbnRpb25zIGJlaGluZCB0aGUgYWN0dWFsIExQQyBzdGF0ZW1lbnRzLgorCisgICAgICAgIFRoZXJlIGFyZSBibG9jayBjb21tZW50cyBhbmQgbGluZSBjb21tZW50cy4KKworICAgICAgICBCbG9jayBjb21tZW50cyBzdGFydCB3aXRoIGEgJy8qJyBhbmQgZW5kIHdpdGggYSAnKi8nLiBUaGV5IGNhbm5vdAorICAgICAgICBiZSBuZXN0ZWQsIHNvCisKKyAgICAgICAgICAvKiB0aGlzIC8qIGlzICovIGlsbGVnYWwgKi8KKworICAgICAgICB3aWxsIHRyZWF0ICcvKiB0aGlzIC8qIGlzICovJyBhcyB0aGUgY29tbWVudC4KKworICAgICAgICBMaW5lIGNvbW1lbnRzIHN0YXJ0IHdpdGggJy8vJyBhbmQgY29udGludWUgdW50aWwgdGhlIHVuZXNjYXBlZCghKQorICAgICAgICBlbmQgb2YgdGhlIGxpbmUgKGFzIGluIHRoZSBuZXcgQyBzdGFuZGFyZCkuCisKKyAgICAgICAgSXQgaXMgbm90IHBvc3NpYmxlIHRvIG5leHQgYmxvY2sgYW5kIGxpbmUgY29tbWVudHMgd2l0aGluCisgICAgICAgIGVhY2ggb3RoZXIuIE1lYW5pbmc6ICcvLycgd2l0aGluIC8qIC4uLiAqLyBoYXMgbm8gc3BlY2lhbCBtZWFuaW5nLAorICAgICAgICBuZWl0aGVyIGRvZXMgJy8qJyBvciAnKi8nIGhhdmUgYWZ0ZXIgYSAvLy4KKworRVhBTVBMRVMKKyAgICAgICAgLyogU2ltcGxlIGJsb2NrIGNvbW1lbnQgKi8KKworICAgICAgICAvKiBCbG9jayBjb21tZW50cyBjYW4KKyAgICAgICAgICAgc3BhbiBzZXZlcmFsIGxpbmVzICovCisKKyAgICAgICAgLy8gU2ltcGxlIGxpbmUgY29tbWVudAorCisgICAgICAgIC8vIExpbmUgY29tbWVudHMgY2FuIFwKKyAgICAgICAgICAgc3BhbiBzZXZlcmFsIGxpbmVzLCB0b28hCisKKyAgICAgICAgLy8jZGVmaW5lIExPTkdfTUFDUk8gVGhlIHVuaXF1ZSBiZWhhdmlvdXIgXAorICAgICAgICAgICBvciBsaW5lIGNvbW1lbnRzIHJlZ2FyZGluZyB0aGUgZW5kIG9mIGxpbmUgXAorICAgICAgICAgICBjYW4gYmUgdXNlZCBmb3IgZXhhbXBsZSB0byBjb21tZW50IG91dCBhIFwKKyAgICAgICAgICAgbGFyZ2UgbWFjcm8gd2l0aCBqdXN0IHRvIGtleXN0cm9rZXMuCmRpZmYgLS1naXQgYS9kb2MvTFBDL2RvLXdoaWxlIGIvZG9jL0xQQy9kby13aGlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjY5YjJhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL0xQQy9kby13aGlsZQpAQCAtMCwwICsxLDE1IEBACitOQU1FCisgICAgICAgIGRvLXdoaWxlCisKK1NZTlRBWAorICAgICAgICBkbyB7IHN0YXRlbWVudCB9IHdoaWxlKGV4cHIpOworCitERVNDUklQVElPTgorICAgICAgICBFeGVjdXRlICdzdGF0bWVudCcgdW50aWwgJ2V4cHInIGV2YXVsYXRlcyB0byAwLgorCisgICAgICAgIEEgJ2JyZWFrJyBpbiB0aGUgJ3N0YXRlbWVudCcgd2lsbCB0ZXJtaW5hdGUgdGhlIGxvb3AuIEEKKyAgICAgICAgJ2NvbnRpbnVlJyB3aWxsIGNvbnRpbnVlIHRoZSBleGVjdXRpb24gZnJvbSB0aGUgYmVnaW5uaW5nIG9mCisgICAgICAgIHRoZSBsb29wLgorCitTRUUgQUxTTworICAgICAgICBmb3IoTFBDKSwgZm9yZWFjaChMUEMpLCB3aGlsZShMUEMpLCBpZihMUEMpLCBzd2l0Y2goTFBDKQpkaWZmIC0tZ2l0IGEvZG9jL0xQQy9lZDAgYi9kb2MvTFBDL2VkMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWRhYzdmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL0xQQy9lZDAKQEAgLTAsMCArMSwzOSBAQAorTkFNRQorICAgICAgICBlZDAKKworREVTQ1JJUFRJT04KKyAgICAgICAgV2hlbiBpbiAnZWQnLCB0aGUgcHJvbXB0IGlzICc6Jy4KKworICAgICAgICBFZCBoYXMgdHdvIG1vZGVzLCBjb21tYW5kIG1vZGUgYW5kIGluc2VydCBtb2RlLiBUaGUgaW5zZXJ0CisgICAgICAgIG1vZGUgaGFzIG5vIHByb21wdC4gWW91IGV4aXQgdGhlIGluc2VydCBtb2RlIGJ5IHR5cGluZyBhCisgICAgICAgIHNpbmdsZSAnLicgb24gYSBsaW5lLgorCisgICAgICAgIEFsbCBjb21tYW5kcyBoYXZlIHRoZSBmb2xsb3dpbmcgc3ludGF4OgorCisgICAgICAgIFgsWWNtZAorCisgICAgICAgIG9yCisKKyAgICAgICAgWGNtZAorCisgICAgICAgIEZvciBleGFtcGxlOgorCisgICAgICAgIDEsMTBwCisgICAgICAgIFdpbGwgcHJpbnQgbGluZSAxIHRvIDEwLgorICAgICAgICAxLDVkCisgICAgICAgIFdpbGwgZGVsZXRlIGxpbmUgMSB0byA1LgorICAgICAgICA4cAorICAgICAgICBXaWxsIHByaW50IGxpbmUgOC4KKyAgICAgICAgQSAnLicgaXMgdGhlICJjdXJyZW50IGxpbmUiLiBUaGUgY3VycmVudCBsaW5lIGlzIHRoZSBsYXN0IGxpbmUKKyAgICAgICAgcmVmZXJlbmNlZC4gSWYgeW91IHdhbnQgdG8gcHJpbnQgbGFzdCBsaW5lICsgMTAgbW9yZToKKyAgICAgICAgLiwuKzEwcAorCitOT1RFCisgICAgICAgIFRoZXNlIG1hbnBhZ2VzIHNlZW0gYSBiaXQgYW50aXF1ZSwgdGhvdWdoIHN0aWxsIGNvcnJlY3QuIEZvciBhCisgICAgICAgIGJldHRlciBkZXRhaWxlZCBoZWxwLCBpbnZva2UgZWQgYW5kIHVzZSB0aGUgYGBoJycgY29tbWFuZC4KKyAgICAgICAgQWxzbyB5b3UgY291bGQgbG9vayBpbnRvIHRoZSBtYW4gcGFnZSBmb3IgZWQoMSkgb24geW91IG5lYXJlc3QKKyAgICAgICAgVW5peCBib3guIEFuZCBmb3IgYSBiaXQgb2YgZnVuIHlvdSBjYW4gdHJ5IHRoZSBnb29kIG9sZAorICAgICAgICBxdWl6KDYpLCBpbnZva2UgYXMgYGBxdWl6IGZ1bmN0aW9uIGVkLWNvbW1hbmQnJy4KKworU0VFIEFMU08KKyAgICAgICAgZWQxKExQQyksIGVkKEUpCmRpZmYgLS1naXQgYS9kb2MvTFBDL2VkMSBiL2RvYy9MUEMvZWQxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZjNhYzIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvTFBDL2VkMQpAQCAtMCwwICsxLDMyIEBACitOQU1FCisgICAgICAgIGVkMQorCitERVNDUklQVElPTgorICAgICAgICBDb21tYW5kcyB0aGF0IHVzZSBhIGxpbmUgcmFuZ2U6CisgICAgICAgIElmIG5vIGxpbmUgaXMgZ2l2ZW4sIHRoZW4gY3VyZW50IGxpbmUgaXMgcHJpbnRlZC4KKworICAgICAgICBwICAgICAgICBQcmludCBsaW5lLgorICAgICAgICBkICAgICAgICBEZWxldGUgbGluZS4KKyAgICAgICAgbCAgICAgICAgUHJpbnQgbGluZSB3aXRoIGNvbnRyb2wgY2hhcmFjdGVycy4KKyAgICAgICAgciBmaWxlICAgICAgICBSZWFkIGluIGEgZmlsZSBhZnRlciB0aGUgbGluZSBzcGVjaWZpZWQuCisgICAgICAgIHMgICAgICAgIFN1YnN0aXR1dGUgcGF0dGVybnMuIFNlZSBzcGVjaWFsIGRvY3VtZW50YXRpb24uCisgICAgICAgIHogICAgICAgIFByaW50IDEwIGxpbmVzLgorICAgICAgICBhICAgICAgICBTdGFydCBpbnNlcnQgbW9kZSBhZnRlciBzcGVjaWZpZWQgbGluZS4gRXhpdCB3aXRoCisgICAgICAgICAgICAgICAgJy4nPHJldHVybj4uCisgICAgICAgIGkgICAgICAgIFN0YXJ0IGluc2VydCBtb2RlIGJlZm9yZSBzcGVjaWZpZWQgbGluZS4gRXhpdCB3aXRoCisgICAgICAgICAgICAgICAgJy4nPHJldHVybj4uCisKKyAgICAgICAgQ29tbWFuZHMgdXNlZCB3aXRob3V0IGxpbmUgc3BlY2lmaWNhdGlvbjoKKworICAgICAgICBxICAgICAgICBRdWl0LiBXb24ndCB3b3JrIGlmIGZpbGUgaXMgY2hhbmdlZC4KKyAgICAgICAgUSAgICAgICAgUXVpdCBhbmQgZGlzY2FyZCBhbGwgY2hhbmdlcyBpZiBub3Qgc2F2ZWQuCisgICAgICAgIHcgICAgICAgIFdyaXRlIHRoZSBmaWxlIG91dC4KKyAgICAgICAgdyBmaWxlICAgICAgICBXcml0ZSB0aGUgZmlsZSBvdXQgd2l0aCBuYW1lICdmaWxlJy4KKyAgICAgICAgZSBmaWxlICAgICAgICBFZGl0IGEgZmlsZS4KKyAgICAgICAgIWNtZCAgICAgICAgR2l2ZSBhIGdhbWUgY29tbWFuZC4gRm9yIGV4YW1wbGUgInNheSBXYWl0LCBJIGFtIGJ1c3kiLgorCisgICAgICAgIEFzIGxpbmUgbnVtYmVycyAnLicgaXMgY3VycmVudCBsaW5lLCBhbmQgJyQnIGlzIGxhc3QgbGluZSBvZgorICAgICAgICBmaWxlLiBUaHVzICcxLCRwJyB3aWxsIGFsd2F5cyBwcmludCBhbGwgb2YgdGhlIGZpbGUuCisKK1NFRSBBTFNPCisgICAgICAgIGVkMihMUEMpCmRpZmYgLS1naXQgYS9kb2MvTFBDL2VkMiBiL2RvYy9MUEMvZWQyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZDUyMGUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvTFBDL2VkMgpAQCAtMCwwICsxLDI1IEBACitOQU1FCisgICAgICAgIGVkMgorCitERVNDUklQVElPTgorICAgICAgICBTdWJzdGl0dXRpb25zIGFyZSB2ZXJ5IGFkdmFuY2VkLgorCisgICAgICAgIEZpcnN0IGEgc2ltcGxlIGV4YW1wbGU6CisKKyAgICAgICAgcy9hcGEvYmVwYS8KKyAgICAgICAgVGhpcyB3aWxsIHN1YnN0aXR1ZSB0aGUgJ2FwYScgaW4gY3VycmVudCBsaW5lIHRvICdiZXBhJy4KKyAgICAgICAgSWYgYW4gJ3AnIGlzIGFwcGVuZGVkLCB5b3Ugd2lsbCBhbHNvIGltbWVkaWF0ZWx5IHNlZSB0aGUgcmVzdWx0LgorCisgICAgICAgIDEsJHMvYXBhL2JlcGEvCisgICAgICAgIFNhbWUsIGJ1dCBhbGwgbGluZXMgaW4gZmlsZS4gT25seSBmaXJzdCBvY2N1cmVuY2Ugb24gZXZlcnkgbGluZS4KKworICAgICAgICBBbnkgY2hhcmFjdGVyIGNhbiB1c2VkIGluc3RlYWQgb2YgJy8nOgorICAgICAgICBzIWFwYSFiZXBhIWcKKyAgICAgICAgVGhlICdnJyBzcGVjaWZpZXMgdGhhdCBhbGwgb2NjdXJlbmNlcyBvZiBhcGEgb24gdGhpcyBsaW5lIGFyZQorICAgICAgICBjaGFuZ2VkIHRvIGJlcGEuCisKKyAgICAgICAgVGhlIHBhdHRlcm4gdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgcmVwbGFjZWQsIGNhbiBiZSBhIHJlZ3VsYXIKKyAgICAgICAgZXhwcmVzc2lvbi4gU2VlIGVkMyBhYm91dCB0aGF0LgorCitTRUUgQUxTTworICAgICAgICBlZDMoTFBDKQpkaWZmIC0tZ2l0IGEvZG9jL0xQQy9lZDMgYi9kb2MvTFBDL2VkMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODBjMDA4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL0xQQy9lZDMKQEAgLTAsMCArMSwzMCBAQAorTkFNRQorICAgICAgICBlZDMKKworREVTQ1JJUFRJT04KKyAgICAgICAgU2VhcmNoaW5nIGlzIGRvbmUgd2l0aDoKKyAgICAgICAgL2hlbGxvLworICAgICAgICBGaW5kIGZpcnN0IGxpbmUgaW4gb2YgYWZ0ZXIgY3VycmVudCBsaW5lLgorICAgICAgICBKdXN0IC8vIHdpbGwgcmVwZWF0IHRoZSBzZWFyY2guCisKKyAgICAgICAgVGhlIHBhdHRlcm5zIGFyZSByZWd1bGFyIGV4cHJlc3Npb25zLCB3aGVyZSBzb21lIGNoYXJhY3RlcnMKKyAgICAgICAgaGF2ZSBhIHNwZWNpYWwgbWVhbmluZzoKKyAgICAgICAgLiAgICAgICAgTWF0Y2ggYW55IGNoYXJhY3Rlci4KKyAgICAgICAgeCogICAgICAgIE1hdGNoIGFueSBudW1iZXJzIG9mIHggKDAgb3IgbW9yZSkuCisgICAgICAgIFthYmNdICAgICAgICBNYXRjaCAnYScsICdiJyBvciAnYycuCisgICAgICAgIFswLTldICAgICAgICBNYXRjaCBhbnkgZGlnaXQgMCAtIDkuCisgICAgICAgIFthLXpdICAgICAgICBNYXRjaCBhbnkgbG93ZXJjYXNlIGxldHRlci4KKyAgICAgICAgXHggICAgICAgIE1hdGNoICd4JyB3aGVyZSAneCcgY2FuIGJlIGFueSBjaGFyYWN0ZXIgZXhjZXB0ICcoJworICAgICAgICAgICAgICAgIGFuZCAnKScuCisKK0VYQU1QTEUKKyAgICAgICAgcy9hYi5kL0FCQ0QvCisgICAgICAgIFN1YnN0aXR1dGUgYW55IHN0cmluZyAnYWJYZCcgYWdhaW5zdCAnQUJDRCcgd2hlcmUgWCBjYW4gYmUgYW55CisgICAgICAgIGNoYXJhY3Rlci4KKworTk9URQorICAgICAgICBUaGlzIG9ubHkgaGFsZiB0aGUgdHJ1dGgsIHRoZXJlIGlzIGxvdHMgbW9yZSBtYWdpYyBpbiB0aGUKKyAgICAgICAgcmVnZXhwcy4KKworU0VFIEFMU08KKyAgICAgICAgcmVnZXhwKEUpLCBlZDQoTFBDKQpkaWZmIC0tZ2l0IGEvZG9jL0xQQy9lZDQgYi9kb2MvTFBDL2VkNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDUzMDNjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL0xQQy9lZDQKQEAgLTAsMCArMSwxMiBAQAorTkFNRQorICAgICAgICBlZDQKKworREVTQ1JJUFRJT04KKyAgICAgICAgSG93IHRvIGNvcHkgZnJvbSBhIHN0YW5kYXJkIGZpbGUuCisKKyAgICAgICAgRW50ZXIgZWQuIFRoZW4gZG8gJ3IgL3Jvb20vdmlsbF9ncmVlbi5jJy4gTm93IHlvdSBoYXZlCisgICAgICAgIHNvbWV0aGluZyBpbiB0aGUgYnVmZmVyLiBDaGFuZ2UgaXQgaW50byB3aGF0IHlvdSB3YW50IGl0IHRvCisgICAgICAgIGJlLiBUaGVuICd3IC9wbGF5ZXJzL3BldGVyL2hhbGwuYycuIE9yICd3IGhhbGwuYycuCisKK1NFRSBBTFNPCisgICAgICAgIGVkNShMUEMpCmRpZmYgLS1naXQgYS9kb2MvTFBDL2VkNSBiL2RvYy9MUEMvZWQ1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNTZmZjMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvTFBDL2VkNQpAQCAtMCwwICsxLDQ3IEBACitOQU1FCisgICAgICAgIGVkNQorCitERVNDUklQVElPTgorICAgICAgICA9IDogcHJpbnRzIGN1cnJlbnQgbGluZQorICAgICAgICBhIDogYXBwZW5kIGxpbmVzCisgICAgICAgIGMgOiBjaGFuZ2UsIHRoYXQgaXMsIGRlbGF0ZSwgdGhhbiBpbnNlcnQKKyAgICAgICAgZCA6IGRlbGV0ZSBsaW5lKHMpCisgICAgICAgIEUgPGZpbGVuYW1lPiA6ICBkaXNjYXJkIGN1cnJlbnQgYnVmZmVyIGFuZCBlZGl0IHRoZSBmaWxlIG5hbWVkCisgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+CisgICAgICAgIGUgPGZpbGVuYW1lPiA6IGxpa2UgZSwgYnV0IHJlZnVzZSBpZiBmaWxlIGhhcyBiZWVuIGNoYW5nZWQKKyAgICAgICAgZiA6IHByaW50IGN1cnJlbnQgZmlsZW5hbWUKKyAgICAgICAgZiA8ZmlsZW5hbWU+IDogc2V0IGZpbGVuYW1lCisgICAgICAgIGkgOiBpbnNlcnQgbGluZShzKQorICAgICAgICBqIDogd2l0aCBubyBvciBvbmUgYXJndW1lbnQ6IGpvaW4gbGluZSB3aXRoIGZvbGxvd2luZyBsaW5lCisgICAgICAgIGogOiB3aXRoIHR3byBhcmd1bWVudHMgOiBqb2luIGxpbmUgcmFuZ2UgZ2l2ZW4KKyAgICAgICAgazxsZXR0ZXI+IDogc2V0IG1hcmsgPGxldHRlcj4gdG8gY3VycmVudCBsaW5lLiA8bGV0dGVyPiBtdXN0CisgICAgICAgICAgICAgICAgYmUgaW4gdGhlIHJhbmdlIFthLXpdIC4gVGhlIG1hcmsgY2FuIGJlIHVzZWQKKyAgICAgICAgICAgICAgICB0aGVyZWluYWZ0ZXIgYXMgYSBsaW5lIGFkZHJlc3MsIHdpdGggYSBsZWFkaW5nIHNsYXNoLgorICAgICAgICAgICAgICAgIChlLmcuIGthIHRvIHNldCBtYXJrIGEsIC9hcCB0byBwcmludCBtYXJrZWQgbGluZSkKKyAgICAgICAgbCA6IHByaW50IGxpbmUgd2l0aCBjb250cm9sIGNoYXJhY3RlcnMKKyAgICAgICAgPHN0YXJ0Piw8ZW5kPm08ZGVzdD4gOiBtb3ZlIGJsb2NrIChsaW5lcyBmcm9tIHN0YXJ0IHRvIGVuZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVoaW5kIGxpbmUgIyBkZXN0CisgICAgICAgIDxsaW5lPm08ZGVzdD4gICAgICAgIDogbW92ZSBzaW5nbGUgbGluZQorICAgICAgICBtPGRlc3Q+ICAgICAgICAgICAgICAgIDogbW92ZSBjdXJyZW50IGxpbmUKKyAgICAgICAgTSA6IHJlbW92ZSBDdHJsLU0gKENSKSBjaGFyYWN0ZXJzLgorICAgICAgICBwIDogcHJpbnQgbGluZQorICAgICAgICBQIDogcHJpbnQgbGluZQorICAgICAgICBRIDogcXVpdCwgZGlzY2FyZGluZyB0aGUgYnVmZmVyCisgICAgICAgIHEgOiB0aGUgc2FtZSwgYnV0IHJlZnVzZSBpZiBmaWxlIGhhcyBiZWVuIGNoYW5nZWQgc2luY2UgbGFzdAorICAgICAgICAgICAgd3JpdGUKKyAgICAgICAgciA6IHJlYWQgaW4gZmlsZS4gSWYgbm8gYWRyZXNzIGlzIGdpdmVuLCBhdCB0aGUgbGFzdCBpbnNlcnQKKyAgICAgICAgICAgIHBvc2l0aW9uLCBpZiBhbHNvIG5vdGhpbmcgd2FzIGluc2VydGVkLCBhdCB0aGUgZW5kIG9mIHRoZQorICAgICAgICAgICAgYnVmZmVyCisgICAgICAgIHMgOiBzdWJzdGl0dXRlCisgICAgICAgIDxzdGFydD4sPGVuZD50PGRlc3Q+ICAgICAgICA6IGNvcHkgYmxvY2sgKCBsaW5lcyBmcm9tIHN0YXJ0IHRvIGVuZCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVoaW5kIGxpbmUgcG9zaXRpb24gZGVzdAorICAgICAgICA8bGluZT50PGRlc3Q+ICAgICAgICAgICAgICAgIDogY29weSBzaW5nbGUgbGluZQorICAgICAgICB0PGRlc3Q+ICAgICAgICAgICAgICAgICAgICAgICAgOiBjb3B5IGN1cnJlbnQgbGluZQorICAgICAgICB3IDogd3JpdGUgZmlsZQorICAgICAgICBXIDogd3JpdGUgZmlsZQorICAgICAgICB4IDogd3JpdGUgZmlsZSBpZiBidWZmZXIgaGFzIGJlZW4gY2hhbmdlZCBzaW5jZSBsYXN0IGNoYW5nZSwKKyAgICAgICAgICAgIHRoZW4gcXVpdAorICAgICAgICB6IDogc2hvdyBhcHByb3guIGEgc2NyZWVuZnVsIG9mIGxpbmVzCisKK1NFRSBBTFNPCisgICAgICAgIGVkNihMUEMpCmRpZmYgLS1naXQgYS9kb2MvTFBDL2VkNiBiL2RvYy9MUEMvZWQ2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiODBhNzAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvTFBDL2VkNgpAQCAtMCwwICsxLDMyIEBACitOQU1FCisgICAgICAgIGVkNgorCitERVNDUklQVElPTgorICAgICAgICBUaGlzIGlzIHRoZSBsaXN0IG9mIGV4dGVuZGVkIGVkIGNvbW1hbmRzIHRoYXQgWGlvIHVuZWFydGhlZAorICAgICAgICBzb21ld2hlcmUsIHRoYW5rcyEKKworICAgICAgICBhKSBuZXZlciB1c2UgMSwkcCB0byBwcmludCBvdXQgYW4gZWRpdGZpbGUsIGJlY2F1c2UgeW91IHdpbGwKKyAgICAgICAgICBiZSB0aHJvd24gb3V0ICdjYXVzZSBvZiB0b28gbXVjaCB0ZXh0IHRyYW5zZmVyZWVkIHRvIHlvdS4KKworICAgICAgICBiKSAkOiBqdW1wIHRvIGVuZCBvZiBmaWxlLgorCisgICAgICAgIGMpID9hbnl0aGluZz8gYW5kID8/IDogc2VhcmNoIGZyb20gYm90dG9tIHRvIHVwLiAobGlrZSAnLycKKyAgICAgICAgICAgZnJvbSBiZWdpbm5pbmcgdG8gZW5kIG9mIGZpbGUuIChhbHNvIHdpdGggc3Vic3RpdHV0aW9ucywKKyAgICAgICAgICAgdHJ5IG91dC4uKQorCisgICAgICAgIGQpICggZy94eHgvcCBzZWFyY2ggZ2xvYmFsIHh4eCBhbmQgcHJpbnQgY29ycmVzcG9uZGluZyBsaW5lcywKKyAgICAgICAgICAgL3h4eC9zL25ldy9vbGQvcCA6IHNlYXJjaCB4eHgsIHN1YnN0aXR1dGUgbmV3IHRvIG9sZCBpbiB0aGlzCisgICAgICAgICAgIGxpbmUgYW5kIHByaW50IG91dC4gKHRyeSB0aGlzIGNvbmNhdGVuYXRpb25zIHdpdGggb3RoZXIKKyAgICAgICAgICAgY29tbWFuZHMpCisKKyAgICAgICAgZSkgMSxubXggKCBzZWUgZWQ1ICkgLCBidXQgYWxzbzogMSxudHggOiBkb24ndCBtb3ZlIHRoZSBsaW5lcywKKyAgICAgICAgICAgYnV0IG1ha2UgYSBjb3B5IG9mIHRoZW0uCisKKyAgICAgICAgZikgeCx5IHcgbmFtZSA6IHNhdmUgbGluZXMgeCB0byB5IHRvIGZpbGUgbmFtZSAoaWYgeW91IGRvbid0CisgICAgICAgICAgIGtub3cgdGhlIGxpbmUgbnVtYmVycyA6ICc9JyBjdXJyZW50IGxpbmUgbnVtYmVyKQorCisgICAgICAgIGcpIHMvJC90ZXh0L3AgOiBhcHBlbmQgdGV4dCB0byB0aGUgZW5kIG9mIGN1cnJlbnQgTElORSBhbmQKKyAgICAgICAgICAgcHJpbnQgbGluZQorCisgICAgICAgIGgpIHMvXi90ZXh0L3AgOiBpbnNlcnQgdGV4dCBhdCBiZWdpbm5pbmcgb2cgY3VycmVudCBMSU5FIGFuZAorICAgICAgICAgICBwcmludCBsaW5lCmRpZmYgLS1naXQgYS9kb2MvTFBDL2VmdW5zIGIvZG9jL0xQQy9lZnVucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTViMjI0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL0xQQy9lZnVucwpAQCAtMCwwICsxLDE2IEBACitDT05DRVBUCisgICAgICAgIGVmdW5zCisKK0RFU0NSSVBUSU9OCisgICAgICAgIEVmdW5zIGFyZSAic3lzdGVtIGNhbGxzIiBpbiB0aGUgTFBDIGRyaXZlciwgdGhlIEMgcHJvZ3JhbQorICAgICAgICB3aGljaCBjb21waWxlcyBhbmQgZXhlY3V0ZXMgdGhlIExQQyBwcm9ncmFtcyBvZiB0aGUgbXVkbGliLgorICAgICAgICBUaGVzZSBhcmUgaGFyZGNvZGVkIGZ1bmN0aW9ucyB3aGljaCBwZXJmb3JtIGJhc2ljIHRhc2tzIHdoaWNoCisgICAgICAgIHdvdWxkIGJlIGluZWZmZWN0aXZlIG9yIGltcG9zc2libGUgdG8gYmUgaW1wbGVtZW50ZWQgaW4gdGhlCisgICAgICAgIG11ZGxpYi4KKworICAgICAgICBUaGVyZSBhcmUgZWZ1bnMgZm9yIGFjY2Vzc2luZyB0aGUgdW5kZXJseWluZyBmaWxlc3lzdGVtLCBmb3IKKyAgICAgICAgY3JlYXRpbmcsIG1vdmluZyBhbmQgZGVzdHJ1Y3Rpbmcgb2JqZWN0cywgZm9yIHdyaXRpbmcKKyAgICAgICAgbWVzc2FnZXMgdG8gdXNlcnMsIGZvciBtYW5pcHVsYXRpb24gb2YgTFBDIGRhdGEgdHlwZXMuCisKK1NFRSBBTFNPCisgICAgICAgIGVmdW4oRSksIGxmdW5zKExQQyksIGFwcGxpZWQoQSksIG1hc3RlcihNKQpkaWZmIC0tZ2l0IGEvZG9jL0xQQy9lc2NhcGUgYi9kb2MvTFBDL2VzY2FwZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTE4NzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL0xQQy9lc2NhcGUKQEAgLTAsMCArMSw4MSBAQAorQ09OQ0VQVAorICAgICAgICBjaGFyYWN0ZXIgZXNjYXBlIGNvZGVzCisKK0RFU0NSSVBUSU9OCisJQ2hhcmFjdGVyIGVzY2FwZSBjb2RlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgc29tZSBjb21tb24KKwlzcGVjaWFsIGNoYXJhY3RlcnMgdGhhdCB3b3VsZCBiZSBhd2t3YXJkIG9yIGltcG9zc2libGUgdG8KKwllbnRlciBpbiB0aGUgc291cmNlIHByb2dyYW0gZGlyZWN0bHkuIFRoZSBlc2NhcGUgY2hhcmFjdGVycworCWNvbWUgaW4gdHdvIHZhcmlldGllczogJ2NoYXJhY3RlciBlc2NhcGVzJywgd2hpY2ggY2FuIGJlCisJdXNlZCB0byByZXByZXNlbnQgc29tZSBwYXJ0aWN1bGFyIGZvcm1hdHRpbmcgYW5kIHNwZWNpYWwKKwljaGFyYWN0ZXJzLCBhbmQgJ251bWVyaWMgZXNjYXBlcycsIHdoaWNoIGFsbG93IGEgY2hhcmFjdGVyIHRvCisJYmUgc3BlY2lmaWVkIGJ5IGl0cyBudW1lcmljIGVuY29kaW5nLgorCisJRXNjYXBlcyBiZWdpbiBhbHdheXMgd2l0aCBhIGJhY2tzbGFzaCAnXCcuIElmIHRoZSBmb2xsb3dpbmcKKwljaGFyYWN0ZXJzIGNvdWxkIG5vdCBiZSB0cmVhdGVkIGFzIGEgdmFsaWQgZXNjYXBlIHRoZSBiYWNrc2xhc2gKKwlpcyBtZXJlbHkgaWdub3JlZC4KKworCVRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyIGVzY2FwZXMgYXJlIGF2YWlsYWJsZSBpbiBMUEMgKHRoZSBjb2RlCisJbWF5IGRpZmZlciBmcm9tIHBsYXRmb3JtIHRvIHBsYXRmb3JtKToKKworCSAgXGEgICAgQ29kZSAwMDcgICAgQmVsbAorICAgICAgICAgIFxiICAgIENvZGUgMDA4ICAgIEJhY2tzcGFjZQorICAgICAgICAgIFxlICAgIENvZGUgMDI3ICAgIEVzY2FwZQorCSAgXGYgICAgQ29kZSAwMTIgICAgRm9ybWZlZWQKKwkgIFxuICAgIENvZGUgMDEwICAgIE5ld2xpbmUKKwkgIFxyICAgIENvZGUgMDEzICAgIENhcnJpYWdlLVJldHVybgorCSAgXHQgICAgQ29kZSAwMDkgICAgVGFidWxhdG9yCisJICBcXCAgICBDb2RlIDA5MiAgICBCYWNrc2xhc2ggaXRzZWxmCisJICBcJyAgICBDb2RlIDAzOSAgICBTaW5nbGUgcXVvdGUKKwkgIFwiICAgIENvZGUgMDM0ICAgIERvdWJsZSBxdW90ZQorCisJVGhlIHNpbmdsZSBxdW90ZSBtYXkgYXBwZWFyIHdpdGhvdXQgcHJlY2VkaW5nIGJhY2tzbGFzaCBpbiBjaGFyYWN0ZXIKKwljb25zdGFudHMsIGFuZCB0aGUgZG91YmxlIHF1b3RlIG1heSBhcHBlYXIgd2l0aG91dCBhIGJhY2tzbGFzaCBpbgorCXN0cmluZyBjb25zdGFudHMuCisKKwlUaGUgbnVtZXJpYyBlc2NhcGVzIGNvdWxkIGJlIHVzZWQgdG8gZXhwcmVzcyBhIGNoYXJhY3RlciBkaXJlY3RseQorCWJ5IGl0cyBjb2RlIGluIGJpbmFyeSwgb2N0YWwsIGRlY2ltYWwgb3IgaGV4YWRlY2ltYWwgbm90YXRpb24uCisJCisJICBcMGIgICBCZWdpbm5pbmcgb2YgYmluYXJ5IG5vdGF0aW9uCisJICBcMG8gICBCZWdpbm5pbmcgb2Ygb2N0YWwgbm90YXRpb24KKwkgIFwweCAgIEJlZ2lubmluZyBvZiBoZXhhZGVjaW1hbCBub3RhdGlvbgorCSAgXHggICAgQmVnaW5uaW5nIG9mIGhleGFkZWNpbWFsIG5vdGF0aW9uCisKKwlBIGJhY2tzbGFzaCBmb2xsb3dlZCBieSBhIGRpZ2l0IChbMC05XSkgd2hpY2ggZG9lcyBub3QgbWFwIHRvIG9uZQorCW9mIHRoZSBhYm92ZSBzdGFydHMgYW4gZXNjYXBlIGluIGRlY2ltYWwgbm90YXRpb24uCisKKwlBIG51bWVyaWMgZXNjYXBlIHRlcm1pbmF0ZXMgd2hlbiBOIGRpZ2l0cyBoYXZlIGJlZW4gdXNlZCB1cCBvcgorCXdoZW4gdGhlIGZpcnN0IGNoYXJhY3RlciB0aGF0IGlzIG5vdCBhIHZhbGlkIGRpZ2l0IGluIHRoYXQKKwlub3RhdGlvbiBpcyBlbmNvdW50ZXJlZC4gTiBpcyAyIGZvciBoZXhhZGV4aW1hbHMsIDMgZm9yCisJZGVjaW1hbHMgYW5kIG9jdGFscyBhbmQgOCBmb3IgYmluYXJ5cy4KKworCUlmIHRoZSBzcGVjaWZpZWQgY29kZSBpcyBncmVhdGVyIHRoYW4gMjU1IGEgd2FybmluZyBpcyBpc3N1ZWQgYW5kCisJdGhlIHZhbHVlIG1vZHVsbyAyNTYgaXMgdXNlZC4KKworRVhBTVBMRVMKKwlQdXQgYSBuZXdsaW5lIGF0IHRoZSBlbmQgb2YgdXNlciBvdXRwdXQKKwkgICJZb3UgZW50ZXIuXG4iCisKKwlBbGVydCB0aGUgdXNlcgorCSAgIkJlZWVwLlxhIFdha2UgdXBcbiIKKworCVB1dCBhIGRvdWJsZSBxdW90ZSBpbiBhIHN0cmluZworCSAgIllvdSBzYXkgXCJoZWxsb1wiXG4iCisKKwlXcml0ZSB0aGUgbGluZSBmcm9tIGFib3ZlCisJICAiXCJZb3Ugc2F5IFxcXCJoZWxsb1xcXCJcXG5cIiIKKworCVB1dCBhIHNpbmdsZSBxdW90ZSBpbiBhIHN0cmluZworCSAgIllvdSBzYXkgJ2hlbGxvJ1xuIgorCisJU29tZSBmb3JtcyB0byB3cml0ZSAiYWJjZGUiCisJICAiYWJjZGUiCisJICAiYWJcOTlkZSIgICAgICAgICAgICAgICh3aXRoIGMncyBjb2RlIGJlaW5nIDk5KQorCSAgImFiXDA5OWRlIgorCSAgImFiXHg2M2RlIiAgICAgICAgICAgICAoOTkgPSAweDYzKQorCSAgImFiXDB4NjNkZSIKKworCVRoZSBmb2xsb3dpbmcgc3RyaW5nIGNvbnNpc3RzIG9mIHR3byBjaGFyYWN0ZXJzCisJICAiXDAxMTEiICAgICAgICAgICAgICAgIChcMDExIGFuZCAxKQorCisJVGhlIGZvbGxvd2luZyBzdHJpbmcgY29uc2lzdHMgb2YgdGhyZWUgY2hhcmFjdGVycworCSAgIlwwbzA5MCIgICAgICAgICAgICAgICAoXDAwMCBhbmQgOSBhbmQgMCkKZGlmZiAtLWdpdCBhL2RvYy9MUEMvZm9yIGIvZG9jL0xQQy9mb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdhOTg4ZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9MUEMvZm9yCkBAIC0wLDAgKzEsMzYgQEAKK05BTUUKKyAgICAgICAgZm9yCisKK1NZTlRBWAorICAgICAgICBmb3IoaW5pdDsgZXhwcjI7IGV4cHIzKSBzdGF0ZW1lbnQ7CisKK0RFU0NSSVBUSU9OCisgICAgICAgIEV4ZWN1dGUgPGluaXQ+IG9uY2UuIFRoZW4sIHdoaWxlIDxleHByMj4gcmV0dXJucyBhIG5vbi16ZXJvCisgICAgICAgIHZhbHVlLCBleGVjdXRlIDxzdGF0ZW1lbnQ+LiBFdmVyeSB0aW1lIDxzdGF0ZW1lbnQ+IGhhcyBiZWVuCisgICAgICAgIGV4ZWN1dGVkLCBvciBhICdjb250aW51ZScgc3RhdGVtZW50IGhhcyBiZWVuIGV4ZWN1dGVkLCBleGVjdXRlCisgICAgICAgIDxleHByMz4gYmVmb3JlIG5leHQgbG9vcC4KKworICAgICAgICA8aW5pdD4gaXMgdXN1YWxseSBhIHNlcmllcyBvZiBvbmUgb3IgbW9yZSBleHByZXNzaW9ucyAocmVtZW1iZXIKKyAgICAgICAgdGhhdCBhc3NpZ25tZW50cyBhcmUgZXhwcmVzc2lvbnMsIHRvbyksIHNlcGFyYXRlZCBieSBjb21tYXMuCisgICAgICAgIEFkZGl0aW9uYWxseSBpdCBpcyBhbHNvIGFsbG93ZWQgdG8gZGVmaW5lIG5ldyBsb2NhbCB2YXJpYWJsZXMKKyAgICAgICAgaGVyZSBhbmQgYXNzaWduIHRoZW0gYW4gaW5pdGlhbCB2YWx1ZS4gVGhlIHNjb3BlIG9mIHN1Y2ggdmFyaWFibGVzCisgICAgICAgIGlzIHRoZSB3aG9sZSBmb3Igc3RhdGVtZW50LgorCisgICAgICAgIEV4YW1wbGVzIGZvciBsZWdhbCA8aW5pdD4gZXhwcmVzc2lvbnMgYXJlOgorCisgICAgICAgICAgIGZvciAoaSA9IDA7IC4uLgorICAgICAgICAgICBmb3IgKGkgPSAwLCBqID0gMDsgLi4uCisgICAgICAgICAgIGZvciAoaSA9IDAsIGludCBqID0gaTsgLi4uCisgICAgICAgICAgIGZvciAoaW50IGogPSA0OyAuLi4KKworICAgICAgICBJbGxlZ2FsIDxpbml0PiBleHByZXNzaW9ucyBhcmU6CisKKyAgICAgICAgICAgZm9yIChpbnQgaTsgLi4uICAgICAgOiBubyB2YWx1ZSBhc3NpZ25lZAorICAgICAgICAgICBmb3IgKGludCBpICs9IDQ7IC4uLiA6IG9ubHkgcGxhaW4gYXNzaWdubWVudHMgYWxsb3dlZAorCisgICAgICAgIEEgJ2JyZWFrJyBpbiB0aGUgJ3N0YXRlbWVudCcgd2lsbCB0ZXJtaW5hdGUgdGhlIGxvb3AuIEEKKyAgICAgICAgJ2NvbnRpbnVlJyB3aWxsIGNvbnRpbnVlIHRoZSBleGVjdXRpb24gZnJvbSB0aGUgYmVnaW5uaW5nIG9mCisgICAgICAgIHRoZSBsb29wLgorCitTRUUgQUxTTworICAgIGZvcmVhY2goTFBDKSwgaWYoTFBDKSwgZG8td2hpbGUoTFBDKSwgd2hpbGUoTFBDKSwgc3dpdGNoKExQQykKZGlmZiAtLWdpdCBhL2RvYy9MUEMvZm9yZWFjaCBiL2RvYy9MUEMvZm9yZWFjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTYwNjBiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL0xQQy9mb3JlYWNoCkBAIC0wLDAgKzEsMTMyIEBACitOQU1FCisgICAgICAgIGZvcmVhY2gKKworU1lOVEFYCisgICAgICAgIGZvcmVhY2ggKDx2YXI+IDogPGV4cHI+KSA8c3RhdGVtZW50PjsKKyAgICAgICAgZm9yZWFjaCAoPHZhcj4sIDx2YXIyPiwgLi4uICw8dmFyTj4gOiA8ZXhwcj4pIDxzdGF0ZW1lbnQ+OworCisgICAgICAgIGZvcmVhY2ggKDx2YXI+IDogPGV4cHIxPiAuLiA8ZXhwcjI+KSA8c3RhdGVtZW50PjsKKyAgICAgICAgZm9yZWFjaCAoPHZhcj4sIDx2YXIyPiwgLi4uICw8dmFyTj4gOiA8ZXhwcjE+Li48ZXhwcjI+ICkgPHN0YXRlbWVudD47CisKKyAgICAgICAgLyogTXVkT1MgY29tcGF0aWJpbGl0eSBvbmx5IC0gbm90IGZvciBuZXcgY29kZTogKi8KKyAgICAgICAgZm9yZWFjaCAoPHZhcj4gaW4gPGV4cHI+KSA8c3RhdGVtZW50PjsKKyAgICAgICAgZm9yZWFjaCAoPHZhcj4sIDx2YXIyPiwgLi4uICw8dmFyTj4gaW4gPGV4cHI+KSA8c3RhdGVtZW50PjsKKworREVTQ1JJUFRJT04KKyAgICAgICAgVGhlIGluc3RydWN0aW9uIGV2YWx1YXRlcyBpdHMgcmFuZ2Ugc3BlY2lmaWNhdGlvbiAtIGVpdGhlciBhCisgICAgICAgIHNpbXBsZSA8ZXhwcj4gd2hpY2ggY2FuIHlpZWxkIGFuIGFycmF5LCBhIHN0cnVjdCwgYSBzdHJpbmcsIGEKKyAgICAgICAgbWFwcGluZyBvciBhbiBpbnRlZ2VyLCBvciBhbiBpbnRlZ2VyIHJhbmdlIDxleHByMT4gdGhyb3VnaAorICAgICAgICA8ZXhwcjI+IC0gYW5kIGV4ZWN1dGVzIDxzdGF0ZW1lbnQ+IG9uY2UgZm9yIGVhY2ggdmFsdWUgaW4gdGhlCisgICAgICAgIHJhbmdlLiBUaGUgcmVzcGVjdGl2ZSB2YWx1ZSBpcyBhc3NpZ25lZCB0byA8dmFyPiByaWdodCBiZWZvcmUKKyAgICAgICAgPHN0YXRlbWVudD4gaXMgZXhlY3V0ZWQuCisKKyAgICAgICAgQSAnYnJlYWsnIGluIHRoZSA8c3RhdGVtZW50PiB3aWxsIHRlcm1pbmF0ZSB0aGUgbG9vcC4gQQorICAgICAgICAnY29udGludWUnIHdpbGwgY29udGludWUgdGhlIGV4ZWN1dGlvbiBmcm9tIHRoZSBiZWdpbm5pbmcgb2YKKyAgICAgICAgdGhlIGxvb3AuCisKKyAgICAgICAgRXZlcnkgPHZhcj4gc3BlY2lmaWNhdGlvbiBjYW4gZGVjbGFyZSBhIG5ldyBsb2NhbCB2YXJpYWJsZSwgd2hvc2UKKyAgICAgICAgc2NvcGUgaXMgdGhlIHdob2xlIGZvcmVhY2goKSBzdGF0ZW1lbnQuCisKKworICAgICAgICBUaGUgbm9ybWFsIGZvcm0gKG9uZSA8ZXhwcj4pOgorCisgICAgICAgICAgICA8ZXhwcj4gaXMgZXZhbHVhdGVkIGFuZCBoYXMgdG8geWllbGQgYW4gYXJyYXksIGEgc3RydWN0LCBhCisgICAgICAgICAgICBzdHJpbmcgb3IgYSBtYXBwaW5nIChvciByZWZlcmVuY2UgdG8gdGhlIGZvcm1lciksIG9yIGFuCisgICAgICAgICAgICBpbnRlZ2VyLgorCisgICAgICAgICAgICBJZiA8ZXhwcj4gaXMgYSBhcnJheSwgc3RydWN0LCBvciBzdHJpbmcsIHRoZSB2YWx1ZXMgb2YKKyAgICAgICAgICAgIDxleHByPiAoaW4gY2FzZSBvZiB0aGUgc3RyaW5nLCB0aGUgaW50ZWdlciB2YWx1ZXMgb2YgdGhlCisgICAgICAgICAgICBjaGFyYWN0ZXJzKSBhcmUgdGhlbiBhc3NpZ25lZCBvbmUgYnkgb25lIGluIG9yZGVyIG9mCisgICAgICAgICAgICBvY2N1cmVuY2UgdG8gPHZhcj4sIGFuZCA8c3RhdGVtZW50PiBpcyBleGVjdXRlZCBmb3IgZXZlcnkKKyAgICAgICAgICAgIGFzc2lnbm1lbnQuCisKKyAgICAgICAgICAgIElmIDxleHByPiBpcyBhIG1hcHBpbmcsIHRoZSBrZXlzIGFyZSBhc3NpZ25lZCBvbmUgYnkgb25lCisgICAgICAgICAgICB0byA8dmFyPiwgYW5kIHRoZSB2YWx1ZXMgZm9yIGVhY2gga2V5IGFyZSBhc3NpZ25lZCBpbgorICAgICAgICAgICAgb3JkZXIgdG8gPHZhcjI+Li48dmFyTj4uICBJZiB0aGVyZSBhcmUgbW9yZSB2YWx1ZXMgdGhhbgorICAgICAgICAgICAgdmFyaWFibGUsIHRoZSBleHRyYW5lb3VzIHZhbHVlcyBhcmUgaWdub3JlZC4gRHVlIHRvIHRoZQorICAgICAgICAgICAgbmF0dXJlIG9mIG1hcHBpbmdzLCBhIHNwZWNpZmljIG9yZGVyIG9mIHRoZSBrZXlzIGNhbiBub3QKKyAgICAgICAgICAgIGJlIGd1YXJhbnRlZWQuCisKKyAgICAgICAgICAgIElmIDxleHByPiBldmFsdWF0ZXMgdG8gYSByZWZlcmVuY2UgdG8gYW4gYXJyYXksIG1hcHBpbmcsIG9yCisgICAgICAgICAgICBzdHJpbmcsIHRoZSBsb29wIHdpbGwgYXNzaWduIHJlZmVyZW5jZXMgdG8gdGhlIHZhbHVlcyBpbnRvCisgICAgICAgICAgICB0aGUgdmFyaWFibGVzLiBUaGlzIGFsbG93cyB0aGUgbG9vcCBib2R5IHRvIGNoYW5nZSB0aGUgY29udGVudHMKKyAgICAgICAgICAgIG9mIHRoZSBvcmlnaW5hbCBkYXRhLgorCisgICAgICAgICAgICBJZiA8ZXhwcj4gZXZhbHV0ZXMgdG8gYW4gaW50ZWdlciwgdGhlIGxvb3Agd2lsbCBjb3VudCB1cCA8dmFyPgorICAgICAgICAgICAgZnJvbSAwIHRvIDxleHByPi0xLCBiYXNpY2FsbHkgaW1wbGVtZW50aW5nIGEgY291bnQgbG9vcC4KKworICAgICAgICAgICAgSWYgdGhlcmUgYXJlIG1vcmUgdmFyaWFibGVzIHRoYW4gbmVjZXNzYXJ5LCB0aGUgdW5uZWVkZWQgb25lcworICAgICAgICAgICAgYXJlIG5vdCBjaGFuZ2VkLgorCisKKyAgICAgICAgVGhlIHJhbmdlZCBmb3JtICg8ZXhwcjE+IC4uIDxleHByMj4pOgorCisgICAgICAgICAgICA8ZXhwcjE+IGFuZCA8ZXhwcjI+IGFyZSBldmFsdWF0ZWQgYW5kIG11c3QgeWllbGQgaW50ZWdlcnMuCisgICAgICAgICAgICBUaGUgbG9vcCB3aWxsIGNvdW50IHVwIDx2YXI+IGZyb20gPGV4cHIxPiB0byA8ZXhwcjI+LCBiYXNpY2FsbHkKKyAgICAgICAgICAgIGltcGxlbWVudGluZyBhIGNvdW50ZWQgbG9vcC4KKworICAgICAgICAgICAgSWYgPGV4cHIxPiBpcyBsZXNzIHRoYW4gPGV4cHIyPiwgdGhlIGxvb3Agd2lsbCB0ZXJtaW5hdGUgYXQgb25jZS4KKworICAgICAgICAgICAgSWYgdGhlcmUgYXJlIG1vcmUgdGhhbiB2YXJpYWJsZSwgdGhlIHVubmVlZGVkIG9uZXMgYXJlIG5vdAorICAgICAgICAgICAgY2hhbmdlZC4KKworCisKKyAgICAgICAgV0hBVCBIQVBQRU5TIElGIDxleHByPiBJUyBDSEFOR0VEIElOIFRIRSBMT09QPworCisgICAgICAgIElmIDxleHByPiB5aWVsZHMgYW4gYXJyYXkgb3Igc3RydWN0OgorICAgICAgICAgLSBhc3NpZ25tZW50cyB0byBzaW5nbGUgZWxlbWVudHMgb3IgdG8gYXJyYXkgcmFuZ2VzIGVmZmVjdAorICAgICAgICAgICB0aGUgdmFsdWVzIGFzc2lnbmVkIHRvIHRoZSB2YXJpYWJsZToKKyAgICAgICAgICAgICBhID0gKHsxLCAyLCAzfSkKKyAgICAgICAgICAgICBmb3JlYWNoKHggOiBhKSB7IGFbMS4uMl0gPSAoezQsIDV9KTsgd3JpdGUoeCsiICIpOyB9CisgICAgICAgICAgIHdpbGwgd3JpdGUgKCIxIDQgNSAiKS4KKyAgICAgICAgIC0gb3BlcmF0aW9ucyB3aGljaCBpbXBsaWNpdGVseSBjb3B5IHRoZSBhcnJheSBvciBzdHJ1Y3QgKHRoaXMKKyAgICAgICAgICAgaW5jbHVkZXMgcmFuZ2UgYXNzaWdubWVudHMgd2hpY2ggY2hhbmdlIHRoZSBzaXplKSBkb24ndAorICAgICAgICAgICBoYXZlIGFuIGVmZmVjdCBvbiB0aGUgbG9vcC4KKworICAgICAgICBJZiA8ZXhwcj4geWllbGRzIGEgbWFwcGluZywgdGhlIGxvb3Agd2lsbCBydW4gb3ZlciB0aGUgaW5kaWNlcworICAgICAgICB0aGUgbWFwcGluZyBoYWQgYXQgdGhlIGJlZ2luIG9mIHRoZSBsb29wLiBEZWxldGVkIGluZGljZXMgYXJlIHNpbGVudGx5CisgICAgICAgIHNraXBwZWQsIG5ldyBpbmRpY2VzIGlnbm9yZWQsIGJ1dCBjaGFuZ2VzIG9mIHRoZSBkYXRhIG9mIGV4aXN0aW5nCisgICAgICAgIGluZGljZXMgYXJlIGFja25vd2xlZGdlZC4KKworICAgICAgICBJZiA8ZXhwcj4geWllbGRzIGEgc3RyaW5nLCB0aGUgdmFsdWUgdXNlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIGxvb3AKKyAgICAgICAgcmVtYWlucy4KKworCitXQVJOSU5HCisgICAgICAgIFRoZSBhZGRpdGlvbmFsIHN5bnRheCBmb3JtcyB1c2luZyAiaW4iIGFzIGtleXdvcmQgYXJlIG1lYW50CisgICAgICAgIHRvIG1ha2UgcmUtZW5naW5lZXJpbmcgb2YgTXVkT1Mgb2JqZWN0cyBlYXNpZXIuIERvIG5vdCB1c2UgdGhlbQorICAgICAgICBmb3IgbmV3bHkgd3JpdHRlbiBjb2RlLCBhcyB0aGV5IG1heSBub3QgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZS4KKworCitFWEFNUExFUworICAgICAgICAvLyBDYWxsIHF1aXQoKSBpbiBhbGwgaW50ZXJhY3RpdmUgdXNlcnMKKyAgICAgICAgZm9yZWFjaChvIDogdXNlcnMoKSkgby0+cXVpdCgpOworICAgICAgICBmb3JlYWNoKG9iamVjdCBvIDogdXNlcnMoKSkgby0+cXVpdCgpOworCisgICAgICAgIC8vIFByaW50IHRoZSBjb250ZW50cyBvZiBhIG1hcHBpbmcgPG0+CisgICAgICAgIGZvcmVhY2goa2V5LCB2YWx1ZSA6IG0pIHByaW50ZigiJU86JU9cbiIsIGtleSwgdmFsdWUpOworICAgICAgICBmb3JlYWNoKG1peGVkIGtleSwgbWl4ZWQgdmFsdWUgOiBtKSBwcmludGYoIiVPOiVPXG4iLCBrZXksIHZhbHVlKTsKKworICAgICAgICAvLyBEb24ndCBjaGFuZ2UgdGhlIGNvbnRlbnQgb2YgYSBzdHJpbmc6IHMgcmVtYWlucyAiRk9PQkFSIi4KKyAgICAgICAgcyA9ICJGT09CQVIiOworICAgICAgICBmb3JlYWNoKGkgOiBzKSBpICs9IDMyOworCisgICAgICAgIC8vIERvIGNoYW5nZSB0aGUgY29udGVudCBvZiBhIHN0cmluZzogcyB3aWxsIGJlY29tZSAiZm9vYmFyIi4KKyAgICAgICAgcyA9ICJGT09CQVIiOworICAgICAgICBmb3JlYWNoKGkgOiAmcykgaSArPSAzMjsKKworICAgICAgICAvLyBDb3VudCBmcm9tIDAgdG8gNQorICAgICAgICBmb3JlYWNoKGkgOiA2KSBwcmludGYoIiVkXG4iLCBpKTsKKworICAgICAgICAvLyBDb3VudCBmcm9tIDEgdG8gNgorICAgICAgICBmb3JlYWNoKGkgOiAxIC4uIDYpIHByaW50ZigiJWRcbiIsIGkpOworCitISVNUT1JZCisgICAgICAgIExETXVkIDMuMy40NCBpbnRyb2R1Y2VkIHRoZSB1c2Ugb2YgcmVmZXJlbmNlcywgdGhlIGxvb3Agb3ZlcgorICAgICAgICAgIGFuIGludGVnZXIgZXhwcmVzc2lvbiwgYW5kIHRoZSBsb29wIG92ZXIgYW4gaW50ZWdlciByYW5nZS4KKyAgICAgICAgTERNdWQgMy4zLjI2NiBhZGRlZCBzdXBwb3J0IGZvciBzdHJ1Y3RzLgorCisKK1NFRSBBTFNPCisgICAgICAgIGZvcihMUEMpCmRpZmYgLS1naXQgYS9kb2MvTFBDL2Z1bmN0aW9ucyBiL2RvYy9MUEMvZnVuY3Rpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYzM5YTAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvTFBDL2Z1bmN0aW9ucwpAQCAtMCwwICsxLDE3NCBAQAorQ09OQ0VQVAorICAgICAgICBmdW5jdGlvbnMKKworREVTQ1JJUFRJT04KKyAgICAgICAgRnVuY3Rpb25zIGFyZSBuYW1lZCBibG9ja3Mgb2YgY29kZSB3aGljaCBhcmUgYmUgY2FsbGVkIHdpdGgKKyAgICAgICAgYSBudW1iZXIgb2YgYXJndW1lbnQgdmFsdWVzLCBhbmQgd2hpY2ggcmV0dXJuIGEgcmVzdWx0IHZhbHVlCisgICAgICAgIHRvIHRoZSBjYWxsZXIuCisKKyAgICAgICAgRnVuY3Rpb25zIGFyZSBkZWZpbmVkIGluIGFuIG9iamVjdCBhbmQgYXJlIGFsc28ga25vd24gYXMKKyAgICAgICAgImxvY2FsIGZ1bnMiIG9yIHNob3J0ICJsZnVucyIuCisKKworICAgICAgICBERUZJTklORyBBIEZVTkNUSU9OCisKKyAgICAgICAgQSBmdW5jdGlvbiBkZWZpbml0aW9uIHRha2VzIHRoZSBmb3JtCisKKyAgICAgICAgICA8bW9kaWZpZXJzPiA8dHlwZT4gbmFtZSAoIDxhcmd1bWVudHM+ICkgeworICAgICAgICAgICAgIHN0YXRlbWVudHMuLi4KKyAgICAgICAgICB9CisKKyAgICAgICAgVGhlIHBhcnRzIGluIGRldGFpbDoKKyAgICAgICAgICAtIDxtb2RpZmllcnM+IGNhbiBiZSBhbnkgb25lIG9mICJzdGF0aWMiLCAicHJpdmF0ZSIsICJwdWJsaWMiCisgICAgICAgICAgICAgIGFuZCAicHJvdGVjdGVkIiAoc2VlIG1vZGlmaWVycyhMUEMpKSwgb3B0aW9uYWxseSBjb21iaW5lZAorICAgICAgICAgICAgICB3aXRoICJ2YXJhcmdzIiAoc2VlIHZhcmFyZ3MoTFBDKSkgYW5kL29yICJub21hc2siLgorICAgICAgICAgICAgICBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgZnVuY3Rpb24gYmVoYXZlcyBhcyBpZiBpdCB3YXMKKyAgICAgICAgICAgICAgc3BlY2lmaWVkIGFzICJwdWJsaWMiLCBidXQgdGhpcyB2aXNpYmlsaXR5IGNhbiBiZSByZXN0cmljdGVkCisgICAgICAgICAgICAgIGluIGRlcml2ZWQgb2JqZWN0IHRocm91Z2ggbm9uLXB1YmxpYyBpbmhlcml0YW5jZS4KKyAgICAgICAgICAtIDx0eXBlPiBpcyB0aGUgdHlwZSBvZiB0aGUgcmVzdWx0IHJldHVybmVkIGJ5IHRoZSBmdW5jdGlvbi4KKyAgICAgICAgICAgICAgSWYgc3BlY2lmaWVkIGFzICJ2b2lkIiwgdGhlIGZ1bmN0aW9uIGlzIGNvbXBpbGVkIHRvIHJldHVybgorICAgICAgICAgICAgICB0aGUgdmFsdWUgMCB1bmRlciBhbGwgY2lyY3Vtc3RhbmNlcy4gSWYgbm90IHNwZWNpZmllZCwgdGhlCisgICAgICAgICAgICAgIHR5cGUgaXMgYXNzdW1lZCB0byBiZSAibWl4ZWQiLCBmdXJ0aGVybW9yZSB0eXBlY2hlY2tpbmcgaXMKKyAgICAgICAgICAgICAgZGlzYWJsZWQgZm9yIHRoaXMgZnVuY3Rpb24uCisgICAgICAgICAgLSBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiwgZS5nLiAic2hvcnQiLCBvciAiTmljZV9UcnkiLAorICAgICAgICAgICAgICB1bmRlciB3aGljaCBpdCBpcyBtYWRlIGtub3duLgorICAgICAgICAgIC0gPGFyZ3VtZW50cz4gaXMgYSBsaXN0IG9mIHZhcmlhYmxlIGRlZmluaXRpb25zIGluIHRoZQorICAgICAgICAgICAgICBub3JtYWwgJzx0eXBlPiA8bmFtZT4nIHN0eWxlLCBzZXBhcmF0ZWQgYnkgY29tbWEuCisgICAgICAgICAgICAgIEV4YW1wbGVzOiAoKSA6IG5vIGFyZ3VtZW50IHRha2VuCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50IGEpIDogdGFrZXMgb24gaW50ZWdlciBhcmd1bWVudAorICAgICAgICAgICAgICAgICAgICAgICAgKG1peGVkIGEsIG9iamVjdCAqYik6IHRha2VzIHR3byBhcmd1bWVudHMsIG9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJiaXRyYXJ5IHR5cGUsIG9uZSBhcnJheSBvZiBvYmplY3RzLgorICAgICAgICAgIC0geyBzdGF0ZW1lbnRzLi4uIH0gZGVmaW5lcyB0aGUgY29kZSBmb3IgdGhpcyBmdW5jdGlvbi4gVGhpcworICAgICAgICAgICAgICBpcyBhIG5vcm1hbCBibG9jayAoc2VlIGJsb2NrKExQQykpIGFuZCBhcyBzdWNoIGNhbiBkZWZpbmUKKyAgICAgICAgICAgICAgaXRzIG93biBsb2NhbCB2YXJpYWJsZXMuCisKKworICAgICAgICBERUNMQVJJTkcgQSBGVU5DVElPTgorCisgICAgICAgIEEgZnVuY3Rpb24gZGVjbGFyYXRpb24gbWFrZXMgdGhlIG5hbWUgYW5kIHR5cGUgb2YgYSBmdW5jdGlvbiBrbm93bgorICAgICAgICB0byB0aGUgY29tcGlsZXIgd2l0aCB0aGUgYXNzZXJ0aW9uIHRoYXQgdGhlIGNvZGUgZm9yIHRoaXMgZnVuY3Rpb24KKyAgICAgICAgd2lsbCBiZSBwcm92aWRlZCAiZWxzZXdoZXJlIi4KKworICAgICAgICBUaGUgZm9ybSBpczoKKworICAgICAgICAgIDxtb2RpZmllcnM+IDx0eXBlPiBuYW1lICggPGFyZ3VtZW50cz4gKTsKKworICAgICAgICBUeXBpY2FsIHVzZXMgYXJlOgorICAgICAgICAgIC0gdG8gZGVjbGFyZSBpbiBhZHZhbmNlIGZ1bmN0aW9ucyB3aGljaCBhcmUgY2FsbGVkIGJlZm9yZSB0aGV5CisgICAgICAgICAgICBjYW4gYmUgZGVmaW5lZDsgZm9yIGV4YW1wbGUgaWYgdGhlIGNyZWF0ZSgpIGZ1bmN0aW9uIG9mIGFuIG9iamVjdAorICAgICAgICAgICAgY2FsbHMgb3RoZXIgZnVuY3Rpb25zIHdoaWNoIGFyZSBkZWZpbmVkIGFmdGVyIHRoZSBjcmVhdGUoKS4KKyAgICAgICAgICAtIHRvIGRlY2xhcmUgZnVuY3Rpb25zIHdoaWNoIHdpbGwgYmUgcHJvdmlkZWQgYnkgYW4gaW5oZXJpdGluZworICAgICAgICAgICAgb2JqZWN0LgorCisgICAgICAgIENhbGxpbmcgYSBkZWNsYXJlZCBidXQgdW5kZWZpbmVkIGZ1bmN0aW9uIHJlc3VsdHMgaW4gYSBydW50aW1lIGVycm9yLgorCisKKyAgICAgICAgQ0FMTElORyBBIEZVTkNUSU9OCisKKyAgICAgICAgRnVuY3Rpb25zIGluIG90aGVyIG9iamVjdHMgYXJlIGNhbGxlZCB3aXRoIHRoZSBjYWxsX290aGVyKCkgZWZ1biwKKyAgICAgICAgd2hpY2ggY2FuIGJlIHNob3J0ZW5lZCB0byAnLT4nOgorCisgICAgICAgICAgIG9iLT5mdW4oYSwgYiwgYykKKyAgICAgICAgICAgY2FsbF9vdGhlcihvYiwgImZ1biIsIGEsIGIsIGMpCisKKyAgICAgICAgTm90ZTogU2VlIHRoZSBlbnRyeSBIX0RFRkFVTFRfTUVUSE9EIGluIGhvb2tzKEMpIGZvciBhIG1vZGlmaWNhdGlvbgorICAgICAgICBvZiB0aGlzIGJlaGF2aW91ci4KKworICAgICAgICBGdW5jdGlvbnMgaW4gdGhlIHNhbWUgb2JqZWN0IGFyZSBjYWxsZWQganVzdCBieSB3cml0aW5nIHRoZWlyIG5hbWUsCisgICAgICAgIGZvbGxvd2VkIGJ5IHRoZSBhcmd1bWVudHMgaW4gcGFyZW50aGVzaXM6CisKKyAgICAgICAgICAgc2hvcnQoKQorICAgICAgICAgICBjb21wdXRlKGEpCisgICAgICAgICAgIGRvX3RoYXQoYSwgImZvbyIpCisKKyAgICAgICAgQXJyYXkgZnVuY3Rpb24gYXJndW1lbnRzIGNhbiBiZSAnZmxhdHRlbmVkJyB3aXRoIHRoZSAnLi4uJyBvcGVyYXRvci4KKyAgICAgICAgRm9yIGV4YW1wbGU6CisKKyAgICAgICAgICAgbWl4ZWQgKiBtID0gKHsgImZvbyIsICJiYXIiIH0pOworICAgICAgICAgICBmdW4obS4uLiwgMSk7CisKKyAgICAgICAgd2lsbCBiZSBleGVjdXRlZCBhczoKKworICAgICAgICAgICBmdW4oImZvbyIsICJiYXIiLCAxKTsKKworCisgICAgICAgIElmIHRoZSBudW1iZXIgb2YgdmFsdWVzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24gZG9lcyBub3QgbWF0Y2ggdGhlCisgICAgICAgIG51bWJlciBvZiBleHBlY3RlZCBhcmd1bWVudHMgKGFuZCBpZiB0eXBlIGNoZWNraW5nIGlzIG5vdCBlbmFibGVkKSwgdGhlCisgICAgICAgIGRyaXZlciB3aWxsIHBlcmZvcm0gdGhlIG5lY2Vzc2FyeSBhZGFwdGlvbiBhdCBjYWxsIHRpbWU6IGV4Y2VzcworICAgICAgICB2YWx1ZXMgYXJlIGlnbm9yZWQsIG1pc3NpbmcgdmFsdWVzIGFyZSBzdWJzdGl0dXRlZCBieSB0aGUgbnVtYmVyIDAuCisgICAgICAgIFRoZSB2YWx1ZXMgcGFzc2VkIHRvIHRoZSBjYWxsZWQgZnVuY3Rpb24gYXJlIG1hc3NhZ2VkIGJ5IHRoZSBkcml2ZXIKKyAgICAgICAgdG8gbWF0Y2ggdGhlIGFyZ3VtZW50IGxpc3QKKworCisgICAgICAgIEZVTkNUSU9OUyBBTkQgSU5IRVJJVEFOQ0UKKworICAgICAgICBBICJwdWJsaWMiIG9yICJwcm90ZWN0ZWQiICg9PSAic3RhdGljIikgZnVuY3Rpb24gZGVmaW5lZCBpbiBvbmUKKyAgICAgICAgb2JqZWN0IGlzIGFsc28gdmlzaWJsZSBpbiBhbGwgaW5oZXJpdGluZyBvYmplY3RzLiBUaGUgZXhjZXB0aW9uIGZyb20KKyAgICAgICAgdGhpcyBydWxlIGlzIHdoZW4gYW4gaW5oZXJpdGluZyBjaGlsZCByZWRlZmluZXMgKCJvdmVybG9hZHMiKSB0aGUKKyAgICAgICAgaW5oZXJpdGVkIGZ1bmN0aW9uIHdpdGggaXRzIG93bi4gV2hlbiBjb21waWxpbmcgd2l0aCB0eXBlIGNoZWNraW5nLAorICAgICAgICB0aGUgYXJndW1lbnQgbGlzdCBvZiB0aGUgcmVkZWZpbmVkIGZ1bmN0aW9uIGhhcyB0byBtYXRjaCB0aGUKKyAgICAgICAgb3JpZ2luYWwgb25lLgorCisgICAgICAgIFdoZW4gYSBmdW5jdGlvbiBpcyBjYWxsZWQsIHRoZSBkcml2ZXIgbG9va3MgZm9yIHRoZSBmdW5jdGlvbiBmaXJzdAorICAgICAgICBpbiB0aGUgb2JqZWN0IGNhbGxlZCwgYW5kIGlmIG5vdCBmb3VuZCB0aGVyZSwgdGhlbiBpbiB0aGUgaW5oZXJpdGVkCisgICAgICAgIG9iamVjdHMuCisKKyAgICAgICAgVG8gZXhwbGljaXRlbHkgY2FsbCBhbiBpbmhlcml0ZWQgZnVuY3Rpb24gKHVzZWZ1bCB3aGVuIGEgcmVkZWZpbmluZworICAgICAgICBmdW5jdGlvbnMgd2FudHMgdG8gdXNlIHRoZSBvcmlnaW5hbCBvbmUpLCB0aGUgIjo6IiBvcGVyYXRvciBpcyB1c2VkOgorCisgICAgICAgICAgICA6OmNyZWF0ZSgpCisgICAgICAgICAgICA6OmNvbXB1dGUoYSkKKworICAgICAgICBUaGUgbmFtZWQgZnVuY3Rpb24gaXMgc2VhcmNoZWQgb25seSBpbiB0aGUgaW5oZXJpdGVkIG9iamVjdHMsIGFuZAorICAgICAgICB0aGUgZmlyc3QgZm91bmQgaXMgdXNlZC4KKworCisgICAgICAgIElmIHRoZSBmdW5jdGlvbiBpcyBpbmhlcml0ZWQgZnJvbSBzZXZlcmFsIG9iamVjdHMgYW5kIGEgc3BlY2lmaWMKKyAgICAgICAgb25lIGlzIHRvIGJlIGNhbGxlZCwgdGhlICI6OiIgY2FuIGJlIGV4dGVuZGVkIHRvIGNvbnRhaW4gdGhlCisgICAgICAgIHBhcnRpYWwgb3IgZnVsbCBuYW1lIG9mIHRoZSBpbmhlcml0ZWQgb2JqZWN0OgorCisgICAgICAgICAgICBpbmhlcml0ICIvb2JqL2Nvb2tlciI7CisgICAgICAgICAgICBpbmhlcml0ICIvb2JqL2NvbnRhaW5lciI7CisKKyAgICAgICAgICAgIHRhaW5lcjo6Y3JlYXRlKCkKKyAgICAgICAgICAgIGNvbnRhaW5lcjo6Y3JlYXRlKCkKKyAgICAgICAgICAgICJ0YWluZXIiOjpjcmVhdGUoKQorICAgICAgICAgICAgImNvbnRhaW5lciI6OmNyZWF0ZSgpCisgICAgICAgICAgICAib2JqL2NvbnRhaW5lciI6OmNyZWF0ZSgpCisgICAgICAgICAgICAiL29iai9jb250YWluZXIiOjpjcmVhdGUoKQorCisgICAgICAgIGFsbCBjYWxsIHRoZSBjcmVhdGUoKSBpbiB0aGUgY29udGFpbmVyIGluaGVyaXQuIE5vdGUgdGhhdCB0aGUKKyAgICAgICAgbmFtZSBnaXZlbiB0byB0aGUgOjogb3BlcmF0b3IgaXMgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBlbmRzIG9mCisgICAgICAgIHRoZSBpbmhlcml0ZWQgbmFtZXMuCisKKworICAgICAgICBPbmUgc3BlY2lhbCBmb3JtIG9mIHRoaXMgY2FsbCBpcworCisgICAgICAgICAgICBlZnVuOjpmaW5kX29iamVjdCgpCisKKyAgICAgICAgd2hpY2ggYnlwYXNzZXMgYW55IHJlZGVmaW5pdGlvbiBvZiBhbiBlZnVuIChoZXJlIGZpbmRfb2JqZWN0KCkpCisgICAgICAgIGFuZCBkaXJlY3RseSBjYWxscyB0aGUgZWZ1biBpdHNlbGYuIFRoaXMgaXMgb25seSBwb3NzaWJsZSBmb3IKKyAgICAgICAgZWZ1bi1yZWRlZmluaXRpb25zIHdoaWNoIGRvIG5vdCB1c2UgdGhlICJub21hc2siIG1vZGlmaWVyLgorCisKKyAgICAgICAgQWRkaXRpb25hbGx5LCBhIGNhbGwgdG8gYSBmdW5jdGlvbiBpbmhlcml0ZWQgZnJvbSBzZXZlcmFsIG9iamVjdHMKKyAgICAgICAgY2FuIGJlIGluc3RydWN0ZWQgdG8gY2FsbCBfYWxsXyBpbmhlcml0ZWQgZnVuY3Rpb25zIHRocm91Z2ggdGhlCisgICAgICAgIHVzZSBvZiB0aGUgd2lsZGNhcmRzICIqIiAobWF0Y2ggYW55IG51bWJlciBvZiBhcmJpdHJhcnkgY2hhcmFjdGVycykKKyAgICAgICAgYW5kICI/IiAobWF0Y2ggb25lIGFyYml0cmFyeSBjaGFyYWN0ZXIpOgorCisgICAgICAgICAgICBpbmhlcml0ICIvb2JqL2Nvb2tlciI7CisgICAgICAgICAgICBpbmhlcml0ICIvb2JqL2NvbnRhaW5lciI7CisKKyAgICAgICAgICAgICIqIjo6Y3JlYXRlKCkKKyAgICAgICAgICAgICJjbyoiOjpjcmVhdGUoKQorICAgICAgICAgICAgIiplciI6OmNyZWF0ZSgpCisKKyAgICAgICAgYWxsIGNhbGwgYm90aCBpbmhlcml0ZWQgY3JlYXRlKClzLiBUaGUgZnVuY3Rpb24gY2FsbGVkIHRoaXMgd2F5CisgICAgICAgIG11c3Qgbm90IHRha2UgYXJndW1lbnRzLCBhbmQgdGhlIHNpbmdsZSByZXN1bHRzIGZyb20gYWxsIGNhbGxzIGFyZQorICAgICAgICBjb21iaW5lZCBpbnRvIG9uZSBhcnJheSB1c2VkIGFzIGZpbmFsIHJlc3VsdC4gSWYgdGhlcmUgaXMgbm8gc3VjaAorICAgICAgICBmdW5jdGlvbiBpbmhlcml0ZWQgYXQgYWxsLCB0aGUgc3RhdGVtZW50IHdpbGwganVzdCByZXR1cm4KKyAgICAgICAgYW4gZW1wdHkgYXJyYXkuCisKK1NFRSBBTFNPCisgICAgICAgIHR5cGVzKExQQyksIG1vZGlmaWVycyhMUEMpLCB2YXJhcmdzKExQQyksIHJlZmVyZW5jZXMoTFBDKSwKKyAgICAgICAgY2FsbF9vdGhlcihFKSwgc2ltdWxfZWZ1bihDKSwgY2FsbF9vdXQoRSkKZGlmZiAtLWdpdCBhL2RvYy9MUEMvaWYgYi9kb2MvTFBDL2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYmJmZjIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvTFBDL2lmCkBAIC0wLDAgKzEsMzkgQEAKK05BTUUKKyAgICAgICAgaWYKKworU1lOVEFYCisgICAgICAgIGlmIChleHByMSkgc3RhdGVtZW50MTsKKyAgICAgICAgZWxzZSBpZiAoZXhwcjIpIHN0YXRlbWVudDI7CisgICAgICAgIC4uLgorICAgICAgICBlbHNlIGlmIChleHByTikgc3RhdGVtZW50TjsKKyAgICAgICAgZWxzZSBzdGF0ZW1lbnRYOworCitERVNDUklQVElPTgorICAgICAgICBUaGUgaWYoKSBzdGF0ZW1lbnQgaW1wbGVtZW50cyB0aGUgY29uZGl0aW9uYWwgZXhlY3V0aW9uIG9mIHN0YXRlbWVudHMuCisgICAgICAgIFRoZSBleHByZXNzaW9ucyAnZXhwcjEnIC4uICdleHByTicgYXJlIGV2YWx1YXRlIGluIHRoZSBvcmRlciB0aGV5CisgICAgICAgIGFwcGVhciB1bnRpbCBvbmUgb2YgdGhlIGV4cHJlc3Npb25zIHJldHVybnMgbm9uLTAgKCd0cnVlJykuIEF0IHRoYXQKKyAgICAgICAgcG9pbnQsIHRoZSBzdGF0ZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBleHByZXNzaW9uIGlzIGV4ZWN1dGVkLCBhbmQKKyAgICAgICAgdGhlIHByb2dyYW0gY29udGludWVzIGFmdGVyIHRoZSBpZigpIHN0YXRlbWVudC4gSWYgbm9uZSBvZiB0aGUKKyAgICAgICAgZXhwcmVzc2lvbnMgZXZhbHVhdGUgdG8gJ3RydWUnLCB0aGUgc3RhdGVtZW50WCBpbiB0aGUgJ2Vsc2UnLWJyYW5jaAorICAgICAgICBpcyBleGVjdXRlZC4KKworICAgICAgICBCb3RoIHRoZSAnZWxzZSBpZicgYnJhbmNoZXMgYW5kIHRoZSAnZWxzZScgYnJhbmNoIGFyZSBvcHRpb25hbCwgYW5kCisgICAgICAgIHRoZXJlIGNhbiBiZSBhbnkgbnVtYmVyIG9mICdlbHNlIGlmJyBicmFuY2hlcyAtIGJ1dCB0aGVyZSBtdXN0IGJlIG9uZQorICAgICAgICAnaWYnIGJyYW5jaCwgYW5kIHRoZSBicmFuY2hlcyBtdXN0IGJlIGluIHRoZSBvcmRlciBnaXZlbiBhYm92ZS4KKworICAgICAgICBBbnkgJ2Vsc2UnIG9yICdlbHNlIGlmJyBhbHdheXMgcmVsYXRlcyB0byB0aGUgaW1tZWRpYXRlbHkgcHJlY2VlZGluZworICAgICAgICAnaWYnIHJlc3AuICdlbHNlIGlmJyBjb25kaXRpb25hbC4gVGhpcyBtZWFucyB0aGF0CisKKyAgICAgICAgICBpZiAoYSkKKyAgICAgICAgICBpZiAoYikgZG9fYjsKKyAgICAgICAgICBlbHNlIGRvX2M7CisKKyAgICAgICAgaXMgaW50ZXJwcmV0ZWQgYXMKKworICAgICAgICAgIGlmIChhKSB7CisgICAgICAgICAgICBpZiAoYikgZG9fYjsKKyAgICAgICAgICAgIGVsc2UgICBkb19jOworICAgICAgICAgIH0KKworU0VFIEFMU08KKyAgICAgICAgZm9yKExQQyksIGZvcmVhY2goTFBDKSwgZG8td2hpbGUoTFBDKSwgd2hpbGUoTFBDKSwgc3dpdGNoKExQQykKZGlmZiAtLWdpdCBhL2RvYy9MUEMvaW5oZXJpdCBiL2RvYy9MUEMvaW5oZXJpdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTRjMGYyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL0xQQy9pbmhlcml0CkBAIC0wLDAgKzEsOSBAQAorTkFNRQorICAgICAgICBpbmhlcml0CisKK0RFU0NSSVBUSU9OCisgICAgICAgIFRoZSBjb25jZXB0IG9mIGluaGVyaXRhbmNlIGFuZCB0aGUgaW5oZXJpdCBzdGF0ZW1lbnQgYXJlCisgICAgICAgIGV4cGxhaW5lZCBpbiBkZXRhaWwgaW4gdGhlIG1hbiBwYWdlIGZvciBgYGluaGVyaXRhbmNlJycuCisKK1NFRSBBTFNPCisgICAgICAgIGluaGVyaXRhbmNlKEMpCmRpZmYgLS1naXQgYS9kb2MvTFBDL2luaGVyaXRhbmNlIGIvZG9jL0xQQy9pbmhlcml0YW5jZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2ZiODA0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL0xQQy9pbmhlcml0YW5jZQpAQCAtMCwwICsxLDE4MSBAQAorS09OWkVQVAorICAgICBpbmhlcml0YW5jZQorCitCRVNDSFJFSUJVTkcKKyAgICAgTWl0dGVscyBWZXJlcmJ1bmcga2FubiBtYW4gZGFzIFZlcmhhbHRlbiB1bmQvb2RlciBkaWUgaW1wbGVtZW50aWVydGVuCisgICAgIE1ldGhvZGVuIGVpbmVzIE9iamVrdGVzIGluIGVpbiBuZXVlcyBPYmpla3QgaGluZWluZXJiZW4uCisKKyAgICAgMS4gV296dSBpc3QgVmVyZXJidW5nIGd1dAorICAgICAxLjEuIEVyYmVuIHZvbiBJbXBsZW1lbnRhdGlvbmVuOiBTdHJ1a3R1cmllcmVuIHZvbiBCaWJsaW90aGVrZW4KKyAgICAgTWl0IFZlcmVyYnVuZyBkZXIgSW1wbGVtZW50YXRpb24ga29lbm5lbiBhdWZlaW5hbmRlciBhdWZiYXVlbmRlIHVuZCBndXQKKyAgICAgd2FydC0vbnV0emJhcmUgU3RydWt0dXJlbiBnZXNjaGFmZmVuIHdlcmRlbjoKKyAgICAgCisgICAgIC9zdGQvdGhpbmcvZGVzY3JpcHRpb24gYmVpbmhhbHRldAorICAgICAtIHdpZSBlaW4gT2JqZWt0IGF1c3NpZWh0L3dlbGNoZSBEZXRhaWxzIGVzIGdpYnQKKyAgICAgLSB3aWUgbWFuIGRhcyBPYmpla3QgZmluZGVuL2lkZW50aWZpemllcmVuIGthbm4KKyAgICAgL3N0ZC90aGluZy9tb3ZpbmcgYmVpbmhhbHRldAorICAgICAtIHdpZSBtYW4gZWluIE9iamVrdCBiZXdlZ2VuIGthbm4KKyAgICAgL3N0ZC90aGluZyBlcmJ0CisgICAgIC0gL3N0ZC90aGluZy9kZXNjcmlwdGlvbiB1bmQKKyAgICAgLSAvc3RkL3RoaW5nL21vdmluZworICAgICAtIGRhbWl0IGRlbiBDb2RlIGF1cyBiZWlkZW4gT2JqZWt0ZW4gKHVuZCBub2NoIGFuZGVyZSkKKworICAgICBTb3dvaGwgdGhpbmcvZGVzY3JpcHRpb24gYWxzIGF1Y2ggdGhpbmcvbW92aW5nIHNpbmQgbmljaHQgYWxzCisgICAgIGVpZ2Vuc3RhZW5kaWdlIE9iamVrdGUgc2lubnZvbGwgbnV0emJhciwgc2luZCBhYnN0cmFrdC4KKworICAgICAxLjIuIEVyYmVuIHZvbiBTY2huaXR0c3RlbGxlbiB1bmQgVmVyaGFsdGVuICAgICAgCisgICAgIER1cmNoIGRhcyBFcmJlbiB2b24gL3N0ZC90aGluZyB3ZXJkZW4gU2Nobml0dHN0ZWxsZSB1bmQgYXVjaAorICAgICBWZXJoYWx0ZW4gdm9uIC9zdGQvdGhpbmcgZ2VlcmJ0OgorICAgICAKKyAgICAgLS0ga2Vrcy5jIC0tCisgICAgIGluaGVyaXQgIi9zdGQvdGhpbmciOworICAgICAtLQorICAgICAKKyAgICAgRGFkdXJjaCBrb2VubmVuIGpldHp0IGFuZGVyZSBPYmpla3RlLCB3aWUgTlBDcyBvZGVyIFNwaWVsZXIgbWl0IGRlbQorICAgICBLZWtzLU9iamVrdCBzbyBpbnRlcmFnaWVyZW4sIGFscyB3ZW5uIGVzIGVpbiAvc3RkL3RoaW5nIHdhZXJlLgorCisgICAgIE1vcmdlbmdyYXVlbiBzdGVsbHQgZWluZSBncm9zc2UgQmlibGlvdGhlayB2b24gbWl0ZWluYW5kZXIgc2lubnZvbGwKKyAgICAgYWdpZXJlbmRlbiBPYmpla3RlbiB1bnRlciAvc3RkIHp1ciBWZXJmdWVndW5nLCBEaWUgZG9ydCB2ZXJmdWVnYmFyZW4KKyAgICAgT2JqZWt0ZSBzaW5kIGdyb2Vzc3RlbnRlaWxzIHNlbGJzdGVya2xhZXJlbmQsIHdpZSAvc3RkL25wYywKKyAgICAgL3N0ZC9hcm1vdXIgb2RlciAvc3RkL3dlYXBvbi4KKworICAgICBEYXMgS2Vrcy1PYmpla3QgbXVzcyBlcndlaXRlcnQgd2VyZGVuLCB3ZW5uIGVzIHNpY2ggdm9tIG5vcm1hbGVuCisgICAgIERpbmcgdW50ZXJzY2hlaWRlbiBzb2xsLiBUeXBpc2NoZXJ3ZWlzZSBnZXNjaGllaHQgZGFzIGR1cmNoCisgICAgIFVlYmVyc2NocmVpYmVuIGRlciBJbml0aWFsaXNpZXJ1bmdtZXRob2RlIG5hbWVucyAiY3JlYXRlIi4gCisgICAgICAgCisgICAgIDIuIFVlYmVyc2NocmVpYmVuL0Vyd2VpdGVybiB2b24gVmVyaGFsdGVuL01ldGhvZGVuCisgICAgIDIuMS4gVWViZXJzY2hyZWliZW4KKyAgICAgVW0gZGFzIFZlcmhhbHRlbiB2b24gZ2VlcmJ0ZW4gTWV0aG9kZW4genUgZXJ3ZWl0ZXJuLCBtdXNzIGRpZXNlCisgICAgIHVlYmVyc2NocmllYmVuIHdlcmRlbjoKKyAgICAgCisgICAgIC0tIGtla3MuYyAtLQorICAgICAuLi4KKyAgICAgdm9pZCBjcmVhdGUoKSB7CisgICAgICAgU2V0UHJvcChQX05BTUUsICJLZWtzIik7CisgICAgICAgU2V0UHJvcChQX0dFTkRFUiwgTUFMRSk7CisgICAgICAgQWRkSWQoKHsia2VrcyJ9KSk7CisgICAgIH0KKyAgICAgLS0KKyAgICAgCisgICAgIEFsbGVyZGluZ3Mgd3VlcmRlIGpldHp0IGRlciBub3JtYWxlIENvZGUgdm9uICJjcmVhdGUiIGluIC9zdGQvdGhpbmcKKyAgICAgbmljaHQgbWVociBhdXNnZWZ1ZWhydCB3ZXJkZW4uIE1pdCBkZW0gJ3Njb3BlJy1PcGVyYXRvciA6OiB3aXJkCisgICAgIGlubmVyaGFsYiBlaW5lciB1ZWJlcnNjaHJpZWJlbmVuIE1ldGhvZGUgYXVmIGRlcmVuIGJpc2hlcmlnZQorICAgICBJbXBsZW1lbnRhdGlvbiB6dWdlZ3JpZmZlbjoKKworICAgICAtLSBrZWtzLmMgLS0KKyAgICAgLi4uCisgICAgIHZvaWQgY3JlYXRlKCkgeworICAgICAgIDo6Y3JlYXRlKCk7CisgICAgICAgU2V0UHJvcChQX05BTUUsICJLZWtzIik7CisgICAgICAgU2V0UHJvcChQX0dFTkRFUiwgTUFMRSk7CisgICAgICAgQWRkSWQoKHsia2VrcyJ9KSk7CisgICAgIH0KKyAgICAgLS0KKworICAgICBBdWYgZ2VlcmJ0ZSBnbG9iYWxlIFZhcmlhYmxlbiBrYW5uIG5vcm1hbCB6dWdlZ3JpZmZlbiB3ZXJkZW4sIHdlbm4gCisgICAgIGRpZXNlIG5pY2h0IHZvciBkaXJla3RlbSBadWdyaWZmIGR1cmNoIGVyYmVuZGUgT2JqZWt0ZSBnZXNjaHVldHp0CisgICAgIHd1cmRlbi4gQWxzbyBpbiBpaHJlciBTaWNodGJhcmtlaXQgdmVyYWVuZGVydCB3dXJkZS4KKyAgICAgCisgICAgIFVlYmVyc2NocmVpYmVuIHZvbiBNZXRob2RlbiBpbiBkZW4gZGF2b24gZXJiZW5kZW4gT2JqZWt0ZW4ga2FubiBkdXJjaAorICAgICBkYXMgU2NobHVlc3NlbHdvcnQgJ25vbWFzaycgdmVyYm90ZW4gd2VyZGVuLgorCisgICAgIDIuMi4gU2ljaHRiYXJrZWl0IHZvbiBNZXRob2RlbiB1bmQgVmFyaWFibGVuCisgICAgIEVzIGlzdCBtb2VnbGljaCwgTWV0aG9kZW4gdW5kIFZhcmlhYmxlbiBtaXQgZWluZW0gTW9kaWZpa2F0b3IgZnVlcgorICAgICBpaHJlIFNpY2h0YmFya2VpdCB6dSB2ZXJzZWhlbiwgZGVyIGF1Y2ggYmVpIGRlciBWZXJlcmJ1bmcgenVtCisgICAgIFRyYWdlbiBrb21tdDoKKyAgICAgLSAncHVibGljJyBNZXRob2RlbiBzaW5kIHZvbiBhdXNzZW4vaW5uZW4gaW4gRWx0ZXJuL0tpbmQgenVncmVpZmJhcgorICAgICAtICdwcm90ZWN0ZWQnIE1ldGhvZGVuIHNpbmQgbnVyIHZvbiBpbm5lbiBpbiBFbHRlcm4vS2luZCB6dWdyZWlmYmFyCisgICAgIC0gJ3ByaXZhdGUnIE1ldGhvZGVuIHNpbmQgbnVyIHZvbiBpbm5lbiBpbiBFbHRlcm4genVncmVpZmJhcgorICAgICAgICAgICAgICAgICAoYWxzbyBudXIgaW0gZGVmaW5pZXJlbmRlbiBPYmpla3Qgc2VsYnN0KSAgIAorCisgICAgIDIuMyBMYXVmemVpdC1Qb2x5bW9ycGhpZSAodmllbGdlc3RhbHRlcyBWZXJoYWx0ZW4pCisgICAgIE1ldGhvZGVuIHdlcmRlbiBpbiBMUEMgaW1tZXIgZXJzdCB6dW0gWmVpdHB1bmt0IGlocmVzIEF1ZnJ1ZnMKKyAgICAgZ2VidW5kZW4sIGFsc28gbmljaHQgc2Nob24gYmVpbSBMYWRlbi4gQmVpc3BpZWxzd2Vpc2Uga29lbm5lbgorICAgICB3aXIgdW5zZXJlbiBLZWtzIGVzc2JhciBtYWNoZW46CisKKyAgICAgLS0ga2Vrcy5jIC0tCisgICAgIC4uLgorICAgICB2b2lkIGNyZWF0ZSgpIHsKKyAgICAgICAuLi4KKyAgICAgICBBZGRDbWQoImlzcyZASUQiLCAiYWN0aW9uX2Vzc2VuIiwgIldhcyB3aWxsc3QgZHUgZXNzZW4/Iik7CisgICAgIH0KKyAgICAgCisgICAgIGludCBhY3Rpb25fZXNzZW4oKSB7CisgICAgICAgaWYodGhpc19wbGF5ZXIoKS0+ZWF0X2Zvb2QoMSwgMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRHUgYmVrb21tc3QgIitRdWVyeVByb25vdW4oV0VOKSsKKwkJCQkgIiBuaWNodCBtZWhyIGhpbmVpbmdlc3RvcGZ0LlxuIik+MCkgeworICAgICAgICAgd3JpdGUoIkR1IGlzc3QgIituYW1lKFdFTiwxKSsiLlxuIik7CisgICAgICAgICBzYXkodGhpc19wbGF5ZXIoKS0+TmFtZShXRVIpKyIgaXNzdCAiK25hbWUoV0VOKSsiLlxuIik7CisgICAgICAgICByZW1vdmUoKTsKKyAgICAgICB9CisgICAgICAgcmV0dXJuIDE7CisgICAgIH0KKyAgICAgLS0KKyAgICAgCisgICAgIHVuZCBqZXR6dCBpbiBlaW5lbSBkYXZvbiBlcmJlbmRlbiBLcnVlbWVsa2VrcyBkaWVzZW4gYmVpbSBFbnRmZXJuZW4KKyAgICAgaW0gInJlbW92ZSIga3J1ZW1lbG4gbGFzc2VuOgorICAgICAKKyAgICAgLS0ga3J1ZW1lbGtla3MuYyAtLQorICAgICBpbmhlcml0ICIvZG9jL2JlaXNwaWVsZS9pbmhlcml0L2tla3MuYyI7CisgICAgIC4uLgorICAgICB2YXJhcmdzIGludCByZW1vdmUoaW50IHNpbGVudCkgeworICAgICAgIGlmKCFzaWxlbnQgJiYgbGl2aW5nKGVudmlyb25tZW50KCkpKQorICAgICAgICAgdGVsbF9vYmplY3QoZW52aXJvbm1lbnQoKSwgTmFtZShXRVIsMSkrCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICIga3J1ZW1lbHQgZWluIGxldHp0ZXMgTWFsLlxuIik7CisgICAgICAgcmV0dXJuIDo6cmVtb3ZlKHNpbGVudCk7CisgICAgIH0KKyAgICAgLS0KKyAgICAgCisgICAgIFRyb3R6ZGVtIHdpciAiYWN0aW9uX2Vzc2VuIiBuaWNodCBtb2RpZml6aWVydCBoYWJlbiwgd2lyZCB2b24gZGllc2VyCisgICAgIE1ldGhvZGUgaW4gZWluZW0gS3J1ZW1lbGtla3MgaW1tZXIgYXV0b21hdGlzY2ggZGllIGFrdHVlbGxlIHVuZAorICAgICBrcnVlbWVsZW5kZSAicmVtb3ZlIiBhdWZnZXJ1ZmVuLgorCisgICAgIDMuIE11bHRpcGxlIEluaGVyaXRhbmNlCisgICAgIEluIExQQyBpc3QgbXVsdGlwbGUgVmVyZXJidW5nIG1vZWdsaWNoLiBEYXMgaGVpc3N0LCBtYW4ga2FubiB2b24gCisgICAgIG1laHJlcmVuIE9iamVrdGVuIGVyYmVuLiBEYXMga2FubiB6dSBLb25mbGlrdGVuIGZ1ZWhyZW4sIHp1bSBCZWlzcGllbCAKKyAgICAgd2VubiBlaW5lIE1ldGhvZGUgaW4gendlaSBPYmpla3RlbiB2b24gZGVuZW4gZ2VlcmJ0IHd1cmRlIHZvcmtvbW10LiAKKyAgICAgCisgICAgIERpZXNlIEtvbmZsaWt0ZSBzb2xsdGUgbWFuIGRhbm4gInBlciBIYW5kIiBsb2VzZW4gaW4gZGVtIG1hbiBkaWVzZSAKKyAgICAgc3BlemllbGxlIE1ldGhvZGUgdWViZXJzY2hyZWlidCB1bmQgbWl0dGVscyBkZXMgc2NvcGUtT3BlcmF0b3JzIGRpZSAKKyAgICAgZ2V3dWVuc2NodGUobikgZ2VlcmJ0KGVuKSBNZXRob2RlKG4pIGF1ZnJ1ZnQ6CisKKyAgICAgaW5oZXJpdCAiL3N0ZC93ZWFwb24iOworICAgICBpbmhlcml0ICIvc3RkL2xpZ2h0c291cmNlIjsKKworICAgICB2b2lkIGNyZWF0ZSgpIHsKKyAgICAgICB3ZWFwb246OmNyZWF0ZSgpOworICAgICAgIGxpZ2h0c291cmNlOjpjcmVhdGUoKTsKKyAgICAgICAuLi4KKyAgICAgfQorCisgICAgIHZvaWQgaW5pdCgpIHsKKyAgICAgICB3ZWFwb246OmluaXQoKTsKKyAgICAgICBsaWdodHNvdXJjZTo6aW5pdCgpOworICAgICAgIC8vIG9kZXIgc2VociBnZW5lcmVsbCB1bmQgdW5rb250cm9sbGllcnQ6CisgICAgICAgLy8gIioiOjppbml0KCk7CisgICAgIH0KKworICAgICBTY2h3ZXJ3aWVnZW5kZSBLb25mbGlrdGUga29lbm5lbiBhdWZ0cmV0ZW4sIHdlbm4gZWluZSBnbGVpY2huYW1pZ2UKKyAgICAgVmFyaWFibGUgYXVzIHZlcnNjaGllZGVuZW4gT2JqZWt0ZW4gZ2VlcmJ0IHdpcmQuIERpZSBWYXJpYWJsZW4KKyAgICAgZXhpc3RpZXJlbiBpbSBsZXR6dGxpY2ggZXJiZW5kZW4gT2JqZWt0IHp3ZWltYWwgdW5kIGRpZSB2ZXJzY2hpZWRlbmVuCisgICAgIGdlZXJidGVuIE1ldGhvZGVuIGdyZWlmZW4gYXVmIGlocmUgamV3ZWlsaWdlIFZhcmlhbnRlIHp1LgorCisgICAgIEJlaXNwaWVsIGlzdCBkaWUgc29nLiAiTWFzY2hlIiBvZGVyIGRlciAiRGlhbW9uZCBvZiBEZWF0aCI6IAorCisgICAgICAgICAgICAgICAgICAgICAgICBBICAgIChVcnNwcnVuZ3NvYmpla3QgbWl0IGdsb2JhbGVyIFZhcmlhYmxlIHgpICAgCisgICAgICAgICAgICAgICAgICAgICAgIC8gXAorICAgICAgICAgICAgICAgICAgICAgIEIgICBDICAoQiwgQyBlcmJlbiB2b24gQSB1bmQgbWFuaXB1bGllcmVuIGJlaWRlIHgpCisgICAgICAgICAgICAgICAgICAgICAgIFwgLworICAgICAgICAgICAgICAgICAgICAgICAgRCAgICAoRCBlcmJ0IHZvbiBCIHVuZCBBKQorCisgICAgIE1pdCBkZW0gU2NobHVlc3NlbHdvcnQgJ3ZpcnR1YWwnIGthbm4gZGllIERvcHBlbHVuZyBiZWltIEVyYmVuCisgICAgIGluIEIgdW5kIEMgdW50ZXJidW5kZW4gd2VyZGVuLgorCitTSUVIRSBBVUNIOgorICAgICBpbmhlcml0CisgICAgIHByaXZhdGUsIHByb3RlY3RlZCwgcHVibGljLCBub21hc2sKKyAgICAgdmlydHVhbAorICAgICBvYmpla3RlLCBvb3AKKyAgICAgL2RvYy9iZWlzcGllbGUvaW5oZXJpdAorCisyLkZlYiAyMDA4IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvTFBDL2luaXRpYWxpc2F0aW9uIGIvZG9jL0xQQy9pbml0aWFsaXNhdGlvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWYzYzJiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL0xQQy9pbml0aWFsaXNhdGlvbgpAQCAtMCwwICsxLDkzIEBACitDT05DRVBUCisKKyAgICAgICAgVkFSSUFCTEUgSU5JVElBTElaQVRJT04KKworREVTQ1JJUFRJT04KKyAgICAgICAgR2xvYmFsIHZhcmlhYmxlcywgbGlrZSB0aGVpciBsb2NhbCBjb3VudGVycGFydHMsIGNhbiBiZSBkZWZpbmVkCisgICAgICAgIHdpdGggYW4gaW5pdGlhbCB2YWx1ZToKKworICAgICAgICAgICAgaW50ICogYSA9ICh7IDMsIDQgfSk7CisKKyAgICAgICAgVGhlIGluaXRpYWxpemF0aW9uIHZhbHVlIGNhbiBiZSBhbnkgbGVnYWwgTFBDIGV4cHJlc3Npb24sCisgICAgICAgIGluY2x1ZGluZyBmdW5jdGlvbiBjYWxscy4gVGhlIGNvZGUgZm9yIHRoZSBpbml0aWFsaXphdGlvbnMgaXMKKyAgICAgICAgY29sbGVjdGVkIGluIGEgY29tcGlsZXItZ2VuZXJhdGVkIGZ1bmN0aW9uIF9fSU5JVCgpIHdoaWNoIGlzCisgICAgICAgIGNhbGxlZCBldmVuIGJlZm9yZSB0aGUgY3JlYXRlLWhvb2sgaXMgYXBwbGllZCBvbiB0aGUgb2JqZWN0LgorCisgICAgICAgIER1cmluZyBpbml0aWFsaXphdGlvbiwgYmx1ZXByaW50cyBhbmQgY2xvbmVzIGFyZSB0cmVhdGVkCisgICAgICAgIHNsaWdodGx5IGRpZmZlcmVudGx5OgorCisgICAgICAgIEJsdWVwcmludCB2YXJpYWJsZXMgYXJlIGFsd2F5cyBhbGwgaW5pdGlhbGl6ZWQgdXNpbmcgX19JTklUKCkuCisKKyAgICAgICAgRm9yIGNsb25lcyB0aGUgcHJvZ3JhbW1lciBjYW4gc2VsZWN0IHdoZXRoZXIgdGhlIGNsb25lJ3MKKyAgICAgICAgdmFyaWFibGVzIHNob3VsZCBhbHNvIGJlIGluaXRpYWxpemVkIHdpdGggX19JTklUKCksIG9yIGlmIHRoZXkKKyAgICAgICAgc2hvdWxkIGJlIGFzc2lnbmVkIGZyb20gdGhlIGN1cnJlbnQgYmx1ZXByaW50IHZhbHVlcworICAgICAgICAoJ3NoYXJlZCB3aXRoIHRoZSBibHVlcHJpbnQnKS4gVGhlIGxhdHRlciBtZXRob2QgaXMgdXNlZnVsIGZvcgorICAgICAgICBleGFtcGxlIGlmIGJsdWVwcmludHMgYW5kIGNsb25lcyBzaGFsbCBzaGFyZSBhcnJheXMgb3IKKyAgICAgICAgbWFwcGluZ3MuCisKKyAgICAgICAgVGhlIHNlbGVjdGlvbiBpcyBwZXJmb3JtZWQgd2l0aCB0aGUgdHdvIHByYWdtYXMKKyAgICAgICAgJ2luaXRfdmFyaWFibGVzJyBhbmQgJ3NoYXJlX3ZhcmlhYmxlcycuIFRoZSBzdGF0dXMgb2YgdGhpcworICAgICAgICBwcmFnbWEgYXQgdGhlIHBvaW50IG9mIHRoZSBmaXJzdCB2YXJpYWJsZSBkZWZpbml0aW9uIGNvdW50cywKKyAgICAgICAgYW5kIGlzIGFwcGxpZWQgdG8gYWxsIHZhcmlhYmxlcyBpbiB0aGUgcHJvZ3JhbS4KKworICAgICAgICBUaGUgY2xvbmUgaW5pdGlhbGl6YXRpb24gbWV0aG9kIGlzIGV2YWx1YXRlZCBwZXItcHJvZ3JhbSwgaS5lLgorICAgICAgICBpZiBhbiBpbmhlcml0ZWQgcHJvZ3JhbSBkZWZpbmVzICdzaGFyZV92YXJpYWJsZXMnIGFuZCB0aGUgY2hpbGQKKyAgICAgICAgcHJvZ3JhbSBkb2Vzbid0LCBvbmx5IHRoZSBpbmhlcml0ZWQgdmFyaWFibGVzIGFyZSBpbml0aWFsaXplZAorICAgICAgICBmcm9tIHRoZSBibHVlcHJpbnQsIGFuZCBhbGwgb3RoZXJzIGZyb20gX19JTklUKCkuCisKKyAgICAgICAgVGhlIGRlZmF1bHQgc2V0dGluZyBmb3IgdGhlIHByYWdtYSBpcyBjb25maWd1cmVkIGludG8gdGhlCisgICAgICAgIGRyaXZlciwgYnV0IGNhbiBhbHNvIGJlIGNob3NlbiB3aGVuIHN0YXJ0aW5nIHRoZSBkcml2ZXIuCisgICAgICAgIAorRVhBTVBMRQorICAgICAgICBGb3IgdGhlIG9iamVjdAorCisgICAgICAgICAgLS0tLS0tLS0tLQorICAgICAgICAgIGluaGVyaXQgImEiOworICAgICAgICAgIGludCBhID0gNDsKKyAgICAgICAgICBpbnQgYjsKKyAgICAgICAgICAtLS0tLS0tLS0tCisKKyAgICAgICAgdGhlIGNvbXBpbGVyIGV4ZWN1dGVzIHRoZSBlcXVpdmFsZW50IG9mIHRoZXNlIF9fSU5JVCgpIGZ1bmN0aW9uczoKKworICAgICAgICAjcHJhZ21hIHNoYXJlX3ZhcmlhYmxlczoKKworICAgICAgICAgICAgdW5rbm93biBfX0lOSVQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJhIjo6X19JTklUKCk7CisgICAgICAgICAgICAgICAgaWYgKGNsb25lcCh0aGlzX29iamVjdCgpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGEgPSAoYmx1ZXByaW50IG9mIHRoaXNfb2JqZWN0KCkpLT5hOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhID0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisKKworICAgICAgICAjcHJhZ21hIGluaXRfdmFyaWFibGVzOgorCisgICAgICAgICAgICB1bmtub3duIF9fSU5JVCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImEiOjpfX0lOSVQoKTsKKyAgICAgICAgICAgICAgICBhID0gNDsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgIEluIGVpdGhlciBjYXNlIHRoZSB2YXJpYWJsZSAnYicgKGluIGZhY3QgYWxsIHZhcmlhYmxlcykgYXJlCisgICAgICAgIHNldCB0byAnMCcgYXMgcGFydCBvZiB0aGUgbG9hZGluZy9jbG9uaW5nIHByb2Nlc3MgYmVmb3JlIHRoZQorICAgICAgICBkcml2ZXIgcGVyZm9ybXMgdGhlIHNwZWNpZmljIGluaXRpYWxpc2F0aW9uLgorCitXQVJOSU5HCisgICAgICAgIERvIG5vdCBjYWxsIF9fSU5JVCgpIHlvdXJzZWxmLCBvdmVybG9hZCwgb3IgdXNlIGl0IGRpcmVjdGx5IGluCisgICAgICAgIGFueSBvdGhlciB3YXkuIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdmFyaWFibGUKKyAgICAgICAgaW5pdGlhbGl6YXRpb24gbWF5IGNoYW5nZSBhdCBhbnkgdGltZS4KKworSElTVE9SWQorICAgICAgICBCZWZvcmUgTERNdWQgMy4zLjM3OCwgdGhlIGNob2ljZSBiZXR3ZWVuIHNoYXJpbmcgYW5kIGluaXRpYWxpemluZworICAgICAgICAgIHZhcmlhYmxlcyB3YXMgYSBmaXhlZCBjb25maWd1cmF0aW9uIGNob2ljZSBvZiB0aGUgZHJpdmVyLgorCitTRUUgQUxTTworICAgICAgICBwcmFnbWEoTFBDKSwgY3JlYXRlKEgpLCBpbnZvY2F0aW9uKEQpCmRpZmYgLS1naXQgYS9kb2MvTFBDL2lubGluZS1jbG9zdXJlcyBiL2RvYy9MUEMvaW5saW5lLWNsb3N1cmVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMmVjZGQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvTFBDL2lubGluZS1jbG9zdXJlcwpAQCAtMCwwICsxLDEzMSBAQAorQ09OQ0VQVAorICAgICAgICBpbmxpbmUgY2xvc3VyZXMKKworU1lOVEFYCisgICAgICAgIGZ1bmN0aW9uIDxyZXR1cm50eXBlPiAoIDxhcmd1bWVudHM+ICkgOiA8Y29udGV4dD4geyA8Y29kZT4gfQorCisgICAgICAgICg6IDxzdGF0ZW1lbnRzPiA7IDxleHByPiwgLi4uICwgPGV4cHI+IDopCisKKworREVTQ1JJUFRJT04KKyAgICAgICAgSW5saW5lIGNsb3N1cmVzIGFyZSBhIHdheSB0byBwcm9ncmFtIGNsb3N1cmVzIHdoaWNoIGFyZQorICAgICAgICBjb21waWxlZCBhdCB0aGUgdGltZSBhbiBvYmplY3QgaXMgbG9hZGVkLCBidXQgY2FuIGFjY2VzcworICAgICAgICB2YWx1ZXMgZnJvbSB0aGVpciBlbmNsb3NpbmcgZnVuY3Rpb24gYXQgcnVudGltZS4KKworICAgICAgICBFeGFtcGxlOgorCisgICAgICAgICAgY2xvc3VyZSBmYWN0b3J5IChpbnQgYXJnKSB7CisgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gaW50IChpbnQgdmFsKSB7IHJldHVybiB2YWwgKiBhcmc7IH07CisgICAgICAgICAgfQorCisgICAgICAgICAgY2xvc3VyZSBmMSA9IGZhY3RvcnkoMik7CisgICAgICAgICAgY2xvc3VyZSBmMiA9IGZhY3RvcnkoMyk7CisgICAgICAgICAgZnVuY2FsbChmMSwgMykgLT4gd2lsbCB5aWVsZCA2LgorICAgICAgICAgIGZ1bmNhbGwoZjIsIDMpIC0+IHdpbGwgeWllbGQgOS4KKworICAgICAgICBUaGUgY2xvc3VyZSBoZXJlICdpbmhlcml0cycgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGxvY2FsCisgICAgICAgIHZhcmlhYmxlICdhcmcnIGF0IHRoZSB0aW1lIHRoZSBjbG9zdXJlIGlzIGNyZWF0ZWQuIFRoZXNlCisgICAgICAgIHZhbHVlcyBhcmUgY2FsbGVkIHRoZSAiY29udGV4dCIgb2YgdGhlIGNsb3N1cmVzIC0gdGhleSBhcmUKKyAgICAgICAgc3RvcmVkIGluIGEgc3BlY2lhbCBzZXQgb2YgdmFyaWFibGVzIGluIHRoZSBjbG9zdXJlLgorCisgICAgICAgIE9uZSBzcGVjaWZpYyBmZWF0dXJlIG9mIHRoZSBjbG9zdXJlIGNvbnRleHQgaXMgdGhhdCBpdCBjYW4gYmUKKyAgICAgICAgY2hhbmdlZCBmcm9tIHdpdGhpbiB0aGUgY2xvc3VyZSwgYW5kIHRoYXQgdGhlc2UgY2hhbmdlcyByZW1haW4KKyAgICAgICAgcGVybWFuZW50OgorCisgICAgICAgICAgY2xvc3VyZSBmYWN0b3J5IChpbnQgYXJnKSB7CisgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gaW50IChpbnQgdmFsKSB7IHJldHVybiB2YWwgKiBhcmcrKzsgfTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBjbG9zdXJlIGYgPSBmYWN0b3J5KDIpOworICAgICAgICAgIGZ1bmNhbGwoZiwgMykgLT4gd2lsbCB5aWVsZCA2LgorICAgICAgICAgIGZ1bmNhbGwoZiwgMykgLT4gd2lsbCBub3cgeWllbGQgOSEKKworICAgICAgICBCdXQgY2hhbmdlcyBvZiB0aGUgY2xvc3VyZSBjb250ZXh0IHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlCisgICAgICAgIGxvY2FsIHZhcmlhYmxlIGl0IHdhcyBjb3BpZWQgZnJvbSBhbmQgdmljZSB2ZXJzYS4KKworICAgICAgICBJbiBhZGRpdGlvbiB0byB0aGUgaW1wbGljaXRlIGNvbnRleHQgaW5oZXJpdGVkIGZyb20gdGhlCisgICAgICAgIGRlZmluaW5nIGZ1bmN0aW9uLCBhZGRpdGlvbmFsIGNvbnRleHQgdmFyaWFibGVzIGNhbiBiZSBkZWZpbmVkCisgICAgICAgIGluIHRoZSBjbG9zdXJlOgorCisgICAgICAgICAgY2xvc3VyZSBmYWN0b3J5IChpbnQgYXJnKSB7CisgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gaW50IChpbnQgdmFsKSA6IGludCB4ID0gMiAqIGFyZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gdmFsICogeDsgfTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBjbG9zdXJlIGYgPSBmYWN0b3J5KDIpOworICAgICAgICAgIGZ1bmNhbGwoZiwgMykgLT4gd2lsbCB5aWVsZCAxMi4KKworICAgICAgICBJdCBpcyBwb3NzaWJsZSB0byBkZWZpbmUgbXVsdGlwbGUgY29udGV4dCB2YXJpYWJsZXMgd2l0aCBhbmQKKyAgICAgICAgd2l0aG91dCBpbml0aWFsaXNhdGlvbjoKKworICAgICAgICAgIGNsb3N1cmUgZmFjdG9yeSAoaW50IGFyZykgeworICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGludCAoaW50IHZhbCkgOiBpbnQgeSwgeCA9IDIgKiBhcmc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiB2YWwgKiB4OyB9OworICAgICAgICAgIH0KKworICAgICAgICBUaGVzZSBleHBsaWNpdGUgY29udGV4dCB2YXJpYWJsZXMgYXJlIHVzZWZ1bCB3aGVuIHRoZSBjbG9zdXJlcworICAgICAgICBuZWVkcyB0byBrZWVwIGEgc3RhdGUsIG9yIHRvIGltcHJvdmUgcGVyZm9ybWFuY2U6CisKKyAgICAgICAgICBtYXBwaW5nIG0gPSAuLi47CisgICAgICAgICAgY2xvc3VyZSBzbG93IChpbnQgYXJnKSB7CisgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gbWl4ZWQgKCkgeyByZXR1cm4gbVthcmddOyB9CisgICAgICAgICAgfQorICAgICAgICAgIGNsb3N1cmUgZmFzdCAoaW50IGFyZykgeworICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIG1peGVkICgpIDogbWl4ZWQgdmFsID0gbVthcmddIHsgcmV0dXJuIHZhbDsgfQorICAgICAgICAgIH0KKworICAgICAgICBJbiB0aGUgYWJvdmUgZXhhbXBsZSwgdGhlIGZhc3QoKSBmdW5jdGlvbiBleGVjdXRlcyB0aGUgbG9va3VwCisgICAgICAgIG1bYXJnXSBvbmx5IG9uY2Ugd2hlbiB0aGUgaW5saW5lIGNsb3N1cmUgaXMgY3JlYXRlZDsgdGhlCisgICAgICAgIHNsb3coKSBmdW5jdGlvbiBvbiB0aGUgb3RoZXIgaGFuZCByZXR1cm5zIGEgY2xvc3VyZXMgd2hpY2gKKyAgICAgICAgbG9va3MgdXAgbVthcmddIGV2ZXJ5IHRpbWUgaXQgaXMgY2FsbGVkLiBBIHNlY29uZCBlZmZlY3QgaXMKKyAgICAgICAgdGhhdCB0aGUgcmVzdWx0cyBvZiB0aGUgc2xvdyBjbG9zdXJlIGNoYW5nZSB3aGVuIG0gY2hhbmdlczsKKyAgICAgICAgdGhlIHJlc3VsdCBvZiB0aGUgZmFzdCBjbG9zdXJlIGlzIGFsd2F5cyB0aGUgc2FtZS4KKworCisgICAgICAgIEluIHRoZSBkZWZpbml0aW9uIG9mIGFuIGlubGluZSBjbG9zdXJlLCBzb21lIGVsZW1lbnRzIGFyZQorICAgICAgICBvcHRpb25hbDoKKworICAgICAgICAgIDxyZXR1cm50eXBlPiAgICAgZGVmYXVsdHMgdG8gJ21peGVkJworICAgICAgICAgICggPGFyZ3VtZW50cz4gKSAgZGVmYXVsdHMgdG8gJyhtaXhlZCAkMSAuLi4gIG1peGVkICQ5KScKKyAgICAgICAgICA6IDxjb250ZXh0PiAgICAgIG5vIGRlZmF1bHQKKworCisgICAgICAgIFRoZSBzcGVjaWFsICg6IDopIGZvcm0gaXMgbWVhbnQgZm9yIHNpbXBsZSBleHByZXNzaW9ucyAoYW5kCisgICAgICAgIE11ZE9TIGNvbXBhdGliaWxpdHkpLiBUaGUgZm9ybQorCisgICAgICAgICAgKDogPHN0YXRlbWVudHM+IDsgPGV4cHI+LCAuLi4sIDxleHByPiA6KQorCisgICAgICAgIGlzIHRoZSBzaG9ydGhhbmQgbm90YXRpb24gZm9yCisKKyAgICAgICAgICBmdW5jdGlvbiB7IDxzdGF0ZW1lbnRzPjsgcmV0dXJuIDxleHByPiwgLi4uLCA8ZXhwcj47IH0KKworICAgICAgICBGb3IgZXhhbXBsZSB0aGUgdHdvIHN0YXRlbWVudHMKKworICAgICAgICAgIHNvcnRfYXJyYXkoYXJyLCBmdW5jdGlvbiB7IHJldHVybiAkMSA8ICQyOyB9ICkKKyAgICAgICAgICBzb3J0X2FycmF5KGFyciwgKDogJDEgPCAkMiA6KSApCisKKyAgICAgICAgZG8gdGhlIHNhbWUuIFRoZSBleGFtcGxlIGFsc28gZGVtb25zdHJhdGVzIHRoYXQgYm90aCB0aGUgPHN0YXRlbWVudHM+CisgICAgICAgIGFuZCB0aGUgPGV4cHI+IHBhcnQgaW4gdGhpcyBmb3JtIGFyZSBvcHRpb25hbC4KKworCisKK05PVEVTCisgICAgICAgIFRoZSBtYWNybyBfX0xQQ19JTkxJTkVfQ0xPU1VSRVNfXyBpcyBkZWZpbmVkIHdoZW4gdGhlCisgICAgICAgIGlubGluZSBjbG9zdXJlcyBhcyBkZXNjcmliZWQgaGVyZSBhcmUgYXZhaWxhYmxlLiBJZiBub3QKKyAgICAgICAgZGVmaW5lZCwgdGhlIGRyaXZlciBpbXBsZW1lbnRzIGEgbW9yZSByZXN0cmljdGVkIHZlcnNpb24KKyAgICAgICAgKCcoOiA6KScgc3ludGF4IG9ubHksIG5vIGNvbnRleHQgdmFyaWFibGVzKSBmb3IgYmFja3dhcmRzCisgICAgICAgIGNvbXBhdGliaWxpdHkuCisKKyAgICAgICAgSW5saW5lIGNsb3N1cmVzIGFyZSBub3QgdG8gYmUgY29uZnVzZWQgd2l0aCBpbmxpbmUgZnVuY3Rpb25zCisgICAgICAgIGtub3duIGZyb20gb3RoZXIgbGFuZ3VhZ2VzLgorCitISVNUT1JZCisgICAgICAgIExETXVkIDMuMi43IGltcGxlbWVudGVkIHRoZSBvbGRlciwgcmVzdHJpY3RlZCBmb3JtIG9mIGlubGluZQorICAgICAgICBjbG9zdXJlcy4KKyAgICAgICAgTERNdWQgMy4zLjI3MSBpbXBsZW1lbnRlZCB0aGUgZnVsbCBmb3JtIG9mIGlubGluZSBjbG9zdXJlcy4KKyAgICAgICAgTERNdWQgMy4zLjI3NSByZS1hbGxvd2VkIHN0YXRlbWVudHMgaW4gdGhlICg6IDopIGZvcm0uCisKK1NFRSBBTFNPCisgICAgICAgIGNsb3N1cmVzLWFic3RyYWN0KExQQyksIGNsb3N1cmVzLWV4YW1wbGUoTFBDKSwgY2xvc3VyZV9ndWlkZShMUEMpCisgICAgICAgIGNsb3N1cmVzKExQQykKZGlmZiAtLWdpdCBhL2RvYy9MUEMvaW50ZWdlcnMgYi9kb2MvTFBDL2ludGVnZXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYmQ4NDgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvTFBDL2ludGVnZXJzCkBAIC0wLDAgKzEsNDAgQEAKK05BTUUKKyAgICAgICAgaW50ZWdlcnMKKworREVTQ1JJUFRJT04KKyAgICAgICAgaW50IGlzIHRoZSBmYXN0ZXN0IGRhdGEgdHlwZSBpbiBMUEMuCisKKyAgICAgICAgQW4gaW50ZWdlciBjb250YWlucyBhIHdob2xlIG51bWJlciBiZXR3ZWVuCisgICAgICAgIC0yMTQ3NDgzNjQ4IGFuZCAyMTQ3NDgzNjQ3LgorCisgICAgICAgIE9wZXJhdGlvbnMgd2l0aCBpbnRlZ2VyczoKKyAgICAgICAgICArICBwbHVzICAgICAgICAgICAgICAgJiAgIEFORCAgICA8PCBTSElGVCByaWdodAorICAgICAgICAgIC0gIG1pbnVzICAgICAgICAgICAgICB8ICAgT1IgICAgID4+IFNISUZUIGxlZnQKKyAgICAgICAgICAqICBtdWx0aXBseSAgICAgICAgICAgXiAgIFhPUgorICAgICAgICAgIC8gIGRpdmlkZSAod2hvbGUpICAgICB+ICAgTk9UICAgID0gIEFzc2lnbiB2YWx1ZQorICAgICAgICAgICUgIGRpdmlkZSAobW9kdWxvKSAgICArPSAgYWRkICAgIC09IHN1YnRyYWN0ICAgICAgICAKKworICAgICAgICBUaGUgcmVzdWx0IG9mIGEgYm9vbGVhbiBleHByZXNzaW9uIGlzIGFsc28gYW4gaW50ZWdlcjoKKyAgICAgICAgICAwIChmYWxzZSkKKyAgICAgICAgICAxICh0cnVlKQorCisgICAgICAgIEJvb2xlYW4gb3BlcmF0b3JzIGFyZToKKyAgICAgICAgICAhICAobm90KQorICAgICAgICAgID09IChlcXVhbCkKKyAgICAgICAgICB8fCAob3IpCisgICAgICAgICAgJiYgKGFuZCkKKworRlVOQ1RJT05TCisgICAgICAgIGludCB0b19pbnQoc3RyaW5nKQorICAgICAgICBpbnQgdG9faW50KGZsb2F0KQorICAgICAgICBpbnQgc3NjYW5mKHN0cmluZyBzdHIsIHN0cmluZyBmbXQsIG1peGVkIHZhcjEsIG1peGVkIHZhcjIsIC4uLikKKyAgICAgICAgdm9pZCBwcmludGYoc3RyaW5nIGZvcm1hdCwgLi4uKQorCitSRU1BUktTCisgICAgICAgIFNpbmdsZSBjaGFyYWN0ZXJzIGluIHN0cmluZ3MgYXJlIGFsc28gaW50ZWdlcnMuCisKK1NFRSBBTFNPCisgICAgICAgIGFycmF5cywgbWFwcGluZ3MsIG9wZXJhdG9ycywgc3RyaW5ncywgdHlwZXMKKworTEFTVCBDSEFOR0VECisgICAgICAgIFdlZG5lc2RheSwgN3RoIE1heSwgMjAwMywgYnkgQW1hcnlsbGlzCmRpZmYgLS1naXQgYS9kb2MvTFBDL2xmdW5zIGIvZG9jL0xQQy9sZnVucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWM1NTlkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL0xQQy9sZnVucwpAQCAtMCwwICsxLDMxIEBACitDT05DRVBUCisgICAgICAgIGxmdW5zCisKK0RFU0NSSVBUSU9OCisgICAgICAgIEEgbGZ1biBpcyBhIExQQyBmdW5jdGlvbiB3aXRoaW4gYW4gb2JqZWN0IHdoaWNoIGlzIHB1YmxpYyBhbmQgY2FuCisgICAgICAgIGJlIGNhbGxlZCBieSBvdGhlciBvYmplY3RzLiBJbiBPTyB0ZXJtcywgbGZ1bnMgYXJlICJtZXRob2RzIgorICAgICAgICB3aGljaCB5b3UgY2FuIHNlbmQgIm1lc3NhZ2VzIiB0by4KKworICAgICAgICBDYWxsaW5nIGxmdW5zIGlzIGRvbmUgYnkgdXNpbmcgdGhlIGVmdW4gY2FsbF9vdGhlcigpLCB3aGljaAorICAgICAgICB0YWtlcyBhcyBhcmd1bWVudHMgdGhlIG9iamVjdCBpbiB3aGljaCB0aGUgbGZ1biBpcyB0byBiZSBjYWxsZWQsCisgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBsZnVuIHRvIGJlIGNhbGxlZCBpbiB0aGUgb2JqZWN0LCBhbmQgYWRkaXRpb25hbAorICAgICAgICBhbmQgb3B0aW9uYWwgYXJndW1lbnRzLgorCisgICAgICAgIEFuIGV4YW1wbGUgbG9va3MgbGlrZSB0aGlzOgorCisgICAgICAgIGNhbGxfb3RoZXIoZHJpbmssICJRdWVyeVNob3J0Iik7CisKKyAgICAgICAgVGhpcyBjYWxsIG1heSBhbHNvIGJlIHdyaXR0ZW4gYXMKKworICAgICAgICBkcmluay0+UXVlcnlTaG9ydCgpOworCisgICAgICAgIFRoaXMgbWVhbnMgY2FsbF9vdGhlcihvYmplY3QsICJmdW5jdGlvbiIsIGFyZ3MuLi4pIGNhbiBhbHNvIGJlCisgICAgICAgIHdyaXR0ZW4gYXMgb2JqZWN0LT5mdW5jdGlvbihhcmdzLi4uKS4gVGhlIHNlY29uZCBmb3JtIGlzCisgICAgICAgIHByZWZlcnJlZCBhcyBpdCBpcyBlYXNpZXIgdG8gcmVhZC4KKworICAgICAgICBTb21lIGxmdW5zIGhhdmUgYSBzcGVjaWFsIG1lYW5pbmcgZm9yIHRoZSBMUEMgZHJpdmVyLCBiZWNhdXNlCisgICAgICAgIHRoZXkgYXJlIGFwcGxpZWQgYnkgdGhlIGludGVycHJldGVyIGluc3RlYWQgZnJvbSBhbiBMUEMgb2JqZWN0LgorICAgICAgICBUbyBkaXN0aW5ndWlzaCB0aG9zZSwgdGhleSBhcmUgY2FsbGVkIGBgYXBwbGllZCBsZnVucycnLgorCitTRUUgQUxTTworICAgICAgICBlZnVucyhMUEMpLCBlZnVuKEUpLCBhcHBsaWVkKEEpLCBtYXN0ZXIoTSksIGNhbGxfb3RoZXIoRSkKZGlmZiAtLWdpdCBhL2RvYy9MUEMvbHBjIGIvZG9jL0xQQy9scGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAzZGYwZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9MUEMvbHBjCkBAIC0wLDAgKzEsOSBAQAorTkFNRQorICAgICAgICBscGMKKworREVTQ1JJUFRJT04KKyAgICAgICAgVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgbWFuIHBhZ2VzIGFib3V0IHZhcmlvdXMgYXNwZWN0cyBvZiB0aGUKKyAgICAgICAgTFBDIGxhbmd1YWdlIGFzIGl0IGlzIHByb3ZpZGVkIGJ5IEFteWxhYXJzIHBhcnNlci9kcml2ZXIuCisKK1NFRSBBTFNPCisgICAgICAgIGNvbmNlcHRzKEMpLCBkcml2ZXIoRCksIGVmdW4oRSksIGFwcGxpZWQoQSksIG1hc3RlcihNKQpkaWZmIC0tZ2l0IGEvZG9jL0xQQy9tYXBwaW5ncyBiL2RvYy9MUEMvbWFwcGluZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgxZTNjOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9MUEMvbWFwcGluZ3MKQEAgLTAsMCArMSw0NzQgQEAKK0NPTkNFUFQKKyAgICAgICAgbWFwcGluZ3MKKworTEFTVCBVUERBVEUKKyAgICAgICAgTW9uLCAxNSBNYXIgMTk5OQorCitERVNDUklQVElPTgorCisgIEEgc3RlcC1ieS1zdGVwIGludHJvZHVjdGlvbiB0byBtYXBwaW5nczoKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIDEuIFdoYXQgaXMgYSBtYXBwaW5nPworCisgICAgQSBtYXBwaW5nIGlzIGEgZGF0YXR5cGUgd2hpY2ggYWxsb3dzIHRvIHN0b3JlIGRhdGEgYXNzb2NpYXRlZCB0byBhIGtleS4KKyAgSW4gb3RoZXIgbGFuZ3VhZ2VzICB0aGV5IGFyZSBhbHNvICBrbm93biAgYXMgJ2RpY3Rpb25hcmllcycgb3IgICdhbGlzdHMnLgorICBUaGVyZSBhcmUgYWxzbyBhbGlzdHMgaW4gTFBDIGJ1dCB0aGV5IGFyZSBub3QgYSBzZXBhcmF0ZSBkYXRhdHlwZSBidXQgYXJlCisgIGltcGxlbWVudGVkIG9uICB0b3Agb2YgYXJyYXlzLiAgQWxpc3RzIGFyZSAgdGhlIHByZWRlY2Vzc29ycyBvZiBtYXBwaW5ncy4KKyAgVGhlIGtleXMgYW5kIHRoZSB2YWx1ZXMgIGNhbiBiZSBvZiAgYW55IHR5cGUuICBCdXQgbW9zdCBjb21tb24gIGRhdGF0eXBlcworICBmb3Iga2V5cyBhcmUgc3RyaW5ncywgaW50ZWdlcnMgYW5kIG9iamVjdHMuICBPdGhlcnMgbGlrZSBhcnJheXMsIG1hcHBpbmdzCisgIG9yIGNsb3N1cmVzIGFyZW4ndCBhIGdvb2QgY2hvaWNlIGJlY2F1c2UgY29tcGFyaXNpb24gYmV0d2VlbiBpLmUuICBhcnJheXMKKyAgb2Z0ZW4gcmV0dXJucyBmYWxzZSAgZXZlbiBpZiB0aGV5IGVxdWFsICBpbiBjb250ZW50LiAgVGhpcyBpcyBiZWNhdXNlIHRoZQorICBkcml2ZXIgY29tcGFyZXMgaS5lLiB0d28gYXJyYXlzIGJ5IHRoZWlyIGludGVybmFsIHBvaW50ZXJzIGFuZCBub3QgYnkKKyAgdGhlaXIgY29udGVudC4gVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyBzaW1wbGU6IHNwZWVkLgorCisgICAgTWFwcGluZ3MgIGFyZSBhbGx3YXlzICB0cmVhdGVkICBhcyByZWZlcmVuY2VzICAgIHdoZW4gcGFzc2luZyAgdGhlbSAgdG8KKyAgZnVuY3Rpb25zLiBUaGlzIG1lYW5zIHdoZW4geW91IHBhc3MgYSBtYXBwaW5nICB0byBhbm90aGVyIG9iamVjdCBhbmQgdGhpcworICBvYmplY3QgbW9kaWZpZXMgdGhlIG1hcHBpbmcgdGhlIG1vZGlmaWNhdGlvbiB3aWxsICB0YWtlIHBsYWNlIGluIGEgZ2xvYmFsCisgIHNjb3BlIC0gdmlzaWJsZSB0byBhbGwgb2JqZWN0cyBob2xkaW5nIHRoaXMgbWFwcGluZyBpbiBhIHZhcmlhYmxlLgorCisKKyAgMi4gV2hhdCBhcmUgbWFwcGluZ3MgZ29vZCBmb3I/CisKKyAgICBUaGUgdGVybSAnZGljdGlvbmFyeScgIHByb2JhYmx5IGRlc2NyaWJlcyB0aGUgIHVzZSAgb2YgYSBtYXBwaW5nICBiZXN0LgorICBPcHBvc2VkICB0byBhcnJheXMgbWFwcGluZ3MgZG9uJ3QgaGF2ZSAgYSBzcGVjaWZpYyAgb3JkZXIuIFRoZXkgcHJvdmlkZSBhCisgIG1lY2hhbmlzbSB0byAgIGNyZWF0ZSAgYSBzZXQgIG9mIGFzc29jaWF0aW9ucyAgYmV0d2VlbiAgdmFsdWVzLiAgU3VjaCAgYW4KKyAgYXNzb2NpYXRpb24gY29uc2lzdHMgb2YgYSB1bmlxdWUgIGtleSBhbmQgZGF0YSAgdGhhdCBpcyBpZGVudGlmaWVkIGJ5IHRoZQorICBrZXkuIFRoaW5rIG9mICBhIGRpY3Rpb25hcnkgIHdoZXJlIHlvdSBoYXZlICBhICB3b3JkIGFuZCBhIGRlZmluaXRpb24gIG9mCisgIGl0LiBZb3UgdXNlIHRoZSB3b3JkIHRvIGxvb2t1cCBpdHMgZGVmaW5pdGlvbi4KKworICAgIE1hcHBpbmdzIGNhbiBiZSB1c2VkIGkuZS4gIHRvIGhvbGQgIGFsaWFzZXMgZm9yIGNvbW1hbmRzLiBUaGUga2V5IHdvdWxkCisgIHRoZW4gYmUgdGhlICBuYW1lIG9mICB0aGUgYWxpYXMgYW5kICB0aGUgIGRhdGEgdGhlIGNvbW1hbmQocykgYmVoaW5kICAgYW4KKyAgYWxpYXMuICBPciB0aGV5IGNhbiBiZSB1c2VkIGZvciAgdGhlIGV4aXRzIG9mIGEgIHJvb20uICBUaGUga2V5cyB3b3VsZCBiZQorICB0aGUgZGlyZWN0aW9ucyB3aGVyZSBvbmUgY2FuIGdvICB0byBhbmQgdGhlIGFzc29jaWF0ZWQgIGRhdGEgd291bGQgYmUgdGhlCisgIGZpbGUgbmFtZXMgb2YgdGhlICByb29tcy4gIEJ1dCBtYXBwaW5ncyBjYW4gIGFsc28gYmUgdXNlZCAgYXMgYSBraW5kIG9mIGEKKyAgc3BhcnNlIGFycmF5LiAgIEEgIHNwYXJzZSBhcnJheSBpcyAgYW4gIGFycmF5IHdoZXJlIG1vc3Qgb2YgIHRoZSBlbGVtZW50cworICBhcmVuJ3QgdXNlZCAgKG9jY3VwaWVkIGJ5IDApLiAgSS5lLiAgaWYgIHlvdSB3YW50IHRvICBzdG9yZSB2YWx1ZXMgYXQgdGhlCisgIHBvc2l0aW9uIDAsIDEzICBhbmQgMzc2NDIgb2YgYW4gIGFycmF5IHlvdSB3b3VsZCAgaGF2ZSB0byBjcmVhdGUgYW4gYXJyYXkKKyAgd2l0aCBhIHNpemUgb2YgYXQgbGVhc3QgMzc2NDMuICBUaGlzICBjb3N0cyBhIGxvdCAgb2YgbWVtb3J5IHNvIGEgbWFwcGluZworICB3b3VsZCBiZSAgbW9yZSB1c2VmdWwgYmVjYXVzZSB5b3Ugd291bGQgIHRoZW4gdXNlIHRoZSAgbnVtYmVycyAwLCAgMTMgYW5kCisgIDM3NjQyIGFzIGEga2V5IGFuZCBub3QgYXMgYW4gaW5kZXggdG8gYSBwb3NpdGlvbiAgKGFjdHVhbGx5IHRoZSBrZXlzIG9mIGEKKyAgbWFwcGluZyBhcmUgc29tZXRpbWVzICBjYWxsZWQgaW5kaWNlcyAgYnV0IHRoaXMgIGlzIGp1c3QgIGJlY2F1c2UgdGhlIHdheQorICBkYXRhIGlzIGFjY2Vzc2VkIGluIGEgbWFwcGluZyBpcyBzaW1pbGFyIHRvICBhcnJheXM6IGJ5IHRoZSBbXSBvcGVyYXRvcikuCisgIFRoaXMgYWxzbyBhbGxvd3MgdG8gIHF1ZXJ5IGFsbCBvY2N1cGllZCAgIHBvc2l0aW9ucyBvZiBhIHNwYXJzZSBhcnJheSAgYnkKKyAgcXVlcnlpbmcgZm9yIGFsbCAgdGhlIGtleXMgb2YgIHRoZSBtYXBwaW5nIG9wcG9zZWQgIHRvIGFuIGFycmF5IHdoZXJlIHlvdQorICBoYXZlIHRvIGl0ZXJhdGUgb3ZlciBhbGwgZWxlbWVudHMuCisKKworICAzLiBIb3cgZG8gSSBjcmVhdGUgYSBtYXBwaW5nPworCisgICAgVGhlcmUgYXJlIHNldmVyYWwgd2F5cyB0byBkbyBzby4gVGhlIG1vc3QgY29udmVuaWVudCBpcyB0aGUgZm9sbG93aW5nOgorCisgICAgICBtYXBwaW5nIG1hcDsKKyAgICAgIG1hcCA9IChbIGtleTA6IHZhbHVlMDA7IC4uLjsgdmFsdWUwbiwKKyAgICAgICAgICAgICAgIC4uLiA6IC4uLiAgICA7IC4uLjsgLi4uICAgICwKKyAgICAgICAgICAgICAgIGtleW46IHZhbHVlbjA7IC4uLjsgdmFsdWVubiBdKTsKKworICAgIEFzIHlvdSBjYW4gc2VlLCBhIGtleSBtYXkgIGhhdmUgbW9yZSB0aGFuICBvbmUgdmFsdWUgYXNzaWduZWQuICBCdXQgdGhlCisgIGFtb3VudCBvZiB2YWx1ZXMgcGVyIGtleSBtdXN0IGFsd2F5cyBiZSBlcXVhbC4gIEl0ICBpcyAgZXZlbiAgcG9zc2libGUgdG8KKyAgaGF2ZSBtYXBwaW5ncyB3aXRob3V0IGFueSB2YWx1ZXMhCisgICAgQW5vdGhlciAgbWV0aG9kIGlzICB0byB1c2UgdGhlICAgZWZ1biBta21hcHBpbmcoKS4gIFRoaXMgIGVmdW4gZ2V0cyB0d28KKyAgYXJndW1lbnRzIHdpdGggdGhlIGZpcnN0IGJlZWluZyBhbiBhcnJheSBvZiBrZXlzIGFuZCB0aGUgZm9sbG93aW5nIGJlZWluZworICBhcnJheXMgb2YgdmFsdWVzOgorCisgICAgICBtYXBwaW5nIG1hcDsKKyAgICAgIG1hcCA9IG1rbWFwcGluZyAoKHsga2V5MCAgICwgLi4uLCBrZXluICAgIH0pLAorICAgICAgICAgICAgICAgICAgICAgICAoeyB2YWx1ZTAwLCAuLi4sIHZhbHVlMG4gfSksCisgICAgICAgICAgICAgICAgICAgICAgICh7IC4uLiAgICAsIC4uLiwgLi4uICAgICB9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgKHsgdmFsdWVuMCwgLi4uLCB2YWx1ZW5uIH0pKTsKKworICAgIElmIHRoZSBlZnVuIG9ubHkgZ2V0cyBvbmUgYXJndW1lbnQsIHRoZW4gdGhpcyBhcmd1bWVudCB3aWxsIGJlIHRha2VuIGFzCisgIGFuIGFycmF5IG9mIGtleXMgYW5kIGEgbWFwcGluZyAgd2l0aG91dCB2YWx1ZXMgd2lsbCAgYmUgcmV0dXJuZWQuCisKKyAgICBBbiBlbXB0eSBtYXBwaW5nIGNhbiBiZSBjcmVhdGVkIGJ5IHVzaW5nIHRoZSBhYm92ZSBkZXNjcmliZWQgbWV0aG9kcyBieQorICBzaW1wbHkgb21taXR0aW5nIHRoZSBrZXlzIGFuZCB2YWx1ZXM6CisKKyAgICAgIG1hcHBpbmcgbWFwOworICAgICAgbWFwID0gKFtdKTsKKyAgb3I6CisgICAgICBtYXAgPSBta21hcHBpbmcoKHt9KSwgKHt9KSk7CisKKyAgICBPciAgYnkgIHVzaW5nIHRoZSBlZnVuICAgbV9hbGxvY2F0ZSgpLiAgVGhpcyBlZnVuIGdldHMgIGFzICBmaXJzdAorICBhcmd1bWVudCB0aGUgIGFtb3VudCAgb2Yga2V5cyB3aGljaCB3aWxsICBiZSAgYWRkZWQgc29vbiBhbmQgIGFuIG9wdGlvbmFsCisgIHNlY29uZCBhcmd1bWVudCBzcGVjaWZ5aW5nIHRoZSB3aWR0aCBvZiB0aGUgbWFwcGluZzoKKworICAgICAgbWFwID0gbV9hbGxvY2F0ZShuLCB3aWR0aCk7CisKKyAgICBUaGUgdmFsdWUgPG4+ICBtYXkgYmUgYSBiaXQgIGNvbmZ1c2luZyAgc2luY2UgbWFwcGluZ3Mgc2hyaW5rIGFuZCAgZ3JvdworICBkeW5hbWljYWxseS4gVGhpcyB2YWx1ZSBqdXN0IHRlbGxzIHRoZSBkcml2ZXIgaG93ICdsb25nJyB0aGlzICBtYXBwaW5nIGlzCisgIGdvaW5nIHRvIGJlICBzbyBwcm9wZXIgbWVtb3J5ICBhbGxvY2F0aW9ucyAgd2lsbCBiZSAgcGVyZm9ybWVkIHRvICByZWR1Y2UKKyAgdGhlIG92ZXJoZWFkIG9mIG1lbW9yeSByZWFsbG9jYXRpb24uICBJLmUuICBpZiB5b3Ugd2FudCB0byByZWFkIGluIGEgZmlsZQorICBhbmQgc3RvcmUgdGhlICByZWFkIGRhdGEgaW4gIGEgbWFwcGluZyAgeW91IHByb2JhYmx5ICBrbm93ICB0aGUgYW1vdW50IG9mCisgIGtleXMuICBTbyB5b3UgYWxsb2NhdGUgIGEgbWFwcGluZyB3aXRoIHRoaXMgIGVmdW4gYW5kIHRlbGwgdGhlIGRyaXZlciBob3cKKyAgbXVjaCBtZW1vcnkgc2hvdWxkICBiZSBhbGxvY2F0ZWQgIGJ5IHNwZWNpZmluZyAgYSBwcm9wZXIgPG4+ICB2YWx1ZS4KKyAgVGh1cyBjYXVzaW5nICBhICAgIHNwZWVkdXAgd2hlbiBhZGRpbmcgIHRoZSAgcmVhZCAgIGRhdGEgdG8gdGhlICAgbWFwcGluZworICBhZnRlcndhcmRzLiAgICBUaGUgPHdpZHRoPiBqdXN0IHNwZWNpZmllcyBob3cgICBtYW55ICB2YWx1ZXMgcGVyIGtleSB0aGlzCisgIG1hcHBpbmcgaXMgICBnb2luZyB0byBoYXZlLiBJZiAgbm8gIHdpZHRoIGlzIGdpdmVuLCAxICB3aWxsICBiZSAgdGFrZW4gYXMKKyAgZGVmYXVsdC4KKworICBBbiBlbXB0eSBtYXBwaW5nIGNyZWF0ZWQgd2l0aCAnKFtdKScgd2lsbCBhbHdheXMgaGF2ZSBhIHdpZHRoIG9mIDEuIFRvCisgIGNyZWF0ZSBlbXB0eSBtYXBwaW5ncyB3aXRoIG90aGVyIHdpZHRocywgd3JpdGUgaXQgYXMKKworICAgICAgbWFwID0gKFs6d2lkdGggXSk7CisKKyAgPHdpZHRoPiBjYW4gYmUgYW55IGV4cHJlc3Npb24gcmV0dXJuaW5nIGFuIGludGVnZXIgdmFsdWUgKGluY2x1ZGluZworICBmdW5jdGlvbiBjYWxscyksIGFuZCBpbiBmYWN0IHRoaXMgbm90YXRpb24gaXMganVzdCBhIGZhbmN5IHdheSBvZgorICB3cml0aW5nCisKKyAgICAgIG1hcCA9IG1fYWxsb2NhdGUoMCwgd2lkdGgpOworCisKKworICA0LiBIb3cgY2FuIEkgbW9kaWZ5IHRoZSBkYXRhIG9mIGEgbWFwcGluZz8KKworICAgIEFkZGluZyBhICBuZXcga2V5IGlzIHNpbWlsaWFyIHRvICAgbW9kaWZ5aW5nIHRoZSBhc3NvY2lhdGVkICBkYXRhIG9mIGFuCisgIGV4aXN0aW5nIGtleToKKworICAgICAgbWFwICs9IChbIGtleTogdmFsdWUwOyAuLi47IHZhbHVlbiBdKTsKKworICAgIE9yIGluIGNhc2Ugb25seSBhIHNpbmdsZSB2YWx1ZSBzaG91bGQgYmUgbW9kaWZpZWQ6CisKKyAgICAgIG1hcFtrZXksIG5dID0gdmFsdWVuOworCisgICAgSWYgIDxuPiBpcyBvdXQgb2YgIHJhbmdlIG9yIGlmIDxrZXk+IGRvZXNuJ3QgIGV4aXN0cyBhbmQgPG4+IGlzIGdyZWF0ZXIKKyAgdGhhbiAwIGFuICJJbGxlZ2FsIGluZGV4IiBlcnJvciB3aWxsIGJlIHJlcG9ydGVkLiBJZiA8bj4gaXMgZXF1YWwgdG8gMCBvcgorICB0aGUgbWFwcGluZyBvbmx5IGhhcyBhIHNpbmdsZSB2YWx1ZSBwZXIga2V5IG9uZSBjYW4gYWJicmV2aWF0ZSBpdCB3aXRoOgorCisgICAgICBtYXBba2V5XSA9IHZhbHVlOworCisgICAgSWYgdGhlcmUgaXMgbm8gPGtleT4gKGFuZCA8bj4gaXMgZXF1YWwgdG8gMCBvciAgbm90IHNwZWNpZmllZCBhdCBhbGwpIGEKKyAgbmV3IG9uZSB3aWxsIGJlIGFkZGVkIGF1dG9tYXRpY2FsbHkuCisKKyAgICBEZWxldGlvbiAgIG9mIGEga2V5ICAgIGlzICBkb25lIHdpdGggICAgdGhlICAtPSAgb3BlcmF0b3Igb3IgIHRoZSAgZWZ1bgorICBtX2RlbGV0ZSgpLiBBIG1hcHBpbmcgY2FuIG9ubHkgYmUgc3Vic3RyYWN0ZWQgYnkgb25lIHdpdGhvdXQgYW55IHZhbHVlczoKKworICAgICAgbWFwIC09IChbIGtleSBdKTsKKyAgb3I6CisgICAgICBtYXAgLT0gKFsga2V5MCwgLi4uLCBrZXluIF0pOworCisgIFRoZSBlZnVuIHRha2VzIGEgbWFwcGluZyBhcyBmaXJzdCBhbmQgYSBrZXkgYXMgc2Vjb25kIGFyZ3VtZW50OgorCisgICAgICBtX2RlbGV0ZShtYXAsIGtleSk7CisKKyAgICBUaGUgIGVmdW4gICBtX2RlbGV0ZSgpIHJldHVybnMgIHRoZSBtYXBwaW5nICAgYnV0IGJlY2F1c2UgIG1hcHBpbmdzIGFyZQorICBoYW5kbGVkIGFzIHJlZmVyZW5jZXMgdGhlcmUgaXMgbm8gbmVlZCBvZiBhbiBhc3NpZ25tZW50IGxpa2U6CisKKyAgICAgIG1hcCA9IG1fZGVsZXRlKG1hcCwga2V5KTsKKworCisgIDUuIEhvdyBjYW4gSSBhY2Nlc3MgdGhlIGRhdGEgc3RvcmVkIGluIGEgbWFwcGluZz8KKworICAgIFRoaXMgY2FuIGJlIGRvbmUgYnk6CisKKyAgICAgIHZhbHVlbiA9IG1hcFtrZXksIG5dOworCisgICAgT3IgaW4gY2FzZSBvZiBhIG1hcHBpbmcgd2l0aCBqdXN0IG9uZSB2YWx1ZSBwZXIga2V5OgorCisgICAgICB2YWx1ZTAgPSBtYXBba2V5XTsKKworICAgIElmIHRoZXJlIGlzIG5vICA8a2V5PiBpbiB0aGUgbWFwcGluZyAgYW5kIDxuPiBpcyAgMCBvciBub3Qgc3BlY2lmaWVkIGF0CisgIGFsbCAod2hpY2ggaXMgdGhlIHNhbWUpIGEgMCB3aWxsIGJlIHJldHVybmVkIG9yIGlmIDxuPiAgaXMgZ3JlYXRlciB0aGFuIDAKKyAgYW4gIklsbGVnYWwgaW5kZXgiIGVycm9yIHdpbGwgYmUgcmVwb3J0ZWQuCisKKworICA2LiBIb3cgY2FuIEkgdGVzdCBmb3IgdGhlIGV4aXN0YW5jZSBvZiBhIGtleT8KKworICAgIEEgIHJldHVybiB2YWx1ZSBvZiAwIGlzICBzdWZmaWNpZW50IGZvciBtb3N0IGFwcGxpY2F0aW9ucyBidXQgc29tZXRpbWVzCisgIHRoZSBhbWJpZ3VpdHkgIGJldHdlZW4gYW4gZXhpc3RpbmcgdmFsdWUgb2YgIDAgYW5kICBhIG5vbmV4aXN0aW5nIGtleSBjYW4KKyAgbGVhZCAgIHRvICBhICBwcm9ibGVtLiAgVGhlcmVmb3JlICAgb25lICBjYW4gdXNlICAgdGhlICBlZnVuIG1lbWJlcigpICBvcgorICBtYXBwaW5nX2NvbnRhaW5zKCkgdG8gY2hlY2sgaWYgdGhlcmUgYWN0dWFsbHkgaXMgYSBrZXkgaW4gdGhlIG1hcHBpbmc6CisKKyAgICAgIGlmIChtZW1iZXIobWFwLCBrZXkpKSB7CisgICAgICAgIC4uLgorICAgICAgfQorICBvcjoKKyAgICAgIGlmIChtYXBwaW5nX2NvbnRhaW5zKCZ2YWx1ZTAsIC4uLiwgJnZhbHVlbiwgbWFwLCBrZXkpKSB7CisgICAgICAgIC4uLgorICAgICAgfQorCisgICAgVGhpcyBhbHNvIHNob3dzIGhvdyAgb25lIGNhbiByZXRyaWV2ZSBhbGwgdmFsdWVzICAgYXNzb2NpYXRlZCB0byBhICBrZXkKKyAgZnJvbSBhIG1hcHBpbmcgaW4gYSBzaW5nbGUgc3RlcC4gVGhlICcmJyBpcyAgdGhlIHJlZmVyZW5jZSBvcGVyYXRvciB3aGljaAorICBpcyBuZWNjZXNhcnkgdG8gbGV0IHRoZSBlZnVuIHN0b3JlIHRoZSB2YWx1ZXMgaW4gdGhlIHZhcmlhYmxlcy4KKworICAgIEluIGNhc2UgICBvZiAgbWFwcGluZ3MgICB3aXRoICAgbm8gIHZhbHVlcywgICB0aGUgIGVmdW4gICBtZW1iZXIoKSAgYW5kCisgIG1hcHBpbmdfY29udGFpbnMoKSBhcmUgZXF1YWwgaW4gdGhlaXIgYmVoYXZpb3VyICBhbmQgdGhlaXIgd2F5IG9mIGNhbGxpbmcKKyAgYmVjYXVzZSBtYXBwaW5nX2NvbnRhaW5zKCkgd29uJ3QgZ2V0IGFueSByZWZlcmVuY2UgdmFyaWFibGVzIHRvIHN0b3JlIHRoZQorICB2YWx1ZXMgaW4gKG9idmlvdXNseSwgYmVjYXVzZSB0aGVyZSBhcmVuJ3QgYW55KS4KKworICAgICBBbHNvIG5vcm1hbGx5IG1lbWJlcigpIGlzIGtub3duIHRvIHJldHVybiB0aGUgcG9zdGlvbiBvZiBhbiBlbGVtZW50IGluCisgIGEgbGlzdCAoaS5lLiAgYSAgY2hhcmFjdGVyIGluIGEgIHN0cmluZyBvciBkYXRhICAgaW4gYW4gYXJyYXkpIGFuZCBpZiAgYW4KKyAgZWxlbWVudCBjb3VsZG4ndCBiZSAgZm91bmQgLTEgaXMgcmV0dXJuZWQuICAgQnV0IGluIHRoZSBjYXNlICBvZiBtYXBwaW5ncworICB0aGVyZSBhcmUgbm8gc3VjaCB0aGluZ3MgYXMgb3JkZXIgYW5kIHBvc3Rpb24uIFNvIG1lbWJlcigpIG9ubHkgcmV0dXJucyAwCisgIG9yIDEuCisKKworICA3LiBIb3cgY2FuIEkgY29weSBhIG1hcHBpbmc/CisKKyAgICBBICBtYXBwaW5nIGNhbiAgYmUgIGNvcGllZCAgIHdpdGggIHRoZSAgKyAgb3BlcmF0b3IgICBvciBieSB0aGUgICAgZWZ1bgorICBjb3B5X21hcHBpbmcoKToKKworICAgICAgbmV3bWFwID0gKFtdKSArIG1hcDsKKyAgb3I6CisgICAgICBuZXdtYXAgPSBjb3B5X21hcHBpbmcobWFwKTsKKworICAgIEEgbWFwcGluZyBzaG91bGQgb25seSBiZSBjb3BpZWQgd2hlbiBpdCBpcyBuZWNjZXNhcnkgdG8gZ2V0IGFuIG93biBjb3B5CisgIG9mIGl0IHRoYXQgIG11c3Qgbm90IGJlICBzaGFyZWQgYnkgb3RoZXIgb2JqZWN0cy4KKworCisgIDguIEhvdyBjYW4gSSBnZXQgYWxsIGtleXMgb2YgYSBtYXBwaW5nPworCisgICAgVGhlICBlZnVuIG1faW5kaWNlcygpIGdldHMgYSBtYXBwaW5nICBhcyBhcmd1bWVudCAgYW5kIHJldHVybnMgYW4gYXJyYXkKKyAgaG9sZGluZyBhbGwga2V5cyBkZWZpbmVkIGluIHRoaXMgbWFwcGluZzoKKworICAgICAga2V5cyA9IG1faW5kaWNlcyhtYXApOworCisKKyAgOS4gSG93IGNhbiBJIGdldCBhbGwgdGhlIHZhbHVlcyBvZiBhIG1hcHBpbmc/CisKKyAgICBUaGUgZWZ1biBtX3ZhbHVlcygpIGdldHMgIGEgbWFwcGluZyBhcyAgYXJndW1lbnQgIGFuZCByZXR1cm5zICBhbiBhcnJheQorICBob2xkaW5nIGFsbCB0aGUgZmlyc3QgKHNlY29uZCwgLi4uKSB2YWx1ZXMgb2YgaXQuCisKKyAgICAgIHZhbHVlczAgPSBtX3ZhbHVlcyhtYXApOyAgICAgcmV0dXJucyB0aGUgZmlyc3QgdmFsdWVzCisgICAgICB2YWx1ZXMwID0gbV92YWx1ZXMobWFwLCAwKTsgIGRpdG8KKyAgICAgIHZhbHVlczEgPSBtX3ZhbHVlcyhtYXAsIDEpOyAgcmV0dXJucyB0aGUgc2Vjb25kIHZhbHVlcworICAgICAgICBldGMKKworCisgIDEwLiBIb3cgY2FuIEkgZGV0ZXJtaW5lIHRoZSBzaXplIG9mIGEgbWFwcGluZz8KKworICAgIEJlY2F1c2UgYSBtYXBwaW5nIGlzIGEga2luZCBvZiByZWN0YW5nbGUgaXQgaGFzIHR3byBzaXplczogYSBsZW5ndGggYW5kCisgIGEgd2lkdGguICBUaGVyZSBhcmUgdGhyZWUgZGlmZmVyZW50IGVmdW5zICB0byBxdWVyeSB0aGVzZSB2YWx1ZXMuIFRoZSBmaXJzdAorICB0d28gYXJlIHRoZSAgZWZ1bnMgc2l6ZW9mKCksIHdoaWNoIHJldHVybnMgdGhlICBhbW91bnQgb2Yga2V5LXZhbHVlCisgIGFzc29jaWF0aW9ucyAodGhlIGxlbmd0aCBvZiAgYSBtYXBwaW5nKSwgYW5kIHdpZHRob2YoKSwgd2hpY2ggcmV0dXJucyB0aGUKKyAgbnVtYmVyIG9mIHZhbHVlcyBwZXIga2V5ICh0aGUgd2lkdGgpLiBUaGUgdGhpcmQgaXMgdGhlIGVmdW4gZ2V0X3R5cGVfaW5mbygpLgorICBnZXRfdHlwZV9pbmZvKCkgaXMgbWVhbnQgIHRvIGJlIGEgZnVuY3Rpb24gIHRvIGlkZW50aWZ5IGEgZGF0YXR5cGUuICAgSXRzCisgIHJldHVybiB2YWx1ZSBpcyBhbiAgYXJyYXkgb2YgdHdvICBudW1lcmljYWwgdmFsdWVzLiAgVGhlIGZpcnN0ICBzcGVjaWZpZXMKKyAgdGhlIGRhdGF0eXBlICAgb2YgdGhlIGFyZ3VtZW50IGFuZCAgIHRoZSBzZWNvbmQgaXMgYSAgIGRhdGF0eXBlIGRlcGVuZGVuZAorICB2YWx1ZS4gSW4gdGhlIGNhc2Ugb2YgYSBtYXBwaW5nIHRoZSBmaXJzdCB2YWx1ZSAgaXMgVF9NQVBQSU5HICh3aGljaCBpcyBhCisgIHZhbHVlIGRlZmluZWQgaW4gIDxscGN0eXBlcy5oPikgYW5kIHRoZSAgc2Vjb25kIHRoZSBhbW91bnQgb2YgdmFsdWVzICBwZXIKKyAga2V5IChhLmsuYS4gIGNvbHVtbnMgb3IgdGhlIHdpZHRoICBvZiB0aGUgbWFwcGluZyAgLSBhY3R1YWxseSBpdCB3b3VsZCBiZQorICBjb3JyZWN0IHRvIHNheSB0aGF0IHRoZSB3aWR0aCBvZiBhIG1hcHBpbmcgaXMgdGhlICBhbW91bnQgb2YgY29sdW1ucyBwbHVzCisgIG9uZSBmb3IgdGhlIGtleXMgYnV0IHRoaXMgaXMgdW5jb21tb24pLgorCisKKyAgMTEuIFdoYXQgaXMgdGhlIGJlc3QgbWV0aG9kIHRvIGl0ZXJhdGUgb3ZlciBhIG1hcHBpbmc/CisKKyAgICBGaXJzdCBvZiBhbGwgdGhlIG1haW4gcHVycG9zZSBvZiBhIG1hcHBpbmcgaXMgbm90IG1lYW50IHRvICBiZSBhIHNldCBvZgorICBkYXRhIHRvIGl0ZXJhdGUgb3Zlci4gQWZ0ZXJhbGwgdGhlIGtleXMgaW4gYSBtYXBwaW5nIGhhdmUgbm8gc3BlY2lmaWMgYnV0CisgIGEgcmFuZG9tIG9yZGVyIChhdCBsZWFzdCBvbiB0aGUgTFBDIHNpZGUpLiAgQnV0ICBzdGlsbCBpdCBpcyBwb3NzaWJsZSBhbmQKKyAgc29tZXRpbWVzIGV2ZW4gbmVjY2VzYXJ5IHRvIGRvIHNvLgorCisgICAgSWYgYWxsIGtleS12YWx1ZSBhc3NvY2lhdGlvbnMgIHNob3VsZCBiZSBwcm9jZXNzZWQgIHRoZW4gb25lIHNob3VsZCB1c2UKKyAgd2Fsa19tYXBwaW5nKCkuICBJZiBhbGwga2V5cyBvZiBhIG1hcHBpbmcgc2hvdWxkIGJlIHByb2Nlc3NlZCB0byBjcmVhdGUgYQorICBuZXcgbWFwcGluZyBiZWluZyBhIHN1YnNldCBvZiB0aGUgZ2l2ZW4gb25lLCB0aGVuIGZpbHRlcl9tYXBwaW5nKCkgc2hvdWxkCisgIGJlICB1c2VkLiAgSWYgYWxsICBrZXlzICBhcmUgZ29pbmcgdG8gIGJlICBwcm9jZXNzZWQgYW5kICB0byBjcmVhdGUgYSBuZXcKKyAgbWFwcGluZyB3aXRoIHRoZSAgc2FtZSBzZXQgb2Yga2V5cyBhcyAgdGhlIGdpdmVuIG1hcHBpbmcsIHRoZW4gb25lICB3b3VsZAorICB1c2UgbWFwX21hcHBpbmcoKS4gIEJ1dCBpbiB0aGUgY2FzZSBvZiBhbiAgaXRlcmF0aW9uIHRoYXQgc2hvdWxkL2NhbiBzdG9wCisgIGV2ZW4gaWYgbm90IGFsbCBkYXRhIGlzIHByb2Nlc3NlZCBpdCBpcyBwcm9iYWJseSB3aXNlIHRvIGl0ZXJhdGUgb3ZlciB0aGUKKyAgbWFwcGluZyBieSBmaXJzdCBxdWVyeWluZyBmb3IgdGhlIGtleXMgYW5kIHRoZW4gdG8gaXRlcmF0ZSBvdmVyIHRoZW0gd2l0aAorICBhIGZvcigpIG9yIGEgd2hpbGUoKSBsb29wIGFuZCBxdWVyeWluZyB0aGUgdmFsdWVzIGJ5ICdoYW5kJy4KKworICAgIFRoZSBlZnVuIHdhbGtfbWFwcGluZygpIGdldHMgIGEgbWFwcGluZyBhcyAgZmlyc3QgYXJndW1lbnQgYW5kIHRoZSBuYW1lCisgIG9mIGEgZnVuY3Rpb24gIGFzIHNlY29uZCBvbmUuIEFsbCB0aGUgIGZvbGxvd2luZyBhcmd1bWVudHMgYXJlIHRyZWF0ZWQgYXMKKyAgZXh0cmFzIHdoaWNoICB3aWxsICBiZSAgcGFzc2VkIHRvIHRoZSAgIGZ1bmN0aW9uIHNwZWNpZmllZCAgd2l0aCB0aGUgIDJuZAorICBhcmd1bWVudC4gSW5zdGVhZCBvZiBhIHN0cmluZyBmb3IgdGhlIG5hbWUgb2YgYSBmdW5jdGlvbiBhIGNsb3N1cmUgY2FuIGJlCisgIHVzZWQsIHRvby4gTm90aGluZyB3aWxsIGJlIHJldHVybmVkOgorCisgICAgICAuLi4KKyAgICAgIHdhbGtfbWFwcGluZyhtYXAsICJmdW5jIiwgeGFyZzAsIC4uLiwgeGFyZ24pOworICAgICAgLi4uCisKKyAgICAgIHZvaWQgZnVuYyhtaXhlZCBrZXksIG1peGVkIHZhbHVlMCwgLi4uLCBtaXhlZCB2YWx1ZW4sCisgICAgICAgICAgICAgICAgbWl4ZWQgeGFyZzAsIC4uLiwgbWl4ZWQgeGFyZ24pIHsKKyAgICAgICAgLi4uCisgICAgICB9CisKKyAgICBmdW5jKCkgd2lsbCBiZSBjYWxsZWQgZm9yIGFsbCBrZXktdmFsdWUgYXNzb2NpYXRpb25zICBhbmQgZ2V0cyBhcyBmaXJzdAorICBhcmd1bWVudCB0aGUga2V5LiAgVGhlIG5leHQgYXJndW1lbnRzIGFyZSB0aGUgIHZhbHVlcyBiZWhpbmQgdGhlIGtleSAgYW5kCisgIGFyZSBwYXNzZWQgYXMgcmVmZXJlbmNlcy4gIFRoZSAgcmVzdCAgb2YgdGhlICBwYXNzZWQgYXJndW1lbnRzIGFyZSAgdGhvc2UKKyAgc3BlY2lmaWVkIGFzIGV4dHJhcy4gQmVjYXVzZSB0aGUgdmFsdWVzIGFyZSBwYXNzZWQgYXMgcmVmZXJlbmNlcyAob3Bwb3NlZAorICB0byAgY29waWVzKSBpdCBpcyBwb3NzaWJsZSAgdG8gbW9kaWZ5IHRoZW0gIGZyb20gIGluc2lkZSBmdW5jKCkgYnkgc2ltcGx5CisgIGFzc2lnbmluZyBuZXcgdmFsdWUgdG8gdGhlIHZhcmlhYmxlcyA8dmFsdWUwPiwgLi4uLCA8dmFsdWVuPi4KKworICAgIFRoZSBlZnVuIGZpbHRlcl9tYXBwaW5nKCkgY2FsbHMgIGEgZnVuY3Rpb24gZm9yICBlYWNoIGtleSBpbiAgYSBtYXBwaW5nCisgIGFuZCBjcmVhdGVzIGEgbmV3IG1hcHBpbmcgIHdoaWNoIG9ubHkgY29udGFpbnMga2V5LXZhbHVlIGFzc29jaWF0aW9ucyBmb3IKKyAgd2hpY2ggdGhlIGNhbGxlZCBmdW5jdGlvbiByZXR1cm5lZCB0cnVlIChub3QgIGVxdWFsIDAgdGhhdCBpcykuIFRoZSBmaXJzdAorICBhcmd1bWVudCBpcyB0aGUgbWFwcGluZyB0byBpdGVyYXRlIG92ZXIgYW5kIHRoZSBzZWNvbmQgaXMgYSBmdW5jdGlvbiBuYW1lCisgIGdpdmVuIGFzIGEgc3RyaW5nIG9yIGEgY2xvc3VyZToKKworICAgICAgLi4uCisgICAgICBzdWJtYXAgPSBmaWx0ZXJfbWFwcGluZyhtYXAsICJmdW5jIiwgeGFyZzAsIC4uLiwgeGFyZ24pOworICAgICAgLi4uCisKKyAgICAgIGludCBmdW5jKG1peGVkIGtleSwgbWl4ZWQgeGFyZzAsIC4uLiwgbWl4ZWQgeGFyZ24pIHsKKyAgICAgICAgLi4uCisgICAgICB9CisKKyAgICBmdW5jKCkgZ2V0cyAgYXMgZmlyc3QgYXJndW1lbnQgdGhlIGtleSAgYW5kIHRoZSBvdGhlcnMgYXJlIHRob3NlIHBhc3NlZAorICBhcyBleHRyYXMgdG8gZmlsdGVyX21hcHBpbmcoKS4KKworICAgIFRoZSBlZnVuIG1hcF9tYXBwaW5nKCkgZ2V0cyBhIG1hcHBpbmcgYXMgZmlyc3QgYXJndW1lbnQgYW5kIGEgc3RyaW5nIGFzCisgIGEgZnVuY3Rpb24gbmFtZSAob3IgYWdhaW4gYSBjbG9zdXJlKSBhcyAgc2Vjb25kIGFyZ3VtZW50LiAgQW55IGFkZGl0aW9uYWwKKyAgYXJndW1lbnRzIGFyZSBhZ2FpbiB1c2VkICBhcyBleHRyYXMgdGhhdCB3aWxsICBiZSBwYXNzZWQgdG8gdGhlIGl0ZXJhdGlvbgorICBmdW5jdGlvbi4gVGhpcyBlZnVuIHJldHVybnMgYSBuZXcgbWFwcGluZyB3aXRoIHRoZSBzYW1lIGtleXMgYXMgdGhlIGdpdmVuCisgIG9uZS4gIFRoZSB2YWx1ZXMgIHJldHVybmVkIGJ5IHRoZSBmdW5jdGlvbiAgdGhhdCBpcyBpbnZva2VkICBmb3IgZWFjaCBrZXkKKyAgd2lsbCBiZSB1c2VkIGFzIHRoZSBhc3NvY2lhdGVkIGRhdGEgYmVoaW5kIGVhY2gga2V5IG9mIHRoZSBuZXcgbWFwcGluZzoKKworICAgICAgLi4uCisgICAgICBuZXdtYXAgPSBtYXBfbWFwcGluZyhtYXAsICJmdW5jIiwgeGFyZzAsIC4uLiwgeGFyZ24pOworICAgICAgLi4uCisKKyAgICAgIG1peGVkIGZ1bmMobWl4ZWQga2V5LCBtaXhlZCB4YXJnMCwgLi4uLCBtaXhlZCB4YXJnbikgeworICAgICAgICAuLi4KKyAgICAgIH0KKworICAgIGZ1bmMoKSBnZXRzICBhcyBmaXJzdCBhcmd1bWVudCB0aGUga2V5ICBhbmQgdGhlIG90aGVycyBhcmUgdGhvc2UgcGFzc2VkCisgIGFzIGV4dHJhcyB0byBtYXBfbWFwcGluZygpLgorCisgICAgQmVjYXVzZSBhIGZ1bmN0aW9uIGNhbiBvbmx5IHJldHVybiAgYSBzaW5nbGUgdmFsdWUgIChldmVuIHdoZW4gaXQgaXMgYW4KKyAgYXJyYXkpIGl0IHJlc3RyaWN0cyB0aGUgdXNlICBvZiBtYXBfbWFwcGluZygpIHRvICBvbmx5IGFsbG93IGNyZWF0aW9uICBvZgorICBtYXBwaW5ncyB3aXRoIGEgc2luZ2xlIHZhbHVlIHBlciBrZXkuCisKKworICAxMi4gSXMgaXQgcG9zc2libGUgdG8gam9pbi9pbnRlcnNlY3QvY3V0IG1hcHBpbmdzIHdpdGggYW5vdGhlcj8KKworICAgIEpvaW5pbmcgbWFwcGluZ3MgaXMgb25seSBwb3NzaWJsZSwgaWYgIHRoZXkgaGF2ZSB0aGUgc2FtZSB3aWR0aCAoYW1vdW50CisgIG9mIHZhbHVlcyBwZXIga2V5KS4gT25lIGNhbiB1c2UgdGhlICsgYW5kICs9IG9wZXJhdG9yOgorCisgICAgICBtYXAgPSBtYXAxICsgbWFwMiArIC4uLiArIG1hcG47CisgICAgICBtYXAgKz0gbWFwMSArIG1hcDIgKyAuLi4gKyBtYXBuOworCisgICAgSW50ZXJzZWN0aW9uICAgICBvZiAgIHR3byAgIG1hcHBpbmdzIGlzICAgIG9ubHkgICAgICBwb3NzaWJsZSBieSAgdXNpbmcKKyAgZmlsdGVyX21hcHBpbmcoKS4gVGhlcmUgaXMgIG5vIGVmdW4gb3Igb3BlcmF0b3IgIHdoaWNoIGZlYXR1cmVzIHRoaXMuIFRoZQorICAnZWFzaWVzdCcgd2F5IG1heSBiZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uOgorCisgICAgICBtYXBwaW5nIGludGVyc2VjdF9tYXBwaW5nKG1hcHBpbmcgbWFwMSwgbWFwcGluZyBtYXAyKSB7CisgICAgICAgIGNsb3N1cmUgY2w7CisKKyAgICAgICAgY2wgPSBsYW1iZGEoKHsgJ2tleSB9KSwgKHsgIydtZW1iZXIsIG1hcDIsICdrZXkgfSkpOworICAgICAgICByZXR1cm4gZmlsdGVyX21hcHBpbmcobWFwMSwgY2wsIG1hcDIpOworICAgICAgfQorCisgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgIG5ldyBtYXBwaW5nIHdoaWNoICAgY29uc2lzdHMgb2YgYWxsICBrZXktdmFsdWUKKyAgYXNzb2NpYXRpb25zICAgb2YgIDxtYXAxPiAgZm9yIHdoaWNoICBhbiAgZXF1YWwgIGtleSAgY291bGQgICBiZSBmb3VuZCBpbgorICA8bWFwMj4uIFRoaXMgZnVuY3Rpb24gdXNlcyAgYSBjbG9zdXJlIHdoaWNoIHJldHVybnMgMCAgb3IgMSAgZGVwZW5kaW5nIG9uCisgIHdldGhlciBhIGtleSBmcm9tIDxtYXAxPiBpcyBjb250YWluZWQgaW4gPG1hcDI+IG9yIG5vdC4KKworICAgIEN1dHRpbmcgb3V0ICBhbGwga2V5LXZhbHVlIGFzc29jaWF0aW9ucyBvZiBhICAgbWFwcGluZyBmb3Igd2hpY2ggIGEga2V5CisgIGNvdWxkIGJlICBmb3VuZCBpbiBhbm90aGVyIG1hcHBpbmcgIGNhbiAgYmUgZG9uZSAgYnkgdXNpbmcgIHRoZSAgLSBhbmQgLT0KKyAgb3BlcmF0b3I6CisKKyAgICAgIG1hcHBpbmcgY3V0X21hcHBpbmcobWFwcGluZyBtYXAxLCBtYXBwaW5nIG1hcDIpIHsKKyAgICAgICAgcmV0dXJuIG1hcDEgLSBta21hcHBpbmcobV9pbmRpY2VzKG1hcDIpKTsKKyAgICAgIH0KKworICAgIEJlY2F1c2UgYSBtYXBpbmcgY2FuICBvbmx5IGJlIHN1YnN0cmFjdGVkIGJ5IG9uZSAgd2l0aG91dCBhbnkgdmFsdWVzIHdlCisgIGZpcnN0IGhhdmUgdG8gY3JlYXRlIHN1Y2ggYnkgdXNpbmcgbV9pbmRpY2VzKCkgYW5kIG1rbWFwcGluZygpLgorCisKKyAgMTMuIFdoYXQgYXJlIHRob3NlIG1hcHBpbmdzIHdpdGhvdXQgYW55IHZhbHVlcyAoYmVzaWRlcyBrZXlzKSBnb29kIGZvcj8KKworICAgIEJlY2F1c2UgdGhlIHdheSBob3cgdGhlIGRyaXZlciAgc2VhcmNoZXMgZm9yIGEgIGtleSBpbiBhIG1hcHBpbmcgaXMKKyAgcmF0aGVyIGZhc3QsIHRob3NlIG1hcHBpbmdzIGNhbiBiZSB1c2VkIGFzIGEgIHNldCBvZiBlbGVtZW50cyB3aXRoIGEgZmFzdAorICBtZXRob2QgZm9yIHRlc3RpbmcgaWYgYW4gZWxlbWVudCBpcyAgY29udGFpbmVkIGluIHRoZSBzZXQuIFRoaXMgdGVjaG5pcXVlCisgIGlzIGNhbGxlZCBoYXNoaW5nIChmdXJ0aGVyICBleHBsYW5hdGlvbiAgIHdvdWxkIGxlYWQgIHRvbyBmYXIpICB3aGljaCAgaXMKKyAgZmFzdGVyICB0aGFuIHNlYXJjaGluZyBmb3IgIHZhbHVlcyAgaW4gYXJyYXkgICh3aGljaCAgaXMgZG9uZSBpbiBhIGxpbmVhcgorICBmYXNoaW9uKS4KKworICAgIEFub3RoZXIgKG1heWJlICBtb3JlIHByYXRpY2FsKSB1c2UgIG9mIHRoZXNlICBtYXBwaW5ncyAgYXJlIHRvIGNyZWF0ZSBhCisgIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMgb3V0IG9mIGFuIGFycmF5IHdpdGggc2V2ZXJhbCBlcXVhbCB2YWx1ZXM6CisKKyAgICAgIHVuaXF1ZXMgPSBtX2luZGljZXMobWttYXBwaW5nKGFycmF5KSk7CisKKyAgICBta21hcHBpbmcoKSB1c2VzICA8YXJyYXk+IHRvICBjcmVhdGUgIGEgbWFwcGluZyB3aXRob3V0IGFueSAgdmFsdWVzIGJ1dAorICBqdXN0IGtleXMuIEFuZCAgYmVjYXVzZSBhIG1hcHBpbmcgY2FuIG9ubHkgIGhhdmUgdW5pcXVlIGtleXMgYWxsIG11bHRpcGxlCisgIHZhbHVlcyBpbiA8YXJyYXk+IGFyZSB0YWtlbiBhcyBvbmUuICBUaGUgY2FsbCBvZiBtX2luZGljZXMoKSB0aGVuIHJldHVybnMKKyAgYW4gIGFycmF5ICBvZiAgdGhlc2UgIHVuaXF1ZSBrZXlzLiAgQWN0dWFsbHkgd2UgIG9ubHkgIG1ha2UgIHVzZSBvZiB0aG9zZQorICBtYXBwaW5ncyB0ZW1wb3JhcmlseS4KKworCisgIDE0LiBIb3cgY2FuIEkgY29udmVydCBhbiBhbGlzdCBpbnRvIGEgIG1hcHBpbmcgYW5kIHZpY2UgdmVyc2E/CisKKyAgICBUaGVyZSBhcmUgbm8gc3BlY2lhbCBlZnVucyB3aGljaCBoYW5kbGUgc3VjaCBjb252ZXJzaW9ucy4gQnV0IGl0IGNhbiBiZQorICBkb25lIGJ5IHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgorCisgICAgICBtYXBwaW5nIGFsaXN0X3RvX21hcHBpbmcobWl4ZWQgKmFsaXN0KSB7CisgICAgICAgIHJldHVybiBhcHBseSgjJ21rbWFwcGluZywgYWxpc3QpOworICAgICAgfQorCisgICAgVGhlIGVmdW4gYXBwbHkoKSB0YWtlcyBhIGNsb3N1cmUgYW5kIGFuIGFycmF5IG9mIHZhbHVlcyBhbmQgcGFzc2VzIGVhY2gKKyAgZWxlbWVudCBvZiB0aGUgIGFycmF5IGFzIGFuICBhcmd1bWVudCAgdG8gdGhlICBjbG9zdXJlLiBCZWNhdXNlICBhbiBhbGlzdAorICBjb25zaXN0cyBvZiBhbiBhcnJheSBvZiBhcnJheXMgd2l0aCB0aGUgZmlyc3QgYmVlaW5nIHRoZSBsaXN0IG9mIGtleXMgYW5kCisgIHRoZSBvdGhlcnMgdGhlIHZhbHVlcyBhc3NvY2lhdGVkIHRvIGVhY2gga2V5IHBhc3NpbmcgdGhlbSBhcyBhcmd1bWVudHMgdG8KKyAgdGhlIGVmdW4gY2xvc3VyZSAjJ21rbWFwcGluZyB2aWEgYXBwbHkoKSBjYXVzZXMgdGhlIGNyZWF0aW9uIG9mIGEgbWFwcGluZworICBvdXQgb2YgYW4gYWxpc3QuCisKKyAgICAgIG1peGVkICptYXBwaW5nX3RvX2FsaXN0KG1hcHBpbmcgbWFwKSB7CisgICAgICAgIG1peGVkICphbGlzdDsKKyAgICAgICAgc3ltYm9sICp2YXJzOworICAgICAgICBzdHJpbmcgdmFyOworICAgICAgICBjbG9zdXJlIGNsOworICAgICAgICBpbnQgd2lkdGg7CisKKyAgICAgICAgd2lkdGggPSBnZXRfdHlwZV9pbmZvKG1hcClbMV07CisgICAgICAgIGFsaXN0ID0gYWxsb2NhdGUod2lkdGggKyAxKTsKKyAgICAgICAgdmFycyAgPSBhbGxvY2F0ZSh3aWR0aCArIDIpOworICAgICAgICBmb3IgKHZhciA9ICJhIjsgd2lkdGg7IHZhclswXSsrLCB3aWR0aC0tKSB7CisgICAgICAgICAgYWxpc3Rbd2lkdGhdID0gKHt9KTsKKyAgICAgICAgICB2YXJzW3dpZHRoXSAgPSBxdW90ZSh2YXIpOworICAgICAgICB9CisgICAgICAgIGFsaXN0WzBdID0gKHt9KTsKKyAgICAgICAgdmFyc1swXSAgPSAna2V5OworICAgICAgICB2YXJzWzwxXSA9ICdhbGlzdDsKKyAgICAgICAgY2wgPSBsYW1iZGEodmFycywgKHsgIyc9LCAnYWxpc3QsICh7ICMnaW5zZXJ0X2FsaXN0IH0pICsgdmFycyB9KSk7CisgICAgICAgIHdhbGtfbWFwcGluZyhtYXAsIGNsLCAmYWxpc3QpOworICAgICAgICByZXR1cm4gYWxpc3Q7CisgICAgICB9CisKKyAgICBUaGlzIGZ1bmN0aW9uIGlzICBhIGJpdCBtb3JlICBjb21wbGljYXRlZCAgdGhhbiB0aGUgb3RoZXIgIGFuZCBkZXRhaWxlZAorICBkZXNjcmlwdGlvbiB3b3VsZCBsZWFkICAgdG9vIGZhciBvZiAgIHRoZSB0b3BpYy4gIFRoaXMgIGZ1bmN0aW9uIGhhcyAgb25lCisgIHJlc3RyaWN0aW9uOiAgaXQgY2FuIG9ubHkgdHVybiBhICBtYXBwaW5ncyB3aXRoIHVwIHRvICAyNiAgdmFsdWVzIHBlciBrZXkKKyAgaW50byBhbiAgYWxpc3QuICAgIEJ1dCAgdGhpcyAgc2hvdWxkICBiZSAgIHN1ZmZpY2llbnQgZm9yIHByb2JhYmx5ICAgIGFsbAorICBhcHBsaWNhdGlvbnMgd2hpY2ggdXNlIG1hcHBpbmdzLgorCisgIEFuZCBIeXBzIGZ1cnRoZXIgY29tbWVudCBvbiB0aGlzOgorICAgICAgICBUaGUgZnVuY3Rpb24gbWFwcGluZ190b19hbGlzdCgpIGlzIGFsc28gbm90IHRoYXQKKyAgICAgICAgY2xldmVyIGJlY2F1c2UgaW5zZXJ0X2FsaXN0KCkgYWxsd2F5cyBjcmVhdGVzIGEgbmV3CisgICAgICAgIGFsaXN0LiAgQSBzZWNvbmQgKG9wdGlvbmFsKSBhcmd1bWVudCB0byBtX3ZhbHVlcygpIHRvCisgICAgICAgIHNwZWNpZnkgdGhlIHZhbHVlIGNvbHVtbiB3b3VsZCBiZSBiZXR0ZXIuIEJlc2lkZXMKKyAgICAgICAgdGhpcywgdGhlIGNvbnZlcnNpb24gb2YgYSBtYXBwaW5nIGludG8gYW4gYWxpc3QgY291bGQKKyAgICAgICAgYmUgZG9uZSBieSB0b19hcnJheSgpLgorCisgIDE1LiBEaXJ0eSBNYXBwaW5ncworCisgICdEaXJ0eSBtYXBwaW5ncycgYXJlIG5vdGhpbmcgdGhlIExQQyBwcm9ncmFtbWVyIGRpcmVjdGx5IGlzIGludm9sdmVkCisgIHdpdGgsIGhvd2V2ZXIsIGFzIGl0IHJlbGF0ZXMgdG8gdGhlIHdheSBtYXBwaW5ncyBhcmUgaW1wbGVtZW50ZWQKKyAgaW50ZXJuYWxseSBieSB0aGUgZ2FtZWRyaXZlci4gSG93ZXZlciwgYXMgdGhpcyB0ZXJtIHNob3dzIHVwIGluCisgIHZhcmlvdXMgZHJpdmVyIHN0YXRpc3RpY3MsIGl0IGlzIGV4cGxhaW5lZCBoZXJlLgorCisgIFRoZXJlIGFyZSB0d28gZnVuZGFtZW50YWwgYXBwcm9hY2hlcyB0byBpbXBsZW1lbnQgbWFwcGluZ3M6CisKKyAgICAxLiBTdG9yZSBhbGwgZGF0YSBlbnRyaWVzIGluIGFuIGFycmF5LWxpa2Ugc3RydWN0dXJlLCBpbiBzb3J0ZWQgb3JkZXIuIAorICAgIDIuIFN0b3JlIGFsbCBkYXRhIGluIGEgaGFzaHRhYmxlLCBlYWNoIGVudHJ5IGFsbG9jYWVkIHNlcGFyYXRlbHkuCisKKyAgTWV0aG9kIDEgaXMgdmVyeSBzcGFjZSBlZmZpY2llbnQsIGFzIGl0IGRvZXNuJ3QgbmVlZCBtdWNoIG92ZXJoZWFkCisgIHBlciBlbnRyeTsgaG93ZXZlciwgaW5zZXJ0aW9ucyBhbmQgZGVsZXRpb25zIG9mIGVudHJpZXMgYXJlCisgIHJlbGF0aXZlbHkgc2xvdyBhcyBhbGwgb3RoZXIgZW50cmllcyBuZWVkIHRvIGJlIG1vdmVkLiAgwqDCoMKgCisgIE1ldGhvZCAyIGlzIHZlcnkgZmFzdCBhcyBub3RoaW5nIG5lZWRzIHRvIGJlIG1vdmVkIGluIG1lbW9yeSwKKyAgaG93ZXZlciBpdCBoYXMgYSBsYXJnZSBvdmVyaGVhZC4KKworICBUaGUgZ2FtZWRyaXZlciB1c2VzIGEgaHlicmlkIG1ldGhvZDogYXQgdGhlIGJhc2lzIGlzIGEgbWFwcGluZworICBpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiBhcnJheXMuIEhvd2V2ZXIgdGhlIGRyaXZlciB1c2VzIGEgaGFzaCB0YWJsZQorICBpbiBhZGRpdGlvbiB0byBoYW5kbGUgYWxsIHRoZSBvbmdvaW5nIGluc2VydGlvbnMgYW5kIGRlbGV0aW9ucy4KKyAgRXZlcnkgb25jZSBpbiBhIHdoaWxlLCB0aGUgY29udGVudHMgb2YgdGhlIGhhc2ggdGFibGUgYXJlIHNvcnRlZAorICBpbnRvIHRoZSBiYXNlIGFycmF5LCByZWFzb25pbmcgdGhhdCBhbnkgZW50cnkgc3Vydml2aW5nIGZvciBsb25nZXIKKyAgdGltZSBpbiB0aGUgaGFzaCB0YWJsZSBpcyB3b3J0aCBrZWVwaW5nIGluIGEgbW9yZSBzcGFjZS1lZmZpY2llbnQKKyAgbWFubmVyLiAnRGlydHknIG1hcHBpbmdzIGFyZSBzdWNoIG1hcHBpbmdzIHdpdGggYm90aCBhbiBhcnJheSBhbmQgYQorICBoYXNoIHBhcnQsICdjbGVhbicgbWFwcGluZ3MgYXJlIHRob3NlIHdpdGgganVzdCBhbiBhcnJheSBwYXJ0LgorCitISVNUT1JZCisgICAgICAgIFRoZSAoWzp3aWR0aCBdKSBub3RhdGlvbiB3YXMgYWRkZWQgaW4gTERNdWQgMy4yLjkvMy4zLjIwOCAuCisKK1NFRSBBTFNPCisgICAgICAgIGFsaXN0cyhMUEMpLCBjbG9zdXJlcyhMUEMpLCBzdHJ1Y3RzKExQQyksIG1rbWFwcGluZyhFKSwKKyAgICAgICAgd2Fsa19tYXBwaW5nKEUpCmRpZmYgLS1naXQgYS9kb2MvTFBDL21vZGlmaWVycyBiL2RvYy9MUEMvbW9kaWZpZXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMDkwNGUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvTFBDL21vZGlmaWVycwpAQCAtMCwwICsxLDE4MiBAQAorQ09OQ0VQVAorICAgICAgICBtb2RpZmllcnMKKworREVTQ1JJUFRJT04KKyAgICAgICAgQSBtb2RpZmllciBjaGFuZ2VzIHRoZSBzeW50YWN0aWMgYW5kL29yIHNlbWFudGljIGJlaGF2aW91ciBvZgorICAgICAgICBhbiBvYmplY3QtZ2xvYmFsIHZhcmlhYmxlIG9yIGEgZnVuY3Rpb24gaW4gYW4gb2JqZWN0LgorICAgICAgICBUaGUgZXhpc3RpbmcgbW9kaWZpZXJzIGFyZSBkZXNjcmliZWQgYmVsb3cuCisgICAgICAgIFRvIHVzZSBhIG1vZGlmaWVyIGp1c3QgcHJlcGVuZCBpdCB0byB0aGUgZGVjbGFyYXRpb24uIElmIHNldmVyYWwKKyAgICAgICAgbW9kaWZpZXJzIGFyZSB0byBiZSB1c2VkIHRoZWlyIG9yZGVyIGRvZXMgbm90IG1hdHRlcjoKKworICAgICAgICBwcml2YXRlIGludCBiYXI7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4YW1wbGUgZm9yIGEgdmFyaWFibGUKKyAgICAgICAgcHJvdGVjdGVkIG5vbWFzayBpbnQgZm9vKCkgeyByZXR1cm4gMzsgfSAvLyBleGFtcGxlIGZvciBhIGZ1bmN0aW9uCisKKyAgICAgICAgRm9yIGZ1bmN0aW9uczoKKyAgICAgICAgfn5+fn5+fn5+fn5+fn4KKyAgICAgICAgcHJpdmF0ZSAgIC0tIHN1Y2ggZnVuY3Rpb25zIGNhbiBvbmx5IGJlIGNhbGxlZCB3aXRoIGFuIGludGVybmFsCisgICAgICAgICAgICAgICAgICAgICBjYWxsIGZyb20gd2l0aGluIHRoaXMgZmlsZS4gTm90IGV2ZW4gaW5oZXJpdGluZworICAgICAgICAgICAgICAgICAgICAgb2JqZWN0cyBjYW4gY2FsbCB0aGVzZSBmdW5jdGlvbnMuIFlvdSBjYW4gbmV2ZXJ0aGVsZXNzCisgICAgICAgICAgICAgICAgICAgICBidWlsZCBhbiBsZnVuLWNsb3N1cmUgd2l0aCAjJyBvdXQgb2YgYSBwcml2YXRlIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAoYnV0IHlvdSBjYW5ub3Qgc2F2ZSBhbmQgcmVzdG9yZSBpdCkuCisgICAgICAgIHByb3RlY3RlZCAtLSBzdWNoIGZ1bmN0aW9ucyBjYW4gYmUgY2FsbGVkIGZyb20gd2l0aGluIHRoZSBvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICBvciBmcm9tIGluaGVyaXRpbmcgb2JqZWN0czsgYnV0IGluIG5laXRoZXIgY2FzZQorICAgICAgICAgICAgICAgICAgICAgd2l0aCBjYWxsX290aGVyKCkuIEl0IGlzIHBvc3NpYmxlIHRvIGNyZWF0ZSAjJyBjbG9zdXJlcworICAgICAgICAgICAgICAgICAgICAgb3IgdXNlIHN5bWJvbF9mdW5jdGlvbigpIGZyb20gd2l0aGluIHRoZSBvYmplY3QuCisgICAgICAgICAgICAgICAgICAgICBJdHMgdXNlIGlzIHByZWZlcnJlZCBvdmVyIHRoZSBvbGRlciAic3RhdGljIi4KKyAgICAgICAgc3RhdGljICAgIC0tIHN1Y2ggZnVuY3Rpb25zIGNhbiBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gdGhlIG9iamVjdAorICAgICAgICAgICAgICAgICAgICAgaW4gZWl0aGVyIHdheSAoaW50ZXJuYWwgY2FsbCBvciB3aXRoIGNhbGxfb3RoZXIoKSkuCisgICAgICAgICAgICAgICAgICAgICBJbmhlcml0aW5nIG9iamVjdHMgY2FuIGNhbGwgc3VjaCBmdW5jdGlvbnMuCisgICAgICAgICAgICAgICAgICAgICBCdXQgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGNhbGwgc3RhdGljIGZ1bmN0aW9ucyBmcm9tCisgICAgICAgICAgICAgICAgICAgICBvdGhlciBvYmplY3RzIHZpYSBjYWxsX290aGVyKCkuCisgICAgICAgICAgICAgICAgICAgICBUaGUgdXNlIG9mICdzdGF0aWMnIGluIG5ldyBjb2RlIGlzIG5vdCByZWNvbW1lbmRlZC4KKyAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCBhbiBhZGRfYWN0aW9uKCkgaXMgdHJlYXRlZCBsaWtlIGEgY2FsbAorICAgICAgICAgICAgICAgICAgICAgZnJvbSB3aXRoaW4gdGhlIG9iamVjdCBleGNlcHQgdGhlIHBsYXllciB3aG8gZ290IHRoZQorICAgICAgICAgICAgICAgICAgICAgYWRkX2FjdGlvbigpIHdhcyBmb3JjZWQgKHRodXMgaXQgaXMgYSBzaW1wbGUgd2F5IHRvCisgICAgICAgICAgICAgICAgICAgICBzZWN1cmUgYW4gYWRkX2FjdGlvbigpIGFnYWluc3QgZm9yY2VzLCBhbHRob3VnaCB0aGlzCisgICAgICAgICAgICAgICAgICAgICBtZXRob2QgaGFzIHRoZSBzZXZlcmUgZGlzYWR2YW50YWdlcyBvZiByYWlzaW5nIGFuIGVycm9yCisgICAgICAgICAgICAgICAgICAgICBhdCB0aGUgZm9yY2Ugc28gYmV0dGVyIHVzZSB0aGUgc2VjdXJpdHkgc3lzdGVtKS4KKyAgICAgICAgICAgICAgICAgICAgIEFsc28gZWZ1bnMgbGlrZSBjYWxsX291dCgpIG9yIGlucHV0X3RvKCkgY2FuIGNhbGwKKyAgICAgICAgICAgICAgICAgICAgIHRoZXNlIGZ1bmN0aW9ucyBpZiBnaXZlbiBhcyBhIHN0cmluZy4KKyAgICAgICAgcHVibGljICAgIC0tIHRoaXMgaXMgdGhlIGRlZmF1bHQgdHlwZS4gU3VjaCBmdW5jdGlvbnMgY2FuIGJlIGNhbGxlZAorICAgICAgICAgICAgICAgICAgICAgZnJvbSB3aXRoaW4gdGhlIGZpbGUgYXMgd2VsbCBhcyBmcm9tIGluaGVyaXRpbmcgb2JqZWN0cworICAgICAgICAgICAgICAgICAgICAgYW5kIG90aGVyIG9iamVjdHMgdmlhIGNhbGxfb3RoZXIoKS4KKyAgICAgICAgICAgICAgICAgICAgIFRvIGRlY2xhcmUgYSBmdW5jdGlvbiBwdWJsaWMgb25seSByZXN1bHRzIGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgaW1wb3NzaWJpbGl0eSB0byBjaGFuZ2UgdGhlIGFjY2Vzc2liaWxpdHkgYXQgdGhlCisgICAgICAgICAgICAgICAgICAgICBpbmhlcml0IHN0YXRlbWVudCAoc2VlIGJlbG93KS4gTm8gZXJyb3Igd2lsbCBvY2N1ciwKKyAgICAgICAgICAgICAgICAgICAgIG9ubHkgdGhlIHR5cGUgd2lsbCBub3QgYmUgbW9kaWZpZWQgYnkgdGhlIGluaGVyaXQKKyAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudC4KKyAgICAgICAgbm9tYXNrICAgIC0tIHN1Y2ggZnVuY3Rpb25zIGNhbm5vdCBiZSBvdmVycmlkZGVuIGJ5IGluaGVyaXRpbmcKKyAgICAgICAgICAgICAgICAgICAgIG9iamVjdHMuIElmIHlvdSBoYXZlIHRoZSBmdW4gZm9vKCkgZGVmaW5lZCBpbiB5b3VyCisgICAgICAgICAgICAgICAgICAgICBvYmplY3QgYW5kIGluaGVyaXQgYW4gb2JqZWN0IHdoaWNoIGFsc28gaGFzIGRlY2xhcmVkCisgICAgICAgICAgICAgICAgICAgICBhIGZ1bmN0aW9uIGZvbygpIGFuZCB0aGlzIG5vbWFzaywgeW91IHdpbGwgZ2V0IGFuCisgICAgICAgICAgICAgICAgICAgICBjb21waWxlIGVycm9yIGlmIHlvdSB0cnkgdG8gbG9hZCB5b3VyIG9iamVjdC4KKyAgICAgICAgICAgICAgICAgICAgIEZ1cnRoZXJtb3JlIGEgc2hhZG93IHdpbGwgZmFpbCBpZiBpdCB0cmllcyB0byBzaGFkb3cKKyAgICAgICAgICAgICAgICAgICAgIGEgbm9tYXNrIGRlY2xhcmVkIGZ1bmN0aW9uLgorICAgICAgICB2YXJhcmdzICAgLS0gdGhpcyBjaGFuZ2VzIHRoZSBzeW50YXggb2YgdGhlIGZ1bmN0aW9uIGluIGEgd2F5IHRoYXQKKyAgICAgICAgICAgICAgICAgICAgIG5vdCBhbGwgb2YgdGhlIGFyZ3VtZW50cyBpbiB0aGUgZGVjbGFyYXRpb24gbXVzdCBiZQorICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gYXQgdGhlIGNhbGwuIFRoaXMgaXMgb2Z0ZW4gdmVyeSB1c2VmdWxsIGlmIHNvbWUKKyAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBhcmd1bWVudHMgc2hhbGwgYmUgb21pdGFibGUgKHRoZSBvbWl0dGVkCisgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHMgYXJlIHNldCB0byAwIGlmIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aAorICAgICAgICAgICAgICAgICAgICAgZmV3ZXIgYXJndW1lbnRzIHRoYW4gc3BlY2lmaWVkKS4KKyAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgbWFpbmx5IHdpdGhpbiB0aGUgb2JqZWN0IHJlYWxseSBuZWNlc3Nhcnk7CisgICAgICAgICAgICAgICAgICAgICBjYWxsX290aGVyKClzIHVzdWFsbHkgKHRoYXQgaXMgaWYgdGhleSBkbyBub3QgaGF2ZSBhCisgICAgICAgICAgICAgICAgICAgICBjZXJ0YWluIHByYWdtYSAoJ21hbiBwcmFnbWEnKSkgZG8gbm90IG5lZWQgdGhlIGNhbGxlZAorICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdG8gYmUgZGVjbGFyZWQgdmFyYXJncyB0byBvbWl0IGFueSBhcmd1bWVudHMsCisgICAgICAgICAgICAgICAgICAgICBidXQgaXQgaXMgZ29vZCBzdHlsZSB0byB1c2UgdGhpcyBtb2RpZmllciB0byBkb2N1bWVudAorICAgICAgICAgICAgICAgICAgICAgdGhlIGNvZGUgYnkgdGhpcy4KKyAgICAgICAgZGVwcmVjYXRlZCAtIFdoZW5ldmVyIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCBhIHdhcm5pbmcgaXMgaXNzdWVkLgorICAgICAgICAgICAgICAgICAgICAgVXN1YWxseSB0aGlzIGlzIGRvbmUgYXQgY29tcGlsZS10aW1lLiBFeGNlcHRpb25zIGFyZQorICAgICAgICAgICAgICAgICAgICAgY2FsbF9vdGhlcnMgYW5kIHN5bWJvbF9mdW5jdGlvbigpIHdoaWNoIHdhcm4gYXQgcnVuLXRpbWUuCisKKyAgICAgICAgRm9yIG9iamVjdC1nbG9iYWwgdmFyaWFibGVzOgorICAgICAgICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgICAgICAgIHByaXZhdGUgICAtLSBzdWNoIHZhcmlhYmxlcyBjYW4gb25seSBiZSBhY2Nlc3NlZCBmcm9tIHdpdGhpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgIHNhbWUgb2JqZWN0LiBOb3QgZXZlbiBpbmhlcml0aW5nIG9iamVjdHMgY2FuIGFjY2VzcworICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSB2YXJpYWJsZXMuCisgICAgICAgICAgICAgICAgICAgICBJdCBpcyBhIGdvb2Qgc3R5bGUgdG8gZGVjbGFyZSBhbGwgaW50ZXJuYWwgdmFyaWFibGVzCisgICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHRvIHByZXZlbnQgaW5oZXJpdGluZyBvYmplY3RzIGZyb20gYWNjZXNzaW5nCisgICAgICAgICAgICAgICAgICAgICB0aGUgdmFyaWFibGVzIGRpcmVjdGx5IHdpdGhvdXQgdXNpbmcgZnVuY3Rpb25zLgorICAgICAgICBub3NhdmUgICAgLS0gc3VjaCB2YXJpYWJsZXMgYXJlIG5laXRoZXIgc3RvcmVkIHdpdGggc2F2ZV9vYmplY3QoKQorICAgICAgICAgICAgICAgICAgICAgbm9yIHJlc3RvcmVkIHdpdGggcmVzdG9yZV9vYmplY3QoKS4gVGhpcyBjYW4gYmUgdmVyeQorICAgICAgICAgICAgICAgICAgICAgdXNlZnVsIGlmIHlvdSB3YW50IGEgcm9vbSB0byB1c2Ugc2F2ZV9vYmplY3QoKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgIHJlc3RvcmVfb2JqZWN0KCkgdG8gc2F2ZSB5b3VyIG93biBkZWZpbmVkIHZhcmlhYmxlcworICAgICAgICAgICAgICAgICAgICAgYnV0IG5vdCB0aGUgaHVuZHJlZHMgb2YgdmFyaWFibGVzIGluaGVyaXRlZCBmcm9tIGEKKyAgICAgICAgICAgICAgICAgICAgIHJvb20tY2xhc3MgKGUuZy4gL2NvbXBsZXgvcm9vbSkuIFlvdSB0aGVuIHVzZSB0aGUgbW9kaWZpZXIKKyAgICAgICAgICAgICAgICAgICAgIGF0IHRoZSBpbmhlcml0IHN0YXRlbWVudCAoc2VlIGJlbG93KS4KKyAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCBub3NhdmUgYW5kIHByaXZhdGUgZG8gbm90IG92ZXJsYXAgaW4gYW55CisgICAgICAgICAgICAgICAgICAgICB3YXkuIFRoZXkgYXJlIGFic29sdXRlbHkgaW5kZXBlbmRhbnQuCisgICAgICAgIHN0YXRpYyAgICAtLSB0aGUgb2xkIG5hbWUgZm9yICdub3NhdmUnLiBJdHMgdXNlIGlzIGRlcHJlY2F0ZWQuCisgICAgICAgIHB1YmxpYyAgICAtLSBkZWNsYXJlcyB0aGUgdmFyaWFibGUgcHVibGljLiBJdCBjYW5ub3QgYmUgZGVjbGFyZWQKKyAgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgb3Igc3RhdGljIGJ5IGluaGVyaXRpbmcuIE5vIGVycm9yIHdpbGwgb2NjdXIsCisgICAgICAgICAgICAgICAgICAgICBvbmx5IHRoZSB0eXBlIHdpbGwgbm90IGJlIG1vZGlmaWVkIGJ5IHRoZSBpbmhlcml0CisgICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuCisgICAgICAgIGRlcHJlY2F0ZWQgLSBXaGVuZXZlciB0aGlzIHZhcmlhYmxlIGlzIHVzZWQsIGEgd2FybmluZyBpcyBpc3N1ZS4KKyAgICAgICAgICAgICAgICAgICAgIFVzdWFsbHkgdGhpcyBpcyBkb25lIGF0IGNvbXBpbGUtdGltZSwgYnV0CisgICAgICAgICAgICAgICAgICAgICBzeW1ib2xfdmFyaWFibGUoKSB3YXJucyBhdCBydW4tdGltZS4KKworICAgICAgICBJdCBpcyBubyBnb29kIHN0eWxlIHRvIGxldCBpbmhlcml0aW5nIG9iamVjdHMgaGF2ZSBhY2Nlc3MgdG8KKyAgICAgICAgaW50ZXJuYWwgdmFyaWFibGVzIHNvIGRlY2xhcmUgdGhlbSBhcyBwcml2YXRlIGFuZCBvZmZlciBmdW5jdGlvbnMKKyAgICAgICAgdG8gcXVlcnkgYW5kIGNoYW5nZSB0aGUgdmFyaWFibGVzIGlmIHBvc3NpYmxlLgorCisgICAgICAgIEl0IGlzIGFsc28gcG9zc2libGUgdG8gcmVkZWNsYXJlIGFsbCB2YXJpYWJsZXMgYW5kL29yIGZ1bmN0aW9ucworICAgICAgICBvZiBhbiBpbmhlcml0ZWQgb2JqZWN0IGZvciB0aGUgb3duIG9iamVjdCBhdCB0aGUgaW5oZXJpdGluZworICAgICAgICBzdGF0ZW1lbnQ6CisKKyAgICAgICAgcHJpdmF0ZSBmdW5jdGlvbnMgbm9zYXZlIHZhcmlhYmxlcyBpbmhlcml0ICJjb21wbGV4L3Jvb20iOworICAgICAgICBwdWJsaWMgdmFyaWFibGVzIGluaGVyaXQgImNvbXBsZXgvcm9vbSI7CisgICAgICAgIHByaXZhdGUgZnVuY3Rpb25zIGluaGVyaXQgImNvbXBsZXgvcm9vbSI7CisKKyAgICAgICAgVG8gcmVkZWNsYXJlIGEgZnVuY3Rpb24gb3IgYSB2YXJpYWJsZSBkZWNsYXJlZCBwdWJsaWMgaW4gdGhlCisgICAgICAgIGluaGVyaXRlZCBvYmplY3QgdG8gYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgaXMgbm90IHBvc3NpYmxlLgorCisgICAgICAgIFRoZXJlIGFsc28gZXhpc3RzIGEgbW9kaWZpZXIgZXhwbGljaXRseSBmb3IgdGhlIGluaGVyaXQgc3RhdGVtZW50OgorCisgICAgICAgIHZpcnR1YWwgICAtLSBpbmhlcml0cyB0aGUgZ2l2ZW4gb2JqZWN0IHZpcnR1YWxseS4gVGhpcyBvbmx5IG1ha2VzCisgICAgICAgICAgICAgICAgICAgICBzZW5zZSBpbiBhIGNvbXBsZXggaW5oZXJpdCB0cmVlLgorICAgICAgICAgICAgICAgICAgICAgSWYgYW4gb2JqZWN0IGlzIGluaGVyaXRlZCBub3JtYWxseSAobm90IHZpcnR1YWxseSkKKyAgICAgICAgICAgICAgICAgICAgIHR3aWNlIHNvbWV3aGVyZSBpbiB0aGUgaW5oZXJpdCB0cmVlIHRoZSBpbnRlcm4KKyAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlcyBleGlzdCB0d2ljZS4gSWYgaW5oZXJpdGVkIHZpcnR1YWxseSB0aGV5CisgICAgICAgICAgICAgICAgICAgICBleGlzdCBvbmx5IG9uY2UuCisgICAgICAgICAgICAgICAgICAgICBFeGFtcGxlOgorICAgICAgICAgICAgICAgICAgICAgQSBpbmhlcml0cyBCIGFuZCBDLgorICAgICAgICAgICAgICAgICAgICAgQiBpbmhlcml0cyBELgorICAgICAgICAgICAgICAgICAgICAgQyBpbmhlcml0cyBELgorICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIGluaGVyaXRhbmNlIG9mIEQgaXMgdmlydHVhbCBpbiBCIGFuZCBDCisgICAgICAgICAgICAgICAgICAgICBEJ3MgdmFyaWFibGVzIGV4aXN0IG9ubHkgb25jZSBpbiBBLiBJZiBBIGNoYW5nZXMKKyAgICAgICAgICAgICAgICAgICAgIEQncyB2YXJpYWJsZXMgdmlhIGZ1bmN0aW9ucyBvZiBCIHRoaXMgYWxzbyBjaGFuZ2VzCisgICAgICAgICAgICAgICAgICAgICB0aGUgdmFyaWFibGVzIG9mIEQgYXMga25vd24gYnkgQy4KKworICAgICAgICAgICAgICAgICAgICAgdmlydHVhbDogICAgICAgICAgICAgICBub24tdmlydHVhbDoKKyAgICAgICAgICAgICAgICAgICAgICAgIEEgICAgICAgICAgICAgICAgICAgICAgICBBCisgICAgICAgICAgICAgICAgICAgICAgIC8gXCAgICAgICAgICAgICAgICAgICAgICAvIFwKKyAgICAgICAgICAgICAgICAgICAgICBCICAgQyAgICAgICAgICAgICAgICAgICAgQiAgIEMKKyAgICAgICAgICAgICAgICAgICAgICAgXCAvICAgICAgICAgICAgICAgICAgICAgfCAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIEQgICAgICAgICAgICAgICAgICAgICAgRCAgIEQKKworCisgICAgICAgIFRvIHNpbXBsaWZ5IHRoZSBhZG9wdGlvbiBvZiBleGlzdGluZyBjb2RlLCBMUEMgYWxsb3dzIHRvIHNwZWNpZnkKKyAgICAgICAgYSBkZWZhdWx0IHZpc2liaWxpdHkgZm9yIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzLCB1c2luZyBhIHN5bnRheAorICAgICAgICBzaW1pbGFyIHRvIHRoZSBpbmhlcml0IHN5bnRheDoKKworICAgICAgICAgIGRlZmF1bHQgcHJpdmF0ZTsKKworICAgICAgICAgICAgQWxsIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zIGFyZSBieSBkZWZhdWx0IHByaXZhdGUuCisKKyAgICAgICAgICBkZWZhdWx0IHByaXZhdGUgdmFyaWFibGVzIHB1YmxpYyBmdW5jdGlvbnM7CisKKyAgICAgICAgICAgIEFsbCB2YXJpYWJsZXMgYXJlIGJ5IGRlZmF1bHQgcHJpdmF0ZSwgYnV0IGZ1bmN0aW9ucyBhcmUgcHVibGljLgorCisgICAgICAgIE9ubHkgdGhlIG1vZGlmaWVycyAncHJpdmF0ZScsICdwdWJsaWMnIGFuZCAncHJvdGVjdGVkJyAoYW5kICdzdGF0aWMnCisgICAgICAgIGZvciBmdW5jdGlvbnMgb25seSkgYXJlIGFsbG93ZWQgaGVyZS4KKworICAgICAgICBUaGUgZGVmYXVsdCB2aXNpYmlsaXR5IHRodXMgc2V0IGFmZmVjdHMgb25seSB2YXJpYWJsZXMvZnVuY3Rpb25zIHdpdGgKKyAgICAgICAgbm8gZXhwbGljaXRlIHZpc2liaWxpdHk6CisKKyAgICAgICAgICBkZWZhdWx0IHByaXZhdGU7CisKKyAgICAgICAgICBpbnQgcHJpdmF0ZV92YXI7CisgICAgICAgICAgcHVibGljIGludCBwdWJsaWNfdmFyOworCisgICAgICAgIFRoZSBkZWZpbml0aW9uIGlzIHZhbGlkIGZyb20gdGhlIHBvaW50IG9mIHRoZSAnZGVmYXVsdCcgc3RhdGVtZW50CisgICAgICAgIHVudGlsIHRoZSBlbmQgb2YgdGhlIGZpbGUsIG9yIHVudGlsIHRoZSBuZXh0ICdkZWZhdWx0JyBzdGF0ZW1lbnQ6CisKKyAgICAgICAgICBkZWZhdWx0IHByaXZhdGU7CisKKyAgICAgICAgICBpbnQgcHJpdmF0ZV92YXI7CisKKyAgICAgICAgICBkZWZhdWx0IHB1YmxpYzsKKworICAgICAgICAgIGludCBwdWJsaWNfdmFyOworCisgICAgICAgIE5vdGUgdGhhdCB0aGlzIGRlZmF1bHQgdmlzaWJpbGl0eSBkb2VzIG5vdCBhZmZlY3QgaW5oZXJpdHMuCisKKworSElTVE9SWQorICAgICAgICBUaGUgbW9kaWZpZXIgJ3N0YXRpYycgZm9yIHZhcmlhYmxlcyB3YXMgcmVuYW1lZCB0byAnbm9zYXZlJworICAgICAgICB3aXRoIExETXVkIDMuMi44LiAnc3RhdGljJyBpcyBzdGlsbCByZWNvZ25pemVkIGFzIGFuIGFsaWFzLgorCisgICAgICAgIFRoZSBkZWZhdWx0IHZpc2liaWxpdHkgd2FzIGFkZGVkIGluIExETXVkIDMuMi45IGFzIGV4cGVyaW1lbnRhbAorICAgICAgICBmZWF0dXJlLgorCitTRUUgQUxTTworICAgICAgICAgICAgY2xvc3VyZXMoTFBDKSwgaW5oZXJpdGFuY2UoTFBDKSwgZnVuY3Rpb25zKExQQyksIHR5cGVzKExQQykKZGlmZiAtLWdpdCBhL2RvYy9MUEMvb3BlcmF0b3JzIGIvZG9jL0xQQy9vcGVyYXRvcnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg0MDZhMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9MUEMvb3BlcmF0b3JzCkBAIC0wLDAgKzEsMjEzIEBACitOQU1FCisgICAgICAgIG9wZXJhdG9ycworCitERVNDUklQVElPTgorCisgICAgICAgIFRoZXNlIGFyZSB0aGUgb3BlcmF0b3JzIGF2YWlsYWlsYWJsZSBpbiBMUEMuIFRoZXkgYXJlIGxpc3RlZAorICAgICAgICBpbiB0aGUgb3JkZXIgb2YgcHJlY2VkZW5jZSAobG93IHByaW9yaXR5IGZpcnN0KToKKworCisgICAgICAgIGV4cHIxICwgZXhwcjIgICAgICAgIEV2YWx1YXRlICdleHByMScgYW5kIHRoZW4gJ2V4cHIyJy4gVGhlCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCB2YWx1ZSBpcyB0aGUgcmVzdWx0IG9mICdleHByMicuIFRoZQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQgdmFsdWUgb2YgJ2V4cHIxJyBpcyB0aHJvd24gYXdheS4KKworICAgICAgICB2YXIgPSBleHByICAgICAgICBFdmFsdWF0ZSAnZXhwcicsIGFuZCBhc3NpZ24gdGhlIHZhbHVlIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAndmFyJy4gVGhlIG5ldyB2YWx1ZSBvZiAndmFyJyBpcyB0aGUgcmVzdWx0LgorCisgICAgICAgIHZhciArPSBleHByICAgICAgICBBc3NpZ24gdGhlIHZhbHVlIG9mICdleHByJyArICd2YXInIHRvICd2YXInLgorICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBtb3N0bHkgZXF1aXZhbGVudCB0byAidmFyID0gdmFyICsgZXhwciIuCisKKyAgICAgICAgdmFyIC09IGV4cHIgICAgICAgIFNpbWlsYXIgdG8gJys9JyBhYm92ZS4KKyAgICAgICAgdmFyICY9IGV4cHIKKyAgICAgICAgdmFyIHw9IGV4cHIKKyAgICAgICAgdmFyIF49IGV4cHIKKyAgICAgICAgdmFyIDw8PSBleHByCisgICAgICAgIHZhciA+Pj0gZXhwcgorICAgICAgICB2YXIgPj4+PSBleHByCisgICAgICAgIHZhciAqPSBleHByCisgICAgICAgIHZhciAlPSBleHByCisgICAgICAgIHZhciAvPSBleHByCisgICAgICAgIHZhciAmJj0gZXhwcgorICAgICAgICB2YXIgfHw9IGV4cHIKKworICAgICAgICBleHByMSA/IGV4cHIyIDogZXhwcjMKKyAgICAgICAgICAgICAgICAgICAgICAgIEV2YWx1YXRlcyAnZXhwcjEnIGFuZCBicmFuY2hlcyBhY2NvcmRpbmcgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgIGl0cyB0cnV0aCB2YWx1ZS4gSWYgaXQgaXMgdHJ1ZSwgdGhlICdleHByMicgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2YWx1YXRlZCBhbmQgcmV0dXJuZWQgYXMgcmVzdWx0LCBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAnZXhwcjMnLgorCisgICAgICAgIGV4cHIxIHx8IGV4cHIyICAgICAgICBUaGUgcmVzdWx0IGlzIHRydWUgaWYgJ2V4cHIxJyBvciAnZXhwcjInIGlzCisgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLiAnZXhwcjInIGlzIG5vdCBldmFsdWF0ZWQgaWYgJ2V4cHIxJyB3YXMKKyAgICAgICAgICAgICAgICAgICAgICAgIHRydWUuCisKKyAgICAgICAgZXhwcjEgJiYgZXhwcjIgICAgICAgIFRoZSByZXN1bHQgaXMgdHJ1ZSBpICdleHByMScgYW5kICdleHByMicgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgIHRydWUuICdleHByMicgaXMgbm90IGV2YWx1YXRlZCBpZiAnZXhwcjEnIHdhcworICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UuCisKKyAgICAgICAgZXhwcjEgfCBleHByMiAgICAgICAgVGhlIHJlc3VsdCBpcyB0aGUgYml0d2lzZSBvciBvZiAnZXhwcjEnIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgJ2V4cHIyJy4KKyAgICAgICAgICAgICAgICAgICAgICAgIEZvciBhcnJheXMsIHRoZSB1bmlvbiBzZXQgaXMgY29tcHV0ZWQ6IGFsbCBlbGVtZW50cworICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSA8ZXhwcjE+IHBsdXMgYWxsIHRob3NlIGZyb20gPGV4cHIyPiB3aGljaAorICAgICAgICAgICAgICAgICAgICAgICAgYXJlIG5vdCBpbiA8ZXhwcjE+LgorCisgICAgICAgIGV4cHIxIF4gZXhwcjIgICAgICAgIFRoZSByZXN1bHQgaXMgdGhlIGJpdHdpc2UgeG9yIG9mICdleHByMScgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAnZXhwcjInLgorICAgICAgICAgICAgICAgICAgICAgICAgRm9yIGFycmF5cywgdGhlIHN5bW1ldHJpYyBkaWZmZXJlbmNlIGlzIGNvbXB1dGVkOgorICAgICAgICAgICAgICAgICAgICAgICAgYWxsIGVsZW1lbnRzIGZyb20gPGV4cHIxPiB3aGljaCBhcmUgbm90IGluIDxleHByMj4sCisgICAgICAgICAgICAgICAgICAgICAgICBwbHVzIGFsbCB0aG9zZSBmcm9tIDxleHByMj4gd2hpY2ggYXJlIG5vdCBpbiA8ZXhwcjE+LgorCisgICAgICAgIGV4cHIxICYgZXhwcjIgICAgICAgIFRoZSByZXN1bHQgaXMgdGhlIGJpdHdpc2UgYW5kIG9mICdleHByMScgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAnZXhwcjInLgorCisgICAgICAgICAgICAgICAgICAgICAgICBGb3IgYXJyYXlzIGFuZCBzdHJpbmdzLCB0aGUgaW50ZXJzZWN0aW9uIHNldAorICAgICAgICAgICAgICAgICAgICAgICAgKGFsbCBlbGVtZW50cyByZXNwLiBjaGFyYWN0ZXJzIGZyb20gZXhwcjEgd2hpY2gKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIGFyZSBhbHNvIGluIHRoZSBleHByMikgaXMgY29tcHV0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiAiYWFiIiAmICJhIiAtPiAiYWEiCisgICAgICAgICAgICAgICAgICAgICAgICAgYnV0ICAoeyAnYScsJ2EnLCdiJyB9KSAmICh7ICdhJyB9KSAtPiAoeyAnYScgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50dWFsbHkgdGhlIGFycmF5IGJlaGF2aW91ciB3aWxsIGJlIGNoYW5nZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvIG1hdGNoIHRoZSBzdHJpbmcgYmVoYXZpb3VyLgorCisgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcnNlY3RpbmcgYW4gYXJyYXkgd2l0aCBhIG1hcHBpbmcgaXMgZXF1aXZhbGVudAorICAgICAgICAgICAgICAgICAgICAgICAgdG8gaW50ZXJzZWN0aW5nIHRoZSBhcnJheSB3aXRoIHRoZSBpbmRpY2VzIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZzogYXJyYXkgJiBtYXBwaW5nID0gYXJyYXkgJiBtX2luZGljZXMobWFwcGluZykKKworICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZ3MgY2FuIGJlIGludGVyc2VjdGVkIHdpdGggYW5vdGhlciBtYXBwaW5nCisgICAgICAgICAgICAgICAgICAgICAgICBvciBhbiBhcnJheS4gVGhlIHJlc3VsdGluZyBtYXBwaW5nIGhvbGRzIGFsbAorICAgICAgICAgICAgICAgICAgICAgICAgdGhvc2UgZW50cmllcyBmcm9tIHRoZSBmaXJzdCBtYXBwaW5nLCB3aGljaCBhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsc28gbWVudGlvbmVkIGluIHRoZSBzZWNvbmQgbWFwcGluZyAoYXMgaW5kZXgpCisgICAgICAgICAgICAgICAgICAgICAgICByZXNwLiBpbiB0aGUgYXJyYXkuCisKKyAgICAgICAgZXhwcjEgPT0gZXhwcjIgICAgICAgIENvbXBhcmUgdmFsdWVzLiBWYWxpZCBmb3Igc3RyaW5ncywgbnVtYmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHMgYW5kIGNsb3N1cmVzLgorCisgICAgICAgIGV4cHIxICE9IGV4cHIxICAgICAgICBDb21wYXJlIHZhbHVlcy4gVmFsaWQgZm9yIHN0cmluZ3MsIG51bWJlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RzIGFuZCBjbG9zdXJlcy4KKworICAgICAgICBleHByMSA+IGV4cHIyICAgICAgICBWYWxpZCBmb3Igc3RyaW5ncyBhbmQgbnVtYmVycy4KKworICAgICAgICBleHByMSA+PSBleHByMiAgICAgICAgVmFsaWQgZm9yIHN0cmluZ3MgYW5kIG51bWJlcnMuCisKKyAgICAgICAgZXhwcjEgPCBleHByMiAgICAgICAgVmFsaWQgZm9yIHN0cmluZ3MgYW5kIG51bWJlcnMuCisKKyAgICAgICAgZXhwcjEgPD0gZXhwcjIgICAgICAgIFZhbGlkIGZvciBzdHJpbmdzIGFuZCBudW1iZXJzLgorCisgICAgICAgIGV4cHIxIDw8IGV4cHIyICAgICAgICBTaGlmdCAnZXhwcjEnIGxlZnQgYnkgJ2V4cHIyJyBiaXRzOyB0aGUgc2lnbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0IGlzIG5vdCBwcmVzZXJ2ZWQuCisKKyAgICAgICAgZXhwcjEgPj4gZXhwcjIgICAgICAgIFNoaWZ0ICdleHByMScgcmlnaHQgYnkgJ2V4cHIyJyBiaXRzLgorICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBzaGlmdCBwcmVzZXJ2ZXMgdGhlIHNpZ24gb2YgJ2V4cHIxJy4KKworICAgICAgICBleHByMSA+Pj4gZXhwcjIgICAgICAgIFNoaWZ0ICdleHByMScgcmlnaHQgYnkgJ2V4cHIyJyBiaXRzLgorICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBzaGlmdCBkb2VzIG5vdCBwcmVzZXJ2ZSB0aGUgc2lnbiBvZiAnZXhwcjEnLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGVhZCBpdCBzaGlmdHMgaW4gMCBiaXRzLgorCisgICAgICAgIGV4cHIxICsgZXhwcjIgICAgICAgIEFkZCAnZXhwcjEnIGFuZCAnZXhwcjInLiBJZiBudW1iZXJzLCB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICBhcml0aG1ldGljIGFkZGl0aW9uIGlzIHVzZWQuIElmIG9uZSBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25zIGFyZSBhIHN0cmluZywgdGhlbiB0aGF0IHN0cmluZyBpcworICAgICAgICAgICAgICAgICAgICAgICAgY29uY2F0ZW5hdGVkIHdpdGggdGhlIG90aGVyIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIGV4cHJlc3Npb25zIGFyZSBhcnJheXMsIHRoZSByZXN1bHQgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByaWdodCBhcnJheSBhcHBlbmRlZCB0byB0aGUgbGVmdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBleHByZXNzaW9ucyBhcmUgbWFwcGluZ3Mgb2YgZXF1YWwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmVzdWx0IGlzIG1lcmdlciBvZiB0aGUgdHdvIG1hcHBpbmdzLiBJZiBvbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleSBleGlzdHMgaW4gYm90aCBtYXBwaW5ncywgdGhlIGVsZW1lbnQgZnJvbSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0IG1hcHBpbmcgYXBwZWFycyBpbiB0aGUgcmVzdWx0LiBJZiB0aGUgdHdvCisgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5ncyBhcmUgb2YgZGlmZmVyZW50IHdpZHRoLCB0aGUgcmVzdWx0IGlzCisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhwcjE+IGlmIG5vbi1lbXB0eSwgYW5kIDxleHByMj4gb3RoZXJ3aXNlLgorCisgICAgICAgIGV4cHIxIC0gZXhwcjIgICAgICAgIFN1YnRyYWN0ICdleHByMicgZnJvbSAnZXhwcjEnLiBWYWxpZCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcnMsIHN0cmluZ3MsIGFycmF5cywgbWFwcGluZ3MuCisgICAgICAgICAgICAgICAgICAgICAgICBGb3IgYXJyYXlzIGFuZCBzdHJpbmdzLCBhbGwgb2NjdXJlbmNlcyBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzIHJlc3AuIGNoYXJhY3RlcnMgaW4gJ2V4cHIyJyBhcmUgcmVtb3ZlZAorICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAnZXhwcjEnLCBhbmQgdGhlIHJlc3VsdCBpcyByZXR1cm5lZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIEZvciBtYXBwaW5nLCBhbGwgb2NjdXJhbmNlcyBvZiBlbGVtZW5zIGluICdleHByMScKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIGhhdmUgYSBtYXRjaGluZyBrZXkgaW4gJ2V4cHIyJyBhcmUgcmVtb3ZlZCwgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmVzdWx0IGlzIHJldHVybmVkLgorCisgICAgICAgIGV4cHIxICogZXhwcjIgICAgICAgIE11bHRpcGx5ICdleHByMScgd2l0aCAnZXhwcjInLgorICAgICAgICAgICAgICAgICAgICAgICAgSWYgc3RyaW5ncyBvciBhcnJheXMgYXJlIG11bHRpcGxpZWQgd2l0aCBhIG51bWJlcgorICAgICAgICAgICAgICAgICAgICAgICAgKHplcm8gb3IgcG9zaXRpdmUpLCB0aGUgcmVzdWx0IGlzIGEgcmVwZXRpdGlvbiBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsIHN0cmluZyBvciBhcnJheS4KKworICAgICAgICBleHByMSAlIGV4cHIyICAgICAgICBUaGUgbW9kdWxvIG9wZXJhdG9yIG9mIG51bWVyaWMgYXJndW1lbnRzLgorCisgICAgICAgIGV4cHIxIC8gZXhwcjIgICAgICAgIEludGVnZXIgZGl2aXNpb24uCisKKyAgICAgICAgKysgdmFyICAgICAgICAgICAgICAgIEluY3JlbWVudCB0aGUgdmFsdWUgb2YgdmFyaWFibGUgJ3ZhcicsIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoZSBuZXcgdmFsdWUuCisKKyAgICAgICAgLS0gdmFyICAgICAgICAgICAgICAgIERlY3JlbWVudCB0aGUgdmFsdWUgb2YgdmFyaWFibGUgJ3ZhcicsIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoZSBuZXcgdmFsdWUuCisKKyAgICAgICAgLSB2YXIgICAgICAgICAgICAgICAgQ29tcHV0ZSB0aGUgbmVnYXRpdmUgdmFsdWUgb2YgJ3ZhcicuCisKKyAgICAgICAgISB2YXIgICAgICAgICAgICAgICAgQ29tcHV0ZSB0aGUgbG9naWNhbCAnbm90JyBvZiBhbiBpbnRlZ2VyLgorCisgICAgICAgIH4gdmFyICAgICAgICAgICAgICAgIFRoZSBib29sZWFuICdub3QnIG9mIGFuIGludGVnZXIuCisKKyAgICAgICAgKCB0eXBlICkgdmFyICAgIFJldHVybiB0aGUgdmFsdWUgb2YgPHZhcj4gY29udmVydGVkIHRvIDx0eXBlPi4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0eXBlPiBjYW4gYmUgJ3N0cmluZycsICdpbnQnLCAnb2JqZWN0JywgJ2Zsb2F0JworICAgICAgICAgICAgICAgICAgICAgICAgb3IgJ2ludConLiA8dmFyPiBtdXN0IGJlIG9mIGEgc3BlY2lmaWMgdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGEgY29udmVyc2lvbiB0byB0YWtlIHBsYWNlOyBpZiA8dmFyPiBpcyAnbWl4ZWQnCisgICAgICAgICAgICAgICAgICAgICAgICBvciB1bmtub3duLCB0aGUgY2FzdCBpcyBwdXJlbHkgZGVjbGFyYXRpdmUuCisgICAgICAgICAgICAgICAgICAgICAgICBBbHNvLCBpZiB0aGUgZGVjbGFyZWQgdHlwZSBvZiA8dmFyPiBpcyB0aGF0IG9mIDx0eXBlPiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB2YWx1ZSBpcyBub3QgY2hhbmdlZC4KKworICAgICAgICAgICAgICAgICAgICAgICAgTkIuIFRoZSBsaXRlcmFsIG51bWJlciAwIGlzIG9mIHVua25vd24gdHlwZSwgYXMKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0IGRvdWJsZXMgYXMgJ25vdCBpbml0aWFsaXplZCcgZm9yIHN0cmluZ3MsIG9iamVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICBhbmQgYXJyYXlzLgorCisgICAgICAgICAgICAgICAgICAgICAgICBUaGUgb3BlcmF0b3IgYWN0cyBsaWtlIHRoZSBlZnVucworICAgICAgICAgICAgICAgICAgICAgICAgdG9fc3RyaW5nKCksIHRvX2ludCgpLCB0b19vYmplY3QoKSwgdG9fZmxvYXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRvX2FycmF5KCkuIEl0IGlzIGFkdmlzYWJsZSB0byB1c2UgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICBlZnVucyBkaXJlY3RseSBpbnN0ZWFkIG9mIHRoZSBjYXN0LgorCisgICAgICAgICh7IHR5cGUgfSkgdmFyICA8dmFyPiBpcyBub3cgYXNzdW1lZCB0byBoYXZlIHRoZSB0eXBlIDx0eXBlPi4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgcHVyZWx5IGRlY2xhcmF0aXZlLCB0aGUgYWN0dWFsIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICBvZiA8dmFyPiBpcyBub3QgY2hhbmdlZC4KKworICAgICAgICB2YXIgKysgICAgICAgICAgICAgICAgSW5jcmVtZW50IHRoZSB2YWx1ZSBvZiB2YXJpYWJsZSAndmFyJywgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhlIG9sZCB2YWx1ZS4KKworICAgICAgICB2YXIgLS0gICAgICAgICAgICAgICAgRGVjcmVtZW50IHRoZSB2YWx1ZSBvZiB2YXJpYWJsZSAndmFyJywgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhlIG9sZCB2YWx1ZS4KKworICAgICAgICBleHByMVtleHByMl0gICAgICAgIFRoZSBhcnJheSBvciBtYXBwaW5nIGdpdmVuIGJ5ICdleHByMScgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ZWQgYnkgJ2V4cHIyJy4KKworICAgICAgICBleHByMVtleHByMi4uZXhwcjNdIEV4dHJhY3RzIGEKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpZWNlIGZyb20gYW4gYXJyYXkgb3Igc3RyaW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgZXhwcjIgb3IgZXhwcjMgbWF5IGJlIG9taXR0ZWQsIGRlZmF1bHQgaXMgdGhlIGJlZ2luCisgICAgICAgICAgICAgICAgICAgICAgICBvciBlbmQgb2YgZXhwcjEuCisgICAgICAgICAgICAgICAgICAgICAgICBOZWdhdGl2ZSBudW1iZXJzIGZvciBleHByMiBvciBleHByMworICAgICAgICAgICAgICAgICAgICAgICAgbWVhbiBgYGNvdW50IGZyb20gYmVmb3JlIHRoZSBiZWdpbm5pbmcnJywgaS5lLgorICAgICAgICAgICAgICAgICAgICAgICAgZm9vWy0yLi4tMV0gaXMgYW4gZW1wdHkgYXJyYXkgb3Igc3RyaW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgZm9vWzwyLi48MV0gZ2l2ZXMgdGhlIDJuZCBhbmQgbGFzdCBlbGVtZW50IG9mCisgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYXJyYXkgcmVzcC4gY2hhcnMgb2YgdGhlIHN0cmluZy4KKworICAgICAgICBleHByMS0+bmFtZSguLi4pIFRoZSBzeW1ib2xpYyBmb3JtIG9mIGNhbGxfb3RoZXIoKS4gJ2V4cHIxJworICAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZXMgZWl0aGVyIGFuIG9iamVjdCBvciBhIHN0cmluZyB3aGljaCBpcworICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBhcyB0aGUgZmlsZV9uYW1lIG9mIGFuIG9iamVjdCwgYW5kIGNhbGxzCisgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZnVuY3Rpb24gJ25hbWUnIGluIHRoaXMgb2JqZWN0LgorCisgICAgICAgIGlkZW50OjpuYW1lKC4uLikKKyAgICAgICAgICAgICAgICAgICAgICAgIENhbGwgdGhlIGluaGVyaXRlZCBmdW5jdGlvbiAnbmFtZScgd2l0aCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGdpdmVuIHBhcmFtZXRlcnMgaW4gdGhlIHBhcmVudCAnaWRlbnQnLgorICAgICAgICAgICAgICAgICAgICAgICAgJ2lkZW50JyBtYXkgYmUgZ2l2ZW4gYXMgc3RyaW5nIGNvbnRhaW5pbmcgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICBmdWxsIHBhdGhuYW1lLCBvciBhcyBpZGVudGlmaWVyIGNvbnRhaW5pbmcgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICBwdXJlIGJhc2VuYW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgSWYgJ2lkZW50JyBpcyBvbWl0dGVkLCB0aGUgbGFzdCBpbmhlcml0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG9mIHRoaXMgJ25hbWUnIGlzIGNhbGxlZC4KKworICAgICAgICAoeyB9KSAgICAgICAgICAgICAgICBBcnJheSBjb25zdHJ1Y3Rvci4KKyAgICAgICAgKFsgXSkgICAgICAgICAgICAgICAgTWFwcGluZyBjb25zdHJ1Y3Rvci4KKworTk9URQorICAgICAgICBUaGUgY2xvc3VyZSBvcGVyYXRvcnMgYXJlIG5vdCBkZXNjcmliZWQgaGVyZS4KKworSElTVE9SWQorICAgICAgICBMRE11ZCAzLjIuOSBhZGRlZCAnPj4+JywgJz4+Pj0nLCAnJiY9JyBhbmQgJ3x8PScuCisgICAgICAgIExETXVkIDMuMi4xMCBleHRlbmRlZCAnJicgdG8gbWFwcGluZ3MuCisgICAgICAgIExETXVkIDMuMyBleHRlbmRlZCAnfCcgYW5kICdeJyB0byBhcnJheXMuCisKK1NFRSBBTFNPCisgICAgICAgIGFycmF5cyhMUEMpLCBhbGlzdHMoTFBDKSwgbWFwcGluZ3MoTFBDKSwgY2xvc3VyZXMoTFBDKQpkaWZmIC0tZ2l0IGEvZG9jL0xQQy9wcmFnbWEgYi9kb2MvTFBDL3ByYWdtYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjZmMzI2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL0xQQy9wcmFnbWEKQEAgLTAsMCArMSwxMTYgQEAKK05BTUUKKyAgICAgICAgcHJhZ21hCisKK0RFU0NSSVBUSU9OCisgICAgICAgIFRoZSBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlICNwcmFnbWEgY2FuIGJlIHVzZWQgdG8gc2VsZWN0CisgICAgICAgIHNldmVyYWwgY29tcGlsYXRpb24gb3B0aW9ucy4gTXVsdGlwbGUgb3B0aW9ucyBjYW4gYmUgc2VsZWN0ZWQKKyAgICAgICAgaW4gb25lICNwcmFnbWEgZGlyZWN0aXZlIGJ5IHNlcGFyYXRpbmcgdGhlbSB3aXRoIGNvbW1hcy4KKworICAgICAgICBub19jbG9uZTogVGhlIGJsdWVwcmludCBvYmplY3QgY2FuJ3QgYmUgY2xvbmVkLgorICAgICAgICBub19pbmhlcml0OiBUaGUgcHJvZ3JhbSBjYW4ndCBiZSBpbmhlcml0ZWQuCisgICAgICAgIG5vX3NoYWRvdzogVGhlIHByb2dyYW0gY2FuJ3QgYmUgc2hhZG93ZWQgKHNpbWlsYXIgdG8gZGVjbGFyaW5nCisgICAgICAgICAgICAgICAgYWxsIGZ1bmN0aW9ucyBhcyAnbm9tYXNrJykuCisKKyAgICAgICAgaW5pdF92YXJpYWJsZXM6IENsb25lIHZhcmlhYmxlcyBhcmUgaW5pdGlhbGl6ZWQgYnkgX19JTklUKCkuCisgICAgICAgIHNoYXJlX3ZhcmlhYmxlczogQ2xvbmUgdmFyaWFibGVzIGFyZSBpbml0aWFsaXplZCBmcm9tIHRoZQorICAgICAgICAgICAgICAgIGJsdWVwcmludC4KKworICAgICAgICB3ZWFrX3R5cGVzOiBubyB0eXBlIGNoZWNraW5nICh0aGlzIGlzIHRoZSBkZWZhdWx0KS4KKyAgICAgICAgc3RyaWN0X3R5cGVzOiBhbGwgZnVuY3Rpb25zIG11c3QgYmUgZGVjbGFyZWQgd2l0aCBhcmd1bWVudAorICAgICAgICAgICAgICAgIHByb3RvdHlwZXMsIGFuZCB0aGUgcmV0dXJuIHZhbHVlcyBvZiBjYWxsX290aGVyKCkgbXVzdAorICAgICAgICAgICAgICAgIGJlIGNhc3RlZC4KKyAgICAgICAgc3Ryb25nX3R5cGVzOiBhbGwgZnVuY3Rpb25zIG11c3QgYmUgZGVjbGFyZWQgd2l0aCBjb21wbGV0ZQorICAgICAgICAgICAgICAgIHR5cGVzIG9mIHJldHVybiB2YWx1ZSBhbmQgcGFyYW1ldGVycy4KKyAgICAgICAgc2F2ZV90eXBlczogdGhlIGRlY2xhcmF0aW9uIGRhdGEgaXMga2VwdCBhZnRlciBjb21waWxhdGlvbiBhbmQKKyAgICAgICAgICAgICAgICBjaGVja2VkIGF0IHJ1bnRpbWUuIFRoaXMgaXMgaW1wb3J0YW50IGZvciB0eXBlLXNhZmUKKyAgICAgICAgICAgICAgICBpbmhlcml0YW5jZS4KKworICAgICAgICBydHRfY2hlY2tzOiBydW50aW1lIGNoZWNrcyBkdXJpbmcgZXhlY3V0aW9uIG9mIHRoaXMgcHJvZ3JhbSB3aWxsIGJlCisgICAgICAgICAgICAgICAgZW5hYmxlZC4gVGhlIGludGVycHJldGVyIHdpbGwgY2hlY2sgZm9yIGNvcnJlY3QgZGF0YXR5cGVzIG9mCisgICAgICAgICAgICAgICAgYXJndW1lbnRzIG9uIGZ1bmN0aW9uIGNhbGxzLiAoTGF0ZXIgaXQgd2lsbCBpbmNsdWRlIGNoZWNrcworICAgICAgICAgICAgICAgIHVwb24gYXNzaWdubWVudHMuKQorICAgICAgICAgICAgICAgIERvbid0IGNvbmZ1c2UgdGhpcyB3aXRoIHN0cm9uZy9zdHJpY3RfdHlwZXMsIHRoZXkgb25seQorICAgICAgICAgICAgICAgIGNoZWNrIGF0IGNvbXBpbGUgdGltZS4KKyAgICAgICAgICAgICAgICBzdHJvbmdfdHlwZXMvc3RyaWN0X3R5cGVzIGlzIHNlcmlvdXNseSByZWNvbW1lbmRlZC4KKyAgICAgICAgICAgICAgICBUaGlzIHByYWdtYSBpbXBsaWNpdGx5IGVuYWJsZXMgc2F2ZV90eXBlcyBhcyB3ZWxsLgorICAgICAgICBub19ydHRfY2hlY2tzOiBkaXNhYmxlIHJ1bnRpbWUgdHlwZSBjaGVja3MgZm9yIHRoaXMgcHJvZ3JhbSAoZGVmYXVsdCkuCisKKyAgICAgICAgcGVkYW50aWM6IENlcnRhaW4gd2FybmluZ3MgYXJlIHRyZWF0ZWQgYXMgZXJyb3JzOgorICAgICAgICAgICAgICAgIC0gZmFpbHVyZSB0byBwYXNzIGVub3VnaCBhcmd1bWVudHMgdG8gc2ltdWwgZWZ1bnMKKyAgICAgICAgc2xvcHB5OiBUdXJucyBvZmYgcGVkYW50aWMgKHRoZSBkZWZhdWx0KS4KKworICAgICAgICByYW5nZV9jaGVjazogVXNlIG9mIHF1ZXN0aW9uYWJsZSByYW5nZXMgKHJhbmdlcyBvZiBuZWdhdGl2ZSBzaXplcywKKyAgICAgICAgICAgICAgICBvciB3aXRoIGJvdW5kcyBiZXlvbmQgdGhlIGFycmF5J3Mgc2l6ZSkgY2F1c2UgYSBydW50aW1lCisgICAgICAgICAgICAgICAgd2FybmluZy4KKyAgICAgICAgbm9fcmFuZ2VfY2hlY2s6IFR1cm5zIG9mZiByYW5nZV9jaGVjayAodGhlIGRlZmF1bHQpLgorCisgICAgICAgIHdhcm5fZGVwcmVjYXRlZDogVXNlIG9mIGRlcHJlY2F0ZWQgZWZ1bnMgb3IgaW5kZXhpbmcgb3BlcmF0aW9ucworICAgICAgICAgICAgICAgIGNhdXNlcyB0aGUgY29tcGlsZXIgdG8gaXNzdWUgYSB3YXJuaW5nICh0aGUgZGVmYXVsdCkuCisgICAgICAgIG5vX3dhcm5fZGVwcmVjYXRlZDogVHVybnMgb2ZmIHdhcm5fZGVwcmVjYXRlZC4KKworICAgICAgICB3YXJuX2VtcHR5X2Nhc3RzOiBBIGNhc3Qgb2YgYSB2YWx1ZSB0byBpdHMgb3duIHR5cGUgZ2VuZXJhdGVzCisgICAgICAgICAgICAgICAgYSB3YXJuaW5nICh0aGUgZGVmYXVsdCkuIEV4Y2VwdGlvbiBhcmUgY2FzdHMgdG8gdHlwZQorICAgICAgICAgICAgICAgICdtaXhlZCcuCisgICAgICAgIG5vX3dhcm5fZW1wdHlfY2FzdHM6IFR1cm5zIG9mZiB3YXJuX2VtcHR5X2Nhc3RzLgorCisgICAgICAgIHdhcm5fbWlzc2luZ19yZXR1cm46IFdhcm4gaWYgYSB2YWx1ZS1yZXR1cm5pbmcgZnVuY3Rpb24gaXMgbWlzc2luZworICAgICAgICAgICAgICAgIGEgcmV0dXJuIHN0YXRlbWVudCAodGhlIGRlZmF1bHQpLiBJZiBwb3NzaWJsZSwgdGhlIGRyaXZlcgorICAgICAgICAgICAgICAgIHdpbGwgdHJ5IHRvIGRldGVjdCB0aGlzIGF0IGNvbXBpbGUgdGltZTsgb3RoZXJ3aXNlIGEgcnVudGltZQorICAgICAgICAgICAgICAgIHdhcm5pbmcgd2lsbCBiZSBnZW5lcmF0ZWQgd2hlbiB0aGUgZnVuY3Rpb24gaXMgZXhlY3V0ZWQuCisgICAgICAgICAgICAgICAgVGhlIGNoZWNrIGFwcGxpZXMgb25seSB0byBmdW5jdGlvbnMgd2l0aCBhIGRlY2xhcmVkIHJldHVybgorICAgICAgICAgICAgICAgIHR5cGUgb3RoZXIgdGhhbiAndm9pZCcuCisgICAgICAgIG5vX3dhcm5fbWlzc2luZ19yZXR1cm46IFR1cm4gb2ZmIHdhcm5fbWlzc2luZ19yZXR1cm4uCisKKyAgICAgICAgd2Fybl9mdW5jdGlvbl9pbmNvbnNpc3RlbnQ6IElmIGFuIGluaGVyaXRlZCBmdW5jdGlvbiBpcworICAgICAgICAgICAgICAgIG92ZXJsb2FkZWQgd2l0aCBpbmNvbnNpc3RlbnQgcmV0dXJuIHR5cGVzIG9yIGFyZ3VtZW50cywKKyAgICAgICAgICAgICAgICBhIHdhcm5pbmcgaXMgZ2VuZXJhdGVkOyBvciBpZiBwcmFnbWFfcGVkYW50aWMgaXMgaW4gZWZmZWN0LAorICAgICAgICAgICAgICAgIGFuIGVycm9yLiBCeSBkZWZhdWx0IHRoaXMgaXMgYWN0aXZlLgorICAgICAgICBub193YXJuX2Z1bmN0aW9uX2luY29uc2lzdGVudDogQW4gaW5oZXJpdGVkIGZ1bmN0aW9uIGNhbgorICAgICAgICAgICAgICAgIGJlIG92ZXJsb2FkZWQgd2l0aCBpbmNvbnNpc3RlbnQgcmV0dXJuIHR5cGVzIG9yIGFyZ3VtZW50cywKKyAgICAgICAgICAgICAgICBhcyBsb25nIGFzIHByYWdtYV9wZWRhbnRpYyBpcyBub3QgaW4gZWZmZWN0LgorCisgICAgICAgICAgICAgICAgVGhpcyBwcmFnbWEgaXMgbWVhbnQgdG8gZWFzZW4gdGhlIGFkYXB0aW9uIG9mIGxlZ2FjeQorICAgICAgICAgICAgICAgIG11ZGxpYiBjb2RlIC0gaW4gZ2VuZXJhbCBvbmUgc2hvdWxkIGZpeCB0aGUgd2FybmluZ3MsCisgICAgICAgICAgICAgICAgbm90IHR1cm4gdGhlbSBvZmYuCisKKyAgICAgICAgV2hlbiBhbiBvYmplY3QgaXMgY29tcGlsZWQgd2l0aCB0eXBlIHRlc3RpbmcgKCNwcmFnbWEKKyAgICAgICAgc3RyaWN0X3R5cGVzKSwgYWxsIHR5cGVzIGFyZSBzYXZlZCBvZiB0aGUgYXJndW1lbnRzIGZvciB0aGF0CisgICAgICAgIGZ1bmN0aW9uIGR1cmluZyBjb21waWxhdGlvbi4gIElmIHRoZSAjcHJhZ21hIHNhdmVfdHlwZXMgaXMKKyAgICAgICAgc3BlY2lmaWVkLCB0aGVuIHRoZSB0eXBlcyBhcmUgc2F2ZWQgZXZlbiBhZnRlciBjb21waWxhdGlvbiwgdG8KKyAgICAgICAgYmUgdXNlZCB3aGVuIHRoZSBvYmplY3QgaXMgaW5oZXJpdGVkLgorCisgICAgICAgIFRoZSBmb2xsb3dpbmcgdHdvIHByYWdtYXMgYXJlIGF2YWlsYWJsZSBpZiB0aGUgZHJpdmVyIHdhcworICAgICAgICBjb21waWxlZCB3aXRoIERFQlVHIGFuZCBUUkFDRV9DT0RFIG9wdGlvbnM6CisKKyAgICAgICAgc2V0X2NvZGVfd2luZG93OiBTZXRzIGFuIG9mZnNldCB0byB0aGUgY3VycmVudCBwcm9ncmFtIHdyaXRpbmcKKyAgICAgICAgICAgICAgICBwb3NpdGlvbi4gVXNlIHRoaXMgQkVGT1JFIGEgcGllY2Ugb2YgY29kZSB3aGVyZSB5b3UKKyAgICAgICAgICAgICAgICB3YW50IHRvIGNoZWNrIHRvIHdoYXQgYnl0ZWNvZGVzIGl0IGlzIGNvbXBpbGVkLgorICAgICAgICBzaG93X2NvZGVfd2luZG93OiBzaG93cyBzb21lIGJ5dGVzIHN0YXJ0aW5nIGF0IG9yIG5lYXIgdGhlCisgICAgICAgICAgICAgICAgbGFzdCBwb2ludCBzZXRfY29kZV93aW5kb3cgd2FzIGNhbGxlZC4KKworRVhBTVBMRVMKKyAgICAgICAgI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyAgICAgICAgI3ByYWdtYSBub19jbG9uZSwgbm9faW5oZXJpdAorCitISVNUT1JZCisgICAgICAgIExETXVkIDMuMi43IGFkZGVkIGxvY2FsX3Njb3Blcywgbm9fbG9jYWxfc2NvcGVzLCBub19jbG9uZQorICAgICAgICBhbmQgbm9faW5oZXJpdC4KKyAgICAgICAgTERNdWQgMy4yLjggYWRkZWQgd2Vha190eXBlcywgcGVkYW50aWMgYW5kIHNsb3BweS4KKyAgICAgICAgTERNdWQgMy4yLjkgYWxsb3dlZCB0byBzcGVjaWZ5IG11bHRpcGxlIHByYWdtYXMgaW4gb25lIGRpcmVjdGl2ZS4KKyAgICAgICAgTERNdWQgMy4yLjkgYWRkZWQgKG5vXyl3YXJuX2RlcHJlY2F0ZWQuCisgICAgICAgIExETXVkIDMuMi4xMCBhZGRlZCAobm9fKXdhcm5fZW1wdHlfY2FzdHMuCisgICAgICAgIFN0YXJ0aW5nIHdpdGggTERNdWQgMy4yLjEwLCAjcHJhZ21hIHh4eF90eXBlcyBpbiBhbiBpbmNsdWRlZCBmaWxlIGFyZQorICAgICAgICAgIG5vIGxvbmdlciB2YWxpZCBvbmx5IHVudGlsIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGJ1dCByZW1haW4gYWN0aXZlCisgICAgICAgICAgd2hlbiBwcm9jZXNzaW5nIHJldHVybnMgdG8gdGhlIGluY2x1ZGluZyBmaWxlLgorICAgICAgICBMRE11ZCAzLjIuMTEgYWRkZWQgKG5vXyl3YXJuX2Z1bmN0aW9uX2luY29uc2lzdGVudC4KKyAgICAgICAgTERNdWQgMy4zLjM3OCBhZGRlZCBpbml0X3ZhcmlhYmxlcywgc2hhcmVfdmFyaWFibGVzLgorICAgICAgICBMRE11ZCAzLjMuMzU3IGFkZGVkIChub18pd2Fybl9taXNzaW5nX3JldHVybi4KKyAgICAgICAgTERNdWQgMy4zLjY0NiBhZGRlZCAobm9fKXJhbmdlX2NoZWNrLgorICAgICAgICBMRE11ZCAzLjUuMCByZW1vdmVkIGNvbWJpbmVfc3RyaW5ncyBhbmQgbm9fY29tYmluZV9zdHJpbmdzLgorICAgICAgICBMRE11ZCAzLjUuMCByZW1vdmVkIGxvY2FsX3Njb3BlcyBhbmQgbm9fbG9jYWxfc2NvcGVzLgorICAgICAgICBMRE11ZCAzLjUuMCByZW1vdmVkIHZlcmJvc2VfZXJyb3JzIChtYWtpbmcgaXRzIGJlaGF2aW91ciBtYW5kYXRvcnkpLgorICAgICAgICBMRE11ZCAzLjUuMCBlbmFibGVkIHdhcm5fZGVwcmVjYXRlZCBieSBkZWZhdWx0LgorCitTRUUgQUxTTworICAgICAgICBpbmhlcml0YW5jZShMUEMpLCBpbml0aWFsaXNhdGlvbihMUEMpLCBvYmplY3RzKEMpLAorICAgICAgICBvcGVyYXRvcnMoTFBDKQpkaWZmIC0tZ2l0IGEvZG9jL0xQQy9wcmVwcm9jZXNzb3IgYi9kb2MvTFBDL3ByZXByb2Nlc3NvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTU5M2YwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL0xQQy9wcmVwcm9jZXNzb3IKQEAgLTAsMCArMSwyMyBAQAorTkFNRQorICAgICAgICBwcmVwcm9jZXNzb3IKKworREVTQ1JJUFRJT04KKyAgICAgICAgVGhlIExQQyBkcml2ZXIgdW5kZXJzdGFuZHMgdGhlIGZvbGxvd2luZyBwcmVwcm9jZXNzb3IKKyAgICAgICAgZGlyZWN0aXZlczoKKworICAgICAgICAjaW5jbHVkZSwgI2RlZmluZSwgI2lmLCAjaWZkZWYsICNpZm5kZWYsICNlbHNlLCAjZWxpZiwKKyAgICAgICAgI2VuZGlmLCAjdW5kZWYKKyAgICAgICAgICAgICAgICBzYW1lIGFzIGluIEFOU0kgQworCisgICAgICAgICNsaW5lIDxudW0+CisgICAgICAgICAgICAgICAgbGluZSBudW1iZXJzIHN0YXJ0IGF0IDxudW0+IHdpdGggdGhlIG5leHQgbGluZQorCisgICAgICAgICNlY2hvCisgICAgICAgICAgICAgICAgdGhlIHJlc3Qgb2YgdGhlIGxpbmUgaXMgcHJpbnRlZCB0byB0aGUgZXJyb3Igb3V0cHV0CisgICAgICAgICAgICAgICAgKHN0ZGVyciksIHRodXMgY2FuIGJlIGNhcHR1cmVkIGludG8gYSBsb2cgZmlsZQorCisgICAgICAgICNwcmFnbWEKKyAgICAgICAgICAgICAgICBzZWUgdGhlIHNlcGFyYXRlIG1hbiBwYWdlCisKK1NFRSBBTFNPCisgICAgICAgIHByYWdtYShMUEMpLCBwcmVkZWZpbmVkKEQpCmRpZmYgLS1naXQgYS9kb2MvTFBDL3JlZmVyZW5jZXMgYi9kb2MvTFBDL3JlZmVyZW5jZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFkNjBmMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9MUEMvcmVmZXJlbmNlcwpAQCAtMCwwICsxLDQ5IEBACitDT05DRVBUCisgICAgICAgIHJlZmVyZW5jZXMKKworREVTQ1JJUFRJT04KKyAgICAgICAgQ2FsbCBieSByZWZlcmVuY2UgY2FuIGJlIHVzZWQgdG8gaGF2ZSBhIGZ1bmN0aW9uIHRoYXQgcGFzc2VzCisgICAgICAgIG1vcmUgdGhhbiBvbmUgdmFsdWUgdG8gdGhlIGNhbGxlciwgd2l0aG91dCB1c2luZyBhcnJheXMgdGhhdAorICAgICAgICBoYXZlIHRvIGJlIHVucGFja2VkIHRoZXJlaW5hZnRlci4KKyAgICAgICAgVGhlcmUgaXMgbm90aGluZyBzcGVjaWFsIHRvIGRlY2xhcmUgaW4gdGhlIGNhbGxpbmcgZnVuY3Rpb24sCisgICAgICAgIHlvdSBzaW1wbHkgZG8gYW4gYXNzaWdubWVudCB0byBhIHBhcmFtZXRlciBvZiB0aGUgZnVuY3Rpb24uCisgICAgICAgIFRoZSBjYWxsZXIgaGFzIHRvIHBhc3MgcmVmZXJlbmNlcyBleHBsaWNpdGVseTsgdGhpcyBpcyBkb25lIGJ5CisgICAgICAgIHByZWZpeGluZyBhbiBsdmFsdWUgd2l0aCAnJicgLgorICAgICAgICBUbyBwYXNzIGEgcmVmZXJlbmNlIHRvIGFuIGVsZW1lbnQgb2YgYW4gYXJyYXksIHlvdSBoYXZlIHRvCisgICAgICAgIGVuY2xvc2UgdGhlIGluZGV4ZWQgbHZhbHVlIGluIHJvdW5kIGJyYWNrZXRzLgorCitFWEFNUExFCisKKyAgICAgICAgdm9pZCBhc3NpZ24obWl4ZWQgZGVzdGluYXRpb24sIG1peGVkIHNvdXJjZSkgeworICAgICAgICAgICAgZGVzdGluYXRpb24gPSBzb3VyY2U7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGV4dHJhY3RfbnVtYmVyKGludCBkZXN0aW5hdGlvbiwgc3RyaW5nIHNvdXJjZSkgeworICAgICAgICAgICAgc3NjYW5mKHNvdXJjZSwgIiVkIiwgZGVzdGluYXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB0ZXN0KCkgeworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBmbG9hdCBmOworICAgICAgICAgICAgbWl4ZWQgKmE7CisKKyAgICAgICAgICAgIGV4dHJhY3RfbnVtYmVyKCZpLCAiNDIgcGFsYW50aXJzIik7CisgICAgICAgICAgICBhc3NpZ24oJmYsIDMuMTQxNTkyNjUzNTg5NzkzKTsKKyAgICAgICAgICAgIGFzc2lnbigmYSwgKHsgaSwgZiB9KSk7CisgICAgICAgICAgICBhc3NpZ24oJihhWzwwLi48MV0pLCAoezEsMiwzLCJzaW5rIiwieCIsInkiLCJ4In0pKTsKKyAgICAgICAgICAgIGFzc2lnbigmKGFbNV1bMF0pLCAndycpOworICAgICAgICAgICAgYXNzaWduKCYoYVs1XVs8MV0pLCAnZycpOworICAgICAgICAgICAgcHJpbnRmKCIlTyIsIGEpKTsKKyAgICAgICAgfQorCisgICAgICAgICh7IC8qIHNpemVvZigpID09IDkgKi8KKyAgICAgICAgICA0MiwKKyAgICAgICAgICAzLjE0MTU5LAorICAgICAgICAgIDEsCisgICAgICAgICAgMiwKKyAgICAgICAgICAzLAorICAgICAgICAgICJ3aW5nIiwKKyAgICAgICAgICAieCIsCisgICAgICAgICAgInkiLAorICAgICAgICAgICJ4IgorICAgICAgICB9KQpkaWZmIC0tZ2l0IGEvZG9jL0xQQy9zdHJpbmdzIGIvZG9jL0xQQy9zdHJpbmdzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ODIwZWYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvTFBDL3N0cmluZ3MKQEAgLTAsMCArMSw2NSBAQAorTkFNRQorICAgICAgICBzdHJpbmdzCisKK0RFU0NSSVBUSU9OCisgICAgICAgIEEgc3RyaW5nIGlzIGEgZGF0YSB0eXBlIGluIExQQy4KKworICAgICAgICBJdCBjb25zaXN0cyBvZiBzZXZlcmFsIEFTQ0lJIGNoYXJhY3RlcnMgKGxldHRlcnMpLCBudW1iZXJzCisgICAgICAgIGFuZCBzcGVjaWFsIGNoYXJhY3RlcnMuIEFTQ0lJIGNoYXJhY3RlcnMgbWF5IGNvbnRhaW4gb2YKKyAgICAgICAgdmFsdWVzIGJldHdlZW4gLTEyOCBhbmQgMTI3IChlLmcuICdBJyAoNjUpIG9yICc1JyAoNTMpKSwgYnV0CisgICAgICAgIDAgaXMgbm90IGFsbG93ZWQgKGJlY2F1c2Ugc3RyaW5ncyBhcmUgJ251bGwgdGVybWluYXRlZCcsCisgICAgICAgIHdoaWNoIG1lYW5zIHRoYXQgbWFya3MgdGhlIGVuZCBvZiBhIHN0cmluZykuCisKKyAgICAgICAgTm90YXRpb25zIGZvciBzdHJpbmdzOgorICAgICAgICAiYWJjIiArICJkZWYiICJnaGkiICsgNSArICJqa2wiICsgdG9fc3RyaW5nKCAoeydtJywnbid9KSApCisgICAgICAgID09ICJhYmNkZWZnaGk1amtsbW4iCisKKyAgICAgICAgU3BlY2lhbCBjaGFyYWN0ZXJzIG11c3QgYmUgZXNjYXBlZCB3aXRoIGEgbGVhZGluZyAnXCc6CisgICAgICAgICAgXG4gICAobmV3IGxpbmUpCisgICAgICAgICAgXHQgICAodGFidWxhdG9yKQorICAgICAgICAgIFxiICAgKGJhY2tzcGFjZSkKKyAgICAgICAgICAuLi4KKworICAgICAgICBUaGUgc2luZ2xlIGNoYXJhY3RlcnMgY2FuIGJlIGFjY2Vzc2VkIGxpa2UgYW4gYXJyYXk6CisgICAgICAgICAgc3RyaW5nIHM7CisgICAgICAgICAgaW50IGksajsKKworICAgICAgICAgIHM9InRlc3QiOworCisgICAgICAgICAgc1swXSAgICAgICAoQVNDSUkgQ29kZSAodmFsdWUpIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIpICAgICA9J3QnCisgICAgICAgICAgc1s8MV0gICAgICAobGFzdCBjaGFyYWN0ZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9J3QnCisgICAgICAgICAgc1swLi4wXSAgICAoc3RyaW5nIGNvbXBvc2VkIG9mIHRoZSBmaXJzdCBjaGFyKSAgICAgICAgICAgICA9InQiCisgICAgICAgICAgc1sxLi48Ml0gICAoc3RyaW5nIGZyb20gc2Vjb25kIHRvIGNoYXJhY3RlciBiZWZvcmUgbGFzdCkgICA9ImVzIgorICAgICAgICAgIHNbMi4uXSAgICAgKHN0cmluZyBmcm9tIHRoaXJkIHRvIGxhc3QgY2hhcmFjdGVyKSAgICAgICAgICAgPSJzdCIKKyAgICAgICAgICAuLi4KKworICAgICAgICBTdHJpbmcgbWFuaXB1bGF0aW9uczoKKyAgICAgICAgICBzWzBdPXNbMF0tMzIgICAgKCJ0ZXN0IiAtPiAiVGVzdCIpCisgICAgICAgICAgc1sxLi48Ml09Im8iICAgICgidGVzdCIgLT4gInRvdCIpCisgICAgICAgICAgLi4uCisKK0ZVTkNUSU9OUworICAgICAgICBpbnQgc3RybGVuKHN0cmluZyBzdHIpCisgICAgICAgIGludCBtZW1iZXIoc3RyaW5nIHMsIGludCBlbGVtKQorICAgICAgICBpbnQgc3Ryc3RyIChzdHJpbmcgc3RyLCBzdHJpbmcgc3RyMiwgaW50IHBvcykKKyAgICAgICAgaW50IHRvX2ludChzdHJpbmcpCisgICAgICAgIG1peGVkICp0b19hcnJheShzdHJpbmcpCisgICAgICAgIHN0cmluZyB0b19zdHJpbmcobWl4ZWQpCisgICAgICAgIHN0cmluZyB1cHBlcnN0cmluZyhzdHJpbmcgc3RyKQorICAgICAgICBzdHJpbmcgbG93ZXJzdHJpbmcoc3RyaW5nIHN0cikKKyAgICAgICAgc3RyaW5nIGxvd2VyX2Nhc2Uoc3RyaW5nIHN0cikKKyAgICAgICAgc3RyaW5nIGNhcGl0YWxpemUoc3RyaW5nIHN0cikKKyAgICAgICAgc3RyaW5nIGJyZWFrX3N0cmluZyhzdHJpbmcgc3RyLCBpbnQgd2lkdGgsIGludCBzcGFjZSwgaW50IGxlYXZlX2xmcykKKyAgICAgICAgc3RyaW5nIHNwcmludGYoc3RyaW5nIGZtdCwgLi4uKQorICAgICAgICBpbnQgc3NjYW5mKHN0cmluZyBzdHIsIHN0cmluZyBmbXQsIG1peGVkIHZhcjEsIG1peGVkIHZhcjIsIC4uLikKKyAgICAgICAgc3RyaW5nICpuZXdfZXhwbG9kZShzdHJpbmcgc3RyLCBzdHJpbmcgZGVsKQorICAgICAgICBzdHJpbmcgKmV4cGxvZGUoc3RyaW5nIHN0ciwgc3RyaW5nIGRlbCk7CisgICAgICAgIHN0cmluZyBpbXBsb2RlKG1peGVkICphcnIsIHN0cmluZyBkZWwpCisgICAgICAgIHN0cmluZyAqcmVnZXhwbG9kZSAoc3RyaW5nIHRleHQsIHN0cmluZyBwYXR0ZXJuKQorICAgICAgICBzdHJpbmcgKnJlZ2V4cChzdHJpbmcgKmxpc3QsIHN0cmluZyBwYXR0ZXJuKQorCitTRUUgQUxTTworICAgICAgICBhcnJheXMsIGludGVnZXJzLCBtYXBwaW5ncywgb3BlcmF0b3JzLCB0eXBlcworCitMQVNUIENIQU5HRUQKKyAgICAgICAgMTIuIE1hciAyMDA0IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvTFBDL3N0cnVjdHMgYi9kb2MvTFBDL3N0cnVjdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE3YjBhNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9MUEMvc3RydWN0cwpAQCAtMCwwICsxLDIyNyBAQAorQ09OQ0VQVAorICAgICAgICBzdHJ1Y3RzCisKK0lOVFJPRFVDVElPTgorICAgICAgICBzdHJ1Y3RzIGFyZSwgbmV4dCB0byBhcnJheXMgYW5kIG1hcHBpbmdzLCBhIHdheSB0byBncm91cCBhCisgICAgICAgIGNvbGxlY3Rpb24gb2YgdmFsdWUgdG9nZXRoZXIuCisKKyAgICAgICAgQSBzdHJ1Y3QgaG9sZHMgYSBmaXhlZCBudW1iZXIgb2YgdmFsdWVzLCBjYWxsZWQgJ21lbWJlcnMnLCBhbmQKKyAgICAgICAgYWxsb3dzIHRvIGFjY2VzcyB0aGVtIGJ5IHRoZWlyIGdpdmVuIG5hbWUuIFRoZSBuYW1lIGlzIHJlc29sdmVkCisgICAgICAgIHdoZW4gdGhlIExQQyBjb2RlIGlzIGNvbXBpbGVkLCBtYWtpbmcgc3RydWN0IG1lbWJlciBhY2Nlc3MgYXMgZmFzdAorICAgICAgICBhcyBhcnJheSBtZW1iZXIgYWNjZXNzLgorCisgICAgICAgIHN0cnVjdHMgYXJlIHBhc3NlZCBieSByZWZlcmVuY2UuCisKKworREVGSU5JVElPTgorICAgICAgICBBIG5ldyBzdHJ1Y3QgdHlwZSBoYXMgdG8gYmUgZGVmaW5lZCBhdCB0aGUgdG9wIGxldmVsIG9mIGFuCisgICAgICAgIG9iamVjdC4gRm9yIGV4YW1wbGUKKworICAgICAgICAgICAgc3RydWN0IEZvbyB7CisgICAgICAgICAgICAgIGludCAgICAgICAgb25lLCAqdHdvOworICAgICAgICAgICAgICBzdHJ1Y3QgQmFyIHRocmVlOworICAgICAgICAgICAgfTsKKworICAgICAgICBkZWZpbmVzIHRoZSBuZXcgc3RydWN0ICdGb28nIHdpdGggdGhyZWUgbWVtYmVyczogaW50ZWdlciAnb25lJywKKyAgICAgICAgaW50ZWdlciBhcnJheSAndHdvJywgYW5kIHN0cnVjdCBCYXIgJ3RocmVlJworCisgICAgICAgIEl0IGlzIHBvc3NpYmxlIHRvICdpbmhlcml0JyBzdHJ1Y3RzIGZyb20gZWFjaCBvdGhlci4gR2l2ZW4gYWJvdmUKKyAgICAgICAgZGVmaW5pdGlvbiBvZiBzdHJ1Y3QgRm9vLCB0aGUgZm9sbG93aW5nIGRlZmluaXRpb24KKworICAgICAgICAgICAgc3RydWN0IFF1dXggKEZvbykgeworICAgICAgICAgICAgICBpbnQgZm91cjsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgaXMgZXF1aXZhbGVudCB0byB0aGUgZGVmaW5pdGlvbgorCisgICAgICAgICAgICBzdHJ1Y3QgUXV1eCB7CisgICAgICAgICAgICAgIGludCAgICAgICAgb25lLCAqdHdvOworICAgICAgICAgICAgICBzdHJ1Y3QgQmFyIHRocmVlOworICAgICAgICAgICAgICBpbnQgZm91cjsKKyAgICAgICAgICAgIH07CisKKworICAgICAgICBUaGUgdXN1YWwgdmlzaWJpbGl0eSBtb2RpZmllcnMgYXBwbHksIGUuZy4KKworICAgICAgICAgICAgcHJvdGVjdGVkIHN0cnVjdCBCYW5nIHsuLi59OworCisKKyAgICAgICAgc3RydWN0IGRlZmluaXRpb25zIGFyZSBwcm9tb3RlZCB0aHJvdWdoIGluaGVyaXRhbmNlIGxpa2UgZnVuY3Rpb25zLAorICAgICAgICB3aXRoIHRoZSBkaWZmZXJlbmNlIHRoYXQgYWxsIHN0cnVjdHMgbGl2ZSBpbiB0aGUgc2FtZSBmbGF0IG5hbWVzcGFjZS4KKyAgICAgICAgVGhpcyBtZWFuczogYSBzdHJ1Y3QgZGVmaW5lZCBpbiBhIHByb2dyYW0gaXMgdmlzaWJsZSBpbiBfYWxsXworICAgICAgICBpbmhlcml0ZWQgcHJvZ3JhbXMsIHJlZ2FyZGxlc3Mgb2YgaG93IGRlZXAgdGhlIGluaGVyaXRhbmNlIGlzCisgICAgICAgIG5lc3RlZC4gIFRoaXMgYWxzbyBtZWFucyB0aGF0IGluIG9uZSBwcm9ncmFtIHRoZXJlIG11c3Qgbm90IGJlCisgICAgICAgIHR3byBzdHJ1Y3RzLCBpbmhlcml0ZWQgb3Igbm90LCB3aXRoIHRoZSBzYW1lIG5hbWUuCisKKworICAgICAgICBUbyBkZWNsYXJlIGEgc3RydWN0IHdpdGhvdXQgZGVmaW5pbmcgaXQsIHdyaXRlOgorCisgICAgICAgICAgICBzdHJ1Y3QgUXV1eDsKKworICAgICAgICBUaGlzIG5vdGF0aW9uIGlzIHVzZWZ1bCBpZiB5b3UgaGF2ZSB0d28gc3RydWN0cyByZWZlcmVuY2luZworICAgICAgICBlYWNoIG90aGVyOgorCisgICAgICAgICAgICBzdHJ1Y3QgUXV1eDsKKworICAgICAgICAgICAgc3RydWN0IEJhciB7CisgICAgICAgICAgICAgIHN0cnVjdCBRdXV4IHF1dXg7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgc3RydWN0IFF1dXggeworICAgICAgICAgICAgICBzdHJ1Y3QgQmFyIGJhcjsKKyAgICAgICAgICAgIH07CisKKworVVNBR0UKKyAgICAgICAgVG8gdXNlIGEgc3RydWN0LCBpdHMgZGVmaW5pdGlvbiBtdXN0IGJlIHZpc2libGUgLSBlaXRoZXIgYmVjYXVzZSBpdAorICAgICAgICBpcyBkZWZpbmVkIGluIHRoZSBvYmplY3QgY29tcGlsZWQsIG9yIGl0IGhhcyBiZWVuIGluaGVyaXRlZC4KKyAgICAgICAgKE5vdGU6ICNpbmNsdWRlJ2luZyBzdHJ1Y3RzIGRvZXMgbm90IHdoYXQgeW91IHRoaW5rIGl0IGRvZXM6IGluCisgICAgICAgIExQQyBpdCBjb25zdHJ1Y3RzIGEgbmV3IHN0cnVjdCB0eXBlIHdoZXJlZXZlciBpdCBpcyBpbmNsdWRlZCkuCisKKworICAgICAgICBBIHZhcmlhYmxlIHRvIGhvbGQgYSBzdHJ1Y3QgaXMgZGVmaW5lZCBsaWtlIHRoaXM6CisKKyAgICAgICAgICAgIHN0cnVjdCBGb28gdmFyOworCisgICAgICAgIGFuZCBzaW1pbGFyIGZvciBmdW5jdGlvbiBhcmd1bWVudHM6CisKKyAgICAgICAgICAgIHZvaWQgZnVuIChzdHJ1Y3QgRm9vIGFyZykKKworCisgICAgICAgIEp1c3Qgd3JpdGluZyAnc3RydWN0IEZvbyB2YXInIGhvd2V2ZXIgZG9lcyBub3QgX2NyZWF0ZV8gYSBzdHJ1Y3QsCisgICAgICAgIGl0IGp1c3QgY3JlYXRlcyBhIHZhcmlhYmxlIGNhcGFibGUgb2YgaG9sZGluZyBvbmUuIFRvIGFzc2lnbiBhIHZhbHVlCisgICAgICAgIHRvIHRoZSB2YXJpYWJsZSB1cG9uIGNyZWF0aW9uLCBhc3NpZ24gaXQgd2l0aCBhIHN0cnVjdCB2YWx1ZSwgZWl0aGVyCisgICAgICAgIGZyb20gYW5vdGhlciB2YXJpYWJsZSBvciBmcm9tIGEgbGl0ZXJhbCBzdHJ1Y3Q6CisKKyAgICAgICAgICAgIHN0cnVjdCBGb28gdmFyID0gKDxGb28+KTsKKworCisgICAgICAgIExpdGVyYWwgc3RydWN0cyBhcmUgd3JpdHRlbiB1c2luZyAoPD4pIGFzIGRlbGltaXRlcnM6CisKKyAgICAgICAgICAgICg8Rm9vPikKKyAgICAgICAgICAgICAgICBjcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHN0cnVjdCBGb28KKworICAgICAgICAgICAgKDxGb28+IDEsICh7IDIgfSksIGJhcikKKyAgICAgICAgICAgICAgICBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIHN0cnVjdCBGb28sIGFuZCBhc3NpZ25zIDEgdG8gbWVtYmVyCisgICAgICAgICAgICAgICAgJ29uZScsICh7IDIgfSkgdG8gbWVtYmVyICd0d28nLCBhbmQgdGhlIGNvbnRlbnQgb2YgdmFyaWFibGUKKyAgICAgICAgICAgICAgICBiYXIgdG8gbWVtYmVyICd0aHJlZScuCisKKyAgICAgICAgICAgICg8Rm9vPiB0d286ICh7IDIgfSkgKQorICAgICAgICAgICAgICAgY3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBzdHJ1Y3QgRm9vIHdoaWNoIGlzIGFsbCBlbXB0eSBleGNlcHQKKyAgICAgICAgICAgICAgIGZvciBtZW1iZXIgJ3R3bycgd2hpY2ggaXMgYXNzaWduZWQgdGhlIHZhbHVlICh7IDIgfSkuCisKKyAgICAgICAgSXQgaXMgbm90IHBvc3NpYmxlIHRvIHVzZSBib3RoIG5hbWVkIGFuZCB1bm5hbWVkIGluaXRpYWxpemVycworICAgICAgICBpbiB0aGUgc2FtZSBsaXRlcmFsLgorCisKKyAgICAgICAgQSBzdHJ1Y3QgbWVtYmVyIGlzIGFjY2Vzc2VkIHVzaW5nIHRoZSAtPiBvcGVyYXRvcjoKKworICAgICAgICAgICAgc3RydWN0IEZvbyB2YXIgPSAuLi47CisKKyAgICAgICAgICAgIHZhci0+b25lID0gMTsKKworCisgICAgICAgIEl0IGlzIHBvc3NpYmxlIHRvIGNvbXB1dGUgc3RydWN0IGxvb2t1cHMgYXQgcnVudGltZToKKworICAgICAgICAgICAgc3RydWN0IEZvbyBiYXIgPSAuLi47CisgICAgICAgICAgICBzdHJpbmcgbWVtYmVyID0gIm9uZSI7CisKKyAgICAgICAgICAgIGJhci0+KG1lbWJlcikgPSAxOyAvLyBzZXRzIGJhci0+b25lIHRvIDEKKyAgICAgICAgICAgIGJhci0+KDApID0gMTsgICAgICAvLyBzZXRzIGJhci0+b25lIHRvIDEKKworCisgICAgICAgIFdoZW4gdXNpbmcgc3RydWN0IHZhbHVlcyBoZWxkIGluIHZhcmlhYmxlcy9leHByZXNzaW9ucyBvZiB0eXBlCisgICAgICAgICdtaXhlZCcsIHRoZSAnbWl4ZWQnIHZhbHVlIHNob3VsZCB0byBiZSBjYXN0ZWQgdG8gdGhlIHN0cnVjdAorICAgICAgICB2YWx1ZS4gVGhlIGNhc3QgY2FuIGJlIG9taXR0ZWQgaWYgdGhlIGxvb2tlZC11cCBtZW1iZXIgZXhpc3RzCisgICAgICAgIGluIG9ubHkgb25lIHN0cnVjdCAoYW5kIGl0cyBjaGlsZHJlbikga25vd24gdG8gdGhlIGNvbXBpbGVyOgorCisgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsgaW50IG9uZTsgfTsKKyAgICAgICAgICAgIHN0cnVjdCBCYXIgeyBpbnQgdHdvOyB9OworICAgICAgICAgICAgc3RydWN0IEJheiB7IGludCB0d287IH07CisgICAgICAgICAgICBtaXhlZCB2YXI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhci0+b25lICAvLyBsb29rcyB1cCBGb28tPm9uZQorICAgICAgICAgICAgKHN0cnVjdCBGb28pdmFyLT5vbmUgIC8vIGxvb2tzIHVwIEZvby0+b25lCisgICAgICAgICAgICAgICAgICAgICAgICB2YXItPnR3byAgLy8gRVJST1I6IGFtYmlndW91cyBsb29rdXAKKyAgICAgICAgICAgIChzdHJ1Y3QgQmFyKXZhci0+b25lICAvLyBsb29rcyB1cCBCYXItPm9uZQorCisKK1VTQUdFIElOIENMT1NVUkVTCisgICAgICAgIFRoZSAjJyg8IG9wZXJhdG9yIGNhbiBiZSB1c2VkIGluIGxhbWJkYSBjbG9zdXJlcyB0byBjcmVhdGUgYQorICAgICAgICBzdHJ1Y3Q7IHRoZSB0eXBlIG9mIHRoZSBzdHJ1Y3QgaXMgZ2l2ZW4gYnkgdGhlICd0ZW1wbGF0ZScKKyAgICAgICAgc3RydWN0IHBhc3NlZCBhcyBmaXJzdCBhcmd1bWVudC4gVGhlIGNvbnRlbnQgb2YgdGhlIHRlbXBsYXRlCisgICAgICAgIHN0cnVjdCBpcyBpcnJlbGV2YW50LCBzbyBhbiBlbXB0eSBzdHJ1Y3Qgc3VmZmljZXMuIEZvcgorICAgICAgICBleGFtcGxlLCB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2Ygc3RydWN0IEZvbzoKKyAgICAgICAgCisgICAgICAgICAgICAoeyAjJyg8LCAoPEZvbz4pLCAxLCAoeyAyIH0pLCAoPEJhcj4pIH0pCisKKyAgICAgICAgVGhlIG9yZGVyIG9mIHRoZSBtZW1iZXIgdmFsdWVzIGlzIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5CisgICAgICAgIGFwcGVhciBpbiB0aGUgc3RydWN0IGRlZmluaXRpb24uCisKKyAgICAgICAgVG8gYWNjZXNzIGEgc3RydWN0IG1lbWJlciBpbiBhIGxhbWJkYSBjbG9zdXJlLCB1c2UgdGhlICMnLT4KKyAgICAgICAgb3BlcmF0b3Igd2l0aCB0aGUgbmFtZSBvZiB0aGUgbWVtYmVyIGFzIGRvdWJsZS1xdW90ZWQgc3ltYm9sCisgICAgICAgIG9yIGxpdGVyYWwgc3RyaW5nOgorCisgICAgICAgICAgICAoeyAjJy0+LCBzdHJ1Y3QtZXhwcmVzc2lvbiwgJydvbmUgfSkKKyAgICAgICAgICAgICh7ICMnLT4sIHN0cnVjdC1leHByZXNzaW9uLCAib25lIiB9KQorCisKK01JU0NFTExBTkVPVVMKKyAgICAgICAgSW50ZXJuYWxseSBzdHJ1Y3RzIGNhbiBiZSBpZGVudGlmaWVkIGJ5IHRoZSBJRCBzdHJpbmcKKyAgICAgICAgcmV0dXJuZWQgZnJvbSBnZXRfdHlwZV9pbmZvKCkuIFRoaXMgc3RyaW5nIGNvbnRhaW5zIHRoZSBuYW1lCisgICAgICAgIG9mIHRoZSBzdHJ1Y3QsIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIGl0cyB0eXBlIHdhcyBkZWZpbmVkIGluLAorICAgICAgICBhbmQgdGhlIElEIG51bWJlciBvZiB0aGUgcHJvZ3JhbS4gSG93ZXZlciwgZG8gbm90IHJlbHkgb24KKyAgICAgICAgYSBwYXJ0aWN1bGFyIGZvcm1hdCBvZiB0aGlzIHN0cmluZyEKKworICAgICAgICBTdXBwb3J0IGZvciBzdHJ1Y3RzIGlzIHNpZ25hbGVkIGJ5IHRoZSBtYWNybyBfX0xQQ19TVFJVQ1RTX18uCisKKyAgICAgICAgU2luY2Ugc3RydWN0cyBhcmUgdGllZCB0byB0aGUgcHJvZ3JhbSB0aGV5IGFyZSBkZWZpbmVkIGluLAorICAgICAgICByZS1jb21waWxpbmcgYSBwcm9ncmFtIGNyZWF0ZXMgbmV3IHN0cnVjdCB0eXBlcyB3aGljaCBhcmUKKyAgICAgICAgaW4gcHJpbmNpcGxlIGluY29tcGF0aWJsZSB0byB0aGUgb2xkIG9uZXMuIEhvd2V2ZXIsIHRoZSBMUEMKKyAgICAgICAgY29tcGlsZXIgY2hlY2tzIGlmIHRoZSBuZXdseSBjb21waWxlZCBzdHJ1Y3RzIGhhdmUgdGhlIHNhbWUKKyAgICAgICAgc3RydWN0dXJlIGFzIHRoZWlyIG9sZGVyIGNvdW50ZXJwYXJ0cyBvZiB0aGUgc2FtZSBuYW1lCisgICAgICAgIChhbmQgZGVmaW5pbmcgcHJvZ3JhbSkuIElmIHRoZSBzdHJ1Y3R1cmVzIGNvbmZvcm0sIHRoZSBleGlzdGluZworICAgICAgICBvbGRlciBzdHJ1Y3QgdHlwZXMgYXJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgbmV3IG9uZXMuIFRoaXMgd2F5CisgICAgICAgIGFuIGFjY2lkZW50YWwgb2YgZm9yIGV4YW1wbGUgL3N0ZC90eXBlcy5jIGRvZXNuJ3QgYnJlYWsKKyAgICAgICAgdGhlIHdob2xlIG11ZC4KKworCitFWEFNUExFUworICAgICAgICBTdXBwb3NlIHdlIGhhdmUgdHdvIG9iamVjdHM6IGEgbW9uc3RlciwgYW5kIGEgbW9uc3RlcgorICAgICAgICBjb29yZGluYXRlIHRyYWNrZXIsIGFuZCB3ZSB3YW50IHRvIHVzZSBhIHN0cnVjdCB0byBzdG9yZSB0aGUKKyAgICAgICAgY29vcmRpbmF0ZToKKworICAgICAgICAgIC0tIG1vbnN0ZXJfY29vcmRpbmF0ZS5jIC0tCisgICAgICAgICAgICBzdHJ1Y3QgQ29vcmRpbmF0ZSB7IGludCB4OyBpbnQgeTsgfTsKKworICAgICAgICAgIC0tIG1vbnN0ZXJfdHJhY2tlci5jIC0tCisgICAgICAgICAgICBpbmhlcml0ICJtb25zdGVyX2Nvb3JkaW5hdGUiOworCisgICAgICAgICAgICB2b2lkIHRyYWNrIChzdHJ1Y3QgQ29vcmRpbmF0ZSBjb29yZCkgeyAuLi4gfQorCisgICAgICAgICAgLS0gbW9uc3Rlci5jIC0tCisgICAgICAgICAgICBpbmhlcml0ICJtb25zdGVyX2Nvb3JkaW5hdGUiOworCisgICAgICAgICAgICBpbnQgbW92ZSAoLi4pIHsKKyAgICAgICAgICAgICAgLi4uCisgICAgICAgICAgICAgICJtb25zdGVyX3RyYWNrZXIiLT50cmFjayggKDxDb29yZGluYXRlPiBteV94LCBteV95KSApOworICAgICAgICAgICAgfQorCisgICAgICAgIE5vdGUgdGhhdCB1c2luZyAnI2luY2x1ZGUgIm1vbnN0ZXJfY29vcmRpbmF0ZS5jIicgaW5zdGVhZCBvZiBpbmhlcml0CisgICAgICAgIHdvbid0IHdvcmsuIFdoaWxlIHRoZSBvYmplY3RzIHdvdWxkIGNvbXBpbGUsIHRoZSBmaXJzdCBjYWxsIHRvCisgICAgICAgIHRyYWNrKCkgd291bGQgY2F1c2UgYSBydW50aW1lIGVycm9yIG9mIHRoZSB0eXBlIAorCisgICAgICAgICAgSWxsZWdhbCB0eXBlIHRvIHN0cnVjdC0+KCk6IHN0cnVjdCBDb29yZGluYXRlICgvbW9uc3Rlci5jICMyMzQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCBzdHJ1Y3QgQ29vcmRpbmF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoL21vbnN0ZXJfdHJhY2tlci5jICM1NTIpCisKKworSElTVE9SWQorICAgICAgICBzdHJ1Y3RzIHdlcmUgZnVsbHkgaW1wbGVtZW50ZWQgZmlyc3QgaW4gTERNdWQgMy4zLjI0Ni4KKyAgICAgICAgVGhlIGltcGxlbWVudGF0aW9uIHdhcyByZXZpc2VkIGluIExETXVkIDMuMy4zNDQuCisgICAgICAgIFRoZSByZWFjdGl2YXRpb24gb2YgdW5jaGFuZ2VkIHN0cnVjdHMgaW4gb2JqZWN0IHVwZGF0ZXMgd2FzCisgICAgICAgIGltcGxlbWVudGVkIGluIExETXVkIDMuMy40MTcuCisKKworU0VFIEFMU08KKyAgICAgICAgbWFwcGluZ3MoTFBDKSwgZ2V0X3R5cGVfaW5mbyhFKSwgc3RydWN0cChFKSwgdG9fbWFwcGluZyhFKSwKKyAgICAgICAgdG9fc3RydWN0KEUpLCBzdHJ1Y3RfaW5mbyhFKSwgYmFzZW9mKEUpCmRpZmYgLS1naXQgYS9kb2MvTFBDL3N3aXRjaCBiL2RvYy9MUEMvc3dpdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliY2E1OTYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvTFBDL3N3aXRjaApAQCAtMCwwICsxLDkzIEBACitOQU1FCisgICAgICAgIHN3aXRjaAorCitTWU5UQVgKKyAgICAgICAgc3dpdGNoIChleHByKSBibG9jaworCitERVNDUklQVElPTgorICAgICAgICBCcmFuY2ggdG8gdGhlIGNhc2UgbGFiZWwgaW4gc3RhdGVtZW50IHRoYXQgbWF0Y2hlcyBleHByLgorICAgICAgICBJZiBubyBtYXRjaGluZyBjYXNlIGxhYmVsIGlzIGZvdW5kIChieSB2YWx1ZSBvciBieSB0eXBlKSwKKyAgICAgICAgYnJhbmNoIHRvIHRoZSBkZWZhdWx0IGxhYmVsIGluIHN0YXRlbWVudC4KKworICAgICAgICBBIGNhc2UgbGFiZWwgaGFzIHRoZSBmb3JtCisKKyAgICAgICAgICAgICAgICBjYXNlIGV4cHJfbiA6CisKKyAgICAgICAgd2hlcmUgZXhwcl9uIG11c3QgYmUgY29uc3RhbnQsIG9yIHRoZSBmb3JtCisKKyAgICAgICAgICAgICAgICBjYXNlIGV4cHJfbjEgLi4gZXhwcl9uMiA6CisKKyAgICAgICAgd2hlcmUgZXhwcl9uMSBhbmQgZXhwcl9uMiBtdXN0IGJlIG51bWVyaWMgY29uc3RhbnRzIGFuZAorICAgICAgICBleHByX24xIDwgZXhwcl9uMi4KKworICAgICAgICBFaXRoZXIgYWxsIGNhc2UgbGFiZWxzIGhhdmUgdG8gYmUgc3RyaW5ncyBvciBhbGwgaGF2ZSB0byBiZQorICAgICAgICBudW1lcmljLiBPbmx5IDAgaXMgc3BlY2lhbDogaXQgaXMgYWxsb3dlZCBpbiBhIHN3aXRjaAorICAgICAgICBzdGF0ZW1lbnQgd2hlcmUgYWxsIG90aGVyIGxhYmVscyBhcmUgc3RyaW5ncy4KKworICAgICAgICBBIGRlZmF1bHQgbGFiZWwgaGFzIHRoZSBmb3JtCisKKyAgICAgICAgICAgICAgICBkZWZhdWx0IDoKKworICAgICAgICBUaGUgZGVmYXVsdCBsYWJlbCBkZWZhdWx0cyB0byB0aGUgZW5kIG9mIHN0YXRlbWVudCBpZiBub3QKKyAgICAgICAgZ2l2ZW4gZXhwbGljaXRseS4KKworICAgICAgICBXaGVuZXZlciBhICdicmVhaycgc3RhdGVtZW50IGlzIGV4ZWN1dGVkIGluc2lkZSAnc3RhdGVtZW50JyBhCisgICAgICAgIGJyYW5jaCB0byB0aGUgZW5kIG9mIHRoZSBzd2l0Y2ggc3RhdGVtZW50IGlzIHBlcmZvcm1lZC4KKworRVhBTVBMRQorICAgICAgICBUeXBpY2FsIHVzYWdlOgorCisgICAgICAgICAgICBzd2l0Y2gocmFuZG9tKDEwMCkpIHsKKyAgICAgICAgICAgICAgY2FzZSAwIC4uIDIyIDogd3JpdGUoIk5vdGhpbmcgaGFwcGVucyIpOyBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSAyMyAuLiAyNyA6CisgICAgICAgICAgICAgICAgd3JpdGUoIllvdSBhcmUgc3Vycm91bmRlZCBieSBhIGdvbGRlbiBnbG93Iik7CisgICAgICAgICAgICAgICAgdGhpc19wbGF5ZXIoKS0+aGVhbF9zZWxmKHJhbmRvbSgzKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMjggLi4gMzIgOgorICAgICAgICAgICAgICAgIHdyaXRlKCJUaGUgd2F0ZXIgd2FzIHBvaXNvbmVkIVxuIik7CisgICAgICAgICAgICAgICAgdGhpc19wbGF5ZXIoKS0+YWRkX2V4cCh0aGlzX3BsYXllcigpLT5oaXRfcGxheWVyKHJhbmRvbSg0KSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIDMzIDogd3JpdGUoIllvdSBoZWFyIGEgdm9pY2Ugd2hpc3BlcmluZzogIityYW5kb21faGludCgpKTsKKyAgICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgICAgICAgICAgIGNhc2UgMzQgOgorICAgICAgICAgICAgICAgIHdyaXRlKCJXaGlsZSB5b3UgZGlkbid0IHBheSBhdHRlbnRpb24sIGEgd2F0ZXIgZGVtb24gIgorICAgICAgICAgICAgICAgICAgICAgICJzbmF0Y2hlcyBhIGNvaW4gb3V0IG9mIHlvdXIgcHVyc2UhXG4iKTsKKyAgICAgICAgICAgICAgICB0aGlzX3BsYXllcigpLT5hZGRfbW9uZXkoLTEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBkZWZhdWx0IDogd3JpdGUgIllvdSBoZWFyIHNvbWUgc3RyYW5nZSBub2lzZXNcbiI7IGJyZWFrOworICAgICAgICAgICAgICBjYXNlIDQyIDogcmV0dXJuOworICAgICAgICAgICAgICBjYXNlIDk5IDogd3JpdGUoIkl0IHRhc3RlcyBnb29kLlxuIjsKKyAgICAgICAgICAgIH0KKworTk9URQorICAgICAgICBJbiBDLCB0aGUgZ3JhbW1hciBmb3Igc3dpdGNoKCkgaXMKKworICAgICAgICAgICAgc3dpdGNoIChleHByKSBzdGF0ZW1lbnQKKworICAgICAgICBhbGxvd2luZyBjb25zdHJ1Y3RzIGxpa2UKKworICAgICAgICAgICAgc3dpdGNoIChleHByKQorICAgICAgICAgICAgICB3aGlsZSAoZXhwcjIpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY2FzZSAxOiAuLi4KKyAgICAgICAgICAgICAgY2FzZSAyOiAuLi4KKyAgICAgICAgICAgICAgfQorCisgICAgICAgIEluIExQQyBhIHN3aXRjaCBoYXMgdG8gYmUgZm9sbG93ZWQgYnkgYSBibG9jayB0aGF0IGNvbnRhaW5zIHRoZQorICAgICAgICBjYXNlIGxhYmVscyBkaXJlY3RseS4gSW4gY29udHJhc3QgdG8gQyB0aGUgZ3JvdXAgb2Ygc3RhdGVtZW50cworICAgICAgICBmb2xsb3dpbmcgYSBjYXNlIGxhYmVsIGhhdmUgdGhlaXIgb3duIGxleGljYWwgc2NvcGUgc28gdGhhdAorICAgICAgICB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgbWF5IG5vdCBjcm9zcyBjYXNlIGxhYmVscy4KKworSElTVE9SWQorICAgICAgICBMRE11ZCAzLjIuMTAgY29uc3RyYWluZWQgdGhlIGdyYW1tYXIgdG8gcmVxdWlyZSBhIGJsb2NrIGZvciB0aGUKKyAgICAgICAgICBzd2l0Y2goKSBib2R5LCBub3QganVzdCBhIHN0YXRlbWVudC4gVGhpcyBkaWZmZXJzIGZyb20gdGhlIEMKKyAgICAgICAgICBzeW50YXgsIGJ1dCB3YXMgbmVjZXNzYXJ5IGFzIHRoZSBjb21waWxlciBkaWRuJ3QgaGFuZGxlCisgICAgICAgICAgdGhlIHN0YXRlbWVudCBjYXNlIGNvcnJlY3RseS4KKyAgICAgICAgTERNdWQgMy4zIGFsbG93ZWQgdG8gcGFzcyB2YWx1ZXMgb2YgdGhlIHdyb25nIHR5cGUgdG8gc3dpdGNoKCksIHRoZQorICAgICAgICAgIGRyaXZlciB3b3VsZCBpbiB0aGF0IGNhc2UgdXNlIHRoZSBkZWZhdWx0IGNhc2UuIEJlZm9yZSwgdmFsdWVzIG9mCisgICAgICAgICAgdGhlIHdyb25nIHR5cGUgY2F1c2VkIGEgcnVudGltZSBlcnJvci4KKyAgICAgICAgTERNdWQgMy4zLjcxOCBkaXNhbGxvd2VkIGNhc2UgbGFiZWxzIGluIGlubmVyIGJsb2NrcyBhbmQgdmFyaWFibGUKKyAgICAgICAgICBkZWNsYXJhdGlvbnMgdGhhdCBjcm9zcyBjYXNlIGxhYmVscy4KKworU0VFIEFMU08KKyAgICAgICAgZm9yKExQQyksIGZvcmVhY2goTFBDKSwgZG8td2hpbGUoTFBDKSwgaWYoTFBDKSwgd2hpbGUoTFBDKQpkaWZmIC0tZ2l0IGEvZG9jL0xQQy90eXBlcyBiL2RvYy9MUEMvdHlwZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAzYTFiZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9MUEMvdHlwZXMKQEAgLTAsMCArMSwxMzYgQEAKK0NPTkNFUFQKKyAgICB0eXBlcworCitERVNDUklQVElPTgorCisgICAgVmFyaWFibGVzIGNhbiBoYXZlIHRoZSBmb2xsb3dpbmcgdHlwZXM6CisKKyAgICBvIGludCAgICAgICBBbiBpbnRlZ2VyLiBOb3JtYWxseSBmdWxsIDMyIGJpdHMgc2lnbmVkLCB5aWVsZGluZyBhCisgICAgICAgICAgICAgICAgcmFuZ2Ugb2YgYXQgbGVhc3QgLTIsMTQ3LDQ4Myw2NDggdG8gMiwxNDcsNDgzLDY0Ny4gVGhlCisgICAgICAgICAgICAgICAgZXhhY3QgYXZhaWxhYmxlIHJhbmdlIGlzIGdpdmVuIGJ5IHRoZSBwcmVkZWZpbmVkCisgICAgICAgICAgICAgICAgbWFjcm9zIF9fSU5UX01JTl9fIGFuZCBfX0lOVF9NQVhfXy4KKworICAgICAgICAgICAgICAgIEludGVnZXIgdmFsdWVzIGNhbiBiZSBzcGVjaWZpZWQgaW4gZGVjaW1hbCwgaW4KKyAgICAgICAgICAgICAgICBzZWRlY2ltYWwgd2hlbiBwcmVjZWVkZWQgYnkgJzB4JyAoZS5nLiAweDExKSwgYmluYXJ5CisgICAgICAgICAgICAgICAgd2hlbiBwcmVjZWVkZWQgYnkgJzBiJyAoZS5nLiAwYjAwMDEwMDAxKSwgb2N0YWwgd2hlbgorICAgICAgICAgICAgICAgIHByZWNlZWRlZCBieSAnMG8nIChlLmcuIDBvMjEpIGFuZCBhcyBjaGFyYWN0ZXIKKyAgICAgICAgICAgICAgICB5aWVsZGluZyB0aGUgY2hhcnNldCB2YWx1ZSBmb3IgdGhlIGNoYXJhY3RlciBhcyB0aGUgbnVtYmVyCisgICAgICAgICAgICAgICAgdG8gdXNlIChlLmcuICcwJyB5aWVsZHMgNDggb24gQVNDSUkgbWFjaGluZXMpLgorCisgICAgICAgICAgICAgICAgQ2hhcmFjdGVyIHZhbHVlcyBhcmUgZW5jbG9zZWQgaW4gc2luZ2xlLXF1b3RlcyAoJyksCisgICAgICAgICAgICAgICAgd2l0aCB0aGUgc2VxdWVuY2UgJycnIHJldHVybmluZyB0aGUgc2luZ2xlLXF1b3RlCisgICAgICAgICAgICAgICAgaXRzZWxmLiBJbnN0ZWFkIG9mIHRoZSBsaXRlcmFsIGNoYXJhY3RlciBhbgorICAgICAgICAgICAgICAgIGVzY2FwZS1zZXF1ZW5jZSBjYW4gYmUgd3JpdHRlbiBiZXR3ZWVuIHRoZQorICAgICAgICAgICAgICAgIHNpbmdsZS1xdW90ZXM6CisgICAgICAgICAgICAgICAgICBcTiAgIDogdGhlIGNoYXJhY3RlciBjb2RlIE4gaW4gZGVjaW1hbAorICAgICAgICAgICAgICAgICAgXDB4TiA6IHRoZSBjaGFyYWN0ZXIgY29kZSBOIGluIHNlZGVjaW1hbAorICAgICAgICAgICAgICAgICAgXHhOICA6IHRoZSBjaGFyYWN0ZXIgY29kZSBOIGluIHNlZGVjaW1hbAorICAgICAgICAgICAgICAgICAgXDBvTiA6IHRoZSBjaGFyYWN0ZXIgY29kZSBOIGluIG9jdGFsCisgICAgICAgICAgICAgICAgICBcMGJOIDogdGhlIGNoYXJhY3RlciBjb2RlIE4gaW4gYmluYXJ5CisgICAgICAgICAgICAgICAgICBcYSAgIDogQkVMICgweDA3KQorICAgICAgICAgICAgICAgICAgXGIgICA6IEJhY2tzcGFjZSAoMHgwOCkKKyAgICAgICAgICAgICAgICAgIFx0ICAgOiBUYWIgKDB4MDkpCisgICAgICAgICAgICAgICAgICBcZSAgIDogRXNjYXBlICgweDFiKQorICAgICAgICAgICAgICAgICAgXG4gICA6IE5ld2xpbmUgKDB4MGEpCisgICAgICAgICAgICAgICAgICBcZiAgIDogRm9ybWZlZWQgKDB4MGMpCisgICAgICAgICAgICAgICAgICBcciAgIDogQ2FycmlhZ2UgUmV0dXJuICgweDBkKQorICAgICAgICAgICAgICAgICAgXDxvdGhlciBjaGFyYWN0ZXI+OiB0aGUgZ2l2ZW4gY2hhcmFjdGVyCisKKyAgICBvIHN0YXR1cyAgICBPVVREQVRFRCAtIHN0YXR1cyB3YXMgcGxhbm5lZCB0byBiZSBhbiBvcHRpbWl6ZWQKKyAgICAgICAgICAgICAgICBib29sZWFuIGZvcm1hdCwgYnV0IHRoaXMgd2FzIG5ldmVyIGFjdHVhbGx5CisgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQuIHN0YXR1cyBkb2VzIHdvcms7IGhvd2V2ZXIsIHNpbmNlIGl0CisgICAgICAgICAgICAgICAgaXMgb25seSBhbiBhbGlhcyBmb3IgdHlwZSAnaW50JywganVzdCB1c2UgaW50LgorCisgICAgbyBzdHJpbmcgICAgU3RyaW5ncyBpbiBscGMgYXJlIHRydWUgc3RyaW5ncywgbm90IGFycmF5cyBvZiBjaGFyYWN0ZXJzCisgICAgICAgICAgICAgICAgYXMgaW4gQyAoYW5kIG5vdCBwb2ludGVycyB0byBzdHJpbmdzKS4gU3RyaW5ncyBhcmUKKyAgICAgICAgICAgICAgICBtdXRhYmxlIC0tIHRoYXQgaXMsIHRoZSBjb250ZW50cyBvZiBhIHN0cmluZyBjYW4gYmUKKyAgICAgICAgICAgICAgICBtb2RpZmllZCBhcyBuZWVkZWQuCisKKyAgICAgICAgICAgICAgICBUaGUgdGV4dCBvZiBhIHN0cmluZyBpcyB3cml0dGVuIGJldHdlZW4gZG91YmxlLXF1b3RlcworICAgICAgICAgICAgICAgICgiKS4gQSBzdHJpbmcgY2FuIHdyaXR0ZW4gb3ZlciBzZXZlcmFsIGxpbmVzIHdoZW4gdGhlCisgICAgICAgICAgICAgICAgbGluZWVuZHMgYXJlIGVzY2FwZWQgKGxpa2UgYSBtYWNybyksIGhvd2V2ZXIgYSBiZXR0ZXIKKyAgICAgICAgICAgICAgICBzb2x1dGlvbiBpcyB0byB3cml0ZSBvbmUgc3RyaW5nIHBlciBsaW5lIGFuZCBsZXQgdGhlCisgICAgICAgICAgICAgICAgZ2FtZWRyaXZlciBjb25jYXRlbmF0ZSB0aGVtLgorCisgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQgdHlwaWNhbGx5IGNvbnNpc3RzIG9mIGxpdGVyYWwgY2hhcmFjdGVycywKKyAgICAgICAgICAgICAgICBidXQgZXNjYXBlLXNlcXVlbmNlcyBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mCisgICAgICAgICAgICAgICAgY2hhcmFjdGVyczoKKyAgICAgICAgICAgICAgICAgIFw8Q1I+ICAgICA6IENhcnJpYWdlIFJldHVybiAoMHgwZCkKKyAgICAgICAgICAgICAgICAgIFw8Q1I+PExGPiA6IGlnbm9yZWQKKyAgICAgICAgICAgICAgICAgIFw8TEY+ICAgICA6IGlnbm9yZWQKKyAgICAgICAgICAgICAgICAgIFw8TEY+PENSPiA6IGlnbm9yZWQKKworICAgICAgICAgICAgICAgICAgXE4gICA6IHRoZSBjaGFyYWN0ZXIgY29kZSBOIGluIGRlY2ltYWwKKyAgICAgICAgICAgICAgICAgIFwweE4gOiB0aGUgY2hhcmFjdGVyIGNvZGUgTiBpbiBzZWRlY2ltYWwKKyAgICAgICAgICAgICAgICAgIFx4TiAgOiB0aGUgY2hhcmFjdGVyIGNvZGUgTiBpbiBzZWRlY2ltYWwKKyAgICAgICAgICAgICAgICAgIFwwb04gOiB0aGUgY2hhcmFjdGVyIGNvZGUgTiBpbiBvY3RhbAorICAgICAgICAgICAgICAgICAgXDBiTiA6IHRoZSBjaGFyYWN0ZXIgY29kZSBOIGluIGJpbmFyeQorICAgICAgICAgICAgICAgICAgXGEgICA6IEJFTCAoMHgwNykKKyAgICAgICAgICAgICAgICAgIFxiICAgOiBCYWNrc3BhY2UgKDB4MDgpCisgICAgICAgICAgICAgICAgICBcdCAgIDogVGFiICgweDA5KQorICAgICAgICAgICAgICAgICAgXGUgICA6IEVzY2FwZSAoMHgxYikKKyAgICAgICAgICAgICAgICAgIFxuICAgOiBOZXdsaW5lICgweDBhKQorICAgICAgICAgICAgICAgICAgXGYgICA6IEZvcm1mZWVkICgweDBjKQorICAgICAgICAgICAgICAgICAgXHIgICA6IENhcnJpYWdlIFJldHVybiAoMHgwZCkKKyAgICAgICAgICAgICAgICAgIFwiICAgOiBUaGUgZG91YmxlIHF1b3RlICgiKQorICAgICAgICAgICAgICAgICAgXDxvdGhlciBjaGFyYWN0ZXI+OiB0aGUgZ2l2ZW4gY2hhcmFjdGVyCisKKyAgICAgICAgICAgICAgICBBZGphY2VudCBzdHJpbmcgbGl0ZXJhbHMgYXJlIGF1dG9tYXRpY2FsbHkKKyAgICAgICAgICAgICAgICBjb25jYXRlbmF0ZWQgYnkgdGhlIGRyaXZlciB3aGVuIHRoZSBMUEMgcHJvZ3JhbSBpcworICAgICAgICAgICAgICAgIGNvbXBpbGVkLiBTdHJpbmcgbGl0ZXJhbHMgam9pbmVkIHdpdGggJysnIGFyZQorICAgICAgICAgICAgICAgIGNvbmNhdGVuYXRlZCBieSB0aGUgTFBDIGNvbXBpbGVyIGFzIHdlbGwuCisKKyAgICBvIG9iamVjdCAgICBQb2ludGVyIHRvIGFuIG9iamVjdC4gT2JqZWN0cyBhcmUgYWx3YXlzIHBhc3NlZCBieQorICAgICAgICAgICAgICAgIHJlZmVyZW5jZS4KKworICAgIG8gYXJyYXkgICAgIFBvaW50ZXIgdG8gYSB2ZWN0b3Igb2YgdmFsdWVzLCB3aGljaCBjb3VsZCBhbHNvCisgICAgICAgICAgICAgICAgYmUgYW4gYWxpc3QuIEFycmF5cyB0YWtlIHRoZSBmb3JtICh7IG4xLCBuMiwgbjMgfSkKKyAgICAgICAgICAgICAgICBhbmQgbWF5IGNvbnRhaW4gYW55IHR5cGUgb3IgYSBtaXggb2YgdHlwZXMuIEFycmF5cworICAgICAgICAgICAgICAgIGFyZSBhbHdheXMgcGFzc2VkIGJ5IHJlZmVyZW5jZS4gTm90ZSB0aGF0IHRoZSBzaXplCisgICAgICAgICAgICAgICAgb2YgYXJyYXlzIGluIExQQywgdW5saWtlIG1vc3QgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLAorICAgICAgICAgICAgICAgIENBTiBiZSBjaGFuZ2VkIGF0IHJ1bi10aW1lLgorCisgICAgbyBtYXBwaW5nICAgQW4gJ2Fzc29jaWF0aXZlIGFycmF5JyBjb25zaXN0aW5nIG9mIHZhbHVlcyBpbmRleGVkIGJ5CisgICAgICAgICAgICAgICAga2V5cy4gVGhlIGluZGljZXMgY2FuIGJlIGFueSBraW5kIG9mIGRhdGF0eXBlLgorICAgICAgICAgICAgICAgIE1hcHBpbmdzIHRha2UgdGhlIGZvcm0gKFsga2V5MTogdmFsdWUxLCBrZXkyOiB2YWx1ZTIgXSkuCisgICAgICAgICAgICAgICAgQnkgZGVmYXVsdCwgbWFwcGluZ3MgYXJlIHBhc3NlZCBieSByZWZlcmVuY2UuCisKKyAgICBvIGNsb3N1cmUgICBSZWZlcmVuY2VzIHRvIGV4ZWN1dGFibGUgY29kZSwgYm90aCB0byBsb2NhbAorICAgICAgICAgICAgICAgIGZ1bmN0aW9ucywgZWZ1bnMgYW5kIHRvIGZ1bmN0aW9ucyBjb21waWxlZCBhdAorICAgICAgICAgICAgICAgIHJ1bi10aW1lICgibGFtYmRhIGNsb3N1cmVzIikuCisKKyAgICBvIHN5bWJvbCAgICBJZGVudGlmaWVyIG5hbWVzLCB3aGljaCBpbiBlc3NlbmNlIGFyZSBxdW90ZWQgc3RyaW5ncy4KKyAgICAgICAgICAgICAgICBUaGV5IGFyZSB1c2VkIHRvIGNvbXB1dGUgbGFtYmRhIGNsb3N1cmVzLCBlLmcuIGluc3RlYWQKKyAgICAgICAgICAgICAgICBvZiAoey4uLiwgJ2lkZW50LCAuLi4gfSkgeW91IGNhbiB3cml0ZSBkZWNsYXJlIGEKKyAgICAgICAgICAgICAgICAnc3ltYm9sJyB2YXJpYWJsZSBmb28sIGNvbXB1dGUgYSB2YWx1ZSBmb3IgaXQsIGFuZCB0aGVuCisgICAgICAgICAgICAgICAgY3JlYXRlIHRoZSBjbG9zdXJlIGFzICh7IC4uLiwgZm9vLCAuLi4gfSkKKworICAgIG8gZmxvYXQgICAgIEEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGluIHRoZSBhYnNvbHV0ZSByYW5nZQorICAgICAgICAgICAgICAgIF9fRkxPQVRfTUlOX18gdG8gX19GTE9BVF9NQVhfXyAodHlwaWNhbGx5IDFlLTM4IHRvIDFlKzM4KS4KKyAgICAgICAgICAgICAgICBGbG9hdGluZyBwb2ludCBudW1iZXJzIGFyZSBzaWduaWZpZWQgYnkgYSAnLicKKyAgICAgICAgICAgICAgICBhcHBlYXJpbmcsIGUuZy4gJzEnIGlzIGludGVnZXIgMSwgYnV0ICcxLicgaXMKKyAgICAgICAgICAgICAgICBmbG9hdGluZy1wb2ludCAxIC4KKworICAgIG8gbWl4ZWQgICAgIEEgdmFyaWFibGUgYWxsb3dlZCB0byB0YWtlIGEgdmFsdWUgb2YgYW55IHR5cGUgKGludCwKKyAgICAgICAgICAgICAgICBzdHJpbmcsIG9iamVjdCwgYXJyYXksIG1hcHBpbmcsIGZsb2F0IG9yIGNsb3N1cmUpLgorCisgICAgbyBzdHJ1Y3QgICAgQSBjb2xsZWN0aW9uIG9mIHZhbHVlcy4gU2VlIHN0cnVjdHMoTFBDKS4KKworICAgIG8gdW5pb24gICAgIEEgcmFuZ2Ugb2YgdHlwZXMsIGVpdGhlciBvZiB3aGljaCB0aGUgdmFyaWFibGUKKyAgICAgICAgICAgICAgICBjYW4gY29udGFpbiBhdCBydW50aW1lLiBTZWUgdW5pb25zKExQQykuCisKKyAgICBBbGwgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMgaGF2ZSB0aGUgdmFsdWUgMC4KKworICAgIFRoZSB0eXBlIG9mIGEgdmFyaWFibGUgaXMgcmVhbGx5IG9ubHkgZm9yIGRvY3VtZW50YXRpb24uIFVubGVzcworICAgIHlvdSBkZWZpbmUgI3ByYWdtYSBzdHJvbmdfdHlwZXMgb3IgcnR0X2NoZWNrcywgdmFyaWFibGVzIGNhbgorICAgIGFjdHVhbGx5IGJlIG9mIGFueSB0eXBlIGFuZCBoYXMgbm8gZWZmZWN0IGF0IGFsbCBvbiB0aGUgcHJvZ3JhbS4KKyAgICBIb3dldmVyLCBpdCdzIGV4dHJlbWVseSBiYWQgc3R5bGUgdG8gZGVjbGFyZSBvbmUgdHlwZSBidXQgdXNlCisgICAgYW5vdGhlciwgc28gcGxlYXNlIHRyeSB0byBhdm9pZCB0aGlzLgorCisgICAgQSBwb2ludGVyIHRvIGEgZGVzdHJ1Y3RlZCBvYmplY3Qgd2lsbCBhbHdheXMgaGF2ZSB0aGUgdmFsdWUgMC4KKworCitTRUUgQUxTTworICAgIGFsaXN0cyhMUEMpLCBhcnJheXMoTFBDKSwgbWFwcGluZ3MoTFBDKSwgY2xvc3VyZXMoTFBDKSwgc3RydWN0cyhMUEMpLAorICAgIHVuaW9ucyhMUEMpLCB0eXBlb2YoRSksIGdldF90eXBlX2luZm8oRSksIGluaGVyaXRhbmNlKExQQyksCisgICAgcHJhZ21hKExQQyksIG1vZGlmaWVycyhMUEMpLCBlc2NhcGUoTFBDKQpkaWZmIC0tZ2l0IGEvZG9jL0xQQy91bmlvbnMgYi9kb2MvTFBDL3VuaW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWE4NDFkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL0xQQy91bmlvbnMKQEAgLTAsMCArMSwzMCBAQAorQ09OQ0VQVAorICAgICAgICB1bmlvbnMKKworREVTQ1JJUFRJT04KKyAgICAgICAgVW5pb25zIHR5cGVzIGFyZSBhIGRlY2xhcmF0aW9uIGF0IGNvbXBpbGUgdGltZSB0aGF0IGEgdmFyaWFibGUsCisgICAgICAgIGZ1bmN0aW9uIHBhcmFtZXRlciBvciBmdW5jdGlvbiByZXR1cm4gdmFsdWUgY2FuIGJlIG9uZSBvZgorICAgICAgICBzZXZlcmFsIHR5cGVzLgorCisgICAgICAgIEV4Y2VwdCBmb3IgdHlwZSBjaGVja3MgdXNpbmcgI3ByYWdtYSBydHRfY2hlY2tzIHRoZXkgaGF2ZSBubworICAgICAgICBpbXBhY3QgYXQgcnVudGltZS4gVGhlcmUgaXMgbm8gcnVudGltZSB1bmlvbiB0eXBlLCB0aGUgY29uY3JldGUKKyAgICAgICAgdmFsdWUgdHlwZSBpcyBvbmUgb2YgdGhlIHBvc3NpYmlsaXRpZXMgb2YgdGhlIHVuaW9uIHR5cGUuCisKKyAgICAgICAgVW5pb24gdHlwZXMgaGF2ZSBubyB0eXBlIG5hbWVzIGZvciB0aGVtc2VsdmVzLCB0aGV5IGFyZSBkZWNsYXJlZAorICAgICAgICBhbm9ueW1vdXNseSB3aXRoIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgdmFyaWFibGUsIGZ1bmN0aW9uCisgICAgICAgIHBhcmFtZXRlciBvciByZXR1cm4gdHlwZToKKworICAgICAgICAgICAgaW50fHN0cmluZyB2YXI7CisgICAgICAgICAgICBpbnR8ZmxvYXQgZnVuKG9iamVjdHxjbG9zdXJlIGYpOworCisgICAgICAgIFdoZW4gdXNpbmcgdW5pb24gdHlwZXMgYXMgYXJyYXkgbWVtYmVyIHR5cGVzIHRoZXkgbXVzdCBiZQorICAgICAgICBlbmNsb3NlZCB3aXRoIDwgPjoKKworICAgICAgICAgICAgPGludHxzdHJpbmc+KiBhcnI7ICAgIC8qIEFuIGFycmF5IG9mIGludHMgYW5kIHN0cmluZ3MuICovCisgICAgICAgICAgICBpbnQqfHN0cmluZyogIGFycjsgICAgLyogRWl0aGVyIGFuIGFycmF5IG9mIGludHMgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbiBhcnJheSBvZiBzdHJpbmdzLiAgICAgICAgICAqLworCisgICAgICAgICAgICAvKiBUaGVyZSBtdXN0IGJlIGEgd2hpdGVzcGFjZSBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZSA8CisgICAgICAgICAgICAgICB0byBiZSBub3QgY29uZnVzZWQgd2l0aCB0aGUgPDwgb3BlcmF0b3I6ICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIDwgPGludHxzdHJpbmc+KnxvYmplY3QgPiogYXJyOworCmRpZmYgLS1naXQgYS9kb2MvTFBDL3ZhcmFyZ3MgYi9kb2MvTFBDL3ZhcmFyZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYyMTgzNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9MUEMvdmFyYXJncwpAQCAtMCwwICsxLDc1IEBACitDT05DRVBUCisgICAgdmFyYXJncworCitERVNDUklQVElPTgorICAgIEEgZnVuY3Rpb24gdXNlcyAidmFyYXJncyIsIHNob3J0IGZvciAidmFyaWFibGUgYXJndW1lbnRzIiwgaWYKKyAgICBpdCBpbnRlbnRpb25hbGx5IG1heSBiZSBjYWxsZWQgd2l0aCBsZXNzIG9yIG1vcmUgYXJndW1lbnRzCisgICAgdGhhbiBmb3JtYWxseSBzcGVjaWZpZWQuCisKKyAgICBUaGUgcHJvcGVyIG9yZGVyIHRvIGRlZmluZSBhIGZ1bmN0aW9uIGNhbGwgaXM6CisKKyAgICAgICAgWyBtb2RpZmllciBdIFsgdmFyYXJncyBdIFsgcmV0dXJuIHR5cGUgXSBmdW5jdGlvbiggYXJncy4uLikKKworICAgICBBbnkgb3RoZXIgb3JkZXIgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuCisKKworICAgIEdpdmVuIGEgZnVuY3Rpb24gZGVmaW5pdGlvbiBsaWtlIHRoaXM6CisKKyAgICAgICAgdm9pZCBmdW4gKHN0cmluZyBhcmcxLCBpbnQgYXJnMiwgaW50IGFyZzMpCisKKyAgICBmdW4oKSBoYXMgdG8gYmUgY2FsbGVkIHdpdGggZXhhY3RseSB0aHJlZSBwYXJhbWV0ZXJzOiBvbmUKKyAgICBzdHJpbmcgYW5kIHR3byBpbnRlZ2Vycy4KKworCisgICAgSWYgdGhlIGZ1bmN0aW9uIGlzIGRlZmluZWQgYXMKKworICAgICAgICB2YXJhcmdzIHZvaWQgZnVuIChzdHJpbmcgYXJnMSwgaW50IGFyZzIsIGludCBhcmczKQorCisgICAgaXQgaXMgcG9zc2libGUgdG8gY2FsbCB0aGUgZnVuY3Rpb24gd2l0aCBqdXN0IGFyZzEsIG9yIGFyZzEKKyAgICBhbmQgYXJnMi4gVGhlIHJlbWFpbmluZyB1bnNwZWNpZmllZCBhcmd1bWVudHMgKGFyZzIgYW5kIGFyZzMsCisgICAgcmVzcC4gYXJnMykgYXJlIGluIHRoZXNlIGNhc2VzIGFzc3VtZWQgdG8gYmUgMC4KKworCisgICAgVG8gcGFzcyBtb3JlIGFyZ3VtZW50cyB0aGFuIHNwZWNpZmllZCwgdGhlIGZ1bmN0aW9ucyBsYXN0CisgICAgcGFyYW1ldGVyIG11c3QgYmUgZGVmaW5lZCBhcyBmb2xsb3dpbmc6CisKKyAgICAgICAgdm9pZCBmdW4gKHN0cmluZyBhcmcxLCBpbnQgYXJnMiwgdmFyYXJncyBpbnQgKiBhcmczKQorCisgICAgVGhpcyBhbGxvd3MgZnVuKCkgdG8gYmUgY2FsbGVkIHdpdGggdHdvIG9yIG1vcmUgYXJndW1lbnRzLgorICAgIFRoZSBhcmd1bWVudHMsIGV4Y2VwdCB0aG9zZSBhc3NpZ25lZCB0byB0aGUgb3RoZXIgcGFyYW1ldGVycywKKyAgICBpbiB0aGlzIGNhc2UgYXJnMSBhbmQgYXJnMiwgYW5kIGNvbGxlY3RlZCBpbnRvIGFuIGFycmF5IHdoaWNoCisgICAgaXMgdGhlbiBwYXNzZWQgYXMgYXJnMy4gRm9yIGV4YW1wbGUKKworICAgICAgICBmdW4oImZvbyIsIDEpICAgICAgIC0+IGFyZzMgPT0gKHsgfSkKKyAgICAgICAgZnVuKCJmb28iLCAxLCAyKSAgICAtPiBhcmczID09ICh7IDIgfSkKKyAgICAgICAgZnVuKCJmb28iLCAxLCAyLCAzKSAtPiBhcmczID09ICh7IDIsIDMgfSkKKworICAgIFRoZSB0eXBlIG9mIHRoZSB2YXJhcmdzIGFyZ3VtZW50IGhhcyB0byBiZSBhbiBhcnJheSBvZiB0aGUKKyAgICBleHBlY3RlZCB0eXBlIChpbnQqLCBvYmplY3QqLCBzdHJpbmcqLCAuLi4pOyBpbiB0aGlzIGV4YW1wbGUsCisgICAgb25seSBpbnRlZ2VycyBhcmUgYWxsb3dlZC4gVG8gYWNjZXB0IGFyZ3VtZW50cyBvZiBhbnkga2luZCwKKyAgICBkZWZpbmUgdGhlIHBhcmFtZXRlciBhcyAndmFyYXJncyBtaXhlZCcgb3IgJ3ZhcmFyZ3MgbWl4ZWQqJy4KKworICAgIFRvICdmbGF0dGVuJyB0aGUgcmVjZWl2ZWQgYXJndW1lbnQgYXJyYXkgaW4geW91ciBvd24gZnVuY3Rpb24KKyAgICBjYWxscywgdXNlIHRoZSBlZnVuIGFwcGx5KCk7IGUuZy46CisKKyAgICAgICAgYXBwbHkoIydjYWxsX291dCwgImJhciIsIDEsIGFyZzMpCisKKyAgICBvciB0aGUgJ2ZsYXR0ZW4gYXJndW1lbnRzJyBvcGVyYXRvcjoKKworICAgICAgIGNhbGxfb3V0KCJiYXIiLCAxLCBhcmczLi4uKQorCisgICAgVGhlIHR3byB2YXJhcmdzIHZhcmlhbnRzIGNhbiBvZiBjb3Vyc2UgYmUgY29tYmluZWQ6CisKKyAgICAgICAgdmFyYXJncyB2b2lkIGZ1biAoc3RyaW5nIGFyZzEsIGludCBhcmcyLCB2YXJhcmdzIGludCogYXJnMykKKworICAgIGRlZmluZXMgYSBmdW5jdGlvbiB3aGljaCBtYXkgYmUgY2FsbGVkIHdpdGggYW55IG51bWJlciBvZgorICAgIGFyZ3VtZW50cy4KKworCitISVNUT1JZCisgICAgVGhlIHBvc3NpYmlsaXR5IHRvIHBhc3MgbW9yZSBhcmd1bWVudHMgdGhhbiBmb3JtYWxseSBzcGVjaWZpZWQKKyAgICB3YXMgaW50cm9kdWNlZCBpbiAzLjIuMUAxMzIuIEJlZm9yZSwgdGhlIGV4Y2VzcyBhcmd1bWVudHMgd2VyZQorICAgIHNpbGVudGx5IGlnbm9yZWQuCisKK1NFRSBBTFNPCisgICAgcHJhZ21hKExQQyksIGFwcGx5KEUpLCBtb2RpZmllcnMoTFBDKQpkaWZmIC0tZ2l0IGEvZG9jL0xQQy93aGlsZSBiL2RvYy9MUEMvd2hpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRjNDcwOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9MUEMvd2hpbGUKQEAgLTAsMCArMSwxNSBAQAorTkFNRQorICAgICAgICB3aGlsZQorCitTWU5UQVgKKyAgICAgICAgd2hpbGUgKGV4cHIpIHN0YXRlbWVudDsKKworREVTQ1JJUFRJT04KKyAgICAgICAgV2hpbGUgJ2V4cHInIGV2YWx1YXRlcyB0byBub24gMCwgZXhlY3V0ZSBzdGF0ZW1lbnQuCisKKyAgICAgICAgQSAnYnJlYWsnIGluIHRoZSAnc3RhdGVtZW50JyB3aWxsIHRlcm1pbmF0ZSB0aGUgbG9vcC4gQQorICAgICAgICAnY29udGludWUnIHdpbGwgY29udGludWUgdGhlIGV4ZWN1dGlvbiBmcm9tIHRoZSBiZWdpbm5pbmcgb2YKKyAgICAgICAgdGhlIGxvb3AuCisKK1NFRSBBTFNPCisgICAgICAgIGZvcihMUEMpLCBmb3JlYWNoKExQQyksIGRvLXdoaWxlKExQQyksIGlmKExQQyksIHN3aXRjaChMUEMpCmRpZmYgLS1naXQgYS9kb2MvUkVBRE1FIGIvZG9jL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTIxZjlhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL1JFQURNRQpAQCAtMCwwICsxLDU0IEBACitJbiBkaWVzZW0gVmVyemVpY2huaXMgYmVmaW5kZXQgc2ljaCBhbGxlcywgd2FzIGRhcyBNb3JnZW5HcmF1ZW4gYW4KK0Rva3VtZW50YXRpb24genUgYmlldGVuIGhhdC4gT2J3b2hsIGhpZXIgc2Nob24gc28gZWluaWdlcyB6dSBmaW5kZW4gaXN0LAoraXN0IGRpZSBEb2t1bWVudGF0aW9uIG5vY2ggbGFuZ2UgbmljaHQga29tcGxldHQuCitadW0gVGVpbCB3ZXJkZW4gZGllIFZlcnplaWNobmlzc2Ugbm9jaCB1bXN0cnVrdHVyaWVydC4gV2FzIGdlbmF1IHdvIHp1CitmaW5kZW4gaXN0LCBzdGVodCB1bnRlbiBzb3dpZSBpbiBkZW4gLnJlYWRtZS1EYXRlaWVuIGRlciBqZXdlaWxpZ2VuCitWZXJ6ZWljaG5pc3NlLgorCitEaWUgSGlsZmVzZWl0ZW4gd2VyZGVuIHBhcmFsbGVsIGltIEFTQ0lJLSB1bmQgaW0gSFRNTC1Gb3JtYXQgZ2VmdWVocnQuCitEaWUgSFRNTC1TZWl0ZW4gc2luZCB1bnRlciBodHRwOi8vbWcubXVkLmRlL2hlbHAvIHp1IGZpbmRlbi4KKworQmVpIEFlbmRlcnVuZ2VuIGFuIGRlbiBTZWl0ZW4gYWNodGV0IGJpdHRlIGF1ZiBLb3JyZWt0aGVpdC4gSW0gWndlaWZlbHNmYWxsCitzY2hyZWlidCBlaW5lIE1haWwgYW4gZWluZW4gYWt0aXZlbiBIIG9kZXIgRU0uCisKK0RpZSBVbnRlcnZlcnplaWNobmlzc2UgdW5kIERhdGVpZW4gaGllciBoYWJlbiBmb2xnZW5kZSBCZWRldXR1bmdlbjoKKworKiBEb2t1bWVudGF0aW9uIHZvbiBCZWZlaGxlbiB1bmQgVGhlbWVuIGlubmVyaGFsYiBkZXMgU3BpZWxzCisgIChtZWhyIG9kZXIgd2VuaWdlciBrb21wbGV0dCB1ZWJlcmFyYmVpdGV0KQorICAgbyBoZWxwLyAgIC0gYWxsZ2VtZWluZSBUaGVtZW4sIGRpZSBBTExFIGJldHJlZmZlbgorICAgbyBwY21kLyAgIC0gZGllIEJlZmVobGUsIGRpZSBhbGxlIFNwaWVsZXIgYmVoZXJyc2NoZW4KKyAgIG8gc2NtZC8gICAtIFNlaGVyYmVmZWhsZSB1bmQgSGlsZmVuIHp1bSBIYXVzYmF1CisgICBvIG1jbWQvICAgLSBoaWVyIHNpbmQgZGllIE1hZ2llcmJlZmVobGUgYmVzY2hyaWViZW4KKyAgIG8gd2l6LyAgICAtIGFsbGdlbWVpbmUgVGhlbWVuIGZ1ZXIgTWFnaWVyCisgICBvIGcuKi8gICAgLSBIaWxmZXNlaXRlbiwgZGllIHp1ciBHaWxkZSBYWVogZ2Vob2VyZW4KKyAgIG8gaGlsZmUuKiAtIFVlYmVyc2ljaHRzc2VpdGVuIG1pdCBkZW4gZW50c3ByZWNoZW5kZW4gQmVmZWhsZW4KKyAgIG8gYmFsYW5jZS8tIFVlYmVyc2ljaHQgdWViZXIgYmFsYW5jZXJlbGV2YW50ZSBUaGVtZW4gdW5kIFJlZ2VsbgorCisqIFVlYmVyc2ljaHQgdWViZXIgT2JqZWt0ZSB1bmQgRnVua3Rpb25lbiBNdWRMaWIgKG5pZSB2b2xsc3RhZW5kaWcpCisgICBvIGVmdW4vICAgLSBGdW5rdGlvbmVuLCBkaWUgZGVyIEdhbWVEcml2ZXIgenVyIFZlcmZ1ZWd1bmcgc3RlbGx0CisgICBvIGxmdW4vICAgLSBGdW5rdGlvbmVuLCBkaWUgZGllIE9iamVrdGUgZGVyIE11ZExpYiB6dXIgVmVyZnVlZ3VuZyBzdGVsbGVuCisgICBvIG1hc3Rlci8gLSBGdW5rdGlvbmVuLCBkaWUgZGFzIE1hc3Rlcm9iamVrdCB6dXIgVmVyZnVlZ3VuZyBzdGVsbHQKKworICAgbyBzdGQvICAgIC0gRGllIE9iamVrdGUgZGVzIEJhc2lzLU11ZExpYgorICAgbyBvYmovICAgIC0gRWluaWdlIGhpbGZyZWljaGUgWnVzYXR6b2JqZWt0ZQorCisgICBvIHByb3BzLyAgLSBEaWUgUHJvcGVydGllcworICAgbyBwcm9wcy9wcm9wZXJ0aWVzLmgKKwkgICAgIC0gS3VyenVlYmVyc2ljaHQgZGVyIFByb3BlcnRpZXMgKEVpbnplbHNlaXRlbiBzaW5kIGFrdHVlbGxlcikKKworKiBTb25zdGlnZXMKKyAgIG8gMy4wLyAgICAgICAgIC0gZWluaWdlIFNFSFIgYWx0ZSBIaWxmZXNlaXRlbiB1ZWJlciBMUG11ZHMgaW0gQWxsZ2VtZWluZW4KKyAgIG8gYmVpc3BpZWxlLyAgIC0gQmVpc3BpZWxvYmpla3RlIHVuZCAtcmFldW1lLCBtdXNzIGRyaW5nZW5kIGdlZnVlbGx0IHdlcmRlbgorICAgbyBjb25jZXB0cy8gICAgLSBHcnVuZGtvbnplcHRlIHZvbiBMUEMKKyAgIG8gZHJpdmVyLyAgICAgIC0gQmVmZWhsZSB1bmQgS29tbWFuZG96ZWlsZSBkZXMgR2FtZURyaXZlcnMKKyAgIG8gZWQvICAgICAgICAgIC0gZWluIHBhYXIgSGlsZmVzZWl0ZW4gZnVlciBkZW4gJ2VkJ2l0b3IKKyAgIG8gR3J1bmRsYWdlbi8gIC0gZWluIHBhYXIgZ3J1bmRsZWdlbmRlIEluZm9ybWF0aW9uZW47IGxhbmRldCB2aWVsbGVpY2h0CisgICAgICAgICAgICAgICAgICAgIG1hbCBpbSBLdXJzIChzLnUuKQorICAgbyBLVVJTLyAgICAgICAgLSBIaWVyIHNvbGwgbWFsIGVpbiBNRy1zcGV6aWZpc2NoZXIgTFBDLUt1cnMgaGluLiBEZXIgS3VycworICAgICAgICAgICAgICAgICAgICBpbiBkZW4gVW50ZXJ2ZXJ6ZWljaG5pc3NlbiBMUEMtS1VSUy8gdW5kIExQQy1LVVJTMi8gaXN0CisgICAgICAgICAgICAgICAgICAgIGEpIGluIGVuZ2xpc2NoIHVuZCBiKSBuaWNodCB1bmJlZGluZ3QgZnVlciBkYXMKKyAgICAgICAgICAgICAgICAgICAgUHJvZ3JhbW1pZXJlbiBpbSBNRyBnZWVpZ25ldC4gRnVlcnMgTGVybmVuIHZvbiBMUEMgc29sbHRlCisgICAgICAgICAgICAgICAgICAgIGVyIGFiZXIgYXVzcmVpY2hlbi4KKyAgIG8gTFBDLyAgICAgICAgIC0gRGF0ZW50eXBlbiB1bmQgU3ByYWNoZWxlbWVudGUgdm9uIExQQworICAgbyBtaXNjLyAgICAgICAgLSBhbGxlcywgd2FzIHNvbnN0IG5pcmdlbmR3byBwYXNzdAorCmRpZmYgLS1naXQgYS9kb2MvYWJvdXQtZWZ1bitsZnVuLWRvY3MgYi9kb2MvYWJvdXQtZWZ1bitsZnVuLWRvY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDczZTM4NAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9hYm91dC1lZnVuK2xmdW4tZG9jcwpAQCAtMCwwICsxLDcyIEBACitOQU1FCisJYWJvdXQtZWZ1bitsZnVuLWRvY3MKKworQVVUSE9SCisJVGhlc2UgbWFuIHBhZ2VzIHdlcmUgY29sbGVjdGVkIGZyb20gdGhlIG9yaWdpbmFsIDIuNC41IGRvY3MsCisJZnJvbSB0aGUgaW5zdGFsbGVkIGRvY3Mgb2YgTmlnaHRGYWxsLCBUdWJNdWQgYW5kIE1vcmdlbkdyYXVlbi4KKworCVRoZXkgd2VyZSBjb2xsZWN0ZWQgY29ycmVjdGVkIGFuZCBjb21wbGV0ZWQgUGVwZWxATmlnaHRGYWxsLAorCXdpdGggYXNzaXN0YW5jZSBhbmQgc3VwcG9ydCBieSB0aGUgTFBDIHdpemFyZHMgb2YgTmlnaHRGYWxsLAorCVR1Yk11ZCBhbmQgTW9yZ2VuR3JhdWVuLCBuYW1lbHkgSHlwLCBNYWNiZXRoIGFuZCBNYXRlZXNlLiBBbHNvCisJdG8gbWVudGlvbiBhcmUgQnVtYmxlYmVlLCBCb2luZywgRGVlcHRob3VnaHQsIERlbW9zLCBIYXRlIGFuZAorCUpvZi4KKworREVTQ1JJUFRJT04KKwlUaGUgbWFuIHBhZ2VzIGdlbmVyYWxseSBhZGhlcmUgdG8gdGhlIGZvbGxvd2luZyBmb3JtYXQsIHdoaWNoCisJd2FzIGluc3BpcmVkIGJ5IHRoZSBVbml4IG1hbiBwYWdlcy4KKworCTxtYW5wYWdlPiA6Oj0gPHNlY3Rpb24+KworCisJVGhlcmUgYXJlIG9uZSBvciBtb3JlIHNlY3Rpb25zIGluIGEgbWFuIHBhZ2UuCisKKwk8c2VjdGlvbj4gOjo9IDxzZWN0aW9uLW5hbWU+PG5ld2xpbmU+PHNlY3Rpb24tdGV4dD48bmV3bGluZT4KKworCVRoZSBzZWN0aW9uIG5hbWVzIGFyZSBhbHdheXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUsIGFuZAorCWluIGFsbCBjYXBpdGFsIGxldHRlcnMgKGRlYmF0YWJsZSB1Z2x5bmVzcykuCisKKwk8c2VjdGlvbi1uYW1lPiA6Oj0gICAnTkFNRScgfCAnQ09OQ0VQVCcgfCAnU1lOT1BTSVMnCisJCQkgICB8ICdMQVNUIFVQREFURUQnCisJCQkgICB8ICdERVNDUklQVElPTicgfCAnQVVUSE9SJyB8ICdCVUdTJworCQkJICAgfCAnQ0FWRUFUUycgfCAnV0FSTklORycgfCAnTk9URScgfCAnTk9URVMnCisJCQkgICB8ICdFWEFNUExFJyB8ICdFWEFNUExFUycKKwkJCSAgIHwgJ1NFRSBBTFNPJworCisJSWYgYSBOQU1FIHNlY3Rpb24gb2NjdXJzLCBpdCBzaG91bGQgZ2l2ZSB0aGUgbmFtZSBvZiB0aGUgbWFuCisJcGFnZS4KKwlJZiBhIFNZTk9QU0lTIHNlY3Rpb24gb2NjdXJzLCB0aGUgbmFtZSBvZiB0aGUgbWFuIHBhZ2UgY2FuYiBiZQorCWRlcml2ZWQgZnJvbSB0aGUgZnVuY3Rpb24gbmFtZSwgdGhhdCBhcHBlYXJzIGluIHRoZSBsaW5lIGFmdGVyCisJU1lOT1BTSVMsIHdoaWNoIGxvb2tzIGFzIGZvbGxvd3M6CisKKwk8cmV0dXJudHlwZT48c3BhY2U+WycqJ108ZnVuY3Rpb24tbmFtZT4nKCc8cGFyYW1ldGVyLXByb3RvdHlwZXM+CisKKwlTRUUgQUxTTyBpcyBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBsaW5lcyB0aGF0IGNvbnRhaW4KKwljcm9zc3JlZmVyZW5jZXMgb2YgdGhlIGZvcm0KKworCTxjcm9zc3JlZmVyZW5jZXM+IDo6PQorCQk8Y3Jvc3NyZWY+WycsJzx3aGl0ZS1zcGFjZT48Y3Jvc3NyZWY+XSo8d2hpdGUtc3BhY2U+PEVPRj4KKwk8Y3Jvc3NyZWY+IDo6PSA8bWFuLXBhZ2UtbmFtZT4nKCc8Y2hhcHRlci1hYmJyZXY+JyknCisKKwlUaGUgbmFtZXMgb2YgdGhlIHJlZmVyZW5jZWQgbWFuIHBhZ2VzIGFyZSBmb2xsb3dlZCBpbiBicmFja2V0cworCWJ5IGFuIGFiYnJldmVpYXRpb24gZm9yIHRoZSBjaGFwZXIgKGkuZS4gZGlyZWN0b3J5KSB0aGUgbWFuCisJcGFnZSBpcyBpbi4gVGhlIGFiYnJldnMgYXJlCisJRSBmb3IgZWZ1bi8JdGhlIGBgc3lzdGVtIGNhbGxzJycgb2YgTFBDCisJTCBmb3IgbGZ1bi8JbWVtYmVyIGZ1bmN0aW9ucyB0aGF0IHRoZSBkcml2ZXIgYXBwbGllcyB0byBvYmplY3RzCisJQyBmb3IgY29uY2VwdHMvCWdlbmVyYWwgY29uY2VwdHMgb2YgTFBNVUQgYW5kIExQQworCUxQQyBmb3IgTFBDLwlhYm91dCBwYXJ0cyBvZiB0aGUgTFBDIGxhbmd1YWdlCisJTSBmb3IgbWFzdGVyLwlsZnVucyB0aGF0IGFyZSBhcHBsaWVkIHRvIHRoZSBtYXN0ZXIgb2JqZWN0IG9ubHkKKwlEIGZvciBkcml2ZXIvCXNvbWUgaW5mbyBhYm91dCBpbnRlcm5hbCBvcGVyYXRpb24gb2YgdGhlIGRyaXZlcgorCisJSWYgeW91IHdhbnQgdG8gcHJvY2VzcyB0aGVzZSBtYW4gcGFnZXMgYnkgc29tZSBjb252ZXJ0ZXIKKwlwcm9ncmFtLCB5b3UgY2FuIHVzZSB0aGVzZSB0byBtYXAgdGhlIGNoYXB0ZXIgbmFtZXMgdG8gZmlsZQorCW5hbWVzIG9yIHdoYXRldmVyLgorCitCVUdTCisJVGhlcmUgYXJlIG5vIG1hbiBwYWdlcyBzdXBwb3J0ZWQgYnkgQW15bGFhciBoaW1zZWxmLgorCUkgaG9wZSBvbmUgZGF5IEkgY2FuIGNvbnZpbmNlIGhpbSB0byBhdCBsZWFzdCBwdXQgdGhlc2UgZG9jcworCWludG8gdGhlIGRyaXZlciBkaXN0cmlidXRpb24uCisKKwlNZWFud2hpbGUsIHBsZWFzZSByZXBvcnQgYW55IGNvcnJlY3Rpb25zIC8gc3VnZ2VzdGlvbnMgLworCWNvbXBsZXRpb25zIHRvIDxwZXBlbEBpYnIuY3MudHUtYnMuZGU+CisKK1NFRSBBTFNPCisJZWZ1bihFKSwgbGZ1bihMKSwgY29uY2VwdHMoQyksIGxwYyhMUEMpLCBtYXN0ZXIoTSksIGRyaXZlcihEKQpkaWZmIC0tZ2l0IGEvZG9jL2FwcGxpZWQvX19JTklUIGIvZG9jL2FwcGxpZWQvX19JTklUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNTZmNmMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYXBwbGllZC9fX0lOSVQKQEAgLTAsMCArMSwxMiBAQAorU1lOT1BTSVMKKyAgICAgICAgX19JTklUCisKK0RFU0NSSVBUSU9OCisgICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY29uc3RydWN0ZWQgYXV0b21hZ2ljYWxseSBieSB0aGUgcGFyc2VyIGF0CisgICAgICAgIGNvbXBpbGVyLCBpZiB0aGUgcGFyc2VyIHdhcyBjb21waWxlZCB3aXRoICNkZWZpbmUKKyAgICAgICAgSU5JVElBTElTQVRJT05fX0lOSVQuIFRoaXMgZnVuY3Rpb24gaXMgbm90IGludGVuZGVkIHRvIGJlCisgICAgICAgIGRlZmluZWQgYnkgdGhlIGxwYyBvYmplY3RzLCBhbmQgbmV2ZXIgdG8gYmUgY2FsbGVkIGZyb20gbHBjCisgICAgICAgIG9iamVjdHMuIFRoaXMgbWFuIHBhZ2UgaXMgaGVyZSBqdXN0IGZvciBjb21wbGV0ZW5lc3MuCisKK1NFRSBBTFNPCisgICAgICAgIGluaXRpYWxpc2F0aW9uKExQQykKZGlmZiAtLWdpdCBhL2RvYy9hcHBsaWVkL2FkZF93ZWlnaHQgYi9kb2MvYXBwbGllZC9hZGRfd2VpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmODkxMmYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYXBwbGllZC9hZGRfd2VpZ2h0CkBAIC0wLDAgKzEsMjQgQEAKK0RFUFJFQ0FURUQKK1NZTk9QU0lTCisgICAgICAgIGludCBhZGRfd2VpZ2h0KGludCB3KQorCitERVNDUklQVElPTgorICAgICAgICBJbiBjb21wYXQgbW9kZSwgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IHRoZSBlZnVuIHRyYW5zZmVyKCkuCisKKyAgICAgICAgQW4gb2JqZWN0IHRoYXQgY2FuIGNvbnRhaW4gb3RoZXIgb2JqZWN0cyBhbmQgaXMgbm90IGEgcm9vbQorICAgICAgICBtdXN0IGRlZmluZSB0aGlzIGZ1bmN0aW9uLiBJdCBpcyBjYWxsZWQgd2l0aCB0aGUgZXh0cmEgd2VpZ2h0CisgICAgICAgIG9mIHRoZSBvYmplY3QgdGhhdCBpcyBtb3ZlZCBpbnRvIGl0LiBJZiB0aGlzIGlzIG9rLCB0aGVuIGl0CisgICAgICAgIGhhcyB0byBpbmNyZW1lbnQgdGhlIGxvY2FsIHdlaWdodCBjb3VudCwgYW5kIHJldHVybiB0cnVlLgorICAgICAgICBPdGhlcndpc2UsIHJldHVybiBmYWxzZSwgYW5kIHRoZSBuZXcgb2JqZWN0IGNhbiBub3QgYmUgZW50ZXJlZAorICAgICAgICBpbnRvIHRoaXMgb2JqZWN0LgorCisgICAgICAgIFRoZSBmdW5jdGlvbiBpcyBhbHNvIGNhbGxlZCB3aXRoIHRoZSBuZWdhdGl2ZSB3ZWlnaHQgaW4gdGhlCisgICAgICAgIG9iamVjdCB0aGF0IHRoZSBtb3ZpbmcgbGVhdmVzLgorCisgICAgICAgIE5vdGUgdGhhdCBubyBzZXRfd2VpZ2h0KCkgaXMgcmVxdWlyZWQgYnkgdGhlIHBhcnNlci4KKworSElTVE9SWQorICAgICAgICBEZXByZWNhdGVkIGluIExETXVkIDMuMyBhcyB0cmFuc2ZlcigpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuCisKK1NFRSBBTFNPCisgICAgICAgIHRyYW5zZmVyKEUpLCBxdWVyeV93ZWlnaHQoQSksIHByZXZlbnRfaW5zZXJ0KEEpCmRpZmYgLS1naXQgYS9kb2MvYXBwbGllZC9hcHBsaWVkIGIvZG9jL2FwcGxpZWQvYXBwbGllZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2Y2M2I5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2FwcGxpZWQvYXBwbGllZApAQCAtMCwwICsxLDEyIEBACitOQU1FCisgICAgICAgIGFwcGxpZWQKKworREVTQ1JJUFRJT04KKyAgICAgICAgVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgZGVzY3JpcHRpb25zIGZvciB0aGUgbGZ1bnMgdXNlZCBieQorICAgICAgICBBbXlsYWFyJ3MgdmVyc2lvbiBvZiB0aGUgTFBDIHBhcnNlci4KKworICAgICAgICBUaGVzZSBhcmUgZnVuY3Rpb25zIHRoYXQgYXJlIGFwcGxpZWQgYnkgdGhlIHBhcnNlciB0byB0aGUgTFBDCisgICAgICAgIG9iamVjdHMgb24gdmFyaW91cyBvY2Nhc2lvbnMuCisKK1NFRSBBTFNPCisgICAgICAgIGVmdW4oRSksIG1hc3RlcihNKSwgY29uY2VwdHMoQyksIGxwYyhMUEMpLCBkcml2ZXIoRCkKZGlmZiAtLWdpdCBhL2RvYy9hcHBsaWVkL2Nhbl9wdXRfYW5kX2dldCBiL2RvYy9hcHBsaWVkL2Nhbl9wdXRfYW5kX2dldApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDc5ODMyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2FwcGxpZWQvY2FuX3B1dF9hbmRfZ2V0CkBAIC0wLDAgKzEsMjAgQEAKK0RFUFJFQ0FURUQKK1NZTk9QU0lTCisgICAgICAgIGludCBjYW5fcHV0X2FuZF9nZXQoKQorCitERVNDUklQVElPTgorICAgICAgICBJbiBjb21wYXQgbW9kZSwgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IHRoZSBlZnVuIHRyYW5zZmVyKCkuCisKKyAgICAgICAgRGVmaW5lIHRoaXMgZnVuY3Rpb24gaW4gb2JqZWN0cyB0aGF0IGFyZSBuZWl0aGVyIGxpdmluZyBub3IKKyAgICAgICAgcm9vbXMgaWYgeW91IHdhbnQgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byBwdXQgc29tZXRoaW5nIGludG8KKyAgICAgICAgY3VycmVudCBvYmplY3QuCisKKyAgICAgICAgUmV0dXJuIHRydWUgaWYgb2ssIG90aGVyd2lzZSAwLiBUaGF0IG1lYW5zIHRoYXQgZGVmYXVsdCBpcworICAgICAgICB0aGF0IGl0IGlzIG5vdCBwb3NzaWJsZSB0byBwdXQgc29tZXRoaW5nIGludG8gYW4gb2JqZWN0LgorCitISVNUT1JZCisgICAgICAgIERlcHJlY2F0ZWQgaW4gTERNdWQgMy4zIGFzIHRyYW5zZmVyKCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4KKworU0VFIEFMU08KKyAgICAgICAgdHJhbnNmZXIoRSksIHByZXZlbnRfaW5zZXJ0KEEpCisKZGlmZiAtLWdpdCBhL2RvYy9hcHBsaWVkL2NhdGNoX21zZyBiL2RvYy9hcHBsaWVkL2NhdGNoX21zZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjQ0YWY0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2FwcGxpZWQvY2F0Y2hfbXNnCkBAIC0wLDAgKzEsMTkgQEAKK1NZTk9QU0lTCisgICAgICAgIHZvaWQgY2F0Y2hfbXNnKG1peGVkICp8c3RydWN0fG1hcHBpbmd8b2JqZWN0IG1zZywgb2JqZWN0IG9iaikKKworREVTQ1JJUFRJT04KKyAgICAgICAgV2hlbiBzYXkoKSwgdGVsbF9yb29tKCkgb3IgdGVsbF9vYmplY3QoKSBhcmUgdXNlZCB3aXRoIGFuCisgICAgICAgIG5vbi1zdHJpbmcgYXMgbWVzc2FnZSwgdGhlIHZhbHVlIHdpbGwgYmUgcGFzc2VkIHRvIGNhdGNoX21zZygpCisgICAgICAgIGluIGFsbCBsaXZpbmcgb2JqZWN0cyB0aGF0IGNhbiBoZWFyIGl0LCBpbnN0ZWFkIG9mIHdyaXRpbmcgdG8KKyAgICAgICAgdGhlIHVzZXIgcmVzcC4gIHNlbmRpbmcgdG8gY2F0Y2hfdGVsbCgpLiBUaGlzIGNhbiBiZSB1c2VkIHRvCisgICAgICAgIGltcGxlbWVudCBjb21tdW5pY2F0aW9uIHByb3RvY29scyBiZXR3ZWVuIGxpdmluZ3MuIFRoZSBzZWNvbmQKKyAgICAgICAgYXJndW1lbnQgZGVub3RlcyB0aGUgb2JqZWN0IHRoYXQgaGFzIHNlbnQgdGhlIG1lc3NhZ2UuCisKK0hJU1RPUlkKKyAgICAgICAgTERNdWQgMy4yLjExIGFkZGVkIHRlbGxfb2JqZWN0KCkgdG8gdGhlIGVmdW5zIGNhbGxpbmcgdGhpcworICAgICAgICBsZnVuIGZvciBzeW1tZXRyeSByZWFzb25zLgorICAgICAgICBMRE11ZCAzLjMuNjg2IGFkZGVkIHRoZSB1c2Ugb2YgYSBtYXBwaW5nL3N0cnVjdC9vYmplY3QgYXMgbWVzc2FnZQorICAgICAgICB2YWx1ZS4KKworU0VFIEFMU08KKyAgICAgICAgc2F5KEUpLCB0ZWxsX3Jvb20oRSksIGNhdGNoX3RlbGwoQSkKZGlmZiAtLWdpdCBhL2RvYy9hcHBsaWVkL2NhdGNoX3RlbGwgYi9kb2MvYXBwbGllZC9jYXRjaF90ZWxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MmE4MWEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYXBwbGllZC9jYXRjaF90ZWxsCkBAIC0wLDAgKzEsMjIgQEAKK1NZTk9QU0lTCisgICAgICAgIHZvaWQgY2F0Y2hfdGVsbChzdHJpbmcpCisKK0RFU0NSSVBUSU9OCisgICAgICAgIFdoZW4gYSBtZXNzYWdlIGlzIHNlbnQgdG8gYW4gbm9uLWludGVyYWN0aXZlIG9iamVjdCwgdmlhIHNheSgpLAorICAgICAgICB0ZWxsX29iamVjdCwgdGVsbF9yb29tKCkgb3Igd3JpdGUoKSwgaXQgd2lsbCBnZXQgdG8gdGhlIGZ1bmN0aW9uCisgICAgICAgIGNhdGNoX3RlbGwoc3RyaW5nKS4gVGhlIGlkZWEgaXMgdG8gZW5hYmxlIGNvbW11bmljYXRpb25zIGJldHdlZW4KKyAgICAgICAgTlBDcyBhbmQgZnJvbSBhIHVzZXIgdG8gYW4gTlBDLgorCisgICAgICAgIE1lc3NhZ2VzIHNlbnQgdG8gYW4gaW50ZXJhY3RpdmUgb2JqZWN0IGFyZSBhbHNvIHBhc3NlZCB0byB0aGF0CisgICAgICAgIG9iamVjdCdzIGNhdGNoX3RlbGwoKSBsZnVuLCBfaWYgaXQgaGFzIG9uZV8uIElmIHRoZSByZWNlaXZlcgorICAgICAgICAob3Igb25lIG9mIGl0cyBzaGFkb3dzKSBkb2Vzbid0IGhhdmUgdGhhdCBsZnVuLCB0aGUgdGV4dCBpcyBzZW50CisgICAgICAgIHRvIHRoZSBzb2NrZXQgZGlyZWN0bHkuIE9ubHkgbWVzc2FnZXMgc2VudCBieSBhbiBpbnRlcmFjdGl2ZQorICAgICAgICBvYmplY3QgdG8gaXRzZWxmIGluc2lkZSBhIGNhdGNoX3RlbGwgYWx3YXlzIHdyaXR0ZW4gdG8gdGhlIHNvY2tldAorICAgICAgICBpbW1lZGlhdGVseS4KKworICAgICAgICBUaGlzIGFsbG93cyB0byBmaWx0ZXIgYW5kIHByb2Nlc3MgdGV4dCBiZWZvcmUgaXQgaXMgd3JpdHRlbgorICAgICAgICB0byBhIHBsYXllci4KKworU0VFIEFMU08KKyAgICAgICAgZW5hYmxlX2NvbW1hbmRzKEUpLCBzYXkoRSksIHRlbGxfb2JqZWN0KEUpLCB0ZWxsX3Jvb20oRSksCisgICAgICAgIHdyaXRlKEUpLCBzbm9vcChFKSwgY2F0Y2hfbXNnKEEpCmRpZmYgLS1naXQgYS9kb2MvYXBwbGllZC9jbGVhbl91cCBiL2RvYy9hcHBsaWVkL2NsZWFuX3VwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZGZhNzMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYXBwbGllZC9jbGVhbl91cApAQCAtMCwwICsxLDUxIEBACitTWU5PUFNJUworICAgICAgICBpbnQgPGxmdW4+IChpbnQgcmVmY291bnQpCisgICAgICAgIGludCA8Y2xvc3VyZT4oaW50IHJlZiwgb2JqZWN0IG9iKQorCitERVNDUklQVElPTgorICAgICAgICBUaGUgaG9vayBIX0NMRUFOX1VQIGRlZmluZXMgYSBsZnVuIG9yIGEgY2xvc3VyZSB1c2VkIHRvIGNsZWFuCisgICAgICAgIHVwIGFuIG9iamVjdC4gSW4gb2xkZXIgZHJpdmVycyB0aGlzIHdhcyBoYXJkd2lyZWQgdG8gdGhlIGxmdW4KKyAgICAgICAgY2xlYW5fdXAoKS4KKworICAgICAgICBUaGUgZnVuY3Rpb24gaXMgYXBwbGllZCBieSB0aGUgZHJpdmVyIHdoZW4gYW4gb2JqZWN0IGhhc24ndCBiZWVuCisgICAgICAgIHVzZWQgZm9yIGEgbG9uZyB0aW1lLCB0byBnaXZlIGl0IGEgcG9zc2liaWxpdHkgdG8KKyAgICAgICAgc2VsZi1kZXN0cnVjdC4gVGhlIHJlZmNvdW50IDxyZWY+IHBhc3NlZCBhcyBhcmd1bWVudCB3aWxsIGJlIDAgZm9yCisgICAgICAgIGNsb25lIG9iamVjdHMsIDEgZm9yIGEgc2ltcGxlIGxvYWRlZCBvYmplY3QsIGFuZCBncmVhdGVyIHdoZW4KKyAgICAgICAgdGhlIG9iamVjdCBpcyBjbG9uZWQgb3IgaW5oZXJpdGVkIGJ5IHNvbWUgZXhpc3Rpbmcgb2JqZWN0LiAgSXQKKyAgICAgICAgaXMgcmVjb21tZW5kZWQgbm90IHRvIHNlbGZfZGVzdHJ1Y3QgdGhlIG9iamVjdCB3aGVuIHRoZQorICAgICAgICByZWZlcmVuY2UgY291bnQgaXMgZ3JlYXRlciB0aGFuIG9uZS4KKworICAgICAgICBCeSBjb252ZW50aW9uLCBhIHJlZmNvdW50IDwgMCBpcyB1c2VkIGlmIHNvbWUgb3RoZXIgb2JqZWN0CisgICAgICAgIGFza3MgdGhlIGNhbGxlZCBvYmplY3QgdG8gY2xlYW5fdXAuCisKKyAgICAgICAgSWYgdGhlIGZ1bmN0aW9uIGlzIGEgY2xvc3VyZSwgdGhlIHNlY29uZCBhcmd1bWVudCA8b2I+IGlzIHRoZQorICAgICAgICBvYmplY3QgdG8gY2xlYW4gdXAuCisKKyAgICAgICAgSWYgdGhlIGhvb2sgc3BlY2lmaWVzIGEgbm9uLWV4aXN0aW5nIGxmdW4sIG9yIGlmIHRoZSBjYWxsCisgICAgICAgIHJldHVybnMgMCwgbm8gZnVydGhlciBhdHRlbXB0IHRvIGNsZWFuIHVwIHRoaXMgb2JqZWN0IHdpbGwgYmUgZG9uZS4KKworICAgICAgICBSZXR1cm5pbmcgYSBub24temVybyB2YWx1ZSBpcyBvbmx5IHJlY29tbWVuZGVkIHdoZW4gdGhlIHJlYXNvbgorICAgICAgICB3aHkgdGhlIG9iamVjdCBjYW4ndCBzZWxmLWRlc3RydWN0IGlzIGxpa2VseSB0byB2YW5pc2ggd2l0aG91dAorICAgICAgICB0aGUgb2JqZWN0IGJlaW5nIHRvdWNoZWQsIHRoYXQgaXMsIHdoZW4gbm8gbG9jYWwgZnVuY3Rpb24gaXMKKyAgICAgICAgY2FsbGVkIGluIGl0LCAoYW5kIGluIGNvbXBhdCBtb2RlIGFsc28gd2hlbiB0aGUgb2JqZWN0IGlzIG5vdAorICAgICAgICBiZWluZyBtb3ZlZCBhcm91bmQpLgorCisgICAgICAgIEEgdHlwaWNhbCBtdWQgY29uZmlndXJhdGlvbiBkZWZpbmVzIHRoZSB0aW1lIHRvIHdhaXQgZm9yCisgICAgICAgIGNsZWFuX3VwKCkgc28gbG9uZyB0aGF0IHlvdSBjYW4gYXNzZXJ0IHJlc2V0KCkgaGFzIGJlZW4KKyAgICAgICAgY2FsbGVkIHNpbmNlIHRoZSBvYmplY3QgaGFzIGJlZW4gdG91Y2hlZCBsYXN0IHRpbWUuCisKK0VYQU1QTEVTCisgICAgICAgIEEgY2xvbmUgb2YgL3N0ZC9kcmluayBkZWZpbmVzIGNsZWFuX3VwKCkgdG8gc2VsZi1kZXN0cnVjdCBpZgorICAgICAgICBpdCBpcyBlbXB0eSwgbm90IGNhcnJpZWQgYSBsaXZpbmcgYmVpbmcgYW5kIG5vdCB0b3VjaGVkIGZvcgorICAgICAgICBhIGxvbmcgdGltZS4KKworICAgICAgICBBIHJvb20gdGhhdCBpbmhlcml0cyAvc3RkL3Jvb20gZGVmaW5lcyBjbGVhbl91cCgpIHRvCisgICAgICAgIHNlbGYtZGVzdHJ1Y3QgaWYgaXQgaXMgbmVpdGhlciBpbmhlcml0ZWQgbm9yIHVzZWQgYXMgYQorICAgICAgICBibHVlcHJpbnQsIGlzIGVtcHR5IGFuZCB3YXMgbm90IGVudGVyZWQgZm9yIGEgbG9uZyB0aW1lLgorCitISVNUT1JZCisgICAgICAgIEJlZm9yZSAzLjIuMSwgdGhlIGZ1bmN0aW9uIHdhcyBoYXJkd2lyZWQgdG8gdGhlIGxmdW4gY2xlYW5fdXAoKS4KKworU0VFIEFMU08KKyAgICAgICAgcmVzZXQoQSksIGhlYXJ0X2JlYXQoQSksIGNhbGxfb3V0KEUpLCBkZXN0cnVjdChFKSwgcmVtb3ZlKEEpLAorICAgICAgICBob29rcyhDKQpkaWZmIC0tZ2l0IGEvZG9jL2FwcGxpZWQvY3JlYXRlIGIvZG9jL2FwcGxpZWQvY3JlYXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNTZlMTMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYXBwbGllZC9jcmVhdGUKQEAgLTAsMCArMSwyOSBAQAorU1lOT1BTSVMKKyAgICAgICAgdm9pZCBjcmVhdGUoKQorCitERVNDUklQVElPTgorICAgICAgICBUaGUgSF9DUkVBVEVfU1VQRVIvX09CL19DTE9ORSBob29rcyBkZWZpbmUgdGhlIGZ1bmN0aW9uIG9yIGNsb3N1cmUKKyAgICAgICAgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGRyaXZlciBjcmVhdGVzIGEgbmV3IG9iamVjdC4gSW4gb2xkZXIKKyAgICAgICAgZHJpdmVycyB0aGlzIHdhcyBoYXJkd2lyZWQgdG8gdGhlIGxmdW4gY3JlYXRlKCksIGFuZCBhIGxvdCBvZgorICAgICAgICBob29rIGltcGxlbWVudGF0aW9ucyBzdGlsbCBmb2xsb3cgdGhpcyB0cmFkaXRpb24uCisKKyAgICAgICAgVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBvbmx5IG9uY2Ugb24gY3JlYXRpb24gb2YgdGhlCisgICAgICAgIG9iamVjdCAodGhpcyBpcyB3aGVuIHRoZSBvYmplY3Qgd2lsbCBiZSBsb2FkZWQgb3IgY2xvbmVkKS4KKyAgICAgICAgSW5zaWRlIHRoaXMgZnVuY3Rpb24gYWxsIG1ham9yIGluaXRpYWxpemF0aW9uIGNhbiBiZSBkb25lLiBUaGUKKyAgICAgICAgY3VycmVudCB1c2VyIGFuZCB0aGUgcHJldmlvdXMgb2JqZWN0IGFyZSBkZWZpbmVkIGJ1dCB0aGUKKyAgICAgICAgb2JqZWN0IGhhcyBubyBlbnZpcm9ubWVudC4KKworRVhBTVBMRQorICAgICAgICBvYmplY3QgY2xvbmVyOworICAgICAgICB2b2lkIGNyZWF0ZSgpIHsKKyAgICAgICAgICAgY2xvbmVyPXRoaXNfcGxheWVyKCk7CisgICAgICAgIH0KKworICAgICAgICBJbml0aWFsaXplIHRoZSBnbG9iYWwgdmFyaWFibGUgdG8gaG9sZCB0aGUgb25lIHdobworICAgICAgICBjcmVhdGVkL2Nsb25lZCB0aGUgb2JqZWN0LgorCisgICAgICAgIEZvciAzLjIuMSwgdGhlIG11ZGxpYiBtYXkgYmUgcHJvZ3JhbW1lZCB0byBjYWxsIG90aGVyIGxmdW5zCisgICAgICAgIHRoYW4gY3JlYXRlKCkgb24gYW4gb2JqZWN0cyBjcmVhdGlvbi4KKworU0VFIEFMU08KKyAgICAgICAgcmVzZXQoQSksIGluaXQoQSksIF9fSU5JVChBKSwgaW5pdGlhbGlzYXRpb24oTFBDKSwgaG9va3MoQyksIG5hdGl2ZShDKQpkaWZmIC0tZ2l0IGEvZG9jL2FwcGxpZWQvZHJvcCBiL2RvYy9hcHBsaWVkL2Ryb3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRmMmJiMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9hcHBsaWVkL2Ryb3AKQEAgLTAsMCArMSwyNSBAQAorREVQUkVDQVRFRAorU1lOT1BTSVMKKyAgICAgICAgaW50IGRyb3Aodm9pZCkKKyAgICAgICAgaW50IGRyb3AoaW50IHNpbGVudGx5KQorCitERVNDUklQVElPTgorICAgICAgICBJbiBjb21wYXQgbW9kZSB0aGlzIGxmdW4gaXMgdXNlZCBieSB0aGUgZWZ1biB0cmFuc2ZlcigpLgorCisgICAgICAgIEl0IGlzIGNhbGxlZCB0byBjaGVjayBpZiBhbiBvYmplY3Qgd2FudHMgdG8gYmUgbW92ZWQgb3V0IG9mCisgICAgICAgIHRoZSBpbnZlbnRvcnkgb2YgYSBsaXZpbmcgb2JqZWN0LiBkcm9wKCkgc2hvdWxkIHJldHVybiAxIHRvCisgICAgICAgIHByZXZlbnQgZHJvcHBpbmcuIFRoaXMgaXMgdGhlIG9wcG9zaXRlIG9mIHRoZSBnZXQoKSBmdW5jdGlvbi4KKyAgICAgICAgVGhhdCBpcyBiZWNhdXNlIGlmIGRyb3AoKSBpcyBub3QgZGVmaW5lZCwgaXQgd2lsbCBhbHdheXMgYmUKKyAgICAgICAgcG9zc2libGUgdG8gZHJvcCBhbiBvYmplY3QuCisKKyAgICAgICAgSWYgdGhlIG9iamVjdCBzZWxmLWRlc3RydWN0cyB3aGVuIGRyb3AoKSBpcyBjYWxsZWQsIGJlIHN1cmUgdG8KKyAgICAgICAgcmV0dXJuIDEsIGFzIHRoZSBkZXN0cnVjdGVkIGl0ZW0gc3VyZWx5IG5vdCBjYW4gYmUgZHJvcHBlZC4KKworICAgICAgICBNb3N0IGNvbXBhdCBtb2RlIExQQyBsaWJyYXJpZXMgdG8gZGVmaW5lIG9uZSBhcmd1bWVudCBmb3IKKyAgICAgICAgZHJvcC4gSWYgc2lsZW50bHkgaXMgdHJ1ZSwgbm8gbWVzc2FnZXMgc2hvdWxkIGJlIHdyaXR0ZW4uCisKK0hJU1RPUlkKKyAgICAgICAgRGVwcmVjYXRlZCBpbiBMRE11ZCAzLjMgYXMgdHJhbnNmZXIoKSBoYXMgYmVlbiBkZXByZWNhdGVkLgorCitTRUUgQUxTTworICAgICAgICB0cmFuc2ZlcihFKQpkaWZmIC0tZ2l0IGEvZG9jL2FwcGxpZWQvZXhpdCBiL2RvYy9hcHBsaWVkL2V4aXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc1ZmRkMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9hcHBsaWVkL2V4aXQKQEAgLTAsMCArMSwyMSBAQAorU1lOT1BTSVMKKyAgICAgICAgdm9pZCBleGl0KG9iamVjdCBvYikKKworREVTQ1JJUFRJT04KKyAgICAgICAgVGhpcyBmdW5jdGlvbiB3YXMgdXNlZCBpbiBjb21wYXQgbW9kZSBkcml2ZXJzIGluIGNvbnRleHQKKyAgICAgICAgd2l0aCBtb3Zpbmcgb2JqZWN0cy4gTm93YWRheXMgb2JqZWN0cyBhcmUgbW92ZWQgYnkgbWVhbnMKKyAgICAgICAgb2YgdGhlIEhfTU9WRV9PQkpFQ1QwLzEgaG9va3MsIGFuZCB1c2Ugb2YgdGhpcyBsZnVuIGlzCisgICAgICAgIHVwIHRvIHRoZSBtdWRsaWIuCisKKyAgICAgICAgVGhpcyBmdW5jdGlvbiB3YXMgY2FsbGVkIGluIHRoZSBvbGQgZW52aXJvbm1lbnQgZXZlcnl0aW1lIGEKKyAgICAgICAgbGl2aW5nIG9iamVjdCBvYiBsZWF2ZXMgaXQuCisKKyAgICAgICAgVGhlIGZ1bmN0aW9uIHRoaXNfcGxheWVyKCkgd2lsbCByZXR1cm4gYSByYW5kb20gdmFsdWUsIGRvbid0CisgICAgICAgIHVzZSBpdCBhdCB0aGlzIHBvaW50LgorCisgICAgICAgIFdBUk5JTkc6IFVzaW5nIHRoaXMgZnVuY3Rpb24gaXMgRVhUUkVNRUxZIGRhbmdlcm91cy4gQSBzaW5nbGUKKyAgICAgICAgYnVnLCBhbmQgeW91IGFyZSBmb3JldmVyIChpLmUuIHVudGlsIHRoZSBuZXh0IHJlYm9vdCBvY2N1cnMpCisgICAgICAgIGNhdWdodCBpbiB0aGUgcm9vbS4KKworU0VFIEFMU08KKyAgICAgICAgaW5pdChBKQpkaWZmIC0tZ2l0IGEvZG9jL2FwcGxpZWQvZ2V0IGIvZG9jL2FwcGxpZWQvZ2V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NWExYjAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYXBwbGllZC9nZXQKQEAgLTAsMCArMSwxOCBAQAorREVQUkVDQVRFRAorU1lOT1BTSVMKKyAgICAgICAgaW50IGdldCgpCisKK0RFU1JJUFRJT04KKyAgICAgICAgSW4gY29tcGF0IG1vZGUsIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSB0aGUgZWZ1biB0cmFuc2ZlcigpLgorCisgICAgICAgIElmIGFuIG9iamVjdCB3YW50cyBjb250cm9sIG92ZXIgd2hlbiBpdCBpcyBwb3NzaWJsZSB0byBwaWNrIGl0CisgICAgICAgIHVwLCBpLmUuIG1vdmVkIGludG8gYSBsaXZpbmcgb2JqZWN0LCB0aGVuIGl0IG11c3QgZGVmaW5lCisgICAgICAgIGdldCgpLCBhbmQgcmV0dXJuIDEgaWYgb2sgdG8gcGljayB1cC4KKworICAgICAgICBpZCgpIGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUgdGhpcyB0byBpZGVudGlmeSB0aGUgb2JqZWN0LgorCitISVNUT1JZCisgICAgICAgIERlcHJlY2F0ZWQgaW4gTERNdWQgMy4zIGFzIHRyYW5zZmVyKCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4KKworU0VFIEFMU08KKyAgICAgICAgdHJhbnNmZXIoRSksIGRyb3AoQSkKZGlmZiAtLWdpdCBhL2RvYy9hcHBsaWVkL2hlYXJ0X2JlYXQgYi9kb2MvYXBwbGllZC9oZWFydF9iZWF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NzZiMDMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYXBwbGllZC9oZWFydF9iZWF0CkBAIC0wLDAgKzEsNDcgQEAKK1NZTk9QU0lTCisgICAgICAgIHZvaWQgaGVhcnRfYmVhdCgpCisKK0RFU0NSSVBUSU9OCisgICAgICAgIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYXV0b21hdGljYWxseSBldmVyeQorICAgICAgICBfX0hFQVJUX0JFQVRfSU5URVJWQUxfXyBzZWNvbmRzLiBUaGUgZHJpdmVyIHdpbGwgY2FsbCB0aGUgZnVuY3Rpb24KKyAgICAgICAgZGlyZWN0bHkgaW4gdGhlIG9iamVjdCwgZXZlbiBpZiB0aGUgZnVuY3Rpb24gaXMgYmVpbmcgc2hhZG93ZWQuCisKKyAgICAgICAgVGhlIHN0YXJ0IGFuZCBzdG9wIG9mIGhlYXJ0IGJlYXQgaXMgY29udHJvbGxlZCBieSB0aGUgZWZ1bgorICAgICAgICBzZXRfaGVhcnRfYmVhdCgpLiBCZSBjYXJlZnVsIG5vdCB0byBoYXZlIG9iamVjdHMgd2l0aCBoZWFydAorICAgICAgICBiZWF0IHJ1bm5pbmcgYWxsIHRoZSB0aW1lLCBhcyBpdCB1c2VzIGEgbG90IG9mIGRyaXZlcgorICAgICAgICByZXNvdXJjZXMuIElmIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBoZWFydCBiZWF0IHJvdXRpbmUsIHRoZQorICAgICAgICBoZWFydCBiZWF0IHdpbGwgYmUgdHVybmVkIG9mZiBmb3IgdGhpcyBvYmplY3QgYW5kIHRoZQorICAgICAgICBtYXN0ZXIgZnVuY3Rpb24gaGVhcnRfYmVhdF9lcnJvcigpIGlzIGNhbGxlZC4gSWYgdGhlIGNhbGwKKyAgICAgICAgdG8gdGhlIG1hc3RlciBmdW5jdGlvbiByZXR1cm5zIGEgbm9uLXplcm8gdmFsdWUsIHRoZSBoZWFydCBiZWF0CisgICAgICAgIHdpbGwgYmUgdHVybmVkIGJhY2sgb24gYWdhaW4uCisKKyAgICAgICAgVGhlIGZ1bmN0aW9uIHRoaXNfcGxheWVyKCkgd2lsbCByZXR1cm4gdGhpcyBvYmplY3QsIGJ1dCBvbmx5IGlmCisgICAgICAgIGl0IGlzIGxpdmluZy4gT3RoZXJ3aXNlLCB0aGlzX3BsYXllcigpIHdpbGwgcmV0dXJuIDAuCisKKyAgICAgICAgVGhlIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIG9ubHkgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGludGVyYWN0aXZlCisgICAgICAgIHVzZXIgaW4gdGhlIGdhbWUuCisKKyAgICAgICAgTm90ZSB0aGF0IGVycm9yIG1lc3NhZ2VzIHdpbGwgYmUgZ2l2ZW4gdG8gdGhlIGN1cnJlbnQgdXNlcgorICAgICAgICB3aGljaCB3aWxsIGJlIHRoZSBvYmplY3QgaXRzZWxmIG9yIG5vYm9keS4KKworRVhBTVBMRQorICAgICAgICBvYmplY3Qgb3duZXI7CisgICAgICAgIHZvaWQgY3JlYXRlKCkgeworICAgICAgICAgICAuLi4KKyAgICAgICAgICAgb3duZXI9dGhpc19wbGF5ZXIoKTsKKyAgICAgICAgICAgc2V0X2hlYXJ0X2JlYXQoMSk7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBoZWFydF9iZWF0KCkgeworICAgICAgICAgICB0ZWxsX29iamVjdChvd25lciwgIllvdXIgaGVhcnQgZ29lczogQlVNIEJVTVxuIik7CisgICAgICAgIH0KKworICAgICAgICBXZSBoYXZlIHRvIHVzZSB0ZWxsX29iamVjdCgpIGJlY2F1c2Ugd3JpdGUgZ29lcyB0byB0aGUgY3VycmVudAorICAgICAgICB1c2VyIGFuZCB0aGlzIGNhbiBvbmx5IGJlIHRoZSBvYmplY3QgaXRzZWxmIG9yIG5vYm9keS4KKworSElTVE9SWQorICAgICAgICBMRE11ZCAzLjMuNjg3IG1hZGUgdGhlIGludGVydmFsIHRpbWUgY29uZmlndXJhYmxlIGF0IGRyaXZlciBjb21waWxlCisgICAgICAgIHRpbWUgKHVzZWQgdG8gYmUgMiBzZWNvbmRzIGZpeGVkKS4KKworU0VFIEFMU08KKyAgICAgICAgc2V0X2hlYXJ0X2JlYXQoRSksIGNhbGxfb3V0KEUpLCBlbmFibGVfY29tbWFuZHMoRSksCisgICAgICAgIGhlYXJ0X2JlYXRfZXJyb3IoTSkKZGlmZiAtLWdpdCBhL2RvYy9hcHBsaWVkL2lkIGIvZG9jL2FwcGxpZWQvaWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRiMWZiMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9hcHBsaWVkL2lkCkBAIC0wLDAgKzEsMTcgQEAKK1NZTk9QU0lTCisgICAgICAgIHZhcmFyZ3MgaW50IGlkKHN0cmluZyBzdHIsIGludCBsdmwpOworCitERVNDUklQVElPTgorICAgICAgICBMZXQgdGhlIG9iamVjdCBpZGVudGlmeSBpdHNlbGYuIElmIHN0ciBtYXRjaGVzIGFuIGlkIG9mIHRoZQorICAgICAgICBjdXJyZW50IG9iamVjdCB0aGVuIHJldHVybiBhIG5vbmUgemVybyB2YWx1ZS4KKworICAgICAgICBUaGlzIGxmdW4gaXMgYXBwbGllZCBmb3IgdGhlIGVmdW4gcHJlc2VudCgpLgorCitFWEFNUExFCisgICAgICAgIGludCBpZChzdHJpbmcgc3RyKSB7CisgICAgICAgICAgIHJldHVybiAic3dvcmQiID09IHN0ciB8fCAic3dvcmQgb2YgZmlyZSIgPT0gc3RyOworICAgICAgICB9CisKK1NFRSBBTFNPCisgICAgICAgIHByZXNlbnQoRSkKKyAgICAgICAgaWQoTCkKZGlmZiAtLWdpdCBhL2RvYy9hcHBsaWVkL2luaXQgYi9kb2MvYXBwbGllZC9pbml0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3Njc1ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYXBwbGllZC9pbml0CkBAIC0wLDAgKzEsNzAgQEAKK1NZTk9QU0lTCisgICAgICAgIHZvaWQgaW5pdCgpCisKK0RFU0NSSVBUSU9OCisgICAgICAgIFRoZSBIX01PVkVfT0JKRUNUMC8xIGltcGxlbWVudCB0aGUgZGV0YWlscyBvZiBtb3Zpbmcgb2JqZWN0cy4KKyAgICAgICAgSW4gb2xkZXIgZHJpdmVycywgaW5pdCgpIHdhcyBjYWxsZWQgdG8gaGFuZGxlIHRoZSBhZGRpbmcgb2YKKyAgICAgICAgYWN0aW9ucywgYW5kIGEgbG90IG9mIGhvb2sgaW1wbGVtZW50YXRpb25zIHN0aWxsIGZvbGxvdyB0aGlzCisgICAgICAgIHRyYWRpdGlvbi4KKworICAgICAgICBUaGUgbWFpbiBwdXJwb3NlIG9mIHRoaXMgZnVuY3Rpb24gaXMgdG8gcHVibGlzaCB0aGUgY29tbWFuZHMKKyAgICAgICAgYW4gb2JqZWN0IGltcGxlbWVudHMgdG8gb3RoZXIsIGxpdmluZyBvYmplY3RzLiBUcmFkaXRpb25hbGx5LAorICAgICAgICB3aGVuZXZlciBhIGxpdmluZyBvYmplY3QgZW50ZXJzIHRoZSB2aWNpbml0eSBvZiBhbm90aGVyCisgICAgICAgIG9iamVjdCwgaW5pdCgpIGlzIGNhbGxlZCBpbiB0aGUgbGF0dGVyIGFuZCB0aGlzX3BsYXllcigpIHdpbGwKKyAgICAgICAgcG9pbnQgdG8gdGhlIGZvcm1lciBvYmplY3QuIFRoaXMgaGFwcGVucyBtdXR1YWxseSBzaG91bGQgYm90aAorICAgICAgICBvYmplY3RzIGhhcHBlbiB0byBiZSBsaXZpbmcuCisKKyAgICAgICAgT3IgbW9yZSBmb3JtYWxseToKKworICAgICAgICAgICAgSWYgdGhlIG9iamVjdCBPIHRoYXQgbW92ZXMgaXMgbWFya2VkIGFzIGxpdmluZyB0aGVuIGZpcnN0CisgICAgICAgICAgICBjYWxsIGluaXQoKSBvZiB0aGUgZGVzdGluYXRpb24gb2JqZWN0IEQgd2l0aCB0aGlzX3BsYXllcigpCisgICAgICAgICAgICBzZXQgdG8gTy4KKworICAgICAgICAgICAgVGhlbiBhcHBseSB0aGUgdHdvIGZvbGxvd2luZyBydWxlcyBmb3IgZWFjaCBvYmplY3QgQworICAgICAgICAgICAgaW5zaWRlIEQ6CisKKyAgICAgICAgICAgICAgICAgICAgSWYgQyBpcyBtYXJrZWQgYXMgbGl2aW5nIHRoZW4gY2FsbCBPLT5pbml0KCkgd2l0aAorICAgICAgICAgICAgICAgICAgICB0aGlzX3BsYXllcigpIHNldCB0byBDLgorCisgICAgICAgICAgICAgICAgICAgIElmIE8gaXMgbWFya2VkIGFzIGxpdmluZyB0aGVuIGNhbGwgQy0+aW5pdCgpIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgdGhpc19wbGF5ZXIoKSBzZXQgdG8gTy4KKworICAgICAgICAgICAgRmluYWxseSwgaWYgRCBpcyBtYXJrZWQgYXMgbGl2aW5nIHRoZW4gY2FsbCBPLT5pbml0KCksCisgICAgICAgICAgICB3aXRoIHRoaXNfcGxheWVyKCkgc2V0IHRvIEQuCisKKyAgICAgICAgU3RhcnRpbmcgd2l0aCAzLjIuMSwgdGhlIGFjdHVhbCBtb3ZlIGhhbmRsaW5nIGJlY2FtZSBwYXJ0IG9mIHRoZQorICAgICAgICBvYmplY3QgbGlicmFyeSwgc28gYSBnaXZlbiBpbnN0YWxsYXRpb24gbWF5IGltcGxlbWVudCBhbnkgb3RoZXIgc2NoZW1lCisgICAgICAgIG9mIGNhbGxpbmcgaW5pdCgpLgorCisgICAgICAgIE9uZSBjYXZlYXQ6IGNvbW1hbmRzIGRlZmluZWQgaW4gdGhlIHBsYXllciBvYmplY3QgZm9yIHRoZSBwbGF5ZXIKKyAgICAgICAgaGltc2VsZiBzaG91bGQgbm90IGJlIGRlZmluZWQgaW4gaW5pdCgpLCBhcyB0aGVzZSBjb21tYW5kcyB3b3VsZCBiZQorICAgICAgICBhZGRlZCB0byBfb3RoZXJfIHBsYXllcnMgd2hlbmV2ZXIgdGhleSBoYXBwZW4gdG8gYmUgbmVhcmJ5LiBJbnN0ZWFkCisgICAgICAgIHVzZSBhIHNlcGFyYXRlIGZ1bmN0aW9uICgiYWRkX3BsYXllcl9jb21tYW5kcygpIiBvciBzbykgd2hpY2gKKyAgICAgICAgaXMgY2FsbGVkIGR1cmluZyB0aGUgY3JlYXRpb24gb2YgdGhlIHBsYXllci4KKworRVhBTVBMRQorICAgICAgICAoVGhpcyBleGFtcGxlIGFzc3VtZXMgYSB0cmFkaXRpb25hbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKKyAgICAgICAgIG1vdmVtZW50IGhhbmRsaW5nKQorCisgICAgICAgIExldHMgc2F5IHdlIGhhdmUgYSBvYmplY3Qgc3RydWN0dXJlIG9mIGxpdmluZyAobDEgYW5kIGwyKSBhbmQKKyAgICAgICAgbm9uIGxpdmluZyBvYmplY3RzIChuMSBhbmQgbjIpIGFzIHRoZSBmb2xsb3dpbmc6CisKKyAgICAgICAgbDEKKyAgICAgICAgICAgbjEKKyAgICAgICAgICAgbDIKKyAgICAgICAgICAgbjIKKworICAgICAgICBJZiB3ZSBub3cgbW92ZSBhbm90aGVyIGxpdmluZyBvYmplY3QgbDMgaW50byBsMSwgdGhlIGNhbGwKKyAgICAgICAgc3VlcXVlbmNlIG9mIHRoZSBpbml0KCkgZnVuY3Rpb25zIGxvb2tzIGxpa2UgdGhpczoKKworICAgICAgICBsMS0+aW5pdCgpICBmaXJzdCBpbml0KCkgb2YgdGhlIGRlc3RpbmF0aW9uIHdpbGwgYmUgY2FsbGVkCisgICAgICAgIG4xLT5pbml0KCkgIG5vdyBpdGVyYXRlIHRocm93IHRoZSBpbnZlbnRvcnkgb2YgdGhlIGRlc3RpbmF0aW9uCisgICAgICAgIGwzLT5pbml0KCkKKyAgICAgICAgbDItPmluaXQoKQorICAgICAgICBuMi0+aW5pdCgpCisgICAgICAgIGwzLT5pbml0KCkgIGFuZCBmaW5hbGx5IGNhbGwgaW5pdCgpIG9mIHRoZSBvYmplY3QgdGhhdCBoYXMKKyAgICAgICAgICAgICAgICAgICAgYmVlbiBtb3ZlZAorCitTRUUgQUxTTworICAgICAgICBhZGRfYWN0aW9uKEUpLCBzZXRfZW52aXJvbm1lbnQoRSksIGVudmlyb25tZW50KEUpLCBtb3ZlX29iamVjdChFKSwKKyAgICAgICAgaG9va3MoQykKZGlmZiAtLWdpdCBhL2RvYy9hcHBsaWVkL2xvZ29uIGIvZG9jL2FwcGxpZWQvbG9nb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdmMDM3MwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9hcHBsaWVkL2xvZ29uCkBAIC0wLDAgKzEsMjggQEAKK1NZTk9QU0lTCisgICAgICAgIGludCBsb2dvbiAodm9pZCkKKyAgICAgICAgaW50IGxvZ29uIChpbnQgZmxhZykKKworREVTQ1JJUFRJT04KKyAgICAgICAgV2hlbiB0aGUgZHJpdmVyIGNyZWF0ZWQgYSBuZXcgY29ubmVjdGlvbiAoZWl0aGVyIGJ5IGFjY2VwdGluZworICAgICAgICBpdCBvciBieSBjcmVhdGluZyBpdCB3aXRoIG5ldF9jb25uZWN0KCkpIGFuZCBib3VuZCBpdCB0byBhbgorICAgICAgICBvYmplY3QsIGl0IHRoZW4gY2FsbHMgbG9nb24oKSBpbiB0aGF0IG9iamVjdC4KKworICAgICAgICBUaGUgbWV0aG9kIHNob3VsZCByZXR1cm4gMCBvbiBmYWlsdXJlLCBhbmQgZXZlcnl0aGluZyBlbHNlIG9uCisgICAgICAgIHN1Y2Nlc3MuCisKKyAgICAgICAgSWYgdGhlIGRyaXZlciBhdHRlbXB0ZWQgdG8gY3JlYXRlIGEgY29ubmVjdGlvbiBpbiB0aGUKKyAgICAgICAgYmFja2dyb3VuZCBhbmQgZmFpbGVkLCBpdCB3aWxsIGNhbGwgbG9nb24oLTEpIGluIHRoZSBpbnRlbmRlZAorICAgICAgICBvYmplY3QgdG8gaW5mb3JtIHRoZSBtdWRsaWIgYWJvdXQgdGhlIGZhaWx1cmUuCisKKyAgICAgICAgSWYgdGhlIG1hc3RlciBhdHRlbXB0ZWQgYSBzZWN1cmUgY29ubmVjdGlvbiBpbiBjb25uZWN0KEUpIGFuZAorICAgICAgICBkaWQgbm90IHNldCBhbiBleHBsaWNpdCBUTFMgY2FsbGJhY2ssIHRoZSBjYWxsIHRvIGxvZ29uKCkgd29uJ3QKKyAgICAgICAgaGFwcGVuIHVudGlsIHRoZSBUTFMgaGFuZHNoYWtlIGlzIGNvbXBsZXRlLiBJZiB0aGUgbWFzdGVyIHNldAorICAgICAgICBhIFRMUyBjYWxsYmFjaywgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGluIHBsYWNlIG9mIGxvZ29uKCkuCisKK0hJU1RPUlkKKyAgICAgICAgTERNdWQgMy4yLjEwIGFkZGVkIHRoZSBleHRlbmRlZCBtZWFuaW5nIGZvciBuZXRfY29ubmVjdCgpLgorICAgICAgICBMRE11ZCAzLjIuMTMvMy4zLjcxMyBzdHJlYW1saW5lZCB0aGUgaGFuZGxpbmcgb2Ygc2VjdXJlIGNvbm5lY3Rpb25zCisgICAgICAgIGR1cmluZyBsb2dvbi4KKworU0VFIEFMU08KKyAgICAgICAgY29ubmVjdChNKSwgbmV0X2Nvbm5lY3QoRSksIGV4ZWMoRSksIHRsc19pbml0X2Nvbm5lY3Rpb24oRSkKZGlmZiAtLWdpdCBhL2RvYy9hcHBsaWVkL21vZGlmeV9jb21tYW5kIGIvZG9jL2FwcGxpZWQvbW9kaWZ5X2NvbW1hbmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE0YjJlZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9hcHBsaWVkL21vZGlmeV9jb21tYW5kCkBAIC0wLDAgKzEsMjcgQEAKK1NZTk9QU0lTCisgICAgICAgIGludHxzdHJpbmcgPG5hbWU+KHN0cmluZyBjbWQpCisKK0RFU0NSSVBUSU9OCisgICAgICAgIEFmdGVyIHNldF9tb2RpZnlfY29tbWFuZChtb2IpIHdhcyBjYWxsZWQgZm9yIGFuIGludGVyYWN0aXZlCisgICAgICAgIG9iamVjdCBpb2IsIGFsbCBjb21tYW5kcyBmb3IgdGhhdCB1c2VyIHdpbGwgYmUgcGFzc2VkIHRvCisgICAgICAgIG1vYi0+PG5hbWU+KCksIGFuZCB0aGUgcmV0dXJuIHdpbGwgdGhlbiBiZSBjaGVja2VkIGZvcgorICAgICAgICBhY3Rpb25zLiBUaGUgYWN0dWFsIG5hbWUgb2YgdGhlIGxmdW4gdG8gY2FsbCBpcyBzcGVjaWZpZWQKKyAgICAgICAgYnkgdGhlIEhfTU9ESUZZX0NPTU1BTkRfRk5BTUUgaG9vayAtIHRyYWRpdGlvbmFsbHkgaXQncworICAgICAgICAnbW9kaWZ5X2NvbW1hbmQnLgorCisgICAgICAgIElmIHRoZSByZXN1bHQgaXMgYSBzdHJpbmcsIGl0IGlzIHRoZSBuZXcgY29tbWFuZCB0byBleGVjdXRlCisgICAgICAgIGluc3RlYWQgb2YgdGhlIGdpdmVuIG9uZS4gTm90ZSB0aGF0IGl0IGlzIG5vdCBwb3NzaWJsZSB0bworICAgICAgICBtYWtlIHNldmVyYWwgY29tbWFuZHMgZnJvbSBvbmUgdGhpcyB3YXkhCisgICAgICAgIElmIHRoZSByZXN1bHQgaXMgYSBub24temVybyBudW1iZXIsIHRoZSBnaXZlbiBjb21tYW5kIGlzIHRvCisgICAgICAgIGJlIGlnbm9yZWQuIEluIGNhc2Ugb2YgdGhlIGNsb3N1cmUvbGZ1biBzZXR0aW5nIHRoaXMgbWF5CisgICAgICAgIG1lYW4gdGhhdCB0aGUgY2xvc3VyZS9sZnVuIGFscmVhZHkgZXhlY3V0ZWQgaXQuCisgICAgICAgIElmIHRoZSByZXN1bHQgaXMgMCwgdGhlIG9yaWdpbmFsbHkgZ2l2ZW4gY29tbWFuZCBpcyB0byBiZQorICAgICAgICB1c2VkLgorCitISVNUT1JZCisgICAgICAgIEluIDMuMi4xQDEwOSB0aGUgbmFtZSBvZiB0aGUgbGZ1biB0byBjYWxsIG11c3QgYmUgc3BlY2lmaWVkCisgICAgICAgIHVzaW5nIHRoZSBIX01PRElGWV9DT01NQU5EX0ZOQU1FIGRyaXZlciBob29rLgorCisKK1NFRSBBTFNPCisgICAgICAgIHNldF9tb2RpZnlfY29tbWFuZChFKSwgaG9va3MoQykKZGlmZiAtLWdpdCBhL2RvYy9hcHBsaWVkL3BhcnNlX2NvbW1hbmRfYWRqZWN0aXZfaWRfbGlzdCBiL2RvYy9hcHBsaWVkL3BhcnNlX2NvbW1hbmRfYWRqZWN0aXZfaWRfbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzQ1ZGU5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2FwcGxpZWQvcGFyc2VfY29tbWFuZF9hZGplY3Rpdl9pZF9saXN0CkBAIC0wLDAgKzEsMTUgQEAKK1NZTk9QU0lTCisgICAgICAgIHN0cmluZyAqcGFyc2VfY29tbWFuZF9hZGplY3Rpdl9pZF9saXN0KHZvaWQpCisKK0RFU0NSSVBUSU9OCisgICAgICAgIFJldHVybiBhbGwgYWRqZWN0aXZlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QuCisKKyAgICAgICAgVXNlZCBieSBwYXJzZV9jb21tYW5kKCkuCisKK0VYQU1QTEUKKyAgICAgICAgc3RyaW5nICogcGFyc2VfY29tbWFuZF9hZGplY3Rpdl9pZF9saXN0KCkgeworICAgICAgICAgICAgcmV0dXJuICh7ICJpZmZpc2giIH0pOworICAgICAgICB9CisKK1NFRSBBTFNPCisgICAgICAgIHBhcnNlX2NvbW1hbmQoRSkKZGlmZiAtLWdpdCBhL2RvYy9hcHBsaWVkL3BhcnNlX2NvbW1hbmRfaWRfbGlzdCBiL2RvYy9hcHBsaWVkL3BhcnNlX2NvbW1hbmRfaWRfbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzhmYzczCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2FwcGxpZWQvcGFyc2VfY29tbWFuZF9pZF9saXN0CkBAIC0wLDAgKzEsMTAgQEAKK1NZTk9QU0lTCisgICAgICAgIHN0cmluZyAqcGFyc2VfY29tbWFuZF9pZF9saXN0KHZvaWQpCisKK0RFU0NSSVBUSU9OCisgICAgICAgIFJldHVybiB0aGUgbm9ybWFsIHNpbmd1bGFyIG5hbWVzIG9mIHRoaXMgb2JqZWN0LgorCisgICAgICAgIFVzZWQgYnkgcGFyc2VfY29tbWFuZCgpLgorCitTRUUgQUxTTworICAgICAgICBwYXJzZV9jb21tYW5kKEUpLCBwYXJzZV9jb21tYW5kX3B1cmFsX2lkX2xpc3QoQSkKZGlmZiAtLWdpdCBhL2RvYy9hcHBsaWVkL3BhcnNlX2NvbW1hbmRfcGx1cmFsX2lkX2xpc3QgYi9kb2MvYXBwbGllZC9wYXJzZV9jb21tYW5kX3BsdXJhbF9pZF9saXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlOGQ1NjQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYXBwbGllZC9wYXJzZV9jb21tYW5kX3BsdXJhbF9pZF9saXN0CkBAIC0wLDAgKzEsMTMgQEAKK1NZTk9QU0lTCisgICAgICAgIHN0cmluZyAqcGFyc2VfY29tbWFuZF9wbHVyYWxfaWRfbGlzdCh2b2lkKQorCitERVNDUklQVElPTgorICAgICAgICBSZXR1cm4gdGhlIHBsdXJhbCBuYW1lcyBvZiB0aGlzIG9iamVjdC4KKworICAgICAgICBJZiB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QgZXhpc3QsIHRoZSBwYXJzZXIgdHJpZXMgdG8gcGx1cmFsaXplCisgICAgICAgIHRoZSBuYW1lcyByZXR1cm5lZCBieSBwYXJzZV9jb21tYW5kX2lkX2xpc3QoKS4KKworICAgICAgICBVc2VkIGJ5IHBhcnNlX2NvbW1hbmQoKS4KKworU0VFIEFMU08KKyAgICAgICAgcGFyc2VfY29tbWFuZChFKSwgcGFyc2VfY29tbWFuZF9pZF9saXN0KEEpCmRpZmYgLS1naXQgYS9kb2MvYXBwbGllZC9wcmV2ZW50X2luc2VydCBiL2RvYy9hcHBsaWVkL3ByZXZlbnRfaW5zZXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNTRhZDkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYXBwbGllZC9wcmV2ZW50X2luc2VydApAQCAtMCwwICsxLDE5IEBACitERVBSRUNBVEVECitTWU5PUFNJUworICAgICAgICBpbnQgcHJldmVudF9pbnNlcnQoKQorCitERVNDUklQVElPTgorICAgICAgICBJbiBjb21wYXQgbW9kZSwgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IHRoZSBlZnVuIHRyYW5zZmVyKCkuCisKKyAgICAgICAgRGVmaW5lIHRoaXMgZnVuY3Rpb24gaW4gb2JqZWN0cyB0aGF0IGFyZSBuZWl0aGVyIGxpdmluZyBub3IKKyAgICAgICAgcm9vbXMgaWYgeW91IHdhbnQgdG8gcHJldmVudCB0byBwdXQgc29tZXRoaW5nIGludG8gY3VycmVudAorICAgICAgICBvYmplY3QuCisKKyAgICAgICAgUmV0dXJuIHRydWUgaWYgb2ssIG90aGVyd2lzZSAwLiBUaGF0IG1lYW5zIHRoYXQgZGVmYXVsdCBpcworICAgICAgICB0aGF0IGl0IGlzIG5vdCBwb3NzaWJsZSB0byBwdXQgc29tZXRoaW5nIGludG8gYW4gb2JqZWN0LgorCitISVNUT1JZCisgICAgICAgIERlcHJlY2F0ZWQgaW4gTERNdWQgMy4zIGFzIHRyYW5zZmVyKCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4KKworU0VFIEFMU08KKyAgICAgICAgdHJhbnNmZXIoRSksIGNhbl9wdXRfYW5kX2dldChBKQpkaWZmIC0tZ2l0IGEvZG9jL2FwcGxpZWQvcXVlcnlfd2VpZ2h0IGIvZG9jL2FwcGxpZWQvcXVlcnlfd2VpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMzBiODUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYXBwbGllZC9xdWVyeV93ZWlnaHQKQEAgLTAsMCArMSwxMyBAQAorREVQUkVDQVRFRAorU1lOT1BTSVMKKyAgICAgICAgaW50IHF1ZXJ5X3dlaWdodCh2b2lkKQorCitERVNDUklQVElPTgorICAgICAgICBJbiBjb21wYXQgbW9kZSB0aGlzIGxmdW4gaXMgdXNlZCBieSB0aGUgZWZ1biB0cmFuc2ZlcigpLgorICAgICAgICBOb3QgdGhhdCBubyBzZXRfd2VpZ2h0KCkgaXMgcmVxdWlyZWQgYnkgdGhlIHBhcnNlci4KKworSElTVE9SWQorICAgICAgICBEZXByZWNhdGVkIGluIExETXVkIDMuMyBhcyB0cmFuc2ZlcigpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuCisKK1NFRSBBTFNPCisgICAgICAgIHRyYW5zZmVyKEUpLCBhZGRfd2VpZ2h0KEEpCmRpZmYgLS1naXQgYS9kb2MvYXBwbGllZC9yZW1vdmUgYi9kb2MvYXBwbGllZC9yZW1vdmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI3MzJiMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9hcHBsaWVkL3JlbW92ZQpAQCAtMCwwICsxLDIxIEBACitTWU5PUFNJUworICAgICAgICBpbnQgcmVtb3ZlKHZvaWQpCisKK0RFU0NSSVBUSU9OCisgICAgICAgIHJlbW92ZSgpIGRvZXMgc29tZSBob3VzZWtlZXBpbmcgdG8gZW5zdXJlIGNvbnNpc3RlbmN5IGFuZCB0aGVuCisgICAgICAgIGRlc3RydWN0cyB0aGUgY3VycmVudCBvYmplY3QuCisKKyAgICAgICAgVGhpcyBsZnVuIGlzIG5vdCBhcHBsaWVkIGJ5IHRoZSBwYXJzZXIsIGJ1dCBieSBvdGhlciBvYmplY3RzCisgICAgICAgIHRvIHRlbGwgdGhlIGN1cnJlbnQgb2JqZWN0IHRvIHNlbGYtZGVzdHJ1Y3QuIHJlbW92ZSgpIHNob3VsZAorICAgICAgICBiZSBzdXBwbGllZCBieSB0aGUgYmFzZSBjbGFzc2VzIG9mIHRoZSBsaWJyYXJ5LiAgUmV0dXJuIDEgaWYKKyAgICAgICAgYWN0dWFsbHkgc2VsZi1kZXN0cnVjdGVkLCAwIG90aGVyd2lzZS4KKworICAgICAgICBBbiBhbHRlcm5hdGl2ZSB3YXkgdG8gZW5zdXJlIHRoZSBob3VzZWtlZXBpbmcgb24gZGVzdHJ1Y3Rpb24KKyAgICAgICAgaXMgdGhyb3VnaCB0aGUgdXNlIG9mIHRoZSBtYXN0ZXIgYXBwbHkgcHJlcGFyZV9kZXN0cnVjdCgpLgorCitOT1RFCisgICAgICAgIFlvdXIgYWN0dWFsIG11ZGxpYiBtYXkgbmFtZSB0aGlzIGxmdW4gZGlmZmVyZW50bHksICJyZW1vdmUoKSIgaXMKKyAgICAgICAganVzdCB0aGUgdHJhZGl0aW9uYWwgbmFtZS4KKworU0VFIEFMU08KKyAgICAgICAgZGVzdHJ1Y3QoRSksIHByZXBhcmVfZGVzdHJ1Y3QoTSkKZGlmZiAtLWdpdCBhL2RvYy9hcHBsaWVkL3Jlc2V0IGIvZG9jL2FwcGxpZWQvcmVzZXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIwOGJlYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9hcHBsaWVkL3Jlc2V0CkBAIC0wLDAgKzEsMzcgQEAKK1NZTk9QU0lTCisgICAgICAgIHZvaWQgcmVzZXQoaW50IGFyZykgICAgICAgIC8qIGNvbXBhdCBtb2RlICovCisgICAgICAgIHZvaWQgcmVzZXQodm9pZCkgICAgICAgICAgIC8qIG5hdGl2ZSBtb2RlICovCisKK0RFU0NSSVBUSU9OCisgICAgICAgIFRoZSBIX1JFU0VUIGhvb2sgZGVmaW5lcyB0aGUgZnVuY3Rpb24gb3IgY2xvc3VyZSB0byBiZSBjYWxsZWQKKyAgICAgICAgd2hlbiB0aGUgZHJpdmVyIG5lZWRzIHRvIHJlc2V0IGFuIG9iamVjdC4gSW4gb2xkZXIgZHJpdmVycworICAgICAgICB0aGlzIHdhcyBoYXJkd2lyZWQgdG8gdGhlIGxmdW4gcmVzZXQoKSwgYW5kIGEgbG90IG9mIGhvb2sKKyAgICAgICAgaW1wbGVtZW50YXRpb25zIHN0aWxsIGZvbGxvdyB0aGlzIHRyYWRpdGlvbi4KKworICAgICAgICBJbiBjb21wYXQgbW9kZSwgcmVzZXQoKSB3YXMgY2FsbGVkIHdpdGggYXJnIDAgYWZ0ZXIgdGhlIG9iamVjdAorICAgICAgICB3YXMgY29tcGlsZWQsIGFuZCB3aXRoIGFyZyAhPSAwIGV2ZXJ5IG9uY2UgaW4gYSB3aGlsZS4gICAgICAgIEluCisgICAgICAgIG5hdGl2ZSBtb2RlLCBjcmVhdGUoKSBpcyBjYWxsZWQgYWZ0ZXIgY29tcGlsaW5nLCBhbmQgcmVzZXQoKQorICAgICAgICBpcyBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHMgZXZlcnkgb25jZSBpbiBhIHdoaWxlLgorCisgICAgICAgIFNvLCBpZiB0aGUgYXJndW1lbnQgaXMgemVybywgdGhlIHBhcnNlciBpcyBydW5uaW5nIGluIGNvbXBhdAorICAgICAgICBtb2RlLCBhbmQgcmVzZXQoKSBtYXkgY2FsbCB5b3VyIGNyZWF0ZSgpIGNvZGUuIElmIGNyZWF0ZSgpIGlzCisgICAgICAgIGNhbGxlZCwgeW91J3JlIG9uIHRoZSBuZXcgdmVyc2lvbiBhbmQgcmVzZXQoKSBpcyBub3QgY2FsbGVkCisgICAgICAgIGZvciBvYmplY3QgY3JlYXRpb24uIFlvdSBtYXkgY2FsbCByZXNldCgpIGZyb20gY3JlYXRlKCkgYW5kCisgICAgICAgIHZpY2UgdmVyc2EsIGJ1dCBtYWtlIHN1cmUgdGhleSBkbyBub3QgY2FsbCBlYWNoIG90aGVyCisgICAgICAgIHJlY3Vyc2l2ZSBvbiBlaXRoZXIgdHlwZSBvZiBkcml2ZXIuCisKKyAgICAgICAgcmVzZXQoKSB3aWxsIGJlIGNhbGxlZCBvbmx5IGluIG9iamVjdHMgdGhhdCBoYXZlIGJlZW4gdXNlZAorICAgICAgICBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvIHJlc2V0KCksIGkuZS4gYSBmdW5jdGlvbiBpbiB0aGVtIHdhcworICAgICAgICBjYWxsZWQgKG90aGVyIHRoYW4gcmVzZXQoKSBvciBjbGVhbl91cCgpKSwgb3IgaXQgd2FzIG1vdmVkCisgICAgICAgIGFyb3VuZC4KKworICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHJlc2V0IHRoZSBzdGF0ZSBvZiB0aGUgb2JqZWN0IG9yCisgICAgICAgIGRvIHNvbWUgY2hlY2tzIG9yIHdoYXQgZXZlci4gVGhlIGdhbWUgd291bGRuJ3QgYmUgZnVuIGlmIG5vCisgICAgICAgIGNoYWxsZW5nZXMgcmVtYWluZWQuCisKKyAgICAgICAgRm9yIDMuMi4xLCB0aGUgbXVkbGliIGNhbiBiZSBwcm9ncmFtbWVkIHRvIGNhbGwgYW4gb3RoZXIgbGZ1bgorICAgICAgICB0aGFuIHJlc2V0KCkgdG8gcmVzZXQgYW4gb2JqZWN0LgorCitTRUUgQUxTTworICAgICAgICBjbGVhbl91cChBKSwgaGVhcnRfYmVhdChBKSwgY2FsbF9vdXQoRSksIGNyZWF0ZShBKSwgX19JTklUKEEpLAorICAgICAgICByZXNldChIKSwgaG9va3MoQyksIGluaXRpYWxpc2F0aW9uKE0pLCBuYXRpdmUoQykKZGlmZiAtLWdpdCBhL2RvYy9iYWxhbmNlL2FydGlsbGVyaWUgYi9kb2MvYmFsYW5jZS9hcnRpbGxlcmllCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNDI3OGQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmFsYW5jZS9hcnRpbGxlcmllCkBAIC0wLDAgKzEsNjMgQEAKK1JlZ2VsbiBmdWVyIEFydGlsbGVyaWUtT2JqZWt0ZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKzEuIERlZmluaXRpb24gdm9uIEFydGlsbGVyaWUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVW50ZXIgZGVtIEJlZ3JpZmYgIkFydGlsbGVyaWUiIGZhc3N0IG1hbiBhbGxlIE9iamVrdGUgenVzYW1tZW4sIGRpZQorenVzYWV0emxpY2ggenUgZGVuIHZvcmhhbmRlbmVuIEdpbGRlbmZhZWhpZ2tlaXRlbiBkdXJjaCBlaW4gdm9tCitTcGllbGVyIGluaXRpaWVydGVzIEtvbW1hbmRvIGRpcmVrdCBTY2hhZGVuIGFuIGVpbmVtIG9kZXIgbWVocmVyZW4KK0dlZ25lcm4gdmVydXJzYWNoZW4uCisKK1dhZmZlbiB1bmQgUnVlc3R1bmdlbiwgd2VsY2hlIHBlciBLb21tYW5kbyBTY2hhZGVuIHZlcnVyc2FjaGVuICh6LiBCLgorRWlzc3RhYiwgUmluZyB2b20gU2NobGFtbWRyYWNoZW4pLCBmYWxsZW4gdW50ZXIgZGllc2UKK0RlZmluaXRpb24uIFdhZmZlbiB1bmQgUnVlc3R1bmdlbiwgZGllICJ2b24gc2ljaCBhdXMiICh1ZWJsaWNoZXJ3ZWlzZQorcGVyIEhpdC0vRGVmZW5kRnVuYykgU2NoYWRlbiB2ZXJ1cnNhY2hlbiAoei4gQi4gVG9kZXNkcmFjaGVucGFuemVyLAorR29ibGlucmluZyksIGZhbGxlbiBuaWNodCB1bnRlciBkaWVzZSBEZWZpbml0aW9uLCBzaW5kIGFiZXIgbmF0dWVybGljaAorbmFjaCB3aWUgdm9yIGdlbmVobWlndW5nc3BmbGljaHRpZy4KKworMi4gQmFzaXNhbmZvcmRlcnVuZ2VuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAKK1NvbGNoZSBBcnRpbGxlcmllIG11c3MgZm9sZ2VuZGVuIEFuZm9yZGVydW5nZW4gZ2VudWVnZW46CisKKyBhLiBBcnRpbGxlcmllIF9tdXNzXyBQX0FUVEFDS19CVVNZIGJlYWNodGVuIChzZXR6ZW4vYWJmcmFnZW4pLgorIGIuIEFydGlsbGVyaWUgX211c3NfIGJlaSBWZXJ3ZW5kdW5nIEtvbnplbnRyYXRpb25zcHVua3RlIAorICAgIHZlcmJyYXVjaGVuLgorIGMuIEFydGlsbGVyaWUgZGFyZiBuaWNodCAoYnp3LiBudXIgYmVncmVuenQpIGdlaG9ydGV0IHdlcmRlbgorICAgIGtvZW5uZW4uCisgZC4gQXJ0aWxsZXJpZSBkYXJmIGJlaSBQYXJhbHlzZSBuaWNodCBhbmdld2VuZGV0IHdlcmRlbiBrb2VubmVuCisgICAgKFBfRElTQUJMRV9BVFRBQ0spLgorIGUuIEFydGlsbGVyaWUgbXVzcyBkdXJjaCBTZXR6ZW4gZGVyIFByb3BlcnR5IFBfSVNfQVJUSUxMRVJZIAorICAgIGdla2VubnplaWNobmV0IHNlaW4uIAorIGYuIEFydGlsbGVyaWUsIGRpZSBNdW5pdGlvbiBiZW51dHp0IG9kZXIgc2VsYnN0IE11bml0aW9uIGlzdCAod2llIHouQi4KKyAgICBXdXJmc3Rlcm5lKSwgbXVzcyBkYXMgVW5pdG9iamVrdCB1bmQgZGVuIGRvcnRpZ2VuIE1lY2hhbmlzbXVzIHp1bQorICAgIFplcmZhbGwgdm9uIE9iamVrdGVuIG51dHplbi4gRGFiZWkgc2luZCBQX1VOSVRfREVDQVlfSU5URVJWQUwgdW5kCisgICAgUF9VTklUX0RFQ0FZX1FVT1RBIHNvIHp1IHNldHplbiwgZGFzcyBkaWUgTXVuaXRpb24gZWluZSBIYWxid2VydHN6ZWl0CisgICAgendpc2NoZW4gNSB1bmQgMTAgIFRhZ2VuIGhhdCwgZGVyIGlocmVyIFZlcmZ1ZWdiYXJrZWl0IGFuZ2VtZXNzZW4KKyAgICBpc3QuIERpZXMgbGFlc3N0IHNpY2ggZHVyY2ggZ2VlaWduZXRlcyBFaW5zdGVsbGVuIGRlcworICAgIFByb3plbnRzYXR6ZXMgdW5kL29kZXIgZGVyIFJlc2V0emVpdCBlcnJlaWNoZW4uCisKKyAgICBCZWlzcGllbGU6CisgICAgU2V0enQgbWFuIHA9MSUgWmVyZmFsbCBwcm8gUmVzZXQgYW4sIGRhbm4gbXVzcyBkZXIgUmVzZXQKKyAgICBmdWVyIGVpbmUgSGFsYndlcnRzemVpdCB2b24gNSBUYWdlbiBkYW5uIAorICAgIHQ9bG4oMC41KS9sbigwLDk5KSo1KjI0KjM2MDAgcyBkYXVlcm4sIGRhcyBzaW5kIDYyMjQgcy4KKworICAgIE1vZWNodGUgbWFuIGxpZWJlciBkZW4gbm9ybWFsZW4gUmVzZXQsIGRlciBpbSBNaXR0ZWwgNDUgbWluLCBkLmguIDE2MAorICAgIFJlc2V0cyBpbiA1IFRhZ2VuIGJldHJhZWd0LCBzbyBlcmhhZWx0IG1hbiBmb2xnZW5kZW4gUHJvemVudHNhdHo6CisgICAgcCA9IDEtMCw1XigxLzE2MCkgZC5oLiBjYS4gMCw0MyUuCisgZy4gQXJ0aWxsZXJpZSBpc3QgaW1tZXIgZ2VuZWhtaWd1bmdzcGZsaWNodGlnLgorCitEZXRhaWxzIHdlcmRlbiBmYWxsd2Vpc2UgZW50c2NoaWVkZW4uCisKKworMy4gSW5rcmFmdHJldGVuCistLS0tLS0tLS0tLS0tLS0KKworRGllc2UgUmVnZWxuIHRyZXRlbiBhbSA1LiBBdWd1c3QgMjAwMyBpbiBLcmFmdC4KK1JldmlzaW9uIGFtIDUuIEFwcmlsIDIwMDgKK1JldmlzaW9uIGFtIDcuIEFwcmlsIDIwMTEKK1JldmlzaW9uIGFtIDI0LiBBdWd1c3QgMjAxMQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGV0enRlIEFlbmRlcnVuZzogTWksIDI0LjguIDIwMTEgdm9uIEh1bW5pCmRpZmYgLS1naXQgYS9kb2MvYmFsYW5jZS9hdHRyaWJ1dGUgYi9kb2MvYmFsYW5jZS9hdHRyaWJ1dGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFiN2Y5YgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iYWxhbmNlL2F0dHJpYnV0ZQpAQCAtMCwwICsxLDQ1IEBACisKKyBBVFRSSUJVVFZFUkFFTkRFUlVOR0VOCisKKyAgICBQb3NpdGl2ZSBWZXJhZW5kZXJ1bmdlbiBhbiBTcGllbGVyYXR0cmlidXRlbiBzaW5kIGF1ZiBqZWRlbiBGYWxsIHZvbgorICAgIGRlciBCYWxhbmNlIHp1IGdlbmVobWlnZW4uIERhYmVpIGdlbHRlbiBmb2xnZW5kZSBSZWdlbG46CisKKyAgIC0gU29sbCBlaW5lIEF0dHJpYnV0dmVyYWVuZGVydW5nIGR1cmNoIGRhcyBUcmFnZW4vWnVlY2tlbiB2b24gUnVlc3R1bmdlbgorICAgIG9kZXIgV2FmZmVuIGF1c2dlbG9lc3Qgd2VyZGVuLCBnZXNjaGllaHQgZGllcyB1ZWJlciBkYXMgU2V0emVuIGRlcgorICAgIFByb3BlcnR5IFBfTV9BVFRSX01PRC4gQXVjaCBuZWdhdGl2ZSBWZXJhZW5kZXJ1bmdlbiBzaW5kIHZvbiBkZXIgQmFsYW5jZQorICAgIHp1IGdlbmVobWlnZW4sIGRhIGRpZXNlIFByb3BlcnR5IG1pdCBQX1hfQVRUUl9NT0QgaW50ZXJhZ2llcnQuCisgICAtIFNvbGwgc2Nob24gZGVyIEJlc2l0eiBlaW5lcyBPYmpla3RlcyBkaWUgQXR0cmlidXR2ZXJhZW5kZXJ1bmcKKyAgICBhdXNsb2VzZW4sIG11c3MgUF9YX0FUVFJfTU9EIGdlc2V0enQgd2VyZGVuLiBBdWNoIG5lZ2F0aXZlIAorICAgIFZlcmFlbmRlcnVuZ2VuIHNpbmQgdm9uIGRlciBCYWxhbmNlIHp1IGdlbmVobWlnZW4sIGRhIGRpZXNlIFByb3BlcnR5IAorICAgIG1pdCBQX01fQVRUUl9NT0QgaW50ZXJhZ2llcnQuCisgICAtIFNvbGwgZWluZSBBdHRyaWJ1dHZlcmFlbmRlcnVuZyBvaG5lIEJlcnVlY2tzaWNodGlndW5nIGRlciBQcm9wZXJ0aWVzCisgICAgUF9NX0FUVFJfTU9EIHVuZCBQX1hfQVRUUl9NT0QgdmVy5G5kZXJ0IHdlcmRlbiwgZ2VzY2hpZWh0IGRhcyB1ZWJlciBkaWUKKyAgICBQcm9wZXJ0eSBQX1RJTUVEX0FUVFJfTU9ELiAKKworCisgICAgQXR0cmlidXR2ZXJhZW5kZXJ1bmdlbiBzaW5kIG1pdCBkZXIgQmFsYW5jZSBhYnp1a2xhZXJlbi4KKworICAgIEFscyBSZWdlbG4gc2llaHQgZGllIEJhbGFuY2Ugdm9yOgorICAgIC0gQmVpIE9iamVrdGVuIG1pdCBlaW5lbSBlaW56ZWxuZW4gQm9udXMgZGFyZiArMTAgbmljaHQgdWViZXJzY2hyaXR0ZW4gCisgICAgd2VyZGVuLgorICAgIC0gQmVpIE9iamVrdGVuIG1pdCBlaW5lbSBlaW56aWdlbiBNYWx1cyBkYXJmIC00IG5pY2h0IHVudGVyc2Nocml0dGVuCisgICAgd2VyZGVuLgorICAgIC0gQmVpIE9iamVrdGVuIG1pdCBtZWhyZXJlbiBwb3NpdGl2ZW4gb2RlciBuZWdhdGl2ZW4gVmVyYWVuZGVydW5nZW4KKyAgICBkYXJmIGRpZSBTdW1tZSArNCBiencuIC00IG5pY2h0IHVlYmVyL3VudGVyc2NocmVpdGVuLgorICAgIC0gRXMgZHVlcmZlbiBuaWNodCBtZWhyIGFscyAyIEF0dHJpYnV0ZSBpbiBlaW5lbSBPYmpla3QgZ2VhZW5kZXJ0CisgICAgd2VyZGVuLiBEaWUgRGlmZmVyZW56IGRhcmYgNiBuaWNodCB1ZWJlcnNjaHJlaXRlbi4KKyAgICAtIEphIGhvZWhlciBkaWUgQXR0cmlidXRzdmVyYWVuZGVydW5nLCB1bSBzbyBzY2hsZWNodGVyIHNvbGx0ZSBkYXMKKyAgICBPYmpla3Qgc29uc3Qgc2VpbiAoa2VpbmUgQUMgNTAgbWl0IEF1c2RhdWVyICsxMCBvZGVyIGF1Y2ggLTQpLgorICAgIC0gQWxsZSBPYmpla3RlLCBkaWUgQXR0cmlidXRlIHZlcmFlbmRlcm4sIG11ZXNzZW4gUnVlc3R1bmdzLSBvZGVyCisgICAgV2FmZmVuc2xvdHMgYmVsZWdlbi4gQXVzbmFobWUgc2luZCBLcmFua2hlaXRlbiwgZGllIGRlciBTcGllbGVyCisgICAgbmljaHQgc3RldWVybiBrYW5uLgorCisgU0lFSEUgQVVDSAorCisgICAgIGJhbGFuY2UsIHJ1ZXN0dW5nZW4sIHdhZmZlbiwgZmVybndhZmZlbiwgdW5pcXVlcywgbnBjcywKKyAgICAgcmVzaXN0ZW56ZW4sIGthbXBmb2JqZWt0ZSwgZ3Jlbnp3ZXJ0ZQorCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogVGh1IDIwMTEtMDQtMDcgYnkgSHVtbmkKKwpkaWZmIC0tZ2l0IGEvZG9jL2JhbGFuY2UvYXR0cmlidXRzdmVyYWVuZGVydW5nZW4gYi9kb2MvYmFsYW5jZS9hdHRyaWJ1dHN2ZXJhZW5kZXJ1bmdlbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGQ2YmYwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JhbGFuY2UvYXR0cmlidXRzdmVyYWVuZGVydW5nZW4KQEAgLTAsMCArMSw0NyBAQAorCisgQVRUUklCVVRWRVJBRU5ERVJVTkdFTgorCisgICAgUG9zaXRpdmUgVmVyYWVuZGVydW5nZW4gYW4gU3BpZWxlcmF0dHJpYnV0ZW4gc2luZCBhdWYgamVkZW4gRmFsbCB2b24KKyAgICBkZXIgQmFsYW5jZSB6dSBnZW5laG1pZ2VuLiBEYWJlaSBnZWx0ZW4gZm9sZ2VuZGUgUmVnZWxuOgorCisgICAtIFNvbGwgZWluZSBBdHRyaWJ1dHZlcmFlbmRlcnVuZyBkdXJjaCBkYXMgVHJhZ2VuL1p1ZWNrZW4gdm9uIFJ1ZXN0dW5nZW4KKyAgICBvZGVyIFdhZmZlbiBhdXNnZWxvZXN0IHdlcmRlbiwgZ2VzY2hpZWh0IGRpZXMgdWViZXIgZGFzIFNldHplbiBkZXIKKyAgICBQcm9wZXJ0eSBQX01fQVRUUl9NT0QuIEF1Y2ggbmVnYXRpdmUgVmVyYWVuZGVydW5nZW4gc2luZCB2b24gZGVyIEJhbGFuY2UKKyAgICB6dSBnZW5laG1pZ2VuLCBkYSBkaWVzZSBQcm9wZXJ0eSBtaXQgUF9YX0FUVFJfTU9EIGludGVyYWdpZXJ0LgorICAgLSBTb2xsIHNjaG9uIGRlciBCZXNpdHogZWluZXMgT2JqZWt0ZXMgZGllIEF0dHJpYnV0dmVyYWVuZGVydW5nCisgICAgYXVzbG9lc2VuLCBtdXNzIFBfWF9BVFRSX01PRCBnZXNldHp0IHdlcmRlbi4gQXVjaCBuZWdhdGl2ZSAKKyAgICBWZXJhZW5kZXJ1bmdlbiBzaW5kIHZvbiBkZXIgQmFsYW5jZSB6dSBnZW5laG1pZ2VuLCBkYSBkaWVzZSBQcm9wZXJ0eSAKKyAgICBtaXQgUF9NX0FUVFJfTU9EIGludGVyYWdpZXJ0LgorICAgLSBTb2xsIGVpbmUgQXR0cmlidXR2ZXJhZW5kZXJ1bmcgb2huZSBCZXJ1ZWNrc2ljaHRpZ3VuZyBkZXIgUHJvcGVydGllcworICAgIFBfTV9BVFRSX01PRCB1bmQgUF9YX0FUVFJfTU9EIHZlcuRuZGVydCB3ZXJkZW4sIGdlc2NoaWVodCBkYXMgdWViZXIgZGllCisgICAgUHJvcGVydHkgUF9USU1FRF9BVFRSX01PRC4gCisKKworICAgIEF0dHJpYnV0dmVyYWVuZGVydW5nZW4gc2luZCBtaXQgZGVyIEJhbGFuY2UgYWJ6dWtsYWVyZW4uCisKKyAgICBBbHMgUmVnZWxuIHNpZWh0IGRpZSBCYWxhbmNlIHZvcjoKKyAgICAtIEJlaSBPYmpla3RlbiBtaXQgZWluZW0gZWluemVsbmVuIEJvbnVzIGRhcmYgKzEwIG5pY2h0IHVlYmVyc2Nocml0dGVuIAorICAgIHdlcmRlbi4KKyAgICAtIEJlaSBPYmpla3RlbiBtaXQgZWluZW0gZWluemlnZW4gTWFsdXMgZGFyZiAtNCBuaWNodCB1bnRlcnNjaHJpdHRlbgorICAgIHdlcmRlbi4KKyAgICAtIEJlaSBPYmpla3RlbiBtaXQgbWVocmVyZW4gcG9zaXRpdmVuIG9kZXIgbmVnYXRpdmVuIFZlcmFlbmRlcnVuZ2VuCisgICAgZGFyZiBkaWUgU3VtbWUgKzQgYnp3LiAtNCBuaWNodCB1ZWJlci91bnRlcnNjaHJlaXRlbi4KKyAgICAtIEVzIGR1ZXJmZW4gbmljaHQgbWVociBhbHMgMiBBdHRyaWJ1dGUgaW4gZWluZW0gT2JqZWt0IGdlYWVuZGVydAorICAgIHdlcmRlbi4gRGllIERpZmZlcmVueiBkYXJmIDYgbmljaHQgdWViZXJzY2hyZWl0ZW4uCisgICAgLSBKYSBob2VoZXIgZGllIEF0dHJpYnV0c3ZlcmFlbmRlcnVuZywgdW0gc28gc2NobGVjaHRlciBzb2xsdGUgZGFzCisgICAgT2JqZWt0IHNvbnN0IHNlaW4gKGtlaW5lIEFDIDUwIG1pdCBBdXNkYXVlciArMTAgb2RlciBhdWNoIC00KS4KKyAgICAtIEFsbGUgT2JqZWt0ZSwgZGllIEF0dHJpYnV0ZSB2ZXJhZW5kZXJuLCBtdWVzc2VuIFJ1ZXN0dW5ncy0gb2RlcgorICAgIFdhZmZlbnNsb3RzIGJlbGVnZW4uIEF1c25haG1lIHNpbmQgS3JhbmtoZWl0ZW4sIGRpZSBkZXIgU3BpZWxlcgorICAgIG5pY2h0IHN0ZXVlcm4ga2FubiB1bmQgQWVobmxpY2hlcy4gRGFtaXQgc2luZCBhdWNoIFN0ZWxsZW4gdmVyYm90ZW4sCisgICAgYW4gZGVyIFNwaWVsZXIgZGVyYXJ0aWdlIEtyYW5raGVpdGVuIGdlemllbHQgYmVrb21tZW4gdW5kIGxvc3dlcmRlbgorICAgIGthbm4uIEltIFp3ZWlmZWwgZW50c2NoZWlkZXQgZGllIEJhbGFuY2UuCisKKyBTSUVIRSBBVUNICisKKyAgICAgYmFsYW5jZSwgcnVlc3R1bmdlbiwgd2FmZmVuLCBmZXJud2FmZmVuLCB1bmlxdWVzLCBucGNzLAorICAgICByZXNpc3Rlbnplbiwga2FtcGZvYmpla3RlLCBncmVuendlcnRlCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBUaHUgMjAxMS0wNi0xMCBieSBIdW1uaQorCmRpZmYgLS1naXQgYS9kb2MvYmFsYW5jZS9iYWxhbmNlIGIvZG9jL2JhbGFuY2UvYmFsYW5jZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NThkOGM1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JhbGFuY2UvYmFsYW5jZQpAQCAtMCwwICsxLDczIEBACisKK0t1cnplciBBYnJpc3MgdW5zZXJlcyBBdWZnYWJlbmJlcmVpY2hlczoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisxKSBXYXMgd2lyZCB2b24gdW5zIGJlZ3V0YWNodGV0PworCisgICBBbGxlIFJ1ZXN0dW5nZW4gdW5kIFdhZmZlbiwgZGllIHVlYmVyIGVpbmUgRGVmZW5kRnVuYyAKKyAgIHZlcmZ1ZWdlbiwgZGllIGZ1ZXIgU3BpZWxlciB2b24gTnV0emVuIGlzdC4KKworICAgQWxsZSBSdWVzdHVuZ2VuIHVuZCBXYWZmZW4sIGRpZSB1ZWJlciBlaW5lIEhpdEZ1bmMKKyAgIHZlcmZ1ZWdlbiwgZGllIGZ1ZXIgU3BpZWxlciB2b24gTnV0emVuIGlzdC4KKworICAgQWxsZSBSdWVzdHVuZ2VuIHVuZCBXYWZmZW4sIGRlcmVuIEFDL1dDIGRpZSBHZW5laG1pZ3VuZ3MtCisgICBncmVuemUgdWViZXJzY2hyZWl0ZXQuIEF1Y2ggc29sY2hlLCBiZWkgZGVuZW4gZGllcyBlcnN0CisgICBpbiBlaW5lciBIaXQtIG9kZXIgRGVmZW5kRnVuYyBkZXIgRmFsbCBpc3QuCisKKyAgIEFsbGUgUnVlc3R1bmdlbiB1bmQgV2FmZmVuLCBkaWUgZWluZW4gZ2VuZWhtaWd1bmdzLQorICAgcGZsaWNodGlnZW4gU2NoYWRlbnN0eXAgZW50aGFsdGVuLgorICAgCisgICBBbGxlIE9iamVrdGUsIGRpZSBpbiBpcmdlbmRlaW5lciBXZWlzZSBkYXMgS2FtcGZnZXNjaGVoZW4KKyAgIGJlZWluZmx1c3Nlbi4KKworMikgV2FzIGVudHNjaGVpZGVuIHdpciBmdWVyIEdpbGRlbj8KKworICAgTnVyIEthZW1wZmVyLUJvbmkgaW4gV2FmZmVuIHVuZCBSdWVzdHVuZ2VuIChXYWZmZW5zY2hsYWcsIEZpbnRlKS4gCisgICBBbGxlIGFuZGVyZW4gR2lsZGVuLCB6LkIuIFVudGVyc3R1ZXR6dW5nZW4gZnVlciBaYXViZXJlci1TcHJ1ZWNoZSwgCisgICBDaGFvc2tvbXBvbmVudGVuIHVudGVybGllZ2VuIGRlbSB6dXN0YWVuZGlnZW4gR2lsZGVuTWFnaWVyIHVuZCAKKyAgIGRlciBHaWxkZW5CYWxhbmNlLgorCisgICBTZWxic3QgdWViZXIgRWluc2NocmFlbmt1bmdlbiBmdWVyIEdpbGRlbiBoYWJlbiB3aXIgbmljaHQgenUgCisgICBlbnRzY2hlaWRlbi4gV2VubiBlaW4gTWFnaWVyIHNlaW4gT2JqZWt0IG51ciBmdWVyIENoYW90ZW4gbnV0ei0KKyAgIGJhciBtYWNoZW4gbW9lY2h0ZSwgbWFjaHQgZXIgZGFzIGViZW4uIE9kZXIgd2VubiBlciBUYW5qaWFuIGF1cy0KKyAgIHNjaGxpZXNzZW4gbW9lY2h0ZSBlYmVuZmFsbHMuIERhcyBuZW5udCBzaWNoIGRhbm4gUHJvZ3JhbW1pZXItCisgICBmcmVpaGVpdC4KKworMykgV2FzIGlzdCBtaXQgT2JqZWt0ZW4sIGRpZSBrZWluZSBXYWZmZS9SdWVzdHVuZyBzaW5kPworCisgICBIaWVyIHVudGVybGllZ2VuIGFsbGUgT2JqZWt0ZSB1bnNlcmVyIEJlZ3V0YWNodHVuZywgZGllIGlyZ2VuZC0KKyAgIHdpZSBlaW5lIGthbXBmcmVsZXZhbnRlIEJlZGV1dHVuZyBoYWJlbi4gRGF6dSB6YWVobHQ6CisKKyAgIC0gU2NoYWRlbiB2ZXJ1cnNhY2hlbiBrb2VubmVuIChTYWV1cmVrdWdlbG4pCisgICAtIFBhcmFseXNldG9vbHMgKGdyYXVlIFN0ZWluZSkKKyAgIC0gQmVnbGVpdC1OcGMgKEVpbmhvcm4sIEZldWVyZWxlbWVudGFyKQorICAgLSBJbmZvcm1hdGlvbmVuIHVlYmVyIGVpbmdlaGVuZGUgU2NoYWRlbnN0eXBlbiBnZWJlbgorICAgLSBXYWZmZW4vUnVlc3R1bmdlbiBtYW5pcHVsaWVyZW4ga29lbm5lbiAoR2Vpc3RlcmhhdWNoLCBCbHV0c3Ryb3BmZW4pCisgICAtIEluZm9ybWF0aW9uZW4gdWViZXIgTnBjLCBSYWV1bWUsIFJlc2V0LVplaXRlbiB1c3cuIGF1c2dlYmVuCisgICAtIFdlcnRlIG1hbmlwdWxpZXJlbiAoQXR0cmlidXRlIG9kZXIgR2VzY2h3aW5kaWdrZWl0IGVyaG9laGVuKQorCisgICBFaW4gU29uZGVyZmFsbCBzdGVsbGVuIGhpZXIgT2JqZWt0ZSBkYXIsIGRpZSB2b20gVHlwIEFUX01JU0Mgb2RlcgorICAgV1RfTUlTQyBzaW5kLiBGdWVyIGRpZXNlIGdpbHQ6CisKKyAgIC0gU2llIGR1ZXJmZW4ga2VpbmVybGVpIHBvc2l0aXZlIFZlcmFlbmRlcnVuZ2VuIGltIFNwaWVsZXIgdm9yLQorICAgICBuZWhtZW4KKyAgIC0gU2llIGR1ZXJmZW4ga2VpbmVybGVpIGthbXBmcmVsZXZhbnRlIEJlZGV1dHVuZyBoYWJlbiAoaW0gU2lubmUgCisgICAgIHZvbiBTcGVsbC0vU2tpbGwtL0dlZ25lci1NYW5pcHVsYXRpb24sIEF0dHJpYnV0c3ZlcmFlbmRlcnVuZ2VuLCAKKyAgICAgSGVpbHVuZ2VuLCBJbmZvcm1hdGlvbmVuIHUuYS4pIG9kZXIgc29uc3R3aWUgZWluZW4gS2FtcGYgYmUtCisgICAgIGVpbmZsdXNzZW4KKyAgIC0gU2llIGR1ZXJmZW4gdWViZXIga2VpbmUgSGl0LSBvZGVyIERlZmVuZEZ1bmMgdmVyZnVlZ2VuLiBEaWUgQUMgCisgICAgIGJ6dy4gV0Mgc29sY2hlciBPYmpla3RlIGlzdCBpbW1lciAwCisKKzQpIFdvcmF1ZiBpc3QgYmVzb25kZXJzIHp1IGFjaHRlbj8KKworICAgRGllIEdyZW56d2VydGUgYmVpIFdhZmZlbiB1bmQgUnVlc3R1bmdlbiBzb2xsZW4gZGVuIGZ1ZXIgZGllc2VuIAorICAgVHlwIGdlbHRlbmRlbiBXZXJ0IG51ciBpbSBzZWx0ZW5zdGVuIEZhbGwgdWViZXJzY2hyZWl0ZW4uIERpZXMKKyAgIGdpbHQgYXVjaCBmdWVyIFdlcnRlIGVpbmVyIERlZmVuZC0gb2RlciBIaXRGdW5jLgorCisgICBCb25pIGF1cyBlaW5lciBEZWZlbmQtIG9kZXIgSGl0RnVuYyBzaW5kIElNTUVSIHBlciByYW5kb20oKSB6dQorICAgZ2ViZW4hCisKKyAgIEJlc29uZGVycyBndXRlIE9iamVrdGUgaGFiZW4gdWViZXIgUmVzdHJpa3Rpb25lbiB6dSB2ZXJmdWVnZW4uCisKKyAgIEJlc29uZGVycyBndXRlIE9iamVrdGUgc29sbHRlbiBhdWNoIE5hY2h0ZWlsZSBoYWJlbi4KKwpkaWZmIC0tZ2l0IGEvZG9jL2JhbGFuY2UvYmVnbGVpdG5wY3MgYi9kb2MvYmFsYW5jZS9iZWdsZWl0bnBjcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODU1NGE1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JhbGFuY2UvYmVnbGVpdG5wY3MKQEAgLTAsMCArMSwyMiBAQAorQkVHTEVJVE5QQ1MKKy0tLS0tLS0tLS0tCisKK01hbmNoZSBOUENzIHVudGVyc3R1ZXR6ZW4gZGVuIFNwaWVsZXIgaW0gS2FtcGYgdW5kIGxhdWZlbiBtaXQgaWhtIG1pdC4KK0FscyBSZWdlbG4gZnVlciBkaWVzZSBOUENzIGhhdCBkaWUgQmFsYW5jZSBmb2xnZW5kZSBSZWdlbG4gYXVmZ2VzdGVsbHQ6CisKK2EuIE5QQ3MgX211ZXNzZW5fIHNpY2ggaW0gU3BpZWxlciByZWdpc3RyaWVyZW4uCitiLiBNYW4gZGFyZiBudXIgZWluZW4gS2FtcGZoZWxmZXIgenVyIGdsZWljaGVuIFplaXQgYmVzY2h3b2VyZW4sIGF1c25haG1lbgora29lbm5lbiBzdGF0aXNjaGUgTlBDcyBuYWNoIEFic3ByYWNoZSBzZWluLgorYy4gS2VpbiBLYW1wZmhlbGZlciBkYXJmIGVpbmUgc3RhZXJrZXJlIFJlc2lzdGVueiBhbHMgLTAuNSBoYWJlbgorZC4gSXN0IGVpbiBLYW1wZmhlbGZlciBpbiBlaW5lciBiZXN0aW1tdGVuIEthdGhlZ29yaWUgKEFuZ3JpZmYsIHZlcnRlaWRpZ3VuZworLi4uKSBkZXV0bGljaCBiZXNzZXIgYWxzIER1cmNoc2Nobml0dGxpY2hlIEdpbGRlbi1OUENzLCBtdXNzIGVyIGVudHNwcmVjaGVuZGUKK05hY2h0ZWlsZSBtaXRicmluZ2VuLiBEZW5rYmFyIHdhZXJlbiB6LkIuOiBLdXJ6ZSBIYWx0YmFya2VpdCwgdGV1ZXIgaW4gZGVyCitBbnNjaGFmZnVuZywgdGV1ZXIgaW0gVW50ZXJoYWx0LCBrYW5uIG5pY2h0IGJldGFua3QvZ2VoZWlsdC9iZXdlZ3Qgd2VyZGVuLCBoYXQKK251ciB3ZW5pZyBMUCwgZ3Jvc3NlIEFuZmFlbGxpZ2tlaXRlbiB1c3cuCitlLiBJbSBOb3JtYWxmYWxsIHNvbGx0ZW4gQmVnbGVpdC1OUENzIG5pY2h0IGluIFRlYW1zIGVpbnRyZXRlbi4gRWluZSBBdXNuYWhtZQora29lbm50ZSB6LkIuIGVpbiBCb2dlbnNjaHVldHplLCBkZXIgc2ljaCBpbiBkaWUgendlaXRlIFJlaWhlIHN0ZWxsdCBvZGVyIGV0d2FzCitpbiBkZXIgQXJ0IHNlaW4uIAorCitadW0gUmVnaXN0cmllcmVuIGRlciBOUENzIHNpZWhlIFJlZ2lzdGVySGVscGVyTlBDIHVuZCBVbnJlZ2lzdGVySGVscGVyTlBDLgorCisyMDExLTAyLTIyLCBIdW1uaQpkaWZmIC0tZ2l0IGEvZG9jL2JhbGFuY2UvZmVybndhZmZlbiBiL2RvYy9iYWxhbmNlL2Zlcm53YWZmZW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA3MDk4NAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iYWxhbmNlL2Zlcm53YWZmZW4KQEAgLTAsMCArMSw5NCBAQAorTWl0IEZlcm53YWZmZW4gc2luZCB1ZWJyaWdlbnMgYXVzbmFobXNsb3MgV2FmZmVuIGdlbWVpbnQsIGRpZSBNdW5pdGlvbiAKK2Jlbm9ldGlnZW4sIG5pY2h0IGV0d2EgU3BlZXJlIG9kZXIgZGVyZ2xlaWNoZW4uIEFsbGUgRmVybndhZmZlbiBzaW5kIAorYXVzbmFobXNsb3MgZ2VuZWhtaWd1bmdzcGZsaWNodGlnLCBkYXMgZ2lsdCBhdWNoIGZ1ZXIgamVnbGljaGUgTXVuaXRpb24uIAorICAgICAKK1Byb3BlcnRpZXMgaW4gRmVybndhZmZlbiB1bmQgaWhyZSBCZWRldXR1bmc6CisKKyAgICAgUF9XQworICAgICAgICBWb3JzaWNodCBtaXQgZGllc2VyIFByb3BlcnR5LiBCZWkgRmVybndhZmZlbiBnaWJ0IHNpZSBfbnVyXyBkZW4KKyAgICAgICAgU2NoYWRlbiBiZWkgWndlY2tlbnRmcmVtZHVuZyBkZXIgV2FmZmUgYWxzIEtudWVwcGVsIGFuLiAKKyAgICAgICAgRGVtZW50c3ByZWNoZW5kIGlzdCBkaWVzZXIgV2VydCBleHRyZW0gbmllZHJpZyB6dSBoYWx0ZW4uCisgICAgICAgIFN0YW5kYXJkd2VydCBpc3QgaGllciAzMCwgZGVyIGF1Y2ggbnVyIGluIEF1c25haG1lZmFlbGxlbiAKKyAgICAgICAgdWViZXJzY2hyaXR0ZW4gd2VyZGVuIHNvbGx0ZS4gS2F1bSBlaW5lIEFybWJydXN0IG9kZXIgZWluIEJvZ2VuIAorICAgICAgICB0YXVndCBudW5tYWwgYWxzIGdyb3NzYXJ0aWdlIE5haGthbXBmd2FmZmUuCisKKyAgICAgUF9RVUFMSVRZCisgICAgICAgIFdpcmQgbnVyIGJlaW0gTmFoa2FtcGYgbWl0IGRlciBXYWZmZSBiZWFjaHRldC4gU3RhbmRhcmRtYWVzc2lnIGF1ZgorICAgICAgICAxMDAgZ2VzZXR6dCwgZGEgQm9lZ2VuIHVuZCBBcm1icnVlc3RlIGxlaWNodCBiZXNjaGFlZGlndCB3ZXJkZW4sCisgICAgICAgIHdlbm4gbWFuIGRhbWl0IGF1ZiBqZW1hbmRlbiBlaW5wcnVlZ2VsdC4KKworICAgICBQX0hJVF9GVU5DIAorICAgICAgICBIaXRGdW5jIGZ1ZXIgZGVuIF9OYWhrYW1wZl8uIEhhdCBiZWltIFNjaHVzcyBtaXQgZGVyIFdhZmZlIGtlaW5lbgorICAgICAgICBFaW5mbHVzcy4gCisgICAgICAgICAgICAgICAgCisgICAgIFBfTlJfSEFORFMKKyAgICAgICAgQm9lZ2VuIHVuZCBBcm1icnVlc3RlIHNpbmQgaW4gamVkZW0gRmFsbCB6d2VpaGFlbmRpZy4gRWluaGFlbmRpZ2UKKyAgICAgICAgRmVybndhZmZlbiBzaW5kIGFiZXIgZGVua2JhciAoU2NobGluZ2VuIHp1bSBTY2hsZXVkZXJuIGtsZWluZXIgCisgICAgICAgIFN0ZWluZSB6LkIuKQorICAgICAgICAKKyAgICAgUF9TSE9PVElOR19XQworICAgICAgICBEaWUgQmFzaXMtV2FmZmVua2xhc3NlIGRlciBGZXJud2FmZmUuIFp1IGlociB3aXJkIGRpZSBXYWZmZW5rbGFzc2UKKyAgICAgICAgZGVyIE11bml0aW9uIGFkZGllcnQsIHVtIGRlbiBlbmRndWVsdGlnZW4gQW5ncmlmZnN3ZXJ0IGJlaW0gU2NodXNzCisgICAgICAgIHp1IGJlcmVjaG5lbi4KKyAgICAgCisgICAgIFBfUkFOR0UgCisgICAgICAgIFJlaWNod2VpdGUgZGVyIFdhZmZlIGluIE1ldGVybi4gV2ljaHRpZywgd2VubiBhdXMgQ29udGFpbmVybiAKKyAgICAgICAgKFdhY2h0dWVybWVuLCBTY2hpZmZlbiwgZXRjLikgbmFjaCBhdXNzZW4gZ2VzY2hvc3NlbiB3aXJkLgorICAgICAgICBEYW1pdCBkYXMgZnVua3Rpb25pZXJ0LCBtdXNzIGRpZXNlciBXZXJ0IGhvZWhlciBzZWluIGFscyBkZXIKKyAgICAgICAgaW0gQ29udGFpbmVyIGRlZmluaWVydGUgKHN0ZWh0IGRvcnQgaW4gZGVyIFBfU0hPT1RJTkdfQVJFQSkuCisgICAgCisgICAgIFBfU1RSRVRDSF9USU1FCisgICAgICAgIEFuemFobCBkZXIgUnVuZGVuLCBkaWUgenVtIExhZGVuL1NwYW5uZW4gZGVyIFdhZmZlIGJlbm9ldGlndAorICAgICAgICB3ZXJkZW4uIDEgaXN0IGhpZXIgZGVyIFN0YW5kYXJkd2VydCwgZGFzIGJlZGV1dGV0LCBlcyBrYW5uIGplZGUKKyAgICAgICAgUnVuZGUgZ2VzY2hvc3NlbiB3ZXJkZW4uCisgICAgIAorICAgICBQX0FNTVVOSVRJT04KKyAgICAgICAgQmVub2V0aWd0ZXIgTXVuaXRpb25zdHlwLiBIaWVyIGlzdCBlaW5lIGRlciBtb2VnbGljaGVuIEtvbnN0YW50ZW4KKyAgICAgICAgKE1VTl8qKSBlaW56dXNldHplbiAoei5CLiBNVU5fQVJST1cgZnVlciBCb2VnZW4pLgorICAgICAKKyAgICAgUF9OT0dFVAorICAgICAgICBIYXQgYmVpIEZlcm53YWZmZW4gZWluZSB6dXNhZXR6bGljaGUgQmVkZXV0dW5nLiBXZW5uIGdlc2V0enQsIG11c3MKKyAgICAgICAgZGllIFdhZmZlbiBuaWNodCBnZXp1ZWNrdCB3ZXJkZW4sIHVtIHNpZSBhYmZldWVybiB6dSBrb2VubmVuLiBEYXMKKyAgICAgICAgaXN0IHouQi4gZnVlciBLYXRhcHVsdGUgZ2VkYWNodCwgZGllIGltIFJhdW0gc3RlaGVuLgorICAgICAgICAKKyAgICAgRnVlciBkaWUgTXVuaXRpb24gZ2lidCBlcyBrZWluIFN0YW5kYXJkb2JqZWt0LiBXaWNodGlnIGlzdCBudXIsIGRhc3MgCisgICAgIGRpZSBlbnRzcHJlY2hlbmRlbiBQcm9wZXJ0aWVzIGdlc2V0enQgc2luZC4gTm9ybWFsZXJ3ZWlzZSBzb2xsdGUgZGllIAorICAgICBNdW5pdGlvbiBuYXR1ZXJsaWNoIGVpbmUgVW5pdCBzZWluLCBhYmVyIGF1Y2ggRWluemVsb2JqZWt0ZSAoZWluCisgICAgIGJlc29uZGVyZXIgUGZlaWwgb2RlciBlaW4gZ3Jvc3NlciBTdGVpbiBmdWVyIGVpbiBLYXRhcHVsdCkgc2luZCAKKyAgICAgbW9lZ2xpY2guCisKK1Byb3BlcnRpZXMgZnVlciBkaWUgTXVuaXRpb24gc2luZDoKKyAgICAgCisgICAgIFBfU0hPT1RJTkdfV0MKKyAgICAgICAgRGllIFdhZmZlbmtsYXNzZSBkZXIgTXVuaXRpb24uIFdpcmQgenVyIFdDIGRlciBXYWZmZSBhZGRpZXJ0LgorICAgICAgICAKKyAgICAgUF9EQU1fVFlQRQorICAgICAgICBTY2hhZGVuc3R5cCBkZXIgTXVuaXRpb24uIFNvbGx0ZSBub3JtYWxlcndlaXNlIERUX1BJRVJDRSBmdWVyIAorICAgICAgICBQZmVpbGUgYWxsZXIgQXJ0IHVuZCBEVF9CTFVER0VPTiBmdWVyIHN0dW1wZmUgTXVuaXRpb24gd2llIFN0ZWluZQorICAgICAgICBzZWluLiBNYWdpc2NoZSBTY2hhZGVuc2FydGVuIHNpbmQgYWJlciBuYXR1ZXJsaWNoIG1vZWdsaWNoLgorICAgICAgICAKKyAgICAgUF9ISVRfRlVOQworICAgICAgICBIaXRGdW5jLCBkaWUgYmVpbSBTY2h1c3MgbWl0IGRlciBNdW5pdGlvbiBiZW51dHp0IHdpcmQuCisgICAgICAgIAorICAgICBBdXNzZXJkZW0gbXVzcyBpbiBkZXIgTXVuaXRpb24gbWl0dGVscyBBZGRJZCgpIGRlciBlbnRzcHJlY2hlbmRlCisgICAgIE11bml0aW9uc3R5cCBnZXNldHp0IHdlcmRlbiwgei5CLiBNVU5fQVJST1cuCisKK0dlbmVobWlndW5nc2dyZW56ZW46CistLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIEFsbGUgV2FmZmVuIGRpZXNlciBBcnQgc2luZCBncnVuZHNhZXR6bGljaCBnZW5laG1pZ3VuZ3NwZmxpY2h0aWcuCisgICAgIEZvbGdlbmRlIFdlcnRlIHNvbGx0ZW4gYWxsZXJkaW5ncyBPYmVyZ3JlbnplbiBkYXJzdGVsbGVuLCBkaWUKKyAgICAgaW0gTm9ybWFsZmFsbCBuaWNodCB6dSBVZWJlcnNjaHJlaXRlbiBzaW5kOgorICAgICAKKyAgICAgV2FmZmUga2FubiBqZWRlIFJ1bmRlIGFiZ2VmZXVlcnQgd2VyZGVuOiAgUF9TSE9PVElOR19XQyAxMDAKKyAgICAgV2FmZmUgYnJhdWNodCBlaW5lIExhZGV6ZWl0ICAgICAgICAgICAgOiAgUF9TSE9PVElOR19XQyAxMzAKKyAgICAgCisgICAgIERpZSBPYmVyZ3JlbnplIGZ1ZXIgTXVuaXRpb24gbGllZ3QgYmVpIDogIFBfU0hPT1RJTkdfV0MgNjAuCisKKyAgICAgVm9yc2ljaHRpZyBtaXQgUF9TSE9PVElOR19BUkVBIGluIFJhZXVtZW4vQ29udGFpbmVybi4gCisKKyAgICAgQmlzaGVyIGlzdCBkaWVzZXMgU2NoaWVzc2VuIHZvbiBSYXVtIHp1IFJhdW0gd2VpdGVzdGdlaGVuZCB1bmdldGVzdGV0LAorICAgICB1bmQgZXMgaXN0IG5pY2h0IGtsYXIsIHdlbGNoZSBQcm9ibGVtZSBkYXMgdmVydXJzYWNoZW4ga2Fubi4gV2VubiAKKyAgICAgZXZlbnR1ZWxsZSBaaWVsZSBrZWluZSBNb2VnbGljaGtlaXQgaGFiZW4sIHNpY2ggenUgd2VocmVuIG9kZXIgCisgICAgIHdlZ3p1bGF1ZmVuLCBpc3Qgc2NobmVsbCBqZWdsaWNoZSBCYWxhbmNlIGRhaGluLiBEaWUgUmVnaW9uc21hZ2llcgorICAgICBoYWJlbiBiZWkgQWJuYWhtZSB2b24gR2ViaWV0ZW4gZGFyYXVmIHp1IGFjaHRlbiwgZGFzcyBkaWVzZSBQcm9wZXJ0eQorICAgICBudXIgaW4gd2VuaWdlbiwgZ3V0IGJlZ3J1ZW5kZXRlbiBSYWV1bWVuIGdlc2V0enQgd2lyZC4KZGlmZiAtLWdpdCBhL2RvYy9iYWxhbmNlL2dyZW56d2VydGUgYi9kb2MvYmFsYW5jZS9ncmVuendlcnRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZmMxYTYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmFsYW5jZS9ncmVuendlcnRlCkBAIC0wLDAgKzEsNTggQEAKKyBHUkVOWldFUlRFCisKKyAgICBXYWZmZW46CisgICAKKyAgICAgIEVpbmhhZW5kaWdlIFdhZmZlbiAgOiAgICBhYiBQX1dDID49IDE0MAorICAgICAgWndlaWhhZW5kaWdlIFdhZmZlbiA6ICAgIGFiIFBfV0MgPj0gMTc1CisKKyAgICAgIEZ1ZXIgV2FmZmVuIGRpZSBlaW5lbiBuaWNodHBoeXNpa2FsaXNjaGVuIFNjaGFkZW5zdHlwIGVudGhhbHRlbjoKKworICAgICAgRWluaGFlbmRpZ2UgV2FmZmVuICA6ICAgIGFiIFBfV0MgPj0gMTIwCisgICAgICBad2VpaGFlbmRpZ2UgV2FmZmVuIDogICAgYWIgUF9XQyA+PSAxNTAKKworICAgICAgR2VuZWhtaWd1bmdzcGZsaWNodGlnIHNpbmQgYXVjaCBnZW5lcmVsbCBXYWZmZW4sIGRpZSBhbHMgU2NoYWRlbnMtCisgICAgICB0eXAgRFRfVEVSUk9SLCBEVF9TT1VORCwgRFRfQUlSIG9kZXIgRFRfU1FVRUVaRSBlbnRoYWx0ZW4sIHVuYWJoYWVuZ2lnCisgICAgICB2b24gZGVyIFdDLgorCisgICAgICBEZXIgU2NoYWRlbnN0eXAgRFRfRVhQTE9TSU9OIHdpcmQgbmljaHQgbWVociBnZW5laG1pZ3QuCisKKyAgICAgIEFsbGUgV2FmZmVuIG1pdCBIaXRGdW5jIG9kZXIgZW50c3ByZWNoZW5kZXIgRnVua3Rpb24gbXVlc3NlbiBnZW5laG1pZ3QKKyAgICAgIHdlcmRlbiAoRXMgc2VpIGRlbm4gZGllc2Ugd2lya2VuIG51ciBiZWkgIWludGVyYWN0aXZlKCkgb2RlciBlcmhvZWhlbiAKKyAgICAgIGRlbiBTY2hhZGVuIG5pY2h0KS4KKworICAgIFJ1ZXN0dW5nZW46CisKKyAgICAgICstLS0tLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgfCBSdWVzdHVuZ3N0eXAgfCBNQVhfQUMgfCBHZW5laG1pZ3VuZ3NncmVuemUgKGlua2wuKSB8CisgICAgICArLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgIHwgQVRfQU1VTEVUICAgIHwgICAgMiAgIHwgICAgICAgICAgICAgLS0gICAgICAgICAgICAgfAorICAgICAgfCBBVF9BUk1PVVIgICAgfCAgIDUwICAgfCAgICAgICAgICAgICAzOCAgICAgICAgICAgICB8CisgICAgICB8IEFUX0JFTFQgICAgICB8ICAgIDIgICB8ICAgICAgICAgICAgIC0tICAgICAgICAgICAgIHwKKyAgICAgIHwgQVRfQk9PVCAgICAgIHwgICAgNiAgIHwgICAgICAgICAgICAgIDUgICAgICAgICAgICAgfAorICAgICAgfCBBVF9DTE9BSyAgICAgfCAgIDEwICAgfCAgICAgICAgICAgICAgOCAgICAgICAgICAgICB8CisgICAgICB8IEFUX0dMT1ZFICAgICB8ICAgIDUgICB8ICAgICAgICAgICAgICA1ICAgICAgICAgICAgIHwKKyAgICAgIHwgQVRfSEVMTUVUICAgIHwgICAxNSAgIHwgICAgICAgICAgICAgMTMgICAgICAgICAgICAgfAorICAgICAgfCBBVF9RVUlWRVIgICAgfCAgICAwICAgfCAgICAgICAgICAgICAtLSAgICAgICAgICAgICB8CisgICAgICB8IEFUX1JJTkcgICAgICB8ICAgIDIgICB8ICAgICAgICAgICAgIC0tICAgICAgICAgICAgIHwKKyAgICAgIHwgQVRfU0hJRUxEICAgIHwgICA0MCAgIHwgICAgICAgICAgICAgMjggICAgICAgICAgICAgfAorICAgICAgfCBBVF9UUk9VU0VSUyAgfCAgIDE1ICAgfCAgICAgICAgICAgICAxMyAgICAgICAgICAgICB8CisgICAgICB8IEFUX01JU0MgICAgICB8ICAgIDAgICB8ICAgICAgICAgICAgIC0tICAgICAgICAgICAgIHwKKyAgICAgICstLS0tLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCisgICAgUnVlc3R1bmdlbiBtaXQgRGVmZW5kRnVuYyBvLmFlLiBtdWVzc2VuIGdlbmVyZWxsIGdlbmVobWlndCB3ZXJkZW4gCisgICAgKHNpZWhlIFdhZmZlbikuCisKKyAgICBSdWVzdHVuZ2VuIHVuZCBXYWZmZW4gdm9tIFR5cCBBVF9NSVNDIG9kZXIgV1RfTUlTQyBkdWVyZmVuIGtlaW5lci0KKyAgICBsZWkgcG9zaXRpdmUgVmVyYWVuZGVydW5nZW4gaW0gU3BpZWxlciBoZXJ2b3JydWZlbiwga2VpbmUgU3RhdHMKKyAgICB2ZXJhZW5kZXJuIG9kZXIgc29uc3R3aWUga2FtcGZyZWxldmFudGUgQmVkZXV0dW5nIGhhYmVuLiBEaWUgV0MvQUMKKyAgICBzb2xjaGVyIE9iamVrdGUgaXN0IGltbWVyIDAgdW5kIHdpcmQgYXVjaCBuaWNodCBhbmRlcnMgZ2VuZWhtaWd0LgorCisgU0lFSEUgQVVDSAorCisgICAgIGJhbGFuY2UsIHJ1ZXN0dW5nZW4sIGZlcm53YWZmZW4sIHVuaXF1ZXMsIG5wY3MsIHNjaGFkZW5zdHlwZW4KKyAgICAgYXR0cmlidXRzdmVyYWVuZGVydW5nZW4sIHJlc2lzdGVuemVuLCBrYW1wZm9iamVrdGUKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIERvbiwgMDMuMDEuMDIsIDEyOjAwOjAwIHZvbiBUaWxseQpkaWZmIC0tZ2l0IGEvZG9jL2JhbGFuY2Uva2FlbXBmZXJwcm9wZXJ0aWVzIGIvZG9jL2JhbGFuY2Uva2FlbXBmZXJwcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZWQyNzEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmFsYW5jZS9rYWVtcGZlcnByb3BlcnRpZXMKQEAgLTAsMCArMSw5IEBACitQcm9wZXJ0aWVzIGluIFdhZmZlbiBmdWVyIFRydmVzIHVuZCBpaHJlIEhvZWNoc3R3ZXJ0ZToKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0tfVEhST1dJTkdfV0VBUE9OICAgICAgICAgV2FmZmVud3VyZiAgICAgICAgICAgID09PiBNYXg6ICA1MAorS19CUkFXTElOR19XQyAgICAgICAgICAgICBXYWZmZW5zY2hsYWcgICAgICAgICAgPT0+IE1heDogIDMwCitLX1dFQVBPTl9TSEFUVEVSICAgICAgICAgIFdhZmZlbmJydWNoICAgICAgICAgICA9PT4gTWF4OiAgNTAKK0tfRElTVFJBQ1RJTkdfV0VBUE9OICAgICAgRmludGUgLyBXYWZmZW50cmljayAgID09PiBNYXg6ICA1MAorS19DUklUSUNBTF9ISVQgICAgICAgICAgICBUb2Rlc3N0b3NzICAgICAgICAgICAgPT0+IE1heDogMTAwCisKZGlmZiAtLWdpdCBhL2RvYy9iYWxhbmNlL2thZW1wZmVyd2FmZmVuIGIvZG9jL2JhbGFuY2Uva2FlbXBmZXJ3YWZmZW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY2NjMxNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iYWxhbmNlL2thZW1wZmVyd2FmZmVuCkBAIC0wLDAgKzEsMTQzIEBACisKKyAgICAgIFNwZXppYWwtV2FmZmVuIGZ1ZXIgZGllIEthZW1wZmVyZ2lsZGUKKyAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitGdWVyIGRpZSBXYWZmZW4gYnp3LiBSdWVzdHVuZ2VuIG11c3MgL3Ava2FlbXBmZXIva2FtcGYuaCBpbmNsdWRldCB3ZXJkZW4uCisgIAorICAKKworWnVlcnN0IGVpbm1hbCB3YXMgdWViZXIgZGVuIFdlYXBvbi1UeXBlLiBadW0gaHVuZGVydGVzdGVuIG1hbGUgZGVyIEhpbndlaXMsCitkYXNzIGVzIG5pY2h0IG51ciBTY2h3ZXJ0ZXIgZ2lidCEgT2J3b2hsIGRpZSBLYWVtcGZlciBqZWRlIGJlbGllYmlnZQorV2FmZmUgYmVudXR6ZW4ga29lbm5lbiwgZ2lidCBlcyBkb2NoLCBqZSBuYWNoIFJhc3NlLCBzZWhyIGdyb3NzZSBVbnRlci0KK3NjaGllZGUuIE51ciB1bSBlaW4gQmVpc3BpZWwgenUgbmVubmU6CitFaW4gSG9iYml0LCBkZXIgYWxsZSBXZXJ0ZSBhdWYgMTAwJSBoYXQsIGhhdCBtaXQgZGVtIEtub2NoZW5zY2hhZWxtZXNzZXIKKyhXQyAxNDUpIGVpbmVuIGhvZWhlcmVuIEFuZ3JpZmZzd2VydCBhbHMgbWl0IGVpbmVyIExhbnplIChXQyAyMDApISEhCisKKworMSkgUGFyaWVyd2FmZmVuCisKKyAgUGFyaWVyd2FmZmVuIGVpZ2VuZW4gc2ljaCB2b3IgYWxsZW0genVtIFBhcmllcmVuLCB3aWUgei5CLiBkZXIgU2FpLgorICBEYSBtYW4gbWl0IHNvbGNoZW4gV2FmZmVuIG9mdCBhdWNoIGRpZSBnZWduZXJpc2NoZSBXYWZmZSBmZXN0aGFsdGVuCisgIGthbm4sIGdpbHQgZGVyIEJvbnVzIGF1Y2ggZnVlciBkZW4gQmxvY2suIFBhcmllcndhZmZlbiBoYWJlbiBtZWlzdGVucworICBlaW5lIG5pY2h0IHNvIGhvaGUgV0MuCisgIEVzIHdpcmQgZGllIFByb3BlcnR5IFBfRUZGRUNUSVZFX0FDIGdlc2V0enQuCisgIE5vcm1hbGUgV2FmZmVuLCBkaWUgenVzYWV0emxpY2ggenVtIFBhcmllcmVuIGdlZWlnbmV0IHNpbmQ6CisgICAgUF9FRkZFQ1RJVkVfQUM6IDEgLSAxNQorICBSZWluZSBQYXJpZXJ3YWZmZW4gbWl0IG5pZWRyaWdlciBXQzoKKyAgICBQX0VGRkVDVElWRV9BQzogMjAgLSAzMAorICAKKzIpIFd1cmZ3YWZmZW4KKworICBXdXJmd2FmZmVuIHNpbmQgc3BlY2llbGwgYXVzYmFsYW56aWVydCwgYmVzaXR6ZW4gbWVpc3Qga2VpbmVuIHJpY2h0aWdlbgorICBHcmlmZiBldGMuIEF1cyBkaWVzZW0gR3J1bmRlIHNvbGx0ZSBpaHJlIFdDIG5pY2h0IHp1IGhvY2ggc2Vpbi4KKyAgRXMgd2lyZCBLX1RIUk9XSU5HX1dFQVBPTiBnZXNldHp0LiBEZXIgV2VydCBzb2xsdGUgendpc2NoZW4gMS01MCAKKyAgbGllZ2VuLCB3b2JlaSB3aXJrbGljaCBudXIgc2VociBndXRlIFd1cmZ3YWZmZW4gbWl0IG5pZWRyaWdlcmVyCisgIFdDIFdlcnRlIHp3aXNjaGVuIDM1IC0gNTAgaGFiZW4gc29sbHRlbi4KKyAgCiszKSBXYWZmZW4gbWl0IHVuZ2V3b2VobmljaGVuIEFuZ3JpZmZzbW9lZ2xpY2hrZWl0ZW4KKworICBNYW4ga2FubiBhbiBXYWZmZW4gYXVjaCBhbiB1bmdld29laG5saWNoZXIgU3RlbGxlIHp1c2FldHpsaWNoZQorICBBbmdyaWZmc21vZWdsaWNoa2VpdGVuIGFuYmF1ZW4uIFNvIGtvZW5udGUgei5CLiBkaWUgUGFyaWVyc3RhbmdlCisgIGJlaSBlaW5lbSBTY2h3ZXJ0IGF1cyBLbGluZ2VuIGJlc3RlaGVuLCBvZGVyIGRhcyBFbmRlIGRlcyBTdGllbHMKKyAgYmVpIGVpbmVyIEF4dCBpbiBlaW5lbSBEb3JuIGVuZGVuLiBCZWltIFdhZmZlbnNjaGxhZyB3aXJkIG1pdAorICBkaWVzZW4gRXh0cmF3YWZmZW4gZ2VhcmJlaXRldC4gRGllc2UgQmVzb25kZXJoZWl0ZW4gKEtsaW5nZSBhbSAKKyAgUG9tbWVsIGRlcyBHcmlmZnMsIGV0Yykgc29sbHRlbiBuYXR1ZXJsaWNoIGF1Y2ggaW4gUF9MT05HCisgIGVyd2FlaG50IHdlcmRlbiwgc2NobGllc3NsaWNoIHNpbmQgc2llIGphIG1pdCBibG9zc2VtIEF1Z2UKKyAgenUgZXJrZW5uZW4uCisgIFByb3BlcnR5OiBLX0JSQVdMSU5HX1dDIG1pdCBXZXJ0ZW4gendpc2NoZW4gMSAtIDMwCisgIFdlaXRlcmhpbiBiZXN0ZWh0IGRpZSBNb2VnbGljaGtlaXQgZGllc2VyIHp1c2FldHpsaWNoZW4gQW5ncmlmZnMtCisgIG1vZWdsaWNoa2VpdCBlaW5lbiBlaWdlbmVuIFNjaGFkZW5zdHlwIHp1IGdlYmVuLiBEYXp1IHNldHp0IG1hbgorICBkaWUgUHJvcGVydHkgS19CUkFXTElOR19EVCAoYW5hbG9nIHp1IFBfREFNX1RZUEUpLgorCis0KSBXYWZmZW4sIGRpZSBhbmRlcmUgV2FmZmVuIHplcnN0b2VyZW4gc29sbGVuCisgIAorICBBbHMgS2FlbXBmZXIga2FubiBtYW4gdmVyc3VjaGVuLCBkaWUgV2FmZmUgZGVzIEdlZ25lcnMgenUgYmVzY2hhZWRpZ2VuLgorICBEYWZ1ZXIgZWlnbmVuIHNpY2ggbmF0dWVybGljaCBiZXNvbmRlcnMgc2Nod2VyZSBXYWZmZW4sIHZvciBhbGxlbQorICB6LkIuIEhhZW1tZXIuIE1hbiBrb2VubnRlIG5hdHVlcmxpY2ggV2FmZmVuIGtvbnN0cnVpZXJlbiwgZGllIGJlc29uZGVycworICBkYWZ1ZXIgZ2VlaWduZXQgc2luZC4gRGFmdWVyIHdpcmQgS19XRUFQT05fU0hBVFRFUiBnZXNldHp0LgorICBEZXIgV2VydCBzb2xsdGUgendpc2NoZW4gMSAtIDUwIGxpZWdlbi4KKyAgCis1KSBXYWZmZW4sIGRpZSBiZXNvbmRlcnMgZ3V0IGZ1ZXIgZGVuIEtPLVNjaGxhZyBzaW5kCisgIAorICBEZXIgS2FlbXBmZXIga2FubiB2ZXJzdWNoZW4gZWluZW4gR2VnbmVyIHp1IGJldGFldWJlbi4gRGllcyBnZXNjaGllZAorICBpbiBkZXIgUmVnZWwgZHVyY2ggZWluZW4gU2NobGFnIGF1ZiBkZW4gS29wZi4gSmUgaG9laGVyIGRhcyBHZXdpY2h0CisgIGRlciBXYWZmZSwgZGVzdG8gYmVzc2VyLiBFcyBnaWJ0IG5hdHVlcmxpY2ggV2FmZmVuLCBkaWUgZGFmdWVyIGJlc29uZGVycworICBnZWVpZ25ldCBzaW5kICh6LkIgVG9kc3RzY2hsYWVnZXIpLiBEYW5uIHdpcmQgS19LTyBhbHMgUHJvcGVydHkgZ2VzZXR6dC4KKyAgRGVyIFdlcnQgc29sbHRlIHp3aXNjaGVuIDEgLSA1MCBsaWVnZW4uIAorIAorNikgV2FmZmVuLCBkaWUgZGVuIEdlZ25lciBiZXNvbmRlcnMgZ3V0IGFibGVua2VuIGtvZW5uZW4KKyAgCisgIEVzIGdpYnQgbmF0dWVybGljaCBXYWZmZW4sIGRpZSBkZW4gR2VnbmVyIGxlaWNodCBhYmxlbmtlbiBrb2VubmVuLgorICBEaWVzIGlzdCBmdWVyIEZpbnRlbiB1bmQgZGVuIFdhZmZlbnRyaWNrIHNlaHIgbnVldHpsaWNoLiBFaW5lIHNvbGNoZQorICBXYWZmZSBpc3Qgei5CLiBkZXIgc2luZ2VuZGUgU3BlZXIsIGRlciBkZW4gR2VnbmVyICh1bmQgZGVuIFRyYWVnZXIpCisgIGZ1ZXJjaHRlcmxpY2ggbmVydnQuIEdlc2V0enQgd2lyZCBLX0RJU1RSQUNUSU5HX1dFQVBPTiwgd29iZWkKKyAgZGVyIFdlcnQgendpc2NoZW4gMSAtIDUwIGxpZWdlbiBzb2xsdGUuCisgCis3KSBXYWZmZW4sIGRpZSBiZWltIFRvZGVzc3Rvc3MgYmVzb25kZXJzIGVmZmVrdGl2IHNpbmQKKworICBNYW4ga2FubiBzaWNoIFdhZmZlbiB2b3JzdGVsbGVuLCBkaWUgc3BlemllbGwgZnVlciBkZW4gVG9kZXNzdG9zcworICBnZWVpZ25ldCBzaW5kLiBWb3IgYWxsZW0gbWFnaXNjaGUgV2FmZmVuLCBkaWUgei5CLiBkaWUgU2VlbGUgYXVzIGRlbQorICBnZXNjaHdhZWNodGVuIEtvZXJwZXIgZGVzIEdlZ25lcnMgcmVpc3Nlbiwgc2luZCB2b3JzdGVsbGJhci4gT2RlcgorICBXYWZmZW4gbWl0IGJlc29uZGVycyBsYW5nZW4sIHNwaXR6ZW4gdW5kIGR1ZW5uZW4gS2xpbmdlbiwgZGllIHNpY2gKKyAgdGllZiBpbiBkZW4gR2VnbmVyIGJvaHJlbi4gRXMgd2lyZCBLX0NSSVRJQ0FMX0hJVCBnZXNldHp0LCBkZXIKKyAgV2VydCBsaWVndCB6d2lzY2hlbiAxIHVuZCAxMDAsIHdvYmVpIDEwMCBlaW5lIFZlcmRvcHBsdW5nIGRlcyAKKyAgU2NoYWRlbnMgZXJnaWJ0ISEhIEFsc28gd2lya2xpY2ggc2VociB2b3JzaWNodGlnIHZlcndlbmRlbiEhISEhCisKKworOCkgU2NoaWxkZSBmdWVyIGRlbiBTY2hpbGRzdG9zcworCisgIElzdCBlaW4gU2NoaWxkIGV4dHJhIGZ1ZXIgZGVuIFNjaGlsZHN0b3NzIGFuZ2VmZXJ0aWd0IChoYXQgZXMgei5CLiBlaW5lbgorICBEb3JuIG1vbnRpZXJ0LCBtaXQgZGVtIG1hbiBnZWZhZWhybGljaCBkZW4gR2VnbmVyIHJhbW1lbiBrYW5uKSBzbworICBrYW5uIGltIFNjaGlsZCBQX0VGRkVDVElWRV9XQyBnZXNldHp0IHdlcmRlbi4gQXVzc2VyZGVtIGlzdCBlcyBtb2VnbGljaAorICBlaW5lbiBiZXN0aW1tdGVuIFNjaGFkZW5zdHlwIG1pdCBQX0RBTV9UWVBFIGFuenVnZWJlbiAoRmV1ZXJzY2hpbGQpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKzkpIFNwZWNpYWwtUnVlc3R1bmdlbgorCisgIEZvbGdlbmRlIFJ1ZXN0dW5nc3R5cGVuIGtvZW5uZW4gZnVlciBkaWUgS2FlbXBmZXIgbW9kaWZpemllcnQgd2VyZGVuOgorICBBVF9UUk9VU0VSUzsgQVRfSEVMTUVUOyBBVF9BUk1PVVI7IEFUX0JPT1QuIERhYmVpIHNpbmQgZHJlaSB2ZXJzY2hpZWRlbmUKKyAgU2FjaGVuIG1vZWdsaWNoLiAKKyAgYSkgUF9FRkZFQ1RJVkVfQUMgd2lyZCBnZXNldHp0LCB3ZW5uIGRpZSBSdWVzdHVuZyBkdXJjaCBiZXNvbmRlcmUKKyAgICAgRGVmZW5kRnVuYydzIGVpbmVuIGhvZWhlcmVuIFNjaHV0eiBhbHMgZGllIEFDIG1hY2h0CisgIGIpIERpZSBSdWVzdHVuZyBzb2xsIGF1Y2ggYWxzIFdhZmZlIHp1IHZlcndlbmRlbiBzZWluIChTdGllZmVsIGJlaW0KKyAgICAgS2FtcGZ0cml0dCwgSG9zZSBiZWltIEtuaWVzdG9zcywgSGVsbSBiZWltIEtvcGZzdG9zcyB1bmQgUnVlc3R1bmcKKyAgICAgYmVpbSBFbGxib2dlbnNjaGxhZykuIHouQi4gd2FlcmVuIERvcm5lbiBhbiBkZW4gU3RpZWZlbG4gZGVua2Jhci4KKyAgICAgRGFkdXJjaCB3ZXJkZW4gZGllIFN0aWVmZWwgamEgbmljaHQgYWxzIFNjaHV0eiBiZXNzZXIsIGFiZXIgYWxzCisgICAgIFdhZmZlLiBEZXNoYWxiIFBfRUZGRUNUSVZFX1dDIHNldHplbi4gRGVuIFdlcnQgbmljaHQgaG9laGVyIGFscworICAgICBkb3BwZWx0ZSBBQy4KKyAgICAgW0JvaW5nOl0KKyAgICAgV2VubiBtYW4gZGVyIFJ1ZXN0dW5nIHdpcmtsaWNoIGVpbmVuIEF0dGFja2Vib251cyBnZWJlbiBtb2VjaHRlLAorICAgICBkYW5uIG11c3MgUF9FRkZFQ1RJVkVfV0MgaG9laGVyIHNlaW4sIGFscyBQX0FDIGRlciBSdWVzdHVuZyEKKyAgICAgRGEgaW0gRmFsbGUsIHdlbm4gUF9FRkZFQ1RJVkVfV0MgbmljaHQgZ2VzZXR6dCBpc3QsIFBfQUMgYWxzCisgICAgIEFuZ3JpZmZzd2VydCBnZW5vbW1lbiB3aXJkLCB3YWVyZSBkYXMgYW5zb25zdGVuIGVpbmUgU2Nod2FlY2h1bmchCisgICAgIERhcyBrYW5uIG1hbiBuYXR1ZXJsaWNoIGdlemllbHQgZWluc2V0emVuLCB3ZW5uIG1hbiBlaW5lIFJ1ZXN0dW5nCisgICAgIG1hY2hlbiB3aWxsLCBkaWUgc2VociBndXQgc2NodWV0enQsIGFiZXIgbnVyIGdlcmluZ2UgS2FlbXBmZXJib25pCisgICAgIGF1ZndlaXN0LiAKKyAgICAgQmVpc3BpZWw6IAorICAgICAgICBSdWVzdHVuZyBtaXQgYWMgNDAgdW5kIGtlaW5lciBlZmZfd2M6IGFuZ3JpZmZzd2VydCBpc3QgNDAKKyAgICAgICAgUnVlc3R1bmcgbWl0IGFjIDQwIHVuZCBlZmZfd2MgMjA6ICAgICBhbmdyaWZmc3dlcnQgaXN0IDIwCisgICAgICAgIFJ1ZXN0dW5nIG1pdCBhYyA0MCB1bmQgZWZmX3dlYyA2MDogICAgYW5ncmlmZnN3ZXJ0IGlzdCA2MAorICBjKSBEaWUgUnVlc3R1bmcgbWFjaHQgZWluZW4gYmVzb25kZXJlbiBTY2hhZGVuc3R5cC4gei5CLiBGbGFtbWVuc3RpZWZlbCwKKyAgICAgZGllIGJlaW0gS2FtcGZ0cml0dCBEVF9GSVJFIHVuZCBEVF9CTFVER0VPTiBtYWNoZW4sIG9kZXIgSG9zZW4KKyAgICAgbWl0IFNwaWtlcyBhbiBkZW4gS25pZW4gLT4gRFRfUElFUkNFLiBFcyBzb2xsdGUgaW1tZXIgZWluCisgICAgIHBoeXNpa2FsaXNjaGVyIFNjaGFkZW4gdm9yaGFuZGVuIHNlaW4uIFp1c2FldHpsaWNoIHdhZXJlIGplZGVyCisgICAgIG1hZ2lzY2hlIFNjaGFkZW4gZGVua2JhciwgZGVyIFBoYW50YXNpZSBzaW5kIGtlaW5lIEdyZW56ZW4gZ2VzZXR6dC4KKyAgICAgTmF0dWVybGljaCBzb2xsdGVuIHNvbGNoZSBTcGVjaWFsc2FjaGVuIGF1Y2ggaW4gUF9MT05HIGRlciBSdWVzdHVuZworICAgICBhdWZ0YXVjaGVuLiBEaWUgS2FlbXBmZXIgaGFiZW4gYWJlciBkaWUgTW9lZ2xpY2hrZWl0IFJ1ZXN0dW5nZW4KKyAgICAgZWluenVzY2hhZXR6ZW4gdW5kIHNvd2FzIHp1IGVudGRlY2tlbi4KKyAgICAgCisKKworICBCaXR0ZSBhbGxlIGZ1ZXIgZGllIEthZW1wZmVyIGdlYWVuZGVydGVuIFdhZmZlbiB1bmQgUnVlc3R1bmdlbgorICBiZWkgbWlyIGFic2VnbmVuIGxhc3NlbiwgaWNoIG1vZWNodGUgZGVuIFVlYmVyYmxpY2sgbmljaHQgdmVybGllcmVuIDopKQorICBBdXNzZXJkZW0gc29sbHRlbiBkaWUgV2VydGUgbmljaHQgZ2xlaWNoIHp1IGhvY2ggZ2V3YWVobHQgd2VyZGVuLgorICBEaWUgTWF4aW1hbHdlcnRlIHNvbGx0ZW4gc28gZ3V0IHdpZSBuaWUgdmVyZ2ViZW4gd2VyZGVuLiAKKyAgVm9yc2ljaHQhISEgV2VyZGVuIGRpZSBXZXJ0ZSB1ZWJlciBkaWUgR3JlbnplbiBlcmhvZWh0LCB3aXJkIGVpbiAKKyAgS2FlbXBmZXIgbWl0IHNvIGVpbmVyIFdhZmZlIHZpZWwgenUgc3RhcmsuIEJpcyBqZXR6dCBoYWIgaWNoIG5vY2gga2VpbmUKKyAgU2ljaGVyaGVpdHNmdW5rdGlvbiBlaW5nZWJhdXQsIHdhcyBzaWNoIGFiZXIgYWVuZGVybiB3aXJkLCB3ZW5uIAorICBlcyBqZW1hbmQgdWViZXJ0cmVpYnQgOikpCisgIFtCb2luZzpdIExlaWRlciB3dXJkZSBlcyB1ZWJlcnRyaWViZW4sIGFsc28gaXN0IGpldHp0IGVpbmUgU2ljaGVyaGVpdHMtCisgIGZ1bmt0aW9uIGRyaW4uCisKKworQ2lhbyBaYXJkb3oKKyAgICAgCmRpZmYgLS1naXQgYS9kb2MvYmFsYW5jZS9rYW1wZm9iamVrdGUgYi9kb2MvYmFsYW5jZS9rYW1wZm9iamVrdGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMxNzkzZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iYWxhbmNlL2thbXBmb2JqZWt0ZQpAQCAtMCwwICsxLDMxIEBACisgICAgSGllcnp1IHphZWhsZW4gYWxsZSBTYWNoZW4sIGRpZSBpcmdlbmRlaW5lbiBFaW5mbHVzcyBhdWYgZGVuIEthbXBmIG5laG1lbgorICAgIHVuZCB3ZWRlciBgL3N0ZC93ZWFwb24uYycgbm9jaCBgL3N0ZC9hcm1vdXIuYycgc2luZC4gQWxzbyBkaWUgc29nZW5hbm50ZQorICAgIEFydGlsbGVyaWUsIEVpc3N0YWIgdW5kIGFydHZlcndhbmR0ZXMsIFd1cmZzdGVybmUsIFBhcmFzdGVpbmUsIEJ1bWkgdW5kCisgICAgdW50ZXJzdHVldHplbmRlIE5QQy4KKworICAgIFByaW56aXBpZWxsIHNpbmQgYWxsZSBkaWVzZSBTYWNoZW4gZ2VuZWhtaWd1bmdzcGZsaWNodGlnLgorICAgIAorICAgIEF1dG8tU2VsYnN0ZmFocmVyLCBhbHNvIFNhY2hlbiwgZGllIG9obmUgRWluZ3JpZmYgZGVzIFNwaWVsZXJzIGFnaWVyZW4sCisgICAgc2luZCB1bmVyd3VlbnNjaHQgdW5kIHNvbGx0ZW4gdmVybWllZGVuIHdlcmRlbi4gU29ycnkgZnVlciBkaWUKKyAgICBMYWdnZXBsYWd0ZW4uLi4KKworICAgIEthbXBmb2JqZWt0ZSBzb2xsdGVuIFBfQVRUQUNLX0JVU1kgc2V0emVuIHVuZCBhdWNoIHZvciBkZXIgQW53ZW5kdW5nCisgICAgYWJmcmFnZW4sIGRhbWl0IHNpZSBuaWNodCB1bmJlZ3Jlbnp0IGhpbnRlcmVpbmFuZGVyIGdlbnV0enQgd2VyZGVuCisgICAga29lbm5lbi4gTWFnaXNjaGUgU2FjaGVuIHNvbGx0ZW4gZW50d2VkZXIgYXVmZ2VsYWRlbiB3ZXJkZW4gbXVlc3NlbiBvZGVyCisgICAgaWhyZSBtYWdpc2NoZSBFbmVyZ2llIHZlcmxpZXJlbiwgZGFtaXQgc2llIG5pY2h0IHVuZW5kbGljaCBoYWx0YmFyIHNpbmQuCisgICAgQXVzc2VyZGVtIGhhdCBNYWdpZSBub3JtYWxlcndlaXNlIGF1Y2ggdW5lcnd1ZW5zY2h0ZSBOZWJlbndpcmt1bmdlbi4gRGllCisgICAgU3BpZWxlciBzb2xsZW4gZGllIG1vZWdsaWNoZW4gVm9ydGVpbGUgZ2VnZW4gTmFjaHRlaWxlIG9kZXIgTmViZW53aXJrdW5nZW4KKyAgICBkZXMgR2VnZW5zdGFuZHMgYWJ3YWVnZW4uIEF1Y2ggYmVpIGRpZXNlbiBPYmpla3RlbiAqbXVzcyogUF9JTkZPIGdlc2V0enQKKyAgICB3ZXJkZW4sIHVtIGVpbmUgQmVncnVlbmR1bmcgZnVlciBkaWUgYmVzb25kZXJlIFdpcmt1bmcgdW5kIHouQi4gZWluZW4KKyAgICBIaW53ZWlzIGF1ZiBkaWUgQmVudXR6dW5nIHp1IGxpZWZlcm4uCisgICAgCisgICAgU2llIHNvbGx0ZW4ga2VpbmVzZmFsbHMga2FldWZsaWNoIGVyd29yYmVuIHdlcmRlbiBrb2VubmVuLgorCisgICAgT2JqZWt0ZSwgZGllIEF1c2t1bmZ0IHVlYmVyIGVpbi0gdW5kL29kZXIgYXVzZ2VoZW5kZSBTY2hhZWRlbiBnZWJlbiwgCisgICAgc2luZCBnZW5laG1pZ3VuZ3NwZmxpY2h0aWcuIFNvbGNoZSBPYmpla3RlIHNvbGx0ZW4gbmFjaCBNb2VnbGljaGtlaXQKKyAgICBlaW5lIFdhZmZlIG9kZXIgS2xlaWR1bmdzc3R1ZWNrIC0gZGllcyBqZWRvY2ggbmljaHQgQVRfTUlTQyAtIHNlaW4uCisgICAgRGFzcyBzb2xjaGUgT2JqZWt0ZSBhdWNoIHVlYmVyIEx1ZWNrZW4gaW4gZGVyIEFuZ2FiZSBkZXIgU2NoYWVkZW4gdW5kCisgICAgTmFjaHRlaWxlIHZlcmZ1ZWdlbiBzb2xsdGVuLCBpc3QgZWlnZW50bGljaCBrbGFyLiAKKyAgICBTb2xjaGUgTmFjaHRlaWxlIGxpZXNzZW4gc2ljaCB1ZWJlciBlaW5lIE1pbmRlc3QtU2NoYWRlbnNob2VoZSBvZGVyCisgICAgcmFuZG9tIHJlYWxpc2llcmVuLiBJbmZvcm1hdGlvbmVuIHVlYmVyIG1laHJlcmUgU2NoYWRlbnN0eXBlbiBkdXJjaCAKKyAgICBlaW4gdW5kIGRhcyBzZWxiZSBPYmpla3Qgc2luZCBuaWNodCBlcnd1ZW5zY2h0LgpkaWZmIC0tZ2l0IGEvZG9jL2JhbGFuY2UvbW9kaWZ5c2tpbGxhdHRyaWJ1dGUgYi9kb2MvYmFsYW5jZS9tb2RpZnlza2lsbGF0dHJpYnV0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDcyNzkxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JhbGFuY2UvbW9kaWZ5c2tpbGxhdHRyaWJ1dGUKQEAgLTAsMCArMSwxMDAgQEAKK01vZGlmeVNraWxsQXR0cmlidXRlKCkKKworRlVOS1RJT046CisgICAgcHVibGljIGludCBNb2RpZnlTa2lsbEF0dHJpYnV0ZShzdHJpbmcgYXRybmFtZSwgbWl4ZWQgdmFsdWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGR1cmF0aW9uKQorCitERUZJTklFUlQgSU46CisgICAgL3N0ZC9saXZpbmcvc2tpbGxfYXR0cmlidXRlcy5jCisKK0FSR1VNRU5URToKKyAgICA8YXRybmFtZT4gICBzdHJpbmcKKyAgICAgICAgICAgICAgICBOYW1lIGRlcyB6dSB2ZXJhZW5kZXJuZGVuIEF0dHJpYnV0ZXMKKyAgICAgICAgICAgICAgICAoRGVmaW5pZXJ0IGluIC9zeXMvbGl2aW5nL3NraWxsX2F0dHJpYnV0ZXMuaCkKKworICAgIDx2YWx1ZT4gICAgIGludCBvZGVyIGNsb3N1cmUKKyAgICAgICAgICAgICAgICBXZXJ0IGRlcyBNb2RpZmlrYXRvcnMKKyAgICAgICAgICAgICAgICBvZGVyCisgICAgICAgICAgICAgICAgZWluZSBDbG9zdXJlLCB3ZWxjaGUgYmVpIEFiZnJhZ2UgZGVzIGJldHJlZmZlbmRlbiBTQXMKKyAgICAgICAgICAgICAgICBhYmdlZnJhZ3QgdW0gZGVuIE1vZGlmaWthdG9yIHp1IGJlc3RpbW1lbi4KKworICAgIDxkdXJhdGlvbj4gIGludAorICAgICAgICAgICAgICAgIERhdWVyIGluIFNla3VuZGVuCisKK0JFU0NIUkVJQlVORzoKKyAgICBBZW5kZXJ0IHRlbXBvcmFlciwgZC5oLiBmdWVyIGVpbmUgYmVzdGltbXRlIFplaXQsIGVpbiBTa2lsbC1BdHRyaWJ1dCBlaW5lcworICAgIExlYmV3ZXNlbiwgaW5kZW0gZWluIE1vZGlmaWthdG9yIGhpbnp1Z2VmdWVndCB3aXJkLgorICAgIAorICAgIERlciBTdGFuZGFyZHdlcnQgZWluZXMgU0Egd2lyZCB2b24gUF9TS0lMTF9BVFRSSUJVVEVfT0ZGU0VUUyBmZXN0Z2VsZWd0CisgICAgb2RlciBpc3QgMTAwLCB3ZW5uIGJlc2FndGUgUHJvcGVydHkgbGVlciBpc3QuCisgICAgQWxsZSBNb2RpZmlrYXRvcmVuIChuZWdhdGl2IHdpZSBwb3NpdGl2KSB3ZXJkZW4gYWRkaWVydCB1bmQgYmlsZGVuCisgICAgenVzYW1tZW4gbWl0IGRlbSBTdGFuZGFyZHdlcnQgZWluZSBHZXNhbXRzdW1tZS4KKyAgICBCZWkgYWxsZW4gU0FzIGF1c3NlciBTQV9RVUFMSVRZIHdpcmQgZGllc2UgR2VzYW10c3VtbWUgbm9jaCBtaXQKKyAgICBTQV9RVUFMSVRZICh3ZWxjaGVzIHNpY2ggZGFtaXQgYXVmIGFsbGUgYW5kZXJlbiBTa2lsbC1BdHRyaWJ1dGUgYXVzd2lya3QpCisgICAgbXVsdGlwbGl6aWVydCB1bmQgZGFzIEVyZ2VibmlzIHN0ZWxsdCBkZW4gRW5kd2VydCBkZXMgU0EgZGFyLgorICAgIChCZWlzcGllbCBzLnUuKQorCisgICAgRGVyIFdlcnQgZWluZXMgTW9kaWZpa2F0b3JzIG11c3Mgendpc2NoZW4gLTEwMDAgdW5kIDEwMDAgbGllZ2VuLiBEZXIKKyAgICBHZXNhbXR3ZXJ0IGVpbmVzIFNBIGthbm4gMTAgbmljaHQgdW50ZXItIHVuZCAxMDAwIG5pY2h0IHVlYmVyc2NocmVpdGVuLgorCisgICAgRmFsbGUgPHZhbHVlPiBlaW5lIENsb3N1cmUgaXN0LCB3aXJkIGRpZXNlIENsb3N1cmUgamVkZXNtYWwgYXVzZ2VmdWVocnQsCisgICAgd2VubiBkYXMgZW50c3ByZWNoZW5kZSBTQSBhYmdlZnJhZ3Qgd2lyZC4gRGVyIFJ1ZWNrZ2FiZXdlcnQgZGllc2VyIENsb3N1cmUKKyAgICBzdGVsbHQgZGFubiBkZW4gV2VydCBkZXMgTW9kaWZpa2F0b3JzIGRhci4gQXVjaCBkaWVzZXIgbXVzcyB6d2lzY2hlbiAtMTAwMAorICAgIHVuZCAxMDAwIGxpZWdlbi4gR2lidCBkaWUgQ2xvc3VyZSBrZWluZW4gaW50IHp1cnVlY2ssIHdpcmQgZGVyIE1vZGlmaWthdG9yCisgICAgZ2Vsb2VzY2h0LgorCisgICAgR3VlbHRpZ2UgU2tpbGwtQXR0cmlidXRlIHNpbmQgbW9tZW50YW46CisgICAgKiBTQV9RVUFMSVRZOiAgQWxsZ2VtZWluZSBRdWFsaXRhZXQKKyAgICAqIFNBX0RBTUFHRTogICBTY2hhZGVuLCBkZW4gZGFzIExlYmV3ZXNlbiBtYWNodAorICAgICogU0FfU1BFRUQ6ICAgIEdlc2Nod2luZGlna2VpdCBkZXMgTGViZXdlc2VucworICAgICogU0FfRFVSQVRJT046IFNwZWxsLS9Ta2lsbGRhdWVyCisgICAgKiBTQV9FTkVNWV9TQVZFOiBpZGVudGlzY2ggenUgU0FfU1BFTExfUEVORVRSQVRJT04gKE9CU09MRVQhKQorICAgICogU0FfU1BFTExfUEVORVRSQVRJT046IENoYW5jZSBkZXMgX0Nhc3RlcnNfLCBlaW5lbiBTcGVsbCBkdXJjaCBlaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQX05PTUFHSUMgZHVyY2h6dWtyaWVnZW4uCisgICAgKiBTQV9SQU5HRTogICAgIFJlaWNod2VpdGUgZGVzIExlYmV3ZXNlbnMgKGVoZXIgdW5iZW51dHp0KQorICAgICogU0FfRVhURU5TSU9OOiAgIkF1c2RlaG51bmciICh1bmJlbnV0enQpCisKK1JVRUNLR0FCRVdFUlQ6CisgICAgU0FfTU9EX09LICAgICAgICAgICAgICB3ZW5uIGRlciBNb2RpZmlrYXRvciBnZXNldHp0IHd1cmRlCisgICAgU0FfVE9PX01BTllfTU9EUyAgICAgICB3ZW5uIGRpZSBtYXguIEFuemFobCBhbiBNb2RzIHNjaG9uIGVycmVpY2h0IGlzdC4KKyAgICBTQV9NT0RfVE9PX1NNQUxMICAgICAgIHdlbm4gZGVyIE1vZCB6dSBrbGVpbiBpc3QKKyAgICBTQV9NT0RfVE9PX0JJRyAgICAgICAgIHdlbm4gZGVyIE1vZCB6dSBncm9zcyBpc3QKKyAgICBTQV9NT0RfSU5WQUxJRF9BVFRSICAgIHdlbm4gZGFzIGdld3VlbnNjaHRlIFNBIGdhciBuaWNodCBleGlzdGllcnQKKyAgICBTQV9NT0RfSU5WQUxJRF9PQkpFQ1QgIHdlbm4gZGFzIHNldHplbmRlIE9iamVrdCB1bmd1ZWx0aWcgaXN0CisgICAgV2VubiBtYW4gbnVyIHdpc3NlbiB3aWxsLCBvYiBkaWUgT3BlcmF0aW9uIGVyZm9sZ3JlaWNoIHdhciwgZW1wZmllaGx0IGVzCisgICAgc2ljaCwgYXVmID09IFNBX01PRF9PSyB6dSBwcnVlZmVuLgorCitCRU1FUktVTkdFTjoKKyAgICBOYWNoZGVtIGVpbiBPYmpla3QsIHdlbGNoZXMgTW9kaWZpa2F0b3JlbiBzZXR6dGUsIHplcnN0b2VydCB3dXJkZSwgd2VyZGVuCisgICAgZGllIE1vZGlmaWthdG9yZW4gc3BhZXRlc3RlbnMgdW5ndWVsdGlnLCBzb2JhbGQgaW4gZGVtIG1hbmlwdWxpZXJ0ZW4KKyAgICBMZWJld2VzZW4gZXJuZXV0IE1vZGlmeVNraWxsQXR0cmlidXRlKCkgZ2VydWZlbiB3aXJkISBCZWkgQ2xvc3VyZXMgaXN0IGRlcgorICAgIE1vZCBzb2ZvcnQgd2VnLgorCitCRUlTUElFTEU6CisgICAgLy8gc2VpIFBMIGVpbiBTcGllbGVyLCBkZW4gbWVpbiBOUEMgc2Nod2FlY2hlbiB3aWxsOgorICAgIFBMLT5Nb2RpZnlTa2lsbEF0dHJpYnV0ZShTQV9RVUFMSVRZLCAtNzUsIDEzKTsKKyAgICAvLyBGdWVyIDEzcyB3aXJkIFNBX1FVQUxJVFkgdW0gNzUgcmVkdXppZXJ0LiBEaWVzIHdpcmt0IHNpY2ggYXVmIGFsbGUKKyAgICAvLyBhbmRlcmVuIFNBcyBhdXMhIChzLiBkcml0dGVzIEJlaXNwaWVsKQorCisgICAgLy8gc2VpIFBMIGVpbiBMZWJld2VzZW4sIHdlbGNoZW0gaWNoIGZ1ZXIgMTFzIDIgU2NobGFlZ2UgcHJvIEthbXBmcnVuZGUKKyAgICAvLyB6dXNhZXR6bGljaCBnZWJlbiBtb2VjaHRlOgorICAgIFBMLT5Nb2RpZnlTa2lsbEF0dHJpYnV0ZShTQV9TUEVFRCwgMjAwLCAxMSk7CisgICAgLy8gd2VubiBrZWluZSB3ZWl0ZXJlcyBNb2RpZmlrYXRvcmVuIHdpcmtlbiwgaGF0IFBMIGpldHp0IDMgU2NobGFlZ2UgcHJvCisgICAgLy8gS2FtcGZydW5kZSAoQmFzaXN3ZXJ0IDEwMCArIDIwMCA9PSAzMDAgPT4gMykuCisKKyAgICBBbmdlbm9tbWVuLCBlaW4gTGViZXdlc2VuIGhhdCBlaW5lbiBCYXNpc3dlcnQgdm9uIDEzMCBhdWYgU0FfU1BFRUQgdW5kIDEwMAorICAgIGF1ZiBTQV9RVUFMSVRZIChQX1NLSUxMX0FUVFJJQlVURV9PRkZTRVRTKSB1bmQgbnVuIDMgTW9kaWZpa2F0b3JlbgorICAgIGdlc2V0enQ6IFNBX1NQRUVEICsxMDAsIFNBX1NQRUVEIC0zMCB1bmQgU0FfUVVBTElUWSB2b24gLTEwOgorICAgIFp1bmFlY2hzdCB3aXJkIFNBX1FVQUxJVFkgYmVzdGltbXQ6IDEwMCAtIDEwID0gOTAgID0+IDAuOQorICAgIEFuc2NobGllc3NlbmQgd2lyZCBTQV9TUEVFRCBiZXN0aW1tdDogMTMwICsgMTAwIC0gMzAgPSAyMDAgPT4gMgorICAgIE51biB3aXJkIFNBX1NQRUVEIG5vY2ggbWl0IFNBX1FVQUxJVFkgbXVsdGlwbGl6aWVydDogMiAqIDAuOSA9IDEuOAorICAgIERhcyBMZWJld2VzZW4gaGF0IG51biBhbHNvIGltIEVuZGVmZmVrdCAxLjggU2NobGFlZ2UgcHJvIEthbXBmcnVuZGUuCisKKyAgICAKK1NJRUhFIEFVQ0g6CisgICAgUF9TS0lMTF9BVFRSSUJVVEVTLCBQX1NLSUxMX0FUVFJJQlVURV9PRkZTRVRTLAorICAgIFF1ZXJ5U2tpbGxBdHRyaWJ1dGUoKSwgUXVlcnlTa2lsbEF0dHJpYnV0ZU1vZGlmaWVyKCksCisgICAgUmVtb3ZlU2tpbGxBdHRyaWJ1dGVNb2RpZmllcigpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiswNy4wOC4yMDA4LCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvYmFsYW5jZS9tdWx0aW9iamVrdGUgYi9kb2MvYmFsYW5jZS9tdWx0aW9iamVrdGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYwODZhNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iYWxhbmNlL211bHRpb2JqZWt0ZQpAQCAtMCwwICsxLDQ3IEBACitNVUxUSU9CSkVLVEU6CisKKwlhLiBXYXMgc2luZCBNdWx0aW9iamVrdGU/CisKKwlNdWx0aW9iamVrdGUgc2luZCBNdWx0aXdhZmZlbiBvZGVyIE11bHRpcnVlc3R1bmdlbi4KKworCWIuIE11bHRpd2FmZmVuCisKKwlNdWx0aXdhZmZlbiBzaW5kIFdhZmZlbiwgZGllIG1laHJlcmUgRnVua3Rpb25lbiBoYWJlbiBrb2VubmVuLiBEYXMgCisJa2xhc3Npc2NoZSBCZWlzcGllbCBzaW5kIFdhZmZlbiwgZGllIG1laHJlcmUgU2NoYWRlbnNhcnRlbiB2ZXJ1cnNhY2hlbgorCWtvZW5uZW4sIHVuZCBkaWVzZSB6LkIuIGF1ZiBLb21tYW5kbyB3ZWNoc2VsbiBrb2VubmVuLiBPZGVyIGF1Y2ggZGllCisJV2FmZmVuZ2F0dHVuZy4KKworCUViZW5mYWxscyBhbHMgTXVsdGl3YWZmZW4gd2VyZGVuIFdhZmZlbiBiZWhhbmRlbHQsIGJlaSBkZW5lbiBpbSAKKwlnZXJpbmdlbiBVbWtyZWlzIHVtIGVpbmUgRnVuZHN0ZWxsZSB2aWVsZSBhZWhubGljaGUgV2FmZmVuIGF1ZmZpbmRiYXIKKwlzaW5kLCBkaWUgc2ljaCB6LkIuIG51ciBpbiBkZXIgR2F0dHVuZyB1bnRlcnNjaGVpZGVuIChlaW4gCisJUXVldHNjaHNjaHdlcnQsIGVpbmUgUXVldHNjaGtldWxlLCBlaW4gUXVldHNjaHN0YWIsIGVpbiBRdWV0c2Noc3BlZXIuLgorCW9kZXIgOiBFaW4gRmV1ZXJzY2h3ZXJ0LCBlaW4gRWlzc2Nod2VydCwgZWluIFNhZXVyZXNjaHdlcnQsIGVpbgorCUJsaXR6c2Nod2VydCwgZWluIFdhc3NlcnNjaHdlcnQuLi4pCisKKwljLiBNdWx0aXJ1ZXN0dW5nZW4KKworCU11bHRpcnVlc3R1bmdlbiBzaW5kIGFuYWxvZyBSdWVzdHVnbmVuLCBkaWUgZ2VnZW4gYmVzdGltbXRlIFNjaGFlZGVuCisJc2NodWV0emVuIHVuZCBlbnR3ZWRlciBzZWxic3QgaW4gU2NoYWRlbnNhcnQgd2FuZGVsYmFyIHNpbmQsIG9kZXIgd28KKwllcyB2aWVsZSBnbGVpY2hhcnRpZ2UgaW4gZWluZW0gZ2VyaW5nZW4gVW1rcmVpcyBnaWJ0LiAoQmxpdHpoZWxtLAorCUJsaXR6aG9zZSwgQmxpdHpwYW56ZXIsIEJsaXR6cmluZy4uLiBvZGVyIEZldWVycmluZywgV2Fzc2VycmluZywKKwlCbGl0enJpbmcsIEVpc3JpbmcuLi4pLiBBbmFsb2dlcyBnaWx0IGZ1ZXIgZGllIFNjaGFkZW5zYXJ0IGRlcgorCVJ1ZXN0dW5nIGZ1ZXIgZGllIEthZW1wZmVyZ2lsZGUuCisKKwlkLiBSZWdlbAorCisJTXVsdGlvYmpla3RlIGR1ZXJmZW4gaW4gZWluZW0gZ2VyaW5nZW4gVW1rcmVpcyBudXIgaW4gbWF4aW1hbCA0IAorCVZhcmlhbnRlbiB2b3Jrb21tZW4gb2RlciB2b24vZnVlciBTcGllbGVyIGhlcnN0ZWxsYmFyIHNlaW4uCisKKwlEaWVzZSBSZWdlbHVuZyBpc3Qgc2Nod2FtbWlnLCBhYmVyIHNpZSBzb2xsIHZlcmhpbmRlcm4sIGRhc3MgZXMgZWluCisJdW5pdmVyc2VsbGVzIEF1c3J1ZXN0dW5nc2dlYmlldCBnaWJ0LgorCisJV2FzIGVpbiBnZXJpbmdlciBVbWtyZWlzIGlzdCwgb2IgV2FmZmVuIG9kZXIgUnVlc3R1bmdlbiBhbHMKKwlNdWx0aW9iamVrdGUgZ2VsdGVuLCBvYiBkaWUgVGF0YmVzdGFlbmRlIGFsc28gZnVlciBkZW4ga29ua3JldGVuCisJUHJvZ3JhbW1pZXJ1bmdzc2FjaHZlcmhhbHQgZ2VsdGVuLCBlbnRzY2hlaWRldCBkaWUgQmFsYW5jZSBuYWNoCisJQXVzbGVndW5nIHVuZCBldnRsLiBSZWdlbGZvcnRiaWxkdW5nIGRlbSBTaW5uIGJ6dy4gZGVyIEhpc3RvcmllCisJZGllc2VyIFJlZ2VsIG5hY2guCisKKwlBbHMgQW5zcHJlY2hwYXJ0bmVyIGZ1ZXIgZGllc2UgUmVnZWwgc3RlaHQgZGllIEJhbGFuY2UgenVyCisJVmVyZnVlZ3VuZy4KKworTGV0enRlIEFlbmRlcnVuZzogSHVtbmksIDIwMTEtMDEtMTUKZGlmZiAtLWdpdCBhL2RvYy9iYWxhbmNlL3BhcmllcndhZmZlbiBiL2RvYy9iYWxhbmNlL3BhcmllcndhZmZlbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2UzOGI0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JhbGFuY2UvcGFyaWVyd2FmZmVuCkBAIC0wLDAgKzEsNyBAQAorQWt0dWVsbGUgR3Jlbnp3ZXJ0ZToKKz09PT09PT09PT09PT09PT09PT09CisKKyAgUGFyaWVyLVR5cCAgIEdlbmVobWlndW5nc2dyZW56ZQorICAtLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgUEFSUllfT05MWSAgIFdpZSBSdWVzdHVuZ2VuIHZvbSBUeXAgQVRfU0hJRUxECisgIFBBUlJZX1RPTyAgICBHZW5lcmVsbGUgR2VuZWhtaWd1bmdzcGZsaWNodApkaWZmIC0tZ2l0IGEvZG9jL2JhbGFuY2UvcHJvcGVydGllcyBiL2RvYy9iYWxhbmNlL3Byb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg0OWFiNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iYWxhbmNlL3Byb3BlcnRpZXMKQEAgLTAsMCArMSwxOTQgQEAKK1BfQUMgICAgICAgICAgICAgICAgICA6IEFybW91ckNsYXNzLCBXZXJ0IGRlciBkZW4gU2NodXR6IGVpbmVyIFJ1ZXN0dW5nIAorICAgICAgICAgICAgICAgICAgICAgICAgKFBfQVJNT1VSUyxQX0FSTU9VUl9UWVBFKSBhbmdpYnQKKworUF9BVFRBQ0tfQlVTWSAgICAgICAgIDogQW56YWhsIGRlciBtb2VnbGljaGVuIEFrdGlvbmVuIGVpbmVzIExlYmV3ZXNlbnMgcHJvCisgICAgICAgICAgICAgICAgICAgICAgICBLYW1wZnJ1bmRlICgxIEhlYXJ0QmVhdCkuIEJlaSBTcGllbGVybiBpc3QgZGllcyAxLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlaSBTZWhlcm4gbWF4LiA1LiBXZWdlbiBkZXMgaG9laGVyZW4gV2VydGVzIGJlaQorICAgICAgICAgICAgICAgICAgICAgICAgU2VoZXJuIGlzdCBkYXJhdWYgenUgYWNodGVuLCBkYXMgaGllciBBRERJRVJUIHdpcmQKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuZCBuaWNodCBlaW5mYWNoIG51ciBhdWYgMSBnZXNldHp0LgorICAgICAgICAgICAgICAgICAgICAgICAgU2llaGUgYXVjaDogYm1hbiBrYW1wZm9iamVrdGUKKworUF9BVFRSSUJVVEVTICAgICAgICAgIDogQXR0cmlidXRlIGVpbmVzIFNwaWVsZXJzLCBrb2VubmVuIGR1cmNoIE9iamVrdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBGbHVlY2hlIHVuZC9vZGVyIEtyYW5raGVpdGVuIG1hbmlwdWxpZXJ0IHdlcmRlbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIFNpZWhlIGF1Y2g6IGJtYW4gYXR0cmlidXRlCisKK1BfQVRUUklCVVRFU19NT0RJRklFUiA6IEhpZXIgd2VyZGVuIEF0dHJpYnV0LU1vZGlmaWVyIGdlc3BlaWNoZXJ0LCBkaWUgCisgICAgICAgICAgICAgICAgICAgICAgICB1ZWJlciBlaW5lbiBsYWVuZ2VyZW4gWmVpdHJhdW0gd2lya2VuIHNvbGxlbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIEJla2FubnRlc3RlIEJlaXNwaWVsZSBzaW5kIHdvaGwgZGVyIFRvZGVzLU1hbHVzCisgICAgICAgICAgICAgICAgICAgICAgICB1bmQgZGVyIEZyb3NjaC1NYWx1cy4gTm9ybWFsZSBBZW5kZXJ1bmdlbiBzb2xsdGVuCisgICAgICAgICAgICAgICAgICAgICAgICBwZXIgUF9YX0FUVFJfTU9EIG9kZXIgUF9NX0FUVFJfTU9EIHJlYWxpc2llcnQgCisgICAgICAgICAgICAgICAgICAgICAgICB3ZXJkZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIFNpZWhlIGF1Y2g6IGJtYW4gYXR0cmlidXRlCisKK1BfQ09NQkFUQ01EUyAgICAgICAgICA6IEJlaW5oYWx0ZXQgQmVmZWhsZSwgU2NoYWRlbnNob2VoZSB1bmQgLWFydGVuIGluIAorICAgICAgICAgICAgICAgICAgICAgICAgS2FtcGZvYmpla3RlbiwgZGFtaXQgZGllc2UgYXVjaCB2b24gTlBDIGJlbnV0enQKKyAgICAgICAgICAgICAgICAgICAgICAgIHdlcmRlbiBrb2VubmVuLgorICAgICAgICAgICAgICAgICAgICAgICAgU2llaGUgYXVjaDogYm1hbiBrYW1wZm9iamVrdGUKKworUF9DVVJTRUQgICAgICAgICAgICAgIDogT2JqZWt0ZSBpbiBkZW5lbiBoaWVyIGVpbiBTdHJpbmcgb2RlciBJbnQtV2VydCBnZS0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNldHp0IGlzdCwga29lbm5lbiBuaWNodCBhYmdlbGVndCB3ZXJkZW4uIEtsZXJpa2VyCisgICAgICAgICAgICAgICAgICAgICAgICBoYWJlbiBkaWUgRmFlaGlna2VpdCwgenUgZW50Zmx1Y2hlbgorCitQX0RBTUFHRUQgICAgICAgICAgICAgOiBHcmFkIGRlciBCZXNjaGFlZGlndW5nIGVpbmVyIFdhZmZlIG9kZXIgUnVlc3R1bmcuCisgICAgICAgICAgICAgICAgICAgICAgICBXaXJkIG1laXN0ZW5zIHBlciB3YWZmZS0+RGFtYWdlKHgpIHJlYWxpc2llcnQuIEthbm4KKyAgICAgICAgICAgICAgICAgICAgICAgIGJlaSBkaXYuIFNjaG1pZWRlbiB3aWVkZXIgYXVmIDAgZ2VzZXR6dCB3ZXJkZW4sIFRydmVzCisgICAgICAgICAgICAgICAgICAgICAgICBrb2VubmVuIGVzIGR1cmNoIFdhZmZlbnNjaGFlcmZlbiBzb2dhciBzZWxic3QKKworUF9EQU1fVFlQRSAgICAgICAgICAgIDogU2NoYWRlbnN0eXAsIGRlbiBlaW5lIFJ1ZXN0dW5nIG9kZXIgV2FmZmUgbWFjaHQKKyAgICAgICAgICAgICAgICAgICAgICAgIFNpZWhlIGF1Y2g6IGJtYW4gc2NoYWRlbnN0eXBlbgorCitQX0RFRkVORF9GVU5DICAgICAgICAgOiBHZXNldHp0IHdlbm4gZWluZSBSdWVzdHVuZyBlaW5lIERlZmVuZEZ1bmMgZGVmaW5pZXJ0CisgICAgICAgICAgICAgICAgICAgICAgICBoYXQuIFdlcnRlIGVpbmVyIERlZmVuZEZ1bmMgc2luZCBJTU1FUiBwZXIgcmFuZG9tCisgICAgICAgICAgICAgICAgICAgICAgICB6dSBnZWJlbiwgQXVzbmFobWU6IG5lZ2F0aXZlciBSdWVja2dhYmV3ZXJ0LiBBdWNoCisgICAgICAgICAgICAgICAgICAgICAgICBoaWVyIGlzdCBkYXJhdWYgenUgYWNodGVuLCBkYXMgUF9XQyArIFJ1ZWNrZ2FiZXdlcnQKKyAgICAgICAgICAgICAgICAgICAgICAgIG5pY2h0IHVlYmVyIGRlbiBHcmVuendlcnQga29tbWVuCisgICAgICAgICAgICAgICAgICAgICAgICBTaWVoZSBhdWNoOiBibWFuIGdyZW56d2VydGUsIGJtYW4gcnVlc3R1bmdlbgorCitQX0RJU0FCTEVfQVRUQUNLICAgICAgOiBHZXNldHp0IHdlbm4gZGFzIExlYmV3ZXNlbiBhdXNuYWhtc3dlaXNlIG1hbCBuaWNodAorICAgICAgICAgICAgICAgICAgICAgICAgYW5ncmVpZmVuIGthbm4uIEVzIHdpcmQgZGllIEFuemFobCBkZXIgS2FtcGZydW5kZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIChhbHNvIEhlYXJ0QmVhdHMpIGdlc2V0enQsIGluIGRlbmVuIGRpZSBQYXJhbHlzZQorICAgICAgICAgICAgICAgICAgICAgICAgd2lya3QuIE5ldWUgUGFyYWx5c2UtVG9vbHMgc2luZCBuaWNodCBnZXJuIGdlc2VoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIHVuZCBoYWJlbiB3ZW5pZyBDaGFuY2VuIGF1ZiBHZW5laG1pZ3VuZworCitQX0VGRkVDVElWRV9BQyAgICAgICAgOiBEaWUgZWZmZWt0aXZlIEFybW91ckNsYXNzIGVpbmVyIFJ1ZXN0dW5nLiBJc3QgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgIGVpbmVyIFJ1ZXN0dW5nIG5vY2ggZWluZSBQX0RFRkVORF9GVU5DIGRlZmluaWVydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvIGJldHJhZWd0IGlzdCBQX0VGRkVDVElWRV9BQyA9IFBfQUMgKyAyICogTWl0dGVsd2VydAorICAgICAgICAgICAgICAgICAgICAgICAgZGVzIGRvcnRpZ2VuIFJ1ZWNrZ2FiZXdlcnRlcworCitQX0VGRkVDVElWRV9XQyAgICAgICAgOiBEaWUgZWZmZWt0aXZlIFdlYXBvbkNsYXNzIGVpbmVyIFdhZmZlIG9kZXIgUnVlc3R1bmcuCisgICAgICAgICAgICAgICAgICAgICAgICBJc3QgaW4gZWluZXIgV2FmZmUgZWluZSBQX0hJVF9GVU5DIGRlZmluaWVydCwgc28gYmUtCisgICAgICAgICAgICAgICAgICAgICAgICByZWNobmV0IHNpY2ggZGllIFBfRUZGRUNUSVZFIGF1cyBkZXIgU3VtbWUgdm9uIFBfV0MKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuZCBkZW0gZG9wcGVsdGVuIE1pdHRlbHdlcnQgZGVzIGRvcnRpZ2VuIFJ1ZWNrZ2FiZS0KKwkJCXdlcnRlcworCitQX0hBTkRTICAgICAgICAgICAgICAgOiBFbnRoYWVsdCBtZWhyZXJlIEVpbnRyYWVnZSwgZGllIE1lbGR1bmcsIFN0YWVya2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGVpbmVzIEFuZ3JpZmZlcyBtaXQgYmxvc3NlbiBIYWVuZGVuIHVuZCBkZW4gb2RlcgorICAgICAgICAgICAgICAgICAgICAgICAgZGllIGRhYmVpIHZlcnVyc2FjaHRlbiBTY2hhZGVuc3R5cGVuIGJlaW5oYWx0ZW4KKworUF9ISVRfRlVOQyAgICAgICAgICAgIDogR2VzZXR6dCwgd2VubiBlaW5lIFdhZmZlIG9kZXIgUnVlc3R1bmcgZWluZSBIaXRGdW5jCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmllcnQgaGF0LiBEaWUgV2VydGUgbXVlc3NlbiBJTU1FUiBwZXIgcmFuZG9tCisgICAgICAgICAgICAgICAgICAgICAgICBnZWdlYmVuIHdlcmRlbi4gQXVjaCBoaWVyIHNpbmQgZWluemlnIG5lZ2F0aXZlIFJ1ZWNrLQorICAgICAgICAgICAgICAgICAgICAgICAgZ2FiZXdlcnRlIGRpZSBBdXNuYWhtZS4gRGFyYXVmIHp1IGFjaHRlbiBpc3QsIGRhcyAKKyAgICAgICAgICAgICAgICAgICAgICAgIFBfQUMgKyBSdWVja2dhYmV3ZXJ0IG5pY2h0IGRlbiBHcmVuendlcnQgdWViZXItCisgICAgICAgICAgICAgICAgICAgICAgICBzY2hyZWl0ZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIFNpZWhlIGF1Y2g6IGJtYW4gZ3Jlbnp3ZXJ0ZQorCitQX0hQICAgICAgICAgICAgICAgICAgOiBBa3R1ZWxsZSBMZWJlbnNwdW5rdGUgKEhlYWx0aFBvaW50cykgZWluZXMgTGViZS0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdlc2VucworCitQX0hQX0RFTEFZICAgICAgICAgICAgOiBOdW1lcmlzY2hlciBXZXJ0LCBkZXIgYW5naWJ0LCB3aWV2aWVsZSBIZWFydEJlYXRzCisgICAgICAgICAgICAgICAgICAgICAgICBub3R3ZW5kaWcgc2luZCwgZGFtaXQgc2ljaCBkaWUgUF9IUCB1bSAxIHJlZ2VuaWVyZW4KKworUF9IUF9IT09LUyAgICAgICAgICAgIDogV2FzIGZ1ZXIgT2JqZWt0ZSBzb2xsZW4gYmVpIGVpbmVyIEFlbmRlcnVuZyBkZXIgUF9IUAorICAgICAgICAgICAgICAgICAgICAgICAgYmVuYWNocmljaHRpZ3Qgd2VyZGVuPyBCZWthbm50ZXN0ZXMgQmVpc3BpZWwgaXN0IAorICAgICAgICAgICAgICAgICAgICAgICAgaGllciBzaWNoZXIgZGVyIFRlZGR5IGF1cyBkZXIgTmliZWx1bmdlbnF1ZXN0CisKK1BfTEVQICAgICAgICAgICAgICAgICA6IExFdmVsUG9pbnRzLCBhYnNvbHV0ZSBTdHVmZW5wdW5rdGUgZWluZXMgU3BpZWxlcnMuCisgICAgICAgICAgICAgICAgICAgICAgICBJc3QgbWFuY2htYWwgc2lubnZvbGxlciwgUF9MRVAgYWJ6dWZyYWdlbiBhbnN0YXR0CisgICAgICAgICAgICAgICAgICAgICAgICBQX0xFVkVMCisKK1BfTV9BVFRSX01PRCAgICAgICAgICA6IE1hcHBpbmcgbWl0IEF0dHJpYnV0ZW4gZGllIHZlcmFlbmRlcnQgd2VyZGVuLCB3ZW5uCisgICAgICAgICAgICAgICAgICAgICAgICBkYXMgTGViZXdlc2VuIGRpZXNlIFJVRVNUVU5HIG9kZXIgV0FGRkUgdHJhZWd0IG9kZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIHp1ZWNrdC4gSmVkZXMgQXR0cmlidXQga2FubiBudXIgZHVyY2ggZWluZW4gTW9kaWZpZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlZWluZmx1c3N0IHdlcmRlbi4gSXN0IGFsc28gZWluIEF0dHJpYnV0IGJsb2NraWVydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGthbm4gZGllIFJ1ZXN0dW5nL1dhZmZlIG5pY2h0IGFuZ2V6b2dlbi9nZXp1ZWNrdAorICAgICAgICAgICAgICAgICAgICAgICAgd2VyZGVuLiBGdWVyIEtyYW5raGVpdGVuIHVzdy4gZ2lidCBlcyBQX1hfQVRUUl9NT0QKKyAgICAgICAgICAgICAgICAgICAgICAgIFNpZWhlIGF1Y2g6IGJtYW4gYXR0cmlidXRlCisKK1BfTV9IRUFMVEhfTU9EICAgICAgICA6IE1hcHBpbmcgbWl0IGRlbSBkaWUgbWF4LiBQX0hQIHVuZCBtYXguIFBfU1AgZWluZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIExlYmV3ZXNlbnMgbWFuaXB1bGllcnQgd2VyZGVuIGtvZW5uZW4sIHdlbm4gZXMgZGllc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIFJVRVNUVU5HIG9kZXIgV0FGRkUgdHJhZWd0IG9kZXIgenVlY2t0LiBFcyBlcmZvbGd0CisgICAgICAgICAgICAgICAgICAgICAgICBrZWluZXJsZWkgQmxvY2thZGUuIEZ1ZXIgS3JhbmtoZWl0ZW4gdXN3LiBnaWJ0IGVzIAorICAgICAgICAgICAgICAgICAgICAgICAgUF9YX0hFQUxUSF9NT0QKKworUF9OT01BR0lDICAgICAgICAgICAgIDogV2VydCB6d2lzY2hlbiAwIChkZWZhdWx0KSB1bmQgMTAwLCBkZXIgZGVuIEdyYWQgYW4tCisgICAgICAgICAgICAgICAgICAgICAgICBnaWJ0LCBtaXQgd2VsY2hlciBXYWhyc2NoZWlubGljaGtlaXQgTWFnaWUga2VpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpcmt1bmcgZXJ6aWVsdC4gS2FubiBpbiBSYWV1bWVuLCBOcGMgdW5kIE9iamVrdGVuCisgICAgICAgICAgICAgICAgICAgICAgICBnZXNldHp0IHdlcmRlbi4gVm9uIFNwaWVsZXIgbmljaHQgZ2VybiBnZXNlaGVuIDopCisKK1BfTlJfSEFORFMgICAgICAgICAgICA6IFdpZXZpZWwgZnJlaWUgSGFlbmRlIHNpbmQgbm90d2VuZGlnLCB1bSBkaWVzZSBXYWZmZQorICAgICAgICAgICAgICAgICAgICAgICAgb2RlciBkaWVzZW4gU2NoaWxkIHp1IHp1ZWNrZW4/CisgCitQX1BBUlJZX1dFQVBPTiAgICAgICAgOiBJbiBXYWZmZW4gZ2VzZXR6dCB3ZW5uIGVzIHNpY2ggdW0gZWluZSBQYXJpZXJ3YWZmZQorICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGVsdAorICAgICAgICAgICAgICAgICAgICAgICAgU2llaGUgYXVjaDogYm1hbiBwYXJpZXJ3YWZmZW4KKworUF9QVVJTVUVSUyAgICAgICAgICAgIDogQmVpbmhhbHRldCBhbGxlIE9iamVrdGUvTnBjIGRpZSBkZW4gU3BpZWxlciBtb21lbnRhbgorICAgICAgICAgICAgICAgICAgICAgICAgdmVyZm9sZ2VuCisKK1BfUVVBTElUWSAgICAgICAgICAgICA6IEJlbGllYmlnZXIgV2VydCBpbiBXYWZmZW4uIFNldHp0IG1hbiBpaG4gYXVmIG4sIHNvIHdpcmQKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpZSBXYWZmZSBiZWkgamVkZW0gbi10ZW4gU2NobGFnIHVtIDEgUHVua3QgYmUtCisgICAgICAgICAgICAgICAgICAgICAgICBiZXNjaGFlZGlndCAoUF9EQU1BR0VEIGFsc28gdW0gMSBlcmhvZWh0KSB1bmQgZGllc2VyIAorICAgICAgICAgICAgICAgICAgICAgICAgdm9uIGRlciBQX0FDIGFiZ2V6b2dlbiwgZGVyIFNjaGFkZW4gbGFlc3N0IHNpY2ggaW4KKyAgICAgICAgICAgICAgICAgICAgICAgIGVpbmVyIFNjaG1pZWRlIHJlcGFyaWVyZW4uCisgICAgICAgICAgICAgICAgICAgICAgIAorUF9SRU1PVkVfRlVOQyAgICAgICAgIDogRnVua3Rpb24gZGllIHZvciBkZW0gQXVzemllaGVuIGVpbmVyIFJ1ZXN0dW5nIGF1Zi0KKyAgICAgICAgICAgICAgICAgICAgICAgIGdlcnVmZW4gd2lyZAorICAgICAgICAgICAgICAgICAgICAgICAgU2llaGUgYXVjaDogYm1hbiBydWVzdHVuZ2VuCisKK1BfUkVTSVNUQU5DRSAgICAgICAgICA6IFdhcyBmdWVyIFJlc2lzdGVuemVuIHNpbmQgZ2VzZXR6dD8gRW50aGFlbHQgZWluIAorICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkgZGVyIFNjaGFkZW5zdHlwZW4sIGdlZ2VuIGRpZSBkYXMgTGViZXdlc2VuCisgICAgICAgICAgICAgICAgICAgICAgICByZXNpc3RlbnQgc2VpbiBzb2xsLiBQX1JFU0lTVEFOQ0VfU1RSRU5HSFRTIGlzdCBoaWVyCisgICAgICAgICAgICAgICAgICAgICAgICB2aWVsIGdlbmF1ZXIgdW5kIHNvbGx0ZSBkZXN3ZWdlbiB2ZXJ3ZW5kZXQgd2VyZGVuCisKK1BfUkVTSVNUQU5DRV9NT0RJRklFUiA6IEhpZXIgc3RlaHQgZGllIFN1bW1lIGFsbGVyIE1vZGlmaWthdG9yZW4sIGRpZSAKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc2lzdGVuemVuIHVuZCBBbmZhZWxsaWdrZWl0ZW4gYmV0cmVmZmVuLiBEaWVzZQorICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydGllIHNvbGx0ZSBOSUUgZGlyZWt0IG1hbmlwdWxpZXJ0IHdlcmRlbgorCitQX1JFU0lTVEFOQ0VfU1RSRU5HSFRTOiBIdWVic2NoZXIgVHlwbyBiZWkgUmVhbGlzaWVydW5nIHZvbiBBbmZhZWxsaWdrZWl0ZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIHVuZCBSZXNpc3RlbnplbiBlaW5lcyBMZWJlbndlc2VucyA6LSkKKworUF9SRVNJU1RBTkNFX1NUUkVOR1RIUzogV2FzIGZ1ZXIgUmVzaXN0ZW56ZW4gb2RlciBBbmZhZWxsaWdrZWl0ZW4gaGF0IGRhcworICAgICAgICAgICAgICAgICAgICAgICAgTGViZXdlc2VuPyBHZXNldHp0IHdpcmQgZWluIE1hcHBpbmcgbWl0IGRlbgorICAgICAgICAgICAgICAgICAgICAgICAgU2NoYWRlbnN0eXBlbiB1bmQgZWluIGVudHNwcmVjaGVuZGVyIG51bWVyaXNjaGVyIAorICAgICAgICAgICAgICAgICAgICAgICAgV2VydC4gRGllc2VyIFdlcnQgZ2VodCB2b24gLTEgLi4gMCAuLiAxLCBpc3QgZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIG5lZ2F0aXYsIHNvIGlzdCBkYXMgTGViZXdlc2VuIHJlc2lzdGVudCwgaXN0IGVyIAorICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpdiwgc28gaXN0IGRhcyBMZWJld2VzZW4gYW5mYWVsbGlnCisKK1BfUkVTVFJJQ1RJT05TICAgICAgICA6IFdpcmQgdm9yIGRlbSBadWVja2VuIG9kZXIgQW56aWVoZW4gZWluZXIgV2FmZmUgb2RlcgorICAgICAgICAgICAgICAgICAgICAgICAgUnVlc3R1bmcgZ2VwcnVlZnQuIEhpZXIgbGFzc2VuIHNpY2ggZGl2ZXJzZSBXZXJ0ZQorICAgICAgICAgICAgICAgICAgICAgICAgYWJmcmFnZW4sIGRpZSBkYXMgdmVyaGluZGVybgorICAgICAgICAgICAgICAgICAgICAgICAgU2llaGUgYXVjaDogYm1hbiByZXN0cmlrdGlvbmVuCisKK1BfU1AgICAgICAgICAgICAgICAgICA6IFNwZWxsUG9pbnRzLCBha3R1ZWxsZSBLb256ZW50cmF0aW9uc3B1bmt0ZSBlaW5lcworICAgICAgICAgICAgICAgICAgICAgICAgTGViZXdlc2VucworCitQX1NQX0RFTEFZICAgICAgICAgICAgOiBOdW1lcmlzY2hlciBXZXJ0LCBkZXIgYW5naWJ0LCB3aWV2aWVsZSBIZWFydEJlYXRzCisgICAgICAgICAgICAgICAgICAgICAgICBub3R3ZW5kaWcgc2luZCwgZGFtaXQgc2ljaCBkaWUgUF9TUCB1bSAxIHJlZ2VuaWVyZW4KKworUF9VTldJRUxEX0ZVTkMgICAgICAgIDogRnVua3Rpb24sIGRpZSB2b3IgZGVtIFdlZ3N0ZWNrZW4gZWluZXIgV2FmZmUgYXVmLQorICAgICAgICAgICAgICAgICAgICAgICAgZ2VydWZlbiB3aXJkCisKK1BfVlVMTkVSQUJJTElUWSAgICAgICA6IEVtcGZpbmRsaWNoa2VpdGVuIGVpbmVzIE5wYy9TcGllbGVycywgc29sbHRlIHVlYmVyCisgICAgICAgICAgICAgICAgICAgICAgICBQX1JFU0lTVEFOQ0VfU1RSRU5HVEhTIHJlYWxpc2llcnQgd2VyZGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgCitQX1dDICAgICAgICAgICAgICAgICAgOiBXZWFwb25DbGFzcywgV2VydCBkZXIgZGllIEd1ZXRlIGVpbmVyIFdhZmZlIGFuZ2lidC4KKyAgICAgICAgICAgICAgICAgICAgICAgIEFic29sdXRlciBPYmVyd2VydCBpc3QgMjAwCisgICAgICAgICAgICAgICAgICAgICAgICBTaWVoZSBhdWNoOiBibWFuIGdyZW56d2VydGUKKworUF9XRUFQT05fVFlQRSAgICAgICAgIDogVW0gd2FzIGZ1ZXIgZWluZSBXYWZmZSBoYW5kZWx0IGVzIHNpY2g/IEtldWxlLCBTcGVlcgorICAgICAgICAgICAgICAgICAgICAgICAgb2RlciBBeHQ/IE9kZXIgd2FzIGFuZGVyZXM/IAorICAgICAgICAgICAgICAgICAgICAgICAgU2llaGUgYXVjaDogYm1hbiB3YWZmZW4KKworUF9XRUFSX0ZVTkMgICAgICAgICAgIDogRnVua3Rpb24gZGllIHZvciBkZW0gQW56aWVoZW4gZWluZXIgUnVlc3R1bmcgYXVmLQorICAgICAgICAgICAgICAgICAgICAgICAgZ2VydWZlbiB3aXJkLiBTaWUga2FubiBkYXMgQW56aWVoZW4gdmVyaGluZGVybiwgaGllcgorICAgICAgICAgICAgICAgICAgICAgICAgaXN0IG9mdG1hbHMgZWluIEVpbnRyYWcgaW4gUF9SRVNUUklDVElPTlMgc2lubnZvbGxlcgorICAgICAgICAgICAgICAgICAgICAgICAgU2llaGUgYXVjaDogYm1hbiByZXN0cmlrdGlvbmVuCisKK1BfV0lFTERfRlVOQyAgICAgICAgICA6IEZ1bmt0aW9uLCBkaWUgdm9yIGRlbSBadWVja2VuIGVpbmVyIFdhZmZlIGF1ZmdlcnVmZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIHdpcmQuIFNpZSBrYW5uIGRhcyBadWVja2VuIHZlcmhpbmRlcm4uIE9mdG1hbHMgaXN0CisgICAgICAgICAgICAgICAgICAgICAgICBkYSBlaW4gRWludHJhZyBwZXIgUF9SRVNUUklDVElPTlMgdm9ydGVpbGhhZnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgU2llaGUgYXVjaDogYm1hbiByZXN0cmlrdGlvbmVuCisKK1BfWF9BVFRSX01PRCAgICAgICAgICA6IE1hcHBpbmcgbWl0IEF0dHJpYnV0ZW4gZGllIHZlcmFlbmRlcnQgd2VyZGVuLCB3ZW5uCisgICAgICAgICAgICAgICAgICAgICAgICBkYXMgTGViZXdlc2VuIGRpZXNlcyBPQkpFS1QgYmVpIHNpY2ggaGF0LiBJc3QgZnVlcgorICAgICAgICAgICAgICAgICAgICAgICAgS3JhbmtoZWl0ZW4gdS5hZS4gZ2VkYWNodC4gQmVrYW5udGVzIEJlaXNwaWVsIHNpbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpZSBGbHVlY2hlLCBkaWUgbWFuIHNpY2ggYXVmIEFraGFyIE50aCd0YXIgd2VnLQorICAgICAgICAgICAgICAgICAgICAgICAgaG9sZW4ga2FubgorICAgICAgICAgICAgICAgICAgICAgICAgU2llaGUgYXVjaDogYm1hbiBhdHRyaWJ1dGUKKworUF9YX0hFQUxUSF9NT0QgICAgICAgIDogTWFwcGluZyBtaXQgZGVtIGRpZSBtYXguIFBfSFAgdW5kIG1heC4gUF9TUCBlaW5lcworICAgICAgICAgICAgICAgICAgICAgICAgTGViZXdlc2VucyB2ZXJhZW5kZXJ0IHdlcmRlbiwgZGFzIGRpZXNlcyBPQkpFS1QgYmVpCisgICAgICAgICAgICAgICAgICAgICAgICBzaWNoIHRyYWVndC4gT2huZSBuYWNoZ2VzZWhlbiB6dSBoYWJlbiBzYWcgaWNoIG1hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhcyBlcyBzbyB6LkIuIGJlaW0gUmF0dGVuYmx1dCBnZW1hY2h0IHdpcmQKKyAgICAgICAgICAgICAgICAgICAgICAgIFNpZWhlIGF1Y2g6IGJtYW4ga2FtcGZvYmpla3RlCmRpZmYgLS1naXQgYS9kb2MvYmFsYW5jZS9yZXNpc3RlbnplbiBiL2RvYy9iYWxhbmNlL3Jlc2lzdGVuemVuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYjkyYTkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmFsYW5jZS9yZXNpc3RlbnplbgpAQCAtMCwwICsxLDU5IEBACisKKyBSRVNJU1RBTkNFIE1PRElGSUVSOgorICAgIFNvbGwgZWluIE9iamVrdCBpbiBlaW5lbSBTcGllbGVyIFJlc2lzdGFuY2VNb2RpZmllciBzZXR6ZW4sIGdlbHRlbgorICAgIGZvbGdlbmRlIFJlZ2VsbjoKKworICAgIGEpIEVzIG11c3Mgc2ljaCB1bSBlaW5lIFJ1ZXN0dW5nIGhhbmRlbG4gKGluIGdhbnogc2VsdGVuZW4gRmFlbGxlbgorICAgICAgIHdlcmRlbiBhdWNoIFdhZmZlbiBtaXQgZGllc2VyIE1vZWdsaWNoa2VpdCBlcmxhdWJ0KS4gQmVpIFJ1ZXN0dW5nZW4KKyAgICAgICBtdXNzIF9uaWNodF8gQWRkUmVzaXN0YW5jZU1vZGlmaWVyKCkgYmVudXR6dCB3ZXJkZW4sIHNvbmRlcm4gZXMgCisgICAgICAgZ2VudWVndCwgUF9SRVNJU1RBTkNFX1NUUkVOR1RIIGluIGRlciBSdWVzdHVuZyB6dSBzZXR6ZW4uICBEYWJlaSAKKyAgICAgICB3ZXJkZW4gX2FuZGVyc18gYWxzIGJlaSBBZGRSZXNpc3RhbmNlTW9kaWZlcigpIFByb3plbnR3ZXJ0ZSBkZXIgCisgICAgICAgbWF4aW1hbCBlcmxhdWJ0ZW4gUmVzaXN0ZW56IGZ1ZXIgZGVuIGVudHNwcmVjaGVuZGVuIFJ1ZXN0dW5nc3R5cCAKKyAgICAgICBhbmdlZ2ViZW4uIERpZXNlIHdlcmRlbiBiZWltIFRyYWdlbiBkZXIgUnVlc3R1bmcgYXV0b21hdGlzY2gKKyAgICAgICBpbiB0YXRzYWVjaGxpY2hlIFJlc2lzdGVuemVuIGRlcyBUcmFlZ2VycyB1bWdlcmVjaG5ldC4KKyAgICAgICAoQmVpc3BpZWwgc2llaGUgIm1hbiBQX1JFU0lTVEFOQ0VfU1RSRU5HVEhTIikuCisKKyAgICBiKSBEYXMgT2JqZWt0IG11c3MgbmF0dWVybGljaCBnZW5laG1pZ3Qgd2VyZGVuLgorCisgICAgYykgRGllIFN1bW1lIGFsbGVyIFJlc2lzdGVuemVuIGRhcmYgbWF4LiAtMC4xNSBiZXRyYWdlbi4gQXVzc2VyZGVtCisgICAgICAgbXVlc3NlbiB6dSBqZWRlbSBTY2hhZGVuc3R5cCBnbGVpY2h6ZWl0aWcgRW1wZmluZGxpY2hrZWl0ZW4gaW4KKyAgICAgICBtaW5kZXN0ZW5zIGdsZWljaGVyIFN0YWVya2UgYmVpIGVpbmVtIGFuZGVyZW4gU2NoYWRlbnN0eXAgZ2VzZXR6dAorICAgICAgIHdlcmRlbiBvZGVyIGRpZSBSZXNpc3RlbnplbiBtdWVzc2VuIG1pdCBhbmRlcmVuIE5hY2h0ZWlsZW4gKHouQi4KKyAgICAgICBBdWZsb2VzdW5nIGRlcyBPYmpla3RlIGJlaSBBbmdyaWZmIG1pdCBlaW5lbSBiZXN0aW1tdGVuIFNjaGFkZW5zdHlwKQorICAgICAgIGF1c2dlZ2xpY2hlbiB3ZXJkZW4uCisgICAgICAgCisgICAgICAgQmVpIFJ1ZXN0dW5nZW4gZGFyZiBtYXhpbWFsIGVpbmUgcmVsYXRpdmUgUmVzaXN0ZW56IHZvbiAKKyAgICAgICAobG9naXNjaGVyd2Vpc2UpIDEwMCUgZWluZ2V0cmFnZW4gd2VyZGVuLiAxMDAlIGluIGRlciBQcm9wZXJ0eQorICAgICAgIFBfUkVTSVNUQU5DRV9TVFJFTkdUSCBlaW5lciBSdWVzdHVuZyBiZWRldXRlbiBmb2xnZW5kZSBSZXNpc3RlbnplbgorICAgICAgIGltIFRyYWVnZXI6CisgICAgICAgCisgICAgICAgQVRfQVJNT1IsCisgICAgICAgQVRfU0hJRUxEIDogLTAuMTUKKyAgICAgICAKKyAgICAgICBBVF9DTE9BSywKKyAgICAgICBBVF9SSU5HLAorICAgICAgIEFUX0FNVUxFVCA6IC0wLjEwCisgICAgICAgCisgICAgICAgQVRfTUlTQyAgIDogbmljaHQgZ2VzdGF0dGV0IQorCisgICAgICAgYW5kZXJlICAgIDogLTAuMDUKKyAgICAgICAKKyAgICBkKSBadXIgbGVpY2h0ZXJlbiAnSWRlbnRpZml6aWVyYmFya2VpdCcgc29sbHRlbiBkaWUgUmVzaXN0YW5jZU1vZGlmaWVyCisgICAgICAgc29sbHRlbiBkaWUgZ2VzZXR6dGVuIE1vZGlmaWVyIGF1Y2ggaW4gZGVtIHNldHplbmRlbiBPYmpla3QgYWxzCisgICAgICAgUF9SRVNJU1RBTkNFX1NUUkVOR1RIUyBnZXNldHp0IHdlcmRlbi4gQmVpIFJ1ZXN0dW5nZW4gTVVTUyBkaWVzCisgICAgICAgZ2VzY2hlaGVuIChzaWVoZSBhKSApLgorCisgICAgZSkgRXMgZHVlcmZlbiBrZWluZSBtZWNoYW5pc2NoZW4gUmVzaXN0ZW56ZW4gZ2VzZXR6dCB3ZXJkZW4uIFNjaHV0egorICAgICAgIHZvciBtZWNoYW5pc2NoZW4gQW5ncmlmZmVuIHdpcmQgZHVyY2ggZGllIFJ1ZXN0dW5nZW4gc293aWVzbyAKKyAgICAgICBzY2hvbiBnZXdhZWhydCAoaW0gR2VnZW5zYXR6IHp1IFNjaHV0eiB2b3IgbmljaHRtZWNoYW5pc2NoZW4pLiBVbmQKKyAgICAgICBORUlOLCBkYSBnaWJ0IGVzIGtlaW5lIEF1c25haG1lbiEKKworIFNJRUhFIEFVQ0gKKworICAgICBiYWxhbmNlLCBydWVzdHVuZ2VuLCB3YWZmZW4sIGZlcm53YWZmZW4sIHVuaXF1ZXMsIG5wY3MsCisgICAgIGF0dHJpYnV0c3ZlcmFlbmRlcnVuZ2VuLCBrYW1wZm9iamVrdGUsIGdyZW56d2VydGUKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIDIwMDMtMDgtMjksIFpvb2suCmRpZmYgLS1naXQgYS9kb2MvYmFsYW5jZS9yZXN0cmlrdGlvbmVuIGIvZG9jL2JhbGFuY2UvcmVzdHJpa3Rpb25lbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzhiYjdkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JhbGFuY2UvcmVzdHJpa3Rpb25lbgpAQCAtMCwwICsxLDMwIEBACitFcyBpc3QgbW9lZ2xpY2gsIFdhZmZlbiB1bmQgUnVlc3R1bmdlbiB6dSBiZXNjaHJhZW5rZW4sIHNvIGRhc3Mgc2llCitudXIgdm9uIFNwaWVsZXJuIGJlbnV0enQgd2VyZGVuIGtvZW5uZW4sIGRpZSBnZXdpc3NlIEtyaXRlcmllbiBlcmZ1ZWxsZW4uCitEaWVzZSBQcnVlZnVuZyB3aXJkIGFsbGVyZGluZ3MgX251cl8gYmVpbSBadWVja2VuIG9kZXIgQW56aWVoZW4gZ2VwcnVlZnQuCitTb2xsdGUgc2ljaCBkaWUgZW50c3ByZWNoZW5kZSBFaWdlbnNjaGFmdCBkZXMgU3BpZWxlcnMgd2FlaHJlbmQgZGVyCitCZW51dHp1bmcgYWVuZGVybiwga2FubiBlciBvZGVyIHNpZSBkYXMgZW50c3ByZWNoZW5kZSBUZWlsIHdlaXRlcgorbnV0emVuLCBiaXMgZXMgYXVzZ2V6b2dlbi93ZWdnZXN0ZWNrdCB3aXJkLgorCitVbSBzb2xjaGUgUmVzdHJpa3Rpb25lbiB6dSBpbXBsZW1lbnRpZXJlbiwgbXVzcyBlaW4gRWludHJhZyBpbiBkaWUKK1Byb3BlcnR5IFBfUkVTVFJJQ1RJT05TIGVyZm9sZ2VuLiBXYXMga2FubiBkb3J0IGFsbGVzIGVpbmdldHJhZ2VuCit3ZXJkZW4/CisKKy0gTWluZGVzdHdlcnRlIGZ1ZXIgYWxsZSBBdHRyaWJ1dGUgKEdlc2NoaWNrbGljaGtlaXQgZXRjLikKKy0gTWluZGVzdHdlcnRlIGZ1ZXIgLSBRdWVzdHB1bmt0ZQorICAgICAgICAgICAgICAgICAgICAtIFNwaWVsZXJsZXZlbAorICAgICAgICAgICAgICAgICAgICAtIEVyZmFocnVuZ3NwdW5rdGUKKy0gU3BpZWxlcnJhc3NlIG9kZXIgZWluZSBMaXN0ZSB2b24gZWluLSBiencuIGF1c2dlc2NobG9zc2VuZW4gUmFzc2VuCistIEdpbGRlbmxldmVsIChtYWNodCBudXIgd2VuaWcgU2lubikKKy0gU2VoZXJzdGF0dXMKKy0gTWF4aW1hbHdlcnRlIGZ1ZXIgQWxrb2hvbCwgRXNzZW4sIFRyaW5rZW4KKy0gR2VzaW5udW5nIChuYWNoIG9iZW4gdW5kIHVudGVuKQorLSBLb2VycGVyZ3JvZXNzZSAobmFjaCBvYmVuIHVuZCB1bnRlbikKKy0gQW56YWhsIGRlciBmcmVpZW4gSGFlbmRlCisKK0RpZSBCZWRpbmd1bmdlbiBzaW5kIGJlbGllYmlnIHp1IGtvbWJpbmllcmVuLCBtYW4ga2FubiBhbHNvIGVpbmUgV2FmZmUKK3Byb2dyYW1taWVyZW4sIGRpZSBudXIgdm9uIHVlYmVyIDIgTWV0ZXIgZ3Jvc3NlbiBzYXRhbmlzY2hlbiBIb2JiaXRzCitnZXp1ZWNrdCB3ZXJkZW4ga2FubiwgZGllIGVpbmVuIGxlZXJlbiBNYWdlbiBoYWJlbi4gKFZlcm11dGxpY2ggZWluZQorcmllc2lnZSBGbGVpc2NoZ2FiZWwuLi4pCitGdWVyIGd1dGUgV2FmZmVuIHVuZCBSdWVzdHVuZ2VuIHNpbmQgYWxsZXJkaW5ncyB2ZXJtdXRsaWNoIGluIGVyc3RlciBMaW5pZQorZGllIFJlc3RyaWt0aW9uZW4gU3BpZWxlcmxldmVsLCBTZWhlcnN0YXR1cyB1bmQgdmllbGxlaWNodCBub2NoIEF0dHJpYnV0ZQoraW50ZXJlc3NhbnQuIFZpZWxsZWljaHQgYXVjaCBub2NoIEVyZmFocnVuZ3NwdW5rdGUuCmRpZmYgLS1naXQgYS9kb2MvYmFsYW5jZS9ydWVzdHVuZ2VuIGIvZG9jL2JhbGFuY2UvcnVlc3R1bmdlbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzdhNzM1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JhbGFuY2UvcnVlc3R1bmdlbgpAQCAtMCwwICsxLDEyOCBAQAorQWxsZ2VtZWluZXMgdW5kIGdlbmVyZWxsZXMgdWViZXIgUnVlc3R1bmdlbjoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUHJvcGVydGllczoKKworICAgICAgICBQX1dFSUdIVAorICAgICAgICAgICBCaXR0ZSByZWFsaXN0aXNjaCBoYWx0ZW4uIFJpbmdlIG1pdCB3ZWl0IHVlYmVyIDEwMCBHcmFtbSBzaW5kCisgICAgICAgICAgIFNjaHdhY2hzaW5uLCBlYmVuc28gSG9zZW4gbWl0IEdld2ljaHRlbiB1bnRlciAyMDAgdXN3LgorICAgICAgICAgICBPcmllbnRpZXJ1bmdlbiBhbiBtaXR0ZWxhbHRlbiBSdWVzdHVuZ2VuOyBiZWkgbmV1ZXJlbiB0cmV0ZW4genVtCisgICAgICAgICAgIFRlaWwgbGFlY2hlcmxpY2hlIFdlcnRlIGF1ZiwgZGllIGJlaSBHZWxlZ2VuaGVpdCBhbmdlcGFzc3Qgd2VyZGVuCisgICAgICAgICAgIG11ZXNzZW4uCisKKyAgICAgICAgUF9WQUxVRQorICAgICAgICAgICBXZXJ0IGRlciBSdWVzdHVuZ2VuIHNvbGx0ZSBhdWNoIG5pY2h0IHp1IGdyb3NzIHNlaW4gdW5kIHNpY2ggZWluCisgICAgICAgICAgIHdlbmlnIGFuIGRlciBBQyBvcmllbnRpZXJlbi4gRWJlbmZhbGxzOiBSTXMsIHNjaGF1dCBnZW5hdSBoaW4uCisKKyAgICAgICAgUF9BUk1PVVJfVFlQRQorICAgICAgICAgICBCaXR0ZSBzaW5udm9sbCBiZW51dHplbiEgS2xlaWRlciBhbHMgSG9zZW4gZGVmaW5pZXJlbiBvZGVyCisgICAgICAgICAgIGFlaG5saWNoZXMgaXN0IHVuc2lubmlnIHVuZCBzb2xsdGUgbmljaHQgZ2VuZWhtaWd0IHdlcmRlbi4gU2luZCBtYWwKKyAgICAgICAgICAgd2llZGVyIGRpZSBSTXMgZnVlciB6dXN0YWVuZGlnLiBCaXR0ZSBhY2h0ZXQgZHJhdWYhCisKKyAgICAgICAgRm9sZ2VuZGUgUnVlc3R1bmdzdHlwZW4gc2luZCBtb2VnbGljaDoKKworICAgICAgICAgICAgQVRfQVJNT1VSCisgICAgICAgICAgICAgICBBbGxlcyB3YXMgaXJnZW5kd2llIGRlbiBUb3JzbyBzY2h1ZXR6dC4gQWxzbyB2b3JuIHVuZCBoaW50ZW4sCisgICAgICAgICAgICAgICB3aWUgZWluIFB1bGxvdmVyLCBlaW4gS2V0dGVuaGVtZCwgZWluIFBhbnplciBldGMuCisgICAgICAgICAgICBBVF9DTE9BSworICAgICAgICAgICAgICAgVW1oYWVuZ2UsIGF1Y2ggaW0gd2VpdGVyZW4gU2lubiB3aWUgRGVja2VuIHVuZCBTY2hsZWllci4gSW0KKyAgICAgICAgICAgICAgIFByaW56aXAgZGFzLCB3YXMgbm9ybWFsZXJ3ZWlzZSBudXIgZGVuIFJ1ZWNrZW4gc2NodWV0enQsIGJlaQorICAgICAgICAgICAgICAgQmVkYXJmIGFiZXIgYXVjaCB2b3JuIGhlcnVtIGdld2lja2VsdCB3ZXJkZW4ga29lbm50ZS4KKyAgICAgICAgICAgIEFUX0hFTE1FVAorICAgICAgICAgICAgICAgS29wZmJlZGVja3VuZ2VuIGplZGVyIEFydCwgdm9tIG5vcm1hbGVuIEh1dCB1ZWJlciBLcm9uZW4gYmlzCisgICAgICAgICAgICAgICBoaW4genUgU3Rpcm5iYWVuZGVybiAod2VubiBzaWUgc2NodWV0emVuIHNvbGxlbikKKyAgICAgICAgICAgIEFUX1RST1VTRVJTCisgICAgICAgICAgICAgICBIb3Nlbi4gQWxsZXMgd2FzIHp1bSB1ZWJlcndpZWdlbmRlbiBUZWlsIGRhenUgZ2VkYWNodCBpc3QsIGRpZQorICAgICAgICAgICAgICAgQmVpbmUgdW5kL29kZXIgZGVuIFBvcG8genUgc2NodWV0emVuLCBhbHNvIGF1Y2ggU2NodWVyemVuIG9kZXIKKyAgICAgICAgICAgICAgIExlZ2dpbnMuIE5hdHVlcmxpY2ggZ2Vob2VyZW4gYXVjaCBCYWRlaG9zZW4gb2RlciBMZW5kZW5zY2h1ZXJ6ZQorICAgICAgICAgICAgICAgaGllcmhlci4gQUMgZGFubiBzZWxic3R2ZXJzdGFlbmRsaWNoIGdlcmluZy4KKyAgICAgICAgICAgIEFUX0JPT1QKKyAgICAgICAgICAgICAgIFNjaHVoZSwgU3RpZWZlbCB1bmQgRnVzc2Jla2xlaWR1bmdlbiBqZWRlciBBcnQuCisgICAgICAgICAgICBBVF9HTE9WRQorICAgICAgICAgICAgICAgSGFuZHNjaHVoZSBvZGVyIGFsbGVzLCB3YXMgbWFuIHNvIHp1bSBTY2h1dHogZGVyIG9iZXJlbgorICAgICAgICAgICAgICAgRXh0cmVtaXRhZXRlbiBiZW51dHp0LCB3aWUgQXJtc2Nob25lciwgR2xhY2VoYW5kc2NodWhlLAorICAgICAgICAgICAgICAgRmFldXN0bGluZ2UsIEJveGhhbmRzY2h1aGUgZXRjLgorICAgICAgICAgICAgQVRfUVVJVkVSCisgICAgICAgICAgICAgICBLb2VjaGVyIHVuZCBhZWhubGljaGVzLCBpbiBkZW5lbiBtYW4gTXVuaXRpb24gZnVlcgorICAgICAgICAgICAgICAgU2NodXNzd2FmZmVuIHVudGVyYnJpbmdlbiBrYW5uLiBTY2h1ZXR6ZW4gdHV0IHNvd2FzCisgICAgICAgICAgICAgICBuYXR1ZXJsaWNoIG5pY2h0LgorICAgICAgICAgICAgQVRfU0hJRUxECisgICAgICAgICAgICAgICBBbGxlcywgd2FzIG1hbiBzbyBhbnN0ZWxsZSBkZXIgZWlnZW5lbiBBcm1lIGluIGVpbmVuCisgICAgICAgICAgICAgICBnZWduZXJpc2NoZW4gU2NobGFnIGhhbHRlbiBrYW5uIHVuZCBkYXMgbmljaHQgb2ZmaXppZWxsIGFscworICAgICAgICAgICAgICAgV2FmZmUgZGVrbGFyaWVydCBpc3QuIEVzIHNvbGx0ZSBuaWNodCBncmFkZSBhdXMgUGFwaWVyCisgICAgICAgICAgICAgICBiZXN0ZWhlbiwgdW5kIGRhcyBHZXdpY2h0IGlzdCBtaXQgZW50c2NoZWlkZW5kIGZ1ZXIgZGllIEd1ZXRlCisgICAgICAgICAgICAgICBkZXMgU2NoaWxkZXMuIFNpZSB3ZXJkZW4gc2VociB3ZW5pZyBpbSBNRyBnZW51dHp0LCB3YXMKKyAgICAgICAgICAgICAgIGVpZ2VudGxpY2ggc2VsdHNhbSBpc3QuIFNjaGxpZXNzbGljaCBlcnJlaWNodCBlaW4gZ3V0ZXIgU2NoaWxkCisgICAgICAgICAgICAgICBkaWUgR3VldGUgdm9uIEhlbG0sIEhvc2UgdW5kIEhhbmRzY2h1aGVuIHp1c2FtbWVuIG9kZXIgMy80IGRlcgorICAgICAgICAgICAgICAgUXVhbGl0YWV0IGVpbmVyIFJ1ZXN0dW5nLiBBbmRlcmVyc2VpdHM6IGVzIGdpYnQgYXVjaCBuaWNodCBzZWhyCisgICAgICAgICAgICAgICB2aWVsZSBTY2hpbGRlLiBEYSBoZXJyc2NodCBCZWRhcmYhCisgICAgICAgICAgICBBVF9SSU5HCisgICAgICAgICAgICAgICBSaW5nZS4gUHJpbnppcGllbGwgc29sbHRlIGdlbHRlbiwgZGFzIFJpbmdlIHByYWt0aXNjaCBrZWluZSAgICAgCisJICAgICAgICAgICAgIFNjaHV0endpcmt1bmcgaGFiZW4gKGFsc28gQUMgMSBvZGVyIG1heC4gMikuIE51ciwgdW5kIGRhZnVlcgorCSAgICAgICAgICAgICBzaW5kIGRpZSBEaW5nZXIgZGEsIHdlbm4gc2llIG1hZ2lzY2ggc2luZCBrb2VubmVuIHNpZQorCSAgICAgICAgICAgICB6dXNhZXR6bGljaGUgRnVua3Rpb25lbiBoYWJlbi4KKyAgICAgICAgICAgIEFUX0FNVUxFVAorICAgICAgICAgICAgICAgSW0gUHJpbnppcCBkYXNzZWxiZSB3aWUgYmVpIEFUX1JJTkcsIG51ciB3ZXJkZW4gZGllIERpbmdlcgorICAgICAgICAgICAgICAgbWVpc3QgYW4gS29yZGVsbiB1bSBkZW4gSGFscyBvZGVyIGFscyBCcm9zY2hlbiBhbiBkZW4gS2xhbW90dGVuCisgICAgICAgICAgICAgICBnZXRyYWdlbiwga29lbm50ZW4gYWxzbyBqZSBuYWNoIEdyb2Vzc2UgdGF0c2FlY2hsaWNoIG1laHIKKyAgICAgICAgICAgICAgIFNjaHV0eiBiaWV0ZW4gYWxzIGVpbiBSaW5nLiBBYmVyIGF1Y2ggaGllciBnaWx0OiBBQz4yIHNjaHJlaXQKKyAgICAgICAgICAgICAgIG5hY2ggRXJrbGFlcnVuZyB1bmQgc29sbHRlIG1hZ2lzY2hlbiBEaW5nZXJuIHZvcmJlaGFsdGVuCisgICAgICAgICAgICAgICBibGVpYmVuLgorICAgICAgICAgICAgQVRfQkVMVAorICAgICAgICAgICAgICAgR3VlcnRlbCBhbGxlciBBcnQgKHouQi4gV2FmZmVuZ3VlcnRlbCBvZGVyIE1hZ2lzdGVyZ3VlcnRlbAorICAgICAgICAgICAgICAgZGVyIFphdWJlcmVyKS4gU2NodXR6d2lya3VuZyBoYXQgc293YXMgbmF0dWVybGljaCBrYXVtLgorICAgICAgICAgICAgQVRfTUlTQworICAgICAgICAgICAgICAgQWxsZXMsIHdhcyBtYW4gc29uc3Qgbm9jaCBzbyBhbnppZWhlbiBrYW5uLCB3YXMgYWJlciBlaGVyIGFscworICAgICAgICAgICAgICAgWmllcnJhdCBnZWRhY2h0IGlzdC4gQUMgaW1tZXIgMC4gQml0dGUgKmtlaW5lKgorICAgICAgICAgICAgICAgS2xlaWR1bmdzc3R1ZWNrZSwgZGllIGluIGVpbmUgZGVyIGFuZGVyZW4gS2F0ZWdvcmllbiBwYXNzZW4sCisgICAgICAgICAgICAgICBhbHMgQVRfTUlTQyBkZWZpbmllcmVuLiBEYW5uIGxpZWJlciBkaWUgQUMgc2VociB0aWVmLiBXZW5uIGVzCisgICAgICAgICAgICAgICBlaCBhbHMgR2FnIGdlZGFjaHQgaXN0IGtvZW5uZW4gZGllIFNwaWVsZXIgc2ljaCBhdWNoIGJlaSBCZWRhcmYKKyAgICAgICAgICAgICAgIHVtemllaGVuLgorCisgICAgICAgIFBfRUZGRUNUSVZFX0FDCisgICAgICAgICAgIEZhbGxzIGVpbmUgRGVmZW5kRnVuYyB2b3JoYW5kZW4gaXN0IHVuZCBkaWUgcmVndWxhZXJlIEFDCisgICAgICAgICAgIHZlcmFlbmRlcnQsIHNvbGx0ZSBzaWUgZ2VzZXR6dCB3ZXJkZW4uIEVzIHdpcmQgZGVyCisgICAgICAgICAgIER1cmNoc2Nobml0dHN3ZXJ0IGRlciBBQyBpbmNsLiBkZXIgRGVmZW5kRnVuYyBnZXNldHp0LiBEaWVudCBkZXIKKyAgICAgICAgICAgS2FlbXBmZXJnaWxkZSB6dXIgRWluc2NoYWV0enVuZywgd2lyZCBhdWNoIHZvbiBHaWxkZW4gZXZ0bC4genVyCisgICAgICAgICAgIEJlcmVjaG51bmcgdm9uIFp1c2F0enNjaHV0eiBvZGVyIHdlaXRlcmVuIEVmZmVrdGVuIHZlcndlbmRldC4KKworICAgICAgICBQX0RBTV9UWVBFCisgICAgICAgICAgIEF1Y2ggUnVlc3R1bmdlbiBrb2VubmVuIGVpbmVuIERhbWFnZS1UeXAgaGFiZW4uIE51dHplbiB0dXQgZGFzCisgICAgICAgICAgIGJpc2hlciBudXIgZGllIEthZW1wZmVyZ2lsZGUsIGFiZXIgc2NoYWRlbiB0dXQncyBrZWluZW0uIERlZmF1bHQKKyAgICAgICAgICAgaXN0IERUX0JMVURHRU9OLgorCisgICAgICAgIFBfTk9CVVkKKyAgICAgICAgICAgQWxsZSBSdWVzdHVuZ2VuIGFiIDIvMyBkZXIgbWF4aW1hbCBmdWVyIGRlbiBqZXdlaWxpZ2VuIFJ1ZXN0dW5nc3R5cAorICAgICAgICAgICB6dWxhZXNzaWdlbiBBQyB3ZXJkZW4gYmVpbSBWZXJrYXVmIGltIExhZGVuIGVpbmJlaGFsdGVuLiBEZW5ub2NoCisgICAgICAgICAgIHNvbGx0ZW4gYmVzb25kZXJlIFJ1ZXN0dW5nZW4gUF9OT0JVWSBnZXNldHp0IGhhYmVuLiBJbnNiZXNvbmRlcmUKKyAgICAgICAgICAgd2FlcmUgZGFzIGZ1ZXIgYWxsZXMgbWl0IERlZmVuZEZ1bmNzIHp1IHd1ZW5zY2hlbiwgYWJlciBhdWNoCisgICAgICAgICAgIFNhY2hlbiwgZGllIGFscyBHYWcgZ2VkYWNodCBzaW5kLiBEYWZ1ZXIga29lbm5lbiBzaWNoIGRpZSBTcGllbGVyCisgICAgICAgICAgIHJ1aGlnIGV0d2FzIHJlY2tlbi4KKworICAgICAgICBQX0RBTUFHRUQKKyAgICAgICAgICAgIERpZXNlIFByb3BlcnR5IChzaWUgZ2lidCBkZW4gR3JhZCBkZXIgQmVzY2hhZWRpZ3VuZyBlaW5lciBXYWZmZQorICAgICAgICAgICAgb2RlciBSdWVzdHVuZyBhbikgc29sbHRlIG1hbiBfbmljaHRfIHBlciBIYW5kIHNldHplbi4gU3RhdHRkZXNzZW4KKyAgICAgICAgICAgIHJ1ZnQgbWFuIGluIGRlciBSdWVzdHVuZyBEYW1hZ2UoaW50KSBhdWYuIEVpbiBwb3NpdGl2ZXIgUGFyYW1ldGVyCisgICAgICAgICAgICBiZWRldXRldCBlaW5lIEJlc2NoYWVkaWd1bmcsIGVpbiBuZWdhdGl2ZXIgUmVwYXJhdHVyIHVtIGRpZXNlbgorICAgICAgICAgICAgV2VydC4gSW4gZGVyIEZ1bmt0aW9uIHdlcmRlbiBhbGxlIG5vdHdlbmRpZ2VuIEJlZGluZ3VuZ2VuCisgICAgICAgICAgICBnZXBydWVmdCAobWF4aW1hbGUgUnVlc3R1bmdza2xhc3NlIGV0YykuCisKKworU3BlemlhbHJ1ZXN0dW5nZW4vUnVlc3R1bmdlbiBtaXQgU29uZGVyZnVua3Rpb246CisKKyAgICAgICBBbGxlIFJ1ZXN0dW5nZW4sIGRpZSB1ZWJlciBlaW5lIERlZmVuZEZ1bmMgb2RlciBhZWhubGljaGVzIHZlcmZ1ZWdlbgorICAgICAgIHNpbmQgZ2VuZWhtaWd1bmdzcGZsaWNodGlnLgorCisgICAgICAgUHJpbnppcGllbGwgc29sbHRlbiBkaWUgZ2VsdGVuZGVuIEdyZW56d2VydGUgbmljaHQgdWViZXJzY2hyaXR0ZW4gCisgICAgICAgd2VyZGVuOyBBdXNuYWhtZW4ga29lbm5lbiB1bnRlciBVbXN0YWVuZGVuIGdlbmVobWlndAorICAgICAgIHdlcmRlbi4gSW1tZXIgaXN0IGRlciBSZXR1cm4tV2VydCBwZXIgcmFuZG9tKCkgenVydWVja3p1bGllZmVybiwgZGEgZGVyCisgICAgICAgV2VydCBvaG5lIHdlaXRlcmVzIHJhbmRvbSgpIGF1ZmFkZGllcnQgd2lyZC4KKworICAgICAgIFNhZW10bGljaGUgU29uZGVyZnVua3Rpb25lbiwgd2llIEhlaWx1bmdlbiwgU29uZGVyYXR0YWNrZW4gYXVmIEdlZ25lciwKKyAgICAgICBXYWZmZW5iZXNjaGFlZGlndW5nZW4gZXRjLiBtdWVzc2VuIGdlbmVobWlndCB3ZXJkZW4uCisKKyAgICAgICBEaWUgUHJvcGVydGllcywgbWl0IGRlbmVuIEhhbmRzY2h1aGUgJ2hhbmRmcmVpJyBiencgJ2ZpbmdlcmZyZWknIGdlbWFjaHQKKyAgICAgICB3ZXJkZW4sIGR1ZXJmZW4gbnVyIHZlcmdlYmVuIHdlcmRlbiwgd2VubiBkaWUgSGFuZHNjaHVoZSBkZW4gU2NoYWRlbiBkZXIgSGFuZAorICAgICAgIG5pY2h0IHZlcmFlbmRlcm4gdW5kIGRpZSBCZXNjaHJlaWJ1bmcgZGVyIEhhbmRzY2h1aGUgZGF6dSBwYXNzdC4KKworLS0tLS0tLS0tLS0tLS0tLS0tLSBMRVRaVEUgQUVOREVSVU5HOiBIdW1uaSwgMjAxMS0xMC0xMwpkaWZmIC0tZ2l0IGEvZG9jL2JhbGFuY2Uvc2NoYWRlbnN0eXBlbiBiL2RvYy9iYWxhbmNlL3NjaGFkZW5zdHlwZW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE4OTZmMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iYWxhbmNlL3NjaGFkZW5zdHlwZW4KQEAgLTAsMCArMSw0OCBAQAorU2NoYWRlbnN0eXBlbjoKKworRXMgd2VyZGVuIHp3ZWkgQXJ0ZW4gdm9uIFNjaGFkZW5zdHlwZW4gdW50ZXJzY2hpZWRlbjoKKworYSkgcGh5c2lrYWxpc2NoZSBTY2hhZGVuc3R5cGVuCisKKyAgIERUX0JMVURHRU9OICAgICAgU2NobGFnc2NoYWRlbiwgei5CLiBLZXVsZW4KKyAgIERUX0VYUExPU0lPTiAgICAgU2NoYWRlbiBkdXJjaCBlaW5lIEV4cGxvc2lvbgorICAgRFRfUElFUkNFICAgICAgICBTdGVjaHNjaGFkZW4sIHouQi4gTGFuemVuCisgICBEVF9SSVAgICAgICAgICAgIFJlaXNzZW5kZXIgU2NoYWRlLCB6LkIuIEtyYWxsZW4KKyAgIERUX1NMQVNIICAgICAgICAgU2Nobml0dHNjaGFkZW4sIHouQi4gU2Nod2VydGVyCisgICBEVF9TUVVFRVpFICAgICAgIFF1ZXRzY2hzY2hhZGVuLCB6LkIuIFRlbnRha2VsCisgICBEVF9XSElQICAgICAgICAgIFBlaXRzY2hlbnNjaGFkZW4sIHouQi4gUGVpdHNjaGVuCisKKyAgIEFsbGUgcGh5c2lrYWxpc2NoZW4gU2NoYWRlbnN0eXBlbiBzdGVoZW4gYXVjaCBpbiBkZW0gTWFwcGluZworICAgUEhZU0lDQUxfREFNQUdFX1RZUEVTLgorCitiKSBtYWdpc2NoZSBTY2hhZGVuc3R5cGVuCisKKyAgIERUX0FDSUQgICAgICAgICAgU2FldXJlc2NoYWRlbgorICAgRFRfQUlSICAgICAgICAgICBMdWZ0KG1hbmdlbClzY2hhZGVuCisgICBEVF9DT0xEICAgICAgICAgIEthZWx0ZXNjaGFkZW4KKyAgIERUX0ZJUkUgICAgICAgICAgRmV1ZXJzY2hhZGVuCisgICBEVF9IT0xZICAgICAgICAgIEhlaWxpZ2VyIFNjaGFkZW4KKyAgIERUX0xJR0hUTklORyAgICAgQmxpdHpzY2hhZGVuCisgICBEVF9NQUdJQyAgICAgICAgIEdlbmVyZWxsZXIgbWFnaXNjaGVyIFNjaGFkZW4KKyAgIERUX1BPSVNPTiAgICAgICAgR2lmdHNjaGFkZW4KKyAgIERUX1NPVU5EICAgICAgICAgTGFlcm1zY2hhZGVuCisgICBEVF9URVJST1IgICAgICAgIEFuZ3N0c2NoYWRlbgorICAgRFRfVU5IT0xZICAgICAgICBVbmhlaWxpZ2VyL2RhZW1vbmlzY2hlciBTY2hhZGVuCisgICBEVF9XQVRFUiAgICAgICAgIFdhc3NlcnNjaGFkZW4KKworICAgQWxsZSBtYWdpc2NoZW4gU2NoYWRlbnN0eXBlbiBzdGVoZW4gYXVjaCBpbiBkZW0gTWFwcGluZworICAgTUFHSUNBTF9EQU1BR0VfVFlQRVMuCisKK1dhZmZlbiBkdWVyZmVuIG1heGltYWwgNTAlIGhvbW9nZW5lbiBtYWdpc2NoZW4gU2NoYWRlbiBtYWNoZW4uIAorRGllIFN1bW1lIGRlciBtYWdpc2NoZW4gU2NoYWVkZW4gZGFyZiBtYXhpbWFsIDY2JSBiZXRyYWdlbi4gCitFcyBfbXVzc18gaW1tZXIgbWluZGVzdGVucyBlaW4gcGh5c2lrYWxpc2NoZXIgU2NoYWRlbiBnZXNldHp0IAorc2Vpbi4gRGVyIEFudGVpbCBhbiBwaHlzaWthbGlzY2hlbSBTY2hhZGVuIGJldHJhZWd0IGRlbXp1Zm9sZ2UKK2ltbWVyIG1pbmRlc3RlbnMgMzQlLiBTb2xjaGUgV2FmZmVuIHNpbmQgZ2VuZXJlbGwgZ2VuZWhtaWd1bmdzLQorcGZsaWNodGlnLgorCitHZW5laG1pZ3VuZ3NwZmxpY2h0aWcgc2luZCBhdWNoIGdlbmVyZWxsIFdhZmZlbiwgZGllIGFscyBTY2hhZGVucy0KK3R5cCBEVF9URVJST1IsIERUX1NPVU5ELCBEVF9BSVIgb2RlciBEVF9TUVVFRVpFIGVudGhhbHRlbi4KKworRGVyIFNjaGFkZW5zdHlwIERUX0VYUExPU0lPTiB3aXJkIG5pY2h0IG1laHIgZ2VuZWhtaWd0LgorCisKZGlmZiAtLWdpdCBhL2RvYy9iYWxhbmNlL3RlY2huaWtlbiBiL2RvYy9iYWxhbmNlL3RlY2huaWtlbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzEwZWFlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JhbGFuY2UvdGVjaG5pa2VuCkBAIC0wLDAgKzEsMTA4IEBACisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIERpZXNlciBUZXh0IGlzdCB2ZXJhbHRldC4gRGllIFRlY2huaWtlbiB3ZXJkZW4gdm9uIGRlciBNdWRsaWIgbmljaHQgICAgICAqCisqIGF1c2dld2VydGV0IHVuZCBtb21lbnRhbiBhdWNoIHZvbiBrZWluZXIgR2lsZGUgKEF1c25haG1lOiBkaWUgVGFuamlhbiAgICAqCisqIHplaWd0IHNpZSBhbiwgdHV0IGFiZXIgbml4IGRhbWl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFBfVEVDSE5JUVVFOiBUZWNobmlrZW4sIG1pdCBkZW5lbiBXYWZmZW4gZWluZ2VzZXR6dCB3ZXJkZW4ga29lbm5lbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUUV9USFJBU0ggLSAiU2NobGFndGVjaG5payIKKworICAgIERpZSB2b20gVmVyc3RhZW5kbmlzIGhlciBlaW5mYWNoc3RlIFRlY2huaWs6IE1hbiBuZWhtZSBzaWNoIGVpbmVuCisgICAgR2VnZW5zdGFuZCwgIGRlciBncm9zcyBnZW51ZyBpc3QgdW5kIGhhbGJ3ZWdzICBicmF1Y2hiYXJlICBEaWNodGUgCisgICAgYmVzaXR6dCAtIGFsc28gbmljaHQgZ2VyYWRlIGZlZGVybGVpY2h0ICBmdWVyIHNlaW5lIEdyb2Vzc2UgaXN0IC0gCisgICAgdW5kIGhhdWUgZHJhdWYuICBFZ2FsIG9iIEhlbmtlcnNheHQsICBTdG9jaywgIFN0dWhsLCAgQmllcmZsYXNjaGUgCisgICAgKGdhbnopLCBLbnVlcHBlbCwgS2V1bGUgb2RlciBCcmF0cGZhbm5lLCAgZGFzIHVuZCBhZWhubGljaGVzIHNpbmQgCisgICAgYnJhdWNoYmFyZSAgJ1dhZmZlbicsICB1bSBtaXQgZGllc2VyIFRlY2huaWsgRXJmb2xnIHp1IGhhYmVuLiAgRXMgCisgICAgaXN0IGVpbmUgc2NobGFnZW5kZSBCZXdlZ3VuZywgIGFsc28gZGFzIGdld29sbHRlIHNjaHd1bmdoYWZ0ZSBadS0KKyAgICBzYW1tZW5mdWVocmVuIHp3ZWllciBLb2VycGVyLCBmdWVyIGdld29laG5saWNoIFdhZmZlIHVuZCBHZWduZXIuCisKKworVFFfVEhSVVNUIC0gIlN0b3NzdGVjaG5payIKKworICAgIEF1Y2ggZGllc2UgVGVjaG5payBlcmZyZXV0IHNpY2ggenVtaW5kZXN0IGluIEtuZWlwZW5zY2hsYWVnZXJlaWVuCisgICAgZ3Jvc3NlciBCZWxpZWJ0aGVpdDogRGFzIFN0b3NzZW4uICBNaXQgZWluZW0gdm9yenVnc3dlaXNlIHNwaXR6ZW4KKyAgICBHZWdlbnN0YW5kIHdpZSBTcGVlciwgRG9sY2gsIEJpZXJmbGFzY2hlICh6ZXJicm9jaGVuKSBvZGVyIEhlbGxlLQorICAgIGJhcmRlICB3aXJkIGRlbSBHZWduZXIgZWluIExvY2ggaW4gZGVuIExlaWIgIGdlc3Rvc3NlbiwgIGltIEZhbGxlIAorICAgIGVpbmVzICAgc3R1bXBmZW4gR2VnZW5zdGFuZGVzIHdpZSB6LkIuICBlaW5lbSBLYW1wZnN0b2NrIG9kZXIgZGVtIAorICAgIGVpZ2VuZW4gIFplaWdlZmluZ2VyIG9kZXIgS25vZWNoZWwgemllbHQgbWFuIGF1ZiBWaXRhbHB1bmt0ZSBvZGVyCisgICAgV2VpY2h0ZWlsZSB1bmQgZXJ6aWVsdCBhdWNoIGRhbWl0IGJlZWluZHJ1Y2tlbmRlIEVyZ2Vibmlzc2UuICBEYXMKKyAgICBHZXdpY2h0IGRlciBXYWZmZSBpc3QgIHdlbmlnZXIgdm9uIEJlZGV1dHVuZywgIGRhICBkZXIgQWt0ZXVyIGJlaSAKKyAgICBlaW5lbSBrb3JyZWt0IGF1c2dlZnVlaHJ0ZW0gc2VpbmUgZWlnZW5lIE1hc3NlIG1pdCBlaW5zZXR6dC4KKworCitUUV9TVFJPS0UgLSAiU3RyZWljaHRlY2huaWsiCisKKyAgICBFaW4gZXR3YXMgZWlnZW53aWxsaWcgYW5tdXRlbmRlciBCZWdyaWZmLCAgYWJlciBiZWkgZ2VuYXVlcmVyIEJlLQorICAgIHRyYWNodHVuZyBoYXQgIGRpZXNlIFRlY2huaWsgdGF0c2FlY2hsaWNoIGV0d2FzIG1pdCBTdHJlaWNoZWxuIHp1CisgICAgdHVuOiAgRGllIHdpY2h0aWdzdGUgS29tcG9uZW50ZSBkZXIgQmV3ZWd1bmcgZnVlaHJ0IG1laHIgb2RlciB3ZS0KKyAgICBuaWdlciBhbSAgR2VnbmVyIF9lbnRsYW5nXyB1bmQgbmljaHQgYXVmIGlobiB6dS4gIE1hbiBzdGVsbGUgc2ljaCAKKyAgICBlaW4gU2Nod2VydCB2b3IsIGRhcyBnZXNjaG1laWRpZyBkdXJjaCBkaWUgS2VobGUgZWluZXMgT3JrcyBnbGVpLQorICAgIHRldCAgdW5kIGVpbmUgTWVuZ2UgQmx1dCAgZnJlaXNldHp0IG9kZXIgZWluIFBlcmdhbWVudGJsYXR0LCAgZGFzCisgICAgbWFuIGF1cyBkZXIgSGFuZCBnZXpvZ2VuIGJla29tbXQgICh1bmQgZWJlbmZhbGxzIGVpbmUgTWVuZ2UgIEJsdXQKKyAgICBmcmVpc2V0enQpLiAgSW4gZGVuIGFsbGVybWVpc3RlbiBGYWVsbGVuIGlzdCBhbHNvIGVpbmUgbW9lZ2xpY2hzdAorICAgIHNjaGFyZmUgU2NobmVpZGUgaW0gU3BpZWwgdW5kLCBhdWNoIHdlbm4gc2NobWVyemhhZnRlIEVyZmFocnVuZ2VuCisgICAgbWl0ICBQYXJnYW1lbnRrYW50ZW4gZ2VsZWdlbnRsaWNoIGdlZ2VudGVpbGlnZXMgIHZlcm11dGVuIGxhc3NlbiwgCisgICAgamUgc2NoYWVyZmVyIGRpZSBTY2huZWlkZSwgZGVzdG8gd2VuaWdlciBEcnVjayBpbiBSaWNodHVuZyBmZWluZC0KKyAgICBsaWNoZW4gIFppZWxrb2VycGVyICBtdXNzIGZ1ZXIgIGVpbmVuICAiZHVyY2hzY2huZWlkZW5kZW4gRXJmb2xnIiAKKyAgICBhdXNnZXVlYnQgd2VyZGVuLgorCisKK1RRX1dISVAgLSAiUGVpdHNjaHRlY2huaWsiCisKKyAgICBVbnRlciBkZXIgUGVpdHNjaHRlY2huaWsgd2lyZCBudW4gYWxsZXMgenVzYW1tZW5nZWZhc3N0LCAgd2FzIGRlbgorICAgIFVtZ2FuZyBtaXQgYmV3ZWdsaWNoZW4gRWxlbWVudGVuIGFuIGRlciBXYWZmZSBiZXRyaWZmdC4gIEVnYWwsIG9iCisgICAgUGVpdHNjaGUgYSBsYSBHZW9yZ2UgTHVjYXMsIG5ldW5zY2h3YWVuemlnZSBLYXR6ZSwgTWFucmlraS1HdXNhcmkKKyAgICAoZWluZSBoYWxibWV0ZXIgbGFuZ2UgS2V0dGUgbWl0IEdld2ljaHRlbiBhbiBkZW4gRW5kZW4pLCBlaW4tIGJpcworICAgIGRyZWlrb2VwZmlnZW0gIGJla2V0dGV0ZW4gTW9yZ2Vuc3Rlcm4gb2RlciBnYXIgRHJlc2NoZmxlZ2VsLCAgc2llIAorICAgIHNpbmQgenVtaW5kZXN0dGVpbHdlaXNlIHNlaHIgdW50ZXJzY2hpZWRsaWNoIGtvbnppcGllcnQgKHNvIGZlaGx0CisgICAgZGVyICBQZWl0c2NoZSBhbSBhZXVzc2VyZW4gRW5kZSBkYXMgR2V3aWNodCwgIHNvIGRhc3MgamVuZXMgZHVyY2gKKyAgICBlaW5lIGdlZ2VubGFldWZpZ2UgQmV3ZWd1bmcgYmVzY2hsZXVuaWd0IHdlcmRlbiBtdXNzKSwgaGFiZW4gYWJlcgorICAgIGVpbmVzIGdlbWVpbnNhbTogRGVyIFNjaGFkZW4gd2lyZCBkdXJjaCBlaW4gdWViZXIgZGllIG5vcm1hbGUgQmUtCisgICAgd2VndW5nIGRlcyBLYWVtcGZlcnMgIGhpbmF1cyBiZXNjaGxldW5pZ3RlcyBUZWlsIGRlciBXYWZmZSB2ZXJ1ci0KKyAgICBzYWNodC4gRHVyY2ggamVuZSBCZXdlZ2xpY2hrZWl0IGRlciAgV2FmZmUgd2lyZCBlaW4gc2VociAgZ3Jvc3NlcyAKKyAgICBNYXNzIGFuIEtvb3JkaW5hdGlvbnN2ZXJtb2VnZW4gdm9tIEthZW1wZmVyIGFidmVybGFuZ3QuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVmVybWlzY2h0ZXMKKworICAgIC0gV2FmZmVuIGtvZW5uZW4gIHNpY2ggZnVlciBtZWhyZXJlICBUZWNobmlrZW4gZWlnbmVuLiAgTWl0IGVpbmVtCisgICAgICBLYXRhbmEsIGRlbSBTY2h3ZXJ0IGRlciBTYW11cmFpLCBiZWlzcGllbHN3ZWlzZSBrYW5uIG1hbiBpbiBkaWUKKyAgICAgIHVuZ2VzY2h1ZXR6dGVuIFBhcnRpZW4gZGVzIEdlZ25lcnMgc3RlY2hlbiwgIGRlbSBHZWduZXIgbWl0IGRlciAKKyAgICAgIFN0cmVpY2h0ZWNobmlrIHRpZWZlIFNjaG5pdHRlIGluIGRpZSBVbnRlcnNlaXRlbiBkZXIgQXJtZSAgKGVpbgorICAgICAgZHVyY2ggdHlwaXNjaGUgU2FtdXJhaXJ1ZXN0dW5nZW4gc2NobGVjaHQgZ2VzY2h1ZXR6dGVyIEJlcmVpY2gpCisgICAgICB6dWZ1ZWdlbiwgdW5kIG1pdCBkZXIgYmVydWVobXRlbiBoYWxiZW4gS29lcnBlcmRyZWh1bmcgZGVtIGluLQorICAgICAgendpc2NoZW4gdGF1bWVsbmRlbSBLb250cmFoZW50ZW4gZGVuIEtvcGYgYWJzY2hsYWdlbi4gCisKKyAgICAtIFdhZmZlbiBrb2VubmVuIHNpY2gsIG9id29obCB2b24gZGVyIGdsZWljaGVuIEdhdHR1bmcsIGZ1ZXIgdmVyLQorICAgICAgc2NoaWVkZW5lIFRlY2huaWtlbiBlaWduZW4uICBFaW4gc3BpdHplciBEb2xjaCBtYWcgZWluZSBzdHVtcGZlCisgICAgICBLbGluZ2UgaGFiZW4gIHVuZCBudXIgZnVlciBhdXNzY2hsaWVzc2xpY2ggc3Rvc3NlbmRlICBQcmFrdGlrZW4KKyAgICAgIHp1IGdlYnJhdWNoZW4genUgc2Vpbiwgd2FlaHJlbmQgZWluIGFiZ2VydW5kZXRlcyBLdWVjaGVubWVzc2VyLAorICAgICAgZWJlbmZhbGxzIHZvbSBUeXAgIlp5biIsIGZ1ZXIga2FudGlnZXMgWnVzY2hsYWdlbiB1bmQgZXZlbnR1ZWxsCisgICAgICBhdWNoIGZ1ZXIgc2Nobml0dGlnZSBTdHJlaWNodGVjaG5pa2VuIGhlcmhhbHRlbiBrYW5uLgorCisgICAgLSBKZSBuYWNoIFp3ZWNrIHVuZCBLb2VubmVuIHdpcmQgZGllIGJlc3RlIHp1IHZlcndlbmRlbmRlIFRlY2huaWsgCisgICAgICB2YXJpaWVyZW46ICBXZW5uIGVzIHVtIGFybWUgR3Jhc2hhbG1lIGdlaHQsICB3aXJkIGRpZSBTZW5zZSBtaXQgCisgICAgICBzY2huZWlkZW5kZW4gQmV3ZWd1bmdlbiBnZWZ1ZWhydCAgKHNjaG9lbiBpbiBkZXIgIE1pbGthLVdlcmJ1bmcgCisgICAgICB6dSBzZWhlbiwgIGZ1ZXIgZGllLCBkaWUgZXMgcGFydG91dCBuaWNodCBnbGF1YmVuIHdvbGxlbiksICBiZWkgCisgICAgICBlaW5lciBCYXVlcm5yZXZvbHRlIG1hZyBkYXMgZ3V0ZSBTdHVlY2sgamVkb2NoIGF1Y2ggbWl0IGFuZGVyZW4gCisgICAgICBUZWNobmlrZW4gZWZmZWt0aXYgKHVuZCB2aWVsbGVpY2h0IHNvZ2FyIGVmZmVrdGl2ZXIpIGVpbmdlc2V0enQgCisgICAgICB3ZXJkZW4sIHdlciB3ZWlzcywgd2VyIHdhciBzY2hvbiBkYWJlaS4uLj8gIFNlbGJzdCBiZWkgbm9ybWFsZW4KKyAgICAgIFdhZmZlbiB3aWUgU2Nod2VydGVybiAgd3VlcmRlIGVpbiBVbmdldWVidGVyICBzZWx0ZW4gdmVyc3VjaGVuLCAgCisgICAgICBtaXQgU3RyZWljaHRlY2huaWtlbiBTY2hhZGVuIHp1IHZlcnVyc2FjaGVuLCBkZW5uIGRhcyBadXN0ZWNoZW4gCisgICAgICBpc3Qgc2NobGljaHQgZWluZmFjaGVyLgorCisgICAgLSBFcyB3aXJkIGltbWVyICBiZXNvbmRlcmUgV2FmZmVuIGdlYmVuLiAgU28gIHNpbmQgYmVpc3BpZWxzd2Vpc2UKKyAgICAgIGRhcyBad2VpbGlsaWVuIHVuZCAgZGllIEhlbGxlYmFyZGUgIGJlaWRlIGRlbSBUeXAgIkt6cm9rIiAoZnVlcgorICAgICAgbmljaHQtVHJ2ZXM6IFN0YW5nZW53YWZmZW4pIHp1enVvcmRuZW4sIGRpZSBUZWNobmlrZW4gIHdlaWNoZW4sCisgICAgICBiZWRpbmd0ICBkdXJjaCBkaWUgVmllbHNlaXRpZ2tlaXQgIGRlciBXYWZmZW4sICBqZWRvY2ggdm9uICBkZXIKKyAgICAgIE5vcm0gYWI6IERhcyBad2VpbGlsaWVuLCBhbiBqZWRlbSAgRW5kZSBlaW5lIGxhbmdlIHVuZCAgc2NoYXJmZQorICAgICAgS2xpbmdlLCAga2FubiAgZWJlbnNvICB2aWVsc2VpdGlnICBnZWhhbmRoYWJ0ICB3ZXJkZW4gIHdpZSAgZWluIAorICAgICAgU2Nod2VydCwgIHdhZWhyZW5kIGRpZSBIZWxsZWJhcmRlIChlaW5lIE1pc2NodW5nIGF1cyAgTGFuemUgdW5kCisgICAgICBBeHQpIGR1cmNoIGlocmUgdW5hdXNnZXdvZ2VuZSBHZXdpY2h0c3ZlcnRlaWx1bmcgIHVuZCBkZW0gZGFtaXQKKyAgICAgIHZlcmJ1bmRlbmVuIFBvdGVuemlhbCBhbiBTY2h3dW5nIHNjaGxpY2h0d2VnIERJRSBXYWZmZSBkZXIgV2FobCAKKyAgICAgIGZ1ZXIgZmVpZ2UgWndlcmdlIGlzdDogIFNjaHdpbmdlbiB3aWUgZWluZSBncm9zc2UgIEF4dCB1bmQgIGRlbiAKKyAgICAgIEdlZ25lciBhdWYgRGlzdGFueiBoYWx0ZW4ga29lbm5lbi4gIEd1dCwgIGRhc3MgZXMga2VpbmUgIGZlaWdlbiAKKyAgICAgIFp3ZXJnZSBnaWJ0IDtvKQpkaWZmIC0tZ2l0IGEvZG9jL2JhbGFuY2Uvd2FmZmVuIGIvZG9jL2JhbGFuY2Uvd2FmZmVuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZmE2ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmFsYW5jZS93YWZmZW4KQEAgLTAsMCArMSwxMTIgQEAKK0FsbGdlbWVpbmVzIHVuZCBnZW5lcmVsbGVzIHp1IFdhZmZlbjoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICBQX1dDCisgICAgICAgIERpZSBXQyBzb2xsdGUgZWluaWdlcm1hc3NlbiAicmVhbGlzdGlzY2giIGdld2FlaGx0IHdlcmRlbi4gRGllCisgICAgICAgIFZlcmFudHdvcnR1bmcgaGllcmZ1ZXIgb2JsaWVndCBkZW4gamV3ZWlsaWdlbiBSTXMuIFNpZSBzb2xsdGUKKyAgICAgICAgendpc2NoZW4gY2EuIDM1IHVuZCAyMDAgbGllZ2VuLiBBdWYgamVkZW4gRmFsbCBzaW5kIGRpZSBha3R1ZWxsZW4KKyAgICAgICAgR2VuZWhtaWd1bmdzZ3JlbnplbiB6dSBiZWFjaHRlbi4gU29sbHRlIGRpZSBXQyBkaWVzZSBHcmVuemVuCisgICAgICAgIHVlYmVyc2NocmVpdGVuLCB1bnRlcmxpZWd0IGRpZSBXYWZmZSBhdXNzZXIgZGVyIEdlbmVobWlndW5nIGR1cmNoCisgICAgICAgIGRlbiBSTSBkZXIgQmV1cnRlaWx1bmcgZHVyY2ggZGFzIFdhZmZlbmdyZW1pdW0uCisKKyAgIFBfTlJfSEFORFMKKyAgICAgICAgV2FmZmVuIHVlYmVyIGVpbmVyIGVmZmVrdGl2ZW4gV0Mgdm9uIDE1MCBtdWVzc2VuIHp3ZWloYWVuZGlnIHNlaW4uCisgICAgICAgIEF1c25haG1lbiBrb2VubmVuIHVudGVyIFVtc3RhZW5kZW4gZ2VuZWhtaWd0IHdlcmRlbiwgenVtIEJlaXNwaWVsCisgICAgICAgIHdlbm4gZGllIFdhZmZlIHNjaHdlciBlcnJlaWNoYmFyIG9kZXIgemFobGVubWFlc3NpZyBiZWdyZW56dCwgZWluZQorICAgICAgICBRdWVzdGJlbG9obnVuZyBldGMuIGlzdC4gQWxsZSBlaW5oYWVuZGlnZW4gV2FmZmVuIHVlYmVyIFdDIDE0MCBzaW5kCisgICAgICAgIGluIGplZGVtIEZhbGwgZ2VuZWhtaWdlbiB6dSBsYXNzZW4uCisKKyAgICAgICAgTWVzc2VyIG11ZXNzZW4gZ2VuZXJlbGwgZWluaGFlbmRpZyBzZWluIQorCisgICBQX1dFSUdIVCAKKyAgICAgICAgQml0dGUgcmVhbGlzdGlzY2ggaGFsdGVuLiBEYW1pdCBpc3QgKm5pY2h0KiBkYXMgUkwtR2V3aWNodAorICAgICAgICBnZW1laW50LCBzb25kZXJuIG1hbiBzb2xsdGUgYW0gYmVzdGVuIHZlcmdsZWljaGJhcmUgV2FmZmVuIGRlcworICAgICAgICBNRyBhbHMgTWFzc3N0YWIgbnV0emVuLiBEYSBoaWVyIHouVC4gZ3JhdmllcmVuZGUgRGlza3JlcGFuemVuIAorICAgICAgICBiZXN0ZWhlbiwgZXZ0bC4gbWFsIG1laHJlcmUgdmVyZ2xlaWNoZW4uIERpZSBWZXJhbnR3b3J0dW5nIAorICAgICAgICBoaWVyZnVlciBvYmxpZWd0IGRlbiBSTXMuCisKKyAgICAgICAgV2FmZmVuIG1pdCBlaW5lbSBHZXdpY2h0IHZvbiB1ZWJlciA0MDAwIEdyYW1tIHNvbGx0ZW4gbm9ybWFsZXJ3ZWlzZQorICAgICAgICBhdWNoIHp3ZWloYWVuZGlnIHNlaW4gb2RlciBtdWVzc2VuIGRlciBCYWxhbmNlIHZvcmdlbGVndCB3ZXJkZW4uCisJCisgICBQX1ZBTFVFCisgICAgICBXaWUgYmVpIFBfV0VJR0hUIHNpbmQgZGllIFJNcyBnZWZyYWd0OiBBdWdlbm1hc3MgemFlaGx0LiBXZXJ0ZQorICAgICAgdWViZXIgMTAwMDAgb2RlciBzbyBzaW5kIHp3YXIgbmV0dCwgYWJlciBzaW5ubG9zIHVuZCB1bnJlYWxpc3Rpc2NoLgorCisgICBQX0RBTV9UWVBFCisgICAgICBKZWRlIFdhZmZlLCBkaWUgYXVzIHBoeXNpa2FsaXNjaGVtIE1hdGVyaWFsIGJlc3RlaHQgKGFsc28gZmFrdGlzY2gKKyAgICAgIGFsbGVzIG1pdCBIYXJkd2FyZSkgKm11c3MqIGVpbmVuIHBoeXNpa2FsaXNjaGVuIFNjaGFkZW5zdHlwIGhhYmVuLgorCisgICBQX1dFQVBPTl9UWVBFCisgICAgICBXVF9TV09SRCwgV1RfQVhFLCAgV1RfQ0xVQiwgV1RfU1BFQVIsIFdUX0tOSUZFLCBXVF9BTU1VLCBXVF9NQUdJQywKKyAgICAgIFdUX1dISVAsIFdUX1NUQUZGLCBXVF9NSVNDLCBXVF9SQU5HRURfV0VBUE9OIAorCisgICBQX0RBTUFHRUQKKyAgICAgIERpZXNlIFByb3BlcnR5IChzaWUgZ2lidCBkZW4gR3JhZCBkZXIgQmVzY2hhZWRpZ3VuZyBlaW5lciBXYWZmZQorICAgICAgb2RlciBSdWVzdHVuZyBhbikgc29sbHRlIG1hbiBfbmljaHRfIHBlciBIYW5kIHNldHplbi4gU3RhdHRkZXNzZW4KKyAgICAgIHJ1ZnQgbWFuIGluIGRlciBXYWZmZSBEYW1hZ2UoaW50KSBhdWYuIEVpbiBwb3NpdGl2ZXIgUGFyYW1ldGVyCisgICAgICBiZWRldXRldCBlaW5lIEJlc2NoYWVkaWd1bmcsIGVpbiBuZWdhdGl2ZXIgUmVwYXJhdHVyIHVtIGRpZXNlbgorICAgICAgV2VydC4gSW4gZGVyIEZ1bmt0aW9uIHdlcmRlbiBhbGxlIG5vdHdlbmRpZ2VuIEJlZGluZ3VuZ2VuCisgICAgICBnZXBydWVmdCAobWluaW1hbGUvbWF4aW1hbGUgV2FmZmVua2xhc3NlIGV0YykuCisKKyAgIFBfRUZGRUNUSVZFX1dDCisgICAgICBIaWVyIGthbm4gZGllIGV2dGwgZHVyY2ggZWluZSBIaXRGdW5jIHZlcmFlbmRlcnRlIFdDIGFuZ2VnZWJlbgorICAgICAgd2VyZGVuLiBEZXIgRHVyY2hzY2huaXR0c3dlcnQgc29sbCBkYSBzdGVoZW4uIERpZSBLYWVtcGZlcmdpbGRlCisgICAgICBrYW5uIGRhcyBpbiBnZXdpc3NlbiBHcmVuemVuIGFic2NoYWV0emVuIHVuZCBlcyB3aXJkIGF1Y2ggZnVlcgorICAgICAgZGllIEd1ZXRlIHZvbiBadXNhdHphbmdyaWZmZW4gdm9uIEdpbGRlbiBnZW51dHp0LgorCisgICBQX0VGRkVDVElWRV9BQworICAgICAgRnVlciBQYXJhZGV3YWZmZW4gc2V0emVuLiBXZXJ0ZSB1bmJlZGluZ3QgbWl0IEJvaW5nIGFic3ByZWNoZW4hCisKKyAgIFBfTk9CVVkKKyAgICAgIFdhZmZlbiBhYiBXQyAxNTAgd2VyZGVuIGJlaW0gVmVya2F1ZiBpbSBMYWRlbiB6dXJ1ZWNrYmVoYWx0ZW4uIEVzCisgICAgICBzb2xsdGUgYWJlciBhdWNoIGZ1ZXIgV2FmZmVuLCBkaWUgSGl0RnVuY3MgZW50aGFsdGVuLCBQX05PQlVZCisgICAgICBnZXNldHp0IHdlcmRlbi4KKworU3BlemlhbHdhZmZlbi9XYWZmZW4gbWl0IFNvbmRlcmZ1bmt0aW9uCisKKyAgICoqIEFMTEUgV2FmZmVuIG1pdCBIaXRGdW5jIG9kZXIgZW50c3ByZWNoZW5kZXIgRmt0LiBtdWVzc2VuICAgKioKKyAgICoqIGdlbmVobWlndCB3ZXJkZW4hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioKKworICAgU29sY2hlIFdhZmZlbiBtdWVzc2VuIHVlYmVyIGVpbiBQX0lORk8gdmVyZnVlZ2VuIHVuZCBpcmdlbmR3byBpbiBpaHJlcgorICAgQmVzY2hyZWlidW5nIG9kZXIgaW0gUF9JTkZPIG1pbmRlc3RlbnMgZWluZSBBbmRldXR1bmcgdWViZXIgZGllCisgICBIZXJrdW5mdCBvZGVyIGRlbiBHcnVuZCBpaHJlciBiZXNvbmRlcmVuIEZhZWhpZ2tlaXQgaGFiZW4uCisKKyAgIEF1Y2ggU3BlemlhbHdhZmZlbiBzb2xsdGVuIG5hY2ggTW9lZ2xpY2hrZWl0IG5pY2h0IHVlYmVyIGVpbmUKKyAgIEVGRkVDVElWRV9XQyB2b24gMjAwIGhpbmF1c2dlaGVuLiBEZXIgUmV0dXJuLVdlcnQgZGVyIEhpdEZ1bmMsIHNvZmVybgorICAgZXIgdm9uIDAgYWJ3ZWljaHQsIE1VU1MgcGVyIHJhbmRvbSgpIHp1cnVlY2tnZWdlYmVuIHdlcmRlbiwgZGEgZXIgb2huZQorICAgd2VpdGVyZXMgcmFuZG9tKCkgYXVmIGRpZSBXQyBhdWZhZGRpZXJ0IHdpcmQuCisKKyAgIFp1IGJlYWNodGVuIGlzdCwgZGFzcyBtYW4gYmVpIFdhZmZlbiwgZGllIG51ciBmdWVyIE5QQ3MgbWVociBTY2hhZGVuIAorICAgbWFjaGVuIHNvbGxlbiwgbmljaHQgKG51cikgdWViZXIgUF9SQUNFIHBydWVmdCwgb2IgZGVyIEJlbnV0emVyIGVpbiAKKyAgIHNvbGNoZXIgaXN0LiBFcyBpc3QgZGVua2JhciwgZGFzcyBTcGllbGVyIGlocmUgUmFzc2UgdGVtcG9yYWVyIHZlci0KKyAgIGFlbmRlcm4ga29lbm5lbi4gV2FmZmVuIGRpZSBudXIgZGFubiBiZXNzZXIgenVzY2hsYWdlbiwgd2VubiBlcworICAga2VpbmVtIFNwaWVsZXIgenVndXRlbiBrb21tZW4ga2FubiAoIWludGVyYWN0aXZlLCBuaWNodCB6dWVja2JhciAKKyAgIGR1cmNoIEhpbGZzLU5QQyBldGMuKSwgbXVlc3NlbiBuaWNodCBnZW5laG5pZ3Qgd2VyZGVuLgorCisgICBXYWZmZW4sIGRpZSBNb25zdGVyIHZlcmdpZnRlbiAoYWxzbyBuaWNodCBudXIgUF9EQU1fVFlQRSBEVF9QT0lTT04KKyAgIGhhYmVuKSBzaW5kIHp3YXIgbmljaHQgZ3J1bmRzYWV0emxpY2ggdmVyYm90ZW4sIGFiZXIgZG9jaCB1bmVyd3VlbnNjaHQuCisgICBTaWUgc2luZCBhdWYgamVkZW4gRmFsbCBnZW5laG1pZ3VuZ3NwZmxpY2h0aWcuIEF1c3NlcmRlbSBzb2xsdGUgZGllCisgICBXYWhyc2NoZWlubGljaGtlaXQgZWluZXIgVmVyZ2lmdHVuZyBwcm8gS2FtcGZydW5kZSBtYXguIGJlaSAxJSBsaWVnZW4uCisKK1BhcmllcndhZmZlbgorICAgICAgIAorICAgUGFyaWVyd2FmZmVuIHNpbmQgV2FmZmVuLCBkaWUgZGllIFZlcnRlaWRpZ3VuZyB1bnRlcnN0dWV0emVuLiAgCisgICBFaW5lIFdhZmZlIHdpcmQgYWxzIFBhcmllcndhZmZlIHZlcndlbmRldCwgd2VubiBkaWUgUHJvcGVydHkKKyAgIFBfUEFSUlkgZ2VzZXR6dCBpc3QuIEZvbGdlbmRlIFdlcnRlIHNpbmQgbW9lZ2xpY2g6CisgICAgICAgCisgICBQQVJSWV9OT1QgICAgIERpZSBpc3QgS0VJTkUgUGFyaWVyd2FmZmUgKD1kZWZhdWx0KS4KKyAgICAgICAKKyAgIFBBUlJZX09OTFkgICAgRGllcyBpc3QgZWluZSByZWluZSBQYXJpZXJ3YWZmZS4KKworICAgUEFSUllfVE9PICAgICBEaWVzZSBXYWZmZSB3aXJkIHNvd29obCBhbHMgUGFyaWVyd2FmZmUgYWxzIGF1Y2gKKyAgICAgICAgICAgICAgICAgYWxzIEFuZ3JpZmZzd2FmZmUgYmVudXR6dAorICAgICAgIAorICAgRGllIFNjaHV0endpcmt1bmcgZGVyIFBhcmllcndhZmZlIHdpcmQgd2llIGJlaSBSdWVzdHVuZ2VuIHVlYmVyIGRpZQorICAgUHJvcGVydHkgUF9BQyBnZXNldHp0LiBVZWJlciBkaWUgUHJvcGVydHkgUF9ERUZFTkRfRlVOQyBrYW5uIHdpZQorICAgYmVpIFJ1ZXN0dW5nZW4gZWluZSBEZWZlbmRGdW5jIGdlc2V0enQgd2VyZGVuLgorICAgICAgIAorICAgV2FmZmVuIG1pdCBQQVJSWV9PTkxZIHVudGVybGllZ2VuIGRlbiBnbGVpY2hlbiBQX0FDLUdyZW56d2VydGVuCisgICB3aWUgUnVlc3R1bmdlbiB2b20gVHlwIEFUX1NISUVMRC4gV2FmZmVuIG1pdCBQQVJSWV9UT08gb2RlciBlaW5lcgorICAgRGVmZW5kRnVuYyBtdWVzc2VuIGdlbmVyZWxsIGdlbmVobWlndCB3ZXJkZW4uCisKKy0tLS0tLS0tLS0gTEVUWlRFIEFFTkRFUlVORzogSHVtbmksIDIwMTEtMTAtMTIKZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvQWRkQ21kL0VpbmZ1ZWhydW5nLkFkZENtZC50eHQgYi9kb2MvYmVpc3BpZWxlL0FkZENtZC9FaW5mdWVocnVuZy5BZGRDbWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZGY2ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL0FkZENtZC9FaW5mdWVocnVuZy5BZGRDbWQudHh0CkBAIC0wLDAgKzEsMTc0IEBACitIYWxsbyBNaXRtYWdpZXJJbm5lbiAqZyosCisKK09rLCBkYW5uIGdlaHRzIG1hbCBlaW4gYmlzY2hlbiB6dXIgU2FjaGU6CisKKy9zdGQvdGhpbmcvY29tbWFuZHMuYyB3dXJkZSBzbyBlcndlaXRlcnQsIGRhc3MgbWFuIGF1Y2gga29tcGxleGUgU3ludGF4CitkaXJla3QgaW0gQWRkQ21kIHZvcnBhcnNlbiBrYW5uLgorCitEYXp1IGVpbiBrdXJ6ZXMgQmVpc3BpZWw6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0luIGVpbmVtIE9iamVrdCAoZWluIEJ1c2NoKSBmaW5kZXQgc2ljaCBmb2xnZW5kZSBTeW50YXhkZWZpbml0aW9uLgorCisgQWRkQ21kKCJwZmx1ZWNrZXxlcm50ZSZmcnVlY2h0ZXxiZWVyZW4mQElEIiwiY21kX3BmbHVlY2tlbiIsCisgICAgICAgICJXYXMgd2lsbHN0IER1IGRlbm4gQHZlcmJlbj98V28gd2lsbHN0IER1IGRlbm4gZGllIEJlZXJlbiBAdmVyYmVuPyIpOworCitEZXIgZXJzdGUgUGFyYW1ldGVyIGRlZmluaWVydCBkaWUgU3ludGF4LiBEYXMgWmVpY2hlbiAmIHRyZW5udCB2ZXJzY2hpZWRlbmUKK3p1IHBhcnNlbmRlIEl0ZW1zOgorCisxLiBwZmx1ZWNrZXxlcm50ZQorMi4gZnJ1ZWNodGV8YmVlcmVuCiszLiBASUQKKworVW50ZXIgMS4gZmluZGVuIHNpY2ggZGllIFZlcmJlbiAtIGRhcyBzaW5kIGRpZSBnbGVpY2hlbiwgZGllIG1hbiBpbiBkZXIKK2FsdGVuIFZlcnNpb24gYXVjaCBiZWxlZ2VuIGtvbm50ZS4gRGllIFJlZ2VsIHJlYWdpZXJ0IGFsc28gYXVmICJwZmx1ZWNrZSIKK29kZXIgYXVmICJlcm50ZSIuCisKK0FsbGUgd2VpdGVyZW4gUmVnZWxuIG11ZXNzZW4gZXJmdWVsbHQgd2VyZGVuLCBkYW1pdCBkZXIgendlaXRlIFBhcmFtZXRlcgorKGRpZSBGdW5rdGlvbikgYXVmZ2VydWZlbiB3aXJkLiBASUQgc3RlaHQgZGFiZWkgZnVlciBkaWUgSUQgZGVzIE9iamVrdGVzLAoraW4gZGVtIGRhcyBBZGRDbWQgc3RlaHQuIEhpZXIgYWxzbyBkZXIgQnVzY2guCisKK0RhenUgZWluaWdlIEJlaXNwaWVsZToKKworYSkgPiBwZmx1ZWNrZSBiZWVyZW4KKyAtPiBlcmZ1ZWxsdCAxIHVuZCAyLiBBYmVyIG5pY2h0IDMuID0+IEZlaGxlcm1lbGR1bmcuCisKK2IpID4gZXJudGUgdm9uIGJ1c2NoCisgLT4gZXJmdWVsbHQgMSB1bmQgMywgamVkb2NoIDIgbmljaHQuID0+IEZlaGxlcm1lbGR1bmcuCisKK2MpID4gcGZsdWVja2UgZnJ1ZWNodGUgdm9uIGJ1c2NoCisgLT4gZXJmdWVsbHQgMSwgMiB1bmQgMyAtPiBidXNjaC0+Y21kX3BmbHVlY2tlbigpIHdpcmQgYXVmZ2VydWZlbi4gRGFzICJ2b24iCisgICAgaXN0IEZ1ZWxsd2Vyay4gRGF2b24ga2FubiBiZWxpZWJpZyB2aWVsIGltIFN0cmluZyBzZWluLiBTaWUgd2VyZGVuIAorICAgIGlnbm9yaWVydC4KKyAgICBFcyBzaW5kIGFsc28gYXVjaCB1bnNpbm5pZ2UgU3ludGF4ZSByaWNodGlnLCBzb2xhbmdlIGRlciBTdHJpbmcgZGllIAorICAgIEl0ZW1zIGVydWZlbGx0LgorCitJbSBGYWxsIGMpIHdpcmQgZGFzIFZlcmhhbHRlbiBkZXMgQnVzY2hlcyBkdXJjaCBkaWUgRnVua3Rpb24gImNtZF9wZmx1ZWNrZW4iCitkZWZpbmllcnQsIHdpZSBhdWNoIGluIGRlciBhbHRlbiBWZXJzaW9uIHZvbiBBZGRDbWQuCisKK1dhcyBwYXNzaWVydCBhYmVyIGluIGRlbiBGYWVsbGVuIGEpIHVuZCBiKT8gRGFmdWVyIGlzdCBkZXIgZHJpdHRlCitQYXJhbWV0ZXIgZGE6CisgICJXYXMgd2lsbHN0IER1IGRlbm4gQFZFUkJlbj98V28gd2lsbHN0IER1IGRlbm4gZGllIEJlZXJlbiBAVkVSQmVuPyIpOworCitIaWVyIHNpbmQgendlaSBGZWhsZXJtZWxkdW5nZW4sIGR1cmNoIHwgZ2V0cmVubnQsIGRlZmluaWVydDoKKworeCkgV2FzIHdpbGxzdCBEdSBkZW5uIEBWRVJCZW4/Cit5KSBXbyB3aWxsc3QgRHUgZGVubiBkaWUgQmVlcmVuIEBWRVJCZW4/CisKK0Vyc3Qgd2lyZCBnZXBydWVmdCwgb2IgMi4gZXJmdWVsbHQgaXN0LiBGYWxscyBuaWNodCwgZ2lidCBlcyBGZWhsZXJtZWxkdW5nIHgpCitEYW5uIHdpcmQgYXVmIDMuIGdlcHJ1ZWZ0LiBJc3QgZGFzIG5pY2h0IGVyZnVlbGx0IChhYmVyIDIuIHNjaG9uKSBnaWJ0IGVzCitGZWhsZXJtZWxkdW5nIHkpLgorCitJbSBGYWxsIGEgc2luZCAxIHVuZCAyIGVyZnVlbGx0LiBEZW1uYWNoIHdpcmQgeSkgYXVzZ2VnZWJlbi4gQFZFUkIgd2lyZAorZGFiZWkgZHVyY2ggZGFzIGJlbnV0enRlIFZlcmIgZXJzZXR6dCAoZGFzIGFic2NobGllc3NlbmRlIGVuLCBiencgZSB3aXJkCithYmdlc2Nobml0dGVuKToKKyBXbyB3aWxsc3QgRHUgZGVubiBkaWUgQmVlcmVuIHBmbHVlY2tlbj8KKworSW0gRmFsbCBiIGlzdCAxIGVydWZlbGx0LCAyIGFiZXIgc2Nob24gbmljaHQuIERhaGVyIGdpYnQgZXMgRmVobGVybWVsZHVuZworeCkuIEF1ZiAzLiB3aXJkIG5pY2h0IG1laHIgZ2VwcnVlZnQuCisgV2FzIHdpbGxzdCBEdSBkZW5uIGVybnRlbj8KKworV2llIHNjaG9uIGVyd2FlaG50IGVyZnVlbGx0IGMpIGFsbGUgQmVkaW5ndW5nZW4gdW5kIGVzIGdpYnQga2VpbmUgQXVzZ2FiZSAtCitTdGF0dCBkZXNzZW4ga2FubiBtYW4gZGFzIFBmbHVlY2tlbiBpbiBkZXIgRnVua3Rpb24gYWJoYW5kZWxuLgorCitJbiBkZW4gRmFlbGxlbiAxIHVuZCAyIHdpcmQgZGllIEZlaGxlcm1lbGR1bmcgdWViZXIgbm90aWZ5X2ZhaWwoKQorYWJnZWhhbmRlbHQuIEVyZ28gd2lyZCBoaWVyIGFuZGVyZW4gQmVmZWhsZW4gdm9uIGFuZGVyZW4gT2JqZWt0ZW4gbm9jaAorZWluZSBDaGFuY2UgZ2VnZWJlbi4gR2xlaWNoZXMgZ2lsdCBmdWVyIGRpZSBGdW5rdGlvbiBjbWRfcGZsdWVja2VuKCksIHdlbm4KK2RlcmVuIFJ1ZWNrZ2FiZXdlcnQgMCBpc3QuIEF1Y2ggaGllciBnaWJ0IGVzIGRpZSBBbmFsb2dpZSB6dW0gYWx0ZW4gQWRkQ21kLgorCitHaWJ0IGNtZF9wZmx1ZWNrZW4oKSBlaW5lbiBXZXJ0IHVuZ2xlaWNoIDAgenVydWVjaywgd2lyZCBkaWUgU3VjaGUgbmFjaAorZGVyIHJpY2h0aWdlbiBTeW50YXggZGFuYWNoIGFiZ2Vicm9jaGVuLCBzbyBkYXNzIGF1Y2gga2VpbiBhbmRlcmVzIE9iamVrdAorbWVociBnZWZyYWd0IHdpcmQgKHdpZSBnZWhhYnQpLgorCitEYXMgaXN0IGF1Y2ggZnVlciBGb3JzY2hlcnB1bmt0ZSB3aWNodGlnLiBGUCB3ZXJkZW4gZ2VuZXJlbGwgbnVyIGJlaSBlaW5lbQorUnVlY2tnYWJld2VydCB1bmdsZWljaCAwIHZlcmdlYmVuLgorCitFaW5lIGtsZWluZSBFcndlaXRlcnVuZyBkZXIgQmVpc3BpZWxzeW50YXg6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyBBZGRDbWQoInBmbHVlY2tlfGVybnRlJmZydWVjaHRlfGJlZXJlbiZASURAXGltcG9zc2libGUiLDAsCisgICJXYXMgd2lsbHN0IER1IGRlbm4gQFZFUkJlbj98V28gd2lsbHN0IER1IGRlbm4gZGllIEJlZXJlbiBAVkVSQmVuP3wiCisgICJEdSBwZmx1ZWNrc3QgZWluIHBhYXIgQmVlcmVuIHVuZCBpc3N0IHNpZSBhdWYuXkBXRVIgaXNzdCBlaW4gcGFhcgorICBCZWVyZW4uIik7CisKK0VpbmUgbmV1ZSBSZWdlbDoKKworNC4gXGltcG9zc2libGUKKworVW5kIGVpbmUgbmV1ZSBGZWhsZXJtZWxkdW5nOgoreikgRHUgcGZsdWVja3N0IGVpbiBwYWFyIEJlZXJlbiB1bmQgaXNzdCBzaWUgYXVmLl5AV0VSIGlzc3QgZWluIHBhYXIgQmVlcmVuLgorCitadXIgUmVnZWw6CisKK0RpZSBSZWdlbCBpc3QgbmljaHQgZXJmdWVsbGJhciwgZGEgU3BpZWxlciBkYXMgXGkgbmljaHQgZXJ6ZXVnZW4KK2tvZW5uZW4uIFp3YW5nc2xhZXVmaWcgZ2lidCBlcyBhdWNoIGtlaW5lIEZ1bmt0aW9uLCBkaWUgYXVmZ2VydWZlbiB3ZXJkZW4KK2tvZW5udGUuCisKK0RhZnVlciBnaWJ0IGVzIGVpbmUgRmVobGVybWVsZHVuZywgZGllIGVpbiBuZXVlcyBFbGVtZW50IGVudGhhZWx0LiBEYXMKK14uIFdpcmQgZGllc2UgTWVsZHVuZyBhdXNnZWdlYmVuIGlzdCBkYXMgZ2VuYXUgd2llIGVpbiByZXR1cm4gMSBpbiBkZXIKK0Z1bmt0aW9uLiBEaWUgU3ludGF4IHdpcmQgYWxzIHJpY2h0aWcgYW5lcmthbm50LiAoRXMga2FubiBoaWVyZnVlciBhbHNvCithdWNoIEZQIGdlYmVuKS4KKworRGVyIFRleHQgdm9yIGRlbSBeIGdlaHQgYW4gZGVuIFNwaWVsZXIsIGFsbGVzIGRhaGludGVyIGdlaHQgYW4gZGllIFNwaWVsZXIKK2ltIFJhdW0uIFN0ZWh0IGhpbnRlciBkZW0gXiBuaWNodHMsIGdpYnQgZXMga2VpbmUgUmF1bW1lbGR1bmcuCisKK0F1ZiBkaWVzZSBXZWlzZSBrYW5uIG1hbiBsZWljaHQgZWluIFJhdW1rb21tYW5kbyBlcnN0ZWxsZW4sIGRhc3MgbnVyCitUZXh0YXVzZ2FiZW4gbWFjaHQsIGFiZXIga2VpbmUgRnVua3Rpb25hbGl0YWV0IGVudGhhZWx0LiBFcyBpc3Qga2VpbmUKK2VpZ2Vuc3RhZW5kaWdlIEZ1bmt0aW9uIG1pdCBpcmdlbmR3ZWxjaGVtIGVpZ2VuZW4gUGFyc2luZyBtZWhyIG5vZXRpZy4KKworRGFzIEBXRVIgd2lyZCBkdXJjaCB0aGlzX3BsYXllcigpLT5OYW1lKCkgZXJzZXR6dCwgc28gZGFzcyBtYW4gYXVjaCBlaW5lbgorUGVyc29lbmxpY2hlbiBiZXp1ZyBpbiBkZW4gTWVsZHVuZ2VuIGhlcnN0ZWxsZW4ga2Fubi4KKworQWJ3YWVydHNrb21wYXRpYmVsCistLS0tLS0tLS0tLS0tLS0tLS0KKworRGllIEVyd2VpdGVydW5nZW4gdm9uIEFkZENtZCBlcmxhdWJlbiBlaW4gZWluZmFjaGVyZXMgRXJzdGVsbGVuIHZvbgorU3RhbmRhcmQtS29tbWFuZG9zLCBvaG5lIGRhc3MgbWFuIHNpY2ggbWl0IGRlbSBQYXJzZW4gaW4gRnVua3Rpb25lbgorYmVzY2hhZWZ0aWdlbiBtdXNzLgorCitEaWUgQWVuZGVydW5nIGlzdCB2b2xsc3RhZW5kaWcgYWJ3YWVydHNrb21wYXRpYmVsLiBXZXIgc2ljaCBhbHNvIHNhZ3QsCitkYXMgZGFzIGFsbGVzIHZpZWwgenUga29tcGxpemllcnQgc2VpLCBrYW5uIHdlaXRlcmhpbjoKKworIEFkZENtZCgoeyJwZmx1ZWNrZSIsImVybnRlIn0pLCJjbWRfcGZsdWVja2VuIik7CisKK2JlbnV0emVuLiBEYXMgVmVyaGFsdGVuIGlzdCBoYWFyZ2VuYXUgZGFzIHNlbGJlIHdpZSBiaXNoZXIuIERlbWVudHNwcmVjaGVuZAoraXN0IGF1Y2gga2F1bSBBdWZ3YW5kIGJlaW0gRWlucGZsZWdlbiBkaWVzZXIgQWVuZGVydW5nIG5vdHdlbmRpZy4KKworWnVyIEJlYWNodHVuZworLS0tLS0tLS0tLS0tLQorCitVZWJlcmFsbCwgd28gZGlyZWt0IGF1ZiBQX0NPTU1BTkRTIHp1Z2VncmlmZmVuIHdpcmQsIGthbm4gZXMgcHJpbnppcGllbGwKK3p1IFByb2JsZW1lbiBrb21tZW4sIGRhIHNpY2ggZGllIFN0cnVrdHVyIGRlcyBNYXBwaW5ncyB1bmQgZGVyIFp1Z3JpZmYKK2RhcmF1ZiBnZWFlbmRlcnQgaGF0LgorCitJbSBGb2xnZWFydGlrZWwgZmluZGV0IHNpY2ggZWluZSBMaXN0ZSBtaXQgYWxsZW4gT2JqZWt0ZW4sIGRpZSBkYXMgbWFjaGVuLiBJbgorZGVuIG9lZmZlbnRsaWNoZW4gVmVyemVpY2huaXNzZW4gd2VyZGUgaWNoIG1pY2ggbWl0IGRlbiBNYWdpZXJuIGluIFZlcmJpbmR1bmcKK3NldHplbiBvZGVyIHNlbGJzdCBrb250cm9sbGllcmVuLCBvYiBBZW5kZXJ1bmdlbiBub3R3ZW5kaWcgc2luZC4KKworT2JqZWt0ZSBpbiBkZW4gUGxheWVycy1WZXJ6ZWljaG5pc3NlbiB3ZXJkZSBpY2ggbnVyIGluIEF1c25haG1lZmFlbGxlbgorYW5wYXNzZW4uIFp1ciBFcmlubmVydW5nOiBBbmdlc2NobG9zc2VuZXMgZ2Vob2VydCBuaWNodCBuYWNoIC9wbGF5ZXJzLy4KKworRGVyIENvZGUgaXN0IGF1ZiBLb21wYXRpYmlsaXRhZXQgbWl0IGRlbSBhbHRlbiBTeXN0ZW0gYXVzZ2VsZWd0LCBkZW5ub2NoCitnaWJ0IGVzIGVpbiBwYWFyIEFlbmRlcnVuZ2VuLiBadW0gQmVpc3BpZWwgaXN0IFBfQ09NTUFORFMga2VpbmUgZWNodGUKK1Byb3BlcnR5IG1laHIgc29uZGVybiBlaW5lIGxva2FsZSBWYXJpYWJsZS4gRGVtenVmb2xnZSB3aXJkIFBfQ09NTUFORFMKK2JlaSAieHByb3AiIG5pY2h0IG1laHIgYW5nZXplaWd0LiBEaWUgU2Nobml0dHN0ZWxsZSB3aXJkIGR1cmNoIF9zZXRfCit1bmQgX3F1ZXJ5X2Z1bmt0aW9uZW4gcmVhbGlzaWVydC4gRGllIE1hcHBpbmdzIHdlcmRlbiBfaW1tZXJfIGFscyBLb3BpZW4KK3JhdXNnZWdlYmVuLCBzbyBkYXNzIG1hbiBkYW1pdCBuaWNodCB2ZXJzZWhlbnRsaWNoIFVuc2lubiBtYWNoZW4ga2Fubi4KKworU2NobHVzc3dvcnQKKy0tLS0tLS0tLS0tCisKK0RpZXNlciBBcnRpa2VsIHN0ZWxsdCBudXIgZWluZSBFaW5sZWl0dW5nIGluIGRpZSBBZW5kZXJ1bmcgdW5kIGRlcmVuCitNb2VnbGljaGtlaXRlbiBkYXIgdW5kIGlzdCBrZWluZXNmYWxscyB2b2xsc3RhZW5kaWcuIFdlciBtZWhyIGRhcnVlYmVyIHdpc3Nlbgord2lsbCwgaXN0IGVpbmdlbGFkZW4sIHNpY2ggZGllIE1hbnBhZ2UgenUgIkFkZENtZCIgdW5kIHp1IGRlbiBCZWlzcGllbGVuCisiQWRkQ21kX2JzcCIgYW56dXNjaGF1ZW4uCisKK0RpZSBTZWl0ZW4gc2luZCBhdXMgZGVtIFJlZ2VuYm9nZW4gImdlbGllaGVuIiB1bmQgd2VyZGVuIGluIGRlbiBrb21tZW5kZW4KK1RhZ2VuIG5vY2ggYXVmIGRpZSBCZWR1ZXJmbmlzc2UgZGVzIE1vcmdlbmdyYXVlbiBhbmdlcGFzc3QuCisKK01laW4gRGFuayBnZWh0IGFuIEdsb2luc29uLCBkZXIgZGllIElkZWUgaGF0dGUsIGRpZSBBbnBhc3N1bmdlbiB2b3J6dW5laG1lbgordW5kIE1pZ3JhdGlvbiBkZXMgQ29kZXMgaW5zIE1vcmdlbkdyYXVlbiB1ZWJlcm5vbW1lbiBoYXQuCisKK0ZhbGxzIG51biBub2NoIEZyYWdlbiBzaW5kLCBudXIgenUhIDopCisKK1YqLApkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9BZGRDbWQvYnVzY2guYyBiL2RvYy9iZWlzcGllbGUvQWRkQ21kL2J1c2NoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEzYzViMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvQWRkQ21kL2J1c2NoLmMKQEAgLTAsMCArMSw1OCBAQAoraW5oZXJpdCAiL3N0ZC90aGluZyI7CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisKKyNwcmFnbWEgc3RyaWN0X3R5cGVzLHNhdmVfdHlwZXMscnR0X2NoZWNrcworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICAgOjpjcmVhdGUoKTsKKworICAgU2V0UHJvcChQX0dFTkRFUiwgTkVVVEVSKTsKKyAgIFNldFByb3AoUF9OQU1FLCAiR2VidWVzY2giKTsKKyAgIFNldFByb3AoUF9TSE9SVCwiRWluIEdlYnVlc2NoIik7CisgICBTZXRQcm9wKFBfTE9ORywiRHUgc3RlaHN0IHZvciBlaW5lbSBnYWFueiBub3JtYWxlbiBHZWJ1ZXNjaC4gRXMgdHJhZWd0ICIKKyAgICAgICAgICAgICAgICAgICJGcnVlY2h0ZS4gVW5kIGV2ZW50dWVsbFxua2FubiBtYW4gZGFyaW4gZXR3YXMgZmluZGVuLlxuIik7CisgICBTZXRQcm9wKFBfTk9HRVQsIkVzIGlzdCBmZXN0Z2V3YWNoc2VuLCBldmVudHVlbGwga2FubiBtYW4gZXMgYXVzZ3JhYmVuP1xuIik7CisKKyAgIFNldFByb3AoUF9XRUlHSFQsNTAwMCk7CisgICBTZXRQcm9wKFBfU0laRSwxMDApOworCisgICBBZGRJZCgoeyJidXNjaCIsImdlYnVlc2NoIn0pKTsKKworICAgQWRkRGV0YWlsKCh7ImZydWVjaHRlIiwiZnJ1Y2h0In0pLAorICAgICAiRXMgc2NoZWluZW4gQmVlcmVuIHp1IHNlaW4uIFZpZWxsZWljaHQga2FubnN0IER1IHNpZSBwZmx1ZWNrZW4/XG4iKTsKKyAgIEFkZERldGFpbCgiYmVlcmVuIiwKKyAgICAgIlBmbHVlY2sgc2llIGRvY2gsIHZpZWxsZWljaHQgYnJpbmd0IGRhcyBqYSB3YXMuXG4iKTsKKworICAgLy8gTnVyIHdlbm4gZGllIFN5bnRheCBlcmZ1ZWxsdCBpc3QsIHdpcmQgY21kX3BmbHVlY2tlbigpIGF1ZmdlcnVmZW4uCisgICAvLyAicGZsdWVja2UgYmVlcmVuIHZvbiBidXNjaCIgZXRjLgorICAgQWRkQ21kKCJwZmx1ZWNrZXxlcm50ZSZmcnVlY2h0ZXxiZWVyZW4mQElEIiwiY21kX3BmbHVlY2tlbiIsCisgICAgICAgICAgIldhcyB3aWxsc3QgRHUgZGVubiBAdmVyYmVuP3xXbyB3aWxsc3QgRHUgZGVubiBkaWUgQmVlcmVuIEB2ZXJiZW4/Iik7CisKKyAgIC8vIHN1Y2hlbiBnaWJ0IG51ciBlaW5lIE1lbGR1bmcgYXVzLiBEYWZ1ZXIgYnJhdWNodCBtYW4ga3VlbmZ0aWcga2VpbmUKKyAgIC8vIEZ1bmt0aW9uZW4gbWVoci4KKyAgIEFkZENtZCgic3VjaHxzdWNoZXxkdXJjaHN1Y2h8ZHVyY2hzdWNoZSZASUQmXG5pbXBvc3NpYmxlIiwwLCAKKyAgICAgICAgICAiV28gd2lsbHN0IER1IEBWRVJCZW4/fER1IGR1cmNoc3VjaHN0IGRhcyBHZWJ1ZXNjaCwgZmluZGVzdCBhYmVyIG5pY2h0cy5eIgorICAgICAgICAgICJAV0VSMSBkdXJjaHN1Y2h0IGVpbiBHZWJ1ZXNjaCwgZmluZGV0IGFiZXIgbmljaHRzLiIpOworCisgICAvLyBHcmFiZW4gZ2VodCBlaCBuaWNodC4gRGFoZXIgbnVyIEZlaGxlcm1lbGR1bmdlbi4KKyAgIC8vIERhcyBeIHNhZ3QsIGRhc3MgaGllciBlaW4gcmV0dXJuMSB6dXJ1ZWNrZ2VnZWJlbiB3aXJkLiBFcyBnaWJ0IGFiZXIga2VpbmUgCisgICAvLyBSYXVtbWVsZHVuZy4KKyAgIEFkZENtZCgiZ3JhYnxncmFiZSZASUQmYXVzQFxuaW1wb3NzaWJsZSIsMCwKKyAgICAgICAgICAiV2FzIHdpbGxzdCBEdSBncmFiZW4/fER1IHdpbGxzdCBkYXMgR2VidWVzY2ggYXVzZ3JhYmVuP3wiCisgICAgICAgICAgIkRpZSBXdXJ6ZWxuIHNjaGVpbmVuIHRpZWYgenUgcmVjaGVuLiBEYXMgd2lyZCBuaWNodHMuXiIpOworfQorCitpbnQgY21kX3BmbHVlY2tlbihzdHJpbmcgYXJnLCBtaXhlZCAqcGFyYW0pCit7CisgICAgb2JqZWN0IG9iajsKKyAgICBvYmo9Y2xvbmVfb2JqZWN0KF9fRElSX18ib2JzdCIpOworICAgIHdyaXRlKCJWZXJ3dW5kZXJ0IHBmbHVlY2tzdCBEdSAiKyhvYmotPm5hbWUoKSkrIiB2b20gQnVzY2guIEtvbWlzY2guXG4iKTsKKworICAgIC8vIERhcyBoaWVyIGlzdCBlaW4gQmVpc3BpZWwgZnVlciBBZGRDbWQsIGRhaGVyIG1hY2ggaWNoIG1pciBuaWNoIAorICAgIC8vIGRpZSBNdWVoZSBkYXMgcmljaHRpZyB6dSBtYWNoZW4uIElzIGVoIG51ciBmdWVyIE1hZ2llciEKKyAgICBvYmotPm1vdmUodGhpc19wbGF5ZXIoKSxNX0dFVHxNX05PQ0hFQ0spOworICAgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9BZGRDbWQvb2JzdC5jIGIvZG9jL2JlaXNwaWVsZS9BZGRDbWQvb2JzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZmI0NzEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL0FkZENtZC9vYnN0LmMKQEAgLTAsMCArMSwyMzIgQEAKKy8qIEhpbndlaXMgenUgZGllc2VtIEJlaXNwaWVsb2JqZWt0OiBMZWJlbnNtaXR0ZWwgbGFzc2VuIHNpY2ggYmVzc2VyIHZvbgorICogL3N0ZC9mb29kIGFibGVpdGVuLCBkYXMgYnJpbmd0IHZpZWxlIEZ1bmt0aW9uYWxpdGFldGVuIG1pdCwgZGllIG1hbiBzb25zdAorICogbXVlaHNhbSBzZWxiZXIgYmFzdGVsbiBtdXNzLgorICovCisKK2luaGVyaXQgIi9zdGQvdGhpbmciOworCisjaW5jbHVkZSA8bW92aW5nLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorCisjZGVmaW5lIFNBRVRUSUdVTkcgMgorI2RlZmluZSBIRUlMVU5HIDIwCisjZGVmaW5lIEVBVF9ERUxBWSAxMjAwIC8vIDIwIE1pbnV0ZW4KKworI2RlZmluZSBCUzc4KHgpIGJyZWFrX3N0cmluZyh4LDc4KQorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICA6OmNyZWF0ZSgpOworCisgIC8vIEdlbWVpbnNhbWVyIFRlaWwgZGVzIGNyZWF0ZQorICBBZGRJZCgib2JzdCIpOworICBTZXRQcm9wKCBQX1ZBTFVFLCA2MCtyYW5kb20oMTApICk7CisKKyAgLy8gQWRkQ21kKCAoeyJpc3MiLCJlc3NlIn0pLCAiYWN0X2Vzc2VuIik7ICAKKyAgLy8gbmV3IHN0eWxlIEFkZENtZAorICBBZGRDbWQoICJpc3N8ZXNzZSZASUQiLCJhY3RfZXNzZW4iLCJXYXMgd2lsbHN0IER1IGRlbm4gZXNzZW4/Iik7CisKKyAgLy8gTmFjaCBjYS4gMTAgTWludXRlbiByZXNldGV0IGRhcyBPYnN0LCBpbSBSZXNldCB3aXJkIGVzIGRlc3RydWN0ZXQsIAorICAvLyBzbyBzcGFyZSBpY2ggY2FsbF9vdXRzCisgIHNldF9uZXh0X3Jlc2V0KDYwMCk7CisKKyAgLy8gTmFtZSwgSUQsIEdlbmRlciwgRGVzYyB1bmQgR2V3aWNodCBzaW5kIEFiaGFlbmdpZyB2b24gZGVyIE9ic3RhcnQKKyAgc3dpdGNoIChyYW5kb20oMTEpKXsKKyAgZGVmYXVsdDoKKyAgICBTZXRQcm9wKCBQX0dFTkRFUiwgTUFMRSApOworICAgIFNldFByb3AoIFBfTkFNRSwgIkFwZmVsIiApOworICAgIEFkZElkKCAiYXBmZWwiICk7CisgICAgU2V0UHJvcCggUF9TSE9SVCwgIkVpbiBBcGZlbCIgKTsKKyAgICBTZXRQcm9wKCBQX0xPTkcsIEJTNzgoCisgICAgICAiRWluIHNhZnRpZ2VyIEFwZmVsLiBEaXIgbGFldWZ0IGRhcyBXYXNzZXIgaW0gTXVuZGUgenVzYW1tZW4uIgorICAgICkpOworICAgIFNldFByb3AoIFBfV0VJR0hULCA4MCApOworICAgIGJyZWFrOworICBjYXNlIDE6CisgICAgU2V0UHJvcCggUF9HRU5ERVIsIEZFTUFMRSApOworICAgIFNldFByb3AoIFBfTkFNRSwgIkJpcm5lIiApOworICAgIEFkZElkKCAiYmlybmUiICk7CisgICAgU2V0UHJvcCggUF9TSE9SVCwgIkVpbmUgQmlybmUiICk7CisgICAgU2V0UHJvcCggUF9MT05HLCBCUzc4KAorICAgICAgIkVpbmUga29lc3RsaWNoZSwgcmVpZmUgQmlybmUuIERpZSBpc3Qgc2ljaGVyIGxlY2tlci4iCisgICAgKSk7CisgICAgU2V0UHJvcCggUF9XRUlHSFQsIDkwICk7CisgICAgYnJlYWs7CisgIGNhc2UgMjoKKyAgICBTZXRQcm9wKCBQX0dFTkRFUiwgRkVNQUxFICk7CisgICAgU2V0UHJvcCggUF9OQU1FLCAiQmFuYW5lIiApOworICAgIEFkZElkKCAiYmFuYW5lIiApOworICAgIFNldFByb3AoIFBfU0hPUlQsICJFaW5lIEJhbmFuZSIgKTsKKyAgICBTZXRQcm9wKCBQX0xPTkcsIEJTNzgoCisgICAgICAiRGllIEJhbmFuZSBzaWVodCB3aXJrbGljaCBsZWNrZXIgYXVzLCBhbSBiZXN0ZW4gZ2xlaWNoIGVzc2VuLiIKKyAgICApKTsKKyAgICBTZXRQcm9wKCBQX1dFSUdIVCwgMTEwICk7CisgICAgYnJlYWs7ICAKKyAgY2FzZSAzOgorICAgIFNldFByb3AoIFBfR0VOREVSLCBGRU1BTEUgKTsKKyAgICBTZXRQcm9wKCBQX05BTUUsICJLaXdpIiApOworICAgIEFkZElkKCAia2l3aSIgKTsKKyAgICBTZXRQcm9wKCBQX1NIT1JULCAiRWluZSBLaXdpIiApOworICAgIFNldFByb3AoIFBfTE9ORywgQlM3OCgKKyAgICAgICJLbGVpbiB1bmQgZ3J1ZW4sIGFiZXIgbWl0IGxlY2tlcmVuIElubmVubGViZW4uIFlhbSB5YW0uIgorICAgICkpOworICAgIFNldFByb3AoIFBfV0VJR0hULCA1MCApOworICAgIGJyZWFrOyAgCisgIGNhc2UgNDoKKyAgICBTZXRQcm9wKCBQX0dFTkRFUiwgRkVNQUxFICk7CisgICAgU2V0UHJvcCggUF9OQU1FLCAiRXJkYmVlcmUiICk7CisgICAgQWRkSWQoICJlcmRiZWVyZSIgKTsKKyAgICBTZXRQcm9wKCBQX1NIT1JULCAiRWluZSBFcmRiZWVyZSIgKTsKKyAgICBTZXRQcm9wKCBQX0xPTkcsIEJTNzgoCisgICAgICAiRWluZSB1ZWJlcmR1cmNoc2Nobml0dGxpY2ggZ3Jvc3NlIEVyZGJlZXJlLiBTaWUgIgorICAgICAgImlzdCBzaWNoZXIgc3Vlc3MgdW5kIHNhZnRpZy4iCisgICAgKSk7CisgICAgU2V0UHJvcCggUF9XRUlHSFQsIDIwICk7CisgICAgYnJlYWs7ICAKKyAgY2FzZSA1OgorICAgIFNldFByb3AoIFBfR0VOREVSLCBGRU1BTEUgKTsKKyAgICBTZXRQcm9wKCBQX05BTUUsICJLaXJzY2hlIiApOworICAgIEFkZElkKCAia2lyc2NoZSIgKTsKKyAgICBTZXRQcm9wKCBQX1NIT1JULCAiRWluZSBLaXJzY2hlIiApOworICAgIFNldFByb3AoIFBfTE9ORywgQlM3OCgKKyAgICAgICJad2FyIG51ciBrbGVpbiBpc3QgZGllc2UgS2lyc2NoZSwgYWJlciBzbyBkdW5rZWwgd2llIHNpZSAiCisgICAgICAiYXVzc2llaHQsIGlzdCBzaWUgc2ljaGVyIHRvdGFsIHN1ZXNzIHVuZCBsZWNrZXIuIgorICAgICkpOworICAgIFNldFByb3AoIFBfV0VJR0hULCAxNSApOworICAgIGJyZWFrOyAgCisgIGNhc2UgNjoKKyAgICBTZXRQcm9wKCBQX0dFTkRFUiwgRkVNQUxFICk7CisgICAgU2V0UHJvcCggUF9OQU1FLCAiT3JhbmdlIiApOworICAgIEFkZElkKCAib3JhbmdlIiApOworICAgIFNldFByb3AoIFBfU0hPUlQsICJFaW5lIE9yYW5nZSIgKTsKKyAgICBTZXRQcm9wKCBQX0xPTkcsIEJTNzgoCisgICAgICAiRWluZSBncm9zc2UsIGdlbGJlIE9yYW5nZS4gRWluZSB2b24gZGllc2VuIHN1ZXNzZW4sIGRpZSBzaWNoIHNvICIKKyAgICAgICJsZWljaHQgc2NoYWVsZW4gbGFzc2VuIHVuZCBrZWluZSBaaWNrZW4gbWFjaGVuLCBzbyB3aWUgU2FmdG9yYW5nZW4uIgorICAgICkpOworICAgIFNldFByb3AoIFBfV0VJR0hULCA5MCApOworICAgIGJyZWFrOyAgCisgIGNhc2UgNzoKKyAgICBTZXRQcm9wKCBQX0dFTkRFUiwgRkVNQUxFICk7CisgICAgU2V0UHJvcCggUF9OQU1FLCAiTWFuZGFyaW5lIiApOworICAgIEFkZElkKCAibWFuZGFyaW5lIiApOworICAgIFNldFByb3AoIFBfU0hPUlQsICJFaW5lIE1hbmRhcmluZSIgKTsKKyAgICBTZXRQcm9wKCBQX0xPTkcsIEJTNzgoCisgICAgICAiU3Vlc3MgdW5kIHNhZnRpZyB1bmQgZ2VzdW5kLiBTbyBtdXNzIGRhcyBFc3NlbiBpbSBQYXJhZGllcyAiCisgICAgICAiZ2V3ZXNlbiBzZWluLiIKKyAgICApKTsKKyAgICBTZXRQcm9wKCBQX1dFSUdIVCwgNjAgKTsKKyAgICBicmVhazsgIAorICBjYXNlIDg6CisgICAgU2V0UHJvcCggUF9HRU5ERVIsIEZFTUFMRSApOworICAgIFNldFByb3AoIFBfTkFNRSwgIlppdHJvbmUiICk7CisgICAgQWRkSWQoICJ6aXRyb25lIiApOworICAgIFNldFByb3AoIFBfU0hPUlQsICJFaW5lIFppdHJvbmUiICk7CisgICAgU2V0UHJvcCggUF9MT05HLCBCUzc4KAorICAgICAgIlNhdWVyLCBzYXVlciB1bmQgbm9jaG1hbHMgc2F1ZXIuIEFiZXIgdWx0cmFsZWNrZXIuIE5hLCBzYWJiZXJzdCBEdSAiCisgICAgICAic2Nob24gYXVmIGRpZSBUYXN0YXR1cj8iCisgICAgKSk7CisgICAgU2V0UHJvcCggUF9XRUlHSFQsIDYwICk7CisgICAgYnJlYWs7ICAKKyAgY2FzZSA5OgorICAgIFNldFByb3AoIFBfR0VOREVSLCBNQUxFICk7CisgICAgU2V0UHJvcCggUF9OQU1FLCAiR3JhbmF0YXBmZWwiICk7CisgICAgQWRkSWQoICJncmFuYXRhcGZlbCIgKTsKKyAgICBTZXRQcm9wKCBQX1NIT1JULCAiRWluIEdyYW5hdGFwZmVsIiApOworICAgIFNldFByb3AoIFBfTE9ORywgQlM3OCgKKyAgICAgICJFciBpc3QgendhciBldHdhcyBzY2h3aWVyaWdlciwgZGVuIHp1IGVzc2VuLCBhYmVyIGRlciBBdWZ3YW5kICIKKyAgICAgICJsb2hudCBzaWNoLiIKKyAgICApKTsKKyAgICBTZXRQcm9wKCBQX1dFSUdIVCwgOTAgKTsKKyAgICBicmVhazsgIAorICBjYXNlIDEwOgorICAgIFNldFByb3AoIFBfR0VOREVSLCBGRU1BTEUgKTsKKyAgICBTZXRQcm9wKCBQX05BTUUsICJQZmxhdW1lIiApOworICAgIEFkZElkKCAicGZsYXVtZSIgKTsKKyAgICBTZXRQcm9wKCBQX1NIT1JULCAiRWluZSBQZmxhdW1lIiApOworICAgIFNldFByb3AoIFBfTE9ORywgQlM3OCgKKyAgICAgICJFaW5lIGdyb3NzZSwgYmxhdWUgUGZsYXVtZS4gTGFzcyBzaWUgRGlyIGRvY2ggc2NobWVja2VuLiIKKyAgICApKTsKKyAgICBTZXRQcm9wKCBQX1dFSUdIVCwgMjAgKTsKKyAgICBicmVhazsKKyAgfQorfQorCit2b2lkIHJlc2V0KCkKK3sKKyAgb2JqZWN0IGVudiA9IGVudmlyb25tZW50KHRoaXNfb2JqZWN0KCkpOworCisgIGlmIChlbnYpIHsKKyAgICBpZiAocXVlcnlfb25jZV9pbnRlcmFjdGl2ZShlbnYpKXsKKyAgICAgIC8vIE1laW4gRW52IGlzIGVpbiBVc2VyCisgICAgICB0ZWxsX29iamVjdChlbnYsIEJTNzgoCisgICAgICAgIGNhcGl0YWxpemUodGhpc19vYmplY3QoKS0+bmFtZShXRVIpKSsiIHZlcnNjaHdpbmRldCBtaXQgZWluZW0gIisKKyAgICAgICAgIlwiUExPUFBcIiBhdXMgZGVpbmVtIEludmVudGFyLiBEYSBzY2hlaW50IE1hZ2llIGltIFNwaWVsIHp1IHNlaW4uIgorICAgICAgKSk7CisgICAgfSBlbHNlIGlmIChzaXplb2YoYWxsX2ludmVudG9yeShlbnYpJnVzZXJzKCkpKXsKKyAgICAgIC8vIEluIG1laW5lbSBFbnZpcm9ubWVudCBzaW5kIFVzZXIgKEVzIGlzdCBlaW4gUmF1bSkKKyAgICAgIHRlbGxfcm9vbShlbnYsIEJTNzgoCisgICAgICAgIGNhcGl0YWxpemUodGhpc19vYmplY3QoKS0+bmFtZShXRVIpKSsiIHZlcnNjaHdpbmRldCBtaXQgZWluZW0gIisKKyAgICAgICAgIlwiUExPUFBcIi4gRGEgc2NoZWludCBNYWdpZSBpbSBTcGllbCB6dSBzZWluLiIKKyAgICAgICkpOworICAgIH0KKyAgfQorCisgIC8vIE9iamVrdCB6ZXJzdG9lcmVuCisgIHJlbW92ZSgxKTsKK30KKworc3RhdGljIGludCBhY3RfZXNzZW4oc3RyaW5nIGFyZ3MpCit7CisgICAgLy8gTnVyIGVpbiBEZW1vLU9iamVrdAorICAgIGlmICghSVNfTEVBUk5JTkcodGhpc19wbGF5ZXIoKSkpCisgICAgeworICAgICAgd3JpdGUoIlNjaHd1cHMsIG51biBpc3QgQEBuYW1lQEAgdmVyc2Nod3VuZGVuLiBXYXIgd29obCBlaW5lIElsbHVzaW9uLiIpOworICAgICAgcmVtb3ZlKDEpOworICAgIH0KKworICAgIC8vIERlciBTeW50YXh0ZXN0IGlzdCB1bm5vZXRpZywgZGVyIGlzdCBzY2hvbiBpbSBuZXcgc3R5bGUKKyAgICAvLyBBZGRDbWQoKSBlaW5nZWJhdXQuCisKKyAgICAvLyBXZW5uIGRhcyBPYmpla3QgZWluIEVudmlyb25tZW50IGhhdCAoaG9mZiBpY2ggZG9jaCkKKyAgICAvLyB1bmQgZGFzIEVudmlyb25tZW50IG5pY2h0IHRoaXNfcGxheWVyKCkgaXN0LCAKKyAgICAvLyBoYXQgZGVyIFNwaWVsZXIgZGFzIE9ic3QgbmljaCBpbSBJbnYgLSBkYXMgZ2VodCBkb2NoIG5pY2h0IC4uLgorICAgIGlmIChlbnZpcm9ubWVudCh0aGlzX29iamVjdCgpKSAmJiAoZW52aXJvbm1lbnQodGhpc19vYmplY3QoKSkgIT0gdGhpc19wbGF5ZXIoKSkgKQorICAgIHsKKyAgICAgIHdyaXRlKEJTNzgoCisgICAgICAgICJEdSBzb2xsdGVzdCAiKyB0aGlzX29iamVjdCgpLT5uYW1lKFdFUiwxKSArICIgZXJzdG1hbCBuZWhtZW4uIgorICAgICAgKSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvLyBERUJVRyAoIlNhdHQ/Iik7CisgICAgaWYgKHRoaXNfcGxheWVyKCktPmVhdF9mb29kKFNBRVRUSUdVTkcpKQorICAgIHsKKyAgICAgIC8vIERFQlVHKCJOb2UhIik7CisgICAgICBpZiAodGhpc19wbGF5ZXIoKS0+Y2hlY2tfYW5kX3VwZGF0ZV90aW1lZF9rZXkoRUFUX0RFTEFZLCJ2YW5pb25femFjaF9vYnN0Iik9PS0xKQorICAgICAgeworICAgICAgICB3cml0ZShCUzc4KAorICAgICAgICAgICJEdSBpc3N0IGdlbnVlc3NsaWNoICIrdGhpc19vYmplY3QoKS0+bmFtZShXRU4sMCkrCisgICAgICAgICAgIi4gRHUgZnVlaGxzdCBEaWNoIGdlc3RhZXJrdC4iCisgICAgICAgICkpOworICAgICAgICBzYXkoQlM3OCgKKyAgICAgICAgICB0aGlzX3BsYXllcigpLT5uYW1lKCkrIiBpc3N0IG1pdCB2b2xsZW0gR2VudXNzICIrdGhpc19vYmplY3QoKS0+bmFtZShXRU4sMCkrIi4gIgorICAgICAgICAgICJEaXIgbGFldWZ0IGRhcyBXYXNzZXIgaW0gTXVuZGUgenVzYW1tZW4uIgorICAgICAgICApKTsKKyAgICAgICAgLy8gSGVpbGVuIHVuZCBhdWZlc3NlbiA6KQorICAgICAgICB0aGlzX3BsYXllcigpLT5oZWFsX3NlbGYoSEVJTFVORyk7CisgICAgICB9CisgICAgICBlbHNlIHsgLy8gaWYgKGNoZWNrX2FuZF91cGRhdGVfdGltZWRfa2V5KCkpCisgICAgICAgIC8vIFdlbm4gZXMgbm9jaCB6dSBmcnVlaCBpc3QsIHdpZWRlciB3ZWxjaGVzIHp1IGVzc2VuCisgICAgICAgIC8vIEtlaW5lIEhlaWx1bmcsIGFiZXIgU2FldHRpZ3VuZworICAgICAgICB3cml0ZShCUzc4KAorICAgICAgICAgICJEdSBzb2xsdGVzdCAiK3RoaXNfb2JqZWN0KCktPm5hbWUoV0VOLDEpKyIgbGllYmVyIGplbWFuZGVtIGdlYmVuLCAiCisgICAgICAgICAgImRlbiBEdSBtYWdzdCwgc3RhdHQgYWxsZXMgc2VsYnN0IHp1IGZ1dHRlcm4sIGZpbmRlc3QgRHUgbmljaHQ/ICIKKyAgICAgICAgICAiRGVpbmUgR2llciBoYXQgRGlyIGpldHp0IG51ciBlaW5lbiB2b2xsZW4gQmF1Y2ggdW5kIGVpbiBzY2hsZWNodGVzICIKKyAgICAgICAgICAiR2V3aXNzZW4gYmVzY2hlZXJ0LiIKKyAgICAgICAgKSk7CisgICAgICB9IC8vIGVuZCBpZiAoY2hlY2tfYW5kX3VwZGF0ZV90aW1lZF9rZXkoKSkKKyAgICAgIGlmICghcmVtb3ZlKCkpIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOworICAgIH0gLy8gZW5kIG9mIGVhdF9mb29kCisgICAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL1ByYXhpcy1LdXJzL1JFQURNRSBiL2RvYy9iZWlzcGllbGUvUHJheGlzLUt1cnMvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YThkZDAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL1ByYXhpcy1LdXJzL1JFQURNRQpAQCAtMCwwICsxLDE2IEBACitJbiBkaWVzZW0gVmVyemVpY2huaXMgYmVmaW5kZXQgc2ljaCBlaW4ga2xlaW5lciAiUHJheGlzIExQQy1LdXJzIi4KK0ltIFByaW56aXAgc2luZCBlcyB2ZXJzY2hpZWRlbmUgZ3V0IGRva3VtZW50aWVydGUgTFBDLU9iamVrdGUgZGllCithdWZlaW5hbmRlciBhdWZiYXVlbiB1bmQgaW4gZGVuZW4gYWxsZXMgbm90d2VuZGlnZSBlcmtsYWVydCB3aXJkLgorV2VyIGFsc28gc2Nob24gbWFsIGlyZ2VuZHdvIHByb2dyYW1taWVydCBoYXQgdW5kIHNpY2ggbnVyIGFuIGRpZQorTFBDLVVtZ2VidW5nIGdld29laG5lbiBtdXNzLCBmdWVyIGRlbiBpc3QgZGllc2VyIE1pbmktS3VycyBzaWNoZXIKK2dlbmF1IGRhcyByaWNodGlnZS4gRnVlciBqZW1hbmQgZGVyIG5vY2ggbmllIHByb2dyYW1taWVydCBoYXQgaXN0CitkaWVzZXIgS3VycyBhbGxlaW5lIGFiZXIgc2ljaGVyIG5pY2h0IGdlZWlnbmV0IHVtIHByb2dyYW1taWVyZW4genUKK2xlcm5lbi4gRGllIEZpbGVzIHNvbGx0ZW4gaW4gZGVyIEFscGhhYmV0aXNjaGVyIFJlaWhlbmZvbGdlIHVuZCBkYQorZGllIEZpbGVzIGF1ZmVpbmFuZGVyIGF1ZmJhdWVuLCBhdWNoIHZvbGxzdGFlbmRpZyBkdXJjaGdlZ2FuZ2VuCit3ZXJkZW4uCitCZWkgZGVtIFZlcnplaWNobmlzIHphdWJlcndhbGQgaGFuZGVsdCBlcyBzaWNoIHVtIGVpbiBrbGVpbmVzIHVuZAorZGFkdXJjaCB1ZWJlcnNjaGF1YmFyZXMgR2ViaWV0IHZvbiBtaXIsIGRhcyBuaWNodCBlaW5lIEFuc2FtbWx1bmcKK3ZvbiBBZGREZXRhaWxzIGRhcnN0ZWxsdCwgc29uZGVybiBhdWNoIGtvbXBsZXhlcmUgRnVua3Rpb25lbiB3aWUKK1ZpcnR1YWwgQ29tcGlsZXIgb2RlciBIZWlsc3RlbGxlbiBlbnRoYWVsdC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFkcmVpYwpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9QcmF4aXMtS3Vycy9oZWxsb193b3JsZC5jIGIvZG9jL2JlaXNwaWVsZS9QcmF4aXMtS3Vycy9oZWxsb193b3JsZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMDllMDYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL1ByYXhpcy1LdXJzL2hlbGxvX3dvcmxkLmMKQEAgLTAsMCArMSwzNyBAQAorLy8gKGMpIGJ5IFBhZHJlaWMgKFBhZHJlaWNAbWcubXVkLmRlKQorCisvLyBBdWNoIHdlbm4gZGllc2VzIE9iamVrdCBub2NoIGtlaW5lcmxlaSB0aWVmZXJlbiBTaW5uIGhhdCwgc28gaXN0IGVzIGRvY2gKKy8vIGJlcmVpdHMgZWluIHZvbGxzdGFlbmRpZ2VzIE9iamVrdCAoYmVyZWl0cyBlaW5lIGVpbnppZ2UgRnVua3Rpb24gcmVpY2h0CisvLyAgZnVlciBlaW4gTFBDLU9iamVjdCBhdXMpLgorCisvLyBEaWUgMyBGdW5rdGlvbmVuIGluIGRpZXNlbSBPYmpla3QgaGFiZW4gZGFydWViZXIgaGluYXVzIG5vY2ggZWluZQorLy8gZ2FueiBiZXNvbmRlcmUgQmVkZXV0dW5nLiBKZWRlIGRpZXNlciAzIEZ1bmt0aW9uZW4gd2lyZCB2b20gR2FtZS1Ecml2ZXIKKy8vIGltIGxhdWZlbmRlbiBCZXRyaWViIGJlaSBiZXNvbmRlcmVuIEFubGFlc3NlbiBhdWZnZXJ1ZmVuLgorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQorLy8gRGllc2UgRnVua3Rpb24gd2lyZCBhdWZnZXJ1ZmVuIHNvYmFsZCBkaWVzZXMgT2JqZWt0IGdlY2xvbnQgd2lyZC4KK3sKKyAgIC8vIGdpYnQgYW4gZGVuIFNwaWVsZXIgZGVyIGRpZXNlcyBPYmpla3QgY2xvbnQgZWluZSBNZWxkdW5nIGF1cy4KKyAgIHRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksICJIZWxsbyBXb3JsZCFcbiIpOworfQorCit2b2lkIGluaXQoKQorLy8gRGllc2UgRnVua3Rpb24gd2lyZCBhdWZnZXJ1ZmVuLCBzb2JhbGQgZWluIFNwaWVsZXIgb2RlciBlaW4gTlBDIGluCisvLyBSZWljaHdlaXRlIGRpZXNlcyBPYmpla3RlcyBrb21tdDogQWxzbyBlbnR3ZWRlciB3ZW5uIGVpbiBMZWJld2VzZW4gaW4KKy8vIGRhcyBPYmpla3QgYmV3ZWd0IHdpcmQgb2RlciB1bWdla2VocnQgb2RlciB3ZW5uIGVpbiBMZWJld2VzZW4gaW4gZGllCisvLyBVbWdlYnVuZyBlaW5lcyBPYmpla3RlcyBrb21tdCBvZGVyIHVtZ2VrZWhydC4KK3sKKyAgIC8vIGdpYnQgd2llZGVyIGVpbmUgTWVsZHVuZyBhbiBkZW4gU3BpZWxlciBhdXMuLi4KKyAgIHRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksICgiSGVsbG8gYWdhaW4gOikuXG4iKTsKK30KKwordm9pZCByZXNldCgpCisvLyBEaWVzZSBGdW5rdGlvbiB3aXJkIGltIGJlcnVlbXRlbiBSZXNldCBhdWZnZXJ1ZmVuLCBkZW4gRHUgamEgc2ljaGVyIGF1Y2gKKy8vIHNjaG9uIGFscyBTcGllbGVyIGtlbm5lbmdlbGVybnQgaGFzdCAoQWxzbyBhbGxlIDMwLTYwIE1pbnV0ZW4pLgorLy8gQXVzbmFobWU6IFdlbm4gZGFzIE9iamVrdCBsYWVuZ2VyZSBaZWl0IG1pdCBrZWluZW0gYW5kZXJlbiBPYmpla3QKKy8vIGtvbW11bml6aWVydCBoYXQsIHdpcmQgZGllc2UgRnVua3Rpb24gdm9ybGFldWZpZyBuaWNodCBtZWhyIGF1ZmdlcnVmZW4hCit7CisgIC8vIEhpZXIga2FubiBtYW4gbnVuIGF1Y2ggaXJnZW5kZXR3YXMgbWFjaGVuLiBFaW4gd3JpdGUoIi4uIikgaGFldHRlCisgIC8vIGhpZXIgamVkb2NoIGtlaW5lbiBFZmZla3QsIGRhIGtlaW4gU3BpZWxlciBkaWVzZSBGdW5rdGlvbiBhdXNnZWxvZXN0CisgIC8vIGhhdCB1bmQgZGFoZXIgbmljaHQgYmVrYW5udCBpc3QsIGFuIHdlbiBkaWUgTWVsZHVuZyBkZW5uIGdlaGVuIHNvbGwuLi4KK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvUHJheGlzLUt1cnMvanV3ZWxlbi5jIGIvZG9jL2JlaXNwaWVsZS9QcmF4aXMtS3Vycy9qdXdlbGVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEwNzBhNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvUHJheGlzLUt1cnMvanV3ZWxlbi5jCkBAIC0wLDAgKzEsNjYgQEAKKy8vIChjKSBieSBQYWRyZWljIChQYWRyZWljQG1nLm11ZC5kZSkKKworLy8gRGllc2VzIGlzdCBlaW4gZXJzdGVzIE9iamVrdCBkYXMgc28gb2RlciBhZWhubGljaCB0YXRzYWVjaGxpY2ggaW0KKy8vIE1vcmdlbkdyYXVlbiB2b3Jrb21tZW4ga29lbm50ZS4KKworLy8gSmVkZXMgT2JqZWt0IGltIE1vcmdlbkdyYXVlbiBicmF1Y2h0IGJlcmVpdHMgZWluZSBzb2xjaGUgVmllbHphaGwgdm9uCisvLyBTdGFuZGFyZGZ1bmt0aW9uZW4sIGRhc3MgZXMgemllbWxpY2ggdW5tb2VnbGljaCBpc3QsIGRpZXNlIGFsbGUgaW4gamVkZW0KKy8vIE9iamVrdCB6dSBkZWZpbmllcmVuLiBEYWhlciAiZXJidCIgbWFuIGRpZXNlIEZ1bmt0aW9uZW4gdm9uIGVpbmVtCisvLyBTdGFuZGFyZG9iamVrdC4KKy8vICJFcmJlbiIgYmVkZXV0ZXQgaGllcmJlaSwgZGFzIG1hbiBhdWYgYWxsZSBGdW5rdGlvbmVuLCBkaWUgYmVyZWl0cyBpbQorLy8gU3RhbmRhcmRvYmpla3QgZGVmaW5pZXJ0IHNpbmQsIHp1Z3JlaWZlbiBrYW5uLgorLy8KKy8vIERpZSBmb2xnZW5kZSBaZWlsZSBlcmtsYWVydCwgZGFzcyBtYW4gZGFzIE9iamVrdCBhbiBkZXIgUG9zaXRpb24KKy8vICAvc3RkL3RoaW5nLmMgImVyYmVuIiBtb2VjaHRlLgoraW5oZXJpdCAiL3N0ZC90aGluZyI7CisKKworLy8gRGllIEZ1bmt0aW9uIGZvbGdlbmRlciBaZWlsZSBrYW5uIG1hbiBzaWNoIHJlY2h0IGVpbmZhY2ggd2llIGZvbGd0CisvLyB2b3JzdGVsbGVuOiBXZW5uIGRlciBHYW1lLURyaXZlciBkaWVzZXMgT2JqZWt0IGhpZXIgY29tcGlsaWVydCwgZGFubgorLy8gdHV0IGVyIHNvLCBhbHMgd3VlcmRlIGRpZSBEYXRlaSAvc3lzL3Byb3BlcnRpZXMuaCBnZW5hdSBhbiBkaWVzZXIgU3RlbGxlCisvLyBoaWVyIGltIENvZGUgc3RlaGVuLgorLy8KKy8vIERpZSBEYXRlaSBwcm9wZXJ0aWVzLmggYmVpbmhhbHRldCBlaW5mYWNoIG51ciBoYXVmZW53ZWlzZSBEZWZpbmVzIGZ1ZXIKKy8vIGRpZSBoYXVmZW53ZWlzZSBQcm9wZXJ0aWVzLgorLy8KKy8vIEFubWVya3VuZzogQWxsZSBEZWZpbmVzIGluIGRpZXNlciBEYXRlaSBzdGFydGVuIHVlYnJpZ2VucyBtaXQgZWluZW0gJ1BfJy4KKy8vIEFtIEJlc3RlbiBzb2xsdGVzdCBEdSBlaW5mYWNoIG1hbCBrdXJ6IGluIC9kb2MvcHJvcGVydGllcy5oIHJlaW5zZWhuCisvLyB1bmQgZWluIGJpc3NjaGVuIHJ1bWxlc2VuCisvLyAgKGtlaW5lIEFuZ3N0LCBkaWUgbXVzcyBtYW4gbmljaHQgYWxsZSBrZW5uZW4gOikuCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICAvLyBEaWUgRnVua3Rpb24gY3JlYXRlKCkgd3VyZGUgbmFlbWxpY2ggYmVyZWl0cyBpbiAvc3RkL3RoaW5nLmMKKyAgLy8gYmVzY2hyaWViZW4sIGthbm4gYWJlciBuaWNodCBtZWhyIHVlYmVyIGNyZWF0ZSgpIGF1ZmdlcnVmZW4gd2VyZGVuLCBkYQorICAvLyBkYW5uIGphIHdpZWRlciBkaWVzZSBGdW5rdGlvbiBoaWVyIGF1ZmdlcnVmZW4gd3VlcmRlCisgIC8vICh3b2R1cmNoIHdpciBkYW5uIGVpbmUgRW5kbG9zLVJla3Vyc2lvbiBoYWV0dGVuKS4KKyAgLy8gS3VyenNjaHJlaWJ3ZWlzZSB3YWVyZSA6OmNyZWF0ZSgpOyB3ZW5uIG1hbiBudXIgdm9uIGVpbmVtIE9iamVrdCBlcmJ0LgorICB0aGluZzo6Y3JlYXRlKCk7IC8vIG9kZXIgYXVjaCBlaW5mYWNoIDo6Y3JlYXRlKCk7CisKKyAgLy8gQXVjaCBkaWVzZSBGdW5rdGlvbiB3dXJkZSBhdXMgL3N0ZC90aGluZyBnZWVyYnQuCisgIC8vIFNldFByb3AoKSBpc3QgZWluZSBkZXIgd2ljaHRpZ3N0ZW4gRnVua3Rpb25lbiB1ZWJlcmhhdXB0LCB3ZW5uIGVzIGRhcnVtCisgIC8vIGdlaHQsIGVpbiBPYmpla3QgenUgYmVzY2hyZWliZW4uIE1pdCBkaWVzZXIgRnVua3Rpb24ga2FubnN0IER1IG5hZW1saWNoCisgIC8vIHphaGxyZWljaGUgRWlnZW5zY2hhZnRlbiAoZW5nbC4gcHJvcGVydGllcykgZGVzIE9iamVrdGVzIGZlc3RsZWdlbi4KKyAgU2V0UHJvcChQX1NIT1JULCAiRWluaWdlIHdlcnR2b2xsZSBKdXdlbGVuIik7ICAgICAgLy8gZGllIEt1cnpiZXNjaHJlaWJ1bmcKKyAgU2V0UHJvcChQX0xPTkcsICJEaWUgSnV3ZWxlbiBnbGl0emVybiB2ZXJsb2NrZW5kLlxuIik7IC8vIExhbmdiZXNjaHJlaWJ1bmcKKyAgU2V0UHJvcChQX05BTUUsICJKdXdlbGVuIik7IC8vIGRlciBlaWdlbnRsaWNoZSBOYW1lCisgIFNldFByb3AoUF9OQU1FX0FESiwgIndlcnR2b2xsIik7IC8vIGRhcyBBZGpla3RpdiB2b3IgZGVtIE5hbWVuCisgIFNldFByb3AoUF9HRU5ERVIsIEZFTUFMRSk7IC8vIEdlc2NobGVjaHQgKGthbm4gYXVjaCBNQUxFIG9kZXIgTkVVVEVSIHNlaW4pCisgIFNldFByb3AoUF9XRUlHSFQsIDUwMDApOyAvLyBkaWVzZXMgT2JqZWt0IHdpZWd0IDVrZworICBTZXRQcm9wKFBfVkFMVUUsIDEwMDAwKTsgLy8gZGFzIE9iamVrdCBpc3QgaW5zZ2VzYW10IDEwMDAwIE11ZW56ZW4gV2VydAorICAKKyAgLy8gTWl0IGRpZXNlciBGdW5rdGlvbiBrYW5uIG1hbiBlaW5lIGlkIGFuZ2ViZW4sIHVlYmVyIGRpZSBkYXMgT2JqZWt0CisgIC8vIGFuc3ByZWNoYmFyIGlzdC4KKyAgLy8gQW5tZXJrdW5nOiBBdWNoIGRpZXNlIEZ1bmt0aW9uIGlzdCB3aWVkZXIgdm9uIHN0ZC90aGluZyBnZWVyYnQsIGltCisgIC8vICAgZm9sZ2VuZGVuIHdlcmRlIGljaCBkaWVzIGFiZXIgbmljaHQgbWVociBiZWkgamVkZXIgRnVua3Rpb24gZXh0cmEKKyAgLy8gICBhbmdlYmVuLiBXZW5uIG5pY2h0IGFuZGVycyBhbmdlZ2ViZW4sIGhhbmRlbHQgZXMgc2ljaCBhYiBqZXR6dAorICAvLyAgIG5hZW1saWNoIF9pbW1lcl8gdW0gZXJlcmJ0ZSBGdW5rdGlvbmVuLgorICBBZGRJZCgianV3ZWxlbiIpOworICAKKyAgLy8gSW4gZGllc2VtIEZhbGwgYmVub2V0aWd0IG1hbiBub2NoIGVpbiB3ZWl0ZXJlcyBBZGpla3RpdiwgZGEgbWFuIGRhcworICAvLyBPYmpla3QgamEgYXVjaCBtaXQgd2VydHZvbGxlIEp1d2VsZW4gYW5zcHJlY2hlbiBrb2VubmVuIG1vZWNodGUuCisgIC8vIHouQi46IHVudCB3ZXJ0dm9sbGUganV3ZWxlbgorICAvLyAgICAgICBnaWIgd2VydHZvbGxlIGp1d2VsZW4gYW4gcGFkcmVpYworICBBZGRBZGplY3RpdmUoIndlcnR2b2xsZSIpOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9QcmF4aXMtS3Vycy9sb3MuYyBiL2RvYy9iZWlzcGllbGUvUHJheGlzLUt1cnMvbG9zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNiNDFlOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvUHJheGlzLUt1cnMvbG9zLmMKQEAgLTAsMCArMSwxMTggQEAKKy8vIChjKSBieSBQYWRyZWljIChQYWRyZWljQG1nLm11ZC5kZSkKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4gLy8gd2llZGVyIHVuc2VyZSBhbGxnZW1laW5lbiBQcm9wZXJ0eXMKKyNpbmNsdWRlIDxtb3ZpbmcuaD4gICAgIC8vIGVpbmlnZSBEZWZpbmVzIHp1bSBCZXdlZ2VuIHZvbiBPYmpla3RlbiAocy51LikKKworaW5oZXJpdCAiL3N0ZC90aGluZyI7CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7CisgICAvLyBPYmpla3QgdWViZXIgc2VpbmUgUHJvcGVydGllcyBiZXNjaHJlaWJlbi4uLgorICAgU2V0UHJvcChQX1NIT1JULCAiRWluIFJ1YmJlbGxvcyIpOworICAgU2V0UHJvcChQX0xPTkcsCisgICAgIkR1IGthbm5zdCBkaWVzZXMgTG9zIGF1ZnJ1YmJlbG4gdW0genUgc2VoZW4sIG9iIER1IGVpbmVuIGdyb3NzZW4gIgorICAgICJTY2hhdHpcbmdld29ubmVuIGhhc3QuXG4iKTsKKyAgIFNldFByb3AoUF9OQU1FLCAiUnViYmVsbG9zIik7CisgICBTZXRQcm9wKFBfQVJUSUNMRSwgMSk7IC8vIGlzdCBlaWdlbnRsaWNoIGJlcmVpdHMgRGVmYXVsdHdlcnQKKyAgIFNldFByb3AoUF9HRU5ERVIsIE5FVVRFUik7CisgICBTZXRQcm9wKFBfVkFMVUUsIDEwMDApOworICAgU2V0UHJvcChQX1dFSUdIVCwgNTAwKTsKKyAgIFNldFByb3AoUF9JTkZPLCAiRGVpbmUgR2V3aW5uY2hhbmNlbiBiZWkgZGllc2VuIExvc2VuIHNpbmQgbmljaHQgIgorICAgICAgICAgICAgICAgICAgICJzb25kZXJsaWNoIGd1dC5cbiIpOworICAgU2V0UHJvcChQX01BR0lDLCAwKTsgLy8gKGVpbmZhY2ggbnVyLCB1bSBtYWwgYWxsZSBQcm9wZXJ0aWVzIHp1IGJlbnV0emVuKQorICAgQWRkSWQoImxvcyIpOyAvLyBub2NoIGVpbmUgaWQgYW5nZWJlbi4uLgorCisgICAvLyBNaXQgSGlsZmUgZGllc2VyIG5ldWVuIHdpY2h0aWdlbiBGdW5rdGlvbiBpc3QgZXMgbW9lZ2xpY2gsIEJlZmVobGUgenUKKyAgIC8vIGRlZmluaWVyZW4sIHVlYmVyIGRpZSBtYW4gaXJnZW5kZXR3YXMgYXVzbG9lc2VuIGtvZW5uZW4gc29sbDoKKyAgIC8vIFVuZCB6d2FyIHdpcmQgc29iYWxkIGVpbiBTcGllbGVyIGRlbiBCZWZlaGwgcnViYmxlIG9kZXIgcnViYmVsCisgICAvLyBiZW51dHp0LCBkaWUgRnVua3Rpb24gX3J1YmJlbG4oKSBoaWVyIGltIE9iamVrdCBhdWZnZXJ1ZmVuLiBEYSBkaWVzZQorICAgLy8gRnVua3Rpb24gYmlzaGVyIGphIG5vY2ggbmljaHQgZGVmaW5pZXJ0IGlzdCwgbXVzcyBkaWVzZSBuYXR1ZXJsaWNoCisgICAvLyBhdWNoIG5vY2ggcHJvZ3JhbW1pZXJ0IHdlcmRlbi4KKyAgIEFkZENtZCgoeyJydWJibGUiLCAicnViYmVsIn0pLCAiX3J1YmJlbG4iKTsKK30KKworLy8gRGllc2UgRnVua3Rpb24gc2llaHQgZ2xlaWNoIHVtIGVpbmlnZXMga29tcGxleGVyIGF1cyBhbHMgZGllIEZ1bmt0aW9uZW4KKy8vIGNyZWF0ZSgpLCBpbml0KCkgdW5kIHJlc2V0KCksIGRpZSBiaXNoZXIgYmVudXR6dCB3dXJkZW4uCisvLyBEYXMgc3RhdGljIGFtIEFuZmFuZyBlcmtsYWVydCBudXIsIGRhc3MgZGllc2UgRnVua3Rpb24gbmljaHQgdm9uIGF1c3NlbiwKKy8vIHNvbmRlcm4gbnVyIHZvbiBpbm5lcmhhbGIgZGVzIE9iamVrdGVzIGF1ZmdlcnVmZW4gd2VyZGVuIGthbm4uCisvLyBEYXMgImludCIgYW5zdGVsbGUgZGVzICJ2b2lkIiBiZWRldXRldCwgZGFzcyBkaWUgRnVua3Rpb25lbiBlaW4gRXJnZWJuaXMKKy8vIHp1cnVlY2tsaWVmZXJ0LiBEYSBkaWVzZSBGdW5rdGlvbiBpbiBWZXJiaW5kdW5nIG1pdCBBZGRDbWQoKSBiZW51dHp0CisvLyB3aXJkLCBoYXQgZGllc2VyIFJ1ZWNrZ2FiZXdlcnQgYXVjaCBlaW5lIGJlc29uZGVyZSBCZWRldXR1bmc6CisvLyAgIEVpbmUgMSBiZWRldXRldCwgZGFzcyBkZXIgQmVmZWhsIGZlcnRpZyBhYmdlYXJiZWl0ZXQgd3VyZGUuCisvLyAgIEVpbmUgMCBiZWRldXRldCwgZGFzIE9iamVrdCBrb25udGUgbWl0IGRlbSBCZWZlaGwgbmljaHRzIGFuZmFuZ2VuLCBkZXIKKy8vICAgIEdhbWVkcml2ZXIgbXVzcyBhbHNvIG5vY2ggaW4gd2VpdGVyZW4gT2JqZWt0ZW4gYW5mcmFnZW4sIGRpZSBkZXIKKy8vICAgIFNwaWVsZXIgYmVpIHNpY2ggdHJhZWd0LgorLy8gRGVyIFN0cmluZyAnc3RyJywgZGVuIGRpZSBGdW5rdGlvbiBhbHMgUGFyYW1ldGVyIHVlYmVyZ2ViZW4gYmVrb21tdCwKKy8vIGVudGhhZWx0IGRhcywgd2FzIGRlciBTcGllbGVyIGF1c3NlciBkZW0gZWlnZW50bGljaGVuIFZlcmIgZWluZ2VnZWJlbgorLy8gaGF0IChXb2VydGVyIHdpZSAndW5kJywgJ2VpbicsICdkZXInLCAnZGllJywgJ2RhcycgLi4uIHdlcmRlbiBoaWVyYmVpCisvLyAgenV2b3IgaGVyYXVzZ2VmaWx0ZXJ0KQorLy8gQnNwLjogICBydWJiZWwgbG9zICAgICAgLT4gIF9ydWJiZWxuKCJsb3MiKQorLy8gICAgICAgICBydWJiZWwga2F0emUgICAgLT4gIF9ydWJiZWxuKCJrYXR6ZSIpCisvLyAgICAgICAgIHJ1YmJlbCBsb3MgYXVmICAtPiAgX3J1YmJlbG4oImxvcyBhdWYiKQorcHVibGljIGludCBfcnViYmVsbihzdHJpbmcgc3RyKQoreworICAgLy8gRGllIEZ1bmt0aW9uIG5vdGlmeV9mYWlsKCkgaXN0IHdpZWRlciBlaW5lIEZ1bmt0aW9uIGRlcyBHYW1lZHJpdmVyczoKKyAgIC8vIFVuZCB6d2FyIGlzdCBlcyBtb2VnbGljaCBoaWVyIGVpbmUgTWVsZHVuZyBhbnp1Z2ViZW4sIGRpZSBhbnN0ZWxsZQorICAgLy8gZWluZXMgIldpZSBiaXR0ZT8iIGtvbW10LCBmYWxscyBrZWluIE9iamVrdCBkZW4gQmVmZWhsIHJpY2h0aWcKKyAgIC8vIGFiZ2VhcmJlaXRldCBoYXQuCisgICBub3RpZnlfZmFpbCgiU3ludGF4OiBydWJiZWwgbG9zIGF1ZlxuIik7IC8vIGVpZ2VudGxpY2ggZWZ1bjo6bm90aWZ5X2ZhaWwoKQorCisgICAvLyBXZW5uIGRlciB1ZWJlcmdlYmVuZSBTdHJpbmcgdW5nbGVpY2ggImxvcyBhdWYiIGlzdCwgZGFubiBmdWVobHQgc2ljaAorICAgLy8gZGFzIE9iamVrdCBuaWNodCBhbmdlc3Byb2NoZW4sIGthbm4gZGFzIFZlcmIgYWxzbyBuaWNodCBrb21wbGV0dAorICAgLy8gYWJhcmJlaXRlbiB1bmQgZ2lidCBkZXNoYWxiIGVpbmUgMCB6dXJ1ZWNrLgorICAgaWYgKHN0ciE9ImxvcyBhdWYiKSByZXR1cm4gMDsKKworICAgLy8gQXVjaCBkaWUgRnVua3Rpb24gcmFuZG9tKCkgaXN0IHdpZWRlciBlaW5lIEZ1bmt0aW9uIGRlcyBHYW1lZHJpdmVyOgorICAgLy8gVW5kIHp3YXIgbGllZmVydCBzaWUgZWluZSBnYW56emFobGlnZSBadWZhbGxzemFobCB6d2lzY2hlbiAwIHVuZCBuLTEKKyAgIC8vICAod29iZWkgbiBkaWUgdWViZXJnZWJlbmUgWmFobCBpc3QpLiBJbiBkaWVzZW0gRmFsbCBhbHNvIHp3aXNjaGVuCisgICAvLyAwIHVuZCA5OS4KKyAgIGlmIChyYW5kb20oMTAwKTw5MikgeyAvLyBzb2xsdGUgZGllc2UgWmFobCA8IDkyIHNlaW4sIGRhbm4gdHVlIEZvbGdlbmRlczoKKyAgICAgd3JpdGUoIkR1IHJ1YmJlbHN0IGRhcyBMb3MgYXVmLiBMZWlkZXIgd2FyIGVzIGplZG9jaCBudXIgZWluZSBOaWV0ZS5cbiIKKyAgICAgICAgICArIlZlcmFlcmdlcnQgbGFlc3N0IER1IGRhcyBMb3MgZGVzaGFsYiBmYWxsZW4uXG4iKTsKKyAgIH0KKyAgIGVsc2UgeyAvLyBzb2xsdGUgZGllIFphaGwgbmljaHQgPCA5MiBnZXdlc2VuIHNlaW4sIGRhbm4gdHVlIEZvbGdlbmRlczoKKyAgICAgb2JqZWN0IG9iOyAvLyBiZXJlaXRzdGVsbGVuIGVpbmVyIEhpbGZzdmFyaWFibGVuCisKKyAgICAgd3JpdGUoIkR1IHJ1YmJlbHN0IGRhcyBMb3MgYXVmIHVuZCBzdHJhaGxzdCB2b3IgRnJldWRlLiBFcyB3YXIgZGVyICIKKyAgICAgICAgICArImFic29sdXRlIEhhdXB0Z2V3aW5uLlxuU29mb3J0IGtvbW10IGVpbiBCb3RlIGhlcmVpbiB1bmQgIgorICAgICAgICAgICsidWViZXJyZWljaHQgRGlyIERlaW5lbiBHZXdpbm4uXG4iKTsKKworICAgICAvLyBNaXQgY2xvbmVfb2JqZWN0KCkga2FubiBtYW4gZWluIGJlbGllYmlnZXMgT2JqZWt0IENsb25lbiwgaW5kZW0gbWFuCisgICAgIC8vIGVpbmZhY2ggZGVuIGVudHNwcmVjaGVuZGVuIEZpbGVuYW1lbiBhbHMgUGFyYW1ldGVyIHVlYmVyZ2lidC4KKyAgICAgb2I9Y2xvbmVfb2JqZWN0KCIvZG9jL2JlaXNwaWVsZS9QcmF4aXMtS3Vycy9qdXdlbGVuIik7CisKKyAgICAgLy8gTnVuIGtvbW1lbiBnbGVpY2ggMyBuZXVlIERpbmdlIGF1ZiBlaW5tYWwuLi4KKyAgICAgLy8gTWl0IC0+IHdpcmQgZWluZSBGdW5rdGlvbiBpbiBlaW5lbSBhbmRlcmVuIE9iamVrdCBhdWZnZXJ1ZmVuCisgICAgIC8vICAoYWx0ZXJuYXRpdiBhdWNoOiBjYWxsX290aGVyKG9iLG1vdmUsdGhpc19wbGF5ZXIoKSwgTV9HRVQpOyApCisgICAgIC8vIERpZSBGdW5rdGlvbiwgZGllIGhpZXJiZWkgYXVmZ2VydWZlbiB3ZXJkZW4gc29sbCwgaGVpc3N0IG1vdmUoKS4KKyAgICAgLy8gRGllc2UgRnVua3Rpb24gaXN0IGluIGFsbGVuIE9iamVrdGVuIGRlZmluaWVydCwgZGllIC9zdGQvdGhpbmcgZXJiZW4uCisgICAgIC8vIFNvbWl0IGtvZW5uZW4gd2lyIGFsc28gZmVzdCBkYXZvbiBhdXNnZWhlbiwgZGFzcyBzaWUgYXVjaCBpbiB1bnNlcmVuCisgICAgIC8vIEp1d2VsZW4gdm9yaGFuZGVuIGlzdC4KKyAgICAgLy8gdGhpc19wbGF5ZXIoKSBpc3QgZWluZSBzZWhyIHdpY2h0aWdlIEdhbWVkcml2ZXItRnVua3Rpb24sIGRhIHNpZQorICAgICAvLyB1bnMgZGFzIExlYmV3ZXNlbiB6dXJ1ZWNrbGllZmVydCwgZGFzIGdlcmFkZSBha3RpdiBkdXJjaCBlaW5lbiBCZWZlaGwKKyAgICAgLy8gZGVuIGFrdHVlbGxlbiBGdW5rdGlvbnNhdWZydWYgZ2VzdGFydGV0IGhhdC4KKyAgICAgLy8gTV9HRVQgaXN0IGxlZGlnbGljaCBlaW4gRGVmaW5lLCBkYXMgaW4gbW92aW5nLmggZGVmaW5pZXJ0IGlzdC4KKyAgICAgLy8gTmFlaGVyZXMgaGllcnp1IGZpbmRldCBtYW4gYXVjaCBpbiA8bWFuIG1vdmU+LgorICAgICBvYi0+bW92ZSh0aGlzX3BsYXllcigpLCBNX0dFVCk7CisgICAgIC8vIEFDSFRVTkc6IHVtIGRpZXNlcyBCZWlzcGllbCBzaW1wZWwgenUgaGFsdGVuLCB3aXJkIGhpZXIgZGFyYXVmCisgICAgIC8vIHZlcnppY2h0ZXQsIHp1IHBydWVmZW4sIG9iIGRpZXNlIEJld2VndW5nIHVlYmVyaGF1cHQgZnVua3Rpb25pZXJ0CisgICAgIC8vIGhhdC4gTm9ybWFsZXJ3ZWlzZSBtdXNzIG1hbiBpbiBkaWVzZW0gRmFsbCAobWlzc2x1bmdlbmUgQmV3ZWd1bmcpCisgICAgIC8vIGVpbmUgRmVobGVyYmVoYW5kbHVuZyBkdXJjaGZ1ZWhyZW4gKHouQi4gb2Igd2llZGVyIGVudGZlcm5lbiwKKyAgICAgLy8gTWVsZHVuZyBhbiBkZW4gU3BpZWxlciBhdXNnZWJlbikuCisgICB9CisKKyAgIC8vIERpZSBGdW5rdGlvbiBzYXkoKSBnaWJ0IGFuIGFsbGUgU3BpZWxlciBpbSBSYXVtIGRlcyBha3RpdmVuIFNwaWVsZXJzCisgICAvLyBlaW5lIE5hY2hyaWNodCBhdXMsIGFiZXIgbmljaHQgYW4gZGVuIGJldHJvZmZlbmVuIFNwaWVsZXIgc2VsYnN0IQorICAgLy8gRGllIEZ1bmt0aW9uIE5hbWUoKSwgZGllIGhpZXIgaW0gU3BpZWxlciBhdWZnZXJ1ZmVuIHdpcmQsIHdlcnRldAorICAgLy8gZGVzc2VuIFByb3BlcnRpZSBQX05BTUUgYXVzIHVuZCBkZWtsaW5pZXJ0IGRlbiBOYW1lbiBpbSBhbmdlZ2ViZW5lbgorICAgLy8gRmFsbC4KKyAgIHNheSh0aGlzX3BsYXllcigpLT5OYW1lKFdFUikrIiBydWJiZWx0IGVpbiBMb3MgYXVmLlxuIik7CisKKyAgIC8vIFVuZCBudW4gc29sbCBzaWNoIGRhcyBPYmpla3Qgc2VsYnN0IGVudGZlcm5lbiAoemVyc3RvZXJlbikuCisgICByZW1vdmUoKTsKKworICAgLy8gRGEgZGVyIEJlZmVobCBqYSBrb21wbGV0dCBhYmdlYXJiZWl0ZXQgd3VyZGUsIGdlYmVuIHdpciBlaW5lIDEKKyAgIC8vIHp1cnVlY2suCisgICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvUHJheGlzLUt1cnMvbWlsY2guYyBiL2RvYy9iZWlzcGllbGUvUHJheGlzLUt1cnMvbWlsY2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmI2MTczCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9QcmF4aXMtS3Vycy9taWxjaC5jCkBAIC0wLDAgKzEsOTEgQEAKKy8vIChjKSBieSBQYWRyZWljIChQYWRyZWljQG1nLm11ZC5kZSkKKworLy8gQW5tZXJrdW5nOiBIZXV0enV0YWdlIGdpYnQgZXMgZnVlciBMZWJlbnNtaXR0ZWwgKGJ6dy4gYWxsZSBEaW5nZSwgZGllCisvLyBtYW4gZXNzZW4gb2RlciB0cmlua2VuIGthbm4pIGVpbiBTdGFuZGFyZG9iamVrdCBuYW1lbnMgL3N0ZC9mb29kLAorLy8gd2VsY2hlcyB2aWVsZSBGdW5rdGlvbmFsaXRhZXQgbWl0YnJpbmd0LCBkaWUgbWFuIGFuc29uc3RlbiBzZWxiZXIKKy8vIG11ZWhzYW0gYmFzdGVsbiBtdXNzLiBEaWUgVmVyd2VuZHVuZyBpc3QgZHJpbmdlbmQgZW1wZm9obGVuLgorCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPiAvLyB3aWVkZXIgdW5zZXJlIGFsbGdlbWVpbmVuIFByb3BlcnRpZXMKKworaW5oZXJpdCAiL3N0ZC90aGluZyI7CisKKy8vIGdsb2JhbGUgVmFyaWFibGUsIGRpZSBhbmdpYnQsIHdpZSB2b2xsIGRpZSBGbGFzY2hlIGlzdC4gRXMgc2luZCA1CisvLyBQb3J0aW9uZW4gZW50aGFsdGVuLgoraW50IG1lbmdlID0gNTsKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgIDo6Y3JlYXRlKCk7CisgICAvLyBPYmpla3QgdWViZXIgc2VpbmUgUHJvcGVydGllcyBiZXNjaHJlaWJlbi4uLgorICAgLy8gUF9TSE9SVCB1bmQgUF9MT05HIHdlcmRlbiBkaXJla3QgYWxzIEZ1bmt0aW9uIGltcGxlbWVudGllcnQgKHMudS4pCisgICBTZXRQcm9wKFBfTkFNRSwgIk1pbGNoZmxhc2NoZSIpOworICAgU2V0UHJvcChQX0dFTkRFUiwgRkVNQUxFKTsKKyAgIFNldFByb3AoUF9WQUxVRSwgODApOworICAgU2V0UHJvcChQX1dFSUdIVCwgMTAwMCk7CisgICBBZGRJZCgoeyJmbGFzY2hlIiwgIm1pbGNoZmxhc2NoZSJ9KSk7CisgICBBZGRDbWQoKHsidHJpbmsiLCAidHJpbmtlIn0pLCAiX3RyaW5rZW4iKTsKK30KKworLy8gQW5zdGVsbGUgdm9uIFBfU0hPUlQgS3VyemJlc2NocmVpYnVuZyB1ZWJlciBGdW5rdGlvbiBzaG9ydCgpLgorLy8gRGllcyBpc3QgbmljaHQgaW1tZXIgbW9lZ2xpY2gsIGRhIG5pY2h0IHp3YW5nc2xhZXVmaWcgenUgamVkZXIgUHJvcGVydGllCisvLyBlaW5lIGdsZWljaG5hbWlnZSBGdW5rdGlvbiBleGlzdGllcnQuCisvLyBFcyBpc3QgYWxsZXJkaW5ncyBub2NoIHNvZy4gUXVlcnltZXRob2RlbiAoc2llaGUgZGF6dSA8bWFuIFF1ZXJ5UHJvcD4gdW5kCisvLyA8bWFuIFF1ZXJ5PiBiZWkgQmVkYXJmKS4KK3B1YmxpYyBzdHJpbmcgc2hvcnQoKQoreworICAgc3RyaW5nIHN0cjsKKyAgIHN3aXRjaChtZW5nZSkgeworICAgICBjYXNlIDE6IHN0cj0iRWluZSBmYXN0IGxlZXJlIE1pbGNoZmxhc2NoZS5cbiI7IGJyZWFrOworICAgICBjYXNlIDI6IHN0cj0iRWluZSBiYWxkIGxlZXJlIE1pbGNoZmxhc2NoZS5cbiI7IGJyZWFrOworICAgICBjYXNlIDM6IHN0cj0iRWluZSBoYWxidm9sbGUgTWlsY2hmbGFzY2hlLlxuIjsgIGJyZWFrOworICAgICBjYXNlIDQ6IHN0cj0iRWluZSBmYXN0IHZvbGxlIE1pbGNoZmxhc2NoZS5cbiI7IGJyZWFrOworICAgICBjYXNlIDU6IHN0cj0iRWluZSB2b2xsZSBNaWxjaGZsYXNjaGUuXG4iOyAgICAgIGJyZWFrOworICAgICBkZWZhdWx0OiBzdHI9IkVpbmUgbGVlcmUgTWlsY2hmbGFzY2hlLlxuIjsKKyAgIH0KKyAgIHJldHVybiBzdHI7Cit9CisKK3B1YmxpYyBzdHJpbmcgbG9uZygpCit7CisgICBpZiAobWVuZ2U+MSkKKyAgICAgIHJldHVybiAiRWluZSBGbGFzY2hlIG1pdCBsZWNrZXJlciBWb2xsbWlsY2guXG4iOworICAgZWxzZQorICAgICAgcmV0dXJuICJEaWUgTWlsY2hmbGFzY2hlIGlzdCBiYWxkIGxlaWRlciBzY2hvbiBhbGxlLCBEdSBzb2xsdGVzdCAiCisgICAgICAgICAgICAgIkRpY2ggdmllbGxlaWNodCBtYWxcbm5hY2ggTmFjaHNjaHViIHVtc2Vobi5cbiI7Cit9CisKK3B1YmxpYyBpbnQgX3RyaW5rZW4oc3RyaW5nIHN0cikKK3sKKyAgIG5vdGlmeV9mYWlsKCJTeW50YXg6IHRyaW5rZSBhdXMgbWlsY2hmbGFzY2hlXG4iKTsKKworICAgLy8gRmFsbHMgZGllIGVyc3RlbiB2aWVyIFplaWNoZW4gaW4gZGVtIHVlYmVyZ2ViZW5lbiBTdHJpbmcgdW5nbGVpY2gKKyAgIC8vICJhdXMgIiBzaW5kLCBkYW5uIGZ1ZWhsdCBzaWNoIGRhcyBPYmpla3QgbmljaHQgYW5nZXNwcm9jaGVuLCBrYW5uIGRhcworICAgLy8gVmVyYiBhbHNvIG5pY2h0IGtvbXBsZXR0IGFiYXJiZWl0ZW4gdW5kIGdpYnQgZGVzaGFsYiBlaW5lIDAgenVydWVjay4KKyAgIGlmIChzdHJbMC4uM10hPSJhdXMgIikgcmV0dXJuIDA7CisKKyAgIC8vIEljaCBiZW51dHplIG51biBhbGxlcyBhYiBkZW0gdmllcnRlbiBaZWljaGVuIHVuZCBwcnVlZmUsIG9iIHNpY2ggZGFzCisgICAvLyBPYmpla3QgZGF2b24gYW5nZXNwcm9jaGVuIGZ1ZWhsdC4gSGllcnp1IGRpZW50IGRpZSBGdW5rdGlvbiBpZCgpLgorICAgLy8gR3Jvc3NlciBWb3J0ZWlsOiBVZWJlcnNpY2h0bGljaCB1bmQgc3BhZXRlcmVzIEVyZ2FlbnplbiB2b24gSWRzIGJ6dy4KKyAgIC8vIEFkamVrdGl2ZW4gZ2VodCBzZWhyIGVpbmZhY2ggdW5kIGVyc3BhcnQgbGFuZ2UgaWYoKS1BYmZyYWdlbi4KKyAgIGlmICggIWlkKHN0cls0Li5dKSApIHJldHVybiAwOworCisgICBpZiAobWVuZ2U8PTApIHsKKyAgICAgd3JpdGUoIkRpZSBNaWxjaGZsYXNjaGUgaXN0IGxlaWRlciBzY2hvbiBsZWVyIDooLlxuIik7CisgICB9CisgICBlbHNlIHsKKyAgICAgLy8gZHJpbmtfc29mdCgpIGlzdCBlaW5lIEZ1bmt0aW9uLCBkaWUgaW4gYWxsZW4gTGViZXdlc2VuIGltCisgICAgIC8vIE1vcmdlbmdyYXVlbiBkZWZpbmllcnQgaXN0IHVuZCB1ZWJlciBkaWUgbWFuIHNvd29obCBBYmZyYWdlbiBhbHMKKyAgICAgLy8gYXVjaCBob2Noc2V0emVuIHZvbiBQX0RSSU5LIHZvcm5laG1lbiBzb2xsdGUuCisgICAgIGlmICh0aGlzX3BsYXllcigpLT5kcmlua19zb2Z0KDEwKSkgeworCisgICAgICAgLy8gaGVhbF9zZWxmKCkgaXN0IGF1Y2ggaW4gYWxsZW4gTGViZXdlc2VuIGRlZmluaWVydCB1bmQgaGVpbHQgYmVpCisgICAgICAgLy8gZGVtIExlYmV3ZXNlbiBMZWJlbnMtIHVuZCBLb256ZW50cmF0aW9uc3B1bmt0ZS4KKyAgICAgICB0aGlzX3BsYXllcigpLT5oZWFsX3NlbGYoMTApOworICAgICAgIHdyaXRlKCJHZW51ZXNzbGljaCB0cmlua3N0IER1IGVpbmVuIFNjaGx1Y2sgTWlsY2guXG4iKTsKKyAgICAgICBzYXkodGhpc19wbGF5ZXIoKS0+TmFtZShXRVIpKyIgdHJpbmt0IGVpbmVuIFNjaGx1Y2sgVm9sbG1pbGNoLFxuIik7CisgICAgICAgbWVuZ2UtLTsKKyAgICAgfQorICAgICBlbHNlIHdyaXRlKCJTb3ZpZWwga2FubnN0IER1IGxlaWRlciBuaWNodCBtZWhyIHRyaW5rZW4uXG4iKTsKKyAgIH0KKyAgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9QcmF4aXMtS3Vycy9ucGMuYyBiL2RvYy9iZWlzcGllbGUvUHJheGlzLUt1cnMvbnBjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlhNTRmZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvUHJheGlzLUt1cnMvbnBjLmMKQEAgLTAsMCArMSwxMTUgQEAKKy8vIChjKSBieSBQYWRyZWljIChQYWRyZWljQG1nLm11ZC5kZSkKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxhdHRyaWJ1dGVzLmg+CisjaW5jbHVkZSA8Y29tYmF0Lmg+CisjaW5jbHVkZSA8Z3VhcmQuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDxuZXdfc2tpbGxzLmg+CisKKy8vIEVpbiBOUEMgd2lyZCBuaWNodCB2b24gL3N0ZC90aGluZyBkaXJla3QgZ2VlcmJ0LCBzb25kZXJuIHZvbiAvc3RkL25wYy4KKy8vIERhIC9zdGQvbnBjIGFiZXIgc2VpbmVyc2VpdHMgd2llZGVyIHZvbiAvc3RkL3RoaW5nIGVyYnQsIHNpbmQgaW0gTlBDIGF1Y2gKKy8vIHNhZW10bGljaGUgRnVua3Rpb25lbiBkZWZpbmllcnQsIGRpZSBiZXJlaXRzIGluIC9zdGQvdGhpbmcgZW50aGFsdGVuIHNpbmQuCitpbmhlcml0ICIvc3RkL25wYyI7CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgIDo6Y3JlYXRlKCk7CisgICAvLyBjcmVhdGVfZGVmYXVsdF9ucGMoKSBzZXR6dCBzY2hvbiBtYWwgZWluaWdlIHdpY2h0aWdlIFByb3BlcnRpZXMgd2llCisgICAvLyBQX0FUVFJJQlVURVMgYXV0b21hdGlzY2guLi4KKyAgIGNyZWF0ZV9kZWZhdWx0X25wYygyMCwgMzAwKTsKKworICAgLy8gS2VpbmUgQW5nc3Q6IEVzIG11ZXNzZW4ga2VpbmVzd2VncyBpbW1lciBhbGxlIGRpZXNlIFByb3BlcnRpZXMgYmVudXR6dAorICAgLy8gd2VyZGVuLCBhdWNoIHdlbm4gaWNoIHNpZSBqZXR6dCBlaW5tYWwgYWxsZSBhbmdlYmUsIHVtIGVpbmUgVWViZXJzaWNodAorICAgLy8genUgZ2ViZW4sIHdhcyBtYW4gYWxsZXMgdWViZXIgUHJvcGVydGllcyBzdGV1ZXJuIGthbm4uLi4KKyAgIFNldFByb3AoUF9TSE9SVCwgIkVpbiBmaWVzZXIgT3JrIik7CisgICBTZXRQcm9wKFBfTE9ORywgIkRlciBPcmsgc2NoYXV0IERpY2ggZ3JpbW1pZyBhbi5cbiIpOworICAgU2V0UHJvcChQX05BTUUsICJPcmsiKTsKKyAgIFNldFByb3AoUF9OQU1FX0FESiwgImZpZXMiKTsKKyAgIFNldFByb3AoUF9HRU5ERVIsIE1BTEUpOworICAgU2V0UHJvcChQX01BR0lDLCAwKTsKKyAgIFNldFByb3AoUF9NQVRFUklBTCwgTUFUX01JU0NfTElWSU5HKTsKKworICAgLy8gbnVuIGtvbWVuIGVpbmlnZSB3aXJrbGljaCBuZXVlIFByb3BlcnRpZXMKKyAgIFNldFByb3AoUF9JTkZPLCAiRGVyIE9yayBpc3QgZWluIGdhbnogZ2VtZWluZXIuLi4gOilcbiIpOworICAgU2V0UHJvcChQX0FMSUdOLCAtNTAwKTsgLy8gQWxpZ25tZW50IGRlcyBHZWduZXJzCisgICBTZXRQcm9wKFBfUkFDRSwgIk9yayIpOyAvLyBSYXNzZSBkZXMgTlBDcworICAgU2V0UHJvcChQX0FHR1JFU1NJVkUsIDEpOyAvLyBncmVpZnQgYWdncmVzc2l2IGplZGVuIGFuCisgICBTZXRQcm9wKFBfQVRUUklCVVRFUywgKFtBX0lOVDo1LCBBX0RFWDoxMCwgQV9TVFI6MjUsIEFfQ09OOjEwXSkpOworICAgU2V0UHJvcChQX1NJWkUsIDEzNCk7IC8vIEdyb2Vzc2UgaW4gY20KKyAgIFNldFByb3AoUF9NQVhfSFAsIDMwMCk7IC8vIG1heC4gTGViZW5zcHVua3RlCisgICBTZXRQcm9wKFBfSFAsIDMwMCk7IC8vIExlYmVuc3B1bmt0ZQorICAgU2V0UHJvcChQX01BWF9TUCwgMjAwKTsgLy8gbWF4LiBNYWdpZXB1bmt0ZQorICAgU2V0UHJvcChQX1NQLCAyMDApOyAvLyBNYWdpZXB1bmt0ZQorICAgU2V0UHJvcChQX0JPRFksIDgwKTsgLy8gR3J1bmRydWVzdHVuZ3NzY2h1dHogZGVzIEtvZXJwZXJzCisgICBTZXRQcm9wKFBfTUFYX0hBTkRTLCAyKTsgLy8ga2FlbXBmdCBtaXQgendlaSBIYWVuZGVuLi4uCisgICBTZXRQcm9wKFBfSEFORFMsICh7IiBtaXQgYmxvc3NlbiBIYWVuZGVuIiwgMTUwfSkpOworICAgU2V0UHJvcChQX05PTUFHSUMsIDIwKTsgLy8gMjAlIFJlc2lzdGVueiBnZWdlbiBTcGVsbHMKKyAgIFNldFByb3AoUF9HVUFSRCwgMjApOyAvLyBEZXIgTlBDIGxhZXNzdCBzaWNoIGdnZi4gd2VnbG9ja2VuCisgICBTZXRQcm9wKFBfTk9fR0xPQkFMX0FUVEFDSywgMCk7IC8vIHdpcmQgdm9uICd0b2V0ZSBhbGxlcycgZXJmYXNzdAorICAgU2V0UHJvcChQX05PX0FUVEFDSywgMCk7ICAvLyBrYW5uIG1hbiBkZW4gTlBDIHVlYmVyaGF1cHQgYW5ncmVpZmVuPworICAgU2V0UHJvcChQX0ZSSUVORCwgMCk7IC8vIHNvbGwgZGVyIE5QQyBpbiBTcGVsbHMgYWxzIEZyZXVuZCBlcmZhc3N0CisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2VyZGVuPworICAgU2V0UHJvcChQX1JFU0lTVEFOQ0UsIERUX0ZJUkUpOyAgLy8gUmVzaXN0ZW56ZW4KKyAgIFNldFByb3AoUF9WVUxORVJBQklMSVRZLCBEVF9IT0xZKTsgIC8vIEVtcGZpbmRsaWNoa2VpdGVuCisgICBTZXRQcm9wKFBfRk9PRCwgMCk7CisgICBTZXRQcm9wKFBfTUFYX0ZPT0QsIDEwMCk7CisgICBTZXRQcm9wKFBfRFJJTkssIDApOworICAgU2V0UHJvcChQX01BWF9EUklOSywgMTAwKTsKKyAgIFNldFByb3AoUF9BTENPSE9MLCAwKTsKKyAgIFNldFByb3AoUF9NQVhfQUxDT0hPTCwgMTAwKTsKKyAgIFNldFByb3AoUF9YUCwgUXVlcnlQcm9wKFBfTUFYX0hQKSpRdWVyeVByb3AoUF9IQU5EUylbMF0qNSk7IC8vIEVyZmFocnVuZworICAgU2V0UHJvcChQX01VUkRFUl9NU0csICJJY2gga29tbWUgZG9jaCBlaCB3aWVkZXIhXG4iKTsgLy8gTW9lcmRlcm1lbGR1bmcKKyAgIFNldFByb3AoUF9LSUxMX05BTUUsICJFaW4gZmllc2VyIFRlc3RvcmsiKTsgLy8gbm9ldGlnIGZhbGxzICE9IFBfTkFNRQorICAgU2V0UHJvcChQX0tJTExfTVNHLCAiRGFzIGtvbW10IGRhdm9uIHdlbm4gbWFuIHNpY2ggbWl0IG1pciBhbmxlZ3QuXG4iKTsKKyAgIFNldFByb3AoUF9ESUVfTVNHLCAiRGVyIE9yayBzY2hyZWl0IGVpbiBsZXR6dGVzIG1hbCBsYXV0IGF1Zi5cbiIpOworICAgU2V0UHJvcChQX05PQ09SUFNFLCAwKTsgLy8gc29sbCBkZXIgTlBDIGVpbmUgTGVpY2hlIGhpbnRlcmxhc3Nlbj8KKyAgIFNldFByb3AoUF9IRUFMLCAtMTApOyAvLyB3aWV2aWVsIExQIGJla29tbXQgbWFuIGJlaW0gTGVpY2hlbiBlc3Nlbi4uLgorCisgICAvLyBkZXIgT3JrIGlzdCBNaXRnbGllZCBkZXIgQWJlbnRldXJlcmdpbGRlLi4uCisgICBTZXRQcm9wKFBfR1VJTEQsICJhYmVudGV1cmVyIik7IC8vIGluIGRpZSBBYmVudGV1ZXJnaWxkZSBtaXQgaWhtLi4uCisgICBTZXRQcm9wKFBfR1VJTERfTEVWRUwsIDIwKTsKKyAgIE1vZGlmeVNraWxsKCJmZXVlcmJhbGwiLChbU0lfU0tJTExBQklMSVRZOjEwMDAwXSksMSwiYWJlbnRldXJlciIpOworCisgICAvLyBudW4gbm9jaCBlaW5lIGFuZGVyZSBBcnQgenUgemF1YmVybi4uLgorICAgU2V0UHJvcChQX1NQRUxMUkFURSwgMTApOworICAgQWRkU3BlbGwoMTAwLCA0MDAsCisgICAgICJEZXIgT3JrIHRyaXR0IERpY2ggZWlubWFsIGZlc3RlIHp3aXNjaGVuIGRpZSBCZWluZS5cbiIsCisgICAgICJEZXIgT3JrIHRyaXR0IEBXRU4gZWlubWFsIGZlc3RlIHp3aXNjaGVuIGRpZSBCZWluZS5cbiIsIERUX0JMVURHRU9OKTsKKworICAgLy8gd2FzIHNvbGwgZGVyIE5QQyBtaXQgaWhtIGdlZ2ViZW5lbiBHZWdlbnN0YWVuZGVuIG1hY2hlbi4uLgorICAgU2V0UHJvcChQX1JFSkVDVCwgKHtSRUpFQ1RfRFJPUCwgIkRhbWl0IGthbm4gaWNoIG5pY2h0cyBhbmZhbmdlbi5cbiJ9KSk7CisKKyAgIC8vIHVuZCBuYXR1ZXJsaWNoIGF1Y2ggbm9jaCBlaW5lIGlkIGZ1ZXIgZGVuIG9yaworICAgQWRkSWQoIm9yayIpOworCisgICAvLyBEZXIgTlBDIGhhdCBpbW1lciBlaW5pZ2UgSnV3ZWxlbiBiZWkgc2ljaC4KKyAgIEFkZEl0ZW0oIi9kb2MvYmVpc3BpZWxlL1ByYXhpcy1LdXJzL2p1d2VsZW4iKTsKK30KKworLy8gRGllc2UgRnVua3Rpb24gd2lyZCBhdWZnZXJ1ZmVuLCB3ZW5uIG1hbiBlaW5lbiBHZWdlbnN0YW5kIGJla29tbXQuLi4KK3B1YmxpYyB2b2lkIGdpdmVfbm90aWZ5KG9iamVjdCBvYikKK3sKKyAgIGlmIChvYi0+aWQoIm1pbGNoZmxhc2NoZSIpKSAvLyBNaWxjaCBhbm5laG1lbiB1bmQgZWluZW4gU3BydWNoIGF1ZnNhZ2VuCisgICAgIHdyaXRlKCJEZXIgT3JrIHNhZ3Q6IE9oaC4uLi4gRGFua2UgZnVlciBkaWUgbGVja2VyZSBNaWxjaC5cbiIpOworICAgZWxzZSA6OmdpdmVfbm90aWZ5KG9iKTsgLy8gR2VnZW5zdGFuZCBmYWxsZW4gbGFzc2VuCit9CisKKy8vIERpZXNlIEZ1bmt0aW9uIHdpcmQgYXVmZ2VydWZlbiwgd2VubiB1bnMgamVtYW5kIGltIEthbXBmIFNjaGFkZW4genVmdWVnZW4KKy8vIG1vZWNodGUuLi4KK3B1YmxpYyB2YXJhcmdzIGludCBEZWZlbmQoaW50IGRhbSwgbWl4ZWQgZGFtX3R5cGUsIG1peGVkIHNwZWxsLCBvYmplY3QgZW5lbXkpCit7CisgICBpZiAoIXJhbmRvbSg0KSkKKyAgICAgd3JpdGUoIkRlciBPcmsgd2VpY2h0IERlaW5lbSBBbmdyaWZmIGdlc2NoaWNrdCBhdXMuXG4iKTsKKyAgIGVsc2UKKyAgICAgcmV0dXJuIDo6RGVmZW5kKGRhbSwgZGFtX3R5cGUsIHNwZWxsLCBlbmVteSk7Cit9CisKK3B1YmxpYyB2b2lkIEF0dGFjayhvYmplY3QgZW5lbXkpCit7CisgIC8vIGRhcyBLb21tYW5kbyAnRmV1ZXJiYWxsJyBlaW5nZWJlbi4gRGEgZGVyIE5QQyBNaXRnbGllZCBkZXIKKyAgLy8gQWJlbnRldXJlcmdpbGRlIGlzdCAocy5vLiksIHNwcmljaHQgZXIgYWxzbyBkZW4gU3BlbGwsIGZhbGxzIGVyIGdlbnVnCisgIC8vIE1hZ2llcHVua3QgZGFmdWVyIGhhdC4KKyAgaWYgKCFyYW5kb20oMykpIGNvbW1hbmRfbWUoImZldWVyYmFsbCIpOworICA6OkF0dGFjayhlbmVteSk7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL2Zlcm53YWZmZW4va3VyemJvZ2VuLmMgYi9kb2MvYmVpc3BpZWxlL2Zlcm53YWZmZW4va3VyemJvZ2VuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM2MjNlNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvZmVybndhZmZlbi9rdXJ6Ym9nZW4uYwpAQCAtMCwwICsxLDMyIEBACitpbmhlcml0ICIvc3RkL3JhbmdlZF93ZWFwb24iOworCisjaW5jbHVkZSAiLi9wYXRoLmgiCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCit2b2lkIGNyZWF0ZSgpIHsKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgOjpjcmVhdGUoKTsKKworICBTZXRQcm9wKFBfU0hPUlQsICJFaW4gS3VyemJvZ2VuIik7CisgIFNldFByb3AoUF9JTkZPLAorICAgICJEaWUgU3ludGF4IGxhdXRldDogc2NoaWVzc2UgPGdlc2Nob3NzPiBhdWYgPHppZWw+XG4iKTsKKyAgU2V0UHJvcChQX05BTUUsICJLdXJ6Ym9nZW4iKTsKKyAgU2V0UHJvcChQX0xPTkcsIGJyZWFrX3N0cmluZygKKyAgICAiTWl0IGRpZXNlbSBLdXJ6Ym9nZW4ga2FubiBtYW4gc2ljaGVyIG5pY2h0IHdlaXQgc2NoaWVzc2VuLiIpKTsKKyAgU2V0UHJvcChQX01BVEVSSUFMLCBNQVRfTUlTQ19XT09EKTsKKworICBBZGRJZCgia3VyemJvZ2VuIik7CisgIFNldFByb3AoUF9HRU5ERVIsIE1BTEUpOworICBTZXRQcm9wKFBfV0VJR0hULCA4MDApOworICBTZXRQcm9wKFBfVkFMVUUsIDMwMCk7CisKKyAgU2V0UHJvcChQX1dDLCAxMCk7CisgIFNldFByb3AoUF9EQU1fVFlQRSwgRFRfQkxVREdFT04pOworCisgIFNldFByb3AoUF9TSE9PVElOR19XQywgNjApOworICBTZXRQcm9wKFBfTlJfSEFORFMsIDIpOworICBTZXRQcm9wKFBfV0VBUE9OX1RZUEUsIFdUX1JBTkdFRF9XRUFQT04pOworICBTZXRQcm9wKFBfQU1NVU5JVElPTiwgTVVOX0FSUk9XKTsKKyAgU2V0UHJvcChQX1NUUkVUQ0hfVElNRSwgMSk7CisgIFNldFByb3AoUF9SQU5HRSwgMTApOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvZmVybndhZmZlbi9sYW5nYm9nZW4uYyBiL2RvYy9iZWlzcGllbGUvZmVybndhZmZlbi9sYW5nYm9nZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTU2ZGQzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9mZXJud2FmZmVuL2xhbmdib2dlbi5jCkBAIC0wLDAgKzEsMzIgQEAKK2luaGVyaXQgIi9zdGQvcmFuZ2VkX3dlYXBvbiI7CisKKyNpbmNsdWRlICIuL3BhdGguaCIKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisKK3ZvaWQgY3JlYXRlKCkgeworICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuOworICA6OmNyZWF0ZSgpOworCisgIFNldFByb3AoUF9TSE9SVCwgIkVpbiBMYW5nYm9nZW4iKTsKKyAgU2V0UHJvcChQX0lORk8sCisgICAgIkRpZSBTeW50YXggbGF1dGV0OiBzY2hpZXNzZSA8Z2VzY2hvc3M+IGF1ZiA8emllbD5cbiIpOworICBTZXRQcm9wKFBfTkFNRSwgIkxhbmdib2dlbiIpOworICBTZXRQcm9wKFBfTE9ORywgYnJlYWtfc3RyaW5nKAorICAgICJNaXQgZGllc2VtIExhbmdib2dlbiBrYW5uIG1hbiBiZXN0aW1tdCBoZXJ2b3JyYWdlbmQgd2VpdCBzY2hpZXNzZW4uIikpOworICBTZXRQcm9wKFBfTUFURVJJQUwsIE1BVF9NSVNDX1dPT0QpOworCisgIEFkZElkKCJsYW5nYm9nZW4iKTsKKyAgU2V0UHJvcChQX0dFTkRFUiwgTUFMRSk7CisgIFNldFByb3AoUF9XRUlHSFQsIDgwMCk7CisgIFNldFByb3AoUF9WQUxVRSwgMzAwKTsKKworICBTZXRQcm9wKFBfV0MsIDMwKTsKKyAgU2V0UHJvcChQX0RBTV9UWVBFLCBEVF9CTFVER0VPTik7CisKKyAgU2V0UHJvcChQX1NIT09USU5HX1dDLCAxMjApOworICBTZXRQcm9wKFBfTlJfSEFORFMsIDIpOworICBTZXRQcm9wKFBfV0VBUE9OX1RZUEUsIFdUX1JBTkdFRF9XRUFQT04pOworICBTZXRQcm9wKFBfQU1NVU5JVElPTiwgTVVOX0FSUk9XKTsKKyAgU2V0UHJvcChQX1NUUkVUQ0hfVElNRSwgMik7CisgIFNldFByb3AoUF9SQU5HRSwgMzApOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvZmVybndhZmZlbi9ucGMuYyBiL2RvYy9iZWlzcGllbGUvZmVybndhZmZlbi9ucGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTQ0ZDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9mZXJud2FmZmVuL25wYy5jCkBAIC0wLDAgKzEsMjkgQEAKK2luaGVyaXQgIi9zdGQvbnBjIjsKKworI2luY2x1ZGUgIi4vcGF0aC5oIgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKwordm9pZCBjcmVhdGUoKSB7CisgIDo6Y3JlYXRlKCk7CisgIEFkZElkKCh7Im5wYyIsICJnZWduZXIiLCAiemllbCJ9KSk7CisgIFNldFByb3AoUF9OQU1FLCAiWmllbCIpOworICBTZXRQcm9wKFBfR0VOREVSLCBORVVURVIpOworICBTZXRQcm9wKFBfU0hPUlQsICJFaW4gWmllbCIpOworCisgIFNldFByb3AoUF9IUCwgMTAwMCk7CisgIFNldFByb3AoUF9CT0RZLCAxMDApOworfQorCit2YXJhcmdzIGludCBEZWZlbmQoaW50IGRhbSwgc3RyaW5nKiBkYW1fdHlwZSwgbWl4ZWQgc3BlbGwsIG9iamVjdCBlbmVteSkgeworICBpbnQgcHJlZGFtID0gZGFtOworICBpbnQgcmVzdWx0ID0gOjpEZWZlbmQoZGFtLCAmZGFtX3R5cGUsICZzcGVsbCwgZW5lbXkpOworICAKKyAgc3RyaW5nIHN0ciA9IGJyZWFrX3N0cmluZyhzcHJpbnRmKAorICAgICJEaWUgWmllbHNjaGVpYmUgc2FndDogJWQgU2NoYWRlbiByZWluIHVuZCBmdWVyICVkIGdldHJvZmZlbi4iLAorICAgIHByZWRhbSwgcmVzdWx0KSwgNzgpOworCisgIHRlbGxfcm9vbShsb2FkX29iamVjdChfX1BBVEhfXygwKSJ6aWVscmF1bSIpLCBzdHIpOworICB0ZWxsX3Jvb20obG9hZF9vYmplY3QoX19QQVRIX18oMCkic2NodXNzcmF1bSIpLCBzdHIpOworCisgIHJldHVybiByZXN1bHQ7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9mZXJud2FmZmVuL3BhdGguaCBiL2RvYy9iZWlzcGllbGUvZmVybndhZmZlbi9wYXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI4NDE0MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvZmVybndhZmZlbi9wYXRoLmgKQEAgLTAsMCArMSwzIEBACisjcHJhZ21hIHJ0dF9jaGVja3MsIHNhdmVfdHlwZXMKKyNwcmFnbWEgcGVkYW50aWMsICByYW5nZV9jaGVjaworI3ByYWdtYSB3YXJuX2VtcHR5X2Nhc3RzLCB3YXJuX21pc3NpbmdfcmV0dXJuLCB3YXJuX2Z1bmN0aW9uX2luY29uc2lzdGVudApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvZmVybndhZmZlbi9wZmVpbGUuYyBiL2RvYy9iZWlzcGllbGUvZmVybndhZmZlbi9wZmVpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGIxMWEzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9mZXJud2FmZmVuL3BmZWlsZS5jCkBAIC0wLDAgKzEsNDEgQEAKK2luaGVyaXQgIi9zdGQvdW5pdCI7CisKKyNpbmNsdWRlICIuL3BhdGguaCIKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8Y2xhc3MuaD4KKwordm9pZCBjcmVhdGUoKSB7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgIDo6Y3JlYXRlKCk7CisKKyAgU2V0UHJvcChQX05BTUUsICh7IlBmZWlsIiwgIlBmZWlsZSJ9KSApOworICBTZXRQcm9wKFBfTE9ORywgYnJlYWtfc3RyaW5nKAorICAgICJFaW4gcGFhciBlaW5mYWNoZSBIb2x6cGZlaWxlLiIsIDc4KSk7CisgIFNldFByb3AoUF9HRU5ERVIsIE1BTEUpOworICBTZXRQcm9wKFBfQU1PVU5ULCAxKTsKKyAgU2V0UHJvcChQX1NIT09USU5HX1dDLCA0MCk7CisgIFNldFByb3AoUF9EQU1fVFlQRSwgKHtEVF9QSUVSQ0V9KSk7CisgIFNldFByb3AoUF9XRUFQT05fVFlQRSwgV1RfQU1NVSk7CisgIFNldFByb3AoUF9NQVRFUklBTCwgTUFUX01JU0NfV09PRCk7CisKKyAgU2V0R3JhbXNQZXJVbml0cygxMjAsMSk7CisgIFNldENvaW5zUGVyVW5pdHMoMjUsMSk7CisKKyAgQWRkSWQoTVVOX0FSUk9XKTsKKyAgQWRkU2luZ3VsYXJJZCgicGZlaWwiKTsKKyAgQWRkUGx1cmFsSWQoInBmZWlsZSIpOworICBBZGRDbGFzcyhDTF9BTU1VTklUSU9OKTsKKworICBTZXRQcm9wKFBfSElUX0ZVTkMsIHRoaXNfb2JqZWN0KCkpOworfQorCitpbnQgSGl0RnVuYyhvYmplY3QgZW5lbXkpIHsKKyAgaWYoIXJhbmRvbSg1KSkgeworICAgIHRlbGxfb2JqZWN0KGVudmlyb25tZW50KCksIGJyZWFrX3N0cmluZygKKyAgICAgICJEZXIgUGZlaWwgc2NobnVycnQgdm9tIEJvZ2VuIHVuZCBkYWJlaSBzcGxpdHRlcnQgZGFzIEhvbHogIgorICAgICAgImV0d2FzLiBHcmF0aXN3aWRlcmhha2VuLCBkYXMgaXN0IGphIHRvbGwhIiwgNzgpKTsKKyAgICByZXR1cm4gMjA7CisgIH0KKworICByZXR1cm4gMDsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL2Zlcm53YWZmZW4vc2NodXNzcmF1bS5jIGIvZG9jL2JlaXNwaWVsZS9mZXJud2FmZmVuL3NjaHVzc3JhdW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTE3OWM5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9mZXJud2FmZmVuL3NjaHVzc3JhdW0uYwpAQCAtMCwwICsxLDM0IEBACitpbmhlcml0ICIvc3RkL3Jvb20iOworCisjaW5jbHVkZSAiLi9wYXRoLmgiCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCit2b2lkIGNyZWF0ZSgpIHsKKyAgOjpjcmVhdGUoKTsKKworICBTZXRQcm9wKFBfTElHSFQsIDEpOworICBTZXRQcm9wKFBfSU5UX1NIT1JULCAiQXVmIGVpbmVtIEJhdW0iKTsKKyAgU2V0UHJvcChQX0lOVF9MT05HLCBicmVha19zdHJpbmcoCisgICAgIkR1IGhvY2tzdCBhdWYgZWluZW0gQmF1bSB1bmQga2FubnN0IGF1ZiBkaWUgTGljaHR1bmcgdW50ZXIgRGlyIHNlaGVuLiAiCisgICAgIidzY2hhdSBydW50ZXInIGhpbGZ0IHNpY2hlcmxpY2gsIFppZWxlIGF1c3p1bWFjaGVuLiIpKTsKKworICBBZGREZXRhaWwoInJ1bnRlciIsIGZ1bmN0aW9uIHN0cmluZyB7IAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fUEFUSF9fKDApInppZWxyYXVtIi0+aW50X2xvbmcodGhpc19wbGF5ZXIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgQWRkSXRlbShfX1BBVEhfXygwKSJsYW5nYm9nZW4iLCBSRUZSRVNIX1JFTU9WRSk7CisgIEFkZEl0ZW0oX19QQVRIX18oMCkia3VyemJvZ2VuIiwgUkVGUkVTSF9SRU1PVkUpOworICBBZGRJdGVtKF9fUEFUSF9fKDApInBmZWlsZSIsIFJFRlJFU0hfUkVNT1ZFLCAoW1BfQU1PVU5UOiAyMF0pKTsKKworICBBZGRFeGl0KCJ6aWVscmF1bSIsIF9fUEFUSF9fKDApInppZWxyYXVtIik7CisgIGxvYWRfb2JqZWN0KF9fUEFUSF9fKDApInppZWxyYXVtIik7CisKKyAgU2V0UHJvcChQX1RBUkdFVF9BUkVBLCBfX1BBVEhfXygwKSJ6aWVscmF1bSIpOyAvLyBhbmRlcmVyIFJhdW0gYmVzY2hpZXNzYmFyCisgIFNldFByb3AoUF9TSE9PVElOR19BUkVBLCAxNSk7ICAgICAgICAgICAgICAgICAgLy8gMTUgRW50ZmVybnVuZworfQorCisvLyBudXIgd2VnZW4gZGVzIFBfTkVWRVJfQ0xFQU4gaW0gWmllbHJhdW0gdW5kIG51ciBoaWVyIGluIGRvYyByZWxldmFudAorcHVibGljIHZhcmFyZ3MgaW50IHJlbW92ZShpbnQgc2lsZW50KSB7CisgIF9fUEFUSF9fKDApInppZWxyYXVtIi0+cmVtb3ZlKCk7CisgIHJldHVybiA6OnJlbW92ZSgpOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9mZXJud2FmZmVuL3ppZWxyYXVtLmMgYi9kb2MvYmVpc3BpZWxlL2Zlcm53YWZmZW4vemllbHJhdW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTc3MDMyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9mZXJud2FmZmVuL3ppZWxyYXVtLmMKQEAgLTAsMCArMSwxOSBAQAoraW5oZXJpdCAiL3N0ZC9yb29tIjsKKworI2luY2x1ZGUgIi4vcGF0aC5oIgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKwordm9pZCBjcmVhdGUoKSB7CisgIDo6Y3JlYXRlKCk7CisKKyAgU2V0UHJvcChQX0xJR0hULCAxKTsKKyAgU2V0UHJvcChQX0lOVF9TSE9SVCwgIkF1ZiBlaW5lciBMaWNodHVuZyIpOworICBTZXRQcm9wKFBfSU5UX0xPTkcsIGJyZWFrX3N0cmluZygKKyAgICAiQXVmIGRpZXNlciBMaWNodHVuZyBzdGVodCBlaW4gQmF1bSwgZGVyIHZlcmRhZWNodGlnIHZpZWxlIEFlc3RlIGhhdCwgIgorICAgICJ2b24gZGVuZW4gbWFuIGF1ZiBkaWUgTGljaHR1bmcgZ3V0IHNlaGVuIGthbm4uIikpOworICBTZXRQcm9wKFBfTkVWRVJfQ0xFQU4sIDEpOyAvLyBkYW1pdCBkZXIgUmF1bSBhdWNoIGRhIGJsZWlidAorCisgIEFkZEl0ZW0oX19QQVRIX18oMCkibnBjIiwgUkVGUkVTSF9SRU1PVkUpOworCisgIEFkZEV4aXQoInNjaHVzc3JhdW0iLCBfX1BBVEhfXygwKSJzY2h1c3NyYXVtIik7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL2Zvb2QvYmFuYW5lLmMgYi9kb2MvYmVpc3BpZWxlL2Zvb2QvYmFuYW5lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg4MmY0ZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvZm9vZC9iYW5hbmUuYwpAQCAtMCwwICsxLDExNCBAQAorLyoKK0JlaXNwaWVsIGZ1ZXIgZWluZSBCYW5hbmUsIGRpZSBpbiBlaW5lbSBIYXBzIHdlZyBpc3QsCithYmVyIGVpbmUgU2NoYWxlIGhhdCwgZGllIHVlYnJpZyBibGVpYnQgdW5kIGdlbmF1IHdpZSBkaWUKK2tvbXBsZXR0ZSBCYW5hbmUgdmVyZ2FtbWVsdCB1bmQgdmVyZ2VodC4KKyovCisKKyNpbmNsdWRlIDxmb29kLmg+CisKK2luaGVyaXQgIi9zdGQvZm9vZCI7CisKK3N0cmluZyBfcXVlcnlfbG9uZygpIHsKKyAgc3RyaW5nIG0gPSAiRHUgaGFlbHRzdCAiOworICBpZiAoaXNfbm90X2VtcHR5KCkpIHsKKyAgICBtICs9ICJlaW5lIEJhbmFuZSBpbiBkZXIgSGFuZC4iOworICAgIGlmICghaXNfYmFkKCkpCisgICAgICBtICs9ICIgU2llIGlzdCBzY2hvZW4gZ2VsYiB1bmQgb2huZSBicmF1bmUgRmxlY2tlbi4iOworICAgIGVsc2UKKyAgICAgIG0gKz0gIiBTaWUgaXN0IHRvdGFsIGJyYXVuIHVuZCBzY2hvbiBnYW56IG1hdHNjaGlnLiI7CisKKyAgfSBlbHNlIHsKKyAgICBtICs9ICJlaW5lIEJhbmFuZW5zY2hhbGUgaW4gZGVyIEhhbmQuIjsKKyAgICBpZiAoaXNfYmFkKCkpCisgICAgICBtICs9ICIgU2llIGlzdCBnYW56IHZlcnNjaGltbWVsdC4iOworICB9CisgIHJldHVybiBicmVha19zdHJpbmcobSk7Cit9CisKK3ZvaWQgY3JlYXRlKCkgeworICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgeworICAgIHNldF9uZXh0X3Jlc2V0KC0xKTsKKyAgICByZXR1cm47CisgIH0KKyAgOjpjcmVhdGUoKTsKKworICBTZXRQcm9wKFBfU0hPUlQsIkVpbmUgc2Nob2VuZSByZWlmZSBCYW5hbmUiKTsKKyAgU2V0UHJvcChQX05BTUUsICJCYW5hbmUiKTsKKyAgU2V0UHJvcChQX0dFTkRFUixGRU1BTEUpOworICBTZXRQcm9wKFBfVkFMVUUsMjApOyAvLyBvaG5lIFNjaGFsZQorICBTZXRQcm9wKFBfV0VJR0hULDUwKTsgLy8gb2huZSBTY2hhbGUKKyAgLy8gU2V0UHJvcChQX1BPVElPTiwxKTsgLy8gaXN0IGVoIFN0YW5kYXJkCisgIFNldFByb3AoUF9DT05TVU1FX01TRywKKyAgICAiQFdFUjIgc2NoYWVsdCBlaW5lIEJhbmFuZSB1bmQgaXNzdCBzaWUgZ2VudWVzc2xpY2guIik7CisgIFNldFByb3AoUF9FQVRFUl9NU0csCisgICAgIkR1IHNjaGFlbHN0IGVpbmUgQmFuYW5lIHVuZCBpc3N0IHNpZSBnZW51ZXNzbGljaC4iKTsKKyAgU2V0UHJvcChQX0JBRF9NU0csCisgICAgIkRpZSBCYW5hbmUgd2lyZCBnYW56IG1hdHNjaGlnIHVuZCBzY2hsZWNodC4iKTsKKyAgU2V0UHJvcChQX1JFTU9WRV9NU0csCisgICAgIkRpZSBCYW5hbmUgaXN0IHNvIHZlcnNjaGltbWVsdCwgZGFzcyBEdSBzaWUgZW50c29yZ3N0LiIpOworICBTZXRQcm9wKFBfRU1QVFlfTVNHLAorICAgICJBYmVyIGRhcyBpc3QgZG9jaCBudXIgZWluZSBCYW5hbmVuU0NIQUxFLCBkaWUgd2lsbHN0IER1IG5pY2h0IGVzc2VuISIpOworCisgIFNldFByb3AoUF9NQVRFUklBTCwoW01BVF9NSVNDX1BMQU5UOjEwMF0pKTsKKworICBTZXRQcm9wKFBfRU1QVFlfUFJPUFMsIChbCisgICAgUF9TSE9SVDoiRWluZSBCYW5hbmVuc2NoYWxlIiwKKyAgICBQX05BTUU6IkJhbmFuZW5zY2hhbGUiLAorICAgIFBfRU1QVFlfSURTOih7InNjaGFsZSIsImJhbmFuZW5zY2hhbGUiLCJiYW5hbmUifSksCisgICAgUF9WQUxVRTo1LCAvLyBXZXJ0IGRlciBCYW5hbmVuc2NoYWxlCisgICAgUF9XRUlHSFQ6NSAgLy8gR2V3aWNodCBkZXIgQmFuYW5lbnNjaGFsZQorICBdKSk7CisKKyAgLy9TZXRQcm9wKFBfUkVTRVRfTElGRVRJTUUsMSk7IC8vIGlzdCBlaCBTdGFuZGFyZAorICBTZXRQcm9wKFBfREVTVFJPWV9CQUQsMzAwKTsgLy8gdmVyZG9yYmVuZSBCYW5hbmVuIHZlcnNjaHdpbmRlbiBuYWNoIDUgTWluCisKKyAgU2V0UHJvcChQX0ZPT0QsNTApOyAvLyBGdWVsbGdyYWQgZGVyIEJhbmFuZQorICBTZXRQcm9wKFBfSFAsNSk7CisgIFNldFByb3AoUF9TUCw1KTsKKworICBBZGRJZCgoeyJiYW5hbmUifSkpOworCit9CisKKy8vIERlciBCZWhhZWx0ZXIgdmVyZ2FtbWVsdCBhdWNoCitwdWJsaWMgaW50IG1ha2VfZGVzdHJveSgpIHsKKyAgaWYgKCE6Om1ha2VfZGVzdHJveSgpKSB7CisgICAgcmV0dXJuIHJlbW92ZSgxKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworcHVibGljIGludCBtYWtlX2VtcHR5KCkgeworICBTZXRQcm9wKFBfQkFEX01TRywKKyAgICAiRGllIEJhbmFuZW5zY2hhbGUgd2lyZCBnYW56IHNjaGltbWxpZy4iKTsKKyAgU2V0UHJvcChQX1JFTU9WRV9NU0csCisgICAgIkRpZSBCYW5hbmVuc2NoYWxlIHplcnNldHp0IHNpY2ggdm9sbHN0YWVuZGlnLiIpOworICByZXR1cm4gOjptYWtlX2VtcHR5KCk7Cit9CisKKy8vIHBhcmVudCBtZXRob2RlIGltbWVyIGF1ZnJ1ZmVuIHVuZCBwcnVlZmVuISEKK3ZvaWQgbWFrZV9iYWQoKSB7CisgIGlmICghOjptYWtlX2JhZCgpKSB7CisgICAgaWYgKGlzX25vdF9lbXB0eSgpKSB7CisgICAgICBTZXRQcm9wKFBfU0hPUlQsIkVpbmUgbWF0c2NoaWdlIEJhbmFuZSIpOworICAgICAgQWRkQWRqZWN0aXZlKCh7Im1hdHNjaGlnZSIsIm1hdHNjaGlnZW4ifSkpOworICAgICAgU2V0UHJvcChQX0VBVEVSX01TRywiRHUgbHV0c2Noc3QgZGllIG1hdHNjaGlnZSBCYW5hbmUgYXVzIGlocmVyIgorICAgICAgICAiU2NoYWxlLiBCYWVoLCBkaWUgc2NobWVja3QgdWViZXJoYXVwdCBuaWNodCBtZWhyLiIpOworICAgICAgU2V0UHJvcChQX0NPTlNVTUVfTVNHLAorICAgICAgICAiQFdFUjIgbHV0c2NodCBlaW5lIG1hdHNjaGlnZSBCYW5hbmUgYXVzIGlocmVyIFNjaGFsZS4iKTsKKyAgICAgIC8vIERpZSBTY2hhbGUgaXN0IGRhbm4gbmF0dWVybGljaCBhdWNoIHZlcmdhbW1lbHQKKyAgICAgIFNldFByb3AoUF9FTVBUWV9QUk9QUywgKFsKKyAgICAgICAgUF9TSE9SVDoiRWluZSB2ZXJzY2hpbW1lbHRlIEJhbmFuZW5zY2hhbGUiLAorICAgICAgICBQX05BTUU6IkJhbmFuZW5zY2hhbGUiLAorICAgICAgICBQX0VNUFRZX0lEUzooeyJzY2hhbGUiLCJiYW5hbmVuc2NoYWxlIiwiYmFuYW5lIn0pLAorICAgICAgICBQX0VNUFRZX0FESjooeyJ2ZXJzY2hpbW1lbHRlIiwidmVyc2NoaW1tZWx0ZW4ifSksCisgICAgICAgIFBfVkFMVUU6NSwgLy8gV2VydCBkZXIgQmFuYW5lbnNjaGFsZQorICAgICAgICBQX1dFSUdIVDo1ICAvLyBHZXdpY2h0IGRlciBCYW5hbmVuc2NoYWxlCisgICAgICBdKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG1lc3NhZ2UoUF9CQURfTVNHKTsKKyAgICAgIFNldFByb3AoUF9TSE9SVCwiRWluZSB2ZXJzY2hpbW1lbHRlIEJhbmFuZW5zY2hhbGUiKTsKKyAgICAgIEFkZEFkamVjdGl2ZSgoeyJ2ZXJzY2hpbW1lbHRlIiwidmVyc2NoaW1tZWx0ZW4ifSkpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9mb29kL3dhc3NlcmZsYXNjaGUuYyBiL2RvYy9iZWlzcGllbGUvZm9vZC93YXNzZXJmbGFzY2hlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M2MmMxMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvZm9vZC93YXNzZXJmbGFzY2hlLmMKQEAgLTAsMCArMSw5MiBAQAorLyoKK0JlaXNwaWVsIGZ1ZXIgZWluIHRyYWdiYXJlcyBHZXRyYWVuayBpbiBlaW5lciBGbGFzY2hlLgorKi8KKworI2luY2x1ZGUgPGZvb2QuaD4KKworaW5oZXJpdCAiL3N0ZC9mb29kIjsKKworc3RyaW5nIF9xdWVyeV9sb25nKCkgeworICBzdHJpbmcgbSA9ICJEdSBzaWVoc3QgZWluZSBHbGFzZmxhc2NoZSwiOworICBpZiAoaXNfbm90X2VtcHR5KCkpIHsKKyAgICBtICs9ICIgaW4gZGVyIHNpY2ggV2Fzc2VyIGJlZmluZGV0LiI7CisgICAgaWYgKCFpc19iYWQoKSkKKyAgICAgIG0gKz0gIiBFcyBpc3QgZ2xhc2tsYXIgdW5kIHNpZWh0IGlyZ2VuZHdpZSB2ZXJsb2NrZW5kIGF1cy4iOworICAgIGVsc2UKKyAgICAgIG0gKz0gIiBFcyBpc3QgdHJ1ZWJlIHVuZCBzaWVodCBuaWNodCBnZXJhZGUgdmVybG9ja2VuZCBhdXMuIjsKKworICAgIG0gKz0gIiBEaWUgRmxhc2NoZSBpc3QgIjsKKyAgICBzd2l0Y2ggKHRvX2ludCgoUXVlcnlQcm9wKFBfUE9SVElPTlMpLTEpLzIuNSkpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgbSArPSAiZmFzdCBsZWVyLiI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxOgorICAgICAgICBtICs9ICJoYWxiIHZvbGwuIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICAgIG0gKz0gImZhc3Qgdm9sbC4iOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgbSArPSAidm9sbC4iOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIG0gKz0gIm5pY2h0IGxlZXIuIjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgbSArPSAiIGluIGRlciBmcnVlaGVyIG1hbCBXYXNzZXIgd2FyLiI7CisgIH0KKyAgcmV0dXJuIGJyZWFrX3N0cmluZyhtKTsKK30KKwordm9pZCBjcmVhdGUoKSB7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSB7CisgICAgc2V0X25leHRfcmVzZXQoLTEpOworICAgIHJldHVybjsKKyAgfQorICA6OmNyZWF0ZSgpOworCisgIFNldFByb3AoUF9TSE9SVCwiRWluZSBGbGFzY2hlIG1pdCBXYXNzZXIiKTsKKyAgU2V0UHJvcChQX05BTUUsICJXYXNzZXJmbGFzY2hlIik7CisgIFNldFByb3AoUF9HRU5ERVIsRkVNQUxFKTsKKyAgU2V0UHJvcChQX1ZBTFVFLDUpOyAvLyBwcm8gUG9ydGlvbiAob2huZSBGbGFzY2hlKQorICBTZXRQcm9wKFBfV0VJR0hULDUwKTsgLy8gcHJvIFBvcnRpb24gKG9obmUgRmxhc2NoZSkKKyAgU2V0UHJvcChQX1BPUlRJT05TLDEwKTsKKyAgU2V0UHJvcChQX0RFU1RST1lfQkFELDApOyAvLyB2ZXJkb3JiZW5lcyBXYXNzZXIgd2lyZCBuaWNodCB6ZXJzdG9lcnQKKyAgU2V0UHJvcChQX0NPTlNVTUVfTVNHLAorICAgICJAV0VSMiB0cmlua3QgYXVzIGVpbmVyIEZsYXNjaGUuIFdhc3NlciBsYWV1ZnQgdWViZXIgQFdFTlFQUE5TMiBLaW5uLiIpOworICBTZXRQcm9wKFBfRUFURVJfTVNHLAorICAgICJEdSB0cmlua3N0IFdhc3NlciBhdXMgZGVyIEZsYXNjaGUuIEV0d2FzIGxhZXVmdCBEaXIgdWViZXIgZGFzIEtpbm4uIik7CisgIFNldFByb3AoUF9CQURfTVNHLAorICAgICJEYXMgV2Fzc2VyIGluIGRlciBGbGFzY2hlIHdpcmQgdHJ1ZWJlLiIpOworCisgIFNldFByb3AoUF9NQVRFUklBTCwoW01BVF9HTEFTUzoxNSwgTUFUX1dBVEVSOjg1XSkpOworCisgIFNldFByb3AoUF9FTVBUWV9QUk9QUywgKFsKKyAgICBQX1NIT1JUOiJFaW5lIGxlZXJlIEZsYXNjaGUiLAorICAgIFBfTkFNRToiRmxhc2NoZSIsCisgICAgUF9FTVBUWV9JRFM6KHsiZmxhc2NoZSJ9KSwKKyAgICBQX0VNUFRZX0FESjooeyJsZWVyZSIsImxlZXJlbiJ9KSwKKyAgICBQX01BVEVSSUFMOihbTUFUX0dMQVNTOjEwMF0pLAorICAgIFBfVkFMVUU6NSwgLy8gV2VydCBkZXIgRmxhc2NoZSBvaG5lIFdhc3NlcgorICAgIFBfV0VJR0hUOjIwICAvLyBHZXdpY2h0IGRlciBGbGFzY2hlIG9obmUgV2Fzc2VyCisgIF0pKTsKKworICBTZXRQcm9wKFBfUkVTRVRfTElGRVRJTUUsMyk7IC8vIDMgUmVzZXRzLCBlaGUgZGFzIFdhc3NlciB0cnVlYmUgd2lyZAorICBTZXRQcm9wKFBfRFJJTkssNTApOyAvLyBGdWVsbGdyYWQgcHJvIFNjaGx1Y2sKKyAgU2V0UHJvcChQX0RJU1RSSUJVVElPTiwxMCk7IC8vIFB1bmt0ZSBIZWlsdW5nIHBybyBIZWFydGJlYXQKKyAgU2V0UHJvcChQX0hQLDMwKTsgLy8gcHJvIFNjaGx1Y2sKKyAgU2V0UHJvcChQX1NQLDMwKTsgLy8gcHJvIFNjaGx1Y2sKKworICBBZGRJZCgoeyJmbGFzY2hlIiwid2Fzc2VyZmxhc2NoZSIsIndhc3NlciJ9KSk7CisgIEFkZEFkamVjdGl2ZSgoeyJ2b2xsZSIsInZvbGxlbiJ9KSk7CisKK30KKworLy8gcGFyZW50IG1ldGhvZGUgaW1tZXIgYXVmcnVmZW4gdW5kIHBydWVmZW4hIQordm9pZCBtYWtlX2JhZCgpIHsKKyAgaWYgKCE6Om1ha2VfYmFkKCkgJiYgaXNfbm90X2VtcHR5KCkpIHsKKyAgICAvLyBkaWUgVHJpbmttZWxkdW5nIGFlbmRlcm4gd2lyIG1hbAorICAgIFNldFByb3AoUF9FQVRFUl9NU0csIkR1IHRyaW5rc3QgdHJ1ZWJlcyBXYXNzZXIgYXVzIGRlciBGbGFzY2hlLiAiCisgICAgICAiRGFzIHdhciB3b2hsIG5pY2h0IHNvIGd1dC4gRGlyIHdpcmQgZ2FueiB1ZWJlbCEiKTsKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUva2Vrc2Uva2Vrcy5jIGIvZG9jL2JlaXNwaWVsZS9rZWtzZS9rZWtzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRhMmFiNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUva2Vrc2Uva2Vrcy5jCkBAIC0wLDAgKzEsMjggQEAKKy8qIEVpbmZhY2hlcyBCZWlzcGllbCB6dXIgRGVtb25zdHJhdGlvbiB2b24gVmVyZXJidW5nLgorICAgQUNIVFVORzogRGllc2VzIEJlaXNwaWVsIHN0ZWxsdCBfa2Vpbl8gc2lubnZvbGxlcyBMZWJlbnNtaXR0ZWxvYmpla3QgZGFyLgorICAgICAgICAgICAgSGllcmZ1ZXIgc29sbHRlIC9zdGQvZm9vZCB2ZXJ3ZW5kZXQgd2VyZGVuLCBzaWVoZSBhdWNoCisgICAgICAgICAgICAvZG9jL2JlaXNwaWVsZS9mb29kLworKi8KKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KK2luaGVyaXQgIi9zdGQvdGhpbmciOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSB7CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9OQU1FLCAiS2VrcyIpOworICBTZXRQcm9wKFBfR0VOREVSLCBNQUxFKTsKKyAgQWRkSWQoKHsia2VrcyJ9KSk7CisgIEFkZENtZCgiaXNzJkBJRCIsICJhY3Rpb25fZXNzZW4iLCAiV2FzIHdpbGxzdCBkdSBlc3Nlbj8iKTsKK30KKworcHVibGljIGludCBhY3Rpb25fZXNzZW4oc3RyaW5nIGNtZCkgeworICBpZih0aGlzX3BsYXllcigpLT5lYXRfZm9vZCgxLCAwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRHUgYmVrb21tc3QgIitRdWVyeVByb25vdW4oV0VOKSsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG5pY2h0IG1laHIgaGluZWluZ2VzdG9wZnQuXG4iKT4wKSB7CisgICAgd3JpdGUoIkR1IGlzc3QgIituYW1lKFdFTiwxKSsiLlxuIik7CisgICAgc2F5KHRoaXNfcGxheWVyKCktPk5hbWUoV0VSKSsiIGlzc3QgIituYW1lKFdFTikrIi5cbiIpOworICAgIHJlbW92ZSgxKTsKKyAgfQorICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUva2Vrc2Uva3J1ZW1lbGtla3MuYyBiL2RvYy9iZWlzcGllbGUva2Vrc2Uva3J1ZW1lbGtla3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmVlODVhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9rZWtzZS9rcnVlbWVsa2Vrcy5jCkBAIC0wLDAgKzEsMTUgQEAKKy8qIEVpbmZhY2hlcyBCZWlzcGllbCB6dXIgRGVtb25zdHJhdGlvbiB2b24gVmVyZXJidW5nLgorICAgQUNIVFVORzogRGllc2VzIEJlaXNwaWVsIHN0ZWxsdCBfa2Vpbl8gc2lubnZvbGxlcyBMZWJlbnNtaXR0ZWxvYmpla3QgZGFyLgorICAgICAgICAgICAgSGllcmZ1ZXIgc29sbHRlIC9zdGQvZm9vZCB2ZXJ3ZW5kZXQgd2VyZGVuLCBzaWVoZSBhdWNoCisgICAgICAgICAgICAvZG9jL2JlaXNwaWVsZS9mb29kLworKi8KKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KK2luaGVyaXQgX19ESVJfXyJrZWtzIjsKKwordmFyYXJncyBpbnQgcmVtb3ZlKGludCBzaWxlbnQpIHsKKyAgaWYoIXNpbGVudCAmJiBsaXZpbmcoZW52aXJvbm1lbnQoKSkpCisgICAgdGVsbF9vYmplY3QoZW52aXJvbm1lbnQoKSwgTmFtZShXRVIsMSkrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBrcnVlbWVsdCBlaW4gbGV0enRlcyBNYWwuXG4iKTsKKyAgcmV0dXJuIDo6cmVtb3ZlKHNpbGVudCk7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL21hc3Rlci9hY2Nlc3NfcmlnaHRzLmMgYi9kb2MvYmVpc3BpZWxlL21hc3Rlci9hY2Nlc3NfcmlnaHRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY3ZTkwOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvbWFzdGVyL2FjY2Vzc19yaWdodHMuYwpAQCAtMCwwICsxLDEzIEBACisvLyBXZW5uIGVpbiBWZXJ6ZWljaG5pcyBmdWVyIGVpbiBPYmpla3QgbmljaHQgc2NocmVpYmJhciBpc3QsIGthbm4gZGVyCisvLyBCZXNpdHplciBkZXMgVmVyemVpY2huaXNzZXMgZWluZSBEYXRlaSBhY2Nlc3NfcmlnaHRzIGFubGVnZW4sIGRpZQorLy8gZGllc2VzIFJlY2h0IHZlcmdpYnQuCisvLyBEYSBET0MgaGllciBlaWdlbnRsaWNoIG5pY2h0IHNjaHJlaWJlbiBkYXJmLCB3YXIgZGFzIGhpZXIgbm9ldGlnLgorLy8gRWluIE1hZ2llciB3aXJkIGRhcyBmdWVyIGRpZSBlaWdlbmVuIFZlcnouIGlkUiBuaWNodCBicmF1Y2hlbi4KKworaW50IGFjY2Vzc19yaWdodHMoIHN0cmluZyB1c2VyLCBzdHJpbmcgcGZhZCApIHsKKyAgaWYoIHVzZXI9PSJET0MiICYmIHBmYWQ9PSJvcGZlcnN0b2NrbG9nIiApIHsKKyAgCS8vIERPQyBkYXJmIG9wZmVyc3RvY2tsb2cgc2NocmVpYmVuCisJcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL21hc3Rlci9vcGZlcnN0b2NrLmMgYi9kb2MvYmVpc3BpZWxlL21hc3Rlci9vcGZlcnN0b2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ4YTQ2MQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvbWFzdGVyL29wZmVyc3RvY2suYwpAQCAtMCwwICsxLDE0MiBAQAorI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bW92aW5nLmg+CisvLworLy8gQnkgUnVtYXRhQE1vcmdlbkdyYXVlbiAzLzk5CisvLworLy8gQmVpc3BpZWxkYXRlaSBmdWVyIGRpZSBCZW51dHp1bmcgdm9uIE1hc3Rlcm4gdW5kIEtsaWVudGVuLgorLy8KKy8vIEljaCBnZWhlIGhpZXIgbmljaHQgYXVmIGRpZSAibm9ybWFsZW4iIEZ1bmt0aW9uZW4gZWluLgorCitpbmhlcml0ICIvc3RkL3RoaW5nIjsKKworI2RlZmluZSBPU19NQVNURVIgIi9kb2MvYmVpc3BpZWxlL21hc3Rlci9vcGZlcnN0b2NrbWFzdGVyIgorCit2b2lkIGNyZWF0ZSgpCit7CisJaWYoSVNfQkxVRShNRSkpIHJldHVybjsKKwk6OmNyZWF0ZSgpOworCVNldFByb3AoIFBfTkFNRSwgIk9wZmVyc3RvY2siICk7CisJU2V0UHJvcCggUF9HRU5ERVIsIE1BTEUgKTsKKwlTZXRQcm9wKCBQX1ZBTFVFLCAxMDAwICsgcmFuZG9tKDIwMDApICk7CisJQWRkSWQoICh7InN0b2NrIiwiaW5zY2hyaWZ0Iiwib3BmZXJzdG9jayJ9KSApOworCVNldFByb3AoIFBfU0hPUlQsICJJbiBlaW5lciBFY2tlIHN0ZWh0IGVpbiBPcGZlcnN0b2NrIiApOworCVNldFByb3AoIFBfTE9ORywKKwkJIkRlciBPcGZlcnN0b2NrIGJlc3RlaHQgYXVzIHNvbGlkZW0gSG9sei4gVm9ybmUgYXVmIGRlbSBLYXN0ZW4gaXN0IGVpbmVcbiIKKwkrCSJJbnNjaHJpZnQgenUgc2VoZW4sIGRpZSBEdSBsZXNlbiBrYW5uc3QuXG4iCisJKwkiQEBjb250ZW50c0BAIgorCSk7CisJU2V0UHJvcCggUF9SRUFEX01TRywKKwkJIj4+Pj4+Pj4+Pj4+PiBGdWVyIGRlbiBBdWZiYXUgZWluZXMgT3Jrd2Fpc2VuaGF1c2VzIDw8PDw8PDw8PDw8PFxuIgorCSsJIkluIGRlbiBsZXR6dGVuIEphaHJlbiB3dXJkZW4gaW1tZXIgd2llZGVyIHVuc2NodWxkaWdlIE9ya2tpbmRlclxuIgorCSsJImR1cmNoIGJydXRhbGUgQWJlbnRldXJlciBpaHJlciBFbHRlcm4gYmVyYXVidC4gQml0dGUgdW50ZXItXG4iCisJKwkic3R1ZXR6ZW4gU2llIG1pdCBlaW5lciBrbGVpbmVuIFNwZW5kZSBkZW4gQXVmYmF1IGVpbmVzIFdhaXNlbi1cbiIKKwkrCSJoYXVzZXMgZnVlciBkaWVzZSBiZW1pdGxlaWRlbnN3ZXJ0ZW4gS3JlYXR1cmVuLlxuIgorCSk7CisJQWRkRGV0YWlsKCAiaG9seiIsICJTb2xpZGUgdW5kIHNvIGd1dCB3aWUgdW56ZXJicmVjaGxpY2guXG4iICk7CisJU2V0UHJvcCggUF9OT0dFVCwKKwkJIkRlciBPcGZlcnN0b2NrIGlzdCBuaWNodCBvaG5lIEdydW5kIGFtIEJvZGVuIGZlc3RnZW5hZ2VsdC5cbiIgKTsKKwlBZGRDbWQoICJzcGVuZGUiLCJzcGVuZGUiICk7CisJQWRkQ21kKCAoeyJzdGVja2UiLCJzdGVjayJ9KSwgInN0ZWNrZW4iICk7CisJQWRkQ21kKCAib2VmZm5lIiwib2VmZm5lIiApOworCUFkZENtZCggKHsiYnJpY2giLCJicmVjaGUifSksImJyZWNoZSIgKTsKK30KKworY29udGVudHMoKQoreworCXN3aXRjaChRdWVyeVByb3AoUF9WQUxVRSkpCisJeworCWNhc2UgMDoKKwkJcmV0dXJuICJFciBpc3QgbGVlci5cbiI7CisJY2FzZSAxOgorCQlyZXR1cm4gIkVyIGVudGhhZWx0OlxuRWluZSBNdWVuemUuXG4iOworCWRlZmF1bHQ6CisJCXJldHVybiAiRXIgZW50aGFlbHQ6XG4iK1F1ZXJ5UHJvcChQX1ZBTFVFKSsiIE11ZW56ZW4uXG4iOworCX0KK30KKworc3RlY2tlbiggc3RyICkKK3sKKwlzdHJpbmcgd2FzLCB3b3JlaW47CisJaWYoICFzdHIgfHwgc3NjYW5mKHN0ciwiJXMgaW4gJXMiLHdhcyx3b3JlaW4pIT0yIHx8ICFpZCh3b3JlaW4pICkgcmV0dXJuIDA7CisJcmV0dXJuIHNwZW5kZSggc3RyICk7Cit9CisKK3NwZW5kZSggc3RyICkKK3sKKwlpbnQgYW56LCBuZXdBbDsKKwlzdHJpbmcgYXJnOworCQorCW5vdGlmeV9mYWlsKCAiV2lldmllbGUgTXVlbnplbiB3aWxsc3QgRHUgZGVubiBzcGVuZGVuP1xuIiApOworCWlmKCAhc3RyIHx8IHN0cj09IiIgKQorCQlyZXR1cm4gMDsKKwlpZiggc3NjYW5mKHN0ciwiJWQgJXMiLGFueixhcmcpPT0gMiApCisJCXN0ciA9IGFyZzsKKwllbHNlCisJeworCQlpZiggc3RyPT0iZWluZSBtdWVuemUiIHx8IHN0cj09ImVpbiBnb2xkc3R1ZWNrIiApCisJCXsKKwkJCWFueiA9IDE7CisJCQlzdHIgPSAibXVlbnplIjsKKwkJfQorCQllbHNlCisJCQlyZXR1cm4gMDsKKwl9CisJaWYoIGFuejw9MCB8fCAKKwkJbWVtYmVyKCh7Im11ZW56ZSIsImdvbGRzdHVlY2siLCJtdWVuemVuIiwiZ29sZHN0dWVja2UifSksIHN0cik9PS0xCisJKQorCQlyZXR1cm4gMDsKKwlpZiggYW56PlBMLT5RdWVyeU1vbmV5KCkgKQorCXsKKwkJd3JpdGUoICJTbyB2aWVsIEdlbGQgaGFzdCBEdSBuaWNodC5cbiIgKTsKKwkJcmV0dXJuIDE7CisJfQorCVBMLT5BZGRNb25leSgtYW56KTsKKwlTZXRQcm9wKFBfVkFMVUUsUXVlcnlQcm9wKFBfVkFMVUUpK2Fueik7CisKKwkvLyBIaWVyIHdpcmQgZGVyIE1hc3RlciBhdWZnZXJ1ZmVuLCBkZXIgZGFzIEFsaWdubWVudCBkZXIgU3BpZWxlcgorCS8vIGRhbm4gYWVuZGVydC4KKwlpZiggT1NfTUFTVEVSLT5hZGRBbGlnbm1lbnQoIFBMLCBhbnovMyApID4gMCApIHsKKwkJLy8gRWlnZW50bGljaCBr9m5udGUgbWFuIGhpZXIgYXVjaCBkaWUgTWVsZHVuZyBhdXNnZWJlbiwgYWJlcgorCQkvLyBkZXIgU3BpZWxlciBzb2xsIGRlbiBVbnRlcnNjaGllZCB6d2lzY2hlbiBBbGlnbm1lbnQgZ2VhZW5kZXJ0CisJCS8vIHVudCBBbGlnbm1lbnQgbmljaHQgZ2VhZW5kZXJ0IHNlaGVuIGtvZW5uZW4uCisJfQorCXdyaXRlKCAiRHUgaGFzdCB3YWhyaGFmdCBkYXMgR2VmdWVobCwgZXR3YXMgR3V0ZXMgZ2V0YW4genUgaGFiZW4uXG4iICk7CisKKwlzYXkoIGNhcGl0YWxpemUoUEwtPm5hbWUoV0VSKSkrIiBzcGVuZGV0ICIrYW56CisJCSsgKChhbno9PTEpPyIgTXVlbnplLlxuIjoiIE11ZW56ZW4uXG4iKSApOworCXJldHVybiAxOworfQorCitvZWZmbmUoIHN0ciApCit7CisJaW50IG5ld0FsOworCQorCW5vdGlmeV9mYWlsKCAiV0FTIHdpbGxzdCBEdSBvZWZmbmVuP1xuIiApOworCWlmKCAhaWQoc3RyKSApCisJCXJldHVybiAwOworCU9TX01BU1RFUi0+YWRkQWxpZ25tZW50KCBQTCwgLTMwICk7CisJd3JpdGUoICJBbGxlaW4gc2Nob24gZGVyIEdlZGFua2UuLi4uXG4iICk7CisJcmV0dXJuIDE7Cit9CisKK2JyZWNoZSggc3RyICkKK3sKKwlzdHJpbmcgYXJnOworCW5vdGlmeV9mYWlsKCAiV0FTIHdpbGxzdCBEdSBhdWZicmVjaGVuP1xuIiApOworCWlmKCAhc3RyICkKKwkJcmV0dXJuIDA7CisJaWYoIHNzY2FuZihzdHIsIiVzIGF1ZiIsYXJnKT09MSApCisJCXN0ciA9IGFyZzsKKwlpZiggIWlkKHN0cikgKQorCQlyZXR1cm4gMDsKKwl3cml0ZSggIkRlaW4gbGF1dGVzIEdldG9lc2UgcnVmdCBlaW5lbiBUZXVmZWwgaGVyYmVpLCBkZXIgRGljaCBnbGVpY2hcbiIKKwkrCSJtaXQgaW4gZGllIEhvZWxsZSBuaW1tdC5cbiIKKwkpOworCXNheSggY2FwaXRhbGl6ZShQTC0+bmFtZShXRVIpKSsiIHZlcnN1Y2h0LCBkZW4gT3BmZXJzdG9jayBhdWZ6dWJyZWNoZW4uXG4iCisJKyAiR2xlaWNoIGVyc2NoZWludCBlaW4gVGV1ZmVsLCB1bSAiK1BMLT5RdWVyeVByb25vdW4oV0VOKQorCSsJIiBpbiBkaWUgSG9lbGxlIHp1IHJlaXNzZW4uXG4iICk7CisJUEwtPm1vdmUoIi9kL3VudGVyd2VsdC9yYWV1bWUvcXVhbGVucmF1bSIsTV9HTywienVyIEhvZWxsZSIsImZhZWhydCIpOworCU9TX01BU1RFUi0+YWRkQWxpZ25tZW50KCBQTCwgLTIwMCApOworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9tYXN0ZXIvb3BmZXJzdG9ja21hc3Rlci5jIGIvZG9jL2JlaXNwaWVsZS9tYXN0ZXIvb3BmZXJzdG9ja21hc3Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYTA4MWYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL21hc3Rlci9vcGZlcnN0b2NrbWFzdGVyLmMKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiBCZWlzcGllbGRhdGVpIGZ1ZXIgZWluZW4gZWluZmFjaGVuIE1hc3RlciwgZGVyIFNwaWVsZXJkYXRlbiBhdWNoCisgKiB1ZWJlciByZWJvb3RzLCByZXNldHMgdW5kIHVwZGF0ZXMgaGlud2VnIHNwZWljaGVydCwgdW5kIGdsZWljaHplaXRnCisgKiBkYWZ1ZXIgc29yZ3QsIGRhc3MgZGllIERhdGVubWVuZ2VuIG5pY2h0IGltbWVyIGdyb2Vzc2VyIHdlcmRlbi4KKyAqCisgKiBCeTogUnVtYXRhQE1vcmdlbkdyYXVlbiAzLzk5CisgKgorICovCisKKy8vIFZvbiBkaWVzZW0gT2JqZWt0IGdpYnQgZXMga2VpbmUgQ2xvbmVzLCBzb25kZXJuIG51ciBkaWUgQmx1ZXByaW50LgorLy8gRGFzIEtvbnN0cnVrdCBpZiggY2xvbmVwKE1FKSApIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOyBpc3QgZGFkdXJjaAorLy8gb2Jzb2xldC4KKyNwcmFnbWEgbm9fY2xvbmUKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisKKy8vIE9ydCwgYW4gZGVtIGRpZSBEYXRlbiBnZXNwZWljaGVydCB3ZXJkZW4ga29lbm5lbi4gRGllIEVuZHVuZyAubworLy8gd2lyZCB2b20gU3lzdGVtIGFuZ2VoYWVuZ3QuCisjZGVmaW5lIFNBVkVGSUxFICIvZG9jL2JlaXNwaWVsZS9tYXN0ZXIvb3BmZXJzdG9ja2xvZyIKKworLy8gRGllc2VzIGlzdCBkZXIgS2xpZW50LCBkZXIgZGllc2VuIE1hc3RlciBiZW51dHp0LiBEaWVzZXIgV2VydCB3aXJkCisvLyBpbiBkaWVzZW0gUHJvZ3JhbW0gendhciBuaWNodCBiZW51dHp0LCBzdGVodCBoaWVyIGFiZXIsIGRhbWl0IG1hbgorLy8gd2Vpc3MsIHdvZnVlciBkaWVzZXIgTWFzdGVyIGd1dCBpc3QuCisjZGVmaW5lIENMSUVOVCAiL2RvYy9iZWlzcGllbGUvbWFzdGVyL29wZmVyc3RvY2siCisKKy8vIEVzIGJyYXVjaHQga2VpbiBPYmpla3QgaW5oZXJpdGV0IHdlcmRlbiwgZGEgd2lyIGtlaW5lcmxlaSBTcGllbC0KKy8vIEZ1bmt0aW9uaXRhZXQgYnJhdWNoZW4uIERlciBNYXN0ZXIga2FubiBuaWNodCBnZW5vbW1lbiwgYmV3ZWd0IG9kZXIKKy8vIHNvbnN0d2llIGlubmhlcmxhYiBkZXMgTXVkcyBiZW51dHp0IHdlcmRlbi4gSW5zYmVzb25kZXJlIHNvbGxlbgorLy8gaW0gc2F2ZWZpbGUgenVtIE1hc3RlciBrZWluZSBQcm9wZXJ0aWVzIG9kZXIgc28gYXVmdGF1Y2hlbi4KKy8vIGluaGVydCAiL3N0ZC90aGluZyI7CisKKy8vIFVtIGRpZXNlIERhdGVuIGdlaHQgZXMuCisvLyBEYXMgTWFwcGluZyBzcGVpY2hlcnQgenUgamVkZW0gU3BpZWxlciwgd2FubiBkYXMgbGV0enRlIE1hbCBkdXJjaCBlaW5lbgorLy8gZGVyIEtsaWVudGVuIGRhcyBBbGlnbm1lbnQgZ2VhZW5kZXJ0IHd1cmRlLiBBbHRlIERhdGVuIHdlcmRlbiBiZWkKKy8vIEdlbGVnZW5oZWl0IGdlbG9lc2NodC4KK21hcHBpbmcgZGF0YTsKKwordm9pZCBwdXJnZSgpOworCit2b2lkIGNyZWF0ZSgpIHsKKworICAvLyBEYW1pdCBTY2hyZWlienVncmlmZiBhdWYgU2F2ZWZpbGUgbW9lZ2xpY2guCisgIHNldGV1aWQoZ2V0dWlkKCkpOworCisgIGlmKCByZXN0b3JlX29iamVjdCggU0FWRUZJTEUgKSApIHsKKyAgICBwdXJnZSgpOworICB9IGVsc2UgeworICAgIGRhdGEgPSAoW10pOworICAgIHNhdmVfb2JqZWN0KCBTQVZFRklMRSApOyAvLyBEYW1pdCBTYXZlZmlsZSB1bmQgRGF0ZW4gaW1tZXIgc3luY2hyb24gc2luZC4KKyAgfQorfQorCisvLyBEaWVzZSBGdW5rdGlvbiB0ZXN0ZXQgZWluZW4gZWluemVsbmVuIEVpbnRyYWcsIG9iIGVyIHZlcmFsdGV0IGlzdC4KKy8vIChpc3QgbmljaHQgSmFociAyMDM4LWZlc3QgOi0pCitpbnQgbm90RXhwaXJlZCggc3RyaW5nIG5hbWUsIGludCBkYXRlICkgeworICByZXR1cm4gdGltZSgpIC0gZGF0ZSA8IDg2NDAwOworfQorCisvLyBEYXMgTWFwcGluZyB1bnRlcnN1Y2hlbiwgb2IgRWludHJhZWdlIHZvcmhhbmRlbiBzaW5kLCBkaWUgbmljaHQKKy8vIG1laHIgYmVub2V0aWd0IHdlcmRlbi4KKy8vIChJbiBkaWVzZW0gRmFsbCBzaW5kIGRhcyBFaW50cmFlZ2UsIGRpZSBhZWx0ZXIgYWxzIGVpbmVuIFRhZyBzaW5kLikKKy8vIEVzIHJlaWNodCB1bnMsIGRpZXNlIEZ1bmt0aW9uIGVpbm1hbCBwcm8gcmVib290IGF1c3p1ZnVlaHJlbi4gQmVpCisvLyBhbmRlcmVuIEFud2VuZHVuZ2VuIGtvZW5udGUgZGFzIG5hdHVlcmxpY2ggaGFldWZpZ2VyIG5vZXRpZyBzZWluLgordm9pZCBwdXJnZSgpIHsKKyAgZGF0YSA9IGZpbHRlcl9pbmRpY2VzKCBkYXRhLCAjJ25vdEV4cGlyZWQgKTsKKyAgc2F2ZV9vYmplY3QoIFNBVkVGSUxFICk7Cit9CisKKy8vIERpZXNlIEZ1bmt0aW9uIGlzdCBkaWUgZWluZ2V0bGljaGUgRnVua3Rpb24sIGRpZSAiZ2VtYXN0ZXJ0IiB3ZXJkZW4KKy8vIHNvbGwsIGFsc28gZvxyIG1laHJlcmUgT3BmZXJzdG9lY2tlIGdlbWVpbnNhbSBiZW51dHp0IHdpcmQuCisvLyBEZXIgT3BmZXJzdG9jayB1ZWJlcmdpYnQgZGFzIFNwaWVsZXJvYmpla3QgdW5kIGRpZSBnZXd1ZW5zY2h0ZQorLy8gQWxpZ25tZW50YWVuZGVydW5nLCBhbHMgRXJnZWJuaXMgd2lyZCAxIGdlbGllZmVydCwgd2VubiBlaW5lIEFlbmRlcnVuZworLy8gdm9yZ2Vub21tZW4gd3VyZGUgKDAgc29uc3QpIHVuZCBkYXMgQWxpZ25tZW50IGRlcyBTcGllbGVycyBlbnRzcHJlY2hlbmQKKy8vIGdlc2V0enQuCitpbnQgYWRkQWxpZ25tZW50KCBvYmplY3QgcGxheWVyLCBpbnQgYWxpZ24gKSB7CisgIGludCBuZXdBbGlnbjsKKyAgc3RyaW5nIG5hbWU7CisKKyAgLyoKKyAgLy8gRmFsbHMgbWFuIHZlcmhpbmRlcm4gd2lsbCwgZGFzcyBudXIgZGVyIEtsaWVudCBhdWYgZGllIERhdGVuIHp1Z3JlaWZ0LAorICAvLyBrYW5uIG1hbiBoaWVyIG5vY2ggQWJmcmFnZW4gZWluYmF1ZW4sIHR5cGlzY2hlcndlaXNlIHNpZWh0IGRhcyBkYW5uIHNvCisgIC8vIGF1czoKKyAgaWYoIG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKVswLi54eHhdICE9IENMSUVOVCApIHJldHVybiAtMTsKKyAgLy8gb2RlcgorICBpZiggZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSkgIT0gZ2V0ZXVpZCgpICkgcmV0dXJuIC0xOworICAvLyBldGMuIGV0Yy4KKyAgKi8KKworICBuYW1lID0gZ2V0ZXVpZChwbGF5ZXIpOworCisgIC8vIE51ciBlaW5lIEFlbmRlcnVuZyBwcm8gVGFnLgorICAvLyBXaXIgYmVudXR6ZW4gaGllciwgZGFzcyBkYXRhW25hbWVdID09IDAgaXN0LCBmYWxscyBkYXRhIGRlbiBOYW1lbiBuaWNodAorICAvLyBlbnRoYWVsdCEKKyAgaWYoIG5vdEV4cGlyZWQoIG5hbWUsIGRhdGFbbmFtZV0gKSApIHJldHVybiAwOworCisgIC8vIERhdGVuIHNldHplbiB1bmQgc3BlaWNoZXJuLgorICBkYXRhW25hbWVdID0gdGltZSgpOworICBzYXZlX29iamVjdCggU0FWRUZJTEUgKTsKKworICAvLyBNYXhpbWFsZSBBZW5kZXJ1bmc6IDIwMAorICBpZiggYWxpZ24gPCAtMjAwICkgYWxpZ24gPSAtMjAwOworICBpZiggYWxpZ24gPiAyMDAgKSBhbGlnbiA9IDIwMDsKKworICBuZXdBbGlnbiA9IHBsYXllci0+UXVlcnlQcm9wKCBQX0FMSUdOICkgKyBhbGlnbjsKKworICAvLyBLYXBwdW5nIGJlaSArLTEwMDAKKyAgaWYoIG5ld0FsaWduIDwgLTEwMDAgKSBuZXdBbGlnbiA9IC0xMDAwOworICBpZiggbmV3QWxpZ24gPiAxMDAwICkgbmV3QWxpZ24gPSAxMDAwOworIAorICBwbGF5ZXItPlNldFByb3AoIFBfQUxJR04sIG5ld0FsaWduICk7CisgIHJldHVybiAxOworfQorCisvLyBTY2hsdXNzYmVtZXJrdW5nOgorLy8KKy8vIEdld2l0enRlIFByb2dyYW1taWVyZXIga29lbm50ZW4gZGVuIEtsaWVudCB1bmQgZGVuIE1hc3RlciBpbiBlaW5lcgorLy8gRGF0ZWkgenVzYW1tZW4gYWJsZWdlbi4gRGllIEJsdWVwcmludCB3aXJkIGFscyBNYXN0ZXIsIGRpZSBDbG9uZXMgd2VyZGVuCisvLyBhbHMgS2xpZW50ZW4gYmVudXR6dC4gSWNoIGhhYmUgZGFzIGhpZXIgYmV3dXNzdCBhbmRlcnMgZ2VtYWNodCB1bmQgZW1wZmVobGUKKy8vIGRhcyBhdWNoIGFscyBWb3JiaWxkLCB3ZWlsIHNvIGRlciBDb2RlIHdlc2VudGxpY2ggYmVzc2VyIHp1IHZlcnN0ZWhlbiBpc3QuCmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL21pc2MvYnNwbW9uMS5jIGIvZG9jL2JlaXNwaWVsZS9taXNjL2JzcG1vbjEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmE4NWZjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9taXNjL2JzcG1vbjEuYwpAQCAtMCwwICsxLDc4IEBACisvKgorKiogRWluIGdhbnogbm9ybWFsZXMgU3RhbmRhcmQtbW9uc3RlciBvaG5lIEJlc29uZGVyaGVpdGVuCisqKiAodm9uIEJvaW5nKQorKi8KKworLy8gRGllc2UgUHJhZ21hcyBzb3JnZW4gZGFmdWVyLCBkYXNzIGRlciBEcml2ZXIgZGFyYXVmIGFjaHRldCwgZGFzcyBiZWkKKy8vIEZ1bmt0aW9uc2FyZ3VtZW50ZW4sIC1SdWVja2dhYmV3ZXJ0ZW4gdW5kIHRlaWx3ZWlzZSBiZWkgWnV3ZWlzdW5nIHZvbgorLy8gV2VydGVuIGFuIFZhcmlhYmxlbiBkZXIgcmljaHRpZ2UgRGF0ZW50eXAgdmVyd2VuZGV0IHdpcmQgKHouYi4ga2VpbiBzdHJpbmcKKy8vIGFuc3RlbGxlIGVpbmVzIGludCB2ZXJ3ZW5kZXQgd2lyZCkuIFNvbGx0ZSBpbiBrZWluZW0gT2JqZWt0IGZlaGxlbi4KKyNwcmFnbWEgc3Ryb25nX3R5cGVzLCBzYXZlX3R5cGVzLCBydHRfY2hlY2tzCisKKy8vIGRlbiBTdGFuZGFyZC1OUEMgZGVyIE11ZGxpYiBlcmJlbi4KK2luaGVyaXQgIi9zdGQvbnBjIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICA6OmNyZWF0ZSgpOyAgICAvKiBOaWNodCB2ZXJnZXNzZW4sIG9obmUgZGFzIGdlaHQgbmljaHRzICovCisKKy8qIERpZSBLdXJ6YmVzY2hyZWlidW5nIHdpcmQgenVtIEJlaXNwaWVsIGFuZ2V6ZWlndCB3ZW5uIG1hbiBpbiBlaW5lbiBSYXVtCisgICBtaXQgZGVtIE1vbnN0ZXIgcmVpbmxhZXVmdCAqLworICBTZXRQcm9wKFBfU0hPUlQsICJCZWlzcGllbG1vbnN0ZXIiKTsKKworLyogQmVpbSBBbnNjaGF1ZW4gZGVzIE1vbnN0ZXJzIHdpcmQgZGllIGxvbmctZGVzY3JpcHRpb24gYW5nZXplaWd0ICovCisgIFNldFByb3AoUF9MT05HLCAiRWluIEJlaXNwaWVsbW9uc3RlciBvaG5lIEJlc29uZGVyaGVpdGVuLlxuIik7CisKKy8qIEVpbiBOYW1lIG11c3Mgc2VpbiwgZGEgc29uc3Qgei5CLiBpbSBUb2Rlc2ZhbGwgJ0xlaWNoZSB2b24gMCcgZGFsaWVndCAqLworICBTZXRQcm9wKFBfTkFNRSwgIk1vbnN0ZXIiKTsKKworLyogRGFzIEdlc2NobGVjaHQgZGVzIE1vbnN0ZXJzLiBBbHMgR2VzY2hsZWNodGVyIHNpbmQgKi8KKy8qIGRpZSBpbiA8bGFuZ3VhZ2UuaD4gZGVmaW5pZXJ0ZW4gU3ltYm9sZSBORVVURVIsIE1BTEUgICAqLworLyogdW5kIEZFTUFMRSB6dWxhZXNzaWcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFNldFByb3AoUF9HRU5ERVIsIE5FVVRFUik7CisKKy8qIEVpbiBNb25zdGVyIGJyYXVjaHQgbWluZGVzdGVucyBlaW5lIElELCB1bnRlciBkZXIgbWFuIGVzIGFuc3ByZWNoZW4ga2FubiAqLworLyogRXMga2FubiBhYmVyIGF1Y2ggbWVocmVyZSB2ZXJzY2hpZWRlbmUgSUQncyBoYWJlbi4gICAgICAgICAgICAgICAgICAgICAgICovCisgIEFkZElkKCJtb25zdGVyIik7CisgIEFkZElkKCJiZWlzcGllbG1vbnN0ZXIiKTsKKworLyogWnVlcnN0IHNvbGx0ZSBtYW4gZGVtIE1vbnN0ZXIgZWluZW4gR3J1bmRsZXZlbCBnZWJlbi4gKi8KKy8qIERpZSBTcGVsbHB1bmt0ZSB1bmQgZGllIExlYmVucHVua3RlIHNvd2llIGRpZSBBdHRyaWJ1dGUgd2VyZGVuIGRhbm4gKi8KKy8qIGF1dG9tYXRpc2NoIGFuZ2VwYXNzdC4gKi8KKyAgY3JlYXRlX2RlZmF1bHRfbnBjKCAxMCApOworCisvKiBOdW4gbWFjaGVuIHdpciBlcyBldHdhcyB3aWRlcnN0YW5kc2ZhZWhpZ2VyLCBpbmRlbSB3aXIgUF9CT0RZIHNldHplbi4gICovCisvKiBOaWUgUF9UT1RBTF9BQyBvZGVyIFBfQUMgc2V0emVuLCBQX1RPVEFMX0FDIHdpcmQgYXV0b21hdGlzY2ggYmVyZWNobmV0ICovCisvKiB1bmQgUF9BQyBpc3QgbnVyIGZ1ZXIgUnVlc3R1bmdlbiBkYS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFNldFByb3AoUF9CT0RZLCA1NSk7CisKKy8qIERhcyBNb25zdGVyIHNjaGxhZWd0IG1pdCBibG9zc2VuIEhhZW5kZW4genUsIGFsc28gd2lyZCBQX0hBTkRTIGdlc2V0enQuICAgKi8KKy8qIEF1Y2ggaGllciB3ZWRlciBQX1RPVEFMX1dDIG5vY2ggUF9XQyBzZXR6ZW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgU2V0UHJvcChQX0hBTkRTLCAoeyIgbWl0IHNlaW5lbiBIYWVuZGVuIiwgNTV9KSk7CisvKiAgICAgICAgICAgICAgICAgIF4gZGllc2VzIExlZXJ6ZWljaGVuIGlzdCB3aWNodGlnICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBCZWltIEthbXBmIGVyc2NoZWludCBudW46ICdEYXMgTW9uc3RlciBncmVpZnQgRGljaCBtaXQgc2VpbmVuIEhhZW5kZW4gYW4nICovCisvKiA1NSBlbnRzcHJpY2h0IGRlciBXYWZmZW5rbGFzc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIEdlc2lubnVuZyBkZXMgTW9uc3RlcnMsIDAgaXN0IG5ldXRyYWwsIG5lZ2F0aXYgYm9lc2UgdW5kIHBvc2l0aXYgZ3V0ICovCisgIFNldFByb3AoUF9BTElHTiwgMTAwKTsgIC8qIEVpbmlnZXJtYXNzZW4gbmV0dCwgYWJlciBuaWNodHMgYmVzb25kZXJlcyAqLworCisvKiBEaWUgUmFzc2UgZGVzIE1vbnN0ZXJzICovCisgIFNldFByb3AoUF9SQUNFLCAiSXJnZW5kbmVyYXNzZSIpOworCisvKiBFcmZhaHJ1bmdzcHVua3RlIGRlcyBNb25zdGVycywgYmVpbSBUb2QgZXJoYWVsdCBkZXIgJ0tpbGxlcicgZWluICAgKi8KKy8qIGh1bmRlcnRzdGVsIGRpZXNlcyBXZXJ0ZXMuIFNjaG9uIGltIEthbXBmIGVyaGFlbHQgbWFuIGJlaSBqZWRlbSAgICAqLworLyogU2NobGFnIHdlYXBvbl9jbGFzcypzY2hhZGVuLzEwIHB1bmt0ZSAod2VhcG9uX2NsYXNzIGhpZXIgNTUpLCBhbHNvICovCisvKiBpbnNnZXNhbXQgd2VhcG9uX2NsYXNzKmhpdF9wb2ludHMvMTAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgU2V0UHJvcChQX1hQLCAxMDAwMCk7CisKKy8qIERpZSBHcm9lc3NlIGRlcyBNb25zdGVycyBpbiBjbS4gRGllcyB3aXJkIGJlaSBlaW5pZ2VuIEthbXBmYmVmZWhsZW4gKi8KKy8qIGF1c2dld2VydGV0LCBzb3dpZSBiZWkgZWluaWdlbiBJZGVudGlmaWthdGlvbnNzcHJ1ZWNoZW4gdm9uIEdpbGRlbiAgKi8KKyAgU2V0UHJvcChQX1NJWkUsMTgwKTsKKworLyogV2VpdGVyZSBXZXJ0ZTogUF8oTUFYKV9GT09ELCBQXyhNQVgpX0RSSU5LLCBQXyhNQVgpX0FMQ09IT0wsICAgICAgICovCisvKiBQX01TR0lOLCBQX01TR09VVCwgUF9NTVNHSU4sIFBfTU1TR09VVCwgUF9NQVhfSEFORFMsIFBfVVNFRF9IQU5EUyAgKi8KKworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9taXNjL2JzcG1vbjIuYyBiL2RvYy9iZWlzcGllbGUvbWlzYy9ic3Btb24yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVmMzkwOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvbWlzYy9ic3Btb24yLmMKQEAgLTAsMCArMSwxOTkgQEAKKy8qCisqKiBFaW4gQmVpc3BpZWxtb25zdGVyIG1pdCBkaXYgRXh0cmFzICh2b24gQm9pbmcsIGFrdHVhbGlzaWVydCB2b24gV2ltK1plc3N0cmEpCisqLworCisvLyBEaWVzZSBQcmFnbWFzIHNvcmdlbiBkYWZ1ZXIsIGRhc3MgZGVyIERyaXZlciBkYXJhdWYgYWNodGV0LCBkYXNzIGJlaQorLy8gRnVua3Rpb25zYXJndW1lbnRlbiwgLVJ1ZWNrZ2FiZXdlcnRlbiB1bmQgdGVpbHdlaXNlIGJlaSBadXdlaXN1bmcgdm9uCisvLyBXZXJ0ZW4gYW4gVmFyaWFibGVuIGRlciByaWNodGlnZSBEYXRlbnR5cCB2ZXJ3ZW5kZXQgd2lyZCAoei5iLiBrZWluIHN0cmluZworLy8gYW5zdGVsbGUgZWluZXMgaW50IHZlcndlbmRldCB3aXJkKS4gU29sbHRlIGluIGtlaW5lbSBPYmpla3QgZmVobGVuLgorI3ByYWdtYSBzdHJvbmdfdHlwZXMsIHNhdmVfdHlwZXMsIHJ0dF9jaGVja3MKKworaW5oZXJpdCAiL3N0ZC9ucGMiOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8Y29tYmF0Lmg+ICAgIC8vIGZ1ZXIgZGllIGRhbWFnZSB0eXBlcworI2luY2x1ZGUgPG1vdmluZy5oPiAgICAvLyBmdWVyIFJFSkVDVF9LRUVQICAgCisjaW5jbHVkZSA8Y2xhc3MuaD4gICAgIC8vIGZ1ZXIgQWRkQ2xhc3MgCisjaW5jbHVkZSA8bmV3X3NraWxscy5oPiAvLyBmdWVyIFNQXyogYmVpIEFkZFNwZWxsCisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7ICAgICAgIC8qIFdJQ0hUSUchISEgKi8KKworLyogU3RhbmRhcmQtS25vZmlndXJhdGlvbiAoRXJsYWV1dGVydW5nZW4gc2llaGUgYnNwbW9uMS5jKTogKi8KKyAgU2V0UHJvcChQX1NIT1JULCAiRWluIFphdWJlcmVyIik7CisgIFNldFByb3AoUF9MT05HLCAiRGllc2VyIFphdWJlcmVyIHphdWJlcnQgd2llIHdpbGQgdW5kIHNjaHdpbmd0IGRhYmVpICIKKyAgICAic2VpbmVuIGxhbmdlbiBCYXJ0LlxuIik7CisgIFNldFByb3AoUF9OQU1FLCAiWmF1YmVyZXIiKTsKKyAgU2V0UHJvcChQX0dFTkRFUiwgTUFMRSk7CisgIEFkZElkKCJ6YXViZXJlciIpOworICBjcmVhdGVfZGVmYXVsdF9ucGMoMTgpOworICBTZXRQcm9wKFBfQUxJR04sIC03MDApOyAgIC8qIEJycnIsIGlzdCBkZXIgYm9lc2UgLi4uLiAqLworICBTZXRQcm9wKFBfQk9EWSwgMTI1KTsKKyAgU2V0UHJvcChQX0hBTkRTLCAoeyIgbWl0IHNlaW5lbSBsYW5nZW4gQmFydCIsIDE4NX0pICk7CisgIFNldFByb3AoUF9TSVpFLDE4MCk7CisgIFNldFByb3AoUF9NQVhfSEFORFMsIDIpOyAgLyogQW56YWhsIGRlciBIYWVuZGUgKGRlZmF1bHQgaXN0IDIpICovCisgIC8vIHNldF9saXZpbmdfbmFtZSgpIHNldHp0IGVpbmVuIE5hbWVuLCBtaXQgZGVyIGRlciBaYXViZXJlciB6LkIuIG1pdCBlaW5lbQorICAvLyAnZmluZGUnIGdlZnVuZGVuIHdlcmRlbiBrYW5uLiBGdWVyIGRpZSBtZWlzdGVuIE5QQyBpc3QgZGllcyBuaWNodCBub2V0aWcuCisgIC8vIFNwZXppZWxsIHNvbGx0ZSBtYW4ga2VpbmUgZ2VuZXJpc2NoZW4gQmV6ZWljaG51bmdlbiBoaWVyIGFubWVsZGVuLCB3ZW5uCisgIC8vIHNjaG9uLCBkYW5uIGluZGl2aWR1ZWxsZSBOYW1lbi4KKyAgLyogc2V0X2xpdmluZ19uYW1lKCJ6YXViZXJlciIpOyAqLworCisvKiBNaXQgQWRkQ2xhc3MoKSB1bmQgUF9SQUNFIHdpcmQgZmVzdGdlbGVndCwgaW4gd2VsY2hlIEdydXBwZSB2b24gTGViZS0gICovCisvKiB3ZXNlbiBkZXIgTlBDIGdlaG9lcnQsIHdlbGNoZSBtaXQgaXNfY2xhc3NfbWVtYmVyKG1peGVkIHN0cikgYWJnZWZyYWd0ICovCisvKiB3ZXJkZW4ga2Fubi4gSW0gTWluaW1hbGZhbGwgaXN0IGRlciBOUEMgdm9uIGRlciBLbGFzc2UsIGRpZSBiZWkgUF9SQUNFICovCisvKiBlaW5nZXRyYWdlbiBpc3QuIE1pdCBBZGRDbGFzcygpIGtvZW5uZW4gYWJlciBub2NoIHdlaXRlcmUgRWlnZW4tICAgICAgICovCisvKiBzY2hhZnRlbiBoaW56dWdlZnVlZ3Qgd2VyZGVuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgU2V0UHJvcChQX1JBQ0UsIlN1cGVyZHVwZXJ6YXViZXJlciIpOworICBBZGRDbGFzcyggKHsgQ0xfSFVNQU4sIENMX01BTU1BTCB9KSApOworCisvKiBNaXQgUF9SRVNJU1RBTkNFIHVuZCBQX1ZVTE5FUkFCSUxJVFkgd2VyZGVuIGZpeGUgV2VydGUgKDUwJSkgZnVlciAgICAgICovCisvKiBSZXNpc3RlbnplbiByZXNwZWt0aXZlIEFuZmFlbGxpZ2tlaXRlbiBnZXNldHp0ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBEaWUgTGlzdGUgZGVyIG1vZWdsaWNoZW4gU2NoYWRlbnNhcnRlbiBpc3QgaW4gL3N5cy9jb21iYXQuaCBkZWZpbmllcnQuICovICAKKy8qIHouQi4gIFNldFByb3AoUF9SRVNJU1RBTkNFLCAoeyBEVF9NQUdJQyB9KSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIFNldFByb3AoUF9WVUxORVJBQklMSVRZLCAoeyBEVF9DT0xEIH0pKSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE1pdCBQX1JFU0lTVEFOQ0VfU1RSRU5HVEhTIGtvZW5uZW4gUmVzaXN0ZW56ZW4gdW5kIEFuZmFlbGxpZ2tlaXQgICAgICAgKi8KKy8qIGtvbmZpZ3VyaWVydCB3ZXJkZW4uIERpZXNlIFByb3BlcnR5IGVudGhhZWx0IGVpbiBNYXBwaW5nIHZvbiAgICAgICAgICAgKi8KKy8qIHZvbiBTY2hhZGVuc2FydGVuIGVudGhhZWx0LiBOZWdhdGl2ZSBGYWt0b3JlbiBiaXMgbWF4aW1hbCAtMS4wICAgICAgICAgKi8gCisvKiAoPUltbXVuaXRhZXQpIGdlYmVuIFJlc2lzdGVuemVuLCBwb3NpdGl2ZSBXZXJ0ZSBBbmZhZWxsaWdrZWl0ZW4gYW4uICAgICovCisKKyAgU2V0UHJvcChQX1JFU0lTVEFOQ0VfU1RSRU5HVEhTLCAoWyBEVF9NQUdJQzogLTAuNSwgRFRfQ09MRDogMi4wXSkgKTsJCQkJCSAgICAgIAorCisvKiBEdXJjaCBkaWVzZW4gQmVmZWhsIHdpcmQgZWluZSBXYWZmZSBnZWNsb250LCBzb2Zlcm4gc2llIG5pY2h0IGltIFJhdW0gICovCisvKiBoZXJ1bWxpZWd0IChpbiBkZW0gRmFsbCB3aXJkIHNpZSB2b20gTlBDIGF1ZmdlaG9iZW4pLCB1bmQgZ2V6dWVja3QgICAgICovIAorLyogKGRlZmluaWVydCBpbiAvc3RkL25wYy9pdGVtcy5jIHJlc3AuIC9zeXMvbnBjLmgpICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIEFkZEl0ZW0oIi9kb2MvYmVpc3BpZWxlL21pc2MvYnNwd2FmZmUxIiwgQ0xPTkVfV0lFTEQpOworLyogVW5kIG5vY2ggZWluZSBSdWVzdHVuZyBjbG9uZW4gdW5kIGFuemllaGVuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgCisgIEFkZEl0ZW0oIi9kb2MvYmVpc3BpZWxlL21pc2MvYnNwcnVlc3QxIiwgQ0xPTkVfV0VBUik7CisKKy8qIEpldHp0IHdpcmQgZ2V6YXViZXJ0IC4uLi4gICAgICovCisKKy8qIFNldFByb3AoUF9TUEVMTFJBVEUsKSBsZWd0IGRpZSBXYWhyc2NoZWlubGljaGtlaXQgZmVzdCwgbWl0IGRlciBlaW4gICAqLworLyogWmF1YmVyc3BydWNoIGR1cmNoZ2VmdWVocnQgd2lyZCwgaGllciA0MCUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgU2V0UHJvcChQX1NQRUxMUkFURSw0MCk7CisKKy8qIE1pdCBBZGRTcGVsbCgpIHdpcmQgZWluIFphdWJlcnNwcnVjaCBoaW56dWdlZnVlZ3QuIERhcyBlcnN0ZSBBcmd1bWVudCAgKi8KKy8qIGlzdCBzbyBldHdhcyB3aWUgZGllIHJlbGF0aXZlIFdhaHJzY2hlaW5saWNoa2VpdCBkZXMgU3BydWNocyBpbSAgICAgICAgKi8KKy8qIFZlcmdsZWljaCB6dSBkZW4gYW5kZXJlbiwgaGllciBiZWltIGVyc3RlbiBzcHJ1Y2ggMSBiZWltIHp3ZWl0ZW4gMiwgICAgKi8KKy8qIGRhcyBoZWlzc3QgaW4gMjAlIGRlciBGYWVsbGUgd2lyZCBkZXIgZXJzdGUgWmF1YmVyc3BydWNoIGdlbm9tbWVuIHVuZCAgKi8KKy8qIGluIDQwJSBkZXIgendlaXRlIHVuZCBpbiA2MCUgZGVyIGRyaXR0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERhcyB6d2VpdGUgQXJndW1lbnQgaXN0IGRlciBtYXhpbWFsZSBTY2hhZGVuLCBlbnRzcHJlY2hlbmQgZGVyIFdDICAgICAgKi8KKy8qIGVpbmVyIFdhZmZlIG9kZXIgUF9IQU5EUyBiZWltIHdhZmZlbmxvc2VuIEthbXBmLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERpZSB6d2VpIHdlaXRlcmVuIEFyZ3VtZW50ZSBzaW5kIGRpZSBNZWxkdW5nZW4gZGllIGRlciBhbmdlZ3JpZmZlbmUgICAgKi8KKy8qIFNwaWVsZXIgc2VsYnN0IHVuZCBldmVudHVlbGxlIFp1c2NoYXVlciBlcmhhbHRlbi4gSGllcmJlaSBzdGVoZW4gQFdFUiwgKi8KKy8qIEBXRU4sIEBXRU0gdW5kIEBXRVNTRU4gZnVlciBkZW4gTmFtZW4gZGVzIE9wZmVycyBpbSBlbnRzcHJlY2hlbmRlbiAgICAgKi8KKy8qIEZhbGwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERhcyA1LiBBcmd1bWVudCBpc3Qgb3B0aW9uYWwgdW5kIGdpYnQgZGVuIFNjaGFkZW5zdHlwIGFuLCBmZWhsdCBlciAgICAgKi8KKy8qIHdpcmQgRFRfTUFHSUMgYW5nZW5vbW1lbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gIAorLyogSW0gNi4gQXJ1Z3VtZW50IGthbm4gZWluZSBGdW5rdGlvbiBzdGVoZW4sIGRpZSBiZWkgZGVtIFNwcnVjaCBhdXNnZS0gICAqLworLyogZnVlaHJ0IHdlcmRlbiBzb2xsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRGFzIHNpZWJ0ZSB1ZWJlcmdpYnQgZGllIFNwZWxsIFBhcmFtZXRlciwgaGllciBpc3Qgd2ljaHRpZywgZGFzcyBiZWkgICAqLworLyogcGh5c2lrYWxpc2NoZW4gU2NoYWVkZW4gYXVjaCBTUF9QSFlTSUNBTF9BVFRBQ0sgZ2VzZXR6dCB3aXJkLCBkYSBzb25zdCAqLworLyogZWluaWdlIEdpbGRlbiBkZW4gIlphdWJlcnNwcnVjaCIgYWJ3ZWhyZW4ga29lbm5lbiAoc2llaGUgU3BlbGxEZWZlbmQpICAqLworCisgIEFkZFNwZWxsKDIwLDYwLCAKKwkgICAiICBEZXIgWmF1YmVyZXIgd2lyZnQgZWluZW4gRmV1ZXJiYWxsIG5hY2ggRGlyLlxuIiwKKwkgICAiICBEZXIgWmF1YmVyZXIgd2lyZnQgZWluZW4gRmV1ZXJiYWxsIG5hY2ggQFdFTS5cbiIsCisJICAgKHsgRFRfRklSRSB9KSApOworICBBZGRTcGVsbCg0MCw5NSwKKwkgICAiICBEZXIgWmF1YmVyZXIgYmVzY2h3b2VydCBlaW5lbiBTdHVybSB1ZWJlciBkZWluZW0gS29wZiBoZXJ2b3IuXG4iLAorCSAgICIgIERlciBaYXViZXJlciBiZXNjaHdvZXJ0IGVpbmVuIFN0dXJtIHVlYmVyIEBXRVNTRU4gS29wZiBoZXJ2b3IuXG4iLAorCSAgICh7IERUX0FJUiwgRFRfTElHSFROSU5HIH0pICk7ICAKKyAgQWRkU3BlbGwoNjAsNTAsCisgICAgICAgICAgICIgIERlciBaYXViZXJlciB0cml0dCBEaWNoIGhpbnRlcmxpc3RpZy5cbiIsCisJICAgIiAgRGVyIFphdWJlcmVyIHRyaXR0IG5hY2ggQFdFTS5cbiIsCisJICAgKHsgRFRfQkxVREdFT04gfSksIDAsCisJICAgKFtTUF9TSE9XX0RBTUFHRToxLCBTUF9QSFlTSUNBTF9BVFRBQ0s6MV0pICk7ICAJICAgCisKKworLyogUmVkZW4ga2FubiBkZXIgWmF1YmVyZXIgYXVjaCB2b24gYWxsZWluZSwgaGllciBrb21tZW4gZGllIGNoYXRzOiAgICAgKi8KKworLyogRGFzIGVyc3RlIEFyZ3VtZW50IGlzdCBkaWUgV2FocnNjaGVpbmxpY2hrZWl0LCBtaXQgZGVyIGRhcyBNb25zdGVyCisgKiBlaW5lbiBTcHJ1Y2ggYnJpbmd0ICh3ZW5pZ2VyIGlzdCBtZWhyISkuIERhcyB6d2VpdGUgQXJndW1lbnQgaXN0IGRpZSBMaXN0ZQorICogZGVyIFNwcnVlY2hlIChvZGVyIEFrdGlvbmVuKS4KKyAqLworCisgIFNldENoYXRzKDIsICh7CisgICJEZXIgWmF1YmVyZXIgbGFldWZ0IGltIEtyZWlzIGhlcnVtLlxuIiwKKyAgIkRlciBaYXViZXJlciBzdG9scGVydCB1ZWJlciBzZWluZW4gQmFydC5cbiIsCisgICJEZXIgWmF1YmVyZXIgc2FndDogSGVoIER1ISBXYXMgbWFjaHN0IER1IGRhP1xuIiwKKyAgIkRlciBaYXViZXJlciBtdXJtZWx0IGVpbiBwYWFyIHNlbHRzYW1lIFdvcnRlIGluIHNlaW5lbiBCYXJ0LlxuIiwKKyAgIkRlciBaYXViZXJlciBicmljaHQgaW4gdW5rb250cm9sbGllcnRlcyBHZWxhZWNodGVyIGF1cy5cbiIsCisgICJEZXIgWmF1YmVyZXIgc2FndDogSGFzdCBtaXIgbWFsIG5lIE1hcmssIGV5P1xuIiwKKyAgIkRlciBaYXViZXJlciBzYWd0OiBXZW5uIGljaCBkaWVzZW4gT2xwcCBlcndpc2NoZSAuLi5cbiIsCisgICJEZXIgWmF1YmVyZXIgemF1YmVydCBlaW4gS2FuaW5jaGVuIGF1cyBzZWluZW0gSHV0LlxuIgorICB9KSApOworCisvKiBEYXMgc2VsYmUgZnVlciBTcHJ1ZWNoZSBkaWUgd2FlaHJlbmQgZWluZXMgS2FtcGZlcyBrb21tZW4gc29sbGVuICAgICovCisKKyAgU2V0QXR0YWNrQ2hhdHMoMjAsICh7CisgICJEZXIgWmF1YmVyZXIgbWFjaHQ6IEJ1aCFcbiIsCisgICJEZXIgWmF1YmVyZXIgd2lyZnQgbWl0IHdlaXNzZW4gTWFldXNlbiBuYWNoIERpci5cbiIsCisgICJEZXIgWmF1YmVyZXIgc2FndDogRGFzIHdhciBlaW4gZ3Jvc3NlciBGZWhsZXIhXG4iLAorICAiRGVyIFphdWJlcmVyIGJlaXNzdCBEaWNoIGluIGRlbiBBcm0uXG4iLAorICAiRGVyIFphdWJlcmVyIHphdWJlcnQgZ3J1ZW5lIFB1bmt0ZSBhdWYgZGVpbmUgV2FuZ2UuXG4iLAorICAiRGVyIFphdWJlcmVyIHZlcndhbmRlbHQgc2ljaCBpbiBlaW5lIEtyb2V0ZS5cbiIsCisgICJEZXIgWmF1YmVyZXIgdmVyc2Nod2luZGV0IHVuZCB0YXVjaHQgaGludGVyIERpciB3aWVkZXIgYXVmLlxuIgorICB9KSApOworCisvKiBXZW5uIGVyIHN0aXJidCBzb2xsIGVpbmUgYmVzb25kZXJlIE1lbGR1bmcgZXJzY2hlaW5lbi4gKi8KKyAgU2V0UHJvcCggUF9ESUVfTVNHLCAiIGxvZXN0IHNpY2ggaW4gTHVmdCBhdWYuXG4iICk7CisvKiBEYW5uIHNvbGwgbmF0dWVybGljaCBhdWNoIGtlaW4gTGVpY2huYW0gcnVtbGllZ2VuICovCisgIFNldFByb3AoIFBfTk9DT1JQU0UsIDEgKTsKKyAKKy8qIE51biB3b2xsZW4gd2lyIGRlbiBaYXViZXJlciBub2NoIGF1ZiBlaW4gcGFhciBGcmFnZW4gYW50d29ydGVuIGxhc3NlbiAgICAqLworLyogQWRkSW5mbyhERUZBVUxUX0lORk8sKSBzZXR6dCBkaWUgQW50d29ydCBhdWYgYWxsZSBGcmFnZW4sIHdvIGRlciAgICAgICAgICovCisvKiBTY2hsdWVzc2VsIG5pY2h0IGJla2FubnQgaXN0LiBEZXIgTmFtZSBkZXMgWmF1YmVyZXJzIHdpcmQgaW1tZXIgdm9yIGRlbiAgKi8KKy8qIFN0cmluZyBnZXNldHp0LiAoU2V0UHJvcChQX0RFRkFVTFRfSU5GTywgaXN0IG9ic29sZXQgdW5kIHNvbGx0ZSBuaWNodCAgICAqLworLyogbWVociBhbmdld2VuZGV0IHdlcmRlbi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIAorCisgIEFkZEluZm8oREVGQVVMVF9JTkZPLCJzYWd0OiBLZWluZSBBaG51bmcsIHZvbiB3YXMgRHUgcmVkZXN0LlxuIiwwLAorICAgICAgICAgICAgICAgICAgICAgICAic2FndCB6dSBAV0VNOiBLZWluZSBBaG51bmcsIHZvbiB3YXMgRHUgcmVkZXN0LlxuIik7CisKKy8qIERpZSBiZWthbm50ZW4gU2NobHVlc3NlbCB3ZXJkZW4gbWl0IEFkZEluZm8gZGF6dWdlZnVlZ3QsIGRhcyBlcnN0ZSAgICAgICAqLworLyogQXJndW1lbnQgaXN0IGRhcyBXb3J0IChvZGVyIGRpZSBMaXN0ZSB2b24gV29lcnRlcm4pLCB6dSBkZXIgZGVyIFphdWJlcmVyICovCisvKiBiZWZyYWd0IHdlcmRlbiBrYW5uLCBkYXMgendlaXRlIEFyZ3VtZW50IGlzdCBkaWUgZW50c3ByZWNoZW5kZSBBbnR3b3J0LiAgKi8KKy8qIGlzdCBkYXMgZHJpdHRlIEFyZ3VtZW50IGdlc2V0enQsIHNvIHdpcmQgZGllIEFudHdvcnQgYXV0b21hdGlzY2ggdW1nZS0gICAqLworLyogYnJvY2hlbiB1bmQgYmVrb21tdCBkZW4gVGV4dCBkZXMgQXJndW1lbnRzIHZvciBqZWRlIFplaWxlIGdlc3RlbGx0LiAgICAgICovCisvKiBEYXMgdmllcnRlLCBlYmVuZmFsbHMgb3B0aW9uYWxlLCBBcmd1bWVudCB3aXJkIHNvZmVybiBnZXNldHp0IGFuIGRpZSAgICAgKi8KKy8qIHVtc3RlaGVuZGVuIFBlcnNvbmVuIGF1c2dlZ2ViZW4sIGRhZHVyY2ggbGFlc3N0IHNpY2ggZWluIEZsdWVzdGVybiBvZGVyICAqLworLyogZWluZSBzcGllbGVyYWJoYWVuZ2lnZSBBbnR3b3J0IHJlYWxpc2llcmVuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgQWRkSW5mbygia2FuaW5jaGVuIiwKKyAgInNhZ3Q6IERpZSBob2wgaWNoIGltbWVyIGF1cyBtZWluZW0gSHV0LlxuIik7CisgIEFkZEluZm8oInphdWJlcmVpIiwKKyAgInNhZ3Q6IEljaCBiaW4gZWluIE1laXN0ZXIgZGVyIFphdWJlcmVpLlxuIik7CisgIEFkZEluZm8oKHsibWF1cyIsICJtYWV1c2UifSksCisgICJzYWd0OiBNYWV1c2Ugc2luZCBtZWluZSBMaWVibGluZ3N0aWVyZS5cbiIpOyAKKyAgCisgIEFkZEluZm8oICh7InRpZXIiLCJ0aWVyZSJ9KSwgCisgICAgICAgICAgIk9oLCBoYXVwdHNhZWNobGljaCBiZXNjaGFlZnRpZ2UgaWNoIG1pY2ggbWl0IEthbmluY2hlbiB1bmQgTWFldXNlbi4iLAorICAgICAgICAgICJmbHVlc3RlcnQgRGlyIHp1OiAiLAorICAgICAgICAgICJmbHVlc3RlcnQgbWl0IEBXRU0uXG4iKTsKKworLyogTm9ybWFsZXJ3ZWlsZSBuZWhtZW4gTW9uc3RlciBhbGxlcyB3YXMgbWFuIGlobmVuIGdpYnQsIG9obmUgZWluZW4gVG9uICovCisvKiB6dSBzYWdlbi4gV2lsbCBtYW4gZG9ydCBlaW4gYW5kZXJlcyBWZXJoYWx0ZW4sIHNvIHR1dCBtYW4gZGFzIHNvOiAgICAgKi8KKy8qIE1vZWdsaWNoIHNpbmQgYXVjaCBSRUpFQ1RfR0lWRSAoPSB6dXJ1ZWNrZ2ViZW4pIFJFSkVDVF9EUk9QICg9ZmFsbGVuICAqLworLyogbGFzc2VuLiAqLworICBTZXRQcm9wKCBQX1JFSkVDVCwgKHsgUkVKRUNUX0tFRVAsICJEZXIgWmF1YmVyZXIgc2FndDogRGFua2VzY2hvZW4uXG4iIH0pICk7CisKKy8qIERlciBaYXViZXJlciBrYW5uIGF1Y2ggenVzYWV0emxpY2hlIFZlcmJlbiBoYWJlbiwgZGllIG51ciBlciBzZWxiZXIKKyAqIGJlbnV0emVuIGthbm4sIGtlaW4gYW5kZXJlcyBMaXZpbmcuIERpZXNlIGtvZW5uZW4gbWl0IGFkZF9hY3Rpb24oKSBpbQorICogY3JlYXRlIGVpbmVzIE5QQyBhbmdlbWVsZGV0IHdlcmRlbiAodW5kIGlkUiBOVVIgaW4gZGllc2VyIEZ1bmt0aW9uIHVuZCBOVVIKKyAqIGluIExlYmV3ZXNlbiwgbmljaHQgaW4gc29uc3RpZ2VuIE9iamVrdGVuISAqLworICBhZGRfYWN0aW9uKCJuYXNlYm9ocmVuIiwgImJvaHJlaW5uYXNlIik7CisKKy8qIFZlcmJlbiwgZGllIFNwaWVsZXIgaW4gR2VnZW53YXJ0IGRlcyBaYXViZXJlcnMga29lbm5lbiBzb2xsZW4sIHdlcmRlbiAgICAgKi8KKy8qIG1pdCBBZGRDbWQgYW5nZW1lbGRldC4gKi8KK30KKworaW50IG5hc2Vib2hyZW4oIHN0cmluZyBzdHIgKSAvLyBzdHIgaXN0IGRhcywgd2FzIGhpbnRlciBkZW0gdmVyYiBlaW5nZWdlYmVuIHd1cmRlLgoreworICAgc2F5KCAiRGVyIFphdWJlcmVyIGJvaHJ0IG1pdCBkZW0gU3RhYiBpbiBzZWluZXIgTmFzZS5cbiIgKTsKKyAgIHJldHVybiAxOyAvLyBWZXJiIHdhciBlcmZvbGdyZWljaC4KK30KKwpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9taXNjL2JzcHJhdW0xLmMgYi9kb2MvYmVpc3BpZWxlL21pc2MvYnNwcmF1bTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDgzMDk1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9taXNjL2JzcHJhdW0xLmMKQEAgLTAsMCArMSw3OCBAQAorLyogL2RvYy9iZWlzcGllbGUvbWlzYy9ic3ByYXVtMS5jIHZvbiBSdW1hdGEgKi8KKworLy8gRGllc2UgUHJhZ21hcyBzb3JnZW4gZGFmdWVyLCBkYXNzIGRlciBEcml2ZXIgZGFyYXVmIGFjaHRldCwgZGFzcyBiZWkKKy8vIEZ1bmt0aW9uc2FyZ3VtZW50ZW4sIC1SdWVja2dhYmV3ZXJ0ZW4gdW5kIHRlaWx3ZWlzZSBiZWkgWnV3ZWlzdW5nIHZvbgorLy8gV2VydGVuIGFuIFZhcmlhYmxlbiBkZXIgcmljaHRpZ2UgRGF0ZW50eXAgdmVyd2VuZGV0IHdpcmQgKHouYi4ga2VpbiBzdHJpbmcKKy8vIGFuc3RlbGxlIGVpbmVzIGludCB2ZXJ3ZW5kZXQgd2lyZCkuIFNvbGx0ZSBpbiBrZWluZW0gT2JqZWt0IGZlaGxlbi4KKyNwcmFnbWEgc3Ryb25nX3R5cGVzLCBzYXZlX3R5cGVzLCBydHRfY2hlY2tzCisKK2luaGVyaXQgIi9zdGQvcm9vbSI7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgICA6OmNyZWF0ZSgpOworCisgICAgU2V0UHJvcCggUF9JTlRfU0hPUlQsICJFaW4ga2xlaW5lcyBTY2hyZWliemltbWVyIiApOworICAgIFNldFByb3AoIFBfSU5UX0xPTkcsCisgICAgICAgICJEdSBzdGVoc3QgaW4gZWluZW0ga2xlaW5lbiBTY2hyZWliemltbWVyLlxuIgorICAgICAgICAgIkVzIGdlaG9lcnRlIHdvaGwgaXJnZW5kd2FubiBlaW5tYWwgZWluZW0gTWFnaWVyLCBhYmVyIG51blxuIgorICAgICAgICAgImlzdCBkaWVzZXIgUmF1bSB2ZXJ3YWlzdCB1bmQgcm90dGV0IHZvciBzaWNoIGhpbi5cbiIKKyAgICAgICAgICJFaW4gZ3Jvc3NlciBTY2hyZWlidGlzY2ggaW4gZGVyIE1pdHRlIGRlcyBSYXVtZXMgc2NoZWludFxuIgorICAgICAgICAgIm5vY2ggZWluaWdlcm1hc3NlbiBndXQgZXJoYWx0ZW4genUgc2Vpbi4gRHVyY2ggZGllIFR1ZXJcbiIKKyAgICAgICAgICJpbSBOb3JkZW4gZmFlbGx0IGV0d2FzIExpY2h0IGhpbmVpbi5cbiIKKyAgICApOworICAgIFNldFByb3AoIFBfTElHSFQsIDEgKTsKKyAgICBTZXRQcm9wKCBQX0lORE9PUlMsIDEgKTsKKworICAgIEFkZERldGFpbCggKHsgInNjaHJlaWJ0aXNjaCIsICJ0aXNjaCIgfSksCisgICAgICAgICJBdWYgZGVtIFRpc2NoIGxpZWd0IGVpbmUgZGlja2UgU3RhdWJzY2hpY2h0LlxuIgorICAgICAgICAiRWluZSBTY2h1YmxhZGUgZmluZGVzdCBEdSBlYmVuZmFsbHMuXG4iCisgICAgKTsKKyAgICBBZGREZXRhaWwoICh7ICJzdGF1YiIsICJzdGF1YnNjaGljaHQiLCAic2NoaWNodCIgfSksCisgICAgICAgICJEdSBtYWxzdCBnZWxhbmd3ZWlsdCBlaW5pZ2UgS3JlaXNlIGluIGRlbiBTdGF1Yi5cbiIKKyAgICApOworICAgIEFkZERldGFpbCggInNjaHVibGFkZSIsCisgICAgICAgICJTbyBzZWhyIER1IERpY2ggYW5zdHJlbmdzdDsgRHUga2FubnN0IHNpZSBuaWNodCBiZXdlZ2VuLlxuIgorICAgICk7CisgICAgQWRkRGV0YWlsKCAidHVlciIgLAorICAgICAgICAiU2llIHN0ZWh0IHNlaXQgSmFocmVuIG9mZmVuIHVuZCBpc3QgaW4gZGllc2VyIExhZ2VcbiIKKyAgICAgICAgImhvZmZudW5nc2xvcyBmZXN0Z2Vyb3N0ZXQuXG4iCisgICAgKTsKKworICAgIEFkZENtZCggKHsgInNjaGxpZXNzZSIsICJvZWZmbmUiLCAiYmV3ZWdlIiwgInNjaGxpZXNzIiwgImJld2VnIiB9KSwgCisgICAgICAgICAgICAiYmV3ZWdfZXR3YXMiICk7CisgICAgQWRkRXhpdCggIm5vcmRlbiIsICJwbGF5ZXJzL3J1bWF0YS93b3Jrcm9vbSIgKTsKK30KKworcHVibGljIGludCBiZXdlZ19ldHdhcyggc3RyaW5nIHN0ciApCit7CisgICAgbm90aWZ5X2ZhaWwoICJXYXMgd2lsbHN0IER1IGRlbm4gYmV3ZWdlbiA/IiApOworICAgIGlmKCBzdHIgPT0gInR1ZXIiICkKKyAgICB7CisgICAgICAgIHdyaXRlKCAiRGllIFR1ZXIgaXN0IGhvZmZudW5nc2xvcyBmZXN0Z2Vyb3N0ZXQuXG4iICk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoIHN0ciA9PSAibGFkZSIgfHwgc3RyID09ICJzY2h1YmxhZGUiICkKKyAgICB7CisgICAgICAgIHdyaXRlKCAiRGllIFNjaHVibGFkZSBrbGVtbXQgZWluZmFjaCBudXIuXG4iICk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoIHF1ZXJ5X3ZlcmIoKSA9PSAiYmV3ZWdlIiAmJgorICAgICAgICAoIHN0ciA9PSAidGlzY2giIHx8IHN0ciA9PSAic2NocmVpYnRpc2NoIiApICkKKyAgICB7CisgICAgICAgIHRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksCisgICAgICAgICAgICAiRGVyIFRpc2NoIHNjaGVpbnQgYW0gQm9kZW4gZmVzdGdlc2NocmF1YnQgenUgc2Vpbi5cbiIKKyAgICAgICAgKTsKKyAgICAgICAgdGVsbF9yb29tKHRoaXNfb2JqZWN0KCksCisgICAgICAgICAgICB0aGlzX3BsYXllcigpLT5uYW1lKFdFUiwyKSsiIHplcnJ0IGFtIFNjaHJlaWJ0aXNjaC5cbiIKKyAgICAgICAgKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorIC8vIG9mZmVuYmFyIHBhc3N0ZSBuaXgsIEtvbW1hbmRvIG5pY2h0IGVyZm9sZ3JlaWNoIGFiZ2VhcmJlaXRldC4gR2dmLiB3ZWl0ZXJlCisgLy8gdmVyc3VjaGVuIHVuZC9vZGVyIGRpZSBub3RpZnlfZmFpbC1NZWxkdW5nIGF1c2dlYmVuLgorICAgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL21pc2MvYnNwcnVlc3QxLmMgYi9kb2MvYmVpc3BpZWxlL21pc2MvYnNwcnVlc3QxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBlM2IwZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvbWlzYy9ic3BydWVzdDEuYwpAQCAtMCwwICsxLDM4IEBACisvKgorKiogRWluZSBCZWlzcGllbHJ1ZXN0dW5nCisqKiAodm9uIEJvaW5nKQorKi8KKworLy8gRGllc2UgUHJhZ21hcyBzb3JnZW4gZGFmdWVyLCBkYXNzIGRlciBEcml2ZXIgZGFyYXVmIGFjaHRldCwgZGFzcyBiZWkKKy8vIEZ1bmt0aW9uc2FyZ3VtZW50ZW4sIC1SdWVja2dhYmV3ZXJ0ZW4gdW5kIHRlaWx3ZWlzZSBiZWkgWnV3ZWlzdW5nIHZvbgorLy8gV2VydGVuIGFuIFZhcmlhYmxlbiBkZXIgcmljaHRpZ2UgRGF0ZW50eXAgdmVyd2VuZGV0IHdpcmQgKHouYi4ga2VpbiBzdHJpbmcKKy8vIGFuc3RlbGxlIGVpbmVzIGludCB2ZXJ3ZW5kZXQgd2lyZCkuIFNvbGx0ZSBpbiBrZWluZW0gT2JqZWt0IGZlaGxlbi4KKyNwcmFnbWEgc3Ryb25nX3R5cGVzLCBzYXZlX3R5cGVzLCBydHRfY2hlY2tzCisKK2luaGVyaXQgIi9zdGQvYXJtb3VyIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxjb21iYXQuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICA6OmNyZWF0ZSgpOyAgIC8qIFdJQ0hUSUchISEgKi8KKworLyogU3RhbmRhcmRrb25maWd1cmF0aW9uLCBnZW5hdWVyZXMgc2llaGUgL2RvYy9iZWlzcGllbGUvYnNwd2FmZmUxLmMgICAgKi8KKyAgU2V0UHJvcChQX1NIT1JULCAiRWluIGdyYXVlciBVbWhhbmciKTsKKyAgU2V0UHJvcChQX0xPTkcsICJFcyBpc3QgZWluIGxhbmdlciBncmF1ZXIgVW1oYW5nIGF1cyBlaW5lbSBmZWluZW4gTWF0ZXJpYWwuXG4iKTsKKyAgU2V0UHJvcChQX05BTUUsICJVbWhhbmciKTsKKyAgU2V0UHJvcChQX0dFTkRFUiwgTUFMRSk7CisgIEFkZElkKCJ1bWhhbmciKTsKKyAgU2V0UHJvcChQX1dFSUdIVCwgMjUwKTsKKyAgU2V0UHJvcChQX1ZBTFVFLCAyMDApOworCisvKiBadXIgV2FmZmUgZmVobHQgbmljaHQgbWVociB2aWVsLCBudXIgbm9jaCBkaWUgUnVlc3R1bmdza2xhc3NlIChBQykgICAgKi8KKy8qIHNldHplbiB1bmQgZWluZW4gUnVlc3R1bmdzdHlwIHNldHplbi4gRGllIFR5cGVuIHNpbmQgaW4gc3lzL2NvbWJhdC5oICAqLworLyogZGVmaW5pZXJ0LiBSaWNodGxpbmllbiB6dSBSdWVzdHVuZ3NrbGFzc2VuIGRlciB2ZXJzY2hpZWRlbmVuIFR5cGVuICAgICovCisvKiBzdGVoZW4gbW9tZW50YW4gaW4gL3BsYXllcnMvYm9pbmcvd2FmZmVuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBTZXRQcm9wKFBfQVJNT1VSX1RZUEUsIEFUX0NMT0FLKTsKKyAgU2V0UHJvcChQX0FDLCA4KTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvbWlzYy9ic3B0cmFuc3BvcnRlcjEuYyBiL2RvYy9iZWlzcGllbGUvbWlzYy9ic3B0cmFuc3BvcnRlcjEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTI2MDIwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9taXNjL2JzcHRyYW5zcG9ydGVyMS5jCkBAIC0wLDAgKzEsMTMyIEBACitpbmhlcml0ICJzdGQvdHJhbnNwb3J0IjsKKworLyogd29sa2UuYyBFaW4gQmVpc3BpZWwgenVyIFByb2dyYW1taWVydW5nIGVpbmVzIFRyYW5zcG9ydGVycyAqLworLyogdm9uIFJ1bWF0YSAobWl0IGtsZWluZW4gQnVnZml4ZXMgdm9uIFdhcmdvbiA7KSAqLworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisKK2NyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoIFBfTkFNRSwgIldvZWxrY2hlbiIgKTsKKyAgQWRkSWQoICh7ICJ3b2xrZSIsICJ3b2Vsa2NoZW4iIH0pICk7CisgIFNldFByb3AoIFBfR0VOREVSLCBORVVURVIgKTsKKyAgU2V0UHJvcCggUF9JTlRfU0hPUlQsICJBdWYgZWluZXIga2xlaW5lbiBXb2xrZSIgKTsKKyAgU2V0UHJvcCggUF9JTlRfTE9ORywKKwkgICJEdSBzaXR6dCBhdWYgZWluZXIga2xlaW5lbiBXb2xrZSwgZGllIHp3aXNjaGVuIEpvZnMgdW5kIFJ1bWF0YXNcbiIKKwkgICsJIkFyYmVpdHN6aW1tZXIgaGluLSB1bmQgaGVycGVuZGVsdC4gV2VubiBzaWUgbmllZHJpZyBmbGllZ3QsIGthbm5zdFxuIgorCSAgKwkiRHUgYmVzdGltbXQgdm9uIGlociBoZXJ1bnRlcnN0ZWlnZW4uXG4iCisJICApOworICBTZXRQcm9wKCBQX1NIT1JULCAiRWluZSBrbGVpbmUgV29sa2UiICk7CisgIFNldFByb3AoIFBfTE9ORywKKwkgICJEaWVzZSBzdWVzc2Uga2xlaW5lIEN1bXVsdXN3b2xrZSBzY2h3ZWJ0IHp3aXNjaGVuIEpvZnMgdW5kIFJ1bWF0YXNcbiIKKwkgICsJIkFyYmVpdHN6aW1tZXIgaGluIHVuZCBoZXIuIFZpZWxsZWljaHQga2FubnN0IER1IGF1ZiBzaWUgZHJhdWZzdGVpZ2VuLlxuIgorCSAgKTsKKyAgU2V0UHJvcChQX0xJR0hULCAxICk7CisgIFNldFByb3AoUF9UUkFOU1BBUkVOVCwxKTsKKyAgLy8gTWFuIHNvbGwgYXVmKGluKSBkaWUgV29sa2UgdW5kIHZvbiBpaHIgaGVydW50ZXIgc2NoYXVlbiBrb2VubmVuLgorICAgIAorICAvKioqIE1lbGR1bmdlbiwgZGllIFRyYW5zcG9ydGVyIGdlYmVuIGtvZW5uZW4gKioqLworICAKKyAgU2V0UHJvcCggUF9ERVBBUlRNU0csICh7CisgICAgIkRpZSBXb2xrZSBzdGVpZ3QgaW4gZGllIEx1ZnQuXG4iLCAKKyAgICAiRGllIFdvbGtlIGZsaWVndCBkYXZvbi5cbiIKKyAgfSkgKTsKKyAgLy8gRGllIGVyc3RlIE1lbGR1bmcgaXN0IGZ1ZXIgTGV1dGUgYXVmIGRlciBXb2xrZS4KKyAgLy8gRGllIHp3ZWl0ZSBmdWVyIExldXRlIGluIGRlbSBSYXVtLCBpbiBkZW0gZGllIFdvbGtlIGFua29tbXQuCisgICAgICAKKyAgU2V0UHJvcCggUF9BUlJJVkVNU0csICh7CisgICAgIkRpZSBXb2xrZSBuYWVoZXJ0IHNpY2ggZGVtIEJvZGVuIHZvbiBAQFF1ZXJ5QXJyaXZlZEBALlxuIiwKKyAgICAiRWluZSBrbGVpbmUgV29sa2Ugc2Nod2VidCBoZXJhYi5cbiIKKyAgfSkgKTsKKyAgLy8gRGllIGVyc3RlIE1lbGR1bmcgaXN0IGZ1ZXIgTGV1dGUgYXVmIGRlciBXb2xrZS4KKyAgLy8gRGllIHp3ZWl0ZSBmdWVyIExldXRlIGluIGRlbSBSYXVtLCBhdXMgZGVtIGRpZSBXb2xrZSBhYnJlaXN0LgorICAgIAorICBTZXRQcm9wKCBQX0VOVEVSTVNHLCAoeworICAgICJzdGVpZ3QgYXVmIGRpZSBXb2xrZSIsCisgICAgImtvbW10IGF1ZiBkaWUgV29sa2UiCisgIH0pICk7CisgIC8vIERpZSBlcnN0ZSBNZWxkdW5nIGlzdCBmdWVyIGRlbiBSYXVtLCBhdXMgZGVtIGRlciBTcGllbGVyIGtvbW10LgorICAvLyAoPVJhdW0pLiBEaWUgendlaXRlIE1lbGR1bmcgaXN0IGZ1ZXIgU3BpZWxlciBpbiBkZW0gUmF1bSwgaW4KKyAgLy8gZGVuIGRlciBTcGllbGVyIGdlaHQgKD1UcmFuc3BvcnRlcikuCisJCisgIFNldFByb3AoIFBfTEVBVkVNU0csICh7CisgICAgInN0ZWlndCB2b24gZGVyIFdvbGtlIiwKKyAgICAic3RlaWd0IHZvbiBkZXIgV29sa2UiCisgIH0pICk7CisgIC8vIERpZSBlcnN0ZSBNZWxkdW5nIGlzdCBmdWVyIGRlbiBSYXVtLCBhdXMgZGVtIGRlciBTcGllbGVyIGtvbW10LgorICAvLyAoPVRyYW5zcG9ydGVyKS4gRGllIHp3ZWl0ZSBNZWxkdW5nIGlzdCBmdWVyIFNwaWVsZXIgaW4gZGVtIFJhdW0sCisgIC8vIGluIGRlbiBkZXIgU3BpZWxlciBnZWh0ICg9UmF1bSkuCisgICAgICAKKyAgU2V0UHJvcCggUF9MRUFWRUZBSUwsICJEaWUgV29sa2Ugc2Nod2VidCB2aWVsIHp1IGhvY2giICk7CisgIC8vIE1lbGR1bmcsIGRpZSBrb21tdCwgd2VubiBlaW4gU3BpZWxlciBkZW4gVHJhbnNwb3J0ZXIgdmVybGFzc2VuCisgIC8vIHdpbGwsIGFiZXIgZGllc2VyIGFuIGtlaW5lbSBSYXVtIGFuZ2VsZWd0IGhhdC4KKyAgLy8gSXN0IGRlciBQYXJhbWV0ZXIgZWluIFN0cmluZyAoc28gd2llIGhpZXIpLCBzbyBiZWtvbW10IG51cgorICAvLyBkZXIgYmV0cmVmZmVuZGUgU3BpZWxlciBkaWUgTWVsZHVuZywgd2VubiBzaWUgZWluIEFycmF5IGF1cworICAvLyAyIEVsZW1lbnRlbiBpc3QsIGJla29tbXQgZGVyIFNwaWVsZXIgZGllIGVyc3RlIHVuZCBhbGxlCisgIC8vIGFuZGVyZW4gU3BpZWxlciBpbSBUcmFuc3BvcnRlciBkaWUgendlaXRlIChtaXQgZGVtIE5hbWVuCisgIC8vIGRlcyBTcGllbGVycyBkYXZvcikuCisgIC8vIE1vZWdsaWNoIHdhZXJlIGFsc28gYXVjaDoKKyAgLyoKKyAgICAgU2V0UHJvcCggUF9MRUFWRUZBSUwsICh7CisgICAgICJEaWUgV29sa2Ugc2Nod2VidCB2aWVsIHp1IGhvY2ggenVtIEhlcnVudGVyc3ByaW5nZW4iLAorICAgICAiZmFlbGx0IGZhc3Qgdm9uIGRlciBXb2xrZSIKKyAgICAgfSkgKTsKKyAgKi8KKworICBTZXRQcm9wKCBQX0VOVEVSRkFJTCwgIkVzIHBhc3NlbiBudXIgNSBQYXNzYWdpZXJlIGF1ZiBkaWUgV29sa2UuXG4iICk7CisgIC8vIERpZXNlIE1lbGR1bmcgYmVrb21tdCBkZXIgU3BpZWxlciwgd2VubiBlciB2ZXJzdWNodCwgZWluZW4KKyAgLy8gdm9sbGVuIFRyYW5zcG9ydGVyIHp1IGJldHJldGVuLiBIaWVyIGlzdCBudXIgZWluZSBNZWxkdW5nCisgIC8vIChhbiBkZW4gU3BpZWxlcikgdm9yZ2VzZWhlbi4KKworICBTZXRQcm9wKCBQX01BWF9QQVNTRU5HRVJTLCA1ICk7CisgIC8vIE1heGltYWxlIEFuemFobCBkZXIgU3BpZWxlciwgZGllIHNpY2ggaW0gVHJhbnNwb3J0ZXIgYmVmaW5kZW4KKyAgLy8ga29lbm5lbi4gRnVlciBHZWdlbnN0YWVuZGUgZ2lidCBlcyBrZWluZSBCZXNjaHJhZW5rdW5nLgorCisgIC8qIFZlcmJlbiAqLworICBBZGRDbWQoICh7ICJzdGVpZyIsICJzdGVpZ2UiLCAic3ByaW5nIiwgInNwcmluZ2UiIH0pLCAic3RlaWdlIiApOworCisgIC8qIEt1cnMgKi8KKyAgQWRkUm91dGUoICJwbGF5ZXJzL3J1bWF0YS93b3Jrcm9vbSIsIDMwLCAyMCwgIlJ1bWF0YXMgQXJiZWl0c3ppbW1lciIgKTsKKyAgLy8gSGllciB3aXJkIGRlciBSYXVtIC9wbGF5ZXJzL3J1bWF0YS93b3Jrcm9vbSBhbHMgQW5sZWdlcGxhdHoKKyAgLy8gaW4gZGVuIEt1cnMgZWluZ2VmdWVndC4gRGVyIFRyYW5zcG9ydGVyIHZlcndlaWx0IDMwc2VrIGluIGRpZXNlbQorICAvLyBSYXVtIHVuZCBmYWVodCBkYW5uIDIwc2VrIGxhbmcsIGJpcyBlciBkZW4gbmFlY2h0ZW4gUHVua3QKKyAgLy8gZXJyZWljaHQuIERhbmFjaCBrYW5uIG1hbiBub2NoIGRlbiBDb2RlIGFuZ2ViZW4sIGRlciBiZWkKKyAgLy8gUXVlcnlBcnJpdmVkIHp1cnVlY2tnZWdlYmVuIHdpcmQsIHNldHplbi4gV2lyZCBrZWluIENvZGUKKyAgLy8gZ2VzZXR6dCwgd28gd2lyZCBkb3J0IGVpbiBMZWVyc3RyaW5nIHp1cnVlY2tnZWdlYmVuLiAwIHdpcmQKKyAgLy8gZGFubiB6dXJ1ZWNrZ2VnZWJlbiwgd2VubiBkZXIgVHJhbnNwb3J0ZXIgYW4ga2VpbmVtIFJhdW0gYW5nZWxlZ3QKKyAgLy8gaGF0LgorCisgIEFkZE1zZyggIkRpZSBXb2xrZSB0cmVpYnQgbnVuIGltIFdpbmQgUmljaHR1bmcgSm9mcyBBcmJlaXRzemltbWVyLlxuIiwgMzAgKTsKKyAgLy8gSGllciB3aXJkIGVpbmUgTWVsZHVuZyBhdXNnZWdlYmVuLCB1bmQgZGVyIFRyYW5zcG9ydGVyIHJlaXN0IDMwc2VrIGxhbmcKKyAgLy8gd2VpdGVyLgorCisgIEFkZE1zZyggIkRpZSBXb2xrZSBiZWdpbm50IHp1IHNpbmtlbi5cbiIsIDEwICk7CisgIEFkZFJvdXRlKCAicGxheWVycy9qb2Yvd29ya3Jvb20iLCAzMCwgMjAsICJKb2ZzIEFyYmVpdHN6aW1tZXIiICk7CisgIEFkZE1zZyggIkRpZSBXb2xrZSB0cmVpYnQgbnVuIGltIFdpbmQgUmljaHR1bmcgUnVtYXRhcyBBcmJpZXRzemltbWVyLlxuIiwgMzAgKTsKKyAgQWRkTXNnKCAiRGllIFdvbGtlIGJlZ2lubnQgenUgc2lua2VuLlxuIiwgMTAgKTsKKyAgLy8gTmFjaCBkZW0gTGV0enRlbiBIYWx0ZXB1bmt0IHdpcmQgZGVyIEt1cnMgd2llZGVyIHZvbiB2b3JuCisgIC8vIGJlZmFocmVuLgorIAkKKyAgU3RhcnQoKTsKKyAgLy8gTGFzc2UgZGVuIFRyYW5zcG9ydGVyIGFtIGVyc3RlbiBkaWVzZXIgSGFsdGVwdW5rdGUgc3RhcnRlbi4KK30KKworc3RlaWdlKHN0cikKK3sKKyAgc3RyaW5nIGFyZywgYXJnMjsKKyAgCisgIGlmIChzc2NhbmYoIHN0ciwgImF1ZiAlcyIsIGFyZyApID4gMCAmJiBpZChvbGRfZXhwbG9kZShhcmcsIiAiKVswXSkpCisgICAgcmV0dXJuIEVudGVyKCk7CisgIC8vIFdlbm4gc2ljaGVyIGlzdCwgZGFzcyBkZXIgU3BpZWxlciBkaWUgV29sa2UgQkVzdGVpZ2VuIHdpbGwsCisgIC8vIGthbm4gbWFuIG1pdCByZXR1cm4gRW50ZXIoKSBhbGxlIHdlaXRlcmVuIFRlc3RzIGR1cmNoZnVlaHJlbi4KKworICBpZiAoc3NjYW5mKCBzdHIsICJ2b24gJXMiLCBhcmcgKSA+IDAgJiYgaWQob2xkX2V4cGxvZGUoYXJnLCAiICIpWzBdKSkKKyAgICByZXR1cm4gTGVhdmUoKTsKKyAgLy8gRGFzIHNlbGJlIGdpbHQgZnVlciBkYXMgQUJzdGVpZ2VuIHVuZCBMZWF2ZSgpLgorICAvLyBWZXJiZW4gc29sbHRlbiBuYWNoIEVudGVyKCkgb2RlciBMZWF2ZSgpIGtlaW5lIHdlaXRlcmVuIEJlZmVobGUKKyAgLy8gZW50aGFsdGVuLgorfQorCisKZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvbWlzYy9ic3B3YWZmZTEuYyBiL2RvYy9iZWlzcGllbGUvbWlzYy9ic3B3YWZmZTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTlhZTJhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9taXNjL2JzcHdhZmZlMS5jCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisqKiBFaW5lIEJlaXNwaWVsd2FmZmUKKyoqICh2b24gQm9pbmcpCisqLworCisvLyBEaWVzZSBQcmFnbWFzIHNvcmdlbiBkYWZ1ZXIsIGRhc3MgZGVyIERyaXZlciBkYXJhdWYgYWNodGV0LCBkYXNzIGJlaQorLy8gRnVua3Rpb25zYXJndW1lbnRlbiwgLVJ1ZWNrZ2FiZXdlcnRlbiB1bmQgdGVpbHdlaXNlIGJlaSBadXdlaXN1bmcgdm9uCisvLyBXZXJ0ZW4gYW4gVmFyaWFibGVuIGRlciByaWNodGlnZSBEYXRlbnR5cCB2ZXJ3ZW5kZXQgd2lyZCAoei5iLiBrZWluIHN0cmluZworLy8gYW5zdGVsbGUgZWluZXMgaW50IHZlcndlbmRldCB3aXJkKS4gU29sbHRlIGluIGtlaW5lbSBPYmpla3QgZmVobGVuLgorI3ByYWdtYSBzdHJvbmdfdHlwZXMsIHNhdmVfdHlwZXMsIHJ0dF9jaGVja3MKKworaW5oZXJpdCAiL3N0ZC93ZWFwb24iOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPiAgICAgLyogRGVmaW5pdGlvbiBkZXIgUHJvcGVydGllcyAqLworI2luY2x1ZGUgPGNvbWJhdC5oPiAgICAgICAgIC8qIERlZmluaXRpb24gZGVyIGthbXBmc3BlemlmaXNjaGVuIEtvbnN0YW50ZW4gKi8KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPiAgICAgICAvKiBEZWZpbml0aW9uIHZvbiBNQUxFLCBGRU1BTEUsIFdFUiwgLi4uICovCisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7ICAgLyogV0lDSFRJRyEhISAqLworCisvKiBLdXJ6YmVzY2hyZWlidW5nIGZ1ZXIgRGFyc3RlbGx1bmcgaW4gaW52ZW50b3JpZXMgKi8KKyAgU2V0UHJvcChQX1NIT1JULCAiRWluIEtudWVwcGVsIik7CisKKy8qIEJlc2NocmVpYnVuZyBkZXMgS251ZXBwZWxzICovCisgIFNldFByb3AoUF9MT05HLCAKKyAgIkRpZXNlciBLbnVlcHBlbCBpc3QgemllbWxpY2ggbm9ybWFsLCBlciBpc3QgYXVzIGZlc3RlbSBIb2x6IGdlZmVydGlndCB1bmRcbiIrCisJICAibWFuIGthbm4gaWhuIGFscyBXYWZmZSBiZW51dHplbi5cbiIpOworCisvKiBOYW1lIHVuZCBHZXNjaGxlY2h0IHNpbmQgd2ljaHRpZywgamVkZXMgT2JqZWt0IGJyYXVjaHQgZGFzICovCisgIFNldFByb3AoUF9OQU1FLCAiS251ZXBwZWwiKTsKKyAgU2V0UHJvcChQX0dFTkRFUiwgTUFMRSk7CisKKy8qIEplZGVzIE9iamVrdCBicmF1Y2h0IGVpbmUgb2RlciBtZWhyZXJlIElkJ3MgKi8KKyAgQWRkSWQoImtudWVwcGVsIik7CisKKy8qIFdlcnQgdW5kIEdld2ljaHQgKi8KKyAgU2V0UHJvcChQX1ZBTFVFLCAzMDApOworICBTZXRQcm9wKFBfV0VJR0hULCAxMjUwKTsgICAvKiBpbiBHcmFtbSAqLworCisvKiBOdW4gZGllIHdpcmtsaWNoIFdhZmZlbnNwZXppZmlzY2hlbiBEaW5nZTogICAgICAgICAgICAgICAgICAgKi8KKy8qIFdhZmZlbi0gdW5kIFNjaGFkZW5zYXJ0ZW4gc2luZCBpbiAvc3lzL2NvbWJhdC5oIGRlZmluaWVydCAgICAqLworICBTZXRQcm9wKFBfV0VBUE9OX1RZUEUsIFdUX0NMVUIpOworICBTZXRQcm9wKFBfREFNX1RZUEUsIERUX0JMVURHRU9OKTsKKworLyogRGllIFdhZmZlbmtsYXNzZSBtdXNzIGltIEJlcmVpY2ggendpc2NoZW4gMSB1bmQgMjAwIGxpZWdlbiAgICovCisgIFNldFByb3AoUF9XQywgMTI1KTsKKyAgCisvKiBBbnphaGwgZGVyIGJlbm9ldGlndGVuIEhhZW5kZSwgdW0gZGllIFdhZmZlIHp1IHp1ZWNrZW4uICAgICAgKi8KKy8qIFdhZmZlbiBtaXQgZWluZXIgV0MgZ3JvZXNzZXIgMTUwLCBzb2xsdGVuIGF1ZiBqZWRlbiBGYWxsICAgICAqLworLyogWndlaWhhZW5kZXIgc2VpbiwgYmVpIFNvbmRlcmZhZWxsZW4gYml0dGUgYW4gZGVuIEVyem1hZ2llciAgICovCisvKiBmdWVyIFdhZmZlbiB3ZW5kZW4uIFdlbm4gbmljaHRzIGdlc2V0enQgd2lyZCwgaXN0IGRpZSBXYWZmZSAgKi8KKy8qIGVpbiBad2VpaGFlbmRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBTZXRQcm9wKFBfTlJfSEFORFMsIDEpOworfQorCmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL21pc2Mva3JhbmtoZWl0LmMgYi9kb2MvYmVpc3BpZWxlL21pc2Mva3JhbmtoZWl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU4MTZhMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvbWlzYy9rcmFua2hlaXQuYwpAQCAtMCwwICsxLDY2IEBACisvKiAgUGFyYWNlbHN1czogRWluZSBLcmFua2hlaXQKKyoqCisqKiAgICAgIEJlaXNwaWVsIGZ1ZXIgZGllIFZlcndlbmR1bmcgdm9uIFBfWF9BVFRSX01PRCB1bmQgUF9YX0hFQUxUSF9NT0QKKyoqCisqKiAgICAgIERpZXNlIEtyYW5raGVpdCBzZXR6dCBhbGxlIEF0dHJpYnV0ZSBoZXJhYiB1bmQgZXJuaWVkcmlndAorKiogICAgICB6dXNhZXR6bGljaCBQX01BWF9IUCB1bmQgUF9NQVhfU1AgdW0gamV3LiAyMCAoenVzYWV0emxpY2ggenUgZGVuCisqKiAgICAgIEF1c3dpcmt1bmdlbiBkZXIgQXR0cmlidXRzZW5rdW5nZW4pLgorKiogICAgICBHZXN0YXJ0ZXQgd2lyZCBkaWUgS3JhbmtoZWl0LCBpbmRlbSBzaWUgZWluZmFjaCBpbiBkYXMgT3BmZXIKKyoqICAgICAgYmV3ZWd0IHdpcmQuCisqKiAgICAgIE1hbiBiZWFjaHRlLCBkYXNzIGltIHJlbW92ZSgpIGRpZSBQX1hfKi1Qcm9wZXJ0aWVzIGVpbiBsZWVyZXMKKyoqICAgICAgTWFwcGluZyB6dWdld2llc2VuIGJla29tbWVuIHVuZCBrZWluZSAwLiBOdXIgc28gd2VyZGVuIGRpZQorKiogICAgICBLcmFua2hlaXRzZm9sZ2VuIHJ1ZWNrZ2FlbmdpZyBnZW1hY2h0LgorKi8KKworLy8gRGllc2UgUHJhZ21hcyBzb3JnZW4gZGFmdWVyLCBkYXNzIGRlciBEcml2ZXIgZGFyYXVmIGFjaHRldCwgZGFzcyBiZWkKKy8vIEZ1bmt0aW9uc2FyZ3VtZW50ZW4sIC1SdWVja2dhYmV3ZXJ0ZW4gdW5kIHRlaWx3ZWlzZSBiZWkgWnV3ZWlzdW5nIHZvbgorLy8gV2VydGVuIGFuIFZhcmlhYmxlbiBkZXIgcmljaHRpZ2UgRGF0ZW50eXAgdmVyd2VuZGV0IHdpcmQgKHouYi4ga2VpbiBzdHJpbmcKKy8vIGFuc3RlbGxlIGVpbmVzIGludCB2ZXJ3ZW5kZXQgd2lyZCkuIFNvbGx0ZSBpbiBrZWluZW0gT2JqZWt0IGZlaGxlbi4KKyNwcmFnbWEgc3Ryb25nX3R5cGVzLCBzYXZlX3R5cGVzLCBydHRfY2hlY2tzCisKK2luaGVyaXQgIi9zdGQvdGhpbmciOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8Y2xhc3MuaD4KKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgICA6OmNyZWF0ZSgpOworCisgICAgLy8gYXVzbmFobXN3ZWlzZSBkYXJmIGRpZXNlcyBPYmpla3QgbWFsIGtlaW4gUF9TSE9SVCtQX0xPTkcgaGFiZW4uLi4KKyAgICBTZXRQcm9wKFBfU0hPUlQsMCk7CisgICAgU2V0UHJvcChQX0xPTkcsIDApOworICAgIFNldFByb3AoUF9JTlZJUywgMSk7IC8vIHVuc2ljaHRiYXIgbWFjaGVuLgorICAgIFNldFByb3AoUF9OQU1FLCJLcmFua2hlaXQiKTsKKyAgICBTZXRQcm9wKFBfR0VOREVSLEZFTUFMRSk7CisgICAgLy8gd2ljaHRpZywgc29uc3Qgd2llZ3QgZGllIEtyYW5raGVpdCAxa2cgKFN0YW5kYXJkZ2V3aWNodCBmdWVyIHRoaW5nKSAKKyAgICBTZXRQcm9wKFBfV0VJR0hULDApOworICAgIFNldFByb3AoUF9WQUxVRSwwKTsKKyAgICBTZXRQcm9wKFBfTUFURVJJQUwsTUFUX01JU0NfTUFHSUMpOworICAgIFNldFByb3AoUF9OT0RST1AsMSk7IC8vIE5pY2h0IHdlZ3dlcmZiYXIuCisKKy8vIC0tLS0+IERpZXNlciBBYnNjaG5pdHQgc29yZ3QgZnVlciBmaWVzZSBTdGF0YWJ6dWVnZQorCisgICAgU2V0UHJvcChQX1hfSEVBTFRIX01PRCwKKyAgICAoWworICAgICAgICBQX0hQIDogLTIwLCAgIC8vIE1heC4gTGViZW5zcHVua3RlIHVtIDIwIHJ1bnRlcgorICAgICAgICBQX1NQIDogLTIwICAgIC8vIE1heC4gS29uemVudHJhdGlvbnNwdW5rdGUgdW0gMjAgcnVudGVyCisgICAgXSkgKTsKKyAgICBTZXRQcm9wKFBfWF9BVFRSX01PRCwKKyAgICAoWworICAgICAgICBBX0NPTiA6IC0xLCAgIC8vIEF1c2RhdWVyIHVtIDEgcnVudGVyLCByZWR1emllcnQgYXVjaCBtYXguIExQIQorICAgICAgICBBX0RFWCA6IC0xLCAgIC8vIEdlc2NoaWNrbGljaGtlaXQgdW0gMSBydW50ZXIKKyAgICAgICAgQV9JTlQgOiAtMiwgICAvLyBJbnRlbGxpZ2VueiB1bSAyIHJ1bnRlciwgcmVkdXppZXJ0IGF1Y2ggbWF4LiBLUCEKKyAgICAgICAgQV9TVFIgOiAtNCwgICAvLyBTdGFlcmtlIHVtIDQgcnVudGVyCisgICAgXSkgKTsKKworLy8gPC0tLS0KKworICAgIEFkZElkKCAoeyJQQVJBXG5TSUNLXG5FWEFNUExFIn0pICk7CisKKyAgICBBZGRDbGFzcyhDTF9ESVNFQVNFKTsgLy8gRGFtaXQgS2xlcmlrZXIgaGVsZmVuIGtvZW5uZW4uCisgICAgU2V0UHJvcChQX0xFVkVMLDE1KTsgIC8vIEFiZXIgbmljaHQgZ2FueiBzbyBlaW5mYWNoIHp1IGVudGZlcm5lbgorfQorCmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL21pc2MvbGViZW5zcmluZy5jIGIvZG9jL2JlaXNwaWVsZS9taXNjL2xlYmVuc3JpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODJlYTVlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9taXNjL2xlYmVuc3JpbmcuYwpAQCAtMCwwICsxLDU2IEBACisvKiBQYXJhY2Vsc3VzOiBMZWJlbnNyaW5nCisqKgorKiogICAgRWluIEJlaXNwaWVsIGZ1ZXIgZGllIEFud2VuZHVuZyB2b24gUF9NX0hFQUxUSF9NT0QKKyoqCisqKiAgICBaaWVodCBlaW4gU3BpZWxlciBkaWVzZW4gUmluZyBhbiwgc28gZXJob2VoZW4gc2ljaCBzZWluZSBtYXhpbWFsZW4KKyoqICAgIExlYmVuc3B1bmt0ZSBkYWJlaSB1bSAxMCwgd2FlaHJlbmQgc2VpbmUgbWF4LiBLb256ZW50cmF0aW9uc3B1bmt0ZQorKiogICAgdW0gNSBlcm5pZWRyaWd0IHdlcmRlbi4KKyovCisKKy8vIERpZXNlIFByYWdtYXMgc29yZ2VuIGRhZnVlciwgZGFzcyBkZXIgRHJpdmVyIGRhcmF1ZiBhY2h0ZXQsIGRhc3MgYmVpCisvLyBGdW5rdGlvbnNhcmd1bWVudGVuLCAtUnVlY2tnYWJld2VydGVuIHVuZCB0ZWlsd2Vpc2UgYmVpIFp1d2Vpc3VuZyB2b24KKy8vIFdlcnRlbiBhbiBWYXJpYWJsZW4gZGVyIHJpY2h0aWdlIERhdGVudHlwIHZlcndlbmRldCB3aXJkICh6LmIuIGtlaW4gc3RyaW5nCisvLyBhbnN0ZWxsZSBlaW5lcyBpbnQgdmVyd2VuZGV0IHdpcmQpLiBTb2xsdGUgaW4ga2VpbmVtIE9iamVrdCBmZWhsZW4uCisjcHJhZ21hIHN0cm9uZ190eXBlcywgc2F2ZV90eXBlcywgcnR0X2NoZWNrcworCitpbmhlcml0ICIvc3RkL2FybW91ciI7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8YXJtb3VyLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxjb21iYXQuaD4KKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgICA6OmNyZWF0ZSgpOworCisgICAgU2V0UHJvcChQX1NIT1JULCJFaW4gTGViZW5zcmluZyIpOworICAgIFNldFByb3AoUF9MT05HLAorICAgICAgICAiRWluIGtsZWluZXIgUmluZyBhdXMgZWluZW0gc2VsdHNhbWVuLCBncnVlbmVuIE1hdGVyaWFsLlxuIik7CisgICAgU2V0UHJvcChQX0lORk8sCisgICAgICAgICJEaWVzZXIgUmluZyB1bnRlcnN0dWV0enQgZGllIEdlc3VuZGhlaXQuXG4iKworICAgICAgICAiRGFiZWkgc2Nod2FlY2h0IGVyIGxlaWRlciBkZW4gR2Vpc3QuXG4iKTsKKyAgICBTZXRQcm9wKFBfTkFNRSwiTGViZW5zcmluZyIpOworICAgIFNldFByb3AoUF9HRU5ERVIsTUFMRSk7CisgICAgU2V0UHJvcChQX1dFSUdIVCw4MCk7CisgICAgU2V0UHJvcChQX1ZBTFVFLDIwMDArcmFuZG9tKDUwMSkpOworICAgIFNldFByb3AoUF9BUk1PVVJfVFlQRSxBVF9SSU5HKTsKKyAgICBTZXRQcm9wKFBfQUMsMCk7IC8vIGtlaW5lIFNjaHV0endpcmt1bmcgaW0gS2FtcGYKKyAgICBTZXRQcm9wKFBfTUFURVJJQUwsTUFUX01JU0NfTUFHSUMpOworCisvLyAtLS0tPgorCisgICAgU2V0UHJvcChQX01fSEVBTFRIX01PRCwKKyAgICAoWworICAgICAgICBQX0hQIDogMTAsICAgICAgLy8gTWF4LiBMUCB1bSAxMCBlcmhvZWhlbgorICAgICAgICBQX1NQIDogLTUgICAgICAgLy8gTWF4LiBLUCB1bSA1IHZlcnJpbmdlcm4KKyAgICBdKSApOworCisvLyA8LS0tLQorCisgICAgQWRkSWQoICh7InJpbmciLCJsZWJlbnNyaW5nIn0pICk7CisKKyAgICBBZGREZXRhaWwoICJtYXRlcmlhbCIsCisgICAgICAgICJFcyBpc3QgZ3J1ZW4uXG4iKTsKK30KKwpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9taXNjL3NlaGVyaGF1cy5jIGIvZG9jL2JlaXNwaWVsZS9taXNjL3NlaGVyaGF1cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMTI3ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL21pc2Mvc2VoZXJoYXVzLmMKQEAgLTAsMCArMSwxMzYgQEAKKy8qCitLdXJ6ZSBVZWJlcnNpY2h0IGRlciBUZXJtaW5pOgorCitQX0hBVVNfRVJMQVVCVCAgICAgUHJvcGVydGllLCBkaWUgZGFzIEJhdWVuIGVpbmVzIEhhdXNlcyBpbSBSYXVtIGVyLQorICAgICAgICAgICAgICAgICAgIGxhdWJ0IG9kZXIgdmVyYmlldGV0LiBEZWZhdWx0IGF1ZiAwCisgICAgICAgICAgICAgICAgICAgU3ludGF4OiB4Y2FsbCAkaC0+U2V0UHJvcChQX0hBVVNfRVJMQVVCVCx4KQorICAgICAgICAgICAgICAgICAgIAorU2F2ZSgpICAgICAgICAgICAgIE11c3MgbmFjaCBBZW5kZXJ1bmdlbiBhbSBIYXVzIGF1ZmdlcnVmZW4gd2VyZGVuLgorICAgICAgICAgICAgICAgICAgIFN5bnRheDogeGNhbGwgL2Qvc2VoZXIvaGFldXNlci90aWxseWhhdXMtPlNhdmUoKQorCitPa2F5LCBhbHNvIGVpbiBTZWhlciBtb2VjaHRlLCBkYXNzIHNlaW4gSGF1cyAxKSB1bnNpY2h0YmFyIGlzdCwgMikgbWl0CitlaW5lbSBhbmRlcmVuIEtvbW1hbmRvIGJldHJldGVuIHdlcmRlbiBzb2xsIHVuZCAzKSBuaWNodCBhdWYgZGllIGlkIAorPGhhdXM+IGhvZXJ0IHNvbmRlcm4gYXVmIGVpbmUgYW5kZXJlOgorCitadSAxKTogR2FueiBlaW5mYWNoLCBtYW4gdGlwcGUgCisKKyAgICAgICAneGNhbGwgL2Qvc2VoZXIvaGFldXNlci90aWxseWhhdXMtPlNldFByb3AoUF9TSE9SVCwwKScgdW5kCisgICAgICAgJ3hjYWxsIC9kL3NlaGVyL2hhZXVzZXIvdGlsbHloYXVzLT5TYXZlKCknCisKK1p1IDIpIHVuZCAzKTogRGFzIGlzdCBuaWNodCBzbyBlaW5mYWNoLCBzb25kZXJuIG11c3MgdWViZXIgZGVuIFJhdW0sIGluIAorICAgICAgICAgICAgICBkZW0gZGFzIEhhdXMgc3RlaHQsIGdlbWFjaHQgd2VyZGVuLiBEZXN3ZWdlbiBmb2xnZW5kIG51biAKKyAgICAgICAgICAgICAgZWluIEJlaXNwaWVsIHp1IEZ1bmt0aW9uZW4gaW4gc28gZWluZW0gUmF1bS4KKworCitGb2xnZW5kZSBEaW5nZSBzdGVoZW4gbmF0dWVybGljaCBzY2hvbiBpbSBSYXVtLCBzb25zdCBsaWVzc2UgZXIgc2ljaAorbmljaHQgbGFkZW4gOi0pICAgICAgICAgICAgICAKKyovCisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLCBzYXZlX3R5cGVzLCBydHRfY2hlY2tzCisKK2luaGVyaXQgIi9zdGQvcm9vbSI7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKworLyoKKyAgIEZ1ZXIgcHJvcGVydGllcyB1bmQgc29uc3RpZ2UgRGVmaW5pdGlvbmVuIHp1bSBTZWhlcmhhdXMuCisqLworI2luY2x1ZGUgIi9kL3NlaGVyL2hhZXVzZXIvaGF1cy5oIgorCisvKgorICAgQXVzIEdydWVuZGVuIGRlciBVZWJlcnNpY2h0bGljaGtlaXQgemllaGVuIHZpZWxlIE1hZ2llciB2b3IsIGRlbiBIYXVza3JhbXMKKyAgIGluIGVpbmUgc2VwYXJhdGUgRnVua3Rpb24genVzYW1tZW56dWZhc3Nlbi4KKyovCitwcml2YXRlIHZvaWQgaGF1c19jcmVhdGUoKTsKKworLyoKK0VzIGZvbGd0IG51biBkYXMgbm9ybWFsZSBjcmVhdGUoKSBlaW5lcyBSYXVtZXMKKyovCit2b2lkIGNyZWF0ZSgpeworICA6OmNyZWF0ZSgpOworICAvKiAuLi4gZGl2LiBLb25maWd1cmF0aW9uIGRlcyBSYXVtIC4uLiAqLworCisgIC8qCisgIERhcyBleHRyYS1jcmVhdGUoKSBtdXNzIG5hdHVlcmxpY2ggYXVmZ2VydWZlbiB3ZXJkZW4KKyAgKi8gIAorICBoYXVzX2NyZWF0ZSgpOworfSAgICAgIAorCisvKgorSGllciBrb21tZW4gd2lyIG51biB6dSBkZXIgRmt0LCBkaWUgYWxsZXMgYW0gU2VoZXJoYXVzIHZlcndhbHRldAorKi8KK3ByaXZhdGUgdm9pZCBoYXVzX2NyZWF0ZSgpCit7CisgIG9iamVjdCBvYiA9IGZpbmRfb2JqZWN0KEhBVVNOQU1FKCJ0aWxseSIpKTsgLy8gZmluZGV0IEhhdXMgdm9uIFRpbGx5CisKKyAgLyoKKyAgV2VubiBkYXMgSGF1cyBpbSBSYXVtIHN0ZWh0LiBIYXQgZGVuIFZvcnRlaWwsIGRhc3MgYmVpIGVpbmVtIFZlcmxlZ2VuCisgIGRlcyBIYXVzZXMsIENtZCdzIHVzdyBuaWNodCBtZWhyIHZlcmZ1ZWdiYXIgc2luZCAtPiBLZWluZSBldnRsIEJ1Z3MgOikKKyAgKi8KKyAgaWYob2JqZWN0cChvYikpCisgIHsKKyAgICAvKgorICAgIERlciBTcGllbGVyIHdvbGx0ZSBlcyBqYSBuaWNodCBhbmRlcnMKKyAgICAqLworICAgIG9iLT5SZW1vdmVDbWQoKHsiYmV0cmV0IiwiYmV0cml0dCIsImJldHJldGUifSkpOworICAgIG9iLT5SZW1vdmVJZCgiaGF1cyIpOworICAgIG9iLT5SZW1vdmVJZCgiaGF1cyB2b24gdGlsbHkiKTsKKyAgICBvYi0+QWRkSWQoInN0ZWluaGF1ZmVuIik7CisgICAgCisgICAgQWRkRGV0YWlsKCh7ImhhdWZlbiIsInN0ZWluaGF1ZmVuIn0pLCJEYSBpc3QgZG9jaCBlaW4ga2xlaW5lciBTcGFsdD8gIgorICAgICArIlZpZWxsZWljaHQga2FubnN0IER1IGF1ZiBkZW4gU3RlaW5oYXVmZW4ga2xldHRlcm4/XG4iKTsKKworICAgIEFkZENtZCgoeyJrbGV0dGVyIiwia2xldHRlcmUifSksImtsZXR0ZXJfY21kIik7CisgIH0KK30KKworcHVibGljIGludCBrbGV0dGVyX2NtZChzdHJpbmcgc3RyKQoreworICBvYmplY3Qgb2IgPSBmaW5kX29iamVjdChIQVVTTkFNRSgidGlsbHkiKSk7CisKKyAgX25vdGlmeV9mYWlsKCJXbyBtb2VjaHRlc3QgRHUgaGlua2xldHRlcm4/XG4iKTsKKworICBpZighc3RyKSByZXR1cm4gMDsKKworICBpZihzdHI9PSJhdWYgaGF1ZmVuIiB8fCBzdHI9PSJhdWYgc3RlaW5oYXVmZW4iKQorICB7CisgICAgaWYob2JqZWN0cChvYikpCisgICAgeworICAgICAgLyoKKyAgICAgIERhcyBpc3QgZGllIE1lbGR1bmcsIGRpZSBlaW4gU3BpZWxlciBiZWtvbW10LCB3ZW5uIGRhcyBTZWhlcmhhdXMKKyAgICAgIGFiZ2VzY2hsb3NzZW4gaXN0IHVuZCBlciB2ZXJzdWNodCwgZXMgenUgJ2JldHJldGVuJy4KKyAgICAgICovCisgICAgICBub3RpZnlfZmFpbCgiRHUga2xldHRlcnN0IGF1ZiBkZW4gSGF1ZmVuLCBkb2NoIGRlciBTcGFsdCBpc3QgenUgIgorICAgICAgICJzY2htYWwgZnVlciBEaWNoLlxuIik7CisgICAgICAgCisgICAgICBpZighKG9iLT5RdWVyeVByb3AoSF9ET09SU1RBVCkgJiBEX0NMT1NFRCkpCisgICAgICB7CisgICAgICAgIHRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksCisgICAgICAgICAgICAiRHUga2xldHRlcnN0IGF1ZiBkZW4gU3RlaW5oYXVmZW4sIHJ1dHNjaHN0IGRlbiBTcGFsdCBydW50ZXIgIgorICAgICAgICAgICAgICJ1bmQgZmluZGVzdCBEaWNoIHVycGxvZXR6bGljaCBpbiBlaW5lciBzY2h1bW1yaWdlbiBIb2VobGUuXG4iKTsKKyAgICAgICAgdGVsbF9yb29tKHRoaXNfb2JqZWN0KCksdGhpc19wbGF5ZXIoKS0+bmFtZSgpKyIga2xldHRlcnQgYXVmIGVpbmVuICIKKyAgICAgICAgICAiU3RlaW5oYXVmZW4gdW5kIGlzdCBwbG9ldHpsaWNoIHZlcnNjaHd1bmRlbi4iLCh7dGhpc19wbGF5ZXIoKX0pKTsKKyAgICAgICAgdGVsbF9yb29tKFJBVU1OQU1FKCJ0aWxseSIsMCksdGhpc19wbGF5ZXIoKS0+bmFtZSgpKworICAgICAgICAgICIgZmFlbGx0IGZsdWNoZW5kIGhlcmVpbi5cbiIpOworICAgICAgICB0aGlzX3BsYXllcigpLT5tb3ZlKFJBVU1OQU1FKCJ0aWxseSIsMCksTV9HT3xNX1NJTEVOVCwwKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorICAKKy8qCitOYXR1ZXJsaWNoIGdpYnQgZXMgbm9jaCB2aWVsIG1laHIgTW9lZ2xpY2hrZWl0ZW4gcnVuZCB1bSBTZWhlcmhhZXVzZXIsIAorZG9jaCBzb2xsdGUgZGllcyBlcnN0bWFsIHJlaWNoZW4uIFp1IGJlYWNodGVuIGlzdCBiZWkgc29sY2hlciBWb3JnZWhlbnMtCit3ZWlzZSwgZGFzcyBlaW4gJ3NjaGxpZXNzZXxvZWZmbmUgaGF1cycgZXZ0bCB6dSBGZWhsZXJtZWxkdW5nZW4gZnVlaHJ0LgorRGVtIFNwaWVsZXIgc2VpIG5haGVnZWxlZ3QsIGVzIGRvY2ggbWl0ICdvZWZmbmUgaGF1c3R1ZXInIHp1IHZlcnN1Y2hlbi4KKworSEFVU05BTUUgdW5kIFJBVU1OQU1FICh1LmEuKSBzaW5kIERlZmluZXMgYXVzIGRlbSBoYXVzLmguIE1hbiBzb2xsdGUgc2ljaAorZGllc2VzIEZpbGUgYW5zY2hhdWVuIHVuZCBkaWUgZG9ydGlnZW4gRGVmaW5lcyB1ZWJlcm5laG1lbi4gRGFubiBidWd0IGF1Y2ggCituaWNodHMsIGZhbGxzIG1hbCBldHdhcyBhbiBkZW4gSGFldXNlcm4gdW1nZXN0ZWxsdCB3aXJkLgorCitUaWxseSwgMjAuIE1haSAyMDAxLCAwMDoxMDoyNGgKKyovCmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL21pc2Mvc3RhdGtyYWxsZW4uYyBiL2RvYy9iZWlzcGllbGUvbWlzYy9zdGF0a3JhbGxlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYWU0YzMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL21pc2Mvc3RhdGtyYWxsZW4uYwpAQCAtMCwwICsxLDYxIEBACisvKiBQYXJhY2Vsc3VzOiBTdGF0a3JhbGxlbgorKioKKyoqICAgICBCZWlzcGllbCBmdWVyIGRpZSBWZXJ3ZW5kdW5nIHZvbiBQX01fQVRUUl9NT0QKKyoqCisqKiAgICAgWmllaHQgZWluIFNwaWVsZXIgZGllc2UgS3JhbGxlbiBhbiwgc28gZXJob2VodCBzaWNoIHNlaW5lIFN0YWVya2UKKyoqICAgICB1bSAyLiBHbGVpY2h6ZWl0aWcgd2lyZCBkYXMgRXJob2VoZW4gc2VpbmVyIEdlc2NoaWNrbGljaGtlaXQgZHVyY2gKKyoqICAgICBhbmRlcmUgUnVlc3R1bmdlbi9XYWZmZW4gYmxvY2tpZXJ0LiAKKyoqICAgICBEaWUgS3JhbGxlbiBrb2VubmVuIG51ciBhbmdlem9nZW4gd2VyZGVuLCB3ZW5uIHdlZGVyIEFfU1RSIG5vY2gKKyoqICAgICBBX0RFWCBkdXJjaCBlaW5lIGFuZGVyZSBSdWVzdHVuZy9XYWZmZSBibG9ja2llcnQgd2lyZC4KKyovCisKKy8vIERpZXNlIFByYWdtYXMgc29yZ2VuIGRhZnVlciwgZGFzcyBkZXIgRHJpdmVyIGRhcmF1ZiBhY2h0ZXQsIGRhc3MgYmVpCisvLyBGdW5rdGlvbnNhcmd1bWVudGVuLCAtUnVlY2tnYWJld2VydGVuIHVuZCB0ZWlsd2Vpc2UgYmVpIFp1d2Vpc3VuZyB2b24KKy8vIFdlcnRlbiBhbiBWYXJpYWJsZW4gZGVyIHJpY2h0aWdlIERhdGVudHlwIHZlcndlbmRldCB3aXJkICh6LmIuIGtlaW4gc3RyaW5nCisvLyBhbnN0ZWxsZSBlaW5lcyBpbnQgdmVyd2VuZGV0IHdpcmQpLiBTb2xsdGUgaW4ga2VpbmVtIE9iamVrdCBmZWhsZW4uCisjcHJhZ21hIHN0cm9uZ190eXBlcywgc2F2ZV90eXBlcywgcnR0X2NoZWNrcworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8Y29tYmF0Lmg+CisKK2luaGVyaXQgIi9zdGQvYXJtb3VyIjsKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgICA6OmNyZWF0ZSgpOworCisgICAgU2V0UHJvcChQX1NIT1JULCJTdGF0a3JhbGxlbiIpOworICAgIFNldFByb3AoUF9MT05HLAorICAgICAgICAiRGllc2Uga3JhbGxlbmJld2VocnRlbiBIYW5kc2NodWhlIHNjaGltbWVybiBibGFldWxpY2guXG4iKTsKKyAgICBTZXRQcm9wKFBfTkFNRSwiU3RhdGtyYWxsZW4iKTsKKyAgICBTZXRQcm9wKFBfSU5GTywiRGllIEtyYWxsZW4gbWFjaGVuIHN0YWVya2VyLlxuIik7CisgICAgU2V0UHJvcChQX0dFTkRFUixGRU1BTEUpOworICAgIFNldFByb3AoUF9OT0JVWSwxKTsgLy8gd2lyZCBiZWkgVmVya2F1ZiBpbSBsYWRlbiB6ZXJzdG9lcnQuCisgICAgU2V0UHJvcChQX1dFSUdIVCw4MDApOworICAgIFNldFByb3AoUF9WQUxVRSw1MDAwK3JhbmRvbSgyMDAwKSk7CisgICAgU2V0UHJvcChQX0FSTU9VUl9UWVBFLEFUX0dMT1ZFKTsKKyAgICBTZXRQcm9wKFBfQUMsMik7CisgICAgU2V0UHJvcChQX0VGRkVDVElWRV9XQywxNSk7CisgICAgU2V0UHJvcChQX01BVEVSSUFMLAorICAgIChbCisgICAgICAgIE1BVF9MRUFUSEVSICAgIDogNjAsCisgICAgICAgIE1BVF9NSVNDX01FVEFMIDogNDAKKyAgICBdKSApOworCisvLyAtLS0tPgorCisgICAgU2V0UHJvcChQX01fQVRUUl9NT0QsCisgICAgKFsKKyAgICAgICAgQV9TVFIgOiAyLCAgLy8gU3RhZXJrZSB1bSAyIGVyaG9laGVuCisgICAgICAgIEFfREVYIDogMCAgIC8vIEdlc2NoaWNrbGljaGtlaXQgYmxvY2tpZXJlbgorICAgIF0pICk7CisKKy8vIDwtLS0tCisKKyAgICBBZGRJZCggKHsiaGFuZHNjaHVoZSIsImtyYWxsZW4ifSkgKTsKKworICAgIEFkZERldGFpbCggInNjaGltbWVyIiwKKyAgICAgICAgIkVpbiBibGFldWxpY2hlciBTY2hpbW1lciBsaWVndCBhdWYgZGVuIEtyYWxsZW4uXG4iKTsKK30KKwpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9wcmVjb21waWxlci9rb25zdGFudGVuLmMgYi9kb2MvYmVpc3BpZWxlL3ByZWNvbXBpbGVyL2tvbnN0YW50ZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODdkMWEzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9wcmVjb21waWxlci9rb25zdGFudGVuLmMKQEAgLTAsMCArMSw1MCBAQAorLy8gTWl0IGRlbSBQcmFlY29tcGlsZXIgbGFzc2VuIHNpY2ggc3ltYm9saXNjaGUgS29uc3RhbnRlbiBkZWZpbmllcmVuLiBEaWVzCisvLyB6LkIuIHNpbm52b2xsLCB3ZW5uIGVpbmUgWmFobCBlaW5lIGJlc3RpbW10ZSBCZWRldXR1bmcgaGF0LiBaLmIuIGhhdCBkaWUKKy8vIFphaGwgNDIgYW4gc2ljaCBrZWluZSBmaXhlIEJlZGV1dHVuZywgaGllciBpc3QgZGllIGplZG9jaCBkaWUgQW50d29ydCEKKyNkZWZpbmUgQU5UV09SVCA0MgorLy8gU2NocmVpYnQgbWFuIG51biBpcmdlbmR3byBpbSBDb2RlIEFOVFdPUlQsIGVyc2V0enQgZGVyIFByYWVjb21waWxlciBqZWRlcworLy8gVm9ya29tbWVuIHZvbiBBTlRXT1JUIGR1cmNoIDQyLgorCisvLyBhdWNoIGtvbXBsZXhlcmUgS29uc3RhbnRlbiBzaW5kIG1vZWdsaWNoLCB6LkIuIGVpbiBBcmd1bWVudCBlaW5lcyBEZWZpbmVzOgorI2RlZmluZSBST09NKHgpICgiL2QvZWJlbmUvemVzc3RyYS9hZHZlbnQvcm9vbS8iK3gpCisvLyBEaWVzIGRpZW50IG1laXN0LCB1bSBzaWNoIFNjaHJlaWJhcmJlaXQgenUgc3BhcmVuLiBGb3JtdWxpZXJ0IG1hbiBuYWNoCisvLyBkaWVzZW0gI2RlZmluZSBlaW4gUk9PTSgid2VnMSIpLCBlcnpldWd0IGRlciBQcmFlY29tcGlsZXIgaGllcmF1czoKKy8vICgiL2QvZWJlbmUvemVzc3RyYS9hZHZlbnQvcm9vbS93ZWcxIikKKworLy8gV2VpdGVyZXMgQmVpc3BpZWw6CisjZGVmaW5lIEJTKHgpIGJyZWFrX3N0cmluZyh4LCA3OCkKKy8vIGVyemV1Z3QgYWxzbyBhdXMgQlMoImxhbmdlciB0ZXh0IikgZWluIGJyZWFrX3N0cmluZygibGFuZ2VyIHRleHQiLDc4KQorCisvLyBFcyBnZWhlbiBhdWNoIG1laHJlcmUgQXJndW1lbnRlOgorI2RlZmluZSBCUyh4LHkpIGJyZWFrX3N0cmluZyh4LCA3OCwgeSkKKy8vIEJTKCJsYW5nZXIgdGV4dCIsIDc4LCAiWmVzc3RyYSBzYWd0OiAiKQorLy8gICAtPiBicmVha19zdHJpbmcoImxhbmdlciB0ZXh0IiwgNzgsICJaZXNzdHJhIHNhZ3Q6ICIpCisKKy8vIFNvbGNoZSBEZWZpbmVzIGxhc3NlbiBzaWNoIHNjaGFjaHRlbG46CisjZGVmaW5lIEhPTUUoeCkgKCIvZC9lYmVuZS96ZXNzdHJhL2FkdmVudC8iK3gpCisjZGVmaW5lIFJPT00oeCkgKEhPTUUoInJvb20vIit4KSkKKy8vIEVpbiBST09NKCJ3ZWcxIikgd2lyZCBudW4gZHVyY2ggKEhPTUUoInJvb20vIisid2VnMSIpKSBlcnNldHp0CisvLyB1bmQgZGllc2VzIHdpZWRlcnVtIGR1cmNoIGVpbiAKKy8vICgoIi9kL2ViZW5lL3plc3N0cmEvYWR2ZW50LyIrInJvb20vIisid2VnMSIpKSwgd2FzIGxldHp0ZW5kbGljaCBlaW4KKy8vICgoIi9kL2ViZW5lL3plc3N0cmEvYWR2ZW50L3Jvb20vd2VnMSIpKSBpc3QuCisKKy8vIExldHp0ZXJlcyB3aXJkIGhhZXVmaWcgYmVudXR6dCBiZWkgZGVyIEVyc3RlbGx1bmcgdm9uIEdlYmlldGVuIHVtIHNpY2ggYmVpCisvLyBVbXp1ZWdlbiBBcmJlaXQgenUgc3BhcmVuOiB6aWVodCBkYXMgR2ViaWV0IHVtICh6LkIuIHZvbiAvcGxheWVycy96ZXNzdHJhLworLy8gbmFjaCAvZC9lYmVuZS96ZXNzdHJhL2FkdmVudC8sIHJlaWNodCBlcyBhdXMsIEhPTUUgenUgYWVuZGVybiB1bmQgbWFuIG11c3MKKy8vIG5pY2h0IDE1MG1hbCBkZW4ga29tcGxldHRlbiBQZmFkIGltIENvZGUgYWVuZGVybi4KKworLy8gbW9lY2h0ZSBtYW4gZWluIERlZmluZSB1ZWJlciBtZWhyZXJlIFplaWxlbiBkZWZpbmllcmVuLCBtdXNzIGRlcgorLy8gWmVpbGVudW1icnVjaCBtaXQgZWluZW0gXCBlc2NhcGVkICB3ZXJkZW46CisjZGVmaW5lIExPRyh4KSBsb2dfZmlsZSgiYmxhIixcCisgICAgIkRpZXMgaXN0IGVpbiBsYWVuZ2VyZXIgVGV4dC5cbiIpCisvLyBXSUNIVElHOiBIaW50ZXIgZGVtIFwgZGFyZiBLRUlOIExlZXJ6ZWljaGVuLCBUYWIgby5hZS4gc3RlaGVuIQorCisvLyBUaXBzOgorLy8gKiBEYW1pdCBtYW4gRGVmaW5lcyBzY2huZWxsIGFscyBzb2xjaGUgZXJrZW5udCwgc29sbHRlbiBhbGxlIERlZmluZXMKKy8vICAgZ3Jvc3NnZXNjaHJpZWJlbiB3ZXJkZW46IHouQi4gUEwgdnMuIHBsCisvLyAqIHZvbiBrb21wbGV4ZW4gRGVmaW5lcyB3aXJkIGFiZ2VyYXRlbiwgd2VpbCBzaWUgc2NobmVsbCBVZWJlcnNpY2h0IAorLy8gICB1bmQgRWZmaXppZW56IHJ1aW5pZXJlbiBrb2VubmVuCisvLyAqIGVpbmlnZSBoYWV1ZmlnIGJlbnV0enRlIERlZmluZXMgZmluZGVuIHNpY2ggaW4gPGRlZmluZXMuaD4KKy8vICogZGVyIERyaXZlciBkZWZpbmllcnQgYmVzdGltbXRlIERlZmluZXMgYXV0b21hdGlzY2guIEVpbmUgTGlzdGUKKy8vICAgZmluZGV0IHNpY2ggaW4gL2RvYy9kcml2ZXIvcHJlZGVmaW5lZAorCmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3JvdGF1Z2VudmFtcGlyZS8ucmVhZG1lIGIvZG9jL2JlaXNwaWVsZS9yb3RhdWdlbnZhbXBpcmUvLnJlYWRtZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmNlZWI2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9yb3RhdWdlbnZhbXBpcmUvLnJlYWRtZQpAQCAtMCwwICsxLDMgQEAKK0RyZWkgQmVpc3BpZWxtb25zdGVyLCBkaWUgd2ljaHRpZ2UgQmFzaXNlaWdlbnNjaGFmdGVuIHZvbiBOUENzIHNvd2llCitkaWUgVmVyZXJidW5nIGRlbW9uc3RyaWVyZW4uIEFuZ2VsZWhudCBhbiBic3Btb24xLmMgdm9uIEJvaW5nLgorKFplc3N0cmEpCmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3JvdGF1Z2VudmFtcGlyZS9yb3RhdWdlbnZhbXBpci5jIGIvZG9jL2JlaXNwaWVsZS9yb3RhdWdlbnZhbXBpcmUvcm90YXVnZW52YW1waXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTQ2NGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9yb3RhdWdlbnZhbXBpcmUvcm90YXVnZW52YW1waXIuYwpAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAgIEVpbiBCZWlzcGllbC1OUEMgKHZvbiBaZXNzdHJhLCBhbmdlbGVobnQgYW4gQm9pbmdzIGJzcG1vbjEuYykKKyovCisKKy8vIERpZXNlIFByYWdtYXMgc29yZ2VuIGRhZnVlciwgZGFzcyBkZXIgRHJpdmVyIGRhcmF1ZiBhY2h0ZXQsIGRhc3MgYmVpCisvLyBGdW5rdGlvbnNhcmd1bWVudGVuLCAtUnVlY2tnYWJld2VydGVuIHVuZCB0ZWlsd2Vpc2UgYmVpIFp1d2Vpc3VuZyB2b24KKy8vIFdlcnRlbiBhbiBWYXJpYWJsZW4gZGVyIHJpY2h0aWdlIERhdGVudHlwIHZlcndlbmRldCB3aXJkICh6LmIuIGtlaW4gc3RyaW5nCisvLyBhbnN0ZWxsZSBlaW5lcyBpbnQgdmVyd2VuZGV0IHdpcmQpLiBTb2xsdGUgaW4ga2VpbmVtIE9iamVrdCBmZWhsZW4uCisjcHJhZ21hIHN0cm9uZ190eXBlcywgc2F2ZV90eXBlcywgcnR0X2NoZWNrcworLy8gRWluaWdlIFdhcm51bmdlbiB3ZXJkZW4gYWxzIEZlaGxlciBiZXRyYWNodGV0IChlbXBmb2hsZW4pCisjcHJhZ21hIHBlZGFudGljLCByYW5nZV9jaGVjaworLy8gU2NoYWx0ZXQgYmVzdGltbXRlIFdhcm51bmdlbiBlaW4gKGVtcGZvaGxlbikKKyNwcmFnbWEgd2Fybl9kZXByZWNhdGVkLCB3YXJuX2VtcHR5X2Nhc3RzLCB3YXJuX21pc3NpbmdfcmV0dXJuCisjcHJhZ21hIHdhcm5fZnVuY3Rpb25faW5jb25zaXN0ZW50CisKKy8vIEVyYnQgZGVuIFN0YW5kYXJkLU5QQyAvIGRhcyBTdGFuZGFyZC1Nb25zdGVyCitpbmhlcml0ICIvc3RkL25wYyI7CisKKy8vIElua2x1ZGllcnQgRGVmaW5pdGlvbmVuIGZ1ZXIgUHJvcGVydGllcyB1bmQgZWluaWdlIEtvbnN0YW50ZW4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxjbGFzcy5oPiAvLyBLb25zdGFudGVuIGZ1ZXIgQWRkQ2xhc3MoKQorCisvLyBjcmVhdGUoKSB3aXJkIGJlaW0gRXJ6ZXVnZW4gZGVzIE9iamVrdCB2b20gRHJpdmVyIGdlcnVmZW4gdW5kIGluaXRpYWxpc2llcnQKKy8vIGRpZXNlbiBOUEMuIEVzIGJla29tbXQga2VpbiBBcmd1bWVudCwgZ2lidCBrZWluZW4gV2VydCB6dXJ1ZWNrIChUeXA6IHZvaWQpCisvLyB1bmQga2FubiBuaWNodCB2b24gYXVzc2VyaGFsYiBkZXMgT2JqZWt0ZXMgZ2VydWZlbiB3ZXJkZW4gKHByb3RlY3RlZCkuCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICAvLyBOaWNodCB2ZXJnZXNzZW4sIG9obmUgZGFzIGdlaHQgbmljaHRzLiBGdWVocnQgZGFzIGNyZWF0ZSgpIGRlcyBnZWVyYnRlbgorICAvLyAvc3RkL25wYyBhdXMgdW5kIGluaXRpYWxpc2llcnQgZGVuIFN0YW5kYXJkLU5QQy4KKyAgOjpjcmVhdGUoKTsKKworLyogRGllIEt1cnpiZXNjaHJlaWJ1bmcgd2lyZCB6dW0gQmVpc3BpZWwgYW5nZXplaWd0IHdlbm4gbWFuIGluIGVpbmVuIFJhdW0KKyAgIG1pdCBkZW0gTW9uc3RlciByZWlubGFldWZ0ICovCisgIFNldFByb3AoUF9TSE9SVCwgIlJvdGF1Z2VudmFtcGlyIik7CisKKy8qIEJlaW0gQW5zY2hhdWVuIGRlcyBNb25zdGVycyB3aXJkIGRpZSBsb25nLWRlc2NyaXB0aW9uIGFuZ2V6ZWlndCwKKyAqIFplaWxlbnVtYnJ1Y2ggbmFjaCBCZWRhcmYgbmFjaCA3OCBaZWljaGVuLiAqLworICBTZXRQcm9wKFBfTE9ORywgYnJlYWtfc3RyaW5nKAorICAgICJFaW4gZmluc3RlciBhdXNzZWhlbmRlciBSb3RhdWdlbnZhbXBpci4iLDc4KSk7CisKKy8qIEVpbiBOYW1lIG11c3Mgc2VpbiwgZGEgc29uc3Qgei5CLiBpbSBUb2Rlc2ZhbGwgJ0xlaWNoZSB2b24gMCcgZGFsaWVndCAqLworICBTZXRQcm9wKFBfTkFNRSwgIlJvdGF1Z2VudmFtcGlyIik7CisgIFNldFByb3AoUF9OQU1FX0FESiwiYXVzZ2VtZXJnZWx0Iik7CisgIAorLyogRGFzIEdlc2NobGVjaHQgZGVzIE1vbnN0ZXJzLiBBbHMgR2VzY2hsZWNodGVyIHNpbmQgKi8KKy8qIGRpZSBpbiA8bGFuZ3VhZ2UuaD4gZGVmaW5pZXJ0ZW4gU3ltYm9sZSBORVVURVIsIE1BTEUgICAqLworLyogdW5kIEZFTUFMRSB6dWxhZXNzaWcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFNldFByb3AoUF9HRU5ERVIsIE1BTEUpOworCisvKiBFaW4gTW9uc3RlciBicmF1Y2h0IG1pbmRlc3RlbnMgZWluZSBJRCwgdW50ZXIgZGVyIG1hbiBlcyBhbnNwcmVjaGVuIGthbm4gKi8KKy8qIEVzIGthbm4gYWJlciBhdWNoIG1laHJlcmUgdmVyc2NoaWVkZW5lIElEJ3MgaGFiZW4uICAgICAgICAgICAgICAgICAgICAgICAqLworICBBZGRJZCggKHsidmFtcGlyIiwicm90YXVnZW52YW1waXIifSkgKTsKKworLyogWnVlcnN0IHNvbGx0ZSBtYW4gZGVtIE1vbnN0ZXIgZWluZW4gR3J1bmRsZXZlbCBnZWJlbi4gKi8KKy8qIFNldHp0IFN0YW5kYXJkd2VydGUgZnVlciBQX0xFVkVMLCBQX01BWF9IUCAoTGViZW5zcHVua3RlKSwgUF9NQVhfU1AKKyAqIChNYWdpZXB1bmt0ZSksIFBfSEFORFMsIFBfQk9EWSwgUF9YUCB1bmQgZGllIEF0dHJpYnV0ZSBBX1NUUiwgQV9JTlQsIEFfREVYCisgKiB1bmQgQV9DT04uIEFsbGUga29lbm5lbiBzcGFldGVyIG5vY2ggZ2VhZW5kZXJ0IHdlcmRlbi4KKyAqLworICBjcmVhdGVfZGVmYXVsdF9ucGMoIDI1ICk7CisKKy8qIE51biBtYWNoZW4gd2lyIGVzIGV0d2FzIHdpZGVyc3RhbmRzZmFlaGlnZXIsIGluZGVtIHdpciBQX0JPRFkgc2V0emVuLiAgKi8KKy8qIE5pZSBQX1RPVEFMX0FDIG9kZXIgUF9BQyBzZXR6ZW4sIFBfVE9UQUxfQUMgd2lyZCBhdXRvbWF0aXNjaCBiZXJlY2huZXQgKi8KKy8qIHVuZCBQX0FDIGlzdCBudXIgZnVlciBSdWVzdHVuZ2VuIGRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgU2V0UHJvcChQX0JPRFksIDU1KTsKKworLyogRGFzIE1vbnN0ZXIgc2NobGFlZ3QgbWl0IGJsb3NzZW4gSGFlbmRlbiB6dSwgYWxzbyB3aXJkIFBfSEFORFMgZ2VzZXR6dC4gICAqLworLyogQXVjaCBoaWVyIHdlZGVyIFBfVE9UQUxfV0Mgbm9jaCBQX1dDIHNldHplbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBTZXRQcm9wKFBfSEFORFMsICh7IiBtaXQgc2VpbmVuIEhhZW5kZW4iLCAxMzV9KSk7CisvKiAgICAgICAgICAgICAgICAgICAgXiBkaWVzZXMgTGVlcnplaWNoZW4gaXN0IHdpY2h0aWcgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBCZWltIEthbXBmIGVyc2NoZWludCBudW46ICdEYXMgTW9uc3RlciBncmVpZnQgRGljaCBtaXQgc2VpbmVuIEhhZW5kZW4gYW4nICovCisvKiAxMzUgZW50c3ByaWNodCBkZXIgV2FmZmVua2xhc3NlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBHZXNpbm51bmcgZGVzIE1vbnN0ZXJzLCAwIGlzdCBuZXV0cmFsLCBuZWdhdGl2IGJvZXNlIHVuZCBwb3NpdGl2IGd1dCAqLworICBTZXRQcm9wKFBfQUxJR04sIC0xMDApOyAgLyogZXR3YXMgYm9lc2UsIGFiZXIgbmljaHRzIGJlc29uZGVyZXMgKi8KKworLyogRGllIFJhc3NlIGRlcyBNb25zdGVycyAqLworICBTZXRQcm9wKFBfUkFDRSwgIlZhbXBpciIpOworCisvKiBFcmZhaHJ1bmdzcHVua3RlIGRlcyBNb25zdGVycywgYmVpbSBUb2QgZXJoYWVsdCBkZXIgJ0tpbGxlcicgZWluICAgKi8KKy8qIGh1bmRlcnRzdGVsIGRpZXNlcyBXZXJ0ZXMuIFNjaG9uIGltIEthbXBmIGVyaGFlbHQgbWFuIGJlaSBqZWRlbSAgICAqLworLyogU2NobGFnIHdlYXBvbl9jbGFzcypzY2hhZGVuLzEwIHB1bmt0ZSAod2VhcG9uX2NsYXNzIGhpZXIgNTUpLCBhbHNvICovCisvKiBpbnNnZXNhbXQgd2VhcG9uX2NsYXNzKmhpdF9wb2ludHMvMTAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFiIDIwMDAwMCBnaWJ0IGRlciBOUEMgZWluZW4gU3R1ZmVucHVua3QsIGFiIDYwMDAwMCAyIFN0dWZlbnB1bmt0ZSAqLworICBTZXRQcm9wKFBfWFAsIDEzMDAwMCk7CisgIAorLyogRGllIEdyb2Vzc2UgZGVzIE1vbnN0ZXJzIGluIGNtLiBEaWVzIHdpcmQgYmVpIGVpbmlnZW4gS2FtcGZiZWZlaGxlbiAqLworLyogYXVzZ2V3ZXJ0ZXQsIHNvd2llIGJlaSBlaW5pZ2VuIElkZW50aWZpa2F0aW9uc3NwcnVlY2hlbiB2b24gR2lsZGVuLgorICogSXJnZW5kd2FzIHp3aXNjaGVuIDE3MCB1bmQgMTkwIGNtLiAgKi8KKyAgU2V0UHJvcChQX1NJWkUsIDE3MCArIHJhbmRvbSgyMSkpOworCisvKiBFaW4gR2V3aWNodCAoaW4gR3JhbW0pIHNvbGx0ZSBkZXIgTlBDIGhhYmVuLCBpcmdlbmR3YXMgendpc2NoZW4gNDAgdW5kIDQ4CisgKiBrZy4KKyAqLworICBTZXRQcm9wKFBfV0VJR0hULCA0MDAwMCArIHJhbmRvbSg4MDAwKSk7CisKKy8qIFdlaXRlcmUgV2VydGU6IFBfKE1BWClfRk9PRCwgUF8oTUFYKV9EUklOSywgUF8oTUFYKV9BTENPSE9MLCAgICAgICAqLworLyogUF9NU0dJTiwgUF9NU0dPVVQsIFBfTU1TR0lOLCBQX01NU0dPVVQsIFBfTUFYX0hBTkRTICAgICAgICAgICAgICAgICovCisKKy8qIFNwZXppZWxsZSBJbmZvcyAoZnVlciBkZW4gSWRlbnRpZml6aWVyZS1TcHJ1Y2gpICovCisgIFNldFByb3AoUF9JTkZPLCBicmVha19zdHJpbmcoCisgICAgIkRlciBSb3RhdWdlbnZhbXBpciBsYWVzc3Qgc2ljaCB2aWVsbGVpY2h0IG1pdCBLbm9ibGF1Y2ggdmVydHJlaWJlbi4iLAorICAgIDc4KSk7CisKKy8qIE5QQyBrb2VubmVuIGVpbmVyIEtsYXNzZSBhbmdlaG9lcmVuIHVuZCBXYWZmZW4ga29lbm50ZW4gei5CLiBnZWdlbgorICogYmVzdGltbXRlIEtsYXNzZW4vUmFzc2VuIGJlc29uZGVycyAoaW4pZWZmZWt0aXYgc2Vpbi4KKyAqLworICBBZGRDbGFzcygoe0NMX1ZBTVBJUkUsQ0xfVU5ERUFEfSkpOworCisvKiBSZXNpc3RlbnplbiAobmVnYXRpdikgdW5kIEFuZmFlbGxpZ2tlaXRlbiAocG9zaXRpdikgKi8KKyAgU2V0UHJvcChQX1JFU0lTVEFOQ0VfU1RSRU5HVEhTLCAoWworICAgICAgICBEVF9CTFVER0VPTjowLjIsRFRfUklQOjAuMiwKKyAgICAgICAgRFRfTUFHSUM6IC0wLjIsIERUX0NPTEQ6IC0wLjEsIERUX1RFUlJPUjogLTAuOCBdKSApOworICAKKy8vIFdlciBoYXQgZGVuIFNwaWVsZXIgZ2VraWxsdCB1bmQgd2FzIHNhZ3QgbWFuIGRhbm4/CisgIFNldFByb3AoUF9LSUxMX05BTUUsIkVpbiBSb3RhdWdlbnZhbXBpciIpOworICBTZXRQcm9wKFBfS0lMTF9NU0csKHsiR3Jvc3NhcnRpZyAlcyEgRWluIHdlaXRlcmVzIE9wZmVyIGZ1ZXIgWmVzc3RyYSEiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgTVNHX1NBWX0pKTsKKworICAvLyBiZXNjaHdlcmRlIGF1ZiAtbW9lcmRlcgorICBTZXRQcm9wKFBfTVVSREVSX01TRywiRHUgc3RlY2tzdCBkb2NoIG1pdCBKb2YgaW0gQnVuZGUsICVzISIpOworICBTZXRQcm9wKFBfRElFX01TRywiIGJyaWNodCBzdG9laG5lbmQgenVzYW1tZW4uXG4iKTsKKworICAvLyBBdWNoIE5QQyBzb2xsdGVuIERldGFpbHMgaGFiZW46CisgIEFkZERldGFpbCggKHsiYXVnZW4iLCJhdWdlbmxpZGVyIiwibGlkZXIifSksIGJyZWFrX3N0cmluZygKKyAgICAiRGVyIFJvdGF1Z2VudmFtcGlyIHNjaGF1dCBEaWNoIG1pdCB3ZWl0IGF1Zmdlcmlzc2VuZW4sIHJvdCAiCisgICAgInNjaGltbWVybmRlbiBBdWdlbiB3aWxkIGFuLiIsNzgpKTsKKyAgLy8gLi4uCisKKyAgLy8gcmllY2h0IGRlciBuYWNoIHdhcz8gLT4gQWRkU21lbGxzKCkKKyAgCisgIC8vIEthbm4gbWFuIGRlbiBuYWNoIHdhcyBmcmFnZW4/IC0+IEFkZEluZm8oKS4KKworfQorCmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3JvdGF1Z2VudmFtcGlyZS9yb3RhdWdlbnZhbXBpcm1hZ2llci5jIGIvZG9jL2JlaXNwaWVsZS9yb3RhdWdlbnZhbXBpcmUvcm90YXVnZW52YW1waXJtYWdpZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmM1YWFmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9yb3RhdWdlbnZhbXBpcmUvcm90YXVnZW52YW1waXJtYWdpZXIuYwpAQCAtMCwwICsxLDc3IEBACisvKgorICAgRWluIG1hZ2lzY2ggYmVnYWJ0ZXIgQmVpc3BpZWwtTlBDICh2b24gWmVzc3RyYSwgYW5nZWxlaG50IGFuIEJvaW5ncworICAgYnNwbW9uMS5jKQorKi8KKworLy8gRGllc2UgUHJhZ21hcyBzb3JnZW4gZGFmdWVyLCBkYXNzIGRlciBEcml2ZXIgZGFyYXVmIGFjaHRldCwgZGFzcyBiZWkKKy8vIEZ1bmt0aW9uc2FyZ3VtZW50ZW4sIC1SdWVja2dhYmV3ZXJ0ZW4gdW5kIHRlaWx3ZWlzZSBiZWkgWnV3ZWlzdW5nIHZvbgorLy8gV2VydGVuIGFuIFZhcmlhYmxlbiBkZXIgcmljaHRpZ2UgRGF0ZW50eXAgdmVyd2VuZGV0IHdpcmQgKHouYi4ga2VpbiBzdHJpbmcKKy8vIGFuc3RlbGxlIGVpbmVzIGludCB2ZXJ3ZW5kZXQgd2lyZCkuIFNvbGx0ZSBpbiBrZWluZW0gT2JqZWt0IGZlaGxlbi4KKyNwcmFnbWEgc3Ryb25nX3R5cGVzLCBzYXZlX3R5cGVzLCBydHRfY2hlY2tzCisvLyBFaW5pZ2UgV2FybnVuZ2VuIHdlcmRlbiBhbHMgRmVobGVyIGJldHJhY2h0ZXQgKGVtcGZvaGxlbikKKyNwcmFnbWEgcGVkYW50aWMsIHJhbmdlX2NoZWNrCisvLyBTY2hhbHRldCBiZXN0aW1tdGUgV2FybnVuZ2VuIGVpbiAoZW1wZm9obGVuKQorI3ByYWdtYSB3YXJuX2RlcHJlY2F0ZWQsIHdhcm5fZW1wdHlfY2FzdHMsIHdhcm5fbWlzc2luZ19yZXR1cm4KKyNwcmFnbWEgd2Fybl9mdW5jdGlvbl9pbmNvbnNpc3RlbnQKKworLy8gRGllc2VyIE5QQyBzb2xsIGVpbiBSb3RhdWdlbnZhbXBpciBzZWluLCBkZXIgZWluIHBhYXIgU3BlbGxzIGthbm4uIFVuZCBuZW4KKy8vIFJvdGF1Z2VudmFtcGlyIGdpYnQgZXMgc2Nob24uIEFsc28gZWluZmFjaCBkZW4gbm9ybWFsZW4gUm90YXVnZW52YW1waXIKKy8vIGF1cyBkaWVzZW0gVmVyemVpY2huaXMgZXJiZW4uCitpbmhlcml0IF9fRElSX18rInJvdGF1Z2VudmFtcGlyIjsKKworLy8gSW5rbHVkaWVydCBEZWZpbml0aW9uZW4gZnVlciBQcm9wZXJ0aWVzCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICAvLyBOaWNodCB2ZXJnZXNzZW4sIG9obmUgZGFzIGdlaHQgbmljaHRzLiBGdWVocnQgZGFzIGNyZWF0ZSgpIGRlcyBnZWVyYnRlbgorICAvLyBSb3RhdWdlbnZhbXBpciBhdXMgdW5kIGtvbmZpZ3VyaWVydCBpaG4uCisgIDo6Y3JlYXRlKCk7CisKKy8qIERpZSBLdXJ6YmVzY2hyZWlidW5nIHdpcmQgenVtIEJlaXNwaWVsIGFuZ2V6ZWlndCB3ZW5uIG1hbiBpbiBlaW5lbiBSYXVtCisgICBtaXQgZGVtIE1vbnN0ZXIgcmVpbmxhZXVmdCAqLworICBTZXRQcm9wKFBfU0hPUlQsICJSb3RhdWdlbnZhbXBpcm1hZ2llciIpOworCisvKiBCZWltIEFuc2NoYXVlbiBkZXMgTW9uc3RlcnMgd2lyZCBkaWUgbG9uZy1kZXNjcmlwdGlvbiBhbmdlemVpZ3QsCisgKiBaZWlsZW51bWJydWNoIG5hY2ggQmVkYXJmIG5hY2ggNzggWmVpY2hlbi4gKi8KKyAgU2V0UHJvcChQX0xPTkcsIGJyZWFrX3N0cmluZygKKyAgICAiRWluIGZpbnN0ZXIgYXVzc2VoZW5kZXIgUm90YXVnZW52YW1waXIgaW4gZWluZXIgS3V0dGUuIiw3OCkpOworCisvKiBFaW4gTmFtZSBtdXNzIHNlaW4sIGRhIHNvbnN0IHouQi4gaW0gVG9kZXNmYWxsICdMZWljaGUgdm9uIDAnIGRhbGllZ3QgKi8KKyAgU2V0UHJvcChQX05BTUUsICJSb3RhdWdlbnZhbXBpcm1hZ2llciIpOworICBTZXRQcm9wKFBfTkFNRV9BREosImxpc3RlbnJlaWNoIik7CisKKyAgLy8gZmFzdCBhbGxlIEVpZ2Vuc2NoYWZ0ZW4gdWViZXJuZWhtZW4gd2lyIGVpbmZhY2ggdW52ZXJhZW5kZXJ0IHVudmVyYWVuZGVydAorICAvLyB2b20gbm9ybWFsZW4gUm90YXVnZW52YW1waXIuIERpZSBIYW5kcyBuaWNodCwgZGVyIE1hZ2llciBoYXV0IG5pY2h0IHNvCisgIC8vIGd1dCB6dS4uLgorICBTZXRQcm9wKFBfSEFORFMsICh7IiBtaXQgc2VpbmVuIEhhZW5kZW4iLCA4NX0pKTsKKworICAvLyBvaywgc3BpZWx0IHdlbmlnIFJvbGxlIGluIGRpZXNlbSBGYWxsLCBhYmVyIGRhbWl0cyBzdGlsZWNodCBpc3QsIGtyaWVndAorICAvLyBkZXIgaGllciBqZXR6dCBldHdhcyBtZWhyIGFuIE1hZ2llcHVua3RlbiAoc3BlbGxwb2ludHMpCisgIFNldFByb3AoUF9NQVhfU1AsIDM1MCk7CisKKyAgLy8gdW5kIG5vY2ggZWluIHBhYXIgU3BlbGxzCisgIC8vIEFubWVya3VuZzogZGllc2UgU3BlbGxzIGhhYmVuIG5pY2h0cyBtaXQgaXJnZW5kd2VsY2hlbiBHaWxkZW5zcGVsbHMgenUKKyAgLy8gdHVuIHVuZCAtIGphLCB0YXRzYWVjaGxpY2ggLSB2ZXJicmF1Y2hlbiBrZWluZSBNYWdpZXB1bmt0ZS4uLgorCisgIC8vIHdhaHJzY2hlaW5saWNoa2VpdCBpbiAlIHBybyBydW5kZSwgZWluZW4gU3BlbGwgenUgY2FzdGVuOgorICBTZXRQcm9wKFBfU1BFTExSQVRFLDMwKTsKKyAgLy8gRWluIFNwZWxsLCBkZXIgMTAwIFNjaGFkZW5zcHVua3RlIG1hY2h0IHVuZCBpbiA2MCUgZGVyIEZhZWxsZSBhdXNnZXdhZWhsdAorICAvLyB3aXJkLiBFcnN0ZSBNZWxkdW5nIGdlaHQgYW4gZGVuIFNwaWVsZXIsIGRpZSB6d2VpdGUgYW4gZGVuIFJhdW0uCisgIC8vIFNjaGFkZW5zdHlwIGlzdCBTY2hsYWdzY2hhZGVuLgorICBBZGRTcGVsbCg2MCwxMDAsCisgICAgYnJlYWtfc3RyaW5nKE5hbWUoV0VSKSArICIgbWFjaHQgZWluZSBIYW5kYmV3ZWd1bmcgdm9yIERlaW5lbSBHZXNpY2h0LiAiCisgICAgICAiU28gYWJnZWxlbmt0IHN0b2xwZXJzdCBEdSBpbiBmYWVsbHN0IGhhcnQgenUgQm9kZW4uIiw3OCksCisgICAgYnJlYWtfc3RyaW5nKE5hbWUoV0VSKSArICIgbWFjaHQgZWluZSBIYW5kYmV3ZWd1bmcgdm9yIEBXRVNTRU4gR2VzaWNodC4gIgorICAgICAgIkBXRVIgc3RvbHBlcnQgdW5kIGZhZWxsdCBoYXJ0IGF1ZiBkZW4gQm9kZW4uIiw3OCksCisgICAgKHtEVF9CTFVER0VPTn0pICk7CisgIC8vIEVpbiBTcGVsbCwgZGVyIDgwMCBTY2hhZGVuc3B1bmt0ZSBtYWNodCB1bmQgaW4gNDAlIGRlciBGYWVsbGUgYXVzZ2V3YWVobHQKKyAgLy8gd2lyZC4gU2NoYWRlbnN0eXA6IEZldWVyLgorICBBZGRTcGVsbCg0MCw4MDAsCisgICAgYnJlYWtfc3RyaW5nKE5hbWUoV0VSKSArICIgc2NoYXV0IERpY2ggbWl0IGJyZW5uZW5kZW4gQXVnZW4gIgorICAgICAgImR1cmNoZHJpbmdlbmQgYW4uIER1IGdsYXVic3QsIGlubmVybGljaCB6dSB2ZXJicmVubmVuLiIsNzgpLAorICAgIGJyZWFrX3N0cmluZyhOYW1lKFdFUikgKyAiIHNjaGF1dCBAV0VOIG1pdCBnbHVlaGVuZGVuIEF1Z2VuIGFuLiAiCisgICAgICAiQFdFUiBrcnVlbW10IHNpY2ggdm9yIFNjaG1lcnplbi4iLDc4KSwKKyAgICAoe0RUX0ZJUkV9KSApOworfQorCmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3JvdGF1Z2VudmFtcGlyZS9yb3RhdWdlbnZhbXBpcm1hZ2llcmluLmMgYi9kb2MvYmVpc3BpZWxlL3JvdGF1Z2VudmFtcGlyZS9yb3RhdWdlbnZhbXBpcm1hZ2llcmluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUwNmUxZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvcm90YXVnZW52YW1waXJlL3JvdGF1Z2VudmFtcGlybWFnaWVyaW4uYwpAQCAtMCwwICsxLDQ4IEBACisvKgorICAgRWluIG1hZ2lzY2ggYmVnYWJ0ZXIgQmVpc3BpZWwtTlBDICh2b24gWmVzc3RyYSwgYW5nZWxlaG50IGFuIEJvaW5ncworICAgYnNwbW9uMS5jKQorICAgSW4gZGllc2VtIEZhbGwgc29sbCBlaW5lIE1hZ2llcmluIHNlaW4sIGRpZSBhYmVyIGRpZSBnbGVpY2hlbiBTdGF0cyB3aWUgZGVyCisgICBtYWVubmxpY2hlIEtvbGxlZ2UgaGF0LgorKi8KKworLy8gRGllc2UgUHJhZ21hcyBzb3JnZW4gZGFmdWVyLCBkYXNzIGRlciBEcml2ZXIgZGFyYXVmIGFjaHRldCwgZGFzcyBiZWkKKy8vIEZ1bmt0aW9uc2FyZ3VtZW50ZW4sIC1SdWVja2dhYmV3ZXJ0ZW4gdW5kIHRlaWx3ZWlzZSBiZWkgWnV3ZWlzdW5nIHZvbgorLy8gV2VydGVuIGFuIFZhcmlhYmxlbiBkZXIgcmljaHRpZ2UgRGF0ZW50eXAgdmVyd2VuZGV0IHdpcmQgKHouYi4ga2VpbiBzdHJpbmcKKy8vIGFuc3RlbGxlIGVpbmVzIGludCB2ZXJ3ZW5kZXQgd2lyZCkuIFNvbGx0ZSBpbiBrZWluZW0gT2JqZWt0IGZlaGxlbi4KKyNwcmFnbWEgc3Ryb25nX3R5cGVzLCBzYXZlX3R5cGVzLCBydHRfY2hlY2tzCisvLyBFaW5pZ2UgV2FybnVuZ2VuIHdlcmRlbiBhbHMgRmVobGVyIGJldHJhY2h0ZXQgKGVtcGZvaGxlbikKKyNwcmFnbWEgcGVkYW50aWMsIHJhbmdlX2NoZWNrCisvLyBTY2hhbHRldCBiZXN0aW1tdGUgV2FybnVuZ2VuIGVpbiAoZW1wZm9obGVuKQorI3ByYWdtYSB3YXJuX2RlcHJlY2F0ZWQsIHdhcm5fZW1wdHlfY2FzdHMsIHdhcm5fbWlzc2luZ19yZXR1cm4KKyNwcmFnbWEgd2Fybl9mdW5jdGlvbl9pbmNvbnNpc3RlbnQKKworLy8gRGllc2VyIE5QQyBzb2xsIGVpbmUgUm90YXVnZW52YW1waXJtYWdpZXJpbiBzZWluLiBVbmQgbmVuCisvLyBSb3RhdWdlbnZhbXBpcm1hZ2llciBnaWJ0IGVzIHNjaG9uLiBBbHNvIGVpbmZhY2ggZGVuIG5vcm1hbGVuCisvLyBSb3RhdWdlbnZhbXBpcm1hZ2llciBhdXMgZGllc2VtIFZlcnplaWNobmlzIGVyYmVuLgoraW5oZXJpdCBfX0RJUl9fKyJyb3RhdWdlbnZhbXBpcm1hZ2llciI7CisKKy8vIElua2x1ZGllcnQgRGVmaW5pdGlvbmVuIGZ1ZXIgUHJvcGVydGllcworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPiAvLyBmdWVyIEZFTUFMRS1EZWZpbmUKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgLy8gTmljaHQgdmVyZ2Vzc2VuLCBvaG5lIGRhcyBnZWh0IG5pY2h0cy4gRnVlaHJ0IGRhcyBjcmVhdGUoKSBkZXMgZ2VlcmJ0ZW4KKyAgLy8gUm90YXVnZW52YW1waXJtYWdpZXJzIGF1cyB1bmQga29uZmlndXJpZXJ0IGlobi4KKyAgOjpjcmVhdGUoKTsKKworICAvLyBHZXNjaGxlY2h0IGFlbmRlcm4uCisgIFNldFByb3AoUF9HRU5ERVIsIEZFTUFMRSk7CisKKyAgLy8gS3Vyei0gdW5kIExhbmdiZXNjaHJlaWJ1bmcgYWVuZGVybi4KKyAgU2V0UHJvcChQX1NIT1JULCAiUm90YXVnZW52YW1waXJtYWdpZXJpbiIpOworICBTZXRQcm9wKFBfTE9ORywgYnJlYWtfc3RyaW5nKAorICAgICJFaW5lIGZpbnN0ZXIgYXVzc2VoZW5kZSBSb3RhdWdlbnZhbXBpcm1hZ2llcmluIGluIGVpbmVyIEt1dHRlLiIsNzgpKTsKKworICAvLyBOYW1lIGFucGFzc2VuCisgIFNldFByb3AoUF9OQU1FLCAiUm90YXVnZW52YW1waXJtYWdpZXJpbiIpOworCisgIC8vIE1lbGR1bmcgYW5wYXNzZW4uCisgIFNldFByb3AoUF9IQU5EUywgKHsiIG1pdCBpaHJlbiBIYWVuZGVuIiwgODV9KSk7Cit9CisKZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc2hhZG93L2FhLmMgYi9kb2MvYmVpc3BpZWxlL3NoYWRvdy9hYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OWQ3ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3NoYWRvdy9hYS5jCkBAIC0wLDAgKzEsOCBAQAorICAgICB2b2lkIGZ1bigpIHsKKyAgICAgICAgIHByaW50ZigiJU8gW2FdIGZ1bigpXG4iLCB0aGlzX29iamVjdCgpKTsKKyAgICAgfQorCisgICAgIHZvaWQgZnVuMygpIHsKKyAgICAgICAgIHByaW50ZigiJU8gW2FdIGZ1bjMoKVxuIiwgdGhpc19vYmplY3QoKSk7CisgICAgIH0KKwpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9zaGFkb3cvYmIuYyBiL2RvYy9iZWlzcGllbGUvc2hhZG93L2JiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM3NzA5MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvc2hhZG93L2JiLmMKQEAgLTAsMCArMSwxMyBAQAorICAgICBpbnQgZnVuKCkgeworICAgICAgICAgcHJpbnRmKCIlTyBbYl0gZnVuKClcbiIsIHRoaXNfb2JqZWN0KCkpOworICAgICAgICAgZmluZF9vYmplY3QoIi9kb2MvYmVpc3BpZWxlL3NoYWRvdy9hYSIpLT5mdW4oKTsKKyAgICAgfQorCisgICAgIHZvaWQgZnVuMigpIHsKKyAgICAgICAgIHByaW50ZigiJU8gW2JdIGZ1bjIoKVxuIiwgdGhpc19vYmplY3QoKSk7CisgICAgICAgICBmaW5kX29iamVjdCgiL2RvYy9iZWlzcGllbGUvc2hhZG93L2FhIiktPmZ1bjMoKTsKKyAgICAgICAgIHRoaXNfb2JqZWN0KCktPmZ1bjMoKTsKKyAgICAgfQorCisgICAgIHZvaWQgZG9fc2hhZG93KG9iamVjdCB0YXJnZXQpIHsgc2hhZG93KHRhcmdldCwgMSk7IH0KKwpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9zaGFkb3cvY2MuYyBiL2RvYy9iZWlzcGllbGUvc2hhZG93L2NjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFhNjBlZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvc2hhZG93L2NjLmMKQEAgLTAsMCArMSwxMSBAQAorICAgICBpbnQgZnVuKCkgeworICAgICAgICAgcHJpbnRmKCIlTyBbY10gZnVuKClcbiIsIHRoaXNfb2JqZWN0KCkpOworICAgICAgICAgZmluZF9vYmplY3QoIi9kb2MvYmVpc3BpZWxlL3NoYWRvdy9hYSIpLT5mdW4oKTsKKyAgICAgfQorCisgICAgIHZvaWQgZnVuMygpIHsKKyAgICAgICAgIHByaW50ZigiJU8gW2NdIGZ1bjMoKVxuIiwgdGhpc19vYmplY3QoKSk7CisgICAgIH0KKworICAgICB2b2lkIGRvX3NoYWRvdyhvYmplY3QgdGFyZ2V0KSB7IHNoYWRvdyh0YXJnZXQsIDEpOyB9CisKZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc2hhZG93L2xvYWRtZS5jIGIvZG9jL2JlaXNwaWVsZS9zaGFkb3cvbG9hZG1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ2ZTRkNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvc2hhZG93L2xvYWRtZS5jCkBAIC0wLDAgKzEsMjQgQEAKK3ZvaWQgY3JlYXRlKCkgeworICAgICBvYmplY3QgYSwgYiwgYzsKKworICAgICBpZiAoZmluZF9vYmplY3QoIi9kb2MvYmVpc3BpZWxlL3NoYWRvdy9hYSIpKQorICAgICAgIGRlc3RydWN0KGZpbmRfb2JqZWN0KCIvZG9jL2JlaXNwaWVsZS9zaGFkb3cvYWEiKSk7CisgICAgIGEgPSBsb2FkX29iamVjdCgiL2RvYy9iZWlzcGllbGUvc2hhZG93L2FhIik7CisgICAgIGlmIChmaW5kX29iamVjdCgiL2RvYy9iZWlzcGllbGUvc2hhZG93L2JiIikpCisgICAgICAgZGVzdHJ1Y3QoZmluZF9vYmplY3QoIi9kb2MvYmVpc3BpZWxlL3NoYWRvdy9iYiIpKTsKKyAgICAgYiA9IGxvYWRfb2JqZWN0KCIvZG9jL2JlaXNwaWVsZS9zaGFkb3cvYmIiKTsKKyAgICAgaWYgKGZpbmRfb2JqZWN0KCIvZG9jL2JlaXNwaWVsZS9zaGFkb3cvY2MiKSkKKyAgICAgICBkZXN0cnVjdChmaW5kX29iamVjdCgiL2RvYy9iZWlzcGllbGUvc2hhZG93L2NjIikpOworICAgICBjID0gbG9hZF9vYmplY3QoIi9kb2MvYmVpc3BpZWxlL3NoYWRvdy9jYyIpOworCisgICAgIGItPmRvX3NoYWRvdyhhKTsKKyAgICAgYy0+ZG9fc2hhZG93KGEpOworICAgICBwcmludGYoIi0tLSBhLT5mdW4oKSAtLS1cbiIpOworICAgICBhLT5mdW4oKTsKKyAgICAgcHJpbnRmKCItLS0gYi0+ZnVuKCkgLS0tXG4iKTsKKyAgICAgYi0+ZnVuKCk7CisgICAgIHByaW50ZigiLS0tIGMtPmZ1bigpIC0tLVxuIik7CisgICAgIGMtPmZ1bigpOworICAgICBwcmludGYoIi0tLSBiLT5mdW4yKCkgLS0tXG4iKTsKKyAgICAgYi0+ZnVuMigpOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9zc3AvUkVBRE1FIGIvZG9jL2JlaXNwaWVsZS9zc3AvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMWNhZDEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3NzcC9SRUFETUUKQEAgLTAsMCArMSwzIEBACitEaWVzZSBEYXRlaWVuIHNpbmQgbnVyIGFscyBCZWlzcGllbGUgenUgdmVyd2VuZGVuIHVuZCBuaWNodCBpbiBlaW5lbQorYW5kZXJlbiBNdWQgYWxzIGRlbSBNb3JnZW5HcmF1ZW4gZnVlciBTcGllbGVyIHp1Z2FlbmdsaWNoIHp1IG1hY2hlbi4KKyAgQm9pbmcKZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL2ZpbGVzLmggYi9kb2MvYmVpc3BpZWxlL3NzcC9maWxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNTk1MWEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3NzcC9maWxlcy5oCkBAIC0wLDAgKzEsMTMgQEAKKyNkZWZpbmUgU00oeCkgKCIvZG9jL2JlaXNwaWVsZS9zc3AvIit4KQorI2RlZmluZSBMMSh4KSAoU00oImwxLyIreCkpCisjZGVmaW5lIEwyKHgpIChTTSgibDIvIit4KSkKKyNkZWZpbmUgTDMoeCkgKFNNKCJsMy8iK3gpKQorI2RlZmluZSBMNCh4KSAoU00oImw0LyIreCkpCisjZGVmaW5lIEw1KHgpIChTTSgibDUvIit4KSkKKyNkZWZpbmUgTDYoeCkgKFNNKCJsNi8iK3gpKQorI2RlZmluZSBNT04oeCkgKFNNKCJtb24vIit4KSkKKyNkZWZpbmUgT0JKKHgpIChTTSgib2JqLyIreCkpCisKKyNkZWZpbmUgTE9HX09CSiAiL3BsYXllcnMvYm9pbmcvb2JqL2xvZ29iaiIKKyNkZWZpbmUgUEZMQU5aRSAiL2RvYy9iZWlzcGllbGUvc3NwL21vbi9wZmxhbnplIgorI2RlZmluZSBNTU9OU1QgIi9kb2MvYmVpc3BpZWxlL3NzcC9tb24vbWV0YWxsbW9uc3RlciIKZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL2wxL20xeDEuYyBiL2RvYy9iZWlzcGllbGUvc3NwL2wxL20xeDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTU0MzcyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTF4MS5jCkBAIC0wLDAgKzEsMzAgQEAKK2luaGVyaXQgInN0ZC9yb29tIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxyb29tcy5oPgorI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisKK2NyZWF0ZSgpCit7CisgIHJlcGxhY2VfcHJvZ3JhbSgic3RkL3Jvb20iKTsKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX0xJR0hULCAwKTsKKyAgU2V0UHJvcChQX0lORE9PUlMsIDEpOworICBTZXRQcm9wKFBfSU5UX1NIT1JULCAiTWV0YWxsZWJlbmUiKTsKKyAgU2V0UHJvcChQX0lOVF9MT05HLAorICAiRHUgYmlzdCBpbSBIb2VobGVubGFieXJpbnRoIGRlciBTY2hyZWNrZW5zc3BpdHplLiBEZXIgUmF1bSBpc3QgZ2VmdWVsbHRcbiIrCisgICJtaXQgZ3JhdS1ibGF1ZW0gUmF1Y2gsIGRlciB2b24gZGVtIGdyb3NzZW4gRHJhY2hlbiBzdGFtbXQsIGRlciBpaG4gYmUtXG4iKworICAid29obnQuIEVzIGlzdCBzZWhyIHdhcm0gaGllciBkcmluIHVuZCBhbiBkZW4gV2FlbmRlbiB1bmQgYW4gZGVyIERlY2tlXG4iKworICAia29uZGVuc2llcnQgZGVyIERhbXBmIHp1IGtsZWluZW4gVHJvcGZlbi4gRGVyIGVpbnppZ2UgQXVzZ2FuZyBsaWVndCBpbVxuIisKKyAgIk9zdGVuLlxuIik7CisgIEFkZERldGFpbCgicmF1bSIsICJFaW4gRHJhY2hlIHdvaG50IGhpZXIgbm9ybWFsZXJ3ZWlzZS5cbiIpOworICBBZGREZXRhaWwoKHsiZHJhY2hlIiwgImRyYWNoZW4ifSksICJFciBzY2hlaW50IGdlcmFkZSBuaWNodCBkYSB6dSBzZWluLlxuIik7CisgIEFkZERldGFpbCgicmF1Y2giLCAiRGVyIFJhdWNoIHppZWh0IHp1bSBBdXNnYW5nIGltIE9zdGVuIGhpbmF1cy5cbiIpOworICBBZGREZXRhaWwoKHsid2FuZCIsICJ3YWVuZGUiLCAiYm9kZW4iLCAiZGVja2UiLCAibWV0YWxsIiwgInN0YWhsIn0pLCAiQWxsZXMgaGllciBpc3QgYXVzIHJlaW5lbSBTdGFobC5cbiIpOworICBBZGREZXRhaWwoImRhbXBmIiwgIkVyIGtvbmRlbnNpZXJ0IGFuIGRlbiBXYWVuZGVuLlxuIik7CisgIEFkZERldGFpbCgoeyJ3YXNzZXIiLCAia29uZGVuc3dhc3NlciJ9KSwgIkVzIHRyb3BmdCB6dSBCb2Rlbi5cbiIpOworICBBZGREZXRhaWwoInRyb3BmZW4iLCAiU2llIHRyb3BmZW4gYXVmIGRlbiBCb2Rlbi5cbiIpOworICBBZGREZXRhaWwoImF1c2dhbmciLCAiRXIgbGllZ3QgaW0gT3N0ZW4uXG4iKTsKKyAgQWRkSXRlbShNT04oInN0YWhsZHJhY2hlIiksIFJFRlJFU0hfUkVNT1ZFKTsKKyAgQWRkRXhpdCgib3N0ZW4iLEwxKCJtMngxIikpOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTF4Mi5jIGIvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTF4Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MTM1NWEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3NzcC9sMS9tMXgyLmMKQEAgLTAsMCArMSwyNyBAQAoraW5oZXJpdCAic3RkL3Jvb20iOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHJvb21zLmg+CisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKworY3JlYXRlKCkKK3sKKyAgcmVwbGFjZV9wcm9ncmFtKCJzdGQvcm9vbSIpOworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfTElHSFQsIDApOworICBTZXRQcm9wKFBfSU5UX1NIT1JULCAiTWV0YWxsZWJlbmUiKTsKKyAgU2V0UHJvcChQX0lOVF9MT05HLAorICAiRHUgYmlzdCBpbSBIb2VobGVubGFieXJpbnRoIGRlciBTY2hyZWNrZW5zc3BpdHplLiBJbiBkaWVzZXIgZ2VtdWV0bGljaGVuXG4iKworICAiRWNrZSAobmF0dWVybGljaCBudXIgZnVlciBNZXRhbGwgbGllYmVuZGUgTGViZXdlc2VuKSBoYXQgc2ljaCB3b2hsIGVpbmVcbiIrCisgICJkZXIgbWVya3d1ZXJkaWdlbiBUaXRhbndhbHplbiBlaW5nZW5pc3RldCwgYXVmIGplZGVuIEZhbGwgaXN0IGRlciBCb2RlblxuIisKKyAgImRlcm1hc3NlbiBwbGF0dGdld2FsenQsIHdpZSBlcyBudXIgZGllc2UgQXJ0IHNjaGFmZmVuIGthbm4uIERlciBHYW5nXG4iKworICAic2VsYnN0IGZ1ZWhydCBoaWVyIG5hY2ggU3VlZGVuIHVuZCBPc3Rlbi5cbiIpOworICBBZGREZXRhaWwoImVja2UiLCAiUmljaHRpZyBuZXR0IGhpZXIgLi4uXG4iKTsKKyAgQWRkRGV0YWlsKCh7IndhbmQiLCAid2FlbmRlIiwgImRlY2tlIiwgIm1ldGFsbCJ9KSwgIkFsbGVzIGhpZXIgaXN0IGF1cyBNZXRhbGwuXG4iKTsKKyAgQWRkRGV0YWlsKCh7IndhbHplIiwgInRpdGFud2FsemUifSksICJEaWUgVGl0YW53YWx6ZSBzY2hlaW50IGdlcmFkZSBuaWNodCBkYWhlaW0genUgc2Vpbi5cbiIpOworICBBZGREZXRhaWwoImJvZGVuIiwgIkRlciBCb2RlbiBpc3QgYWJzb2x1dCBwbGF0dC5cbiIpOworICBBZGREZXRhaWwoImdhbmciLCAiRWluIGF1cyBNZXRhbGwgZ2VhcmJlaXRldGVyIEdhbmcuXG4iKTsKKyAgQWRkRXhpdCgic3VlZGVuIixMMSgibTF4MyIpKTsKKyAgQWRkRXhpdCgib3N0ZW4iLEwxKCJtMngyIikpOworICBBZGRJdGVtKE1PTigidGl0YW53YWx6ZSIpLCBSRUZSRVNIX1JFTU9WRSk7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3NzcC9sMS9tMXgzLmMgYi9kb2MvYmVpc3BpZWxlL3NzcC9sMS9tMXgzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA5MzAyOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvc3NwL2wxL20xeDMuYwpAQCAtMCwwICsxLDI0IEBACitpbmhlcml0ICJzdGQvcm9vbSI7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKworY3JlYXRlKCkKK3sKKyAgcmVwbGFjZV9wcm9ncmFtKCJzdGQvcm9vbSIpOworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfTElHSFQsIDApOworICBTZXRQcm9wKFBfSU5ET09SUywgMSk7CisgIFNldFByb3AoUF9JTlRfU0hPUlQsICJNZXRhbGxlYmVuZSIpOworICBTZXRQcm9wKFBfSU5UX0xPTkcsCisgICJEdSBiaXN0IGltIEhvZWhsZW5sYWJ5cmludGggZGVyIFNjaHJlY2tlbnNzcGl0emUuIEVpbmUgbGFuZ2UgTWV0YWxscm9laHJlXG4iKworICAiZnVlaHJ0IHdlaXRlciB2b24gU3VlZGVuIG5hY2ggTm9yZGVuIHVuZCBzY2hlaW50IGtlaW4gRW5kZSB6dSBuZWhtZW4uIERlaW5lXG4iKworICAiU2Nocml0dGUgaGFsbGVuIGJsZWNoZXJuIGR1cmNoIGRpZSBHYWVuZ2UgdW5kIGluZm9ybWllcmVuIGRlcmVuIEJld29obmVyXG4iKworICAidWViZXIgRGVpbmUgQW53ZXNlbmhlaXQuXG4iKTsKKyAgQWRkRGV0YWlsKCh7Im1ldGFsbHJvZWhyZSIsICJyb2VocmUiLCAiZ2FuZyIsICJnYWVuZ2UifSksICJEdSBiZWZpbmRlc3QgRGljaCBpbiBlaW5lciBsYW5nZW4gTWV0YWxscm9laHJlLlxuIik7CisgIEFkZERldGFpbCgibWV0YWxsIiwgIkRhcyBNZXRhbGwgc2llaHQgc2VociBzdGFiaWwgYXVzLlxuIik7CisgIEFkZERldGFpbCgoeyJib2RlbiIsICJkZWNrZSIsICJ3YW5kIiwgIndhZW5kZSJ9KSwgIkFsbGVzIGlzdCBhdXMgTWV0YWxsLlxuIik7CisgIEFkZERldGFpbCgiYmV3b2huZXIiLCAiSGllciBzY2hlaW5lbiBrZWluZSB6dSBzZWluLlxuIik7CisgIEFkZEV4aXQoIm5vcmRlbiIsTDEoIm0xeDIiKSk7CisgIEFkZEV4aXQoInN1ZWRlbiIsTDEoIm0xeDQiKSk7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3NzcC9sMS9tMXg0LmMgYi9kb2MvYmVpc3BpZWxlL3NzcC9sMS9tMXg0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI3OWFhZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvc3NwL2wxL20xeDQuYwpAQCAtMCwwICsxLDI0IEBACitpbmhlcml0ICJzdGQvcm9vbSI7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKworY3JlYXRlKCkKK3sKKyAgcmVwbGFjZV9wcm9ncmFtKCJzdGQvcm9vbSIpOworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfTElHSFQsIDApOworICBTZXRQcm9wKFBfSU5ET09SUywgMSk7CisgIFNldFByb3AoUF9JTlRfU0hPUlQsICJNZXRhbGxlYmVuZSIpOworICBTZXRQcm9wKFBfSU5UX0xPTkcsCisgICJEdSBiaXN0IGltIEhvZWhsZW5sYWJ5cmludGggZGVyIFNjaHJlY2tlbnNzcGl0emUuIERpZSBNZXRhbGxyb2VocmUsIGluIGRlclxuIisKKyAgIkR1IERpY2ggYmVmaW5kZXN0IGZ1ZWhydCB2b24gU3VlZGVuIG5hY2ggTm9yZGVuLiBBdWNoIGhpZXIga2xpbmd0IGRlciBCb2RlblxuIisKKyAgInVudGVyIERlaW5lbiBGdWVzc2VuIHJlY2h0IGhvaGwsIGVzIGlzdCB3b2hsIHdpcmtsaWNoIGV0d2FzIEJlc29uZGVyZXNcbiIrCisgICJkYXJ1bnRlci4gQWxsZXJkaW5ncyBzaW5kIGtlaW5lcmxlaSBBbnplaWNoZW4gZnVlciBlaW5lbiBadWdhbmcgenUgc2VoZW4uXG4iKTsKKyAgQWRkRGV0YWlsKCh7ImdhbmciLCAicm9laHJlIiwgIm1ldGFsbHJvZWhyZSJ9KSwgIkRlciBHYW5nIGZ1ZWhydCBuYWNoIE5vcmRlbiB1bmQgU3VlZGVuLlxuIik7CisgIEFkZERldGFpbCgibWV0YWxsIiwgIkhhcnRlcywgZ2xhZW56ZW5kZXMgTWV0YWxsLlxuIik7CisgIEFkZERldGFpbCgoeyJ3YW5kIiwgIndhZW5kZSIsICJib2RlbiIsICJkZWNrZSJ9KSwgIkFsbGVzIGlzdCBhdXMgTWV0YWxsLlxuIik7CisgIEFkZERldGFpbCgienVnYW5nIiwgIkVzIGlzdCBrZWluZXIgenUgc2VoZW4uXG4iKTsKKyAgQWRkRXhpdCgibm9yZGVuIixMMSgibTF4MyIpKTsKKyAgQWRkRXhpdCgic3VlZGVuIixMMSgibTF4NSIpKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL2wxL20xeDUuYyBiL2RvYy9iZWlzcGllbGUvc3NwL2wxL20xeDUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTRmYjZhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTF4NS5jCkBAIC0wLDAgKzEsMzEgQEAKK2luaGVyaXQgInN0ZC9yb29tIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxyb29tcy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisKK2NyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9MSUdIVCwgMCk7CisgIFNldFByb3AoUF9JTkRPT1JTLCAxKTsKKyAgU2V0UHJvcChQX0lOVF9TSE9SVCwgIk1ldGFsbGViZW5lIik7CisgIFNldFByb3AoUF9JTlRfTE9ORywKKyAgIkR1IGJpc3QgaW0gSG9laGxlbmxhYnlyaW50aCBkZXIgU2NocmVja2Vuc3NwaXR6ZS4gRGVyIHZvZWxsaWcgbWl0IE1ldGFsbFxuIisKKyAgInZlcmtsZWlkZXRlIEdhbmcgbWFjaHQgaGllciBlaW5lIEJpZWd1bmcgdm9uIE9zdGVuIG5hY2ggTm9yZGVuLCB3byBlclxuIisKKyAgImluIGRpZSBzY2h3YXJ6ZSBEdW5rZWxoZWl0IGZ1ZWhydC4gRGVpbmUgU2Nocml0dGUgaGFsbGVuIGhpZXIgbGVpY2h0IG5hY2gsXG4iKworICAiZXMgc2NoZWludCBzaWNoIHdvaGwgZWluIEhvaGxyYXVtIHVudGVyIGRlbSBCb2RlbiB6dSBiZWZpbmRlbi5cbiIpOworICBBZGREZXRhaWwoIm1ldGFsbCIsICJFcyBzY2hlaW50IEVpc2VuIG9kZXIgU3RhaGwgenUgc2Vpbi5cbiIpOworICBBZGREZXRhaWwoKHsiZWlzZW4iLCAic3RhaGwifSksICJEdSB3ZWlzc3QgbmljaHQgZ2VuYXUsIG9iIGVzIEVpc2VuIG9kZXIgU3RhaGwgaXN0LlxuIik7CisgIEFkZERldGFpbCgoeyJnYW5nIiwgInJvZWhyZSJ9KSwgIkRlciBHYW5nIG1hY2h0IGVpbmVuIEtuaWNrLlxuIik7CisgIEFkZERldGFpbCgiZHVua2VsaGVpdCIsICJTaWUgdmVyc2NobGluZ3QgYWxsZXMuXG4iKTsKKyAgQWRkRGV0YWlsKCh7IndhbmQiLCAid2FlbmRlIiwgImJvZGVuIiwgImRlY2tlIn0pLCAiQWxsZXMgaXN0IGF1cyBNZXRhbGwuXG4iKTsKKyAgQWRkRGV0YWlsKCJob2hscmF1bSIsICJEdSBrYW5uc3Qga2VpbmUgSGlud2Vpc2UgYXVmIGVpbmVuIFp1Z2FuZyBmaW5kZW4uXG4iKTsKKyAgQWRkRGV0YWlsKCJ6dWdhbmciLCAiRHUgc2llaHN0IGtlaW5lbi5cbiIpOworICBBZGREZXRhaWwoKHsia25pY2siLCAiYmllZ3VuZyJ9KSwgIlNvIG5lbm50IHNpY2ggc293YXMgaGFsdCAuLi4gaWNoIGthbm4gbml4IGRhZnVlciFcbiIpOworICBBZGRJdGVtKE1PTigia2FtcGZibGVjaCIpLCBSRUZSRVNIX1JFTU9WRSk7CisgIAorICBBZGRFeGl0KCJub3JkZW4iLCBMMSgibTF4NCIpKTsKKyAgQWRkRXhpdCgib3N0ZW4iLEwxKCJtMng1IikpOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTJ4MS5jIGIvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTJ4MS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZTdhZTcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3NzcC9sMS9tMngxLmMKQEAgLTAsMCArMSwyNyBAQAoraW5oZXJpdCAic3RkL3Jvb20iOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisKK2NyZWF0ZSgpCit7CisgIHJlcGxhY2VfcHJvZ3JhbSgic3RkL3Jvb20iKTsKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX0xJR0hULCAwKTsKKyAgU2V0UHJvcChQX0lORE9PUlMsIDEpOworICBTZXRQcm9wKFBfSU5UX1NIT1JULCAiTWV0YWxsZWJlbmUiKTsKKyAgU2V0UHJvcChQX0lOVF9MT05HLAorICAiRHUgYmlzdCBpbSBIb2VobGVubGFieXJpbnRoIGRlciBTY2hyZWNrZW5zc3BpdHplLiBEaWVzZXIgR2FuZyBoaWVyIGlzdCBhdXNcbiIrCisgICJyZWluc3RlbSBTdGFobCBnZWZlcnRpZ3QsIGRlciBpbiBEZWluZW0gTGljaHQgbWF0dCBmdW5rZWx0LiBBdXMgZWluZXJcbiIrCisgICJLYW1tZXIgaW0gV2VzdGVuIGRyaW5nZW4gUmF1Y2hzY2h3YWRlbiBoZXJ2b3IgdW5kIGVpbiBTY2huYXViZW4gaXN0IHp1XG4iKworICAiaG9lcmVuLiBEdSBrYW5uc3QgZXMgYWxsZXJkaW5ncyBhdWNoIHZvcnppZWhlbiwgbmFjaCBTdWVkZW4gZGVtIFVuaGVpbFxuIisKKyAgInp1IGVudGdlaGVuLlxuIik7CisgIEFkZERldGFpbCgoeyJnYW5nIiwgImdhZW5nZSIsICJyb2VocmUiLCAicm9laHJlbiJ9KSwgIkRlciBHYW5nIG1hY2h0IGVpbmUgQmllZ3VuZyB2b24gU3VlZGVuIG5hY2ggV2VzdGVuLlxuIik7CisgIEFkZERldGFpbCgoeyJib2RlbiIsICJkZWNrZSIsICJ3YW5kIiwgIndhZW5kZSIsICJtZXRhbGwiLCAic3RhaGwifSksICJBbGxlcyBoaWVyIGlzdCBhdXMgaGFydGVtIFN0YWhsLlxuIik7CisgIEFkZERldGFpbCgia2FtbWVyIiwgIkltIFdlc3RlbiBsaWVndCBlaW5lIEthbW1lci5cbiIpOworICBBZGREZXRhaWwoKHsicmF1Y2hzY2h3YWRlbiIsICJyYXVjaCIsICJzY2h3YWRlbiJ9KSwgIkRlciBSYXVjaCB6aWVodCBkdXJjaCBlaW4gcGFhciBSaXR6ZW4gaW4gZGVyIERlY2tlIGFiLlxuIik7CisgIEFkZERldGFpbCgoeyJyaXR6ZSIsICJyaXR6ZW4ifSksICJEaWUgUml0emVuIGhhYmVuIG5pY2h0cyBCZW1lcmtlbnN3ZXJ0ZXMgYW4gc2ljaC5cbiIpOworICBBZGREZXRhaWwoInNjaG5hdWJlbiIsICJWb24gd2VtIHdvaGwgZGFzIFNjaG5hdWJlbiBrb21tdD9cbiIpOworICBBZGRFeGl0KCJ3ZXN0ZW4iLEwxKCJtMXgxIikpOworICBBZGRFeGl0KCJzdWVkZW4iLEwxKCJtMngyIikpOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTJ4Mi5jIGIvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTJ4Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZWZjY2QKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3NzcC9sMS9tMngyLmMKQEAgLTAsMCArMSwyNiBAQAoraW5oZXJpdCAic3RkL3Jvb20iOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisKK2NyZWF0ZSgpCit7CisgIHJlcGxhY2VfcHJvZ3JhbSgic3RkL3Jvb20iKTsKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX0xJR0hULCAwKTsKKyAgU2V0UHJvcChQX0lORE9PUlMsIDEpOworICBTZXRQcm9wKFBfSU5UX1NIT1JULCAiTWV0YWxsZWJlbmUiKTsKKyAgU2V0UHJvcChQX0lOVF9MT05HLAorICAiRHUgYmlzdCBpbSBIb2VobGVubGFieXJpbnRoIGRlciBTY2hyZWNrZW5zc3BpdHplLiBIaWVyIHZlcnp3ZWlndCBzaWNoIGRlclxuIisKKyAgIkdhbmcgaW4gdmVyc2NoaWVkZW5lIE1ldGFsbHJvZWhyZW4sIGRpZSBuYWNoIE5vcmRlbiwgU3VlZGVuIHVuZCBXZXN0ZW5cbiIrCisgICJmdWVocmVuLiBBdXNzZXJkZW0gaXN0IGluIGRlciBEZWNrZSBlaW4ga2xlaW5lcyBMb2NoLCBkdXJjaCBkYXMgZWluZVxuIisKKyAgIkxlaXRlciBuYWNoIG9iZW4gZnVlaHJ0LlxuIik7CisgIEFkZERldGFpbCgoeyJnYW5nIiwgImdhZW5nZSIsICJtZXRhbGxyb2VocmUiLCAibWV0YWxscm9laHJlbiIsICJyb2VocmUiLCAicm9laHJlbiJ9KSwgIkdhZW5nZSBmdWVocmVuIGluIGRpZSB2ZXJzY2hpZWRlbnN0ZW4gUmljaHR1bmdlbi5cbiIpOworICBBZGREZXRhaWwoKHsid2FuZCIsICJ3YWVuZGUiLCAiYm9kZW4iLCAibWV0YWxsIn0pLCAiSGllciBpc3QgZWluZmFjaCBhbGxlcyBhdXMgTWV0YWxsLlxuIik7CisgIEFkZERldGFpbCgibGVpdGVyIiwgIkRpZSBMZWl0ZXIgZnVlaHJ0IGR1cmNoIGVpbiBMb2NoIGluIGRlciBEZWNrZSBuYWNoIG9iZW4uXG4iKTsKKyAgQWRkRGV0YWlsKCh7ImxvY2giLCAiZGVja2UifSksICJJbiBkZXIgRGVja2UgaXN0IGVpbiBMb2NoLlxuIik7CisgIEFkZEV4aXQoInN1ZWRlbiIsTDEoIm0yeDMiKSk7CisgIEFkZEV4aXQoIm5vcmRlbiIsTDEoIm0yeDEiKSk7CisgIEFkZEV4aXQoIndlc3RlbiIsTDEoIm0xeDIiKSk7CisgIEFkZEV4aXQoIm9iZW4iLCBMMSgib2JlbiIpKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL2wxL20yeDMuYyBiL2RvYy9iZWlzcGllbGUvc3NwL2wxL20yeDMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjkxYWMyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTJ4My5jCkBAIC0wLDAgKzEsMjcgQEAKK2luaGVyaXQgInN0ZC9yb29tIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxyb29tcy5oPgorI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisKK2NyZWF0ZSgpCit7CisgIHJlcGxhY2VfcHJvZ3JhbSgic3RkL3Jvb20iKTsKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX0xJR0hULCAwKTsKKyAgU2V0UHJvcChQX0lORE9PUlMsIDEpOworICBTZXRQcm9wKFBfSU5UX1NIT1JULCAiTWV0YWxsZWJlbmUiKTsKKyAgU2V0UHJvcChQX0lOVF9MT05HLAorICAiRHUgYmlzdCBpbSBIb2VobGVubGFieXJpbnRoIGRlciBTY2hyZWNrZW5zc3BpdHplLiBEZXIgR2FuZywgaW4gZGVtIER1XG4iKworICAiRGljaCBiZWZpbmRlc3QgZnVlaHJ0IHNjaG51cmdlcmFkZSB2b24gTm9yZGVuIG5hY2ggU3VlZGVuLiBEaWUgV2FlbmRlXG4iKworICAicmVmbGVrdGllcmVuIGRhcyBMaWNodCB1bmQgRGVpbmUgU2Nocml0dGUgZXJ6ZXVnZW4gZWluZW4gbWV0YWxsaXNjaGVuXG4iKworICAiS2xhbmcgYXVmIGRlbSBCb2Rlbi5cbiIpOyAKKyAgQWRkRGV0YWlsKCh7ImJvZGVuIiwgIndhbmQiLCAid2FlbmRlIiwgImRlY2tlIiwgIm1ldGFsbCJ9KSwgIkFsbGVzIGlzdCBhdXMgTWV0YWxsLlxuIik7CisgIEFkZERldGFpbCgiZ2FuZyIsICJFciBmdWVocnQgbmFjaCBOb3JkZW4gdW5kIFN1ZWRlbi5cbiIpOworICBBZGREZXRhaWwoImxpY2h0IiwgIkVzIGtvbW10IGlyZ2VuZHdvaGVyLlxuIik7CisgIEFkZERldGFpbCgic2Nocml0dGUiLCAiV2VubiBEdSBsYWV1ZnN0LCBtYWNoc3QgRHUgU2Nocml0dGUsIGRhcyB3dXNzdGVzdCBEdSBhYmVyLCBvZGVyP1xuIik7CisgIEFkZERldGFpbCgia2xhbmciLCAiRGVyIEtsYW5nIGlzdCBuaWNodCBzb25kZXJsaWNoIGludGVyZXNzYW50LCBhYmVyIHp3ZWlmZWxsb3Mgdm9yaGFuZGVuLlxuIik7CisgIEFkZEV4aXQoIm5vcmRlbiIsTDEoIm0yeDIiKSk7CisgIEFkZEV4aXQoInN1ZWRlbiIsTDEoIm0yeDQiKSk7CisgIEFkZEl0ZW0oTU9OKCJkb3Nlbm9lZmZuZXIiKSwgUkVGUkVTSF9SRU1PVkUpOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTJ4NC5jIGIvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTJ4NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NGI0NGUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3NzcC9sMS9tMng0LmMKQEAgLTAsMCArMSwyMiBAQAoraW5oZXJpdCAic3RkL3Jvb20iOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisKK2NyZWF0ZSgpCit7CisgIHJlcGxhY2VfcHJvZ3JhbSgic3RkL3Jvb20iKTsKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX0xJR0hULCAwKTsKKyAgU2V0UHJvcChQX0lORE9PUlMsIDEpOworICBTZXRQcm9wKFBfSU5UX1NIT1JULCAiTWV0YWxsZWJlbmUiKTsKKyAgU2V0UHJvcChQX0lOVF9MT05HLAorICAiRHUgYmlzdCBpbSBIb2VobGVubGFieXJpbnRoIGRlciBTY2hyZWNrZW5zc3BpdHplLiBEZXIgdm9lbGxpZyBtaXQgTWV0YWxsXG4iKworICAiYXVzZ2VzY2hsYWdlbmUgR2FuZyBtYWNodCBoaWVyIGVpbmVuIHNjaGFyZmVuIEtuaWNrIHZvbiBOb3JkZW4gbmFjaCBPc3RlblxuIisKKyAgInVuZCB2ZXJzY2h3aW5kZXQgZG9ydCBpbiBkZXIgRHVua2VsaGVpdC5cbiIpOworICBBZGREZXRhaWwoKHsid2FuZCIsICJ3YWVuZGUiLCAiYm9kZW4iLCAiZGVja2UiLCAibWV0YWxsIn0pLCAiQWxsZXMgaGllciBpc3QgYXVzIE1ldGFsbC5cbiIpOworICBBZGREZXRhaWwoImdhbmciLCAiRGVyIEdhbmcgZnVlaHJ0IG5hY2ggTm9yZGVuIHVuZCBPc3Rlbi5cbiIpOworICBBZGREZXRhaWwoImR1bmtlbGhlaXQiLCAiRHUga2FubnN0IGhpbmdlaGVuIHVuZCBzY2hhdWVuLCBvYiBzaWUgZGFubiBub2NoIGRhIGlzdC5cbiIpOworICBBZGRFeGl0KCJub3JkZW4iLEwxKCJtMngzIikpOworICBBZGRFeGl0KCJvc3RlbiIsTDEoIm0zeDQiKSk7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3NzcC9sMS9tMng1LmMgYi9kb2MvYmVpc3BpZWxlL3NzcC9sMS9tMng1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTViMGMzZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvc3NwL2wxL20yeDUuYwpAQCAtMCwwICsxLDI2IEBACitpbmhlcml0ICJzdGQvcm9vbSI7CisKKyNpbmNsdWRlIDxyb29tcy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlICIuLi9maWxlcy5oIgorCitjcmVhdGUoKQoreworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfTElHSFQsIDApOworICBTZXRQcm9wKFBfSU5ET09SUywgMSk7CisgIFNldFByb3AoUF9JTlRfU0hPUlQsICJNZXRhbGxlYmVuZSIpOworICBTZXRQcm9wKFBfSU5UX0xPTkcsCisgICJEdSBiaXN0IGltIEhvZWhsZW5sYWJ5cmludGggZGVyIFNjaHJlY2tlbnNzcGl0emUuIERpZSBXYWVuZGUgZGVzIEdhbmdlcyxcbiIrCisgICJkZXIgdm9uIE9zdGVuIG5hY2ggV2VzdGVuIChvZGVyIGFuZGVyc3J1bSkgdmVybGFldWZ0LCBzaW5kIG1pdCBnbGFlbnplbmRlbVxuIisKKyAgIk1ldGFsbCBhdXNnZWtsZWlkZXQuIElyZ2VuZHdpZSBrb21tdCBEaXIgZGllc2UgVW1nZWJ1bmcgemllbWxpY2ggc2VsdHNhbVxuIisKKyAgInZvciwgYWJlciBrZWluZSBTb3JnZSwgZXMga29tbXQgbm9jaCB2aWVsIHNjaGxpbW1lciFcbiIpOworICBBZGREZXRhaWwoKHsiZ2FuZyIsICJyb2VocmUifSksICJEZXIgR2FuZyB2ZXJsYWV1ZnQgdm9uIE9zdGVuIG5hY2ggV2VzdGVuLlxuIik7CisgIEFkZERldGFpbCgoeyJ3YW5kIiwgIndhZW5kZSIsICJkZWNrZSIsICJib2RlbiJ9KSwgIkFsbGVzIGlzdCBhdXMgZ2xhZW56ZW5kZW0gTWV0YWxsLlxuIik7CisgIEFkZERldGFpbCgibWV0YWxsIiwgIkRhcyBNZXRhbGwgaXN0IGFuIGVpbmVyIFN0ZWxsZSBsZWljaHQgZWluZ2VkZWxsdC5cbiIpOworICBBZGREZXRhaWwoKHsiZGVsbGUiLCAic3RlbGxlIiwgImJldWxlIn0pLCAiRGEgd29sbHRlIHdvaGwgamVtYW5kIG1pdCBkZW0gS29wZiBkdXJjaCBkaWUgV2FuZC5cbiIpOworICBBZGRFeGl0KCJvc3RlbiIsTDEoIm0zeDUiKSk7CisgIEFkZEV4aXQoIndlc3RlbiIsTDEoIm0xeDUiKSk7CisgIEFkZEl0ZW0oTU9OKCJkb3Nlbm9lZmZuZXIiKSwgUkVGUkVTSF9SRU1PVkUpOworICBBZGRJdGVtKE1PTigiZG9zZW5vZWZmbmVyIiksIFJFRlJFU0hfUkVNT1ZFKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL2wxL20zeDEuYyBiL2RvYy9iZWlzcGllbGUvc3NwL2wxL20zeDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDAyMmY0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTN4MS5jCkBAIC0wLDAgKzEsMzEgQEAKK2luaGVyaXQgInN0ZC9yb29tIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxyb29tcy5oPgorI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisKK2NyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9MSUdIVCwgMCk7CisgIFNldFByb3AoUF9JTkRPT1JTLCAxKTsKKyAgU2V0UHJvcChQX0lOVF9TSE9SVCwgIlN0ZWluZWJlbmUiKTsKKyAgU2V0UHJvcChQX0lOVF9MT05HLAorICAiRHUgYmlzdCBhbSBFaW5nYW5nIHp1bSBIb2VobGVubGFieXJpbnRoIGRlciBTY2hyZWNrZW5zc3BpdHplLiBFdHdhcyBMaWNodFxuIisKKyAgImRyaW5ndCB2b20gQXVzZ2FuZyBpbSBOb3JkZW4gaGVyZWluLCBkb2NoIGltIFN1ZWRlbiBsYXVlcnQgZGllIHBlY2hzY2h3YXJ6ZVxuIisKKyAgIkR1bmtlbGhlaXQuXG4iKTsKKyAgQWRkRGV0YWlsKCJlaW5nYW5nIiwgIkVzIGlzdCBkZXIgRWluZ2FuZyB6dSBtZWhyLCBhbHMgRHUgZGVua3N0LlxuIik7CisgIEFkZERldGFpbCgiYm9kZW4iLCAiRGVyIEJvZGVuIGJlc3RlaHQgYXVzIGdyYXVlbSBGZWxzLlxuIik7CisgIEFkZERldGFpbCgiZmVscyIsICJEZXIgRmVscyBpc3QgbmljaHQgYmVzb25kZXJzIGludGVyZXNzYW50LCBudXIgZ3JhdS5cbiIpOworICBBZGREZXRhaWwoKHsid2FuZCIsICJ3YWVuZGUifSksICJEaWUgV2FlbmRlIHNpbmQgdm9uIE9ya2JsdXQgYmVzY2htdXR6dC5cbiIpOworICBBZGREZXRhaWwoKHsib3JrYmx1dCIsICJibHV0In0pLCAiT3JrcyB3ZXJkZW4gaGllciB3b2hsIHp1bSBTcGFzcyBnZW1ldHplbHQuXG4iKTsKKyAgQWRkRGV0YWlsKCJkZWNrZSIsICJVZWJlciBEZWluZW0gS29wZiwgZGFzIHdpcmQgRGlyIGhpZXIgbm9jaCBvZWZ0ZXJzIHBhc3NpZXJlbi5cbiIpOworICBBZGREZXRhaWwoKHsiaG9laGxlbmxhYnlyaW50aCIsICJsYWJ5cmludGgiLCAiaG9laGxlbiJ9KSwgIkRpZXNlIExhYnlyaW50aCBlcnN0cmVja3Qgc2ljaCB1ZWJlciBldGxpY2hlIEViZW5lbiwgdmllbCBTcGFzcyBiZWltXG5Fcmt1bmRlbi5cbiIpOworICBBZGREZXRhaWwoImxpY2h0IiwgIkRhcyBsZXR6dGUgVGFnZXNsaWNodC5cbiIpOworICBBZGREZXRhaWwoImF1c2dhbmciLCAiRGVyIEF1c2dhbmcgYXVzIGRlciBEdW5rZWxoZWl0LlxuIik7CisgIEFkZERldGFpbCgiZHVua2VsaGVpdCIsICJEYXMgd2lyZCBEaXIgZG9ydCB1bnRlbiBub2NoIG9lZnRlcnMgYmVnZWduZW4uXG4iKTsKKyAgQWRkSXRlbShNT04oIm9yayIpLCBSRUZSRVNIX1JFTU9WRSk7CisgIEFkZEl0ZW0oTU9OKCJvcmsiKSwgUkVGUkVTSF9SRU1PVkUpOworICBBZGRFeGl0KCJub3JkZW4iLCAiL2QvZ2ViaXJnZS9yb29tL3NwaXR6ZTQiKTsKKyAgQWRkRXhpdCgic3VlZGVuIixMMSgibTN4MiIpKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL2wxL20zeDIuYyBiL2RvYy9iZWlzcGllbGUvc3NwL2wxL20zeDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTEzNTI3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTN4Mi5jCkBAIC0wLDAgKzEsMjkgQEAKK2luaGVyaXQgInN0ZC9yb29tIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlICIuLi9maWxlcy5oIgorCitjcmVhdGUoKQoreworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfTElHSFQsIDApOworICBTZXRQcm9wKFBfSU5ET09SUywgMSk7CisgIFNldFByb3AoUF9JTlRfU0hPUlQsICJTdGVpbmViZW5lIik7CisgIFNldFByb3AoUF9JTlRfTE9ORywKKyAgIkR1IGJpc3QgaW0gSG9laGxlbmxhYnlyaW50aCBkZXIgU2NocmVja2Vuc3NwaXR6ZS4gRWluIHNjaG1hbGVyIEdhbmcsIGRlclxuIisKKyAgInZvbiBOb3JkZW4gbmFjaCBTdWVkZW4gZnVlaHJ0LCBpc3QgaGllciBkdXJjaCBkZW4gaGFydGVuIEZlbHMgZ2VoYXVlbi5cbiIrCisgICJEZXIgR2FuZyBpc3QgbnVyIGdyb2IgYmVoYXVlbiwgZWluIFplaWNoZW4gZGFmdWVyLCBkYXNzIGhpZXIgbmljaHQgWndlcmdlXG4iKworICAiYW0gV2VyayB3YXJlbiwgc29uZGVybiBib2VzZSBXZXNlbiwgd2FocnNjaGVpbmxpY2ggT3Jrcy5cbiIpOworICBBZGREZXRhaWwoImZlbHMiLCAiRGVyIEZlbHMgaXN0IGhhcnQgdW5kIG51ciBncm9iIGJlaGF1ZW4uXG4iKTsKKyAgQWRkRGV0YWlsKCh7ImdhbmciLCAiZ2FlbmdlIn0pLCAiRGVyIEdhbmcgZnVlaHJ0IHZvbiBOb3JkZW4gbmFjaCBTdWVkZW4uXG4iKTsKKyAgQWRkRGV0YWlsKCJib2RlbiIsICJBdWYgZGVtIEJvZGVuIHNpZWhzdCBEdSB6YWhscmVpY2hlIFVlYmVycmVzdGUgdm9uIEFiZW50ZXVyZXJuLCBkaWUgbmljaHRcbnZvcnNpY2h0aWcgZ2VudWcgd2FyZW4uXG4iKTsKKyAgQWRkRGV0YWlsKCh7InJlc3QiLCAidWViZXJyZXN0IiwgInJlc3RlIiwgInVlYmVycmVzdGUiLCAiYWJlbnRldXJlciJ9KSwKKyAgIlVob2ggLi4uIGJsdXRpZ2UgU2FjaGUgLi4uXG4iKTsKKyAgQWRkRGV0YWlsKCJibHV0IiwgIldlaWEgLi4uXG4iKTsKKyAgQWRkRGV0YWlsKCh7IndhbmQiLCAid2FlbmRlIn0pLCAiRGllIFdhZW5kZSBzaW5kIGF1cyBGZWxzIHVuZCBuaWNodCBzb25kZXJsaWNoIGludGVyZXNzYW50LlxuIik7CisgIEFkZERldGFpbCgiZGVja2UiLCAiV2VubiBEdSB1ZWJlcmxlZ3N0LCB3YXMgZGEgYWxsZXMgdWViZXIgRGVpbmVtIEtvcGYgc2Nod2VidCAuLi4gb2hvaCFcbiIpOworICBBZGREZXRhaWwoKHsib3JrIiwgIm9ya3MifSksICJEYXZvbiBoYXQgZXMgc2ljaGVyIGVpbmlnZSBpbiBkZXIgTmFlaGUuXG4iKTsKKyAgQWRkRGV0YWlsKCh7Inp3ZXJnIiwgInp3ZXJnZSJ9KSwgIlp3ZXJnZSBoYWJlbiBoaWVybWl0IG5pY2h0cyB6dSB0dW4hXG4iKTsKKyAgQWRkRXhpdCgic3VlZGVuIixMMSgibTN4MyIpKTsKKyAgQWRkRXhpdCgibm9yZGVuIixMMSgibTN4MSIpKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL2wxL20zeDMuYyBiL2RvYy9iZWlzcGllbGUvc3NwL2wxL20zeDMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODRmY2U1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTN4My5jCkBAIC0wLDAgKzEsMjcgQEAKK2luaGVyaXQgInN0ZC9yb29tIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxyb29tcy5oPgorI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisKK2NyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9MSUdIVCwgMCk7CisgIFNldFByb3AoUF9JTkRPT1JTLCAxKTsKKyAgU2V0UHJvcChQX0lOVF9TSE9SVCwgIlN0ZWluZWJlbmUiKTsKKyAgU2V0UHJvcChQX0lOVF9MT05HLAorICAiRHUgYmlzdCBpbSBIb2VobGVubGFieXJpbnRoIGRlciBTY2hyZWNrZW5zc3BpdHplLiBEZXIgc2NobWFsZSBHYW5nIG1hY2h0XG4iKworICAiaGllciBlaW5lIEJpZWd1bmcgdm9uIE5vcmRlbiBuYWNoIE9zdGVuLCB3byBlciBqZXdlaWxzIGluIGRpZSBEdW5rZWxoZWl0XG4iKworICAiZnVlaHJ0LlxuIik7CisgIEFkZERldGFpbCgiZ2FuZyIsICJEZXIgR2FuZyBtYWNodCBlaW5lIEJpZWd1bmcuXG4iKTsKKyAgQWRkRGV0YWlsKCJkdW5rZWxoZWl0IiwgIlNjaHdhcnplIER1bmtlbGhlaXQuXG4iKTsKKyAgQWRkRGV0YWlsKCJib2RlbiIsICJBdWYgZGVtIEJvZGVuIGlzdCBuaWNodHMgQmVzb25kZXJlcyB6dSBzZWhlbi5cbiIpOworICBBZGREZXRhaWwoImRlY2tlIiwgIkRpZSBEZWNrZSBpc3QgdG90YWwgbGFuZ3dlaWxpZy5cbiIpOworICBBZGREZXRhaWwoKHsid2FuZCIsICJ3YWVuZGUifSksICJBbiBkZXIgV2FuZCBoYWVuZ3QgZWluZSBIYW5kLlxuIik7CisgIEFkZERldGFpbCgiaGFuZCIsICJBY2ggbmVlLCBoYXQgc2ljaCBudXIgZ2VyZWltdC5cbiIpOworICBBZGREZXRhaWwoImJpZWd1bmciLCAiU2llIGZ1ZWhydCBuYWNoIE5vcmRlbiB1bmQgT3N0ZW4uXG4iKTsKKyAgQWRkRXhpdCgibm9yZGVuIixMMSgibTN4MiIpKTsKKyAgQWRkRXhpdCgib3N0ZW4iLEwxKCJtNHgzIikpOworICBBZGRJdGVtKE1PTigib3JrIiksIFJFRlJFU0hfUkVNT1ZFKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL2wxL20zeDQuYyBiL2RvYy9iZWlzcGllbGUvc3NwL2wxL20zeDQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDk0OTJhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTN4NC5jCkBAIC0wLDAgKzEsMzkgQEAKK2luaGVyaXQgInN0ZC9yb29tIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxyb29tcy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisKK2NyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9MSUdIVCwgMCk7CisgIFNldFByb3AoUF9JTkRPT1JTLCAxKTsKKyAgU2V0UHJvcChQX0lOVF9TSE9SVCwgIk1ldGFsbGViZW5lIik7CisgIFNldFByb3AoUF9JTlRfTE9ORywKKyAgIkR1IGJpc3QgaW0gSG9laGxlbmxhYnlyaW50aCBkZXIgU2NocmVja2Vuc3NwaXR6ZS4gTWV0YWxsYmVzY2hsYWdlbmUgV2FlbmRlXG4iKworICAidW1yaW5nZW4gRGljaCBpbSBOb3JkZW4sIE9zdGVuIHVuZCBTdWVkZW4gd2FlaHJlbmQgZWluIHJvZWhyZW5hcnRpZ2VyIEdhbmdcbiIrCisgICJuYWNoIFdlc3RlbiBmdWVocnQuIEF1c3NlcmRlbSBiZWZpbmRldCBzaWNoIGltIEJvZGVuIGVpbiBMb2NoLCBkdXJjaCBkYXNcbiIrCisgICJlaW5lIExlaXRlciBuYWNoIHVudGVuIGZ1ZWhydC5cbiIpOworICBBZGREZXRhaWwoImxvY2giLCAiV2FzIGVpbmVuIGRhIHVudGVuIHdvaGwgZXJ3YXJ0ZW4gbWFnP1xuIik7CisgIEFkZERldGFpbCgibGVpdGVyIiwgIkRpZSBMZWl0ZXIgZnVlaHJ0IG5hY2ggdW50ZW4uXG4iKTsKKyAgQWRkRGV0YWlsKCJib2RlbiIsICJJbSBCb2RlbiBpc3QgZWluIExvY2guXG4iKTsKKyAgQWRkRGV0YWlsKCh7IndhbmQiLCAid2FlbmRlIiwgImRlY2tlIiwgIm1ldGFsbCJ9KSwgIkFsbGVzIGlzdCBhdXMgTWV0YWxsLlxuIik7CisgIEFkZERldGFpbCgoeyJyb2VocmUiLCAiZ2FuZyJ9KSwgIkRlciBHYW5nIGZ1ZWhydCBuYWNoIFdlc3Rlbi5cbiIpOworICBBZGRJdGVtKE1PTigidGl0YW53YWx6ZSIpLCBSRUZSRVNIX1JFTU9WRSk7CisgIEFkZEV4aXQoIndlc3RlbiIsTDEoIm0yeDQiKSk7CisgIEFkZFNwZWNpYWxFeGl0KCJ1bnRlbiIsICJ1bnRlbiIpOworfQorCit1bnRlbigpCit7CisgIGlmIChwcmVzZW50KCJ0aXRhbndhbHplIikpCisgIHsKKyAgICB3cml0ZSgiRGllIFRpdGFud2FsemUgbGFlc3N0IERpY2ggbmljaHQgdm9yYmVpLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgdGhpc19wbGF5ZXIoKS0+bW92ZShMMigibTN4NCIpLCBNX0dPLCAibmFjaCB1bnRlbiIpOworICB0aGlzX3BsYXllcigpLT5TZXRQcm9wKCJib2luZzpkcm9tX21hcmtlciIsIDEpOworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL2wxL20zeDUuYyBiL2RvYy9iZWlzcGllbGUvc3NwL2wxL20zeDUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWM1OGZhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTN4NS5jCkBAIC0wLDAgKzEsMjYgQEAKK2luaGVyaXQgInN0ZC9yb29tIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlICIuLi9maWxlcy5oIgorCitjcmVhdGUoKQoreworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfTElHSFQsIDApOworICBTZXRQcm9wKFBfSU5ET09SUywgMSk7CisgIFNldFByb3AoUF9JTlRfU0hPUlQsICJNZXRhbGxlYmVuZSIpOworICBTZXRQcm9wKFBfSU5UX0xPTkcsCisgICJEdSBiaXN0IGltIEhvZWhsZW5sYWJ5cmludGggZGVyIFNjaHJlY2tlbnNzcGl0emUuIERlciByb2VocmVuYXJ0aWdlIEdhbmdcbiIrCisgICJmdWVocnQgdm9uIE9zdGVuIG5hY2ggV2VzdGVuIGR1cmNoIGRpZSBEdW5rZWxoZWl0LCBudXIgaGllciBnbGFlbnp0IGRhc1xuIisKKyAgIk1ldGFsbCBpbiBEZWluZW0gTGljaHQuXG4iKTsKKyAgQWRkRGV0YWlsKCh7ImdhbmciLCAicm9laHJlIn0pLCAiV2VyIHdvaGwgZGllc2VuIEdhbmcgYW5nZWxlZ3QgaGF0P1xuIik7CisgIEFkZERldGFpbCgiZHVua2VsaGVpdCIsICJEdSBrYW5uc3Qgc2llIG5pY2h0IGVycmVpY2hlbiwgc29sYW5nZSBEdSBEZWluIExpY2h0IGFuIGxhZXNzdC5cbiIpOworICBBZGREZXRhaWwoIm1ldGFsbCIsICJBbGxlcyBoaWVyIGlzdCBhdXMgYmxhbmtlbSBNZXRhbGwuXG4iKTsKKyAgQWRkRGV0YWlsKCJib2RlbiIsICJaaWVtbGljaCB1bmludGVyZXNzYW50LlxuIik7CisgIEFkZERldGFpbCgoeyJ3YW5kIiwgIndhZW5kZSJ9KSwgIkhleSEgRGEgaXN0IGVpbmUgSW5zY2hyaWZ0IVxuIik7CisgIEFkZERldGFpbCgiaW5zY2hyaWZ0IiwgIkRhcyBpc3QgZXR3YXMsIHdhcyBtYW4gbGVzZW4ga2Fubi5cbiIpOworICBBZGRSZWFkRGV0YWlsKCJpbnNjaHJpZnQiLCAiRHUgbGllc3Q6IEJvaW5nIHdhciBoaWVyLlxuIik7CisgIEFkZERldGFpbCgiZGVja2UiLCAiSXN0IHNpZSBuaWNodCBodWVic2NoP1xuIik7CisgIEFkZEV4aXQoIm9zdGVuIixMMSgibTR4NSIpKTsKKyAgQWRkRXhpdCgid2VzdGVuIixMMSgibTJ4NSIpKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL2wxL200eDEuYyBiL2RvYy9iZWlzcGllbGUvc3NwL2wxL200eDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjQzNTFlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTR4MS5jCkBAIC0wLDAgKzEsMzggQEAKK2luaGVyaXQgInN0ZC9yb29tIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxyb29tcy5oPgorI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisKK2NyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9MSUdIVCwgMCk7CisgIFNldFByb3AoUF9JTlRfU0hPUlQsICJTdGVpbmViZW5lIik7CisgIFNldFByb3AoUF9JTlRfTE9ORywKKyAgIkR1IGJpc3QgaW0gSG9laGxlbmxhYnlyaW50aCBkZXIgU2NocmVja2Vuc3NwaXR6ZS4gRHUgaGFzdCBkaWUgSG9laGxlIGVpbmVzXG4iKworICAic2NocmVja2xpY2hlbiBVbnRpZXJzIGVycmVpY2h0LiBEZXIgR2VzdGFuayBpc3Qgd2lya2xpY2ggZ3JhdWVuZXJyZWdlbmRcbiIrCisgICJ1bmQgZGVyIEFuYmxpY2sgcnVtbGllZ2VuZGVyIEtub2NoZW4gdW5kIGhhbGIgdmVyd2VzdGVyIEtvZXJwZXJ0ZWlsZSB2b25cbiIrCisgICJhcm1lbiBPcGZlcm4gdHV0IHNlaW4gVWVicmlnZXMsIHVtIERpciBkZW4gQXBwZXRpdCB6dSB2ZXJkZXJiZW4uIERlclxuIisKKyAgImVpbnppZ2UgQXVzZ2FuZyBhdXMgZGllc2VtIExvY2ggYmVmaW5kZXQgc2ljaCBpbSBPc3Rlbi5cbiIpOworICBBZGREZXRhaWwoKHsiaG9laGxlIiwgImxvY2gifSksICJFaW4gdWVibGVzIExvY2gsIGluIGRhcyBEdSBoaWVyIGdlcmF0ZW4gYmlzdC5cbiIpOworICBBZGREZXRhaWwoImdlc3RhbmsiLCAiRGlyIHdpcmQgYmVpbmFoZSBzY2hsZWNodC5cbiIpOworICBBZGREZXRhaWwoKHsidGVpbGUiLCAia29lcnBlcnRlaWxlIn0pLCAiQnVhaCwgZGFzIGlzdCBqYSB3aWRlcmxpY2guXG4iKTsKKyAgQWRkRGV0YWlsKCJhdXNnYW5nIiwgIkRlciBBdXNnYW5nIGlzdCBpbSBPc3Rlbi5cbiIpOworICBBZGRTcGVjaWFsRGV0YWlsKCJrbm9jaGVuIiwgImtub2NoZW4iKTsKKyAgQWRkRGV0YWlsKCh7IndhbmQiLCAid2FlbmRlIn0pLCAiRGllIFdhZW5kZSBzaW5kIGxhbmd3ZWlsaWcgdW5kIGdyYXUuXG4iKTsKKyAgQWRkRGV0YWlsKCJkZWNrZSIsICJEaWUgRGVja2UgaXN0IHVuaW50ZXJlc3NhbnQuXG4iKTsKKyAgQWRkRGV0YWlsKCJib2RlbiIsICJEaWUgdmVyd2VzZW5kZW4gS29lcnBlcnRlaWxlIGF1ZiBkZW0gQm9kZW4gc2luZCBrZWluIHNjaG9lbmVyIEFuYmxpY2suXG4iKTsKKyAgQWRkRXhpdCgib3N0ZW4iLEwxKCJtNXgxIikpOworICBBZGRJdGVtKE1PTigidHJvbGxtb3BzIiksIFJFRlJFU0hfUkVNT1ZFKTsKK30KKwora25vY2hlbigpCit7CisgICBpZiAocHJlc2VudCgidHJvbGxtb3BzIikpCisgICAgICByZXR1cm4gIkRlciBUcm9sbG1vcHMgbGFlc3N0IG5pY2h0IHp1LCBkYXNzIER1IHNlaW4gQWJlbmRlc3NlbiBkdXJjaHd1ZWhsc3QuXG4iOworCisgICBpZiAodGhpc19wbGF5ZXIoKS0+RmluZFBvdGlvbigiRHUgd3VlaGxzdCBpbiBkZW4gS25vY2hlbiBoZXJ1bSB1bmQgZmluZGVzdCBlaW5lbiBaYXViZXJ0cmFuay5cbiIpKQorICAgICAgcmV0dXJuICIiOworICAgcmV0dXJuICJEdSB3dWVobHN0IGluIGRlbiBLbm9jaGVuIGhlcnVtLCBmaW5kZXN0IGFiZXIgbmljaHRzLlxuIjsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL2wxL200eDIuYyBiL2RvYy9iZWlzcGllbGUvc3NwL2wxL200eDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDU2ZWYyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTR4Mi5jCkBAIC0wLDAgKzEsNDEgQEAKK2luaGVyaXQgInN0ZC9yb29tIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxyb29tcy5oPgorI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisKK2NyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9MSUdIVCwgMCk7CisgIFNldFByb3AoUF9JTkRPT1JTLCAxKTsKKyAgU2V0UHJvcChQX0lOVF9TSE9SVCwgIlN0ZWluZWJlbmUiKTsKKyAgU2V0UHJvcChQX0lOVF9MT05HLAorICAiRHUgYmlzdCBpbSBIb2VobGVubGFieXJpbnRoIGRlciBTY2hyZWNrZW5zc3BpdHplLiBEYXMgaGllciBzY2hlaW50IHdvaGxcbiIrCisgICJkZXIgQXVmZW50aGFsdHNyYXVtIHZvbiBlaW4gcGFhciBzdGlua2VuZGVuIFRyb2xsZW4genUgc2Vpbi4gRWluZSBNZW5nZVxuIisKKyAgImFsdGVyIEtub2NoZW4gbGllZ2VuIGF1ZiBkZW0gQm9kZW4gcnVtIHVuZCBpbiBkZXIgRWNrZSBzdGlua3QgZWluIGdyb3NzZXJcbiIrCisgICJIYXVmZW4gVHJvbGxrb3Qgdm9yIHNpY2ggaGluLiBBbGxlcyBpbiBhbGxlbSBrZWluIGdlbXVldGxpY2hlciBPcnQsXG4iKworICAidmllbGxlaWNodCBzb2xsdGVzdCBEdSBpaG4gbmFjaCBTdWVkZW4gdmVybGFzc2VuLlxuIik7CisgIEFkZERldGFpbCgia25vY2hlbiIsICJEaWUgS25vY2hlbiB3dXJkZW4gdm9uIFRyb2xsZW4gYWJnZW5hZ3QuXG4iKTsKKyAgQWRkRGV0YWlsKCJib2RlbiIsICJBdWYgZGVtIEJvZGVuIGxpZWdlbiBLbm9jaGVuLlxuIik7CisgIEFkZERldGFpbCgiZGVja2UiLCAiRGllIERlY2tlIGhpZXIgaXN0IG5pY2h0IHNvIGdyYXVlbmhhZnQgaW50ZXJlc3NhbnQsIGljaCB3ZXR0ZSBlcyB3aXJkXG5pbnRlcmVzc2FudGVyLCB3ZW5uIER1IGVpbiBwYWFyIEViZW5lbiB0aWVmZXIgdm9yZHJpbmdzdC5cbiIpOworICBBZGREZXRhaWwoKHsiZWJlbmUiLCAiZWJlbmVuIn0pLCAiVGphLCB3ZW5uIER1IHd1ZXNzdGVzdCB3aWV2aWVsZSBIb2hscmFldW1lIHNpY2ggdW50ZXIgRGlyIGJlZmluZGVuLCBkYW5uXG53dWVyZGVzdCBEdSBoaWVyIG5pY2h0IHNvIHJ1aGlnIHN0ZWhlbi5cbiIpOworICBBZGREZXRhaWwoKHsiaG9obHJhdW0iLCAiaG9obHJhZXVtZSJ9KSwgIkVya3VuZGUgc2llISBTb2ZvcnQhXG4iKTsKKyAgQWRkRGV0YWlsKCh7IndhbmQiLCAid2FlbmRlIn0pLCAiU2llIHNpbmQgdmVyc2NobWllcnQgdW5kIGVrZWxoYWZ0LlxuIik7CisgIEFkZERldGFpbCgidHJvbGwiLCAiS2VpbmVyIGRhISBBZXRzY2hiYWV0c2NoIVxuIik7CisgIEFkZERldGFpbCgiZWNrZSIsICJXdWVyZyFcbiIpOworICBBZGREZXRhaWwoKHsidHJvbGxrb3QiLCAia290IiwgImhhdWZlbiJ9KSwgIklnaXR0ISBEYXMgc3Rpbmt0IGphIGVyYmFlcm1saWNoLlxuIik7CisgIEFkZEV4aXQoInN1ZWRlbiIsTDEoIm00eDMiKSk7CisgIEFkZEl0ZW0oTU9OKCJ0cm9sbCIpLCBSRUZSRVNIX1JFTU9WRSk7CisgIEFkZEl0ZW0oTU9OKCJ0cm9sbCIpLCBSRUZSRVNIX1JFTU9WRSk7CisgIEFkZENtZCgiZXJrdW5kZSIsICJlcmt1bmRlbiIpOworfQorCitlcmt1bmRlbihzdHIpCit7IAorICAgbm90aWZ5X2ZhaWwoIldhcyBtb2VjaHRlc3QgRHUgZXJrdW5kZW4/XG4iKTsKKyAgIGlmICghc3RyIHx8IChzdHIhPSJob2hscmF1bSIgJiYgc3RyICE9ImhvaGxyYWV1bWUiKSkKKyAgICAgIHJldHVybiAwOworICAgd3JpdGUoIkFsc28gZWluIGJpc3NjaGVuIG1laHIgbXVzc3QgRHUgZGEgc2Nob24gZnVlciB0dW4uXG4iKTsKKyAgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTR4My5jIGIvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTR4My5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NDcyYTkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3NzcC9sMS9tNHgzLmMKQEAgLTAsMCArMSwzMSBAQAoraW5oZXJpdCAic3RkL3Jvb20iOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisKK2NyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9MSUdIVCwgMCk7CisgIFNldFByb3AoUF9JTkRPT1JTLCAxKTsKKyAgU2V0UHJvcChQX0lOVF9TSE9SVCwgIlN0ZWluZWJlbmUiKTsKKyAgU2V0UHJvcChQX0lOVF9MT05HLAorICAiRHUgYmlzdCBpbSBIb2VobGVubGFieXJpbnRoIGRlciBTY2hyZWNrZW5zc3BpdHplLiBEZXIgZHVyY2ggZGVuIGhhcnRlblxuIisKKyAgIkZlbHMgZ2VoYXVlbmUgR2FuZyB2ZXJ6d2VpZ3Qgc2ljaCBoaWVyIG5hY2ggTm9yZGVuLCBPc3RlbiB1bmQgV2VzdGVuLlxuIisKKyAgIkR1IHN0ZWxsc3QgZmVzdCwgZGFzcyB2b20gTm9yZGVuIGhlciBlaW4gemllbWxpY2ggdW5hbmdlbmVobWVyIEdlcnVjaFxuIisKKyAgImtvbW10LlxuIik7CisgIEFkZERldGFpbCgiZmVscyIsICJEZXIgRmVscyB3dXJkZSB2b24gT3JrcyBvZGVyIFRyb2xsZW4gYmVhcmJlaXRldCwgdW5kIGRhcyB6aWVtbGljaCBzY2hsZWNodC5cbiIpOworICBBZGREZXRhaWwoKHsiZ2FuZyIsICJnYWVuZ2UifSksICJEZXIgR2FuZyB2ZXJ6d2VpZ3Qgc2ljaCBoaWVyLlxuIik7CisgIEFkZERldGFpbCgiZ2VydWNoIiwgIk1hbiBrb2VubnRlIGVzIGF1Y2ggR2VzdGFuayBuZW5uZW4uXG4iKTsKKyAgQWRkRGV0YWlsKCJnZXN0YW5rIiwgIldlbm4gZGVyIEhpbW1lbCBoaWVyIHNpY2h0YmFyIHdhZXJlLCB3dWVyZGUgZXMgenUgaWhtIHN0aW5rZW4uXG4iKTsKKyAgQWRkRGV0YWlsKCJib2RlbiIsICJBdWYgZGVtIEJvZGVuIGZpbmRlc3QgRHUgbmljaHRzIHZvbiBCZWRldXR1bmcuXG4iKTsKKyAgQWRkRGV0YWlsKCJkZWNrZSIsICJHcmF1ZXIgRmVscy5cbiIpOworICBBZGREZXRhaWwoKHsid2FuZCIsICJ3YWVuZGUifSksICJBbiBkZXIgV2FuZCBzaWVoc3QgRHUgZWluZSBJbnNjaHJpZnQuXG4iKTsKKyAgQWRkRGV0YWlsKCJpbnNjaHJpZnQiLCAiRHUga2FubnN0IHNpZSBsZXNlbi5cbiIpOworICBBZGRSZWFkRGV0YWlsKCJpbnNjaHJpZnQiLCAiRHUgbGllc3Q6IE5pY2h0IGFsbGVzLCB3YXMgbWFuIG5pY2h0IHNpZWh0LCBpc3QgYXVjaCB3aWNodGlnLlxuIik7CisgIEFkZERldGFpbCgoeyJvcmtzIiwgInRyb2xsZSJ9KSwgIkRpZSBsYXVmZW4gaGllciBpcmdlbmR3byBydW0gLi4uIG9kZXIgbGllZ2VuIHRvdCBpbiBkZXIgRWNrZS5cbiIpOworICBBZGREZXRhaWwoImVja2UiLCAiSW4gZGllc2VyIEVja2Ugc2luZCBqZWRlbmZhbGxzIGtlaW5lLlxuIik7CisgIEFkZEV4aXQoIm5vcmRlbiIsTDEoIm00eDIiKSk7CisgIEFkZEV4aXQoIm9zdGVuIixMMSgibTV4MyIpKTsKKyAgQWRkRXhpdCgid2VzdGVuIixMMSgibTN4MyIpKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL2wxL200eDQuYyBiL2RvYy9iZWlzcGllbGUvc3NwL2wxL200eDQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTA0ODVmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTR4NC5jCkBAIC0wLDAgKzEsMjggQEAKK2luaGVyaXQgInN0ZC9yb29tIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxyb29tcy5oPgorI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisKK2NyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9MSUdIVCwgMCk7CisgIFNldFByb3AoUF9JTkRPT1JTLCAxKTsKKyAgU2V0UHJvcChQX0lOVF9TSE9SVCwgIk1ldGFsbGViZW5lIik7CisgIFNldFByb3AoUF9JTlRfTE9ORywKKyAgIkR1IGJpc3QgaW0gSG9laGxlbmxhYnlyaW50aCBkZXIgU2NocmVja2Vuc3NwaXR6ZS4gRGllcyBpc3QgendlaWZlbGxvcyBkaWVcbiIrCisgICJIZWltYXQgZWluZXMgZGVyIGJlcnVlY2h0aWd0ZW4gRWlzZW5mcmVzc2VyLCBkaWUgV2FlbmRlIHNlaGVuIGF1Y2ggc2Nob25cbiIrCisgICJnYW56IHplcm5hZ3QgYXVzLiBEZXIgZWluemlnZSBBdXNnYW5nIGZ1ZWhydCBuYWNoIFN1ZWRlbi5cbiIpOworICBBZGREZXRhaWwoKHsid2FuZCIsICJ3YWVuZGUifSksICJEaWUgV2FlbmRlIHNpbmQgYXVzIHJlaW5lbSBFaXNlbiB1bmQgd3VyZGVuIHZvbiBlaW5lbSBFaXNlbmZyZXNzZXIgc2Nob25cbnppZW1saWNoIHN0YXJrIG1pc3NoYW5kZWx0LlxuIik7CisgIEFkZERldGFpbCgiYm9kZW4iLCAiRGVyIEJvZGVuIGlzdCBhdXMgTWV0YWxsIHVuZCBmdW5rZWx0IGltIExpY2h0LiBTb2xsdGVzdCBEdSBuYXR1ZXJsaWNoIE5hY2h0LVxuc2ljaHQgaGFiZW4sIGRhbm4gZnVua2VsdCBlcyBudXIgaW4gRGVpbmVyIEVpbmJpbGR1bmcuXG4iKTsKKyAgQWRkRGV0YWlsKCJkZWNrZSIsICJEaWUgRGVja2UgaGF0IGVpbmUgZ2V3YWx0aWdlIExhc3QgenUgdHJhZ2VuLlxuIik7CisgIEFkZERldGFpbCgibGFzdCIsICJGcmFnIG1pY2ggbmljaHQgd2lldmllbGUgVG9ubmVuIEdlc3RlaW4gc2ljaCB1ZWJlciBEaXIgYmVmaW5kZW4uXG4iKTsKKyAgQWRkRGV0YWlsKCJnZXN0ZWluIiwgIlNvd2FzIGdpYnQgZXMgaW0gR2ViaXJnZSwgd2VubiBlcyBhdWNoIGhpZXIgbmljaHQgc28gb2ZmZW5zaWNodGxpY2ggaXN0LlxuIik7CisgIEFkZERldGFpbCgiZ2ViaXJnZSIsICJBY2ggaG9lciBkb2NoIGF1ZiAuLi5cbiIpOworICBBZGREZXRhaWwoImVpc2VuZnJlc3NlciIsICJEZXIgaGF0IHNpY2ggd29obCB6dSBUb2RlIGdlZnJlc3Nlbi5cbiIpOworICBBZGREZXRhaWwoKHsibWV0YWxsIiwgImVpc2VuIn0pLCAiRXMgZ2xhZW56dCBtYXR0LlxuIik7CisgIEFkZERldGFpbCgiYXVzZ2FuZyIsICJFciBsaWVndCBpbSBTdWVkZW4uXG4iKTsKKyAgQWRkSXRlbShNT04oImVpc2VuZnJlc3NlciIpLCBSRUZSRVNIX1JFTU9WRSk7CisgIEFkZEV4aXQoInN1ZWRlbiIsTDEoIm00eDUiKSk7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3NzcC9sMS9tNHg1LmMgYi9kb2MvYmVpc3BpZWxlL3NzcC9sMS9tNHg1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY0Nzc0YgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvc3NwL2wxL200eDUuYwpAQCAtMCwwICsxLDI2IEBACitpbmhlcml0ICJzdGQvcm9vbSI7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKworY3JlYXRlKCkKK3sKKyAgcmVwbGFjZV9wcm9ncmFtKCJzdGQvcm9vbSIpOworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfTElHSFQsIDApOworICBTZXRQcm9wKFBfSU5ET09SUywgMSk7CisgIFNldFByb3AoUF9JTlRfU0hPUlQsICJNZXRhbGxlYmVuZSIpOworICBTZXRQcm9wKFBfSU5UX0xPTkcsCisgICJEdSBiaXN0IGltIEhvZWhsZW5sYWJ5cmludGggZGVyIFNjaHJlY2tlbnNzcGl0emUuIERpZSBtZXRhbGxpc2NoZW4gUm9laHJlblxuIisKKyAgInZlcnp3ZWlnZW4gc2ljaCBoaWVyIG5hY2ggTm9yZGVuLCBPc3RlbiB1bmQgV2VzdGVuLiBJbSBOb3JkZW4gc2NoZWludCBldHdhc1xuIisKKyAgIlVuYW5nZW5laG1lcyB6dSBsYXVlcm4sIG1lcmt3dWVyZGlnZSBHZXJhZXVzY2hlIGRyaW5nZW4gdm9uIGRvcnQgaGllcmhlci5cbiIpOworICBBZGREZXRhaWwoKHsid2FuZCIsICJ3YWVuZGUiLCAicm9laHJlIiwgInJvZWhyZW4iLCAiZ2FlbmdlIiwgImdhbmcifSksICJEaWUgR2FlbmdlIHNpbmQgdm9lbGxpZyBtaXQgTWV0YWxsIGF1c2dla2xlaWRldC5cbiIpOworICBBZGREZXRhaWwoIm1ldGFsbCIsICJEYXMgTWV0YWxsIGdsYWVuenQgc2lsYmVybi5cbiIpOworICBBZGREZXRhaWwoInVuYW5nZW5laG1lcyIsICJXZXIgd2Vpc3MsIHdhcyBzaWNoIGRvcnQgdmVyYmlyZ3QgLi4uXG4iKTsKKyAgQWRkRGV0YWlsKCJib2RlbiIsICJEdSBiaXN0IGZyb2gsIGRhc3MgZXMgaGllciBlaW5lbiBCb2RlbiBnaWJ0LCBzb25zdCB3dWVyZGVzdCBEdSB0aWVmIGZhbGxlbi5cbiIpOworICBBZGREZXRhaWwoImRlY2tlIiwgIkRpZSBEZWNrZSBpc3QgbWV0YWxsaXNjaCB1bmQgZ2xhZW56dC5cbiIpOworICBBZGREZXRhaWwoKHsiZ2VyYWV1c2NoIiwgImdlcmFldXNjaGUifSksICJFcyBxdWlldHNjaHQuXG4iKTsKKyAgQWRkRXhpdCgibm9yZGVuIixMMSgibTR4NCIpKTsKKyAgQWRkRXhpdCgib3N0ZW4iLEwxKCJtNXg1IikpOworICBBZGRFeGl0KCJ3ZXN0ZW4iLEwxKCJtM3g1IikpOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTV4MS5jIGIvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTV4MS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NjVhOTEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3NzcC9sMS9tNXgxLmMKQEAgLTAsMCArMSwyNiBAQAoraW5oZXJpdCAic3RkL3Jvb20iOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisKK2NyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9MSUdIVCwgMCk7CisgIFNldFByb3AoUF9JTkRPT1JTLCAxKTsKKyAgU2V0UHJvcChQX0lOVF9TSE9SVCwgIlN0ZWluZWJlbmUiKTsKKyAgU2V0UHJvcChQX0lOVF9MT05HLAorICAiRHUgYmlzdCBpbSBIb2VobGVubGFieXJpbnRoIGRlciBTY2hyZWNrZW5zc3BpdHplLiBEZXIgZ3JvYiBiZWhhdWVuZSBHYW5nXG4iKworICAibWFjaHQgaGllciBlaW5lIEJpZWd1bmcgdm9uIFN1ZWRlbiBuYWNoIFdlc3Rlbiwgd28gZXIgaW4gZWluZW0gc2Nod2FyemVuXG4iKworICAiTG9jaCB2ZXJzY2h3aW5kZXQsIGF1cyBkZW0gZWluIGZ1ZXJjaHRlcmxpY2hlciBHZXN0YW5rIGRyaW5ndC5cbiIpOyAKKyAgQWRkRGV0YWlsKCJnYW5nIiwgIkRlciBHYW5nIGZ1ZWhydCBpbiBkaWUgRHVua2VsaGVpdC5cbiIpOworICBBZGREZXRhaWwoImR1bmtlbGhlaXQiLCAiU2Nod2FyemUsIGxpY2h0bG9zZSBEdW5rZWxoZWl0LlxuIik7CisgIEFkZERldGFpbCgibG9jaCIsICJIaWVyIGxhdWVydCBpcmdlbmQgZXR3YXMgU2NocmVja2xpY2hlcy5cbiIpOworICBBZGREZXRhaWwoImdlc3RhbmsiLCAiRGVyIEdlc3RhbmsgaXN0IHdpcmtsaWNoIGdyYXVlbmhhZnQuXG4iKTsKKyAgQWRkRGV0YWlsKCJib2RlbiIsICJIb3BwbGEsIGhpZXIgbGllZ2VuIEZsZWlzY2hmZXR6ZW4gcnVtLCBpbSBXZXN0ZW4gc2NoZWludCB3b2hsIHdhcyB6dSB3dWV0ZW4uXG4iKTsKKyAgQWRkRGV0YWlsKCh7ImZsZWlzY2hmZXR6ZW4iLCAiZmV0emVuIiwgImZsZWlzY2gifSksICJJc3QgamEgZWtsaWchXG4iKTsKKyAgQWRkRGV0YWlsKCh7IndhbmQiLCAid2FlbmRlIn0pLCAiRGllIFdhZW5kZSBzaW5kIHZlcnNjaG1pZXJ0LlxuIik7CisgIEFkZERldGFpbCgiZGVja2UiLCAiR2FlaG4uXG4iKTsKKyAgQWRkRXhpdCgid2VzdGVuIixMMSgibTR4MSIpKTsKKyAgQWRkRXhpdCgic3VlZGVuIixMMSgibTV4MiIpKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL2wxL201eDIuYyBiL2RvYy9iZWlzcGllbGUvc3NwL2wxL201eDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWY2YTVmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTV4Mi5jCkBAIC0wLDAgKzEsMjYgQEAKK2luaGVyaXQgInN0ZC9yb29tIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlICIuLi9maWxlcy5oIgorCitjcmVhdGUoKQoreworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfTElHSFQsIDApOworICBTZXRQcm9wKFBfSU5ET09SUywgMSk7CisgIFNldFByb3AoUF9JTlRfU0hPUlQsICJTdGVpbmViZW5lIik7CisgIFNldFByb3AoUF9JTlRfTE9ORywKKyAgIkR1IGJpc3QgaW0gSG9laGxlbmxhYnlyaW50aCBkZXIgU2NocmVja2Vuc3NwaXR6ZS4gRWluIG1pdCByb2hlciBHZXdhbHQgaW5cbiIrCisgICJkZW4gRmVscyBnZW5hZ3RlciBHYW5nIGZ1ZWhydCB2b24gU3VlZGVuIG5hY2ggTm9yZGVuLiBEdSBzcHVlcnN0LCBkYXNzXG4iKworICAiaGludGVyIGplZGVyIEVja2UgT3JrcyBvZGVyIGFuZGVyZXMgdWVibGVzIEdlenVlY2h0IGxhdWVybiBrb2VubmVuLlxuIik7CisgIEFkZERldGFpbCgoeyJnYW5nIiwgImdhZW5nZSJ9KSwgIkRlciBHYW5nIGZ1ZWhydCB2b24gU3VlZGVuIG5hY2ggTm9yZGVuLlxuIik7CisgIEFkZERldGFpbCgiZmVscyIsICJFcyBpc3QgZWluIGhhcnRlciBGZWxzLCBkZXIgdm9uIGJvZXNlbiBXZXNlbiBkdXJjaGJvaHJ0IHd1cmRlLlxuIik7CisgIEFkZERldGFpbCgoeyJvcmsiLCAib3JrcyIsICJnZXp1ZWNodCJ9KSwgIk1vbWVudGFuIHNpZWhzdCBEdSBrZWluZSBPcmtzLCBhYmVyIGRhcyBrYW5uIHNpY2ggamEgc2NobmVsbCBhZW5kZXJuLlxuIik7CisgIEFkZERldGFpbCgiYm9kZW4iLCAiQmxhbmtlciBGZWxzLlxuIik7CisgIEFkZERldGFpbCgiZmVscyIsICJEYXMgd2lyZCBhbGxtYWVobGljaCBsYW5nd2VpbGlnLlxuIik7CisgIEFkZERldGFpbCgiZGVja2UiLCAiQW4gZGVyIERlY2tlIGhhZW5ndCBlaW5lIGJ1bnRlIEdpcmxhbmRlLlxuIik7CisgIEFkZERldGFpbCgiZ2lybGFuZGUiLCAiV2VyIGRpZSB3b2hsIGRhIGF1ZmdlaGFlbmd0IGhhdD9cbiIpOworICBBZGREZXRhaWwoKHsid2FuZCIsICJ3YWVuZGUifSksICJEYSBnaWJ0IGVzIG5pY2h0cyBpbnRlcmVzc2FudGVzIHp1IHNlaGVuLlxuIik7CisgIEFkZEV4aXQoIm5vcmRlbiIsTDEoIm01eDEiKSk7CisgIEFkZEV4aXQoInN1ZWRlbiIsTDEoIm01eDMiKSk7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3NzcC9sMS9tNXgzLmMgYi9kb2MvYmVpc3BpZWxlL3NzcC9sMS9tNXgzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdkNGNlNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvc3NwL2wxL201eDMuYwpAQCAtMCwwICsxLDMyIEBACitpbmhlcml0ICJzdGQvcm9vbSI7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bW92aW5nLmg+CisjaW5jbHVkZSA8cm9vbXMuaD4KKyNpbmNsdWRlICIuLi9maWxlcy5oIgorCitjcmVhdGUoKQoreworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfTElHSFQsIDApOworICBTZXRQcm9wKFBfSU5ET09SUywgMSk7CisgIFNldFByb3AoUF9JTlRfU0hPUlQsICJTdGVpbmViZW5lIik7CisgIFNldFByb3AoUF9JTlRfTE9ORywKKyAgIkR1IGJpc3QgaW0gSG9laGxlbmxhYnlyaW50aCBkZXIgU2NocmVja2Vuc3NwaXR6ZS4gRHVua2xlIEdhZW5nZSBmdWVocmVuXG4iKworICAibmFjaCBOb3JkZW4sIFN1ZWRlbiB1bmQgV2VzdGVuLiBEZXIgc3VlZGxpY2hlIEdhbmcgaXN0IGV0d2FzIG1lcmt3dWVyZGlnLFxuIisKKyAgImRlbm4gc2VpbiBFaW5nYW5nIGlzdCBtaXQgZ2xhZW56ZW5kZW0gTWV0YWxsIHNlbHRzYW0gYmVzY2hsYWdlbi5cbiIpOworICBBZGREZXRhaWwoKHsiZmVsc2JvZGVuIiwgImJvZGVuIn0pLCAiRGVyIGJsYW5rZSBGZWxzYm9kZW4gZ2VodCBpbSBTdWVkZW4gaW4gTWV0YWxsIHVlYmVyLlxuIik7CisgIEFkZERldGFpbCgoeyJnYW5nIiwgImdhZW5nZSJ9KSwgIkVzIHNpbmQgR2FlbmdlIGRlciBPcmtzLlxuIik7CisgIEFkZERldGFpbCgiZWluZ2FuZyIsICJJbSBTdWVkZW4gZ2xhZW56ZW4gZGllIFdhZW5kZSwgZGllIG1pdCBNZXRhbGwgYmVzY2hsYWdlbiBzaW5kLlxuIik7CisgIEFkZERldGFpbCgoeyJ3YW5kIiwgIndhZW5kZSJ9KSwgIkRpZSBXYWVuZGUgc2luZCBkYSAuLi4gd2llIGltbWVyLlxuIik7CisgIEFkZERldGFpbCgiZGVja2UiLCAiRGllIERlY2tlIGlzdCBuaWNodCBpbnRlcmVzc2FudC5cbiIpOworICBBZGREZXRhaWwoImZlbHMiLCAiR3JhdWVyIEZlbHMuXG4iKTsKKyAgQWRkRGV0YWlsKCJtZXRhbGwiLCAiRXMgc2NoZWludCBFaXNlbiB6dSBzZWluLlxuIik7CisgIEFkZERldGFpbCgiZWlzZW4iLCAiSmEsIHp3ZWlmZWxsb3MsIGVzIGlzdCBFaXNlbi5cbiIpOworICBBZGRFeGl0KCJ3ZXN0ZW4iLEwxKCJtNHgzIikpOworICBBZGRFeGl0KCJub3JkZW4iLEwxKCJtNXgyIikpOworICBBZGRFeGl0KCJzdWVkZW4iLEwxKCJtNXg0IikpOworCisgIEFkZEl0ZW0oTU9OKCJvcmtjaGVmIiksIFJFRlJFU0hfUkVNT1ZFKTsKK30KKwpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTV4NC5jIGIvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTV4NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NWQxNWUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3NzcC9sMS9tNXg0LmMKQEAgLTAsMCArMSwyNSBAQAoraW5oZXJpdCAic3RkL3Jvb20iOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisKK2NyZWF0ZSgpCit7CisgIHJlcGxhY2VfcHJvZ3JhbSgic3RkL3Jvb20iKTsKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX0xJR0hULCAwKTsKKyAgU2V0UHJvcChQX0lORE9PUlMsIDEpOworICBTZXRQcm9wKFBfSU5UX1NIT1JULCAiTWV0YWxsZWJlbmUiKTsKKyAgU2V0UHJvcChQX0lOVF9MT05HLAorICAiRHUgYmlzdCBpbSBIb2VobGVubGFieXJpbnRoIGRlciBTY2hyZWNrZW5zc3BpdHplLiBEZXIgR2FuZywgZGVyIGhpZXIgdm9uXG4iKworICAiTm9yZGVuIG5hY2ggU3VlZGVuIGZ1ZWhydCwgYWVobmVsdCBtZWhyIGVpbmVyIFJvZWhyZSwgZGVubiBhbGxlcyBpc3Qgdm9sbC1cbiIrCisgICJzdGFlbmRpZyBhdXMgZWluZW0gZ2xhZW56ZW5kZW4gTWV0YWxsLiBEdSBmcmFnc3QgRGljaCwgd2VyIHdvaGwgZGllc2VcbiIrCisgICJHYWVuZ2UgYW5nZWxlZ3QgaGF0LlxuIik7CisgIEFkZERldGFpbCgoeyJnYW5nIiwgImdhZW5nZSIsICJyb2VocmUiLCAicm9ociJ9KSwgIkRpZSBHYWVuZ2Ugc2luZCB2b2VsbGlnIG1pdCBNZXRhbGwgYXVzZ2VrbGVpZGV0LlxuIik7CisgIEFkZERldGFpbCgibWV0YWxsIiwgIkRhcyBNZXRhbGwgZ2xhZW56dCBzaWxiZXJuLlxuIik7CisgIEFkZERldGFpbCgoeyJ3YW5kIiwgIndhZW5kZSJ9KSwgIkRpZSBXYWVuZGUgZ2xhZW56ZW4gc2lsYmVybi5cbiIpOworICBBZGREZXRhaWwoImJvZGVuIiwgIlNlaSBmcm9oLCBkYXNzIGVyIGRhIGlzdC5cbiIpOworICBBZGREZXRhaWwoImRlY2tlIiwgIkRpZSBEZWNrZSBpc3Qgd2lya2xpY2ggemllbWxpY2ggbGFuZ3dlaWxpZy5cbiIpOworICBBZGRFeGl0KCJub3JkZW4iLEwxKCJtNXgzIikpOworICBBZGRFeGl0KCJzdWVkZW4iLEwxKCJtNXg1IikpOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTV4NS5jIGIvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTV4NS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmOTliYTEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3NzcC9sMS9tNXg1LmMKQEAgLTAsMCArMSwyNyBAQAoraW5oZXJpdCAic3RkL3Jvb20iOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHJvb21zLmg+CisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKworY3JlYXRlKCkKK3sKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX0xJR0hULCAwKTsKKyAgU2V0UHJvcChQX0lORE9PUlMsIDEpOworICBTZXRQcm9wKFBfSU5UX1NIT1JULCAiTWV0YWxsZWJlbmUiKTsKKyAgU2V0UHJvcChQX0lOVF9MT05HLAorICAiRHUgYmlzdCBpbSBIb2VobGVubGFieXJpbnRoIGRlciBTY2hyZWNrZW5zc3BpdHplLiBFaWdlbnRsaWNoIGtvZW5udGUgbWFuXG4iKworICAiZXMgYXVjaCBmYXN0IFJvZWhyZW5sYWJ5cmludGggbmVubmVuLCBkZW5uIER1IGJlZmluZGVzdCBEaWNoIGluIGVpbmVyXG4iKworICAic29sY2hlbiwgZGllIGhpZXIgZWluZSBCaWVndW5nIHZvbiBOb3JkZW4gbmFjaCBXZXN0ZW4gbWFjaHQuIERpZSBXYWVuZGVcbiIrCisgICJzaW5kIGF1cyBlaW5lbSBnbGFlbnplbmRlbiBNZXRhbGwgZ2VmZXJ0aWd0LCB3YXMgRGlyIHppZW1saWNoIG1lcmt3dWVyZGlnXG4iKworICAidm9ya29tbXQuXG4iKTsKKyAgQWRkRGV0YWlsKCh7IndhbmQiLCAid2FlbmRlIiwgInJvZWhyZSIsICJyb2VocmVuIiwgImdhZW5nZSIsICJnYW5nIn0pLCAiRGllIEdhZW5nZSBzaW5kIHZvZWxsaWcgbWl0IE1ldGFsbCBhdXNnZWtsZWlkZXQuXG4iKTsKKyAgQWRkRGV0YWlsKCJtZXRhbGwiLCAiRGFzIE1ldGFsbCBnbGFlbnp0IHNpbGJlcm4uXG4iKTsKKyAgQWRkRGV0YWlsKCJib2RlbiIsICJEZXIgQm9kZW4gaXN0IGF1cyBNZXRhbGwuXG4iKTsKKyAgQWRkRGV0YWlsKCJkZWNrZSIsICJTZWxic3QgZGllIERlY2tlIGdsYWVuenQgbWV0YWxsaXNjaCwgRHUgZnJhZ3N0IERpY2gsIHdlciBkYXMgYW5nZWxlZ3QgaGF0LlxuIik7CisgIEFkZERldGFpbCgiYmllZ3VuZyIsICJEaWUgQmllZ3VuZyBmdWVocnQgdm9uIE5vcmRlbiBuYWNoIFdlc3Rlbi5cbiIpOworICBBZGRJdGVtKE1PTigia2FtcGZibGVjaCIpLCBSRUZSRVNIX1JFTU9WRSk7CisgIEFkZEV4aXQoIm5vcmRlbiIsTDEoIm01eDQiKSk7CisgIEFkZEV4aXQoIndlc3RlbiIsTDEoIm00eDUiKSk7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3NzcC9sMS9vYmVuLmMgYi9kb2MvYmVpc3BpZWxlL3NzcC9sMS9vYmVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNiYzAzOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvc3NwL2wxL29iZW4uYwpAQCAtMCwwICsxLDI3IEBACitpbmhlcml0ICJzdGQvcm9vbSI7CisgCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHJvb21zLmg+CisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKyAKK2NyZWF0ZSgpCit7CisgIHJlcGxhY2VfcHJvZ3JhbSgic3RkL3Jvb20iKTsKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX0xJR0hULCAwKTsKKyAgU2V0UHJvcChQX0lORE9PUlMsIDEpOworICBTZXRQcm9wKFBfSU5UX1NIT1JULCAiQmVpbSBLbm9jaGVuc2NoYWVsZXIiKTsKKyAgU2V0UHJvcChQX0lOVF9MT05HLAorICAiRHUgYmlzdCBpbSBIb2VobGVubGFieXJpbnRoIGRlciBTY2hyZWNrZW5zc3BpdHplLiBEaWVzZXIga2xlaW5lIFJhdW0gaXN0XG4iKworICAiZGllIEhlaW1hdCBlaW5lcyBmdWVyY2h0ZXJsaWNoZW4gVW5nZWhldWVycywgZGllIEhlaW1hdCBkZXMgc2NocmVja2xpY2hlblxuIisKKyAgIktub2NoZW5zY2hhZWxlcnMuIEltIEJvZGVuIGRlcyBSYXVtcyBpc3QgZWluIGtsZWluZXMgTG9jaCwgZHVyY2ggZGFzIGVpbmVcbiIrCisgICJMZWl0ZXIgbmFjaCB1bnRlbiBmdWVocnQuXG4iKTsKKyAgQWRkRGV0YWlsKCJyYXVtIiwgIkRlciBSYXVtIGlzdCB6aWVtbGljaCBrbGVpbi5cbiIpOworICBBZGREZXRhaWwoKHsid2FuZCIsICJkZWNrZSIsICJ3YWVuZGUiLCAibWV0YWxsIn0pLCAiQWxsZXMgaXN0IGF1cyBNZXRhbGwuXG4iKTsKKyAgQWRkRGV0YWlsKCh7ImJvZGVuIiwgImxvY2gifSksICJJbSBCb2RlbiBpc3QgZWluIExvY2gsIGR1cmNoIGRhcyBlaW5lIExlaXRlciBuYWNoIHVudGVuIGZ1ZWhydC5cbiIpOworICBBZGREZXRhaWwoImxlaXRlciIsICJEaWUgTGVpdGVyIGZ1ZWhydCBuYWNoIHVudGVuLlxuIik7CisgIEFkZERldGFpbCgidW5nZWhldWVyIiwgIkRlciBLbm9jaGVuc2NoYWVsZXIgaXN0IGVpbmZhY2ggZnVlcmNodGVybGljaC5cbiIpOworICBBZGREZXRhaWwoImtub2NoZW5zY2hhZWxlciIsICJadW0gR2x1ZWNrIGlzdCBlciBnZXJhZGUgbmljaHQgZGFoZWltLlxuIik7CisgIEFkZEl0ZW0oTU9OKCJrbm9jaGVuc2NoYWVsZXIiKSwgUkVGUkVTSF9SRU1PVkUpOworICBBZGRFeGl0KCJ1bnRlbiIsIEwxKCJtMngyIikpOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9zc3AvbW9uL2Rvc2Vub2VmZm5lci5jIGIvZG9jL2JlaXNwaWVsZS9zc3AvbW9uL2Rvc2Vub2VmZm5lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZDYyN2MKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3NzcC9tb24vZG9zZW5vZWZmbmVyLmMKQEAgLTAsMCArMSwyNCBAQAorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlICIuLi9maWxlcy5oIgorCitpbmhlcml0IE1NT05TVDsKKworY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgIDo6Y3JlYXRlKCk7CisgICBBZGRJZCgoeyJkb3Nlbm9lZmZuZXIiLCAib2VmZm5lciJ9KSk7CisgICBBZGRBZGplY3RpdmUoKHsibW9iaWxlciIsICJtb2JpbGVuIn0pKTsKKyAgIFNldFByb3AoUF9TSE9SVCwgIkVpbiBtb2JpbGVyIERvc2Vub2VmZm5lciIpOworICAgU2V0UHJvcChQX0xPTkcsICJEZXIgRG9zZW5vZWZmbmVyIG1vZWNodGUgRGlyIHNpY2hlcmxpY2ggZGVuIEtvcGYgbWl0IHNlaW5lbiBzY2hhcmZlblxuU2NobmVpZGVyYWVkZXJuIG9lZmZuZW4uXG4iKTsKKyAgIFNldFByb3AoUF9OQU1FLCAiRG9zZW5vZWZmbmVyIik7CisgICBTZXRQcm9wKFBfR0VOREVSLCAxKTsKKyAgIFNldFByb3AoUF9MRVZFTCwgMTIpOworICAgU2V0UHJvcChQX01BWF9IUCwgMTIwKTsKKyAgIFNldFByb3AoUF9BTElHTiwgLTEyMyk7CisgICBTZXRQcm9wKFBfQk9EWSwgODApOworICAgU2V0UHJvcChQX0hBTkRTLCAoeyIgbWl0IHNjaGFyZmVuIFNjaG5laWRlcmFlZGVybiIsIDUwfSkpOworICAgU2V0UHJvcChQX1hQLCAzMDAwMCk7CisgICBTZXRQcm9wKFBfU0laRSwgcmFuZG9tKDIwKSs0MCk7CisgICBzZXRfbGl2aW5nX25hbWUoImRvc2Vub2VmZm5lciIpOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9zc3AvbW9uL2Vpc2VuZnJlc3Nlci5jIGIvZG9jL2JlaXNwaWVsZS9zc3AvbW9uL2Vpc2VuZnJlc3Nlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhN2IwNDEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3NzcC9tb24vZWlzZW5mcmVzc2VyLmMKQEAgLTAsMCArMSwyOCBAQAorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlICIuLi9maWxlcy5oIgorCitpbmhlcml0IE1NT05TVDsKKworY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgIDo6Y3JlYXRlKCk7CisgICBBZGRJZCgoeyJlaXNlbmZyZXNzZXIiLCAiZnJlc3NlciJ9KSk7CisgICBTZXRQcm9wKFBfU0hPUlQsICJFaW4gRWlzZW5mcmVzc2VyIik7CisgICBTZXRQcm9wKFBfTE9ORywKKyAgICJFaXNlbmZyZXNzZXIgZXJuYWVocmVuIHNpY2ggYXVzc2NobGllc3NsaWNoIHZvbiBFaXNlbiwgYWxsZXJkaW5ncyBzaW5kXG4iKworICAgInNpZSBzbyBrdXJ6c2ljaHRpZywgZGFzcyBzaWUgZXJzdG1hbCBpbiBhbGxlcyByZWluYmVpc3Nlbiwgd2FzIHNpZVxuIisKKyAgICJpcmdlbmR3aWUgd2Focm5laG1lbi5cbiIpOworICAgU2V0UHJvcChQX05BTUUsICJFaXNlbmZyZXNzZXIiKTsKKyAgIFNldFByb3AoUF9HRU5ERVIsIDEpOworICAgU2V0UHJvcChQX0xFVkVMLCAxNCk7CisgICBTZXRQcm9wKFBfTUFYX0hQLCAxNTApOworICAgU2V0UHJvcChQX0FMSUdOLCAtMjE1KTsKKyAgIFNldFByb3AoUF9CT0RZLCA3NSk7CisgICBTZXRQcm9wKFBfSEFORFMsICh7IiBtaXQgZWlzZW5iZXNjaGxhZ2VuZW4gWmFlaG5lbiIsIDU1fSkpOworICAgU2V0UHJvcChQX1hQLCA0MjAwMCk7CisgICBTZXRQcm9wKFBfQUdHUkVTU0lWRSwgMSk7CisgICBTZXRQcm9wKFBfU0laRSwgcmFuZG9tKDIwMCkrNTApOyAgIC8qIE5hamEsIGt1cnpzaWNodGlnIGhhbHQuLi4gOy0pICovCisgICBzZXRfbGl2aW5nX25hbWUoImVpc2VuZnJlc3NlciIpOworICAgQWRkSXRlbSggT0JKKCJlaXNlbmtsdW1wZW4iKSApOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9zc3AvbW9uL2thbXBmYmxlY2guYyBiL2RvYy9iZWlzcGllbGUvc3NwL21vbi9rYW1wZmJsZWNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIxOGQwMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvc3NwL21vbi9rYW1wZmJsZWNoLmMKQEAgLTAsMCArMSwzNiBAQAorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxjb21iYXQuaD4KKyNpbmNsdWRlICIuLi9maWxlcy5oIgorCitpbmhlcml0ICJzdGQvbnBjIjsKKworY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgIDo6Y3JlYXRlKCk7CisgICBTZXRQcm9wKFBfU0hPUlQsICJFaW4gS2FtcGZibGVjaCIpOworICAgU2V0UHJvcChQX0xPTkcsIAorICAgIkRhcyBLYW1wZmJsZWNoIHNpZWh0IGlyZ2VuZHdpZSBhdXMgd2llIGVpbiBub3JtYWxlcyBCYWNrYmxlY2gsIG51clxuIisKKyAgICJ2aWVsIGdlZmFlaHJsaWNoZXIhXG4iKTsKKyAgIFNldFByb3AoUF9OQU1FLCAiS2FtcGZibGVjaCIpOworICAgU2V0UHJvcChQX0dFTkRFUiwgMCk7CisgICBBZGRJZCgoeyJibGVjaCIsICJrYW1wZmJsZWNoIiwiXG5rYW1wZmJsZWNoIn0pKTsKKyAgIFNldFByb3AoUF9MRVZFTCwgOCk7CisgICBTZXRQcm9wKFBfTUFYX0hQLCAxMDApOworICAgU2V0UHJvcChQX0FMSUdOLCAtMzMpOworICAgU2V0UHJvcChQX0JPRFksIDcwKTsKKyAgIFNldFByb3AoUF9IQU5EUywgKHsiIG1pdCBlaXNlbmhhcnRlbiBTY2hsYWVnZW4iLCA2MH0pKTsKKyAgIFNldFByb3AoUF9YUCwgMzAwMDApOworICAgU2V0UHJvcChQX1NJWkUsIDQwKTsKKyAgIFNldFByb3AoUF9SQUNFLCAiTWV0YWxsbW9uc3RlciIpOworICAgU2V0UHJvcChQX1ZVTE5FUkFCSUxJVFksICh7IERUX1dBVEVSIH0pKTsKKyAgIFNldFByb3AoUF9OT0NPUlBTRSwgMSk7CisgICBTZXRQcm9wKFBfRElFX01TRywgIiBmYWVsbHQgbGF1dCBzY2hlcHBlcm5kIHVtLlxuIik7CisgICBzZXRfbGl2aW5nX25hbWUoImthbXBmYmxlY2giKTsKK30KKworZGllKCkKK3sKKyAgIGNsb25lX29iamVjdChPQkooImthbXBmYmxlY2giKSktPm1vdmUoZW52aXJvbm1lbnQoKSk7CisgICA6OmRpZSgpOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9zc3AvbW9uL2tub2NoZW5zY2hhZWxlci5jIGIvZG9jL2JlaXNwaWVsZS9zc3AvbW9uL2tub2NoZW5zY2hhZWxlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0YzFlM2IKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3NzcC9tb24va25vY2hlbnNjaGFlbGVyLmMKQEAgLTAsMCArMSw0MyBAQAorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxjb21iYXQuaD4KKyNpbmNsdWRlICIuLi9maWxlcy5oIgorCitpbmhlcml0IE1NT05TVDsKKworY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgIDo6Y3JlYXRlKCk7CisgICBTZXRQcm9wKFBfU0hPUlQsICJEZXIgS25vY2hlbnNjaGFlbGVyIik7CisgICBTZXRQcm9wKFBfTE9ORywKKyAgICJEZXIgS25vY2hlbnNjaGFlbGVyIGdlaHQgdW0sIGdlaHQgdW1cbiIrCisgICAiRGVyIEtub2NoZW5zY2hhZWxlciBnZWh0IHVtLCBnZWh0IHVtXG4iKworICAgIlNlaW4gTWVzc2VyIHNvIGxhbmcsIHdpZSB0YXVzZW5kIGdyb3NzZSBaYWVobmVcbiIrCisgICAiV2llIHRhdXNlbmQgZ3Jvc3NlIFphZWhuZSwgc2VpbiBNZXNzZXIgc28gbGFuZ1xuIisKKyAgICJFciBzY2huZWlkZXQgRGljaCBpbiBTdHVlY2tlLCBwb3J0aW9uc2dlcmVjaHQgdW5kIGZlaW5cbiIrCisgICAiRXIgc2NobmVpZGV0IERpY2ggaW4gU3R1ZWNrZSwgdW5kIGtlaW5lciB0dXRzIGlobSBnbGVpY2hcbiIrCisgICAiRXIgc2NoYWVsdCBkaWUgS25vY2hlbiwgZXIgcXVhZWx0IERlaW5lbiBHZWlzdFxuIisKKyAgICJFciBzY2hhZWx0IGRpZSBLbm9jaGVuLCBlciBxdWFlbHQgRGVpbmVuIEdlaXN0XG4iKworICAgIkhhYmV0IGFjaHQsIGhhYmV0IGFjaHQhIFNlaWV0IHZvcnNpY2h0aWcsIGhhYmV0IEFjaHQhXG4iKworICAgIlNjaGF1IERpY2ggdW0sIHNjaGF1IERpY2ggdW1cbiIrCisgICAiU2NoYXUgRGljaCB1bSwgRHUgd2lyc3QgZGVyIG5hZWNoc3RlIHNlaW5cbiIpOworICAgU2V0UHJvcChQX05BTUUsICJLbm9jaGVuc2NoYWVsZXIiKTsKKyAgIFNldFByb3AoUF9HRU5ERVIsIDEpOworICAgQWRkSWQoKHsic2NoYWVsZXIiLCAia25vY2hlbnNjaGFlbGVyIn0pKTsKKyAgIFNldFByb3AoUF9MRVZFTCwgMTgpOworICAgU2V0UHJvcChQX01BWF9IUCwgMzAwKTsKKyAgIFNldFByb3AoUF9BTElHTiwgLTc4OSk7CisgICBTZXRQcm9wKFBfSEFORFMsICh7IiBtaXQgc2VpbmVtIGxhbmdlbiBNZXNzZXIiLCAxNDV9KSApOworICAgU2V0UHJvcChQX0JPRFksIDExMCk7CisgICBTZXRQcm9wKFBfWFAsIDIyMDAwMCk7CisgICBTZXRQcm9wKFBfQUdHUkVTU0lWRSwgMSk7CisgICBTZXRQcm9wKFBfU0laRSwgMjIwKTsKKyAgIHNldF9saXZpbmdfbmFtZSgia25vY2hlbnNjaGFlbGVyIik7CisgICBjbG9uZV9vYmplY3QoT0JKKCJzY2hhZWxtZXNzZXIiKSktPm1vdmUodGhpc19vYmplY3QoKSk7CisgICBjb21tYW5kKCJ6dWVja2UgbWVzc2VyIik7Cit9CisKK1F1ZXJ5QXJ0aWNsZShjLCBkLCBmKQoreworICAgcmV0dXJuIDo6UXVlcnlBcnRpY2xlKGMsIDEsIGYpOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9zc3AvbW9uL21ldGFsbG1vbnN0ZXIuYyBiL2RvYy9iZWlzcGllbGUvc3NwL21vbi9tZXRhbGxtb25zdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ4MjE4NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvc3NwL21vbi9tZXRhbGxtb25zdGVyLmMKQEAgLTAsMCArMSwyOCBAQAoraW5oZXJpdCAic3RkL25wYyI7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8Y29tYmF0Lmg+CisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKworY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgIDo6Y3JlYXRlKCk7CisgICBTZXRQcm9wKFBfTk9DT1JQU0UsIDEpOworICAgU2V0UHJvcChQX1JBQ0UsICJNZXRhbGxtb25zdGVyIik7CisgICBTZXRQcm9wKFBfRElFX01TRywgIiB6ZXJmYWVsbHQgaW4gc2VpbmUgQmVzdGFuZHRlaWxlLlxuIik7CisgICBTZXRQcm9wKFBfVlVMTkVSQUJJTElUWSwgKHsgRFRfV0FURVIgfSkpOworfQorCitkaWUoKQoreworICAgY3JlYXRlX2JsZWNoKCk7CisgICA6OmRpZSgpOworfQorCitjcmVhdGVfYmxlY2goKQoreworICAgb2JqZWN0IGI7CisgICBiID0gY2xvbmVfb2JqZWN0KE9CSigiYmxlY2giKSk7CisgICBiLT5tb3ZlKGVudmlyb25tZW50KHRoaXNfb2JqZWN0KCkpKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL21vbi9vcmsuYyBiL2RvYy9iZWlzcGllbGUvc3NwL21vbi9vcmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzVlNTk2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9zc3AvbW9uL29yay5jCkBAIC0wLDAgKzEsMjYgQEAKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKworaW5oZXJpdCAic3RkL25wYyI7CisKK2NyZWF0ZSgpCit7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgICA6OmNyZWF0ZSgpOworICAgU2V0UHJvcChQX1NIT1JULCAiRWluIGdyaW1taWdlciBPcmsiKTsKKyAgIFNldFByb3AoUF9MT05HLCAiRGVyIE9yayBzY2hhdXQgRGljaCB1bmZyZXVuZGxpY2ggYW4gdW5kIHdlZGVsdCBtaXQgc2VpbmVtIEtydW1tc2Nod2VydC5cbiIpOworICAgU2V0UHJvcChQX05BTUUsICJPcmsiKTsKKyAgIFNldFByb3AoUF9HRU5ERVIsIDEpOworICAgQWRkSWQoIm9yayIpOworICAgU2V0UHJvcChQX1JBQ0UsICJPcmsiKTsKKyAgIFNldFByb3AoUF9MRVZFTCwgMTApOworICAgU2V0UHJvcChQX01BWF9IUCwgMTMwKTsKKyAgIFNldFByb3AoUF9BTElHTiwgLTI1MCk7CisgICBTZXRQcm9wKFBfWFAsIDkwMDAwKTsKKyAgIFNldFByb3AoUF9CT0RZLCA1MCk7CisgICBTZXRQcm9wKFBfU0laRSwgcmFuZG9tKDIwKSsxMTApOworICAgc2V0X2xpdmluZ19uYW1lKCJvcmsiKTsKKyAgIHNldGV1aWQoZ2V0dWlkKHRoaXNfb2JqZWN0KCkpKTsKKyAgIEFkZEl0ZW0oT0JKKCJrcnVtbXNjaHdlcnQiKSxDTE9ORV9XSUVMRCk7CisgICBBZGRJdGVtKE9CSigib3JraG9zZSIpLENMT05FX1dFQVIpOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9zc3AvbW9uL29ya2NoZWYuYyBiL2RvYy9iZWlzcGllbGUvc3NwL21vbi9vcmtjaGVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ2ZTZjZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvc3NwL21vbi9vcmtjaGVmLmMKQEAgLTAsMCArMSwyOSBAQAoraW5oZXJpdCAic3RkL25wYyI7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKworY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgIDo6Y3JlYXRlKCk7CisgICBTZXRQcm9wKFBfU0hPUlQsICJFaW4gQW5mdWVocmVyIGRlciBPcmtzIik7CisgICBTZXRQcm9wKFBfTE9ORywgIkRpZXMgaXN0IGVpbiBmZXR0ZXIsIHN0aW5rZW5kZXIgT3JrLUhhZXVwdGxpbmcsIGRlciBEaXIgYWxsZXMgXG5hbmRlcmUgYWxzIGZyZXVuZGxpY2ggZ2Vzb25uZW4gaXN0LlxuIik7CisgICBTZXRQcm9wKFBfTkFNRSwgIk9yayIpOworICAgU2V0UHJvcChQX0dFTkRFUiwgMSk7CisgICBBZGRJZCgoeyJvcmsiLCAiYW5mdWVocmVyIiwgImhhZXVwdGxpbmcifSkpOworICAgU2V0UHJvcChQX1JBQ0UsICJPcmsiKTsKKyAgIFNldFByb3AoUF9MRVZFTCwgMTYpOworICAgU2V0UHJvcChQX01BWF9IUCwgMjIwKTsKKyAgIFNldFByb3AoUF9BTElHTiwgLTI4MCk7CisgICBTZXRQcm9wKFBfWFAsIDE2MDAwMCk7CisgICBTZXRQcm9wKFBfQk9EWSwgNjApOworICAgU2V0UHJvcChQX1NJWkUsIHJhbmRvbSgyMCkrMTMwKTsKKyAgIHNldF9saXZpbmdfbmFtZSgib3JrY2hlZiIpOworICAgc2V0ZXVpZChnZXR1aWQodGhpc19vYmplY3QoKSkpOworICAgQWRkSXRlbShPQkooInNhZWJlbCIpLENMT05FX1dJRUxEKTsKKyAgIEFkZEl0ZW0oT0JKKCJvcmtob3NlIiksQ0xPTkVfV0VBUik7CisgICBBZGRJdGVtKE9CSigib3JraGVsbSIpLENMT05FX1dFQVIpOworfQorCisgICAgICAKZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL21vbi9zdGFobGRyYWNoZS5jIGIvZG9jL2JlaXNwaWVsZS9zc3AvbW9uL3N0YWhsZHJhY2hlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRlZmNhYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvc3NwL21vbi9zdGFobGRyYWNoZS5jCkBAIC0wLDAgKzEsMzkgQEAKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8Y29tYmF0Lmg+CisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKworaW5oZXJpdCBNTU9OU1Q7CisKK2NyZWF0ZSgpCit7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgICA6OmNyZWF0ZSgpOworICAgU2V0UHJvcChQX1NIT1JULCAiRWluIFN0YWhsZHJhY2hlIik7CisgICBTZXRQcm9wKFBfTE9ORywKKyAgICJEZXIgU3RhaGxkcmFjaGUgaXN0IGVpbiBlcm5zdHp1bmVobWVuZGVyIEdlZ25lciwgZ2VwYW56ZXJ0IG1pdCBQbGF0dGVuXG4iKworICAgImF1cyByZWluZW0gU3RhaGwgaXN0IGVzIHNjaHdlciwgaWhtIGlyZ2VuZHdpZSBTY2hhZGVuIHp1enVmdWVnZW4uXG4iKTsKKyAgIFNldFByb3AoUF9OQU1FLCAoeyJTdGFobGRyYWNoZSIsICJTdGFobGRyYWNoZW4iLCAiU3RhaGxkcmFjaGVuIiwgIlN0YWhsZHJhY2hlbiJ9KSk7CisgICBTZXRQcm9wKFBfR0VOREVSLCAxKTsKKyAgIEFkZElkKCh7ImRyYWNoZSIsICJzdGFobGRyYWNoZSIsICJkcmFjaGVuIiwgInN0YWhsZHJhY2hlbiJ9KSk7CisgICBTZXRQcm9wKFBfUkFDRSwgIkRyYWNoZSIpOworICAgU2V0UHJvcChQX0xFVkVMLCAyMCk7CisgICBTZXRQcm9wKFBfTUFYX0hQLCA0MDApOworICAgU2V0UHJvcChQX0FMSUdOLCAtMjUwKTsKKyAgIFNldFByb3AoUF9IQU5EUywgKHsiIG1pdCBzdGFlaGxlcm5lbiBLbGF1ZW4iLCAxNTB9KSk7CisgICBTZXRQcm9wKFBfQk9EWSwgMTMwKTsKKyAgIFNldFByb3AoUF9YUCwgMzAwMDAwKTsKKyAgIFNldFByb3AoUF9TSVpFLCByYW5kb20oNTApKzI1MCk7CisgICBTZXRDaGF0cyg0MCwgKHsKKyAgICAgICJEZXIgU3RhaGxkcmFjaGUgc2NobmF1YnQgbGF1dC5cbiIsCisgICAgICAiRGVyIFN0YWhsZHJhY2hlIHNjaGF1dCBEaWNoIG1pdCBzdGFlaGxlcm5lbSBCbGljayBhbi5cbiIsCisgICAgICAiRGVyIFN0YWhsZHJhY2hlIHdhZWx6dCBzaWNoIGhlcnVtLlxuIiwKKyAgICAgICJEZXIgU3RhaGxkcmFjaGUgc3B1Y2t0IGV0d2FzIHN0YWhsYmxhdWVzIEZldWVyLlxuIiwKKyAgIH0pICk7CisgICBBZGRTcGVsbCgxLCAxMTUsICJEZXIgU3RhaGxkcmFjaGUgc3B1Y2t0IHN0YWhsYmxhdWVzIEZldWVyIGF1ZiBEaWNoLlxuIiwKKyAgCSAgICAgICAgICAgICJEZXIgU3RhaGxkcmFjaGUgc3B1Y2t0IHN0YWhsYmxhdWVzIEZldWVyIGF1ZiBAV0VOLlxuIiwKKwkgICAgRFRfRklSRSk7CisgICBTZXRQcm9wKFBfU1BFTExSQVRFLDIwKTsKKyAgIGNsb25lX29iamVjdChPQkooImd1bW1pc3RpZWZlbCIpKS0+bW92ZSh0aGlzX29iamVjdCgpKTsKKyAgIGNsb25lX29iamVjdChPQkooInN0YWhsc2Nod2VydCIpKS0+bW92ZSh0aGlzX29iamVjdCgpKTsKKyAgIHNldF9saXZpbmdfbmFtZSgic3RhaGxkcmFjaGUiKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL21vbi90aXRhbndhbHplLmMgYi9kb2MvYmVpc3BpZWxlL3NzcC9tb24vdGl0YW53YWx6ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMTEzZTYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3NzcC9tb24vdGl0YW53YWx6ZS5jCkBAIC0wLDAgKzEsMzAgQEAKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+ICAgICAgICAgICAgICAgICAgICAKKyNpbmNsdWRlIDxjb21iYXQuaD4KKyNpbmNsdWRlICIuLi9maWxlcy5oIgorCitpbmhlcml0IE1NT05TVDsKKyAKK2NyZWF0ZSgpCit7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgICA6OmNyZWF0ZSgpOworICAgU2V0UHJvcChQX1NIT1JULCAiRWluZSBUaXRhbndhbHplIik7CisgICBTZXRQcm9wKFBfTE9ORywgIlBhc3MgbnVyIGF1ZiwgZGFzcyBkaWVzZSBUaXRhbndhbHplIERpciBuaWNodCB1ZWJlciBkaWUgWmVoZW4gcm9sbHQuXG5CZWkgZGllc2VtIEdld2ljaHQga29lbm50ZSBkYXMgYXVlc3NlcnN0IHVuYW5nZW5laG1lIEZvbGdlbiBoYWJlbi5cbiIpOworICAgU2V0UHJvcChQX05BTUUsICJUaXRhbndhbHplIik7CisgICBTZXRQcm9wKFBfR0VOREVSLCAyKTsKKyAgIEFkZElkKCh7IndhbHplIiwgInRpdGFud2FsemUifSkpOworICAgU2V0UHJvcChQX0xFVkVMLCAxNCk7CisgICBTZXRQcm9wKFBfTUFYX0hQLCAxNzApOworICAgU2V0UHJvcChQX0FMSUdOLCAxMjApOworICAgU2V0UHJvcChQX1hQLCA1MTAwMCk7CisgICBTZXRQcm9wKFBfQk9EWSwgOTApOworICAgU2V0UHJvcChQX0hBTkRTLCAoeyIgbWl0IHd1Y2h0aWdlbiBTY2hsYWVnZW4iLCA2MH0pKTsKKyAgIFNldFByb3AoUF9TSVpFLCAyMTApOworICAgU2V0UHJvcChQX0RJRV9NU0csICIgemVyZmFlbGx0IGluIGlocmUgQmVzdGFuZHRlaWxlLlxuIik7CisgICBTZXRBdHRhY2tDaGF0cygzMCwgKHsKKyAgICJEaWUgVGl0YW53YWx6ZSB2ZXJzdWNodCBEaWNoIHBsYXR0IHp1IHdhbHplbi5cbiIsCisgICAiRGllIFRpdGFud2FsemUgbWFjaHQ6IFJ1bXBlbCwgcG9sdGVyIC4uLlxuIiwKKyAgICJEaWUgVGl0YW53YWx6ZSByb2VocnQuXG4ifSkpOworICAgc2V0X2xpdmluZ19uYW1lKCJ0aXRhbndhbHplIik7CisgICBBZGRJdGVtKE9CSigidGl0YW5yaW5nIikpOyAKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL21vbi90cm9sbC5jIGIvZG9jL2JlaXNwaWVsZS9zc3AvbW9uL3Ryb2xsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGViMTA0MwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvc3NwL21vbi90cm9sbC5jCkBAIC0wLDAgKzEsMjggQEAKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKworaW5oZXJpdCAic3RkL25wYyI7CisKK2NyZWF0ZSgpCit7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgICA6OmNyZWF0ZSgpOworICAgU2V0UHJvcChQX1NIT1JULCAiRWluIFRyb2xsIik7CisgICBTZXRQcm9wKFBfTE9ORywgIkVpbiBUcm9sbCB3aWUgYXVzIGRlbSBCaWxkZXJidWNoOiBHcm9zcywgaGFlc3NsaWNoIHVuZCBkdW1tLlxuIik7CisgICBTZXRQcm9wKFBfTkFNRSwgIlRyb2xsIik7CisgICBTZXRQcm9wKFBfR0VOREVSLCAxKTsKKyAgIFNldFByb3AoUF9SQUNFLCAiVHJvbGwiKTsKKyAgIEFkZElkKCJ0cm9sbCIpOworICAgU2V0UHJvcChQX0xFVkVMLCAxNSk7CisgICBTZXRQcm9wKFBfTUFYX0hQLCAyMDApOworICAgU2V0UHJvcChQX0FMSUdOLCAtNDE3KTsKKyAgIFNldFByb3AoUF9YUCwgMTIwMDAwKTsKKyAgIFNldFByb3AoUF9CT0RZLCAzNSk7CisgICBTZXRQcm9wKFBfU0laRSwgcmFuZG9tKDQwKSsxOTkpOworICAgc2V0X2xpdmluZ19uYW1lKCJ0cm9sbCIpOworICAgc2V0ZXVpZChnZXR1aWQodGhpc19vYmplY3QoKSkpOworICAgQWRkSXRlbShPQkooInRyb2xsZG9sY2giKSxDTE9ORV9XSUVMRCk7CisgICBBZGRJdGVtKE9CSigic3RlaW5yaW5nIiksQ0xPTkVfV0VBUik7CisgICBBZGRJdGVtKE9CSigibGtoZW1kIiksQ0xPTkVfV0VBUik7Cit9CisgICAgICAKZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL21vbi90cm9sbG1vcHMuYyBiL2RvYy9iZWlzcGllbGUvc3NwL21vbi90cm9sbG1vcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODMwNzk2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9zc3AvbW9uL3Ryb2xsbW9wcy5jCkBAIC0wLDAgKzEsMzEgQEAKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKworaW5oZXJpdCAic3RkL25wYyI7CisKK2NyZWF0ZSgpCit7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgICA6OmNyZWF0ZSgpOworICAgU2V0UHJvcChQX1NIT1JULCAiRWluIFRyb2xsbW9wcyIpOworICAgU2V0UHJvcChQX0xPTkcsIAorICAgIkRpZXMgaXN0IGVpbmVyIGRlciBzYWdlbnVtd29iZW5lbiwgYmx1dHJ1ZW5zdGlnZW4gVHJvbGxtb2Vwc2UuIEhlcnZvci1cbiIrCisgICAiZ2VnYW5nZW4gYXVzIGRlciBtaXNzbHVuZ2VuZW4gS3JldXp1bmcgendpc2NoZW4gZWluZW0gVHJvbGwgdW5kIGVpbmVtXG4iKworICAgIk1vcHMsIHRlcnJvcmlzaWVyZW4gZGllc2UgZ3JhdXNhbWVuIEJlc3RpZW4gamV0enQgZGllIFdlbHQuIEZsaWVoLCBzby1cbiIrCisgICAibGFuZ2UgRHUgbm9jaCBrYW5uc3QuXG4iKTsKKyAgIFNldFByb3AoUF9OQU1FLCAiVHJvbGxtb3BzIik7CisgICBTZXRQcm9wKFBfR0VOREVSLCAxKTsKKyAgIEFkZElkKCJ0cm9sbG1vcHMiKTsKKyAgIEFkZElkKCJ0cm9sbCIpOworICAgQWRkSWQoIm1vcHMiKTsKKyAgIFNldFByb3AoUF9SQUNFLCAiVHJvbGwiKTsKKyAgIFNldFByb3AoUF9MRVZFTCwgMjApOworICAgU2V0UHJvcChQX01BWF9IUCwgMzUwKTsKKyAgIFNldFByb3AoUF9BTElHTiwgLTczNSAtIHJhbmRvbSgxMDApKTsKKyAgIFNldFByb3AoUF9IQU5EUywgKHsiIG1pdCBibHV0dmVyc2NobWllcnRlbiBLcmFsbGVuIiwgMjAwICtyYW5kb20oMTApfSkpOworICAgU2V0UHJvcChQX1hQLCAzNTAwMDApOworICAgU2V0UHJvcChQX0JPRFksIDE0MCArIHJhbmRvbSg0MCkpOworICAgU2V0UHJvcChQX1NJWkUsIHJhbmRvbSgyMCkrMTA1KTsgIC8qIERhIHNpbmQgZGllIEdyb2Vzc2VuIGRlciBFbHRlcm4gZHJpbiAqLworICAgc2V0X2xpdmluZ19uYW1lKCJ0cm9sbG1vcHMiKTsKKyAgIFNldFByb3AoUF9BR0dSRVNTSVZFLCAxKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL29iai9ibGVjaC5jIGIvZG9jL2JlaXNwaWVsZS9zc3Avb2JqL2JsZWNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM1YzJlYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvc3NwL29iai9ibGVjaC5jCkBAIC0wLDAgKzEsMTYgQEAKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisKK2luaGVyaXQgIi9zdGQvdGhpbmciOworCitjcmVhdGUoKSB7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9TSE9SVCwgIkVpbiBhbHRlcyBCbGVjaCIpOworICBTZXRQcm9wKFBfTE9ORywgIkRhcyBzaW5kIGRpZSBVZWJlcnJlc3RlIGVpbmVzIE1ldGFsbG1vbnN0ZXJzLlxuIik7CisgIFNldFByb3AoUF9OQU1FLCAiQmxlY2giKTsKKyAgU2V0UHJvcChQX0dFTkRFUiwgMCk7CisgIEFkZElkKCJibGVjaCIpOworICBBZGRBZGplY3RpdmUoKHsiYWx0IiwgImFsdGVzIn0pKTsKKyAgU2V0UHJvcChQX1dFSUdIVCwgMTEwMCk7CisgIFNldFByb3AoUF9WQUxVRSwgcmFuZG9tKFF1ZXJ5UHJvcChQX01BWF9IUCkpKzEwMCk7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3NzcC9vYmovZWlzZW5rbHVtcGVuLmMgYi9kb2MvYmVpc3BpZWxlL3NzcC9vYmovZWlzZW5rbHVtcGVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFjMTIyYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvc3NwL29iai9laXNlbmtsdW1wZW4uYwpAQCAtMCwwICsxLDE2IEBACisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCitpbmhlcml0ICIvc3RkL3RoaW5nIjsKKworY3JlYXRlKCkgeworICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuOworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfU0hPUlQsICJFaW4gS2x1bXBlbiBFaXNlbiIpOworICBTZXRQcm9wKFBfTE9ORywgIlNpZWh0IGF1cywgYWxzIGhhZXR0ZSBkYSBzY2hvbiBqZW1hbmQgZHJhbiBydW1nZW5hZ3QuIERlcmplbmlnZSBtdXNzXG5hYmVyIHNlaHIgc3RhYmlsZSBaYWVobmUgZ2VoYWJ0IGhhYmVuLlxuIik7CisgIFNldFByb3AoUF9OQU1FLCAiS2x1bXBlbiIpOworICBTZXRQcm9wKFBfR0VOREVSLCAxKTsKKyAgQWRkSWQoKHsia2x1bXBlbiIsICJlaXNlbiIsICJrbHVtcGVuIGVpc2VuIn0pKTsKKyAgU2V0UHJvcChQX01BVEVSSUFMLCBNQVRfSVJPTik7CisgIFNldFByb3AoUF9XRUlHSFQsIDI0MzgpOworICBTZXRQcm9wKFBfVkFMVUUsIHJhbmRvbSg3NTApKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL29iai9ndW1taXN0aWVmZWwuYyBiL2RvYy9iZWlzcGllbGUvc3NwL29iai9ndW1taXN0aWVmZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTQ3MjhlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9zc3Avb2JqL2d1bW1pc3RpZWZlbC5jCkBAIC0wLDAgKzEsMzcgQEAKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxjb21iYXQuaD4KKyNpbmNsdWRlICIuLi9maWxlcy5oIgorIAoraW5oZXJpdCAic3RkL2FybW91ciI7CisgCitjcmVhdGUoKQoreworICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuOworICAgOjpjcmVhdGUoKTsKKyAgIFNldFByb3AoUF9TSE9SVCwgIkVpbiBQYWFyIEd1bW1pc3RpZWZlbCIpOworICAgU2V0UHJvcChQX0xPTkcsICJEYW1pdCBiZWtvbW10IG1hbiBzaWNoZXIga2VpbmUgbmFzc2VuIEZ1ZXNzZS5cbiIpOworICAgU2V0UHJvcChQX05BTUUsICJQYWFyIEd1bW1pc3RpZWZlbCIpOworICAgU2V0UHJvcChQX0dFTkRFUiwgMCk7CisgICBBZGRJZCgoeyJzdGllZmVsIiwgImd1bW1pc3RpZWZlbCIsICJwYWFyIiwgInBhYXIgc3RpZWZlbCJ9KSk7CisgICBTZXRQcm9wKFBfQVJNT1VSX1RZUEUsIEFUX0JPT1QpOworICAgU2V0UHJvcChQX0FDLCAwKTsKKyAgIFNldFByb3AoUF9XRUlHSFQsIDcwMCk7CisgICBTZXRQcm9wKFBfVkFMVUUsIDEyMCk7CisgICBTZXRQcm9wKFBfUkVNT1ZFX0ZVTkMsIHRoaXNfb2JqZWN0KCkpOworfQorCitSZW1vdmVGdW5jKCkKK3sKKyAgIG9iamVjdCBlbnY7CisgICBpZiAoKGVudj1lbnZpcm9ubWVudChRdWVyeVByb3AoUF9XT1JOKSkpPT1maW5kX29iamVjdChMMigibTJ4MSIpKSB8fAorICAgICAgIGVudj09ZmluZF9vYmplY3QoTDIoIm0xeDEiKSkpCisgICB7CisgICAgICB3cml0ZSgiRGFzIHdhZXJlIGtlaW5lIHNvIHRvbGxlIElkZWUgaGllciBkaWUgR3VtbWlzdGllZmVsIGF1c3p1emllaGVuLlxuIik7CisgICAgICByZXR1cm4gMDsKKyAgIH0KKyAgIHJldHVybiAxOworfQorICAgICAgIAorCisKZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL29iai9rYW1wZmJsZWNoLmMgYi9kb2MvYmVpc3BpZWxlL3NzcC9vYmova2FtcGZibGVjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYzk1M2EKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3NzcC9vYmova2FtcGZibGVjaC5jCkBAIC0wLDAgKzEsMjIgQEAKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8Y29tYmF0Lmg+Citpbmhlcml0ICJzdGQvYXJtb3VyIjsKKyAKK2NyZWF0ZSgpCit7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9TSE9SVCwgIkVpbiB0b3RlcyBLYW1wZmJsZWNoIik7CisgIFNldFByb3AoUF9MT05HLCAiU2llaHQgYXVzIHdpZSBlaW4gbm9ybWFsZXMgS2FtcGZibGVjaCwgbnVyIHRvdC4gQXVzc2VyZGVtIHVlYmVycmFzY2h0IERpY2ggZGVyIG1lcmt3dWVyZGlnZSBHcmlmZi5cbiIpOworICBTZXRQcm9wKFBfTkFNRSwgIkthbXBmYmxlY2giKTsKKyAgU2V0UHJvcChQX05BTUVfQURKLCAidG90Iik7CisgIFNldFByb3AoUF9HRU5ERVIsIDApOworICBTZXRQcm9wKFBfQVJNT1VSX1RZUEUsIEFUX1NISUVMRCk7CisgIFNldFByb3AoUF9BQywgMTIpOworICBTZXRQcm9wKFBfV0VJR0hULCA4NTApOworICBTZXRQcm9wKFBfVkFMVUUsIDQyMCk7CisgIFNldFByb3AoUF9NQVRFUklBTCwgTUFUX01JU0NfTUVUQUwpOworICBTZXRQcm9wKFBfSU5GTywgIlppZW1saWNoZXIgU2Nod2FjaHNpbm4gZGllc2VzIE9iamVrdCwgb2RlciBuaWNodD9cbiIpOworICBBZGRJZCgoeyJzY2hpbGQiLCAiYmxlY2giLCAia2FtcGZibGVjaCIsICJ0b3RlcyBrYW1wZmJsZWNoIn0pKTsKKyAgQWRkRGV0YWlsKCJncmlmZiIsICJNaXQgSGlsZmUgZGVzIEdyaWZmcyBrYW5uc3QgRHUgZGFzIHRvdGUgS2FtcGZibGVjaCBhbHMgU2NoaWxkIGJlbnV0emVuLlxuIik7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3NzcC9vYmova3J1bW1zY2h3ZXJ0LmMgYi9kb2MvYmVpc3BpZWxlL3NzcC9vYmova3J1bW1zY2h3ZXJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU5ZmYwMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvc3NwL29iai9rcnVtbXNjaHdlcnQuYwpAQCAtMCwwICsxLDIyIEBACisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGNvbWJhdC5oPgoraW5oZXJpdCAic3RkL3dlYXBvbiI7CisgCitjcmVhdGUoKQoreworICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuOworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfU0hPUlQsICJFaW4gS3J1bW1zY2h3ZXJ0Iik7CisgIFNldFByb3AoUF9MT05HLCAiRGFzIEtydW1tc2Nod2VydCBzaWVodCBhdXMsIGFscyBoYWV0dGUgZXMgZWlubWFsIGVpbmVtIE9yayBnZWhvZXJ0LlxuIik7CisgIFNldFByb3AoUF9OQU1FLCAiS3J1bW1zY2h3ZXJ0Iik7CisgIFNldFByb3AoUF9HRU5ERVIsIDApOworICBTZXRQcm9wKFBfV0MsIDEzMCArIHJhbmRvbSgxNSkpOworICBTZXRQcm9wKFBfVkFMVUUsIDEyMDAgKyByYW5kb20oMjAwKSk7CisgIFNldFByb3AoUF9XRUlHSFQsIDExMDAgKyByYW5kb20oMTAwKSk7CisgIFNldFByb3AoUF9XRUFQT05fVFlQRSwgV1RfU1dPUkQpOworICBTZXRQcm9wKFBfREFNX1RZUEUsIERUX1NMQVNIKTsKKyAgU2V0UHJvcChQX05SX0hBTkRTLCAxKTsKKyAgU2V0UHJvcChQX01BVEVSSUFMLCBNQVRfTUlTQ19NRVRBTCk7CisgIEFkZElkKCJzY2h3ZXJ0Iik7CisgIEFkZElkKCJrcnVtbXNjaHdlcnQiKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL29iai9sa2hlbWQuYyBiL2RvYy9iZWlzcGllbGUvc3NwL29iai9sa2hlbWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzM4MWJjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9zc3Avb2JqL2xraGVtZC5jCkBAIC0wLDAgKzEsMTkgQEAKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8Y29tYmF0Lmg+Citpbmhlcml0ICJzdGQvYXJtb3VyIjsKKyAKK2NyZWF0ZSgpCit7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9TSE9SVCwgIkVpbiBsZWljaHRlcyBLZXR0ZW5oZW1kIik7CisgIFNldFByb3AoUF9MT05HLCAiRWluIG5pY2h0IHNvbmRlcmxpY2ggZ3V0IGdlYXJiZWl0ZXRlcyBLZXR0ZW5oZW1kLiBBbnppZWhlbiBrYW5uIG1hblxuZXMgYWJlciB0cm90emRlbS5cbiIpOworICBTZXRQcm9wKFBfTkFNRSwgIktldHRlbmhlbWQiKTsKKyAgU2V0UHJvcChQX0dFTkRFUiwgMCk7CisgIFNldFByb3AoUF9BUk1PVVJfVFlQRSwgQVRfQVJNT1VSKTsKKyAgU2V0UHJvcChQX0FDLCAxOCk7CisgIFNldFByb3AoUF9XRUlHSFQsIDE3MDApOworICBTZXRQcm9wKFBfVkFMVUUsIDEyMDAgK3JhbmRvbSgxMDApKTsKKyAgU2V0UHJvcChQX01BVEVSSUFMLCBNQVRfTUlTQ19NRVRBTCk7CisgIEFkZElkKCh7ImtldHRlbmhlbWQiLCAiaGVtZCJ9KSk7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3NzcC9vYmovb3JraGVsbS5jIGIvZG9jL2JlaXNwaWVsZS9zc3Avb2JqL29ya2hlbG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmQ2YThiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9zc3Avb2JqL29ya2hlbG0uYwpAQCAtMCwwICsxLDIwIEBACitpbmhlcml0ICJzdGQvYXJtb3VyIjsKKyAKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+ICAgICAgICAgICAgICAgICAgICAKKyNpbmNsdWRlIDxjb21iYXQuaD4KKyAKK2NyZWF0ZSgpCit7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9TSE9SVCwgIkVpbiBPcmtoZWxtIik7CisgIFNldFByb3AoUF9MT05HLCAiRWluIHN0YWJpbGVyIEhlbG0sIGRlciBzY2hvbiBhdXNnaWViaWcgdm9uIGVpbmVtIHN0aW5rZW5kZW4gT3JrXG5nZXRyYWdlbiB3dXJkZS5cbiIpOworICBTZXRQcm9wKFBfTkFNRSwgIk9ya2hlbG0iKTsKKyAgU2V0UHJvcChQX0dFTkRFUiwgMSk7CisgIFNldFByb3AoUF9BUk1PVVJfVFlQRSwgQVRfSEVMTUVUKTsKKyAgU2V0UHJvcChQX0FDLCA3KTsKKyAgU2V0UHJvcChQX1dFSUdIVCwgNDUwKTsKKyAgU2V0UHJvcChQX1ZBTFVFLCAzNTApOworICBTZXRQcm9wKFBfTUFURVJJQUwsIChbTUFUX01JU0NfTUVUQUw6OTUsIE1BVF9TTElNRTo1XSkpOworICBBZGRJZCgoeyJoZWxtIiwgIm9ya2hlbG0ifSkpOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9zc3Avb2JqL29ya2hvc2UuYyBiL2RvYy9iZWlzcGllbGUvc3NwL29iai9vcmtob3NlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJhMDA1NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvc3NwL29iai9vcmtob3NlLmMKQEAgLTAsMCArMSwxOSBAQAorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxjb21iYXQuaD4KK2luaGVyaXQgInN0ZC9hcm1vdXIiOworIAorY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX1NIT1JULCAiRWluZSBPcmtob3NlIik7CisgIFNldFByb3AoUF9MT05HLCAiRGllIEJlaW5iZWtsZWlkdW5nIHZvbiBPcmtzLlxuIik7CisgIFNldFByb3AoUF9OQU1FLCAiSG9zZSIpOworICBTZXRQcm9wKFBfR0VOREVSLCAyKTsKKyAgU2V0UHJvcChQX0FSTU9VUl9UWVBFLCBBVF9UUk9VU0VSUyk7CisgIFNldFByb3AoUF9BQywgNyk7CisgIFNldFByb3AoUF9XRUlHSFQsIDU1NSk7CisgIFNldFByb3AoUF9WQUxVRSwgNDgwICsgcmFuZG9tKDQwKSk7CisgIFNldFByb3AoUF9NQVRFUklBTCwgKFtNQVRfQ0xPVEg6OTksIE1BVF9TSElUOjFdKSk7CisgIEFkZElkKCh7Imhvc2UiLCAiaG9zZW4iLCAib3JraG9zZSIsICJvcmtob3NlbiJ9KSk7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3NzcC9vYmovc2FlYmVsLmMgYi9kb2MvYmVpc3BpZWxlL3NzcC9vYmovc2FlYmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FlYzk1OAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvc3NwL29iai9zYWViZWwuYwpAQCAtMCwwICsxLDIzIEBACitpbmhlcml0ICJzdGQvd2VhcG9uIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4gICAgICAgICAgICAgICAgICAgIAorI2luY2x1ZGUgPGNvbWJhdC5oPgorIAorY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX1NIT1JULCAiRWluIHNjaGFydGlnZXIgU2FlYmVsIik7CisgIFNldFByb3AoUF9MT05HLCAiRGVyIFNhZWJlbCBpc3Qgc2NoYXJ0aWcsIGtvZW5udGUgYWJlciB0cm90emRlbSByZWNodCBicmF1Y2hiYXIgc2Vpbi5cbiIpOworICBTZXRQcm9wKFBfTkFNRSwgIlNhZWJlbCIpOyAKKyAgU2V0UHJvcChQX0dFTkRFUiwgMSk7CisgIFNldFByb3AoUF9XQywgMTQ0KTsKKyAgU2V0UHJvcChQX1ZBTFVFLCAxNTI1KTsKKyAgU2V0UHJvcChQX1dFSUdIVCwgMTI2NCk7CisgIFNldFByb3AoUF9XRUFQT05fVFlQRSwgV1RfU1dPUkQpOworICBTZXRQcm9wKFBfREFNX1RZUEUsIERUX1NMQVNIKTsKKyAgU2V0UHJvcChQX05SX0hBTkRTLCAxKTsKKyAgU2V0UHJvcChQX01BVEVSSUFMLCBNQVRfTUlTQ19NRVRBTCk7CisgIEFkZElkKCJzYWViZWwiKTsKKyAgQWRkQWRqZWN0aXZlKCh7InNjaGFydGlnIiwgInNjaGFydGlnZXIiLCAic2NoYXJ0aWdlbiJ9KSk7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3NzcC9vYmovc2NoYWVsbWVzc2VyLmMgYi9kb2MvYmVpc3BpZWxlL3NzcC9vYmovc2NoYWVsbWVzc2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIwYjY4NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvc3NwL29iai9zY2hhZWxtZXNzZXIuYwpAQCAtMCwwICsxLDI1IEBACitpbmhlcml0ICJzdGQvd2VhcG9uIjsKKworI2luY2x1ZGUgPGNvbWJhdC5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKworY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgIDo6Y3JlYXRlKCk7CisgICBTZXRQcm9wKFBfU0hPUlQsICJFaW4gS25vY2hlbnNjaGFlbG1lc3NlciIpOworICAgU2V0UHJvcChQX0xPTkcsIAorCSAgICJFaW4gTWVzc2VyIHNvIGxhbmcsIHdpZSB0YXVzZW5kIGdyb3NzZSBaYWVobmVcbiIrCisJICAgIldpZSB0YXVzZW5kIGdyb3NzZSBaYWVobmUsIGVpbiBNZXNzZXIgc28gbGFuZ1xuIisKKwkgICAiU28gbGFuZywgd2llIHRhdXNlbmQgZ3Jvc3NlLCBncm9zc2UgWmFlaG5lXG4iKTsKKyAgIFNldFByb3AoUF9OQU1FLCAiS25vY2hlbnNjaGFlbG1lc3NlciIpOworICAgU2V0UHJvcChQX0dFTkRFUiwgMCk7CisgICBBZGRJZCgoeyJrbm9jaGVuc2NoYWVsbWVzc2VyIiwgInNjaGFlbG1lc3NlciIsICJtZXNzZXIifSkpOworICAgU2V0UHJvcChQX1dDLCAxNDUpOworICAgU2V0UHJvcChQX05SX0hBTkRTLCAxKSwKKyAgIFNldFByb3AoUF9XRUFQT05fVFlQRSwgV1RfS05JRkUpOworICAgU2V0UHJvcChQX0RBTV9UWVBFLCBEVF9TTEFTSCk7CisgICBTZXRQcm9wKFBfVkFMVUUsIDE2MTApOworICAgU2V0UHJvcChQX1dFSUdIVCwgMTE1MCk7CisgICBTZXRQcm9wKFBfTUFURVJJQUwsIE1BVF9NSVNDX01FVEFMKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL29iai9zdGFobHNjaHdlcnQuYyBiL2RvYy9iZWlzcGllbGUvc3NwL29iai9zdGFobHNjaHdlcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDQ2ODk4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9zc3Avb2JqL3N0YWhsc2Nod2VydC5jCkBAIC0wLDAgKzEsMjEgQEAKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8Y29tYmF0Lmg+Citpbmhlcml0ICJzdGQvd2VhcG9uIjsKKyAKK2NyZWF0ZSgpCit7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9TSE9SVCwgIkVpbiBTdGFobHNjaHdlcnQiKTsKKyAgU2V0UHJvcChQX0xPTkcsICJEaWVzZXMgU2Nod2VydCBoYXQgZWluZSBLbGluZ2UgYXVzIHJlaW5lbSBTdGFobCwgbWl0IGRlciBtYW4gc2VpbmUgR2VnbmVyXG53b2hsIHppZW1saWNoIGd1dCBuaWVkZXJtYWNoZW4ga2Fubi4gRGFzIFNjaHdlcnQgaXN0IHJlY2h0IHNjaHdlciB1bmRcbmxhZXNzdCBzaWNoIG51ciBtaXQgendlaSBIYWVuZGVuIGZ1ZWhyZW4uXG4iKTsKKyAgU2V0UHJvcChQX05BTUUsICJTdGFobHNjaHdlcnQiKTsKKyAgU2V0UHJvcChQX0dFTkRFUiwgMCk7CisgIFNldFByb3AoUF9XQywgMTc1KTsKKyAgU2V0UHJvcChQX1ZBTFVFLCAxNzUwICsgcmFuZG9tKDEwMCkpOworICBTZXRQcm9wKFBfV0VJR0hULCAyOTI2KTsKKyAgU2V0UHJvcChQX1dFQVBPTl9UWVBFLCBXVF9TV09SRCk7CisgIFNldFByb3AoUF9EQU1fVFlQRSwgRFRfU0xBU0gpOworICBTZXRQcm9wKFBfTlJfSEFORFMsIDIpOworICBTZXRQcm9wKFBfTUFURVJJQUwsIE1BVF9TVEVFTCk7CisgIEFkZElkKCh7InNjaHdlcnQiLCAic3RhaGxzY2h3ZXJ0IiwgIlxuc3Nwc3RhaGxzY2h3ZXJ0In0pKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL29iai9zdGVpbnJpbmcuYyBiL2RvYy9iZWlzcGllbGUvc3NwL29iai9zdGVpbnJpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGEwOWE3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9zc3Avb2JqL3N0ZWlucmluZy5jCkBAIC0wLDAgKzEsMTkgQEAKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8Y29tYmF0Lmg+Citpbmhlcml0ICJzdGQvYXJtb3VyIjsKKyAKK2NyZWF0ZSgpCit7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9TSE9SVCwgIkVpbiBTdGVpbnJpbmciKTsKKyAgU2V0UHJvcChQX0xPTkcsICJFaW4ga2xlaW5lciBSaW5nLCB2b2VsbGlnIGF1cyBlaW5lbSBncmF1ZW4gU3RlaW4uXG4iKTsKKyAgU2V0UHJvcChQX05BTUUsICJTdGVpbnJpbmciKTsKKyAgU2V0UHJvcChQX0dFTkRFUiwgMSk7CisgIFNldFByb3AoUF9BUk1PVVJfVFlQRSwgQVRfUklORyk7CisgIFNldFByb3AoUF9BQywgMik7CisgIFNldFByb3AoUF9XRUlHSFQsIDI3MCk7CisgIFNldFByb3AoUF9WQUxVRSwgMzAwICtyYW5kb20oMTUwKSk7CisgIFNldFByb3AoUF9NQVRFUklBTCwgTUFUX01JU0NfU1RPTkUpOworICBBZGRJZCgoeyJyaW5nIiwgInN0ZWlucmluZyJ9KSk7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3NzcC9vYmovdGl0YW5yaW5nLmMgYi9kb2MvYmVpc3BpZWxlL3NzcC9vYmovdGl0YW5yaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg5ZGU2NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvc3NwL29iai90aXRhbnJpbmcuYwpAQCAtMCwwICsxLDE4IEBACitpbmhlcml0ICJzdGQvYXJtb3VyIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxjb21iYXQuaD4KKworY3JlYXRlKCkKK3sKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX1NIT1JULCAiRWluIFRpdGFucmluZyIpOworICBTZXRQcm9wKFBfTE9ORywgIkVpbiBSaW5nIGF1cyBUaXRhbi5cbiIpOworICBTZXRQcm9wKFBfTkFNRSwgIlRpdGFucmluZyIpOworICBTZXRQcm9wKFBfR0VOREVSLCAxKTsKKyAgQWRkSWQoKHsidGl0YW5yaW5nIiwgInJpbmcifSkpOworICBTZXRQcm9wKFBfQVJNT1VSX1RZUEUsIEFUX1JJTkcpOworICBTZXRQcm9wKFBfQUMsIDIpOworICBTZXRQcm9wKFBfV0VJR0hULCAyODApOworICBTZXRQcm9wKFBfVkFMVUUsIDUyMCk7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3NzcC9vYmovdHJvbGxkb2xjaC5jIGIvZG9jL2JlaXNwaWVsZS9zc3Avb2JqL3Ryb2xsZG9sY2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDA2MDkyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9zc3Avb2JqL3Ryb2xsZG9sY2guYwpAQCAtMCwwICsxLDIxIEBACisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGNvbWJhdC5oPgoraW5oZXJpdCAic3RkL3dlYXBvbiI7CisgCitjcmVhdGUoKQoreworICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuOworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfU0hPUlQsICJFaW4gVHJvbGxkb2xjaCIpOworICBTZXRQcm9wKFBfTE9ORywgIkVpbiBsYW5nZXIsIHNjaGFyZmVyIERvbGNoLCBkZW0gR2VzdGFuayBuYWNoIG11c3MgZXIgZWluZW0gVHJvbGxcbmdlaG9lcnQgaGFiZW4uXG4iKTsKKyAgU2V0UHJvcChQX05BTUUsICJUcm9sbGRvbGNoIik7CisgIFNldFByb3AoUF9HRU5ERVIsIDEpOworICBTZXRQcm9wKFBfV0MsIDExOSk7CisgIFNldFByb3AoUF9WQUxVRSwgMTAwMCArcmFuZG9tKDQwMCkpOworICBTZXRQcm9wKFBfV0VJR0hULCA1MDAgK3JhbmRvbSg1MCkpOworICBTZXRQcm9wKFBfV0VBUE9OX1RZUEUsIFdUX0tOSUZFKTsKKyAgU2V0UHJvcChQX0RBTV9UWVBFLCBEVF9QSUVSQ0UpOworICBTZXRQcm9wKFBfTlJfSEFORFMsIDEpOworICBTZXRQcm9wKFBfTUFURVJJQUwsIE1BVF9NSVNDX01FVEFMKTsKKyAgQWRkSWQoKHsiZG9sY2giLCAidHJvbGxkb2xjaCJ9KSk7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3Rlc3RvYmpla3RlLy5yZWFkbWUgYi9kb2MvYmVpc3BpZWxlL3Rlc3RvYmpla3RlLy5yZWFkbWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZmZjQxZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvdGVzdG9iamVrdGUvLnJlYWRtZQpAQCAtMCwwICsxLDEzIEBACisKK0hpZXIgbGllZ2VuIFRlc3QtT2JqZWt0ZSB6dSBtYW4tcGFnZXMuIFVudGVyc2NoaWVkZW4gd2lyZCBtb21lbnRhbiBudXIgbmFjaDoKKy0geHh4X3Rlc3RvYmogLT4gZGFzIGthbm4gbWFuIGxhZGVuIHVuZCBnZ2YgY2xvbmVuCistIHh4eF90ZXN0cmF1bSAtPiBkZW4ga2FubiBtYW4gYmV0cmV0ZW4KKworRGVyIFByYWVmaXggZGV1dGV0IGFuLCBmdWVyIHdlbGNoZSBGZWF0dXJlcyAoYWxzbyBtYW4tcGFnZXMpIGRlciBUZXN0Y29kZSBnZXNjaHJpZWJlbiB3dXJkZS4gRGllIG1hbi1wYWdlIHNlbGJzdCBuZW5udCBkaWVzZW4gRGF0ZWluYW1lbiBoaWVyLCBpbnNvZmVybjoKKyogYml0dGUgbWl0IEJlZGFjaHQgdmVyYWVuZGVybiAtIHBydWVmZW4sIHdlbGNoZSBGdW5rdGlvbmFsaXRhZXQKKyAgYmVpc3BpZWxoYWZ0IGdlemVpZ3Qgd2VyZGVuIHNvbGwgdW5kIGRhcyBuaWNodCBsb2VzY2hlbgorKiBiaXR0ZSBEYXRlaW5hbWVuIG51ciB2ZXJhZW5kZXJuLCB3ZW5uIGlociBldWNoIHNpY2hlciBzZWlkLCBfYWxsZV8KKyAgZGFyYXVmIHZlcndlaXNlbmRlbiBtYW4tcGFnZXMgZWJlbmZhbGxzIGdlYWVuZGVydCB6dSBoYWJlbgorCitWZXJhbnR3b3J0bGljaDogR2xvaW5zb24KKwpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS90ZXN0b2JqZWt0ZS9hdHRhY2tfYnVzeV9zZW5zaXRpdmVfdGVzdG9iai5jIGIvZG9jL2JlaXNwaWVsZS90ZXN0b2JqZWt0ZS9hdHRhY2tfYnVzeV9zZW5zaXRpdmVfdGVzdG9iai5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMjVkODgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3Rlc3RvYmpla3RlL2F0dGFja19idXN5X3NlbnNpdGl2ZV90ZXN0b2JqLmMKQEAgLTAsMCArMSwxMDUgQEAKK2luaGVyaXQgIi9zdGQvdGhpbmciOw0KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+DQorI2luY2x1ZGUgPG5ld19za2lsbHMuaD4NCisjaW5jbHVkZSA8c2Vuc2l0aXZlLmg+DQorDQorcHJpdmF0ZSBhY3Rpb25fcHVzdGUoc3RyaW5nIHN0cik7DQorcHJpdmF0ZSBpbnQgY291bnRlcjsNCisNCit2b2lkIGNyZWF0ZSgpIHsNCisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47DQorICA6OmNyZWF0ZSgpOw0KKyAgY291bnRlciA9IDIrcmFuZG9tKDQpOw0KKyAgDQorICBTZXRQcm9wKFBfTkFNRSwgIlB1c3RlYmx1bWUiKTsNCisgIFNldFByb3AoUF9TSE9SVCwgIkVpbmUga2xlaW5lIFB1c3RibHVtZSIpOw0KKyAgU2V0UHJvcChQX0xPTkcsIGJyZWFrX3N0cmluZygNCisgICAgIkVpbmUgYWJnZWJsdWVodGUgUGZsYW56ZSwgZGllIGpldHp0IHdpZSBlaW4ga2xlaW5lciwgd2Vpc3NlciBCYWxsICINCisJImF1c3NpZWh0LiBEaWUgZmllZHJpZ2VuIFNhbWVuIGZsaWVnZW4gYmVzdGltbXQgcHJpbWEuIiwgNzgpKTsNCisgIEFkZERldGFpbCgic2FtZW4iLCAiRXIgc2llaHQgc2VociBmZWluIHVuZCBsZWljaHQgYXVzLlxuIik7DQorICBTZXRQcm9wKFBfR0VOREVSLEZFTUFMRSk7DQorICBTZXRQcm9wKFBfTUFURVJJQUwsIE1BVF9NSVNDX1BMQU5UKTsNCisgIFNldFByb3AoUF9OT0JVWSwgMSk7DQorICBTZXRQcm9wKFBfVkFMVUUsIHJhbmRvbSgxMCkpOw0KKw0KKyAgU2V0UHJvcChQX0lORk8sICJTdGFya2VyIFdpbmQgdGFldGUgaWhyIG5pY2h0IGd1dC5cbiIpOw0KKw0KKyAgQWRkSWQoKHsiYmx1bWUiLCAicHVzdGVibHVtZSIsICJsb2V3ZW56YWhuIn0pKTsNCisgIFNldFByb3AoUF9DT01CQVRDTURTLChbInB1c3RlIGxvZXdlbnphaG4iOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAoW0NfSEVBTDogNV0pXSkpOw0KKw0KKyAgU2V0UHJvcChQX1NFTlNJVElWRSwoeyh7U0VOU0lUSVZFX0FUVEFDSywgRFRfQUlSLCAyMH0pLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICh7U0VOU0lUSVZFX0lOVkVOVE9SWSwgRFRfQUlSLCAyMH0pfSkpOw0KKyANCisgIEFkZENtZCgicHVzdGUmQElEIiwgIydhY3Rpb25fcHVzdGUsICJQdXN0ZSB3ZW4gb2RlciB3YXMgKGFuKT8iKTsNCit9DQorDQorcHJpdmF0ZSBhY3Rpb25fcHVzdGUoc3RyaW5nIHN0cikgew0KKyAgaWYoZW52aXJvbm1lbnQoKSE9dGhpc19wbGF5ZXIoKSkgew0KKyAgICBub3RpZnlfZmFpbCgiRGF6dSBzb2xsdGVzdCBkdSAiK25hbWUoV0VOLDEpKyIgaGFiZW4uXG4iKTsNCisJcmV0dXJuIDA7DQorICB9DQorICBpZiAodGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKFBfQVRUQUNLX0JVU1kpKSB7DQorICAgIHdyaXRlKCJEdSBoYXN0IGRhZnVlciBtb21lbnRhbiBlaW5mYWNoIG5pY2h0IG1laHIgZGllIFB1c3RlLlxuIik7DQorICAgIHJldHVybiAxOw0KKyAgfQ0KKyAgdGhpc19wbGF5ZXIoKS0+U2V0UHJvcChQX0FUVEFDS19CVVNZLCAxKTsNCisNCisgIGlmKGNvdW50ZXI8MCkgew0KKyAgICB3cml0ZShicmVha19zdHJpbmcoIkR1IHB1c3Rlc3Qgc2lubmxvcyBhdWYgIituYW1lKFdFTiwgMikrIi4iLCA3OCkpOw0KKwlzYXkoYnJlYWtfc3RyaW5nKHRoaXNfcGxheWVyKCktPk5hbWUoV0VSKSsNCisJICAiIHB1c3RldCB3aWUgZGFlbWxpY2ggZ2VnZW4gIituYW1lKFdFTiwgMCkrIi4iLCA3OCkpOw0KKwlyZXR1cm4gMTsNCisgIH0gZWxzZSB7DQorICAgIHdyaXRlKGJyZWFrX3N0cmluZygNCisgICAgICAiRHUgcHVzdGVzdCAiK25hbWUoV0VOLCAyKSsiIHZvcnNpY2h0aWcgYW4sIGVpbmlnZSBTYW1lbiAiDQorICAgICAgImxvZXNlbiBzaWNoIHVuZCBmbGllZ2VuIHRhdW1lbG5kIGluIGRlaW5lbSBBdGVtIGRhdm9uLiIrDQorCSAgKGNvdW50ZXI8MD8iIEVzIGJsZWlidCBudXIgbm9jaCBlaW4gbnV0emxvc2VyIFN0cnVuay4iOiIiKSwgNzgpKTsNCisgICAgc2F5KGJyZWFrX3N0cmluZygNCisgICAgICB0aGlzX3BsYXllcigpLT5OYW1lKFdFUikrIiBwdXN0ZXQgc2FjaHRlIGdlZ2VuICIrbmFtZShXRU4sIDApKyIgdW5kICINCisJICAiZHUgc2NoYXVzdCB2ZXJ6dWVja3QgZGVuIGRhdm9uZmxpZWdlbmRlbiBTYW1lbiBuYWNoLiIsIDc4KSk7DQorICB9DQorCQ0KKyAgb2JqZWN0IHdobyA9IHRoaXNfcGxheWVyKCktPlF1ZXJ5RW5lbXkoKTsNCisgIA0KKyAgaWYob2JqZWN0cCh3aG8pKSB7DQorICAgIGlmKCFpbnRlcmFjdGl2ZSh0aGlzX3BsYXllcigpKSkgew0KKyAgICAgIHdoby0+TW9kaWZ5U2tpbGxBdHRyaWJ1dGUoU0FfU1BFRUQsIDgwK3JhbmRvbSgxMCksIDYpOw0KKwkgIHRoaXNfcGxheWVyKCktPmhlYWxfc2VsZig1KTsNCisJfSBlbHNlDQorCSAgd2hvLT5Nb2RpZnlTa2lsbEF0dHJpYnV0ZShTQV9TUEVFRCwgOTArcmFuZG9tKDEwKSwgNCk7DQorICB9DQorDQorICBjb3VudGVyLS07DQorICBpZihjb3VudGVyPDApIHsNCisgICAgY2FsbF9vdXQoIydyZW1vdmUsIDEwK3JhbmRvbSg2MCkpOw0KKwlBZGRJZCgic3RydW5rIik7DQorCVNldFByb3AoUF9OQU1FLCAiU3RydW5rIik7DQorCVNldFByb3AoUF9TSE9SVCwgIkRlciBTdHJ1bmsgZWluZXIgUHVzdGVibHVtZSIpOw0KKwlTZXRQcm9wKFBfTE9ORywgIkVpbiBoYWVzc2xpY2hlciwgbGVlcmVyIFN0cnVuay5cbiIpOw0KKwlTZXRQcm9wKFBfR0VOREVSLCBNQUxFKTsNCisgIH0NCisgIHJldHVybiAxOw0KK30NCisNCitwcml2YXRlIHZvaWQgbm90aWZ5X2Vudl9kZXN0cm95KCkgew0KKyAgb2JqZWN0IG9iID0gZW52aXJvbm1lbnQoKTsNCisgIHdoaWxlKG9iICYmICFsaXZpbmcob2IpKSBvYiA9IGVudmlyb25tZW50KG9iKTsNCisgIGlmKG9iamVjdHAob2IpKQ0KKyAgICB0ZWxsX29iamVjdChvYiwgIkRlciBXaW5kIHplcmJsYWVzdCAiK25hbWUoV0VOLCAyKSsiLlxuIik7DQorICByZW1vdmUoMSk7DQorfQ0KKw0KK3ZhcmFyZ3Mgdm9pZCB0cmlnZ2VyX3NlbnNpdGl2ZV9hdHRhY2soKSB7DQorICBub3RpZnlfZW52X2Rlc3Ryb3koKTsNCit9DQorDQordmFyYXJncyB2b2lkIHRyaWdnZXJfc2Vuc2l0aXZlX2ludigpIHsNCisgIG5vdGlmeV9lbnZfZGVzdHJveSgpOw0KK30NCisNCit2YXJhcmdzIGludCByZW1vdmUoaW50IHNpbGVudCkgew0KKyAgaWYoIXNpbGVudCAmJiBsaXZpbmcoZW52aXJvbm1lbnQoKSkpDQorICAgIHRlbGxfb2JqZWN0KGVudmlyb25tZW50KCksICJEdSB3aXJmc3QgIituYW1lKFdFTiwgMikrIiB3ZWcuXG4iKTsNCisgIHJldHVybiA6OnJlbW92ZShzaWxlbnQpOw0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3Rlc3RvYmpla3RlL2NvbW1hbmRfbWVfdGVzdHJhdW0uYyBiL2RvYy9iZWlzcGllbGUvdGVzdG9iamVrdGUvY29tbWFuZF9tZV90ZXN0cmF1bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MDg2Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3Rlc3RvYmpla3RlL2NvbW1hbmRfbWVfdGVzdHJhdW0uYwpAQCAtMCwwICsxLDMzIEBACisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgoraW5oZXJpdCAiL3N0ZC9yb29tIjsKKwordm9pZCBjcmVhdGUoKSB7CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9MT05HLCAiQWRkQ21kLVRlc3RyYXVtLCBLb21tYW5kb3MgIgorICAgICAgICAgICAgICAgICAgIlwia3JpZWNoXCIgdW5kIFwic2NobGVpY2hlJmhlcmFufGhlcnVtXCIuIik7CisgIEFkZENtZCgic2NobGVpY2hlJmhlcmFufGhlcnVtIiwgImFjdGlvbl9zY2hsZWljaGVuIik7CisgIEFkZEV4aXQoImdpbGRlIiwgIi9naWxkZW4vYWJlbnRldXJlciIpOworfQorCit2b2lkIGluaXQoKSB7CisgIDo6aW5pdCgpOworICBhZGRfYWN0aW9uKCJhY3Rpb25fa3JpZWNoZW4iLCAia3JpZWNoIiwgMSk7Cit9CisKK3N0YXRpYyBhY3Rpb25fc2NobGVpY2hlbihzdHJpbmcgc3RyKSB7CisgIHN0cmluZyB0bXAgPSB0aGlzX3BsYXllcigpLT5RdWVyeVByb3AoUF9SQUNFKTsKKyAgaWYodG1wWzwxXT09J2UnKSB0bXA9dG1wWzAuLjwyXTsKKyAgd3JpdGUoYnJlYWtfc3RyaW5nKCJEdSB2ZXJzdWNoc3QgbGVpc2UgenUgc2NobGVpY2hlbiwgZGFiZWkgcGFzc2llcnQgIgorICAgICJkaXIgYWJlciBlaW4gYWxsenUgIisKKwkodG1wPT0iTWVuc2NoIj8ibWVuc2NobGljaGVzIjpsb3dlcl9jYXNlKHRtcCkrImlzY2hlcyIpKworCSIgTWlzc2dlc2NoaWNrLiBWZXJmbHVjaHQhIiwgNzgpKTsKKyAgdGhpc19wbGF5ZXIoKS0+Y29tbWFuZF9tZSgiXFxmdXJ6ZSIpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBhY3Rpb25fa3JpZWNoZW4oc3RyaW5nIHN0cikgeworICB3cml0ZShicmVha19zdHJpbmcoIkRlaW5lIEtuaWUgdHVuIHp1IHNlaHIgd2VoIGRhZnVlci4iLCA3OCkpOworICB0ZWxsX3Jvb20odGhpc19vYmplY3QoKSwgYnJlYWtfc3RyaW5nKHRoaXNfcGxheWVyKCktPk5hbWUoV0VSKSsKKyAgICAiIGtuYWNrdCBtaXQgZGVuIEtuaWVuLiIsIDc4KSk7CisgIHJldHVybiAxOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvdGVzdG9iamVrdGUvbW9kaWZ5c2tpbGxzcGVsbF90ZXN0LmMgYi9kb2MvYmVpc3BpZWxlL3Rlc3RvYmpla3RlL21vZGlmeXNraWxsc3BlbGxfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNTgzNDIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3Rlc3RvYmpla3RlL21vZGlmeXNraWxsc3BlbGxfdGVzdC5jCkBAIC0wLDAgKzEsMTAzIEBACisvLyBNb2RpZnlTa2lsbC1CZWlzcGllbCBmdWVyIGVpbmVtIFNwZWxsLiBFcmxhZXV0ZXJ1bmcgYXVmIG1hbi1QYWdlCisvLyB1bmQgaW0gT2JqZWt0IHNlbGJzdAoraW5oZXJpdCAiL3N0ZC90aGluZyI7CisjaW5jbHVkZSA8bmV3X3NraWxscy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxicmVha19zdHJpbmcuaD4KKworc3RhdGljIGludCBza2lsbHNldChzdHJpbmcgc3RyKTsKK3N0YXRpYyBpbnQgc2tpbGx1bnNldChzdHJpbmcgc3RyKTsKKwordm9pZCBjcmVhdGUoKSB7CisgIGlmKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHsKKyAgICBzZXRfbmV4dF9yZXNldCgtMSk7CisgICAgcmV0dXJuOworICB9CisKKyAgOjpjcmVhdGUoKTsKKyAgc2V0X25leHRfcmVzZXQoNzIwMCk7CisKKyAgU2V0UHJvcChQX05BTUUsICJTa2lsbGJlaXNwaWVsIik7CisgIFNldFByb3AoUF9TSE9SVCwgIkVpbmUgU2tpbGxiZWlzcGllbCIpOworICBTZXRQcm9wKFBfTE9ORywgYnJlYWtfc3RyaW5nKAorICAgICJNaXQgXCJza2lsbHNldFwiIGthbm4gbWFuIHNpY2ggZGVuIFNraWxsIChlaWdlbnRsaWNoIFNwZWxsKSAiCisgICAgIlwiZm5yeFwiIHNldHplbi5cbiIrCisgICAgIkR1cmNoIFwic2tpbGx1bnNldFwiIHdpcmQgZGVyIFNraWxsIGdlbG9lc2NodC5cbiIKKyAgICAiRGFzIHphZWhsdCBkZXNoYWxiIGFscyBTcGVsbCwgd2VpbCBlciBrbGVpbmdlc2NocmllYmVuIHVuZCAiCisgICAgImRhbWl0IGRpcmVrdCB2b20gU3BpZWxlciAoYWxzbyBkaXIpIGFscyBLb21tYW5kbyB2aWEgVXNlU3BlbGwoKSAiCisgICAgImF1c2Z1ZWhyYmFyIGlzdC4iLCA3OCwgMCwgQlNfTEVBVkVfTVlfTEZTKSk7CisgIFNldFByb3AoUF9HRU5ERVIsIE5FVVRFUik7CisgIEFkZElkKCh7ImJlaXNwaWVsIiwgInNraWxsYmVpc3BpZWwiLCAic3BlbGxiZWlzcGllbCIsCisgICAgICAgICAgInNraWxsIiwgInNwZWxsIn0pKTsKKyAgCisgIEFkZENtZCgic2tpbGxzZXQiLCAjJ3NraWxsc2V0KTsKKyAgQWRkQ21kKCJza2lsbHVuc2V0IiwgIydza2lsbHVuc2V0KTsKK30KKworLy8gVGVzdGZ1bmt0aW9uLCB3ZWlsIGltIENvZGUgZGF6dSBhdWZnZWZvcmRlcnQgd2lyZCwgZGFzIE9iamVrdCBhdWNoCisvLyBtYWwgenUgd2VnenVsZWdlbi4gU3BpZWxlciBzb2xsdGVuIG5pY2h0IGFuIHNpY2ggaGVydW1mdW1tZWxuLgorcHJpdmF0ZSBzdGF0aWMgaW50IF9jaGVja0xlYXJuZXIob2JqZWN0IHBsKSB7CisgIGlmKCFJU19MRUFSTkVSKHRoaXNfcGxheWVyKCkpKSB7CisgICAgbm90aWZ5X2ZhaWwoIkR1IGJpc3Qga2VpbiBNYWdpZXIsIGRlc2hhbGIgZ2VodCBkYXMgbmljaHQuXG4iKTsKKyAgICBjYWxsX291dCgjJ3JlbW92ZSwgMSk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc2tpbGxzZXQoc3RyaW5nIHN0cikgeworICBpZighX2NoZWNrTGVhcm5lcih0aGlzX3BsYXllcigpKSkKKyAgICByZXR1cm4gMDsKKworICBpZih0aGlzX3BsYXllcigpLT5RdWVyeVNraWxsKCJmbnJ4IikpIHsKKyAgICBub3RpZnlfZmFpbCgiRHUga2FubnN0IGRlbiBTa2lsbCBzY2hvbi5cbiIpOworICAgIHJldHVybiAwOworICB9CisKKyAgdGhpc19wbGF5ZXIoKS0+TW9kaWZ5U2tpbGwoImZucngiLAorICAgIChbU0lfQ0xPU1VSRTogZnVuY3Rpb24gaW50IChvYmplY3QgY2FzdGVyLCBzdHJpbmcgc2tpbGwsIG1hcHBpbmcgc2luZikgeworICAgICAgICAgICAgY2FzdGVyLT5MZWFyblNraWxsKCJmbnJ4IiwgMSk7CisgICAgICAgICAgICB0ZWxsX29iamVjdChjYXN0ZXIsICJQZW5nISBEZWluIFNraWxsd2VydCBzdGVpZ3QgYXVmICIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3Rlci0+UXVlcnlTa2lsbEFiaWxpdHkoImZucngiKSsiLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgICAgfSwKKyAgICAgIFNJX1NLSUxMQUJJTElUWTogODQzMl0pLCAxMDAsICJBTlkiKTsKKyAgdGVsbF9vYmplY3QodGhpc19wbGF5ZXIoKSwgYnJlYWtfc3RyaW5nKAorICAgICJEZXIgU2tpbGwgaXN0IGdlc2V0enQuIFRpcHAgZG9jaCBlaW4gcGFhciBNYWwgXCJmbnJ4XCIgdW5kIHNjaGF1IGRlbiAiCisgICAgIkNvZGUgdW50ZXIgIitsb2FkX25hbWUodGhpc19vYmplY3QoKSkrIiBhbiwgZGFtaXQgZHUgc2llaHN0LCBkYXNzIGRlciAiCisgICAgIlNraWxsIGpldHp0IG51ciBhdXMgZWluZW0gRWludHJhZyBpbiBkaXIgdW5kIGVpbmVyIHVlYmVyIFVzZVNwZWxsKCkgIgorICAgICJnZXJ1ZmVuZW4gRnVua3Rpb24gaW4gZGllc2VtIE9iamVrdCBiZXN0ZWh0LiBEZXIgU2tpbGwgaXN0IGtlaW4gIgorICAgICJLb21tYW5kbyBpbiBlaW5lbSBhbmRlcmVuIE9iamVrdC5cblxuIgorICAgICJXZW5uIGR1IGRpZXNlcyBPYmpla3Qgd2VnbGVnc3QsIGZ1bmt0aW9uaWVydCBhbHNvIGFsbGVzIHdlaXRlci4gIgorICAgICJaZXJzdG9lcnN0IGR1IGFiZXIgZGFzIE9iamVrdCAob2RlciBkaWNoIG1pdCBcImVuZGVcIiwgZnVua3Rpb25pZXJ0ICIKKyAgICAiZGllIFNraWxsZnVua3Rpb24gbmljaHQgbWVoci5cbiIKKyAgICAiU2NoYXUgZGlyIGF1Y2ggeGV2YWwgdGhpc19wbGF5ZXIoKS0+UXVlcnlTa2lsbChcImZucnhcIikgYW4uIiwgNzgsIDAsCisgICAgQlNfTEVBVkVfTVlfTEZTKSk7CisgIHJldHVybiAxOworfQorCisvLyBIZXJlIGJlIGRyYWdvbnMhCisvLyBCaXR0ZSBiZW51dHp0IGRpZSBmb2xnZW5kZSBBcnQgdm9uIE1hbmlwdWxhdGlvbiBkZXIgU2tpbGxzIG51ciBkYW5uLAorLy8gd2VubiBpaHIgZ2VuYXUgd2lzc3QsIHdhcyBpaHIgdHV0LiBJbiBhbmRlcmVuIFdvcnRlbjogTklDSFQgTUFDSEVOIQorLy8gVW5kIHdlbm4sIGRhbm4gTlVSIEFNIEVJR0VORU4gTUFHSUVST0JKRUtULCBOSUNIVCBBTiBTUElFTEVSTiEKK3N0YXRpYyBpbnQgc2tpbGx1bnNldChzdHJpbmcgc3RyKSB7CisgIGlmKCFfY2hlY2tMZWFybmVyKHRoaXNfcGxheWVyKCkpKQorICAgIHJldHVybiAwOworCisgIC8vIHBlciBRdWVyeSgpIGRhcyBNYXBwaW5nIGFuIGRlciBfcXVlcnlfKi1GdW4gdm9yYmVpIGRpcmVrdCBob2xlbgorICBtYXBwaW5nIHNraWxscyA9IHRoaXNfcGxheWVyKCktPlF1ZXJ5KFBfTkVXU0tJTExTKTsKKyAgLy8gLi4uIHVuZCBtYW5pcHVsaWVyZW4gKHdpcmt0IHNpY2ggd2VnZW4gUmVmZXJlbnogZGlyZWt0IGF1cykKKyAgaWYobWFwcGluZ3Aoc2tpbGxzKSAmJiBtYXBwaW5ncChza2lsbHNbIkFOWSJdKSAmJgorICAgICBtZW1iZXIoc2tpbGxzWyJBTlkiXSwgImZucngiKSkgeworICAgIGVmdW46Om1fZGVsZXRlKHNraWxsc1siQU5ZIl0sICJmbnJ4Iik7CisgICAgdGVsbF9vYmplY3QodGhpc19wbGF5ZXIoKSwgIkVybGVkaWd0LlxuIik7CisgIH0gZWxzZQorICAgIHRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksICJOaWNodHMgenUgZXJsZWRpZ2VuLlxuIik7CisgIAorICByZXR1cm4gMTsKK30KKwordm9pZCByZXNldCgpIHsKKyAgcmVtb3ZlKCk7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3Rlc3RvYmpla3RlL25ldGRlYWRfaW5mb190ZXN0cmF1bS5jIGIvZG9jL2JlaXNwaWVsZS90ZXN0b2JqZWt0ZS9uZXRkZWFkX2luZm9fdGVzdHJhdW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmQ4YTcxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS90ZXN0b2JqZWt0ZS9uZXRkZWFkX2luZm9fdGVzdHJhdW0uYwpAQCAtMCwwICsxLDY5IEBACisvLyBCZWlzcGllbHJhdW0gZnVlciBQX05FVERFQURfSU5GTy1GdW5rdGlvbmFsaXRhZXQKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8YnJlYWtfc3RyaW5nLmg+Citpbmhlcml0ICIvc3RkL3Jvb20iOworICAgICAKK3N0cmluZyBjcmVhdGVfZGVzdGlueShtaXhlZCB2YWwpOworaW50IGNyZWF0ZV9yb29tKHN0cmluZyBkaXIpOworCit2b2lkIGNyZWF0ZSgpIHsKKyAgOjpjcmVhdGUoKTsKKworICBpZiAoY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSB7CisgICAgLy8gc2V0emUgSW5mb3JtYXRpb25lbiwgZGllIGluIGVpbmVtIE5ldHp0b3RlbiBnZXNwZWljaGVydCB3ZXJkZW4gc29sbGVuCisgICAgU2V0KFBfTkVUREVBRF9JTkZPLCByYW5kb20oNSkpOworICAgIFNldFByb3AoUF9JTlRfTE9ORywgYnJlYWtfc3RyaW5nKAorICAgICAgIldlbm4gZHUgaGllciBlaW5zY2hsYWVmc3QsIHdpcmQgZGVyIFJhdW0gbmFjaCAzMHMgemVyc3RvZXJ0LiBCZWltICIKKyAgICAgICJBdWZ3YWNoZW4gd2lyc3QgZHUgYW4gZGllIEJsdWVwcmludCBkaWVzZXMgUmF1bXMgZGllIEluZm8gIisKKyAgICAgIFF1ZXJ5UHJvcChQX05FVERFQURfSU5GTykrIiB1ZWJlcmdlYmVuLiBEaWVzZSB3aXJkIGF1cyBkaWVzZXIgSW5mbyAiCisgICAgICAiZWluZW4gUmF1bXBmYWQgZXJtaXR0ZWxuLCBpbiBkZW4gZHUgYmV3ZWd0IHdpcnN0LiIsIDc4KSk7CisgIH0gZWxzZSB7CisgICAgLy8gQmx1ZXByaW50OiBoaWVyIGthbm4gbWFuIHp1IGVpbmVtIENsb25lcmF1bSBnZWhlbgorICAgIEFkZEV4aXQoImNsb25lcmF1bSIsICMnY3JlYXRlX3Jvb20pOworICAgIFNldFByb3AoUF9JTlRfTE9ORywgYnJlYWtfc3RyaW5nKAorICAgICAgIlp1bSBUZXN0ZW4gZWluZmFjaCBkZW4gQXVzZ2FuZyAnY2xvbmVyYXVtJyBiZW51dHplbi4gRXMgd2lyZCBkYW5uICIKKyAgICAgICJlaW4gUmF1bSBnZWNsb250LCBpbiBkZW4gbWFuIGJld2VndCB3aXJkLiBXZW5uIG1hbiBkb3J0IGVpbnNjaGxhZWZ0LCAiCisgICAgICAid2lyZCBkZXIgZ2VjbG9udGUgUmF1bSBuYWNoIGNpcmNhIDMwcyB6ZXJzdG9lcnQuXG4iCisgICAgICAiQmVpbSBBdWZ3YWNoZW4gd2VyZGVuIGRpZSBpbSBTcGllbGVyIGdlc3BlaWNoZXJ0ZW4gSW5mb3JtYXRpb25lbiBkZXMgIgorICAgICAgImdlY2xvbnRlbiAodW5kIG51bm1laHIgemVyc3RvZXJ0ZW4pIFJhdW1lcyBiZW51dHp0LCB1bSBlaW5lbiAiCisgICAgICAiYWx0ZXJuYXRpdmVuIEF1ZndhY2hyYXVtIChLbGVydXNnaWxkZSwgS2FyYXRlZ2lsZGUsIFdhbGQgb2RlciBQb3J0ICIKKyAgICAgICJWYWluKSB6dSBiZXN0aW1tZW4uXG4iCisgICAgICAiQW5kZXJuZmFsbHMgd3VlcmRlIGRlciBTcGllbGVyIGluIGRlciBBYmVudGV1cmVyZ2lsZGUgZXJ3YWNoZW4uIiwgNzgsCisgICAgICAwLCBCU19MRUFWRV9NWV9MRlMpKTsKKyAgfQorCisgIC8vIFNldC1NZXRob2QsIHVtIGRpZSBJbmZvcm1hdGlvbmVuIGF1cyBQX05FVERFQURfSU5GTyBiZWltIEF1ZndhY2hlbgorICAvLyBpbiBkZXIgQmx1ZXByaW50IGF1c3dlcnRlbiB6dSBrb2VubmVuCisgIFNldChQX05FVERFQURfSU5GTywgIydjcmVhdGVfZGVzdGlueSwgRl9TRVRfTUVUSE9EKTsKKyAgU2V0UHJvcChQX0xJR0hULCAxKTsKK30KKyAgICAgCisvLyBSYXVtIGVudGZlcm5lbiwgbm9ybWFsZXJ3ZWlzZSBzbyBLRUlORSBHVVRFIElERUUhCit2b2lkIEJlY29tZXNOZXREZWFkKG9iamVjdCBwbCkgeworICBjYWxsX291dCgjJ3JlbW92ZSwgMzApOworfQorCisvLyBlcnpldWdlIGVpbmVuIENsb25lcmF1bSB1bmQgYmV3ZWdlIGRlbiBTcGllbGVyIGRhaGluCitpbnQgY3JlYXRlX3Jvb20oc3RyaW5nIGRpcikgeworICBvYmplY3QgZGVzdCA9IGNsb25lX29iamVjdChvYmplY3RfbmFtZSh0aGlzX29iamVjdCgpKSk7CisgIHRoaXNfcGxheWVyKCktPm1vdmUoZGVzdCwgTV9OT0NIRUNLKTsKKyAgcmV0dXJuIDE7Cit9CisgICAgIAorLy8gU2V0LU1ldGhvZCBmdWVyIFBfTkVUREVBRF9JTkZPOiBnaWJ0IFBmYWQgenVydWVjaworLy8gYmVudXR6ZSBkaWUgSW5mb3JtYXRpb25lbiBhdXMgZGVtIGpldHp0IGF1ZndhY2hlbmRlbiBOZXR6dG90ZW4sIHVtIGVpbmVuCisvLyBhbHRlcm5hdGl2ZW4gQXVmd2FjaHJhdW0genUgZXJtaXR0ZWxuLCBkYSBkZXIgRWluc2NobGFmcmF1bSB6ZXJzdG9lcnQgaXN0CitzdHJpbmcgY3JlYXRlX2Rlc3RpbnkobWl4ZWQgdmFsKSB7CisgIGlmIChpbnRwKHZhbCkpIHsKKyAgICBzd2l0Y2ggKHZhbCkgeworICAgICAgY2FzZSAwOgorICAgICAgICByZXR1cm4gIi9kL2ViZW5lL3Jvb20vUG9ydFZhaW4vcG9faGFmMSI7CisgICAgICBjYXNlIDE6CisgICAgICAgIHJldHVybiAiL2dpbGRlbi9rbGVydXMiOworICAgICAgY2FzZSAyOgorICAgICAgICByZXR1cm4gIi9naWxkZW4va2FyYXRlIjsKKyAgICAgIGRlZmF1bHQ6CisgICAgfQorICAgIHJldHVybiAiL2QvZWJlbmUvcm9vbS93YWxkd2VnNCI7CisgIH0KK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvdmlydHVhbC8ucmVhZG1lIGIvZG9jL2JlaXNwaWVsZS92aXJ0dWFsLy5yZWFkbWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NiZGVkMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvdmlydHVhbC8ucmVhZG1lCkBAIC0wLDAgKzEsMiBAQAorRWluIGVpbmZhY2hlcyBCZWlzcGllbCBmdWVyIHBlciB2aXJ0dWFsIGNvbXBpbGVyIGVyemV1Z3RlIE9iamVrdGUgdm9uIFplc3N0cmEKK3VuZCBlaW4gbGVpY2h0IGtvbXBsZXhlcmVzIHZvbiBIYXRlLgpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS92aXJ0dWFsL2hhdGUvdl9yb29tLmMgYi9kb2MvYmVpc3BpZWxlL3ZpcnR1YWwvaGF0ZS92X3Jvb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWMyOGZkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS92aXJ0dWFsL2hhdGUvdl9yb29tLmMKQEAgLTAsMCArMSwxMiBAQAoraW5oZXJpdCAiL3N0ZC9yb29tIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisKK2NyZWF0ZSgpCit7CisgICAgICAgIGlmKElTX0JMVUUodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgICAgICAgOjpjcmVhdGUoKTsKKyAgICAgICAgcHJldmlvdXNfb2JqZWN0KCktPkN1c3RvbWl6ZU9iamVjdCgpOworICAgICAgICBjYWxsX291dChzeW1ib2xfZnVuY3Rpb24oIlF1ZXJ5T2JqZWN0IiwgZmluZF9vYmplY3QoT0JKRUNURCkpLCAyKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvdmlydHVhbC9oYXRlL3ZyX2NvbXBpbGVyLmMgYi9kb2MvYmVpc3BpZWxlL3ZpcnR1YWwvaGF0ZS92cl9jb21waWxlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNTBkMGIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3ZpcnR1YWwvaGF0ZS92cl9jb21waWxlci5jCkBAIC0wLDAgKzEsODUgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBWUl9DT01QSUxFUi5DIC0tIHZpcnR1YWwgcm9vbSBjb21waWxlcgorLy8KKy8vICREYXRlOiAyMDAyLzA4LzI4IDA5OjU3OjE4ICQKKy8vICRSZXZpc2lvbjogMS4zICQKKy8qICRMb2c6IHZyX2NvbXBpbGVyLmMsdiAkCisgKiBSZXZpc2lvbiAxLjMgIDIwMDIvMDgvMjggMDk6NTc6MTggIFJpa3VzCisgKiBhdWYgc3Ryb25nX3R5cGVzIHVtZ2VzdGVsbHQKKyAqCisgKiBSZXZpc2lvbiAxLjIgIDE5OTQvMDcvMjcgMTQ6NDg6MTggIEpvZgorICogc3VpZAorICoKKyAqIFJldmlzaW9uIDEuMSAgMTk5NC8wMi8wMSAgMTk6NDc6NTcgIEhhdGUKKyAqIEluaXRpYWwgcmV2aXNpb24KKyAqCisqLworCisvLyBwcmluY2lwbGU6CisvLyAJLSBpbmhlcml0IHRoaXMgb2JqZWN0IGludG8geW91ciBvd24gJ3ZpcnR1YWxfY29tcGlsZXIuYycKKy8vICAtIGN1c3RvbWl6ZSBWYWxpZGF0ZSgpIGFuZCBDdXN0b21pemVPYmplY3QoKSBmb3IgeW91IG93biBzYWtlCisvLyAgCisvLyAgKiBWYWxpZGF0ZSgpIGNoZWNrcyBpZiBhIHJvb20gZmlsZW5hbWUgZ2l2ZW4gYXMgYXJndW1lbnQgKHdpdGhvdXQgcGF0aCkKKy8vICAgIGlzIHZhbGlkIGFuZCByZXR1cm5zIHRoaXMgZmlsZW5hbWUgd2l0aCBzdHJpcHBlZCAnLmMnISEKKy8vICAqIEN1c3RvbWl6ZU9iamVjdCgpIHVzZXMgdGhlIHByZXZpb3VzX29iamVjdCgpLT5GdW5jdGlvbigpIHN0cmF0ZWd5IHRvCisvLyAgICBjdXN0b21pemUgdGhlIHN0YW5kYXJkIG9iamVjdCAoZm9yIGV4YW1wbGUgdG8gc2V0IGEgZGVzY3JpcHRpb24pCisvLworLy8gUHJvcGVydGllczogUF9WQUxJRF9OQU1FLCBQX01JTl9YLCBQX01BWF9YLCBQX01JTl9ZLCBQX01BWF9ZCisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisKK2luaGVyaXQgIi9zdGQvdmlydHVhbC92X2NvbXBpbGVyIjsKKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKworI2luY2x1ZGUgPHRoaW5nL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8dl9jb21waWxlci5oPgorI2luY2x1ZGUgIi9vYmovdmlydHVhbC92cl9jb21waWxlci5oIgorI2luY2x1ZGUgPHN5c19kZWJ1Zy5oPgorCit2b2lkIGNyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9WQUxJRF9OQU1FLCAicmF1bSIpOworfQorCitzdHJpbmcgVmFsaWRhdGUoc3RyaW5nIGZpbGUpCit7CisgIGludCB4LHk7CisgIHN0cmluZyBwYXRoLCBuYW1lOworCisgIGZpbGUgPSA6OlZhbGlkYXRlKGZpbGUpOworCWlmKChzc2NhbmYoZmlsZSwgIiVzWyVkLCVkXSIsIG5hbWUsIHgsIHkpID09IDMpICYmCisJCQluYW1lID09IFF1ZXJ5UHJvcChQX1ZBTElEX05BTUUpICYmCisJCSAgKHggPj0gUXVlcnlQcm9wKFBfTUlOX1gpICYmIHggPD0gUXVlcnlQcm9wKFBfTUFYX1gpKSAmJgorCQkgICh5ID49IFF1ZXJ5UHJvcChQX01JTl9ZKSAmJiB5IDw9IFF1ZXJ5UHJvcChQX01BWF9ZKSkKKwkJKQorICAgICAgcmV0dXJuIGZpbGU7Cit9CisKK21peGVkIEN1c3RvbWl6ZU9iamVjdCgpCit7CisJc3RyaW5nIHBhdGgsIGZpbGUsIG5hbWU7CisJaW50IHgseTsKKworCWlmKCEoZmlsZSA9IDo6Q3VzdG9taXplT2JqZWN0KCkpKSByZXR1cm4gMDsKKworCXBhdGggPSBRdWVyeVByb3AoUF9DT01QSUxFUl9QQVRIKTsKKwlzc2NhbmYoZmlsZSwgIiVzWyVkLCVkXSIsIG5hbWUsIHgsIHkpOworCW5hbWUgPSBRdWVyeVByb3AoUF9WQUxJRF9OQU1FKTsKKwlpZih5IDwgUXVlcnlQcm9wKFBfTUFYX1kpKQorCSAgICBwcmV2aW91c19vYmplY3QoKS0+QWRkRXhpdCgibm9yZGVuIiwgCisJCXBhdGgrIi8iK25hbWUrIlsiKyh4ICApKyIsIisoeSsxKSsiXSIpOworCWlmKHkgPiBRdWVyeVByb3AoUF9NSU5fWSkpCisJICAgIHByZXZpb3VzX29iamVjdCgpLT5BZGRFeGl0KCJzdWVkZW4iLCAKKwkJcGF0aCsiLyIrbmFtZSsiWyIrKHggICkrIiwiKyh5LTEpKyJdIik7CisJaWYoeCA8IFF1ZXJ5UHJvcChQX01BWF9YKSkKKwkgICAgcHJldmlvdXNfb2JqZWN0KCktPkFkZEV4aXQoIm9zdGVuIiAsIAorCQlwYXRoKyIvIituYW1lKyJbIisoeCsxKSsiLCIrKHkgICkrIl0iKTsKKwlpZih4ID4gUXVlcnlQcm9wKFBfTUlOX1gpKQorCSAgICBwcmV2aW91c19vYmplY3QoKS0+QWRkRXhpdCgid2VzdGVuIiwgCisJCXBhdGgrIi8iK25hbWUrIlsiKyh4LTEpKyIsIisoeSAgKSsiXSIpOworfQorCmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3ZpcnR1YWwvaGF0ZS92cl9jb21waWxlci5oIGIvZG9jL2JlaXNwaWVsZS92aXJ0dWFsL2hhdGUvdnJfY29tcGlsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzNmYzU0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS92aXJ0dWFsL2hhdGUvdnJfY29tcGlsZXIuaApAQCAtMCwwICsxLDMzIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gVl9DT01QSUxFUi5IIC0tIGEgZ2VuZXJhbCB2aXJ0dWFsIGNvbXBpbGVyIG9iamVjdAorLy8KKy8vICREYXRlOiAxOTk0LzAyLzAxIDE5OjQ3OjU3ICQKKy8vICRSZXZpc2lvbjogMS4xICQKKy8qICRMb2c6IHZyX2NvbXBpbGVyLmgsdiAkCisgKiBSZXZpc2lvbiAxLjEgIDE5OTQvMDIvMDEgIDE5OjQ3OjU3ICBIYXRlCisgKiBJbml0aWFsIHJldmlzaW9uCisgKgorKi8KKworI2luY2x1ZGUgPHZfY29tcGlsZXIuaD4KKworI2lmbmRlZiBfX1ZSX0NPTVBJTEVSX0hfXworI2RlZmluZSBfX1ZSX0NPTVBJTEVSX0hfXworCisjZGVmaW5lIFBfVkFMSURfTkFNRQkidmFsaWRfbmFtZSIKKyNkZWZpbmUgUF9NSU5fWAkJCQkibWluX3giCisjZGVmaW5lIFBfTUFYX1gJCQkJIm1heF94IgorI2RlZmluZSBQX01JTl9ZCQkJCSJtaW5feSIKKyNkZWZpbmUgUF9NQVhfWQkJCQkibWF4X3kiCisKKyNlbmRpZiAvLyBfX1ZfQ09NUElMRVJfSF9fCisKKyNpZmRlZiBORUVEX1BST1RPVFlQRVMKKworI2lmbmRlZiBfX1ZSX0NPTVBJTEVSX0hfUFJPVE9fXworI2RlZmluZSBfX1ZSX0NPTVBJTEVSX0hfUFJPVE9fXworCisjZW5kaWYgLy8gX19WUl9DT01QSUxFUl9IX1BST1RPX18KKworI2VuZGlmIC8vTkVFRF9QUk9UT1RZUEVTCmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3ZpcnR1YWwvemVzc3RyYS9zdGRfYXJlbmEuYyBiL2RvYy9iZWlzcGllbGUvdmlydHVhbC96ZXNzdHJhL3N0ZF9hcmVuYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMmU1YTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3ZpcnR1YWwvemVzc3RyYS9zdGRfYXJlbmEuYwpAQCAtMCwwICsxLDIwIEBACitpbmhlcml0ICIvc3RkL3Jvb20iOworCisjcHJhZ21hIHN0cm9uZ190eXBlcyxzYXZlX3R5cGVzLHJ0dF9jaGVja3MKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgICAgaWYoIWNsb25lcChUTykpCisgICAgICAgIHJldHVybjsKKyAgICA6OmNyZWF0ZSgpOworCisgICAgU2V0UHJvcChQX0lOVF9MT05HLCBicmVha19zdHJpbmcoCisgICAgICAgICAgIkR1IHN0ZWhzdCBoaWVyIGluIGVpbmVyIHZvZWxsaWcgbGVlcmVuIEFyZW5hLiIKKyAgICAgICAgICAiR2VnZW4gd2VuIHNvbGx0ZXN0IER1IGhpZXIgZGVubiBnbGVpY2gga2FlbXBmZW4uLi4/Iiw3OCkpOworICAgIFNldFByb3AoUF9JTlRfU0hPUlQsICJJbiBlaW5lciBBcmVuYSIpOworICAgIFNldFByb3AoUF9MSUdIVCwgMSk7CisgICAgU2V0UHJvcChQX0lORE9PUlMsMCk7CisKKyAgICBBZGRFeGl0KCJyYXVzIiwgIi9naWxkZW4vYWJlbnRldXJlciIpOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS92aXJ0dWFsL3plc3N0cmEvdmlydHVhbF9jb21waWxlci5jIGIvZG9jL2JlaXNwaWVsZS92aXJ0dWFsL3plc3N0cmEvdmlydHVhbF9jb21waWxlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NzUzZGYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3ZpcnR1YWwvemVzc3RyYS92aXJ0dWFsX2NvbXBpbGVyLmMKQEAgLTAsMCArMSwzMiBAQAoraW5oZXJpdCAiL3N0ZC92aXJ0dWFsL3ZfY29tcGlsZXIuYyI7CisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHJ0dF9jaGVja3Msc2F2ZV90eXBlcworCisjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPgorCisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPHZfY29tcGlsZXIuaD4KKyN1bmRlZiBORUVEX1BST1RPVFlQRVMKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkgeworICAgIDo6Y3JlYXRlKCk7CisKKyAgICAvLyBqZWRlciBTcGllbGVyIGtyaWVndCBlaW5lICJLb3BpZSIgdm9uIHN0ZF9hcmVuYSBhbHMgUmF1bS4KKyAgICBTZXRQcm9wKFBfU1REX09CSkVDVCwgX19ESVJfXyJzdGRfYXJlbmEiKTsKKyAgICBTZXRQcm9wKFBfQ09NUElMRVJfUEFUSCwgX19ESVJfXyk7Cit9CisKK3B1YmxpYyBzdHJpbmcgVmFsaWRhdGUoc3RyaW5nIGZpbGUpCit7CisgICAgc3RyaW5nIHJhdW0sIHNwaWVsZXI7CisgICAgLy8uYyBhYnNjaG5laWRlbgorICAgIGZpbGU9OjpWYWxpZGF0ZShmaWxlKTsKKyAgICAvLyB3ZW5uIGRhcyBnZXd1ZW5zY2h0IGZpbGUgZGVtIFNjaGVtYSAiYXJlbmF8c3BpZWxlcm5hbWUiIGZvbGd0LCBpc3QgZXMKKyAgICAvLyB6dWxhZXNzaWcuCisgICAgaWYoc3NjYW5mKGZpbGUsIiVzfCVzIixyYXVtLHNwaWVsZXIpPT0yICYmIHJhdW09PSJhcmVuYSIpCisgICAgICAgcmV0dXJuIGZpbGU7CisKKyAgICAvLyBuaWNodCB6dWxhZXNzaWcuCisgICAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9maWxlcy5oIGIvZG9jL2JlaXNwaWVsZS96YXViZXJ3YWxkL2ZpbGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUyNWQ3OAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9maWxlcy5oCkBAIC0wLDAgKzEsMjUgQEAKKy8vIChjKSBieSBQYWRyZWljIChQYWRyZWljQG1nLm11ZC5kZSkKKworI2RlZmluZSBIT01FKHgpICIvZG9jL2JlaXNwaWVsZS8iK3gKKyNkZWZpbmUgV0FMRCh4KSBIT01FKCJ6YXViZXJ3YWxkLyIreCkKKyNkZWZpbmUgUk9PTSh4KSBXQUxEKCJyb29tLyIreCkKKyNkZWZpbmUgTlBDKHgpICBXQUxEKCJucGMvIit4KQorI2RlZmluZSBPQkooeCkgIFdBTEQoIm9iai8iK3gpCisKKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgIi9wL3NlcnZpY2UvcGFkcmVpYy9tbnBjL21ucGMuaCIKKworI2RlZmluZSBCUyh4KSBicmVha19zdHJpbmcoeCwgNzgpCisjZGVmaW5lIFBPICAgIHByZXZpb3VzX29iamVjdCgpCisjZGVmaW5lIERFQlVHKHgpIHRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJwYWRyZWljIiksIHgpOworCisjZGVmaW5lIFNBRUNLQ0hFTiAiL2Qvd2FsZC9wYWRyZWljL29iai9zYWVja2NoZW4uYyIKKworCisjZGVmaW5lIFpBVUJFUldBTEQgIlxucGFkcmVpY3phdWJlcndhbGQiIC8qIGdlc2V0enQgd2VubiBtYW4gaW0gd2FsZCBpc3QgKi8KKyNkZWZpbmUgQUdHUkVTU0lWRV9USU1FIDkwMCAgICAgICAgICAgICAgLyogemVpdCBiaXMgenVyIGJlZnJpZWR1bmcgKi8KKyNkZWZpbmUgWkFVQkVSV0FMRE5QQyBXQUxESUQoIm5wYyIpCisjZGVmaW5lIEFVU0dBTkcgICAgICJcbnBhZHJlaWNhdXNnYW5nIiAgIC8qIGRpZSBsZXR6dGUgQmV3ZWd1bmcgKi8KKyNkZWZpbmUgV0FMRElEKHgpICAgWkFVQkVSV0FMRCt4CisjZGVmaW5lIEVYVFJBX0xPTkcgICAiXG5wYWRyZWljenVzYXR6bG9uZyIgLyogenVyIGVyZ2Flbnp1bmcgenVyIFZDLWxvbmcgKi8KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9ucGMvYXJpbmEuYyBiL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9ucGMvYXJpbmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTA4ZTI1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS96YXViZXJ3YWxkL25wYy9hcmluYS5jCkBAIC0wLDAgKzEsMTAxIEBACisvLyAoYykgYnkgUGFkcmVpYyAoUGFkcmVpY0BtZy5tdWQuZGUpCisKKyNpbmNsdWRlICIuLi9maWxlcy5oIgorI2luY2x1ZGUgPGNvbWJhdC5oPgorI2luY2x1ZGUgPG5ld19za2lsbHMuaD4KKyNpbmNsdWRlICIvcC96YXViZXJlci96YXViZXJlci5oIgorCitpbmhlcml0IE5QQygic3RkbnBjIik7CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgIDo6Y3JlYXRlKCk7CisgICBTZXRQcm9wKFBfU0hPUlQsICJBcmluYSBkaWUgV2FsZGZlZSIpOworICAgU2V0UHJvcChQX0xPTkcsCisgICAgICAiVm9yIERpciBzdGVodCBBcmluYSBkaWUgd2Vpc2UgV2FsZGZlZS4gU2llIGlzdCBkaWUgTGVocmVyaW4gZGVzIFdhbGRlcyB1bmRcbiIKKyAgICAgKyJ1bnRlcnJpY2h0ZXQgZGllIFBpeGllcy4gSW4gaWhyZXIgSGFuZCBoYWVsdCBzaWUgZWluZW4ga2xlaW5lbiBaZWlnZXN0b2NrIG1pdFxuIgorICAgICArImRlbSBzaWUgYWxsZXMgbW9lZ2xpY2hlIGVya2xhZXJ0IHVuZCBCdWNoc3RhYmVuIGluIGRlbiBTYW5kIHplaWNobmV0LiBBdWNoXG4iCisgICAgICsiQXJpbmEgaXN0LCBnZW5hdXNvIHdpZSBpaHJlIFNjaHdlc3RlbiwgYmlsZGh1ZWJzY2gsIGRvY2ggaWhyIGdlc3RyZW5nZXIgQmxpY2tcbiIKKyAgICAgKyJmbG9lc3N0IGplZGVtIGluIGlocmVyIE5hZWhlIGdyb3NzZW4gUmVzcGVrdCBlaW4uXG4iKTsKKyAgIFNldFByb3AoUF9OQU1FLCAiQXJpbmEiKTsKKyAgIFNldFByb3AoUF9BUlRJQ0xFLCAwKTsKKyAgIFNldFByb3AoUF9HRU5ERVIsIEZFTUFMRSk7CisgICBTZXRQcm9wKFBfTEVWRUwsIDgwKTsKKyAgIFNldFByb3AoUF9BVFRSSUJVVEVTLCAoWyJpbnQiOjgwLCJjb24iOjQwLCJzdHIiOjE2LCJkZXgiOjUwXSkgKTsKKyAgIFNldFByb3AoUF9ESVNBQkxFX0FUVEFDSywgLTEwMDAwKTsgLy8gaXMgbmljaCA6KQorICAgU2V0UHJvcChQX0JPRFksIDgwKTsKKyAgIFNldFByb3AoUF9NQVhfU1AsIDIwMDApOworICAgU2V0UHJvcChQX1NQLCAyMDAwKTsKKyAgIFNldFByb3AoUF9NQVhfSFAsIDcwMCk7CisgICBTZXRQcm9wKFBfSFAsIDcwMCk7CisgICBTZXRQcm9wKFBfQUxJR04sIDQwMCk7CisgICBTZXRQcm9wKFBfUkFDRSwgIkZlZSIpOworICAgU2V0UHJvcChQX1NJWkUsIDE2MCtyYW5kb20oMTYpKTsKKyAgIFNldFByb3AoUF9BTENPSE9MLCAwKTsKKyAgIFNldFByb3AoUF9DT1JQU0UsIE9CSigiZmVlbmxlaWNoZSIpKTsKKyAgIFNldFByb3AoUF9NQVhfQUxDT0hPTCwgMCk7IC8vIGtlaW4gcmF1c2NoZW4gOikKKyAgIEFkZEFkamVjdGl2ZSgid3VuZGVyc2Nob2VuIik7CisgICBBZGRJZCgoeyJhcmluYSIsICJmZWUiLCAid2FsZGZlZSIsIFdBTERJRCgiZmVlIil9KSk7CisgICBTZXRQcm9wKFBfSEFORFMsICh7IiBtaXQgaWhyZW4gemFydGVuIEhhZW5kZW4iLCAxNTAsIERUX0JMVURHRU9OfSkgKTsKKyAgIFNldFByb3AoUF9TS0lMTF9BVFRSSUJVVEVfT0ZGU0VUUywgKFtTQV9TUEVMTF9QRU5FVFJBVElPTjogMjAwXSkpOworICAgU2V0UHJvcChQX1hQLCA4MDAqMjAwKjUqMik7CisgICBTZXRQcm9wKFBfR1VJTEQsICJ6YXViZXJlciIpOworICAgU2V0UHJvcChQX1pfTk9fTUFURVJJQUwsIDEpOworICAgU2V0UHJvcChQX0RFRkFVTFRfSU5GTywgInNjaHdlaWd0IHVuZCBsYWVjaGVsdCBEaWNoIGVpbmZhY2ggbnVyIGZyZXVuZGxpY2ggYW4uXG4iKTsKKyAgIE1vZGlmeVNraWxsKCJ2ZXJsZXR6ZSIsCisgICAgICAoW1NJX1NLSUxMQUJJTElUWTo5MDAwLCBTSV9TUEVMTENPU1Q6MCwKKyAgICAgICAgU0lfU1BFTExGQVRJR1VFOjAsIFNJX05PX0NPTlNFUVVFTkNFUzoxMDAwMCwKKyAgICAgICAgU0lfU0tJTExSRVNUUl9VU0U6KFtQX0dVSUxEX0xFVkVMOjAsU1JfRlJFRV9IQU5EUzowXSksCisgICAgICAgIFNJX0FSTU9VUl9SRVNUUjowXSksMCwiemF1YmVyZXIiKTsKKyAgIFNldFByb3AoUF9HVUlMRCwgMCk7CisgICBTZXRQcm9wKFBfUkVTSVNUQU5DRV9TVFJFTkdUSFMsCisgICAgICAoW0RUX1BPSVNPTjogMC4xNSwKKyAgICAgICAgRFRfTUFHSUM6IC0wLjMgXSkgKTsKKyAgIEFkZEl0ZW0oT0JKKCJzdG9jayIpLCBDTE9ORV9XSUVMRCk7CisgICBBZGRJdGVtKE9CSigia2xlaWQiKSwgQ0xPTkVfV0VBUik7CisgICBpZiAoZmlsZV9zaXplKFNBRUNLQ0hFTik+MCkgQWRkSXRlbShTQUVDS0NIRU4sIENMT05FX05FVyk7Cit9CisKK3ZvaWQgQXR0YWNrKG9iamVjdCBlbmVteSkKK3sKKyAgIGludCBub3JtYWxfc3BlZWQ7CisgICBub3JtYWxfc3BlZWQ9KGVuZW15LT5RdWVyeVByb3AoUF9TS0lMTF9BVFRSSUJVVEVfT0ZGU0VUUyl8fChbXSkpW1NBX1NQRUVEXXx8MTAwOworICAgaWYgKGVuZW15ICYmIGVuZW15LT5RdWVyeVNraWxsQXR0cmlidXRlKFNBX1NQRUVEKSA+IG5vcm1hbF9zcGVlZCkgeworICAgICAgd3JpdGUoIkRpZSBGZWUgbWFjaHQgZWluZSBiZXJ1aGlnZW5kZSBIYW5kYmV3ZWd1bmcgdW5kIHBsb2V0emxpY2ggZnVlaGxzdCBEdSBEaWNoXG4iCisgICAgICAgICAgICsicnVoaWcgdW5kIER1IG1lcmtzdCB3aWUgRHUgYWxsbWFlaGxpY2ggd2llZGVyIGxhbmdzYW1lciB3aXJzdC4uLlxuIik7CisgICAgICBlbmVteS0+TW9kaWZ5U2tpbGxBdHRyaWJ1dGUoU0FfU1BFRUQsIC0yMCwgMTgwKTsKKyAgIH0KKyAgIGlmIChlbmVteSkgOjpBdHRhY2soZW5lbXkpOworICAgU2V0UHJvcChQX0dVSUxELCAiemF1YmVyZXIiKTsKKyAgIGNvbW1hbmQoInZlcmxldHplIG1pdCAiKyh7ImZldWVyIiwgIm1hZ2llIiwgImVpcyIsICJ3YXNzZXIiLCAid2luZCJ9KVtyYW5kb20oNSldICk7CisgICBTZXRQcm9wKFBfR1VJTEQsIDApOworfQorCitpbnQgRGVmZW5kKGludCBkYW0sIG1peGVkIGR0cywgbWl4ZWQgc3BlbGwsIG9iamVjdCBlbmVteSkKK3sKKyAgIGludCBub3JtYWxfc3BlZWQ7CisgICBub3JtYWxfc3BlZWQ9KGVuZW15LT5RdWVyeVByb3AoUF9TS0lMTF9BVFRSSUJVVEVfT0ZGU0VUUyl8fChbXSkpW1NBX1NQRUVEXXx8MTAwOworICAgaWYgKGVuZW15ICYmIGVuZW15LT5RdWVyeVNraWxsQXR0cmlidXRlKFNBX1NQRUVEKSA+IG5vcm1hbF9zcGVlZCkgeworICAgICAgd3JpdGUoTmFtZShXRVIpKyIgbWFjaHQgZWluZSBiZXJ1aGlnZW5kZSBIYW5kYmV3ZWd1bmcgdW5kIHBsb2V0emxpY2ggZnVlaGxzdCBEdSBEaWNoXG4iCisgICAgICAgICAgICsicnVoaWcgdW5kIER1IG1lcmtzdCB3aWUgRHUgYWxsbWFlaGxpY2ggd2llZGVyIGxhbmdzYW1lciB3aXJzdC4uLlxuIik7CisgICAgICBlbmVteS0+TW9kaWZ5U2tpbGxBdHRyaWJ1dGUoU0FfU1BFRUQsIC0yMCwgMTgwKTsKKyAgIH0KKworICAgaWYgKCghc3BlbGwgfHwgKG1hcHBpbmdwKHNwZWxsKSAmJiBzcGVsbFtTUF9QSFlTSUNBTF9BVFRBQ0tdKSkgJiYgIXJhbmRvbSgzKSkgeworICAgICAgdGVsbF9yb29tKGVudmlyb25tZW50KCksIE5hbWUoV0VSKSsiIHdlaWNodCBzY2huZWxsIGVpbmVuIFNjaHJpdHQgenVydWVjayB1bmQgd2VpY2h0IERlaW5lbSBBbmdyaWZmIGF1cy5cbiIpOworICAgICAgZGFtPTA7CisgICB9CisgICByZXR1cm4gKGludCk6OkRlZmVuZChkYW0sIGR0cywgc3BlbGwsIGVuZW15KTsKK30KKwordm9pZCBOb3RpZnlQbGF5ZXJEZWF0aChvYmplY3Qgd2hvLCBvYmplY3Qga2lsbGVyLCBvYmplY3QgbG9zdF9leHApCit7CisgIGlmICghd2hvIHx8IGtpbGxlciE9TUUpIHJldHVybjsgLy8gdW5pbnRlcmVzc2FudAorICBsb2dfZmlsZSgicGFkcmVpYy9raWxsIiwgY3RpbWUodGltZSgpKSsiICIrY2FwaXRhbGl6ZShnZXR1aWQod2hvKSkrIiBnZXRvZXRldCB2b24gL3phdWJlcndhbGQvYXJpbmFcbiIpOworfQorCit2b2lkIGRpZSgpCit7CisgIGxvZ19maWxlKCJwYWRyZWljL2tpbGwiLCBjdGltZSh0aW1lKCkpKyIgQXJpbmEgd3VyZGUgdm9uICIrZ2V0X2tpbGxlcigpKyIgZ2V0b2V0ZXQuXG4iKTsKKyAgOjpkaWUoKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9ucGMvbGF1ZmVpY2hlLmMgYi9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvbnBjL2xhdWZlaWNoZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NDkyNzYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvbnBjL2xhdWZlaWNoZS5jCkBAIC0wLDAgKzEsMTI0IEBACisvLyAoYykgYnkgUGFkcmVpYyAoUGFkcmVpY0BtZy5tdWQuZGUpCisKKyNpbmNsdWRlICIuLi9maWxlcy5oIgorI2luY2x1ZGUgPGNvbWJhdC5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPG5ld19za2lsbHMuaD4KKworaW5oZXJpdCBOUEMoInN0ZG5wYyIpOworaW5oZXJpdCBNTlBDX01PVklORzsKKwordm9pZCBjcmVhdGUoKQoreworICAgaWYgKCFjbG9uZXAoTUUpKSByZXR1cm47CisgICBzdGRucGM6OmNyZWF0ZSgpOworICAgbW92aW5nOjptbnBjX2NyZWF0ZSgpOworICAgU2V0UHJvcChQX05BTUVfQURKLCAiYWx0Iik7CisgICBTZXRQcm9wKFBfTkFNRSwgIkVpY2hlIik7CisgICBTZXRQcm9wKFBfU0hPUlQsICJFaW5lIGFsdGUgRWljaGUiKTsKKyAgIFNldFByb3AoUF9NU0dPVVQsICJ3YW5kZXJ0Iik7CisgICBTZXRQcm9wKFBfTE9ORywKKyAgICAgIlZvciBEaXIgc3RlaHQgZWluZSBzZWhyIHNlaHIgYWx0ZSBFaWNoZS4gRG9jaCBkaWVzZSBFaWNoZSBpc3Qga2VpbmVcbiIKKyAgICArImdld29laG5saWNoZSBFaWNoZSwgd2llIER1IHNpZSBiZXJlaXRzIGFuIHZpZWxlbiBhbmRlcmVuIFN0ZWxsZW4gZ2VzZWhuIGhhc3QuXG4iCisgICAgKyJEaWVzZSBFaWNoZSBsZWJ0ISBEdSBrYW5uc3QgZGV1dGxpY2ggZWluZW4gTXVuZCwgZWluZSBOYXNlIHVuZCBzb2dhciB6d2VpXG4iCisgICAgKyJPaHJlbiBlcmtlbm5lbi4gU2llIGlzdCBlaWdlbnRsaWNoIHNlaHIgZnJpZWRsaWNoIGdlc29ubmVuLCBrYW5uIGFiZXIgYXVjaFxuIgorICAgICsic2VociBzZWhyIGJvZXNlIHdlcmRlbiwgd2VubiBlcyBqZW1hbmQgd2FndCBkaWUgUnVoZSBkZXMgV2FsZGVzIHp1IHN0b2VyZW4uXG4iKTsKKyAgIFNldFByb3AoUF9SQUNFLCAiZWljaGUiKTsKKyAgIFNldFByb3AoUF9MRVZFTCwgNTApOworICAgU2V0UHJvcChQX0FUVFJJQlVURVMsIChbImludCI6NTAsImNvbiI6NTAsInN0ciI6NzAsImRleCI6MTVdKSApOworICAgU2V0UHJvcChQX0dFTkRFUiwgRkVNQUxFKTsKKyAgIFNldFByb3AoUF9NQVhfSFAsIDUwMCk7CisgICBTZXRQcm9wKFBfSFAsIDUwMCk7CisgICBTZXRQcm9wKFBfQUxJR04sIDUwMCk7CisgICBTZXRQcm9wKFBfQk9EWSwgMTAwKTsKKyAgIFNldFByb3AoUF9TSVpFLCA2NTArcmFuZG9tKDE1MSkpOworICAgQWRkQWRqZWN0aXZlKCJhbHQiKTsKKyAgIEFkZElkKCh7ImVpY2hlIiwgImVpY2hlbiIsIFdBTERJRCgiZWljaGUiKSB9KSk7CisgICBTZXRQcm9wKFBfSEFORFMsICh7IiBtaXQgZWluZW0gaWhyZXIgbGFuZ2VuIEFlc3RlIiw0MDAsIERUX1dISVB9KSApOworICAgU2V0UHJvcChQX1NLSUxMX0FUVFJJQlVURV9PRkZTRVRTLCAoW1NBX1NQRUVEOjE4MF0pKTsKKyAgIFNldFByb3AoUF9OT0NPUlBTRSwgMSk7CisgICBTZXRQcm9wKFBfWFAsIDUwMCo0MDAqNSk7CisgICBTZXRQcm9wKFBfREVGQVVMVF9JTkZPLCAiYmxlaWJ0IGFic29sdXQgcmVndW5nc2xvcyB1bmQgcmVhZ2llcnQgdWViZXJoYXVwdCBuaWNodC5cbiIpOworICAgU2V0UHJvcChQX1JFU0lTVEFOQ0VfU1RSRU5HVEhTLAorICAgIChbRFRfU0xBU0g6ICAgICAwLjEsCisgICAgICBEVF9NQUdJQzogICAgLTEuMCwKKyAgICAgIERUX0JMVURHRU9OOiAtMC41LAorICAgICAgRFRfUE9JU09OOiAgICAwLjI1LAorICAgICAgRFRfSE9MWTogICAgIC0xLjAsCisgICAgICBEVF9SSVA6ICAgICAgIDAuMjUsCisgICAgICBEVF9GSVJFOiAgICAgIDAuMjUsCisgICAgICBEVF9QSUVSQ0U6ICAgLTAuNSwKKyAgICAgIERUX1dISVA6ICAgICAtMS4wIF0pICk7CisgICBTZXRQcm9wKE1OUENfQVJFQSwgKHsgUk9PTSgid2VnMiIpLCBST09NKCJsaWNodHVuZyIpIH0pICk7CisgICBTZXRQcm9wKE1OUENfUkFORE9NLCAxMCk7CisgICBTZXRQcm9wKE1OUENfREVMQVksIDgpOworICAgU2V0UHJvcChNTlBDX1dBTEtfVElNRSwgNjAwKTsKKyAgIFNldFByb3AoTU5QQ19GTEFHUywgTU5QQ19XQUxLfE1OUENfTk9fV0FMS19JTl9GSUdIVHxNTlBDX09OTFlfRVhJVFMpOworfQorCitzdGF0aWMgc3RyaW5nIF9xdWVyeV9pbmZvKCkKK3sKKyAgIGlmICghUEwgfHwgUEwtPlF1ZXJ5UHJvcChaQVVCRVJXQUxEKTw9dGltZSgpKQorICAgICAgcmV0dXJuICJEaWUgYWx0ZSBFaWNoZSBpc3QgRGlyIHNlaHIgZnJpZWRsaWNoIGdlc29ubmVuLiBFcyBpc3QgamVkb2NoIGF1Y2ggc2ljaGVyXG4iCisgICAgICAgICAgICArImtsdWcgZGllc2VzIG5pY2h0IHp1IGFlbmRlcm4sIGRhIHNpZSBtaXQgaWhyZW4gQWVzdGVuIHdvaGwgYXVjaCBzZWhyIGtyYWVmdGlnXG4iCisgICAgICAgICAgICArInp1c2NobGFnZW4ga2Fubi5cbiI7CisgICByZXR1cm4gIkR1IGhhc3QgZGVuIFpvcm4gZGVyIGFsdGVuIEVpY2hlIGF1ZiBEaWNoIGdlem9nZW4sIGRhcyB3YXIgZ2FueiB1bmQgZ2FyIG5pY2h0XG4iCisgICAgICAgICArImtsdWcgdm9uIERpci4gSmV0enQgbGViZSBhdWNoIG1pdCBkZW4gS29uc2VxdWVuemVuLi4uLlxuIjsKK30KKworaW50IHJlbW92ZSgpCisvLyB3ZW5uIGVpbmUgRWljaGUgZ2V0b2V0ZXQgd2lyZCwgZGFubiB2ZXJsYW5nc2FtdCBkYXMgZGVuIHJlc2V0IGRlciBFaWNoZQorLy8gZGllIGF1ZiB3ZWcyIGJsb2NrdC4gSW4gZGVyIFJlZ2VsIHN0ZWh0IGphIGF1Y2ggc28gc2Nob24gaW1tZXIgZWluZSBkZXIKKy8vIHdhbmRlcmRlbiBFaWNoZW4gZG9ydC4gRGllcyBzb2xsIHZlcmhpbmRlcm4sIGRhcyBnZXJhZGUgZWluZSBFaWNoZSByZXNldGV0CisvLyB3ZW5uIG1hbiBlaW5lIHRvZCBoYXQuCit7CisgICBjYWxsX290aGVyKFJPT00oIndlZzIiKSwgImRlbGF5X3Jlc2V0Iik7CisgICBjYXRjaChjYWxsX290aGVyKFF1ZXJ5UHJvcChNTlBDX0hPTUUpLCAiZGVsYXlfcmVzZXQiLCA5MDArcmFuZG9tKDM2MDApKSk7CisgICByZXR1cm4gKGludCk6OnJlbW92ZSgpOworfQorCisvLyB3ZW5uIG1hbiBkZW4gTU5QQyBtaXQgZWluZW0gYW5kZXJlbiBzdGRucGMga29tYmluaWVydCBtdWVzc2VuIGVpbmlnZQorLy8gZnVua3Rpb25lbiBwZXIgSGFuZCB1ZWJlcnNjaHJpZWJlbiB3ZXJkZW4uLi4uCisKK3ZvaWQgcmVzZXQoKQoreworICAgc3RkbnBjOjpyZXNldCgpOworICAgbW92aW5nOjptbnBjX3Jlc2V0KCk7Cit9CisKK3ZvaWQgaW5pdCgpCit7CisgICBzdGRucGM6OmluaXQoKTsKKyAgIG1vdmluZzo6bW5wY19pbml0KCk7Cit9CisKK3ZhcmFyZ3MgaW50IG1vdmUobWl4ZWQgZGVzdCwgaW50IG1ldGgsIHN0cmluZyBkaXIsIHN0cmluZyBvdXQsIHN0cmluZyBpbikKK3sKKyAgIGludCBpOworCisgICAvLyBleHRyYSBmdWVyIGRlbiBaYXViZXJ3YWxkIGVpbmdlYmF1dAorICAgaWYgKGVudmlyb25tZW50KCkgJiYgb2JqZWN0X25hbWUoZW52aXJvbm1lbnQoKSk9PVJPT00oIndlZzIiKSkgeworICAgICAgLy8gd2VubiBlcyBkaWUgZWluemlnZSBFaWNoZSBpc3QsIGRhbm4gYmxlaWJ0IHNpZSBoaWVyIHN0ZWhuLAorICAgICAgLy8gYmV3YWNodCBkZW4gV2VnIHVuZCBiZXdlZ3Qgc2ljaCBuaWNodCBtZWhyIGhpZXIgd2VnIQorICAgICAgb2JqZWN0ICppbnY7CisKKyAgICAgIGludiA9IGFsbF9pbnZlbnRvcnkoZW52aXJvbm1lbnQoKSkgLSAoeyBNRSB9KTsKKyAgICAgIGZvciAoaT1zaXplb2YoaW52KS0xOyBpPj0wOyBpLS0pCisgICAgICAgICBpZiAoQkxVRV9OQU1FKGludltpXSk9PU5QQygibGF1ZmVpY2hlIikpIGJyZWFrOworICAgICAgaWYgKGk8MCkgcmV0dXJuIE1FX0NBTlRfTEVBVkVfRU5WOworICAgfQorICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgIGk9KGludClzdGRucGM6Om1vdmUoZGVzdCwgbWV0aCwgZGlyLCBvdXQsIGluKTsKKyAgIGlmIChpIT0xKSByZXR1cm4gaTsKKyAgIG1vdmluZzo6bW5wY19tb3ZlKCk7CisgICByZXR1cm4gMTsKK30KKworaW50IFByZXZlbnRGb2xsb3cob2JqZWN0IGRlc3QpCit7ICByZXR1cm4gbW92aW5nOjptbnBjX1ByZXZlbnRGb2xsb3coZGVzdCk7ICB9CisKK3ZvaWQgTm90aWZ5UGxheWVyRGVhdGgob2JqZWN0IHdobywgb2JqZWN0IGtpbGxlciwgb2JqZWN0IGxvc3RfZXhwKQoreworICBpZiAoIXdobyB8fCBraWxsZXIhPU1FKSByZXR1cm47IC8vIHVuaW50ZXJlc3NhbnQKKyAgbG9nX2ZpbGUoInBhZHJlaWMva2lsbCIsIGN0aW1lKHRpbWUoKSkrIiAiK2NhcGl0YWxpemUoZ2V0dWlkKHdobykpKyIgZ2V0b2V0ZXQgdm9uIC96YXViZXJ3YWxkL2xhdWZlaWNoZVxuIik7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvbnBjL3BpeGllLmMgYi9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvbnBjL3BpeGllLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VkOTUzZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9ucGMvcGl4aWUuYwpAQCAtMCwwICsxLDE1MCBAQAorLy8gKGMpIGJ5IFBhZHJlaWMgKFBhZHJlaWNAbWcubXVkLmRlKQorCisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDxjb21iYXQuaD4KKworaW5oZXJpdCBOUEMoInN0ZG5wYyIpOworCit2b2lkIGNyZWF0ZSgpCit7CisgICA6OmNyZWF0ZSgpOworICAgU2V0UHJvcChQX1NIT1JULCAiRWluIGtsZWluZXIgUGl4aWUiKTsKKyAgIFNldFByb3AoUF9TSVpFLCA1NStyYW5kb20oMTEpKTsKKyAgIFNldFByb3AoUF9MT05HLCBCUygKKyAgICAgIkRlciBQaXhpZSBpc3QgZXR3YSAiK1F1ZXJ5UHJvcChQX1NJWkUpKyJjbSBncm9zcyB1bmQgc2llaHQgdmVybXV0bGljaCBlaW5lbSAiCisgICAgKyJrbGVpbmVuIHB1bWVsaWdlbiBNZW5zY2hlbmtpbmQgYW0gYWVobmxpY2hzdGVuLiBXaWUgYWxsZSBQaXhpZXMgc2NoZWludCBlciAiCisgICAgKyJzZWhyIHZlcnNwaWVsdCB6dSBzZWluIHVuZCBuaWNodHMgYWxzIFVuZnVnIGltIEtvcGYgenUgaGFiZW4sIER1IHNvbGx0ZXN0ICIKKyAgICArIkRpY2ggYWxzbyB2b3IgaWhtIGlobiBhY2h0IG5laG1lbi4gQXVjaCB3ZW5uIGVyIGF1c3NpZWh0IHdpZSBlaW4gS2luZCwgc2ljaCAiCisgICAgKyJiZW5pbW10IHdpZSBlaW4gS2luZCwgc28ga2FubiBlciBEaXIgbWl0IHNlaW5lciBNYWdpZSBzaWNoZXIgdWViZWwgenUgc3BpZWxuLiIpKTsKKyAgIFNldFByb3AoUF9JTkZPLCAvKiBrbGVpbmUgV2FybnVuZyBmdWVyIGRpZSBLYWVtcGZlciA6KSAqLworICAgICAiTWFuIHNvbGx0ZSBzaWNoIGltbWVyIHZvciBkZXIgTWFnaWUgZGVyIFBpeGllcyBpbiBhY2h0IG5laG1lbiwgc2llIGlzdCBuaWNodFxuIgorICAgICsidW5iZWRpbmd0IGdlZmFlaHJsaWNoLCBhYmVyIGVzIGtvZW5uZW4gZGllIHVuZXJ3YXJ0ZXN0ZW4gRGluZ2UgZ2VzY2hlaG4uIFNvXG4iCisgICAgKyJpc3QgZHVyY2hhdXMgdm9uIExldXRlbiBiZWthbm50IGRpZSBlaW5lbiBLYW1wZiBhbHMga2xlaW5lIFJhdHRlIGJlZW5kZXRlbixcbiIKKyAgICArIm9kZXIgZGVyZW4gU2Nod2VydCBpbSBLYW1wZiBwbG9ldHpsaWNoIHp1IFNjaGVpc3NlIHplcmZsb3NzLi4uXG4iKTsKKyAgIFNldFByb3AoUF9OQU1FX0FESiwgImtsZWluIik7CisgICBTZXRQcm9wKFBfTkFNRSwgIlBpeGllIik7CisgICBTZXRQcm9wKFBfR0VOREVSLCBNQUxFKTsKKyAgIFNldFByb3AoUF9SQUNFLCAicGl4aWUiKTsKKyAgIFNldFByb3AoUF9BVFRSSUJVVEVTLCAoWyJpbnQiOjMwLCJjb24iOjIwLCJzdHIiOjE1LCJkZXgiOjMwXSkgKTsKKyAgIFNldFByb3AoUF9MRVZFTCwgMjApOworICAgU2V0UHJvcChQX01BWF9IUCwgNjAwKTsKKyAgIFNldFByb3AoUF9IUCwgNjAwKTsKKyAgIFNldFByb3AoUF9NQVhfU1AsIDgwMCk7CisgICBTZXRQcm9wKFBfU1AsIDgwMCk7CisgICBTZXRQcm9wKFBfQUxJR04sIDI1MCk7CisgICBTZXRQcm9wKFBfSEFORFMsICh7IiBtaXQgc2VpbmVuIGtsZWluZW4gSGFlbmRlbiIsIDE1MCwgRFRfQkxVREdFT059KSApOworICAgU2V0UHJvcChQX1hQLCA2MDAqMTUwKjUpOworICAgQWRkQWRqZWN0aXZlKCJrbGVpbiIpOworICAgQWRkSWQoInBpeGllIik7Cit9CisKKy8vIHRlbGVwb3J0ZXIgWmllbGUgaW0gR2ViaWV0LiBEZXIgUGl4aWUgd2lsbCBqYSBlaW5mYWNoIG51ciBlaW4gYmlzc2NoZW4KKy8vIEFlcmdlcm4gdW5kIG5pY2h0IGhlbGZlbiAoZWluIFBpeGlla2FtcGYgaXN0IGtlaW4gQXVzZ2FuZyA6KQorI2RlZmluZSBERVNUICh7ImxpY2h0dW5nbm8iLCAibGljaHR1bmdzbyIsICJsaWNodHVuZ24iLCAibGljaHR1bmdzIiwgXAorICAgICAgICAgICAgICAgImxpY2h0dW5nbnciLCAibGljaHR1bmdzdyIsICJsaWNodHVuZ28iLCAibGljaHR1bmd3IiwgXAorICAgICAgICAgICAgICAgIndlZzIiLCAic3RlaW4ifSkKKwordm9pZCBBdHRhY2sob2JqZWN0IGVuZW15KQoreworICAgb2JqZWN0IG9iLCB3ZWFwb247CisgICAKKyAgIG9iPVNlbGVjdEVuZW15KCk7CisgICBpZiAob2IpIHN3aXRjaChyYW5kb20oNyo4KSkgeyAvLyBqZWRlIDh0ZSBSdW5kZSBlaW4gWmF1YmVyc3BydWNoLi4uCisgICAgICBjYXNlIDA6IC8vIGluIEZyb3NjaCB2ZXJ3YW5kZWxuLi4uCisgICAgICAgIGlmICghb2ItPlF1ZXJ5UHJvcChQX0ZST0cpKSB7CisgICAgICAgICAgdGVsbF9vYmplY3Qob2IsICJEZXIgUGl4aWUgZHJlaHQgRGlyIGVpbmUgbGFuZ2UgTmFzZSB1bmQgdmVyd2FuZGVsdCBEaWNoIGluIGVpbmVuIEZyb3NjaC5cbiIpOworICAgICAgICAgIHNheShCUygiRGVyIFBpeGllIGRyZWh0ICIrb2ItPm5hbWUoV0VNKSsiIGVpbmUgbGFuZ2UgTmFzZSB1bmQgdmVyd2FuZGVsdCAiCisgICAgICAgICAgICAgICAgK29iLT5RdWVyeVByb25vdW4oV0VOKSsiIGluIGVpbmVuIEZyb3NjaCwiKSwgb2IpOworICAgICAgICAgIG9iLT5TZXRQcm9wKFBfRlJPRywgMSk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA4Li4xMDogLy8gZWluZmFjaCBudXIgbmVydmlnZXIgVGVsZXBvcnQgaW5uZXJoYWxiIGRlcyBHZWJpZXRzIDopCisgICAgICAgIHRlbGxfb2JqZWN0KG9iLAorICAgICAgICAgICJEZXIgUGl4aWUgc2NobGllc3N0IGt1cnogc2VpbmUgQXVnZW4gdW5kIGVoIER1IERpY2ggdmVyc2llaHN0LCB2ZXJzY2h3aW1tdFxuIgorICAgICAgICAgKyJhbGxlcyB1bSBEaWNoIGhlcnVtLi4uXG4iKTsKKyAgICAgICAgc2F5KEJTKCJEZXIgUGl4aWUgc2NobGllc3N0IGt1cnogc2VpbmUgQXVnZW4gdW5kIHBsb2V0emxpY2ggbG9lc3Qgc2ljaCAiCisgICAgICAgICAgICAgICtvYi0+bmFtZShXRVIpKyIgaW4gTHVmdCBhdWYuIiksIG9iKTsKKyAgICAgICAgb2ItPm1vdmUoUk9PTShERVNUW3JhbmRvbShzaXplb2YoREVTVCkpXSksIE1fVFBPUlR8TV9OT0NIRUNLfE1fU0lMRU5UKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgY2FzZSAxNjogLy8gR2VzY2hsZWNodCBhZW5kZXJuLi4uIDopCisgICAgICAgIHRlbGxfb2JqZWN0KG9iLAorICAgICAgICAgICJEZXIgUGl4aWUgZ3JpbnN0IGJyZWl0IGJpcyB1ZWJlciBiZWlkZSBPaHJlbiB1bmQgc2NoYXV0IERpY2ggYW4sIER1IHdlaXNzdFxuIgorICAgICAgICAgKyJnYXIgbmljaHQgd2llIERpciBnZXNjaGllaHQsIGFiZXIgaXJnZW5kZXR3YXMgYWVuZGVydCBzaWNoIGFuIERlaW5lbSBLb2VycGVyLlxuIik7CisgICAgICAgIHNheShCUygiRGVyIFBpeGllIGdyaW5zdCAiK29iLT5uYW1lKFdFTikrIiBicmVpdCBhbi4gUGxvZXR6bGljaCAiCisgICAgICAgICArKG9iLT5RdWVyeVByb3AoUF9HRU5ERVIpPT1GRU1BTEUKKyAgICAgICAgID8gInZlcnNjaHdpbmRlbiBpaHJlIEJydWVzdGUgdW5kIGVzIHdhZWNoc3QgaWhyIHBsb2V0emxpY2ggZWluIEJhcnQuIgorICAgICAgICAgOiAidmVyc2Nod2luZGV0IHNlaW4gQmFydCB1bmQgaWhtIHdhY2hzZW4gendlaSBuZXVlIEJydWVzdGUuIikpLCBvYik7CisgICAgICAgIGlmIChvYi0+UXVlcnlQcm9wKFBfR0VOREVSKT09RkVNQUxFKQorICAgICAgICAgIG9iLT5TZXRQcm9wKFBfR0VOREVSLCBNQUxFKTsKKyAgICAgICAgZWxzZSBvYi0+U2V0UHJvcChQX0dFTkRFUiwgRkVNQUxFKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgY2FzZSAyNDoKKyAgICAgICAgaWYgKG9iamVjdHAod2VhcG9uPW9iLT5RdWVyeVByb3AoUF9XRUFQT04pKSkgeworICAgICAgICAgICB3ZWFwb24tPkRvVW53aWVsZCgxKTsKKyAgICAgICAgICAgLy8gdmVyZmx1Y2h0ZSBXYWZmZW4gbmljaHQgYmV0cmVmZmVuIDopKQorICAgICAgICAgICBpZiAoIW9iamVjdHAod2VhcG9uLT5RdWVyeVByb3AoUF9XSUVMREVEKSkpIHsKKyAgICAgICAgICAgICAgc3RyaW5nIHN0cjEsIHN0cjI7CisgICAgICAgICAgICAgIHN0cjE9c3RyMj0od2VhcG9uKS0+bmFtZShXRVIpOworICAgICAgICAgICAgICBpZiAoc3RyMVswLi4yXT09ImVpbiIpIHsKKyAgICAgICAgICAgICAgICBzdHIxPSJEIitzdHIxOworICAgICAgICAgICAgICAgIHN0cjI9InMiK3N0cjI7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgdGVsbF9vYmplY3Qob2IsIEJTKAorICAgICAgICAgICAgICAgIkRlciBQaXhpZSBzdGFycnQgRGlyIGluIGRpZSBBdWdlbiB1bmQgc2NobmlwcHN0IGVpbm1hbCBrdXJ6IG1pdCBzZWluZW4gIgorICAgICAgICAgICAgICArIkZpbmdlcm4uIFBsb2V0emxpY2ggemVycmludCAiK3N0cjErIiBpbiBEZWluZW4gSGFlbmRlbiB6dSBlaW5lbSBIYXVmZW4gIgorICAgICAgICAgICAgICArIlNjaGVpc3NlLiIpKTsKKyAgICAgICAgICAgICAgc2F5KEJTKCJEZXIgUGl4aWUgc3RhcnJ0ICIrd2VhcG9uLT5uYW1lKFdFTSkrIiBpbiBkaWUgQXVnZW4gdW5kICIKKyAgICAgICAgICAgICAgICAgICAgKyJzY2huaXBwc3QgZWlubWFsIGt1cnogbWl0IGRlbiBGaW5nZXJuLiBQbG9ldHpsaWNoICIKKyAgICAgICAgICAgICAgICAgICAgKyJ6ZXJyaW50ICIrd2VhcG9uLT5uYW1lKFdFTSkrIiAiK3N0cjIKKyAgICAgICAgICAgICAgICAgICAgKyIgaW4gZWluZW4gSGF1ZmVuIFNjaGVpc3NlLiIpLCBvYik7CisgICAgICAgICAgICAgIHdlYXBvbi0+cmVtb3ZlKCk7CisgICAgICAgICAgICAgIGlmICh3ZWFwb24pIGRlc3RydWN0KHdlYXBvbik7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzMjoKKyAgICAgICAgaWYgKCFvYi0+UXVlcnlQcm9wKFBfQkxJTkQpKSB7CisgICAgICAgICAgdGVsbF9vYmplY3Qob2IsIEJTKAorICAgICAgICAgICAgICJEZXIgUGl4aWUgaGFlbHQgc2ljaCBkaWUgSGFuZCB2b3IgZGllIEF1Z2VuIHVuZCBncmluc3QgYnJlaXQuIFBsb2V0emxpY2ggIgorICAgICAgICAgICAgKyJtZXJrc3QgRHUsIHdpZSBhbGxlcyBnYW56IGR1bmtlbCB1bSBEaWNoIHJ1bSB3aXJkLi4uIikpOworICAgICAgICAgIHNheShCUygiRGVyIFBpeGllIGhhZWx0IHNpY2ggZGllIEhhbmQgdm9yIGRpZSBBdWdlbiB1bmQgZ3JpbnN0IGJyZWl0LiAiCisgICAgICAgICAgICAgICAgK29iLT5uYW1lKFdFUikKKyAgICAgICAgICAgICAgICArIiBzY2hhdXQgZGFyYXVmaGluIHppZW1saWNoIGlycml0aWVydCBpbiBkaWUgR2VnZW5kLiIpLCBvYik7CisgICAgICAgICAgb2ItPlNldFByb3AoUF9CTElORCwgMSk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA0MDoKKyAgICAgICAgaWYgKG9iLT5RdWVyeVByb3AoUF9QT0lTT04pPDMgJiYgb2ItPlF1ZXJ5UHJvcChQX01BWF9QT0lTT04pPj0zKSB7CisgICAgICAgICAgdGVsbF9vYmplY3Qob2IsIEJTKAorICAgICAgICAgICAgICJEZXIgUGl4aWUgc3RyZWljaHQgc2ljaCBtaXQgZGVyIEhhbmQgenVmcmllZGVuIHVlYmVyIHNlaW5lbiBCYXVjaCB1bmQgc2NoYXV0ICIKKyAgICAgICAgICAgICsiRGljaCBkYWJlaSBhbi4gUGxvZXR6bGljaCB3aXJkIERpciByaWNodGlnIHVlYmVsLi4uIikpOworICAgICAgICAgIHNheShCUygiRGVyIFBpeGllIHN0cmVpY2h0IHNpY2ggbWl0IHNlaW5lciBIYW5kIHp1ZnJpZWRlbiB1ZWJlciBzZWluZW4gQmF1Y2ggdW5kXG4iCisgICAgICAgICAgICAgICAgKyJzY2hhdXQgIitvYi0+bmFtZShXRU0pKyIgZGFiZWkgaW4gZGllIEF1Z2VuLiBQbG9ldHpsaWNoIHdpcmQgIitvYi0+bmFtZShXRU0pCisgICAgICAgICAgICAgICAgKyIgZ2FueiB1ZWJlbC4iKSwgb2IpOworICAgICAgICAgIG9iLT5TZXRQcm9wKFBfUE9JU09OLCAzKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDQ4OgorICAgICAgICBpZiAoIW9iLT5RdWVyeVByb3AoUF9ERUFGKSkgeworICAgICAgICAgIHRlbGxfb2JqZWN0KG9iLCAiRGVyIFBpeGllIGhhZWx0IHNpY2ggZGllIE9ocmVuIHp1IHVuZCBncmluc3QgYnJlaXQuXG4iKTsKKyAgICAgICAgICBzYXkoQlMoIkRlciBQaXhpZSBoYWVsdCBzaWNoIGRpZSBPaHJlbiB6dSB1bmQgZ3JpbnN0IGRhYmVpICIKKyAgICAgICAgICAgICAgICArb2ItPm5hbWUoV0VOKSsiIGFuLiIpLCBvYik7CisgICAgICAgICAgb2ItPlNldFByb3AoUF9ERUFGLCAxKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgfQorICAgaWYgKGVuZW15ICYmIHByZXNlbnQoZW5lbXksIGVudmlyb25tZW50KCkpKSA6OkF0dGFjayhlbmVteSk7Cit9CisKK3ZvaWQgTm90aWZ5UGxheWVyRGVhdGgob2JqZWN0IHdobywgb2JqZWN0IGtpbGxlciwgb2JqZWN0IGxvc3RfZXhwKQoreworICBpZiAoIXdobyB8fCBraWxsZXIhPU1FKSByZXR1cm47IC8vIHVuaW50ZXJlc3NhbnQKKyAgbG9nX2ZpbGUoInBhZHJlaWMva2lsbCIsIGN0aW1lKHRpbWUoKSkrIiAiK2NhcGl0YWxpemUoZ2V0dWlkKHdobykpKyIgZ2V0b2V0ZXQgdm9uIC96YXViZXJ3YWxkL3BpeGllXG4iKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9ucGMvcmllc2UuYyBiL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9ucGMvcmllc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjhhM2UyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS96YXViZXJ3YWxkL25wYy9yaWVzZS5jCkBAIC0wLDAgKzEsOTIgQEAKKy8vIChjKSAyMDAzIGJ5IFBhZHJlaWMgKFBhZHJlaWNAbWcubXVkLmRlKQorCisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisKK2luaGVyaXQgTlBDKCJzdGRucGMiKTsKKwordm9pZCBjcmVhdGUoKQoreworICAgOjpjcmVhdGUoKTsKKyAgIGNyZWF0ZV9kZWZhdWx0X25wYygzMCwgMjUwMCk7CisgICBTZXRQcm9wKFBfQVJUSUNMRSwgMCk7CisgICBTZXRQcm9wKFBfU0hPUlQsICJHcmltbWJhcnQgRmVsc2Vuc2NoaWViZXIiKTsKKyAgIFNldFByb3AoUF9MT05HLAorICAgICAiVm9yIERpciBzaXR6dCBkZXIgUmllc2UgR3JpbW1iYXJ0IEZlbHNlbnNjaGllYmVyLiBFaWdlbnRsaWNoIHNjaGVpbnQgZXJcbiIKKyAgICArImVpbiBzZWhyIGd1dG11ZXRpZ2VyIHVuZCBmcmV1bmRsaWNoZXIgUmllc2UgenUgc2Vpbi4gQWJlciBpcmdlbmR3aWUgd2lya3RcbiIKKyAgICArImVyIGRlcnplaXQgc2VociB0cmF1cmlnLlxuIik7CisKKyAgIFNldFByb3AoUF9OQU1FLCAiR3JpbW1iYXJ0IEZlbHNlbnNjaGllYmVyIik7CisgICBTZXRQcm9wKFBfR0VOREVSLCBNQUxFKTsKKyAgIFNldFByb3AoUF9TSVpFLCAyOTcpOworICAgU2V0UHJvcChQX0FMSUdOLCAyMDApOworICAgU2V0UHJvcChQX1JFU0lTVEFOQ0VfU1RSRU5HVEhTLAorICAgICAoW0RUX0hPTFk6LTEuMCwKKyAgICAgICBEVF9VTkhPTFk6MC41LAorICAgICAgIERUX01BR0lDOjAuMjUsCisgICAgICAgRFRfUE9JU09OOi0wLjI1LAorICAgICAgIERUX1dISVA6LTAuNiwKKyAgICAgICBEVF9CTFVER0VPTjotMC4zLAorICAgICAgIERUX1BJRVJDRTotMC4xLAorICAgICAgIERUX1NMQVNIOi0wLjEKKyAgICAgXSkpOworCisgICBBZGRJbmZvKCh7ImZlbHNlbiIsICJmZWxzIn0pLAorICAgICAiSWNoIGxpZWJlIGVzIG1laW5lIE11c2tlbG4gYW56dXNwYW5uZW4gdW5kIEZlbHNlbiB6dSBzY2hpZWJlbi4iLAorICAgICAiYW50d29ydGV0OiAiKTsKKyAgIEFkZEluZm8oInNjaGllYmVuIiwKKyAgICAgIkljaCBoYWJlIGRvY2gga2VpbmUgRmVsc2VuIG1laHIgZGllIGljaCBzY2hpZWJlbiBrb2VubnRlLiIpOworICAgQWRkSW5mbygoeyJ0cmF1ZXIiLCAidHJhdXJpZ2tlaXQifSksCisgICAgICJGcnVlaGVyIGRhIGhhYmUgaWNoIGRlbiBnYW56ZW4gVGFnIGhpZXIgbWVpbmUgRmVsc2VuIGhpbi0gdW5kICIKKyAgICArImhlcmdlc2Nob2JlbiwgYWJlciBudW4gaGF0IFVsaW5pYSBtaXIgdmVyYm90ZW4gaGllciBpbSBXYWxkIG1pdCAiCisgICAgKyJkZW4gRmVsc2VuIHp1IHNwaWVsZW4gdW5kIGljaCBtdXNzdGUgc2llIGFsbGUgd2VndHJhZ2VuIDpvKCIsCisgICAgICJqYW1tZXJ0OiAiKTsKKyAgIEFkZEluZm8oInRhZyIsICJKYSBzbyBlaW4gVGFnIGlzdCBnYW56IHNjaG9lbiBsYW5nIG9obmUgRmVsc2VuIiwKKyAgICAgInNhZ3Q6ICIpOworICAgQWRkSW5mbygidWxpbmlhIiwKKyAgICAgICJFaW5lIHJpY2h0aWcgYmxvZWRlIEZlZSB1bmQgaGFldHRlIHNpZSBpaHJlIGRvb2ZlbiBaYXViZXJrcmFlZnRlIG5pY2h0LCIKKyAgICAgKyJrb2VubnRlIHNpZSB1bnMgaGllciBhdWNoIG5pY2h0IGFsbGUgc28gcnVta29tbWFuZGllcmVuICptb3BwZXIqLiIsCisgICAgICJzYWd0OiAiKTsKKyAgIEFkZEluZm8oImdydW5kIiwKKyAgICAgICJOdXIgd2VpbCBtaXIgZWlubWFsIGF1c3ZlcnNlaGVuIGVpbiBrbGl0emVrbGVpbmVyIEZlbHMgaW4gZGVuIFR1ZW1wZWwgIgorICAgICArImdlZmFsbGVuIGlzdCwgbXVzc3RlIGljaCBhbGwgbWVpbmUgc2Nob2VuZW4gRmVsc2VuIGF1cyBkZW0gV2FsZCBicmluZ2VuLiIsCisgICAgICJzYWd0OiAiKTsKKyAgIEFkZEluZm8oInR1ZW1wZWwiLAorICAgICAgIkJsb2VkZXIgVHVlbXBlbCwgd2VyIGJyYXVjaHQgZGVuIHNjaG9uISIsICJhbnR3b3J0ZXQgZ2VyZWl6dDogIik7CisgICBBZGRJbmZvKCJ6YXViZXJrcmFlZnRlIiwKKyAgICAgICJJY2ggZnJldSBtaWNoIHNjaG9uIHJpY2h0aWcgYXVmIGRlbiBUYWcsIGFuIGRlbSBVbGluaWFzIFphdWJlcmtyYWVmdGUgIgorICAgICArIm5hY2hsYXNzZW4hIiwKKyAgICAgICJzYWd0OiAiKTsKKyAgIEFkZEluZm8oKHsid2FsZCIsICJ6YXViZXJ3YWxkIn0pLAorICAgICAgIldlbm4gZXMgaGllciB3aWVkZXIgZ2FueiB2aWVsZSBzY2hvZW5lIEZlbHNlbiBnYWViZSwgd2FlciBlciB3aWVkZXIgZGFzICIKKyAgICAgKyJyZWluc3RlIFBhcmFkaWVzLiIsICJhbnR3b3J0ZXQ6ICIpOworICAgQWRkSW5mbygicGFyYWRpZXMiLAorICAgICAgIkphIGZydWVoZXIgd2FyIGRlciBXYWxkIGhpZXIgZWlubWFsIGRhcyByZWluc3RlIFBhcmFkaWVzLiIsICJhbnR3b3J0ZXQ6ICIpOworCisgICBTZXRDaGF0cygzLAorICAgICAoe05hbWUoV0VSKSsiIHNhZ3Q6IEljaCBiaW4gc28gdHJhdXJpZy5cbiIsCisgICAgICAgTmFtZShXRVIpKyIgc2NobHVjaHp0OiBtZWluZSBzY2hvZW5lbiBGZWxzZW4uLiB3dWFhYWhoaGhoXG4iLAorICAgICAgIE5hbWUoV0VSKSsiIHNhZ3Q6IG5pZSB3aWVkZXIgd2VyZGUgaWNoIEZlbHNlbiBzY2hpZWJlbiBrb2VubmVuLlxuIiwKKyAgICAgICBOYW1lKFdFUikrIiBzYWd0OiBGIEUgTCBTIEUgTiAhXG4iLAorICAgICAgIE5hbWUoV0VSKSsiIGphbW1lcnQ6IERpZSBXZWx0IGlzdCBzbyBmdXJjaHRiYXIgdW5nZXJlY2h0IVxuIiwKKyAgICAgICBOYW1lKFdFUikrIiBmcmFndDogV2llIHNvbGwgaWNoIHNvIGJsb3NzIHdlaXRlcmxlYmVuP1xuIgorICAgICB9KSk7CisgICAKKyAgIEFkZElkKCJyaWVzZSIpOworICAgQWRkSWQoImdyaW1tYmFydCIpOworICAgQWRkSWQoImZlbHNlbnNjaGllYmVyIik7Cit9CisKK3ZvaWQgTm90aWZ5UGxheWVyRGVhdGgob2JqZWN0IHdobywgb2JqZWN0IGtpbGxlciwgb2JqZWN0IGxvc3RfZXhwKQoreworICBpZiAoIXdobyB8fCBraWxsZXIhPU1FKSByZXR1cm47IC8vIHVuaW50ZXJlc3NhbnQKKyAgbG9nX2ZpbGUoInBhZHJlaWMva2lsbCIsIGN0aW1lKHRpbWUoKSkrIiAiK2NhcGl0YWxpemUoZ2V0dWlkKHdobykpCisgICAgKyJnZXRvZXRldCB2b24gL3phdWJlcndhbGQvcmllc2VcbiIpOworfQorCit2b2lkIGRpZSgpCit7CisgIGxvZ19maWxlKCJwYWRyZWljL2tpbGwiLCBjdGltZSh0aW1lKCkpKyIgR3JpbW1iYXJ0IHd1cmRlIHZvbiAgIitnZXRfa2lsbGVyKCkKKyAgICArIiBnZXRvZXRldC5cbiIpOworICA6OmRpZSgpOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS96YXViZXJ3YWxkL25wYy9zdGRucGMuYyBiL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9ucGMvc3RkbnBjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJiM2QyZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9ucGMvc3RkbnBjLmMKQEAgLTAsMCArMSwzOSBAQAorLy8gKGMpIGJ5IFBhZHJlaWMgKFBhZHJlaWNAbWcubXVkLmRlKQorCisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKworaW5oZXJpdCAiL3N0ZC9ucGMiOworaW5oZXJpdCAiL3Avc2VydmljZS9tdXBmZWwvZ2V0a2lsbCI7CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgIDo6Y3JlYXRlKCk7CisgICBTZXRQcm9wKFpBVUJFUldBTEROUEMsIDEpOworICAgU2V0UHJvcChQX0FHR1JFU1NJVkUsIChbUF9SQUNFOihbIkR1bmtlbGVsZiI6MSwgMDowLjBdKSBdKSk7Cit9CisKK2ludCBBdXRvQXR0YWNrKG9iamVjdCBvYikKK3sKKyAgIGlmIChvYiAmJiBvYi0+UXVlcnlQcm9wKFpBVUJFUldBTEQpPnRpbWUoKSkgcmV0dXJuIDE7CisgICByZXR1cm4gOjpBdXRvQXR0YWNrKG9iKTsKK30KKworaW50IEluc2VydEVuZW15KG9iamVjdCBvYikKK3sKKyAgIGludCByZXQsIGlzX2VuZW15OworICAgaXNfZW5lbXk9SXNFbmVteShvYik7CisgICByZXQ9KGludCk6Okluc2VydEVuZW15KG9iKTsKKyAgIGlmICghaXNfZW5lbXkpIHsgLy8gYWxsZSBhbmRlcmVuIFphdWJlcndhbGQtTlBDcyBpbSBSYXVtIHZlcnN0YWVuZGlnZW4KKyAgICAgIGZpbHRlcl9vYmplY3RzKAorICAgICAgICBmaWx0ZXJfb2JqZWN0cyhhbGxfaW52ZW50b3J5KGVudmlyb25tZW50KCkpLXVzZXJzKCksICJRdWVyeVByb3AiLCBaQVVCRVJXQUxETlBDKSwKKyAgICAgICAgIkluc2VydEVuZW15Iiwgb2IKKyAgICAgICk7CisgICB9CisgICByZXR1cm4gcmV0OworfQorCitpbnQgRGVmZW5kKGludCBkYW0sIG1peGVkIGR0cywgbWl4ZWQgc3BlbGwsIG9iamVjdCBlbmVteSkKK3sKKyAgIGlmIChlbmVteSkgZW5lbXktPlNldFByb3AoWkFVQkVSV0FMRCwgdGltZSgpK0FHR1JFU1NJVkVfVElNRSk7CisgICByZXR1cm4gKGludCk6OkRlZmVuZChkYW0sIGR0cywgc3BlbGwsIGVuZW15KTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9ucGMvdGl0aW5hLmMgYi9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvbnBjL3RpdGluYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkY2UwNjIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvbnBjL3RpdGluYS5jCkBAIC0wLDAgKzEsMTE0IEBACisvLyAoYykgYnkgUGFkcmVpYyAoUGFkcmVpY0BtZy5tdWQuZGUpCisKKyNpbmNsdWRlICIuLi9maWxlcy5oIgorI2luY2x1ZGUgPGNvbWJhdC5oPgorI2luY2x1ZGUgPG5ld19za2lsbHMuaD4KKyNpbmNsdWRlICIvcC96YXViZXJlci96YXViZXJlci5oIgorCitpbmhlcml0IE5QQygic3RkbnBjIik7CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgIDo6Y3JlYXRlKCk7CisgICBTZXRQcm9wKFBfU0hPUlQsICJUaXRpbmEgZGllIFdhbGRmZWUiKTsKKyAgIFNldFByb3AoUF9MT05HLAorICAgICAgQlMoIlZvciBEaXIgc3RlaHQgVGl0aW5hIGRpZSBXYWxkZmVlLiBJaHIgbGFuZ2VzIGdvbGRlbmVzIEhhYXIgd2VodCAiCisgICAgICsibGVpY2h0IGltIFdpbmQgdW5kIGRhcyBlaW56aWdlIHdhcyBzaWUgYmVkZWNrdCwgaXN0IGVpbiBsZWljaHRlcyBCbGFldHRlcmtsZWlkICIKKyAgICAgKyJkYXMgaWhyZSB3ZWlibGljaGVuIFJ1bmR1bmdlbiBhdXNzZXJvcmRlbnRsaWNoIGd1dCB6dXIgR2VsdHVuZyBicmluZ3QuICIKKyAgICAgKyJJaHJlIHNjaG9lbmVuIGJsYXVlbiBBdWdlbiwgdHVuIGVpbiB1ZWJyaWdlcyB1bSBEaWNoIGdhbnogd2FobnNpbm5pZyB6dSBtYWNoZW4uIikpOworICAgU2V0UHJvcChQX05BTUUsICJUaXRpbmEiKTsKKyAgIFNldFByb3AoUF9BUlRJQ0xFLCAwKTsKKyAgIFNldFByb3AoUF9HRU5ERVIsIEZFTUFMRSk7CisgICBTZXRQcm9wKFBfTEVWRUwsIDgwKTsKKyAgIFNldFByb3AoUF9BVFRSSUJVVEVTLCAoWyJpbnQiOjYwLCJjb24iOjQwLCJzdHIiOjE2LCJkZXgiOjUwXSkgKTsKKyAgIFNldFByb3AoUF9ESVNBQkxFX0FUVEFDSywgLTEwMDAwKTsgLy8gaXMgbmljaCA6KQorICAgU2V0UHJvcChQX0JPRFksIDgwKTsKKyAgIFNldFByb3AoUF9NQVhfU1AsIDIwMDApOworICAgU2V0UHJvcChQX1NQLCAyMDAwKTsKKyAgIFNldFByb3AoUF9NQVhfSFAsIDYwMCk7CisgICBTZXRQcm9wKFBfSFAsIDYwMCk7CisgICBTZXRQcm9wKFBfQUxJR04sIDQwMCk7CisgICBTZXRQcm9wKFBfUkFDRSwgIkZlZSIpOworICAgU2V0UHJvcChQX1NJWkUsIDE2MCtyYW5kb20oMTYpKTsKKyAgIFNldFByb3AoUF9BTENPSE9MLCAwKTsKKyAgIFNldFByb3AoUF9DT1JQU0UsIE9CSigiZmVlbmxlaWNoZSIpKTsKKyAgIFNldFByb3AoUF9NQVhfQUxDT0hPTCwgMCk7IC8vIGtlaW4gcmF1c2NoZW4gOikKKyAgIEFkZEFkamVjdGl2ZSgid3VuZGVyc2Nob2VuIik7CisgICBBZGRJZCgoeyJ0aXRpbmEiLCAiZmVlIiwgIndhbGRmZWUiLCBXQUxESUQoImZlZSIpfSkpOworICAgU2V0UHJvcChQX0hBTkRTLCAoeyIgbWl0IGlocmVuIHphcnRlbiBIYWVuZGVuIiwgMTUwLCBEVF9CTFVER0VPTn0pICk7CisgICBTZXRQcm9wKFBfU0tJTExfQVRUUklCVVRFX09GRlNFVFMsIChbU0FfU1BFTExfUEVORVRSQVRJT046IDEwMF0pKTsKKyAgIFNldFByb3AoUF9YUCwgODAwKjIwMCo1KjIpOworICAgU2V0UHJvcChQX0dVSUxELCAiemF1YmVyZXIiKTsKKyAgIFNldFByb3AoUF9aX05PX01BVEVSSUFMLCAxKTsKKyAgIFNldFByb3AoUF9ERUZBVUxUX0lORk8sICJzY2h3ZWlndCB1bmQgbGFlY2hlbHQgRGljaCBlaW5mYWNoIG51ciBmcmV1bmRsaWNoIGFuLlxuIik7CisgICBNb2RpZnlTa2lsbCgidmVybGV0emUiLAorICAgICAgKFtTSV9TS0lMTEFCSUxJVFk6ODAwMCwgU0lfU1BFTExDT1NUOjAsCisgICAgICAgIFNJX1NQRUxMRkFUSUdVRTowLCBTSV9OT19DT05TRVFVRU5DRVM6MTAwMDAsCisgICAgICAgIFNJX1NLSUxMUkVTVFJfVVNFOihbUF9HVUlMRF9MRVZFTDowLFNSX0ZSRUVfSEFORFM6MF0pLAorICAgICAgICBTSV9BUk1PVVJfUkVTVFI6MF0pLDAsInphdWJlcmVyIik7CisgICBTZXRQcm9wKFBfR1VJTEQsIDApOworICAgU2V0UHJvcChQX1JFU0lTVEFOQ0VfU1RSRU5HVEhTLAorICAgICAgKFtEVF9VTkhPTFk6IDAuMjUsCisgICAgICAgIERUX0FJUjogICAgMC4zLAorICAgICAgICBEVF9QT0lTT046IDAuMTVdKSApOyAvLyBzb25zdCBzZWx0ZW4gaW4gYmVudXR6dW5nIDopCisKKyAgIEFkZEl0ZW0oT0JKKCJrYW1tIiksIENMT05FX1dJRUxEKTsKKyAgIEFkZEl0ZW0oT0JKKCJrbGVpZCIpLCBDTE9ORV9XRUFSKTsKKyAgIGlmIChmaWxlX3NpemUoU0FFQ0tDSEVOKT4wKSBBZGRJdGVtKFNBRUNLQ0hFTiwgQ0xPTkVfTkVXKTsKK30KKworc3RhdGljIHN0cmluZyBfcXVlcnlfbG9uZygpCit7CisgICBpZiAoIVBMIHx8IFBMLT5RdWVyeVByb3AoUF9HRU5ERVIpPT1GRU1BTEUpCisgICAgICByZXR1cm4gUXVlcnkoUF9MT05HKQorICAgICAgICArIklociB1ZWJlcmhlYmxpY2hlcyBsYWVjaGVsbiBicmluZ3QgRGljaCBqZWRvY2ggdG90YWwgenVyIFdlaXNzZ2x1dCwgc28gZWluZVxuIgorICAgICAgICArIlppY2tlIGhpZXIgZGVuIGdhbnplbiBUYWcgcnVtenVzaXR6ZW4gdW5kIHNpY2ggbnVyIGRpZSBIYWFyZSB6dSBrYWVtbWVuLlxuIjsKKyAgIHJldHVybiBRdWVyeShQX0xPTkcpCisgICAgICsiTWl0IGlocmVtIGNoYXJtYW50ZW4gbGFlY2hlbG4sIHppZWh0IHNpZSBEaWNoIHNvZm9ydCBpbiBpaHJlbiBCYW5uIHVuZCBEdVxuIgorICAgICArInd1ZXJkZXN0IGlociBqZWRlbiBXdW5zY2ggZXJmdWVsbGVuLCBzbyBzaWUgZGVubiBlaW5lbiBhZXVzc2VybiB3dWVyZGUuXG4iOworfQorCit2b2lkIEF0dGFjayhvYmplY3QgZW5lbXkpCit7CisgICBpbnQgbm9ybWFsX3NwZWVkOworICAgbm9ybWFsX3NwZWVkPShlbmVteS0+UXVlcnlQcm9wKFBfU0tJTExfQVRUUklCVVRFX09GRlNFVFMpfHwoW10pKVtTQV9TUEVFRF18fDEwMDsKKyAgIGlmIChlbmVteSAmJiBlbmVteS0+UXVlcnlTa2lsbEF0dHJpYnV0ZShTQV9TUEVFRCkgPiBub3JtYWxfc3BlZWQpIHsKKyAgICAgIHdyaXRlKCJEaWUgRmVlIG1hY2h0IGVpbmUgYmVydWhpZ2VuZGUgSGFuZGJld2VndW5nIHVuZCBwbG9ldHpsaWNoIGZ1ZWhsc3QgRHUgRGljaFxuIgorICAgICAgICAgICArInJ1aGlnIHVuZCBEdSBtZXJrc3Qgd2llIER1IGFsbG1hZWhsaWNoIHdpZWRlciBsYW5nc2FtZXIgd2lyc3QuLi5cbiIpOworICAgICAgZW5lbXktPk1vZGlmeVNraWxsQXR0cmlidXRlKFNBX1NQRUVELCAtMjAsIDE4MCk7CisgICB9CisgICBpZiAoZW5lbXkpIDo6QXR0YWNrKGVuZW15KTsKKyAgIFNldFByb3AoUF9HVUlMRCwgInphdWJlcmVyIik7CisgICBjb21tYW5kKCJ2ZXJsZXR6ZSBtaXQgIisoeyJmZXVlciIsICJtYWdpZSIsICJlaXMiLCAid2Fzc2VyIiwgImdpZnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2luZCIsICJzYWV1cmUiLCAibGFlcm0ifSlbcmFuZG9tKDgpXSApOworICAgU2V0UHJvcChQX0dVSUxELCAwKTsKK30KKworaW50IERlZmVuZChpbnQgZGFtLCBtaXhlZCBkdHMsIG1peGVkIHNwZWxsLCBvYmplY3QgZW5lbXkpCit7CisgICBpbnQgbm9ybWFsX3NwZWVkOworICAgbm9ybWFsX3NwZWVkPShlbmVteS0+UXVlcnlQcm9wKFBfU0tJTExfQVRUUklCVVRFX09GRlNFVFMpfHwoW10pKVtTQV9TUEVFRF18fDEwMDsKKyAgIGlmIChlbmVteSAmJiBlbmVteS0+UXVlcnlTa2lsbEF0dHJpYnV0ZShTQV9TUEVFRCkgPiBub3JtYWxfc3BlZWQpIHsKKyAgICAgIHdyaXRlKE5hbWUoV0VSKSsiIG1hY2h0IGVpbmUgYmVydWhpZ2VuZGUgSGFuZGJld2VndW5nIHVuZCBwbG9ldHpsaWNoIGZ1ZWhsc3QgRHUgRGljaFxuIgorICAgICAgICAgICArInJ1aGlnIHVuZCBEdSBtZXJrc3Qgd2llIER1IGFsbG1hZWhsaWNoIHdpZWRlciBsYW5nc2FtZXIgd2lyc3QuLi5cbiIpOworICAgICAgZW5lbXktPk1vZGlmeVNraWxsQXR0cmlidXRlKFNBX1NQRUVELCAtMjAsIDE4MCk7CisgICB9CisKKyAgIGlmICgoIXNwZWxsIHx8IChtYXBwaW5ncChzcGVsbCkgJiYgc3BlbGxbU1BfUEhZU0lDQUxfQVRUQUNLXSkpICYmICFyYW5kb20oNCkpIHsKKyAgICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudCgpLCBOYW1lKFdFUikrIiB3ZWljaHQgc2NobmVsbCBlaW5lbiBTY2hyaXR0IHp1cnVlY2sgdW5kIHdlaWNodCBEZWluZW0gQW5ncmlmZiBhdXMuXG4iKTsKKyAgICAgIGRhbT0wOworICAgfQorICAgcmV0dXJuIChpbnQpOjpEZWZlbmQoZGFtLCBkdHMsIHNwZWxsLCBlbmVteSk7Cit9CisKK3ZvaWQgTm90aWZ5UGxheWVyRGVhdGgob2JqZWN0IHdobywgb2JqZWN0IGtpbGxlciwgb2JqZWN0IGxvc3RfZXhwKQoreworICBpZiAoIXdobyB8fCBraWxsZXIhPU1FKSByZXR1cm47IC8vIHVuaW50ZXJlc3NhbnQKKyAgbG9nX2ZpbGUoInBhZHJlaWMva2lsbCIsIGN0aW1lKHRpbWUoKSkrIiAiK2NhcGl0YWxpemUoZ2V0dWlkKHdobykpKyIgZ2V0b2V0ZXQgdm9uIC96YXViZXJ3YWxkL3RpdGluYVxuIik7Cit9CisKK3ZvaWQgZGllKCkKK3sKKyAgbG9nX2ZpbGUoInBhZHJlaWMva2lsbCIsIGN0aW1lKHRpbWUoKSkrIiBUaXRpbmEgd3VyZGUgdm9uICIrZ2V0X2tpbGxlcigpKyIgZ2V0b2V0ZXQuXG4iKTsKKyAgOjpkaWUoKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9ucGMvdWxpbmlhLmMgYi9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvbnBjL3VsaW5pYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYTU5NmUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvbnBjL3VsaW5pYS5jCkBAIC0wLDAgKzEsMTYwIEBACisvLyAoYykgYnkgUGFkcmVpYyAoUGFkcmVpY0BtZy5tdWQuZGUpCisKKyNpbmNsdWRlICIuLi9maWxlcy5oIgorI2luY2x1ZGUgPGNvbWJhdC5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPG5ld19za2lsbHMuaD4KKyNpbmNsdWRlICIvcC96YXViZXJlci96YXViZXJlci5oIgorCitpbmhlcml0IE5QQygic3RkbnBjIik7CisKK3N0cmluZyBpbmZvX3Rhcm56YXViZXIoKQoreworICAgb2JqZWN0IG9iOworICAgaWYgKHByZXNlbnQoIlxudGFybnphdWJlciIsIFBMKSkKKyAgICAgIHJldHVybiAic2FndDogSWNoIGhhYmUgRGljaCBkb2NoIGJlcmVpc3QgdmVyemF1YmVydC5cbiI7CisgICBvYj1jbG9uZV9vYmplY3QoT0JKKCJ0YXJuemF1YmVyIikpOworICAgb2ItPm1vdmUoUEwsIE1fTk9DSEVDSyk7CisgICBvYi0+SW5pdGlhbGl6ZShQTCk7CisgICByZXR1cm4gInNhZ3Q6IE51biBndXQsIHNvIHNlaSBlcy4uLlxuIgorICAgICAgICAgKyJtYWNodCBlaW5lIHdlaXRlIEhhbmRiZXdlZ3VuZyB1bmQgRHUgZnVlaGxzdCB3aWUgRHUgRGljaCB2ZXJ3YW5kZWxzdC5cbiIKKyAgICAgICAgICsic2FndDogVmllbCBHbHVlY2shIjsKK30KKwordm9pZCBjcmVhdGUoKQoreworICAgOjpjcmVhdGUoKTsKKyAgIFNldFByb3AoUF9TSE9SVCwgIlVsaW5pYSBkaWUgV2FsZGZlZSIpOworICAgU2V0UHJvcChQX0xPTkcsCisgICAgICBCUygiVWViZXIgZGVtIFRlaWNoIHNjaHdlYnQgVWxpbmlhIGRpZSBXYWxkZmVlLiBJaHIgbGFuZ2VzIGdvbGRlbmVzIEhhYXIgd2VodCAiCisgICAgICsibGVpY2h0IGltIFdpbmQgdW5kIGRhcyBlaW56aWdlIHdhcyBzaWUgYmVkZWNrdCwgaXN0IGVpbiBsZWljaHRlcyBCbGFldHRlcmtsZWlkICIKKyAgICAgKyJkYXMgaWhyZSB3ZWlibGljaGVuIFJ1bmR1bmdlbiBhdXNzZXJvcmRlbnRsaWNoIGd1dCB6dXIgR2VsdHVuZyBicmluZ3QuICIKKyAgICAgKyJJbiBkZXIgSGFuZCBoYWVsdCBzaWUgZWluZW4ga2xlaW5lbiBaYXViZXJzdGFiLCBtaXQgZGVtIHNpZSBob2NoIHVlYmVyIGFsbGVtIHRocm9udC4iKSk7CisgICBTZXRQcm9wKFBfTkFNRSwgIlVsaW5pYSIpOworICAgU2V0UHJvcChQX0FSVElDTEUsIDApOworICAgU2V0UHJvcChQX0dFTkRFUiwgRkVNQUxFKTsKKyAgIFNldFByb3AoUF9MRVZFTCwgODApOworICAgU2V0UHJvcChQX0FUVFJJQlVURVMsIChbImludCI6ODAsImNvbiI6NDAsInN0ciI6MTYsImRleCI6NTBdKSApOworICAgU2V0UHJvcChQX0RJU0FCTEVfQVRUQUNLLCAtMTAwMDApOyAvLyBpcyBuaWNoIDopCisgICBTZXRQcm9wKFBfQk9EWSwgODApOworICAgU2V0UHJvcChQX01BWF9TUCwgMjAwMCk7CisgICBTZXRQcm9wKFBfU1AsIDIwMDApOworICAgU2V0UHJvcChQX01BWF9IUCwgODAwKTsKKyAgIFNldFByb3AoUF9IUCwgODAwKTsKKyAgIFNldFByb3AoUF9BTElHTiwgNDAwKTsKKyAgIFNldFByb3AoUF9SQUNFLCAiRmVlIik7CisgICBTZXRQcm9wKFBfU0laRSwgMTYwK3JhbmRvbSgxNikpOworICAgU2V0UHJvcChQX0FMQ09IT0wsIDApOworICAgU2V0UHJvcChQX0NPUlBTRSwgT0JKKCJmZWVubGVpY2hlIikpOworICAgU2V0UHJvcChQX01BWF9BTENPSE9MLCAwKTsgLy8ga2VpbiByYXVzY2hlbiA6KQorICAgQWRkQWRqZWN0aXZlKCJ3dW5kZXJzY2hvZW4iKTsKKyAgIEFkZElkKCh7ImZlZSIsICJ3YWxkZmVlIiwgInVsaW5pYSIsIFdBTERJRCgiZmVlIil9KSk7CisgICBTZXRQcm9wKFBfSEFORFMsICh7IiBtaXQgaWhyZW4gemFydGVuIEhhZW5kZW4iLCAxNTAsIERUX0JMVURHRU9OfSkgKTsKKyAgIFNldFByb3AoUF9TS0lMTF9BVFRSSUJVVEVfT0ZGU0VUUywgKFtTQV9TUEVMTF9QRU5FVFJBVElPTjogMjUwXSkpOworICAgU2V0UHJvcChQX1hQLCA4MDAqMjAwKjUqMik7CisgICBTZXRQcm9wKFBfR1VJTEQsICJ6YXViZXJlciIpOworICAgU2V0UHJvcChQX1pfTk9fTUFURVJJQUwsIDEpOworICAgU2V0UHJvcChQX0RFRkFVTFRfSU5GTywgInNjaHdlaWd0IHVuZCBsYWVjaGVsdCBEaWNoIGVpbmZhY2ggbnVyIGZyZXVuZGxpY2ggYW4uXG4iKTsKKyAgIEFkZEluZm8oKHsicXVlc3QiLCAiaGlsZmUiLCAiYXVmZ2FiZSIsICJkdW5rZWxlbGZlbmFtdWxldHQiLCAiZGVsZmVuYW11bGV0dCJ9KSwKKyAgICAgIk9oaCBpbiBkZXIgVGF0IGhhZXR0ZSBpY2ggZGEgZWluZSBBdWZnYWJlIGZ1ZXIgRGljaCwgYWJlciBpY2ggbXVzcyBEaWNoICIKKyAgICArIndhcm5lbiwgZGFzIHNpZSBuaWNodCBnYW56IHVuZ2VmYWVocmxpY2ggaXN0LlxuIgorICAgICsiRWluIGJlZnJldW5kZXRlciBLb2JvbGQgYmVyaWNodGV0ZSBtaXIgdm9uIGVpbmVtIGxhbmdlIHZlcnNjaG9sbGVuZW4gQnVjaCwgIgorICAgICsiZGFzcyBpbiBkZXIgQmlibGlvdGhlayBkZXIgRHVua2VsZWxmZW4gd2llZGVyIGF1ZmdldGF1Y2h0IGlzdC4gSW4gZGllc2VtICIKKyAgICArIkJ1Y2ggaXN0IHVudGVyIGFuZGVyZW0gdm9uIGVpbmVtIGFsdGVuIEFtdWxldHQgZGllIFJlZGUsIG1pdCBkZXNzZW4gSGlsZmUgIgorICAgICsiZGllIER1bmtlbGVsZmVuIGlocmUgYWx0ZSBNYWNodCB3aWVkZXJlcmxhbmdlbiB1bmQgZXJuZXV0IEZ1cmNodCB1bmQgIgorICAgICsiU2NocmVja2VuIHVlYmVyIGRhcyBnZXNhbXRlIE1vcmdlbmdyYXVlbiBicmluZ2VuIGtvZW5udGVuLiAiCisgICAgKyJXZW5uIER1IGRpZSBHZWZhaHIgbmljaHQgc2NoZXVzdCwgd2FlcmUgZXMgYXVzc2Vyb3JkZW50bGljaCBuZXR0IHdlbm4gRHUgIgorICAgICsiRGljaCBuYWNoIFp6ZXJlbnp6ZW4gYmVnZWJlbiB3dWVyZGVzdCB1bmQgZG9ydCBuYWNoIGRlbSBBbXVsZXR0IHN1Y2hzdC5cbiIKKyAgICArIlNvbGx0ZXN0IER1IGRhcyBBbXVsZXR0IHRhdHNhZWNobGljaCBmaW5kZW4sIHNvIGlzdCBlcyB3aWNodGlnIGRhcyBlcyAiCisgICAgKyJhdWYga2VpbmVuIEZhbGwgaW4gZGllIEhhbmQgZGVyIER1bmtlbGVsZmVuIGdlcmFldCB1bmQgemVyc3RvZXJ0IHdpcmQuIiwKKyAgICAiYW50d29ydGV0OiAiKTsKKyAgIEFkZEluZm8oImdlZmFociIsCisgICAgICJOdW4gRHUgd2lyc3QgRGljaCBtaXR0ZW4gdW50ZXIgZGllIER1bmtlbGVsZmVuIGJlZ2ViZW4gbXVlc3NlbiB1bSAiCisgICAgKyJ6dSBpaHJlciBCaWJsaW90aGVrIGdlbGFuZ2VuIHp1IGtvZW5uZW4uIEluIFp6ZXJlbnp6ZW4gd2lyc3QgRHUgIgorICAgICsiaGllcmJlaSB2b2VsbGlnIGF1ZiBEaWNoIGFsbGVpbiBnZXN0ZWxsdCBzZWluLlxuIgorICAgICsiQWxsZXMgd2FzIGljaCBoaWVyYmVpIGZ1ZXIgRGljaCB0dW4ga2FubiwgaXN0IGVpbmVuIFRhcm56YXViZXIgenUgIgorICAgICsic3ByZWNoZW4gZGVyIERpY2ggYWV1c3NlcmxpY2ggaW4gZWluZW4gRHVua2VsZWxmZW4gdmVyd2FuZGVsdC4gIgorICAgICsiQWJlciB2b3JzaWNodCwgc3BhZXRlc3RlbnMgd2VubiBEdSBEaWNoIGluIGVpbmVuIEthbXBmIHZlcndpY2tlbHN0LCAiCisgICAgKyJ3aXJkIHNpY2ggZGVyIFphdWJlciBsb2VzZW4uIiwgInNhZ3Q6ICIpOworICAgQWRkSW5mbygidGFybnphdWJlciIsICMnaW5mb190YXJuemF1YmVyLCAiIik7CisgICBBZGRJbmZvKCh7ImZ1cmNodCIsICJzY2hyZWNrZW4iLCAibWFjaHQifSksCisgICAgICJKYSBmcnVlaGVyIHdhcmVuIGRpZSBEdW5rZWxlbGZlbiBzZWhyIHNlaHIgbWFlY2h0aWcgdW5kIGFsbGUgIgorICAgICsiZnJpZWRsaWViZW5kZW4gR2VzY2hvZXBmZSBkaWVzZXIgV2VsdCBzb2xsdGVuIGhvZmZlbiBkYXMgc2llICIKKyAgICArIm5pZSB3aWVkZXIgaWhyZSBhbHRlIE1hY2h0IGVybGFuZ2VuIHdlcmRlbi4iLCAiYW50d29ydGV0OiAiKTsgIAorICAgQWRkSW5mbygiYW11bGV0dCIsCisgICAgICJOdW4gbGVpZGVyIHdlaXNzIGljaCBhdWNoIG5pY2h0cyBnZW5hdWVzIHVlYmVyIGRhcyBBbXVsZXR0LiBJY2ggYmluICIKKyAgICArIm5pY2h0IG1hbCBzaWNoZXIgb2IgZXMgZXhpc3RpZXJ0IG9kZXIgamUgZXhpc3RpZXJ0IGhhdC4gQWJlciBzb2xsdGUgIgorICAgICsiZXMgbm9jaCBleGlzdGllcmVuLCBtdXNzIGVzIGF1ZiBqZWRlbiBGYWxsIHplcnN0b2VydCB3ZXJkZW4hIiwgInNhZ3Q6ICIpOworICAgQWRkSW5mbygia29ib2xkIiwKKyAgICAgIkljaCBoYWJlIHZlcnNwcm9jaGVuIGlobiBuaWNodCB6dSB2ZXJyYXRlbiB1bmQgc28ga2FubiBpY2ggRGlyIG5pY2h0cyAiCisgICAgKyJ3ZWl0ZXIgdWViZXIgaWhuIHNhZ2VuLiIsICJhbnR3b3J0ZXQ6ICIpOworICAgQWRkSW5mbygoeyJidWNoIiwgImJpYmxpb3RoZWsifSksCisgICAgICJJY2ggZGVua2UgYW0gYmVzdGVuIGJlZ2lic3QgRHUgRGljaCBpbiBkaWUgSG9laGxlIGRlcyBMb2V3ZW4gdW5kIHZlcnN1Y2hzdCAiCisgICAgKyJpbiBkZXIgQmlibGlvdGhlayBkZXIgRHVua2VsZWxmZW4gc2VsYnN0IGVpbiBCbGljayBpbiBkaWVzIEJ1Y2ggenUgd2VyZmVuLlxuIgorICAgICsiV2VubiBpY2ggZGFzIG5vY2ggcmVjaHQgaW4gRXJpbm5lcnVuZyBoYWJlLCBoYW5kZWx0IGVzIHNpY2ggaGllcmJlaSB1bSAiCisgICAgKyJkYXMgQnVjaCBlaW5lcyBEdW5rZWxlbGZlbiBuYW1lcyBUZXlyaW9uLiIsICJzYWd0OiAiKTsKKyAgIEFkZEluZm8oImxvZXdlbiIsICJEYXMgaXN0IGRvY2ggYmxvc3MgZWluZSBSZWRld2VuZHVuZy4iLCAic2FndDogIik7CisgICBBZGRJbmZvKCJyZWRld2VuZHVuZyIsICJOYSBkYXMgc2FndCBtYW4gaGFsdCBzby4uLiIsICJzYWd0OiAiKTsKKyAgIEFkZEluZm8oKHsiaG9laGxlIiwgInp6ZXJlbnp6ZW4ifSksCisgICAgICJEZXIgRWluZ2FuZyBuYWNoIFp6ZXJlbnp6ZW4gbGllZ3QgaW4gZGVyIG5hZWhlIHZvbiBXaWxoZWxtc2J1cmcgZ3V0IGhpbnRlciAiCisgICAgKyJlaW5lbSBXYXNzZXJmYWxsIHZlcnN0ZWNrdC4iLCAic2FndDogIik7CisgICBNb2RpZnlTa2lsbCgidmVybGV0emUiLAorICAgICAgKFtTSV9TS0lMTEFCSUxJVFk6MTAwMDAsIFNJX1NQRUxMQ09TVDowLAorICAgICAgICBTSV9TUEVMTEZBVElHVUU6MCwgU0lfTk9fQ09OU0VRVUVOQ0VTOjEwMDAwLAorICAgICAgICBTSV9TS0lMTFJFU1RSX1VTRTooW1BfR1VJTERfTEVWRUw6MCxTUl9GUkVFX0hBTkRTOjBdKSwKKyAgICAgICAgU0lfQVJNT1VSX1JFU1RSOjBdKSwwLCJ6YXViZXJlciIpOworICAgU2V0UHJvcChQX0dVSUxELCAwKTsKKyAgIFNldFByb3AoUF9SRVNJU1RBTkNFX1NUUkVOR1RIUywKKyAgICAgIChbRFRfVU5IT0xZOiAwLjI1LAorICAgICAgICBEVF9QT0lTT046IDAuMTUsIAorICAgICAgICBEVF9NQUdJQzogLTAuM10pICk7CisKKyAgIEFkZEl0ZW0oT0JKKCJ6YXViZXJzdGFiIiksIENMT05FX1dJRUxEKTsKKyAgIEFkZEl0ZW0oT0JKKCJrbGVpZCIpLCBDTE9ORV9XRUFSKTsKKyAgIGlmIChmaWxlX3NpemUoU0FFQ0tDSEVOKT4wKSBBZGRJdGVtKFNBRUNLQ0hFTiwgQ0xPTkVfTkVXKTsKK30KKwordm9pZCBBdHRhY2sob2JqZWN0IGVuZW15KQoreworICAgaW50IG5vcm1hbF9zcGVlZDsKKyAgIG5vcm1hbF9zcGVlZD0oZW5lbXktPlF1ZXJ5UHJvcChQX1NLSUxMX0FUVFJJQlVURV9PRkZTRVRTKXx8KFtdKSlbU0FfU1BFRURdfHwxMDA7CisgICBpZiAoZW5lbXkgJiYgZW5lbXktPlF1ZXJ5U2tpbGxBdHRyaWJ1dGUoU0FfU1BFRUQpID4gbm9ybWFsX3NwZWVkKSB7CisgICAgICB3cml0ZSgiRGllIEZlZSBtYWNodCBlaW5lIGJlcnVoaWdlbmRlIEhhbmRiZXdlZ3VuZyB1bmQgcGxvZXR6bGljaCBmdWVobHN0IER1IERpY2hcbiIKKyAgICAgICAgICAgKyJydWhpZyB1bmQgRHUgbWVya3N0IHdpZSBEdSBhbGxtYWVobGljaCB3aWVkZXIgbGFuZ3NhbWVyIHdpcnN0Li4uXG4iKTsKKyAgICAgIGVuZW15LT5Nb2RpZnlTa2lsbEF0dHJpYnV0ZShTQV9TUEVFRCwgLTIwLCAxODApOworICAgfQorICAgaWYgKGVuZW15KSA6OkF0dGFjayhlbmVteSk7CisgICBTZXRQcm9wKFBfR1VJTEQsICJ6YXViZXJlciIpOworICAgY29tbWFuZCgidmVybGV0emUgbWl0ICIrKHsiZmV1ZXIiLCAibWFnaWUiLCAiZWlzIiwgIndhc3NlciIsICJnaWZ0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpbmQiLCAic2FldXJlIiwgImxhZXJtIn0pW3JhbmRvbSg4KV0gKTsKKyAgIFNldFByb3AoUF9HVUlMRCwgMCk7Cit9CisKK2ludCBEZWZlbmQoaW50IGRhbSwgbWl4ZWQgZHRzLCBtaXhlZCBzcGVsbCwgb2JqZWN0IGVuZW15KQoreworICAgaW50IG5vcm1hbF9zcGVlZDsKKyAgIG5vcm1hbF9zcGVlZD0oZW5lbXktPlF1ZXJ5UHJvcChQX1NLSUxMX0FUVFJJQlVURV9PRkZTRVRTKXx8KFtdKSlbU0FfU1BFRURdfHwxMDA7CisgICBpZiAoZW5lbXkgJiYgZW5lbXktPlF1ZXJ5U2tpbGxBdHRyaWJ1dGUoU0FfU1BFRUQpID4gbm9ybWFsX3NwZWVkKSB7CisgICAgICB3cml0ZShOYW1lKFdFUikrIiBtYWNodCBlaW5lIGJlcnVoaWdlbmRlIEhhbmRiZXdlZ3VuZyB1bmQgcGxvZXR6bGljaCBmdWVobHN0IER1IERpY2hcbiIKKyAgICAgICAgICAgKyJydWhpZyB1bmQgRHUgbWVya3N0IHdpZSBEdSBhbGxtYWVobGljaCB3aWVkZXIgbGFuZ3NhbWVyIHdpcnN0Li4uXG4iKTsKKyAgICAgIGVuZW15LT5Nb2RpZnlTa2lsbEF0dHJpYnV0ZShTQV9TUEVFRCwgLTIwLCAxODApOworICAgfQorCisgICBpZiAoKCFzcGVsbCB8fCAobWFwcGluZ3Aoc3BlbGwpICYmIHNwZWxsW1NQX1BIWVNJQ0FMX0FUVEFDS10pKSAmJiAhcmFuZG9tKDMpKSB7CisgICAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSwgTmFtZShXRVIpKyIgd2VpY2h0IHNjaG5lbGwgZWluZW4gU2Nocml0dCB6dXJ1ZWNrIHVuZCB3ZWljaHQgRGVpbmVtIEFuZ3JpZmYgYXVzLlxuIik7CisgICAgICBkYW09MDsKKyAgIH0KKyAgIHJldHVybiAoaW50KTo6RGVmZW5kKGRhbSwgZHRzLCBzcGVsbCwgZW5lbXkpOworfQorCit2b2lkIE5vdGlmeVBsYXllckRlYXRoKG9iamVjdCB3aG8sIG9iamVjdCBraWxsZXIsIG9iamVjdCBsb3N0X2V4cCkKK3sKKyAgaWYgKCF3aG8gfHwga2lsbGVyIT1NRSkgcmV0dXJuOyAvLyB1bmludGVyZXNzYW50CisgIGxvZ19maWxlKCJwYWRyZWljL2tpbGwiLCBjdGltZSh0aW1lKCkpKyIgIitjYXBpdGFsaXplKGdldHVpZCh3aG8pKSsiIGdldG9ldGV0IHZvbiAvemF1YmVyd2FsZC91bGluaWFcbiIpOworfQorCit2b2lkIGRpZSgpCit7CisgIGxvZ19maWxlKCJwYWRyZWljL2tpbGwiLCBjdGltZSh0aW1lKCkpKyIgVWxpbmlhIHd1cmRlIHZvbiAiK2dldF9raWxsZXIoKSsiIGdldG9ldGV0LlxuIik7CisgIDo6ZGllKCk7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvbnBjL3dhZWNodGVyLmMgYi9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvbnBjL3dhZWNodGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVjMWExMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9ucGMvd2FlY2h0ZXIuYwpAQCAtMCwwICsxLDg3IEBACisvLyAoYykgYnkgUGFkcmVpYyAoUGFkcmVpY0BtZy5tdWQuZGUpCisKKyNpbmNsdWRlICIuLi9maWxlcy5oIgorI2luY2x1ZGUgPGNvbWJhdC5oPgorI2luY2x1ZGUgPG5ld19za2lsbHMuaD4KKworaW5oZXJpdCBOUEMoInN0ZG5wYyIpOworCit2b2lkIGNyZWF0ZSgpCit7CisgICA6OmNyZWF0ZSgpOworICAgU2V0UHJvcChQX05BTUUsICJXYWVjaHRlciBkZXMgV2FsZGVzIik7CisgICBTZXRQcm9wKFBfU0hPUlQsICJEZXIgV2FlY2h0ZXIgZGVzIFdhbGRlcyIpOworICAgU2V0UHJvcChQX0xPTkcsCisgICAgICJWb3IgRGlyIHN0ZWh0IGVpbmUgc2VociBzZWhyIGFsdGUgRWljaGUuIERvY2ggZGllc2UgRWljaGUgaXN0IGtlaW5lXG4iCisgICAgKyJnZXdvZWhubGljaGUgRWljaGUsIHdpZSBEdSBzaWUgYmVyZWl0cyBhbiB2aWVsZW4gYW5kZXJlbiBTdGVsbGVuIGdlc2VobiBoYXN0LlxuIgorICAgICsiRGllc2UgRWljaGUgbGVidCEgRHUga2FubnN0IGRldXRsaWNoIGVpbmVuIE11bmQsIGVpbmUgTmFzZSB1bmQgc29nYXIgendlaVxuIgorICAgICsiT2hyZW4gZXJrZW5uZW4uIFNpZSBpc3QgZWlnZW50bGljaCBzZWhyIGZyaWVkbGljaCBnZXNvbm5lbiwga2FubiBhYmVyIGF1Y2hcbiIKKyAgICArInNlaHIgc2VociBib2VzZSB3ZXJkZW4sIHdlbm4gZXMgamVtYW5kIHdhZ3QgZGllIFJ1aGUgZGVzIFdhbGRlcyB6dSBzdG9lcmVuLlxuIik7CisgICBTZXRQcm9wKFBfUkFDRSwgImVpY2hlIik7CisgICBTZXRQcm9wKFBfQUdHUkVTU0lWRSwgMCk7CisgICBTZXRQcm9wKFBfTEVWRUwsIDEwMCk7CisgICBTZXRQcm9wKFBfQVRUUklCVVRFUywgKFsiaW50Ijo4MCwiY29uIjoxMDAsInN0ciI6MTAwLCJkZXgiOjIwXSkgKTsKKyAgIFNldFByb3AoUF9HRU5ERVIsIE1BTEUpOworICAgU2V0UHJvcChQX01BWF9IUCwgMTAwMCk7CisgICBTZXRQcm9wKFBfSFAsIDEwMDApOworICAgU2V0UHJvcChQX0FMSUdOLCA1MDApOworICAgU2V0UHJvcChQX0JPRFksIDEwMCk7CisgICBTZXRQcm9wKFBfU0laRSwgMTUwMCk7CisgICBTZXRQcm9wKFBfRElTQUJMRV9BVFRBQ0ssIC0xMDAwMCk7IC8vIGlzIG5pY2ggOikKKyAgIEFkZElkKCh7ImVpY2hlIiwgIndhZWNodGVyIiwid2FlY2h0ZXIgZGVzIHdhbGRlcyIsIFdBTERJRCgid2FlY2h0ZXJlaWNoZSIpIH0pKTsKKyAgIFNldFByb3AoUF9IQU5EUywgKHsiIG1pdCBlaW5lbSBzZWluZXIgbGFuZ2VuIEFlc3RlIiw1NTAsRFRfV0hJUH0pICk7CisgICBTZXRQcm9wKFBfU0tJTExfQVRUUklCVVRFX09GRlNFVFMsIChbU0FfU1BFRUQ6MjEwXSkpOworICAgU2V0UHJvcChQX05PQ09SUFNFLCAxKTsKKyAgIFNldFByb3AoUF9YUCwgMTAwMCo1NTAqNSk7CisgICBTZXRQcm9wKFBfREVGQVVMVF9JTkZPLCAiYmxlaWJ0IGFic29sdXQgcmVndW5nc2xvcyB1bmQgcmVhZ2llcnQgdWViZXJoYXVwdCBuaWNodC5cbiIpOworICAgU2V0UHJvcChQX1JFU0lTVEFOQ0VfU1RSRU5HVEhTLAorICAgIChbRFRfU0xBU0g6ICAgICAwLjEsCisgICAgICBEVF9NQUdJQzogICAgLTEuMCwKKyAgICAgIERUX0JMVURHRU9OOiAtMC41LAorICAgICAgRFRfUE9JU09OOiAgICAwLjI1LAorICAgICAgRFRfSE9MWTogICAgIC0xLjAsCisgICAgICBEVF9SSVA6ICAgICAgIDAuMjUsCisgICAgICBEVF9GSVJFOiAgICAgIDAuMjUsCisgICAgICBEVF9QSUVSQ0U6ICAgLTAuNSwKKyAgICAgIERUX1dISVA6ICAgICAtMS4wIF0pICk7CisgICBBZGRDbWQoKHsib3N0ZW4iLCAid2VzdGVuIn0pLCAiY21kX2Jsb2NrZW4iKTsKK30KKworc3RhdGljIHN0cmluZyBfcXVlcnlfaW5mbygpCit7CisgICBpZiAoIVBMIHx8IFBMLT5RdWVyeVByb3AoWkFVQkVSV0FMRCk8PXRpbWUoKSkKKyAgICAgIHJldHVybiAiRGllIGFsdGUgRWljaGUgaXN0IERpciBzZWhyIGZyaWVkbGljaCBnZXNvbm5lbi4gRXMgaXN0IGplZG9jaCBhdWNoIHNpY2hlclxuIgorICAgICAgICAgICAgKyJrbHVnIGRpZXNlcyBuaWNodCB6dSBhZW5kZXJuLCBkYSBzaWUgbWl0IGlocmVuIEFlc3RlbiB3b2hsIGF1Y2ggc2VociBrcmFlZnRpZ1xuIgorICAgICAgICAgICAgKyJ6dXNjaGxhZ2VuIGthbm4uXG4iOworICAgcmV0dXJuICJEdSBoYXN0IGRlbiBab3JuIGRlciBhbHRlbiBXYWVjaHRlcmVpY2hlIGF1ZiBEaWNoIGdlem9nZW4sIGRhcyB3YXIgZ2FueiB1bmRcbiIKKyAgICAgICAgICsiZ2FyIG5pY2h0IGtsdWcgdm9uIERpci4gSmV0enQgbGViZSBhdWNoIG1pdCBkZW4gS29uc2VxdWVuemVuLi4uLlxuIjsKK30KKworc3RhdGljIGludCBjbWRfYmxvY2tlbigpCit7CisgICBpZiAoUEwtPlF1ZXJ5UHJvcChQX1JBQ0UpPT0iRHVua2VsZWxmIiAmJgorICAgICAgIFBMLT5RdWVyeVByb3AoQVVTR0FORyk9PXF1ZXJ5X3ZlcmIoKSkgeworICAgICAgd3JpdGUoQlMoTmFtZShXRVIsIDEpKyIgbGFlc3N0IERpY2ggbmljaHQgdm9yYmVpLiIpCisgICAgICAgICAgICticmVha19zdHJpbmcoIkR1IHNvbGx0ZXN0IGhpZXIgYmVzc2VyIHZlcnNjaHdpbmRlbiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyJzbyBUeXBlbiB3aWUgRHUgc2luZCBoaWVyIG5pY2h0IGdlcm4gZ2VzZWhuISIsCisgICAgICAgICAgICAgICAgICAgICAgICA3OCwgTmFtZShXRVIsIDEpKyIgc2FndDogIikpOworICAgICAgcmV0dXJuIDE7CisgICB9CisgICBpZiAoUEwgJiYgUEwtPlF1ZXJ5UHJvcChaQVVCRVJXQUxEKSAmJgorICAgICAgIFBMLT5RdWVyeVByb3AoQVVTR0FORyk9PXF1ZXJ5X3ZlcmIoKSkgeworICAgICAgd3JpdGUoQlMoTmFtZShXRVIsIDEpKyIgc3RlaHQgRGlyIGRhIGxlaWRlciBpbSBXZWcgdW5kIGxhZXNzdCBEaWNoIG5pY2h0IHZvcmJlaS4iKSk7CisgICAgICByZXR1cm4gMTsKKyAgIH0KK30KKworaW50IHJlbW92ZSgpCit7CisgICBjYWxsX290aGVyKFJPT00oIndlZzEiKSwgImRlbGF5X3Jlc2V0Iik7CisgICByZXR1cm4gKGludCk6OnJlbW92ZSgpOworfQorCit2b2lkIE5vdGlmeVBsYXllckRlYXRoKG9iamVjdCB3aG8sIG9iamVjdCBraWxsZXIsIG9iamVjdCBsb3N0X2V4cCkKK3sKKyAgaWYgKCF3aG8gfHwga2lsbGVyIT1NRSkgcmV0dXJuOyAvLyB1bmludGVyZXNzYW50CisgIGxvZ19maWxlKCJwYWRyZWljL2tpbGwiLCBjdGltZSh0aW1lKCkpKyIgIitjYXBpdGFsaXplKGdldHVpZCh3aG8pKSsiIGdldG9ldGV0IHZvbiAvemF1YmVyd2FsZC93YWVjaHRlclxuIik7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvb2JqL2ZlZW5sZWljaGUuYyBiL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9vYmovZmVlbmxlaWNoZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlN2UwMzQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvb2JqL2ZlZW5sZWljaGUuYwpAQCAtMCwwICsxLDI0IEBACisvLyAoYykgYnkgUGFkcmVpYyAoUGFkcmVpY0BtZy5tdWQuZGUpCisKKyNpbmNsdWRlICIuLi9maWxlcy5oIgorI2luY2x1ZGUgPG1vdmluZy5oPgorCitpbmhlcml0ICJzdGQvY29ycHNlIjsKKworaW50IG1hbXBmKCBzdHJpbmcgc3RyICkKK3sKKyAgIG9iamVjdCBvYjsKKyAgIGlmIChRdWVyeURlY2F5KCk8MykgcmV0dXJuIChpbnQpOjptYW1wZihzdHIpOworICAgbm90aWZ5X2ZhaWwoIldhcyBtb2VjaHRlc3QgRHUgZXNzZW4/XG4iKTsKKyAgIGlmICghc3RyIHx8ICFpZChzdHIpKSByZXR1cm4gMDsKKyAgIGlmICghUEwtPmVhdF9mb29kKDgpKSByZXR1cm4gMTsgLy8gZmVobGVybWVsZHVuZyBnaWJ0IGVhdF9mb29kIGF1cworICAgaWYgKCFvYmplY3RwKG9iPXByZXNlbnQoV0FMRElEKCJsZWljaGVubXAiKSwgUEwpKSkgeworICAgICAgb2I9Y2xvbmVfb2JqZWN0KE9CSigibGVpY2hlbm1wIikpOworICAgICAgb2ItPm1vdmUoUEwsIE1fTk9DSEVDS3xNX0dFVCk7CisgICB9CisgICBvYi0+bmV3X2NvcnBzZSgpOworICAgUEwtPnJlc3RvcmVfc3BlbGxfcG9pbnRzKDUwK3JhbmRvbSgxMDApKTsKKyAgIHdyaXRlKCJEdSBtZXJrc3Qgd2llIGRpZSBub2NoIGltIEtvZXJwZXIgdmVyYmxpZWJlbmUgRW5lcmdpZSBpbiBEaWNoIHVlYmVyZmxpZXNzdC5cbiIpOworICAgcmVtb3ZlKCk7CisgICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9vYmovaGFobmVuZnVzcy5jIGIvZG9jL2JlaXNwaWVsZS96YXViZXJ3YWxkL29iai9oYWhuZW5mdXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk5MmU0NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9vYmovaGFobmVuZnVzcy5jCkBAIC0wLDAgKzEsMzIgQEAKKyNpbmNsdWRlIDxpdGVtcy9rcmFldXRlci9rcmFldXRlcmxpc3RlLmg+CisjaW5jbHVkZSA8aXRlbXMva3JhZXV0ZXIva3JhZXV0ZXIuaD4KKyNpbmNsdWRlICIuLi9maWxlcy5oIgorCitpbmhlcml0IFNURFBMQU5UOworCit2b2lkIGNyZWF0ZSgpCit7CisgICA6OmNyZWF0ZSgpOworICAgY3VzdG9taXplTWUoV0FTU0VSX0hBSE5FTkZVU1NfV0VJU1MpOworfQorCisvKnZhcmFyZ3MgaW50IG1vdmUobWl4ZWQgZGVzdCwgaW50IG1ldGhvZCkKK3sKKyAgIC8vIGRpZSBFaW53b2huZXIgZGVzIFphdWJlcndhbGRzIHNlaGVuIGVzIG5pY2h0IGdlcm5lLCB3ZW5uIGplbWFuZCBpaHJlCisgICAvLyBtYWdpc2NoZW4gUGZsYW56ZW4gcGZsdWVja3QuLi4KKyAgIGludCByZXM7CisgICByZXM9KGludCk6Om1vdmUoZGVzdCwgbWV0aG9kKTsKKyAgIGlmIChyZXMhPTEpIHJldHVybiByZXM7CisgICBpZiAoZW52aXJvbm1lbnQoKSkgCisgICAgIGVudmlyb25tZW50KCktPlNldFByb3AoWkFVQkVSV0FMRCwgdGltZSgpK0FHR1JFU1NJVkVfVElNRSk7CisgICByZXR1cm4gMTsKK30qLworCitwcm90ZWN0ZWQgdm9pZCBOb3RpZnlNb3ZlKG9iamVjdCBkZXN0LCBvYmplY3Qgb2xkZW52LCBpbnQgbWV0aG9kKSB7CisgIGlmICggIW9sZGVudiAmJiBvYmplY3RwKGRlc3QpICYmIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoZGVzdCkgJiYKKyAgICAgICBzdHJzdHIob2JqZWN0X25hbWUoZW52aXJvbm1lbnQoZGVzdCkpLCJ6YXViZXJ3YWxkIik+LTEpIHsKKyAgICBkZXN0LT5TZXRQcm9wKFpBVUJFUldBTEQsIHRpbWUoKStBR0dSRVNTSVZFX1RJTUUpOworICB9CisgIHJldHVybiA6Ok5vdGlmeU1vdmUoZGVzdCwgb2xkZW52LCBtZXRob2QpOworfQorCmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvb2JqL2thbW0uYyBiL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9vYmova2FtbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNmQ2ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvb2JqL2thbW0uYwpAQCAtMCwwICsxLDM5IEBACisvLyAoYykgYnkgUGFkcmVpYyAoUGFkcmVpY0BtZy5tdWQuZGUpCisKK2luaGVyaXQgInN0ZC93ZWFwb24iOworCisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKyNpbmNsdWRlIDxjb21iYXQuaD4KKwordm9pZCBjcmVhdGUoKQoreworICAgOjpjcmVhdGUoKTsKKyAgIFNldFByb3AoUF9TSE9SVCwgIkVpbiBsYW5nZXIgS2FtbSIpOworICAgU2V0UHJvcChQX05BTUUsICJLYW1tIik7CisgICBTZXRQcm9wKFBfR0VOREVSLCBNQUxFKTsKKyAgIFNldFByb3AoUF9MT05HLAorICAgICAiRGllc2VyIHNjaG9lbmUgS2FtbSBnZWhvZXJ0ZSBlaW5tYWwgZWluZXIgV2FsZGZlZSBkaWUgZGFtaXQgaW1tZXIgaWhyIHNjaG9lbmVzXG4iCisgICAgKyJsYW5nZXMgSGFhciBrYWVtbXRlLi4uXG4iKTsKKyAgIEFkZEFkamVjdGl2ZSgia2FtbSIpOworICAgQWRkSWQoImthbW0iKTsKKyAgIFNldFByb3AoUF9XRUFQT05fVFlQRSwgV1RfQ0xVQik7CisgICBTZXRQcm9wKFBfREFNX1RZUEUsIERUX1BJRVJDRSk7CisgICBTZXRQcm9wKFBfTlJfSEFORFMsIDEpOworICAgU2V0UHJvcChQX1dDLCAxMDApOworICAgU2V0UHJvcChQX1ZBTFVFLCAxMDApOworICAgU2V0UHJvcChQX05PQlVZLCAxKTsKKyAgIFNldFByb3AoUF9NQVRFUklBTCwgKHsgTUFUX01JU0NfTUFHSUMsIE1BVF9IT1JOIH0pICk7CisgICBBZGRDbWQoImthZW1tZSIsICJjbWRfa2FlbW1lbiIpOworfQorCitzdGF0aWMgaW50IGNtZF9rYWVtbWVuKHN0cmluZyBzdHIpCit7CisgICBub3RpZnlfZmFpbCgiV2FzIG1vZWNodGVzdCBEdSBkZW5uIGthZW1tZW4/XG4iKTsKKyAgIGlmIChzdHIhPSJoYWFyZSIpIHJldHVybiAwOworICAgd3JpdGUoIkVpdGVsIHdpZSBEdSBiaXN0LCB2ZXJzdWNoc3QgRHUgRGlyIG1pdCBkZW0gS2FtbSBkaWUgSGFhcmUgenUga2FlbW1lbiwgZG9jaFxuIgorICAgICAgICArImlyZ2VuZHdpZSBpc3QgZXIgZWluIGJpc3NjaGVuIHp1IGdyb3NzIGZ1ZXIgRGVpbmUgSGFhcmUuXG4iKTsKKyAgIHNheShCUygiRWl0ZWwgd2llICIrUEwtPlF1ZXJ5UHJvbm91bigpKyIgaXN0LCBrYWVtbXQgc2ljaCAiK1BMLT5uYW1lKFdFUikKKyAgICAgICAgICsiIGRpZSBIYWFyZS4gRG9jaCBpcmdlbmR3aWUgaXN0IGRlciBLYW1tIGVpbiBiaXNzY2hlbiB6dSBncm9zcyBmdWVyICIKKyAgICAgICAgICtQTC0+UXVlcnlQb3NzUHJvbm91bihORVVURVIsIFdFTiwgMSkrIiBrdXJ6ZW4gSGFhcmUuIikpOworICAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvb2JqL2tsZWlkLmMgYi9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvb2JqL2tsZWlkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUyZTE1NwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9vYmova2xlaWQuYwpAQCAtMCwwICsxLDM4IEBACisvLyAoYykgYnkgUGFkcmVpYyAoUGFkcmVpY0BtZy5tdWQuZGUpCisKK2luaGVyaXQgInN0ZC9hcm1vdXIiOworCisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKyNpbmNsdWRlIDxjb21iYXQuaD4KKwordm9pZCBjcmVhdGUoKQoreworICAgOjpjcmVhdGUoKTsKKyAgIFNldFByb3AoUF9OQU1FLCAiQmxhZXR0ZXJrbGVpZCIpOworICAgU2V0UHJvcChQX1NIT1JULCAiRWluIEJsYWV0dGVya2xlaWQiKTsKKyAgIFNldFByb3AoUF9HRU5ERVIsIE5FVVRFUik7CisgICBTZXRQcm9wKFBfTE9ORywKKyAgICAgIkRhcyBCbGFldHRlcmtsZWlkIHN0YW1tdCB2b24gZWluZXIgV2FsZGZlZSB1bmQgd2FyIGdlbmF1IGF1ZiBpaHJlIFJ1bmR1bmdlblxuIgorICAgICsidW5kIGlocmUgR3JvZXNzZSBhYmdlcGFzc3QuIER1IGhhc3QgbGVpZGVyIG5pY2h0IGRpZSBnZXJpbmdzdGUgQ2hhbmNlLCBkaWVzZXNcbiIKKyAgICArIktsZWlkIGplbWFscyB0cmFnZW4genUga29lbm5lbi5cbiIpOworICAgQWRkSWQoKHsia2xlaWQiLCAiYmxhZXR0ZXJrbGVpZCJ9KSk7CisgICBTZXRQcm9wKFBfTUFURVJJQUwsIE1BVF9NSVNDX1dPT0QpOworICAgU2V0UHJvcChQX0FSTU9VUl9UWVBFLCBBVF9BUk1PVVIpOworICAgU2V0UHJvcChQX1ZBTFVFLCA1MDApOworICAgU2V0UHJvcChQX05PQlVZLCAxKTsKKyAgIFNldFByb3AoUF9BQywgMTApOworICAgU2V0UHJvcChQX1dFQVJfRlVOQywgTUUpOworfQorCitpbnQgV2VhckZ1bmMob2JqZWN0IG1lLCBpbnQgc2lsZW50KQoreworICAgaWYgKCFQTCB8fCBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKFBMKSB8fCBnZXR1aWQoUEwpIT1nZXR1aWQoKSB8fAorICAgICAgIFBMLT5RdWVyeVByb3AoUF9SQUNFKSE9IkZlZSIpIHsKKyAgICAgIGlmICghc2lsZW50KQorICAgICAgICB3cml0ZSgiRGllc2VzIEtsZWlkIHdhciBnZW5hdSBhdWYgZGllIFJ1bmR1bmdlbiB1bmQgZGllIEdyb2Vzc2UgZGVyIFdhbGRmZWVcbiIKKyAgICAgICAgICAgICArImFuZ2VwYXNzdCB2b24gZGVyIGVzIHN0YW1tdC4gRHUgaGFzdCBsZWlkZXIgbmljaHQgZGllIGdlcmluZ3N0ZSBDaGFuY2UsXG4iCisgICAgICAgICAgICAgKyJkaWVzZXMgS2xlaWQgamVtYWxzIHRyYWdlbiB6dSBrb2VubmVuLlxuIik7CisgICAgICByZXR1cm4gMDsKKyAgIH0KKyAgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS96YXViZXJ3YWxkL29iai9sZWljaGVubXAuYyBiL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9vYmovbGVpY2hlbm1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVhN2MxMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9vYmovbGVpY2hlbm1wLmMKQEAgLTAsMCArMSw4MSBAQAorLy8gKGMpIGJ5IFBhZHJlaWMgKFBhZHJlaWNAbWcubXVkLmRlKQorLyogQ2hhbmdlbG9nOgorICAgKiAwOS4xMS4wNiBaZXNzdHJhCisgICAgIG9iamVjdF9pbmZvKClbMTFdIGR1cmNoIHF1ZXJ5X25leHRfcmVzZXQoKSBlcnNldHp0LgorICAgICAqLworI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisKK2luaGVyaXQgIi9zdGQvdGhpbmciOworCitzdGF0aWMgaW50IGxlaWNoZW47CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgICBsZWljaGVuPTA7CisgICAgaWYgKCFjbG9uZXAoTUUpKQorICAgICAgIHNldF9uZXh0X3Jlc2V0KC0xKTsKKyAgICBlbHNlIHsKKyAgICAgICA6OmNyZWF0ZSgpOworICAgICAgIFNldFByb3AoUF9JTlZJUywgMSk7CisgICAgICAgU2V0UHJvcChQX05PRFJPUCwgMSk7CisgICAgICAgU2V0UHJvcChQX05FVkVSRFJPUCwgMSk7CisgICAgICAgQWRkSWQoV0FMRElEKCJsZWljaGVubXAiKSk7CisgICAgICAgc2V0X25leHRfcmVzZXQoMzYwMCozKTsgLy8gZXJzdGVyIHJlc2V0IG5hY2ggM2gKKyAgICB9Cit9CisKK2ludCByZW1vdmUoKQoreworICAgIGNsb3N1cmUgY2xvOworICAgIGlmIChlbnZpcm9ubWVudCgpKSB7CisgICAgICBjbG89ZW52aXJvbm1lbnQoKS0+UXVlcnkoUF9NQVhfU1AsIEZfUVVFUllfTUVUSE9EKTsKKyAgICAgIGlmIChjbG8gJiYgdG9fb2JqZWN0KGNsbyk9PU1FKQorICAgICAgICAgIGVudmlyb25tZW50KCktPlNldChQX01BWF9TUCwgMCwgRl9RVUVSWV9NRVRIT0QpOworICAgIH0KKyAgICBkZXN0cnVjdChNRSk7CisgICAgcmV0dXJuIDE7Cit9CisKK2ludCBjYWxjdWxhdGVfbXAoKQoreworICAgIGludCBtcDsKKyAgICBzd2l0Y2gobGVpY2hlbikgeworICAgICAgIGNhc2UgMTogIG1wID0gNTsgIGJyZWFrOworICAgICAgIGNhc2UgMjogIG1wID0gOTsgIGJyZWFrOworICAgICAgIGNhc2UgMzogIG1wID0gMTI7IGJyZWFrOworICAgICAgIGNhc2UgNDogIG1wID0gMTQ7IGJyZWFrOworICAgICAgIGNhc2UgNTogIG1wID0gMTU7IGJyZWFrOworICAgICAgIGRlZmF1bHQ6IG1wID0gMDsKKyAgICB9CisgICAgU2V0UHJvcChQX1hfSEVBTFRIX01PRCwgKFtQX1NQOm1wXSkgKTsKK30KKwordm9pZCBuZXdfY29ycHNlKCkKK3sKKyAgICBjbG9zdXJlIGNsbzsKKyAgICBjbG89UEwtPlF1ZXJ5KFBfTUFYX1NQLCBGX1FVRVJZX01FVEhPRCk7CisgICAgaWYgKGNsbyAmJiB0b19vYmplY3QoY2xvKSE9TUUpIHsKKyAgICAgICBjYWxsX291dCgicmVtb3ZlIiwgMCk7CisgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAobGVpY2hlbjw1KSB7CisgICAgICAgbGVpY2hlbisrOworICAgICAgIHNldF9uZXh0X3Jlc2V0KDM2MDArMyk7CisgICAgfQorICAgIGVsc2Ugc2V0X25leHRfcmVzZXQoIChxdWVyeV9uZXh0X3Jlc2V0KE1FKS10aW1lKCkpKzM2MDAgKTsKKyAgICBjYWxjdWxhdGVfbXAoKTsKK30KKwordm9pZCByZXNldCgpCit7CisgICBsZWljaGVuLS07CisgICBpZiAoZW52aXJvbm1lbnQoKSkgeworICAgICAgdGVsbF9vYmplY3QoZW52aXJvbm1lbnQoKSwgIkR1IHNwdWVyc3Qgd2llIERlaW5lIG1lbnRhbGVuIEtyYWVmdGUgc2Nod2FlY2hlciB3ZXJkZW4uLi5cbiIpOworICAgICAgaWYgKGVudmlyb25tZW50KCktPlF1ZXJ5UHJvcChQX1NQKSA+IGVudmlyb25tZW50KCktPlF1ZXJ5UHJvcChQX01BWF9TUCkpCisgICAgICAgICAgZW52aXJvbm1lbnQoKS0+U2V0UHJvcChQX1NQLCBlbnZpcm9ubWVudCgpLT5RdWVyeVByb3AoUF9NQVhfU1ApKTsKKyAgIH0KKyAgIGNhbGN1bGF0ZV9tcCgpOworICAgaWYgKGxlaWNoZW48PTApCisgICAgICByZW1vdmUoKTsKKyAgIGVsc2Ugc2V0X25leHRfcmVzZXQoMzYwMCk7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvb2JqL3N0b2NrLmMgYi9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvb2JqL3N0b2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc5ZDVlNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9vYmovc3RvY2suYwpAQCAtMCwwICsxLDI2IEBACisvLyAoYykgYnkgUGFkcmVpYyAoUGFkcmVpY0BtZy5tdWQuZGUpCisKK2luaGVyaXQgInN0ZC93ZWFwb24iOworCisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKyNpbmNsdWRlIDxjb21iYXQuaD4KKwordm9pZCBjcmVhdGUoKQoreworICAgOjpjcmVhdGUoKTsKKyAgIFNldFByb3AoUF9TSE9SVCwgIkVpbiBrbGVpbmVyIFplaWdlc3RvY2siKTsKKyAgIFNldFByb3AoUF9OQU1FLCAiWmVpZ2VzdG9jayIpOworICAgU2V0UHJvcChQX0dFTkRFUiwgTUFMRSk7CisgICBTZXRQcm9wKFBfTE9ORywKKyAgICAgIkVpbiBrbGVpbmVyIFN0b2NrLCBtaXQgZGVtIG1hbiBndXQgRGluZ2UgemVpZ2VuIG9kZXIgaW4gZGVuIFNhbmQgbWFsZW4ga2Fubi5cbiIpOworICAgQWRkQWRqZWN0aXZlKCJrbGVpbiIpOworICAgQWRkSWQoKHsic3RvY2siLCAiemVpZ2VzdG9jayJ9KSk7CisgICBTZXRQcm9wKFBfV0VBUE9OX1RZUEUsIFdUX1NUQUZGKTsKKyAgIFNldFByb3AoUF9TSVpFLCAxMjApOworICAgU2V0UHJvcChQX0RBTV9UWVBFLCBEVF9CTFVER0VPTik7CisgICBTZXRQcm9wKFBfTlJfSEFORFMsIDEpOworICAgU2V0UHJvcChQX1dDLCAxMjApOworICAgU2V0UHJvcChQX1ZBTFVFLCAzMDApOworICAgU2V0UHJvcChQX05PQlVZLCAxKTsKKyAgIFNldFByb3AoUF9NQVRFUklBTCwgTUFUX01JU0NfV09PRCk7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvb2JqL3Rhcm56YXViZXIuYyBiL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9vYmovdGFybnphdWJlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMjY0OTQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvb2JqL3Rhcm56YXViZXIuYwpAQCAtMCwwICsxLDc4IEBACisvLyAoYykgMjAwMyBieSBQYWRyZWljIChQYWRyZWljQG1nLm11ZC5kZSkKKy8vIERhcyBPYmpla3QgcmVhbGlzaWVydCBlaW5lbiBUYXJuemF1YmVyLCBhZWhubGljaAorLy8gZGVtIFRhcm5oZWxtLiBKZWRvY2ggb2huZSBTaGFkb3cgdW5kIG51ciBhdWYgZGllCisvLyBSYXNzZSBiZXNjaHJhZW5rdC4KKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKworaW5oZXJpdCAiL3N0ZC90aGluZyI7CisKK3N0YXRpYyBzdHJpbmcgcmFjZTsKKworY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX1NIT1JULCAwKTsKKyAgU2V0UHJvcChQX0xPTkcsICJUYXJuemF1YmVyIik7CisgIFNldFByb3AoUF9OQU1FLCAiVGFybnphdWJlciIpOworICBTZXRQcm9wKFBfSU5WSVMsIDEpOworICBTZXRQcm9wKFBfR0VOREVSLCBNQUxFKTsKKyAgU2V0UHJvcChQX1ZBTFVFLCAgMCk7CisgIFNldFByb3AoUF9OT0dFVCwgMSk7CisgIFNldFByb3AoUF9XRUlHSFQsIDApOworICBTZXQoUF9ERUZFTkRfRlVOQywgTUUpOworICBBZGRJZCgiXG50YXJuemF1YmVyIik7Cit9CisKKy8vIGRpZSBOUENzIGltIFphdWJlcndhbGQgZHVyY2hzY2hhdWVuIGRlbiBaYXViZXIuLi4gOm8pCitzdHJpbmcgX3F1ZXJ5X3JhY2UoKQoreworICAgaWYgKHByZXZpb3VzX29iamVjdCgxKSAmJiBnZXR1aWQocHJldmlvdXNfb2JqZWN0KDEpKT09Z2V0dWlkKCkpCisgICAgICByZXR1cm4gcHJldmlvdXNfb2JqZWN0KCktPl9xdWVyeV9yYWNlKCl8fHJhY2U7CisgICByZXR1cm4gIkR1bmtlbGVsZiI7Cit9CisKK3ZvaWQgSW5pdGlhbGl6ZShvYmplY3QgcGwpCit7CisgICBvYmplY3QgKmFybW91cnM7CisgICBwbC0+U2V0KFBfUkFDRSwgIydfcXVlcnlfcmFjZSwgRl9RVUVSWV9NRVRIT0QpOworICAgYXJtb3Vycz0ocGwtPlF1ZXJ5UHJvcChQX0FSTU9VUlMpKTsKKyAgIGlmIChtZW1iZXIoYXJtb3VycywgTUUpPj0wKSByZXR1cm4gMDsKKyAgIHBsLT5TZXRQcm9wKFBfQVJNT1VSUywgYXJtb3VycysoeyBNRSB9KSk7CisgICByYWNlPXBsLT5RdWVyeShQX1JBQ0UpOworfQorCitpbnQgUXVlcnlEZWZlbmQoc3RyaW5nICpkdHlwLCBtaXhlZCBzcGVsbCwgb2JqZWN0IGVuZW15KQoreworICBtaXhlZCBhbTsKKyAgLy8gbm9jaCBlaW4gcGFhciBwYXJhbm9pZGUgU2ljaGVyaGVpdHNhYmZyYWdlbi4uLiA6bykKKyAgaWYgKCFwcmV2aW91c19vYmplY3QoKSB8fAorICAgICAgIXBvaW50ZXJwKGFtPXByZXZpb3VzX29iamVjdCgpLT5RdWVyeVByb3AoUF9BUk1PVVJTKSkgfHwKKyAgICAgIG1lbWJlcihhbSwgTUUpPT0tMSkgcmV0dXJuIDA7CisgIHRlbGxfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpLCAiRGVpbiBUYXJuemF1YmVyIGxvZXN0IHNpY2ggYXVmLlxuIik7CisgIHJlbW92ZSgpOworfQorCitpbnQgRGVmZW5kRnVuYyhzdHJpbmcgKmR0eXAsIG1peGVkIHNwZWxsLCBvYmplY3QgZW5lbXkpCit7CisgICByZXR1cm4gUXVlcnlEZWZlbmQoZHR5cCwgc3BlbGwsIGVuZW15KTsKK30KKwordmFyYXJncyBpbnQgbW92ZShtaXhlZCBkZXN0LCBpbnQgbWV0aG9kKQorLy8gYmVpbSBUb2Qgc29sbCBzaWNoIGRlciBaYXViZXIgZW50ZmVybmVuIHVuZCBhdWNoIG5pcmdlbmRzIHJ1bWZsaWVnZW4KK3sKKyAgIGludCByZXM7CisgICByZXM9KGludCk6Om1vdmUoZGVzdCwgbWV0aG9kKTsKKyAgIGlmICghbGl2aW5nKGVudmlyb25tZW50KCkpKSByZW1vdmUoKTsKKyAgIHJldHVybiByZXM7Cit9CisKK3ZhcmFyZ3MgaW50IHJlbW92ZShpbnQgc2lsZW50KQoreworICBpZiAobGl2aW5nKGVudmlyb25tZW50KCkpKSBlbnZpcm9ubWVudCgpLT5TZXQoUF9SQUNFLDAsRl9RVUVSWV9NRVRIT0QpOworICByZXR1cm4gKGludCk6OnJlbW92ZShzaWxlbnQpOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS96YXViZXJ3YWxkL29iai96YXViZXJzdGFiLmMgYi9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvb2JqL3phdWJlcnN0YWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTAxZmE2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS96YXViZXJ3YWxkL29iai96YXViZXJzdGFiLmMKQEAgLTAsMCArMSwzNiBAQAorLy8gKGMpIGJ5IFBhZHJlaWMgKFBhZHJlaWNAbWcubXVkLmRlKQorCitpbmhlcml0ICJzdGQvd2VhcG9uIjsKKworI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisjaW5jbHVkZSA8Y29tYmF0Lmg+CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgIDo6Y3JlYXRlKCk7CisgICBTZXRQcm9wKFBfU0hPUlQsICJFaW4gWmF1YmVyc3RhYiIpOworICAgU2V0UHJvcChQX05BTUUsICJaYXViZXJzdGFiIik7CisgICBTZXRQcm9wKFBfR0VOREVSLCBNQUxFKTsKKyAgIFNldFByb3AoUF9MT05HLAorICAgICAiRGllcyB3YXIgZWlubWFsIGRlciBaYXViZXJzdGFiIGVpbmVyIFdhbGRmZWUgYXVzIGRlbSBaYXViZXJ3YWxkLiBJbiBkZW0gU3RhYlxuIgorICAgICsibGllZ3Qgc2ljaGVybGljaCBub2NoIGVpbmUgZ3Jvc3NlIE1hZ2llIHZlcmJvcmdlbiwgZG9jaCBudXR6ZW4ga2FubnN0IER1IHNpZVxuIgorICAgICsibmljaHQuXG4iKTsKKyAgIEFkZElkKCh7InN0YWIiLCAiemF1YmVyc3RhYiJ9KSk7CisgICBTZXRQcm9wKFBfV0VBUE9OX1RZUEUsIFdUX0NMVUIpOworICAgU2V0UHJvcChQX0RBTV9UWVBFLCAoeyBEVF9NQUdJQywgRFRfQkxVREdFT04gfSkgKTsKKyAgIFNldFByb3AoUF9OUl9IQU5EUywgMSk7CisgICBTZXRQcm9wKFBfV0MsIDE0MCk7CisgICBTZXRQcm9wKFBfVkFMVUUsIDgwMCk7CisgICBTZXRQcm9wKFBfTk9CVVksIDEpOworICAgU2V0UHJvcChQX0hJVF9GVU5DLCBNRSk7CisgICBTZXRQcm9wKFBfTUFURVJJQUwsICh7IE1BVF9NSVNDX01BR0lDLCBNQVRfTUlTQ19XT09EIH0pICk7Cit9CisKK2ludCBIaXRGdW5jKG9iamVjdCBlbmVteSkKK3sKKyAgICBvYmplY3Qgb2I7CisgICAgb2I9UXVlcnlQcm9wKFBfV0lFTERFRCk7CisgICAgaWYgKG9iICYmICFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iKSAmJiBnZXR1aWQob2IpPT1nZXR1aWQoKSAmJgorICAgICAgICBvYi0+UXVlcnlQcm9wKFBfUkFDRSk9PSJGZWUiKSByZXR1cm4gMTAwK3JhbmRvbSgzMDApOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS96YXViZXJ3YWxkL3Jvb20vZWluZ2FuZy5jIGIvZG9jL2JlaXNwaWVsZS96YXViZXJ3YWxkL3Jvb20vZWluZ2FuZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1OGEwNWUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvcm9vbS9laW5nYW5nLmMKQEAgLTAsMCArMSw0OCBAQAorLy8gKGMpIGJ5IFBhZHJlaWMgKFBhZHJlaWNAbWcubXVkLmRlKQorCisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKworaW5oZXJpdCBST09NKCJzdGRyb29tIik7CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgIDo6Y3JlYXRlKCk7CisgICBTZXRQcm9wKFBfSU5ET09SUywgMCk7CisgICBTZXRQcm9wKFBfTElHSFQsIDEpOworICAgU2V0UHJvcChQX0lOVF9TSE9SVCwgIkF1ZiBlaW5lbSBrbGVpbmVuIFdhbGR3ZWciKTsKKyAgIFNldFByb3AoUF9JTlRfTE9ORywKKyAgICAgIkR1IHN0ZWhzdCBhdWYgZWluZW0ga2xlaW5lbiBXYWxkd2VnIGRlciBuYWNoIFdlc3RlbiBoaW4gdGllZmVyIGluIGRlbiBXYWxkXG4iCisgICAgKyJoaW5laW4gZnVlaHJ0LiBOYWNoIE9zdGVuIGthbm5zdCBEdSBqZWRvY2ggYXVjaCB3aWVkZXIgenVydWVjayB6dXIgS3JldXp1bmdcbiIKKyAgICArImdlbGFuZ2VuLiBBbGxlcyBpc3QgaGllciByZWNodCBkdWVzdGVyLCBkZW5uIGRhcyBad2VpZ2RhY2ggZGVyIEJhZXVtZSBsYWVzc3RcbiIKKyAgICArImthdW0gbm9jaCBTb25uZW5saWNodCBoaW5kdXJjaC5cbiIpOworICAgQWRkRGV0YWlsKCJ3YWxkIiwgUXVlcnlQcm9wKFBfSU5UX0xPTkcpKTsKKyAgIEFkZERldGFpbCgoeyJib2RlbiIsICJ3ZWciLCAiZXJkZSIsICJ3YWxkd2VnIn0pLAorICAgICAiRGVyIFdlZyB3dXJkZSBuaWNodCByaWNodGlnIGFuZ2VsZWd0IHVuZCBlcyBzY2hlaW50IGF1Y2ggbmljaHQgc28sIGFscyB3dWVyZGVcbiIKKyAgICArImlobiBqZW1hbmQgcGZsZWdlbi4gRGVubm9jaCB3YWNoc2VuIGtlaW5lcmxlaSBQZmxhbnplbiBhdWYgZGVtIFdlZyB1bmQgRHVcbiIKKyAgICArImdlaHN0IGF1ZiBkZXIgYmxvc3NlbiBFcmRlLlxuIik7CisgICBBZGREZXRhaWwoKHsid2VncmFuZCIsICJ3ZWdlc3JhbmQiLCAiZ2VzdHJ1ZXBwIn0pLAorICAgICAiQW0gV2VnZXNyYW5kIHdhY2hzZW4gZWluaWdlIGFsdGUgQmFldW1lIHVuZCBhbmRlcmUgUGZsYW56ZW4gZGllIHp1c2FtbWVuIGVpblxuIgorICAgICsidW5kdXJjaGRyaW5nbGljaGVzIEdlc3RydWVwcCBlcmdlYmVuLiBEaXIgYmxlaWJ0IGFsc28gbmljaHRzIHdlaXRlciB1ZWJyaWcsIGFsc1xuIgorICAgICsibnVyIGRlbiBXZWcgbmFjaCBXZXN0ZW4gb2RlciBuYWNoIE9zdGVuIHp1IGZvbGdlbi5cbiIpOworICAgQWRkRGV0YWlsKCh7ImJhZXVtZSIsICJhbHRlciJ9KSwKKyAgICAgIkRhcyBBbHRlciBkZXIgQmFldW1lIGxhZXNzdCBzaWNoIG5pY2h0IGdlbmF1IGJlc3RpbW1lbiwgc2llIHNjaGVpbmVuIGplZG9jaFxuIgorICAgICsic2VociBzZWhyIGFsdCB6dSBzZWluLiBJbiBlaW5lbSBkZXIgQmFldW1lIHNpZWhzdCBEdSBlaW4ga2xlaW5lcyBCYXVtaGF1cy5cbiIpOworICAgQWRkRGV0YWlsKCh7InBmbGFuemVuIiwgImZhcm5lIiwgInN0cmFldWNoZXIifSksCisgICAgICJWZXJzY2hpZWRlbmUgU3RyYWV1Y2hlciwgRmFybmUgdW5kIHphaGxyZWljaGUgQmFldW1lIHppZXJlbiBkZW4gV2VnZXNyYW5kLlxuIgorICAgICsiRHUgZW50ZGVja3N0IGRhYmVpIGFiZXIgbmljaHRzIHdlaXRlciBhdWZmYWVsbGlnZXMuXG4iKTsKKyAgIEFkZERldGFpbCgoeyJvc3RlbiIsICJrcmV1enVuZyJ9KSwKKyAgICAgIldlbm4gRHUgZGVtIFdlZyBuYWNoIE9zdGVuIGhpbiBmb2xnc3QsIGthbm5zdCBEdSB6dXJ1ZWNrIHp1ciBLcmV1enVuZyBnZWxhbmdlbi5cbiIpOworICAgQWRkRGV0YWlsKCh7Inp3ZWlnZSIsICJ6d2VpZ2RhY2giLCAic29ubmVubGljaHQiLCAibGljaHQiLCAiZGFjaCIsICJ3ZXN0ZW4ifSksCisgICAgICJEYXMgWndlaWdkYWNoIGRlciBCYWV1bWUgbGFlc3N0IGhpZXIgc28gd2VuaWcgU29ubmVubGljaHQgaGluZHVyY2gsIGRhcyBEdSBlaW5cbiIKKyAgICArIlN0dWVjayB3ZWl0ZXIgaW0gV2VzdGVuIGthdW0gbm9jaCBvaG5lIGVpZ2VuZSBMaWNodHF1ZWxsZSB3ZWl0ZXJrb21tZW4ga2FubnN0LlxuIgorICAgICsiRHUgc29sbHRlc3QgRGljaCBhbHNvIGJlc3NlciBuaWNodCBvaG5lIGVpZ2VuZSBMaWNodHF1ZWxsZSB0aWVmZXIgaW4gZGVuIFdhbGRcbiIKKyAgICArImhpbmVpbiB3YWdlbi5cbiIpOworICAgQWRkRGV0YWlsKCh7ImZhY2tlbCIsICJsYW1wZSIsICJsaWNodCIsICJsaWNodHF1ZWxsZSIsICJsaWNodHNwcnVjaCJ9KSwKKyAgICAgIldlbm4gRHUgYmVhYnNpY2h0aWdzdCB3ZWl0ZXIgbmFjaCBXZXN0ZW4genUgZ2Vobiwgc29sbHRlc3QgRHUgZWluZSBGYWNrZWwsXG4iCisgICAgKyJlaW5lIExhbXBlIG9kZXIgc29uc3QgaXJnZW5kZWluZSBMaWNodHF1ZWxsZSBtaXRuZWhlbW4uIFp1bWluZGVzdCBpc3QgZXMgZG9ydFxuIgorICAgICsic2VociBkdW5rZWwuXG4iKTsKKyAgIEFkZERldGFpbCgoeyJ3b2xrZSIsICJ3b2xrZW4iLCAic29ubmUiLCAiaGltbWVsIn0pLAorICAgICAiRGVyIEhpbW1lbCBpc3QgZHVyY2ggZGFzIGRpY2h0ZSBEYWNoIGRlciBad2VpZ2UsIG5pY2h0IG1laHIgenUgc2Vobi5cbiIpOworICAgQWRkRXhpdCgib3N0ZW4iLCAiL2QvdW50ZXJ3ZWx0L3JhZXVtZS93YWxkNCIpOworICAgQWRkRXhpdCgid2VzdGVuIiwgUk9PTSgid2VnMSIpKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9yb29tL2h1ZXR0ZS5jIGIvZG9jL2JlaXNwaWVsZS96YXViZXJ3YWxkL3Jvb20vaHVldHRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE5YTI3MgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9yb29tL2h1ZXR0ZS5jCkBAIC0wLDAgKzEsMTI5IEBACisvLyAoYykgYnkgUGFkcmVpYyAoUGFkcmVpY0BtZy5tdWQuZGUpCisKKy8vIEVpbiBSYXVtIHp1bSBzY2hvZW5lbiBlaW5iaW5kZW4gZWluZXMgU2VoZXJoYXVzZXMgaW4gZGVuIFdhbGQKKworI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisjaW5jbHVkZSA8bW92aW5nLmg+CisKK2luaGVyaXQgUk9PTSgic3Rkcm9vbSIpOworCit2b2lkIGNyZWF0ZSgpCit7CisgICA6OmNyZWF0ZSgpOworICAgU2V0UHJvcChQX0lORE9PUlMsIDEpOworICAgU2V0UHJvcChQX0xJR0hULCAxKTsKKyAgIFNldFByb3AoUF9JTlRfU0hPUlQsICJNaXR0ZW4gaW0gV2FsZCIpOworICAgU2V0UHJvcChQX0lOVF9MT05HLAorICAgICAiRHUgc3RlaHN0IG51biBpbm1pdHRlbiBkZXMgWmF1YmVyd2FsZHMgZ2VuYXUgdm9yIGVpbmVyIHJpZXNpZ2VuIEJ1Y2hlIHVudGVyXG4iCisgICAgKyJkZXIgamVtYW5kIGVpbmUga2xlaW5lIEh1ZXR0ZSBnZWJhdXQgaGF0LiBSaW5nc3VtaGVyIHN0ZWhlbiB3ZWl0ZXJlIEJ1ZXNjaGVcbiIKKyAgICArInVuZCBCYWV1bWUgdW5kIGJpbGRlbiBlaW5lIGRpY2h0ZSBWZWdldGF0aW9uLCBkb2NoIGltIFZlcmdsZWljaCB6dSBkaWVzZXJcbiIKKyAgICArInJpZXNpZ2VuIEJ1Y2hlIHdpcmt0IGFsbGVzIGFuZGVyZSB3aXJrbGljaCBtaWNrcmlnLiBEdXJjaCBkYXMgZGljaHRlXG4iCisgICAgKyJCbGFldHRlcmRhY2ggZHJpbmd0IG51ciB3ZW5pZyBMaWNodCB1bmQgc28gd3VuZGVydCBlcyBhdWNoIG5pY2h0IGRhcyBkZXJcbiIKKyAgICArIkJvZGVuIGhpZXIgcmVsYXRpdiBmZXVjaHQgaXN0IHVuZCBkaWUgUGZsYW56ZW4gc28gZ3V0IGdlZGVpaGVuIGtvZW5uZW4uIE5hY2hcbiIKKyAgICArIk5vcmRlbiBmdWVocnQgYWxzIGVpbnppZ2VyIEF1c2dhbmcgZWluIGtsZWluZXIgVHJhbXBlbHBmYWQgenVyIExpY2h0dW5nLlxuIik7CisgICBBZGREZXRhaWwoKHsibmF0dXIiLCAid2FsZCIsICJ6YXViZXJ3YWxkIn0pLCBRdWVyeVByb3AoUF9JTlRfTE9ORykpOworICAgQWRkRGV0YWlsKCh7ImJ1ZXNjaGUiLCAiYmFldW1lIiwgInZlZ2V0YXRpb24iLCAicGZsYW56ZW4iLCAiZmFybmUifSksCisgICAgICJSaW5ncyB1bSBkaWUgSHVldHRlIGhlcnNjaHQgZWluZSB3aWxkZSBWZWdldGF0aW9uLiBFcyB3YWNoc2VuIHZlcnNjaGllZGVuc3RlXG4iCisgICAgKyJGYXJuZSB1bmQgQnVlc2NoZSB1bmQgZWluZSB2aWVsZmFsdCB2ZXJzY2hpZWRlbnN0ZXIgQmFldW1lLiBBbGxlcyB6dXNhbW1lblxuIgorICAgICsiYmlsZGV0IGVpbmUgZmFzdCB1bmR1cmNoZHJpbmdsaWNoZSBWZWdldGF0aW9uLlxuIik7CisgICBBZGREZXRhaWwoKHsibGljaHQiLCAiYmxhZXR0ZXJkYWNoIn0pLAorICAgICAiRHVyY2ggZGFzIHJlbGF0aXYgZGljaHRlIEJsYWV0dGVyZGFjaCBkZXIgaG9oZW4gQmFldW1lLCBmYWVsbHQgZWlnZW50bGljaCBudXJcbiIKKyAgICArInNlaHIgd2VuaWcgTGljaHQgZHVyY2ggdW5kIHNvIGlzdCBlcyBoaWVyIGRvY2ggc2Nob24gcmVsYXRpdiBkdWVzdGVyLCBhdWNoXG4iCisgICAgKyJ3ZW5uIG1hbiBub2NoIG5pY2h0IHVuYmVkaW5ndCBlaW5lIGVpZ2VuZSBMaWNodHF1ZWxsZSBicmF1Y2h0IHVtIGV0d2FzIHNlaGVuXG4iCisgICAgKyJ6dSBrb2VubmVuLlxuIik7CisgICBBZGREZXRhaWwoImxpY2h0cXVlbGxlIiwKKyAgICAgIkVpbmUgZWlnZW5lIExpY2h0cXVlbGxlIGlzdCBoaWVyIG5pY2h0IHVuYmVkaW5ndCBlcmZvcmRlcmxpY2gsIGRhIGRhbm4gZG9jaFxuIgorICAgICsibm9jaCBnZW51ZWdlbmQgTGljaHQgZHVyY2ggZGFzIEJsYWV0dGVyZGFjaCBkdXJjaGRyaW5ndC5cbiIpOworICAgQWRkRGV0YWlsKCJoaW1tZWwiLAorICAgICAiRXMgc2NoZWludCBEaXIgYWxzIHd1ZXJkZSBkaWUgU29ubmUgZ2VyYWRlIHNjaGVpbmVuLCBhdWNoIHdlbiBkYXMgZGljaHRlXG4iCisgICAgKyJCbGFldHRlcmRhY2ggZGllIG1laXN0ZW4gU29ubmVuc3RyYWhsZW4gbmljaHQgaGluZHVyY2ggbGFlc3N0LlxuIik7CisgICBBZGREZXRhaWwoImJvZGVuIiwKKyAgICAgIkRlciBCb2RlbiBpc3QgaGllciBlaWdlbnRsaWNoLCBtaXQgQXVzbmFobWUgZGVzIFRyYW1wZWxwZmFkcyBuYXR1ZXJsaWNoLFxuIgorICAgICsiemllbWxpY2ggenVnZXdhY2hzZW4gdW5kIHZvbiB6YWhscmVpY2hlbiBQZmxhbnplbiB1ZWJlcnd1Y2hlcnQuXG4iKTsKKyAgIEFkZERldGFpbCgiZXJkZSIsCisgICAgICJEaWUgRXJkZSBpc3QgaGllciB1ZWJlcmFsbCBlaW4gd2VuaWcgbGVobWlnLCBhYmVyIHdpcmtsaWNoIGJlc29uZGVyZXMga2FubnN0XG4iCisgICAgKyJEdSBhbiBkZXIgRXJkZSBuaWNodCBlbnRkZWNrZW4uXG4iKTsKKyAgIEFkZERldGFpbCgoeyJ0cmFtcGVscGZhZCIsICJhdXNnYW5nIiwgInBmYWQifSksCisgICAgICJEZXIgVHJhbXBlbHBmYWQgc2NoZWludCBkb2NoIHJlbGF0aXYgb2Z0IGJlbnV0enQgenUgd2VyZGVuLCBkZW5uIGRpZSBFcmRlIGlzdFxuIgorICAgICsiZmFzdCB2b2VsbGlnIGJsb3NzIGdlbGVndCB1bmQgZGllIHdlbmlnZW4gUGZsYW56ZW4gZGllIGRhbm4gZG9jaCB2ZXJzdWNoZW4gaWhuXG4iCisgICAgKyJ6dSBiZXdhY2hzZW4gc2luZCBmYXN0IGFsbGUgbmllZGVyZ2V0cmFtcGVsdC5cbiIpOworICAgQWRkRGV0YWlsKCh7ImxpY2h0dW5nIiwgIm5vcmRlbiJ9KSwKKyAgICAgIlZpZWxsZWljaHQgc29sbHRlc3QgRHUgZWluZmFjaCBkZW0gVHJhbXBlbHBmYWQgbmFjaCBOb3JkZW4gZm9sZ2VuIHVuZCBEaXIgZGllXG4iCisgICAgKyJMaWNodHVuZyBlaW5mYWNoIGF1cyBkZXIgTmFlaGUgYW5zY2hhdWVuLlxuIik7CisgICBBZGREZXRhaWwoKHsiYnVjaGUiLCAicmllc2lnZSBidWNoZSJ9KSwKKyAgICAgIkVpY2hlbiBzb2xsc3QgRHUgd2VpY2hlbiwgQnVjaGVuIHNvbGxzdCBEdSBzdWNoZW4hXG4iKTsKKyAgIEFkZERldGFpbCgoeyJlaWNoZSIsICJlaWNoZW4ifSksCisgICAgICJEdSBzaWVoc3QgendhciBhbGxlcyBtb2VnbGljaGUgYW4gQmFldW1lbiBoaWVyLCBhYmVyIEVpY2hlbiBiZWZpbmRlbiBzaWNoIHp1bVxuIgorICAgICsiR2x1ZWNrIG5pY2h0IGRhZHJ1bnRlci5cbiIpOworICAgQWRkRGV0YWlsKCh7ImdsdWVjayIsICJmcmFnZSJ9KSwKKyAgICAgIk9iIGVzIHNvZXR3YXMgd2llIEdsdWVjayB1ZWJlcmhhdXB0IGdpYnQsIGlzdCB3b2hsIGVoZXIgZWluZSBwaGlsb3NvcGhpc2NoZVxuIgorICAgICsiRnJhZ2UgdW5kIGV0d2FzIHdvIG1hbiBzdHVuZGVubGFuZyBkcnVlYmVyIGRpc2t1dGllcmVuIGtvZW5udGUuIEZ1ZXIgZGVuXG4iCisgICAgKyJNb21lbnQgYmVzY2hsaWVzc3QgRHUgamVkZW5mYWxscyBsaWViZXIgZGllIHNjaG9lbmUgTmF0dXIgenUgZ2VuaWVzc2VuIHVuZFxuIgorICAgICsiZGVtIHp3aXRzY2hlcm4gZGVyIFZvZWdlbCB6dSBsYXVzY2hlbiwgYWxzIERpY2ggbWl0IHNvZXR3YXMgenUgYmVzY2hhZWZ0aWdlbi5cbiIpOworICAgQWRkRGV0YWlsKCh7InZvZWdlbCIsICJ6aXBmZWwiLCAiYmF1bXppcGZlbCIsICJ6aXBmZWwgZGVyIGJhZXVtZSJ9KSwKKyAgICAgIk9iZW4gaW4gZGVuIFppcGZlbG4gZGVyIEJhZXVtZSBrYW5uc3QgRHUgd2FnZSBlaW5pZ2UgVm9lZ2VsIGVya2VubmVuLCBkb2NoIHVtXG4iCisgICAgKyJkaWVzZSBuYWVoZXIgc3BlemlmaXppZXJlbiB6dSBrb2VubmVuLCBzaW5kIGRpZXNlIGRhbm4gZG9jaCB6dSB3ZWl0IHdlZy5cbiIpOworICAgQWRkRGV0YWlsKCJtb21lbnQiLAorICAgICAiR2VuaWVzc2UgZGVuIE1vbWVudCB1bmQgbGViZSBEZWluIExlYmVuIVxuIik7CisgICBBZGREZXRhaWwoInJ1aGUiLAorICAgICAiRGllIFJ1aGUgd2lyZCBoaWVyIHVuZCBkYSBsZWRpZ2xpY2ggdm9tIHp3aXRzY2hlcm4gZWluaWdlciBWb2VnZWwgdW50ZXJicm9jaGVuLlxuIik7CisgICBBZGRTcGVjaWFsRGV0YWlsKCh7Imh1ZXR0ZSJ9KSwgImRldF9odWV0dGUiKTsKKyAgIEFkZFNvdW5kcyhTRU5TRV9ERUZBVUxULAorICAgICAiRXMgaXN0IGhpZXIgd2lya2xpY2ggaGVycmxpY2ggcnVoaWcgdW5kIG51ciBoaWVyIHVuZCBkYSBob2Vyc3QgRHUgZGFzXG4iCisgICAgKyJ6d2l0c2NoZXJuIGVpbmlnZXIgVm9lZ2VsLiBOYXR1ciBwdXIuXG4iKTsKKyAgIEFkZFNvdW5kcygoeyJ2b2VnZWwiLCAiendpdHNjaGVybiIsICJ2b2VnZWwgendpdHNjaGVybiJ9KSwKKyAgICAgIkR1IGxhdXNjaHN0IGRlbSB6d2l0c2NoZXJuIGRlciBWb2VnZWwgdW5kIGdlbmllc3N0IGRpZSBoaW1tbGlzY2hlIFJ1aGUuXG4iKTsKKyAgIEFkZENtZCgoeyJzdWNoIiwgInN1Y2hlIn0pLCAiY21kX3N1Y2hlbiIpOworICAgQWRkQ21kKCh7Imdlbmllc3MiLCAiZ2VuaWVzc2UifSksICJjbWRfZ2VuaWVzc2VuIik7CisgICBBZGRDbWQoKHsibGViIiwgImxlYmUifSksICJjbWRfbGViZW4iKTsKKyAgIEFkZENtZCgoeyJrbGV0dGVyIiwgImtsZXR0ZXJlIn0pLCAiY21kX2tsZXR0ZXJuIik7CisgICBBZGRFeGl0KCJub3JkZW4iLCBST09NKCJsaWNodHVuZ3MiKSk7Cit9CisKK3N0YXRpYyBzdHJpbmcgZGV0X2h1ZXR0ZSgpCisvLyBMYW5nYmVzY2hyZWlidW5nIG5pY2h0IGZlc3Qgc2V0emVuLCBkYW1pdCBkZXIgU3BpZWxlciBzaWUgc2VsYnN0CisvLyBhZW5kZXJuIGthbm4uCit7CisgICBvYmplY3Qgb2I7CisgICBpZiAob2I9cHJlc2VudCgiXG5tb3JnZW5lc2hhdXMiLCBNRSkpCisgICAgICByZXR1cm4gb2ItPmxvbmcoKTsKK30KKworc3RhdGljIGludCBjbWRfc3VjaGVuKHN0cmluZyBzdHIpCit7CisgICBub3RpZnlfZmFpbCgiV0FTIG1vZWNodGVzdCBEdSBzdWNoZW4/XG4iKTsKKyAgIGlmIChzdHIhPSJidWNoZW4iICYmIHN0ciE9ImJ1Y2hlIikgcmV0dXJuIDA7CisgICB3cml0ZSgiRHUgYnJhdWNoc3QgbmljaHQgbGFuZ2Ugc3VjaGVuIHVuZCBzY2hvbiBlbnRkZWNrdCBEdSBlaW5lIHJpZXNpZ2UgQnVjaGUgdm9yXG4iCisgICAgICAgICsiRGlyLCBhYmVyIGVpZ2VudGxpY2ggd2FlcmUgZXMgd29obCBhdWNoIGVoZXIgZXJzdGF1bmxpY2gsIHdlbm4gRHUgZGllc2VcbiIKKyAgICAgICAgKyJyaWVzaWdlIEJ1Y2hlIGRpcmVrdCB2b3IgRGVpbmVyIE5hc2UgdWViZXJzZWhlbiB3dWVyZGVzdCA6KS5cbiIpOworICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY21kX2dlbmllc3NlbihzdHJpbmcgc3RyKQoreworICAgbm90aWZ5X2ZhaWwoIldBUyBtb2VjaHRlc3QgRHUgZ2VuaWVzc2VuP1xuIik7CisgICBpZiAoc3RyIT0ibW9tZW50IiAmJiBzdHIhPSJkZW4gbW9tZW50IiAmJiBzdHIhPSJydWhlIikgcmV0dXJuIDA7CisgICB3cml0ZSgiRHUgaGFlbHRzdCBlaW5lbiBNb21lbnQgaW5uZSB1bmQgZ2VuaWVzc3QgZGllIGhpbW1saXNjaGUgUnVoZSwgZGllIG51ciBkdXJjaFxuIgorICAgICAgICArImRhcyB6d2l0c2NoZXJuIGVpbmlnZXIgVm9lZ2VsIGR1cmNoYnJvY2hlbiBhYmVyIG5pY2h0IGdlc3RvZXJ0IHdpcmQuXG4iKTsKKyAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNtZF9sZWJlbihzdHJpbmcgc3RyKQoreworICAgbm90aWZ5X2ZhaWwoIldBUyBtb2VjaHRlc3QgRHUgbGViZW4/XG4iKTsKKyAgIGlmIChzdHIhPSJsZWJlbiIgJiYgc3RyIT0ibWVpbiBsZWJlbiIgJiYgc3RyIT0iZGVpbiBsZWJlbiIpIHJldHVybiAwOworICAgd3JpdGUoIk51biwgd2VubiBkaWUgV2VsdCBzbyBlaW5mYWNoIHdhZXJlIGRhcyBEdSBtaXQgZWluZW0gc2ltcGxlbiBLb21tYW5kbyBEZWluXG4iCisgICAgICAgICsiZ2FuemVzIExlYmVuIHN0ZXVlcm4ga29lbm50ZXN0LCBkYW5uIHdhZXIgZGllIFdlbHQgZG9jaCB3aXJrbGljaCBsYW5nd2VpbGlnLFxuIgorICAgICAgICArIm9kZXI/IEljaCB3aWxsIGRvY2ggc3RhcmsgaG9mZmVuLCBkYXMgZXMgc29vbyB3ZWl0IG5vY2ggbmljaHQgYmVpIERpciBpc3QgOikuXG4iKTsKKyAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNtZF9rbGV0dGVybihzdHJpbmcgc3RyKQoreworICAgbm90aWZ5X2ZhaWwoIldPSElOIG9kZXIgV09SQVVGIG1vZWNodGVzdCBEdSBrbGV0dGVybj9cbiIpOworICAgaWYgKG1lbWJlcigoeyJhdWYgYmF1bSIsICJhdWYgYmF1bXppcGZlbCIsICJiYXVtIGhvY2giLAorICAgICAgICAgICAgICAgICJidWNoZSBob2NoIiwgImF1ZiBidWNoZSJ9KSwgc3RyKT09LTEpIHJldHVybiAwOworICAgd3JpdGUoIkR1IHZlcnN1Y2hzdCB2ZXJnZWJsaWNoIGRpZSByaWVzaWdlIEJ1Y2hlIGhvY2h6dWtsZXR0ZXJuLCBkb2NoIGRpZSB1bnRlcmVuXG4iCisgICAgICAgICsiQWVzdGUgaGFlbmdlbiBsZWlkZXIgYmVyZWl0cyB2aWVsIHp1IGhvY2gsIHVtIGRpZXNlIGVya2xpbW1lbiB6dSBrb2VubmVuLlxuIik7CisgICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9yb29tL3NjaHVsZS5jIGIvZG9jL2JlaXNwaWVsZS96YXViZXJ3YWxkL3Jvb20vc2NodWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk3YWNjNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9yb29tL3NjaHVsZS5jCkBAIC0wLDAgKzEsNzggQEAKKy8vIChjKSBieSBQYWRyZWljIChQYWRyZWljQG1nLm11ZC5kZSkKKworI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisKK2luaGVyaXQgUk9PTSgic3Rkcm9vbSIpOworCit2b2lkIGNyZWF0ZSgpCit7CisgICA6OmNyZWF0ZSgpOworICAgU2V0UHJvcChQX0lORE9PUlMsIDApOworICAgU2V0UHJvcChQX0xJR0hULCAxKTsKKyAgIEFkZFNwZWNpYWxEZXRhaWwoKHsicGl4aWVzY2h1bGUiLCAic2NodWxlIiwgInNhbmRwbGF0eiIsICJ3YWxkc2NodWxlIn0pLCAiX3F1ZXJ5X2ludF9sb25nIik7CisgICBBZGREZXRhaWwoKHsic3B1cmVuIiwgImthbXBmcGxhdHoiLCAic2FuZCJ9KSwKKyAgICAgIkRpZSBTcHVyZW4gaW0gU2FuZCBkZXV0ZW4gYXVmIGVpbmVuIGxhZW5nZXJlbiBLYW1wZiBoaW4sIGRlciBoaWVyIGdldG9idFxuIgorICAgICsiaGFiZW4gbXVzcy4gV2VyIGF1Y2ggaW1tZXIgaWhuIHZlcmxvcmVuIGhhdCwgZXIgaGF0IHNpY2ggd2Fja2VyIGdld2VocnQuXG4iKTsKKyAgIEFkZERldGFpbCgid2FsZCIsCisgICAgICJXYXMgbWVpbnN0IER1IGVpZ2VudGxpY2gsIHdvIER1IGdlcmFkIGRpZSBnYW56ZSBaZWl0IHJ1bWxhZXVmc3Q/IE1hY2ggZWluZmFjaFxuIgorICAgICsiZGllIEF1Z2VuIGF1ZiB1bmQgc2NoYXUgRGlyIGFsbGVzIGluIFJ1aGUgYW4uXG4iKTsKKyAgIEFkZERldGFpbCgicnVoZSIsICJJbiBkZXIgUnVoZSBsaWVndCBkaWUgS3JhZnQuLi5cbiIpOworICAgQWRkRGV0YWlsKCh7ImF1Z2VuIiwgImRldGFpbHMiLCAia2FtcGZ6YXViZXIiLCAia29wZiIsICJmcmV1bmQifSksCisgICAgICJOdSB1ZWJlcnRyZWliIG1hbCBuaWNoLCBuaWNodCBqZWRlcyBTdWJzdGFudGl2IHZlcmJpcmd0IHdpcmtsaWNoIGVpblxuIgorICAgICsic2lubnZvbGxlcyBEZXRhaWwuXG4iKTsKKyAgIEFkZERldGFpbCgia3JhZnQiLAorICAgICAiV293ISBEZWluZSBLcmFmdCBpc3QgcGxvZXR6bGljaCBhdWYgMzIgYW5nZXN0aWVnZW4uLi5cbiIKKyAgICArIkRhcyBoYXN0IER1IGpldHp0IGFiZXIgbmljaHQgd2lya2xpY2ggZ2VnbGF1YnQsIG9kZXI/XG4iCisgICAgKyJXaWVzbyB1bnRlcnN1Y2hzdCBEdSBzb2xjaGUgRGV0YWlscyBlaWdlbnRsaWNoP1xuIik7CisgICBBZGRTcGVjaWFsRGV0YWlsKCJ6ZWl0IiwgImRldF96ZWl0Iik7CisgICBBZGREZXRhaWwoKHsicGl4aWVzIiwgImJsb2Vkc2lubiIsICJ1bmZ1ZyIsICJ6YXViZXJ3ZXNlbiIsICJzdHJlaWNoIn0pLCAKKyAgICAgIlBpeGllcyBzaW5kIGtsZWluZSBaYXViZXJ3ZXNlbiwgZGllIG5pY2h0cyBhbHMgVW5mdWcgaW0gS29wZiBoYWJlbi4gV2llXG4iCisgICAgKyJuaWVtYW5kIHNvbnN0IG51dHplbiBzaWUgaWhyZSBtYWdpc2NoZW4gRmFlaGlna2VpdGVuIG5pY2h0IHVtIGplbWFuZGVuIHp1XG4iCisgICAgKyJoZWlsZW4gb2RlciBmdWVyIEthbXBmemF1YmVyLiBOZWluIHNpZSBudXR6ZW4gc2llIHVtIGplbWFuZGVuIHp1IEFlcmdlcm5cbiIKKyAgICArIm9kZXIgaWhtIGVpbmVuIFN0cmVpY2ggenUgc3BpZWxlbi4gRWluZW4gUGl4aWUgenVtIEZyZXVuZCB6dSBoYWJlbiwga2FublxuIgorICAgICsic2ljaGVyIHNlaHIgdW50ZXJoYWx0c2FtIHNlaW4sIGF1ZiBkaWUgRGF1ZXIgYWJlciB3b2hsIGF1Y2ggemllbWxpY2hcbiIKKyAgICArImFuc3RyZW5nZW5kLlxuIik7CisgICBBZGRTcGVjaWFsRGV0YWlsKCJib2RlbiIsICJkZXRfYm9kZW4iKTsKKyAgIEFkZERldGFpbCgiaGFsYmtyZWlzIiwKKyAgICAgIkVpbmlnZSBQaXhpZXMgc2l0emVuIGltIEhhbGJrcmVpcyB1bSBBcmluYSBoZXJ1bSB1bmQgaG9lcmVuIGdlc3Bhbm50IHp1LCB3aWVcbiIKKyAgICArInNpZSBpaG5lbiBlaW5lbiBzcGFubmVuZGUgR2VzY2hpY2h0ZSBlcnphZWhsdC5cbiIpOworICAgQWRkRGV0YWlsKCh7Imdlc2NoaWNodGVuIiwgInNwcmFjaGUifSksCisgICAgICJXZW5uIEFyaW5hIGRvY2ggYmxvc3MgaW4gZWluZXIgU3ByYWNoZSBzcHJlY2hlbiB3dWVyZGUsIERpZSBEdSB2ZXJzdGVoc3QuLi5cbiIKKyAgICArIklocmUgR2VzY2hpY2h0ZW4gaG9lcmVuIHNpY2ggamVkZW5mYWxscyBhdXNzZXJvcmRlbnRsaWNoIHNwYW5uZW5kIGFuLiAqc2V1ZnoqXG4iKTsKKyAgIEFkZERldGFpbCgiaGltbWVsIiwgIkRlciBIaW1tZWwgaXN0IGtsYXIgdW5kIG5haGV6dSB3b2xrZW5mcmVpLlxuIik7CisgICBBZGREZXRhaWwoKHsib3N0ZW4iLCAiYXVzZ2FuZyIsICJsaWNodHVuZyIsICJ3ZWciLCAid2FsZHdlZyJ9KSwKKyAgICAgIkRlciBlaW56aWdlIEF1c2dhbmcgdm9uIGhpZXIsIGlzdCBkZXIga2xlaW5lIFdhbGR3ZWcgaW0gT3N0ZW4gZGVyIHp1cnVlY2tcbiIKKyAgICArInp1ciBncm9zc2VuIExpY2h0dW5nIGZ1ZWhydC5cbiIpOworICAgU2V0UHJvcChQX0lOVF9TSE9SVCwgIkRpZSBQaXhpZXNjaHVsZSIpOworICAgQWRkRXhpdCgib3N0ZW4iLCBST09NKCJsaWNodHVuZ253IikpOworICAgQWRkSXRlbShOUEMoInBpeGllIiksIFJFRlJFU0hfTU9WRV9IT01FKTsKKyAgIEFkZEl0ZW0oTlBDKCJwaXhpZSIpLCBSRUZSRVNIX01PVkVfSE9NRSk7CisgICBBZGRJdGVtKE5QQygicGl4aWUiKSwgUkVGUkVTSF9NT1ZFX0hPTUUpOworICAgQWRkSXRlbShOUEMoImFyaW5hIiksIFJFRlJFU0hfUkVNT1ZFLCAxKTsKK30KKworc3RhdGljIHN0cmluZyBkZXRfYm9kZW4oKQoreworICAgaWYgKHByZXNlbnQoV0FMRElEKCJmZWUiKSwgTUUpKQorICAgICAgcmV0dXJuIEdldERldGFpbCgiaGFsYmtyZWlzIik7CisgICByZXR1cm4gR2V0RGV0YWlsKCJzYW5kIik7Cit9CisKK3N0YXRpYyBzdHJpbmcgZGV0X3plaXQoKQoreyAgcmV0dXJuICJXaXIgaGFiZW4gZ2VuYXUgIitkdGltZSh0aW1lKCkpWzw4Li5dKyIuXG4iOyB9CisKK3N0YXRpYyBzdHJpbmcgX3F1ZXJ5X2ludF9sb25nKCkKK3sKKyAgIGlmIChwcmVzZW50KFdBTERJRCgiZmVlIiksIE1FKSkKKyAgICAgIHJldHVybiAiRHUgYmVmaW5kZXN0IERpY2ggaW4gZGVyIFdhbGRzY2h1bGUgZGVyIFBpeGllcy4gRWluaWdlIFBpeGllcyBzaXR6ZW4gaW1cbiIKKyAgICAgICAgICAgICsiSGFsYmtyZWlzIHVtIGRpZSBXYWxkZmVlIEFyaW5hIHJ1bSB1bmQgaG9lcmVuIGdlc3Bhbm50IGlocmVuIEdlc2NoaWNodGVuIHp1LlxuIgorICAgICAgICAgICAgKyJHZWxlZ2VudGxpY2ggZXJoZWJ0IHNpY2ggQXJpbmEgdW0gbWl0IGVpbmVtIFN0b2NrIGV0d2FzIGluIGRlbiBTYW5kIHp1XG4iCisgICAgICAgICAgICArInplaWNobmVuLCBvZGVyIHVtIGVpbmVuIGRlciBQaXhpZXMgenUgZXJtYWhuZW4gd2VpbCBlciB3aWVkZXIgaXJnZW5kZWluZW5cbiIKKyAgICAgICAgICAgICsidmVycnVlY2t0ZW4gQmxvZWRzaW5uIGdlbWFjaHQgaGF0LiBEYSBzaWNoIHJpbmdzaGVydW0gZGVyIGRpY2h0ZSBXYWxkXG4iCisgICAgICAgICAgICArImFuc2NobGllc3N0LCBpc3QgZGVyIGVpbnppZ2UgQXVzZ2FuZywgZGVyIFdlZyB6dXJ1ZWNrIG5hY2ggT3N0ZW4gYXVmIGRpZVxuIgorICAgICAgICAgICAgKyJncm9zc2UgTGljaHR1bmcuXG4iOworICAgcmV0dXJuICJEdSBzdGVoc3QgYXVmIGVpbmVtIGtsZWluZW4gU2FuZHBsYXR6IG1pdHRlbiBpbSBXYWxkLiBIaWVyIHVuZCBkYSBzaWVoc3QgRHVcbiIKKyAgICAgICAgICsiaW0gU2FuZCBub2NoIGRldXRsaWNoIGRpZSBTcHVyZW4gZWluZXMgS2FtcGZlcy4gVW1nZWJlbiB3aXJkIGRpZXNlciBQbGF0elxuIgorICAgICAgICAgKyJ2b24gZWluZW0gZGljaHRlbiBXYWxkLCBzbyBkYXNzIGRlciBlaW56aWdlIEF1c2dhbmcgZGVyIFdlZyB6dXJ1ZWNrIG5hY2hcbiIKKyAgICAgICAgICsiT3N0ZW4genVyIGdyb3NzZW4gTGljaHR1bmcgaXN0LlxuIjsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9yb29tL3N0ZGxpY2h0dW5nLmMgYi9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvcm9vbS9zdGRsaWNodHVuZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MWVlNmUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvcm9vbS9zdGRsaWNodHVuZy5jCkBAIC0wLDAgKzEsMTU3IEBACisvLyAoYykgYnkgVGhvbWFzIFdpbmhlbGxlciAoUGFkcmVpY0BtZy5tdWQuZGUpCisKKyNpbmNsdWRlICIuLi9maWxlcy5oIgorI2luY2x1ZGUgPG1vdmluZy5oPgorCitpbmhlcml0IFJPT00oInN0ZHJvb20iKTsKK2luaGVyaXQgIi9zdGQvcm9vbS9rcmFldXRlciI7CisKK3ZvaWQgbWF5YmVfcmVwbGFjZV9wcm9ncmFtKCkKKy8vIGRpZXNlciBTdGFuZGFyZHJhdW0sIGRhcmYgX25pY2h0XyByZXBsYWNlZCB3ZXJkZW4uLi4KK3sgfQorCitpbnQgdHVlbXBlbF9leChzdHJpbmcgZXhpdCwgbWFwcGluZyBtYXBfbGRmaWVkKQoreyAgIHJldHVybiBtYXBfbGRmaWVkW2V4aXRdPT1ST09NKCJ0dWVtcGVsIik7ICB9CisKK3N0YXRpYyBpbnQgcGxhbnQ7CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgIGludCBpOworICAgc3RyaW5nIHR1ZW1wZWwsIGRpcjsKKyAgIG1peGVkIHRtcDsKKworICAgaWYgKCFjbG9uZXAoTUUpKSByZXR1cm47CisgICA6OmNyZWF0ZSgpOworICAgcGxhbnQ9MDsKKyAgIFNldFByb3AoUF9JTkRPT1JTLCAwKTsKKyAgIFNldFByb3AoUF9MSUdIVCwgMSk7CisgICBTZXRQcm9wKFBfSU5UX1NIT1JULCAiQW0gUmFuZGUgZGVyIFphdWJlcmxpY2h0dW5nIik7CisgICBTZXRQcm9wKEVYVFJBX0xPTkcsICIiKTsKKyAgIGlmIChQTykgZGlyPShQTy0+Q3VzdG9taXplT2JqZWN0KCkpOworICAgaWYgKCFkaXIpIHJldHVybjsKKyAgIGRpcj0oWyJvIjoib3N0IiwgInciOiJ3ZXN0IiwgIm4iOiJub3JkIiwgInMiOiJzdWVkIiwKKyAgICAgICAgICJubyI6Im5vcmRvc3QiLCAibnciOiJub3Jkd2VzdCIsCisgICAgICAgICAic28iOiJzdWVkb3N0IiwgInN3Ijoic3VlZHdlc3QiXSlbZGlyWzguLl1dOworICAgdHVlbXBlbD1maWx0ZXIobV9pbmRpY2VzKFF1ZXJ5UHJvcChQX0VYSVRTKXx8KFtdKSksICJ0dWVtcGVsX2V4IiwgTUUsIFF1ZXJ5UHJvcChQX0VYSVRTKXx8KFtdKSlbMF1bMC4uPDNdOworICAgZGlyPWNhcGl0YWxpemUoZGlyKTsgdHVlbXBlbD1jYXBpdGFsaXplKHR1ZW1wZWwpOworICAgU2V0UHJvcChQX0lOVF9MT05HLCBCUygKKyAgICAgIkR1IHN0ZWhzdCBhbSAiK2RpcisicmFuZCBkZXIgZ3Jvc3NlbiBMaWNodHVuZyBpbm1pdHRlbiBkZXMgWmF1YmVyd2FsZHMuICIKKyAgICArdHVlbXBlbCsibGljaCB2b24gaGllciwgYmVmaW5kZXQgc2ljaCBnZW5hdSBpbiBkZXIgTWl0dGUgZGVyICIKKyAgICArIkxpY2h0dW5nIGVpbiBrbGVpbmVyIFR1ZW1wZWwgaW4gZGVzc2VuIFdhc3NlciBzaWNoIGRhcyBTb25uZW5saWNodCBpbiAiCisgICAgKyJhbGxlbiBGYXJiZW4gZGVzIFJlZ2VuYm9nZW5zIHNwaWVnZWx0LiBIaWVyIHVuZCBkYSBzdGVoZW4gdW0gZGVuIFRlaWNoICIKKyAgICArImhlcnVtIHZlcmVpbnplbHQgZWluaWdlIEVpY2hlbiBkaWUgc2ljaCBpcmdlbmR3aWUgenUgYmV3ZWdlbiAiCisgICAgKyJzY2hlaW5lbiB1bmQgYWIgdW5kIHp1IHNpZWhzdCBEdSB3aWUgc2ljaCBlaW5pZ2Uga2xlaW5lIFBpeGllcyBhdXMgIgorICAgICsiZGVtIFdhbGQgaGVyYXVzIGFucyBXYXNzZXIgdHJhdWVuLiBEaWUgRWljaGVuIGplZG9jaCwgaGFsdGVuIGltbWVyICIKKyAgICArImVpbmVuIGRldXRsaWNoZW4gQWJzdGFuZCB6dW0gV2Fzc2VyLiIrUXVlcnlQcm9wKEVYVFJBX0xPTkcpKSk7CisgICBBZGREZXRhaWwoKHsicmF1bSIsIGxvd2VyX2Nhc2UoZGlyKSsicmFuZCIsICJ6YXViZXJ3YWxkIn0pLCBRdWVyeVByb3AoUF9JTlRfTE9ORykpOworICAgQWRkRGV0YWlsKCh7InBpeGllcyIsICJ6YXViZXJ3ZXNlbiIsICJ1bmZ1ZyJ9KSwKKyAgICAgIlBpeGllcyBzaW5kIGtsZWluZSB2ZXJzcGllbHRlIFphdWJlcndlc2VuLCBkaWUgaGllciBpbSBaYXViZXJ3YWxkIHdvaG5lbi4gVW1cbiIKKyAgICArImVpbmVtIHZvbiBpaG5lbiB6dSBiZWdlZ25lbiB3aXJzdCBEdSBoaWVyIGltIFdhbGQgc2ljaGVyIG5pY2ggbGFuZ2Ugc3VjaGVuXG4iIAorICAgICsibXVlc3NlbiwgZG9jaCB2b3JzaWNodCwgc2llIGhhYmVuIG5pY2h0cyBhbHMgVW5mdWcgaW0gS29wZi4uLlxuIik7CisgICBBZGREZXRhaWwoKHsiZmFyYmVuIiwgInJlZ2VuYm9nZW4iLCAiY29tcHV0ZXIifSksCisgICAgICJOb2NoIG5pZSBlaW5lbiBSZWdlbmJvZ2VuIGdlc2Vobj8gSG1tLi4gZGFubiBzaXR6dCBEdSB3aXJrbGljaCBlaW5kZXV0aWdcbiIKKyAgICArInp1dmllbCB2b3IgRGVpbmVtIENvbXB1dGVyLi4uXG4iKTsKKyAgIEFkZERldGFpbCgiYWJzdGFuZCIsCisgICAgICJXaWVzbyBzaWUgZGllc2VuIEFic3RhbmQgaGFsdGVuIGthbm5zdCBEdSBuaWNodCBuYWNodm9sbHppZWhuLCBhYmVyIG1laHIgYWxzXG4iCisgICAgKyJlaW4gcGFhciBNZXRlciBnZWhlbiBzaWUgbmllIGFuIGRlbiBhbHRlbiBXZWloZXIgZHJhbi5cbiIpOworICAgQWRkRGV0YWlsKCh7InNvbm5lIiwgInNvbm5lbnN0cmFobGVuIiwgInNvbm5lbmxpY2h0IiwgImhpbW1lbCIsICJoZXJ6In0pLAorICAgICAiWmFobHJlaWNoZSB3YXJtZSBTb25uZW5zdHJhaGxlbiBlcndhZXJtZW4gRGVpbiBIZXJ6IHVuZCBEdSBiaXN0IHJpY2h0aWdcbiIKKyAgICArImdsdWVja2xpY2guIFNvbGNoIGVpbiBJZHlsbGlzY2hlcyBQbGFldHpjaGVuIHdpbGxzdCBEdSBhbSBsaWVic3RlbiBuaWVcbiIKKyAgICArIndpZWRlciB2ZXJsYXNzZW4uIEZlaGx0IGVpZ2VudGxpY2ggbnVyIG5vY2ggZWluIFBhcnRuZXIsIG1pdCBkZW0gbWFuXG4iCisgICAgKyJoaWVyIGdlbWVpbnNhbSBpbiBkZXIgU29ubmUgbGllZ2VuIHVuZCBkYXMgcmF1c2NoZW4gZGVzIFdhc3NlcnMgZ2VuaWVzc2VuXG4iCisgICAgKyJrYW5uLlxuIik7CisgICBBZGREZXRhaWwoInBhcnRuZXIiLCAiRGVuIG11c3N0IER1IERpciBzY2hvbiBzZWxic3QgbWl0YnJpbmdlbi4uLlxuIik7CisgICBBZGREZXRhaWwoKHsid2FsZCIsICJ6YXViZXJ3YWxkIn0pLAorICAgICAiRHUgYmVmaW5kZXN0IERpY2ggcXVhc2kgbWl0dGVtIGlobiBpaG0uIFJ1bmQgaGVydW0gdW0gZGllIExpY2h0dW5nIHNjaGxpZXNzdFxuIgorICAgICsic2ljaCBlaW4gZGljaHRlciBXYWxkIGFuLlxuIik7CisgICBBZGREZXRhaWwoKHsiZWljaGUiLCAiZWljaGVuIn0pLAorICAgICAiSGllciBiZWZpbmRldCBzaWNoIGdlcmFkZSBrZWluZSwgc28gZGFzcyBEdSBzaWUgbmljaCBuYWVoZXIgYW5zZWhuIGthbm5zdC5cbiIpOworICAgQWRkRGV0YWlsKCh7ImxpY2h0dW5nIiwgInJhbmQiLCAicGxhZXR6Y2hlbiJ9KSwgUXVlcnlQcm9wKFBfSU5UX0xPTkcpKTsKKyAgIEFkZERldGFpbCgoeyJ3YXNzZXIiLCAidHVlbXBlbCIsICJ0ZWljaCIsIGxvd2VyX2Nhc2UodHVlbXBlbCkrImVuIiwgIm1pdHRlIn0pLAorICAgICAiV2VubiBEdSBEaXIgZGVuIFR1ZW1wZWwgaW4gZGVyIE1pdHRlIGRlciBMaWNodHVuZyBldHdhcyBuYWVoZXIgYW5zZWhlblxuIgorICAgICsibW9lY2h0ZXN0LCBzb2xsdGVzdCBEdSB2aWVsbGVpY2h0IGVpbmZhY2ggbm9jaCBlaW4gYmlzc2NoZW4gbmFlaGVyIHJhbmdlaG4uXG4iKTsKKyAgIEFkZERldGFpbCgoeyJ3YWxkd2VnIiwgIndlZyJ9KSwKKyAgICAgIlVlYmVyIGRlbiBXYWxkd2VnIGthbm5zdCBEdSBkZW4gV2FsZCB3aWVkZXIgdmVybGFzc2VuIHdlbm4gRHUgbW9lY2h0ZXN0LlxuIik7CisgICBBZGREZXRhaWwoKHsiYm9kZW4ifSksCisgICAgICJEZXIgQm9kZW4gaXN0IGhpZXIgbmlyZ2VuZHMgbmFja3Qgc2ljaHRiYXIsIHNvbmRlcm4gaXN0IG1pdCBlaW5lbSBzY2hvZW5lblxuIgorICAgICsiZ3J1ZW5lbiBSYXNlbnRlcHBpY2ggYmVkZWNrdC4gTmljaHQgenUgaG9jaCB1bmQgbmljaHQgenUgdGllZiwgb2ZmZW5zaWNodGxpY2hcbiIKKyAgICArImJlZGFyZiBkaWVzZSBHcmFzYXJ0IGtlaW5lcmxlaSBQZmxlZ2Ugb2RlciBhYmVyIGlyZ2VuZGplbWFuZCBwZmxlZ3QgZGllc2VuXG4iCisgICAgKyJSYXNlbiBoaWVyIHNlZWVoaGhocnJyIGdydWVuZGxpY2guXG4iKTsKKyAgIEFkZERldGFpbCgoeyJncmFzYXJ0IiwgInJhc2VuIiwgImFydCIsICJncmFzIiwgInJhc2VudGVwcGljaCIsICJoYWxtZSJ9KSwKKyAgICAgIkR1IHNjaGF1c3QgRGlyIGRlbiBSYXNlbiBub2NoIGVpbm1hbCBncnVlbmRsaWNoIGFuIHVuZCBzdHJlaWNoc3QgbWl0IERlaW5lclxuIgorICAgICsiSGFuZCBkdXJjaCBkaWUgSGFsbWUuIFdhcyBhdWNoIGltbWVyIGRhcyBmdWVyIGVpbmUgQXJ0IGlzdCwgc29sY2ggZWluZW4gUmFzZW5cbiIKKyAgICArImhhc3QgRHUgbm9jaCBuaWNodCBnZXNlaG4uXG4iKTsKKyAgIEFkZERldGFpbCgiaGFuZCIsCisgICAgICJTZWkgbGllYmVyIHZvcnNpY2h0aWcsIHNvbnN0IGlzdCBkaWUgSGFuZCBzY2huZWxsZXIgYWIgYWxzIER1IGRlbmtzdC4uLlxuIik7CisgICBBZGREZXRhaWwoInBmbGVnZSIsCisgICAgICJPYiBqZW1hbmQgZGllc2VuIFJhc2VuIHBmbGVndCwgYnp3LiBfd2VyXyBrYW5uc3QgRHUgbmljaHQgZW50ZGVja2VuLi4uXG4iKTsKKyAgIEFkZFNvdW5kcygoeyJyYXVzY2hlbiIsICJ3YXNzZXIifSksICJMZWlzZSBob2Vyc3QgRHUgZGFzIHJhdXNjaGVuIGRlcyBXYXNzZXJzLi4uLlxuIik7Cit9CisKKyNkZWZpbmUgVkVSQiAoWyJpc3MiOiAiZXNzZW4iLCAiZXNzZSI6ICJlc3NlbiIsICJwZmx1ZWNrIjogInBmbHVlY2tlbiIsICJwZmx1ZWNrZSI6ICJwZmx1ZWNrZW4iXSkKKworc3RhdGljIGludCBjbWRfcGlsemUoc3RyaW5nIHN0cikKK3sKKyAgIG5vdGlmeV9mYWlsKCJXYXMgbW9lY2h0ZXN0IER1ICIrVkVSQltxdWVyeV92ZXJiKCldKyI/XG4iKTsKKyAgIGlmIChzdHIhPSJwaWx6IiAmJiBzdHIhPSJwaWx6ZSIpIHJldHVybiAwOworICAgaWYgKHBsYW50PnRpbWUoKSkgeworICAgICAgd3JpdGUoIkR1IHNvbGx0ZXN0IGRpZSBQaWx6ZSBlcnN0bWFsIGluIFJ1aGUgd2llZGVyIGV0d2FzIG5hY2h3YWNoc2VuIGxhc3Nlbi5cbiIpOworICAgICAgcmV0dXJuIDE7CisgICB9CisgICBpZiAoUEwtPlF1ZXJ5UHJvcChaQVVCRVJXQUxEKTw9dGltZSgpKSB7CisgICAgICB3cml0ZSgiRHUgYmlzdCBudXIgR2FzdCBoaWVyIHVuZCBkaWUgQmV3b2huZXIgZGVzIFphdWJlcndhbGRzLCBzZWhlbiBlcyBuaWNodCBnZXJuZVxuIgorICAgICAgICAgICArIndlbm4gbWFuIGhpZXIgZWluZmFjaCBzbyBkaWUgUGlsemUgcGZsdWVja3QuXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgfQorICAgcGxhbnQ9dGltZSgpKzMwMDsKKyAgIHdyaXRlKCJEdSBwZmx1ZWNrc3QgRGlyIGVpbmlnZSBQaWx6ZSB1bmQgaXNzdCBzaWUuIEFuc2NobGllc3NlbmQgZ2VodCBlcyBEaXJcbiIKKyAgICAgICAgKyJiZWRldXRlbmQgYmVzc2VyLlxuIik7CisgICBQTC0+cmVkdWNlX2hpdF9wb2ludHMoIG5lZ2F0ZSgxMDArcmFuZG9tKDEwMCkpICk7CisgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjbWRfZmFybmUoc3RyaW5nIHN0cikKK3sKKyAgIGludCBmb29kOworICAgbm90aWZ5X2ZhaWwoIldhcyBtb2VjaHRlc3QgRHUgIitWRVJCW3F1ZXJ5X3ZlcmIoKV0rIj9cbiIpOworICAgaWYgKHN0ciE9ImZhcm4iICYmIHN0ciE9ImZhcm5lIikgcmV0dXJuIDA7CisgICBpZiAoUEwtPlF1ZXJ5UHJvcChaQVVCRVJXQUxEKTw9dGltZSgpKSB7CisgICAgICB3cml0ZSgiRHUgYmlzdCBudXIgR2FzdCBoaWVyIHVuZCBkaWUgQmV3b2huZXIgZGVzIFphdWJlcndhbGRzLCBzZWhlbiBlcyBuaWNodCBnZXJuZVxuIgorICAgICAgICAgICArIndlbm4gbWFuIGhpZXIgZWluZmFjaCBzbyBkZW4gRmFybiBhYnJlaXNzdC5cbiIpOworICAgICAgcmV0dXJuIDE7CisgICB9CisgICAvLyBkYXMgdGFua2VuIGFtIFdhc3NlciBpc3QgdW1zb25zdCwgZXMgaGVpbHQgZGFiZWkgd2llIGVpbgorICAgLy8gbWl0dGxlcmVzIEtuZWlwZW5lc3NlbiBkYXMgZ2VuYXUgMSBNdWVuemUga29zdGV0LiBHZWhlaWx0IHdlcmRlbiBudXIgSFAKKyAgIC8vIEVpbiBNaXNzYnJhdWNoIGlzdCBpbSBXYWxkIGF1c2dlc2NobG9zc2VuLCBiencuIG1hbiBtdWVzc3RlIGRlbgorICAgLy8gZ2VzYW10ZW4gV2FsZCBsZWVybWV0emVsbiB1bmQga2FubiBkYW5uIGhpZXIgdGFua2VuIGJpcyB6dW0gbmFlY2hzdGVuCisgICAvLyByZXNldC4gQmVpIEtvc3RlbiB2b24gZWluZXIgTXVlbnplIHBybyBIZWlsdW5nIGlzdCBlcyBzZWhyIGZyYWdsaWNoCisgICAvLyBvYiBzaWNoIGRhcyBsb2hudC4uLi4gOikKKyAgIGZvb2Q9KFBMLT5RdWVyeVByb3AoUF9NQVhfRk9PRCkpIC0gKFBMLT5RdWVyeVByb3AoUF9GT09EKSk7CisgICBpZiAoZm9vZD4xMCkgZm9vZD0xMDsgLy8gbmllIG1laHIgYWxzIGZ1ZXIgMTAgZm9vZCB0YW5rZW4uLi4KKyAgIGlmIChmb29kIDw9IDAgfHwgIVBMLT5lYXRfZm9vZChmb29kLCAxKSkgeworICAgICAgd3JpdGUoIkR1IGJpc3Qgc28gdm9sbCwgRHUga2FubnN0IGxlaWRlciB3aXJrbGljaCBuaWNodHMgbWVociBlc3Nlbi4uLlxuIik7CisgICAgICByZXR1cm4gMTsKKyAgIH0KKyAgIHdyaXRlKCJEdSBwZmx1ZWNrc3QgZWluIHdlbmlnIHZvbiBkZW0gRmFybiB1bmQgaXNzdCBpaG4uIFNvZ2xlaWNoIHNwdWVyc3QgRHUsIHdpZSBlc1xuIgorICAgICAgICArIkRpciBhbGxtYWVobGljaCB3aWVkZXIgYmVzc2VyIGdlaHQuLi5cbiIpOworICAgaWYgKFBMLT5lYXRfZm9vZChmb29kKSkgeyAvLyBmb29kIGd1dHNjaHJlaWJlbiBlcmZvbGdyZWljaD8KKyAgICAgIFBMLT5idWZmZXJfaHAoZm9vZCo2LCA4KTsKKyAgICAgIFBMLT5TZXRQcm9wKFpBVUJFUldBTEQsIHRpbWUoKStBR0dSRVNTSVZFX1RJTUUpOworICAgfQorICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY21kX3N1ZWRlbigpCit7CisgICBpZiAoUEwtPlF1ZXJ5UHJvcChaQVVCRVJXQUxEKT50aW1lKCkpIHsKKyAgICAgIHdyaXRlKCJEdSB2ZXJzdWNoc3QgaW4gZGVuIFdhbGQgenUgZmx1ZWNodGVuLCBkb2NoIGRpZSBGYXJuZSB1bmQgQnVlc2NoZSBiaWxkZW5cbiIKKyAgICAgICAgICAgKyJlaW5lIHBmbGFuemxpY2hlIEJhcnJpZXJlIHVuZCBsYXNzZW4gRGljaCBuaWNodCBoaW5kdXJjaC5cbiIpOworICAgICAgcmV0dXJuIDE7CisgICB9CisgICB3cml0ZSgiRHUgbWFjaHN0IGVpbmVuIFNjaHJpdHQgaGluIG5hY2ggU3VlZGVuIHVuZCBzb2ZvcnQgYmllZ2VuIHNpY2ggYXVmIG1hZ2lzY2hlXG4iCisgICAgICAgICsiV2Vpc2UgZGllIEZhcm5lIHVuZCBCdWVzY2hlIHp1ciBTZWl0ZSB1bmQgZ2ViZW4gZWluZW4gVHJhbXBlbHBmYWQgbmFjaCBTdWVkZW5cbiIKKyAgICAgICAgKyJmcmVpLlxuIik7CisgICBQTC0+bW92ZShST09NKCJodWV0dGUiKSwgTV9HTywgImR1cmNoIGRpZSBCdWVzY2hlIG5hY2ggU3VlZGVuIiwgInp3YWVuZ3Qgc2ljaCIpOworICAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvcm9vbS9zdGRyb29tLmMgYi9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvcm9vbS9zdGRyb29tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUyOTdlNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9yb29tL3N0ZHJvb20uYwpAQCAtMCwwICsxLDUyIEBACisvLyAoYykgYnkgUGFkcmVpYyAoUGFkcmVpY0BtZy5tdWQuZGUpCisKK2luaGVyaXQgInN0ZC9yb29tIjsKKworI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisjaW5jbHVkZSA8bW92aW5nLmg+CisKK3N0YXRpYyBzdHJpbmcgc291bmRzKCk7CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgIDo6Y3JlYXRlKCk7CisgICBTZXRQcm9wKFBfTk9fVFBPUlQsIE5PX1RQT1JUKTsKKyAgIEFkZFNtZWxscyhTRU5TRV9ERUZBVUxULAorICAgICAiRGVyIER1ZnQgdm9tIEhhcnogZGVyIEJhZXVtZSB1bmQgZWluaWdlciBzb25zdGlnZXIgUGZsYW56ZW4gbGllZ3QgaW4gZGVyIEx1ZnQuXG4iCisgICAgKyJNYW4gbWVya3Qgc29mb3J0LCBEdSBzdGVoc3QgbWl0dGVtIGltIFdhbGQuXG4iKTsKKyAgIEFkZFNvdW5kcyhTRU5TRV9ERUZBVUxULCAjJ3NvdW5kcyk7CisgICBBZGRTb3VuZHMoKHsidm9lZ2VsIiwgInZvZWdlbG4iLCAiendpdHNjaGVybiJ9KSwKKyAgICAgIkRhcyBoZXJybGljaGUgendpdHNjaGVybiBkZXIgVm9lZ2VsLCBpc3QgZGFzIGVpbnppZ2UgZGFzIGRpZSBSdWhlIGltIFdhbGRcbiIKKyAgICArImR1cmNoYnJpY2h0LlxuIik7Cit9CisKK3N0YXRpYyBzdHJpbmcgc291bmRzKCkKK3sKKyAgIGlmIChzaXplb2YoZmlsdGVyX29iamVjdHMoYWxsX2ludmVudG9yeSgpLCAiSW5GaWdodCIpKSkKKyAgICAgIHJldHVybiAiRGVyIExhZXJtIGRlcyBLYW1wZmVzIHN0b2VydCBkaWUgUnVoZSBkZXMgV2FsZGVzIHVuZCB1ZWJlcnRvZW50IGFsbGVzLlxuIjsKKyAgIGlmIChzaXplb2YoZmlsdGVyKGFsbF9pbnZlbnRvcnkoKSwgIydxdWVyeV9vbmNlX2ludGVyYWN0aXZlKSk+MSkKKyAgICAgIHJldHVybiAiRXMgaXN0IHVuaGVpbWxpY2ggc3RpbGwgaGllciBpbSBXYWxkIHVuZCBudXIgZGFzIHp3aXRzY2hlcm4gZWluaWdlciBWb2VnZWxcbiIKKyAgICAgICAgICAgICsiaXN0IHp1IGhvZXJlbi5cbiI7CisgICByZXR1cm4gIkR1IGhhc3QgZGFzIEdlZnVlaGwsIGFscyB3YWVyc3QgRHUgZ2FueiBhbGxlaW4gaGllciBpbSBXYWxkLiBBbGxlcyBpc3QgcnVoaWdcbiIKKyAgICAgICAgICsidW5kIG51ciBoaWVyIHVuZCBkYSB2ZXJuaW1tc3QgRHUgZGFzIHp3aXRzY2hlcm4gZWluaWdlciBWb2VnZWwuXG4iOworfQorCit2YXJhcmdzIHZvaWQgZGVsYXlfcmVzZXQoaW50IHRpbWUpCisvLyBOUENzIGtvZW5uZW4gYm9pbmcgcmVzZXRzIHZlcmhpbmRlcm4KK3sKKyAgIGlmICh0aW1lKQorICAgICAgc2V0X25leHRfcmVzZXQodGltZSk7CisgICBlbHNlIHNldF9uZXh0X3Jlc2V0KDM2MDApOworfQorCitpbnQgX25vcm1hbGZ1bmN0aW9uKCkKK3sKKyAgbWl4ZWQgejsKKyAgaW50IGk7CisgIHo9dGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKEFVU0dBTkcpOworICB0aGlzX3BsYXllcigpLT5TZXRQcm9wKEFVU0dBTkcsIHF1ZXJ5X3ZlcmIoKSk7CisgIGk9KGludCk6Ol9ub3JtYWxmdW5jdGlvbigpOworICBpZiAoIWkpIHRoaXNfcGxheWVyKCktPlNldFByb3AoQVVTR0FORywgeik7CisgIHJldHVybiBpOworfQorICAgICAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvcm9vbS9zdGVpbi5jIGIvZG9jL2JlaXNwaWVsZS96YXViZXJ3YWxkL3Jvb20vc3RlaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDc0YjA3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS96YXViZXJ3YWxkL3Jvb20vc3RlaW4uYwpAQCAtMCwwICsxLDExMiBAQAorLy8gKGMpIGJ5IFBhZHJlaWMgKFBhZHJlaWNAbWcubXVkLmRlKQorCisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKworaW5oZXJpdCBST09NKCJzdGRyb29tIik7CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgIDo6Y3JlYXRlKCk7CisgICBTZXRQcm9wKFBfSU5ET09SUywgMCk7CisgICBTZXRQcm9wKFBfTElHSFQsIDEpOworICAgU2V0UHJvcChQX0lOVF9TSE9SVCwgIkJlaSBlaW5lbSBTdGVpbiIpOworICAgQWRkU3BlY2lhbERldGFpbCgoeyJvcnQiLCAid2FsZCIsICJwbGF0eiJ9KSwgIl9xdWVyeV9pbnRfbG9uZyIpOworICAgQWRkRGV0YWlsKCJzdGVpbiIsCisgICAgICJEZXIgU3RlaW4gaXN0LCBkdXJjaCBkaWUgU29ubmVuc3RyYWhsZW4gb3JkZW50bGljaCBhdWZnZWhlaXp0LCBhbmdlbmVobSB3YXJtXG4iCisgICAgKyJ1bmQgYmlldGV0IGVpZ2VudGxpY2ggZGVuIGlkZWFsZW4gUGxhdHogdW0gZXMgc2ljaCBndXQgZ2VobiB6dSBsYXNzZW4gdW5kIGluXG4iCisgICAgKyJkZXIgU29ubmUgenUgbGllZ2VuLlxuIik7CisgICBBZGREZXRhaWwoKHsic29ubmUiLCAiaGltbWVsIiwgInNvbm5lbnN0cmFobGVuIiwgInN0cmFobGVuIn0pLAorICAgICAiRGVyIGJsYXVlIEhpbW1lbCBpc3QgbmFoZXp1IHdvbGtlbmZyZWkgdW5kIHNvIHN0cmFobHQgZGllIFNvbm5lIGluIHZvbGxlclxuIgorICAgICsiUHJhY2h0IG9iZW4gYW0gSGltbWVsIHVuZCBpaHJlIFN0cmFobGVuIHByYXNzZWxuIGF1ZiBEZWluZSBIYXV0LlxuIik7CisgICBBZGREZXRhaWwoKHsiYm9kZW4iLCAid2VnIiwgIndhbGR3ZWciLCAiZXJkZSJ9KSwKKyAgICAgIkVpbiBnYW56IG5vcm1hbGVyIFdhbGR3ZWcgaGFsdCwgZWluIGJpc3NjaGVuIHNhbmRpZywgZWluaWdlIGtsZWluZSBBZXN0Y2hlblxuIgorICAgICsiZ2FueiBub3JtYWwgaGFsdC5cbiIpOworICAgQWRkU3BlY2lhbERldGFpbCgiemVpdCIsICJkZXRfemVpdCIpOworICAgQWRkRGV0YWlsKCh7ImFlc3RjaGVuIiwgInN0b2Vja2NoZW4ifSksCisgICAgICJHYW56IGtsZWluZSBoZXJ1bnRlcmdlZmFsbGVuZSBTdG9lY2tjaGVuLCBkdXJjaCByZWdlcyBkcnVlYmVyIGxhdWZlblxuIgorICAgICsiaW0gTGF1ZmUgZGVyIFplaXQga2xlaW5nZW1hbGVuIHVuZCB2b20gV2V0dGVyIGF1ZmdlbG9lc3QuLi5cbiIpOworICAgQWRkRGV0YWlsKCJ3ZXR0ZXIiLAorICAgICAiQXVjaCB3ZW5uIGhpZXIgaGV1dGUgZGllIFNvbm5lIHNjaGVpbnQsIGdpYnQgZXMgbmF0dWVybGljaCBhdWNoIGhpZXJcbiIKKyAgICArImdlbGVnZW50bGljaCB2ZXJyZWduZXRlIFRhZ2UuXG4iKTsKKyAgIEFkZERldGFpbCgidGFnZSIsICJOYWphLi4uIGFsbHp1dmllbGUgc2luZCBlcyBqZWRvY2ggbmljaHQuXG4iKTsKKyAgIEFkZERldGFpbCgoeyJub3Jkb3N0ZW4iLCAibGljaHR1bmciLCAiYXVzZ2FuZyIsICJ3ZWloZXIifSksCisgICAgICJJbSBOb3Jkb3N0ZW4ga2FubnN0IER1IGltbWVyIG5vY2ggZGllIGdyb3NzZSBMaWNodHVuZyBtaXQgZGVuIHdhbmRlcm5kZW4gRWljaGVuXG4iCisgICAgKyJ1bmQgZGVtIHZlcnd1bnNjaGVuZW4gV2VpaGVyIGVya2VubmVuLlxuIik7CisgICBBZGREZXRhaWwoKHsiZWljaGVuIiwgIndhbmRlcm5kZSBlaWNoZW4ifSksCisgICAgICJJbSBOb3Jkb3N0ZW4gYXVmIGRlciBMaWNodHVuZyBoYXN0IER1IHZvcmhpbiB3YW5kZXJuZGUgRWljaGVuIGdlc2VobixcbiIKKyAgICArInZpZWxsZWljaHQgc29sbHRlc3QgRHUgZWluZmFjaCBub2NobWFsIHp1cnVlY2sgZ2VobiB1bmQgc2llIERpciBuYWVoZXJcbiIKKyAgICArImFuc2NoYXVuLlxuIik7CisgICBBZGREZXRhaWwoKHsid29sa2UiLCAid29sa2VuIiwgInNjaGFlZmNoZW53b2xrZSJ9KSwKKyAgICAgIkRlciBIaW1tZWwgaXN0IGVpZ2VudGxpY2ggd29sa2VuZnJlaSBudXIgaGllciB1bmQgZGEgemllaHQgbWFsIGVpbmUga2xlaW5lXG4iCisgICAgKyJTY2hhZWZjaGVud29sa2Ugdm9yYmVpLlxuIik7CisgICBBZGRFeGl0KCJub3Jkb3N0ZW4iLCBST09NKCJsaWNodHVuZ3N3IikpOworICAgQWRkSXRlbShOUEMoInRpdGluYSIpLCBSRUZSRVNIX1JFTU9WRSwgMSk7CisgICBBZGRDbWQoKHsic2V0eiIsICJzZXR6ZSIsICJsZWciLCAibGVnZSIsICJrbGV0dGVyIiwgImtsZXR0ZXJlIn0pLCAiY21kX3NldHplbiIpOworICAgQWRkQ21kKCh7InN0ZWgiLCAic3RlaGUifSksICJjbWRfYXVmc3RlaG4iKTsKK30KKworI2RlZmluZSBTVEVJTiBXQUxESUQoInN0ZWluIikKKwordm9pZCBpbml0KCkKK3sKKyAgaWYgKFBMKSBQTC0+U2V0UHJvcChTVEVJTiwgMCk7CisgIDo6aW5pdCgpOworfQorCitzdGF0aWMgaW50IGNtZF9hdWZzdGVobihzdHJpbmcgc3RyKQoreworICAgIGlmICghUEwtPlF1ZXJ5UHJvcChTVEVJTikpIHJldHVybiAwOworICAgIGlmIChzdHIhPSJhdWYiICYmIHN0ciE9InZvbiBzdGVpbiBhdWYiKSB7CisgICAgICAgbm90aWZ5X2ZhaWwoIlZvbiB3YXMgbW9lY2h0ZXN0IER1IGF1ZnN0ZWhuP1xuIik7CisgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIFBMLT5TZXRQcm9wKFNURUlOLCAwKTsKKyAgICB3cml0ZSgiRHUga2xldHRlcnN0IGFsc28gdm9tIFN0ZWluIHdpZWRlciBydW50ZXIgdW5kIHN0ZWhzdCBhdWYuXG4iKTsKKyAgICByZXR1cm4gMTsKK30KKworI2RlZmluZSBWRVJCKHgpIChbInNldHoiOiAic2V0enQiLCAibGVnIjogImxlZ3N0IiwgImtsZXR0ZXIiOiAia2xldHRlcnN0Il0pW3hdCisKK3N0YXRpYyBpbnQgY21kX3NldHplbihzdHJpbmcgc3RyKQoreworICAgc3RyaW5nIHZlcmI7CisgICB2ZXJiPXF1ZXJ5X3ZlcmIoKTsKKyAgIGlmICh2ZXJiICYmIHZlcmJbPDFdPT0nZScpIHZlcmI9dmVyYlswLi48Ml07CisgICBpZiAoc3RyIT0iYXVmIHN0ZWluIiAmJiBzdHIhPSJzdGVpbiIgJiYgc3RyIT0idm9uIHN0ZWluIikgeworICAgICAgbm90aWZ5X2ZhaWwoQlMoIldvaGluIG1vZWNodGVzdCBEdSAiCisgICAgICAgICAgICAgICAgICsodmVyYiE9ImtsZXR0ZXIiID8gIkRpY2ggIiA6ICIiKSt2ZXJiKyJlbj8iKSk7CisgICAgICByZXR1cm4gMDsKKyAgIH0KKyAgIGlmIChQTC0+UXVlcnlQcm9wKFNURUlOKSkgeworICAgICAgaWYgKHZlcmIhPSJrbGV0dGVyIiB8fCBzdHI9PSJhdWYgc3RlaW4iKSB7CisgICAgICAgICB3cml0ZSgiRHUgc2l0enQgZG9jaCBiZXJlaXRzIGF1ZiBkZW0gU3RlaW4hXG4iKTsKKyAgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgICAgUEwtPlNldFByb3AoU1RFSU4sIDApOworICAgICAgd3JpdGUoIkR1IGtsZXR0ZXJzdCBhbHNvIHZvbSBTdGVpbiB3aWVkZXIgcnVudGVyIHVuZCBzdGVoc3QgYXVmLlxuIik7CisgICAgICByZXR1cm4gMTsKKyAgIH0KKworICAgd3JpdGUoQlMoIkVudHNwYW5udCAiK1ZFUkIodmVyYikrIiBEdSAiKyh2ZXJiIT0ia2xldHRlciIgPyAiRGljaCAiIDogIiIpCisgICAgICAgICsiYXVmIGRlbiBTdGVpbiB1bmQgZ2VuaWVzc3QgZGllIFNvbm5lLiIpKTsKKyAgIFBMLT5TZXRQcm9wKFNURUlOLCB0aW1lKCkpOworICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJpbmcgZGV0X3plaXQoKQoreyAgcmV0dXJuICJXaXIgaGFiZW4gZ2VuYXUgIitkdGltZSh0aW1lKCkpWzw4Li5dKyIuXG4iOyB9CisKK3N0YXRpYyBzdHJpbmcgX3F1ZXJ5X2ludF9sb25nKCkKK3sKKyAgIGlmIChwcmVzZW50KFdBTERJRCgiZmVlIiksIE1FKSkKKyAgICAgIHJldHVybgorICAgICAgICAiSGllciBtaXR0ZW4gaW0gV2FsZCBzdGVodCBlaW4gZ3Jvc3NlciBTdGVpbiwgYXVmIGRlbSBUaXRpbmEgZGllIHd1bmRlcnNjaG9lbmVcbiIKKyAgICAgICArIldhbGRmZWUgc2l0enQgdW5kIHNpY2ggaW4gYWxsZXIgUnVoZSBpaHIgbGFuZ2VzIGdvbGRlbmVzIEhhYXIga2FlbW10LiBEaWVcbiIKKyAgICAgICArIlNvbm5lIHN0cmFobHQgZ2VuYXUgYXVmIGRlbiBTdGVpbiB1bmQgZXMgaXN0IHdvaGwgd2lya2xpY2ggZGVyIGdlbXVldGxpY2hzdGVcbiIKKyAgICAgICArIk9ydCBhdWYgRXJkZW4uIExpbmtzIHVuZCByZWNodHMgdm9tIFdlZyBzY2hsaWVzc3QgZGVyIGRpY2h0ZSBXYWxkIGFuIHVuZCBzb1xuIgorICAgICAgICsiaXN0IGRlciBlaW56aWdlIEF1c2dhbmcgUmljaHR1bmcgTm9yZG9zdGVuIHp1cnVlY2sgenVyIExpY2h0dW5nLlxuIjsKKyAgIHJldHVybiAiSGllciBtaXR0ZW4gaW0gV2FsZCBzdGVodCBlaW4gZ3Jvc3NlciBTdGVpbiwgZGVyIHZvbiBkZXIgU29ubmUgb3JkZW50bGljaFxuIgorICAgICAgICAgKyJhdWZnZWhlaXp0IHdpcmQgdW5kIGlobiB6dSBlaW5lbSB0cmF1bWhhZnRlbiBPcnQgZnVlciBhbGxlIFNvbm5lbmxpZWJoYWJlclxuIgorICAgICAgICAgKyJtYWNodC4gTGlua3MgdW5kIHJlY2h0cyB2b20gV2VnIHNjaGxpZXNzdCBkaXJla3QgZGVyIGRpY2h0ZSBXYWxkIGFuIHVuZCBzb1xuIgorICAgICAgICAgKyJpc3QgZGVyIGVpbnppZ2UgQXVzZ2FuZyBSaWNodHVuZyBOb3Jkb3N0ZW4genVydWVjayB6dXIgTGljaHR1bmcuXG4iOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS96YXViZXJ3YWxkL3Jvb20vdHVlbXBlbC5jIGIvZG9jL2JlaXNwaWVsZS96YXViZXJ3YWxkL3Jvb20vdHVlbXBlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMjJkODYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvcm9vbS90dWVtcGVsLmMKQEAgLTAsMCArMSwxNzkgQEAKKy8vIChjKSBieSBUaG9tYXMgV2luaGVsbGVyIChQYWRyZWljQG1nLm11ZC5kZSkKKworI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisjaW5jbHVkZSA8bW92aW5nLmg+CisKK2luaGVyaXQgUk9PTSgic3Rkcm9vbSIpOworaW5oZXJpdCAiL3N0ZC9yb29tL2tyYWV1dGVyIjsKKwordm9pZCBjcmVhdGUoKQoreworICAgOjpjcmVhdGUoKTsKKyAgIFNldFByb3AoUF9MSUdIVCwgMik7CisgICBTZXRQcm9wKFBfSU5ET09SUywgMCk7CisgICBTZXRQcm9wKFBfSU5UX1NIT1JULCAiQW4gZWluZW0gdmVyd3Vuc2NoZW5kZW4gV2VpaGVyIik7CisgICBBZGRTcGVjaWFsRGV0YWlsKCh7Im9ydCIsICJ3ZWloZXIifSksICJfcXVlcnlfaW50X2xvbmciKTsKKyAgIEFkZERldGFpbCgoeyJzZWVyb3NlbiIsICJmYXJiZW4iLCAiZmFyYmVudmllbGZhbHQifSksCisgICAgICJBdWYgZGVtIFdhc3NlciBzY2h3aW1tZW4gemFobHJlaWNoZSBTZWVyb3NlbiBpbiBhbGxlbiBGYXJiZW4gZGVzIFJlZ2VuYm9nZW5zXG4iCisgICAgKyJlaW5lIHNvbGNoZSBGYXJiZW52aWVsZmFsdCB3aWUgaGllciwgaGFzdCBEdSBiaXNoZXIgbm9jaCBuaXJnZW5kd28gc29uc3RcbiIKKyAgICArImdlc2Vobi5cbiIpOworICAgQWRkRGV0YWlsKCJyZWdlbmJvZ2VuIiwgIkRlcnplaXQgc3RlaHQga2VpbmVyIGFtIEhpbW1lbC5cbiIpOworICAgQWRkRGV0YWlsKCh7ImxpYmVsbGUiLCAibGliZWxsZW4iLCAiYXRtb3NwaGFlcmUiLCAic3VtbWVuIn0pLAorICAgICAiSGllciB1bmQgZGEgc2Nod2lycmVuIHVlYmVyIGRlbSBXZWloZXIgZWluaWdlIExpYmVsbGVuIGhlcnVtLiBJaHIgU3VtbWVuXG4iCisgICAgKyJ2ZXJicmVpdGV0IGVpbmUgcmljaHRpZyBpZHlsbGlzY2hlIEF0bW9zcGhhZXJlIGFuIGRpZXNlbSBPcnQuXG4iKTsKKyAgIEFkZERldGFpbCgoeyJwaXhpZXMiLCAiemF1YmVyd2VzZW4ifSksCisgICAgICJQaXhpZXMgc2luZCBrbGVpbmUgdmVyc3BpZWx0ZSBaYXViZXJ3ZXNlbiwgZGllIGhpZXIgaW0gWmF1YmVyd2FsZCB3b2huZW4uIFVtXG4iCisgICAgKyJlaW5lbSB2b24gaWhuZW4genUgYmVnZWduZW4gd2lyc3QgRHUgaGllciBpbSBXYWxkIHNpY2hlciBuaWNoIGxhbmdlIHN1Y2hlblxuIgorICAgICsibXVlc3NlbiwgZG9jaCB2b3JzaWNodCwgc2llIGhhYmVuIG5pY2h0cyBhbHMgVW5mdWcgaW0gS29wZi4uLlxuIik7CisgICBBZGREZXRhaWwoKHsid2FsZCIsICJ6YXViZXJ3YWxkIiwgInB1bmt0In0pLAorICAgICAiRGVyIHZlcnd1bnNjaGVuZSBXZWloZXIgaXN0IG1laHIgb2RlciB3ZW5pZ2VyIGRlciB6ZW50cmFsZSBQdW5rdCBoaWVyIGltXG4iCisgICAgKyJaYXViZXJ3YWxkLiBFciBsaWVndCBtaXR0ZW4gYXVmIGVpbmVyIGdyb3NzZW4gTGljaHR1bmcgdW1nZWJlbiB2b20gZGljaHRlblxuIgorICAgICsiV2FsZCBkZXIgUGl4aWVzXG4iKTsKKyAgIEFkZERldGFpbCgoeyJsaWNodHVuZyIsICJtaXR0ZSJ9KSwKKyAgICAgIkRlciBXZWloZXIgYmVmaW5kZXQgc2ljaCBnZW5hdSBpbiBkZXIgTWl0dGUgZGVyIExpY2h0dW5nLCBzaWVoIERpY2ggaGFsdFxuIgorICAgICsiZWluZmFjaCBtYWwgdW0uXG4iKTsKKyAgIEFkZERldGFpbCgoeyJib2RlbiIsICJ1ZmVyIn0pLAorICAgICAiRGFzIFVmZXIgZGVzIFdlaWhlcnMgYmVzdGVodCBhdXMgemFobHJlaWNoZW4gU3RlaW5lbiBkaWUgYmlzIGluIGRlbiBXZWloZXJcbiIKKyAgICArImhpbmVpbnJlaWNoZW4uIEF1ZiB1bmQgendpc2NoZW4gZGllc2VuIFN0ZWluZW4gc2luZCBqZWRvY2ggdWViZXJhbGwgemFobHJlaWNoZVxuIgorICAgICsia2xlaW5lIHVuZCBtaXR0bGVyZSBQZmxhbnplbiBnZXdhY2hzZW4uXG4iKTsKKyAgIEFkZERldGFpbCgoeyJzdGVpbiIsICJzdGVpbmUifSksICJFaW4gU3RlaW4gaXN0IGVpbiBTdGVpbiBpc3QgZWluIFN0ZWluIGlzdCBlaW4gU3RlaW4gaXN0IGVpbiBTdGVpbi5cbiIpOworICAgQWRkRGV0YWlsKCJwZmxhbnplbiIsCisgICAgICJEaWUgdmVyc2NoaWVkZW5zdGVuIFBmbGFuemVuIHdhY2hzZW4gendpc2NoZW4gZGVuIFN0ZWluZW4gZW1wb3IgdW5kIGJlZ3J1ZW5lblxuIgorICAgICsiZGFzIFVmZXIuIEFuIGVpbmVyIFN0ZWxsZSBrYW5uc3QgRHUgc29nYXIgd2Vpc3NlbiBXYXNzZXItSGFobmVuZnVzcyB3YWNoc2VuXG4iCisgICAgKyJzZWhlbi5cbiIpOworICAgQWRkRGV0YWlsKCh7Indhc3NlciIsICJzY2hpbW1lciIsICJzY2hpbW1lcm4ifSksCisgICAgICJEYXMgV2Fzc2VyIGlzdCBpcmdlbmR3aWUgcmVjaHQgdHJ1ZWIgdW5kIGVzIGdlaHQgZWluIHNlaHIgc2VsdHNhbWVzIFNjaGltbWVyblxuIgorICAgICsidm9uIGlobSBhdXMuIElyZ2VuZGV0d2FzIGJlc29uZGVyZXMgaGF0IGVzIG1pdCBkaWVzZW0gV2Fzc2VyIGF1ZiBzaWNoLCBkYXNcbiIKKyAgICArInNwdWVyc3QgRHUgZ2VuYXUuIER1IHdlaXNzdCBqZWRvY2ggbmljaHQsIG9iIGVzIGV0d2FzIGd1dGVzIG9kZXIgZXR3YXMgYm9lc2VzXG4iCisgICAgKyJpc3QuXG4iKTsKKyAgIEFkZERldGFpbCgoeyJoaW1tZWwiLCAibHVmdCIsICJzb25uZSIsICJ3YWVybWUiLCAic3RyYWhsZW4iLCAic29ubmVuc3RyYWhsZW4ifSksCisgICAgICJEaWUgU29ubmUgc3RlaHQgaG9jaCBhbSBIaW1tZWwgdW5kIGZ1ZWxsdCBkaWVzZW4gT3J0IG1pdCBlaW5lciBoZXJybGljaGVuXG4iCisgICAgKyJXYWVybWUgdW5kIGlocmUgU3RyYWhsZW4gcmVmbGVrdGllcmVuIGltIFdhc3NlciBpbiBhbGxlbiBlcmRlbmtsaWNoZW4gRmFyYmVuLlxuIik7CisgICBBZGRFeGl0KCJub3JkZW4iLCBST09NKCJsaWNodHVuZ24iKSk7CisgICBBZGRFeGl0KCJub3Jkb3N0ZW4iLCBST09NKCJsaWNodHVuZ25vIikpOworICAgQWRkRXhpdCgibm9yZHdlc3RlbiIsIFJPT00oImxpY2h0dW5nbnciKSk7CisgICBBZGRFeGl0KCJvc3RlbiIsIFJPT00oImxpY2h0dW5nbyIpKTsKKyAgIEFkZEV4aXQoIndlc3RlbiIsIFJPT00oImxpY2h0dW5ndyIpKTsKKyAgIEFkZEV4aXQoInN1ZWRlbiIsIFJPT00oImxpY2h0dW5ncyIpKTsKKyAgIEFkZEV4aXQoInN1ZWR3ZXN0ZW4iLCBST09NKCJsaWNodHVuZ3N3IikpOworICAgQWRkRXhpdCgic3VlZG9zdGVuIiwgUk9PTSgibGljaHR1bmdzbyIpKTsKKyAgIEFkZEl0ZW0oTlBDKCJ1bGluaWEiKSwgUkVGUkVTSF9SRU1PVkUsIDEpOworICAgQWRkQ21kKCh7ImJhZCIsICJiYWRlIiwgInNjaHdpbW0iLCAic2Nod2ltbWUiLCAidGF1Y2giLCAidGF1Y2hlIn0pLCAiY21kX3NjaHdpbW1lbiIpOworICAgQWRkQ21kKCh7InRyaW5rIiwgInRyaW5rZSJ9KSwgImNtZF90cmlua2VuIik7CisgICBBZGRDbWQoKHsicGZsdWVjayIsICJwZmx1ZWNrZSJ9KSwgImNtZF9wZmx1ZWNrZW4iKTsKKyAgIC8vIERldGFpbCBwZXIgSGFuZCBoaW56dWZ1ZWdlbiwgZGEgR2V0UGxhbnQgYW5zdGVsbGUgdm9uIEFkZFBsYW50CisgICAvLyB2ZXJ3ZW5kZXQgd2lyZC4KKyAgIEFkZFBsYW50RGV0YWlsKE9CSigiaGFobmVuZnVzcyIpKTsKK30KKworc3RhdGljIGludCBjbWRfdHJpbmtlbihzdHJpbmcgc3RyKQoreworICAgaW50IGRyaW5rOworICAgb2JqZWN0IG9iOworICAgaWYgKG1lbWJlcigoeyJ3YXNzZXIiLCAid2Fzc2VyIGF1cyB0ZWljaCIsICJ3YXNzZXIgYXVzIHR1ZW1wZWwiLAorICAgICAgICAgICAgICAgICJ3YXNzZXIgYXVzIHNlZSIsICJhdXMgdGVpY2giLCAiYXVzIHR1ZW1wZWwiLCAiYXVzIHdhc3NlciIsCisgICAgICAgICAgICAgICAgImF1cyBzZWUifSksIHN0cik9PS0xKSB7CisgICAgICBub3RpZnlfZmFpbCgiV2FzIG1vZWNodGVzdCBEdSB0cmlua2VuP1xuIik7CisgICAgICByZXR1cm4gMDsKKyAgIH0KKyAgIGlmICgob2I9cHJlc2VudChXQUxESUQoImZlZSIpLCBNRSkpICYmICFvYi0+SXNFbmVteShQTCkpIHsKKyAgICAgIHdyaXRlKEJTKCJEaWUgV2FsZGZlZSBzY2hlaW50IERlaW5lbiBFbnRzY2hsdXNzIGVpbiB3ZW5pZyB2b24gZGVtICIKKyAgICAgICAgICsiV2Fzc2VyIHp1IGtvc3RlbiwgYmVtZXJrdCB6dSBoYWJlbiB1bmQgc3RyYWZ0IERpY2ggbWl0IGVpbmVtICIKKyAgICAgICAgICsibWFobmVuZGVuIEJsaWNrIGFiLiBEdSB1ZWJlcmxlZ3N0IGVzIERpciBhbHNvIG5vY2ggZWlubWFsIHVuZCAiCisgICAgICAgICArImxhZXNzdCB2b24gRGVpbmVtIFZvcmhhYmVuIGFiLiIpKTsKKyAgICAgIHJldHVybiAxOworICAgfQorICAgLy8gZGFzIHRhbmtlbiBhbSBXYXNzZXIgaXN0IHVtc29uc3QsIGVzIGhlaWx0IGRhYmVpIHdpZSBlaW4KKyAgIC8vIEtuZWlwZW5nZXRyYWVuayBkYXMgZ2VuYXUgMSBNdWVuemUga29zdGV0LiBHZWhlaWx0IHdlcmRlbiBudXIgU1AKKyAgIC8vIEVpbiBNaXNzYnJhdWNoIGlzdCBpbSBXYWxkIGF1c2dlc2NobG9zc2VuLCBiencuIG1hbiBtdWVzc3RlIGRlbgorICAgLy8gZ2VzYW10ZW4gV2FsZCBsZWVybWV0emVsbiB1bmQga2FubiBkYW5uIHVlYmVuIGJpcyB6dW0gbmFlY2hzdGVuCisgICAvLyByZXNldC4gQmVpIEtvc3RlbiB2b24gZWluZXIgTXVlbnplIHBybyBIZWlsdW5nIGlzdCBlcyBzZWhyIGZyYWdsaWNoCisgICAvLyBvYiBzaWNoIGRhcyBsb2hudC4uLi4gOikKKyAgIGRyaW5rPShQTC0+UXVlcnlQcm9wKFBfTUFYX0RSSU5LKSkgLSAoUEwtPlF1ZXJ5UHJvcChQX0RSSU5LKSk7CisgICBpZiAoZHJpbms+MTApIGRyaW5rPTEwOyAvLyBuaWUgbWVociBhbHMgZnVlciAxMCBzb2FrIHRhbmtlbi4uLgorICAgaWYgKGRyaW5rIDw9IDAgfHwgIVBMLT5kcmlua19zb2Z0KGRyaW5rLCAxKSkgeworICAgICAgd3JpdGUoIkR1IGJpc3Qgc28gdm9sbCwgRHUga2FubnN0IGxlaWRlciB3aXJrbGljaCBuaWNodHMgbWVociB0cmlua2VuLi4uXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgfQorICAgd3JpdGUoIkR1IGdlaHN0IGFuIGRlbiBSYW5kIGRlcyBXZWloZXJzIHVuZCBuaW1tc3QgZWluZW4ga3JhZWZ0aWdlbiBTY2hsdWNrIHZvbiBkZW1cbiIKKyAgICAgICAgKyJXYXNzZXIuIFNvZ2xlaWNoIHNwdWVyc3QgRHUsIHdpZSBEZWluZSBtZW50YWxlbiBLcmFlZnRlIGxhbmdzYW0gZ2VzdGFlcmt0XG4iCisgICAgICAgICsid2VyZGVuLlxuIik7CisgICBpZiAoUEwtPmRyaW5rX3NvZnQoZHJpbmspKSB7IC8vIHNvYWsgZ3V0c2NocmVpYmVuIGVyZm9sZ3JlaWNoPworICAgICAgUEwtPmJ1ZmZlcl9zcChkcmluayo2LCA1KTsKKyAgICAgIFBMLT5TZXRQcm9wKFpBVUJFUldBTEQsIHRpbWUoKStBR0dSRVNTSVZFX1RJTUUpOworICAgfQorICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY21kX3NjaHdpbW1lbihzdHJpbmcgc3RyKQoreworICAgc3RyaW5nIHZlcmI7CisKKyAgIC8vIGJlc29uZGVyZSBFaWdlbnNjaGFmdCBkZXIgc2NobHVlc3NlbHdvZXJ0ZXIgYXVzbnV0emVuLi4uIDopCisgICB2ZXJiPShxdWVyeV92ZXJiKCl8fCIiKTsKKyAgIGlmICh2ZXJiWzwxXSE9J2UnKSB2ZXJiKz0iZSI7CisgICBpZiAobWVtYmVyKCh7ImluIHRlaWNoIiwgImluIHdlaWhlciIsICJpbiB0dWVtcGVsIiwgImluIHNlZSJ9KSwgc3RyKT09LTEpIHsKKyAgICAgIG5vdGlmeV9mYWlsKCJXb3JpbiB3aWxsc3QgRHUgIit2ZXJiKyJuP1xuIik7CisgICAgICByZXR1cm4gMDsKKyAgIH0KKyAgIHN0cj1jYXBpdGFsaXplKHN0clszLi5dKTsgLy8gImluICIgYWJzY2huZWlkZW4uLi4KKyAgIGlmIChwcmVzZW50KFdBTERJRCgiZmVlIiksIE1FKSkgeworICAgICAgd3JpdGUoQlMoIkRpZSBXYWxkZmVlIHNjaGVpbnQgRGVpbmVuIEVudHNjaGx1c3MgaW0gIitzdHIrIiAiK3ZlcmIKKyAgICAgICAgICsibiB6dSBnZWhuIGlyZ2VuZHdpZSBiZW1lcmt0IHp1IGhhYmVuIHVuZCBzdHJhZnQgRGljaCBtaXQgZWluZW0gIgorICAgICAgICAgKyJtYWhuZW5kZW4gQmxpY2sgYWIuIERlaW5lIEx1c3QgenVtICIrY2FwaXRhbGl6ZSh2ZXJiKQorICAgICAgICAgKyJuIHNpbmt0IHNvZ2xlaWNoIGdlZ2VuIG51bGwsIGRlbm4gRHUgdmVyc3B1ZXJzdCBrZWluZSBncm9zc2UgIgorICAgICAgICAgKyJMdXN0IERpY2ggbWl0IGRlciBXYWxkZmVlIGFuenVsZWdlbi4iKSk7CisgICAgICByZXR1cm4gMTsKKyAgIH0KKyAgIHdyaXRlKEJTKCJNdXRpZyBnZWhzdCBEdSBlaW5lbiBTY2hyaXR0IGlucyBXYXNzZXIsIGRhIHVlYmVya29tbXQgRGljaCBhdWNoICIKKyAgICAgICAgICAgKyJzY2hvbiBlaW4gc2VsdHNhbWVzIGtyaWJiZWxuIGFtIGdhbnplbiBLb2VycGVyLiBJbiB3aW5kZXNlaWxlICIKKyAgICAgICAgICAgKyJoYXN0IER1IGRlbiAiK3N0cisiIGF1Y2ggc2Nob24gd2llZGVyIHZlcmxhc3Nlbi4iKSk7CisgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjbWRfcGZsdWVja2VuKHN0cmluZyBzdHIpCit7CisgICBvYmplY3Qgb2I7CisgICBub3RpZnlfZmFpbCgiV0FTIG1vZWNodGVzdCBEdSBwZmx1ZWNrZW4/XG4iKTsKKyAgIGlmIChtZW1iZXIoKHsiaGFobmVuZnVzcyIsCisgICAgICAgICAgICAgICAgIndhc3Nlci1oYWhuZW5mdXNzIiwKKyAgICAgICAgICAgICAgICAid2Vpc3NlciBoYWhuZW5mdXNzIiwKKyAgICAgICAgICAgICAgICAid2Vpc3NlciB3YXNzZXItaGFobmVuZnVzcyJ9KSwgc3RyKTwwKSByZXR1cm4gMDsKKyAgIGlmICgob2I9cHJlc2VudChXQUxESUQoImZlZSIpLCBNRSkpICYmICFvYi0+SXNFbmVteShQTCkpIHsKKyAgICAgIHdyaXRlKEJTKCJEaWUgV2FsZGZlZSBzY2hlaW50IERlaW4gVm9yaGFiZW4gYmVtZXJrdCB6dSBoYWJlbiB1bmQgIgorICAgICAgICAgKyJzdHJhZnQgRGljaCBtaXQgZWluZW0gbWFobmVuZGVuIEJsaWNrIGFiLiBEdSB1ZWJlcmxlZ3N0IGVzIERpciAiCisgICAgICAgICArIndpZWRlciBhbmRlcnMgdW5kIGxhZXNzdCB2b24gRGVpbmVtIFZvcmhhYmVuIGFiLCBzb2xhbmdlIGRpZSAiCisgICAgICAgICArIkZlZSBoaWVyIHdhY2h0LiIpKTsKKyAgICAgIHJldHVybiAxOworICAgfQorICAgb2I9R2V0UGxhbnQoT0JKKCJoYWhuZW5mdXNzIikpOworICAgaWYgKG9iamVjdHAob2IpKSB7CisgICAgICBpZiAob2ItPm1vdmUoUEwsIE1fR0VUKT09MSkKKyAgICAgICAgICB3cml0ZShCUygiVm9yc2ljaHRpZyBwZmx1ZWNrc3QgRHUgIitvYi0+bmFtZShXRU4sIDEpCisgICAgICAgICAgICAgICAgICArIiB1bmQgbmltbXN0ICIrb2ItPlF1ZXJ5UHJvbm91bihXRU4pKyIgYW4gRGljaC4iKSk7CisgICAgICBlbHNlIHdyaXRlKEJTKCJWb3JzaWNodGlnIHBmbHVlY2tzdCBEdSAiK29iLT5uYW1lKFdFTiwgMSkrIiBrYW5uc3QgIgorICAgICAgICAgICAgICAgICAgK29iLT5RdWVyeVByb25vdW4oV0VOKSsiIGFiZXIgbmljaHQgbmVobWVuLiIpKTsKKyAgIH0KKyAgIGVsc2UgaWYgKCFvYikKKyAgICAgIHdyaXRlKEJTKCJEZXIgSGFobmVuZnVzcyBpc3Qgbm9jaCBuaWNodCB3aWVkZXIgd2VpdCBnZW51ZyAiCisgICAgICAgICAgICAgICsibmFjaGdld2FjaHNlbiB1bSBpaG4gcGZsdWVja2VuIHp1IGtvZW5uZW4uIikpOworICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJpbmcgX3F1ZXJ5X2ludF9sb25nKCkKK3sKKyAgIGlmIChwcmVzZW50KFdBTERJRCgiZmVlIiksIE1FKSkKKyAgICAgIHJldHVybgorICAgICAgICAiRHUgc3RlaHN0IG51biBhbiBlaW5lbSBrbGVpbmVuIHZlcnd1bnNjaGVuZW4gV2VpaGVyLCBpbm1pdHRlbiBkZXMgWmF1YmVyd2FsZHMuXG4iCisgICAgICAgKyJBdWYgZGVtIFdhc3NlciBzY2h3aW1tZW4gemFobHJlaWNoZSBTZWVyb3NlbiBpbiBkZW4gdmVyc2NoaWVkZW5zdGVuIEZhcmJlblxuIgorICAgICAgICsidW5kIGhpZXIgdW5kIGRvcnQgc2Nod2lycnQgZWluZSBMaWJlbGxlIGluIGRlciBMdWZ0LiBNaXR0ZW4gdWViZXIgZGVtIFdlaWhlclxuIgorICAgICAgICsic2Nod2VidCBlaW5lIHd1bmRlcnNjaG9lbmUgV2FsZGZlZSBpbiBkZXIgTHVmdCB1bmQgc2NoZWludCBkZW4gV2VpaGVyIHp1XG4iCisgICAgICAgKyJiZXdhY2hlbi4gSXJnZW5kZXR3YXMgZ2VoZWltbmlzdm9sbGVzIHNjaGVpbnQgZXMgbWl0IGRlbSBXZWloZXIgYXVmIHNpY2hcbiIKKyAgICAgICArInp1IGhhYmVuLCBudXIgd2FzP1xuIjsKKyAgIHJldHVybgorICAgICAiRHUgc3RlaHN0IG51biBhbiBlaW5lbSBrbGVpbmVuIHZlcnd1bnNjaGVuZW4gV2VpaGVyLCBpbm1pdHRlbiBkZXMgWmF1YmVyd2FsZHMuXG4iCisgICAgKyJBdWYgZGVtIFdhc3NlciBzY2h3aW1tZW4gemFobHJlaWNoZSBTZWVyb3NlbiBpbiBkZW4gdmVyc2NoaWVkZW5zdGVuIEZhcmJlbiB1bmRcbiIKKyAgICArImhpZXIgdW5kIGRvcnQgc2Nod2lycnQgZWluZSBMaWJlbGxlIGluIGRlciBMdWZ0LiBBbGxlcyBzY2hlaW50IGhpZXIgc2VoclxuIgorICAgICsiZnJpZWRsaWNoIHp1IHNlaW4sIGZhc3QgZWluIHdlbmlnIHp1IGZyaWVkbGljaC4gSXJnZW5kZXR3YXMgZ2VoZWltbmlzdm9sbGVzXG4iCisgICAgKyJzY2hlaW50IGVzIG1pdCBkaWVzZW0gV2VpaGVyIGF1ZiBzaWNoIHp1IGhhYmVuLCBudXIgd2FzP1xuIjsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9yb29tL3ZpcnR1YWxfY29tcGlsZXIuYyBiL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9yb29tL3ZpcnR1YWxfY29tcGlsZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2M0ZDVjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS96YXViZXJ3YWxkL3Jvb20vdmlydHVhbF9jb21waWxlci5jCkBAIC0wLDAgKzEsMTMzIEBACisvLyAoYykgYnkgUGFkcmVpYyAoUGFkcmVpY0BtZy5tdWQuZGUpCisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8dl9jb21waWxlci5oPgorI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisjaW5jbHVkZSAiL3Avc2VydmljZS9wYWRyZWljL2tyYWV1dGVyL3BsYW50LmgiCisKK2luaGVyaXQgInN0ZC92aXJ0dWFsL3ZfY29tcGlsZXIiOworCitjcmVhdGUoKQoreworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfU1REX09CSkVDVCwgUk9PTSgic3RkbGljaHR1bmciKSk7CisgIFNldFByb3AoUF9DT01QSUxFUl9QQVRILCBST09NKCIiKSk7Cit9CisKK3N0cmluZyBWYWxpZGF0ZShzdHJpbmcgZmlsZSkKK3sKKyAgZmlsZT06OlZhbGlkYXRlKGZpbGUpOworICBzd2l0Y2goZmlsZSkgeyAKKyAgICAgY2FzZSAibGljaHR1bmdzbyI6CisgICAgIGNhc2UgImxpY2h0dW5nbyI6CisgICAgIGNhc2UgImxpY2h0dW5nbm8iOgorICAgICBjYXNlICJsaWNodHVuZ24iOgorICAgICBjYXNlICJsaWNodHVuZ3MiOgorICAgICBjYXNlICJsaWNodHVuZ253IjoKKyAgICAgY2FzZSAibGljaHR1bmd3IjoKKyAgICAgY2FzZSAibGljaHR1bmdzdyI6ICByZXR1cm4gZmlsZTsKKyAgICAgZGVmYXVsdDoKKyAgfQorfQorICAgICAgICAgCittaXhlZCBDdXN0b21pemVPYmplY3QoKQoreworICBzdHJpbmcgZmlsZTsKKyAgZmlsZT1WYWxpZGF0ZSg6OkN1c3RvbWl6ZU9iamVjdCgpKTsKKyAgaWYgKCFyYW5kb20oMykpIFBPLT5BZGRJdGVtKE5QQygibGF1ZmVpY2hlIiksIFJFRlJFU0hfREVTVFJVQ1QsIChbTU5QQ19IT01FOiBST09NKGZpbGUpXSkgKTsKKyAgc3dpdGNoKGZpbGUpIHsKKyAgICAgY2FzZSAibGljaHR1bmdubyI6CisgICAgICAgUE8tPkFkZEV4aXQoIndlc3RlbiIsIFJPT00oImxpY2h0dW5nbiIpKTsKKyAgICAgICBQTy0+QWRkRXhpdCgic3VlZGVuIiwgUk9PTSgibGljaHR1bmdvIikpOworICAgICAgIFBPLT5BZGRFeGl0KCJzdWVkd2VzdGVuIiwgUk9PTSgidHVlbXBlbCIpKTsKKyAgICAgICBQTy0+QWRkRXhpdCgic3VlZG9zdGVuIiwgUk9PTSgid2VnMiIpKTsKKyAgICAgICBQTy0+U2V0UHJvcChFWFRSQV9MT05HLAorICAgICAgICAgIiBJbSBTdWVkb3N0ZW4gYmVmaW5kZXQgc2ljaCBkZXIgV2FsZHdlZywgdWViZXIgZGVuIER1IGRlbiBXYWxkIHdpZWRlciAiCisgICAgICAgICsidmVybGFzc2VuIGthbm5zdC4iKTsKKyAgICAgICByZXR1cm4gZmlsZTsKKworICAgICBjYXNlICJsaWNodHVuZ28iOgorICAgICAgIFBPLT5BZGRFeGl0KCJub3JkZW4iLCBST09NKCJsaWNodHVuZ25vIikpOworICAgICAgIFBPLT5BZGRFeGl0KCJzdWVkZW4iLCBST09NKCJsaWNodHVuZ3NvIikpOworICAgICAgIFBPLT5BZGRFeGl0KCJ3ZXN0ZW4iLCBST09NKCJ0dWVtcGVsIikpOworICAgICAgIFBPLT5BZGRFeGl0KCJvc3RlbiIsIFJPT00oIndlZzIiKSk7CisgICAgICAgUE8tPlNldFByb3AoRVhUUkFfTE9ORywKKyAgICAgICAgICIgSW0gT3N0ZW4gYmVmaW5kZXQgc2ljaCBkZXIgV2FsZHdlZywgdWViZXIgZGVuIER1IGRlbiBXYWxkIHdpZWRlciAiCisgICAgICAgICsidmVybGFzc2VuIGthbm5zdC4iKTsKKyAgICAgICByZXR1cm4gZmlsZTsKKworICAgICBjYXNlICJsaWNodHVuZ3NvIjoKKyAgICAgICBQTy0+QWRkRXhpdCgid2VzdGVuIiwgUk9PTSgibGljaHR1bmdzIikpOworICAgICAgIFBPLT5BZGRFeGl0KCJub3JkZW4iLCBST09NKCJsaWNodHVuZ28iKSk7CisgICAgICAgUE8tPkFkZEV4aXQoIm5vcmR3ZXN0ZW4iLCBST09NKCJ0dWVtcGVsIikpOworICAgICAgIFBPLT5BZGRFeGl0KCJub3Jkb3N0ZW4iLCBST09NKCJ3ZWcyIikpOworICAgICAgIFBPLT5TZXRQcm9wKEVYVFJBX0xPTkcsCisgICAgICAgICAiIEltIE5vcmRvc3RlbiBiZWZpbmRldCBzaWNoIGRlciBXYWxkd2VnLCB1ZWJlciBkZW4gRHUgZGVuIFdhbGQgd2llZGVyICIKKyAgICAgICAgKyJ2ZXJsYXNzZW4ga2FubnN0LiIpOworICAgICAgIFBPLT5BZGRJdGVtKE5QQygicmllc2UiKSwgUkVGUkVTSF9ERVNUUlVDVCk7CisgICAgICAgcmV0dXJuIGZpbGU7CisKKyAgICAgY2FzZSAibGljaHR1bmdzIjoKKyAgICAgICBQTy0+QWRkRXhpdCgid2VzdGVuIiwgUk9PTSgibGljaHR1bmdzdyIpKTsKKyAgICAgICBQTy0+QWRkRXhpdCgib3N0ZW4iLCBST09NKCJsaWNodHVuZ3NvIikpOworICAgICAgIFBPLT5BZGRFeGl0KCJub3JkZW4iLCBST09NKCJ0dWVtcGVsIikpOworICAgICAgIFBPLT5TZXRQcm9wKEVYVFJBX0xPTkcsCisgICAgICAgICAiIEluIGRlciBXaWVzZSBzaWVoc3QgRHUgYW4gZWluZXIgU3RlbGxlIGV0d2FzIEtsZWUgd2FjaHNlbi4iKTsKKyAgICAgICBQTy0+QWRkUGxhbnQoQklUVEVSS0xFRSk7CisgICAgICAgLy8gImtsZWUiIF9uYWNoXyBkZW0gQWRkUGxhbnQgZWluZnVlZ2VuLCBkYW1pdCBkaWUgcmVzdGxpY2hlbiBEZXRhaWxzCisgICAgICAgLy8gd2llIEJpdHRlcmtsZWUgdHJvdHpkZW0gbm9jaCBlaW5nZWZ1ZWd0IHdlcmRlbgorICAgICAgIFBPLT5SZW1vdmVEZXRhaWwoKHsia2xlZSJ9KSk7CisgICAgICAgUE8tPkFkZERldGFpbCgoeyJzdGVsbGUiLCAia2xlZSJ9KSwKKyAgICAgICAgICJCZWkgZGVyIFN0ZWxsZSBzY2hlaW50IGVzIHNpY2ggdW56d2VpZmVsaGFmdCB1bSBCaXR0ZXJrbGVlIHp1IGhhbmRlbG4uXG4iKTsKKyAgICAgICBQTy0+QWRkQ21kKCJzdWVkZW4iLCAiY21kX3N1ZWRlbiIpOworICAgICAgIHJldHVybiBmaWxlOworCisgICAgIGNhc2UgImxpY2h0dW5nbiI6CisgICAgICAgUE8tPkFkZEV4aXQoIndlc3RlbiIsIFJPT00oImxpY2h0dW5nbnciKSk7CisgICAgICAgUE8tPkFkZEV4aXQoIm9zdGVuIiwgUk9PTSgibGljaHR1bmdubyIpKTsKKyAgICAgICBQTy0+QWRkRXhpdCgic3VlZGVuIiwgUk9PTSgidHVlbXBlbCIpKTsKKyAgICAgICBQTy0+U2V0UHJvcChFWFRSQV9MT05HLCAiIEFtIFJhbmQgZGVyIFdpZXNlIGVudGRlY2t0IER1IGVpbmlnZSBrbGVpbmUgUGlsemUgaW0gR3Jhcy4iKTsKKyAgICAgICBQTy0+QWRkQ21kKCh7ImVzc2UiLCAiaXNzIiwgInBmbHVlY2siLCAicGZsdWVja2UifSksICJjbWRfcGlsemUiKTsKKyAgICAgICBQTy0+QWRkRGV0YWlsKCh7InBpbHoiLCAicGlsemUiLCAic2NoaW1tZXIifSksCisgICAgICAgICAiRGllIFBpbHplIGhhYmVuIGVpbmVuIGFldXNzZXJzdCBzZWx0c2FtZW4gbWV0YWxsaXNjaGVtIFNjaGltbWVyIHVuZFxuIgorICAgICAgICArInZlcmJyZWl0ZW4gZWluZW4gc2VociBhbmdlbmVobWVuIHN1ZXNzbGljaGVuIER1ZnQgaW0gUmF1bS5cbiIpOworICAgICAgIFBPLT5BZGRTbWVsbHMoKHsicGlseiIsICJwaWx6ZSJ9KSwKKyAgICAgICAgICJEaWUgUGlsemUgdmVyYnJlaXRlbiBlaW5lbiBzZWhyIHN1ZXNzbGljaGVuIER1ZnQuXG4iKTsKKyAgICAgICBQTy0+QWRkU21lbGxzKCJkdWZ0IiwgIkRlciBEdWZ0IGlzdCBlaWdlbnRsaWNoIHNlaHIgYmVmcmVpZW5kIHVuZCBhbmdlbmVobS5cbiIpOworICAgICAgIHJldHVybiBmaWxlOworCisgICAgIGNhc2UgImxpY2h0dW5nbnciOgorICAgICAgIFBPLT5BZGRFeGl0KCJ3ZXN0ZW4iLCBST09NKCJzY2h1bGUiKSk7CisgICAgICAgUE8tPkFkZEV4aXQoIm9zdGVuIiwgUk9PTSgibGljaHR1bmduIikpOworICAgICAgIFBPLT5BZGRFeGl0KCJzdWVkZW4iLCBST09NKCJsaWNodHVuZ3ciKSk7CisgICAgICAgUE8tPkFkZEV4aXQoInN1ZWRvc3RlbiIsIFJPT00oInR1ZW1wZWwiKSk7CisgICAgICAgUE8tPlNldFByb3AoRVhUUkFfTE9ORywKKyAgICAgICAgICIgTmFjaCBXZXN0ZW4ga2FubnN0IER1IGVpbiBTdHVlY2sgaW4gZGVuIFdhbGQgaGluZWluIGdlaG4uIik7CisgICAgICAgcmV0dXJuIGZpbGU7CisKKyAgICAgY2FzZSAibGljaHR1bmd3IjoKKyAgICAgICBQTy0+QWRkRXhpdCgibm9yZGVuIiwgUk9PTSgibGljaHR1bmdudyIpKTsKKyAgICAgICBQTy0+QWRkRXhpdCgic3VlZGVuIiwgUk9PTSgibGljaHR1bmdzdyIpKTsKKyAgICAgICBQTy0+QWRkRXhpdCgib3N0ZW4iLCBST09NKCJ0dWVtcGVsIikpOworICAgICAgIFBPLT5TZXRQcm9wKEVYVFJBX0xPTkcsICIgQW0gV2FsZHJhbmQgc3RlaGVuIGVpbmlnZSBibGFldWxpY2hlIEZhcm5lLiIpOworICAgICAgIFBPLT5BZGRDbWQoKHsiZXNzZSIsICJpc3MiLCAicGZsdWVjayIsICJwZmx1ZWNrZSJ9KSwgImNtZF9mYXJuZSIpOworICAgICAgIFBPLT5BZGREZXRhaWwoKHsiZmFybiIsICJmYXJuZSJ9KSwKKyAgICAgICAgICJEaWUgYmxhZXVsaWNoZW4gRmFybmUgc2luZCB3aXJrbGljaCBzZWhyIG1lcmt3dWVyZGlnLiBzb2V0d2FzIGhhc3QgRHUgYmlzaGVyXG4iCisgICAgICAgICsibm9jaCBuaXJnZW5kd28gZ2VzZWhuLiBJcmdlbmRldHdhcyBiZXNvbmRlcmVzIGhhdCBlcyBzaWNoZXJsaWNoIGRhbWl0IGF1ZiBzaWNoLlxuIik7CisgICAgICAgcmV0dXJuIGZpbGU7CisKKyAgICAgY2FzZSAibGljaHR1bmdzdyI6CisgICAgICAgUE8tPkFkZEV4aXQoIm9zdGVuIiwgUk9PTSgibGljaHR1bmdzIikpOworICAgICAgIFBPLT5BZGRFeGl0KCJub3JkZW4iLCBST09NKCJsaWNodHVuZ3ciKSk7CisgICAgICAgUE8tPkFkZEV4aXQoIm5vcmRvc3RlbiIsIFJPT00oInR1ZW1wZWwiKSk7CisgICAgICAgUE8tPkFkZEV4aXQoInN1ZWR3ZXN0ZW4iLCBST09NKCJzdGVpbiIpKTsKKyAgICAgICBQTy0+U2V0UHJvcChFWFRSQV9MT05HLAorICAgICAgICAgIiBOYWNoIFN1ZWR3ZXN0ZW4ga2FubnN0IER1IGVpbiBTdHVlY2sgaW4gZGVuIFdhbGQgaGluZWluIGdlaG4uIik7CisgICAgICAgcmV0dXJuIGZpbGU7CisKKyAgICAgZGVmYXVsdDogcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIGZpbGU7Cit9CisKK2ludCBOb1BhcmFPYmplY3RzKCkgeyByZXR1cm4gMTsgfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS96YXViZXJ3YWxkL3Jvb20vd2VnMS5jIGIvZG9jL2JlaXNwaWVsZS96YXViZXJ3YWxkL3Jvb20vd2VnMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2OWI3M2YKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvcm9vbS93ZWcxLmMKQEAgLTAsMCArMSw3NSBAQAorLy8gKGMpIGJ5IFBhZHJlaWMgKFBhZHJlaWNAbWcubXVkLmRlKQorCisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKworaW5oZXJpdCBST09NKCJzdGRyb29tIik7CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgIDo6Y3JlYXRlKCk7CisgICBTZXRQcm9wKFBfSU5ET09SUywgMCk7CisgICBTZXRQcm9wKFBfTElHSFQsIDApOworICAgU2V0UHJvcChQX0lOVF9TSE9SVCwgIkF1ZiBlaW5lbSBXYWxkd2VnIGltIFphdWJlcndhbGQiKTsKKyAgIEFkZERldGFpbCgoeyJibGFldHRlcmRhY2giLCAiZGFjaCIsICJiYWV1bWUifSksCisgICAgICJEaWUgQmFldW1lIHJlY2h0cyB1bmQgbGlua3MgZGVzIFdlZ2VzIGJpbGRlbiB1ZWJlciBkZW0gV2VnIGVpbiBzbyBkaWNodGVzXG4iCisgICAgKyJCbGFldHRlcmRhY2gsIGRhcyBzbyBndXQgd2llIHVlYmVyaGF1cHQga2VpbiBTb25uZW5saWNodCBtZWhyIGF1ZiBkZW4gV2VnXG4iCisgICAgKyJzY2hlaW50LlxuIik7CisgICBBZGRTcGVjaWFsRGV0YWlsKCJzemVuZSIsICJfcXVlcnlfaW50X2xvbmciKTsKKyAgIEFkZFNwZWNpYWxEZXRhaWwoKHsid2VnIiwgIndlZ2VzIiwgIndhbGR3ZWciLCAiYm9kZW4ifSksICJkZXRfd2VnIik7CisgICBBZGREZXRhaWwoKHsibGljaHQiLCAic29ubmVubGljaHQiLCAic29ubmVuc3RyYWhsZW4ifSksCisgICAgICJEdXJjaCBkYXMgZGljaHRlIEJsYWV0dGVyZGFjaCBzY2hhZmZlbiBlcyBkaWUgU29ubmVuc3RyYWhsZW4gbnVyIG5vY2ggc2VoclxuIgorICAgICsidmVyZWluemVsdCBiaXMgYXVmIGRlbiBXZWcgZHVyY2h6dWtvbW1lbi4gRGFkdXJjaCBpc3QgZXMgaGllciB1bnRlbiByZWxhdGl2XG4iCisgICAgKyJGZXVjaHQsIGthbHQgdW5kIGR1bmtlbC5cbiIpOworICAgQWRkRGV0YWlsKCh7ImhpbW1lbCIsICJzb25uZSIsICJ3b2xrZSIsICJ3b2xrZW4ifSksCisgICAgICJEYXMgQmxhZXR0ZXJkYWNoIGlzdCBoaWVyIHNvIGRpY2h0LCBkYXMgRHUgZGVuIEhpbW1lbCBuaWNodCBtYWwgbWVociBlcmFobmVuXG4iCisgICAgKyJrYW5uc3QuIER1IHdlaXNzdCBuaWNodCBtYWwsIG9iIGVzIHJlZ25ldCBvZGVyIG9iIGRpZSBTb25uZSBzY2hlaW50LlxuIik7CisgICBBZGREZXRhaWwoImZldWNodCIsCisgICAgICJCbG9zcyB3ZWlsIGZldWNodCBncm9zc2dlc2NocmllYmVuIGlzdCBlcyBub2NoIGxhbmdlIGtlaW4gU3Vic3RhbnRpdiwgd2VublxuIgorICAgICsidWViZXJoYXVwdCBoZWlzc3QgZXMgZGFubiBfRmV1Y2h0aWdrZWl0XyA6KS5cbiIpOworICAgQWRkRGV0YWlsKCJzdWJzdGFudGl2IiwgIk5pY2h0IGplZGVzIFN1YnN0YW50aXYgaXN0IGVpbiBzaW5udm9sbGVzIERldGFpbCA6KVxuIik7CisgICBBZGREZXRhaWwoImZldWNodGlna2VpdCIsICJFaW4gd2VuaWcgZmV1Y2h0LCB3aWUgbWFuIGVzIGhhbHQgYXVzIGplZGVtIFdhbGQgc28ga2VubnQuXG4iKTsKKyAgIEFkZERldGFpbCgia2FlbHRlIiwKKyAgICAgIkR1cmNoIGRhcyB3ZW5pZ2UgU29ubmVubGljaHQsIGRhcyBiaXMgbmFjaCBoaWVyIHVudGVuIGR1cmNoZHJpbmd0LCBpc3QgZXNcbiIKKyAgICArImhpZXIgdmVyaGFlbHRuaXNtYWVzc2lnIGZyaXNjaC5cbiIpOworICAgQWRkRGV0YWlsKCJkdW5rZWxoZWl0IiwKKyAgICAgIldlbm4gZXMgaGVsbCBpc3QsIGlzdCBlcyBuaWNodCBtZWhyIGR1bmtlbCB1bmQgd2VubiBlcyBuaWNodCBoZWxsIGlzdCwga2FubnN0XG4iCisgICAgKyJEdSBuaWNodCB2aWVsIHNlaG4uIFdpZSBhbHNvIHdpbGxzdCBEdSBkaWUgRHVua2VsaGVpdCB1bnRlcnN1Y2hlbiA6KT9cbiIpOworICAgQWRkRGV0YWlsKCJfZmV1Y2h0aWdrZWl0XyIsICJNZWluZSBHdWV0ZSwgbmltbSBkb2NoIG5pY2ggaW1tZXIgYWxsZXMgZ2xlaWNoIF9zb18gd29lcnRsaWNoLlxuIik7CisgICBBZGREZXRhaWwoImd1ZXRlIiwgIlNlaSBsaWViZXIgdm9yc2ljaHRpZywgc29vIGd1ZXRpZyBiaW4gaWNoIG51IGF1Y2ggbmljaHQgOikuXG4iKTsKKyAgIEFkZERldGFpbCgoeyJsaWNodHF1ZWxsZSIsICJuYWNodHNpY2h0In0pLAorICAgICAiSGllciBpc3QgZXMgZWlnZW50bGljaCB2ZXJkYW1tdCBkdW5rZWwgdW5kIG9obmUgTmFjaHRzaWNodCBvZGVyIGVpbmUgZWlnZW5lXG4iCisgICAgKyJMaWNodHF1ZWxsZSwga29lbm50ZXN0IER1IGhpZXIgX25pY2h0c18gc2Vobi5cbiIpOworICAgQWRkRGV0YWlsKCh7ImF1c2dhbmciLCAib3N0ZW4ifSksCisgICAgICJXZW5uIER1IGRlbSBXZWcgUmljaHR1bmcgT3N0ZW4gZm9sZ3N0LCBkYW5uIGtvbW1zdCBEdSB6aWVtbGljaCBiYWxkIHdpZWRlclxuIgorICAgICsiUmljaHR1bmcgQXVzZ2FuZy5cbiIpOworICAgQWRkRGV0YWlsKCh7InN0dWVjayIsICJ3YWxkIiwgIndlc3RlbiJ9KSwKKyAgICAgIk5hamEuLiBEdSBzdGVoc3QgendhciBzY2hvbiBpbSBXYWxkIGRyaW4sIGFiZXIgbmFjaCBXZXN0ZW4gaGluLCBnZWhzdCBlcyBub2NoXG4iCisgICAgKyJlaW4gU3R1ZWNrIHRpZWZlciBoaW5laW4uXG4iKTsKKyAgIEFkZEV4aXQoIm9zdGVuIiwgUk9PTSgiZWluZ2FuZyIpKTsKKyAgIEFkZEV4aXQoIndlc3RlbiIsIFJPT00oIndlZzIiKSk7CisgICBBZGRJdGVtKE5QQygid2FlY2h0ZXIiKSwgUkVGUkVTSF9SRU1PVkUsIDEpOworfQorCitzdGF0aWMgc3RyaW5nIGRldF93ZWcoKQoreworICAgaWYgKHByZXNlbnQoV0FMRElEKCJ3YWVjaHRlcmVpY2hlIiksIE1FKSkKKyAgICAgIHJldHVybiAiTWl0dGVuIGF1ZiBkZW0gV2VnIHN0ZWh0IGRlciBXYWVjaHRlciBkZXMgV2FsZGVzIHVuZCBrb250cm9sbGllcnQgc2VociBnZW5hdSxcbiIKKyAgICAgICAgICAgICsid2VyIGluIGRlbiBXYWxkIGhpbmVpbiBkYXJmIHVuZCB3ZXIgbmljaHQuIEVpZ2VudGxpY2ggaXN0IGVyIGplZG9jaCBkZW5cbiIKKyAgICAgICAgICAgICsibWVpc3RlbiBpbW1lciBzZWhyIGZyaWVkbGljaCBnZXNvbm5lbi5cbiI7CisgICByZXR1cm4gIkRlciBXZWcgZnVlaHJ0IGhpZXIgbmFjaCBXZXN0ZW4gbm9jaCBlaW4gU3R1ZWNrIHRpZWZlciBpbiBkZW4gV2FsZCBoaW5laW4sXG4iCisgICAgICAgICArIm5hY2ggT3N0ZW4ga2FubnN0IER1IGplZG9jaCB3aWVkZXIgaW4gUmljaHR1bmcgQXVzZ2FuZyBkZXMgWmF1YmVyd2FsZHMgZ2Vobi5cbiI7Cit9CisKK3N0YXRpYyBzdHJpbmcgX3F1ZXJ5X2ludF9sb25nKCkKK3sKKyAgIGlmIChwcmVzZW50KFdBTERJRCgid2FlY2h0ZXJlaWNoZSIpLCBNRSkpCisgICAgICByZXR1cm4gIkhpZXIgaXN0IGVzIGpldHp0IHJpY2h0aWcgZHVlc3RlciB1bmQgb2huZSBlaWdlbmUgTGljaHRxdWVsbGUga29lbm50ZXN0IER1XG4iCisgICAgICAgICAgICArIm5pY2h0cyBtZWhyIHNlaG4sIGRhIHNvIGd1dCB3aWUgdWViZXJoYXVwdCBrZWluIExpY2h0IG1laHIgZHVyY2ggZGFzXG4iCisgICAgICAgICAgICArIkJsYWV0dGVyZGFjaCBhdWYgZGVuIFdlZyBzY2hlaW50LiBNaXR0ZW4gaW4gZGllc2VyIGVpZ2VudGxpY2ggbGViZW5zLVxuIgorICAgICAgICAgICAgKyJ1bmZyZXVuZGxpY2hlbiBTemVuZSwgc3RlaHQgZWluZSBncm9zc2UgYWx0ZSBFaWNoZSBtaXR0ZW4gYXVmIGRlbSBXZWcuXG4iOworICAgcmV0dXJuICJIaWVyIGlzdCBlcyBqZXR6dCByaWNodGlnIGR1ZXN0ZXIgdW5kIG9obmUgZWlnZW5lIExpY2h0cXVlbGxlIGtvZW5udGVzdCBEdVxuIgorICAgICAgICAgKyJoaWVyIG5pY2h0cyBtZWhyIHNlaG4sIGRhIHNvIGd1dCB3aWUgdWViZXJoYXVwdCBrZWluIExpY2h0IG1laHIgZHVyY2ggZGFzXG4iCisgICAgICAgICArIkJsYWV0dGVyZGFjaCBhdWYgZGVuIFdlZyBzY2hlaW50LiBEdSBrYW5uc3Qgbm9jaCBlaW4gU3R1ZWNrIHRpZWZlciBpbiBkZW5cbiIKKyAgICAgICAgICsiV2FsZCBoaW5laW4gdW5kIG5hY2ggV2VzdGVuIGdlaG4sIG9kZXIgYWJlciB6dXJ1ZWNrIFJpY2h0dW5nIEtyZXV6dW5nIG5hY2hcbiIKKyAgICAgICAgICsiT3N0ZW4uXG4iOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS96YXViZXJ3YWxkL3Jvb20vd2VnMi5jIGIvZG9jL2JlaXNwaWVsZS96YXViZXJ3YWxkL3Jvb20vd2VnMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMDYxNjkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvcm9vbS93ZWcyLmMKQEAgLTAsMCArMSw5MyBAQAorLy8gKGMpIGJ5IFBhZHJlaWMgKFBhZHJlaWNAbWcubXVkLmRlKQorCisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKworaW5oZXJpdCBST09NKCJzdGRyb29tIik7CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgIDo6Y3JlYXRlKCk7CisgICBTZXRQcm9wKFBfSU5ET09SUywgMCk7CisgICBTZXRQcm9wKFBfTElHSFQsIDEpOworICAgU2V0UHJvcChQX0lOVF9TSE9SVCwgIkFtIFJhbmRlIGVpbmVyIExpY2h0dW5nIGltIFphdWJlcndhbGQiKTsKKyAgIEFkZFNwZWNpYWxEZXRhaWwoKHsid2FsZCIsICJ6YXViZXJ3YWxkIn0pLCAiX3F1ZXJ5X2ludF9sb25nIik7CisgICBBZGREZXRhaWwoKHsid2VzdGVuIiwgImxpY2h0dW5nIiwgInBsYWV0emNoZW4iLCAiaWR5bGxpc2NoZXMgcGxhZXR6Y2hlbiJ9KSwKKyAgICAgIkltIFdlc3RlbiBiZWZpbmRldCBzaWNoIGVpbmUgZ3Jvc3NlIExpY2h0dW5nIG1pdCBlaW5lbSBrbGVpbmVuIFR1ZW1wZWwsIGFtXG4iCisgICAgKyJSYW5kZSBkZXIgTGljaHR1bmcgc3RlaGVuIHZlcmVpbnplbHQgbm9jaCBlaW5pZ2UgQmFldW1lIGFiZXIgenVtIFR1ZW1wZWwgaGluLFxuIgorICAgICsid2lyZCBlcyBkYW5uIG1laHIgdW5kIG1laHIgbnVyIG5vY2ggR3JhcyBkYXMgZGVuIEJvZGVuIGJlZGVja3QuXG4iKTsKKyAgIEFkZERldGFpbCgoeyJyYXNlbiIsICJncmFzIn0pLAorICAgICAiQW0gYmVzdGVuIGJldHJpdHRzdCBEdSBkaWUgTGljaHR1bmcgZWluZmFjaCB1bmQgc2NoYXVzdCBEaXIgZGVuIFJhc2VuXG4iCisgICAgKyJuYWVoZXIgYW4uXG4iKTsKKyAgIEFkZERldGFpbCgidHVlbXBlbCIsCisgICAgICJXZW5uIER1IERpciBkZW4gVHVlbXBlbCBuYWVoZXIgYW5zZWhlbiBtb2VjaHRlc3QsIGRhbm4gc29sbHRlc3QgRHUgc2Nob25cbiIKKyAgICArImVpbiBTdHVlY2sgbmFlaGVyIHJhbmdlaGVuLlxuIik7CisgICBBZGREZXRhaWwoKHsic3R1ZWNrIiwgInJhdW0ifSksCisgICAgICJOYSB3ZW5pZ3N0ZW5zIGVpbmVuIFJhdW0gd2VpdGVyIHNvbGx0ZXN0IER1IHNjaG9uIGdlaG4uXG4iKTsKKyAgIEFkZERldGFpbCgic2NoYXR0ZW4iLAorICAgICAiSGllciBiZWZpbmRlc3QgRHUgRGljaCBub2NoIGltIFNjaGF0dGVuIGRlciBCYWV1bWUsIGRpZSBMaWNodHVuZyBpbSBXZXN0ZW5cbiIKKyAgICArImxpZWd0IGplZG9jaCBrb21wbGV0dCBpbiBkZXIgd2Flcm1lbmRlbiBTb25uZS5cbiIpOworICAgQWRkU3BlY2lhbERldGFpbCgic29ubmUiLCAiZGV0X3Nvbm5lIik7CisgICBBZGREZXRhaWwoKHsid2VnZXNyYW5kIiwgImJhZXVtZSIsICJ3ZWdyYW5kIiwgInJhbmQifSksCisgICAgICJBbSBXZWdlc3JhbmQgc3RlaGVuIGVpbmlnZSBCYWV1bWUgZGllIGVpbiBzY2hvZW5lcyBCbGFldHRlcmRhY2ggdWViZXIgZGVuIFdlZ1xuIgorICAgICsic3Bhbm5lbiB1bmQgZGVuIFdlZyBpbiBpaHJlbiBTY2hhdHRlbiBsZWdlbi5cbiIpOworICAgQWRkRGV0YWlsKCh7ImhpbW1lbCIsICJibGFldHRlcmRhY2giLCAiZGFjaCIsICJsaWNodCIsICJzb25uZW5zdHJhaGxlbiIsICJ3b2xrZW4iLCAid29sa2UifSksCisgICAgICJEYXMgQmxhZXR0ZXJkYWNoIGlzdCB6aWVtbGljaCBkaWNodCwgc28gZGFzcyBEdSBuaWNodCBzb28gdmllbCBzZWhlbiBrYW5uc3QsXG4iCisgICAgKyJhYmVyIGVpbmlnZSBTb25uZW5zdHJhaGxlbiBkdXJjaGJyZWNoZW4gZGFzIERhY2ggdW5kIGVycmVpY2hlbiBkZW4gV2VnLlxuIik7CisgICBBZGREZXRhaWwoKHsid2VnIiwgImJvZGVuIiwgImVyZGUiLCAiYXVzZ2FuZyIsICJvc3RlbiIsICJyaWNodHVuZyJ9KSwKKyAgICAgIkltIFdlc3RlbiBmdWVocnQgZGVyIFdlZyB6dSBlaW5lciBncm9zc2VuIExpY2h0dW5nLCB3YWVocmVuZCBlciBuYWNoIE9zdGVuIGhpblxuIgorICAgICsiUmljaHR1bmcgQXVzZ2FuZyBkZXMgWmF1YmVyd2FsZHMgZnVlaHJ0LlxuIik7CisgICBBZGREZXRhaWwoInZvZWdlbCIsICJEdSBrYW5uc3Qgc2llIGRldXRsaWNoIGhvZXJlbiwgYmVrb21tc3QgYWJlciBrZWluZW4genUgc2Vobi5cbiIpOworICAgQWRkRXhpdCgib3N0ZW4iLCBST09NKCJ3ZWcxIikpOworICAgQWRkRXhpdCgic3VlZHdlc3RlbiIsIFJPT00oImxpY2h0dW5nc28iKSk7CisgICBBZGRFeGl0KCJ3ZXN0ZW4iLCBST09NKCJsaWNodHVuZ28iKSk7CisgICBBZGRFeGl0KCJub3Jkd2VzdGVuIiwgUk9PTSgibGljaHR1bmdubyIpKTsKKyAgIEFkZENtZCgib3N0ZW4iLCAiY21kX29zdGVuIik7CisgICBBZGRJdGVtKE5QQygibGF1ZmVpY2hlIiksIFJFRlJFU0hfREVTVFJVQ1QpOworfQorCitzdGF0aWMgc3RyaW5nIGRldF9zb25uZSgpCit7CisgICBpZiAoUEwpIFBMLT5TZXRQcm9wKFBfQkxJTkQsIDEpOworICAgcmV0dXJuICJEdSBzY2hhdXN0IGZhc3ppbmllcnQgaW4gZGllIFNvbm5lIHVuZCB1bnRlcnN1Y2h0IHNpZSBuYWVoZXIsIGRvY2ggZGFzIHdhclxuIgorICAgICAgICAgKyJ3b2hsIGVpbiBncm9zc2VyIEZlaGxlciwgZGVubiBwbG9ldHpsaWNoIHdpcmQgZXMgZ2FueiBnYW56IGR1bmtlbCB1bSBEaWNoIHJ1bS5cbiI7Cit9CisKK3ZvaWQgaW5pdCgpCit7CisgICAvLyB3ZW5uIG1hbiB2b24gd2VzdGVuIGtvbW10IHVuZCBrZWluZSBibG9ja2VuZGUgRWljaGUgaGllciBpc3QsIGRhbm4KKyAgIC8vIHNvIGJldHJhY2h0ZW4gYWxzIHdhZXJlIG1hbiBhdXMgZGVtIG9zdGVuIGdla29tbWVuCisgICBpZiAocXVlcnlfb25jZV9pbnRlcmFjdGl2ZShQTCkgJiYgIXByZXNlbnQoV0FMRElEKCJlaWNoZSIpKSkKKyAgICAgIFBMLT5TZXRQcm9wKEFVU0dBTkcsICJ3ZXN0ZW4iKTsKKyAgIDo6aW5pdCgpOworfQorCitzdGF0aWMgaW50IGNtZF9vc3RlbigpCisvLyB3ZW5uIGdlcmFkZSBlaW5lIEVpY2hlIGhpZXJoaW4gZ2VsYXVmZW4gaXN0LCBrb21tZW4gZmVpbmRsaWNoZQorLy8gU3BpZWxlciBuaWNodCBtZWhyIHZvcmJlaSA6KQoreworICAgaWYgKFBMICYmIFBMLT5RdWVyeVByb3AoQVVTR0FORykhPSJ3ZXN0ZW4iICYmCisgICAgICAgUEwtPlF1ZXJ5UHJvcChaQVVCRVJXQUxEKT50aW1lKCkgJiYgcHJlc2VudChXQUxESUQoImVpY2hlIiksIE1FKSkgeworICAgICAgaWYgKHByZXNlbnQoV0FMRElEKCJlaWNoZSAyIiksIE1FKSkKKyAgICAgICAgIHdyaXRlKCJEaWUgRWljaGVuIHN0ZWhlbiBEaXIgZGFiZWkgbGVpZGVyIGltIFdlZyB1bmQgbGFzc2VuIERpY2ggbmljaHQgdm9yYmVpLlxuIik7CisgICAgICBlbHNlIHdyaXRlKCJEaWUgRWljaGUgc3RlaHQgRGlyIGRhYmVpIGxlaWRlciBpbSBXZWcgdW5kIGxhZXNzdCBEaWNoIG5pY2h0IHZvcmJlaS5cbiIpOworICAgICAgcmV0dXJuIDE7CisgICB9Cit9CisKK3N0YXRpYyBzdHJpbmcgX3F1ZXJ5X2ludF9sb25nKCkKK3sKKyAgIGlmICghUEwgfHwgUEwtPlF1ZXJ5UHJvcChaQVVCRVJXQUxEKTw9dGltZSgpKQorICAgICByZXR1cm4KKyAgICAgICJEdSBzdGVoc3QgbnVuIG1pdHRlbiBpbSBaYXViZXJ3YWxkLiBJbSBXZXN0ZW4gZXJzdHJlY2t0IHNpY2ggdm9yIERpciBlaW5lXG4iCisgICAgICsiZ3Jvc3NlIExpY2h0dW5nLCBhdWYgZGllIER1IG11ZWhlbG9zIGdlbGFuZ2VuIGthbm5zdC4gTmFjaCBPc3RlbiBoaW4gZnVlaHJ0XG4iCisgICAgICsiZWluIHNjaG1hbGVyIFdlZyB6dXJ1ZWNrIHp1bSBBdXNnYW5nIGRlcyBXYWxkZXMuIEFsbGVzIHNjaGVpbnQgaGllciBzZWhyXG4iCisgICAgICsiZnJpZWRsaWNoIHp1IHNlaW4sIGRpZSBWb2VnZWwgendpdHNjaGVybiB1bmQgZGFzIEJsYWV0dGVyZGFjaCBpc3QgaGllciBhdWNoXG4iCisgICAgICsibmljaHQgbWVociBzbyBkaWNodCB3aWUgaW0gT3N0ZW4sIHNvIGRhc3MgZWluaWdlIFNvbm5lbnN0cmFobGVuIGRlbiBXZWdcbiIKKyAgICAgKyJlcnJlaWNoZW4uIEVzIHppZWh0IERpY2ggZm9lcm1saWNoIG5hY2ggV2VzdGVuIGF1ZiBkaWUgTGljaHR1bmcsIG1pdHRlbiBhdWZcbiIKKyAgICAgKyJkaWVzZXMgc29ubmlnZSBpZHlsbGlzY2hlIFBsYWV0emNoZW4uXG4iOworICAgcmV0dXJuICJOaWNodHMgd2llIHJhdXMgaGllci4gRXMgd2FyIGdhbnogdW5kIGdhciBrZWluZSBndXRlIElkZWUgaGllciBpbSBXYWxkIERlaW5lclxuIgorICAgICAgICAgKyJBZ2dyZXNzaXZpdGFldCBmcmVpZW4gTGF1ZiB6dSBsYXNzZW4uIER1IGthbm5zdCB2b24gR2x1ZWNrIGhhYmVuLCB3ZW5uIER1IG1pdFxuIgorICAgICAgICAgKyJlaW5lbSBibGF1ZW4gQXVnZSBkYXZvbiBrb21tc3QgdW5kIGRlbiBXYWxkIG5vY2ggbGViZW5kIHZlcmxhc3NlbiBrYW5uc3QuXG4iCisgICAgICAgICArIk5hY2ggV2VzdGVuIGdlbGFuZ3N0IER1IGF1ZiBkaWUgZ3Jvc3NlIExpY2h0dW5nLCByYXRzYW1lciB3YWVyZSBqZWRvY2ggd29obFxuIgorICAgICAgICAgKyJlaGVyIGRlciBXYWxkd2VnIGltIE9zdGVuLCB1ZWJlciBkZW4gRHUgZGVuIFphdWJlcndhbGQgd2llZGVyIHZlcmxhc3NlbiBrYW5uc3QuXG4iOworfQpkaWZmIC0tZ2l0IGEvZG9jL2NvbmNlcHRzLy5zeW5vbnltIGIvZG9jL2NvbmNlcHRzLy5zeW5vbnltCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YmI0MGEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvY29uY2VwdHMvLnN5bm9ueW0KQEAgLTAsMCArMSwxOSBAQAorZWZmaXppZW50IGVmZml6aWVuegorb3B0aW1pZXJlbiBlZmZpemllbnoKK29wdGltaWVydW5nIGVmZml6aWVuegorb3B0aW1hbCBlZmZpemllbnoKK3BlcmZvcm1hbnogZWZmaXppZW56CitzcGVpY2hlciBtZW1vcnkKK3N3YXAgbWVtb3J5Citzd2FwcGluZyBtZW1vcnkKK29iamVrdCBvYmplY3RzCitvYmpla3RlIG9iamVjdHMKK29iamVrdG9yaWVudGllcnQgb29wCitvYmpla3RvcmllbnRpZXJ1bmcgb29wCitwcm9wZXJ0eSBwcm9wZXJ0aWVzCitwcm9wcyBwcm9wZXJ0aWVzCit0ZXJtaW5hbCB0ZXJtaW5hbHMKK3N0aWwgZ29vZHN0eWxlCitzdHlsZSBnb29kc3R5bGUKK2d1dGVyc3RpbCBnb29kc3R5bGUKK2tvc3RlbiB0aWNrcwpkaWZmIC0tZ2l0IGEvZG9jL2NvbmNlcHRzL2NvbmNlcHRzIGIvZG9jL2NvbmNlcHRzL2NvbmNlcHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YmZhZTAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvY29uY2VwdHMvY29uY2VwdHMKQEAgLTAsMCArMSw5IEBACitOQU1FCisgICAgICAgIGNvbmNlcHRzCisKK0RFU0NSSVBUSU9OCisgICAgICAgIFRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIG1hbiBwYWdlcyBhYm91dCBiYXNpYyBjb25jZXB0cyBvZiB0aGUKKyAgICAgICAgTFBDIGxhbmd1YWdlIGFzIGl0IGlzIHByb3ZpZGVkIGJ5IEFteWxhYXJzIHBhcnNlci9pbnRlcnByZXRlci4KKworU0VFIEFMU08KKyAgICAgICAgZHJpdmVyKEQpLCBlZnVuKEUpLCBhcHBsaWVkKEEpLCBtYXN0ZXIoTSksIGxwYyhMUEMpCmRpZmYgLS1naXQgYS9kb2MvY29uY2VwdHMvZWZmaXppZW56IGIvZG9jL2NvbmNlcHRzL2VmZml6aWVuegpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjk5YzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2NvbmNlcHRzL2VmZml6aWVuegpAQCAtMCwwICsxLDIyMiBAQAorRWZmaXppZW56CisgQkVTQ0hSRUlCVU5HOgorICAgICBFZmZpemllbnogaW4gZGVyIFByb2dyYW1taWVydW5nIGlzdCBsZWlkZXIgbmljaHQgZ2FueiBzbyBlaW5mYWNoIHp1CisgICAgIGJlc2NocmVpYmVuLCBkYSBlcyB2aWVsIG1pdCBkZXIgenVncnVuZGVsaWVnZW5kZW4gVmVyYXJiZWl0dW5nIGRlcgorICAgICBQcm9ncmFtbWUgenUgdHVuIGhhdC4gRXMgZ2VodCBnYW56IGd1dCBhbSBCZWlzcGllbC4KKworICAgICBHZW5lcmVsbCBoYWJlbiBMZXNiYXJrZWl0IHVuZCBXYXJ0YmFya2VpdCB2b24gQ29kZSBWb3JyYW5nIHZvciBkZXNzZW4KKyAgICAgRWZmaXppZW56LCBnZXJhZGUgd2VpbCBkaWUgd2lya2xpY2ggYXJiZWl0c2xhc3RpZ2VuIE1ldGhvZGVuIGluIGRlciBMaWIKKyAgICAgc3RlY2tlbi4gQXVzc2VyZGVtIGlzdCBlcyBpbSBBbGxnZW1laW5lbiBuaWNodCBlbXBmZWhsZW5zd2VydCwgKHZpZWwpCisgICAgIEF1ZndhbmQgaW4gZGllIE9wdGltaWVydW5nIHZvbiBDb2RlIHp1IHN0ZWNrZW4sIHNvbGFuZ2UgbmljaHQga2xhciBpc3QsCisgICAgIGRhc3MgZGllcyB1ZWJlcmhhdXB0IG5vdHdlbmRpZyBpc3QuCisgICAgIExlcy0vV2FydGJhcmtlaXQgdW5kIGVmZml6aWVudGVyIFN0aWwgc2NobGllc3NlbiBzaWNoIGFiZXIgbmljaHQgYXVzIHVuZAorICAgICBlaW5pZ2UgKGVpbmZhY2hlKSBHcnVuZHJlZ2VsbiBsYXNzZW4gc2ljaCBlaW5mYWNoIGVpbmhhbHRlbi4KKworICAgICBGdWVyIGRpZWplbmlnZW4gdW50ZXIgZXVjaCwgZGllIGdlcmFkZSBlcnN0IG1pdCBMUEMgenVzYW1tZW5zdG9zc2VuCisgICAgIGdpYnQgZXMgKCopIGFuIGRlbiBiZXNvbmRlcnMgd2ljaHRpZ2VuIFN0ZWxsZW4uIEF1ZiBEYXVlciBzb2xsdGV0IGlocgorICAgICBhYmVyIG1hbCBhbGxlIEVpbnRyYWVnZSB1ZWJlcmZsaWVnZW4uIERlbiBlcnN0ZW4ga29lbm5lbiBhbGxlIGhpZXIKKyAgICAgYmVoZXJ6aWdlbjoKKworICAgICBMUEMgd2lyZCBiZWltIExhZGVuIG5pY2h0IG9wdGltaWVydDoKKyAgICAgIERhcyB3YXMgaWhyIHNjaHJlaWJ0LCB3aXJkIGF1Y2ggc28gYXVzZ2VmdWVocnQsIGVzIHdlcmRlbiBrZWluZQorICAgICAgU2NobGVpZmVuIG9wdGltaWVydCwga2VpbmUgdW5ub2V0aWdlbiBadXdlaXN1bmdlbiBlbnRmZXJudCwgbmljaHRzCisgICAgICB3aXJkIHZlcmFlbmRlcnQ6CisgICAgICAtIHVlYmVybGVndCBldWNoIGFsc28gZXVyZW4gQ29kZSBndXQsIHdlbm4gZXIgYW4ga3JpdGlzY2hlbiBTdGVsbGVuCisgICAgICAgIHN0ZWh0IG9kZXIgc2VociB2aWVsIFJlY2hlbnplaXQga29zdGV0ICh6QiBnZXNjaGFjaHRlbHRlIFNjaGxlaWZlbikKKyAgICAgIC0gdGVzdGV0IGVpbmZhY2ggbWFsIFZhcmlhbnRlbiB1bmQgZnJhZ3QgYXVmIC1scGMgbmFjaCBPcHRpbWllcnVuZyEKKworICAgICBjYWxsX291dCB1bmQgaGVhcnRfYmVhdCBlcnpldWdlbiBrb25zdGFudGUgTGFzdDoKKyAgICAgIEplZGVyIGNhbGxfb3V0KCkgc3RlaHQgaW4gZWluZXIgTGlzdGUsIGRpZSBpbSBzZWxiZW4gVGFrdCB3aWUgZGVyCisgICAgICBoZWFydF9iZWF0KCkgZHVyY2hzdWNodCB3aXJkLiBCZWlkZXMga29zdGV0IFplaXQuIEJlaWRlIE1ldGhvZGVuCisgICAgICB2ZXJoaW5kZXJuIHp1ZGVtIGRhcyBBdXNzd2FwcGVuIGRlcyBlbnRzcHJlY2hlbmRlbiBPYmpla3Rlcy4gRGVzaGFsYgorICAgICAgc2NoYWx0ZW4gc2ljaCBSYXVtbWVsZHVuZ2VuIChBZGRSb29tTWVzc2FnZSBmdW5rdGlvbmllcnQgdWViZXIKKyAgICAgIGNhbGxfb3V0KCkpIHVuZCBkZXIgaGVhcnRfYmVhdCgpIHZvbiAvc3RkL25wYyBuYWNoIGRlbSBWZXJsYXNzZW4gZGVzCisgICAgICBSYXVtZXMgZHVyY2ggZGVuIGxldHp0ZW4gU3BpZWxlciBzZWxic3QgYXVzLgorICogICAgLSBiaXR0ZSBhY2h0ZXQgZGFyYXVmLCB1bm5vZXRpZ2UgY2FsbF9vdXQvaGVhcnRfYmVhdCB6dSB2ZXJtZWlkZW4uCisgICAgICAgIChJbnNiZXNvbmRlcmUgc2ljaCBiZXdlZ2VuZGUgTlBDcyBzb2xsdGVuIHNpY2ggYXVjaCBpcmdlbmR3YW5uCisgICAgICAgICB3aWVkZXIgYWJzY2hhbHRlbiAtIGVzIGdpYnQgZWluZW4gZnVua3Rpb25pZXJlbmRlbiBNTlBDIG1pdCBkaWVzZW4KKyAgICAgICAgIEVpZ2Vuc2NoYWZ0ZW4gdW50ZXIgL3Avc2VydmljZS9wYWRyZWljL21ucGMuKQorICAgICAgLSBmdWVyIHJlZ2VsbWFlc3NpZ2UgQXVmcnVmZSBpbiBlaW5lbSBPYmpla3QsIHdvIGRlciBnZW5hdWUgWmVpdHB1bmt0CisgICAgICAgIG5pY2h0IGF1ZiBlaW5pZ2UgU2VrdW5kZW4gYW5rb21tdCwgIGJpZXRldCBzaWNoIGF1Y2ggcmVzZXQoKSBtaXQKKyAgICAgICAgc2V0X25leHRfcmVzZXQoKSBhbgorICAgICAgLSBzdGF0dCBjYWxsX291dCgpLUtldHRlbiBpbiBlaW5lbSBSYXVtIGxhdWZlbiB6dSBsYXNzZW4sIGthbm4gbWFuCisgICAgICAgIHNpY2ggYXVjaCBkaWUgbGV0enRlIEFrdGl2aWVydW5nIG1lcmtlbiB1bmQgYmVpIGVpbmVtIGluaXQoKQorICAgICAgICB3aWVkZXIgZWluIGVudHNwcmVjaGVuZCBsYW5nZXMgY2FsbF9vdXQoKSBzdGFydGVuCisKKyAgICAgU3BlaWNoZXIgdW5kIGRhcyBEcnVtaGVydW06CisgICAgICBEaWUgU3BlaWNoZXJzaXR1YXRpb24gaXN0IG5pY2h0IG1laHIgdmVyendlaWZlbHQuIERhcyBoZWlzc3QgYWJlcgorICAgICAgbmljaHQsIGRhc3MgZGFtaXQgZ2VzY2hsYW1wdCB3ZXJkZW4ga2Fubi4gR2xlaWNoemVpdGlnIGlzdCBkaWUKKyAgICAgIFJlc2VydmllcnVuZyB2b24gU3BlaWNoZXIgdW5kIGRpZSBHYXJiYWdlIENvbGxlY3Rpb24sIGRhcyBFaW5zYW1tZWxuCisgICAgICBmcmVpZ2VnZWJlbmVuIFNwZWljaGVycyBiZWkgRnJlaWdhYmVuIHZvbiBWYXJpYWJsZW4gKHdpZSBiZWkgeCt5LAorICAgICAgeD0wICh4LHk9PWFycmF5L21hcHBpbmcpKSBpbW1lciBrb3N0c3BpZWxpZy4gRm9sZ2VuZCBlaW4gcGFhcgorICAgICAgVGlwcHMgZGF6dToKKyAgICAgIEdyb2Vzc2U6CisgICAgICAtIHdlbm4gbW9lZ2xpY2gsIGdsb2JhbGUgVmFyaWFibGVuIG5hY2ggTnV0enVuZyBmcmVpZ2ViZW4gLSBnZ2YuCisgICAgICAgICNkZWZpbmVzIGJlbnV0emVuOiBWb3JzaWNodCBqZWRvY2ggYmVpIE1hcHBpbmcvQXJyYXkgKHNpZWhlIHVudGVuKQorICAgICAgLSBnbG9iYWxlIG9kZXIgaW4gUHJvcGVydGllcyBhYmdlc3BlaWNoZXJ0ZSBNYXBwaW5ncy9BcnJheXMvCisgICAgICAgIFN0cmluZ3Mga2xlaW4gaGFsdGVuIHVuZCBudXIgZHluYW1pc2NoIGVyd2VpdGVybgorICAgICAgLSBwcm9ncmFtbWllcnQgbWFuIGFuIHZpZWxlbiBTdGVsbGVuIGdsZWljaGVuIENvZGUsIGRhbm4gaXN0IGVzCisgICAgICAgIHNpbm52b2xsLCBkaWVzZW4gaW4gZWluZSBlaWdlbmUgRGF0ZWkvS2xhc3NlIHp1IGdpZXNzZW4gdW5kIHZvbgorICAgICAgICBkaWVzZXIgenUgZXJiZW4gLSBkYXMgc3BhcnQgU3BlaWNoZXIgdW5kIGxhZXNzdCBzaWNoIGJlc3NlciB3YXJ0ZW4KKyAgICAgIC0gcmVwbGFjZV9wcm9ncmFtIGJpdHRlIG51ciBiZW51dHplbiwgd2VubiBtYW4gd2Vpc3MsIHdhcyBlcyBiZXdpcmt0LAorICAgICAgICAvc3RkL3Jvb20gdmVyd2VuZGV0IGVzIGJlcmVpdHMgYXV0b21hZ2lzY2gKKyAqICAgIC0gT2JqZWt0ZSBpbiBSYWV1bWVuIHVuZCBOUENzIHNvbGx0ZW4gcGVyIEFkZEl0ZW0oKSBhZGRpZXJ0IHdlcmRlbiwKKyAgICAgICAgZGEgZGllIGdlbmVyZWxsZSBBdWZyYWV1bWZ1bmt0aW9uIC9zdGQvcm9vbTo6Y2xlYW5fdXAoKSBkYW5uIHdlaXNzCisgICAgICAgIG9iIGRlciBSYXVtIGVudGZlcm50IHdlcmRlbiBrYW5uCisgICAgICAtIGVzIHNvbGx0ZSBrZWluZSBld2lnZW4gT2JqZWt0cXVlbGxlbiBnZWJlbgorICAgICAgLSBCbHVlcHJpbnRzOgorICAgICAgICAtIFNvbGwgZXMgaW1tZXIgbnVyIGVpbiBPYmpla3Qgdm9uIGV0d2FzIGdlYmVuLCBzdGVsbHQgZGllIEJsdWVwcmludAorICAgICAgICAgIHBlciBBZGRJdGVtKC4uLiwuLi4sMSkgZG9ydCBoaW4uCisgICAgICAgICAgQWNodHVuZzogQmx1ZXByaW50cyBuZXUgenUgbGFkZW4sIGlzdCB0ZXVlciBpbSBWZXJnbGVpY2ggenVtIGNsb25lbi4KKyAgICAgICAgICAgICAgICAgICBHZXJhZGUgYmVpIE5QQ3MgKGRpZSBiZWltIFRvZCB6ZXJzdG9lcnQgd2VyZGVuKSwgc29sbHRlCisgICAgICAgICAgICAgICAgICAgbWFuIGRhcyBpbSBIaW50ZXJrb3BmIGJlaGFsdGVuLgorICAgICAgICAtIERpZSBCUCB2b24gZ2VjbG9udGVuIE9iamVrdGVuIG11c3MgbmljaHQgaW1tZXIgaW5pdGlhbGlzaWVydCB3ZXJkZW4sCisgICAgICAgICAgc3BlemllbGwgYmVpIGtvbXBsZXhlbiBPYmpla3RlbiBrYW5uIGVzIHNpY2ggbG9obmVuLCBkaWUKKyAgICAgICAgICBJbml0aWFsaXNpZXJ1bmcgZGVyIEJQIGltIGNyZWF0ZSBhYnp1YnJlY2hlbi4gKERlbm4gbWVpc3RlbnMgaXN0IG51cgorICAgICAgICAgIGlociBQcm9ncmFtbSBpbnRlcmVzc2FudCkKKyAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSB7CisgICAgICAgICAgICBpZighY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSB7CisgICAgICAgICAgICAgIHNldF9uZXh0X3Jlc2V0KC0xKTsgICAvLyBmYWxscyBkaWUgQ2xvbmVzIGltIHJlc2V0KCkgd2FzCisgICAgICAgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAvLyBtYWNoZW4KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIDo6Y3JlYXRlKCk7IC4uLgorICAgICAgICAgIH0KKyAgICAgIAorICAgICBLb3N0ZW46CisgKiAgICAtIGVzIGxvaG50LCBsb2thbGUgTWFwcGluZ3Mgb2RlciBBcnJheXMgbWl0IGJla2FubnRlciBHcm9lc3NlIHZpYQorICAgICAgICBhbGxvY2F0ZSgpIG9kZXIgbV9hbGxvY2F0ZSgpIHZvciBCZWxlZ3VuZyBpbiB2b2xsZXIgYmVub2V0aWdlcgorICAgICAgICBHcm9lc3NlIHp1IHJlc2VydmllcmVuOgorICAgICAgICBzdGF0dDoKKyAgICAgICAgICBpbnQgKnggPSAoe30pOyBmb3JlYWNoKGludCBpOiAxMCkgeCs9KHtpfSk7CisgICAgICAgIGxpZWJlcjoKKyAgICAgICAgICBpbnQgKnggPSBhbGxvY2F0ZSgxMCk7IGZvcmVhY2goaW50IGk6IDEwKSB4W2ldID0gaTsKKyAqICAgIC0gd2llZGVyaG9sdGVzIEF1c3NjaG5laWRlbiAoc2xpY2UpIGF1cyBBcnJheXMgdmVybWVpZGVuLCBkYWJlaSB3aXJkCisgICAgICAgIHN0YWVuZGlnIFNwZWljaGVyIG5ldSBhbGxvemlpZXJ0IHVuZCBiZW51dHp0ZXIgU3BlaWNoZXIgZnJlaWdlZ2ViZW46CisgICAgICAgIHN0YXR0OgorICAgICAgICAgIGludCAqeDsgLi4uOyB3aGlsZShzaXplb2YoeCkpIHsgeFswXS4uLjsgeD1bMS4ueF07IH0KKyAgICAgICAgbGllYmVyOgorICAgICAgICAgIGludCAqeDsgLi4uOyBpPXNpemVvZih4KTsgd2hpbGUoajxpKSB7IHhbal0uLi47IGorKzsgfQorICogICAgLSBkaXJla3RlIE1hcHBpbmcvQXJyYXkgKHt9KSwgKFtdKSBpbiBNZXRob2RlbiAoekIgdWViZXIgI2RlZmluZSkKKyAgICAgICAgc3BhcmVuIHp3YXIgZ2xvYmFsZW4gUGxhdHosIGtvc3RlbiBhYmVyIEtvbnN0cnVrdGlvbnN6ZWl0IGJlaSBqZWRlbQorICAgICAgICBBdWZydWYgZGllc2VyIE1ldGhvZGVuIC0gZnVlciBoYWV1ZmlnIGdlcnVmZW5lIE1ldGhvZGVuIHNvbGx0ZW4KKyAgICAgICAgZ3Jvc3NlIERhdGVuc3RydWt0dXJlbiBlaW5tYWwgZ2xvYmFsIGtvbnN0cnVpZXJ0IHdlcmRlbgorICAgICAgICBzdGF0dDogICAgI2RlZmluZSBHUk9TU0VTX01BUFBJTkcgKFsuLi4uXSkKKyAgICAgICAgICAgICAgICAgIHZvaWQgaGFldWZpZ2VfZnVuKCkgeyAuLi4gR1JPU1NFU19NQVBQSU5HIC4uLiB9CisgICAgICAgIGxpZWJlcjogICBtYXBwaW5nIEdST1NTRVNfTUFQUElORyA9IChbLi4uLl0pOworICAgICAgICAgICAgICAgICAgdm9pZCBoYWV1ZmlnZV9mdW4oKSB7IC4uLiBHUk9TU0VTX01BUFBJTkcgLi4uIH0KKyAqICAgIC0gZGl2ZXJzZSBlZnVucyBzaW5kIGdlbmF1c28gc2NobmVsbCB6dWdyZWlmYmFyIHdpZSBWYXJpYWJsZW4sCisgICAgICAgIG11ZXNzZW4gYWxzbyBudXIgenVnZXdpZXNlbiB3ZXJkZW4sIHdlbm4gc2ljaCBkZXIgV2VydCBhZW5kZXJuIGthbm46CisgICAgICAgIHRoaXNfcGxheWVyKCksIHRoaXNfaW50ZXJhY3RpdmUoKSwgZW52aXJvbm1lbnQoKSwgcHJldmlvdXNfb2JqZWN0KCksCisgICAgICAgIHRoaXNfb2JqZWN0KCkuCisgKiAgICAtIHN0YXR0IGFsbF9pbnZlbnRvcnkoKSBlaW5lciBWYXJpYWJsZW4genV6dXdlaXNlbiB1bmQgZGFydWViZXIKKyAgICAgICAgenUgaXRlcmllcmVuLCBrYW5uIG1hbiBvZnQgbWl0IGZpcnN0X2ludmVudG9yeSgpIHVuZCBuZXh0X2ludmVudG9yeSgpCisgICAgICAgIGVpbiBJbnZlbnRvcnkgZHVyY2hnZWhlbgorCisgICAgIE1ldGhvZGVuOgorICAgICAgRGllIE1ldGhvZGVuIGVpbmVzIE9iamVrdGVzIHdlcmRlbiBpbiBlaW5lciBMaXN0ZSBnZXNwZWljaGVydCwgZGllCisgICAgICBiZWltIEF1ZnJ1ZiBlaW5lciBNZXRob2RlIHVlYmVyIGNhbGxfb3RoZXIoKSAob2RlciBvLT5mdW4oKSkKKyAgICAgIGR1cmNoZ2VzZWhlbiB3aXJkLiBEYXMgaGF0IGZvbGdlbmRlIEtvbnNlcXVlbnplbjoKKyAqICAgIC0gamVkZSBvZWZmZW50bGljaGUgTWV0aG9kZSB3aXJkIGJlaSBjYWxsX290aGVyKCkgZHVyY2hzdWNodCB1bmQKKyAgICAgICAgZGFzIGtvc3RldCBaZWl0LCB3ZW5uIGVpbmUgTWV0aG9kZSBhbHNvIG5pY2h0IG9lZmZlbnRsaWNoIHNlaW4KKyAgICAgICAgbXVzcywgZGFubiBzY2hyZWlidCBhdWNoIGVpbiAicHJvdGVjdGVkIiBkYXZvciwgd2VubiBzaWUgaW4gZGVuCisgICAgICAgIGVyYmVuZGVuIEtsYXNzZW4gbmljaHQgc2ljaHRiYXIgc2VpbiBtdXNzOiAicHJpdmF0ZSIKKyAgICAgIC0gbnV0enQgaWhyIGVpbmUgZnJlbWRlIE1ldGhvZGUgbWVocmZhY2ggKHpCIFF1ZXJ5UHJvcCksIGRhbm4gaXN0IGVzCisgICAgICAgIGFuIHNlaHIga3JpdGlzY2hlbiBTdGVsbGVuIHNpbm52b2xsLCBkaWVzZSBlaW5tYWwgenUgc3VjaGVuIHVuZCBhbgorICAgICAgICBlaW5lIExmdW4tQ2xvc3VyZSB6dSBiaW5kZW4sIHdlaXRlcmUgQXVmcnVmZSBzaW5kIHNjaG5lbGxlcjoKKyAgICAgICAgIGNsb3N1cmUgY2w7CisgICAgICAgICBjbD1zeW1ib2xfZnVuY3Rpb24oIlF1ZXJ5UHJvcCIsdGhpc19wbGF5ZXIoKSk7CisgICAgICAgICBmdW5jYWxsKGNsLCBQX0xFVkVMKTsgZnVuY2FsbChjbCwgUF9TSVpFKTsgLi4uCisgICAgICBOZWJlbmJlaSBiZW1lcmt0OgorICAgICAgLSBlcyBnaWJ0IGluIExQQyBrZWluIHNvZy4gZnJ1ZWhlcyBCaW5kZW4sICJ0aGlzX29iamVjdCgpLT5mdW5jdGlvbigpOyIKKyAgICAgICAgaXN0IGZhc3QgaW1tZXIgdW5ub2V0aWcgdW5kIGZhc3QgaW1tZXIgbnVyIGVpbiBaZWljaGVuIGZ1ZXIgRmF1bGhlaXQgZGllCisgICAgICAgIHJpY2h0aWdlbiBQcm90b3R5cGVuIHp1IGlua2x1ZGllcmVuL2Zvcm11bGllcmVuLgorCisgICAgIExhbWJkYXM6CisgICAgICBMYW1iZGEtQ2xvc3VyZXMgc2luZCBuaWNodCBudXIgc2Nod2VyIHp1IGxlc2VuLCBzb25kZXJuIG9mdCBhdWNoIGxhbmdzYW1lcgorICAgICAgYWxzIGFuZGVyZSBDbG9zdXJlcy4gU3BlemllbGwgd2lyZCBiZWkgamVkZW0gQXVmdHJldGVuIHZvbiBsYW1iZGEoKSBkaWUKKyAgICAgIExhbWJkYSBuZXUgZXJ6ZXVndC4KKyAgICAgIE5laG10IGV1Y2ggZGllIFplaXQgYXVzIGVpbmVyIExhbWJkYS1DbG9zdXJlIGVpbmUgTGZ1bi1DbG9zdXJlIHp1CisgICAgICBtYWNoZW4gb2RlciBzaWUgenVtaW5kZXN0IGFuIGVpbmUgZ2xvYmFsZSBDbG9zdXJlLVZhcmlhYmxlIHp1IGJpbmRlbiwKKyAgICAgIGRhbWl0cyBzaWUgc2NobmVsbCBhdXNnZWZ1ZWhydCB3ZXJkZW4ga2Fubi4gI2RlZmluZSBiaWV0ZXQgc2ljaCBoaWVyCisgICAgICBuaWNodCBhbi4KKyAgICAgIHN0YXR0OiAgZmlsdGVyKHVzZXJzKCksCisgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYSgoeyd4fSksICh7IydjYWxsX290aGVyLCd4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlF1ZXJ5UHJvcCIsUF9TRUNPTkR9KSkpOworICAgICAgbGllYmVyOiBwcml2YXRlIHN0YXRpYyBpbnQgX2lzYXNlYyhvYmplY3QgbykgeworICAgICAgICAgICAgICAgIHJldHVybiBvLT5RdWVyeVByb3AoUF9TRUNPTkQpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIC4uLgorICAgICAgICAgICAgICBmaWx0ZXIodXNlcnMoKSwgIydfaXNhc2VjKTsKKyAgICAgIG9kZXI6ICAgY2xvc3VyZSBjbDsKKyAgICAgICAgICAgICAgY2w9bGFtYmRhKCh7J3h9KSwgLi4uICk7CisgICAgICAgICAgICAgIC4uLgorICAgICAgICAgICAgICBmaWx0ZXIodXNlcnMoKSwgY2wpOworICAgICAgb2RlcjoKKyAgICAgIEJlc3NlcmUgQWx0ZXJuYXRpdmUgenUgTGFtYmRhcyBzaW5kIHVlYnJpZ2VucyBpbmxpbmUtY2xvc3VyZXMgKG1hbgorICAgICAgaW5saW5lLWNsb3N1cmVzKSwgZGllIGRldXRsaWNoIHNjaG5lbGxlciB1bmQgZWluZmFjaGVyIHp1IGxlc2VuIHNpbmQuCisgICAgICAgICAgICAgIGZpbHRlcih1c2VycygpLCBmdW5jdGlvbiBtaXhlZCAocGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsLT5RdWVyeVByb3AoUF9TRUNPTkQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICApOworCisKKyAgICAgU2ltdWwtZWZ1biB1bmQgZGllIExhc3QgZGVyIFZlcmdhbmdlbmhlaXQ6CisgICAgICBFcyBnaWJ0IGVpbmlnZSBTaW11bC1FZnVucywgZGllIGFuc3RlbGxlIGVpbmVyIGFlaG5saWNoZW4gRWZ1biB2ZXJ3ZW5kZXQKKyAgICAgIHdlcmRlbiwgYWJlciBsYW5nc2FtZXIgc2luZC4gQmVpc3BpZWw6IGRpZSBzZWZ1biBtX2NvcHlfZGVsZXRlKCkgbWFjaHQKKyAgICAgIGZhc3QgZGFzIGdsZWljaGUgd2llIG1fZGVsZXRlKCksIGVyemV1Z3QgYWJlciB2b3JoZXIgaW1tZXIgZWluZSBLb3BpZS4KKyAgICAgIFdlbm4gbWFuIGRpZXNlIG5pY2h0IGJyYXVjaHQsIHNvbGx0ZSBtYW4gbV9kZWxldGUoKSBkZW4gVm9yenVnIGdlYmVuLgorCisKKyAgICAgR2VuZXJlbGxlIEJlbWVya3VuZ2VuOgorICoqKiAgLSBMQUcgZW50c3RlaHQgdm9yIGFsbGVtIGRhbm4sIHdlbm4genUgdmllbGUgRGluZ2UgYXVmIGVpbm1hbAorICAgICAgICBpZGVudGlmaXppZXJ0LCBiZXdlZ3QsIGdlbGFkZW4sIGdlY2xvbmVkIG9kZXIga29waWVydCB3ZXJkZW4KKyAgICAgICAgc29sbGVuIChpbiBudXIgZWluZW0gS29tbWFuZG8sIGluIGVpbmVtIHJlc2V0KCksIC4uLikKKyAgICAgICAgLSB6ZXJsZWd0IHNvbGNoZSBBdWZnYWJlbiBtaXQgY2FsbF9vdXQvaGVhcnRfYmVhdCBpbiBIYWVwcGNoZW4KKyAgICAgICAgLSBsYXNzdCBlcyBlaW5lbiBFcnptYWdpZXIgZHVyY2hzZWhlbgorICogICAgLSBWYXJpYWJsZW4gc2luZCBpbW1lciBhdWYgMCBpbml0aWFsaXNpZXJ0LAorICAgICAgICBhbGxvY2F0ZSgpLUFycmF5cyBzaW5kIG1pdCAwIG9kZXIgV3Vuc2Nod2VydCBpbml0aWFsaXNpZXJ0LgorICAgICAgLSBnbGVpY2hlciBDb2RlIHNvbGx0ZSBhdXMgU2NobGVpZmVuIHNvbGx0ZW4gZW50ZmVybnQgd2VyZGVuLAorICAgICAgICB6QiBiZWkgSXRlcmF0aW9uIHVlYmVyIGVpbiBBcnJheSBnZWhvZXJ0IGRhcyBzaXplb2YoKSB2b3IgZGllCisgICAgICAgIFNjaGxlaWZlLCBuaWNodCBpbiBkZW4gVGVzdAorICogICAgLSBiZWltIElkZW50aWZpemllcmVuIGVpbmRldXRpZ2VyIE9iamVrdGUgaXN0IHByZXNlbnRfY2xvbmUoKQorICAgICAgICB3ZXNlbnRsaWNoIGJpbGxpZ2VyIGFscyBlaW4gcHJlc2VudCgpICsgZ2VzY2h1ZXR6dGVuIElEcworICogICAgLSBhdXMgQXJyYXlzIGtvZW5uZW4gbWl0dGVscyAiLSIgdmllbGUgaWRlbnRpc2NoZSBXZXJ0ZSBhdWYgZWlubWFsCisgICAgICAgIGVudGZlcm50IHdlcmRlbiwgZXMgaXN0IGFsc28gc2lubnZvbGwgYmVpIExvZXNjaG9wZXJhdGlvbmVuCisgICAgICAgIHp1IGxvZXNjaGVuZGUgV2VydGUgYXVmIGVpbmVuIGJlc3RpbW10ZW4gV2VydCB6dSBzZXR6ZW4gdW5kIGRpZXNlbgorICAgICAgICBkYW5uIG1pdHRlbHMgYXJyYXktPSh7d2VydH0pIHp1IGVudGZlcm5lbi4KKyAgICAgICAgV2lyIGVudGZlcm5lbiBhbGxlIGdldG9ldGV0ZW4gTlBDLCBkLmguIGFsbGUgZ2Vsb2VzY2h0ZW4gT2JqZWt0ZQorICAgICAgICBhdXMgZWluZXIgTGlzdGU6IG1laW5lbGlzdGVtaXRucGNzLT0oezB9KQorICAgICAgLSBlZnVucyBzaW5kIG9mdCBzY2huZWxsZXIgYWxzIGVpZ2VuZSBLb25zdHJ1a3RlLCBnZXJhZGUgd2FzCisgICAgICAgIEFycmF5cyBiZXRyaWZmdC4gUGF1c2NoYWxpc2llcnQga2FubiBkYXMgbmljaHQgd2VyZGVuLCBtYW4gbXVzcworICAgICAgICBhdWNoIGltbWVyIGRpZSBub2V0aWdlIFJlc2VydmllcnVuZyB2b24gU3BlaWNoZXIgbWl0YmV0cmFjaHRlbiEKKyAgICAgICAgWnVzYW1tZW4gbWl0IGVpbmVyIFJlZmVyZW56IHNpbmQgc29ydF9hcnJheSgpLCBmaWx0ZXIoKSwgbWFwKCkgZXRjLgorICAgICAgICBkZW5ub2NoIG9mdCBldWVyIEZyZXVuZDoKKyAgICAgICAgc3RhdHQ6ICAgdD1hbGxvY2F0ZSgwKTsKKyAgICAgICAgICAgICAgICAgZm9yIChpPXNpemVvZihhMSk7IGktLTsgKQorICAgICAgICAgICAgICAgICAgIGlmIChtZW1iZXIoYTIsYTFbaV0pPj0wKSB0Kz0oe2ExW2ldfSk7CisgICAgICAgIGxpZWJlcjogIHByaXZhdGUgc3RhdGljIG1peGVkIF9pc19tZW1iZXIobWl4ZWQgeCwgYSkgeworICAgICAgICAgICAgICAgICAgIGlmIChtZW1iZXIoYSx4KT49MCkgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgICAgZWxzZSByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAuLi4KKyAgICAgICAgICAgICAgICAgdD1maWx0ZXIoYTEsICMnX2lzX21lbWJlciwgJmEyKTsKKyAgICAgICAgb2RlciBoaWVyIG5vY2ggYmVzc2VyOgorICAgICAgICAgICAgICAgICAgIHQ9YTEmYTI7CisgICAgICAtIHgmeSBpc3QgYmVpIHp3ZWkgZ3Jvc3NlbiBBcnJheXMgbWFuY2htYWwgZGllIHNjaGxlY2h0ZXJlIFdhaGw6CisgICAgICAgIHN0YXR0OiAgIHQ9YWxsX2ludmVudG9yeShUTykmdXNlcnMoKTsgICAgICAgLy8gendlaSBBcnJheXMKKyAgICAgICAgbGllYmVyOiAgdD1maWx0ZXIoYWxsX2ludmVudG9yeShUTyksICAgICAgICAvLyBlaW4gQXJyYXkhCisgICAgICAgICAgICAgICAgICAgICAgICAgICMncXVlcnlfb25jZV9pbnRlcmFjdGl2ZSk7CisgICAgICAgIEV2ZW50dWVsbCBsb2hudCBlcyBzaWNoIGhpZXIsIGdsZWljaCBtaXQgZmlyc3RfaW52ZW50b3J5KCkgdW5kCisgICAgICAgIG5leHRfaW52ZW50b3J5KCkgdWViZXIgZGVuIFJhdW0genUgaXRlcmllcmVuIHVuZCBhdWYgYWxsZW4KKyAgICAgICAgcXVlcnlfb25jZV9pbnRlcmFjdGl2ZSgpIGRpZSBnZXd1ZW5zY2h0ZW4gT3BlcmF0aW9uZW4gdm9yenVuZWhtZW4uCisgICAgICAtIGZvcmVhY2goKSBpc3Qgb2Z0IGdlZ2VudWViZXIgZm9yKCkgZGllIGJlc3NlcmUgQWx0ZXJuYXRpdmUgKGV0d2FzCisgICAgICAgIHNjaG5lbGxlciwgZWluZmFjaGVyIGZvcm11bGllcnQpCisgICAgICAtIHdlaXRlcmUgc2NobmVsbGUgZWZ1bnM6CisgICAgICAgIHF1ZXJ5X3ZlcmIoKSwgaW50ZXJhY3RpdmUoKSwgcXVlcnlfb25jZV9pbnRlcmFjdGl2ZSgpLCBsaXZpbmcoKSwKKyAgICAgICAgc3RyaW5ncCgpLCBpbnRwKCksIGNsb3N1cmVwKCksIG9iamVjdHAoKSwgLi4uCisKKyBTSUVIRSBBVUNIOgorICAgICBtZW1vcnksIG9iamVrdGUsIG11ZHJlY2huZXIsIGdvb2RzdHlsZSwgdGlja3MKKworIDYuIFNlcCAyMDEyIEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvY29uY2VwdHMvZXJxIGIvZG9jL2NvbmNlcHRzL2VycQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzhkNTlkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2NvbmNlcHRzL2VycQpAQCAtMCwwICsxLDU3OCBAQAorQ09OQ0VQVAorICAgICAgICBlcnEgLSBFeHRlcm5hbCBSZXF1ZXN0IERlbW9uCisKK0RFU0NSSVBUSU9OCisgICAgICAgIFVwIHRvIHZlcnNpb24gMy4yLjFANjEsIExQTXVkIHV0aWxpemVkIHR3byBleHRlcm5hbCBwcm9ncmFtcworICAgICAgICBpbiBhbiBhZC1ob2MgbWFubmVyIHRvIHNvbHZlIHByb2JsZW1zOiB0aGUgJ2huYW1lJyBwcm9ncmFtIHRvCisgICAgICAgIHJlc29sdmUgSVAgYWRkcmVzc2VzIGludG8gbWVhbmluZ2Z1bCBob3N0bmFtZXMsIGFuZCB0aGUKKyAgICAgICAgJ2luZGVudCcgcHJvZ3JhbSB0byBwcm9wZXJseSBpbmRlbnQgTFBDIGZpbGVzLgorICAgICAgICBJbiB2ZXJzaW9uIDMuMi4xQDYxIGJvdGggZnVuY3Rpb25zIHdlcmUgdW5pdGVkIGluIGEKKyAgICAgICAgZ2VuZXJhbGl6ZWQgJ2VycScgcHJvY2VzcywgdG8gd2hpY2ggYWRkaXRpb25hbCBmdW5jdGlvbnMgbWF5CisgICAgICAgIGJlIGF0dGFjaGVkLiBVbmZvcnR1bmF0ZWx5IGl0IHdhcyBuZXZlciBkb2N1bWVudGVkIGJ5IEFteWxhYXIsCisgICAgICAgIHNvIHRoZSBpbmZvcm1hdGlvbiBwcmVzZW50ZWQgaGVyZSBoYWQgdG8gYmUgcmV2ZXJzZSBlbmdpbmVlcmVkCisgICAgICAgIGZyb20gdGhlIHNvdXJjZXMgLSBiZXR0ZXIgdGFrZSBpdCB3aXRoIGEgZ3JhaW4gb2Ygc2FsdC4KKworICAgICAgICBUaGUgZXJxIGZlYXR1cmUgaXMgYXZhaWxhYmxlIGlmIHRoZSBkcml2ZXIgaXMgY29tcGlsZWQgd2l0aAorICAgICAgICBFUlFfREVNT04gZGVmaW5lZCAoaW4gY29uZmlnLmgpLgorCisgICAgICAgIFdoZW4gdGhlIGRyaXZlciBzdGFydHMgdXAsIGl0IHRyaWVzIHRvIGZvcmsgb2ZmIHRoZSBwcm9ncmFtCisgICAgICAgICdCSU5ESVIvZXJxIC0tZm9ya2VkIDxvdGhlciBhcmdzPicgKHdpdGggQklORElSIGRlZmluZWQgaW4KKyAgICAgICAgdGhlIE1ha2VmaWxlKS4gSWYgdGhpcyBzdWNjZWVkcywgdGhlIGVycSBtYXkgdGFsayB3aXRoCisgICAgICAgIHRoZSBkcml2ZXIgdGhyb3VnaCBzdGRpbiBhbmQgc3Rkb3V0IChwaXBlZCB0aHJvdWdoIEFGX1VOSVgKKyAgICAgICAgc29ja2V0cykuIFRoZSBlcnEgaGFzIHRvIHNpZ25hbCBpdHMgc3VjY2Vzc2Z1bGwgc3RhcnQgYnkKKyAgICAgICAgd3JpdGluZyB0aGUgY2hhcmFjdGVyICcxJyBiYWNrIHRvIHRoZSBkcml2ZXIuCisKKyAgICAgICAgVGhlIGVycSBoYXMgdG8gdW5kZXJzdGFuZCB0aGVzZSBjb21tYW5kbGluZSBhcmd1bWVudHM6CisKKyAgICAgICAgICAtLWZvcmtlZDogZXhwbGFpbmVkIGFib3ZlCisgICAgICAgICAgLS1leGVjZGlyIDxkaXI+OiBUaGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBjYWxsYWJsZSBleGVjdXRhYmxlcworICAgICAgICAgICAgICAgICAgICBjYW4gYmUgZm91bmQuIElmIG5vdCBzcGVjaWZpZWQsIEVSUV9ESVIgaXMgdXNlZC4KKyAgICAgICAgICAgICAgICAgICAgPGRpcj4gbXVzdCBub3QgZW5kIGluIGEgJy8nIGFuZCBzaG91bGQgYmUgYWJzb2x1dGUuCisKKyAgICAgICAgQXQgcnVudGltZSwgdGhlIGVycSBtYXkgYmUgY2hhbmdlZC9yZW1vdmVkIGZyb20gd2l0aGluIHRoZQorICAgICAgICBtdWRsaWIgdXNpbmcgdGhlIGVmdW4gYXR0YWNoX2VycV9kZW1vbigpLiBUaGlzIGVmdW4gaXMgZ2l2ZW4KKyAgICAgICAgYW4gaW50ZXJhY3RpdmUgb2JqZWN0IGFzIGFyZ3VtZW50LCBhbmQgdGFrZXMgdGhlIGNvbm5lY3Rpb24KKyAgICAgICAgYXdheSghKSBmcm9tIHRoaXMgb2JqZWN0IGFuZCBzdG9yZXMgaXQgYXMgdGhlIGVycSBjb25uZWN0aW9uCisgICAgICAgIHRvIHVzZSAoYW4gb2xkIGVycSBjb25uZWN0aW9uIGlzIGNsb3NlZCBmaXJzdCkuIFRoZSBvYmplY3QKKyAgICAgICAgKHdoaWNoIG5vdyBubyBsb25nZXIgaXMgaW50ZXJhY3RpdmUpIGlzIHRoZW4gbm8gbG9uZ2VyIG5lZWRlZCwKKyAgICAgICAgYnV0IG1heSBjb250aW51ZSB0byBleGlzdC4KKyAgICAgICAgVGhlIGVycSBhdHRhY2hlZCB0aGlzIHdheSBvZiBjb3Vyc2UgaGFzIHRvIHVzZSB0aGUgc29ja2V0cyBpdAorICAgICAgICBvcGVuZWQgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgZHJpdmVyLgorCisgICAgICAgIE1vc3Qgb2YgdGhlIGNvbW11bmljYXRpb24gYmV0d2VlbiBlcnEgYW5kIGRyaXZlciBpcyBnb2luZyB0bworICAgICAgICBiZSBpbml0aWF0ZWQgYnkgdGhlIGRyaXZlciAodGhlIGVycSBoYXMgdG8gbG9vayB1cCB0aGUKKyAgICAgICAgaG9zdG5hbWVzIGZvciBnaXZlbiBJUCBhZGRyZXNzZXMpLCBidXQgdXNpbmcgdGhlIGVmdW4KKyAgICAgICAgc2VuZF9lcnEoKSB0aGUgbXVkbGliIG1heSB0YWxrIHdpdGggdGhlIGVycSBhcyB3ZWxsLgorCisgICAgICAgIFRoZSBjb21tdW5pY2F0aW9uIGJldHdlZW4gZHJpdmVyIGFuZCBlcnEgaXMgZG9uZSB1c2luZworICAgICAgICBtZXNzYWdlcyBvZiBzcGVjaWZpZWQgc3RydWN0dXJlcyBhbmQgY29uc3RhbnRzIChkZWZpbmVkIGluCisgICAgICAgIHV0aWwvZXJxLmggcmVzcC4gc3lzL2VycS5oKS4gVGhlICdpbnQzMidzIGFyZSBzaWduZWQgaW50ZWdlcnMKKyAgICAgICAgb2YgZm91ciBieXRlIGxlbmd0aCwgYW5kIGFyZSBzZW50IHdpdGggdGhlIE1TQnl0ZSBmaXJzdC4KKyAgICAgICAgRXZlcnkgbWVzc2FnZSBtdXN0IGJlIHNlbnQgYXRvbWljYWxseSEKKworICAgICAgICBUaGUgaGVhZCBvZiB0aGUgbWVzc2FnZXMgaXMgYWx3YXlzIHRoZSBzYW1lOgorCisgICAgICAgICAgc3RydWN0IGVycV9tc2doZWFkIHsKKyAgICAgICAgICAgIGludDMyICBtc2dsZW47ICAvKiBUb3RhbCBzaXplIG9mIG1lc3NhZ2UgaW4gYnl0ZXMgKi8KKyAgICAgICAgICAgIGludDMyICBoYW5kbGU7ICAvKiBJZGVudGlmaWNhdGlvbiBudW1iZXIgKi8KKyAgICAgICAgICB9CisKKyAgICAgICAgVGhlICdoYW5kbGUnIG51bWJlciBpcyBzZXQgYnkgdGhlIGRyaXZlciAoZG8gbm90IG1ha2UKKyAgICAgICAgYXNzdW1wdGlvbnMgYWJvdXQgaXRzIHZhbHVlKSBhbmQgaXMgdXNlZCB0byBhc3NvY2lhdGVkIHRoZSBlcnEKKyAgICAgICAgcmVzcG9uc2VzIHdpdGggdGhlIHBlbmRpbmcgcmVxdWVzdHMuIFRoaXMgd2F5IHRoZSBlcnEgaXMgZnJlZQorICAgICAgICB0byByZXNwb25kIGluIGFuIG9yZGVyIGRpZmZlcmVudCB0byB0aG9zZSBvZiB0aGUgaW5jb21pbmcKKyAgICAgICAgcmVxdWVzdHMuCisKKyAgICAgICAgVGhlIG1lc3NhZ2VzIHNlbmQgdG8gdGhlIGVycSBmb2xsb3cgdGhpcyBzeW1ib2xpYyBmb3JtYXQ6CisKKyAgICAgICAgICBzdHJ1Y3QgdG9fZXJxX21zZyB7CisgICAgICAgICAgICBpbnQzMiAgbXNnbGVuOworICAgICAgICAgICAgaW50MzIgIGhhbmRsZTsKKyAgICAgICAgICAgIGNoYXIgICByZXF1ZXN0OworICAgICAgICAgICAgY2hhciAgIGRhdGFbMF07CisgICAgICAgICAgfQorCisgICAgICAgIFRoZSAncmVxdWVzdCcgZGVub3RlcyB3aGljaCBzZXJ2aWNlIGlzIHJlcXVlc3RlZCBmcm9tIHRoZSBlcnEsCisgICAgICAgIHRoZSBzaXplIGFuZCBjb250ZW50IG9mICdkYXRhJyBkZXBlbmRzIG9uIHRoZSByZXF1ZXN0ZWQKKyAgICAgICAgc2VydmljZS4KKworICAgICAgICBUaGUgYW5zd2VyIG1lc3NhZ2UgZnJvbSB0aGUgZXJxIHRvIHRoZSBkcml2ZXIgKGlmIHRoZXJlIGlzIG9uZQorICAgICAgICBhdCBhbGwpIG1heSBoYXZlIHR3byBmb3JtczoKKworICAgICAgICAgIHN0cnVjdCBmcm9tX2VycV9tc2cgeworICAgICAgICAgICAgaW50MzIgIG1zZ2xlbjsKKyAgICAgICAgICAgIGludDMyICBoYW5kbGU7CisgICAgICAgICAgICBjaGFyICAgZGF0YVswXTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBzdHJ1Y3QgZnJvbV9lcnFfa2VlcF9tc2cgeworICAgICAgICAgICAgaW50MzIgICAgICAgIG1zZ2xlbjsKKyAgICAgICAgICAgIGNvbnN0IGludDMyICBrZWVwID0gRVJRX0tFRVBfSEFORExFOworICAgICAgICAgICAgaW50MzIgICAgICAgIGhhbmRsZTsKKyAgICAgICAgICAgIGNoYXIgICAgICAgICBkYXRhWzBdOworICAgICAgICAgIH0KKworICAgICAgICBUaGUgcmVwbGllZCBkYXRhIGZyb20gdGhlIGVycSBpcyBzdG9yZWQgaW4gJ2RhdGEnLCB3aGljaCBzaXplCisgICAgICAgIGFuZCBjb250ZW50IGRlcGVuZHMgb24gdGhlIHJlcXVlc3QgYW5zd2VyZWQuIFRoZSBhbnN3ZXIgaXMKKyAgICAgICAgaWRlbnRpZmllZCBieSAnaGVhZGVyLmhhbmRsZScuIE5vcm1hbGx5LCBvbmUgcmVxdWVzdCByZXN1bHRzCisgICAgICAgIGluIGp1c3Qgb25lIHJlc3BvbnNlIHNlbnQgYnkgdGhlIGVycSB1c2luZyBzdHJ1Y3QgZnJvbV9lcnFfbXNnLAorICAgICAgICBzbyB0aGUgaGFuZGxlIGlzIHJlY3ljbGVkIGFmdGVyIHRoaXMgcmVzcG9uc2UuCisgICAgICAgIFNoYWxsIHRoZSBlcnEgc2VuZCBzZXZlcmFsIHJlc3BvbnNlcyAob3IgYnJlYWsgb25lIHJlc3BvbnNlCisgICAgICAgIGludG8gc2V2ZXJhbCBwYXJ0cyksIHRoZSBzdHJ1Y3QgZnJvbV9lcnFfa2VlcF9tc2cgaGFzIHRvIGJlCisgICAgICAgIHVzZWQgZm9yIGFsbCBidXQgdGhlIGxhc3QgcmVzcG9uc2UgLSB0aGlzIG1lc3NhZ2Ugd2l0aCBpdHMKKyAgICAgICAgaW5jbHVkZWQgc3BlY2lhbCBoYW5kbGUga2VlcHMgdGhlIHJlYWwgaGFuZGxlIGFsaXZlLgorCisKKyAgICAgICAgTXVkbGliIGdlbmVyYXRlZCBlcnEtY2FsbHMgc3BlY2lmeSB0aGUgJ3JlcXVlc3QnIGFuZCB0aGUKKyAgICAgICAgJ2RhdGEnIHRvIGJlIHNlbnQsIGFuZCByZWNlaXZlIHRoZSAnZGF0YScgcmVwbGllZC4gV2hlbgorICAgICAgICBkZWFsaW5nIHdpdGggc3Bhd25lZCBwcm9ncmFtcywgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHJldHVybmVkCisgICAgICAgICdkYXRhJyBkZXRlcm1pbmVzIHRoZSBjb250ZW50IHR5cGUgb2YgdGhlIHJlY2VpdmVkIG1lc3NhZ2UuCisgICAgICAgIFRoZSBhY3R1YWwgJ2RhdGEnIHdoaWNoIHRoZSBscGMgcHJvZ3JhbXMgZ2V0IHRvIHNlZSBpcyBzZW50CisgICAgICAgIGFuZCByZXRyaWV2ZWQgYXMgYXJyYXlzIG9mIGJ5dGUgaW50ZWdlcnMgKGludGVnZXJzIGluIHRoZQorICAgICAgICByYW5nZSBvZiAwLi4yNTUpLgorCisKKyAgICAgICAgVGhlIGFjdHVhbCBpbnRlcmZhY2UgYmV0d2VlbiBlcnEgZGVtb24gYW5kIGRyaXZlciBpcyBsaW1pdGVkCisgICAgICAgIHRvIHRoZSBnZW5lcmFsIG1lc3NhZ2UgZm9ybWF0cyBhbmQgdGhlIGhvc3RuYW1lIGxvb2t1cAorICAgICAgICBtZWNoYW5pc20uIFRoZSBkcml2ZXIgaXMgbWVhbnQgdG8gd2l0aHN0YW5kIGVycSBkZW1vbiBmYWlsdXJlcworICAgICAgICBhdCBsZWFzdCBpbiBhIGdhcmJhZ2UtaW4gZ2FyYmFnZS1vdXQgZmFzaGlvbi4gWW91IGNvdWxkIGFkZAorICAgICAgICBuZXcgcmVxdWVzdHMgdG8gdGhlIGVycSBkZW1vbiwgb3Igd3JpdGUgeW91ciBvd24gZnJvbSBzY3JhdGNoLAorICAgICAgICB3aXRob3V0IGNoYW5naW5nIHRoZSBkcml2ZXIuCisKKworICAgICAgICBDdXJyZW50bHkgZml2ZSBzZXJ2aWNlcyBhcmUgcHJlZGVmaW5lZCBpbiB0aGUgc3VwcGxpZWQKKyAgICAgICAgZXJxLWRlbW9uICh1dGlsL2VycS5jIGluIHRoZSBkcml2ZXIgc291cmNlIGFyY2hpdmUpOiBsb29raW5nCisgICAgICAgIHVwIGEgaG9zdG5hbWUsIGV4ZWN1dGlvbiwgZm9ya2luZyBvciBzcGF3bmluZyBhbiBleHRlcm5hbAorICAgICAgICBwcm9ncmFtLCBhdXRoZW50aWZpY2F0aW9uIG9mIGEgY29ubmVjdGlvbiwgYW5kIGhhbmRsaW5nIG9mCisgICAgICAgIGV4dGVybmFsIFVEUC9UQ1AgY29ubmVjdGlvbnMuIEFzIG1lbnRpb25lZCBhYm92ZSwgb25seSB0aGUKKyAgICAgICAgaG9zdG5hbWUtbG9va3VwIGlzIGEgdHJ1ZSBtdXN0LgorCisgICAgICAgIEZvciBhIHByb2dyYW0gdG8gYmUgZXhlY3V0YWJsZSBmb3IgZXJxLCBpdCBtdXN0IGJlIHBsYWNlZCBpbgorICAgICAgICBvciBiZWxvdyBFUlFfRElSIChkZWZpbmVkIGluIGNvbmZpZy5oKS4gT24gbW9zdCB1bml4IHN5c3RlbXMsCisgICAgICAgIGl0IGlzIHBvc3NpYmxlIHRvIHVzZSBhIHN5bWxpbmsgaW5zdGVhZCBvZiB0aGUgd2hvbGUgcHJvZ3JhbQorICAgICAgICBpZiB5b3Ugd2FudCBhIHN0YW5kYXJkIGJpbmFyeS4gWW91IGNvdWxkIGV2ZW4gc3ltbGluayBlbnRpcmUKKyAgICAgICAgZGlyZWN0b3JpZXMgbGlrZSAvdXNyL3NiaW4sIGJ1dCBjaGFuY2VzIGFyZSB5b3UgbWFrZSBhIGJpZworICAgICAgICBzZWN1cml0eSBob2xlIHRoaXMgd2F5IDotKQorCisKKyAgICAgICAgSG9zdG5hbWUgbG9va3VwOgorCisgICAgICAgICAgcmVxdWVzdCAgOiBFUlFfUkxPT0tVUAorICAgICAgICAgIGRhdGEgc2VudDogc3RydWN0IGluX2FkZHIuc19hZGRyIGFkZHIgLy8gdGhlIGFkZHJlc3MgdG8gcmVzb2x2ZQorICAgICAgICAgIGRhdGEgcmVjdjogc3RydWN0IGluX2FkZHIuc19hZGRyIGFkZHIgLy8gdGhlIHJlc29sdmVkIGFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgIGNoYXJbXSAgICAgICAgICAgICAgICBuYW1lIC8vIHRoZSBob3N0bmFtZSAoaWYgYW55KQorCisgICAgICAgICAgSWYgdGhlIHNlbnQgYWRkcmVzcyBjYW4ndCBiZSByZXNvbHZlZCwganVzdCB0aGUgYWRkcmVzcyBpcworICAgICAgICAgIHRvIGJlIHJldHVybmVkLiBUaGUgc3RyaW5nIG5lZWQgbm90IGJlIDAtdGVybWluYXRlZC4KKworCisgICAgICAgIEhvc3RuYW1lIGxvb2t1cDoKKworICAgICAgICAgIHJlcXVlc3QgIDogRVJRX0xPT0tVUAorICAgICAgICAgIGRhdGEgc2VudDogY2hhcltdICAgICAgICAgICAgICAgIG5hbWUgLy8gdGhlIG5hbWUgdG8gcmVzb2x2ZQorICAgICAgICAgIGRhdGEgcmVjdjogc3RydWN0IGluX2FkZHIuc19hZGRyIGFkZHIgLy8gdGhlIHJlc29sdmVkIGFkZHJlc3MKKworICAgICAgICAgIElmIHRoZSBzZW50IGFkZHJlc3MgY2FuJ3QgYmUgcmVzb2x2ZWQsIG5vIGRhdGEgaXMgcmV0dXJuZWQgKHRoZQorICAgICAgICAgIGRyaXZlciB3aWxsIGdldCBhIG1lc3NhZ2Ugd2l0aCBqdXN0IHRoZSBoZWFkZXIpLgorCisKKyAgICAgICAgSG9zdG5hbWUgbG9va3VwIC0gSVB2NjoKKworICAgICAgICAgIHJlcXVlc3QgIDogRVJRX1JMT09LVVBWNgorICAgICAgICAgIGRhdGEgc2VudDogY2hhcltdIGFkZHIgIC8vIHRoZSBhZGRyZXNzIHRvIHJlc29sdmUKKyAgICAgICAgICBkYXRhIHJlY3Y6IGNoYXJbXSBkYXRhICAvLyB0aGUgcmVzb2x2ZWQgbmFtZQorCisgICAgICAgICAgSWYgdGhlIGFkZHJlc3MgY291bGQgYmUgcmVzb2x2ZWQsIHRoZSByZXR1cm5lZCBkYXRhIGlzIGEgc3RyaW5nLAorICAgICAgICAgIHdpdGggZXhhY3RseSBvbmUgc3BhY2UsIGluIHRoZSBmb3JtICI8YWRkcj4gPG5hbWU+Ii4gPGFkZHI+IGlzCisgICAgICAgICAgdGhlIGFkZHJlc3MgcGFzc2VkIHRvIHRoZSBlcnEsIDxuYW1lPiBpcyB0aGUgaG9zdG5hbWUgb2YgdGhlCisgICAgICAgICAgYWRkcmVzcyBvciwgaWYgdGhlcmUgaXMgbm8gcmV2ZXJzZS1JUHY2IGVudHJ5IGZvciA8YWRkcj4sIHRoZQorICAgICAgICAgIElQdjYgYWRkcmVzcyB3aGljaCBtYXkgb3IgbWF5IG5vdCBiZSBkaWZmZXJlbnQgZnJvbSA8YWRkcj4uCisKKyAgICAgICAgICBJZiB0aGUgYWRkcmVzcyBjYW4gbm90IGJlIHJlc29sdmVkLCB0aGUgcmV0dXJuZWQgZGF0YSBpcworICAgICAgICAgIGFuIGVycm9yIG1lc3NhZ2Ugd2l0aG91dCBhIHNwYWNlIChjdXJyZW50bHksIGp1c3QgImludmFsaWQtZm9ybWF0IgorICAgICAgICAgIGFuZCAib3V0LW9mLW1lbW9yeSIgYXJlIHJldHVybmVkKS4KKworCisgICAgICAgIEV4ZWN1dGUvRm9yayBwcm9ncmFtOgorCisgICAgICAgICAgcmVxdWVzdCAgOiBFUlFfRVhFQ1VURS9FUlFfRk9SSworICAgICAgICAgIGRhdGEgc2VudDogY2hhcltdIGNvbW1hbmQgIC8vIHRoZSBjb21tYW5kIHRvIGV4ZWN1dGUKKyAgICAgICAgICBkYXRhIHJlY3Y6IGNoYXIgICBzdGF0dXMgPSBDSElMRF9GUkVFCisgICAgICAgICAgICAgICAgICAgICBjaGFyICAgcmMgICAgICAgLy8gdGhlIHN1Y2Nlc3MvZXJyb3IgY29kZQorICAgICAgICAgICAgICAgICAgICAgY2hhciAgIGluZm8gICAgIC8vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKworICAgICAgICAgIFRoZSBlcnEgZXhlY3V0ZXMgdGhlIHNlbnQgY29tbWFuZCB1c2luZyB0aGUgZXhlY3YoKS4KKyAgICAgICAgICBUaGUgZXJxIGRvZXMgdGhlIHByb2Nlc3Npbmcgb2YgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKKyAgICAgICAgICAod2hpY2ggbXVzdCBub3QgY29udGFpbiAnXCcpIGFuZCBjaGVja3MgdGhlIHZhbGlkaXR5IG9mIHRoZQorICAgICAgICAgIGNvbW1hbmQgKGl0IG11c3Qgbm90IHN0YXJ0IHdpdGggJy8nIG5vciBjb250YWluICcuLicpLCB3aGljaAorICAgICAgICAgIGlzIGludGVycHJldGVkIHJlbGF0aXZlIHRvIEVSUV9ESVIuCisgICAgICAgICAgVGhlIGV4dGVybmFsIHByb2dyYW0gaXMgZXhlY3V0ZWQgZnJvbSBhIGZvcmsoKWVkIGluc3RhbmNlIG9mCisgICAgICAgICAgdGhlIGVycSwgaG93ZXZlciwgd2l0aCBFUlFfRVhFQ1VURSB0aGUgZXJxIHdhaXRzIHVudGlsIHRoZQorICAgICAgICAgIGV4dGVybmFsIHByb2dyYW0gZmluaXNoZWQgYmVmb3JlIHJlcGx5aW5nIGl0cyByZXNwb25zZSwgd2l0aAorICAgICAgICAgIEVSUV9GT1JLIHRoZSByZXNwb25zZSBpcyBpbW1lZGlhdGVseSBzZW50IGJhY2suCisKKyAgICAgICAgICBQb3NzaWJsZSByZXR1cm4gY29kZXMgYXJlOgorICAgICAgICAgICAgRVJRX09LICAgICAgICAgOiBPcGVyYXRpb24gc3VjY2VlZGVkLgorICAgICAgICAgICAgRVJRX0VfQVJHTEVOR1RIOiBUb28gbG9uZyBjb21tYW5kLgorICAgICAgICAgICAgRVJRX0VfQVJHRk9STUFUOiBJbGxlZ2FsIGFyZ3VtZW50IGdpdmVuIChjb250YWlucyAnXCcpOworICAgICAgICAgICAgRVJRX0VfQVJHTlVNQkVSOiBUb28gbXVjaCBhcmd1bWVudHMgKD49IDk2KS4KKyAgICAgICAgICAgIEVSUV9FX0lMTEVHQUwgIDogQ29tbWFuZCBmcm9tIG91dHNpZGUgRVJRX0RJUiByZXF1ZXN0ZWQuCisgICAgICAgICAgICBFUlFfRV9QQVRITEVOICA6IENvbW1hbmRwYXRoIHRvbyBsb25nLgorICAgICAgICAgICAgRVJRX0VfRk9SS0ZBSUwgOiBDb21tYW5kIGNvdWxkIG5vdCBiZSBmb3JrZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gaG9sZHMgdGhlIGVycm5vIHZhbHVlLgorCisgICAgICAgICAgRVJRX0VYRUNVVEUgZmVhdHVyZXMgc29tZSBtb3JlIHJldHVybiBjb2RlczoKKyAgICAgICAgICAgIEVSUV9PSyAgICAgICAgIDogT3BlcmF0aW9uIHN1Y2NlZWRlZCwgPGluZm8+IGhvbGRzIHRoZSBleGl0IHN0YXR1cy4KKyAgICAgICAgICAgIEVSUV9TSUdOQUxFRCAgIDogQ29tbWFuZCB0ZXJtaW5hdGVkIHRoZSBzaWduYWwgPGluZm8+LgorICAgICAgICAgICAgRVJRX0VfTk9URk9VTkQgOiBObyBwcm9jZXNzIGZvdW5kIHRvIHdhaXQoKSBmb3IuCisgICAgICAgICAgICBFUlFfRV9VTktOT1dOICA6IFVua25vd24gZXhpdCBjb25kaXRpb24gZnJvbSB3YWl0KCkuCisKKworICAgICAgICBTcGF3biBwcm9ncmFtOgorCisgICAgICAgICAgcmVxdWVzdCAgOiBFUlFfU1BBV04KKyAgICAgICAgICBkYXRhIHNlbnQ6IGNoYXJbXSBjb21tYW5kICAvLyB0aGUgY29tbWFuZCB0byBleGVjdXRlCisgICAgICAgICAgZGF0YSByZWN2OiBTcGF3biBmYWlsZWQ6CisgICAgICAgICAgICAgICAgICAgICBjaGFyICAgcmMgICAgICAgLy8gdGhlIGVycm9yIGNvZGUgKHNlZSBFUlFfRk9SSykKKyAgICAgICAgICAgICAgICAgICAgIGNoYXIgICBpbmZvICAgICAvLyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgICAgICAgICAgZGF0YSByZWN2OiBTcGF3biBzdWNjZWVkZWQ6CisgICAgICAgICAgICAgICAgICAgICBjaGFyICAgcmMgPSBFUlFfT0sKKyAgICAgICAgICAgICAgICAgICAgIGNoYXJbXSB0aWNrZXQgICAgICAgIC8vIHRoZSBzcGF3biB0aWNrZXQuCisKKyAgICAgICAgICBUaGUgZXJxIGV4ZWN1dGVzIHRoZSBzZW50IGNvbW1hbmQgYXMgaWYgZ2l2ZW4gYW4gRVJRX0ZPUksKKyAgICAgICAgICBjb21tYW5kLCBidXQgcmV0dXJucyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICAgICAgICAgIHN0YXJ0ZWQgcHJvY2VzcyB0byBhbGxvdyBmdXJ0aGVyIGNvbW11bmljYXRpb24uCisgICAgICAgICAgSW4gY29udHJhc3QgdG8gRVJRX0ZPUkssIEVSUV9TUEFXTkVEIHByb2Nlc3NlcyBtYXkgYmUKKyAgICAgICAgICBjb250cm9sbGVkIHZpYSBFUlFfS0lMTCwgcmVjZWl2ZSBkYXRhIGZyb20gdGhlIG11ZCB2aWEKKyAgICAgICAgICBFUlFfU0VORCBvbiB0aGVpciBzdGRpbiwgYW5kIG91dHB1dCBmcm9tIHRoZWlyIHN0ZG91dC9zdGRlcnIKKyAgICAgICAgICBpcyBzZW50IGJhY2sgdG8gdGhlIG11ZC4KKyAgICAgICAgICBUaGUgc3Bhd25lZCBwcm9jZXNzIGlzIGlkZW50aWZpZWQgYnkgaXRzIDx0aWNrZXQ+IChkb24ndAorICAgICAgICAgIG1ha2UgYW55IGFzc3VtcHRpb25zIGFib3V0IGl0cyBsZW5ndGggb3IgY29udGVudCksIHRoZSB0cmFuc2FjdGlvbgorICAgICAgICAgIGl0c2VsZiBieSA8aGFuZGxlPi4KKworCisgICAgICAgIFNlbmQgZGF0YSB0byBzcGF3bmVkIHByb2dyYW06CisKKyAgICAgICAgICByZXF1ZXN0ICA6IEVSUV9TRU5ECisgICAgICAgICAgZGF0YSBzZW50OiBjaGFyW10gIHRpY2tldCAvLyB0aGUgYWRkcmVzc2VkIHByb2Nlc3MgdGlja2V0LgorICAgICAgICAgICAgICAgICAgICAgY2hhcltdICB0ZXh0ICAgLy8gdGhlIHRleHQgdG8gc2VuZC4KKyAgICAgICAgICBkYXRhIHJlY3Y6IGNoYXIgICAgcmMgICAgIC8vIHRoZSBzdWNjZXNzL2Vycm9yIGNvZGUuCisgICAgICAgICAgICAgICAgICAgICBpbnQzMiAgIGluZm8gICAvLyBvcHQ6IGFkZGl0aW9uYWwgaW5mby4KKworICAgICAgICAgIFRoZSA8dGV4dD4gaXMgc2VudCB0byB0aGUgc3RkaW4gb2YgdGhlIHNwYXduZWQgcHJvY2VzcworICAgICAgICAgIGlkZW50aWZpZWQgYnkgPHRpY2tldD4uCisKKyAgICAgICAgICBQb3NzaWJsZSByZXR1cm4gY29kZXMgYXJlOgorICAgICAgICAgICAgRVJRX09LICAgICAgICAgIDogT3BlcmF0aW9uIHN1Y2NlZWRlZCwgbm8gPGluZm8+IGlzIHJlcGxpZWQuCisgICAgICAgICAgICBFUlFfRV9USUNLRVQgICAgOiBUaGUgZ2l2ZW4gdGlja2V0IGlzIGludmFsaWQsIG5vIDxpbmZvPiByZXBsaWVkLgorICAgICAgICAgICAgRVJRX0VfSU5DT01QTEVURTogT25seSA8aW5mbz4gY2hhcnMgb2YgdGhlIHRleHQgaGF2ZSBiZWVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgYSBjYWxsYmFjayBpcyBzcGVjaWZpZWQsIHRoZSBlcnEgd2lsbCBzZW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIEVSUV9PSyBtZXNzYWdlIG9uY2UgYWxsIGRhdGEgaGFzIGJlZW4gc2VudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMgbWF5IG5ldmVyIGhhcHBlbikuCisgICAgICAgICAgICBFUlFfRV9XT1VMREJMT0NLOiBFcnJvciBFX1dPVUxEQkxPQ0sgKGFsc28gc3RvcmVkIGluIDxpbmZvPikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcHBlbmVkIHdoaWxlIHNlbmRpbmcgdGhlIHRleHQuCisgICAgICAgICAgICBFUlFfRV9QSVBFICAgICAgOiBFcnJvciBFX1BJUEUgKGFsc28gc3RvcmVkIGluIDxpbmZvPikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcHBlbmVkIHdoaWxlIHNlbmRpbmcgdGhlIHRleHQuCisgICAgICAgICAgICBFUlFfRV9VTktOT1dOICAgOiBUaGUgZXJyb3Igd2l0aCBjb2RlIDxpbmZvPiBoYXBwZW5lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgc2VuZGluZyB0aGUgZGF0YS4KKworICAgICAgICAgQW15bGFhci1lcnEgZG9lc24ndCB0cnkgdG8gcmUtc2VuZCB0aGUgcmVtYWluaW5nIGRhdGEgYWZ0ZXIKKyAgICAgICAgIGEgRVJRX0VfSU5DT01QTEVURSwgc28gdGhlcmUgd2lsbCBuZXZlciBiZSBhbiBFUlFfT0suCisKKworICAgICAgICBTZW5kIGEgc2lnbmFsIHRvIGEgc3Bhd25lZCBwcm9ncmFtOgorCisgICAgICAgICAgcmVxdWVzdCAgOiBFUlFfS0lMTAorICAgICAgICAgIGRhdGEgc2VudDogY2hhcltdICB0aWNrZXQgLy8gdGhlIGFkZHJlc3NlZCBwcm9jZXNzIHRpY2tldAorICAgICAgICAgICAgICAgICAgICAgaW50MzIgICBzaWduYWwgLy8gdGhlIHNpZ25hbCB0byBzZW5kCisgICAgICAgICAgZGF0YSByZWN2OiBjaGFyICAgIHJjICAgICAvLyB0aGUgc3VjY2Vzcy9lcnJvciBjb2RlCisKKyAgICAgICAgICBUaGUgPHNpZ25hbD4gaXMgc2VudCB0byB0aGUgc3Bhd25lZCBwcm9jZXNzIGlkZW50aWZpZWQgYnkgPHRpY2tldD4uCisKKyAgICAgICAgICBQb3NzaWJsZSByZXR1cm4gY29kZXMgYXJlOgorICAgICAgICAgICAgRVJRX09LICAgICAgICAgIDogT3BlcmF0aW9uIHN1Y2NlZWRlZCwgbm8gPGluZm8+IGlzIHJlcGxpZWQuCisgICAgICAgICAgICBFUlFfRV9USUNLRVQgICAgOiBUaGUgZ2l2ZW4gdGlja2V0IGlzIGludmFsaWQsIG5vIDxpbmZvPiByZXBsaWVkLgorICAgICAgICAgICAgRVJRX0VfSUxMRUdBTCAgIDogVGhlIGdpdmVuIHNpZ25hbCBpcyBpbGxlZ2FsLgorCisKKyAgICAgICAgRGF0YSByZXBsaWVzIGZyb20gc3Bhd25lZCBwcm9ncmFtczoKKworICAgICAgICAgIGRhdGEgcmVjdjogY2hhciAgIG91dF9vcl9lcnIgIC8vIHR5cGUgb2YgdGV4dCBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgIGNoYXJbXSB0ZXh0ICAgICAgICAvLyB0ZXh0IG91dHB1dCBieSBjaGlsZCBwcm9jZXNzCisKKyAgICAgICAgICBUaGUgY2hpbGQgcHJvY2VzcyBjb250cm9sbGVkIGJ5IHRoZSBlcnEgZGlkIG91dHB1dCA8dGV4dD4KKyAgICAgICAgICBvbiBzdGRvdXQgKDxvdXRfb3JfZXJyPiA9PSBFUlFfU1RET1VUKSByZXNwLiBvbiBzdGRlcnIKKyAgICAgICAgICAoPG91dF9vcl9lcnI+ID09IEVSUV9TVERFUlIpLgorCisKKyAgICAgICAgRXhpdCBub3RpZmljYXRpb25zIGZyb20gc3Bhd25lZCBwcm9ncmFtczoKKworICAgICAgICAgIGRhdGEgcmVjdjogY2hhciAgIHJjICAgICAgICAgIC8vIHRoZSBleGl0IGNvZGUKKyAgICAgICAgICAgICAgICAgICAgIGNoYXIgICBpbmZvICAgICAgICAvLyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLgorCisgICAgICAgICAgVGhlIGNoaWxkIHByb2Nlc3MgY29udHJvbGxlZCBieSB0aGUgZXJxIGRpZCB0ZXJtaW5hdGUuCisgICAgICAgICAgUG9zc2libGUgZXhpdCBjb2RlcyBhcmU6CisgICAgICAgICAgICBFUlFfRVhJVEVEICAgIDogUHJvY2VzcyBleGl0ZWQgd2l0aCBzdGF0dXMgPGluZm8+LgorICAgICAgICAgICAgRVJRX1NJR05BTEVEICA6IFByb2Nlc3MgdGVybWluYXRlZCBieSBzaWduYWwgPGluZm8+LgorICAgICAgICAgICAgRVJRX0VfVU5LTk9XTiA6IFByb2Nlc3MgdGVybWluYXRlZCBmb3IgdW5rbm93biByZWFzb24uCisKKworICAgICAgICBBdXRoZW50aWZpY2F0ZSBjb25uZWN0aW9uIChzZWUgcmZjIDkzMSk6CisKKyAgICAgICAgICByZXF1ZXN0ICA6IEVSUV9BVVRICisgICAgICAgICAgZGF0YSBzZW50OiBzdHJ1Y3Qgc29ja2FkZHJfaW4gcmVtb3RlIC8vIHRoZSBhZGRyZXNzIHRvIGNoZWNrCisgICAgICAgICAgICAgICAgICAgICBpbnQzMiAgICAgICAgICAgICAgcG9ydCAgIC8vIHRoZSBtdWQgcG9ydAorICAgICAgICAgICAgIG9yCisgICAgICAgICAgZGF0YSBzZW50OiBpbnQzMiAgcmVtb3RlX2lwICAgIC8vIHJlbW90ZSBpcCB0byBjaGVjaworICAgICAgICAgICAgICAgICAgICAgaW50MTYgIHJlbW90ZV9wb3J0ICAvLyByZW1vdGUgcG9ydCB0byBjaGVjaworICAgICAgICAgICAgICAgICAgICAgaW50MTYgIGxvY2FsX3BvcnQgICAvLyB0aGUgbXVkIHBvcnQKKworICAgICAgICAgIGRhdGEgcmVjdjogY2hhcltdICAgICAgICAgICAgIHJlcGx5ICAvLyB0aGUgZGF0YSByZWNlaXZlZCBieSBhdXRoZAorCisgICAgICAgICAgVGhlIGVycSBhdHRlbXB0cyB0byBjb25uZWN0IHRoZSBhdXRoZCBvbiB0aGUgcmVtb3RlIHN5c3RlbQorICAgICAgICAgIGFuZCB0byB2ZXJpZnkgdGhlIGNvbm5lY3Rpb24gYmV0d2VlbiB0aGUgcmVtb3RlIHBvcnQgYW5kIHRoZQorICAgICAgICAgIG11ZCBwb3J0LiBUaGUgbGF0dGVyIHdpbGwgbm9ybWFsbHkgYmUgdGhlIHBvcnQgbnVtYmVyIG9mIHRoZQorICAgICAgICAgIHNvY2tldCBvbiBiZXNpZGVzIG9mIHRoZSBnYW1lZHJpdmVyLCByZXRyaWV2ZWFibGUgYnkKKyAgICAgICAgICBxdWVyeV9pcF9udW1iZXIoKS4KKworICAgICAgICAgIFRoZSBhbnN3ZXIgZnJvbSB0aGUgYXV0aGQgKG9uZSBsaW5lIG9mIHRleHQpIGlmIHRoZXJlIGlzIGFueQorICAgICAgICAgIGlzIHJldHVybmVkIGFzIHJlc3VsdC4KKworICAgICAgICAgIFRoZSBzZWNvbmQgZm9ybSBvZiB0aGUgRVJRX0FVVEggY29tbWFuZCBpcyByZWNvZ25pemVkIGJ5CisgICAgICAgICAgdGhlIHhlcnEgYXMgYWx0ZXJuYXRpdmUuCisKKworICAgICAgICBPcGVuIGFuIFVQRCBwb3J0OgorCisgICAgICAgICAgcmVxdWVzdCAgOiBFUlFfT1BFTl9VRFAKKyAgICAgICAgICBkYXRhIHNlbnQ6IGNoYXJbMl0gcG9ydCAgIC8vIHRoZSBwb3J0IG51bWJlciB0byBvcGVuIChuZXR3b3JrIG9yZGVyKQorICAgICAgICAgIGRhdGEgcmVjdjogT3BlbiBmYWlsZWQ6CisgICAgICAgICAgICAgICAgICAgICBjaGFyICAgIHJjICAgICAvLyB0aGUgc3VjY2Vzcy9lcnJvciBjb2RlLgorICAgICAgICAgICAgICAgICAgICAgY2hhciAgICBpbmZvICAgLy8gb3B0OiBhZGRpdGlvbmFsIGluZm8uCisgICAgICAgICAgZGF0YSByZWN2OiBPcGVuIHN1Y2NlZWRlZDoKKyAgICAgICAgICAgICAgICAgICAgIGNoYXIgICByYyA9IEVSUV9PSworICAgICAgICAgICAgICAgICAgICAgY2hhcltdIHRpY2tldCAgLy8gdGhlIGNvbm5lY3Rpb24gdGlja2V0LgorCisgICAgICAgICAgVGhlIGVycSBvcGVucyBhbiBVRFAtcG9ydCBvbiB0aGUgaG9zdCBtYWNoaW5lIHdpdGggdGhlIGdpdmVuCisgICAgICAgICAgcG9ydCBudW1iZXIuCisgICAgICAgICAgUG9zc2libGUgZXhpdCBjb2RlcyBhcmU6CisgICAgICAgICAgICBFUlFfT0sgICAgICAgICAgOiBPcGVyYXRpb24gc3VjY2VlZGVkLgorICAgICAgICAgICAgRVJRX0VfQVJHTEVOR1RIIDogVGhlIHBvcnQgbnVtYmVyIGdpdmVuIGRvZXMgbm90IGNvbnNpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHR3byBieXRlcy4KKyAgICAgICAgICAgIEVSUV9FX05TTE9UUyAgICA6IFRoZSBtYXggbnVtYmVyIG9mIGNoaWxkIHByb2Nlc3NlcyAoZ2l2ZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIDxpbmZvPikgaXMgZXhoYXVzdGVkLgorICAgICAgICAgICAgRVJRX0VfVU5LTk9XTiAgIDogRXJyb3IgPGluZm8+IG9jY3VyZWQgaW4gb25lIG9mIHRoZSBzeXN0ZW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxzIGRvbmUgdG8gb3BlbiB0aGUgcG9ydC4KKworICAgICAgICAgIE9uY2UgdGhlIHBvcnQgaXMgb3BlbiwgaXQgaXMgdHJlYXRlZCBhcyBpZiBpcyBqdXN0IGFub3RoZXIKKyAgICAgICAgICBzcGF3bmVkIHByb2dyYW0uCisKKworICAgICAgICBTZW5kIGRhdGEgb3ZlciBhbiBVRFAgcG9ydDoKKworICAgICAgICAgIHJlcXVlc3QgIDogRVJRX1NFTkQKKyAgICAgICAgICBkYXRhIHNlbnQ6IGNoYXJbXSAgICAgICAgICAgICAgICB0aWNrZXQgLy8gdGhlIGFkZHJlc3NlZCBwb3J0J3MgdGlja2V0LgorICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGluX2FkZHIuc19hZGRyIGFkZHIgICAvLyBhZGRyZXNzIG9mIHJlY2VpdmVyLgorICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGFkZHIuc2luX3BvcnQgIHBvcnQgICAvLyBwb3J0IG9mIHJlY2VpdmVyLgorICAgICAgICAgICAgICAgICAgICAgY2hhcltdICAgICAgICAgICAgICAgIHRleHQgICAvLyB0aGUgdGV4dCB0byBzZW5kLgorICAgICAgICAgIGRhdGEgcmVjdjogY2hhciAgIHJjICAgICAvLyB0aGUgc3VjY2Vzcy9lcnJvciBjb2RlLgorICAgICAgICAgICAgICAgICAgICAgaW50MzIgIGluZm8gICAvLyBvcHQ6IGFkZGl0aW9uYWwgaW5mby4KKworICAgICAgICAgIFRoZSA8dGV4dD4gaXMgc2VudCBmcm9tIG91ciBwb3J0IDx0aWNrZXQ+IHRvIHRoZSBuZXR3b3JrCisgICAgICAgICAgYWRkcmVzcyA8YWRkcj4sIHBvcnQgPHBvcnQ+LgorCisgICAgICAgICAgUG9zc2libGUgcmV0dXJuIGNvZGVzIGFyZToKKyAgICAgICAgICAgIEVSUV9PSyAgICAgICAgICA6IE9wZXJhdGlvbiBzdWNjZWVkZWQsIG5vIDxpbmZvPiBpcyByZXBsaWVkLgorICAgICAgICAgICAgRVJRX0VfVElDS0VUICAgIDogVGhlIGdpdmVuIHRpY2tldCBpcyBpbnZhbGlkLCBubyA8aW5mbz4gcmVwbGllZC4KKyAgICAgICAgICAgIEVSUV9FX0lOQ09NUExFVEU6IE9ubHkgPGluZm8+IGNoYXJzIG9mIHRoZSB0ZXh0IGhhdmUgYmVlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VudC4gVGhlIGVycSB3aWxsIHNlbmQgYSBFUlFfT0sgbWVzc2FnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25jZSBhbGwgZGF0YSBoYXMgYmVlbiBzZW50LgorICAgICAgICAgICAgRVJRX0VfV09VTERCTE9DSzogRXJyb3IgRV9XT1VMREJMT0NLIChhbHNvIHN0b3JlZCBpbiA8aW5mbz4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXBwZW5lZCB3aGlsZSBzZW5kaW5nIHRoZSB0ZXh0LgorICAgICAgICAgICAgRVJRX0VfUElQRSAgICAgIDogRXJyb3IgRV9QSVBFIChhbHNvIHN0b3JlZCBpbiA8aW5mbz4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXBwZW5lZCB3aGlsZSBzZW5kaW5nIHRoZSB0ZXh0LgorICAgICAgICAgICAgRVJRX0VfVU5LTk9XTiAgIDogVGhlIGVycm9yIHdpdGggY29kZSA8aW5mbz4gaGFwcGVuZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIHNlbmRpbmcgdGhlIGRhdGEuCisKKworICAgICAgICBDbG9zZSBhbiBVRFAgcG9ydDoKKworICAgICAgICAgIHJlcXVlc3QgIDogRVJRX0tJTEwKKyAgICAgICAgICBkYXRhIHNlbnQ6IGNoYXJbXSAgdGlja2V0IC8vIHRoZSBhZGRyZXNzZWQgcG9ydCdzIHRpY2tldAorICAgICAgICAgICAgICAgICAgICAgaW50MzIgICBzaWduYWwgLy8gdGhlIHNpZ25hbCB0byBzZW5kIChpZ25vcmVkKQorICAgICAgICAgIGRhdGEgcmVjdjogY2hhciAgICByYyA9IEVSUV9PSworCisgICAgICAgICAgVGhlIHBvcnQgPHRpY2tldD4gaXMgY2xvc2VkLiBUaGUgPHNpZ25hbD4gbXVzdCBiZSBzZW50LCBidXQKKyAgICAgICAgICBpdHMgdmFsdWUgaXMgaWdub3JlZC4KKworCisgICAgICAgIERhdGEgcmVjZWl2ZWQgb3ZlciBhbiBVRFAgY29ubmVjdGlvbjoKKworICAgICAgICAgIGRhdGEgcmVjdjogY2hhciAgICAgICAgICAgICAgICAgIG91dF9vcl9lcnIgPSBFUlFfU1RET1VUCisgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW5fYWRkci5zX2FkZHIgYWRkciAgICAvLyBpcC1hZGRyZXNzIG9mIHNlbmRlcgorICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGFkZHIuc2luX3BvcnQgIHBvcnQgICAgLy8gcG9ydCBvZiBzZW5kZXIKKyAgICAgICAgICAgICAgICAgICAgIGNoYXJbXSAgICAgICAgICAgICAgICB0ZXh0ICAgIC8vIGRhdGEgcmVjZWl2ZWQKKworICAgICAgICAgIFRoZSBVUEQgcG9ydCBjb250cm9sbGVkIGJ5IHRoZSBlcnEgZGlkIHJlY2VpdmUgPHRleHQ+IG92ZXIKKyAgICAgICAgICB0aGUgbmV0d29yayBmcm9tIHRoZSBzZW5kZXIgYXQgPGFkZHI+LCByZXBseSBwb3J0IG51bWJlciA8cG9ydD4uCisKKworICAgICAgICBPcGVuIGFuIFRDUCB0byBsaXN0ZW4gZm9yIGNvbm5lY3Rpb25zOgorCisgICAgICAgICAgcmVxdWVzdCAgOiBFUlFfTElTVEVOCisgICAgICAgICAgZGF0YSBzZW50OiBzdHJ1Y3QgYWRkci5zaW5fcG9ydCBwb3J0ICAgLy8gdGhlIHBvcnQgbnVtYmVyIHRvIG9wZW4KKyAgICAgICAgICBkYXRhIHJlY3Y6IE9wZW4gZmFpbGVkOgorICAgICAgICAgICAgICAgICAgICAgY2hhciAgICByYyAgICAgLy8gdGhlIHN1Y2Nlc3MvZXJyb3IgY29kZS4KKyAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgaW5mbyAgIC8vIG9wdDogYWRkaXRpb25hbCBpbmZvLgorICAgICAgICAgIGRhdGEgcmVjdjogT3BlbiBzdWNjZWVkZWQ6CisgICAgICAgICAgICAgICAgICAgICBjaGFyICAgcmMgPSBFUlFfT0sKKyAgICAgICAgICAgICAgICAgICAgIGNoYXJbXSB0aWNrZXQgIC8vIHRoZSBjb25uZWN0aW9uIHRpY2tldC4KKworICAgICAgICAgIFRoZSBlcnEgb3BlbnMgYW4gVENQLXBvcnQgb24gdGhlIGhvc3QgbWFjaGluZSB3aXRoIHRoZSBnaXZlbgorICAgICAgICAgIHBvcnQgbnVtYmVyIHRvIGxpc3RlbiBmb3IgY29ubmVjdGlvbnMuCisgICAgICAgICAgUG9zc2libGUgZXhpdCBjb2RlcyBhcmU6CisgICAgICAgICAgICBFUlFfT0sgICAgICAgICAgOiBPcGVyYXRpb24gc3VjY2VlZGVkLgorICAgICAgICAgICAgRVJRX0VfQVJHTEVOR1RIIDogVGhlIHBvcnQgbnVtYmVyIGdpdmVuIGRvZXMgbm90IGNvbnNpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHR3byBieXRlcy4KKyAgICAgICAgICAgIEVSUV9FX05TTE9UUyAgICA6IFRoZSBtYXggbnVtYmVyIG9mIGNoaWxkIHByb2Nlc3NlcyAoZ2l2ZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIDxpbmZvPikgaXMgZXhoYXVzdGVkLgorICAgICAgICAgICAgRVJRX0VfVU5LTk9XTiAgIDogRXJyb3IgPGluZm8+IG9jY3VyZWQgaW4gb25lIG9mIHRoZSBzeXN0ZW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxzIGRvbmUgdG8gb3BlbiB0aGUgcG9ydC4KKworICAgICAgICAgIE9uY2UgdGhlIHBvcnQgaXMgb3BlbiwgaXQgaXMgdHJlYXRlZCBhcyBpZiBpcyBqdXN0IGFub3RoZXIKKyAgICAgICAgICBzcGF3bmVkIHByb2dyYW0uCisKKworICAgICAgICBPcGVuIGFuIFRDUCBwb3J0OgorCisgICAgICAgICAgcmVxdWVzdCAgOiBFUlFfT1BFTl9UQ1AKKyAgICAgICAgICBkYXRhIHNlbnQ6IHN0cnVjdCBpbl9hZGRyLnNfYWRkciBpcCAgIC8vIHRoZSBpcCB0byBhZGRyZXNzCisgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYWRkci5zaW5fcG9ydCAgcG9ydCAvLyB0aGUgcG9ydCB0byBhZGRyZXNzCisgICAgICAgICAgZGF0YSByZWN2OiBPcGVuIGZhaWxlZDoKKyAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgcmMgICAgIC8vIHRoZSBzdWNjZXNzL2Vycm9yIGNvZGUuCisgICAgICAgICAgICAgICAgICAgICBjaGFyICAgIGluZm8gICAvLyBvcHQ6IGFkZGl0aW9uYWwgaW5mby4KKyAgICAgICAgICBkYXRhIHJlY3Y6IE9wZW4gc3VjY2VlZGVkOgorICAgICAgICAgICAgICAgICAgICAgY2hhciAgIHJjID0gRVJRX09LCisgICAgICAgICAgICAgICAgICAgICBjaGFyW10gdGlja2V0ICAvLyB0aGUgY29ubmVjdGlvbiB0aWNrZXQuCisKKyAgICAgICAgICBUaGUgZXJxIG9wZW5zIGFuIFRDUC1wb3J0IG9uIHRoZSBob3N0IG1hY2hpbmUgYW5kIHRyaWVzIHRvIGNvbm5lY3QKKyAgICAgICAgICBpdCB0byB0aGUgYWRkcmVzcyA8aXA+Ojxwb3J0Pi4KKyAgICAgICAgICBQb3NzaWJsZSBleGl0IGNvZGVzIGFyZToKKyAgICAgICAgICAgIEVSUV9PSyAgICAgICAgICA6IE9wZXJhdGlvbiBzdWNjZWVkZWQuCisgICAgICAgICAgICBFUlFfRV9BUkdMRU5HVEggOiBUaGUgcG9ydCBudW1iZXIgZ2l2ZW4gZG9lcyBub3QgY29uc2lzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdHdvIGJ5dGVzLgorICAgICAgICAgICAgRVJRX0VfTlNMT1RTICAgIDogVGhlIG1heCBudW1iZXIgb2YgY2hpbGQgcHJvY2Vzc2VzIChnaXZlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gPGluZm8+KSBpcyBleGhhdXN0ZWQuCisgICAgICAgICAgICBFUlFfRV9VTktOT1dOICAgOiBFcnJvciA8aW5mbz4gb2NjdXJlZCBpbiBvbmUgb2YgdGhlIHN5c3RlbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbHMgZG9uZSB0byBvcGVuIHRoZSBwb3J0LgorCisgICAgICAgICAgT25jZSB0aGUgcG9ydCBpcyBvcGVuLCBpdCBpcyB0cmVhdGVkIGFzIGlmIGlzIGp1c3QgYW5vdGhlcgorICAgICAgICAgIHNwYXduZWQgcHJvZ3JhbS4KKworCisgICAgICAgIFNlbmQgZGF0YSBvdmVyIGEgVENQIGNvbm5lY3Rpb246CisKKyAgICAgICAgICByZXF1ZXN0ICA6IEVSUV9TRU5ECisgICAgICAgICAgZGF0YSBzZW50OiBjaGFyW10gIHRpY2tldCAvLyB0aGUgYWRkcmVzc2VkIHByb2Nlc3MgdGlja2V0LgorICAgICAgICAgICAgICAgICAgICAgY2hhcltdICB0ZXh0ICAgLy8gdGhlIHRleHQgdG8gc2VuZC4KKyAgICAgICAgICBkYXRhIHJlY3Y6IGNoYXIgICAgcmMgICAgIC8vIHRoZSBzdWNjZXNzL2Vycm9yIGNvZGUuCisgICAgICAgICAgICAgICAgICAgICBpbnQzMiAgIGluZm8gICAvLyBvcHQ6IGFkZGl0aW9uYWwgaW5mby4KKworICAgICAgICAgIFRoZSA8dGV4dD4gaXMgc2VudCB0byB0aGUgc3RkaW4gb2YgdGhlIHNwYXduZWQgcHJvY2VzcworICAgICAgICAgIGlkZW50aWZpZWQgYnkgPHRpY2tldD4uCisKKyAgICAgICAgICBQb3NzaWJsZSByZXR1cm4gY29kZXMgYXJlOgorICAgICAgICAgICAgRVJRX09LICAgICAgICAgIDogT3BlcmF0aW9uIHN1Y2NlZWRlZCwgbm8gPGluZm8+IGlzIHJlcGxpZWQuCisgICAgICAgICAgICBFUlFfRV9USUNLRVQgICAgOiBUaGUgZ2l2ZW4gdGlja2V0IGlzIGludmFsaWQsIG5vIDxpbmZvPiByZXBsaWVkLgorICAgICAgICAgICAgRVJRX0VfSU5DT01QTEVURTogT25seSA8aW5mbz4gY2hhcnMgb2YgdGhlIHRleHQgaGF2ZSBiZWVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW50LiBUaGUgZXJxIHdpbGwgc2VuZCBhIEVSUV9PSyBtZXNzYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmNlIGFsbCBkYXRhIGhhcyBiZWVuIHNlbnQuCisgICAgICAgICAgICBFUlFfRV9XT1VMREJMT0NLOiBFcnJvciBFX1dPVUxEQkxPQ0sgKGFsc28gc3RvcmVkIGluIDxpbmZvPikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcHBlbmVkIHdoaWxlIHNlbmRpbmcgdGhlIHRleHQuCisgICAgICAgICAgICBFUlFfRV9QSVBFICAgICAgOiBFcnJvciBFX1BJUEUgKGFsc28gc3RvcmVkIGluIDxpbmZvPikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcHBlbmVkIHdoaWxlIHNlbmRpbmcgdGhlIHRleHQuCisgICAgICAgICAgICBFUlFfRV9VTktOT1dOICAgOiBUaGUgZXJyb3Igd2l0aCBjb2RlIDxpbmZvPiBoYXBwZW5lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgc2VuZGluZyB0aGUgZGF0YS4KKworCisgICAgICAgIERhdGEgcmVhZHkgdG8gcmVhZCBvbiBUQ1AgY29ubmVjdGlvbjoKKworICAgICAgICAgIGRhdGEgcmVjdjogY2hhciAgICBvdXRfb3JfZXJyID0gRVJRX09LCisgICAgICAgICAgICAgICAgICAgICBjaGFyW10gIHRpY2tldCAgLy8gdGlja2V0IG9mIHRoaXMgY29ubmVjdGlvbgorCisgICAgICAgICAgVGhlcmUgaXMgZGF0YSBhdmFpbGFibGUgdG8gcmVhZCBvbiB0aGUgc3BlY2lmaWVkIFRDUCBjb25uZWN0aW9uLgorCisKKyAgICAgICAgRGF0YSByZWNlaXZlZCBvdmVyIGEgVENQIGNvbm5lY3Rpb246CisKKyAgICAgICAgICBkYXRhIHJlY3Y6IGNoYXIgICAgb3V0X29yX2VyciA9IEVSUV9TVERPVVQKKyAgICAgICAgICAgICAgICAgICAgIGNoYXJbXSAgdGV4dCAgICAvLyBkYXRhIHJlY2VpdmVkCisKKyAgICAgICAgICBUaGUgVENQIHBvcnQgY29udHJvbGxlZCBieSB0aGUgZXJxIGRpZCByZWNlaXZlIDx0ZXh0Pi4KKworCisgICAgICAgIFRDUCBjb25uZWN0aW9uIGNsb3NlcyBvbiBlcnJvcjoKKworICAgICAgICAgIGRhdGEgcmVjdjogY2hhciAgICBvdXRfb3JfZXJyID0gRVJRX0VfVU5LTk9XTgorICAgICAgICAgICAgICAgICAgICAgY2hhciAgICBlcnJubyAgIC8vIGVycm5vIGZyb20gc29ja2V0IG9wZXJhdGlvbgorCisgICAgICAgICAgVGhlIFRDUCBjb25uZWN0aW9uIGNhdXNlZCBhbiBlcnJvciA8ZXJybm8+IGFuZCBoYXMgYmVlbiBjbG9zZWQuCisKKworICAgICAgICBUQ1AgY29ubmVjdGlvbiBjbG9zZWQ6CisKKyAgICAgICAgICBkYXRhIHJlY3Y6IGNoYXIgICAgb3V0X29yX2VyciA9IEVSUV9FWElURUQKKworICAgICAgICAgIFRoZSBUQ1AgY29ubmVjdGlvbiBjbG9zZWQgcmVndWxhcmlseSAoRW5kIE9mIEZpbGUpLgorCisKKyAgICAgICAgQ29ubmVjdGlvbiBwZW5kaW5nIG9uIFRDUCBzb2NrZXQ6CisKKyAgICAgICAgICBkYXRhIHJlY3Y6IGNoYXIgICAgb3V0X29yX2VyciA9IEVSUV9TVERPVVQKKworICAgICAgICAgIFRoZSBUQ1AgJ2xpc3RlbicgcG9ydCBjb250cm9sbGVkIGJ5IHRoZSBlcnEgcmVjZWl2ZWQKKyAgICAgICAgICBhIGNvbm5lY3Rpb24gcmVxdWVzdC4KKworCisgICAgICAgIEFjY2VwdCBhIHBlbmRpbmcgY29ubmVjdGlvbnM6CisKKyAgICAgICAgICByZXF1ZXN0ICA6IEVSUV9BQ0NFUFQKKyAgICAgICAgICBkYXRhIHNlbnQ6IGNoYXJbXSAgdGlja2V0IC8vIHRoZSB0aWNrZXQgb2YgdGhpcyBzb2NrZXQKKyAgICAgICAgICBkYXRhIHJlY3Y6IEFjY2VwdCBmYWlsZWQ6CisgICAgICAgICAgICAgICAgICAgICBjaGFyICAgIHJjICAgICAvLyB0aGUgc3VjY2Vzcy9lcnJvciBjb2RlLgorICAgICAgICAgICAgICAgICAgICAgY2hhciAgICBpbmZvICAgLy8gb3B0OiBhZGRpdGlvbmFsIGluZm8uCisgICAgICAgICAgZGF0YSByZWN2OiBBY2NlcHQgc3VjY2VlZGVkOgorICAgICAgICAgICAgICAgICAgICAgY2hhciAgICByYyA9IEVSUV9PSworICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGluX2FkZHIuc19hZGRyIGlwICAgIC8vIHJlbW90ZSBzaWRlJ3MgaXAKKyAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhZGRyLnNpbl9wb3J0ICBwb3J0ICAvLyByZW1vdGUgc2lkZSdzIHBvcnQKKyAgICAgICAgICAgICAgICAgICAgIGNoYXJbXSAgICAgICAgICAgICAgICB0aWNrZXQgIC8vIHRoZSBuZXcgdGlja2V0LgorCisgICAgICAgICAgVGhlIGVycSBhY2NlcHRzIGEgbmV3IGNvbm5lY3Rpb24gb24gYW4gYWNjZXB0LVRDUC1wb3J0LCBjcmVhdGVzCisgICAgICAgICAgYW4gY2hpbGQgYW5kIHRpY2tldCBmb3IgaXQgYW5kIHJldHVybnMgaXRzIHRpY2tldCB0b2dldGhlciB3aXRoCisgICAgICAgICAgdGhlIHJlbW90ZSdzIHNpZGUgPGlwPjo8cG9ydD4gbnVtYmVyIChpbiBuZXR3b3JrIGJ5dGUgb3JkZXIpLgorICAgICAgICAgIFBvc3NpYmxlIGV4aXQgY29kZXMgYXJlOgorICAgICAgICAgICAgRVJRX09LICAgICAgICAgIDogT3BlcmF0aW9uIHN1Y2NlZWRlZC4KKyAgICAgICAgICAgIEVSUV9FX0FSR0xFTkdUSCA6IFRoZSBwb3J0IG51bWJlciBnaXZlbiBkb2VzIG5vdCBjb25zaXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0d28gYnl0ZXMuCisgICAgICAgICAgICBFUlFfRV9OU0xPVFMgICAgOiBUaGUgbWF4IG51bWJlciBvZiBjaGlsZCBwcm9jZXNzZXMgKGdpdmVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiA8aW5mbz4pIGlzIGV4aGF1c3RlZC4KKyAgICAgICAgICAgIEVSUV9FX1RJQ0tFVCAgICA6IHRoZSB0aWNrZXQgZGlkbid0IG1hdGNoCisgICAgICAgICAgICBFUlFfRV9VTktOT1dOICAgOiBFcnJvciA8aW5mbz4gb2NjdXJlZCBpbiBvbmUgb2YgdGhlIHN5c3RlbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbHMgZG9uZSB0byBvcGVuIHRoZSBwb3J0LgorCisgICAgICAgICAgT25jZSB0aGUgcG9ydCBpcyBvcGVuLCBpdCBpcyB0cmVhdGVkIGFzIGlmIGlzIGp1c3QgYW5vdGhlcgorICAgICAgICAgIHNwYXduZWQgcHJvZ3JhbS4KKworCitFWEFNUExFCisgICAgICAgIEFzc3VtZSB5b3UgaGF2ZSBhIHNjcmlwdCAnd2VsY29tZS1tYWlsJyB0byBzZW5kIGEgd2VsY29tZSBtYWlsCisgICAgICAgIHRvIGEgbmV3IHBsYXllci4gUHV0IHRoaXMgc2NyaXB0IGludG8gdGhlIGRpcmVjdG9yeSBmb3IgdGhlIGNhbGxhYmxlCisgICAgICAgIGV4ZWN1dGFibGVzLCB0aGVuIHlvdSBjYW4gdXNlIGl0IGxpa2UgdGhpczoKKworICAgICAgICB2b2lkIGVycV9yZXNwb25zZShtaXhlZCAqIGRhdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdyaXRlX2ZpbGUoICJXRUxDT01FTE9HIgorICAgICAgICAgICAgICAgICAgICAgICwgc3ByaW50ZigicmMgJWQsIGluZm8gJWRcbiIsIGRhdGFbMF0sIGRhdGFbMV0pKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2VuZF9tYWlsKHN0cmluZyBwbGF5ZXJfbmFtZSwgc3RyaW5nIHBsYXllcl9lbWFpbCkKKyAgICAgICAgeworICAgICAgICAgICAgc2VuZF9lcnEoIEVSUV9FWEVDVVRFCisgICAgICAgICAgICAgICAgICAgICwgIndlbGNvbWUtbWFpbCAnIitwbGF5ZXJfbmFtZSsiJyAnIitwbGF5ZXJfZW1haWwrIiciCisgICAgICAgICAgICAgICAgICAgICwgIydlcnFfcmVzcG9uc2UpOworICAgICAgICB9CisKKworSElTVE9SWQorICAgICAgICBUaGUgZXJxIHdhcyBpbnRyb2R1Y2VkIHdpdGggMy4yLjFANjEuCisgICAgICAgIEVSUV9BVVRIIHdhcyBpbnRyb2R1Y2VkIHdpdGggMy4yLjFAODEuCisgICAgICAgIEVSUV9TRU5ELCBFUlFfU1BBV04sIEVSUV9LSUxMIHdlcmUgaW50cm9kdWNlZCB3aXRoIDMuMi4xQDgyLgorICAgICAgICBFUlFfT1BFTl9VRFAsIEVSUV9PUEVOX1RDUCwgRVJRX0xJU1Qgd2VyZSBpbnRyb2R1Y2VkIHdpdGggMy4yLjFAOTguCisgICAgICAgIEVSUV9STE9PS1VQVjYgd2FzIGludHJvZHVjZWQgaW4gMy4yLjguCisgICAgICAgIExETXVkIDMuMi45IGFkZGVkIHRoZSAnLS1leGVjZGlyJyBhcmd1bWVudCB0byBlcnEsIGFuZCB0aGUgRVJRX09LCisgICAgICAgICAgYWZ0ZXIgRVJRX0VfSU5DT01QTEVURSBwcm90b2NvbC4KKworU0VFIEFMU08KKyAgICAgICAgYXR0YWNoX2VycV9kZW1vbihFKSwgc2VuZF9lcnEoRSksIHN0YWxlX2VycShNKSwgcmZjIDkzMQorICAgICAgICBxdWVyeV9pcF9udW1iZXIoRSkKZGlmZiAtLWdpdCBhL2RvYy9jb25jZXB0cy9maWxlcyBiL2RvYy9jb25jZXB0cy9maWxlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmU2ZTY0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2NvbmNlcHRzL2ZpbGVzCkBAIC0wLDAgKzEsMTYgQEAKK0NPTkNFUFQKKyAgICAgICAgZmlsZXMKKworREVTQ1JJUFRJT04KKyAgICAgICAgQXMgYSB3aXphcmQsIHlvdSBhcmUgd29ya2luZyB3aXRoIGZpbGVzLiBFYWNoIGZpbGUgcmVwcmVzZW50cworICAgICAgICB0aGUgYnVsZGluZyBwbGFuIGZvciBvbmUgb3IgbW9yZSBvYmplY3RzIChleGNlcHQgdGV4dCBvciBkb2MgZmlsZXMKKyAgICAgICAgb2YgY291cnNlKS4KKworICAgICAgICBUaGUgbXVkbGliIGhhcyBhIHJvb3QsIGFuZCB3aGVuIHdvcmtpbmcgd2l0aCBmaWxlbmFtZXMsIHlvdQorICAgICAgICBjYW4gYWx3YXlzIHNwZWNpZnkgYSBmdWxsIHBhdGhuYW1lIGZyb20gdGhlIHJvb3QgYnkgc3RhcnRpbmcKKyAgICAgICAgd2l0aCBhICcvJyAoc2xhc2gpIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUgbmFtZS4KKworICAgICAgICAob29wcywgdHJ1bmNhdGVkIC0gd2h5IHdoZW4gd2hlcmUgZGlkIGl0IGhhcHBlbj8pCisKK1NFRSBBTFNPCisgICAgICAgIG9iamVjdHMoQyksIGNyZWF0ZShBKSwgcmVzZXQoQSkKZGlmZiAtLWdpdCBhL2RvYy9jb25jZXB0cy9nb29kc3R5bGUgYi9kb2MvY29uY2VwdHMvZ29vZHN0eWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZWEwNGIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvY29uY2VwdHMvZ29vZHN0eWxlCkBAIC0wLDAgKzEsNzQgQEAKK0d1dGVyIFN0aWwKKyBCRVNDSFJFSUJVTkc6CisgICAgIEd1dGVuIFN0aWwga2FubiBtYW4gbGVybmVuLiBadW1pbmRlc3QgaW4gZGVyIFByb2dyYW1taWVydW5nLiBHdXRlciBTdGlsCisgICAgIGJlZGV1dGV0IHZvciBhbGxlbTogU2NocmVpYiBlcyBzbywgZGFzIGFuZGVyZSBlcyBsZXNlbiB1bmQgdmVyc3RlaGVuCisgICAgIGtvZW5uZW4uIChBbnNvbnN0ZW4gd2VyZGUgL3NlY3VyZS8tRXJ6bWFnaWVyLCBkaWUgbXVlc3NlbiBhdWZncnVuZAorICAgICBlaW5nZWJhdXRlciBQYXJhbm9pYSBzZWxic3R2ZXJzY2hsdWVzc2VsbmQgc2NocmVpYmVuLikKKworICAgICBMZXJuZW4ga2FubiBtYW4gYXVjaCBhbSBCZWlzcGllbCwgdW50ZXIgL2QvZ2ViaXJnZS9yb29tLywKKyAgICAgL2QvZ2ViaXJnZS9vYmovLCAvZC9nZWJpcmdlL21vbi8sIC9kb2MvYmVpc3BpZWxlLyBpc3Qgc2F1YmVyZXIgQ29kZQorICAgICB6dSBmaW5kZW4uCisKKyAgICAgVGlwcHMgenVtIEF1c3NlaGVuOgorICAgICAtIFByb2dyYW1temVpbGVuIG5pY2h0IGxhZW5nZXIgYWxzIDgwIFplaWNoZW4gc2NocmVpYmVuLCBkZW5uIDgwIFplaWNoZW4KKyAgICAgICBicmVpdGUgRmVuc3RlciBzaW5kIGltbWVyIG5vY2ggZGllIFJlZ2VsCisgICAgICAgLSBDb2RlIGthbm4gYXVmIGRlciBuYWVjaHN0ZW4gWmVpbGUgd2VpdGVyZnVlaHJlbjoKKyAgICAgICAgIGZpbHRlcihhbGxfaW52ZW50b3J5KGVudmlyb25tZW50KFRQKSksCisJCSAgICAgICMnZWluZXRvbGxlc29ydGllcmZ1bmt0aW9uLCAmZXh0cmF2YXJpYWJsZW4pOworICAgICAgIC0gU3RyaW5ncyBrb2VubmVuIChvaG5lIEFkZGl0aW9uIG1pdCArKSB1bnRlcmJyb2NoZW4gd2VyZGVuOgorICAgICAgICAgIkplbWFuZCAiPEVPTD4gICAgImphbW1lcnQiID09ICJKZW1hbmQgamFtbWVydCIKKyAgICAgICAgICJKZW1hbmQgXDxFT0w+amFtbWVydCIgICAgICA9PSAiSmVtYW5kIGphbW1lcnQiCisKKyAgICAgLSBCbG9lY2tlIChtaXQge30gdW1yYW5kZXRlciBDb2RlKSBlaW5ydWVja2VuLCBkYW1pdCBtYW4gZGVuCisgICAgICAgZ2VwbGFudGVuIFByb2dyYW1tZmx1c3MgZ3V0IGVya2VubmVuIGthbm4KKyAgICAgICAtIDIgYmlzIDQgWmVpY2hlbiwgbmljaHQgZ2xlaWNoIGVpbiBnYW56ZXMgVGFiIChzaWVoZSBlcnN0ZSBSZWdlbCkKKyAgICAgICAtIGRpZSB7IHVuZCB9IHJ1aGlnIGluIGVpbnplbGVuIFplaWxlbiBzY2hyZWliZW4KKworICAgICAtIFZhcmlhYmxlbiBpbiBkZW0gQmxvY2sgZGVrbGFyaWVyZW4sIGluIGRlbSBzaWUgZ2VicmF1Y2h0IHdlcmRlbiwKKyAgICAgICBkYWR1cmNoIHNpbmQgc2llIHNjaG5lbGxlciB6dSBmaW5kZW4KKworICAgICAtICNkZWZpbmUgbmljaHQgdWViZXJ0cmVpYmVuLCB3ZW5uIGtvbXBsZXhlIEZ1bmt0aW9uZW4gZGFtaXQgZ2ViYXV0CisgICAgICAgc2luZCwgdWViZXJzaWVodCBkZXIgTGVzZXIgZGVuIENvZGUgb2Z0IG5pY2h0IG1laHIKKyAgICAgICAtICNkZWZpbmUgc29sbHRlbiBpbiAjaW5jbHVkZXRlbiBIZWFkZXJkYXRlaWVuIHN0ZWhlbgorICAgICAgIC0gd2VubiBlcyBlaW5lIG9mdCBiZW51dHp0ZSBGdW5rdGlvbiBpc3QsIHNjaHJlaWIgc2llIGFscyBMZnVuCisgICAgICAgLSBpc3QgZXMgdmllbGxlaWNodCBzY2hvbiBpbiAvc3lzLyouaCBvZGVyIC9zZWN1cmUvKi5oIGRlZmluaWVydD8KKworICAgICBUaXBwcyB6dW0gQ29kZToKKyAgICAgLSBvYmpla3RvcmllbnRpZXJ0IHByb2dyYW1taWVyZW4KKyAgICAgICAtIGRhcyB3YXMgYW5kZXJlIG5pY2h0IHZvbiBhdXNzZW4gc2VoZW4gb2RlciBhdWZydWZlbiBtdWVzc2VuLCBtaXQKKyAgICAgICAgICJwcm90ZWN0ZWQiIG9kZXIgInByaXZhdGUiIGJlaSBWZXJlcmJ1bmcgdmVyc3RlY2tlbgorCisgICAgIC0gcmV0dXJuIG1pdHRlbiBpbSBDb2RlIHdlbm4gbW9lZ2xpY2ggdmVybWVpZGVuLCBkYSBkZXIgUHJvZ3JhbW1mbHVzcworICAgICAgIGRhbWl0IGF1Zmdlc3BsaXR0ZXJ0IHdpcmQgLSBlaW4gZWluemlnZXIgRnVua3Rpb25zYXVzZ2FuZyBpc3QKKyAgICAgICB1ZWJlcnNpY2h0bGljaGVyCisgICAgICAgLSBBdXNuYWhtZSBoaWVydm9uIGthbm4gYWJlciBzZWluLCAoZGllIG1laXN0ZW4pIEF1c3NjaGx1c3NiZWRpbmd1bmdlbgorICAgICAgICAgZnVlciBpcmdlbmR3YXMgYW0gQW5mYW5nIGVpbmVyIEZ1bmt0aW9uIGFienVwcnVlZmVuIHVuZCBkaWUgRnVua3Rpb24KKyAgICAgICAgIGRhbm4gYXVjaCBzb2ZvcnQgenUgdmVybGFzc2VuLgorICAgICAgCisgICAgIC0ga29ycmVrdGUgVHlwZW4gYmVpIFZhcmlhYmxlbiB1bmQgVHlwZW4gdmVyd2VuZGVuLCBkYW1pdCBkZXIgTGVzZXIKKyAgICAgICBlcmtlbm50IHdlbGNoZXMgRGluZyB3YXMgaXN0CisgICAgICAgLSAjcHJhZ21hIHN0cm9uZ190eXBlcyBvZGVyIGdhciAjcHJhZ21hIHN0cmljdF90eXBlcyBoaWxmdAorICAgICAgIC0gQXVjaCBUeXBwcnVlZnVuZ2VuIHp1ciBMYXVmemVpdCAoI3ByYWdtYSBydHRfY2hlY2tzKSB2ZXJ3ZW5kZW4KKyAgICAgICAtIGJlaSBPYmpla3RlbiwgZGllIGdlZXJidCB3ZXJkZW4sIGltbWVyIGF1Y2ggICNwcmFnbWEgc2F2ZV90eXBlcworCisgICAgIFRpcHBzIHp1IERhdGVpZW46CisgICAgIC0gdW50ZXJ0ZWlsdCBldXJlIEdlZ2VuZGVuIGFtIGJlc3RlbiBpbiB2ZXJzY2hpZWRlbmUgVmVyemVpY2huaXNzZSwKKyAgICAgICBkYW5uIGZpbmRldCBtYW4gc2ljaCBzY2huZWxsIHp1cmVjaHQ6CisgICAgICAgLSBOUENzLCBPYmpla3RlLCBSYWV1bWUsIE1hc3RlciAoZ2dmLiBXYWZmZW4sIFJ1ZXN0dW5nZW4gd2VubiB6dSB2aWVsKQorCisgICAgIC0gUGZhZGUgc29sbHRlbiBpbiBlaW5lciB6ZW50cmFsZW4gI2luY2x1ZGUgRGF0ZWkgc3RlaGVuLCB3ZWxjaGUgZGFubgorICAgICAgIHJlbGF0aXYgI2luY2x1ZGVkIHdlcmRlbiBrYW5uLiBEYW1pdCBlcmxlaWNodGVydCBtYW4gc3BhZXRlcmVuIE1hZ2llcm4KKyAgICAgICBldmVudHVlbGwgbm9ldGlnZSBWZXJ6ZWljaG5pc2FlbmRlcnVuZ2VuLgorICAgICAgIHN0YXR0OglBZGRJdGVtKCIvZC9lYmVuZS88bWFnaWVyPi9zdW1wZi9ucGMvc2NobGVpbWkiLCAuLi4pOworICAgICAgIGxpZWJlcjoKKyAgICAgICAgICNpbmNsdWRlICIuLi9sb2NhbC5oIgorICAgICAgICAgICBbZW50aGFlbHQgZWluCisgICAgICAgICAgICAjZGVmaW5lIFNVTVBGTlBDKHgpICgiL2QvZWJlbmUvPG1hZ2llcj4vc3VtcGYvbnBjLyIgeCldCisJCSAgICAgLi4uCisJCSAgICAgQWRkSXRlbShTVU1QRk5QQygic2NobGVpbWkiKSwgLi4uKTsKKworIFNJRUhFIEFVQ0g6CisgICAgIGluaGVyaXRhbmNlLCBlZmZpemllbnosIHByYWdtYSwgb29wCisKKzA1LjA2LjIwMTQsIFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL2NvbmNlcHRzL2hvb2tzIGIvZG9jL2NvbmNlcHRzL2hvb2tzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwOGRhMDgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvY29uY2VwdHMvaG9va3MKQEAgLTAsMCArMSwxNDQgQEAKK0NPTkNFUFQKKyAgICAgICAgZHJpdmVyIGhvb2tzCisKK0RFU0NSSVBUSU9OCisgICAgICAgIFRvIGFsbG93IGEgZ3JlYXRlciBmbGV4aWJpbGl0eSBvZiB0aGUgbXVkcywgdGhlIGdhbWVkcml2ZXJzCisgICAgICAgIHNpbmNlIDMuMi4xIG1vdmVkIHNldmVyYWwgb25jZSBoYXJkY29kZWQgJ3VuZGVyZ3JvdW5kJworICAgICAgICBhY3Rpdml0aWVzIGZyb20gdGhlIGRyaXZlciBpbnRvIHRoZSBtdWRsaWIuIFRoaXMgaW5jbHVkZXMgZm9yCisgICAgICAgIGV4YW1wbGUgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gY29tcGF0IGFuZCBuYXRpdmUgbW9kZS4KKworICAgICAgICBUaGUgaG9va3MgYXJlIHNldCB3aXRoIHRoZSBwcml2aWxlZ2VkIGVmdW4gc2V0X2RyaXZlcl9ob29rKCkuCisgICAgICAgIFNvbWUgb2YgdGhlIGhvb2tzIGFyZSBtYW5kYXRvcnksIHNvbWUgbm90LiBNb3N0IGhvb2tzIGFjY2VwdAorICAgICAgICB1bmJvdW5kIGxhbWJkYSBjbG9zdXJlcyBhcyB2YWx1ZXMsIHNvbWUgYWxzbyBsZnVuIGNsb3N1cmVzIG9yCisgICAgICAgIGV2ZW4gc3RyaW5ncy4KKyAgICAgICAgVGhlIGhvb2tzIGFyZSBpZGVudGlmaWVkIGJ5IGFuIG9yZGluYWwgbnVtYmVyLCBmb3Igd2hpY2gKKyAgICAgICAgc3ltYm9saWMgbmFtZXMgYXJlIGRlZmluZWQgaW4gL3N5cy9kcml2ZXJob29rcy5oLgorCisgICAgICAgIEhfTU9WRV9PQkpFQ1QwCisgICAgICAgIEhfTU9WRV9PQkpFQ1QxCisgICAgICAgICAgTWFuZGF0b3J5IGhvb2tzIHRvIGltcGxlbWVudCB0aGUgZWZ1biB2b2lkIG1vdmVfb2JqZWN0KCkuCisKKworICAgICAgICBIX0xPQURfVUlEUworICAgICAgICBIX0NMT05FX1VJRFMKKyAgICAgICAgICBNYW5kYXRvcnkgaG9va3MgdG8gZGV0ZXJtaW5lIHRoZSB1aWQgYW5kIGV1aWQgb2YgbG9hZGVkIG9yIGNsb25lZAorICAgICAgICAgIG9iamVjdHMuCisKKworICAgICAgICBIX0NSRUFURV9TVVBFUgorICAgICAgICBIX0NSRUFURV9PQgorICAgICAgICBIX0NSRUFURV9DTE9ORQorICAgICAgICAgIE9wdGlvbmFsIGhvb2tzIHRvIGluaXRpYWxpemUgYW4gb2JqZWN0IGFmdGVyIGNyZWF0aW9uLgorCisgICAgICAgICAgSF9DUkVBVEVfU1VQRVIgaXMgY2FsbGVkIGZvciBibHVlcHJpbnRzIGltcGxpY2l0ZWx5IGxvYWRlZAorICAgICAgICAgIGJ5IGluaGVyaXRhbmNlLCBIX0NSRUFURV9PQiBmb3IgZXhwbGljaXRlbHkgbG9hZGVkCisgICAgICAgICAgYmx1ZXByaW50cy9vYmplY3RzLCBhbmQgSF9DUkVBVEVfQ0xPTkUgZm9yIGNsb25lZCBvYmplY3RzLgorCisKKyAgICAgICAgSF9SRVNFVAorICAgICAgICAgIE9wdGlvbmFsIGhvb2sgdG8gcmVzZXQgYW4gb2JqZWN0LgorCisKKyAgICAgICAgSF9DTEVBTl9VUAorICAgICAgICAgIE9wdGlvbmFsIGhvb2sgdG8gY2xlYW4gdXAgYW4gb2JqZWN0LgorCisKKyAgICAgICAgSF9ERUZBVUxUX01FVEhPRAorICAgICAgICAgIE9wdGlvbmFsIGhvb2sgdG8gcHJvdmlkZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciB1bnJlc29sdmVkCisgICAgICAgICAgY2FsbHMuCisKKworICAgICAgICBIX0RFRkFVTFRfUFJPTVBUCisgICAgICAgICAgT3B0aW9uYWwgaG9vayBmb3IgdGhlIGNvbW1hbmQgcHJvbXB0LiBJZiB0aGlzIGhvb2sgaXMgbm90IHVzZWQsCisgICAgICAgICAgdGhlIGRyaXZlciB3aWxsIHVzZSAiPiAiIGFzIHRoZSBjb21tYW5kIHByb21wdC4KKworCisgICAgICAgIEhfUFJJTlRfUFJPTVBUCisgICAgICAgICAgT3B0aW9uYWwgaG9vayB0byBwcmludCB0aGUgY3VycmVudCBjb21tYW5kIHByb21wdC4gSWYgdGhpcyBob29rIGlzCisgICAgICAgICAgbm90IHNldCwgdGhlIGRyaXZlciB3aWxsIGp1c3QgcHJpbnQgdGhlIHByb21wdCB0byB0aGUgdXNlci4KKworCisgICAgICAgIEhfQ09NTUFORAorICAgICAgICAgIE9wdGlvbmFsIGhvb2sgdG8gcGFyc2UgYW5kIGV4ZWN1dGUgY29tbWFuZHMuIElmIHRoaXMgaG9vayBpcyB1c2VkLAorICAgICAgICAgIGl0IGJ5cGFzc2VzIHRoZSBub3JtYWwgY29tbWFuZCBwYXJzaW5nIGRvbmUgYnkgdGhlIGRyaXZlciAoaW5jbHVkaW5nCisgICAgICAgICAgdGhlIE1PRElGWV9DT01NQU5EIGFuZCBOT1RJRllfRkFJTCBob29rcykuCisKKworICAgICAgICBIX01PRElGWV9DT01NQU5ECisgICAgICAgICAgT3B0aW9uYWwgaG9vayB0byBtb2RpZnkgY29tbWFuZHMgKGJvdGggZW50ZXJlZCBvciBnaXZlbiBieSBhCisgICAgICAgICAgY2FsbCB0byBjb21tYW5kKCkpIGJlZm9yZSB0aGUgcGFyc2VyIHNlZXMgdGhlbSAodGhpcyBpbmNsdWRlcworICAgICAgICAgIHNwZWNpYWwgY29tbWFuZHMgbGlrZSAnc3RhdHVzJykuCisKKworICAgICAgICBIX01PRElGWV9DT01NQU5EX0ZOQU1FCisgICAgICAgICAgTWFuZGF0b3J5IGhvb2sgc3BlY2lmeWluZyB0aGUgbmFtZSBvZiB0aGUgJ21vZGlmeV9jb21tYW5kJworICAgICAgICAgIGxmdW4gdG8gY2FsbCBmb3IgbmV3bHkgZW50ZXJlZCBjb21tYW5kcyBhcyByZXN1bHQgb2YgYQorICAgICAgICAgIHNldF9tb2RpZnlfY29tbWFuZCgpLgorCisKKyAgICAgICAgSF9OT1RJRllfRkFJTAorICAgICAgICAgIE1hbmRhdG9yeSBob29rIHRvIGlzc3VlIHRoZSBkZWZhdWx0IG1lc3NhZ2UgaWYgYW4gZW50ZXJlZAorICAgICAgICAgIGNvbW1hbmQgY291bGRuJ3QgYmUgcGFyc2VkIGFuZCBubyBub3RpZnlfZmFpbCgpIGNvbW1hbmQgaXMKKyAgICAgICAgICBpbiBlZmZlY3QuCisKKworICAgICAgICBIX1NFTkRfTk9USUZZX0ZBSUwKKyAgICAgICAgICBPcHRpb25hbCBob29rIHRvIHNlbmQgdGhlIG5vdGlmeSBmYWlsIG1lc3NhZ2UsIHJlZ2FyZGxlc3MKKyAgICAgICAgICBvZiBob3cgaXQgd2FzIGRldGVybWluZWQsIHRvIHRoZSBwbGF5ZXIuIElmIHRoZSBob29rIGlzIG5vdAorICAgICAgICAgIHNldCwgdGhlIG1lc3NhZ2UgaXMgZGVsaXZlcmVkIHVzaW5nIHRlbGxfb2JqZWN0KCkgaW50ZXJuYWxseS4KKworCisgICAgICAgIEhfTk9fSVBDX1NMT1QKKyAgICAgICAgICBPcHRpb25hbCBob29rIHNwZWNpZnlpbmcgdGhlIG1lc3NhZ2UgZ2l2ZW4gdG8gbG9naW5zCisgICAgICAgICAgcmVqZWN0ZWQgZHVlIHRvIHNwYWNlIGxpbWl0YXRpb25zIChNQVhfUExBWUVSKS4KKworCisgICAgICAgIEhfSU5DTFVERV9ESVJTCisgICAgICAgICAgU2VtaS1tYW5kYXRvcnkgaG9vayBzcGVjaWZ5aW5nIHRoZSBkaXJlY3RvcmllcyB3aGVyZSA8Pi10eXBlCisgICAgICAgICAgaW5jbHVkZSBmaWxlcyBhcmUgc2VhcmNoZWQgKHRoaXMgaW5jbHVkZXMgIiItaW5jbHVkZXMgbm90CisgICAgICAgICAgZm91bmQgYXMgc3BlY2lmaWVkKS4KKworCisgICAgICAgIEhfQVVUT19JTkNMVURFCisgICAgICAgICAgT3B0aW9uYWwgaG9vayBzcGVjaWZ5aW5nIGEgc3RyaW5nIHRvIGJlIGluY2x1ZGVkIGJlZm9yZQorICAgICAgICAgIHRoZSBzb3VyY2Ugb2YgZXZlcnkgY29tcGlsZWQgTFBDIG9iamVjdC4KKworCisgICAgICAgIEhfVEVMTkVUX05FRworICAgICAgICAgIE9wdGlvbmFsIGhvb2sgdG8gc3BlY2lmaXkgaG93IHRvIHBlcmZvcm0gYSBzaW5nbGUgdGVsbmV0CisgICAgICAgICAgbmVnb3RpYXRpb24uICBJZiBub3Qgc2V0LCBtb3N0IHRlbG5ldCBvcHRpb25zIGFyZSByZWplY3RlZCAocmVhZDoKKyAgICAgICAgICBvbmx5IGEgdmVyeSBtaW5pbWFsIG5lZ290aWF0aW9uIHRha2VzIHBsYWNlKS4KKworCisgICAgICAgIEhfTk9FQ0hPCisgICAgICAgICAgT3B0aW9uYWwgaG9vayB0byBzcGVjaWZpeSBob3cgdG8gcGVyZm9ybSB0aGUgdGVsbmV0IGFjdGlvbnMKKyAgICAgICAgICB0byBzd2l0Y2ggdGhlIGVjaG8gbW9kZSAodXNlZCBmb3IgZS5nLiBwYXNzd29yZCBpbnB1dF90bygpcykuCisgICAgICAgICAgSWYgbm90IHNldCwgYSBkZWZhdWx0IGhhbmRsaW5nIGlzIHBlcmZvcm1lZC4KKworICAgICAgICAgIElNUE9SVEFOVDogSWYgdGhpcyBob29rIGlzIHVzZWQsIHRoZSBjb250cm9sIG9mIGFsbCB0ZWxuZXQKKyAgICAgICAgICBuZWdvdGlhdGlvbiBpcyB0cmFuc2ZlcnJlZCB0byB0aGUgbXVkbGliICh5b3UgbXVzdCBjb21iaW5lIGl0CisgICAgICAgICAgd2l0aCBIX1RFTE5FVF9ORUcgdG8gY29uZm9ybSB0byB0aGUgdGVsbmV0IHByb3RvY29sKS4KKworCisgICAgICAgIEhfRVJRX1NUT1AKKyAgICAgICAgICBPcHRpb25hbCBob29rIHRvIG5vdGlmeSB0aGUgbXVkbGliIGFib3V0IHRoZSB0ZXJtaW5hdGlvbiBvZgorICAgICAgICAgIHRoZSBlcnEgZGVtb24uCisKKworSElTVE9SWQorICAgICAgICBUaGUgaG9va3MgY29uY2VwdCB3YXMgaW50cm9kdWNlZCBpbiAzLjIuMQorICAgICAgICBIX01PVkVfT0JKRUNUMC8xIHdlcmUgaW50cm9kdWNlZCBpbiAzLjIuMUAxCisgICAgICAgIEhfQ0xFQU5fVVAgd2FzIGludHJvZHVjZWQgaW4gMy4yLjFAMzQKKyAgICAgICAgSF9NT0RJRllfQ09NTUFORCB3YXMgaW50cm9kdWNlZCBpbiAzLjIuMUA1MS4KKyAgICAgICAgSF9NT0RJRllfQ09NTUFORF9GTkFNRSB3YXMgJ2hvb2tlZCcgaW4gMy4yLjFAMTA5LgorICAgICAgICBIX05PVElGWV9GQUlMRSBhbmQgSF9OT19JUENfU0xPVCB3ZXJlIGludHJvZHVjZWQgaW4gMy4yLjFANTUuCisgICAgICAgIEhfSU5DTFVERV9ESVJTIHdhcyBpbnRyb2R1Y2VkIGluIDMuMi4xQDU3LgorICAgICAgICBIX1RFTE5FVF9ORUcgd2FzIGludHJvZHVjZWQgaW4gMy4yLjFANjAuCisgICAgICAgIEhfTk9FQ0hPIGFuZCBIX0VSUV9TVE9QIHdlcmUgaW50cm9kdWNlZCBpbiAzLjIuMUA4NS4KKyAgICAgICAgSF9DT01NQU5EIHdhcyBpbnRyb2R1Y2VkIGluIDMuMi43LgorICAgICAgICBIX1NFTkRfTk9USUZZX0ZBSUwgYW5kIEhfQVVUT19JTkNMVURFIHdlcmUgaW50cm9kdWNlZCBpbiAzLjIuOS4KKyAgICAgICAgSF9ERUZBVUxUX01FVEhPRCB3YXMgaW50cm9kdWNlZCBpbiAzLjMuMTEzLgorICAgICAgICBIX0RFRkFVTFRfUFJPTVBUIGFuZCBIX1BSSU5UX1BST01QVCB3ZXJlIGludHJvZHVjZWQgaW4gMy4zLjE2My4KKworU0VFIEFMU08KKyAgICAgICAgbmF0aXZlKEMpLCBzZXRfZHJpdmVyX2hvb2soRSksIGFsbCBpbiAoSCkKZGlmZiAtLWdpdCBhL2RvYy9jb25jZXB0cy9oc3JlZ2V4cCBiL2RvYy9jb25jZXB0cy9oc3JlZ2V4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDI2NmJlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2NvbmNlcHRzL2hzcmVnZXhwCkBAIC0wLDAgKzEsOTkgQEAKK1NZTk9QU0lTCisgICAgICAgIEhlbnJ5IFNwZW5jZXIgUmVndWxhciBFeHByZXNzaW9ucworCisKK0RFU0NSSVBUSU9OCisgICAgICAgIFRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSByZWd1bGFyIGV4cHJlc3Npb25zIHN1cHBvcnRlZCBieSB0aGUKKyAgICAgICAgaW1wbGVtZW50YXRpb24gYnkgSGVucnkgU3BlbmNlciAodGhlIHRyYWRpdGlvbmFsIHBhY2thZ2UgZm9yCisgICAgICAgIExQTXVkKS4KKworCitPUFRJT05TCisgICAgICAgIFRoZSBmb2xsb3dpbmcgYml0ZmxhZyBvcHRpb25zIG1vZGlmeSB0aGUgYmVoYXZpb3VyIG9mIHRoZQorICAgICAgICByZWd1bGFyIGV4cHJlc3Npb25zIC0gYm90aCBpbnRlcnByZXRhdGlvbiBhbmQgYWN0dWFsIG1hdGNoaW5nLgorCisgICAgICAgIFRoZSBlZnVucyBtYXkgdW5kZXJzdGFuZCBhZGRpdGlvbmFsIG9wdGlvbnMuCisKKyAgICAgICAgICBSRV9FWENPTVBBVElCTEUKKworICAgICAgICBJZiB0aGlzIGJpdCBpcyBzZXQsIHRoZSBwYXR0ZXJuIGlzIGludGVycHJldGVkIGFzIHRoZSBVTklYIGVkCisgICAgICAgIGVkaXRvciB3b3VsZCBkbyBpdDogKCkgbWF0Y2ggbGl0ZXJhbGx5LCBhbmQgdGhlIFwoIFwpIGdyb3VwCisgICAgICAgIGV4cHJlc3Npb25zLgorCisKK1JFR1VMQVIgRVhQUkVTU0lPTiBERVRBSUxTCisgICAgICAgIEEgcmVndWxhciBleHByZXNzaW9uIGlzIGEgcGF0dGVybiB0aGF0IGlzIG1hdGNoZWQgYWdhaW5zdCAgYQorICAgICAgICBzdWJqZWN0IHN0cmluZyBmcm9tIGxlZnQgdG8gcmlnaHQuIE1vc3QgY2hhcmFjdGVycyBzdGFuZCBmb3IKKyAgICAgICAgdGhlbXNlbHZlcyBpbiBhIHBhdHRlcm4sIGFuZCBtYXRjaCB0aGUgY29ycmVzcG9uZGluZyBjaGFyYWMtCisgICAgICAgIHRlcnMgaW4gdGhlIHN1YmplY3QuIEFzIGEgdHJpdmlhbCBleGFtcGxlLCB0aGUgcGF0dGVybgorCisgICAgICAgICAgVGhlIHF1aWNrIGJyb3duIGZveAorCisgICAgICAgIG1hdGNoZXMgYSBwb3J0aW9uIG9mIGEgc3ViamVjdCBzdHJpbmcgdGhhdCBpcyAgaWRlbnRpY2FsICB0bworICAgICAgICBpdHNlbGYuICBUaGUgIHBvd2VyICBvZiAgcmVndWxhciAgZXhwcmVzc2lvbnMgY29tZXMgZnJvbSB0aGUKKyAgICAgICAgYWJpbGl0eSB0byBpbmNsdWRlIGFsdGVybmF0aXZlcyBhbmQgcmVwZXRpdGlvbnMgaW4gdGhlICBwYXQtCisgICAgICAgIHRlcm4uICBUaGVzZSAgYXJlIGVuY29kZWQgaW4gdGhlIHBhdHRlcm4gYnkgdGhlIHVzZSBvZiBtZXRhLQorICAgICAgICBjaGFyYWN0ZXJzLCB3aGljaCBkbyBub3Qgc3RhbmQgZm9yICB0aGVtc2VsdmVzICBidXQgIGluc3RlYWQKKyAgICAgICAgYXJlIGludGVycHJldGVkIGluIHNvbWUgc3BlY2lhbCB3YXkuCisKKyAgICAgICAgVGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgc2V0cyBvZiBtZXRhLWNoYXJhY3RlcnM6IHRob3NlICB0aGF0CisgICAgICAgIGFyZSAgcmVjb2duaXplZCBhbnl3aGVyZSBpbiB0aGUgcGF0dGVybiBleGNlcHQgd2l0aGluIHNxdWFyZQorICAgICAgICBicmFja2V0cywgYW5kIHRob3NlIHRoYXQgYXJlIHJlY29nbml6ZWQgaW4gc3F1YXJlICBicmFja2V0cy4KKyAgICAgICAgT3V0c2lkZSBzcXVhcmUgYnJhY2tldHMsIHRoZSBtZXRhLWNoYXJhY3RlcnMgYXJlIGFzIGZvbGxvd3M6CisKKyAgICAgICAgICAuICAgICAgIE1hdGNoIGFueSBjaGFyYWN0ZXIuCisKKyAgICAgICAgICBeICAgICAgIE1hdGNoIGJlZ2luIG9mIGxpbmUuCisKKyAgICAgICAgICAkICAgICAgIE1hdGNoIGVuZCBvZiBsaW5lLgorCisgICAgICAgICAgXDwgICAgICBNYXRjaCBiZWdpbiBvZiB3b3JkLgorCisgICAgICAgICAgXD4gICAgICBNYXRjaCBlbmQgb2Ygd29yZC4KKworICAgICAgICAgIFxCICAgICAgbm90IGF0IGVkZ2Ugb2YgYSB3b3JkIChzdXBwb3NlZCB0byBiZSBsaWtlIHRoZSBlbWFjcworICAgICAgICAgICAgICAgICAgY29tcGF0aWJpbGl0eSBvbmUgaW4gZ251IGVncmVwKQorCisgICAgICAgICAgeHx5ICAgICBNYXRjaCByZWdleHAgeCBvciByZWdleHAgeS4KKworICAgICAgICAgICgpICAgICAgTWF0Y2ggZW5jbG9zZWQgcmVnZXhwIGxpa2UgYSAnc2ltcGxlJyBvbmUgKHVubGVzcworICAgICAgICAgICAgICAgICAgUkVfRVhDT01QQVRJQkxFIGlzIHNldCkuCisKKyAgICAgICAgICB4KiAgICAgIE1hdGNoIGFueSBudW1iZXIgKDAgb3IgbW9yZSkgb2YgcmVnZXhwIHguCisKKyAgICAgICAgICB4KyAgICAgIE1hdGNoIGFueSBudW1iZXIgKDEgb3IgbW9yZSkgb2YgcmVnZXhwIHguCisKKyAgICAgICAgICBbLi5dICAgIE1hdGNoIG9uZSBvZiB0aGUgY2hhcmFjdGVycyBlbmNsb3NlZC4KKworICAgICAgICAgIFteIC4uXSAgTWF0Y2ggbm9uZSBvZiB0aGUgY2hhcmFjdGVycyBlbmNsb3NlZC4gVGhlIC4uIGFyZSB0bworICAgICAgICAgICAgICAgICAgcmVwbGFjZWQgYnkgc2luZ2xlIGNoYXJhY3RlcnMgb3IgY2hhcmFjdGVyIHJhbmdlczoKKworICAgICAgICAgIFthYmNdICAgbWF0Y2hlcyBhLCBiIG9yIGMuCisKKyAgICAgICAgICBbYWIwLTldIG1hdGNoZXMgYSwgYiBvciBhbnkgZGlnaXQuCisKKyAgICAgICAgICBbXmEtel0gIGRvZXMgbm90IG1hdGNoIGFueSBsb3dlcmNhc2UgY2hhcmFjdGVyLgorCisgICAgICAgICAgXGMgICAgICBtYXRjaCBjaGFyYWN0ZXIgYyBldmVuIGlmIGl0J3Mgb25lIG9mIHRoZSBzcGVjaWFsCisgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzLgorCisKK05PVEVTCisgICAgICAgIFRoZSBcPCBhbmQgXD4gbWV0YWNoYXJhY3RlcnMgZnJvbSBIZW5yeSBTcGVuY2VycyBwYWNrYWdlCisgICAgICAgIGFyZSBub3QgYXZhaWxhYmxlIGluIFBDUkUsIGJ1dCBjYW4gYmUgZW11bGF0ZSB3aXRoIFxiLAorICAgICAgICBhcyByZXF1aXJlZCwgYWxzbyBpbiBjb25qdW5jdGlvbiB3aXRoIFxXIG9yIFx3LgorCisgICAgICAgIEluIExETXVkLCBiYWNrdHJhY2tzIGFyZSBsaW1pdGVkIGJ5IHRoZSBFVkFMX0NPU1QgcnVudGltZQorICAgICAgICBsaW1pdCwgdG8gYXZvaWQgZnJlZXppbmcgdGhlIGRyaXZlciB3aXRoIGEgbWF0Y2gKKyAgICAgICAgbGlrZSByZWdleHAoKHsiPVhYPT09PT09PT09PT09PT09PT09PSJ9KSwgIlgoLispK1giKS4KKworCitBVVRIT1IKKyAgICAgICAgTWFyayBILiBDb2xidXJuLCBOQVBTIEludGVybmF0aW9uYWwgKG1hcmtAamhlcmVnLm1uLm9yZykKKyAgICAgICAgSGVucnkgU3BlbmNlciwgVW5pdmVyc2l0eSBvZiBUb3Jyb250byAoaGVucnlAdXR6b28uZWR1KQorICAgICAgICBKb2VybiBSZW5uZWNrZQorICAgICAgICBJYW4gUGhpbGxpcHBzCisKKworU0VFIEFMU08KKyAgICAgICAgcmVnZXhwKEMpLCBwY3JlKEMpCmRpZmYgLS1naXQgYS9kb2MvY29uY2VwdHMvaW1wIGIvZG9jL2NvbmNlcHRzL2ltcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2Q5YWI5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2NvbmNlcHRzL2ltcApAQCAtMCwwICsxLDYzIEBACitDT05DRVBUCisgICAgICAgIGltcAorCitMQVNUIFVQREFURUQKKyAgICAgICAgRGVlcHRob3VnaHQsIDEwLU5vdi05MgorICAgICAgICBQZXBlbCwgICAgICAgICAgICAgMTgtTm92LTkzCisKK0RFU1JJUFRJT04KKyAgICAgICAgVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgSU1QLCB0aGUgaW50ZXJtdWQgbWVzc2FnZSBwcm90b2NvbCwKKyAgICAgICAgYWxzbyBrbm93biBhcyBJbnRlcm11ZC0xLgorCisgICAgICAgIEltcCBtZXNzYWdlcyBhcmUgZXhjaGFuZ2VkIGJldHdlZW4gbXVkcyB1c2luZyBVRFAKKyAgICAgICAgKHVucmVsaWFibGUgZGF0YWdyYW0gcHJvdG9jb2wpIHBhY2tldHMuIEVhY2ggbXVkIHByb3ZpZGVzCisgICAgICAgIGEgY29ubmVjdGlvbiBlbmRwb2ludCB3aGljaCBpcyBnaXZlbiBieSB0aGUgaXAgaG9zdCBhZGRyZXNzCisgICAgICAgIGFuZCB0aGUgVURQIHBvcnQgbnVtYmVyLiBNdWRzIG1heSB0aGVuIHNlbmQgbWVzc2FnZXMgdG8KKyAgICAgICAgdGhpcyBwb3J0IGJ5IHVzaW5nIHRoZSBlZnVuIHNlbmRfdWRwKCkuIFRoZSBhcHBsaWVkIGZ1bmN0aW9uCisgICAgICAgIHJlY2VpdmVfdWRwIHdpbGwgYmUgY2FsbGVkIGJ5IHRoZSBkcml2ZXIgaW4gdGhlIG1hc3RlcgorICAgICAgICBvYmplY3QgaWYgYSBpbXAgbWVzc2FnZSBhcnJpdmVzIGF0IHRoZSBtdWQncyBVRFAgcG9ydC4KKworICAgICAgICBJbXAgbWVzc2FnZSBwYWNrZXRzIGhhdmUgdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisKKyAgICAgICAgcGFzc3dvcmRAb2JqZWN0bmFtZUBmdW5jdGlvbm5hbWVbW0Bhcmd1bWVudF0uLi5dCisKKyAgICAgICAgPHBhc3N3b3JkPiBpcyB0aGUgY29ubmVjdGlvbiBwYXNzd29yZCB0byB2ZXJpZnkgaW5jb21pbmcKKyAgICAgICAgaW1wIHBhY2tldHMuIEl0IGlzIGVuY29kZWQgdXNpbmcgY3J5cHQoRSkgYW5kIGNvbXBhcmVkIHRvCisgICAgICAgIHRoZSBzdG9yZWQgcGFzc3dvcmQuIEVhY2ggbXVkIHBhcnRpY2lwYXRpbmcgaW4gdGhlIGltcAorICAgICAgICBuZXR3b3JrIGhhcyBhIHNlY3JldCBwYXNzd29yZCB3aGljaCBpcyBlbmNvZGVkIGJ5IHRoZQorICAgICAgICBhZG1pbiBhbmQgZGlzdHJpYnV0ZWQgdG8gcmVtb3RlIG11ZHMgd2l0aCB3aGljaCB0aGUgbXVkCisgICAgICAgIHNob3VsZCBoYXZlIGRpcmVjdCBjb25uZWN0aW9uLiBFbmNyeXRlZCBwYXNzd29yZHMgbWF5IGFsc28KKyAgICAgICAgcHJvcGFnYXRlZCB0byBvdGhlciBtdWRzIG92ZXIgYWxyZWFkeSBzZWN1cmUgY2hhbm5lbHMuCisKKyAgICAgICAgPG9iamVjdG5hbWU+IGlzIGEgbG9naWNhbCBuYW1lIHdoaWNoIGlzIG5vdCB0byBiZSBjb25mdXNlZAorICAgICAgICB3aXRoIG11ZGxpYiBvYmplY3QgZmlsZW5hbWVzLiBJdCBpcyB1c2VkIGJ5IHJlY2VpdmVfbXNnIGluCisgICAgICAgIHRoZSBtYXN0ZXIgb2JqZWN0IHRvIHJvdXRlIHRoZSBtZXNzYWdlIHRvIGFub3RoZXIgb2JqZWN0IGJ5CisgICAgICAgIGFzc29jaWF0aW5nIHRoZSBsb2dpY2FsIG9iamVjdCBuYW1lIHdpdGggYSByZWFsIG11ZGxpYiBmaWxlCisgICAgICAgIG5hbWUuIEEgZ29vZCBpZGVhIHdvdWxkIGJlIHRvIHJlc2VydmUgYSBzcGVjaWFsIGRpcmVjdG9yeQorICAgICAgICBmb3IgaW1wIG9iamVjdHMsIGUuZy4gL3NlY3VyZS9uZXQvPG9iamVjdG5hbWU+LgorCisgICAgICAgIDxmdW5jdGlvbm5hbWU+IGlzIHRoZSBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgYnkgdGhlIG1hc3RlcgorICAgICAgICBvYmplY3QgaW4gdGhlIG9iamVjdCBkZXNjcmliZWQgYnkgPG9iamVjdG5hbWU+LgorCisgICAgICAgIDxhcmd1bWVudD4gYXJlIGFkZGl0aW9uYWwgYXJndW1lbnRzIHdoaWNoIGFyZSBoYW5kZWQgdG8gdGhlCisgICAgICAgIGZ1bmN0aW9uIDxmdW5jdGlvbm5hbWU+LiBUaGUgZXhhY3QgZGVmaW5pdGlvbiBvZiBmdW5jdGlvbnMKKyAgICAgICAgYW5kIGFyZ3VtZW50cyBhcmUgbGVmdCB0byB0aGUgaW1wIGFwcGxpY2F0aW9ucy4KKworQVVUSE9SCisgICAgICAgIG9yaWdpbmFsbHkgRGVlcHRob3VnaHQKKworTk9URQorICAgICAgICBUaGUgYWJvdmUgaXMgb25seSBwYXJ0aWN1bGFybHkgY29ycmVjdCBub3dhZGF5cy4gUmVjZW50bHkgYQorICAgICAgICBwYWNrYWdlIG5hbWUgYGBpbmV0ZCcnIHdhcyBwdWJsaXNoZWQsIHRoYXQgaXMgYmFzZWQgb24gdGhlIElNUAorICAgICAgICBtZWNoYW5pc20gaW4gdGhlIGRyaXZlciAoc2VuZF91ZHAoKSBhbmQgcmVjZWl2ZV91ZHAoKSksIGJ1dAorICAgICAgICBpdCB1c2VzIGEgZGlmZmVyZW50IG1lc3NhZ2UgZm9ybWF0LiBUaGF0IHBhY2thZ2Ugc2VlbXMgdG8KKyAgICAgICAgZW5qb3kgbXVjaCBwdWJsaWNpdHkgYW5kIGlzIGluc3RhbGxlZCBpbiBhIG51bWJlciBvZiBtdWRzLiBGb3IKKyAgICAgICAgZGV0YWlscyBsb29rIGludG8gdGhlIGluZXRkIGRlc2NyaXB0aW9uLgorCisgICAgICAgIEFuIG90aGVyIG1ldGhvZCBvZiBpbnRlciBtdWQgY29ubmVjdGlvbiBpcyB0aGUgTXVkbGluaworICAgICAgICBwYWNrYWdlLCB3aGljaCB1c2VzIGEgbm9ybWFsIHVzZXIgY29ubmVjdGlvbiB0aGF0IGlzIGNvbm5lY3RlZAorICAgICAgICB0byBhIHNwZWNpYWwgdXNlciBvYmplY3QsIGFuZCBhbiBhdXhpbGlhcnkgcHJvY2VzcyB0aGF0IGRvZXMKKyAgICAgICAgdGhlIGNvbm5lY3Rpb24gdG8gb3RoZXIgbXVkcy4KKworU0VFIEFMU08KKyAgICAgICAgc2VuZF91ZHAoRSksIHJlY2VpdmVfdWRwKE0pLCBpbnRlcm11ZChDKQpkaWZmIC0tZ2l0IGEvZG9jL2NvbmNlcHRzL2luaGVyaXRhbmNlIGIvZG9jL2NvbmNlcHRzL2luaGVyaXRhbmNlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YmYzMzgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvY29uY2VwdHMvaW5oZXJpdGFuY2UKQEAgLTAsMCArMSwxNzcgQEAKK0NPTkNFUFQKKyAgICAgICAgSW5oZXJpdGFuY2UKKworREVTQ1JJUFRJT04KKyAgICAgICAgSGF2ZSB5b3Ugbm90aWNlZCBob3cgbWFueSBvYmplY3RzIGluIHRoZSBzeXN0ZW0gaGF2ZSB0aGUgc2FtZQorICAgICAgICBmdW5jdGlvbmFsaXR5IGluIGNvbW1vbj8gTGV0J3MgbG9vayBhdCByb29tcyBmb3IgaW5zdGFuY2UsIHRoZXkKKyAgICAgICAgYWxsIGhhdmUgdGhlIGFiaWxpdHkgdG8gaG9zdCBwZW9wbGUgYW5kIHByb3ZpZGUgY29tbWFuZHMuIEl0J3MKKyAgICAgICAgbm90IHRoYXQgZXZlcnkgcm9vbSBpcyBwcm9ncmFtbWVkIHdpdGggdGhlIHNhbWUgYmFzaWMgZnVuY3Rpb25zCisgICAgICAgIGFnYWluIGFuZCBhZ2FpbiwgcmF0aGVyIGl0IHdpbGwgdXNlIGEgbW9kZWwgcm9vbSBhbmQgdGhlbiBtYWtlCisgICAgICAgIHNvbWUgc3BlY2lhbCBjaGFuZ2VzIHRvIGl0LiBUaGF0IGRvZXNuJ3Qgd29yayBieSBjb3B5aW5nIHRoZQorICAgICAgICBmaWxlLi4gT3VjaCEgRG9uJ3QgcmVwbGljYXRlIGNvZGUhIEJ1dCBieSBwdXR0aW5nIGEgdGlueSBpbmhlcml0CisgICAgICAgIGRlY2xhcmF0aW9uCisgICAgICAgIAorICAgICAgICAgICAgICAgIGluaGVyaXQgIjxtb2RlbC1jbGFzcz4iOworICAgICAgICAgICAgICAgIAorICAgICAgICBhdCB0aGUgYmVnaW5uaW5nIG9mIHlvdXIgbmV3IGZpbGUuIFRoaXMgbXVzdCBjb21lIGJlZm9yZSBhbnkgbG9jYWwKKyAgICAgICAgYXJpYWJsZXMgb3IgZnVuY3Rpb25zLiBPbmNlIGluaGVyaXRlZCB5b3VyIGNsYXNzIHdpbGwgYmVoYXZlIGp1c3QKKyAgICAgICAgbGlrZSB0aGUgbW9kZWwgY2xhc3MsIGJlY2F1c2UgYWxsIHRoZSBwdWJsaWMgbWV0aG9kcyBhcmUgYXZhaWxhYmxlCisgICAgICAgIHRvIHRoZSBvdXRzaWRlIHdvcmxkLiBOb3cgaXQgaXMgaW4geW91ciBoYW5kcyB0byBjaGFuZ2Ugc3VjaCBhbgorICAgICAgICBpbmhlcml0ZWQgYmVoYXZpb3VyLiBZb3UgaGF2ZSB0aGUgZm9sbG93aW5nIHRvb2xzIHRvIGRvIHNvOgorCisgICAgICAgICogQWNjZXNzIHRvIHZhcmlhYmxlcworCisgICAgICAgIEl0IGlzIG9uZSBvZiB0aGUgYmVzdCBkZXNpZ24gZGVjaXNpb25zIGluIExQQyB0aGF0IHZhcmlhYmxlcworICAgICAgICBhcmUgbm90IGFjY2Vzc2libGUgZnJvbSBvdXRzaWRlLCBidXQgeW91IGNhbiB1c2UgaW5oZXJpdGVkCisgICAgICAgIHZhcmlhYmxlcyBqdXN0IGFzIGlmIHRoZXkgd2VyZSB5b3VyIG93bi4gTW9kaWZpZXJzIGFwcGx5IGhvd2V2ZXIuCisKKyAgICAgICAgKiBNZXRob2Qgb3ZlcmxvYWRpbmcKKworICAgICAgICAgICAgICAgIGludCBtZXRob2RfdGhhdF9hbHNvX2V4aXN0c19pbl90aGVfbW9kZWwoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICA8eW91ciBuZXcgY29kZT4KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgWW91IGNhbiBzaW1wbHkgcmV3cml0ZSBhIG1ldGhvZCB0aGF0IGlzIGFsc28gZGVmaW5lZCBpbiB0aGUgbW9kZWwKKyAgICAgICAgY2xhc3MsIGFuZCB0aHVzIGNoYW5nZSBob3cgaXQgYmVoYXZlcy4gQ29udHJhcnkgdG8gb3RoZXIgbGFuZ3VhZ2VzCisgICAgICAgIGluIExQQyBtZXRob2Qgb3ZlcmxvYWRpbmcgb25seSBtYXRjaGVzIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QsIHNvCisgICAgICAgIGV2ZW4gYnkgY2hhbmdpbmcgdGhlIGFtb3VudCBhbmQgdHlwZSBvZiBwYXJhbWV0ZXJzIHlvdSB3aWxsIG1hc2sKKyAgICAgICAgb3V0IHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBtZXRob2QuIFlvdSBjYW4gZXZlbiBhcHBseSBvdGhlcgorICAgICAgICBtb2RpZmllcnMgdG8gaXQgYXMgdGhlIG9yaWdpbmFsLgorCisgICAgICAgICogQ2FsbGluZyBpbmhlcml0ZWQgbWV0aG9kcworCisgICAgICAgICAgICAgICAgaW50IG1ldGhvZF90aGF0X2Fsc29fZXhpc3RzX2luX3RoZV9tb2RlbCgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIDx5b3VyIG5ldyBjb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDo6bWV0aG9kX3RoYXRfYWxzb19leGlzdHNfaW5fdGhlX21vZGVsKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgIFlvdSBjYW4gYWRkIHRvIHRoZSBiZWhhdmlvdXIgb2YgYSBtZXRob2QgYnkgcmVkZWZpbmluZyBpdCwKKyAgICAgICAgdGhlbiBjYWxsaW5nIGl0IGZyb20gd2l0aGluIHlvdXIgbmV3IHZlcnNpb24uIFlvdSBjYW4gYWN0dWFsbHkKKyAgICAgICAgY2FsbCBpbmhlcml0ZWQgbWV0aG9kcyBmcm9tIGFueXdoZXJlIGluIHlvdXIgY29kZS4gVGhlIGRvdWJsZQorICAgICAgICBjb2xvbiB0ZWxscyB0aGUgY29tcGlsZXIgeW91IGFyZSBsb29raW5nIGZvciB0aGUgaW5oZXJpdGVkCisgICAgICAgIHZhcmlhbnQuCisKK0VYQU1QTEUKKworICAgICAgICBMZXQncyBpbWFnaW5lIHZlcnkgc2ltcGxlIGZvb2QgaW4gYSBmaWxlIGNhbGxlZCAiL3RoZS9mb29kLmMiOgorCisgICAgICAgICAgICAgICAgLy8gdW5sZXNzICJtb2RpZmllZCIgdmFyaWFibGVzIGFyZSBhY2Nlc3NpYmxlIGJ5IGluaGVyaXRvcnMKKyAgICAgICAgICAgICAgICBpbnQgdml0YW1pbnMgPSAxMDsKKworICAgICAgICAgICAgICAgIC8vIHBsZWFzZSBvdmVybG9hZCB0aGlzIGZ1bmN0aW9uIHdpdGggeW91ciBvd24gZGVzY3JpcHRpb24KKyAgICAgICAgICAgICAgICBwdWJsaWMgc2hvcnQoKSB7IHJldHVybiAic29tZXRoaW5nIGVkaWJsZSI7IH0KKworICAgICAgICAgICAgICAgIC8vIGxldCdzIGRvIHNvbWUgc3RhbmRhcmQgYWN0aW9uIGZvciBmb29kCisgICAgICAgICAgICAgICAgcHVibGljIGNvbnN1bWUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX3BsYXllcigpIC0+IG5vdXJpc2godml0YW1pbnMpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVzdHJ1Y3QodGhpc19vYmplY3QoKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgIEFuZCBub3cgc29tZW9uZSBlbHNlIGRlY2lkZXMgdG8gZG8gc29tZSBpdGFsaWFuIGNvb2tpbmcgaW4gYQorICAgICAgICBmaWxlIGNhbGxlZCAiL3RoZS9mdXNpbGxpLmMiCisKKyAgICAgICAgICAgICAgICBpbmhlcml0ICIvdGhlL2Zvb2QiOworCisgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSBvdXIgb3duIHZhcmlhYmxlcy4KKyAgICAgICAgICAgICAgICBpbnQgZ29uZV9jb2xkID0gMDsKKworICAgICAgICAgICAgICAgIC8vIGFuZCB3ZSBzaW1wbHkgcmVkZWZpbmUgdGhlIHNob3J0KCkgZnVuY3Rpb24gdG8gcmVwbGFjZSBpdAorICAgICAgICAgICAgICAgIHB1YmxpYyBzaG9ydCgpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZGVzY3JpcHRpb24gY2hhbmdlcyBkZXBlbmRpbmcgb24gZ29uZV9jb2xkCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiYSAiKyggZ29uZV9jb2xkID8gInN0aW5raW5nIiA6ICJzdGVhbWluZyIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiIHBsYXRlIG9mIGZ1c2lsbGkiOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgYSBuZXcgZnVuY3Rpb24gdG8gbWFrZSBmb29kIGdvIGNvbGQKKyAgICAgICAgICAgICAgICBwcml2YXRlIGRldGVyaW9yYXRlKCkgeworICAgICAgICAgICAgICAgICAgICBnb25lX2NvbGQgPSAxOworICAgICAgICAgICAgICAgICAgICB3cml0ZSgiVGhlIGZ1c2lsbGkgaGF2ZSBnb25lIGNvbGQuXG4iKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBhc3N1bWUgdGhpcyBnZXRzIGNhbGxlZCBhdCBjcmVhdGlvbgorICAgICAgICAgICAgICAgIHByaXZhdGUgY3JlYXRlKCkgeworICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjYW4gYWNjZXNzIHRoZSB2YXJpYWJsZSB3ZSBpbmhlcml0ZWQgZnJvbSBmb29kLmMKKyAgICAgICAgICAgICAgICAgICAgdml0YW1pbnMgPSA0NDsgICAgICAgICAgIC8vIHRvbWF0byBoYXMgcGxlbnR5IG9mIHZpdGFtaW5zCisKKyAgICAgICAgICAgICAgICAgICAgLy8gZ28gY29sZCBpbiA1IG1pbnV0ZXMKKyAgICAgICAgICAgICAgICAgICAgY2FsbF9vdXQoICMnZGV0ZXJpb3JhdGUsIDUgKiA2MCApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHdlIGNhbiBvdmVybG9hZCB0aGUgZnVuY3Rpb24gZXZlbiB3aXRoIG5ldyBwYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgcHVibGljIGNvbnN1bWUoaG93KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGZldGNoIHRoZSBuYW1lIG9mIHRoZSBwZXJzb24sIG9yIHVzZSAiU29tZW9uZSIKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUgPSB0aGlzX3BsYXllcigpIC0+IG5hbWUoKSB8fCAiU29tZW9uZSI7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFnb25lX2NvbGQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlKCJZb3UgZW5qb3kgYSBkZWxpY2lvdXMgcGxhdGUgb2YgZnVzaWxsaS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgc2F5KG5hbWUgKyIgZ3V6emxlcyBhIHBsYXRlIG9mIGhvdCBmdXNpbGxpLlxuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaG93ID09ICJxdWlja2x5IikgeworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGUoIllvdSBlYXQgdGhlIGZ1c2lsbGkgc28gcXVpY2tseSB5b3UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhcmRseSBub3RpY2UgdGhleSBoYXZlIGdvbmUgY29sZC5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgc2F5KG5hbWUgKyIgd29sZnMgZG93biBhIHBsYXRlIG9mIGNvbGQgZnVzaWxsaS5cbiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGUoIllvdSBleWUgdGhlIHBsYXRlIGFuZCB3b25kZXIgaWYgeW91ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFsbHkgZmVlbCBsaWtlIGVhdGluZyBjb2xkIGZ1c2lsbGkuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gZG9uJ3QgZWF0CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBhbmQgaGVyZSBjb21lcyB0aGUgbW9zdCBpbXBvcnRhbnQgcGFydDoKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgZXhlY3V0ZSBjb25zdW1lKCkgZnJvbSBmb29kLmMsIHNvIHdlCisgICAgICAgICAgICAgICAgICAgIC8vIGFjdHVhbGx5IGluaGVyaXQgaXRzIGJlaGF2aW91ci4KKyAgICAgICAgICAgICAgICAgICAgOjpjb25zdW1lKCk7CisgICAgICAgICAgICAgICAgfQorCitBRFZBTkNFRCBVU0FHRQorCisgICAgICAgICogRG9pbmcgbXVsdGlwbGUgaW5oZXJpdGFuY2UKKworICAgICAgICBXaGlsZSB0aGUgSmF2YShUTSkgbGFuZ3VhZ2UgaGFzIHNvLWNhbGxlZCBpbnRlcmZhY2VzIGFzIGEga2x1ZGdlLAorICAgICAgICBMUEMgZG9lc24ndCBuZWVkIHRoZW0gYXMgaXQgc3VwcG9ydHMgcmVhbCBtdWx0aXBsZSBpbmhlcml0YW5jZS4KKyAgICAgICAgQSB2ZXJ5IHBvd2VyZnVsIGZlYXR1cmUsIGl0IGxldHMgeW91IGNvbWJpbmUgdGhlIGJlaGF2aW91ciBvZgorICAgICAgICBzZXZlcmFsIGNsYXNzZXMgaW50byBhIG5ldyBvbmUuIFNpbXBseSBwdXQgc2V2ZXJhbCBsaW5lcyBvZgorICAgICAgICBpbmhlcml0IGRlY2xhcmF0aW9ucyB1bmRlcm5lYXRoIGVhY2ggb3RoZXIuIElmIHlvdSBoYXZlIG5hbWUKKyAgICAgICAgY29sbGlzaW9ucyBpbiB0aGUgbmFtZXNwYWNlIG9mIGluaGVyaXRlZCBtZXRob2RzLCB5b3Ugd2lsbCBoYXZlCisgICAgICAgIHRvIGFkZHJlc3MgdGhlbSBleHBsaWNpdGVseSB3aXRoIGEgInRoZS9maWxlIjo6bWV0aG9kKGFyZ3MpIHN5bnRheC4KKworICAgICAgICAqIFdpbGRjYXJkZWQgbXVsdGlwbGUgaW5oZXJpdGFuY2UKKworICAgICAgICBMRE1VRCAzLjIuMUAxMTcgaW50cm9kdWNlcyBhbiBhZHZhbmNlZCB2b29kb28gc3ludGF4IHdoaWNoIGFsbG93cworICAgICAgICB5b3UgdG8gY2FsbCBzZXZlcmFsIG1ldGhvZHMgaW4gbW9kZWwgY2xhc3NlcyBhdCBvbmNlLCBidXQgZm9yIHNvbWUKKyAgICAgICAgdGVjaG5pY2FsIHJlYXNvbnMgaXQgY2Fubm90IHBhc3MgYW55IGFyZ3VtZW50cy4gVGhpcyB3b3JrcyBieQorICAgICAgICB3cml0aW5nIGEgZ2xvYiB0eXBlIG1hdGNoICgnKicgYW5kICc/JyB3aWxkY2FyZHMpIGludG8gdGhlIHN0cmluZworICAgICAgICBpbiBmcm9udCBvZiB0aGUgZG91YmxlIGNvbG9uLCBhcyBpbiAiKiI6OmNyZWF0ZSgpLiBJIHdvdWxkbid0CisgICAgICAgIHJlY29tbWVuZCB5b3UgdG8gdXNlIHRoaXMsIGl0J3MgYmV0dGVyIHRvIGJlIGNsZWFybHkgY29uc2Npb3VzIG9mCisgICAgICAgIHdoYXQgeW91IGluaGVyaXQgYW5kIGRvLiBCdXQgaWYgeW91J3JlIGRlc3BlcmF0ZSwgdGhlcmUgeW91IGdvLgorCitBRFZBTkNFRCBFWEFNUExFCisKKyAgICAgICAgICBpbmhlcml0ICJmb28iOworICAgICAgICAgIGluaGVyaXQgImJhciI7CisgICAgICAgICAgaW5oZXJpdCAiYmF6IjsKKyAgICAgICAgICBpbmhlcml0ICJiYWxsIjsKKworICAgICAgICAgIHJlc2V0KCkgeworICAgICAgICAgICAgICAgICJiYT8iOjpyZXNldCgpOworICAgICAgICAgICAgICAgIC8vIGNhbGxzIGJhcjo6cmVzZXQoKSBhbmQgYmF6OjpyZXNldCgpCisKKyAgICAgICAgICAgICAgICAiYmEqIjo6cmVzZXQoKTsKKyAgICAgICAgICAgICAgICAvLyBjYWxscyBiYXI6OnJlc2V0KCksIGJhejo6cmVzZXQoKSBhbmQgYmFsbDo6cmVzZXQoKQorCisgICAgICAgICAgICAgICAgIioiOjpyZXNldCgpOworICAgICAgICAgICAgICAgIC8vIGNhbGxzIGV2ZXJ5IGluaGVyaXRlZCByZXNldCgpIGZ1bmN0aW9uLgorCisgICAgICAgICAgICAgICAgImJhbGwiOjpyZWpvaWNlKCJMaXN0ZW4gdG8gaXRhbGVjdHJvIHRvZGF5ISIpOworICAgICAgICAgICAgICAgIC8vIG9ubHkgZXhwbGljaXQgZmlsZW5hbWUgb2YgbW9kZWwgY2xhc3MgYWxsb3dzCisgICAgICAgICAgICAgICAgLy8gcGFzc2luZyBhcmd1bWVudHMgdG8gdGhlIGluaGVyaXRlZCBtZXRob2QKKyAgICAgICAgICB9CisKK0FVVEhPUgorICAgICAgICBzeW1seW5YIG9mIFBTWUMgYW5kIE5lbWVzaXMsIHdpdGggYSBsaXR0bGUgaGVscCBmcm9tIFNvbWVvbmUKKworU0VFIEFMU08KKyAgICAgICAgZnVuY3Rpb25zKExQQyksIGluaXRpYWxpc2F0aW9uKExQQyksIG1vZGlmaWVycyhMUEMpLCBwcmFnbWEoTFBDKSwKKyAgICAgICAgb3ZlcmxvYWRpbmcoQykKKyAgICAgICAgZnVuY3Rpb25fZXhpc3RzKGVmdW4pLCBmdW5jdGlvbmxpc3QoZWZ1biksIGluaGVyaXRfbGlzdChlZnVuKSwKKyAgICAgICAgc3ltYm9sX3ZhcmlhYmxlKGVmdW4pLCB2YXJpYWJsZV9leGlzdHMoZWZ1biksIHZhcmlhYmxlX2xpc3QoZWZ1bikuCmRpZmYgLS1naXQgYS9kb2MvY29uY2VwdHMvaW50ZXJtdWQgYi9kb2MvY29uY2VwdHMvaW50ZXJtdWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJlMmI0ZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9jb25jZXB0cy9pbnRlcm11ZApAQCAtMCwwICsxLDIyNCBAQAorQ09OQ0VQVAorICAgICAgICBpbnRlcm11ZAorCitERVNDUklQVElPTgorICAgICAgICBUaGVyZSBhcmUgc2V2ZXJhbCBpbnRlcm11ZCBwcm90b2NvbHMgd2hpY2ggZGVmaW5lIGhvdyAocGxheWVycyBvbikKKyAgICAgICAgZGlmZmVyZW50IG11ZHMgY2FuIGNvbW11bmljYXRlIHdpdGggZWFjaCBvdGhlci4gVGhlIHByb3RvY29scyBhcmUKKyAgICAgICAgaW4gZ2VuZXJhbCBub3QgbXVkZHJpdmVyIG9yIG11ZGxpYiBkZXBlbmRhbnQsIHRob3VnaCB0aGUgbnVtYmVyIG9mCisgICAgICAgIGltcGxlbWVudGF0aW9ucyBpcyBsaW1pdGVkLgorCisgICAgICAgIFRoaXMgdGV4dCBpcyBhYm91dCB0aGUgcmF0aGVyIG9sZCB3aWRlbHkgc3ByZWFkICdaZWJlZGVlIEludGVybXVkJywKKyAgICAgICAgd2hpY2ggaXMgYWxzbyBjYWxsZWQgJ0ludGVybXVkIDInIGFsdG91Z2ggaXQgZGlmZmVycyBxdWl0ZSBhIGxvdAorICAgICAgICBmcm9tIHRoZSByZWFsIEludGVybXVkIDIgcHJvdG9jb2wuCisKKyAgICAgICAgRnVsbCBpbmZvcm1hdGlvbiBvbiB0aGUgbmV3ZXIgSW50ZXJtdWQgMyBjb3VsZCBiZSBmb3VuZCBvbiB0aGUKKyAgICAgICAgd2ViIGF0IGh0dHA6Ly93d3cuaW1hZ2luYXJ5LmNvbS9wcm90b2NvbHMvaW50ZXJtdWQzLmh0bWwgc28gdGhlcmUKKyAgICAgICAgaXMgbm8gZGlzY3Vzc2lvbiBoZXJlIC0gdGhlIGZvbGxvd2luZyBpcyBqdXN0IGFib3V0IFplYmVkZWUgSW50ZXJtdWQKKyAgICAgICAgKGFrYSBJbnRlcm11ZCAyKS4KKworICAgICAgICBaZWJlZGVlIEludGVybXVkIGNvbW11bmljYXRpb24gaXMgaGFuZGxlZCBieSB0aGUgL3NlY3VyZS9pbmV0ZAorICAgICAgICBvYmplY3QsIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBOb3N0cmFkYW11cyBmb3IgWmViZWRlZSB3aXRoIHNvbWUKKyAgICAgICAgZXh0ZW5zaW9ucyB0aGF0IGFyZSBkaXNjdXNzZWQgaW4gaW5ldGQoQykuIEhvdyB0aGUgZGF0YSBpcworICAgICAgICBhY3R1YWxseSBzZW50IGFjcm9zcyB0aGUgbmV0d29yayBpcyBkZXNjcmliZWQgaW4gaW50ZXJtdWQuYmFzaWMoQykuCisKK1NFUlZJQ0VTCisgICAgICAgIE5vdGUgdGhhdCB0aGUgZmllbGRzICJOQU1FIiBhbmQgIlVEUF9QT1JUIiBzaG91bGQgYmUgcHJlc2VudCBpbgorICAgICAgICBldmVyeSBtZXNzYWdlLiBWZXJ5IGNvbW1vbiBhcmUgdGhlIGZpZWxkcyAiSUQiICh1c2VkIHdoZW5ldmVyIGFuCisgICAgICAgIHJlcGx5IGlzIGV4cGVjdGVkKSBhbmQgIlNORCIgKHRoZSBzZW5kZXI6IGhlIHNob3VsZCByZWNlaXZlIHRoZQorICAgICAgICByZXBseSkuIFRoZXNlIGZpZWxkcyB3aWxsIG5vdCBiZSBtZW50aW9uZWQgaW4gdGhlIGxpc3QgYmVsb3cuCisKKyAgICAgICAgUmVxdWVzdCB0eXBlcyBhcmUgbGlzdGVkIG9uIHRoZSBsZWZ0bW9zdCByb3cgKGUuZy4gIlJFUT1jaGFubmVsIiksCisgICAgICAgIGFzc29jaWF0ZWQgaGVhZGVyIGFyZSBsaXN0ZWQgaW5kZW50ZWQuCisKKyAgICAgICAgImNoYW5uZWwiCisgICAgICAgICAgICBUaGUgY2hhbm5lbC1yZXF1ZXN0IGlzIHVzZWQgZm9yIHNlbmRpbmcgYSBtZXNzYWdlIG9uIGFueQorICAgICAgICAgICAgY2hhbm5lbC4gVGhlICJDTUQiIGZpZWxkIGlzIG9wdGlvbmFsIGFuZCBtYXkgYmUgb21pdHRlZCBmb3IKKyAgICAgICAgICAgIG5vcm1hbCBtZXNzYWdlcy4gTm90ZSB0aGF0IHlvdSBzaG91bGQgbm90IHNlbmQgYW4gaGlzdG9yeSBvcgorICAgICAgICAgICAgbGlzdCByZXF1ZXN0IHRvIF9hbGxfIGtub3duIG11ZHMhCisKKyAgICAgICAgICAgICJDSEFOTkVMIgorICAgICAgICAgICAgICAgIFRoZSBjaGFubmVsIG9uIHdoaWNoIGEgbWVzc2FnZSBpcyBzZW5kICh0aGUgc3RhbmRhcmQKKyAgICAgICAgICAgICAgICBjaGFubmVscyBhcmUgImludGVybXVkIiwgImludGVyY29kZSIsICJpbnRlcmFkbSIsICJkLWNoYXQiLAorICAgICAgICAgICAgICAgICJkLWNvZGUiIGFuZCAiZC1hZG0iOyBvbiB0aGUgZC1jaGFubmVscyBHZXJtYW4gaXMgc3Bva2VuKQorCisgICAgICAgICAgICAiREFUQSIKKyAgICAgICAgICAgICAgICBUaGUgbWVzc2FnZSB0byBiZSBzZW5kIChub3QgdXNlZCB3aXRoIGhpc3RvcnkvbGlzdCByZXF1ZXN0KQorCisgICAgICAgICAgICAiQ01EIgorICAgICAgICAgICAgICAgIFRoZSBib2R5IG9mIHRoaXMgaGVhZGVyIG1heSBiZToKKyAgICAgICAgICAgICAgICAiIiAgICAgICAgZm9yIG5vcm1hbCBpbnRlcm11ZCBtZXNzYWdlcywKKyAgICAgICAgICAgICAgICAiZW1vdGUiICAgaWYgdGhlIG1lc3NhZ2UgaXMgYW4gZW1vdGUvZ2Vtb3RlLAorICAgICAgICAgICAgICAgICJoaXN0b3J5IiBmb3IgYW4gaGlzdG9yeSByZXF1ZXN0OiB0aGUgbGFzdCAyMCBsaW5lcyBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGNoYW5uZWwgd2lsbCBiZSBzaG93bi4KKyAgICAgICAgICAgICAgICAibGlzdCIgICAgdG8gbGlzdCBhbGwgcmVtb3RlIHVzZXJzIGxpc3RlbmluZyB0byB0aGlzIGNoYW5uZWwKKworICAgICAgICAgICAgIkVNT1RFIiAgICAgKG9wdGlvbmFsKQorICAgICAgICAgICAgICAgIFRoZSBib2R5IGlzIDEgaWYgdGhlIG1lc3NhZ2UgaXMgYW4gZW1vdGUuCisgICAgICAgICAgICAgICAgVGhlIGJvZHkgaXMgMiBpZiB0aGUgbWVzc2FnZSBpcyBhIGdlbW90ZS4KKworICAgICAgICAiZmluZ2VyIgorICAgICAgICAgICAgUmV0cmVpdmUgaW5mb3JtYXRpb24gYWJvdXQgYSBwbGF5ZXIgb3IgY3JlYXRvciBvbiBhIHJlbW90ZSBtdWQuCisKKyAgICAgICAgICAgICJEQVRBIgorICAgICAgICAgICAgICAgIFRoZSBwbGF5ZXIgb2Ygd2hvbSBpbmZvcm1hdGlvbiBpcyByZXF1ZXN0ZWQKKworICAgICAgICAibG9jYXRlIgorICAgICAgICAgICAgQ2hlY2sgd2hldGhlciBhIGNlcnRhaW4gcGxheWVyIGlzIGxvZ2dlZCBvbiBhdCBhIHJlbW90ZSBtdWQuCisgICAgICAgICAgICBUaGlzIHJlcXVlc3QgaXMgdXN1YWxseSBzZW5kIHRvIGFsbCBrbm93biBtdWRzIGF0IHRoZSBzYW1lIHRpbWUuCisKKyAgICAgICAgICAgICJ1c2VyIgorICAgICAgICAgICAgICAgIE5hbWUgb2YgdGhlIHBlcnNvbiB3aG8gcmVxdWVzdHMgdGhlIGluZm9ybWF0aW9uLgorICAgICAgICAgICAgICAgIFRoaXMgaXMgdXNlZCBieSB0aGUgc2VuZGluZyBtdWQgb25seSBhbmQgaGFzIHRvIGJlIGluY2x1ZGVkCisgICAgICAgICAgICAgICAgaW4gdGhlIHJlcGx5LgorCisgICAgICAgICAgICAidmJzIgorICAgICAgICAgICAgICAgIFRoZSB2ZXJib3NlIG9wdGlvbiBoYXMgb25seSB0d28gcHJlLWRlZmluZWQgdmFsdWVzOgorICAgICAgICAgICAgICAgIDEgRXZlbiByZXBvcnQgd2hlbiB0aGUgcmVzdWx0IHdhcyBuZWdhdGl2ZQorICAgICAgICAgICAgICAgIDIgRG9uJ3QgZG8gdGltZW91dHMsIGJ1dCBrZWVwIHdhaXRpbmcKKyAgICAgICAgICAgICAgICBUaGlzIGlzIHVzZWQgYnkgdGhlIHNlbmRpbmcgbXVkIG9ubHkgYW5kIGhhcyB0byBiZSBpbmNsdWRlZAorICAgICAgICAgICAgICAgIGluIHRoZSByZXBseS4KKworICAgICAgICAgICAgImZuZCIKKyAgICAgICAgICAgICAgICBUaGUgZm91bmQgb3B0aW9uIGlzIG9ubHkgdXNlZCBpbiB0aGUgcmVwbHkgYW5kIGl0J3MgdmFsdWUKKyAgICAgICAgICAgICAgICBpcyBlaXRoZXIgMSAoc3VjY2Vzcykgb3IgMCAoZmFpbHVyZSkuIFRoZSBhYnNlbmNlIG9mIGEKKyAgICAgICAgICAgICAgICBmb3VuZCBwYXJhbWV0ZXIgaW5kaWNhdGVzIGZhaWx1cmUgYXMgd2VsbC4KKworICAgICAgICAgICAgIkRBVEEiCisgICAgICAgICAgICAgICAgVGhlIHBsYXllciB0byBmaW5kLgorCisgICAgICAgICJtYW4iCisgICAgICAgICAgICBSZXRyZWl2ZSBhIG1hbnVhbCBwYWdlIGZyb20gYSByZW1vdGUgbXVkLiBNYW55IG11ZHMgZG9uJ3QKKyAgICAgICAgICAgIHN1cHBvcnQgdGhpcyBmZWF0dXJlLi4uCisKKyAgICAgICAgICAgICJEQVRBIgorICAgICAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgbWFudWFsIHBhZ2UKKworICAgICAgICAibWFpbCIKKyAgICAgICAgICAgIEFuIGV4dGVuc2lvbiB0byB0aGUgc3RhbmRhcmQgcHJvdG9jb2wsIGJ5IEFsdmluQFN1c2hpLiBUaGlzIGlzCisgICAgICAgICAgICB1c2VkIHRvIHNlbmQgbWFpbHMgZnJvbSBvbmUgbXVkIHRvIGFub3RoZXIuCisKKyAgICAgICAgICAgICJ1ZHBtX3N0YXR1cyIKKyAgICAgICAgICAgICAgICBUaGlzIGZpZWxkIHNob3VsZCBvbmx5IGJlIHVzZWQgaW4gdGhlIHJlcGx5IGFuZCBpbmRpY2F0ZXMKKyAgICAgICAgICAgICAgICBob3cgbWFpbCBpcyBoYW5kbGVkLiBDdXJyZW50bHkgdGhlcmUgYXJlIGZvdXIgcHJlLWRlZmluZWQKKyAgICAgICAgICAgICAgICB2YWx1ZXMgZm9yIHRoZSBzdGF0dXMgZmllbGQ6CisgICAgICAgICAgICAgICAgMCB0aW1lIG91dAorICAgICAgICAgICAgICAgIDEgZGVsaXZlcmVkIG9rCisgICAgICAgICAgICAgICAgMiB1bmtub3duIHBsYXllcgorICAgICAgICAgICAgICAgIDMgaW4gc3Bvb2wgKHdpbGwgYmUgZGVsaXZlcmVkIGxhdGVyKQorCisgICAgICAgICAgICAidWRwbV93cml0ZXIiCisgICAgICAgICAgICAgICAgTmFtZSBvZiB0aGUgcGVyc29uIHdobyB3cm90ZSB0aGlzIG1haWwKKworICAgICAgICAgICAgInVkcG1fc3Bvb2xfbmFtZSIKKyAgICAgICAgICAgICAgICBTaG91bGQgYmUgcmV0dXJuZWQgYXMgc2VudCwgdGhpcyB2YWx1ZSBpcyB1c2VkIHRvIHJlbW92ZQorICAgICAgICAgICAgICAgIHRoZSBtYWlsIGZyb20gdGhlIHNwb29sIGRpcmVjdG9yeSBhZnRlciBpdCBoYXMgYmVlbgorICAgICAgICAgICAgICAgIGRlbGl2ZXJlZCAob3IgcmVmdXNlZCkKKworICAgICAgICAgICAgInVkcG1fc3ViamVjdCIKKyAgICAgICAgICAgICAgICBTdWJqZWN0IG9mIHRoZSBtYWlsIG1lc3NhZ2UKKworICAgICAgICAgICAgIkRBVEEiCisgICAgICAgICAgICAgICAgVGhlIGJvZHkgb2YgdGhlIG1haWwgKHRoZSBhY3R1YWwgbWVzc2FnZSkKKworICAgICAgICAicGluZyIKKyAgICAgICAgICAgIEEgcGluZyByZXF1ZXN0IGhhcyBvbmx5IHRoZSBzdGFuZGFyZCBmaWVsZHMsIHRoZSByZXBseSBpcworICAgICAgICAgICAgdXN1YWxseSBhIHNob3J0IHN0cmluZyBsaWtlICIgaXMgYWxpdmUuIgorCisgICAgICAgICJxdWVyeSIKKyAgICAgICAgICAgIEdldCBzdGFuZGFyZCBpbmZvcm1hdGlvbiBhYm91dCBhbm90aGVyIG11ZC4gVGhpcyBpcyB0aGUgb25seQorICAgICAgICAgICAgY29tbWFuZCBvZiB3aGljaCB0aGUgcmVwbHkgbWF5IG5vdCBpbmNsdWRlIGEgbG9hZCBvZiBydWJiaXNoLAorICAgICAgICAgICAgYnV0IHNob3VsZCBvbmx5IGhvbGQgdGhlIHJlcXVlc3RlZCBpbmZvcm1hdGlvbiwgc28gdGhhdCBpdCBjYW4KKyAgICAgICAgICAgIGJlIHBhcnNlZCBieSB0aGUgc2VydmVyLgorCisgICAgICAgICAgICAiREFUQSIKKyAgICAgICAgICAgICAgICBUaGUgZm9sbG93aW5nIHF1ZXJpZXMgYXJlIHByZXR0eSBtdWNoIHN0YW5kYXJkOgorICAgICAgICAgICAgICAgICJjb21tYW5kcyIgTGlzdCBhbGwgY29tbWFuZHMgdGhhdCBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBpbmV0ZAorICAgICAgICAgICAgICAgICJlbWFpbCIgICAgVGhlIGVtYWlsLWFkZHJlc3Mgb2YgdGhlIG11ZCBhZG1pbmlzdHJhdG9yKHMpCisgICAgICAgICAgICAgICAgImhvc3RzIiAgICBBIGxpc3Rpbmcgb2YgYWxsIGhvc3RzIGluIGEgc3BlY2lhbCBmb3JtYXQgW3QuYi5kLl0KKyAgICAgICAgICAgICAgICAiaW5ldGQiICAgIFRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgaW5ldGQgdXNlZAorICAgICAgICAgICAgICAgICJsaXN0IiAgICAgVGhlIGxpc3Qgb2YgYWxsIGl0ZW1zIHdoaWNoIGNhbiBiZSBxdWVyaWVkCisgICAgICAgICAgICAgICAgImluZm8iICAgICBBIHNob3J0IGh1bWFuLXJlYWRhYmxlIHN0cmluZyB3aXRoIHByYWN0aWNhbGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAicXVlcnkiIGluZm9ybWF0aW9uCisgICAgICAgICAgICAgICAgIm11ZF9wb3J0IiBUaGUgcG9ydG51bWJlciB0aGF0IHBsYXllcnMgY29ubmVjdCB0byBvbiBsb2dpbgorICAgICAgICAgICAgICAgICJ0aW1lIiAgICAgVGhlIGxvY2FsIHRpbWUgZm9yIHRoaXMgbXVkCisgICAgICAgICAgICAgICAgInVzZXJzIiAgICBBIGxpc3Qgb2YgdGhlIHBlb3BsZSB0aGF0IGFyZSBhY3RpdmUgaW4gdGhpcyBtdWQKKyAgICAgICAgICAgICAgICAidmVyc2lvbiIgIFRoZSB2ZXJzaW9uIG9mIHRoZSBtdWQtZHJpdmVyIChhbmQgbGlicmFyeSkKKyAgICAgICAgICAgICAgICAid3d3IiAgICAgIFRoZSBVUkwgb2YgdGhlIG11ZCdzIHdlYiBwYWdlIChlLmcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vbXVkLnN0YWNrLm5sLykKKworICAgICAgICAicmVwbHkiCisgICAgICAgICAgICBUaGlzIHJlcXVlc3QgbWV0aG9kIGlzIHVzZWQgZm9yIF9hbGxfIHJlcGxpZXMuCisKKyAgICAgICAgICAgICJEQVRBIgorICAgICAgICAgICAgICAgIEEgaHVtYW4tcmVhZGFibGUgc3RyaW5nLCBjb250YWluaW5nIHRoZSByZXBseSB0byBhIGdpdmVuIHF1ZXJ5CisKKyAgICAgICAgICAgICJSQ1BOVCIKKyAgICAgICAgICAgICAgICBUaGUgc2FtZSBuYW1lIGFzIGluIHRoZSAiU05EIiBmaWVsZCBvciB0aGUgcXVlcnk7IFVzdWFsbHkKKyAgICAgICAgICAgICAgICB0aGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBwbGF5ZXIgd2hvIGluaXRpYXRlZCB0aGUgcXVlcnkKKworICAgICAgICAgICAgIlFVRVJZIgorICAgICAgICAgICAgICAgIFRoaXMgZmllbGQgaXMgb25seSB1c2VkIGluIGEgcmVzcG9uc2UgdG8gYSAicXVlcnkiIHJlcXVlc3QKKyAgICAgICAgICAgICAgICBhbmQgc2hvdWxkIGJlIGVxdWFsIHRvIHRoZSAiREFUQSIgZmllbGQgb2YgdGhhdCByZXF1ZXN0CisKKyAgICAgICAgICAgICJ2YnMiCisgICAgICAgICAgICAgICAgVGhpcyBmaWVsZCBpcyBvbmx5IHVzZWQgaW4gYSByZXNwb25zZSB0byBhICJsb2NhdGUiIHJlcXVlc3QKKyAgICAgICAgICAgICAgICBhbmQgc2hvdWxkIGJlIGVxdWFsIHRvIHRoZSAidmJzIiBmaWVsZCBvZiB0aGF0IHJlcXVlc3QKKworICAgICAgICAgICAgInVzZXIiCisgICAgICAgICAgICAgICAgVGhpcyBmaWVsZCBpcyBvbmx5IHVzZWQgaW4gYSByZXNwb25zZSB0byBhICJsb2NhdGUiIHJlcXVlc3QKKyAgICAgICAgICAgICAgICBhbmQgc2hvdWxkIGJlIGVxdWFsIHRvIHRoZSAidXNlciIgZmllbGQgb2YgdGhhdCByZXF1ZXN0CisKKyAgICAgICAgICAgICJmbmQiCisgICAgICAgICAgICAgICAgVGhpcyBmaWVsZCBpcyBvbmx5IHVzZWQgaW4gYSByZXNwb25zZSB0byBhICJsb2NhdGUiIHJlcXVlc3QKKyAgICAgICAgICAgICAgICBhbmQgc2hvdWxkIGJlIDEgaWYgdGhlIHBsYXllciB3YXMgbG9jYXRlZCBhbmQgMCBvdGhlcndpc2UKKworICAgICAgICAidGVsbCIKKyAgICAgICAgICAgIFNheSBzb21ldGhpbmcgdG8gYSBwbGF5ZXIgb24gYW5vdGhlciBtdWQuCisKKyAgICAgICAgICAgICJSQ1BOVCIKKyAgICAgICAgICAgICAgICBOYW1lIG9mIHRoZSBwbGF5ZXIgdG8gd2hvbSB5b3UgYXJlIHRhbGtpbmcKKworICAgICAgICAgICAgIkRBVEEiCisgICAgICAgICAgICAgICAgV2hhdGV2ZXIgeW91IHdpc2ggdG8gc2F5IHRvIHRoaXMgcGVyc29uCisKKyAgICAgICAgICAgIE9wdGlvbmFsIGVtb3RlLXRvcyBhcmUgaGFuZGxlcyBhcmUgYWxzbyBoYW5kbGVkIGFzIHRlbGxzLCBzbworICAgICAgICAgICAgbXVkcyB3aXRob3V0IGVtb3RlLXRvIHN1cHBvcnQgZGlzcGxheSB0aGVtIGFzIHJlYXNvbmFibGUgcmVhZGFibGUKKyAgICAgICAgICAgIHRlbGwgbWVzc2FnZS4KKworICAgICAgICAgICAgIlJDUE5UIgorICAgICAgICAgICAgICAgIE5hbWUgb2YgdGhlIHBsYXllciB0byB3aG9tIHlvdSBhcmUgdGFsa2luZworCisgICAgICAgICAgICAiTUVUSE9EIgorICAgICAgICAgICAgICAgIFRoZSBib2R5IG9mIHRoaXMgaGVhZGVyIG1heSBiZToKKyAgICAgICAgICAgICAgICAiZW1vdGUiICAgaWYgdGhlIG1lc3NhZ2UgaXMgYW4gZW1vdGUKKyAgICAgICAgICAgICAgICAiZ2Vtb3RlIiAgaWYgdGhlIG1lc3NhZ2UgaXMgYSBnZW5pdGl2IGVtb3RlCisKKyAgICAgICAgICAgICJEQVRBIgorICAgICAgICAgICAgICAgIFRoZSB0ZXh0IHRvIGJlIGVtb3RlZCBwcmVwZW5kZWQgd2l0aCAiKiIgYW5kIGFwcGVuZGVkCisgICAgICAgICAgICAgICAgd2l0aCAiKiAiLiBJZiB5b3UgZGlzcGxheSB0aGUgZW1vdGUgeW91IGhhdmUgdG8gY3V0IHRoZQorICAgICAgICAgICAgICAgIHN0YXJzIG9mZi4gTXVkcyB0aGF0IGRvIG5vdCBwcm9jZXNzIGVtb3RlLXRvcyBkaXNwbGF5IHRoZQorICAgICAgICAgICAgICAgIGVtb3RlIGFzIHRlbGwgbWVzc2FnZSB3aXRoIHRoZSBzdGFycyBhcyBpbmRpY2F0aW9uIG9mCisgICAgICAgICAgICAgICAgdGhlIG1lc3NhZ2UncyBlbW90ZSBtZWFuaW5nLgorCisgICAgICAgICJ3aG8iCisgICAgICAgICAgICBMaXN0IHRoZSBwZW9wbGUgdGhhdCBhcmUgYWN0aXZlIG9uIGEgcmVtb3RlIG11ZC4gVGhlIGFud2VyCisgICAgICAgICAgICB1c3VhbGx5IGNvbnRhaW5zIHNvbWUgYWN0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwbGF5ZXJzLAorICAgICAgICAgICAgbGlrZSB0aXRsZXMsIGxldmVscyBvciBhZ2UuCisKKyAgICAgICAgICAgICJEQVRBIgorICAgICAgICAgICAgICAgIE5vdCBzdXBwb3J0ZWQgYnkgbWFueSBtdWRzLiBJbnRyb2R1Y2VkIEF1Z3VzdCAxOTk3LgorICAgICAgICAgICAgICAgIEFkZGl0aW9uYWwgc3dpdGNoKGVzKSAoYmxhbmMgc2VwYXJhdGVkKSB0aGF0IGNoYW5nZSB0aGUKKyAgICAgICAgICAgICAgICBhcHBlYXJlbmNlIG9mIHRoZSByZXN1bHRpbmcgbGlzdC4gVGhlIHN3aXRjaGVzIG5vcm1hbGx5CisgICAgICAgICAgICAgICAgcmVzZW1ibGUgdGhlIHN3aXRjaGVzIHVzZWQgaW5zaWRlIG9mIHRoYXQgbXVkIGZvciB0aGUgJ3dobycKKyAgICAgICAgICAgICAgICBjb21tYW5kLiAgVHlwaWNhbCB2YWx1ZXMgaW5jbHVkZToKKyAgICAgICAgICAgICAgICAic2hvcnQiICJzIiAiLXNob3J0IiAiLXMiICJrdXJ6IjoKKyAgICAgICAgICAgICAgICAgICAgUmV0dXJuIGEgY29uY2lzZSBsaXN0aW5nLgorICAgICAgICAgICAgICAgICJhbHBoYSIgImEiICJhbHBoYWJldGlzY2giICItYWxwaGEiICItYSIKKyAgICAgICAgICAgICAgICAgICAgU29ydCB0aGUgcGxheWVycyBhbHBoYWJldGljYWxseS4KKworQVVUSE9SCisgICAgICAgIEluZm9ybWF0aW9uIHRha2VuIGZyb20gT3V0ZXJzcGFjZXMgZG9jdW1lbnRhdGlvbiB0byBiZSBmb3VuZAorICAgICAgICBvbiBodHRwOi8vbXVkLnN0YWNrLm5sL2ludGVybXVkLworCitTRUUgQUxTTworICAgICAgICBpbmV0ZChDKSwgaW50ZXJtdWQuYmFzaWMoQyksIGltcChDKQpkaWZmIC0tZ2l0IGEvZG9jL2NvbmNlcHRzL2ludGVybXVkLmJhc2ljIGIvZG9jL2NvbmNlcHRzL2ludGVybXVkLmJhc2ljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMTk2N2YKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvY29uY2VwdHMvaW50ZXJtdWQuYmFzaWMKQEAgLTAsMCArMSwxNTEgQEAKK0NPTkNFUFQKKyAgICAgICAgaW50ZXJtdWQuYmFzaWMKKworREVTQ1JJUFRJT04KKyAgICAgICAgSGVyZSBpcyBob3cgaW50ZXJtdWQgZGF0YSBpcyBzZW50IGFjcm9zcyB0aGUgaW50ZXJuZXQgLSBzcGVjaWZpYworICAgICAgICBmb3IgWmViZWRlZSBJbnRlcm11ZCAoYWthIEludGVybXVkIDIpLgorCitBRFZBTkNFRCBQUk9UT0NPTAorICAgICAgICBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBhcyBhIGJyaWVmIG91dGxpbmUgb2YgdGhlIGludGVybXVkCisgICAgICAgIHByb3RvY29sIGZvciB1c2UgYnkgZGV2ZWxvcGVycyBpbnRlcmVzdGVkIGluIGluY29ycGVyYXRpbmcgc2ltaWxhciwKKyAgICAgICAgY29tcGF0aWJsZSBpbnRlcm11ZCBwcm90b2NvbHMgaW50byB0aGVpciBvd24gbXVkIHN5c3RlbXMuIEl0IGlzCisgICAgICAgIGluY2x1ZGVkIGhlcmUgYXMgaXQgcHJvdmlkZXMgYSBtdWNoIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlCisgICAgICAgIGludGVybXVkIHByb3RvY29sIHRoYW4gdGhhdCBwcm92aWRlZCBieSB0aGUgb3JpZ2luYWwgUFJPVE9DT0wgZmlsZSwKKyAgICAgICAgYW5kIGhlbmNlIG1heSBiZSBvZiB1c2UgdG8gTHBNdWQgZGV2ZWxvcGVycy4gCisKK1BBQ0tFVCBQUk9UT0NPTCAvIEZPUk1BVAorICAgICAgICBBbGwgaW5mb3JtYXRpb24gaXMgdHJhbnNmZXJyZWQgYXMgYSBzdHJpbmcgdmlhIGEgVURQIHBvcnQgKGVhY2ggbXVkCisgICAgICAgIGhhcyAxIHNlbmQgYW5kIDEgcmVjZWl2ZSBwb3J0KS4gVGhpcyBraW5kb2YgdHJhbnNmZXIgaXMgaW5oZXJlbnRseQorICAgICAgICB1bnJlbGlhYmxlLCBidXQgaXQncyBmYXN0IGFuZCBkb2Vzbid0IHVzZSB1cCBmaWxlIGRlc2NyaXB0b3JzLgorICAgICAgICBUaGUgZm9ybWF0IG9mIHRoZSBzdHJpbmdzIChwYWNrZXRzKSBpcyBhcyBmb2xsb3dzOiAKKworICAgICAgICAgICBoZWFkZXIxOmJvZHkxfGhlYWRlck46Ym9keU58REFUQTpib2R5LWRhdGEKKworICAgICAgICBJbiBvdGhlciB3b3JkcywgYSBoZWFkZXIgbmFtZSwgZm9sbG93ZWQgYnkgYSA6IGFuZCB0aGVuIHRoZSBkYXRhCisgICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGhlYWRlci4gRWFjaCBoZWFkZXIvYm9keSBwYWlyIGlzIHNlcGFyYXRlZCBieQorICAgICAgICB0aGUgfCBjaGFyYWN0ZXIuIFRoaXMgbWVhbnMgdGhhdCBoZWFkZXJzIGFuZCB0aGVpciBib2R5IGNhbm5vdAorICAgICAgICBjb250YWluIHRoZSB8IGNoYXJhY3Rlci4gWW91IHNob3VsZCBjaGVjayBmb3IgdGhpcyBpbiBvdXRnb2luZworICAgICAgICBwYWNrZXRzIHRvIGF2aW9kIGRlY29kaW5nIGVycm9ycyBhdCB0aGUgcmVjaWV2aW5nIGVuZC4gVGhlIGV4Y2VwdGlvbgorICAgICAgICB0byB0aGlzIGlzIHRoZSBEQVRBIGZpZWxkLiBJZiBpdCBpcyBwcmVzZW50LCBpdCBpcyBBTFdBWVMgcG9zaXRpb25lZAorICAgICAgICBhdCB0aGUgZW5kIG9mIHRoZSBwYWNrZXQuIE9uY2UgYSBEQVRBIGhlYWRlciBpcyBmb3VuZCwgZXZlcnl0aGluZworICAgICAgICBmb2xsb3dpbmcgaXQgaXMgaW50ZXJwcmV0ZWQgYXMgdGhlIGJvZHkgb2YgdGhlIERBVEEgZmllbGQuIFRoaXMKKyAgICAgICAgbWVhbnMgaXQgY2FuIGNvbnRhaW4gc3BlY2lhbCBjaGFyYWN0ZXJzIHdpdGhvdXQgZXJyb3IgYW5kIGl0IGlzCisgICAgICAgIHVzZWQgdG8gY2FycnkgdGhlIG1haW4gYm9keSBvciBkYXRhIG9mIGFsbCBwYWNrZXRzLiAKKworICAgICAgICBCeSBjb252ZW50aW9uLCBwcmVkZWZpbmVkIHN5c3RlbSBmaWVsZHMgd2lsbCB1c2UgY2FwaXRhbCBsZXR0ZXJzIGZvcgorICAgICAgICBmaWVsZCBoZWFkZXJzIGFuZCBjdXN0b20gaGVhZGVycyB1c2VkIGJ5IHNwZWNpZmljIGFwcGxpY2F0aW9ucyB3aWxsCisgICAgICAgIHVzZSBsb3dlcmNhc2UgbmFtZXMgdG8gYXZvaWQgY2xhc2hlcy4gVGhlIGRlZmluZWQgc3lzdGVtIGZpZWxkcyBhcmUKKyAgICAgICAgZ2VuZXJhbGx5IHJlZmVyZWQgdG8gYnkgYSBzZXQgb2YgbWFjcm9zIHdoaWNoIGFyZSBkZWZpbmVkIGluIGEKKyAgICAgICAgY29tbW9uIGhlYWRlciBmaWxlIGZvciBjbGFyaXR5LiAKKworICAgICAgICBUaGVyZSBpcyBvbmUgZXhjZXB0aW9uIHRvIHRoaXMgaGVhZGVyIGZvcm1hdDsgSWYgdGhlIGRhdGEgaXMgdG9vCisgICAgICAgIGxhcmdlIHRvIGJlIHRyYW5zbWl0dGVkIGluIG9uZSBzaW5nbGUgcGFja2V0LCBpdCB3aWxsIGJlIHNwbGl0IGludG8KKyAgICAgICAgcGFja2V0cyBvZiBjb252ZW5pZW50IHNpemUsIGVhY2ggd2l0aCBhIHNwZWNpYWwgdW5pcXVlIHBhY2tldCBoZWFkZXIKKyAgICAgICAgdG8gZW5hYmxlIHRoZW0gdG8gYmUgcmVhc3NlbWJsZWQgYXQgdGhlIHJlY2VpdmluZyBlbmQuIFRoZXNlCisgICAgICAgIGhlYWRlcnMgYXJlIG9mIHRoZSBmb3JtYXQ6IAorCisgICAgICAgICAgUEtUOm11ZG5hbWU6cGFja2V0LWlkOnBhY2tldC1udW1iZXIvdG90YWwtcGFja2V0c3xyZXN0LW9mLXBhY2tldAorCisgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIG11ZG5hbWUgYW5kIHBhY2tldC1pZCBjb21iaW5lIHRvIGZvcm0gYSB1bmlxdWUgaWQKKyAgICAgICAgZm9yIHRoZSBwYWNrZXQuIFRoZSBwYWNrZXQtbnVtYmVyIGFuZCB0b3RhbC1wYWNrZXRzIGluZm9ybWF0aW9uIGlzCisgICAgICAgIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZW4gYWxsIGJ1ZmZlcmVkIHBhY2tldHMgaGF2ZSBiZWVuIHJlY2VpdmVkLiBUaGUKKyAgICAgICAgcmVzdC1vZi1wYWNrZXQgcGFydCBpcyBub3QgcGFyc2VkLCBidXQgaXMgc3RvcmVkIHdoaWxlIHRoZSByZWNlaXZlcgorICAgICAgICBhd2FpdHMgdGhlIG90aGVyIHBhcnRzIG9mIHRoZSBwYWNrZXQuIFdoZW4vaWYgYWxsIHBhcnRzIGhhdmUgYmVlbgorICAgICAgICByZWNlaXZlZCB0aGV5IGFyZSBjb25jYXRlbmF0ZWQgYW5kIGRlY29kZWQgYXMgYSBub3JtYWwgcGFja2V0LiAKKworUEFDS0VUIEVOQ09ESU5HIC8gREVDT0RJTkcKKyAgICAgICAgT25seSAyIGdlbmVyaWMgZGF0YSB0eXBlcyBhcmUgZnVsbHkgc3Vwb3J0ZWQgd2l0aGluIHRoZSBpbmV0ZCBjb2RlCisgICAgICAgIGl0c2VsZiAobmFtZWx5IHN0cmluZ3MgYW5kIGludGVnZXJzKSwgdGhvdWdoIG90aGVycyBjYW4gZWFzaWx5IGJlCisgICAgICAgIHVzZWQgYnkgY29udmVydGluZyB0aGVtIHRvIG9uZSBvZiB0aGUgc3VwcG9ydGVkIGRhdGEgdHlwZXMgYmVmb3JlCisgICAgICAgIHRyYW5zZmVyIGFuZCBjb252ZXJ0aW5nIGJhY2sgYWdhaW4gaW4gcmVjZWlwdC4gVGhlIExwTXVkICJvYmplY3QiCisgICAgICAgIGRhdGEgdHlwZSBpcyBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcgYXV0b21hdGljYWxseSBieSB0aGUgaW5ldGQgb24KKyAgICAgICAgZW5jb2RpbmcsIGJ1dCBubyBzdWNoIGNvbnZlcnNpb24gaXMgY2FycmllZCBvdXQgb24gZGVjb2RpbmcuIAorCisgICAgICAgIE9uIGVuY29kaW5nIGludGVnZXJzIGFyZSBzaW1wbHkgY29udmVydGVkIHRvIGEgY29ycmVzcG9uZGluZyBzdHJpbmcuCisgICAgICAgIFN0cmluZ3MgYXJlIGxlZnQgdW50b3VjaGVkIGFzIGxvbmcgYXMgdGhlcmUgaXMgbm8gYW1iaWd1aXR5IGFzIHRvCisgICAgICAgIHdldGhlciB0aGV5IHNob3VsZCBiZSBkZWNvZGVkIGFzIGEgc3RyaW5nIG9yIGFuIGludGVnZXIuIEluIHRoaXMKKyAgICAgICAgY2FzZSBvZiBhbWJpZ3VpdHksIHRoZSBzdHJpbmcgaXMgcHJlcGVuZGVkIHdpdGggYSAkIGNoYXJhY3Rlci4gSWYKKyAgICAgICAgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBhIHN0cmluZyBpcyB0aGUgJCBjaGFyYWN0ZXIsIGl0IGlzIGVzY2FwZWQKKyAgICAgICAgYnkgcHJlcGVuZGluZyBhbm90aGVyICQgY2hhcmFjdGVyLiBPbiBkZWNvZGluZywgYW55IHN0cmluZyB3aXRoIGEgJAorICAgICAgICBhcyBpdHMgZmlyc3QgY2hhcmFjdGVyIHdpbGwgaGF2ZSBpdCByZW1vdmVkIGFuZCB3aWxsIHRoZW4gYmUgdHJlYXRlZAorICAgICAgICBhcyBhIHN0cmluZy4gQW55IHJlbWFpbmluZyBzdHJpbmdzIHRoYXQgY2FuIGJlIGNvbnZlcnRlZCB0byBhbgorICAgICAgICBpbnRlZ2VyIGFuZCB0aGVuIGJhY2sgdG8gYSBzdHJpbmcgd2l0aCBubyBsb3NzIG9mIGluZm9ybWF0aW9uIGFyZQorICAgICAgICBjb25zaWRlcmVkIHRvIGJlIGludGVnZXJzLiBBbnkgcmVtYWluaW5nIHN0cmluZ3MgYXJlIHRyZWF0ZWQgYXMKKyAgICAgICAgc3VjaCBhbmQgYXJlIGxlZnQgdW5hbHRlcmVkLiAKKworREVGSU5FRCBTWVNURU0gSEVBREVSUworICAgICAgICAiUkNQTlQiIChSRUNJUElFTlQpCisgICAgICAgICAgICBUaGUgYm9keSBvZiB0aGlzIGZpZWxkIHNob3VsZCBjb250aWFpbiB0aGUgcmVjaXBpZW50IHRoZSBtZXNzYWdlCisgICAgICAgICAgICBpcyB0byBiZSBzZW50IHRvIGlmIGFwcGxpY2FibGUuIAorICAgICAgICAiUkVRIiAoUkVRVUVTVCkKKyAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBpbnRlcm11ZCByZXF1ZXN0IHRoYXQgaXMgYmVpbmcgbWFkZSBvZiB0aGUKKyAgICAgICAgICAgIHJlY2VpdmluZyBtdWQuIFN0YW5kYXJkIHJlcXVlc3RzIHRoYXQgc2hvdWxkIGJlIHN1cHBvcnRlZCBieQorICAgICAgICAgICAgYWxsIHN5c3RlbXMgYXJlICJwaW5nIiAoUElORyksICJxdWVyeSIgKFFVRVJZKSwgYW5kICJyZXBseSIKKyAgICAgICAgICAgIChSRVBMWSkuIFRoZSBQSU5HIHJlcXVlc3QgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2V0aGVyIG9yIG5vdCBhCisgICAgICAgICAgICBtdWQgaXMgYWN0aXZlLiBUaGUgUVVFUlkgcmVxdWVzdCBpcyB1c2VkIHRvIHF1ZXJ5IGEgcmVtb3RlIG11ZAorICAgICAgICAgICAgZm9yIGluZm9ybWF0aW9uIGFib3V0IGl0c2VsZiAobG9vayBhdCB0aGUgdWRwL3F1ZXJ5IG1vZHVsZSBmb3IKKyAgICAgICAgICAgIGRldGFpbHMgb2Ygd2hhdCBpbmZvcm1hdGlvbiBjYW4gYmUgcmVxdWVzdGVkKS4gVGhlIFJFUExZIHJlcXVlc3QKKyAgICAgICAgICAgIGlzIHNwZWNpYWwgaW4gdGhhdCBpdCBpcyB0aGUgcmVxdWVzdCBuYW1lIHVzZWQgZm9yIGFsbCByZXBsaWVzCisgICAgICAgICAgICBtYWRlIHRvIGJ5IG11ZCBCIHRvIGFuIGluaXRpYWwgcmVxdWVzdCBtYWRlIGJ5IGEgbXVkIEEuIEl0IGlzCisgICAgICAgICAgICBtdWQgQSdzIHJlc3BvbnNpYmlsaXR5IHRvIGtlZXAgdHJhY2sgb2YgdGhlIG9yaWdpbmFsIHJlcXVlc3QKKyAgICAgICAgICAgIHR5cGUgc28gdGhhdCB0aGUgcmVwbHkgY2FuIGJlIGhhbmRsZWQgYXBwcm9wcmlhdGVseS4gCisgICAgICAgICJTTkQiIChTRU5ERVIpCisgICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgcGVyc29uIG9yIG9iamVjdCB3aGljaCBzZW50IHRoZSByZXF1ZXN0IG9yIHRvCisgICAgICAgICAgICB3aG9tIHJlcGxpZXMgc2hvdWxkIGJlIGRpcmVjdGVkLiBUaGlzIGlzIGVzc2VudGlhbCBpZiBhIHJlcGx5CisgICAgICAgICAgICBpcyBleHBlY3RlZC4gCisgICAgICAgICJEQVRBIiAoREFUQSkKKyAgICAgICAgICAgIFRoaXMgZmllbGQgc2hvdWxkIGNvbnRhaW4gdGhlIG1haW4gYm9keSBvZiBhbnkgcGFja2V0LiBJdCBpcworICAgICAgICAgICAgdGhlIG9ubHkgZmllbGQgdGhhdCBjYW4gY29udGFpbiBzcGVjaWFsIGRlbGltaXRpbmcgY2hhcmFjdGVycworICAgICAgICAgICAgd2l0aG91dCBlcnJvci4gCisKKyAgICAgICAgVGhlIGZvbGxvd2luZyBoZWFkZXJzIGFyZSB1c2VkIGludGVybmFsbHkgYnkgdGhlIGluZXRkIGFuZCBzaG91bGQKKyAgICAgICAgbm90IGJlIHVzZWQgYnkgZXh0ZXJuYWwgb2JqZWN0czogCisgICAgICAgICJIU1QiIChIT1NUKQorICAgICAgICAgICAgVGhlIElQIGFkZHJlc3Mgb2YgdGhlIGhvc3QgZnJvbSB3aGljaCBhIHJlcXVlc3Qgd2FzIHJlY2VpdmVkLgorICAgICAgICAgICAgVGhpcyBpcyBzZXQgYnkgdGhlIHJlY2VpdmluZyBtdWQgYW5kIGlzIG5vdCBjb250YWluZWQgaW4KKyAgICAgICAgICAgIG91dGdvaW5nIHBhY2tldHMuIAorICAgICAgICAiSUQiIChJRCkKKyAgICAgICAgICAgIFRoZSBwYWNrZXQgaWQuIFRoaXMgZmllbGQgaXMgc2ltcGx5IGFuIGludGVnZXIgd2hpY2ggaXMgc2V0IGJ5CisgICAgICAgICAgICB0aGUgc2VuZGluZyBpbmV0ZC4gVGhlIG51bWJlciBpcyBpbmNyZW1lbnRlZCBlYWNoIHRpbWUgYSBwYWNrZXQKKyAgICAgICAgICAgIGlzIHNlbnQgKHplcm8gaXMgbmV2ZXIgdXNlZCkuIFRoaXMgZmllbGQgaXMgb25seSBuZWVkZWQgaWYgYQorICAgICAgICAgICAgcmVwbHkgaXMgZXhwZWN0ZWQuIFJFUExZIHBhY2tldHMgX211c3RfIGluY2x1ZGUgdGhlIG9yaWdpbmFsCisgICAgICAgICAgICByZXF1ZXN0IGlkLiBUaGlzIGlzIF9ub3RfIGRvbmUgYnkgdGhlIGluZXRkLiAKKyAgICAgICAgIk5BTUUiIChOQU1FKQorICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGxvY2FsIG11ZC4gVXNlZCBmb3Igc2VjdXJpdHkgY2hlY2tpbmcgYW5kIHRvCisgICAgICAgICAgICB1cGRhdGUgaG9zdCBsaXN0IGluZm9ybWF0aW9uLiAKKyAgICAgICAgIlBLVCIgKFBBQ0tFVCkKKyAgICAgICAgICAgIEEgc3BlY2lhbCBoZWFkZXIgcmVzZXJ2ZWQgZm9yIHBhY2tldHMgd2hpY2ggaGF2ZSBiZWVuIHNwbGl0LgorICAgICAgICAgICAgU2VlIFBBQ0tFVCBQUk9UT0NPTCAvIEZPUk1BVC4gCisgICAgICAgICJVRFAiIChVRFBfUE9SVCkKKyAgICAgICAgICAgIFRoZSBVRFAgcG9ydCB0aGUgbG9jYWwgbXVkIGlzIHJlY2VpdmluZyBvbi4gVXNlZCBmb3Igc2VjdXJpdHkKKyAgICAgICAgICAgIGNoZWNraW5nIGFuZCB1cGRhdGluZyBob3N0IGxpc3QgaW5mb3JtYXRpb24uIAorICAgICAgICAiU1lTIiAoU1lTVEVNKQorICAgICAgICAgICAgQ29udGFpbnMgc3BlY2lhbCBzeXN0ZW0gZmxhZ3MuIFRoZSBvbmx5IHN5c3RlbSBmbGFnIHVzZWQgYXQKKyAgICAgICAgICAgIHByZXNlbnQgaXMgVElNRV9PVVQuIFRoaXMgaXMgaW5jbHVkZWQgaW4gcGFja2V0cyByZXR1cm5lZCBkdWUKKyAgICAgICAgICAgIHRvIGFuIGV4cGVjdGVkIHJlcGx5IHRpbWluZyBvdXQgdG8gZGlmZmVyZW50aWF0ZSBpdCBmcm9tIGFuCisgICAgICAgICAgICBhY3R1YWwgcmVwbHkuIAorCitVRFAgUkVRVUVTVFMgLyBNT0RVTEVTCisgICAgICAgIFRoZSBmb2xsb3dpbmcgYXJlIHN0YW5kYXJkIHJlcXVlc3QgdHlwZXMgdGhhdCBtdXN0IGJlIHN1cHBvcnRlZAorICAgICAgICBieSBhbGwgc3lzdGVtczogCisgICAgICAgICJwaW5nIiAoUElORykKKyAgICAgICAgICAgIFRoaXMgbW9kdWxlIHNob3VsZCByZXR1cm4gYSBSRVBMWSBwYWNrZXQgdGhhdCBjb250YWlucyB0aGUKKyAgICAgICAgICAgIG9yaWdpbmFsIHJlcXVlc3RzIElEIGluIGl0J3MgSUQgZmllbGQgYW5kIHRoZSBTRU5ERVIgaW4gaXQncworICAgICAgICAgICAgUkVDSVBJRU5UIGZpZWxkLiBJdCBzaG91bGQgYWxzbyBpbmNsdWRlIGFuIGFwcHJvcHJpYXRlIHN0cmluZworICAgICAgICAgICAgaW4gdGhlIERBVEEgZmllbGQsIGVnLiAiTXVkLU5hbWUgaXMgYWxpdmUuXG4iIAorICAgICAgICAicXVlcnkiIChRVUVSWSkKKyAgICAgICAgICAgIFRoaXMgbW9kdWxlIGV4cGVjdHMgdGhlIHR5cGUgb2YgcXVlcnkgcmVxdWVzdGVkIHRvIGFwcGVhciBpbiB0aGUKKyAgICAgICAgICAgIHJlY2lldmVkIERBVEEgZmllbGQuIEl0IHNob3VsZCByZXR1cm4gYSBSRVBMWSBwYWNrZXQgY29udGFpbmluZworICAgICAgICAgICAgdGhlIG9yaWdpbmFsIElEIGluIHRoZSBJRCBmaWVsZCwgdGhlIFNFTkRFUiBpbiBpdCdzIFJFQ0lQSUVOVAorICAgICAgICAgICAgZmllbGQsIGFuZCB0aGUgcXVlcnkgdHlwZSBpbiBhIFFVRVJZIGZpZWxkLiBUaGUgREFUQSBmaWVsZCBzaG91bGQKKyAgICAgICAgICAgIGNvbnRhaW4gdGhlIGluZm9ybWF0aW9uIHJlcXVlc3RlZC4gCisKKyAgICAgICAgRm9yIGRldGFpbHMgb2YgaG93IG90aGVyIGludGVybXVkIHJlcXVlc3RzIG9wZXJhdGUsIGxvb2sgYXQgdGhlCisgICAgICAgIHJlbGV2YW50IG1vZHVsZSBjb2RlLiAKKworQVVUSE9SCisgICAgICAgIEluZm9ybWF0aW9uIHRha2VuIGZyb20gT3V0ZXJzcGFjZXMgZG9jdW1lbnRhdGlvbiB0byBiZSBmb3VuZCAKKyAgICAgICAgb24gaHR0cDovL211ZC5zdGFjay5ubC9pbnRlcm11ZC8KKworU0VFIEFMU08KKyAgICAgICAgaW5ldGQoQyksIGludGVybXVkKEMpCmRpZmYgLS1naXQgYS9kb2MvY29uY2VwdHMvbHBjIGIvZG9jL2NvbmNlcHRzL2xwYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTU5MTFlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2NvbmNlcHRzL2xwYwpAQCAtMCwwICsxLDY0IEBACisqIFdoYXQgaXMgTFBDPworCitMUEMgaXMgdGhlIGxhbmd1YWdlIGluIHdoaWNoIExQbXVkIG9iamVjdHMgYXJlIHdyaXR0ZW4uCitMUEMgc3RhbmRzIGZvciBMYXJzIFBlbnNqfCBDLiAgQXMgb25lIG1pZ2h0IHN1cm1pc2UgZnJvbSB0aGUgbmFtZSwKK0xQQyBpcyBiYXNlZCBvbiB0aGUgc3ludGF4IG9mIEMuICBMUEMgcHJvdmlkZXMgdGhlIEMgd2hpbGUgbG9vcCwgZm9yIGxvb3AsCitpZiBzdGF0ZW1lbnQsIHN3aXRjaCBzdGF0ZW1lbnQsIGEgdmFyaWFudCBvZiBzc2NhbmYsIGFuZCBpbnRlZ2VyIGRhdGEgdHlwZSwKKyhMUEMgYWxzbyBwcm92aWRlcyBvdGhlciBkYXRhIHR5cGVzIG5vdCBpbiBDIHN1Y2ggYXMgdGhlIG9iamVjdCBhbmQgdGhlCittYXBwaW5nKS4gIExQQyB1c2VzIEMncyBzeW50YXggZm9yIGRlZmluaW5nIGFuZCBjYWxsaW5nIGZ1bmN0aW9ucyBhbmQgZm9yCitkZWNsYXJpbmcgdmFyaWFibGVzLiAgTm90ZSB0aGF0IExQQydzIHZlcnNpb24gb2YgdGhlIHN0cmluZyBkYXRhdHlwZSBpcworbXVjaCBkaWZmZXJlbnQgZnJvbSB0aGF0IHByb3ZpZGVkIGJ5IEMuICBTZWUgdGhlIExQQyB0dXRvcmlhbCBvbiBzeW50YXgKK2FuZCBsYW5ndWFnZSBjb25zdHJ1Y3RzIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCitIZXJlIGFyZSBzb21lIGRpZmZlcmVuY2VzIGJldHdlZW4gTFBDIGFuZCBDOgorCitUaGVyZSBpcyBubyBuZWVkIGZvciBhIGZ1bmN0aW9uIG5hbWVkICJtYWluIiBpbiBMUEMgb2JqZWN0cyAoYWx0aG91Z2ggdGhlcmUKK2lzIG9uZSBjYWxsZWQgImNyZWF0ZSIpLgorCitUaGUgZWZ1bnMgKG9yIHN5c3RlbSBjYWxscykgcHJvdmlkZWQgYnkgdGhlIGdhbWVkcml2ZXIgYXJlIGRpZmZlcmVudCB0aGFuCit0aG9zZSB0eXBpY2FsbHkgZm91bmQgaW4gdGhlIEMgbGlicmFyeSAobGliYy5hKS4KKworVGhlcmUgaXMgbm8gbWFsbG9jKCkuICBIb3dldmVyLCB0aGVyZSBpcyBhbiBhbGxvY2F0ZShpbnQgdmFsdWUpIGVmdW4gdGhhdAorbGV0cyBzcGFjZSBiZSBhbGxvY2F0ZWQgZm9yIGFycmF5cy4gIE5vdGUgdGhhdCB0aGUgYXJndW1lbnQgdG8gJ2FsbG9jYXRlJworaXMgbm90IGluIHVuaXRzIG9mIGJ5dGVzLCBidXQgcmF0aGVyIGluIHVuaXRzIG9mIGVsZW1lbnRzLgorCitNZW1vcnkgaXMgbmV2ZXIgZXhwbGljaXRseSBkZWFsbG9jYXRlZC4gIFRoZSBnYW1lZHJpdmVyIGtlZXBzIHRyYWNrIG9mCitob3cgbWFueSB0aW1lcyBhIGdpdmVuIHBpZWNlIG9mIGRhdGEgaGFzIGJlZW4gcmVmZXJlbmNlZC4gIFdoZW4gdGhlCityZWZlcmVuY2UgY291bnQgZ29lcyB0byB6ZXJvICh3aGVuIG5vIG9iamVjdCBoYXMgYSBjb3B5IG9mIHRoYXQgdmFyaWFibGUpLAordGhlbiB0aGUgc3BhY2UgdXNlZCBieSB0aGUgdmFyaWFibGUgaXMgcmVjbGFpbWVkIChnYXJiYWdlIGNvbGxlY3RlZCkuCisKK1RoZSBzdHJpbmcgZGF0YSB0eXBlIGluIExQQyBpcyBjbG9zZXIgdG8gdGhhdCBwcm92aWRlZCBieSBCQVNJQyB0aGFuIHRoYXQKK3Byb3ZpZGVkIGJ5IEMuICBTdHJpbmdzIGFyZSBub3QgZGVjbGFyZWQgYXMgYXJyYXlzIG9mIGNoYXJhY3RlcnMgYnV0IHJhdGhlcgorYXMgYSBiYXNpYyBpbnRyaW5zaWMgdHlwZS4gIFN0cmluZ3MgbWF5IGJlIGNvbmNhdGVuYXRlZCB1c2luZyB0aGUgJysnIG9wZXJhdG9yLgorCitGb3IgZXhhbXBsZSwgdGhlIExQQyBzdGF0ZW1lbnRzOgorCitzdHJpbmcgYWNrOworCithY2sgPSBmb28gKyBiYXI7CisKK2FyZSBlcXVpdmFsZW50IHRvIHRoZSBDIHN0YXRlbWVudHM6CisKK2NoYXIgKmFjazsKKworYWNrID0gKGNoYXIgKiltYWxsb2Moc3RybGVuKGZvbykgKyAxKTsKK3N0cmNweShhY2ssZm9vKTsKK2FjayA9IChjaGFyICopcmVhbGxvYyhzdHJsZW4oYWNrKSArIHN0cmxlbihiYXIpICsgMSk7CitzdHJjYXQoYWNrLGJhcik7CisKK05vdGU6IGFja1tpXSBtYXkgbm90IGFwcGVhciBhcyBhbiBsdmFsdWUgKGkuZS4gYWNrW2ldID0gJ2EnOyB3aWxsIG5vdAord29yayBhcyBleHBlY3RlZCkuCisKK0xQQyBpcyBhbiBpbnRlcnByZXRlZCBsYW5ndWFnZSAoaG93ZXZlciBpdCBpcyBjb21waWxlZCBpbnRvIGFuIGludGVybmFsCitjb21wYWN0IHRva2VuaXplZCBmb3JtIGJlZm9yZSBiZWluZyBpbnRlcnByZXRlZCkuCisKK0xQQyBoYXMgbm8gc3RydWN0dXJlcyBvciB1bmlvbnMuICBJbiBmYWN0LCB0aGUgLT4gb3BlcmF0b3IgaXMgdXNlZCB0bworaW5kaWNhdGUgYSBjYWxsIHRvIGFub3RoZXIgb2JqZWN0LiAgVGhlIG1hcHBpbmcgZGF0YXR5cGUgY2FuIHNlcnZlCithcyBhbiBlZmZlY3RpdmUgc3Vic3RpdHV0ZSBmb3Igc3RydWN0dXJlcyBpbiBzb21lIHNpdHVhdGlvbnMuCisKK3NzY2FuZiBkb2VzIG5vdCB3b3JrIGluIHRoZSBzYW1lIHdheSBhcyBpbiBDLiAgYXJndW1lbnRzIHRvIHNzY2FuZiBuZWVkIG5vdAorYmUgcG9pbnRlcnMgKHNpbmNlIExQQyBkb2VzIG5vdCBoYXZlIHRoZSBleHBsaWNpdCBwb2ludGVyIGRhdGEgdHlwZSkuICBBbHNvLAorc3NjYW5mKGFyZywiJXMgJXMiLHN0cjEsc3RyMikgZG9lcyBub3Qgb3BlcmF0ZSBhcyB0aGUgQyBwcm9ncmFtbWVyIHdvdWxkCitleHBlY3QuICBJbiBDLCB0aGUgZmlyc3Qgd29yZCBvZiBhcmcgd291bGQgYmUgY29waWVkIGludG8gc3RyMSBhbmQgdGhlCitzZWNvbmQgd29yZCBvZiBhcmcgaW50byBzdHIyLiAgSW4gTFBDLCB0aGUgZmlyc3Qgd29yZCBpcyBjb3BpZWQgaW50byBzdHIxCithbmQgdGhlIF9yZW1haW5kZXJfIG9mIGFyZyBpcyBjb3BpZWQgaW50byBzdHIyLgpkaWZmIC0tZ2l0IGEvZG9jL2NvbmNlcHRzL21haWwgYi9kb2MvY29uY2VwdHMvbWFpbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDg1MDhjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2NvbmNlcHRzL21haWwKQEAgLTAsMCArMSw3MyBAQAorQ09OQ0VQVDoKKwltYWlsCisKKworREVTQ1JJUFRJT046CisJVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIG1haWwgc3lzdGVtIHVzZWQgaW4gTmlnaHRmYWxsLgorCVRoZSBpZGVhIGlzIHRvIG1ha2UgYSBjZW50cmFsIG1haWwgaGFuZGxpbmcgb2JqZWN0IHdoaWNoCisJYWNjZXB0cyBhbmQgZGlzdHJpYnV0ZXMgbWFpbCBiZXR3ZWVuIHVzZXJzLiBNYWlsIGlzIHN0b3JlZCBpbgorCXRoZSAvbWFpbCBkaXJlY3RvcnkuIHNhdmVfb2JqZWN0IGlzIHVzZWQgdG8gc2F2ZSBtYWlsCisJaW5mb3JtYXRpb24gaW4gbWFpbCBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeS4gT25seSB0aGUgbWFpbAorCWRlbW9uIG9iamVjdCBhbmQgdGhlIG93bmVyIG9mIHRoZSBtYWlsIGZpbGUgY2FuIGFjY2VzcyBpdC4KKworCUEgbnVtYmVyIG9mIG1haWwgcmVhZGVycyB3aWxsIHByb2JhYmx5IGF2YWlsYWJsZSB3aGljaCBhY2Nlc3MKKwl0aGUgbWFpbCBmaWxlcy4gQSB0eXBpY2FsIG1haWwgdXNlciBhZ2VudCBoYXMgY29tbWFuZHMgdG8KKwlyZWFkIG1haWwgY29udGFpbmVkIGluIHRoZSB1c2VyJ3MgbWFpbCBmaWxlLCB0byByZXBseSB0bworCW1lc3NhZ2VzLCB0byBmb3J3YXJkLCBkZWxldGUsIHNhdmUgdGhlbS4gQSBmb2xkZXIgc3RydWN0dXJlCisJY2FuIGJlIGltcGxlbWVudGVkLiBPdXRnb2luZyBtYWlsIGlzIGdpdmVuIHRvIHRoZSBtYWlsIGRlbW9uCisJb2JqZWN0IGJ5IHRoZSB1c2VyIGFnZW50IGZvciBkaXN0cmlidXRpb24uIFRoZSBtYWlscmVhZGVyCisJc2hvdWxkIGltcGxlbWVudCBtdWx0aXBsZSByZWNpcGllbnRzIC0gY2FyYm9uIGNvcHksIGNjIGFuZAorCWJsaW5kIGNhcmJvbiBjb3B5LCBiY2MuIENhcmJvbiBjb3B5IG1lYW5zIGFsdGVybmF0ZSByZWNpcGllbnRzCisJdG8gd2hpY2ggdGhlIG1lc3NhZ2Ugc2hvdWxkIGJlIHNlbnQuIEJsaW5kIGNhcmJvbiBjb3B5IGlzIHRoZQorCXNhbWUsIGJ1dCB0aGUgcmVjaXBpZW50cyB3b24ndCBiZSBsaXN0ZWQgaW4gdGhlIHJlY2VpdmVkCisJbWVzc2FnZS4KKworCVNhdmUgZmlsZSBmb3JtYXQgKHNvcnQgb2YgZm9ybWFsIG5vdGF0aW9uKToKKworCW1peGVkICpmb2xkZXJzID0gKHsKKwkgICAoeyBzdHJpbmcgbmFtZTE7IHN0cmluZyBuYW1lMjsgLi4uIHN0cmluZyBuYW1lTjsgfSkKKwkgICAoeyBtaXhlZCAqbXNnczE7IG1peGVkICptc2dzMjsgLi4uIG1peGVkICptc2dzTjsgfSkKKwl9KQorCisJVGhlIGFycmF5IHZhcmlhYmxlIDxmb2xkZXJzPiBjb250YWlucyBhIG51bWJlciBvZiBmb2xkZXIKKwlzdHJ1Y3R1cmVzIGNvbnRhaW5pbmcgdGhlIGFjdHVhbCBtZXNzYWdlcy4gVGhlcmUgYXJlIHNwZWNpYWwKKwlmb2xkZXJzIHdoaWNoIGFyZSByZXNlcnZlZDogbWFpbCwgbmV3bWFpbC4gTmV3IG1haWwgd2lsbAorCWJlIGRlbGl2ZXJlZCBpbnRvIHRoZSBuZXdtYWlsIGZvbGRlci4gVGhpcyBpcyB0aGUgb25seSBoYXJkCisJY29kZWQgcmVxdWlyZW1lbnQgKHRoZSBtYWlsIGRlbW9uIHdpbGwgc2ltcGx5IGRlcG9zaXQgbmV3CisJbWFpbCB0aGVyZSkuIFRoZSBmb2xkZXIgbmFtZSAnbWFpbCcgc2hvdWxkIGJlIHVzZWQgZm9yIHJlYWQKKwltYWlsLiBPdGhlciBmb2xkZXJzIGNhbiBiZSBkeW5hbWljYWxseSBjcmVhdGVkIGJ5IHRoZSB1c2VyCisJYWdlbnQuCisKKwlFYWNoIG1zZ3MgZmllbGQgaXMgYW4gYXJyYXkgb2YgbWVzc2FnZXM6CisKKwltaXhlZCAqbXNncyA9ICh7IG1peGVkICptZXNzYWdlMTsgLi4uIG1peGVkICptZXNzYWdlTSB9KQorCisJQSBtZXNzYWdlIGlzIHJlcHJlc2VudGVkIGFzIGFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyBmaWVsZHM6CisKKwltaXhlZCAqbWVzc2FnZSA9ICh7CisJICAgc3RyaW5nIGZyb207CisJICAgc3RyaW5nIHNlbmRlcjsKKwkgICBzdHJpbmcgcmVjaXBpZW50OworCSAgIHN0cmluZyAqY2M7CisJICAgc3RyaW5nICpiY2M7CisJICAgc3RyaW5nIHN1YmplY3Q7CisJICAgc3RyaW5nIGRhdGU7CisJICAgc3RyaW5nIGlkOworCSAgIHN0cmluZyBib2R5OworCX0pCisKKwlUaGUgbWFpbGVyIGRlbW9uICgvc2VjdXJlL21haWxlciwgb3IgL29iai9tYWlsZXIpIHByb3ZpZGVzCisJdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6CisKKwlEZWxpdmVyTWFpbChtaXhlZCAqbWVzc2FnZSkKKwkgIEhhbmQgYSBtYWlsIG1lc3NhZ2Ugb3ZlciB0byB0aGUgbWFpbGVyIGRlbW9uLiBUaGUgbWFpbGVyCisJICBkZW1vbiBleHRyYWN0cyByZWNpcGllbnRzIGZyb20gdGhlIHJlY2lwaWVudCwgY2MgYW5kIGJjYworCSAgZmllbGRzIGFuZCByZW1vdmVzIHRoZSBiY2MgaW5mb3JtYXRpb24uIEl0IHRoZW4gZGVwb3NpdHMKKwkgIHRoZSBtZXNzYWdlIHRvIHRoZSBtYWlsIGZpbGVzIG9mIGFsbCByZWNpcGllbnRzLiBBIHZhbGlkCisJICBtZXNzYWdlIGlzIHNob3duIGFib3ZlLgorCisJaW50IEZpbmdlck1haWwoc3RyaW5nIHVzZXIpCisJICBHaXZlcyB0aGUgbnVtYmVyIG9mIHVucmVhZCBtZXNzYWdlcyBhIHVzZXIgaGFzLgorCisKK1NFRSBBTFNPOgpkaWZmIC0tZ2l0IGEvZG9jL2NvbmNlcHRzL21jY3AgYi9kb2MvY29uY2VwdHMvbWNjcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2UzMWZiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2NvbmNlcHRzL21jY3AKQEAgLTAsMCArMSwxMDAgQEAKK0NPTkNFUFQKKyAgICAgICAgbWNjcCAtIFRoZSBNdWQgQ2xpZW50IENvbXByZXNzaW9uIFByb3RvY29sCisKK0RFU0NSSVBUSU9OCisgICAgICAgIEluZm9ybWF0aW9ucyBhbmQgY29kZSB0YWtlbiBmcm9tIHRoZSBNQ0NQIEhvbWVwYWdlCisgICAgICAgIGh0dHA6Ly93d3cucmFuZG9tbHkub3JnL3Byb2plY3RzL01DQ1AvCisKKyAgICAgICAgTUNDUCBpcyBpbXBsZW1lbnRlZCBhcyBhIFRlbG5ldCBvcHRpb24gW1JGQzg1NCwgUkZDODU1XS4gVGhlIHNlcnZlcgorICAgICAgICBhbmQgY2xpZW50IG5lZ290aWF0ZSB0aGUgdXNlIG9mIE1DQ1AgYXMgdGhleSB3b3VsZCBhbnkgb3RoZXIgdGVsbmV0CisgICAgICAgIG9wdGlvbi4gT25jZSBhZ3JlZW1lbnQgaGFzIGJlZW4gcmVhY2hlZCBvbiB0aGUgdXNlIG9mIHRoZSBvcHRpb24sCisgICAgICAgIG9wdGlvbiBzdWJuZWdvdGlhdGlvbiBpcyB1c2VkIHRvIGRldGVybWluZSBhY2NlcHRhYmxlIGNvbXByZXNzaW9uCisgICAgICAgIG1ldGhvZHMgdG8gdXNlLCBhbmQgdG8gaW5kaWNhdGUgdGhlIHN0YXJ0IG9mIGEgY29tcHJlc3NlZCBkYXRhIHN0cmVhbS4gCisKKyAgICAgICAgSWYgdGhlIGRyaXZlciBpcyBjb21waWxlZCB3aXRoIE1DQ1AgU3VwcG9ydCB0aGVyZSBpcyBhCisgICAgICAgIGRlZmluZSBfX01DQ1BfXy4KKworICAgICAgICBUaGUgZHJpdmVyIGN1cnJlbnRseSBzdXBwb3J0cyBib3RoIHZlcnNpb25zIG9mIG1jY3AuIElmIHlvdXIgbXVkCisgICAgICAgIGhhcyBhIEhfTk9FQ0hPIGhvb2sgeW91IGhhdmUgdG8gZmluZCBvdXQgaWYgdGhlIGNsaWVudCBzdXBwb3J0cworICAgICAgICBtY2NwLiBXaXRob3V0IHRoaXMgaG9vayB5b3Ugc3RpbGwgaGF2ZSB0byBzdGFydCBuZW9nb3RpYXRpb24uCisKKyAgICAgICAgQWxsIHN1Yi1uZWdvdGlhdGlvbiBpcyBkb25lIGJ5IHRoZSBlZnVucyBzdGFydF9tY2NwX2NvbXByZXNzKCkgYW5kCisgICAgICAgIGVuZF9tY2NwX2NvbXByZXNzKCkgd2hldGhlciB5b3UgaGF2ZSB0aGlzIGhvb2sgb3Igbm90LgorCisgICAgICAgIE5vdGljZTogd2hlbiB0aGUgY2xpZW50IHVzZXMgY29tcHJlc3Npb25zIGFsbCBiaW5hcnlfbWVzc2FnZSBjYWxscworICAgICAgICAgICAgICAgIGFyZSBleGVjdXRlZCB3aXRoIGZsYWc9My4gVGhpcyBpcyBiZWNhdXNlIHdyaXRpbmcgdG8gdGhlCisgICAgICAgICAgICAgICAgc29ja2V0IHdvdWxkIGRpc3R1cmIgemxpYiBzdHJlYW0uCisgICAgICAgIAorICAgICAgICBtY2NwLWVmdW5zOgorCisgICAgICAgICAgc3RhcnRfbWNjcF9jb21wcmVzcyhpbnQgdGVsb3B0KSAob25seSBuZWVkZWQgd2l0aCBIX05PRUNITykKKyAgICAgICAgICBlbmRfbWNjcF9jb21wcmVzcyhpbnQgdGVsb3B0KSAgIChvbmx5IG5lZWRlZCB3aXRoIEhfTk9FQ0hPKQorICAgICAgICAgIHF1ZXJ5X21jY3Aob2JqZWN0IHBsYXllcikKKyAgICAgICAgICBxdWVyeV9tY2NwX3N0YXRzKG9iamVjdCBwbGF5ZXIpCisKKyAgICAgICBJbml0aWF0aW5nIE1DQ1Agd2l0aG91dCBIX05PRUNITyBob29rOgorCisgICAgICAgICAgaWYoIXF1ZXJ5X21jY3AoKSl7CisgICAgICAgICAgICBiaW5hcnlfbWVzc2FnZSgoeyBJQUMsIFdJTEwsIFRFTE9QVF9DT01QUkVTUzIgfSksMSkKKyAgICAgICAgICAgIGJpbmFyeV9tZXNzYWdlKCh7IElBQywgV0lMTCwgVEVMT1BUX0NPTVBSRVNTIH0pLDEpCisgICAgICAgICAgfQorCisgICAgICAgICAgdGhlIGRyaXZlciB3aWxsIHBhcnNlIHRoZSBjbGllbnRzIGFuc3dlcnMgYW5kIHN0YXJ0IGNvbXByZXNzaW9uLgorICAgICAgICAgIChUaGUgY29ubmVjdGlvbiBtaWdodCBhbHJlYWR5IGJlIGNvbXByZXNzZWQsIGJlY2F1c2UgYWx0aG91Z2ggdGhlCisgICAgICAgICAgIGRvY3VtZW50YXRpb24gc2F5cyBjbGllbnRzIHNob3VsZCBub3QgbmVnb3RpYXRlIGZyb20gdGhlbXNlbGZlcywKKyAgICAgICAgICAgem11ZCBlLmcuIGRvZXMuKQorCisgICAgICAgICAgWW91IGNhbiBzdGFydCBhbmQgc3RvcCBjb21wcmVzc2lvbiBtYW51YWxseSBieSBlZnVucworICAgICAgICAgIHdoZW4geW91IGFyZSBzdXJlIGNsaWVudCBzdXBwb3J0cyBjb21wcmVzc2lvbiA6KQorCisKKyAgICAgICBJbml0aWF0aW5nIE1DQ1AgY29tcHJlc3Npb24gd2l0aCBIX05PRUNITyBob29rOgorCisgICAgICAgICAgSWYgeW91ciBtdWRsaWIgdXNlcyB0aGUgSF9OT0VDSE8gZHJpdmVyLWhvb2sgeW91IGRlY2lkZWQgdG8gZG8KKyAgICAgICAgICBhbGwgdGhlIG5lZ290aWF0aW9uIGJ5IHlvdXJzZWxmOgorCisgICAgICAgICAgU2VydmVyIENvbW1hbmRzCisgICAgICAgICAgSUFDIFdJTEwgQ09NUFJFU1MgaW5kaWNhdGVzIHRoZSBzZW5kZXIgc3VwcG9ydHMgdmVyc2lvbiAxIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sLCBhbmQgaXMgd2lsbGluZyB0byBjb21wcmVzcyBkYXRhIGl0IHNlbmRzLiAKKworICAgICAgICAgIElBQyBXSUxMIENPTVBSRVNTMiBpbmRpY2F0ZXMgdGhlIHNlbmRlciBzdXBwb3J0cyB2ZXJzaW9uIDIsIGFuZCBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsaW5nIHRvIGNvbXByZXNzIGRhdGEgaXQgc2VuZHMuIAorCisgICAgICAgICAgSUFDIFdPTlQgQ09NUFJFU1MgaW5kaWNhdGVzIHRoZSBzZW5kZXIgcmVmdXNlcyB0byBjb21wcmVzcyBkYXRhIHVzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiAxLiAKKworICAgICAgICAgIElBQyBXT05UIENPTVBSRVNTMiBpbmRpY2F0ZXMgdGhlIHNlbmRlciByZWZ1c2VzIHRvIGNvbXByZXNzIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgdmVyc2lvbiAyLiAKKworICAgICAgICAgIENsaWVudCBDb21tYW5kcworICAgICAgICAgIElBQyBETyBDT01QUkVTUyBpbmRpY2F0ZXMgdGhlIHNlbmRlciBzdXBwb3J0cyB2ZXJzaW9uIDEgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sLCBhbmQgaXMgd2lsbGluZyB0byBkZWNvbXByZXNzIGRhdGEgcmVjZWl2ZWQuIAorCisgICAgICAgICAgSUFDIERPIENPTVBSRVNTMiBpbmRpY2F0ZXMgdGhlIHNlbmRlciBzdXBwb3J0cyB2ZXJzaW9uIDIgb3IgYWJvdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgaXMgd2lsbGluZyB0byBkZWNvbXByZXNzIGRhdGEgcmVjZWl2ZWQuIAorCisgICAgICAgICAgSUFDIERPTlQgQ09NUFJFU1MgaW5kaWNhdGVzIHRoZSBzZW5kZXIgcmVmdXNlcyB0byBzdXBwb3J0IHZlcnNpb24gMS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBjb21wcmVzc2lvbiB3YXMgcHJldmlvdXNseSBuZWdvdGlhdGVkIGFuZCBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRseSBiZWluZyB1c2VkLCB0aGUgc2VydmVyIHNob3VsZCB0ZXJtaW5hdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbi4gCisKKyAgICAgICAgICBJQUMgRE9OVCBDT01QUkVTUzIgaW5kaWNhdGVzIHRoZSBzZW5kZXIgcmVmdXNlcyB0byBzdXBwb3J0IHZlcnNpb24gMi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgY29tcHJlc3Npb24gd2FzIHByZXZpb3VzbHkgbmVnb3RpYXRlZCBhbmQgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudGx5IGJlaW5nIHVzZWQsIHRoZSBzZXJ2ZXIgc2hvdWxkIHRlcm1pbmF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbgorCisgICAgICAgICAgQWZ0ZXIgeW91IGZvdW5kIG91dCB3aGV0aGVyIHRoZSBjbGllbnQgc3VwcG9ydHMgbWNjcCBvciBub3QgeW91IGNhbgorICAgICAgICAgIHN0YXJ0IGNvbXByZXNzaW9uIHdpdGggc3RhcnRfbWNjcF9jb21wcmVzcyhURUxPUFRfQ09NUFJFU1MyKSBvcgorICAgICAgICAgIHN0YXJ0X21jY3BfY29tcHJlc3MoVEVMT1BUX0NPTVBSRVNTKS4gKCB5b3UgY291bGQgc3RhcnQgaXQgd2l0aG91dAorICAgICAgICAgIGNoZWNraW5nIGJ1dCBzb21lIHBsYXllcnMgd291bGQgcHJvdGVzdCA6KSApCisKK0FVVEhPUgorICAgICAgICBCYXN0aWFuIEhveWVyIChkYWZpcmVAZmYubXVkLmRlKSAoc29tZSB0ZXh0IHRha2VuIGZyb20gcHJvamVjdCBwYWdlKQorCitISVNUT1JZCisgICAgICAgIEFkZGVkIGluIExETXVkIDMuMy40NDcsIGJhY2twb3J0ZWQgdG8gTERNdWQgMy4yLjEwLgorCitTRUUgQUxTTworICAgICAgICBzdGFydF9tY2NwX2NvbXByZXNzKEUpLCBlbmRfbWNjcF9jb21wcmVzcyhFKSwgcXVlcnlfbWNjcChFKSwKKyAgICAgICAgcXVlcnlfbWNjcF9zdGF0cyhvYmplY3QgcGxheWVyKQorCmRpZmYgLS1naXQgYS9kb2MvY29uY2VwdHMvbWVtb3J5IGIvZG9jL2NvbmNlcHRzL21lbW9yeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTI0ZWIzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2NvbmNlcHRzL21lbW9yeQpAQCAtMCwwICsxLDU2IEBACitDT05DRVBUCisgICAgICAgIG1lbW9yeQorICAgICAgICBzd2FwcGluZworCitERVNDUklQVElPTgorCisgICAgICAgIFRPRE86IFRoaXMgaXMgb3V0IG9mIGRhdGUuIEFsc28gZG9jdW1lbnQgdGhlIHJlbGF0aW9uIHdpdGggcmVzZXQKKworICAgICAgICAoQ29sbGVjdGVkIGZyb20gdGhlIENoYW5nZWxvZ3Mgb2YgdGhlIGRyaXZlciBzb3VyY2UpCisKKyAgICAgICAgVGhlIHN3YXBwaW5nIGFsZ29yaXRobSBoYXMgYmVlbiBjaGFuZ2VkLiBBIHRlc3QgaXMgZG9uZSBmb3IKKyAgICAgICAgZXZlcnkgb2JqZWN0LCBjb21wYXJpbmcgdG8gYSB0aW1lIHN0YW1wLiBJZiB0aGUgb2JqZWN0IGhhc24ndAorICAgICAgICBiZWVuIHRvdWNoZWQgZm9yIGEgd2hpbGUsIGl0IGNvdWxkIGJlIHN1YmplY3QgZm9yIHN3YXBwaW5nLgorICAgICAgICBIZXJlIGNvbWVzIHRoZSBuZXcgdGhpbmc6IHRoZSBmdW5jdGlvbiAnY2xlYW5fdXAoKScgd2lsbCBiZQorICAgICAgICBjYWxsZWQgaW4gdGhlIG9iamVjdC4gSWYgdGhlIG9iamVjdCBzdGlsbCByZW1haW5zLCB0aGUgb2xkCisgICAgICAgIHN3YXBwaW5nIGFsZ29yaXRobSB3aWxsIGNvbnRpbnVlLiBUaGF0IG1lYW5zIHRoYXQgb2JqZWN0cyB0aGF0CisgICAgICAgIHdvdWxkIG5ldmVyIGJlIHN1YmplY3QgdG8gc3dhcHBpbmcgKGNsb25lZCBvYmplY3RzKSBub3cgaGF2ZSBhCisgICAgICAgIGNoYW5jZSB0byBzZWxmLWRlc3RydWN0LiBJdCBhbHNvIG1lYW5zIHRoYXQgcm9vbXMgdGhhdAorICAgICAgICBjb250YWlucyBubyBpbXBvcnRhbnQgZGF0YSBjYW4gc2VsZi1kZXN0cnVjdC4gU2VsZi1kZXN0cnVjdGlvbgorICAgICAgICBzYXZlcyBtb3JlIG1lbW9yeSB0aGFuIHN3YXBwaW5nLCBhcyBzd2FwcGluZyBvbmx5IGZyZWVzIHRoZQorICAgICAgICBwcm9ncmFtIGNvZGUsIHdoaWxlIHNlbGYtZGVzdHJ1Y3Rpb24gYWxzbyBmcmVlcyB0aGUgaW50ZXJuYWwKKyAgICAgICAgb2JqZWN0IHJlcHJlc2VudGF0aW9uLgorCisgICAgICAgIFRoZSBjYWxsIG9mIGNsZWFuX3VwKCkgaGFzIGJlZW4gbW9kaWZpZWQuIFRoZXJlIGlzIGEgY29uc3RhbnQKKyAgICAgICAgaW4gY29uZmlnLmggdGhhdCBkZWZpbmVzIGhvdyBsb25nIHRpbWUgdW50aWwgY2xlYW5fdXAgaXMKKyAgICAgICAgY2FsbGVkIGluIGFuIG9iamVjdC4gVGhpcyBjYWxsIGlzIGluZGVwZW5kZW50IG9mIHJlc2V0KCkgYW5kCisgICAgICAgIHN3YXBwaW5nLiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHRoZSBzd2FwcGluZyB0aW1lIGlzCisgICAgICAgIHNvbWV0aGluZyBzaG9ydCwgbGlrZSAxMCBtaW51dGVzIHRvIDMwIG1pbnV0ZXMsIHdoaWxlIHRoZSB0aW1lCisgICAgICAgIHRvIGNsZWFuX3VwIGlzIGxvbmdlci4KKworICAgICAgICBGaXhlZCBzZXZlcmFsIGJ1Z3MgaW4gdGhlIHN3YXAvcmVzZXQvY2xlYW5fdXAgbG9naWMuCisgICAgICAgIFJlY29tbWVuZGVkIHZhbHVlcyBhcmUgdGhhdCB0aGUgc3dhcCB0aW1lIGlzIHNob3J0IChsZXNzIHRoYW4KKyAgICAgICAgMzAgbWludXRlcyksIGFuZCB0aGF0IHJlc2V0IHRpbWUgaXMgbWVkaXVtIChhcHJveCA2MCBtaW51dGVzKSwKKyAgICAgICAgYW5kIHRoYXQgdGltZSB0byBjbGVhbl91cCBpcyBsb25nIChncmVhdGVyIHRoYW4gMS41aCBob3VycykuCisgICAgICAgIEFueSBmZWVkYmFjayBvZiBob3cgdG8gYmVzdCB0dW5lIHRoZXNlIHZhbHVlcyBhcmUgd2VsY29tZS4gVGhlCisgICAgICAgIGNhbGwgb2YgcmVzZXQgd2lsbCBiZSBkb25lIG9uY2UsIGFuZCBub3QgeWV0IGFnYWluIHVudGlsIHRoZQorICAgICAgICBvYmplY3QgaGFzIGJlZW4gdG91Y2hlZC4gVGhpcyBlbmFibGVzIHJlc2V0J2VkIG9iamVjdHMgdG8gc3RheQorICAgICAgICBzd2FwcGVkIG91dC4gSWYgeW91IGhhdmUgYSBtdWRsaWIgdGhhdCBoYXMgbm8gb2piZWN0cyB0aGF0CisgICAgICAgIGRlZmluZXMgJ2NsZWFuX3VwJywgdGhlbiB5b3UgbWF5IGJldHRlciBkZWZpbmUgdGhpcyB0aW1lIGFzIDAsCisgICAgICAgIHdoaWNoIG1lYW5zIG5ldmVyIGNhbGwgY2xlYW5fdXAgKGFuZCB0aHVzIG5ldmVyIHN3YXAgdGhlCisgICAgICAgIG9iamVjdCBpbiBuZWVkbGVzc2x5KS4gQSB3ZWxsIGltcGxlbWVudGVkIHVzYWdlIG9mIGNsZWFuX3VwIGlzCisgICAgICAgIGJldHRlciB0aGFuIHRoZSBzd2FwIGFsZ29yaXRobSwgYXMgZXZlbiBjbG9uZWQgb2JqZWN0cyBjYW4gYmUKKyAgICAgICAgY2xlYW5lZCB1cCBhbmQgYSBzZWxmIGRlc3RydWN0aW9uIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4KKyAgICAgICAgc3dhcHBpbmcgKG1lbW9yeSB3aXNlKS4KKworICAgICAgICBDaGFuZ2VkIG1lY2hhbmlzbSBvZiBjYWxsaW5nIGNsZWFuX3VwKCkgc2xpZ2h0bHkuIE9ubHkgb2JqZWN0cworICAgICAgICB0aGF0IGRlZmluZXMgdGhlIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkLiBBbmQsIG9ubHkgY2xlYW5fdXAoKQorICAgICAgICB0aGF0IHJldHVybnMgbm9uLXplcm8gd2lsbCBiZSBjYWxsZWQgYWdhaW4uIFRoaXMgd2lsbCBtaW5pbWl6ZQorICAgICAgICBjYWxscyBvZiBjbGVhbl91cCgpLCB3aGlsZSBzdGlsbCBjb3N0IHZlcnkgbGl0dGUgdG8gbWFpbnRhaW4uCisKKyAgICAgICAgY2xlYW5fdXAoKSBub3cgZ2V0cyBhIGZsYWcgYXMgYXJndW1lbnQsIHdoaWNoIHdpbGwgYmUgbm9uLXplcm8KKyAgICAgICAgaWYgdGhlIHRoZSBwcm9ncmFtIG9mIHRoaXMgb2JqZWN0IGlzIHVzZWQgZm9yIGluaGVyaXRhbmNlIGJ5CisgICAgICAgIG90aGVyIG9iamVjdHMuCisKK1NFRSBBTFNPCisgICAgICAgIGNsZWFuX3VwKEEpLCBzbG93X3NodXRfZG93bihNKSwgcXVvdGFfZGVtb24oTSksIG1hbGxvYyhEKQpkaWZmIC0tZ2l0IGEvZG9jL2NvbmNlcHRzL215c3FsIGIvZG9jL2NvbmNlcHRzL215c3FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYjZkZWUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvY29uY2VwdHMvbXlzcWwKQEAgLTAsMCArMSwyMDUgQEAKK0NPTkNFUFQKKyAgICAgICAgICAgIG15c3FsIC0gbXlTUUwgc3VwcG9ydAorCitERVNDUklQVElPTgorICAgICAgICBPbiBob3N0cyB3aXRoIHRoZSBteVNRTCBwYWNrYWdlIGluc3RhbGxlZCwgdGhlIGRyaXZlciBjYW4gYmUKKyAgICAgICAgY29uZmlndXJlZCB0byBpbnRlcmZhY2Ugd2l0aCB0aGUgbXlTUUwgZGF0YWJhc2UuIElmIHRoYXQgaXMgZG9uZSwKKyAgICAgICAgdGhlIGRyaXZlciBkZWZpbmVzIHRoZSBtYWNybyBfX01ZU1FMX18gZm9yIExQQyBwcm9ncmFtcyBhbmQKKyAgICAgICAgYWN0aXZhdGVzIGEgbnVtYmVyIG9mIGVmdW5zLgorCisgICAgICAgIC0tIENvbmZpZ3VyYXRpb24gLS0KKworICAgICAgICBDcmVhdGUgYSBkZWRpY2F0ZWQgdXNlciBpbiB0aGUgbXlTUUwgZGF0YWJhc2UgZm9yIHRoZSBkcml2ZXIuCisgICAgICAgIEVudGVyIHRoaXMgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGluIHRoZSBmaWxlIHBrZy1teXNxbC5jLCBmdW5jdGlvbgorICAgICAgICBteXNxbF9yZWFsX2Nvbm5lY3QoKSwgYW5kIGNvbXBpbGUgdGhlIGRyaXZlciAodGhlIHVzZXJuYW1lIGFuZAorICAgICAgICBwYXNzd29yZCBhcmUgYnVpbHQgaW50byB0aGUgZHJpdmVyIGZvciBzZWN1cml0eSByZWFzb25zKS4KKyAgICAgICAgSWYgeW91IGNob3NlIHRvIG5vdCBjcmVhdGUgZWl0aGVyIGEgdXNlcm5hbWUgYW5kL29yIGEgcGFzc3dvcmQsCisgICAgICAgIGxlYXZlIHRoZSBjb3JyZXNwb25kaW5nIGVudHJ5IGF0IDAuCisKKyAgICAgICAgVXNlIG15c3FsYWRtaW4gdG8gY3JlYXRlIGFueSBkYXRhYmFzZXMgeW91IHdhbnQgdG8gcHJvdmlkZSAtIHRoZQorICAgICAgICBuYW1lcyBhcmUgbGF0ZXIgdXNlZCBpbiB0aGUgZWZ1biBkYl9jb25uZWN0KCkgdG8gY29ubmVjdCB0bworICAgICAgICB0aGUgZGF0YWJhc2VzLgorCisKKyAgICAgICAgLS0gVXNhZ2UgLS0KKworICAgICAgICBUaGUgaWRlYSBiZWhpbmQgU1FMLXN1cHBvcnQgaXMgdGhhdCB5b3UgY2FuIHN3YXAgbGFyZ2UgYW1vdW50cyBvZgorICAgICAgICBkYXRhIGludG8gYSBkYXRhYmFzZSB3aGVyZSBpdCBjYW4gYmUgYWNjZXNzZWQgdmVyeSBlYXNpbHkuCisgICAgICAgIEFzIG15U1FMICJsaW1pdHMiIHRoZSBudW1iZXIgb2YgY29ubmVjdGlvbnMgdG8gMTAwIGFuZCBhcyBldmVyeQorICAgICAgICBjb25uZWN0aW9uIHRvIHRoZSBteVNRTC1zZXJ2ZXIgdGFrZXMgdGltZSwgeW91IHNob3VsZCB1c2UKKyAgICAgICAgZGF0YWJhc2Ugc2VydmVyb2JqZWN0cyBpbiB5b3VyIE1VRCB3aGljaCBjb25zdGFudGx5IGtlZXAgdGhlCisgICAgICAgIGNvbm5lY3Rpb24gdG8gdGhlIG15U1FMLXNlcnZlci4KKworICAgICAgICBUbyBjb25uZWN0IHRvIHlvdXIgbXlTUUwtc2VydmVyLCB1c2UgdGhlIGVmdW4gZGJfY29ubmVjdCgpLiBJdAorICAgICAgICB0YWtlcyBvbmx5IG9uZSBhcmd1bWVudCB3aGljaCBpcyB0aGUgbmFtZSBvZiB0aGUgZGF0YWJhc2UgKHdoaWNoCisgICAgICAgIG11c3QgZXhpc3QpLiAgVGhlIHJldHVybi12YWx1ZSBvZiBkYl9jb25uZWN0KCkgaXMgYW4gaW50ZWdlcgorICAgICAgICByZXByZXNlbnRpbmcgdGhlIHVuaXF1ZSBoYW5kbGUgdG8gdGhlIGRhdGFiYXNlIHdpdGggd2hpY2ggeW91IHdpbGwKKyAgICAgICAgaWRlbnRpZnkgeW91ciBjb25uZWN0aW9uIGxhdGVyLgorCisgICAgICAgIFRvIHNlbmQgb3IgcmV0cmlldmUgZGF0YSBmcm9tIHRoaXMgY29ubmVjdGlvbiwgdXNlIGRiX2V4ZWMoKS4gVGhlCisgICAgICAgIGZpcnN0IHBhcmFtZXRlciBmb3IgYWxsIGVmdW5zIGRlYWxpbmcgd2l0aCBhbiBvcGVuIGNvbm5lY3Rpb24gaXMKKyAgICAgICAgYWx3YXlzIHRoZSBoYW5kbGUgYW5kIHNvIGlzIHRoZSBmaXJzdCBhcmd1bWVudCB0aGUgaGFuZGxlIGFuZCB0aGUKKyAgICAgICAgc2Vjb25kIG9uZSB0aGUgY29tbWFuZCB5b3Ugd2FudCB0byBpc3N1ZS4gVGhlIHJldHVybi12YWx1ZSBpcworICAgICAgICBlaXRoZXIgMCBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgaW4geW91ciBjb21tYW5kICh0aGlzIGNhbiBoYXZlCisgICAgICAgIHZhcmlvdXMgcmVhc29ucyksIG90aGVyd2lzZSB5b3VyIGhhbmRsZSBpcyByZXR1cm5lZCBhZ2Fpbi4gQSB0eXBpY2FsCisgICAgICAgIFNRTC1zdGF0ZW1lbnQgdG8gcmV0cmlldmUgZGF0YSB3b3VsZCBiZSBsaWtlIHRoaXM6CisKKyAgICAgICAgICAgICAgICBzZWxlY3QgYWxpYXNlcy5jb21tYW5kIGZyb20gYWxpYXNlcyB3aGVyZSAobmFtZSA9ICdtYXJpbycgQU5ECisgICAgICAgICAgICAgICAgICBhbGlhcyByZWdleHAgJ2wuKicpCisKKyAgICAgICAgQXMgeW91IGtub3csIG15U1FMIGFjY2VwdHMgZWl0aGVyICIgb3IgJyB0byBjbGFzc2lmeSBzdHJpbmdzIGZvcgorICAgICAgICBwYXJhbWV0ZXJzLiAgTW9zdCBsaWtlbHksIHlvdSB3aWxsIHBhc3MgdmFyaWFibGVzIGFuZCBkb24ndCBrbm93CisgICAgICAgIHdoZXRoZXIgdGhleSBjb250YWluIG9uZSBvciBtb3JlIG9mIHRoZXNlIGtleS1jaGFycyAob3IgZXZlbiBvdGhlcgorICAgICAgICBjaGFycyB0aGF0IG5lZWQgdG8gYmUgY29udmVydGVkKS4gbXlTUUwgcHJvdmlkZXMgYSBmdW5jdGlvbiBmb3IKKyAgICAgICAgY29udmVydGluZyBqdXN0IGFueSBzdHJpbmcgaW50byBhbiBhY2NlcHRhYmxlIGFyZ3VtZW50IGFuZCB0aGlzIGlzCisgICAgICAgIGltcGxlbWVudGVkIGluIGRiX2NvbnZfc3RyaW5nKCkuCisKKyAgICAgICAgU28gdGhlIGFib3ZlIGV4YW1wbGUgd2l0aCB2YXJpYWJsZXMgbG9va3MgbGlrZSB0aGlzOgorCisgICAgICAgICAgICAgICAgc2VsZWN0IGFsaWFzZXMuY29tbWFuZCBmcm9tIGFsaWFzZXMgd2hlcmUgKG5hbWUgPSciKworICAgICAgICAgICAgICAgICAgZGJfY29udl9zdHJpbmcobmFtZSkrIicgQU5EIGFsaWFzIHJlZ2V4cCAnIisKKyAgICAgICAgICAgICAgICAgIGRiX2NvbnZfc3RyaW5nKG1hc2spKyInKQorCisgICAgICAgIEkgbGVmdCBvdXQgdGhlIGRiX2V4ZWMoKS1zdHVmZiwgbW9yZSBjb21wbGV0ZSBleGFtcGxlcyB3aWxsIGZvbGxvdy4KKworICAgICAgICBBZnRlciB5b3UgaW5pdGlhdGVkIGEgc3RhdGVtZW50IHRoYXQgc2hvdWxkIHJldHVybiByb3dzIGZyb20gdGhlCisgICAgICAgIGRhdGFiYXNlLCB1c2UgZGJfZmV0Y2goKSB0byByZXRyaWV2ZSB0aGUgZGF0YS4gZGJfZmV0Y2goKSByZXR1cm5zCisgICAgICAgIHRoZSBkYXRhIHJvdyBieSByb3cgYW5kIG5vdCBhbGwgYXQgb25jZS4gWW91IG5lZWQgdG8gY2FsbCBpdCB1bnRpbAorICAgICAgICBpdCByZXR1cm5zIDAuIFRISVMgSVMgSU1QT1JUQU5UISBJZiBzdG9wIGNhbGxpbmcgZGJfZmV0Y2goKSBiZWZvcmUKKyAgICAgICAgaXQgcmVhY2hlcyB0aGUgZW5kIG9mIGRhdGEsIHNlcmlvdXMgaW5jb25zaXN0ZW5jaWVzIGNhbiBoYXBwZW4uCisKKyAgICAgICAgSWYgeW91IHVzZWQgYSBERUxFVEUtIG9yIFVQREFURS1zdGF0ZW1lbnQsIHlvdSBjYW5ub3QgY2FsbCBkYl9mZXRjaCgpLAorICAgICAgICBidXQgeW91IG1pZ2h0IGJlIGludGVyZXN0ZWQgaW4gdGhlIG51bWJlciBvZiBkZWxldGVkL2NoYW5nZWQgcm93cworICAgICAgICB3aGljaCBjYW4gYmUgcXVlcmllZCB3aXRoIGRiX2FmZmVjdGVkX3Jvd3MoKS4KKworICAgICAgICBBZnRlciBhbGwgb3BlcmF0aW9ucyBhcmUgZG9uZSBpbiB0aGUgZGF0YWJhc2UsIHlvdSBzaG91bGQgdXNlCisgICAgICAgIGRiX2Nsb3NlKCkgdG8gY2xvc2UgdGhlIGNvbm5lY3Rpb24gYWdhaW4uIElmIHlvdSBhcmUgdXNpbmcgYQorICAgICAgICBkYXRhYmFzZS1zZXJ2ZXItY29uY2VwdCwgcGxhY2UgaXQgaW4gdGhlIHJlbW92ZSgpLWZ1bmN0aW9uLgorCisgICAgICAgIFRoZSBTUUwtZWZ1bnMgaGF2ZSBzb21lIGJ1aWx0LWluIG9wdGltaXphdGlvbi1mZWF0dXJlcyB0byBzcGVlZCB1cAorICAgICAgICBvZnRlbiB1c2VkIGNvbm5lY3Rpb25zLiBUbyBnZXQgYSBsaXN0IG9mIGFsbCBvcGVuIGNvbm5lY3Rpb25zIHRvIHRoZQorICAgICAgICBteVNRTC1zZXJ2ZXIsIHVzZSBkYl9oYW5kbGVzKCkgd2hpY2ggcmV0dXJucyBhbiBhcnJheSBvZiBpbnRlZ2VycworICAgICAgICB3aXRoIGFsbCBvcGVuIGhhbmRsZXMuCisKKworICAgICAgICAtLSBTZWN1cml0eSAtLQorCisgICAgICAgIE1vc3QgU1FMIGVmdW5zICh1bmxlc3MgZXhlY3V0ZSBieSB0aGUgbWFzdGVyIG9yIHRoZSBzaW11bC1lZnVuIG9iamVjdCkKKyAgICAgICAgdHJpZ2dlciBhIHByaXZpbGVnZV92aW9sYXRpb24gKCJteXNxbCIsICI8ZWZ1bl9uYW1lPiIpLiBJZiBhIG1vcmUKKyAgICAgICAgZmluZWdyYWluZWQgY29udHJvbCBpcyBkZXNpcmVkLCBvdmVybG9hZCB0aGUgaW5kaXZpZHVhbCBlZnVucyB3aXRoIGEKKyAgICAgICAgbm9tYXNrIHNpbXVsLWVmdW4uCisKKyAgICAgICAgVGhlIHVucHJpdmlsZWdlZCBlZnVucyBhcmU6CisKKyAgICAgICAgICBkYl9jb252X3N0cmluZygpCisKKworRVhBTVBMRQorICAgICAgICBBIHNpbXBsZSBzZXJ2ZXIgdG8gc3RvcmUgYWxpYXNlcyBjb3VsZCBiZSBpbXBsZW1lbnRlZCBsaWtlIHRoaXM6CisKKyAgICAgICAgLyoKKyAgICAgICAgKiogIENSRUFUSU9OOgorICAgICAgICAqKgorICAgICAgICAqKiAgY3JlYXRlIHRhYmxlIGFsaWFzZXMgKAorICAgICAgICAqKiAgICAgIG5hbWUgdmFyY2hhcigxNSkgbm90IE5VTEwsCisgICAgICAgICoqICAgICAgYWxpYXMgdmFyY2hhcigyMCkgbm90IE5VTEwsCisgICAgICAgICoqICAgICAgY29tbWFuZCB2YXJjaGFyKDI1NSkgbm90IE5VTEwsCisgICAgICAgICoqICAgICAgcHJpbWFyeSBrZXkgKG5hbWUsIGFsaWFzKSk7CisgICAgICAgICovCisKKyAgICAgICAgI2RlZmluZSBEQVRBQkFTRSAibXVkIgorCisgICAgICAgIHByaXZhdGUgaW50IGhhbmRsZTsKKworICAgICAgICBwdWJsaWMgdm9pZCBjcmVhdGUoKQorICAgICAgICB7CisgICAgICAgICAgICBoYW5kbGUgPSBkYl9jb25uZWN0KERBVEFCQVNFKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgcmVtb3ZlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBoYW5kbGUgKQorICAgICAgICAgICAgICAgIGRiX2Nsb3NlKGhhbmRsZSk7CisgICAgICAgICAgICBkZXN0cnVjdChNRSk7CisgICAgICAgICAgICByZXR1cm4gIU1FOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBBZGRBbGlhcyhzdHJpbmcgYWxpYXMsIHN0cmluZyBjb21tYW5kLCBvYmplY3Qgb2IpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggIWhhbmRsZSApCisgICAgICAgICAgICAgICAgaGFuZGxlID0gZGJfY29ubmVjdChEQVRBQkFTRSk7CisgICAgICAgICAgICBpZiAoICFkYl9leGVjKGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImluc2VydCBpbnRvIGFsaWFzZXMgKG5hbWUsIGFsaWFzLCBjb21tYW5kKSB2YWx1ZXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiKCciICsgZ2V0dWlkKG9iKSArICInLCciICsgZGJfY29udl9zdHJpbmcoYWxpYXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiJywnIisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGJfY29udl9zdHJpbmcoY29tbWFuZCkgKyAiJykiKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IFJlbW92ZUFsaWFzKHN0cmluZyBhbGlhcywgb2JqZWN0IG9iKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgcmVzOworCisgICAgICAgICAgICBpZiAoICFoYW5kbGUgKQorICAgICAgICAgICAgICAgIGhhbmRsZSA9IGRiX2Nvbm5lY3QoREFUQUJBU0UpOworICAgICAgICAgICAgcmVzID0gZGJfZXhlYyhoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWxldGUgZnJvbSBhbGlhc2VzIHdoZXJlIChuYW1lID0gJyIrCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdldHVpZChvYikgKyAiJyBBTkQgYWxpYXMgPSAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZGJfY29udl9zdHJpbmcoYWxpYXMpKworICAgICAgICAgICAgICAgICAgICAgICAgICAiJykiKTsKKyAgICAgICAgICAgIGlmICggIXJlcyApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICByZXMgPSBkYl9hZmZlY3RlZF9yb3dzKGhhbmRsZSk7CisgICAgICAgICAgICByZXR1cm4gKHJlcyA+IDApPzE6LTE7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgbWl4ZWQgKlF1ZXJ5QWxpYXNlcyhzdHJpbmcgbWFzaywgb2JqZWN0IG9iKQorICAgICAgICB7CisgICAgICAgICAgICBtaXhlZCAqcmVzdWx0OworICAgICAgICAgICAgc3RyaW5nICp0bXA7CisKKyAgICAgICAgICAgIGlmICggIWhhbmRsZSApCisgICAgICAgICAgICAgICAgaGFuZGxlID0gZGJfY29ubmVjdChEQVRBQkFTRSk7CisgICAgICAgICAgICBpZiAoICFkYl9leGVjKGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdCBhbGlhc2VzLmFsaWFzLCBhbGlhc2VzLmNvbW1hbmQgZnJvbSBhbGlhc2VzIHdoZXJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIihuYW1lID0gJyIgKyBnZXR1aWQob2IpKworICAgICAgICAgICAgICAgICAgICAgICAgICAiJyBBTkQgYWxpYXMgcmVnZXhwICciICsgZGJfY29udl9zdHJpbmcobWFzaykgKyAiJykiKSApCisgICAgICAgICAgICAgICAgcmV0dXJuICh7IH0pOworICAgICAgICAgICAgcmVzdWx0ID0gKHsgfSk7CisgICAgICAgICAgICB3aGlsZSAoIHNpemVvZih0bXAgPSBkYl9mZXRjaChoYW5kbGUpKSApCisgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICh7IHRtcCB9KTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIFF1ZXJ5QWxpYXMoc3RyaW5nIGFsaWFzLCBvYmplY3Qgb2IpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1peGVkICpyZXN1bHQ7CisgICAgICAgICAgICBzdHJpbmcgKnRtcDsKKworICAgICAgICAgICAgaWYgKCAhaGFuZGxlICkKKyAgICAgICAgICAgICAgICBoYW5kbGUgPSBkYl9jb25uZWN0KERBVEFCQVNFKTsKKyAgICAgICAgICAgIGlmICggIWRiX2V4ZWMoaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0IGFsaWFzZXMuY29tbWFuZCBmcm9tIGFsaWFzZXMgd2hlcmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiKG5hbWUgPSAnIiArIGdldHVpZChvYikrCisgICAgICAgICAgICAgICAgICAgICAgICAgICInIEFORCBhbGlhcyA9ICciICsgZGJfY29udl9zdHJpbmcoYWxpYXMpICsgIicpIikgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgcmVzdWx0ID0gKHsgfSk7CisgICAgICAgICAgICB3aGlsZSAoIHNpemVvZih0bXAgPSBkYl9mZXRjaChoYW5kbGUpKSApCisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHRtcDsKKyAgICAgICAgICAgIHJldHVybiBzaXplb2YocmVzdWx0KT9yZXN1bHRbMF06MDsKKyAgICAgICAgfQorCisKK0FVVEhPUgorICAgICAgICBNYXJrIERhbmllbCBSZWlkZWwgYW5kIG90aGVycy4KKworSElTVE9SWQorICAgICAgICBteVNRTCBzdXBwb3J0IHdhcyBhZGRlZCBhcyBhIHBhY2thZ2UgaW4gMy4yLjggYW5kIGJlY2FtZSBhbmQKKyAgICAgICAgaW50ZWdyYWwgZHJpdmVyIHBhcnQgaW4gMy4yLjkuCisgICAgICAgIExETXVkIDMuMi4xMSBhZGRlZCBhIHByaXZpbGVnZV92aW9sYXRpb24oKSBjYWxsIGZvciBlYWNoIGVmdW4uCisKK1NFRSBBTFNPCisgICAgICAgIHBnc3FsKEMpLCBkYl9hZmZlY3RlZF9yb3dzKEUpLCBkYl9jb252X3N0cmluZyhFKSwgZGJfY2xvc2UoRSksCisgICAgICAgIGRiX2Nvbm5lY3QoRSksIGRiX2V4ZWMoRSksIGRiX2ZldGNoKEUpLCBkYl9oYW5kbGVzKEUpLAorICAgICAgICBkYl9pbnNlcnRfaWQoRSksIGRiX2NvbGRlZnMoRSksIGRiX2Vycm9yKEUpLCBwcml2aWxlZ2VfdmlvbGF0aW9uKEEpCmRpZmYgLS1naXQgYS9kb2MvY29uY2VwdHMvbmF0aXZlIGIvZG9jL2NvbmNlcHRzL25hdGl2ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2NmMDA4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2NvbmNlcHRzL25hdGl2ZQpAQCAtMCwwICsxLDE3MCBAQAorQ09OQ0VQVAorICAgICAgICBkcml2ZXIgbW9kZXMgLyBuYXRpdmUgZHJpdmVyIG1vZGUKKworREVTQ1JJUFRJT04KKyAgICAgICAgRHVyaW5nIHRoZSBldm9sdXRpb24gb2YgTFBNdWQgdGhlcmUgaGFzIGJlZW4gYSBoaWF0dXMgYXMgdGhlCisgICAgICAgIG9sZCBkcml2ZXIgYmVjYW1lIHRvbyByZXN0cmljdGluZyBmb3IgdGhlIGRlbWFuZHMgb2YgbW9kZXJuCisgICAgICAgIG11ZHM6IGl0IGRpZCBhIGxvdCBvZiB0aGluZ3MgdGhlIG11ZGxpYiBjb3VsZCBkbyBiZXR0ZXIgb3IKKyAgICAgICAgY29tcGxldGVseSBkaWZmZXJlbnQuIFJlbW92aW5nIHRoZXNlIHRoaW5ncyBmcm9tIHRoZSBkcml2ZXIKKyAgICAgICAgd2VyZW4ndCBhIHByb2JsZW0sIGJ1dCB0byBrZWVwIGNvbXBhdGlibGUgd2l0aCB0aGUgZXhpc3RpbmcKKyAgICAgICAgbXVkbGlicyAobmFtZWx5IHRoZSB3ZWxsLWtub3duIDIuNC41IGxpYiksIGl0IHdhcyBwb3NzaWJsZSB0bworICAgICAgICB1bmRvIHRoZXNlIGNoYW5nZXMuIEZpcnN0IGJ5IHNldHRpbmcgYSBydW50aW1lIG9wdGlvbiwgdGhlbgorICAgICAgICBieSBjb21waWxpbmcgdGhlIGRyaXZlciBlaXRoZXIgaW4gJ2NvbXBhdCcgb3IgaW4gJ25hdGl2ZScgbW9kZS4KKworICAgICAgICBTdGFydGluZyB3aXRoIDMuMi4xLCB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBjb21wYXQgYW5kIG5hdGl2ZQorICAgICAgICBtb2RlIGlzIG1vcmUgYW5kIG1vcmUgdHJhbnNmZXJyZWQgaW50byB0aGUgbXVkbGliLCB3aXRoIHRoZQorICAgICAgICBmdXR1cmUgZ29hbCBvZiBoYXZpbmcgYSBtb2RlbGVzcyBkcml2ZXIuCisKKyAgICAgICAgU3RhcnRpbmcgd2l0aCAzLjIuNywgbmF0aXZlIG1vZGUgbm8gbG9uZ2VyIGV4aXN0cyBhcyBzdWNoLAorICAgICAgICBvbmx5ICdwbGFpbicgKHF1YXNpIGEgc3VwZXJzZXQgb2YgJ25hdGl2ZScgYW5kICdjb21wYXQnKQorICAgICAgICBhbmQgJ2NvbXBhdCcgbW9kZSwgYW5kIHNpbmNlIDMuMi45IHRoZSBtb2RlIHNlbGVjdGlvbiBjYW4gYmUKKyAgICAgICAgbWFkZSB2aWEgY29tbWFuZGxpbmUgb3B0aW9uLgorCisgICAgICAgIFRoZSBtYWluIG1vZGUgb2YgdGhlIGRyaXZlciBpcyBkZXRlcm1pbmVkIGF0IGNvbXBpbGUgdGltZQorICAgICAgICBieSBwcmVwcm9jZXNzb3Igc3ltYm9scyB0byBiZSBkZWZpbmVkL3VuZGVmaW5lZCBpbiBjb25maWcuaDoKKworICAgICAgICAgIENPTVBBVF9NT0RFOiB3aGVuIGRlZmluZWQsIHRoZSBjb21wYXQgbW9kZSBzcGVjaWZpY3MgYXJlIGFjdGl2YXRlZAorICAgICAgICAgICAgICAgICAgICAgICBieSBkZWZhdWx0LgorCisgICAgICAgIEFkZGl0aW9uYWwgbW9kaWZpY2F0aW9ucyBjYW4gYmUgYWNoaWV2ZWQgYnkgdGhlIHNwZWNpZmljYXRpb24KKyAgICAgICAgb2YgY29tbWFuZGxpbmUgYXJndW1lbnRzIChtb3N0IG9mIHRoZW0gaGF2ZSBhIGRlZmF1bHQgc2V0dGluZworICAgICAgICBlbnRyeSBpbiBjb25maWcuaCBhcyB3ZWxsKToKKworICAgICAgICAgIHN0cmljdC1ldWlkczogd2hlbiBhY3RpdmUsIGV1aWQgdXNhZ2UgaXMgZW5mb3JjZWQuCisgICAgICAgICAgY29tcGF0OiAgICAgICB3aGVuIGFjdGl2ZSwgdGhlIGNvbXBhdCBtb2RlIGlzIHVzZWQuCisKKyAgICAgICAgRm9sbG93aW5nIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgY2hhbmdlcyAoZGUpIGFjdGl2YXRlZCBieQorICAgICAgICB0aGVzZSBkZWZpbmVzLiBBIHNob3J0aGFuZCBub3RhdGlvbiBpcyB1c2VkOiAnY29tcGF0JyBtZWFucworICAgICAgICAnaWYgY29tcGF0IG1vZGUgaXMgYWN0aXZlJyBhbmQgJyFjb21wYXQnIG1lYW5zICdpZgorICAgICAgICBjb21wYXQgbW9kZSBpcyBub3QgYWN0aXZlJywgZXRjLgorCisKKyAgICAgICAgUHJlZGVmaW5lZCBQcmVwcm9jZXNzb3IgU3ltYm9scworICAgICAgICAgIElmIGNvbXBhdCwgdGhlIHN5bWJvbHMgQ09NUEFUX0ZMQUcgYW5kIF9fQ09NUEFUX01PREVfXyBhcmUKKyAgICAgICAgICBkZWZpbmVkIGZvciBhbGwgTFBDIHByb2dyYW1zLgorICAgICAgICAgIElmIHN0cmljdC1ldWlkcywgdGhlIHN5bWJvbCBfX1NUUklDVF9FVUlEU19fIGlzIGRlZmluZWQKKyAgICAgICAgICBmb3IgYWxsIExQQyBwcm9ncmFtcy4KKyAgICAgICAgICBGb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLCB0aGUgc3ltYm9sIF9fRVVJRFNfXyBpcyBkZWZpbmVkCisgICAgICAgICAgZm9yIGFsbCBMUEMgcHJvZ3JhbXMgYWxsIHRoZSB0aW1lLgorCisKKyAgICAgICAgUHJlbG9hZGluZyBPZiBPYmplY3RzCisgICAgICAgICAgVGhlIGRyaXZlciBoYXMgdGhlIHBvc3NpYmlsaXR5IHRvIHByZWxvYWQgb2JqZWN0cyBiZWZvcmUgdGhlCisgICAgICAgICAgZ2FtZSBpcyBhY3R1YWxseSBvcGVuZWQgdG8gdGhlIHdvcmxkLiBUaGlzIGlzIGRvbmUgYnkKKyAgICAgICAgICBjYWxsaW5nIG1hc3Rlci0+ZXBpbG9nKCksIHdoaWNoIGhhcyB0byByZXR1cm4gMCBvciBhbiBhcnJheS4KKyAgICAgICAgICBJZiBpdHMgYW4gYXJyYXksIGl0cyBlbGVtZW50cyAoYXMgbG9uZyBhcyB0aGV5IGFyZSBzdHJpbmdzKQorICAgICAgICAgIGFyZSBnaXZlbiBvbmUgYnkgb25lIGFzIGFyZ3VtZW50IHRvIG1hc3Rlci0+cHJlbG9hZCgpIHdoaWNoCisgICAgICAgICAgbWF5IG5vdyBwcmVsb2FkIHRoZSBvYmplY3RzIChvciBkbyBhbnl0aGluZyBlbHNlKS4KKworCisgICAgICAgIEluaXRpYWxpc2F0aW9uIE9mIE9iamVjdHMKKyAgICAgICAgICBJdCBpcyB0YXNrIG9mIHRoZSBtdWRsaWIgKHRocm91Z2ggdGhlIGRyaXZlciBob29rcykgdG8gY2FsbAorICAgICAgICAgIHRoZSBpbml0aWFsaXNhdGlvbiBsZnVucyBpbiBuZXdseSBjcmVhdGVkIG9iamVjdHMuIFRoZQorICAgICAgICAgIGZvbGxvd2luZyB0YWJsZSBzaG93cyB0aGUgdHJhZGl0aW9uYWwgY2FsbHM6CisKKyAgICAgICAgICAgICAgICAgIG1vZGUgICAgICAgIDogaW5pdCBjYWxsIDogcmVzZXQgY2FsbAorICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgIWNvbXBhdCAmICFuYXRpdmUgOiAgY3JlYXRlKCkgOiAgcmVzZXQoMSkKKyAgICAgICAgICAgICFjb21wYXQgJiAgbmF0aXZlIDogIGNyZWF0ZSgpIDogIHJlc2V0KCkKKyAgICAgICAgICAgICBjb21wYXQgJiAhbmF0aXZlIDogIHJlc2V0KDApIDogIHJlc2V0KDEpCisgICAgICAgICAgICAgY29tcGF0ICYgIG5hdGl2ZSA6ICByZXNldCgwKSA6ICByZXNldCgxKQorCisgICAgICAgICAgSWYgSU5JVElBTElaQVRJT05fQllfX19JTklUIHdhcyBkZWZpbmVkLCB0aGUgbGZ1biBfX0lOSVQoKQorICAgICAgICAgIGlzIGNhbGxlZCBmaXJzdCBvbiBjcmVhdGlvbiB0byBpbml0aWFsaXplIHRoZSBvYmplY3RzCisgICAgICAgICAgdmFyaWFibGVzLgorCisKKyAgICAgICAgTW92ZW1lbnQgT2YgT2JqZWN0cworICAgICAgICAgIFRoZSBlZnVuIG1vdmVfb2JqZWN0KCkgaXMgaW1wbGVtZW50ZWQgaW4gdGhlIG11ZGxpYiB0aHJvdWdoCisgICAgICAgICAgZHJpdmVyIGhvb2tzIGFuZCB0aGUgc2V0X2Vudmlyb25tZW50KCkgZWZ1bi4KKyAgICAgICAgICBtb3ZlX29iamVjdCgpIGl0c2VsZiBleGlzdHMganVzdCBmb3IgY29udmVuaWVuY2UgYW5kCisgICAgICAgICAgY29tcGF0aWJpbGl0eS4KKworICAgICAgICAgIEluIG9yaWdpbmFsIG5hdGl2ZSBtb2RlLCBtb3ZlX29iamVjdCgpIGNvdWxkIGFwcGxpZWQgb25seSB0bworICAgICAgICAgIHRoaXNfb2JqZWN0KCkgYXMgdGhlIG9iamVjdCB0byBtb3ZlLCBhbmQgaXQgY2FsbGVkIHRoZSBsZnVuCisgICAgICAgICAgZXhpdCgpIGluIHRoZSBvbGQgZW52aXJvbm1lbnQgaWYgaW4gY29tcGF0IG1vZGUuIEFzIGEgc2lkZQorICAgICAgICAgIGVmZmVjdCwgdGhlIGxmdW4gZXhpdCgpIG1heSBub3QgYmUgdGFyZ2V0IG9mIGFkZF9hY3Rpb24oKXMKKyAgICAgICAgICBpbiBjb21wYXQgbW9kZS4KKworICAgICAgICAgIEluIGNvbXBhdCBtb2RlLCBvYmplY3RzIG1heSBiZSBtb3ZlZCB1c2luZyB0aGUgdHJhbnNmZXIoKQorICAgICAgICAgIGVmdW4uIEl0IGRvZXMgbWFrZSBhc3N1bXB0aW9ucyBhYm91dCB0aGUgZGVzaWduIG9mIHRoZQorICAgICAgICAgIG11ZGxpYiwgdGhvdWdoLCBhcyBpdCBjYWxscyB0aGUgbGZ1bnMgcXVlcnlfd2VpZ2h0KCksCisgICAgICAgICAgY2FuX3B1dF9hbmRfZ2V0KCksIGdldCgpLCBwcmV2ZW50X2luc2VydCgpIGFuZCBhZGRfd2VpZ2h0KCkuCisKKworICAgICAgICBFZnVucyBJbiBHZW5lcmFsCisgICAgICAgICAgY3JlYXRvcigpLCB0cmFuc2ZlcigpCisgICAgICAgICAgICBUaGVzZSBleGlzdCBvbmx5IGluIGNvbXBhdCBtb2RlIChjcmVhdG9yKCkgaXMKKyAgICAgICAgICAgIGlkZW50aWNhbCB3aXRoIGdldHVpZCgpKS4KKworICAgICAgICAgIG9iamVjdF9uYW1lKCksZnVuY3Rpb25fZXhpc3RzKCkKKyAgICAgICAgICAgIEluICFjb21wYXQgbW9kZSwgdGhlIHJldHVybmVkIGZpbGVuYW1lcyBzdGFydCB3aXRoIGEKKyAgICAgICAgICAgIGxlYWRpbmcgJy8nLCBpbiBjb21wYXQgbW9kZSB0aGV5IGRvbid0LgorCisgICAgICAgICAgcGFyc2VfY29tbWFuZCgpCisgICAgICAgICAgICBUaGlzIGNvbW1hbmQgZXhpc3RzIGluIHR3byB2ZXJzaW9uczogdGhlIG9sZCBpcyB1c2VkIHdpdGgKKyAgICAgICAgICAgIGNvbXBhdCwgdGhlIG5ldyB3aXRoICFjb21wYXQuIEhvd2V2ZXIsCisgICAgICAgICAgICBTVVBQTFlfUEFSU0VfQ09NTUFORCBtdXN0IGJlIGRlZmluZWQgaW4gY29uZmlnLmggaW4gYm90aAorICAgICAgICAgICAgY2FzZXMgKHRoaXMgZWZ1biBpcyBub3QgdmVyeSB1c2VmdWwgYXQgYWxsKS4KKworICAgICAgICAgIHByb2Nlc3Nfc3RyaW5nKCkKKyAgICAgICAgICAgIElmIHRoaXNfb2JqZWN0KCkgZG9lc24ndCBleGlzdCwgaXQgZGVmYXVsdHMgdG8gdGhpc19wbGF5ZXIoKQorICAgICAgICAgICAgYW5kIHJlY2VpdmVzIHRoZSBiYWNrYm9uZSB1aWQgKHJldHVybmVkIGJ5IG1hc3Rlci0+Z2V0X2JiX3VpZCgpKQorICAgICAgICAgICAgYXMgZXVpZC4gSWYgc3RyaWN0LWV1aWRzLCB0aGlzIHVpZCBtdXN0IG5vdCBiZSAwLgorCisgICAgICAgIFVzZXJpZHMgYW5kIEVmZmVjdGl2ZSBVc2VyaWRzCisgICAgICAgICAgVGhpcyBpcyBwcm9iYWJseSB0aGUgbW9zdCBpbXBvcnRhbnQgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZQorICAgICAgICAgIG1vZGVzLgorCisgICAgICAgICAgTFBNdWQgYWx3YXlzIGhhZCB1c2VyaWRzICh1aWRzKSBhdHRyaWJ1dGluZyB0aGUgb2JqZWN0cywKKyAgICAgICAgICB0aG91Z2ggdGhleSB3ZXJlIGNhbGxlZCAnY3JlYXRvciBuYW1lcycgaW4gY29tcGF0IG1vZGUuCisgICAgICAgICAgSW50ZXJuYWxseSwgdGhlIGNvbXBhdCBtb2RlIHVzZXMgdGhlICdjcmVhdG9yIG5hbWVzJyBhcworICAgICAgICAgIChlKXVpZC4KKworICAgICAgICAgIFdpdGggdGhlIGludHJvZHVjdGlvbiBvZiBuYXRpdmUvcGxhaW4gbW9kZSwgYWRkaXRpb25hbGx5CisgICAgICAgICAgJ2VmZmVjdGl2ZSB1c2VyaWRzJyAoZXVpZHMpIHdlcmUgaW50cm9kdWNlZCB0byBpbXByb3ZlCisgICAgICAgICAgc2VjdXJpdHkgaGFuZGxpbmcgKHdoaWNoIHdhcyBvbmx5IGEgcGFydGlhbCBzdWNjZXNzKS4KKyAgICAgICAgICBUaGUgaGFyZGNvZGVkIGhhbmRsaW5nIG9mIGV1aWRzIGFuZCB1aWRzIHdhcyBxdWl0ZSBjb21wbGV4CisgICAgICAgICAgYW5kIHRvbyBtdWRsaWItaW5zZW5zaXRpdmUsIHNvIG1vc3Qgb2YgaXQgZ290IG1vdmVkIGZyb20gdGhlCisgICAgICAgICAgZHJpdmVyIGludG8gdGhlIG11ZGxpYiB3aXRoIDMuMi4xLgorCisgICAgICAgICAgSW4gc3RyaWN0LWV1aWRzIG1vZGUsIG9ubHkgb2JqZWN0cyB3aXRoIGEgbm9uLXplcm8gZXVpZCBtYXkgbG9hZAorICAgICAgICAgIG9yIGNyZWF0ZSBuZXcgb2JqZWN0cy4KKworICAgICAgICAgIC0tLSBJbiBEZXRhaWwgLS0tCisKKyAgICAgICAgICAgIFVzZXJpZHMgb2YgdGhlIE1hc3RlcgorICAgICAgICAgICAgICBUaGUgbWFzdGVycyAoZSl1aWQgaXMgZGV0ZXJtaW5lZCBieSBhIGNhbGwgdG8KKyAgICAgICAgICAgICAgbWFzdGVyLT5nZXRfbWFzdGVyX3VpZCgpLgorICAgICAgICAgICAgICBJbiBzdHJpY3QtZXVpZHMgbW9kZSwgdGhlIHJlc3VsdCBoYXMgdG8gYmUgYSBzdHJpbmcsCisgICAgICAgICAgICAgICAgb3RoZXJ3aXNlIHRoZSBkcml2ZXIgd29uJ3Qgc3RhcnQgdXAgYXQgYWxsLiBJZiB0aGUgcmVzdWx0IGlzCisgICAgICAgICAgICAgICAgdmFsaWQgaXQgaXMgc2V0IGFzIHRoZSBtYXN0ZXJzIHVpZCBhbmQgZXVpZC4KKyAgICAgICAgICAgICAgSW4gIXN0cmljdC1ldWlkcyBtb2RlLCB0aGUgcmVzdWx0IG1heSBiZSBhbnkgdmFsdWU6IDAgb3IgYQorICAgICAgICAgICAgICAgIHN0cmluZyBhcmUgdHJlYXRlZCBhcyB0aGUgdWlkIHRvIHNldCwgYSBub24temVybyBpbnRlZ2VyCisgICAgICAgICAgICAgICAgbGVhZHMgdG8gdGhlIHVzZSBvZiB0aGUgdWlkIHNldCBpbiB0aGUgZGVmYXVsdCAnZ2xvYmFsJworICAgICAgICAgICAgICAgIHdpemxpc3QgZW50cnksIGFuZCBhbnkgb3RoZXIgdmFsdWUgZGVmYXVsdHMgdG8gMC4KKyAgICAgICAgICAgICAgICBUaGUgZXVpZCBpcyBlaXRoZXIgc2V0IHRvIHRoZSByZXR1cm5lZCBzdHJpbmcgKGlmIGFueSksCisgICAgICAgICAgICAgICAgb3IgdG8gMC4KKyAgICAgICAgICAgICAgVGhlIG1hc3RlcnMgdWlkIGlzIGRldGVybWluZWQgb25seSBvbiBzdGFydHVwIHRoaXMgd2F5LAorICAgICAgICAgICAgICBhdCBydW50aW1lIHRoZSB1aWRzIG9mIGEgcmVsb2FkZWQgbWFzdGVyIGRldGVybWluZWQgYXMKKyAgICAgICAgICAgICAgZm9yIGV2ZXJ5IG9iamVjdCBieSBhIGNhbGwgdG8gdGhlIGFwcHJvcHJpYXRlIGRyaXZlcgorICAgICAgICAgICAgICBob29rcy4KKworICAgICAgICAgICAgVXNlcmlkcyBvZiBOZXcgT2JqZWN0cworICAgICAgICAgICAgICBUbyBkZXRlcm1pbmUgdGhlIChlKXVpZHMgZm9yIGEgbmV3IG9iamVjdCAobG9hZGVkIG9yCisgICAgICAgICAgICAgIGluaGVyaXRlZCwgb3IgY2xvbmVkKSwgdGhlIGFwcHJvcHJpYXRlIGRyaXZlciBob29rIGlzCisgICAgICAgICAgICAgIGV2YWx1YXRlZCAoSF9MT0FEX1VJRFMsIEhfQ0xPTkVfVUlEUykgYW5kIHRoZSByZXN1bHQgc2V0CisgICAgICAgICAgICAgIGFzIChlKXVpZC4gVGhlIHJlc3VsdCBtYXkgYmUgYSBzaW5nbGUgdmFsdWUsIGluIHdoaWNoIGNhc2UgdGhlCisgICAgICAgICAgICAgIGV1aWQgaXMgc2V0IHRvIDAsIG9yIGFuIGFycmF5ICh7IHVpZCwgZXVpZCB9KS4KKyAgICAgICAgICAgICAgSW4gc3RyaWN0LWV1aWRzIG1vZGUsIGJvdGggdWlkIGFuZCBldWlkIG11c3QgYmUgMCBvciBhIHN0cmluZywKKyAgICAgICAgICAgICAgICBhbnkgb3RoZXIgdmFsdWUgY2F1c2VzIHRoZSBsb2FkL2Nsb25lIHRvIGZhaWwuCisgICAgICAgICAgICAgIEluICFzdHJpY3QtZXVpZHMgbW9kZSwgdGhlIHVpZCAoaG93ZXZlciByZXR1cm5lZCkgbWF5IGFsc28gYmUKKyAgICAgICAgICAgICAgICBhIG5vbi16ZXJvIGludGVnZXIgdG8gdXNlIHRoZSB1aWQgb2YgdGhlIGdsb2JhbAorICAgICAgICAgICAgICAgIHdpemxpc3QgZW50cnkgYXMgdWlkLiBUaGUgZXVpZCBpcyB0aGVuCisgICAgICAgICAgICAgICAgc2V0IHRvIGVpdGhlciAwIG9yIHRoZSBzZWNvbmQgZW50cnkgb2YgdGhlIHJldHVybmVkCisgICAgICAgICAgICAgICAgYXJyYXkgaWYgaXQncyBhIHN0cmluZy4KKworICAgICAgICAgIC0tLSAtLS0KKworU0VFIEFMU08KKyAgICAgICAgaG9va3MoQyksIHVpZHMoQyksIG1vdmVfb2JqZWN0KEUpLCBpbml0aWFsaXNhdGlvbihMUEMpCmRpZmYgLS1naXQgYS9kb2MvY29uY2VwdHMvbmVnb3RpYXRpb24gYi9kb2MvY29uY2VwdHMvbmVnb3RpYXRpb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQyMzE4ZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9jb25jZXB0cy9uZWdvdGlhdGlvbgpAQCAtMCwwICsxLDMxNiBAQAorQ09OQ0VQVAorICAgICAgICBUZWxuZXQgTmVnb3RpYXRpb25zCisKK0RFU0NSSVBUSU9OCisgICAgICAgIFRoZSB0ZWxuZXQgcHJvdG9jb2wgaXMgdXNlZCB0byBjb250cm9sIHRleHRiYXNlZCBjb25uZWN0aW9ucworICAgICAgICBiZXR3ZWVuIGEgY2xpZW50ICh0aGUgJ3RlbG5ldCcgcHJvZ3JhbSBvciBhIG11ZCBjbGllbnQpIGFuZCBhCisgICAgICAgIHNlcnZlciAodGhlIGdhbWUgZHJpdmVyKS4gTW9zdCBvZiB0aGUgb3B0aW9ucyBvZmZlcmVkIGJ5IHRoZQorICAgICAgICBwcm90b2NvbCBhcmUgb3B0aW9uYWwgYW5kIG5lZWQgdG8gYmUgbmVnb3RpYXRlZCBiZXR3ZWVuIHRoZQorICAgICAgICBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIuICBDb25zZXF1ZW50bHksIGFuZCBkdWUgdG8gdGhlaXIKKyAgICAgICAgc3BlY2lhbGl6ZWQgbmF0dXJlLCBtdWQgY2xpZW50cyBkb24ndCBoYXZlIHRvIHN1cHBvcnQgdGhlIGZ1bGwKKyAgICAgICAgdGVsbmV0IG9wdGlvbiBmZWF0dXJlIHNldC4KKworICAgICAgICBGb3IgdGhlIHNlcnZlciB0byBmaW5kIG91dCBpZiBhIGNsaWVudCBzdXBwb3J0cyB0aGUgdGVsbmV0CisgICAgICAgIHByb3RvY29sIGF0IGFsbCwgb25lIGdvb2QgYXBwcm9hY2ggaXMgdG8gYSBzaW1wbGUsIGNvbW1vbmx5CisgICAgICAgIHVzZWQgdGVsbmV0IGNvbW1hbmQgdG8gdGhlIGNsaWVudC4gSWYgdGhlIGNsaWVudCByZWFjdHMKKyAgICAgICAgY29uZm9ybSB0byB0aGUgcHJvdG9jb2wgKG9yIHNlbmRzIHRlbG5ldCBjb21tYW5kcyBpdHNlbGYpLCB0aGUKKyAgICAgICAgbXVkIGNhbiBjb250aW51ZSB0byBuZWdvdGlhdGUgZnVydGhlciBvcHRpb25zLiBJZiB0aGUgY2xpZW50CisgICAgICAgIGRvZXMgbm90IHJlYWN0LCB0aGUgbXVkIGNhbiBzYWZlbHkgcmVmcmFpbiBmcm9tIGZ1cnRoZXIKKyAgICAgICAgbmVnb3RpYXRpb25zLgorCisgICAgICAgIFRoZSBmb2xsb3dpbmcgbGlzdCBpcyBhIG1vcmUgb3IgbGVzcyBjb21wcmVoZW5zaXZlIG92ZXJ2aWV3IG9mCisgICAgICAgIHRoZSB0ZWxuZXQgcmVsYXRlZCBSRkNzIChhdmFpbGFibGUgZm9yIGV4YW1wbGUgb24KKyAgICAgICAgaHR0cDovL3d3dy5mYXFzLm9yZy9yZmNzKToKKworCSBSRkMgVGl0ZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsLiBDb2RlCisKKwkgNDk1IFRFTE5FVCBQcm90b2NvbCBTcGVjaWZpY2F0aW9uCisJIDUxMyBDb21tZW50cyBvbiB0aGUgbmV3IFRFTE5FVCBzcGVjaWZpY2F0aW9ucworCSA1NTkgQ29tbWVudHMgb24gdGhlIG5ldyBURUxORVQgUHJvdG9jb2wgYW5kIGl0cyBJbXBsZW0KKwkgNTk1IFNvbWUgVGhvdWdodHMgaW4gRGVmZW5zZSBvZiB0aGUgVEVMTkVUIEdvLUFoZWFkCisJIDU5NiBTZWNvbmQgVGhvdWdodHMgb24gVGVsbmV0IEdvLUFoZWFkCisJIDY1MiBUZWxuZXQgT3V0cHV0IENhcnJpYWdlLVJldHVybiBEaXNwb3NpdGlvbiBPcHRpb24gICBOQU9DUkQgICAgIDEwCisJIDY1MyBUZWxuZXQgT3V0cHV0IEhvcml6b250YWwgVGFic3RvcHMgT3B0aW9uICAgICAgICAgICBOQU9IVFMgICAgIDExCisJIDY1NCBUZWxuZXQgT3V0cHV0IEhvcml6b250YWwgVGFiIERpc3Bvc2l0aW9uIE9wdGlvbiAgICBOQU9IVEQgICAgIDEyCisJIDY1NSBUZWxuZXQgT3V0cHV0IEZvcm1mZWVkIERpc3Bvc2l0aW9uIE9wdGlvbiAgICAgICAgICBOQU9GRkQgICAgIDEzCisJIDY1NiBUZWxuZXQgT3V0cHV0IFZlcnRpY2FsIFRhYnN0b3BzIE9wdGlvbiAgICAgICAgICAgICBOQU9WVFMgICAgIDE0CisJIDY1NyBUZWxuZXQgT3V0cHV0IFZlcnRpY2FsIFRhYiBEaXNwb3NpdGlvbiBPcHRpb24gICAgICBOQU9WVEQgICAgIDE1CisJIDY1OCBUZWxuZXQgT3V0cHV0IExpbmVmZWVkIERpc3Bvc2l0aW9uICAgICAgICAgICAgICAgICBOQU9MRkQgICAgIDE2CisJIDY5OCBUZWxuZXQgRXh0ZW5kZWQgQXNjaWkgT3B0aW9uICAgICAgICAgICAgICAgICAgICAgICBYLUFTQ0lJICAgIDE3CisJIDcyNyBUZWxuZXQgTG9nb3V0IE9wdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dPVVQgICAgIDE4CisJIDcyOCBBIE1pbm9yIFBpdGZhbGwgaW4gdGhlIFRlbG5ldCBQcm90b2NvbAorCSA3MzUgUmV2aXNlZCBURUxORVQgQnl0ZSBNYWNybyBPcHRpb24gICAgICAgICAgICAgICAgICAgQk0gICAgICAgICAxOQorCSA3NDkgVGVsbmV0IFNVUERVUC1PVVRQVVQgT3B0aW9uICAgICAgICAgICAgICAgICAgICAgICAgU1VQRFVQICAgICAyMgorCSA3NjQgVGVsbmV0IFByb3RvY29sIFNwZWNpZmljYXRpb24KKwkgNzc5IFRlbG5ldCBTRU5ELUxPQ0FUSU9OIE9wdGlvbiAgICAgICAgICAgICAgICAgICAgICAgIFNFTkRMT0MgICAgMjMKKwkgODE4IFRoZSBSZW1vdGUgVXNlciBUZWxuZXQgU2VydmljZQorCSA4NTQgVGVsbmV0IFByb3RvY29sIFNwZWNpZmljYXRpb24KKwkgODU1IFRlbG5ldCBPcHRpb24gU3BlY2lmaWNhdGlvbnMKKwkgODU2IFRlbG5ldCBCaW5hcnkgVHJhbnNtaXNzaW9uICAgICAgICAgICAgICAgICAgICAgICAgIEJJTkFSWSAgICAgIDAKKwkgODU3IFRlbG5ldCBFY2hvIE9wdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVDSE8gICAgICAgIDEKKwkgODU4IFRlbG5ldCBTdXBwcmVzcyBHbyBBaGVhZCBPcHRpb24gICAgICAgICAgICAgICAgICAgIFNHQSAgICAgICAgIDMKKwkgODU5IFRlbG5ldCBTdGF0dXMgT3B0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQVRVUyAgICAgIDUKKwkgODYwIFRlbG5ldCBUaW1pbmcgTWFyayBPcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgIFRNICAgICAgICAgIDYKKwkgODYxIFRlbG5ldCBFeHRlbmRlZCBPcHRpb25zIC0gTGlzdCBPcHRpb24gICAgICAgICAgICAgIEVYT1BMICAgICAyNTUKKwkgODg0IFRlbG5ldCBUZXJtaW5hbCBUeXBlIE9wdGlvbiAgICAgICAgICAgICAgICAgICAgICAgIFRUWVBFICAgICAgMjQKKwkgODg1IFRlbG5ldCBFbmQgb2YgUmVjb3JkIE9wdGlvbiAgICAgICAgICAgICAgICAgICAgICAgIEVPUiAgICAgICAgMjUKKwkgOTMwIFRlbG5ldCBUZXJtaW5hbCBUeXBlIE9wdGlvbiAgICAgICAgICAgICAgICAgICAgICAgIFRUWVBFICAgICAgMjQKKwkgOTMzIE91dHB1dCBNYXJraW5nIFRlbG5ldCBPcHRpb24gICAgICAgICAgICAgICAgICAgICAgIE9VVE1SSyAgICAgMjcKKwkgOTQ2IFRlbG5ldCBUZXJtaW5hbCBMb2NhdGlvbiBOdW1iZXIgT3B0aW9uICAgICAgICAgICAgIFRUWUxPQyAgICAgMjgKKwkxMDQzIFRlbG5ldCBEYXRhIEVudHJ5IFRlcm1pbmFsIE9wdGlvbiBET0RJSVMgSW1wbGVtZW50IERFVCAgICAgICAgMjAKKwkxMDUzIFRlbG5ldCBYLjMgUEFEIE9wdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFguMy1QQUQgICAgMzAKKwkxMDczIFRlbG5ldCBXaW5kb3cgU2l6ZSBPcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgIE5BV1MgICAgICAgMzEKKwkxMDc5IFRlbG5ldCBUZXJtaW5hbCBTcGVlZCBPcHRpb24gICAgICAgICAgICAgICAgICAgICAgIFRTUEVFRCAgICAgMzIKKwkxMDgwIFRlbG5ldCBSZW1vdGUgRmxvdyBDb250cm9sIE9wdGlvbiAgICAgICAgICAgICAgICAgIEZMT1dDVFJMICAgMzMKKwkxMDkxIFRlbG5ldCBUZXJtaW5hbC1UeXBlIE9wdGlvbiAgICAgICAgICAgICAgICAgICAgICAgIFRUWVBFICAgICAgMjQKKwkxMDk2IFRlbG5ldCBYIERpc3BsYXkgTG9jYXRpb24gT3B0aW9uICAgICAgICAgICAgICAgICAgIFhESVNQTE9DICAgMzUKKwkxMTE2IFRlbG5ldCBMaW5lbW9kZSBPcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJTkVNT0RFICAgMzQKKwkxMTQzIFRoZSBRIE1ldGhvZCBvZiBJbXBsZW1lbnRpbmcgVEVMTkVUIE9wdGlvbiBOZWdvdGlhCisJMTE4NCBUZWxuZXQgTGluZW1vZGUgT3B0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSU5FTU9ERSAgIDM0CisJMTM3MiBUZWxuZXQgUmVtb3RlIEZsb3cgQ29udHJvbCBPcHRpb24gICAgICAgICAgICAgICAgICBGTE9XQ1RSTCAgIDMzCisJMTQwOCBUZWxuZXQgRW52aXJvbm1lbnQgT3B0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICBFTlZJUk9OICAgIDM2CisJMTU3MSBUZWxuZXQgRW52aXJvbm1lbnQgT3B0aW9uIEludGVyb3BlcmFiaWxpdHkgSXNzdWVzCisJMTU3MiBUZWxuZXQgRW52aXJvbm1lbnQgT3B0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICBORVdFTlYgICAgIDM5CisJMjA2NiBUZWxuZXQgQ2hhcnNldCBPcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSU0VUICAgIDQyCisJMjIxNyBUZWxuZXQgQ29tIFBvcnQgQ29udHJvbCBPcHRpb24gICAgICAgICAgICAgICAgICAgICBDT01QT1JUICAgIDQ0CisJMjg3NyA1MjUwIFRlbG5ldCBFbmhhbmNlbWVudHMKKworICAgICAgICBBbGwgbmVnb3RpYXRpb25zIHN0YXJ0IHdpdGggdGhlIHNwZWNpYWwgY2hhcmFjdGVyIElBQyB3aGljaCBpcworICAgICAgICBkZWZpbmVkIGluIC91c3IvaW5jbHVkZS9hcnBhL3RlbG5ldC5oIChvciBpbgorICAgICAgICBzcmMvZHJpdmVyL3RlbG5ldC5oIGZvciAzLjIoLjEpKSBhbmQgaGFzIHRoZSBkZWNpbWFsIHZhbHVlIG9mCisgICAgICAgIDI1NS4gTmVnb3RpYXRpb25zIGFyZSBiYXNlZCBvbiBkaWZmZXJlbnQgdGVsbmV0b3B0aW9ucyAodGhlaXIKKyAgICAgICAgdmFsdWVzIGFyZSBkZWZpbmVkIGluIHRlbG5ldC5oIHRvbykuIEJlZm9yZSBhIG5lZ290aWF0aW9uIGNhbgorICAgICAgICBzdGFydCB0aGUgY2xpZW50IGFuZCB0aGUgc2VydmVyIGhhdmUgdG8gYWdyZWUgdGhhdCB0aGV5CisgICAgICAgIHN1cHBvcnQgdGhlIG9wdGlvbi4KKyAgICAgICAgVGhpcyB3b3JrcyBpbiB0aGUgZm9sbG93aW5nIHdheToKKworICAgICAgICBJZiBhIGNsaWVudCB3YW50cyB0byBzZW5kIHNvbWV0aGluZyB0byB0aGUgc2VydmVyIGl0IGhhcyB0bworICAgICAgICBzZW5kICdJQUMgV0lMTCBvcHRpb24nIChGb3IgdGVybWluYWx0eXBlIG5lZ290YXRpb24gdGhpcyB3b3VsZAorICAgICAgICBiZSB0aGUgMyBieXRlcyAyNTUsMjUxLDI0OyBhZ2FpbiwgY2hlY2sgdGVsbmV0LmgpIHRvIGNvbmZpcm0KKyAgICAgICAgdGhhdCBpdCBpcyBhYmxlIHRvIGRvIHRoYXQuIElmIHRoZSBzZXJ2ZXIgaXMgc3VwcG9ydGluZyB0aGF0CisgICAgICAgIG9wdGlvbiBhbmQgd2FudHMgdG8gcmVjZWl2ZSBzb21ldGhpbmcgaXQgc2VuZHMgJ0lBQyBETyBvcHRpb24nCisgICAgICAgICgyNTUsMjUzLG9wdGlvbikKKworICAgICAgICBJZiBvbmUgc2lkZSBpcyByZWNlaXZpbmcgYW4gJ0lBQyBXSUxMIG9wdGlvbicgYW5kIGhhcyBub3QgeWV0CisgICAgICAgIHNlbnQgd2l0aCBETyBvciBET05UIGl0IGhhcyB0byByZXNwb25kIHdpdGggZWl0aGVyICdJQUMgRE8KKyAgICAgICAgb3B0aW9uJyBpZiBpdCB3aWxsIHN1cHBvcnQgdGhpcyBuZWdvdGlhdGlvbiBvciAnSUFDIERPTlQKKyAgICAgICAgb3B0aW9uJyBpZiBpdCB3b24ndC4KKworICAgICAgICBJZiBvbmUgc2lkZSBpcyByZWNlaXZpbmcgYW4gJ0lBQyBETyBvcHRpb24nIGFuZCBoYXMgbm90IHlldAorICAgICAgICBzZW50IGEgV0lMTCBvciBXT05UIGl0IGhhcyB0byByZXBseSB3aXRoIGVpdGhlciAnSUFDIFdJTEwKKyAgICAgICAgb3B0aW9uJyBpZiBpdCBzdXBwb3J0cyB0aGUgb3B0aW9uIG9yICdJQUMgV09OVCBvcHRpb24nIGlmIG5vdC4KKworICAgICAgICBBIHNtYWxsIGV4YW1wbGU6IExldHMgYXNzdW1lIHdlIHdhbnQgdG8gbmVnb3RpYXRpbmcKKyAgICAgICAgdGVybWluYWx0eXBlLiAoVEVMT1BUX1RUWVBFIHdpdGggdmFsdWUgMjQpLiBjbGllbnQgaXMgdGhlCisgICAgICAgIHRlbG5ldCBleGVjdXRhYmxlIG9uIHRoZSBwbGF5ZXJzaWRlLCB0aGUgc2VydmVyIGlzIHRoZQorICAgICAgICBnYW1lZHJpdmVyLgorCisgICAgICAgICAgICAgICAgY2xpZW50ICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyCisgICAgICAgICAgICBJQUMgV0lMTCBUVFlQRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFDIERPIFRUWVBFCisKKyAgICAgICAgT3I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQUMgRE8gVFRZUEUKKyAgICAgICAgICAgIElBQyBXSUxMIFRUWVBFCisKKyAgICAgICAgQWZ0ZXIgdGhpcyB3ZSBhcmUgcmVhZHkgdG8gdHJhbnNmZXIgdGhlIHRlcm1pbmFsdHlwZSBmcm9tIHRoZQorICAgICAgICBjbGllbnQgdG8gdGhlIHNlcnZlciBhcyBleHBsYWluZWQgYmVsb3cuCisKKyAgICAgICAgTm93IHdlIGFyZSByZWFkeSB0byBzdGFydCB0aGUgcmVhbCBuZWdvdGlhdGlvbnMuIEkgZXhwbGFpbiB0aGUKKyAgICAgICAgMyBvcHRpb25zIEkgaGF2ZSBjdXJyZW50bHkgaW1wbGVtZW50ZWQuCisKKyAgICAgICAgRmlyc3QgVGVybWluYWxUeXBlIGFrYSBUVFlQRSBha2EgMjQgYWthIFRFTE9QVF9UVFlQRSBhc3N1bWluZworICAgICAgICB0aGUgY2xpZW50IGFuZCB0aGUgc2VydmVyIGhhdmUgZXhjaGFuZ2VkIFdJTEwvRE8uCisKKyAgICAgICAgVGhlIHNlcnZlciBpcyBub3cgZnJlZSB0byBzZW5kICdJQUMgU0IgVEVMT1BUX1RUWVBFCisgICAgICAgIFRFTFFVQUxfU0VORCBJQUMgU0UnIHdoaWNoIHdpbGwgYmUgcmVwbGllZCB3aXRoICdJQUMgU0IKKyAgICAgICAgVEVMT1BUX1RUWVBFIFRFTFFVQUxfSVMgdGVybWluYWx0eXBlIElBQyBTRScgd2hlcmUKKyAgICAgICAgdGVybWluYWx0eXBlIGlzIGEgbm9uLXplcm8gdGVybWluYXRlZCBzdHJpbmcgKGl0J3MgdGVybWluYXRlZAorICAgICAgICBieSB0aGUgSUFDKSAoRm9yIHZhbHVlcyBsb29rIHVwIHRlbG5ldC5oKSBBTkQgc3dpdGNoIHRoZQorICAgICAgICBjbGllbnQncyB0ZXJtaW5hbGVtdWxhdGlvbiB0byAndGVybWluYWx0eXBlJy4gdGVybWluYWx0eXBlIGlzCisgICAgICAgIGNhc2UtaW5zZW5zaXRpdmUuIHRlcm1pbmFsLXR5cGUgbWF5IGJlIFVOS05PV04uIFRoZSBzZXJ2ZXIgbWF5CisgICAgICAgIHJlcGVhdCB0aGUgU0VORCByZXF1ZXN0IGFuZCB0aGUgY2xpZW50IHdpbGwgcmVzcG9uZCB3aXRoIHRoZQorICAgICAgICBuZXh0IHByZWZlcnJlZCB0ZXJtaW5hbHR5cGUuIElmIHRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlCisgICAgICAgIHByZXZpb3VzIHJlY2VpdmVkLCBpdCBtYXJrcyB0aGUgZW5kIG9mIHRoZSBsaXN0IG9mCisgICAgICAgIHRlcm1pbmFsdHlwZXMuIFRoZSBuZXh0IFNFTkQgcmVxdWVzdCB3aWxsIHN0YXJ0IHRoZQorICAgICAgICB0ZXJtaW5hbHR5cGVzIGZyb20gdGhlIGJlZ2lubmluZy4KKworICAgICAgICBFeGFtcGxlOiAod2UgaGF2ZSBleGNoYW5nZWQgV0lMTC9ETyBhbHJlYWR5KQorICAgICAgICAgICAgICAgICAgY2xpZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQUMgU0IgVFRZUEUgU0VORCBJQUMgU0UKKyAgICAgICAgSUFDIFNCIFRUWVBFIElTIFZUMjAwIElBQyBTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBQyBTQiBUVFlQRSBTRU5EIElBQyBTRQorICAgICAgICBJQUMgU0IgVFRZUEUgSVMgVlQxMDAgSUFDIFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFDIFNCIFRUWVBFIFNFTkQgSUFDIFNFCisgICAgICAgIElBQyBTQiBUVFlQRSBJUyBWVDUyIElBQyBTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBQyBTQiBUVFlQRSBTRU5EIElBQyBTRQorICAgICAgICBJQUMgU0IgVFRZUEUgSVMgVlQ1MiBJQUMgU0UKKyAgICAgICAgLyogdGhpcyBtYXJrcyB0aGF0IHdlIGhhdmUgYWxsIHRlcm1pbmFsdHlwZXMuIFdlIGRlY2lkZSB0byB1c2UgdGhlCisgICAgICAgICAqIHZ0MjAwIG1vZGUgc28gd2UgaGF2ZSB0byBza2lwIHRvIFZUMjAwCisgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBQyBTQiBUVFlQRSBTRU5EIElBQyBTRQorICAgICAgICBJQUMgU0IgVFRZUEUgSVMgVlQyMDAgSUFDIFNFCisKKworICAgICAgICBOZXh0IGltcG9ydGFudCBvcHRpb24gaXMgTkFXUyAoMzEpIG9yIFdpbmRvd1NpemVOZWdvdGlhdGlvbi4KKworICAgICAgICBUaGlzIG9uZSBpcyBhIGJpdCBlYXNpZXIgdGhhbiB0ZXJtaW5hbHR5cGUuIEFmdGVyIGhhdmluZworICAgICAgICByZWNlaXZlZCBhIElBQyBETyBOQVdTIGZyb20gdGhlIHNlcnZlciwgdGhlIGNsaWVudCB3aWxsIHJlcGx5CisgICAgICAgIHdpdGggSUFDIFdJTEwgTkFXUyBhbmQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhhdCBzZW5kIElBQyBTQiBOQVdTCisgICAgICAgIGNvbHVtbnNfaGlnaCBjb2x1bW5zX2xvdyBsaW5lc19oaWdoIGxpbmVzX2xvdyBJQUMgU0Ugd2hlcmUKKyAgICAgICAgeHhfbG93IHJlZmVycyB0byB0aGUgbG93Ynl0ZSBvZiB4eCBhbmQgeHhfaGlnaCByZWZlcnMgdG8gdGhlCisgICAgICAgIGhpZ2hieXRlIG9mIHh4LiBUaGlzIHdpbGwgYmUgYXV0b21hZ2ljYWxseSByZXNlbnQgYXQgZXZlcnkKKyAgICAgICAgd2luZG93cmVzaXplICh3aGVuIHRoZSBjbGllbnQgZ2V0cyBhIFNJR1dJTkNIIGZvciBleGFtcGxlKSBvcgorICAgICAgICBhdCB5b3VyIHJlcXVlc3Qgd2l0aCAnSUFDIFNCIE5BV1MgU0VORCBJQUMgU0UnLgorCisgICAgICAgIEV4YW1wbGU6IChXSUxML0RPIGV4Y2hhbmdlZCkKKyAgICAgICAgICAgICAgICBjbGllbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcgorICAgICAgICBJQUMgU0IgTkFXUyAwIDgwIDAgMjQgSUFDIFNFICAgICAgICAgLyogdGhlIHN0YW5kYXJkIHZ0MTAwIHdpbmRvd3NpemUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBubyByZXBseSAqLworCisgICAgICAgIEFuZCwgYSBiaXQgbGVzcyBpbXBvcnRhbnQgYnV0IG1vc3QgY29tcGxleCwgdGhlIExJTkVNT0RFICgzNCkKKyAgICAgICAgb3B0aW9uLiBJdCB3YXMgaW1wbGVtZW50ZWQgaXQgZHVlIHRvIHRoZSBmYWN0LCB0aGF0CisgICAgICAgIHNvbWUgd2VpcmQgRE9TIHRlbG5ldHMgd291bGQgbm90IHdvcmsgb3RoZXJ3aXNlLiBJbXBsZW1lbnRlZAorICAgICAgICBhcmUgb25seSB0aGUgYWJzb2x1dGUgYmFzaWMgZmVhdHVyZSwgd2hpY2ggaXMgdGhlIGFjdHVhbAorICAgICAgICBzd2l0Y2hpbmcgdGhlIHRlbG5ldCB0byBsaW5lbW9kZS4gQWZ0ZXIgZXhjaGFuZ2luZyBXSUxML0RPIHRoZQorICAgICAgICBzZXJ2ZXIgc2VuZHMgYSBtb2RlY2hhbmdlIHJlcXVlc3QgdG8gdGhlIGNsaWVudCB1c2luZyBJQUMgU0IKKyAgICAgICAgTElORU1PREUgTE1fTU9ERSBNT0RFX0VESVQgSUFDIFNFLCB3aGljaCBzaG91bGQgdHVybiBvbiBsb2NhbAorICAgICAgICBjb21tYW5kbGluZS1lZGl0aW5nIGZvciB0aGUgY2xpZW50LiBJZiBhIGNsaWVudCBzdXBwb3J0cworICAgICAgICBMSU5FTU9ERSBpdCBIQVMgdG8gc3VwcG9ydCB0aGlzIG1vZGVjaGFuZ2UuIFRoZSBjbGllbnQgd2lsbAorICAgICAgICByZXBseSB3aXRoIElBQyBTQiBMSU5FTU9ERSBMTV9NT0RFIE1PREVfRURJVHxNT0RFX0FDSyBJQUMgU0UKKyAgICAgICAgKHh8eSBpcyBiaXR3aXNlIG9yKS4gVGhhdHMgaXQgZm9yIGxpbmVtb2RlLiAoWW91IHdpbGwgcGVyaGFwcworICAgICAgICByZWNlaXZlIG90aGVyIElBQyBTQiBMSU5FTU9ERXMgd2l0aCBvdGhlciBMTV94eHggLi4uIHlvdSBtYXkKKyAgICAgICAgaWdub3JlIHRoZW0uIChBdCBsZWFzdCBJUklYIDUueCBzZW5kcyBJQUMgU0IgTElORU1PREUgTE1fU0xDCisgICAgICAgIC4uLi4gSUFDIFNFIHdoaWNoIGRlY2xhcmVzIHRoZSBsb2NhbCBjaGFyYWN0ZXJzZXQuKSkuCisKKyAgICAgICAgRXhhbXBsZTogKFdJTEwvRE8gbmVnb3RpYXRlZCkKKworICAgICAgICAgICAgICAgIGNsaWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBQyBTQiBMSU5FTU9ERSBMTV9NT0RFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9ERV9FRElUIElBQyBTRQorICAgICAgICBJQUMgU0IgTElORU1PREUgTE1fTU9ERQorICAgICAgICAgIE1PREVfRURJVHxNT0RFX0FDSyBJQUMgU0UKKworICAgICAgICBOb3RlOiBUaGUgb3B0aW9uIGlzIG11Y2ggbW9yZSBmdW5uaWVyIGFzIGl0IGxvb2tzIGhlcmUsIGl0IGZvcgorICAgICAgICAgIGV4YW1wbGUgc3VwcG9ydHMgYSBtaXhlZCBtb2RlIGJldHdlZW4gbGluZW1vZGUgYW5kCisgICAgICAgICAgY2hhcmFjdGVybW9kZS4uLiBmbHVzaGluZyB0aGUgaW5wdXQgYXQgY2VydGFpbiBjaGFyYWN0ZXJzIChhdAorICAgICAgICAgIEVTQyBvciBUQUIgZm9yIHNoZWxsLWxpa2UgY29tbWFuZGxpbmUgY29tcGxldGl0aW9uKS4gV2Ugc3VnZ2VzdAorICAgICAgICAgIHJlYWRpbmcgUkZDIDExODQuCisKKyAgICAgICAgWW91IG1pZ2h0IGJlIGludGVyZXN0ZWQgaW4gVEVMT1BUX1hESVNQTEFZTE9DIGFuZCBURUxPUFRfRU5WSVJPTiB0b28uCisKKyAgICAgICAgTm93LCBob3cgdG8gaW1wbGVtZW50IHRoaXMgdXNpbmcgTERNdWQ/CisKKyAgICAgICAgMC4gUGF0Y2ggc3JjL2RyaXZlci9jb21tMS5jLCBmdW5jdGlvbiBpbml0X3RlbG9wdHMoKSB0byBpbmNsdWRlCisgICAgICAgICAgICB0ZWxvcHRzX2RvW1RFTE9QVF9YWFhdID0gcmVwbHlfaF90ZWxuZXRfbmVnOworICAgICAgICAgICAgdGVsb3B0c19kb250W1RFTE9QVF9YWFhdID0gcmVwbHlfaF90ZWxuZXRfbmVnOworICAgICAgICAgICAgdGVsb3B0c193aWxsW1RFTE9QVF9YWFhdID0gcmVwbHlfaF90ZWxuZXRfbmVnOworICAgICAgICAgICAgdGVsb3B0c193b250W1RFTE9QVF9YWFhdID0gcmVwbHlfaF90ZWxuZXRfbmVnOworICAgICAgICAgICBmb3IgZXZlcnkgdGVsbmV0IG5lZ290aWF0aW9uIHlvdSB3YW50IHRvIHVzZS4KKyAgICAgICAgICAgRG8gbm90IG92ZXJ3cml0ZSB0aGUgVEVMT1BUX0VDSE8gYW5kIFRFTE9QVF9TR0EgaG9va3MuCisKKyAgICAgICAgICAgQWx0ZXJuYXRpdmVseSwgc2V0IHRoZSBkcml2ZXIgaG9vayBIX05PRUNITyBpbiBtYXN0ZXIuYzoKKyAgICAgICAgICAgdGhpcyBkaXZlcnRzIF9hbGxfIHRlbG5ldCBkYXRhIGludG8gdGhlIG11ZGxpYi4KKworICAgICAgICAxLiBBZGQgYSBuZXcgZHJpdmVyIGhvb2sgdG8gbWFzdGVyLmMganVzdCBiZWxvdyB0aGUgb3RoZXJzLgorICAgICAgICAgICAgICAgIHNldF9kcml2ZXJfaG9vayhIX1RFTE5FVF9ORUcsInRlbG5ldF9uZWciKSwKKyAgICAgICAgMi4gTWFrZSBhIHRlbG5ldC5oIGZvciB5b3VyIG11ZGxpYi4uLiBqdXN0IGNoYW5nZSB0aGUgYXJyYXlzIGluCisgICAgICAgICAgICAgICAgc3JjL2RyaXZlci90ZWxuZXQuaC4KKyAgICAgICAgMy4gZGVmaW5lIGEgZnVuY3Rpb24KKworICAgICAgICAgICAgICAgIHZvaWQgdGVsbmV0X25lZyhpbnQgY21kLCBpbnQgb3B0aW9uLCBpbnQgKiBvcHRhcmdzKQorCisgICAgICAgICAgIGluIHlvdXIgaW50ZXJhY3RpdmUgb2JqZWN0cyAobG9naW4uYyAsIHNoZWxscywgcGxheWVyLmMgb3IKKyAgICAgICAgICAgd2hlcmVldmVyKS4gQW5kIG5vdGUsIGluIEFMTCBvYmplY3RzLCB0aHJvdWdoIHdoaWNoIGEKKyAgICAgICAgICAgcGxheWVyIGlzIGhhbmRlZCB0aHJvdWdoIChpbiBUQVBQTXVkIHRoZXNlIGFyZSBsb2dpbi5jIGFuZAorICAgICAgICAgICBwbGF5ZXIuYykuIFtPaywgbWFzdGVyLmMgaXMgaW50ZXJhY3RpdmUgZm9yIGEgdmVyeSBzaG9ydAorICAgICAgICAgICB0aW1lIHRvbywgYnV0IGl0IHdvbid0IGFjY2VwdCBpbnB1dCwgd2lsbCBpdD9dCisgICAgICAgICAgICdjbWQnIHdpbGwgYmUgVEVMQ01EX3h4eHggKHNlZSB0ZWxuZXQuaCksICdvcHRpb24nIG9uZSBvZgorICAgICAgICAgICBURUxPUFRfeHh4eCBhbmQgJ29wdGFyZ3MnIHdpbGwgYmUgYW4gYXJyYXkgb2YgaW50cyAoYnl0ZXMgaW4KKyAgICAgICAgICAgZmFjdCkgd2hlbiAnY21kJyBpcyBTQi4KKyAgICAgICAgICAgUGFyc2UgJ2NtZCcvJ29wdGlvbicgYW5kIHJlcGx5IHdpdGggYXBwcm9waWF0ZSBhbnN3ZXJzCisgICAgICAgICAgIHVzaW5nIGJpbmFyeV9tZXNzYWdlKCkgKGFwcHJvcGlhdGUgbWVhbmluZyBzZW5kaW5nIHRoZQorICAgICAgICAgICByaWdodCBETy9ET05UL1dJTEwvV09OVCBpZiBub3Qgc2VudCBiZWZvcmUgYW5kIHVzaW5nIHRoZSBTQgorICAgICAgICAgICByZXR1cm4gdmFsdWVzKS4KKyAgICAgICAgMy4xLiBTZW50IElBQyBETyBUVFlQRSBJQUMgRE8gTkFXUyBJQUMgRE8gTElORU1PREUgYXQgdGhlCisgICAgICAgICAgIGZpcnN0IHRpbWUgeW91IGNhbiBkbyBpdCAoYmVmb3JlIGNhdCgpaW5nIC9XRUxDT01FIHBlcmhhcHMpLgorICAgICAgICAzLjIuIE5vdGUgYWxsIHNlbnQgYW5kIHJlY2VpdmVkIFdJTEwvV09OVC9ETy9ET05UIG9wdGlvbnMgZm9yCisgICAgICAgICAgIGNvbmZvcm1pbmcgdG8gdGhlIHN0YW5kYXJkLCBhdm9pZGluZyBlbmRsZXNzIGxvb3BzIGFuZCBmb3IKKyAgICAgICAgICAgZWFzeSBkZWJ1Z2dpbmcgOikKKyAgICAgICAgMy4zLiBQYXNzIHRob3NlIHJlY2V2aWVkL3NlbnQgZGF0YSBhbmQgb3RoZXIgZGF0YSB3aGVuIHRoZQorICAgICAgICAgICBpbnRlcmFjdGl2ZSBvYmplY3QgaXMgY2hhbmdlZCAoZnJvbSBsb2dpbi5jIHRvIHBsYXllci5jIG9yCisgICAgICAgICAgIGF0IG90aGVyIGJvZHljaGFuZ2VzKS4gQ2xlYXIgdGhlIGRhdGEgd2hlbiB0aGUgcGxheWVyIGdvZXMKKyAgICAgICAgICAgbGlua2RlYWQgb3IgcXVpdHMuIFlvdSB3b24ndCBuZWVkIHRvIHNhdmUgdGhpcyBkYXRhLgorICAgICAgICAzLjQuIExvd2VyX2Nhc2UoKSB0ZXJtaW5hbHR5cGVzLi4uIDspCisgICAgICAgIDMuNS4gVXNlIHJlYXNvbmFibGUgZGVmYXVsdHZhbHVlcyBpZiB0aGUgY2xpZW50IGRvZXMgbm90CisgICAgICAgICAgIHN1cHBvcnQgb25lIG9mIHRoZSBvcHRpb25zLiAoY29sdW1ucyA4MCxsaW5lcyAyNCBpZiBub3QKKyAgICAgICAgICAgTkFXUywgdW5rbm93biBvciB2dDEwMCBmb3Igbm8gdGVybWluYWx0eXBlKQorCisgICAgICAgIFRoZSBXSUxML1dPTlQvRE8vRE9OVCBkYXRhIGlzIGJlc3Qgc2F2ZWQgaW4gYSBtYXBwaW5nIGxvb2tpbmcKKyAgICAgICAgbGlrZSB0aGlzOgorICAgICAgICAgIChbICJyZWNlaXZlZCI6IChbIG9wdGlvbjE6IERPX0RPTlRfT1JfMDtXSUxMX1dPTlRfT1JfMCwgLi4uIF0pCisgICAgICAgICAgICwgInNlbnQiICAgIDogKFsgb3B0aW9uMTogRE9fRE9OVF9PUl8wO1dJTExfV09OVF9PUl8wLCAuLi4gXSkKKyAgICAgICAgICBdKQorCisgICAgICAgIChPaywgaXQgY2FuIGJlIGRvbmUgYmV0dGVyLiBCdXQgbm90IHdpdGhvdXQgY29uZnVzaW5nICptZSoKKyAgICAgICAgbW9yZS4pCisKKyAgICAgICAgQmVmb3JlIHNlbmRpbmcgYW55dGhpbmcgY2hlY2sKKyAgICAgICAgICBUTlsic2VudCJdW29wdGlvbiwwX2lmX2RvX2RvbnRfb3JfMV9pZl93aWxsX3dvbnRdCisgICAgICAgIHNvIHlvdSBkb24ndCBlbnRlciBlbmRsZXNzIGxvb3BzLCBzYXZlIG5ldHdvcmsgdHJhZmZpYyBhbmQgdGhlCisgICAgICAgIGxpa2UuCisKKyAgICAgICAgVGhlIHdpbmRvd3NpemUgaXMgYmVzdCBzYXZlZCBpbiB0aGUgcGxheWVycyBlbnZpcm9ubWVudAorICAgICAgICB2YXJpYWJsZXMgc28gdGhhdCBoZSBjYW4gbW9kaWZ5IHRoZW0gbGF0ZXIgb24uIChPciBpbiB0d28KKyAgICAgICAgaW50ZWdlcnMgaW4gdGhlIHBsYXllciBvYmplY3QuLi4pLiBVc2UgZm9yIHRoZXNlIHZhbHVlcyBpcworICAgICAgICBjbGVhciBJIHRoaW5rLgorCisgICAgICAgIFRoZSB0ZXJtaW5hbHR5cGVzIHJlY2VpdmVkIHVzaW5nIGFib3ZlIG1lbnRpb25lZCBtZXRob2QgYXJlCisgICAgICAgIGJlc3Qgc3RvcmVkIGluIGFuIGFycmF5LiBUaGUgYWN0dWFsIHNldCB0ZXJtaW5hbHR5cGUgaXMgYmVzdAorICAgICAgICBzdG9yZWQgaW4gYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgd2hlcmUgdGhlIHBsYXllciBjYW4gbW9kaWZ5CisgICAgICAgIGl0LiBVcG9uIG1vZGlmeWluZyBpdCB0aGUgSUFDIFNCIFRUWVBFIFNFTkQgSUFDIFNFIGN5Y2xlCisgICAgICAgIHNob3VsZCBiZSBzdGFydGVkIHRvIG1hdGNoIHRoZSBlbXVsYXRpb24gdG8gdGhlIGVudGVyZWQgbmV3CisgICAgICAgIHRlcm1pbmFsdHlwZS4gWW91IHRoZW4gbWF5IHVzZSBkYXRhIHJldHJpZXZlZCBmcm9tCisgICAgICAgIC9ldGMvdGVybWNhcCAobWFuIDUgdGVybWNhcCkgb3IgL3Vzci9saWIvdGVybWluZm8vKi8qIChTeXNWSUQsCisgICAgICAgIG1hbiA1IHRlcm1pbmZvKSB0byBpbXBsZW1lbnQgdGVybWluYWxjb250cm9sIGNvZGVzIGRlcGVuZGVuZAorICAgICAgICBvbiB0aGUgdGVybWluYWx0eXBlLiAvZXRjL3Rlcm1jYXAgbWF5IHByb3ZlIHRvIGJlIHRoZSBlYXNpZXN0CisgICAgICAgIHdheSB0b3VnaCAvdXNyL2xpYi90ZXJtaW5mby8qLyogaXMgdGhlIG5ld2VyIChhbmQgYmV0dGVyKSBTeXNWCisgICAgICAgIHdheSBvZiBkb2luZyBpdC4KKworICAgICAgICBbQW55b25lIGdvdCBhIGRlc2NyaXB0aW9uIG9mIHRoZSBpbnRlcm5hbCB0ZXJtaW5mbyBmb3JtYXQgZm9yCisgICAgICAgIG1lPyAtTWFyY3VzXQorCisgICAgICAgIExJTkVNT0RFIHJlcGxpZXMgbWF5IGJlIGxlZnQgYWxvbmUgaWYgb25seSB1c2luZyB0aGUgbW9kZQorICAgICAgICBjaGFuZ2UgdG8gTU9ERV9FRElUCisKKyAgICAgICAgU29tZSBzdGF0aXN0aWNzIGFib3V0IHdoYXQgY2xpZW50cyBzdXBwb3J0IHRlbG5ldCBuZWdvdGlhdGlvbnM6CisKKyAgICAgICAgVGlueWZ1Z3VlIGFuZCBzb21lIG90aGVyIG11ZGNsaWVudHMgdXN1YWxseSBkbyBub3Qgc3VwcG9ydAorICAgICAgICBuZWdvdGlhdGlvbnMuCisgICAgICAgIEV4Y2VwdCBmb3IgVEYsIHdoaWNoIHN1cHBvcnRzIHRoZSBUZWxuZXQgRW5kLU9mLVJlY29yZCBvcHRpb24KKyAgICAgICAgYXMgbWFya2VyIGZvciB0aGUgZW5kIG9mIHRoZSBwcm9tcHQuIFNvIGlmIHlvdSBzZW5kIElBQyBFT1IKKyAgICAgICAgYWZ0ZXIgZXZlcnkgcHJvbXB0LCBpdCB3aWxsIHByaW50IHRoZSBwcm9tcHQgYWx3YXlzIGluIHRoZQorICAgICAgICBpbnB1dCB3aW5kb3cuIChEbyBub3QgZm9yZ2V0IHRvIG5lZ290aWF0ZSB0aGF0LiBGaXJzdCBJQUMgV0lMTAorICAgICAgICBURUxPUFRfRU9SL3dhaXQgZm9yIElBQyBETyBURUxPUFRfRU9SKS4gTmV3ZXIgdmVyc2lvbnMgb2YKKyAgICAgICAgVEYgd2lsbCBzdXBwb3J0IE5BV1MgYW5kIHRoZXJlIHdpbGwgYmUgYSBwYXRjaCBmb3IgVFRZUEUKKyAgICAgICAgbmVnb3RpYXRpb24gYXZhaWxhYmxlIHNvb24uCisKKyAgICAgICAgQWxsIHRlbG5ldHMgYWJsZSB0byBkbyBuZWdvdGlhdGlvbnMgSSd2ZSBlbmNvdW50ZXJlZCBzdXBwb3J0CisgICAgICAgIHRoZSBUVFlQRSBvcHRpb24uCisgICAgICAgIEhQOS54LElyaXg1LngsTGludXgsRVAvSVgsQ1VURUxORVQvTkNTQVRFTE5FVCAoTm92ZWxsKSBhbmQKKyAgICAgICAgcGVyaGFwcyBtb3JlIHN1cHBvcnQgTkFXUy4KKyAgICAgICAgQXQgbGVhc3QgSXJpeDUueCxMaW51eCxDVS9OQ1NBVEVMTkVUIHN1cHBvcnQgTElORU1PREUuCisgICAgICAgIFNVTiBkb2VzIG5vdCBzdXBwb3J0IE5BV1MgYW5kIExJTkVNT0RFIG5laXRoZXIgaW4gU3VuT1MgNC4xLjMKKyAgICAgICAgbm9yIGluIFNvbGFyaXMgMi4zLgorCisgICAgICAgIEZvciBnZXR0aW5nIFJGQ3MgeW91IGNhbiBmb3IgZXhhbXBsZSB1c2UKKyAgICAgICAgZnRwOi8vZnRwLnVuaS1lcmxhbmdlbi5kZS9wdWIvZG9jL3JmYy8KKworCitCVUdTCisgICAgICAgIE5vdCBhbGwgYXNwZWN0cyBvZiB0aGUgb3B0aW9ucyBhcmUgbWVudGlvbmVkIHRvIGtlZXAgdGhpcyBkb2MKKyAgICAgICAgYXQgYSByZWFzb25hYmxlIHNpemUuIFJlZmVyIHRvIHRoZSBSRkNzIHRvIGdldCBtb3JlIGNvbmZ1c2VkLgorCitDUkVESVRTCisgICAgICAgIFByb3ZpZGVkIGJ5IE1hcmN1c0BUQVBQTXVkIChNYXJjdXMgTWVpc3NuZXIsCisgICAgICAgIDxtc21laXNzbkBjaXAuaW5mb3JtYXRpay51bmktZXJsYW5nZW4uZGU+KS4KZGlmZiAtLWdpdCBhL2RvYy9jb25jZXB0cy9uZXdzIGIvZG9jL2NvbmNlcHRzL25ld3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FjZWZiNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9jb25jZXB0cy9uZXdzCkBAIC0wLDAgKzEsODggQEAKK0NPTkNFUFQ6CisJbmV3cworCisKK0RFU0NSSVBUSU9OOgorCVRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBuZXdzIHN5c3RlbSB1c2VkIGluIE5pZ2h0ZmFsbC4KKwlOZXdzIGlzIGludGVuZGVkIHRvIHByb3ZpZGUgYSBnZW5lcmFsIHN5c3RlbSBmb3IgYnVsbGV0aW4KKwlib2FyZHMgYW5kIHNpbWlsYXIgb2JqZWN0cy4gSXQgaXMgc2ltaWxhciB0byB0aGUgVXNlbmV0CisJbmV3cyBzeXN0ZW0uIEFydGljbGVzIGFyZSBzdG9yZWQgaW4gYSBjZW50cmFsIGFyZWEsIC9uZXdzLgorCUFydGljbGVzIChNZXNzYWdlcykgYXJlIHN0b3JlZCBhcyBmaWxlcyB3aXRoaW4gdGhpcworCWRpcmVjdG9yeS4gT25seSB0aGUgbmV3cyBkZW1vbiBvYmplY3QgaXMgYWxsb3dlZCB0byB3cml0ZQorCWFuZCByZWFkIGluIHRoZSAvbmV3cyBkaXJlY3RvcnkuIEludGVyZmFjZWluZyB0byB0aGUKKwluZXdzIGRlbW9uIGlzIGRvbmUgdmlhIGludGVyZmFjZSBmdW5jdGlvbnMgaW4gdGhlIG5ld3MKKwlkZW1vbi4KKwkKKwlUeXBpY2FsbHkgbmV3cyBhcmUgcmVhZCBhbmQgd3JpdHRlbiBieSBhIGJ1bGxldGluCisJYm9hcmQgb2JqZWN0IG9yIGJ5IGEgbmV3c3JlYWRlci4gUGxheWVyIGJ1bGV0aW4gYm9hcmRzCisJc2hvdWxkIG9mIGNvdXJzZSBiZSBsaW1pdGVkIHRvIHNwZWNpZmljIG5ld3MgZ3JvdXBzLgorCUEgbmV3c3JlYWRlciBtaWdodCBiZSBpbnRlbGxpZ2VudCBpbiB0aGF0IGl0IGF1dG1hdGljYWxseQorCXNob3dzIG5ldyBtZXNzYWdlcy4gR3JvdXBzIG1heSBiZSBtb2RlcmF0ZWQsIHRoZW4gb25seSB0aGUKKwltb2RlcmF0b3IgY2FuIHdyaXRlIHRoZXJlLiBUaGVyZSBhcmUgYWxzbyBmbGFncyB3aGV0aGVyIGEKKwlib2FyZCBpcyBhIHdpel9vbmx5IGJvYXJkIGFuZCB3aG8gbWF5IHJlbW92ZSBtZXNzYWdlcy4KKworCVNlY3VyaXR5IGlzIGluIHNldmVyYWwgbGV2ZWxzLiBJdCBtYXkgYmUgMCwgdGhlbiBldmVyeQorCWVmZmVjdGl2ZSB1c2VyaWQgbWlnaHQgcmVhZCBhbmQgd3JpdGUgYW5kIGRlbGV0ZSBhcnRpY2xlcywKKwlhbHRob3VnaCB0aGUgbmV3cyBkZW1vbiB3aWxsIHN0aWxsIGxvb2sgZm9yIHRoZSBtYXRjaCBvZgorCXRoZSBzZW5kZXIgZmllbGQgd2l0aCBjZXJ0YWluIGdyb3VwIHJlcXVpcmVtZW50cy4gVGhpcyBsZXZlbAorCW9mIHNlY3VyaXR5IGlzIHRvIG1ha2UgaXQgcG9zc2libGUgdG8gY3JlYXRlIGdyb3VwcworCWFjY2Vzc2libGUgYnkgYnVsbGV0aW4gYm9hcmRzIHdoaWNoIGhhdmUgbm8gZXVpZC4KKworCVNlY3VyaXR5IGxldmVsIDEgbWVhbnMgdGhhdCBldWlkIGNoZWNrIGlzIGRvbmUsIGZvciByZWFkaW5nCisJYW5kIHdyaXRpbmcuIFRoaXMgc3RpbGwgYWxsb3dzIGZvciBidWxsdGluIGJvYXJkcywgYnV0IHRob3NlCisJbXVzdCBoYXZlIHJvb3QgZXVpZCBhbmQgdGh1cyB0aGUgYWJpbGl0eSB0byBzZXRldWlkIHRvIHRoZQorCWV1aWQgb2YgdGhlIG9iamVjdCB1c2luZyB0aGUgYnVsbGV0aW4gYm9hcmQgKG5vcm1hbGx5IHRoZQorCXBsYXllcikuIFRoaXMgZmVhdHVyZSByZXF1aXJlcyBuYXRpdmUgZ2FtZWRyaXZlciBtb2RlLgorCisJU2F2ZWQgbmV3cyBmaWxlIGZvcm1hdCAoZm9ybWFsIG5vdGF0aW9uKToKKworCWludCBzZWN1cml0eTsJLyogd2hldGVyIGV1aWQgY2hlY2sgaXMgZG9uZSwgMCBvciAxICovCisJbWl4ZWQgKmFjY2Vzc2xpc3QgPSAoeworCSAgIG1peGVkICpyZWFkYWNjZXNzOyAgICAvKiB3aG8gY2FuIHJlYWQgbWVzc2FnZXMgKi8KKwkgICBtaXhlZCAqd3JpdGVhY2Nlc3M7ICAgLyogd2hvIGNhbiB3cml0ZSBtZXNzYWdlcyAqLworCSAgIG1peGVkICpkZWxldGVhY2Nlc3M7ICAvKiB3aG8gY2FuIGRlbGV0ZSBtZXNzYWdlcyAqLworCSAgIG1peGVkICpjb250cm9sYWNjZXNzOyAvKiB3aG8gY2FuIGNvbnRyb2wgdGhlIGFjY2Vzc2xpc3QgKi8KKwl9KQorCW1peGVkICptZXNzYWdlcyA9ICh7CisJICAgbWl4ZWQgKm1zZzE7IG1peGVkICptc2cyOyAuLi4gbWl4ZWQgKm1zZ047CisJfSkKKworCUFuIGFjY2VzcyBlbnRyeSBjYW4gYmUgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisJLSBhbiBlZmZlY3RpdmUgdXNlcmlkIChzdHJpbmcpCisJLSBvbmUgb2YgdGhlIGtleXdvcmRzICJ3aXphcmQiLCAiYWxsIiwgImF1dGhvciIKKwktIGEgd2l6YXJkIGxldmVsIChpbnRlZ2VyKSB3aGljaCBpcyByZXF1aXJlZCBtaW5pbWFsCisJLSBhbiBhcnJheSBvZiBvbmUgb2YgdGhlIHBsYWluIHR5cGVzIGFib3ZlIChBbHRlcm5hdGl2ZSkuCisKKwlBIG1lc3NhZ2UgbG9va3MgYXMgZm9sbG93czoKKworCW1peGVkICptZXNzYWdlID0gKHsKKwkgICBzdHJpbmcgYXV0aG9yOyAgICAgICAvKiB3aG8gd3JvdGUgdGhlIG1lc3NhZ2UgKi8KKwkgICBzdHJpbmcgc3ViamVjdDsgICAgICAvKiB0aGUgc3ViamVjdCAqLworCSAgIHN0cmluZyAqZ3JvdXBzOyAgICAgIC8qIG5ld3MgZ3JvdXBzIHdoZXJlIHRoaXMgd2FzIHBvc3RlZCAqLworCSAgIGludCBkYXRlOyAgICAgICAgICAgIC8qIGRhdGUgb2YgbWVzc2FnZSB3cml0dGVuICovCisJICAgc3RyaW5nIG1lc3NhZ2VpZDsgICAgLyogYSB1bmlxdWUgc3RyaW5nICovCisJICAgc3RyaW5nICpyZWZlcmVuY2VpZDsgLyogbGlzdCBvZiByZWZlcmVuY2VzICovCisJICAgaW50IGV4cGlyZTsgICAgICAgICAgLyogd2hlbiBtZXNzYWdlIGV4cGlyZXMgKi8KKwkgICBzdHJpbmcgYm9keTsgICAgICAgICAvKiB0aGUgY29udGVudHMgb2YgdGhlIG1lc3NhZ2UgKi8KKwl9KQorCisJVGhlIG5ld3MgZGVtb24gKC9zZWN1cmUvbmV3cywgb3IgL29iai9uZXdzKSBwcm92aWRlcyB0aGUKKwlmb2xsb3dpbmcgZnVuY3Rpb25zOgorCisJaW50IHN1Y2Nlc3MgPSBQb3N0TWVzc2FnZShtaXhlZCAqbWVzc2FnZSkKKwkgIFRlbGxzIHRoZSBkZW1vbiB0byBpbnNlcnQgdGhlIG1lc3NhZ2UgaW4gdGhlIG5ld3MgZGF0YWJhc2UuCisJICBEZXBlbmRpbmcgb24gc2VjdXJpdHkgbGV2ZWwsIGV1aWQgb3IgbWVzc2FnZS5hdXRob3IgaXMKKwkgIGNoZWNrZWQgaWYgdGhpcyBpcyBhbGxvd2VkLgorCisJaW50IHN1Y2Nlc3MgPSBEZWxldGVNZXNzYWdlKHN0cmluZyAqZ3JvdXBzLCBzdHJpbmcgbWVzc2FnZWlkKQorCSAgUmVtb3ZlIGEgbWVzc2FnZSBmcm9tIHRoZSBkYXRhYmFzZS4KKworCW1peGVkICptZXNzYWdlbGlzdCA9IFJlYWRNZXNzYWdlSGVhZGVycyhzdHJpbmcgZ3JvdXApCisJICBHZXQgYWxsIG1lc3NhZ2UgaGVhZGVycyAoY29tcGxldGUgaW5mbywgYnV0IHdpdGhvdXQKKwkgIGJvZHkpIG9mIG5ld3Nncm91cCA8Z3JvdXA+LgorCisJbWl4ZWQgKm1lc3NhZ2UgPSBSZWFkTWVzc2FnZShzdHJpbmcgKmdyb3Vwcywgc3RyaW5nIG1lc3NhZ2VpZCkKKwkgIFJldHJpZXZlIGEgbWVzc2FnZSBmcm9tIHRoZSBkYXRhYmFzZS4KKworCitTRUUgQUxTTzoKZGlmZiAtLWdpdCBhL2RvYy9jb25jZXB0cy9vYmplY3RzIGIvZG9jL2NvbmNlcHRzL29iamVjdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjljN2ViOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9jb25jZXB0cy9vYmplY3RzCkBAIC0wLDAgKzEsMjUgQEAKK0NPTkNFUFQKKyAgICAgICAgb2JqZWN0cworCitMQVNUIFVQREFURUQKKyAgICAgICAgbmV2ZXIKKworREVTQ1JJUFRJT04KKyAgICAgICAgQW4gb2JqZWN0IGNvbnNpc3RzIG9mIGEgY29sbGVjdGlvbiBvZiBmdW5jdGlvbnMgKGFsc28gY2FsbGVkCisgICAgICAgICdtZXRob2RzJykgYW5kIGRhdGEgKHZhcmlhYmxlcykgb24gd2hpY2ggdGhlIGZ1bmN0aW9ucyBvcGVyYXRlLgorICAgICAgICBUaGUgb25seSB3YXkgdG8gbWFuaXB1bGF0ZSB0aGUgZGF0YSBjb250YWluZWQgaW4gYW4gb2JqZWN0IGlzCisgICAgICAgIHZpYSBvbmUgb2YgdGhlIGZ1bmN0aW9ucyBkZWZpbmVkIGJ5IHRoZSBvYmplY3QuCisKKyAgICAgICAgRXZlcnkgc2luZ2xlIHRoaW5nIGluIGEgbXVkIGlzIGFuIG9iamVjdC4gIFJvb21zIGFyZSBvYmplY3RzLgorICAgICAgICBXZWFwb25zIGFyZSBvYmplY3RzLiAgRXZlbiB5b3VyIGNoYXJhY3RlciBpcyBhbiBvYmplY3QgKGEgc3BlY2lhbAorICAgICAgICBraW5kIG9mIG9iamVjdCBjYWxsZWQgImludGVyYWN0aXZlIiBidXQgc3RpbGwgYW4gb2JqZWN0IGluIG1vc3QKKyAgICAgICAgZXZlcnkgcmVzcGVjdCkuICBFYWNoIG9iamVjdCAoZXhjZXB0IHBvc3NpYmx5IHZpcnR1YWwgb2JqZWN0cykgaW4KKyAgICAgICAgdGhlIG11ZCBpcyBhc3NvY2lhdGVkIHdpdGggc29tZSBmaWxlIHdyaXR0ZW4gaW4gTFBDIChpbiB0aGUgbXVkJ3MKKyAgICAgICAgZGlyZWN0b3J5IHN0cnVjdHVyZSkgdGhhdCBkZXNjcmliZXMgaG93IHRoZSBvYmplY3QgaXMgdG8gaW50ZXJhY3QKKyAgICAgICAgd2l0aCB0aGUgZ2FtZWRyaXZlciBhbmQgdGhlIHJlc3Qgb2YgdGhlIG9iamVjdHMgaW4gdGhlIG11ZC4KKworQVVUSE9SCisgICAgICAgIFNvbWVvbmUKKworU0VFIEFMU08KKyAgICAgICAgZmlsZXMoQyksIGluaGVyaXRhbmNlKEMpLCBjcmVhdGUoQSksIHJlc2V0KEEpCmRpZmYgLS1naXQgYS9kb2MvY29uY2VwdHMvb29wIGIvZG9jL2NvbmNlcHRzL29vcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTQ2YTdlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2NvbmNlcHRzL29vcApAQCAtMCwwICsxLDc2IEBACitPT1AKKyBCRVNDSFJFSUJVTkc6CisgICAgIE9PUCBzdGVodCBmdWVyICJPYmplY3QtT3JpZW50aWVydGUgUHJvZ3JhbW1pZXJ1bmciOgorCisgICAgIFdlbm4gZHUgd2Vpc3N0LCB3aWUgbWFuIGluIGVpbmVyIHByb3plZHVyYWxlbiBTcHJhY2hlIHByb2dyYW1taWVydAorICAgICAoQywgUEFTQ0FMLCBCQVNJQyksIGRhbm4gaGFzdCBkdSBiZXJlaXRzIHZpZWxlIGRlciBGYWVoaWdrZWl0ZW4sIGRpZQorICAgICBub2V0aWcgc2luZCB1bSBlZmZla3RpdiBpbiBMUEMgenUgUHJvZ3JhbW1pZXJlbi4gRGllIEhhdXB0ZmFlaGlna2VpdCwKKyAgICAgZGllIGR1IGJyYXVjaGVuIHdpcnN0LCBpc3QgZGllIEJlZ2FidW5nIGRlaW5lIElkZWVuIGluIGVpbmUgUmVpaGUgdm9uCisgICAgIFNjaHJpdHRlbiB6dSB1bnRlcnRlaWxlbiwgc28gZGFzcyBkZXIgQ29tcHV0ZXIgZGllc2UgZnVlciBkaWNoCisgICAgIGF1c2Z1ZWhyZW4ga2Fubi4KKworICAgICBMUEMgaXN0IGFiZXIgYXVjaCBlaW5lIChpbXBlcmF0aXZlLCBzdHJ1a3R1cmllcnRlKSBvYmpla3RvcmllbnRpZXJ0ZQorICAgICBTcHJhY2hlLiBPT1AgaGFlbHQgZGF6dSBhbiwgc2ljaCB6dWVyc3QgdW0gZGllIERhdGVuIHp1IGt1ZW1tZXJuIHVuZAorICAgICBkYW5uIHVtIGRpZSBNZXRob2RlbiBtaXQgZGVuZW4gZGllc2UgRGF0ZW4gbWFuaXB1bGllcnQgd2VyZGVuOgorICAgICBFaW4gU3BpZWxlciBpc3QgenVlcnN0IGVpbm1hbCBlaW4gSGF1ZmVuIHZvbiBBdHRyaWJ1dGVuIHVuZCBQdW5rdGVuCisgICAgIHVuZCBzZWluZW0gTmFtZW4sIHdpZSBhdWYgZGllc2UgZWluZ2V3aXJrdCB3ZXJkZW4ga2FubiB3aXJkIGRhbmFjaAorICAgICBnZWtsYWVydC4gRWluIFNwaWVsZXJvYmpla3Qga29tbXVuaXppZXJ0IHVuZCBrb29wZXJpZXJ0IG1pdCB2aWVsZW4KKyAgICAgYW5kZXJlbiBPYmpla3RlbiBoaWVyLgorCisgICAgIEltIEZvbGdlbmRlbiBzaW5kIGVpbmlnZSBkZXIgS3JpdGVyaWVuIG9iamVrdG9yaWVudGllcnRlciBQcm9ncmFtbWllcnVuZworICAgICBhdWZnZWZ1ZWhydDoKKworICAgICBLbGFzc2VuOgorCUVpbmUgS2xhc3NlIGJlc2NocmVpYnQgZGFzIFZlcmhhbHRlbiBlaW5lciBHcnVwcGUgZ2xlaWNoYXJ0aWdlcgorCU9iamVrdGUuIEJlaXNwaWVsc3dlaXNlIGthbm4gbWFuIExlYmV3ZXNlbiBhbHMgZWluZSBLbGFzc2UgYW5zZWhlbiwKKwl3ZWlsIG1hbiBhbGxlIE9iamVrdGUgaW4gTGViZXdlc2VuIHVuZCBuaWNodC1MZWJld2VzZW4gZWludGVpbGVuCisJa2Fubi4gSGF0IG1hbiBlaW5lbiBrb25rcmV0ZXMgTW9uc3RlciB1bmQgZWluZW4ga29ua3JldGVuIFNwaWVsZXIgaW4KKwllaW5lbSBSYXVtLCBkYW5uIHNpbmQgZGllcyBPYmpla3RlIChJbnN0YW56ZW4pLiBNYW4ga2FubiB2b24gZWluZXIKKwlNZW5nZSBnbGVpY2hhcnRpZ2VyIE9iamVrdGUgc2FnZW4sIGRhc3Mgc2llIHp1IGVpbi0gdW5kIGRlcnNlbGJlbgorCUtsYXNzZSBnZWhvZXJlbi4gCisKKyAgICAgQWJzdHJha3Rpb246CisJSmVkZXMgT2JqZWt0IGltIFN5c3RlbSB2ZXJrb2VycGVydCBhbHMgYWJzdHJha3RlcyBNb2RlbGwgZWluZW4KKwkiQXJiZWl0ZXIiLCBkZXIgQXVmdHJhZWdlIGVybGVkaWdlbiBrYW5uLCBzZWluZW4gWnVzdGFuZCBiZXJpY2h0ZW4KKwl1bmQgYWVuZGVybiBrYW5uIHVuZCBtaXQgZGVuIGFuZGVyZW4gT2JqZWt0ZW4gaW0gU3lzdGVtIGtvbW11bml6aWVyZW4KKwlrYW5uLCBvaG5lIG9mZmVuIHp1IGxlZ2VuLCB3aWUgZGllc2Ugc2VpbmUgRmFlaGlna2VpdGVuIGltcGxlbWVudGllcnQKKwlzaW5kLgorCVtTbyBrYW5uIG1hbiBlaW5lbSBPYmpla3QgZGVuIEF1ZnRyYWcgRGVmZW5kKDEwMDAsIERUX0ZJUkUsIC4uLikKKwkgZ2ViZW4uIEluIE1HIHdlcmRlbiBsZWJlbmRlIE9iamVrdGUgZGllc2VuIEF1ZnRyYWcgZHVyY2ggQWVuZGVydW5nCisJIGlocmVzIFp1c3RhbmRlcyAtIExQLUFienVnIG9kZXIgTWFnaWVyZWFrdGlvbiAtIGVyZnVlbGxlbi5dCisKKyAgICAgS2Fwc2VsdW5nCisJQXVjaCBkYXMgIlZlcmJlcmdlbiB2b24gSW5mb3JtYXRpb24iIGdlbmFubnQsIHNvcmd0IEsuIGRhZnVlciwgZGFzcworCU9iamVrdGUgZGVuIGludGVybmVuIFp1c3RhbmQgYW5kZXJlciBPYmpla3RlIG5pY2h0IGluIHVuZXJ3YXJ0ZXRlcgorCVdlaXNlIGFlbmRlcm4ga29lbm5lbjsgbnVyIGRlbiBlaWdlbmVuIE1ldGhvZGVuIGVpbmVzIE9iamVrdGVzIHNvbGwKKwllcyBlcmxhdWJ0IHNlaW4sIGF1ZiBkZW4gaW50ZXJuZW4gWnVzdGFuZCBkaXJla3QgenV6dWdyZWlmZW4uIEFsbGUKKwlTb3J0ZW4gdm9uIE9iamVrdGVuIHByYWVzZW50aWVyZW4gbmFjaCBhdXNzZW4gU2Nobml0dHN0ZWxsZW4gKG1hbgorCXByb3BlcnRpZXMpLCBkaWUgZGFydWViZXIgYmVzdGltbWVuLCB3aWUgYW5kZXJlIE9iamVrdGUgbWl0IGlobmVuCisJd2VjaHNlbHdpcmtlbiBrb2VubmVuLgorCVtTaWVoZSB2b3IgYWxsZW0gbWFuIHByb3BlcnRpZXNdCisJCisgICAgIFBvbHltb3JwaGllCisJWmVpZ2VyIHp1IE9iamVrdGVuIGtvZW5uZW4gZXMgbWl0IHNpY2ggYnJpbmdlbiwgZGFzcyBiZWkgZGVyIEF1c3dhaGwKKwllaW5lcyBrb25rcmV0ZW4gT2JqZWt0ZXMgc2VpbmUgS2xhc3NlIChzZWluIFR5cCkgbmljaHQgb2ZmZW5zaWNodGxpY2gKKwlpc3QuIFRyb3R6ZGVtIHdlcmRlbiBOYWNocmljaHRlbiBhbiBzbyBzZWxla3RpZXJ0ZSBPYmpla3RlIGtvcnJla3QKKwlkZXIgdGF0c2FlY2hsaWNoZW4gS2xhc3NlIHp1Z2VvcmRuZXQuIFdlbm4gZGllc2UgWnVvcmRudW5nIGVyc3QgenVyCisJTGF1ZnplaXQgYXVmZ2Vsb2VzdCB3aXJkLCBkYW5uIHdpcmQgZGllc2VzIFZlcmhhbHRlbiBQb2x5bW9ycGhpc211cworCShhdWNoOiBzcGFldGUgQmluZHVuZyBvZGVyIGR5bmFtaXNjaGUgQmluZHVuZykgZ2VuYW5udC4KKwlbSW4gTFBDIGlzdCBkeW5hbWlzY2hlIEJpbmR1bmcgZGVyIFN0YW5kYXJkLiBVZWJlcnNjaHJlaWJ0IG1hbiBhbHNvCisJIGluIGVpbmVtIE5QQyBkaWUoKSwgZGFubiB3aXJkIGF1ZiBqZWRlbiBGYWxsIGRpZSBuZXVlIE1ldGhvZGUKKwkgYXVmZ2VydWZlbiwgd2VubiBkZXIgTlBDIGF1cyBkb19kYW1hZ2UoKSBoZXJhdXMgaW4gc2ljaCBkaWUoKSBydWZ0Ll0KKworICAgICBWZXJlcmJ1bmcKKwlPcmdhbmlzaWVydCB1bmQgZXJsZWljaHRlcnQgUG9seW1vcnBoaWUsIGluZGVtIG5ldWUgT2JqZWt0ZSBkZWZpbmllcnQKKwl1bmQgZXJ6ZXVndCB3ZXJkZW4ga29lbm5lbiwgZGllIFNwZXppYWxpc2llcnVuZ2VuIHNjaG9uIGV4aXN0aWVyZW5kZXIKKwlPYmpla3RlIHNpbmQuIFNvbGNoZSBuZXVlbiBPYmpla3RlIGtvZW5uZW4gZGFzIHZvcmhhbmRlbmUgVmVyaGFsdGVuCisJdWViZXJuZWhtZW4gdW5kIGVyd2VpdGVybiwgb2huZSBkYXNzIGRpZXNlcyBVcnZlcmhhbHRlbiBuZXUKKwlpbXBsZW1lbnRpZXJ0IHdlcmRlbiBtdXNzLiBUeXBpc2NoZXJ3ZWlzZSB3aXJkIGRhcyBkYWR1cmNoIGVycmVpY2h0LAorCWRhc3MgT2JqZWt0ZSB6dSBLbGFzc2VuIHVuZCB6dSBIaWVyYXJjaGllbiB2b24gS2xhc3NlbiBncnVwcGllcnQKKwl3ZXJkZW4sIGluIGRlbmVuIHNpY2ggZGllIEdlbWVpbnNhbWtlaXRlbiBpbSBWZXJoYWx0ZW4gYXVzZHJ1ZWNrZW4uCisJW1NpZWhlIG1hbiB2ZXJlcmJ1bmddCisKKyBTSUVIRSBBVUNIOgorICAgICBvYmpla3RlLCBpbmhlcml0YW5jZSwgZ29vZHN0eWxlCisKKyAyMi4gTWFlcnogMjAwNCBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL2NvbmNlcHRzL292ZXJsb2FkaW5nIGIvZG9jL2NvbmNlcHRzL292ZXJsb2FkaW5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MjA5ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvY29uY2VwdHMvb3ZlcmxvYWRpbmcKQEAgLTAsMCArMSw0OCBAQAorQ09OQ0VQVAorICAgICAgICBvdmVybG9hZGluZworCitERVNDUklQVElPTgorICAgICAgICBUaGlzIGNvbmNlcHQgaXMgc3Ryb25nbHkgY29ubmVjdGVkIHdpdGggdGhlIGNvbmNlcHQgb2YgaW5oZXJpdGFuY2UuCisgICAgICAgIEEgZnVuY3Rpb24gaXMgY2FsbGVkICdvdmVybG9hZGVkJyBpZiBpdCBpcyBkZWZpbmVkIG1vcmUgdGhhbiBvbmNlCisgICAgICAgIGluIGFuIG9iamVjdC4gVGhpcyBjYW4gaGFwcGVuIGlmIHRoZSBvYmplY3QgaW5oZXJpdHMgb3RoZXIgb2JqZWN0cworICAgICAgICB3aGljaCBoYXZlIGRlZmluZWQgYSBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIG5hbWUuCisgICAgICAgIFVzdWFsbHkgdGhlIG92ZXJsb2FkaW5nIGlzIHdhbnRlZCBhbmQgaW50ZW5kZWQgYnkgdGhlIGluaGVyaXRpbmcKKyAgICAgICAgb2JqZWN0IHRvIGNoYW5nZSB0aGUgYmVoYXZpb3VyIG9mIHRoZSBmdW5jdGlvbiBpdCBvdmVybG9hZHMuCisgICAgICAgIFRvIGNhbGwgdGhlIG92ZXJsb2FkZWQgZnVuY3Rpb25zIGZyb20gdGhlIG92ZXJsb2FkaW5nIG9iamVjdCB0aGUKKyAgICAgICAgOjotb3BlcmF0b3IgaXMgdXNlZC4KKyAgICAgICAgRnJvbSBvdXRzaWRlIHRoZSBvYmplY3Qgb25seSBvbmUgb2YgdGhlIGZ1bmN0aW9ucyBjYW4gYmUgY2FsbGVkCisgICAgICAgIHZpYSBjYWxsX290aGVyKCkgb3IgdGhlIGxpa2U7IHRoaXMgd2lsbCBiZSB0aGUgdG9wbW9zdCBvZiBhbGwKKyAgICAgICAgb3ZlcmxvYWRlZCBmdW5jdGlvbnMuCisKKyAgICAgICAgTm9ybWFsbHkgYW4gb3ZlcmxvYWRpbmcgZnVuY3Rpb24gaXMgZGVjbGFyZWQgdGhlIHNhbWUgd2F5IGFzIHRoZQorICAgICAgICBvdmVybG9hZGVkIGZ1bmN0aW9uLCB0aGlzIG1lYW5zIGl0IGhhcyB0aGUgc2FtZSBudW1iZXIgYW5kIHR5cGVzCisgICAgICAgIG9mIGFyZ3VtZW50cy4gSWYgYW4gb2JqZWN0IHdhbnRzIHRvIGNoYW5nZSB0aGUgYmVoYXZpb3VyIG9mIHRoZQorICAgICAgICBmdW5jdGlvbiBpbiBhIHdheSB0aGF0IGl0IGNhbiBnZXQgbW9yZSBhcmd1bWVudHMgdGhhbiB0aGUgb3JpZ2luYWwKKyAgICAgICAgZnVuY3Rpb24sIGl0IGhhcyB0byB1c2UgdGhlIG1vZGlmaWVyICd2YXJhcmdzJyBvciBhIGNvbXBpbGVyIGVycm9yCisgICAgICAgIHdpbGwgYmUgcmFpc2VkLgorCitFWEFNUExFCisgICAgICAgIEZpbGUgL3BsYXllcnMvYWxmZS9hLmM6CisKKyAgICAgICAgICAgIGZvbygpIHsgd3JpdGUoIkEiKTsgfQorCisgICAgICAgIEZpbGUgL3BsYXllcnMvYWxmZS9iLmM6CisKKyAgICAgICAgICAgIGZvbygpIHsgd3JpdGUoIkIiKTsgfQorCisgICAgICAgIEZpbGUgL3BsYXllcnMvYWxmZS9jLmM6CisKKyAgICAgICAgICAgIGluaGVyaXQgInBsYXllcnMvYWxmZS9hIjsKKyAgICAgICAgICAgIGluaGVyaXQgInBsYXllcnMvYWxmZS9iIjsKKworICAgICAgICAgICAgZm9vKCkgeworICAgICAgICAgICAgICBhOjpmb28oKTsKKwkgICAgICBiOjpmb28oKTsKKwkgICAgICB3cml0ZSgiQyIpOworCSAgICB9CisKKwlUbyBjYWxsICJwbGF5ZXJzL2FsZmUvYyItPmZvbygpIHdpbGwgbm93IHJlc3VsdCBpbiB0aGUgb3V0cHV0IG9mCisJQUJDLgorCitTRUUgQUxTTworICAgICAgICBtb2RpZmllcnMoTFBDKSwgaW5oZXJpdGFuY2UoQyksIGZ1bmN0aW9ucyhMUEMpCmRpZmYgLS1naXQgYS9kb2MvY29uY2VwdHMvcGNyZSBiL2RvYy9jb25jZXB0cy9wY3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NjNmZmQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvY29uY2VwdHMvcGNyZQpAQCAtMCwwICsxLDE0MjIgQEAKK1NZTk9QU0lTCisgICAgICAgIFBDUkUgLSBQZXJsLWNvbXBhdGlibGUgcmVndWxhciBleHByZXNzaW9ucworCisKK0RFU0NSSVBUSU9OCisgICAgICAgIFRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSByZWd1bGFyIGV4cHJlc3Npb25zIHN1cHBvcnRlZCBieSB0aGUKKyAgICAgICAgUENSRSBwYWNrYWdlLiBXaGVuIHRoZSBwYWNrYWdlIGlzIGNvbXBpbGVkIGludG8gdGhlIGRyaXZlciwgdGhlCisgICAgICAgIG1hY3JvIF9fUENSRV9fIGlzIGRlZmluZWQuCisKKyAgICAgICAgTW9zdCBvZiB0aGlzIG1hbnBhZ2UgaXMgbGlmdGVkIGRpcmVjdGx5IGZyb20gdGhlIG9yaWdpbmFsIFBDUkUKKyAgICAgICAgbWFucGFnZSAoZGF0ZWQgSmFudWFyeSAyMDAzKS4KKworICAgICAgICBUaGUgUENSRSBsaWJyYXJ5IGlzIGEgc2V0IG9mIGZ1bmN0aW9ucyB0aGF0IGltcGxlbWVudCAgcmVndWxhcgorICAgICAgICBleHByZXNzaW9uICBwYXR0ZXJuICBtYXRjaGluZyB1c2luZyB0aGUgc2FtZSBzeW50YXggYW5kIHNlbWFudGljcworICAgICAgICBhcyBQZXJsICA1LCAgd2l0aCAganVzdCAgYSAgZmV3ICBkaWZmZXJlbmNlcyAgKHNlZSBiZWxvdykuICBUaGUKKyAgICAgICAgY3VycmVudCAgaW1wbGVtZW50YXRpb24gIGNvcnJlc3BvbmRzICB0byAgUGVybCA1LjAwNSwgd2l0aCBzb21lCisgICAgICAgIGFkZGl0aW9uYWwgZmVhdHVyZXMgIGZyb20gIGxhdGVyICB2ZXJzaW9ucy4gIFRoaXMgIGluY2x1ZGVzICBzb21lCisgICAgICAgIGV4cGVyaW1lbnRhbCwgIGluY29tcGxldGUgIHN1cHBvcnQgZm9yIFVURi04IGVuY29kZWQgc3RyaW5ncy4KKyAgICAgICAgRGV0YWlscyBvZiBleGFjdGx5IHdoYXQgaXMgIGFuZCAgd2hhdCBpcyBub3Qgc3VwcG9ydGVkIGFyZSBnaXZlbgorICAgICAgICBiZWxvdy4KKworCitQQ1JFIFJFR1VMQVIgRVhQUkVTU0lPTiBERVRBSUxTCisKKyAgICAgICBUaGUgIHN5bnRheCAgYW5kIHNlbWFudGljcyBvZiB0aGUgcmVndWxhciBleHByZXNzaW9ucyBzdXBwb3J0ZWQgYnkgUENSRQorICAgICAgIGFyZSBkZXNjcmliZWQgYmVsb3cuIFJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIGFsc28gZGVzY3JpYmVkIGluIHRoZSBQZXJsCisgICAgICAgZG9jdW1lbnRhdGlvbiAgYW5kIGluIGEgbnVtYmVyIG9mIG90aGVyIGJvb2tzLCBzb21lIG9mIHdoaWNoIGhhdmUgY29waS0KKyAgICAgICBvdXMgZXhhbXBsZXMuIEplZmZyZXkgRnJpZWRsJ3MgIk1hc3RlcmluZyAgUmVndWxhciAgRXhwcmVzc2lvbnMiLCAgcHViLQorICAgICAgIGxpc2hlZCAgYnkgIE8nUmVpbGx5LCBjb3ZlcnMgdGhlbSBpbiBncmVhdCBkZXRhaWwuIFRoZSBkZXNjcmlwdGlvbiBoZXJlCisgICAgICAgaXMgaW50ZW5kZWQgYXMgcmVmZXJlbmNlIGRvY3VtZW50YXRpb24uCisKKyAgICAgICBUaGUgYmFzaWMgb3BlcmF0aW9uIG9mIFBDUkUgaXMgb24gc3RyaW5ncyBvZiBieXRlcy4gSG93ZXZlciwgIHRoZXJlICBpcworICAgICAgIGFsc28gIHN1cHBvcnQgZm9yIFVURi04IGNoYXJhY3RlciBzdHJpbmdzLiBUbyB1c2UgdGhpcyBzdXBwb3J0IHlvdSBtdXN0CisgICAgICAgYnVpbGQgUENSRSB0byBpbmNsdWRlIFVURi04IHN1cHBvcnQsIGFuZCB0aGVuIGNhbGwgcGNyZV9jb21waWxlKCkgIHdpdGgKKyAgICAgICB0aGUgIFBDUkVfVVRGOCAgb3B0aW9uLiAgSG93ICB0aGlzIGFmZmVjdHMgdGhlIHBhdHRlcm4gbWF0Y2hpbmcgaXMgbWVuLQorICAgICAgIHRpb25lZCBpbiBzZXZlcmFsIHBsYWNlcyBiZWxvdy4gVGhlcmUgaXMgYWxzbyBhIHN1bW1hcnkgb2YgIFVURi04ICBmZWEtCisgICAgICAgdHVyZXMgaW4gdGhlIHNlY3Rpb24gb24gVVRGLTggc3VwcG9ydCBpbiB0aGUgbWFpbiBwY3JlIHBhZ2UuCisKKyAgICAgICBBICByZWd1bGFyICBleHByZXNzaW9uICBpcyAgYSBwYXR0ZXJuIHRoYXQgaXMgbWF0Y2hlZCBhZ2FpbnN0IGEgc3ViamVjdAorICAgICAgIHN0cmluZyBmcm9tIGxlZnQgdG8gcmlnaHQuIE1vc3QgY2hhcmFjdGVycyBzdGFuZCBmb3IgIHRoZW1zZWx2ZXMgIGluICBhCisgICAgICAgcGF0dGVybiwgIGFuZCAgbWF0Y2ggIHRoZSBjb3JyZXNwb25kaW5nIGNoYXJhY3RlcnMgaW4gdGhlIHN1YmplY3QuIEFzIGEKKyAgICAgICB0cml2aWFsIGV4YW1wbGUsIHRoZSBwYXR0ZXJuCisKKyAgICAgICAgIFRoZSBxdWljayBicm93biBmb3gKKworICAgICAgIG1hdGNoZXMgYSBwb3J0aW9uIG9mIGEgc3ViamVjdCBzdHJpbmcgdGhhdCBpcyBpZGVudGljYWwgdG8gaXRzZWxmLiAgVGhlCisgICAgICAgcG93ZXIgb2YgcmVndWxhciBleHByZXNzaW9ucyBjb21lcyBmcm9tIHRoZSBhYmlsaXR5IHRvIGluY2x1ZGUgYWx0ZXJuYS0KKyAgICAgICB0aXZlcyBhbmQgcmVwZXRpdGlvbnMgaW4gdGhlIHBhdHRlcm4uIFRoZXNlIGFyZSBlbmNvZGVkIGluIHRoZSAgcGF0dGVybgorICAgICAgIGJ5ICB0aGUgIHVzZSAgb2YgbWV0YS1jaGFyYWN0ZXJzLCB3aGljaCBkbyBub3Qgc3RhbmQgZm9yIHRoZW1zZWx2ZXMgYnV0CisgICAgICAgaW5zdGVhZCBhcmUgaW50ZXJwcmV0ZWQgaW4gc29tZSBzcGVjaWFsIHdheS4KKworICAgICAgIFRoZXJlIGFyZSB0d28gZGlmZmVyZW50IHNldHMgb2YgbWV0YS1jaGFyYWN0ZXJzOiB0aG9zZSB0aGF0IGFyZSAgcmVjb2ctCisgICAgICAgbml6ZWQgIGFueXdoZXJlIGluIHRoZSBwYXR0ZXJuIGV4Y2VwdCB3aXRoaW4gc3F1YXJlIGJyYWNrZXRzLCBhbmQgdGhvc2UKKyAgICAgICB0aGF0IGFyZSByZWNvZ25pemVkIGluIHNxdWFyZSBicmFja2V0cy4gT3V0c2lkZSAgc3F1YXJlICBicmFja2V0cywgIHRoZQorICAgICAgIG1ldGEtY2hhcmFjdGVycyBhcmUgYXMgZm9sbG93czoKKworICAgICAgICAgXCAgICAgIGdlbmVyYWwgZXNjYXBlIGNoYXJhY3RlciB3aXRoIHNldmVyYWwgdXNlcworICAgICAgICAgXiAgICAgIGFzc2VydCBzdGFydCBvZiBzdHJpbmcgKG9yIGxpbmUsIGluIG11bHRpbGluZSBtb2RlKQorICAgICAgICAgJCAgICAgIGFzc2VydCBlbmQgb2Ygc3RyaW5nIChvciBsaW5lLCBpbiBtdWx0aWxpbmUgbW9kZSkKKyAgICAgICAgIC4gICAgICBtYXRjaCBhbnkgY2hhcmFjdGVyIGV4Y2VwdCBuZXdsaW5lIChieSBkZWZhdWx0KQorICAgICAgICAgWyAgICAgIHN0YXJ0IGNoYXJhY3RlciBjbGFzcyBkZWZpbml0aW9uCisgICAgICAgICB8ICAgICAgc3RhcnQgb2YgYWx0ZXJuYXRpdmUgYnJhbmNoCisgICAgICAgICAoICAgICAgc3RhcnQgc3VicGF0dGVybgorICAgICAgICAgKSAgICAgIGVuZCBzdWJwYXR0ZXJuCisgICAgICAgICA/ICAgICAgZXh0ZW5kcyB0aGUgbWVhbmluZyBvZiAoCisgICAgICAgICAgICAgICAgYWxzbyAwIG9yIDEgcXVhbnRpZmllcgorICAgICAgICAgICAgICAgIGFsc28gcXVhbnRpZmllciBtaW5pbWl6ZXIKKyAgICAgICAgICogICAgICAwIG9yIG1vcmUgcXVhbnRpZmllcgorICAgICAgICAgKyAgICAgIDEgb3IgbW9yZSBxdWFudGlmaWVyCisgICAgICAgICAgICAgICAgYWxzbyAicG9zc2Vzc2l2ZSBxdWFudGlmaWVyIgorICAgICAgICAgeyAgICAgIHN0YXJ0IG1pbi9tYXggcXVhbnRpZmllcgorCisgICAgICAgUGFydCAgb2YgIGEgIHBhdHRlcm4gIHRoYXQgaXMgaW4gc3F1YXJlIGJyYWNrZXRzIGlzIGNhbGxlZCBhICJjaGFyYWN0ZXIKKyAgICAgICBjbGFzcyIuIEluIGEgY2hhcmFjdGVyIGNsYXNzIHRoZSBvbmx5IG1ldGEtY2hhcmFjdGVycyBhcmU6CisKKyAgICAgICAgIFwgICAgICBnZW5lcmFsIGVzY2FwZSBjaGFyYWN0ZXIKKyAgICAgICAgIF4gICAgICBuZWdhdGUgdGhlIGNsYXNzLCBidXQgb25seSBpZiB0aGUgZmlyc3QgY2hhcmFjdGVyCisgICAgICAgICAtICAgICAgaW5kaWNhdGVzIGNoYXJhY3RlciByYW5nZQorICAgICAgICAgWyAgICAgIFBPU0lYIGNoYXJhY3RlciBjbGFzcyAob25seSBpZiBmb2xsb3dlZCBieSBQT1NJWAorICAgICAgICAgICAgICAgICAgc3ludGF4KQorICAgICAgICAgXSAgICAgIHRlcm1pbmF0ZXMgdGhlIGNoYXJhY3RlciBjbGFzcworCisgICAgICAgVGhlIGZvbGxvd2luZyBzZWN0aW9ucyBkZXNjcmliZSB0aGUgdXNlIG9mIGVhY2ggb2YgdGhlIG1ldGEtY2hhcmFjdGVycy4KKworCitCQUNLU0xBU0gKKworICAgICAgIFRoZSBiYWNrc2xhc2ggY2hhcmFjdGVyIGhhcyBzZXZlcmFsIHVzZXMuIEZpcnN0bHksIGlmIGl0IGlzIGZvbGxvd2VkIGJ5CisgICAgICAgYSBub24tYWxwaGFtZXJpYyBjaGFyYWN0ZXIsIGl0IHRha2VzICBhd2F5ICBhbnkgIHNwZWNpYWwgIG1lYW5pbmcgIHRoYXQKKyAgICAgICBjaGFyYWN0ZXIgIG1heSAgaGF2ZS4gIFRoaXMgIHVzZSAgb2YgIGJhY2tzbGFzaCAgYXMgYW4gZXNjYXBlIGNoYXJhY3RlcgorICAgICAgIGFwcGxpZXMgYm90aCBpbnNpZGUgYW5kIG91dHNpZGUgY2hhcmFjdGVyIGNsYXNzZXMuCisKKyAgICAgICBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gbWF0Y2ggYSAqIGNoYXJhY3RlciwgeW91IHdyaXRlICBcKiAgaW4gIHRoZQorICAgICAgIHBhdHRlcm4uICAgVGhpcyAgZXNjYXBpbmcgIGFjdGlvbiAgYXBwbGllcyB3aGV0aGVyIG9yIG5vdCB0aGUgZm9sbG93aW5nCisgICAgICAgY2hhcmFjdGVyIHdvdWxkIG90aGVyd2lzZSBiZSBpbnRlcnByZXRlZCBhcyBhIG1ldGEtY2hhcmFjdGVyLCBzbyBpdCAgaXMKKyAgICAgICBhbHdheXMgIHNhZmUgdG8gcHJlY2VkZSBhIG5vbi1hbHBoYW1lcmljIHdpdGggYmFja3NsYXNoIHRvIHNwZWNpZnkgdGhhdAorICAgICAgIGl0IHN0YW5kcyBmb3IgaXRzZWxmLiBJbiBwYXJ0aWN1bGFyLCBpZiB5b3Ugd2FudCB0byBtYXRjaCBhICBiYWNrc2xhc2gsCisgICAgICAgeW91IHdyaXRlIFxcLgorCisgICAgICAgSWYgIGEgIHBhdHRlcm4gaXMgY29tcGlsZWQgd2l0aCB0aGUgUENSRV9FWFRFTkRFRCBvcHRpb24sIHdoaXRlc3BhY2UgaW4KKyAgICAgICB0aGUgcGF0dGVybiAob3RoZXIgdGhhbiBpbiBhIGNoYXJhY3RlciBjbGFzcykgYW5kIGNoYXJhY3RlcnMgYmV0d2VlbiAgYQorICAgICAgICMgb3V0c2lkZSBhIGNoYXJhY3RlciBjbGFzcyBhbmQgdGhlIG5leHQgbmV3bGluZSBjaGFyYWN0ZXIgYXJlIGlnbm9yZWQuCisgICAgICAgQW4gZXNjYXBpbmcgYmFja3NsYXNoIGNhbiBiZSB1c2VkIHRvIGluY2x1ZGUgYSB3aGl0ZXNwYWNlIG9yICMgIGNoYXJhYy0KKyAgICAgICB0ZXIgYXMgcGFydCBvZiB0aGUgcGF0dGVybi4KKworICAgICAgIElmICB5b3UgIHdhbnQgIHRvIHJlbW92ZSB0aGUgc3BlY2lhbCBtZWFuaW5nIGZyb20gYSBzZXF1ZW5jZSBvZiBjaGFyYWMtCisgICAgICAgdGVycywgeW91IGNhbiBkbyBzbyBieSBwdXR0aW5nIHRoZW0gYmV0d2VlbiBcUSBhbmQgXEUuIFRoaXMgaXMgIGRpZmZlci0KKyAgICAgICBlbnQgIGZyb20gIFBlcmwgIGluICB0aGF0ICAkICBhbmQgIEAgYXJlIGhhbmRsZWQgYXMgbGl0ZXJhbHMgaW4gXFEuLi5cRQorICAgICAgIHNlcXVlbmNlcyBpbiBQQ1JFLCB3aGVyZWFzIGluIFBlcmwsICQgYW5kIEAgY2F1c2UgIHZhcmlhYmxlICBpbnRlcnBvbGEtCisgICAgICAgdGlvbi4gTm90ZSB0aGUgZm9sbG93aW5nIGV4YW1wbGVzOgorCisgICAgICAgICBQYXR0ZXJuICAgICAgICAgICAgUENSRSBtYXRjaGVzICAgUGVybCBtYXRjaGVzCisKKyAgICAgICAgIFxRYWJjJHh5elxFICAgICAgICBhYmMkeHl6ICAgICAgICBhYmMgZm9sbG93ZWQgYnkgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50cyBvZiAkeHl6CisgICAgICAgICBcUWFiY1wkeHl6XEUgICAgICAgYWJjXCR4eXogICAgICAgYWJjXCR4eXoKKyAgICAgICAgIFxRYWJjXEVcJFxReHl6XEUgICBhYmMkeHl6ICAgICAgICBhYmMkeHl6CisKKyAgICAgICBUaGUgIFxRLi4uXEUgIHNlcXVlbmNlICBpcyByZWNvZ25pemVkIGJvdGggaW5zaWRlIGFuZCBvdXRzaWRlIGNoYXJhY3RlcgorICAgICAgIGNsYXNzZXMuCisKKyAgICAgICBBIHNlY29uZCB1c2Ugb2YgYmFja3NsYXNoIHByb3ZpZGVzIGEgd2F5IG9mIGVuY29kaW5nIG5vbi1wcmludGluZyBjaGFyLQorICAgICAgIGFjdGVycyAgaW4gcGF0dGVybnMgaW4gYSB2aXNpYmxlIG1hbm5lci4gVGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24gb24gdGhlCisgICAgICAgYXBwZWFyYW5jZSBvZiBub24tcHJpbnRpbmcgY2hhcmFjdGVycywgYXBhcnQgZnJvbSB0aGUgYmluYXJ5IHplcm8gIHRoYXQKKyAgICAgICB0ZXJtaW5hdGVzICBhICBwYXR0ZXJuLCAgYnV0ICB3aGVuICBhIHBhdHRlcm4gaXMgYmVpbmcgcHJlcGFyZWQgYnkgdGV4dAorICAgICAgIGVkaXRpbmcsIGl0IGlzIHVzdWFsbHkgZWFzaWVyICB0byAgdXNlICBvbmUgIG9mICB0aGUgIGZvbGxvd2luZyAgZXNjYXBlCisgICAgICAgc2VxdWVuY2VzIHRoYW4gdGhlIGJpbmFyeSBjaGFyYWN0ZXIgaXQgcmVwcmVzZW50czoKKworICAgICAgICAgXGEgICAgICAgIGFsYXJtLCB0aGF0IGlzLCB0aGUgQkVMIGNoYXJhY3RlciAoaGV4IDA3KQorICAgICAgICAgXGN4ICAgICAgICJjb250cm9sLXgiLCB3aGVyZSB4IGlzIGFueSBjaGFyYWN0ZXIKKyAgICAgICAgIFxlICAgICAgICBlc2NhcGUgKGhleCAxQikKKyAgICAgICAgIFxmICAgICAgICBmb3JtZmVlZCAoaGV4IDBDKQorICAgICAgICAgXG4gICAgICAgIG5ld2xpbmUgKGhleCAwQSkKKyAgICAgICAgIFxyICAgICAgICBjYXJyaWFnZSByZXR1cm4gKGhleCAwRCkKKyAgICAgICAgIFx0ICAgICAgICB0YWIgKGhleCAwOSkKKyAgICAgICAgIFxkZGQgICAgICBjaGFyYWN0ZXIgd2l0aCBvY3RhbCBjb2RlIGRkZCwgb3IgYmFja3JlZmVyZW5jZQorICAgICAgICAgXHhoaCAgICAgIGNoYXJhY3RlciB3aXRoIGhleCBjb2RlIGhoCisgICAgICAgICBceHtoaGguLn0gY2hhcmFjdGVyIHdpdGggaGV4IGNvZGUgaGhoLi4uIChVVEYtOCBtb2RlIG9ubHkpCisKKyAgICAgICBUaGUgIHByZWNpc2UgIGVmZmVjdCBvZiBcY3ggaXMgYXMgZm9sbG93czogaWYgeCBpcyBhIGxvd2VyIGNhc2UgbGV0dGVyLAorICAgICAgIGl0IGlzIGNvbnZlcnRlZCB0byB1cHBlciBjYXNlLiBUaGVuIGJpdCA2IG9mIHRoZSBjaGFyYWN0ZXIgKGhleCA0MCkgIGlzCisgICAgICAgaW52ZXJ0ZWQuICAgVGh1cyAgXGN6IGJlY29tZXMgaGV4IDFBLCBidXQgXGN7IGJlY29tZXMgaGV4IDNCLCB3aGlsZSBcYzsKKyAgICAgICBiZWNvbWVzIGhleCA3Qi4KKworICAgICAgIEFmdGVyIFx4LCBmcm9tIHplcm8gdG8gdHdvIGhleGFkZWNpbWFsIGRpZ2l0cyBhcmUgcmVhZCAobGV0dGVycyBjYW4gIGJlCisgICAgICAgaW4gIHVwcGVyIG9yIGxvd2VyIGNhc2UpLiBJbiBVVEYtOCBtb2RlLCBhbnkgbnVtYmVyIG9mIGhleGFkZWNpbWFsIGRpZy0KKyAgICAgICBpdHMgbWF5IGFwcGVhciBiZXR3ZWVuIFx4eyBhbmQgfSwgYnV0IHRoZSB2YWx1ZSBvZiB0aGUgIGNoYXJhY3RlciAgY29kZQorICAgICAgIG11c3QgIGJlICBsZXNzICB0aGFuICAyKiozMSAgKHRoYXQgaXMsIHRoZSBtYXhpbXVtIGhleGFkZWNpbWFsIHZhbHVlIGlzCisgICAgICAgN0ZGRkZGRkYpLiBJZiBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gaGV4YWRlY2ltYWwgZGlnaXRzICBhcHBlYXIgIGJldHdlZW4KKyAgICAgICBceHsgIGFuZCB9LCBvciBpZiB0aGVyZSBpcyBubyB0ZXJtaW5hdGluZyB9LCB0aGlzIGZvcm0gb2YgZXNjYXBlIGlzIG5vdAorICAgICAgIHJlY29nbml6ZWQuIEluc3RlYWQsIHRoZSBpbml0aWFsIFx4IHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgYSBiYXNpYyBoZXgtCisgICAgICAgYWRlY2ltYWwgZXNjYXBlLCB3aXRoIG5vIGZvbGxvd2luZyBkaWdpdHMsIGdpdmluZyBhIGJ5dGUgd2hvc2UgdmFsdWUgaXMKKyAgICAgICB6ZXJvLgorCisgICAgICAgQ2hhcmFjdGVycyB3aG9zZSB2YWx1ZSBpcyBsZXNzIHRoYW4gMjU2IGNhbiBiZSBkZWZpbmVkIGJ5IGVpdGhlciBvZiB0aGUKKyAgICAgICB0d28gIHN5bnRheGVzIGZvciBceCB3aGVuIFBDUkUgaXMgaW4gVVRGLTggbW9kZS4gVGhlcmUgaXMgbm8gZGlmZmVyZW5jZQorICAgICAgIGluIHRoZSB3YXkgdGhleSBhcmUgaGFuZGxlZC4gRm9yIGV4YW1wbGUsIFx4ZGMgaXMgZXhhY3RseSB0aGUgIHNhbWUgIGFzCisgICAgICAgXHh7ZGN9LgorCisgICAgICAgQWZ0ZXIgIFwwICB1cCAgdG8gIHR3byBmdXJ0aGVyIG9jdGFsIGRpZ2l0cyBhcmUgcmVhZC4gSW4gYm90aCBjYXNlcywgaWYKKyAgICAgICB0aGVyZSBhcmUgZmV3ZXIgdGhhbiB0d28gZGlnaXRzLCBqdXN0IHRob3NlIHRoYXQgYXJlIHByZXNlbnQgYXJlICB1c2VkLgorICAgICAgIFRodXMgIHRoZSBzZXF1ZW5jZSBcMFx4XDA3IHNwZWNpZmllcyB0d28gYmluYXJ5IHplcm9zIGZvbGxvd2VkIGJ5IGEgQkVMCisgICAgICAgY2hhcmFjdGVyIChjb2RlIHZhbHVlIDcpLiBNYWtlIHN1cmUgeW91IHN1cHBseSAgdHdvICBkaWdpdHMgIGFmdGVyICB0aGUKKyAgICAgICBpbml0aWFsIHplcm8gaWYgdGhlIGNoYXJhY3RlciB0aGF0IGZvbGxvd3MgaXMgaXRzZWxmIGFuIG9jdGFsIGRpZ2l0LgorCisgICAgICAgVGhlIGhhbmRsaW5nIG9mIGEgYmFja3NsYXNoIGZvbGxvd2VkIGJ5IGEgZGlnaXQgb3RoZXIgdGhhbiAwIGlzIGNvbXBsaS0KKyAgICAgICBjYXRlZC4gIE91dHNpZGUgYSBjaGFyYWN0ZXIgY2xhc3MsIFBDUkUgcmVhZHMgaXQgYW5kIGFueSBmb2xsb3dpbmcgZGlnLQorICAgICAgIGl0cyAgYXMgIGEgIGRlY2ltYWwgIG51bWJlci4gSWYgdGhlIG51bWJlciBpcyBsZXNzIHRoYW4gMTAsIG9yIGlmIHRoZXJlCisgICAgICAgaGF2ZSBiZWVuIGF0IGxlYXN0IHRoYXQgbWFueSBwcmV2aW91cyBjYXB0dXJpbmcgbGVmdCBwYXJlbnRoZXNlcyBpbiB0aGUKKyAgICAgICBleHByZXNzaW9uLCAgdGhlICBlbnRpcmUgIHNlcXVlbmNlICBpcyAgdGFrZW4gIGFzICBhICBiYWNrIHJlZmVyZW5jZS4gQQorICAgICAgIGRlc2NyaXB0aW9uIG9mIGhvdyB0aGlzIHdvcmtzIGlzIGdpdmVuIGxhdGVyLCBmb2xsb3dpbmcgdGhlICBkaXNjdXNzaW9uCisgICAgICAgb2YgcGFyZW50aGVzaXplZCBzdWJwYXR0ZXJucy4KKworICAgICAgIEluc2lkZSAgYSAgY2hhcmFjdGVyICBjbGFzcywgb3IgaWYgdGhlIGRlY2ltYWwgbnVtYmVyIGlzIGdyZWF0ZXIgdGhhbiA5CisgICAgICAgYW5kIHRoZXJlIGhhdmUgbm90IGJlZW4gdGhhdCBtYW55IGNhcHR1cmluZyBzdWJwYXR0ZXJucywgUENSRSAgcmUtcmVhZHMKKyAgICAgICB1cCAgdG8gdGhyZWUgb2N0YWwgZGlnaXRzIGZvbGxvd2luZyB0aGUgYmFja3NsYXNoLCBhbmQgZ2VuZXJhdGVzIGEgc2luLQorICAgICAgIGdsZSBieXRlIGZyb20gdGhlIGxlYXN0IHNpZ25pZmljYW50IDggYml0cyBvZiB0aGUgdmFsdWUuIEFueSBzdWJzZXF1ZW50CisgICAgICAgZGlnaXRzIHN0YW5kIGZvciB0aGVtc2VsdmVzLiAgRm9yIGV4YW1wbGU6CisKKyAgICAgICAgIFwwNDAgICBpcyBhbm90aGVyIHdheSBvZiB3cml0aW5nIGEgc3BhY2UKKyAgICAgICAgIFw0MCAgICBpcyB0aGUgc2FtZSwgcHJvdmlkZWQgdGhlcmUgYXJlIGZld2VyIHRoYW4gNDAKKyAgICAgICAgICAgICAgICAgICBwcmV2aW91cyBjYXB0dXJpbmcgc3VicGF0dGVybnMKKyAgICAgICAgIFw3ICAgICBpcyBhbHdheXMgYSBiYWNrIHJlZmVyZW5jZQorICAgICAgICAgXDExICAgIG1pZ2h0IGJlIGEgYmFjayByZWZlcmVuY2UsIG9yIGFub3RoZXIgd2F5IG9mCisgICAgICAgICAgICAgICAgICAgd3JpdGluZyBhIHRhYgorICAgICAgICAgXDAxMSAgIGlzIGFsd2F5cyBhIHRhYgorICAgICAgICAgXDAxMTMgIGlzIGEgdGFiIGZvbGxvd2VkIGJ5IHRoZSBjaGFyYWN0ZXIgIjMiCisgICAgICAgICBcMTEzICAgbWlnaHQgYmUgYSBiYWNrIHJlZmVyZW5jZSwgb3RoZXJ3aXNlIHRoZQorICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciB3aXRoIG9jdGFsIGNvZGUgMTEzCisgICAgICAgICBcMzc3ICAgbWlnaHQgYmUgYSBiYWNrIHJlZmVyZW5jZSwgb3RoZXJ3aXNlCisgICAgICAgICAgICAgICAgICAgdGhlIGJ5dGUgY29uc2lzdGluZyBlbnRpcmVseSBvZiAxIGJpdHMKKyAgICAgICAgIFw4MSAgICBpcyBlaXRoZXIgYSBiYWNrIHJlZmVyZW5jZSwgb3IgYSBiaW5hcnkgemVybworICAgICAgICAgICAgICAgICAgIGZvbGxvd2VkIGJ5IHRoZSB0d28gY2hhcmFjdGVycyAiOCIgYW5kICIxIgorCisgICAgICAgTm90ZSAgdGhhdCAgb2N0YWwgIHZhbHVlcyBvZiAxMDAgb3IgZ3JlYXRlciBtdXN0IG5vdCBiZSBpbnRyb2R1Y2VkIGJ5IGEKKyAgICAgICBsZWFkaW5nIHplcm8sIGJlY2F1c2Ugbm8gbW9yZSB0aGFuIHRocmVlIG9jdGFsIGRpZ2l0cyBhcmUgZXZlciByZWFkLgorCisgICAgICAgQWxsIHRoZSBzZXF1ZW5jZXMgdGhhdCBkZWZpbmUgYSBzaW5nbGUgYnl0ZSB2YWx1ZSAgb3IgIGEgIHNpbmdsZSAgVVRGLTgKKyAgICAgICBjaGFyYWN0ZXIgKGluIFVURi04IG1vZGUpIGNhbiBiZSB1c2VkIGJvdGggaW5zaWRlIGFuZCBvdXRzaWRlIGNoYXJhY3RlcgorICAgICAgIGNsYXNzZXMuIEluIGFkZGl0aW9uLCBpbnNpZGUgYSBjaGFyYWN0ZXIgIGNsYXNzLCAgdGhlICBzZXF1ZW5jZSAgXGIgIGlzCisgICAgICAgaW50ZXJwcmV0ZWQgIGFzICB0aGUgIGJhY2tzcGFjZSBjaGFyYWN0ZXIgKGhleCAwOCkuIE91dHNpZGUgYSBjaGFyYWN0ZXIKKyAgICAgICBjbGFzcyBpdCBoYXMgYSBkaWZmZXJlbnQgbWVhbmluZyAoc2VlIGJlbG93KS4KKworICAgICAgIFRoZSB0aGlyZCB1c2Ugb2YgYmFja3NsYXNoIGlzIGZvciBzcGVjaWZ5aW5nIGdlbmVyaWMgY2hhcmFjdGVyIHR5cGVzOgorCisgICAgICAgICBcZCAgICAgYW55IGRlY2ltYWwgZGlnaXQKKyAgICAgICAgIFxEICAgICBhbnkgY2hhcmFjdGVyIHRoYXQgaXMgbm90IGEgZGVjaW1hbCBkaWdpdAorICAgICAgICAgXHMgICAgIGFueSB3aGl0ZXNwYWNlIGNoYXJhY3RlcgorICAgICAgICAgXFMgICAgIGFueSBjaGFyYWN0ZXIgdGhhdCBpcyBub3QgYSB3aGl0ZXNwYWNlIGNoYXJhY3RlcgorICAgICAgICAgXHcgICAgIGFueSAid29yZCIgY2hhcmFjdGVyCisgICAgICAgICBcVyAgICAgYW55ICJub24td29yZCIgY2hhcmFjdGVyCisKKyAgICAgICBFYWNoIHBhaXIgb2YgZXNjYXBlIHNlcXVlbmNlcyBwYXJ0aXRpb25zIHRoZSBjb21wbGV0ZSBzZXQgb2YgY2hhcmFjdGVycworICAgICAgIGludG8gIHR3byBkaXNqb2ludCBzZXRzLiBBbnkgZ2l2ZW4gY2hhcmFjdGVyIG1hdGNoZXMgb25lLCBhbmQgb25seSBvbmUsCisgICAgICAgb2YgZWFjaCBwYWlyLgorCisgICAgICAgSW4gVVRGLTggbW9kZSwgY2hhcmFjdGVycyB3aXRoIHZhbHVlcyBncmVhdGVyIHRoYW4gMjU1IG5ldmVyIG1hdGNoICBcZCwKKyAgICAgICBccywgb3IgXHcsIGFuZCBhbHdheXMgbWF0Y2ggXEQsIFxTLCBhbmQgXFcuCisKKyAgICAgICBGb3IgIGNvbXBhdGliaWxpdHkgIHdpdGggUGVybCwgXHMgZG9lcyBub3QgbWF0Y2ggdGhlIFZUIGNoYXJhY3RlciAoY29kZQorICAgICAgIDExKS4gIFRoaXMgbWFrZXMgaXQgZGlmZmVyZW50IGZyb20gdGhlIHRoZSBQT1NJWCAic3BhY2UiIGNsYXNzLiBUaGUgIFxzCisgICAgICAgY2hhcmFjdGVycyBhcmUgSFQgKDkpLCBMRiAoMTApLCBGRiAoMTIpLCBDUiAoMTMpLCBhbmQgc3BhY2UgKDMyKS4KKworICAgICAgIEEgICJ3b3JkIiBjaGFyYWN0ZXIgaXMgYW55IGxldHRlciBvciBkaWdpdCBvciB0aGUgdW5kZXJzY29yZSBjaGFyYWN0ZXIsCisgICAgICAgdGhhdCBpcywgYW55IGNoYXJhY3RlciB3aGljaCBjYW4gYmUgcGFydCBvZiBhIFBlcmwgIndvcmQiLiBUaGUgIGRlZmluaS0KKyAgICAgICB0aW9uICBvZiAgbGV0dGVycyAgYW5kIGRpZ2l0cyBpcyBjb250cm9sbGVkIGJ5IFBDUkUncyBjaGFyYWN0ZXIgdGFibGVzLAorICAgICAgIGFuZCBtYXkgdmFyeSBpZiBsb2NhbGUtIHNwZWNpZmljIG1hdGNoaW5nIGlzIHRha2luZyBwbGFjZSAoc2VlICAiTG9jYWxlCisgICAgICAgc3VwcG9ydCIgIGluICB0aGUgIHBjcmVhcGkgIHBhZ2UpLiAgRm9yICBleGFtcGxlLCAgaW4gdGhlICJmciIgKEZyZW5jaCkKKyAgICAgICBsb2NhbGUsIHNvbWUgY2hhcmFjdGVyIGNvZGVzIGdyZWF0ZXIgdGhhbiAxMjggIGFyZSAgdXNlZCAgZm9yICBhY2NlbnRlZAorICAgICAgIGxldHRlcnMsIGFuZCB0aGVzZSBhcmUgbWF0Y2hlZCBieSBcdy4KKworICAgICAgIFRoZXNlIGNoYXJhY3RlciB0eXBlIHNlcXVlbmNlcyBjYW4gYXBwZWFyIGJvdGggaW5zaWRlIGFuZCBvdXRzaWRlIGNoYXItCisgICAgICAgYWN0ZXIgY2xhc3Nlcy4gVGhleSBlYWNoIG1hdGNoIG9uZSBjaGFyYWN0ZXIgb2YgdGhlICBhcHByb3ByaWF0ZSAgdHlwZS4KKyAgICAgICBJZiAgdGhlIGN1cnJlbnQgbWF0Y2hpbmcgcG9pbnQgaXMgYXQgdGhlIGVuZCBvZiB0aGUgc3ViamVjdCBzdHJpbmcsIGFsbAorICAgICAgIG9mIHRoZW0gZmFpbCwgc2luY2UgdGhlcmUgaXMgbm8gY2hhcmFjdGVyIHRvIG1hdGNoLgorCisgICAgICAgVGhlIGZvdXJ0aCB1c2Ugb2YgYmFja3NsYXNoIGlzIGZvciBjZXJ0YWluIHNpbXBsZSBhc3NlcnRpb25zLiBBbiBhc3Nlci0KKyAgICAgICB0aW9uICBzcGVjaWZpZXMgYSBjb25kaXRpb24gdGhhdCBoYXMgdG8gYmUgbWV0IGF0IGEgcGFydGljdWxhciBwb2ludCBpbgorICAgICAgIGEgbWF0Y2gsIHdpdGhvdXQgY29uc3VtaW5nIGFueSBjaGFyYWN0ZXJzIGZyb20gdGhlIHN1YmplY3Qgc3RyaW5nLiAgVGhlCisgICAgICAgdXNlICBvZiBzdWJwYXR0ZXJucyBmb3IgbW9yZSBjb21wbGljYXRlZCBhc3NlcnRpb25zIGlzIGRlc2NyaWJlZCBiZWxvdy4KKyAgICAgICBUaGUgYmFja3NsYXNoZWQgYXNzZXJ0aW9ucyBhcmUKKworICAgICAgICAgXGIgICAgIG1hdGNoZXMgYXQgYSB3b3JkIGJvdW5kYXJ5CisgICAgICAgICBcQiAgICAgbWF0Y2hlcyB3aGVuIG5vdCBhdCBhIHdvcmQgYm91bmRhcnkKKyAgICAgICAgIFxBICAgICBtYXRjaGVzIGF0IHN0YXJ0IG9mIHN1YmplY3QKKyAgICAgICAgIFxaICAgICBtYXRjaGVzIGF0IGVuZCBvZiBzdWJqZWN0IG9yIGJlZm9yZSBuZXdsaW5lIGF0IGVuZAorICAgICAgICAgXHogICAgIG1hdGNoZXMgYXQgZW5kIG9mIHN1YmplY3QKKyAgICAgICAgIFxHICAgICBtYXRjaGVzIGF0IGZpcnN0IG1hdGNoaW5nIHBvc2l0aW9uIGluIHN1YmplY3QKKworICAgICAgIFRoZXNlIGFzc2VydGlvbnMgbWF5IG5vdCBhcHBlYXIgaW4gY2hhcmFjdGVyIGNsYXNzZXMgKGJ1dCBub3RlIHRoYXQgIFxiCisgICAgICAgaGFzIGEgZGlmZmVyZW50IG1lYW5pbmcsIG5hbWVseSB0aGUgYmFja3NwYWNlIGNoYXJhY3RlciwgaW5zaWRlIGEgY2hhci0KKyAgICAgICBhY3RlciBjbGFzcykuCisKKyAgICAgICBBIHdvcmQgYm91bmRhcnkgaXMgYSBwb3NpdGlvbiBpbiB0aGUgc3ViamVjdCBzdHJpbmcgd2hlcmUgIHRoZSAgY3VycmVudAorICAgICAgIGNoYXJhY3RlciAgYW5kICB0aGUgcHJldmlvdXMgY2hhcmFjdGVyIGRvIG5vdCBib3RoIG1hdGNoIFx3IG9yIFxXIChpLmUuCisgICAgICAgb25lIG1hdGNoZXMgXHcgYW5kIHRoZSBvdGhlciBtYXRjaGVzIFxXKSwgb3IgdGhlIHN0YXJ0IG9yICBlbmQgIG9mICB0aGUKKyAgICAgICBzdHJpbmcgaWYgdGhlIGZpcnN0IG9yIGxhc3QgY2hhcmFjdGVyIG1hdGNoZXMgXHcsIHJlc3BlY3RpdmVseS4KKworICAgICAgIFRoZSAgXEEsICBcWiwgIGFuZCBceiBhc3NlcnRpb25zIGRpZmZlciBmcm9tIHRoZSB0cmFkaXRpb25hbCBjaXJjdW1mbGV4CisgICAgICAgYW5kIGRvbGxhciAoZGVzY3JpYmVkIGJlbG93KSBpbiB0aGF0IHRoZXkgb25seSBldmVyIG1hdGNoIGF0ICB0aGUgIHZlcnkKKyAgICAgICBzdGFydCAgYW5kICBlbmQgIG9mIHRoZSBzdWJqZWN0IHN0cmluZywgd2hhdGV2ZXIgb3B0aW9ucyBhcmUgc2V0LiBUaHVzLAorICAgICAgIHRoZXkgYXJlIGluZGVwZW5kZW50IG9mIG11bHRpbGluZSBtb2RlLgorCisgICAgICAgVGhleSBhcmUgbm90IGFmZmVjdGVkIGJ5IHRoZSBQQ1JFX05PVEJPTCBvciBQQ1JFX05PVEVPTCBvcHRpb25zLiBJZiB0aGUKKyAgICAgICBzdGFydG9mZnNldCBhcmd1bWVudCBvZiBwY3JlX2V4ZWMoKSBpcyBub24temVybywgaW5kaWNhdGluZyB0aGF0IG1hdGNoLQorICAgICAgIGluZyBpcyB0byBzdGFydCBhdCBhIHBvaW50IG90aGVyIHRoYW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3ViamVjdCwgIFxBCisgICAgICAgY2FuICBuZXZlciAgbWF0Y2guICBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIFxaIGFuZCBceiBpcyB0aGF0IFxaIG1hdGNoZXMKKyAgICAgICBiZWZvcmUgYSBuZXdsaW5lIHRoYXQgaXMgdGhlIGxhc3QgY2hhcmFjdGVyIG9mIHRoZSBzdHJpbmcgYXMgd2VsbCBhcyBhdAorICAgICAgIHRoZSBlbmQgb2YgdGhlIHN0cmluZywgd2hlcmVhcyBceiBtYXRjaGVzIG9ubHkgYXQgdGhlIGVuZC4KKworICAgICAgIFRoZSAgXEcgYXNzZXJ0aW9uIGlzIHRydWUgb25seSB3aGVuIHRoZSBjdXJyZW50IG1hdGNoaW5nIHBvc2l0aW9uIGlzIGF0CisgICAgICAgdGhlIHN0YXJ0IHBvaW50IG9mIHRoZSBtYXRjaCwgYXMgc3BlY2lmaWVkIGJ5IHRoZSBzdGFydG9mZnNldCAgYXJndW1lbnQKKyAgICAgICBvZiAgcGNyZV9leGVjKCkuICBJdCAgZGlmZmVycyAgZnJvbSBcQSB3aGVuIHRoZSB2YWx1ZSBvZiBzdGFydG9mZnNldCBpcworICAgICAgIG5vbi16ZXJvLiBCeSBjYWxsaW5nIHBjcmVfZXhlYygpIG11bHRpcGxlIHRpbWVzIHdpdGggYXBwcm9wcmlhdGUgIGFyZ3UtCisgICAgICAgbWVudHMsIHlvdSBjYW4gbWltaWMgUGVybCdzIC9nIG9wdGlvbiwgYW5kIGl0IGlzIGluIHRoaXMga2luZCBvZiBpbXBsZS0KKyAgICAgICBtZW50YXRpb24gd2hlcmUgXEcgY2FuIGJlIHVzZWZ1bC4KKworICAgICAgIE5vdGUsIGhvd2V2ZXIsIHRoYXQgUENSRSdzIGludGVycHJldGF0aW9uIG9mIFxHLCBhcyB0aGUgIHN0YXJ0ICBvZiAgdGhlCisgICAgICAgY3VycmVudCBtYXRjaCwgaXMgc3VidGx5IGRpZmZlcmVudCBmcm9tIFBlcmwncywgd2hpY2ggZGVmaW5lcyBpdCBhcyB0aGUKKyAgICAgICBlbmQgb2YgdGhlIHByZXZpb3VzIG1hdGNoLiBJbiBQZXJsLCB0aGVzZSBjYW4gIGJlICBkaWZmZXJlbnQgIHdoZW4gIHRoZQorICAgICAgIHByZXZpb3VzbHkgIG1hdGNoZWQgIHN0cmluZyB3YXMgZW1wdHkuIEJlY2F1c2UgUENSRSBkb2VzIGp1c3Qgb25lIG1hdGNoCisgICAgICAgYXQgYSB0aW1lLCBpdCBjYW5ub3QgcmVwcm9kdWNlIHRoaXMgYmVoYXZpb3VyLgorCisgICAgICAgSWYgYWxsIHRoZSBhbHRlcm5hdGl2ZXMgb2YgYSBwYXR0ZXJuIGJlZ2luIHdpdGggXEcsIHRoZSAgZXhwcmVzc2lvbiAgaXMKKyAgICAgICBhbmNob3JlZCB0byB0aGUgc3RhcnRpbmcgbWF0Y2ggcG9zaXRpb24sIGFuZCB0aGUgImFuY2hvcmVkIiBmbGFnIGlzIHNldAorICAgICAgIGluIHRoZSBjb21waWxlZCByZWd1bGFyIGV4cHJlc3Npb24uCisKKworQ0lSQ1VNRkxFWCBBTkQgRE9MTEFSCisKKyAgICAgICBPdXRzaWRlIGEgY2hhcmFjdGVyIGNsYXNzLCBpbiB0aGUgZGVmYXVsdCBtYXRjaGluZyBtb2RlLCB0aGUgY2lyY3VtZmxleAorICAgICAgIGNoYXJhY3RlciAgaXMgIGFuICBhc3NlcnRpb24gd2hpY2ggaXMgdHJ1ZSBvbmx5IGlmIHRoZSBjdXJyZW50IG1hdGNoaW5nCisgICAgICAgcG9pbnQgaXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzdWJqZWN0IHN0cmluZy4gSWYgdGhlICBzdGFydG9mZnNldCAgYXJndS0KKyAgICAgICBtZW50ICBvZiAgcGNyZV9leGVjKCkgIGlzICBub24temVybywgIGNpcmN1bWZsZXggY2FuIG5ldmVyIG1hdGNoIGlmIHRoZQorICAgICAgIFBDUkVfTVVMVElMSU5FIG9wdGlvbiBpcyB1bnNldC4gSW5zaWRlIGEgIGNoYXJhY3RlciAgY2xhc3MsICBjaXJjdW1mbGV4CisgICAgICAgaGFzIGFuIGVudGlyZWx5IGRpZmZlcmVudCBtZWFuaW5nIChzZWUgYmVsb3cpLgorCisgICAgICAgQ2lyY3VtZmxleCAgbmVlZCAgbm90IGJlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHBhdHRlcm4gaWYgYSBudW1iZXIKKyAgICAgICBvZiBhbHRlcm5hdGl2ZXMgYXJlIGludm9sdmVkLCBidXQgaXQgc2hvdWxkIGJlIHRoZSBmaXJzdCB0aGluZyBpbiAgZWFjaAorICAgICAgIGFsdGVybmF0aXZlICBpbiAgd2hpY2ggIGl0IGFwcGVhcnMgaWYgdGhlIHBhdHRlcm4gaXMgZXZlciB0byBtYXRjaCB0aGF0CisgICAgICAgYnJhbmNoLiBJZiBhbGwgcG9zc2libGUgYWx0ZXJuYXRpdmVzIHN0YXJ0IHdpdGggYSBjaXJjdW1mbGV4LCB0aGF0ICBpcywKKyAgICAgICBpZiAgdGhlICBwYXR0ZXJuICBpcyBjb25zdHJhaW5lZCB0byBtYXRjaCBvbmx5IGF0IHRoZSBzdGFydCBvZiB0aGUgc3ViLQorICAgICAgIGplY3QsIGl0IGlzIHNhaWQgdG8gYmUgYW4gImFuY2hvcmVkIiBwYXR0ZXJuLiAgKFRoZXJlICBhcmUgIGFsc28gIG90aGVyCisgICAgICAgY29uc3RydWN0cyB0aGF0IGNhbiBjYXVzZSBhIHBhdHRlcm4gdG8gYmUgYW5jaG9yZWQuKQorCisgICAgICAgQSAgZG9sbGFyICBjaGFyYWN0ZXIgIGlzIGFuIGFzc2VydGlvbiB3aGljaCBpcyB0cnVlIG9ubHkgaWYgdGhlIGN1cnJlbnQKKyAgICAgICBtYXRjaGluZyBwb2ludCBpcyBhdCB0aGUgZW5kIG9mICB0aGUgIHN1YmplY3QgIHN0cmluZywgIG9yICBpbW1lZGlhdGVseQorICAgICAgIGJlZm9yZSBhIG5ld2xpbmUgY2hhcmFjdGVyIHRoYXQgaXMgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcgKGJ5CisgICAgICAgZGVmYXVsdCkuIERvbGxhciBuZWVkIG5vdCBiZSB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgIHRoZSAgcGF0dGVybiAgaWYgIGEKKyAgICAgICBudW1iZXIgIG9mIGFsdGVybmF0aXZlcyBhcmUgaW52b2x2ZWQsIGJ1dCBpdCBzaG91bGQgYmUgdGhlIGxhc3QgaXRlbSBpbgorICAgICAgIGFueSBicmFuY2ggaW4gd2hpY2ggaXQgYXBwZWFycy4gIERvbGxhciBoYXMgbm8gIHNwZWNpYWwgIG1lYW5pbmcgIGluICBhCisgICAgICAgY2hhcmFjdGVyIGNsYXNzLgorCisgICAgICAgVGhlICBtZWFuaW5nICBvZiAgZG9sbGFyICBjYW4gYmUgY2hhbmdlZCBzbyB0aGF0IGl0IG1hdGNoZXMgb25seSBhdCB0aGUKKyAgICAgICB2ZXJ5IGVuZCBvZiB0aGUgc3RyaW5nLCBieSBzZXR0aW5nIHRoZSAgUENSRV9ET0xMQVJfRU5ET05MWSAgb3B0aW9uICBhdAorICAgICAgIGNvbXBpbGUgdGltZS4gVGhpcyBkb2VzIG5vdCBhZmZlY3QgdGhlIFxaIGFzc2VydGlvbi4KKworICAgICAgIFRoZSBtZWFuaW5ncyBvZiB0aGUgY2lyY3VtZmxleCBhbmQgZG9sbGFyIGNoYXJhY3RlcnMgYXJlIGNoYW5nZWQgaWYgdGhlCisgICAgICAgUENSRV9NVUxUSUxJTkUgb3B0aW9uIGlzIHNldC4gV2hlbiB0aGlzIGlzIHRoZSBjYXNlLCB0aGV5IG1hdGNoIGltbWVkaS0KKyAgICAgICBhdGVseSAgYWZ0ZXIgIGFuZCAgaW1tZWRpYXRlbHkgIGJlZm9yZSAgYW4gIGludGVybmFsIG5ld2xpbmUgY2hhcmFjdGVyLAorICAgICAgIHJlc3BlY3RpdmVseSwgaW4gYWRkaXRpb24gdG8gbWF0Y2hpbmcgYXQgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlICBzdWItCisgICAgICAgamVjdCAgc3RyaW5nLiAgRm9yICBleGFtcGxlLCAgdGhlICBwYXR0ZXJuICAvXmFiYyQvIG1hdGNoZXMgdGhlIHN1YmplY3QKKyAgICAgICBzdHJpbmcgImRlZlxuYWJjIiBpbiBtdWx0aWxpbmUgbW9kZSwgYnV0IG5vdCAgb3RoZXJ3aXNlLiAgQ29uc2VxdWVudGx5LAorICAgICAgIHBhdHRlcm5zICB0aGF0ICBhcmUgIGFuY2hvcmVkICBpbiBzaW5nbGUgbGluZSBtb2RlIGJlY2F1c2UgYWxsIGJyYW5jaGVzCisgICAgICAgc3RhcnQgd2l0aCBeIGFyZSBub3QgYW5jaG9yZWQgaW4gbXVsdGlsaW5lIG1vZGUsIGFuZCBhIG1hdGNoICBmb3IgIGNpci0KKyAgICAgICBjdW1mbGV4ICBpcyAgcG9zc2libGUgIHdoZW4gIHRoZSBzdGFydG9mZnNldCBhcmd1bWVudCBvZiBwY3JlX2V4ZWMoKSBpcworICAgICAgIG5vbi16ZXJvLiBUaGUgUENSRV9ET0xMQVJfRU5ET05MWSBvcHRpb24gaXMgaWdub3JlZCAgaWYgIFBDUkVfTVVMVElMSU5FCisgICAgICAgaXMgc2V0LgorCisgICAgICAgTm90ZSAgdGhhdCAgdGhlIHNlcXVlbmNlcyBcQSwgXFosIGFuZCBceiBjYW4gYmUgdXNlZCB0byBtYXRjaCB0aGUgc3RhcnQKKyAgICAgICBhbmQgZW5kIG9mIHRoZSBzdWJqZWN0IGluIGJvdGggbW9kZXMsIGFuZCBpZiBhbGwgYnJhbmNoZXMgb2YgYSAgcGF0dGVybgorICAgICAgIHN0YXJ0ICB3aXRoICBcQSBpdCBpcyBhbHdheXMgYW5jaG9yZWQsIHdoZXRoZXIgUENSRV9NVUxUSUxJTkUgaXMgc2V0IG9yCisgICAgICAgbm90LgorCisKK0ZVTEwgU1RPUCAoUEVSSU9ELCBET1QpCisKKyAgICAgICBPdXRzaWRlIGEgY2hhcmFjdGVyIGNsYXNzLCBhIGRvdCBpbiB0aGUgcGF0dGVybiBtYXRjaGVzIGFueSBvbmUgY2hhcmFjLQorICAgICAgIHRlciAgaW4gIHRoZSAgc3ViamVjdCwgIGluY2x1ZGluZyBhIG5vbi1wcmludGluZyBjaGFyYWN0ZXIsIGJ1dCBub3QgKGJ5CisgICAgICAgZGVmYXVsdCkgbmV3bGluZS4gIEluIFVURi04IG1vZGUsIGEgZG90IG1hdGNoZXMgIGFueSAgVVRGLTggIGNoYXJhY3RlciwKKyAgICAgICB3aGljaCAgbWlnaHQgIGJlICBtb3JlIHRoYW4gb25lIGJ5dGUgbG9uZywgZXhjZXB0IChieSBkZWZhdWx0KSBmb3IgbmV3LQorICAgICAgIGxpbmUuIElmIHRoZSBQQ1JFX0RPVEFMTCBvcHRpb24gaXMgc2V0LCBkb3RzIG1hdGNoICBuZXdsaW5lcyAgYXMgIHdlbGwuCisgICAgICAgVGhlICBoYW5kbGluZyBvZiBkb3QgaXMgZW50aXJlbHkgaW5kZXBlbmRlbnQgb2YgdGhlIGhhbmRsaW5nIG9mIGNpcmN1bS0KKyAgICAgICBmbGV4IGFuZCBkb2xsYXIsIHRoZSBvbmx5IHJlbGF0aW9uc2hpcCBiZWluZyAgdGhhdCAgdGhleSAgYm90aCAgaW52b2x2ZQorICAgICAgIG5ld2xpbmUgY2hhcmFjdGVycy4gRG90IGhhcyBubyBzcGVjaWFsIG1lYW5pbmcgaW4gYSBjaGFyYWN0ZXIgY2xhc3MuCisKKworTUFUQ0hJTkcgQSBTSU5HTEUgQllURQorCisgICAgICAgT3V0c2lkZSBhIGNoYXJhY3RlciBjbGFzcywgdGhlIGVzY2FwZSBzZXF1ZW5jZSBcQyBtYXRjaGVzIGFueSBvbmUgYnl0ZSwKKyAgICAgICBib3RoIGluIGFuZCBvdXQgb2YgVVRGLTggbW9kZS4gVW5saWtlIGEgZG90LCBpdCBhbHdheXMgbWF0Y2hlcyAgYSAgbmV3LQorICAgICAgIGxpbmUuICBUaGUgIGZlYXR1cmUgIGlzICBwcm92aWRlZCAgaW4gUGVybCBpbiBvcmRlciB0byBtYXRjaCBpbmRpdmlkdWFsCisgICAgICAgYnl0ZXMgaW4gVVRGLTggbW9kZS4gIEJlY2F1c2UgaXQgYnJlYWtzIHVwIFVURi04IGNoYXJhY3RlcnMgaW50byAgaW5kaS0KKyAgICAgICB2aWR1YWwgIGJ5dGVzLCAgd2hhdCAgcmVtYWlucyAgaW4gIHRoZSAgc3RyaW5nIG1heSBiZSBhIG1hbGZvcm1lZCBVVEYtOAorICAgICAgIHN0cmluZy4gRm9yIHRoaXMgcmVhc29uIGl0IGlzIGJlc3QgYXZvaWRlZC4KKworICAgICAgIFBDUkUgZG9lcyBub3QgYWxsb3cgXEMgdG8gYXBwZWFyIGluIGxvb2tiZWhpbmQgYXNzZXJ0aW9ucyAoc2VlICBiZWxvdyksCisgICAgICAgYmVjYXVzZSBpbiBVVEYtOCBtb2RlIGl0IG1ha2VzIGl0IGltcG9zc2libGUgdG8gY2FsY3VsYXRlIHRoZSBsZW5ndGggb2YKKyAgICAgICB0aGUgbG9va2JlaGluZC4KKworCitTUVVBUkUgQlJBQ0tFVFMKKworICAgICAgIEFuIG9wZW5pbmcgc3F1YXJlIGJyYWNrZXQgaW50cm9kdWNlcyBhIGNoYXJhY3RlciBjbGFzcywgdGVybWluYXRlZCBieSBhCisgICAgICAgY2xvc2luZyBzcXVhcmUgYnJhY2tldC4gQSBjbG9zaW5nIHNxdWFyZSBicmFja2V0IG9uIGl0cyBvd24gaXMgbm90IHNwZS0KKyAgICAgICBjaWFsLiBJZiBhIGNsb3Npbmcgc3F1YXJlIGJyYWNrZXQgaXMgcmVxdWlyZWQgYXMgYSBtZW1iZXIgb2YgdGhlIGNsYXNzLAorICAgICAgIGl0ICBzaG91bGQgIGJlICB0aGUgZmlyc3QgZGF0YSBjaGFyYWN0ZXIgaW4gdGhlIGNsYXNzIChhZnRlciBhbiBpbml0aWFsCisgICAgICAgY2lyY3VtZmxleCwgaWYgcHJlc2VudCkgb3IgZXNjYXBlZCB3aXRoIGEgYmFja3NsYXNoLgorCisgICAgICAgQSBjaGFyYWN0ZXIgY2xhc3MgbWF0Y2hlcyBhIHNpbmdsZSBjaGFyYWN0ZXIgaW4gdGhlIHN1YmplY3QuICBJbiAgVVRGLTgKKyAgICAgICBtb2RlLCAgdGhlIGNoYXJhY3RlciBtYXkgb2NjdXB5IG1vcmUgdGhhbiBvbmUgYnl0ZS4gQSBtYXRjaGVkIGNoYXJhY3RlcgorICAgICAgIG11c3QgYmUgaW4gdGhlIHNldCBvZiBjaGFyYWN0ZXJzIGRlZmluZWQgYnkgdGhlIGNsYXNzLCB1bmxlc3MgdGhlIGZpcnN0CisgICAgICAgY2hhcmFjdGVyICBpbiAgdGhlICBjbGFzcyBkZWZpbml0aW9uIGlzIGEgY2lyY3VtZmxleCwgaW4gd2hpY2ggY2FzZSB0aGUKKyAgICAgICBzdWJqZWN0IGNoYXJhY3RlciBtdXN0IG5vdCBiZSBpbiB0aGUgc2V0IGRlZmluZWQgYnkgIHRoZSAgY2xhc3MuICBJZiAgYQorICAgICAgIGNpcmN1bWZsZXggIGlzIGFjdHVhbGx5IHJlcXVpcmVkIGFzIGEgbWVtYmVyIG9mIHRoZSBjbGFzcywgZW5zdXJlIGl0IGlzCisgICAgICAgbm90IHRoZSBmaXJzdCBjaGFyYWN0ZXIsIG9yIGVzY2FwZSBpdCB3aXRoIGEgYmFja3NsYXNoLgorCisgICAgICAgRm9yIGV4YW1wbGUsIHRoZSBjaGFyYWN0ZXIgY2xhc3MgW2FlaW91XSBtYXRjaGVzIGFueSBsb3dlciBjYXNlICB2b3dlbCwKKyAgICAgICB3aGlsZSAgW15hZWlvdV0gIG1hdGNoZXMgIGFueSBjaGFyYWN0ZXIgdGhhdCBpcyBub3QgYSBsb3dlciBjYXNlIHZvd2VsLgorICAgICAgIE5vdGUgdGhhdCBhIGNpcmN1bWZsZXggaXMganVzdCBhIGNvbnZlbmllbnQgbm90YXRpb24gZm9yIHNwZWNpZnlpbmcgdGhlCisgICAgICAgY2hhcmFjdGVycyB3aGljaCBhcmUgaW4gdGhlIGNsYXNzIGJ5IGVudW1lcmF0aW5nIHRob3NlIHRoYXQgYXJlIG5vdC4gSXQKKyAgICAgICBpcyBub3QgYW4gYXNzZXJ0aW9uOiBpdCBzdGlsbCBjb25zdW1lcyBhICBjaGFyYWN0ZXIgIGZyb20gIHRoZSAgc3ViamVjdAorICAgICAgIHN0cmluZywgYW5kIGZhaWxzIGlmIHRoZSBjdXJyZW50IHBvaW50ZXIgaXMgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgorCisgICAgICAgSW4gIFVURi04IG1vZGUsIGNoYXJhY3RlcnMgd2l0aCB2YWx1ZXMgZ3JlYXRlciB0aGFuIDI1NSBjYW4gYmUgaW5jbHVkZWQKKyAgICAgICBpbiBhIGNsYXNzIGFzIGEgbGl0ZXJhbCBzdHJpbmcgb2YgYnl0ZXMsIG9yIGJ5IHVzaW5nIHRoZSAgXHh7ICBlc2NhcGluZworICAgICAgIG1lY2hhbmlzbS4KKworICAgICAgIFdoZW4gIGNhc2VsZXNzICBtYXRjaGluZyAgaXMgc2V0LCBhbnkgbGV0dGVycyBpbiBhIGNsYXNzIHJlcHJlc2VudCBib3RoCisgICAgICAgdGhlaXIgdXBwZXIgY2FzZSBhbmQgbG93ZXIgY2FzZSB2ZXJzaW9ucywgc28gZm9yICBleGFtcGxlLCAgYSAgY2FzZWxlc3MKKyAgICAgICBbYWVpb3VdICBtYXRjaGVzICAiQSIgIGFzIHdlbGwgYXMgImEiLCBhbmQgYSBjYXNlbGVzcyBbXmFlaW91XSBkb2VzIG5vdAorICAgICAgIG1hdGNoICJBIiwgd2hlcmVhcyBhIGNhc2VmdWwgdmVyc2lvbiB3b3VsZC4gUENSRSBkb2VzIG5vdCAgc3VwcG9ydCAgdGhlCisgICAgICAgY29uY2VwdCBvZiBjYXNlIGZvciBjaGFyYWN0ZXJzIHdpdGggdmFsdWVzIGdyZWF0ZXIgdGhhbiAyNTUuCisKKyAgICAgICBUaGUgIG5ld2xpbmUgY2hhcmFjdGVyIGlzIG5ldmVyIHRyZWF0ZWQgaW4gYW55IHNwZWNpYWwgd2F5IGluIGNoYXJhY3RlcgorICAgICAgIGNsYXNzZXMsIHdoYXRldmVyIHRoZSBzZXR0aW5nICBvZiAgdGhlICBQQ1JFX0RPVEFMTCAgb3IgIFBDUkVfTVVMVElMSU5FCisgICAgICAgb3B0aW9ucyBpcy4gQSBjbGFzcyBzdWNoIGFzIFteYV0gd2lsbCBhbHdheXMgbWF0Y2ggYSBuZXdsaW5lLgorCisgICAgICAgVGhlICBtaW51cyAoaHlwaGVuKSBjaGFyYWN0ZXIgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHJhbmdlIG9mIGNoYXJhYy0KKyAgICAgICB0ZXJzIGluIGEgY2hhcmFjdGVyICBjbGFzcy4gIEZvciAgZXhhbXBsZSwgIFtkLW1dICBtYXRjaGVzICBhbnkgIGxldHRlcgorICAgICAgIGJldHdlZW4gIGQgIGFuZCAgbSwgIGluY2x1c2l2ZS4gIElmICBhIG1pbnVzIGNoYXJhY3RlciBpcyByZXF1aXJlZCBpbiBhCisgICAgICAgY2xhc3MsIGl0IG11c3QgYmUgZXNjYXBlZCB3aXRoIGEgYmFja3NsYXNoICBvciAgYXBwZWFyICBpbiAgYSAgcG9zaXRpb24KKyAgICAgICB3aGVyZSAgaXQgY2Fubm90IGJlIGludGVycHJldGVkIGFzIGluZGljYXRpbmcgYSByYW5nZSwgdHlwaWNhbGx5IGFzIHRoZQorICAgICAgIGZpcnN0IG9yIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBjbGFzcy4KKworICAgICAgIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBoYXZlIHRoZSBsaXRlcmFsIGNoYXJhY3RlciAiXSIgYXMgdGhlIGVuZCBjaGFyYWMtCisgICAgICAgdGVyICBvZiBhIHJhbmdlLiBBIHBhdHRlcm4gc3VjaCBhcyBbVy1dNDZdIGlzIGludGVycHJldGVkIGFzIGEgY2xhc3Mgb2YKKyAgICAgICB0d28gY2hhcmFjdGVycyAoIlciIGFuZCAiLSIpIGZvbGxvd2VkIGJ5IGEgbGl0ZXJhbCBzdHJpbmcgIjQ2XSIsIHNvICBpdAorICAgICAgIHdvdWxkICBtYXRjaCAgIlc0Nl0iICBvciAgIi00Nl0iLiBIb3dldmVyLCBpZiB0aGUgIl0iIGlzIGVzY2FwZWQgd2l0aCBhCisgICAgICAgYmFja3NsYXNoIGl0IGlzIGludGVycHJldGVkIGFzIHRoZSBlbmQgb2YgcmFuZ2UsIHNvIFtXLVxdNDZdIGlzICBpbnRlci0KKyAgICAgICBwcmV0ZWQgIGFzICBhICBzaW5nbGUgY2xhc3MgY29udGFpbmluZyBhIHJhbmdlIGZvbGxvd2VkIGJ5IHR3byBzZXBhcmF0ZQorICAgICAgIGNoYXJhY3RlcnMuIFRoZSBvY3RhbCBvciBoZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiAiXSIgY2FuIGFsc28gIGJlCisgICAgICAgdXNlZCB0byBlbmQgYSByYW5nZS4KKworICAgICAgIFJhbmdlcyAgb3BlcmF0ZSBpbiB0aGUgY29sbGF0aW5nIHNlcXVlbmNlIG9mIGNoYXJhY3RlciB2YWx1ZXMuIFRoZXkgY2FuCisgICAgICAgYWxzbyAgYmUgIHVzZWQgIGZvciAgY2hhcmFjdGVycyAgc3BlY2lmaWVkICBudW1lcmljYWxseSwgIGZvciAgIGV4YW1wbGUKKyAgICAgICBbXDAwMC1cMDM3XS4gIEluIFVURi04IG1vZGUsIHJhbmdlcyBjYW4gaW5jbHVkZSBjaGFyYWN0ZXJzIHdob3NlIHZhbHVlcworICAgICAgIGFyZSBncmVhdGVyIHRoYW4gMjU1LCBmb3IgZXhhbXBsZSBbXHh7MTAwfS1ceHsyZmZ9XS4KKworICAgICAgIElmIGEgcmFuZ2UgdGhhdCBpbmNsdWRlcyBsZXR0ZXJzIGlzIHVzZWQgd2hlbiBjYXNlbGVzcyBtYXRjaGluZyBpcyBzZXQsCisgICAgICAgaXQgbWF0Y2hlcyB0aGUgbGV0dGVycyBpbiBlaXRoZXIgY2FzZS4gRm9yIGV4YW1wbGUsIFtXLWNdIGlzIGVxdWl2YWxlbnQKKyAgICAgICB0byBbXVtcXl9gd3h5emFiY10sIG1hdGNoZWQgY2FzZWxlc3NseSwgYW5kIGlmIGNoYXJhY3RlciB0YWJsZXMgZm9yIHRoZQorICAgICAgICJmciIgIGxvY2FsZSAgYXJlICBpbiB1c2UsIFtceGM4LVx4Y2JdIG1hdGNoZXMgYWNjZW50ZWQgRSBjaGFyYWN0ZXJzIGluCisgICAgICAgYm90aCBjYXNlcy4KKworICAgICAgIFRoZSBjaGFyYWN0ZXIgdHlwZXMgXGQsIFxELCBccywgXFMsIFx3LCBhbmQgXFcgbWF5ICBhbHNvICBhcHBlYXIgIGluICBhCisgICAgICAgY2hhcmFjdGVyICBjbGFzcywgIGFuZCBhZGQgdGhlIGNoYXJhY3RlcnMgdGhhdCB0aGV5IG1hdGNoIHRvIHRoZSBjbGFzcy4KKyAgICAgICBGb3IgZXhhbXBsZSwgW1xkQUJDREVGXSBtYXRjaGVzIGFueSBoZXhhZGVjaW1hbCBkaWdpdC4gQSBjaXJjdW1mbGV4IGNhbgorICAgICAgIGNvbnZlbmllbnRseSAgYmUgIHVzZWQgd2l0aCB0aGUgdXBwZXIgY2FzZSBjaGFyYWN0ZXIgdHlwZXMgdG8gc3BlY2lmeSBhCisgICAgICAgbW9yZSByZXN0cmljdGVkIHNldCBvZiBjaGFyYWN0ZXJzIHRoYW4gdGhlIG1hdGNoaW5nICBsb3dlciAgY2FzZSAgdHlwZS4KKyAgICAgICBGb3IgIGV4YW1wbGUsICB0aGUgIGNsYXNzICBbXlxXX10gIG1hdGNoZXMgYW55IGxldHRlciBvciBkaWdpdCwgYnV0IG5vdAorICAgICAgIHVuZGVyc2NvcmUuCisKKyAgICAgICBBbGwgbm9uLWFscGhhbWVyaWMgY2hhcmFjdGVycyBvdGhlciB0aGFuIFwsIC0sIF4gKGF0IHRoZSBzdGFydCkgYW5kIHRoZQorICAgICAgIHRlcm1pbmF0aW5nIF0gYXJlIG5vbi1zcGVjaWFsIGluIGNoYXJhY3RlciBjbGFzc2VzLCBidXQgaXQgZG9lcyBubyBoYXJtCisgICAgICAgaWYgdGhleSBhcmUgZXNjYXBlZC4KKworCitQT1NJWCBDSEFSQUNURVIgQ0xBU1NFUworCisgICAgICAgUGVybCBzdXBwb3J0cyB0aGUgUE9TSVggbm90YXRpb24gIGZvciAgY2hhcmFjdGVyICBjbGFzc2VzLCAgd2hpY2ggIHVzZXMKKyAgICAgICBuYW1lcyAgZW5jbG9zZWQgYnkgWzogYW5kIDpdIHdpdGhpbiB0aGUgZW5jbG9zaW5nIHNxdWFyZSBicmFja2V0cy4gUENSRQorICAgICAgIGFsc28gc3VwcG9ydHMgdGhpcyBub3RhdGlvbi4gRm9yIGV4YW1wbGUsCisKKyAgICAgICAgIFswMVs6YWxwaGE6XSVdCisKKyAgICAgICBtYXRjaGVzICIwIiwgIjEiLCBhbnkgYWxwaGFiZXRpYyBjaGFyYWN0ZXIsIG9yICIlIi4gVGhlIHN1cHBvcnRlZCBjbGFzcworICAgICAgIG5hbWVzIGFyZQorCisgICAgICAgICBhbG51bSAgICBsZXR0ZXJzIGFuZCBkaWdpdHMKKyAgICAgICAgIGFscGhhICAgIGxldHRlcnMKKyAgICAgICAgIGFzY2lpICAgIGNoYXJhY3RlciBjb2RlcyAwIC0gMTI3CisgICAgICAgICBibGFuayAgICBzcGFjZSBvciB0YWIgb25seQorICAgICAgICAgY250cmwgICAgY29udHJvbCBjaGFyYWN0ZXJzCisgICAgICAgICBkaWdpdCAgICBkZWNpbWFsIGRpZ2l0cyAoc2FtZSBhcyBcZCkKKyAgICAgICAgIGdyYXBoICAgIHByaW50aW5nIGNoYXJhY3RlcnMsIGV4Y2x1ZGluZyBzcGFjZQorICAgICAgICAgbG93ZXIgICAgbG93ZXIgY2FzZSBsZXR0ZXJzCisgICAgICAgICBwcmludCAgICBwcmludGluZyBjaGFyYWN0ZXJzLCBpbmNsdWRpbmcgc3BhY2UKKyAgICAgICAgIHB1bmN0ICAgIHByaW50aW5nIGNoYXJhY3RlcnMsIGV4Y2x1ZGluZyBsZXR0ZXJzIGFuZCBkaWdpdHMKKyAgICAgICAgIHNwYWNlICAgIHdoaXRlIHNwYWNlIChub3QgcXVpdGUgdGhlIHNhbWUgYXMgXHMpCisgICAgICAgICB1cHBlciAgICB1cHBlciBjYXNlIGxldHRlcnMKKyAgICAgICAgIHdvcmQgICAgICJ3b3JkIiBjaGFyYWN0ZXJzIChzYW1lIGFzIFx3KQorICAgICAgICAgeGRpZ2l0ICAgaGV4YWRlY2ltYWwgZGlnaXRzCisKKyAgICAgICBUaGUgICJzcGFjZSIgY2hhcmFjdGVycyBhcmUgSFQgKDkpLCBMRiAoMTApLCBWVCAoMTEpLCBGRiAoMTIpLCBDUiAoMTMpLAorICAgICAgIGFuZCBzcGFjZSAoMzIpLiBOb3RpY2UgdGhhdCB0aGlzIGxpc3QgaW5jbHVkZXMgdGhlIFZUICBjaGFyYWN0ZXIgIChjb2RlCisgICAgICAgMTEpLiBUaGlzIG1ha2VzICJzcGFjZSIgZGlmZmVyZW50IHRvIFxzLCB3aGljaCBkb2VzIG5vdCBpbmNsdWRlIFZUIChmb3IKKyAgICAgICBQZXJsIGNvbXBhdGliaWxpdHkpLgorCisgICAgICAgVGhlIG5hbWUgIndvcmQiIGlzIGEgUGVybCBleHRlbnNpb24sIGFuZCAiYmxhbmsiICBpcyAgYSAgR05VICBleHRlbnNpb24KKyAgICAgICBmcm9tICBQZXJsICA1LjguIEFub3RoZXIgUGVybCBleHRlbnNpb24gaXMgbmVnYXRpb24sIHdoaWNoIGlzIGluZGljYXRlZAorICAgICAgIGJ5IGEgXiBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGNvbG9uLiBGb3IgZXhhbXBsZSwKKworICAgICAgICAgWzEyWzpeZGlnaXQ6XV0KKworICAgICAgIG1hdGNoZXMgIjEiLCAiMiIsIG9yIGFueSBub24tZGlnaXQuIFBDUkUgKGFuZCBQZXJsKSBhbHNvIHJlY29nbml6ZSAgdGhlCisgICAgICAgUE9TSVggc3ludGF4IFsuY2guXSBhbmQgWz1jaD1dIHdoZXJlICJjaCIgaXMgYSAiY29sbGF0aW5nIGVsZW1lbnQiLCBidXQKKyAgICAgICB0aGVzZSBhcmUgbm90IHN1cHBvcnRlZCwgYW5kIGFuIGVycm9yIGlzIGdpdmVuIGlmIHRoZXkgYXJlIGVuY291bnRlcmVkLgorCisgICAgICAgSW4gVVRGLTggbW9kZSwgY2hhcmFjdGVycyB3aXRoIHZhbHVlcyBncmVhdGVyIHRoYW4gMjU1IGRvIG5vdCBtYXRjaCBhbnkKKyAgICAgICBvZiB0aGUgUE9TSVggY2hhcmFjdGVyIGNsYXNzZXMuCisKKworVkVSVElDQUwgQkFSCisKKyAgICAgICBWZXJ0aWNhbCBiYXIgY2hhcmFjdGVycyBhcmUgdXNlZCB0byBzZXBhcmF0ZSBhbHRlcm5hdGl2ZSBwYXR0ZXJucy4gIEZvcgorICAgICAgIGV4YW1wbGUsIHRoZSBwYXR0ZXJuCisKKyAgICAgICAgIGdpbGJlcnR8c3VsbGl2YW4KKworICAgICAgIG1hdGNoZXMgIGVpdGhlciAiZ2lsYmVydCIgb3IgInN1bGxpdmFuIi4gQW55IG51bWJlciBvZiBhbHRlcm5hdGl2ZXMgbWF5CisgICAgICAgYXBwZWFyLCBhbmQgYW4gZW1wdHkgIGFsdGVybmF0aXZlICBpcyAgcGVybWl0dGVkICAobWF0Y2hpbmcgIHRoZSAgZW1wdHkKKyAgICAgICBzdHJpbmcpLiAgIFRoZSAgbWF0Y2hpbmcgIHByb2Nlc3MgIHRyaWVzIGVhY2ggYWx0ZXJuYXRpdmUgaW4gdHVybiwgZnJvbQorICAgICAgIGxlZnQgdG8gcmlnaHQsIGFuZCB0aGUgZmlyc3Qgb25lIHRoYXQgc3VjY2VlZHMgaXMgdXNlZC4gSWYgdGhlIGFsdGVybmEtCisgICAgICAgdGl2ZXMgIGFyZSB3aXRoaW4gYSBzdWJwYXR0ZXJuIChkZWZpbmVkIGJlbG93KSwgInN1Y2NlZWRzIiBtZWFucyBtYXRjaC0KKyAgICAgICBpbmcgdGhlIHJlc3Qgb2YgdGhlIG1haW4gcGF0dGVybiBhcyB3ZWxsIGFzIHRoZSBhbHRlcm5hdGl2ZSBpbiB0aGUgc3ViLQorICAgICAgIHBhdHRlcm4uCisKKworSU5URVJOQUwgT1BUSU9OIFNFVFRJTkcKKworICAgICAgIFRoZSAgc2V0dGluZ3MgIG9mICB0aGUgIFBDUkVfQ0FTRUxFU1MsIFBDUkVfTVVMVElMSU5FLCBQQ1JFX0RPVEFMTCwgYW5kCisgICAgICAgUENSRV9FWFRFTkRFRCBvcHRpb25zIGNhbiBiZSBjaGFuZ2VkICBmcm9tICB3aXRoaW4gIHRoZSAgcGF0dGVybiAgYnkgIGEKKyAgICAgICBzZXF1ZW5jZSAgb2YgIFBlcmwgIG9wdGlvbiAgbGV0dGVycyAgZW5jbG9zZWQgYmV0d2VlbiAiKD8iIGFuZCAiKSIuIFRoZQorICAgICAgIG9wdGlvbiBsZXR0ZXJzIGFyZQorCisgICAgICAgICBpICBmb3IgUENSRV9DQVNFTEVTUworICAgICAgICAgbSAgZm9yIFBDUkVfTVVMVElMSU5FCisgICAgICAgICBzICBmb3IgUENSRV9ET1RBTEwKKyAgICAgICAgIHggIGZvciBQQ1JFX0VYVEVOREVECisKKyAgICAgICBGb3IgZXhhbXBsZSwgKD9pbSkgc2V0cyBjYXNlbGVzcywgbXVsdGlsaW5lIG1hdGNoaW5nLiBJdCBpcyBhbHNvIHBvc3NpLQorICAgICAgIGJsZSB0byB1bnNldCB0aGVzZSBvcHRpb25zIGJ5IHByZWNlZGluZyB0aGUgbGV0dGVyIHdpdGggYSBoeXBoZW4sIGFuZCBhCisgICAgICAgY29tYmluZWQgc2V0dGluZyBhbmQgdW5zZXR0aW5nIHN1Y2ggYXMgKD9pbS1zeCksIHdoaWNoIHNldHMgIFBDUkVfQ0FTRS0KKyAgICAgICBMRVNTICBhbmQgUENSRV9NVUxUSUxJTkUgd2hpbGUgdW5zZXR0aW5nIFBDUkVfRE9UQUxMIGFuZCBQQ1JFX0VYVEVOREVELAorICAgICAgIGlzIGFsc28gcGVybWl0dGVkLiBJZiBhICBsZXR0ZXIgIGFwcGVhcnMgIGJvdGggIGJlZm9yZSAgYW5kICBhZnRlciAgdGhlCisgICAgICAgaHlwaGVuLCB0aGUgb3B0aW9uIGlzIHVuc2V0LgorCisgICAgICAgV2hlbiAgYW4gb3B0aW9uIGNoYW5nZSBvY2N1cnMgYXQgdG9wIGxldmVsICh0aGF0IGlzLCBub3QgaW5zaWRlIHN1YnBhdC0KKyAgICAgICB0ZXJuIHBhcmVudGhlc2VzKSwgdGhlIGNoYW5nZSBhcHBsaWVzIHRvIHRoZSByZW1haW5kZXIgb2YgIHRoZSAgcGF0dGVybgorICAgICAgIHRoYXQgZm9sbG93cy4gIElmIHRoZSBjaGFuZ2UgaXMgcGxhY2VkIHJpZ2h0IGF0IHRoZSBzdGFydCBvZiBhIHBhdHRlcm4sCisgICAgICAgUENSRSBleHRyYWN0cyBpdCBpbnRvIHRoZSBnbG9iYWwgb3B0aW9ucyAoYW5kIGl0IHdpbGwgdGhlcmVmb3JlIHNob3cgdXAKKyAgICAgICBpbiBkYXRhIGV4dHJhY3RlZCBieSB0aGUgcGNyZV9mdWxsaW5mbygpIGZ1bmN0aW9uKS4KKworICAgICAgIEFuIG9wdGlvbiBjaGFuZ2Ugd2l0aGluIGEgc3VicGF0dGVybiBhZmZlY3RzIG9ubHkgdGhhdCBwYXJ0IG9mIHRoZSBjdXItCisgICAgICAgcmVudCBwYXR0ZXJuIHRoYXQgZm9sbG93cyBpdCwgc28KKworICAgICAgICAgKGEoP2kpYiljCisKKyAgICAgICBtYXRjaGVzIGFiYyBhbmQgYUJjIGFuZCBubyBvdGhlciBzdHJpbmdzIChhc3N1bWluZyBQQ1JFX0NBU0VMRVNTIGlzIG5vdAorICAgICAgIHVzZWQpLiAgIEJ5ICB0aGlzIG1lYW5zLCBvcHRpb25zIGNhbiBiZSBtYWRlIHRvIGhhdmUgZGlmZmVyZW50IHNldHRpbmdzCisgICAgICAgaW4gZGlmZmVyZW50IHBhcnRzIG9mIHRoZSBwYXR0ZXJuLiBBbnkgY2hhbmdlcyBtYWRlIGluIG9uZSAgYWx0ZXJuYXRpdmUKKyAgICAgICBkbyAgY2FycnkgIG9uICBpbnRvIHN1YnNlcXVlbnQgYnJhbmNoZXMgd2l0aGluIHRoZSBzYW1lIHN1YnBhdHRlcm4uIEZvcgorICAgICAgIGV4YW1wbGUsCisKKyAgICAgICAgIChhKD9pKWJ8YykKKworICAgICAgIG1hdGNoZXMgImFiIiwgImFCIiwgImMiLCBhbmQgIkMiLCBldmVuIHRob3VnaCAgd2hlbiAgbWF0Y2hpbmcgICJDIiAgdGhlCisgICAgICAgZmlyc3QgIGJyYW5jaCAgaXMgIGFiYW5kb25lZCBiZWZvcmUgdGhlIG9wdGlvbiBzZXR0aW5nLiBUaGlzIGlzIGJlY2F1c2UKKyAgICAgICB0aGUgZWZmZWN0cyBvZiBvcHRpb24gc2V0dGluZ3MgaGFwcGVuIGF0IGNvbXBpbGUgdGltZS4gVGhlcmUgIHdvdWxkICBiZQorICAgICAgIHNvbWUgdmVyeSB3ZWlyZCBiZWhhdmlvdXIgb3RoZXJ3aXNlLgorCisgICAgICAgVGhlICBQQ1JFLXNwZWNpZmljICBvcHRpb25zIFBDUkVfVU5HUkVFRFkgYW5kIFBDUkVfRVhUUkEgY2FuIGJlIGNoYW5nZWQKKyAgICAgICBpbiB0aGUgc2FtZSB3YXkgYXMgdGhlIFBlcmwtY29tcGF0aWJsZSBvcHRpb25zIGJ5IHVzaW5nIHRoZSAgY2hhcmFjdGVycworICAgICAgIFUgIGFuZCBYIHJlc3BlY3RpdmVseS4gVGhlICg/WCkgZmxhZyBzZXR0aW5nIGlzIHNwZWNpYWwgaW4gdGhhdCBpdCBtdXN0CisgICAgICAgYWx3YXlzIG9jY3VyIGVhcmxpZXIgaW4gdGhlIHBhdHRlcm4gdGhhbiBhbnkgb2YgdGhlIGFkZGl0aW9uYWwgZmVhdHVyZXMKKyAgICAgICBpdCB0dXJucyBvbiwgZXZlbiB3aGVuIGl0IGlzIGF0IHRvcCBsZXZlbC4gSXQgaXMgYmVzdCBwdXQgYXQgdGhlIHN0YXJ0LgorCisKK1NVQlBBVFRFUk5TCisKKyAgICAgICBTdWJwYXR0ZXJucyBhcmUgZGVsaW1pdGVkIGJ5IHBhcmVudGhlc2VzIChyb3VuZCBicmFja2V0cyksIHdoaWNoIGNhbiBiZQorICAgICAgIG5lc3RlZC4gIE1hcmtpbmcgcGFydCBvZiBhIHBhdHRlcm4gYXMgYSBzdWJwYXR0ZXJuIGRvZXMgdHdvIHRoaW5nczoKKworICAgICAgIDEuIEl0IGxvY2FsaXplcyBhIHNldCBvZiBhbHRlcm5hdGl2ZXMuIEZvciBleGFtcGxlLCB0aGUgcGF0dGVybgorCisgICAgICAgICBjYXQoYXJhY3R8ZXJwaWxsYXJ8KQorCisgICAgICAgbWF0Y2hlcyAgb25lICBvZiB0aGUgd29yZHMgImNhdCIsICJjYXRhcmFjdCIsIG9yICJjYXRlcnBpbGxhciIuIFdpdGhvdXQKKyAgICAgICB0aGUgcGFyZW50aGVzZXMsIGl0IHdvdWxkIG1hdGNoICJjYXRhcmFjdCIsICAiZXJwaWxsYXIiICBvciAgdGhlICBlbXB0eQorICAgICAgIHN0cmluZy4KKworICAgICAgIDIuICBJdCAgc2V0cyAgdXAgIHRoZSAgc3VicGF0dGVybiBhcyBhIGNhcHR1cmluZyBzdWJwYXR0ZXJuIChhcyBkZWZpbmVkCisgICAgICAgYWJvdmUpLiAgV2hlbiB0aGUgd2hvbGUgcGF0dGVybiBtYXRjaGVzLCB0aGF0IHBvcnRpb24gIG9mICB0aGUgIHN1YmplY3QKKyAgICAgICBzdHJpbmcgdGhhdCBtYXRjaGVkIHRoZSBzdWJwYXR0ZXJuIGlzIHBhc3NlZCBiYWNrIHRvIHRoZSBjYWxsZXIgdmlhIHRoZQorICAgICAgIG92ZWN0b3IgYXJndW1lbnQgb2YgcGNyZV9leGVjKCkuIE9wZW5pbmcgcGFyZW50aGVzZXMgYXJlICBjb3VudGVkICBmcm9tCisgICAgICAgbGVmdCAgdG8gcmlnaHQgKHN0YXJ0aW5nIGZyb20gMSkgdG8gb2J0YWluIHRoZSBudW1iZXJzIG9mIHRoZSBjYXB0dXJpbmcKKyAgICAgICBzdWJwYXR0ZXJucy4KKworICAgICAgIEZvciBleGFtcGxlLCBpZiB0aGUgc3RyaW5nICJ0aGUgcmVkIGtpbmciIGlzIG1hdGNoZWQgYWdhaW5zdCAgdGhlICBwYXQtCisgICAgICAgdGVybgorCisgICAgICAgICB0aGUgKChyZWR8d2hpdGUpIChraW5nfHF1ZWVuKSkKKworICAgICAgIHRoZSBjYXB0dXJlZCBzdWJzdHJpbmdzIGFyZSAicmVkIGtpbmciLCAicmVkIiwgYW5kICJraW5nIiwgYW5kIGFyZSBudW0tCisgICAgICAgYmVyZWQgMSwgMiwgYW5kIDMsIHJlc3BlY3RpdmVseS4KKworICAgICAgIFRoZSBmYWN0IHRoYXQgcGxhaW4gcGFyZW50aGVzZXMgZnVsZmlsICB0d28gIGZ1bmN0aW9ucyAgaXMgIG5vdCAgYWx3YXlzCisgICAgICAgaGVscGZ1bC4gICBUaGVyZSBhcmUgb2Z0ZW4gdGltZXMgd2hlbiBhIGdyb3VwaW5nIHN1YnBhdHRlcm4gaXMgcmVxdWlyZWQKKyAgICAgICB3aXRob3V0IGEgY2FwdHVyaW5nIHJlcXVpcmVtZW50LiBJZiBhbiBvcGVuaW5nIHBhcmVudGhlc2lzIGlzICBmb2xsb3dlZAorICAgICAgIGJ5ICBhIHF1ZXN0aW9uIG1hcmsgYW5kIGEgY29sb24sIHRoZSBzdWJwYXR0ZXJuIGRvZXMgbm90IGRvIGFueSBjYXB0dXItCisgICAgICAgaW5nLCBhbmQgaXMgbm90IGNvdW50ZWQgd2hlbiBjb21wdXRpbmcgdGhlICBudW1iZXIgIG9mICBhbnkgIHN1YnNlcXVlbnQKKyAgICAgICBjYXB0dXJpbmcgIHN1YnBhdHRlcm5zLiBGb3IgZXhhbXBsZSwgaWYgdGhlIHN0cmluZyAidGhlIHdoaXRlIHF1ZWVuIiBpcworICAgICAgIG1hdGNoZWQgYWdhaW5zdCB0aGUgcGF0dGVybgorCisgICAgICAgICB0aGUgKCg/OnJlZHx3aGl0ZSkgKGtpbmd8cXVlZW4pKQorCisgICAgICAgdGhlIGNhcHR1cmVkIHN1YnN0cmluZ3MgYXJlICJ3aGl0ZSBxdWVlbiIgYW5kICJxdWVlbiIsIGFuZCBhcmUgbnVtYmVyZWQKKyAgICAgICAxICBhbmQgMi4gVGhlIG1heGltdW0gbnVtYmVyIG9mIGNhcHR1cmluZyBzdWJwYXR0ZXJucyBpcyA2NTUzNSwgYW5kIHRoZQorICAgICAgIG1heGltdW0gZGVwdGggb2YgbmVzdGluZyBvZiBhbGwgc3VicGF0dGVybnMsIGJvdGggIGNhcHR1cmluZyAgYW5kICBub24tCisgICAgICAgY2FwdHVyaW5nLCBpcyAyMDAuCisKKyAgICAgICBBcyAgYSAgY29udmVuaWVudCBzaG9ydGhhbmQsIGlmIGFueSBvcHRpb24gc2V0dGluZ3MgYXJlIHJlcXVpcmVkIGF0IHRoZQorICAgICAgIHN0YXJ0IG9mIGEgbm9uLWNhcHR1cmluZyBzdWJwYXR0ZXJuLCAgdGhlICBvcHRpb24gIGxldHRlcnMgIG1heSAgYXBwZWFyCisgICAgICAgYmV0d2VlbiB0aGUgIj8iIGFuZCB0aGUgIjoiLiBUaHVzIHRoZSB0d28gcGF0dGVybnMKKworICAgICAgICAgKD9pOnNhdHVyZGF5fHN1bmRheSkKKyAgICAgICAgICg/Oig/aSlzYXR1cmRheXxzdW5kYXkpCisKKyAgICAgICBtYXRjaCBleGFjdGx5IHRoZSBzYW1lIHNldCBvZiBzdHJpbmdzLiBCZWNhdXNlIGFsdGVybmF0aXZlIGJyYW5jaGVzIGFyZQorICAgICAgIHRyaWVkIGZyb20gbGVmdCB0byByaWdodCwgYW5kIG9wdGlvbnMgYXJlIG5vdCByZXNldCB1bnRpbCAgdGhlICBlbmQgIG9mCisgICAgICAgdGhlICBzdWJwYXR0ZXJuIGlzIHJlYWNoZWQsIGFuIG9wdGlvbiBzZXR0aW5nIGluIG9uZSBicmFuY2ggZG9lcyBhZmZlY3QKKyAgICAgICBzdWJzZXF1ZW50IGJyYW5jaGVzLCBzbyB0aGUgYWJvdmUgcGF0dGVybnMgbWF0Y2ggIlNVTkRBWSIgIGFzICB3ZWxsICBhcworICAgICAgICJTYXR1cmRheSIuCisKKworTkFNRUQgU1VCUEFUVEVSTlMKKworICAgICAgIElkZW50aWZ5aW5nICBjYXB0dXJpbmcgIHBhcmVudGhlc2VzICBieSBudW1iZXIgaXMgc2ltcGxlLCBidXQgaXQgY2FuIGJlCisgICAgICAgdmVyeSBoYXJkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIG51bWJlcnMgaW4gY29tcGxpY2F0ZWQgIHJlZ3VsYXIgIGV4cHJlcy0KKyAgICAgICBzaW9ucy4gIEZ1cnRoZXJtb3JlLCAgaWYgIGFuICBleHByZXNzaW9uICBpcyAgbW9kaWZpZWQsIHRoZSBudW1iZXJzIG1heQorICAgICAgIGNoYW5nZS4gVG8gaGVscCB3aXRoIHRoZSBkaWZmaWN1bHR5LCBQQ1JFIHN1cHBvcnRzIHRoZSBuYW1pbmcgIG9mICBzdWItCisgICAgICAgcGF0dGVybnMsICBzb21ldGhpbmcgIHRoYXQgIFBlcmwgIGRvZXMgIG5vdCAgcHJvdmlkZS4gVGhlIFB5dGhvbiBzeW50YXgKKyAgICAgICAoP1A8bmFtZT4uLi4pIGlzIHVzZWQuIE5hbWVzIGNvbnNpc3QgIG9mICBhbHBoYW51bWVyaWMgIGNoYXJhY3RlcnMgIGFuZAorICAgICAgIHVuZGVyc2NvcmVzLCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgcGF0dGVybi4KKworICAgICAgIE5hbWVkICBjYXB0dXJpbmcgIHBhcmVudGhlc2VzICBhcmUgIHN0aWxsICBhbGxvY2F0ZWQgbnVtYmVycyBhcyB3ZWxsIGFzCisgICAgICAgbmFtZXMuIFRoZSBQQ1JFIEFQSSBwcm92aWRlcyBmdW5jdGlvbiBjYWxscyBmb3IgZXh0cmFjdGluZyB0aGUgbmFtZS10by0KKyAgICAgICBudW1iZXIgIHRyYW5zbGF0aW9uICB0YWJsZSBmcm9tIGEgY29tcGlsZWQgcGF0dGVybi4gRm9yIGZ1cnRoZXIgZGV0YWlscworICAgICAgIHNlZSB0aGUgcGNyZWFwaSBkb2N1bWVudGF0aW9uLgorCisKK1JFUEVUSVRJT04KKworICAgICAgIFJlcGV0aXRpb24gaXMgc3BlY2lmaWVkIGJ5IHF1YW50aWZpZXJzLCB3aGljaCBjYW4gIGZvbGxvdyAgYW55ICBvZiAgdGhlCisgICAgICAgZm9sbG93aW5nIGl0ZW1zOgorCisgICAgICAgICBhIGxpdGVyYWwgZGF0YSBjaGFyYWN0ZXIKKyAgICAgICAgIHRoZSAuIG1ldGFjaGFyYWN0ZXIKKyAgICAgICAgIHRoZSBcQyBlc2NhcGUgc2VxdWVuY2UKKyAgICAgICAgIGVzY2FwZXMgc3VjaCBhcyBcZCB0aGF0IG1hdGNoIHNpbmdsZSBjaGFyYWN0ZXJzCisgICAgICAgICBhIGNoYXJhY3RlciBjbGFzcworICAgICAgICAgYSBiYWNrIHJlZmVyZW5jZSAoc2VlIG5leHQgc2VjdGlvbikKKyAgICAgICAgIGEgcGFyZW50aGVzaXplZCBzdWJwYXR0ZXJuICh1bmxlc3MgaXQgaXMgYW4gYXNzZXJ0aW9uKQorCisgICAgICAgVGhlICBnZW5lcmFsIHJlcGV0aXRpb24gcXVhbnRpZmllciBzcGVjaWZpZXMgYSBtaW5pbXVtIGFuZCBtYXhpbXVtIG51bS0KKyAgICAgICBiZXIgb2YgcGVybWl0dGVkIG1hdGNoZXMsIGJ5IGdpdmluZyB0aGUgdHdvIG51bWJlcnMgaW4gIGN1cmx5ICBicmFja2V0cworICAgICAgIChicmFjZXMpLCAgc2VwYXJhdGVkICBieSAgYSBjb21tYS4gVGhlIG51bWJlcnMgbXVzdCBiZSBsZXNzIHRoYW4gNjU1MzYsCisgICAgICAgYW5kIHRoZSBmaXJzdCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2Vjb25kLiBGb3IgZXhhbXBsZToKKworICAgICAgICAgensyLDR9CisKKyAgICAgICBtYXRjaGVzICJ6eiIsICJ6enoiLCBvciAienp6eiIuIEEgY2xvc2luZyBicmFjZSBvbiBpdHMgIG93biAgaXMgIG5vdCAgYQorICAgICAgIHNwZWNpYWwgIGNoYXJhY3Rlci4gIElmICB0aGUgc2Vjb25kIG51bWJlciBpcyBvbWl0dGVkLCBidXQgdGhlIGNvbW1hIGlzCisgICAgICAgcHJlc2VudCwgdGhlcmUgaXMgbm8gdXBwZXIgbGltaXQ7IGlmIHRoZSBzZWNvbmQgbnVtYmVyICBhbmQgIHRoZSAgY29tbWEKKyAgICAgICBhcmUgIGJvdGggb21pdHRlZCwgdGhlIHF1YW50aWZpZXIgc3BlY2lmaWVzIGFuIGV4YWN0IG51bWJlciBvZiByZXF1aXJlZAorICAgICAgIG1hdGNoZXMuIFRodXMKKworICAgICAgICAgW2FlaW91XXszLH0KKworICAgICAgIG1hdGNoZXMgYXQgbGVhc3QgMyBzdWNjZXNzaXZlIHZvd2VscywgYnV0IG1heSBtYXRjaCBtYW55IG1vcmUsIHdoaWxlCisKKyAgICAgICAgIFxkezh9CisKKyAgICAgICBtYXRjaGVzIGV4YWN0bHkgOCBkaWdpdHMuIEFuIG9wZW5pbmcgY3VybHkgYnJhY2tldCB0aGF0ICBhcHBlYXJzICBpbiAgYQorICAgICAgIHBvc2l0aW9uICB3aGVyZSBhIHF1YW50aWZpZXIgaXMgbm90IGFsbG93ZWQsIG9yIG9uZSB0aGF0IGRvZXMgbm90IG1hdGNoCisgICAgICAgdGhlIHN5bnRheCBvZiBhIHF1YW50aWZpZXIsIGlzIHRha2VuIGFzIGEgbGl0ZXJhbCBjaGFyYWN0ZXIuIEZvciAgZXhhbS0KKyAgICAgICBwbGUsIHssNn0gaXMgbm90IGEgcXVhbnRpZmllciwgYnV0IGEgbGl0ZXJhbCBzdHJpbmcgb2YgZm91ciBjaGFyYWN0ZXJzLgorCisgICAgICAgSW4gVVRGLTggbW9kZSwgcXVhbnRpZmllcnMgYXBwbHkgdG8gVVRGLTggIGNoYXJhY3RlcnMgIHJhdGhlciAgdGhhbiAgdG8KKyAgICAgICBpbmRpdmlkdWFsIGJ5dGVzLiBUaHVzLCBmb3IgZXhhbXBsZSwgXHh7MTAwfXsyfSBtYXRjaGVzIHR3byBVVEYtOCBjaGFyLQorICAgICAgIGFjdGVycywgZWFjaCBvZiB3aGljaCBpcyByZXByZXNlbnRlZCBieSBhIHR3by1ieXRlIHNlcXVlbmNlLgorCisgICAgICAgVGhlIHF1YW50aWZpZXIgezB9IGlzIHBlcm1pdHRlZCwgY2F1c2luZyB0aGUgZXhwcmVzc2lvbiB0byBiZWhhdmUgYXMgaWYKKyAgICAgICB0aGUgcHJldmlvdXMgaXRlbSBhbmQgdGhlIHF1YW50aWZpZXIgd2VyZSBub3QgcHJlc2VudC4KKworICAgICAgIEZvciAgY29udmVuaWVuY2UgIChhbmQgIGhpc3RvcmljYWwgY29tcGF0aWJpbGl0eSkgdGhlIHRocmVlIG1vc3QgY29tbW9uCisgICAgICAgcXVhbnRpZmllcnMgaGF2ZSBzaW5nbGUtY2hhcmFjdGVyIGFiYnJldmlhdGlvbnM6CisKKyAgICAgICAgICogICAgaXMgZXF1aXZhbGVudCB0byB7MCx9CisgICAgICAgICArICAgIGlzIGVxdWl2YWxlbnQgdG8gezEsfQorICAgICAgICAgPyAgICBpcyBlcXVpdmFsZW50IHRvIHswLDF9CisKKyAgICAgICBJdCBpcyBwb3NzaWJsZSB0byBjb25zdHJ1Y3QgaW5maW5pdGUgbG9vcHMgYnkgIGZvbGxvd2luZyAgYSAgc3VicGF0dGVybgorICAgICAgIHRoYXQgY2FuIG1hdGNoIG5vIGNoYXJhY3RlcnMgd2l0aCBhIHF1YW50aWZpZXIgdGhhdCBoYXMgbm8gdXBwZXIgbGltaXQsCisgICAgICAgZm9yIGV4YW1wbGU6CisKKyAgICAgICAgIChhPykqCisKKyAgICAgICBFYXJsaWVyIHZlcnNpb25zIG9mIFBlcmwgYW5kIFBDUkUgdXNlZCB0byBnaXZlIGFuIGVycm9yIGF0IGNvbXBpbGUgdGltZQorICAgICAgIGZvciAgc3VjaCAgcGF0dGVybnMuIEhvd2V2ZXIsIGJlY2F1c2UgdGhlcmUgYXJlIGNhc2VzIHdoZXJlIHRoaXMgY2FuIGJlCisgICAgICAgdXNlZnVsLCBzdWNoIHBhdHRlcm5zIGFyZSBub3cgYWNjZXB0ZWQsIGJ1dCBpZiBhbnkgIHJlcGV0aXRpb24gIG9mICB0aGUKKyAgICAgICBzdWJwYXR0ZXJuICBkb2VzIGluIGZhY3QgbWF0Y2ggbm8gY2hhcmFjdGVycywgdGhlIGxvb3AgaXMgZm9yY2libHkgYnJvLQorICAgICAgIGtlbi4KKworICAgICAgIEJ5IGRlZmF1bHQsIHRoZSBxdWFudGlmaWVycyBhcmUgImdyZWVkeSIsIHRoYXQgaXMsIHRoZXkgbWF0Y2ggIGFzICBtdWNoCisgICAgICAgYXMgIHBvc3NpYmxlICAodXAgIHRvICB0aGUgIG1heGltdW0gbnVtYmVyIG9mIHBlcm1pdHRlZCB0aW1lcyksIHdpdGhvdXQKKyAgICAgICBjYXVzaW5nIHRoZSByZXN0IG9mIHRoZSBwYXR0ZXJuIHRvIGZhaWwuIFRoZSBjbGFzc2ljIGV4YW1wbGUgIG9mICB3aGVyZQorICAgICAgIHRoaXMgZ2l2ZXMgcHJvYmxlbXMgaXMgaW4gdHJ5aW5nIHRvIG1hdGNoIGNvbW1lbnRzIGluIEMgcHJvZ3JhbXMuIFRoZXNlCisgICAgICAgYXBwZWFyIGJldHdlZW4gdGhlIHNlcXVlbmNlcyAvKiBhbmQgKi8gYW5kIHdpdGhpbiB0aGUgIHNlcXVlbmNlLCAgaW5kaS0KKyAgICAgICB2aWR1YWwgKiBhbmQgLyBjaGFyYWN0ZXJzIG1heSBhcHBlYXIuIEFuIGF0dGVtcHQgdG8gbWF0Y2ggQyBjb21tZW50cyBieQorICAgICAgIGFwcGx5aW5nIHRoZSBwYXR0ZXJuCisKKyAgICAgICAgIC9cKi4qXCovCisKKyAgICAgICB0byB0aGUgc3RyaW5nCisKKyAgICAgICAgIC8qIGZpcnN0IGNvbW1hbmQgKi8gIG5vdCBjb21tZW50ICAvKiBzZWNvbmQgY29tbWVudCAqLworCisgICAgICAgZmFpbHMsIGJlY2F1c2UgaXQgbWF0Y2hlcyB0aGUgZW50aXJlIHN0cmluZyBvd2luZyB0byB0aGUgZ3JlZWRpbmVzcyAgb2YKKyAgICAgICB0aGUgLiogIGl0ZW0uCisKKyAgICAgICBIb3dldmVyLCAgaWYgIGEgcXVhbnRpZmllciBpcyBmb2xsb3dlZCBieSBhIHF1ZXN0aW9uIG1hcmssIGl0IGNlYXNlcyB0bworICAgICAgIGJlIGdyZWVkeSwgYW5kIGluc3RlYWQgbWF0Y2hlcyB0aGUgbWluaW11bSBudW1iZXIgb2YgdGltZXMgcG9zc2libGUsIHNvCisgICAgICAgdGhlIHBhdHRlcm4KKworICAgICAgICAgL1wqLio/XCovCisKKyAgICAgICBkb2VzICB0aGUgIHJpZ2h0ICB0aGluZyB3aXRoIHRoZSBDIGNvbW1lbnRzLiBUaGUgbWVhbmluZyBvZiB0aGUgdmFyaW91cworICAgICAgIHF1YW50aWZpZXJzIGlzIG5vdCBvdGhlcndpc2UgY2hhbmdlZCwgIGp1c3QgIHRoZSAgcHJlZmVycmVkICBudW1iZXIgIG9mCisgICAgICAgbWF0Y2hlcy4gICBEbyAgbm90ICBjb25mdXNlIHRoaXMgdXNlIG9mIHF1ZXN0aW9uIG1hcmsgd2l0aCBpdHMgdXNlIGFzIGEKKyAgICAgICBxdWFudGlmaWVyIGluIGl0cyBvd24gcmlnaHQuIEJlY2F1c2UgaXQgaGFzIHR3byB1c2VzLCBpdCBjYW4gIHNvbWV0aW1lcworICAgICAgIGFwcGVhciBkb3VibGVkLCBhcyBpbgorCisgICAgICAgICBcZD8/XGQKKworICAgICAgIHdoaWNoIG1hdGNoZXMgb25lIGRpZ2l0IGJ5IHByZWZlcmVuY2UsIGJ1dCBjYW4gbWF0Y2ggdHdvIGlmIHRoYXQgaXMgdGhlCisgICAgICAgb25seSB3YXkgdGhlIHJlc3Qgb2YgdGhlIHBhdHRlcm4gbWF0Y2hlcy4KKworICAgICAgIElmIHRoZSBQQ1JFX1VOR1JFRURZIG9wdGlvbiBpcyBzZXQgKGFuIG9wdGlvbiB3aGljaCBpcyBub3QgYXZhaWxhYmxlIGluCisgICAgICAgUGVybCksICB0aGUgIHF1YW50aWZpZXJzIGFyZSBub3QgZ3JlZWR5IGJ5IGRlZmF1bHQsIGJ1dCBpbmRpdmlkdWFsIG9uZXMKKyAgICAgICBjYW4gYmUgbWFkZSBncmVlZHkgYnkgZm9sbG93aW5nIHRoZW0gd2l0aCBhICBxdWVzdGlvbiAgbWFyay4gIEluICBvdGhlcgorICAgICAgIHdvcmRzLCBpdCBpbnZlcnRzIHRoZSBkZWZhdWx0IGJlaGF2aW91ci4KKworICAgICAgIFdoZW4gIGEgIHBhcmVudGhlc2l6ZWQgIHN1YnBhdHRlcm4gIGlzIHF1YW50aWZpZWQgd2l0aCBhIG1pbmltdW0gcmVwZWF0CisgICAgICAgY291bnQgdGhhdCBpcyBncmVhdGVyIHRoYW4gMSBvciB3aXRoIGEgbGltaXRlZCBtYXhpbXVtLCBtb3JlICBzdG9yZSAgaXMKKyAgICAgICByZXF1aXJlZCAgZm9yICB0aGUgIGNvbXBpbGVkICBwYXR0ZXJuLCBpbiBwcm9wb3J0aW9uIHRvIHRoZSBzaXplIG9mIHRoZQorICAgICAgIG1pbmltdW0gb3IgbWF4aW11bS4KKworICAgICAgIElmIGEgcGF0dGVybiBzdGFydHMgd2l0aCAuKiBvciAuezAsfSBhbmQgdGhlIFBDUkVfRE9UQUxMIG9wdGlvbiAoZXF1aXYtCisgICAgICAgYWxlbnQgIHRvIFBlcmwncyAvcykgaXMgc2V0LCB0aHVzIGFsbG93aW5nIHRoZSAuIHRvIG1hdGNoIG5ld2xpbmVzLCB0aGUKKyAgICAgICBwYXR0ZXJuIGlzIGltcGxpY2l0bHkgYW5jaG9yZWQsIGJlY2F1c2Ugd2hhdGV2ZXIgZm9sbG93cyB3aWxsIGJlICB0cmllZAorICAgICAgIGFnYWluc3QgIGV2ZXJ5IGNoYXJhY3RlciBwb3NpdGlvbiBpbiB0aGUgc3ViamVjdCBzdHJpbmcsIHNvIHRoZXJlIGlzIG5vCisgICAgICAgcG9pbnQgaW4gcmV0cnlpbmcgdGhlIG92ZXJhbGwgbWF0Y2ggYXQgYW55IHBvc2l0aW9uICBhZnRlciAgdGhlICBmaXJzdC4KKyAgICAgICBQQ1JFIG5vcm1hbGx5IHRyZWF0cyBzdWNoIGEgcGF0dGVybiBhcyB0aG91Z2ggaXQgd2VyZSBwcmVjZWRlZCBieSBcQS4KKworICAgICAgIEluICBjYXNlcyAgd2hlcmUgIGl0ICBpcyBrbm93biB0aGF0IHRoZSBzdWJqZWN0IHN0cmluZyBjb250YWlucyBubyBuZXctCisgICAgICAgbGluZXMsIGl0IGlzIHdvcnRoIHNldHRpbmcgUENSRV9ET1RBTEwgaW4gb3JkZXIgdG8gIG9idGFpbiAgdGhpcyAgb3B0aS0KKyAgICAgICBtaXphdGlvbiwgb3IgYWx0ZXJuYXRpdmVseSB1c2luZyBeIHRvIGluZGljYXRlIGFuY2hvcmluZyBleHBsaWNpdGx5LgorCisgICAgICAgSG93ZXZlciwgIHRoZXJlIGlzIG9uZSBzaXR1YXRpb24gd2hlcmUgdGhlIG9wdGltaXphdGlvbiBjYW5ub3QgYmUgdXNlZC4KKyAgICAgICBXaGVuIC4qICBpcyBpbnNpZGUgY2FwdHVyaW5nIHBhcmVudGhlc2VzIHRoYXQgIGFyZSAgdGhlICBzdWJqZWN0ICBvZiAgYQorICAgICAgIGJhY2tyZWZlcmVuY2UgIGVsc2V3aGVyZSBpbiB0aGUgcGF0dGVybiwgYSBtYXRjaCBhdCB0aGUgc3RhcnQgbWF5IGZhaWwsCisgICAgICAgYW5kIGEgbGF0ZXIgb25lIHN1Y2NlZWQuIENvbnNpZGVyLCBmb3IgZXhhbXBsZToKKworICAgICAgICAgKC4qKWFiY1wxCisKKyAgICAgICBJZiB0aGUgc3ViamVjdCBpcyAieHl6MTIzYWJjMTIzIiB0aGUgbWF0Y2ggcG9pbnQgaXMgdGhlIGZvdXJ0aCAgY2hhcmFjLQorICAgICAgIHRlci4gRm9yIHRoaXMgcmVhc29uLCBzdWNoIGEgcGF0dGVybiBpcyBub3QgaW1wbGljaXRseSBhbmNob3JlZC4KKworICAgICAgIFdoZW4gYSBjYXB0dXJpbmcgc3VicGF0dGVybiBpcyByZXBlYXRlZCwgdGhlIHZhbHVlIGNhcHR1cmVkIGlzIHRoZSBzdWItCisgICAgICAgc3RyaW5nIHRoYXQgbWF0Y2hlZCB0aGUgZmluYWwgaXRlcmF0aW9uLiBGb3IgZXhhbXBsZSwgYWZ0ZXIKKworICAgICAgICAgKHR3ZWVkbGVbZHVtZV17M31ccyopKworCisgICAgICAgaGFzIG1hdGNoZWQgInR3ZWVkbGVkdW0gdHdlZWRsZWRlZSIgdGhlIHZhbHVlIG9mIHRoZSBjYXB0dXJlZCBzdWJzdHJpbmcKKyAgICAgICBpcyAgInR3ZWVkbGVkZWUiLiAgSG93ZXZlciwgIGlmIHRoZXJlIGFyZSBuZXN0ZWQgY2FwdHVyaW5nIHN1YnBhdHRlcm5zLAorICAgICAgIHRoZSBjb3JyZXNwb25kaW5nIGNhcHR1cmVkIHZhbHVlcyBtYXkgaGF2ZSBiZWVuIHNldCBpbiBwcmV2aW91cyAgaXRlcmEtCisgICAgICAgdGlvbnMuIEZvciBleGFtcGxlLCBhZnRlcgorCisgICAgICAgICAvKGF8KGIpKSsvCisKKyAgICAgICBtYXRjaGVzICJhYmEiIHRoZSB2YWx1ZSBvZiB0aGUgc2Vjb25kIGNhcHR1cmVkIHN1YnN0cmluZyBpcyAiYiIuCisKKworQVRPTUlDIEdST1VQSU5HIEFORCBQT1NTRVNTSVZFIFFVQU5USUZJRVJTCisKKyAgICAgICBXaXRoIGJvdGggbWF4aW1pemluZyBhbmQgbWluaW1pemluZyByZXBldGl0aW9uLCBmYWlsdXJlIG9mIHdoYXQgZm9sbG93cworICAgICAgIG5vcm1hbGx5IGNhdXNlcyB0aGUgcmVwZWF0ZWQgaXRlbSB0byBiZSByZS1ldmFsdWF0ZWQgdG8gc2VlIGlmICBhICBkaWYtCisgICAgICAgZmVyZW50IG51bWJlciBvZiByZXBlYXRzIGFsbG93cyB0aGUgcmVzdCBvZiB0aGUgcGF0dGVybiB0byBtYXRjaC4gU29tZS0KKyAgICAgICB0aW1lcyBpdCBpcyB1c2VmdWwgdG8gcHJldmVudCB0aGlzLCBlaXRoZXIgdG8gY2hhbmdlIHRoZSBuYXR1cmUgb2YgIHRoZQorICAgICAgIG1hdGNoLCAgb3IgIHRvICBjYXVzZSBpdCBmYWlsIGVhcmxpZXIgdGhhbiBpdCBvdGhlcndpc2UgbWlnaHQsIHdoZW4gdGhlCisgICAgICAgYXV0aG9yIG9mIHRoZSBwYXR0ZXJuIGtub3dzIHRoZXJlIGlzIG5vIHBvaW50IGluIGNhcnJ5aW5nIG9uLgorCisgICAgICAgQ29uc2lkZXIsIGZvciBleGFtcGxlLCB0aGUgcGF0dGVybiBcZCtmb28gd2hlbiBhcHBsaWVkIHRvICB0aGUgIHN1YmplY3QKKyAgICAgICBsaW5lCisKKyAgICAgICAgIDEyMzQ1NmJhcgorCisgICAgICAgQWZ0ZXIgbWF0Y2hpbmcgYWxsIDYgZGlnaXRzIGFuZCB0aGVuIGZhaWxpbmcgdG8gbWF0Y2ggImZvbyIsIHRoZSBub3JtYWwKKyAgICAgICBhY3Rpb24gb2YgdGhlIG1hdGNoZXIgaXMgdG8gdHJ5IGFnYWluIHdpdGggb25seSA1IGRpZ2l0cyAgbWF0Y2hpbmcgIHRoZQorICAgICAgIFxkKyAgaXRlbSwgIGFuZCAgdGhlbiAgd2l0aCAgNCwgIGFuZCAgc28gb24sIGJlZm9yZSB1bHRpbWF0ZWx5IGZhaWxpbmcuCisgICAgICAgIkF0b21pYyBncm91cGluZyIgKGEgdGVybSB0YWtlbiBmcm9tIEplZmZyZXkgIEZyaWVkbCdzICBib29rKSAgcHJvdmlkZXMKKyAgICAgICB0aGUgIG1lYW5zIGZvciBzcGVjaWZ5aW5nIHRoYXQgb25jZSBhIHN1YnBhdHRlcm4gaGFzIG1hdGNoZWQsIGl0IGlzIG5vdAorICAgICAgIHRvIGJlIHJlLWV2YWx1YXRlZCBpbiB0aGlzIHdheS4KKworICAgICAgIElmIHdlIHVzZSBhdG9taWMgZ3JvdXBpbmcgZm9yIHRoZSBwcmV2aW91cyBleGFtcGxlLCB0aGUgIG1hdGNoZXIgIHdvdWxkCisgICAgICAgZ2l2ZSB1cCBpbW1lZGlhdGVseSBvbiBmYWlsaW5nIHRvIG1hdGNoICJmb28iIHRoZSBmaXJzdCB0aW1lLiBUaGUgbm90YS0KKyAgICAgICB0aW9uIGlzIGEga2luZCBvZiBzcGVjaWFsIHBhcmVudGhlc2lzLCBzdGFydGluZyB3aXRoICAoPz4gIGFzICBpbiAgdGhpcworICAgICAgIGV4YW1wbGU6CisKKyAgICAgICAgICg/PlxkKylmb28KKworICAgICAgIFRoaXMgIGtpbmQgIG9mICBwYXJlbnRoZXNpcyAibG9ja3MgdXAiIHRoZSAgcGFydCBvZiB0aGUgcGF0dGVybiBpdCBjb24tCisgICAgICAgdGFpbnMgb25jZSBpdCBoYXMgbWF0Y2hlZCwgYW5kIGEgZmFpbHVyZSBmdXJ0aGVyIGludG8gIHRoZSAgcGF0dGVybiAgaXMKKyAgICAgICBwcmV2ZW50ZWQgIGZyb20gIGJhY2t0cmFja2luZyBpbnRvIGl0LiBCYWNrdHJhY2tpbmcgcGFzdCBpdCB0byBwcmV2aW91cworICAgICAgIGl0ZW1zLCBob3dldmVyLCB3b3JrcyBhcyBub3JtYWwuCisKKyAgICAgICBBbiBhbHRlcm5hdGl2ZSBkZXNjcmlwdGlvbiBpcyB0aGF0IGEgc3VicGF0dGVybiBvZiAgdGhpcyAgdHlwZSAgbWF0Y2hlcworICAgICAgIHRoZSAgc3RyaW5nICBvZiAgY2hhcmFjdGVycyAgdGhhdCBhbiBpZGVudGljYWwgc3RhbmRhbG9uZSBwYXR0ZXJuIHdvdWxkCisgICAgICAgbWF0Y2gsIGlmIGFuY2hvcmVkIGF0IHRoZSBjdXJyZW50IHBvaW50IGluIHRoZSBzdWJqZWN0IHN0cmluZy4KKworICAgICAgIEF0b21pYyBncm91cGluZyBzdWJwYXR0ZXJucyBhcmUgbm90IGNhcHR1cmluZyBzdWJwYXR0ZXJucy4gU2ltcGxlIGNhc2VzCisgICAgICAgc3VjaCBhcyB0aGUgYWJvdmUgZXhhbXBsZSBjYW4gYmUgdGhvdWdodCBvZiBhcyBhIG1heGltaXppbmcgcmVwZWF0IHRoYXQKKyAgICAgICBtdXN0IHN3YWxsb3cgZXZlcnl0aGluZyBpdCBjYW4uIFNvLCB3aGlsZSBib3RoIFxkKyBhbmQgIFxkKz8gIGFyZSAgcHJlLQorICAgICAgIHBhcmVkICB0byAgYWRqdXN0ICB0aGUgbnVtYmVyIG9mIGRpZ2l0cyB0aGV5IG1hdGNoIGluIG9yZGVyIHRvIG1ha2UgdGhlCisgICAgICAgcmVzdCBvZiB0aGUgcGF0dGVybiBtYXRjaCwgKD8+XGQrKSBjYW4gb25seSBtYXRjaCBhbiBlbnRpcmUgc2VxdWVuY2Ugb2YKKyAgICAgICBkaWdpdHMuCisKKyAgICAgICBBdG9taWMgIGdyb3VwcyBpbiBnZW5lcmFsIGNhbiBvZiBjb3Vyc2UgY29udGFpbiBhcmJpdHJhcmlseSBjb21wbGljYXRlZAorICAgICAgIHN1YnBhdHRlcm5zLCBhbmQgY2FuIGJlIG5lc3RlZC4gSG93ZXZlciwgd2hlbiAgdGhlICBzdWJwYXR0ZXJuICBmb3IgIGFuCisgICAgICAgYXRvbWljIGdyb3VwIGlzIGp1c3QgYSBzaW5nbGUgcmVwZWF0ZWQgaXRlbSwgYXMgaW4gdGhlIGV4YW1wbGUgYWJvdmUsIGEKKyAgICAgICBzaW1wbGVyIG5vdGF0aW9uLCBjYWxsZWQgYSAicG9zc2Vzc2l2ZSBxdWFudGlmaWVyIiBjYW4gIGJlICB1c2VkLiAgVGhpcworICAgICAgIGNvbnNpc3RzICBvZiAgYW4gIGFkZGl0aW9uYWwgICsgY2hhcmFjdGVyIGZvbGxvd2luZyBhIHF1YW50aWZpZXIuIFVzaW5nCisgICAgICAgdGhpcyBub3RhdGlvbiwgdGhlIHByZXZpb3VzIGV4YW1wbGUgY2FuIGJlIHJld3JpdHRlbiBhcworCisgICAgICAgICBcZCsrYmFyCisKKyAgICAgICBQb3NzZXNzaXZlICBxdWFudGlmaWVycyAgYXJlICBhbHdheXMgIGdyZWVkeTsgIHRoZSAgIHNldHRpbmcgICBvZiAgIHRoZQorICAgICAgIFBDUkVfVU5HUkVFRFkgb3B0aW9uIGlzIGlnbm9yZWQuIFRoZXkgYXJlIGEgY29udmVuaWVudCBub3RhdGlvbiBmb3IgdGhlCisgICAgICAgc2ltcGxlciBmb3JtcyBvZiBhdG9taWMgZ3JvdXAuIEhvd2V2ZXIsIHRoZXJlIGlzIG5vIGRpZmZlcmVuY2UgIGluICB0aGUKKyAgICAgICBtZWFuaW5nICBvciAgcHJvY2Vzc2luZyAgb2YgIGEgcG9zc2Vzc2l2ZSBxdWFudGlmaWVyIGFuZCB0aGUgZXF1aXZhbGVudAorICAgICAgIGF0b21pYyBncm91cC4KKworICAgICAgIFRoZSBwb3NzZXNzaXZlIHF1YW50aWZpZXIgc3ludGF4IGlzIGFuIGV4dGVuc2lvbiB0byB0aGUgUGVybCBzeW50YXguIEl0CisgICAgICAgb3JpZ2luYXRlcyBpbiBTdW4ncyBKYXZhIHBhY2thZ2UuCisKKyAgICAgICBXaGVuICBhICBwYXR0ZXJuICBjb250YWlucyBhbiB1bmxpbWl0ZWQgcmVwZWF0IGluc2lkZSBhIHN1YnBhdHRlcm4gdGhhdAorICAgICAgIGNhbiBpdHNlbGYgYmUgcmVwZWF0ZWQgYW4gdW5saW1pdGVkIG51bWJlciBvZiAgdGltZXMsICB0aGUgIHVzZSAgb2YgIGFuCisgICAgICAgYXRvbWljICBncm91cCAgaXMgIHRoZSAgb25seSB3YXkgdG8gYXZvaWQgc29tZSBmYWlsaW5nIG1hdGNoZXMgdGFraW5nIGEKKyAgICAgICB2ZXJ5IGxvbmcgdGltZSBpbmRlZWQuIFRoZSBwYXR0ZXJuCisKKyAgICAgICAgIChcRCt8PFxkKz4pKlshP10KKworICAgICAgIG1hdGNoZXMgYW4gdW5saW1pdGVkIG51bWJlciBvZiBzdWJzdHJpbmdzIHRoYXQgZWl0aGVyIGNvbnNpc3QgIG9mICBub24tCisgICAgICAgZGlnaXRzLCAgb3IgIGRpZ2l0cyAgZW5jbG9zZWQgaW4gPD4sIGZvbGxvd2VkIGJ5IGVpdGhlciAhIG9yID8uIFdoZW4gaXQKKyAgICAgICBtYXRjaGVzLCBpdCBydW5zIHF1aWNrbHkuIEhvd2V2ZXIsIGlmIGl0IGlzIGFwcGxpZWQgdG8KKworICAgICAgICAgYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYQorCisgICAgICAgaXQgdGFrZXMgYSBsb25nIHRpbWUgYmVmb3JlIHJlcG9ydGluZyAgZmFpbHVyZS4gIFRoaXMgIGlzICBiZWNhdXNlICB0aGUKKyAgICAgICBzdHJpbmcgIGNhbiAgYmUgIGRpdmlkZWQgIGJldHdlZW4gIHRoZSB0d28gcmVwZWF0cyBpbiBhIGxhcmdlIG51bWJlciBvZgorICAgICAgIHdheXMsIGFuZCBhbGwgaGF2ZSB0byBiZSB0cmllZC4gKFRoZSBleGFtcGxlIHVzZWQgWyE/XSAgcmF0aGVyICB0aGFuICBhCisgICAgICAgc2luZ2xlICBjaGFyYWN0ZXIgIGF0IHRoZSBlbmQsIGJlY2F1c2UgYm90aCBQQ1JFIGFuZCBQZXJsIGhhdmUgYW4gb3B0aS0KKyAgICAgICBtaXphdGlvbiB0aGF0IGFsbG93cyBmb3IgZmFzdCBmYWlsdXJlIHdoZW4gYSBzaW5nbGUgY2hhcmFjdGVyIGlzICB1c2VkLgorICAgICAgIFRoZXkgIHJlbWVtYmVyICB0aGUgbGFzdCBzaW5nbGUgY2hhcmFjdGVyIHRoYXQgaXMgcmVxdWlyZWQgZm9yIGEgbWF0Y2gsCisgICAgICAgYW5kIGZhaWwgZWFybHkgaWYgaXQgaXMgbm90IHByZXNlbnQgaW4gdGhlIHN0cmluZy4pICBJZiB0aGUgcGF0dGVybiAgaXMKKyAgICAgICBjaGFuZ2VkIHRvCisKKyAgICAgICAgICgoPz5cRCspfDxcZCs+KSpbIT9dCisKKyAgICAgICBzZXF1ZW5jZXMgIG9mIG5vbi1kaWdpdHMgY2Fubm90IGJlIGJyb2tlbiwgYW5kIGZhaWx1cmUgaGFwcGVucyBxdWlja2x5LgorCisKK0JBQ0sgUkVGRVJFTkNFUworCisgICAgICAgT3V0c2lkZSBhIGNoYXJhY3RlciBjbGFzcywgYSBiYWNrc2xhc2ggZm9sbG93ZWQgYnkgYSBkaWdpdCBncmVhdGVyIHRoYW4KKyAgICAgICAwIChhbmQgcG9zc2libHkgZnVydGhlciBkaWdpdHMpIGlzIGEgYmFjayByZWZlcmVuY2UgdG8gYSBjYXB0dXJpbmcgc3ViLQorICAgICAgIHBhdHRlcm4gZWFybGllciAodGhhdCBpcywgdG8gaXRzIGxlZnQpIGluIHRoZSBwYXR0ZXJuLCAgcHJvdmlkZWQgIHRoZXJlCisgICAgICAgaGF2ZSBiZWVuIHRoYXQgbWFueSBwcmV2aW91cyBjYXB0dXJpbmcgbGVmdCBwYXJlbnRoZXNlcy4KKworICAgICAgIEhvd2V2ZXIsIGlmIHRoZSBkZWNpbWFsIG51bWJlciBmb2xsb3dpbmcgdGhlIGJhY2tzbGFzaCBpcyBsZXNzIHRoYW4gMTAsCisgICAgICAgaXQgaXMgYWx3YXlzIHRha2VuIGFzIGEgYmFjayByZWZlcmVuY2UsIGFuZCBjYXVzZXMgIGFuICBlcnJvciAgb25seSAgaWYKKyAgICAgICB0aGVyZSAgYXJlICBub3QgdGhhdCBtYW55IGNhcHR1cmluZyBsZWZ0IHBhcmVudGhlc2VzIGluIHRoZSBlbnRpcmUgcGF0LQorICAgICAgIHRlcm4uIEluIG90aGVyIHdvcmRzLCB0aGUgcGFyZW50aGVzZXMgdGhhdCBhcmUgcmVmZXJlbmNlZCBuZWVkICBub3QgIGJlCisgICAgICAgdG8gIHRoZSBsZWZ0IG9mIHRoZSByZWZlcmVuY2UgZm9yIG51bWJlcnMgbGVzcyB0aGFuIDEwLiBTZWUgdGhlIHNlY3Rpb24KKyAgICAgICBlbnRpdGxlZCAiQmFja3NsYXNoIiBhYm92ZSBmb3IgZnVydGhlciBkZXRhaWxzIG9mIHRoZSBoYW5kbGluZyBvZiAgZGlnLQorICAgICAgIGl0cyBmb2xsb3dpbmcgYSBiYWNrc2xhc2guCisKKyAgICAgICBBICBiYWNrICByZWZlcmVuY2UgbWF0Y2hlcyB3aGF0ZXZlciBhY3R1YWxseSBtYXRjaGVkIHRoZSBjYXB0dXJpbmcgc3ViLQorICAgICAgIHBhdHRlcm4gaW4gdGhlIGN1cnJlbnQgc3ViamVjdCBzdHJpbmcsIHJhdGhlciAgdGhhbiAgYW55dGhpbmcgIG1hdGNoaW5nCisgICAgICAgdGhlIHN1YnBhdHRlcm4gaXRzZWxmIChzZWUgIlN1YnBhdHRlcm5zIGFzIHN1YnJvdXRpbmVzIiBiZWxvdyBmb3IgYSB3YXkKKyAgICAgICBvZiBkb2luZyB0aGF0KS4gU28gdGhlIHBhdHRlcm4KKworICAgICAgICAgKHNlbnN8cmVzcG9ucyllIGFuZCBcMWliaWxpdHkKKworICAgICAgIG1hdGNoZXMgInNlbnNlIGFuZCBzZW5zaWJpbGl0eSIgYW5kICJyZXNwb25zZSBhbmQgcmVzcG9uc2liaWxpdHkiLCAgYnV0CisgICAgICAgbm90ICAic2Vuc2UgYW5kIHJlc3BvbnNpYmlsaXR5Ii4gSWYgY2FzZWZ1bCBtYXRjaGluZyBpcyBpbiBmb3JjZSBhdCB0aGUKKyAgICAgICB0aW1lIG9mIHRoZSBiYWNrIHJlZmVyZW5jZSwgdGhlIGNhc2Ugb2YgbGV0dGVycyBpcyByZWxldmFudC4gRm9yICBleGFtLQorICAgICAgIHBsZSwKKworICAgICAgICAgKCg/aSlyYWgpXHMrXDEKKworICAgICAgIG1hdGNoZXMgICJyYWggIHJhaCIgIGFuZCAgIlJBSCBSQUgiLCBidXQgbm90ICJSQUggcmFoIiwgZXZlbiB0aG91Z2ggdGhlCisgICAgICAgb3JpZ2luYWwgY2FwdHVyaW5nIHN1YnBhdHRlcm4gaXMgbWF0Y2hlZCBjYXNlbGVzc2x5LgorCisgICAgICAgQmFjayByZWZlcmVuY2VzIHRvIG5hbWVkIHN1YnBhdHRlcm5zIHVzZSB0aGUgUHl0aG9uICBzeW50YXggICg/UD1uYW1lKS4KKyAgICAgICBXZSBjb3VsZCByZXdyaXRlIHRoZSBhYm92ZSBleGFtcGxlIGFzIGZvbGxvd3M6CisKKyAgICAgICAgICg/PHAxPig/aSlyYWgpXHMrKD9QPXAxKQorCisgICAgICAgVGhlcmUgIG1heSBiZSBtb3JlIHRoYW4gb25lIGJhY2sgcmVmZXJlbmNlIHRvIHRoZSBzYW1lIHN1YnBhdHRlcm4uIElmIGEKKyAgICAgICBzdWJwYXR0ZXJuIGhhcyBub3QgYWN0dWFsbHkgYmVlbiB1c2VkIGluIGEgcGFydGljdWxhciBtYXRjaCwgIGFueSAgYmFjaworICAgICAgIHJlZmVyZW5jZXMgdG8gaXQgYWx3YXlzIGZhaWwuIEZvciBleGFtcGxlLCB0aGUgcGF0dGVybgorCisgICAgICAgICAoYXwoYmMpKVwyCisKKyAgICAgICBhbHdheXMgIGZhaWxzIGlmIGl0IHN0YXJ0cyB0byBtYXRjaCAiYSIgcmF0aGVyIHRoYW4gImJjIi4gQmVjYXVzZSB0aGVyZQorICAgICAgIG1heSBiZSBtYW55IGNhcHR1cmluZyBwYXJlbnRoZXNlcyBpbiBhIHBhdHRlcm4sICBhbGwgIGRpZ2l0cyAgZm9sbG93aW5nCisgICAgICAgdGhlICBiYWNrc2xhc2ggIGFyZSB0YWtlbiBhcyBwYXJ0IG9mIGEgcG90ZW50aWFsIGJhY2sgcmVmZXJlbmNlIG51bWJlci4KKyAgICAgICBJZiB0aGUgcGF0dGVybiBjb250aW51ZXMgd2l0aCBhIGRpZ2l0IGNoYXJhY3Rlciwgc29tZSBkZWxpbWl0ZXIgbXVzdCBiZQorICAgICAgIHVzZWQgIHRvICB0ZXJtaW5hdGUgIHRoZSBiYWNrIHJlZmVyZW5jZS4gSWYgdGhlIFBDUkVfRVhURU5ERUQgb3B0aW9uIGlzCisgICAgICAgc2V0LCB0aGlzIGNhbiBiZSB3aGl0ZXNwYWNlLiAgT3RoZXJ3aXNlIGFuIGVtcHR5IGNvbW1lbnQgY2FuIGJlIHVzZWQuCisKKyAgICAgICBBIGJhY2sgcmVmZXJlbmNlIHRoYXQgb2NjdXJzIGluc2lkZSB0aGUgcGFyZW50aGVzZXMgdG8gd2hpY2ggaXQgIHJlZmVycworICAgICAgIGZhaWxzICB3aGVuICB0aGUgc3VicGF0dGVybiBpcyBmaXJzdCB1c2VkLCBzbywgZm9yIGV4YW1wbGUsIChhXDEpIG5ldmVyCisgICAgICAgbWF0Y2hlcy4gIEhvd2V2ZXIsIHN1Y2ggcmVmZXJlbmNlcyBjYW4gYmUgdXNlZnVsIGluc2lkZSAgcmVwZWF0ZWQgIHN1Yi0KKyAgICAgICBwYXR0ZXJucy4gRm9yIGV4YW1wbGUsIHRoZSBwYXR0ZXJuCisKKyAgICAgICAgIChhfGJcMSkrCisKKyAgICAgICBtYXRjaGVzIGFueSBudW1iZXIgb2YgImEicyBhbmQgYWxzbyAiYWJhIiwgImFiYWJiYWEiIGV0Yy4gQXQgZWFjaCBpdGVyLQorICAgICAgIGF0aW9uIG9mIHRoZSBzdWJwYXR0ZXJuLCAgdGhlICBiYWNrICByZWZlcmVuY2UgIG1hdGNoZXMgIHRoZSAgY2hhcmFjdGVyCisgICAgICAgc3RyaW5nICBjb3JyZXNwb25kaW5nICB0byAgdGhlIHByZXZpb3VzIGl0ZXJhdGlvbi4gSW4gb3JkZXIgZm9yIHRoaXMgdG8KKyAgICAgICB3b3JrLCB0aGUgcGF0dGVybiBtdXN0IGJlIHN1Y2ggdGhhdCB0aGUgZmlyc3QgaXRlcmF0aW9uIGRvZXMgIG5vdCAgbmVlZAorICAgICAgIHRvICBtYXRjaCB0aGUgYmFjayByZWZlcmVuY2UuIFRoaXMgY2FuIGJlIGRvbmUgdXNpbmcgYWx0ZXJuYXRpb24sIGFzIGluCisgICAgICAgdGhlIGV4YW1wbGUgYWJvdmUsIG9yIGJ5IGEgcXVhbnRpZmllciB3aXRoIGEgbWluaW11bSBvZiB6ZXJvLgorCisKK0FTU0VSVElPTlMKKworICAgICAgIEFuIGFzc2VydGlvbiBpcyBhIHRlc3Qgb24gdGhlIGNoYXJhY3RlcnMgIGZvbGxvd2luZyAgb3IgIHByZWNlZGluZyAgdGhlCisgICAgICAgY3VycmVudCAgbWF0Y2hpbmcgIHBvaW50IHRoYXQgZG9lcyBub3QgYWN0dWFsbHkgY29uc3VtZSBhbnkgY2hhcmFjdGVycy4KKyAgICAgICBUaGUgc2ltcGxlIGFzc2VydGlvbnMgY29kZWQgYXMgXGIsIFxCLCBcQSwgXEcsIFxaLCAgXHosICBeICBhbmQgICQgIGFyZQorICAgICAgIGRlc2NyaWJlZCBhYm92ZS4gIE1vcmUgY29tcGxpY2F0ZWQgYXNzZXJ0aW9ucyBhcmUgY29kZWQgYXMgc3VicGF0dGVybnMuCisgICAgICAgVGhlcmUgYXJlIHR3byBraW5kczogdGhvc2UgdGhhdCBsb29rIGFoZWFkIG9mIHRoZSBjdXJyZW50ICBwb3NpdGlvbiAgaW4KKyAgICAgICB0aGUgc3ViamVjdCBzdHJpbmcsIGFuZCB0aG9zZSB0aGF0IGxvb2sgYmVoaW5kIGl0LgorCisgICAgICAgQW4gIGFzc2VydGlvbiAgc3VicGF0dGVybiAgaXMgbWF0Y2hlZCBpbiB0aGUgbm9ybWFsIHdheSwgZXhjZXB0IHRoYXQgaXQKKyAgICAgICBkb2VzIG5vdCBjYXVzZSB0aGUgY3VycmVudCBtYXRjaGluZyBwb3NpdGlvbiB0byBiZSAgY2hhbmdlZC4gIExvb2thaGVhZAorICAgICAgIGFzc2VydGlvbnMgIHN0YXJ0IHdpdGggKD89IGZvciBwb3NpdGl2ZSBhc3NlcnRpb25zIGFuZCAoPyEgZm9yIG5lZ2F0aXZlCisgICAgICAgYXNzZXJ0aW9ucy4gRm9yIGV4YW1wbGUsCisKKyAgICAgICAgIFx3Kyg/PTspCisKKyAgICAgICBtYXRjaGVzIGEgd29yZCBmb2xsb3dlZCBieSBhIHNlbWljb2xvbiwgYnV0IGRvZXMgbm90IGluY2x1ZGUgdGhlICBzZW1pLQorICAgICAgIGNvbG9uIGluIHRoZSBtYXRjaCwgYW5kCisKKyAgICAgICAgIGZvbyg/IWJhcikKKworICAgICAgIG1hdGNoZXMgIGFueSAgb2NjdXJyZW5jZSAgb2YgICJmb28iIHRoYXQgaXMgbm90IGZvbGxvd2VkIGJ5ICJiYXIiLiBOb3RlCisgICAgICAgdGhhdCB0aGUgYXBwYXJlbnRseSBzaW1pbGFyIHBhdHRlcm4KKworICAgICAgICAgKD8hZm9vKWJhcgorCisgICAgICAgZG9lcyBub3QgZmluZCBhbiBvY2N1cnJlbmNlIG9mICJiYXIiICB0aGF0ICBpcyAgcHJlY2VkZWQgIGJ5ICBzb21ldGhpbmcKKyAgICAgICBvdGhlciAgdGhhbiAiZm9vIjsgaXQgZmluZHMgYW55IG9jY3VycmVuY2Ugb2YgImJhciIgd2hhdHNvZXZlciwgYmVjYXVzZQorICAgICAgIHRoZSBhc3NlcnRpb24gKD8hZm9vKSBpcyBhbHdheXMgdHJ1ZSB3aGVuIHRoZSBuZXh0IHRocmVlIGNoYXJhY3RlcnMgYXJlCisgICAgICAgImJhciIuIEEgbG9va2JlaGluZCBhc3NlcnRpb24gaXMgbmVlZGVkIHRvIGFjaGlldmUgdGhpcyBlZmZlY3QuCisKKyAgICAgICBJZiB5b3Ugd2FudCB0byBmb3JjZSBhIG1hdGNoaW5nIGZhaWx1cmUgYXQgc29tZSBwb2ludCBpbiBhIHBhdHRlcm4sIHRoZQorICAgICAgIG1vc3QgY29udmVuaWVudCB3YXkgdG8gZG8gaXQgaXMgIHdpdGggICg/ISkgIGJlY2F1c2UgIGFuICBlbXB0eSAgc3RyaW5nCisgICAgICAgYWx3YXlzICBtYXRjaGVzLCBzbyBhbiBhc3NlcnRpb24gdGhhdCByZXF1aXJlcyB0aGVyZSBub3QgdG8gYmUgYW4gZW1wdHkKKyAgICAgICBzdHJpbmcgbXVzdCBhbHdheXMgZmFpbC4KKworICAgICAgIExvb2tiZWhpbmQgYXNzZXJ0aW9ucyBzdGFydCB3aXRoICg/PD0gZm9yIHBvc2l0aXZlIGFzc2VydGlvbnMgYW5kICAoPzwhCisgICAgICAgZm9yIG5lZ2F0aXZlIGFzc2VydGlvbnMuIEZvciBleGFtcGxlLAorCisgICAgICAgICAoPzwhZm9vKWJhcgorCisgICAgICAgZG9lcyAgZmluZCAgYW4gIG9jY3VycmVuY2UgIG9mICJiYXIiIHRoYXQgaXMgbm90IHByZWNlZGVkIGJ5ICJmb28iLiBUaGUKKyAgICAgICBjb250ZW50cyBvZiBhIGxvb2tiZWhpbmQgYXNzZXJ0aW9uIGFyZSByZXN0cmljdGVkICBzdWNoICB0aGF0ICBhbGwgIHRoZQorICAgICAgIHN0cmluZ3MgaXQgbWF0Y2hlcyBtdXN0IGhhdmUgYSBmaXhlZCBsZW5ndGguIEhvd2V2ZXIsIGlmIHRoZXJlIGFyZSBzZXYtCisgICAgICAgZXJhbCBhbHRlcm5hdGl2ZXMsIHRoZXkgZG8gbm90IGFsbCBoYXZlIHRvIGhhdmUgdGhlIHNhbWUgZml4ZWQgIGxlbmd0aC4KKyAgICAgICBUaHVzCisKKyAgICAgICAgICg/PD1idWxsb2NrfGRvbmtleSkKKworICAgICAgIGlzIHBlcm1pdHRlZCwgYnV0CisKKyAgICAgICAgICg/PCFkb2dzP3xjYXRzPykKKworICAgICAgIGNhdXNlcyAgYW4gIGVycm9yIGF0IGNvbXBpbGUgdGltZS4gQnJhbmNoZXMgdGhhdCBtYXRjaCBkaWZmZXJlbnQgbGVuZ3RoCisgICAgICAgc3RyaW5ncyBhcmUgcGVybWl0dGVkIG9ubHkgYXQgdGhlIHRvcCBsZXZlbCBvZiBhIGxvb2tiZWhpbmQgIGFzc2VydGlvbi4KKyAgICAgICBUaGlzICBpcyAgYW4gIGV4dGVuc2lvbiAgY29tcGFyZWQgIHdpdGggIFBlcmwgKGF0IGxlYXN0IGZvciA1LjgpLCB3aGljaAorICAgICAgIHJlcXVpcmVzIGFsbCBicmFuY2hlcyB0byBtYXRjaCB0aGUgc2FtZSBsZW5ndGggb2Ygc3RyaW5nLiBBbiAgYXNzZXJ0aW9uCisgICAgICAgc3VjaCBhcworCisgICAgICAgICAoPzw9YWIoY3xkZSkpCisKKyAgICAgICBpcyAgbm90ICBwZXJtaXR0ZWQsICBiZWNhdXNlICBpdHMgc2luZ2xlIHRvcC1sZXZlbCBicmFuY2ggY2FuIG1hdGNoIHR3bworICAgICAgIGRpZmZlcmVudCBsZW5ndGhzLCBidXQgaXQgaXMgYWNjZXB0YWJsZSBpZiByZXdyaXR0ZW4gdG8gIHVzZSAgdHdvICB0b3AtCisgICAgICAgbGV2ZWwgYnJhbmNoZXM6CisKKyAgICAgICAgICg/PD1hYmN8YWJkZSkKKworICAgICAgIFRoZSAgaW1wbGVtZW50YXRpb24gIG9mIGxvb2tiZWhpbmQgYXNzZXJ0aW9ucyBpcywgZm9yIGVhY2ggYWx0ZXJuYXRpdmUsCisgICAgICAgdG8gdGVtcG9yYXJpbHkgbW92ZSB0aGUgY3VycmVudCBwb3NpdGlvbiBiYWNrIGJ5IHRoZSAgZml4ZWQgIHdpZHRoICBhbmQKKyAgICAgICB0aGVuIHRyeSB0byBtYXRjaC4gSWYgdGhlcmUgYXJlIGluc3VmZmljaWVudCBjaGFyYWN0ZXJzIGJlZm9yZSB0aGUgY3VyLQorICAgICAgIHJlbnQgcG9zaXRpb24sIHRoZSBtYXRjaCBpcyBkZWVtZWQgdG8gZmFpbC4KKworICAgICAgIFBDUkUgZG9lcyBub3QgYWxsb3cgdGhlIFxDIGVzY2FwZSAod2hpY2ggbWF0Y2hlcyBhIHNpbmdsZSBieXRlIGluIFVURi04CisgICAgICAgbW9kZSkgIHRvIGFwcGVhciBpbiBsb29rYmVoaW5kIGFzc2VydGlvbnMsIGJlY2F1c2UgaXQgbWFrZXMgaXQgaW1wb3NzaS0KKyAgICAgICBibGUgdG8gY2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIGxvb2tiZWhpbmQuCisKKyAgICAgICBBdG9taWMgZ3JvdXBzIGNhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggbG9va2JlaGluZCBhc3NlcnRpb25zICB0bworICAgICAgIHNwZWNpZnkgZWZmaWNpZW50IG1hdGNoaW5nIGF0IHRoZSBlbmQgb2YgdGhlIHN1YmplY3Qgc3RyaW5nLiBDb25zaWRlciBhCisgICAgICAgc2ltcGxlIHBhdHRlcm4gc3VjaCBhcworCisgICAgICAgICBhYmNkJAorCisgICAgICAgd2hlbiBhcHBsaWVkIHRvIGEgbG9uZyBzdHJpbmcgdGhhdCBkb2VzICBub3QgIG1hdGNoLiAgQmVjYXVzZSAgbWF0Y2hpbmcKKyAgICAgICBwcm9jZWVkcyBmcm9tIGxlZnQgdG8gcmlnaHQsIFBDUkUgd2lsbCBsb29rIGZvciBlYWNoICJhIiBpbiB0aGUgc3ViamVjdAorICAgICAgIGFuZCB0aGVuIHNlZSBpZiB3aGF0IGZvbGxvd3MgbWF0Y2hlcyB0aGUgcmVzdCBvZiB0aGUgIHBhdHRlcm4uICBJZiAgdGhlCisgICAgICAgcGF0dGVybiBpcyBzcGVjaWZpZWQgYXMKKworICAgICAgICAgXi4qYWJjZCQKKworICAgICAgIHRoZSAgaW5pdGlhbCAuKiBtYXRjaGVzIHRoZSBlbnRpcmUgc3RyaW5nIGF0IGZpcnN0LCBidXQgd2hlbiB0aGlzIGZhaWxzCisgICAgICAgKGJlY2F1c2UgdGhlcmUgaXMgbm8gZm9sbG93aW5nICJhIiksIGl0IGJhY2t0cmFja3MgdG8gbWF0Y2ggYWxsIGJ1dCB0aGUKKyAgICAgICBsYXN0ICBjaGFyYWN0ZXIsICB0aGVuIGFsbCBidXQgdGhlIGxhc3QgdHdvIGNoYXJhY3RlcnMsIGFuZCBzbyBvbi4gT25jZQorICAgICAgIGFnYWluIHRoZSBzZWFyY2ggZm9yICJhIiBjb3ZlcnMgdGhlIGVudGlyZSBzdHJpbmcsIGZyb20gcmlnaHQgdG8gIGxlZnQsCisgICAgICAgc28gd2UgYXJlIG5vIGJldHRlciBvZmYuIEhvd2V2ZXIsIGlmIHRoZSBwYXR0ZXJuIGlzIHdyaXR0ZW4gYXMKKworICAgICAgICAgXig/Pi4qKSg/PD1hYmNkKQorCisgICAgICAgb3IsIGVxdWl2YWxlbnRseSwKKworICAgICAgICAgXi4qKyg/PD1hYmNkKQorCisgICAgICAgdGhlcmUgIGNhbiAgYmUgIG5vICBiYWNrdHJhY2tpbmcgZm9yIHRoZSAuKiBpdGVtOyBpdCBjYW4gbWF0Y2ggb25seSB0aGUKKyAgICAgICBlbnRpcmUgc3RyaW5nLiBUaGUgc3Vic2VxdWVudCBsb29rYmVoaW5kIGFzc2VydGlvbiBkb2VzIGEgIHNpbmdsZSAgdGVzdAorICAgICAgIG9uICB0aGUgbGFzdCBmb3VyIGNoYXJhY3RlcnMuIElmIGl0IGZhaWxzLCB0aGUgbWF0Y2ggZmFpbHMgaW1tZWRpYXRlbHkuCisgICAgICAgRm9yIGxvbmcgc3RyaW5ncywgdGhpcyBhcHByb2FjaCBtYWtlcyBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgIHRvICB0aGUKKyAgICAgICBwcm9jZXNzaW5nIHRpbWUuCisKKyAgICAgICBTZXZlcmFsIGFzc2VydGlvbnMgKG9mIGFueSBzb3J0KSBtYXkgb2NjdXIgaW4gc3VjY2Vzc2lvbi4gRm9yIGV4YW1wbGUsCisKKyAgICAgICAgICg/PD1cZHszfSkoPzwhOTk5KWZvbworCisgICAgICAgbWF0Y2hlcyAgImZvbyIgcHJlY2VkZWQgYnkgdGhyZWUgZGlnaXRzIHRoYXQgYXJlIG5vdCAiOTk5Ii4gTm90aWNlIHRoYXQKKyAgICAgICBlYWNoIG9mIHRoZSBhc3NlcnRpb25zIGlzIGFwcGxpZWQgaW5kZXBlbmRlbnRseSBhdCB0aGUgIHNhbWUgIHBvaW50ICBpbgorICAgICAgIHRoZSAgc3ViamVjdCAgc3RyaW5nLiAgRmlyc3QgIHRoZXJlICBpcyBhIGNoZWNrIHRoYXQgdGhlIHByZXZpb3VzIHRocmVlCisgICAgICAgY2hhcmFjdGVycyBhcmUgYWxsIGRpZ2l0cywgYW5kIHRoZW4gdGhlcmUgaXMgIGEgIGNoZWNrICB0aGF0ICB0aGUgIHNhbWUKKyAgICAgICB0aHJlZSBjaGFyYWN0ZXJzIGFyZSBub3QgIjk5OSIuICBUaGlzIHBhdHRlcm4gZG9lcyBub3QgbWF0Y2ggImZvbyIgcHJlLQorICAgICAgIGNlZGVkIGJ5IHNpeCBjaGFyYWN0ZXJzLCB0aGUgZmlyc3Qgb2Ygd2hpY2ggYXJlICBkaWdpdHMgIGFuZCAgdGhlICBsYXN0CisgICAgICAgdGhyZWUgIG9mICB3aGljaCAgYXJlIG5vdCAiOTk5Ii4gRm9yIGV4YW1wbGUsIGl0IGRvZXNuJ3QgbWF0Y2ggIjEyM2FiYy0KKyAgICAgICBmb28iLiBBIHBhdHRlcm4gdG8gZG8gdGhhdCBpcworCisgICAgICAgICAoPzw9XGR7M30uLi4pKD88ITk5OSlmb28KKworICAgICAgIFRoaXMgdGltZSB0aGUgZmlyc3QgYXNzZXJ0aW9uIGxvb2tzIGF0IHRoZSAgcHJlY2VkaW5nICBzaXggIGNoYXJhY3RlcnMsCisgICAgICAgY2hlY2tpbmcgdGhhdCB0aGUgZmlyc3QgdGhyZWUgYXJlIGRpZ2l0cywgYW5kIHRoZW4gdGhlIHNlY29uZCBhc3NlcnRpb24KKyAgICAgICBjaGVja3MgdGhhdCB0aGUgcHJlY2VkaW5nIHRocmVlIGNoYXJhY3RlcnMgYXJlIG5vdCAiOTk5Ii4KKworICAgICAgIEFzc2VydGlvbnMgY2FuIGJlIG5lc3RlZCBpbiBhbnkgY29tYmluYXRpb24uIEZvciBleGFtcGxlLAorCisgICAgICAgICAoPzw9KD88IWZvbyliYXIpYmF6CisKKyAgICAgICBtYXRjaGVzIGFuIG9jY3VycmVuY2Ugb2YgImJheiIgdGhhdCBpcyBwcmVjZWRlZCBieSAiYmFyIiB3aGljaCBpbiAgdHVybgorICAgICAgIGlzIG5vdCBwcmVjZWRlZCBieSAiZm9vIiwgd2hpbGUKKworICAgICAgICAgKD88PVxkezN9KD8hOTk5KS4uLilmb28KKworICAgICAgIGlzIGFub3RoZXIgcGF0dGVybiB3aGljaCBtYXRjaGVzICJmb28iIHByZWNlZGVkIGJ5IHRocmVlIGRpZ2l0cyBhbmQgYW55CisgICAgICAgdGhyZWUgY2hhcmFjdGVycyB0aGF0IGFyZSBub3QgIjk5OSIuCisKKyAgICAgICBBc3NlcnRpb24gc3VicGF0dGVybnMgYXJlIG5vdCBjYXB0dXJpbmcgc3VicGF0dGVybnMsICBhbmQgIG1heSAgbm90ICBiZQorICAgICAgIHJlcGVhdGVkLCAgYmVjYXVzZSAgaXQgIG1ha2VzIG5vIHNlbnNlIHRvIGFzc2VydCB0aGUgc2FtZSB0aGluZyBzZXZlcmFsCisgICAgICAgdGltZXMuIElmIGFueSBraW5kIG9mIGFzc2VydGlvbiBjb250YWlucyBjYXB0dXJpbmcgIHN1YnBhdHRlcm5zICB3aXRoaW4KKyAgICAgICBpdCwgIHRoZXNlIGFyZSBjb3VudGVkIGZvciB0aGUgcHVycG9zZXMgb2YgbnVtYmVyaW5nIHRoZSBjYXB0dXJpbmcgc3ViLQorICAgICAgIHBhdHRlcm5zIGluIHRoZSB3aG9sZSBwYXR0ZXJuLiAgSG93ZXZlciwgc3Vic3RyaW5nIGNhcHR1cmluZyBpcyBjYXJyaWVkCisgICAgICAgb3V0ICBvbmx5ICBmb3IgIHBvc2l0aXZlIGFzc2VydGlvbnMsIGJlY2F1c2UgaXQgZG9lcyBub3QgbWFrZSBzZW5zZSBmb3IKKyAgICAgICBuZWdhdGl2ZSBhc3NlcnRpb25zLgorCisKK0NPTkRJVElPTkFMIFNVQlBBVFRFUk5TCisKKyAgICAgICBJdCBpcyBwb3NzaWJsZSB0byBjYXVzZSB0aGUgbWF0Y2hpbmcgcHJvY2VzcyB0byBvYmV5IGEgc3VicGF0dGVybiAgY29uLQorICAgICAgIGRpdGlvbmFsbHkgIG9yIHRvIGNob29zZSBiZXR3ZWVuIHR3byBhbHRlcm5hdGl2ZSBzdWJwYXR0ZXJucywgZGVwZW5kaW5nCisgICAgICAgb24gdGhlICByZXN1bHQgIG9mICBhbiAgYXNzZXJ0aW9uLCAgb3IgIHdoZXRoZXIgIGEgIHByZXZpb3VzICBjYXB0dXJpbmcKKyAgICAgICBzdWJwYXR0ZXJuICBtYXRjaGVkICBvciBub3QuIFRoZSB0d28gcG9zc2libGUgZm9ybXMgb2YgY29uZGl0aW9uYWwgc3ViLQorICAgICAgIHBhdHRlcm4gYXJlCisKKyAgICAgICAgICg/KGNvbmRpdGlvbil5ZXMtcGF0dGVybikKKyAgICAgICAgICg/KGNvbmRpdGlvbil5ZXMtcGF0dGVybnxuby1wYXR0ZXJuKQorCisgICAgICAgSWYgdGhlIGNvbmRpdGlvbiBpcyBzYXRpc2ZpZWQsIHRoZSB5ZXMtcGF0dGVybiBpcyB1c2VkOyAgb3RoZXJ3aXNlICB0aGUKKyAgICAgICBuby1wYXR0ZXJuICAoaWYgIHByZXNlbnQpICBpcyB1c2VkLiBJZiB0aGVyZSBhcmUgbW9yZSB0aGFuIHR3byBhbHRlcm5hLQorICAgICAgIHRpdmVzIGluIHRoZSBzdWJwYXR0ZXJuLCBhIGNvbXBpbGUtdGltZSBlcnJvciBvY2N1cnMuCisKKyAgICAgICBUaGVyZSBhcmUgdGhyZWUga2luZHMgb2YgY29uZGl0aW9uLiBJZiB0aGUgdGV4dCBiZXR3ZWVuIHRoZSBwYXJlbnRoZXNlcworICAgICAgIGNvbnNpc3RzICBvZiAgYSAgc2VxdWVuY2UgIG9mIGRpZ2l0cywgdGhlIGNvbmRpdGlvbiBpcyBzYXRpc2ZpZWQgaWYgdGhlCisgICAgICAgY2FwdHVyaW5nIHN1YnBhdHRlcm4gb2YgdGhhdCBudW1iZXIgaGFzIHByZXZpb3VzbHkgbWF0Y2hlZC4gVGhlICBudW1iZXIKKyAgICAgICBtdXN0ICBiZSAgZ3JlYXRlciB0aGFuIHplcm8uIENvbnNpZGVyIHRoZSBmb2xsb3dpbmcgcGF0dGVybiwgd2hpY2ggY29uLQorICAgICAgIHRhaW5zIG5vbi1zaWduaWZpY2FudCB3aGl0ZSBzcGFjZSB0byBtYWtlIGl0IG1vcmUgcmVhZGFibGUgKGFzc3VtZSAgdGhlCisgICAgICAgUENSRV9FWFRFTkRFRCAgb3B0aW9uKSAgYW5kICB0byAgZGl2aWRlIGl0IGludG8gdGhyZWUgcGFydHMgZm9yIGVhc2Ugb2YKKyAgICAgICBkaXNjdXNzaW9uOgorCisgICAgICAgICAoIFwoICk/ICAgIFteKCldKyAgICAoPygxKSBcKSApCisKKyAgICAgICBUaGUgZmlyc3QgcGFydCBtYXRjaGVzIGFuIG9wdGlvbmFsIG9wZW5pbmcgIHBhcmVudGhlc2lzLCAgYW5kICBpZiAgdGhhdAorICAgICAgIGNoYXJhY3RlciBpcyBwcmVzZW50LCBzZXRzIGl0IGFzIHRoZSBmaXJzdCBjYXB0dXJlZCBzdWJzdHJpbmcuIFRoZSBzZWMtCisgICAgICAgb25kIHBhcnQgbWF0Y2hlcyBvbmUgb3IgbW9yZSBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCAgcGFyZW50aGVzZXMuICBUaGUKKyAgICAgICB0aGlyZCBwYXJ0IGlzIGEgY29uZGl0aW9uYWwgc3VicGF0dGVybiB0aGF0IHRlc3RzIHdoZXRoZXIgdGhlIGZpcnN0IHNldAorICAgICAgIG9mIHBhcmVudGhlc2VzIG1hdGNoZWQgb3Igbm90LiBJZiB0aGV5IGRpZCwgdGhhdCBpcywgaWYgc3ViamVjdCBzdGFydGVkCisgICAgICAgd2l0aCBhbiBvcGVuaW5nIHBhcmVudGhlc2lzLCB0aGUgY29uZGl0aW9uIGlzIHRydWUsIGFuZCBzbyB0aGUgeWVzLXBhdC0KKyAgICAgICB0ZXJuIGlzIGV4ZWN1dGVkIGFuZCBhICBjbG9zaW5nICBwYXJlbnRoZXNpcyAgaXMgIHJlcXVpcmVkLiAgT3RoZXJ3aXNlLAorICAgICAgIHNpbmNlICBuby1wYXR0ZXJuICBpcyAgbm90ICBwcmVzZW50LCB0aGUgc3VicGF0dGVybiBtYXRjaGVzIG5vdGhpbmcuIEluCisgICAgICAgb3RoZXIgd29yZHMsICB0aGlzICBwYXR0ZXJuICBtYXRjaGVzICBhICBzZXF1ZW5jZSAgb2YgIG5vbi1wYXJlbnRoZXNlcywKKyAgICAgICBvcHRpb25hbGx5IGVuY2xvc2VkIGluIHBhcmVudGhlc2VzLgorCisgICAgICAgSWYgdGhlIGNvbmRpdGlvbiBpcyB0aGUgc3RyaW5nIChSKSwgaXQgaXMgc2F0aXNmaWVkIGlmIGEgcmVjdXJzaXZlIGNhbGwKKyAgICAgICB0byB0aGUgcGF0dGVybiBvciBzdWJwYXR0ZXJuIGhhcyBiZWVuIG1hZGUuIEF0ICJ0b3AgbGV2ZWwiLCB0aGUgIGNvbmRpLQorICAgICAgIHRpb24gIGlzICBmYWxzZS4gICBUaGlzICBpcyAgYSAgUENSRSAgZXh0ZW5zaW9uLiBSZWN1cnNpdmUgcGF0dGVybnMgYXJlCisgICAgICAgZGVzY3JpYmVkIGluIHRoZSBuZXh0IHNlY3Rpb24uCisKKyAgICAgICBJZiB0aGUgY29uZGl0aW9uIGlzIG5vdCBhIHNlcXVlbmNlIG9mIGRpZ2l0cyBvciAgKFIpLCAgaXQgIG11c3QgIGJlICBhbgorICAgICAgIGFzc2VydGlvbi4gICBUaGlzIG1heSBiZSBhIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIGxvb2thaGVhZCBvciBsb29rYmVoaW5kCisgICAgICAgYXNzZXJ0aW9uLiBDb25zaWRlciAgdGhpcyAgcGF0dGVybiwgIGFnYWluICBjb250YWluaW5nICBub24tc2lnbmlmaWNhbnQKKyAgICAgICB3aGl0ZSBzcGFjZSwgYW5kIHdpdGggdGhlIHR3byBhbHRlcm5hdGl2ZXMgb24gdGhlIHNlY29uZCBsaW5lOgorCisgICAgICAgICAoPyg/PVteYS16XSpbYS16XSkKKyAgICAgICAgIFxkezJ9LVthLXpdezN9LVxkezJ9ICB8ICBcZHsyfS1cZHsyfS1cZHsyfSApCisKKyAgICAgICBUaGUgIGNvbmRpdGlvbiAgaXMgIGEgIHBvc2l0aXZlICBsb29rYWhlYWQgIGFzc2VydGlvbiAgdGhhdCAgbWF0Y2hlcyBhbgorICAgICAgIG9wdGlvbmFsIHNlcXVlbmNlIG9mIG5vbi1sZXR0ZXJzIGZvbGxvd2VkIGJ5IGEgbGV0dGVyLiBJbiBvdGhlciAgd29yZHMsCisgICAgICAgaXQgIHRlc3RzICBmb3IgdGhlIHByZXNlbmNlIG9mIGF0IGxlYXN0IG9uZSBsZXR0ZXIgaW4gdGhlIHN1YmplY3QuIElmIGEKKyAgICAgICBsZXR0ZXIgaXMgZm91bmQsIHRoZSBzdWJqZWN0IGlzIG1hdGNoZWQgYWdhaW5zdCB0aGUgZmlyc3QgIGFsdGVybmF0aXZlOworICAgICAgIG90aGVyd2lzZSAgaXQgIGlzICBtYXRjaGVkICBhZ2FpbnN0ICB0aGUgIHNlY29uZC4gIFRoaXMgcGF0dGVybiBtYXRjaGVzCisgICAgICAgc3RyaW5ncyBpbiBvbmUgb2YgdGhlIHR3byBmb3JtcyBkZC1hYWEtZGQgb3IgZGQtZGQtZGQsICB3aGVyZSAgYWFhICBhcmUKKyAgICAgICBsZXR0ZXJzIGFuZCBkZCBhcmUgZGlnaXRzLgorCisKK0NPTU1FTlRTCisKKyAgICAgICBUaGUgc2VxdWVuY2UgKD8jIG1hcmtzIHRoZSBzdGFydCBvZiBhIGNvbW1lbnQgd2hpY2ggY29udGludWVzIHVwIHRvIHRoZQorICAgICAgIG5leHQgY2xvc2luZyBwYXJlbnRoZXNpcy4gTmVzdGVkIHBhcmVudGhlc2VzICBhcmUgIG5vdCAgcGVybWl0dGVkLiAgVGhlCisgICAgICAgY2hhcmFjdGVycyAgdGhhdCBtYWtlIHVwIGEgY29tbWVudCBwbGF5IG5vIHBhcnQgaW4gdGhlIHBhdHRlcm4gbWF0Y2hpbmcKKyAgICAgICBhdCBhbGwuCisKKyAgICAgICBJZiB0aGUgUENSRV9FWFRFTkRFRCBvcHRpb24gaXMgc2V0LCBhbiB1bmVzY2FwZWQgIyBjaGFyYWN0ZXIgb3V0c2lkZSAgYQorICAgICAgIGNoYXJhY3RlciBjbGFzcyBpbnRyb2R1Y2VzIGEgY29tbWVudCB0aGF0IGNvbnRpbnVlcyB1cCB0byB0aGUgbmV4dCBuZXctCisgICAgICAgbGluZSBjaGFyYWN0ZXIgaW4gdGhlIHBhdHRlcm4uCisKKworUkVDVVJTSVZFIFBBVFRFUk5TCisKKyAgICAgICBDb25zaWRlciB0aGUgcHJvYmxlbSBvZiBtYXRjaGluZyBhIHN0cmluZyBpbiBwYXJlbnRoZXNlcywgYWxsb3dpbmcgIGZvcgorICAgICAgIHVubGltaXRlZCAgbmVzdGVkICBwYXJlbnRoZXNlcy4gIFdpdGhvdXQgdGhlIHVzZSBvZiByZWN1cnNpb24sIHRoZSBiZXN0CisgICAgICAgdGhhdCBjYW4gYmUgZG9uZSBpcyB0byB1c2UgYSBwYXR0ZXJuIHRoYXQgIG1hdGNoZXMgIHVwICB0byAgc29tZSAgZml4ZWQKKyAgICAgICBkZXB0aCAgb2YgIG5lc3RpbmcuICBJdCAgaXMgbm90IHBvc3NpYmxlIHRvIGhhbmRsZSBhbiBhcmJpdHJhcnkgbmVzdGluZworICAgICAgIGRlcHRoLiBQZXJsIGhhcyBwcm92aWRlZCBhbiBleHBlcmltZW50YWwgZmFjaWxpdHkgdGhhdCAgYWxsb3dzICByZWd1bGFyCisgICAgICAgZXhwcmVzc2lvbnMgdG8gcmVjdXJzZSAoYW1vbmdzdCBvdGhlciB0aGluZ3MpLiBJdCBkb2VzIHRoaXMgYnkgaW50ZXJwby0KKyAgICAgICBsYXRpbmcgUGVybCBjb2RlIGluIHRoZSBleHByZXNzaW9uIGF0IHJ1biB0aW1lLCBhbmQgdGhlIGNvZGUgY2FuICByZWZlcgorICAgICAgIHRvIHRoZSBleHByZXNzaW9uIGl0c2VsZi4gQSBQZXJsIHBhdHRlcm4gdG8gc29sdmUgdGhlIHBhcmVudGhlc2VzIHByb2ItCisgICAgICAgbGVtIGNhbiBiZSBjcmVhdGVkIGxpa2UgdGhpczoKKworICAgICAgICAgJHJlID0gcXJ7XCggKD86ICg/PlteKCldKykgfCAoP3B7JHJlfSkgKSogXCl9eDsKKworICAgICAgIFRoZSAoP3B7Li4ufSkgaXRlbSBpbnRlcnBvbGF0ZXMgUGVybCBjb2RlIGF0IHJ1biB0aW1lLCBhbmQgaW4gdGhpcyBjYXNlCisgICAgICAgcmVmZXJzICByZWN1cnNpdmVseSB0byB0aGUgcGF0dGVybiBpbiB3aGljaCBpdCBhcHBlYXJzLiBPYnZpb3VzbHksIFBDUkUKKyAgICAgICBjYW5ub3Qgc3VwcG9ydCB0aGUgaW50ZXJwb2xhdGlvbiBvZiBQZXJsICBjb2RlLiAgSW5zdGVhZCwgIGl0ICBzdXBwb3J0cworICAgICAgIHNvbWUgIHNwZWNpYWwgIHN5bnRheCBmb3IgcmVjdXJzaW9uIG9mIHRoZSBlbnRpcmUgcGF0dGVybiwgYW5kIGFsc28gZm9yCisgICAgICAgaW5kaXZpZHVhbCBzdWJwYXR0ZXJuIHJlY3Vyc2lvbi4KKworICAgICAgIFRoZSBzcGVjaWFsIGl0ZW0gdGhhdCBjb25zaXN0cyBvZiAoPyBmb2xsb3dlZCBieSBhIG51bWJlciBncmVhdGVyICB0aGFuCisgICAgICAgemVybyBhbmQgYSBjbG9zaW5nIHBhcmVudGhlc2lzIGlzIGEgcmVjdXJzaXZlIGNhbGwgb2YgdGhlIHN1YnBhdHRlcm4gb2YKKyAgICAgICB0aGUgZ2l2ZW4gbnVtYmVyLCBwcm92aWRlZCB0aGF0IGl0IG9jY3VycyBpbnNpZGUgdGhhdCAgc3VicGF0dGVybi4gIChJZgorICAgICAgIG5vdCwgIGl0ICBpcyAgYSAgInN1YnJvdXRpbmUiIGNhbGwsIHdoaWNoIGlzIGRlc2NyaWJlZCBpbiB0aGUgbmV4dCBzZWMtCisgICAgICAgdGlvbi4pIFRoZSBzcGVjaWFsIGl0ZW0gKD9SKSBpcyBhIHJlY3Vyc2l2ZSBjYWxsIG9mIHRoZSBlbnRpcmUgIHJlZ3VsYXIKKyAgICAgICBleHByZXNzaW9uLgorCisgICAgICAgRm9yICBleGFtcGxlLCAgdGhpcyAgUENSRSBwYXR0ZXJuIHNvbHZlcyB0aGUgbmVzdGVkIHBhcmVudGhlc2VzIHByb2JsZW0KKyAgICAgICAoYXNzdW1lIHRoZSAgUENSRV9FWFRFTkRFRCAgb3B0aW9uICBpcyAgc2V0ICBzbyAgdGhhdCAgd2hpdGUgIHNwYWNlICBpcworICAgICAgIGlnbm9yZWQpOgorCisgICAgICAgICBcKCAoICg/PlteKCldKykgfCAoP1IpICkqIFwpCisKKyAgICAgICBGaXJzdCAgaXQgbWF0Y2hlcyBhbiBvcGVuaW5nIHBhcmVudGhlc2lzLiBUaGVuIGl0IG1hdGNoZXMgYW55IG51bWJlciBvZgorICAgICAgIHN1YnN0cmluZ3Mgd2hpY2ggY2FuIGVpdGhlciBiZSBhICBzZXF1ZW5jZSAgb2YgIG5vbi1wYXJlbnRoZXNlcywgIG9yICBhCisgICAgICAgcmVjdXJzaXZlICBtYXRjaCAgb2YgIHRoZSBwYXR0ZXJuIGl0c2VsZiAodGhhdCBpcyBhIGNvcnJlY3RseSBwYXJlbnRoZS0KKyAgICAgICBzaXplZCBzdWJzdHJpbmcpLiAgRmluYWxseSB0aGVyZSBpcyBhIGNsb3NpbmcgcGFyZW50aGVzaXMuCisKKyAgICAgICBJZiB0aGlzIHdlcmUgcGFydCBvZiBhIGxhcmdlciBwYXR0ZXJuLCB5b3Ugd291bGQgbm90ICB3YW50ICB0byAgcmVjdXJzZQorICAgICAgIHRoZSBlbnRpcmUgcGF0dGVybiwgc28gaW5zdGVhZCB5b3UgY291bGQgdXNlIHRoaXM6CisKKyAgICAgICAgICggXCggKCAoPz5bXigpXSspIHwgKD8xKSApKiBcKSApCisKKyAgICAgICBXZSAgaGF2ZSAgcHV0IHRoZSBwYXR0ZXJuIGludG8gcGFyZW50aGVzZXMsIGFuZCBjYXVzZWQgdGhlIHJlY3Vyc2lvbiB0bworICAgICAgIHJlZmVyIHRvIHRoZW0gaW5zdGVhZCBvZiB0aGUgd2hvbGUgcGF0dGVybi4gSW4gYSBsYXJnZXIgcGF0dGVybiwgIGtlZXAtCisgICAgICAgaW5nICB0cmFjayAgb2YgcGFyZW50aGVzaXMgbnVtYmVycyBjYW4gYmUgdHJpY2t5LiBJdCBtYXkgYmUgbW9yZSBjb252ZS0KKyAgICAgICBuaWVudCB0byB1c2UgbmFtZWQgcGFyZW50aGVzZXMgaW5zdGVhZC4gRm9yIHRoaXMsIFBDUkUgdXNlcyAgKD9QPm5hbWUpLAorICAgICAgIHdoaWNoICBpcyAgYW4gIGV4dGVuc2lvbiAgdG8gdGhlIFB5dGhvbiBzeW50YXggdGhhdCBQQ1JFIHVzZXMgZm9yIG5hbWVkCisgICAgICAgcGFyZW50aGVzZXMgKFBlcmwgZG9lcyBub3QgcHJvdmlkZSBuYW1lZCBwYXJlbnRoZXNlcykuIFdlIGNvdWxkIHJld3JpdGUKKyAgICAgICB0aGUgYWJvdmUgZXhhbXBsZSBhcyBmb2xsb3dzOgorCisgICAgICAgICAoP1A8cG4+IFwoICggKD8+W14oKV0rKSB8ICg/UD5wbikgKSogXCkgKQorCisgICAgICAgVGhpcyAgcGFydGljdWxhciBleGFtcGxlIHBhdHRlcm4gY29udGFpbnMgbmVzdGVkIHVubGltaXRlZCByZXBlYXRzLCBhbmQKKyAgICAgICBzbyB0aGUgdXNlIG9mIGF0b21pYyBncm91cGluZyBmb3IgbWF0Y2hpbmcgc3RyaW5ncyAgb2YgIG5vbi1wYXJlbnRoZXNlcworICAgICAgIGlzICBpbXBvcnRhbnQgIHdoZW4gIGFwcGx5aW5nIHRoZSBwYXR0ZXJuIHRvIHN0cmluZ3MgdGhhdCBkbyBub3QgbWF0Y2guCisgICAgICAgRm9yIGV4YW1wbGUsIHdoZW4gdGhpcyBwYXR0ZXJuIGlzIGFwcGxpZWQgdG8KKworICAgICAgICAgKGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhKCkKKworICAgICAgIGl0IHlpZWxkcyAibm8gbWF0Y2giIHF1aWNrbHkuIEhvd2V2ZXIsIGlmIGF0b21pYyBncm91cGluZyBpcyBub3QgIHVzZWQsCisgICAgICAgdGhlICBtYXRjaCAgcnVucyAgZm9yIGEgdmVyeSBsb25nIHRpbWUgaW5kZWVkIGJlY2F1c2UgdGhlcmUgYXJlIHNvIG1hbnkKKyAgICAgICBkaWZmZXJlbnQgd2F5cyB0aGUgKyBhbmQgKiByZXBlYXRzIGNhbiBjYXJ2ZSB1cCB0aGUgIHN1YmplY3QsICBhbmQgIGFsbAorICAgICAgIGhhdmUgdG8gYmUgdGVzdGVkIGJlZm9yZSBmYWlsdXJlIGNhbiBiZSByZXBvcnRlZC4KKworICAgICAgIEF0IHRoZSBlbmQgb2YgYSBtYXRjaCwgdGhlIHZhbHVlcyBzZXQgZm9yIGFueSBjYXB0dXJpbmcgc3VicGF0dGVybnMgYXJlCisgICAgICAgdGhvc2UgZnJvbSB0aGUgb3V0ZXJtb3N0IGxldmVsIG9mIHRoZSByZWN1cnNpb24gYXQgd2hpY2ggdGhlIHN1YnBhdHRlcm4KKyAgICAgICB2YWx1ZSAgaXMgIHNldC4gICBJZiAgeW91IHdhbnQgdG8gb2J0YWluIGludGVybWVkaWF0ZSB2YWx1ZXMsIGEgY2FsbG91dAorICAgICAgIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIChzZWUgYmVsb3cgYW5kIHRoZSBwY3JlY2FsbG91dCBkb2N1bWVudGF0aW9uKS4gIElmCisgICAgICAgdGhlIHBhdHRlcm4gYWJvdmUgaXMgbWF0Y2hlZCBhZ2FpbnN0CisKKyAgICAgICAgIChhYihjZCllZikKKworICAgICAgIHRoZSAgdmFsdWUgIGZvciAgdGhlICBjYXB0dXJpbmcgIHBhcmVudGhlc2VzIGlzICJlZiIsIHdoaWNoIGlzIHRoZSBsYXN0CisgICAgICAgdmFsdWUgdGFrZW4gb24gYXQgdGhlIHRvcCBsZXZlbC4gSWYgYWRkaXRpb25hbCBwYXJlbnRoZXNlcyAgYXJlICBhZGRlZCwKKyAgICAgICBnaXZpbmcKKworICAgICAgICAgXCggKCAoICg/PlteKCldKykgfCAoP1IpICkqICkgXCkKKyAgICAgICAgICAgIF4gICAgICAgICAgICAgICAgICAgICAgICBeCisgICAgICAgICAgICBeICAgICAgICAgICAgICAgICAgICAgICAgXgorCisgICAgICAgdGhlICBzdHJpbmcgIHRoZXkgIGNhcHR1cmUgaXMgImFiKGNkKWVmIiwgdGhlIGNvbnRlbnRzIG9mIHRoZSB0b3AgbGV2ZWwKKyAgICAgICBwYXJlbnRoZXNlcy4gSWYgdGhlcmUgYXJlIG1vcmUgdGhhbiAxNSBjYXB0dXJpbmcgcGFyZW50aGVzZXMgaW4gYSAgcGF0LQorICAgICAgIHRlcm4sIFBDUkUgaGFzIHRvIG9idGFpbiBleHRyYSBtZW1vcnkgdG8gc3RvcmUgZGF0YSBkdXJpbmcgYSByZWN1cnNpb24sCisgICAgICAgd2hpY2ggaXQgZG9lcyBieSB1c2luZyBwY3JlX21hbGxvYywgZnJlZWluZyAgaXQgIHZpYSAgcGNyZV9mcmVlICBhZnRlci0KKyAgICAgICB3YXJkcy4gIElmICBubyAgbWVtb3J5ICBjYW4gIGJlICBvYnRhaW5lZCwgIHRoZSAgbWF0Y2ggIGZhaWxzICB3aXRoIHRoZQorICAgICAgIFBDUkVfRVJST1JfTk9NRU1PUlkgZXJyb3IuCisKKyAgICAgICBEbyBub3QgY29uZnVzZSB0aGUgKD9SKSBpdGVtIHdpdGggdGhlIGNvbmRpdGlvbiAoUiksICB3aGljaCAgdGVzdHMgIGZvcgorICAgICAgIHJlY3Vyc2lvbi4gICBDb25zaWRlciAgdGhpcyBwYXR0ZXJuLCB3aGljaCBtYXRjaGVzIHRleHQgaW4gYW5nbGUgYnJhY2stCisgICAgICAgZXRzLCBhbGxvd2luZyBmb3IgYXJiaXRyYXJ5IG5lc3RpbmcuIE9ubHkgZGlnaXRzIGFyZSBhbGxvd2VkIGluICBuZXN0ZWQKKyAgICAgICBicmFja2V0cyAgKHRoYXQgaXMsIHdoZW4gcmVjdXJzaW5nKSwgd2hlcmVhcyBhbnkgY2hhcmFjdGVycyBhcmUgcGVybWl0LQorICAgICAgIHRlZCBhdCB0aGUgb3V0ZXIgbGV2ZWwuCisKKyAgICAgICAgIDwgKD86ICg/KFIpIFxkKysgIHwgW148Pl0qKykgfCAoP1IpKSAqID4KKworICAgICAgIEluIHRoaXMgcGF0dGVybiwgKD8oUikgaXMgdGhlIHN0YXJ0IG9mIGEgY29uZGl0aW9uYWwgIHN1YnBhdHRlcm4sICB3aXRoCisgICAgICAgdHdvICBkaWZmZXJlbnQgIGFsdGVybmF0aXZlcyBmb3IgdGhlIHJlY3Vyc2l2ZSBhbmQgbm9uLXJlY3Vyc2l2ZSBjYXNlcy4KKyAgICAgICBUaGUgKD9SKSBpdGVtIGlzIHRoZSBhY3R1YWwgcmVjdXJzaXZlIGNhbGwuCisKKworU1VCUEFUVEVSTlMgQVMgU1VCUk9VVElORVMKKworICAgICAgIElmIHRoZSBzeW50YXggZm9yIGEgcmVjdXJzaXZlIHN1YnBhdHRlcm4gcmVmZXJlbmNlIChlaXRoZXIgYnkgbnVtYmVyIG9yCisgICAgICAgYnkgIG5hbWUpICBpcyB1c2VkIG91dHNpZGUgdGhlIHBhcmVudGhlc2VzIHRvIHdoaWNoIGl0IHJlZmVycywgaXQgb3Blci0KKyAgICAgICBhdGVzIGxpa2UgYSBzdWJyb3V0aW5lIGluIGEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuICBBbiAgZWFybGllciAgZXhhbXBsZQorICAgICAgIHBvaW50ZWQgb3V0IHRoYXQgdGhlIHBhdHRlcm4KKworICAgICAgICAgKHNlbnN8cmVzcG9ucyllIGFuZCBcMWliaWxpdHkKKworICAgICAgIG1hdGNoZXMgICJzZW5zZSBhbmQgc2Vuc2liaWxpdHkiIGFuZCAicmVzcG9uc2UgYW5kIHJlc3BvbnNpYmlsaXR5IiwgYnV0CisgICAgICAgbm90ICJzZW5zZSBhbmQgcmVzcG9uc2liaWxpdHkiLiBJZiBpbnN0ZWFkIHRoZSBwYXR0ZXJuCisKKyAgICAgICAgIChzZW5zfHJlc3BvbnMpZSBhbmQgKD8xKWliaWxpdHkKKworICAgICAgIGlzIHVzZWQsIGl0IGRvZXMgbWF0Y2ggInNlbnNlIGFuZCByZXNwb25zaWJpbGl0eSIgYXMgd2VsbCBhcyB0aGUgIG90aGVyCisgICAgICAgdHdvICBzdHJpbmdzLiAgU3VjaCAgcmVmZXJlbmNlcyBtdXN0LCBob3dldmVyLCBmb2xsb3cgdGhlIHN1YnBhdHRlcm4gdG8KKyAgICAgICB3aGljaCB0aGV5IHJlZmVyLgorCisKK0NBTExPVVRTCisKKyAgICAgICBQZXJsIGhhcyBhIGZlYXR1cmUgd2hlcmVieSB1c2luZyB0aGUgc2VxdWVuY2UgKD97Li4ufSkgY2F1c2VzIGFyYml0cmFyeQorICAgICAgIFBlcmwgIGNvZGUgdG8gYmUgb2JleWVkIGluIHRoZSBtaWRkbGUgb2YgbWF0Y2hpbmcgYSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICAgVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSwgYW1vbmdzdCBvdGhlciB0aGluZ3MsIHRvIGV4dHJhY3QgZGlmZmVyZW50IHN1Yi0KKyAgICAgICBzdHJpbmdzIHRoYXQgbWF0Y2ggdGhlIHNhbWUgcGFpciBvZiBwYXJlbnRoZXNlcyB3aGVuIHRoZXJlIGlzIGEgcmVwZXRpLQorICAgICAgIHRpb24uCisKKyAgICAgICBQQ1JFIHByb3ZpZGVzIGEgc2ltaWxhciBmZWF0dXJlLCBidXQgb2YgY291cnNlIGl0IGNhbm5vdCBvYmV5IGFyYml0cmFyeQorICAgICAgIFBlcmwgY29kZS4gVGhlIGZlYXR1cmUgaXMgY2FsbGVkICJjYWxsb3V0Ii4gVGhlIGNhbGxlciBvZiBQQ1JFIHByb3ZpZGVzCisgICAgICAgYW4gZXh0ZXJuYWwgZnVuY3Rpb24gYnkgcHV0dGluZyBpdHMgZW50cnkgcG9pbnQgaW4gdGhlIGdsb2JhbCAgdmFyaWFibGUKKyAgICAgICBwY3JlX2NhbGxvdXQuICAgQnkgZGVmYXVsdCwgdGhpcyB2YXJpYWJsZSBjb250YWlucyBOVUxMLCB3aGljaCBkaXNhYmxlcworICAgICAgIGFsbCBjYWxsaW5nIG91dC4KKworICAgICAgIFdpdGhpbiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiwgKD9DKSBpbmRpY2F0ZXMgdGhlICBwb2ludHMgIGF0ICB3aGljaCAgdGhlCisgICAgICAgZXh0ZXJuYWwgIGZ1bmN0aW9uICBpcyAgdG8gYmUgY2FsbGVkLiBJZiB5b3Ugd2FudCB0byBpZGVudGlmeSBkaWZmZXJlbnQKKyAgICAgICBjYWxsb3V0IHBvaW50cywgeW91IGNhbiBwdXQgYSBudW1iZXIgbGVzcyB0aGFuIDI1NiBhZnRlciB0aGUgbGV0dGVyICBDLgorICAgICAgIFRoZSAgZGVmYXVsdCAgdmFsdWUgaXMgemVyby4gIEZvciBleGFtcGxlLCB0aGlzIHBhdHRlcm4gaGFzIHR3byBjYWxsb3V0CisgICAgICAgcG9pbnRzOgorCisgICAgICAgICAoP0MxKWFiYyg/QzIpZGVmCisKKyAgICAgICBEdXJpbmcgbWF0Y2hpbmcsIHdoZW4gUENSRSByZWFjaGVzIGEgY2FsbG91dCBwb2ludCAoYW5kIHBjcmVfY2FsbG91dCBpcworICAgICAgIHNldCksICB0aGUgIGV4dGVybmFsIGZ1bmN0aW9uIGlzIGNhbGxlZC4gSXQgaXMgcHJvdmlkZWQgd2l0aCB0aGUgbnVtYmVyCisgICAgICAgb2YgdGhlIGNhbGxvdXQsIGFuZCwgb3B0aW9uYWxseSwgb25lIGl0ZW0gb2YgZGF0YSAgb3JpZ2luYWxseSAgc3VwcGxpZWQKKyAgICAgICBieSAgdGhlICBjYWxsZXIgb2YgcGNyZV9leGVjKCkuIFRoZSBjYWxsb3V0IGZ1bmN0aW9uIG1heSBjYXVzZSBtYXRjaGluZworICAgICAgIHRvIGJhY2t0cmFjaywgb3IgdG8gZmFpbCBhbHRvZ2V0aGVyLiAgQSAgY29tcGxldGUgIGRlc2NyaXB0aW9uICBvZiAgdGhlCisgICAgICAgaW50ZXJmYWNlICB0byB0aGUgY2FsbG91dCBmdW5jdGlvbiBpcyBnaXZlbiBpbiB0aGUgcGNyZWNhbGxvdXQgZG9jdW1lbi0KKyAgICAgICB0YXRpb24uCisKKworRElGRkVSRU5DRVMgRlJPTSBQRVJMCisgICAgICAgVGhpcyBzZWN0aW9uIGVzY3JpYmVzIHRoZSBkaWZmZXJlbmNlcyBpbiB0aGUgd2F5cyB0aGF0IFBDUkUgYW5kIFBlcmwKKyAgICAgICBoYW5kbGUgcmVndWxhciBleHByZXNzaW9ucy4gVGhlIGRpZmZlcmVuY2VzICBkZXNjcmliZWQgIGhlcmUgIGFyZSAgd2l0aAorICAgICAgIHJlc3BlY3QgdG8gUGVybCA1LjguCisKKyAgICAgICAxLiAgUENSRSBkb2VzIG5vdCBoYXZlIGZ1bGwgVVRGLTggc3VwcG9ydC4gRGV0YWlscyBvZiB3aGF0IGl0IGRvZXMgaGF2ZQorICAgICAgIGFyZSBnaXZlbiBpbiB0aGUgc2VjdGlvbiBvbiBVVEYtOCBzdXBwb3J0IGluIHRoZSBtYWluIHBjcmUgcGFnZS4KKworICAgICAgIDIuIFBDUkUgZG9lcyBub3QgYWxsb3cgcmVwZWF0IHF1YW50aWZpZXJzIG9uIGxvb2thaGVhZCBhc3NlcnRpb25zLiBQZXJsCisgICAgICAgcGVybWl0cyAgdGhlbSwgIGJ1dCB0aGV5IGRvIG5vdCBtZWFuIHdoYXQgeW91IG1pZ2h0IHRoaW5rLiBGb3IgZXhhbXBsZSwKKyAgICAgICAoPyFhKXszfSBkb2VzIG5vdCBhc3NlcnQgdGhhdCB0aGUgbmV4dCB0aHJlZSBjaGFyYWN0ZXJzIGFyZSBub3QgImEiLiBJdAorICAgICAgIGp1c3QgYXNzZXJ0cyB0aGF0IHRoZSBuZXh0IGNoYXJhY3RlciBpcyBub3QgImEiIHRocmVlIHRpbWVzLgorCisgICAgICAgMy4gIENhcHR1cmluZyAgc3VicGF0dGVybnMgIHRoYXQgb2NjdXIgaW5zaWRlIG5lZ2F0aXZlIGxvb2thaGVhZCBhc3Nlci0KKyAgICAgICB0aW9ucyBhcmUgY291bnRlZCwgYnV0IHRoZWlyIGVudHJpZXMgaW4gdGhlIG9mZnNldHMgIHZlY3RvciAgYXJlICBuZXZlcgorICAgICAgIHNldC4gIFBlcmwgc2V0cyBpdHMgbnVtZXJpY2FsIHZhcmlhYmxlcyBmcm9tIGFueSBzdWNoIHBhdHRlcm5zIHRoYXQgYXJlCisgICAgICAgbWF0Y2hlZCBiZWZvcmUgdGhlIGFzc2VydGlvbiBmYWlscyB0byBtYXRjaCBzb21ldGhpbmcgKHRoZXJlYnkgc3VjY2VlZC0KKyAgICAgICBpbmcpLCAgYnV0ICBvbmx5ICBpZiB0aGUgbmVnYXRpdmUgbG9va2FoZWFkIGFzc2VydGlvbiBjb250YWlucyBqdXN0IG9uZQorICAgICAgIGJyYW5jaC4KKworICAgICAgIDQuIFRob3VnaCBiaW5hcnkgemVybyBjaGFyYWN0ZXJzIGFyZSBzdXBwb3J0ZWQgaW4gdGhlICBzdWJqZWN0ICBzdHJpbmcsCisgICAgICAgdGhleSBhcmUgbm90IGFsbG93ZWQgaW4gYSBwYXR0ZXJuIHN0cmluZyBiZWNhdXNlIGl0IGlzIHBhc3NlZCBhcyBhIG5vci0KKyAgICAgICBtYWwgQyBzdHJpbmcsIHRlcm1pbmF0ZWQgYnkgemVyby4gVGhlIGVzY2FwZSBzZXF1ZW5jZSAiXDAiIGNhbiBiZSAgdXNlZAorICAgICAgIGluIHRoZSBwYXR0ZXJuIHRvIHJlcHJlc2VudCBhIGJpbmFyeSB6ZXJvLgorCisgICAgICAgNS4gIFRoZSAgZm9sbG93aW5nIFBlcmwgZXNjYXBlIHNlcXVlbmNlcyBhcmUgbm90IHN1cHBvcnRlZDogXGwsIFx1LCBcTCwKKyAgICAgICBcVSwgXFAsIFxwLCBcTiwgYW5kIFxYLiBJbiBmYWN0IHRoZXNlIGFyZSBpbXBsZW1lbnRlZCBieSBQZXJsJ3MgZ2VuZXJhbAorICAgICAgIHN0cmluZy1oYW5kbGluZyBhbmQgYXJlIG5vdCBwYXJ0IG9mIGl0cyBwYXR0ZXJuIG1hdGNoaW5nIGVuZ2luZS4gSWYgYW55CisgICAgICAgb2YgdGhlc2UgYXJlIGVuY291bnRlcmVkIGJ5IFBDUkUsIGFuIGVycm9yIGlzIGdlbmVyYXRlZC4KKworICAgICAgIDYuIFBDUkUgZG9lcyBzdXBwb3J0IHRoZSBcUS4uLlxFIGVzY2FwZSBmb3IgcXVvdGluZyBzdWJzdHJpbmdzLiBDaGFyYWMtCisgICAgICAgdGVycyAgaW4gIGJldHdlZW4gIGFyZSAgdHJlYXRlZCBhcyBsaXRlcmFscy4gVGhpcyBpcyBzbGlnaHRseSBkaWZmZXJlbnQKKyAgICAgICBmcm9tIFBlcmwgaW4gdGhhdCAkIGFuZCBAIGFyZSAgYWxzbyAgaGFuZGxlZCAgYXMgIGxpdGVyYWxzICBpbnNpZGUgIHRoZQorICAgICAgIHF1b3Rlcy4gIEluIFBlcmwsIHRoZXkgY2F1c2UgdmFyaWFibGUgaW50ZXJwb2xhdGlvbiAoYnV0IG9mIGNvdXJzZSBQQ1JFCisgICAgICAgZG9lcyBub3QgaGF2ZSB2YXJpYWJsZXMpLiBOb3RlIHRoZSBmb2xsb3dpbmcgZXhhbXBsZXM6CisKKyAgICAgICAgICAgUGF0dGVybiAgICAgICAgICAgIFBDUkUgbWF0Y2hlcyAgICAgIFBlcmwgbWF0Y2hlcworCisgICAgICAgICAgIFxRYWJjJHh5elxFICAgICAgICBhYmMkeHl6ICAgICAgICAgICBhYmMgZm9sbG93ZWQgYnkgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzIG9mICR4eXoKKyAgICAgICAgICAgXFFhYmNcJHh5elxFICAgICAgIGFiY1wkeHl6ICAgICAgICAgIGFiY1wkeHl6CisgICAgICAgICAgIFxRYWJjXEVcJFxReHl6XEUgICBhYmMkeHl6ICAgICAgICAgICBhYmMkeHl6CisKKyAgICAgICBUaGUgXFEuLi5cRSBzZXF1ZW5jZSBpcyByZWNvZ25pemVkIGJvdGggaW5zaWRlICBhbmQgIG91dHNpZGUgIGNoYXJhY3RlcgorICAgICAgIGNsYXNzZXMuCisKKyAgICAgICA3LiBGYWlybHkgb2J2aW91c2x5LCBQQ1JFIGRvZXMgbm90IHN1cHBvcnQgdGhlICg/e2NvZGV9KSBhbmQgKD9we2NvZGV9KQorICAgICAgIGNvbnN0cnVjdGlvbnMuIEhvd2V2ZXIsIHRoZXJlIGlzIHNvbWUgZXhwZXJpbWVudGFsIHN1cHBvcnQgIGZvciAgcmVjdXItCisgICAgICAgc2l2ZSAgcGF0dGVybnMgIHVzaW5nIHRoZSBub24tUGVybCBpdGVtcyAoP1IpLCAoP251bWJlcikgYW5kICg/UD5uYW1lKS4KKyAgICAgICBBbHNvLCB0aGUgUENSRSAiY2FsbG91dCIgZmVhdHVyZSBhbGxvd3MgIGFuICBleHRlcm5hbCAgZnVuY3Rpb24gIHRvICBiZQorICAgICAgIGNhbGxlZCBkdXJpbmcgcGF0dGVybiBtYXRjaGluZy4KKworICAgICAgIDguICBUaGVyZSAgYXJlIHNvbWUgZGlmZmVyZW5jZXMgdGhhdCBhcmUgY29uY2VybmVkIHdpdGggdGhlIHNldHRpbmdzIG9mCisgICAgICAgY2FwdHVyZWQgc3RyaW5ncyB3aGVuIHBhcnQgb2YgIGEgIHBhdHRlcm4gIGlzICByZXBlYXRlZC4gIEZvciAgZXhhbXBsZSwKKyAgICAgICBtYXRjaGluZyAgImFiYSIgIGFnYWluc3QgIHRoZSAgcGF0dGVybiAgL14oYShiKT8pKyQvICBpbiBQZXJsIGxlYXZlcyAkMgorICAgICAgIHVuc2V0LCBidXQgaW4gUENSRSBpdCBpcyBzZXQgdG8gImIiLgorCisgICAgICAgOS4gUENSRSAgcHJvdmlkZXMgIHNvbWUgIGV4dGVuc2lvbnMgIHRvICB0aGUgIFBlcmwgIHJlZ3VsYXIgIGV4cHJlc3Npb24KKyAgICAgICBmYWNpbGl0aWVzOgorCisgICAgICAgKGEpICBBbHRob3VnaCAgbG9va2JlaGluZCAgYXNzZXJ0aW9ucyAgbXVzdCBtYXRjaCBmaXhlZCBsZW5ndGggc3RyaW5ncywKKyAgICAgICBlYWNoIGFsdGVybmF0aXZlIGJyYW5jaCBvZiBhIGxvb2tiZWhpbmQgYXNzZXJ0aW9uIGNhbiBtYXRjaCBhIGRpZmZlcmVudAorICAgICAgIGxlbmd0aCBvZiBzdHJpbmcuIFBlcmwgcmVxdWlyZXMgdGhlbSBhbGwgdG8gaGF2ZSB0aGUgc2FtZSBsZW5ndGguCisKKyAgICAgICAoYikgIElmIFBDUkVfRE9MTEFSX0VORE9OTFkgaXMgc2V0IGFuZCBQQ1JFX01VTFRJTElORSBpcyBub3Qgc2V0LCB0aGUgJAorICAgICAgIG1ldGEtY2hhcmFjdGVyIG1hdGNoZXMgb25seSBhdCB0aGUgdmVyeSBlbmQgb2YgdGhlIHN0cmluZy4KKworICAgICAgIChjKSBJZiBQQ1JFX0VYVFJBIGlzIHNldCwgYSBiYWNrc2xhc2ggZm9sbG93ZWQgYnkgYSBsZXR0ZXIgd2l0aCBubyBzcGUtCisgICAgICAgY2lhbCBtZWFuaW5nIGlzIGZhdWx0ZWQuCisKKyAgICAgICAoZCkgIElmICBQQ1JFX1VOR1JFRURZIGlzIHNldCwgdGhlIGdyZWVkaW5lc3Mgb2YgdGhlIHJlcGV0aXRpb24gcXVhbnRpLQorICAgICAgIGZpZXJzIGlzIGludmVydGVkLCB0aGF0IGlzLCBieSBkZWZhdWx0IHRoZXkgYXJlIG5vdCBncmVlZHksIGJ1dCBpZiBmb2wtCisgICAgICAgbG93ZWQgYnkgYSBxdWVzdGlvbiBtYXJrIHRoZXkgYXJlLgorCisgICAgICAgKGUpICBQQ1JFX0FOQ0hPUkVEICBjYW4gIGJlIHVzZWQgdG8gZm9yY2UgYSBwYXR0ZXJuIHRvIGJlIHRyaWVkIG9ubHkgYXQKKyAgICAgICB0aGUgZmlyc3QgbWF0Y2hpbmcgcG9zaXRpb24gaW4gdGhlIHN1YmplY3Qgc3RyaW5nLgorCisgICAgICAgKGYpIFRoZSBQQ1JFX05PVEJPTCwgUENSRV9OT1RFT0wsIFBDUkVfTk9URU1QVFksIGFuZCAgUENSRV9OT19BVVRPX0NBUC0KKyAgICAgICBUVVJFIG9wdGlvbnMgZm9yIHBjcmVfZXhlYygpIGhhdmUgbm8gUGVybCBlcXVpdmFsZW50cy4KKworICAgICAgIChnKSAgVGhlICg/UiksICg/bnVtYmVyKSwgYW5kICg/UD5uYW1lKSBjb25zdHJ1Y3RzIGFsbG93cyBmb3IgcmVjdXJzaXZlCisgICAgICAgcGF0dGVybiBtYXRjaGluZyAoUGVybCBjYW4gZG8gIHRoaXMgIHVzaW5nICB0aGUgICg/cHtjb2RlfSkgIGNvbnN0cnVjdCwKKyAgICAgICB3aGljaCBQQ1JFIGNhbm5vdCBzdXBwb3J0LikKKworICAgICAgIChoKSAgUENSRSBzdXBwb3J0cyBuYW1lZCBjYXB0dXJpbmcgc3Vic3RyaW5ncywgdXNpbmcgdGhlIFB5dGhvbiBzeW50YXguCisKKyAgICAgICAoaSkgUENSRSBzdXBwb3J0cyB0aGUgcG9zc2Vzc2l2ZSBxdWFudGlmaWVyICAiKysiICBzeW50YXgsICB0YWtlbiAgZnJvbQorICAgICAgIFN1bidzIEphdmEgcGFja2FnZS4KKworICAgICAgIChqKSBUaGUgKFIpIGNvbmRpdGlvbiwgZm9yIHRlc3RpbmcgcmVjdXJzaW9uLCBpcyBhIFBDUkUgZXh0ZW5zaW9uLgorCisgICAgICAgKGspIFRoZSBjYWxsb3V0IGZhY2lsaXR5IGlzIFBDUkUtc3BlY2lmaWMuCisKKworCitOT1RFUworICAgICAgICBUaGUgXDwgYW5kIFw+IG1ldGFjaGFyYWN0ZXJzIGZyb20gSGVucnkgU3BlbmNlcnMgcGFja2FnZQorICAgICAgICBhcmUgbm90IGF2YWlsYWJsZSBpbiBQQ1JFLCBidXQgY2FuIGJlIGVtdWxhdGUgd2l0aCBcYiwKKyAgICAgICAgYXMgcmVxdWlyZWQsIGFsc28gaW4gY29uanVuY3Rpb24gd2l0aCBcVyBvciBcdy4KKworICAgICAgICBJbiBMRE11ZCwgYmFja3RyYWNrcyBhcmUgbGltaXRlZCBieSB0aGUgRVZBTF9DT1NUIHJ1bnRpbWUKKyAgICAgICAgbGltaXQsIHRvIGF2b2lkIGZyZWV6aW5nIHRoZSBkcml2ZXIgd2l0aCBhIG1hdGNoCisgICAgICAgIGxpa2UgcmVnZXhwKCh7Ij1YWD09PT09PT09PT09PT09PT09PT0ifSksICJYKC4rKStYIikuCisKKyAgICAgICAgTERNdWQgZG9lc24ndCBzdXBwb3J0IFBDUkUgY2FsbG91dHMuCisKKworTElNSVRBVElPTlMKKyAgICAgICAgVGhlcmUgYXJlIHNvbWUgc2l6ZSBsaW1pdGF0aW9ucyBpbiBQQ1JFIGJ1dCBpdCBpcyBob3BlZCB0aGF0CisgICAgICAgIHRoZXkgd2lsbCBuZXZlciBpbiBwcmFjdGljZSBiZSByZWxldmFudC4gIFRoZSBtYXhpbXVtIGxlbmd0aAorICAgICAgICBvZiBhIGNvbXBpbGVkIHBhdHRlcm4gaXMgNjU1MzkgKHNpYykgYnl0ZXMuICBBbGwgIHZhbHVlcyAgaW4KKyAgICAgICAgcmVwZWF0aW5nICBxdWFudGlmaWVycyAgbXVzdCBiZSBsZXNzIHRoYW4gNjU1MzYuICBUaGVyZSBtYXgtCisgICAgICAgIGltdW0gbnVtYmVyIG9mIGNhcHR1cmluZyBzdWJwYXR0ZXJucyBpcyA2NTUzNS4gIFRoZXJlIGlzICBubworICAgICAgICBsaW1pdCAgdG8gIHRoZSAgbnVtYmVyIG9mIG5vbi1jYXB0dXJpbmcgc3VicGF0dGVybnMsIGJ1dCB0aGUKKyAgICAgICAgbWF4aW11bSBkZXB0aCBvZiBuZXN0aW5nIG9mIGFsbCBraW5kcyBvZiBwYXJlbnRoZXNpemVkICBzdWItCisgICAgICAgIHBhdHRlcm4sICBpbmNsdWRpbmcgIGNhcHR1cmluZyAgc3VicGF0dGVybnMsIGFzc2VydGlvbnMsIGFuZAorICAgICAgICBvdGhlciB0eXBlcyBvZiBzdWJwYXR0ZXJuLCBpcyAyMDAuCisKKyAgICAgICAgVGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgc3ViamVjdCBzdHJpbmcgaXMgdGhlIGxhcmdlc3QgIHBvc2ktCisgICAgICAgIHRpdmUgbnVtYmVyIHRoYXQgYW4gaW50ZWdlciB2YXJpYWJsZSBjYW4gaG9sZC4gSG93ZXZlciwgUENSRQorICAgICAgICB1c2VzIHJlY3Vyc2lvbiB0byBoYW5kbGUgc3VicGF0dGVybnMgYW5kIGluZGVmaW5pdGUgIHJlcGV0aS0KKyAgICAgICAgdGlvbi4gIFRoaXMgIG1lYW5zICB0aGF0IHRoZSBhdmFpbGFibGUgc3RhY2sgc3BhY2UgbWF5IGxpbWl0CisgICAgICAgIHRoZSBzaXplIG9mIGEgc3ViamVjdCBzdHJpbmcgdGhhdCBjYW4gYmUgcHJvY2Vzc2VkICBieSAgY2VyLQorICAgICAgICB0YWluIHBhdHRlcm5zLgorCisKK0FVVEhPUgorICAgICAgICBQaGlsaXAgSGF6ZWwgPHBoMTBAY2FtLmFjLnVrPgorICAgICAgICBVbml2ZXJzaXR5IENvbXB1dGluZyBTZXJ2aWNlLAorICAgICAgICBOZXcgTXVzZXVtcyBTaXRlLAorICAgICAgICBDYW1icmlkZ2UgQ0IyIDNRRywgRW5nbGFuZC4KKyAgICAgICAgUGhvbmU6ICs0NCAxMjIzIDMzNDcxNAorCitTRUUgQUxTTworICAgICAgICByZWdleHAoQyksIGhzcmVnZXhwKEMpCmRpZmYgLS1naXQgYS9kb2MvY29uY2VwdHMvcGdzcWwgYi9kb2MvY29uY2VwdHMvcGdzcWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJmMmNjNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9jb25jZXB0cy9wZ3NxbApAQCAtMCwwICsxLDg4IEBACitDT05DRVBUCisgICAgICAgIHBnc3FsIC0gUG9zdGdyZVNRTCBzdXBwb3J0CisKK0RFU0NSSVBUSU9OCisgICAgICAgIE9uIGhvc3RzIHdpdGggdGhlIFBvc3RncmVTUUwgcGFja2FnZSBpbnN0YWxsZWQsIHRoZSBkcml2ZXIgY2FuIGJlCisgICAgICAgIGNvbmZpZ3VyZWQgdG8gaW50ZXJmYWNlIHdpdGggdGhlIFBvc3RncmVTUUwgZGF0YWJhc2UuIElmIHRoYXQgaXMgZG9uZSwKKyAgICAgICAgdGhlIGRyaXZlciBkZWZpbmVzIHRoZSBtYWNybyBfX1BHU1FMX18gZm9yIExQQyBwcm9ncmFtcyBhbmQKKyAgICAgICAgYWN0aXZhdGVzIGEgbnVtYmVyIG9mIHJlbGF0ZWQgZWZ1bnMuCisKKyAgICAgICAgLS0gVXNhZ2UgLS0KKworICAgICAgICBUaGUgaW50ZXJmYWNlIHRvIHRoZSBQb3N0Z3JlU1FMIGRhdGFiYXNlIGlzIGltcGxlbWVudGVkCisgICAgICAgIHRocm91Z2ggdGhlIGNvbmNlcHQgb2YgYSBjb250cm9sbGluZyBvYmplY3Q6IHdoZW4gb3BlbmluZyBhCisgICAgICAgIGRhdGFiYXNlIGNvbm5lY3Rpb24sIHRoZSBMUEMgY29kZSBoYXMgdG8gcHJvdmlkZSBhIGNhbGxiYWNrCisgICAgICAgIGZ1bmN0aW9uLiBUaGUgb2JqZWN0IHRoaXMgZnVuY3Rpb24gaXMgYm91bmQgdG8gaXMgdGhlCisgICAgICAgIGNvbnRyb2xsaW5nIG9iamVjdDogYWxsIHF1ZXJpZXMgdG8gdGhlIGRhdGFiYXNlIHdpbGwgYmUgaXNzdWVkCisgICAgICAgIGJ5IHRoaXMgb2JqZWN0LCBhbmQgdGhlIHJlc3BvbnNlcyB3aWxsIGJlIHNlbnQgdG8gdGhlIGNhbGxiYWNrCisgICAgICAgIGZ1bmN0aW9uLgorCisgICAgICAgIFRoZSBpbnRlcmZhY2UgaXMgYWxzbyBhc3luY2hyb25vdXM6IHRoZSBwZ19xdWVyeSgpIGVmdW4ganVzdAorICAgICAgICBxdWV1ZXMgdGhlIHF1ZXJ5IHdpdGggdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24sIGFuZCByZXR1cm5zCisgICAgICAgIGltbWVkaWF0ZWx5LiBXaGVuIHRoZSBkYXRhYmFzZSBoYXMgZmluaXNoZWQgd29ya2luZyB0aGUgcXVlcnksCisgICAgICAgIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCB0aGUgcmVzdWx0cy4KKworICAgICAgICBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gY2FuIGJlIGRlZmluZWQgYnkgbmFtZSBvciBieSBjbG9zdXJlLAorICAgICAgICBhbmQgY2FuIGJlIGRlZmluZWQgd2l0aCBleHRyYSBwYXJhbWV0ZXJzOgorCisKKyAgICAgICAgICAjaW5jbHVkZSA8cGdzcWwuaD4KKworICAgICAgICAgIHZvaWQgPGNhbGxiYWNrPihpbnQgdHlwZSwgbWl4ZWQgcmV0LCBpbnQgaWQgWywgbWl4ZWQgZXh0cmEuLi5dKQorCisgICAgICAgICAgICA8dHlwZT4gaXMgdGhlIHR5cGUgb2YgdGhlIGNhbGwsIDxpZD4gaWRlbnRpZmllcyB0aGUgcXVlcnkKKyAgICAgICAgICAgIGZvciB3aGljaCB0aGlzIGNhbGwgaXMgZXhlY3V0ZWQ6CisKKyAgICAgICAgICAgICAgUEdSRVNfVFVQTEVTX09LOiA8cmV0PiBpcyB0aGUgcmVzdWx0IGZyb20gYSBxdWVyeS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCBpcyBlaXRoZXIgYSBtYXBwaW5nIChmaWVsZCBuYW1lIGFzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LCBpbmRleGluZyA8bj4gdmFsdWVzIGZvciBuIHJldHVybmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVwbGVzKSwgb3IgYW4gYXJyYXkgb2YgYXJyYXlzIChvbmUgcGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KS4KKworICAgICAgICAgICAgICBQR1JFU19DT01NQU5EX09LOiA8cmV0PiBpcyBhIHN0cmluZyB3aGljaCBjb250YWlucyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyIHJlc3BvbnNlIChlLmcuIG9uIElOU0VSVCBvciBERUxFVEUpIAorCisgICAgICAgICAgICAgIFBHUkVTX0JBRF9SRVNQT05TRSwKKyAgICAgICAgICAgICAgUEdSRVNfTk9ORkFUQUxfRVJST1IsCisgICAgICAgICAgICAgIFBHUkVTX0ZBVEFMX0VSUk9SOiByZXQgaXMgdGhlIGVycm9yLXN0cmluZworCisKKyAgICAgICAgICB2b2lkIDxjYWxsYmFjaz4oaW50IHR5cGUsIG1peGVkIHJldCBbLCBtaXhlZCBleHRyYS4uLl0pCisKKyAgICAgICAgICAgIDx0eXBlPiBpcyB0aGUgdHlwZSBvZiB0aGUgY2FsbCwgd2hpY2ggaXMgbm90IHJlbGF0ZWQgYQorICAgICAgICAgICAgc3BlY2lmaWMgcXVlcnk6CisKKyAgICAgICAgICAgICAgUEdDT05OX1NVQ0NFU1M6IFRoZSBkYXRhYmFzZS1jb25uZWN0aW9uIHdhcyBlc3RhYmxpc2hlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXQ+IGlzIGEgZHVtbXkgc3RyaW5nLgorICAgICAgICAgICAgICBQR0NPTk5fRkFJTEVEOiAgVGhlIGRhdGFiYXNlLWNvbm5lY3Rpb24gZmFpbGVkLCA8cmV0PiBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2UuCisgICAgICAgICAgICAgICAgVGhlIGZpcnN0IG1lc3NhZ2UgdG8gdGhlIGNhbGxiYWNrIGFmdGVyIGEgY2FsbCB0bworICAgICAgICAgICAgICAgIHBnX2Nvbm5lY3QoKSBpcyBhbHdheXMgb25lIG9mIHRoZXNlIHR3by4KKworICAgICAgICAgICAgICBQR1JFU19OT1RJQ0U6IDxyZXQ+IGlzIGEgaW5mb3JtYXRpb25hbCB0ZXh0LgorCisgICAgICAgICAgICAgIFBHQ09OTl9BQk9SVEVEOiBJZiB0aGUgY29ubmVjdGlvbiB0byB0aGUgYmFja2VuZCBmYWlscworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2UgdHJ5IHRvIHJlLWVzdGFibGlzaCAocmVzZXQpIGl0LiBJZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0IGZhaWxzLCB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHZhbHVlIGlzIHJldHVybmVkLiBDb25zaWRlciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gZ29uZSBhbmQgZG9uJ3QgdHJ5IHRvIGNsb3NlIG9yIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlIG9wZXJhdGUgZnVydGhlciBvbiBpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXQ+IGlzIGEgZHVtbXkgc3RyaW5nLgorCisgICAgICAgIC0tIFNlY3VyaXR5IC0tCisKKyAgICAgICAgQWxsIFNRTCBlZnVucyAodW5sZXNzIGV4ZWN1dGUgYnkgdGhlIG1hc3RlciBvciB0aGUgc2ltdWwtZWZ1biBvYmplY3QpCisgICAgICAgIHRyaWdnZXIgYSBwcml2aWxlZ2VfdmlvbGF0aW9uICgicGdzcWwiLCAiPGVmdW5fbmFtZT4iKS4gSWYgYSBtb3JlCisgICAgICAgIGZpbmVncmFpbmVkIGNvbnRyb2wgaXMgZGVzaXJlZCwgb3ZlcmxvYWQgdGhlIGluZGl2aWR1YWwgZWZ1bnMgd2l0aCBhCisgICAgICAgIG5vbWFzayBzaW11bC1lZnVuLgorCitBVVRIT1IKKyAgICAgICAgRmxvcmlhbiBIZWlueiBhbmQgb3RoZXJzLgorCitISVNUT1JZCisgICAgICAgIEFkZGVkIGFzIHBhY2thZ2UgaW4gTERNdWQgMy4zLjQ0NS4KKyAgICAgICAgTERNdWQgMy4zLjY0MCBhZGRlZCBhIHByaXZpbGVnZV92aW9sYXRpb24oKSBjYWxsIGZvciBlYWNoIGVmdW4uCisKK1NFRSBBTFNPCisgICAgICAgIG15c3FsKEMpLCBwZ19jb25uZWN0KEUpLCBwZ19jb252X3N0cmluZyhFKSwgcGdfcXVlcnkoRSksIHBnX3BlbmRpbmcoRSksCisgICAgICAgIHBnX2Nsb3NlKEUpLCBwcml2aWxlZ2VfdmlvbGF0aW9uKE0pCmRpZmYgLS1naXQgYS9kb2MvY29uY2VwdHMvcHJvcGVydGllcyBiL2RvYy9jb25jZXB0cy9wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYjQxOGEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvY29uY2VwdHMvcHJvcGVydGllcwpAQCAtMCwwICsxLDEwOSBAQAorUHJvcGVydGllcworIEJFU0NIUkVJQlVORzoKKyAgICAgSW0gR2VnZW5zYXR6IHp1IFZhcmlhYmxlbiBpbm5lcmhhbGIgZWluZXMgT2JqZWt0ZXMsIGthbm4gbWFuIFByb3BlcnRpZXMKKyAgICAgdm9uIGF1c3NlbiB2ZXJhZW5kZXJuLCBvaG5lIGVpbmUgYmVzb25kZXJlIEZ1bmt0aW9uIGdlc2NocmllYmVuIHp1IGhhYmVuLgorCisgICAgIDEuIERhcyB6dWdydW5kZWxpZWdlbmRlIFByaW56aXAKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgRGFzIGdydW5kbGVnZW5kZSBLb256ZXB0IGRlciBNVURsaWIgaXN0LCBkYXNzIHdpY2h0aWdlLCBvYmpla3RiZXpvZ2VuZQorICAgICAgSW5mb3JtYXRpb25lbiBpbiBkZW4gc29nZW5hbm5udGVuIFByb3BlcnRpZXMgZ2VzcGVpY2hlcnQgd2VyZGVuIChlbmdsLgorICAgICAgcHJvcGVydHkgLS0gRWlnZW5zY2hhZnQsIEVpZ2VudHVtKS4KKworICAgICAgRGllc2UgSW5mb3JtYXRpb25lbiBrb2VubmVuIGVpbmZhY2hlIFdlcnRlLCB3aWUgei5CLiBaYWhsZW4sIFplaWNoZW4gb2RlcgorICAgICAgT2JqZWt0ZSwgYWJlciBhdWNoIGtvbXBsaXppZXJ0ZXJlIFN0cnVrdHVyZW4gc2Vpbi4KKyAgICAgIEplZGVzIE9iamVrdCBrYW5uIGJlbGllYmlnIHZpZWxlIHNvbGNoZXIgUHJvcGVydGllcyBiZXNpdHplbiB1bmQgZGVyZW4KKyAgICAgIE5hbWVuc2dlYnVuZyBpc3QgbmljaHQgbnVyIGF1ZiBkaWUgdm9uIGRlciBNVURsaWIgYmVyZWl0Z2VzdGVsbHRlbgorICAgICAgU3RhbmRhcmRwcm9wZXJ0aWVzIGJlZ3Jlbnp0LiBEYXMgaGVpc3N0LCBkYXMgZnVlciBlaWdlbmUgQW53ZW5kdW5nZW4gZGllCisgICAgICBNZW5nZSBkZXIgUHJvcGVydGllcyBmdWVyIGVpbiBPYmpla3QgYmVsaWViaWcgZXJ3ZWl0ZXJ0IHdlcmRlbiBrYW5uLgorICAgICAgRGFtaXQgc2luZCBhdWNoIHNjaG9uIGRpZSBiZWlkZW4gSGF1cHRtZXJrbWFsZSBlaW5lciBQcm9wZXJ0eSBhbmdlLQorICAgICAgc3Byb2NoZW46CisKKwlhKSBlaW4gTmFtZSBvZGVyIEtlbm51bmcgdW5kCisJYikgZWluIFdlcnQsIGRlciBkdXJjaCBkZW4gTmFtZW4gcmVwcmFlc2VudGllcnQgd2lyZC4KKworICAgICAgRGFzIHJlaW5lIFZlcndhbHRlbiBlaW5lciBQcm9wZXJ0eSBtaXQgTmFtZW4gdW5kIFdlcnQgaXN0IGFiZXIgbmljaHQgc2VocgorICAgICAgc2lubnZvbGwgdW5kIHNvIGdlaG9lcmVuIHp1IGplZGVyIFByb3BlcnR5IG5vY2ggendlaSB3ZWl0ZXJlIHdpY2h0aWdlCisgICAgICBEaW5nZS4gWnUgamVkZXIgUHJvcGVydHkgd3VyZGVuIGpld2VpbHMgendlaSBPcGVyYXRpb25lbiBlaW5nZWZ1ZWhydCwKKyAgICAgIHdlbGNoZSBkZW4gdWViZXJnZWJlbmVuIFdlcnQgdm9yIGRlciBTcGVpY2hlcnVuZyBvZGVyIEFiZnJhZ2UgYmVhcmJlaXRlbi4KKworICAgICAgWnVzYW1tZW5mYXNzZW5kIGxhZXNzdCBzaWNoIGRhcyBLb256ZXB0IGRlciBQcm9wZXJ0eSBpbiBmb2xnZW5kZW0gU2NoZW1hCisgICAgICBkYXJzdGVsbGVuOgorCisgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgIHwgUHJvcGVydHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgICAgICAgICB8IHByaXZhdGVyIERhdGVuYmVyZWljaCAoUHJvcGVydHkgV2VydGUpICAgIHwKKyAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgICAgICAgICAgfCBEaXJla3R6dWdyaWZmIGF1ZiBkZW4gRGF0ZW5iZXJlaWNoICAgICAgICB8CisgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgICAgIHwKKyAgICAgICAgICAgICAgIHwgICAgIF4gICAgICAgTWV0aG9kZW4gICAgICAgdiAgICAgICAgfCBeIHYgfAorICAgICAgICAgICAgICAgfCAgIFNldHplbiAgICAgICB8ICAgICAgICBBYmZyYWdlbiAgICB8ICAgICB8CisgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLSsKKyAgICAgICAgICAgICAgICAgICAgIF4gICAgICAgICAgICAgICAgICAgICAgfAorCSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFYKKyAgICAgICAgICAgICAgICAgIFNldFByb3AoKSAgICAgICAgICAgICBRdWVyeVByb3AoKQorCisgICAgICBBdXMgZGVtIFNjaGVtYSBsYWVzc3Qgc2ljaCBGb2xnZW5kZXMgZXJrZW5uZW46CisgICAgICAtIGJlaW0gU2V0emVuIHVuZCBBYmZyYWdlbiB3aXJkIGRlciBXZXJ0IGVpbmVyIE1ldGhvZGUgdWViZXJnZWJlbiwgZGllCisJZGVuIFdlcnQgenVydWVja2dpYnQgb2RlciBnZ2YuIGRpZSBBZW5kZXJ1bmdlbiB2b3JuaW1tdAorICAgICAgLSBlaW4gZGlyZWt0ZXIgWnVncmlmZiBhdWYgZGVuIFdlcnQgZGVyIGlzdCBlYmVuZmFsbHMgbW9lZ2xpY2gsIHNvbGx0ZQorCWFiZXIgbmljaHQgZGVyIE5vcm1hbGZhbGwgc2VpbiwgZGEgZGllIE1ldGhvZGVuIE5lYmVuZWZmZWt0ZSBlcnpldWdlbgorICAgICAgICAtIGluIGJlc3RpbW10ZW4gRmFlbGxlbiBrYW5uIG1hbiBkZW4gYWV1c3NlcmxpY2ggYWVuZGVybmRlbiBadWdyaWZmCisJICB2b2xsa29tbWVuIHVudGVyYmluZGVuIChOT1NFVE1FVEhPRCwgUFJPVEVDVCkKKwkgIChWT1JTSUNIVCBiZWkgbWFwcGluZ3MvYXJyYXlzLCBkaWVzZSB3ZXJkZW4gYmVpIFF1ZXJ5UHJvcCgpCisJICAgYWxzIFJlZmVyZW56IHp1cnVlY2tnZWdlYmVuLCBzaW5kIGFsc28gc28gYWVuZGVyYmFyKQorCisgICAgIDIuIEltcGxlbWVudGF0aW9uCisgICAgID09PT09PT09PT09PT09PT09CisKKyAgICAgIERpZSBLbGFzc2UgL3N0ZC90aGluZy9wcm9wZXJ0aWVzLmMgc3RlbGx0IGZvbGdlbmRlIEZ1bmt0aW9uZW4gZnVlciBkaWUKKyAgICAgIEJlaGFuZGx1bmcgdm9uIFByb3BlcnRpZXMgYmVyZWl0OgorCisgICAgICBOb3JtYWxlciBadWdyaWZmOgltaXhlZCBTZXRQcm9wKDxuYW1lPiwgPHdlcnQ+KQorCQkJLSBzZXR6dCBkZW4gV2VydCB2b24gPG5hbWU+IGF1ZiA8d2VydD4KKwkJCW1peGVkIFF1ZXJ5UHJvcCg8bmFtZT4pCisJCQktIGdpYnQgZGVuIFdlcnQgdm9uIDxuYW1lPiB6dXJ1ZWNrCisgCisgICAgICBEaXJla3RlciBadWdyaWZmOgltaXhlZCBTZXQoPG5hbWU+LCA8d2VydD4sIDxpbnRlcnByZXRhdGlvbj4pCisJCQktIHNldHp0IGZ1ZXIgPG5hbWU+IGVpbmVuIDx3ZXJ0PjoKKwkJCSAgLSBkZW4gbm9ybWFsZW4gV2VydAorCQkJICAgIDxpbnRlcnByZXRhdGlvbj46IEZfVkFMVUUgKD09MCkKKwkJCSAgLSBlaW5lIE1ldGhvZGUKKwkJCSAgICA8d2VydD46IGNsb3N1cmUKKwkJCSAgICA8aW50ZXJwcmV0YXRpb24+OiBGX1NFVF9NRVRIT0QsIEZfUVVFUllfTUVUSE9ECisJCQkgIC0gZWluIEZsYWcKKwkJCSAgICA8d2VydD46IFNBVkUsIFNFQ1VSRUQsIFBST1RFQ1RFRCwgTk9TRVRNRVRIT0QKKwkJCSAgICA8aW50ZXJwcmV0YXRpb24+OiBGX01PREUsIEZfTU9ERV9BUywgRl9NT0RFX0FECisJCQltaXhlZCBRdWVyeSg8bmFtZT4sIDxpbnRlcnByZXRhdGlvbj4pCisJCQktIGZyYWd0IGZ1ZXIgPG5hbWU+IGVpbmVuIDx3ZXJ0PiBhYgorCQkJICAtIEZfU0VUX01FVEhPRCwgRl9RVUVSWV9NRVRIT0Q6IGRpZSBDbG9zdXJlLzAKKwkJCSAgLSBGX01PREU6IGRhcyAodmVyb2RlcnRlISkgRmxhZworICAgICAgR2xvYmFsOgkJdm9pZCBTZXRQcm9wZXJ0aWVzKDxtYXBwaW5nPikKKwkJCS0gc2V0enQgZGFzIE1hcHBpbmcga29tcGxldHQsIGJlYWNodGV0ID49IFBST1RFQ1RFRAorCQkJbWFwcGluZyBRdWVyeVByb3BlcnRpZXMoKQorCQkJLSBmcmFndGUgZGFzIGtvbXBsZXR0ZSBNYXBwaW5nIGFscyBLb3BpZSBhYgorCisgICAgIDMuIEJlc29uZGVyaGVpdGVuL0VpbmdlYmF1dGUgUHJvcGVydGllczoKKworICAgICAgRXhpc3RpZXJ0IHp1IGVpbmVyIFByb3BlcnR5IGVpbmUgRnVua3Rpb24gbWl0IGRlbSBzZWxiZW4gTmFtZW4gdW5kIGVpbmVtCisgICAgICAiX3NldF8iIGJ6dyAiX3F1ZXJ5XyIgZGF2b3IsIHNvIHdpcmQgbmljaHQgYXVmIGRpZSBkYXMgUHJvcGVydHktTWFwcGluZworICAgICAgenVnZWdyaWZmZW4sIHNvbmRlcm4gZXMgd2VyZGVuIGRpZSBBcmd1bWVudGUgYW4gZGllc2UgRnVua3Rpb24gdWViZXJnZWJlbgorICAgICAgdW5kIGRlciBSdWVja2dhYmV3ZXJ0IGRpZXNlciBGdW5rdGlvbiB6dXJ1ZWNrZ2VnZWJlbi4KKyAgICAgIFZvcnRlaWw6CisgICAgICAtIHNvIGthbm4gbWFuIERhdGVuLCBkaWUgc2NobmVsbCB2ZXJmdWVnYmFyIHNlaW4gbXVlc3NlbiwJKGJlaSBkZW5lbgorICAgICAgICBhbHNvIEVmZml6aWVueiBnZWdlbiBTZXRQcm9wL1F1ZXJ5UHJvcCBzcHJpY2h0KSB0cm90emRlbSBuYWNoIGF1c3NlbgorCWVpbmhlaXRsaWNoIHp1Z3JlaWZiYXIgbWFjaGVuCisgICAgICBOYWNodGVpbDoKKyAgICAgIC0gbmljaHQgd2lya2xpY2ggc2F1YmVyCisgICAgICAtIFNwZWljaGVybiBtdXNzIG1hbiBzZWxic3Qgdm9ybmVobWVuCisgICAgICAtIFNldC9RdWVyeSBnZWhlbiB3aWUgYXVjaCBiZWkgTWV0aG9kZW4gYW4gX3NldF8qL19xdWVyeV8qIHZvcmJlaQorICAgICAgLSBkaWVzZXMgVmVyaGFsdGVuIHNvbGx0ZSBkZXIgTXVkbGliIHZvcmJlaGFsdGVuIGJsZWliZW4sIGZ1ZXIgZWlnZW5lCisgICAgICAgIFBydWVmZnVua3Rpb25lbiAod2lyZCBldHdhcyBnZXNldHp0L2FiZ2VmcmFndCkgYnp3LiBBZW5kZXJ1bmdlbgorCXNvbGx0ZSBtYW4gTWV0aG9kZW4gKEZfU0VUX01FVEhPRC9GX1FVRVJZX01FVEhPRCkgYmVudXR6ZW4KKworIFNJRUhFIEFVQ0g6CisgICAgIFNldFByb3AoTCksIFF1ZXJ5UHJvcChMKSwgU2V0KEwpLCBRdWVyeShMKSwgU2V0UHJvcGVydGllcyhMKSwKKyAgICAgUXVlcnlQcm9wZXJ0aWVzKEwpCisgICAgIG9iamVrdGUsIGVmZml6aWVueiwgY2xvc3VyZXMKKworIDIxLiBNYWVyeiAyMDA0IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvY29uY2VwdHMvcmVnZXhwIGIvZG9jL2NvbmNlcHRzL3JlZ2V4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTlkNzBlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2NvbmNlcHRzL3JlZ2V4cApAQCAtMCwwICsxLDEyMSBAQAorU1lOT1BTSVMKKyAgICAgICAgUmVndWxhciBFeHByZXNzaW9ucworCisKK0RFU0NSSVBUSU9OCisgICAgICAgIExETXVkIHN1cHBvcnRzIGJvdGggdGhlIHRyYWRpdGlvbmFsIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYXMKKyAgICAgICAgaW1wbGVtZW50ZWQgYnkgSGVucnkgU3BlbmNlciAoIkhTIiBvciAidHJhZGl0aW9uYWwiKSwgYW5kIHRoZQorICAgICAgICBQZXJsLWNvbXBhdGlibGUgcmVndWxhciBleHByZXNzaW9ucyBieSBQaGlsaXAgSGF6ZWwgKCJQQ1JFIikuCisgICAgICAgIEJvdGggcGFja2FnZXMgY2FuIGJlIHVzZWQgY29uY3VycmVudGx5LCB3aXRoIHRoZSBzZWxlY3Rpb24KKyAgICAgICAgYmVpbmcgbWFkZSB0aHJvdWdoIGV4dHJhIG9wdGlvbiBmbGFncyBhcmd1bWVudCB0byB0aGUgZWZ1bnMuCisgICAgICAgIE9uZSBvZiB0aGUgdHdvIHBhY2thZ2VzIGNhbiBiZSBzZWxlY3RlZCBhdCBjb21waWxlIHRpbWUsIGJ5CisgICAgICAgIGNvbW1hbmRsaW5lIGFyZ3VtZW50LCBhbmQgYnkgZHJpdmVyIGhvb2sgdG8gYmUgdGhlIGRlZmF1bHQKKyAgICAgICAgcGFja2FnZS4KKworICAgICAgICBUaGUgcGFja2FnZXMgZGlmZmVyIGluIHRoZSBleHByZXNzaXZpdHkgb2YgdGhlaXIgZXhwcmVzc2lvbnMKKyAgICAgICAgKFBDUkUgb2ZmZXJpbmcgbW9yZSBvcHRpb25zIHRoYXQgSGVucnkgU3BlbmNlcidzIHBhY2thZ2UpLAorICAgICAgICB0aG91Z2ggdGhleSBib3RoIGltcGxlbWVudCB0aGUgY29tbW9uIHN1YnNldCBvdXRsaW5lZCBiZWxvdy4KKworICAgICAgICBBbGwgcmVndWxhciBleHByZXNzaW9uIGVmdW5zIHRha2UgYW4gYWRkaXRpb25hbCBvcHRpb25zCisgICAgICAgIHBhcmFtZXRlciwgd2hpY2ggaXMgYSBhbiBudW1iZXIgY29tcG9zZWQgb2YgYml0ZmxhZ3MsIGFuZCBpcworICAgICAgICB1c2VkIHRvIG1vZGlmeSB0aGUgZXhhY3QgYmVoYXZpb3VyIG9mIHRoZSBleHByZXNzaW9uCisgICAgICAgIGV2YWx1YXRpb24uIEluIGFkZGl0aW9uLCBjZXJ0YWluIGVmdW5zIG1heSBhY2NlcHQgYWRkaXRpb25hbAorICAgICAgICBzcGVjaWZpYyBvcHRpb25zLgorCisgICAgICAgIEZvciBkZXRhaWxzLCByZWZlciB0byB0aGUgZGV0YWlsZWQgbWFucGFnZXM6IGhzcmVnZXhwKEMpIGZvcgorICAgICAgICB0aGUgSGVucnkgU3BlbmNlciBwYWNrYWdlLCBwY3JlKEMpIGZvciB0aGUgUENSRSBwYWNrYWdlLgorCisKK1JFR1VMQVIgRVhQUkVTU0lPTiBERVRBSUxTCisgICAgICAgIEEgcmVndWxhciBleHByZXNzaW9uIGlzIGEgcGF0dGVybiB0aGF0IGlzIG1hdGNoZWQgYWdhaW5zdCAgYQorICAgICAgICBzdWJqZWN0IHN0cmluZyBmcm9tIGxlZnQgdG8gcmlnaHQuIE1vc3QgY2hhcmFjdGVycyBzdGFuZCBmb3IKKyAgICAgICAgdGhlbXNlbHZlcyBpbiBhIHBhdHRlcm4sIGFuZCBtYXRjaCB0aGUgY29ycmVzcG9uZGluZyBjaGFyYWMtCisgICAgICAgIHRlcnMgaW4gdGhlIHN1YmplY3QuIEFzIGEgdHJpdmlhbCBleGFtcGxlLCB0aGUgcGF0dGVybgorCisgICAgICAgICAgVGhlIHF1aWNrIGJyb3duIGZveAorCisgICAgICAgIG1hdGNoZXMgYSBwb3J0aW9uIG9mIGEgc3ViamVjdCBzdHJpbmcgdGhhdCBpcyAgaWRlbnRpY2FsICB0bworICAgICAgICBpdHNlbGYuICBUaGUgIHBvd2VyICBvZiAgcmVndWxhciAgZXhwcmVzc2lvbnMgY29tZXMgZnJvbSB0aGUKKyAgICAgICAgYWJpbGl0eSB0byBpbmNsdWRlIGFsdGVybmF0aXZlcyBhbmQgcmVwZXRpdGlvbnMgaW4gdGhlICBwYXQtCisgICAgICAgIHRlcm4uICBUaGVzZSAgYXJlIGVuY29kZWQgaW4gdGhlIHBhdHRlcm4gYnkgdGhlIHVzZSBvZiBtZXRhLQorICAgICAgICBjaGFyYWN0ZXJzLCB3aGljaCBkbyBub3Qgc3RhbmQgZm9yICB0aGVtc2VsdmVzICBidXQgIGluc3RlYWQKKyAgICAgICAgYXJlIGludGVycHJldGVkIGluIHNvbWUgc3BlY2lhbCB3YXkuCisKKyAgICAgICAgVGhlIGZvbGxvd2luZyBtZXRhY2hhcmFjdGVycyBhcmUgJ3VuaXZlcnNhbCcgaW4gdGhhdCBib3RoIHJlZ2V4cAorICAgICAgICBwYWNrYWdlcyB1bmRlcnN0YW5kIHRoZW0gaW4gdGhlIHNhbWUgd2F5OgorCisgICAgICAgICAgLiAgICAgICBNYXRjaCBhbnkgY2hhcmFjdGVyLgorCisgICAgICAgICAgXiAgICAgICBNYXRjaCBiZWdpbiBvZiBsaW5lLgorCisgICAgICAgICAgJCAgICAgICBNYXRjaCBlbmQgb2YgbGluZS4KKworICAgICAgICAgIHh8eSAgICAgTWF0Y2ggcmVnZXhwIHggb3IgcmVnZXhwIHkuCisKKyAgICAgICAgICAoKSAgICAgIE1hdGNoIGVuY2xvc2VkIHJlZ2V4cCBsaWtlIGEgJ3NpbXBsZScgb25lLgorCisgICAgICAgICAgeCogICAgICBNYXRjaCBhbnkgbnVtYmVyICgwIG9yIG1vcmUpIG9mIHJlZ2V4cCB4LgorCisgICAgICAgICAgeCsgICAgICBNYXRjaCBhbnkgbnVtYmVyICgxIG9yIG1vcmUpIG9mIHJlZ2V4cCB4LgorCisgICAgICAgICAgWy4uXSAgICBNYXRjaCBvbmUgb2YgdGhlIGNoYXJhY3RlcnMgZW5jbG9zZWQuCisKKyAgICAgICAgICBbXiAuLl0gIE1hdGNoIG5vbmUgb2YgdGhlIGNoYXJhY3RlcnMgZW5jbG9zZWQuIFRoZSAuLiBhcmUgdG8KKyAgICAgICAgICAgICAgICAgIHJlcGxhY2VkIGJ5IHNpbmdsZSBjaGFyYWN0ZXJzIG9yIGNoYXJhY3RlciByYW5nZXM6CisKKyAgICAgICAgICBbYWJjXSAgIG1hdGNoZXMgYSwgYiBvciBjLgorCisgICAgICAgICAgW2FiMC05XSBtYXRjaGVzIGEsIGIgb3IgYW55IGRpZ2l0LgorCisgICAgICAgICAgW15hLXpdICBkb2VzIG5vdCBtYXRjaCBhbnkgbG93ZXJjYXNlIGNoYXJhY3Rlci4KKworICAgICAgICAgIFxCICAgICAgbm90IGEgd29yZCBib3VuZGFyeQorCisgICAgICAgICAgXGMgICAgICBtYXRjaCBjaGFyYWN0ZXIgYyBldmVuIGlmIGl0J3Mgb25lIG9mIHRoZSBzcGVjaWFsCisgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzLgorCisgICAgICAgIFRoZSBmb2xsb3dpbmcgbWV0YWNoYXJhY3RlcnMgb3IgbWV0YWNoYXJhY3RlciBjb21iaW5hdGlvbnMgaW1wbGVtZW50CisgICAgICAgIHNpbWlsYXIgZnVuY3Rpb25zIGluIHRoZSB0d28gcmVnZXhwIHBhY2thZ2VzOworCisgICAgICAgICAgXGIgICAgICBQQ1JFOiB3b3JkIGJvdW5kYXJ5LCBhbHNvIHVzZWQgaW5jb25qdW5jdGlvbiB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICBcdyAoYW55ICJ3b3JkIiBjaGFyYWN0ZXIpIGFuZCBcVyAoYW55ICJub24td29yZCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcikuCisKKyAgICAgICAgICBcPCAgICAgIEhTOiBNYXRjaCBiZWdpbiBvZiB3b3JkLgorICAgICAgICAgIFw+ICAgICAgSFM6IE1hdGNoIGVuZCBvZiB3b3JkLgorCisKK09QVElPTlMKKyAgICAgICAgVGhlIHBhY2thZ2UgaXMgc2VsZWN0ZWQgd2l0aCB0aGVzZSBvcHRpb24gZmxhZ3M6CisKKyAgICAgICAgICBSRV9QQ1JFCisgICAgICAgICAgUkVfVFJBRElUSU9OQUwKKworICAgICAgICBUaGVzZSBmbGFncyBhcmUgYWxzbyB1c2VkIGZvciB0aGUgSF9SRUdFWFBfUEFDS0FHRSBkcml2ZXIKKyAgICAgICAgaG9vay4KKworCisgICAgICAgIFRyYWRpdGlvbmFsIHJlZ3VsYXIgZXhwcmVzc2lvbnMgdW5kZXJzdGFuZCBvbmUgb3B0aW9uOgorCisgICAgICAgICAgUkVfRVhDT01QQVRJQkxFCisKKworICAgICAgICBQQ1JFIHVuZGVyc3RhbmRzIHRoZXNlIG9wdGlvbnM6CisKKyAgICAgICAgICBSRV9BTkNIT1JFRAorICAgICAgICAgIFJFX0NBU0VMRVNTCisgICAgICAgICAgUkVfRE9MTEFSX0VORE9OTFkKKyAgICAgICAgICBSRV9ET1RBTEwKKyAgICAgICAgICBSRV9FWFRFTkRFRAorICAgICAgICAgIFJFX01VTFRJTElORQorICAgICAgICAgIFJFX1VOR1JFRURZCisgICAgICAgICAgUkVfTk9UQk9MCisgICAgICAgICAgUkVfTk9URU9MCisgICAgICAgICAgUkVfTk9URU1QVFkKKworSElTVE9SWQorICAgICAgICBMRE11ZCAzLjMuNTk2IGltcGxlbWVudGVkIHRoZSBjb25jdXJyZW50IHVzZSBvZiBib3RoIHBhY2thZ2VzLgorCitTRUUgQUxTTworICAgICAgICBoc3JlZ2V4cChDKSwgcGNyZShDKSwgcmVnZXhwX3BhY2thZ2UoSCksIHJlZ2V4cChFKSwgcmVnZXhwbG9kZShFKSwKKyAgICAgICAgcmVnbWF0Y2goRSksIHJlZ3JlcGxhY2UoRSksIHJlZ2V4cF9wYWNrYWdlKEUpLCBpbnZvY2F0aW9uKEQpCmRpZmYgLS1naXQgYS9kb2MvY29uY2VwdHMvcnRmbSBiL2RvYy9jb25jZXB0cy9ydGZtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNTY2ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvY29uY2VwdHMvcnRmbQpAQCAtMCwwICsxLDMzIEBACitDT05DRVBUCisgICAgICAgIHJ0Zm0gLSByZWFkIHRoZSBmdWNraW5nIG1hbnVhbAorCitVUERBVEUKKyAgICAgICAgTWF0ZWVzZSwgMTUtSnVuLTkzLCAwMzoxNSBNRVQKKworU1lOT1BTSVMKKyAgICAgICAgcnRmbQorCisgICAgICAgIE9QVElPTlMgTm9uZSwgeW91IGhhdmUgdG8gcmVhZCB0aGUgbWFudWFsIGZvciBhbiBhbnN3ZXIuCisKK0RFU0NSSVBUSU9OCisgICAgICAgIFVzZWQgd2hlbiBsYXp5IHBlb3BsZSBhc2sgc3R1cGlkICBxdWVzdGlvbnMuICBOb3JtYWx5ICBjcmllZAorICAgICAgICBvdXQgaW4gdmFpbi4KKworRklMRVMKKyAgICAgICAgL2Rldi9udWxsCisKK0VOVklST05NRU5UCisgICAgICAgIEFueS4KKworQ1JFRElUUworICAgICAgICBCZXJ0IE5hc2UsIHdobyBlbHNlPworCitTRUUgQUxTTworICAgICAgICBtYW4oSCkKKworRElBR05PU1RJQ1MKKyAgICAgICAgSXMgYW4gZGlhZ25vc3RpYy4gU2luY2UgeW91IGFyZSByZWFkaW5nIHRoaXMgeW91IGFyZSBnZXR0aW5nCisgICAgICAgIHRoZSBpZGVhLgorCitCVUdTCisgICAgICAgIEhhIQpkaWZmIC0tZ2l0IGEvZG9jL2NvbmNlcHRzL3NlY3VyZSBiL2RvYy9jb25jZXB0cy9zZWN1cmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI5NGE1ZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9jb25jZXB0cy9zZWN1cmUKQEAgLTAsMCArMSw1MiBAQAorVEhFTUE6CisJc2VjdXJlLVZlcnplaWNobmlzc2UKKworRlVOS1RJT046CisJTWFnaWVyIGhhYmVuIGRpZSBNb2VnbGljaGtlaXQgaW4gaWhyZW4gR2lsZGVuIG9kZXIgUmVnaW9ucy0KKwl2ZXJ6ZWljaG5pc3NlbiAvc2VjdXJlIFZlcnplaWNobmlzc2UgYW56dWxlZ2VuLCBpbiBkZW5lbiBEYXRlbiBkYW5uCisJdm9yIExlc2V6dWdyaWZmZW4gYW5kZXJlciBNYWdpZXIgZ2VzY2h1ZXR6dCBzaW5kLiBMZXNlcmVjaHRlIGluIGRpZXNlbgorCVZlcnplaWNobmlzc2VuIGhhYmVuIGdydW5kc2FldHpsaWNoIG51ciBkaWVqZW5pZ2VuLCBkaWUgZG9ydCBhdWNoCisJU2NocmVpYnJlY2h0ZSBoYWJlbi4gRGllc2UgVmVyemVpY2huaXNzZSBzaW5kIGZ1ZXIgKFF1ZXN0LSlSYWV0c2VsIG9kZXIKKwlzY2h3aWVyaWdlIE5QQ3MgbWl0IHZpZWxlbiBTdHVmZW5wdW5rdGVuIGdlZGFjaHQuIERpZXNlIFZlcnplaWNobmlzc2UKKwlzaW5kIGF1c2RydWVja2xpY2ggX25pY2h0XyBkYXp1IGdlZGFjaHQsIGRvcnQgZ2FuemUgR2ViaWV0ZSBvZGVyIFF1ZXN0cworCWFienVsZWdlbiwgZGEgYmVpIFByb2JsZW1lbiBhbmRlcmUgTWFnaWVyIG51ciBub2NoIHNlaHIgc2Nod2VyIGhlbGZlbgorCWtvZW5uZW4uIEF1cyBkaWVzZW0gR3J1bmQgc2luZCBkaWUgUmVnaW9uc21hZ2llciBnZWhhbHRlbiBkYXJhdWYgenUKKwlhY2h0ZW4sIGRhc3MgZGllc2UgVmVyemVpY2huaXNzZSBudXIgbWl0IEJlZGFjaHQgdmVyd2VuZGV0IHdlcmRlbi4KKwlTb2xsdGUgZGFzIGdhbnplIGF1c2FydGVuIHVuZCB1ZWJlcnRyaWViZW4gd2VyZGVuLCBzbyB3aXJkIGRlciBTY2h1dHoKKwlkZXIgc2VjdXJlIFZlcnplaWNobmlzc2UgaW4gZGVuIGJldHJvZmZlbmVuIEdlYmlldGVuL1JlZ2lvbmVuIHdpZWRlcgorCWF1ZmdlaG9iZW4hCisKK0hJTldFSVM6CisJRXMgaXN0IF9uaWNodF8gbW9lZ2xpY2ggZ2FuemUgVmVyemVpY2huaXNiYWV1bWUgaW4gZWluIHNlY3VyZS8KKwlWZXJ6ZWljaG5pcyBhYnp1bGVnZW4uIEFuZGVycyBmb3JtdWxpZXJ0OgorICBVbnRlcnZlcnplaWNobmlzc2Ugdm9uIHNlY3VyZS8gZ2VuaWVzc2VuIF9rZWluZW5fIGJlc29uZGVyZW4gU2NodXR6LgorCitCRUlTUElFTDoKKworCW8gcmljaHRpZ2VyIEVpbnNhdHogaW4gZWluZW0gZmlrdGl2ZW4gc3RhbmRhcmQgaW5jbHVkZSBmaWxlLi4uCisKKwkgICNkZWZpbmUgSE9NRSh4KSAgICAiL2QvcmVnaW9uL21hZ2llcm5hbWUvbWVpbmdlYmlldC8iK3gKKwkgICNkZWZpbmUgTlBDKHgpICAgICBIT01FKCJucGMvIit4KQorICAgICAtPiAvZC9yZWdpb24vbWFnaWVybmFtZS9tZWluZ2ViaWV0L25wYy8KKwkgICNkZWZpbmUgT0JKKHgpICAgICBIT01FKCJvYmovIit4KQorICAgICAtPiAvZC9yZWdpb24vbWFnaWVybmFtZS9tZWluZ2ViaWV0L29iai8KKwkgICNkZWZpbmUgUk9PTSh4KSAgICBIT01FKCJyb29tLyIreCkKKyAgICAgLT4gL2QvcmVnaW9uL21hZ2llcm5hbWUvbWVpbmdlYmlldC9yb29tLworCSAgI2RlZmluZSBTRUNVUkUoeCkgIEhPTUUoInNlY3VyZS8iK3gpCisgICAgIC0+IC9kL3JlZ2lvbi9tYWdpZXJuYW1lL21laW5nZWJpZXQvc2VjdXJlLworCisKKwlvIGZhbHNjaGVyICh3aXJrdW5nc2xvc2VyKSBFaW5zYXR6IG1pdCBlaW5lbSBWZXJ6ZWljaG5pc2JhdW06CisKKwkgICNkZWZpbmUgSE9NRSh4KSAgICAiL2QvcmVnaW9uL21hZ2llcm5hbWUvbWVpbmdlYmlldC9zZWN1cmUvIit4CisJICAjZGVmaW5lIE5QQyh4KSAgICAgSE9NRSgibnBjLyIreCkKKyAgICAgLT4gL2QvcmVnaW9uL21hZ2llcm5hbWUvbWVpbmdlYmlldC9zZWN1cmUvbnBjLworCSAgI2RlZmluZSBPQkooeCkgICAgIEhPTUUoIm9iai8iK3gpCisgICAgIC0+IC9kL3JlZ2lvbi9tYWdpZXJuYW1lL21laW5nZWJpZXQvc2VjdXJlL29iai8KKwkgICNkZWZpbmUgUk9PTSh4KSAgICBIT01FKCJyb29tLyIreCkKKyAgICAgLT4gL2QvcmVnaW9uL21hZ2llcm5hbWUvbWVpbmdlYmlldC9zZWN1cmUvcm9vbS8KKworCitMRVRaVEUgQWVOREVSVU5HOgorICAwNC4wOS4yMDExIFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL2NvbmNlcHRzL3NpbXVsX2VmdW4gYi9kb2MvY29uY2VwdHMvc2ltdWxfZWZ1bgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzRhMmEwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2NvbmNlcHRzL3NpbXVsX2VmdW4KQEAgLTAsMCArMSwxNCBAQAorQ09OQ0VQVAorICAgICAgICBzaW11bF9lZnVuCisKK0RFU0NSSVBUSU9OCisgICAgICAgIFRoZSBzaW11bF9lZnVuIG9iamVjdCBpcyBhdXRvbWFnaWNhbGx5IHNvcnQtb2YgaW5oZXJpdGVkIGJ5CisgICAgICAgIGV2ZXJ5IG9iamVjdC4gVGhhdCBmdW5jdGlvbnMgdGhhdCBhcmUgZGVmaW5lZCBpbiBpdCBjYW4gYmUKKyAgICAgICAgYWNjZXNzZWQganVzdCBsaWtlIGVmdW5zIG9yIGluaGVyaXRlZCBmdW5jdGlvbnMgYnkgZXZlcnkKKyAgICAgICAgb2JqZWN0IChleGNlcHQgdGhlIG1hc3RlciBvYmplY3QpLiBUbyBnZXQgYWNjZXNzIHRvIGVmdW5zIHRoYXQKKyAgICAgICAgYXJlIG92ZXJsb2FkZWQgYnkgdGhlIHNpbXVsX2VmdW4gb2JqZWN0LCB5b3UgY2FuIHVzZSB0aGUKKyAgICAgICAgZWZ1bjo6ZnVuY3Rpb24oKSB0byBieXBhc3MgdGhlIHNpbXVsX2VmdW4gKHVubGVzcyB0aGUKKyAgICAgICAgc2ltdWxfZWZ1biBvYmplY3QgaGFzIGRlZmluZWQgdGhlIGZ1bmN0aW9uIGFzIGBgbm9tYXNrJycpLgorCitTRUUgQUxTTworICAgICAgICBnZXRfc2ltdWxfZWZ1bihNKSwgaW5oZXJpdGFuY2UoTFBDKSwgb3BlcmF0b3JzKExQQykKZGlmZiAtLWdpdCBhL2RvYy9jb25jZXB0cy90ZXJtaW5hbHMgYi9kb2MvY29uY2VwdHMvdGVybWluYWxzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZDMxNzEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvY29uY2VwdHMvdGVybWluYWxzCkBAIC0wLDAgKzEsMTggQEAKK3Rlcm1pbmFscworIEJFU0NIUkVJQlVORzoKKyAgICAgRWluIFNwaWVsZXIga2FubiBzZWluIFRlcm1pbmFsIG1pdCAic3R0eSIgaW4gdmVyc2NoaWVkZW5lIE1vZGkKKyAgICAgc2NoYWx0ZW4uIE1pdCBBTlNJLUVzY2FwZS1TZXF1ZW56ZW4ga2FubiBtYW4gZGVtZW50c3ByZWNoZW5kIGRhbm4KKyAgICAgZGllc2VtIFNwaWVsZXIgZmFyYmlnZSwgdW50ZXJzdHJpY2hlbmUsIGJsaW5rZW5kZSBUZXh0ZSBhdWYgZGVuCisgICAgIEJpbGRzY2hpcm0gemF1YmVybiwgd2VubiBkaWVzZXIgZXMgdW50ZXJzdHVldHp0LgorCisgICAgIERpZSBkZXJ6ZWl0IHVudGVyc3R1ZXR6dGVuIFRlcm1pbmFscyBzaW5kOgorCWR1bWI6ICAgYml0dGUga2VpbmUgRXNjYXBlc2VxdWVuemVuIG51dHplbiAuLi4KKwl2dDEwMDogIHZlcnN0ZWh0IHJldmVyc2UsIGJvbGQsIGJsaW5raW5nCisJYW5zaTogICB2ZXJzdGVodCB2dDEwMCB1bmQgRmFyYmVuCisKKyAgICAgRGllIG51dHpiYXJlbiBGYXJiY29kZXMgc2luZCB1bnRlciAvc3lzL2Fuc2kuaCBkZWZpbmllcnQuCisKKyBTSUVIRSBBVUNIOgorICAgICBQX1RUWSwgc3R0eQorCisgMjEuIE1hZXJ6IDIwMDQgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9jb25jZXB0cy90aWNrcyBiL2RvYy9jb25jZXB0cy90aWNrcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzBmMThmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2NvbmNlcHRzL3RpY2tzCkBAIC0wLDAgKzEsNjYgQEAKKyogV2FzIHNpbmQgVGlja3M/CitFaW4gVGljayBpc3QgZWluZSBNYXNzZWluaGVpdCwgZGllIG1hbiBmcnVlaGVyIGVpbmdlZnVlaHJ0IGhhdCwgdW0genUKK3ZlcmhpbmRlcm4sIGRhc3MgZWluIE9iamVrdC9NYWdpZXIgZGVuIERyaXZlciBiZWxpZWJpZyBsYW5nIGJlc2NoYWVmdGlnZW4KK2thbm4gdW5kIG5pZW1hbmQgYW5kZXJzIG1laHIgenVtIFp1Z2Uga29tbXQuCisKKyogU2luZCBlcyBhbHNvIFplaXRlaW5oZWl0ZW4/IE9kZXIgUmVjaGVub3BlcmF0aW9uZW4/CitBbSBlaGVzdGVuIGVudHNwcmljaHQgZWluIFRpY2sgZGVyIFJlY2hlbm9wZXJhdGlvbi4gQmVzc2VyIGdlc2FndDogamVkZXIKK0xQQy1PcGVyYXRvciwgamVkZXMgTFBDLVNjaGx1ZXNzZWx3b3J0IHVuZCBqZWRlIGVmdW4sIGRpZSBtYW4gcnVmdCwgdmVycmluZ2VydAorZGllIHp1ciBWZXJmdWVndW5nIHN0ZWhlbmRlbiBUaWNrcyB1bSBtaW5kZXN0ZW5zIDE6IFNvd2FzIHdpZSArLCAtLCBpZigpLAorZWxzZSwgc3dpdGNoKCksIGV0Yy4KK0hpZXJiZWkgc3RlaGVuIGRpZSBUaWNrcywgZGllIGVpbiBTdHVlY2sgQ29kZSBicmF1Y2h0IHVuZCBkaWUgWmVpdCwgZGllIGRlc3NlbgorQXVzZnVlaHJ1bmcgYnJhdWNodCwgaW4ga2VpbmVtIGtvbnN0YW50ZW4gVmVyaGFlbHRuaXMuIEVpbiBTdHVlY2sgQ29kZQorYnJhdWNodCBpbW1lciBkaWUgZ2xlaWNoZSBkZWZpbmllcnRlIE1lbmdlIGFuIFRpY2tzLCBhYmVyIGthbm4gZGFmdWVyCit1bnRlcnNjaGllZGxpY2hlIFplaXRlbiBiZW5vZXRpZ2VuICh6LmIuIHdlbm4gbWFuIGVyc3Qgd2FzIGVpbnN3YXBwZW4gbXVzcykuCitFYmVuc28gYnJhdWNoZW4gMiBTdHVlY2sgQ29kZSwgZGllIGRpZSBnbGVpY2hlIE1lbmdlIFRpY2tzIGJyYXVjaGVuLCBvZnQKK3VudGVyc2NoaWVkbGljaCBsYW5nLgorCisqIFdpZSBtZXNzZSBpY2ggVGlja3M/CitEaWUgRnVua3Rpb24gZ2V0X2V2YWxfY29zdCgpIGxpZWZlcnQgZWluZW0genVydWVjaywgd2lldmllbGUgVGlja3MgbWFuIGluCitkaWVzZW0gQXVzZnVlaHJ1bmdzdGhyZWFkIG1hbiBub2NoIHZlcmJyYXRlbiBkYXJmLCBiaXMgZGllIEF1c2Z1ZWhydW5nCithYmdlYnJvY2hlbiB3aXJkLiBXaWxsIG1hbiB3aXNzZW4sIHdpZXZpZWwgZXR3YXMga29zdGV0LCBydWZ0IG1hbiB2b3JoZXIKK2dldF9ldmFsX2Nvc3QoKSwgbWVya3Qgc2ljaCBkYXMgdW5kIHZlcmdsZWljaHQgbWl0IGRlbSBFcmdlYm5pcyB2b24KK2dldF9ldmFsX2Nvc3QoKSBkYW5hY2guCisKKyogV2lldmllbCB0aWNrcyB2ZXJicmF1Y2h0IGRpZXNlIHVuZCBkaWVzZSBPcGVyYXRpb24vRnVua3Rpb24/CitKZWRlIGVsZW1lbnRhcmUgT3BlcmF0aW9uIHZlcmJyYXVjaHQgZXJzdG1hbCBlaW5lbiBUaWNrLiBBYmVyOiBlcyBnaWJ0IEVmdW5zCit1bmQgT3BlcmF0b3JlbiwgZGllIHNlaHIgZ3Jvc3NlIERhdGVubWVuZ2VuIG1hbmlwdWxpZXJlbiAoa29lbm5lbikuIERhbWl0IG1hbgorbWl0IGRpZXNlbiBuaWNodCBtZWdhYnl0ZXdlaXNlIERhdGVuIGZ1ZXIgZWluZW4gVGljayBtYW5pcHVsaWVyZW4ga2FubiwgZ2lidAorZXMgaW4gTERNdWQgZGllIHNvZy4gZHluYW1pc2NoZW4gRXZhbGNvc3RzLCBiZWkgZGVuZW4gamUgbmFjaCBVbWZhbmcgZGVyCittYW5pcHVsaWVydGVuIERhdGVuIFRpY2tzIGFiZ2V6b2dlbiB3ZXJkZW4uIEJzcDogc3RyMSArIHN0cjIga29zdGV0IHVtc28gbWVociwKK2plIGdyb2Vzc2VyIHN0cjEgdW5kIHN0cjIgc2luZC4KK1dlbm4gbWFuIGVzIGdlbmF1IHdpc3NlbiB3aWxsLCBzb2xsdGUgbWFuIHBlciBnZXRfZXZhbF9jb3N0KCkgbWVzc2VuLCBkaWVzIGlzdAorbmF0dWVybGljaCBmdWVyIGRpZSBkeW5hbWlzY2hlbiBFdmFsY29zdHMgc2Nod2llcmlnZXIuIEdnZi4gZnJhZ3QgZGVuIEVNIGZ1ZXIKK0RyaXZlci9NdWRsaWIsIG9iIGVyIGRhcyB3ZWlzcy4KKworKiBXaWV2aWVsIHN0ZWhlbiBkZW0gRHJpdmVyIHBybyBIZWFydGJlYXQgenVyIFZlcmZ1ZWd1bmc/IAorRGFzIGlzdCBzbyBnbG9iYWwgbmljaHQgenUgYmVhbnR3b3J0ZW4uIEFiZXI6IHBybyBBdXNmdWVocnVuZ3N0aHJlYWQgc3RlaGVuCit1bnMgbW9tZW50YW4gMTUwMDAwMCBUaWNrcyB6dXIgVmVyZnVlZ3VuZy4gU28gZWluIEF1c2Z1ZWhydW5nc3RocmVhZCBzdGFydGV0Cit6LkIuLCB3ZW5uIGRlciBEcml2ZXIgaW4gZWluZW0gT2JqZWt0IGhlYXJ0X2JlYXQoKSBydWZ0LCBhdWNoIHJlc2V0KCksCitjbGVhbl91cCgpIG9kZXIgd2VubiBkZXIgRHJpdmVyIGVpbiBTcGllbGVya29tbWFuZG8gYXVzd2VydGV0LiBDYWxsb3V0cyBzaW5kCitlaW4gU3BlemlhbGZhbGwsIGhpZXJiZWkgdGVpbGVuIHNpY2ggZGllICJnbGVpY2h6ZWl0aWciIChpbSBnbGVpY2hlbgorQmFja2VuZC1aeWtsdXMgZGVzIERyaXZlcnMpIHVuZCB1bnRlciBkZXIgZ2xlaWNoZW4gVUlEIGF1c2dlZnVlaHJ0ZW4gQ2FsbG91dHMKK2xldHp0ZW5kbGljaCBkaWUgVGlja3MuCisKKyogV2FzIHBhc3NpZXJ0LCB3ZW5uIGVzIGRvY2ggbWFsIG5pY2h0IHJlaWNodD8KK0luIGRlbSBGYWxsIGdpYnQgZXMgZGVuIGJlcnVlaG10LWJlcnVlY2hpZ3RlbiAndG9vIGxvbmcgZXZhbHVhdGlvbictRmVobGVyCisoVExFKSB1bmQgZGllIEF1c2Z1ZWhydW5nIHdpcmQgYW4gZGVyIFN0ZWxsZSBhYmdlYnJvY2hlbiwgd28gZGllIEFuemFobCBhbgordmVyZnVlZ2JhcmVuIFRpY2tzIGF1ZiAwIGZhZWxsdC4KKworKiBXaWUgZmluZGUgaWNoIGhlcmF1cywgd2lldmllbCBMYXVmemVpdCBlaW5lIGJlc3RpbW10ZSBPcGVyYXRpb24gYmVub2V0aWd0PworSGllcmJlaSBoZWxmZW4gZWluZW0gZGllIHZlcmJyYXVjaHRlbiBUaWNrcyBuaWNodCB3ZWl0ZXIuIFVtIGRpZSBMYXVmemVpdAorZWluZXMgU3R1ZWNrcyBDb2RlIHp1IGJlc3RpbW1lbiwgbWlzc3QgbWFuIHZvcmhlciBkaWUgYWt0dWVsbGUgWmVpdCBtaXQKK2dlbnVlZ2VuZCBncm9zc2VyIEdlbmF1aWdrZWl0LCBmdWVocnQgc2VpbmVuIENvZGUsIG1pc3N0IGVybmV1dCBkaWUgWmVpdCB1bmQKK2JpbGRldCBkaWUgRGlmZmVyZW56LiBEaWUgZ2VuYXVlc3RlIE1vZWdsaWNoa2VpdCBkZXIgWmVpdG1lc3N1bmcgaW0gTXVkIHN0ZWxsdAorZGllIGVmdW4gdXRpbWUoKSBkYXIsIHdlbGNoZSBkaWUgWmVpdCBpbiBNaWtyb3Nla3VuZGVuIGVybWl0dGVsbiBrYW5uLgorQmVpc3BpZWw6CisgIGludCAqemVpdDEgPSB1dGltZSgpOworICAvLyBjb2RlIGF1c2Z1ZWhyZW4KKyAgaW50ICp6ZWl0MiA9IHV0aW1lKCk7CisgIGludCB1c2VjID0gKHplaXQyWzBdIC0gemVpdDFbMF0pICogMTAwMDAwMCAtIHplaXQxWzFdICsgemVpdDJbMV07CisKK1NJRUhFIEFVQ0g6CisgIGVmZml6aWVueiwgbWVtb3J5LCBnb29kc3R5bGUKKworMDQuMDkuMjAwOCwgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2MvY29uY2VwdHMvdGxzIGIvZG9jL2NvbmNlcHRzL3RscwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTk0NmEyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2NvbmNlcHRzL3RscwpAQCAtMCwwICsxLDczIEBACitQUkVMSU1JTkFSWQorQ09OQ0VQVAorICAgICAgICB0bHMgKHRyYW5zcG9ydCBsYXllciBzZWN1cml0eSkKKworREVTQ1JJUFRJT04KKwlUTFMgc3RhbmRzIGZvciBUcmFuc3BvcnQgTGF5ZXIgU2VjdXJpdHkgd2hpY2ggaXMgdGhlIHN1Y2Nlc3NvcgorCW9mIHRoZSB3ZWxsIGtub3duIFNTTCAoU2VjdXJlIFNvY2tldCBMYXllcikuIEJvdGggdGVjaG5pcXVlcyAKKwlwcm92aWRlIGEgd2F5IHRvIGF1dGhlbnRpY2F0ZSBhbmQgZW5jcnlwdCB0aGUgZGF0YSBzZW5kIHRocm91Z2gKKwlhIG5ldHdvcmsgY29ubmVjdGlvbi4KKwlCeSBlbmFibGluZyBUTFMgZHVyaW5nIGNvbXBpbGF0aW9uIG9mIHRoZSBkcml2ZXIgeW91IGNhbiBwcm92aWRlCisJYSBzZWN1cmUgY2hhbm5lbCBpbnRvIHRoZSBtdWQgdG8geW91ciBwbGF5ZXJzLgorCUluIGRpZmZlcmVuY2UgdG8gb3RoZXIgc29sdXRpb25zIGFzICJzc2x3cmFwIiBvciAic3R1bm5lbCIgdGhlCisJZHJpdmVyIGludGVncmF0ZWQgYXBwcm9hY2ggaGFzIHRoZSBhZHZhbnRhZ2UgdGhhdCB0aGUgbXVkIHNlZXMgCisJdGhlIHJlYWwgSVAgb2YgdGhlIHBsYXllciwgbm90IHRoZSBJUCBvZiB0aGUgbG9jYWwgbXVkIGhvc3QuCisKK1VTQUdFCisJVG8gdXNlIFRMUyBjb25maWd1cmUgeW91ciBkcml2ZXIgd2l0aCAtLWVuYWJsZS10bHMgb3B0aW9uLgorCUFmdGVyIHN0YXJ0aW5nIHlvdXIgZHJpdmVyIHlvdSBoYXZlIGZpdmUgbmV3IGVmdW5zCisJKHRsc19pbml0X2Nvbm5lY3Rpb24oKSwgdGxzX2RlaW5pdF9jb25uZWN0aW9uKCksIHRsc19lcnJvcigpLAorCSB0bHNfcXVlcnlfY29ubmVjdGlvbl9pbmZvKCksIHRsc19xdWVyeV9jb25uZWN0aW9uX3N0YXRlKCkpLgorCisJWW91IGNhbiBzd2l0Y2ggb24gVExTIGJ5IGNhbGxpbmcgdGxzX2luaXRfY29ubmVjdGlvbigpLgorCVRoaXMgY2FuIGhhcHBlbiBpbiB0aHJlZSB3YXlzOgorCisJMSkgaW4gdGVsbmV0X25lZygpCisKKyAgICAgICAgICAgIEFkdmFudGFnZSBvZiB0aGlzIG1ldGhvZCBpcyB0aGF0IHlvdSBjYW4gb2ZmZXIgVExTIG9uIGEgbm9ybWFsIAorICAgICAgICAgICAgbXVkIHBvcnQuIElmIHlvdSBoYXZlIGEgbGltaXRlZCBudW1iZXIgb2YgcG9ydHMgdGhpcyBjYW4gCisgICAgICAgICAgICBiZWNvbWUgaW1wb3J0YW50LiBUaGUgVExTIGNvbm5lY3Rpb24gd2lsbCBiZSBzdGFydGVkIGJ5IAorICAgICAgICAgICAgdGhlIGNsaWVudCB3aXRoIGhlbHAgb2YgdGVsbmV0IG9wdGlvbiBTVEFSVFRMUy4gQ3VycmVudGx5CisgICAgICAgICAgICB0aGVyZSBhcmUgbm8gbXVkY2xpZW50cyB0aGF0IHN1cHBvcnQgdGhpcyBtZXRob2QuCisgICAgICAgICAgICAKKyAgICAgICAgICAgIFlvdSB3aWxsIGhhdmUgdG8gaW1wbGVtZW50IHRoZSB0ZWxuZXQgb3B0aW9uIFNUQVJUVExTICg0NikgZm9yCisgICAgICAgICAgICB0aGlzIG1ldGhvZC4gVGhlIGRyYWZ0IGZvciB0aGlzIGNhbiBiZSBmb3VuZCBoZXJlOgorICAgICAgICAgICAgaHR0cDovL3d3dy5pZXRmLm9yZy9wcm9jZWVkaW5ncy85OW1hci9JLUQvZHJhZnQtaWV0Zi10bjMyNzBlLXRlbG5ldC10bHMtMDEudHh0CisgICAgICAgICAgICBDYWxsIHRsc19pbml0X2Nvbm5lY3Rpb24oKSB0byBpbml0aWF0ZSB0aGUgVExTIGhhbmRzaGFrZS4KKworCisJMikgaW4gbWFzdGVyX29iLT5jb25uZWN0KCkKKworICAgICAgICAgICAgQWR2YW50YWdlIG9mIHRoaXMgbWV0aG9kIGlzIHRoYXQgeW91ciB1c2VycyBjYW4gY29ubmVjdCB3aXRoCisgICAgICAgICAgICBhbnkgcHJvZ3JhbSB0aGF0IHN1cHBvcnRzIFRMUy9TU0wuIEV4YW1wbGVzIGFyZSB0ZWxuZXQtc3NsLAorICAgICAgICAgICAgc3Nsd3JhcCBvciBzdHVubmVsLiBEaXNhZHZhbnRhZ2UgaXMgdGhhdCB5b3UgaGF2ZSB0byBzcGVuZAorICAgICAgICAgICAgYSBkZWRpY2F0ZWQgcG9ydCBmb3IgdGhpcy4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgWW91IGhhdmUgdG8gY2FsbCB0bHNfaW5pdF9jb25uZWN0aW9uKCkgYXMgZmlyc3QgY29tbWFuZAorICAgICAgICAgICAgYWZ0ZXIgdGhlIHBsYXllciBjb25uZWN0ZWQgKG5vcm1hbGx5IGluIG1hc3Rlcl9vYi0+Y29ubmVjdCgpKQorCisgICAgICAgIDMpIGluIGFuIGludGVyYWN0aXZlIG9iamVjdCB1c2luZyBhIGNhbGxiYWNrLgorCisgICAgICAgICAgICBUaGlzIG1ldGhvZCBpcyBzaW1pbGFyIHRvIG1ldGhvZCAoMSksIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgICAgICAgdGVsbmV0OiBpdCBpcyB1c2VmdWwgZm9yIGltcGxlbWVudGluZyBwcm90b2NvbHMgdGh0YSB1c2UKKyAgICAgICAgICAgIFNUQVJUVExTIGxpa2UgU01UUCBvciBJTUFQLiB0bHNfaW5pdF9jb25uZWN0aW9uKCkgY2FuIGJlCisgICAgICAgICAgICBjYWxsZWQgYXQgYW55IHRpbWUgYnkgdGhlIGludGVyYWN0aXZlIG9iamVjdC4KKworICAgICAgICAgICAgWW91IG11c3Qgbm90IHdyaXRlIHRvIHRoZSBjb25uZWN0aW9uIGFmdGVyIGNhbGxpbmcgdGhpcworICAgICAgICAgICAgZWZ1biB1bnRpbCB0aGUgY2FsbGJhY2sgaXMgZXhlY3V0ZWQgKHRoZSBwcm9tcHQgd2lsbAorICAgICAgICAgICAgYmUgc3VwcmVzc2VkIGF1dG9tYXRpY2FsbHkgZHVyaW5nIHRoaXMgdGltZSkuCisKKyAgICAgICAgVG8gdGVzdCB5b3VyIGNvZGUsIHlvdSBjYW4gdXNlIHRoZSBvcGVuc3NsIGJpbmFyeS4KKyAgICAgICAgYG9wZW5zc2wgc19jbGllbnQgLWNvbm5lY3QgaG9zdDpwb3J0JyBzaG91bGQgZGlzcGxheSB5b3VyIGNlcnRpZmljYXRlCisgICAgICAgIGFuZCBhbnl0aGluZyB5b3Ugd3JpdGUgYWZ0ZXIgdGhlIGNhbGxiYWNrIGlzIGV4ZWN1dGVkLiBJZiB5b3UKKyAgICAgICAgZW5jb3VudGVyIHRoZSBlcnJvciBtZXNzYWdlIGBTU0wzX0dFVF9SRUNPUkQ6IHdyb25nIHZlcnNpb24gbnVtYmVyJworICAgICAgICB5b3UncmUgcHJvYmFibHkgd3JpdGluZyB0byB0aGUgY29ubmVjdGlvbiB3aGlsZSB5b3Ugc2hvdWxkIG5vdC4KKworQlVHCisgICAgICAgIFRoaXMgbWFucGFnZSBtaWdodCBiZSBub3QgcXVpdGUgdXAgdG8gZGF0ZSB3aXRoIHRoZSBpbXBsZW1lbnRhdGlvbi4KKworSElTVE9SWQorICAgICAgICBJbnRyb2R1Y2VkIGluIExETXVkIDMuMy40NzQgYW5kIGZvbGxvd2luZywgYmFja3BvcnRlZCB0byAzLjIuMTEuCisKK1NFRSBBTFNPCisgICAgICAgIHRsc18qIGVmdW5zCmRpZmYgLS1naXQgYS9kb2MvY29uY2VwdHMvdWlkcyBiL2RvYy9jb25jZXB0cy91aWRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNGE3YWYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvY29uY2VwdHMvdWlkcwpAQCAtMCwwICsxLDk2IEBACitDT05DRVBUCisgICAgICAgIHVpZHMgKHVzZXJpZHMpCisKK0RFU0NSSVBUSU9OCisgICAgICAgIEV2ZXJ5IG9iamVjdCBpbiB0aGUgbXVkIGlzIGF0dHJpYnV0ZWQgd2l0aCBhIHVzZXItaWQgJ3VpZCc6IGEgc3RyaW5nCisgICAgICAgIHdoaWNoIGFzc29jaWF0ZXMgdGhlIG9iamVjdCB3aXRoIGEgY2VydGFpbiAndXNlcicgKGFrYSAnd2l6YXJkJyBvcgorICAgICAgICAnY3JlYXRvcicsIHRob3VnaCBpdCBpcyBub3QgbGltaXRlZCB0byB0aGF0KS4gVGhlIHVpZCBjYW4gYmUgMCwgd2hpY2gKKyAgICAgICAgaW50ZXJuYWxseSBpcyB0aGUgZGVmYXVsdC11aWQuCisKKyAgICAgICAgVGhlIHVpZCBzZXJ2ZXMgYSBkdWFsIHB1cnBvc2U6IG9uIHRoZSBvbiBoYW5kIGl0IGlzIHVzZWQgdG8gZ2F0aGVyCisgICAgICAgIHN0YXRpc3RpY3MgYWJvdXQgdGhlIHZhcmlvdXMgZ3JvdXBzIG9mIG9iamVjdHMgKGluIHRoZSBmYW1vdXMKKyAgICAgICAgJ3dpemxpc3QnKSwgb24gdGhlIG90aGVyIGhhbmQgdGhlIHVpZCBjYW4gY29tZSBpbiBoYW5keSBpbiB0aGUKKyAgICAgICAgaW1wbGVtZW50YXRpb24gb2Ygc2VjdXJpdHkgc3lzdGVtcy4KKworICAgICAgICBUaGUgdWlkIG9mIGFuIG9iamVjdCBpcyBhc3NpZ25lZCBhdCBpdHMgY3JlYXRpb24gdGhyb3VnaCB0aGUKKyAgICAgICAgZHJpdmVyIGhvb2tzIEhfTE9BRF9VSURTIGZvciBsb2FkZWQgb2JqZWN0cywgYW5kIEhfQ0xPTkVfVUlEUworICAgICAgICBmb3IgY2xvbmVkIG9iamVjdHMsIGFuZCBjYW4ndCBiZSBjaGFuZ2VkIGFmdGVyd2FyZHMuCisKKyAgICAgICAgVGhlIHVpZCBvZiBhbiBvYmplY3QgY2FuIGJlIHF1ZXJpZWQgd2l0aCB0aGUgZWZ1biBnZXR1aWQoKSAocmVzcC4KKyAgICAgICAgY3JlYXRvcigpIGluIGNvbXBhdC1tb2RlKS4KKworCisgICAgICAgIEV2ZXJ5IG9iamVjdCBhbHNvIGhhcyBhIHNlY29uZCBzdHJpbmcgYXR0cmlidXRlLCB0aGUgJ2VmZmVjdGl2ZQorICAgICAgICB1c2VyaWQnIG9yICdldWlkJywgd2hpY2ggYWxzbyBtYXkgYmUgMC4gVGhpcyB2YWx1ZSB3YXMgaW50ZW5kZWQgdG8KKyAgICAgICAgaW1wbGVtZW50IGEgc2VjdXJpdHkgc3lzdGVtIGJhc2VkIG9uIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGVvcmV0aWNhbAorICAgICAgICBhbmQgZWZmZWN0aXZlIHBlcm1pc3Npb25zLiBTaW5jZSB0aGUgZWZmZWN0aXZlbmVzcyBvZiB0aGlzIHN5c3RlbSBpcworICAgICAgICBkb3VidGZ1bCwgdGhlIGRyaXZlciBlbmZvcmNlcyBzdWNoIGEgdXNlIG9ubHkgYXMgYW4gb3B0aW9uLgorCisgICAgICAgIEFzIHVpZHMsIGV1aWRzIGFyZSBhc3NpZ25lZCBhdCBhbiBvYmplY3RzIGNyZWF0aW9uIHRocm91Z2gKKyAgICAgICAgdGhlIHR3byBhZm9ybWVudGlvbmVkIGRyaXZlcmhvb2tzLiBUaGV5IGNhbiBiZSBxdWVyaWVkIHdpdGgKKyAgICAgICAgdGhlIGVmdW4gZ2V0ZXVpZCgpIGFuZCBjaGFuZ2VkIHdpdGggdGhlIGVmdW4gc2V0ZXVpZCgpLiBDYWxscworICAgICAgICB0byB0aGUgbGF0dGVyIGFyZSB2ZXJpZmllZCBieSB0aGUgbWFzdGVyIGxmdW4gdmFsaWRfc2V0ZXVpZCgpLgorCisgICAgICAgIEFkZGl0aW9uYWxseSBvYmplY3RzIGNhbiBpbXBvc2UgdGhlaXIgdWlkIG9udG8gYW4gb3RoZXIgb2JqZWN0cworICAgICAgICBldWlkIHdpdGggdGhlIGVmdW4gZXhwb3J0X3VpZCgpLgorCisKKyAgICAgICAgSWYgdGhlIGRyaXZlciBpcyBydW4gaW4gJ3N0cmljdCBldWlkcycgbW9kZSwgZXVpZHMgYXJlIHRha2VuCisgICAgICAgIG1vcmUgc2VyaW91c2x5IHRoYW4gYmVpbmcganVzdCBhbm90aGVyIGF0dHJpYnV0ZToKKyAgICAgICAgICAtIGFsbCBvYmplY3RzIG11c3QgaGF2ZSBhIG5vbi0wIHVpZC4KKyAgICAgICAgICAtIG9iamVjdHMgd2l0aCBhIDAgZXVpZCBjYW4ndCBsb2FkIG9yIGNsb25lIG90aGVyIG9iamVjdHMuCisgICAgICAgICAgLSB0aGUgYmFja2JvbmUgdWlkIGFzIHJldHVybmVkIGJ5IG1hc3Rlcjo6Z2V0X2JiX3VpZCgpIG11c3QKKyAgICAgICAgICAgIG5vdCBiZSAwLgorCisKKyAgICAgICAgVXNlcmlkcyBhcmUgYXNzaWduZWQgYXQgdGhlIHRpbWUgb2YgdGhlIGNyZWF0aW9uIG9mIGFuIG9iamVjdAorICAgICAgICBieSBjYWxsaW5nIHRoZSBkcml2ZXJob29rcyBIX0xPQURfVUlEUyBhbmQgSF9DTE9ORV9VSURTOgorCisgICAgICAgICAgICBtaXhlZCA8bG9hZF91aWRzIGNsb3N1cmU+IChzdHJpbmcgb2JqZWN0bmFtZSkKKyAgICAgICAgICAgIG1peGVkIDxjbG9uZV91aWRzIGNsb3N1cmU+KG9iamVjdCBibHVlcHJpbnQsIHN0cmluZyBvYmplY3RuYW1lKQorCisgICAgICAgIFdoZW4gYW4gb2JqZWN0IGlzIG5ld2x5IGxvYWRlZCwgdGhlIEhfTE9BRF9VSURTIGhvb2sgaXMKKyAgICAgICAgY2FsbGVkIHdpdGggdGhlIG9iamVjdCBuYW1lIGFzIGFyZ3VtZW50LgorICAgICAgICBXaGVuIGFuIG9iamVjdCBpcyBjbG9uZWQsIHRoZSBIX0NMT05FX1VJRFMgaG9vayBpcyBjYWxsZWQKKyAgICAgICAgd2l0aCB0aGUgYmx1ZXByaW50IG9iamVjdCBhcyBmaXJzdCBhbmQgdGhlIGNsb25lJ3MgZGVzaWduYXRlZAorICAgICAgICBuYW1lIGFzIHNlY29uZCBhcmd1bWVudC4KKyAgICAgICAgSW4gYm90aCBjYXNlcyB0aGUgbmV3IG9iamVjdCBhbHJlYWR5IGV4aXN0cywgYnV0IGhhcyAwIHVpZHMuCisKKyAgICAgICAgRm9yIHRoZSByZXN1bHQsIHRoZSBmb2xsb3dpbmcgcG9zc2liaWxpdGllcyBleGlzdCAoPG51bT4gaXMKKyAgICAgICAgYSBub24temVybyBudW1iZXIsIDxuby1zdHJpbmc+IGlzIGFueXRoaW5nIGJ1dCBhIHN0cmluZyk6CisKKyAgICAgICAgICAgICAiPHVpZD4iICAgICAgICAgICAgICAgICAgICAtPiB1aWQgPSAiPHVpZD4iLCBldWlkID0gIjx1aWQ+IgorICAgICAgICAgICAgICh7ICI8dWlkPiIsICI8ZXVpZD4iIH0pICAgIC0+IHVpZCA9ICI8dWlkPiIsIGV1aWQgPSAiPGV1aWQ+IgorICAgICAgICAgICAgICh7ICI8dWlkPiIsIDxuby1zdHJpbmc+IH0pIC0+IHVpZCA9ICI8dWlkPiIsIGV1aWQgPSAwCisKKyAgICAgICAgSWYgc3RyaWN0LWV1aWRzIGlzIG5vdCBhY3RpdmUsIHRoZSBmb2xsb3dpbmcgcmVzdWx0cyBhcmUKKyAgICAgICAgcG9zc2libGUsIHRvbzoKKworICAgICAgICAgICAgIDxudW0+ICAgICAgICAgICAgICAgICAgICAgIC0+IHVpZCA9ICdkZWZhdWx0JywgZXVpZCA9IDAKKyAgICAgICAgICAgICAoeyA8bnVtPiwgIjxldWlkPiIgfSkgICAgICAtPiB1aWQgPSAnZGVmYXVsdCcsIGV1aWQgPSAiPGV1aWQ+IgorICAgICAgICAgICAgICh7IDxudW0+LCA8bm8tc3RyaW5nPiB9KSAgIC0+IHVpZCA9ICdkZWZhdWx0JywgZXVpZCA9IDAKKworCisKKyAgICAgICAgU2xpZ2h0bHkgZGlmZmVyZW50IHJ1bGVzIGFwcGx5IHRvIHRoZSAoZSl1aWQgb2YgdGhlIG1hc3Rlci4KKyAgICAgICAgVGhlIG1hc3RlcnMgKGUpdWlkIGlzIGRldGVybWluZWQgYnkgYSBjYWxsIHRvCisgICAgICAgIG1hc3Rlci0+Z2V0X21hc3Rlcl91aWQoKToKKworICAgICAgICAgICAgICI8dWlkIj4gLT4gdWlkID0gIjx1aWQ+IiwgZXVpZCA9ICI8dWlkPiIKKworICAgICAgICBJbiBub24tc3RyaWN0LWV1aWRzIG1vZGUsIG1vcmUgcmVzdWx0cyBhcmUgcG9zc2libGU6CisKKyAgICAgICAgICAgICAwICAgICAgIC0+IHVpZCA9IDAsIGV1aWQgPSAwCisgICAgICAgICAgICAgPG51bT4gICAtPiB1aWQgPSAnZGVmYXVsdCcsIGV1aWQgPSAwCisKKyAgICAgICAgSWYgeW91ciB1aWRzIGFyZSBpbiBnZW5lcmFsIGJhc2VkIG9uIGZpbGVuYW1lcywgaXQgaXMgd2lzZSB0byByZXR1cm4gYQorICAgICAgICB2YWx1ZSBoZXJlIHdoaWNoIGNhbiBub3QgYmUgbGVnYWxseSBnZW5lcmF0ZWQgZnJvbSBhbnkgZmlsZW5hbWUuICBPU0IKKyAgICAgICAgZm9yIGV4YW1wbGUgdXNlcyAnemUvdXMnLgorCisgICAgICAgIFRoZSBtYXN0ZXJzIHVpZCBpcyBkZXRlcm1pbmVkIG9ubHkgb24gc3RhcnR1cCB0aGlzIHdheSwgYXQgcnVudGltZSB0aGUKKyAgICAgICAgdWlkcyBvZiBhIHJlbG9hZGVkIG1hc3RlciBkZXRlcm1pbmVkIGFzIGZvciBldmVyeSBvYmplY3QgYnkgYSBjYWxsIHRvCisgICAgICAgIHRoZSBhcHByb3ByaWF0ZSBkcml2ZXIgaG9va3MuCisKK1NFRSBBTFNPCisgICAgICAgIG5hdGl2ZShDKSwgZ2V0X3Jvb3RfdWlkKE0pLCB2YWxpZF9zZXRldWlkKE0pLAorICAgICAgICBvYmplY3RzKEMpLCBjbG9uZV9vYmplY3QoRSksIGdldGV1aWQoRSksIGdldHVpZChFKSwgc2V0ZXVpZChFKQpkaWZmIC0tZ2l0IGEvZG9jL2RyaXZlci9jb2Rlc3R5bGUgYi9kb2MvZHJpdmVyL2NvZGVzdHlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGEwNWI2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RyaXZlci9jb2Rlc3R5bGUKQEAgLTAsMCArMSwyNDcgQEAKKyAgICBUaGUgTFBNdWQgZ2FtZWRyaXZlciBpcyBieSBuYXR1cmUgdGhlIHJlc3VsdCBvZiB0aGUgY29vcGVyYXRpdmUgd29yaworICAgIG9mIG11bHRpcGxlIHByb2dyYW1tZXJzLCBvZnRlbiBzZXBhcmF0ZWQgYnkgbGFyZ2Ugb2NlYW5zIGFuZCB5ZWFycworICAgIG9mIHRpbWUuIEluIG9yZGVyIHRvIGtlZXAgdGhlIGFwcGVhcmFuY2Ugb2YgdGhlIGRyaXZlciBzb3VyY2UgY29uc2lzdGVudAorICAgIChhbmQgd2l0aCB0aGF0IG1haW50YWluYWJsZSksIHRoZSBmb2xsb3dpbmcgZ3VpZGVsaW5lcyBzaG91bGQgYmUgZm9sbG93ZWQKKyAgICBmb3IgYWxsIGNvZGUgY29udHJpYnV0aW9ucy4KKworICAgIEZvciBhIHF1aWNrIHN0YXJ0IGluIGhvdyBnb29kIGRyaXZlciBzb3VyY2Ugc2hvdWxkIGxvb2sgbGlrZSwgdGFrZQorICAgIGEgbG9vayBhdCBjb21tLntjLGh9LCBvYmplY3Que2MsaH0gYW5kIG1hcHBpbmcue2MuaH0uCisKKyAgICBUaGUgZ3VpZGVsaW5lcyBoYXZlIGEgc3Ryb25nIGVtcGhhc2lzIG9uIGNvZGUgbGF5b3V0IGFuZCBjb21tZW50aW5nLAorICAgIHN0ZW1taW5nIGZyb20gdGhlIGZhY3QgdGhhdCBwcm9wZXIgbGF5b3V0IGFuZCBjb21tZW50cyBnYXZlIHRoZQorICAgIGluY2VudGl2ZSBmb3IgTERNdWQgaW4gdGhlIGZpcnN0IHBsYWNlLiBSaWdodCBub3csIDUwJSBvZiBhbGwgbGluZXMKKyAgICBhcmUgY29tbWVudHMsIGFuZCB0aGF0IGhhcyBiZWVuIHByb3ZlbiB0byBiZSBhIEdvb2QgVGhpbmcuCisKKyAgICBBbnkgcmVhZGVyIG9mIHRoZSAicmVhbCBwcm9ncmFtbWVycyBkb24ndCB3cml0ZSBjb21tZW50cyItc2Nob29sCisgICAgb2YgdGhvdWdodCBpcyBhc2tlZCB0byB0YWtlIGhpcyBvciBoZXIgaW5jb21wZXRlbmNlIGVsc2V3aGVyZS4KKworCitMYW5ndWFnZQorLS0tLS0tLS0KKyAgICBUaGUgbGFuZ3VhZ2UgaXMgSVNPIFN0YW5kYXJkIEMgKGFsc28ga25vd24gYXMgJ0M4OScgb3IgJ0FOU0kgQycpLgorICAgIENvbW1vbiBjb21waWxlciBleHRlbnNpb25zIG9yIGZlYXR1cmVzIGZyb20gdGhlIG5ldyBDOTkgc3RhbmRhcmQgYXJlCisgICAgcGVybWl0dGVkIGlmIHRoZWlyIGFkZGl0aW9uIGlzIHRyYW5zcGFyZW50IGZvciBvdGhlciBDODkgY29tcGlsZXJzLgorICAgIEZvciBleGFtcGxlOiB0aGUgJ2lubGluZScga2V5d29yZCBwZXJtaXR0ZWQgdGhyb3VnaCB0aGUgdXNlIG9mIHRoZQorICAgIElOTElORSBtYWNybzsgc28gYXJlIHRoZSBNZXRyb3dlcmtzLXByYWdtYXMgYW5kIEdOVS1hdHRyaWJ1dGVzLiBOb3QKKyAgICBwZXJtaXR0ZWQgYXJlIEdOVSdzIGxvY2FsIGZ1bmN0aW9ucy4KKworICAgIFN5c3RlbS9QbGF0Zm9ybSBzcGVjaWZpY3MgYXJlIHRvIGJlIGRldGVjdGVkIGJ5IHRoZSBjb25maWd1cmUgc2NyaXB0CisgICAgYW5kIHByb3ZpZGVkIHdpdGggdHJhbnNwYXJlbnQgaW1wbGVtZW50YXRpb25zIGluIHBvcnQue2MsaH0gKG9yIGZvcgorICAgIG1vZHVsZS1zcGVjaWZpYyBkZXBlbmRlbmNpZXMgaW4gdGhlIHJlc3BlY3RpdmUgbW9kdWxlcykuCisKKyAgICBBZGhlcmVuY2UgdG8gdGhlIFN0YW5kYXJkIGhhcyB0aGUgZm9sbG93aW5nIGltcGxpY2F0aW9uczoKKworICAgICAtIEFsbCBmdW5jdGlvbnMgbXVzdCBiZSBmdWxseSBwcm90b3R5cGVkLgorICAgICAtIFN0YW5kYXJkIHR5cGVzIGxpa2Ugc2l6ZV90LCBzc2l6ZV90IG9yIHB0cmRpZmZfdCBhcmUgdG8gYmUgdXNlZAorICAgICAgIHdoZXJlZXZlciBwb3NzaWJsZS4KKyAgICAgLSBVbml4aXNtcyBsaWtlCisgICAgICAgICB7CisgICAgICAgICAgIGEgPSBtYWxsb2MoMjApOworICAgICAgICAgICBiID0gbWFsbG9jKDIwKTsKKyAgICAgICAgICAgYyA9IGItYTsKKyAgICAgICAgIH0KKyAgICAgICBhcmUgbm90IGxlZ2FsIGFuZCBzaG91bGRuJ3QgYmUgdXNlZC4KKyAgICAgLSBEb24ndCBtYWtlIGFzc3VtcHRpb25zIGFib3V0IHRoZSBzaXplIG9mIHRoZSBiYXNlIHR5cGVzIChlLmcuCisgICAgICAgYSBjaGFyIG1pZ2h0IGhhdmUgbW9yZSB0aGFuIDggYml0cykuIElmIHN1Y2ggYW4gYXNzdW1wdGlvbgorICAgICAgIGlzIHVuYXZvaWRhYmxlLCBjb21tZW50IGl0IGNsZWFybHkgYW5kIGlmIHBvc3NpYmxlIGFkZCBhIHRlc3QKKyAgICAgICB0byByYWlzZSBhIGNvbXBpbGUgb3IgcnVudGltZSBlcnJvciBpZiB0aGUgYXNzdW1wdGlvbiBpcyBub3QgbWV0LgorCisKK1N0eWxlCistLS0tLQorICAgIEFsbCBtb2R1bGVzICguYy1maWxlcykgaGF2ZSB0byBoYXZlIHRoZWlyIGludGVyZmFjZSBpbiBhbiBhY2NvbXBhbmluZworICAgIC5oLWZpbGUuIFRoZSBoZWFkZXIgZmlsZSBtdXN0IGJlIGd1YXJkZWQgYWdhaW5zdCByZXBlYXRlZCBpbmNsdXNpb24KKyAgICB3aXRoIHRoZSBub3JtYWwKKyAgICAgICAgI2lmbmRlZiBIRUFERVJOQU1FX0gKKyAgICAgICAgI2RlZmluZSBIRUFERVJOQU1FX0ggMQorICAgICAgICAgIC4uLgorICAgICAgICAjZW5kaWYgLyogSEVBREVSTkFNRV9IICovCisgICAgY29uc3RydWN0LiBUbyB1c2UgYSBtb2R1bGUsIGl0cyBoZWFkZXJmaWxlIG11c3QgYmUgaW5jbHVkZWQgLSBubyByYW5kb20KKyAgICAnZXh0ZXJuJyBkZWNsYXJhdGlvbnMuCisKKyAgICBFdmVyeSBtb2R1bGUgbXVzdCBpbmNsdWRlICJkcml2ZXIuaCIgd2hpY2ggaW4gdHVybiBpbmNsdWRlcyB0aGUKKyAgICBwb3J0YWJpbGl0eSBoZWFkZXJzIGFuZCBwcm92aWRlcyBjb21tb24gZGVmaW5lcy4KKworICAgIFVzZSB0aGUgZHJpdmVyLXByb3ZpZGVkIHR5cGVzIGFuZCBtYWNyb3MgbGlrZSBCb29sIG9yIHBfaW50LgorCisgICAgQ29kZSBzaG91bGQgYmUgd3JpdHRlbiBkZWZlbnNpdmVseSBhbmQgcmVhZGFibGUuIFRoaXMgaXMgbm90IHRoZSBJT0NDQy4KKworICAgIE5vIG1hZ2ljIG51bWJlcnMgLSB1c2UgI2RlZmluZXMgdG8gZ2l2ZSB0aGVtIG5hbWVzLgorCisgICAgQWRkIHNhbml0eSBjaGVja3Mgd2hlcmUgdXNlZnVsLiBJZiB0aGUgY2hlY2tzIGFyZSBjb3N0bHksIGVuY2xvc2UKKyAgICB0aGVtIGluIGEgI2lmZGVmIERFQlVHLi4uI2VuZGlmIGJyYWNrZXQuCisKKyAgICBDb21tZW50IHF1ZXN0aW9uYWJsZSBjb2RlIG9yIG9wcG9ydHVuaXRpZXMgZm9yIHBvc3NpYmxlIGV4dGVuc2lvbnMgd2l0aCBhCisgICAgJ1RPRE86IC4uLicgY29tbWVudC4gRm9yIG11bHRpbGluZSBjb21tZW50cywgdXNlICdUT0RPOjonIG9uIHRoZSBzZWNvbmQKKyAgICBhbmQgZm9sbG93aW5nIGxpbmVzICh0aGlzIG1ha2VzIHJlYWRpbmcgYSBncmVwIGVhc2llcikuCisKKyAgICBDb21tZW50IHRlbXBvcmFyeSBkZWJ1ZyBjb2RlIHdpdGggYSAnREVCVUc6JyBjb21tZW50LiBTaW1pbGFyLCBkZWJ1ZworICAgIG91dHB1dCBzaG91bGQgYWx3YXlzIGJlZ2luIHdpdGggJ0RFQlVHOicuCisKKyAgICBWYXJpYWJsZSBpZGVudGlmaWVycyBzaG91bGQgc3RhcnQgd2l0aCBhIGxvd2VyY2FzZSBsZXR0ZXIsIGZ1bmN0aW9uCisgICAgaWRlbnRpZmllcnMgbWF5IHN0YXJ0IHdpdGggdXBwZXIgb3IgbG93ZXJjYXNlLCBjb25zdGFudCBpZGVudGlmaWVycworICAgIHNob3VsZCBzdGFydCB3aXRoIGFuIHVwcGVyY2FzZSBsZXR0ZXIuIE1hY3JvIGlkZW50aWZpZXJzIHNob3VsZCBiZQorICAgIGFsbCBVUFBFUkNBU0UsIG90aGVyIGlkZW50aWZpZXJzIG1heSBiZSB1bmRlcl9zY29yZWQgb3IgU2t1ZGx5Q2Fwcy4KKyAgICBIdW5nYXJpYW4gbm90YXRpb24gaXMgYWNjZXB0ZWQgb25seSBpbiBhIHZlcnkgbGlnaHQgZm9ybTogcEZvbyBmb3IKKyAgICBwb2ludGVycywgcHBGb28gZm9yIHBvaW50ZXIgdG8gcG9pbnRlcnMsIGlGb28gZm9yIGludGVnZXIgdHlwZXMsCisgICAgc0ZvbyBmb3Igc3RyaW5nIHBvaW50ZXJzLCBhRm9vIGZvciBjb21wbGV4IHR5cGVzIC0geW91IGdldCB0aGUKKyAgICBpZGVhLiBCdXQgbm8gYWxwenNGb28gYW5kIGZyaWVuZHMuCisKKyAgICBmX3h4eCgpIGZ1bmN0aW9uIG5hbWVzIGFyZSByZXNlcnZlZCBmb3IgZWZ1biBpbXBsZW1lbnRhdGlvbnMuCisgICAgdHlwZWRlZidkIHR5cGVuYW1lcyBzaG91bGQgZW5kIGluIF90IChlLmcuICdtYXBwaW5nX3QnKSwgc3RydWN0CisgICAgbmFtZXMgc2hvdWxkIGVuZCBpbiBfcyAoZS5nLiAnc3RydWN0IGluc3Ryc19zJykuCisKKyAgICBJbmRlbnRhdGlvbiBpcyA0IHNwYWNlcyBwZXIgbGV2ZWwuIE5vIHRhYiBjaGFyYWN0ZXJzIGFueXdoZXJlIQorCisgICAgVGhlIGluZGVudGF0aW9uIHN0eWxlIGlzIGEgdmFyaWFudCBvZiB0aGUgJ0FsbG1hbiBzdHlsZSc6CisKKyAgICAgICAgaWYgKGZvbykKKyAgICAgICAgeworICAgICAgICAgICAgLi4uYm9keS4uLgorICAgICAgICB9IC8qIGlmIChmb28pICovCisKKyAgICBOb3RlIHRoZSBjb21tZW50IGF0IHRoZSBjbG9zaW5nIGJyYWNlIQorCisgICAgT25lIGxpbmUgYm9kaWVzIG1heSBiZSB3cml0dGVuIGFzCisKKyAgICAgICAgaWYgKGZvbykgYm9keTsKKworICAgIG9yCisKKyAgICAgICAgaWYgKGZvbykKKyAgICAgICAgICAgIGJvZHk7CisKKyAgICBfaWZfIGl0IGltcHJvdmVzIHRoZSByZWFkYWJpbGl0eS4KKworICAgIFNpbWlsYXIsIHRoZSB0eXBpY2FsIGxheW91dCBvZiBhIGZ1bmN0aW9uIGlzOgorCisgICAgICAgIHN0YXRpYyBpbnQKKyAgICAgICAgZnVuY3Rpb25fbmFtZSAoIGFyZzEgLCBhcmcyKQorCisgICAgICAgIC8qIFR3aWRkbGUgPGFyZzE+IHdpdGggPGFyZzI+IGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KKyAgICAgICAgICovCisKKyAgICAgICAgeworICAgICAgICAgICAgLi4uLgorICAgICAgICB9IC8qIGZ1bmN0aW9uX25hbWUoKSAqLworCisgICAgSWYgYW4gZXhwcmVzc2lvbiAoYXJndW1lbnQgbGlzdCwgLi4uKSBleHRlbmRzIG92ZXIgc2V2ZXJhbCwgdGhlIGZpcnN0CisgICAgbGl0ZXJhbCBlbGVtZW50IG9uIGEgbGluZSBzaG91bGQgYmUgYW4gb3BlcmF0b3Igb3Igc3ludGFjdGljYWwgbWFya2VyOgorCisgICAgICAgIGlmIChjb25kaXRpb24xCisgICAgICAgICAmJiAoICAgY29uZGl0aW9uMgorICAgICAgICAgICAgIHx8IGNvbmRpdGlvbjMpCisgICAgICAgICAgICkKKworICAgICAgICBwcmludGYoICIuLi4iCisgICAgICAgICAgICAgICwgYXJnMSwgYXJnMiwgYXJnMworICAgICAgICAgICAgICApOworCisgICAgQmUgZ2VuZXJvdXMgd2l0aCB3aGl0ZXNwYWNlIC0gYm90aCBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbC4KKworICAgIFsgVGhlIHJlYXNvbmluZyBiZWhpbmQgdGhpcyBzdHlsZSBpcyB0byB1c2UgdGhlIGxhbmd1YWdlIGVsZW1lbnRzCisgICAgICB0byBjcmVhdGUgc3Ryb25nIHZpc3VhbCBzdHJ1Y3R1cmVzIGZvciB0aGUgZXllcyB0byBmb2xsb3cuIEJ5IGRvaW5nIHNvLAorICAgICAgdGhlIHN0cnVjdHVyZSBvZiB0aGUgcHJvZ3JhbSBiZWNvbWVzIG9idmlvdXMgd2l0aG91dCBtdWNoCisgICAgICBjb25zY2lvdXMgdGhvdWdodC4KKyAgICBdCisKKworQ29tbWVudGluZworLS0tLS0tLS0tLQorICAgIFRoZSBjb21tZW50cyBhbHNvIGZvbGxvdyB0aGUgaWRlYSBvZiBnaXZpbmcgc3Ryb25nIHZpc3VhbCBjbHVlcyBvZgorICAgIGhvdyB0aGUgcHJvZ3JhbSBpcyBzdHJ1Y3R1cmVkLgorCisgICAgSG9yaXpvbnRhbCBsaW5lcyBzaG91bGQgYmUgY3JlYXRlZCBhcworCisgICAgICAgIC8qLS0tLS0tLi4uLS0tLS0tLSovCisgICAgICAgIC8qPT09PT09Li4uPT09PT09PSovCisgICAgICAgIC8qIC0gLSAtLi4uIC0gLSAtICovCisKKyAgICBUaGUgJy0tLScgbGluZSBpcyB0aGUgbm9ybWFsIHNlcGFyYXRvciBiZXR3ZWVuIHRoZSBjb21wb25lbnRzIG9mIGEKKyAgICBzb3VyY2UgZmlsZSAoaW5jbHVkZXMsIHZhcmlhYmxlIGRlY2xhcmF0aW9ucywgbWFjcm8gZGVjbGFyYXRpb25zLAorICAgIHRoZSBzZXBhcmF0ZSBmdW5jdGlvbnMpLiBUaGUgJz09PScgbGluZSBjYW4gYmUgdXNlZCB0byBzZXBhcmF0ZQorICAgIGxhcmdlciBzZWN0aW9ucyBvZiBhIHNvdXJjZSBmaWxlIChlLmcuIHRoZSBsb3dsZXZlbCByb3V0aW5lcyBmcm9tCisgICAgdGhlIGVmdW4gaW1wbGVtZW50YXRpb25zKS4gJy0gLScgbGluZXMsIHdoaWNoIHVzYWxseSBzcGFuIGxlc3MgdGhhbgorICAgIHRoZSB3aG9sZSBsaW5lLCBjYW4gYmUgdXNlZCB0byBzdWJkaXZpZGUgbGFyZ2UgZnVuY3Rpb25zICh0aG91Z2ggdGhlbgorICAgIGl0J3Mgb2Z0ZW4gYmV0dGVyIHRvIHNwbGl0IHRoZSBmdW5jdGlvbiBpbnRvIHNldmVyYWwgc21hbGwgb25lcykuCisKKyAgICBBICcqKionIGxpbmUgaXMgcmVzZXJ2ZWQgZm9yIHRoZSBlbmQgb2YgZXZlcnkgc291cmNlIGZpbGUuCisKKyAgICBBICcvKiAtLS0gU3Vic2VjdGlvbiAtLS0gKi8nIGlzIGFsc28gZ29vZCB0byBzZXBhcmF0ZSBzdWJzZWN0aW9ucy4KKworICAgIFZlcnRpY2FsIGxpbmVzIGFyZSB0byBiZSBjb25zdHJ1Y3RlZCBhcworCisgICAgICAvKgorICAgICAgICoKKyAgICAgICAqLworCisgICAgTm8gYm94IGNvbW1lbnRzLgorCisgICAgRXZlcnkgZnVuY3Rpb24gbXVzdCBoYXZlIGEgaGVhZCBjb21tZW50IGV4cGxhaW5pbmcgdGhlIG1lYW5pbmcKKyAgICBvZiB0aGUgYXJndW1lbnRzLCB3aGF0IHRoZSBmdW5jdGlvbiBkb2VzLCBhbmQgdGhlIHBvc3NpYmxlIHJlc3VsdHMuCisgICAgRm9yIGVmdW4gaW1wbGVtZW50YXRpb25zLCB0aGlzIGNvbW1lbnQgc2hvdWxkIGJlIGlkZW50aWNhbCB0byB0aGUKKyAgICBtYW4gcGFnZS4KKworICAgIFdpdGhpbiBhIGZ1bmN0aW9uLCBldmVyeSB2YXJpYWJsZSBzaG91bGQgYmUgY29tbWVudGVkIGFzCisKKyAgICAgICBpbnQgZm9vOyAgLyogc2hvcnQgY29tbWVudCAqLworICAgICAgIGludCBiYXI7CisgICAgICAgICAvKiBsb25nIGNvbW1lbnQgd2hpY2ggZG9lc24ndCBmaXQgb24gb25lIGxpbmUuCisgICAgICAgICAgKi8KKworICAgIFRoZSBtYWpvciBzdGVwcyBpbiBhIGZ1bmN0aW9uIHNob3VsZCBiZSBwcmVjZWVkZWQgYnkgYSBjb21tZW50CisgICAgZXhwbGFpbmluZyB0aGVtLiBBbHNvLCB3aGVyZXZlciBhIGNyaXRpY2FsIGRlc2lnbiBkZWNpc2lvbiBoYXMKKyAgICBiZWVuIG1hZGUsIGEgY29tbWVudCBzaG91bGQgbGluZSBvdXQgdGhlIHdoYXRzIGFuZCB3aHlzOgorCisgICAgICAgIC8qIER1cGxpY2F0ZSB0aGUgc3RvcmVkIGFyZ3VtZW50cyBmb3IgdGhlIGZ1bmN0aW9uIGNhbGwuCisgICAgICAgICAqIChJdCdzIHRlbXB0aW5nIHRvIHVzZSB0aGUgc3RvcmVkIGFyZ3VtZW50cyBkaXJlY3RseQorICAgICAgICAgKiAgaW4gdGhlIGxhc3QgcGFzczsgaG93ZXZlciBpdCdzIG5vdCBndWFyYW50ZWVkIHRoYXQKKyAgICAgICAgICogIHRoZSBsYXN0IHBhc3MgYWN0dWFsbHkgY29tZXMgdGhpcyBmYXIuKQorICAgICAgICAgKi8KKworCisgICAgQSB0eXBpY2FsIGZpbGUgbGF5b3V0LCBjb21tZW50d2lzZSwgbG9va3MgbGlrZSB0aGlzOgorCisgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAqIEdhbWVkcml2ZXIgQm91bmNpbmcgbW9kdWxlLgorICAgICAgICAgKgorICAgICAgICAgKiA8cmVzZXJ2ZWQgZm9yIGZ1dHVyZSBjb3B5cmlnaHQgbm90aWNlPgorICAgICAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgKiAnQmlnIHBpY3R1cmUnIGRlc2NyaXB0aW9uIG9mIHRoZSBtb2R1bGUgYW5kIGl0cworICAgICAgICAgKiByZWxhdGlvbiB0byB0aGUgb3RoZXIgZ2FtZWRyaXZlciBwYXJ0cy4KKyAgICAgICAgICoKKyAgICAgICAgICogVHJpY2t5IGRlc2lnbiBkaXNjdXNzaW9ucyBhbHNvIGJlbG9uZyBpbiBoZXJlLgorICAgICAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgKi8KKworICAgICAgICAjaW5jbHVkZSAiZHJpdmVyLmgiCisgICAgICAgICNpbmNsdWRlICJ0eXBlZGVmcy5oIgorCisgICAgICAgICNpbmNsdWRlIDxzdGRsaWIuaD4KKworICAgICAgICAjaW5jbHVkZSAiYm91bmNlLmgiCisgICAgICAgICNpbmNsdWRlICJiYWNrZW5kLmgiCisKKyAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAgICAgLyogLS0tIFVzZXIgaW5mb3JtYXRpb24gLS0tICovCisgICAgICAgIGludGVyYWN0aXZlX3QgKmFsbF9ib3VuY2Vyc1tNQVhfUExBWUVSU107CisKKyAgICAgICAgLyogLS0tICBTdGF0aXN0aWNzIC0tLSAqLworCisgICAgICAgIHBfaW50IG51bWJlcl9vZl9jYWxsczsKKworICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAgICAgdm9pZAorICAgICAgICBhZGRfYm91bmNlciAoaW50ZXJhY3RpdmVfdCAqYm91bmNlcikKKworICAgICAgICAvKiBUaGlzIGZ1bmN0aW9uIGFkZHMgPGJvdW5jZXI+IHRvIHRoZSBhbGxfYm91bmNlcnNbXS4KKyAgICAgICAgICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpOyAgLyogc2VhcmNoIGluZGV4ICovCisKKyAgICAgICAgICAgIC4uLi4KKyAgICAgICAgfSAvKiBhZGRfYm91bmNlcigpICovCisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL2RvYy9kcml2ZXIvY29tbWFuZGxpbmUgYi9kb2MvZHJpdmVyL2NvbW1hbmRsaW5lCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMTk3ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZHJpdmVyL2NvbW1hbmRsaW5lCkBAIC0wLDAgKzEsNjAgQEAKK05BTUUKKwljb21tYW5kbGluZQorCitERVNDUklQVElPTgorCVRoZSBkcml2ZXIgdW5kZXJzdGFuZHMgc2V2ZXJhbCBjb21tYW5kIGxpbmUgb3B0aW9ucyBhbmQKKwlhcmd1bWVudHMuCisKKwktZjxzdHJpbmc+OiBXaGVuIHRoZSBtYXN0ZXIgb2JqZWN0IGlzIGxvYWRlZCBhbmQgZnVsbHkKKwkJICAgIG9wZXJhdGlvbmFsIGFmdGVyIHN0YXJ0dXAsIHRoZSBmdW5jdGlvbiBmbGFnKCkKKwkJICAgIHdpdGggYXJndW1lbnQgc3RyaW5nIGlzIGFwcGxpZWQgdG8gdGhlIG1hc3RlcgorCQkgICAgb2JqZWN0IGZvciBlYWNoIG9jY3VyZW5jZSBvZiAtZiBpbiB0aGUgY29tbWFuZCBsaW5lLgorCisJLW8JICA6IHJ1biBpbiBjb21wYXQgbW9kZSAodGh1cyBzb21ldGltZXMgYWxzbyBjYWxsZWQKKwkJICAgIC1vIG1vZGUpLCBpbnN0ZWFkIG9mIG5hdGl2ZSBtb2RlLiBOb3RlOiB0aGUgZmxhZworCQkgICAgaXMgb2Jzb2xldGUgYnkgbm93LCB0aGUgZHJpdmVyIG11c3QgYmUgY29tcGlsZWQKKwkJICAgIHdpdGggdGhlIGFwcHJvcHJpYXRlIGRlZmluaXRpb25zIGluIHRoZSBjb25maWcuaAorCQkgICAgaW5zdGVhZC4KKworCS1jCSAgOiB0cmFjZSBjb21waWxhdGlvbnMuCisKKwktRHN5bWJvbCAgOiBHbG9iYWxseSBwcmUtI2RlZmluZSBzeW1ib2wgZm9yIHByZXByb2Nlc3Nvci4KKworCS1ECSAgOiB3aXRob3V0IHN5bWJvbCwgdGhpcyBsb2dzIHNwZWNpZmljIHRyYWNlIG1lc3NhZ2VzCisJCSAgICB0byAvbG9nL0RfVFJBQ0UgKGlmIHRoZSBkcml2ZXIgd2FzIGNvbXBpbGVkIGZvciBpdCkKKworCS1lCSAgOiBUaGUgbnVtYmVyIG9mIG9jY3VyZW5jZXMgb2YgdGhlIC1lIGZsYWcgaXMKKwkJICAgIHBhc3NlZCBhcyBhcmd1bWVudCB0byB0aGUgZXBpbG9nKCkgZnVuY3Rpb24KKwkJICAgIGluIHRoZSBtYXN0ZXIgYXQgc3RhcnR1cCB0aW1lLgorCisJLU4JICA6IERvbid0IHN0YXJ0IHRoZSBlcnEgZGVtb24uCisKKwktTTxtYXN0ZXI+OiBwcm92aWRlIGEgZGlmZmVyZW50IG5hbWUgZm9yIHRoZSBtYXN0ZXIgb2JqZWN0LgorCisJLW08ZGlyPgkgIDogcHJvdmlkZSBhIGRpZmZlcmVudCBtdWRsaWIgZGlyZWN0b3J5LgorCisJLXJ1PHNpemU+IDogc2V0IHRoZSBzaXplIG9mIHRoZSByZXNlcnZlZCB1c2VyIG1lbW9yeS4KKwktcm08c2l6ZT4gOiBzZXQgdGhlIHNpemUgb2YgdGhlIHJlc2VydmVkIG1hc3RlciBtZW1vcnkuCisJLXJzPHNpemU+IDogc2V0IHRoZSBzaXplIG9mIHRoZSByZXNlcnZlZCBzeXN0ZW0gbWVtb3J5LgorCisJLUU8Y29zdD4gIDogc2V0IHRoZSBtYXhpbXVtIGFsbG93ZWQgZXZhbHVhdGlvbiBjb3N0LgorCisJLS1tYXhfbWFsbG9jZWQgOiBzZXQgbWF4aW11bSBzaXplIG9mIG1hbGxvY2FibGUgbWVtb3J5IGNodW5rcy4KKwktLW1heF9zbWFsbF9tYWxsb2NlZCA6IHNldCBtYXguIHNpemUgb2YgbWFsbG9jYWJsZSBtZW1vcnkgY2h1bmtzLgorCisJLXU8cG9ydD4gOiBzZXQgdGhlIFVEUCBwb3J0IG51bWJlciBmb3IgSU1QIGNvbW11bmljYXRpb24uCisKKwktdAkgOiBkaXNhYmxlIGhlYXJ0X2JlYXQgYW5kIHJlc2V0LgorCisJLWQJIDogcnVuIHdpdGggZGVidWcuCisKKwktczx0aW1lPiA6IFNldCB0aGUgdGltZSBiZXR3ZWVuIHN3YXBvdXQgYXR0ZW1wdHMuIC0xIG1lYW5zCisJCSAgIGRvbid0IHN3YXAuCisKKwkteQkgOiBJZiB0aGUgZHJpdmVyIGhhcyBiZWVuIGNvbXBpbGVkIHdpdGggWVlERUJVRywKKwkJICAgdGhpcyB3aWxsIGVuYWJsZSBkZWJ1ZyBvdXRwdXQgZm9yIHRoZSBMUEMgY29tcGlsZXIuCisKKwk8bnVtYmVyPiA6IHRoZSBUQ1AgcG9ydCBudW1iZXIgdG8gdXNlIGZvciB1c2VyIGNvbm5lY3Rpb25zLgorCitTRUUgQUxTTworCWZsYWcoTSksIGVwaWxvZyhNKSwgbmF0aXZlKEMpLCBpbXAoQykKZGlmZiAtLWdpdCBhL2RvYy9kcml2ZXIvY29weXJpZ2h0LWlzc3VlIGIvZG9jL2RyaXZlci9jb3B5cmlnaHQtaXNzdWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYwODZhNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kcml2ZXIvY29weXJpZ2h0LWlzc3VlCkBAIC0wLDAgKzEsMjUyIEBACitUaGUgcXVlc3Rpb24gb2YgdGhlIENvcHlyaWdodCBhbmQgVGVybXMgb2YgVXNlIGZvciB0aGUgZHJpdmVyIGlzIGFuIG9sZAorb25lLiBIZXJlIGlzIHdoYXQgSSBjb3VsZCBzYWx2YWdlIGZyb20gdGhlIGFteWxhYXItdXNlcnMgbWFpbGluZyBsaXN0LgorSW1wb3J0YW50IGlzIEphY29iJ3MgbWFpbCBJIHJlY2VpdmVkIGluIDE5OTkgd2hpY2ggZXNzZW50aWFsbHkgY2FzdHMKK3RoZSBjdXJyZW50IGNvcHlyaWdodCB0ZXJtcyBpbiBzdG9uZS4KKworICAtLSBMYXJzIChub3QgL0xhcnMpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0RhdGU6IFNhdCwgMTMgTm92IDE5OTMgMDM6MTE6MjkgKzAxMDAgKE1FVCkKK0Zyb206IGFteWxhYXJAbWVvbHlvbi5oYW5zZS5kZSAoSm9lcm4gUmVubmVja2UpCitTdWJqZWN0OiBMUG11ZCBDb3B5cmlnaHQKK1RvOiBidXNleUB1eDEuY3NvLnVpdWMuZWR1IChidXNleSBhbmRyZXcpLCBsYXJzQGNkLmNoYWxtZXJzLnNlLAorICAgICAgICBjcm9lc0Bzd2kucHN5LnV2YS5ubCwgZ3VzYXJAdW5pd2EudXdhLk9aLkFVLCBkdWVuaW5nQGlici5jcy50dS1icy5kZSwKKyAgICAgICAgamFjb2JAY2QuY2hhbG1lcnMuc2UsIHJfYmVocmVuQGluZm9ybWF0aWsudW5pLWtsLmRlLAorICAgICAgICBtdWRAYWxpamt1MDUuZWR2ei51bmktbGluei5hYy5hdCwgYWxjYW1hbkBjcy50dS1iZXJsaW4uZGUKKworTW90aXZhdGlvbiBvZiB0aGlzIGxldHRlcjoKK1RoZXJlIHNlZW1zIHRvIGJlIGEgcG90ZW50aWFsIGZvciBtdWRzIHRoYXQgcnVuIG9uIGRlZGljYXRlZCBtYWNoaW5lcwordGhhdCBjaGFyZ2UgZmVlcyBmcm9tIHBsYXllciB0byBtYWtlIHRoZSBtdWQgZWNvbm9taWNhbGx5IGZlYXNpYmxlLgorVGhlIENvcHlyaWdodCBmaWxlIHNheXMgdGhhdCBMUG11ZCBjYW4gZnJlZWx5IHVzZWQgaWZmIGl0IGlzIG5vdCBmb3IKK21vbmV0YXJ5IGdhaW4uIE5vdyB0aGUgZGViYXRlIHdoYXQgY29uc3RpdHV0ZXMgbW9uZXRhcnkgZ2FpbiBhbmQgaWYKK2FuIGluZGl2aWR1YWwgbGljZW5zZSBpcyBhbiBsaWNlbnNlIHRvIGJyZWFrIHRoZSBjb3B5cmlnaHQsCitpcyBhbiBpbnRlcnByZXRhdGlvbiBvZiB0aGUgbGljZW5zZSBpbiBDb3B5cmlnaHQgb3IgZ2l2ZXMgcmlnaHRzCitpbmRlcGVuZGVudCB0aGUgcmVzdHJpY3Rpb25zIGluIENvcHlyaWdodCBoYXMgYmVjb21lIGEgbm9ybWFsIGZsYW1lCit3YXIgaW4gdGhlIHJlYy5nYW1lcy5tdWQuKiBncm91cHMuIFRoYXQgaXMgdG8gc2F5LCBvbmUgb2YgdGhlIHdvcnN0Cit0aGlua2FibGUuCisKK1RvIGFsbG93IG11ZHMgdG8gY2hhcmdlIGZlZXMgdG8gY292ZXIgY29zdHMsIHdpdGhvdXQgZ29pbmcgdGhyb3VnaAorc3VjaCBkZWJhdGVzIGV2ZXJ5IHRpbWUsIEkgc3VnZ2VzdCB0byBhbWVuZCB0aGUgQ29weXJpZ2h0IGZpbGUKK3dpdGggdGVybXMgdW5kZXIgd2l0Y2ggc3VjaCBhIG11ZCBpcyBjb25zaWRlcmVkIHRvIGNvbXBseSB0byB0aGUKKydubyBtb25ldGFyeSBnYWluIGNsYXVzZScgLgorCitFeHBsYW5hdGlvbiBvZiB0aGUgcmVjaXBpZW50IGxpc3QgYW5kIHNvbWUgaW5kaXZpZHVhbCBtZXNzYWdlczoKKworQnVzZXkgQW5kcmV3OiB3YW50cyB0byBzZXQgdXAgYSBtdWQgdGhhdCBjaGFyZ2VzIGZlZXMgdG8gY292ZXIgY29zdHMuCisgIElmIHRoZSBiZWxvdyBydWxlcyB3b24ndCBtYWtlIGl0IGludG8gdGhlIENvcHlyaWdodCwgeW91IGNhbiByZWdhcmQgdGhpcworICBhcyBhIGxpY2Vuc2UgLSBvZiBjb3Vyc2Ugb25seSBmb3IgdGhlIGNvZGUgd3JpdHRlbiBieSBtZS4KK0xhcnMgUGVuc2p8OiBvcmlnaW5hbCBhdXRob3IuCisgIFBsZWFzZSBmb3J3YXJkIHRoaXMgbGV0dGVyIHRvIG90aGVyIGF1dGhvcnMgdGhhdCBoYXZlIGNvbnRyaWJ1dGVkIHRvIDMuMS4yCisgIHdobyBoYXZlIGEgc2F5IGluIHRoZSBjb3B5cmlnaHQuCitGZWxpeCBBLiBDcm9lczogd3JvdGUgdGhlIG5vbi1jb3JydXB0aW5nIGluZGVudGF0aW9uIGNvZGUgZm9yIGVkLgorU2VhbiBBIFJlaXRoOiB3cm90ZSBNdWQtc3ByaW50ZigpIC4KK0xhcnMgRHVlbmluZzogd3JvdGUgdGhlIEFtaWdhIHBvcnQuCitSZWltZXIgQmVocmVuZHM6IHdyb3RlIG1lcmdlc29ydCBiYXNlZCBzb3J0X2FycmF5KCkgLgorSGVycDogd3JvdGUgZ2V0X29iamVjdF9hY3Rpb25zKCkgLgorSmFjb2IgSGFsbGVuOiBpcyBvbmUgb2YgdGhlIHBlb3BsZSBpbnZvbHZlZCB3aXRoIHRoZSBDRCBkcml2ZXI7IHRoZSBlbWFpbAorIGFkZHJlc3Mgd2FzIGluIHRoZSBuZXdzIHJlY2VudGx5Li4uCisgIFBsZWFzZSBmb3J3YXJkIHRoaXMgbGV0dGVyIHRvIHRoZSBwZXJzb24gaG9sZGluZyB0aGUgY29weXJpZ2h0IGZvciB0aGUKKyAgVURQIGNvbm5lY3Rpdml0eSh1bmxlc3MgaXQncyB5b3Vyc2VsZiA6LSkgLgorQWxleGFuZGVyIFdlaWR0OgorICBQbGVhc2UgdHJ5IHRvIGZvcndhcmQgdGhpcyBsZXR0ZXIgdG8gbXkgYnJvdGhlci4uLgorCitJIGhvcGUgdG8gZmluYWxseSBnZXQgdGVybXMgd2hpY2ggYWxsIGF1dG9ycyBjYW4gYWdyZWUgb24gdGhhdCBjYW4gYmUgaW5jbHVkZWQKK2ludG8gdGhlIENvcHlyaWdodCBmaWxlLiBJIHN1Z2dlc3QgZ3JvdXAgcmVwbGllcywgc28gdGhhdCB3ZSBjYW4gZ2V0IHNvbWUKK2tpbmQgb2YgZGlzY3Vzc2lvbiBnb2luZyAodW5sZXNzIHRoZXJlIGlzIGltbWVkaWF0ZSBhcHByb3ZhbCBmcm9tIGFsbAorYXV0aG9ycyA6LSkgLiBXaGVuIHlvdSBoYXZlIG9iamVjdGlvbnMsIHBsZWFzZSB0cnkgdG8gcG9pbnQgb3V0IHdoYXQgaXMKK3dyb25nIHdpdGggdGhlc2UgdGVybXMuIEV2ZW4gYmV0dGVyIHdvdWxkIGl0IGJlIGlmIHlvdSBoYWQgYSBzb2x1dGlvbgordG8gdGhlIHByb2JsZW0uCisKKyAgICAgICAgSm9lcm4gUmVubmVja2UgKEFteWxhYXIpCisKK1Byb3Bvc2VkIFRlcm1zOgorMS4gQSBMUG11ZCBtYXkgY2hhcmdlIGZlZXMgZnJvbSBwbGF5ZXJzIHRvIGNvdmVyIHJ1bm5pbmcgYW5kIG1hY2hpbmUgY29zdHMuCisyLiBSdW5uaW5nIGNvc3RzIGluIHRoZXNlIHRlcm1zIGFyZSB0aGUgY29zdCBmb3IgdGhlIG5ldHdvcmsgY29ubmVjdGlvbiwKKyAgIGVsZWN0cmljIHBvd2VyIHRvIG9wZXJhdGUgdGhlIGhvc3QgbWFjaGluZSwgd2VhciBvZiBiYWNrdXAgbWVkaWEsCisgICByZXBhaXIgY29zdHMgZm9yIHRoZSBob3N0IG1hY2hpbmUsIGFuZCBjb3N0IGZvciBhIGJhbmsgYWNjb3VudC4KKyAgIEZvciB0aGUgY29zdHMgb2YgYSBiYW5rIGFjY291bnQgdG8gYmUgY29uc2lkZXJlZCBydW5udW5nIGNvc3RzLAorICAgdGhleSBtdXN0IG5vdCBoYWJlIGJlZW4gY29uc2lkZXJlZCBhY2NvcmRpbmcgdG8gOC4gLCBhbmQgdGhlCisgICBpbnN0aXR1dGUgaGFzIHRvIGJlIGNob29zZW4gd2l0aCBhdCBsZWFzdCB1c3VhbCBjb25zaWRlcmF0aW9uIG9uCisgICB0ZXJtcyBhbmQgY29zdHMgb2YgdGhlIGFjY291bnQgYW5kIHRoYXQgdGhlcmUgbXVzdCBiZSBubyBhZmZpbGlhdG9uCisgICB3aXRoIHRoZSBpbnN0aXR1dGUuCiszLiBNb25leSB0byBjb3ZlciBydW5uaW5nIGNvc3RzIGZvciBhIG1heGltdW0gb2YgMTggbW9udGggbWF5IGJlIGFjY3VtdWxhdGVkCisgICBpbiBhZHZhbmNlIGZyb20gZmVlcyB0byBzbW9vdGhlIGZsdWN0YXRpb24gYW5kIHRvIGVuc3VyZSBzdGFiaWxpdHkgb2YKKyAgIHRoZSBtdWQuIFRoZSBzcGFyZSBtb25leSBoYXMgdG8gYmUga2VwdCBzZXBhcmF0ZSBmcm9tIHBlcnNvbmFsIG1vbmV5CisgICBhbmQgc2hvdWxkIGJlIGludmVzdGVkIGluIHRydXN0ZWUgaW52ZXN0bWVudCBpZiBsaXF1aWRpdHkgYWxsb3dzLgorICAgSWYgdGhlIG11ZCBpcyBwZXJtYW5lbnRseSBwdXQgZG93biwgdGhpcyBtb25leSBoYXMgdG8gYmUgcmVmb3VuZGVkIHRvIHRoZQorICAgcGxheWVyZXMuCis0LiBNYWNoaW5lIGNvc3RzIGFyZSBjb3N0cyBmb3IgYnV5aW5nLCBpbnN0YWxsYXRpb24gYW5kIHVwZ3JhZGUgb2YgdGhlIGhvc3QKKyAgIG1hY2hpbmUuIFRoZSBjb3N0cyBoYXZlIHRvIGFwcGVhciBvbiBhIGJvbmEgZmlkZSBwdXJjaGFzZSAvIHNlcnZpY2UKKyAgIGNvbnRyYWN0IHdpdGggYSBwZXJzb24vaW5zdGl0dXRpb24gdGhhdCBpcyBub3QgYWZmaWxpYXRlZCB3aXRoIHRoZQorICAgcGVyc29uIHdobyBzZXRzIHVwIHRoZSBtdWQuCisgICBXaGVuIHRoZSBob3N0IG1hY2hpbmUgaXMgcHV0IG91dCBvZiB1c2UsIG9yIHBhcnRzIG9mIGl0IGFyZSByZW1vdmVkIGZvcgorICAgb3RoZXIgdGhhbiB0ZWNobmljYWwgcmVhc29ucywgYXJlIHBhcnRzIGFyZSBub3IgcmUtaW5zZXJ0ZWQgYWZ0ZXIgdGhlCisgICB0ZWNobmljYWwgcmVzb25zIGZvciByZW1vdmFsIGFuZCBub3QgcmUtaW5zZXJ0aW5nIGhhdmUgYmVjb21lIHZvaWQsCisgICB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgbWFjaGluZSB0aGF0IGhhcyBwdXQgb3V0IG9mIHVzZS90aGUgcmVtb3ZlZAorICAgcGFydHMgaXMgdG8gYmUgc3VidHJhY3RlZCBmcm9tIHRoZSBtYWNoaW5lIGNvc3RzLgorICAgSWYgdGh1cyBtb3JlIG1vbmV5IGhhcyBiZWVuIHBhaWQgZm9yIG1hY2hpbmUgY29zdHMgdGhhbiB0aGVyZSBhcmUKKyAgIGN1cnJlbnRseSwgdGhlIHN1cnBsdXMgYW1vdW50IGhhcyB0byBiZSByZWZvdW5kZWQgdG8gdGhlIG11ZCBwbGF5ZXJzLgorNS4gVGhlIG1hY2hpbmUgY29zdCBzaGFyZSBpbiB0aGUgZmVlIG1heSBub3QgYmUgbW9yZSB0aGFuIDEvMjQwMHRoCisgICBvZiB0aGUgbWFjaGluZSBjb3N0cyBwZXIgbW9udGguIElmIHRoZSBtdWQgaGFzIGxlc3MgdGhhbiAxMDAgcGxheWVycywKKyAgIGl0IG1heSBiZSB1cCB0byBtYWNoaW5lIGNvc3RzIC8gMjQgLyBudW1iZXIgb2YgcGxheWVycywgYnV0IG5vdCBtb3JlIHRoYW4KKyAgIDEvMTIwdGggb2YgdGhlIG1hY2hpbmUgY29zdHMgcGVyIG1vbnRoLgorNi4gV2hlbiBtb25leSBoYXMgdG8gYmUgcGF5ZWQgYmFjayB0byB0aGUgbXVkIHBsYXllcnMsIG9ubHkgdGhvc2UgdGhhdAorICAgaGF2ZSBwYXllZCBhdCBsZWFzdCBvbmNlIGEgZmVlIHdpdGhpbiB0aGUgbGFzdCAyNCBtb250aCBhcmUgdG8gYmUKKyAgIGNvbnNpZGVyZWQuIEZvciB0aGVzZSBwbGF5ZXJzLCB0aGUgbW9uZXkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIHJhdGlvCisgICBvZiB0aGUgYWxsIGZlZSBzaGFyZXMgZXZlciBwYXllZCB0byBjb3ZlciBtYWNoaW5lIGNvc3RzLgorNy4gQWxsIHBsYXllcnMgcGF5IGVxdWFsIGZlZXMuCis4LiBCYW5raW5nIGNvc3RzIHRoYXQgaGF2ZSB0byBiZSBwYWlkIGJ5IHRoZSBtdWQgYWRtaW5pc3RyYXRpb24gYW5kIGFyZQorICAgaW1tZWRpYXRlbHkgY29ubmVjdGVkIHRvIGluY29taW5nIG1vbmV5IHRyYW5zYWN0aW9ucyBjYW4gYmUgc3VidHJhY3RlZAorICAgZnJvbSB0aGUgdHJhbnNmZXJyZWQgYW1vdW50IGJlZm9yZSBjb3VudGluZyBpdCBhcyBwYXltZW50IG9mIGZlZXMsCisgICBwcm92aWRlZCB0aGF0IHRoZSBpbnN0aXR1dGUgd2FzIGNob29zZW4gd2l0aCBhdCBsZWFzdCB1c3VhbAorICAgY29uc2lkZXJhdGlvbiBvbiB0ZXJtcyBhbmQgY29zdHMgb2YgdGhlIGFjY291bnQsIGFuZCB0aGF0IHRoZXJlIGlzCisgICBubyBhZmZpbGlhdG9uIHdpdGggdGhlIGluc3RpdHV0ZS4KKzkuIFRoZSBhbW91bnQgb2Ygdm9sdW50YXJ5IGRvbmF0aW9ucyBpcyB1bmxpbWl0ZWQuIEEgZG9uYXRpb24gaXMgbm90CisgICBjb25zaWRlcmVkIHZvbHVudGFyeSBpZiBpdCBpcyBjb25uZWN0ZWQgd2l0aCBzcGVjaWFsIGZlYXR1cmVzIG9yCisgICBmYXZvdXJzIGluIHRoZSBtdWQgb3RoZXIgdGhhbiBhbiBob3VuYXJhcnkgbWVudGlvbmluZyBvZiB0aGUgZG9ub3IsCisgICBvciBpZiB0aGUgZG9ub3IgaXMgbWFkZSB0byBiZWxpZXZlIHRoYXQgc3VjaCBhIGNvbm5lY3Rpb24gZXhpc3RzLgorICAgUmVhc29uYWJsZSBtZWFzdXJlcyBoYXZlIHRvIGJlIHRha2VuIHRoYXQgdGhlcmUgaXMgbm8KKyAgIG1pc3VuZGVyc3RhbmRpbmcgb24gdGhpcyBwb2ludC4KKworQ29tbWVudHM6CiszLiBZb3UgbWF5IG5vdCB1c2UgdGhlIG1vbmV5IG9mIHRoZSBtdWQgdG8gYnJpZGdlIHBlcnNvbmFsIGlubGlxdWlkaXR5LgorICAgRG9uJ3QgZ2FtYmxlIHdpdGggb3RoZXIgcGVyc29ucyBtb25leSwgZS5nLiBpbnZlc3RpbmcgaXQgaW4ganVuayBib25kcy4KKzUuIEZlZXMgc2hvdWxkIG5vdCBiZSBhcmJpdHJhcmlseSByYWlzZWQgc28gdGhhdCBwbGF5ZXJzIGNhbiBiZSBkcml2ZW4KKyAgIG91dC4gSSBjb25zaWRlcmVkIGEgZml4ZWQgbWluaW1hbCBkaXN0cmlidXRlbiBvZiB0aGUgY29zdHMgdG8gYmUKKyAgIHRoZSBiZXN0IG1lYW5zIHRvIGNvZGlmeSB0aGlzLgorICAgQWJzb2x1dGUgZmlndXJlcyBhcmUgYm91bmQgdG8gYmVjb21lIHZvaWQgYnkgaW5mbGF0aW9uLgorNi4gVGhlIDI0IG1vbnRoIHBlcmlvZCBpcyBpbnRyb2R1Y2VkIHRvIGFsbG93IHRvIGVyZWFzZSByZWNvcmRzIG9mCisgICBjbGllbnRzIGFmdGVyIHR3byB5ZWFycywgYW5kIHRvIGtlZXAgb3ZlcmhlYWQgYWZmb3JkYWJsZS4KKzcuIFdlIGRvbid0IHdhbnQgZmF2b3VyaXRlcyB0byBnZXQgYSBmcmVlIGxpZnQsIGFuZCBvdGhlcnMgZ3J1ZGdpbmdseQorICAgcGF5aW5nIGV4dHJhLiBJZiB5b3UgdGhpbmsgc29tZWJvZHkgbmVlZHMgZnJlZSBhY2Nlc3MsIGZpbmQgc29tZW9uZQorICAgd2hvIHBheXMgZm9yIGl0LCBvciBtYWtlIGEgZm91bmQgcGF5ZWQgZnJvbSB2b2x1bnRhcnkgZG9uYXRpb25zLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitEYXRlOiBGcmksIDE5IE5vdiAxOTkzIDE3OjEwOjQ0ICswMTAwIChNRVQpCitGcm9tOiBMYXJzIFBlbnNqfCA8bGFyc0BjZC5jaGFsbWVycy5zZT4KK1N1YmplY3Q6IFJlOiBMUG11ZCBDb3B5cmlnaHQKK1RvOiBhbXlsYWFyQG1lb2x5b24uaGFuc2UuZGUgKEpvZXJuIFJlbm5lY2tlKQorQ2M6IGJ1c2V5QHV4MS5jc28udWl1Yy5lZHUsIGxhcnNAY2QuY2hhbG1lcnMuc2UsIGNyb2VzQHN3aS5wc3kudXZhLm5sLAorICAgICAgICBndXNhckB1bml3YS51d2EuT1ouQVUsIGR1ZW5pbmdAaWJyLmNzLnR1LWJzLmRlLCBqYWNvYkBjZC5jaGFsbWVycy5zZSwKKyAgICAgICAgcl9iZWhyZW5AaW5mb3JtYXRpay51bmkta2wuZGUsIG11ZEBhbGlqa3UwNS5lZHZ6LnVuaS1saW56LmFjLmF0LAorICAgICAgICBhbGNhbWFuQGNzLnR1LWJlcmxpbi5kZQorCitJIGFncmVlIHRoYXQgZml4IG9mIHRoZSBjb3B5cmlnaHQgaXMgbmVlZGVkLiBJIHdvdWxkIHByZWZlciB0byB1c2UgdGhlCitHbnUgQ29weWxlZnQsIGFzIEkgZG9uJ3QgY2FyZSBhbnkgbG9uZ2VyIGlmIGFueW9uZSBtYWtlcyBtb25leSBmcm9tIGl0LiBUaGUKK2ltcG9ydGFudCB0aGluZyBpcyB0aGF0IGl0IGlzIGZyZWUsIHdoaWNoIG1lYW5zIG5vb25lIHdpbGwgYmUgYWJsZSB0byBtYWtlCittdWNoIG1vbmV5IGFueXdheS4KKworQW55IHRob3VnaHRzIGFib3V0IGl0ID8KKworL0xhcnMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRGF0ZTogRnJpLCAxOSBOb3YgMTk5MyAyMDoxNDoxMCArMDEwMCAoTUVUKQorRnJvbTogSmFjb2IgSGFsbGVuIDxqYWNvYkBjZC5jaGFsbWVycy5zZT4KK1N1YmplY3Q6IFJlOiBMUG11ZCBDb3B5cmlnaHQKK1RvOiBhbXlsYWFyQG1lb2x5b24uaGFuc2UuZGUgKEpvZXJuIFJlbm5lY2tlKQorQ2M6IGJ1c2V5QHV4MS5jc28udWl1Yy5lZHUsIGxhcnNAY2QuY2hhbG1lcnMuc2UsIGNyb2VzQHN3aS5wc3kudXZhLm5sLAorICAgICAgICBndXNhckB1bml3YS51d2EuT1ouQVUsIGR1ZW5pbmdAaWJyLmNzLnR1LWJzLmRlLCBqYWNvYkBjZC5jaGFsbWVycy5zZSwKKyAgICAgICAgcl9iZWhyZW5AaW5mb3JtYXRpay51bmkta2wuZGUsIG11ZEBhbGlqa3UwNS5lZHZ6LnVuaS1saW56LmFjLmF0LAorICAgICAgICBhbGNhbWFuQGNzLnR1LWJlcmxpbi5kZQorCis+IEphY29iIEhhbGxlbjogaXMgb25lIG9mIHRoZSBwZW9wbGUgaW52b2x2ZWQgd2l0aCB0aGUgQ0QgZHJpdmVyOyB0aGUgZW1haWwKKz4gIGFkZHJlc3Mgd2FzIGluIHRoZSBuZXdzIHJlY2VudGx5Li4uCis+ICAgUGxlYXNlIGZvcndhcmQgdGhpcyBsZXR0ZXIgdG8gdGhlIHBlcnNvbiBob2xkaW5nIHRoZSBjb3B5cmlnaHQgZm9yIHRoZQorPiAgIFVEUCBjb25uZWN0aXZpdHkodW5sZXNzIGl0J3MgeW91cnNlbGYgOi0pIC4KKworSSByZXByZXNlbnQgZXZlcnlvbmUgaW52b2x2ZWQgaW4gdGhlIENEIGRyaXZlci4gVGhlIFVEUCBzdHVmZiBpcyB0byBiZQorY29uc2lkZXJlZCBwdWJsaWMgZG9tYWluLiBBbGwgb3RoZXIgcGFydHMgYXJlIGNvdmVyZWQgYnkgdGhlIG5vbi1wcm9maXQgY2xhdXNlLgorQ29kZSBvcmlnaW5hdGlvbiBmcm9tIG1lLCBKb2hhbiBBbmRlcnNzb24gKENvbW1hbmRlciksIFJvbm55IFdpa2ggKE1ycHIpLAorTGVubmFydCBBdWd1c3Rzc29uIChNYXJ2aW4pIGlzIGNvdmVyZWQgYnkgaXQuIFdlIGhhdmUgbm8gaW50ZW50aW9uIG9mCithbGxvd2luZyBwZW9wbGUgdG8gY2hhcmdlIG1vbmV5IGZvciB0aGUgdXNhZ2Ugb2Ygb3VyIGRyaXZlciwgb3IgYm9ycm93ZWQKK3BpZWNlcyB0aGVyZW9mLgorV2UgY29uc2lkZXIgdGhlIGFjY2VwdGFuY2Ugb2Ygdm9sb250YXJ5IGRvbmF0aW9ucyBhcyBmYWlyIHByYWN0aWNlLCBhbmQgd2UKK2NhbiBhY2NlcHQgdGhlIGNoYXJnaW5nIGZvciB0aGUgdXNlIG9mIGV4dHJhIGVxdWlwbWVudCBuZWVkZWQgdG8gYWxsb3cKK3Blb3BsZSB0byBhY2Nlc3MgdGhlIG11ZCwgYXMgbG9uZyBhcyB0aGVyZSBpcyBhIHJlYXNvbmFibGUgd2F5IHRvIGFjY2VzcyB0aGUKK211ZCB3aXRob3V0IGJlaW5nIGNoYXJnZWQuIChQcm92aWRpbmcgbW9kZW0gYWNjZXNzIGF0IGEgY29zdCB3aGlsZSBhbGxvd2luZworZnJlZSBhY2Nlc3Mgb3ZlciB0aGUgaW50ZXJuZXQgaXMgYW4gZXhhbXBsZSBvZiBzdWNoIGEgc2V0dXAuKQorCitNeSBwZXJzb25hbCB2aWV3IGlzIHRoYXQgYW4gZWxhYm9yYXRlIHNldHVwIG9mIHRlcm1zIGxpa2UgdGhlIG9uZSBpbiB0aGUKK29yaWdpbmFsIGxldHRlciBpcyB1bnJlYXNvbmFibGUuIEl0IGlzIGRlc2lnbmVkIGZvciBhIHZlcnkgc3BlY2lmaWMgc2V0IG9mCitjaXJjdW1zdGFuY2VzLiBJdCBpcyBpbXBvc3NpYmxlIHRvIGNoZWNrIGFuZCBpdCBpcyB2ZXJ5IGJ1cmVhdWNyYXRpYy4KK0l0IGRvZXMgbm90IGhhdmUgbXkgc3VwcG9ydC4KKworSmFjb2IgSGFsbGVuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0RhdGU6IFNhdCwgMjAgTm92IDE5OTMgMjM6MzU6MTIgKzAxMDAgKE1FVCkKK0Zyb206IE11bHRpIFVzZXIgRHVuZ2VvbiA8bXVkQGFsaWprdTA1LmVkdnoudW5pLWxpbnouYWMuYXQ+CitTdWJqZWN0OiBSZTogTFBtdWQgQ29weXJpZ2h0CitUbzogbGFyc0BjZC5jaGFsbWVycy5zZSAoTGFycyBQZW5zanwpCitDYzogYnVzZXlAdXgxLmNzby51aXVjLmVkdSwgY3JvZXNAc3dpLnBzeS51dmEubmwsIGd1c2FyQHVuaXdhLnV3YS5PWi5BVSwKKyAgICAgICAgZHVlbmluZ0BpYnIuY3MudHUtYnMuZGUsIGphY29iQGNkLmNoYWxtZXJzLnNlLAorICAgICAgICByX2JlaHJlbkBpbmZvcm1hdGlrLnVuaS1rbC5kZSwgYWxjYW1hbkBjcy50dS1iZXJsaW4uZGUKKworTGFycz4gaW1wb3J0YW50IHRoaW5nIGlzIHRoYXQgaXQgaXMgZnJlZSwgd2hpY2ggbWVhbnMgbm9vbmUgd2lsbCBiZSBhYmxlIHRvIG1ha2UKK0xhcnM+IG11Y2ggbW9uZXkgYW55d2F5LgorCitZb3UgYXJlIHNwZWFraW5nIGFib3V0IHRoZSBHRCxjb3JyZWN0ID8gTm9ybWFsbHksIG1hbnkgYSBzaXRlIHVzZXMgYW4gdW5tb2RpZmllZAorR0QgYmFzZWQgdXBvbiB3aGljaCBpcyBhIG1vcmUgb3IgbGVzcyBoZWF2aWx5IG9yIG5vdCBoZWF2aWx5IE11ZGxpYi4gQmFzZWQgdXBvbgordGhpcyBNdWRsaWIgaXMgdGhlIHdvcmsgb2YgdGhlIGB3aXphcmRzJyAuLi4gU29ycnkgZm9yIHJlcGVhdGluZyBrbm93biBzdHVmZi4KKworVGhpcyBtYWtlcyBtb3N0IE11ZHMgZGlmZmVyIGZyb20gZWFjaCBvdGhlci4gU28sIHRoZSBmYWN0IHRoYXQgdGhlIEdEIGl0c2VsZgoraXMgZnJlZSwgZG9lc24ndCBpbXBseSB0aGF0IHlvdSB3b24ndCBtYWtlIG1vbmV5LgorCitBbm90aGVyIHBvaW50IHRvIGFyZ3VlOiBtYWludGFpbmlnIGEgTXVkIHRha2VzIHRpbWUgLi4gYSBMT1Qgb2YgdGltZS4gVXN1YWxseSwKK2RvaW5nIHNvIGlzIG5vdCBmdW4gYXQgYWxsLiBJIGV4cGVyaWVuY2VkIHRoYXQgdGhlIG1vcmUgcGxheWVycyB5b3UgaGF2ZSwgdGhlCitsZXNzIGZ1biBpdCBpcyBmb3JlIHRoZSBhZG1pbnN0cmF0b3JzLiBZb3Ugc3BlbmQgYSBsb3Qgb2YgdGltZSBjb2RpbmcsCitzZWFyY2hpbmcgYW5kIGZpeGluZyBidWdzIC4uLiBhbmQgSSB0aGluaywgdGhpcyBjYW4gYmUgcmVnYXJkZWQgYXMgYQorc2VydmljZSBmb3IgcGxheWVycyAoLi4uIGFuZCBwbGF5ZXJzIHJlYWxseSBjYW4gYmUgYSBwYWluIHNvbWV0aW1lcyAuLi4pCitXb3VsZCBpdCBiZSBsZWdhbCB0byBjaGFyZ2UgbW9uZXkgZm9yIHRoYXQgPworCitBbm90aGVyIHRob3VnaHQ6IEludGVybmV0IE11ZHMuIFRoZXkgcnVuIG9uIGludGVybmV0LCB1c3VhbGx5IG9uIGNvbXB1dGVycworb3duZWQgYnkgYSBzY2hvb2wgb3IgdW5pdmVyc2l0eSwgc29tZSB3aXRoLCBzb21lIHdpdGhvdXQgdGhlIGtub3dsZWRnZSBvZgordGhlIHNpdGUgYWRtaW5zdHJhdG9ycy4gV291bGQgaXQgYmUgbGVnYWwgdG8gY2hhcmdlIG1vbmV5IHdoZW4geW91IHJ1bgorYSBNdWQgb24gZXF1aXBtZW50IG5vdCBvd25lZCBieSB5b3Vyc2VsZiA/IEFuZCwgZXZlbiBpZiB5b3Ugb3duIHRoZSBjb21wdXRlciwKK2RvIHlvdSBwYXkgZm9yIHRoZSBpbnRlcm5ldCBsaW5rID8gSWYgbm90LCBJIGZlYXIgeW91IG11c3Qgbm90IGNoYXJnZSBtb25leQorZm9yIGEgTXVkIHdpdGhvdXQgc3BlYWtpbmcgd2l0aCB0aGUgbmV0d29yayBhZG1pbnN0cmF0b3Igc2luY2UgeW91IGFyZSB1c2luZwordGhlIG5ldHdvcmsgY29tcG9uZW50cyAocm91dGVyL2JyaWRnZXMsIGV2ZW4gY2FibGVzIDotPiAuLi4pIGZvciBmcmVlLgorCitIb3cgZGlmZmljdWx0IGlzIGNoYXJnaW5nIG1vbmV5IGluIEV1cm9wZWFuIE11ZHMgPyBOb3QgdGhhdCBJIHBsYW4KK3RvIGRvIHNvIGZvciBITSAoaXQncyBjbG9zZWQgZm9yIHBsYXllcnMgY3VycmVudGx5IGFueXdheSksIGJ1dCBpc24ndCB0aGVyZSBhCitiaWcgZGlmZmVyZW5jZSBhY2NvcmRpbmcgdG8gdGhlICJhY2NvdW50aW5nIG1lY2hhbmlzbSIgKHVnaCwgYmFkIGVuZ2xpc2ggOi0pCit0aGF0IGlzIHVzZWQgaW4gdGhlIFN0YXRlcyA/IEkgaGVhcmQgdGhhdCBpdCBpcyBtdWNoIG1vcmUgZWFzeSB0byBtYWtlCitmaW5hbmNpYWwgdHJhbnNhY3Rpb25zIHdpdGhpbiB0aGUgU3RhdGVzLiBTbywgSSBzdXNwZWN0IHRoZSAiTXVkIG1vbmV5IGNoYXJnaW5nIgorZGlzY3Vzc2lvbiBhcnJpdmVzIGZyb20gdGhlIFVTIDotKQorCitHcmVldGluZ3MsIEhlcnAgKG11ZEBtdWQudW5pLWxpbnouYWMuYXQpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRnJvbSBqYWNvYkBjZC5jaGFsbWVycy5zZSBTdW4gT2N0IDI0IDE3OjAyOjUzIDE5OTkKK05ld3Nncm91cHM6IHJlYy5nYW1lcy5tdWQuYWRtaW4KK1N1YmplY3Q6IFJlOiBOZXdzZ3JvdXBzCitGcm9tOiBqYWNvYkBjZC5jaGFsbWVycy5zZSAoSmFjb2IgSGFsbGVuKQorRGF0ZTogMjQgT2N0IDE5OTkgMTY6MDI6NTMgR01UCisKK0luIGFydGljbGUgPDM4MGY4MTdkLjM1OTE2NTI4QG5ld3MuZWFydGhsaW5rLm5ldD4sCitMYXJzIER1ZW5pbmcgPGxhcnNAYmVhcm5pcC5jb20+IHdyb3RlOgorPk9uIFRodSwgMjEgT2N0IDE5OTkgMTI6MTE6MzYgLTA3MDAsIElseWEKKz48aWx5YUBzcGFtLmZyZWUuZ2FtZWNvbW1hbmRvcy5jb20+IHdyb3RlOgorPgorPj5IZXkgTGFycywgd2hhdCBob3BlIGlzIHRoZXJlLCBpZiBhbnksIG9mIGdldHRpbmcKKz4+c29tZXRoaW5nIGdvaW5nIGluIHRoZSBMUCB3b3JsZCwgdXNpbmcgTERtdWQgb3IKKz4+d2hhdGV2ZXIsICB0aGF0IGNhbiBiZSB1c2VkIGNvbW1lcmNpYWxseT8KKz4KKz5VbmZvcnR1bmF0ZWx5IG9ubHkgc2xpbSBob3BlOiB0aGUgcGFydHMgd3JpdHRlbiBieSB0aGUgR2VuZXNpcyBmb2xrcworPmFyZSBkZWZpbml0ZWx5IG5vbi1jb21tZXJjaWFsOyBidXQgcmV3cml0aW5nIGlzIGRpZmZpY3VsdCBiZWNhdXNlCis+bm9ib2R5IHJlbWVtYmVycyBfd2hpY2hfIHBhcnRzIGFyZSBjb25jZXJuZWQgKGFuZCBtYWlsZWQgcmVxdWVzdHMKKz5oYXZlbid0IGJlZW4gYW5zd2VyZWQpLiBBbmQgSSBoYXZlbid0IGFza2VkIHRoZSBvdGhlciBjb250cmlidXRvcnMKKz55ZXQsIGVpdGhlci4KKworSSBoYXZlIGEgcHJldHR5IGdvb2QgaWRlYSBvZiB3aG8gd3JvdGUgd2hhdCBwYXJ0cyBvZiB0aGUgZWFybHkgdmVyc2lvbiAzCitnYW1lZHJpdmVycy4gQWxsIGluIGFsbCB0aGVyZSBoYXZlIGJlZW4gYWJvdXQgMzAgcGVvcGxlIGludm9sdmVkLiBVbmxlc3MKK3lvdSByZWNvZGUgdGhlIGVudGlyZSBnYW1lZHJpdmVyIGZyb20gc2NyYXRjaCwgb3IgYnVpbGQgZnJvbSBhc3NlbWJsZWQgcGllY2VzCit3aXRoIGtub3duIGNvcHlyaWdodCByZXN0cmljdGlvbnMsIHRoZXJlIGlzIG5vIHdheSB5b3UgY2FuIGNvbWUgdXAgd2l0aAorc29tZXRoaW5nIHRoYXQgZG9lcyBub3QgaW5mcmluZ2Ugb24gdGhlIHJpZ2h0cyBvZiBzb21lb25lIHdobyB3aWxsIG5vdAorYWxsb3cgY29tbWVjaWFsIHVzZS4KKworSmFjb2IgSGFsbOluCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCmRpZmYgLS1naXQgYS9kb2MvZHJpdmVyL2RlYnVnbWFsbG9jIGIvZG9jL2RyaXZlci9kZWJ1Z21hbGxvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Zjc4YmFlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RyaXZlci9kZWJ1Z21hbGxvYwpAQCAtMCwwICsxLDE3IEBACitOQU1FCisgICAgICAgIGRlYnVnbWFsbG9jCisKK0RFU0NSSVBUSU9OCisgICAgICAgIFRoaXMgY29tbWFuZCBpcyBoYXJkY29kZWQgaW50byB0aGUgZHJpdmVyLgorCisgICAgICAgIFRvZ2dsZXMgdGhlIGRlYnVnIG1vZGUgZm9yIHRoZSBtZW1vcnkgbWFuYWdtZW50LgorICAgICAgICBJZiB0aGUgT19JU19XSVpBUkQgZmxhZyBpcyB1c2VkIGluIHRoZSBtdWRsaWIgKGkuZS4gaWYKKyAgICAgICAgc2V0X2lzX3dpemFyZCgpIHdhcyBjYWxsZWQpLCB0aGlzIGNvbW1hbmQgaXMgYWxsb3dlZCBvbmx5IGZvcgorICAgICAgICB1c2VycyB0aGF0IGhhdmUgdGhpcyBmbGFnIHNldC4KKworSElTVE9SWQorICAgICAgICBEZWFjdGl2YXRlZCBpbiAzLjIuNyBieSBkZWZhdWx0LCBpdCB3YXMgZWZmZWN0bGVzcyBiZWZvcmUgYW55d2F5LgorCitTRUUgQUxTTworICAgICAgICBtYWxsb2MoRCksIHN0YXR1cyhEKSwgbWVtb3J5KEMpLCBvYmplY3RzKEMpLCBkZWJ1Z19pbmZvKEUpLAorICAgICAgICBzZXRfaXNfd2l6YXJkKEUpCmRpZmYgLS1naXQgYS9kb2MvZHJpdmVyL2RyaXZlciBiL2RvYy9kcml2ZXIvZHJpdmVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNDMwZTgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZHJpdmVyL2RyaXZlcgpAQCAtMCwwICsxLDE1IEBACitOQU1FCisgICAgICAgIGRyaXZlcgorCitERVNDUklQVElPTgorICAgICAgICBUaGlzIGRpcmVjdG9yeSBjb250YWlucyBkZXNjcmlwdGlvbnMgb2YgbWlzY2VsbGFuZW91cworICAgICAgICBpbnRlcm5hbHMgb2YgQW15bGFhcidzIHZlcnNpb24gb2YgdGhlIExQQyBwYXJzZXIvaW50ZXJwcmV0ZXIsCisgICAgICAgIHRoYXQgbWlnaHQgYmUgdXNlZnVsIHRvIGtub3cuCisKKyAgICAgICAgT25lIHRoaW5nIGRlc2NyaWJlZCBoZXJlIGFyZSB0aGUgc3BlY2lhbCBoYXJkY29kZWQgY29tbWFuZHMKKyAgICAgICAgb2YgdGhlIGludGVycHJldGVyIGZvciBxdWVyeWluZyB0aGUgc3RhdHVzIG9mIHRoZSBtZW1vcnkKKyAgICAgICAgbWFuYWdlbWVudC4KKworU0VFIEFMU08KKyAgICAgICAgZWZ1bihFKSwgYXBwbGllZChBKSwgY29uY2VwdHMoQyksIG1hc3RlcihNKSwgbHBjKExQQyksCisgICAgICAgIG1hbGxvYyhEKSwgc3RhdHVzKEQpCmRpZmYgLS1naXQgYS9kb2MvZHJpdmVyL2R1bXBhbGxvYmogYi9kb2MvZHJpdmVyL2R1bXBhbGxvYmoKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRiODg0YQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kcml2ZXIvZHVtcGFsbG9iagpAQCAtMCwwICsxLDQ5IEBACitOQU1FCisgICAgICAgIGR1bXBhbGxvYmoKKworREVTQ1JJUFRJT04KKyAgICAgICAgV3JpdGUgYSBsaXN0IG9mIGFsbCBsb2FkZWQgb3IgY2xvbmVkIG9iamVjdHMgaW50byB0aGUgZmlsZQorICAgICAgICBPQkpfRFVNUCwgYW5kIGEgbGlzdCBvZiBhbGwgZGVzdHJ1Y3RlZCBvYmplY3RzIGludG8gdGhlCisgICAgICAgIGZpbGUgREVTVF9PQkpfRFVNUC4gQm90aCBmaWxlcyBhcmUgbG9jYXRlZCBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YKKyAgICAgICAgdGhlIG11ZGxpYi4KKworICAgICAgICBXYXJuaW5nOiB0aGVzZSBmaWxlcyBjYW4gYmUgdmVyeSBsYXJnZSwgYW5kIGlmIHRoZSBkcml2ZXIgaXMgbG93CisgICAgICAgIG9uIG1lbW9yeSB0aGVyZSBpcyBhIGNlcnRhaW4gY3Jhc2ggcHJvYmFiaWxpdHkuCisKKyAgICAgICAgSWYgdGhlIE9fSVNfV0laQVJEIGZsYWcgaXMgdXNlZCBpbiB0aGUgbXVkbGliIChpLmUuIGlmCisgICAgICAgIHNldF9pc193aXphcmQoKSB3YXMgY2FsbGVkKSwgdGhpcyBjb21tYW5kIGlzIGFsbG93ZWQgb25seSBmb3IKKyAgICAgICAgdXNlcnMgdGhhdCBoYXZlIHRoaXMgZmxhZyBzZXQuCisKKyAgICAgICAgRm9yIGV2ZXJ5IGxpdmUgb2JqZWN0LCBhIGxpbmUgaXMgd3JpdHRlbiBpbnRvIHRoZSBmaWxlIHdpdGggdGhlCisgICAgICAgIGZvbGxvd2luZyBpbmZvcm1hdGlvbiBpbiB0aGUgZ2l2ZW4gb3JkZXI6CisgICAgICAgICAgLSBvYmplY3QgbmFtZQorICAgICAgICAgIC0gc2l6ZSBpbiBtZW1vcnksIHNoYXJlZCBkYXRhIGNvdW50ZWQgb25seSBvbmNlCisgICAgICAgICAgLSBzaXplIGluIG1lbW9yeSBpZiBkYXRhIHdvdWxkbid0IGJlIHNoYXJlZAorICAgICAgICAgIC0gbnVtYmVyIG9mIHJlZmVyZW5jZXMKKyAgICAgICAgICAtICdIQicgaWYgdGhlIG9iamVjdCBoYXMgYSBoZWFydGJlYXQsIG5vdGhpbmcgaWYgbm90LgorICAgICAgICAgIC0gdGhlIG5hbWUgb2YgdGhlIGVudmlyb25tZW50LCBvciAnLS0nIGlmIHRoZSBvYmplY3QgaGFzIG5vCisgICAgICAgICAgICBlbnZpcm9ubWVudAorICAgICAgICAgIC0gaW4gcGFyZW50aGVzZXMgdGhlIG51bWJlciBvZiBleGVjdXRpb24gdGlja3Mgc3BlbnQgaW4gdGhpcworICAgICAgICAgICAgb2JqZWN0CisgICAgICAgICAgLSB0aGUgc3dhcCBzdGF0dXM6CisgICAgICAgICAgICAgbm90aGluZyBpZiBub3Qgc3dhcHBlZCwKKyAgICAgICAgICAgICAnUFJPRyBTV0FQUEVEJyBpZiBvbmx5IHRoZSBwcm9ncmFtIGlzIHN3YXBwZWQKKyAgICAgICAgICAgICAnVkFSIFNXQVBQRUQnIGlmIG9ubHkgdGhlIHZhcmlhYmVzIGFyZSBzd2FwcGVkCisgICAgICAgICAgICAgJ1NXQVBQRUQnIGlmIGJvdGggcHJvZ3JhbSBhbmQgdmFyaWFibGVzIGFyZSBzd2FwcGVkCisgICAgICAgICAgLSB0aGUgdGltZSB0aGUgb2JqZWN0IHdhcyBjcmVhdGVkCisKKyAgICAgICAgRm9yIGV2ZXJ5IGRlc3RydWN0ZWQgb2JqZWN0LCBhIGxpbmUgaXMgd3JpdHRlbiBpbnRvIHRoZSBmaWxlIHdpdGggdGhlCisgICAgICAgIGZvbGxvd2luZyBpbmZvcm1hdGlvbiBpbiB0aGUgZ2l2ZW4gb3JkZXI6CisgICAgICAgICAgLSBvYmplY3QgbmFtZQorICAgICAgICAgIC0gbnVtYmVyIG9mIHJlZmVyZW5jZXMKKyAgICAgICAgICAtICdORVcnIGlmIHRoZSBvYmplY3Qgd2FzIGRlc3RydWN0ZWQgaW4gdGhpcyBleGVjdXRpb25nCisgICAgICAgICAgICB0aHJlYWQsIG5vdGhpbmcgaWYgaXQgaXMgb2xkZXIgYWxyZWFkeS4KKworCitISVNUT1JZCisgICAgICAgIExETXVkIDMuMi45IGFkZGVkIHRoZSBERVNUX09CSl9EVU1QLgorICAgICAgICBMRE11ZCAzLjIuMTAgYWRkZWQgdGhlIG9iamVjdCBjcmVhdGlvbiB0aW1lIHRvIE9CSl9EVU1QLgorCitTRUUgQUxTTworICAgICAgICBtYWxsb2MoRCksIHN0YXR1cyhEKSwgbWVtb3J5KEMpLCBvYmplY3RzKEMpLCBkZWJ1Z19pbmZvKEUpLAorICAgICAgICBzZXRfaXNfd2l6YXJkKEUpCmRpZmYgLS1naXQgYS9kb2MvZHJpdmVyL2ludm9jYXRpb24gYi9kb2MvZHJpdmVyL2ludm9jYXRpb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc2MGI0NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kcml2ZXIvaW52b2NhdGlvbgpAQCAtMCwwICsxLDMzNSBAQAorTkFNRQorICAgIGRyaXZlci9pbnZvY2F0aW9uCisKK1BVUlBPU0UKKyAgICBEZXNjcmlwdGlvbiBvZiB0aGUgaW52b2NhdGlvbiBvZiB0aGUgZ2FtZWRyaXZlciwgZXNwZWNpYWxseSBvZiB0aGUgY29tbWFuZAorICAgIGFyZ3VtZW50cy4gVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGNvbW1hbmRsaW5lIHZlcnNpb24gb2YgdGhlIGRyaXZlcgorICAgIG9ubHk7IG5vbi1jb21tYW5kbGluZSB2ZXJzaW9ucyBhcmUgcGxhdGZvcm0gc3BlY2lmaWMgYW5kIGRlc2NyaWJlZCBpbgorICAgIHRoZSByZWxhdGVkIGRvY3VtZW50YXRpb24uCisKK0RFU0NSSVBUSU9OCisgICAgVGhlIGRyaXZlciBpcyBpbnZva2VkIGZyb20gdGhlIGNvbW1hbmRsaW5lIGFzIG90aGVyIG5vcm1hbCBwcm9ncmFtcy4KKyAgICBOZWl0aGVyIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBub3IgdGhlIGRpcmVjdG9yeSB0aGUgZXhlY3V0YWJsZSBpcyBpbiBuZWVkCisgICAgdG8gYmUgaW4gYW55IHNwZWNpYWwgcmVsYXRpb24gdGhlIGRpcmVjdG9yeSBvZiB0aGUgbXVkbGliLiBPbmNlIHRoZSBkcml2ZXIKKyAgICBpcyBydW5uaW5nLCBpdCBlbWl0cyB0d28gc3RyZWFtcyBvZiBvdXRwdXRzOgorCisgICAgICAtIGRyaXZlci1yZWxhdGVkIG1lc3NhZ2VzIG9uIHN0ZGVycjsgdGhpcyB1bmZvcnR1bmF0ZWx5IGluY2x1ZGVzCisgICAgICAgIExQQyBjb21waWxlciBkaWFnbm9zdGljcworICAgICAgLSBMUEMgcnVudGltZS1yZWxhdGVkIG1lc3NhZ2VzIGluIHRoZSBsb2dmaWxlIDxtdWRsaWI+Lzxob3N0Pi5wYXJzZS5sb2cKKyAgICAgICAgKHRoZSBuYW1lIGNhbiBiZSBjaGFuZ2VkKS4KKworICAgIEl0IGlzIHBvc3NpYmxlIHRvIHN0YXJ0IHRoZSBkcml2ZXIgd2l0aG91dCBhbnkgY29tbWFuZGxpbmUgYXJndW1lbnRzIGFzCisgICAgc3VpdGFibGUgZGVmYXVsdHMgYXJlIHNwZWNpZmllZCBhdCBjb21waWxlIHRpbWUuIFRoZSBpbnZvY2F0aW9uIHN5bnRheAorICAgIGlzOgorCisgICAgICAgIGRyaXZlciBbb3B0aW9uc10gWzxwb3J0bnVtYmVyPl0uLi4KKworICAgIDxwb3J0bnVtYmVyPiB0aGUgbnVtYmVyIG9mIHRoZSBwb3J0IHRoZSBkcml2ZXIgc2hhbGwgdXNlIHRvIGFjY2VwdAorICAgIGNvbm5lY3Rpb25zLiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcG9ydHMgaXMgZGV0ZXJtaW5lZCBieSBNQVhOVU1QT1JUUworICAgIGluIHRoZSBzb3VyY2UgZmlsZSBjb25maWcuaC4KKworICAgIFRoZSBvcHRpb25zIG1vZGlmeSB0aGUgYmVoYXZpb3VyIG9mIHRoZSBnYW1lZHJpdmVyLiBTb21lIG9mIHRoZW0gYXJlIG9ubHkKKyAgICBhdmFpbGFibGUgaWYgYSBjZXJ0YWluIGNvbXBpbGUtdGltZSBvcHRpb24gd2FzIGVuYWJsZWQgKHR5cGljYWxseSBpbgorICAgIHRoZSBzb3VyY2UgZmlsZSBjb25maWcuaCkuIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgcmVjb2duaXplZDoKKworICAgICAgLVB8LS1pbmhlcml0IDxmZC1udW1iZXI+CisgICAgICAgIEluaGVyaXQgZmlsZWRlc2NyaXB0b3IgPGZkLW51bWJlcj4gZnJvbSB0aGUgcGFyZW50IHByb2Nlc3MKKyAgICAgICAgYXMgc29ja2V0IHRvIGxpc3RlbiBmb3IgY29ubmVjdGlvbnMuCisgICAgICAgIE9ubHkgYXZhaWxhYmxlIGlmIGNvbXBpbGVkIHdpdGggTUFYTlVNUE9SVFMuCisKKyAgICAgIC11fC0tdWRwIDxwb3J0bnVtYmVyPgorICAgICAgICBTcGVjaWZ5IHRoZSA8cG9ydG51bWJlcj4gZm9yIHRoZSBVRFAgcG9ydCwgb3ZlcnJpZGluZyB0aGUgY29tcGlsZWQtaW4KKyAgICAgICAgZGVmYXVsdC4KKyAgICAgICAgT25seSBhdmFpbGFibGUgaWYgY29tcGlsZWQgd2l0aCBDQVRDSF9VRFBfUE9SVC4KKworICAgICAgLUR8LS1kZWZpbmUgPG1hY3JvPls9PHRleHQ+XQorICAgICAgICBBZGQgPG1hY3JvPiAob3B0aW9uYWxseSB0byBiZSBleHBhbmRlZCB0byA8dGV4dD4pIHRvIHRoZSBsaXN0IG9mCisgICAgICAgIHByZWRlZmluZWQgbWFjcm9zIGtub3duIGJ5IHRoZSBMUEMgY29tcGlsZXIuCisKKyAgICAgIC1FfC0tZXZhbC1jb3N0IDx0aWNrcz4KKyAgICAgICAgU2V0IHRoZSBudW1iZXIgb2YgPHRpY2tzPiBhdmFpbGFibGUgZm9yIG9uZSBldmFsdWF0aW9uIHRocmVhZC4KKyAgICAgICAgSWYgMCwgZXhlY3V0aW9uIGlzIHVubGltaXRlZC4KKworICAgICAgLU18LS1tYXN0ZXIgPGZpbGVuYW1lPgorICAgICAgICBVc2UgPGZpbGVuYW1lPiBmb3IgdGhlIG1hc3RlciBvYmplY3QuCisKKyAgICAgIC1tfC0tbXVkbGliIDxwYXRobmFtZT4KKyAgICAgICAgVXNlIDxwYXRobmFtZT4gYXMgdGhlIHRvcCBkaXJlY3Rvcnkgb2YgdGhlIG11ZGxpYi4KKworICAgICAgLS1kZWJ1Zy1maWxlIDxmaWxlbmFtZT4KKyAgICAgICAgTG9nIGFsbCBkZWJ1ZyBvdXRwdXQgaW4gPGZpbGVuYW1lPiBpbnN0ZWFkIG9mCisgICAgICAgIDxtdWRsaWI+Lzxob3N0Pi5kZWJ1Zy5sb2cgLgorCisgICAgICAtLWhvc3RuYW1lIDxuYW1lPgorICAgICAgICBVc2UgPG5hbWU+IGFzIGhvc3RuYW1lIGluc3RlYWQgb2Ygd2hhdCB0aGUgc3lzdGVtIHNheXMuCisKKyAgICAgIC0taG9zdGFkZHIgPGFkZHI+CisgICAgICAgIFVzZSA8YWRkcj4gYXMgYWRkcmVzcyBvZiB0aGlzIG1hY2hpbmUsIGluc3RlYWQgb2Ygd2hhdCB0aGUKKyAgICAgICAgc3lzdGVtIHNheXMuICBJbiBwYXJ0aWN1bGFyIHRoaXMgYWRkcmVzcyB3aWxsIGJlIHVzZWQgdG8gb3BlbgorICAgICAgICB0aGUgZHJpdmVyIHBvcnRzLgorCisgICAgICAtLW5vLWNvbXBhdAorICAgICAgLS1jb21wYXQKKyAgICAgICAgU2VsZWN0IHRoZSBtb2RlIChwbGFpbiBvciBjb21wYXQpIG9mIHRoZSBkcml2ZXIuCisgICAgICAgIFRoaXMgY2hvaWNlIGRvZXMgbm90IGFmZmVjdCB0aGUgZGVmYXVsdCBuYW1lIG9mIHRoZSBtYXN0ZXIgb2JqZWN0LgorCisgICAgICAtZHwtLWRlYnVnCisgICAgICAgIEdlbmVyYXRlIGRlYnVnIG91dHB1dDsgcmVwZWF0IHRoZSBhcmd1bWVudCBmb3IgZXZlbiBtb3JlIG91dHB1dDoKKyAgICAgICAgICA+PSAxOiBsb2cgcmVzZXRzLCBjbGVhbiB1cHMsIHN3YXBzLCByZWNlcHRpb24gb2YgdXJnZW5kIGRhdGEsCisgICAgICAgICAgICAgICAgICAgdGVsbmV0IG5lZ290aWF0aW9uIHN0YXRlcy4KKyAgICAgICAgICAgICAgICBjaGVja19hX2xvdF9vZl9yZWZjb3VudHMoKSBvbiBzdGFydHVwIHdoZW4gc3dhcHBpbmcgb2YKKyAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXMgaXMgZGlzYWJsZWQuCisgICAgICAgICAgPj0gMjogbG9nIGFsbCBhZGRfbWVzc2FnZSgpcywgbmFtZSBsb29rdXAgZmFpbHVyZXMsIG5ldyBwbGF5ZXJzLgorICAgICAgICAgID49IDM6IHByb2dyZXNzIG9mIGdhcmJhZ2UgY29sbGVjdGlvbgorICAgICAgICAgID49IDQ6IGV2ZW4gbW9yZSBqdW5rIGZyb20gZ2FyYmFnZSBjb2xsZWN0aW9uCisKKyAgICAgIC1jfC0tbGlzdC1jb21waWxlcworICAgICAgICBMaXN0IHRoZSBuYW1lIG9mIGV2ZXJ5IGNvbXBpbGVkIGZpbGUgb24gc3RkZXJyLgorCisgICAgICAtZXwtLW5vLXByZWxvYWQKKyAgICAgICAgUGFzcyBhIG5vbi16ZXJvIGFyZ3VtZW50ICh0aGUgbnVtYmVyIG9mIG9jY3VyZW5jZXMgb2YgdGhpcyBvcHRpb24pCisgICAgICAgIHRvIG1hc3Rlci0+cHJlbG9hZCgpLCB3aGljaCB1c3VhbGx5IGluaGliaXRzIGFsbCBwcmVsb2FkcyBvZiBjYXN0bGVzCisgICAgICAgIGFuZCBvdGhlciBvYmplY3RzLgorCisgICAgICAtLWVycSA8ZmlsZW5hbWU+CisgICAgICAtLWVycSAiPGZpbGVuYW1lPiA8ZXJxIGFyZ3M+IgorICAgICAgICBVc2UgPGZpbGVuYW1lPiBpbnN0ZWFkIG9mICdlcnEnIGFzIHRoZSBiYXNlbmFtZSBvZiB0aGUgRVJRIGV4ZWN1dGFibGUuCisgICAgICAgIElmIHRoZSBuYW1lIHN0YXJ0cyB3aXRoIGEgJy8nLCBpdCBpcyB0YWtlIHRvIGJlIGFuIGFic29sdXRlIHBhdGhuYW1lLAorICAgICAgICBvdGhlcndpc2UgaXQgaXMgaW50ZXJwcmV0ZWQgcmVsYXRpdmUgdG8gPGJpbmRpcj4uIElmIG5vdCBzcGVjaWZpZWQsCisgICAgICAgICdlcnEnIGlzIHVzZWQgYXMgdGhlIGV4ZWN1dGFibGUgbmFtZS4KKworICAgICAgICBCeSBlbmNsb3NpbmcgdGhlIGFyZ3VtZW50IHZhbHVlIGluIHF1b3RlcywgaXQgaXMgcG9zc2libGUgdG8gcGFzcworICAgICAgICBhcmd1bWVudHMgKGUuZy4gLS1leGVjZGlyKSB0byB0aGUgZXJxLiBUaGVzZSBhcmd1bWVudHMgaG93ZXZlciBtdXN0CisgICAgICAgIG5vdCBjb250YWluIGVtYmVkZGVkIHNwYWNlcy4KKworICAgICAgLU58LS1uby1lcnEKKyAgICAgICAgRG9uJ3Qgc3RhcnQgdGhlIGVycSBkZW1vbiAoaWYgaXQgd291bGQgYmUgc3RhcnRlZCBhdCBhbGwpLgorCisgICAgICAtLWFsYXJtLXRpbWUgPHNlY29uZHM+CisgICAgICAgIFNldCB0aGUgZ3JhbnVsYXJpdHkgb2YgY2FsbF9vdXQoKSBhbmQgaGVhcnRiZWF0IHRpbWluZy4gTWluaW11bQorICAgICAgICB2YWx1ZSBpcyAxLgorCisgICAgICAtLWhlYXJ0LWludGVydmFsIDxzZWNvbmRzPgorICAgICAgICBTZXQgdGhlIGludGVydmFsIGJldHdlZW4gdHdvIGhlYXJ0YmVhdHMuIE1pbmltdW0gdmFsdWUgaXMgMS4KKworICAgICAgLS1zeW5jLWhlYXJ0CisgICAgICAgIEFsbCBoZWFydGJlYXRzIG9jY3VyIGF0IHRoZSBzYW1lIHRpbWUgKG1vZHVsbyBncmFudWxhcml0eSkuCisgICAgICAKKyAgICAgIC0tYXN5bmMtaGVhcnQKKyAgICAgICAgSGVhcnRiZWF0cyBvY2N1ciB3aGVuIHRoZXkgYXJlIGR1ZSAobW9kdWxvIGdyYW51bGFyaXR5KS4KKworICAgICAgLXR8LS1uby1oZWFydAorICAgICAgICBEaXNhYmxlIGhlYXJ0YmVhdHMgYW5kIGNhbGxfb3V0cy4KKworICAgICAgLWZ8LS1mdW5jYWxsIDx3b3JkPgorICAgICAgICBUaGUgbGZ1biBtYXN0ZXItPmZsYWcoKSBpcyBjYWxsZWQgd2l0aCA8d29yZD4gYXMgYXJndW1lbnQgYmVmb3JlIHRoZQorICAgICAgICBnYW1lZHJpdmVyIGFjY2VwdHMgbmV0d29yZCBjb25uZWN0aW9ucy4KKworICAgICAgLS1yZWdleHAgcGNyZSB8IHRyYWRpdGlvbmFsCisgICAgICAgIFNlbGVjdCB0aGUgZGVmYXVsdCByZWdleHAgcGFja2FnZS4KKworICAgICAgLS1tYXgtYXJyYXkgPHNpemU+CisgICAgICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyBhbiBhcnJheSBjYW4gaG9sZC4KKyAgICAgICAgU2V0IHRvIDAsIGFycmF5cyBvZiBhbnkgc2l6ZSBhcmUgYWxsb3dlZC4KKworICAgICAgLS1tYXgtbWFwcGluZyA8c2l6ZT4KKyAgICAgICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIGEgbWFwcGluZyBjYW4gaG9sZC4KKyAgICAgICAgU2V0IHRvIDAsIG1hcHBpbmdzIG9mIGFueSBzaXplIGFyZSBhbGxvd2VkLgorCisgICAgICAtLW1heC1tYXBwaW5nLWtleXMgPHNpemU+CisgICAgICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBlbnRyaWVzIGEgbWFwcGluZyBjYW4gaG9sZC4KKyAgICAgICAgU2V0IHRvIDAsIG1hcHBpbmdzIG9mIGFueSBzaXplIGFyZSBhbGxvd2VkLgorCisgICAgICAtLW1heC1jYWxsb3V0cyA8c2l6ZT4KKyAgICAgICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGNhbGxvdXRzIGF0IG9uZSB0aW1lLgorICAgICAgICBTZXQgdG8gMCwgYW55IG51bWJlciBpcyBhbGxvd2VkLgorCisgICAgICAtLW1heC1ieXRlcyA8c2l6ZT4KKyAgICAgICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIG9uZSByZWFkX2J5dGVzKCkvd3JpdGVfYnl0ZXMoKSBjYWxsCisgICAgICAgIGNhbiBoYW5kbGUuCisgICAgICAgIFNldCB0byAwLCByZWFkcyBhbmQgd3JpdGVzIG9mIGFueSBzaXplIGFyZSBhbGxvd2VkLgorCisgICAgICAtLW1heC1maWxlIDxzaXplPgorICAgICAgICBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgb25lIHJlYWRfZmlsZSgpL3dyaXRlX2ZpbGUoKSBjYWxsCisgICAgICAgIGNhbiBoYW5kbGUuCisgICAgICAgIFNldCB0byAwLCByZWFkcyBhbmQgd3JpdGVzIG9mIGFueSBzaXplIGFyZSBhbGxvd2VkLgorCisgICAgICAtLW1heC10aHJlYWQtcGVuZGluZyA8c2l6ZT5cbiIKKyAgICAgICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIGtlcHQgcGVuZGluZyBieSB0aGUgc29ja2V0IHdyaXRlCisgICAgICAgIHRocmVhZC4KKyAgICAgICAgU2V0IHRvIDAsIGFuIHVubGltaXRlZCBhbW91bnQgb2YgZGF0YSBjYW4gYmUga2VwdCBwZW5kaW5nLgorCisgICAgICAgIFRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgaWYgcHRocmVhZHMgYXJlIG5vdCB1c2VkLgorCisgICAgICAtLWNsZWFudXAtdGltZSA8dGltZT4KKyAgICAgICAgVGhlIGlkbGUgdGltZSBpbiBzZWNvbmRzIGZvciBhbiBvYmplY3QgYmVmb3JlIHRoZSBkcml2ZXIgdHJpZXMgdG8KKyAgICAgICAgY2xlYW4gaXQgdXAuIEl0IHNob3VsZCBiZSBzdWJzdGFudGlhbGx5IGxvbmdlciB0aGFuIHRoZSByZXNldCB0aW1lLgorICAgICAgICBBIHRpbWUgPD0gMCBkaXNhYmxlcyB0aGUgY2xlYW51cCBtZWNoYW5pc20uCisKKyAgICAgIC0tcmVzZXQtdGltZSA8dGltZT4KKyAgICAgICAgVGhlIHRpbWUgaW4gc2Vjb25kcyBiZWZvcmUgYW4gb2JqZWN0IGlzIHJlc2V0LiBBIHRpbWUgPD0gMCBkaXNhYmxlcworICAgICAgICB0aGUgcmVzZXQgbWVjaGFuaXNtLgorCisgICAgICAtcyA8dGltZT4gIHwgLS1zd2FwLXRpbWUgPHRpbWU+CisgICAgICAtcyB2PHRpbWU+IHwgLS1zd2FwLXZhcmlhYmxlcyA8dGltZT4KKyAgICAgICAgVGltZSBpbiBzZWNvbmRzIGJlZm9yZSBhbiBvYmplY3QgKG9yIGl0cyB2YXJpYWJsZXMpIGFyZSBzd2FwcGVkIG91dC4KKyAgICAgICAgQSB0aW1lIGxlc3Mgb3IgZXF1YWwgMCBkaXNhYmxlcyBzd2FwcGluZy4KKworICAgICAgLXMgZjxuYW1lPiB8IC0tc3dhcC1maWxlIDxuYW1lPgorICAgICAgICBTd2FwIGludG8gZmlsZSA8bmFtZT4gaW5zdGVhZCBvZiA8bXVkbGliPi9MUF9TV0FQLjxob3N0PiAuCisKKyAgICAgIC1zIGMgICAgICAgfCAtLXN3YXAtY29tcGFjdAorICAgICAgICBSZXVzZSBmcmVlIHNwYWNlIGluIHRoZSBzd2FwIGZpbGUgaW1tZWRpYXRlbHkuCisgICAgICAgIEdpdmluZyB0aGlzIG9wdGlvbiByZXN1bHRzIGluIHNtYWxsZXIsIGJ1dCBhbHNvIG1vcmUgZnJhZ21lbnRlZAorICAgICAgICBzd2FwZmlsZXMsIGFuZCB0aGUgc3dhcCBwZXJmb3JtYW5jZSBtYXkgZGVncmFkZS4KKworICAgICAgLS1tYXgtbWFsbG9jIDxzaXplPgorICAgICAgICBSZXN0cmljdCB0b3RhbCBtZW1vcnkgYWxsb2NhdGlvbnMgdG8gPHNpemU+IGJ5dGVzLgorICAgICAgICBBIDxzaXplPiBvZiAwIG9yICd1bmxpbWl0ZWQnIHJlbW92ZXMgYW55IHJlc3RyaWN0aW9uLlxuIgorCisgICAgICAtLW1pbi1tYWxsb2MgPHNpemU+CisgICAgICAtLW1pbi1zbWFsbC1tYWxsb2MgPHNpemU+CisgICAgICAgIERldGVybWluZSB0aGUgc2l6ZXMgZm9yIHRoZSBleHBsaWNpdGUgaW5pdGlhbCBsYXJnZSByZXNwLiBzbWFsbCBjaHVuaworICAgICAgICBhbGxvY2F0aW9uLiBBIHNpemUgb2YgMCBkaXNhYmxlcyB0aGUgZXhwbGljaXRlIGluaXRpYWwgYWxsb2NhdGlvbnMuCisKKyAgICAgIC1yIHU8c2l6ZT4gfCAtLXJlc2VydmUtdXNlciA8c2l6ZT4KKyAgICAgIC1yIG08c2l6ZT4gfCAtLXJlc2VydmUtbWFzdGVyIDxzaXplPgorICAgICAgLXIgczxzaXplPiB8IC0tcmVzZXJ2ZS1zeXN0ZW0gPHNpemU+CisgICAgICAgIFJlc2VydmUgPHNpemU+IGFtb3VudCBvZiBtZW1vcnkgZm9yIHVzZXIvbWFzdGVyL3N5c3RlbSBhbGxvY2F0aW9ucyB0bworICAgICAgICBiZSBoZWxkIHVudGlsIG1haW4gbWVtb3J5IHJ1bnMgb3V0LgorCisgICAgICAtLWZpbGVuYW1lLXNwYWNlcworICAgICAgLS1uby1maWxlbmFtZS1zcGFjZXMKKyAgICAgICAgQWxsb3cvZGlzYWxsb3cgdGhlIHVzZSBvZiBzcGFjZXMgaW4gZmlsZW5hbWVzLgorCisgICAgICAtLXN0cmljdC1ldWlkcworICAgICAgLS1uby1zdHJpY3QtZXVpZHMKKyAgICAgICAgRW5hYmxlL2Rpc2FibGUgdGhlIGVuZm9yY2VkIHVzZSBvZiBldWlkcy4KKworICAgICAgLS1zaGFyZS12YXJpYWJsZXMKKyAgICAgIC0taW5pdC12YXJpYWJsZXMKKyAgICAgICAgU2VsZWN0IGhvdyBjbG9uZXMgaW5pdGlhbGl6ZSB0aGVpciB2YXJpYWJsZXM6CisgICAgICAgICAgLSBieSBzaGFyaW5nIHRoZSBjdXJyZW50IHZhbHVlcyBvZiB0aGVpciBibHVlcHJpbnQKKyAgICAgICAgICAtIGJ5IGluaXRpYWxpemluZyB0aGVtIGFmcmVzaCAodXNpbmcgX19JTklUKCkpLgorCisgICAgICAtLXBpZGZpbGUgPGZpbGVuYW1lPlxuIgorICAgICAgICBXcml0ZSB0aGUgcGlkIG9mIHRoZSBkcml2ZXIgcHJvY2VzcyBpbnRvIDxmaWxlbmFtZT4uXG4iCisKKyAgICAgIC0tdGxzLWtleSA8cGF0aG5hbWU+CisgICAgICAgICAgVXNlIDxwYXRobmFtZT4gYXMgdGhlIHg1MDkga2V5ZmlsZSwgZGVmYXVsdCBpcyAna2V5LnBlbScuCisgICAgICAgICAgSWYgcmVsYXRpdmUsIDxwYXRobmFtZT4gaXMgaW50ZXJwcmV0ZWQgcmVsYXRpdmUgdG8gPG11ZGxpYj4uCisKKyAgICAgIC0tdGxzLWNlcnQgPHBhdGhuYW1lPgorICAgICAgICAgVXNlIDxwYXRobmFtZT4gYXMgdGhlIHg1MDkgY2VydGZpbGUsIGRlZmF1bHQgaXMgJ2NlcnQucGVtJy4KKyAgICAgICAgIElmIHJlbGF0aXZlLCA8cGF0aG5hbWU+IGlzIGludGVycHJldGVkIHJlbGF0aXZlIHRvIDxtdWRsaWI+LgorCisgICAgICAtLXRscy10cnVzdGZpbGUgPHBhdGhuYW1lPgorICAgICAgICBVc2UgPHBhdGhuYW1lPiBhcyB0aGUgZmlsZW5hbWUgaG9sZGluZyB5b3VyIHRydXN0ZWQgUEVNIGNlcnRpZmljYXRlcy4KKyAgICAgICAgSWYgcmVsYXRpdmUsIDxwYXRobmFtZT4gaXMgaW50ZXJwcmV0ZWQgcmVsYXRpdmUgdG8gPG11ZGxpYj4uCisKKyAgICAgIC0tdGxzLXRydXN0ZGlyZWN0b3J5IDxwYXRobmFtZT4KKyAgICAgICAgVXNlIDxwYXRobmFtZT4gYXMgdGhlIGRpcmVjdG9yeSB3aGVyZSB5b3VyIHRydXN0ZWQKKyAgICAgICAgUEVNIGNlcnRpZmljYXRlcyByZXNpZGUsIGRlZmF1bHQgaXMgJy9ldGMvc3NsL2NlcnRzJy4KKyAgICAgICAgSWYgcmVsYXRpdmUsIDxwYXRobmFtZT4gaXMgaW50ZXJwcmV0ZWQgcmVsYXRpdmUgdG8gPG11ZGxpYj4uCisKKyAgICAgIC0td2l6bGlzdC1maWxlIDxmaWxlbmFtZT4KKyAgICAgIC0tbm8td2l6bGlzdC1maWxlCisgICAgICAgIFJlYWQgYW5kIHNhdmUgdGhlIHdpemxpc3QgaW4gdGhlIG5hbWVkIGZpbGUgKGFsd2F5cyBpbnRlcnByZXRlZAorICAgICAgICByZWxhdGl2ZSB0aGUgbXVkbGliKTsgcmVzcC4gZG9uJ3QgcmVhZCBvciBzYXZlIHRoZSB3aXpsaXN0LgorCisgICAgICAtLWdjb2xsZWN0LW91dGZkIDxmaWxlbmFtZT58PG51bT4KKyAgICAgICAgR2FyYmFnZSBjb2xsZWN0b3Igb3V0cHV0IChsaWtlIGEgbG9nIG9mIGFsbCByZWNsYWltZWQgbWVtb3J5IGJsb2NrcykKKyAgICAgICAgaXMgc2VudCB0byA8ZmlsZW5hbWU+IChvciBpbmhlcml0ZWQgZmQgPG51bT4pIGluc3RlYWQgb2Ygc3RkZXJyLgorICAgICAgICBPbmx5IGF2YWlsYWJsZSBpZiBjb21waWxlZCB3aXRoIE1BTExPQ19zbWFsbG9jLgorCisgICAgICAtLXl8LS15eWRlYnVnCisgICAgICAgIEVuYWJsZSBkZWJ1Z2dpbmcgb2YgdGhlIExQQyBjb21waWxlci4KKyAgICAgICAgT25seSBhdmFpbGFibGUgaWYgY29tcGlsZWQgd2l0aCBZWURFQlVHLgorCisgICAgICAtLXJhbmRvbS1zZWVkIDxudW0+CisgICAgICAgIFNlZWQgdmFsdWUgZm9yIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4gSWYgbm90IGdpdmVuLCB0aGUKKyAgICAgICAgZHJpdmVyIGNob29zZXMgYSBzZWVkIHZhbHVlIG9uIGl0cyBvd24uCisgICAgICAgIFRoaXMgb3B0aW9uIGlzIGZvciBkZWJ1Z2dpbmcuCisKKyAgICAgIC0tY2hlY2stc3RhdGUgPGx2bD4KKyAgICAgICAgUGVyZm9ybSBhIHJlZ3VsYXIgc2ltcGxpc3RpYyBjaGVjayBvZiB0aGUgdmlydHVhbCBtYWNoaW5lIGFjY29yZGluZworICAgICAgICB0byA8bHZsPjoKKyAgICAgICAgICA9IDA6IG5vIGNoZWNrCisgICAgICAgICAgPSAxOiBvbmNlIHBlciBiYWNrZW5kIGxvb3AKKyAgICAgICAgICA9IDI6IGF0IHZhcmlvdXMgcG9pbnRzIGluIHRoZSBiYWNrZW5kIGxvb3AKKyAgICAgICAgT25seSBhdmFpbGFibGUgaWYgY29tcGlsZWQgd2l0aCBERUJVRy4KKworICAgICAgLS1jaGVjay1yZWZjb3VudHMKKyAgICAgICAgRXZlcnkgYmFja2VuZCBjeWNsZSwgYWxsIHJlZmNvdW50cyBpbiB0aGUgc3lzdGVtIGFyZSBjaGVja2VkLgorICAgICAgICBTTE9XISBPbmx5IGF2YWlsYWJsZSBpZiBjb21waWxlZCB3aXRoIERFQlVHLgorCisgICAgICAtLWdvYmJsZS1kZXNjcmlwdG9ycyA8bnVtPgorICAgICAgICA8bnVtPiAobW9yZSkgZmlsZWRlc2NyaXB0b3JzIGFyZSB1c2VkIHVwLiBZb3UnbGwga25vdyB3aGVuIHlvdSBuZWVkIGl0LgorICAgICAgICBPbmx5IGF2YWlsYWJsZSBpZiBjb21waWxlZCB3aXRoIERFQlVHLgorCisgICAgICAtLWNoZWNrLXN0cmluZ3MKKyAgICAgICAgRXZlcnkgYmFja2VuZCBjeWNsZSwgYWxsIHNoYXJlZCBzdHJpbmdzIGluIHRoZSBzeXN0ZW0gYXJlIGNoZWNrZWQuCisgICAgICAgIFNMT1chIE9ubHkgYXZhaWxhYmxlIGlmIGNvbXBpbGVkIHdpdGggREVCVUcgYW5kIENIRUNLX1NUUklOR1MuCisKKyAgICAgIC1WfC0tdmVyc2lvbgorICAgICAgICBQcmludCB0aGUgdmVyc2lvbiBvZiB0aGUgZHJpdmVyIGFuZCBleGl0LgorCisgICAgICAtLW9wdGlvbnMKKyAgICAgICAgUHJpbnQgdGhlIHZlcnNpb24gYW5kIGNvbXBpbGF0aW9uIG9wdGlvbnMgb2YgdGhlIGRyaXZlciBhbmQgZXhpdC4KKworICAgICAgLWh8LT98LS1oZWxwCisgICAgICAgIERpc3BsYXkgYSBjb21tYW5kIGhlbHAgYW5kIGV4aXQuCisKKyAgICAgIC0tbG9uZ2hlbHAKKyAgICAgICAgRGlzcGxheSBhIGxvbmcgY29tbWFuZCBoZWxwIGFuZCBleGl0LgorCisgICAgICAtLWFyZ3MgPGZpbGVuYW1lPgorICAgICAgICBUaGUgZHJpdmVyIHJlYWRzIGFuZCBwYXJzZXMgdGhlIGdpdmVuIGZpbGUgYW5kIHRyZWF0cyBpdHMgY29udGVudHMKKyAgICAgICAgYXMgaWYgZ2l2ZW4gb24gdGhlIGNvbW1hbmRsaW5lIHJpZ2h0IHdoZXJlIHRoZSAtLWFyZ3Mgb3B0aW9uCisgICAgICAgIG9jY3VyZWQuIFRoZSBmaWxlIGl0c2VsZiBjYW4gYWdhaW4gY29udGFpbiAtLWFyZ3Mgb3B0aW9ucy4KKworCitERVNDUklQVElPTiAtLSBBcmd1bWVudCBQYXJzZXIKKyAgICBUaGUgcGFyc2VyIGFuYWx5c2VzIHRoZSBjb21tYW5kbGluZSBhcmd1bWVudHMgZ2l2ZW4gd2l0aCB0aGUgZHJpdmVyCisgICAgaW52b2NhdGlvbiBhbmQgZGlzdGluZ3Vpc2hlcyAnb3B0aW9ucycsIHdoaWNoIHN0YXJ0IHdpdGggYSAnLScsIGZyb20KKyAgICBwcm9wZXIgYXJndW1lbnRzLiBPcHRpb25zIGFyZSBmdXJ0aGVyIGRpc3Rpbmd1aXNoZWQgYnkgdGhlaXIgbmFtZSBhbmQKKyAgICBtYXkgdGFrZSBhbiBhZGRpdGlvbmFsIHZhbHVlLiBJbiBnZW5lcmFsLCBvcHRpb25zIGFuZCBhcmd1bWVudHMgY2FuIGJlCisgICAgZ2l2ZWluIGluIGFueSBvcmRlci4KKworICAgIE9wdGlvbnMgYXJlIHJlY29nbml6ZWQgaW4gdHdvIGZvcm1zLiBJbiB0aGUgc2hvcnQgZm9ybSB0aGUgb3B0aW9uIG11c3QKKyAgICBiZSBnaXZlbiBhcyBhIHNpbmdsZSAnLScgZm9sbG93ZWQgYnkgYSBzaW5nbGUgbGV0dGVyLiBJbiB0aGUgbG9uZyBmb3JtLAorICAgIG9wdGlvbnMgc3RhcnQgd2l0aCAnLS0nIGZvbGxvd2VkIGJ5IGEgc3RyaW5nIG9mIGFyYml0cmFyeSBsZW5ndGguIFRoZQorICAgIHNob3J0IG9wdGlvbnMgYXJlIGNhc2Ugc2Vuc2l0aXZlLCB0aGUgbG9uZyBvcHRpb25zIGFyZW4ndC4KKyAgICBNb3N0IG9wdGlvbnMgY2FuIGJlIHNwZWNpZmllZCBpbiBib3RoIHRoZSBzaG9ydCBhbmQgbG9uZyBmb3JtLCBidXQgdGhhdAorICAgIGlzIG5vdCBtYW5kYXRvcnkuIEV4YW1wbGVzOiAnLXInIGFuZCAnLS1yZWN1cnNpdmUnLgorCisgICAgSWYgYW4gb3B0aW9uIHRha2VzIGEgdmFsdWUsIGl0IG11c3QgZm9sbG93IHRoZSBvcHRpb24gaW1tZWRpYXRlbHkgYWZ0ZXIKKyAgICBhIHNlcGFyYXRpbmcgc3BhY2Ugb3IgJz0nLiBBZGRpdGlvbmFsbHksIHRoZSB2YWx1ZSBmb3IgYSBzaG9ydCBvcHRpb24KKyAgICBtYXkgZm9sbG93IHRoZSBvcHRpb24gd2l0aG91dCBzZXBhcmF0b3IuIEV4YW1wbGVzIGFyZTogJy1mTWFrZWZpbGUnLAorICAgICctZiBNYWtlZmlsZScsICctLWZpbGU9TWFrZWZpbGUnIGFuZCAnLS1maWxlIE1ha2VmaWxlJy4KKworICAgIFNob3J0IG9wdGlvbnMgbWF5IGJlIGNvbGxhdGVkIGludG8gb25lIGFyZ3VtZW50LCBlLmcuICctcnRsJywgYnV0CisgICAgb2YgdGhlc2Ugb25seSB0aGUgbGFzdCBtYXkgdGFrZSBhIHZhbHVlLgorCisgICAgVGhlIG9wdGlvbiAnLS0nIG1hcmtzIHRoZSBlbmQgb2Ygb3B0aW9ucy4gQWxsIGZvbGxvd2luZyBjb21tYW5kIGFyZ3VtZW50cworICAgIGFyZSBjb25zaWRlcmVkIHByb3BlciBhcmd1bWVudHMgZXZlbiBpZiB0aGV5IHN0YXJ0IHdpdGggYSAnLScgb3IgJy0tJy4KKworICAgIFRoZSBhcmd1bWVudHMgYXJlIHVzdWFsbHkgdGFrZW4gZnJvbSB0aGUgY29tbWFuZGxpbmU7IGJ1dCB0aGUgcGFyc2VyCisgICAgaXMgYWxzbyBhYmxlIHRvIHJlYWQgdGhlbSBmcm9tIGEgdGV4dGZpbGVzLCB3aGljaCBjYW4gYmUgbmVzdGVkLiBUaGUKKyAgICBjb250ZW50IG9mIHRoZSB0ZXh0ZmlsZXMgaXMgYnJva2VuIGRvd24gaW50byB3b3JkcyBkZWxpbWl0ZWQgYnkgd2hpdGVzcGFjZSwKKyAgICB3aGljaCBhcmUgdGhlbiB0cmVhdGVkIGFzIGdpdmVuIG9uIHRoZSBjb21tYW5kbGluZSBhdCB0aGUgcGxhY2Ugd2hlcmUKKyAgICB0aGUgaW5zdHJ1Y3Rpb24gdG8gcmVhZCB0aGUgdGV4dGZpbGUgc3Rvb2QuCisKKyAgICBUaGUgZmlsZSBwYXJzZXIgcmVjb2duaXplcyBzaW1wbGUgZG91YmxlLXF1b3RlZCBzdHJpbmdzLCB3aGljaCBtdXN0IGJlCisgICAgY29udGFpbmVkIG9uIGEgc2luZ2xlIGxpbmUuIEFkZGl0aW9uYWxseSwgdGhlICcjJyBjaGFyYWN0ZXIgZ2l2ZW4gYnkKKyAgICBpdHNlbGYgaXMgYSBjb21tZW50IG1hcmtlciAtIGV2ZXJ0aGluZyBhZnRlciB0aGUgJyMnIHVudGlsIHRoZSBlbmQKKyAgICBvZiB0aGUgY3VycmVudCBsaW5lIGlzIGlnbm9yZWQuCisKK0hJU1RPUlkKKyAgICBMRE11ZCAzLjIuOSBhZGRlZCB0aGUgLS1tYXgtdGhyZWFkLXBlbmRpbmcsIC0taG9zdG5hbWUsCisgICAgICAtLWhvc3RhZGRyLCAtLWFyZ3MgYW5kIC0tcmFuZG9tLXNlZWQgb3B0aW9ucy4KKyAgICBMRE11ZCAzLjIuMTAgYWRkZWQgdGhlIC0tZmlsZW5hbWUtc3BhY2VzIG9wdGlvbnMuCisgICAgTERNdWQgMy4zLjM3OCBhZGRlZCAtLXNoYXJlLXZhcmlhYmxlcywgLS1pbml0LXZhcmlhYmxlcy4KKyAgICBMRE11ZCAzLjMuNDc1LzMuMi4xMSBhZGRlZCAtLXRscy1rZXksIC0tdGxzLWNlcnQuCisgICAgTERNdWQgMy4zLjY3Mi8zLjIuMTEgYWRkZWQgLS10bHMtdHJ1c3RmaWxlLCAtLXRscy10cnVzdGRpcmVjdG9yeS4KKyAgICBMRE11ZCAzLjMuNjc3IGFkZGVkIC0tbWF4LW1hcHBpbmcta2V5cy4KZGlmZiAtLWdpdCBhL2RvYy9kcml2ZXIvbWFsbG9jIGIvZG9jL2RyaXZlci9tYWxsb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZiMjcyMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kcml2ZXIvbWFsbG9jCkBAIC0wLDAgKzEsMTIgQEAKK05BTUUKKyAgICAgICAgbWFsbG9jCisKK0RFU0NSSVBUSU9OCisgICAgICAgIFRoaXMgY29tbWFuZCBpcyBoYXJkY29kZWQgaW50byB0aGUgZHJpdmVyJ3MgaW5wdXQgcGFyc2VyLgorICAgICAgICBJdCBzaG93cyB0aGUgc3RhdGlzdGljcyBvZiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgbW9kdWxlLgorCitISVNUT1JZCisgICAgICAgIFNpbmNlIDMuMi43LCAnc3RhdHVzIG1hbGxvYycgaGFzIHRoZSBzYW1lIGVmZmVjdC4KKworU0VFIEFMU08KKyAgICAgICAgc3RhdHVzKEQpLCBtZW1vcnkoQyksIGRlYnVnX2luZm8oRSkKZGlmZiAtLWdpdCBhL2RvYy9kcml2ZXIvb3BjZHVtcCBiL2RvYy9kcml2ZXIvb3BjZHVtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzVlYTY4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RyaXZlci9vcGNkdW1wCkBAIC0wLDAgKzEsMTMgQEAKK05BTUUKKyAgICAgICAgb3BjZHVtcAorCitERVNDUklQVElPTgorICAgICAgICBJZiB0aGUgZHJpdmVyIHdhcyBjb21waWxlZCB0byBkbyBvcGNvZGUgcHJvZmlsaW5nLCB0aGlzIGNvbW1hbmQKKyAgICAgICAgd2lsbCBzYXZlIHRoZSBjb2xsZWN0ZWQgcHJvZmlsaW5nIGluZm9ybWF0aW9uIGludG8gdGhlIGZpbGUgL09QQ19EVU1QLgorICAgICAgICBJZiB0aGUgT19JU19XSVpBUkQgZmxhZyBpcyB1c2VkIGluIHRoZSBtdWRsaWIgKGkuZS4gaWYKKyAgICAgICAgc2V0X2lzX3dpemFyZCgpIHdhcyBjYWxsZWQpLCB0aGlzIGNvbW1hbmQgaXMgYWxsb3dlZCBvbmx5IGZvcgorICAgICAgICB1c2VycyB0aGF0IGhhdmUgdGhpcyBmbGFnIHNldC4KKworU0VFIEFMU08KKyAgICAgICAgbWFsbG9jKEQpLCBzdGF0dXMoRCksIG1lbW9yeShDKSwgb2JqZWN0cyhDKSwgZGVidWdfaW5mbyhFKSwKKyAgICAgICAgc2V0X2lzX3dpemFyZChFKQpkaWZmIC0tZ2l0IGEvZG9jL2RyaXZlci9wcmVkZWZpbmVkIGIvZG9jL2RyaXZlci9wcmVkZWZpbmVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YTdlYjAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZHJpdmVyL3ByZWRlZmluZWQKQEAgLTAsMCArMSwxMzAgQEAKK05BTUUKKyAgICBwcmVkZWZpbmVkIC0gcHJlZGVmaW5lZCAjZGVmaW5lcyBieSB0aGUgcGFyc2VyCisKK0RFU0NSSVBUSU9OCisgICAgU2V2ZXJhbCBwcmVwcm9jZXNzb3IgbWFjcm9zIGFyZSBwcmUjZGVmaW5lZCBieSB0aGUgcGFyc2VyLAorICAgIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgcGFyc2VyIHZlcnNpb24sIGNvbXBpbGUgdGltZQorICAgIG9wdGlvbnMgYW5kIHBhcnNlciBpbnZvY2F0aW9uIG9wdGlvbnM6CisKKyAgICAgIExQQzMgICAgICAgICAgICA6IGFsd2F5cyBkZWZpbmVkLgorICAgICAgX19MRE1VRF9fICAgICAgIDogYWx3YXlzIGRlZmluZWQuCisgICAgICBfX0VVSURTX18gICAgICAgOiBhbHdheXMgKGZvciBjb21wYXRpYmlsaXR5KS4KKyAgICAgIENPTVBBVF9GTEFHICAgICA6IGRlZmluZWQgaWYgdGhlIGRyaXZlciBydW5zIGluIGNvbXBhdCBtb2RlLgorICAgICAgX19DT01QQVRfTU9ERV9fIDogZGl0dG8KKyAgICAgIF9fU1RSSUNUX0VVSURTX186IGRlZmluZWQgaWYgc3RyaWN0IGV1aWQgdXNhZ2UgaXMgZW5mb3JjZWQuCisgICAgICBfX0ZJTEVOQU1FX1NQQUNFU19fOiBkZWZpbmVkIGlmIGZpbGVuYW1lcyBtYXkgY29udGFpbiBzcGFjZXMuCisKKyAgICAgIF9fTUFTVEVSX09CSkVDVF9fIDogdGhlIG5hbWUgb2YgdGhlIG1hc3RlciBvYmplY3QgKGluIGNvbXBhdCBtb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhvdXQgbGVhZGluZyAnLycpLgorICAgICAgX19GSUxFX18gICAgICAgICAgOiB0aGUgbmFtZSBvZiB0aGUgY29tcGlsZWQgZmlsZSAoaW4gY29tcGF0IG1vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aG91dCBsZWFkaW5nICcvJykuCisgICAgICBfX0xJTkVfXyAgICAgICAgICA6IHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyLgorICAgICAgX19GVU5DVElPTl9fICAgICAgOiB0aGUgY3VycmVudCBmdW5jdGlvbiBuYW1lLgorICAgICAgX19ESVJfXyAgICAgICAgICAgOiB0aGUgZGlyZWN0b3J5IHBhdGggb2YgdGhlIGNvbXBpbGVkIGZpbGUgKGluCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhdCBtb2RlIHdpdGhvdXQgbGVhZGluZyAnLycpLgorICAgICAgX19QQVRIX18obikgICAgICAgOiB0aGUgZGlyZWN0b3J5IHBhdGggb2YgdGhlIGNvbXBpbGVkIGZpbGUgd2l0aG91dAorICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgPG4+IHRyYWlsaW5nIGVsZW1lbnRzIChpbiBjb21wYXQgbW9kZSB3aXRob3V0CisgICAgICAgICAgICAgICAgICAgICAgICAgIGxlYWRpbmcgJy8nKS4KKyAgICAgIF9fVkVSU0lPTl9fICAgICAgIDogdGhlIHZlcnNpb24gc3RyaW5nIG9mIHRoZSBkcml2ZXIuCisgICAgICBfX1ZFUlNJT05fTUFKT1JfXyA6IHRoZSBtYWpvciB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZHJpdmVyLgorICAgICAgX19WRVJTSU9OX01JTk9SX18gOiB0aGUgbWlub3IgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGRyaXZlci4KKyAgICAgIF9fVkVSU0lPTl9NSUNST19fIDogdGhlIG1pY3JvIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBkcml2ZXIuCisgICAgICBfX1ZFUlNJT05fUEFUQ0hfXyA6IHRoZSBwYXRjaGxldmVsIG9mIHRoZSBkcml2ZXI7IGEgMCBoZXJlIG1lYW5zCisgICAgICAgICAgICAgICAgICAgICAgICAgICdubyBwYXRjaGxldmVsJy4KKyAgICAgIF9fVkVSU0lPTl9DT01NSVRJRF9fIDogdGhlIGNvbW1pdCBJRCBvZiB0aGUgc291cmNlIG9mIHRoZSBkcml2ZXIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdHRlbnRpb246IGl0IG1pZ2h0IGJlIDx1bmtub3duPiwgaWYgdGhlIGRyaXZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzIG5vdCBjb21waWxlZCBmcm9tIGEgZ2l0IHJlcG9zaXRvcnkpCisgICAgICBfX1ZFUlNJT05fTE9DQUxfXyA6IHRoZSAob3B0aW9uYWwpIExPQ0FMX0xFVkVMLCB0aGUgdXNlciBoYXMgZGVmaW5lZC4KKworCisgICAgICBfX0RPTUFJTl9OQU1FX18gICAgOiB0aGUgZG9tYWluIHRoZSBob3N0IGlzIHBhcnQgb2YuCisgICAgICBfX0hPU1RfSVBfTlVNQkVSX18gOiB0aGUgaG9zdHMgSVAgbnVtYmVyIChhcyBhIHN0cmluZykuCisgICAgICBfX0hPU1RfTkFNRV9fICAgICAgOiB0aGUgZnVsbCBob3N0bmFtZS4KKyAgICAgIF9fTUFYX1JFQ1VSU0lPTl9fICA6IHRoZSBtYXggY291bnQgb2YgbmVzdGVkIGZ1bmN0aW9uIGNhbGxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcyBpcyBjb25maWcuaDpNQVhfVVNFUl9UUkFDRSkuCisgICAgICBfX01BWF9FVkFMX0NPU1RfXyAgOiB0aGUgbWF4IGV2YWx1YXRpb24gY29zdC4KKyAgICAgIF9fUkVTRVRfVElNRV9fICAgICA6IGRlZmF1bHQgaW50ZXJ2YWwgdGltZSBiZXR3ZWVuIG9iamVjdCByZXNldHMuCisgICAgICBfX0NMRUFOVVBfVElNRV9fICAgOiBkZWZhdWx0IGludGVydmFsIHRpbWUgYmV0d2VlbiBvYmplY3QgY2xlYW51cHMuCisgICAgICBfX0FMQVJNX1RJTUVfXyAgICAgOiB0aGUgY29uZmlndXJlZCB0aW1pbmcgZ3JhbnVsYXJpdHkuCisgICAgICBfX0hFQVJUX0JFQVRfSU5URVJWQUxfXzogdGhlIGNvbmZpZ3VyZWQgaGVhcnRiZWF0IHRpbWUuCisgICAgICBfX1NZTkNIUk9OT1VTX0hFQVJUX0JFQVRfXzogZGVmaW5lZCBpZiBzeW5jaHJvbm91cyBoZWFydGJlYXRzIGFyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZC4KKyAgICAgIF9fTUFYX0NPTU1BTkRfTEVOR1RIX186IHRoZSBtYXhpbXVtIGxlbmd0aCBhIGNvbW1hbmQgY2FuIGhhdmUuCisgICAgICBfX0VGVU5fREVGSU5FRF9fKG5hbWUpIDogaWYgdGhlIGVmdW4gJ25hbWUnIGV4aXN0cywgdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvIGV2YWx1YXRlcyB0byAiIDEgIiwgZWxzZSB0byAiIDAgIi4KKyAgICAgIF9fRFJJVkVSX0xPR19fICAgICA6IHRoZSBuYW1lIG9mIHRoZSBkZWZhdWx0IGRlYnVnLmxvZyBmaWxlICh3aXRoaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtdWRsaWIpOyB1bmRlZmluZWQgaWYgYSBkaWZmZXJlbnQgbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzIGJlZW4gc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kbGluZS4KKyAgICAgIF9fV0laTElTVF9fICAgICAgICA6IHRoZSBuYW1lIG9mIHRoZSAobXVkbGliKSBmaWxlIGZyb20gd2hlcmUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkcml2ZXIgcmVhZCB0aGUgaW5pdGlhbCBXSVpMSVNUIGluZm9ybWF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSXQgaXMgdW5kZWZpbmVkIGlmIHRoZSBkcml2ZXIgd2FzIGNvbmZpZ3VyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIG5vdCByZWFkIHRoZSBpbmZvcm1hdGlvbi4KKyAgICAgIF9fTUFYX01BTExPQ19fICAgICA6IHRoZSBpbnRlcm5hbCB1cHBlciBsaW1pdCBmb3IgdG90YWwgbWVtb3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZS4KKyAgICAgIF9fSU5UX01BWF9fICAgICAgICA6IHRoZSBsYXJnZXN0IGludGVnZXIgbnVtYmVyCisgICAgICBfX0lOVF9NSU5fXyAgICAgICAgOiB0aGUgc21hbGxlc3QgaW50ZWdlciBudW1iZXIKKyAgICAgIF9fRkxPQVRfTUFYX18gICAgICA6IHRoZSBsYXJnZXN0IChwb3NpdGl2ZSkgZmxvYXQgbnVtYmVyCisgICAgICBfX0ZMT0FUX01JTl9fICAgICAgOiB0aGUgc21hbGxlc3QgKHBvc2l0aXZlKSBmbG9hdCBudW1iZXIKKworICAgICAgX19MUENfTk9TQVZFX18gICAgIDogYWx3YXlzIGRlZmluZWQKKyAgICAgIF9fTFBDX1NUUlVDVFNfXyAgICA6IGRlZmluZWQgd2hlbiBzdHJ1Y3Qgc3VwcG9ydCBpcyBlbmFibGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgT25jZSBzdHJ1Y3RzIGFyZSBmdWxseSBzdXBwb3J0ZWQsIHRoaXMgbWFjcm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYWx3YXlzIGJlIGRlZmluZWQuCisgICAgICBfX0xQQ19JTkxJTkVfQ0xPU1VSRVNfXzogZGVmaW5lZCB3aGVuIHRoZSAncmVhbCcgaW5saW5lIGNsb3N1cmVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgZW5hYmxlZC4KKyAgICAgIF9fTFBDX0FSUkFZX0NBTExTX186IGNhbGxfb3RoZXIoKXMgb24gYXJyYXlzIG9mIG9iamVjdHMgZW5hYmxlZC4KKyAgICAgIF9fQk9PVF9USU1FX18gICAgICA6IHRoZSB0aW1lKCkgdGhlIGRyaXZlciB3YXMgc3RhcnRlZC4KKworICAgIElmIHRoZSBFUlEgaXMgc3VwcG9ydGVkLCB0aGUgZm9sbG93aW5nIG1hY3JvcyBhcmUgZGVmaW5lZDoKKworICAgICAgX19FUlFfTUFYX1NFTkRfXyAgOiB0aGUgbWF4IHNpemUgb2YgdGhlIHNlbmQgYnVmZmVyCisgICAgICBfX0VSUV9NQVhfUkVQTFlfXyA6IHRoZSBtYXggc2l6ZSBvZiB0aGUgcmVwbHkgYnVmZmVyCisKKyAgICBUaGUgZm9sbG93aW5nIG1hY3JvcyBhcmUgZGVmaW5lZCBpZiB0aGVpciBhc3NvY2lhdGVkIHBhY2thZ2UKKyAgICBoYXMgYmVlbiBjb21waWxlZCBpbnRvIHRoZSBkcml2ZXI6CisKKyAgICAgIF9fSUROQV9fIDogICAgICBzdXBwb3J0IGZvciBJRE5BCisgICAgICBfX0lQVjZfXyA6ICAgICAgc3VwcG9ydCBmb3IgSVAgdi42CisgICAgICBfX01ZU1FMX18gOiAgICAgc3VwcG9ydCBmb3IgbXlTUUwKKyAgICAgIF9fUEdTUUxfXyA6ICAgICBzdXBwb3J0IGZvciBQb3N0Z3JlU1FMCisgICAgICBfX1NRTElURV9fIDogICAgc3VwcG9ydCBmb3IgU1FMaXRlIDMuCisgICAgICBfX1hNTF9ET01fXyA6ICAgc3VwcG9ydCBmb3IgWE1MIHBhcnNpbmcuCisgICAgICBfX0pTT05fXyA6ICAgICAgc3VwcG9ydCBmb3IgSlNPTiBwYXJzaW5nL3NlcmlhbGl6aW5nLgorICAgICAgX19NQ0NQX186ICAgICAgIHN1cHBvcnQgZm9yIE1DQ1AgaHR0cDovL3d3dy5yYW5kb21seS5vcmcvcHJvamVjdHMvTUNDUAorICAgICAgX19BTElTVFNfXzogICAgIHN1cHBvcnQgZm9yIGFsaXN0cworICAgICAgX19QQ1JFX186ICAgICAgIHN1cHBvcnQgZm9yIFBDUkUKKyAgICAgIF9fVExTX186ICAgICAgICBzdXBwb3J0IGZvciBUTFMgKGludGVybmFsKQorICAgICAgX19HTlVUTFNfXzogICAgIGlmIF9fVExTX186IFRMUyBzdXBwb3J0IHByb3ZpZGVkIGJ5IEdudVRMUy4KKyAgICAgIF9fT1BFTlNTTF9fOiAgICBpZiBfX1RMU19fOiBUTFMgc3VwcG9ydCBwcm92aWRlZCBieSBPcGVuU1NMLgorICAgICAgX19HQ1JZUFRfXzogICAgIGNyeXB0b2dyYXBoaWMgcm91dGluZXMgcHJvdmlkZWQgYnkgbGliZ2NyeXB0LgorICAgICAgX19ERVBSRUNBVEVEX186IHN1cHBvcnQgZm9yIG9ic29sZXRlIGFuZCBkZXByZWNhdGVkIGVmdW5zLgorCisKK0hJU1RPUlkKKyAgICAzLjIuMSBhZGRlZCBfX0RPTUFJTl9OQU1FX18sIF9fSE9TVF9JUF9OVU1CRVJfXywgX19IT1NUX05BTUVfXywKKyAgICAgICAgX19NQVhfUkVDVVJTSU9OX18sIF9fRUZVTl9ERUZJTkVEX18oKS4KKyAgICAzLjIuNSBhZGRlZCBfX0NPTVBBVF9NT0RFX18sIF9fTkFUSVZFX01PREVfXywgX19FVUlEU19fLAorICAgICAgICBfX0VSUV9NQVhfU0VORF9fIGFuZCBfX0VSUV9NQVhfUkVQTFlfXy4KKyAgICAzLjIuNiBhZGRlZCBfX01BWF9FVkFMX0NPU1RfXy4KKyAgICAzLjIuNyBhZGRlZCBfX1NUUklDVF9FVUlEU19fIGFuZCBtYWRlIF9fRVVJRFNfXyBzdGFuZGFyZC4KKyAgICAzLjIuOCBhZGRlZCBfX0lQVjZfXywgX19MUENfTk9TQVZFX18sIF9fRElSX18sIF9fUEFUSF9fKCkuCisgICAgMy4yLjkgYWRkZWQgX19MRE1VRF9fLCBfX01ZU1FMX18sIF9fREVQUkVDQVRFRF9fLCBfX1ZFUlNJT05fTUFKT1JfXywKKyAgICAgICAgIF9fVkVSU0lPTl9NSU5PUl9fLCBfX1ZFUlNJT05fTUlDUk9fXywgX19WRVJTSU9OX1BBVENIX18sCisgICAgICAgICBfX0lOVF9NQVhfXywgX19JTlRfTUlOX18sIF9fRkxPQVRfTUlOX18sIF9fRkxPQVRfTUFYX18sCisgICAgICAgIF9fQ0FUQ0hfRVZBTF9DT1NUX18sIF9fTUFTVEVSX0VWQUxfQ09TVF9fLCBfX1JFU0VUX1RJTUVfXywKKyAgICAgICAgX19DTEVBTlVQX1RJTUVfXywgX19EUklWRVJfTE9HX18sIGFuZCBfX1dJWkxJU1RfXy4KKyAgICAzLjIuMTAgYWRkZWQgX19NQVhfTUFMTE9DX18sIF9fTVNET1NfRlNfXywgX19MUENfQVJSQVlfQ0FMTFNfXworICAgICAgICBhbmQgX19GSUxFTkFNRV9TUEFDRVNfXy4KKyAgICAzLjMgbWFkZSBfX0xQQ19OT1NBVkVfXyBhbHdheXMgZGVmaW5lZCBhbmQgYWRkZWQgX19BTElTVFNfXywKKyAgICAgICAgX19NQ0NQX18sIF9fTFBDX1NUUlVDVFNfXywgX19MUENfSU5MSU5FX0NMT1NVUkVTX18sIF9fUEdTUUxfXywKKyAgICAgICAgX19QVEhSRUFEU19fLCBfX1RMU19fLCBfX0JPT1RfVElNRV9fLCBfX0FMQVJNX1RJTUVfXywKKyAgICAgICAgX19IRUFSVF9CRUFUX0lOVEVSVkFMX18sIF9fU1lOQ0hST05PVVNfSEVBUlRfQkVBVF9fLCBhbmQgX19QQ1JFX18uCisgICAgMy4zLjcxMyBhZGRlZCBfX0lETkFfXywgX19TUUxJVEVfXy4KKyAgICAzLjMuNzE0IGFkZGVkIF9fT1BFTlNTTF9fLCBfX0dOVVRMU19fLgorICAgIDMuMy43MTggYWRkZWQgX19YTUxfRE9NX18uCisgICAgMy4zLjcxOSByZW1vdmVkIF9fUFRIUkVBRFNfXywgQU1JR0EsIE1TRE9TX0ZTLCBfX0JFT1NfXyAgCisJCSAgICBhbmQgYWRkZWQgX19HQ1JZUFRfXy4KKyAgICAzLjMuNzIxIGFkZGVkIF9fRlVOQ1RJT05fXy4KKworU0VFIEFMU08KKyAgICBwcmFnbWEoTFBDKSwgcHJlcHJvY2Vzc29yKExQQykKZGlmZiAtLWdpdCBhL2RvYy9kcml2ZXIvc2hvd3NtYWxsbmV3bWFsbG9jZWQgYi9kb2MvZHJpdmVyL3Nob3dzbWFsbG5ld21hbGxvY2VkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZTIyNTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZHJpdmVyL3Nob3dzbWFsbG5ld21hbGxvY2VkCkBAIC0wLDAgKzEsMTcgQEAKK05BTUUKKyAgICAgICAgc2hvd3NtYWxsbmV3bWFsbG9jZWQKKworREVTQ1JJUFRJT04KKyAgICAgICAgVGhpcyBjb21tYW5kIGlzIGhhcmRjb2RlZCBpbnRvIHRoZSBkcml2ZXIuCisKKyAgICAgICAgU2hvd3MgYSBsaXN0IG9mIHJlY2VudGx5IGFsbG9jYXRlZCBzbWFsbCBtZW1vcnkgYmxvY2tzLgorICAgICAgICBJZiB0aGUgT19JU19XSVpBUkQgZmxhZyBpcyB1c2VkIGluIHRoZSBtdWRsaWIgKGkuZS4gaWYKKyAgICAgICAgc2V0X2lzX3dpemFyZCgpIHdhcyBjYWxsZWQpLCB0aGlzIGNvbW1hbmQgaXMgYWxsb3dlZCBvbmx5IGZvcgorICAgICAgICB1c2VycyB0aGF0IGhhdmUgdGhpcyBmbGFnIHNldC4KKworSElTVE9SWQorICAgICAgICBEZWFjdGl2YXRlZCBpbiAzLjIuNyBieSBkZWZhdWx0LgorCitTRUUgQUxTTworICAgICAgICBtYWxsb2MoRCksIHN0YXR1cyhEKSwgbWVtb3J5KEMpLCBvYmplY3RzKEMpLCBkZWJ1Z19pbmZvKEUpLAorICAgICAgICBzZXRfaXNfd2l6YXJkKEUpCmRpZmYgLS1naXQgYS9kb2MvZHJpdmVyL3N0YXR1cyBiL2RvYy9kcml2ZXIvc3RhdHVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NzU5ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZHJpdmVyL3N0YXR1cwpAQCAtMCwwICsxLDE4IEBACitOQU1FCisgICAgICAgIHN0YXR1cworICAgICAgICBzdGF0dXMgdGFibGVzCisgICAgICAgIHN0YXR1cyBzd2FwCisgICAgICAgIHN0YXR1cyBtYWxsb2MKKworREVTQ1JJUFRJT04KKyAgICAgICAgVGhpcyBjb21tYW5kIGlzIGhhcmRjb2RlZCBpbnRvIHRoZSBkcml2ZXJzIGlucHV0IHJvdXRpbmUuCisgICAgICAgIEl0IGRpc3BsYXlzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBydW4gc3RhdHVzIG9mIHRoZSBzeXN0ZW0uCisgICAgICAgIElmIHRoZSBPX0lTX1dJWkFSRCBmbGFnIGlzIHVzZWQgaW4gdGhlIG11ZGxpYiAoaS5lLiBpZgorICAgICAgICBzZXRfaXNfd2l6YXJkKCkgd2FzIGNhbGxlZCksIHRoaXMgY29tbWFuZCBpcyBhbGxvd2VkIG9ubHkgZm9yCisgICAgICAgIHVzZXJzIHRoYXQgaGF2ZSB0aGlzIGZsYWcgc2V0LgorCitISVNUT1JZCisgICAgICAgIDMuMi43IGFkZGVkIHRoZSAnc3RhdHVzIG1hbGxvYycgdmFyaWFudC4KKworU0VFIEFMU08KKyAgICAgICAgbWFsbG9jKEQpLCBtZW1vcnkoQyksIG9iamVjdHMoQyksIGRlYnVnX2luZm8oRSksIHNldF9pc193aXphcmQoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuLy5kZWZhdWx0IGIvZG9jL2VmdW4vLmRlZmF1bHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU2MGUxOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuLy5kZWZhdWx0CkBAIC0wLDAgKzEsMTQgQEAKK0ZVTktUSU9OOgorCitBUkdVTUVOVEU6CisKK0JFU0NIUkVJQlVORzoKKworUlVFQ0tHQUJFV0VSVDoKKworQkVNRVJLVU5HRU46CisKK0JFSVNQSUVMRToKKworU0lFSEUgQVVDSDoKKwpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vLnN5bm9ueW0gYi9kb2MvZWZ1bi8uc3lub255bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDI0YTFiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vLnN5bm9ueW0KQEAgLTAsMCArMSwzIEBACityb3VuZCBjZWlsCit0cnVuYyBjZWlsCitlZnVuOjptX2RlbGV0ZSBlZnVuX19tX2RlbGV0ZQpkaWZmIC0tZ2l0ICJhL2RvYy9lZnVuL1wxMzNcMTM1IiAiYi9kb2MvZWZ1bi9cMTMzXDEzNSIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU5Njk2YQotLS0gL2Rldi9udWxsCisrKyAiYi9kb2MvZWZ1bi9cMTMzXDEzNSIKQEAgLTAsMCArMSw2NiBAQAorU1lOT1BTSVMKKyAgICAgICAgbWl4ZWQgIGFycltpbmRleF07CisgICAgICAgIGludCAgICBzdHJbaW5kZXhdOworCisgICAgICAgICptaXhlZCBhcnJbZnJvbSAuLiB0b107CisgICAgICAgIHN0cmluZyBzdHJbZnJvbSAuLiB0b107CisKK0JFU0NIUkVJQlVORworICAgICAgICBMaWVmZXJ0IGVpbiBFbGVtZW50IGF1cyBlaW5lbSBBcnJheSBvZGVyIFN0cmluZyAoZXJzdGUgRm9ybSksIG9kZXIKKyAgICAgICAgZWluZSBUZWlsbWVuZ2UgKHp3ZWl0ZSBGb3JtKS4KKworICAgICAgICBEaWUgSW5kaXplcyA8aW5kZXg+LCA8ZnJvbT4gdW5kIDx0bz4gc2luZCBkdXJjaG51bW1lcmllcnQgdm9uIDAgYmlzCisgICAgICAgIHN0cmxlbig8c3RyPiktMSBiencuIHNpemVvZig8YXJyPiktMS4gV2VubiBlaW4gPGluZGV4PiBhbHMgJzx3ZXJ0JworICAgICAgICBnZXNjaHJpZWJlbiB3aXJkLCB3aXJkIGRlciBXZXJ0IHZvbSBFbmRlIGRlcyBTdGluZ3MgLyBBcnJheXMgaGVyCisgICAgICAgIGdlemFlaGx0LiBEYWJlaSB3aXJkIG51bW1lcmllcnQgdm9uIDEgYmlzIHN0cmxlbig8c3RyPikgYnp3LgorICAgICAgICBzaXplb2YoPGFycj4pLiBXaXJkIDxmcm9tPiB3ZWdnZWxhc3NlbiwgYmVnaW5udCBkaWUgVGVpbG1lbmdlIG1pdAorICAgICAgICBkZW0gZXJzdGVuIEVsZW1lbnQuIFdpcmQgPHRvPiB3ZWdnZWxhc3NlbiwgZW5kZXQgZGllIFRlaWxtZW5nZSBtaXQKKyAgICAgICAgZGVtIGxldHp0ZW4gRWxlbWVudC4KKworICAgICAgICBJbiBkZXIgZXJzdGVuIEZvcm0gbXVzcyA8aW5kZXg+IGlubmVyaGFsYiBkZXIgR3JlbnplbiBkZXMgU3RyaW5ncyAvCisgICAgICAgIEFycmF5cyBzZWluLCBzb25zdCB3aXJkIGVpbiBMYXVmemVpdGZlaGxlciAoUlRFKSB2ZXJ1cnNhY2h0LiBJbiBkZXIKKyAgICAgICAgendlaXRlbiBGb3JtIHdlcmRlbiBkaWUgSW5kaXplcyBhbiBkaWUgR3JvZXNzZSBkZXMgU3RyaW5ncyAvIEFycmF5cworICAgICAgICBhbmdlcGFzc3QuIFdlbm4gPGZyb20+IGdyb2Vzc2VyIGlzdCBhbHMgPHRvPiBvZGVyIGJlaWRlIGF1c3NlcmhhbGIKKyAgICAgICAgZGVyIEdyb2Vzc2UgZGVzIFN0cmluZ3MgLyBBcnJheXMgbGllZ2VuLCB3aXJkIGVpbiBsZWVyZXIgU3RyaW5nICIiCisgICAgICAgIGJ6dy4gZWluIGxlZXJlcyBBcnJheSAoe30pIHp1cnVlY2sgZ2VsaWVmZXJ0LgorCisgICAgICAgIERpZSBOb3RhdGlvbiBhbHMgQ2xvc3VyZSBpc3QgZW50c3ByZWNoZW5kOgorCisgICAgICAgICAgICBbaW5kZXhdICAgICAgLT4gKHsnI1ssICAgICAgYXJyLCBpbmRleCB9KQorICAgICAgICAgICAgWzxpbmRleF0gICAgIC0+ICh7JyNbPCwgICAgIGFyciwgaW5kZXggfSkKKyAgICAgICAgICAgIFtmcm9tLi50b10gICAtPiAoeycjWy4uXSwgICBhcnIsIGZyb20sIHRvIH0pCisgICAgICAgICAgICBbPGZyb20uLnRvXSAgLT4gKHsnI1s8Li5dLCAgYXJyLCBmcm9tLCB0byB9KQorICAgICAgICAgICAgW2Zyb20uLjx0b10gIC0+ICh7JyNbLi48XSwgIGFyciwgZnJvbSwgdG8gfSkKKyAgICAgICAgICAgIFs8ZnJvbS4uPHRvXSAtPiAoeycjWzwuLjxdLCBhcnIsIGZyb20sIHRvIH0pCisKK0JFSVNQSUVMRQorICAgICAgICBmb28gPSAoeyAxLCAyLCAzLCA0IH0pOyAgICAgICAgIHN0ciA9ICJ0ZXN0IjsKKworICAgICAgICBmb29bMV0gICAgIC0+IDEgICAgICAgICAgICAgICAgIHN0clsxXSAtPiAnZScgPT0gMTAxCisgICAgICAgIGZvb1sxLi4yXSAgLT4gKHsgMiwgMyB9KSAgICAgICAgc3RyWzEuLjJdICAtPiAiZXMiCisgICAgICAgIGZvb1syLi4xXSAgLT4gKHsgfSkgICAgICAgICAgICAgc3RyWzIuLjFdICAtPiAiIgorICAgICAgICBmb29bMC4uPDJdIC0+ICh7IDEsIDIgfSkgICAgICAgIHN0clswLi48Ml0gIC0+ICJ0ZXMiCisKKyAgICAgICAgZm9vWy4uPDJdICAtPiAoeyAxLCAyIH0pICAgICAgICBzdHJbLi48Ml0gIC0+ICJ0ZXMiCisgICAgICAgIGZvb1s8My4uXSAgLT4gKHsgMiwgMywgNCB9KSAgICAgc3RyWzwzLi5dICAtPiAiZXN0IgorCisgICAgICAgIGZvb1sxXSA9IDUgICAgICAgICAgICAgICAgICAgICAgLT4gZm9vID09ICh7IDEsIDUsIDMsIDQgfSkKKyAgICAgICAgZm9vWzEuLjJdID0gKHsgNSwgNiwgNyB9KSAgICAgICAtPiBmb28gPT0gKHsgMSwgNSwgNiwgNywgNCB9KQorICAgICAgICBmb29bMS4uMl0gPSAoeyB9KSAgICAgICAgICAgICAgIC0+IGZvbyA9PSAoeyAxLCA0IH0pCisKKyAgICAgICAgc3RyWzFdID0gJ2EnICAgICAgICAgICAgICAgICAgICAtPiBzdHIgPT0gInRhc3QiCisgICAgICAgIHN0clsxLi4yXSA9ICJiYXIiICAgICAgICAgICAgICAgLT4gc3RyID09ICJ0YmFydCIKKyAgICAgICAgc3RyWzEuLjJdID0gIiIgICAgICAgICAgICAgICAgICAtPiBzdHIgPT0gInR0IgorCitBRU5ERVJVTkdFTgorICAgICAgICBzbGljZV9hcnJheSgpIGlzdCBkaWUgYWx0ZSBGb3JtIGRlciBbXS1PcGVyYXRvcmVuIGZ1ZXIgQXJyYXlzLAorICAgICAgICBleHRyYWN0KCkgaXN0IGRpZSBhbHRlIEZvcm0gZGVyIFtdLU9wZXJhdG9yZW4gZnVlciBTdHJpbmdzLgorICAgICAgICBCRUlERSBWQVJJQU5URU4gU0lORCBWRVJBTFRFVCwgV0VSREVOIE5JQ0hUIE1FSFIgVU5URVJTVFVFVFpUIFVORAorICAgICAgICBTT0xMVEVOIERFU0hBTEIgTklDSFQgTUVIUiBWRVJXRU5ERVQgV0VSREVOLgorCisgICAgICAgIERpZSBTeW50YXggZnVlciAncnVlY2t3YWVydHMgemFlaGxlbiB2b20gbGV0enRlbiBFbGVtZW50JyBoYXQgc2ljaCB2b24KKyAgICAgICAgVmVyc2lvbiAzLjEuSiB6dSAzLjEuSyBnZWFlbmRlcnQgdm9uICctMScgenUgJzwxJy4gQXVjaCBpc3Qgc2VpdCBkYW5uCisgICAgICAgIGZvb1swLi4tMV0gZWluIGxlZXJlcyBBcnJheSBiencuIGVpbiBsZWVyZXIgU3RyaW5nLgorCitTSUVIRSBBVUNICisgICAgICAgIG1lbWJlcihFKSwgc2l6ZW9mKEUpLCBzbGljZV9hcnJheShFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vYWJzIGIvZG9jL2VmdW4vYWJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NmJlZWEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9hYnMKQEAgLTAsMCArMSwyMCBAQAorU1lOT1BTSVMKKyAgICAgICAgaW50ICAgYWJzIChpbnQgYXJnKQorICAgICAgICBmbG9hdCBhYnMgKGZsb2F0IGFyZykKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIExpZWZlcnQgZGVuIEJldHJhZyBkZXMgQXJndW1lbnRlcyA8YXJnPi4KKworQkVJU1BJRUxFCisgICAgICAgIEZ1bmt0aW9uICAgICAgUnVlY2tnYWJld2VydAorICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIGFicygtMTggICAgKSAgMTgKKyAgICAgICAgYWJzKCAxMSAgICApICAxMQorICAgICAgICBhYnMoIC0xLjk3NCkgICAxLjk3NAorCitBRU5ERVJVTkdFTgorICAgICAgICBFaW5nZWZ1ZWhydCBpbiBMRE11ZCAzLjIuNi4KKworU0lFSEUgQVVDSAorICAgICAgICBzaW4oRSksIGFzaW4oRSksIGNvcyhFKSwgYWNvcyhFKSwgdGFuKEUpLCBhdGFuKEUpLCBsb2coRSksIGV4cChFKSwKKyAgICAgICAgc3FydChFKSwgZmxvb3IoRSksIGNlaWwoRSksIHBvdyhFKSwgc2duKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9hY29zIGIvZG9jL2VmdW4vYWNvcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDg3OTU4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vYWNvcwpAQCAtMCwwICsxLDggQEAKK1NZTk9QU0lTCisgICAgICAgIGZsb2F0IGFjb3MoZmxvYXQpCisKK0JFU0NIUkVJQlVORworICAgICAgICBMaWVmZXJ0IGRlciBBcmt1c2tvc2ludXMgZGVzIEFyZ3VtZW50ZXMuCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgc2luKEUpLCBhc2luKEUpLCBjb3MoRSksIHRhbihFKSwgYXRhbihFKSwgYXRhbjIoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL2FkZF9hY3Rpb24gYi9kb2MvZWZ1bi9hZGRfYWN0aW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMGY3NzgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9hZGRfYWN0aW9uCkBAIC0wLDAgKzEsMTQ5IEBACithZGRfYWN0aW9uKEUpCitGVU5LVElPTjoKKyAgICAgdm9pZCBhZGRfYWN0aW9uKHN0cmluZyBmdW4sIHN0cmluZyBjbWQpCisgICAgIHZvaWQgYWRkX2FjdGlvbihzdHJpbmcgZnVuLCBzdHJpbmcgY21kLCBpbnQgZmxhZykKKworQVJHVU1FTlRFOgorICAgICBmdW4KKwlnZXJ1ZmVuZSBNZXRob2RlCisgICAgIGNtZAorCWF1c2xvZXNlbmRlcyBWZXJiCisgICAgIGZsYWcKKwlGbGFnIGZ1ZXIgdW5zY2hhcmZlIEludGVycHJldGF0aW9uCisKK0JFU0NIUkVJQlVORzoKKyAgICAgR2VuZXJlbGw6IERhcyBWZXJoYWx0ZW4gZGllc2VyIGVmdW4gd2lyZCBkdXJjaCBBZGRDbWQgYXVzCisgICAgICAgICAgICAgICAvc3RkL3RoaW5nL2NvbW1hbmRzLmMga29tZm9ydGFibGVyIHdpZGVyZ2VzcGllZ2VsdC4KKyAgICAgICAgICAgICAgIERhcmF1ZiBzb2xsdGUgbWFuIHp1cnVlY2tncmVpZmVuLgorCisgICAgIExlZ3QgZnVlciAiY21kIiAoZWluIEtvbW1hbmRvdmVyYikgZWluZSBpbSBlbnRzcHJlY2hlbmRlbiBPYmpla3QKKyAgICAgenUgcnVmZW5kZSBNZXRob2RlIGZlc3QuCisKKyAgICAgRGllc2UgTWV0aG9kZSBiZWtvbW10IGRpZSBBcmd1bWVudGUgYWxzIFN0cmluZyB1ZWJlcmdlYmVuIHVuZAorICAgICBtdXNzIDAgKGZ1ZXIgZWluZW4gRmVobGVyKSBvZGVyIDEgKGZ1ZXIgRXJmb2xnKSB6dXJ1ZWNrZ2ViZW4uCisKKyAgICAgRGVyIFBhcnNlciBkdXJjaHN1Y2h0IGJlaSBlaW5lciBTcGllbGVyZWluZ2FiZSBkaWUgTGlzdGUgZGVyCisgICAgIGVpbmdldHJhZ2VuZW4gS29tbWFuZG9zIG5hY2ggcGFzc2VuZGVuIEtvbW1hbmRvcyB1bmQgcnVmdCBkaWUKKyAgICAgenVnZWhvZXJpZ2VuIE1ldGhvZGVuIGluIGRlbiBPYmpla3RlbiBiaXMgZWluZSBkZXIgTWV0aG9kZW4KKyAgICAgMSB6dXJ1ZWNrZ2lidCBvZGVyIGRpZSBMaXN0ZSBkdXJjaGxhdWZlbiB3dXJkZS4gSW4gZGVtIEZhbGwKKyAgICAga29tbXQgZGllIEZlaGxlcm1lbGR1bmcgKG5vdGlmeV9mYWlsKCkpIHp1bSBFaW5zYXR6LgorCisgICAgIE1pdCBXZXJ0ZW4gIT0gMCBmdWVyICJmbGFnIiBsZWd0IG1hbiBlaW5lIHVuc2NoYXJmZSBBdXN3ZXJ0dW5nCisgICAgIGZlc3QsIGltIEJlaXNwaWVsOiBEaWUgTWV0aG9kZSAiYWN0aW9uX2Z1biIgYmVpIGVpbmVtCisgICAgICBhZGRfYWN0aW9uKCJhY3Rpb25fZnVuIiwgImhvcHMiLCAxKTsKKyAgICAgd2lyZCBzb3dvaGwgYmVpbSBLb21tYW5kbyAiaG9wcyIgYWxzIGF1Y2ggYmVpIEtvbW1hbmRvcyB3aWUKKyAgICAgImhvcHNlIiwgImhvcHNlYmx1YiIsIC4uLiBnZXJ1ZmVuIHdlcmRlbi4KKyAgICAgRGllc2VzIEZsYWcgc29sbHRlIHZvcnNpY2h0aWcgdmVyd2VuZGV0IHdlcmRlbi4KKworICAgICBFcyBnaWJ0IGRyZWkgbW9lZ2xpY2hlIFZlcmhhbHRlbnN3ZWlzZSwgZGllIHBlciAiZmxhZyIgZWluZ2VzY2hhbHRldAorICAgICB3ZXJkZW4ga29lbm5lbjoKKyAgICAgV2VubiBkYXMgQXJndW1lbnQgPGZsYWc+IEFBX1NIT1JUIChkLmguIDEpIGlzdCwga29lbm5lbiBBcmd1bWVudGUgdm9uCisgICAgIGNtZCBvaG5lIGVpbmVuIExlZXJzY2hsYWcgYW4gY21kIGFuZ2VoYWVuZ3Qgc2Vpbi4gQW4gZGllIEZ1bmt0aW9uIGZ1bgorICAgICB3ZXJkZW4gYWxsZSBaZWljaGVuIG5hY2ggZGVtIGVyc3RlbiBMZWVyc2NobGFnIGFscyBBcmd1bWVudAorICAgICB1ZWJlcmdlYmVuLgorCisgICAgIFdlbm4gPGZsYWc+IEFBX05PU1BBQ0UgKGQuaC4gMikgaXN0LCBrb2VubmVuIGRpZSBBcmd1bWVudGUgd2llZGVydW0KKyAgICAgb2huZSBMZWVyc2NobGFnIGFucyBWZXJiIGFuZ2VoYWVuZ3Qgc2Vpbi4gSW0gVW50ZXJzY2hpZWQgenUgQUFfU0hPUlQKKyAgICAgd2VyZGVuIGFsbGUgWmVpY2hlbiBuYWNoIGRlbSBWZXJiIGFscyBBcmd1bWVudCBhbiBkaWUgRnVua3Rpb24KKyAgICAgdWViZXJnZWJlbi4gRGllIFplaWNoZW4sIHdlbGNoZSBuaWNodCBkdXJjaCBlaW5lbiBMZWVyc2NobGFnIHZvbQorICAgICBWZXJiIGdldHJlbm50IHNpbmQsIHdlcmRlbiBaVVNBRVRaTElDSCB2b24gcXVlcnlfdmVyYigpIHp1cnVlY2sKKyAgICAgZ2VnZWJlbi4KKworICAgICBXZW5uIDxmbGFnPiBBQV9JTU1fQVJHUyAoMykgaXN0LCB3ZXJkZW4gYWxsZSBaZWljaGVuIG5hY2ggZGVtIFZlcmIKKyAgICAgYWxzIEFyZ3VtZW50IHVlYmVyZ2ViZW4sIG5pY2h0IGFiZXIgdm9uIHF1ZXJ5X3ZlcmIoKSBiZXJ1ZWNrc2ljaHRpZ3QuCisKKworQkVNRVJLVU5HRU46CisgICAgICgxKSBhZGRfYWN0aW9uKCkgc29sbHRlIGltbWVyIGlubmVyaGFsYiB2b24gaW5pdCgpIGJlbnV0enQgd2VyZGVuCisgICAgICgyKSBkYXMgZGVmaW5pZXJlbmRlIE9iamVrdCBtdXNzIGltIGludmVudG9yeSBkZXMgU3BpZWxlcnMgb2RlcgorICAgICAgICAgZW52aXJvbm1lbnQoKSBkZXMga29tbWFuZG9nZWJlbmRlbiBMZWJld2VzZW5zIHNlaW4KKyAgICAgKDMpIGltIGluaXQoKSBzcGFldGVyIGVpbmdldHJhZ2VuZSBLb21tYW5kb3Mgb2RlciBzcGFldGVyIGhpbnp1LQorICAgICAgICAga29tbWVuZGUgT2JqZWt0ZSB3ZXJkZW4gYmVpIGRlciBLb21tYW5kb2F1c3dlcnR1bmcgVk9SIGRlbgorICAgICAgICAgYWx0ZW4gYmVydWVja3NpY2h0aWd0CisgICAgICAgICAoRGFoZXIgYmV3ZWd0IHNpY2ggZGFzIFh0b29sIGRlciBNYWdpZXIgcmVnZWxtYWVzc2luZyBuZXUgaW4KKyAgICAgICAgICBkYXMgSW52ZW50b3J5LCB1bSBpbW1lciAiZXJzdGVzIiBPYmpla3QgenUgc2Vpbi4pCisKK0JFSVNQSUVMRToKKyAgICAgLy8gZWluIEtvbW1hbmRvIGluIGVpbmVtIFNjaGlybQorICAgICB2b2lkIGluaXQoKSB7CisgICAgICA6OmluaXQoKTsKKyAgICAgIGFkZF9hY3Rpb24oImFjdGlvbl9vZWZmbmUiLCAib2VmZm5lIik7CisgICAgIH0KKworICAgICBpbnQgYWN0aW9uX29lZmZuZShzdHJpbmcgc3RyKSB7CisgICAgICBpZihzdHJpbmdwKHN0cikgJiYgaWQoc3RyKSkJLy8gQXJndW1lbnQgZGEgdW5kIGJpbiBpY2ggZ2VtZWludD8KKyAgICAgICB3cml0ZSgiRHUgb2VmZm5lc3QgZGVuIFNjaGlybS5cbiIpOworICAgICAgIHNheShicmVha19zdHJpbmcodGhpc19wbGF5ZXIoKS0+TmFtZShXRVIpKyIgb2VmZm5ldCBlaW5lbiBTY2hpcm0uIiw3OCkpOworICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgICAgbm90aWZ5X2ZhaWwoIldhcyB3aWxsc3QgRHUgb2VmZm5lbj9cbiIpOworICAgICAgcmV0dXJuIDA7CisgICAgIH0KKworICAgICAvLyBmcnVlaGVyIGJlbGllYnQgdW0gU3BpZWxlciBsYWhtenVsZWdlbiwgZGEgZXMgX2FsbGVfIEtvbW1hbmRvcyAKKyAgICAgLy8gdHJpZ2dlcnQgLT4gc2llaGUgaGV1dGUgamVkb2NoIGRhZnVlciBlaGVyIFBfRElTQUJMRV9DT01NQU5EUworICAgICAvLyBBY2h0dW5nOiBzaWVoZSBJbXBsaWthdGlvbiB2b24gKDMpCisgICAgIGFkZF9hY3Rpb24oImFjdGlvbl9ub3RoaW5nIiwgIiIsMSApOworICAgICAuLi4KKyAgICAgaW50IGFjdGlvbl9ub3RoaW5nKHN0cmluZyBzdHIpIHsKKyAgICAgIHdyaXRlKCJEaXIgc2luZCBkaWUgSGFlbmRlIGdlYnVuZGVuLlxuIik7CisgICAgICByZXR1cm4gMTsKKyAgICAgfQorCisgICAgIEJlaXNwaWVsZSBmdWVyIGRpZSBWZXJ3ZW5kdW5nIGRlcyBBcmd1bWVudGVzICJmbGFnIjoKKyAgICAgIGFkZF9hY3Rpb24oImRpc2Z1bmMiLCAiZGlzY29ubmVjdCIsIEFBX05PU1BBQ0UpOworCisgICAgICAgIERpZSBGdW5rdGlvbiBkaXNmdW5jKCkgd2lyZCBhdWZnZXJ1ZmVuLCB3ZW5uIGRlciBTcGllbGVyICJkaXNjb25uZWN0IgorICAgICAgICBvZGVyIGVpbmUgQWJrdWVyenVuZyBkYXZvbiAoenVtIEJlaXNwaWVsICJkaSIgb2RlciAiZGlzY29uIikgZWluZ2lidC4KKyAgICAgICAgTGFlbmdlcmUgV29ydGUgKHp1bSBCZWlzcGllbCAiZGlzY29ubmVjdGluZyIpIHdlcmRlbiBOSUNIVCBlcmthbm50LgorICAgICAgICBVbSByYXVzenVmaW5kZW4sIHdhcyBkZXIgU3BpZWxlciB0YXRzYWVjaGxpY2ggZWluZ2VnZWJlbiBoYXQsIG11c3MKKyAgICAgICAgcXVlcnlfdmVyYigpIGF1ZmdlcnVmZW4gd2VyZGVuLgorCisgICAgICBhZGRfYWN0aW9uKCJmdW4iLCAiY21kIik7CisgICAgICBhZGRfYWN0aW9uKCJmdW4iLCAic2NtZCIsIEFBX1NIT1JUKTsKKyAgICAgIGFkZF9hY3Rpb24oImZ1biIsICJuY21kIiwgQUFfTk9TUEFDRSk7CisgICAgICBhZGRfYWN0aW9uKCJmdW4iLCAiaWNtZCIsIEFBX0lNTV9BUkdTKTsKKworICAgICAgICBEaWUgZm9sZ2VuZGUgVGFiZWxsZSB6ZWlndCwgd2FzIGRpZSBvYmVuIGF1ZmdlZnVlaHJ0ZW4gS29tbWFuZG9zIGJ6dy4KKyAgICAgICAgPGZsYWc+IGZ1ZXIgV2VydGUgYW4gcXVlcnlfdmVyYigpIHVuZCBhbHMgQXJndW1lbnRlIGFuIGRpZSBGdW5rdGlvbgorICAgICAgICBmdW4gdWViZXJnZWJlbjoKKyAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgICAgfCBFaW5nYWJlICAgICAgICAgICB8IHF1ZXJ5X3ZlcmIoKSB8IEFyZ3VtZW50IGRlciBGdW5rdGlvbiBmdW4gIHwKKyAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgICAgfCAiY21kIiAgICAgICAgICAgICB8ICJjbWQiICAgICAgICB8IDAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgfCAiY21kIGJsYSBmYXNlbCIgICB8ICJjbWQiICAgICAgICB8ICJibGEgZmFzZWwiICAgICAgICAgICAgICAgIHwKKyAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgICAgfCAic2NtZCIgICAgICAgICAgICB8ICJzY21kIiAgICAgICB8IDAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgfCAic2NtZCBibGEiICAgICAgICB8ICJzY21kIiAgICAgICB8ICJibGEiICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgfCAic2NtZGJsYSIgICAgICAgICB8ICJzY21kYmxhIiAgICB8IDAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgfCAic2NtZCBibGEgZmFzZWwiICB8ICJzY21kIiAgICAgICB8ICJibGEgZmFzZWwiICAgICAgICAgICAgICAgIHwKKyAgICAgICAgfCAic2NtZGJsYSBmYXNlbCIgICB8ICJzY21kYmxhIiAgICB8ICJmYXNlbCIgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgICAgfCAibmNtZCIgICAgICAgICAgICB8ICJuY21kIiAgICAgICB8IDAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgfCAibmNtZCBibGEiICAgICAgICB8ICJuY21kIiAgICAgICB8ICIgYmxhIiAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgfCAibmNtZGJsYSIgICAgICAgICB8ICJuY21kYmxhIiAgICB8ICJibGEiICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgfCAibmNtZCBibGEgZmFzZWwiICB8ICJuY21kIiAgICAgICB8ICIgYmxhIGZhc2VsIiAgICAgICAgICAgICAgIHwKKyAgICAgICAgfCAibmNtZGJsYSBmYXNlbCIgICB8ICJuY21kYmxhIiAgICB8ICJibGEgZmFzZWwiICAgICAgICAgICAgICAgIHwKKyAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgICAgfCAiaWNtZCIgICAgICAgICAgICB8ICJpY21kIiAgICAgICB8IDAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgfCAiaWNtZCBibGEiICAgICAgICB8ICJpY21kIiAgICAgICB8ICIgYmxhIiAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgfCAiaWNtZGJsYSIgICAgICAgICB8ICJpY21kIiAgICAgICB8ICJibGEiICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgfCAiaWNtZCBibGEgZmFzZWwiICB8ICJpY21kIiAgICAgICB8ICIgYmxhIGZhc2VsIiAgICAgICAgICAgICAgIHwKKyAgICAgICAgfCAiaWNtZGJsYSBmYXNlbCIgICB8ICJpY21kIiAgICAgICB8ICJibGEgZmFzZWwiICAgICAgICAgICAgICAgIHwKKyAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKworCitHRVNDSElDSFRFCisgICAgICAgIERhcyBBcmd1bWVudCA8ZmxhZz4gPCAwIHdpcmQgc2VpdCAzLjJAMTI3IHVudGVyc3R1ZXR6dCwgYWJlciBlcnN0IGFiCisgICAgICAgIExETXVkIDMuMi44IHJpY2h0aWcgaW1wbGVtZW50aWVydC4gTERNdWQgMy4yLjkgZnVlaHJ0ZSBkYXMgQUFfSU1NX0FSR1MKKyAgICAgICAgRmxhZyBlaW4uIEFiIExETXVkIDMuNSBrYW5uIG1hbiBDbG9zdXJlcyBhbHMgRnVua3Rpb25lbiB1ZWJlcmdlYmVuLgorCitTSUVIRSBBVUNIOgorCQkJcmVtb3ZlX2FjdGlvbihFKSwgaW5pdChFKSwgZW5hYmxlX2NvbW1hbmRzKEUpCisgICAgIEZlaGxlcm1lbGR1bmc6CW5vdGlmeV9mYWlsKEUpLCBfbm90aWZ5X2ZhaWwoRSkKKyAgICAgQXJndW1lbnRzdHJpbmc6CXF1ZXJ5X3ZlcmIoRSksIF91bnBhcnNlZF9hcmdzKEwpCisgICAgIG9ic29sZXQ6CQlhZGRfdmVyYihFKSwgYWRkX3h2ZXJiKEUpCisgICAgIGFsdGVybmF0aXY6CUFkZEFjdGlvbihMKSwgQWRkQ21kKEwpCisgICAgICAgICAgICAgICAgICAgICAgICBQX0RJU0FCTEVfQ09NTUFORFMKKworMjQuIE1hZXJ6IDIwMDQgR2xvaW5zb25ATUcKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL2FsbF9lbnZpcm9ubWVudCBiL2RvYy9lZnVuL2FsbF9lbnZpcm9ubWVudApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTNmNDkzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vYWxsX2Vudmlyb25tZW50CkBAIC0wLDAgKzEsMzMgQEAKK1NZTk9QU0lTCisgICAgICAgIG9iamVjdCAqYWxsX2Vudmlyb25tZW50KCk7CisgICAgICAgIG9iamVjdCAqYWxsX2Vudmlyb25tZW50KG9iamVjdCBvYik7CisKK0FSR1VNRU5URToKKyAgICAgICAgb2IgLSBkYXMgT2JqZWt0LCBkZXNzZW4gZW52aXJvbm1lbnQoKXMgZ2V3dWVuc2NodCB3ZXJkZW4KKworQkVTQ0hSRUlCVU5HCisgICAgICAgIEdpYnQgZWluIEFycmF5IG1pdCBhbGxlbiBVbWdlYnVuZ2VuIGRlcyBPYmpla3RzIDxvYj4genVydWVjay4KKyAgICAgICAgV2VubiA8b2I+IG5pY2h0IGFuZ2VnZWJlbiB3aXJkLCB3aXJkIHN0YW5kYXJkbWFlc3NpZyB0aGlzX29iamVjdCgpCisgICAgICAgIHZlcndlbmRldC4KKworICAgICAgICBXZW5uIDxvPiBrZWluZSBVbWdlYnVuZyBoYXQgb2RlciB6ZXJzdG9lcnQgd3VyZGUsIHdpcmQgMCB6dXJ1ZWNrCisgICAgICAgIGdlZ2ViZW4uCisKK0JFTUVSS1VOR0VOOgorICAgICAgICBEYXMgenVydWVja2dlZ2ViZW5lIEFycmF5IGlzdCBzbyBhbmdlbGVndCwgZGFzcyBkaWUgaW5uZXJzdGUgVW1nZWJ1bmcKKyAgICAgICAgYW0gQW5mYW5nIGRlcyBBcnJheXMgc3RlaHQsIHVuZCBkaWUgYWV1c3NlcnN0ZSBVbWdlYnVuZyBhbSBFbmRlLgorCitCRUlTUElFTAorICAgICAgICAoRGllIGdlc3VjaHRlIEZhY2tlbCBiZWZpbmRldCBzaWNoIGluIGVpbmVtIEJlaGFlbHRlciwgZGVuIFdhcmdvbiBiZWkKKyAgICAgICAgc2ljaCB0cmFlZ3QuIFdhcmdvbiBzdGVodCBpbiBzZWluZW0gV29ya3Jvb20uKQorCisgICAgICAgIG9iID0gYWxsX2Vudmlyb25tZW50KGZpbmRfb2JqZWN0KCIvb2JqL2ZhY2tlbCMzMiIpKTsKKyAgICAgICAgPT4gb2IgPSAoe1srd3Vlc3RlL2R1cmlhbi9iZWhhZWx0ZXIjMzFdLFsvbWFnaWVyOndhcmdvbl0sW34vd29ya3Jvb21dfSkKKworQUVOREVSVU5HRU4KKyAgICAgICAgRWluZ2VmdWVocnQgaW4gTERNdWQgMy4yLjYuIEVpbiBWb3JzY2hsYWcgdm9uIFR1Yk11ZC4KKworU0lFSEUgQVVDSAorICAgICAgICBlbnZpcm9ubWVudChFKSwgYWxsX2ludmVudG9yeShFKQorCis3LkZlYiAyMDA3IEdsb2luc29uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vYWxsX2ludmVudG9yeSBiL2RvYy9lZnVuL2FsbF9pbnZlbnRvcnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ2ZWVhMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2FsbF9pbnZlbnRvcnkKQEAgLTAsMCArMSwxNyBAQAorYWxsX2ludmVudG9yeQorRlVOS1RJT046CisgICAgIG9iamVjdCAqYWxsX2ludmVudG9yeSgpCisgICAgIG9iamVjdCAqYWxsX2ludmVudG9yeShvYmplY3Qgb2IpCisKK0JFU0NIUkVJQlVORzoKKyAgICAgTGllZmVydCBlaW4gRmVsZCAoQXJyYXkpIG1pdCBhbGxlbiBPYmpla3RlbiwgZGllIHNpY2ggaW0gT2JqZWt0IG9iCisgICAgIGJlZmluZGVuIChiencuIGluIHRoaXNfb2JqZWN0KCksIHNvZmVybiBrZWluIEFyZ3VtZW50IGFuZ2VnZWJlbgorICAgICB3dXJkZSkuCisgICAgIEdlcmFkZSBiZWkgc2VociB2b2xsZW4gT2JqZWt0ZW4gYmlldGV0IHNpY2ggZWhlciBmaXJzdF9pbnZlbnRvcnkoKSwKKyAgICAgbmV4dF9pbnZlbnRvcnkoKSBhbi4KKworU0lFSEUgQVVDSDoKKyAgICAgZmlyc3RfaW52ZW50b3J5KEUpLCBuZXh0X2ludmVudG9yeShFKSwgZGVlcF9pbnZlbnRvcnkoRSksCisgICAgIGFsbF9lbnZpcm9ubWVudChFKSwgZW52aXJvbm1lbnQoRSkKKworMjIuIE1hZXJ6IDIwMDQgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9lZnVuL2FsbG9jYXRlIGIvZG9jL2VmdW4vYWxsb2NhdGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU5MWM1ZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2FsbG9jYXRlCkBAIC0wLDAgKzEsMzggQEAKK1NZTk9QU0lTCisgICAgICAgICptaXhlZCBhbGxvY2F0ZShpbnQgc2l6ZSk7CisgICAgICAgICptaXhlZCBhbGxvY2F0ZShpbnQgc2l6ZSwgbWl4ZWQgaW5pdF92YWx1ZSk7CisKKyAgICAgICAgKm1peGVkIGFsbG9jYXRlKCppbnQgc2l6ZXMpOworICAgICAgICAqbWl4ZWQgYWxsb2NhdGUoKmludCBzaXplcywgbWl4ZWQgaW5pdF92YWx1ZSk7CisKK0JFU0NIUkVJQlVORworICAgICAgICBBbGxvemllcnQgZWluIEFycmF5IHZvbiA8c2l6ZT4gRWxlbWVudGVuLiBEaWUgQW56YWhsIEVsZW1lbnRlIG11c3MKKyAgICAgICAgZ3JvZXNzZXIgc2VpbiBhbHMgMCwgZGFyZiBhYmVyIGRhcyBTeXN0ZW1tYXhpbXVtIChub3JtYWxlcndlaXNlIDEwMDApCisgICAgICAgIG5pY2h0IHVlYmVyc3RlaWdlbi4gV2lyZCA8aW5pdF92YWx1ZT4gYW5nZWdlYmVuLCB3aXJkIGFsbGVuIEVsZW1lbnRlbgorICAgICAgICBkaWVzZXIgYWxzIEFuZmFuZ3N3ZXJ0IHp1Z2V3aWVzZW4uIFdlbm4gPGluaXRfdmFsdWU+IGVpbiBNYXBwaW5nIG9kZXIKKyAgICAgICAgZWluIEFycmF5IGlzdCwgd2lyZCBmdWVyIGplZGVzIEVsZW1lbnQgZWluZSBlaW5mYWNoZSBLb3BpZSBlcnN0ZWxsdC4KKyAgICAgICAgV2lyZCA8aW5pdF92YWx1ZT4gbmljaHQgYW5nZWdlYmVuLCBzaW5kIGFsbGUgRWxlbWVudGUgMC4KKworICAgICAgICBJbiBkZXIgendlaXRlbiBGb3JtIChtaXQgZWluZW0gRmVsZCB2b24gPHNpemVzPiBhbnN0ZWxsZSBudXIgZWluZXIKKyAgICAgICAgPHNpemU+KSBlcnpldWd0IGFsbG9jYXRlKCkgZWluIG1laHJkaW1lbnNpb25hbGVzIEFycmF5LCBlaW4gQXJyYXkgYXVzCisgICAgICAgIEFycmF5cy4KKworICAgICAgICBIZXV0ZSB3aXJkIGFsbG9jYXRlKCkga2F1bSBtZWhyIGJlbm9ldGlndCwgd2VpbCBBcnJheXMgbWl0IGRlbQorICAgICAgICArLU9wZXJhdG9yIGFkZGllcnQgd2VyZGVuIGtvZW5uZW4gdW5kIG1pdCBkZW0gKHt9KS1PcGVyYXRvcgorICAgICAgICBpbml0aWFsaXNpZXJ0LiBEZXIgZWluemlnZSBOdXR6ZW4gZGVyIEZ1bmt0aW9uIGlzdCwgZ3Jvc3NlIGxlZXJlCisgICAgICAgIG9kZXIgaW5pdGlhbGlzaWVydGUgQXJyYXlzIHp1IGVyemV1Z2VuLgorCitCRUlTUElFTAorICAgICAgICBzdHJpbmcgKmJ1ZmZlcjsKKyAgICAgICAgYnVmZmVyID0gYWxsb2NhdGUoNTApOworICAgICAgICBidWZmZXIgPSBhbGxvY2F0ZSg1MCwgIiIpOworCisgICAgICAgIGJ1ZmZlciA9IGFsbG9jYXRlKCAoeyAyLCAzIH0pICkKKyAgICAgICAgICAtLT4gKHsgKHsgMCwgMCwgMCB9KSwgKHsgMCwgMCwgMCB9KSB9KQorCitBRU5ERVJVTkdFTgorICAgICAgICBMRE11ZCAzLjIuOSBmdWVocnRlIGRlbiBBbmZhbmdzd2VydCA8aW5pdF92YWx1ZT4gdW5kIGRpZQorICAgICAgICAgICAgSW5pdGlhbGlzaWVydW5nIHZvbiBtZWhyZGltZW5zaW9uYWxlbiBBcnJheXMgZWluLgorCitTSUVIRSBBVUNICisgICAgICAgIHNpemVvZihFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vYW5kX2JpdHMgYi9kb2MvZWZ1bi9hbmRfYml0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDY2ZDYxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vYW5kX2JpdHMKQEAgLTAsMCArMSwyMyBAQAorU1lOT1BTSVMKKyAgICAgICAgc3RyaW5nIGFuZF9iaXRzKHN0cmluZyBzdHIxLCBzdHJpbmcgc3RyMik7CisKK0JFU0NIUkVJQlVORworICAgICAgICA8c3RyMT4gdW5kIDxzdHIyPiBzZWllbiBiZWlkZXMgQml0c3RyaW5ncy4gRGFzIFJlc3VsdGF0IHZvbiBhbmRfYml0cygpCisgICAgICAgIGlzdCBlaW4gQml0c3RyaW5nIG1pdCBkZW0gYmluYWVyZW4gVW5kIHZvbiA8c3RyMT4gdW5kIDxzdHIyPiwgZGFzCisgICAgICAgIGhlaXNzdCBlaW4gU3RyaW5nLCBpbiBkZW0gZWluIEJpdCBudXIgZ2VzZXR6dCBpc3QsIHdlbm4gZGFzCisgICAgICAgIGVudHNwcmVjaGVuZGUgQml0IGluIGJlaWRlbiBTdHJpbmdzIDxzdHIxPiB1bmQgPHN0cjI+IGdlc2V0enQgaXN0LgorCitCRUlTUElFTAorICAgICAgICBzdHJpbmcgczEsIHMyLCBzMzsKKworICAgICAgICBzMSA9IHNldF9iaXQoIiIsIDMpOyBzMSA9IHNldF9iaXQoczEsIDE1KTsgIC0+IHMxIGlzICIoICgiCisgICAgICAgIHMyID0gc2V0X2JpdCgiIiwgMyk7IHMyID0gc2V0X2JpdChzMiwgNCk7ICAgLT4gczIgaXMgIjgiCisKKyAgICAgICAgczMgPSBhbmRfYml0cyhzMSwgczIpOworCisgICAgICAgIC0tPiBzMyBpc3QgamV0enQgIjgiLCBkLmguIGVpbiBCaXRzdHJpbmcsIGluIGRlbSBudXIgZGFzIDMuIEJpdAorICAgICAgICAgICAgZ2VzZXR6dCBpc3QuCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgY2xlYXJfYml0KEUpLCBzZXRfYml0KEUpLCB0ZXN0X2JpdChFKSwgbmV4dF9iaXQoRSksIGxhc3RfYml0KEUpLAorICAgICAgICBjb3VudF9iaXRzKEUpLCBvcl9iaXRzKEUpLCB4b3JfYml0cyhFKSwgaW52ZXJ0X2JpdHMoRSksIGNvcHlfYml0cyhFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vYXBwbHkgYi9kb2MvZWZ1bi9hcHBseQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWEzMGE1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vYXBwbHkKQEAgLTAsMCArMSwzNSBAQAorU1lOT1BTSVMKKyAgICAgICAgbWl4ZWQgYXBwbHkoY2xvc3VyZSBjbCwgbWl4ZWQgYXJnLCAuLi4pOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgV2VydGV0IGRpZSBDbG9zdXJlIDxjbD4gYXVzLiBXZW5uIDxjbD4ga2VpbmUgQ2xvc3VyZSBpc3QsIHdpcmQgPGNsPgorICAgICAgICB1bnZlcmFlbmRlcnQgenVydWVjayBnZWxpZWZlcnQgdW5kIGFsbGUgQXJndW1lbnRlIDxhcmc+IHdlcmRlbgorICAgICAgICBpZ25vcmllcnQuCisKKyAgICAgICAgRXMgZ2lidCBlaW5lbiBrbGVpbmVuIFVudGVyc2NoaWVkIHp1IGZ1bmNhbGwoKSwgZGFzIGphIGltIFdlc2VudGxpY2hlbgorICAgICAgICBkYXMgZ2xlaWNoZSB0dXQgKG5hZW1saWNoLCBlaW5lIENsb3N1cmUgYXVzd2VydGVuKTogd2VubiBkYXMgbGV0enRlCisgICAgICAgIEFyZ3VtZW50IHZvbiBhcHBseSgpIGVpbiBBcnJheSBpc3QsIHdpcmQgamVkZXMgRWxlbWVudCBkaWVzZXMgQXJyYXlzCisgICAgICAgIHp1IGVpbmVtIHNlcGFyYXRlbiB6dXNhZXR6bGljaGVuIFBhcmFtZXRlciBkZXIgQ2xvc3VyZSB1bWdld2FuZGVsdC4KKworICAgICAgICBFaW5lIG1vZWdsaWNoZSBBbndlbmR1bmcgd2FlcmU6CisgICAgICAgICAgICBtaXhlZCBldmFsKG9iamVjdCBvYixzdHJpbmcgZnVuYyxtaXhlZCAqYXJncykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXBwbHkoIydjYWxsX290aGVyLG9iLGZ1bmMsYXJncyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgRGFzIGZ1ZWhydCB6dSBmb2xnZW5kZW4gQXVmcnVmZW46CisgICAgICAgICAgICBvYi0+ZnVuYyhhcmdzWzBdLGFyZ3NbMV0sLi4uLGFyZ3Nbc2l6ZW9mKGFyZ3MpLTFdKQorCisgICAgICAgIFdhZXJlIHN0YXR0ZGVzc2VuIGZ1bmNhbGwoKSBhdWZnZXJ1ZmVuIHdvcmRlbiwgc28gaGFldHRlIGRhcyBlcmdlYmVuOgorICAgICAgICAgICAgb2ItPmZ1bmMoYXJncykKKworICAgICAgICBFaW5lIHdpY2h0aWdlIEFud2VuZHVuZyB2b24gYXBwbHkoKSBpc3QgZGFzIEF1c3dlcnRlbiBkZXMKKyAgICAgICAgQXJyYXktQXJndW1lbnRzIGluICJ2YXJhcmdzIiBGdW5rdGlvbmVuLgorCitBRU5ERVJVTkdFTgorICAgICAgICBFaW5nZWZ1ZWhydCBpbiAzLjJANzAuCisgICAgICAgIExETXVkIDMuMi44IGZ1ZWhydGUgZWluLCBkYXNzIGRhcyBlcnN0ZSBBcmd1bWVudCB6dXJ1ZWNrIGdlZ2ViZW4gd2lyZCwKKyAgICAgICAgICAgIHdlbm4gZXMgc2ljaCBuaWNodCB1bSBlaW5lIENsb3N1cmUgaGFuZGVsdC4KKworU0lFSEUgQVVDSAorICAgICAgICBmdW5jYWxsKEUpLCBjbG9zdXJlcyhMUEMpLCB2YXJhcmdzKExQQykKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL2FzaW4gYi9kb2MvZWZ1bi9hc2luCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YzZkNGQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9hc2luCkBAIC0wLDAgKzEsOCBAQAorU1lOT1BTSVMKKyAgICAgICAgZmxvYXQgYXNpbihmbG9hdCkKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIExpZWZlcnQgZGVyIEFya3Vzc2ludXMgZGVzIEFyZ3VtZW50ZXMuCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgc2luKEUpLCBjb3MoRSksIGFjb3MoRSksIHRhbihFKSwgYXRhbihFKSwgYXRhbjIoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL2F0YW4gYi9kb2MvZWZ1bi9hdGFuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNWI3NDgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9hdGFuCkBAIC0wLDAgKzEsMTEgQEAKK1NZTk9QU0lTCisgICAgICAgIGZsb2F0IGF0YW4oaW50fGZsb2F0KQorCitCRVNDSFJFSUJVTkcKKyAgICAgICAgTGllZmVydCBkZW4gQXJrdXN0YW5nZW5zIGRlcyBBcmd1bWVudGVzLgorCitBRU5ERVJVTkdFTgorICAgICAgICBMRE11ZCAzLjIuOTogR2FuenphaGxlbiAoSW50ZWdlcnMpIGFscyBBcmd1bWVudCBoaW56dWdlZnVlZ3QuCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgYXRhbjIoRSksIHNpbihFKSwgY29zKEUpLCB0YW4oRSksIGFzaW4oRSksIGFjb3MoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL2F0YW4yIGIvZG9jL2VmdW4vYXRhbjIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRjZDc4YQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2F0YW4yCkBAIC0wLDAgKzEsMTYgQEAKK1NZTk9QU0lTCisgICAgICAgIGZsb2F0IGF0YW4yIChpbnR8ZmxvYXQgeSwgaW50fGZsb2F0IHgpCisKK0JFU0NIUkVJQlVORworICAgICAgICBMaWVmZXJ0IGRlbiBXaW5rZWwgZGVyIFBvbGFya29vcmRpbmF0ZW4gZGVzIFB1bmt0ZXMgKHgsIHkpIGltCisgICAgICAgIEJlcmVpY2ggKC1QaSwgUGldLgorCisgICAgICAgIE1hbiBiZWFjaHRlIGRpZSBWZXJ0YXVzY2h1bmcgZGVyIEtvb3JkaW5hdGVuIHggdW5kIHkgaW4gZGVyCisgICAgICAgIFBhcmFtZXRlci1MaXN0ZSwgZGllIGRpZSBBYmZvbGdlIGluIGRlciBTdGVpZ3VuZ3MtV2lua2VsLVVtcmVjaG51bmcKKyAgICAgICAgYXRhbih5IC8geCkgd2lkZXJzcGllZ2VsdC4KKworQUVOREVSVU5HRU4KKyAgICAgICAgTERNdWQgMy4yLjk6IEdhbnp6YWhsZW4gKEludGVnZXJzKSBhbHMgQXJndW1lbnRlIGhpbnp1Z2VmdWVndC4KKworU0lFSEUgQVVDSAorICAgICAgICBzaW4oRSksIGNvcyhFKSwgdGFuKEUpLCBhc2luKEUpLCBhY29zKEUpLCBhdGFuKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9hdHRhY2hfZXJxX2RlbW9uIGIvZG9jL2VmdW4vYXR0YWNoX2VycV9kZW1vbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzJiMTNiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vYXR0YWNoX2VycV9kZW1vbgpAQCAtMCwwICsxLDM3IEBACitTWU5PUFNJUworICAgICAgICBpbnQgYXR0YWNoX2VycV9kZW1vbihvYmplY3Qgb2IsIGludCBkb19jbG9zZSkKKyAgICAgICAgaW50IGF0dGFjaF9lcnFfZGVtb24oc3RyaW5nIG9ibmFtZSwgaW50IGRvX2Nsb3NlKQorCitERVNDUklQVElPTgorICAgICAgICBUaGlzIHByaXZpbGVnZWQgZWZ1biBpcyB0byBzZXQvY2hhbmdlIHRoZSBjb25uZWN0aW9uIG9mIHRoZQorICAgICAgICBkcml2ZXIgdG8gdGhlIGV4dGVybmFsIGVycSBkZW1vbiwgdGh1cyBpbiBlZmZlY3QgY2hhbmdpbmcgdGhlCisgICAgICAgIGRlbW9ucy4KKworICAgICAgICBUaGUgY29ubmVjdGlvbiBvZiB0aGUgZ2l2ZW4gaW50ZXJhY3RpdmUgJ29iJ2plY3QgaXMgdGFrZW4gYXdheSghKQorICAgICAgICBmcm9tIGl0IGFuZCBzdG9yZWQgYXMgdGhlIGVycS1jb25uZWN0aW9uLiBUaGUgb2JqZWN0IGl0c2VsZiBpcworICAgICAgICB0aGVuIG5vIGxvbmdlciBuZWVkZWQsIGJ1dCBtYXkgc3RheSBhbGl2ZSAtIGl0IGlzIGp1c3QgYW5vdGhlcgorICAgICAgICBub24taW50ZXJhY3RpdmUgb2JqZWN0IHRoZW4uCisKKyAgICAgICAgSW4gdGhlIHNlY29uZCBmb3JtLCB0aGUgc3RyaW5nIHdpbGwgYmUgY29tYmluZWQgYXMgc3VmZml4IHRvCisgICAgICAgIHRoZSBmaWxlbmFtZSBFUlFGSUxFPG9ibmFtZT4sIHdoaWNoIGlzIHRoZW4gdGhlIGJpbmFyeSB0byBiZQorICAgICAgICBmb3JrZWQgb2ZmIGFzIG5ldyBlcnEgZGVtb24uIFRoZSBjb21tdW5pY2F0aW9uIHdpdGggdGhpcyBlcnEKKyAgICAgICAgd2lsbCB0YWtlIHBsYWNlIG92ZXIgdW5peCBkb21haW4gc29ja2V0cy4gRVJRRklMRSBkZWZhdWx0cyB0bworICAgIEJJTkRJUi9lcnEsIHdoZXJlIEJJTkRJUiBpcyB0aGUgY29uZmlndXJhdGlvbiB2YWx1ZSBmb3IgdGhlCisgICAgZXhlY3V0YWJsZSBkaXJlY3RvcnkuCisKKyAgICAgICAgSWYgdGhlcmUgaXMgYWxyZWF5IGFuIGVycSBkZW1vbiBjb25uZWN0ZWQgdG8gdGhlIGRyaXZlciwgdGhlCisgICAgICAgIGZ1bmN0aW9uIHdpbGwgZmFpbCB1bmxlc3MgJ2RvX2Nsb3NlJyAoZGVmYXVsdCAwKSBpcyBzcGVjaWZpZWQKKyAgICAgICAgYXMgMSAob3IgYW55IG90aGVyIG9kZCBpbnRlZ2VyKTogdGhlbiB0aGUgb2xkIGNvbm5lY3Rpb24gd2lsbAorICAgICAgICBiZSBjbG9zZWQgYmVmb3JlIGF0dGFjaGluZyB0aGUgbmV3LgorICAgICAgICBUaGUgZWZ1biByZXR1cm5zIDEgb24gc3VjY2VzcywgZWxzZSAwLgorCitFWEFNUExFCisgICAgICAgIFRvIHJlc3RhcnQgdGhlIChkZWZhdWx0KSBlcnEsIHdyaXRlIGluCisgICAgICAgIG1hc3Rlci5jOjpzdGFsZV9lcnEoY2xvc3VyZSBjKToKKyAgICAgICAgICBhdHRhY2hfZXJxX2RlbW9uKCIiLCAwKTsKKworSElTVE9SWQorICAgICAgICBJbnRyb2R1Y2VkIGluIDMuMi4xQDYxLgorCitTRUUgQUxTTworICAgICAgICBzZW5kX2VycShFKSwgZXJxKEMpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9iYXNlb2YgYi9kb2MvZWZ1bi9iYXNlb2YKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY0Y2MyMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2Jhc2VvZgpAQCAtMCwwICsxLDE2IEBACitTWU5PUFNJUworICAgICAgICBpbnQgYmFzZW9mIChzdHJ1Y3QgYiwgc3RydWN0IHMpCisKK0RFU0NSSVBUSU9OCisgICAgICAgIFRlc3QgaWYgdGhlIHR5cGUgb2Ygc3RydWN0IDxiPiBpcyBhIGJhc2Ugb2Ygc3RydWN0IDxzPiAodGhlCisgICAgICAgIHZhbHVlcyBvZiA8Yj4gYW5kIDxzPiBhcmUgaXJyZWxldmFudCkuIFJlc3VsdHMgYXJlOgorICAgICAgICAgIDA6IDxiPiBpcyBub3QgYSBiYXNlIG9mIDxzPiwgbm9yIGlzIDxiPiBvZiBlcXVhbCB0eXBlIGFzIDxzPgorICAgICAgICAgICAgICAgKHRob3VnaCA8cz4gbWlnaHQgYmUgYSBiYXNlIG9mIDxiPikuCisgICAgICAgICAgMTogPGI+IGlzIGEgdHJ1ZSBiYXNlIG9mIDxzPgorICAgICAgICAgIDI6IDxiPiBhbmQgPHM+IGFyZSB0aGUgc2FtZSBzdHJ1Y3QgdHlwZQorCitISVNUT1JZCisgICAgICAgIEludHJvZHVjdGVkIGluIExETXVkIDMuMy4zNDQuCisKK1NFRSBBTFNPCisgICAgICAgIHN0cnVjdHAoRSksIHN0cnVjdHMoTFBDKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vYmluYXJ5X21lc3NhZ2UgYi9kb2MvZWZ1bi9iaW5hcnlfbWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGJjMzIxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vYmluYXJ5X21lc3NhZ2UKQEAgLTAsMCArMSwzNiBAQAorR0VTQ0hVRVRaVAorU1lOT1BTSVMKKyAgICAgICAgaW50IGJpbmFyeV9tZXNzYWdlKGludCAqfHN0cmluZyBtZXNzYWdlcywgaW50IGZsYWdzKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIExpZXN0IGRlbiBPdXRwdXQgYXVzIHVuZCBzZW5kZXQgZGllc2VuIGRpcmVrdCBtaXQgd3JpdGUoKSBPSE5FIElBQworICAgICAgICBRVU9USU5HLiBEaWUgTmFjaHJpY2h0IGthbm4gTnVsbGVuIGVudGhhbHRlbiwgd2VubiBzaWUgYWxzCisgICAgICAgIGludCAqIGFuZ2VnZWJlbiBzaW5kLiBEaWUgTmFjaHJpY2h0IHdpcmQgYW4gdGhpc19vYmplY3QoKSBhdXNnZWdlYmVuLAorICAgICAgICBhYmVyIG51ciwgd2VubiBkaWVzZXMgaW50ZXJha3RpdiBpc3QuCisKKyAgICAgICAgRGVyIFJ1ZWNrZ2FiZXdlcnQgaXN0IGRpZSBBbnphaGwgdGF0c2FlY2hsaWNoIGdlZHJ1Y2t0ZXIgWmVpY2hlbi4gRWluZQorICAgICAgICBhbGxmYWVsbGlnZSAiYWxsb3dlZCBjaGFyc2V0IiBFaW5zdGVsbHVuZyB3aXJkIHVlYmVyZ2FuZ2VuLgorCisgICAgICAgIDxmbGFncz4gd2VyZGVuIGJpdHdlaXNlIGludGVycHJldGllcnQgdW5kIGtvZW5uZW4gdWViZXIgZGFzIGJpbmFlcmUKKyAgICAgICAgT2RlciB2ZXJidW5kZW4gd2VyZGVuLgorCisgICAgICAgIEJpdCAwIChXZXJ0IDEpOiB3ZW5uIGdlc2V0enQsIHdpcmQgYWRkX21lc3NhZ2UoKSBhbnN0ZWxsZSB2b24KKyAgICAgICAgICAgIHdyaXRlKCkgdmVyd2VuZGV0LiBTbyBtdXNzIGRlciBPdXRwdXQgbmljaHQgenVlcnN0IGF1c2dlbGVzZW4KKyAgICAgICAgICAgIHdlcmRlbiwgYWxsZXJkaW5ncyBlcmZvbGd0IGRpZSBBdXNnYWJlIG5pY2h0IHNvZm9ydC4gQXVjaCBrYW5uCisgICAgICAgICAgICBkYW5uIGRpZSBBbnphaGwgZWZmZWt0aXYgdWViZXJ0cmFnZW5lciBaZWljaGVuIG5pY2h0IGJlc3RpbW10CisgICAgICAgICAgICB3ZXJkZW4gLSBkZXIgUnVlY2tnYWJld2VydCBpc3QgbmljaHQgZGVmaW5pZXJ0LgorCisgICAgICAgIEJpdCAxIChXZXJ0IDIpOiBEZXIgUHVmZmVyIHdpcmQgYXVzZ2VsZXNlbiwgX25hY2hkZW1fIGRpZSBOYWNocmljaHQKKyAgICAgICAgICAgIGFuZ2VmdWVndCB3dXJkZS4gSXN0IG51ciBpbiBWZXJiaW5kdW5nIG1pdCBCaXQgMCBzaW5udm9sbC4KKworICAgICAgICBEaWUgSWRlZSBoaW50ZXIgZGVuIEZsYWdzIGlzdCwgZGFzcyBkYXMgU2VuZGVuIHZvbiBLb21tYW5kb2NvZGVzCisgICAgICAgIHp1bSBCZWlzcGllbCBmdWVyIEZhcmJlbiBhbiBkZW4gdm9yaGFuZGVuZW4gRmlsdGVybiBmdWVyIGVybGF1YnRlCisgICAgICAgIFplaWNoZW4gdm9yYmVpZ2VzY2hsZXVzdCB3ZXJkZW4gbXVzcywgamVkb2NoIG5pY2h0IHdpY2h0aWcgZ2VudWcKKyAgICAgICAgaXN0LCB1bSBkaWUgVmVyc2Nod2VuZHVuZyB2b24gQmFuZGJyZWl0ZSBtaXR0ZWxzIGVpbmVyCisgICAgICAgIHN5bmNocm9uZW4gVWViZXJ0cmFndW5nIHp1IHJlY2h0ZmVydGlnZW4uCisKK0FFTkRFUlVOR0VOCisgICAgICAgIEVpbmdlZnVlaHJ0IGluIDMuMi4xQDQwLgorCitTSUVIRSBBVUNICisgICAgICAgIHNldF9jb25uZWN0aW9uX2NoYXJzZXQoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL2JpbmRfbGFtYmRhIGIvZG9jL2VmdW4vYmluZF9sYW1iZGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA3NWEzMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2JpbmRfbGFtYmRhCkBAIC0wLDAgKzEsMTYgQEAKK1NZTk9QU0lTCisgICAgICAgIGNsb3N1cmUgYmluZF9sYW1iZGEoY2xvc3VyZSwgb2JqZWN0IG9iKQorCitERVNDUklQVElPTgorICAgICAgICBCaW5kcyBhbiB1bmJvdW5kIGxhbWJkYSBjbG9zdXJlIHRvIGFuIG9iamVjdCBhbmQgcmV0dXJuIGl0LgorICAgICAgICBUaGUgZWZ1biBjYW4gYWxzbyBiZSB1c2VkIHRvIHJlYmluZCBhbiBlZnVuLSwgc2ltdWwtZWZ1bgorICAgICAgICBvciBvcGVyYXRvciBjbG9zdXJlIHRvIGEgZGlmZmVyZW50IG9iamVjdC4KKworICAgICAgICBJZiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgb2IgaXMgbm90IHRoaXNfb2JqZWN0KCksIHRoZSBwcml2aWxlZ2UKKyAgICAgICAgdmlvbGF0aW9uICgiYmluZF9sYW1iZGEiLCB0aGlzX29iamVjdCgpLCBvYikgb2NjdXJzLgorCitISVNUT1JZCisgICAgICAgIEludHJvZHVjZWQgaW4gMy4yQDgyLgorCitTRUUgQUxTTworICAgICAgICBsYW1iZGEoRSksIHVuYm91bmRfbGFtYmRhKEUpLCBhcHBseShFKSwgZnVuY2FsbChFKSwgY2xvc3VyZXMoTFBDKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vYmx1ZXByaW50IGIvZG9jL2VmdW4vYmx1ZXByaW50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNzc0OTcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9ibHVlcHJpbnQKQEAgLTAsMCArMSwyMyBAQAorVk9STEFFVUZJRworU1lOT1BTSVMKKyAgICAgICAgb2JqZWN0IGJsdWVwcmludCgpCisgICAgICAgIG9iamVjdCBibHVlcHJpbnQoc3RyaW5nfG9iamVjdCBvYik7CisKK0JFU0NIUkVJQlVORworICAgICAgICBEaWUgRWZ1biBsaWVmZXJ0IGRlbiBCbHVlcHJpbnQgZnVlciBkYXMgYW5nZWdlYmVuIE9iamVrdCA8b2I+IG9kZXIKKyAgICAgICAgZnVlciB0aGlzX29iamVjdCgpLCB3ZW5uIG5pY2h0IGFuZ2VnZWJlbi4KKworICAgICAgICBXZW5uIGRlciBCbHVlcHJpbnQgemVyc3RvZXJ0IHd1cmRlLCBsaWVmZXJ0IGRpZSBGdW5rdGlvbiAwLiBGdWVyCisgICAgICAgIE9iamVrdGUgbWl0IHJlcGxhY2VfcHJvZ3JhbSgpIGxpZWZlcnQgZGllIEZ1bmt0aW9uIGRlbiBCbHVlcHJpbnQgZGVzCisgICAgICAgIGVyc2V0emVuZGVuIFByb2dyYW1zLgorCitCRUlTUElFTAorICAgICAgICBibHVlcHJpbnQoIi9vYmovZGluZyIpOyAgICAgICAgICAgICAgICAgLT4gbGllZmVydCAvb2JqL2RpbmcKKyAgICAgICAgYmx1ZXByaW50KGZpbmRfb2JqZWN0KCIvb2JqL2RpbmciKSk7ICAgIC0+IGxpZWZlcnQgL29iai9kaW5nCisgICAgICAgIGJsdWVwcmludChjbG9uZV9vYmplY3QoIi9vYmovZGluZyIpKTsgICAtPiBsaWVmZXJ0IC9vYmovZGluZworCitBRU5ERVJVTkdFTgorICAgICAgICBFaW5nZWZ1ZWhydCBpbiBMRE11ZCAzLjIuOS4KKworU0lFSEUgQVVDSAorICAgICAgICBjbG9uZXMoRSksIGNsb25lX29iamVjdChFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vYnJlYWtfcG9pbnQgYi9kb2MvZWZ1bi9icmVha19wb2ludApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODQ0NTNlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vYnJlYWtfcG9pbnQKQEAgLTAsMCArMSwxMSBAQAorT1BUSU9OQUwKK1NZTk9QU0lTCisgICAgICAgIHZvaWQgYnJlYWtfcG9pbnQoKQorCitERVNDUklQVElPTgorICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIGZvciBzeXN0ZW0gaW50ZXJuYWwgdXNlIGFuZCBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGJ5CisgICAgICAgIHVzZXIgb2JqZWN0cy4gSXQgaXMgc3VwcG9zZWQgdG8gY2hlY2sgdGhlIHN0YWNrIGludGVncml0eSBhbmQgYWJvcnRzCisgICAgICAgIHRoZSBkcml2ZXIgd2hlbiBpdCBkZXRlY3RzIGNvcnJ1cHRpb24uCisKK1NFRSBBTFNPCisgICAgICAgIHNodXRkb3duKEUpLCBzd2FwKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9jYWxsX2RpcmVjdCBiL2RvYy9lZnVuL2NhbGxfZGlyZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YWIwMjgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9jYWxsX2RpcmVjdApAQCAtMCwwICsxLDc1IEBACitTWU5PUFNJUworICAgICAgICB1bmtub3duIGNhbGxfZGlyZWN0IChvYmplY3Qgb2IsIHN0cmluZyBmdW4sIG1peGVkIGFyZywgLi4uKQorICAgICAgICB1bmtub3duIGNhbGxfZGlyZWN0IChvYmplY3QgKm9iLCBzdHJpbmcgZnVuLCBtaXhlZCBhcmcsIC4uLikKKworREVTQ1JJUFRJT04KKyAgICAgICAgQ2FsbCBhIG1lbWJlciBmdW5jdGlvbiA8ZnVuPiBpbiBhbm90aGVyIG9iamVjdCA8b2I+IHdpdGggYW4KKyAgICAgICAgdGhlIGFyZ3VtZW50KHMpIDxhcmcuLi4+LiBSZXN1bHQgaXMgdGhlIHZhbHVlIHJldHVybmVkIGZyb20KKyAgICAgICAgdGhlIGNhbGxlZCBmdW5jdGlvbiAob3IgMCBmb3Igbm9uLWV4aXN0aW5nIG9yIHZvaWQgZnVuY3Rpb25zKS4KKworICAgICAgICBUaGlzIGVmdW4gaXMgYSB0d2luIHRvIGNhbGxfb3RoZXIoKSwgd2l0aCB0aGUgZGlmZmVyZW5jZQorICAgICAgICBiZWluZyB0aGF0IGNhbGxfZGlyZWN0KCkgbmV2ZXIgY2FsbHMgYSBkZWZhdWx0IG1ldGhvZC4KKworICAgICAgICBPcHRpb25hbGx5IHRoZSBkcml2ZXIgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gYWNjZXB0IGFuIGFycmF5IG9mCisgICAgICAgIG9iamVjdHMgYXMgPG9iPjogdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIHRoZSBzYW1lCisgICAgICAgIGFyZ3VtZW50cyBpbiBhbGwgdGhlIGdpdmVuIG9iamVjdHMuICBUaGUgc2luZ2xlIHJlc3VsdHMgYXJlCisgICAgICAgIGNvbGxlY3RlZCBpbiBhbiBhcnJheSBhbmQgeWllbGQgdGhlIGZpbmFsIHJlc3VsdC4gIEFycmF5CisgICAgICAgIGVsZW1lbnRzIGNhbiBiZSBvYmplY3RzIG9yIHRoZSBuYW1lcyBvZiBleGlzdGluZyBvYmplY3RzOworICAgICAgICBkZXN0cnVjdGVkIG9iamVjdHMgYW5kIDBzIHdpbGwgeWllbGQgYSAnMCcgYXMgcmVzdWx0LCBidXQKKyAgICAgICAgZG9uJ3QgY2F1c2UgYW4gZXJyb3IuCisKKyAgICAgICAgSWYgdGhlIGFycmF5LWNhbGxpbmcgbW9kZSBpcyBhdmFpbGFibGUsIHRoZSBtYWNybworICAgICAgICBfX0xQQ19BUlJBWV9DQUxMU19fIGlzIGRlZmluZWQuCisKKyAgICAgICAgVGhlIG9iamVjdChzKSBjYW4gYmUgZ2l2ZW4gZGlyZWN0bHkgb3IgdmlhIGEgc3RyaW5nIChpLmUuIGl0cworICAgICAgICBvYmplY3RfbmFtZSkuIElmIGl0IGlzIGdpdmVuIGJ5IGEgc3RyaW5nIGFuZCB0aGUgb2JqZWN0IGRvZXMgbm90CisgICAgICAgIGV4aXN0IHlldCwgaXQgd2lsbCBiZSBsb2FkZWQuCisKKyAgICAgICAgb2ItPmZ1bihhcmdzKSBhbmQgIm9iX25hbWUiLT5mdW4oYXJncykgaXMgZXF1aXZhbGVudCB0bworICAgICAgICBjYWxsX290aGVyKG9iLCAiZnVuIiwgYXJncykuIE5vd2FkYXlzIHRoZSBvYl9uYW1lIHN0cmluZyBjYW4KKyAgICAgICAgYWxzbyBiZSBhIHZhcmlhYmxlLgorCisgICAgICAgIG9iLT5mdW4oYXJncykgYW5kIG9iLT4iZnVuIihhcmdzKSBhcmUgZXF1aXZhbGVudCB0bworICAgICAgICBjYWxsX290aGVyKG9iLCAiZnVuIiwgYXJncykuIG9iLT4oZnVuKShhcmdzKSBhcmUgZXF1aXZhbGVudAorICAgICAgICB0byBjYWxsX290aGVyKG9iLCBmdW4sIGFyZ3MpIHdoZXJlIGZ1biBpcyBhIHJ1bnRpbWUgZXhwcmVzc2lvbgorICAgICAgICByZXR1cm5pbmcgdGhlIGZ1bmN0aW9uIG5hbWUuCisKKyAgICAgICAgSWYgb2I6OmZ1biBkb2VzIG5vdCBkZWZpbmUgYSBwdWJsaWNseSBhY2Nlc3NpYmxlIGZ1bmN0aW9uLCB0aGUKKyAgICAgICAgY2FsbF9vdGhlcigpIHdpbGwgcmV0dXJuIDAsIHdoaWNoIGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20KKyAgICAgICAgYSBmdW5jdGlvbiByZXR1cm5pbmcgMC4KKworICAgICAgICAicHVibGljbHkgYWNjZXNzaWJsZSIgbWVhbnMgInB1YmxpYyIgd2hlbiBjYWxsaW5nIG90aGVyIG9iamVjdHMsCisgICAgICAgIGFuZCAicHVibGljIiBvciAic3RhdGljIiB3aGVuIGNhbGxpbmcgdGhpc19vYmplY3QoKS4gInByaXZhdGUiCisgICAgICAgIGFuZCAicHJvdGVjdGVkIiBmdW5jdGlvbiBjYW4gbmV2ZXIgYmUgY2FsbGVkIHdpdGggY2FsbF9vdGhlcigpLgorCisgICAgICAgIFRoZSByZXR1cm4gdHlwZSBvZiBjYWxsX290aGVyKCkgaXMgJ2FueScgYmUgZGVmYXVsdC4gSG93ZXZlciwKKyAgICAgICAgaWYgeW91ciBMUEMgY29kZSB1c2VzICNwcmFnbWEgc3RyaWN0X3R5cGVzLCB0aGUgcmV0dXJuIHR5cGUgaXMKKyAgICAgICAgJ3Vua25vd24nLCBhbmQgdGhlIHJlc3VsdCBvZiBjYWxsX290aGVyKCkgbXVzdCBiZSBjYXN0ZWQgdG8KKyAgICAgICAgdGhlIGFwcHJvcHJpYXRlIHR5cGUgYmVmb3JlIHlvdSBjYW4gdXNlIGl0IGZvciBhbnl0aGluZy4KKworRVhBTVBMRVMKKyAgICAgICAgLy8gQWxsIHRoZSBmb2xsb3dpbmcgc3RhdGVtZW50cyBjYWxsIHRoZSBsZnVuIFF1ZXJ5UHJvcCgpCisgICAgICAgIC8vIGluIHRoZSBjdXJyZW50IHBsYXllciB3aXRoIHRoZSBhcmd1bWVudCBQX1NIT1JULgorICAgICAgICBzdHJpbmcgc3RyLCBmdW47CisKKyAgICAgICAgc3RyID0gKHN0cmluZyljYWxsX2RpcmVjdCh0aGlzX3BsYXllcigpLCAiUXVlcnlQcm9wIiwgUF9TSE9SVCk7CisgICAgICAgIGZ1biA9ICJRdWVyeVByb3AiOworICAgICAgICBzdHIgPSAoc3RyaW5nKWNhbGxfZGlyZWN0KHRoaXNfcGxheWVyKCksIGZ1biwgUF9TSE9SVCk7CisKKyAgICAgICAgWW91IGhhdmUgdG8gZG8gZXhwbGljaXQgdHlwZSBjYXN0aW5nIGJlY2F1c2Ugb2YgdGhlIHVua25vd24KKyAgICAgICAgcmV0dXJuIHR5cGUsIGlmIHlvdSBoYXZlIHNldCAjcHJhZ21hIHN0cmljdF90eXBlcy4KKworICAgICAgICAvLyBUaGlzIHN0YXRlbWVudCBjYWxscyB0aGUgbGZ1biBzaG9ydCgpIGluIGFsbCBpbnRlcmFjdGl2ZSB1c2VycworICAgICAgICAvLyBhbmQgc3RvcmVzIHRoZSBjb2xsZWN0ZWQgcmVzdWx0cyBpbiBhIHZhcmlhYmxlLgorICAgICAgICBzdHJpbmcgKiBzOworCisgICAgICAgIHMgPSAoc3RyaW5nICopY2FsbF9kaXJlY3QodXNlcnMoKSwgInNob3J0Iik7CisKKworSElTVE9SWQorICAgICAgICBJbnRyb2R1Y2VkIGluIExETXVkIDMuMy4xMTMgd2l0aCB0aGUgSF9ERUZBVUxUX01FVEhPRCBob29rLgorICAgICAgICBMRE11ZCAzLjIuMTAgbWFkZSB0aGUgY2FsbCBvbiBhcnJheXMgb2Ygb2JqZWN0cyBjb25maWd1cmFibGUuCisKK1NFRSBBTFNPCisgICAgICAgIGNhbGxfb3RoZXIoRSksIGNhbGxfZGlyZWN0X3Jlc29sdmVkKEUpLCBjcmVhdGUoQSksIHByYWdtYShMUEMpLAorICAgICAgICBleHRlcm5fY2FsbChFKSwgZnVuY3Rpb25fZXhpc3RzKEUpLCBmdW5jdGlvbnMoTFBDKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vY2FsbF9kaXJlY3RfcmVzb2x2ZWQgYi9kb2MvZWZ1bi9jYWxsX2RpcmVjdF9yZXNvbHZlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjI3OTM0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vY2FsbF9kaXJlY3RfcmVzb2x2ZWQKQEAgLTAsMCArMSwyNSBAQAorU1lOT1BTSVMKKyAgICAgICAgaW50IGNhbGxfZGlyZWN0X3Jlc29sdmVkKG1peGVkIHJlc3VsdCwgb2JqZWN0IG9iLCBzdHJpbmcgZnVuYywgLi4uKQorCitERVNDUklQVElPTgorICAgICAgICBTaW1pbGFyIHRvIGNhbGxfZGlyZWN0KCkuIElmIG9iLT5mdW5jKCkgaXMgZGVmaW5lZCBhbmQgcHVibGljbHkKKyAgICAgICAgYWNjZXNzaWJsZSwgYW55IG9mIHRoZSBvcHRpb25hbCBleHRyYSBhcmd1bWVudHMgYXJlIHBhc3NlZCB0bworICAgICAgICBvYi0+ZnVuYyguLi4pLiBUaGUgcmVzdWx0IG9mIHRoYXQgZnVuY3Rpb24gY2FsbCBpcyBzdG9yZWQgaW4KKyAgICAgICAgcmVzdWx0LCB3aGljaCBtdXN0IGJlIHBhc3NlZCBieSByZWZlcmVuY2UuCisKKyAgICAgICAgVGhpcyBlZnVuIGlzIGEgdHdpbiB0byBjYWxsX3Jlc29sdmVkKCksIHdpdGggdGhlIGRpZmZlcmVuY2UKKyAgICAgICAgYmVpbmcgdGhhdCBjYWxsX2RpcmVjdF9yZXNvbHZlZCgpIG5ldmVyIGNhbGxzIGEgZGVmYXVsdCBtZXRob2QuCisKKyAgICAgICAgVGhlIGVmdW4gcmV0dXJucyAxIGlmIHRoZSBmdW5jdGlvbiBjb3VsZCBiZSBjYWxsZWQuCisgICAgICAgIElmIG9iOjpmdW4gZG9lcyBub3QgZGVmaW5lIGEgcHVibGljbHkgYWNjZXNzaWJsZSBmdW5jdGlvbiwgdGhlCisgICAgICAgIGVmdW4gd2lsbCByZXR1cm4gMC4KKworICAgICAgICBvYiBjYW4gYWxzbyBiZSBhbiBvYmplY3RfbmFtZS4gSWYgYSBzdHJpbmcgaXMgcGFzc2VkIGZvciBvYiwgYW5kCisgICAgICAgIG5vIG9iamVjdCB3aXRoIHRoYXQgbmFtZSBkb2VzIGV4aXN0LCBhbiBlcnJvciBvY2N1cnMuCisKK0hJU1RPUlkKKyAgICAgICAgSW50cm9kdWNlZCBpbiBMRE11ZCAzLjMuMTEzIHdpdGggdGhlIEhfREVGQVVMVF9NRVRIT0QgaG9vay4KKworU0VFIEFMU08KKyAgICAgICAgY2FsbF9kaXJlY3QoRSksIGNhbGxfcmVzb2x2ZWQoRSksIGZ1bmN0aW9uX2V4aXN0cyhFKSwKKyAgICAgICAgZmluZF9vYmplY3QoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL2NhbGxfb3RoZXIgYi9kb2MvZWZ1bi9jYWxsX290aGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ODdmNGQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9jYWxsX290aGVyCkBAIC0wLDAgKzEsOTQgQEAKK1NZTk9QU0lTCisgICAgICAgIHVua25vd24gY2FsbF9vdGhlcihvYmplY3Qgb2IsIHN0cmluZyBmdW4sIG1peGVkIGFyZywgLi4uKTsKKyAgICAgICAgdW5rbm93biBjYWxsX290aGVyKG9iamVjdCAqb2IsIHN0cmluZyBmdW4sIG1peGVkIGFyZywgLi4uKTsKKworICAgICAgICBvYi0+ZnVuKG1peGVkIGFyZywgLi4uKTsKKyAgICAgICAgb2ItPiJmdW4iKG1peGVkIGFyZywgLi4uKTsKKyAgICAgICAgb2ItPihmdW4pKG1peGVkIGFyZywgLi4uKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIFJ1ZnQgZGllIGluIGVpbmVtIGFuZGVyZW4gT2JqZWt0IDxvYj4gZGllIEZ1bmt0aW9uIDxmdW4+IG1pdCBkZW4KKyAgICAgICAgQXJndW1lbnRlbiA8YXJnLi4uPiBhdWYgdW5kIGdpYnQgZGVuIFdlcnQgenVydWVjaywgZGVyIHZvbiBkZXIKKyAgICAgICAgRnVua3Rpb24gPGZ1bj4gZ2VsaWVmZXJ0IHdpcmQgKG9kZXIgMCBmdWVyIG5pY2h0IGV4aXN0aWVyZW5kZSBvZGVyCisgICAgICAgIGFscyB2b2lkIGRla2xhcmllcnRlICBGdW5rdGlvbmVuKS4KKworICAgICAgICBPcHRpb25hbCBrYW5uIGRlciBEcml2ZXIgc28ga29uZmlndWVyaWVydCB3ZXJkZW4sIGRhc3MgYXVjaCBlaW4gQXJyYXkKKyAgICAgICAgdm9uIE9iamVrdGVuICo8b2I+IGFremVwdGllcnQgd2lyZC4gRGllIEZ1bmt0aW9uIDxmdW4+IHdpcmQgZGFubiBmdWVyCisgICAgICAgIGplZGVzIE9iamVrdCA8b2I+IGltIEFycmF5IG1pdCBkZW4gQXJndW1lbnRlbiA8YXJnLi4uPiBhdWZnZXJ1ZmVuLgorICAgICAgICBEaWUgZWluemVsbmVuIFJlc3VsdGF0ZSB3ZXJkZW4gaW4gZWluZW0gQXJyYXkgenVzYW1tZW4gZ2VmYXNzdCB1bmQKKyAgICAgICAgZGllc2VzIEFycmF5IGRhbm4gYWxzIEVuZHJlc3VsdGF0IHZvbiBjYWxsX290aGVyKCkgenVydWVjayBnZWdlYmVuLgorICAgICAgICBEaWUgRWxlbWVudGUgdm9uICo8b2I+IGtvZW5uZW4gT2JqZWt0ZSBvZGVyIE5hbWVuIHZvbiBPYmpla3RlbiBzZWluLgorICAgICAgICBaZXJzdG9lcnRlIE9iamVrdGUgdW5kIDAgYWxzIEVsZW1lbnQgZ2ViZW4gZWluZSAwIHp1cnVlY2ssIGZ1ZWhyZW4KKyAgICAgICAgYWJlciBuaWNodCB6dSBlaW5lbSBGZWhsZXIuCisgICAgICAgIGNhbGxfb3RoZXIoKSBhdWYgQXJyYXlzIHZvbiBPYmpla3RlbiBpc3QgaW0gTUcgYWt0aXZpZXJ0LCB3ZWxjaGVzCisgICAgICAgIGR1cmNoIGRhcyBEZWZpbmUgX19MUENfQVJSQVlfQ0FMTFNfXyBhbmdlemVpZ3Qgd2lyZC4KKworICAgICAgICBEYXMgT2JqZWt0IChiencuIGRpZSBPYmpla3RlKSBrYW5uIGRpcmVrdCBvZGVyIHVlYmVyIGVpbmVuIFN0cmluZworICAgICAgICAoZC5oLiBkZW4gT2JqZWt0bmFtZW4pIGFuZ2VnZWJlbiB3ZXJkZW4uIFdlbm4gZWluIFN0cmluZyBhbmdlZ2ViZW4KKyAgICAgICAgd2lyZCB1bmQgZGFzIE9iamVrdCBub2NoIG5pY2h0IGV4aXN0aWVydCwgd2lyZCBlcyBnZWxhZGVuLgorCisgICAgICAgIG9iLT5mdW4oYXJncykgdW5kICJvYl9uYW1lIi0+ZnVuKGFyZ3MpIHNpbmQgYWVxdWl2YWxlbnQgenUKKyAgICAgICAgY2FsbF9vdGhlcihvYiwgImZ1biIsIGFyZ3MpLiBIZXV0enV0YWdlIGthbm4gIm9iX25hbWUiIGF1Y2ggZWluZQorICAgICAgICBWYXJpYWJsZSBzZWluLiBvYi0+KGZ1bikoYXJncykgaXN0IGFlcXVpdmFsZW50IHp1CisgICAgICAgIGNhbGxfb3RoZXIob2IsIGZ1biwgYXJncyksIHdvYmVpIDxmdW4+IGVpbiBSdW50aW1lIEF1c2RydWNrIGlzdCwKKyAgICAgICAgZGVyIGRlbiBGdW5rdGlvbnNuYW1lbiBsaWVmZXJ0LgorCisgICAgICAgIFdlbm4gZGFzIE9iamVrdCA8b2I+IGtlaW5lIG9lZmZlbnRsaWNoZSBGdW5rdGlvbiBtaXQgZGVtIE5hbWVuIDxmdW4+CisgICAgICAgIGVudGhhZWx0LCBnaWJ0IGNhbGxfb3RoZXIoKSBkZW4gV2VydCAwIHp1cnVlY2suIERpZXMgaXN0IG5pY2h0CisgICAgICAgIHVudGVyc2NoZWlkYmFyIHZvbiBlaW5lciBGdW5rdGlvbiA8ZnVuPiwgZGllIDAgenVydWVjayBsaWVmZXJ0LgorICAgICAgICBPZWZmZW50bGljaCBiZWRldXRldCAicHVibGljIiwgd2VubiBhbmRlcmUgT2JqZWt0ZSBhdWZnZXJ1ZmVuCisgICAgICAgIHdlcmRlbiB1bmQgInB1YmxpYyIgb2RlciAic3RhdGljIiwgd2VubiBkZXIgQXVmcnVmIGFuIHRoaXNfb2JqZWN0KCkKKyAgICAgICAgZXJnZWh0LiBGdW5rdGlvbmVuLCBkaWUgInByaXZhdGUiIG9kZXIgInByb3RlY3RlZCIgZGVmaW5pZXJ0IHNpbmQsCisgICAgICAgIGtvZW5uZW4gbmllbWFscyB2b24gY2FsbF9vdGhlcigpIGF1ZmdlcnVmZW4gd2VyZGVuLgorCisgICAgICAgIERlciBSdWVja2dhYmV3ZXJ0IHZvbiBjYWxsX290aGVyKCkgaXN0IHN0YW5kYXJkbWFlc3NpZyAnYW55Jy4gRmFsbHMKKyAgICAgICAgYWJlciAjcHJhZ21hIHN0cmljdF90eXBlcyBnZXNldHp0IGlzdCwgaXN0IGRlciBSdWVja2dhYmV3ZXJ0CisgICAgICAgICd1bmtub3duJywgdW5kIGRhcyBSZXN1bHRhdCBkZXMgY2FsbF9vdGhlcigpIG11c3MgenVlcnN0IGF1ZiBlaW5lbgorICAgICAgICB6dXRyZWZmZW5kZW4gVmFyaWFibGVudHlwIGdlY2FzdGV0IHdlcmRlbiwgYmV2b3IgbWFuIGVzIGZ1ZXIgZXR3YXMKKyAgICAgICAgdmVyd2VuZGVuIGthbm4uCisKK0JFSVNQSUVMRQorICAgICAgICBEaWUgbmFjaGZvbGdlbmRlbiBCZWlzcGllbGUgcnVmZW4gYWxsZSBkaWUgRnVua3Rpb24gIlF1ZXJ5UHJvcCIgYXVmCisgICAgICAgIG1pdCBkZW0gQXJndW1lbnQgUF9TSE9SVC4KKworICAgICAgICAgICAgc3RyaW5nIHN0ciwgZnVuOworICAgICAgICAgICAgc3RyID0gKHN0cmluZyljYWxsX290aGVyKHRoaXNfcGxheWVyKCksICJRdWVyeVByb3AiLCBQX1NIT1JUKTsKKyAgICAgICAgICAgIGZ1biA9ICJRdWVyeVByb3AiOworICAgICAgICAgICAgc3RyID0gKHN0cmluZyljYWxsX290aGVyKHRoaXNfcGxheWVyKCksIGZ1biwgUF9TSE9SVCk7CisKKyAgICAgICAgICAgIHN0ciA9IChzdHJpbmcpdGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKFBfU0hPUlQpOworICAgICAgICAgICAgc3RyID0gKHN0cmluZyl0aGlzX3BsYXllcigpLT4iUXVlcnlQcm9wIihQX1NIT1JUKTsKKyAgICAgICAgICAgIGZ1biA9ICJRdWVyeVByb3AiOworICAgICAgICAgICAgc3RyID0gKHN0cmluZyl0aGlzX3BsYXllcigpLT4oZnVuKShQX1NIT1JUKTsKKworICAgICAgICBTb2xhbmdlICNwcmFnbWEgc3RyaWN0X3R5cGVzIGdlc2V0enQgaXN0LCBtdXNzIG1hbiBkYXMgUmVzdWx0YXQgdm9uCisgICAgICAgIGNhbGxfb3RoZXIoKSBleHBsaXppdCBhdWYgZWluZW4gcGFzc2VuZGVuIFR5cCBjYXN0ZW4sIHdlaWwKKyAgICAgICAgY2FsbF9vdGhlcigpIHVua25vd24gbGllZmVydC4KKworICAgICAgICBEYXMgZm9sZ2VuZGUgU3RhdGVtZW50IHJ1ZnQgZGllIGxmdW4gc2hvcnQoKSBpbiBhbGxlbiBha3RpdmVuCisgICAgICAgIEJlbnV0emVybiBhdWYgdW5kIHNwZWljaGVydCBkYXMgZ2VzYW1tZWx0ZSBSZXN1bHRhdCBpbiBlaW5lcgorICAgICAgICBWYXJpYWJsZW46CisKKyAgICAgICAgICAgIHN0cmluZyAqIHM7CisgICAgICAgICAgICBzID0gKHN0cmluZyAqKXVzZXJzKCktPnNob3J0KCk7CisKKyAgICAgICAgT2JqZWt0ZSBsYWRlbiAob2Jzb2xldCk6CisgICAgICAgICAgICBDb21wYXQ6IGNhbGxfb3RoZXIoIi91c2Vycy9sdXNlci90aGluZyIsICI/Pz8iLCAwKTsKKworICAgICAgICBEYXMgc2llaHQgZXR3YXMgbWVya3d1ZXJkaWcgYXVzLCB3dXJkZSBhYmVyIG9mdCB2ZXJ3ZW5kZXQsIHVtIGVpbmZhY2gKKyAgICAgICAgZWluIE9iamVrdCB6dSBsYWRlbi4gRGF6dSB3dXJkZSBkaWUgKG5pY2h0IGV4aXN0aWVyZW5kZSkgRnVua3Rpb24KKyAgICAgICAgIj8/PyIgaW0gT2JqZWt0IGF1ZmdlcnVmZW4uIEdsdWVja2xpY2hlcndlaXNlIGdpYnQgZXMgaGV1dGUgenUKKyAgICAgICAgZGllc2VtIFp3ZWNrIGRpZSBFZnVuIGxvYWRfb2JqZWN0KCksIGFsc28gYml0dGUgbmljaHQgbWVociB2ZXJ3ZW5kZW4uCisKK0FFTkRFUlVOR0VOCisgICAgICAgIEluIExETXVkIDMuMi44IHd1cmRlbiBkaWUgZm9sZ2VuZGVuIFZlcmJlc3NlcnVuZ2VuIGVpbmdlZnVlaHJ0OgorICAgICAgICAgIC0gZGllIEZvcm1lbiB4LT4ieSIoKSB1bmQgeC0+KHkpKCkgd2VyZGVuIGVya2FubnQ7CisgICAgICAgICAgLSBkaWUgRm9ybSB4LT55KCkga29sbGlkaWVydCBuaWNodCBtZWhyIG1pdCBlaW5lciBsb2thbGVuIFZhcmlhYmxlbiwKKyAgICAgICAgICAgIGRpZSBhdWNoICJ5IiBoZWlzc3QuCisgICAgICAgICAgLSBlaW5lIHNpbXVsX2VmdW4gY2FsbF9vdGhlcigpIGVyd2lzY2h0IGF1Y2ggQXVmcnVmZSBkZXIgRm9ybSAtPigpLgorICAgICAgICAgIC0gY2FsbF9vdGhlciBrYW5uIGF1Y2ggYXVmIEFycmF5cyB2b24gT2JqZWt0ZW4gYW5nZXdhbmR0IHdlcmRlbi4KKyAgICAgICAgTERNdWQgMy4yLjEwIG1hY2h0ZSBkZW4gQXVmcnVmIHZvbiBPYmpla3RhcnJheXMga29uZmlndXJpZXJiYXIuCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgZnVuY3Rpb25fZXhpc3RzKEUpLCBjYWxsX3Jlc29sdmVkKEUpLCBjcmVhdGUoQSksIHByYWdtYShMUEMpLAorICAgICAgICBleHRlcm5fY2FsbChFKSwgZnVuY3Rpb25zKExQQykKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL2NhbGxfb3V0IGIvZG9jL2VmdW4vY2FsbF9vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJhMjhiMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2NhbGxfb3V0CkBAIC0wLDAgKzEsNTQgQEAKK1NZTk9QU0lTCisgICAgICAgIHZvaWQgY2FsbF9vdXQoc3RyaW5nIGZ1biwgaW50IGRlbGF5LCBtaXhlZCBhcmcsIC4uLikKKyAgICAgICAgdm9pZCBjYWxsX291dChjbG9zdXJlIGNsLCBpbnQgZGVsYXksIG1peGVkIGFyZywgLi4uKQorCitERVNDUklQVElPTgorICAgICAgICBTZXQgdXAgYSBjYWxsIHRvIGZ1bmN0aW9uIGZ1biBpbiB0aGUgY3VycmVudCBvYmplY3QsIG9yIHRvCisgICAgICAgIGNsb3N1cmUgY2wuIFRoZSBjYWxsIHdpbGwgdGFrZSBwbGFjZSBpbiBkZWxheSBzZWNvbmRzLCB3aXRoIHRoZQorICAgICAgICByZW1haW5pbmcgYXJndW1lbnQgbGlzdCBwcm92aWRlZC4gZGVsYXkgY2FuIGJlIDAsIGJ1dCBiZSBjYXJlZnVsIQorCisgICAgICAgIGNhbGxfb3V0KCkgc2F2ZXMgYW5kIHJlc3RvcmVzIHRoZSBjdXJyZW50IHVzZXIuIEl0IGlzIG5vdworICAgICAgICBwb3NzaWJsZSB0byB1c2Ugc2F5KCkgb3Igd3JpdGUoKSB3aGljaCByZWx5IG9uIGEgY3VycmVudAorICAgICAgICB1c2VyIHRvIGJlIHNvbWV0aGluZyB1c2VmdWwuCisKKyAgICAgICAgY2FsbF9vdXQoKSBjYW4gb25seSBjYWxsIGZ1bmN0aW9ucyB3aGljaCBhcmUgcHVibGljbHkgYWNjZXNzaWJsZSwKKyAgICAgICAgaS5lLiAicHVibGljIiBhbmQgInN0YXRpYyIgZnVuY3Rpb25zLiAicHJpdmF0ZSIgYW5kICJwcm90ZWN0ZWQiCisgICAgICAgIGZ1bmN0aW9ucyBjYW4ndCBiZSBjYWxsZWQuCisKKyAgICAgICAgVGhlIGV4ZWN1dGlvbiBvZiB0aGUgY2FsbF9vdXQoKXMgaW1wbGllcyBhIHNpbXBsZSAobm90CisgICAgICAgIGV4aGF1c3RpdmUpIG1lYXN1cmUgYWdhaW5zdCByYWJiaXRzOiB0aGUgZXZhbHVhdGlvbiBjb3N0cyBvZgorICAgICAgICB0aG9zZSBjYWxsX291dHMoKSBleGVjdXRpbmcgYXQgdGhlIHNhbWUgdGltZSBhcmUgc3VtbWVkIHVwIG9uCisgICAgICAgIGEgcGVyLVVJRCBiYXNlLiBJZiB0aGUgc3VtbWVkLXVwIGNvc3RzIGV4Y2VlZCB0aGUgZ2l2ZW4gbWF4aW11bSwKKyAgICAgICAgYSAndG9vIGxvbmcgZXZhbHVhdGlvbicgZXJyb3Igd2lsbCBvY2N1ciBhbmQgYW55IHJlbWFpbmluZworICAgICAgICBjYWxsX291dHMoKSBvZiB0aGlzIHVzZXIgc2NoZWR1bGVkIGZvciB0aGUgc2FtZSB0aW1lIGFyZQorICAgICAgICBkaXNjYXJkZWQuCisKKyAgICAgICAgQ2FsbG91dHMgYXJlIGV4ZWN1dGVkIGV2ZXJ5IDJzLCB0aGVyZWZvcmUgeW91ciBkZWxheSBtYXkgYmUgYmlnZ2VyCisgICAgICAgIHRoYW4gdGhlIHlvdSBzcGVjaWZpZWQuIEluIGZhY3QsIGEgQ2FsbG91dCB3aXRoIGRlbGF5PT0wIGlzCisgICAgICAgIGV4ZWN1dGVkIHdpdGhpbiAycyBmcm9tIHRoZSBmdW5jdGlvbiBjYWxsIHRvIGNhbGxfb3V0KCkuIAorCitXQVJOSU5HCisgICAgICAgIFBsZWFzZSBuZXZlciB1c2UgY2FsbF9vdXQoLi4uLDApIGluIHJlY3Vyc2l2ZSBDYWxsb3V0cyBhbmQgYmUgYXQgbGVhc3QKKyAgICAgICAgdmVyeSBjYXJlZnVsIGluIG90aGVyIGNhc2VzLiBUaGF0IENhbGxvdXQgd291bGQgYmUgZXhlY3V0ZWQgZGlyZWN0bHkKKyAgICAgICAgYWZ0ZXIgeW91ciBjdXJyZW50IGZ1bmN0aW9uIGFuZCB5b3UgcmVhbGx5IGdldCAwIGRlbGF5LgorCitFWEFNUExFCisgICAgICAgIGNhbGxfb3V0KCJSZWZyZXNoTWUiLCAxMCk7CisKKyAgICAgICAgVGhpcyB3aWxsIGNhbGwgdGhlIGZ1bmN0aW9uIFJlZnJlc2hNZSgpIGluIDEwIHNlY29uZHMgd2l0aG91dAorICAgICAgICBhbnkgYXJndW1lbnRzLiBUaGUgZnVuY3Rpb24gUmVmcmVzaE1lKCkgY2FuIHRoZW4gY2FsbCBvdXQKKyAgICAgICAgaXRzZWxmIGFnYWluIHdoaWNoIHdpbGwgcmVzdWx0IGluIGEgbG9vcCAobm90IGluIGEgcmVjdXJzaW9uKQorICAgICAgICB3aGljaCBjYW4gYmUgdXNlZCB0byBjaGVjayBvciBzZXQgdXAgdGhpbmdzIGluIHRoZSBvYmplY3QgaW4KKyAgICAgICAgaW50ZXJ2YWxzLiBCZSBhd2FyZSB0aGF0IGNhbGxvdXRzIGFyZSBzdG9yZWQgaW4gYSBsaW5lYXIKKyAgICAgICAgbGlzdCwgYW5kIHNvIGFyZSBzb21ld2hhdCBleHBlbnNpdmUgZm9yIHRoZSBkcml2ZXIuCisKKyAgICAgICAgQW5kIFlFUzogc2VsZi1yZXBsaWNhdGluZyBjYWxsX291dCgpcywgd2hlcmUgZWFjaCBjYWxsX291dCgpCisgICAgICAgIGNyZWF0ZXMgdHdvIG9yIG1vcmUgb3RoZXIgY2FsbF9vdXQoKXMgaW4gYSBsb29wIChzbyBjYWxsZWQKKyAgICAgICAgJ3JhYmJpdHMnKSBzbG93IHRoZSBtdWQgZG93biB2ZXJ5IGZhc3QsIGFuZCBhcmUgZXZlbiBhYmxlCisgICAgICAgIHRvIGNyYXNoIGl0LiBObyBuZWVkIHRvIHRyeSBpdCB5b3Vyc2VsZi4KKworU0VFIEFMU08KKyAgICAgICAgcmVtb3ZlX2NhbGxfb3V0KEUpLCBjYWxsX291dF9pbmZvKEUpLCBmaW5kX2NhbGxfb3V0KEUpLAorICAgICAgICB0aGlzX3BsYXllcihFKSwgcmVzZXQoQSksIGhlYXJ0X2JlYXQoQSkKKworMDUuMTEuMDYgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vY2FsbF9vdXRfaW5mbyBiL2RvYy9lZnVuL2NhbGxfb3V0X2luZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFkNWZmNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2NhbGxfb3V0X2luZm8KQEAgLTAsMCArMSwxOSBAQAorU1lOT1BTSVMKKyAgICAgICAgbWl4ZWQgKmNhbGxfb3V0X2luZm8oKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIExpZWZlcnQgSW5mb3JtYXRpb25lbiB1ZWJlciBhbGxlIGFuaGFlbmdpZ2VuIGNhbGxfb3V0KClzLiBEYXMgUmVzdWx0YXQKKyAgICAgICAgaXN0IGVpbiBBcnJheSwgYmVpIGRlbSBqZWRlcyBFbGVtZW50IHdpZWRlcnVtIGF1cyBlaW5lbSBBcnJheSBiZXN0ZWh0LAorICAgICAgICBkYXMgZWluZW4gY2FsbF9vdXQoKSBiZXNjaHJlaWJ0LiBKZWRlcyBkaWVzZXIgVW50ZXItQXJyYXlzIGVudGhhZWx0IDMKKyAgICAgICAgb2RlciBtZWhyIEVsZW1lbnRlOgorCisgICAgICAgIDEuIERhcyBPYmpla3QsIGluIGRlbSBkaWUgRnVua3Rpb24gb2RlciBkaWUgQ2xvc3VyZSBhdWZnZXJ1ZmVuIHdpcmQuCisgICAgICAgIDIuIERpZSBGdW5rdGlvbiBvZGVyIENsb3N1cmUuCisgICAgICAgIDMuIERlciB2ZXJibGVpYmVuZGUgRGVsYXkgYmlzIHp1bSBBdWZydWYuCisgICAgICAgIDRmZi4gRGllIChvcHRpb25hbGVuKSBBcmd1bWVudGUuCisKKyAgICAgICAgY2FsbF9vdXQoKXMgZnVlciB6ZXJzdG9lcnRlIE9iamVrdGUgd2VyZGVuIG5pY2h0IGluIGRlciBMaXN0ZQorICAgICAgICBhdWZnZWZ1ZWhydC4KKworU0lFSEUgQVVDSAorICAgICAgICBjYWxsX291dChFKSwgcmVtb3ZlX2NhbGxfb3V0KEUpLCBmaW5kX2NhbGxfb3V0KEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9jYWxsX3Jlc29sdmVkIGIvZG9jL2VmdW4vY2FsbF9yZXNvbHZlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTAzNzY2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vY2FsbF9yZXNvbHZlZApAQCAtMCwwICsxLDE4IEBACitTWU5PUFNJUworICAgICAgICBpbnQgY2FsbF9yZXNvbHZlZChtaXhlZCByZXN1bHQsIG9iamVjdCBvYiwgc3RyaW5nIGZ1bmMsIG1peGVkIGFyZywuLi4pOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgRGllIEZ1bmt0aW9uIGlzdCBhZWhubGljaCB6dSBjYWxsX290aGVyKCkuIFdlbm4gb2JqLT5mdW5jKCkgZGVmaW5pZXJ0CisgICAgICAgIHVuZCBvZWZmZW50bGljaCBpc3QsIHdlcmRlbiBhbGxlIEFyZ3VtZW50ZSA8YXJnPiBhbiBvYmotPmZ1bmMoKQorICAgICAgICB1ZWJlcmdlYmVuLiBEYXMgUmVzdWx0YXQgZGllc2VzIEZ1bmt0aW9uc2F1ZnJ1ZmVzIHdpcmQgaW4gPHJlc3VsdD4KKyAgICAgICAgZ2VzcGVpY2hlcnQgdW5kIG11c3MgZGVzaGFsYiBhbHMgUmVmZXJlbnogdWViZXJnZWJlbiB3ZXJkZW4uCisKKyAgICAgICAgV2VubiA8b2I+IHplcnN0b2VydCB3dXJkZSBvZGVyIGtlaW5lIG9lZmZlbnRsaWNoIHp1Z2FlbmdsaWNoZSBGdW5rdGlvbgorICAgICAgICA8ZnVuYz4gZGVmaW5pZXJ0LCBsaWVmZXJ0IGNhbGxfcmVzb2x2ZWQoKSAwIGZ1ZXIgRmVobGVyLCAxIGJlaSBFcmZvbGcuCisKKyAgICAgICAgPG9iPiBrYW5uIGF1Y2ggZWluIG9iamVjdF9uYW1lKCkgc2Vpbi4gV2VubiA8b2I+IGVpbiBTdHJpbmcgaXN0IHVuZAorICAgICAgICBkYXMgT2JqZWt0IG1pdCBkaWVzZW0gTmFtZW4gbmljaHQgZ2VmdW5kZW4gb2RlciBnZWxhZGVuIHdlcmRlbiBrYW5uLAorICAgICAgICB0cml0dCBlaW4gRmVobGVyIGF1Zi4KKworU0lFSEUgQVVDSAorICAgICAgICBjYWxsX290aGVyKEUpLCBmdW5jdGlvbl9leGlzdHMoRSksIGZpbmRfb2JqZWN0KEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9jYWxsZXJfc3RhY2sgYi9kb2MvZWZ1bi9jYWxsZXJfc3RhY2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFiNTc3NwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2NhbGxlcl9zdGFjawpAQCAtMCwwICsxLDMzIEBACitTWU5PUFNJUworICAgICAgICAqb2JqZWN0IGNhbGxlcl9zdGFjaygpOworICAgICAgICAqb2JqZWN0IGNhbGxlcl9zdGFjayhpbnQgYWRkX2ludGVyYWN0aXZlKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIExpZWZlcnQgZWluIEFycmF5IGRlciBwcmV2aW91c19vYmplY3QoKSwgZGllIGVpbmVuIGNhbGxfb3RoZXIoKSBhdWYKKyAgICAgICAgdGhpc19vYmplY3QoKSB2ZXJ1cnNhY2h0IGhhYmVuLiBEYWJlaSBlbnRzcHJpY2h0IHByZXZpb3VzX29iamVjdChpKQorICAgICAgICBjYWxsZXJfc3RhY2soKVtpXS4KKworICAgICAgICBXZW5uIGRpZSBGdW5rdGlvbiBtaXQgPGFkZF9pbnRlcmFjdGl2ZT4gKGFscyB3YWhyKSBhdWZnZXJ1ZmVuIHdpcmQsCisgICAgICAgIHdpcmQgdGhpc19pbnRlcmFjdGl2ZSgpIGRlbSBBcnJheSBoaW56dWdlZnVlZ3QsIG9kZXIgMCwgd2VubiBrZWluCisgICAgICAgIHRoaXNfaW50ZXJhY3RpdmUoKSBleGlzdGllcnQuCisKK0JFSVNQSUVMCisgICAgICAgIERhcyBpbnRlcmFrdGl2ZSBPYmpla3QgQSBnaWJ0IGVpbiBLb21tYW5kbyBlaW4sIGRhcyBpbSBPYmpla3QgQiBlaW5lCisgICAgICAgIEZ1bmt0aW9uIGF1ZnJ1ZnQsIGRpZSBhdWYgZGFzIE9iamVrdCBDIHZlcndlaXN0LCB3ZWxjaGVzIHdpZWRlcnVtCisgICAgICAgIGVpbmUgRnVua3Rpb24gaW0gT2JqZWt0IEQgYXVmcnVmdC4KKworICAgICAgICBXZW5uIEQgbnVuIGNhbGxlcl9zdGFjaygpIGF1ZnJ1ZnQsIGVyZ2lidCBkaWVzOiAoe0MsQn0pLgorICAgICAgICBGdWVyIGNhbGxlcl9zdGFjaygxKSBlcmdpYnQgZGllIEZ1bmt0aW9uOiAoe0MsQixBfSkuCisKK0FFTkRFUlVOR0VOCisgICAgICAgIEVpbmdlZnVlaHJ0IGluIExETXVkIDMuMi42LCB2b3JnZXNjaGxhZ2VuIHZvbiBUdWJNdWQuCisKK0FOTUVSS1VORworICAgICAgICBBdWZydWZlIHZvbiAiYWxpZW4gbGZ1biBjbG9zdXJlcyIgKHZlcmdsZWljaGUgc3ltYm9sX2Z1bmN0aW9uKCkpCisgICAgICAgIGVyemV1Z2VuIHp3ZWkgRWludHJhZWdlIGltIFN0YWNrLCB3ZW5uIGRhcyBnZWJ1bmRlbmUgT2JqZWt0IHNpY2ggdm9tCisgICAgICAgIE9iamVrdCBkZXIgQ2xvc3VyZSB1bnRlcnNjaGVpZGV0OiBkZXIgZXJzdGUgRWludHJhZyBzdGVodCBmdWVyIGRhcworICAgICAgICBnZWJ1bmRlbmUgT2JqZWt0LCBkZXIgendlaXRlIGZ1ZXIgZGFzIENsb3N1cmUtT2JqZWt0LgorCitTSUVIRSBBVUNICisgICAgICAgIGNhbGxlcl9zdGFja19kZXB0aChFKSwgcHJldmlvdXNfb2JqZWN0KEUpLCB0aGlzX2ludGVyYWN0aXZlKEUpLAorICAgICAgICBjYWxsX290aGVyKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9jYWxsZXJfc3RhY2tfZGVwdGggYi9kb2MvZWZ1bi9jYWxsZXJfc3RhY2tfZGVwdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMwODI3ZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2NhbGxlcl9zdGFja19kZXB0aApAQCAtMCwwICsxLDkgQEAKK1NZTk9QU0lTCisgICAgICAgIGludCBjYWxsZXJfc3RhY2tfZGVwdGgodm9pZCkKKworREVTQ1JJUFRJT04KKyAgICAgICAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIHByZXZpb3VzIG9iamVjdHMgb24gdGhlIHN0YWNrLiBUaGlzCisgICAgICAgIGNhbiBiZSB1c2VkIGZvciBzZWN1cml0eSBjaGVja3MuCisKK1NFRSBBTFNPCisgICAgICAgIGNhbGxlcl9zdGFjayhFKSwgcHJldmlvdXNfb2JqZWN0KEUpLCBjYWxsX290aGVyKEUpLCBjYWxsX3Jlc29sdmVkKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9jYXBpdGFsaXplIGIvZG9jL2VmdW4vY2FwaXRhbGl6ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmI4MmI3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vY2FwaXRhbGl6ZQpAQCAtMCwwICsxLDEyIEBACitTWU5PUFNJUworICAgICAgICBzdHJpbmcgY2FwaXRhbGl6ZShzdHJpbmcgc3RyKQorCitERVNDUklQVElPTgorICAgICAgICBDb252ZXJ0IHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gc3RyIHRvIHVwcGVyIGNhc2UsIGFuZCByZXR1cm4KKyAgICAgICAgdGhlIG5ldyBzdHJpbmcuCisKK0VYQU1QTEVTCisgICAgICAgIGNhcGl0YWxpemUoImhleWEhIikgLT4gIkhleWEhIgorCitTRUUgQUxTTworICAgICAgICBsb3dlcl9jYXNlKEUpLCB1cHBlcl9jYXNlKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9jYXQgYi9kb2MvZWZ1bi9jYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY1ZmU0ZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2NhdApAQCAtMCwwICsxLDI5IEBACitTWU5PUFNJUworICAgICAgICBpbnQgY2F0KHN0cmluZyBwYXRoLCBpbnQgc3RhcnQsIGludCBudW0pCisKK0RFU0NSSVBUSU9OCisgICAgICAgIExpc3QgdGhlIGZpbGUgZm91bmQgYXQgcGF0aC4KKworICAgICAgICBJbiBtb3N0IGluc3RhbGxhdGlvbnMgaXQgaXMgbm90IGxlZ2FsIHRvIGhhdmUgJy4uJyBvciBzcGFjZXMKKyAgICAgICAgaW4gdGhlIHBhdGguIFRoaXMgY29tbWFuZHMgaXMgbm9ybWFsbHkgY29ubmVjdGVkIHRvIHRoZSAiY2F0IgorICAgICAgICBjb21tYW5kIHRoYXQgd2l6YXJkcyBoYXZlLiBJdCBpcyBhbHNvIHVzZWQgYnkgdGhlICJoZWxwIgorICAgICAgICBjb21tYW5kLiBUaGUgb3B0aW9uYWwgYXJndW1lbnRzIHN0YXJ0IGFuZCBudW0gYXJlIHN0YXJ0IGxpbmUKKyAgICAgICAgbnVtYmVyIGFuZCBudW1iZXIgb2YgbGluZXMuIElmIHRoZXkgYXJlIG5vdCBnaXZlbiB0aGUgd2hvbGUKKyAgICAgICAgZmlsZSBpcyBwcmludGVkIGZyb20gdGhlIGJlZ2lubmluZy4KKworICAgICAgICBUaGUgdG90YWwgbnVtYmVyIG9mIGxpbmVzIHdpbGwgbm90IGV4Y2VlZCBhIHN5c3RlbSBsaW1pdCwgd2hpY2gKKyAgICAgICAgbm9ybWFsbHkgaXMgNTAgbGluZXMuCisKKyAgICAgICAgY2F0KCkgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGxpbmVzIHJlYWQgYW5kIHByaW50ZWQgaWYgc3VjY2VzcywKKyAgICAgICAgMCBpZiBubyBzdWNoIGZpbGUgb3Igbm8gbGluZXMgdG8gcmVhZCAoaWYgc3RhcnQgb3IgbGVuIGlzIDwgMCwKKyAgICAgICAgb3IgaWYgdGhlIGZpbGUgaGFzIGxlc3MgdGhhbiBzdGFydCBsaW5lcykuCisKK0VYQU1QTEUKKyAgICAgICAgY2F0KCIvZG9jL2VmdW4vY2F0IiwgNSwgOSk7CisKKyAgICAgICAgVGhpcyB3aWxsIHByaW50IG91dCB0aGUgZmlsZSAiL2RvYy9lZnVuL2NhdCIgYmVnaW5pbmcgYXQgbGluZQorICAgICAgICA1IGFuZCBlbmRpbmcgd2l0aCBsaW5lIDEzLgorCitTRUUgQUxTTworICAgICAgICBnZXRfZGlyKEUpLCBmaWxlX3NpemUoRSksIHJlYWRfZmlsZShFKSwgcmVhZF9ieXRlcyhFKSwKKyAgICAgICAgdmFsaWRfcmVhZChNKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vY2F0Y2ggYi9kb2MvZWZ1bi9jYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDM2YjdkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vY2F0Y2gKQEAgLTAsMCArMSw2NCBAQAorU1lOT1BTSVMKKyAgICAgICAgbWl4ZWQgY2F0Y2goZXhwciwgZXhwciwgLi4uKTsKKyAgICAgICAgbWl4ZWQgY2F0Y2goZXhwciwgZXhwciwgLi4uOyBtb2RpZmllcnMpOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgV2VydGV0IGRpZSBBdXNkcnVlY2tlIDxleHByPiBhdXMuIFdlbm4ga2VpbiBGZWhsZXIgYXVmdHJpdHQsIHdpcmQgMAorICAgICAgICB6dXJ1ZWNrIGdlbGllZmVydC4gV2VubiBlaW4gRmVobGVyIGF1ZnRyaXR0LCB3aXJkIGRpZSBBdXNmdWVocnVuZyBhbgorICAgICAgICBkaWVzZW0gUHVua3QgYWJnZWJyb2NoZW4gdW5kIGVpbiBTdHJpbmcgbWl0IGRlciBGZWhsZXJtZWxkdW5nIHdpcmQKKyAgICAgICAgenVydWVjayBnZWdlYmVuLgorCisgICAgICAgIFN5c3RlbWVpZ2VuZSBGZWhsZXJtZWxkdW5nZW4gYmVnaW5uZW4gbWl0IGVpbmVtICIqIiwgYmVudXR6ZXJkZWZpbmllcnRlCisgICAgICAgIEZlaGxlcm1lbGR1bmdlbiBhdXMgdGhyb3coKSB1bmQgcmFpc2VfZXJyb3IoKSAoc29mZXJuIHZvbiAwCisgICAgICAgIHZlcnNjaGllZGVuKSwgd2VyZGVuIHVudmVyYWVuZGVydCB6dXJ1ZWNrIGdlbGllZmVydC4KKworICAgICAgICBXZW5uIHp1bSBaZWl0cHVua3QsIHp1IGRlbSBjYXRjaCgpIGF1ZmdlcnVmZW4gd2lyZCwgd2VuaWdlciBhbHMKKyAgICAgICAgX19DQVRDSF9FVkFMX0NPU1RfXyBSZWNoZW50aWNrcyB1ZWJyaWcgc2luZCwgd2lyZCBlaW4gTGF1ZnplaXRmZWhsZXIKKyAgICAgICAgUlRFIGlubmVyaGFsYiB2b24gY2F0Y2goKSBlcnpldWd0ICh1bmQgc29taXQgd2llIGplZGVyIGFuZGVyZQorICAgICAgICBGZWhsZXIgYWJnZWZhbmdlbikgdW5kIGVzIHdlcmRlbiBrZWluZSBBdXNkcnVlY2tlIDxleHByPiBhdXMgY2F0Y2goKQorICAgICAgICBhdXNnZXdlcnRldC4gRGVyIE1vZGlmaWthdG9yICdyZXNlcnZlJyBrYW5uIHZlcndlbmRldCB3ZXJkZW4sCisgICAgICAgIGVpbmVuIGFuZGVyZW4gV2VydCBmdWVyIGRpZSBSZXNlcnZlIGFuenVnZWJlbi4KKworICAgICAgICBEYXMgVmVyaGFsdGVuIHZvbiBjYXRjaCgpIGthbm4gZHVyY2ggPG1vZGlmaWVycz4gdmVyYWVuZGVydCB3ZXJkZW46CisKKyAgICAgICAgICAgICdub2xvZyc6ICAgIE5vcm1hbGVyd2Vpc2Ugd2lyZCBkZXIgRmVobGVyIGltIEZlaGxlcmxvZworICAgICAgICAgICAgICAgICAgICAgICAgZ2VzcGVpY2hlcnQsIHVtIGRpZSBGZWhsZXJzdWNoZSB6dSBlcmxlaWNodGVybi4gV2lyZAorICAgICAgICAgICAgICAgICAgICAgICAgJ25vbG9nJyBnZXNldHp0LCB3aXJkIGRpZXNlciBMb2ctRWludHJhZyB1bnRlcmRydWVja3QuCisgICAgICAgICAgICAncHVibGlzaCc6ICBOb3JtYWxlcndlaXNlIHdpcmQgbWFzdGVyOjpydW50aW1lX2Vycm9yKCkgZnVlciBlaW5lbgorICAgICAgICAgICAgICAgICAgICAgICAgRmVobGVyIGlubmVyaGFsYiBlaW5lcyBjYXRjaCgpIG5pY2h0IGF1ZmdlcnVmZW4uIE1pdAorICAgICAgICAgICAgICAgICAgICAgICAgZGllc2VtIDxtb2RpZmllcj4gd2lyZCBydW50aW1lX2Vycm9yKCkgdHJvdHpkZW0KKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZmdlcnVmZW4uCisgICAgICAgICAgICAncmVzZXJ2ZSA8ZXhwcj4nOiA8ZXhwcj4gbXVzcyBlaW5lIGdhbnplbiBaYWhsIGdyb2Vzc2VyIDAKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyZ2ViZW4sIHdlbGNoZSBkYW5uIGFscyBSZWNoZW5yZXNlcnZlIGFuc3RlbGxlCisgICAgICAgICAgICAgICAgICAgICAgICB2b24gX19DQVRDSF9FVkFMX0NPU1RfXyB2ZXJ3ZW5kZXQgd2lyZC4gRGFzIE1pbmltdW0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlzdCAyICogX19NQVNURVJfRVZBTF9DT1NUX18gLgorCisgICAgICAgIGNhdGNoKCkgYW4gc2ljaCBpc3QgbmljaHQgYmVzb25kZXJzIGxhdWZ6ZWl0LWludGVuc2l2OiBlcyBicmF1Y2h0CisgICAgICAgIG51ciBldHdhcyBtZWhyIFplaXQgYWxzIGVpbiBJbnRyYS1PYmpla3QgRnVua3Rpb25zYXVmcnVmLgorICAgICAgICAKKyAgICAgICAgdGhyb3coKSBpc3QgZWJlbmZhbGxzIG5pY2h0IHNlaHIgdGV1ZXIsIGRhIGxlZGlnbGljaCBlaW5pZ2UKKyAgICAgICAgaW50ZXJuZSBTdHJ1a3R1cmVuIGF1ZmdlcmFldW10IHdlcmRlbiBtdWVzc2VuLgorCisgICAgICAgIEVjaHRlIExhdWZ6ZWl0ZmVobGVycyAob2IgbnVuIG1pdCBvZGVyIG9obmUgY2F0Y2goKSkgYXVmCisgICAgICAgIGRlciBhbmRlcmVuIFNlaXRlIGlzdCBzZWhyIHplaXRpbnRlbnNpdi4KKworICAgICAgICBjYXRjaCBpc3QgbmljaHQgaW0gZWlnZW50bGljaGVuIFNpbm5lIGVpbmUgRWZ1biwgc29uZGVybiBlaW5lIENvbXBpbGVyCisgICAgICAgIEFud2Vpc3VuZy4KKworQkVJU1BJRUwKKyAgICAgICAgb2JqZWN0IG9iajsKKyAgICAgICAgc3RyaW5nIGVycjsKKyAgICAgICAgaWYoZXJyID0gY2F0Y2gob2JqID0gY2xvbmVfb2JqZWN0KCIvZm9vL2Jhci9iYXoiKSkpCisgICAgICAgICAgICB3cml0ZSgiS2FubiBkYXMgT2JqZWt0IG5pY2h0IGNsb25lbi4gR3J1bmQ6ICIrZXJyKyJcbiIpOworCitBRU5ERVJVTkdFTgorICAgICAgICBMRE11ZCAzLjIuOSBmdWVocnRlIGRlbiAnbm9sb2cnIGNhdGNoKCkgYWxzIGV4cGVyaW1lbnRlbGxlcyBGZWF0dXJlCisgICAgICAgICAgICBlaW4uCisgICAgICAgIExETXVkIDMuMi4xMCBpbXBsZW1lbnRpZXJ0ZSAnbm9sb2cnIGFscyBvZmZpemllbGxlIEZvcm0gdW5kIGZ1ZWhydGUKKyAgICAgICAgICAgIHp1ZGVtICdwdWJsaXNoJyBlaW4uCisgICAgICAgIExETXVkIDMuMy41NTkgdmVybGVndGUgZGVuIFRlc3QgYXVmIHZlcmJsZWliZW5kZSBSZWNoZW50aWNrcyBpbiBkaWUKKyAgICAgICAgICAgIHZvbSBjYXRjaCgpIHVtc2NobG9zc2VuZW4gQXVzZnVlaHJ1bmcuCisgICAgICAgIExETXVkIDMuMy41NjAgZnVlZ3RlIGRlbiBNb2RpZmlrYXRvciAncmVzZXJ2ZScgZWluLgorCitTSUVIRSBBVUNICisgICAgICAgIHRocm93KEUpLCByYWlzZV9lcnJvcihFKSwgcHJlZGVmaW5lZChEKSwgcnVudGltZV9lcnJvcihNKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vY2VpbCBiL2RvYy9lZnVuL2NlaWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM0NDI0NAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2NlaWwKQEAgLTAsMCArMSwxOSBAQAorU1lOT1BTSVMKKyAgICAgICAgZmxvYXQgY2VpbChpbnR8ZmxvYXQgYXJnKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIFJ1bmRldCA8YXJnPiB6dXIgbmFlY2hzdGVuIGdhbnplbiBaYWhsIGF1ZiB1bmQgbGllZmVydCBkYXMgUmVzdWx0YXQKKyAgICAgICAgenVydWVjay4gV2VubiA8YXJnPiBlaW4gSW50ZWdlciBpc3QsIHdpcmQgZGFzIFJlc3VsdGF0IGluIGZsb2F0CisgICAgICAgIGtvbnZlcnRpZXJ0LgorCitCRUlTUElFTAorICAgICAgICBjZWlsKDQuNSk7ICAgICAgZXJnaWJ0OiAgNS4wCisgICAgICAgIGNlaWwoLTQuNSk7ICAgICBlcmdpYnQ6IC00LjAKKyAgICAgICAgY2VpbCg1KTsgICAgICAgIGVyZ2lidDogIDUuMAorCitBRU5ERVJVTkdFTgorICAgICAgICBFaW5nZWZ1ZWhydCBpbiBMRE11ZCAzLjIuNy4KKyAgICAgICAgTERNdWQgMy4yLjkgZnVlaHJ0ZSBuZXUgSW50ZWdlciBhbHMgbW9lZ2xpY2hlIEFyZ3VtZW50ZSBlaW4uCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgYWJzKEUpLCBmbG9vcihFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vY2xlYXJfYml0IGIvZG9jL2VmdW4vY2xlYXJfYml0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZjE1ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9jbGVhcl9iaXQKQEAgLTAsMCArMSwzNSBAQAorU1lOT1BTSVMKKyAgICAgICAgc3RyaW5nIGNsZWFyX2JpdChzdHJpbmcgc3RyLCBpbnQgbik7CisKK0JFU0NIUkVJQlVORworICAgICAgICBHaWJ0IGVpbmVuIG5ldWVuIFN0cmluZyB6dXJ1ZWNrLCBpbiBkZW0gZGFzIG4tdGUgQml0IGltIFN0cmluZyA8c3RyPgorICAgICAgICBuaWNodCBnZXNldHp0IGlzdC4gRGFiZWkgd2lyZCA8c3RyPiBzZWxic3QgbmljaHQgdmVyYWVuZGVydC4KKworICAgICAgICBKZWRlcyBaZWljaGVuIGVudGhhZWx0IHNlY2hzIEJpdHMuIFNvIGthbm4gaW4gamVkZW0gWmVpY2hlbiBlaW5lIFphaGwKKyAgICAgICAgendpc2NoZW4gMCB1bmQgNjMgKDJeNj02NCkgZ2VzcGVpY2hlcnQgd2VyZGVuLiBEYXMgZXJzdGUgWmVpY2hlbiBpc3QKKyAgICAgICAgZGVyIExlZXJzY2hsYWcgIiAiIG1pdCBXZXJ0IDAuIERhcyBlcnN0ZSBaZWljaGVuIGltIFN0cmluZyBpc3QgamVuZXMKKyAgICAgICAgbWl0IGRlbiBuaWVkcmlnc3RlbiBCaXRzICgwIGJpcyA1KS4KKworQkVJU1BJRUxFCisgICAgICAgIHN0cmluZyBzOworICAgICAgICBzID0gY2xlYXJfYml0KCJfIiwgNSk7CisKKyAgICAgICAgV2VpbCAiXyIgZGVuIGhvZWNoc3RlbiBtb2VnbGljaGVuIFdlcnQgZW50aGFlbHQgKDYzKSwgZW50aGFlbHQgZGllCisgICAgICAgIFZhcmlhYmxlIHMgbnVuIGRhcyBaZWljaGVuICI/IiwgZGFzIGRlbSBXZXJ0IDMxIGVudHNwcmljaHQgKDYzLTJeNT0zMSkuCisKKyAgICAgICAgc3RyaW5nIHM7CisgICAgICAgIHMgPSBjbGVhcl9iaXQoIj88IiwzKTsKKyAgICAgICAgcyA9IGNsZWFyX2JpdChzLCA4KTsKKworICAgICAgICBzIGVudGhhZWx0IG51biBkZW4gU3RyaW5nICI3OCIuICI/IiBlbnRzcHJpY2h0IGRlbSBXZXJ0IDMxIHVuZCAiPCIgZGVtCisgICAgICAgIFdlcnQgMjguICI/PCIgZW50c3ByaWNodCBhbHNvIGRlbSBXZXJ0IDMxKzI4PDw2PTMxKzE3OTI9MTgyMywgd2FzIGluCisgICAgICAgIEJpbmFlcnNjaHJlaWJ3ZWlzZSAoaG9lY2hzdGVzIEJpdCByZWNodHMpIDExMTExMDAwMTExIGVyZ2lidC4gV2VyZGVuCisgICAgICAgIGF1cyBkaWVzZXIgWmFobCBkaWUgQml0cyAzIHVuZCA4IChkaWUgTnVtbWVyaWVydW5nIGJlZ2lubnQgbWl0IGRlbQorICAgICAgICAwLiBCaXQpIGVyZ2lidCBkYW5uOiAxMTEwMTAwMDAxMS4gRGllIGVyc3RlbiA2IEJpdHMgMDEwMTExIHNpbmQgaW4KKyAgICAgICAgRGV6aW1hbHNjaHJlaWJ3ZWlzZSAyMy4gRGllIHp3ZWl0ZW4gNiBCaXRzICgwKTExMDAwIGVyZ2ViZW4gMjQgaW4KKyAgICAgICAgRGV6aW1hbHNjaHJlaWJ3ZWlzZS4gTnVuIGVudHNwcmljaHQgZGVyIFdlcnQgMjMgZGVtIFplaWNoZW4gIjciIHVuZAorICAgICAgICBkZXIgV2VydCAyNCBkZW0gWmVpY2hlbiAiOCIuIERlciBTdHJpbmcgcyBlbnRoYWVsdCBhbHNvICI3OCIuCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgc2V0X2JpdChFKSwgbmV4dF9iaXQoRSksIGxhc3RfYml0KEUpLCB0ZXN0X2JpdChFKSwgY291bnRfYml0cyhFKSwKKyAgICAgICAgYW5kX2JpdHMoRSksIG9yX2JpdHMoRSksIHhvcl9iaXRzKEUpLCBpbnZlcnRfYml0cyhFKSwgY29weV9iaXRzKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9jbG9uZV9vYmplY3QgYi9kb2MvZWZ1bi9jbG9uZV9vYmplY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYyMmJlZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2Nsb25lX29iamVjdApAQCAtMCwwICsxLDIzIEBACitTWU5PUFNJUzoKKyAgICAgICAgb2JqZWN0IGNsb25lX29iamVjdChzdHJpbmcgbmFtZSkKKworREVTQ1JJUFRJT046CisgICAgICAgIENsb25lIGEgbmV3IG9iamVjdCBmcm9tIGRlZmluaXRpb24gbmFtZSwgYW5kIGdpdmUgaXQgYSBuZXcgdW5pcXVlCisJbmFtZS4gUmV0dXJuIHRoZSBuZXcgb2JqZWN0LgorICAgICAgICAKKyAgICAgICAgVGhlIG9yaWdpbmFsLCBjYWxsZWQgYmx1ZSBwcmludCwgdXNlZCBmb3IgY2xvbmluZywgc2hvdWxkIG5vdCBiZQorCXVzZWQgaW4gdGhlIGdhbWUsIG9ubHkgYmUgdXNlZCBmb3IgY2xvbmluZy4gVGhlIGNsb25lZCBvYmplY3RzCisJY29udGFpbiBvbmx5IHRoZSBkYXRhIGJ1dCB0aGUgYmx1ZSBwcmludCBhbHNvIHRoZSBmdW5jdGlvbiBjb2RlLgorCVRoZSBibHVlIHByaW50IGlzIHRoZSBvbmUgd2l0aG91dCBhIHVuaXF1ZSBudW1iZXIgYXQgdGhlIGVuZCBvZgorCXRoZSBvYmplY3QncyBvYmplY3RfbmFtZSgpLiBUaGUgY2xvbmVfb2JqZWN0KCkgZnVuY3Rpb24gbmV2ZXIKKwlyZXR1cm5zIGEgYmx1ZSBwcmludC4KKyAgICAgICAgCisgICAgICAgIE5vdGUgdGhhdCB0aGUgcGF0aG5hbWUgbXVzdCBiZSBjb21wbGV0ZSwgd2hpY2ggbWVhbnMgdGhlcmUgYXJlIG5vCisgICAgICAgIHJlbGF0aXZlIHBhdGhzIGFsbG93ZWQuCisKK0VYQU1QTEU6CisgICAgICAgIG9iamVjdCB0b3JjaDsKKyAgICAgICAgdG9yY2ggPSBjbG9uZV9vYmplY3QoIi9vYmovdG9yY2giKTsKKworU0VFIEFMU086CisgICAgICAgIGRlc3RydWN0KEUpLCBtb3ZlX29iamVjdChFKSwgdWlkcyhDKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vY2xvbmVwIGIvZG9jL2VmdW4vY2xvbmVwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZmY3MWEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9jbG9uZXAKQEAgLTAsMCArMSwyOCBAQAorU1lOT1BTSVMKKyAgICAgICAgaW50IGNsb25lcCAoKQorICAgICAgICBpbnQgY2xvbmVwIChvYmplY3Qgb2JqKQorICAgICAgICBpbnQgY2xvbmVwIChzdHJpbmcgb2JqKQorICAgICAgICBpbnQgY2xvbmVwIChtaXhlZCAgYXJnKQorCitCRVNDSFJFSUJVTkcKKyAgICAgICAgTGllZmVydCAxLCB3ZW5uIGRhcyBhbmdlZ2ViZW5lIE9iamVrdCBlaW4gS2xvbiBpc3QsIGFuc29uc3RlbiAwLgorICAgICAgICBEYXMgT2JqZWt0IGthbm4gZGFiZWkgYXVjaCBkdXJjaCBzZWluZW4gT2JqZWt0LU5hbWVuIGFuZ2VnZWJlbiB3ZXJkZW4uCisgICAgICAgIFdpcmQga2VpbiBBcmd1bWVudCB1ZWJlcmdlYmVuLCBzbyB3aXJkIHRoaXNfb2JqZWN0KCkgZ2V0ZXN0ZXQuCisgICAgICAgIExpZWZlcnQgMCwgd2VubiBkYXMgQXJndW1lbnQgdm9uIGVpbmVtIGFuZGVyZW4gVHlwLgorICAgICAgICBFaW4gT2JqZWt0LCBkZXNzZW4gUHJvZ3JhbW0gbWl0dGVscyByZXBsYWNlX3Byb2dyYW0oKSBlcnNldHp0IHd1cmRlLAorICAgICAgICB6YWVobHQgbmljaHQgYWxzIEtsb24uCisKK0JFSVNQSUVMCisgICAgICAgIG9iamVjdCBvOworICAgICAgICBvID0gY2xvbmVfb2JqZWN0KCIvb2JqL2RpbmciKTsKKyAgICAgICAgd3JpdGUoY2xvbmVwKG8pKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPiBzY2hyZWlidCAiMSIKKyAgICAgICAgd3JpdGUoY2xvbmVwKCIvb2JqL2RpbmciKSkgICAgICAgICAgICAgICAgIC0tPiBzY2hyZWlidCAiMCIKKworICAgICAgICAoSW0gQ09NUEFUX01PREUgIm9iai9kaW5nIiBhbHMgRGF0ZWluYWhtZW4gYmVudXR6ZW4pCisKK0FFTkRFUlVOR0VOCisgICAgICAgIEVpbmdlZnVlaHJ0IGluIExETXVkIDMuMi42LCBnZWFlbmRlcnQgaW4gMy4yLjcsIHNvIGRhc3MgT2JqZWt0ZSBtaXQKKyAgICAgICAgZXJzZXR6dGVuIFByb2dyYW1tZW4gbmljaHQgbWVociBhbHMgS2xvbmUgemFlaGxlbi4KKworU0lFSEUgQVVDSAorICAgICAgICBsb2FkX25hbWUoRSksIGNsb25lX29iamVjdChFKSwgY2xvbmVzKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9jbG9uZXMgYi9kb2MvZWZ1bi9jbG9uZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNlMjBkMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2Nsb25lcwpAQCAtMCwwICsxLDM4IEBACitTWU5PUFNJUworICAgICAgICAqb2JqZWN0IGNsb25lcygpOworICAgICAgICAqb2JqZWN0IGNsb25lcyhpbnQgd2hhdCk7CisgICAgICAgICpvYmplY3QgY2xvbmVzKHN0cmluZ3xvYmplY3Qgb2JqIFssIGludCB3aGF0XSk7CisKK0JFU0NIUkVJQlVORworICAgICAgICBEaWVzZSBFZnVuIGxpZWZlcnQgZWluIEFycmF5IG1pdCBhbGxlbiBDbG9uZXMgZWluZXMgYmVzdGltbXRlbgorICAgICAgICBCbHVlcHJpbnRzLiBEYWJlaSB1bnRlcmxpZWd0IGRhcyBBcnJheSBkZW4gbm9ybWFsZW4gU3lzdGVtbGltaXRlbi4KKworICAgICAgICBXZW5uIDxvYmo+IGFuZ2VnZWJlbiBpc3QsIHdlcmRlbiBhbGxlIENsb25lcyBkZXMgQmx1ZXByaW50cyB2b24gPG9iaj4KKyAgICAgICAgKG9kZXIgdm9uIDxvYmo+IHNlbGJzdCwgZmFsbHMgPG9iaj4gZWluIEJsdWVwcmludCBpc3QpIGF1c2dlZ2ViZW4sCisgICAgICAgIHNvbnN0IGRpZSBDbG9uZSBkZXMgYWt0dWVsbGVuIE9iamVrdHMgYnp3LiBkaWUgQ2xvbmUgZGVzIEJsdWVwcmludHMKKyAgICAgICAgZGVzIGFrdHVlbGxlbiBPYmpla3RzLiBXZW5uIDxvYmo+IGFscyBTdHJpbmcgYW5nZWdlYmVuIGlzdCwgbXVzcyBlcworICAgICAgICBkZXIgTmFtZSBlaW5lcyBleGlzdGllcmVuZGVuIE9iamVrdHMgc2Vpbi4KKworICAgICAgICA8d2hhdD4gd2FlaGx0IGF1cywgd2llIENsb25lIHZvbiBhZWx0ZXJlbiBWZXJzaW9uZW4gZGVzIEJsdWVwcmludHMKKyAgICAgICAgenUgYmVoYW5kZWxuIHNpbmQ6CisgICAgICAgICAgICA9PSAwOiBsaWVmZXJ0IG51ciBkaWUgQ2xvbmUgZGVzIGFrdHVlbGxlbiBCbHVlcHJpbnRzIChTdGFuZGFyZCkKKyAgICAgICAgICAgID09IDE6IGxpZWZlcnQgbnVyIGRpZSBDbG9uZSBkZXIgYWx0ZW4gQmx1ZXByaW50LVZlcnNpb24KKyAgICAgICAgICAgID09IDI6IGxpZWZlcnQgYWxsZSBDbG9uZXMgYWxsZXIgQmx1ZXByaW50LVZlcnNpb25lbgorCisgICAgICAgIFdlbm4gZGVyIFRyZWliZXIgbWl0IERZTkFNSUNfQ09TVFMga29tcGlsaWVydCB3dXJkZSwgc2luZCBkaWUgS29zdGVuCisgICAgICAgIGZ1ZXIgZGllc2UgRnVua3Rpb24gcHJvcG9ydGlvbmFsIHp1ciBBbnphaGwgT2JqZWt0ZSBpbSBTcGllbC4KKworQkVJU1BJRUwKKyAgICAgICAgb2JqZWN0IG8sIHA7CisgICAgICAgIG8gPSBjbG9uZV9vYmplY3QoIi9zdGQvdGhpbmciKTsgLyogb2RlciAic3RkL3RoaW5nIiBpbSBDT01QQVRfTU9ERSAqLworICAgICAgICBkZXN0cnVjdChmaW5kX29iamVjdCgiL3N0ZC90aGluZyIpKTsKKyAgICAgICAgcCA9IGNsb25lX29iamVjdCgiL3N0ZC90aGluZyIpOworCisgICAgICAgIGNsb25lcygiL3N0ZC90aGluZyIpICAgIC0tPiBlcmdpYnQgKHsgcCB9KQorICAgICAgICBjbG9uZXMoIi9zdGQvdGhpbmciLCAwKSAtLT4gZXJnaWJ0ICh7IHAgfSkKKyAgICAgICAgY2xvbmVzKCIvc3RkL3RoaW5nIiwgMSkgLS0+IGVyZ2lidCAoeyBvIH0pCisgICAgICAgIGNsb25lcygiL3N0ZC90aGluZyIsIDIpIC0tPiBlcmdpYnQgKHsgbywgcCB9KQorCitBRU5ERVJVTkdFTgorICAgICAgICBFaW5nZWZ1ZWhydCBpbiBMRE11ZCAzLjIuOC4KKyAgICAgICAgTERNdWQgMy4yLjkgZnVlaHJ0ZSBkaWUgZHluYW1pc2NoZW4gS29zdGVuIGVpbi4KZGlmZiAtLWdpdCBhL2RvYy9lZnVuL2Nsb3N1cmVwIGIvZG9jL2VmdW4vY2xvc3VyZXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVhMjgyOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2Nsb3N1cmVwCkBAIC0wLDAgKzEsMTEgQEAKK1NZTk9QU0lTCisgICAgICAgIGludCBjbG9zdXJlcChtaXhlZCBhcmcpCisKK0JFU0NIUkVJQlVORworICAgICAgICBMaWVmZXJ0IDEsIHdlbm4gZGFzIEFyZ3VtZW50IGVpbmUgQ2xvc3VyZSBpc3QsIGFuc29uc3RlbiAwLgorCitBRU5ERVJVTkdFTgorICAgICAgICBFaW5nZWZ1ZWhydCBpbiAzLjJANzAuCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgaW50cChFKSwgcmVmZXJlbmNlcChFKSwgc3ltYm9scChFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vY29tbWFuZCBiL2RvYy9lZnVuL2NvbW1hbmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDlkNmMwYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2NvbW1hbmQKQEAgLTAsMCArMSw1MCBAQAorY29tbWFuZCgpCitGVU5LVElPTjoKKyAgICAgaW50IGNvbW1hbmQoc3RyaW5nIHN0cikKKyAgICAgaW50IGNvbW1hbmQoc3RyaW5nIHN0ciwgb2JqZWN0IG9iKQorCitCRVNDSFJFSUJVTkc6CisgICAgIEZ1ZWhydCBzdHIgd2llIGVpbiBLb21tYW5kbyB3ZWxjaGVzIGRpcmVrdCB2b20gTnV0emVyIGFiZ2VnZWJlbiB3dXJkZQorICAgICBhdXMuIEFsbGUgRWZmZWt0ZSBkZXMgS29tbWFuZG9zIHdpcmtlbiBzaWNoIGF1ZiB0aGlzX29iamVjdCgpIG9kZXIsCisgICAgIGZhbGxzIGFuZ2VnZWJlbiwgYXVmIGRhcyBPYmpla3QgPG9iaj4gYXVzLgorCisgICAgIERlciBSdWVja2dhYmV3ZXJ0IGlzdCA+PTEgZnVlciBFcmZvbGcgdW5kIDAgZnVlciBNaXNzZXJmb2xnLgorICAgICBSdWVja2dhYmV3ZXJ0IGlzdCBpbSBFcmZvbGdzZmFsbCBkaWUgSG9laGUgZGVyIEV2YWxDb3N0IGluIFRpY2tzLgorCisgICAgIFdlbm4gY29tbWFuZCgpIGF1ZiBlaW4gYW5kZXJlcyBPYmpla3QgYW5nZXdlbmRldCB3aXJkLCBrb2VubmVuIGF1ZgorICAgICBkaWVzZW0gV2VnZSBrZWluZSAic3RhdGljIiBkZWtsYXJpZXJ0ZW4gRnVua3Rpb25lbiBhdWZnZXJ1ZmVuIHdlcmRlbiwKKyAgICAgdW0gZXR3YXMgU2NodXR6IHZvciB1bmVybGF1YnRlbiBBdWZydWZlbiB6dSBnZWJlbi4KKworICAgICBLb21tYW5kaSB3ZXJkZW4gZ2VzdGFwZWx0LCBkYXMgaGVpc3N0LCBuYWNoIGRlciBBdXNmdWVocnVuZyB2b24gPHN0cj4KKyAgICAgd2VyZGVuIGRpZSBhbHRlbiBXZXJ0ZSBmdWVyIHRoaXNfcGxheWVyKCksIHF1ZXJ5X3ZlcmIoKSBldGMuIHdpZWRlcgorICAgICBoZXJnZXN0ZWxsdCAoZWluIEtvbW1hbmRvIGthbm4gZGF6dSBmdWVocmVuLCBkYXNzIGVpbiBLb21tYW5kbworICAgICBhdXNnZWZ1ZWhydCB3aXJkKS4KKworQkVNRVJLVU5HRU46CisgICAgIERpZSBtZWlzdGVuIGluIExlYmV3ZXNlbiBkZWZpbmllcnRlbiBLb21tYW5kb2Z1bmt0aW9uZW4gc2luZCB2b3IKKyAgICAgYWV1c3NlcmVtIEF1ZnJ1ZmVuIGR1cmNoICJzdGF0aWMiIG9BZSBnZXNjaHVldHp0LiBadW0gQXVzZnVlaHJlbiBkaWVzZXIKKyAgICAgS29tbWFuZG9zIG11c3MgY29tbWFuZF9tZShMKSBlaW5nZXNldHp0IHdlcmRlbiwgdW0gZGllc2VuIFNjaHV0eiB6dQorICAgICB1bWdlaGVuLgorCitCRUlTUElFTEU6CisgICAgIFNpZWhlIGNvbW1hbmRfbWUoTCkgZnVlciBlaW5lbiBWZXJnbGVpY2guCisJIAorICAgICAvLyAjMSBFaW4gTlBDIG5pbW10IHVuZCB6dWVuZGV0IGVpbmUgaGVydW1saWVnZW5kZSAvc3RkL2xpZ2h0c291cmNlIGFuCisgICAgIG9iamVjdCBmID0gcHJlc2VudCgiXG5saWNodHF1ZWxsZSIsIGVudmlyb25tZW50KCkpOworICAgICBpZihmICYmIGNvbW1hbmQoIm5pbW0gbGljaHRxdWVsbGUiKSkKKyAgICAgICBpZihjb21tYW5kKCJ6dWVuZGUgbGljaHRxdWVsbGUgYW4iKSkKKyAgICAgICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudCgpLCBOYW1lKFdFUikrIiBmcmV1dCBzaWNoLlxuIik7CisgICAgICAgZWxzZQorICAgICAgICAgdGVsbF9yb29tKGVudmlyb25tZW50KCksIE5hbWUoV0VSKSsiIHNjaGF1dCBiZWRyb2VwcGVsdC5cbiIpOworICAgICAKKyAgICAgLy8gIzIgRWluIE5QQyB0cmFlZ3Qgc2VpbmUgU2FjaGVuCisgICAgIGNsb25lX29iamVjdCgiL3J1ZXN0dW5nL3NvbW1lcmtsZWlkIiktPm1vdmUodGhpc19vYmplY3QoKSwgMik7CisgICAgIGNvbW1hbmQoInRyYWdlIGtsZWlkIikKKyAgICAgLy8gYWVxdWl2YWxlbnQgdW5kIGJlc3NlciBpc3QgaGllcjoKKyAgICAgQWRkSXRlbSgiL3J1ZXN0dW5nL3NvbW1lcmtsZWlkIiwgUkVGUkVTSF9SRU1PVkV8Q0xPTkVfV0VBUik7CisKK1NJRUhFIEFVQ0gKKyAgICAgY29tbWFuZF9zdGFjayhFKSwgbm90aWZ5X2ZhaWwoRSksIGVuYWJsZV9jb21tYW5kcyhFKSwgZ2V0X2V2YWxfY29zdChFKQorICAgICBjb21tYW5kX21lKEwpCisKKzYgU2VwIDIwMTIgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9lZnVuL2NvbW1hbmRfc3RhY2sgYi9kb2MvZWZ1bi9jb21tYW5kX3N0YWNrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzYTRlNDYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9jb21tYW5kX3N0YWNrCkBAIC0wLDAgKzEsMzQgQEAKK0dFU0NIVUVUWlQKK1NZTk9QU0lTCisgICAgICAgICNpbmNsdWRlIDxzeXMvY29tbWFuZHMuaD4KKworICAgICAgICAqbWl4ZWQgY29tbWFuZF9zdGFjaygpOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgTGllZmVydCBlaW4gQXJyYXksIGRhcyBkZW4gS29tbWFuZG8gU3RhY2sgYmVzY2hyZWlidC4gRGFzIEFycmF5CisgICAgICAgIHVtZmFzc3QgY29tbWFuZF9zdGFja19kZXB0aCgpIEVpbnRyYWVnZSwgZGVyIGVyc3RlIGRhdm9uIGJlc2NocmVpYnQKKyAgICAgICAgZGFzIFRvcC1MZXZlbCBLb21tYW5kbywgZGVyIGxldHplIEVpbnRyYWcgZGFzIGFrdHVlbGxlIEtvbW1hbmRvLgorCisgICAgICAgIEplZGVyIEVpbnRyYWcgaXN0IHdpZWRlcnVtIGVpbiBBcnJheSBtaXQgZm9sZ2VuZGVuIEVpbnRyYWVnZW46CisKKyAgICAgICAgICAgIHN0cmluZyBbQ01EX1ZFUkJdOiAgICAgIGRhcyBWZXJiIGRpZXNlcyBLb21tYW5kb3MKKyAgICAgICAgICAgIHN0cmluZyBbQ01EX1RFWFRdOiAgICAgIGRlciB2b2xsZSBUZXh0IGRlcyBLb21tYW5kb3MKKyAgICAgICAgICAgIG9iamVjdCBbQ01EX09SSUdJTl06ICAgIGRlciB1cnNwcnVlbmdsaWNoZSBLb21tYW5kb2dlYmVyCisgICAgICAgICAgICBvYmplY3QgW0NNRF9QTEFZRVJdOiAgICBkZXIgbW9tZW50YW5lIEtvbW1hbmRvZ2ViZXIKKyAgICAgICAgICAgIG1peGVkICBbQ01EX0ZBSUxdOiAgICAgIGRlciBJbmhhbHQgdm9uIG5vdGlmeV9mYWlsKCkgKG9kZXIgMCkKKyAgICAgICAgICAgIG1peGVkICBbQ01EX0ZBSUxPQkpdOiAgIGRhcyBPYmpla3QsIHdlbGNoZXMgbm90aWZ5X2ZhaWwoKSBnZXNldHp0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXQKKworICAgICAgICBDTURfT1JJR0lOIHVuZCBDTURfUExBWUVSIHNpbmQgZnVlciBnZXdvaGVubGljaCBkYXMgZ2xlaWNoZSBPYmpla3QuCisgICAgICAgIEVzIGdpYnQgbnVyIGVpbmVuIFVudGVyc2NoaWVkLCB3ZW5uIGRlciBtb2RpZnlfY29tbWFuZCBIb29rIGRlbgorICAgICAgICBLb21tYW5kb2dlYmVyIG1pdCBzZXRfdGhpc19wbGF5ZXIoKSBhZW5kZXJ0LgorCitBRU5ERVJVTkdFTgorICAgICAgICBFaW5nZWZ1ZWhydCBpbiBMRE11ZCAzLjIuNy4KKyAgICAgICAgTERNdWQgMy4yLjggZnVlZ3RlIGRlbiBDTURfRkFJTE9CSiBFaW50cmFnIGhpbnp1LgorCitBTk1FUktVTkcKKyAgICAgICAgSmVkZXIgZGVyIEVpbnRyYWVnZSBpbSBBcnJheSBrYW5uIDAgc2Vpbi4KKworU0lFSEUgQVVDSAorICAgICAgICBjb21tYW5kKEUpLCBjb21tYW5kX3N0YWNrX2RlcHRoKEUpLCBub3RpZnlfZmFpbChFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vY29tbWFuZF9zdGFja19kZXB0aCBiL2RvYy9lZnVuL2NvbW1hbmRfc3RhY2tfZGVwdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcyMDViNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2NvbW1hbmRfc3RhY2tfZGVwdGgKQEAgLTAsMCArMSwxMyBAQAorR0VTQ0hVRVRaVAorU1lOT1BTSVMKKyAgICAgICAgaW50IGNvbW1hbmRfc3RhY2tfZGVwdGgoKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIExpZWZlcnQgZGllIEFuemFobCBkZXIgdmVyc2NoYWNodGVsdGVuIEtvbW1hbmRpLCBhbHNvIGRpZSBUaWVmZSBkZXMKKyAgICAgICAgQ29tbWFuZCBTdGFja3MuCisKK0FFTkRFUlVOR0VOCisgICAgICAgIEVpbmdlZnVlaHJ0IGluIExETXVkIDMuMi43LgorCitTSUVIRSBBVUNICisgICAgICAgIGNvbW1hbmQoRSksIGNvbW1hbmRfc3RhY2soRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL2NvbmZpZ3VyZV9kcml2ZXIgYi9kb2MvZWZ1bi9jb25maWd1cmVfZHJpdmVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMjQwN2IKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9jb25maWd1cmVfZHJpdmVyCkBAIC0wLDAgKzEsMTMzIEBACitTWU5PUFNJUworICAgICAgICAjaW5jbHVkZSA8Y29uZmlndXJhdGlvbi5oPgorCisgICAgICAgIHZvaWQgY29uZmlndXJlX2RyaXZlcihpbnQgd2hhdCwgbWl4ZWQgZGF0YSkKKworREVTQ1JJUFRJT04KKyAgICAgICAgVGhpcyBlZnVuIGNvbmZpZ3VyZXMgcnVudGltZSBhZGp1c3RhYmxlIGJhaHZpb3VyIG9mIHRoZSBkcml2ZXIuCisKKyAgICAgICAgU2V0cyB0aGUgb3B0aW9uIDx3aGF0PiB0byB0aGUgdmFsdWUgPGRhdGE+LgorCisgICAgICAgIFRoaXMgZnVuY3Rpb24gYWx3YXlzIGNhdXNlcyB0aGUgcHJpdmlsZWdlX3Zpb2xhdGlvbgorICAgICAgICAoImNvbmZpZ3VyZV9kcml2ZXIiLCB0aGlzX29iamVjdCgpLCB3aGF0LCBkYXRhKS4KKworICAgICAgICA8d2hhdD4gPT0gRENfTUVNT1JZX0xJTUlUCisgICAgICAgICAgIFNldCBuZXcgc29mdCBhbmQgaGFyZCBtZW1vcnkgbGltaXRzIGZvciB0aGUgZHJpdmVyLgorICAgICAgICAgICA8ZGF0YT4gaXMgZXhwZWN0ZWQgdG8gYmUgYW4gYXJyYXkgd2l0aCB0d28gZWxlbWVudHMsIHdoaWNoIGhhdmUgdG8KKyAgICAgICAgICAgYmUgaW50ZWdlcnMgZ2l2aW5nIHRoZSBhbW91bnQgb2YgbWVtb3J5IGluIGJ5dGVzLgorICAgICAgICAgICAoezxzb2Z0IG1lbW9yeSBsaW1pdD4sIDxoYXJkIG1lbW9yeSBsaW1pdD59KQorCisgICAgICAgIDx3aGF0PiA9PSBEQ19FTkFCTEVfSEVBUlRfQkVBVFMKKyAgICAgICAgICAgR2xvYmFsbHkgZW5hYmxlIHRoZSBjYWxsaW5nIG9mIEhlYXJ0YmVhdHMsIGlmIDxkYXRhPiBpcyAxLAorICAgICAgICAgICBnbG9iYWxseSBkaXNhYmxlIHRoZW0gaWYgPGRhdGE+IGlzIDAuCisgICAgICAgICAgIElmIGNhbGxlZCBkdXJpbmcgaGVhcnRiZWF0IHByb2Nlc3NpbmcsIHRoZSBjaGFuZ2UgY29tZXMgaW50byBlZmZlY3QKKyAgICAgICAgICAgYXQgdGhlIG5leHQgYmFja2VuZCBjeWNsZS4KKworICAgICAgICA8d2hhdD4gPT0gRENfTE9OR19FWEVDX1RJTUUKKyAgICAgICAgICAgU2V0IHRoZSB0aW1lIGNvbnNpZGVyZWQgYXMgKHRvbykgbG9uZyBmb3IgdG9wLWxldmVsIGV4ZWN1dGlvbnMuIElmCisgICAgICAgICAgIGFuIGV4ZWN1dGlvbiBleGNlZWRzIHRoaXMgdGltZSwgYSBzdGFjayB0cmFjZSB3aWxsIGJlIHdyaXR0ZW4gdG8KKyAgICAgICAgICAgdGhlIGRlYnVnIGxvZy4gVGhlIGV4ZWN1dGlvbiB3aWxsIGNvbnRpbnVlIGF0IHRoYXQgcG9pbnQuCisgICAgICAgICAgIDxkYXRhPiBpcyBhbiBpbnRlZ2VyIGFuZCBtZWFzdXJlZCBpbiBtaWNyb3NlY29uZHMuCisgICAgICAgICAgIEEgdGltZSBvZiAwIGRpc2FibGVzIHRoZSBkZXRlY3Rpb24gb2YgbG9uZyBleGVjdXRpb25zLgorCisgICAgICAgIDx3aGF0PiA9PSBEQ19EQVRBX0NMRUFOX1RJTUUKKyAgICAgICAgICAgU2V0cyB0aGUgYXZlcmFnZSB0aW1lIGJldHdlZW4gY2xlYW4tdXBzIG9mIGFuIG9iamVjdHMgZGF0YQorICAgICAgICAgICBzdHJ1Y3R1cmVzLiBUaGlzIGlzIG5vdCB0byBiZSBjb25mdXNlZCB3aXRoIHRoZSBzdGFuZGFyZCBjbGVhbnVwCisgICAgICAgICAgIHRpbWUgd2hpY2ggZGV0ZXJtaW5lcyB3aGVuIEhfQ0xFQU5fVVAgaXMgY2FsbGVkLiBBIGxvbmcgdGltZSBmb3IKKyAgICAgICAgICAgZGF0YSBjbGVhbnVwIG1heSBsZWFkIHRvIGxhcmdlciBtZW1vcnkgY29uc3VtcHRpb24gYW5kIHByZXZlbnRzCisgICAgICAgICAgIGRlc3RydWN0ZWQgb2JqZWN0cyBiZWluZyBjbGVhbmVkIHVwLiBBIHRvbyBzaG9ydCB0aW1lIG1heSBsZWFkIHRvCisgICAgICAgICAgIGhpZ2ggbG9hZHMgYW5kIGxhZyBvbiB0aGUgbWFjaGluZS4gVGhlIGFjdHVhbCB0aW1lIGRlbGF5IHdpbGwgYmUgYQorICAgICAgICAgICB0aW1lIGJldHdlZW4gMC45KkRDX0RBVEFfQ0xFQU5fVElNRSBhbmQgMS4xKkRDX0RBVEFfQ0xFQU5fVElNRS4KKyAgICAgICAgICAgRGVmYXVsdCBhdCBkcml2ZXIgc3RhcnR1cCBhcmUgMzYwMHMuCisgICAgICAgICAgIDxkYXRhPiBpcyBhbiBpbnRlZ2VyIGFuZCBtZWFzdXJlZCBpbiBzZWNvbmRzLgorCisgICAgICAgIDx3aGF0PiA9PSBEQ19UTFNfQ0VSVElGSUNBVEUKKyAgICAgICAgICAgU2V0cyB0aGUgY3VycmVudCBjZXJ0aWZpY2F0ZSB1c2VkIGZvciBuZXcgVExTIHNlc3Npb25zLgorICAgICAgICAgICBJdCBjYW4gYmUgb25lIG9mIHRoZSBjZXJ0aWZpY2F0ZXMgaW4gdGhlIGtleSBkaXJlY3RvcnkKKyAgICAgICAgICAgKGNvbW1hbmQgbGluZSBvcHRpb24gLS10bHMta2V5ZGlyZWN0b3J5KSBvciB0aGUgbWFpbgorICAgICAgICAgICBjZXJ0aWZpY2F0ZSAoZ2l2ZW4gd2l0aCAtLXRscy1jZXJ0ZmlsZSkuCisgICAgICAgICAgIERlZmF1bHQgaXMgdGhlIG1haW4gY2VydGlmaWNhdGUgb3IgZWxzZSB0aGUgZmlyc3QKKyAgICAgICAgICAgY2VydGlmaWNhdGUgZm91bmQgaW4gdGhlIGRpcmVjdG9yeS4gVGhlIGNob3NlbiBjZXJ0aWZpY2F0ZSBhdCB0aGUKKyAgICAgICAgICAgdGltZSBvZiB0aGUgdGxzX2luaXRfY29ubmVjdGlvbigpIGNhbGwgaXMgdXNlZCBmb3IgdGhhdCBjb25uZWN0aW9uLgorICAgICAgICAgICA8ZGF0YT4gaXMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgU0hBMSBmaW5nZXJwcmludAorICAgICAgICAgICBvZiB0aGUgY2VydGlmaWNhdGUgd2l0aCBoZXhhZGVjaW1hbCBudW1iZXJzLAorICAgICAgICAgICBpdCBtYXkgY29udGFpbiBjb2xvbnMgb3Igd2hpdGVzcGFjZXMgKGZvciBleGFtcGxlCisgICAgICAgICAgICI1QTpGRTpDQTo1NzoxRTo1MDo1RToxRTpDNzpFRDpCQToxMTpBRDo1MDoxMDo3NTowRjo3QToxRTo1MCIpLgorICAgICAgICAgICBXaGVuIGxvYWRpbmcgY2VydGlmaWNhdGVzIHRoZWlyIGZpbmdlcnByaW50cyBhcmUgcHJpbnRlZAorICAgICAgICAgICBvbiBzdGRvdXQgYW5kIGludG8gdGhlIGxvZ2ZpbGUuCisKKyAgICAgICAgPHdoYXQ+ID09IERDX1RMU19ESEVfUEFSQU1FVEVSCisgICAgICAgICAgIFNldHMgbmV3IHBhcmFtZXRlcnMgZm9yIHRoZSBEaWZmaWUtSGVsbG1hbiBrZXlleGNoYW5nZSBmb3IgbmV3IFRMUworICAgICAgICAgICBzZXNzaW9ucy4gVGhlIHBhcmFtdGVycyBtdXN0IGJlIGdpdmVuIGFzIGEgUEVNIGVuY29kZWQgc3RyaW5nCisgICAgICAgICAgIChlLmcuIHRoZSBvdXRwdXQgb2YgJ29wZW5zc2wgZGhwYXJhbSAtNSAyMDQ4JykuCisgICAgICAgICAgIElmIDxkYXRhPiBpcyAwLCB0aGUgYnVpbHQtaW4gZGVmYXVsdHMgd2lsbCBiZSByZXN0b3JlZC4KKyAgICAgICAgICAgSWYgaW1wb3J0aW5nIHRoZSBuZXcgcGFyYW1ldGVycyBmYWlscyAoZS5nLiBkdWUgdG8gYW4gaW5jb3JyZWN0CisgICAgICAgICAgIGZvcm1hdCksIHRoZSBkcml2ZXIgdHJpZXMgdG8ga2VlcCB0aGUgb2xkIHBhcmFtZXRlcnMgCisKKyAgICAgICAgPHdoYXQ+ID09IERDX1RMU19DSVBIRVJMSVNUCisgICAgICAgICAgIFNldHMgYSBuZXcgbGlzdCBvZiBjaXBoZXJzIChPcGVuU1NMKSBvciBwcmlvcml0aWVzIChHbnVUTFMpIHRvIHVzZS4KKyAgICAgICAgICAgRm9yIHRoZSBjb3JyZWN0IGZvcm1hdCwgcGxlYXNlIHJlZmVyIHRvIHRoZSBoZWxwIG9mICdvcGVuc3NsCisgICAgICAgICAgIGNpcGhlcnMnIG9yIGRvY3VtZW50YXRpb24gb2YgcHJpb3JpdHkgc3RyaW5ncyBpbiBHbnVUTFMuCisgICAgICAgICAgIFdpdGggR251VExTIGEgc3ludGF4IGVycm9yIGluIHRoZSBsaXN0IGNhdXNlcyBhbiBlcnJvci4KKyAgICAgICAgICAgV2l0aCBPcGVuU1NMIGFuIGVycm9yIGlzIG9ubHkgcmFpc2VkIG9mIG5vbmUgb2YgdGhlIGdpdmVuIGNpcGhlcnMKKyAgICAgICAgICAgY291bGQgYmUgc2VsZWN0ZWQuCisgICAgICAgICAgIEJ5IGRlZmF1bHQsIHRoZSBwcmVmZXJyZWQgY2lwaGVycyBvZiB0aGUgZHJpdmVyIHRha2UgcHJlY2VkZW5jZQorICAgICAgICAgICBUaGlzIGNhbiBiZSBjaGFuZ2VkIGluIHRoZSBwcmlvcml0eSBzdHJpbmdzIGZvciBHbnVUTFMsIGJ1dAorICAgICAgICAgICBjdXJyZW50bHkgbm90IGZvciBPcGVuU1NMLgorCisgICAgICAgIDx3aGF0PiA9PSBEQ19FWFRSQV9XSVpJTkZPX1NJWkUKKyAgICAgICAgICAgSW5kaWNhdGUgdGhhdCB0aGUgd2l6bGlzdCBzaG91bGQgY29udGFpbiBhbiBhcnJheSBvZiB0aGUgZ2l2ZW4gc2l6ZQorICAgICAgICAgICB3aXRoIGV4dHJhIGluZm8gZm9yIGVhY2ggd2l6YXJkLiBBIG5lZ2F0aXZlIHZhbHVlIGluZGljYXRlcworICAgICAgICAgICBhIG5vbi1hcnJheSB2YWx1ZS4KKworICAgICAgICAgICBUaGUgdmFsdWUgaXMgb25seSB1c2VkIHRvIGFsbG9jYXRlIGEgcHJvcGVyIGVtcHR5ICdleHRyYScgdmFsdWUKKyAgICAgICAgICAgZm9yIG5ld2x5IGNyZWF0ZWQgd2l6bGlzdCBlbnRyaWVzLgorCisgICAgICAgIDx3aGF0PiA9PSBEQ19ERUZBVUxUX1JVTlRJTUVfTElNSVRTCisgICAgICAgICAgIFNldHMgdGhlIGRlZmF1bHQgcnVudGltZSBsaW1pdHMsIHRoYXQgd2lsbCBiZSB1c2VkIGZvciBlYWNoIHRocmVhZC4KKyAgICAgICAgICAgVGhleSB3aWxsIGJlIGluIGVmZmVjdCBhcyB0aGUgaW5pdGlhbCBsaW1pdHMgd2l0aCB0aGUgbmV4dCB0aHJlYWQuCisgICAgICAgICAgIFRoZSBsaW1pdHMgbXVzdCBiZSBnaXZlbiBhcyBhbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgZW50cmllczoKKworICAgICAgICAgICAgIGludFtMSU1JVF9FVkFMXTogICAgICAgICB0aGUgbWF4IG51bWJlciBvZiBldmFsIGNvc3RzCisgICAgICAgICAgICAgaW50W0xJTUlUX0FSUkFZXTogICAgICAgIHRoZSBtYXggbnVtYmVyIG9mIGFycmF5IGVudHJpZXMKKyAgICAgICAgICAgICBpbnRbTElNSVRfTUFQUElOR19TSVpFXTogdGhlIG1heCBudW1iZXIgb2YgbWFwcGluZyB2YWx1ZXMKKyAgICAgICAgICAgICBpbnRbTElNSVRfTUFQUElOR19LRVlTXTogdGhlIG1heCBudW1iZXIgb2YgbWFwcGluZyBlbnRyaWVzCisgICAgICAgICAgICAgaW50W0xJTUlUX0JZVEVdOiAgICAgICAgIHRoZSBtYXggbnVtYmVyIG9mIGJ5dGVzIGhhbmRsZWQgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmUgcmVhZF9ieXRlcygpL3dyaXRlX2J5dGVzKCkgY2FsbC4KKyAgICAgICAgICAgICBpbnRbTElNSVRfRklMRV06ICAgICAgICAgdGhlIG1heCBudW1iZXIgb2YgYnl0ZXMgaGFuZGxlZCB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZSByZWFkX2ZpbGUoKS93cml0ZV9maWxlKCkgY2FsbC4KKyAgICAgICAgICAgICBpbnRbTElNSVRfQ0FMTE9VVFNdOiAgICAgdGhlIG51bWJlciBvZiBjYWxsb3V0cyBhdCBvbmUgdGltZS4KKyAgICAgICAgICAgICBpbnRbTElNSVRfQ09TVF06ICAgICAgICAgaG93IHRvIGFjY291bnQgdGhlIGN1cnJlbnQgY29zdC4KKyAgICAgICAgICAgICBpbnRbTElNSVRfTUVNUk9ZXTogICAgICAgdGhlIG1heC4gbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIGNhbiBiZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYWRkaXRpb25hbGx5XyBhbGxvY2F0ZWQvdXNlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9wZXIgdG9wLWxldmVsIGV4ZWN1dGlvbiB0aHJlYWRfLgorCisgICAgICAgICAgVGhlIGxpbWl0IHNldHRpbmdzIHJlY29nbml6ZSB0aHJlZSBzcGVjaWFsIHZhbHVlczoKKworICAgICAgICAgICAgTElNSVRfVU5MSU1JVEVEOiAgdGhlIGxpbWl0IGlzIGRlYWN0aXZhdGVkCisgICAgICAgICAgICBMSU1JVF9LRUVQOiAgICAgICB0aGUgZm9ybWVyIHNldHRpbmcgaXMga2VwdAorICAgICAgICAgICAgTElNSVRfREVGQVVMVDogICAgdGhlICdnbG9iYWwnIGRlZmF1bHQgc2V0dGluZyBpcyB1c2VkLgorCisgICAgICAgICAgRm9yIExJTUlUX0NPU1QsIHRoZSBzcGVjaWFsIHZhbHVlcyBoYXZlIHRoZXNlIG1lYW5pbmc6CisgICAgICAgICAgICBMSU1JVF9VTkxJTUlURUQ6ICBhdCBtYXhpbXVtIDEgdGljayBpcyBhY2NvdW50ZWQKKyAgICAgICAgICAgIExJTUlUX0tFRVA6ICAgICAgICBMSU1JVF9DT1NUIGlzIHNldCB0byAwCisgICAgICAgICAgICBMSU1JVF9ERUZBVUxUOiAgICAgTElNSVRfQ09TVCBpcyBzZXQgdG8gLTEwMAorCisgICAgICAgIDx3aGF0PiA9PSBEQ19TV0FQX0NPTVBBQ1RfTU9ERQorICAgICAgICAgICBTZXRzIGZyZWUgc3dhcCBzcGFjZSBzaGFsbCBiZSByZXVzZWQgaW1tZWRpYXRlbHkgdG8ga2VlcAorICAgICAgICAgICB0aGUgc3dhcCBmaWxlIGFzIHNtYWxsIGFzIHBvc3NpYmxlLgorICAgICAgICAgICAoU2FtZSBhcyB0aGUgLS1zd2FwLWNvbXBhY3QgY29tbWFuZCBsaW5lIHN3aXRjaC4pCisKK0hJU1RPUlkKKyAgICAgICAgSW50cm9kdWNlZCBpbiBMRE11ZCAzLjMuNzE5LgorICAgICAgICBEQ19FTkFCTEVfSEVBUlRfQkVBVFMgd2FzIGFkZGVkIGluIDMuNS4wLgorICAgICAgICBEQ19MT05HX0VYRUNfVElNRSB3YXMgYWRkZWQgaW4gMy41LjAuCisgICAgICAgIERDX0RBVEFfQ0xFQU5fVElNRSB3YXMgYWRkZWQgaW4gMy41LjAuCisgICAgICAgIERDX0VYVFJBX1dJWklORk9fU0laRSB3YXMgYWRkZWQgaW4gMy41LjAuCisgICAgICAgIERDX1RMU19DRVJUSUZJQ0FURSB3YXMgYWRkZWQgaW4gMy41LjAuCisgICAgICAgIERDX1RMU19ESEVfUEFSQU1FVEVSIHdhcyBhZGRlZCBpbiAzLjUuMC4KKyAgICAgICAgRENfVExTX0NJUEhFUkxJU1Qgd2FzIGFkZGVkIGluIDMuNS4wLgorICAgICAgICBEQ19TV0FQX0NPTVBBQ1RfTU9ERSB3YXMgYWRkZWQgaW4gMy41LjAuCisKK1NFRSBBTFNPCisgICAgICAgIGNvbmZpZ3VyZV9pbnRlcmFjdGl2ZShFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vY29uZmlndXJlX2ludGVyYWN0aXZlIGIvZG9jL2VmdW4vY29uZmlndXJlX2ludGVyYWN0aXZlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZDE0NWQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9jb25maWd1cmVfaW50ZXJhY3RpdmUKQEAgLTAsMCArMSwxMzkgQEAKK1NZTk9QU0lTCisgICAgICAgICNpbmNsdWRlIDxjb25maWd1cmF0aW9uLmg+CisKKyAgICAgICAgdm9pZCBjb25maWd1cmVfaW50ZXJhY3RpdmUob2JqZWN0IG9iLCBpbnQgd2hhdCwgbWl4ZWQgZGF0YSkKKworREVTQ1JJUFRJT04KKyAgICAgICAgU2V0cyB0aGUgb3B0aW9uIDx3aGF0PiB0byB0aGUgdmFsdWUgPGRhdGE+IG9uIHRoZSBpbnRlcmFjdGl2ZSA8b2I+CisgICAgICAgIG9yIHRoZSBkZWZhdWx0IGZvciBhbGwgaW50ZXJhY3RpdmVzIGlmIDxvYj4gaXMgMC4KKworICAgICAgICBJZiB0aGUgZmlyc3QgYXJndW1lbnQgPG9iPiBpcyBub3QgdGhpc19vYmplY3QoKSwgdGhlIHByaXZpbGVnZQorICAgICAgICB2aW9sYXRpb24gKCJjb25maWd1cmVfaW50ZXJhY3RpdmUiLCB0aGlzX29iamVjdCgpLCBvYiwgd2hhdCwgZGF0YSkKKyAgICAgICAgb2NjdXJzLgorCisgICAgICAgIEFzIDx3aGF0PiwgdGhlIGZvbGxvd2luZyBhcmd1bWVudHMgYXJlIGFjY2VwdGVkOgorCisgICAgICAgIDx3aGF0PiA9PSBJQ19NQVhfV1JJVEVfQlVGRkVSX1NJWkUKKyAgICAgICAgICBTZXRzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBkYXRhIHRvIGJlIGhlbGQgcGVuZGluZyBmb3Igd3JpdGluZworICAgICAgICAgIHBlciBwbGF5ZXIgdG8gPGRhdGE+IGJ5dGVzLiBBIHZhbHVlIG9mIC0xIG1lYW5zIHVubGltaXRlZCwKKyAgICAgICAgICAwIGRlYWN0aXZhdGVzIHRoZSB3cml0ZSBidWZmZXIuCisKKyAgICAgICAgPHdoYXQ+ID09IElDX1NPQ0tFVF9CVUZGRVJfU0laRQorICAgICAgICAgIENoYW5nZXMgdGhlIHNvY2tldCBidWZmZXIgc2l6ZSB0byB0aGUgZ2l2ZW4gc2l6ZSBpbiBieXRlcy4KKyAgICAgICAgICBOb3QgZXZlcnkgb3BlcmF0aW5nIHN5c3RlbSBtaWdodCBwcm92aWRlIHRoaXMgb3B0aW9uIHRvCisgICAgICAgICAgY2hhbmdlIHRoZSBidWZmZXIgc2l6ZS4KKworICAgICAgICAgIFRoZSBidWZmZXIgc2l6ZSBpcyB1c2VkIGZvciBzZW5kaW5nLCB3aGVuIHRoZSByZW1vdGUgc2lkZSBpc24ndAorICAgICAgICAgIGdldHRpbmcgdGhlIGRhdGEgZmFzdCBlbm91Z2guIFdoZW4gdGhlIHNvY2tldCBidWZmZXIgaXMgZnVsbCwKKyAgICAgICAgICB0aGUgZHJpdmVyIHdpbGwgYnVmZmVyIGluIGl0cyBpbnRlcm5hbCB3cml0ZSBidWZmZXIgKHNlZQorICAgICAgICAgIElDX01BWF9XUklURV9CVUZGRVJfU0laRSkuIFdoZW4gdGhhdCBnZXRzIGZ1bGwsIHRvbywgdGhlbgorICAgICAgICAgIG1lc3NhZ2VzIGFyZSBkaXNjYXJkZWQuCisKKyAgICAgICAgPHdoYXQ+ID09IElDX0NPTUJJTkVfQ0hBUlNFVF9BU19TVFJJTkcKKyAgICAgICAgICBTZXQgdGhlIHNldCBvZiBjaGFyYWN0ZXJzIHdoaWNoIGNhbiBiZSBjb21iaW5lZCBpbnRvIGEgc2luZ2xlCisgICAgICAgICAgc3RyaW5nIHdoZW4gYWxyZWFkeSByZWNlaXZlZCBlbi1ibG9jIGluIGNoYXJtb2RlIGZyb20gdGhlCisgICAgICAgICAgaW50ZXJhY3RpdmUgdXNlciA8b2I+LiBOb24tY29tYmluYWJsZSBjaGFyYWN0ZXJzIGFuZCBzaW5nbGUKKyAgICAgICAgICByZWNlaXZlZCBjaGFyYWN0ZXJzIGFyZSByZXR1cm5lZCBhcyBzZXBhcmF0ZSBzdHJpbmdzIGFzIHVzdWFsLgorCisgICAgICAgICAgVGhlIG5ld2xpbmUgJ1xuJyBhbmQgdGhlIE5VTCBjaGFyYWN0ZXIgJ1wwJyBhcmUgYWx3YXlzCisgICAgICAgICAgbm9uLWNvbWJpbmFibGUuCisKKyAgICAgICAgICBUaGUgZ2l2ZW4gc3RyaW5nIHNob3VsZCBjb250YWluIGFsbCBjb21iaW5hYmxlIGNoYXJhY3RlcnMuCisgICAgICAgICAgSWYgZ2l2ZW4gYXMgdGhlIG51bWJlciAwLCB0aGUgZGVmYXVsdCBjb21iaW5lIGNoYXJzZXQgaXMKKyAgICAgICAgICByZS1lc3RhYmxpc2hlZC4KKworICAgICAgICA8d2hhdD4gPT0gSUNfQ09NQklORV9DSEFSU0VUX0FTX0FSUkFZCisgICAgICAgICAgU2V0IHRoZSBzZXQgb2YgY2hhcmFjdGVycyB3aGljaCBjYW4gYmUgY29tYmluZWQgaW50byBhIHNpbmdsZQorICAgICAgICAgIHN0cmluZywganVzdCBsaWtlIElDX0NPTUJJTkVfQ0hBUlNFVF9BU19TVFJJTkcuCisKKyAgICAgICAgICBUaGUgZ2l2ZW4gYXJyYXkgc2hhbGwgY29udGFpbiBhbiBhcnJheSBvZiB1cCB0byAzMiBpbnRlZ2VycworICAgICAgICAgIHRoYXQgYXJlIGludGVycHJldGVkIGFzIDgtYml0LXZhbHVlcy4gRWFjaCBjaGFyYWN0ZXIgaXMgZW5jb2RlZAorICAgICAgICAgIGFzIG9uZSBiaXQgKEFTQ0lJIGNoYXJhY3RlcnMgMC03IGluIHRoZSBmaXJzdCBpbnRlZ2VyLCBhbmQgc28gb24pLgorICAgICAgICAgIFNvIGEgY2hhcmFjdGVyIDxuPiBpcyB0cmVhdGVkIGFzIGNvbWJpbmFibGUgaWYKKworICAgICAgICAgICAgICBhcnJheVtuLzhdICYgKDEgPDwgbiU4KQorCisgICAgICAgICAgSWYgdGhlIGFycmF5IGNvbnRhaW5zIGxlc3MgZWxlbWVudHMsIHRoZSBtaXNzaW5nIGVsZW1lbnRzIHdpbGwKKyAgICAgICAgICBiZSByZWdhcmRlZCBhcyAwIChub24tY29tYmluYWJsZSBjaGFyYWN0ZXJzKS4KKworICAgICAgICA8d2hhdD4gPT0gSUNfQ09OTkVDVElPTl9DSEFSU0VUX0FTX1NUUklORworICAgICAgICAgIFNldCB0aGUgc2V0IG9mIGNoYXJhY3RlcnMgd2hpY2ggY2FuIGJlIG91dHB1dCB0byB0aGUgaW50ZXJhY3RpdmUKKyAgICAgICAgICB1c2VyIDxvYj4uIEFsbCBvdGhlciBjaGFyYWN0ZXJzIGFyZSBkaXNjYXJkZWQuIChUaGlzIGRvZXMgbm90CisgICAgICAgICAgYXBwbHkgdG8gYmluYXJ5X21lc3NhZ2UoKSkuCisKKyAgICAgICAgICBUaGUgZ2l2ZW4gc3RyaW5nIHNob3VsZCBjb250YWluIGFsbCBhbGxvd2VkIGNoYXJhY3RlcnMuCisgICAgICAgICAgSWYgZ2l2ZW4gYXMgdGhlIG51bWJlciAwLCB0aGUgZGVmYXVsdCBjaGFyc2V0IGlzIHJlLWVzdGFibGlzaGVkLgorCisgICAgICAgIDx3aGF0PiA9PSBJQ19DT05ORUNUSU9OX0NIQVJTRVRfQVNfQVJSQVkKKyAgICAgICAgICBTZXQgdGhlIHNldCBvZiBjaGFyYWN0ZXJzIHdoaWNoIGNhbiBiZSBvdXRwdXQgdG8gdGhlIGludGVyYWN0aXZlCisgICAgICAgICAgdXNlciA8b2I+LCBqdXN0IGxpa2UgSUNfQ09OTkVDVElPTl9DSEFSU0VUX0FTX1NUUklORy4KKworICAgICAgICAgIFRoZSBnaXZlbiBhcnJheSBzaGFsbCBjb250YWluIGFuIGFycmF5IG9mIHVwIHRvIDMyIGludGVnZXJzCisgICAgICAgICAgdGhhdCBhcmUgaW50ZXJwcmV0ZWQgYXMgOC1iaXQtdmFsdWVzLiBFYWNoIGNoYXJhY3RlciBpcyBlbmNvZGVkCisgICAgICAgICAgYXMgb25lIGJpdCAoQVNDSUkgY2hhcmFjdGVycyAwLTcgaW4gdGhlIGZpcnN0IGludGVnZXIsIGFuZCBzbyBvbikuCisgICAgICAgICAgU28gYSBjaGFyYWN0ZXIgPG4+IGlzIGFsbG93ZWQgdG8gYmUgb3V0cHV0IGlmCisKKyAgICAgICAgICAgICAgYXJyYXlbbi84XSAmICgxIDw8IG4lOCkKKworICAgICAgICAgIElmIHRoZSBhcnJheSBjb250YWlucyBsZXNzIGVsZW1lbnRzLCB0aGUgbWlzc2luZyBlbGVtZW50cyB3aWxsCisgICAgICAgICAgYmUgcmVnYXJkZWQgYXMgMCAobm90IGFsbG93ZWQsIGllLiB0byBiZSBkaXNjYXJkZWQpLgorCisgICAgICAgIDx3aGF0PiA9PSBJQ19RVU9URV9JQUMKKyAgICAgICAgICBTZXRzIHdoZXRoZXIgdGhlIGNoYXJhY3RlciAyNTUgKHRlbG5ldCBJQUMpIHNoYWxsIGJlIHF1b3RlZAorICAgICAgICAgIGJ5IHByZXBlbmRpbmcgYW5vdGhlciBJQUMgY2hhcmFjdGVyLCBzbyBpdCB3aWxsIG5vdCBiZSBpbnRlcnByZXRlZAorICAgICAgICAgIGJ5IHRoZSB0ZWxuZXQgcHJvdG9jb2wuIEVuYWJsZSB3aXRoIDEsIGRpc2FibGUgd2l0aCAwLiBCeSBkZWZhdWx0CisgICAgICAgICAgaXQgaXMgZW5hYmxlZCBhbmQgZG9lcyBvbmx5IGFwcGx5IGlmIGNoYXJhY3RlciAyNTUgaXMgYWxsb3dlZCB0bworICAgICAgICAgIGJlIG91dHB1dCAoaWUuIGl0IGlzIHBhcnQgb2YgdGhlIGNvbm5lY3Rpb24gY2hhcnNldCkuCisKKyAgICAgICAgPHdoYXQ+ID09IElDX1RFTE5FVF9FTkFCTEVECisgICAgICAgICAgRW5hYmxlcyAoMSkgb3IgZGlzYWJsZXMgKDApIHRoZSB0ZWxuZXQgbWFjaGluZSBmb3IgdGhlIGludGVyYWN0aXZlCisgICAgICAgICAgdXNlciA8b2I+LiBXaGVuIGRlYWN0aXZhdGVkIHRoZSBkcml2ZXIgd29uJ3QgaGFuZGxlIHRlbG5ldAorICAgICAgICAgIG5lZ290aWF0aW9ucyAoZWcuIEhfVEVMTkVUX05FRyB3b24ndCBiZSBjYWxsZWQpLCB0aGV5IHdpbGwgYmUKKyAgICAgICAgICBwYXJ0IG9mIHRoZSB1c2VyIGlucHV0LiBBbHNvIElOUFVUX05PRUNITyB3b24ndCBiZSBlZmZlY3RpdmUKKyAgICAgICAgICBhcyB0aGUgZHJpdmVyIHdvbid0IHNlbmQgYW55IHRlbG5ldCBuZWdvdGlhdGlvbnMgaXRzZWxmLgorCisgICAgICAgIDx3aGF0PiA9PSBJQ19NQ0NQCisgICAgICAgICAgU3RhcnRzIG9kZXIgZW5kcyBNQ0NQIGNvbXByZXNzaW9uIG9mIHRoZSBkcml2ZXIgLT4gY2xpZW50IHRyYWZmaWMuCisgICAgICAgICAgPGRhdGE+IG11c3QgYmUgdGhlIE1DQ1AgdmVyc2lvbiAoZWl0aGVyIFRFTE9QVF9DT01QUkVTUyBvcgorICAgICAgICAgIFRFTE9QVF9DT01QUkVTUzIgZnJvbSA8dGVsbmV0Lmg+KS4gV2hlbiB0aGUgdGVsbmV0IG1hY2hpbmUKKyAgICAgICAgICBpcyBkaXNhYmxlZCwgYW55IHZhbHVlIG90aGVyIHRoZW4gemVybyB3aWxsIGRvLCBhbmQgdGhlIGNvbXByZXNzaW9uCisgICAgICAgICAgc3RhcnRzIHdpdGhvdXQgYSB0ZWxuZXQgcHJlYW1ibGUuCisKKyAgICAgICAgICBBdmFpbGFibGUgb25seSBpZiB0aGUgZHJpdmVyIGlzIGNvbXBpbGVkIHdpdGggTUNDUCBlbmFibGVkOworICAgICAgICAgIF9fTUNDUF9fIGlzIGRlZmluZWQgaW4gdGhhdCBjYXNlLgorCisgICAgICAgIDx3aGF0PiA9PSBJQ19QUk9NUFQKKyAgICAgICAgICBTZXRzIHRoZSBwcm9tcHQgZm9yIHRoZSBpbnRlcmFjdGl2ZSB1c2VyIDxvYj4gdG8gPGRhdGE+LiBUaGUKKyAgICAgICAgICBwcm9tcHQgY2FuIGVpdGhlciBiZSBhIHN0cmluZyBvciBhIGNsb3N1cmUgdGhhdCB3aWxsIGJlIGNhbGxlZAorICAgICAgICAgIGVhY2ggdGltZSB0aGUgcHJvbXB0IGlzIHNob3duLgorCisgICAgICAgIDx3aGF0PiA9PSBJQ19NQVhfQ09NTUFORFMKKyAgICAgICAgICBTZXRzIHRoZSBtYXggbnVtYmVyIG9mIGNvbW1hbmRzIHRoZSBpbnRlcmFjdGl2ZSB1c2VyIDxvYj4gaXMKKyAgICAgICAgICBhbGxvd2VkIHRvIGV4ZWN1dGUgcGVyIHNlY29uZCB0byA8ZGF0YT4uIEEgbmVnYXRpdmUgdmFsdWUgbWVhbnMKKyAgICAgICAgICAndW5saW1pdGVkJyBhbmQgaXMgdGhlIHNldHRpbmcgZm9yIG5ld2x5IGNyZWF0ZWQgY29ubmVjdGlvbnMuCisKKyAgICAgICAgICBBICdjb21tYW5kJyBpbiB0aGlzIGNvbnRleHQgbWVhbnMgZXZlcnkgcmVjZWl2ZWQgZGF0YSBwYWNrZXQKKyAgICAgICAgICB3aGljaCBjYXVzZXMgYSBMUEMgY2FsbCAtIGFjdGlvbnMgYW5kIGNhbGxzIHRvIGlucHV0X3RvKCkKKyAgICAgICAgICBhbGlrZS4KKworICAgICAgICA8d2hhdD4gPT0gSUNfTU9ESUZZX0NPTU1BTkQKKyAgICAgICAgICBTZXRzIGFuIG9iamVjdCB0aGF0IHdpbGwgYWN0IGFzIGEgbW9kaWZpZXIgZm9yIGVhY2ggY29tbWFuZC4KKyAgICAgICAgICBBbGwgY29tbWFuZHMgZm9yIHRoZSBpbnRlcmFjdGl2ZSB1c2VyIDxvYj4gd2lsbCBiZSBwYXNzZWQgdG8KKyAgICAgICAgICBkYXRhLT5tb2RpZnlfY29tbWFuZCgpIGJlZm9yZSBhY3R1YWxseSBiZWluZyBleGVjdXRlZC4KKyAgICAgICAgICA8ZGF0YT4gbXVzdCBiZSBnaXZlbiBhcyBhbiBvYmplY3QuCisKKyAgICAgICAgICBXaGVuIGFuIG9iamVjdCBpcyBzZXQsIHRoZSBIX01PRElGWV9DT01NQU5EIGhvb2sgd29udCBiZQorICAgICAgICAgIGNhbGxlZCBhbnltb3JlLiAwIGFzIGFyZ3VtZW50IHdpbGwgc3RvcCB0aGUgY29tbWFuZCBtb2RpZmljYXRpb24KKyAgICAgICAgICBhbmQgcmVpbnN0YWxsIHRoZSB1c2Ugb2YgdGhhdCBkcml2ZXIgaG9vay4KKworICAgICAgICAgIFRoaXMgbWVjaGFuaXNtIGlzIGludGVuZGVkIHRvIGV4cGFuZCBhbGlhc2VzIG9uIHF1aWNrdHlwZXJzCisgICAgICAgICAgb3IgdGhlIGxpa2UuIFRoZSBuYW1lIG9mIHRoZSBsZnVuIGNhbGxlZCBjYW4gYmUgY2hhbmdlZAorICAgICAgICAgIGZyb20gbW9kaWZ5X2NvbW1hbmQoKSB0byBzb21ldGhpbmcgZWxzZSB1c2luZyB0aGUKKyAgICAgICAgICBIX01PRElGWV9DT01NQU5EX0ZOQU1FIGhvb2suCisKKworSElTVE9SWQorICAgICAgICBJbnRyb2R1Y2VkIGluIExETXVkIDMuMy43MTkuCisKK1NFRSBBTFNPCisgICAgICAgIGNvbmZpZ3VyZV9kcml2ZXIoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL2NvbmZpZ3VyZV9vYmplY3QgYi9kb2MvZWZ1bi9jb25maWd1cmVfb2JqZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNTQ3ODkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9jb25maWd1cmVfb2JqZWN0CkBAIC0wLDAgKzEsNDEgQEAKK1NZTk9QU0lTCisgICAgICAgICNpbmNsdWRlIDxjb25maWd1cmF0aW9uLmg+CisKKyAgICAgICAgdm9pZCBjb25maWd1cmVfb2JqZWN0KG9iamVjdCBvYiwgaW50IHdoYXQsIG1peGVkIGRhdGEpCisKK0RFU0NSSVBUSU9OCisgICAgICAgIFNldHMgdGhlIG9wdGlvbiA8d2hhdD4gdG8gdGhlIHZhbHVlIDxkYXRhPiBvbiB0aGUgb2JqZWN0IDxvYj4KKyAgICAgICAgb3IgdGhlIGRlZmF1bHQgZm9yIGFsbCBpbnRlcmFjdGl2ZXMgaWYgPG9iPiBpcyAwLgorCisgICAgICAgIElmIHRoZSBmaXJzdCBhcmd1bWVudCA8b2I+IGlzIG5vdCB0aGlzX29iamVjdCgpLCB0aGUgcHJpdmlsZWdlCisgICAgICAgIHZpb2xhdGlvbiAoImNvbmZpZ3VyZV9vYmplY3QiLCB0aGlzX29iamVjdCgpLCBvYiwgd2hhdCwgZGF0YSkKKyAgICAgICAgb2NjdXJzLgorCisgICAgICAgIEFzIDx3aGF0PiwgdGhlIGZvbGxvd2luZyBhcmd1bWVudHMgYXJlIGFjY2VwdGVkOgorCisgICAgICAgIDx3aGF0PiA9PSBPQ19DT01NQU5EU19FTkFCTEVECisgICAgICAgICAgU2V0cyB3aGV0aGVyIDxvYj4gY2FuIHVzZSBjb21tYW5kcyBub3JtYWxseSBhY2Nlc3NpYmxlIHRvCisgICAgICAgICAgdXNlcnMgKDEpIG9yIG5vdCAoMCkuIFRoaXMgYWxzbyBtYXJrcyB0aGUgb2JqZWN0IGFzICJsaXZpbmciLgorCisgICAgICAgIDx3aGF0PiA9PSBPQ19IRUFSVF9CRUFUCisgICAgICAgICAgRW5hYmxlcyAoMSkgb3IgZGlzYWJsZXMgKDApIHRoZSBoZWFydCBiZWF0IGZvciA8b2I+LiBUaGUKKyAgICAgICAgICBkcml2ZXIgd2lsbCBhcHBseSB0aGUgbGZ1biBoZWFydF9iZWF0KCkgdG8gdGhlIDxvYj4gZXZlcnkKKyAgICAgICAgICBfX0hFQVJUQkVBVF9JTlRFUlZBTF9fIHNlY29uZHMsIGlmIGl0IGlzIGVuYWJsZWQuCisgICAgICAgICAgQSBzaGFkb3cgb3ZlciB0aGUgaGVhcnRfYmVhdCgpIGxmdW4gd2lsbCBiZSBpZ25vcmVkLgorCisgICAgICAgICAgSWYgdGhlIGhlYXJ0IGJlYXQgaXMgbm90IG5lZWRlZCBmb3IgdGhlIG1vbWVudCwgdGhlbiBkbyBkaXNhYmxlCisgICAgICAgICAgaXQuIFRoaXMgd2lsbCByZWR1Y2Ugc3lzdGVtIG92ZXJoZWFkLgorCisgICAgICAgICAgTm90ZSB0aGF0IGhlYXJ0X2JlYXQoKXMgYXJlIGNhbGxlZCBvbmx5IGlmIHRoZXJlIGFyZSBlbmFibGVkCisgICAgICAgICAgdmlhIGNvbmZpZ3Vlcl9kcml2ZXIoRENfRU5BQkxFX0hFQVJUX0JFQVRTKSwgd2hpY2ggaXMgdGhlCisgICAgICAgICAgZGVmYXVsdC4KKworCisgICAgICAgIFRoZSBjdXJyZW50IHZhbHVlcyBmb3IgdGhlc2Ugb3B0aW9ucyBjYW4gYmUgcXVlcmllZCB1c2luZworICAgICAgICBvYmplY3RfaW5mbygpLgorCitISVNUT1JZCisgICAgICAgIEludHJvZHVjZWQgaW4gTERNdWQgMy41LjAuCisKK1NFRSBBTFNPCisgICAgICAgIG9iamVjdF9pbmZvKEUpLCBjb25maWd1cmVfaW50ZXJhY3RpdmUoRSksIGNvbmZpZ3VyZV9kcml2ZXIoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL2NvbnZlcnRfY2hhcnNldCBiL2RvYy9lZnVuL2NvbnZlcnRfY2hhcnNldApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjdjZTY1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vY29udmVydF9jaGFyc2V0CkBAIC0wLDAgKzEsOTQgQEAKK1NZTk9QU0lTCisgICAgICAgIHN0cmluZyBjb252ZXJ0X2NoYXJzZXQoc3RyaW5nIHN0ciwgc3RyaW5nIGZyb21fY3MsIHN0cmluZyB0b19jcykKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIERlciBTdHJpbmcgPHN0cj4gd2lyZCB2b24gWmVpY2hlbnNhdHogPGZyb21fY3M+IGluIFplaWNoZW5zYXR6CisgICAgICAgIDx0b19jcz4gdW1nZXdhbmRlbHQgdW5kIGRhcyBFcmdlYm5pcyB6dXJ1ZWNrZ2VnZWJlbi4KKworICAgICAgICBEaWUgWmVpY2hlbnNhZXR6ZSB3ZXJkZW4gYmVpIE5hbWVuIGFuZ2VnZWJlbiAoc293b2hsIEtsZWluLQorICAgICAgICBhbHMgYXVjaCBHcm9zc3NjaHJpZnQgaXN0IHp1bGFlc3NpZykuCisKKyAgICAgICAgRGllIEZ1bmt0aW9uIGlzdCBudXIgdmVyZnVlZ2JhciBhdWYgU3lzdGVtZW4gbWl0IGluc3RhbGxpZXJ0ZXIKKyAgICAgICAgbGliaWNvbnYuCisKKyAgICAgICAgRXJsYXVidGUgWmVpY2hlbnNhZXR6ZSBzaW5kOgorCisgICAgICAgICAgIERlciBkZXJ6ZWl0aWdlIFN5c3RlbXplaWNoZW5zYXR6OgorICAgICAgICAgICAgICAgIiIgKGRlciBMZWVyc3RyaW5nKQorCisgICAgICAgICAgIEV1cm9wZWFuIAorICAgICAgICAgICAgICAgQVNDSUksIElTTy04ODU5LXsxLDIsMyw0LDUsNyw5LDEwLDEzLDE0LDE1LDE2fSwgS09JOC1SLCBLT0k4LVUsCisgICAgICAgICAgICAgICBLT0k4LVJVLCBDUHsxMjUwLDEyNTEsMTI1MiwxMjUzLDEyNTQsMTI1N30sIENQezg1MCw4NjZ9LAorICAgICAgICAgICAgICAgTWFje1JvbWFuLENlbnRyYWxFdXJvcGUsSWNlbGFuZCxDcm9hdGlhbixSb21hbmlhfSwKKyAgICAgICAgICAgICAgIE1hY3tDeXJpbGxpYyxVa3JhaW5lLEdyZWVrLFR1cmtpc2h9LCBNYWNpbnRvc2gKKworICAgICAgICAgICBTZW1pdGljIAorICAgICAgICAgICAgICAgSVNPLTg4NTktezYsOH0sIENQezEyNTUsMTI1Nn0sIENQODYyLCBNYWN7SGVicmV3LEFyYWJpY30KKworICAgICAgICAgICBKYXBhbmVzZQorICAgICAgICAgICAgICAgRVVDLUpQLCAgIFNISUZUX0pJUywgICAgQ1A5MzIsICAgIElTTy0yMDIyLUpQLCAgICBJU08tMjAyMi1KUC0yLAorICAgICAgICAgICAgICAgSVNPLTIwMjItSlAtMQorCisgICAgICAgICAgIENoaW5lc2UKKyAgICAgICAgICAgICAgIEVVQy1DTiwgIEhaLCAgR0JLLCAgR0IxODAzMCwgIEVVQy1UVywgIEJJRzUsICBDUDk1MCwgQklHNS1IS1NDUywKKyAgICAgICAgICAgICAgIElTTy0yMDIyLUNOLCBJU08tMjAyMi1DTi1FWFQKKworICAgICAgICAgICBLb3JlYW4KKyAgICAgICAgICAgICAgIEVVQy1LUiwgQ1A5NDksIElTTy0yMDIyLUtSLCBKT0hBQgorCisgICAgICAgICAgIEFybWVuaWFuCisgICAgICAgICAgICAgICBBUk1TQ0lJLTgKKworICAgICAgICAgICBHZW9yZ2lhbgorICAgICAgICAgICAgICAgR2VvcmdpYW4tQWNhZGVteSwgR2VvcmdpYW4tUFMKKworICAgICAgICAgICBUYWppaworICAgICAgICAgICAgICAgS09JOC1UCisKKyAgICAgICAgICAgVGhhaQorICAgICAgICAgICAgICAgVElTLTYyMCwgQ1A4NzQsIE1hY1RoYWkKKworICAgICAgICAgICBMYW90aWFuCisgICAgICAgICAgICAgICBNdWxlTGFvLTEsIENQMTEzMworCisgICAgICAgICAgIFZpZXRuYW1lc2UKKyAgICAgICAgICAgICAgVklTQ0lJLCBUQ1ZOLCBDUDEyNTgKKworICAgICAgICAgICBQbGF0Zm9ybSBzcGVjaWZpY3MKKyAgICAgICAgICAgICAgSFAtUk9NQU44LCBORVhUU1RFUAorCisgICAgICAgICAgIEZ1bGwgVW5pY29kZQorICAgICAgICAgICAgICBVVEYtOAorICAgICAgICAgICAgICBVQ1MtMiwgVUNTLTJCRSwgVUNTLTJMRQorICAgICAgICAgICAgICBVQ1MtNCwgVUNTLTRCRSwgVUNTLTRMRQorICAgICAgICAgICAgICBVVEYtMTYsIFVURi0xNkJFLCBVVEYtMTZMRQorICAgICAgICAgICAgICBVVEYtMzIsIFVURi0zMkJFLCBVVEYtMzJMRQorICAgICAgICAgICAgICBVVEYtNworICAgICAgICAgICAgICBDOTksIEpBVkEKKworICAgICAgICBBdWYgZWluaWdlbiBTeXN0ZW0gc2luZCBhdWNoIGRpZSBmb2xnZW5kZW4gWmVpY2hlbnNhZXR6ZSB2ZXJmdWVnYmFyOgorCisgICAgICAgICAgICBFdXJvcGVhbiAKKyAgICAgICAgICAgICAgICBDUHs0MzcsNzM3LDc3NSw4NTIsODUzLDg1NSw4NTcsODU4LDg2MCw4NjEsODYzLDg2NSw4NjksMTEyNX0KKworICAgICAgICAgICAgU2VtaXRpYyAKKyAgICAgICAgICAgICAgICBDUDg2NAorCisgICAgICAgICAgICBKYXBhbmVzZQorICAgICAgICAgICAgICAgIEVVQy1KSVNYMDIxMywgU2hpZnRfSklTWDAyMTMsIElTTy0yMDIyLUpQLTMKKworICAgICAgICAgICAgVHVya21lbgorICAgICAgICAgICAgICAgIFREUzU2NQorCisgICAgICAgICAgICBQbGF0Zm9ybSBzcGVjaWZpY3MKKyAgICAgICAgICAgICAgICBSSVNDT1MtTEFUSU4xCisKKworQkVJU1BJRUwKKyAgICAgICAgY29udmVydF9jaGFyc2V0KCJIaSEiLCAiYXNjaWkiLCAidXRmLTgiKQorCitHRVNDSElDSFRFCisgICAgICAgIEludHJvZHVjZWQgaW4gTERNdWQgMy4zLjUzMSAuCisKK1NFRSBBTFNPCisKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL2NvcHkgYi9kb2MvZWZ1bi9jb3B5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZjM3NTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9jb3B5CkBAIC0wLDAgKzEsMjMgQEAKK1NZTk9QU0lTCisgICAgIG1peGVkIGNvcHkobWl4ZWQgYXJnKTsKKworQkVTQ0hSRUlCVU5HCisgICAgIEVyemV1Z3QgZWluZSBmbGFjaGUgS29waWUgdm9uIDxhcmc+IHVuZCBsaWVmZXJ0IGRpZXNlIHp1cnVlY2suIEZ1ZXIKKyAgICAgQXJyYXlzIHVuZCBNYXBwaW5ncyBoZWlzc3QgZGFzLCBkYXNzIG5ldWUgQXJyYXlzIGJ6dy4gTWFwcGluZ3MgZXJ6ZXVndAorICAgICB3ZXJkZW4sIGRpZSBLb3BpZW4gZGVyIEVsZW1lbnRlIGRlcyBPcmlnaW5hbHMgZW50aGFsdGVuLiBFaW5nZWJldHRldGUKKyAgICAgQXJyYXlzIHVuZCBNYXBwaW5ncyB3ZXJkZW4gamVkb2NoIGFscyBSZWZlcmVueiB1ZWJlcmdlYmVuIQorCisgICAgIEZ1ZXIgYW5kZXJlIFdlcnRlIHZvbiA8YXJnPiBiZXdpcmt0IGRpZXNlIEZ1bmt0aW9uIG5pY2h0cy4KKworQkVJU1BJRUwKKyAgICAgbWl4ZWQgKmEsICpiOworICAgICBhID0gKHsgMSwgKHsgMjEsIDIyIH0pIH0pOworICAgICBiID0gY29weShhKTsKKyAgICAgYVswXSA9IC0xOyBhWzFdWzBdID0gLTIxOworICAgICAgICAgLS0+IGEgaXN0IG51biAoeyAtMSwgKHsgLTIxLCAyMiB9KSB9KQorICAgICAgICAgICAgIGIgaXN0IG51biAoeyAgMSwgKHsgLTIxLCAyMiB9KSB9KQorCitTSUVIRSBBVUNICisgICAgIGRlZXBfY29weShFKQorCisxMC5BcHIuMjAwNyBHbG9pbnNvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL2NvcHlfYml0cyBiL2RvYy9lZnVuL2NvcHlfYml0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzY4ZDUxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vY29weV9iaXRzCkBAIC0wLDAgKzEsNDEgQEAKK1NZTk9QU0lTCisgICAgICAgIHN0cmluZyBjb3B5X2JpdHMoc3RyaW5nIHNyYywgc3RyaW5nIGRlc3QgWywgaW50IHNyY3N0YXJ0CisgICAgICAgICAgICBbLCBpbnQgZGVzdHN0YXJ0IFssIGludCBjb3B5bGVuXV1dKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIEtvcGllcnQgZGVuIEJpdGJlcmVpY2ggWzxzcmNzdGFydD4gLi4gPHNyY3N0YXJ0PiArIDxjb3B5bGVuPl0gYXVzIGRlbQorICAgICAgICBCaXRzdHJpbmcgPHNyYz4gaW4gZGVuIEJpdHN0cmluZyA8ZGVzdD4gYmVnaW5uZW5kIGFuIGRlciBQb3NpdGlvbgorICAgICAgICA8ZGVzdHN0YXJ0Pi4gRGllIGFsdGVuIFdlcnRlIHZvbiA8ZGVzdD4gd2VyZGVuIGRhYmVpIHVlYmVyc2NocmllYmVuLgorCisgICAgICAgIERlciByZXN1bHRpZXJlbmRlIFN0cmluZyB3aXJkIHp1cnVlY2sgZ2VsaWVmZXJ0LCBkaWUgYmVpZGVuCisgICAgICAgIE9yaWdpbmFsc3RyaW5ncyBibGVpYmVuIHVuYmVlaW5mbHVzc3QuCisKKyAgICAgICAgV2lyZCA8c3Jjc3RhcnQ+IG5pY2h0IGFuZ2VnZWJlbiwgd2lyZCA8c3JjPiB2b24gQW5mYW5nIGFuIGtvcGllcnQuCisgICAgICAgIElzdCA8c3Jjc3RhcnQ+IG5lZ2F0aXYsIHdpcmQgdm9tIGxldHp0ZW4gQml0IGhlciBnZXphZWhsdCAoZC5oLiAtMQorICAgICAgICBiZXplaWNobmV0IGRhcyBsZXR6dGUgQml0KS4KKworICAgICAgICBXaXJkIDxkZXN0c3RhcnQ+IG5pY2h0IGFuZ2VnZWJlbiwgd2lyZCA8ZGVzdD4gdm9uIEFuZmFuZyBhbiBrb3BpZXJ0LgorICAgICAgICBJc3QgPGRlc3RzdGFydD4gbmVnYXRpdiwgd2lyZCB2b20gbGV0enRlbiBCaXQgaGVyIGdlemFlaGx0IChkLmguIC0xCisgICAgICAgIGJlemVpY2huZXQgZGFzIGxldHp0ZSBCaXQpLgorCisgICAgICAgIFdpcmQgPGNvcHlsZW4+IG5pY2h0IGFuZ2VnZWJlbiB3aXJkLCBzbyB3aXJkIGRlciBnZXNhbXRlIEJpdHN0cmluZworICAgICAgICA8c3JjPiBrb3BpZXJ0LiBEYXMgUmVzdWx0YXQgYmVzdGVodCBkYW5uIGF1cyBkZW0gQml0c3RyaW5nIDxkZXN0PgorICAgICAgICBiaXMgenVyIFBvc2l0aW9uIDxkZXN0c3RhcnQ+LCBnZWZvbGd0IHZvbiA8c3JjPiBhYiBkZXIgUG9zaXRpb24KKyAgICAgICAgPHNyY3N0YXJ0Pi4KKworICAgICAgICBXZW5uIDxjb3B5bGVuPiBuZWdhdGl2IGlzdCwgd2VyZGVuIGFicyg8Y29weWxlbj4pIF92b3JfIDxzcmNzdGFydD4gaW4KKyAgICAgICAgZGFzIFJlc3VsdGF0IGtvcGllcnQuCisKK0JFSVNQSUVMRQorICAgICAgICBjb3B5X2JpdHMoc3JjLCBkZXN0LCAxMCkgICAgICAgPT09IHNyY1sxMC4uXQorICAgICAgICBjb3B5X2JpdHMoc3JjLCBkZXN0LCAxMCwgNSkgICAgPT09IGRlc3RbMC4uNF0gKyBzcmNbMTAuLl0KKyAgICAgICAgY29weV9iaXRzKHNyYywgZGVzdCwgMTAsIDUsIDMpID09PSBkZXN0WzAuLjRdICsgc3JjWzEwLi4xMl0gKyBkZXN0WzguLl0KKworICAgICAgICAoRGllIE5vdGF0aW9uIHNyY1tdIC8gZGVzdFtdIGRpZW50IG51ciBkZXIgSWxsdXN0cmF0aW9uISkKKworQUVOREVSVU5HRU4KKyAgICAgICAgRWluZ2VmdWVocnQgaW4gTERNdWQgMy4yLjkKKworU0lFSEUgQVVDSAorICAgICAgICBjbGVhcl9iaXQoRSksIHNldF9iaXQoRSksIHRlc3RfYml0KEUpLCBuZXh0X2JpdChFKSwgbGFzdF9iaXQoRSksCisgICAgICAgIGNvdW50X2JpdHMoRSksIG9yX2JpdHMoRSksIHhvcl9iaXRzKEUpLCBpbnZlcnRfYml0cyhFKSwgYW5kX2JpdHMoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL2NvcHlfZmlsZSBiL2RvYy9lZnVuL2NvcHlfZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTA5MWVkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vY29weV9maWxlCkBAIC0wLDAgKzEsMTkgQEAKK1NZTk9QU0lTCisgICAgICAgIGludCBjb3B5X2ZpbGUoc3RyaW5nIGZyb20sIHN0cmluZyB0bykKKworREVTQ1JJUFRJT04KKyAgICAgICAgVGhlIGVmdW4gY29weV9maWxlKCkgd2lsbCBjb3B5IHRoZSBmaWxlIDxmcm9tPiB0byB0aGUgbmV3IG5hbWUgPHRvPi4KKyAgICAgICAgSWYgPHRvPiBleGlzdHMgYW5kIGlzIGEgZGlyZWN0b3J5LCB0aGVuIDxmcm9tPiB3aWxsIGJlIHBsYWNlZCBpbiB0aGF0CisgICAgICAgIGRpcmVjdG9yeSBhbmQga2VlcCBpdHMgb3JpZ2luYWwgbmFtZS4KKyAgICAgICAgCisgICAgICAgIFlvdSBtdXN0IGhhdmUgcmVhZCBwZXJtaXNzaW9uIGZvciA8ZnJvbT4gYW5kIHdyaXRlIHBlcm1pc3Npb24gZm9yCisgICAgICAgIHRoZSB0YXJnZXQgZmlsZSB0byBjb3B5IHRoZSBmaWxlLgorICAgICAgICAKKyAgICAgICAgT24gc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIGNvcHlfZmlsZSgpIHdpbGwgcmV0dXJuIDAuIElmIGFueQorICAgICAgICBvY2N1cnMsIDEgaXMgcmV0dXJuZWQsIG9yIGEgcnVudGltZSBpcyBnZW5lcmF0ZWQuCisKK0VYQU1QTEUKKyAgICAgICAgY29weV9maWxlKCIvcGxheWVycy93aXphcmQvb2JqLmMiLCAiL3BsYXllcnMvd2l6YXJkL25ld29iai5jIik7CisKK1NFRSBBTFNPCisgICAgICAgIG1rZGlyKEUpLCBybWRpcihFKSwgcm0oRSksIHJlbmFtZShFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vY29zIGIvZG9jL2VmdW4vY29zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZjNlOTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9jb3MKQEAgLTAsMCArMSwxMSBAQAorU1lOT1BTSVMKKyAgICAgICAgZmxvYXQgY29zKGludHxmbG9hdCkKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIExpZWZlcnQgZGVuIEtvc2ludXMgZGVzIEFyZ3VtZW50ZXMuCisKK0FFTkRFUlVOR0VOCisgICAgICAgIExETXVkIDMuMi45OiBHYW56emFobGVuIChJbnRlZ2VycykgYWxzIEFyZ3VtZW50IGhpbnp1Z2VmdWVndC4KKworU0lFSEUgQVVDSAorICAgICAgICBzaW4oRSksIGFzaW4oRSksIGFjb3MoRSksIHRhbihFKSwgYXRhbihFKSwgYXRhbjIoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL2NvdW50X2JpdHMgYi9kb2MvZWZ1bi9jb3VudF9iaXRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNzI1ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9jb3VudF9iaXRzCkBAIC0wLDAgKzEsMjAgQEAKK1NZTk9QU0lTCisgICAgIGludCBjb3VudF9iaXRzKHN0cmluZyBzdHIpOworCitCRVNDSFJFSUJVTkcKKyAgICAgRGllc2UgRnVua3Rpb24gemFlaGx0IGRpZSBBbnphaGwgZ2VzZXR6ZXIgQml0cyBpbSBCaXRzdHJpbmcgPHN0cj4gdW5kCisgICAgIGxpZWZlcnQgZGllIEFuemFobCBhbHMgUmVzdWx0YXQgenVydWVjay4KKworQkVNRVJLVU5HRU4KKyAgICAgQXJiZWl0ZXQgZWlnZW50bGljaCBudXIgc2lubnZvbGwgYXVmIEJpdHN0cmluZ3MgOikKKworQkVJU1BJRUwKKyAgICAgc3RyaW5nIHM7CisgICAgIHMgPSBzZXRfYml0KCIiLCAzKTsgcyA9IHNldF9iaXQocywgMTUpOworICAgICBjb3VudF9iaXRzKHMpIC0tPiBsaWVmZXJ0IDIKKworU0lFSEUgQVVDSAorICAgICBjbGVhcl9iaXQoRSksIHNldF9iaXQoRSksIHRlc3RfYml0KEUpLCBuZXh0X2JpdChFKSwgbGFzdF9iaXQoRSksCisgICAgIG9yX2JpdHMoRSksIHhvcl9iaXRzKEUpLCBpbnZlcnRfYml0cyhFKSwgY29weV9iaXRzKEUpLCBiaXRzdHJpbmdzIChDKQorCisxMC5BcHIuMjAwNyBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vY3J5cHQgYi9kb2MvZWZ1bi9jcnlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzIwODlkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vY3J5cHQKQEAgLTAsMCArMSwxNiBAQAorU1lOT1BTSVMKKyAgICAgc3RyaW5nIGNyeXB0KHN0cmluZyBzdHIsIGludCBzZWVkKTsKKyAgICAgc3RyaW5nIGNyeXB0KHN0cmluZyBzdHIsIHN0cmluZyBzZWVkKTsKKworQkVTQ0hSRUlCVU5HCisgICAgIFZlcnNjaGx1ZXNzZWx0IGRlbiBTdHJpbmcgPHN0cj4gbWl0IGRlbSBTY2hsdWVzc2VsIDxzZWVkPi4gPHNlZWQ+IGthbm4KKyAgICAgZW50d2VkZXIgZWluIEludGVnZXIgc2VpbiBvZGVyIHp3ZWkgWmVpY2hlbiBhdXMgZGVtIFN0cmluZyA8c2VlZD4uCisgICAgIFdlbm4gPHNlZWQ+IDAgaXN0LCB3aXJkIGVpbiB6dWZhZWxsaWdlciBTY2hsdWVzc2VsIGVyemV1Z3QuCisKKyAgICAgRGFzIFJlc3VsdGF0IGVudGhhZWx0IGRlbiBTY2hsdWVzc2VsIGFscyBkaWUgZXJzdGVuIGJlaWRlbiBaZWljaGVuLgorCisgICAgIEZ1ZXIgUGFzc3dvcnRhYmZyYWdlbiwgZGllIG9obmUgRWNobyBlaW5nZWdlYmVuIHdlcmRlbiBrb2VubmVuIHNvbGxlbiwKKyAgICAgYmlldGV0IGlucHV0X3RvKCkgZWluIHNwZXppZWxsZXMgRmxhZy4KKworU0lFSEUgQVVDSAorICAgICBtZDVfY3J5cHQoRSksIG1kNShFKSwgc2hhMShFKSwgaGFzaChFKSwgaG1hYyhFKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL2N0aW1lIGIvZG9jL2VmdW4vY3RpbWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRiNjFmOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2N0aW1lCkBAIC0wLDAgKzEsMjIgQEAKK1NZTk9QU0lTCisgICAgIHN0cmluZyBjdGltZShpbnQgY2xvY2spOworICAgICBzdHJpbmcgY3RpbWUoaW50KiB1Y2xvY2spOworCitCRVNDSFJFSUJVTkcKKyAgICAgSW50ZXJwcmV0aWVydCBkYXMgQXJndW1lbnQgPGNsb2NrPiBhbHMgQW56YWhsIFNla3VuZGVuIHNlaXQgZGVtCisgICAgIDAxLkpBTi4xOTcwLCAwMDowMCBVaHIgdW5kIGtvbnZlcnRpZXJ0IGRpZXNlcyBpbiBlaW5lbiBhbnNlaG5saWNoZW4KKyAgICAgU3RyaW5nLCBkZXIgRGF0dW0gdW5kIFplaXQgZW50aGFlbHQuIFdlbm4gPGNsb2NrPiBuaWNodCBhbmdlZ2ViZW4KKyAgICAgd2lyZCwgd2lyZCB0aW1lKCkgdmVyd2VuZGV0LgorCisgICAgIERpZSB6d2VpdGUgRm9ybSBlbnRzcHJpY2h0IGRlciBlcnN0ZW4sIGF1c3NlciBkYXNzIGRhcyBBcmd1bWVudCBlaW4KKyAgICAgQXJyYXkgbWl0IHp3ZWkgSW50ZWdlciBFbGVtZW50ZW4gaXN0LiBEYXMgZXJzdGUgRWxlbWVudCBpbnRbMF0gZ2lidAorICAgICBkaWUgQW56YWhsIFNla3VuZGVuIHNlaXQgZGVtIDAxLkpBTi4xOTcwIGFuLCBkYXMgendlaXRlIEVsZW1lbnQKKyAgICAgaW50WzFdIGRpZSBBbnphaGwgTWlsbGlzZWt1bmRlbiBpbm5lcmhhbGIgZGllc2VyIFNla3VuZGUuCisKK0JFSVNQSUVMCisgICAgIHdyaXRlKGN0aW1lKCkrIlxuIik7CisKKyAgICAgRGllcyBnaWJ0IGV0d2FzIGF1cyB3aWUgIlN1biBPY3QgMjYgMTk6Mjg6MzAgMjAwMyIuCisKK1NJRUhFIEFVQ0gKKyAgICAgZHRpbWUoRSksIGdtdGltZShFKSwgbG9jYWx0aW1lKEUpLCBzdHJmdGltZShFKSwgdGltZShFKSwgdXRpbWUoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL2RiX2FmZmVjdGVkX3Jvd3MgYi9kb2MvZWZ1bi9kYl9hZmZlY3RlZF9yb3dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYTI3ODMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9kYl9hZmZlY3RlZF9yb3dzCkBAIC0wLDAgKzEsMjQgQEAKK09QVElPTkFMCitTWU5PUFNJUworICAgICAgICBpbnQgZGJfYWZmZWN0ZWRfcm93cyhpbnQgaGFuZGxlKQorCitCRVNDSFJFSUJVTkcKKyAgICAgICAgUmVzdWx0YXQgaXN0IGRpZSBBbnphZWhsIGRlciBaZWlsZW4gZGllIHZvbSBsZXR6dGVuIFNRTC1CZWZlaGwKKyAgICAgICAgYmVlaW5mbHVzc3Qgd3VyZGVuLCB3ZWxjaGVzIHp1bSBTUUwtc2VydmVyIHZpYSA8aGFuZGxlPiBnZXNlbmRldAorICAgICAgICB3dXJkZS4gRGllc2UgRnVua3Rpb24gaXN0IG51ZXR6bGljaCBsZWRpZ2xpY2ggZnVlciBERUxFVEUtCisgICAgICAgIHVuZCBVUERBVEUtQmVmZWhsZS4KKworICAgICAgICBEaWUgRnVua3Rpb24gaXN0IG51ciB2ZXJmdWVnYmFyIHdlbm4gZGVyIERyaXZlciBtaXQKKyAgICAgICAgbXlTUUwtVW50ZXJzdHVldHp1bmcgY29tcGlsaWVydCB3dXJkZS4gSW4gZGllc2VtIEZhbGwgaXN0IGRhcyBNYWtybworICAgICAgICBfX01ZU1FMX18gZGVmaW5pZXJ0LgorCisgICAgICAgIERpZSBFZnVuIGlzdCBwcml2aWxlZ2llcnQgYWxzICgibXlzcWwiLCAiZGJfYWZmZWN0ZWRfcm93cyIpLgorCitHRVNDSElDSFRFCisgICAgICAgIEVpbmdlZnVlaHJ0IGluIExETXVkIDMuMi45LgorICAgICAgICBMRE11ZCAzLjIuMTEgbWFjaHRlIGRpZSBFZnVuIHByaXZpbGVnaWVydC4KKworU0lFSEUgQVVDSAorICAgICAgICBkYl9jb252X3N0cmluZyhFKSwgZGJfY2xvc2UoRSksIGRiX2NvbGRlZnMoRSksIGRiX2Nvbm5lY3QoRSksCisgICAgICAgIGRiX2V4ZWMoRSksIGRiX2Vycm9yKEUpLCBkYl9mZXRjaChFKSwgZGJfaW5zZXJ0X2lkKEUpLCBkYl9oYW5kbGVzKEUpLAorICAgICAgICBteXNxbChDKSwgcHJpdmlsZWdlX3Zpb2xhdGlvbihNKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vZGJfY2xvc2UgYi9kb2MvZWZ1bi9kYl9jbG9zZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDgxNzZjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vZGJfY2xvc2UKQEAgLTAsMCArMSwyMiBAQAorT1BUSU9OQUwKK1NZTk9QU0lTCisgICAgICAgIGludCBkYl9jbG9zZShpbnQgaGFuZGxlKQorCitCRVNDSFJFSUJVTkcKKyAgICAgICAgU2NobGllc3NlIGRpZSBWZXJiaW5kdW5nIDxoYW5kbGU+IHp1bSBTUUwtU2VydmVyLiBSZXN1bHRhdCBpc3QKKyAgICAgICAgPGhhbmRsZT4gYmVpIEVyZm9sZy4KKworICAgICAgICBEaWUgRnVua3Rpb24gaXN0IG51ciB2ZXJmdWVnYmFyIHdlbm4gZGVyIERyaXZlciBtaXQKKyAgICAgICAgbXlTUUwtVW50ZXJzdHVldHp1bmcgY29tcGlsaWVydCB3dXJkZS4gSW4gZGllc2VtIEZhbGwgaXN0IGRhcyBNYWtybworICAgICAgICBfX01ZU1FMX18gZGVmaW5pZXJ0LgorCisgICAgICAgIERpZSBFZnVuIGlzdCBwcml2aWxlZ2llcnQgYWxzICgibXlzcWwiLCAiZGJfY2xvc2UiKS4KKworR0VTQ0hJQ0hURQorICAgICAgICBFaW5nZWZ1ZWhydCBpbiBMRE11ZCAzLjIuOS4KKyAgICAgICAgTERNdWQgMy4yLjExIG1hY2h0ZSBkaWUgRWZ1biBwcml2aWxlZ2llcnQuCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgZGJfYWZmZWN0ZWRfcm93cyhFKSwgZGJfY29udl9zdHJpbmcoRSksIGRiX2NvbGRlZnMoRSksIGRiX2Nvbm5lY3QoRSksCisgICAgICAgIGRiX2V4ZWMoRSksIGRiX2Vycm9yKEUpLCBkYl9mZXRjaChFKSwgZGJfaGFuZGxlcyhFKSwgZGJfaW5zZXJ0X2lkKEUpLAorICAgICAgICBteXNxbChDLCBwcml2aWxlZ2VfdmlvbGF0aW9uKE0pKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vZGJfY29sZGVmcyBiL2RvYy9lZnVuL2RiX2NvbGRlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEzNWExMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2RiX2NvbGRlZnMKQEAgLTAsMCArMSwyMyBAQAorT1BUSU9OQUwKK1NZTk9QU0lTCisgICAgICAgIHN0cmluZyAqIGRiX2NvbGRlZnMgKGludCBoYW5kbGUpCisKK0JFU0NIUkVJQlVORworICAgICAgICBSZXN1bHRhdCBpc3QgZWluIEFycmF5IG1pdCBkZW4gU3BhbHRlbm5hbWVuIGRlciBUYWJlbGxlIGRlcworICAgICAgICBsZXR6dGVuIFFVRVJZLUJlZmVobHMuIEdhYiBkaWUgRGF0ZW5iYW5rIGtlaW5lIFRhYmVsbGUgenVydWVjaywgZGFubgorICAgICAgICBnaWJ0IGRpZSBFZnVuIDAgYWxzIEVyZ2VibmlzLgorCisgICAgICAgIERpZSBGdW5rdGlvbiBpc3QgbnVyIHZlcmZ1ZWdiYXIgd2VubiBkZXIgRHJpdmVyIG1pdAorICAgICAgICBteVNRTC1VbnRlcnN0dWV0enVuZyBjb21waWxpZXJ0IHd1cmRlLiBJbiBkaWVzZW0gRmFsbCBpc3QgZGFzIE1ha3JvCisgICAgICAgIF9fTVlTUUxfXyBkZWZpbmllcnQuCisKKyAgICAgICAgRGllIEVmdW4gaXN0IHByaXZpbGVnaWVydCBhbHMgKCJteXNxbCIsICJkYl9jb2xkZWZzIikuCisKK0dFU0NISUNIVEUKKyAgICAgICAgRWluZ2VmdWVocnQgaW4gTERNdWQgMy4yLjkuCisgICAgICAgIExETXVkIDMuMi4xMSBtYWNodGUgZGllIEVmdW4gcHJpdmlsZWdpZXJ0LgorCitTSUVIRSBBVUNICisgICAgICAgIGRiX2FmZmVjdGVkX3Jvd3MoRSksIGRiX2NvbnZfc3RyaW5nKEUpLCBkYl9jbG9zZShFKSwgZGJfY29ubmVjdChFKSwKKyAgICAgICAgZGJfZXhlYyhFKSwgZGJfZXJyb3IoRSksIGRiX2ZldGNoKEUpLCBkYl9oYW5kbGVzKEUpLCBkYl9pbnNlcnRfaWQoRSksCisgICAgICAgIG15c3FsKEMpLCBwcml2aWxlZ2VfdmlvbGF0aW9uKE0pCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9kYl9jb25uZWN0IGIvZG9jL2VmdW4vZGJfY29ubmVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmUyMGM5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vZGJfY29ubmVjdApAQCAtMCwwICsxLDMyIEBACitPUFRJT05BTAorU1lOT1BTSVMKKyAgICAgICAgaW50IGRiX2Nvbm5lY3Qoc3RyaW5nIGRhdGFiYXNlKQorICAgICAgICBpbnQgZGJfY29ubmVjdChzdHJpbmcgZGF0YWJhc2UsIHN0cmluZyB1c2VyKQorICAgICAgICBpbnQgZGJfY29ubmVjdChzdHJpbmcgZGF0YWJhc2UsIHN0cmluZyB1c2VyLCBzdHJpbmcgcGFzc3dvcmQpCisKK0JFU0NIUkVJQlVORworICAgICAgICBTdGVsbGUgZWluZSBWZXJiaW5kdW5nIHp1ciBTUUwtRGF0ZW5iYW5rIDxkYXRhYmFzZT4gZGVzCisgICAgICAgIGxva2FsZW4gU1FMLVNlcnZlcnMgaGVyLiBEYXMgRXJnZWJuaXMgaXN0IGRpZSBIYW5kbGUtTnVtbWVyIGZ1ZXIgZGllc2UKKyAgICAgICAgVmVyYmluZHVuZyB1bmQgbXVzcyBmdWVyIGFsbGUgQW5mcmFnZW4genUgZGllc2VyIERhdGVuYmFuayB2ZXJ3ZW5kZXQKKyAgICAgICAgd2VyZGVuLgorCisgICAgICAgIEV4aXN0aWVydCBkaWUgRGF0ZW5iYW5rIG5pY2h0LCBvZGVyIGthbm4gZGVyIGxva2FsZSBTUUwtU2VydmVyIG5pY2h0CisgICAgICAgIGdlZnVuZGVuIHdlcmRlbiwgd2lyZCBlaW4gTGF1ZnplaXRmZWhsZXIgZXJ6ZXVndC4KKworICAgICAgICBXZW5uIGFuZ2VnZWJlbiwgd2lyZCBkaWUgVmVyYmluZHVuZyBmdWVyIDx1c2VyPiBtaXQgPHBhc3N3b3JkPgorICAgICAgICBlcnpldWd0LgorCisgICAgICAgIERpZSBGdW5rdGlvbiBpc3QgbnVyIHZlcmZ1ZWdiYXIgd2VubiBkZXIgRHJpdmVyIG1pdAorICAgICAgICBteVNRTC1VbnRlcnN0dWV0enVuZyBjb21waWxpZXJ0IHd1cmRlLiBJbiBkaWVzZW0gRmFsbCBpc3QgZGFzIE1ha3JvCisgICAgICAgIF9fTVlTUUxfXyBkZWZpbmllcnQuCisKKyAgICAgICAgRGllIEVmdW4gaXN0IHByaXZpbGVnaWVydCBhbHMgKCJteXNxbCIsICJkYl9jb25uZWN0IikuCisKK0dFU0NISUNIVEUKKyAgICAgICAgRWluZ2VmdWVocnQgaW4gTERNdWQgMy4yLjkuCisgICAgICAgIExETXVkIDMuMi4xMSBtYWNodGUgZGllIEVmdW4gcHJpdmlsZWdpZXJ0LgorCitTSUVIRSBBVUNICisgICAgICAgIGRiX2FmZmVjdGVkX3Jvd3MoRSksIGRiX2NvbnZfc3RyaW5nKEUpLCBkYl9jbG9zZShFKSwgZGJfY29sZGVmcyhFKSwKKyAgICAgICAgZGJfZXhlYyhFKSwgZGJfZXJyb3IoRSksIGRiX2ZldGNoKEUpLCBkYl9oYW5kbGVzKEUpLAorICAgICAgICBkYl9pbnNlcnRfaWQoRSksIG15c3FsKEMpLCBwcml2aWxlZ2VfdmlvbGF0aW9uKE0pCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9kYl9jb252X3N0cmluZyBiL2RvYy9lZnVuL2RiX2NvbnZfc3RyaW5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MzBkNmYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9kYl9jb252X3N0cmluZwpAQCAtMCwwICsxLDIwIEBACitPUFRJT05BTAorU1lOT1BTSVMKKyAgICAgICAgc3RyaW5nIGRiX2NvbnZfc3RyaW5nKHN0cmluZyBzdHIpCisKK0JFU0NIUkVJQlVORworICAgICAgICBXYW5kZWxlIGRlbiBTdHJpbmcgPHN0cj4gaW4gZWluZW4gU3RyaW5nIHVtLCBkZXIgdm9uIGRlciBEYXRlbmJhbmsKKyAgICAgICAga29ycmVrdCBpbnRlcnByZXRpZXJ0IHdlcmRlbiBrYW5uOyB6LkIuIHdlcmRlbiBhbGwgQXBvc3Ryb3BoZQorICAgICAgICBkdXJjaCBcJyBlcnNldHp0LgorCisgICAgICAgIERpZSBGdW5rdGlvbiBpc3QgbnVyIHZlcmZ1ZWdiYXIgd2VubiBkZXIgRHJpdmVyIG1pdAorICAgICAgICBteVNRTC1VbnRlcnN0dWV0enVuZyBjb21waWxpZXJ0IHd1cmRlLiBJbiBkaWVzZW0gRmFsbCBpc3QgZGFzIE1ha3JvCisgICAgICAgIF9fTVlTUUxfXyBkZWZpbmllcnQuCisKK0dFU0NISUNIVEUKKyAgICAgICAgRWluZ2VmdWVocnQgaW4gTERNdWQgMy4yLjkuCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgZGJfYWZmZWN0ZWRfcm93cyhFKSwgZGJfY2xvc2UoRSksIGRiX2NvbGRlZnMoRSksIGRiX2Nvbm5lY3QoRSksCisgICAgICAgIGRiX2V4ZWMoRSksIGRiX2Vycm9yKEUpLCBkYl9mZXRjaChFKSwgZGJfaGFuZGxlcyhFKSwgZGJfaW5zZXJ0X2lkKEUpLAorICAgICAgICBteXNxbChDKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vZGJfZXJyb3IgYi9kb2MvZWZ1bi9kYl9lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjZkMjkxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vZGJfZXJyb3IKQEAgLTAsMCArMSwyMyBAQAorT1BUSU9OQUwKK1NZTk9QU0lTCisgICAgICAgIHN0cmluZyBkYl9lcnJvcihpbnQgaGFuZGxlKQorCitCRVNDSFJFSUJVTkcKKyAgICAgICAgUmVzdWx0IGlzdCBlaW4gU3RyaW5nLCBkZXIgZGVuIEZlaGxlciBkZXIgbGV0enRlbgorICAgICAgICBEYXRlbmJhbmt0cmFuc2FrdGlvbiBiZXNjaHJlaWJ0LiAgV2FyIGRpZSBsZXR6dGUgVHJhbnNha3Rpb24KKyAgICAgICAgZXJmb2xncmVpY2gsIGlzdCBkYXMgRXJnZWJuaXMgMC4KKworICAgICAgICBEaWUgRnVua3Rpb24gaXN0IG51ciB2ZXJmdWVnYmFyIHdlbm4gZGVyIERyaXZlciBtaXQKKyAgICAgICAgbXlTUUwtVW50ZXJzdHVldHp1bmcgY29tcGlsaWVydCB3dXJkZS4gSW4gZGllc2VtIEZhbGwgaXN0IGRhcyBNYWtybworICAgICAgICBfX01ZU1FMX18gZGVmaW5pZXJ0LgorCisgICAgICAgIERpZSBFZnVuIGlzdCBwcml2aWxlZ2llcnQgYWxzICgibXlzcWwiLCAiZGJfZXJyb3IiKS4KKworR0VTQ0hJQ0hURQorICAgICAgICBFaW5nZWZ1ZWhydCBpbiBMRE11ZCAzLjIuOS4KKyAgICAgICAgTERNdWQgMy4yLjExIG1hY2h0ZSBkaWUgRWZ1biBwcml2aWxlZ2llcnQuCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgZGJfYWZmZWN0ZWRfcm93cyhFKSwgZGJfY29udl9zdHJpbmcoRSksIGRiX2Nsb3NlKEUpLCBkYl9jb2xkZWZzKEUpLAorICAgICAgICBkYl9jb25uZWN0KEUpLCBkYl9leGVjKEUpLCBkYl9mZXRjaChFKSwgZGJfaGFuZGxlcyhFKSwgZGJfaW5zZXJ0X2lkKEUpLAorICAgICAgICBteXNxbChDKSwgcHJpdmlsZWdlX3Zpb2xhdGlvbihNKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vZGJfZXhlYyBiL2RvYy9lZnVuL2RiX2V4ZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc0Yzk4MwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2RiX2V4ZWMKQEAgLTAsMCArMSwyMiBAQAorT1BUSU9OQUwKK1NZTk9QU0lTCisgICAgICAgIGludCBkYl9leGVjKGludCBoYW5kbGUsIHN0cmluZyBzdGF0ZW1lbnQpCisKK0JFU0NIUkVJQlVORworICAgICAgICBGdWVocmUgZGVuIFNRTC1CZWZlaGwgPHN0YXRlbWVudD4gZnVlciBkaWUgVmVyYmluZHVuZyA8aGFuZGxlPiBhdXMuCisgICAgICAgIFJlc3VsdGF0IGlzdCBkYXMgSGFuZGxlIGJlaSBFcmZvbGcsIG9kZXIgMCBiZWkgZWluZW0gRmVobGVyLgorCisgICAgICAgIERpZSBGdW5rdGlvbiBpc3QgbnVyIHZlcmZ1ZWdiYXIgd2VubiBkZXIgRHJpdmVyIG1pdAorICAgICAgICBteVNRTC1VbnRlcnN0dWV0enVuZyBjb21waWxpZXJ0IHd1cmRlLiBJbiBkaWVzZW0gRmFsbCBpc3QgZGFzIE1ha3JvCisgICAgICAgIF9fTVlTUUxfXyBkZWZpbmllcnQuCisKKyAgICAgICAgRGllIEVmdW4gaXN0IHByaXZpbGVnaWVydCBhbHMgKCJteXNxbCIsICJkYl9leGVjIikuCisKK0dFU0NISUNIVEUKKyAgICAgICAgRWluZ2VmdWVocnQgaW4gTERNdWQgMy4yLjkuCisgICAgICAgIExETXVkIDMuMi4xMSBtYWNodGUgZGllIEVmdW4gcHJpdmlsZWdpZXJ0LgorCitTSUVIRSBBVUNICisgICAgICAgIGRiX2FmZmVjdGVkX3Jvd3MoRSksIGRiX2NvbnZfc3RyaW5nKEUpLCBkYl9jbG9zZShFKSwgZGJfY29sZGVmcyhFKSwKKyAgICAgICAgZGJfY29ubmVjdChFKSwgZGJfZXJyb3IoRSksIGRiX2ZldGNoKEUpLCBkYl9oYW5kbGVzKEUpLAorICAgICAgICBkYl9pbnNlcnRfaWQoRSksIG15c3FsKEMpLCBwcml2aWxlZ2VfdmlvbGF0aW9uKE0pCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9kYl9mZXRjaCBiL2RvYy9lZnVuL2RiX2ZldGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNDNlOGEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9kYl9mZXRjaApAQCAtMCwwICsxLDIzIEBACitPUFRJT05BTAorU1lOT1BTSVMKKyAgICAgICAgbWl4ZWQgZGJfZmV0Y2goaW50IGhhbmRsZSkKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIEhvbGUgX2VpbmVfIFJlc3VsdGF0emVpbGUgZGVyIGxldHp0ZW4gU1FMLUFrdGlvbiBmdWVyIFZlcmJpbmR1bmcKKyAgICAgICAgPGhhbmRsZT4uIFNpbmQga2VpbmUgd2VpdGVyZW4gWmVpbGVuIHZlcmZ1ZWdiYXIsIHdpcmQgMAorICAgICAgICB6dXJ1ZWNrZ2VnZWJlbi4KKworICAgICAgICBEaWUgRnVua3Rpb24gaXN0IG51ciB2ZXJmdWVnYmFyIHdlbm4gZGVyIERyaXZlciBtaXQKKyAgICAgICAgbXlTUUwtVW50ZXJzdHVldHp1bmcgY29tcGlsaWVydCB3dXJkZS4gSW4gZGllc2VtIEZhbGwgaXN0IGRhcyBNYWtybworICAgICAgICBfX01ZU1FMX18gZGVmaW5pZXJ0LgorCisgICAgICAgIERpZSBFZnVuIGlzdCBwcml2aWxlZ2llcnQgYWxzICgibXlzcWwiLCAiZGJfZmV0Y2giKS4KKworR0VTQ0hJQ0hURQorICAgICAgICBFaW5nZWZ1ZWhydCBpbiBMRE11ZCAzLjIuOS4KKyAgICAgICAgTERNdWQgMy4yLjExIG1hY2h0ZSBkaWUgRWZ1biBwcml2aWxlZ2llcnQuCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgZGJfYWZmZWN0ZWRfcm93cyhFKSwgZGJfY29udl9zdHJpbmcoRSksIGRiX2Nsb3NlKEUpLCBkYl9jb2xkZWZzKEUpLAorICAgICAgICBkYl9jb25uZWN0KEUpLCBkYl9lcnJvcihFKSwgZGJfZXhlYyhFKSwgZGJfaGFuZGxlcyhFKSwgZGJfaW5zZXJ0X2lkKEUpLAorICAgICAgICBteXNxbChDKSwgcHJpdmlsZWdlX3Zpb2xhdGlvbihNKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vZGJfaGFuZGxlcyBiL2RvYy9lZnVuL2RiX2hhbmRsZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEzMDRiNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2RiX2hhbmRsZXMKQEAgLTAsMCArMSwyNCBAQAorT1BUSU9OQUwKK1NZTk9QU0lTCisgICAgICAgIGludCAqZGJfaGFuZGxlcygpCisKK0JFU0NIUkVJQlVORworICAgICAgICBSZXN1bHQgaXN0IGVpbiBBcnJheSBtaXQgYWxsZW4gYWt0aXZlbiBWZXJiaW5kdW5nc2hhbmRsZXMgenVtCisgICAgICAgIFNRTC1TZXJ2ZXIuIERhcyBBcnJheSBpc3QgbmFjaCBkZXIgWmVpdCBkZXIgbGV0enRlbiBBa3Rpb24gc29ydGllcnQ6CisgICAgICAgIGRhcyB6dWxldHp0IGdlbnV0enRlIEhhbmRsZSBrb21tdCBhbiBlcnN0ZXIgU3RlbGxlLiBTaW5kIGtlaW5lCisgICAgICAgIFZlcmJpbmR1bmdlbiBha3RpdiwgaXN0IGRhcyBBcnJheSBsZWVyLgorCisgICAgICAgIERpZSBGdW5rdGlvbiBpc3QgbnVyIHZlcmZ1ZWdiYXIgd2VubiBkZXIgRHJpdmVyIG1pdAorICAgICAgICBteVNRTC1VbnRlcnN0dWV0enVuZyBjb21waWxpZXJ0IHd1cmRlLiBJbiBkaWVzZW0gRmFsbCBpc3QgZGFzIE1ha3JvCisgICAgICAgIF9fTVlTUUxfXyBkZWZpbmllcnQuCisKKyAgICAgICAgRGllIEVmdW4gaXN0IHByaXZpbGVnaWVydCBhbHMgKCJteXNxbCIsICJkYl9oYW5kbGVzIikuCisKK0dFU0NISUNIVEUKKyAgICAgICAgRWluZ2VmdWVocnQgaW4gTERNdWQgMy4yLjkuCisgICAgICAgIExETXVkIDMuMi4xMSBtYWNodGUgZGllIEVmdW4gcHJpdmlsZWdpZXJ0LgorCitTSUVIRSBBVUNICisgICAgICAgIGRiX2FmZmVjdGVkX3Jvd3MoRSksIGRiX2NvbnZfc3RyaW5nKEUpLCBkYl9jbG9zZShFKSwgZGJfY29sZGVmcyhFKSwKKyAgICAgICAgZGJfY29ubmVjdChFKSwgZGJfZXJyb3IoRSksIGRiX2V4ZWMoRSksIGRiX2ZldGNoKEUpLCBkYl9pbnNlcnRfaWQoRSksCisgICAgICAgIG15c3FsKEMpLCBwcml2aWxlZ2VfdmlvbGF0aW9uKE0pCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9kYl9pbnNlcnRfaWQgYi9kb2MvZWZ1bi9kYl9pbnNlcnRfaWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVlMmExNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2RiX2luc2VydF9pZApAQCAtMCwwICsxLDIzIEBACitPUFRJT05BTAorU1lOT1BTSVMKKyAgICAgICAgaW50IGRiX2luc2VydF9pZCAoaW50IGhhbmRsZSkKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIE5hY2ggZGVtIEVpbmZ1ZWdlbiBlaW5lciBaZWlsZSBpbiBlaW5lIFRhYmVsbGUgbWl0IGVpbmVtCisgICAgICAgIEFVVE9fSU5DUkVNRU5ULUZlbGQsIGRpZXNlIEVmdW4ga2FubiBkYXp1IGJlbnV0enQgd2VyZGVuIGRlbiBuZXVlbgorICAgICAgICBXZXJ0IGRpZXNlcyBGZWxkZXMgenVydWVja3p1Z2ViZW4uCisKKyAgICAgICAgRGllIEZ1bmt0aW9uIGlzdCBudXIgdmVyZnVlZ2JhciB3ZW5uIGRlciBEcml2ZXIgbWl0CisgICAgICAgIG15U1FMLVVudGVyc3R1ZXR6dW5nIGNvbXBpbGllcnQgd3VyZGUuIEluIGRpZXNlbSBGYWxsIGlzdCBkYXMgTWFrcm8KKyAgICAgICAgX19NWVNRTF9fIGRlZmluaWVydC4KKworICAgICAgICBEaWUgRWZ1biBpc3QgcHJpdmlsZWdpZXJ0IGFscyAoIm15c3FsIiwgImRiX2luc2VydF9pZCIpLgorCitHRVNDSElDSFRFCisgICAgICAgIEVpbmdlZnVlaHJ0IGluIExETXVkIDMuMi45LgorICAgICAgICBMRE11ZCAzLjIuMTEgbWFjaHRlIGRpZSBFZnVuIHByaXZpbGVnaWVydC4KKworU0lFSEUgQVVDSAorICAgICAgICBkYl9hZmZlY3RlZF9yb3dzKEUpLCBkYl9jb252X3N0cmluZyhFKSwgZGJfY2xvc2UoRSksIGRiX2NvbGRlZnMoRSksCisgICAgICAgIGRiX2Nvbm5lY3QoRSksIGRiX2Vycm9yKEUpLCBkYl9leGVjKEUpLCBkYl9mZXRjaChFKSwgZGJfaGFuZGxlcyhFKSwKKyAgICAgICAgbXlzcWwoQyksIHByaXZpbGVnZV92aW9sYXRpb24oTSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL2RlYnVnX21lc3NhZ2UgYi9kb2MvZWZ1bi9kZWJ1Z19tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZTc1ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9kZWJ1Z19tZXNzYWdlCkBAIC0wLDAgKzEsMzYgQEAKK1NZTk9QU0lTCisgICAgICAgICNpbmNsdWRlIDxzeXMvZGVidWdfbWVzc2FnZS5oPgorCisgICAgICAgIHZvaWQgZGVidWdfbWVzc2FnZShzdHJpbmcgdGV4dCk7CisgICAgICAgIHZvaWQgZGVidWdfbWVzc2FnZShzdHJpbmcgdGV4dCwgaW50IGZsYWdzKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIEdpYnQgPHRleHQ+IGFuIGRpZSBBdXNnYWVuZ2Ugc3Rkb3V0IHVuZCBzdGRlcnIgc293aWUgYW4gZGllIERhdGVpCisgICAgICAgIDxob3N0Pi5kZWJ1Zy5sb2csIG9kZXIgYW4gZWluZSBiZWxpZWJpZ2UgS29tYmluYXRpb24gZGllc2VyIGRyZWkuCisKKyAgICAgICAgRGFzIEFyZ3VtZW50IDxmbGFnPiBiZXplaWNobmV0IGR1cmNoIGVpbmUgS29tYmluYXRpb24gdm9uIEJpdGZsYWdzIGRhcworICAgICAgICBaaWVsIHVuZCBkaWUgQXJ0LCBpbiBkZXIgZGFzIFJlc3VsdGF0IGdlc2NocmllYmVuIHdpcmQuCisKKyAgICAgICAgRGllIFppZWwtRmxhZ3Mgc2luZDogRE1TR19TVERPVVQsIERNU0dfU1RERVJSIHVuZCBETVNfTE9HRklMRS4gV2lyZAorICAgICAgICB6dXNhZXR6bGljaCBkYXMgRmxhZyBETVNHX1NUQU1QIGdlc2V0enQsIGVyaGFlbHQgamVkZXIgRWludHJhZyBlaW5lbgorICAgICAgICBaZWl0c3RlbXBlbCAoVGltZXN0YW1wKSBpbSBGb3JtYXQgJ1lZWVkuTU0uREQgSEg6TU06U1MgJy4KKworICAgICAgICBXZW5uIDxmbGFncz4gMCBpc3QsIHdlZ2dlbGFzc2VuIHdpcmQgb2RlciBrZWluIFppZWwtRmxhZyBlbnRoYWVsdCwKKyAgICAgICAgd2lyZCA8dGV4dD4gc3RhbmRhcmRtYWVzc2lnIGFuIHN0ZG91dCB1bmQgaW5zIExvZ2ZpbGUgYXVzZ2VnZWJlbi4KKworQkVJU1BJRUwKKyAgICAgICAgZGVidWdfbWVzc2FnZSgiRGllc2VyIFRleHQgZ2VodCBhbiBzdGRvdXQgdW5kIGlucyBMb2dmaWxlLlxuIik7CisgICAgICAgIGRlYnVnX21lc3NhZ2UoIkRpZXMgZ2VodCBhbiBzdGRlcnIuXG4iLCBETVNHX1NUREVSUik7CisgICAgICAgIGRlYnVnX21lc3NhZ2UoIkRpZXMgZ2VodCBhbiBzdGRvdXQgdW5kIHN0ZGVyci5cbiIsIERNU0dfU1RET1VUCisgICAgICAgICAgICB8IERNU0dfU1RERVJSKTsKKyAgICAgICAgZGVidWdfbWVzc2FnZSgiRGllcyBnZWh0IGFuIHN0ZG91dCB1bmQgaW5zIExvZ2ZpbGUsIG1pdCBUaW1lc3RhbXAuXG4iLAorICAgICAgICAgICAgRE1TR19TVEFNUCk7CisgICAgICAgIGRlYnVnX21lc3NhZ2UoIkRpZSBnZWh0IGFuIHN0ZG91dCwgbWl0IHZvcmFuZ2VzdGVsbHRlbSBUaW1lc3RhbXAuXG4iLAorICAgICAgICAgICAgRE1TR19TVERPVVQgfCBETVNHX1NUQU1QKTsKKworQUVOREVSVU5HRU4KKyAgICAgICAgRWluZ2VmdWVocnQgaW4gMy4yLjFAMzQuCisgICAgICAgIExETXVkIDMuMi45IGZ1ZWhydGUgZGFzIEFyZ3VtZW50IDxmbGFncz4gZWluLgorCitTSUVIRSBBVUNICisgICAgICAgIGxhc3RfaW5zdHJ1Y3Rpb25zKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9kZWVwX2NvcHkgYi9kb2MvZWZ1bi9kZWVwX2NvcHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNlZjlhOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2RlZXBfY29weQpAQCAtMCwwICsxLDI3IEBACitTWU5PUFNJUworICAgICAgICBtaXhlZCBkZWVwX2NvcHkobWl4ZWQgYXJnKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIEVyemV1Z3QgZWluZSBlY2h0ZSBLb3BpZSB2b24gPGFyZz4gdW5kIGxpZWZlcnQgZGllc2UgenVydWVjay4gRnVlcgorICAgICAgICBBcnJheXMgdW5kIE1hcHBpbmdzIGJlZGV1dGV0IGRpZXMsIGRhc3MgZWluIG5ldWVzIEFycmF5IG9kZXIgTWFwcGluZworICAgICAgICBlcnpldWd0IHdpcmQsIGRhcyBleGFrdGUgS29waWVuIGRlciBFaW50cmFlZ2UgZGVzIE9yaWdpbmFscyBlbnRoYWVsdC4KKyAgICAgICAgRWluZ2ViZXR0ZXRlIEFycmF5cyB1bmQgTWFwcGluZ3Mgd2VyZGVuIGViZW5zbyBlY2h0IGtvcGllcnQuCisKKyAgICAgICAgRnVlciBhbmRlcmUgVHlwZW4gYWxzIE1hcHBpbmdzIHVuZCBBcnJheXMgYmV3aXJrdCBkaWVzZSBGdW5rdGlvbgorICAgICAgICBuaWNodHMuCisKKyAgICAgICAgV2VubiBpbSBEcml2ZXIgRFlOQU1JQ19DT1NUIGRlZmluaWVydCBpc3QsIHphZWhsdCBqZWRlcyBlaW5nZWJldHRldGUKKyAgICAgICAgTWFwcGluZyBvZGVyIEFycmF5IHp1IGRlbiBFdmFsdWF0aW9uc2tvc3RlbiBzb3dvaGwgaW4gZGVyIEdyb2Vzc2UgYWxzCisgICAgICAgIGF1Y2ggaW4gZGVyIEVpbmJldHR1bmdzdGllZmUuCisKK0JFSVNQSUVMCisgICAgICAgIG1peGVkICphLCAqYjsKKyAgICAgICAgYSA9ICh7IDEsICh7IDIxLCAyMiB9KSB9KTsKKyAgICAgICAgYiA9IGRlZXBfY29weShhKTsKKyAgICAgICAgYVswXSA9IC0xOyBhWzFdWzBdID0gLTIxOworICAgICAgICAgLS0+IGEgaXN0IGpldHp0ICAgKHsgLTEsICh7IC0yMSwgMjIgfSkgfSkKKyAgICAgICAgICAgICBiIGJsZWlidCAgICAgICh7ICAxLCAoeyAgMjEsIDIyIH0pIH0pCisKK0FFTkRFUlVOR0VOCisgICAgICAgIEVpbmdlZnVlaHJ0IGluIExETXVkIDMuMi42LgorICAgICAgICBMRE11ZCAzLjIuOSBmdWVndGUgZGllIGR5bmFtaXNjaGVuIEtvc3RlbiB6dXIgRWZ1biBoaW56dS4KZGlmZiAtLWdpdCBhL2RvYy9lZnVuL2RlZXBfaW52ZW50b3J5IGIvZG9jL2VmdW4vZGVlcF9pbnZlbnRvcnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFmNGM2NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2RlZXBfaW52ZW50b3J5CkBAIC0wLDAgKzEsMzYgQEAKK1NZTk9QU0lTCisgICAgICAgICpvYmplY3QgZGVlcF9pbnZlbnRvcnkoKTsKKyAgICAgICAgKm9iamVjdCBkZWVwX2ludmVudG9yeShvYmplY3Qgb2IpOworICAgICAgICBvYmplY3QgKmRlZXBfaW52ZW50b3J5KG9iamVjdCBvYiwgaW50IGRlcHRoKQorCitCRVNDSFJFSUJVTkcKKyAgICAgICAgR2lidCBlaW4gQXJyYXkgZGVyIE9iamVrdGUgenVydWVjaywgZGllIGluIDxvYmo+IGVudGhhbHRlbiBzaW5kLgorICAgICAgICBXZW5uIDxvYmo+IG5pY2h0IGFuZ2VnZWJlbiB3aXJkLCB3aXJkIHN0YW5kYXJkbWFlc3NpZyB0aGlzX29iamVjdCgpCisgICAgICAgIHZlcndlbmRldC4gRWJlbnNvIHdlcmRlbiBhbGxlIE9iamVrdGUgYW5nZWdlYmVuLCBkaWUgc2ljaCBpbSBJbnZlbnRvcnkKKyAgICAgICAgZGVyIGluIDxvYmo+IGVudGhhbHRlbmVuIE9iamVrdGUgYmVmaW5kZW4uIERpZSBTdWNoZSB2ZXJsYWV1ZnQKKyAgICAgICAgcmVrdXJzaXYgYWJzdGVpZ2VuZC4KKworICAgICAgICBJc3QgPGRlcHRoPiBhbmdlZ2ViZW4gdW5kIHVuZ2xlaWNoIDAsIGlzdCBkYXMgUmVzdWx0YXQgd2llIGZvbGd0CisgICAgICAgIGdlZmlsdGVydDoKKyAgICAgICAgICA8ZGVwdGg+ID4gMDogTnVyIGRpZSBPYmpla3RlIGluIGRlbiBlcnN0ZW4gPGRlcHRoPiBFYmVuZW4KKyAgICAgICAgICAgICAgICAgICAgICAgd2VyZGVuIHp1cnVlY2tnZWdlYmVuLgorICAgICAgICAgIDxkZXB0aD4gPCAwOiBOdXIgZGllIE9iamVrdGUgaW4gZGVyIC08ZGVwdGg+dGVuIEViZW5lIHdlcmRlbgorICAgICAgICAgICAgICAgICAgICAgICB6dXJ1ZWNrZ2VnZWJlbi4KKworQkVJU1BJRUwKKyAgICAgICAgb2IKKyAgICAgICAgKy0gb2IxCisgICAgICAgICstIG9iMgorICAgICAgICB8ICAgKy0gb2IyMQorICAgICAgICB8ICBvYjMKKyAgICAgICAgfCAgICstIG9iMzEKKyAgICAgICAgKy0gb2I0CisKKworICAgICAgICBkZWVwX2ludmVudG9yeShvYikgPT4gKHtvYjEsIG9iMiwgb2IzLCBvYjQsIG9iMjEsIG9iMzF9KQorICAgICAgICBkZWVwX2ludmVudG9yeShvYiwgMSkgPT4gKHtvYjEsIG9iMiwgb2IzLCBvYjR9KQorICAgICAgICBkZWVwX2ludmVudG9yeShvYiwgMikgPT4gKHtvYjEsIG9iMiwgb2IzLCBvYjQsIG9iMjEsIG9iMzF9KQorICAgICAgICBkZWVwX2ludmVudG9yeShvYiwgLTIpID0+ICh7b2IyMSwgb2IzMX0pCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgZmlyc3RfaW52ZW50b3J5KEUpLCBuZXh0X2ludmVudG9yeShFKSwgYWxsX2ludmVudG9yeShFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vZGVzdHJ1Y3QgYi9kb2MvZWZ1bi9kZXN0cnVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjRkZTU2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vZGVzdHJ1Y3QKQEAgLTAsMCArMSw0MyBAQAorU1lOT1BTSVMKKyAgICAgICAgdm9pZCBkZXN0cnVjdChvYmplY3Qgb2IpCisKK0JFU0NIUkVJQlVORworICAgICAgICBaZXJzdG9lcnQgdW5kIGVudGZlcm50IGRhcyBPYmpla3Qgb2IuIElzdCBvYiA9PSAwIChvYiB3dXJkZSBzY2hvbgorICAgICAgICB6ZXJzdG9lcnQpLCBzbyBwYXNzaWVydCBuaWNodHMuIE5hY2ggZGVtIEF1ZnJ1ZiB2b24gZGVzdHJ1Y3QoKQorICAgICAgICBleGlzdGllcmVuIGtlaW5lIGdsb2JhbGVuIFZhcmlhYmxlbiBtZWhyLCBzb25kZXJuIG51ciBub2NoIGxva2FsZQorICAgICAgICBWYXJpYWJsZW4gdW5kIEFyZ3VtZW50ZS4KKworICAgICAgICBXZW5uIHNpY2ggZWluIE9iamVrdCBzZWxic3QgemVyc3RvZXJ0LCB3aXJkIGRpZSBBdXNmdWVocnVuZyBuaWNodAorICAgICAgICBzb2ZvcnQgYWJnZWJyb2NoZW4uIFdpcmQgZGllIEVmdW4gdGhpc19vYmplY3QoKSBhdWZnZXJ1ZmVuLCBzbworICAgICAgICBsaWVmZXJ0IGRpZXNlIDAgenVydWVjay4KKworICAgICAgICBEaWUgbWVpc3RlbiBNdWRsaWJzIG1vZWdlbiBlcyBuaWNodCwgd2VubiBhbmRlcmUgT2JqZWt0ZSBtaXR0ZWxzCisgICAgICAgIGRlc3RydWN0KCkgaW5zIERhdGVuLU5pcndhbmEgZ2VzY2hpY2t0IHdlcmRlbi4gU3RhdHRkZXNzZW4gZXJ3YXJ0ZW4KKyAgICAgICAgc2llIGRlbiBBdWZydWYgZWluZXIgc3BlemllbGxlbiBMZnVuIGltIHp1IHplcnN0b2VyZW5kZW4gT2JqZWt0LAorICAgICAgICB3ZWxjaGUgbm9ybWFsZXJ3ZWlzZSByZW1vdmUoKSBoZWlzc3QuIERhbWl0IGthbm4gZGFzIHp1CisgICAgICAgIHplcnN0b2VyZW5kZSBPYmpla3Qgbm9jaCBhYnNjaGxpZXNzZW5kZSBBcmJlaXRlbiBpbSBadXNhbW1lbmhhbmcKKyAgICAgICAgbWl0IHNlaW5lbSBBYmxlYmVuIGVybGVkaWdlbiwgd2llIHouIEIuIGRpZSBBbnBhc3N1bmcgZGVzIEdld2ljaHRlcworICAgICAgICBzZWluZXIgVW1nZWJ1bmcgZXRjLiBwcC4KKworICAgICAgICBEZXIgSW50ZXJwcmV0ZXIgemVyc3RvZXJ0IGRhcyBPYmpla3QgbmljaHQgc29mb3J0LCBzb25kZXJuIGVyCisgICAgICAgIG1hcmtpZXJ0IGVzIGFscyB6ZXJzdG9lcnQsIGVudGZlcm50IGVzIHZvbiBkZXIgTGlzdGUsIGRpZSBhbGxlCisgICAgICAgIE9iamVrdGUgZW50aGFlbHQsIHVuZCBmdWVndCBlcyB6dSBkZXIgTGlzdGUgenUgemVyc3RvZXJlbmRlbgorICAgICAgICBPYmpla3RlIGhpbnp1LiBEaWUgdGF0c2FlY2hsaWNoZSBaZXJzdG9lcnVuZyBnZXNjaGllaHQgZXJzdCBkYW5uLAorICAgICAgICB3ZW5uIGtlaW5lIFJlZmVyZW56ZW4gbWVociBhdWYgZGFzIE9iamVrdCBleGlzdGllcmVuLiBEZXNoYWxiIGlzdAorICAgICAgICBlcyBtb2VnbGljaCwgZGFzcyBlaW4gT2JqZWt0IG5vY2ggbGFuZ2UgbmFjaCBzZWluZXIgWmVyc3RvZXJ1bmcKKyAgICAgICAgU3BlaWNoZXIgYmVsZWd0LCBvYndvaGwgZXMgdm9uIGF1c3NlcmhhbGIgbmljaHQgbWVociBnZWZ1bmRlbiB3aXJkLgorCitCRUlTUElFTAorICAgICAgICBvYi0+cmVtb3ZlKCk7CisgICAgICAgIGlmKG9iKSAgICAgICAgLy8gZXMgZXhpc3RpZXJ0IG5vY2gsIHZpZWxsZWljaHQgaXN0IGRpZSBMZnVuCisgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlKCkgbmljaHQgZGVmaW5pZXJ0PworICAgICAgICAgICAgZGVzdHJ1Y3Qob2IpOworCisgICAgICAgIERpZXMgaXN0IGRpZSBTdGFuZGFyZC1NZXRob2RlLCBlaW4gT2JqZWt0IHp1IHplcnN0b2VyZW4sIGlobSBhYmVyCisgICAgICAgIHZvcmhlciBub2NoIGRpZSBDaGFuY2UgenUgZ2ViZW4sIGVzIHNlbGJlciB6dSB0dW4uCisKK0FFTkRFUlVOR0VOCisgICAgICAgIExETXVkIDMuMi43OiAwICh6ZXJzdG9lcnRlIE9iamVrdCkgYWxzIEFyZ3VtZW50IGFubmVobWVuLgorCitTSUVIRSBBVUNICisgICAgICAgIGNsb25lX29iamVjdChFKSwgcmVtb3ZlKEEpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9kaXNhYmxlX2NvbW1hbmRzIGIvZG9jL2VmdW4vZGlzYWJsZV9jb21tYW5kcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjY3NTdlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vZGlzYWJsZV9jb21tYW5kcwpAQCAtMCwwICsxLDEwIEBACitTWU5PUFNJUworICAgICAgICB2b2lkIGRpc2FibGVfY29tbWFuZHMoKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIFZlcmJpZXRldCBkZW0gT2JqZWt0LCBLb21tYW5kaSB6dSB2ZXJ3ZW5kZW4sIGRpZSBub3JtYWxlcndlaXNlIFVzZXJuCisgICAgICAgIHp1Z2FlbmdsaWNoIHNpbmQuIERpZXNlIEZ1bmt0aW9uIGlzdCBkYXMgR2VnZW50ZWlsIHZvbgorICAgICAgICBlbmFibGVfY29tbWFuZHMoKS4KKworU0lFSEUgQVVDSAorICAgICAgICBlbmFibGVfY29tbWFuZHMoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL2RyaXZlcl9pbmZvIGIvZG9jL2VmdW4vZHJpdmVyX2luZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFlYWE2NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2RyaXZlcl9pbmZvCkBAIC0wLDAgKzEsNjg1IEBACitTWU5PUFNJUworICAgICAgICAjaW5jbHVkZSA8ZHJpdmVyX2luZm8uaD4KKworICAgICAgICBtaXhlZCBkcml2ZXJfaW5mbyhpbnQgd2hhdCkKKworREVTQ1JJUFRJT04KKyAgICAgICAgUmV0dXJucyBzb21lIGludGVybmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkcml2ZXIuCisgICAgICAgIFRoZSBhcmd1bWVudCA8d2hhdD4gZGV0ZXJtaW5lcyB3aGljaCBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZC4KKworICAgICAgICBJdCBjYW4gYmUgZWl0aGVyIGEgY29uZmlndXJhdGlvbiBvcHRpb24gYXMgZ2l2ZW4gdG8KKyAgICAgICAgY29uZmlndXJlX2RyaXZlcigpIG9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CisKKworCisgICAgICAgIERyaXZlciBFbnZpcm9ubWVudDoKKworICAgICAgICA8d2hhdD4gPT0gRElfQk9PVF9USU1FOgorICAgICAgICAgIFRoZSB0aW1lKCkgd2hlbiB0aGUgZHJpdmVyIHdhcyBzdGFydGVkLgorCisKKworICAgICAgICBMUEMgUnVudGltZSBzdGF0dXM6CisKKyAgICAgICAgPHdoYXQ+ID09IERJX0NVUlJFTlRfUlVOVElNRV9MSU1JVFM6CisgICAgICAgICAgUmV0dXJuIGFuIGFycmF5IHdpdGggdGhlIGN1cnJlbnQgcnVudGltZSBsaW1pdHMuCisgICAgICAgICAgVGhlIGVudHJpZXMgaW4gdGhlIHJldHVybmVkIGFycmF5IGFyZToKKworICAgICAgICAgICAgaW50W0xJTUlUX0VWQUxdOiAgICAgICAgIHRoZSBtYXggbnVtYmVyIG9mIGV2YWwgY29zdHMKKyAgICAgICAgICAgIGludFtMSU1JVF9BUlJBWV06ICAgICAgICB0aGUgbWF4IG51bWJlciBvZiBhcnJheSBlbnRyaWVzCisgICAgICAgICAgICBpbnRbTElNSVRfTUFQUElOR19TSVpFXTogdGhlIG1heCBudW1iZXIgb2YgbWFwcGluZyB2YWx1ZXMKKyAgICAgICAgICAgIGludFtMSU1JVF9NQVBQSU5HX0tFWVNdOiB0aGUgbWF4IG51bWJlciBvZiBtYXBwaW5nIGVudHJpZXMKKyAgICAgICAgICAgICAgIChMSU1JVF9NQVBQSU5HIGlzIGFuIGFsaWFzIGZvciBMSU1JVF9NQVBQSU5HX0tFWVMpCisgICAgICAgICAgICBpbnRbTElNSVRfQllURV06ICAgICAgICAgdGhlIG1heCBudW1iZXIgb2YgYnl0ZXMgaGFuZGxlZCB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lIHJlYWRfYnl0ZXMoKS93cml0ZV9ieXRlcygpIGNhbGwuCisgICAgICAgICAgICBpbnRbTElNSVRfRklMRV06ICAgICAgICAgdGhlIG1heCBudW1iZXIgb2YgYnl0ZXMgaGFuZGxlZCB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lIHJlYWRfZmlsZSgpL3dyaXRlX2ZpbGUoKSBjYWxsLgorICAgICAgICAgICAgaW50W0xJTUlUX0NBTExPVVRTXTogICAgIHRoZSBudW1iZXIgb2YgY2FsbG91dHMgYXQgb25lIHRpbWUuCisgICAgICAgICAgICBpbnRbTElNSVRfQ09TVF06ICAgICAgICAgaG93IHRvIGFjY291bnQgdGhlIGN1cnJlbnQgY29zdC4KKyAgICAgICAgICAgIGludFtMSU1JVF9NRU1ST1ldOiAgICAgICB0aGUgbWF4LiBudW1iZXIgb2YgYnl0ZXMgd2hpY2ggY2FuIGJlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hZGRpdGlvbmFsbHlfIGFsbG9jYXRlZC91c2VkIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9wZXIgdG9wLWxldmVsIGV4ZWN1dGlvbiB0aHJlYWRfCisKKyAgICAgICAgICBGb3IgYWxsIGxpbWl0cyBleGNlcHQgTElNSVRfQ09TVCBhIGxpbWl0IG9mICcwJyBha2EgTElNSVRfVU5MSU1JVEVECisgICAgICAgICAgbWVhbnMgJ25vIGxpbWl0Jy4KKworICAgICAgICAgIFRoZSB2YWx1ZSBmb3IgTElNSVRfQ09TVCBoYXMgdGhlc2UgbWVhbmluZ3M6CisKKyAgICAgICAgICAgIHZhbHVlID4gMDogdGhlIGV4ZWN1dGlvbiB3aWxsIGNvc3QgbWluaW11bSg8dmFsdWU+LCBhY3R1YWwgY29zdCkgLgorICAgICAgICAgICAgdmFsdWUgPSAwOiBpZiB0aGUgY3VycmVudCBMSU1JVF9FVkFMIGlzIGxhcmdlciB0aGFuIHRoZSBjYWxsaW5nCisgICAgICAgICAgICAgICAgICAgICAgIExJTUlUX0VWQUwsIHRoZSBldmFsdWF0aW9uIHdpbGwgY29zdCBvbmx5IDEwOyBvdGhlcndpc2UKKyAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZ1bGwgY29zdCB3aWxsIGJlIGFjY291bnRlZC4KKyAgICAgICAgICAgIHZhbHVlIDwgMDogKC12YWx1ZSklIG9mIHRoZSBjdXJyZW50IGV2YWx1YXRpb24gY29zdCB3aWxsIGJlCisgICAgICAgICAgICAgICAgICAgICAgIGFjY291bnRlZDsgLTEwMCBvYnZpb3VzbHkgbWVhbnMgJ2Z1bGwgY29zdCcuCisKKyAgICAgICAgPHdoYXQ+ID09IERJX0VWQUxfTlVNQkVSOgorICAgICAgICAgIFJldHVybiB0aGUgY3VycmVudCBldmFsdWF0aW9uIG51bWJlci4KKyAgICAgICAgICBUaGUgbnVtYmVyIGlzIGluY3JlbWVudGVkIGZvciBlYWNoIHRvcC1sZXZlbCBjYWxsLiBUb3AtbGV2ZWwKKyAgICAgICAgICBjYWxscyBhcmUgaW5pdGlhdGVkIGJ5IHRoZSBkcml2ZXIsIHVzdWFsbHkgaW4gcmVhY3Rpb24gdG8gYW4KKyAgICAgICAgICBleHRlcm5hbCBldmVudDoKKyAgICAgICAgICAgICAgLSBjb21tYW5kcyAoYWRkZWQgYnkgYWRkX2FjdGlvbikKKyAgICAgICAgICAgICAgLSBoZWFydF9iZWF0LCByZXNldCwgY2xlYW5fdXAKKyAgICAgICAgICAgICAgLSBjYWxscyBmcm9tIGNhbGxfb3V0IG9yIGlucHV0X3RvCisgICAgICAgICAgICAgIC0gbWFzdGVyIGFwcGxpZXMgdHJpZ2dlcmVkIGJ5IGV4dGVybmFsIGV2ZW50cworICAgICAgICAgICAgICAtIGNhbGxzIG9mIGRyaXZlciBob29rcyBpbiByZWFjdGlvbiB0byBleHRlcm5hbCBldmVudHMKKyAgICAgICAgICAgICAgLSBzZW5kX2VycSBjYWxsYmFja3MKKyAgICAgICAgICAgICAgLSBsb2dvbiBpbiBpbnRlcmFjdGl2ZXMKKworICAgICAgICAgIFRoZSBudW1iZXIgY2FuIGJlIHVzZWQgdG8gZGV0ZWN0IGNhc2VzIHdoZXJlIHRoZSBzYW1lIGNvZGUgaXMKKyAgICAgICAgICBleGVjdXRlZCB0d2ljZSBpbiB0aGUgc2FtZSB0b3AgbGV2ZWwgZXZhbHVhdGlvbiAoc2F5LCBoZWFydF9iZWF0KSwKKyAgICAgICAgICBhbmQgYWxzbyBmb3IgdGltZSBzdGFtcHMgZm9yIG9yZGVyaW5nIHNvbWUgZXZlbnRzLgorCisgICAgICAgICAgUGxlYXNlIG5vdGUgdGhhdCB0aGUgY291bnRlciBtYXkgb3ZlcmZsb3csIGVzcGVjaWFsbHkgb24gMzIgYml0CisgICAgICAgICAgc3lzdGVtcy4gQXMgYSByZXN1bHQsIGl0IGNhbiBhbHNvIGJlIG5lZ2F0aXZlLgorCisKKworICAgICAgICBOZXR3b3JrIGNvbmZpZ3VyYXRpb246CisKKyAgICAgICAgPHdoYXQ+ID09IERJX01VRF9QT1JUUzoKKyAgICAgICAgICBSZXR1cm5zIGFuIGFycmF5IHdpdGggYWxsIG9wZW4gcG9ydHMsIHdoaWNoIHRoZSBkcml2ZXIKKyAgICAgICAgICBsaXN0ZW5zIGZvciBwbGF5ZXIgY29ubmVjdGlvbnMgb24uCisKKyAgICAgICAgPHdoYXQ+ID09IERJX1VEUF9QT1JUOgorICAgICAgICAgIFJldHVybnMgdGhlIHBvcnQgbnVtYmVyIG9mIHRoZSBVRFAgc29ja2V0LgorCisKKworICAgICAgICBNZW1vcnkgbWFuYWdlbWVudDoKKworICAgICAgICA8d2hhdD4gPT0gRElfTUVNT1JZX1JFU0VSVkVfVVNFUjoKKyAgICAgICAgICBDdXJyZW50IHNpemUgb2YgdGhlIHVzZXIgbWVtb3J5IHJlc2VydmUuCisgICAgICAgICAgVGhlIHVzZXIgbWVtb3J5IHJlc2VydmUgaXMgYWxsb2NhdGVkIGF0IHN0YXJ0dXAgYW5kIGlzIHVzZWQKKyAgICAgICAgICB3aGVuIHRoZSBkcml2ZXIgcnVucyBvdXQgb2YgbWVtb3J5LgorCisgICAgICAgIDx3aGF0PiA9PSBESV9NRU1PUllfUkVTRVJWRV9NQVNURVI6CisgICAgICAgICAgQ3VycmVudCBzaXplIG9mIHRoZSBtYXN0ZXIgbWVtb3J5IHJlc2VydmUuCisgICAgICAgICAgVGhlIG1hc3RlciBtZW1vcnkgcmVzZXJ2ZSBpcyBhbGxvY2F0ZWQgYXQgc3RhcnR1cCBhbmQgaXMgdXNlZAorICAgICAgICAgIHdoZW4gdGhlIGRyaXZlciBydW5zIG91dCBvZiBtZW1vcnkgd2hpbGUgZXhlY3V0aW5nIG1hc3RlcgorICAgICAgICAgIGNvZGUuCisKKyAgICAgICAgPHdoYXQ+ID09IERJX01FTU9SWV9SRVNFUlZFX1NZU1RFTToKKyAgICAgICAgICBDdXJyZW50IHNpemUgb2YgdGhlIHN5c3RlbSBtZW1vcnkgcmVzZXJ2ZS4KKyAgICAgICAgICBUaGUgc3lzdGVtIG1lbW9yeSByZXNlcnZlIGlzIGFsbG9jYXRlZCBhdCBzdGFydHVwIGFuZCBpcyB1c2VkCisgICAgICAgICAgd2hlbiB0aGUgZHJpdmVyIHJ1bnMgb3V0IG9mIG1lbW9yeSB3aGlsZSBleGVjdXRpbmcgaW50ZXJuYWwKKyAgICAgICAgICBvcGVyYXRpb25zLgorCisKKworICAgICAgICBUcmFjZXM6CisKKyAgICAgICAgPHdoYXQ+ID09IERJX1RSQUNFX0NVUlJFTlQ6CisgICAgICAgICAgUmV0dXJucyB0aGUgY3VycmVudCBzdGFjayB0cmFjZSBpbiBhcnJheSBmb3JtLgorCisgICAgICAgICAgSWYgdGhlIGFycmF5IGhhcyBtb3JlIHRoYW4gb25lIGVudHJpZXMsIHRoZSBmaXJzdCBlbnRyeSBpcyAwIG9yCisgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCB3aXRoIHRoZSBoZWFydGJlYXQgd2hpY2ggc3RhcnRlZCB0aGUKKyAgICAgICAgICBjdXJyZW50IHRocmVhZDsgYWxsIGZvbGxvd2luZyBlbnRyaWVzIGRlc2NyaWJlIHRoZSBjYWxsIHN0YWNrCisgICAgICAgICAgc3RhcnRpbmcgd2l0aCB0aGUgdG9wbW9zdCBmdW5jdGlvbiBjYWxsZWQuCisKKyAgICAgICAgICBBbGwgY2FsbCBlbnRyaWVzIGFyZSBhcnJheXMgdGhlbXNlbHZlcyB3aXRoIHRoZSBmb2xsb3dpbmcgZWxlbWVudHM6CisKKyAgICAgICAgICAgICAgIGludFtUUkFDRV9UWVBFXTogVGhlIHR5cGUgb2YgdGhlIGNhbGwgZnJhbWU6CisgICAgICAgICAgICAgICAgICAgVFJBQ0VfVFlQRV9TWU1CT0wgKDApOiBhIGZ1bmN0aW9uIHN5bWJvbCAoc2hvdWxkbid0IGhhcHBlbikuCisgICAgICAgICAgICAgICAgICAgVFJBQ0VfVFlQRV9TRUZVTiAgKDEpOiBhIHNpbXVsLWVmdW4uCisgICAgICAgICAgICAgICAgICAgVFJBQ0VfVFlQRV9FRlVOICAgKDIpOiBhbiBlZnVuIGNsb3N1cmUuCisgICAgICAgICAgICAgICAgICAgVFJBQ0VfVFlQRV9MQU1CREEgKDMpOiBhIGxhbWJkYSBjbG9zdXJlLgorICAgICAgICAgICAgICAgICAgIFRSQUNFX1RZUEVfTEZVTiAgICg0KTogYSBub3JtYWwgbGZ1bi4KKworICAgICAgICAgICAgICAgbWl4ZWRbVFJBQ0VfTkFNRV06IFRoZSAnbmFtZScgb2YgdGhlIGNhbGxlZCBmcmFtZToKKyAgICAgICAgICAgICAgICAgICBfVFlQRV9FRlVOOiAgIGVpdGhlciB0aGUgbmFtZSBvZiB0aGUgZWZ1biwgb3IgdGhlIGNvZGUgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbnN0cnVjdGlvbiBmb3Igb3BlcmF0b3IgY2xvc3VyZXMKKyAgICAgICAgICAgICAgICAgICBfVFlQRV9MQU1CREE6IHRoZSBudW1lcmljIGxhbWJkYSBpZGVudGlmaWVyLgorICAgICAgICAgICAgICAgICAgIF9UWVBFX0xGVU46ICAgdGhlIG5hbWUgb2YgdGhlIGxmdW4uCisKKyAgICAgICAgICAgICAgIHN0cmluZ1tUUkFDRV9QUk9HUkFNXTogVGhlIChmaWxlKW5hbWUgb2YgdGhlIHByb2dyYW0gaG9sZGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29kZS4KKworICAgICAgICAgICAgICAgc3RyaW5nW1RSQUNFX09CSkVDVF06ICBUaGUgbmFtZSBvZiB0aGUgb2JqZWN0IGZvciB3aGljaCB0aGUgY29kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXMgZXhlY3V0ZWQuCisgICAgICAgICAgICAgICBpbnRbVFJBQ0VfTE9DXToKKyAgICAgICAgICAgICAgICAgICBfVFlQRV9MQU1CREE6IGN1cnJlbnQgcHJvZ3JhbSBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zdXJlIGNvZGUuCisgICAgICAgICAgICAgICAgICAgX1RZUEVfTEZVTjogICB0aGUgbGluZSBudW1iZXIuCisKKyAgICAgICAgPHdoYXQ+ID09IERJX1RSQUNFX0NVUlJFTlRfREVQVEg6CisgICAgICAgICAgUmV0dXJuIHRoZSBjdXJyZW50IG51bWJlciBvZiBmcmFtZXMgb24gdGhlIGNvbnRyb2wgc3RhY2sKKyAgICAgICAgICAocmVjdXJzaW9uIGRlcHRoKS4KKworICAgICAgICA8d2hhdD4gPT0gRElfVFJBQ0VfQ1VSUkVOVF9BU19TVFJJTkc6CisgICAgICAgICAgUmV0dXJucyB0aGUgY3VycmVudCBzdGFjayB0cmFjZSBhcyBhIHN0cmluZy4KKworICAgICAgICA8d2hhdD4gPT0gRElfVFJBQ0VfTEFTVF9FUlJPUjoKKyAgICAgICAgICBSZXR1cm5zIHRoZSBzdGFjayB0cmFjZSBvZiB0aGUgbGFzdCBlcnJvciBpbiBhcnJheSBmb3JtCisgICAgICAgICAgKHNhbWUgZm9ybWF0IGFzIERJX1RSQUNFX0NVUlJFTlQpLiBTdGFjayB0cmFjZXMgb2YgZXJyb3JzCisgICAgICAgICAgYmVmb3JlIHRoZSBsYXN0IEdDIG1pZ2h0IG5vdCBiZSBhdmFpbGFibGUgYW55bW9yZS4KKworICAgICAgICA8d2hhdD4gPT0gRElfVFJBQ0VfTEFTVF9FUlJPUl9BU19TVFJJTkc6CisgICAgICAgICAgUmV0dXJucyB0aGUgc3RhY2sgdHJhY2Ugb2YgdGhlIGxhc3QgZXJyb3IgYXMgYSBzdHJpbmcuCisKKyAgICAgICAgPHdoYXQ+ID09IERJX1RSQUNFX0xBU1RfVU5DQVVHSFRfRVJST1I6CisgICAgICAgICAgUmV0dXJucyB0aGUgc3RhY2sgdHJhY2Ugb2YgdGhlIGxhc3QgdW5jYXVnaHQgZXJyb3IgaW4gYXJyYXkgZm9ybQorICAgICAgICAgIChzYW1lIGZvcm1hdCBhcyBESV9UUkFDRV9DVVJSRU5UKS4gU3RhY2sgdHJhY2VzIG9mIGVycm9ycworICAgICAgICAgIGJlZm9yZSB0aGUgbGFzdCBHQyBtaWdodCBub3QgYmUgYXZhaWxhYmxlIGFueW1vcmUuCisKKyAgICAgICAgPHdoYXQ+ID09IERJX1RSQUNFX0xBU1RfVU5DQVVHSFRfRVJST1JfQVNfU1RSSU5HOgorICAgICAgICAgIFJldHVybnMgdGhlIHN0YWNrIHRyYWNlIG9mIHRoZSBsYXN0IHVuY2F1Z2h0IGVycm9yIGFzIGEgc3RyaW5nLgorCisKKworICAgICAgICBMUEMgUnVudGltZSBzdGF0aXN0aWNzOgorCisgICAgICAgIDx3aGF0PiA9PSBESV9OVU1fRlVOQ1RJT05fTkFNRV9DQUxMUzoKKyAgICAgICAgICBOdW1iZXIgb2YgZnVuY3Rpb24gY2FsbHMgYnkgbmFtZSAobGlrZSBjYWxsX290aGVyKS4KKworICAgICAgICA8d2hhdD4gPT0gRElfTlVNX0ZVTkNUSU9OX05BTUVfQ0FMTF9ISVRTOgorICAgICAgICAgIEZ1bmN0aW9uIGNhbGxzIGJ5IG5hbWUgYXJlIGNhY2hlZCAodG8gYWNjZWxlcmF0ZQorICAgICAgICAgIGxvb2t1cCBvZiB0aGUgY29ycmVzcG9uZGluZyBwcm9ncmFtIGNvZGUpLgorICAgICAgICAgIFRoaXMgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGNhY2hlIGhpdHMuCisKKyAgICAgICAgPHdoYXQ+ID09IERJX05VTV9GVU5DVElPTl9OQU1FX0NBTExfTUlTU0VTOgorICAgICAgICAgIFRoZSBudW1iZXIgb2YgZnVuY3Rpb24gY2FsbCBjYWNoZSBtaXNzZXMuCisKKyAgICAgICAgPHdoYXQ+ID09IERJX05VTV9PQkpFQ1RTX0xBU1RfUFJPQ0VTU0VEOgorICAgICAgICAgIE51bWJlciBvZiBsaXN0ZWQgb2JqZWN0cyBwcm9jZXNzZWQgaW4gdGhlIGxhc3QgYmFja2VuZCBjeWNsZS4KKworICAgICAgICA8d2hhdD4gPT0gRElfTlVNX0hFQVJUQkVBVF9UT1RBTF9DWUNMRVM6CisgICAgICAgICAgVG90YWwgbnVtYmVyIG9mIGhlYXJ0X2JlYXRzIGN5Y2xlcyBzbyBmYXIuCisKKyAgICAgICAgPHdoYXQ+ID09IERJX05VTV9IRUFSVEJFQVRfQUNUSVZFX0NZQ0xFUzoKKyAgICAgICAgICBOdW1iZXIgb2YgYWN0aXZlIGhlYXJ0X2JlYXQgY3ljbGVzIGV4ZWN1dGVkIHNvIGZhcgorICAgICAgICAgIChpZS4gY3ljbGVzIGluIHdoaWNoIGF0IGxlYXN0IG9uZSBoZWFydF9iZWF0KCkgZnVuY3Rpb24KKyAgICAgICAgICB3YXMgY2FsbGVkKS4KKworICAgICAgICA8d2hhdD4gPT0gRElfTlVNX0hFQVJUQkVBVFNfTEFTVF9QUk9DRVNTRUQ6CisgICAgICAgICAgTnVtYmVyIG9mIGhlYXJ0X2JlYXRzIGNhbGxzIGluIHRoZSBsYXN0IGJhY2tlbmQgY3ljbGUKKworICAgICAgICA8d2hhdD4gPT0gRElfTlVNX1NUUklOR19UQUJMRV9TVFJJTkdTX0FEREVEOgorICAgICAgICAgIE51bWJlciBvZiBkaXN0aW5jdCBzdHJpbmdzIGFkZGVkIHRvIHRoZSBzdHJpbmcgdGFibGUgc28gZmFyLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9OVU1fU1RSSU5HX1RBQkxFX1NUUklOR1NfUkVNT1ZFRDoKKyAgICAgICAgICBOdW1iZXIgb2YgZGlzdGluY3Qgc3RyaW5ncyByZW1vdmVkIGZyb20gdGhlIHN0cmluZyB0YWJsZSBzbyBmYXIuCisKKyAgICAgICAgPHdoYXQ+ID09IERJX05VTV9TVFJJTkdfVEFCTEVfTE9PS1VQU19CWV9WQUxVRToKKyAgICAgICAgICBOdW1iZXIgb2Ygc3RyaW5nIHNlYXJjaGVzIGJ5IHZhbHVlLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9OVU1fU1RSSU5HX1RBQkxFX0xPT0tVUFNfQllfSU5ERVg6CisgICAgICAgICAgTnVtYmVyIG9mIHN0cmluZyBzZWFyY2hlcyBieSBhZGRyZXNzLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9OVU1fU1RSSU5HX1RBQkxFX0xPT0tVUF9TVEVQU19CWV9WQUxVRToKKyAgICAgICAgICBOdW1iZXIgb2YgbG9va3VwIHN0ZXBzIG5lZWRlZCBmb3Igc3RyaW5nIHNlYXJjaGVzIGJ5IHZhbHVlLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9OVU1fU1RSSU5HX1RBQkxFX0xPT0tVUF9TVEVQU19CWV9JTkRFWDoKKyAgICAgICAgICBOdW1iZXIgb2YgbG9va3VwIHN0ZXBzIG5lZWRlZCBmb3Igc3RyaW5nIHNlYXJjaGVzIGJ5IGFkZHJlc3MuCisKKyAgICAgICAgPHdoYXQ+ID09IERJX05VTV9TVFJJTkdfVEFCTEVfSElUU19CWV9WQUxVRToKKyAgICAgICAgICBOdW1iZXIgb2Ygc3VjY2Vzc2Z1bCBsb29rdXBzIG9mIHN0cmluZ3MgYnkgdmFsdWUuCisKKyAgICAgICAgPHdoYXQ+ID09IERJX05VTV9TVFJJTkdfVEFCTEVfSElUU19CWV9JTkRFWDoKKyAgICAgICAgICBOdW1iZXIgb2Ygc3VjY2Vzc2Z1bCBsb29rdXBzIG9mIHN0cmluZ3MgYnkgYWRkcmVzcy4KKworICAgICAgICA8d2hhdD4gPT0gRElfTlVNX1NUUklOR19UQUJMRV9DT0xMSVNJT05TOgorICAgICAgICAgIE51bWJlciBvZiBkaXN0aW5jdCBzdHJpbmdzIGFkZGVkIHRvIGFuIGV4aXN0aW5nIGhhc2ggY2hhaW4gc28gZmFyLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9OVU1fUkVHRVhfTE9PS1VQUzoKKyAgICAgICAgICBOdW1iZXIgb2YgcmVxdWVzdHMgZm9yIG5ldyByZWdleHBzLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9OVU1fUkVHRVhfTE9PS1VQX0hJVFM6CisgICAgICAgICAgTnVtYmVyIG9mIHJlcXVlc3RlZCByZWdleHBzIGZvdW5kIGluIHRoZSB0YWJsZS4KKworICAgICAgICA8d2hhdD4gPT0gRElfTlVNX1JFR0VYX0xPT0tVUF9NSVNTRVM6CisgICAgICAgICAgTnVtYmVyIG9mIHJlcXVlc3RlZCByZWdleHBzIG5vdCBmb3VuZCBpbiB0aGUgdGFibGUuCisKKyAgICAgICAgPHdoYXQ+ID09IERJX05VTV9SRUdFWF9MT09LVVBfQ09MTElTSU9OUzoKKyAgICAgICAgICBOdW1iZXIgb2YgcmVxdWVzdGVkIG5ldyByZWdleHBzIHdoaWNoIGNvbGxpZGVkIHdpdGggYSBjYWNoZWQgb25lLgorCisKKworICAgICAgICBOZXR3b3JrIHN0YXRpc3RpY3M6CisKKyAgICAgICAgPHdoYXQ+ID09IERJX05VTV9NRVNTQUdFU19PVVQ6CisgICAgICAgICAgTnVtYmVyIG9mIG1lc3NhZ2VzIHNlbnQgdG8gYSBwbGF5ZXIuCisKKyAgICAgICAgPHdoYXQ+ID09IERJX05VTV9QQUNLRVRTX09VVDoKKyAgICAgICAgICBOdW1iZXIgb2YgcGFja2V0cyBzZW50IHRvIGEgcGxheWVyLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9OVU1fUEFDS0VUU19JTjoKKyAgICAgICAgICBOdW1iZXIgb2YgcGFja2V0cyByZWNlaXZlZCBmcm9tIGEgcGxheWVyLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9TSVpFX1BBQ0tFVFNfT1VUOgorICAgICAgICAgIE51bWJlciBvZiBieXRlcyBzZW50IHRvIGEgcGxheWVyLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9TSVpFX1BBQ0tFVFNfSU46CisgICAgICAgICAgTnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkIGZyb20gYSBwbGF5ZXIuCisKKworCisgICAgICAgIExvYWQ6CisKKyAgICAgICAgPHdoYXQ+ID09IERJX0xPQURfQVZFUkFHRV9DT01NQU5EUzoKKyAgICAgICAgICBBIGZsb2F0IHZhbHVlIHRoYXQgc2hvd3MgdGhlIG51bWJlciBvZiBleGVjdXRlZCBwbGF5ZXIgY29tbWFuZHMKKyAgICAgICAgICBwZXIgc2Vjb25kLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9MT0FEX0FWRVJBR0VfTElORVM6CisgICAgICAgICAgQSBmbG9hdCB2YWx1ZSB0aGF0IHNob3dzIHRoZSBudW1iZXIgb2YgY29tcGlsZWQgY29kZSBsaW5lcworICAgICAgICAgIHBlciBzZWNvbmQuCisKKyAgICAgICAgPHdoYXQ+ID09IERJX0xPQURfQVZFUkFHRV9QUk9DRVNTRURfT0JKRUNUUzoKKyAgICAgICAgICBBIGZsb2F0IHZhbHVlIHRoYXQgc2hvd3MgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIG9iamVjdHMgcHJvY2Vzc2VkCisgICAgICAgICAgZWFjaCBiYWNrZW5kIGN5Y2xlLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9MT0FEX0FWRVJBR0VfUFJPQ0VTU0VEX09CSkVDVFNfUkVMQVRJVkU6CisgICAgICAgICAgQXZlcmFnZSBudW1iZXIgb2Ygb2JqZWN0cyBwcm9jZXNzZWQgZWFjaCBjeWNsZSwgZXhwcmVzc2VkCisgICAgICAgICAgYXMgcGVyY2VudGFnZSAoMC4uMS4wKSBvZiB0aGUgbnVtYmVyIG9mIHByZXNlbnQgb2JqZWN0cy4KKworICAgICAgICA8d2hhdD4gPT0gRElfTE9BRF9BVkVSQUdFX1BST0NFU1NFRF9IRUFSVEJFQVRTX1JFTEFUSVZFOgorICAgICAgICAgIEF2ZXJhZ2UgbnVtYmVyIG9mIGhlYXJ0X2JlYXRzIGNhbGxlZCBlYWNoIGN5Y2xlLCBleHByZXNzZWQKKyAgICAgICAgICBhcyBmcmFjdGlvbiAoMC4uMS4wKSBvZiB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBoZWFydGJlYXRzLgorCisKKworICAgICAgICBNZW1vcnkgdXNlIHN0YXRpc3RpY3M6CisKKyAgICAgICAgPHdoYXQ+ID09IERJX05VTV9BQ1RJT05TOgorICAgICAgICAgIE51bWJlciBvZiBhbGxvY2F0ZWQgYWN0aW9ucy4KKworICAgICAgICA8d2hhdD4gPT0gRElfTlVNX0NBTExPVVRTOgorICAgICAgICAgIE51bWJlciBvZiBwZW5kaW5nIGNhbGxfb3V0cy4KKworICAgICAgICA8d2hhdD4gPT0gRElfTlVNX0hFQVJUQkVBVFM6CisgICAgICAgICAgTnVtYmVyIG9mIG9iamVjdHMgd2l0aCBhIGhlYXJ0YmVhdC4KKworICAgICAgICA8d2hhdD4gPT0gRElfTlVNX1NIQURPV1M6CisgICAgICAgICAgTnVtYmVyIG9mIGFsbG9jYXRlZCBzaGFkb3dzLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9OVU1fT0JKRUNUUzoKKyAgICAgICAgICBOdW1iZXIgb2Ygb2JqZWN0cy4KKworICAgICAgICA8d2hhdD4gPT0gRElfTlVNX09CSkVDVFNfU1dBUFBFRDoKKyAgICAgICAgICBOdW1iZXIgb2Ygb2JqZWN0cyB0aGF0IGFyZSBzd2FwcGVkLW91dC4KKworICAgICAgICA8d2hhdD4gPT0gRElfTlVNX09CSkVDVFNfSU5fTElTVDoKKyAgICAgICAgICBOdW1iZXIgb2Ygb2JqZWN0cyBpbiB0aGUgb2JqZWN0IGxpc3QKKyAgICAgICAgICAoaS5lLiBub3QgZGVzdHJ1Y3RlZCBvYmplY3RzKS4KKworICAgICAgICA8d2hhdD4gPT0gRElfTlVNX09CSkVDVFNfSU5fVEFCTEU6CisgICAgICAgICAgTnVtYmVyIG9mIG9iamVjdHMgaW4gdGhlIG9iamVjdCB0YWJsZS4KKworICAgICAgICA8d2hhdD4gPT0gRElfTlVNX09CSkVDVFNfREVTVFJVQ1RFRDoKKyAgICAgICAgICBOdW1iZXIgb2YgZGVzdHJ1Y3RlZCwgYnV0IHN0aWxsIHJlZmVyZW5jZWQgb2JqZWN0cy4KKyAgICAgICAgICAoTm90IGNvdW50aW5nIERJX05VTV9PQkpFQ1RTX05FV0xZX0RFU1RSVUNURUQpLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9OVU1fT0JKRUNUU19ORVdMWV9ERVNUUlVDVEVEOgorICAgICAgICAgIE51bWJlciBvZiBuZXdseSBkZXN0cnVjdGVkIG9iamVjdHMgKGllLiBvYmplY3RzIGRlc3RydWN0ZWQKKyAgICAgICAgICBpbiB0aGlzIGV4ZWN1dGlvbiB0aHJlYWQsIHRoYXQgd2lsbCByZWFsbHkgYmUgZGVzdHJveWVkIGluCisgICAgICAgICAgdGhlIG5leHQgYmFja2VuZCBjeWNsZSkuCisKKyAgICAgICAgPHdoYXQ+ID09IERJX05VTV9PQkpFQ1RfVEFCTEVfU0xPVFM6CisgICAgICAgICAgTnVtYmVyIG9mIGhhc2ggc2xvdHMgcHJvdmlkZWQgYnkgdGhlIG9iamVjdCB0YWJsZS4KKworICAgICAgICA8d2hhdD4gPT0gRElfTlVNX1BST0dTOgorICAgICAgICAgIFNpemUgb2NjdXBpZWQgYnkgdGhlIG9iamVjdCB0YWJsZS4KKworICAgICAgICA8d2hhdD4gPT0gRElfTlVNX1BST0dTX1NXQVBQRUQ6CisgICAgICAgICAgTnVtYmVyIG9mIHN3YXBwZWQtb3V0IHByb2dyYW0gYmxvY2tzCisKKyAgICAgICAgPHdoYXQ+ID09IERJX05VTV9QUk9HU19VTlNXQVBQRUQ6CisgICAgICAgICAgTnVtYmVyIG9mIHByb2dyYW1zIHRoYXQgd2VyZSBzd2FwcGVkLW91dCwgYXJlIG5vdyBzd2FwcGVkLWluLAorICAgICAgICAgIGJ1dCBzdGlsbCBoYXZlIGFsbG9jYXRlZCBzcGFjZSBpbiB0aGUgc3dhcCBmaWxlLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9OVU1fQVJSQVlTOgorICAgICAgICAgIE51bWJlciBvZiBjdXJyZW50bHkgZXhpc3RpbmcgYXJyYXlzLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9OVU1fTUFQUElOR1M6CisgICAgICAgICAgTnVtYmVyIG9mIGN1cnJlbnRseSBleGlzdGluZyBtYXBwaW5ncy4KKworICAgICAgICA8d2hhdD4gPT0gRElfTlVNX01BUFBJTkdTX0NMRUFOOgorICAgICAgICAgIE51bWJlciBvZiBjbGVhbiBtYXBwaW5ncyAobWFwcGluZ3Mgd2l0aG91dCBhIGhhc2ggcGFydCkuCisKKyAgICAgICAgPHdoYXQ+ID09IERJX05VTV9NQVBQSU5HU19IQVNIOgorICAgICAgICAgIE51bWJlciBvZiBoYXNoIG1hcHBpbmdzLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9OVU1fTUFQUElOR1NfSFlCUklEOgorICAgICAgICAgIE51bWJlciBvZiBoeWJyaWQgbWFwcGluZ3MgKG1hcHBpbmdzIHRoYXQgaGF2ZSBhCisgICAgICAgICAgY29uZGVuc2VkIGFuZCBoYXNoIHBhcnQpLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9OVU1fU1RSVUNUUzoKKyAgICAgICAgICBOdW1iZXIgb2YgY3VycmVudGx5IGV4aXN0aW5nIHN0cnVjdHMuCisKKyAgICAgICAgPHdoYXQ+ID09IERJX05VTV9TVFJVQ1RfVFlQRVM6CisgICAgICAgICAgTnVtYmVyIG9mIGN1cnJlbnRseSBleGlzdGluZyBzdHJ1Y3QgdHlwZXMuCisKKyAgICAgICAgPHdoYXQ+ID09IERJX05VTV9WSVJUVUFMX1NUUklOR1M6CisgICAgICAgICAgTnVtYmVyIG9mIGN1cnJlbnRseSBleGlzdGluZyB2aXJ0dWFsIHN0cmluZ3MKKyAgICAgICAgICAoaWRlbnRpY2FsIHN0cmluZ3MgYXJlIGNvdW50ZWQgc2VwYXJhdGVseSkuCisKKyAgICAgICAgPHdoYXQ+ID09IERJX05VTV9TVFJJTkdTOgorICAgICAgICAgIE51bWJlciBvZiByZWFsIHN0cmluZ3MgKGlkZW50aWNhbCBzdHJpbmdzCisgICAgICAgICAgYXJlIGNvdW50ZWQgb25jZSkuCisKKyAgICAgICAgPHdoYXQ+ID09IERJX05VTV9TVFJJTkdTX1RBQkxFRDoKKyAgICAgICAgICBOdW1iZXIgb2YgZGlyZWN0bHkgdGFibGVkIHN0cmluZ3MuCisKKyAgICAgICAgPHdoYXQ+ID09IERJX05VTV9TVFJJTkdTX1VOVEFCTEVEOgorICAgICAgICAgIE51bWJlciBvZiB1bnRhYmxlZCBzdHJpbmdzLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9OVU1fU1RSSU5HX1RBQkxFX1NMT1RTOgorICAgICAgICAgIE51bWJlciBvZiBoYXNoIHNsb3RzIGluIHRoZSBzdHJpbmcgdGFibGUuCisKKyAgICAgICAgPHdoYXQ+ID09IERJX05VTV9TVFJJTkdfVEFCTEVfU0xPVFNfVVNFRDoKKyAgICAgICAgICBOdW1iZXIgb2YgaGFzaCBjaGFpbnMgaW4gdGhlIHN0cmluZyB0YWJsZS4KKworICAgICAgICA8d2hhdD4gPT0gRElfTlVNX1JFR0VYOgorICAgICAgICAgIE51bWJlciBvZiBjYWNoZWQgcmVndWxhciBleHByZXNzaW9ucy4KKworICAgICAgICA8d2hhdD4gPT0gRElfTlVNX1JFR0VYX1RBQkxFX1NMT1RTOgorICAgICAgICAgIE51bWJlciBvZiBzbG90cyBpbiB0aGUgcmVnZXhwIGNhY2hlIHRhYmxlLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9TSVpFX0FDVElPTlM6CisgICAgICAgICAgVG90YWwgc2l6ZSBvZiBhbGxvY2F0ZWQgYWN0aW9ucy4KKworICAgICAgICA8d2hhdD4gPT0gRElfU0laRV9DQUxMT1VUUzoKKyAgICAgICAgICBUb3RhbCBzaXplIG9mIHBlbmRpbmcgY2FsbF9vdXRzLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9TSVpFX0hFQVJUQkVBVFM6CisgICAgICAgICAgVG90YWwgc2l6ZSBvZiB0aGUgaGVhcnRfYmVhdCBsaXN0LgorCisgICAgICAgIDx3aGF0PiA9PSBESV9TSVpFX1NIQURPV1M6CisgICAgICAgICAgVG90YWwgc2l6ZSBvZiBhbGxvY2F0ZWQgc2hhZG93cy4KKworICAgICAgICA8d2hhdD4gPT0gRElfU0laRV9PQkpFQ1RTOgorICAgICAgICAgIFRvdGFsIHNpemUgb2Ygb2JqZWN0cyAobm90IGNvdW50aW5nIHRoZSBzaXplIG9mIHRoZSB2YWx1ZXMKKyAgICAgICAgICBvZiB0aGVpciB2YXJpYWJsZXMpLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9TSVpFX09CSkVDVFNfU1dBUFBFRDoKKyAgICAgICAgICBUb3RhbCBzaXplIG9mIHN3YXBwZWQtb3V0IHZhcmlhYmxlIGJsb2Nrcy4KKworICAgICAgICA8d2hhdD4gPT0gRElfU0laRV9PQkpFQ1RfVEFCTEU6CisgICAgICAgICAgU2l6ZSBvY2N1cGllZCBieSB0aGUgb2JqZWN0IHRhYmxlLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9TSVpFX1BST0dTOgorICAgICAgICAgIFRvdGFsIHNpemUgb2YgYWxsIHByb2dyYW1zLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9TSVpFX1BST0dTX1NXQVBQRUQ6CisgICAgICAgICAgVG90YWwgc2l6ZSBvZiBzd2FwcGVkLW91dCBwcm9ncmFtIGJsb2NrcworCisgICAgICAgIDx3aGF0PiA9PSBESV9TSVpFX1BST0dTX1VOU1dBUFBFRDoKKyAgICAgICAgICBUb3RhbCBzaXplIG9mIHVuc3dhcHBlZCBwcm9ncmFtIGJsb2NrcworCisgICAgICAgIDx3aGF0PiA9PSBESV9TSVpFX0FSUkFZUzoKKyAgICAgICAgICBUb3RhbCBzaXplIG9mIGFsbCBhcnJheXMgKG5vdCBjb3VudGluZyBhZGRpdGlvbmFsIHNpemVzCisgICAgICAgICAgb2YgYXJyYXkgZWxlbWVudCB2YWx1ZXMpLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9TSVpFX01BUFBJTkdTOgorICAgICAgICAgIFRvdGFsIHNpemUgb2YgYWxsIG1hcHBpbmcgKG5vdCBjb3VudGluZyBhZGRpdGlvbmFsIHNpemVzCisgICAgICAgICAgb2YgY29udGFpbmVkIHZhbHVlcykuCisKKyAgICAgICAgPHdoYXQ+ID09IERJX1NJWkVfU1RSVUNUUzoKKyAgICAgICAgICBUb3RhbCBzaXplIG9mIGFsbCBzdHJ1Y3RzIChub3QgY291bnRpbmcgYWRkaXRpb25hbCBzaXplcworICAgICAgICAgIG9mIGNvbnRhaW5lZCB2YWx1ZXMpLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9TSVpFX1NUUlVDVF9UWVBFUzoKKyAgICAgICAgICBUb3RhbCBzaXplIG9mIGFsbCBzdHJ1Y3QgdHlwZSBkZWZpbml0aW9ucy4KKworICAgICAgICA8d2hhdD4gPT0gRElfU0laRV9TVFJJTkdTOgorICAgICAgICAgIFRvdGFsIHNpemUgb2YgYWxsIHN0cmluZ3MuCisKKyAgICAgICAgPHdoYXQ+ID09IERJX1NJWkVfU1RSSU5HU19UQUJMRUQ6CisgICAgICAgICAgVG90YWwgc2l6ZSBvZiBhbGwgdGFibGVkIHN0cmluZ3MuCisKKyAgICAgICAgPHdoYXQ+ID09IERJX1NJWkVfU1RSSU5HU19VTlRBQkxFRDoKKyAgICAgICAgICBUb3RhbCBzaXplIG9mIGFsbCB1bnRhYmxlZCBzdHJpbmdzLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9TSVpFX1NUUklOR19UQUJMRToKKyAgICAgICAgICBTaXplIG9mIHRoZSBzdHJpbmcgdGFibGUgc3RydWN0dXJlIGl0c2VsZi4KKworICAgICAgICA8d2hhdD4gPT0gRElfU0laRV9TVFJJTkdfT1ZFUkhFQUQ6CisgICAgICAgICAgU2l6ZSBvZiB0aGUgb3ZlcmhlYWQgcGVyIHN0cmluZyAoY29tcGFyZWQgdG8gYSByYXcgc3RyaW5nKS4KKworICAgICAgICA8d2hhdD4gPT0gRElfU0laRV9SRUdFWDoKKyAgICAgICAgICBUb3RhbCBzaXplIG9mIGFsbCBjYWNoZWQgcmVndWxhciBleHByZXNzaW9ucy4KKworICAgICAgICA8d2hhdD4gPT0gRElfU0laRV9CVUZGRVJfRklMRToKKyAgICAgICAgICBUaGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGJ1ZmZlciBmb3IgZmlsZSBvcGVyYXRpb25zLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9TSVpFX0JVRkZFUl9TV0FQOgorICAgICAgICAgIFRoZSBzaXplIG9mIHRoZSBtZW1vcnkgYnVmZmVyIGZvciB0aGUgc3dhcCBmaWxlLgorCisKKworICAgICAgICBNZW1vcnkgc3dhcHBlciBzdGF0aXN0aWNzOgorCisgICAgICAgIDx3aGF0PiA9PSBESV9OVU1fU1dBUF9CTE9DS1M6CisgICAgICAgICAgTnVtYmVyIG9mIGJsb2NrcyBpbiB0aGUgc3dhcCBmaWxlLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9OVU1fU1dBUF9CTE9DS1NfRlJFRToKKyAgICAgICAgICBOdW1iZXIgb2YgZnJlZSBibG9ja3MgaW4gdGhlIHN3YXAgZmlsZS4KKworICAgICAgICA8d2hhdD4gPT0gRElfTlVNX1NXQVBfQkxPQ0tTX1JFVVNFX0xPT0tVUFM6CisgICAgICAgICAgTnVtYmVyIG9mIHNlYXJjaGVzIGZvciBibG9ja3MgdG8gcmV1c2UgaW4gdGhlIHN3YXAgZmlsZS4KKworICAgICAgICA8d2hhdD4gPT0gRElfTlVNX1NXQVBfQkxPQ0tTX1JFVVNFX0xPT0tVUF9TVEVQUzoKKyAgICAgICAgICBUb3RhbCBudW1iZXIgb2YgbG9va3VwIHN0ZXBzIGluIHNlYXJjaGVzIGZvciBibG9ja3MKKyAgICAgICAgICB0byByZXVzZSBpbiB0aGUgc3dhcCBmaWxlLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9OVU1fU1dBUF9CTE9DS1NfRlJFRV9MT09LVVBTOgorICAgICAgICAgIE51bWJlciBvZiBzZWFyY2hlcyBmb3IgYmxvY2tzIHRvIGZyZWUgaW4gdGhlIHN3YXAgZmlsZS4KKworICAgICAgICA8d2hhdD4gPT0gRElfTlVNX1NXQVBfQkxPQ0tTX0ZSRUVfTE9PS1VQX1NURVBTOgorICAgICAgICAgIFRvdGFsIG51bWJlciBvZiBsb29rdXAgc3RlcHMgaW4gc2VhcmNoZXMgZm9yIGJsb2NrcworICAgICAgICAgIHRvIGZyZWUgaW4gdGhlIHN3YXAgZmlsZS4KKworICAgICAgICA8d2hhdD4gPT0gRElfU0laRV9TV0FQX0JMT0NLUzoKKyAgICAgICAgICBTaXplIG9mIHRoZSBzd2FwIGZpbGUuCisKKyAgICAgICAgPHdoYXQ+ID09IERJX1NJWkVfU1dBUF9CTE9DS1NfRlJFRToKKyAgICAgICAgICBTaXplIG9mIGZyZWUgYmxvY2tzIGluIHRoZSBzd2FwIGZpbGUuCisKKyAgICAgICAgPHdoYXQ+ID09IERJX1NJWkVfU1dBUF9CTE9DS1NfUkVVU0VEOgorICAgICAgICAgIFRvdGFsIHJldXNlZCBzcGFjZSBpbiB0aGUgc3dhcCBmaWxlLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9TV0FQX1JFQ1lDTEVfUEhBU0U6CisgICAgICAgICAgVHJ1ZSBpZiB0aGUgc3dhcHBlciBpcyBjdXJyZW50bHkgcmVjeWNsaW5nIGZyZWUgYmxvY2suCisKKworCisgICAgICAgIE1lbW9yeSBhbGxvY2F0b3Igc3RhdGlzdGljczoKKworICAgICAgICA8d2hhdD4gPT0gRElfTUVNT1JZX0FMTE9DQVRPUl9OQU1FOgorICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBhbGxvY2F0b3I6ICJzeXNtYWxsb2MiLCAic21hbGxvYyIsICJzbGFiYWxsb2MKKworICAgICAgICA8d2hhdD4gPT0gRElfTlVNX1NZU19BTExPQ0FURURfQkxPQ0tTOgorICAgICAgICAgIE51bWJlciBvZiBtZW1vcnkgYmxvY2tzIHJlcXVlc3RlZCBmcm9tIHRoZSBvcGVyYXRpbmcgc3lzdGVtLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9OVU1fTEFSR0VfQkxPQ0tTX0FMTE9DQVRFRDoKKyAgICAgICAgICBOdW1iZXIgb2YgbGFyZ2UgYWxsb2NhdGVkIGJsb2Nrcy4KKyAgICAgICAgICAoV2l0aCBzbWFsbG9jOiBUaGUgbGFyZ2UgYWxsb2NhdGVkIGJsb2NrcyBpbmNsdWRlCisgICAgICAgICAgdGhlIHNtYWxsIGNodW5rIGJsb2Nrcy4pCisKKyAgICAgICAgPHdoYXQ+ID09IERJX05VTV9MQVJHRV9CTE9DS1NfRlJFRToKKyAgICAgICAgICBOdW1iZXIgb2YgbGFyZ2UgZnJlZSBibG9ja3MuCisKKyAgICAgICAgPHdoYXQ+ID09IERJX05VTV9MQVJHRV9CTE9DS1NfV0FTVEU6CisgICAgICAgICAgTnVtYmVyIG9mIHVudXNhYmxlIGxhcmdlIG1lbW9yeSBmcmFnbWVudHMuCisKKyAgICAgICAgPHdoYXQ+ID09IERJX05VTV9TTUFMTF9CTE9DS1NfQUxMT0NBVEVEOgorICAgICAgICAgIE51bWJlciBvZiBzbWFsbCBhbGxvY2F0ZWQgYmxvY2tzLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9OVU1fU01BTExfQkxPQ0tTX0ZSRUU6CisgICAgICAgICAgTnVtYmVyIG9mIHNtYWxsIGZyZWUgYmxvY2tzLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9OVU1fU01BTExfQkxPQ0tTX1dBU1RFOgorICAgICAgICAgIE51bWJlciBvZiB1bnVzYWJseSBzbWFsbCBtZW1vcnkgZnJhZ21lbnRzLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9OVU1fU01BTExfQkxPQ0tfQ0hVTktTOgorICAgICAgICAgIE51bWJlciBvZiBzbWFsbCBjaHVuay9zbGFiIGJsb2Nrcy4KKyAgICAgICAgICAoVGhhdCBhcmUgbGFyZ2UgYmxvY2tzIHRoYXQgYXJlIHVzZWQgYXMgYQorICAgICAgICAgIGJhc2UgZm9yIHNtYWxsIGJsb2Nrcy4pCisKKyAgICAgICAgPHdoYXQ+ID09IERJX05VTV9VTk1BTkFHRURfQkxPQ0tTOgorICAgICAgICAgIE51bWJlciBvZiB1bm1hbmFnZWQgKG5vbi1HQy1hYmxlKSBhbGxvY2F0aW9ucy4KKworICAgICAgICA8d2hhdD4gPT0gRElfTlVNX0ZSRUVfQkxPQ0tTX0FWTF9OT0RFUzoKKyAgICAgICAgICBOdW1iZXIgb2YgQVZMIG5vZGVzIHVzZWQgdG8gbWFuYWdlIHRoZSBsYXJnZSBmcmVlCisgICAgICAgICAgYmxvY2tzLiBUaGlzIHZhbHVlIG1pZ2h0IGdvIGF3YXkgYWdhaW4uCisKKyAgICAgICAgPHdoYXQ+ID09IERJX1NJWkVfU1lTX0FMTE9DQVRFRF9CTE9DS1M6CisgICAgICAgICAgVG90YWwgc2l6ZSBvZiBtZW1vcnkgcmVxdWVzdGVkIGZyb20gdGhlIG9wZXJhdGluZyBzeXN0ZW0uCisKKyAgICAgICAgPHdoYXQ+ID09IERJX1NJWkVfTEFSR0VfQkxPQ0tTX0FMTE9DQVRFRDoKKyAgICAgICAgICBUb3RhbCBzaXplIG9mIGxhcmdlIGFsbG9jYXRlZCBibG9ja3MuCisKKyAgICAgICAgPHdoYXQ+ID09IERJX1NJWkVfTEFSR0VfQkxPQ0tTX0ZSRUU6CisgICAgICAgICAgVG90YWwgc2l6ZSBvZiBsYXJnZSBmcmVlIGJsb2Nrcy4KKworICAgICAgICA8d2hhdD4gPT0gRElfU0laRV9MQVJHRV9CTE9DS1NfV0FTVEU6CisgICAgICAgICAgVG90YWwgc2l6ZSBvZiB1bnVzYWJsZSBsYXJnZSBtZW1vcnkgZnJhZ21lbnRzLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9TSVpFX0xBUkdFX0JMT0NLX09WRVJIRUFEOgorICAgICAgICAgIFRoZSBvdmVyaGVhZCBvZiBldmVyeSBsYXJnZSBibG9jayBhbGxvY2F0aW9uLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9TSVpFX1NNQUxMX0JMT0NLU19BTExPQ0FURUQ6CisgICAgICAgICAgVG90YWwgc2l6ZSBvZiBzbWFsbCBhbGxvY2F0ZWQgYmxvY2tzLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9TSVpFX1NNQUxMX0JMT0NLU19GUkVFOgorICAgICAgICAgIFRvdGFsIHNpemUgb2Ygc21hbGwgZnJlZSBibG9ja3MuCisKKyAgICAgICAgPHdoYXQ+ID09IERJX1NJWkVfU01BTExfQkxPQ0tTX1dBU1RFOgorICAgICAgICAgIFRvdGFsIHNpemUgb2YgdW51c2FibHkgc21hbGwgbWVtb3J5IGZyYWdtZW50cy4KKworICAgICAgICA8d2hhdD4gPT0gRElfU0laRV9TTUFMTF9CTE9DS19PVkVSSEVBRDoKKyAgICAgICAgICBUaGUgb3ZlcmhlYWQgb2YgZXZlcnkgc21hbGwgYmxvY2sgYWxsb2NhdGlvbi4KKworICAgICAgICA8d2hhdD4gPT0gRElfU0laRV9TTUFMTF9CTE9DS19DSFVOS1M6CisgICAgICAgICAgVG90YWwgc2l6ZSBvZiBzbWFsbCBjaHVuay9zbGFiIGJsb2Nrcy4KKworICAgICAgICA8d2hhdD4gPT0gRElfU0laRV9VTk1BTkFHRURfQkxPQ0tTOgorICAgICAgICAgIFRvdGFsIHNpemUgb2YgdW5tYW5hZ2VkIChub24tR0MtYWJsZSkgYWxsb2NhdGlvbnMuCisKKyAgICAgICAgPHdoYXQ+ID09IERJX1NJWkVfTUVNT1JZX1VTRUQ6CisgICAgICAgICAgVGhlIGFtb3VudCBvZiBtZW1vcnkgY3VycmVudGx5IGFsbG9jYXRlZCBmcm9tIHRoZSBhbGxvY2F0b3IuCisKKyAgICAgICAgPHdoYXQ+ID09IERJX1NJWkVfTUVNT1JZX1VOVVNFRDoKKyAgICAgICAgICBUaGUgYW1vdW50IG9mIG1lbW9yeSBhbGxvY2F0ZWQgZnJvbSB0aGUgc3lzdGVtLCBidXQKKyAgICAgICAgICBub3QgdXNlZCBieSB0aGUgZHJpdmVyLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9TSVpFX01FTU9SWV9PVkVSSEVBRDoKKyAgICAgICAgICBBbW91bnQgb2YgbWVtb3J5IHVzZWQgZm9yIHRoZSBtYW5hZ2VtZW50IG9mIHRoZSBtZW1vcnkuCisKKyAgICAgICAgPHdoYXQ+ID09IERJX05VTV9JTkNSRU1FTlRfU0laRV9DQUxMUzoKKyAgICAgICAgICBOdW1iZXIgb2YgcmVxdWVzdHMgdG8gaW5jcmVhc2UgdGhlIHNpemUgb2YgYSBtZW1vcnkgYmxvY2suCisKKyAgICAgICAgPHdoYXQ+ID09IERJX05VTV9JTkNSRU1FTlRfU0laRV9DQUxMX1NVQ0NFU1NFUzoKKyAgICAgICAgICBOdW1iZXIgb2Ygc3VjY2Vzc2Z1bCByZXF1ZXN0cyB0byBpbmNyZWFzZSB0aGUKKyAgICAgICAgICBzaXplIG9mIGEgbWVtb3J5IGJsb2NrLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9TSVpFX0lOQ1JFTUVOVF9TSVpFX0NBTExfRElGRlM6CisgICAgICAgICAgVG90YWwgc2l6ZSBvZiBhZGRpdGlvbmFsbHkgYWxsb2NhdGVkIG1lbW9yeSBieQorICAgICAgICAgIGluY3JlYXNpbmcgYWxyZWFkeSBhbGxvY2F0ZWQgbWVtb3J5IGJsb2Nrcy4KKworICAgICAgICA8d2hhdD4gPT0gRElfTlVNX1JFUExBQ0VNRU5UX01BTExPQ19DQUxMUzoKKyAgICAgICAgICBOdW1iZXIgb2YgYWxsb2NhdGlvbnMgZG9uZSB0aHJvdWdoIHRoZQorICAgICAgICAgIGNsaWIgZnVuY3Rpb25zIChpZiBzdXBwb3J0ZWQgYnkgdGhlIGFsbG9jYXRvcikuCisKKyAgICAgICAgPHdoYXQ+ID09IERJX1NJWkVfUkVQTEFDRU1FTlRfTUFMTE9DX0NBTExTOgorICAgICAgICAgIFRvdGFsIHNpemUgb2YgYWxsb2NhdGlvbnMgZG9uZSB0aHJvdWdoIHRoZQorICAgICAgICAgIGNsaWIgZnVuY3Rpb25zIChpZiBzdXBwb3J0ZWQgYnkgdGhlIGFsbG9jYXRvcikuCisKKyAgICAgICAgPHdoYXQ+ID09IERJX05VTV9NRU1PUllfREVGUkFHTUVOVEFUSU9OX0NBTExTX0ZVTEw6CisgICAgICAgICAgVG90YWwgbnVtYmVyIG9mIHJlcXVlc3RzIHRvIGRlZnJhZ21lbnQgYWxsIHNtYWxsIG1lbW9yeSBjaHVua3MuCisKKyAgICAgICAgPHdoYXQ+ID09IERJX05VTV9NRU1PUllfREVGUkFHTUVOVEFUSU9OX0NBTExTX1RBUkdFVEVEOgorICAgICAgICAgIFRvdGFsIG51bWJlciBvZiByZXF1ZXN0cyB0byBkZWZyYWdtZW50IHNtYWxsIG1lbW9yeSBjaHVua3MKKyAgICAgICAgICBmb3IgYSBkZXNpcmVkIHNpemUuCisKKyAgICAgICAgPHdoYXQ+ID09IERJX05VTV9NRU1PUllfREVGUkFHTUVOVEFUSU9OX0NBTExfVEFSR0VUX0hJVFM6CisgICAgICAgICAgVG90YWwgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgcmVxdWVzdHMgdG8gZGVmcmFnbWVudCBzbWFsbAorICAgICAgICAgIG1lbW9yeSBjaHVua3MgZm9yIGEgZGVzaXJlZCBzaXplLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9OVU1fTUVNT1JZX0RFRlJBR01FTlRBVElPTl9CTE9DS1NfSU5TUEVDVEVEOgorICAgICAgICAgIE51bWJlciBvZiBibG9ja3MgaW5zcGVjdGVkIGR1cmluZyBkZWZyYWdtZW50YXRpb25zLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9OVU1fTUVNT1JZX0RFRlJBR01FTlRBVElPTl9CTE9DS1NfTUVSR0VEOgorICAgICAgICAgIE51bWJlciBvZiBibG9ja3MgbWVyZ2VkIGR1cmluZyBkZWZyYWdtZW50YXRpb25zLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9OVU1fTUVNT1JZX0RFRlJBR01FTlRBVElPTl9CTE9DS1NfUkVTVUxUSU5HOgorICAgICAgICAgIE51bWJlciBvZiBkZWZyYWdtZW50ZWQgYmxvY2tzIChpZS4gbWVyZ2UgcmVzdWx0cykuCisKKyAgICAgICAgPHdoYXQ+ID09IERJX01FTU9SWV9FWFRFTkRFRF9TVEFUSVNUSUNTOgorICAgICAgICAgIElmIHRoZSBkcml2ZXIgd2FzIGNvbXBpbGVkIHdpdGggZXh0ZW5kZWQgbWVtb3J5IHN0YXRpc3RpY3MsCisgICAgICAgICAgdGhleSBhcmUgcmV0dXJuZWQgaW4gdGhpcyBlbnRyeTsgaWYgdGhlIGRyaXZlciB3YXMgY29tcGlsZWQKKyAgICAgICAgICB3aXRob3V0IHRoZSBzdGF0aXN0aWNzLCAwIGlzIHJldHVybmVkLgorCisgICAgICAgICAgVGhlIGFycmF5IGNvbnRhaW5zIE5VTSsyIGVudHJpZXMsIHdoZXJlIE5VTSBpcyB0aGUgbnVtYmVyCisgICAgICAgICAgb2YgZGlzdGluY3Qgc21hbGwgYmxvY2sgc2l6ZXMuIEVudHJ5IFtOVU1dIGRlc2NyaWJlcyB0aGUKKyAgICAgICAgICBzdGF0aXN0aWNzIG9mIG92ZXJzaXplZCBzbWFsbCBibG9ja3MgKHNtYWxsb2MpIHJlc3AuIGZvcgorICAgICAgICAgIGFsbCBzbGFicyAoc2xhYmFsbG9jKSwgZW50cnkgW05VTSsxXSBzdW1tYXJpemVzIGFsbCBsYXJnZQorICAgICAgICAgIGJsb2Nrcy4gRWFjaCBlbnRyeSBpcyBhbiBhcnJheSBvZiB0aGVzZSBmaWVsZHM6CisKKyAgICAgICAgICAgICAgIGludCBESU1fRVNfTUFYX0FMTE9DOgorICAgICAgICAgICAgICAgICAgICAgICBNYXggbnVtYmVyIG9mIGFsbG9jYXRlZCBibG9ja3Mgb2YgdGhpcyBzaXplLgorCisgICAgICAgICAgICAgICBpbnQgRElNX0VTX0NVUl9BTExPQzoKKyAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVudCBudW1iZXIgb2YgYWxsb2NhdGVkIGJsb2NrcyBvZiB0aGlzIHNpemUuCisKKyAgICAgICAgICAgICAgIGludCBESU1fRVNfTUFYX0ZSRUU6CisgICAgICAgICAgICAgICAgICAgICAgIE1heCBudW1iZXIgb2YgYWxsb2NhdGVkIGJsb2NrcyBvZiB0aGlzIHNpemUuCisKKyAgICAgICAgICAgICAgIGludCBESU1fRVNfQ1VSX0ZSRUU6CisgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnQgbnVtYmVyIG9mIGFsbG9jYXRlZCBibG9ja3Mgb2YgdGhpcyBzaXplLgorCisgICAgICAgICAgICAgICBmbG9hdCBESU1fRVNfQVZHX1hBTExPQzoKKyAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIGV4cGxpY2l0IGFsbG9jYXRpb24gcmVxdWVzdHMgcGVyCisgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZC4KKworICAgICAgICAgICAgICAgZmxvYXQgRElNX0VTX0FWR19YRlJFRToKKyAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIGV4cGxpY2l0IGRlYWxsb2NhdGlvbiByZXF1ZXN0cyBwZXIKKyAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kLgorCisgICAgICAgICAgICAgICBpbnQgRElNX0VTX0ZVTExfU0xBQlM6CisgICAgICAgICAgICAgICAgICAgICAgIE51bWJlciBvZiBmdWxseSB1c2VkIHNsYWJzIChzbGFiYWxsb2Mgb25seSkuCisKKyAgICAgICAgICAgICAgIGludCBESU1fRVNfRlJFRV9TTEFCUzoKKyAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIGZ1bGx5IGZyZWUgc2xhYnMgKHNsYWJhbGxvYyBvbmx5KS4KKworICAgICAgICAgICAgICAgaW50IERJTV9FU19UT1RBTF9TTEFCUzoKKyAgICAgICAgICAgICAgICAgICAgICAgVG90YWwgbnVtYmVyIG9mIHNsYWJzOiBwYXJ0aWFsbHkgdXNlZCwgZnVsbHkgdXNlZAorICAgICAgICAgICAgICAgICAgICAgICBhbmQgZnVsbHkgZnJlZSAoc2xhYmFsbG9jIG9ubHkpLgorCisgICAgICAgICAgIFRoZSBhbGxvY2F0aW9uL2RlYWxsb2NhdGlvbi1wZXItc2Vjb25kIHN0YXRpc3RpY3MgZG8KKyAgICAgICAgICAgbm90IGNvdmVyIGludGVybmFsIHNodWZmbGluZyBvZiB0aGUgZnJlZWxpc3RzLgorCisgICAgICAgICAgIFRoZSBzbGFiIHN0YXRpc3RpY3MgKGVudHJ5IFtOVU1dLCBzbGFiYWxsb2Mgb25seSkgc2hvd3MKKyAgICAgICAgICAgaW4gdGhlIEFWRyBzdGF0aXN0aWNzIHRoZSBmcmVxdWVuY2Ugd2l0aCB3aGljaCBzbGFicyB3ZXJlCisgICAgICAgICAgIGFsbG9jYXRlZCBmcm9tIHJlc3AuIHJldHVybmVkIHRvIHRoZSBsYXJnZSBtZW1vcnkgcG9vbC4KKworCisKKyAgICAgICAgU3RhdHVzIHRleHRzOgorCisgICAgICAgIDx3aGF0PiA9PSBESV9TVEFUVVNfVEVYVF9NRU1PUlk6CisgICAgICAgICAgQSBwcmludGFibGUgc3RyaW5nIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQKKyAgICAgICAgICB0aGUgbWVtb3J5IHVzYWdlLgorCisgICAgICAgIDx3aGF0PiA9PSBESV9TVEFUVVNfVEVYVF9UQUJMRVM6CisgICAgICAgICAgQSBwcmludGFibGUgc3RyaW5nIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQKKyAgICAgICAgICB0aGUgTFBDIHJ1bnRpbWUuCisKKyAgICAgICAgPHdoYXQ+ID09IERJX1NUQVRVU19URVhUX1NXQVA6CisgICAgICAgICAgQSBwcmludGFibGUgc3RyaW5nIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQKKyAgICAgICAgICB0aGUgc3dhcCBzeXN0ZW0uCisKKyAgICAgICAgPHdoYXQ+ID09IERJX1NUQVRVU19URVhUX01BTExPQzoKKyAgICAgICAgICBBIHByaW50YWJsZSBzdHJpbmcgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dAorICAgICAgICAgIG1lbW9yeSBhbGxvY2F0aW9ucy4KKworICAgICAgICA8d2hhdD4gPT0gRElfU1RBVFVTX1RFWFRfTUFMTE9DX0VYVEVOREVEOgorICAgICAgICAgIEEgcHJpbnRhYmxlIHN0cmluZ3Mgd2l0aCBleHRlbmRlZCBtZW1vcnkgc3RhdGlzdGljcworICAgICAgICAgIChpZiB0aGUgZHJpdmVyIHdhcyBjb21waWxlZCB3aXRoIHRoZW0pLgorCisKK0hJU1RPUlkKKyAgICAgICAgSW50cm9kdWNlZCBpbiBMRE11ZCAzLjUuMC4KKworU0VFIEFMU08KKyAgICAgICAgY29uZmlndXJlX2RyaXZlcihFKSwgb2JqZWN0X2luZm8oRSksIGludGVyYWN0aXZlX2luZm8oRSksCisgICAgICAgIGR1bXBfZHJpdmVyX2luZm8oRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL2R1bXBfZHJpdmVyX2luZm8gYi9kb2MvZWZ1bi9kdW1wX2RyaXZlcl9pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMWY4YWQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9kdW1wX2RyaXZlcl9pbmZvCkBAIC0wLDAgKzEsNzUgQEAKK1NZTk9QU0lTCisgICAgICAgICNpbmNsdWRlIDxkcml2ZXJfaW5mby5oPgorCisgICAgICAgIGludCBkdW1wX2RyaXZlcl9pbmZvKGludCB3aGF0KQorICAgICAgICBpbnQgZHVtcF9kcml2ZXJfaW5mbyhpbnQgd2hhdCwgc3RyaW5nIGZpbGVuYW1lKQorCitERVNDUklQVElPTgorICAgICAgICBEdW1wcyBpbmZvcm1hdGlvbiBzcGVjaWZpY2llZCBieSA8d2hhdD4gaW50byBhIGZpbGUKKyAgICAgICAgc3BlY2lmaWVkIGJ5IDxmaWxlbmFtZT4uIElmIDxmaWxlbmFtZT4gaXMgb21pdHRlZCwKKyAgICAgICAgYSBkZWZhdWx0IGZpbGUgbmFtZSBpcyB1c2VkLiBUaGUgZnVuY3Rpb24gY2FsbHMKKyAgICAgICAgbWFzdGVyLT52YWxpZF93cml0ZSgpIHRvIGNoZWNrIHRoYXQgaXQgY2FuIHdyaXRlCisgICAgICAgIHRoZSBmaWxlcy4gVGhlIGZpbGUgaW4gcXVlc3Rpb24gaXMgYWx3YXlzIHdyaXR0ZW4gYW5ldworCisgICAgICAgIE9uIHN1Y2Nlc3MgdGhlIGVmdW4gcmV0dXJucyAxLCBvciAwIGlmIGFuIGVycm9yIG9jY3VyZWQuCisKKyAgICAgICAgPHdoYXQ+ID09IERESV9PQkpFQ1RTOgorICAgICAgICAgIER1bXBzIGluZm9ybWF0aW9uIGFib3V0IGFsbCBsaXZlIG9iamVjdHMuCisgICAgICAgICAgRGVmYXVsdCBmaWxlbmFtZSBpcyAnL09CSl9EVU1QJywKKyAgICAgICAgICB2YWxpZF93cml0ZSgpIHdpbGwgcmVhZCAnb2JqZHVtcCcgZm9yIHRoZSBmdW5jdGlvbi4KKworICAgICAgICAgIEZvciBldmVyeSBvYmplY3QsIGEgbGluZSBpcyB3cml0dGVuIGludG8gdGhlIGZpbGUgd2l0aCB0aGUKKyAgICAgICAgICBmb2xsb3dpbmcgaW5mb3JtYXRpb24gaW4gdGhlIGdpdmVuIG9yZGVyOgorICAgICAgICAgICAgLSBvYmplY3QgbmFtZQorICAgICAgICAgICAgLSBzaXplIGluIG1lbW9yeSwgc2hhcmVkIGRhdGEgY291bnRlZCBvbmx5IG9uY2UKKyAgICAgICAgICAgIC0gc2l6ZSBpbiBtZW1vcnkgaWYgZGF0YSB3b3VsZG4ndCBiZSBzaGFyZWQKKyAgICAgICAgICAgIC0gbnVtYmVyIG9mIHJlZmVyZW5jZXMKKyAgICAgICAgICAgIC0gJ0hCJyBpZiB0aGUgb2JqZWN0IGhhcyBhIGhlYXJ0YmVhdCwgbm90aGluZyBpZiBub3QuCisgICAgICAgICAgICAtIHRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCwgb3IgJy0tJyBpZiB0aGUgb2JqZWN0CisgICAgICAgICAgICAgIGhhcyBubyBlbnZpcm9ubWVudAorICAgICAgICAgICAgLSBpbiBwYXJlbnRoZXNlcyB0aGUgbnVtYmVyIG9mIGV4ZWN1dGlvbiB0aWNrcyBzcGVudAorICAgICAgICAgICAgICBpbiB0aGlzIG9iamVjdAorICAgICAgICAgICAgLSB0aGUgc3dhcCBzdGF0dXM6CisgICAgICAgICAgICAgICBub3RoaW5nIGlmIG5vdCBzd2FwcGVkLAorICAgICAgICAgICAgICAgJ1BST0cgU1dBUFBFRCcgaWYgb25seSB0aGUgcHJvZ3JhbSBpcyBzd2FwcGVkCisgICAgICAgICAgICAgICAnVkFSIFNXQVBQRUQnIGlmIG9ubHkgdGhlIHZhcmlhYmVzIGFyZSBzd2FwcGVkCisgICAgICAgICAgICAgICAnU1dBUFBFRCcgaWYgYm90aCBwcm9ncmFtIGFuZCB2YXJpYWJsZXMgYXJlIHN3YXBwZWQKKyAgICAgICAgICAgIC0gdGhlIHRpbWUgdGhlIG9iamVjdCB3YXMgY3JlYXRlZAorCisgICAgICAgIDx3aGF0PiA9PSBERElfT0JKRUNUU19ERVNUUlVDVEVEOgorICAgICAgICAgIER1bXBzIGluZm9ybWF0aW9uIGFib3V0IGFsbCBkZXN0cnVjdGVkIG9iamVjdHMuIAorICAgICAgICAgIERlZmF1bHQgZmlsZW5hbWUgaXMgJy9ERVNUX09CSl9EVU1QJywKKyAgICAgICAgICB2YWxpZF93cml0ZSgpIHdpbGwgcmVhZCAnb2JqZHVtcCcgZm9yIHRoZSBmdW5jdGlvbi4KKworICAgICAgICAgIEZvciBldmVyeSBvYmplY3QsIGEgbGluZSBpcyB3cml0dGVuIGludG8gdGhlIGZpbGUgd2l0aCB0aGUKKyAgICAgICAgICBmb2xsb3dpbmcgaW5mb3JtYXRpb24gaW4gdGhlIGdpdmVuIG9yZGVyOgorICAgICAgICAgICAgLSBvYmplY3QgbmFtZQorICAgICAgICAgICAgLSBudW1iZXIgb2YgcmVmZXJlbmNlcworICAgICAgICAgICAgLSAnTkVXJyBpZiB0aGUgb2JqZWN0IHdhcyBkZXN0cnVjdGVkIGluIHRoaXMgZXhlY3V0aW9uCisgICAgICAgICAgICAgIHRocmVhZCwgbm90aGluZyBpZiBpdCBpcyBvbGRlciBhbHJlYWR5LgorCisgICAgICAgIDx3aGF0PiA9PSBERElfT1BDT0RFUzoKKyAgICAgICAgICBEdW1wcyB1c2FnZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3Bjb2Rlcy4KKyAgICAgICAgICBEZWZhdWx0IGZpbGVuYW1lIGlzICcvT1BDX0RVTVAnLAorICAgICAgICAgIHZhbGlkX3dyaXRlKCkgd2lsbCByZWFkICdvcGNkdW1wJyBmb3IgdGhlIGZ1bmN0aW9uLgorCisgICAgICAgIDx3aGF0PiA9PSBERElfTUVNT1JZOgorICAgICAgICAgIER1bXBzIGEgbGlzdCBvZiBhbGwgYWxsb2NhdGVkIG1lbW9yeSBibG9ja3MgKGlmIHRoZSBhbGxvY2F0b3IKKyAgICAgICAgICBzdXBwb3J0cyB0aGlzKS4KKyAgICAgICAgICBEZWZhdWx0IGZpbGVuYW1lIGlzICcvTUVNT1JZX0RVTVAnLAorICAgICAgICAgIHZhbGlkX3dyaXRlKCkgd2lsbCByZWFkICdtZW1kdW1wJyBmb3IgdGhlIGZ1bmN0aW9uLAorICAgICAgICAgIGFuZCB0aGUgbmV3IGRhdGEgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLgorCisgICAgICAgICAgSWYgdGhlIGFsbG9jYXRvciBkb2Vzbid0IHN1cHBvcnQgbWVtb3J5IGR1bXBzLCB0aGlzIGNhbGwgd2lsbAorICAgICAgICAgIGFsd2F5cyByZXR1cm4gMCwgYW5kIG5vdGhpbmcgd2lsbCBiZSB3cml0dGVuLgorCisgICAgICAgICAgVGhpcyB3b3JrcyBiZXN0IGlmIHRoZSBhbGxvY2F0b3IgaXMgY29tcGlsZWQgd2l0aAorICAgICAgICAgIE1BTExPQ19UUkFDRSBhbmQvb3IgTUFMTE9DX0xQQ19UUkFDRS4KKworICAgICAgICAgIE5PVEU6IE1ha2Ugc3VyZSB0aGF0IHRoaXMgb3B0aW9uIGNhbid0IGJlIGFidXNlZCEKKworSElTVE9SWQorICAgICAgICBJbnRyb2R1Y2VkIGluIExETXVkIDMuNS4wLgorCitTRUUgQUxTTworICAgICAgICBkcml2ZXJfaW5mbyhFKSwgb2JqZWN0X2luZm8oRSksIGludGVyYWN0aXZlX2luZm8oRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL2VkIGIvZG9jL2VmdW4vZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE4ZGMzMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2VkCkBAIC0wLDAgKzEsMTkgQEAKK1NZTk9QU0lTCisgICAgICAgIHZvaWQgZWQoKQorICAgICAgICB2b2lkIGVkKHN0cmluZyBmaWxlKQorICAgICAgICB2b2lkIGVkKHN0cmluZyBmaWxlLCBzdHJpbmcgZnVuYykKKworREVTQ1JJUFRJT04KKyAgICAgICAgQ2FsbGluZyB3aXRob3V0IGFyZ3VtZW50cyB3aWxsIHN0YXJ0IHRoZSBlZGl0b3IgZWQgd2l0aCB0aGUKKyAgICAgICAgbmFtZSBvZiB0aGUgZXJyb3IgZmlsZSwgdGhhdCB3YXMgcmV0dXJuZWQgYnkKKyAgICAgICAgbWFzdGVyLT52YWxpZF9yZWFkKDAsIGdldGV1aWQodGhpc19wbGF5ZXIoKSksICJlZF9zdGFydCIsCisgICAgICAgIHRoaXNfcGxheWVyKCkpLCB1c3VhbGx5IHNvbWV0aGluZyBsaWtlIH4vLmVyci4gSWYgdGhhdCBmaWxlIGlzCisgICAgICAgIGVtcHR5LCBlZCB3aWxsIGltbWVkaWF0bHkgZXhpdCBhZ2Fpbi4KKyAgICAgICAgQ2FsbGluZyBlZCgpIHdpdGggYXJndW1lbnQgZmlsZSB3aWxsIHN0YXJ0IHRoZSBlZGl0b3Igb24gdGhlCisgICAgICAgIGZpbGUuIElmIHRoZSBvcHRpb25hbCBhcmd1bWVudCBmdW5jIGlzIGdpdmVuLCB0aGlzIGZ1bmN0aW9uCisgICAgICAgIHdpbGwgYmUgY2FsbGVkIGFmdGVyIGV4aXRpbmcgdGhlIGVkaXRvci4KKworICAgICAgICBUaGUgZWRpdG9yIGVkIGlzIGFsbW9zdCBlZCgxKSBjb21wYXRpYmxlLgorCitTRUUgQUxTTworICAgICAgICBlbmFibGVfY29tbWFuZHMoRSksIHF1ZXJ5X2VkaXRpbmcoRSksIGVkMChMUEMpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9lZnVuIGIvZG9jL2VmdW4vZWZ1bgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGNkM2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vZWZ1bgpAQCAtMCwwICsxLDQ1IEBACitOQU1FCisgICAgICAgIGVmdW4KKworQkVTQ0hSRUlCVU5HCisgICAgICAgIERpZXNlcyBEaXJlY3RvcnkgZW50aGFlbHQgZGllIEJlc2NocmVpYnVuZ2VuIGZ1ZXIgZGllIEVmdW5zIGluCisgICAgICAgIExETXVkIDMuMyAuCisKKyAgICAgICAgRGllc2UgRnVua3Rpb25lbiB3ZXJkZW4gdm9tIERyaXZlciB6dXIgVmVyZnVlZ3VuZyBnZXN0ZWxsdCB1bmQga29lbm5lbgorICAgICAgICB2b24gamVkZW0gTFBDLU9iamVrdCB2ZXJ3ZW5kZXQgd2VyZGVuLgorCisgICAgICAgIFNwZXppZWxsZSBBcnRlbiBkaWVzZXIgRWZ1bnMgc2luZDoKKworICAgICAgICAgLSAnT3B0aW9uYWwnCisKKyAgICAgICAgICAgRXMgc3RlaHQgZGVtIE11ZC1CZXRyZWliZXIgZnJlaSwgZGllc2UgRWZ1bnMgenUgZGVha3RpdmllcmVuLgorCisgICAgICAgICAgICAgYXNzb2MoKQorICAgICAgICAgICAgIGJyZWFrX3BvaW50KCkKKyAgICAgICAgICAgICBkYl8qKCkKKyAgICAgICAgICAgICBpbnNlcnRfYWxpc3QoKQorICAgICAgICAgICAgIGludGVyc2VjdF9hbGlzdCgpCisgICAgICAgICAgICAgcGFyc2VfY29tbWFuZCgpCisgICAgICAgICAgICAgcHJvY2Vzc19zdHJpbmcoKQorICAgICAgICAgICAgIHJ1c2FnZSgpCisgICAgICAgICAgICAgc2V0X2lzX3dpemFyZCgpCisgICAgICAgICAgICAgc2V0X2xpZ2h0KCkKKyAgICAgICAgICAgICB0cmFuc2ZlcigpCisKKyAgICAgICAgIC0gJ1ZvcmxhZXVmaWcnCisKKyAgICAgICAgICAgRGFzIFZlcmhhbHRlbiBkaWVzZXIgRWZ1bnMga2FubiBzaWNoIGluIHNwYWV0ZXJlbiBEcml2ZXJ2ZXJzaW9uZW5lCisgICAgICAgICAgIGFlbmRlcm4uCisKKworICAgICAgICAgLSAnT2Jzb2xldCcgb3IgJ1ZlcmFsdGV0JworCisgICAgICAgICAgICAgbWFrZV9zaGFyZWRfc3RyaW5nKCkKKworICAgICAgICAgICBEaWVzZSBFZnVucyBzb2xsdGVuIG5pY2h0IHdlaXRlciB2ZXJ3ZW5kZXQgd2VyZGVuLiBTaWUgc3RlaGVuCisgICAgICAgICAgIGxlZGlnbGljaCBhdXMgS29tcGF0aWJpbGl0YWV0c2dydWVuZGVuIHp1ciBWZXJmdWVndW5nLCB1bmQKKyAgICAgICAgICAgd2VyZGVuIGluIGVpbmVyIHNwYWV0ZXJlbiBEcml2ZXJ2YXJpYW50ZSBlbnRmZXJudCB3ZXJkZW4uCisKKworU0lFSEUgQVVDSAorICAgICAgICBlZnVucyhMUEMpLCBhcHBsaWVkKEEpLCBtYXN0ZXIoTSksIGxwYyhMUEMpLCBjb25jZXB0cyhDKSwgZHJpdmVyKEQpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9lZnVuX19tX2RlbGV0ZSBiL2RvYy9lZnVuL2VmdW5fX21fZGVsZXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyYjllMDIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9lZnVuX19tX2RlbGV0ZQpAQCAtMCwwICsxLDI0IEBACitTWU5PUFNJUzoKKwltYXBwaW5nIG1fZGVsZXRlKG1hcHBpbmcgbWFwLCBtaXhlZCBrZXkpCisKK0RFU0NSSVBUSU9OOgorCVJlbW92ZSB0aGUgZW50cnkgd2l0aCBpbmRleCAna2V5JyBmcm9tIG1hcHBpbmcgJ21hcCcsIGFuZAorCXJldHVybiB0aGUgY2hhbmdlZCBtYXBwaW5nLiBJZiB0aGUgbWFwcGluZyBkb2VzIG5vdCBoYXZlIGFuCisJZW50cnkgd2l0aCBpbmRleCAna2V5JywgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIHJldHVybmVkLgorCisgICAgICAgIElmIHlvdSBkb24ndCB3YW50IHRvIG1vZGlmeSB0aGUgbWFwcGluZyBtYXAsIGNoZWNrb3V0IHRoZQorICAgICAgICBzaW11bF9lZnVuIG1fZGVsZXRlKCkuCisKK0VYQU1QTEU6IAorCisgICAgICAgIG1hcHBpbmcgbTEsIG0yOworCisgICAgICAgIG0xID0gKFsgImEiOjEsICJiIjoyLCAiYyI6MyBdKTsKKworICAgICAgICBtMiA9IGVmdW46Om1fZGVsZXRlKG0xLCAiYiIpOworICAgICAgICAgICA9PiBtMSA9IChbICJhIjoxLCAiYyI6MyBdKQorCSAgICAgIG0yID0gKFsgImEiOjEsICJjIjozIF0pCisKK1NFRSBBTFNPOgorCW1hcHBpbmdwKEUpLCBta21hcHBpbmcoRSksIG1faW5kaWNlcyhFKSwgbV92YWx1ZXMoRSksCisJc2l6ZW9mKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9lbnZpcm9ubWVudCBiL2RvYy9lZnVuL2Vudmlyb25tZW50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMTBiM2QKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9lbnZpcm9ubWVudApAQCAtMCwwICsxLDY5IEBACitTWU5PUFNJUworICAgICAgICBvYmplY3QgZW52aXJvbm1lbnQoKTsKKyAgICAgICAgb2JqZWN0IGVudmlyb25tZW50KG9iamVjdCBvYmopOworICAgICAgICBvYmplY3QgZW52aXJvbm1lbnQoc3RyaW5nIG9iaik7CisKK0FSR1VNRU5URToKKyAgICAgb2JqCisgICAgICAgICAgT2JqZWt0IG9kZXIgUGZhZC1TdHJpbmcgZWluZXMgT2JqZWt0ZXMgZGVzc2VuIFVtZ2VidW5nc29iamVrdAorICAgICAgICAgIGdlc3VjaHQgaXN0CisKK0JFU0NIUkVJQlVORzoKKyAgICAgRXMgd2lyZCBkYXMgT2JqZWt0IGJlc3RpbW10LCBpbiBkZW0gc2ljaCBvYmogYXVmaGFlbHQuCisgICAgIFdpcmQgb2JqIG5pY2h0IGFuZ2VnZWJlbiwgc28gd2lyZCB0aGlzX29iamVjdCgpIGFscyBPYmpla3QgYW5nZW5vbW1lbi4KKworICAgICBaZXJzdG9lcnRlIE9iamVrdGUgaGFiZW4ga2VpbiBFbnZpcm9ubWVudC4KKworQkVNRVJLVU5HRU46CisgICAgIC0gQmx1ZXByaW50cywgd2llIHp1bSBCZWlzcGllbCBSYWV1bWUgaGFiZW4gb2Z0IGtlaW4gZW52aXJvbm1lbnQoKS4gTWFuCisgICAgICAgc29sbHRlIGRhaGVyIHVlYmVycHJ1ZWZlbiwgb2IgZWluIGVudmlyb25tZW50KCkgZXhpc3RpZXJ0LCB3ZW5uIG1hbgorICAgICAgIGRhcmluIG9kZXIgZGFyYXVmIGVpbmUgRnVua3Rpb24gYXVmcnVmZW4gd2lsbC4KKworQkVJU1BJRUxFOgorICAgICAvLyBJbiBkZXIgVmFyaWFibGUgInJhdW0iIHN0ZWh0IGRlciBSYXVtLCBpbiBkZW0gc2ljaCBkZXIgU3BpZWxlciBkZXJ6ZWl0CisgICAgIC8vIGF1ZmhhZWx0IC0gZGFzIGthbm4gYXVjaCAwIHNlaW4hCisgICAgIHJhdW0gPSBlbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKTsKKworICAgICAvLyBEaWVzZXMgT2JqZWt0IGhhdCBub2NoIGtlaW4gZW52aXJvbm1lbnQsIGRhIGVzIGViZW4gZXJzdCBnZWNsb250CisgICAgIC8vIHd1cmRlLiBFcmdvIHN0ZWh0IGluIGVudiBlaW5lIDAuCisgICAgIG9iaiA9IGNsb25lX29iamVjdCgiL3N0ZC90aGluZyIpOworICAgICBlbnYgPSBlbnZpcm9ubWVudChvYmopOworCisgICAgIC8vIGFsbGUgTWV0aG9kZW4gZGllIGF1ZiBFbnZpcm9ubWVudCBhcmJlaXRlbiwgc29sbHRlbiBkYXMgdm9yaGVyCisgICAgIC8vIHBydWVmZW4gLSBpbnNiZXNvbmRlcmUgdGVsbF9yb29tKCkKKyAgICAgaWYodGhpc19wbGF5ZXIoKSAmJiBlbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKSAmJgorICAgICAgICBvYmplY3RwKG89cHJlc2VudCgic2NoaWxkIixlbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKSkpIHsKKworICAgICAgd3JpdGUoIkR1IGtsZWJzdCBEZWluZSBQbGFrZXR0ZSBhdWYgIitvLT5uYW1lKFdFTikrIi5cbiIpOworICAgICAgdGVsbF9yb29tKGVudmlyb25tZW50KHRoaXNfcGxheWVyKCkpLCBicmVha19zdHJpbmcoCisJCXRoaXNfcGxheWVyKCktPk5hbWUoV0VSKSsiIHBhcHB0IGVpbmVuIEF1ZmtsZWJlciBhdWYgIisKKwkJby0+bmFtZShXRU4pKyIuIiw3OCksCisJCSh7dGhpc19wbGF5ZXIoKX0pKTsKKyAgICAgfQorCisgICAgIC8vIHdlbm4gRGluZ2Ugc2VociBvZmZlbnNpY2h0bGljaCBpbiBMZXV0ZW4ga2FwdXR0Z2VoZW4gd2lyZCBlcworICAgICAvLyBrb21wbGV4ZXIgKG1hbiBrYW5uIGRhcyBuYXR1ZXJsaWNoIG5vY2ggd2VpdGVyIHNjaGFjaHRlbG4gb2RlcgorICAgICAvLyB1ZWJlciBhbGxfZW52aXJvbm1lbnQoKSB2ZXJzdWNoZW4genUgbG9lc2VuCisgICAgIGlmKGVudmlyb25tZW50KCkpIHsKKyAgICAgIG9iamVjdCBlZTsKKyAgICAgIGVlPWVudmlyb25tZW50KGVudmlyb25tZW50KCkpOworICAgICAgaWYobGl2aW5nKGVudmlyb25tZW50KCkpKSB7CisgICAgICAgdGVsbF9vYmplY3QoZW52aXJvbm1lbnQoKSxOYW1lKFdFUikrIiB6ZXJmYWVsbHQuXG4iKTsKKyAgICAgICBpZihlZSkKKyAgICAgICAgdGVsbF9yb29tKGVlLAorCSBlbnZpcm9ubWVudCgpLT5OYW1lKFdFU1NFTikrIiAiK25hbWUoUkFXKSsiIHplcmZhZWxsdC5cbiIsCisJICh7ZW52aXJvbm1lbnQoKX0pKTsKKyAgICAgIH0gZWxzZSBpZihlZSAmJiBsaXZpbmcoZWUpKQorICAgICAgIGlmKGVudmlyb25tZW50KCktPlF1ZXJ5UHJvcChQX1RSQU5TUEFSRU5UKSkKKyAgICAgICAgdGVsbF9vYmplY3QoZWUsIE5hbWUoV0VSKSsiIHplcmZhZWxsdCBpbiBEZWluZSIrCisJIChlbnZpcm9ubWVudCgpLT5RdWVyeVByb3AoUF9QTFVSQUwpPyJuIjoKKwkgIChlbnZpcm9ubWVudCgpLT5RdWVyeVByb3AoUF9HRU5ERVIpPT1GRU1BTEU/InIiOiJtIikpKworCSBlbnZpcm9ubWVudCgpLT5uYW1lKFJBVykrIi5cbiIpOworICAgICAgfSBlbHNlIHRlbGxfcm9vbShlbnZpcm9ubWVudCgpLE5hbWUoV0VSKSsiIHplcmZhZWxsdC5cbiIpOworICAgICB9CisKK1NJRUhFIEFVQ0g6CisgICAgICAgIGZpcnN0X2ludmVudG9yeShFKSwgbmV4dF9pbnZlbnRvcnkoRSksIGFsbF9pbnZlbnRvcnkoRSkKKyAgICAgICAgYWxsX2Vudmlyb25tZW50KEUpCisKKzIwLiBTZXAuIDIwMDIgR2xvaW5zb25ATUcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9leGVjIGIvZG9jL2VmdW4vZXhlYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODZkM2UwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vZXhlYwpAQCAtMCwwICsxLDM5IEBACitTWU5PUFNJUworICAgICAgICBpbnQgZXhlYyhvYmplY3QgbmV3LCBvYmplY3Qgb2xkKQorCitERVNDUklQVElPTgorICAgICAgICBleGVjKCkgc3dpdGNoZXMgdGhlIGNvbm5lY3Rpb24gZnJvbSB0aGUgaW50ZXJhY3RpdmUgb2JqZWN0IG9sZAorICAgICAgICB0byB0aGUgb2JqZWN0IG5ldy4gSWYgdGhlIG5ldyBvYmplY3QgaXMgYWxzbyBpbnRlcmFjdGl2ZSwgaXQncworICAgICAgICBjb25uZWN0aW9uIHdpbGwgYmUgdHJhbnNmZXJyZWQgdG8gdGhlIG9sZCBvYmplY3QsIHRodXMKKyAgICAgICAgZXhjaGFuaW5nIHRoZSB0d28gY29ubmVjdGlvbnMgYmV0d2VlbiB0aGUgb2JqZWN0LiBJZiB0aGUgbmV3CisgICAgICAgIG9iamVjdCBpcyBub3QgaW50ZXJhY3RpdmUsIHRoZSBvbGQgd2lsbCBub3QgYmUgaW50ZXJhY3RpdmUKKyAgICAgICAgYW55bW9yZSBhZnRlciB0aGUgZXhlYyBjYWxsIHN1Y2NlZWRlZC4KKworICAgICAgICBUaGUgcmVzdWx0IGlzIDEgb24gc3VjY2VzcywgYW5kIDAgb24gZmFpbHVyZS4KKworICAgICAgICBleGVjKCkgaXMgdXNlZCB0byBsb2FkIGRpZmZlcmVudCAidXNlciBvYmplY3RzIiBvciB0byByZWNvbm5lY3QKKyAgICAgICAgbGluayBkZWFkIHVzZXJzLgorCisgICAgICAgIFRvIHByb3ZpZGUgc2VjdXJpdHkgbWVjaGFuaXNtcywgdGhlIGludGVycHJldGVyIGNhbGxzCisgICAgICAgIG1hc3Rlci0+dmFsaWRfZXhlYyhjdXJyZW50X3Byb2dyYW0sIG5ldywgb2xkKSwgd2hpY2ggbXVzdAorICAgICAgICByZXR1cm4gYW55dGhpbmcgb3RoZXIgdGhhbiAwIHRvIGFsbG93IHRoaXMgZXhlYygpIGludm9jYXRpb24uCisKKyAgICAgICAgQWZ0ZXIgdGhlIGV4ZWMoKSwgaWYgYXJnIDIgd2FzIHRoaXNfcGxheWVyKCksIHRoaXNfcGxheWVyKCkKKyAgICAgICAgYmVjb21lcyBhcmcgMSwgZWxzZSB2aWNlIHZlcnNhLiBEaXR0byBmb3IgdGhpc19pbnRlcmFjdGl2ZSgpLgorCisgICAgICAgIFRha2UgY2FyZSB3aGVuIHdyaXRpbmcgYSBzaW11bC1lZnVuIGFyb3VuZCBleGVjKCk6IHRoZQorICAgICAgICAnY3VycmVudF9wcm9ncmFtJyBwYXNzZWQgdG8gdGhlIHZhbGlkX2V4ZWMoKSBmdW5jdGlvbiB3aWxsIGJlCisgICAgICAgIHRoYXQgb2YgdGhlIHNpbXVsLWVmdW4gb2JqZWN0LiBUbyBnZXQgYXJvdW5kIHRoaXMsIHVzZQorICAgICAgICBiaW5kX2xhbWJkYSgpIHRvIGJpbmQgIydleGVjIHRvIHRoZSByZWFsIG9iamVjdCBhbmQgZnVuY2FsbCgpCisgICAgICAgIHRoZSByZXN1bHRpbmcgY2xvc3VyZS4KKworRVhBTVBMRQorICAgICAgICBvYiA9IGNsb25lX29iamVjdCgic3RkL3BsYXllciIpOworICAgICAgICBleGVjKG9iLCB0aGlzX29iamVjdCgpKTsKKyAgICAgICAgZGVzdHJ1Y3QodGhpc19vYmplY3QoKSk7CisKK0hJU1RPUlkKKyAgICAgICAgTERNdWQgMy4yLjkgYWRkZWQgdGhlIHN3aXRjaG92ZXIgb2YgdGhpc19pbnRlcmFjdGl2ZSgpLgorCitTRUUgQUxTTworICAgICAgICBjb25uZWN0KE0pLCBkaXNjb25uZWN0KE0pLCBsb2dvbihBKSwgaW50ZXJhY3RpdmUoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL2V4ZWN1dGVfY29tbWFuZCBiL2RvYy9lZnVuL2V4ZWN1dGVfY29tbWFuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzg0YzdlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vZXhlY3V0ZV9jb21tYW5kCkBAIC0wLDAgKzEsMjEgQEAKK1ZPUkxBRVVGSUcsIEdFU0NIVUVUWlQKK1NZTk9QU0lTCisgICAgICAgIGludCBleGVjdXRlX2NvbW1hbmQoc3RyaW5nIGNvbW1hbmQsIG9iamVjdCBvcmlnaW4sIG9iamVjdCBwbGF5ZXIpOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgRGllc2UgRnVua3Rpb24gYmlldGV0IExvdy1MZXZlbCBadWdyaWZmIGF1ZiBkZW4gS29tbWFuZG9wYXJzZXI6CisgICAgICAgIDxjb21tYW5kPiB3aXJkIGluIFZlcmIgdW5kIFJlc3QgYXVmZ2VzcGFsdGV0IHVuZCBlcyB3ZXJkZW4gZGllCisgICAgICAgIGVudHNwcmVjaGVuZGVuIGFkZF9hY3Rpb25zIGluIDxvcmlnaW4+IGF1ZmdlcnVmZW4uIEZ1ZXIgZGllCisgICAgICAgIEF1c2Z1ZWhydW5nIGRlciBGdW5rdGlvbihlbikgd2lyZCB0aGlzX3BsYXllcigpIGF1ZiA8cGxheWVyPiBnZXNldHp0LgorICAgICAgICBleGVjdXRlX2NvbW1hbmQoKSBzZXR6dCBhdWNoIHBhc3NlbmRlIFdlcnRlIGZ1ZXIgcXVlcnlfY29tbWFuZCgpCisgICAgICAgIHVuZCBxdWVyeV92ZXJiKCksIGRpZSBkZW0gYW5nZWdlYmVuZW4gPGNvbW1hbmQ+IGVudHNwcmVjaGVuLgorCisgICAgICAgIGV4ZWN1dGVfY29tbWFuZCgpIGJlcnVlY2tzaWNodGlndCB3ZWRlciBkZW4gSF9NT0RJRllfQ09NTUFORCBub2NoIGRlbgorICAgICAgICBIX05PVElGWV9GQUlMIEhvb2suIFp3YXIga2FubiBub3RpZnlfZmFpbCgpIHZlcndlbmRldCB3ZXJkZW4sIGRpZQorICAgICAgICBWZXJhcmJlaXR1bmcgbXVzcyBqZWRvY2ggZHVyY2ggZGFzIGF1ZnJ1ZmVuZGUgT2JqZWt0IGVyZm9sZ2VuLgorCitBRU5ERVJVTkdFTgorICAgICAgICBFaW5nZWZ1ZWhydCBpbiBMRE11ZCAzLjIuNworCitTSUVIRSBBVUNICisgICAgICAgIGhvb2tzKEMpLCBjb21tYW5kKEUpLCBub3RpZnlfZmFpbChFKSwgY29tbWFuZF9zdGFjayhFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vZXhwIGIvZG9jL2VmdW4vZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NzQ2ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9leHAKQEAgLTAsMCArMSw4IEBACitTWU5PUFNJUworICAgICAgICBmbG9hdCBleHAoaW50fGZsb2F0IHphaGwpOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgRGllIEV4cG9uZW50aWFsZnVua3Rpb24uIExpZWZlcnQgZV56YWhsLgorCitTSUVIRSBBVUNICisgICAgICAgIGxvZyhFKSwgcG93KEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9leHBhbmRfZGVmaW5lIGIvZG9jL2VmdW4vZXhwYW5kX2RlZmluZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmZmMTg5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vZXhwYW5kX2RlZmluZQpAQCAtMCwwICsxLDI0IEBACitTWU5PUFNJUworICAgICAgICBzdHJpbmcgZXhwYW5kX2RlZmluZSAoc3RyaW5nIG5hbWUpCisgICAgICAgIHN0cmluZyBleHBhbmRfZGVmaW5lIChzdHJpbmcgbmFtZSwgc3RyaW5nIGFyZywgLi4uKQorCitERVNDUklQVElPTgorICAgICAgICBFeHBhbmRzIHRoZSBtYWNybyA8bmFtZT4gd2l0aCB0aGUgYXJndW1lbnQocykgPGFyZz4uLi4gKGRlZmF1bHQgaXMKKyAgICAgICAgb25lIGVtcHR5IHN0cmluZyAiIikuCisgICAgICAgIFJlc3VsdCBpcyB0aGUgZXhwYW5kZWQgbWFjcm8sIG9yIDAgaWYgdGhlcmUgaXMgbm8gbWFjcm8gd2l0aAorICAgICAgICB0aGF0IG5hbWUuCisKKyAgICAgICAgVGhpcyBlZnVuIGlzIGFwcGxpY2FibGUgb25seSB3aGlsZSBhbiBvYmplY3QgaXMgY29tcGlsZWQsCisgICAgICAgIHRoZXJlZm9yZSBpdHMgdXNhZ2UgaXMgcmVzdHJpY3RlZCB0byBhIGZldyBmdW5jdGlvbnMgbGlrZSB0aGUKKyAgICAgICAgSF9JTkNMVURFX0RJUlMgZHJpdmVyIGhvb2ssIG9yIHRoZSBtYXN0ZXJzIHJ1bnRpbWVfZXJyb3IoKQorICAgICAgICBmdW5jdGlvbi4KKworRVhBTVBMRQorICAgICAgICBXaGlsZSBjb21waWxpbmcgJ2Zvby5jJzoKKyAgICAgICAgICBleHBhbmRfZGVmaW5lKCJfX0ZJTEVfXyIpIC0tPiAiZm9vLmMiCisKK0hJU1RPUlkKKyAgICAgICAgSW50cm9kdWNlZCBpbiAzLjIuMUA5My4KKworU0VFIEFMU08KKyAgICAgICAgaG9va3MoQyksIHJ1bnRpbWVfZXJyb3IoTSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL2V4cGxvZGUgYi9kb2MvZWZ1bi9leHBsb2RlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NmVhYTEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9leHBsb2RlCkBAIC0wLDAgKzEsMjggQEAKK1NZTk9QU0lTCisgICAgICAgIHN0cmluZyAqZXhwbG9kZShzdHJpbmcgc3RyLCBzdHJpbmcgZGVsKQorCitCRVNDSFJFSUJVTkcKKyAgICAgICAgTGllZmVydCBlaW4gRmVsZCAoQXJyYXkpIG1pdCBaZWljaGVua2V0dGVuIChTdHJpbmdzKSwgaW5kZW0gYWxsZQorICAgICAgICBWb3Jrb21tZW4gdm9uIGRlbCAoZGVsaW1pdGVyID0gVHJlbm5lcikgYXVzIHN0ciBoZXJhdXNnZXNjaG5pdHRlbgorICAgICAgICB3ZXJkZW4gdW5kIHNvIHN0ciBpbiBtZWhyZXJlIFplaWNoZW5rZXR0ZW4gemVybGVndCB3aXJkLgorCisgICAgICAgIGltcGxvZGUoZXhwbG9kZShzdHIsIGRlbCksIGRlbCkgPT0gc3RyIGlzdCBpbW1lciB3YWhyLgorCitCRUlTUElFTEUKKyAgICAgICAgRnVua3Rpb24gICAgICAgICAgICAgICAgICAgIFJ1ZWNrZ2FiZXdlcnQKKyAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBleHBsb2RlKCIgYWIgY2QgZWYgIiwgIiAiKSAgKHsgIiIsICJhYiIsICJjZCIsICJlZiIsICIiIH0pCisgICAgICAgIGV4cGxvZGUoImFiYyIsICJhYmMiKSAgICAgICAoeyAiIiwgIiIgfSkKKyAgICAgICAgZXhwbG9kZSgiIiwgIiIpICAgICAgICAgICAgICh7fSkKKyAgICAgICAgZXhwbG9kZSgiYWJjIiwgInh5eiIpICAgICAgICh7ICJhYmMiIH0pCisgICAgICAgIGV4cGxvZGUoImFiYyIsICIiKSAgICAgICAgICAoeyAiYSIsICJiIiwgImMiIH0pCisKK0FFTkRFUlVOR0VOCisgICAgICAgIFplaXRwdW5rdCBkZXIgQWVuZGVydW5nIHVuYmVrYW5udC4KKyAgICAgICAgZXhwbG9kZSgiIGFiIGNkIGVmICIsICIgIikgbGllZmVydGUgZnJ1ZWhlciAoeyAiYWIiLCAiY2QiLCAiZWYiIH0pCisgICAgICAgIGFuc3RhdHQgKHsgIiIsICJhYiIsICJjZCIsICJlZiIsICIiIH0pLCBkLiBoLiwgbGVlcmUgWmVpY2hlbmtldHRlbgorICAgICAgICB3dXJkZW4gaWdub3JpZXJ0LiBEYXMgbmV1ZSBWZXJoYWx0ZW4gaXN0IHNjaG9lbmVyLCBkYSBudW4KKyAgICAgICAgaW1wbG9kZShleHBsb2RlKHN0ciwgZGVsKSwgZGVsKSA9PSBzdHIgaW1tZXIgd2FociBpc3QuCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgc3NjYW5mKEUpLCBpbXBsb2RlKEUpLCByZWdleHBsb2RlKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9leHBvcnRfdWlkIGIvZG9jL2VmdW4vZXhwb3J0X3VpZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjFmNmEzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vZXhwb3J0X3VpZApAQCAtMCwwICsxLDE1IEBACitTWU5PUFNJUworICAgICAgICB2b2lkIGV4cG9ydF91aWQob2JqZWN0IG9iKQorCitERVNDUklQVElPTgorICAgICAgICBTZXQgdGhlIHVpZCBvZiBvYmplY3Qgb2IgdG8gdGhlIGN1cnJlbnQgb2JqZWN0J3MgZWZmZWN0aXZlIHVpZC4KKyAgICAgICAgSXQgaXMgb25seSBwb3NzaWJsZSB3aGVuIG9iamVjdCBvYiBoYXMgYW4gZWZmZWN0aXZlIHVpZCBvZiAwLgorCisgICAgICAgIFRoaXMgZWZ1biBpcyBub3QgYXZhaWxhYmxlIGluIE1vcmdlbmdyYXVlbi4KKworSElTVE9SWQorICAgICAgICBTaW5jZSAzLjIuMUA0NywgdGhpcyBlZnVuIGlzIGF2YWlsYWJlIG9ubHkgd2hlbiB1c2luZyBldWlkcy4KKyAgICAgICAgU2luY2UgMy4yLjcsIHRoaXMgZWZ1biBpcyBhbHdheXMgYXZhaWxhYmxlLgorCitTRUUgQUxTTworICAgICAgICBzZXRldWlkKEUpLCBnZXR1aWQoRSksIGdldGV1aWQoRSksIHVpZHMoQyksIG5hdGl2ZShDKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vZXh0ZXJuX2NhbGwgYi9kb2MvZWZ1bi9leHRlcm5fY2FsbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2RjYTVmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vZXh0ZXJuX2NhbGwKQEAgLTAsMCArMSwxMiBAQAorU1lOT1BTSVMKKyAgICAgICAgaW50IGV4dGVybl9jYWxsKCk7CisKK0JFU0NIUkVJQlVORworICAgICAgICBMaWVmZXJ0IDAsIHdlbm4gZGllIG1vbWVudGFuZSBhdXNnZWZ1ZWhydGUgRnVua3Rpb24gZHVyY2ggZWluZSBsb2thbGUKKyAgICAgICAgRnVua3Rpb24gYXVmZ2VydWZlbiB3dXJkZSwgZWluZW4gV2VydCB1bmdsZWljaCAwIGZ1ZXIgQXVmcnVmZSBkdXJjaAorICAgICAgICBjYWxsX290aGVyKCksIGRlbiBUcmVpYmVyLCBDbG9zdXJlcyBldGMuIEltIE1vbWVudCBsaWVmZXJ0IGRpZQorICAgICAgICBGdW5rdGlvbiBpbiBhbGwgZGllc2VuIEZhZWxsZW4gMSB6dXJ1ZWNrLCBpbiBadWt1bmZ0IGtvZW5udGUKKyAgICAgICAgYWxsZXJkaW5ncyBlaW5lIFVudGVyc2NoZWlkdW5nIGRlciBBdWZydWZlIG1vZWdsaWNoIHdlcmRlbi4KKworU0lFSEUgQVVDSAorICAgICAgICBjYWxsX290aGVyKEUpLCBwcmV2aW91c19vYmplY3QoRSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9maWxlX3NpemUgYi9kb2MvZWZ1bi9maWxlX3NpemUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ5ZGQ1MwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2ZpbGVfc2l6ZQpAQCAtMCwwICsxLDM1IEBACitGVU5LVElPTjoKKyAgICAgICAgaW50IGZpbGVfc2l6ZShzdHJpbmcgZmlsZSkKKworQkVTQ0hSRUlCVU5HOgorICAgICAgICBMaWVmZXJ0IGRpZSBHcm9lc3NlIGRlcyBGaWxlcyBpbiBCeXRlcy4KKworUlVFQ0tHQUJFV0VSVDoKKyAgICAgICAgTGllZmVydCBkaWUgRGF0ZWlncm9lc3NlIGluIEJ5dGVzLgorCisgICAgICAgIERhdm9uIGFid2VpY2hlbmQga2FubiBhdWNoIGZvbGdlbmRlcyBhbHMgUnVlY2tnYWJld2VydCB2b3ItCisgICAgICAgIGtvbW1lbjoKKworICAgICAgICBGU0laRV9OT0ZJTEUgICAgRGFzIEZpbGUgaXN0IGVudHdlZGVyIG5pY2h0IHZvcmhhbmRlbiBvZGVyIGRhcworICAgICAgICAgKC0xKSAgICAgICAgICAgYWJmcmFnZW5kZSBPYmpla3QgYmVzaXR6dCBrZWluZSBMZXNlcmVjaHRlIGRhZnVlci4KKyAgICAgICAgRlNJWkVfRElSICAgICAgIEVzIGhhbmRlbHQgc2ljaCBuaWNodCB1bSBlaW4gRmlsZSBzb25kZXJuIHVtCisgICAgICAgICAoLTIpICAgICAgICAgICBlaW4gVmVyemVpY2huaXMuCisKK0JFSVNQSUVMRToKKyAgICAgICAgRWluIFNwaWVsZXIgc29sbCBzZWluZW4gUGxhbiBhYmZyYWdlbiBrb2VubmVuOgorCisgICAgICAgICNpbmNsdWRlIDxzeXMvZmlsZXMuaD4KKyAgICAgICAgaWYoZmlsZV9zaXplKCIvcC9zZXJ2aWNlL2xvY28vcGxhbnMvIisKKyAgICAgICAgICAgICAgICAgICAgIGdldHVpZCh0aGlzX3BsYXllcigpKSsiLnBsYW4iKSA8PSBGU0laRV9OT0ZJTEUpCisgICAgICAgIHsKKyAgICAgICAgICB3cml0ZSgiRHUgaGFzdCBrZWluZW4gZWlnZW5lbiBQbGFuIGZlc3RnZWxlZ3QuXG4iKTsKKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorIAorICAgICAgICB0aGlzX3BsYXllcigpLT5Nb3JlKHJlYWRfZmlsZSgiL3Avc2VydmljZS9sb2NvL3BsYW5zLyIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0dWlkKHRoaXNfcGxheWVyKCkpKyIucGxhbiIpOworICAgICAgICAgCitTSUVIRSBBVUNIOgorICAgICAgICBmaWxlX3RpbWUoUyksIHdyaXRlX2ZpbGUoRSksIGNhdChFKSwgZ2V0X2RpcihFKSwgbHMoKQorCiswMy4wOC4yMDA3LCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9maWx0ZXIgYi9kb2MvZWZ1bi9maWx0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFiYzFlOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2ZpbHRlcgpAQCAtMCwwICsxLDE4OSBAQAorZmlsdGVyKEUpCisKK0ZVTktUSU9OOgorICAgICBtaXhlZCAqIGZpbHRlciAobWl4ZWQgKmFyZywgc3RyaW5nIGZ1biwgc3RyaW5nfG9iamVjdCBvYgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgbWl4ZWQgZXh0cmEuLi4pCisgICAgIG1peGVkICogZmlsdGVyIChtaXhlZCAqYXJnLCBjbG9zdXJlIGNsLCBtaXhlZCBleHRyYS4uLikKKyAgICAgbWl4ZWQgKiBmaWx0ZXIgKG1peGVkICphcmcsIG1hcHBpbmcgbWFwLCBtaXhlZCBleHRyYS4uLikKKworICAgICBzdHJpbmcgIGZpbHRlciAoc3RyaW5nIGFyZywgc3RyaW5nIGZ1biwgc3RyaW5nfG9iamVjdCBvYgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgbWl4ZWQgZXh0cmEuLi4pCisgICAgIHN0cmluZyAgZmlsdGVyIChzdHJpbmcgYXJnLCBjbG9zdXJlIGNsLCBtaXhlZCBleHRyYS4uLikKKyAgICAgc3RyaW5nICBmaWx0ZXIgKHN0cmluZyBhcmcsIG1hcHBpbmcgbWFwLCBtaXhlZCBleHRyYS4uLikKKworICAgICBtYXBwaW5nIGZpbHRlciAobWFwcGluZyBhcmcsIHN0cmluZyBmdW5jLCBzdHJpbmd8b2JqZWN0IG9iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIG1peGVkIGV4dHJhLi4uKQorICAgICBtYXBwaW5nIGZpbHRlciAobWFwcGluZyBhcmcsIGNsb3N1cmUgY2wsIG1peGVkIGV4dHJhLi4uKQorCitQQVJBTUVURVI6CisgICAgIGFyciAgICAgLSB6dSBmaWx0ZXJuZGVzIEFycmF5L01hcHBpbmcvU3RyaW5nCisgICAgIGZ1bi9jbCAgLSB6dSBydWZlbmRlIE1ldGhvZGUvQ2xvc3VyZQorICAgICBtYXAgICAgIC0gZmlsdGVybmRlcyBNYXBwaW5nCisgICAgIG9iICAgICAgLSBPYmpla3QvRGF0ZWluYW1lLCBhbiBkZW0gTWV0aG9kZSBnZXJ1ZmVuIHdlcmRlbiBzb2xsCisgICAgIGV4dHJhICAgLSB3ZWl0ZXJlIFBhcmFtZXRlciBmdWVyIE1ldGhvZGUvQ2xvc3VyZQorCitCRVNDSFJFSUJVTkc6ICAgICAgICAKKyAgICAgUnVmdCBmdWVyIGplZGVzIEVsZW1lbnQgZGVzIEFycmF5cyBvZGVyIE1hcHBpbmdzIDxhcmc+IGRpZSBGdW5rdGlvbgorICAgICA8b2I+LT48ZnVuYz4oKSBiencuIGRpZSBDbG9zdXJlIDxjbD4gYXVmIHVuZCBsaWVmZXJ0IGplbmUgRWxlbWVudGUsCisgICAgIGZ1ZXIgZGllIGRpZSBGdW5rdGlvbiAvIENsb3N1cmUgVFJVRSBlcmdlYmVuIGhhdC4gRGllIDxleHRyYT4KKyAgICAgQXJndW1lbnRlIHdlcmRlbiBhbHMgenVzYWV0emxpY2hlIFBhcmFtZXRlciBhbiBkaWUgRnVua3Rpb24KKyAgICAgdWViZXJnZWJlbiB1bmQgZHVlcmZlbiBrZWluZSBSZWZlcmVuemVuIHZvbiBBcnJheS0gb2RlciBNYXBwaW5nLQorICAgICBFbGVtZW50ZW4gc2VpbiAod2llICYoaVsxXSkgKS4KKworICAgICBXaXJkIDxvYj4gbmljaHQgYW5nZWdlYmVuIG9kZXIgaXN0IGVzIHdlZGVyIGVpbiBTdHJpbmcgbm9jaCBlaW4KKyAgICAgT2JqZWt0LCB3aXJkIHN0YW5kYXJkbWFlc3NpZyB0aGlzX29iamVjdCgpIHZlcndlbmRldC4KKworICAgICBJc3QgPGFyZz4gZWluIEFycmF5LCB3aXJkIDxmdW4+IG1pdCBqZWRlbSBFbGVtZW50IGRlcyBBcnJheXMgYWxzCisgICAgIGVyc3RlbiBQYXJhbWV0ZXIgYXVmZ2VydWZlbiwgZ2Vmb2xndCB2b24gZGVuIDxleHRyYT4gQXJndW1lbnRlbi4KKyAgICAgV2VubiBkYXMgUmVzdWx0YXQgZGVyIEZ1bmt0aW9uIFRSVUUgZXJnaWJ0LCB3aXJkIGRhcyBFbGVtZW50IGluIGRhcworICAgICBFcmdlYm5pcyBkZXIgZmlsdGVyKCkgT3BlcmF0aW9uIG1pdCBlaW5iZXpvZ2VuLgorCisgICAgIFdpcmQgZmlsdGVyKCkgbWl0IGVpbmVtIE1hcHBpbmcgPG1hcD4gYW5zdGVsbGUgZGVyIEZ1bmt0aW9uIDxmdW5jPgorICAgICBhdWZnZXJ1ZmVuLCB3aXJkIGplZGVzIEVsZW1lbnQgaW0gQXJyYXkgPGFyZz4sIGRhcyBlaW4gS2V5IHZvbiA8bWFwPgorICAgICBpc3QsIGlucyBFcmdlYm5pcyBtaXQgZWluYmV6b2dlbi4KKworICAgICBXZW5uIDxhcmc+IGVpbiBNYXBwaW5nIGlzdCwgd2lyZCBkaWUgRnVua3Rpb24gPGZ1bmM+IG1pdCBqZWRlbSBLZXkKKyAgICAgYWxzIGVyc3RlbSB1bmQgKGZhbGxzIHZvcmhhbmRlbikgZGVuIFdlcnRlbiBkaWVzZXMgS2V5cyBhbHMgcmVzdGxpY2hlCisgICAgIFBhcmFtZXRlciwgZ2Vmb2xndCB2b24gZGVuIDxleHRyYT4gQXJndW1lbnRlbiwgYXVmZ2VydWZlbi4gV2VubiBkaWUKKyAgICAgRnVua3Rpb24gVFJVRSBlcmdpYnQsIHdpcmQgZGFzIGJldHJlZmZlbmRlIEVsZW1lbnQgZGVzIE1hcHBpbmdzIGlucworICAgICBFcmdlYm5pcyBhdWZnZW5vbW1lbi4KKworICAgICBBYmhhZW5naWcgdm9uIGRlciBHcm9lc3NlIGRlcyBNYXBwaW5ncyA8YXJnPiBlcmZvbGd0IGRlciBBdWZydWYgZGVyCisgICAgIEZ1bmt0aW9uIGF1ZiBkcmVpIHVudGVyc2NoaWVkbGljaGUgQXJ0ZW46CisKKyAgICAgd2lkdGhvZihhcmcpID09IDA6ICBvYi0+ZnVuYyhrZXksIDAsIGV4dHJhLC4uLik7CisgICAgIHdpZHRob2YoYXJnKSA9PSAxOiAgb2ItPmZ1bmMoa2V5LCBhcmdba2V5XSwgZXh0cmEsIC4uLik7CisgICAgIHdpZHRob2YoYXJnKSA+MTogICAgb2ItPmZ1bmQoa2V5LCAoe2FyZ1trZXksMF0uLi5hcmdba2V5LCBuLTFdfSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmEsIC4uLik7CisKKyAgICAgRGVyIFZvcnRlaWwgZGllc2VyIFZvcmdlaGVuc3dlaXNlIGlzdCwgZGFzcyBiZWlkZSBUeXBlbiB2b24KKyAgICAgbXVsdGlkaW1lbnNpb25hbGVuIE1hcHBpbmdzIChNYXBwaW5ncyBtaXQgbWVocmVyZW4gV2VydGUgcHJvIEtleSB1bmQKKyAgICAgTWFwcGluZ3MgYXVzIEFycmF5cykgZ2xlaWNoIHZlcmFyYmVpdGV0IHdlcmRlbiBrb2VubmVuLgorCisgICAgIElzdCA8YXJnPiBlaW4gU3RyaW5nLCB3ZXJkZW4gZGVyIEZpbHRlcmZ1bmt0aW9uIGRpZSBlaW56ZWxuZW4gWmVpY2hlbiBkZXMKKyAgICAgU3RyaW5ncyB1ZWJlcmdlYmVuIHVuZCBudXIgamVuZSBaZWljaGVuIGltIHp1cnVlY2tnZWdlYmVuZW4gU3RyaW5nCisgICAgIGF1Zmdlbm9tbWVuLCBmdWVyIGRpZSBkaWUgRmlsdGVyZnVua3RvbiAhPSAwIHp1cnVlY2tnaWJ0LgorCitBRU5ERVJVTkdFTgorICAgICBFaW5nZWZ1ZWhydCBpbiBMRE11ZCAzLjIuNi4gRGllIEZ1bmt0aW9uIGxvZXN0IGZpbHRlcl9hcnJheSgpIGFiLgorCitSVWVDS0dBQkVXRVJUOgorICAgICBHZWZpbHRlcnRlcyBBcnJheSBtaXQgYWxsZW4gZGllIEZpbHRlcmJlZGluZ3VuZyBlcmZ1ZWxsZW5kZW4gRWxlbWVudGVuLgorCitCRU1FUktVTkdFTjoKKyAgICAgKDEpIEFjaHR1bmcsIGRpZSBFbGVtZW50ZSBpbiAnYXJyJyB3ZXJkZW4gbmljaHQgdGllZiBrb3BpZXJ0LCBzaW5kIHNpZQorICAgICBhbHNvIHNlbGJzdCBBcnJheXMgb2RlciBNYXBwaW5ncywgc28gZnVlaHJ0IGVpbmUgc3BhZXRlcmUgQWVuZGVydW5nIGltCisgICAgIFJ1ZWNrZ2FiZS1BcnJheXMgenVyIEFlbmRlcnVuZyBpbSBVcnNwcnVuZ3NhcnJheToKKworICAgICBpbnQgKmksICpqOworICAgICBpPSh7KHsxLDIsM30pLCh7NCw1LDZ9KX0pOworICAgICBqPWZpbHRlcihpLCAjJ3NpemVvZik7ICAgICAvLyBmaWx0ZXJ0IGxlZXJlIEFycmF5cyBoZXJhdXMKKyAgICAgalswXVswXT04OworCisgICAgIGZ1ZWhydCB6dTogaT09aj09KHsoezgsMiwzfSksKHs0LDUsNn0pfSk7CisKKyAgICAgKDIpIERhcyBLb3BpZXJlbiBpbiBkYXMgUnVlY2tnYWJlbWFwcGluZyBlcmZvbGd0IGZ1ZXIgamVkZXMgRWxlbWVudCBuYWNoCisgICAgIEF1c2Z1ZWhydW5nIGRlciBGaWx0ZXJtZXRob2RlLiBBZW5kZXJ1bmdlbiBkZXIgV2VydGUgaW0gQXJyYXkgaW4gZGllc2VyCisgICAgIE1ldGhvZGUgKGdsb2JhbGUgVmFyaWFibGUvVWViZXJnYWJlIGFscyBSZWZlcmVueiBhbiBmaWx0ZXIpCisgICAgIHNjaGxhZ2VuIHNpY2ggYWxzbyBpbSBSdWVja2dhYmVhcnJheSBuaWVkZXIuCisKKyAgICAgKDMpIEZ1ZXIgQXJyYXlzIHdpcmt0IGZpbHRlcigpIHdpZSBmaWx0ZXJfYXJyYXkoKSwgZnVlciBNYXBwaW5ncyBzdGVsbHQKKyAgICAgZmlsdGVyKCkgZWluZSBWZXJhbGxnZW1laW5lcnVuZyB2b24gZmlsdGVyX2luZGljZXMoKSBkYXIuCisKK0JFSVNQSUVMOgorICAgICAjIyMgRmlsdGVyZSBhbGxlIExlYmV3ZXNlbiBpbiBlaW5lbSBSYXVtIGluIGVpbiBBcnJheSAjIyMKKyAgICAgZmlsdGVyKGFsbF9pbnZlbnRvcnkodGhpc19vYmplY3QoKSksIydsaXZpbmcpOworCisKKyAgICAgIyMjIEZpbHRlcmUgYWxsZSB0YXViZW4gU3BpZWxlciBpbSBSYXVtIGluIGVpbiBBcnJheSAjIyMKKyAgICAgc3RhdGljIGludCBmaWx0ZXJfaXNkZWFmKG9iamVjdCB3aG8pIHsKKyAgICAgICByZXR1cm4gKGludGVyYWN0aXZlKHdobykgJiYgd2hvLT5RdWVyeVByb3AoUF9ERUFGKSk7CisgICAgIH0KKyAgICAgCisgICAgIGZpbHRlcihhbGxfaW52ZW50b3J5KHRoaXNfb2JqZWN0KCkpLCAjJ2ZpbHRlcl9pc2RlYWYpOworCisKKyAgICAgIyMjIEZpbHRlcm4gdm9uIElkbGVybiAoPj0xIFNla3VuZGUgaWRsZSkgIyMjCisgICAgIC8vIEZvbGdlbmQgaWRlbnRpc2NoZSBSZXN1bHRhdGUsIGFiZXIgYW5kZXJlIEFuc2FldHplOgorCisgICAgICMxOiBudXR6dCBkaWUgRWZ1biBxdWVyeV9pZGxlKCkgYWxzIExmdW4tQ2xvc3VyZSAoaWRlYWwgaGllcikKKyAgICAgICAgIGlkbGVfdXNyID0gZmlsdGVyKHVzZXJzKCksICMncXVlcnlfaWRsZSApOworCisgICAgICMyOiBtaXQgRmlsdGVybWV0aG9kZQorICAgICAgICAgaW50IGNoZWNrX2lmX2lkbGUob2JqZWN0IHVzZXIpIHsKKyAgICAgICAgICAgcmV0dXJuIHF1ZXJ5X2lkbGUodXNlcik7CisgICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICMyYTogZmlsdGVydCBtaXR0ZWxzIGRlciBMZnVuIGltIHNlbGJlbiBPYmpla3QgZGllIElkbGVyIGluIGRhcworICAgICAgICAgICAgICBSdWVja2dhYmVhcnJheQorICAgICAgICAgICAgICBpZGxlX3VzciA9IGZpbHRlcih1c2VycygpLCAiY2hlY2tfaWZfaWRsZSIpOworICAgICAgICAgICAgICBpZGxlX3VzciA9IGZpbHRlcih1c2VycygpLCAiY2hlY2tfaWZfaWRsZSIsIHRoaXNfb2JqZWN0KCkpOworCisgICAgICAgICAjMmI6IHJ1ZnQgZGllIExmdW4gY2hlY2tfaWZfaWRsZSgpIGFscyBMZnVuLUNsb3N1cmUgKEZ1bmt0aW9ucy0KKyAgICAgICAgICAgICAgcG9pbnRlcikKKyAgICAgICAgICAgICAgaWRsZV91c3IgPSBmaWx0ZXIodXNlcnMoKSwgIydjaGVja19pZl9pZGxlICk7CisKKyAgICAgIzM6IG51dHp0IGVpbmUgTGFtYmRhLUNsb3N1cmUgKGxhbmdzYW1lciwgbmljaHQgZnVlciBhbGxlIGxlc2VybGljaCkKKyAgICAgICAgIGlkbGVfdXNyID0gZmlsdGVyKHVzZXJzKCksIGxhbWJkYSgoeyd1fSksICh7IydxdWVyeV9pZGxlLCAndX0pKSk7CisKKyAgICAgIzQ6IGVycmVpY2h0IGRhc3NlbGJlIHdpZSAjMyBtaXQgYmVzc2VyIGxlc2JhcmVyIElubGluZS1DbG9zdXJlCisgICAgICAgICBpZGxlX3VzciA9IGZpbHRlcih1c2VycygpLCBmdW5jdGlvbiBpbnQgKG9iamVjdCB1c2VyKSB7CisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5X2lkbGUodXNlcik7CisgICAgICAgICAgICAgICAgICAgIH0gKTsKKworICAgICAjIyMgRmlsdGVybiB2b24gSWRsZXJuICg+PTIwIFNla3VuZGVuIGlkbGUpIG1pdCBFeHRyYXBhcmFtZXRlciAjIyMKKyAgICAgLy8gRm9sZ2VuZCBpZGVudGlzY2hlIFJlc3VsdGF0ZSwgYWJlciBhbmRlcmUgQW5zYWV0emU6CisKKyAgICAgIzE6IGRpZSBFZnVuIGtvZW5uZW4gd2lyIG5pY2h0IG1laHIgZGlyZWt0IG51dHplbiwgd2VpbCBzaWUKKyAgICAgICAgIGRpZXNlbiBQYXJhbWV0ZXIgbmljaHQgdW50ZXJzdHVldHp0CisgICAgICAgIC8vIGlkbGVfdXNyID0gZmlsdGVyKHVzZXJzKCksICMncXVlcnlfaWRsZSApOworCisgICAgICMyOiBtaXQgc2VwYXJhdGVyIEZpbHRlcm1ldGhvZGUgLi4uIG1pdCBuZXVlbSBQYXJhbWV0ZXIKKyAgICAgICAgIGludCBjaGVja19pZl9pZGxlKG9iamVjdCB1c2VyLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgICAgIHJldHVybiBxdWVyeV9pZGxlKHVzZXIpPmxlbmd0aDsKKyAgICAgICAgIH0KKyAgICAgIAorICAgICAgICAgIzJhOiBmaWx0ZXJ0IG1pdHRlbHMgZGVyIExmdW4gaW0gc2VsYmVuIE9iamVrdCBkaWUgSWRsZXIgaW4gZGFzCisgICAgICAgICAgICAgIFJ1ZWNrZ2FiZWFycmF5IC4uLiBtaXQgZHJpdHRlbSBQYXJhbWV0ZXIhCisgICAgICAgICAgICAgIGlkbGVfdXNyID0gZmlsdGVyKHVzZXJzKCksICJjaGVja19pZl9pZGxlIiwgdGhpc19vYmplY3QoKSwgMjApOworCisgICAgICAgICAjMmI6IHJ1ZnQgZGllIExmdW4gY2hlY2tfaWZfaWRsZSgpIGFscyBMZnVuLUNsb3N1cmUgKEZ1bmt0aW9ucy0KKyAgICAgICAgICAgICAgcG9pbnRlcikKKyAgICAgICAgICAgICAgaWRsZV91c3IgPSBmaWx0ZXIodXNlcnMoKSwgIydjaGVja19pZl9pZGxlLCAyMCk7CisKKyAgICAgIzM6IG51dHp0IGVpbmUgTGFtYmRhLUNsb3N1cmUgKGxhbmdzYW1lciwgbmljaHQgZnVlciBhbGxlIGxlc2VybGljaCkKKyAgICAgICAgIGlkbGVfdXNyID0gZmlsdGVyKHVzZXJzKCksIAorICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYSgoeyd1LCAnbH0pLCAoeyMnPiwoeyMncXVlcnlfaWRsZSwgJ3V9KSwnbH0pKSwgCisgICAgICAgICAgICAgICAgICAgICAgMjApOworCisgICAgICM0OiBlcnJlaWNodCBkYXNzZWxiZSB3aWUgIzMgbWl0IGVpbmVyIGRldXRsaWNoIGJlc3NlciBsZXNiYXJlbgorICAgICAgICAgSW5saW5lLUNsb3N1cmUgKGdlZ2VudWViZXIgTGFtYmRhcyB6dSBlbXBmZWhsZW5kZSBWYXJpYW50ZSk6CisgICAgICAgICBpZGxlX3VzciA9IGZpbHRlcih1c2VycygpLCBmdW5jdGlvbiBpbnQgKG9iamVjdCB1c2VyLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChxdWVyeV9pZGxlKHVzZXIpID4gbGVuZ3RoKTsgCisgICAgICAgICAgICAgICAgICAgICAgfSwgMjApOworCisKK0FlUVVJVkFMRU5aQ09ERSAobmljaHQgZW1wZm9obGVuLCBudXIgenVtIFZlcnN0YWVuZG5pcyEpOgorICAgICBpbnQgaTsKKyAgICAgbWl4ZWQgKnJldDsgbWl4ZWQgKmlucHV0OworCisgICAgIHJldD1hbGxvY2F0ZSgwKTsKKyAgICAgaT1zaXplb2YoaW5wdXQpOworICAgICB3aGlsZShpLS0pCisgICAgICAgaWYob2ItPmZ1bihpbnB1dFtpXSBbLCBleHRyYTEsIGV4dHJhMiwgLi4uXSkpCisgICAgICAgLy8gaWYoZnVuY2FsbChjbCwgaW5wdXRbaV0gWywgZXh0cmExLCBleHRyYTIsIC4uLl0pKQorICAgICAgIC8vIGlmKG1lbWJlcihtYXAsIGlucHV0W2ldKSkKKyAgICAgICAgIHJldCs9KHtpbnB1dFtpXX0pOworCitTSUVIRSBBVUNIOgorICAgICBBcnJheXM6ICAgICAgICBtYXAoRSkKKyAgICAgT2JqZWt0YXJyYXlzOiAgZmlsdGVyX29iamVjdHMoRSksIG1hcF9vYmplY3RzKEUpCisgICAgIE1hcHBpbmdzOiAgICAgIGZpbHRlcl9pbmRpY2VzKEUpLCBtYXBfaW5kaWNlcyhFKQorICAgICAgICAgICAgICAgICAgICB3YWxrX21hcHBpbmcoRSksIG1lbWJlcihFKQorCisgICAgIFNvbnN0aWdlczogICAgIHNvcnRfYXJyYXkoRSksIHVuaXF1ZV9hcnJheSgpCisgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9zZV9hcnJheShFKQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiswOS4wNC4yMDA4LCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL2ZpbHRlci5lbmcgYi9kb2MvZWZ1bi9maWx0ZXIuZW5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMGJlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9maWx0ZXIuZW5nCkBAIC0wLDAgKzEsNDkgQEAKK2ZpbHRlcihFKQorU1lOT1BTSVMKKyAgICAgbWl4ZWQgKmZpbHRlcihtaXhlZCAqYXJyLCBzdHJpbmcgZnVuLCBzdHJpbmd8b2JqZWN0IG9iCisgICAgICAgICAgICAgICAgICAgICAgICAgWywgbWl4ZWQgZXh0cmEsIC4uLl0pCisgICAgIG1peGVkICpmaWx0ZXIobWl4ZWQgKmFyciwgY2xvc3VyZSBjbCBbLCBtaXhlZCBleHRyYSwgLi4uXSkKKyAgICAgbWl4ZWQgKmZpbHRlcihtaXhlZCAqYXJyLCBtYXBwaW5nIG1hcCBbLCBtaXhlZCBleHRyYSwgLi4uXSkKKworREVTQ1JJUFRJT04KKyAgICAgICAgUmV0dXJucyBhbiBhcnJheSBob2xkaW5nIHRoZSBpdGVtcyBvZiBhcnIgZmlsdGVyZWQgdGhyb3VnaAorICAgICAgICBvYi0+ZnVuKGVsZW1lbnQsIGV4dHJhLCAuLi4pLCB0aGUgY2xvc3VyZSBjbCwgb3IgdGhlIG1hcHBpbmcgbWFwLgorICAgICAgICBUaGUgZnVuY3Rpb24gJ2Z1bicgaW4gJ29iJyByZXNwLiB0aGUgY2xvc3VyZSAnY2wnIGlzIGNhbGxlZAorICAgICAgICBmb3IgZWFjaCBlbGVtZW50IGluIGFyciB3aXRoIHRoYXQgZWxlbWVudCBhcyBwYXJhbWV0ZXIuIFRoZQorICAgICAgICBleHRyYSBhbmQgZm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIGluIGVhY2ggY2FsbCBpZiBnaXZlbi4KKyAgICAgICAgVGhlIG1hcHBpbmcgJ21hcCcgaXMgbGlrZXdpc2UgaW5kZXhlZCBieSBlYWNoIGVsZW1lbnQuCisgICAgICAgIElmIG9iLT5mdW4oYXJyW2luZGV4XSwgZXh0cmEpIHJldHVybnMgIT0gMCByZXNwLgorICAgICAgICBtYXBbYXJyW2luZGV4XV0gZXhpc3RzLCB0aGUgZWxlbWVudCBpcyBpbmNsdWRlZCBpbiB0aGUKKyAgICAgICAgcmV0dXJuZWQgYXJyYXkuCisKKyAgICAgICAgSWYgYXJyIGlzIG5vdCBhbiBhcnJheSwgYW4gZXJyb3Igb2NjdXJzLgorCisgICAgICAgIFRoZSBleHRyYSBhcmd1bWVudChzKSBhcmUgb3B0aW9uYWwgYW5kIG11c3Qgbm90IGJlIHByb3RlY3RlZAorICAgICAgICByZWZlcmVuY2VzIGxpa2UgJihpWzBdKS4KKyAgICAgICAgSWYgPG9iPiBpcyBvbWl0dGVkLCBvciBuZWl0aGVyIGEgc3RyaW5nIG5vciBhbiBvYmplY3QsIGl0CisgICAgICAgIGRlZmF1bHRzIHRvIHRoaXNfb2JqZWN0KCkuCisKKyAgICAgICAgU2luY2UgMy4yLjFAMzYsIHRoZSBzZWNvbmQgYXJnIGNhbiBhbHNvIGJlIGEgbWFwcGluZy4gVGhlbgorICAgICAgICBvbmx5IHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXkgd2hpY2ggYmVsb25nIHRvIHRoZSBtYXAgKGFzCisgICAgICAgIGtleXMpIHdpbGwgYmUgcmV0dXJuZWQgKGkuZS4gbWFwW2FycltpbmRleF1dICE9IDApLgorCitFWEFNUExFCisgICAgICAgIGludCBjaGVja19pZl9pZGxlKG9iamVjdCB1c2VyKSB7IHJldHVybiBxdWVyeV9pZGxlKHVzZXIpOyB9CisKKyAgICAgICAgLi4uCisKKyAgICAgICAgb2JqZWN0ICppZGxlX3VzZXJzOworCisgICAgICAgIGlkbGVfdXNlcnMgPSBmaWx0ZXIodXNlcnMoKSwgImNoZWNrX2lmX2lkbGUiKTsKKyAgICAgICAgLyogZXF1aXZhbGVudCBidXQgc21hbGxlciBhbmQgZmFzdGVyICovCisgICAgICAgIGlkbGVfdXNlcnMgPSBmaWx0ZXIodXNlcnMoKSwgIydxdWVyeV9pZGxlICk7CisKKyAgICAgICAgTm93IGlkbGVfdXNlcnMgY29udGFpbnMgYWxsIHVzZXJzIHRoYXQgaGF2ZSBiZWVuIGlkbGUgZm9yIG1vcmUKKyAgICAgICAgdGhhbiAxIHNlY29uZC4KKworU0VFIEFMU086CisgICAgICAgIFNpbWlsYXIgZmlsdGVyOglmaWx0ZXIoRSksIGZpbHRlcl9vYmplY3QoRSksIGZpbHRlcl9pbmRpY2VzKEUpCisgICAgICAgIE1hcHBpbmc6CW1hcChFKSwgbWFwX29iamVjdHMoRSksIG1hcF9pbmRpY2VzKEUpCisgICAgICAgIFJlbGF0ZWQ6CXNvcnRfYXJheShFKSwgdW5pcXVlX2FycmF5KEUpCisKKzI5LjEwLjIwMDYgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vZmlsdGVyX2luZGljZXMgYi9kb2MvZWZ1bi9maWx0ZXJfaW5kaWNlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGZkYWRmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vZmlsdGVyX2luZGljZXMKQEAgLTAsMCArMSwxMTUgQEAKK2ZpbHRlcl9pbmRpY2VzKEUpCisKK0ZVTktUSU9OOgorICAgICBtYXBwaW5nIGZpbHRlcl9pbmRpY2VzKG1hcHBpbmcgbWFwLCBzdHJpbmcgZnVuLCBzdHJpbmd8b2JqZWN0IG9iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWywgbWl4ZWQgZXh0cmEsIC4uLl0pCisgICAgIG1hcHBpbmcgZmlsdGVyX2luZGljZXMobWFwcGluZyBtYXAsIGNsb3N1cmUgY2wgWywgbWl4ZWQgZXh0cmEsIC4uLl0pCisKK1BBUkFNRVRFUjoKKyAgICAgbWFwCS0genUgZmlsdGVybmRlcyBNYXBwaW5nCisgICAgIGZ1bi9jbAktIHp1IHJ1ZmVuZGUgTWV0aG9kZS9DbG9zdXJlCisgICAgIG9iCQktIE9iamVrdC9EYXRlaW5hbWUsIGFuIGRlbSBNZXRob2RlIGdlcnVmZW4gd2VyZGVuIHNvbGwKKyAgICAgZXh0cmEJLSB3ZWl0ZXJlIFBhcmFtZXRlciBmdWVyIE1ldGhvZGUvQ2xvc3VyZQorCitCRVNDSFJFSUJVTkc6CisgICAgIEZpbHRlcnQgZGllIEVsZW1lbnRlIChqZXdlaWxzIFNjaGx1ZXNzZWwpIGF1cyAnbWFwJyBkdXJjaCBkaWUKKyAgICAgTWV0aG9kZSAnZnVuJyBvZGVyIGRpZSBDbG9zdXJlICdjbCcgaW4gZWluIG5ldWVzIE1hcHBpbmcuCisgICAgIEZ1ZXIgamVkZXMgRWxlbWVudCBhdXMgJ21hcCcgd2lyZCAnZnVuJyBvZGVyICdjbCcgbWl0IGRlbSBTY2hsdWVzc2VsIGFscworICAgICBlcnN0ZW0gUGFyYW1ldGVyIFt1bmQgZm9sZ2VuZCBkZW4gb3B0aW9uYWxlbiBFeHRyYS1QYXJhbWV0ZXJuXSBnZXJ1ZmVuLgorCisgICAgIFdlbm4gZGVyIEF1ZnJ1ZgorICAgICAgCW9iLT5mdW4oZWxlbWVudCBbLCBleHRyYTEsIGV4dHJhMiwgLi4uXSkgYnp3LgorICAgICAgIAlmdW5jYWxsKGNsLCBlbGVtZW50IFssIGV4dHJhMSwgZXh0cmEyLCAuLi5dKQorICAgICBhbHMgUnVlY2tnYWJld2VydCAhPTAgenVydWVja2dpYnQgZGFubiB3aXJkIGRlciBTY2hsdWVzc2VsK1dlcnRlIGluIGRhcworICAgICBuZXVlIEFycmF5IGF1Zmdlbm9tbWVuLCBzb25zdCBuaWNodC4KKworICAgICBXZW5uIGF1ZiBkaWUgV2VydGUgenVnZWdyaWZmZW4gd2VyZGVuIG11c3MsIGthbm4gZGFzIE1hcHBpbmcgJ21hcCcKKyAgICAgenVzYWV0emxpY2ggYWxzICdleHRyYSctUGFyYW1ldGVyIHVlYmVyZ2ViZW4gd2VyZGVuLiBBbHRlcm5hdGl2IGthbm4gbWFuCisgICAgIHdhbGtfbWFwcGluZygpIGJlbnV0emVuIHVuZCBkYXMgUnVlY2tnYWJlbWFwcGluZyBzZWxic3QgZXJzdGVsbGVuLgorCisKKyAgICAgVmVyd2VuZHVuZyB2b24gTWV0aG9kZW46CisJV2VubiBiZWkgZGVyIEFuZ2FiZSB2b24gJ2Z1bicga2VpbiBPYmpla3QgJ29iJyBpbiBGb3JtIGVpbmVzIFN0cmluZ3MKKwlvZGVyIE9iamVrdHMgYW5nZWdlYmVuIHdpcmQsIHdpcmQgdGhpc19vYmplY3QoKSBhbmdlbm9tbWVuLgorCisgICAgIFZlcndlbmR1bmcgdm9uIENsb3N1cmVzOgorCUVzIGtvZW5uZW4gc293b2hsIExmdW4tQ2xvc3VyZXMgYWxzIGF1Y2ggTGFtYmRhLUNsb3N1cmVzIHZlcndlbmRldAorCXdlcmRlbi4gTGZ1bi1DbG9zdXJlcyBrb2VubmVuLCB3ZW5uIGltIHNlbGJlbiBPYmpla3Qgdm9yaGFuZGVuIGF1Y2gKKwkncHJpdmF0ZScgb2Rlci91bmQgJ3N0YXRpYycgZGVrbGFyaWVydCBzZWluLCBtdWVzc2VuIGFiZXIgenUgZGVtCisJWmVpdHB1bmt0IGRlciBWZXJ3ZW5kdW5nIGJla2FubnQgc2VpbiAoRnVua3Rpb25zcHJvdG90eXBlbiBiZW51dHplbikuCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIEdlZmlsdGVydGVzIE1hcHBpbmcgbWl0IEZpbHRlcmJlZGluZ3VuZyBlcmZ1ZWxsZW5kZW4gRWxlbWVudGVuLgorCitCRU1FUktVTkdFTjoKKyAgICAgKDEpIEFjaHR1bmcsIGRpZSBFbGVtZW50ZSBpbiAnbWFwJyB3ZXJkZW4gbmljaHQgdGllZiBrb3BpZXJ0LCBzaW5kIHNpZQorICAgICBhbHNvIHNlbGJzdCBBcnJheXMgb2RlciBNYXBwaW5ncywgc28gZnVlaHJ0IGVpbmUgc3BhZXRlcmUgQWVuZGVydW5nIGltCisgICAgIFJ1ZWNrZ2FiZS1NYXBwaW5nIHp1ciBBZW5kZXJ1bmcgaW0gVXJzcHJ1bmdzbWFwcGluZzoKKworICAgICBtYXBwaW5nIG0sbjsKKyAgICAgbT0oWzE6KHsxLDJ9KSwwOih7MiwzLDR9KV0pOworICAgICBuPWZpbHRlcl9pbmRpY2RlcyhtLCAjJyEpOwkJLy8gZmlsdGVydCBhbGxlIEtleXMgIT0wIGhlcmF1cworICAgICBuWzBdWzBdPTg7CisKKyAgICAgZnVlaHJ0IHp1OiBuPShbMDooezgsMyw0fSldKQorICAJCW09KFswOih7OCwzLDR9KSwxOih7MSwyfSldKQorCisgICAgICgyKSBEYXMgS29waWVyZW4gaW4gZGFzIFJ1ZWNrZ2FiZW1hcHBpbmcgZXJmb2xndCBmdWVyIGplZGVzIEVsZW1lbnQgbmFjaAorICAgICBBdXNmdWVocnVuZyBkZXIgRmlsdGVybWV0aG9kZS4gQWVuZGVydW5nZW4gZGVyIFdlcnRlIGltIE1hcHBpbmcgaW4gZGllc2VyCisgICAgIE1ldGhvZGUgKGdsb2JhbGUgVmFyaWFibGUvVWViZXJnYWJlIGFscyBSZWZlcmVueiBhbiBmaWx0ZXJfaW5kaWNlcykKKyAgICAgc2NobGFnZW4gc2ljaCBhbHNvIGltIFJ1ZWNrZ2FiZW1hcHBpbmcgbmllZGVyLgorCitCRUlTUElFTEU6CisgICAgICMjIyBlcmZ1bmRlbmUgTGlzdGUgbWl0IFNwaWVsZXJuIHNhZXViZXJuIC4uLiAjIyMKKyAgICAgbWFwcGluZyB4PShbIFsvaHVtYW46bGlhZmFyXTogIDIwLAorCQkgIFsvZHdhcmY6bWVzaXJpaV06IDUwLAorCQkgIFsvZWxmOnphcm5peWFdOiAgIDQwLAorCQkgIFsvZmVsaW5lOnR1cmJvXTogIDMwXSk7CisKKyAgICAgaW50IGlzX2JhZGd1eShvYmplY3Qgd2hvKSB7CisgICAgICBpZih3aG8tPkluRmlnaHQoKSkgcmV0dXJuIDE7CisgICAgICByZXR1cm4gMDsKKyAgICAgfQorCisgICAgIG1hcHBpbmcgcmVzdWx0PWZpbHRlcl9pbmRpY2VzKHgsICMnaXNfYmFkZ3V5KTsKKyAgICAgLy8gJ3Jlc3VsdCcgZW50aGFlbHQgbnVyIG5vY2gga2FlbXBmZW5kZSBTcGllbGVyCisKKyAgICAgIyMjIGVyZnVuZGVuZSBMaXN0ZSB1ZWJlciBpaHJlIFdlcnRlIHNhZXViZXJuICMjIworICAgICBpbnQgaXNfYmFkZ3V5KG9iamVjdCB3aG8sIG1hcHBpbmcgbSkgeworICAgICAgaWYobVt4XTwzMCkgcmV0dXJuIDE7CisgICAgICByZXR1cm4gMDsKKyAgICAgfQorCisgICAgIG1hcHBpbmcgcmVzdWx0PWZpbHRlcl9pbmRpY2VzKHgsICMnaXNfYmFkZ3V5LCAmeCk7IC8vIFJlZmVyZW56CisgICAgIC8vICdyZXN1bHQnIGVudGhhZWx0IG51ciBTcGllbGVyIG1pdCBXZXJ0ZW4gPj0gMzAKKworQWVRVUlWQUxFTlpDT0RFIChuaWNodCBlbXBmb2hsZW4sIG51ciB6dW0gVmVyc3RhZW5kbmlzISk6CisgICAgIGludCBpLCB3aWR0aDsKKyAgICAgbWFwcGluZyByZXQ7IG1hcHBpbmcgaW5wdXQ7CisgICAgIG1peGVkICppbmRleDsKKworICAgICB3aWR0aD1nZXRfdHlwZV9pbmZvKGlucHV0KVsxXTsKKyAgICAgcmV0PW1fYWxsb2NhdGUoMCwgd2lkdGgpOworICAgICBpbmRleD1tX2luZGljZXMoaW5wdXQpOworICAgICBpPXNpemVvZihpbmRleCk7CisgICAgIHdoaWxlKGktLSkKKyAgICAgICBpZihvYi0+ZnVuKGluZGV4W2ldIFssIGV4dHJhMSwgZXh0cmEyLCAuLi5dKSkKKyAgICAgICAvLyBpZihmdW5jYWxsKGNsLCBpbmRleFtpXSBbLCBleHRyYTEsIGV4dHJhMiwgLi4uXSkpCisgICAgICAgeworICAgICAgICAgaW50IGo7CisgICAgICAgICBqPXdpZHRoOworCisgICAgICAgICB3aGlsZShqLS0pCisgICAgICAgICAgIHJldFtpbmRleFtpXSxqXT1pbnB1dFtpbmRleFtpXSxqXTsKKyAgICAgICB9CisKK1NJRUhFIEFVQ0g6CisgICAgIEFycmF5czoJCWZpbHRlcihFKSwgbWFwKEUpCisgICAgIE9iamVrdGFycmF5czoJZmlsdGVyX29iamVjdHMoRSksIG1hcF9vYmplY3RzKEUpCisgICAgIE1hcHBpbmdzOgkJbWFwX2luZGljZXMoRSkKKworICAgICBTb25zdGlnZXM6CQl3YWxrX21hcHBpbmcoRSksIG1fY29udGFpbnMoRSkKKwkJCW1lbWJlcigpCisJCQltX2luZGljZXMoRSksIG1fdmFsdWVzKEUpCisKKzI5LjEwLjIwMDYgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vZmlsdGVyX29iamVjdHMgYi9kb2MvZWZ1bi9maWx0ZXJfb2JqZWN0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmI2OTIyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vZmlsdGVyX29iamVjdHMKQEAgLTAsMCArMSw1OSBAQAorZmlsdGVyX29iamVjdHMoRSkKKworRlVOS1RJT046CisgICAgIG9iamVjdCAqZmlsdGVyX29iamVjdHMobWl4ZWQgKmFyciwgc3RyaW5nIGZ1biwgWywgbWl4ZWQgZXh0cmEsIC4uLl0pCisKK1BBUkFNRVRFUjoKKyAgICAgYXJyCS0genUgZmlsdGVybmRlcyBBcnJheSB2b24gT2JqZWt0ZW4vT2JqZWt0cGZhZGVuCisgICAgIGZ1bgktIGFuIE9iamVrdGVuIHp1IHJ1ZmVuZGUgTWV0aG9kZQorICAgICBleHRyYQktIHdlaXRlcmUgUGFyYW1ldGVyIGZ1ZXIgTWV0aG9kZQorCitCRVNDSFJFSUJVTkc6CisgICAgIEZpbHRlcnQgZGllIEVsZW1lbnRlIGF1cyAnYXJyJyBkdXJjaCBkZW4gQXVmcnVmIGRlciBNZXRob2RlICdmdW4nIGFuCisgICAgIGplZGVtIGRlciBFbGVtZW50ZSB2b24gJ2FycicuIDAtRWludHJhZWdlIHdlcmRlbiBpZ25vcmllcnQuCisKKyAgICAgV2VubiBkZXIgQXVmcnVmCisJYXJyW25dLT5mdW4oW2V4dHJhMSwgZXh0cmEyLCAuLi5dKQorICAgICBhbHMgUnVlY2tnYWJld2VydCAhPTAgenVydWVja2dpYnQgZGFubiB3aXJkIGRhcyBFbGVtZW50IGluIGRhcyBuZXVlCisgICAgIEFycmF5IGF1Zmdlbm9tbWVuLCBzb25zdCBuaWNodC4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgR2VmaWx0ZXJ0ZXMgQXJyYXkgbWl0IEZpbHRlcmJlZGluZ3VuZyBlcmZ1ZWxsZW5kZW4gT2JqZWt0ZW4uCisKK0JFTUVSS1VOR0VOOgorICAgICBXZXJkZW4gUGZhZGUgYW5nZWdlYmVuLCBzbyB3aXJkIHZlcnN1Y2h0IGVpbiBPYmpla3QgenUgbGFkZW4sIGZhbGxzCisgICAgIGRpZXNlcyBuaWNodCBleGlzdGllcnQuCisKK0JFSVNQSUVMOgorICAgICAvLyBnaWJ0IGFsbGUgdGF1YmVuIFBlcnNvbmVuIHdpZWRlcgorICAgICBkZWFmPWZpbHRlcl9vYmplY3RzKHVzZXJzKCksICJRdWVyeVByb3AiLCBQX0RFQUYpOworCisgICAgIC8vIGdpYnQgYWxsZSBibGluZGVuIFBlcnNvbmVuIHdpZWRlcgorICAgICBibGluZD1maWx0ZXJfb2JqZWN0cyh1c2VycygpLCAiUXVlcnlQcm9wIiwgUF9CTElORCk7CisKKyAgICAgLy8gZmlsdGVydCBhbGxlIE9iamVrdGUgYXVmIGVpbmUgYmVzdGltbXRlIElEICgtPiBwcmVzZW50KQorICAgICBpZG1hdGNoPWZpbHRlcl9vYmplY3RzKGFyciwgImlkIiwgImlyZ2VuZHdhc0lEIik7CisKKyAgICAgLy8gZ2lidCBhbGxlIEF1dG9sb2FkZXIgd2llZGVyCisgICAgIGFsPWZpbHRlcl9vYmplY3RzKGFsbF9pbnZlbnRvcnkodGhpc19wbGF5ZXIoKSksCisgICAgICAgICAgICAgICAgICAgICAgIlF1ZXJ5UHJvcCIsIFBfQVVUT0xPQURPQkopOworCitBZVFVSVZBTEVOWkNPREUgKG5pY2h0IGVtcGZvaGxlbiwgbnVyIHp1bSBWZXJzdGFlbmRuaXMhKToKKyAgICAgaW50IGk7CisgICAgIG9iamVjdCAqcmV0OyBtaXhlZCAqaW5wdXQ7CisKKyAgICAgcmV0PWFsbG9jYXRlKDApOworICAgICBpPXNpemVvZihpbnB1dCk7CisgICAgIHdoaWxlKGktLSkKKyAgICAgICBpZihpbnB1dFtpXS0+ZnVuKFtleHRyYTEsIGV4dHJhMiwgLi4uXSkpCisgICAgICAgICByZXQrPSh7aW5wdXRbaV19KTsKKworU0lFSEUgQVVDSDoKKyAgICAgQXJyYXlzOgkJZmlsdGVyKEUpLCBtYXAoRSkKKyAgICAgT2JqZWt0YXJyYXlzOgltYXBfb2JqZWN0cyhFKQorICAgICBNYXBwaW5nczoJCWZpbHRlcl9pbmRpY2VzKEUpLCBtYXBfaW5kaWNlcyhFKQorCisgICAgIFNvbnN0aWdlczoJCXNvcnRfYXJyYXkoRSksIHVuaXF1ZV9hcnJheSgpCisJCQlhbGlzdCwgdHJhbnNwb3NlX2FycmF5KEUpCisKKzIwLkphbiAyMDA1IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9maW5kX2NhbGxfb3V0IGIvZG9jL2VmdW4vZmluZF9jYWxsX291dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTk0MzM3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vZmluZF9jYWxsX291dApAQCAtMCwwICsxLDQxIEBACitGVU5LVElPTjoKKyAgICAgICAgaW50IGZpbmRfY2FsbF9vdXQoc3RyaW5nIGZ1bmMpCisgICAgICAgIGludCBmaW5kX2NhbGxfb3V0KGNsb3N1cmUgY2wpCisKK0JFU0NIUkVJQlVORzoKKyAgICAgICAgRmluZGV0IGRlbiBlcnN0ZW4gY2FsbF9vdXQoKSBhdWYgZGllIEZ1bmt0aW9uICdmdW5jJyBpbSBha3R1ZWxsZW4gT2JqZWt0CisgICAgICAgIChiencuIGF1ZiBkaWUgQ2xvc3VyZSAnY2wnKSBkZXIgYXVzZ2VmdWVocnQgd2VyZGVuIHNvbGwuCisgICAgICAgIFp1cnVlY2sgZ2VnZWJlbiB3aXJkIGRpZSB2ZXJibGVpYmVuZGUgWmVpdCBiaXMgenVtIEF1ZnJ1ZiBpbiBTZWt1bmRlbi4KKyAgICAgICAgV2VubiBrZWluIGNhbGxfb3V0KCkgZ2VmdW5kZW4gd2lyZCwgd2lyZCAtMSB6dXJ1ZWNrIGdlZ2ViZW4uCisKK0JFSVNQSUVMRToKKyAgICAgICAgLy8gRmluZGV0IHNpY2gga2VpbiBjYWxsX291dCBhdWYgZGllIEZ1bmt0aW9uICdmdW5jJywgc28ga2FubiBlcgorICAgICAgICAvLyBnZXN0YXJ0ZXQgd2VyZGVuLiAoV2ljaHRpZyBmYWxscyBkZXIgY2FsbF9vdXQgbmljaHQgbWVocmZhY2gKKyAgICAgICAgLy8gYXVmZ2VydWZlbiB3ZXJkZW4gc29sbCkuCisgCisgICAgICAgIGlmKGZpbmRfY2FsbF9vdXQoImZ1bmMiKT09LTEpCisgICAgICAgICAgY2FsbF9vdXQoImZ1bmMiLDUpOworCisgICAgICAgIC8vIEFsbGUgY2FsbF9vdXQgYXVmIEZ1bmt0aW9uICdmdW5jJyB3ZXJkZW4gZ2VmdW5kZW4gdW5kIGdlc3RvcHB0LgorICAgICAgICAvLyAoQmVpc3BpZWxzd2Vpc2Ugd2VpbCBlaW4gU3BpZWxlciBkZW4gUmF1bSB2ZXJsYWVzc3Qgb2RlciBzaWNoCisgICAgICAgIC8vIGRpc2Nvbm5lY3RldCkuCisKKyAgICAgICAgd2hpbGUoZmluZF9jYWxsX291dCgiZnVuYyIpID4gLTEpCisgICAgICAgICAgcmVtb3ZlX2NhbGxfb3V0KCJmdW5jIik7CisKKyAgICAgICAgLy8gRGllIFN1Y2hlIG5hY2ggY2FsbF9vdXQoKXMgYXVmIENsb3N1cmVzIGZ1bmt0aW9uaWVydCBudXIsIHdlbm4gZGVyCisgICAgICAgIC8vIGdlbmF1ZSBXZXJ0IGRlciBDbG9zdXJlIGdlc3VjaHQgd2lyZC4KKworICAgICAgICAvLyBEYXMgZnVua3Rpb25pZXJ0OgorICAgICAgICAgICAgY2xvc3VyZSBjbCA9IHN5bWJvbF9mdW5jdGlvbigibWFpbiIsIG9iaik7CisgICAgICAgICAgICBjYWxsX291dChjbCwgMik7CisgICAgICAgICAgICBmaW5kX2NhbGxfb3V0KGNsKTsKKworICAgICAgICAvLyBEYXMgZnVua3Rpb25pZXJ0IG5pY2h0OgorICAgICAgICAgICAgY2FsbF9vdXQoc3ltYm9sX2Z1bmN0aW9uKCJtYWluIiwgb2JqKSwgMik7CisgICAgICAgICAgICBmaW5kX2NhbGxfb3V0KHN5bWJvbF9mdW5jdGlvbigibWFpbiIsIG9iaikpOworCitTSUVIRSBBVUNIOgorICAgICAgICBjYWxsX291dChFKSwgcmVtb3ZlX2NhbGxfb3V0KEUpLCBjYWxsX291dF9pbmZvKEUpCisKKzQuQXVnIDIwMDcgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9lZnVuL2ZpbmRfaW5wdXRfdG8gYi9kb2MvZWZ1bi9maW5kX2lucHV0X3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMjk5YzAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9maW5kX2lucHV0X3RvCkBAIC0wLDAgKzEsMjYgQEAKK1NZTk9QU0lTCisgICAgICAgIGludCBmaW5kX2lucHV0X3RvIChvYmplY3QgcGxheWVyLCBzdHJpbmcgZnVuKTsKKyAgICAgICAgaW50IGZpbmRfaW5wdXRfdG8gKG9iamVjdCBwbGF5ZXIsIGNsb3N1cmUgZnVuKTsKKyAgICAgICAgaW50IGZpbmRfaW5wdXRfdG8gKG9iamVjdCBwbGF5ZXIsIG9iamVjdCBmdW4pOworICAgICAgICBpbnQgZmluZF9pbnB1dF90byAob2JqZWN0IHBsYXllciwgb2JqZWN0IG9iLCBzdHJpbmcgZnVuKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIEZpbmRldCBkZW4genVsZXR6dCBmdWVyIDxwbGF5ZXI+IGdlc3RhcnRldGVuIGlucHV0X3RvKCksIGFiaGFlbmdpZyB2b20KKyAgICAgICAgQXJndW1lbnQgPGZ1bj46CisgICAgICAgICAgLSA8ZnVuPiBpc3QgZWluIFN0cmluZzogZGVyIEZ1bmt0aW9uc25hbWUgZGVzIGlucHV0X3RvKCkgbXVzcyBwYXNzZW4KKyAgICAgICAgICAtIDxmdW4+IGlzdCBlaW4gT2JqZWt0OiBkYXMgT2JqZWt0LCBhbiB3ZWxjaGVzIGRpZSBGdW5rdGlvbiBkZXMKKyAgICAgICAgICAgIGlucHV0X3RvKCkgZ2VidW5kZW4gaXN0LCBtdXNzIHBhc3NlbgorICAgICAgICAgIC0gPGZ1bj4gaXN0IGVpbmUgQ2xvc3VyZTogZGllIGlucHV0X3RvKCkgQ2xvc3VyZSBtdXNzIHBhc3NlbgorICAgICAgICAgIC0gPG9iPiB1bmQgPGZ1bj4gc2luZCBhbmdlZ2ViZW46IHNvd29obCBPYmpla3QgYWxzIGF1Y2gKKyAgICAgICAgICAgIEZ1bmt0aW9uc25hbWUgbXVlc3NlbiBwYXNzZW4uCisKKyAgICAgICAgRGllIEZ1bmt0aW9uIGxpZWZlcnQgLTEsIHdlbm4ga2VpbiBpbnB1dF90bygpIGdlZnVuZGVuIHd1cmRlLCBzb25zdAorICAgICAgICBkaWUgUG9zaXRpb24gaW0gaW5wdXRfdG8oKSBTdGFjayAod29iZWkgMCBkZW4gYWxzIGxldHp0ZXMKKyAgICAgICAgaGluenVnZWZ1ZWd0ZW4gaW5wdXRfdG8oKSBiZXplaWNobmV0KS4KKworQUVOREVSVU5HRU4KKyAgICAgICAgRWluZ2VmdWVocnQgaW4gTERNdWQgMy4yLjkKKworU0lFSEUgQVVDSAorICAgICAgICBpbnB1dF90byhFKSwgaW5wdXRfdG9faW5mbyhFKSwgcmVtb3ZlX2lucHV0X3RvKEUpLAorICAgICAgICBxdWVyeV9pbnB1dF9wZW5kaW5nKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9maW5kX29iamVjdCBiL2RvYy9lZnVuL2ZpbmRfb2JqZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNGYwZDAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9maW5kX29iamVjdApAQCAtMCwwICsxLDIzIEBACitTWU5PUFNJUzoKKyAgICAgICAgb2JqZWN0IGZpbmRfb2JqZWN0KHN0cmluZyBzdHIpCisKK0RFU0NSSVBUSU9OOgorICAgICAgICBGaW5kIGFuIG9iamVjdCB3aXRoIHRoZSBvYmplY3RfbmFtZSBzdHIuIElmIHRoZSBvYmplY3QgaXNuJ3QgbG9hZGVkLAorCWl0IHdpbGwgbm90IGJlIGZvdW5kLgorCitFWEFNUExFOgorICAgICAgICBvYmplY3Qgb2JqOworICAgICAgICBvYmogPSBmaW5kX29iamVjdCgic3RkL3RoaW5nIik7CisgICAgICAgIG9iaiA9IGZpbmRfb2JqZWN0KCJzdGQvdGhpbmcuYyIpOworICAgICAgICBvYmogPSBmaW5kX29iamVjdCgiL3N0ZC90aGluZyIpOworICAgICAgICBvYmogPSBmaW5kX29iamVjdCgiL3N0ZC90aGluZy5jIik7CisgICAgICAgIAorICAgICAgICBBbGwgZm91ciBzdGF0ZW1lbnRzIGFyZSBlcXVhbC4KKworCW9iaiA9IGZpbmRfb2JqZWN0KCIvc3RkL3RoaW5nIzQyIik7CisKKwlyZXR1cm5zIHRoZSBjbG9uZSB3aG9zZSBvYmplY3RfbmFtZSBpcyAic3RkL3RoaW5nIzQyIiwgaWYKKwlpdCBleGlzdHMuCisKK1NFRSBBTFNPOgorICAgICAgICBmaW5kX2xpdmluZyhFKSwgZmluZF9wbGF5ZXIoRSksIG9iamVjdF9uYW1lKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9maXJzdF9pbnZlbnRvcnkgYi9kb2MvZWZ1bi9maXJzdF9pbnZlbnRvcnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTliZTdmZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2ZpcnN0X2ludmVudG9yeQpAQCAtMCwwICsxLDM0IEBACitTWU5PUFNJUworICAgICAgICBvYmplY3QgZmlyc3RfaW52ZW50b3J5KCk7CisgICAgICAgIG9iamVjdCBmaXJzdF9pbnZlbnRvcnkoc3RyaW5nIG9iKTsKKyAgICAgICAgb2JqZWN0IGZpcnN0X2ludmVudG9yeShvYmplY3Qgb2IpOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgTGllZmVydCBkYXMgZXJzdGUgT2JqZWt0IGltIEludmVudG9yeSB2b24gPG9iaj4sIHdvYmVpIDxvYmo+IGVudHdlZGVyCisgICAgICAgIGVpbiBPYmpla3Qgb2RlciBkZXIgTmFtZSBlaW5lcyBPYmpla3RzIGlzdC4gV2VubiA8b2JqPiBuaWNodCBhbmdlZ2ViZW4KKyAgICAgICAgd2lyZCwgd2lyZCBzdGFuZGFyZG1hZXNzaWcgdGhpc19vYmplY3QoKSB2ZXJ3ZW5kZXQuCisKK0JFSVNQSUVMRQorICAgICAgICBEaWVzZSBFZnVuIHZlcndlbmRldCBtYW4gYW0gaGFldWZpZ3N0ZW4gaW0gZm9sZ2VuZGVuIEtvbnRleHQ6CisKKyAgICAgICAgICAgIGZvcihvYmo9Zmlyc3RfaW52ZW50b3J5KGNvbnRhaW5lcik7b2JqO29iaj1uZXh0X2ludmVudG9yeShvYmopKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxpcmdlbmR3ZWxjaGVyIENvZGU+CisgICAgICAgICAgICB9CisKKyAgICAgICAgQUNIVFVORzogV2VubiBkYXMgT2JqZWt0IDxvYmo+IGlubmVyaGFsYiB2b24gPGlyZ2VuZHdlbGNoZXIgQ29kZT4KKyAgICAgICAgYmV3ZWd0IHdpcmQsIGxpZWZlcnQgbmV4dF9pbnZlbnRvcnkoKSBlaW4gT2JqZWt0IGF1cyBkZW0gbmV1ZW4KKyAgICAgICAgSW52ZW50b3J5IHZvbiA8b2JqPi4gQXVjaCBzb2xsdGUgbmV4dF9pbnZlbnRvcnkoKSBuaWNodCBmdWVyCisgICAgICAgIHplcnN0b2VydGUgT2JqZWt0ZSA8b2JqPiBhdWZnZXJ1ZmVuIHdlcmRlbi4gRnVlciBkZW4gRmFsbCwgZGFzcworICAgICAgICA8b2JqPiBiZXdlZ3QgdW5kL29kZXIgemVyc3RvZXJ0IHdpcmQsIGlzdCBmb2xnZW5kZSBMb2VzdW5nCisgICAgICAgIHZvcnp1emllaGVuOgorCisgICAgICAgICAgICBmb3Iob2JqPWZpcnN0X2ludmVudG9yeShjb250YWluZXIpO29iajspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV4dD1uZXh0X2ludmVudG9yeShvYmopOworICAgICAgICAgICAgICAgIDxpcmdlbmR3ZWxjaGVyIENvZGUgbWl0IE1vdmVzIG9kZXIgUmVtb3Zlcz4KKyAgICAgICAgICAgICAgICBvYmo9bmV4dDsKKyAgICAgICAgICAgIH0KKworU0lFSEUgQVVDSAorICAgICAgICBuZXh0X2ludmVudG9yeShFKSwgYWxsX2ludmVudG9yeShFKSwgZW52aXJvbm1lbnQoRSksIGRlZXBfaW52ZW50b3J5KEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9mbG9hdHAgYi9kb2MvZWZ1bi9mbG9hdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA5Y2FjZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2Zsb2F0cApAQCAtMCwwICsxLDEwIEBACitTWU5PUFNJUworICAgICAgICBpbnQgZmxvYXRwKG1peGVkIGFyZykKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIExpZWZlcnQgMSwgd2VubiBkYXMgQXJndW1lbnQgZWluZSBGbGllc3Nrb21tYXphaGwgKGZsb2F0KSBpc3QsCisgICAgICAgIGFuc29uc3RlbiAwLgorCitTSUVIRSBBVUNICisgICAgICAgIGludHAoRSksIG1hcHBpbmdwKEUpLCBzdHJpbmdwKEUpLCBjbG9zdXJlcChFKSwgb2JqZWN0cChFKSwKKyAgICAgICAgcmVmZXJlbmNlcChFKSwgcG9pbnRlcnAoRSksIHN5bWJvbHAoRSksIGNsb25lcChFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vZmxvb3IgYi9kb2MvZWZ1bi9mbG9vcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2I4NWU2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vZmxvb3IKQEAgLTAsMCArMSwxOSBAQAorU1lOT1BTSVMKKyAgICAgICAgZmxvYXQgZmxvb3IoZmxvYXQgYXJnKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIFJ1bmRldCBkYXMgQXJndW1lbnQgPGFyZz4gYWIgYXVmIGRpZSBuYWVjaHN0ZSBnYW56ZSBaYWhsIHVuZCBnaWJ0CisgICAgICAgIGRpZXNlbiBXZXJ0IHp1cnVlY2suIFdlbm4gPGFyZz4gZWluIEludGVnZXIgaXN0LCB3aXJkIGRhcyBSZXN1bHRhdAorICAgICAgICB0cm90emRlbSBhbHMgRmxvYXQgenVydWVja2dlZ2ViZW4uCisKK0JFSVNQSUVMRQorICAgICAgICBmbG9vcig0LjUpICAtLT4gbGllZmVydCA0LjAKKyAgICAgICAgZmxvb3IoLTQuNSkgLS0+IGxpZWZlcnQgLTUuMAorICAgICAgICBmbG9vcig1KSAgICAtLT4gbGllZmVydCA1LjAKKworQUVOREVSVU5HRU4KKyAgICAgICAgRWluZ2VmdWVocnQgaW4gTERNdWQgMy4yLjcuCisgICAgICAgIExETXVkIDMuMi45IGVybGF1YnQgYXVjaCBJbnRlZ2VyIGFscyBBcmd1bWVudGUuCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgYWJzKEUpLCBjZWlsKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9mdW5jYWxsIGIvZG9jL2VmdW4vZnVuY2FsbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmI5ODMzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vZnVuY2FsbApAQCAtMCwwICsxLDEwIEBACitTWU5PUFNJUworICAgICAgICBtaXhlZCBmdW5jYWxsKGNsb3N1cmUgY2wsIG1peGVkIGFyZywgLi4uKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIFdlcnRldCBkaWUgQ2xvc3VyZSAnY2wnIGF1cy4gRGllIEFyZ3VtZW50ZSAnYXJncycgd2VyZGVuIGFscyBBcmd1bWVudGUKKyAgICAgICAgYW4gZGllIENsb3N1cmUgdWViZXJnZWJlbi4gV2VubiAnY2wnIGtlaW5lIENsb3N1cmUgaXN0LCB3aXJkICdjbCcKKyAgICAgICAgenVydWVjayBnZWdlYmVuLgorCitTSUVIRSBBVUNICisgICAgICAgIGFwcGx5KEUpLCBxdW90ZShFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vZnVuY3Rpb25fZXhpc3RzIGIvZG9jL2VmdW4vZnVuY3Rpb25fZXhpc3RzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZjJkYTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9mdW5jdGlvbl9leGlzdHMKQEAgLTAsMCArMSwxNCBAQAorU1lOT1BTSVMKKyAgICAgICAgc3RyaW5nIGZ1bmN0aW9uX2V4aXN0cyhzdHJpbmcgc3RyLCBvYmplY3Qgb2IpCisKK0RFU0NSSVBUSU9OCisgICAgICAgIFJldHVybiB0aGUgZmlsZSBuYW1lIG9mIHRoZSBvYmplY3QgdGhhdCBkZWZpbmVzIHRoZSBmdW5jdGlvbgorICAgICAgICBzdHIgaW4gb2JqZWN0IG9iLiBUaGUgcmV0dXJuZWQgdmFsdWUgY2FuIGJlIG90aGVyIHRoYW4KKyAgICAgICAgb2JqZWN0X25hbWUob2IpIGlmIHRoZSBmdW5jdGlvbiBpcyBkZWZpbmVkIGluIGFuIGluaGVyaXRlZAorICAgICAgICBvYmplY3QuIEluICFjb21wYXQgbW9kZSwgdGhlIHJldHVybmVkIG5hbWUgYWx3YXlzIGJlZ2lucyB3aXRoIGEKKyAgICAgICAgJy8nIChhYnNvbHV0ZSBwYXRoKS4gMCBpcyByZXR1cm5lZCBpZiB0aGUgZnVuY3Rpb24gd2FzIG5vdAorICAgICAgICBkZWZpbmVkLCBvciB3YXMgZGVmaW5lZCBhcyBzdGF0aWMgKHByb3RlY3RlZCBmdW5jdGlvbiBvbiB0aGUKKyAgICAgICAgb3RoZXIgaGFuZCBhcmUgZm91bmQpLgorCitTRUUgQUxTTworICAgICAgICBjYWxsX290aGVyKEUpLCBjYWxsX3Jlc29sdmVkKEUpLCBmdW5jdGlvbmxpc3QoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL2Z1bmN0aW9ubGlzdCBiL2RvYy9lZnVuL2Z1bmN0aW9ubGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmYyY2JhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vZnVuY3Rpb25saXN0CkBAIC0wLDAgKzEsNTUgQEAKK0dFU0NIVUVUWlQKK1NZTk9QU0lTCisgICAgICAgICNpbmNsdWRlIDxzeXMvZnVuY3Rpb25saXN0Lmg+CisgICAgICAgICNpbmNsdWRlIDxzeXMvbHBjdHlwZXMuaD4KKworICAgICAgICBtaXhlZCAqZnVuY3Rpb25saXN0KG9iamVjdCBvYiwgaW50IGZsYWdzID0gUkVUVVJOX0ZVTkNUSU9OX05BTUUpCisKK0JFU0NIUkVJQlVORworICAgICAgICBMaWVmZXJ0IGVpbiBBcnJheSBtaXQgSW5mb3JtYXRpb25lbiB6dSBkZW4gTGZ1bnMgdm9uIDxvYj4uIEZ1ZXIgamVkZQorICAgICAgICBGdW5rdGlvbiB3ZXJkZW4gMSBiaXMgNCBXZXJ0ZSAoYWJoYWVuZ2lnIHZvbiA8ZmxhZ3M+KSBpbiBkYXMgRXJnZWJuaXMKKyAgICAgICAgZWluZ2V0cmFnZW4sIHVuZCB6d2FyIGluIGZvbGdlbmRlciBSZWloZW5mb2xnZToKKyAgICAgICAgICAtIGRlciBOYW1lIGRlciBGdW5rdGlvbgorICAgICAgICAgIC0gZGllIEZsYWdzIGRlciBGdW5rdGlvbiAodmVyZ2xlaWNoZSB3ZWl0ZXIgdW50ZW4pCisgICAgICAgICAgLSBkZW4gUnVlY2tnYWJldHlwIChhdWZnZWxpc3RldCBpbiBtdWRsaWIvc3lzL2xwY3R5cGVzLmgpCisgICAgICAgICAgLSBkaWUgQW56YWhsIEFyZ3VtZW50ZSwgZGllIGRpZSBGdW5rdGlvbiBha3plcHRpZXJ0LgorCisgICAgICAgIDxvYj4ga2FubiBhbHMgZWNodGVzIE9iamVrdCBvZGVyIGFscyBPYmpla3RuYW1lIHVlYmVyZ2ViZW4gd2VyZGVuLiBJbQorICAgICAgICB6d2VpdGVuIEZhbGwgdmVyc3VjaHQgZGllIEVmdW4gbmljaHQsIGRhcyBPYmpla3Qgdm9yaGVyIHp1IGxhZGVuLgorCisgICAgICAgIDxmbGFncz4gYmVzdGltbXQgc293b2hsLCB3ZWxjaGUgSW5mb3JtYXRpb25lbiBpbSBFcmdlYm5pcyBnZXNhbW1lbHQKKyAgICAgICAgd2VyZGVuLCBhbHMgYXVjaCwgZnVlciB3ZWxjaGUgRnVua3Rpb25lbiBkaWUgUHJ1ZWZ1bmcgZHVyY2hnZWZ1ZWhydAorICAgICAgICB3aXJkLiBEZXIgV2VydCB2b24gPGZsYWdzPiB3aXJkIGR1cmNoIGJpbmFlcmUgVmVyb2RlcnVuZyBmb2xnZW5kZXIKKyAgICAgICAgS29uc3RhbnRlbiBhdXMgbXVkbGliL3N5cy9mdW5jdGlvbmxpc3QuaCBmZXN0Z2VsZWd0OgorCisgICAgICAgIEZlc3RsZWdlbiBkZXIgZ2VzYW1tZWx0ZW4gSW5mb3JtYXRpb246CisgICAgICAgICAgICBSRVRVUk5fRlVOQ1RJT05fTkFNRSAgICAgICAgbGllZmVydCBkZW4gRnVua3Rpb25zbmFtZW4KKyAgICAgICAgICAgIFJFVFVSTl9GVU5DVElPTl9GTEFHUyAgICAgICBsaWVmZXJ0IGRpZSBGbGFzIGRlciBGdW5rdGlvbgorICAgICAgICAgICAgUkVUVVJOX0ZVTkNUSU9OX1RZUEUgICAgICAgIGxpZWZlcnQgZGVuIFJ1ZWNrZ2FiZXR5cCBkZXIgRnVua3Rpb24KKyAgICAgICAgICAgIFJFVFVSTl9GVU5DVElPTl9OVU1BUkcgICAgICBsaWVmZXJ0IGRpZSBBbnphaGwgbW9lZ2xpY2hlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ3VtZW50ZS4KKworICAgICAgICAgICAgUkVUVVJOX0ZVTkNUSU9OX0FSR1RZUEUgICAgIGlzdCBkZWZpbmllcnQsIGFiZXIgbmljaHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRpZXJ0LgorCisgICAgICAgIEZlc3RsZWdlbiBkZXIgZ2VwcnVlZnRlbiBGdW5rdGlvbmVuOgorICAgICAgICAgICAgTkFNRV9JTkhFUklURUQgICAgICBnZWVyYnRlIEZ1bmt0aW9uZW4gbmljaHQgYmVhY2h0ZW4KKyAgICAgICAgICAgIFRZUEVfTU9EX1NUQVRJQyAgICAgc3RhdGljIGRla2xhcmllcnRlIEZ1bmt0aW9uIG5pY2h0IGJlYWNodGVuCisgICAgICAgICAgICBUWVBFX01PRF9QUklWQVRFICAgIHByaXZhdGUgZGVrbGFyaWVydGUgRnVua3Rpb25lbiBuaWNodCBiZWFjaHRlbgorICAgICAgICAgICAgVFlQRV9NT0RfUFJPVEVDVEVEICBwcm90ZWN0ZWQgZGVrbGFyaWVydGUgRnVua3Rpb25lbiBuaWNodAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWFjaHRlbgorICAgICAgICAgICAgTkFNRV9ISURERU4gICAgICAgICBudXIgYmVhY2h0ZW4sIHdlbm4gc2ljaHRiYXIgZHVyY2ggVmVyZXJidW5nCisKKyAgICAgICAgPGZsYWdzPiBiZXN0ZWh0IGF1cyBkZXIgYmluYWVyZW4gVmVyb2RlcnVuZyBkZXIgb2JlbiBnZW5hbm50ZW4gRmxhZ3MsCisgICAgICAgIHp1c2FtbWVuIG1pdCBkZW4gZm9sZ2VuZGVuOgorICAgICAgICAgICAgVFlQRV9NT0RfVkFSQVJHUyAgICBkaWUgRnVua3Rpb24gaXN0IHZhcmFyZ3MgZGVrbGFyaWVydAorICAgICAgICAgICAgTkFNRV9VTkRFRklORUQgICAgICBkaWUgRnVua3Rpb24gaXN0IG5vY2ggbmljaHQgZGVmaW5pZXJ0LCBhYmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW56aWVydAorICAgICAgICAgICAgTkFNRV9DUk9TU19ERUZJTkVEICBkaWUgRnVua3Rpb24gaXN0IGRlZmluaWVydCwgdW0gaW4gZWluZW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kZXJlbiBQcm9ncmFtbSB2ZXJ3ZW5kZXQgenUgd2VyZGVuCisgICAgICAgICAgICBUWVBFX01PRF9OT01BU0sgICAgIGRpZSBGdW5rdGlvbiBpc3Qgbm9tYXNrIGRla2xhcmllcnQKKyAgICAgICAgICAgIFRZUEVfTU9EX1BVQkxJQyAgICAgZGllIEZ1bmt0aW9uIGlzdCBwdWJsaWMgZGVrbGFyaWVydAorCitTSUVIRSBBVUNICisgICAgICAgIGluaGVyaXRfbGlzdChFKSwgZnVuY3Rpb25fZXhpc3RzKEUpLCB2YXJpYWJsZV9saXN0KEUpLAorICAgICAgICBjYWxsX3Jlc29sdmVkKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9nYXJiYWdlX2NvbGxlY3Rpb24gYi9kb2MvZWZ1bi9nYXJiYWdlX2NvbGxlY3Rpb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM2YTczOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2dhcmJhZ2VfY29sbGVjdGlvbgpAQCAtMCwwICsxLDIyIEBACitHRVNDSFVFVFpUCitTWU5PUFNJUworICAgICAgICB2b2lkIGdhcmJhZ2VfY29sbGVjdGlvbigpOworICAgICAgICB2b2lkIGdhcmJhZ2VfY29sbGVjdGlvbihzdHJpbmcgZmlsZW5hbWUpOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgQmVmaWVobHQgZGVtIFRyZWliZXIsIG5hY2ggRW5kZSBkZXIgYWt0dWVsbGVuIEF1c2Z1ZWhydW5nIGVpbmUKKyAgICAgICAgR2FyYmFnZSBDb2xsZWN0aW9uIHp1IGJlZ2lubmVuLiBKZSBuYWNoZGVtLCB3ZWxjaGVyIE1lbW9yeSBBbGxvY2F0b3IKKyAgICAgICAgdmVyd2VuZGV0IHdpcmQsIGlzdCBkaWUgR2FyYmFnZSBDb2xsZWN0aW9uIG1laHIgb2RlciB3ZW5pZ2VyCisgICAgICAgIGdydWVuZGxpY2guCisKKyAgICAgICAgV2lyZCBkZXIgc21hbGxvYyBNZW1vcnkgQWxsb2NhdG9yIHZlcndlbmRldCwgZXJ6ZXVndCBHQyBlaW5lbiBPdXRwdXQKKyAgICAgICAgaW4gZWluZW0gTG9nZmlsZS4gRGVyIFN0YW5kYXJkbmFtZSBmdWVyIGRhcyBMb2dmaWxlIHdpcmQgYmVpbQorICAgICAgICBQcm9ncmFtbXN0YXJ0IGZlc3RnZWxlZ3QsIGthbm4gYWJlciB6dXIgTGF1ZnplaXQgdmVyYWVuZGVydCB3ZXJkZW4sCisgICAgICAgIHdlbm4gZGFzIEFyZ3VtZW50IDxmaWxlbmFtZT4gYW5nZWdlYmVuIGlzdC4gRGVyIExvZy1PdXRwdXQgd2lyZCBpbgorICAgICAgICBkaWVzZW0gRmFsbCBhbiBkYXMgYmV6ZWljaG5ldGUgTG9nZmlsZSBhbmdlZnVlZ3QuCisKKyAgICAgICAgRnVlciBhbmRlcmUgTWVtb3J5IEFsbG9jYXRvcnMgZXJ6ZXVndCBnYXJiYWdlX2NvbGxlY3Rpb24oKSBrZWluZW4KKyAgICAgICAgT3V0cHV0LiBFaW4gYWxsZmFlbGxpZ2VzIEFyZ3VtZW50IDxmaWxlbmFtZT4gd2lyZCBpZ25vcmllcnQuCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgcnVzYWdlKEUpLCB2YWxpZF93cml0ZShNKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vZ2V0X2RpciBiL2RvYy9lZnVuL2dldF9kaXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE0Mjg4YQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2dldF9kaXIKQEAgLTAsMCArMSwxMTMgQEAKK1NZTk9QU0lTCisgICAgICAgICNpbmNsdWRlIDxmaWxlcy5oPgorCisgICAgICAgIG1peGVkICpnZXRfZGlyKHN0cmluZyBzdHIpCisgICAgICAgIG1peGVkICpnZXRfZGlyKHN0cmluZyBzdHIsIGludCBtYXNrKQorCitCRVNDSFJFSUJVTkcKKyAgICAgICAgQmVub2V0aWd0IGVpbmVuIFBmYWQgYWxzIGVyc3RlcyBBcmd1bWVudCB1bmQgbGllZmVydCBlaW4gRmVsZAorICAgICAgICAoQXJyYXkpIG1pdCBEYXRlaW5hbWVuIGJ6dy4gRWlnZW5zY2hhZnRlbiBkZXIgZ2VmdW5kZW5lbiBEYXRlaWVuIGltCisgICAgICAgIGFuZ2VnZWJlbmVuIFZlcnplaWNobmlzLgorCisgICAgICAgIExpZWZlcnQgMCB6dXJ1ZWNrLCB3ZW5uIGVzIGRhcyBWZXJ6ZWljaG5pcywgaW4gZGVtIGdlc3VjaHQgd2VyZGVuCisgICAgICAgIHNvbGwsIG5pY2h0IGdpYnQuCisKKyAgICAgICAgRGVyIERhdGVpbmFtZW4tVGVpbCBkZXMgUGZhZGVzIGRhcmYgIioiIHVuZCAiPyIgYWxzIFBsYXR6aGFsdGVyCisgICAgICAgIGVudGhhbHRlbjogamVkZXIgIioiIHN0ZWh0IGZ1ZXIgZWluZSBiZWxpZWJpZ2UgQW56YWhsIFplaWNoZW4gKG9kZXIKKyAgICAgICAgc2ljaCBzZWxiZXIpLCAiPyIgZnVlciBlaW4gYmVsaWViaWdlcyBaZWljaGVuLiBFbnRzcHJlY2hlbmQgbGllZmVydAorICAgICAgICBnZXRfZGlyKCIvcGZhZC8qIikgZWluIGFscGhhYmV0aXNjaCBzb3J0aWVydGVzIEZlbGQgYWxsZXIgRGF0ZWllbgorICAgICAgICBpbSBWZXJ6ZWljaG5pcyAiL3BmYWQiIG9kZXIgKHsgIi9wZmFkLyoiIH0pLCB3ZW5uIGVzIGRpZXNlIERhdGVpCisgICAgICAgIGdlYmVuIHNvbGx0ZS4KKworICAgICAgICBHaWJ0IG1hbiBkZW4gUGZhZCBlaW5lcyBWZXJ6ZWljaG5pc3NlcyBtaXQgYWJzY2hsaWVzc2VuZGVtICIvIiBvZGVyCisgICAgICAgICIvLiIgYW4gKHouIEIuIGdldF9kaXIoIi9wZmFkLy4iKSksIHNvIGVyaGFlbHQgbWFuIGRlbiBJbmhhbHQgZGVzCisgICAgICAgIFZlcnplaWNobmlzc2VzLiBVbSBJbmZvcm1hdGlvbmVuIHVlYmVyIGRhcyBWZXJ6ZWljaG5pcyBzZWxiZXIgenUKKyAgICAgICAgZXJoYWx0ZW4sIG11c3MgbWFuIGRlbiBQZmFkIGRlcyBWZXJ6ZWljaG5pc3NlcyBhbmdlYmVuLgorCisgICAgICAgIERhcyBvcHRpb25hbGUgendlaXRlIEFyZ3VtZW50IGlzdCBlaW5lIEJpdG1hc2tlLCBtaXQgZGVyIG1hbgorICAgICAgICBhbmdlYmVuIGthbm4sIHdlbGNoZSBJbmZvcm1hdGlvbmVuIG1hbiB1ZWJlciBkaWUgYW5nZWdlYmVuZW4KKyAgICAgICAgRGF0ZWllbiBlcmhhbHRlbiBtb2VjaHRlLgorCisgICAgICAgIEdFVERJUl9FTVBUWSAgICAoMHgwMCkgIGdldF9kaXIoKSBsaWVmZXJ0IGVpbiBsZWVyZXMgRmVsZCAobmljaHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lya2xpY2ggc2lubnZvbGwpCisgICAgICAgIEdFVERJUl9OQU1FUyAgICAoMHgwMSkgIGxpZWZlcnQgZGllIGFscGhhYmV0aXNjaCBzb3J0aWVydGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGVpbmFtZW4uCisgICAgICAgIEdFVERJUl9TSVpFUyAgICAoMHgwMikgIGxpZWZlcnQgZGllIHVuc29ydGllcnRlbiBEYXRlaWdyb2Vzc2VuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlX3NpemUoKSksIFZlcnplaWNobmlzc2UgaGFiZW4gZGllCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGVpZ3JvZXNzZSBGU0laRV9ESVIgKC0yKS4KKyAgICAgICAgR0VURElSX0RBVEVTICAgICgweDA0KSAgbGllZmVydCBkaWUgdW5zb3J0aWVydGVuIFplaXRlbiBkZXIgamV3ZWlscworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXR6dGVuIEFlbmRlcnVuZyBpbiBTZWt1bmRlbiBzZWl0IGRlbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMS4wMS4xOTcwLgorICAgICAgICBHRVRESVJfQUNDRVNTICAgKDB4NDApICBsaWVmZXJ0IGRpZSB1bnNvcnRpZXJ0ZW4gWmVpdGVuIGRlcyBqZXdlaWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldHp0ZW4gWnVncmlmZmVzIGluIFNla3VuZGVuIHNlaXQgZGVtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAxLjAxLjE5NzAuCisgICAgICAgIEdFVERJUl9NT0RFUyAgICAoMHg4MCkgIGxpZWZlcnQgZGllIEZpbGVtb2RlLU1hc2tlCisKKyAgICAgICAgR0VURElSX0FMTCAgICAgICgweERGKSAgTGllZmVydCBhbGwgV2VydGUgenVydWVjay4KKworICAgICAgICBHRVRESVJfUEFUSCAgICAgKDB4MTApICBEYXRlaW5hbWVuIHdlcmRlbiBhbHMgdm9sbGUgUGZhZGUgZ2VsaWVmZXJ0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZWluIGV2LiBmZWhsZW5kZXMgR0VURElSX05BTUVTIHdpcmQgYWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvcmhhbmRlbiBhbmdlbm9tbWVuKS4KKyAgICAgICAgR0VURElSX1VOU09SVEVEICgweDIwKSAgRGFzIEVyZ2VibmlzIHdpcmQgbmljaHQgc29ydGllcnQuCisKKyAgICAgICAgV2ljaHRpZzogTWFuIG11c3MgR0VURElSX05BTUVTfEdFVERJUl9VTlNPUlRFRCB2ZXJ3ZW5kZW4sIHdlbm4gbWFuCisgICAgICAgIGRpZSBFaW50cmFlZ2UgaW4gZGVyIHNlbGJlbiBSZWloZW5mb2xnZSB3aWUgYmVpIEdFVERJUl9TSVpFUyB1bmQKKyAgICAgICAgR0VURElSX0RBVEVTIGhhYmVuIG1vZWNodGUuCisKKyAgICAgICAgRGllIEVpbnRyYWVnZSBpbiBkZXIgQml0bWFza2Uga29lbm5lbiBtaXRlaW5hbmRlciBrb21iaW5pZXJ0CisgICAgICAgIHdlcmRlbi4KKworQkVJU1BJRUxFCisgICAgICAgIEZ1bmt0aW9uICAgICAgICAgICAgICAgICAgICAgICAgIFJ1ZWNrZ2FiZXdlcnQKKyAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBnZXRfZGlyKCIvb2JqLy4iKSAgICAgICAgICAgICAgICBBbGxlIERhdGVpZW4sIGRpZSBpbSBWZXJ6ZWljaG5pcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvb2JqIGVudGhhbHRlbiBzaW5kLgorICAgICAgICBnZXRfZGlyKCIvb2JqLyIpICAgICAgICAgICAgICAgICBXaWUgZ2V0X2RpcigiL29iai8iKS4KKworICAgICAgICBnZXRfZGlyKCIvb2JqL2ZhY2tlbC5jIikgICAgICAgICh7ICJmYWNrZWwuYyIgfSksIHNvZmVybgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvb2JqL2ZhY2tlbC5jIGV4aXN0aWVydCAoYWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGVpIG9kZXIgVmVyemVpY2huaXMpLCBhbnNvbnN0ZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9KSwgc29mZXJuIC9vYmogZWluIFZlcnplaWNobmlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzdCwgYW5zb25zdGVuIDAuCisKKyAgICAgICAgZ2V0X2RpcigiL29iai8qIikgICAgICAgICAgICAgICAgKHsgIioiIH0pLCBzb2Zlcm4gKiBleGlzdGllcnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuc29uc3RlbiB1bmQgbm9ybWFsZXJ3ZWlzZSBlaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFiZXRpc2NoIHNvcnRpZXJ0ZXMgRmVsZCBtaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVuIE5hbWVuIGFsbGVyIERhdGVpZW4gdW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnplaWNobmlzc2UgaW4gL29iaiwgc29mZXJuIC9vYmoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWluIFZlcnplaWNobmlzIGlzdCwgYW5zb25zdGVuIDAuCisKKyAgICAgICAgZ2V0X2RpcigiL29iai9mYWNrZWwuYyIsIEdFVERJUl9TSVpFUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHsgPEdyb2Vzc2Ugdm9uIC9vYmovZmFja2VsLmM+IH0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2Zlcm4gL29iai9mYWNrZWwuYyBleGlzdGllcnQuCisgICAgICAgIGdldF9kaXIoIi9vYmovLiIsIEdFVERJUl9OQU1FUykgIFdpZSBnZXRfZGlyKCIvb2JqLy4iKS4KKyAgICAgICAgZ2V0X2RpcigiL29iai8uIiwgR0VURElSX1NJWkVTKSAgRWluIHVuc29ydGllcnRlcyBGZWxkIG1pdCBkZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvZXNzZW4gZGVyIERhdGVpZW4gaW4gL29iai4KKyAgICAgICAgZ2V0X2RpcigiL29iai8uIiwgR0VURElSX05BTUVTfEdFVERJUl9TSVpFU3xHRVRESVJfREFURVMpCisgICAgICAgICAgICBvZGVyIGt1ZXJ6ZXIKKyAgICAgICAgZ2V0X2RpcigiL29iai8uIiwgR0VURElSX0FMTCkgICAgRWluIGVpbmRpbWVuc2lvbmFsZXMgdW5kIG5hY2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZW4gc29ydGllcnRlcyBGZWxkLCBkYXMgZnVlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZWRlIERhdGVpIGluIC9vYmogZGVuIE5hbWVuLCBkaWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvZXNzZSB1bmQgZGVuIFplaXRwdW5rdCBkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0enRlbiBBZW5kZXJ1bmcgZW50aGFlbHQsIHouQi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJheHQuYyIgICAgLCAgOTI3LCA5OTQ1Mzk1ODMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFja2VsLmMiLCAxMjgzLCA5OTgxNTM5MDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS4KKworICAgICAgICBnZXRfZGlyKCIvb2JqL2ZhY2tlbC5jIiwgR0VURElSX05BTUVTfEdFVERJUl9QQVRIKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeyAiL29iai9mYWNrZWwuYyIgfSksIHNvZmVybgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3JoYW5kZW4uCisgICAgICAgIGdldF9kaXIoIi9vYmovZmFja2VsLmMiLCBHRVRESVJfUEFUSCkgIEt1cnpmb3JtIGRhZnVlci4KKworICAgICAgICB0cmFuc3Bvc2VfYXJyYXkoKHsgZ2V0X2RpcihzdHIsIEdFVERJUl9OQU1FU3xHRVRESVJfVU5TT1JURUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgLCBnZXRfZGlyKHN0ciwgR0VURElSX1NJWkVTKQorICAgICAgICAgICAgICAgICAgICAgICAgICwgZ2V0X2RpcihzdHIsIEdFVERJUl9EQVRFUykgfSkpOworICAgICAgICBMaWVmZXJ0IGVpbiB1bnNvcnRpZXJ0ZXMgRmVsZCBtaXQgRmVsZGVybiwgdm9uIGRlbmVuIGVpbiBqZWRlcworICAgICAgICBOYW1lLCBHcm9lc3NlIHVuZCBaZWl0IGVpbmVyIERhdGVpIGVudGhhZWx0LCB6LiBCLgorICAgICAgICAoeworICAgICAgICAgICAgKHsgImZhY2tlbC5jIiwgMTI4MywgOTk4MTUzOTAzIH0pLAorICAgICAgICAgICAgKHsgImF4dC5jIiAgICAsICA5MjcsIDk5NDUzOTU4MyB9KSwKKyAgICAgICAgICAgIH0pLgorU0lFSEUgQVVDSAorICAgICAgICBjYXQoRSksIG1rZGlyKEUpLCBybWRpcihFKSwgZmlsZV9zaXplKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9nZXRfZXJyb3JfZmlsZSBiL2RvYy9lZnVuL2dldF9lcnJvcl9maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5N2U1MjMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9nZXRfZXJyb3JfZmlsZQpAQCAtMCwwICsxLDIxIEBACitTWU5PUFNJUworICAgICAgICBtaXhlZCAqIGdldF9lcnJvcl9maWxlKHN0cmluZyBuYW1lLCBpbnQgc2V0X2ZvcmdldF9mbGFnKQorCitERVNDUklQVElPTgorICAgICAgICBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxhc3QgZXJyb3Igd2hpY2ggb2NjdXJlZCBmb3IKKyAgICAgICAgPG5hbWU+ICh3aGVyZSA8bmFtZT4gaXMgYSB2YWxpZCBuYW1lIGZyb20gdGhlIHdpeiBsaXN0KS4KKworICAgICAgICBSZXN1bHQgaXMgYW4gYXJyYXkgb2YgZm91ciBlbGVtZW50czogdGhlIGZpbGVuYW1lIG9mIHRoZQorICAgICAgICBwcm9ncmFtIHdoZXJlIHRoZSBlcnJvciBvY2N1cmVkLCB0aGUgbGluZW51bWJlciBpbiB0aGUKKyAgICAgICAgcHJvZ3JhbSwgdGhlIGVycm9yIG1lc3NhZ2UgKHJ1bnRpbWUgZXJyb3IgbWVzc2FnZXMgdXN1YWxseQorICAgICAgICBzdGFydCB3aXRoIGEgJyonKSwgYW5kIGEgbnVtZXJpY2FsIGZsYWcgKHRoZSAnZm9yZ2V0IGZsYWcnKSBpZgorICAgICAgICB0aGUgZXJyb3IgaW5mb3JtYXRpb24gaGFzIGJlZW4gcXVlcmllZCBhbHJlYWR5LgorCisgICAgICAgIElmIHRoZXJlIGlzIG5vIGVycm9yIHN0b3JlZCBmb3IgdGhlIGdpdmVuIDxuYW1lPiwgMCBpcworICAgICAgICByZXR1cm5lZC4KKworICAgICAgICBJZiA8c2V0X2ZvcmdldF9mbGFnPiBpcyBub24temVybywgdGhlICdmb3JnZXQnIGZsYWcgaXMgc2V0CisgICAgICAgIGZvciB0aGUgZXJyb3IgbWVzc2FnZSBhZnRlciBpdCBoYXMgYmVlbiByZXR1cm5lZC4KKworU0VFIEFMU08KKyAgICAgICAgZWQoRSksIHZhbGlkX3JlYWQoTSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL2dldF9ldmFsX2Nvc3QgYi9kb2MvZWZ1bi9nZXRfZXZhbF9jb3N0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYmMwMTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9nZXRfZXZhbF9jb3N0CkBAIC0wLDAgKzEsMzMgQEAKK0ZVTktUSU9OOgorICAgICAgICBpbnQgZ2V0X2V2YWxfY29zdCh2b2lkKQorCitCRVNDSFJFSUJVTkc6CisgICAgICAgIExpZWZlcnQgZGllIG5vY2ggdmVyYmxlaWJlbmRlbiBFdmFsIEtvc3RlbiwgZGllIGRhcyBtb21lbnRhbmUKKyAgICAgICAgS29tbWFuZG8gbm9jaCB2ZXJicmF1Y2hlbiBkYXJmLgorICAgICAgICBEZXIgTWF4aW1hbHdlcnQgYmV0cmFlZ3QgenVyIFplaXQgMS41MDAuMDAwIFRpY2tzIChTdGFuZDogMjAwNykuIAorCisgICAgICAgIFNvbGx0ZW4gZGllIEtvc3RlbiBiZWkgZGVyIEF1c2Z1ZWhydW5nIGlyZ2VuZHdvIGdyb2Vzc2VyIHdlcmRlbiwKKyAgICAgICAgd2lyZCBlaW4gRmVobGVyIGRlciBBcnQgInRvbyBsb25nIGV2YWwiIGVyemV1Z3QuIERpZXNlIEZ1bmt0aW9uCisgICAgICAgIGRpZW50IGRhenUsIHNvbGNoZSBGZWhsZXIgZ2VuYXUgenUgbG9rYWxpc2llcmVuIGJ6dy4gCisgICAgICAgIGhlcmF1c3p1ZmluZGVuLCBhbiB3ZWxjaGVuIFN0ZWxsZW4gaW0gQ29kZSB3aWV2aWVsIFJlY2hlbnplaXQgCisgICAgICAgIHZlcmJyYXVjaHQgd2lyZC4KKyAgICAgICAgCitCRUlTUElFTEUKKyAgICAgICAgdm9pZCBmb28oKQorICAgICAgICB7CisgICAgICAgICAgaW50IHByZXYsIHVzZWQsIGk7CisgICAgICAgICAgCisgICAgICAgICAgcHJldj1nZXRfZXZhbF9jb3N0KCk7IC8vIE1lcmtlbiwgd2FzIGJpcyBoaWVyaGluIHZlcmJyYXVjaHQgd3VyZGUgCisgICAgICAgICAgZm9yIChpPTA7aTw9MTAwMDtpKyspIC8vIERhbm4ga29tbXQgZGVyIHp1IHRlc3RlbmRlIENvZGUsIHpCIGVpbmUKKyAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgLy8gU2NobGVpZmUKKyAgICAgICAgICAgIC4uLgorICAgICAgICAgIH0KKyAgICAgICAgICB1c2VkPXByZXYtZ2V0X2V2YWxfY29zdCgpOyAvLyBCZXJlY2hudW5nIGRlciBEaWZmZXJlbnoKKyAgICAgICAgICBwcmludGYoIkRpZSBTY2hsZWlmZSB2ZXJicmF1Y2h0ZSAlZCBUaWNrcy5cbiIsIHVzZWQpOworICAgICAgICB9CisKK1NJRUhFIEFVQ0g6CisgICAgICAgIGNhbGxlcl9zdGFja19kZXB0aChFKSwgcnVzYWdlKEUpLCBjb21tYW5kKEUpLCBxdWVyeV9saW1pdHMoRSkKKyAgICAgICAgS29uc3RhbnRlOiBfX01BWF9FVkFMX0NPU1RfXworCis0LkF1ZyAyMDA3IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9nZXRfZXh0cmFfd2l6aW5mbyBiL2RvYy9lZnVuL2dldF9leHRyYV93aXppbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNTZmYmEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9nZXRfZXh0cmFfd2l6aW5mbwpAQCAtMCwwICsxLDE5IEBACitTWU5PUFNJUworICAgICAgICBtaXhlZCBnZXRfZXh0cmFfd2l6aW5mbyAob2JqZWN0IHdpeikKKyAgICAgICAgbWl4ZWQgZ2V0X2V4dHJhX3dpemluZm8gKHN0cmluZyB3aXopCisgICAgICAgIG1peGVkIGdldF9leHRyYV93aXppbmZvIChpbnQgICAgd2l6KQorCitERVNDUklQVElPTgorICAgICAgICBSZXR1cm5zIHRoZSAnZXh0cmEnIGluZm9ybWF0aW9uIHRoYXQgd2FzIHNldCBmb3IgdGhlIGdpdmVuCisgICAgICAgIHdpemFyZCA8d2l6PiBpbiB0aGUgd2l6bGlzdC4KKworICAgICAgICBJZiA8d2l6PiBpcyBhbiBvYmplY3QsIHRoZSBlbnRyeSBvZiBpdHMgY3JlYXRvciAodWlkKSBpcyB1c2VkLgorICAgICAgICBJZiA8d2l6PiBpcyBhIHN0cmluZyAoYSBjcmVhdG9yIGFrYSB1aWQpLCBpdCBuYW1lcyB0aGUgZW50cnkKKyAgICAgICAgdG8gdXNlLgorICAgICAgICBJZiA8d2l6PiBpcyB0aGUgbnVtYmVyIDAsIHRoZSBkYXRhIGlzIGdldCBmcm9tIHRoZSBkZWZhdWx0IHdpemxpc3QKKyAgICAgICAgZW50cnkuCisKKyAgICAgICAgVGhlIGZ1bmN0aW9uIGNhdXNlcyBhIHByaXZpbGVnZSB2aW9sYXRpb24uCisKK1NFRSBBTFNPCisgICAgICAgIHdpemxpc3RfaW5mbyhFKSwgc2V0X2V4dHJhX3dpemluZm8oRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL2dldF90eXBlX2luZm8gYi9kb2MvZWZ1bi9nZXRfdHlwZV9pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYjFmOGIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9nZXRfdHlwZV9pbmZvCkBAIC0wLDAgKzEsNTcgQEAKK1NZTk9QU0lTCisgICAgICAgIG1peGVkIGdldF90eXBlX2luZm8obWl4ZWQgYXJnLCBpbnQgZmxhZyk7CisKK0JFU0NIUkVJQlVORworICAgICAgICBMaWVmZXJ0IEluZm9ybWF0aW9uZW4gdWJlciBkZW4gVHlwIHZvbiA8YXJnPiwgd2llIHZvbiA8ZmxhZz4KKyAgICAgICAgYW5nZWdlYmVuLgorCisgICAgICAgIFdlbm4gPGZsYWc+IGtlaW5lIFphaGwgaXN0LCBsaWVmZXJ0IGdldF90eXBlX2luZm8oKSBlaW4gQXJyYXksIGRlc3NlbgorICAgICAgICBlcnN0ZXMgRWxlbWVudCBlaW4gSW50ZWdlciBpc3QsIGRlciBkZW4gRGF0ZW50eXAgYmV6ZWljaG5ldCwgd2llIGluCisgICAgICAgIDxscGN0eXBlcy5oPiBkZWZpbmllcnQuIERlciB6d2VpdGUgRWludHJhZyBrYW5uIHp1c2FldHpsaWNoZQorICAgICAgICBJbmZvcm1hdGlvbmVuIHp1IDxhcmc+IGVudGhhbHRlbi4KKworICAgICAgICBJc3QgPGZsYWc+IDAsIHdpcmQgbnVyIGRhcyBlcnN0ZSBFbGVtZW50IChkLmguIGRlciBEYXRlbnR5cCkgZ2VsaWVmZXJ0LgorICAgICAgICBJc3QgPGZsYWc+IDEsIHdpcmQgbnVyIGRhcyB6d2VpdGUgRWxlbWVudCBnZWxpZWZlcnQuCisKKyAgICAgICAgV2VubiA8YXJnPiBlaW5lIENsb3N1cmUgZW50aGFlbHQsIHNvIGthbm4gZ2V0X3R5cGVfaW5mbygpIGRhcyBPYmpla3QKKyAgICAgICAgZGVyIENsb3N1cmUgbGllZmVybiwgd2VubiBmdWVyIDxmbGFnPiAyIGdlc2V0enQgaXN0LiAoRnVlciAnYWxpZW4KKyAgICAgICAgbGZ1biBjbG9zdXJlcycgaXN0IGRhcyBkYXMgT2JqZWt0LCBpbiBkZW0gZGllIENsb3N1cmUgZGVmaW5pZXJ0IGlzdCwKKyAgICAgICAgbmljaHQgZGFzIE9iamVrdCwgYW4gZGFzIGRpZSBDbG9zdXJlIGdlYnVuZGVuIGlzdC4pCisKKyAgICAgICAgV2VubiA8YXJnPiBlaW5lIExGdW4vQ29udGV4dC1DbG9zdXJlIGVudGhhZWx0LCBzbyBrYW5uIGdldF90eXBlX2luZm8oKQorICAgICAgICBkZW4gTmFtZW4gZGVzIGRlZmluaWVyZW5kZW4gUHJvZ3JhbW1lcyBsaWVmZXJuLCB3ZW5uIGZ1ZXIgPGZsYWc+IDMKKyAgICAgICAgZ2VzZXR6dCBpc3QuIEZ1ciBhbmRlcmUgQ2xvc3VyZXMgd2lyZCAwIHp1cnVlY2tnZWdlYmVuLgorCisgICAgICAgIFdlbm4gPGFyZz4gZWluZSBMRnVuL0NvbnRleHQtQ2xvc3VyZSBlbnRoYWVsdCwgc28ga2FubiBnZXRfdHlwZV9pbmZvKCkKKyAgICAgICAgZGVuIE5hbWVuIGRlciBGdW5rdGlvbiBsaWVmZXJuLCB3ZW5uIGZ1ZXIgPGZsYWc+IDQKKyAgICAgICAgZ2VzZXR6dCBpc3QuIEZ1ciBhbmRlcmUgQ2xvc3VyZXMgd2lyZCAwIHp1cnVlY2tnZWdlYmVuLgorCisgICAgICAgIEZ1ZXIgamVkZW4gYW5kZXJlbiBXZXJ0IGZ1ZXIgPGZsYWc+IGxpZWZlcnQgZGllIEZ1bmt0aW9uIC0xLgorCisgICAgICAgIERpZSB6dXNhZXR6bGljaGVuIEluZm9ybWF0aW9uZW4gKGFsc28gZGVyIHp3ZWl0ZSBFaW50cmFnIGRlcyBBcnJheXMpCisgICAgICAgIGJlaW5oYWx0ZW46CisgICAgICAgICAgLSBmdWVyIE1hcHBpbmdzIGRlcmVuIEJyZWl0ZSwgYWxzbyBkaWUgQW56YWhsIERhdGVud2VydGUgcHJvIEtleS4KKyAgICAgICAgICAtIGZ1ZXIgU3ltYm9sZSB1bmQgZ2VxdW90ZXRlIEFycmF5cyBkaWUgQW56YWhsIFF1b3Rlcy4KKyAgICAgICAgICAtIGZ1ZXIgQ2xvc3VyZXMgZGVuIChpbnRlcm5lbikgVHlwIGRlciBDbG9zdXJlLgorICAgICAgICAgIC0gZnVlciBnZW1laW5zYW0gdmVyd2VuZGV0ZSBTdHJpbmdzIDAsIHVuZ2xlaWNoIDAgZnVlciBhbmRlcmUgU3RyaW5ncworICAgICAgICAgIC0gZnVlciBzdHJ1Y3RzIGRlciBlaW5kZXV0aWdlIElkZW50aWZpemllcnVuZ3NzdHJpbmcKKyAgICAgICAgICAtIC0xIGZ1ZXIgYWxsZSBhbmRlcmVuIERhdGVudHlwZW4KKworQlVHUworICAgICAgICBEaWVzZSBGdW5rdGlvbiB1bnRlcmxpZWd0IGhhZXVmaWdlbiBWZXJhZW5kZXJ1bmdlbiBpbSBadWcgZGVyCisgICAgICAgIFRyZWliZXJlbnR3aWNrbHVuZy4KKworQUVOREVSVU5HRU4KKyAgICAgICAgRWluZ2VmdWVocnQgaW4gMy4yQDEyNworICAgICAgICBGbGFnd2VydCAyIGVpbmdlZnVlaHJ0IGluIDMuMi4xQDg0CisgICAgICAgIFp1c2F0emluZm9ybWF0aW9uZW4genUgU3RyaW5ncyBlaW5nZWZ1ZWhydCBpbiAzLjIuNworICAgICAgICBCaXMgdW5kIG1pdCAzLjIuNyBsaWVmZXJ0ZSBnZXRfdHlwZV9pbmZvKGNsb3N1cmUsIDIpIGtlaW5lIE9iamVrdGUKKyAgICAgICAgICAgIHZvbiBMYW1kYSBDbG9zdXJlcyB1bmQgZ2VidW5kZW5lbiBMYW1iZGEgQ2xvc3VyZXMuCisgICAgICAgIEJpcyB1bmQgbWl0IDMuMi43IGxpZWZlcnRlIGdldF90eXBlX2luZm8oY2xvc3VyZSwgMikga2VpbmUgT2JqZWt0ZSB2b24KKyAgICAgICAgICAgIEVmdW4tLCBTaW11bC1FZnVuLSBvZGVyIE9wZXJhdG9yLUNsb3N1cmVzLgorICAgICAgICBMRE11ZCAzLjMuMjc2IGZ1ZWd0ZSBkaWUgenVzYWV0emxpY2hlIEluZm9ybWF0aW9uIGZ1ZXIgc3RydWN0cyBoaW56dS4KKyAgICAgICAgTERNdWQgMy4zLjU0OCBmdWVndGUgRmxhZ3dlcnQgJzMnIGhpbnp1LgorICAgICAgICBMRE11ZCAzLjMuNzA4IGZ1ZWd0ZSBGbGFnd2VydCAnNCcgaGluenUuCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgZGVidWdfaW5mbyhFKSwgdHlwZW9mKEUpLCB0b19vYmplY3QoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL2dldGV1aWQgYi9kb2MvZWZ1bi9nZXRldWlkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1Y2MzZDEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9nZXRldWlkCkBAIC0wLDAgKzEsMTIgQEAKK1NZTk9QU0lTCisgICAgICAgIHN0cmluZyBnZXRldWlkKG9iamVjdCBvYik7CisKK0JFU0NIUkVJQlVORworICAgICAgICBMaWVmZXJ0IGRpZSBlZmZla3RpdmUgVXNlci1JRCBkZXMgT2JqZWt0cyA8b2JqPiAobm9ybWFsZXJ3ZWlzZSBlaW4KKyAgICAgICAgTWFnaWVyIG9kZXIgZWluZSBEb21haW4pLiBPYmpla3RlLCBkaWUgZHVyY2ggPG9iaj4gZ2VjbG9uZXQgd2VyZGVuLAorICAgICAgICBlcmhhbHRlbiBkaWVzZSBVc2VyLUlELiBEaWUgZWZmZWt0aXZlIFVzZXItSUQgd2lyZCBhdWNoIGZ1ZXIKKyAgICAgICAgWnVncmlmZnNjaGVja3MgdmVyd2VuZGV0LiBXZW5uIDxvYmo+IG5pY2h0IGFuZ2VnZWJlbiB3aXJkLCB3aXJkCisgICAgICAgIHN0YW5kYXJkbWFlc3NpZyB0aGlzX29iamVjdCgpIHZlcndlbmRldC4KKworU0lFSEUgQVVDSAorICAgICAgICBzZXRldWlkKEUpLCBnZXR1aWQoRSksIGdldHV1aWQoRSksIGV4cG9ydF91aWQoRSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9nZXR1aWQgYi9kb2MvZWZ1bi9nZXR1aWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYzOGZlOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2dldHVpZApAQCAtMCwwICsxLDE3IEBACitTWU5PUFNJUworICAgICAgICBzdHJpbmcgZ2V0dWlkKG9iamVjdCBvYik7CisKK0JFU0NIUkVJQlVORworICAgICAgICBVc2VyLUlEcyB3ZXJkZW4gaW0gQ29tcGF0IE1vZHVzIG5pY2h0IHZlcndlbmRldC4KKworICAgICAgICBEaWUgRnVua3Rpb24gbGllZmVydCBkaWUgVUlEIGRlcyBPYmpla3RzLCBhbHNvIGRlbiBOYW1lbiBkZXMgTWFnaWVycworICAgICAgICBvZGVyIGRlciBEb21haW4gb2RlciBHcnVwcGUsIGRpZSBmdWVyIGRhcyBPYmpla3QgdmVyYW50d29ydGxpY2ggaXN0LgorICAgICAgICBEZXIgTmFtZSBlbnRzcHJpY2h0IGRlbSBOYW1lbiwgZGVyIGluIGRlciBXaXpsaXN0IHZlcndlbmRldCB3aXJkLgorICAgICAgICBXaXJkIDxvYj4gbmljaHQgYW5nZWdlYmVuLCB3aXJkIHN0YW5kYXJkbWFlc3NpZyB0aGlzX29iamVjdCgpCisgICAgICAgIGdlbm9tbWVuLgorCitBRU5ERVJVTkdFTgorICAgICAgICBTZWl0IDMuMi4xQDQ3IGlzdCBkaWVzZSBFZnVuIGVpbiBBbGlhcyBmdWVyIGNyZWF0b3IoKQorCitTSUVIRSBBVUNICisgICAgICAgIHNldGV1aWQoRSksIGdldGV1aWQoRSksIGV4cG9ydF91aWQoRSksIGNyZWF0b3IoRSksIGdldHV1aWQoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL2dtdGltZSBiL2RvYy9lZnVuL2dtdGltZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjEyZWZmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vZ210aW1lCkBAIC0wLDAgKzEsMzggQEAKK1NZTk9QU0lTCisgICAgICAgICNpbmNsdWRlIDxzeXMvdGltZS5oPgorCisgICAgICAgIGludCAqZ210aW1lKGludCBjbG9jayk7CisgICAgICAgIGludCAqZ210aW1lKGludCAqdWNsb2NrKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIEludGVycHJldGllcnQgPGNsb2NrPiBhbHMgQW56YWhsIFNla3VuZGVuIHNlaXQgZGVtIDAxLiBKYW51YXIgMTk3MCwKKyAgICAgICAgMDA6MDA6MDAgVWhyIHVuZCBnaWJ0IGRpZSBaZWl0IGluIFVUQyBpbiBlaW5lciBzY2hvZW5lbiBTdHJ1a3R1cgorICAgICAgICBhdXMuIFdpcmQgPGNsb2NrPiBuaWNodCBhbmdlZ2ViZW4sIHdpcmQgc3RhdHRkZXNzZW4gdGltZSgpIHZlcndlbmRldC4KKworICAgICAgICBBbHRlcm5hdGl2IGthbm4gYXVjaCBlaW4gQXJyYXkgbWl0IHp3ZWkgRWxlbWVudGVuIGFuZ2VnZWJlbiB3ZXJkZW4sCisgICAgICAgIHdpZSBlcyB2b24gdWNsb2NrKCkgZ2VsaWVmZXJ0IHdpcmQ6IGRhcyBlcnN0ZSBFbGVtZW50IHdpcmQKKyAgICAgICAgaW50ZXJwcmV0aWVydCB3aWUgPGNsb2NrPiwgZGFzIHp3ZWl0ZSBFbGVtZW50IGJlemVpY2huZXQgZGllCisgICAgICAgIE1pa3Jvc2VrdW5kZW4gaW4gZGVyIGFrdHVlbGxlbiBTZWt1bmRlLiBEaWVzZXMgendlaXRlIEVsZW1lbnQgd2lyZAorICAgICAgICBpZ25vcmllcnQuCisKKyAgICAgICAgRGFzIFJlc3VsdGF0IHZvbiBnbXRpbWUoKSBpc3QgZWluIEFycmF5LCBkYXMgZm9sZ2VuZGUgV2VydGUgYmVpbmhhbHRldDoKKyAgICAgICAgICAgIGludCBUTV9TRUMgICAoMCkgOiBTZWt1bmRlbiAoMC4uNTkpCisgICAgICAgICAgICBpbnQgVE1fTUlOICAgKDEpIDogTWludXRlbiAoMC4uNTkpCisgICAgICAgICAgICBpbnQgVE1fSE9VUiAgKDIpIDogU3R1bmRlbiAoMC4uMjMpCisgICAgICAgICAgICBpbnQgVE1fTURBWSAgKDMpIDogVGFnIGltIE1vbmF0ICgxLi4zMSkKKyAgICAgICAgICAgIGludCBUTV9NT04gICAoNCkgOiBNb25hdCBpbSBKYWhyICgwLi4xMSkKKyAgICAgICAgICAgIGludCBUTV9ZRUFSICAoNSkgOiBKYWhyICh6LkIuICAyMDAxKQorICAgICAgICAgICAgaW50IFRNX1dEQVkgICg2KSA6IFdvY2hlbnRhZyAoU3VuZGF5ID0gMCkKKyAgICAgICAgICAgIGludCBUTV9ZREFZICAoNykgOiBUYWcgaW0gSmFociAoMC4uMzY1KQorICAgICAgICAgICAgaW50IFRNX0lTRFNUICg4KSA6IFRSVUU6IERheWxpZ2h0IHNhdmluZyB0aW1lCisKK0JFSVNQSUVMCisgICAgICAgIHByaW50ZigiSGV1dGUgaXN0ICVzXG4iLCAoeyAiU29ubnRhZyIsICJNb250YWciLCAiRGllbnN0YWciLAorICAgICAgICAgICAgIk1pdHR3b2NoIiwgICAgICAgICJEb25uZXJzdGFnIiwgIkZyZWl0YWciLCAiU2Ftc3RhZyJ9KQorICAgICAgICAgICAgW2dtdGltZSgpW1RNX1dEQVldXSk7CisKK0FFTkRFUlVOR0VOCisgICAgICAgIEVpbmdlZnVlaHJ0IGluIExETXVkIDMuMi45LgorCitTSUVIRSBBVUNICisgICAgY3RpbWUoRSksIGxvY2FsdGltZShFKSwgdGltZShFKSwgdXRpbWUoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL2hhc2ggYi9kb2MvZWZ1bi9oYXNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNDU3YzEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9oYXNoCkBAIC0wLDAgKzEsMzYgQEAKK1NZTk9QU0lTCisgICAgICAgICNpbmNsdWRlIDxzeXMvdGxzLmg+CisKKyAgICAgICAgc3RyaW5nIGhhc2goaW50IG1ldGhvZCwgc3RyaW5nIGFyZyBbLCBpbnQgaXRlcmF0aW9ucyBdICkKKyAgICAgICAgc3RyaW5nIGhhc2goaW50IG1ldGhvZCwgaW50ICogIGFyZyBbLCBpbnQgaXRlcmF0aW9ucyBdICkKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIEJlcmVjaG5lIGRlbiBIYXNoIDxtZXRob2Q+IHZvbSBBcmd1bWVudCA8YXJnPi4gRGVyIEhhc2ggd2lyZAorICAgICAgICBtaXQgPGl0ZXJhdGlvbnM+IFdpZWRlcmhvbHVuZ2VuIGJlcmVjaG5ldCwgd2lyZCBkZXIgV2VydCB3ZWdnZWxhc3NlbiwKKyAgICAgICAgd2lyZCBlaW5lIFdpZWRlcmhvbHVuZyB2ZXJ3ZW5kZXQuCisKKyAgICAgICAgPG1ldGhvZD4gaXN0IGVpbmUgZGVyIFRMU19IQVNIXy1Lb25zdGFudGVuIGluIHRscy5oOyBuaWNodCBqZWRlCisgICAgICAgIGJlc2NocmllYmVuZSBNZXRob2RlIGlzdCBpbiBlaW5lbSBnZWdlYmVuZW4gRHJpdmVyIHZvcmhhbmRlbjoKKworICAgICAgICAgIFRMU19IQVNIX1NIQTEgICAgICAoMSkKKyAgICAgICAgICBUTFNfSEFTSF9TSEEyMjQgICAgKDIpCisgICAgICAgICAgVExTX0hBU0hfU0hBMjU2ICAgICgzKQorICAgICAgICAgIFRMU19IQVNIX1NIQTM4NCAgICAoNCkKKyAgICAgICAgICBUTFNfSEFTSF9TSEE1MTIgICAgKDUpCisgICAgICAgICAgVExTX0hBU0hfTUQ1ICAgICAgICg2KQorICAgICAgICAgIFRMU19IQVNIX1JJUEVNRDE2MCAoNykKKworICAgICAgICBEaWVzZSBGdW5rdGlvbiBpc3QgbnVyIHZlcmZ1ZWdiYXIgd2VubiBkZXIgRHJpdmVyIG1pdCBPcGVuU1NMCisgICAgICAgIGNvbXBpbGllcnQgd3VyZGUuCisKK0JFSVNQSUVMRQorICAgICAgICBzdHJpbmcgczsKKworICAgICAgICBzID0gaGFzaChUTFNfSEFTSF9TSEExLCAiSGVsbG8iLCAyKTsKKyAgICAgICAgcyA9IGhhc2goVExTX0hBU0hfU0hBMSwgKHsgJ0gnLCAnZScsICdsJywgJ2wnLCAnbycgfSkgKQorCitHRVNDSElDSFRFCisgICAgICAgIEVpbmdlZnVlaHJ0IGluIExETXVkIDMuMy43MTQKKworU0lFSEUgQVVDSAorICAgICAgICBjcnlwdChFKSwgbWQ1KEUpLCBtZDVfY3J5cHQoRSksIHNoYTEoRSksIGhtYWMoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL2hlYXJ0X2JlYXRfaW5mbyBiL2RvYy9lZnVuL2hlYXJ0X2JlYXRfaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWU4ZDUyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vaGVhcnRfYmVhdF9pbmZvCkBAIC0wLDAgKzEsOSBAQAorU1lOT1BTSVMKKyAgICAgICAgb2JqZWN0ICpoZWFydF9iZWF0X2luZm8oKQorCitCRVNDSFJFSUJVTkcKKyAgICAgICAgUmVzdWx0YXQgaXN0IGVpbiBBcnJheSBtaXQgYWxsZW4gT2JqZWt0ZW4sIGRpZSBlaW5lbiBha3RpdmVuCisgICAgICAgIGhlYXJ0X2JlYXQoKSBoYWJlbi4KKworU0lFSEUgQVVDSAorICAgICAgICBzZXRfaGVhcnRfYmVhdChFKSwgaGVhcnRfYmVhdChBKSwgY2FsbF9vdXRfaW5mbyhFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vaG1hYyBiL2RvYy9lZnVuL2htYWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQxZDZkNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2htYWMKQEAgLTAsMCArMSwzNSBAQAorU1lOT1BTSVMKKyAgICAgICAgI2luY2x1ZGUgPHN5cy90bHMuaD4KKworICAgICAgICBzdHJpbmcgaG1hYyhpbnQgbWV0aG9kLCBzdHJpbmcga2V5LCBzdHJpbmcgYXJnICkKKyAgICAgICAgc3RyaW5nIGhtYWMoaW50IG1ldGhvZCwgc3RyaW5nIGtleSwgaW50ICogIGFyZyApCisKK0JFU0NIUkVJQlVORworICAgICAgICBCZXJlY2huZXQgZGVuIEhhc2hlZCBNZXNzYWdlIEF1dGhlbmljYXRpb24gQ29kZSBmdWVyIDxhcmc+CisgICAgICAgIG5hY2ggTWV0aG9kZSA8bWV0aG9kPiB1bmQgZnVlciBkYXMgUGFzc3dvcmQgPGtleT4uCisKKyAgICAgICAgPG1ldGhvZD4gaXN0IGVpbmUgZGVyIFRMU19IQVNIXy1Lb25zdGFudGVuIGluIHRscy5oOyBuaWNodCBqZWRlCisgICAgICAgIGJlc2NocmllYmVuZSBNZXRob2RlIGlzdCBpbiBlaW5lbSBnZWdlYmVuZW4gRHJpdmVyIHZvcmhhbmRlbjoKKworICAgICAgICAgIFRMU19IQVNIX1NIQTEgICAgICAoMSkKKyAgICAgICAgICBUTFNfSEFTSF9TSEEyMjQgICAgKDIpCisgICAgICAgICAgVExTX0hBU0hfU0hBMjU2ICAgICgzKQorICAgICAgICAgIFRMU19IQVNIX1NIQTM4NCAgICAoNCkKKyAgICAgICAgICBUTFNfSEFTSF9TSEE1MTIgICAgKDUpCisgICAgICAgICAgVExTX0hBU0hfTUQ1ICAgICAgICg2KQorICAgICAgICAgIFRMU19IQVNIX1JJUEVNRDE2MCAoNykKKworICAgICAgICBEaWVzZSBGdW5rdGlvbiBpc3QgbnVyIHZlcmZ1ZWdiYXIgd2VubiBkZXIgRHJpdmVyIG1pdCBPcGVuU1NMCisgICAgICAgIGNvbXBpbGllcnQgd3VyZGUuCisKK0JFSVNQSUVMRQorICAgICAgICBzdHJpbmcgczsKKworICAgICAgICBzID0gaG1hYyhUTFNfSEFTSF9TSEExLCAic2VjcmV0IiwgIkhlbGxvIik7CisgICAgICAgIHMgPSBobWFjKFRMU19IQVNIX1NIQTEsICJzZWNyZXQiLCAoeyAnSCcsICdlJywgJ2wnLCAnbCcsICdvJyB9KSApCisKK0dFU0NISUNIVEUKKyAgICAgICAgRWluZ2VmdWVocnQgaW4gTERNdWQgMy4zLjcxNAorCitTSUVIRSBBVUNICisgICAgICAgIGNyeXB0KEUpLCBtZDUoRSksIG1kNV9jcnlwdChFKSwgc2hhMShFKSwgaG1hYyhFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vaWRuYV9zdHJpbmdwcmVwIGIvZG9jL2VmdW4vaWRuYV9zdHJpbmdwcmVwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMDExNDAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9pZG5hX3N0cmluZ3ByZXAKQEAgLTAsMCArMSwyMiBAQAorT1BUSU9OQUwKK1NZTk9QU0lTCisgICAgICAgICNpbmNsdWRlIDxzeXMvaWRuLmg+CisKKyAgICAgICAgc3RyaW5nIGlkbmFfc3RyaW5ncHJlcCAoc3RyaW5nIHN0ciwgaW50IHByb2ZpbGUsIGludCBmbGFncyA9IDApCisKK0JFU0NIUkVJQlVORworICAgICAgICBQcmVwYXJpZXJlIGRlbiBVVEYtOCBTdHJpbmcgPHN0cj4gcGFzc2VuZCB6dW0gUHJvZmlsIDxwcm9maWxlPgorICAgICAgICAoc2llaGUgYXVjaCBsaWJpZG4gc3RyaW5ncHJlcCgzKSkuCisKKyAgICAgICAgPHByb2ZpbGU+IHVuZCA8ZmxhZ3M+IHNpbmQgZGVmaW5pZXJ0IGluIGlkbi5oIC4KKworICAgICAgICBTb2xsdGUgZWluIEZlaGxlciBhdWZ0cmV0ZW4sIHdpcmQgZWluZSBFeGNlcHRpb24gZ2V3b3JmZW4uCisKKyAgICAgICAgRGllc2UgRWZ1biBpcyBudXIgdmVyZnVlZ2JhciBhdWYgU3lzdGVtZW4gbWl0IGxpYmlkbgorICAgICAgICBpbnN0YWxsaWVydCAtIGluIGRpZXNlbSBGYWxsIGlzdCBkYXMgTWFrcm8gX19JRE5BX18gZGVmaW5pZXJ0LgorCitHRVNDSElDSFRFCisgICAgICAgIEludHJvZHVjZWQgaW4gTERNdWQgMy4zLjcxMy4KKworU0lFSEUgQVVDSAorICAgICAgICBjb252ZXJ0X2NoYXJzZXQoRSksIGlkbmFfdG9fYXNjaWkoRSksIGlkbmFfdG9fdW5pY29kZShFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vaWRuYV90b19hc2NpaSBiL2RvYy9lZnVuL2lkbmFfdG9fYXNjaWkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNjNjZiOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2lkbmFfdG9fYXNjaWkKQEAgLTAsMCArMSwyMCBAQAorT1BUSU9OQUwKK1NZTk9QU0lTCisgICAgICAgICNpbmNsdWRlIDxzeXMvaWRuLmg+CisKKyAgICAgICAgc3RyaW5nIGlkbmFfdG9fYXNjaWkgKHN0cmluZyBuYW1lKQorCitCRVNDSFJFSUJVTkcKKyAgICAgICAgV2FuZGxlIGRlbiBTdHJpbmcgPG5hbWU+IHZvbiBVVEYtOCB0byBJRE5BIERhcnN0ZWxsdW5nICg4egorICAgICAgICBwdW55Y29kZSkuCisKKyAgICAgICAgU29sbHRlIGVpbiBGZWhsZXIgYXVmdHJldGVuLCB3aXJkIGVpbmUgRXhjZXB0aW9uIGdld29yZmVuLgorCisgICAgICAgIERpZXNlIEVmdW4gaXMgbnVyIHZlcmZ1ZWdiYXIgYXVmIFN5c3RlbWVuIG1pdCBsaWJpZG4KKyAgICAgICAgaW5zdGFsbGllcnQgLSBpbiBkaWVzZW0gRmFsbCBpc3QgZGFzIE1ha3JvIF9fSUROQV9fIGRlZmluaWVydC4KKworR0VTQ0hJQ0hURQorICAgICAgICBJbnRyb2R1Y2VkIGluIExETXVkIDMuMy43MTMuCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgY29udmVydF9jaGFyc2V0KEUpLCBpZG5hX3RvX3VuaWNvZGUoRSksIGlkbmFfc3RyaW5ncHJlcChFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vaWRuYV90b191bmljb2RlIGIvZG9jL2VmdW4vaWRuYV90b191bmljb2RlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4M2RjZTgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9pZG5hX3RvX3VuaWNvZGUKQEAgLTAsMCArMSwyMCBAQAorT1BUSU9OQUwKK1NZTk9QU0lTCisgICAgICAgICNpbmNsdWRlIDxzeXMvaWRuLmg+CisKKyAgICAgICAgc3RyaW5nIGlkbmFfdG9fdW5pY29kZSAoc3RyaW5nIG5hbWUpCisKK0JFU0NIUkVJQlVORworICAgICAgICBXYW5kbGUgZGVuIFN0cmluZyA8bmFtZT4gdm9uIElETkEgRGFyc3RlbGx1bmcgKDh6IHB1bnljb2RlKQorICAgICAgICBuYWNoIFVURi04LgorCisgICAgICAgIFNvbGx0ZSBlaW4gRmVobGVyIGF1ZnRyZXRlbiwgd2lyZCBlaW5lIEV4Y2VwdGlvbiBnZXdvcmZlbi4KKworICAgICAgICBEaWVzZSBFZnVuIGlzIG51ciB2ZXJmdWVnYmFyIGF1ZiBTeXN0ZW1lbiBtaXQgbGliaWRuCisgICAgICAgIGluc3RhbGxpZXJ0IC0gaW4gZGllc2VtIEZhbGwgaXN0IGRhcyBNYWtybyBfX0lETkFfXyBkZWZpbmllcnQuCisKK0dFU0NISUNIVEUKKyAgICAgICAgSW50cm9kdWNlZCBpbiBMRE11ZCAzLjMuNzEzLgorCitTSUVIRSBBVUNICisgICAgICAgIGNvbnZlcnRfY2hhcnNldChFKSwgaWRuYV90b19hc2NpaShFKSwgaWRuYV9zdHJpbmdwcmVwKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9pbXBsb2RlIGIvZG9jL2VmdW4vaW1wbG9kZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWE3MjNiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vaW1wbG9kZQpAQCAtMCwwICsxLDI1IEBACitTWU5PUFNJUworICAgICAgICBzdHJpbmcgaW1wbG9kZShtaXhlZCAqYXJyLCBzdHJpbmcgZGVsKQorCitCRVNDSFJFSUJVTkcKKwlTZXR6dCBhbGxlIFplaWNoZW5rZXR0ZW4gKFN0cmluZ3MpIGF1cyBkZW0gRmVsZCAoQXJyYXkpIGFyciB6dQorICAgICAgICBlaW5lciBaZWljaGVua2V0dGUgenVzYW1tZW4gdW5kIGZ1ZWd0IGRhYmVpIGRpZSBaZWljaGVua2V0dGUgZGVsCisgICAgICAgIHp3aXNjaGVuIGplIHp3ZWkgRWxlbWVudGVuIGVpbi4gRWxlbWVudGUgYXVzIGRlbSBGZWxkIGFyciwgd2VsY2hlCisgICAgICAgIGtlaW5lIFplaWNoZW5rZXR0ZW4gc2luZCwgd2VyZGVuIGlnbm9yaWVydC4KKworQkVJU1BJRUxFCisJRnVua3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUnVlY2tnYWJld2VydAorICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJaW1wbG9kZSgoeyAiZm9vIiwgImJhciIsICIiIH0pLCAiKiIpICAgICAgICAgICAgImZvbypiYXIqIgorCWltcGxvZGUoKHsgImEiLCAyLCB0aGlzX29iamVjdCgpLCAiYyIgfSksICJiIikgICJhYmMiCisKKwlLYW5uIHp1c2FtbWVuIG1pdCBleHBsb2RlKCkgYWxzIEZ1bmt0aW9uIHp1bSBFcnNldHplbiB2b24KKyAgICAgICAgWmVpY2hlbmtldHRlbiB2ZXJ3ZW5kZXQgd2VyZGVuOgorICAgICAgICBpbXBsb2RlKGV4cGxvZGUoImEgc2hvcnQgdGV4dCIsICIgIiksICJfIikgICAgICAiYV9zaG9ydF90ZXh0IgorCisJSGV1dHp1dGFnZSBrYW5uIG1hbiBzdGF0dGRlc3NlbiBhdWNoCisJcmVncmVwbGFjZSgiYSBzaG9ydCB0ZXh0IiwgIiAiLCAiXyIsIDEpCisJdmVyd2VuZGVuLgorCitTSUVIRSBBVUNICisgICAgICAgIGV4cGxvZGUoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL2luY2x1ZGVfbGlzdCBiL2RvYy9lZnVuL2luY2x1ZGVfbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzQ0ZmE5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vaW5jbHVkZV9saXN0CkBAIC0wLDAgKzEsODAgQEAKK1NZTk9QU0lTCisgICAgICAgICNpbmNsdWRlIDxzeXMvaW5jbHVkZV9saXN0Lmg+CisKKyAgICAgICAgc3RyaW5nICppbmNsdWRlX2xpc3QoKTsKKyAgICAgICAgc3RyaW5nICppbmNsdWRlX2xpc3Qob2JqZWN0IG9iKTsKKyAgICAgICAgc3RyaW5nICppbmNsdWRlX2xpc3Qob2JqZWN0IG9iLCBpbnQgZmxhZ3MpOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgRGllc2UgRnVua3Rpb24gbGllZmVydCBJbmZvcm1hdGlvbmVuIHVlYmVyIGFsbGUgRGF0ZWllbiwgZGllIGJlaSBkZXIKKyAgICAgICAgS29tcGlsaWVydW5nIHZvbiA8b2I+IGluIGRpZXNlcyBPYmpla3QgZWluZ2VidW5kZW4gd3VyZGVuLCBpbmtsdXNpdmUKKyAgICAgICAgZGVuIFByb2dyYW1tbmFtZW4gdm9uIDxvYj4uIFdpcmQgPG9iPiBuaWNodCBhbmdlZ2ViZW4sIHdpcmQKKyAgICAgICAgc3RhbmRhcmRtYWVzc2lnIGRhcyBha3R1ZWxsZSBPYmpla3QgdmVyd2VuZGV0LgorCisgICAgICAgIEltIHJlc3VsdGllcmVuZGVuIEFycmF5IGJlc3RlaHQgZGllIEluZm9ybWF0aW9uIHp1IGVpbmVtIEluY2x1ZGVmaWxlCisgICAgICAgIGF1cyBkcmVpIEVsZW1lbnRlbjoKKyAgICAgICAgICAtIHN0cmluZyBbaSswXTogZGVyIE5hbWUgZGVzIEluY2x1ZGVmaWxlcywgd2llIGVyIGltIFByb2dyYW1tCisgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZnRhdWNodCwgaW5rbHVzaXZlIGRlbiBUcmVubnplaWNoZW4gd2llICIgIiBvZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwgPi4KKyAgICAgICAgICAtIHN0cmluZyBbaSsxXTogZGVyIGFic29sdXRlIERhdGVpcGZhZCBkZXMgSW5jbHVkZWZpbGVzLgorICAgICAgICAgIC0gaW50ICAgIFtpKzJdOiBkaWUgVGllZmUgZGVyIElua2x1c2lvbiAoZ2V3b2VobmxpY2ggMSwgZnVlcgorICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzY2hhY2h0ZWx0ZSBJbmNsdWRlcyBhdWNoIGdyb2Vzc2VyIGFscyAxKQorCisgICAgICAgIERlciBlcnN0ZSBFaW50cmFnIGltIFJlc3VsdGF0IGlzdCBkZXIgTmFtZSBkZXMgUHJvZ3JhbW1lcyBzZWxic3QgaW4KKyAgICAgICAgW2krMF0sIGRpZSBhbmRlcmVuIGJlaWRlbiBFbGVtZW50ZSBbaSsxXSB1bmQgW2krMl0gc2luZCAwLgorCisgICAgICAgIDxmbGFnPiBiZXplaWNobmV0IGRpZSBTdHJ1a3R1ciBkZXMgRXJnZWJuaXNzZXM6CisgICAgICAgICAgLSA8ZmxhZz4gPSBJTkNMSVNUX0ZMQVQgKDAsIFN0YW5kYXJkKToKKyAgICAgICAgICAgIERhcyBSZXN1bHRhdCBpc3QgZWluIGZsYWNoZXMgQXJyYXkuIERlciBlcnN0ZSBFaW50cmFnIGJlemVpY2huZXQKKyAgICAgICAgICAgIDxvYj4gc2VsYnN0LCBkaWUgcmVzdGxpY2hlbiBFaW50cmFlZ2UgYmV6ZWljaG5lbiBhbGxlIEluY2x1ZGVmaWxlcworICAgICAgICAgICAgaW4gZGVyIFJlaWhlbmZvbGdlLCBpbiBkZXIgc2llIGF1ZnRyZXRlbi4KKyAgICAgICAgICAtIDxmbGFnPiA9IElOQ0xJU1RfVFJFRSAoMSk6CisgICAgICAgICAgICBEYXMgUmVzdWx0YXQgaXN0IGVpbiBBcnJheSwgZGVzc2VuIGVyc3RlciBFaW50cmFnIGRhcyBPYmpla3QgPG9iPgorICAgICAgICAgICAgc2VsYnN0IGJlemVpY2huZXQuIEFsbGUgZm9sZ2VuZGVuIEVpbnRyYWVnZSBiZXplaWNobmVuIGRpZQorICAgICAgICAgICAgSW5jbHVkZWZpbGVzIHZvbiA8b2I+LiBXZW5uIGVpbiBJbmNsdWRlZmlsZSB2b24gPG9iPiBzZWxic3Qga2VpbmUKKyAgICAgICAgICAgIEluY2x1ZGVmaWxlcyBoYXQsIHdpcmQgc2VpbmUgSW5mb3JtYXRpb24gZGlyZWt0IGltIEFycmF5CisgICAgICAgICAgICBnZXNwZWljaGVydC4gRnVlciB2ZXJzY2hhY2h0ZWx0ZSBJbmNsdWRlZmlsZXMgd2lyZCBlaW4gVW50ZXJ2ZWt0b3IKKyAgICAgICAgICAgIGVyemV1Z3QgdW5kIGRhbm4gaW4gZGllc2VtIFVudGVydmVrdG9yIGFiZ2VzcGVpY2hlcnQgKHdpZWRlcnVtCisgICAgICAgICAgICBpbiBbaSswXSwgW2krMV0gdW5kIFtpKzJdIHNpbmQgMCkuIERpZXNlIFVudGVydmVrdG9yZW4gaGFiZW4KKyAgICAgICAgICAgIGRpZSBnbGVpY2hlIFN0cnVrdHVyIHdpZSBkYXMgUmVzdWx0YXRhcnJheS4KKworICAgICAgICBXZW5uIGVpbiBPYmpla3QsIGlua2x1c2l2ZSA8b2I+LCBlaW5lbSByZXBsYWNlX3Byb2dyYW1tKCkgdW50ZXJ3b3JmZW4KKyAgICAgICAgd2FyLCBzcGllZ2VsbiBkaWUgZ2VsaWVmZXJ0ZW4gRGF0ZWluYW1lbiBkYXMgZWZmZWt0aXYgYWt0aXZlIFByb2dyYW1tCisgICAgICAgIHdpZGVyLgorCisgICAgICAgIERpZSBJbmNsdWRlcGZhZGUsIGRpZSBnZWxpZWZlcnQgd2VyZGVuLCBiZWdpbm5lbiBpbW1lciBtaXQgJy8nCisgICAgICAgIChhYnNvbHV0ZSBQZmFkZSksIGF1Y2ggd2VubiBkZXIgVHJlaWJlciBpbSBDT01QQVQgTW9kdXMgbGFldWZ0LgorICAgICAgICBUcm90emRlbSBiZWdpbm50IGRlciB0YXRzYWVjaGxpY2hlIERhdGVpbmFtZSBuaWNodCBtaXQgZWluZW0gJy8nLAorICAgICAgICB3ZW5uIGRlciBUcmVpYmVyIGltIENPTVBBVCBNb2R1cyBsYWV1ZnQuCisKK0JFSVNQSUVMCisgICAgICAgIERpZXNlciBDb2RlIGVyemV1Z3QgKG1pdCAvc3lzIGFscyBJbmNsdWRldmVyemVpY2huaXMgZGVzIFN5c3RlbXMpOgorCisgICAgICAgICAgICBhLmM6ICAjaW5jbHVkZSAiYi5oIgorICAgICAgICAgICAgICAgICAgI2luY2x1ZGUgPGMuaD4KKyAgICAgICAgICAgIGIuaDogICNpbmNsdWRlICJkLmgiCisgICAgICAgICAgICBjLmg6ICAjZGVmaW5lIEJBUgorICAgICAgICAgICAgZC5oOiAgI2RlZmluZSBGT08KKworICAgICAgICBEaWUgRWZ1biBsaWVmZXJ0IGRyZWkgUmVzdWx0YXRlOgorCisgICAgICAgICAgICBpbmNsdWRlX2xpc3QoYSwgSU5DTElTVF9GTEFUKQorICAgICAgICAgICAgLT4gKHsgImEuYyIsIDAsIDAKKyAgICAgICAgICAgICAgICAsICJcImIuaFwiIiwgIi8uLi4vYi5oIiwgMQorICAgICAgICAgICAgICAgICwgIlwiZC5oXCIiLCAiLy4uLi9kLmgiLCAyCisgICAgICAgICAgICAgICAgLCAiPGMuaD4iLCAgICIvc3lzL2MuaCIsIDEKKyAgICAgICAgICAgICAgIH0pCisKKyAgICAgICAgICAgICBpbmNsdWRlX2xpc3QoYSwgSU5DTElTVF9UUkVFKQorICAgICAgICAgICAgIC0+ICh7ICJhLmMiLCAwLCAwCisgICAgICAgICAgICAgICAgICwgKHsgIlwiYi5oXCIiLCAiLy4uLi9iLmgiLCAxCisgICAgICAgICAgICAgICAgICAgICwgIlwiZC5oXCIiLCAiLy4uLi9kLmgiLCAyCisgICAgICAgICAgICAgICAgICAgfSksIDAsIDAKKyAgICAgICAgICAgICAgICAgLCAiPGMuaD4iLCAgICIvc3lzL2MuaCIsIDEKKyAgICAgICAgICAgICAgICAgfSkKKworQUVOREVSVU5HRU4KKyAgICAgICAgRWluZ2VmdWVocnQgaW4gTERNdWQgMy4yLjksIDMuMy4xMjgKKworU0lFSEUgQVVDSAorICAgICAgICBkZWJ1Z19pbmZvKEUpLCBpbmhlcml0X2xpc3QoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL2luaGVyaXRfbGlzdCBiL2RvYy9lZnVuL2luaGVyaXRfbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2M3MzhlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vaW5oZXJpdF9saXN0CkBAIC0wLDAgKzEsNjAgQEAKK1NZTk9QU0lTCisgICAgICAgICNpbmNsdWRlIDxzeXMvaW5oZXJpdF9saXN0Lmg+CisKKyAgICAgICAgc3RyaW5nICppbmhlcml0X2xpc3QoKTsKKyAgICAgICAgc3RyaW5nICppbmhlcml0X2xpc3Qob2JqZWN0IG9iKTsKKyAgICAgICAgc3RyaW5nICppbmhlcml0X2xpc3Qob2JqZWN0IG9iLCBpbnQgZmxhZ3MpOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgTGllZmVydCBkaWUgTmFtZW4gdm9uIGFsbGVuIERhdGVpZW4sIGRpZSB2b24gPG9iPiBnZWVyYnQgd2VyZGVuLAorICAgICAgICBpbmtsdXNpdmUgPG9iPnMgZWlnZW5lciBEYXRlaW5hbWUuIFdpcmQgPG9iPiBuaWNodCBhbmdlZ2ViZW4sIHdpcmQKKyAgICAgICAgc3RhbmRhcm5kbWFlc3NpZyBkYXMgYWt0dWVsbGUgT2JqZWt0IHZlcndlbmRldC4KKworICAgICAgICBEZXIgV2VydCB2b24gPGZsYWdzPiBiZXN0aW1tdCBkaWUgU3RydWt0dXIgZGVzIFJ1ZWNrZ2FiZXdlcnRlczoKKyAgICAgICAgICAtIDxmbGFnPiA9IElOSExJU1RfRkxBVCAoMCwgZGVmYXVsdCk6CisgICAgICAgICAgICBpbmhlcml0X2xpc3QoKSBsaWVmZXJ0IGVpbiBBcnJheSB2b24gRGF0ZWluYW1lbiwgYmVnaW5uZW5kIG1pdCBkZW0KKyAgICAgICAgICAgIE5hbWVuIHZvbiA8b2I+IHNlbGJzdCwgZ2Vmb2xndCB2b24gZGVuIE5hbWVuIGFsbGVyIGdlZXJidGVuCisgICAgICAgICAgICBPYmpla3Rlbi4KKyAgICAgICAgICAtIDxmbGFnPiA9IElOSExJU1RfVFJFRSAoMSk6CisgICAgICAgICAgICBpbmhlcml0X2xpc3QoKSBsaWVmZXJ0IGVpbiBBcnJheSB2b24gRGF0ZWluYW1lbiwgYmVnaW5uZW5kIG1pdCBkZW0KKyAgICAgICAgICAgIE5hbWVuIHZvbiA8b2I+IHNlbGJzdC4gV2VubiBlaW4gZ2VlcmJ0ZSBGaWxlIHNlbGJzdCBrZWluZSBGaWxlcworICAgICAgICAgICAgZXJidCwgd2lyZCBzZWluIE5hbWUgZGlyZWt0IGluIGRhcyBFcmdlYm5pcyBlaW5nZXRyYWdlbi4gV2VubiBlaW4KKyAgICAgICAgICAgIGdlZXJidGVzIEZpbGUgc2VsYnN0IEZpbGVzIGVyYnQsIHdpcmQgZWluIFVudGVydmVrdG9yIGVyemV1Z3QsIGluCisgICAgICAgICAgICBkZW0gZGllIEluaGVyaXRzIGVpbmdldHJhZ2VuIHdlcmRlbi4gRGVyIFVudGVydmVrdG9yIGhhdCBkaWUKKyAgICAgICAgICAgIGdsZWljaGUgU3RydWt0dXIgd2llIGRlciBIYXVwdmVrdG9yLgorICAgICAgICAgIC0gPGZsYWc+ID0gSU5ITElTVF9UQUdfVklSVFVBTCAoMik6CisgICAgICAgICAgICBBbGxlIE5hbWVuIGltIEVyZ2VibmlzdmVrdG9yIGhhYmVuIGVpbiBsZWVyZXMgVGFnICIgICIgKHp3ZWkKKyAgICAgICAgICAgIExlZXJzY2hsYWVnZSkgZnVlciBub3JtYWxlIEluaGVyaXRzIHVuZCAidiAiIGZ1ZXIgdmlydHVlbGxlCisgICAgICAgICAgICBJbmhlcml0cyBhbHMgUHJhZWZpeCB2b3Jhbmdlc3RlbGx0LgorCisgICAgICAgIEFsbGUgRmxhZ3Mga29lbm5lbiBtaXQgZWluZW0gYmluYWVyZW4gT2RlciB8IHZlcmJ1bmRlbiB3ZXJkZW4sIHdvYmVpCisgICAgICAgIElOSExJU1RfRkxBVCB1bmQgSU5ITElTVF9UUkVFIHNpY2ggZ2VnZW5zZWl0aWcgYXVzc2NobGllc3Nlbi4KKworICAgICAgICBXZW5uIGVpbiBPYmpla3QsIGlua2x1c2l2ZSA8b2I+LCBlaW5lbSByZXBsYWNlX3Byb2dyYW1tKCkgdW50ZXJ3b3JmZW4KKyAgICAgICAgd2FyLCBzcGllZ2VsbiBkaWUgZ2VsaWVmZXJ0ZW4gRGF0ZWluYW1lbiBkYXMgZWZmZWt0aXYgYWt0aXZlIFByb2dyYW1tCisgICAgICAgIHdpZGVyLgorCisgICAgICAgIERpZSBJbmhlcml0cGZhZGUsIGRpZSBnZWxpZWZlcnQgd2VyZGVuLCBiZWdpbm5lbiBpbW1lciBtaXQgJy8nCisgICAgICAgIChhYnNvbHV0ZSBQZmFkZSksIGF1Y2ggd2VubiBkZXIgVHJlaWJlciBpbSBDT01QQVQgTW9kdXMgbGFldWZ0LgorCitCRUlTUElFTAorICAgICAgICBHZWdlYmVuIGZvbGdlbmRlIFZlcmVyYnVuZ3NzdHJ1a3R1cjoKKworICAgICAgICAgICAgLyBjIC0gZAorICAgICAgICAgIGEKKyAgICAgICAgICAgIFwgYgorCisgICAgICAgIFdvYmVpIGQgdmlydHVlbGwgZ2VlcmJ0IHdpcmQsIGVyZ2ViZW4gc2ljaCBmb2xnZW5kZSBSZXN1bHRhdGU6CisKKyAgICAgICAgICAgIGluaGVyaXRfbGlzdChhKSAtPiAoeyAiYSIsICJjIiwgImIiLCAiZCIgfSkKKyAgICAgICAgICAgIGluaGVyaXRfbGlzdChjKSAtPiAoeyAiYyIsICJkIiB9KQorICAgICAgICAgICAgaW5oZXJpdF9saXN0KGEsIDEpIC0+ICh7ICJhIiwgKHsgImMiLCAiZCIgfSksICJiIiB9KQorICAgICAgICAgICAgaW5oZXJpdF9saXN0KGEsIDMpIC0+ICh7ICIgIGEiLCAoeyAiIGMiLCAidiBkIiB9KSwgIiAgYiIgfSkKKworQUVOREVSVU5HRU4KKyAgICAgICAgVm9yIDMuMi44LCBiZWdhbm5lbiBkaWUgZ2VsaWVmZXJ0ZW4gTmFtZW4gbmllbWFscyBtaXQgZWluZW0gJy8nLgorICAgICAgICBMRE11ZCAzLjIuOSBmdWVocnRlIGRpZSBCYXVtc3RydWt0dXIgKF9UUkVFKSB1bmQgVGFncyBmdWVyIHZpcnR1ZWxsZQorICAgICAgICAgICAgSW5oZXJpdHMgKCJ2ICIpIGVpbi4KKworU0lFSEUgQVVDSAorICAgICAgICBkZWJ1Z19pbmZvKEUpLCBpbmNsdWRlX2xpc3QoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL2lucHV0X3RvIGIvZG9jL2VmdW4vaW5wdXRfdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFjYmQ5NwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2lucHV0X3RvCkBAIC0wLDAgKzEsMTQ2IEBACitTWU5PUFNJUworICAgICAgICAjaW5jbHVkZSA8c3lzL2lucHV0X3RvLmg+CisKKyAgICAgICAgdm9pZCBpbnB1dF90byhzdHJpbmd8Y2xvc3VyZSBmdW4pOworICAgICAgICB2b2lkIGlucHV0X3RvKHN0cmluZ3xjbG9zdXJlIGZ1biwgaW50IGZsYWcsIC4uLik7CisgICAgICAgIHZvaWQgaW5wdXRfdG8oc3RyaW5nfGNsb3N1cmUgZnVuLCBpbnQgZmxhZywgc3RyaW5nfGNsb3N1cmUgcHJvbXB0LCAuLi4pOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgRGllIG5hZWNoc3RlIFplaWxlLCBkaWUgZGVyIFNwaWVsZXIgZWludGlwcHQsIHdpcmQgYWxzIEFyZ3VtZW50IGFuIGRpZQorICAgICAgICBGdW5rdGlvbiA8ZnVuPiB1ZWJlcmdlYmVuLiBBdXNuYWhtZTogd2VubiBkaWUgbmFlY2hzdGUgWmVpbGUgbWl0IGVpbmVtCisgICAgICAgICchJyBiZWdpbm50LCB3aXJkIHNpZSBhbHMgS29tbWFuZG8gYXVzZ2V3ZXJ0ZXQgYnp3LiBhbiBkYXMgbGV0enRlCisgICAgICAgIGlucHV0X3RvKCkgdWViZXJnZWJlbiwgZGFzIGRhcyBJTlBVVF9JR05PUkVfQkFORyBGbGFnIGdlc2V0enQgaGF0LgorICAgICAgICBEaWUgRnVua3Rpb24gPGZ1bj4ga2FubiAic3RhdGljIiBkZWtsYXJpZXJ0IHNlaW4sIG5pY2h0IGFiZXIgInByaXZhdGUiCisgICAgICAgIChzb25zdCB3aXJkIHNpZSBuaWNodCBnZWZ1bmRlbikuCisKKyAgICAgICAgRGVyIEF1ZnJ1ZiB2b24gPGZ1bj4gZXJmb2xndCBuaWNodCBzb2ZvcnQsIHNvbmRlcm4gZXJzdCwgd2VubiBkZXIKKyAgICAgICAgU3BpZWxlciBkaWUgRW50ZXJ0YXN0ZSBkcnVlY2t0LgorCisgICAgICAgIFdlbm4gaW5wdXRfdG8oKSBtZWhyIGFscyBlaW5tYWwgcHJvIEZ1bmt0aW9uIGF1ZmdlcnVmZW4gd2lyZCwKKyAgICAgICAgd2lyZCBub3JtYWxlcndlaXNlIG51ciBkYXMgZXJzdGUgaW5wdXRfdG8oKSBiZXJ1ZWNrc2ljaHRpZ3QuCisgICAgICAgIERpZXNlIFZlcmhhbHRlbiBrYW5uIGR1cmNoIGRpZSBBbmdhYmUgdm9uIElOUFVUX0FQUEVORAorICAgICAgICBtb2RpZml6aWVydCB3ZXJkZW46IGluIGRpZXNlbSBGYWxsIHdpcmQgZGFzIGlucHV0X3RvKCkgYW4gZGllCisgICAgICAgIExpc3RlIGRlciBiZXJlaXRzIGFuaGFlbmdpZ2VuIGlucHV0X3RvcyBhbmdlaGFlbmd0IChzaWVoZQorICAgICAgICBCRUlTUElFTEUpLgorCisgICAgICAgIFdpcmQgYW5kZXJlcnNlaXRzIHdhZWhyZW5kIGVpbmVtIGxhdWZlbmRlbiBpbnB1dF90bygpIChtaXR0ZWxzICIhIiBhbQorICAgICAgICBaZWlsZW5hbmZhbmcpIGVpbmUgbmV1ZSBGdW5rdGlvbiBhdWZnZXJ1ZmVuLCBkaWUgd2llZGVydW0gZWluCisgICAgICAgIGlucHV0X3RvKCkgZW50aGFlbHQsIHdpcmQgZGFzIHVyc3BydWVuZ2xpY2hlIGlucHV0X3RvKCkgc28gbGFuZ2UKKyAgICAgICAgdW50ZXJicm9jaGVuLCBiaXMgZGFzIG5ldWUgaW5wdXRfdG8oKSBhYmdlYXJiZWl0ZXQgd3VyZGUsCisgICAgICAgIGFuc2NobGllc3NlbmQgd2lyZCBlcyB3aWVkZXIgYWt0aXYuCisKKyAgICAgICAgRGFzIG9wdGlvbmFsZSA8ZmxhZz4ga2FubiBlaW4gYmluYWVyZXMgT2RlciAofCkgZGVyIGZvbGdlbmRlbgorICAgICAgICBXZXJ0ZSBzZWluOgorCisgICAgICAgIElOUFVUX05PRUNITyAoMSk6CisgICAgICAgICAgICBEaWUgdm9tIFNwaWVsZXIgZWluZ2VnZWJlbmUgWmVpbGUgZXJ6ZXVndCBrZWluIEVjaG8gdW5kIHdpcmQgYXVjaAorICAgICAgICAgICAgbmljaHQgZXJrYW5udCwgd2VubiBkZXIgU3BpZWxlciBiZW9iYWNodGV0IHdpcmQuCisKKyAgICAgICAgICAgIERpZXNlciBNb2R1cyBrYW5uIG51ciBnZWFlbmRlcnQgd2VyZGVuLCB3ZW5uIHRlbG5ldCBlbmFibGVkIGlzdC4KKworICAgICAgICBJTlBVVF9DSEFSTU9ERSAoMik6CisgICAgICAgICAgICBEaWUgVmVyYmluZHVuZyB6dW0gVXNlciB3ZWNoc2VsdCB2b24gWmVpbGVuLSBhdWYgWmVpY2hlbm1vZHVzLiBTbworICAgICAgICAgICAgd2lyZCBudXIgZWluIGVpbnplbG5lcyBaZWljaGVuICghKSB2b20gU3BpZWxlciBlbXBmYW5nZW4uCisKKyAgICAgICAgICAgIElzdCB0ZWxuZXQgZGlzYWJsZWQsIHdpcmQgbGVkaWdsaWNoIGRpZSBJbnRlcnByZXRhdGlvbiBkZXIKKyAgICAgICAgICAgIGVpbmtvbW1lbmRlbiBEYXRlbiBkdXJjaCBkZW4gRHJpdmVyIHVtZ2VzY2hhbHRldCAtIGRhcworICAgICAgICAgICAgQ2xpZW50cHJvZ3JhbW0gZGVzIFNwaWVsZXIgdmVyYmxlaWJ0IGltIGdlcmFkZSBha3RpdmVuIE1vZHVzLgorCisgICAgICAgICAgICBOYWNoZGVtIGRpZSBGdW5rdGlvbiA8ZnVuPiBhdXNnZWZ1ZWhydCB3dXJkZSwgd2VjaHNlbHQgZGllCisgICAgICAgICAgICBWZXJiaW5kdW5nIHp1cnVlY2sgaW4gWmVpbGVubW9kdXMsIGF1c3NlciBlaW4gbmFjaGZvbGdlbmRlcworICAgICAgICAgICAgaW5wdXRfdG8oICwgMikgd3VyZGUgZ2VzdGFydGV0LgorCisgICAgICAgICAgICBaZWlsZW51bWJydWVjaGUgd2VyZGVuIGplIG5hY2ggQ2xpZW50IHVudGVyc2NoaWVkbGljaCBlbXBmYW5nZW4sCisgICAgICAgICAgICBlbnR3ZWRlciBhbHMgIiIsIGFscyAiXHIiIGdlZm9sZ3Qgdm9uICIiIG9kZXIgYWxzICJcciIgKGxldHp0ZXJlcworICAgICAgICAgICAga29tbXQgdm9yIGFsbGVtIGJlaSBXaW5kb3dzIENsaWVudHMgdm9yKS4KKworICAgICAgICAgICAgRGFzIEZyb250ZW5kIGRlcyBTcGllbGVycyBrYW5uIGRhdWVybmQgaW0gWmVpbGVubW9kdXMgYmxlaWJlbi4KKyAgICAgICAgICAgIEF1Y2ggd2VubiBpbnB1dF90bygpIG51ciBlaW4gZWluemVsbmVzIFplaWNoZW4gZm9yZGVydCwgbXVzcyBkZXIKKyAgICAgICAgICAgIFNwaWVsZXIgdW50ZXIgVW1zdGFlbmRlbiBkYXMgWmVpY2hlbiB1bmQgZWluZW4gWmVpbGVudW1icnVjaAorICAgICAgICAgICAgZHJ1ZWNrZW4gKHVuZCBzZW5kZW4pLiBOb3JtYWxlcndlaXNlIGVyaGFlbHQgPGZ1bj4gZGFubiBkZW4KKyAgICAgICAgICAgIGdlc2FtdGVuIElucHV0IGF1ZiBlaW5tYWwuCisKKyAgICAgICAgICAgIFdpbGwgbWFuIGxhZW5nZXIgaW0gWmVpY2hlbm1vZHVzIGJsZWliZW4sIGthbm4gZGVyIE92ZXJoZWFkCisgICAgICAgICAgICByZWR1emllcnQgd2VyZGVuLCBpbmRlbSBzZXRfY29tYmluZV9jaGFyc2V0KCkgdmVyd2VuZGV0IHdpcmQuIFNvCisgICAgICAgICAgICBrb2VubmVuIFplaWNoZW5zZXF1ZW56ZW4gYWxzIGVpbiBTdHJpbmcgYW5zdGVsbGUgdm9uCisgICAgICAgICAgICBaZWljaGVuLWZ1ZXItWmVpY2hlbiBlbXBmYW5nZW4gd2VyZGVuLiBJbiBlaW5lbSBzY3JlZW5vcmllbnRpZXJ0ZW4KKyAgICAgICAgICAgIEVkaXRvciBnaWx0IGRpZXMgZnVlciBkaWUgbWVpc3RlbiBkcnVja2JhcmVuIFplaWNoZW4uCisKKyAgICAgICAgSU5QVVRfUFJPTVBUICg0KToKKyAgICAgICAgICAgIERhcyBBcmd1bWVudCBuYWNoIGRlbSA8ZmxhZz4gd2lyZCBhbHMgUHJvbXB0IGZ1ZXIgZGllIEVpbmdhYmUKKyAgICAgICAgICAgIHZlcndlbmRldC4gV2VubiBkaWVzZXMgQXJndW1lbnQgbmljaHQgYW5nZWdlYmVuICh1bmQgZGFtaXQga2VpbgorICAgICAgICAgICAgUHJvcG10IGRlZmluaWVydCkgaXN0LCB3aXJkIGtlaW4gUHJvbXB0IGF1c2dlZ2ViZW4uCisKKyAgICAgICAgSU5QVVRfTk9fVEVMTkVUICg4KToKKyAgICAgICAgICAgIE1vZGlmaXppZXJ0IGRhcyBJTlBVVF9DSEFSTU9ERSBBcmd1bWVudDogZGVyIERyaXZlciBhZW5kZXJ0CisgICAgICAgICAgICBzZWluZSBCZWhhbmRsdW5nIHZvbiBlaW5nZWhlbmRlbiBEYXRlbiBlbnRzcHJlY2hlbmQgZGVtIF9DSEFSTU9ERQorICAgICAgICAgICAgQXJndW1lbnQsIHNlbmRldCBhYmVyIGtlaW5lIFRlbG5ldGtvbW1hbmRvcyB6dXIgQW5wYXNzdW5nCisgICAgICAgICAgICBkZXMgVmVyaGFsdGVucyBkZXMgQ2xpZW50cHJvZ3JhbW1lcy4KKworICAgICAgICBJTlBVVF9BUFBFTkQgKDE2KToKKyAgICAgICAgICAgIERhcyBpbnB1dF90bygpIHdpcmQgYW4gZGllIExpc3RlIGRlciBiZXJlaXRzIGFuaGFlbmdpZ2VuCisgICAgICAgICAgICBpbnB1dF90b3MgYW5nZWhhZW5ndC4KKworICAgICAgICBJTlBVVF9JR05PUkVfQkFORyAoMTI4KToKKyAgICAgICAgICAgIEVpbmdhYmVuLCBkaWUgbWl0ICEgYmVnaW5uZW4sIHdlcmRlbiBOSUNIVCBhbHMgS29tbWFuZGkgZ2VwYXJzZXQsCisgICAgICAgICAgICBzb25kZXJuIGF1Y2ggYWxzIEFyZ3VtZW50IGFuIGRpZSBGdW5raW9uIDxmdW4+IHVlYmVyZ2ViZW4uIERpZQorICAgICAgICAgICAgVmVyd2VuZHVuZyBkaWVzZXMgRmxhZ3MgaXN0IGVpbmdlc2NocmFlbmt0LgorCisgICAgICAgIEFsbGUgbmFjaGZvbGdlbmRlbiBBcmd1bWVudGUgd2VyZGVuIGFscyB6d2VpdGVzIGJ6dy4gZHJpdHRlcyB1c3cuCisgICAgICAgIEFyZ3VtZW50IGFuIDxmdW4+IHVlYmVyZ2ViZW4uCisKK0JFSVNQSUVMCisgICAgICAgIHZvaWQgZnVuYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIC4uLgorICAgICAgICAgICAgaW5wdXRfdG8oImVudGVyX25hbWUiLCBJTlBVVF9QUk9NUFQsICJXaWUgbGF1dGV0IGRlaW4gTmFtZT86Iik7CisgICAgICAgICAgICAvKiBGcnVlaGVyIGVybGVkaWd0ZSBtYW4gZGllcyBtaXQ6CisgICAgICAgICAgICAgKiAgIHdyaXRlKCJXaWUgbGF1dGV0IGRlaW4gTmFtZT86Iik7CisgICAgICAgICAgICAgKiAgIGlucHV0X3RvKCJlbnRlcl9uYW1lIik7CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAuLi4KKyAgICAgICAgIH0KKworICAgICAgICAgZW50ZXJfbmFtZShzdHJpbmcgc3RyKQorICAgICAgICAgeworICAgICAgICAgICAgd3JpdGUoIkhlaXNzdCBkdSB3aXJrbGljaCAnIitzdHIrIic/PyAqa2ljaGVyKlxuIik7CisgICAgICAgICAgICAuLi4KKyAgICAgICAgfQorCisgICAgICAgIEJlaSBkZXIgaW5wdXRfdG8oKSBBbndlaXN1bmcgZnVlaHJ0IGRlciBEcml2ZXIgZGllIEZ1bmt0aW9uCisgICAgICAgIGZ1bmMoKSBhdXMsIGVyd2FydGV0IGFiZXIgZ2xlaWNoemVpdGlnIElucHV0IHZvbSBTcGllbGVyLiBXZW5uCisgICAgICAgIGRpZXNlciBldHdhcyBlaW5nZWdlYmVuIFVORCBESUUgRU5URVJUQVNURSBHRURSVUVDS1QgSEFULCBhcmJlaXRldAorICAgICAgICBkZXIgRHJpdmVyIGRpZSBGdW5rdGlvbiBlbnRlcl9uYW1lKCkgbWl0IGRlbSBlaW5nZWdlYmVuZW4gU3RyaW5nCisgICAgICAgIGFscyBBcmd1bWVudCBhYi4KKworCisgICAgICAgIHZvaWQgZnVuYygpIHsKKyAgICAgICAgICAuLgorICAgICAgICAgIGlucHV0X3RvKCJlbnRlcl9maXJzdG5hbWUiKTsKKyAgICAgICAgICBpbnB1dF90bygiZW50ZXJfbGFzdG5hbWUsIElOUFVUX0FQUEVORCk7CisgICAgICAgICAgLi4uCisgICAgICAgIH0KKworICAgICAgICBEaWVzZSBTZXF1ZW56ZSBlcnpldWd0IHp3ZWkgaW5wdXRfdG9zOiBFaW5nYWJlbiBnZWhlbiB6dWVyc3QKKyAgICAgICAgYW4gZW50ZXJfZmlyc3RuYW1lKCk7IHVuZCB3ZW5uIGRpZXNlIEZ1bmt0aW9uIGZlcnRpZyBpc3QKKyAgICAgICAgKGVpbnNjaGxpZXNzbGljaCBldHdhaWdlciBlaWdlbmVyIG5vbi1JTlBVVF9BUFBFTkQgaW5wdXRfdG9zKSwgZ2VodAorICAgICAgICBkaWUgbmFlY2hzdGUgRWluZ2FiZSBhbiBlbnRlcl9sYXN0bmFtZSgpLgorCitBRU5ERVJVTkdFTgorICAgICAgICBEaWUgQmVkZXV0dW5nIHZvbiA8ZmxhZz4gd3VyZGUgaW4gMy4yLjFAOTMgZXJ3ZWl0ZXJ0LgorICAgICAgICBEaWUgTGltaXRpZXJ1bmcgZnVlciBkYXMgInN0YXBlbG4iIHZvbiBpbnB1dF90bygpcyBhdXMgIS1Lb21tYW5kaQorICAgICAgICAgICAgd3VyZGUgaW4gTERNdWQgMy4yLjggaW1wbGVtZW50aWVydC4KKyAgICAgICAgU2VpdCBMRE11ZCAzLjIuOCBrYW5uIDxmdW4+IGluIEZvcm0gZWluZXIgQ2xvc3VyZSBhbmdlZ2ViZW4gd2VyZGVuLgorICAgICAgICBMRE11ZCAzLjIuOSBmdWVocnRlIGRhcyBGbGFnIElOUFVUX1BST01QVCBzYW10IHp1Z2Vob2VyaWdlbSBBcmd1bWVudAorICAgICAgICAgICAgZWluLgorICAgICAgICBMRE11ZCAzLjIuMTEvMy4zLjU5MyBmdWVocnRlIGRhcyBJTlBVVF9OT19URUxORVQgRmxhZyBlaW4uCisgICAgICAgIExETXVkIDMuMi4xMS8zLjMuNjM3IGZ1ZWhydGUgZGFzIElOUFVUX0FQUEVORCBGbGFnIGVpbi4KKworQlVHUworICAgICAgICBJbSBaZWljaGVubW9kdXMgc29sbHRlbiBaZWlsZW51bWJydWVjaGUgZWlnZW50bGljaCBhbHMgIlxuIiB6dXJ1ZWNrCisgICAgICAgIGdlZ2ViZW4gd2VyZGVuLiBEaWVzIGFsbGVyZGluZ3Mga2FubiBleGlzdGllcmVuZGVuIENvZGUgemVyc3RvZXJlbi4KKworU0lFSEUgQVVDSAorICAgICAgICBjYWxsX290aGVyKEUpLCBzc2NhbmYoRSksIHByaXZpbGVnZV92aW9sYXRpb24oTSksCisgICAgICAgIHNldF9jb21iaW5lX2NoYXJzZXQoRSksIHF1ZXJ5X2lucHV0X3BlbmRpbmcoRSksIGZpbmRfaW5wdXRfdG8oRSksCisgICAgICAgIGlucHV0X3RvX2luZm8oRSksIHJlbW92ZV9pbnB1dF90byhFKSwgZW5hYmxlX3RlbG5ldChFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vaW5wdXRfdG9faW5mbyBiL2RvYy9lZnVuL2lucHV0X3RvX2luZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRhYzNkMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2lucHV0X3RvX2luZm8KQEAgLTAsMCArMSwyMSBAQAorU1lOT1BTSVMKKyAgICAgICAgKm1peGVkIGlucHV0X3RvX2luZm8ob2JqZWN0IHBsYXllcik7CisKK0JFU0NIUkVJQlVORworICAgICAgICBMaWVmZXJ0IGVpbiBBcnJheSBhbGxlciBmdWVyIDxwbGF5ZXI+IGhhZW5naWdlbiBpbnB1dF90bygpcy4gRGVyCisgICAgICAgIGVyc3RlIEVpbnRyYWcgaW0gQXJyYXkgaXN0IGRlciBhZWx0ZXN0ZSBoYWVuZ2lnZSBpbnB1dF90bygpCisgICAgICAgIChkZXJqZW5pZ2UsIHdlbGNoZXIgYWxzIGVyc3RlcyBnZXN0YXJ0ZXQgd3VyZGUpLCBkZXIgbGV0enRlCisgICAgICAgIEVpbnRyYWcgaXN0IGRlciBuZXVzdGUgaW5wdXRfdG8oKS4KKworICAgICAgICBKZWRlciBFaW50cmFnIGltIEFycmF5IGlzdCB3aWVkZXJ1bSBlaW4gQXJyYXkgdm9uIDIgb2RlciBtZWhyCisgICAgICAgIEVpbnRyYWVnZW4sIGRhcyBmb2xnZW5kZSBFbGVtZW50ZSBlbnRoYWVsdDoKKyAgICAgICAgICAgIDA6ICAgRGFzIE9iamVrdCAobnVyLCB3ZW5uIGRpZSBGdW5rdGlvbiBlaW4gc3RyaW5nIGlzdCkKKyAgICAgICAgICAgIDE6ICAgRGllIEZ1bmt0aW9uIChTdHJpbmcgb2RlciBDbG9zdXJlKQorICAgICAgICAgICAgMmZmOiBEaWUgQXJndW1lbnRlCisKK0FFTkRFUlVOR0VOCisgICAgICAgIEVpbmdlZnVlaHJ0IGluIExETXVkIDMuMi45LgorCitTSUVIRSBBVUNICisgICAgICAgIGlucHV0X3RvKEUpLCBmaW5kX2lucHV0X3RvKEUpLCByZW1vdmVfaW5wdXRfdG8oRSksCisgICAgICAgIHF1ZXJ5X2lucHV0X3BlbmRpbmcoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL2luc2VydF9hbGlzdCBiL2RvYy9lZnVuL2luc2VydF9hbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWFjYTRlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vaW5zZXJ0X2FsaXN0CkBAIC0wLDAgKzEsMjggQEAKK09QVElPTkFMLCBWRVJBTFRFVAorU1lOT1BTSVMKKyAgICAgICAgbWl4ZWQgKmluc2VydF9hbGlzdChtaXhlZCBrZXksIG1peGVkIGRhdGEsIC4uLiAsIG1peGVkICphbGlzdCk7CisgICAgICAgIGludCAgICBpbnNlcnRfYWxpc3QobWl4ZWQga2V5LCBtaXhlZCAqa2V5cyk7CisKK0JFU0NIUkVJQlVORworICAgICAxLiBGb3JtOiBFaW5mdWVnZW4gaW4gZWluZSBBbGlzdC4KKyAgICAgICAgRGVyIDxrZXk+IHVuZCBhbGxlIGZvZ2xlbmRlbiA8ZGF0YT4gQXJndW1lbnRlIHdlcmRlbiBpbiBkaWUgQWxpc3QKKyAgICAgICAgZWluZ2VmdWVndC4gV2VubiBiZXJlaXRzIGVpbiBFaW50cmFnIGZ1ZXIgPGtleT4gZXhpc3RpZXJ0LCB3ZXJkZW4KKyAgICAgICAgbnVyIGRpZSA8ZGF0YT4gRWludHJhZWdlIGVyc2V0enQuIE5hdHVlcmxpY2ggbXVzcyBkaWUgQW56YWhsIDxkYXRhPgorICAgICAgICBBcmd1bWVudGUgZGVyIEFuemFobCBkZXIgRGF0ZW5hcnJheXMgaW4gZGVyIEFsaXN0IGVudHNwcmVjaGVuLgorICAgICAgICBEYXMgUmVzdWx0YXQgZGllc2VyIE9wZXJhdGlvbiBpc3QgZGllIG5ldWUgQWxpc3QuCisKKyAgICAgMi4gRm9ybTogRWluZnVlZ2VuIGVpbmVzIEtleXMKKyAgICAgICAgRGVyIDxrZXk+IHdpcmQgaW4gZWluIChnZW9yZG5ldGVzKSBBcnJheSB2b24gPGtleXM+IGVpbmdlb3JkbmV0LAorICAgICAgICBzb2Rhc3MgbmFjaGZvbGdlbmRlcyBhc3NvYygpcyBzY2huZWxsIHN1Y2hlbiBrb2VubmVuLiBEYXMgUmVzdWx0YXQKKyAgICAgICAgaXN0IGRlciBJbmRleCwgdW50ZXIgZGVtIDxrZXk+IGVpbmdlZnVlZ3Qgb2RlciBiZXJlaXRzIGdlZnVuZGVuCisgICAgICAgIHd1cmRlLgorCitBTk1FUktVTkcKKyAgICAgICAgV2lyZCBtaXQgU3RyaW5nLUtleXMgZ2VhcmJlaXRldCwga2FubiBkZXIgSW5kZXggbmFjaCBkZW0gbmFlY2hzdGVuCisgICAgICAgIEF1ZnJ1ZiB2b24gaW5zZXJ0X2FsaXN0KCkgbmljaHQgbWVociBndWVsdGlnIHNlaW4uCisKKyAgICAgICAgS29tcGxleGl0YWV0OiBPKGxnKG4pICsgYSpuKSBmdWVyIG4gZ2xlaWNoIGRlciBBbnphaGwgZGVyIEtleXMgdW5kCisgICAgICAgIGVpbmUgc2VociBrbGVpbmUgS29uc3RhbnRlIHMgKGZ1ZXIgQmxvY2t2ZXJzY2hpZWJ1bmdlbikuCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgYWxpc3RzKExQQyksIGFzc29jKEUpLCBvcmRlcl9hbGlzdChFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vaW50ZXJhY3RpdmUgYi9kb2MvZWZ1bi9pbnRlcmFjdGl2ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzI2ZjhhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vaW50ZXJhY3RpdmUKQEAgLTAsMCArMSwxMCBAQAorU1lOT1BTSVMKKyAgICAgICAgaW50IGludGVyYWN0aXZlKG9iamVjdCBvYmopOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgTGllZmVydCAxIHp1cnVlY2ssIHdlbm4gPG9iaj4gZWluIGludGVyYWt0aXZlciBVc2VyIChlaW4gU3BpZWxlcikKKyAgICAgICAgaXN0LiBXaXJkIDxvYmo+IHdlZ2dlbGFzc2VuLCBkYW5uIHdpcmQgdGhpc19vYmplY3QoKSB2ZXJ3ZW5kZXQuCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShFKSwgcXVlcnlfaXBfbnVtYmVyKEUpLCBxdWVyeV9pcF9uYW1lKEUpLAorICAgICAgICBxdWVyeV9pZGxlKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9pbnRlcmFjdGl2ZV9pbmZvIGIvZG9jL2VmdW4vaW50ZXJhY3RpdmVfaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2MyODc3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vaW50ZXJhY3RpdmVfaW5mbwpAQCAtMCwwICsxLDEwNiBAQAorU1lOT1BTSVMKKyAgICAgICAgI2luY2x1ZGUgPGludGVyYWN0aXZlX2luZm8uaD4KKworICAgICAgICBtaXhlZCBpbnRlcmFjdGl2ZV9pbmZvKG9iamVjdCBvYiwgaW50IHdoYXQpCisKK0RFU0NSSVBUSU9OCisgICAgICAgIFJldHVybnMgc29tZSBpbnRlcm5hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW50ZXJhY3RpdmUgdXNlciA8b2I+LgorICAgICAgICBUaGUgYXJndW1lbnQgPHdoYXQ+IGRldGVybWluZXMgd2hpY2ggaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQuCisKKyAgICAgICAgSXQgY2FuIGJlIGVpdGhlciBhIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGFzIGdpdmVuIHRvCisgICAgICAgIGNvbmZpZ3VyZV9pbnRlcmFjdGl2ZSgpIG9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CisKKworCisgICAgICAgIENvbm5lY3Rpb24gSW5mb3JtYXRpb246CisKKyAgICAgICAgPHdoYXQ+ID09IElJX0lQX05BTUU6CisgICAgICAgICAgVGhlIGhvc3RuYW1lIG9mIDxvYj4uIFRoZSBob3N0bmFtZSB3aWxsIGFzeW5jaHJvbm91c2x5CisgICAgICAgICAgbG9va2VkIHVwIGJ5IHRoZSBFUlEgZGFlbW9uIGFuZCBtaWdodCB0aGVyZWZvcmUgbm90IGJlCisgICAgICAgICAgYXZhaWxhYmxlIGF0IHRoZSB0aW1lIG9mIHRoZSBmaXJzdCBjb25uZWN0aW9uLgorICAgICAgICAgIElmIG5vIG5hbWUgaXMgYXZhaWxhYmxlIHRoZSBhZGRyZXNzIHdpbGwgYmUgcmV0dXJuZWQuCisKKyAgICAgICAgPHdoYXQ+ID09IElJX0lQX05VTUJFUjoKKyAgICAgICAgICBUaGUgSVAgYWRkcmVzcyBvZiA8b2I+IGdpdmVuIGFzIGEgc3RyaW5nLgorCisgICAgICAgIDx3aGF0PiA9PSBJSV9JUF9QT1JUOgorICAgICAgICAgIFRoZSBjbGllbnQgcG9ydCBudW1iZXIgb2YgPG9iPi4KKworICAgICAgICA8d2hhdD4gPT0gSUlfSVBfQUREUkVTUzoKKyAgICAgICAgICBUaGUgZnVsbCBzb2NrZXQgYWRkcmVzcyBzdHJ1Y3R1cmUgZ2l2ZW4gYXMgYW4gYXJyYXkgb2YgYnl0ZXMuCisKKyAgICAgICAgICBGb3IgSVB2NCAoc29ja2FkZHJfaW4pOgorICAgICAgICAgICAgICBhcnJheVswLi4gMV06IHNpbl9mYW1pbHkKKyAgICAgICAgICAgICAgYXJyYXlbMi4uIDNdOiBzaW5fcG9ydAorICAgICAgICAgICAgICBhcnJheVs0Li4gN106IHNpbl9hZGRyCisgICAgICAgICAgICAgIGFycmF5WzguLjE1XTogdW5kZWZpbmVkLgorCisgICAgICAgICAgRm9yIElQdjYgKHNvY2thZGRyX2luNik6CisgICAgICAgICAgICAgIGFycmF5WyAwLi4gMV06IHNpbjZfZmFtaWx5CisgICAgICAgICAgICAgIGFycmF5WyAyLi4gM106IHNpbjZfcG9ydAorICAgICAgICAgICAgICBhcnJheVsgNC4uIDddOiBzaW42X2Zsb3dpbmZvCisgICAgICAgICAgICAgIGFycmF5WyA4Li4yM106IHNpbjZfYWRkcgorICAgICAgICAgICAgICBhcnJheVsyNC4uMjddOiBzaW42X3Njb3BlX2lkCisKKyAgICAgICAgPHdoYXQ+ID09IElJX01VRF9QT1JUOgorICAgICAgICAgIFRoZSBzZXJ2ZXIgcG9ydCBudW1iZXIgdGhhdCA8b2I+IGNvbm5lY3RlZCB0by4KKworCisKKyAgICAgICAgVGVsbmV0IFJlbGF0ZWQgSW5mb3JtYXRpb246CisKKyAgICAgICAgPHdoYXQ+ID09IElJX01DQ1BfU1RBVFM6CisgICAgICAgICAgU3RhdGlzdGljcyBhYm91dCB0aGUgY3VycmVudCBjb21wcmVzc2lvbiBvZiA8b2I+IGdpdmVuCisgICAgICAgICAgYXMgYW4gYXJyYXkgKHsgdW5jb21wcmVzc2VkIGJ5dGVzLCBjb21wcmVzc2VkIGJ5dGVzIH0pLgorCisgICAgICAgICAgSWYgdGhlIGNvbm5lY3Rpb24gaXMgbm90IGNvbXByZXNzZWQsIDAgaXMgcmV0dXJuZWQuCisKKyAgICAgICAgICBBdmFpbGFibGUgb25seSBpZiB0aGUgZHJpdmVyIGlzIGNvbXBpbGVkIHdpdGggTUNDUCBlbmFibGVkOworICAgICAgICAgIF9fTUNDUF9fIGlzIGRlZmluZWQgaW4gdGhhdCBjYXNlLgorCisKKworICAgICAgICBJbnB1dCBIYW5kbGluZzoKKworICAgICAgICA8d2hhdD4gPT0gSUlfSU5QVVRfUEVORElORzoKKyAgICAgICAgICBJZiA8b2I+IGhhcyBhbiBpbnB1dF90bygpIHBlbmRpbmcsIHRoZSBvYmplY3QgdGhhdCBoYXMgY2FsbGVkCisgICAgICAgICAgdGhlIGlucHV0X3RvKCkgaXMgcmV0dXJuZWQsIGVsc2UgMC4KKworICAgICAgICA8d2hhdD4gPT0gSUlfRURJVElORzoKKyAgICAgICAgICBJZiA8b2I+IGlzIGN1cnJlbnRseSBlZGl0aW5nIHdpdGggZWQoKSBhbmQgZWQoKSB3YXMgY2FsbGVkIHdpdGgKKyAgICAgICAgICBhbiBleGl0IGZ1bmN0aW9uLCB0aGVuIHRoZSBvYmplY3QgdGhhdCBoYXMgY2FsbGVkIGVkKCkKKyAgICAgICAgICB3aWxsIGJlIHJldHVybmVkLCAwIG90aGVyd2lzZS4KKworICAgICAgICA8d2hhdD4gPT0gSUlfSURMRToKKyAgICAgICAgICBUaGUgbnVtYmVyIG9mIHNlY29uZHMgdGhhdCB0aGUgaW50ZXJhY3RpdmUgb2JqZWN0IDxvYj4gaGFzIGJlZW4KKyAgICAgICAgICBpZGxlLgorCisKKworICAgICAgICBPdXRwdXQgSGFuZGxpbmc6CisKKyAgICAgICAgPHdoYXQ+ID09IElJX1NOT09QX05FWFQ6CisgICAgICAgICAgUmV0dXJucyB0aGUgdXNlciB3aG8gaXMgY3VycmVudGx5IHNub29waW5nIDxvYj4uCisgICAgICAgICAgVGhlIGNhbGxpbmcgb2JqZWN0IG11c3QgYmUgcHJpdmlsZWdlZCBieSB0aGUgbWFzdGVyIG9iamVjdAorICAgICAgICAgIHZpYSB2YWxpZF9xdWVyeV9zbm9vcCgpLgorCisgICAgICAgIDx3aGF0PiA9PSBJSV9TTk9PUF9QUkVWOgorICAgICAgICAgIFJldHVybnMgdGhlIHZpY3RpbSB3aG8gaXMgY3VycmVudGx5IHNub29wZWQgYnkgPG9iPi4KKyAgICAgICAgICBUaGUgY2FsbGluZyBvYmplY3QgbXVzdCBiZSBwcml2aWxlZ2VkIGJ5IHRoZSBtYXN0ZXIgb2JqZWN0CisgICAgICAgICAgdmlhIHZhbGlkX3F1ZXJ5X3Nub29wKCkuCisKKyAgICAgICAgPHdoYXQ+ID09IElJX1NOT09QX0FMTDoKKyAgICAgICAgICBSZXR1cm5zIGFsbCBvYmplY3RzIHdobyBhcmUgY3VycmVudGx5IHNub29waW5nIDxvYj4uCisgICAgICAgICAgT25seSBvbmUgb2JqZWN0IGNhbiBzbm9vcCA8b2I+IGRpcmVjdGx5LCBidXQgdGhhdCB1c2VyIG1pZ2h0CisgICAgICAgICAgYmUgc25vb3BlZCwgdG9vLCBhbmQgc28gYnVpbGRpbmcgYSBjaGFpbiB0aGF0IGlzIHJldHVybmVkCisgICAgICAgICAgYXMgYW4gYXJyYXkuCisKKyAgICAgICAgICBUaGUgY2FsbGluZyBvYmplY3QgbXVzdCBiZSBwcml2aWxlZ2VkIGJ5IHRoZSBtYXN0ZXIgb2JqZWN0CisgICAgICAgICAgdmlhIHZhbGlkX3F1ZXJ5X3Nub29wKCkuCisKKworSElTVE9SWQorICAgICAgICBJbnRyb2R1Y2VkIGluIExETXVkIDMuNS4wLgorCitTRUUgQUxTTworICAgICAgICBjb25maWd1cmVfaW50ZXJhY3RpdmUoRSksIG9iamVjdF9pbmZvKEUpLCBkcml2ZXJfaW5mbyhFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vaW50cCBiL2RvYy9lZnVuL2ludHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE2YTBmMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2ludHAKQEAgLTAsMCArMSwxMCBAQAorU1lOT1BTSVMKKyAgICAgICAgaW50IGludHAobWl4ZWQgYXJnKQorCitCRVNDSFJFSUJVTkcKKyAgICAgICAgTGllZmVydCAxLCB3ZW5uIGRhcyBBcmd1bWVudCBlaW5lIEdhbnp6YWhsIChJbnRlZ2VyKSBpc3QsIGFuc29uc3RlbgorICAgICAgICAwLgorCitTSUVIRSBBVUNICisgICAgICAgIGNsb3N1cmVwKEUpLCBmbG9hdHAoRSksIG1hcHBpbmdwKEUpLCBvYmplY3RwKEUpLCBwb2ludGVycChFKSwKKyAgICAgICAgcmVmZXJlbmNlcChFKSwgc3RyaW5ncChFKSwgc3ltYm9scChFKSwgY2xvbmVwKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9pbnZlcnRfYml0cyBiL2RvYy9lZnVuL2ludmVydF9iaXRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YmJlNmQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9pbnZlcnRfYml0cwpAQCAtMCwwICsxLDE3IEBACitTWU5PUFNJUworICAgICAgICBzdHJpbmcgaW52ZXJ0X2JpdHMoc3RyaW5nIHN0cik7CisKK0JFU0NIUkVJQlVORworICAgICAgICBJbnZlcnRpZXJ0IGRlbiBTdGF0dXMgYWxsZXIgQml0cyBpbSBCaXRzdHJpbmcgPHN0cj4gdW5kIGxpZWZlcnQgZGVuCisgICAgICAgIG5ldWVuIFN0cmluZyB6dXJ1ZWNrLiBEYWJlaSBibGVpYnQgZGllIExhZW5nZSB2b24gPHN0cj4sIGFsc28gZGllCisgICAgICAgIGdlc2FtdGUgQW56YWhsIEJpdHMsIGRpZSBnbGVpY2hlLgorCitCRUlTUElFTAorICAgICAgICBzdHJpbmcgczsKKyAgICAgICAgcyA9IHNldF9iaXQoIiIsIDMpOyBzID0gc2V0X2JpdChzLCA0KTsgcyA9IHNldF9iaXQocywgMTUpOworICAgICAgICAtLT4gcyBpc3QgbnVuICAiOCAoIgorICAgICAgICBpbnZlcnRfYml0cyhzKSAtLT4gbGllZmVydCAiR19XIgorCitTSUVIRSBBVUNICisgICAgICAgIHNldF9iaXQoRSksIGNsZWFyX2JpdChFKSwgdGVzdF9iaXQoRSksIGxhc3RfYml0KEUpLCBhbmRfYml0cyhFKSwKKyAgICAgICAgb3JfYml0cyhFKSwgeG9yX2JpdHMoRSksIGNvdW50X2JpdHMoRSksIGNvcHlfYml0cyhFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vanNvbl9wYXJzZSBiL2RvYy9lZnVuL2pzb25fcGFyc2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlmNGMzMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2pzb25fcGFyc2UKQEAgLTAsMCArMSw0NSBAQAorT1BUSU9OQUwKK0VYUEVSSU1FTlRBTAorU1lOT1BTSVMKKworICAgICAgICBtaXhlZCBqc29uX3BhcnNlKHN0cmluZyBqc29uc3RyaW5nKQorCitERVNDUklQVElPTgorICAgICAgICBUaGlzIGVmdW4gcGFyc2VzIHRoZSBKU09OIG9iamVjdCBlbmNvZGVkIGFzIHN0cmluZyBpbiA8anNvbnN0cj4gaW50byBhCisgICAgICAgIHN1aXRhYmxlIExQQyB0eXBlLgorICAgICAgICAKKyAgICAgICAgSGFuZGxlcyB0aGUgZm9sbG93aW5nIEpTT04gdHlwZXM6CisgICAgICAgIDxudWxsPiAgICAgICAgLT4gaW50ICgwKQorICAgICAgICA8Ym9vbGVhbj4gICAgIC0+IGludCAoMCBvciAxKQorICAgICAgICA8aW50IHwgaW50NjQ+IC0+IGludAorICAgICAgICA8ZG91YmxlPiAgICAgIC0+IGZsb2F0CisgICAgICAgIDxzdHJpbmc+ICAgICAgLT4gc3RyaW5nCisgICAgICAgIDxvYmplY3Q+ICAgICAgLT4gbWFwcGluZworICAgICAgICA8YXJyYXk+ICAgICAgIC0+IGFycmF5cworICAgICAgICBBbGwgb3RoZXIgSlNPTiB0eXBlcyBjYXVzZSBhIHJ1bnRpbWUgZXJyb3IuCisKKyAgICAgICAgVGhlIEpTT04gb2JqZWN0IGNhbiBuZXN0IG90aGVyIEpTT04gb2JqZWN0cy4KKyAgICAgICAgCisgICAgICAgIFRoZSBmdW5jdGlvbiBpcyBhdmFpbGFibGUgb25seSBpZiB0aGUgZHJpdmVyIGlzIGNvbXBpbGVkIHdpdGggSWtzZW1lbAorICAgICAgICBzdXBwb3J0LiBJbiB0aGF0IGNhc2UsIF9fSlNPTl9fIGlzIGRlZmluZWQuIAorIAorTElNSVRBVElPTlMKKyAgICAgICAgNjQgYml0IHdpZGUgaW50ZWdlcnMgY2FuIG9ubHkgYmUgcGFyc2VkIGxvc3NsZXNzbHkgb24gaG9zdHMgd2l0aAorICAgICAgICBhIDY0IGJpdCB3aWRlIExQQyBpbnQgYW5kIGpzb24tYyBsaWJyYXJ5IG5ld2VyIHRoYW4gMC45MC4KKworQlVHUworICAgICAgICBfX0ZMT0FUX01JTl9fIGlzIG5vdCBzZXJpYWxpemVkL3BhcnNlZCBsb3NzbGVzc2x5LgorCitFWEFNUExFUworICAgICAgICBqc29uX3BhcnNlKCI0MiIpICAgICAgICAgICAgICAtPiA0MgorICAgICAgICBqc29uX3BhcnNlKCI0Mi4wIikgICAgICAgICAgICAtPiA0Mi4wCisgICAgICAgIGpzb25fcGFyc2UoIlwiaGVsbG8gd29ybGRcXG5cIiIpICAgLT4gImhlbGxvIHdvcmxkXG4iCisgICAgICAgIGpzb25fcGFyc2UoIlsgMSwgMiwgMywgNCwgNSwgNiBdIikgLT4gKHsxLDIsMyw0LDUsNn0pCisgICAgICAgIGpzb25fcGFyc2UoInsgXCJ0ZXN0IDJcIjogNDIuMDAwMDAwLCBcInRlc3QgMVwiOiA0MiB9IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gKFsgInRlc3QgMSI6IDQyLCAidGVzdCAyIjogNDIuMCBdKQorICAgICAgICAKK0hJU1RPUlkKKyAgICAgICAgQWRkZWQgaW4gTERNdWQgMy41LjAKKworU0VFIEFMU08KKyAgICAgICAganNvbl9zZXJpYWxpemUoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL2pzb25fc2VyaWFsaXplIGIvZG9jL2VmdW4vanNvbl9zZXJpYWxpemUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ2OGRlYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2pzb25fc2VyaWFsaXplCkBAIC0wLDAgKzEsNDUgQEAKK09QVElPTkFMCitFWFBFUklNRU5UQUwKK1NZTk9QU0lTCisKKyAgICAgICAgc3RyaW5nIGpzb25fc2VyaWFsaXplKG1peGVkIDxkYXRhPikKKworREVTQ1JJUFRJT04KKyAgICAgICAgVGhpcyBlZnVuIGNyZWF0ZXMgYSBKU09OIG9iamVjdCBmcm9tIHRoZSBnaXZlbiBMUEMgdmFyaWFibGUgYW5kCisgICAgICAgIHJldHVybnMgdGhlIG9iamVjdCBlbmNvZGVkIGFzIGEgTFBDIHN0cmluZy4gRm9yIGNvbnRhaW5lciB0eXBlcyBsaWtlIAorICAgICAgICBhcnJheXMsIG1hcHBpbmdzIGFuZCBzdHJ1Y3RzLCB0aGlzIHdpbGwgYmUgZG9uZSByZWN1cnNpdmVseS4KKyAgICAgICAgCisgICAgICAgIE9ubHkgdGhlIGZvbGxvd2luZyBMUEMgdHlwZXMgYXJlIHNlcmlhbGl6ZWQuIEFsbCBvdGhlciBMUEMgdHlwZXMgY2F1c2UKKyAgICAgICAgYSAgcnVudGltZSBlcnJvci4KKyAgICAgICAgPGludD4gICAgICAgIC0+IEpTT04gaW50CisgICAgICAgIDxmbG9hdD4gICAgICAtPiBKU09OIGRvdWJsZQorICAgICAgICA8c3RyaW5nPiAgICAgLT4gSlNPTiBzdHJpbmcKKyAgICAgICAgPG1hcHBpbmc+ICAgIC0+IEpTT04gb2JqZWN0cworICAgICAgICA8YXJyYXk+ICAgICAgLT4gSlNPTiBhcnJheXMKKyAgICAgICAgPHN0cnVjdD4gICAgIC0+IEpTT04gb2JqZWN0cworICAgICAgICAKKyAgICAgICAgVGhlIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSBvbmx5IGlmIHRoZSBkcml2ZXIgaXMgY29tcGlsZWQgd2l0aCBJa3NlbWVsCisgICAgICAgIHN1cHBvcnQuIEluIHRoYXQgY2FzZSwgX19KU09OX18gaXMgZGVmaW5lZC4gCisKK0xJTUlUQVRJT05TIAorICAgICAgICBPbmx5IG1hcHBpbmdzIHdpdGggYSB3aWR0aCBvZiAxIHZhbHVlIHBlciBrZXkgYW5kIG9ubHkgc3RyaW5nIGtleXMKKyAgICAgICAgY2FuIGJlIHNlcmlhbGl6ZWQuCisgICAgICAgIDY0IGJpdCB3aWRlIGludGVnZXJzIGNhbiBvbmx5IGJlIHNlcmlhbGl6ZWQgbG9zc2xlc3NseSBvbiBob3N0cyB3aXRoCisgICAgICAgIGEgNjQgYml0IHdpZGUgTFBDIGludCBhbmQganNvbi1jIGxpYnJhcnkgbmV3ZXIgdGhhbiAwLjkwLgorCitCVUdTCisgICAgICAgIF9fRkxPQVRfTUlOX18gaXMgbm90IHNlcmlhbGl6ZWQvcGFyc2VkIGxvc3NsZXNzbHkuCisKK0VYQU1QTEVTCisgICAgICAgIGpzb25fc2VyaWFsaXplKDQyKSAgICAgICAgICAgICAgLT4gIjQyIgorICAgICAgICBqc29uX3NlcmlhbGl6ZSg0Mi4wKSAgICAgICAgICAgIC0+ICI0Mi4wIgorICAgICAgICBqc29uX3NlcmlhbGl6ZSgiaGVsbG8gd29ybGRcbiIpIC0+ICJcImhlbGxvIHdvcmxkXFxuXCIiCisgICAgICAgIGpzb25fc2VyaWFsaXplKCh7MSwyLDMsNCw1LDZ9KSkgLT4gIlsgMSwgMiwgMywgNCwgNSwgNiBdIgorICAgICAgICBqc29uX3NlcmlhbGl6ZSgoWyAidGVzdCAxIjogNDIsICJ0ZXN0IDIiOiA0Mi4wIF0pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAieyBcInRlc3QgMlwiOiA0Mi4wMDAwMDAsIFwidGVzdCAxXCI6IDQyIH0iCisgICAgICAgIAorSElTVE9SWQorICAgICAgICBBZGRlZCBpbiBMRE11ZCAzLjUuMAorCitTRUUgQUxTTworICAgICAgICBqc29uX3BhcnNlKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9sYW1iZGEgYi9kb2MvZWZ1bi9sYW1iZGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE1Njc5OAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2xhbWJkYQpAQCAtMCwwICsxLDI4IEBACitTWU5PUFNJUworICAgICAgICBjbG9zdXJlIGxhbWJkYShtaXhlZCAqYXJyLCBtaXhlZCk7CisKK0JFU0NIUkVJQlVORworICAgICAgICBFcnpldWd0IGVpbmUgTGFtYmRhIENsb3N1cmUsIGVudHNwcmVjaGVuZCBkZW4gTGFtZGEgQ2xvc3VyZXMgaW4gTElTUC4KKyAgICAgICAgRGllIENsb3N1cmUgaXN0IGFuIGRhcyBPYmpla3QgZ2VidW5kZW4sIGRhcyBzaWUgZXJ6ZXVndCBoYXQsIHVuZCBrYW5uCisgICAgICAgIGRlc2hhbGIgVmVyd2Vpc2UgYXVmIGdsb2JhbGUgVmFyaWFibGVuIGVudGhhbHRlbi4KKworICAgICAgICBEYXMgZXJzdGUgQXJndW1lbnQgaXN0IGVpbiBBcnJheSwgZGFzIGRpZSBBcmd1bWVudGUgKFN5bWJvbGUpCisgICAgICAgIGJlc2NocmVpYnQsIGRpZSBkZXIgQ2xvc3VyZSBiZWkgaWhyZXIgQXVzd2VydHVuZyBkdXJjaCBmdW5jYWxsKCkKKyAgICAgICAgb2RlciBhcHBseSgpIHVlYmVyZ2ViZW4gd2VyZGVuLgorCisgICAgICAgIFZvbiBkZXIgVmVyd2VuZHVuZyB3aXJkIGF1cyBMZXNiYXJrZWl0cy0gdW5kIFdhcnR1bmdzZ3J1ZW5kZW4gZHJpbmdlbmQKKyAgICAgICAgYWJnZXJhdGVuLgorCitCRUlTUElFTAorICAgICAgICAvLyBMYW1iZGFzIHdlcmRlbiBnZXJuIGVpbmdlc2V0enQsIHVtIGtvbXBsZXhlcmUgRmlsdGVyIHp1IHNjaHJlaWJlbgorICAgICAgICAvLyBBbGxlcmRpbmdzIGthbm4gamVkZSBMYW1iZGEgZGFiZWkgYXVjaCBkdXJjaCBlaW5lIElubGluZS1DbG9zdXJlCisgICAgICAgIC8vIG9kZXIgZWluZSBMRnVuLUNsb3N1cmUgZXJzZXR6dCB3ZXJkZW4uCisgICAgICAgIGZpbHRlcih1c2VycygpLCAKKyAgICAgICAgICBsYW1iZGEoKHsneH0pLAorICAgICAgICAgICAgICAgICAoeyMnPT0sCisgICAgICAgICAgICAgICAgICAgKHsjJ2NhbGxfb3RoZXIsJ3gsIlF1ZXJ5UHJvcCIsUF9TRUNPTkR9KSwiZ2xvaW5zb24iCisgICAgICAgICAgICAgICAgfSkpKTsKKworU0lFSEUgQVVDSAorICAgICAgICBWZXJ3YW5kdDogdW5ib3VuZF9sYW1iZGEoRSksIGFwcGx5KEUpLCBmdW5jYWxsKEUpLCBiaW5kX2xhbWJkYShFKQorICAgICAgICBHZW5lcmVsbDogY2xvc3VyZXMtYWJzdHJhY3QoTFBDKSwgY2xvc3VyZXMoTFBDKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vbGFzdF9iaXQgYi9kb2MvZWZ1bi9sYXN0X2JpdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGQyNDcxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vbGFzdF9iaXQKQEAgLTAsMCArMSwxOSBAQAorU1lOT1BTSVMKKyAgICAgICAgaW50IGxhc3RfYml0KHN0cmluZyBzdHIpOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgTGllZmVydCBkaWUgTnVtbWVyIGRlcyBsZXR6dGVuIGdlc2V0enRlbiBCaXRzIGltIEJpdHN0cmluZyA8c3RyPi4KKworICAgICAgICBKZWRlcyBaZWljaGVuIGVudGhhZWx0IDYgQml0cy4gQWxzbyBrYW5uIGluIGplZGVtIFplaWNoZW4gZWluIFdlcnQgdm9uCisgICAgICAgIDAgYmlzIDYzIGdlc3BlaWNoZXJ0IHdlcmRlbiAoMl42PTY0KS4gRGFzIGVyc3RlIFplaWNoZW4gaXN0IGRlcgorICAgICAgICBMZWVyc2NobGFnICIgIiBtaXQgZGVtIFdlcnQgMC4gRGFzIGVyc3RlIFplaWNoZW4gaW0gU3RyaW5nIGlzdCBqZW5lcworICAgICAgICBtaXQgZGVuIG5pZWRyaWdzdGVuIEJpdHMgKDAtNSkuCisKK0JFSVNQSUVMCisgICAgICAgIHN0cmluZyBzOworICAgICAgICBzID0gc2V0X2JpdCgiIiwgNCk7IHMgPSBzZXRfYml0KHMsIDIpOworICAgICAgICBsYXN0X2JpdChzKSAtLT4gbGllZmVydCA0CisKK1NJRUhFIEFVQ0gKKyAgICAgICAgc2V0X2JpdChFKSwgY2xlYXJfYml0KEUpLCBuZXh0X2JpdChFKSwgdGVzdF9iaXQoRSksIGNvdW50X2JpdHMoRSksCisgICAgICAgIGFuZF9iaXRzKEUpLCBvcl9iaXRzKEUpLCB4b3JfYml0cyhFKSwgaW52ZXJ0X2JpdHMoRSksIGNvcHlfYml0cyhFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vbGFzdF9pbnN0cnVjdGlvbnMgYi9kb2MvZWZ1bi9sYXN0X2luc3RydWN0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTQ0N2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vbGFzdF9pbnN0cnVjdGlvbnMKQEAgLTAsMCArMSwyOCBAQAorR0VTQ0hVRVRaVAorU1lOT1BTSVMKKyAgICAgICAgc3RyaW5nICpsYXN0X2luc3RydWN0aW9ucyhpbnQgbGVuZ2h0LCBpbnQgdmVyYm9zZSk7CisKK0JFU0NIUkVJQlVORworICAgICAgICBMaWVmZXJ0IGVpbiBBcnJheSBtaXQgZGVyICJMYWVuZ2UiIGRlciB6dWxldHp0IGF1c2dlZnVlaHJ0ZW4KKyAgICAgICAgQW53ZWlzdW5nZW4uIFdlbm4gPHZlcmJvc2U+IHVuZ2xlaWNoIDAgaXN0IChzdGFuZGFyZG1hZXNzaWcgc28pLAorICAgICAgICB3ZXJkZW4gYXVjaCBJbmZvcyB6dXIgWmVpbGVubnVtbWVyIGFuZ2V6ZWlndC4gSmVkZXIgU3RyaW5nIGhhdAorICAgICAgICBmb2xnZW5kZSBGb3JtOgorCisgICAgICAgICAgICBPcGNvZGUtQWRyZXNzZTogT3Bjb2RlIE9wZXJhbmQgTW5lbW9uaWMgKFN0YXBlbHRpZWZlKSBaZWlsZW5udW1tZXIKKworICAgICAgICBEaWUgSW5mb3JtYXRpb24genVyIFN0YXBlbHRpZWZlIGJlc3RlaHQgYXVzIHp3ZWkgWmFobGVuIDxyZWw+OjxhYnM+LAorICAgICAgICB3b2JlaSA8cmVsPiBkZXIgcmVsYXRpdmUgU3RhcGVsdmVyYnJhdWNoIGRlciBGdW5rdGlvbiBpc3QsIDxhYnM+IGRlcgorICAgICAgICBhYnNvbHV0ZSBTdGFwZWx2ZXJicmF1Y2guCisKKyAgICAgICAgRGllIEluZm9ybWF0aW9uIHp1ciBaZWlsZW5udW1tZXIgd2lyZCBhbmdlZnVlZ3QsIHdlbm4gZGFzIEZsYWcgZ2VzZXR6dAorICAgICAgICBpc3QgdW5kIGVpbmUgbmV1ZSBaZWlsZSBpbSBRdWVsbGNvZGUgZXJyZWljaHQgd2lyZC4gRWJlbnNvIGVyemV1Z2VuCisgICAgICAgIEF1ZnJ1ZmUgendpc2NoZW4gT2JqZWt0ZW4gZWluZW4gRWludHJhZyBpbSBSZXN1bHRhdGFycmF5IChhbGxlcmRpbmdzCisgICAgICAgIG51ciwgd2VubiBkYXMgdmVyYm9zZS1GbGFnIGdlc2V0enQgaXN0KS4gRGllc2VyIEVpbnRyYWcgaGF0IGRpZSBGb3JtOgorCisgICAgICAgICAgICBPYmpla3RuYW1lIFByb2dyYW1tbmFtZSBaZWlsZW5udW1tZXIuCisKKyAgICAgICAgRXMgZ2lidCBlaW4gdm9ya29uZmlndXJpZXJ0ZXMgb2JlcmVzIExpbWl0LCB3aWUgdmllbGUgSW5zdHJ1a3Rpb25lbgorICAgICAgICB6dXJ1ZWNrdmVyZm9sZ3Qgd2VyZGVuIGtvZW5uZW4uCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgZGVidWdfbWVzc2FnZShFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vbGltaXRlZCBiL2RvYy9lZnVuL2xpbWl0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk2NzgxMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2xpbWl0ZWQKQEAgLTAsMCArMSw2NCBAQAorVk9STEFFVUZJRywgR0VTQ0hVRVRaVAorU1lOT1BTSVMKKyAgICAgICAgI2luY2x1ZGUgPHN5cy9ydGxpbWl0cy5oPgorCisgICAgICAgIG1peGVkIGxpbWl0ZWQoY2xvc3VyZSBmdW4pOworICAgICAgICBtaXhlZCBsaW1pdGVkKGNsb3N1cmUgZnVuLCBpbnQgdGFnLCBpbnQgdmFsdWUsIC4uLik7CisgICAgICAgIG1peGVkIGxpbWl0ZWQoY2xvc3VyZSBmdW4sIGludCAqbGltaXRzIFssIG1peGVkICphcmdzXSk7CisKK0JFU0NIUkVJQlVORworICAgICAgICBsaW1pdGVkKCkgcnVmdCBkaWUgRnVua3Rpb24gPGZ1bj4gbWl0IGRlbiBiZXplaWNobmV0ZW4gQXJndW1lbnRlbgorICAgICAgICA8YXJncz4gYXVmIHVuZCBmdWVocnQgc2llIG1pdCBkZW4gZ2VnZWJlbmVuIExhdWZ6ZWl0bGltaXRlbiBhdXMuCisKKyAgICAgICAgQmVpbSBFbmRlIGRlciBGdW5rdGlvbiA8ZnVuPiB3ZXJkZW4gZGllIG1vbWVudGFuIGFrdGl2ZW4KKyAgICAgICAgTGF1ZnplaXRsaW1pdGVuIHdpZWRlcmhlcmdlc3RlbGx0LiBsaW1pdGVkKCkgbGllZmVydCBkZW4KKyAgICAgICAgUnVlY2tnYWJld2VydCBkZXIgQ2xvc3VyZSA8ZnVuPiB6dXJ1ZWNrLgorCisgICAgICAgIERpZSBMYXVmemVpdGxpbWl0ZW4ga29lbm5lbiBpbiB6d2VpIEZvcm1lbiBhbmdlZ2ViZW4gd2VyZGVuOiBhbHMKKyAgICAgICAgQXJyYXkgKHdpZSBlcyB2b24gcXVlcnlfbGltaXRzKCkgZ2VsaWVmZXJ0IHdpcmQpIG9kZXIgYWxzIExpc3RlIHZvbgorICAgICAgICBXZXJ0ZW4gbWl0IFRhZ3MuIFdpcmQgbGltaXRlZCgpIG9obmUgQW5nYWJlIHZvbiBMaW1pdHMgYXVmZ2VydWZlbiwKKyAgICAgICAgZ2VsdGVuIGRpZSBMYXVmemVpdGxpbWl0ZW4gYWxzICd1bmxpbWl0aWVydCcuCisKKyAgICAgICAgRGllIExpbWl0ZW5laW5zdGVsbHVuZyBrZW5udCBkcmVpIHNwZXppZWxsZSBXZXJ0ZSBhdXMgPHJ0bGltaXRzLmg+OgorICAgICAgICAgICAgTElNSVRfVU5MSU1JVEVEOiAgICBlcyBnaWJ0IGtlaW4gTGltaXQKKyAgICAgICAgICAgIExJTUlUX0tFRVA6ICAgICAgICAgZGFzIHp1bGV0enQgZ2VzZXR6dGUgTGltaXQgd2lyZCBiZWliZWhhbHRlbgorICAgICAgICAgICAgTElNSVRfREVGQVVMVDogICAgICBkaWUgJ2dsb2JhbGVuJyBMaW1pdGVuIHdlcmRlbiB2ZXJ3ZW5kZXQKKworICAgICAgICBGdWVyIExJTUlUX0NPU1QsIGRpZSBTcGV6aWFsd2VydGUgaGFiZW4gZGllc2UgQmVkZXV0dW5nOgorICAgICAgICAgICAgTElNSVRfVU5MSU1JVEVEOiBkaWUgQXVzZnVlaHJ1bmcga29zdGVuIGxlZGlnbGljaCBlaW5lbiBUaWNrCisgICAgICAgICAgICBMSU1JVF9LRUVQOiAgICAgIExJTUlUX0NPU1Qgd2lyZCBhdWYgMCBnZXNldHp0CisgICAgICAgICAgICBMSU1JVF9ERUZBVUxUOiAgIExJTUlUX0NPU1Qgd2lyZCBhdWYgLTEwMCBnZXNldHp0CisKKyAgICAgICAgbGltaXRlZCgpIGVyemV1Z3QgZWluZSBTY2h1dHp2ZXJsZXR6dW5nICgibGltaXRlZCIsIGN1cnJlbnRfb2JqZWN0LAorICAgICAgICBmdW4sIGxpbWl0cy1hcnJheSkuCisKK0JFTUVSS1VOR0VOOgorICAgICAgICBEaWVzZSBGdW5rdGlvbiBrYW5uIGJlaSB1bnMgbXVkbGlid2VpdCBnZW51dHp0IHdlcmRlbi4gQWxsZXJkaW5ncyB3aXJkCisgICAgICAgIG51ciBkaWUgX1JlZHVrdGlvbl8gdm9uIExJTUlUX0VWQUwgenVnZWxhc3NlbiwgYWxsZSBhbmRlcmVuIExpbWl0cworICAgICAgICBkdWVyZmVuIF9uaWNodF8gdmVyYWVuZGVydCB3ZXJkZW4uIEhpZXJiZWkgaXN0IHp1IGJlYWNodGVuLCBkYXNzIGRhcworICAgICAgICBMaW1pdCBmdWVyIExJTUlUX0VWQUwgdW0gbWluLiAxMDAwIFRpY2tzIHVudGVyIGRlbiBub2NoIHZlcmZ1ZWdiYXJlbgorICAgICAgICBUaWNrcyBsaWVnZW4gbXVzcyAoZ2V0X2V2YWxfY29zdCgpKS4KKyAgICAgICAgRnVlciBMSU1JVF9DT1NUIHNpbmQgbnVyIDAgdW5kIC0xMDAgenVnZWxhc3Nlbi4KKworQkVJU1BJRUxFCisgICAgICAgIGxpbWl0ZWQoIydmdW5jdGlvbikKKyAgICAgICAgLS0+IGZ1ZWhydCBkaWUgRnVua3Rpb24gb2huZSBMaW1pdGVuIGF1cy4KKworICAgICAgICBsaW1pdGVkKCMnZnVuY3Rpb24sICh7IDIwMDAwMCB9KSwgImZvbyIpCisgICAgICAgIC0tPiBmdWVocnQgZGllIEZ1bmt0aW9uIG1pdCBlaW5lbSBFdmFsLUtvc3RlbiBMaW1pdCB2b24gMjAwMDAwIFRpY2tzCisgICAgICAgICAgICBhdXMuIERpZSBGdW5rdGlvbiB3aXJkIGFscyAnZnVuY3Rpb24oImZvbyIpJyBhdWZnZXJ1ZmVuLgorCisgICAgICAgIGxpbWl0ZWQobGFtYmRhKDAsICh7IydmdW5jdGlvbiwgImZvbyJ9KSksIExJTUlUX0VWQUwsIDIwMDAwMCkKKyAgICAgICAgLS0+IGZ1ZWhydCBkaWUgRnVua3Rpb24gbWl0IGVpbmVtIEV2YWwtS29zdGVuIExpbWl0IHZvbiAyMDAwMDAgVGlja3MKKyAgICAgICAgICAgIGF1cy4gRGllIEZ1bmt0aW9uIHdpcmQgYWxzICdmdW5jdGlvbigiZm9vIiknIGF1ZmdlcnVmZW4uCisKK0FFTkRFUlVOR0VOCisgICAgICAgIEVpbmdlZnVlaHJ0IGluIExETXVkIDMuMi43LgorICAgICAgICBMRE11ZCAzLjMuNTYzIGZ1ZWhydGUgTElNSVRfQ09TVCBlaW4uCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgcXVlcnlfbGltaXRzKEUpLCBzZXRfbGltaXRzKEUpCisgICAgICAgIGdldF9ldmFsX2Nvc3QoRSkKKworMTYuMDUuMjAwNywgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9saXZpbmcgYi9kb2MvZWZ1bi9saXZpbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYwYTg4NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2xpdmluZwpAQCAtMCwwICsxLDEzIEBACitTWU5PUFNJUworICAgICAgICBpbnQgbGl2aW5nKG9iamVjdCBvYik7CisKK0JFU0NIUkVJQlVORworICAgICAgICBMaWVmZXJ0IDEgenVydWVjaywgd2VubiA8b2I+IGVpbiBsZWJlbmRpZ2VzIE9iamVrdCAobGl2aW5nKSBpc3QuCisgICAgICAgIDxvYj4gaXN0IGxpdmluZywgd2VubiBlbmFibGVfY29tbWFuZHMoKSBhdXMgPG9iaj4gYXVmZ2VydWZlbiB3dXJkZS4KKyAgICAgICAgPG9iPiBrYW5uIGF1Y2ggMCBzZWluLgorCitCRUlTUElFTAorICAgICAgICBsaXZpbmcodGhpc19wbGF5ZXIoKSk7ICAtPiBEaWVzIGxpZWZlcnQgKGhvZmZlbnRsaWNoKSAxIHp1ZXJ1ZWNrLgorCitTSUVIRSBBVUNICisgICAgICAgIGVuYWJsZV9jb21tYW5kcyhFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vbG9hZF9uYW1lIGIvZG9jL2VmdW4vbG9hZF9uYW1lCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNmMxZWEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9sb2FkX25hbWUKQEAgLTAsMCArMSw0NyBAQAorU1lOT1BTSVMKKyAgICAgICAgc3RyaW5nIGxvYWRfbmFtZSgpCisgICAgICAgIHN0cmluZyBsb2FkX25hbWUob2JqZWN0fHN0cmluZyBvYmopCisKK0JFU0NIUkVJQlVORworICAgICAgICBEaWUgRnVua3Rpb24gbGllZmVydCBkZW4gTmFtZW4sIG1pdCBkZW0gPG9iaj4gZ2VsYWRlbiB3dXJkZS4gPG9iaj4KKyAgICAgICAga2FubiBkaXJla3QgYWxzIE9iamVrdCBvZGVyIGFscyBTdHJpbmcgbWl0IHNlaW5lbSBOYW1lbiBhbmdlZ2ViZW4KKyAgICAgICAgd2VyZGVuLgorCisgICAgICAgIFdlbm4gPG9iaj4gZWluIENsb24gaXN0LCBsaWVmZXJ0IGRpZSBGdW5rdGlvbiBkZW4gTmFtZW4gZGVzIEJsdWVwcmludHMuCisgICAgICAgIFdlbm4gPG9iaj4gZWluIEJsdWVwcmludCBpc3QsIGxpZWZlcnQgZGllIEZ1bmt0aW9uIGRlbiBOYW1lbiBkZXMgRmlsZXMsCisgICAgICAgIGF1cyBkZW0gZGVyIEJsdWVwcmludCBrb21waWxpZXJ0IHd1cmRlLgorCisgICAgICAgIFdlbm4gPG9iaj4gdWViZXIgc2VpbmVuIE5hbWVuIGFuZ2VnZWJlbiB3dXJkZSwgYWJlciBuaWNodCAvIG5pY2h0IG1laHIKKyAgICAgICAgZXhpc3RpZXJ0LCBnZW5lcmllcnQgZGllIEZ1bmt0aW9uIGRlbiBOYW1lbiwgd2llIGVyIHNlaW4gbXVlc3N0ZSB1bmQKKyAgICAgICAgZ2lidCBkaWVzZW4genVydWVjay4gV2VubiBkZXIgYW5nZWdlYmVuZSBOYW1lIHVuZ3VlbHRpZyBpc3QsIGxpZWZlcnQKKyAgICAgICAgZGllIEZ1bmt0aW9uIDAuCisKKyAgICAgICAgQWxzIFNwZXppYWxmYWxsIGxpZWZlcnQgZGllIEZ1bmt0aW9uIDAsIHdlbm4gPG9iPiAwIGlzdC4KKworICAgICAgICBGdWVyIHZpcnR1ZWxsZSBPYmpla3RlIGxpZWZlcnQgbG9hZF9uYW1lKCkgZGVuIG9yaWdpbmFsZW4gTGFkZW5hbWVuCisgICAgICAgIGRlcyBPYmpla3RzLCB3ZWxjaGVzIGRlciB2aXJ0dWVsbGUgQ29tcGlsZXIgZXJ6ZXVndGUuCisKKyAgICAgICAgV2lyZCA8b2JqPiBuaWNodCBhbmdlZ2ViZW4sIHdpcmQgZGVyIE5hbWUgZnVlciBkYXMgbW9tZW50YW4gZ3VlbHRpZ2UKKyAgICAgICAgT2JqZWt0IGFuZ2VnZWJlbi4KKworICAgICAgICBJbSBHZWdlbnNhdHogenVtIG9iamVjdF9uYW1lKCkga2FubiBkZXIgbG9hZF9uYW1lKCkgbmljaHQgZHVyY2gKKyAgICAgICAgcmVuYW1lX29iamVjdCgpIG9kZXIgZWluZW4gVkMgdmVyYWVuZGVydCB3ZXJkZW4uIElzdCBlaW4gPG9iaj4gamVkb2NoCisgICAgICAgIGVpbmVtIHJlcGxhY2VfcHJvZ3JhbSgpIHVudGVyd29yZmVuLCBzcGllZ2VsdCBkZXIgbG9hZF9uYW1lKCkgbmljaHQKKyAgICAgICAgbWVociBkYXMgZWZmZWt0aXZlIFZlcmhhbHRlbiBkZXMgT2JqZWt0cyB3aWRlci4KKworQkVJU1BJRUxFCisgICAgICAgIG9iamVjdCBvOworICAgICAgICBvID0gY2xvbmVfb2JqZWN0KCIvc3RkL3RoaW5nIik7CisgICAgICAgIHdyaXRlKGxvYWRfbmFtZShvKSk7ICAtLT4gbGllZmVydCAiL3N0ZC90aGluZyIgaW4gIUNvbXBhdCBNb2R1cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZCAic3RkL3RoaW5nIiAgaW0gQ29tcGF0IE1vZHVzCisgICAgICAgIHdyaXRlKGxvYWRfbmFtZSgiL3N0ZC90aGluZyIpKTsgIC0tPiBnbGVpY2ggd2llIG9iZW4KKyAgICAgICAgd3JpdGUobG9hZF9uYW1lKCIvc3RkL3RoaW5nIzRuNSIpKTsgLS0+IGxpZWZlcnQgMAorCitHRVNDSElDSFRFCisgICAgICAgIEVpbmdlZnVlaHJ0IGluIExETXVkIDMuMi42LgorICAgICAgICBTdHJpbmdzIGFscyBBcmd1bWVudGUgc2luZCBtb2VnbGljaCBzZWl0IDMuMi44LgorICAgICAgICAwIGlzdCB6dWxhZXNzaWcgc2VpdCAzLjIuOS4KKworU0lFSEUgQVVDSAorICAgICAgICBjbG9uZV9vYmplY3QoRSksIGNsb25lcChFKSwgb2JqZWN0X25hbWUoRSksIGxvYWRfb2JqZWN0KEUpLAorICAgICAgICByZXBsYWNlX3Byb2dyYW0oRSksIHByb2dyYW1fbmFtZShFKSwgcHJlc2VudF9jbG9uZShFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vbG9hZF9vYmplY3QgYi9kb2MvZWZ1bi9sb2FkX29iamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDdkMGI4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vbG9hZF9vYmplY3QKQEAgLTAsMCArMSwyMyBAQAorU1lOT1BTSVMKKyAgICAgICAgb2JqZWN0IGxvYWRfb2JqZWN0KHN0cmluZyBuYW1lKQorCitERVNDUklQVElPTgorICAgICAgICBMb2FkIHRoZSBvYmplY3QgZnJvbSB0aGUgZmlsZSA8bmFtZT4gYW5kIHJldHVybiBpdC4gSWYgdGhlCisgICAgICAgIG9iamVjdCBhbHJlYWR5IGV4aXN0cywganVzdCByZXR1cm4gaXQuCisKKyAgICAgICAgVGhpcyBlZnVuIGNhbiBiZSB1c2VkIG9ubHkgdG8gbG9hZCBibHVlcHJpbnRzIC0gZm9yIGNsb25lcywgdXNlCisgICAgICAgIHRoZSBlZnVuIGNsb25lX29iamVjdCgpLgorCisgICAgICAgIElmIHN0cmljdCBldWlkcyBhcmUgZW5mb3JjZWQsIHRoZSBjbG9uaW5nIG9iamVjdCBtdXN0IGhhdmUKKyAgICAgICAgYSBub24temVybyBldWlkLgorCitFWEFNUExFCisgICAgICAgIC8vIFVwZGF0ZSBhbmQgcmVsb2FkIHRoZSBzdGFuZGFyZCBwbGF5ZXIgb2JqZWN0CisgICAgICAgIGRlc3RydWN0KGZpbmRfb2JqZWN0KCIvc3RkL3BsYXllciIpKTsKKyAgICAgICAgbG9hZF9vYmplY3QoIi9zdGQvcGxheWVyIik7CisKK0hJU1RPUlkKKyAgICAgICAgSW50cm9kdWNlZCBpbiBMRE11ZCAzLjIuNi4KKworU0VFIEFMU08KKyAgICAgICAgY2xvbmVfb2JqZWN0KEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9sb2NhbHRpbWUgYi9kb2MvZWZ1bi9sb2NhbHRpbWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUyMmRjNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2xvY2FsdGltZQpAQCAtMCwwICsxLDM5IEBACitTWU5PUFNJUworICAgICAgICAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworICAgICAgICBpbnQgKmxvY2FsdGltZShpbnQgY2xvY2spOworICAgICAgICBpbnQgKmxvY2FsdGltZShpbnQgKnVjbG9jayk7CisKK0JFU0NIUkVJQlVORworICAgICAgICBJbnRlcnByZXRpZXJ0IGRhcyBBcmd1bWVudCA8Y2xvY2s+IGFscyBBbnphaGwgU2VrdW5kZW4gc2VpdCBkZW0KKyAgICAgICAgMDEuIEphbnVhciAxOTcwLCAwMDowMDowMCwgdW5kIGdpYnQgZGllIFplaXQgaW4gTG9rYWx6ZWl0IGluIGVpbmVyCisgICAgICAgIHNhdWJlcmVuIFN0cnVrdHVyIHp1cnVlY2suIFdpcmQgPGNsb2NrPiBuaWNodCBhbmdlZ2ViZW4sIHdpcmQKKyAgICAgICAgc3RhbmRhcmRtYWVzc2lnIHRpbWUoKSB2ZXJ3ZW5kZXQuCisKKyAgICAgICAgQWx0ZXJuYXRpdiBrYW5uIGF1Y2ggZWluIEFycmF5IHZvbiB6d2VpIFphaGxlbiBhbHMgQXJndW1lbnQgYW5nZWdlYmVuCisgICAgICAgIHdlcmRlbi4gRGFzIGVyc3RlIEVsZW1lbnQgd2lyZCBpbnRlcnByZXRpZXJ0IHdpZSA8Y2xvY2s+LCBkYXMgendlaXRlCisgICAgICAgIEFyZ3VtZW50IGVudGhhZWx0IGRpZSB2ZXJnYW5nZW5lbiBNaWtyb3Nla3VuZGVuIGluIGRpZXNlciBTZWt1bmRlIHVuZAorICAgICAgICB3aXJkIGlnbm9yaWVydC4KKworICAgICAgICBEYXMgUmVzdWx0YXQgaXN0IGVpbiBBcnJheSBtaXQgZm9sZ2VuZGVuIEVsZW1lbnRlbjoKKworICAgICAgICAgICAgaW50IFRNX1NFQyAgICAoMCk6ICBTZWt1bmRlIGluIGRlciBNaW51dGUgKDAuLjU5KQorICAgICAgICAgICAgaW50IFRNX01JTiAgICAoMSk6ICBNaW51dGUgaW4gZGVyIFN0dW5kZSAoMC4uNTkpCisgICAgICAgICAgICBpbnQgVE1fSE9VUiAgICgyKTogIFN0dW5kZSBkZXMgVGFnZXMgKDAuLjIzKQorICAgICAgICAgICAgaW50IFRNX01EQVkgICAoMyk6ICBUYWcgaW0gTW9uYXQgKDEuLjMxKQorICAgICAgICAgICAgaW50IFRNX01PTiAgICAoNCk6ICBNb25hdCBkZXMgSmFocmVzICgwLi4xMSkKKyAgICAgICAgICAgIGludCBUTV9ZRUFSICAgKDUpOiAgSmFociAoei5CLiAyMDAxKQorICAgICAgICAgICAgaW50IFRNX1dEQVkgICAoNik6ICBXb2NoZW50YWcgKDAuLjYsIFNvbm50YWcgPSAwKQorICAgICAgICAgICAgaW50IFRNX1lEQVkgICAoNyk6ICBUYWcgaW0gSmFociAoMC4uMzY1KQorICAgICAgICAgICAgaW56IFRNX0lTRFNUICAoOCk6ICBUUlVFOiBEYXlsaWdodCBTYXZpbmcgVGltZQorCitCRUlTUElFTAorICAgICAgICBwcmludGYoIlRvZGF5IGlzICVzXG4iLCAoeyAiU29ubnRhZyIsICJNb250YWciLCAiRGllbnN0YWciLAorICAgICAgICAgICAgIk1pdHR3b2NoIiwgIkRvbm5lcnN0YWciLCAiRnJlaXRhZyIsICJTYW1zdGFnIn0pCisgICAgICAgICAgICBbbG9jYWx0aW1lKClbVE1fV0RBWV1dKTsKKworQUVOREVSVU5HRU4KKyAgICAgICAgRWluZ2VmdWVocnQgaW4gTERNdWQgMy4yLjkKKworU0lFSEUgQVVDSAorICAgIGN0aW1lKEUpLCBnbXRpbWUoRSksIHRpbWUoRSksIHV0aW1lKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9sb2cgYi9kb2MvZWZ1bi9sb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIyYWJmZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL2xvZwpAQCAtMCwwICsxLDggQEAKK1NZTk9QU0lTCisgICAgICAgIGZsb2F0IGxvZyhpbnR8ZmxvYXQgYXJnKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIExpZWZlcnQgZGVuIG5hdHVlcmxpY2hlbiBMb2dhcml0aG11cyB2b24gPGFyZz4uCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgZXhwKEUpLCBwb3coRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL2xvd2VyX2Nhc2UgYi9kb2MvZWZ1bi9sb3dlcl9jYXNlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MDFlMjAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9sb3dlcl9jYXNlCkBAIC0wLDAgKzEsMTIgQEAKK1NZTk9QU0lTCisgICAgICAgIHN0cmluZyBsb3dlcl9jYXNlKHN0cmluZyBzdHIpOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgS29udmVydGllcnQgYWxsZSBaZWljaGVuIGluIDxzdHI+IGluIEtsZWluYnVjaHN0YWJlbiB1bmQgbGllZmVydCBkZW4KKyAgICAgICAgbmV1ZW4gU3RyaW5nLgorCitCRUlTUElFTAorICAgICAgICBsb3dlcl9jYXNlKCJIYWxsbyBXZUxUISIpIC0+ICJoYWxsbyB3ZWx0ISIKKworU0lFSEUgQVVDSAorICAgICAgICBjYXBpdGFsaXplKEUpLCB1cHBlcl9jYXNlKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9tX2FkZCBiL2RvYy9lZnVuL21fYWRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNGY0YjkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9tX2FkZApAQCAtMCwwICsxLDI5IEBACitTWU5PUFNJUworICAgICAgICBtYXBwaW5nIG1fYWRkKG1hcHBpbmcgbWFwLCBtaXhlZCBrZXksIFttaXhlZCBkYXRhLCAuLi5dKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIEZ1ZWd0IGVpbmVuIG5ldWVuIEVpbnRyYWcgbWl0IEluZGV4IDxrZXk+IHp1bSBNYXBwaW5nIDxtYXA+IGhpbnp1CisgICAgICAgIG9kZXIgZXJzZXR6dCBkaWVzZW4uIERhcyB2ZXJhZW5kZXJ0ZSBNYXBwaW5nIHdpcmQgYWxzIEVyZ2VibmlzCisgICAgICAgIHp1cnVlY2sgZ2VsaWVmZXJ0LiBXZXJ0ZSwgZGllIG5pY2h0IHp1Z2VvcmRuZXQgd2VyZGVuIGtvZW5uZW4sIHdlcmRlbgorICAgICAgICBhbHMgMCBpbnRlcnByZXRpZXJ0LCBpcnJlbGV2YW50ZSBBcmd1bWVudGUgd2VyZGVuIGlnbm9yaWVydC4KKworQkVJU1BJRUxFCisgICAgICAgIG1hcHBpbmcgbTsKKyAgICAgICAgbSA9IChbICJmb28iIF0pOworICAgICAgICBtX2FkZChtLCAiYmFyIiwgMSkgLS0+IChbICJmb28iLCAiYmFyIiBdKQorCisgICAgICAgIG0gPSAoWyAiZm9vIjoxIF0pOworICAgICAgICBtX2FkZChtLCAiYmFyIiwgMSkgLS0+IChbICJmb28iOjEsICJiYXIiOjEgXSkKKworICAgICAgICBtID0gKFsgImZvbyI6MTsyIF0pOworICAgICAgICBtX2FkZChtLCAiYmFyIiwgMSkgLS0+IChbICJmb28iOjE7MiwgImJhciI6MTswIF0pCisKKyAgICAgICAgYXBwbHkoIydtX2FkZCwgbSwgImJheiIsICh7IDQsIDUgfSkpCisgICAgICAgIC0tPiAoWyAiZm9vIjoxOzIsICJiYXIiOjE7MCwgImJheiI6NDs1IF0pCisKK0FFTkRFUlVOR0VOCisgICAgICAgIEVpbmdlZnVlaHJ0IGluIExETXVkIDMuMi45LgorCitTSUVIRSBBVUNICisgICAgICAgIG1hcHBpbmdwKEUpLCBta21hcHBpbmcoRSksIG1fZGVsZXRlKEUpLCBtX2VudHJ5KEUpLCBtX2luZGljZXMoRSksCisgICAgICAgIG1fdmFsdWVzKEUpLCBzaXplb2YoRSksIHdpZHRob2YoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL21fYWxsb2NhdGUgYi9kb2MvZWZ1bi9tX2FsbG9jYXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NWYzYjkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9tX2FsbG9jYXRlCkBAIC0wLDAgKzEsNDYgQEAKK1NZTk9QU0lTCisgICAgICAgIG1hcHBpbmcgbV9hbGxvY2F0ZShpbnQgc2l6ZSkKKyAgICAgICAgbWFwcGluZyBtX2FsbG9jYXRlKGludCBzaXplLCBpbnQgd2lkdGgpCisKK0JFU0NIUkVJQlVORworICAgICAgICBEaWUgRnVua3Rpb24gcmVzZXJ2aWVydCBTcGVpY2hlciBmdWVyIGVpbiBNYXBwaW5nLiA8c2l6ZT4gaXN0IGRpZQorICAgICAgICBBbnphaGwgRWludHJhZWdlIChkLmguIGRpZSBBbnphaGwgS2V5cyksIDx3aWR0aD4gaXN0IGRpZSBBbnphaGwKKyAgICAgICAgRGF0ZW5laW50cmFlZ2UgcHJvIEtleS4gV2lyZCA8d2lkdGg+IG5pY2h0IGFuZ2VnZWJlbiwgd2VyZGVuIEtleXMKKyAgICAgICAgbWl0IGVpbmVtIERhdGVuZWxlbWVudCBlcnpldWd0LgorCisgICAgICAgIERpZSBGdW5rdGlvbiBpc3QgbnVyIHNpbm52b2xsLCB3ZW5uIG1hbiBlaW4gTWFwcGluZyBlcnpldWd0LCBkZXNzZW4KKyAgICAgICAgdW5nZWZhZWhyZSBHcm9lc3NlIHZvbiB2b3JuaGVyZWluIGJla2FubnQgaXN0LCB1bSBzbyBkZW4gT3ZlcmhlYWQKKyAgICAgICAgdm9uIHdpZWRlcmhvbHRlbiBTcGVpY2hlcmFsbG9rYXRpb24genUgbWluaW1pZXJlbi4gV2VubiBuaWNodCBhbGxlCisgICAgICAgIGFsbG96aWVydGVuIERhdGVuZWxlbWVudGUgbWl0IERhdGVuIGJlc3R1ZWNrdCB3ZXJkZW4sIHdlcmRlbiBkaWUKKyAgICAgICAgVWViZXJibGVpYnNlbCBlaW5pZ2UgWmVpdCBzcGFldGVyIGJlaSBHZWxlZ2VuaGVpdCB3aWVkZXIgZnJlaWdlZ2ViZW4KKyAgICAgICAgKHMuIEJlbWVya3VuZ2VuKS4KKyAgICAgICAgbV9hbGxvY2F0ZSgpIGlzdCBhdWNoIG51ZXR6bGljaCwgd2VubiBlaW4gTWFwcGluZyBiZXN0aW1tdGVyIEJyZWl0ZQorICAgICAgICBlcnpldWd0IHdlcmRlbiBzb2xsLCBvaG5lIGJlcmVpdHMgZGllIERhdGVuIHp1IGRlbiBLZXlzIGJlcmVpdCB6dQorICAgICAgICBzdGVsbGVuLgorCisgICAgICAgIFdlbm4gYmxvc3MgZWluIGxlZXJlcyBNYXBwaW5nIGJlc3RpbW10ZXIgQnJlaXRlIGVyemV1Z3Qgd2VyZGVuIHNvbGwsCisgICAgICAgIHNvIGthbm4gZm9sZ2VuZGUgTm90YXRpb24gdmVyd2VuZGV0IHdlcmRlbjoKKworICAgICAgICAoWyBdKSA6IGVyemV1Z3QgZWluIGxlZXJlcyBNYXBwaW5nIG1pdCBCcmVpdGUgMS4KKyAgICAgICAgKFs6PHdpZHRoPl0pIDogZXJ6ZXVndCBlaW4gbGVlcmVzIE1hcHBpbmcgZGVyIEJyZWl0ZSA8d2lkdGg+LAorICAgICAgICAgICAgd29iZWkgPHdpZHRoPiBlaW5lIGJlbGllYmlnZSBBbndlaXN1bmcgc2VpbiBrYW5uLCBkaWUgZWluZQorICAgICAgICAgICAgSW50ZWdlcnphaGwgenVydWVjayBsaWVmZXJ0LiBUYXRzYWVjaGxpY2ggd2lyZCBkaWVzZSBOb3RhdGlvbgorICAgICAgICAgICAgYWxzICdtX2FsbG9jYXRlKDAsIDx3aWR0aD4pJyBrb21waWxpZXJ0LgorCitCRUlTUElFTEUKKyAgICAgICAgbV9hbGxvY2F0ZSgzLDcpIC0+IGVyemV1Z3QgZWluIE1hcHBpbmcgbWl0IDcgV2VydGVuIHBybyBLZXkgdW5kIFBsYXR6CisgICAgICAgICAgIGZ1ZXIgMyBFaW50cmFlZ2UuCisgICAgICAgKFs6MiozXSkgLT4gZW50c3ByaWNodCBtX2FsbG9jYXRlKDAsNikuCisKK0JFTUVSS1VOR0VOCisgICAgICAgIFVuZ2VudXR6ZXIgU3BlaWNoZXIgZGVzIGFsbG96aWVydGVuIE1hcHBpbnMgd2lyZCB3YWVocmVuZCBkZXMgc29nLgorICAgICAgICBLb21wYWt0aWVyZW5zIGRlcyBNYXBwaW5ncyBmcmVpZ2VnZWJlbi4gRGllcyBwYXNzaWVydCB3YWVocmVuZCBlaW5lcworICAgICAgICAiZGF0YSBjbGVhbnVwcyIgb2RlciBlaW5lciAiZ2FyYmFnZSBjb2xsZWN0aW9uIi4gRGllIFplaXQgendpc2NoZW4KKyAgICAgICAgImRhdGEgY2xlYW51cHMiIGlzdCBtaXQgY29uZmlndXJlX2RyaXZlcigpIGtvbmZpZ3VyaWVyYmFyLgorCitHRVNDSElDSFRFCisgICAgICAgIFVtYmVuYW5udCB2b24gYWxsb2NhdGVfbWFwcGluZygpIGluIExETXVkIDMuMi42LgorICAgICAgICBEaWUgKFs6PHdpZHRoPl0pIE5vdGF0aW9uIHd1cmRlIGluIDMuMi45IGVpbmdlZnVlaHJ0LgorCitTSUVIRSBBVUNICisgICAgICAgIG1hcHBpbmdzKExQQyksIHdhbGtfbWFwcGluZyhFKSwgZ2V0X3R5cGVfaW5mbyhFKSwgbV9yZWFsbG9jYXRlKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9tX2NvbnRhaW5zIGIvZG9jL2VmdW4vbV9jb250YWlucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTQxZmYzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vbV9jb250YWlucwpAQCAtMCwwICsxLDE4IEBACitTWU5PUFNJUworICAgICAgICBpbnQgbV9jb250YWlucyhtaXhlZCAmZGF0YTEsIC4uLiAsICZkYXRhTiwgbWFwcGluZyBtYXAsIG1peGVkIGtleSk7CisKK0JFU0NIUkVJQlVORworICAgICAgICBXZW5uIDxtYXA+IGRlbiBLZXkgPGtleT4gZW50aGFlbHQsIHdlcmRlbiBkaWUgZW50c3ByZWNoZW5kZW4gV2VydGUKKyAgICAgICAgZGVuIERhdGVuYXJndW1lbnRlbiB2b24gPGtleT4genVnZW9yZG5ldCwgd2VsY2hlIHBlciBSZWZlcmVuegorICAgICAgICB1ZWJlcmdlYmVuIHdlcmRlbiBtdWVzc2VuLiBtX2NvbnRhaW5zIGxpZWZlcnQgaW4gZGllc2VtIEZhbGwgMSB6dXJ1ZWNrLgorICAgICAgICBXZW5uIDxrZXk+IG5pY2h0IGluIDxtYXA+IGVudGhhbHRlbiBpc3QsIGxpZWZlcnQgZGllIEZ1bmt0aW9uIDAKKyAgICAgICAgenVydWVjayB1bmQgZGllIERhdGVuYXJndW1lbnRlIGJsZWliZW4gdW52ZXJhZW5kZXJ0LgorCisgICAgICAgIE1hbiBrYW5uIGRpZXNlIEZ1bmt0aW9uIGF1Y2ggZnVlciAwLVdlcnQgTWFwcGluZ3MgdmVyd2VuZGVuLCB3b2JlaQorICAgICAgICBzaWUgZGVuIGdsZWljaGVuIEVmZmVrdCB3aWUgbWVtYmVyKEUpIGhhdC4KKworQUVOREVSVU5HRU4KKyAgICAgICAgVW1iZW5hbm50IHZvbiAnbWFwcGluZ19jb250YWlucycgaW4gTERNdWQgMy4yLjYuCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgbV9lbnRyeShFKSwgbWFwcGluZ3MoTFBDKSwgbWVtYmVyKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9tX2RlbGV0ZSBiL2RvYy9lZnVuL21fZGVsZXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiOWQ0NTMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9tX2RlbGV0ZQpAQCAtMCwwICsxLDExIEBACitTWU5PUFNJUworICAgICAgICBtYXBwaW5nIG1fZGVsZXRlKG1hcHBpbmcgbWFwLCBtaXhlZCBrZXkpCisKK0JFU0NIUkVJQlVORworICAgICAgICBMb2VzY2h0IGRlbiBFaW50cmFnIG1pdCBkZW0gSW5kZXggPGtleT4gYXVzIGRlbSBNYXBwaW5nIDxtYXA+IHVuZAorICAgICAgICBsaWVmZXJ0IGRhcyB2ZXJhZW5kZXJ0ZSBNYXBwaW5nIHp1cnVlY2suIFdlbm4gPG1hcD4ga2VpbmVuIEVpbnRhZworICAgICAgICBtaXQgZGVtIEluZGV4IDxrZXk+IGVudGhhZWx0LCB3aXJkIG5pY2h0cyB2ZXJhZW5kZXJ0LgorCitTSUVIRSBBVUNICisgICAgICAgIG1hcHBpbmdwKEUpLCBta21hcHBpbmcoRSksIG1fYWRkKEUpLCBtX2luZGljZXMoRSksIG1fdmFsdWVzKEUpLAorICAgICAgICBzaXplb2YoRSksIHdpZHRob2YoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL21fZW50cnkgYi9kb2MvZWZ1bi9tX2VudHJ5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZWEyYWYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9tX2VudHJ5CkBAIC0wLDAgKzEsMjQgQEAKK1NZTk9QU0lTCisgICAgICAgICptaXhlZCBtX2VudHJ5KG1hcHBpbmcgbWFwLCBtaXhlZCBrZXkpOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgRHVyY2hzdWNodCBkYXMgTWFwcGluZyA8bWFwPiBuYWNoIGRlbSBFaW50cmFnIG1pdCBJbmRleCA8a2V5PiB1bmQKKyAgICAgICAgbGllZmVydCBhbGxlIFdlcnRlIHZvbiA8a2V5PiBpbiBlaW5lbSBBcnJheSB6dXJ1ZWNrLgorCisgICAgICAgIFdlbm4gPG1hcD4ga2VpbmVuIEVpbnRyYWcgbWl0IEluZGV4IDxrZXk+IGVudGhhZWx0LCBsaWVmZXJ0CisgICAgICAgIG1fZW50cnkoKSAwLgorCitCRUlTUElFTAorICAgICAgICBtYXBwaW5nIG0gPSAoWzE6ImJsYSI6LTEsIDI6ImZhc2VsIjotMiBdKQorICAgICAgICBtX2VudHJ5KG0sIDApIC0+IDAKKyAgICAgICAgbV9lbnRyeShtLCAxKSAtPiAoeyJibGEiLCAtMX0pCisKK0FFTkRFUlVOR0VOCisgICAgICAgIEVpbmdlZnVlaHJ0IGluIExETXVkIDMuMi4xMC4KKworQU5NRUtSVU5HCisgICAgICAgIE1pdCBkZXIgRWZ1biBtX2FkZCgpIGtvZW5uZW4gYWxsZSBXZXJ0ZSBlaW5lcyBFaW50cmFnZXMgYXVmIGVpbm1hbAorICAgICAgICBhZGRpZXJ0IHdlcmRlbi4KKworU0lFSEUgQVVDSAorICAgICAgICBtX2FkZChFKSwgbV9jb250YWlucyhFKSwgbWFwcGluZ3MoTFBDKSwgbWVtYmVyKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9tX2luZGljZXMgYi9kb2MvZWZ1bi9tX2luZGljZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ4NGM0ZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL21faW5kaWNlcwpAQCAtMCwwICsxLDkgQEAKK1NZTk9QU0lTOgorCW1peGVkICptX2luZGljZXMobWFwcGluZyBtYXApCisKK0RFU0NSSVBUSU9OOgorCVJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBpbmRpY2VzIG9mIG1hcHBpbmcgJ21hcCcuCisKK1NFRSBBTFNPOgorCW1hcHBpbmdwKEUpLCBta21hcHBpbmcoRSksIG1fdmFsdWVzKEUpLCBtX2RlbGV0ZShFKSwKKwlzaXplb2YoRSksIHdpZHRob2YoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL21fcmVhbGxvY2F0ZSBiL2RvYy9lZnVuL21fcmVhbGxvY2F0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjdiYzk3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vbV9yZWFsbG9jYXRlCkBAIC0wLDAgKzEsMjMgQEAKK1NZTk9QU0lTCisgICAgICAgIG1hcHBpbmcgbV9yZWFsbG9jYXRlKG1hcHBpbmcgbSwgaW50IHdpZHRoKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIEVyemV1Z3QgZWluIG5ldWVzIE1hcHBpbmcgbWl0IDx3aWR0aD4gV2VydGVuIHBybyBLZXkgdW5kIGZ1ZWxsdCBkYXMKKyAgICAgICAgTWFwcGluZyBtaXQgZGVuIFdlcnRlbiBhdXMgPG0+LiBXZW5uIDxtPiB3ZW5pZ2VyIGFscyA8d2lkdGg+IFdlcnRlCisgICAgICAgIHBybyBLZXkgaGF0LCB3ZXJkZW4gaW0gbmV1ZW4gTWFwcGluZyBkaWUgcmVzdGxpY2hlbiBXZXJ0ZSBhdWYgMAorICAgICAgICBnZXNldHp0LiBXZW5uIDxtPiBtZWhyIGFscyA8d2lkdGg+IFdlcnRlIHBybyBLZXkgaGF0LCB3ZXJkZW4gZGllCisgICAgICAgIHVlYmVyemFlaGxpZ2VuIFdlcnRlIGlnbm9yaWVydC4KKworICAgICAgICBEYXMgdXJzcHJ1ZW5nbGljaGUgTWFwcGluZyA8bT4gd2lyZCBuaWNodCB2ZXJhZW5kZXJ0LgorCitCRUlTUElFTAorICAgICAgICBtYXBwaW5nIG0gPSAoWyAiZm9vIjoxOzI7MywgImJhciI6NDs1OzYgXSkKKworICAgICAgICBtX3JlYWxsb2NhdGUobSwgMSkgLS0+IGxpZWZlcnQgKFsgImZvbyI6MSwgICAgICAgImJhcjo0IF0pCisgICAgICAgIG1fcmVhbGxvY2F0ZShtLCA0KSAtLT4gbGllZmVydCAoWyAiZm9vIjoxOzI7MzswLCAiYmFyOjQ7NTs2OzAgXSkKKworQUVOREVSVU5HRU4KKyAgICBFaW5nZWZ1ZWhydCBpbiBMRE11ZCAzLjIuNiwgYXVmIFZvcnNjaGxhZyB2b24gVHViTXVkLgorCitTSUVIRSBBVUNICisgICAgICAgIG1fYWxsb2NhdGUoRSksIG1fdmFsdWVzKEUpLCB3aWR0aG9mKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9tX3ZhbHVlcyBiL2RvYy9lZnVuL21fdmFsdWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiOTQxNTQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9tX3ZhbHVlcwpAQCAtMCwwICsxLDE0IEBACitTWU5PUFNJUzoKKyAgICAgICAgbWl4ZWQgKm1fdmFsdWVzKG1hcHBpbmcgbWFwKQorICAgICAgICBtaXhlZCAqbV92YWx1ZXMobWFwcGluZyBtYXAsIGludCBpbmRleCkKKworREVTQ1JJUFRJT046CisgICAgICAgSWYgaW5kZXggaXMgMCBvciBub3QgZ2l2ZW4sIHJldHVybiBhbiBhcnJheSB3aXRoIHRoZSBmaXJzdCB2YWx1ZXMgb2YgCisgICAgICAgbWFwcGluZyAnbWFwJy4KKyAgICAgICBGb3IgdmFsdWVzIG9mIGluZGV4ID4wLCByZXR1cm4gYW4gYXJyYXkgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBoaWdoZXIKKyAgICAgICB2YWx1ZXMgb2YgbWFwcGluZyAnbWFwJywgaS5lLiBtX3ZhbHVlcyhtYXAsMikgcmV0dXJucyB0aGUgdGhpcmQgCisgICAgICAgdmFsdWVzLgorCitTRUUgQUxTTzoKKyAgICAgICBtYXBwaW5ncChFKSwgbWttYXBwaW5nKEUpLCBtX2luZGljZXMoRSksIG1fZGVsZXRlKEUpLAorICAgICAgIHNpemVvZihFKSwgd2lkdGhvZihFKSwgbWFwcGluZ3MoTFBDKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vbWFrZV9zaGFyZWRfc3RyaW5nIGIvZG9jL2VmdW4vbWFrZV9zaGFyZWRfc3RyaW5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYjY3MzIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9tYWtlX3NoYXJlZF9zdHJpbmcKQEAgLTAsMCArMSwyNCBAQAorVkVSQUxURVQKK1NZTk9QU0lTCisgICAgICAgIHN0cmluZyBtYWtlX3NoYXJlZF9zdHJpbmcgKHN0cmluZyBzdHIpOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgRnVlZ3QgPHN0cj4gaW4gZGllIFRhYmVsbGUgZGVyIGdlbWVpbnNhbSB2ZXJ3ZW5kZXRlbiBTdHJpbmcgZGVzIFNwaWVscworICAgICAgICBlaW4uCisKKyAgICAgICAgV2VubiBlaW4gU3RyaW5nIHZvbiBtZWhyZXJlbiBWYXJpYWJsZW4gLyBPYmpla3RlbiB2ZXJ3ZW5kZXQgd2lyZCwKKyAgICAgICAgc3BhcnQgZGllcyBTcGVpY2hlci4gS2V5cyB2b24gQWxpc3RzIHVuZCBNYXBwaW5ncyBzaW5kIGltbWVyIGdlbWVpbnNhbQorICAgICAgICB2ZXJ3ZW5kZXRlIFN0cmluZ3MuCisKKyAgICAgICAgSW4gTERNdWQgMy4zIGlzdCBkaWVzZSBGdW5rdGlvbiBuaWNodCBsYWVuZ2VyIG51ZXR6bGljaDogU3RyaW5ncworICAgICAgICB3ZXJkZW4gc293aWVzbyBzbyB3ZWl0IHdpZSBtb2VnbGljaCBnZW1laW5zYW0gdmVyd2VuZGV0LCB1bmQgZGVyCisgICAgICAgIERyaXZlciB3YW5kZWx0IHVudGFibGllcnRlIFN0cmluZ3MgbmFjaCBlaW5pZ2VyIFplaXQgYXV0b21hdGlzY2ggaW4KKyAgICAgICAgdGFibGllcnRlIFN0cmluZ3MgdW0gdW0KKworQlVHUworICAgICAgICBFaW4gYmVzc2VyZXMgU3RyaW5naGFuZGxpbmcgaW0gRHJpdmVyIHNvbGx0ZSBkaWVzZSBFZnVuIHVlYmVyZmx1ZXNzaWcKKyAgICAgICAgbWFjaGVuLgorCitBRU5ERVJVTkdFTgorICAgICAgICBFaW5nZWZ1ZWhydCBpbiBMRE11ZCAzLjIuNiwgYXVmIFZvcnNjaGxhZyB2b24gVHViTXVkLgorICAgICAgICBWZXJhbHRldCBzZWl0IExETXVkIDMuMyAuCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9tYXAgYi9kb2MvZWZ1bi9tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA4ZjA2NQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL21hcApAQCAtMCwwICsxLDkzIEBACitTWU5PUFNJUworICAgICAgICBtaXhlZCAqIG1hcChtaXhlZCAqYXJnLCBzdHJpbmcgZnVuYywgc3RyaW5nfG9iamVjdCBvYiwgbWl4ZWQgZXh0cmEuLi4pCisgICAgICAgIG1peGVkICogbWFwKG1peGVkICphcmcsIGNsb3N1cmUgY2wsIG1peGVkIGV4dHJhLi4uKQorICAgICAgICBtaXhlZCAqIG1hcChtaXhlZCAqYXJnLCBtYXBwaW5nIG0gWywgaW50IGlkeF0pCisKKyAgICAgICAgbWl4ZWQgKiBtYXAoc3RydWN0IGFyZywgc3RyaW5nIGZ1bmMsIHN0cmluZ3xvYmplY3Qgb2IsIG1peGVkIGV4dHJhLi4uKQorICAgICAgICBtaXhlZCAqIG1hcChzdHJ1Y3QgYXJnLCBjbG9zdXJlIGNsLCBtaXhlZCBleHRyYS4uLikKKyAgICAgICAgbWl4ZWQgKiBtYXAoc3RydWN0IGFyZywgbWFwcGluZyBtIFssIGludCBpZHhdKQorCisgICAgICAgIG1hcHBpbmcgbWFwKG1hcHBpbmcgYXJnLCBzdHJpbmcgZnVuYywgc3RyaW5nfG9iamVjdCBvYiwgbWl4ZWQgZXh0cmEuLi4pCisgICAgICAgIG1hcHBpbmcgbWFwKG1hcHBpbmcgYXJnLCBjbG9zdXJlIGNsLCBtaXhlZCBleHRyYS4uLikKKworICAgICAgICBzdHJpbmcgbWFwKHN0cmluZyBhcmcsIHN0cmluZyBmdW5jLCBzdHJpbmd8b2JqZWN0IG9iLCBtaXhlZCBleHRyYS4uLikKKyAgICAgICAgc3RyaW5nIG1hcChzdHJpbmcgYXJnLCBjbG9zdXJlIGNsLCBtaXhlZCBleHRyYS4uLikKKyAgICAgICAgc3RyaW5nIG1hcChzdHJpbmcgYXJnLCBtYXBwaW5nIG0gWywgaW50IGlkeF0pCisKK0JFU0NIUkVJQlVORworICAgICAgICBSdWZ0IGRpZSBGdW5rdGlvbiA8b2I+LT48ZnVuYz4oKSBiencuIGRpZSBDbG9zdXJlIDxjbD4gZnVlciBqZWRlcworICAgICAgICBFbGVtZW50IGRlcyBTdHJpbmdzLCBBcnJheXMsIE1hcHBpbmdzIG9kZXIgZGVyIFN0cnVrdHVyIDxhcmc+IGF1ZgorICAgICAgICB1bmQgbGllZmVydCBlaW4gUmVzdWx0YXQsIGRhcyBhdXMgZGVuIHZlcnNjaGllZGVuZW4gUnVlY2tnYWJld2VydGVuCisgICAgICAgIGVyc3RlbGx0IHd1cmRlLgorCisgICAgICAgIFd1cmRlIDxvYj4gbmljaHQgYW5nZWdlYmVuLCBvZGVyIGlzdCBlcyB3ZWRlciBlaW4gU3RyaW5nIG5vY2ggZWluCisgICAgICAgIE9iamVrdCwgd2lyZCBzdGF0dGRlc3NlbiB0aGlzX29iamVjdCgpIHZlcndlbmRldC4KKworICAgICAgICBJc3QgPGFyZz4gZWluIEFycmF5LCBlaW4gU3RyaW5nIG9kZXIgZWluZSBTdHJ1a3R1ciwgd2lyZCBkaWUgRnVua3Rpb24KKyAgICAgICAgbWl0IGplZGVtIEVsZW1lbnQgZGVzIEFycmF5cyBhbHMgZXJzdGVtIFBhcmFtZXRlciBhdWZnZXJ1ZmVuLCBnZWZvbGd0CisgICAgICAgIHZvbiBkZW4gPGV4dHJhPiBBcmd1bWVudGVuLiBEYXMgUmVzdWx0YXQgZGVyIEVmdW4gaXN0IGVpbiBBcnJheSwgZGFzCisgICAgICAgIGRpZSBSdWVja2dhYmV3ZXJ0ZSBkZXIgRnVua3Rpb25zYXVmcnVmZSBlbnRoYWVsdC4gTWFuIGtvZW5udGUgZGllCisgICAgICAgIE9wZXJhdGlvbiBtYXAoKSBkZXNoYWxiIHVtc2NocmVpYmVuIGFsczoKKworICAgICAgICAgICAgZm9yZWFjaChpbmRleCkgcmVzdWx0W2luZGV4XSA9IG9iLT5mdW5jKGFyZ1tpbmRleF0sIGV4dHJhLi4uKQorCisgICAgICAgIElzdCA8YXJnPiBlaW4gQXJyYXksIGVpbiBTdHJpbmcgb2RlciBlaW5lIFN0cnVrdHVyLCB1bmQgd3VyZGUgc3RhdHQKKyAgICAgICAgZWluZXIgRnVua3Rpb24gZWluIE1hcHBpbmcgYW5nZWdlYmVuLCBzbyBsaWVmZXJ0IG1hcCgpIGVpbiBBcnJheSBtaXQKKyAgICAgICAgZGVuIFdlcnRlbiwgZGllIGltIE1hcHBpbmcgYW4gU3RlbGxlIGRlciB1cnNwcnVlbmdsaWNoZW4gV2VydGUgc3RlaGVuLAorICAgICAgICBiencuIG1pdCBkZW4gT3JpZ2luYWx3ZXJ0ZW4sIHdlbm4gZnVlciBzaWUga2VpbiBNYXBwaW5nZWludHJhZworICAgICAgICBleGlzdGllcnQuIElzdCA8aWR4PiBhbmdlZ2ViZW4sIHNvIHdpcmQgZGllIGVudHNwcmVjaGVuZGUgU3BhbHRlIGRlcworICAgICAgICBNYXBwaW5ncyB2ZXJ3ZW5kZXQuIE1pdCBhbmRlcmVuIFdvcnRlbjoKKworICAgICAgICAgICAgZm9yZWFjaChpbmRleCkKKyAgICAgICAgICAgICAgICBpZiAoYXJnW2luZGV4XSBpc3QgZWluIEtleSBpbiA8YXJnPikKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2luZGV4XSA9IG1hcFthcmdbaW5kZXhdXSBvZGVyIG1hcFthcmdbaW5kZXhdXQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2luZGV4XSA9IGFyZ1tpbmRleF0KKworICAgICAgICBJc3QgPGFyZz4gZWluIE1hcHBpbmcsIHdpcmQgZGllIEZ1bmt0aW9uIGZ1ZXIgamVkZW4gS2V5IGRlcyBNYXBwaW5ncworICAgICAgICBhbHMgZXJzdGVtIFBhcmFtZXRlciB1bmQgZGVuIERhdGVud2VydGVuIChzb2Zlcm4gdm9yaGFuZGVuKSBhbHMKKyAgICAgICAgenVzYWV0emxpY2hlIEFyZ3VtZW50ZSBhdWZnZXJ1ZmVuLCBnZWZvbGd0IHZvbiBkZW4gPGV4dHJhPiBBcmd1bWVudGVuLgorICAgICAgICBEaWUgPGV4dHJhPiBBcmd1bWVudGUgZHVlcmZlbiBrZWluZSBnZXNjaHVldHp0ZW4gUmVmZXJlbnplbiBlbnRoYWx0ZW4KKyAgICAgICAgKHdpZSB6LkIuICYoaVswXSkpLiBEYXMgRXJnZWJuaXMgZGVyIEVmdW4gaXN0IGVpbiBNYXBwaW5nLCBkYXMgZGllCisgICAgICAgIFJlc3VsdGF0ZSBkZXIgRnVua3Rpb25zYXVmcnVmZSBhbHMgWnVvcmRudW5nIHp1bSBqZXdlaWxpZ2VuIEtleQorICAgICAgICBlbnRoYWVsdC4KKworICAgICAgICBBYmhhZW5naWcgdm9uIGRlciBCcmVpdGUgZGVzIE1hcHBpbmdzIDxhcmc+LCBrYW5uIGRpZSBPcGVyYXRpb24KKyAgICAgICAgdW1zY2hyaWViZW4gd2VyZGVuIGFsczoKKworICAgICAgICAgICAgZm9yZWFjaCAoa2V5IGluIGFyZykKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHdpZHRob2YoYXJnKSkKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gb2ItPmZ1bmMoa2V5LCAwLCBleHRyYS4uLikKKyAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gb2ItPmZ1bmMoa2V5LCBhcmdba2V5XSwgZXh0cmEuLi4pCisgICAgICAgICAgICAgICAgZWxzZSAgOgorICAgICAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IG9iLT5mdW5jKCBrZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICh7IGFyZ1trZXksMF0gLi4uYXJnW2tleSx3aWR0aC0xXSB9KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgZXh0cmEuLi4pCisKKyAgICAgICAgRGVyIFZvcnRlaWwgZGllc2VzIEFuc2F0emVzIGlzdCwgZGFzcyBiZWlkZSBBcnRlbiB2b24gbWVocmRpbWVuc2lvbmFsZW4KKyAgICAgICAgTWFwcGluZ3MgKE1hcHBpbmdzIG1pdCBtZWhyZXJlbiBXZXJ0ZW4gcHJvIEtleSB1bmQgTWFwcGluZ3Mgdm9uIEFycmF5cykKKyAgICAgICAgZ2xlaWNoIGJlaGFuZGVsdCB3ZXJkZW4ga29lbm5lbi4KKworQkVJU1BJRUxFCisgICAgICAgIGFyciA9ICh7IDEsIDIsIDMsIDQgfSk7CisgICAgICAgIG0gPSAoWyAxOi0xLCAzOi0zIF0pOworCisgICAgICAgIG1hcChhcnIsICMnJSwgMikgIC0tPiBsaWVmZXJ0ICh7IDEsIDAsIDEsIDAgfSkKKyAgICAgICAgbWFwKGFyciwgbSkgICAgICAgLS0+IGxpZWZlcnQgKFsgLTEsIDIsIC0zLCA0IH0pCisKK0FOTUVSS1VOR0VOCisgICAgICAgIG1hcCgpIGF1ZiBBcnJheXMgYW5nZXdhbmR0IHZlcmhhZWx0IHNpY2ggd2llIG1hcF9hcnJheSgpLCBhdWYgTWFwcGluZ3MKKyAgICAgICAgYW5nZXdhbmR0IGhpbmdlZ2VuIHZlcmhhZWx0IGVzIHNpY2ggd2llIGVpbmUgVmVyYWxsZ2VtZWluZXJ1bmcgdm9uCisgICAgICAgIG1hcF9pbmRpY2VzKCkuCisKK0dFU0NISUNIVEUKKyAgICAgICAgRWluZ2VmdWVocnQgaW4gTERNdWQgMy4yLjYsIGxvZXN0IG1hcF9hcnJheSgpIGFiLgorICAgICAgICBMRE11ZCAzLjIuOCBmdWVocnQgbmV1IGRpZSBNb2VnbGljaGtlaXQgZWluLCBlaW4gQXJyYXkgZHVyY2ggZWluCisgICAgICAgIE1hcHBpbmcgenUgbWFwcGVuLgorICAgICAgICBMRE11ZCAzLjMuNDM5IGZ1ZWhydCBtYXAoKSBmdWVyIFN0cmluZ3MgZWluLgorICAgICAgICBMRE11ZCAzLjMuNzE5IGZ1ZWhydCBkZW4gPGlkeD4tUGFyYW1ldGVyIGZ1ZXIgbWFwcGVuIG1pdCBNYXBwaW5ncyBlaW4uCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgZmlsdGVyKEUpLCBmaWx0ZXJfaW5kaWNlcyhFKSwgbWFwX2luZGljZXMoRSksIG1hcF9vYmplY3RzKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9tYXBfaW5kaWNlcyBiL2RvYy9lZnVuL21hcF9pbmRpY2VzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlM2IxNWYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9tYXBfaW5kaWNlcwpAQCAtMCwwICsxLDc1IEBACittYXBfaW5kaWNlcyhFKQorCitGVU5LVElPTjoKKyAgICAgbWFwcGluZyBtYXBfaW5kaWNlcyhtYXBwaW5nIG0sIHN0cmluZyBmdW4sIG9iamVjdCBvYiBbLCBtaXhlZCBleHRyYV0pCisgICAgIG1hcHBpbmcgbWFwX2luZGljZXMobWFwcGluZyBtLCBjbG9zdXJlIGNsIFssIG1peGVkIGV4dHJhXSkKKworUEFSQU1FVEVSOgorICAgICBhcnIJLSB6dSBtYXBwZW5kZXMgQXJyYXkKKyAgICAgZnVuL2NsCS0genUgcnVmZW5kZSBNZXRob2RlL0Nsb3N1cmUKKyAgICAgb2IJCS0gT2JqZWt0L0RhdGVpbmFtZSwgYW4gZGVtIE1ldGhvZGUgZ2VydWZlbiB3ZXJkZW4gc29sbAorICAgICBleHRyYQktIHdlaXRlcmUgUGFyYW1ldGVyIGZ1ZXIgTWV0aG9kZS9DbG9zdXJlCisKK0JFU0NIUkVJQlVORzoKKyAgICAgTWFwcGVkIGRpZSBFbGVtZW50ZSAoamV3ZWlscyBTY2hsdWVzc2VsKSBhdXMgJ21hcCcgZHVyY2ggZGllIE1ldGhvZGUKKyAgICAgJ2Z1bicgb2RlciBkaWUgQ2xvc3VyZSAnY2wnIGluIGVpbiBuZXVlcyBNYXBwaW5nLgorICAgICBGdWVyIGplZGVzIEVsZW1lbnQgYXVzICdtJyB3aXJkICdmdW4nIG9kZXIgJ2NsJyBtaXQgZGVtIFNjaGx1ZXNzZWwgYWxzCisgICAgIGVyc3RlbSBQYXJhbWV0ZXIgW3VuZCBmb2xnZW5kIGRlbiBvcHRpb25hbGVuIEV4dHJhLVBhcmFtZXRlcm5dIGdlcnVmZW4uCisKKyAgICAgRGVyIFJ1ZWNrZ2FiZXdlcnQgZGVyIE1ldGhvZGUvQ2xvc3VyZSB3aXJkIGluIGZ1ZXIgZGVuIFNjaGx1ZXNzZWwgYWxzCisgICAgIERhdGVud2VydCBpbiBkYXMgbmV1ZSBNYXBwaW5nIGVpbmdldHJhZ2VuLgorCisgICAgIEFDSFRVTkc6IEFsbGUgYW5kZXJlbiBEYXRlbiBiZWkgTWFwcGluZyBtaXQgQnJlaXRlPjEgdmVyZmFsbGVuIQorCisgICAgIFZlcndlbmR1bmcgdm9uIE1ldGhvZGVuOgorCVdlbm4gYmVpIGRlciBBbmdhYmUgdm9uICdmdW4nIGtlaW4gT2JqZWt0ICdvYicgaW4gRm9ybSBlaW5lcyBTdHJpbmdzCisJb2RlciBPYmpla3RzIGFuZ2VnZWJlbiB3aXJkLCB3aXJkIHRoaXNfb2JqZWN0KCkgYW5nZW5vbW1lbi4KKworICAgICBWZXJ3ZW5kdW5nIHZvbiBDbG9zdXJlczoKKwlFcyBrb2VubmVuIHNvd29obCBMZnVuLUNsb3N1cmVzIGFscyBhdWNoIExhbWJkYS1DbG9zdXJlcyB2ZXJ3ZW5kZXQKKwl3ZXJkZW4uIExmdW4tQ2xvc3VyZXMga29lbm5lbiwgd2VubiBpbSBzZWxiZW4gT2JqZWt0IHZvcmhhbmRlbiBhdWNoCisJJ3ByaXZhdGUnIG9kZXIvdW5kICdzdGF0aWMnIGRla2xhcmllcnQgc2VpbiwgbXVlc3NlbiBhYmVyIHp1IGRlbQorCVplaXRwdW5rdCBkZXIgVmVyd2VuZHVuZyBiZWthbm50IHNlaW4gKEZ1bmt0aW9uc3Byb3RvdHlwZW4gYmVudXR6ZW4pLgorCitSVWVDS0dBQkVXRVJUOgorICAgICBNYXBwaW5nIG1pdCBTY2hsdWVzc2VsOlJ1ZWNrZ2FiZXdlcnRlbiBkZXIgTWV0aG9kZS9DbG9zdXJlLgorCitCRUlTUElFTEU6CisgICAgIC8vIGVyc2V0emUgaW4gZWluZW0gTWFwcGluZyBkaWUgRGF0ZW53ZXJ0ZSBkdXJjaCBkYXMgRG9wcGVsdGUsCisgICAgIC8vIG51dHplIGRhYmVpIGRpZSBEYXRlbndlcnRlIGRlcyBBbHRtYXBwaW5ncyBkdXJjaCBVZWJlcmdhYmUgYWxzCisgICAgIC8vIGV4dHJhLVBhcmFtZXRlcgorCisgICAgIC8vIEFubWVya3VuZzogRGFzIGdlaHQgbWl0IHdhbGtfbWFwcGluZygpIGVsZWdhbnRlciEKKworICAgICBpbnQgZG9fZG91YmxlKHN0cmluZyBrZXksIG1hcHBpbmcgbSwgaW50IG11bHQpIHsKKyAgICAgIHJldHVybiBtW2tleV0qbXVsdDsKKyAgICAgfQorCisgICAgIG1hcHBpbmcgeCwgeTsKKyAgICAgeD0oWyJhIjoyLCAiYiI6M10pOworICAgICB5PW1hcF9pbmRpY2VzKChbImEiOjIsICJiIjozXSksICMnZG9fZG91YmxlLCAmeCwgMyk7CisKKyAgICAgeSA9PSAoWyJhIjo2LCJiIjo5XSkKKworQWVRVUlWQUxFTlpDT0RFIChuaWNodCBlbXBmb2hsZW4sIG51ciB6dW0gVmVyc3RhZW5kbmlzISk6CisgICAgIGludCBpOworICAgICBtYXBwaW5nIHJldDsgbWFwcGluZyBpbnB1dDsKKyAgICAgbWl4ZWQgKmluZGV4OworCisgICAgIHJldD1tX2FsbG9jYXRlKDAsIDEpOworICAgICBpbmRleD1tX2luZGljZXMoaW5wdXQpOworICAgICBpPXNpemVvZihpbmRleCk7CisgICAgIHdoaWxlKGktLSkKKyAgICAgICByZXRbaW5kZXhbaV1dPW9iLT5mdW4oaW5kZXhbaV0gWywgZXh0cmExLCBleHRyYTIsIC4uLl0pKQorICAgICAgIC8vIHJldFtpbmRleFtpXV09ZnVuY2FsbChjbCwgaW5kZXhbaV0gWywgZXh0cmExLCBleHRyYTIsIC4uLl0pOworCitTSUVIRSBBVUNIOgorICAgICBBcnJheXM6CQlmaWx0ZXIoRSksIG1hcChFKQorICAgICBPYmpla3RhcnJheXM6CWZpbHRlcl9vYmplY3RzKEUpLCBtYXBfb2JqZWN0cyhFKQorICAgICBNYXBwaW5nczoJCWZpbHRlcl9pbmRpY2VzKEUpCisKKyAgICAgU29uc3RpZ2VzOgkJd2Fsa19tYXBwaW5nKEUpLCBtX2NvbnRhaW5zKEUpCisJCQltZW1iZXIoKQorCQkJbV9pbmRpY2VzKEUpLCBtX3ZhbHVlcyhFKQorCisyOS4xMC4yMDA2IFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL21hcF9vYmplY3RzIGIvZG9jL2VmdW4vbWFwX29iamVjdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU0M2EyZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL21hcF9vYmplY3RzCkBAIC0wLDAgKzEsNTEgQEAKK21hcF9vYmplY3RzKEUpCisKK0ZVTktUSU9OOgorICAgICBvYmplY3QgKm1hcF9vYmplY3RzKG9iamVjdCAqYXJyLCBzdHJpbmcgZnVuIFssIG1peGVkIGV4dHJhXSkKKworUEFSQU1FVEVSOgorICAgICBhcnIJLSB6dSBtYXBwZW5kZXMgQXJyYXkgdm9uIE9iamVrdGVuL09iamVrdHBmYWRlbgorICAgICBmdW4JLSBhbiBPYmpla3RlbiB6dSBydWZlbmRlIE1ldGhvZGUKKyAgICAgZXh0cmEJLSB3ZWl0ZXJlIFBhcmFtZXRlciBmdWVyIE1ldGhvZGUKKworQkVTQ0hSRUlCVU5HOgorICAgICBNYXBwZWQgZGllIEVsZW1lbnRlIGF1cyAnYXJyJyBkdXJjaCBkZW4gQXVmcnVmIGRlciBNZXRob2RlICdmdW4nIGFuCisgICAgIGplZGVtIGRlciBFbGVtZW50ZSB2b24gJ2FycicgaW4gZWluIG5ldWVzIEFycmF5LgorICAgICAwLUVpbnRyYWVnZSB3ZXJkZW4gaWdub3JpZXJ0LgorCisgICAgIERlciBSdWVja2dhYmV3ZXJ0IHZvbgorCWFycltuXS0+ZnVuKFtleHRyYTEsIGV4dHJhMiwgLi4uXSkKKyAgICAgd2lyZCBhbiBkZXIgSW5kZXhwb3NpdGlvbiBkZXMgRWxlbWVudGVzIGluIGRhcyBuZXVlIEFycmF5IGVpbmdldHJhZ2VuLgorCitSVWVDS0dBQkVXRVJUOgorICAgICBBcnJheSBtaXQgUmVzdWx0YXRlbiBkZXIgRnVua3Rpb25zYXVmcnVmZSBhbSBqZXdlaWxpZ2VuIE9iamVrdC4KKworQkVNRVJLVU5HRU46CisgICAgIFdlcmRlbiBQZmFkZSBhbmdlZ2ViZW4sIHNvIHdpcmQgdmVyc3VjaHQgZWluIE9iamVrdCB6dSBsYWRlbiwgZmFsbHMKKyAgICAgZGllc2VzIG5pY2h0IGV4aXN0aWVydC4KKworQkVJU1BJRUw6CisgICAgIC8vIGVyc2V0emUgYWxsZSBPYmpla3RlIGR1cmNoIGlocmUgTmFtZW4KKyAgICAgYXJyPW1hcF9vYmplY3RzKGlucHV0YXJyLCAibmFtZSIpOworCisgICAgIC8vIGVyc2V0emUgYWxsZSBPYmpla3RlIGR1cmNoIGlocmUgTmFtZW4gaW0gR2VuaXRpdgorICAgICBhcnI9bWFwX29iamVjdHMoaW5wdXRhcnIsICJuYW1lIiwgV0VTU0VOKTsKKworQWVRVUlWQUxFTlpDT0RFIChuaWNodCBlbXBmb2hsZW4sIG51ciB6dW0gVmVyc3RhZW5kbmlzISk6CisgICAgIGludCBpOworICAgICBvYmplY3QgKnJldDsgbWl4ZWQgKmlucHV0OworCisgICAgIGk9c2l6ZW9mKGlucHV0KTsKKyAgICAgcmV0PWFsbG9jYXRlKGkpOworICAgICB3aGlsZShpLS0pCisgICAgICAgcmV0W2ldPWlucHV0W2ldLT5mdW4oW2V4dHJhMSwgZXh0cmEyLCAuLi5dKTsKKworU0lFSEUgQVVDSDoKKyAgICAgQXJyYXlzOgkJZmlsdGVyKEUpLCBtYXAoRSkKKyAgICAgT2JqZWt0YXJyYXlzOglmaWx0ZXJfb2JqZWN0cyhFKQorICAgICBNYXBwaW5nczoJCWZpbHRlcl9pbmRpY2VzKEUpLCBtYXBfaW5kaWNlcyhFKQorCisgICAgIFNvbnN0aWdlczoJCXNvcnRfYXJyYXkoRSksIHVuaXF1ZV9hcnJheSgpCisJCQlhbGlzdCwgdHJhbnNwb3NlX2FycmF5KEUpCisKKzIwLkphbiAyMDA1IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9tYXBwaW5ncCBiL2RvYy9lZnVuL21hcHBpbmdwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZjJhYzcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9tYXBwaW5ncApAQCAtMCwwICsxLDkgQEAKK1NZTk9QU0lTOgorCWludCBtYXBwaW5ncChtaXhlZCBhcmcpCisKK0RFU0NSSVBUSU9OOgorCVJldHVybiAxIGlmIHRoZSBhcmd1bWVudCBpcyBhIG1hcHBpbmcsIG9yIDAgaWYgaXQgaXMgbm90LiAKKworU0VFIEFMU086CisJaW50cChFKSwgc3RyaW5ncChFKSwgb2JqZWN0cChFKSwgcG9pbnRlcnAoRSksIG1rbWFwcGluZyhFKSwKKwltX2luZGljZXMoRSksIG1fdmFsdWVzKEUpLCBtX2RlbGV0ZShFKSwgc2l6ZW9mKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9tYXN0ZXIgYi9kb2MvZWZ1bi9tYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RmNTViNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL21hc3RlcgpAQCAtMCwwICsxLDE3IEBACitTWU5PUFNJUworICAgICAgICBvYmplY3QgbWFzdGVyKCk7CisgICAgICAgIG9iamVjdCBtYXN0ZXIoaW50IGRvbnRfbG9hZCk7CisKK0JFU0NIUkVJQlVORworICAgICAgICBEaWUgRnVua3Rpb24gbGllZmVydCBkYXMgTWFzdGVyb2JqZWt0LgorCisgICAgICAgIFdlbm4gPGRvbnRfbG9hZD4gbmljaHQgd2FociBpc3QsIHN0ZWxsdCBtYXN0ZXIoKSB6dWVyc3Qgc2ljaGVyLCBkYXNzCisgICAgICAgIGRhcyBNYXN0ZXJvYmpla3QgYXVmIGV4aXN0aWVydC4gV2VubiA8ZG9udF9sb2FkPiB3YWhyIGlzdCwgbGllZmVydAorICAgICAgICBtYXN0ZXIoKSBudXIgZGFzIE1hc3Rlcm9iamVrdCBvZGVyIDAsIGZhbGxzIGRhcyBha3R1ZWxsZSBNYXN0ZXJvYmpla3QKKyAgICAgICAgemVyc3RvZXJ0IHd1cmRlLgorCitBRU5ERVJVTkdFTgorICAgICAgICBFaW5nZWZ1ZWhydCBpbiBMRE11ZCAzLjIuMTAKKworU0lFSEUgQVVDSAorICAgICAgICBtYXN0ZXIoTSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL21hdGNoX2NvbW1hbmQgYi9kb2MvZWZ1bi9tYXRjaF9jb21tYW5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNDk1ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9tYXRjaF9jb21tYW5kCkBAIC0wLDAgKzEsMjcgQEAKK1NZTk9QU0lTCisgICAgICAgICNpbmNsdWRlIDxzeXMvY29tbWFuZHMuaD4KKworICAgICAgICBtaXhlZCAqIG1hdGNoX2NvbW1hbmQgKHN0cmluZyBjb21tYW5kLCBvYmplY3Qgb3JpZ2luKQorCitERVNDUklQVElPTgorICAgICAgICBUYWtlIHRoZSBjb21tYW5kIDxjb21tYW5kPiwgcGFyc2UgaXQsIGFuZCByZXR1cm4gYW4gYXJyYXkgb2YgYWxsCisgICAgICAgIG1hdGNoaW5nIGFjdGlvbnMgYWRkZWQgdG8gPG9yaWdpbj4gKHJlYWQ6IDxvcmlnaW4+IGlzIHRoZSBvYmplY3QKKyAgICAgICAgJ2lzc3VpbmcnIHRoZSBjb21tYW5kKS4KKworICAgICAgICBFYWNoIGVudHJ5IGluIHRoZSByZXN1bHQgYXJyYXkgaXMgaXRzZWxmIGFuIGFycmF5IG9mOgorCisgICAgICAgICAgc3RyaW5nIFtDTURNX1ZFUkJdOiAgIFRoZSBtYXRjaGVkIHZlcmIuCisgICAgICAgICAgc3RyaW5nIFtDTURNX0FSR106ICAgIFRoZSBhcmd1bWVudCBzdHJpbmcgcmVtYWluaW5nLCBvciAwIGlmIG5vbmUuCisgICAgICAgICAgb2JqZWN0IFtDTURNX09CSkVDVF06IFRoZSBvYmplY3QgZGVmaW5pbmcgdGhlIGFjdGlvbi4KKyAgICAgICAgICBzdHJpbmcgW0NNRE1fRlVOXTogICAgVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGNhbGwgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ01ETV9PQkpFQ1QsIHdoaWNoIG1heSBiZSBzdGF0aWMuCisKKyAgICAgICAgVGhlIGVmdW4gaXMgdXNlZnVsIGZvciBib3RoIGRlYnVnZ2luZywgYW5kIGZvciBpbXBsZW1lbnRpbmcgeW91cgorICAgICAgICBvd24gSF9DT01NQU5EIGhhbmRsaW5nLgorCitISVNUT1JZCisgICAgICAgIEludHJvZHVjZWQgaW4gTERNdWQgMy4zLjI1OS4KKworU0VFIEFMU08KKyAgICAgICAgaG9va3MoQyksIGV4ZWN1dGVfY29tbWFuZChFKSwgY29tbWFuZChFKSwgbm90aWZ5X2ZhaWwoRSksCisgICAgICAgIGNvbW1hbmRfc3RhY2soRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL21heCBiL2RvYy9lZnVuL21heApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODlmNGE1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vbWF4CkBAIC0wLDAgKzEsMjMgQEAKK1NZTk9QU0lTCisgICAgICAgIHN0cmluZyBtYXgoc3RyaW5nIGFyZywgLi4uKTsKKyAgICAgICAgc3RyaW5nIG1heChzdHJpbmcgKmFyZyk7CisKKyAgICAgICAgaW50fGZsb2F0IG1heChpbnR8ZmxvYXQgYXJnLCAuLi4pOworICAgICAgICBpbnR8ZmxvYXQgbWF4KGludHxmbG9hdCAqYXJnKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIERpZSBGdW5rdGlvbiBsaWVmZXJ0IGRlbiBncm9lc3N0ZW4gV2VydCBhbGxlciA8YXJnPiB1bmQgbGllZmVydCBpaG4KKyAgICAgICAgenVydWVjay4gV2lyZCBtYXgoKSBudXIgbWl0IGVpbmVtIEFycmF5IGF1ZmdlcnVmZW4gd2lyZCAoZGFzIG5pY2h0CisgICAgICAgIGxlZXIgc2VpbiBkYXJmKSwgbGllZmVydCBkaWUgRnVua3Rpb24gZGFzIGdyb2Vzc3RlIEVsZW1lbnQgYXVzIDxhcmc+LgorCitCRUlTUElFTAorICAgICAgICBtYXgoMSkgICAgICAgICAgICAgICAgICAgICAtIGxpZWZlcnQgMQorICAgICAgICBtYXgoMSwgMS4xKSAgICAgICAgICAgICAgICAtIGxpZWZlcnQgMS4xCisgICAgICAgIG1heCgiZm9vIiwgImJhciIpICAgICAgICAgIC0gbGllZmVydCAiZm9vIgorICAgICAgICBtYXgoICh7ICJmb28iLCAiYmFyIiB9KSApICAtIGxpZWZlcnQgImZvbyIKKworQUVOREVSVU5HRU4KKyAgICAgICAgRWluZ2VmdWVocnQgaW4gTERNdWVkIDMuMi45LgorCitTSUVIRSBBVUNICisgICAgICAgIG1pbihFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vbWQ1X2NyeXB0IGIvZG9jL2VmdW4vbWQ1X2NyeXB0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MWJhMTgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9tZDVfY3J5cHQKQEAgLTAsMCArMSwyMCBAQAorU1lOT1BTSVMKKyAgICAgICAgc3RyaW5nIG1kNV9jcnlwdChzdHJpbmcgc3RyLCBpbnQgc2VlZCkKKyAgICAgICAgc3RyaW5nIG1kNV9jcnlwdChzdHJpbmcgc3RyLCBzdHJpbmcgc2VlZCkKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIFZlcnNjaGx1ZXNzZWx0IGRlbiBTdHJpbmcgPHN0cj4gbWl0IGRlbSBTY2hsdWVzc2VsIDxzZWVkPi4KKyAgICAgICAgPHNlZWQ+IGthbm4gZW50d2VkZXIgZWluIEludGVnZXIgc2VpbiBvZGVyIHp3ZWkgWmVpY2hlbiBhdXMKKyAgICAgICAgZGVtIFN0cmluZyA8c2VlZD4uICBXZW5uIDxzZWVkPiAwIGlzdCwgd2lyZCBlaW4genVmYWVsbGlnZXIKKyAgICAgICAgU2NobHVlc3NlbCBlcnpldWd0LgorCisgICAgICAgIERhcyBSZXN1bHRhdCBlbnRoYWVsdCBkZW4gU2NobHVlc3NlbCBhbHMgZGllIGVyc3RlbiBiZWlkZW4gWmVpY2hlbi4KKworICAgICAgICBEaWUgRWZ1biB2ZXJ3ZW5kZXQgZGVuIE1ENS1BbGdvcml0aG11cywgdW5kIGRhcyBSZXN1bHRhdCBpc3QKKyAgICAgICAga29tcGF0aWJsZSBtaXQgZGVyIFBhc3N3b3JkdmVyc2NobHVlc3NlbHVuZyBkZXMgQXBhY2hlIFdlYnNlcnZlcnMuCisKKyAgICAgICAgRnVlciBQYXNzd29ydGFiZnJhZ2VuLCBkaWUgb2huZSBFY2hvIGVpbmdlZ2ViZW4gd2VyZGVuIGtvZW5uZW4gc29sbGVuLAorICAgICAgICBiaWV0ZXQgaW5wdXRfdG8oKSBlaW4gc3BlemllbGxlcyBGbGFnLgorCitTSUVIRSBBVUNICisgICAgICAgIGNyeXB0KEUpLCBtZDUoRSksIHNoYTEoRSksIGlucHV0X3RvKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9tZW1iZXIgYi9kb2MvZWZ1bi9tZW1iZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYwZTY2YQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL21lbWJlcgpAQCAtMCwwICsxLDI0IEBACitTWU5PUFNJUworICAgICAgICBpbnQgbWVtYmVyKG1peGVkICphcnJheSwgbWl4ZWQgZWxlbSBbLCBpbnQgc3RhcnRdKTsKKyAgICAgICAgaW50IG1lbWJlcihzdHJpbmcgcywgaW50IGVsZW0gWywgaW50IHN0YXJ0XSk7CisgICAgICAgIGludCBtZW1iZXIobWFwcGluZyBtYXAsIG1peGVkIGtleSk7CisKK0JFU0NIUkVJQlVORworICAgICAgICBGdWVyIEFycmF5cyB1bmQgU3RyaW5nIGxpZWZlcnQgbWVtYmVyKCkgZGVuIEluZGV4IGRlcyBlcnN0ZW4KKyAgICAgICAgQXVmdHJldGVucyB2b24gPGVsZW0+IGluIDxhcmc+LiBJc3QgPGVsZW0+IG5pY2h0IGluIDxhcmc+IGVudGhhbHRlbiwKKyAgICAgICAgd2lyZCAtMSB6dXJ1ZWNrIGdlZ2ViZW4uCisKKyAgICAgICAgSXN0IDxzdGFydD4gYWxzIFphaGwgPj0gMCBnZWdlYmVuLCBiZWdpbm50IGRpZSBTdWNoZSBhYiBkZXIKKyAgICAgICAgYW5nZWdlYmVuZW4gUG9zaXRpb24uIEVpbmUgU3RhcnRwb3NpdGlvbiBncm9lc3NlciBhbHMgZGllCisgICAgICAgIExhZW5nZSBkZXMgU3RyaW5ncy9BcnJheXMgbGllZmVydCBzdGV0cyBkYXMgUmVzdWx0YXQgLTEuCisKKyAgICAgICAgRnVlciBNYXBwaW5nIHBydWVmdCBtZW1iZXIoKSwgb2IgPGtleT4gaW4gPG1hcD4gZW50aGFsdGVuIGlzdCB1bmQKKyAgICAgICAgbGllZmVydCAxIHp1cnVlY2sgZmFsbHMgamEsIDAgc29uc3QuCisKK0JFSVNQSUVMRQorICAgICAgICBtZW1iZXIoICh7ICJhYmMiLCAiZGVmZyIgfSksICJkZWZnIiApID0gMQorICAgICAgICBtZW1iZXIoICh7ICJhYmMiLCAiZGVmZyIgfSksICJ4IiApID0gLTEKKyAgICAgICAgbWVtYmVyKCAiYWJjZGVmZyIsIDEwMCApID0gbWVtYmVyKCAiYWJjZGVmZyIsICdkJyApID0gMworCitTSUVIRSBBVUNICisgICAgICAgIHJtZW1iZXIoRSksIG1hcHBpbmdzKExQQykKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9taW4gYi9kb2MvZWZ1bi9taW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzExZjliNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL21pbgpAQCAtMCwwICsxLDIyIEBACitTWU5PUFNJUworICAgICAgICBzdHJpbmcgbWluKHN0cmluZyBhcmcsIC4uLiApOworICAgICAgICBzdHJpbmcgbWluKHN0cmluZyAqYXJnX2FycmF5KTsKKyAgICAgICAgaW50fGZsb2F0IG1pbihpbnR8ZmxvYXQgYXJnLCAuLi4pOworICAgICAgICBpbnR8Zmxhb3QgbWluKGludHxmbG9hdCAqYXJnX2FycmF5KTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIExpZWZlcnQgZGFzIGtsZWluc3RlIGRlciBBcmd1bWVudGUgPGFyZz4uIFdlbm4gbWluKCkgZnVlciBlaW4KKyAgICAgICAgZWluemVsbmVzIChuaWNodCBsZWVyZXMpIEFycmF5IGF1ZmdlcnVmZW4gd2lyZCwgbGllZmVydCBtaW4oKSBkYXMKKyAgICAgICAga2xlaW5zdGUgRWxlbWVudCBpbSBBcnJheS4KKworQkVJU1BJRUwKKyAgICAgICAgbWluKDEpICAgICAgICAgICAgICAgICAgICAgIC0+IGxpZWZlcnQgMQorICAgICAgICBtaW4oMSwgLTEuMSkgICAgICAgICAgICAgICAgLT4gbGllZmVydCAtMS4xCisgICAgICAgIG1pbigiYmxhIiwgImZhc2VsIikgICAgICAgICAtPiBsaWVmZXJ0ICJibGEiCisgICAgICAgIG1pbiggKHsgImJsYSIsICJmYXNlbCIgfSkgKSAtPiBsaWVmZXJ0ICJibGEiCisKK0FFTkRFUlVOR0VOCisgICAgICAgIEVpbmdlZnVlaHJ0IGluIExETXVkIDMuMi45LgorCitTSUVIRSBBVUNICisgICAgICAgIG1heChFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vbWtkaXIgYi9kb2MvZWZ1bi9ta2RpcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzdhNjgzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vbWtkaXIKQEAgLTAsMCArMSw5IEBACitTWU5PUFNJUworICAgICAgICBpbnQgbWtkaXIoc3RyaW5nIHBhdGgpOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgRXJzdGVsbHQgZWluIFZlcnplaWNobmlzIDxwYXRoPiB1bmQgbGllZmVydCAxLCB3ZW5uIGRhcyBWZXJ6ZWljaG5pcworICAgICAgICBlcnN0ZWxsdCB3ZXJkZW4ga29ubnRlLCBzb25zdCAwLgorCitTSUVIRSBBVUNICisgICAgICAgIHJtZGlyKEUpLCBybShFKSwgZ2V0X2RpcihFKSwgZmlsZV9zaXplKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9ta21hcHBpbmcgYi9kb2MvZWZ1bi9ta21hcHBpbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVjZjgyNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL21rbWFwcGluZwpAQCAtMCwwICsxLDM3IEBACitTWU5PUFNJUworICAgICAgICBtYXBwaW5nIG1rbWFwcGluZyhtaXhlZCAqYXJyMSwgbWl4ZWQgKmFycjIsIG1peGVkICphcnIzLCAuLi4pOworICAgICAgICBtYXBwaW5nIG1rbWFwcGluZyhzdHJ1Y3Qgc3QpOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgTGllZmVydCBlaW4gTWFwcGluZyBtaXQgS2V5cyBhdXMgPGFycjE+IHVuZCBEYXRlbmVsZW1lbnRlbiBhdXMKKyAgICAgICAgPGFycjI+LCA8YXJyMz4uLi4uIERlbSBLZXkgPGFycjFbMF0+IHdlcmRlbiBkaWUgRGF0ZW5lbGVtZW50ZQorICAgICAgICA8YXJyMlswXT4sIDxhcnIzWzBdPi4uLiB6dWdlb3JkbmV0LiBXZW5uIGRpZSBEYXRlbmFycmF5cworICAgICAgICB1bmdsZWljaCBncm9zcyBzaW5kLCBlbnRoYWVsdCBkYXMgTWFwcGluZyBudXIgc28gdmllbGUgRWludHJhZWdlLAorICAgICAgICB3aWUgaW0ga2xlaW5zdGVuIERhdGVuYXJyYXkgZW50aGFsdGVuIHNpbmQuCisKKyAgICAgICAgRGllIHp3ZWl0ZSBGb3JtIGtvbnZlcnRpZXJ0IGRpZSBhbmdlZ2ViZW5lIHN0cnVjdCA8c3Q+IGluIGVpbiBNYXBwaW5nLgorICAgICAgICBIaWVyYmVpIHdlcmRlbiBkaWUgTmFtZW4gZGVzIGpld2VpbGlnZW4gRWxlbWVudGVzIGluIGRlciBzdHJ1Y3QgYWxzCisgICAgICAgIGFscyBTY2hsdWVzc2VsLgorCisgICAgICAgIEdld29laG5saWNoIHdlcmRlbiBNYXBwaW5ncyBlcndlaXRlcnQsIGluZGVtIGVpbmZhY2ggbmV1ZSBFbGVtZW50ZQorICAgICAgICBlaW5nZWZ1ZWd0IHdlcmRlbi4gRGllc2UgRnVua3Rpb24gaXN0IG51ZXR6bGljaCwgd2VubiBkZXIKKyAgICAgICAgdW5nZWZhZWhyIGJlbm9ldGlndGUgU3BlaWNoZXJwbGF0eiBiZXJlaXRzIHZvcmhlciBiZWthbm50IGlzdCwKKyAgICAgICAgdW0gc28gZGVuIE92ZXJoZWFkIGJlaSBkZXIgU3BlaWNoZXJhbGxva2F0aW9uIHp1IG1pbmltaWVyZW4uCisgICAgICAgIEFsbGVuZmFsbHMgenUgdmllbCBhbGxvemllcnRlciBTcGVpY2hlciB3aXJkIGZyZWlnZWdlYmVuLCBzb2JhbGQKKyAgICAgICAgZGllIEZ1bmt0aW9uLCBkaWUgZGllIG1rbWFwcGluZygpIEFud2Vpc3VuZyBlbnRoYWVsdCwgYmVlbmRldCBpc3QuCisKK0JFU0lQSUVMCisgICAgICAgIG1rbWFwcGluZyggKHsgMSwgMiB9KSwgKHsgMTAsIDExIH0pLCAoeyAyMCwgMjEsIDIyfSkpOworICAgICAgICAgIGxpZWZlcnQgKFsgMToxMDsyMCwgMjoxMTsyMSBdKQorCisgICAgICAgIHN0cnVjdCBzIHsgaW50IGEsIGIsIGM7IH07CisgICAgICAgIG1rbWFwcGluZyggKDxzPiAxLCAoeyAyLCAzIH0pLCAzICkKKyAgICAgICAgICBsaWVmZXJ0IChbICJhIjoxLCAiYiI6KHsyLDN9KSwgImMiOjMgXSkKKworQWVOREVSVU5HRU4KKyAgICAgICAgTERNdWQgMy4zLjQzMyBlcm1vZWdsaWNodGUgZGllIEtvbnZlcnNpb24gdm9uIHN0cnVjdHMuCisKK1ZFUkdMRUlDSEUKKyAgICAgICAgbWFwcGluZ3MoTFBDKSwgbWFwcGluZ3AoRSksIG1faW5kaWNlcyhFKSwgbV92YWx1ZXMoRSksCisgICAgICAgIG1fYWRkKEUpLCBtX2RlbGV0ZShFKSwgc2l6ZW9mKEUpLCB3aWR0aG9mKEUpLCB1bm1rbWFwcGluZyhFKSwKKyAgICAgICAgdG9fc3RydWN0KEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9ta3RpbWUgYi9kb2MvZWZ1bi9ta3RpbWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcxMjI3YgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL21rdGltZQpAQCAtMCwwICsxLDM4IEBACitTWU5PUFNJUworICAgICAgICAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworICAgICAgICBpbnQgbWt0aW1lKGludCAqdHMpOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgSXN0IGRhcyBBcmd1bWVudCA8dHM+IGVpbiBBcnJheSBtaXQgOSBFbGVtZW50ZW4gKGludCksIGVudHNwcmVjaGVuZAorICAgICAgICBkZXMgUnVlY2tnYWJld2VydGVzIHZvbiBsb2NhbF90aW1lKCkvZ21fdGltZSgpLCBsaWVmZXJ0IGRpZSBGdW5rdGlvbgorICAgICAgICBkaWUgQW56YWhsIFNla3VuZGVuIHNlaXQgZGVtIDAxLiBKYW51YXIgMTk3MCwgMDA6MDA6MDAgenVydWVjay4KKyAgICAgICAgRGllcyBpc3Qgdm9uIE51dHplbiwgd2VubiBtYW4gZWluIERhdHVtL1VocnplaXQgaGF0LCBkaWVzZSBhYmVyIGFscworICAgICAgICBHYW56emFobC1XZXJ0IHNwZWljaGVybiB3aWxsIG9kZXIgZWluZSBaZWl0ZGlmZmVyZW56IHp3aXNjaGVuIHp3ZWkKKyAgICAgICAgRGF0ZW4gYXVzcmVjaG5lbiB3aWxsLgorCisgICAgICAgIERhcyBBcnJheSBtdXNzIGRhYmVpIHNvIGF1ZmdlYmF1dCBzZWluOgorICAgICAgICAgICAgaW50IFRNX1NFQyAgICAoMCk6ICBTZWt1bmRlIGluIGRlciBNaW51dGUgKDAuLjU5KQorICAgICAgICAgICAgaW50IFRNX01JTiAgICAoMSk6ICBNaW51dGUgaW4gZGVyIFN0dW5kZSAoMC4uNTkpCisgICAgICAgICAgICBpbnQgVE1fSE9VUiAgICgyKTogIFN0dW5kZSBkZXMgVGFnZXMgKDAuLjIzKQorICAgICAgICAgICAgaW50IFRNX01EQVkgICAoMyk6ICBUYWcgaW0gTW9uYXQgKDEuLjMxKQorICAgICAgICAgICAgaW50IFRNX01PTiAgICAoNCk6ICBNb25hdCBkZXMgSmFocmVzICgwLi4xMSkKKyAgICAgICAgICAgIGludCBUTV9ZRUFSICAgKDUpOiAgSmFociAoei5CLiAyMDAxKQorICAgICAgICAgICAgaW50IFRNX1dEQVkgICAoNik6ICBXb2NoZW50YWcgKDAuLjYsIFNvbm50YWcgPSAwKQorICAgICAgICAgICAgaW50IFRNX1lEQVkgICAoNyk6ICBUYWcgaW0gSmFociAoMC4uMzY1KQorICAgICAgICAgICAgaW56IFRNX0lTRFNUICAoOCk6ICBUUlVFOiBEYXlsaWdodCBTYXZpbmcgVGltZQorCisgICAgICBUTV9ZREFZIHVuZCBUTV9XREFZIHdlcmRlbiBpZ25vcmllcnQgdW5kIGtvZW5uZW4gYmVsaWViaWdlIFphaGxlbgorICAgICAgZW50aGFsdGVuLgorCitCRUlTUElFTAorICAgICAgTWFuIGhhdCBlaW4gRGF0dW0vVWhyemVpdCAoei5CLiBCZW51dHplcmVpbmdhYmUpLCB3ZWxjaGVzIGFscworICAgICAgVW5peC1aZWl0c3RtZXBlbCBnZXNwZWljaGVydCB3ZXJkZW4gc29sbDoKKyAgICAgIC8vICJNaXQsIDI0LiBPa3QgMjAwNywgMTA6NDg6MDAiIGVudHNwcmljaHQgZm9sZ2VuZGVtIFplaXRzdGVtcGVsOgorICAgICAgaW50IHVuaXh6ZWl0ID0gbWt0aW1lKCAoezAsIDQ4LCAwOSwgMjQsIDA5LCAyMDA3LCAwLCAwMSwgMH0pICk7CisgICAgICAKK0FFTkRFUlVOR0VOCisgICAgICAgIEVpbmdlZnVlaHJ0IGluIExETXVkIDMuMy43MXgKKworU0lFSEUgQVVDSAorICAgIGN0aW1lKEUpLCBnbXRpbWUoRSksIGxvY2FsX3RpbWUoRSksIHRpbWUoRSksIHV0aW1lKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9tb2RpZnlfY29tbWFuZCBiL2RvYy9lZnVuL21vZGlmeV9jb21tYW5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYTYwNzAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9tb2RpZnlfY29tbWFuZApAQCAtMCwwICsxLDIxIEBACitTWU5PUFNJUworCWludHxzdHJpbmcgbW9kaWZ5X2NvbW1hbmQoc3RyaW5nIGNtZCkKKworREVTQ1JJUFRJT04KKwlBZnRlciBzZXRfbW9kaWZ5X2NvbW1hbmQobW9iKSB3YXMgY2FsbGVkIGZvciBhbiBpbnRlcmFjdGl2ZQorCW9iamVjdCBpb2IsIGFsbCBjb21tYW5kcyBmb3IgdGhhdCB1c2VyIHdpbGwgYmUgcGFzc2VkIHRvCisJbW9iLT5tb2RpZnlfY29tbWFuZCgpLCBhbmQgdGhlIHJldHVybiB3aWxsIHRoZW4gYmUgY2hlY2tlZCBmb3IKKwlhY3Rpb25zLgorCisJSWYgdGhlIHJlc3VsdCBpcyBhIHN0cmluZywgaXQgaXMgdGhlIG5ldyBjb21tYW5kIHRvIGV4ZWN1dGUKKwlpbnN0ZWFkIG9mIHRoZSBnaXZlbiBvbmUuIE5vdGUgdGhhdCBpdCBpcyBub3QgcG9zc2libGUgdG8KKwltYWtlIHNldmVyYWwgY29tbWFuZHMgZnJvbSBvbmUgdGhpcyB3YXkhCisJSWYgdGhlIHJlc3VsdCBpcyBhIG5vbi16ZXJvIG51bWJlciwgdGhlIGdpdmVuIGNvbW1hbmQgaXMgdG8KKwliZSBpZ25vcmVkLiBJbiBjYXNlIG9mIHRoZSBjbG9zdXJlL2xmdW4gc2V0dGluZyB0aGlzIG1heQorCW1lYW4gdGhhdCB0aGUgY2xvc3VyZS9sZnVuIGFscmVhZHkgZXhlY3V0ZWQgaXQuCisJSWYgdGhlIHJlc3VsdCBpcyAwLCB0aGUgb3JpZ2luYWxseSBnaXZlbiBjb21tYW5kIGlzIHRvIGJlCisJdXNlZC4KKworCitTRUUgQUxTTworCXNldF9tb2RpZnlfY29tbWFuZChFKSwgaG9va3MoQykKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL21vdmVfb2JqZWN0IGIvZG9jL2VmdW4vbW92ZV9vYmplY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhiMjNlOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL21vdmVfb2JqZWN0CkBAIC0wLDAgKzEsMTggQEAKK1NZTk9QU0lTOgorICAgICAgICB2b2lkIG1vdmVfb2JqZWN0KG1peGVkIGl0ZW0sIG1peGVkIGRlc3QpCisKKyAgICAgICAgaXRlbS0+bW92ZShvYmplY3QgZGVzdCwgc3RyaW5nIG1ldGhvZHMpCisKK0RFU0NSSVBUSU9OOgorCVRoZSBpdGVtLCB3aGljaCBjYW4gYmUgYSBvYmplY3RfbmFtZSBvciBhbiBvYmplY3QsIGlzIG1vdmVkIGludG8KKwlpdCdzIG5ldyBlbnZpcm9ubWVudCBkZXN0LCB3aGljaCBjYW4gYWxzbyBiZSBvYmplY3RfbmFtZSBvciBhbgorCW9iamVjdC4gIEluIG5hdGl2ZSBtb2RlLCB0aGUgb25seSBvYmplY3QgdGhhdCBjYW4gYmUgbW92ZWQKKwl3aXRoIG1vdmVfb2JqZWN0KCkgaXMgdGhlIGNhbGxpbmcgb2JqZWN0IGl0c2VsZi4gVGhpcyBmdW5jdGlvbgorCWlzIG9ubHkgdXNlZCB0byBpbXBsZW1lbnQgdGhlIGxmdW4gbW92ZSgpLgorICAgICAgICAKKyAgICAgICAgVXNlIHRoZSBsZnVuIG1vdmUoKSBpbnN0ZWFkIGJ5IGluaGVyaXRpbmcgc3RhbmRhcmQgb2JqZWN0cy4KKwltb3ZlKCkgbXVzdCBiZSBjYWxsZWQgaW4gdGhlIG9iamVjdCB0byBiZSBtb3ZlZC4gVGhpcyBnaXZlcworCXRoZSBtb3ZlZCBvYmplY3QgZnVsbCBjb250cm9sIG92ZXIgaXRzIG1vdmVtZW50LgorCitTRUUgQUxTTzoKKyAgICAgICAgbW92ZShMKSwgcmVtb3ZlKEwpLCBpbml0KEwpLCB0cmFuc2ZlcihFKSwgbmF0aXZlKEMpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9uZWdhdGUgYi9kb2MvZWZ1bi9uZWdhdGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFmMGJkZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL25lZ2F0ZQpAQCAtMCwwICsxLDYgQEAKK1NZTk9QU0lTCisgICAgICAgIGludCBuZWdhdGUoaW50IGFyZyk7CisgICAgICAgIGZsb2F0IG5lZ2F0ZShmbG9hdCBhcmcpOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgTGllZmVydCBkZW4gbmVnYXRpdmVuIFdlcnQgdm9uIDxhcmc+LgpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vbmV0X2Nvbm5lY3QgYi9kb2MvZWZ1bi9uZXRfY29ubmVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2FhZTJmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vbmV0X2Nvbm5lY3QKQEAgLTAsMCArMSwzMCBAQAorU1lOT1BTSVMKKyAgICAgICAgaW50IG5ldF9jb25uZWN0KHN0cmluZyBob3N0LCBpbnQgcG9ydCkKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIE9lZmZuZSBlaW5lIG5pY2h0LWJsb2NraWVyZW5kZSBUQ1AgTmV0enZlcmJpbmR1bmcgenUKKyAgICAgICAgPGhvc3Q+Ojxwb3J0PiAuICBCZWkgRXJmb2xnIHdpcmQgZGllIFZlcmJpbmR1bmcgenVtCisgICAgICAgIGF1ZnJ1ZmVuZGVuIE9iamVrdCBnZWJ1bmRlbiB1bmQgZGllIGxmdW4gbG9nb24oKSB3aXJkIGluIGRlbQorICAgICAgICBPYmpla3QgYXVmZ2VydWZlbi4KKworICAgICAgICBSZXN1bHRhdCBpc3QgMCBiZWkgRXJmb2xnLCB1bmQgZWluZSBVbml4IEVSUk5PIGJlaSBNaXNzZXJmb2xnLgorCisgICAgICAgIElzdCBkZXIgRHJpdmVyIGZ1ZXIgSVB2NiBrb25maWd1cmllcnQsIHdpcmQgPGhvc3Q+IGVyc3QgYWxzCisgICAgICAgIElQdjYtTmFtZSBpbnRlcnByZXRpZXJ0LCB1bmQgd2VubiBkYXMgZmVobHNjaGxhZWd0LCBhbHMKKyAgICAgICAgSVB2NC1OYW1lLgorCisgICAgICAgIFdlbm4gZGllIFZlcmJpbmR1bmcgbmljaHQgc29mb3J0IGVyemV1Z3Qgd2VyZGVuIGthbm4sIGdpYnQgZGllCisgICAgICAgIEZ1bmt0aW9uICdFcmZvbGcnIHp1cnVlY2ssIHVuZCBkZXIgRHJpdmVyIHZvbGxlbmRldCBkaWUKKyAgICAgICAgRnVua3Rpb24gaW0gSGludGVyZ3J1bmQuIFNvbGx0ZSBkaWUgVmVyYmluZHVuZ3NhdWZiYXUgaW0KKyAgICAgICAgSGludGVyZ3J1bmQgZmVobHNjaGxhZ2VuLCB3aXJkIGxvZ29uKC0xKSBpbSBha3R1ZWxsZW4gT2JqZWt0CisgICAgICAgIGF1ZmdlcnVmZW4uCisKKyAgICAgICAgRGllIEZ1bmt0aW9uIGVyemV1Z3QgZWluZSBwcml2aWxlZ2UgdmlvbGF0aW9uICgibmV0X2Nvbm5lY3QiLAorICAgICAgICBob3N0LCBwb3J0KS4KKworICAgICAgICBXQVJOVU5HOiBJc3QgPGhvc3Q+IGVpbiBOYW1lIHVuZCBrZWluZSBJUCwgZnVlaHJ0IGRpZSBGdW5rdGlvbgorICAgICAgICBlaW5lbiBETlMtQXVmcnVmIGR1cmNoLCBkZXIgZGVuIERyaXZlciBmdWVyIGVpbmlnZSBaZWl0CisgICAgICAgIGJsb2NraWVyZW4ga2Fubi4KKworU0lFSEUgQVVDSAorICAgICAgICBsb2dvbihBKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vbmV4dF9iaXQgYi9kb2MvZWZ1bi9uZXh0X2JpdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWZiOTBhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vbmV4dF9iaXQKQEAgLTAsMCArMSwzMiBAQAorU1lOT1BTSVMKKyAgICAgICAgaW50IG5leHRfYml0KHN0cmluZyBzdHIsIGludCBzdGFydCk7CisgICAgICAgIGludCBuZXh0X2JpdChzdHJpbmcgc3RyLCBpbnQgc3RhcnQsIGludCBmaW5kX2NsZWFyZWQpOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgTGllZmVydCBkZW4gWmFobGVud2VydCBkZXMgbmFlY2hzdGVuIEJpdHMgaW0gQml0c3RyaW5nIDxiaXQ+IG5hY2gKKyAgICAgICAgZGVyIFBvc2l0aW9uIDxzdGFydD4uIEdld29laG5saWNoIGlzdCBkaWVzIGRhcyBuYWVjaHN0ZSBnZXNldHp0ZQorICAgICAgICBCaXQsIGFiZXIgd2VubiA8ZmluZF9jbGVhcmVkPiBhbmdlZ2ViZW4gdW5kIG5pY2h0IDAgaXN0LCB3aXJkCisgICAgICAgIGRpZSBQb3N0aW9uIGRlcyBuYWVjaHN0ZW4gZ2Vsb2VzY2h0ZW4gQml0cyB6dXJ1ZWNrIGdlZ2ViZW4uCisKKyAgICAgICAgRGFiZWkgaXN0IGRhcyBGaW5kZW4gdm9uIGdlbG9lc2NodGVuIEJpdHMgbmFjaCBkZW0gbGV0enRlbiBnZXNldHp0ZW4KKyAgICAgICAgQml0IGF1ZiBkaWUgdGF0c2FlY2hsaWNoZSBMYWVuZ2Ugdm9uIDxzdHI+IGJlc2NocmFlbmt0LgorCisgICAgICAgIEplZGVzIFplaWNoZW4gZW50aGFlbHQgNiBCaXRzLiBJbiBqZWRlbSBaZWljaGVuIGthbm4gZGVzaGFsYiBlaW5lCisgICAgICAgIFphaGwgdm9uIDAgYmlzIDYzIGdlc3BlaWNoZXJ0IHdlcmRlICgyXjY9NjQpLiBEYXMgZXJzdGUgWmVpY2hlbgorICAgICAgICBpc3QgZGVyIExlZXJzY2hsYWcgIiAiIG1pdCBkZW0gV2VydCAwLiBEYXMgZXJzdGUgWmVpY2hlbiBpbSBTdHJpbmcKKyAgICAgICAgaXN0IGplbmVzIG1pdCBkZW4gbmllZHJpZ3N0ZW4gQml0cyAoMC01KS4KKworQkVJU1BJRUwKKyAgICAgICAgc3RyaW5nIHM7CisgICAgICAgIGludCBwOworCisgICAgICAgIHMgPSBzZXRfYml0KCIiLCA0KTsgcyA9IHNldF9iaXQocywgMik7CisKKyAgICAgICAgZm9yIChwID0gLTE7IC0xICE9IChwID0gbmV4dF9iaXQocywgcCk7ICkKKyAgICAgICAgICAgIHdyaXRlKHArIlxuIik7CisKKyAgICAgICAgLS0+IGRhcyBnaWJ0IDIgdW5kIDQgYXVzLgorCitTSUVIRSBBVUNICisgICAgICAgIHNldF9iaXQoRSksIGNsZWFyX2JpdChFKSwgdGVzdF9iaXQoRSksIGxhc3RfYml0KEUpLCBjb3VudF9iaXRzKEUpLAorICAgICAgICBhbmRfYml0cyhFKSwgb3JfYml0cyhFKSwgeG9yX2JpdHMoRSksIGludmVydF9iaXRzKEUpLCBjb3B5X2JpdHMoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL25leHRfaW52ZW50b3J5IGIvZG9jL2VmdW4vbmV4dF9pbnZlbnRvcnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEzNzBhMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL25leHRfaW52ZW50b3J5CkBAIC0wLDAgKzEsMTcgQEAKK1NZTk9QU0lTCisgICAgICAgIG9iamVjdCBuZXh0X2ludmVudG9yeSgpOworICAgICAgICBvYmplY3QgbmV4dF9pbnZlbnRvcnkob2JqZWN0IG9iKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIExpZWZlcnQgZGFzIG5hZWNoc3RlIE9iamVrdCBhdXMgZGVtIEludmVudGFyIHZvbiA8b2I+LiBXaXJkIDxvYj4KKyAgICAgICAgbmljaHQgYW5nZWdlYmVuLCB3aXJkIHRoaXNfb2JqZWN0KCkgdmVyd2VuZGV0LgorCisgICAgICAgIERpZXNlIEVmdW4gd2lyZCBtZWlzdGVucyB6dXNhbW1lbiBtaXQgZmlyc3RfaW52ZW50b3J5KCkgdmVyd2VuZGV0CisgICAgICAgIHVtIHVlYmVyIFJhdW0tIHVuZCBDb250YWluZXJpbmhhbHRlIHp1IGl0ZXJpZXJlbi4KKyAgICAgICAgRnVlciBlaW4gQmVpc3BpZWwgc2llaGUgZG9ydC4KKworU0lFSEUgQVVDSAorICAgICAgICBmaXJzdF9pbnZlbnRvcnkoRSksIGFsbF9pbnZlbnRvcnkoRSksIGVudmlyb25tZW50KEUpLAorICAgICAgICBkZWVwX2ludmVudG9yeShFKQorCis3LkF1ZyAyMDA3IEdsb2luc29uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vb2JqZWN0X2luZm8gYi9kb2MvZWZ1bi9vYmplY3RfaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTc3M2ZjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vb2JqZWN0X2luZm8KQEAgLTAsMCArMSwyMDIgQEAKK1NZTk9QU0lTCisgICAgICAgICNpbmNsdWRlIDxvYmplY3RfaW5mby5oPgorCisgICAgICAgIG1peGVkIG9iamVjdF9pbmZvKG9iamVjdCBvYiwgaW50IHdoYXQpCisKK0RFU0NSSVBUSU9OCisgICAgICAgIFJldHVybnMgc29tZSBpbnRlcm5hbCBpbmZvcm1hdGlvbiBhYm91dCBvYmplY3QgPG9iPi4gVGhlCisgICAgICAgIEFyZ3VtZW50IDx3aGF0PiBkZXRlcm1pbmVzIHdoaWNoIGluZm9ybWF0aW9uIGlzIHJldHVybmVkLgorCisgICAgICAgIEl0IGNhbiBiZSBlaXRoZXIgYSBjb25maWd1cmF0aW9uIG9wdGlvbiBhcyBnaXZlbiB0bworICAgICAgICBjb25maWd1cmVfb2JqZWN0KCkgb3Igb25lIG9mIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKKworCisKKyAgICAgICAgT2JqZWN0IEZsYWdzOgorCisgICAgICAgIDx3aGF0PiA9PSBPSV9PTkNFX0lOVEVSQUNUSVZFOgorICAgICAgICAgICAxIGlmIDxvYj4gd2FzIG9uY2UgKG9yIHN0aWxsIGlzKSBpbnRlcmFjdGl2ZSwgMCBlbHNlLgorCisgICAgICAgIDx3aGF0PiA9PSBPSV9SRVNFVF9TVEFURToKKyAgICAgICAgICAgMSBpZiA8b2I+IGlzIChzdGlsbCkgcmVzZXQsIDAgZWxzZS4KKworICAgICAgICA8d2hhdD4gPT0gT0lfV0lMTF9DTEVBTl9VUDoKKyAgICAgICAgICAgMSBpZiA8b2I+J3MgY2xlYW5fdXAoKSB3aWxsIGJlIGNhbGxlZCwgMCBlbHNlLgorCisgICAgICAgIDx3aGF0PiA9PSBPSV9MQU1CREFfUkVGRVJFTkNFRDoKKyAgICAgICAgICAgMSBpZiA8b2I+IGhhcyBsYW1iZGFzIChhbmQgdGhlcmUgcmVwbGFjZV9wcm9ncmFtKCkKKyAgICAgICAgICAgaXMgbm90IGFsbG93ZWQgYW55bW9yZSksIDAgZWxzZS4KKworICAgICAgICA8d2hhdD4gPT0gT0lfUkVQTEFDRUQ6CisgICAgICAgICAgIDEgaWYgdGhlIHByb2dyYW0gZm9yIDxvYj4gd2FzIHJlcGxhY2VkLCAwIGVsc2UuCisKKworCisgICAgICAgIFByb2dyYW0gRmxhZ3M6CisKKyAgICAgICAgPHdoYXQ+ID09IE9JX05PX0lOSEVSSVQ6CisgICAgICAgICAgIDEgaWYgdGhlIHByb2dyYW0gY2FuJ3QgYmUgaW5oZXJpdGVkLgorCisgICAgICAgIDx3aGF0PiA9PSBPSV9OT19DTE9ORToKKyAgICAgICAgICAgMSBpZiB0aGUgcHJvZ3JhbS9ibHVlcHJpbnQgY2FuJ3QgYmUgY2xvbmVkLgorCisgICAgICAgIDx3aGF0PiA9PSBPSV9OT19TSEFET1c6CisgICAgICAgICAgIDEgaWYgdGhlIHByb2dyYW0ncyBmdW5jdGlvbnMgY2FuJ3QgYmUgc2hhZG93ZWQuCisKKyAgICAgICAgPHdoYXQ+ID09IE9JX1NIQVJFX1ZBUklBQkxFUzoKKyAgICAgICAgICAgMSBpZiBjbG9uZXMgb2YgdGhpcyBwcm9ncmFtIHNoYXJlIHRoZWlyIGluaXRpYWwKKyAgICAgICAgICAgdmFyaWFibGUgdmFsdWVzIHdpdGggdGhlIGJsdWVwcmludC4KKworCisKKyAgICAgICAgU3dhcHBpbmcgSW5mb3JtYXRpb246CisKKyAgICAgICAgPHdoYXQ+ID09IE9JX1NXQVBQRUQ6CisgICAgICAgICAgIDEgaWYgPG9iPiBpcyBzd2FwcGVkLCAwIGVsc2UuCisKKyAgICAgICAgPHdoYXQ+ID09IE9JX1BST0dfU1dBUFBFRDoKKyAgICAgICAgICAgMSBpZiA8b2I+J3MgcHJvZ3JhbSBpcyBzd2FwcGVkLCAwIGVsc2UuCisKKyAgICAgICAgPHdoYXQ+ID09IE9JX1ZBUl9TV0FQUEVEOgorICAgICAgICAgICAxIGlmIDxvYj4ncyB2YXJpYWJsZXMgYXJlIHN3YXBwZWQsIDAgZWxzZS4KKworICAgICAgICA8d2hhdD4gPT0gT0lfU1dBUF9OVU06CisgICAgICAgICAgIFRoZSBzd2FwIG51bWJlciBmb3IgPG9iPnMgcHJvZ3JhbSwgb3IgLTEgaWYgbm90IHN3YXBwZWQuCisKKworCisgICAgICAgIFRpbWUgSW5mb3JtYXRpb246CisKKyAgICAgICAgPHdoYXQ+ID09IE9JX05FWFRfUkVTRVRfVElNRToKKyAgICAgICAgICAgIFRpbWUgb2YgdGhlIG5leHQgcmVzZXQuCisKKyAgICAgICAgPHdoYXQ+ID09IE9JX05FWFRfQ0xFQU5VUF9USU1FOgorICAgICAgICAgICAgVGltZSBvZiB0aGUgbmV4dCBkYXRhIGNsZWFudXAuCisKKyAgICAgICAgPHdoYXQ+ID09IE9JX0xBU1RfUkVGX1RJTUU6CisgICAgICAgICAgICBUaW1lIG9mIHRoZSBsYXN0IGNhbGwgdG8gPG9iPi4KKworCisKKyAgICAgICAgT2JqZWN0IExpc3Q6CisKKyAgICAgICAgPHdoYXQ+ID09IE9JX09CSkVDVF9ORVhUOgorICAgICAgICAgICBUaGUgbmV4dCBvYmplY3QgaW4gdGhlIGdsb2JhbCBvYmplY3QgbGlzdC4KKworICAgICAgICA8d2hhdD4gPT0gT0lfT0JKRUNUX1BSRVY6CisgICAgICAgICAgIFRoZSBwcmV2aW91cyBvYmplY3QgaW4gdGhlIGdsb2JhbCBvYmplY3QgbGlzdC4KKworICAgICAgICA8d2hhdD4gPT0gT0lfT0JKRUNUX1BPUzoKKyAgICAgICAgICAgVGhlIHBvc2l0aW9uIG9mIDxvYj4gaW4gdGhlIGdsb2JhbCBvYmplY3QgbGlzdCwKKyAgICAgICAgICAgY291bnRpbmcgZnJvbSAwIHVwLiBUaGlzIGNhbiBiZSBleHBlbnNpdmUgdG8gY29tcHV0ZS4KKworCisKKyAgICAgICAgU2hhZG93czoKKworICAgICAgICA8d2hhdD4gPT0gT0lfU0hBRE9XX05FWFQ6CisgICAgICAgICAgIFRoZSBuZXh0IG9iamVjdCBpbiB0aGUgc2hhZG93IGxpc3QsIGkuZS4gdGhlIG9iamVjdAorICAgICAgICAgICB0aGF0IGlzIHNoYWRvd2luZyA8b2I+LCBvciAwIGlmIDxvYj4gaXMgbm90IHNoYWRvd2VkLgorCisgICAgICAgIDx3aGF0PiA9PSBPSV9TSEFET1dfUFJFVjoKKyAgICAgICAgICAgVGhlIHByZXZpb3VzIG9iamVjdCBpbiB0aGUgc2hhZG93IGxpc3QsIGkuZS4gdGhlIG9iamVjdAorICAgICAgICAgICB0aGF0IDxvYj4gaXMgY3VycmVudGx5IHNoYWRvd2luZywgb3IgMCBpZiA8b2I+IGlzIG5vdCBhIHNoYWRvdy4KKworICAgICAgICA8d2hhdD4gPT0gT0lfU0hBRE9XX0FMTDoKKyAgICAgICAgICAgUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgb2JqZWN0cyB0aGF0IGFyZSBjdXJyZW50bHkKKyAgICAgICAgICAgc2hhZG93aW5nIDxvYj4sIG9yIGFuIGVtcHR5IGFycmF5IGlmIDxvYj4gaXMgbm90IHNoYWRvd2VkLgorCisKKworICAgICAgICBPYmplY3QgU3RhdGlzdGljczoKKworICAgICAgICA8d2hhdD4gPT0gT0lfT0JKRUNUX1JFRlM6CisgICAgICAgICAgIFRoZSBudW1iZXIgb2YgcmVmZXJlbmNlcyB0byA8b2I+LgorCisgICAgICAgIDx3aGF0PiA9PSBPSV9USUNLUzoKKyAgICAgICAgICAgVGhlIGFjY3VtdWxhdGVkIGV2YWx1YXRpb24gY29zdCBzcGVuZCBpbiA8b2I+IG1vZHVsbyAxMDAwMDAwMDAwLgorCisgICAgICAgIDx3aGF0PiA9PSBPSV9HSUdBVElDS1M6CisgICAgICAgICAgIFRoZSBhY2N1bXVsYXRlZCBldmFsdWF0aW9uIGNvc3Qgc3BlbmQgaW4gPG9iPiBkaXZpZGVkIGJ5IDEwMDAwMDAwMDAuCisKKyAgICAgICAgPHdoYXQ+ID09IE9JX0RBVEFfU0laRToKKyAgICAgICAgICAgVGhlIHRvdGFsIHNpemUgb2YgdGhlIHZhbHVlcyBoZWxkIGluIHRoZSBvYmplY3QncyB2YXJpYWJsZXMsCisgICAgICAgICAgIHNjYWxlZCBkb3duIGFjY29yZGluZyB0byB0aGUgZXh0ZW5kIG9mIGRhdGEgc2hhcmluZy4KKworICAgICAgICA8d2hhdD4gPT0gT0lfREFUQV9TSVpFX1RPVEFMOgorICAgICAgICAgICBUaGUgdW5tb2RpZmllZCB0b3RhbCBzaXplIG9mIHRoZSB2YWx1ZXMgaGVsZCBpbiB0aGUKKyAgICAgICAgICAgb2JqZWN0J3MgdmFyaWFibGVzCisKKworCisgICAgICAgIFByb2dyYW0gU3RhdGlzdGljczoKKworICAgICAgICA8d2hhdD4gPT0gT0lfUFJPR19SRUZTOgorICAgICAgICAgICBUaGUgbnVtYmVyIG9mIHJlZmVyZW5jZXMgdG8gPG9iPidzIHByb2dyYW0uCisKKyAgICAgICAgPHdoYXQ+ID09IE9JX05VTV9GVU5DVElPTlM6CisgICAgICAgICAgIFRoZSBudW1iZXIgb2YgZnVuY3Rpb25zIGluIHRoZSBwcm9ncmFtLgorCisgICAgICAgIDx3aGF0PiA9PSBPSV9OVU1fVkFSSUFCTEVTOgorICAgICAgICAgICBUaGUgbnVtYmVyIG9mIHZhcmlhYmxlcyBpbiB0aGUgcHJvZ3JhbS4KKworICAgICAgICA8d2hhdD4gPT0gT0lfTlVNX1NUUklOR1M6CisgICAgICAgICAgIFRoZSBudW1iZXIgb2Ygc3RyaW5ncyBpbiB0aGUgcHJvZ3JhbS4KKworICAgICAgICA8d2hhdD4gPT0gT0lfTlVNX0lOSEVSSVRFRDoKKyAgICAgICAgICAgVGhlIG51bWJlciBvZiBleHBsaWNpdGVseSBpbmhlcml0ZWQgcHJvZ3JhbXMuCisKKyAgICAgICAgPHdoYXQ+ID09IE9JX05VTV9JTkNMVURFRDoKKyAgICAgICAgICAgVGhlIG51bWJlciBvZiBpbmNsdWRlZCBmaWxlcyBpbiB0aGUgcHJvZ3JhbS4KKworICAgICAgICA8d2hhdD4gPT0gT0lfU0laRV9GVU5DVElPTlM6CisgICAgICAgICAgIFRoZSBzaXplIG5lZWRlZCBmb3IgdGhlIGZ1bmN0aW9uIHN0cnVjdHVyZXMuCisgICAgICAgICAgIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGluY2x1ZGUgc2l6ZSBvZiB0aGUgZnVuY3Rpb24gY29kZS4KKworICAgICAgICA8d2hhdD4gPT0gT0lfU0laRV9WQVJJQUJMRVM6CisgICAgICAgICAgIFRoZSBzaXplIG5lZWRlZCBmb3IgdGhlIHZhcmlhYmxlIHN0cnVjdHVyZXMuCisgICAgICAgICAgIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGluY2x1ZGUgc2l6ZSBvZiB0aGUgdmFyaWFibGUgZGF0YSwKKyAgICAgICAgICAgU2VlIE9JX0RBVEFfU0laRS9PSV9EQVRBX1NJWkVfVE9UQUwgZm9yIHRoYXQuCisKKyAgICAgICAgPHdoYXQ+ID09IE9JX1NJWkVfU1RSSU5HUzoKKyAgICAgICAgICAgVGhlIHNpemUgbmVlZGVkIGZvciB0aGUgc3RyaW5nIHBvaW50ZXJzLgorCisgICAgICAgIDx3aGF0PiA9PSBPSV9TSVpFX1NUUklOR1NfREFUQToKKyAgICAgICAgICAgVGhlIHNpemUgbmVlZGVkIGZvciB0aGUgc3RyaW5nIHZhbHVlcywKKyAgICAgICAgICAgc2NhbGVkIGRvd24gYWNjb3JkaW5nIHRvIHRoZSBleHRlbmQgb2YgZGF0YSBzaGFyaW5nLgorCisgICAgICAgIDx3aGF0PiA9PSBPSV9TSVpFX1NUUklOR1NfREFUQV9UT1RBTDoKKyAgICAgICAgICAgVGhlIHVubW9kaWZpZWQgc2l6ZSBuZWVkZWQgZm9yIHRoZSBzdHJpbmcgdmFsdWVzLgorCisgICAgICAgIDx3aGF0PiA9PSBPSV9TSVpFX0lOSEVSSVRFRDoKKyAgICAgICAgICAgVGhlIHNpemUgbmVlZGVkIGZvciB0aGUgaW5oZXJpdCBzdHJ1Y3R1cmVzLgorCisgICAgICAgIDx3aGF0PiA9PSBPSV9TSVpFX0lOQ0xVREVEOgorICAgICAgICAgICBUaGUgc2l6ZSBuZWVkZWQgZm9yIHRoZSBpbmNsdWRlIHN0cnVjdHVyZXMuCisKKyAgICAgICAgPHdoYXQ+ID09IE9JX1BST0dfU0laRToKKyAgICAgICAgICAgVGhlIHNpemUgb2YgdGhlIHByb2dyYW0gc3RydWN0dXJlLgorCisgICAgICAgIDx3aGF0PiA9PSBPSV9QUk9HX1NJWkVfVE9UQUw6CisgICAgICAgICAgIFRoZSB0b3RhbCBzaXplIG9mIHRoZSBwcm9ncmFtLgorCisKK0hJU1RPUlkKKyAgICAgICAgSW50cm9kdWNlZCBpbiBMRE11ZCAzLjIuNi4KKyAgICAgICAgQ2hhbmdlcyBpbiBMRE11ZCAzLjIuNzoKKyAgICAgICAgICAtIG5ldyBiYXNpYyByZXN1bHQgT0lCX1JFUExBQ0VELgorICAgICAgICAgIC0gYmFzaWMgcmVzdWx0IE9JQl9JU19XSVpBUkQgaXMgYWx3YXlzIDAgaWYgc2V0X2lzX3dpemFyZCgpCisgICAgICAgICAgICAgIGlzIG5vdCBhdmFpbGFibGUuCisgICAgICAgICAgLSBiYXNpYyByZXN1bHQgT0lCX0FQUFJPVkVEIGlzIGdvbmUuCisgICAgICAgIExETXVkIDMuMi44IGFkZGVkIE9JTV9EQVRBX1NJWkUgdG8gdGhlIHJlc3VsdCBvZiBPSU5GT19NRU1PUlkuCisgICAgICAgIExETXVkIDMuMi45IGFkZGVkIHRoZSBpbmRleCBtZWNoYW5pc20sIE9JTV9OVU1fSU5DTFVERVMsCisgICAgICAgICAgT0lNX05PX0lOSEVSSVQsIE9JTV9OT19TSEFET1csIE9JTV9OT19DTE9ORSwgT0lNX1NJWkVfU1RSSU5HU19EQVRBLAorICAgICAgICAgIE9JTV9TSVpFX1NUUklOR1NfVE9UQUwsIGFuZCBPSU1fREFUQV9TSVpFX1RPVEFMIHRvIHRoZSByZXN1bHQKKyAgICAgICAgICBvZiBPSU5GT19NRU1PUlkuCisgICAgICAgIExETXVkIDMuMy4zNzggYWRkZWQgdGhlIE9JTV9TSEFSRV9WQVJJQUJMRVMgdG8gdGhlIHJlc3VsdAorICAgICAgICAgIG9mIE9JTkZPX01FTU9SWS4KKyAgICAgICAgTERNdWQgMy4zLjY1NCBhZGRlZCB0aGUgT0lCX05FWFRfQ0xFQU5VUCB0byB0aGUgcmVzdWx0IG9mIE9JTkZPX0JBU0lDLgorICAgICAgICBMRE11ZCAzLjUuMCByZWRlc2lnbmVkIHRoZSB3aG9sZSBlZnVuLgorCitTRUUgQUxTTworICAgICAgICBjb25maWd1cmVfb2JqZWN0KEUpLCBpbnRlcmFjdGl2ZV9pbmZvKEUpLCBkcml2ZXJfaW5mbyhFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vb2JqZWN0X25hbWUgYi9kb2MvZWZ1bi9vYmplY3RfbmFtZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmE4MmVkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vb2JqZWN0X25hbWUKQEAgLTAsMCArMSwyNiBAQAorU1lOT1BTSVM6CisgICAgc3RyaW5nIG9iamVjdF9uYW1lKCkKKyAgICBzdHJpbmcgb2JqZWN0X25hbWUob2JqZWN0IG9iKQorCitERVNDUklQVElPTjoKKyAgICBHZXQgdGhlIGZpbGUgbmFtZSBvZiBhbiBvYmplY3Qgb3IgaWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4gb2YgdGhlIGN1cnJlbnQKKyAgICBvYmplY3QuIElmIHRoZSBvYmplY3QgaXMgYSBjbG9uZWQgb2JqZWN0LCB0aGVuIGl0IHdpbGwgbm90IGhhdmUgYQorICAgIGNvcnJlc3BvbmRpbmcgZmlsZSBuYW1lLCBidXQgcmF0aGVyIGEgbmV3IG5hbWUgYmFzZWQgb24gdGhlIG9yaWdpbmFsCisgICAgZmlsZSBuYW1lLgorICAgICAgICAKKyAgICBUaGUgcmV0dXJuZWQgbmFtZSBhbHdheXMgYmVnaW5zIHdpdGggJy8nIChhYnNvbHV0ZSBwYXRoKSwKKyAgCWV4Y2VwdCB3aGVuIHRoZSBwYXJzZXIgcnVucyBpbiBDT01QQVQgKC1vKSBtb2RlLgorCitFWEFNUExFUzoKKyAgICBmaW5kX29iamVjdChvYmplY3RfbmFtZShvYikpID09IG9iICAgIAorICAgIFRoaXMgaXMgZ3VhcmFudGVlZCB0byBiZSB0cnVlIGZvciBhbGwgb2JqZWN0cyBvYiB0aGF0IGFyZSBub3QKKyAgIAlkZXN0cnVjdGVkLgorICAgICAgICAKKyAgICBzaXplb2YoZXhwbG9kZShvYmplY3RfbmFtZShvYiksICIjIikpID09IDEgIAorICAgIFRoaXMgaXMgYWx3YXlzIHRydWUgaWYgb2IgaXMgYSBibHVlIHByaW50LgorICAgICAgICAKK1NFRSBBTFNPOgorICAgICAgICBmaW5kX29iamVjdChFKQorCisyOS4xMC4yMDA2IFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vb2JqZWN0X3RpbWUgYi9kb2MvZWZ1bi9vYmplY3RfdGltZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjRkOTFjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vb2JqZWN0X3RpbWUKQEAgLTAsMCArMSwxMCBAQAorU1lOT1BTSVMKKyAgICAgICAgaW50IG9iamVjdF90aW1lKCk7CisgICAgICAgIGludCBvYmplY3RfdGltZShvYmplY3Qgb2IpOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgTGllZmVydCBkaWUgWmVpdCwgenUgZGVyIGRhcyBPYmpla3QgPG9iPiBlcnN0ZWxsdCB3dXJkZS4gV2lyZCA8b2JqPgorICAgICAgICBuaWNodCBhbmdlZ2ViZW4sIHdpcmQgc3RhbmRhcmRtYWVzc2lnIHRoaXNfb2JqZWN0KCkgdmVyd2VuZGV0LgorCitTSUVIRSBBVUNICisgICAgICAgIHByb2dyYW1fdGltZShFKSwgcHJvZ3JhbV9uYW1lKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9vYmplY3RwIGIvZG9jL2VmdW4vb2JqZWN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjA3NThjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vb2JqZWN0cApAQCAtMCwwICsxLDkgQEAKK1NZTk9QU0lTCisgICAgICAgIGludCBvYmplY3RwKG1peGVkIGFyZyk7CisKK0JFU0NIUkVJQlVORworICAgICAgICBMaWVmZXJ0IDEsIHdlbm4gPGFyZz4gZWluIE9iamVrdCBpc3QuCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgY2xvbmVwKEUpLCBpbnRwKEUpLCBzdHJpbmdwKEUpLCBwb2ludGVycChFKSwgc3ltYm9scChFKSwKKyAgICAgICAgcmVmZXJlbmNlcChFKSwgc3ltYm9scChFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vb3JfYml0cyBiL2RvYy9lZnVuL29yX2JpdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU0MDZlNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL29yX2JpdHMKQEAgLTAsMCArMSwyNyBAQAorU1lOT1BTSVMKKyAgICAgICAgc3RyaW5nIG9yX2JpdHMoc3RyaW5nIHN0cjEsIHN0cmluZyBzdHIyKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIDxzdHIxPiB1bmQgPHN0cjI+IHNpbmQgYmVpZGVzIEJpdHN0cmluZ3MuIERhcyBSZXN1bHRhdCB2b24gb3JfYml0cygpCisgICAgICAgIGlzdCBlaW4gQml0c3RyaW5nLCBkZXIgZGFzIGJpbmFlcmUgT2RlciB2b24gPHN0cjE+IHVuZCA8c3RyMj4KKyAgICAgICAgZW50aGFlbHQsIGQuaC4gZWluIFN0cmluZywgaW4gZGVtIGVpbiBCaXQgZ2VzZXR6dCBpc3QsIHdlbm4gZXMKKyAgICAgICAgaW4gPHN0cjE+IG9kZXIgPHN0cjI+IG9kZXIgaW4gYmVpZGVuIGdlc2V0enQgaXN0LgorCisgICAgICAgIEplZGVzIFplaWNoZW4gZW50aGFlbHQgNiBCaXRzLiBJbiBqZWRlbSBaZWljaGVuIGthbm4gZGVzaGFsYiBlaW5lCisgICAgICAgIFphaGwgdm9uIDAgYmlzIDYzIGdlc3BlaWNoZXJ0IHdlcmRlICgyXjY9NjQpLiBEYXMgZXJzdGUgWmVpY2hlbgorICAgICAgICBpc3QgZGVyIExlZXJzY2hsYWcgIiAiIG1pdCBkZW0gV2VydCAwLiBEYXMgZXJzdGUgWmVpY2hlbiBpbSBTdHJpbmcKKyAgICAgICAgaXN0IGplbmVzIG1pdCBkZW4gbmllZHJpZ3N0ZW4gQml0cyAoMC01KS4KKworQkVJU1BJRUwKKyAgICAgICAgc3RyaW5nIHMxLCBzMiwgczM7CisKKyAgICAgICAgczEgPSBzZXRfYml0KCIiLCAzKTsgczEgPSBzZXRfYml0KHMxLCAxNSk7ICAtPiBzMSBpcyAiKCAoIgorICAgICAgICBzMiA9IHNldF9iaXQoIiIsIDMpOyBzMiA9IHNldF9iaXQoczIsIDQpOyAgIC0+IHMyIGlzICI4IgorCisgICAgICAgIHMzID0gb3JfYml0cyhzMSwgczIpOworCisgICAgICAgIC0+IHMzIGlzIG5vdyAiOCAoIiwgaWUuIGEgYml0c3RyaW5nIHdpdGggYml0cyAzLCA0IGFuZCAxNSBzZXQuCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgY2xlYXJfYml0KEUpLCBzZXRfYml0KEUpLCB0ZXN0X2JpdChFKSwgbmV4dF9iaXQoRSksIGxhc3RfYml0KEUpLAorICAgICAgICBjb3VudF9iaXRzKEUpLCBhbmRfYml0cyhFKSwgeG9yX2JpdHMoRSksIGludmVydF9iaXRzKEUpLCBjb3B5X2JpdHMoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL3BhcnNlX2NvbW1hbmQgYi9kb2MvZWZ1bi9wYXJzZV9jb21tYW5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYjc3MzEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9wYXJzZV9jb21tYW5kCkBAIC0wLDAgKzEsMTMyIEBACitPUFRJT05BTAorU1lOT1BTSVMKKyAgICAgICAgaW50IHBhcnNlX2NvbW1hbmQgKHN0cmluZyBjbWQsIG9iamVjdCAgZW52LCBzdHJpbmcgZm10LCBtaXhlZCAmdmFyLCAuLi4pCisgICAgICAgIGludCBwYXJzZV9jb21tYW5kIChzdHJpbmcgY21kLCBvYmplY3QqIGFyciwgc3RyaW5nIGZtdCwgbWl4ZWQgJnZhciwgLi4uKQorCitERVNDUklQVElPTgorICAgICAgICBwYXJzZV9jb21tYW5kKCkgaXMgYmFzaWNhbGx5IGEgc3BpZmZlZCB1cCBzc2NhbmYgb3BlcmF0aW5nCisgICAgICAgIG9uIHdvcmQgYmFzaXMgYW5kIHRhcmdldGVkIGF0IHJlY29nbml6aW5nIG9iamVjdCBkZXNjcmlwdGlvbnMgZnJvbQorICAgICAgICBjb21tYW5kIHN0cmluZ3MuCisKKyAgICAgICAgVGhlIGVmdW4gdGFrZXMgdGhlIGNvbW1hbmQgc3RyaW5nIDxjbWQ+IGFuZCB0aGUgb2JqZWN0KHMpIDxlbnY+LzxhcnI+CisgICAgICAgIGFuZCB0cmllcyB0byBtYXRjaCBpdCBhZ2FpbnN0IHRoZSBmb3JtYXQgc3RyaW5nIDxmbXQ+LiBTdWNjZXNzZnVsbHkKKyAgICAgICAgbWF0Y2hlZCBlbGVtZW50cyBhcmUgYXNzaWduZWQgdG8gdGhlIHZhcmlhYmxlcyA8dmFyPi4uLi4gVGhlIHJlc3VsdAorICAgICAgICBmcm9tIHRoZSBlZnVuIGlzIDEgaWYgdGhlIGNvbW1hbmQgY291bGQgYmUgZnVsbHkgbWF0Y2hlZCwgYW5kIDAKKyAgICAgICAgb3RoZXJ3aXNlLgorCisgICAgICAgIElmIHRoZSBvYmplY3RzIGFyZSBnaXZlbiBhcyBhIHNpbmdsZSBvYmplY3QgPGVudj4sIHRoZSBlZnVuIG1hdGNoZXMKKyAgICAgICAgYWdhaW5zdCB0aGUgZ2l2ZW4gb2JqZWN0IGFuZCBhbGwgb2JqZWN0cyBjb250YWluZWQgdGhlcmVpbi4gT3RoZXJ3aXNlLAorICAgICAgICBpZiB0aGUgb2JqZWN0cyBhcmUgZ2l2ZW4gYXMgYW4gYXJyYXkgPGFycj4gb2Ygb2JqZWN0cywgdGhlIGVmdW4KKyAgICAgICAgbWF0Y2hlcyBvbmx5IGFnYWluc3QgdGhlIGdpdmVuIG9iamVjdHMuCisKKyAgICAgICAgVGhlIGZvcm1hdCBzdHJpbmcgPGZtdD4gY29uc2lzdHMgb2Ygd29yZHMsIHN5bnRhY3RpYyBtYXJrZXJzLCBhbmQKKyAgICAgICAgJS1kaXJlY3RpdmVzIGZvciB0aGUgdmFsdWVzIHRvIHBhcnNlIGFuZCByZXR1cm4gaW4gdGhlIHZhcmlhYmxlcy4KKyAgICAgICAgQSB0eXBpY2FsIGV4YW1wbGUgaXMgIiAnZ2V0JyAvICd0YWtlJyAlaSAiIG9yCisgICAgICAgICIgJ3NwcmF5JyAvICdwYWludCcgW3BhaW50XSAlaSAiLiBUaGUgZWxlbWVudHMgaW4gZGV0YWlsIGFyZToKKworICAgICAgICAgICAnd29yZCc6IG9ibGlnYXRvcnkgdGV4dAorICAgICAgICAgICBbd29yZF06IG9wdGlvbmFsIHRleHQKKyAgICAgICAgICAgLyAgICAgOiBBbHRlcm5hdGl2ZSBtYXJrZXIKKyAgICAgICAgICAgJW8gICAgOiBTaW5nbGUgaXRlbSwgb2JqZWN0CisgICAgICAgICAgICVzICAgIDogQW55IHRleHQKKyAgICAgICAgICAgJXcgICAgOiBBbnkgd29yZAorICAgICAgICAgICAlcCAgICA6IE9uZSBvZiBhIGxpc3Qgb2YgcHJlcG9zaXRpb25zLgorICAgICAgICAgICAgICAgICAgIElmIHRoZSB2YXJpYWJsZSBhc3NvY2lhdGVkIHdpdGggJXAgaXMgdXNlZCB0byBwYXNzCisgICAgICAgICAgICAgICAgICAgYSBsaXN0IG9mIHdvcmRzIHRvIHRoZSBlZnVuLCB0aGUgbWF0Y2hpbmcgd2lsbCB0YWtlCisgICAgICAgICAgICAgICAgICAgb25seSBhZ2FpbnN0IHRoaXMgbGlzdC4KKyAgICAgICAgICAgJWwgICAgOiBub24tY29tcGF0OiBMaXZpbmcgb2JqZWN0cworICAgICAgICAgICAgICAgICAgIGNvbXBhdDogYSBzaW5nbGUgbGl2aW5nIG9iamVjdAorICAgICAgICAgICAlaSAgICA6IEFueSBvYmplY3RzCisgICAgICAgICAgICVkICAgIDogTnVtYmVyID49IDAsIG9yIHdoZW4gZ2l2ZW4gdGV4dHVhbDogMC05OS4KKworICAgICAgICBBIDx3b3JkPiBpbiB0aGlzIGNvbnRleHQgaXMgYW55IHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgbm90IGNvbnRhaW5pbmcKKyAgICAgICAgYSBzcGFjZS4gJ2xpdmluZyBvYmplY3RzJyBhcmUgc2VhcmNoZWQgYnkgY2FsbHMgdG8gdGhlIChzaW11bCllZnVucworICAgICAgICBmaW5kX3BsYXllcigpIGFuZCBmaW5kX2xpdmluZygpOiBib3RoIGZ1bmN0aW9ucyBoYXZlIHRvIGFjY2VwdCBhIG5hbWUKKyAgICAgICAgYXMgYXJndW1lbnQgYW5kIHJldHVybiB0aGUgb2JqZWN0IGZvciB0aGlzIG5hbWUsIG9yIDAgaWYgdGhlcmUKKyAgICAgICAgaXMgbm9uZS4KKworICAgICAgICBUaGUgcmVzdWx0cyBhc3NpZ25lZCB0byB0aGUgdmFyaWFibGVzIGJ5IHRoZSAlLWRpcmVjdGl2ZXMgYXJlOgorCisgICAgICAgICAgICVvIDogcmV0dXJucyBhbiBvYmplY3QKKyAgICAgICAgICAgJXMgOiByZXR1cm5zIGEgc3RyaW5nIG9mIHdvcmRzCisgICAgICAgICAgICV3IDogcmV0dXJucyBhIHN0cmluZyBvZiBvbmUgd29yZAorICAgICAgICAgICAlcCA6IGlmIHBhc3NlZCBlbXB0eTogYSBzdHJpbmcKKyAgICAgICAgICAgICAgICBpZiBwYXNzZWQgYXMgYXJyYXkgb2Ygd29yZHM6IHZhclswXSBpcyB0aGUgbWF0Y2hlZCB3b3JkCisgICAgICAgICAgICVpIDogcmV0dXJucyBhbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgY29udGVudDoKKyAgICAgICAgICAgICAgICAgIFswXTogaW50OiB0aGUgY291bnQvbnVtYmVyIHJlY29nbml6ZWQgaW4gdGhlIG9iamVjdCBzcGVjCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPiAwOiBhIGNvdW50IChlLmcuICd0aHJlZScsICc0JykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IDA6IGFuIG9yZGluYWwgKGUuZy4gJ3NlY29uZCcsICd0aGlyZCcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwOiAnYWxsJyBvciBhIGdlbmVyaWMgcGx1cmFsIHN1Y2ggYXMgJ2FwcGxlcycKKyAgICAgICAgICAgICAgICAgIFsxLi5dOiBvYmplY3Q6IGFsbCghKSBvYmplY3RzIG1hdGNoaW5nIHRoZSBpdGVtIGRlc2NyaXB0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gdGhlIDxlbnY+IGZvcm0gdGhpcyBtYXkgYmUgdGhlIHdob2xlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN1cnNpdmUgaW52ZW50b3J5IG9mIHRoZSA8ZW52PiBvYmplY3QuCisgICAgICAgICAgICAgICAgSXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0byBpbnRlcnByZXQgdGhlIHJlY29nbml6ZWQgbnVtZXJhbAorICAgICAgICAgICAgICAgIGFuZCB0byBhcHBseSBpdCBvbiB0aGUgbGlzdCBvZiBtYXRjaGVkIG9iamVjdHMuCisgICAgICAgICAgICVsIDogbm9uLWNvbXBhdDogYXMgJWksIGV4Y2VwdCB0aGF0IG9ubHkgbGl2aW5nIG9iamVjdHMgYXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQuCisgICAgICAgICAgICAgICAgY29tcGF0OiBhcyAlbywgZXhjZXB0IHRoYXQgb25seSBhIGxpdmluZyBvYmplY3QgaXMgcmV0dXJuZWQuCisKKyAgICAgICAgJWkgKGFuZCBub24tY29tcGF0LSVsKSBtYXRjaCBkZXNjcmlwdGlvbnMgbGlrZSAndGhyZWUgcmVkIHJvc2VzJywKKyAgICAgICAgJ2FsbCBuYXN0eSBidWdzJyBvciAnc2Vjb25kIGJsdWUgc3dvcmQnLgorCisgICAgICAgIE5vdGU6IFBhdHRlcm5zIG9mIHR5cGU6ICIlcyAldyAlaSIgbWlnaHQgbm90IHdvcmsgYXMgb25lIHdvdWxkIGV4cGVjdC4KKyAgICAgICAgJXcgd2lsbCBhbHdheXMgc3VjY2VlZCBzbyB0aGUgYXJnIGNvcnJlc3BvbmRpbmcgdG8gJXMgd2lsbCBhbHdheXMgYmUKKyAgICAgICAgZW1wdHkuCisKKyAgICAgICAgVG8gbWFrZSB0aGUgZWZ1biB1c2VmdWwgaXQgbXVzdCBoYXZlIGEgY2VydGFpbiBzdXBwb3J0IGZyb20gdGhlCisgICAgICAgIG11ZGxpYjogaXQgY2FsbHMgYSBzZXQgb2YgZnVuY3Rpb25zIGluIG9iamVjdHMgdG8gZ2V0IHRoZQorICAgICAgICBpbmZvcm1hdGlvbiBpdCBuZWVkcyB0byBwYXJzZSBhIHN0cmluZy4KKworICAgICAgICAgIDEuIHN0cmluZyAqcGFyc2VfY29tbWFuZF9pZF9saXN0KCkKKyAgICAgICAgICAgICAgTm9ybWFsIHNpbmd1bGFyIG5hbWVzIG9mIHRoZSBvYmplY3QuCisKKyAgICAgICAgICAyLiBzdHJpbmcgKnBhcnNlX2NvbW1hbmRfcGx1cmFsX2lkX2xpc3QoKSAtIG9wdGlvbmFsCisgICAgICAgICAgICAgIFBsdXJhbCBmb3JtcyBvZiB0aGUgbmFtZXMgcmV0dXJuZWQgYnkgMS4KKyAgICAgICAgICAgICAgSWYgdGhpcyBmdW5jdGlvbiBkb2Vzbid0IGV4aXN0LCB0aGUgcGFyc2VyIHRyaWVzIHRvIHBsdXJhbGl6ZQorICAgICAgICAgICAgICB0aGUgbmFtZXMgcmV0dXJuZWQgYnkgMS4KKworICAgICAgICAgIDMuIHN0cmluZyAqcGFyc2VfY29tbWFuZF9hZGplY3Rpdl9pZF9saXN0KCkgLSAgb3B0aW9uYWwKKyAgICAgICAgICAgICAgQWxsIGFkamVjdGl2ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgb2JqZWN0LgorCisgICAgICAgIEFsbCBuYW1lcyBhbmQgYWRqZWN0aXZlcyBtYXkgY29uc2lzdCBvZiBzZXZlcmFsIHdvcmRzIHNlcGFyYXRlZAorICAgICAgICBieSBzcGFjZXMuCisKKyAgICAgICAgVGhlc2UgZnVuY3Rpb25zIHNob3VsZCBleGlzdCBpbiBhbGwgb2JqZWN0cyBhbmQgYXJlIHRoZXJlZm9yZSBiZXN0CisgICAgICAgIHB1dCBpbnRvIGEgbWFuZGF0b3J5IGluaGVyaXQgZmlsZSAoZS5nLiAvc3RkL29iamVjdC5jKS4KKworICAgICAgICBJbiBhZGRpdGlvbiB0aGUgbWFzdGVyIG9iamVjdCBtYXkgb2ZmZXIgdGhlIHNhbWUgZnVuY3Rpb25zIHRvIHByb3ZpZGUKKyAgICAgICAgcmVhc29uYWJsZSBkZWZhdWx0cyAobGlrZSAndGhpbmcnIGFzIGdlbmVyaWMgc2luZ3VsYXIgbmFtZSk6CisKKyAgICAgICAgICAgICBzdHJpbmcgKnBhcnNlX2NvbW1hbmRfaWRfbGlzdCgpCisgICAgICAgICAgICAgICAtIFdvdWxkIG5vcm1hbGx5IHJldHVybjogKHsgIm9uZSIsICJ0aGluZyIgfSkKKworICAgICAgICAgICAgIHN0cmluZyAqcGFyc2VfY29tbWFuZF9wbHVyYWxfaWRfbGlzdCgpCisgICAgICAgICAgICAgICAtIFdvdWxkIG5vcm1hbGx5IHJldHVybjogKHsgIm9uZXMiLCAidGhpbmdzIiwgInRoZW0iIH0pCisKKyAgICAgICAgICAgICBzdHJpbmcgKnBhcnNlX2NvbW1hbmRfYWRqZWN0aXZfaWRfbGlzdCgpCisgICAgICAgICAgICAgICAtIFdvdWxkIG5vcm1hbGx5IHJldHVybiAoeyAiaWZmaXNoIiB9KQorCisgICAgICAgIFR3byBhZGRpdGlvbmFsIGZ1bmN0aW9ucyBpbiB0aGUgbWFzdGVyIG9iamVjdCBwcm92aWRlIHRoZSBkZWZhdWx0CisgICAgICAgIGxpc3Qgb2YgcHJlcG9zaXRpb25zIChuZWVkZWQgZm9yICVwKSBhbmQgdGhlIHNpbmdsZSAnYWxsJyB3b3JkOgorCisgICAgICAgICAgICAgc3RyaW5nICpwYXJzZV9jb21tYW5kX3ByZXBvc19saXN0KCkKKyAgICAgICAgICAgICAgIC0gV291bGQgbm9ybWFsbHkgcmV0dXJuOiAoeyAiaW4iLCAib24iLCAidW5kZXIiLCAiYmVoaW5kIiwKKyAgICAgICAgICAgICAgICAgImJlc2lkZSIgfSkKKworICAgICAgICAgICAgIHN0cmluZyBwYXJzZV9jb21tYW5kX2FsbF93b3JkKCkKKyAgICAgICAgICAgICAgIC0gV291bGQgbm9ybWFsbHkgcmV0dXJuOiAiYWxsIgorCisKKyAgICAgICAgaW50IHBhcnNlX2NvbW1hbmQoc3RyaW5nLCBvYmplY3R8b2JqZWN0Kiwgc3RyaW5nLCBkZXN0YXJncy4uLikKKworCitFWEFNUExFCisgICAgICAgIG9iamVjdCAqaXRlbXM7CisgICAgICAgIHBhcnNlX2NvbW1hbmQoICJ0YWtlIGFwcGxlIixlbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKQorICAgICAgICAgICAgICAgICAgICAgLCAiICdnZXQnIC8gJ3Rha2UnICVpICIsaXRlbXMpOworCitISVNUT1JZCisgICAgICAgIExETXVkIDMuMy4yNTggcmVtb3ZlZCB0aGUgY29tcGF0LW1vZGUgcGFyc2VfY29tbWFuZCgpLgorCitTRUUgQUxTTworICAgICAgICBzc2NhbmYoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL3Blb3BsZSBiL2RvYy9lZnVuL3Blb3BsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDRjM2JmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vcGVvcGxlCkBAIC0wLDAgKzEsOCBAQAordm9pZCBwZW9wbGUoKQorCitBIGZ1bmN0aW9uIHRoYXQgd2lsbCBsaXN0IGFsbCBpbnRlcmFjdGl2ZSBwbGF5ZXJzLCBhbmQgc29tZSBpbmZvIGFib3V0IHRoZW0uIAorVGhpcyBmdW5jdGlvbiBpcyBub3JtYWxseQorCitjb25uZWN0ZWQgdG8gdGhlIHBlb3BsZSBjb21tYW5kLCB0aGF0IHdpemFyZHMgaGF2ZS4KKworVEhJUyBGVU5DVElPTiBJUyBPQlNPTEVURS4gTE9PSyBBVCB1c2VycygpIElOU1RFQUQuCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9wZ19jbG9zZSBiL2RvYy9lZnVuL3BnX2Nsb3NlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNGY4ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9wZ19jbG9zZQpAQCAtMCwwICsxLDE5IEBACitPUFRJT05BTAorU1lOT1BTSVMKKyAgICAgICAgdm9pZCBwZ19jbG9zZSgpCisKK0RFU0NSSVBUSU9OCisgICAgICAgIENsb3NlIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIGZvciB0aGUgY3VycmVudCBvYmplY3QsIGlmIHRoZXJlIGlzIG9uZS4KKworICAgICAgICBUaGUgZnVuY3Rpb24gaXMgYXZhaWxhYmxlIG9ubHkgaWYgdGhlIGRyaXZlciBpcyBjb21waWxlZCB3aXRoCisgICAgICAgIFBvc3RncmVTUUwgc3VwcG9ydC4gSW4gdGhhdCBjYXNlLCBfX1BHU1FMX18gaXMgZGVmaW5lZC4KKworICAgICAgICBUaGUgZWZ1biB0cmlnZ2VycyBhIHByaXZpbGVnZSB2aW9sYXRpb24gKCJwZ3NxbCIsICJwZ19jbG9zZSIpLgorCitISVNUT1JZCisgICAgICAgIEFkZGVkIGluIDMuMy40NDUuCisgICAgICAgIExETXVkIDMuMy42NDAgYWRkZWQgdGhlIHByaXZpbGVnZSB2aW9sYXRpb24uCisKK1NFRSBBTFNPCisgICAgICAgIHBnc3FsKEMpLCBwZ19jb25uZWN0KEUpLCBwZ19jb252X3N0cmluZyhFKSwgcGdfcXVlcnkoRSksIHBnX3BlbmRpbmcoRSksCisgICAgICAgIHByaXZpbGVnZV92aW9sYXRpb24oTSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL3BnX2Nvbm5lY3QgYi9kb2MvZWZ1bi9wZ19jb25uZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZDRkNTgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9wZ19jb25uZWN0CkBAIC0wLDAgKzEsMzkgQEAKK09QVElPTkFMCitTWU5PUFNJUworICAgICAgICBpbnQgcGdfY29ubmVjdCAoc3RyaW5nIGNvbm4sIHN0cmluZyBmdW4pCisgICAgICAgIGludCBwZ19jb25uZWN0IChzdHJpbmcgY29ubiwgc3RyaW5nIGZ1biwgc3RyaW5nfG9iamVjdCBvYmosIG1peGVkIGV4dHJhLCAuLi4pCisgICAgICAgIGludCBwZ19jb25uZWN0IChzdHJpbmcgY29ubiwgY2xvc3VyZSBjbCwgbWl4ZWQgZXh0cmEsIC4uLikKKworREVTQ1JJUFRJT04KKyAgICAgICAgT3BlbiBhIGRhdGFiYXNlIGNvbm5lY3Rpb24gYXMgZGlyZWN0ZWQgYnkgPGNvbm4+LCBhbmQgYXNzaWduIHRoZQorICAgICAgICBjYWxsYmFjayBmdW5jdGlvbiA8ZnVuPi88Y2w+IHdpdGggdGhlIG9wdGlvbmFsIDxleHRyYT4gcGFyYW1ldGVycworICAgICAgICB0byBpdC4KKworICAgICAgICBUaGUgb2JqZWN0IGhvbGRpbmcgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGJlY29tZXMgdGhlIGNvbnRyb2xsaW5nCisgICAgICAgIG9iamVjdDsgb2Jpb3VzbHkgaXQgaXMgYW4gZXJyb3IgdG8gYXNzaWduIG1vcmUgdGhhbiBvbmUgY29ubmVjdGlvbgorICAgICAgICB0byB0aGUgc2FtZSBjb250cm9sbGluZyBvYmplY3QuCisKKyAgICAgICAgVGhlIDxjb25uPiBzdHJpbmcgaXMgaW4gdGhlIGZvcm1hdCBhY2NlcHRlZCBieSBQb3N0Z3JlcycKKyAgICAgICAgUFFjb25uZWN0U3RhcnQoKSBBUEkgZnVuY3Rpb25zLiBQYXNzIGFuIGVtcHR5IHN0cmluZyB0byB1c2UgdGhlCisgICAgICAgIGRlZmF1bHQgb3B0aW9ucywgb3IgYSBzdHJpbmcgaG9sZGluZyB0aGUgJzxrZXk+PTx2YWx1ZT4nIG9wdGlvbnMKKyAgICAgICAgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UuCisgICAgICAgIAorICAgICAgICBUaGUgbW9zdCB1c2VmdWwgb3B0aW9ucyBhcmU6CisgICAgICAgICAgZGJuYW1lOiAgIFRoZSBkYXRhYmFzZSBuYW1lCisgICAgICAgICAgdXNlcjogICAgIFRoZSB1c2VyIG5hbWUgdG8gY29ubmVjdCBhcy4KKyAgICAgICAgICBwYXNzd29yZDogUGFzc3dvcmQgdG8gYmUgdXNlZC4KKworICAgICAgICBSZXR1cm4gMCBvbiBzdWNjZXNzLCBhbmQgLTEgb24gZmFpbHVyZS4KKworICAgICAgICBUaGUgZnVuY3Rpb24gaXMgYXZhaWxhYmxlIG9ubHkgaWYgdGhlIGRyaXZlciBpcyBjb21waWxlZCB3aXRoCisgICAgICAgIFBvc3RncmVTUUwgc3VwcG9ydC4gSW4gdGhhdCBjYXNlLCBfX1BHU1FMX18gaXMgZGVmaW5lZC4KKworICAgICAgICBUaGUgZWZ1biB0cmlnZ2VycyBhIHByaXZpbGVnZSB2aW9sYXRpb24gKCJwZ3NxbCIsICJwZ19jb25uZWN0IikuCisKK0hJU1RPUlkKKyAgICAgICAgQWRkZWQgaW4gMy4zLjQ0NS4KKyAgICAgICAgTERNdWQgMy4zLjY0MCBhZGRlZCB0aGUgcHJpdmlsZWdlIHZpb2xhdGlvbi4KKworU0VFIEFMU08KKyAgICAgICAgcGdzcWwoQyksIHBnX3F1ZXJ5KEUpLCBwZ19wZW5kaW5nKEUpLCBwZ19jb252X3N0cmluZyhFKSwgcGdfY2xvc2UoRSksCisgICAgICAgIHByaXZpbGVnZV92aW9sYXRpb24oTSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL3BnX2NvbnZfc3RyaW5nIGIvZG9jL2VmdW4vcGdfY29udl9zdHJpbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg0OWQwNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL3BnX2NvbnZfc3RyaW5nCkBAIC0wLDAgKzEsMjAgQEAKK09QVElPTkFMCitTWU5PUFNJUworICAgICAgICBzdHJpbmcgcGdfY29udl9zdHJpbmcoc3RyaW5nIHN0cikKKworREVTQ1JJUFRJT04KKyAgICAgICAgQ29udmVydCB0aGUgc3RyaW5nIDxzdHI+IGludG8gYSBzdHJpbmcgdGhhdCBpcyBjb3JyZWN0bHkgaW50ZXJwcmV0YXRlZAorICAgICAgICBmb3IgdXNhZ2UgYXMgYSBzdHJpbmcgaW4gcGdfcXVlcnkoKSwgZS5nLiAnIGlzIHJlcGxhY2VkIHdpdGggXCcgYW5kIHNvCisgICAgICAgIG9uLgorCisgICAgICAgIFRoZSBmdW5jdGlvbiBpcyBhdmFpbGFibGUgb25seSBpZiB0aGUgZHJpdmVyIGlzIGNvbXBpbGVkIHdpdGgKKyAgICAgICAgUG9zdGdyZVNRTCBzdXBwb3J0LiBJbiB0aGF0IGNhc2UsIF9fUEdTUUxfXyBpcyBkZWZpbmVkLgorCisgICAgICAgIFRoZSBlZnVuIHRyaWdnZXJzIGEgcHJpdmlsZWdlIHZpb2xhdGlvbiAoInBnc3FsIiwgInBnX2Nvbm5lY3QiKS4KKworSElTVE9SWQorICAgICAgICBBZGRlZCBpbiAzLjMuNzA4LgorCitTRUUgQUxTTworICAgICAgICBwZ3NxbChDKSwgcGdfcXVlcnkoRSksIHBnX3BlbmRpbmcoRSksIHBnX2NvbnZfc3RyaW5nKEUpLCBwZ19jbG9zZShFKSwKKyAgICAgICAgcHJpdmlsZWdlX3Zpb2xhdGlvbihNKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vcGdfcGVuZGluZyBiL2RvYy9lZnVuL3BnX3BlbmRpbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZhNmRjYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL3BnX3BlbmRpbmcKQEAgLTAsMCArMSwyMiBAQAorT1BUSU9OQUwKK1NZTk9QU0lTCisgICAgICAgIGludCBwZ19wZW5kaW5nICgpCisgICAgICAgIGludCBwZ19wZW5kaW5nIChvYmplY3Qgb2JqKQorCitERVNDUklQVElPTgorICAgICAgICBSZXR1cm4gdGhlIG51bWJlciBvZiBwZW5kaW5nIHF1ZXJpZXMgZm9yIHRoZSBjb25uZWN0aW9uIG9uIHRoZSBnaXZlbgorICAgICAgICBvYmplY3QgPG9iaj4gKGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgb2JqZWN0KS4gVGhlIG9iamVjdCBoYXMgbm8KKyAgICAgICAgZGF0YWJhc2UgY29ubmVjdGlvbiwgcmV0dXJuIC0xLgorCisgICAgICAgIFRoZSBmdW5jdGlvbiBpcyBhdmFpbGFibGUgb25seSBpZiB0aGUgZHJpdmVyIGlzIGNvbXBpbGVkIHdpdGgKKyAgICAgICAgUG9zdGdyZVNRTCBzdXBwb3J0LiBJbiB0aGF0IGNhc2UsIF9fUEdTUUxfXyBpcyBkZWZpbmVkLgorCisgICAgICAgIFRoZSBlZnVuIHRyaWdnZXJzIGEgcHJpdmlsZWdlIHZpb2xhdGlvbiAoInBnc3FsIiwgInBnX3BlbmRpbmciKS4KKworSElTVE9SWQorICAgICAgICBBZGRlZCBpbiAzLjMuNDQ1LgorICAgICAgICBMRE11ZCAzLjMuNjQwIGFkZGVkIHRoZSBwcml2aWxlZ2UgdmlvbGF0aW9uLgorCitTRUUgQUxTTworICAgICAgICBwZ3NxbChDKSwgcGdfY29ubmVjdChFKSwgcGdfY29udl9zdHJpbmcoRSksIHBnX3F1ZXJ5KEUpLCBwZ19jbG9zZShFKSwKKyAgICAgICAgcHJpdmlsZWdlX3Zpb2xhdGlvbihNKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vcGdfcXVlcnkgYi9kb2MvZWZ1bi9wZ19xdWVyeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTVmMmNjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vcGdfcXVlcnkKQEAgLTAsMCArMSwyOCBAQAorT1BUSU9OQUwKK1NZTk9QU0lTCisgICAgICAgICNpbmNsdWRlIDxwZ3NxbC5oPgorCisgICAgICAgIGludCBwZ19xdWVyeSAoc3RyaW5nIHF1ZXJ5KQorICAgICAgICBpbnQgcGdfcXVlcnkgKHN0cmluZyBxdWVyeSwgaW50IGZsYWdzKQorCitERVNDUklQVElPTgorICAgICAgICBRdWV1ZSBhIG5ldyBxdWVyeSA8cXVlcnk+IHRvIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIG9uIHRoZSBjdXJyZW50CisgICAgICAgIG9iamVjdC4gUmV0dXJuIHRoZSB1bmlxdWUgaWQgb2YgdGhlIHF1ZXJ5LiBUaGUgcXVlcnkgcmVzdWx0IGl0c2VsZgorICAgICAgICB3aWxsIGJlIHBhc3NlZCBhcyBhcmd1bWVudCB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uCisKKyAgICAgICAgPGZsYWdzPiBjYW4gYmUgb25lIG9mIHRoZXNlIHZhbHVlczoKKyAgICAgICAgICBQR19SRVNVTFRfQVJSQVk6IFBhc3MgdGhlIHF1ZXJ5IHJlc3VsdCBhcyBhcnJheS4KKyAgICAgICAgICBQR19SRVNVTFRfTUFQOiAgIFBhc3MgdGhlIHF1ZXJ5IHJlc3VsdCBhcyBtYXBwaW5nLgorCisgICAgICAgIFRoZSBmdW5jdGlvbiBpcyBhdmFpbGFibGUgb25seSBpZiB0aGUgZHJpdmVyIGlzIGNvbXBpbGVkIHdpdGgKKyAgICAgICAgUG9zdGdyZVNRTCBzdXBwb3J0LiBJbiB0aGF0IGNhc2UsIF9fUEdTUUxfXyBpcyBkZWZpbmVkLgorCisgICAgICAgIFRoZSBlZnVuIHRyaWdnZXJzIGEgcHJpdmlsZWdlIHZpb2xhdGlvbiAoInBnc3FsIiwgInBnX3F1ZXJ5IikuCisKK0hJU1RPUlkKKyAgICAgICAgQWRkZWQgaW4gMy4zLjQ0NS4KKyAgICAgICAgTERNdWQgMy4zLjY0MCBhZGRlZCB0aGUgcHJpdmlsZWdlIHZpb2xhdGlvbi4KKworU0VFIEFMU08KKyAgICAgICAgcGdzcWwoQyksIHBnX2Nvbm5lY3QoRSksIHBnX2NvbnZfc3RyaW5nKEUpLCBwZ19wZW5kaW5nKEUpLCBwZ19jbG9zZShFKSwKKyAgICAgICAgcHJpdmlsZWdlX3Zpb2xhdGlvbihNKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vcG9pbnRlcnAgYi9kb2MvZWZ1bi9wb2ludGVycApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmYyYzJjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vcG9pbnRlcnAKQEAgLTAsMCArMSw5IEBACitTWU5PUFNJUworICAgICAgICBpbnQgcG9pbnRlcnAobWl4ZWQgYXJnKQorCitCRVNDSFJFSUJVTkcKKyAgICAgICAgTGllZmVydCAxLCB3ZW5uIGRhcyBBcmd1bWVudCBlaW4gRmVsZCAoQXJyYXkpIGlzdCwgYW5zb25zdGVuIDAuCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgY2xvc3VyZXAoRSksIGZsb2F0cChFKSwgbWFwcGluZ3AoRSksIG9iamVjdHAoRSksIGludHAoRSksCisgICAgICAgIHJlZmVyZW5jZXAoRSksIHN0cmluZ3AoRSksIHN5bWJvbHAoRSksIGNsb25lcChFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vcG93IGIvZG9jL2VmdW4vcG93Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZmY1ODYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9wb3cKQEAgLTAsMCArMSwxNiBAQAorU1lOT1BTSVMKKyAgICAgICAgZmxvYXQgcG93KGludHxmbGFvdCBiYXNlLCBpbnR8Zmxhb3QgZXhwKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIERpZSBQb3RlbnpmdW5rdGlvbi4gU2llIGxpZWZlcnQgZGFzIFJlc3VsdGF0IHZvbiAiPGJhc2U+IGhvY2ggPGV4cD4iLgorCitCRUlTUElFTAorICAgICAgICBwb3coLTIsIDMpIC0+IGxpZWZlcnQgLTguMAorICAgICAgICBwb3coOCwgMS4wLzMuMCkgLT4gbGllZmVydCAyLjAKKworQUVOREVSVU5HRU4KKyAgICAgICAgRWluZ2VmdWVocnQgaW4gTERNdWQgMy4yLjcuCisgICAgICAgIExETXVkIDMuMi45LiBlcmxhdWJ0ZSBuZXUgSW50ZWdlciBhbHMgQXJndW1lbnRlLgorCitTSUVIRSBBVUNICisgICAgICAgIGV4cChFKSwgbG9nKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9wcmVzZW50IGIvZG9jL2VmdW4vcHJlc2VudApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjdkOGQzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vcHJlc2VudApAQCAtMCwwICsxLDg0IEBACitTWU5PUFNJUworICAgICAgICBvYmplY3QgcHJlc2VudChzdHJpbmcgc3RyKQorICAgICAgICBvYmplY3QgcHJlc2VudChzdHJpbmcgc3RyLCBpbnQgbikKKyAgICAgICAgb2JqZWN0IHByZXNlbnQoc3RyaW5nIHN0ciwgb2JqZWN0IGVudikKKyAgICAgICAgb2JqZWN0IHByZXNlbnQoc3RyaW5nIHN0ciwgaW50IG4sIG9iamVjdCBlbnYpCisKKyAgICAgICAgb2JqZWN0IHByZXNlbnQob2JqZWN0IG9iKQorICAgICAgICBvYmplY3QgcHJlc2VudChvYmplY3Qgb2IsIG9iamVjdCBlbnYpCisKK0JFU0NIUkVJQlVORworICAgICAgICBXZW5uIGVpbiBPYmpla3QgbWl0IGRlciBJZCA8c3RyPiBzaWNoIGltIEludmVudGFyIG9kZXIgaW4gZGVyIFVtZ2VidW5nCisgICAgICAgIHZvbiB0aGlzX29iamVjdCgpIGJlZmluZGV0LCB3aXJkIGVzIHp1cnVlY2sgZ2VsaWVmZXJ0LgorICAgICAgICAKKyAgICAgICAgSXN0IGRhcyBBcmd1bWVudCA8bj4gZ2VnZWJlbiwgd2lyZCBkYXMgbi10ZSBPYmpla3QgbWl0IE5hbWVuIDxpZD4KKyAgICAgICAgenVydWVjayBnZWxpZWZlcnQuIERhcyBoZWlzc3QsIGRlciBEcml2ZXIgZnVlaHJ0IGZ1ZXIgYWxsZSBPYmpla3RlCisgICAgICAgIGltIEludmVudGFyIHVuZCBpbiBkZXIgVW1nZWJ1bmcgdm9uIHRoaXNfb2JqZWN0KCkgZGllIEZ1bmt0aW9uCisgICAgICAgIGlkKHN0cikgYXVzLCBiaXMgZWluIFRyZWZmZXIgZXJ6aWVsdCB3aXJkICh3ZW5uIHVlYmVyaGF1cHQpLgorCisgICAgICAgIElzdCA8bj4gbmljaHQgZ2VnZWJlbiwgYWJlciA8c3RyPiBoYXQgZGllIEZvcm0gIjxpZD4gPG4+IiAsIHdpcmQKKyAgICAgICAgZWJlbmZhbGxzIGRhcyBuLXRlIE9iamVrdCBtaXQgTmFtZW4gPGlkPiB6dXJ1ZWNrZ2VsaWVmZXJ0LgorCisgICAgICAgIEVzIGlzdDogaWQoc3RyKSB7IHJldHVybiBzdHIgPT0gPG5hbWU+OyB9CisKKyAgICAgICAgPHN0cj4ga2FubiBhdWNoIGVpbiBPYmpla3QgKGFuc3RhdHQgZWluZW0gb2JqZWN0X25hbWUoKSkgc2Vpbiwgd2FzIGRlbgorICAgICAgICBUZXN0IHNjaG5lbGxlciB1bmQgZWluZmFjaGVyIG1hY2h0LgorCisgICAgICAgIERhcyBBcmd1bWVudCA8ZW52PiBpc3Qgb3B0aW9uYWwuIDxlbnY+IGdpYnQgYW4sIHdvIG5hY2ggPHN0cj4gZ2VzdWNodAorICAgICAgICB3aXJkLiBOdXIgZGFzIEludmVudG9yeSB2b24gPGVudj4gd2lyZCBkdXJjaHN1Y2h0LCBuaWNodCBqZWRvY2ggZGVzc2VuCisgICAgICAgIFVtZ2VidW5nLiBPZnRtYWxzIHdpcmQgZnVlciA8ZW52PiB0aGlzX3BsYXllcigpIGdlc2V0enQuCisKKworQU5NRVJLVU5HCisgICAgICAgIERpZXNlIGVmdW4ga2FubiB1LlUuIF9zZWhyXyB0ZXVlciBzZWluISBCaXR0ZSBzY2hhdXQgZXVjaCBhdWYgamVkZW4KKyAgICAgICAgRmFsbCBhdWNoIGRpZSBlZnVuIHByZXNlbnRfY2xvbmUoKSBhbiB1bmQgc2NoYXV0LCBvYiBkaWUgZXZ0bC4gZGFzCisgICAgICAgIGthbm4sIHdhcyBpaHIgbWFjaGVuIHdvbGx0LiBwcmVzZW50X2Nsb25lKCkgaXN0IGVyaGVibGljaCBiaWxsaWdlci4KKworICAgICAgICBXZW5uIGRpZSBlZnVuIHNvd29obCBpbiB0aGlzX29iamVjdCgpIGFscyBhdWNoIGRlc3NlbiBVbWdlYnVuZworICAgICAgICBzdWNodCwgd2VyZGVuLCBzb3dlaXQgZXMgZGllIE51bWVyaWVydW5nIGJldHJpZmZ0LCBkaWUgYmVpZGVuCisgICAgICAgIFVtZ2VidW5nZW4genVzYW1tZW5oYWVuZ2VuZCBiZXRyYWNodGV0LgorCitCRUlTUElFTEUKKyAgICAgICAgcHJlc2VudCgiY2hlc3QiKTsKKyAgICAgICAgICAtLT4gZmluZGV0IGRhcyBlcnN0ZSAnY2hlc3QnIE9iamVrdAorCisgICAgICAgIHByZXNlbnQoImNoZXN0IDIiKTsKKyAgICAgICAgICAtLT4gZmluZGV0IGRhcyB6d2VpdGUgJ2NoZXN0JyBPYmpla3QKKworICAgICAgICBwcmVzZW50KCJjaGVzdCAyIiwgMSk7CisgICAgICAgICAgLS0+IGZpbmRldCBkYXMgZXJzdGUgJ2NoZXN0IDInIE9iamVrdAorCisgICAgICAgIFdlbm4gc2ljaCBlaW5lICJjaGVzdCIgaW0gdGhpc19vYmplY3QoKSBiZWZpbmRldCwgdW5kIHp3ZWkKKyAgICAgICAgYXVzc2VyaGFsYjoKKyAgICAgICAgICBwcmVzZW50KCJjaGVzdCIsIDEpIC0+IGZpbmRldCBkaWUgY2hlc3QgaW0gT2JqZWt0CisgICAgICAgICAgcHJlc2VudCgiY2hlc3QiLCAyKSAtPiBmaW5kZXQgZGllIGVyc3RlIGNoZXN0IGF1c3NlcmhhbGIKKyAgICAgICAgICBwcmVzZW50KCJjaGVzdCIsIDMpIC0+IGZpbmRldCBkaWUgendlaXRlIGNoZXN0IGF1c3NlcmhhbGIKKyAgICAgICAgCisgICAgICAgIFdlbm4gZWluIE9iamVrdCBkaWUgRm9ydW0gIjxpZD4gPG4+IiBpbiBWZXJiaW5kdW5nIG1pdCBlaW5lbSBzZWxic3QKKyAgICAgICAgdWViZXIgYWRkX2FjdGlvbigpIGdlc2V0enRlbiBWZXJiIHVudGVyc3R1ZXR6ZW4gc29sbCAoZGFtaXQgei4gQi4KKyAgICAgICAgIm9lZmZuZSBLaXN0ZSAzIiBmdW5rdGlvbmllcnQpLCBrYW5uIGRhcyBmb2xnZW5kZXJtYXNzZW4gZ2Vsb2VzdAorICAgICAgICB3ZXJkZW46CisKKyAgICAgICAgICAgIHZvaWQgaW5pdCgpIHsgYWRkX2FjdGlvbigib2VmZm5lX2tpc3RlIiwgIm9lZmZuZSIpOyB9CisKKyAgICAgICAgICAgIGludCBvZWZmbmVfa2lzdGUoc3RyaW5nIHN0cikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihwcmVzZW50KHN0cikgIT0gdGhpc19vYmplY3QoKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsgLyogbmljaHQgZGllc2UgS2lzdGUgKi8KKyAgICAgICAgICAgICAgICAgICAgLi4uCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCitISVNUT1JZCisgICAgICAgIExETXVkIDMuMi4xMS8zLjMuNjEwIGZ1ZWhydGUgZGllIChzdHIsIG4pLUZvcm0gZWluLgorICAgICAgICBMRE11ZCAzLjMuNzEzIGFlbmRlcnRlIGRpZSBOdW1lcmllcnVuZyB3ZW5uIHNvd29obCBJbnZlbnRvcnkKKyAgICAgICAgICBhbHMgYXVjaCBVbWdlYnVuZyBkdXJjaHN1Y2h0IHdlcmRlbi4gSW4gZGVyIHZvcmhlcmlnZW4KKyAgICAgICAgICBJbXBsZW1lbnRpZXJ1bmcgd3VyZGUgZWluZSBOdW1lcmllcnVuZyBhdWYgYmVpZGVuIFVtZ2VidW5nZW4KKyAgICAgICAgICBlaW56ZWxuIGFuZ2V3YW5kdCwgd2FzIHp1ciBGb2xnZSBoYXR0ZSwgZGFzcyBuaWVkZXJlIE9iamVrdGUKKyAgICAgICAgICBpbiBkZXIgYWV1c3NlcmVuIFVtZ2VidW5nIG5pY2h0IGdlZnVuZGVuIHdlcmRlbiBrb2VubnRlbiwgZGEKKyAgICAgICAgICBzaWUgdm9uIGRlbiBPYmpla3RlbiBpbiBJbm5lcmVuIHZlcmRlY2t0IHd1cmRlbi4KKworU0lFSEUgQVVDSAorICAgICAgICBtb3ZlX29iamVjdChFKSwgZW52aXJvbm1lbnQoRSksIHRoaXNfb2JqZWN0KEUpLCBwcmVzZW50X2Nsb25lKEUpLAorICAgICAgICBpZChBKSwgaW5pdChBKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vcHJlc2VudF9jbG9uZSBiL2RvYy9lZnVuL3ByZXNlbnRfY2xvbmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q2NDQ4OAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL3ByZXNlbnRfY2xvbmUKQEAgLTAsMCArMSw0MSBAQAorVk9STEFFVUZJRworU1lOT1BTSVMKKyAgICAgICAgb2JqZWN0IHByZXNlbnRfY2xvbmUoc3RyaW5nIHN0ciBbLCBvYmplY3QgZW52XSApOworICAgICAgICBvYmplY3QgcHJlc2VudF9jbG9uZShvYmplY3Qgb2JqIFssIG9iamVjdCBlbnZdICk7CisKK0JFU0NIUkVJQlVORworICAgICAgICBEaWVzZSBFZnVuIGR1cmNoc3VjaHQgZGFzIEludmVudGFyIHZvbiA8ZW52PiBuYWNoIGVpbmVtIE9iamVrdCBtaXQKKyAgICAgICAgZWluZW0gYmVzdGltbXRlbiBCbHVlcHJpbnQgLiBXaXJkIDxlbnY+IG5pY2h0IGFuZ2VnZWJlbiwgd2lyZCBpbgorICAgICAgICB0aGlzX29iamVjdCgpIGdlc3VjaHQuIERlciBCbHVlcHJpbnQga2FubiBlbnR3ZWRlciBtaXQgc2VpbmVtIE5hbWVuCisgICAgICAgIDxzdHI+IGFuZ2VnZWJlbiB3ZXJkZW4sIG9kZXIgYWxzIEJsdWVwcmludCBkZXMgT2JqZWt0cyA8b2JqPi4gR2VzdWNodAorICAgICAgICB3aXJkIGluIGJlaWRlbiBGYWVsbGVuIGF1ZmdydW5kIHZvbiBsb2FkX25hbWUoKS4KKyAgICAgICAgV2lyZCBrZWluIHBhc3NlbmRlcyBPYmpla3QgZ2VmdW5kZW4sIGxpZWZlcnQgZGllIEVmdW4gMCB6dXJ1ZWNrLgorCisgICAgICAgIEZ1ZXIgRHJpdmVyIGltIFBsYWluIE1vZHVzIGJlZ2lubnQgZGVyIE5hbWUgaW4gamVkZW0gRmFsbCBtaXQgJy8nLCBpbQorICAgICAgICBDb21wYXQgTW9kdXMgbmljaHQuCisKK0JFSVNQSUVMRQorICAgICAgICBBbmdlbm9tbWVuLCBkYXMgT2JqZWt0IDxlbnY+IGVudGhhbHRlIGRpZSBPYmpla3RlIC9pdGVtcy9tb25leSM4LAorICAgICAgICAvc3RkL3dlYXBvbiM5LCAvc3RkL3dlYXBvbiMxMiB1bmQgL29iai9rZXkgaW4gZGVyIGFuZ2VnZWJlbgorICAgICAgICBSZWloZW5mb2xnZS4KKworICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKworICAgICAgICB8IEZ1bmt0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExpZWZlcnQgICAgICAgfAorICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKworICAgICAgICB8IHByZXNlbnRfY2xvbmUoIi9pdGVtcy9tb25leSIsIGVudikgICAgICAgICAgICAgICB8IC9pdGVtcy9tb25leSM4fAorICAgICAgICB8IHByZXNlbnRfY2xvbmUoIi9zdGQvd2VhcG9uIzEyIiwgZW52KSAgICAgICAgICAgICB8IC9zdGQvd2VhcG9uIzkgfAorICAgICAgICB8IHByZXNlbnRfY2xvbmUoZmluZF9vYmplY3QoIi9pdGVtcy9tb25leSMxIiksIGVudil8IC9pdGVtcy9tb25leSM4fAorICAgICAgICB8IHByZXNlbnRfY2xvbmUoIi9vYmova2V5IzE4IiwgZW52KSAgICAgICAgICAgICAgICB8IC9vYmova2V5ICAgICAgfAorICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKworCisgICAgICAgIEZ1ZXIgRHJpdmVyIGltIENvbXBhdCBNb2R1cyBsaWVmZXJ0IGRpZSBGdW5rdGlvbiBrZWluZSAnLycgYW0gQW5mYW5nLgorCitBRU5ERVJVTkdFTgorICAgICAgICBFaW5nZWZ1ZWhydCBpbiAzLjIuNy4KKworQU5NRVJLVU5HCisgICAgICAgIEltIFVudGVyc2NoaWVkIHp1IHByZXNlbnQoKSBzdWNodCBwcmVzZW50X2Nsb25lKCkgbmllbWFscyBpbiBkZXIKKyAgICAgICAgVW1nZWJ1bmcgdm9uIDxlbnY+LgorCitTSUVIRSBBVUNICisgICAgICAgIGxvYWRfbmFtZShFKSwgcHJlc2VudChFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vcHJldmlvdXNfb2JqZWN0IGIvZG9jL2VmdW4vcHJldmlvdXNfb2JqZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNzEyYWQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9wcmV2aW91c19vYmplY3QKQEAgLTAsMCArMSw1MCBAQAorU1lOT1BTSVMKKyAgICAgICAgb2JqZWN0IHByZXZpb3VzX29iamVjdCgpOworICAgICAgICBvYmplY3QgcHJldmlvdXNfb2JqZWN0KGludCBpKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIExpZWZlcnQgZWluZW4gUG9pbnRlciBhdWYgZGFzIGxldHp0ZSBPYmpla3QsIGRhcyBlaW5lbiBBdWZydWYgKG1pdHRlbHMKKyAgICAgICAgY2FsbF9vdGhlcigpLCBmdW5jYWxsKCkgZXRjLikgYXVmIGRhcyBha3R1ZWxsZSBPYmpla3QgdGhpc19vYmplY3QoKQorICAgICAgICBnZW1hY2h0IGhhdC4gV2VubiBkaWVzZXMgYXVmcnVmZW5kZSBPYmpla3QgaW56d2lzY2hlbiB6ZXJzdG9lcnQgd3VyZGUsCisgICAgICAgIGxpZWZlcnQgcHJldmlvdXNfb2JqZWN0KCkgMC4KKyAgICAgICAgQmVpIGVpbmVtIEF1ZnJ1ZiBlaW5lciBlaWdlbmVuIEZ1bmt0aW9uIGR1cmNoIGVpbiBPYmpla3QgYmxlaWJ0IGRhcworICAgICAgICBiaXNoZXJpZ2UgcHJldmlvdXNfb2JqZWN0KCkgdW52ZXJhZW5kZXJ0LgorCisgICAgICAgIFdpcmQgZGFzIEFyZ3VtZW50IDxpPiBhbmdlZ2ViZW4sIHNvIHZlcmZvbGd0IHByZXZpb3VzX29iamVjdCgpIGRlbgorICAgICAgICBBdWZydWYgPGk+IFN0dWZlbiB6dXJ1ZWNrLiBadW0gQmVpc3BpZWwgbGllZmVydCBwcmV2aW91c19vYmplY3QoMSkgZGFzCisgICAgICAgIGF1ZnJ1ZmVuZGUgT2JqZWt0IGRlcyBhdWZydWZlbmRlbiBPYmpla3RzLiBGdWVyIDxpPiBtdXNzIGdlbHRlbjoKKyAgICAgICAgMCA8PSBpIDwgY2FsbF9zdGFja19kZXB0aCgpLiBFaW4gV2VydCA8aT4gPCAwIGxpZWZlcnQgZGFzIGVyc3RlCisgICAgICAgIGF1ZnJ1ZmVuZGUgT2JqZWN0IHp1cnVlY2suCisKKyAgICAgICAgRXMgZ2lidCBlaW5lbiB3aWNodGlnZW4gU3BlemlhbGZhbGw6IGluIEZ1bmt0aW9uZW4sIGRpZSB2b20gR2FtZWRyaXZlcgorICAgICAgICBhdWYgR3J1bmQgZWluZXMgZXh0ZXJuZW4gRXJlaWduaXNlcyBhdWZnZXJ1ZmVuIHd1cmRlbiAoenVtIEJlaXNwaWVsCisgICAgICAgIEtvbW1hbmRpLCBkaWUgbWl0IGFkZF9hY3Rpb24oKSBkZWZpbmllcnQgd3VyZGVuKSwgbGllZmVydAorICAgICAgICBwcmV2aW91c19vYmplY3QoKSB0aGlzX29iamVjdCgpLCBwcmV2aW91c19vYmplY3QoMCkgaGluZ2VnZW4gMC4KKworQkVJU1BJRUwKKyAgICAgICAgaW50IHNpY2hlcmhlaXRzY2hlY2soKQorICAgICAgICB7CisgICAgICAgICAgICBvYmplY3QgcHJldjsKKyAgICAgICAgICAgIGlmKCEocHJldj1wcmV2aW91c19vYmplY3QoKSkpOworICAgICAgICAgICAgZWxzZSBpZihnZXR1aWQocHJldikhPWdldHVpZCh0aGlzX29iamVjdCgpKSk7CisgICAgICAgICAgICBlbHNlIGlmKGdldGV1aWQocHJldikhPWdldGV1aWQodGhpc19vYmplY3QoKSkpOworICAgICAgICAgICAgZWxzZSByZXR1cm4gMTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHZvaWQgc2Vuc2libGVfZnVua3Rpb24oKQorICAgICAgICB7CisgICAgICAgICAgICBpZighc2ljaGVyaGVpdHNjaGVjaygpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgLi4uCisgICAgICAgIH0KKworICAgICAgICBEaWVzZSBGdW5rdGlvbiB6ZWlndCwgd2llIG1hbiB1ZWJlcnBydWVmZW4ga2Fubiwgb2IgZGVyIGxldHp0ZSBBdWZydWYKKyAgICAgICAgZWluZXIgRnVua3Rpb24gaW0gYWt0dWVsbGVuIE9iamVrdCBzaWNoZXIgd2FyLCBvZGVyIG9iIGRpZQorICAgICAgICBWZXJhcmJlaXR1bmcgYWJnZWJyb2NoZW4gd2VyZGVuIHNvbGx0ZS4KKworRkVITEVSCisgICAgICAgIFdlcnRlIHZvbiA8aT4gPCAwIHdlcmRlbiB3aWUgPGk+ID09IDAgYmVoYW5kZWx0IC0gZGllcyBpc3QgaGlzdG9yaXNjaC4KKworU0lFSEUgQVVDSAorICAgICAgICBjYWxsX290aGVyKEUpLCB0aGlzX29iamVjdChFKSwgdGhpc19wbGF5ZXIoRSkKKyAgICAgICAgY2FsbGVyX3N0YWNrKEUpLCBjYWxsZXJfc3RhY2tfZGVwdGgoRSksIGV4dGVybl9jYWxsKEUpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vcHJpbnRmIGIvZG9jL2VmdW4vcHJpbnRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ODIzM2IKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9wcmludGYKQEAgLTAsMCArMSw5IEBACitTWU5PUFNJUworICAgICAgICB2b2lkIHByaW50ZihzdHJpbmcgZm9ybWF0LCAuLi4pOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgRWluZSBNaXNjaHVuZyBhdXMgc3ByaW50ZigpIHVuZCB3cml0ZSgpLiBHaWJ0IHZvaWQgenVydWVjayB1bmQgZGVuCisgICAgICAgIFN0cmluZyBhbiBkZW4gQmVudXR6ZXIgYXVzLgorCitTSUVIRSBBVUNICisgICAgICAgIHNwcmludGYoRSksIHdyaXRlKEUpLCB0ZXJtaW5hbF9jb2xvdXIoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL3Byb2dyYW1fbmFtZSBiL2RvYy9lZnVuL3Byb2dyYW1fbmFtZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDE2MmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vcHJvZ3JhbV9uYW1lCkBAIC0wLDAgKzEsMzggQEAKK1NZTk9QU0lTCisgICAgICAgIHN0cmluZyBwcm9ncmFtX25hbWUoKQorICAgICAgICBzdHJpbmcgcHJvZ3JhbV9uYW1lKG9iamVjdCBvYmopCisKK0JFU0NIUkVJQlVORworICAgICAgICBMaWVmZXJ0IGRlbiBOYW1lIGRlcyBQcm9ncmFtbXMsIGF1cyBkZW0gPG9iaj4ga29tcGlsaWVydCB3dXJkZS4KKyAgICAgICAgV2VubiA8b2JqPiBuaWNodCBhbmdlZ2ViZW4gd2lyZCwgd2lyZCBzdGFuZGFyZG1hZXNzaWcgdGhpc19vYmplY3QoKQorICAgICAgICB2ZXJ3ZW5kZXQuCisKKyAgICAgICAgRGVyIE5hbWUgaXN0IGZ1ZXIgQ2xvbmVzIGRlciBOYW1lIGRlcyBGaWxlcywgYXVzIGRlbSBkZXIgQmx1ZXByaW50CisgICAgICAgIGtvbXBsaWVydCB3dXJkZS4gRGVyIE5hbWUgd2VjaHNlbHQsIHdlbm4gZWluIE9iamVrdCBzZWluIFByb2dyYW1tCisgICAgICAgIGR1cmNoIHJlcGxhY2VfcHJvZ3JhbSgpIGFlbmRlcnQuCisKKyAgICAgICAgRnVlciBkZW4gU3BlemlhbGZhbGwsIGRhc3MgPG9iaj4gYWxzIDAgdWViZXJnZWJlbiB3aXJkLCBsaWVmZXJ0CisgICAgICAgIHByb2dyYW1fbmFtZSgpIDAgenVydWVjay4KKworICAgICAgICBEZXIgTmFtZSBlbmRldCBpbW1lciBtaXQgJy5jJy4gRXIgYmVnaW5udCBtaXQgZWluZW0gJy8nLCB3ZW5uIGRlcgorICAgICAgICBEcml2ZXIgc2ljaCBuaWNodCBpbSBDb21wYXQgTW9kdXMgYmVmaW5kZXQuCisKK0JFSVNQSUVMCisgICAgICAgIG9iamVjdCBvOworICAgICAgICBvID0gY2xvbmVfb2JqZWN0KCIvc3RkL2RpbmdzIik7CisgICAgICAgIHdyaXRlKHByb2dyYW1fbmFtZShvKSk7CisKKyAgICAgICAgbGllZmVydDoKKyAgICAgICAgLS0+ICIvc3RkL2RpbmdzLmMiLCB3ZW5uIGRlciBEcml2ZXIgbmljaHQgaW0gQ29tcGF0IE1vZHVzIGxhZXVmdC4KKyAgICAgICAgLS0+ICJzdGQvZGluZ3MuYyIsIHdlbm4gZGVyIERyaXZlciBpbSBDb21wYXQgTW9kdXMgbGFldWZ0LgorCitBRU5ERVJVTkdFTgorICAgICAgICBFaW5nZWZ1ZWhydCBpbiBMRE11ZCAzLjIuNi4KKyAgICAgICAgU2VpdCAzLjIuOSBpc3QgZGFzIEFyZ3VtZW50IDAgZXJsYXVidC4KKworQU5NRVJLVU5HCisgICAgICAgIERpZSBFZnVuIHN3YXB0IHp1bSBQcm9ncmFtbSwgd2VubiBkaWVzZXMgZ2Vzd2FwdCBpc3QuCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgY2xvbmVfb2JqZWN0KEUpLCBjbG9uZXAoRSksIGxvYWRfbmFtZShFKSwgbG9hZF9vYmplY3QoRSksCisgICAgICAgIG9iamVjdF9uYW1lKEUpLCByZXBsYWNlX3Byb2dyYW0oRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL3Byb2dyYW1fdGltZSBiL2RvYy9lZnVuL3Byb2dyYW1fdGltZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmE2Mjk3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vcHJvZ3JhbV90aW1lCkBAIC0wLDAgKzEsMTcgQEAKK1NZTk9QU0lTCisgICAgICAgIGludCBwcm9ncmFtX3RpbWUoKQorICAgICAgICBpbnQgcHJvZ3JhbV90aW1lKG9iamVjdCBvYikKKworREVTQ1JJUFRJT04KKyAgICAgICAgUmV0dXJucyB0aGUgY3JlYXRpb24gKGNvbXBpbGF0aW9uKSB0aW1lIG9mIHRoZSBvYmplY3QncworICAgICAgICBwcm9ncmFtLiBJbiBvdGhlciB3b3JkcywgdGhpcyBpcyB0aGUgb2JqZWN0X3RpbWUoKSBvZgorICAgICAgICB0aGUgYmx1ZXByaW50LgorCisgICAgICAgIERlZmF1bHQgaXMgdGhpc19vYmplY3QoKSwgaWYgbm8gYXJnIGlzIGdpdmVuLgorCisJCisgICAgICAgIENBVkVBVDogSWYgdGhlIG9iamVjdHMgcHJvZ3JhbSBpcyBzd2FwcGVkIG91dCwgdGhpcyBlZnVuCisgICAgICAgICAgc3dhcHMgaXQgYmFjayBpbi4KKworU0VFIEFMU08KKyAgICAgICAgb2JqZWN0X3RpbWUoRSksIHByb2dyYW1fbmFtZShFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vcXVlcnlfYWN0aW9ucyBiL2RvYy9lZnVuL3F1ZXJ5X2FjdGlvbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBhY2FiYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL3F1ZXJ5X2FjdGlvbnMKQEAgLTAsMCArMSwzNyBAQAorU1lOT1BTSVMKKyAgICAgICAgI2luY2x1ZGUgPHN5cy9jb21tYW5kcy5oPgorCisgICAgICAgIG1peGVkICpxdWVyeV9hY3Rpb25zKG9iamVjdHxzdHJpbmcgb2IsIG1peGVkIG1hc2tfb3JfdmVyYik7CisKK0JFU0NIUkVJQlVORworICAgICAgICBEYXMgZXJzdGUgQXJndW1lbnQgdm9uIHF1ZXJ5X2FjdGlvbnMoKSBpc3QgZW50d2VkZXIgZWluIE9iamVrdAorICAgICAgICBvZGVyIGRlciBEYXRlaW5hbWUgZWluZXMgT2JqZWt0cy4gRGFzIHp3ZWl0ZSBBcmd1bWVudCBtdXNzCisgICAgICAgIGVudHdlZGVyIGVpbmUgQml0bWFza2UgKGVpbiBJbnRlZ2VyKSBvZGVyIGVpbiBTdHJpbmcgc2Vpbi4KKworICAgICAgICBJc3QgZGFzIHp3ZWl0ZSBBcmd1bWVudCBlaW4gU3RyaW5nLCBsaWVmZXJ0IHF1ZXJ5X2FjdGlvbnMoKSBlaW4KKyAgICAgICAgQXJyYXkgbWl0IEluZm9ybWF0aW9uZW4gdWViZXIgZGFzIFZlcmIgb2RlciAwIHp1cnVlY2ssIHdlbm4KKyAgICAgICAgZGFzIGxlYmVuZGlnZSBPYmpla3QgPG9iPiBkYXMgVmVyYiBuaWNodCB2ZXJ3ZW5kZW4ga2Fubi4KKworICAgICAgICBXZW5uIGRhcyB6d2VpdGUgQXJndW1lbnQgZWluIEludGVnZXIgaXN0LCBsaWVmZXJ0IHF1ZXJ5X2FjdGlvbnMoKQorICAgICAgICBlaW4gZmxhY2hlcyBBcnJheSBtaXIgZGVuIEluZm9ybWF0aW9uZW4gZW50c3ByZWNoZW5kIGRlciBCaXRtYXNrZQorICAgICAgICB6dSBhbGxlbiBWZXJiZW4gdm9uIDxvYj4uCisKKyAgICAgICAgICAgIFFBX1ZFUkIgICAgICAgICAoIDEpOiAgIGRhcyBWZXJiLAorICAgICAgICAgICAgUUFfVFlQRSAgICAgICAgICggMik6ICAgZGVyIFR5cCwKKyAgICAgICAgICAgIFFBX1NIT1JUX1ZFUkIgICAoIDQpOiAgIGRhcyBzaG9ydF92ZXJiLAorICAgICAgICAgICAgUUFfT0JKRUNUICAgICAgICggOCk6ICAgZGFzIE9iamVrdCwKKyAgICAgICAgICAgIFFBX0ZVTkNUSU9OICAgICAoMTYpOiAgIGRpZSBGdW5rdGlvbi4KKworICAgICAgICBEZXIgVHlwIGlzdCBlaW4gV2VydCB3aWUgaW4gPHNlbnQuaD4gKGJ6dy4gL3N5cy9zZW50LmgpIGRlZmluaWVydCwKKyAgICAgICAgZGVyIHZvbSBQYXJzZXIgUXVlbGxjb2RlIGdlbGllZmVydCB3aXJkLgorCisgICAgICAgICAgICBTRU5UX1BMQUlOICAgICAgIGR1cmNoIGFkZF9hY3Rpb24oZnVuLCBjbWQpIGhpbnp1Z2VmdWVndAorICAgICAgICAgICAgU0VOVF9TSE9SVF9WRVJCICBkdXJjaCBhZGRfYWN0aW9uKGZ1biwgY21kLCAxKSBoaW56dWdlZnVlZ3QKKyAgICAgICAgICAgIFNFTlRfTk9fU1BBQ0UgICAgZHVyY2ggYWRkX2FjdGlvbihmdW4pOyBhZGRfeHZlcmIoY21kKTsKKyAgICAgICAgICAgIFNFTlRfTk9fVkVSQiAgICAgbnVyIGVpbmUgRnVua3Rpb24gbWl0IGFkZF9hY3Rpb24oZnVuKSwgb2huZSBWZXJiCisgICAgICAgICAgICBTRU5UX01BUktFUiAgICAgIGludGVybiwgaXN0IG5pY2h0IGltIEFycmF5IGVudGhhbHRlbgorICAgICAgICAgICAgbmVnYXRpdmVyIFdlcnQgICBkYXMgVmVyYiBtdXNzIG51ciBpbiBkZW4gZXJzdGVuIC08d2VydD4gWmVpY2hlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZWJlcmVpbnN0aW1tZW4uCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgYWRkX2FjdGlvbihFKSwgaW5pdChBKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vcXVlcnlfY29tbWFuZCBiL2RvYy9lZnVuL3F1ZXJ5X2NvbW1hbmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJhYmRiZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL3F1ZXJ5X2NvbW1hbmQKQEAgLTAsMCArMSwzNCBAQAorU1lOT1BTSVMKKyAgICAgICAgc3RyaW5nIHF1ZXJ5X2NvbW1hbmQoKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIExpZWZlcnQgZGVuIFRleHQgZGVzIGFrdHVlbGxlbiBLb21tYW5kb3Mgb2RlciAwLCB3ZW5uIGtlaW5lcworICAgICAgICBhdXNnZWZ1ZWhydCB3aXJkLgorCisgICAgICAgIERlciBUZXh0IGVudHNwcmljaHQgZGVtLCB3YXMgZGVyIFBhcnNlciAic2llaHQiLCBhbHNvIG5hY2hkZW0KKyAgICAgICAgbW9kaWZ5X2NvbW1hbmQoKSBhdXNnZWZ1ZWhydCB1bmQgbmFjaGZvbGdlbmRlIExlZXJ6ZWljaGVuCisgICAgICAgIGFiZ2VzY2huaXR0ZW4gd3VyZGVuLgorCisgICAgICAgIHF1ZXJ5X2NvbW1hbmQoKSBsaWVmZXJ0IDAsIHdlbm4gZXMgdm9uIGVpbmVyIEZ1bmt0aW9uIGdlc3RhcnRldCB3dXJkZSwKKyAgICAgICAgZGllIHdpZWRlcnVtIHZvbiBlaW5lbSBjYWxsX291dCgpIG9kZXIgZGVtIGhlYXJ0X2JlYXQoKSBhdWZnZXJ1ZmVuCisgICAgICAgIHd1cmRlLiBBdWNoIEtvbW1hbmRpLCBkaWUgYmVpbSBVc2VybG9naW4gYXVmZ2VydWZlbiB3ZXJkZW4sIGxpZWZlcm4gMC4KKworQkVJU1BJRUwKKyAgICAgICAgdm9pZCBpbml0KCkKKyAgICAgICAgeworICAgICAgICAgICAgLi4uCisgICAgICAgICAgICBhZGRfYWN0aW9uKCJzaW5nIiwic2luZyIpOworICAgICAgICAgICAgLi4uCisgICAgICAgIH0KKworICAgICAgICBpbnQgc2luZyhzdHJpbmcgc3RyKQorICAgICAgICB7CisgICAgICAgICAgICB3cml0ZSgiRGVpbiBLb21tYW5kbyB3YXI6IitxdWVyeV9jb21tYW5kKCkrIlxuIik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgICAgIEplZGVzbWFsLCB3ZW5uIGplbWFuZCAic2luZyBibGFmYXNlbCIgZWluZ2lidCwgbGllZmVydCBkYXMgUHJvZ3JhbW0KKyAgICAgICAgIkRlaW4gS29tbWFuZG8gd2FyOiBzaW5nIGJsYWZhc2VsIi4KKworU0lFSEUgQVVDSAorICAgICAgICBhZGRfYWN0aW9uKEUpLCBxdWVyeV92ZXJiKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9xdWVyeV9ub3RpZnlfZmFpbCBiL2RvYy9lZnVuL3F1ZXJ5X25vdGlmeV9mYWlsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkOTg0MjMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9xdWVyeV9ub3RpZnlfZmFpbApAQCAtMCwwICsxLDIxIEBACitTWU5PUFNJUworICAgICAgICBtaXhlZCBxdWVyeV9ub3RpZnlfZmFpbCgpOworICAgICAgICBtaXhlZCBxdWVyeV9ub3RpZnlfZmFpbChpbnQgZmxhZyk7CisKK0JFU0NIUkVJQlVORworICAgICAgICBXZW5uIDxmbGFnPiBuaWNodCBhbmdlZ2ViZW4gb2RlciAwIGlzdCwgbGllZmVydCBkaWUgRnVua3Rpb24gZGVuIFN0cmluZworICAgICAgICBvZGVyIGRpZSBDbG9zdXJlLCBkaWUgenVsZXR6dCBhbHMgRmVobGVybWVsZHVuZyBmdWVyIGVpbiBLb21tYW5kbworICAgICAgICBnZXNldHp0IHd1cmRlIChtaXQgbm90aWZ5X2ZhaWwoKSkuCisKKyAgICAgICAgV3VyZGUga2VpbmUgTWVsZHVuZyBnZXNldHp0LCB3aXJkIDAgZ2VsaWVmZXJ0LgorCisgICAgICAgIElzdCA8ZmxhZz4gIT0gMCB3aXJkIGRhcyBPYmpla3QgenVydWVja2dlbGllZmVydCwgd2FzIGRhcyBsZXR6dGUKKyAgICAgICAgTm90aWZ5LUZhaWwgZ2VzZXR6dCBoYXQuCisKK0FFTkRFUlVOR0VOCisgICAgICAgIEVpbmdlZnVlaHJ0IGluIExETXVkIDMuMi43LgorICAgICAgICBMRE11ZCAzLjIuOCBmdWVndGUgZGVuIFBhcmFtdGVyIDxmbGFnPiBoaW56dS4KKworU0lFSEUgQVVDSAorICAgICAgICBhZGRfYWN0aW9uKEUpLCBxdWVyeV92ZXJiKEUpLCBxdWVyeV9jb21tYW5kKEUpLCBub3RpZnlfZmFpbChFKSwKKyAgICAgICAgaG9va3MoQykKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL3F1ZXJ5X3ZlcmIgYi9kb2MvZWZ1bi9xdWVyeV92ZXJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMTY1OTEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9xdWVyeV92ZXJiCkBAIC0wLDAgKzEsNTMgQEAKK1NZTk9QU0lTCisgICAgICAgIHN0cmluZyBxdWVyeV92ZXJiKCk7CisgICAgICAgIHN0cmluZyBxdWVyeV92ZXJiKGludCBmbGFnKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIExpZWZlcnQgZGFzIFZlcmIgZGVzIGFrdHVlbGxlbiBLb21tYW5kb3Mgb2RlciAwLCB3ZW5uIGtlaW4gS29tbWFuZG8KKyAgICAgICAgYmVhcmJlaXRldCB3aXJkLgorCisgICAgICAgIFdlbm4gPGZsYWc+IG5pY2h0IGFuZ2VnZWJlbiBvZGVyIDAgaXN0LCB3aXJkIGRhcyBWZXJiIHdpZSB2b20gVXNlcgorICAgICAgICBlaW5nZWdlYmVuIGdlbGllZmVydCAoZGFzIGlzdCBkYXMgZXJzdGUgV29ydCBkZXIgSW5wdXR6ZWlsZSBkZXMKKyAgICAgICAgU3BpZWxlcnMsIGJpcyB6dW0gKGFiZXIgb2huZSkgZGVuIGVyc3RlbiBMZWVyc2NobGFnIC8gWmVpbGVudW1icnVjaCkuCisgICAgICAgIFdlbm4gPGZsYWc+IG5pY2h0IDAgaXN0LCB3aXJkIGRhcyBWZXJiIGVudHNwcmVjaGVuZCBkZXIgYWRkX2FjdGlvbigpCisgICAgICAgIHp1cnVlY2sgZ2VnZWJlbi4KKworICAgICAgICBJbm5lcmhhbGIgZWluZXIgYWRkX2FjdGlvbigpLUZ1bmt0aW9uLCBkaWUgdm9uIG1laHJlcmVuIEtvbW1hbmRvcworICAgICAgICBhdWZnZXJ1ZmVuIHdpcmQga2FubiBtYW4gc28gendpc2NoZW4gZGllc2VuIEtvbW1hbmRvcyB1bnRlcnNjaGVpZGVuLgorCitCRU1FUktVTkdFTgorICAgICAgICBEaWUgZnJ1ZWhlcmUgRWluc2NocmFlbmt1bmcsIGRhc3MgYmVpIGdlc2NoYWNodGVsdGVuIEtvbW1hbmRvcworICAgICAgICBxdWVyeS12ZXJiKCkgbmFjaCBkZW0gaW5uZXJlbiBLb21tYW5kbyAwIHp1cnVlY2sgZ2lidCBpc3QgamV0enQKKyAgICAgICAgZW50ZmFsbGVuLgorCitCRUlTUElFTAorICAgICAgICB2b2lkIGluaXQoKQorICAgICAgICB7CisgICAgICAgICAgICAuLi4KKyAgICAgICAgICAgIGFkZF9hY3Rpb24oInNpbmciLCJzaW5nZSIpOworICAgICAgICAgICAgYWRkX2FjdGlvbigic2luZyIsImpvZGVsIiwgMSk7CisgICAgICAgICAgICAuLi4KKyAgICAgICAgfQorCisgICAgICAgIGludCBzaW5nKHN0cmluZyBzdHIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdyaXRlKCJEYXMgS29tbWFuZG8gd2FyOiIrcXVlcnlfdmVyYigpKyhzdHIgPyBzdHIgOiAiIikrIlxuIik7CisgICAgICAgICAgICB3cml0ZSgiRGFzIFZlcmIgd2FyOiIrcXVlcnlfdmVyYigxKSsoc3RyID8gc3RyIDogIiIpKyJcbiIpOworICAgICAgICB9CisKKyAgICAgICAgRGFzIEtvbW1hbmRvICJzaW5nIGJsYWZhc2VsIiBsaWVmZXJ0OgorICAgICAgICAgICAgRGFzIEtvbW1hbmRvIHdhcjogc2luZworICAgICAgICAgICAgRGFzIFZlcmIgd2FyOiBzaW5nCisKKyAgICAgICAgRGFzIEtvbW1hbmRvICJqb2RlbCBibGFmYXNlbCIgbGllZmVydDoKKyAgICAgICAgICAgIERhcyBLb21tYW5kbyB3YXI6IGpvZGVsCisgICAgICAgICAgICBEYXMgVmVyYiB3YXI6IGpvZGVsCisKKyAgICAgICAgRGFzIEtvbW1hbmRvICJqb2RlbGUgYmxhZmFzZWwiIGxpZWZlcnQ6CisgICAgICAgICAgICBEYXMgS29tbWFuZG8gd2FyOiBqb2RlbGUKKyAgICAgICAgICAgIERhcyBWZXJiIHdhcjogam9kZWwKKworU0lFSEUgQVVDSAorICAgICAgICBxdWVyeV9jb21tYW5kKEUpLCBhZGRfYWN0aW9uKEUpLCBBZGRDbWQoTCksIEFkZEFjdGlvbihMKQorCis3LkF1ZyAyMDA3IEdsb2luc29uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vcXVvdGUgYi9kb2MvZWZ1bi9xdW90ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTAxZmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vcXVvdGUKQEAgLTAsMCArMSwxMyBAQAorU1lOT1BTSVMKKyAgICAgICAgbWl4ZWQgcXVvdGUobWl4ZWQgYXJnKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIEtvbnZlcnRpZXJ0IGVpbiBBcnJheSB6dSBlaW5lbSBxdW90ZWQgQXJyYXkgdW5kIFN0cmluZ3MgenUgU3ltYm9sZW4uCisgICAgICAgIFN5bWJvbGUgdW5kIHF1b3RlZCBBcnJheXMgd2VyZGVuIGVybmV1dCBnZXF1b3RlZC4KKworQkVJU1BJRUwKKyAgICAgICAgcXVvdGUoImZvbyIpIC0+ICdmb28KKyAgICAgICAgcXVvdGUoKHsxLDIsM30pKSAtPiAnKHsxLDIsM30pCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgc3ltcG9scChFKSwgdW5xdW90ZShFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vcmFpc2VfZXJyb3IgYi9kb2MvZWZ1bi9yYWlzZV9lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGFjMjM0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vcmFpc2VfZXJyb3IKQEAgLTAsMCArMSwyMyBAQAorU1lOT1BTSVMKKyAgICAgICAgdm9pZCByYWlzZV9lcnJvcihzdHJpbmcgYXJnKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIEJyaWNodCBkaWUgQXVzZnVlaHJ1bmcgZGVzIGxhdWZlbmRlbiBQcm9ncmFtbXMgYWIuIFdlbm4gZGFzIFByb2dyYW1tCisgICAgICAgIGR1cmNoIGNhdGNoKCkgYXVmZ2VydWZlbiB3dXJkZSwgbGllZmVydCBkaWVzZXMgY2F0Y2goKSA8YXJnPiBhbHMKKyAgICAgICAgRmVobGVyY29kZSwgc29uc3Qgd2lyZCA8YXJnPiBhbHMgRmVobGVybWVsZHVuZyBhdXNnZWdlYmVuLgorCisgICAgICAgIHJhaXNlX2Vycm9yKCkgZ2xlaWNodCBpbiBkZXIgRnVua3Rpb24gdGhyb3coKSwgYWJlciB3YWVocmVuZCB0aHJvdygpCisgICAgICAgIGF1cyBjYXRjaCgpIGhlcmF1cyBhdWZnZXJ1ZmVuIHdlcmRlbiBzb2xsLCBrYW5uIHJhaXNlX2Vycm9yKCkgdm9uCisgICAgICAgIHVlYmVyYWxsIGhlciBhdWZnZXJ1ZmVuIHdlcmRlbi4KKworICAgICAgICBEYSByYWlzZV9lcnJvcigpIHNpY2ggd2llIGFuZGVyZSAnZWNodGUnIExhdWZ6ZWl0ZmVobGVyIHZlcmhhZWx0LAorICAgICAgICBlaW5zY2hsaWVzc2xpY2ggZGVyIEVyemV1Z3VuZyBlaW5lcyBTdGFjayBCYWNrdHJhY2VzLCBpc3QgZGllc2UKKyAgICAgICAgRnVua3Rpb24gc2VociB6ZWl0aW50ZW5zaXYuCisKK0JFTUVSS1VOR0VOCisgICAgICAgIERlciBTdHJpbmcgc29sbHRlIHVtZ2Vicm9jaGVuIG9kZXIgd2VuaWdzdGVucyBtaXQgZWluZW0gXG4gdGVybWluaWVydAorCXdlcmRlbiwgZGEgZGllIEF1c2dhYmUgZGlyZWt0IGFuIGRlbiBpbnRlcmFrdGl2ZW4gTWFnaWVyIGVyZm9sZ2VuCisJa2FubiBiencuIGF1ZiBkZW0gRGVidWctS2FuYWwgZGFzIGxldHp0ZSBaZWljaGVuIGVudGZlcm50IHdpcmQuCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgY2F0Y2goRSksIHRocm93KEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9yYW5kb20gYi9kb2MvZWZ1bi9yYW5kb20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk4NTQyYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL3JhbmRvbQpAQCAtMCwwICsxLDQyIEBACitGVU5LVElPTjoKKyAgICAgICAgaW50IHJhbmRvbShpbnQgbikKKworQVJHVU1FTlRFOgorICAgICAgICBuOiBaYWhsZW4tQmVyZWljaCBhdXMgZGVtIGdld2FlaGx0IHdlcmRlbiBzb2xsLgorCitCRVNDSFJFSUJVTkc6CisgICAgICAgIEdpYnQgZWluZSB6dWZhZWxsaWdlIFphaGwgaW0gQmVyZWljaCB2b24gMC4uKG4tMSkgenVydWVjay4KKworQkVNRVJLVU5HRU46CisgICAgICAgIERlciBOYWNodGVpbCBkZXIgWnVmYWVsbGlna2VpdCAodWViZXIgZ3Jvc3NlIFphaGxlbikgaXN0LCBkYXNzIHdlbm4KKyAgICAgICAgdmllbGUgWmFobGVuIGluIGVpbmVtIGtsZWluZW4gQmVyZWljaCBpbiBrdXJ6ZXIgWmVpdCBnZW5lcmllcnQKKyAgICAgICAgd2VyZGVuLCBlaW5pZ2UgWmFobGVuIHNlaHIgdmllbCBoYWV1ZmlnZXIgYXVmdHJldGVuIGFscyBhbmRlcmUuCisKKyAgICAgICAgRXMgc2VpIG5vY2htYWwgZGFyYXVmIGhpbmdld2llc2VuLCBkYXNzIGRlciBCZXJlaWNoIGltbWVyIGJlaSAwIAorICAgICAgICB1bmQgTklDSFQgYmVpIDEgYW5mYWVuZ3QuIEVpbiByYW5kb20oMTApIGdlaHQgYWxzbyBuaWNodCB2b24gCisgICAgICAgIDEuLjEwIHNvbmRlcm4gdm9uIDAuLjkhCisKK0JFSVNQSUVMRToKKyAgICAgICAgLy8gRWluZmFjaGUgQWJmcmFnZSB6LkIuIGF1cyBkZXIgSGl0RnVuYyBlaW5lciBXYWZmZToKKworICAgICAgICBpZihyYW5kb20oMTAxKSA+PSA3MCkgcmV0dXJuIHJhbmRvbSgxMSk7CisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAvLyBTcGllbGVyIHNvbGwgaW4gZWluZW4genVmYWVsbGlnIGF1c2dld2FlaGx0ZW4gUmF1bSBnZW1vdnQKKyAgICAgICAgLy8gd2VyZGVuOiAKKworICAgICAgICBzdHJpbmcgKmRlc3QgPSAoeyAicmF1bTEiLCJyYXVtMiIsInJhdW0zIiwicmF1bTQiLCJyYXVtNSIgfSk7CisgICAgICAgIHRoaXNfcGxheWVyKCktPm1vdmUoZGVzdFtyYW5kb20oc2l6ZW9mKGRlc3QpKV0sTV9HT3xNX05PQ0hFQ0spOworCisgICAgICAgIC8vIEVzIHNvbGwgZWluZSB6dWZhZWxsaWdlIE1lbGR1bmcgYXVzZ2VnZWJlbiB3ZXJkZW46CisKKyAgICAgICAgdGVsbF9vYmplY3QodGhpc19wbGF5ZXIoKSwKKyAgICAgICAgICh7ICJFcyBrbmFja3QuXG4iLCAiRGlyIGlzdCBrYWx0LlxuIiwgIkR1IHNjaHdpdHp0LlxuIiwKKyAgICAgICAgICAgICJEdSBiZWtvbW1zdCBBbmdzdC5cbiIsICJIaW50ZXIgRGlyIGtuYWNrdCBlcyBpbSBHZWJ1ZXNjaC5cbiIsCisgICAgICAgICAgICAiRWluIGt1ZWhsZXIgV2luZCBrb21tdCBhdWYuXG4iIH0pW3JhbmRvbSg2KV0pOworCisgICAgICAgIFdpZSBtYW4gc2llaHQsIGdpYnQgZXMgZnVlciByYW5kb20oKSB2aWVsZSBzY2hvZW5lIEVpbnNhdHotCisgICAgICAgIG1vZWdsaWNoa2VpdGVuLiBXb2JlaSBsZXR6dGVyZXMgQmVpc3BpZWwgdWViZXIgQWRkUm9vbU1lc3NhZ2UKKyAgICAgICAgKGZ1ZXIgUmFldW1lKSB2aWVsIGVpbmZhY2hlciB1bXp1c2V0emVuIGlzdC4KKworNy5BdWcgMjAwNyBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vcmVhZF9ieXRlcyBiL2RvYy9lZnVuL3JlYWRfYnl0ZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVjYWJiZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL3JlYWRfYnl0ZXMKQEAgLTAsMCArMSwxOSBAQAorU1lOT1BTSVMKKyAgICAgICAgc3RyaW5nIHJlYWRfYnl0ZXMoc3RyaW5nIGZpbGUsIGludCBzdGFydCwgaW50IGFuemFobCkKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIExpZXN0IGVpbmUgYmVzdGltbXRlIEFuemFobCBCeXRlcyBhdXMgZGVtIEZpbGUgPGZpbGU+LiBXZW5uIDxzdGFydD4KKyAgICAgICAgbmljaHQgYW5nZWdlYmVuIG9kZXIgMCBpc3QsIHdpcmQgZGFzIEZpbGUgdm9uIEJlZ2lubiB3ZWcgZ2VsZXNlbiwKKyAgICAgICAgc29uc3Qgdm9tIEJ5dGUgbWl0IGRlciBOdW1tZXIgPHN0YXJ0Pi4gV2VubiA8c3RhcnQ+IG5lZ2F0aXYgaXN0LAorICAgICAgICB3ZXJkZW4gZGllIEJ5dGVzIHZvbSBFbmRlIGRlcyBGaWxlcyBoZXIgZ2V6YWVobHQuIDxhbnphaGw+IGlzdCBkaWUKKyAgICAgICAgQW56YWhsIEJ5dGVzLCBkaWUgZ2VsZXNlbiB3ZXJkZW4gc29sbGVuLiBXZXJ0ZSB2b24gMCBvZGVyIG5lZ2F0aXZlCisgICAgICAgIFdlcnRlIHNpbmQgendhciBtb2VnbGljaCwgYWJlciB3ZW5pZyBzaW5udm9sbC4KKworICAgICAgICBXZW5uIDxzdGFydD4gYXVzc2VyaGFsYiBkZXIgR3JvZXNzZSBkZXMgRmlsZXMgbGllZ3QsIGxpZWZlcnQKKyAgICAgICAgcmVhZF9ieXRlKCkgYW5zdGVsbGUgZWluZXMgU3RyaW5ncyAwIHp1cnVlY2suCisKKyAgICAgICAgRGllIG1heC4gQW56YWhsIGVpbnp1bGVzZW5kZXIgQnl0ZXMgcHJvIEF1ZnJ1ZiBkaWVzZXIgRnVua3Rpb24KKyAgICAgICAgYmV0cmFlZ3QgTElNSVRfQllURSAocy4gcXVlcnlfbGltaXRzKCkpLgorCitTSUVIRSBBVUNICisgICAgICAgIHJlYWRfZmlsZShFKSwgd3JpdGVfYnl0ZXMoRSksIHdyaXRlX2ZpbGUoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL3JlYWRfZmlsZSBiL2RvYy9lZnVuL3JlYWRfZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjFjY2ZjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vcmVhZF9maWxlCkBAIC0wLDAgKzEsMTkgQEAKK1NZTk9QU0lTCisgICAgICAgIHN0cmluZyByZWFkX2ZpbGUoc3RyaW5nIGZpbGUsIGludCBzdGFydCwgaW50IGFuemFobCkKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIExpZXN0IFplaWxlbiBhdXMgZWluZW0gRmlsZSA8ZmlsZT4uIFdlbm4gPHN0YXJ0PiBhbmdlZ2ViZW4gaXN0IHVuZAorICAgICAgICBuaWNodCAwLCB3aXJkIHZvbiBCZWdpbm4gZGVyIFplaWxlIDxzdGFydD4gYW4gZ2VsZXNlbjsgaXN0IDxzdGFydD4gMAorICAgICAgICBvZGVyIG5pY2h0IGFuZ2VnZWJlbiwgd2lyZCB2b20gQmVnaW5uIGRlcyBGaWxlcyBnZWxlc2VuLgorCisgICAgICAgIFdlbm4gPGFuemFobD4gbmljaHQgYW5nZWdlYmVuIG9kZXIgMCBpc3QsIHdpcmQgZGFzIGdlc2FtdGUgRmlsZQorICAgICAgICBnZWxlc2VuLCBzb25zdCBudXIgPGFuemFobD4gWmVpbGVuLgorCisgICAgICAgIFdlbm4gPHN0YXJ0PiBhdXNzZXJoYWxiIGRlciBHcm9lc3NlIGRlcyBGaWxlcyBsaWVndCwgbGllZmVydAorICAgICAgICByZWFkX2ZpbGUoKSBhbnN0ZWxsZSBlaW5lcyBTdHJpbmdzIDAgenVydWVjay4KKworICAgICAgICBEaWUgbWF4LiBBbnphaGwgZWluenVsZXNlbmRlciBCeXRlcyAobmljaHQgWmVpbGVuISkgcHJvIEF1ZnJ1ZiBkaWVzZXIKKyAgICAgICAgRnVua3Rpb24gYmV0cmFlZ3QgTElNSVRfRklMRSAocy4gcXVlcnlfbGltaXRzKCkpLgorCitTSUVIRSBBVUNICisgICAgICAgIHJlYWRfYnl0ZXMoRSksIHdyaXRlX2ZpbGUoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL3JlZmVyZW5jZXAgYi9kb2MvZWZ1bi9yZWZlcmVuY2VwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMmMwZGYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9yZWZlcmVuY2VwCkBAIC0wLDAgKzEsMTMgQEAKK1NZTk9QU0lTCisgICAgICAgIGludCByZWZlcmVuY2VwKG1peGVkIGFyZykKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIExpZWZlcnQgMSwgd2VubiBkYXMgQXJndW1lbnQgYW4gZGllIGFrdHVlbGxlIEZ1bmt0aW9uIHBlciBSZWZlcmVuegorICAgICAgICB1ZWJlcmdlYmVuIHd1cmRlLCBhbnNvbnN0ZW4gMC4KKworICAgICAgICBNYW4gYmVhY2h0ZSwgZGFzcyBkYXMgQXJndW1lbnQgYWxzIFJlZmVyZW56IGFuIHJlZmVyZW5jZXAoKQorICAgICAgICB1ZWJlcmdlYmVuIHdlcmRlbiBtdXNzLCB6LiBCLiByZWZlcmVuY2VwKCZ4KS4KKworU0lFSEUgQVVDSAorICAgICAgICBjbG9zdXJlcChFKSwgZmxvYXRwKEUpLCBtYXBwaW5ncChFKSwgb2JqZWN0cChFKSwgaW50cChFKSwKKyAgICAgICAgcG9pbnRlcnAoRSksIHN0cmluZ3AoRSksIHN5bWJvbHAoRSksIGNsb25lcChFKSwgcmVmZXJlbmNlcyhMUEMpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9yZWdleHAgYi9kb2MvZWZ1bi9yZWdleHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU0ZTZhNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL3JlZ2V4cApAQCAtMCwwICsxLDQxIEBACitTWU5PUFNJUworICAgICAgICAjaW5jbHVkZSA8cmVnZXhwLmg+CisKKyAgICAgICAgc3RyaW5nICpyZWdleHAoc3RyaW5nICpsaXN0LCBzdHJpbmcgcGF0dGVybikKKyAgICAgICAgc3RyaW5nICpyZWdleHAoc3RyaW5nICpsaXN0LCBzdHJpbmcgcGF0dGVybiwgaW50IG9wdCkKKworREVTQ1JJUFRJT04KKyAgICAgICAgTWF0Y2ggdGhlIHBhdHRlcm4gPHBhdHRlcm4+IChpbnRlcnByZXRlZCBhY2NvcmRpbmcgdG8gPG9wdD4gaWYKKyAgICAgICAgZ2l2ZW4pIGFnYWluc3QgYWxsIHN0cmluZ3MgaW4gbGlzdCwgYW5kIHJldHVybiBhIG5ldyBhcnJheSB3aXRoIGFsbAorICAgICAgICBzdHJpbmdzIHRoYXQgbWF0Y2hlZC4KKworICAgICAgICBJZiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgcmVndWxhciBleHByZXNzaW9uLCBhIHJ1bnRpbWUKKyAgICAgICAgZXJyb3Igd2lsbCBiZSByYWlzZWQuCisKK0VYQU1QTEUKKyAgICAgICAgc3RyaW5nIHN0cnM7CisgICAgICAgIHN0cmluZyBwYXR0ZXJuOworICAgICAgICAKKyAgICAgICAgaWYgKHJlZ2V4cF9wYWNrYWdlKCkgPT0gUkVfUENSRSkKKyAgICAgICAgICAgIHBhdHRlcm4gPSAiXFw8aGVscFxcPi4qXFw8bWVcXD4iOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwYXR0ZXJuID0gIlxcYmhlbHBcXGIuKlxcYm1lXFxiIjsKKworICAgICAgICBpZiAoc3RycyA9IHJlZ2V4cCggKHsicGxlYXNlLCBoZWxwIG1lIFNpciBKb2huLiJ9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAsIHBhdHRlcm4KKyAgICAgICAgICAgICAgICAgICAgICAgICApKQorICAgICAgICB7CisgICAgICAgICAgIGlmIChzaXplb2Yoc3RycykKKyAgICAgICAgICAgICAgd3JpdGUoIkl0IG1hdGNoZXMuXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gd2lsbCB0ZXN0IHRoZSBnaXZlbiBzdHJpbmcgKHdoaWNoIGlzCisgICAgICAgIHBhY2tlZCBpbnRvIGFuIGFycmF5KSBpZiB0aGVyZSBpcyBzb21ldGhpbmcgbGlrZSAiaGVscCAuLi4gbWUiCisgICAgICAgIGluc2lkZSBvZiBpdC4KKworSElTVE9SWQorICAgICAgICBMRE11ZCAzLjMgYWRkZWQgdGhlIG9wdGlvbmFsIDxvcHQ+IGFyZ3VtZW50LgorCitTRUUgQUxTTworICAgICAgICByZWdleHBsb2RlKEUpLCByZWdtYXRjaChFKSwgcmVncmVwbGFjZShFKSwgcmVnZXhwX3BhY2thZ2UoRSksIHNzY2FuZihFKSwKKyAgICAgICAgcmVnZXhwKEMpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9yZWdleHBfcGFja2FnZSBiL2RvYy9lZnVuL3JlZ2V4cF9wYWNrYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiOGQyOWYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9yZWdleHBfcGFja2FnZQpAQCAtMCwwICsxLDQ4IEBACitTWU5PUFNJUworICAgICAgICAjaW5jbHVkZSA8cmVnZXhwLmg+CisKKyAgICAgICAgaW50IHJlZ2V4cF9wYWNrYWdlKCkKKworREVTQ1JJUFRJT04KKyAgICAgICAgUmV0dXJuIHdoaWNoIHJlZ2V4cCBwYWNrYWdlIGlzIHVzZWQgYnkgZGVmYXVsdDoKKworICAgICAgICAgIFJFX1RSQURJVElPTkFMOiB0cmFkaXRpb25hbCByZWdleHBzCisgICAgICAgICAgUkVfUENSRTogICAgICAgIFBDUkUKKworICAgICAgICBBcyB0aGUgcGFja2FnZSBjYW4gYmUgc2VsZWN0ZWQgYXQgcnVudGltZSB0aHJvdWdoIHRoZQorICAgICAgICBSRUdFWFBfUEFDS0FHRSBkcml2ZXIgaG9vaywgdGhlcmUgaXMgbm8gZ29vZCB3YXkgdG8gZGV0ZXJtaW5lCisgICAgICAgIHRoZSBwYWNrYWdlIGF0IExQQyBjb21waWxlIHRpbWUuCisgICAgICAgIE1hdGNoIHRoZSBwYXR0ZXJuIDxwYXR0ZXJuPiAoaW50ZXJwcmV0ZWQgYWNjb3JkaW5nIHRvIDxvcHQ+IGlmCisgICAgICAgIGdpdmVuKSBhZ2FpbnN0IGFsbCBzdHJpbmdzIGluIGxpc3QsIGFuZCByZXR1cm4gYSBuZXcgYXJyYXkgd2l0aCBhbGwKKyAgICAgICAgc3RyaW5ncyB0aGF0IG1hdGNoZWQuCisKKyAgICAgICAgSWYgdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiwgYSBydW50aW1lCisgICAgICAgIGVycm9yIHdpbGwgYmUgcmFpc2VkLgorCitFWEFNUExFCisgICAgICAgIHN0cmluZyBzdHJzOworICAgICAgICBzdHJpbmcgcGF0dGVybjsKKyAgICAgICAgCisgICAgICAgIGlmIChyZWdleHBfcGFja2FnZSgpID09IFJFX1BDUkUpCisgICAgICAgICAgICBwYXR0ZXJuID0gIlxcPGhlbHBcXD4uKlxcPG1lXFw+IjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcGF0dGVybiA9ICJcXGJoZWxwXFxiLipcXGJtZVxcYiI7CisKKyAgICAgICAgaWYgKHN0cnMgPSByZWdleHAoICh7InBsZWFzZSwgaGVscCBtZSBTaXIgSm9obi4ifSksCisgICAgICAgICAgICAgICAgICAgICAgICAgLCBwYXR0ZXJuCisgICAgICAgICAgICAgICAgICAgICAgICAgKSkKKyAgICAgICAgeworICAgICAgICAgICBpZiAoc2l6ZW9mKHN0cnMpCisgICAgICAgICAgICAgIHdyaXRlKCJJdCBtYXRjaGVzLlxuIik7CisgICAgICAgIH0KKworICAgICAgICBUaGUgcmVndWxhciBleHByZXNzaW9uIHdpbGwgdGVzdCB0aGUgZ2l2ZW4gc3RyaW5nICh3aGljaCBpcworICAgICAgICBwYWNrZWQgaW50byBhbiBhcnJheSkgaWYgdGhlcmUgaXMgc29tZXRoaW5nIGxpa2UgImhlbHAgLi4uIG1lIgorICAgICAgICBpbnNpZGUgb2YgaXQuCisKK0hJU1RPUlkKKyAgICAgICAgSW50cm9kdWNlZCBpbiBMRE11ZCAzLjMuNjM0LgorCitTRUUgQUxTTworICAgICAgICByZWdleHAoRSksIHJlZ2V4cGxvZGUoRSksIHJlZ21hdGNoKEUpLCByZWdyZXBsYWNlKEUpLCBzc2NhbmYoRSksCisgICAgICAgIHJlZ2V4cChDKSwgcmVnZXhwX3BhY2thZ2UoSCkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL3JlZ2V4cGxvZGUgYi9kb2MvZWZ1bi9yZWdleHBsb2RlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NWU5ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9yZWdleHBsb2RlCkBAIC0wLDAgKzEsMjggQEAKK1NZTk9QU0lTCisgICAgICAgICNpbmNsdWRlIDxyZWdleHAuaD4KKworICAgICAgICBzdHJpbmcgKnJlZ2V4cGxvZGUgKHN0cmluZyB0ZXh0LCBzdHJpbmcgcGF0dGVybikKKyAgICAgICAgc3RyaW5nICpyZWdleHBsb2RlIChzdHJpbmcgdGV4dCwgc3RyaW5nIHBhdHRlcm4sIGludCBvcHQpCisKK0RFU0NSSVBUSU9OCisgICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byBleHBsb2RlIGJ1dCBhY2NlcHRzIGEgcmVndWxhcgorICAgICAgICBleHByZXNzaW9uIDxwYXR0ZXJuPiBhcyBkZWxpbWl0ZXIgKGludGVycHJldGVkIGFjY29yZGluZyB0byA8b3B0PgorICAgICAgICBpZiBnaXZlbikuCisKKyAgICAgICAgSWYgZmxhZyBSRV9PTUlUX0RFTElNIGlzIG5vdCBzZXQgaW4gPG9wdD4sIHRoZW4gZXZlcnkgc2Vjb25kIGVsZW1lbnQKKyAgICAgICAgaW4gdGhlIHJlc3VsdCB2ZWN0b3Igd2lsbCBiZSB0aGUgdGV4dCB0aGF0IG1hdGNoZWQgdGhlIGRlbGltaXRlci4KKyAgICAgICAgSWYgdGhlIGZsYWcgaXMgc2V0LCB0aGVuIHRoZSByZXN1bHQgdmVjdG9yIHdpbGwgY29udGFpbiBvbmx5CisgICAgICAgIHRoZSB0ZXh0IGJldHdlZW4gdGhlIGRlbGltaXRlcnMuCisKK0VYQU1QTEVTCisgICAgICAgIHJlZ2V4cGxvZGUoImFiY2RlZiIsICJjZGUiKSAgICAgICAgICAgICAgICAtPiAoeyAiYWIiLCAiY2RlIiwgImYiIH0pCisgICAgICAgIHJlZ2V4cGxvZGUoImFiY2RlZiIsICJjZGUiLCBSRV9PTUlUX0RFTElNKSAtPiAoeyAiYWIiLCAiZiIgfSkKKworSElTVE9SWQorICAgICAgICBJbnRyb2R1Y2VkIGluIDMuMkA2MQorICAgICAgICBMRE11ZCAzLjMgYWRkZWQgdGhlIG9wdGlvbmFsIDxvcHQ+IGFyZ3VtZW50IGFuZCB0aGUgUkVfT01JVF9ERUxJTQorICAgICAgICAgIGZsYWcuCisKK1NFRSBBTFNPCisgICAgICAgIGV4cGxvZGUoRSksIHJlZ2V4cChFKSwgcmVnbWF0Y2goRSksIHJlZ3JlcGxhY2UoRSksCisgICAgICAgIHJlZ2V4cF9wYWNrYWdlKEUpLCByZWdleHAoQykKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL3JlZ21hdGNoIGIvZG9jL2VmdW4vcmVnbWF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJiNzNmNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL3JlZ21hdGNoCkBAIC0wLDAgKzEsNDYgQEAKK1NZTk9QU0lTCisgICAgICAgICNpbmNsdWRlIDxyZWdleHAuaD4KKworICAgICAgICBzdHJpbmcgIHJlZ21hdGNoIChzdHJpbmcgdGV4dCwgc3RyaW5nIHBhdHRlcm4pCisgICAgICAgIHN0cmluZyAgcmVnbWF0Y2ggKHN0cmluZyB0ZXh0LCBzdHJpbmcgcGF0dGVybiwgaW50IG9wdCkKKyAgICAgICAgc3RyaW5nICByZWdtYXRjaCAoc3RyaW5nIHRleHQsIHN0cmluZyBwYXR0ZXJuLCBpbnQgb3B0LCBpbnQgc3RhcnQpCisgICAgICAgIHN0cmluZyAqcmVnbWF0Y2ggKHN0cmluZyB0ZXh0LCBzdHJpbmcgcGF0dGVybiwgaW50IG9wdCkKKyAgICAgICAgc3RyaW5nICpyZWdtYXRjaCAoc3RyaW5nIHRleHQsIHN0cmluZyBwYXR0ZXJuLCBpbnQgb3B0LCBpbnQgc3RhcnQpCisKK0RFU0NSSVBUSU9OCisgICAgICAgIE1hdGNoIHRoZSBzdHJpbmcgPHR4dD4gYWdhaW5zdCA8cGF0dGVybj4gKGludGVycHJldGVkIGFjY29yZGluZworICAgICAgICB0byA8b3B0PiBpZiBnaXZlbikuIElmIDxzdGFydD4gaXMgZ2l2ZW4sIGl0IGlzIHRoZSBzdGFydAorICAgICAgICBwb3NpdGlvbiBmb3IgdGhlIG1hdGNoIGFuZCBtdXN0IGJlIGluIHRoZSByYW5nZSBbMC4uc3RybGVuKHRleHQpXS4KKworICAgICAgICBJZiB0aGVyZSBpcyBubyBtYXRjaCwgdGhlIHJlc3VsdCBpcyAwLiBJZiB0aGVyZSBpcyBhIG1hdGNoLCB0aGUgZXhhY3QKKyAgICAgICAgcmVzdWx0IGlzIGRldGVybWluZWQgYnkgdGhlIGZsYWcgUkVfTUFUQ0hfU1VCUzoKKworICAgICAgICBJZiB0aGUgZmxhZyBSRV9NQVRDSF9TVUJTIGlzIG5vdCBzZXQsIHRoZSByZXN1bHQgaXMgdGhlIG1hdGNoZWQKKyAgICAgICAgZXhwcmVzc2lvbi4KKworICAgICAgICBJZiB0aGUgZmxhZyBSRV9NQVRDSF9TVUJTIGlzIHNldCwgdGhlIHJlc3VsdCBpcyBhbiBhcnJheSBvZiB0aGUKKyAgICAgICAgbWF0Y2hlZCBzdHJpbmcocykgb2YgdGhlIGZpcnN0IG1hdGNoLiBFbnRyeSBbMF0gaXMgdGhlIGZ1bGwgc3RyaW5nCisgICAgICAgIG1hdGNoaW5nIHRoZSA8cGF0dGVybj4sIGZvbGxvd2luZyBlbnRyaWVzIGFyZSB0aGUgc3RyaW5nIHNlZ21lbnRzCisgICAgICAgIG1hdGNoaW5nIHBhcmVudGhlc2l6ZWQgc3ViZXhwcmVzc2lvbnMgaW4gPHBhdHRlcm4+LiBJZiBhIHBhcnRpY3VsYXIKKyAgICAgICAgc3ViZXhwcmVzc2lvbiBkaWRuJ3QgaGF2ZSBhIG1hdGNoLCB0aGUgY29ycmVzcG9uZGluZyBhcnJheSBlbnRyeSB3aWxsCisgICAgICAgIGJlIDAuCisKKyAgICAgICAgVGhlIGxhc3QgZW50cnkgaW4gdGhlIGFycmF5IHdpbGwgYmUgdGhlIG5ldyBzdGFydCBpbmRleCBpbiBjYXNlIHlvdQorICAgICAgICB3YW50IHRvIHJlcGVhdCB0aGUgbWF0Y2ggb24gdGhlIHJlbWFpbmluZyBwYXJ0cyBvZiB0aGUgc3RyaW5nLiBUaGlzCisgICAgICAgIG5ldyBpbmRleCBpcyB1c3VhbGx5IGVxdWFsIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoLCBidXQgYXQgbGVhc3Qgb25lCisgICAgICAgIGhpZ2hlciB0aGFuIHRoZSBvcmlnaW5hbCBzdGFydCBpbmRleC4KKworRVhBTVBMRQorICAgICAgICByZWdtYXRjaCgiYWJjZGVmY2RmIiwgImNkIikgICAgLT4gImNkIgorICAgICAgICByZWdtYXRjaCgiYWJjZGVmY2RmIiwgImNkKGUpIikgLT4gImNkZSIKKworICAgICAgICByZWdtYXRjaCgiYWJjZGVmY2RmIiwgImNkIiwgUkVfTUFUQ0hfU1VCUykgICAgLT4gKHsgImNkIiB9KQorICAgICAgICByZWdtYXRjaCgiYWJjZGVmY2RmIiwgImNkKGUpIiwgUkVfTUFUQ0hfU1VCUykgLT4gKHsgImNkZSIsICJlIiB9KQorCitISVNUT1JZCisgICAgICAgIEludHJvZHVjZWQgaW4gTERNdWQgMy4zLjE5OC4KKyAgICAgICAgTW9kaWZpZWQgaW4gMy4zLjIxNCB0byByZXR1cm4gMCBmb3Igbm9uLW1hdGNoZXMsIGFuZCB0byB0YWtlIGFuZAorICAgICAgICByZXR1cm4gYSBzdGFydCBwb3NpdGlvbi4KKworU0VFIEFMU08KKyAgICAgICAgcmVnZXhwbG9kZShFKSwgcmVncmVwbGFjZShFKSwgcmVnZXhwKEUpLCByZWdleHBfcGFja2FnZShFKSwgcmVnZXhwKEMpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9yZWdyZXBsYWNlIGIvZG9jL2VmdW4vcmVncmVwbGFjZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDU5YmIyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vcmVncmVwbGFjZQpAQCAtMCwwICsxLDU3IEBACitTWU5PUFNJUworICAgICBzdHJpbmcgcmVncmVwbGFjZShzdHJpbmcgdHh0LCBzdHJpbmcgcGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nfGNsb3N1cmUgcmVwbGFjZXBhdHRlcm4sIGludCBmbGFncykKKworQkVTQ0hSRUlCVU5HCisgICAgIERpZSBGdW5rdGlvbiBkdXJjaHN1Y2h0IGRlbiBTdHJpbmcgdHh0IG5hY2ggZWluZW0gVm9ya29tbWVuCisgICAgIGRlcyByZWd1bGFlcmVuIEF1c2RydWNrcyBwYXR0ZXJuLCB1bmQgZXJzZXR6dCBpaG4gZHVyY2gKKyAgICAgZGVuIFN0cmluZyByZXBsYWNlcGF0dGVybi4gKHJlcGxhY2VwYXR0ZXJuIGthbm4gYXVjaCBlaW5lIENsb3N1cmUKKyAgICAgc2Vpbi4gU2llIGJla29tbXQgYWxzIGFyZ3VtZW50IGRlbiBwYXNzZW5kZW4gU3Vic3RyaW5nIHVuZCBtdXNzCisgICAgIGRlbiBFcnNhdHpzdHJpbmcgenVydWVja2xpZWZlcm4uKQorCisgICAgIEltIHJlcGxhY2VzdHJpbmcga2FubiBtYW4gdmlhICcmJyBhdWYgZGVuIHp1bSBTdWNoYXVzZHJ1Y2sKKyAgICAgcGFzc2VuZGVuIFRlaWxzdHJpbmcgaW0gT3JpZ2luYWwgenVncmVpZmVuLiBNaXQgXG4gKHdvYmVpIG4KKyAgICAgZWluZSBHYW56emFobCBpc3QpIGthbm4gbWFuIGF1ZiBkZW4gbi10ZW4gVW50ZXJhdXNkcnVjaworICAgICBkZXMgcmVndWxhZXJlbiBBdXNkcnVja3MgenVncmVpZmVuLiBVbSAiJiIgb2RlciAiXFwxIiBhbHMKKyAgICAgRXJzZXR6dW5nIHp1IGVycmVpY2hlbiwgbXVzcyAiXFwmIiBiencgIlxcXFwxIiB2ZXJ3ZW5kZXQgd2VyZGVuLgorCisgICAgIEJlaW0gRmxhZyBiZXN0aW1tdCBlaW4gZ2VzZXR6dGVzIEJpdCAwLCBkYXNzIGRlciBBdXNkcnVjayBzbyBvZnQKKyAgICAgd2llIHZvcmhhbmRlbiBlcnNldHp0IHdpcmQsIHNvbnN0IG51ciBkYXMgZXJzdGUgQXVmdHJldGVuLgorICAgICBCaXQgMSBiZXN0aW1tdCwgb2IgZGVyIHJlZ3VsYWVyZSBBdXNkcnVjayAnZWQnIG9kZXIgJ3NlZCcga29tcGF0aWJlbAorICAgICBpc3QgKEJpdCBnZWxvZXNjaHQpIG9kZXIgJ2V4JyBrb21wYXRpYmVsIChnZXNldHp0KS4KKworICAgICBEaWUgRnVua3Rpb24gd2lya3Qgd2llIHMvcGF0dGVybi9yZXBsYWNlcGF0dGVybi9mbGFncyBpbgorICAgICBFZGl0b3JlbiB3aWUgdmkgb2RlciBzZWQuIFNpZSBpc3QgYmVzb25kZXJzIGd1dCBnZWVpZ25ldCB1bQorICAgICB2YXJpYWJsZSBTdHJpbmdzIHp1IGVyc2V0emVuLCBpbSBHZWdlbnNhdHogenUgcmVnZXhwbG9kZSwgd28KKyAgICAgbWFuIGRlbiBTdHJpbmcgbnVyIG5hY2ggZWluZW0gcmVndWxhZXJlbiBBdXNkcnVjayB6ZXJsZWdlbiBrYW5uLgorCitCRUlTUElFTEUKKyAgICAgLy8gZXJzZXR6dCBAQHdlckBAIGR1cmNoIGRlbiBOYW1lbiBkZXMgT2JqZWt0ZXMKKyAgICAgcmVncmVwbGFjZShzdHIsIkBAd2VyQEAiLChzdHJpbmcpb2JqLT5uYW1lKFdFUiwyKSwxKQorCisgICAgIC8vIGVyc2V0emUgYWxsZSBkb3BwZWx0ZW4gTGVlcnplaWNoZW4gZHVyY2ggZWluIGVpbnplbG5lcworICAgICByZWdyZXBsYWNlKHN0ciwgIiAgKiIsICIgIiwgMSk7CisKKyAgICAgLy8gU3VjaHQgbmFjaCAndGVpbHQgRGlyIG1pdDogJyB1bmQgc2NobGllc3N0IGRlbiBuYWNoZm9sZ2VuZGVuCisgICAgIC8vIFRleHQgbWl0IDx1bmRlcmxpbmU+IHVuZCA8L3VuZGVybGluZT4gZWluOyBiZWkgamVkZW0gQXVmdHJldGVuLgorCisgICAgIG1zZ2luID0gcmVncmVwbGFjZShtc2dpbiwgInRlaWx0IERpciBtaXQ6ICguKikiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZWlsdCBEaXIgbWl0OiA8dW5kZXJsaW5lPlxcMTwvdW5kZXJsaW5lPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisKKyAgICAgLy8gRXJzZXR6dCBkaWUgPHVuZGVybGluZT4gaHRtbC1UYWdzIGR1cmNoIGRpZSB2dDEwMAorICAgICAvLyBFc2NhcGUtU2VxdWVuemVuIGZ1ZXIgVW50ZXJzdHJlaWNodW5nCisgICAgIHR4dCA9IHJlZ3JlcGxhY2UodHh0LCAiPHVuZGVybGluZT4iLCAiPEVTQz5bNW0iLCAxKTsKKworICAgICAvLyBFcnNldHp0IGRhcyBXb3J0IEhPVVNFIGluIEtsZWluYnVjaHN0YWJlbi4KKyAgICAgdHh0ID0gcmVncmVwbGFjZSh0eHQsICJIT1VTRSIsICMnbG93ZXJfY2FzZSwgMSk7CisKK0JVR1M6CisgICAgIEkgaGF2ZSB3cml0dGVuIHRoYXQgZWZ1bi4gSXQgZG9lc24ndCBoYXZlIEJVR1MuIEJ5IGRlZmluaXRpb24uCisgICAgIFdlbGwsIGluIGZhY3QgaXQgY3Jhc2hlZCBhcyBJIGZpcnN0IHRyaWVkIGl0IG9uIHJ1bm5pbmcgVEFQUE11ZC4KKyAgICAgKnNpZ2gqCisgICAgIE1hcmN1c0BUQVBQTXVkCisKK1NJRUhFIEFVQ0gKKyAgICAgVmVyd2FuZHQ6IHJlZ2V4cChFKSwgcmVnZXhwbG9kZShFKSwgc3NjYW5mKEUpCisgICAgIEFlaG5saWNoOiByZXBsYWNlX3BlcnNvbmFsKEwpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9yZW1vdmVfYWN0aW9uIGIvZG9jL2VmdW4vcmVtb3ZlX2FjdGlvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTM5YTUxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vcmVtb3ZlX2FjdGlvbgpAQCAtMCwwICsxLDIxIEBACitTWU5PUFNJUworICAgICAgICBpbnQgcmVtb3ZlX2FjdGlvbihpbnR8c3RyaW5nIHZlcmIpOworICAgICAgICBpbnQgcmVtb3ZlX2FjdGlvbihpbnR8c3RyaW5nIHZlcmIsIG9iamVjdCBvYmopOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgV2VubiA8dmVyYj4gZWluIFN0cmluZyBpc3Q6IGVudGZlcm5lIGRhcyBlcnN0ZSBpbSBPYmpla3QgPG9iaj4gZHVyY2gKKyAgICAgICAgYWRkX2FjdGlvbigpIGRlZmluaWVydGUgS29tbWFuZG8gPHZlcmI+LiBXZW5uIDxvYmo+IG5pY2h0CisgICAgICAgIGFuZ2VnZWJlbiB3aXJkLCB3aXJkIHN0YW5kYXJkbWFlc3NpZyB0aGlzX3BsYXllcigpIHZlcndlbmRldC4KKyAgICAgICAgR2liIDEgenVydWVjaywgd2VubiBlaW4gS29tbWFuZG8gZ2VmdW5kZW4gdW5kIGVudGZlcm50IHd1cmRlLAorICAgICAgICBzb25zdCAwLgorCisgICAgICAgIFdlbm4gPHZlcmI+IGVpbiBJbnRlZ2VyIGlzdDogd2VubiB2ZXJiIG5pY2h0IDAgaXN0LCBlbnRmZXJuZSBhbGxlCisgICAgICAgIGR1cmNoIGRhcyBPYmpla3QgPG9iaj4gZGVmaW5pZXJ0ZW4gS29tbWFuZGkuIFdlbm4gPG9iaj4gbmljaHQKKyAgICAgICAgYW5nZWdlYmVuIHdpcmQsIHdpcmQgc3RhbmRhcmRtYWVzc2lnIHRoaXNfcGxheWVyKCkgdmVyd2VuZGV0LiBHaWJ0CisgICAgICAgIGRpZSBBbnphaGwgZGVyIGVudGZlcm50ZW4gS29tbWFuZGkgenVydWVjay4KKworU0lFSEUgQVVDSAorICAgICBWZXJ3YW5kdDogICAgICBhZGRfYWN0aW9uKEUpLCBpbml0KEUpCisgICAgIEFsdGVybmF0aXY6CUFkZEFjdGlvbihMKSwgQWRkQ21kKEwpCisKKzcuQXVnIDIwMDcgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9lZnVuL3JlbW92ZV9jYWxsX291dCBiL2RvYy9lZnVuL3JlbW92ZV9jYWxsX291dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWEyMmRiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vcmVtb3ZlX2NhbGxfb3V0CkBAIC0wLDAgKzEsMzIgQEAKK1NZTk9QU0lTCisgICAgICAgIGludCByZW1vdmVfY2FsbF9vdXQoc3RyaW5nIGZ1bik7CisgICAgICAgIGludCByZW1vdmVfY2FsbF9vdXQoY2xvc3VyZSBmdW4pOworCitCRVNDSFJFSUJVTkc6CisgICAgICAgIEVudGZlcm50IGRlbiBuYWVjaHN0ZW4gbGF1ZmVuZGVuIGNhbGxfb3V0KCkgYXVmIGRpZSBGdW5rdGlvbiA8ZnVuPgorICAgICAgICBpbSBha3R1ZWxsZW4gT2JqZWt0IGJ6dy4gZGVuIG5hZWNoc3RlbiBsYXVmZW5kZW4gY2FsbF9vdXQoKSBhdWYgZGllCisgICAgICAgIENsb3N1cmUgPGZ1bj4uIERpZSB2ZXJibGVpYmVuZGUgWmVpdCB3aXJkIHp1cnVlY2tnZWxpZWZlcnQuCisKKyAgICAgICAgV2VubiBlcyBrZWluZSBsYXVmZW5kZW4gY2FsbF9vdXQoKXMgYXVmIGdpYnQsIHdpcmQgLTEgenVydWVjaworICAgICAgICBnZWxpZWZlcnQuCisKK0JFSVNQSUVMCisgICAgICAgIFVtIGFsbGUgY2FsbF9vdXQoKXMgYXVmIE1laW5lRnVua3Rpb24oKSB6dSBlbnRmZXJuZW46CisKKyAgICAgICAgd2hpbGUocmVtb3ZlX2NhbGxfb3V0KCJNZWluZUZ1bmt0aW9uIikgIT0gLTEpOyAgICAgIC8qIHdpZWRlcmhvbGUgKi8KKworQlVHUworICAgICAgICBEYXMgRW50ZmVybmVuIHZvbiBjYWxsX291dCgpcyBhdWYgQ2xvc3VyZXMgZnVua3Rpb25pZXJ0IG51ciwgd2VubiBkZXIKKyAgICAgICAgZXhha3QgZ2xlaWNoZSBXZXJ0IGZ1ZXIgZGllIENsb3N1cmUgdmVyd2VuZGV0IHdpcmQuCisKKyAgICAgICAgRGFzIGZ1bmt0aW9uaWVydDoKKyAgICAgICAgICAgIGNsb3N1cmUgY2wgPSBzeW1ib2xfZnVuY3Rpb24oIm1haW4iLCBvYmopOworICAgICAgICAgICAgY2FsbF9vdXQoY2wsIDIpOworICAgICAgICAgICAgcmVtb3ZlX2NhbGxfb3V0KGNsKTsKKworICAgICAgICBEYXMgZnVua3Rpb25pZXJ0IG5pY2h0OgorICAgICAgICAgICAgY2FsbF9vdXQoc3ltYm9sX2Z1bmN0aW9uKCJtYWluIiwgb2JqKSwgMik7CisgICAgICAgICAgICByZW1vdmVfY2FsbF9vdXQoc3ltYm9sX2Z1bmN0aW9uKCJtYWluIiwgb2JqKSk7CisKK1NJRUhFIEFVQ0gKKyAgICAgICAgY2FsbF9vdXQoRSksIGNhbGxfb3V0X2luZm8oRSksIGZpbmRfY2FsbF9vdXQoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL3JlbW92ZV9pbnB1dF90byBiL2RvYy9lZnVuL3JlbW92ZV9pbnB1dF90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2Q5MzkzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vcmVtb3ZlX2lucHV0X3RvCkBAIC0wLDAgKzEsMzggQEAKK1NZTk9QU0lTCisgICAgICAgIGludCByZW1vdmVfaW5wdXRfdG8gKG9iamVjdCBwbGF5ZXIpOworICAgICAgICBpbnQgcmVtb3ZlX2lucHV0X3RvIChvYmplY3QgcGxheWVyLCBzdHJpbmcgZnVuKTsKKyAgICAgICAgaW50IHJlbW92ZV9pbnB1dF90byAob2JqZWN0IHBsYXllciwgY2xvc3VyZSBmdW4pOworICAgICAgICBpbnQgcmVtb3ZlX2lucHV0X3RvIChvYmplY3QgcGxheWVyLCBvYmplY3QgZnVuKTsKKyAgICAgICAgaW50IHJlbW92ZV9pbnB1dF90byAob2JqZWN0IHBsYXllciwgb2JqZWN0IG9iaiwgc3RyaW5nIGZ1bik7CisKK0JFU0NIUkVJQlVORworICAgICAgICBFbnRmZXJudCBlaW4gaGFlbmdpZ2VzIGlucHV0X3RvKCkgYXVzIGRlbSBpbnRlcmFrdGl2ZW4gUGxheWVyb2JqZWt0LgorICAgICAgICBXZW5uIDxmdW4+IG5pY2h0IGFuZ2VnZWJlbiBpc3QsIHdpcmQgZGVyIHp1bGV0enQgYXVmZ2VydWZlbiBpbnB1dF90bygpCisgICAgICAgIGVudGZlcm50LgorCisgICAgICAgIFd1cmRlIDxmdW4+IGFuZ2VnZWJlbiwgZW50ZmVybnQgcmVtb3ZlX2lucHV0X3RvIGRhcyBuZXVlc3RlIGF1ZiA8ZnVuPgorICAgICAgICBhdWZnZXJ1ZmVuZSBpbnB1dF90by4gSmUgbmFjaCBkZXIgRGVmaW5pdGlvbiB2b24gPGZ1bj4gd2lyZCBuYWNoCisgICAgICAgIHVudGVyc2NoaWVkbGljaGVuIEtyaXRlcmllbiBnZXN1Y2h0OgorICAgICAgICAgIC0gPGZ1bj4gaXN0IGVpbiBTdHJpbmc6IGdlc3VjaHQgd2lyZCBuYWNoIGRlbSBGdW5rdGlvbnNuYW1lbgorICAgICAgICAgIC0gPGZ1bj4gaXN0IGVpbiBPYmpla3Q6IGdlc3VjaHQgd2lyZCBuYWNoIGRlbSBPYmpla3QsIGluIGRlbQorICAgICAgICAgICAgaW5wdXRfdG8oKSBhdWZnZXJ1ZmVuIHd1cmRlCisgICAgICAgICAgLSA8ZnVuPiBpc3QgZWluZSBDbG9zdXJlOiBnZXN1Y2h0IHdpcmQgbmFjaCBkZXIgQ2xvc3VyZSwgZGllCisgICAgICAgICAgICBpbnB1dF90bygpIGVudGhhZWx0CisgICAgICAgICAgLSA8b2JqPiB1bmQgPGZ1bj4gd3VyZGVuIGFuZ2VnZWJlbjogZXMgd2lyZCBuYWNoIE9iamVrdCB1bmQKKyAgICAgICAgICAgIEZ1bmt0aW9uc25hbWUgZ2VzdWNodC4gQmVpZGUgbXVlc3NlbiB1ZWJlcmVpbnN0aW1tZW4uCisKKyAgICAgICAgcmVtb3ZlX2lucHV0X3RvKCkgbGllZmVydCAxIGJlaSBFcmZvbGcsIHNvbnN0IDAgKGVzIHd1cmRlIGtlaW4KKyAgICAgICAgaW5wdXRfdG8oKSBnZWZ1bmRlbiwgZGFzIE9iamVrdCBpc3QgbmljaHQgaW50ZXJha3RpdiBvZGVyIGVzIGdpYnQKKyAgICAgICAga2VpbiBoYWVuZ2lnZXMgaW5wdXRfdG8oKSBhdWYgZGVtIE9iamVrdCkuCisKK0JFSVNQSUVMRQorICAgICAgICBFbnRmZXJudCBhbGxlIGhhZW5naWdlbiBpbnB1dF90bygpcyBkZXMgYWt0dWVsbGVuIFNwaWVsZXJzLCBmYWxscworICAgICAgICB2b3JoYW5kZW46CisgICAgICAgICAgICB3aGlsZShyZW1vdmVfaW5wdXRfdG8odGhpc19pbnRlcmFjdGl2ZSgpKSk7CisKK0FFTkRFUlVOR0VOCisgICAgICAgIEVpbmdlZnVlaHJ0IGluIExETXVkIDMuMi45LgorCitTSUVIRSBBVUNICisgICAgICAgIGlucHV0X3RvKEUpLCBmaW5kX2lucHV0X3RvKEUpLCBpbnB1dF90b19pbmZvKEUpLAorICAgICAgICBxdWVyeV9pbnB1dF9wZW5kaW5nKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9yZW1vdmVfaW50ZXJhY3RpdmUgYi9kb2MvZWZ1bi9yZW1vdmVfaW50ZXJhY3RpdmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ2ZDIwMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL3JlbW92ZV9pbnRlcmFjdGl2ZQpAQCAtMCwwICsxLDEzIEBACitTWU5PUFNJUworICAgICAgICB2b2lkIHJlbW92ZV9pbnRlcmFjdGl2ZShvYmplY3Qgb2IpCisKK0RFU0NSSVBUSU9OCisgICAgICAgIENsb3NlIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBpbnRlcmFjdGl2ZSBvYmplY3Qgb2IuCisKKyAgICAgICAgRm9yIHRoZSB0aW1lIG9mIHRoZSBMUEMgZXhlY3V0aW9uLCB0aGUgb2JqZWN0IGlzIG9ubHkgbWFya2VkCisgICAgICAgIGludGVybmFsbHkgYXMgJ2Fib3V0IHRvIGJlIGNsb3NlZCcsIG1lYW5pbmcgdGhhdCB3aGlsZSBhbGwKKyAgICAgICAgb3V0cHV0IHdpbGwgYmUgcmVkaXJlY3RlZCB0byBzdGRvdXQsIHRoZSBhY3R1YWwgbmV0d29yayBjb25uZWN0aW9uCisgICAgICAgIHdpbGwgY29udGludWUgdG8gZXhpc3QgdW50aWwgdGhlIExQQyBleGVjdXRpb24gZW5kcy4KKworU0VFIEFMU08KKyAgICAgICAgY29ubmVjdChNKSwgbG9nb24oQSksIGRpc2Nvbm5lY3QoTSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL3JlbmFtZSBiL2RvYy9lZnVuL3JlbmFtZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjc0NDkyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vcmVuYW1lCkBAIC0wLDAgKzEsMjUgQEAKK1NZTk9QU0lTCisgICAgICAgIGludCByZW5hbWUoc3RyaW5nIGZyb20sIHN0cmluZyB0byk7CisKK0JFU0NIUkVJQlVORworICAgICAgICBEaWUgRWZ1biByZW5hbWUoKSB2ZXJzY2hpZWJ0IDxmcm9tPiBuYWNoIDx0bz4uIFdlbm4gPGZyb20+IGVpbiBGaWxlCisgICAgICAgIGlzdCwga2FubiA8dG8+IGVudHdlZGVyIGVpbiBhbmRlcmUgRmlsZSBvZGVyIGVpbiBWZXJ6ZWljaG5pcyBzZWluLgorICAgICAgICBXZW5uIDxmcm9tPiBlaW4gVmVyemVpY2huaXMgaXN0LCBtdXNzIDx0bz4gYXVjaCBlaW4gVmVyemVpY2huaXMgc2Vpbi4KKyAgICAgICAgV2VubiBpbiBkaWVzZW0gRmFsbCA8dG8+IGV4aXN0aWVydCB1bmQgZWluIFZlcnplaWNobmlzIGlzdCwgd2lyZAorICAgICAgICA8ZnJvbT4gaW4gPHRvPiB2ZXJzY2hvYmVuIHVuZCBiZWhhZWx0IHNlaW5lbiBOYW1lbi4KKworICAgICAgICA8ZnJvbT4gdW16dWJlbmVubmVuIGVyZm9yZGVydCBTY2hyZWlicmVjaHRlIGF1ZiA8ZnJvbT4uCisKKyAgICAgICAgVW50ZXJ2ZXJ6ZWljaG5pc3NlIChWZXJ6ZWljaG5pc3NlIGluIFZlcnplaWNobmlzc2VuKSBrb2VubmVuIG51ciBhdWYKKyAgICAgICAgTWFzY2hpbmVuIHVtYmVuYW5udCB3ZXJkZW4sIGRpZSB1bnRlciBTeXN0ZW0gViBsYXVmZW4sIGQuaC4gZXMgaXN0CisgICAgICAgIG5pY2h0IG1vZWdsaWNoLCBkaWVzZSBpbiBlaW4gYW5kZXJlcyBWZXJ6ZWljaG5pcyB6dSB2ZXJzY2hpZWJlbi4gRGFzCisgICAgICAgIFZlcnNjaGllYmVuIHZvbiBWZXJ6ZWljaG5pc3NlbiB2b24gZWluZW0gRmlsZXN5c3RlbSB6dW0gYW5kcmVyZW4gaXN0CisgICAgICAgIHVudGVyIGtlaW5lbSBTeXN0ZW0gbW9lZ2xpY2guCisKKyAgICAgICAgQmVpIEVyZm9sZyBsaWVmZXJ0IHJlbmFtZSgpIDAsIGJlaSBGZWhsc2NobGFnIGVpbmVuIFdlcnQgdW5nbGVpY2ggMC4KKworQkVJU1BJRUwKKyAgICAgICAgcmVuYW1lKCIvcGxheWVycy93aXphcmQvb2JqLmMiLCAiL3BsYXllcnMvd2l6YXJkL25ld29iai5jIik7CisKK1NJRUhFIEFVQ0gKKyAgICAgICAgY29weV9maWxlKEUpLCBta2RpcihFKSwgcm1kaXIoRSksIHJtKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9yZW5hbWVfb2JqZWN0IGIvZG9jL2VmdW4vcmVuYW1lX29iamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDMxNjc0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vcmVuYW1lX29iamVjdApAQCAtMCwwICsxLDEwIEBACitTWU5PUFNJUzoKKwl2b2lkIHJlbmFtZV9vYmplY3QgKG9iamVjdCBvYiwgc3RyaW5nIG5ld19uYW1lKTsKKworREVTQ1JJUFRJT046CisJR2l2ZSB0aGUgY3VycmVudCBvYmplY3QgYSBuZXcgb2JqZWN0X25hbWUuIENhdXNlcyBhIHByaXZpbGVnZQorCXZpb2xhdGlvbi4gVGhlIG5ldyBuYW1lIG11c3Qgbm90IGNvbnRhaW4gYSAjIGNoYXJhY3RlciwgZXhjZXB0CisJYXQgdGhlIGVuZCwgdG8gYXZvaWQgY29uZnVzaW9uIHdpdGggY2xvbmUgbnVtYmVycy4KKworU0VFIEFMU086CisJY3JlYXRvcihFKSwgb2JqZWN0X25hbWUoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL3JlcGxhY2VfcHJvZ3JhbSBiL2RvYy9lZnVuL3JlcGxhY2VfcHJvZ3JhbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODEyZDRlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vcmVwbGFjZV9wcm9ncmFtCkBAIC0wLDAgKzEsNTIgQEAKK1NZTk9QU0lTCisgICAgICAgIHZvaWQgcmVwbGFjZV9wcm9ncmFtKCk7CisgICAgICAgIHZvaWQgcmVwbGFjZV9wcm9ncmFtKHN0cmluZyBwcm9ncmFtKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIEVyc2V0enQgZWluIFByb2dyYW1tIG1pdCBkZW0gZ2VlcmJ0ZW4gUHJvZ3JhbW0gKGluaGVyaXQpIDxwcm9ncmFtPi4KKyAgICAgICAgRGFzIEFyZ3VtZW50IDxwcm9ncmFtPiBrYW5uIHdlZ2dlbGFzc2VuIHdlcmRlbiwgd2VubiBudXIgZWluIFByb2dyYW1tCisgICAgICAgIGdlZXJidCB3aXJkLiBJbiBkaWVzZW0gRmFsbCB3YWVobHQgZGVyIFRyZWliZXIgYXV0b21hdGlzY2ggZGllc2VzIGVpbmUKKyAgICAgICAgZ2VlcmJ0ZSBQcm9ncmFtbS4KKworICAgICAgICBEaWVzZSBFZnVuIGlzdCBudWV0emxpY2gsIHdlbm4gZXMgdW0gTGVpc3R1bmcgdW5kIFNwZWljaGVydmVyYnJhdWNoCisgICAgICAgIGRlcyBUcmVpYmVycyBnZWh0LiBFaW4gUHJvZ3JhbW0sIHdlbGNoZXMga2VpbmUgenVzYWV0emxpY2hlbiBWYXJpYWJsZW4KKyAgICAgICAgb2RlciBGdW5rdGlvbmVuIGJyYXVjaHQgKGF1c3NlciB3YWVocmVuZCBkZXIgRXJzdGVsbHVuZyksIGthbm4KKyAgICAgICAgcmVwbGFjZV9wcm9ncmFtKCkgYXVmcnVmZW4sIHVtIGRpZSBUcmVmZmVycXVvdGUgZGVzIFRyZWliZXJzIGF1ZiBkZW4KKyAgICAgICAgRnVua3Rpb25lbi1DYWNoZXMgenUgZXJob2VoZW4uIERpZXMgdmVycmluZ2VydCBkaWUgQW56YWhsIFByb2dyYW1tZQorICAgICAgICBpbSBTeXN0ZW0uCisKKyAgICAgICAgUmFldW1lIHNpbmQgZWluIGd1dGVzIEJlaXNwaWVsIGZ1ZXIgZGllIEFud2VuZHVuZyBkaWVzZXIgRnVua3Rpb24sIGRhCisgICAgICAgIHZpZWxlIFJhZXVtZSBudXIgYXVzIGVpbmVtIEluaGVyaXQgdW5kIGVpbmVyIEtvbmZpZ3VyYXRpb25zZnVua3Rpb24KKyAgICAgICAgYmVzdGVoZW4uIEplZGVzIE9iamVrdCBrYW5uIHJlcGxhY2VfcHJvZ3JhbSgpIGF1ZnJ1ZmVuLCB2ZXJsaWVydCBkYWJlaQorICAgICAgICBqZWRvY2ggYWxsZSBWYXJpYWJsZW4gdW5kIEZ1bmt0aW9uZW4sIGRpZSBuaWNodCBpbSBnZWVyYnRlbiBQcm9ncmFtbQorICAgICAgICBkZWZpbmllcnQgc2luZC4KKworICAgICAgICBXZW5uIHJlcGxhY2VfcHJvZ3JhbSgpIGFuZ2V3ZW5kZXQgd2lyZCwgd2VyZGVuIFNoYWRvd3Mgdm9tIE9iamVrdAorICAgICAgICBlbnRmZXJudCwgaW4gZGVtIHJlcGxhY2VfcHJvZ3JhbSgpIHN0YXR0ZmluZGV0LiBEaWVzIGlzdCBzbyBzZWl0CisgICAgICAgIDMuMkAxNjYuCisKKyAgICAgICAgRXMgaXN0IG5pY2h0IG1vZWdsaWNoLCByZXBsYWNlX3Byb2dyYW0oKSBhdWZ6dXJ1ZmVuLCB3ZW5uIGVzIGFuIGRhcworICAgICAgICBPYmpla3QgZ2VidW5kZW5lIChMYW1iZGEtKSBDbG9zdXJlcyBnaWJ0LiBIaW5nZWdlbiBpc3QgZXMgbW9lZ2xpY2gsCisgICAgICAgIHp1ZXJzdCBkYXMgUHJvZ3JhbW0gZGVzIE9iamVrdHMgenUgZXJzZXR6ZW4gdW5kIGRhbm4gTGFtYmRhY2xvc3VyZXMKKyAgICAgICAgZGFyYW4genUgYmluZGVuLgorCisgICAgICAgIERhcyBFcnNldHplbiBkZXMgUHJvZ3JhbW1zIGZpbmRldCBlcnN0IHN0YXR0LCB3ZW5uIGRhcyBPYmpla3QKKyAgICAgICAgdm9sbHN0YWVuZGlnIGFiZ2VhcmJlaXRldCB3dXJkZSwgbmljaHQgc2Nob24gYmVpbSBBdWZydWYgZGVyIEZ1bmt0aW9uCisgICAgICAgIHJlcGxhY2VfcHJvZ3JhbSgpLiBEYXMga2FubiBkYXp1IGZ1ZWhyZW4sIGRhc3MgQ2xvc3VyZXMgYXVmIGluendpc2NoZW4KKyAgICAgICAgdmVyc2Nod3VuZGVuZSBMZnVucyBkZXMgT2JqZWt0cyByZWZlcmVuemllcmVuLiBEYXMgc3RlbGx0IGFsbGVyZGluZ3MKKyAgICAgICAga2VpbiBQcm9ibGVtIGRhciwgc29sYW5nZSBkaWVzZSBSZWZlcmVuemVuIG5pY2h0IGF1c2dlZnVlaHJ0IHdlcmRlbi4KKworQkVNRVJLVU5HRU4KKyAgICAgICAgUmFldW1lIGJlbnV0emVuIHJlcGxhY2VfcHJvZ3JhbSBhdXRvbWF0aXNjaC4gRXMgaXN0IG5pY2h0IHNpbm52b2xsCisgICAgICAgIG9kZXIgbm90d2VuZGlnLCByZXBsYWNlX3Byb2dyYW0gc2VsYnN0IG9obmUgS29uc3VsdGF0b24gbWl0IGVpbmVtCisgICAgICAgIEVyem1hZ2llciBlaW56dXNldHplbiEKKworQlVHUworICAgICAgICBXZW5uIGVpbiBlcnNldHplbmRlcyBQcm9ncmFtbSB2aXJ0dWVsbCBnZWVyYnRlIFZhcmlhYmxlbiBlbnRoYWVsdCwKKyAgICAgICAgbXVzcyBkaWVzZXMgUHJvZ3JhbW0gYWxzIGVyc3RlcyBnZWVyYnQgd2VyZGVuLiBPaG5lIGRpZXNlCisgICAgICAgIEVpbnNjaHJhZW5rdW5nIHVlYmVybGViZW4gZGllIGZhbHNjaGVuIFZhcmlhYmxlbiBkZW4KKyAgICAgICAgRXJzZXR6dW5nc3Byb3plc3MuCisKK0FFTkRFUlVOR0VOCisgICAgICAgIExETXVkIDMuMi45IGxpZXNzIHp1LCBkYXNzIGRhcyBBcmd1bWVudCA8cHJvZ3JhbT4gd2VnZ2VsYXNzZW4gd2lyZCwKKyAgICAgICAgd2VubiBudXIgZWluIEluaGVyaXQgZXhpc3RpZXJ0LgpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vcmVzdG9yZV9vYmplY3QgYi9kb2MvZWZ1bi9yZXN0b3JlX29iamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTk5MWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vcmVzdG9yZV9vYmplY3QKQEAgLTAsMCArMSw0NSBAQAorU1lOT1BTSVMKKyAgICAgICAgaW50IHJlc3RvcmVfb2JqZWN0KHN0cmluZyBuYW1lKTsKKyAgICAgICAgaW50IHJlc3RvcmVfb2JqZWN0KHN0cmluZyBzdHIpOyAgICAgKFZPUkxBRVVGSUcpCisKK0JFU0NIUkVJQlVORworICAgICAgICBMYWVkdCBXZXJ0ZSB2b24gVmFyaWFibGVuIGZ1ZXIgZGFzIGFrdHVlbGxlIE9iamVrdCBhdXMgZGVyIERhdGVpCisgICAgICAgIDxuYW1lPiBvZGVyIGRpcmVrdCBhdXMgZGVtIFN0cmluZyA8c3RyPi4KKworICAgICAgICBVbSBkaXJla3QgYXVzIGVpbmVtIFN0cmluZyBWYXJpYWJsZW4gbGFkZW4genUga29lbm5lbiwgbXVzcyBkaWVzZXIKKyAgICAgICAgbWl0IGRlciB0eXBpc2NoZW4gWmVpbGUgIiN4OnkiIGJlZ2lubmVuLiBTdHJpbmdzLCBkaWUgdm9uIGRlciBFZnVuCisgICAgICAgIHNhdmVfb2JqZWN0KCkgZXJ6ZXVndCB3dXJkZW4sIGJlZ2lubmVuIHNvLgorCisgICAgICAgIFdlbm4gVmFyaWFibGVuIGF1cyBlaW5lciBEYXRlaSBnZWxhZGVuIHdlcmRlbiwga2FubiA8bmFtZT4gbWl0IC5jCisgICAgICAgIGVuZGVuLiBEaWVzZSBEYXRlaWVuZHVuZyB3aXJkIHZvbSBUcmVpYmVyIGVudGZlcm50LiBEYXMgTWFzdGVyb2JqZWt0CisgICAgICAgIGZ1ZWd0IGRlbSBEYXRlaW5hbWVuIGVpbiAubyBoaW56dS4gRGllIEd1ZWx0aWdrZWl0IGRlcyBEYXRlaW5hbWVucworICAgICAgICB3aXJkIG1pdCBkZXIgRnVua3Rpb24gY2hlY2tfdmFsaWRfcGF0aCgpIGF1dG9tYXRpc2NoIHVlYmVycHJ1ZWZ0LgorCisgICAgICAgIERpZSBGdW5rdGlvbiBnaWJ0IDEgenVydWVjaywgd2VubiBkaWUgVmFyaWFibGVuIGVyZm9sZ3JlaWNoIGdlbGFkZW4KKyAgICAgICAgd3VyZGVuIHVuZCAwLCB3ZW5uIGVzIG5pY2h0cyB6dSBsYWRlbiBnYWIuCisKKyAgICAgICAgVmFyaWFibGVuIG1pdCBkZW0gVHlwZW52ZXJtZXJrIG5vc2F2ZSB3ZXJkZW4gbmljaHQgZ2VsYWRlbiwgenVtCisgICAgICAgIEJlaXNwaWVsIG5vc2F2ZSBpbnQgeHh4OworCisgICAgICAgIENsb3N1cmVzIGF1cyBMZnVucywgVmFyaWFibG5lIHVuZCBzaW11bF9lZnVucyB3ZXJkZW4gbnVyIGdlbGFkZW4sCisgICAgICAgIHdlbm4gc2llIGdlZnVuZGVuIHdlcmRlbi4gRmFsbHMgbmljaHQsIHdlcmRlbiBzaWUgbWl0IGRlbSBXZXJ0ICcwJworICAgICAgICBnZWxhZGVuLgorCisgICAgICAgIFdlbm4gVmVyZXJidW5nIHZlcndlbmRldCB3aXJkLCBrYW5uIGVzIHZvcmtvbW1lbiwgZGFzcyBtZWhyZXJlCisgICAgICAgIFZhcmlhYmxlbiBtaXQgZGVtIGdsZWljaGVuIE5hbWVuIGFuIHVudGVyc2NoaWVkbGljaGVuIE9ydGVuIHZvcmtvbW1lbgorICAgICAgICB1bmQgZGVzaGFsYiBpbiBkZXIgU3BlaWNoZXJkYXRlaSBtZWhybWFscyBhdWZ0cmV0ZW4uIEJlaW0gTGFkZW4gZGVyCisgICAgICAgIFZhcmlhYmxlbiB3ZXJkZW4gc2llIGluIFJlaWhlbmZvbGdlIGlocmVzIEF1ZnRyZXRlbnMgaW0gVmVyZXJidW5nc2JhdW0KKyAgICAgICAgZ2VsYWRlbi4gRWluIGdlZWlnbmV0ZXMgVm9yZ2VoZW4gaXN0IGRpZSBWZXJ3ZW5kdW5nIHZvbiBWZXJib3NlIHVuZAorICAgICAgICBlaW56aWdhcnRpZ2VuIE5hbWVuIGJlaSBuaWNodC1zdGF0aXNjaGVuIFZhcmlhYmxlbi4gU28gd2lyZCBhdWNoIGRhcworICAgICAgICBtYW51ZWxsZSBMZXNlbiBvZGVyIEVkaXRpZXJlbiBkZXMgU2F2ZWZpbGVzIGVpbmZhY2hlci4KKworQUVOREVSVU5HRU4KKyAgICAgICAgRGFzIGRpcmVrdGUgTGFkZW4gYXVzIGVpbmVtIFN0cmluZyB3dXJkZSBpbiBMRE11ZCAzLjIuOCBlaW5nZWZ1ZWhydCwKKyAgICAgICAgICAgIHdpcmQgYWJlciBtb2VnbGljaGVyd2Vpc2UgaW4gWnVrdW5mdCBpbiBlaW5lIHNlcGFyYXRlIEVmdW4KKyAgICAgICAgICAgIGF1c2dlbGFnZXJ0LgorICAgICAgICBMRE11ZCAzLjIuOSBlcmdhZW56dGUgZGllIEZ1bmt0aW9uIHVtIGRpZSBNb2VnbGljaGtlaXQsCisgICAgICAgICAgICBOb25MYW1iZGEtQ2xvc3VyZXMsIFN5bWJvbGUgdW5kIGdlcXVvdGV0ZSBBcnJheXMgenUgbGFkZW4sCisgICAgICAgICAgICBpbmRlbSBlaW4gbmV1ZXMgRm9ybWF0IGZ1ZXIgZGFzIFNhdmVmaWxlIHZlcndlbmRldCB3aXJkLgorCitTSUVIRSBBVUNICisgICAgICAgIHNhdmVfb2JqZWN0KEUpLCByZXN0b3JlX3ZhbHVlKEUpLCB2YWxpZF9yZWFkKE0pCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9yZXN0b3JlX3ZhbHVlIGIvZG9jL2VmdW4vcmVzdG9yZV92YWx1ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTQ0YjE4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vcmVzdG9yZV92YWx1ZQpAQCAtMCwwICsxLDE3IEBACitTWU5PUFNJUworICAgICAgICBtaXhlZCByZXN0b3JlX3ZhbHVlKHN0cmluZyBzdHIpOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgV2FuZGVsdCBkaWUgU3RyaW5nLUVudHNwcmVjaHVuZyA8c3RyPiBlaW5lcyBXZXJ0ZXMgenVydWVjayBpbiBkZW4gV2VydAorICAgICAgICBzZWxic3QgdW5kIGdpYnQgZGllc2VuIFdlcnQgenVydWVjay4gPHN0cj4gaXN0IGVpbiBTdHJpbmcsIHdpZSBlciB2b24KKyAgICAgICAgc2F2ZV92YWx1ZSgpIGVyemV1Z3Qgd2lyZC4gRGllIFNwZXppZmlrYXRpb24gZGVzIFNwZWljaGVyZm9ybWF0ZXMKKyAgICAgICAgJyN4OnknIGlzdCBvcHRpb25hbC4KKworQUVOREVSVU5HRU4KKyAgICAgICAgRWluZ2VmdWVocnQgaW4gTERNdWQgMy4yLjguCisgICAgICAgIE1pdCBMRE11ZCAzLjIuOSBrYW0gZGFzIExhZGVuIHZvbiBOb24tTGFtYmRhIENsb3N1cmVzLCBTeW1ib2xlbiB1bmQKKyAgICAgICAgZ2VxdW90ZXRlbiBBcnJheXMgaGluenUsIHdvenUgZWluIG5ldWVzIEZvcm1hdCBmdWVyIGRpZSBTcGVpY2hlcmRhdGVpCisgICAgICAgIHZlcndlbmRldCB3aXJkLgorCitTSUVIRSBBVUNICisgICAgICAgIHNhdmVfdmFsdWUoRSksIHJlc3RvcmVfb2JqZWN0KEUpLCBzYXZlX29iamVjdChFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vcmV2ZXJzZSBiL2RvYy9lZnVuL3JldmVyc2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBjNzg5MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL3JldmVyc2UKQEAgLTAsMCArMSwzMSBAQAorU1lOT1BTSVMKKyAgICAgICAgaW50aSAgICByZXZlcnNlIChpbnQgYXJnKQorICAgICAgICBzdHJpbmcgIHJldmVyc2UgKHN0cmluZyBhcmcpCisgICAgICAgIG1peGVkICogcmV2ZXJzZSAobWl4ZWQgKiBhcmcpCisgICAgICAgIG1peGVkICogcmV2ZXJzZSAobWl4ZWQgKiAmIGFyZykKKworREVTQ1JJUFRJT04KKyAgICAgICAgS2VocnQgZGllIFJlaWhlbmZvbGdlIGRlcyBJbmhhbHRlcyB2b24gQXJyYXkgb2RlciBTdHJpbmcgPGFyZz4KKyAgICAgICAgdW0gdW5kIGxpZWZlcnQgZGVuIG5ldWVuIFdlcnQgYWxzIFJlc3VsdGF0LgorICAgICAgICBJc3QgPGFyZz4gZWluZSBaYWhsLCB3aXJkIGRpZSBSZWloZW5mb2xnZSBkZXIgQml0cyBpbiA8YXJnPiB1bWdla2VocnQuCisKKyAgICAgICAgV2VubiBpbiBkZXIgUmVmZXJlbnotVmFyaWFudGUgdmVyd2VuZGV0LCB3aXJkIGRhcyBBcmd1bWVudGFycmF5IHNlbGJlcgorICAgICAgICBpbnZlcnRpZXJ0IHVuZCBhdWNoIHp1cnVlY2tnZWdlYmVuLgorCitFWEFNUExFUworICAgICAgICByZXZlcnNlICgweDMwNmEpIC0gcmV0dXJuIDB4NTYwYzAwMDAKKworICAgICAgICByZXZlcnNlICgidGVzdCIpIC0gcmV0dXJuICJ0c2V0IgorCisgICAgICAgIG1peGVkICogYSA9ICh7IDEsIDIgfSk7CisgICAgICAgIHJldmVyc2UoYSkgIC0gcmV0dXJucyAoeyAyLCAxIH0pLCBhIGlzdCB1bnZlcmFlbmRlcnQuCisgICAgICAgIHJldmVyc2UoJmEpIC0gcmV0dXJucyAoeyAyLCAxIH0pLCBhIGlzdCBudW4gKHsgMiwgMSB9KQorCitCVUdTCisgICAgICAgIFJlZmVyZW56LVRlaWxhcnJheXMgd2llIHJldmVyc2UoJihhWzEuLjJdKSkgc2luZCBuaWNodCB1bnRlcnN0dWV0enQuCisKK0dFU0NISUNIVEUKKyAgICAgICAgRWluZ2VmdWVocnQgaW4gTERNdWQgMy4zLjUyOS4KKyAgICAgICAgTERNdWQgMy4zLjUzMiBmdWVndGUgZGllIEJpdHVta2VociB2b24gWmFobGVuIGVpbi4KKworU0VFIEFMU08KZGlmZiAtLWdpdCBhL2RvYy9lZnVuL3JtIGIvZG9jL2VmdW4vcm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFiNTllMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL3JtCkBAIC0wLDAgKzEsOSBAQAorU1lOT1BTSVMKKyAgICAgICAgaW50IHJtKHN0cmluZyBmaWxlKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIExvZXNjaHQgZGllIERhdGVpIDxmaWxlPi4gR2lidCAwIHp1cnVlY2ssIHdlbm4gZXR3YXMgbmljaHQgZ2VrbGFwcHQKKyAgICAgICAgaGF0LCAxIGJlaSBFcmZvbGcuCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgbWtkaXIoRSksIHJtZGlyKEUpLCByZW5hbWUoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL3JtZGlyIGIvZG9jL2VmdW4vcm1kaXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlhZjMyOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL3JtZGlyCkBAIC0wLDAgKzEsOCBAQAorU1lOT1BTSVMKKyAgICAgICAgaW50IHJtZGlyKHN0cmluZyBkaXIpOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgTG9lc2NodCBkYXMgVmVyemVpY2huaXMgPGRpcj4uIExpZWZlcnQgMSBiZWkgRXJmb2xnLCAwIGJlaSBNaXNzZXJmb2xnLgorCitTSUVIRSBBVUNICisgICAgICAgIG1rZGlyKEUpLCBybShFKSwgcmVuYW1lKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9ybWVtYmVyIGIvZG9jL2VmdW4vcm1lbWJlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzE5NjJjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vcm1lbWJlcgpAQCAtMCwwICsxLDIwIEBACitTWU5PUFNJUworICAgICAgICBpbnQgcm1lbWJlcihtaXhlZCAqYXJyYXksIG1peGVkIGVsZW0gWywgaW50IHN0YXJ0XSk7CisgICAgICAgIGludCBybWVtYmVyKHN0cmluZyBzdHIsIGludCBlbGVtIFssIGludCBzdGFydF0pOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgTGllZmVydCBmdWVyIEFycmF5cyB1bmQgU3RyaW5ncyBkZW4gSW5kZXggZGVzIGxldHp0ZW4gQXVmdHJldGVucyBkZXMKKyAgICAgICAgQXJndW1lbnRzIDxlbGVtPiBpbSBBcnJheSA8KmFycmF5PiAgYnp3LiBpbSBTdHJpbmcgPHN0cj4uIFdlbm4gPGVsZW0+CisgICAgICAgIG5pY2h0IGdlZnVuZGVuIHdpcmQsIGxpZWZlcnQgZGllIEZ1bmt0aW9uIC0xIHp1cnVlY2suCisKKyAgICAgICAgSXN0IDxzdGFydD4gYWxzIFphaGwgPj0gMCBnZWdlYmVuLCBiZWdpbm50IGRpZSBTdWNoZSBhYiBkZXIKKyAgICAgICAgYW5nZWdlYmVuZW4gUG9zaXRpb24uIEVpbmUgU3RhcnRwb3NpdGlvbiBncm9lc3NlciBhbHMgZGllCisgICAgICAgIExhZW5nZSBkZXMgU3RyaW5ncy9BcnJheXMgbGllZmVydCBzdGV0cyBkYXMgUmVzdWx0YXQgLTEuCisKKworQUVOREVSVU5HRU4KKyAgICAgICAgRWluZ2VmdWVocnQgaW4gTERNdWQgMy4yLjEwLgorICAgICAgICBMRE11ZCAzLjMuNTU2IGZ1ZWd0ZSBkZW4gPHN0YXJ0Pi1QYXJhbWV0ZXIgaGluenUuCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgbWVtYmVyKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9ydXNhZ2UgYi9kb2MvZWZ1bi9ydXNhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRjMjUyMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL3J1c2FnZQpAQCAtMCwwICsxLDE4IEBACitPUFRJT05BTAorU1lOT1BTSVMKKyAgICAgICAgaW50ICpydXNhZ2UoKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIExpZWZlcnQgZWluIEFycmF5IG1pdCBJbmZvcm1hdGlvbmVuIHVlYmVyIGRlbiBtb21lbnRhbmVuCisgICAgICAgIFN5c3RlbXp1c3RhbmQ7IEJlbnV0enVuZ3NzdGF0aXN0aWtlbiwgd2llIHNpZSB2b20gVW5peC1Lb21tYW5kbworICAgICAgICBnZXRydXNhZ2UoMikgZ2VuZXJpZXJ0IHdlcmRlbiwgbmFtZW50bGljaDoKKyAgICAgICAgICAgIHV0aW1lLCBzdGltZSwgbWF4cnNzLCBydXMucnVfaXhyc3MsIHJ1cy5ydV9pZHJzcywgcnVzLnJ1X2lzcnNzLAorICAgICAgICAgICAgcnVzLnJ1X21pbmZsdCwgcnVzLnJ1X21hamZsdCwgcnVzLnJ1X25zd2FwLCBydXMucnVfaW5ibG9jaywKKyAgICAgICAgICAgIHJ1cy5ydV9vdWJsb2NrLCBydXMucnVfbXNnc25kLCBydXMucnVfbXNncmN2LCBydXMucnVfbnNpZ25hbHMsCisgICAgICAgICAgICBydXMucnVfbnZjc3csIHJ1cy5ydV9uaXZjc3cKKworQU5NRVJLVU5HCisgICAgRGllc2UgRnVua3Rpb24gaXN0IG9wdGlvbmFsLgorCitTSUVIRSBBVUNICisgICAgICAgIHN5cy9yZXNvdXJjZS5oKFVuaXgpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9zYXZlX29iamVjdCBiL2RvYy9lZnVuL3NhdmVfb2JqZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MTk0NmIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9zYXZlX29iamVjdApAQCAtMCwwICsxLDU0IEBACitTWU5PUFNJUworICAgICAgICBpbnQgc2F2ZV9vYmplY3Qoc3RyaW5nIG5hbWUgWywgaW50IGZvcm1hdF0pOworICAgICAgICBzdHJpbmcgc2F2ZV9vYmplY3QoW2ludCBmb3JtYXRdKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIENvZGllcnQgZGllIHNwZWljaGVyYmFyZW4gKHMudS4pIFZhcmlhYmxlbiBkZXMgYWt0dWVsbGVuIE9iamVrdHMgaW4KKyAgICAgICAgZWluZW4gU3RyaW5nLgorCisgICAgICAgIEluIGRlciBlcnN0ZW4gRm9ybSB3aXIgZGVyIFN0cmluZyBpbiBkaWUgRGF0ZWkgPG5hbWU+IGdlc2NocmllYmVuLiBFaW5lCisgICAgICAgIEVuZHVuZyAiLmMiIGluIDxuYW1lPiB3aXJkIGVudGZlcm50LCBkYWZ1ZXIga2FubiBlaW5lIEVuZHVuZyAiLm8iCisgICAgICAgIGR1cmNoIGRhcyBNYXN0ZXJvYmpla3QgYW5nZWZ1ZWd0IHdlcmRlbiwgd2FlaHJlbmQgZGVyIFVlYmVycHJ1ZWZ1bmcKKyAgICAgICAgZHVyY2ggdmFsaWRfcmVhZCgpLiBEaWUgRWZ1biBzYXZlX29iamVjdCgpIGxpZWZlcnQgMCwgd2VubiBkaWUKKyAgICAgICAgU3BlaWNoZXJkYXRlaSBlcmZvbGdyZWljaCBlcnN0ZWxsdCB3dXJkZSwgc29uc3QgZWluZSBaYWhsIHVuZ2xlaWNoIDAsCisgICAgICAgIHdlbm4gZWluIG5pY2h0IHNjaHdlcndpZWdlbmRlZSBGZWhsZXIgYXVmZ2V0cmV0ZW4gaXN0IChkaWUgRGF0ZWkKKyAgICAgICAga29ubnRlIG5pY2h0IGdlc2NocmllYmVuIHdlcmRlbiBvZGVyIGRhcyBha3R1ZWxsZSBPYmpla3Qgd3VyZGUKKyAgICAgICAgaW56d2lzY2hlbiB6ZXJzdG9lcnQpLgorCisgICAgICAgIEluIGRlciB6d2VpdGVuIEZvcm0gd2lyZCBkZXIgU3RyaW5nIGRpcmVrdCB6dXJ1ZWNrIGdlZ2ViZW4uIFdlbm4gZGFzCisgICAgICAgIE9iamVrdCB6ZXJzdG9lcnQgd3VyZGUsIHdpcmQgMCB6dXJ1ZWNrIGdlZ2ViZW4uIEluIGJlaWRlbiBGYWVsbGVuIGthbm4KKyAgICAgICAgZHVyY2ggZGFzIG9wdGlvbmFsZSBBcmd1bWVudCA8Zm9ybWF0PiBkYXMgRm9ybWF0IGRlciBTcGVpY2hlcmRhdGVpCisgICAgICAgIGFuZ2VnZWJlbiB3ZXJkZW46CisKKyAgICAgICAgICAgIC0xOiBkYXMgbm9ybWFsZSBGb3JtYXQgZGVzIFRyZWliZXJzIChTdGFuZGFyZCkKKyAgICAgICAgICAgICAwOiBkYXMgT3JpZ2luYWxmb3JtYXQgbmFjaCBBbXlsYWFyJ3MgTFBNdWQgdW5kIExETXVkIDw9My4yLjgKKyAgICAgICAgICAgICAxOiBMRE11ZCA+PSAzLjIuOTogTm9uLUxhbWJkYSBDbG9zdXJlcywgU3ltYm9sZSB1bmQgZ2VxdW90ZXRlCisgICAgICAgICAgICAgICAgQXJyYXlzIGtvZW5uZW4gZ2VzcGVpY2hlcnQgd2VyZGVuCisKKyAgICAgICAgRWluZSBWYXJpYWJsZSB3aXJkIGFscyAnc3BlaWNoZXJiYXInIGJldHJhY2h0ZXQsIHdlbm4gc2llIG5pY2h0IGFscworICAgICAgICAnbm9zYXZlJyBvZGVyICdzdGF0aWMnIGRla2xhcmllcnQgaXN0LgorCisgICAgICAgIEJpdHRlIGJlYWNodGVuLCBkYXNzIGRpZXNlIGVmdW4gaW0gTUcgZHVyY2ggZWluZSBTZWZ1biB1ZWJlcnNjaHJpZWJlbgorICAgICAgICB3aXJkIHVuZCBkZXJlbiBNYW5wYWdlIGF1Y2ggbGVzZW4hCisKK0JFTUVSS1VOR0VOOgorICAgICAgICBEYW1pdCBlaW4gT2JqZWt0IGluIFZlcnplaWNobmlzc2UgZGVyIFJlZ2lvbi9kZXMgTWFnaWVycyBzY2hyZWliZW4KKyAgICAgICAga2FubiwgbXVzcyBlcyBlbnRzcHJlY2hlbmRlIFJlY2h0ZSwgYWxzbyBlaW5lIGd1ZWx0aWdlIEVVSUQKKyAgICAgICAgYmVzaXR6ZW4uIEltIGNyZWF0ZSgpIHNvbGx0ZSBkYWhlciBlaW46CisKKyAgICAgICAgc2V0ZXVpZChnZXR1aWQodGhpc19vYmplY3QoKSkpOworCisgICAgICAgIHN0ZWhlbi4KKworQUVOREVSVU5HRU4KKyAgICAgICAgU2VpdCBMRE11ZCAzLjIuOCBsaWVmZXJ0IHNhdmVfb2JqZWN0KCkgZWluZW4gZml4ZW4gV2VydCBiZWkgRXJmb2xnLgorICAgICAgICBEYXMgZGlyZWt0ZSBBYnNwZWljaGVybiBpbiBlaW5lbiBTdHJpbmcgd3VyZGUgaW4gTERNdWQgMy4yLjgKKyAgICAgICAgICAgIGVpbmdlZnVlaHJ0LCB3aXJkIGFiZXIgaW4gWnVrdW5mdCBldmVudHVlbGwgaW4gZWluZSBzZXBhcmF0ZSBFZnVuCisgICAgICAgICAgICB1bWdlem9nZW4uCisgICAgICAgIExETXVkIDMuMi45IGVyZ2Flbnp0ZSBkaWUgRnVua3Rpb24gdW0gZGFzIFNwZWljaGVybiB2b24gTm9uLUxhbWJkYQorICAgICAgICAgICAgQ2xvc3VyZXMsIFN5bWJvbGVuIHVuZCBnZXF1b3RldGVuIEFycmF5cy4gRGF6dSB3dXJkZSBlaW4gbmV1ZXMKKyAgICAgICAgICAgIEZvcm1hdCBmdWVyIGRpZSBTcGVpY2hlcmRhdGVpIGVpbmdlZnVlaHJ0LgorICAgICAgICBMRE11ZCAzLjIuMTAgZnVlaHJ0ZSBkYXMgQXJndW1lbnQgPGZvcm1hdD4gZWluLgorCitTSUVIRSBBVUNICisgICAgICAgIHJlc3RvcmVfb2JqZWN0KEUpLCBzYXZlX3ZhbHVlKEUpLCBzYXZlX29iamVjdCAoU2VmdW4pCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9zYXZlX3ZhbHVlIGIvZG9jL2VmdW4vc2F2ZV92YWx1ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWUxNDg2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vc2F2ZV92YWx1ZQpAQCAtMCwwICsxLDMxIEBACitTWU5PUFNJUworICAgICAgICBzdHJpbmcgc2F2ZV92YWx1ZShtaXhlZCB3ZXJ0IFssIGludCBmb3JtYXRdKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIFNjaHJlaWJ0IDx3ZXJ0PiBpbiBlaW5lbiBTdHJpbmcsIGRlciBzaWNoIG1pdCByZXN0b3JlX3ZhbHVlKCkKKyAgICAgICAgYXVzd2VydGVuIGxhZXNzdC4gRGVyIFN0cmluZyB3aXJkIHp1cnVlY2sgZ2VnZWJlbi4KKworICAgICAgICBEYXMgb3B0aW9uYWxlIEFyZ3VtZW50IDxmb3JtYXQ+IGJlc3RpbW10IGRhcyBGb3JtYXQgZGVzIFN0cmluZ3M6CisKKyAgICAgICAgICAgIC0xOiBkYXMgbm9ybWFsZSBGb3JtYXQgZGVzIFRyZWliZXJzIChTdGFuZGFyZCkKKyAgICAgICAgICAgICAwOiBkYXMgT3JpZ2luYWxmb3JtYXQgbmFjaCBBbXlsYWFyJ3MgTFBNdWQgdW5kIExETXVkIDw9My4yLjgKKyAgICAgICAgICAgICAxOiBMRE11ZCA+PSAzLjIuOTogTm9uLUxhbWJkYSBDbG9zdXJlcywgU3ltYm9sZSB1bmQgZ2VxdW90ZXRlCisgICAgICAgICAgICAgICAgQXJyYXlzIGtvZW5uZW4gZ2VzcGVpY2hlcnQgd2VyZGVuCisKKyAgICAgICAgRGVyIGVyemV1Z3RlIFN0cmluZyBiZXN0ZWh0IGF1cyB6d2VpIFplaWxlbiwgZGllIGpld2VpbHMgbWl0IGVpbmVtCisgICAgICAgIFplaWxlbnVtYnJ1Y2ggZW5kZW4uIERpZSBlcnN0ZSBaZWlsZSBiZXNjaHJlaWJ0IGRhcyBGb3JtYXQsIGluIGRlbSBkZXIKKyAgICAgICAgV2VydCBnZXNwZWljaGVydCB3aXJkLCBpbiBkZXIgJyN4OnknLVNjaHJlaWJ3ZWlzZS4gRGllIHp3ZWl0ZSBaZWlsZQorICAgICAgICBzdGVsbHQgZGVuIGVpZ2VudGxpY2hlbiBXZXJ0IGRhLgorCisgICAgICAgIERhcyBGb3JtYXQgenVtIFNjaHJlaWJlbiBkZXMgV2VydGVzIGluIGRlbiBTdHJpbmcgZW50c3ByaWNodCBkZW0gdm9uCisgICAgICAgIHNhdmVfb2JqZWN0KCkgdW5kIHJlc3RvcmVfb2JqZWN0KCkgdmVyd2VuZGV0ZW4gRm9ybWF0LgorCitBRU5ERVJVTkdFTgorICAgICAgICBFaW5nZWZ1ZWhydCBpbiBMRE11ZCAzLjIuOC4KKyAgICAgICAgTERNdWQgMy4yLjkuIGVyZ2Flbnp0ZSBkaWUgRnVua3Rpb24gdW0gZGllIE1vZWdsaWNoa2VpdCwgTm9uLUxhbWJkYQorICAgICAgICAgICAgQ2xvc3VyZXMsIFN5bWJvbGUgdW5kIGdlcXVvdGV0ZSBBcnJheXMgenUgc3BlaWNoZXJuLiBEYXp1IHd1cmRlCisgICAgICAgICAgICBlaW4gbmV1ZXMgRm9ybWF0IGZ1ZXIgZGVuIFN0cmluZyBlaW5nZWZ1ZWhydC4KKyAgICAgICAgTERNdWQgMy4yLjEwIGZ1ZWhydGUgZGFzIEFyZ3VtZW50IDxmb3JtYXQ+IGVpbi4KKworU0lFSEUgQVVDSAorICAgICAgICByZXN0b3JlX3ZhbHVlKEUpLCByZXN0b3JlX29iamVjdChFKSwgc2F2ZV9vYmplY3QoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL3NheSBiL2RvYy9lZnVuL3NheQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjA5NThmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vc2F5CkBAIC0wLDAgKzEsOTggQEAKK1NZTk9QU0lTCisgICAgICAgIHZvaWQgc2F5KHN0cmluZyBzdHIpOworICAgICAgICB2b2lkIHNheShzdHJpbmcgc3RyLCBvYmplY3QgZXhjbHVkZSk7CisgICAgICAgIHZvaWQgc2F5KHN0cmluZyBzdHIsIG9iamVjdCAqZXhjbHVkZXMpOworCisgICAgICAgIHZvaWQgc2F5KG1peGVkICp8bWFwcGluZ3xzdHJ1Y3R8b2JqZWN0IG1zZyk7CisgICAgICAgIHZvaWQgc2F5KG1peGVkICp8bWFwcGluZ3xzdHJ1Y3R8b2JqZWN0IG1zZywgb2JqZWN0IGV4Y2x1ZGUpOworICAgICAgICB2b2lkIHNheShtaXhlZCAqfG1hcHBpbmd8c3RydWN0fG9iamVjdCBtc2csIG9iamVjdCAqZXhjbHVkZXMpOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgRXMgYmVzdGVoZW4gendlaSBIYXVwdGFud2VuZHVuZ2VuIGZ1ZXIgc2F5KCk6CisKKyAgICAgICAgV2VubiBkYXMgZXJzdGUgQXJndW1lbnQgZWluIFN0cmluZyA8c3RyPiBpc3QsIHdpcmQgZXIgYW4gYWxsZQorICAgICAgICBsZWJlbmRpZ2VuIE9iamVrdGUgaW0gYWt0dWVsbGVuIFJhdW0gZ2VzZW5kZXQsIGF1c3NlciB6dW0gT2JqZWt0LAorICAgICAgICBkYXMgZGllIEZ1bmt0aW9uIGF1ZmdlcnVmZW4gaGF0LgorCisgICAgICAgIElzdCBkaWUgTmFjaHJpY2h0IGVpbiBTdHJpbmcsIHdpcmQgZGVyIFRleHQgYW4gaW50ZXJha3RpdmUgT2JqZWt0ZQorICAgICAgICBkaXJla3QgYXVzZ2VnZWJlbiwgZnVlciBhbmRlcmUgT2JqZWt0ZSB3aXJkIGRpZSBsZnVuIGNhdGNoX3RlbGwoKQorICAgICAgICBpbiBkaWVzZW4gYXVmZ2VydWZlbi4KKyAgICAgICAgRmFsbHMgZWluIExld2ViZXNlbiBkaWUgRnVua3Rpb24gY2F0Y2hfdGVsbCgpIGRlZmluaWVydCAoLT4gc2hhZG93KSwKKyAgICAgICAgc28gd2lyZCBkZXIgVGV4dCBoaWVyIGF1c2dld2VydGV0IHVuZCBuaWNodCBhbiBkZW4gVXNlciBhdXNnZWdlYmVuLgorCisgICAgICAgIFdlbm4gZGFzIHp3ZWl0ZSBBcmd1bWVudCwgZGllIE5hY2hyaWNodCwga2VpbiBTdHJpbmcgaXN0LCB3aXJkIGluCisgICAgICAgIGFsbGVuIExlYmV3ZXNlbiwgZGllIGRlbiBUZXh0IGVyaGFsdGVuLCBjYXRjaF9tc2coKSBhbnN0YXR0CisgICAgICAgIGNhdGNoX3RlbGwoKSBhdWZnZXJ1ZmVuLgorCisgICAgICAgIE1pdCBkZW0gQXJyYXkgPCpleGNsdWRlPiBrYW5uIG1hbiB2ZXJoaW5kZXJuLCBkYXNzIGRpZSBOYWNocmljaHQgYW4KKyAgICAgICAgZGllIGRhcmluIGVudGhhbHRlbmVuIE9iamVrdGUgZ2VzZW5kZXQgd2lyZC4gRGVyIFNlbmRlciBtdXNzIG5pY2h0CisgICAgICAgIG5vY2ggZWlubWFsIGF1ZmdlZnVlaHJ0IHdlcmRlbi4KKyAgICAgICAgRGFzIGlzdCBzaW5udm9sbCwgd2VubiB6QiBlaW5lIFNwaWVsZXJncnVwcGUgQXVzbG9lc2VyIGVpbmVyIE1lbGR1bmcKKyAgICAgICAgaXN0IHVuZCBkaWVzZSBzZWxic3QgbmljaHQgZXJoYWx0ZW4gc29sbC4KKworICAgICAgICBEYXMgYXVmcnVmZW5kZSBPYmpla3Qgd2lyZCBuYWNoIGZvbGdlbmRlbiBSZWdlbG4gYmVzdGltbXQ6CisgICAgICAgICAgLSBXZW5uIHNheSgpIGF1cyBlaW5lbSBsZWJlbmRpZ2VuIE9iamVrdCBhdWZnZXJ1ZmVuIHdpcmQsIGdpbHQKKyAgICAgICAgICAgIGRpZXNlcyBhbHMgZGFzIGF1ZnJ1ZmVuZGUgT2JqZWt0LgorICAgICAgICAgIC0gV2VubiBzYXkoKSBhdXMgZWluZW0gbmljaHQtbGViZW5kaWdlbiBPYmpla3QgYWxzIFJlc3VsdGF0IGVpbmVyCisgICAgICAgICAgICBIYW5kbHVuZyBlaW5lcyBCZW51dHplcnMgYXVmZ2VydWZlbiB3aXJkIChkYXMgaGVpc3N0LAorICAgICAgICAgICAgdGhpc19wbGF5ZXIoKSBpc3QgZ3VlbHRpZyksIGdpbHQgdGhpc19wbGF5ZXIoKSBhbHMgYXVmcnVmZW5kZXMKKyAgICAgICAgICAgIE9iamVrdC4KKyAgICAgICAgICAtIEluIGFsbGVuIGFuZGVyZW4gRmFlbGxlbiAoQXVmcnVmIGF1cyByZXNldCB6QikgZ2lsdCBkYXMgT2JqZWt0LAorICAgICAgICAgICAgZGFzIHNheSgpIGF1ZmdlcnVmZW4gaGF0LCBhbHMgYXVmcnVmZW5kZXMgT2JqZWt0LgorCitCRU1FUktVTkdFTgorICAgICAgICAtIGZ1ZXIgbGFlbmdlcmUgTWVsZHVuZ2VuIHNvbGx0ZSBicmVha19zdHJpbmcoKSB2ZXJ3ZW5kZXQgd2VyZGVuCisgICAgICAgIC0gd2lyZCBpbiBlaW5lbSBjYXRjaF9tc2coKSBkZXIgV2VydCB2b24gPG1zZz4gdmVyYWVuZGVydCwgZXJoYWx0ZW4KKyAgICAgICAgICBhbGxlIG5hY2hmb2xnZW5kZW4gT2JqZWt0ZSBkYXMgdmVyYWVuZGVydGUgPG1zZz4gKFJlZmVyZW56ISkKKworICAgICAgICAtIHNheSg8c3RyPikgaXN0IHZlcmhhbHRlbnNnbGVpY2ggenUKKyAgICAgICAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSwgPHN0cj4sICh7dGhpc19wbGF5ZXIoKXx8dGhpc19vYmplY3QoKX0pKQorCitCRUlTUElFTEUKKyAgICAgICAgLy8gRm9sZ2VuZGUgQXVmcnVmZSBzaW5kIGdsZWljaCwgd2VubiBzaWUgZHVyY2ggZWluIFNwaWVsZXJrb21tYW5kbworICAgICAgICAvLyBpbiBlaW5lbSBuaWNodCBsZWJlbmRpZ2VuIE9iamVrdCBhdWZnZWxvZXN0IHdlcmRlbjoKKworICAgICAgICAgICAgc2F5KCJIaSFcbiIpOworICAgICAgICAgICAgc2F5KCJIaSFcbiIsIHRoaXNfcGxheWVyKCkpOworCisgICAgICAgIC8vIERhcyBmb2xnZW5kZSBCZWlzcGllbCB6ZWlndCwgd2llIHNheSgpIHp1c2FtbWVuIG1pdCBjYXRjaF90ZWxsKCkKKyAgICAgICAgLy8gZnVua3Rpb25pZXJ0LiBEYXMgendlaXRlIE9iamVrdCBkYXJmIG5pY2h0IGxlYmVuZGlnIHNlaW4sIGRhbWl0CisgICAgICAgIC8vIHdyaXRlKCkgYW4gZGVuIGFrdHVlbGxlbiBCZW51dHplciBnZWh0LgorCisgICAgICAgIE9iamVrdCAxIChsaXZpbmcpOgorICAgICAgICAgICAgdm9pZCBjYXRjaF90ZWxsKHN0cmluZyBzdHIpIHsKKyAgICAgICAgICAgICAgICB3cml0ZSgiRW1wZmFuZ2VuOiAiK3N0cisiXG4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBPYmpla3QgMiAobmljaHQgbGl2aW5nKToKKyAgICAgICAgICAgIHZvaWQgZnVuYygpIHsKKyAgICAgICAgICAgICAgICAuLi4KKyAgICAgICAgICAgICAgICBzYXkoIkhpSG8hXG4iKTsKKyAgICAgICAgICAgICAgICAuLi4KKyAgICAgICAgICAgIH0KKworICAgICAgICAvLyBFaW4gZXR3YXMga29tcGxleGVyZXMgQmVpc3BpZWwgemVpZ3QgZGFzIFp1c2FtbWVuc3BpZWwgdm9uIHNheSgpCisgICAgICAgIC8vIHVuZCBjYXRjaF9tc2coKS4gQXVjaCBoaWVyIHdpcmQgZWluIG5pY2h0LWxlYmVuZGlnZXMgT2JqZWt0CisgICAgICAgIC8vIHZlcndlbmRldCwgZGFzIGRpZSBOYWNocmljaHQgYXVzZ2lidCwgc29kYXNzIGRhcyAnd2VyJyBpbgorICAgICAgICAvLyBjYXRjaF9tc2coKSBhdWYgZGVuIGFrdHVlbGxlbiBCZW51dHplciB6ZWlndC4KKworICAgICAgICBPYmplY3QgMSAobGl2aW5nKToKKyAgICAgICAgICAgIHZvaWQgY2F0Y2hfbXNnKG1peGVkICphcnIsIG9iamVjdCB3aG8pIHsKKyAgICAgICAgICAgICAgICBmb3JlYWNoKG1peGVkIGVsZW1lbnQ6IGFycikKKyAgICAgICAgICAgICAgICAgICAgdGVsbF9vYmplY3Qod2hvLCBzcHJpbnRmKCIlT1xuIiwgZWxlbWVudCkpOworICAgICAgICAgICAgfQorCisgICAgICAgIE9iamVjdCAyIChuaWNodCBsaXZpbmcpOgorICAgICAgICAgICAgdm9pZCBmdW5jKCkgeworICAgICAgICAgICAgICAgIC4uLgorICAgICAgICAgICAgICAgIHNheSggKHsgIkhlbGxvIiwgInRoZXJlISIgfSkgKTsKKyAgICAgICAgICAgICAgICAuLi4KKyAgICAgICAgICAgIH0KKworU0lFSEUgQVVDSAorICAgICAgICBBZWhubGljaDogICB0ZWxsX3Jvb20oRSksIHdyaXRlKEUpLCBzaG91dChFKSwgdGVsbF9vYmplY3QoRSksCisgICAgICAgICAgICAgICAgICAgIHByaW50ZihFKQorICAgICAgICBWZXJ3YW5kdDogICBjYXRjaF90ZWxsKEUpLCBjYXRjaF9tc2coQSkKKyAgICAgICAgU29uc3RpZ2VzOiAgb2JqZWN0X25hbWUoRSkKKworNy5BdWcgMjAwNyBHbG9pbnNvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL3NlbmRfZXJxIGIvZG9jL2VmdW4vc2VuZF9lcnEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM1MjFlMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL3NlbmRfZXJxCkBAIC0wLDAgKzEsMjQgQEAKK0dFU0NIVUVUWlQKK1NZTk9QU0lTCisgICAgICAgIGludCBzZW5kX2VycShpbnQgcmVxdWVzdCwgc3RyaW5nfGludCAqZGF0YSwgY2xvc3VyZSBjYWxsYmFjayk7CisKK0JFU0NIUkVJQlVORworICAgICAgICBFaW5lIEFuZnJhZ2Ugdm9tIFR5cCA8cmVxdWVzdD4gKHN0YW5kYXJkbWFlc3NpZyAwKSB3aXJkIG1pdCBJbmhhbHQKKyAgICAgICAgPGRhdGE+IHdvcmQgYW4gZGVuIEVSUSBnZXNhbmR0LiBXZW5uIDxjYWxsYmFjaz4gYW5nZWdlYmVuIGlzdCwKKyAgICAgICAgd2lyZCBkaWVzZSBDbG9zdXJlIGF1ZmdlcnVmZW4sIHdlbm4gZWluZSBBbnR3b3J0IHZvbSBFUlEgZWludHJpZmZ0CisgICAgICAgIChlaW4gU3RhdHVzIENvZGUpLCB2b3JhdXNnZXNldHp0IGRpZSBBbnR3b3J0IGVudGhhZWx0IGF1c3JlaWNoZW5kCisgICAgICAgIERhdGVuLCB1bSBkYW1pdCB6dSBhcmJlaXRlbjoKKworICAgICAgICAgICAgdm9pZCA8Y2xvc3VyZT4oaW50ICpyZXNwb25zZV9kYXRhLCBpbnQgbGVuKTsKKworICAgICAgICA8ZGF0YT4ga2FubiBlbnR3ZWRlciBlaW4gU3RyaW5nIG9kZXIgZWluIEFycmF5IHZvbiBJbnRlZ2VycyBzZWluLAorICAgICAgICB3b2JlaSBpbSB6d2VpdGVuIEZhbGwgZGllIFphaGxlbiBhbHMgWmVpY2hlbiBpbnRlcnByZXRpZXJ0IHdlcmRlbi4KKyAgICAgICAgRGllIHVudGVyc2NoaWVkbGljaGVuIEFuZnJhZ2VuIHNpbmQgaW4gL3N5cy9lcnEuaCBkZWZpbmllcnQuCisKKyAgICAgICAgRGllIEZ1bmt0aW9uIGxpZWZlcnQgMCB6dXJ1ZWNrLCB3ZW5uIGRhcyBTZW5kZW4gZmVobGdlc2NobGFnZW4gaXN0LAorICAgICAgICBldHdhcyBhbmRlcmVzIHNvc3QuCisKKyAgICAgICAgRGllIEZ1bmt0aW9uIHZlcnVyc2FjaHQgZWluZSBTY2h1dHp2ZXJsZXR6dW5nICJlcnEiLgorCitTSUVIRSBBVUNICisgICAgICAgIGF0dGFjaF9lcnFfZGVtb24oRSksIGVycShDKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vc2VuZF91ZHAgYi9kb2MvZWZ1bi9zZW5kX3VkcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWQwYzMzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vc2VuZF91ZHAKQEAgLTAsMCArMSwxMiBAQAorU1lOT1BTSVM6CisJaW50IHNlbmRfdWRwKHN0cmluZyBob3N0LCBpbnQgcG9ydCwgc3RyaW5nIG1lc3NhZ2UpCisKK0RFU0NSSVBUSU9OOgorCVNlbmRzIFRoZSBtZXNzYWdlIGluIGFuIFVEUCBwYWNrZXQgdG8gdGhlIGdpdmVuIGhvc3QgYW5kIHBvcnQKKwludW1iZXIuIENhdXNlcyBhIHByaXZpbGVnZSB2aW9sYXRpb24uCisJUmV0dXJucyAxIG9uIHN1Y2Nlc3MsIDAgb24gZmFpbHVyZS4KKworU0VFIEFMU086CisJcmVjZWl2ZV91ZHAoTSkKKworMjkuMTAuMjAwNiBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9zZXRfYXV0b19pbmNsdWRlX3N0cmluZyBiL2RvYy9lZnVuL3NldF9hdXRvX2luY2x1ZGVfc3RyaW5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0N2U1MGQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9zZXRfYXV0b19pbmNsdWRlX3N0cmluZwpAQCAtMCwwICsxLDE5IEBACitERVBSRUNBVEVECitTWU5PUFNJUzoKKwl2b2lkIHNldF9hdXRvX2luY2x1ZGVfc3RyaW5nKHN0cmluZyBhcmcpCisKK0RFU0NSSVBUSU9OOgorCisJVGhlIGFyZyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgaW50byBldmVyeSBjb21waWxlZCBMUEMKKwlvYmplY3QuIFRoaXMgaXMgdXNlZnVsIHRvIGVuZm9yY2UgZ2xvYmFsIGRlZmluaXRpb25zLCBlLmcuCisJYGAjcHJhZ21hIGNvbWJpbmVfc3RyaW5ncycnIG9yIGBgI3ByYWdtYSBzdHJpY3RfdHlwZXMnJy4gIFRoZQorCWNhbGxpbmcgb2JqZWN0bmVlZHMgdG8gYmUgcHJpdmlsZWdlZCBieSB0aGUgbWFzdGVyIG9iamVjdC4KKworTk9URToKKyAgTm90IGF2YWlsYWJsZSBpbiBMRE11ZCAzLjMueAorICBQbGVhc2UgdXNlIHRoZSBkcml2ZXIgaG9vayBIX0FVVE9fSU5DTFVERSBpbiBMRE11ZCA+IDMuMi45CisKK1NFRSBBTFNPOgorCXByaXZpbGVnZV92aW9sYXRpb24oTSksIHByYWdtYShMUEMpCisgIAorMjkuMTAuMjAwNiBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9zZXRfYml0IGIvZG9jL2VmdW4vc2V0X2JpdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDdjNmI1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vc2V0X2JpdApAQCAtMCwwICsxLDMwIEBACitTWU5PUFNJUworICAgICAgICBzdHJpbmcgc2V0X2JpdChzdHJpbmcgc3RyLCBpbnQgbik7CisKK0JFU0NIUkVJQlVORworICAgICAgICBMaWVmZXJ0IGVpbmVuIG5ldWVuIFN0cmluZywgYmVpIGRlbSBkYXMgQml0IDxuPiBpbiA8c3RyPiBnZXNldHp0CisgICAgICAgIGlzdC4gRGFiZWkgd2lyZCBkZXIgdXJzcHJ1ZW5nbGljaGUgU3RyaW5nIDxzdHI+IG5pY2h0IHZlcmFlbmRlcnQuCisKKyAgICAgICAgSmVkZXMgWmVpY2hlbiBlbnRoYWVsdCA2IEJpdHMuIEluIGplZGVtIFplaWNoZW4ga2FubiBkZXNoYWxiIGVpbmUKKyAgICAgICAgWmFobCB2b24gMCBiaXMgNjMgZ2VzcGVpY2hlcnQgd2VyZGUgKDJeNj02NCkuIERhcyBlcnN0ZSBaZWljaGVuCisgICAgICAgIGlzdCBkZXIgTGVlcnNjaGxhZyAiICIgbWl0IGRlbSBXZXJ0IDAuIERhcyBlcnN0ZSBaZWljaGVuIGltIFN0cmluZworICAgICAgICBpc3QgamVuZXMgbWl0IGRlbiBuaWVkcmlnc3RlbiBCaXRzICgwLTUpLgorCisgICAgICAgIERlciBuZXVlIFN0cmluZyB3aXJkIGF1dG9tYXRpc2NoIHZlcmxhZW5nZXJ0LCBmYWxscyBub2V0aWcuCisKK0JFSVNQSUVMCisgICAgICAgIHN0cmluZyBzOworICAgICAgICBzPXNldF9iaXQoIj8iLDUpOworCisgICAgICAgIFdlaWwgIj8iIGVpbmVuIFdlcnQgdm9uIDMxIGhhdCwgaXN0IGRhcyA2LiBCaXQgbmljaHQgZ2VzZXR6dC4gV2lyZAorICAgICAgICBlcyBnZXNldHp0LCBzbyBlcmdpYnQgc2ljaCAiXyIuIERlciBTdHJpbmcgcyBlbnRoYWVsdCBudW4gYWxzbyAiXyIuCisKKyAgICAgICAgc3RyaW5nIHM7CisgICAgICAgIHM9c2V0X2JpdCgiNzgiLDMpOworICAgICAgICBzPXNldF9iaXQocyw4KTsKKworICAgICAgICBzIGVudGhhZWx0IG51biAiPzwiLgorCitTSUVIRSBBVUNICisgICAgICAgIGNsZWFyX2JpdChFKSwgbGFzdF9iaXQoRSksIG5leHRfYml0KEUpLCB0ZXN0X2JpdChFKSwgY291bnRfYml0cyhFKSwKKyAgICAgICAgYW5kX2JpdHMoRSksIG9yX2JpdHMoRSksIHhvcl9iaXRzKEUpLCBpbnZlcnRfYml0cyhFKSwgY29weV9iaXRzKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9zZXRfZHJpdmVyX2hvb2sgYi9kb2MvZWZ1bi9zZXRfZHJpdmVyX2hvb2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ4OTEyMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL3NldF9kcml2ZXJfaG9vawpAQCAtMCwwICsxLDk4IEBACitTWU5PUFNJUworICAgICAgICB2b2lkIHNldF9kcml2ZXJfaG9vayhpbnQgd2hhdCwgY2xvc3VyZSBhcmcpCisgICAgICAgIHZvaWQgc2V0X2RyaXZlcl9ob29rKGludCB3aGF0LCBzdHJpbmcgYXJnKQorICAgICAgICB2b2lkIHNldF9kcml2ZXJfaG9vayhpbnQgd2hhdCwgc3RyaW5nICogYXJnKQorCitERVNDUklQVElPTgorICAgICAgICBUaGlzIHByaXZpbGVnZWQgZWZ1biBzZXRzIHRoZSBkcml2ZXIgaG9vayAnd2hhdCcgKHZhbHVlcyBhcmUKKyAgICAgICAgZGVmaW5lZCBpbiAvc3lzL2RyaXZlcl9ob29rLmgpIHRvICdhcmcnLgorICAgICAgICBUaGUgZXhhY3QgbWVhbmluZ3MgYW5kIHR5cGVzIG9mICdhcmcnIGRlcGVuZCBvZiB0aGUgaG9vayBzZXQuCisgICAgICAgIFRvIHJlbW92ZSBhIGhvb2ssIHNldCAnYXJnJyB0byAwLgorCisgICAgICAgIFRoZXNlIGhvb2tzIGV4aXN0OgorCisgICAgICAgIEhfTU9WRV9PQkpFQ1QwCisgICAgICAgIEhfTU9WRV9PQkpFQ1QxCisgICAgICAgICAgYXJnOiB1bmJvdW5kIGxhbWJkYQorICAgICAgICAgIE1hbmRhdG9yeSBob29rcyBpbXBsZW1lbnRpbmcgdGhlIG1vdmVfb2JqZWN0KCkgZWZ1bi4KKworICAgICAgICBIX0xPQURfVUlEUworICAgICAgICBIX0NMT05FX1VJRFMKKyAgICAgICAgICBhcmc6IHVuYm91bmQgbGFtYmRhIG9yIGxmdW4gY2xvc3VyZQorICAgICAgICAgIE1hbmRhdG9yeSBob29rcyB0byBkZXRlcm1pbmUgdGhlIChlKXVpZCBvZiBuZXcgb2JqZWN0cy4KKworICAgICAgICBIX0NSRUFURV9TVVBFUgorICAgICAgICBIX0NSRUFURV9PQgorICAgICAgICBIX0NSRUFURV9DTE9ORQorICAgICAgICBIX1JFU0VUCisgICAgICAgIEhfQ0xFQU5fVVAKKyAgICAgICAgICBhcmc6IGxhbWJkYSBjbG9zdXJlIChIX0NMRUFOX1VQIGFsc28gYWNjZXB0cyBhIGxmdW4KKyAgICAgICAgICAgIGNsb3N1cmUpLCBmdW5jdGlvbiBuYW1lLgorICAgICAgICAgIE9wdGlvbmFsIGhvb2tzIGZvciBjcmVhdGlvbi9yZXNldC9jbGVhbiB1cC1hY3Rpb25zLgorCisgICAgICAgIEhfREVGQVVMVF9NRVRIT0QKKyAgICAgICAgICBhcmc6IGxhbWJkYSBjbG9zdXJlLCBsZnVuIGNsb3N1cmUsIGZ1bmN0aW9uIG5hbWUuCisgICAgICAgICAgT3B0aW9uYWwgaG9vayBmb3IgZGVmYXVsdCBtZXRob2QgaW1wbGVtZW50YXRpb24uCisKKyAgICAgICAgSF9ERUZBVUxUX1BST01QVAorICAgICAgICAgIGFyZzogbGFtYmRhIGNsb3N1cmUsIGxmdW4gY2xvc3VyZSwgcHJvbXB0IHN0cmluZy4KKyAgICAgICAgICBPcHRpb25hbCBob29rIGZvciB0aGUgZGVmYXVsdCBjb21tYW5kIHByb21wdC4KKworICAgICAgICBIX1BSSU5UX1BST01QVAorICAgICAgICAgIGFyZzogbGFtYmRhIGNsb3N1cmUsIGxmdW4gY2xvc3VyZSwgZnVuY3Rpb24gbmFtZS4KKyAgICAgICAgICBPcHRpb25hbCBob29rIHRvIHByaW50IHRoZSBjb21tYW5kIHByb21wdC4KKworICAgICAgICBIX01PRElGWV9DT01NQU5ECisgICAgICAgICAgYXJnOiBsYW1iZGEgY2xvc3VyZSwgbGZ1biBjbG9zdXJlLCBmdW5jdGlvbiBuYW1lLCBtYXBwaW5nCisgICAgICAgICAgT3B0aW9uYWwgaG9vayBmb3IgbW9kaWZ5aW5nIHBsYXllciBjb21tYW5kcyBiZWZvcmUgdGhlCisgICAgICAgICAgcGFyc2VyIHNlZXMgdGhlbS4KKworICAgICAgICBIX05PVElGWV9GQUlMCisgICAgICAgICAgYXJnOiBsYW1iZGEgY2xvc3VyZSwgbGZ1biBjbG9zdXJlLCBzdHJpbmcuCisgICAgICAgICAgTWFuZGF0b3J5IGhvb2sgdG8gZ2VuZXJhdGUgdGhlIGRlZmF1bHQgbWVzc2FnZSBpZiBhbiBlbnRlcmVkCisgICAgICAgICAgY29tbWFuZCBjb3VsZG4ndCBiZSBwYXJzZWQgYW5kIG5vIG5vdGlmeV9mYWlsKCkgY29tbWFuZCBpcworICAgICAgICAgIGluIGVmZmVjdC4KKworICAgICAgICBIX1NFTkRfTk9USUZZX0ZBSUwKKyAgICAgICAgICBhcmc6IGxhbWJkYSBjbG9zdXJlLCBsZnVuIGNsb3N1cmUsIHN0cmluZy4KKyAgICAgICAgICBPcHRpb25hbCBob29rIHRvIGRlbGl2ZXIgdGhlIG5vdGlmeSBmYWlsIG1lc3NhZ2UgZnJvbSBhIGZhaWxlZAorICAgICAgICAgIGNvbW1hbmQuCisKKyAgICAgICAgSF9OT19JUENfU0xPVAorICAgICAgICAgIGFyZzogc3RyaW5nLgorICAgICAgICAgIE9wdGlvbmFsIGhvb2sgc3BlY2lmeWluZyB0aGUgJ3NvcnJ5JyBtZXNzYWdlcyBpZiBsb2dpbnMgYXJlCisgICAgICAgICAgcmVqZWN0ZWQgZHVlIHRvIGZ1bGxuZXNzIG9mIHRoZSBtdWQuCisKKyAgICAgICAgSF9JTkNMVURFX0RJUlMKKyAgICAgICAgICBhcmc6IGxhbWJkYSBjbG9zdXJlLCBsZnVuIGNsb3N1cmUsIHN0cmluZyBhcnJheS4KKyAgICAgICAgICBTZW1pLW1hbmRhdG9yeSBob29rIHNwZWNpZnlpbmcgdGhlIGRpcmVjdG9yaWVzIHdoZXJlIDw+LXR5cGUKKyAgICAgICAgICBpbmNsdWRlIGZpbGVzIGFyZSBzZWFyY2hlZC4KKworICAgICAgICBIX0FVVE9fSU5DTFVERQorICAgICAgICAgIGFyZzogbGFtYmRhIGNsb3N1cmUsIGxmdW4gY2xvc3VyZSwgc3RyaW5nCisgICAgICAgICAgT3B0aW9uYWwgaG9vayB0byBzcGVjaWZ5IGEgc3RyaW5nIHRvIGJlIGluY2x1ZGVkIGJlZm9yZSB0aGUKKyAgICAgICAgICBzb3VyY2Ugb2YgZXZlcnkgY29tcGlsZWQgTFBDIG9iamVjdC4KKworICAgICAgICBIX1RFTE5FVF9ORUcKKyAgICAgICAgICBhcmc6IGxhbWJkYSBjbG9zdXJlLCBsZnVuIGNsb3N1cmUsIHN0cmluZy4KKyAgICAgICAgICBPcHRpb25hbCBob29rIHRvIHNwZWNpZml5IGhvdyB0byBwZXJmb3JtIGEgc2luZ2xlIHRlbG5ldAorICAgICAgICAgIG5lZ290aWF0aW9uLgorCisgICAgICAgIEhfTk9FQ0hPCisgICAgICAgICAgYXJnOiBsYW1iZGEgY2xvc3VyZSwgbGZ1biBjbG9zdXJlLCBzdHJpbmcuCisgICAgICAgICAgT3B0aW9uYWwgaG9vayB0byBzcGVjaWZpeSBob3cgdG8gcGVyZm9ybSB0aGUgdGVsbmV0IGFjdGlvbnMKKyAgICAgICAgICB0byBzd2l0Y2ggdGhlIGVjaG8gbW9kZSAodXNlZCBmb3IgZS5nLiBwYXNzd29yZCBpbnB1dF90bygpcykuCisKKyAgICAgICAgSF9FUlFfU1RPUAorICAgICAgICAgIGFyZzogbGFtYmRhIGNsb3N1cmUsIGxmdW4gY2xvc3VyZS4KKyAgICAgICAgICBPcHRpb25hbCBob29rIHRvIG5vdGlmeSB0aGUgbXVkbGliIGFib3V0IHRoZSB0ZXJtaW5hdGlvbiBvZgorICAgICAgICAgIHRoZSBlcnEgZGVtb24uCisKKyAgICAgICAgU2VlIGhvb2tzKEMpIGZvciBhIGRldGFpbGVkIGRpc2N1c3Npb24uCisKK0hJU1RPUlkKKyAgICAgICAgSW50cm9kdWNlZCBpbiAzLjIuMUAxIGFzIGVmdW4zMDkoKSwgcmVuYW1lZCB0bworICAgICAgICBzZXRfZHJpdmVyX2hvb2soKSBpbiAzLjIuMUAxMworCitTRUUgQUxTTworICAgICAgICBob29rcyhDKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vc2V0X2Vudmlyb25tZW50IGIvZG9jL2VmdW4vc2V0X2Vudmlyb25tZW50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlM2E5NjkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9zZXRfZW52aXJvbm1lbnQKQEAgLTAsMCArMSwyMCBAQAorU1lOT1BTSVMKKwl2b2lkIHNldF9lbnZpcm9ubWVudChvYmplY3QgaXRlbSwgb2JqZWN0IGVudikKKworREVTQ1JJUFRJT04KKwlUaGUgaXRlbSBpcyBtb3ZlZCBpbnRvIGl0cyBuZXcgZW52aXJvbm1lbnQgZW52LCB3aGljaCBtYXkgYmUgMC4KKwlUaGlzIGVmdW4gaXMgdG8gYmUgdXNlZCBpbiB0aGUgbW92ZV9vYmplY3QoKSBob29rLCBhcyBpdCBkb2VzCisJbm90aGluZyBlbHNlIHRoYW4gbW92aW5nIHRoZSBpdGVtIC0gbm8gY2FsbHMgdG8gaW5pdCgpIG9yIHN1Y2guCisKKwlEb24ndCB1c2UgaXQgaW4geW91ciBvd24gb2JqZWN0cyEKKworSElTVE9SWQorICBJbnRyb2R1Y2VkIGluIDMuMi4xQDEgYXMgJ2VmdW4zMDgoKScsIHJlbmFtZWQgdG8gJ3NldF9lbnZpcm9ubWVudCgpJworICAgICAgICAgICAgICAgIGluIDMuMi42IGFuZCBMUCAiMDMuMDIuMUAxNTAiLgorCitTRUUgQUxTTworCXJlbW92ZShBKSwgaW5pdChBKSwgbW92ZV9vYmplY3QoRSksIHRyYW5zZmVyKEUpLCBob29rcyhDKSwKKwluYXRpdmUoQykKKworMjkuMTAuMjAwNiBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL3NldF9leHRyYV93aXppbmZvIGIvZG9jL2VmdW4vc2V0X2V4dHJhX3dpemluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAwOTVjOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL3NldF9leHRyYV93aXppbmZvCkBAIC0wLDAgKzEsMjIgQEAKK1NZTk9QU0lTCisgICAgICAgIHZvaWQgc2V0X2V4dHJhX3dpemluZm8gKG9iamVjdCB3aXosIG1peGVkIGV4dHJhKQorICAgICAgICB2b2lkIHNldF9leHRyYV93aXppbmZvIChzdHJpbmcgd2l6LCBtaXhlZCBleHRyYSkKKyAgICAgICAgdm9pZCBzZXRfZXh0cmFfd2l6aW5mbyAoaW50ICAgIHdpeiwgbWl4ZWQgZXh0cmEpCisKK0RFU0NSSVBUSU9OCisgICAgICAgIFNldCB0aGUgdmFsdWUgPGV4dHJhPiBhcyB0aGUgJ2V4dHJhJyBpbmZvcm1hdGlvbiBmb3IgdGhlIHdpemxpc3QKKyAgICAgICAgZW50cnkgb2YgPHdpej4uCisKKyAgICAgICAgSWYgPHdpej4gaXMgYW4gb2JqZWN0LCB0aGUgZW50cnkgb2YgaXRzIGNyZWF0b3IgKHVpZCkgaXMgdXNlZC4KKyAgICAgICAgSWYgPHdpej4gaXMgYSBzdHJpbmcgKGEgY3JlYXRvciBha2EgdWlkKSwgaXQgbmFtZXMgdGhlIGVudHJ5CisgICAgICAgIHRvIHVzZS4KKyAgICAgICAgSWYgPHdpej4gaXMgdGhlIG51bWJlciAwLCB0aGUgZGF0YSBpcyBzZXQgaW4gdGhlIGRlZmF1bHQgd2l6bGlzdAorICAgICAgICBlbnRyeS4gSXQgY2FuIGJlIHVzZWQgdG8gc3RvcmUgZGF0YSBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoaXMKKyAgICAgICAgZHJpdmVyIHJ1biwgbGlrZSB0aGUgdGltZSBvZiB0aGUgbGFzdCByZWJvb3QuCisKKyAgICAgICAgVGhlIDxleHRyYT4gYXJndW1lbnQgbWF5IGJlIGFueSB2YWx1ZS4KKworICAgICAgICBUaGUgZnVuY3Rpb24gY2F1c2VzIGEgcHJpdmlsZWdlIHZpb2xhdGlvbi4KKworU0VFIEFMU08KKyAgICAgICAgZ2V0X2V4dHJhX3dpemluZm8oRSksIHNldF9leHRyYV93aXppbmZvX3NpemUoRSksIHdpemxpc3RfaW5mbyhFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vc2V0X25leHRfcmVzZXQgYi9kb2MvZWZ1bi9zZXRfbmV4dF9yZXNldApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGNkM2I3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vc2V0X25leHRfcmVzZXQKQEAgLTAsMCArMSw1NSBAQAorRlVOS1RJT04KKyAgICAgaW50IHNldF9uZXh0X3Jlc2V0KGludCBkZWxheSkKKworQVJHVU1FTlRFCisgICAgIGRlbGF5IC0gbWluaW1hbGUgWmVpdCBiaXMgenVtIG5hZWNoc3RlbiBSZXNldCBkZXMgT2JqZWt0ZXMKKworQkVTQ0hSRUlCVU5HCisgICAgIE1pdCBkaWVzZXIgZWZ1biBpc3QgZXMgbW9lZ2xpY2ggRWluZmx1c3MgYXVmIGRhcyBSZXNldHZlcmhhbHRlbiBkZXMKKyAgICAgT2JqZWt0ZXMgenUgbmVobWVuOgorCisgICAgIERhcyBPYmpla3QgYmVrb21tdCBlaW5lbiByZXNldCgpLUF1ZnJ1ZiBmcnVlaGVzdGVucyBpbiA8ZGVsYXk+IFNla3VuZGVuLgorICAgICBCZWkgQW5nYWJlIGVpbmVzIFdlcnRlcyA8MCB3aXJkIGRlciByZXNldCgpIGb8ciBkYXMgT2JqZWt0IGFiZ2VzY2hhbHRldCwKKyAgICAgd2FzIGZ1ZXIgQmx1ZXByaW50cyBnZWxlZ2VudGxpY2ggc2lubnZvbGwgaXN0LgorCisgICAgIEludGVybiB3aXJkIGluIGdsZWljaGJsZWliZW5kZW4gQWJzdGFlbmRlbiAoZGVyemVpdDogaW4gZGVyIFJlZ2VsIDJzLAorICAgICBrYW5uIHNpY2ggYWJlciBhdWNoIHZlcnpvZWdlcm4sIHdlbm4gZGVyIERyaXZlciB2aWVsIHp1IGhhdCwgei5CLiBhdWYgCisgICAgIDRzKSBnZXBydWVmdCBvYiBkaWUgWmVpdCB6dW0genVtIG5hZWNoc3RlbiByZXNldCgpIGFiZ2VsYXVmZW4gaXN0LiAKKyAgICAgU29sbHRlIGRpZXMgZGVyIEZhbGwgc2Vpbiwgd2lyZCBkaWUgRnVua3Rpb24gcmVzZXQoKSBpbSBPYmpla3QgCisgICAgIGF1ZmdlcnVmZW4uCisKKyAgICAgRGllIEZ1bmt0aW9uIGdpYnQgZGllIHZlcmJsZWliZW5kZSBaZWl0IGJpcyB6dW0gbmFlY2hzdGVuIFJlc2V0CisgICAgIHp1cnVlY2ssIGJldm9yIDxkZWxheT4gZ2VzZXR6dCB3dXJkZS4gRGVyIFdlcnQga2FubiBhdWNoIG5lZ2F0aXYKKyAgICAgc2Vpbiwgd2VubiBkZXIgUmVzZXQgdWViZXJmYWVsbGlnIHdhci4KKworICAgICBBY2h0dW5nOiBkaWUgdGF0c2FlY2hsaWNoZSBaZWl0LCB3YW5uIGRlciBSZXNldCBpbSBPYmpla3QgZHVyY2hnZWZ1ZWhydAorICAgICB3aXJkLCBoYWVuZ3QgYXVjaCBkYXZvbiBhYiwgb2IgZGFzIE9iamVrdCBuYWNoIEFibGF1ZiB2b24gPGRlbGF5PgorICAgICB2ZXJ3ZW5kZXQgd2lyZC4KKworQkVJU1BJRUxFCisgICAgIC8vIGVpbiBPYmpla3QgbWl0IHZlcmt1ZXJ6dGVyIHJlc2V0KCktWmVpdAorICAgICB2b2lkIGNyZWF0ZSgpIHsKKyAgICAgICAuLi4KKyAgICAgICBzZXRfbmV4dF9yZXNldCgxNSo2MCk7CS8vIH4gMTUgTWludXRlbgorICAgICAgIC4uLgorICAgICB9CisKKyAgICAgdm9pZCByZXNldCgpIHsKKyAgICAgICBzZXRfbmV4dF9yZXNldCg5MDApOwkvLyBkaWUgbXVzcyBpbSByZXNldCgpIGltbWVyIHdpZWRlcgorICAgICAgIDo6cmVzZXQoKTsgICAgICAgICAgIC8vIG5ldSBnZXNldHp0IHdlcmRlbgorICAgICB9CisKKyAgICAgLy8gZWluIE9iamVrdCwgZGVzc2VuIEJsdWVwcmludCBrZWluZW4gcmVzZXQoKSBiZWtvbW1lbiBzb2xsCisgICAgIHZvaWQgY3JlYXRlKCkgeworICAgICAgIGlmKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHsKKyAgICAgICAgIHNldF9uZXh0X3Jlc2V0KC0xKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgICB9CisgICAgICAgOjpjcmVhdGUoKTsKKyAgICAgICAuLi4KKyAgICAgfQorCitTSUVIRSBBVUNICisgICAgIGNhbGxfb3V0KEUpLCBvYmplY3RfaW5mbyhFKSwgcmVzZXQoTCksIHF1ZXJ5X25leHRfcmVzZXQoRSkKKworNy5BdWcgMjAwNyBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vc2V0X3RoaXNfb2JqZWN0IGIvZG9jL2VmdW4vc2V0X3RoaXNfb2JqZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZmRhNTYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9zZXRfdGhpc19vYmplY3QKQEAgLTAsMCArMSw2MCBAQAorR0VTQ0hVRVRaVAorU1lOT1BTSVMKKyAgICAgICAgdm9pZCBzZXRfdGhpc19vYmplY3Qob2JqZWN0IG9iamVrdC1hbi1zdGVsbGUtdm9uLW9yaWdpbmFsb2JqZWt0KTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIERpZXMgaXN0IGVpbmUgZ2VzY2h1ZXR6dGUgRnVua3Rpb24sIGRpZSBudXIgdm9tIE1hc3Rlci1PYmpla3QgdW5kIGltCisgICAgICAgIFNpbXVsLUVmdW4tT2JqZWt0IGdlbnV0enQgd2VyZGVuIGRhcmYuIEJlaSBzb25zdGlnZXIgQmVudXR6dW5nCisgICAgICAgIGVyemV1Z3QgZGllc2UgRnVua3Rpb24gZWluZW4gRmVobGVyLgorCisgICAgICAgIERpZSBGdW5rdGlvbiBhZW5kZXJ0IGRhcyBSZXN1bHRhdCB2b24gdGhpc19vYmplY3QoKSBpbiBkZXIgbGF1ZmVuZGVuCisgICAgICAgIEZ1bmt0aW9uLCBlYmVuc28gZGFzIFJlc3VsdGF0IHZvbiBwcmV2aW91c19vYmplY3QoKSBpbiBGdW5rdGlvbmVuIGluCisgICAgICAgIGFuZGVyZW4gT2JqZWt0ZW4sIGRpZSBlaW5lbiBjYWxsX290aGVyKCkgQXVmcnVmIG1hY2hlbi4KKworICAgICAgICBEZXIgRWZmZWt0IHZvbiBzZXRfdGhpc19vYmplY3QoKSBibGVpYnQgYmVzdGVoZW4sIGJpcyBlaW4gZXh0ZXJuZXIKKyAgICAgICAgRnVua3Rpb25zYXVmcnVmIGFiZ2VzY2hsb3NzZW4gaXN0IG9kZXIgYmlzIHp1IGVpbmVtIGVybmV1dGVuCisgICAgICAgIHNldF90aGlzX29iamVjdCgpLiBXYWVocmVuZCBkZXIgQXVzZnVlaHJ1bmcgdm9uIENvZGUgaW0gTWFzdGVyLU9iamVrdAorICAgICAgICBvZGVyIGltIFNpbXVsLUVmdW4tT2JqZWt0IGlzdCBzZXRfdGhpc19vYmplY3QoKSBnYXJhbnRpZXJ0LCBhdWNoIHdlbm4KKyAgICAgICAgdGhpc19vYmplY3QoKSBkdXJjaCBzZXRfdGhpc19vYmplY3QoKSB2ZXJhZW5kZXJ0IHdpcmQuIERpZSBnaWx0CisgICAgICAgIG5pY2h0IGZ1ZXIgRnVua3Rpb25lbiwgZGllIGF1cyBhbmRlcmVuIFByb2dyYW1tZW4gaW5oZXJpdGV0IHdlcmRlbi4KKworICAgICAgICBEaWVzZSBGdW5rdGlvbiBkYXJmIG51ciBtaXQgaG9lY2hzdGVyIFNvcmdmYWx0IHZlcndlbmRldCB3ZXJkZW4sIHVtCisgICAgICAgIElua29uc2lzdGVuemVuIHp1IHZlcm1laWRlbi4gTmFjaCBlaW5lbSBBdWZydWYgdm9uIHNldF90aGlzX29iamVjdCgpCisgICAgICAgIGtvZW5uZW4gc2ljaCBnZXdpc3NlIExQQy1Lb25zdHJ1a3RlIG1lcmt3dWVyZGlnIHZlcmhhbHRlbiBvZGVyIGdhcgorICAgICAgICBkYXMgU3lzdGVtIHp1bSBBYnN0dXJ6IGJyaW5nZW4uIEluc2Jlc29uZGVyZSBkaWUgVmVyd2VuZHVuZyB2b24KKyAgICAgICAgZ2xvYmFsZW4gVmFyaWFibGVuIG9kZXIgZGVyIEF1ZnJ1ZiB2b24gbG9rYWxlbiBGdW5rdGlvbmVuIChhdXNzZXIKKyAgICAgICAgZHVyY2ggY2FsbF9vdGhlcigpKSBpc3QgdW56dWxhZXNzaWcgdW5kIHdpcmQgYWt0aXYgdmVyaGluZGVydC4KKworICAgICAgICBFcmxhdWJ0IHNpbmQgY2FsbF9vdGhlcigpLCBtYXAoKSwgZGVyIFp1Z3JpZmYgYXVmIGxva2FsZSBWYXJpYWJsZW4KKyAgICAgICAgKGRpZSBhdWNoIFBvaW50ZXIgYXVmIGdsb2JhbGUgQXJyYXlzIGVudGhhbHRlbiBkdWVyZmVuKSwgZWluZmFjaGUKKyAgICAgICAgQXJpdGhtZXRpayB1bmQgZGVyIFp1d2Vpc3VuZ3MtT3BlcmF0b3IuCisKK0JVR1MKKyAgICAgICAgRXMgaXN0IG1vbWVudGFuIG5pY2h0IG1vZWdsaWNoLCBkYXMgb3JpZ2luYWxlIGd1ZWx0aWdlIE9iamVrdCB3aWVkZXIKKyAgICAgICAgaGVyenVzdGVsbGVuLiBBbnN0ZWxsZSB2b246CisKKyAgICAgICAgICAgIG9iamVjdCBpY2ggPSB0aGlzX29iamVjdCgpOworICAgICAgICAgICAgc2V0X3RoaXNfb2JqZWN0KGRpbmdzKTsKKyAgICAgICAgICAgIDxpcmdlbmR3ZWxjaGVyIENvZGU+CisgICAgICAgICAgICBzZXRfdGhpc19vYmplY3QoaWNoKTsKKyAgICAgICAgICAgIDxtZWhyIENvZGU+CisKKyAgICAgICAgbXVzcyBkYXMgdWViZXIgZWluZW4gVW13ZWcgZ2Vsb2VzdCB3ZXJkZW46CisKKyAgICAgICAgICAgIHByaXZhdGUgdm9pZCB0dXdhcyhvYmplY3QgZGluZ3MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2V0X3RoaXNfb2JqZWN0KGRpbmdzKTsKKyAgICAgICAgICAgICAgICA8aXJnZW5kd2VsY2hlciBjb2RlPgorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmdW5jYWxsKCMndHV3YXMsIGRpbmdzKTsKKyAgICAgICAgICAgIDxtZWhyIENvZGU+CisKKyAgICAgICAgTWFuY2hlIExldXRlIGJlemVpY2huZW4gZGFzIGFscyBGZWF0dXJlLgorCitBRU5ERVJVTkdFTgorICAgICAgICBMRE11ZCAzLjIuMTAgdmVyaGluZGVydCBha3RpdiBkaWUgUmVmZXJlbnogYXVmIGdsb2JhbGUgVmFyaWFibGVuIHVuZAorICAgICAgICAgICAgRnVua3Rpb25zYXVmcnVmZSBuYWNoIEFkcmVzc2UsIHdhZWhyZW4gc2V0X3RoaXNfb2JqZWN0KCkgZ2lsdC4KKworU0lFSEUgQVVDSAorICAgICAgICB0aGlzX29iamVjdChFKSwgc2V0X3RoaXNfcGxheWVyKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9zZXRfdGhpc19wbGF5ZXIgYi9kb2MvZWZ1bi9zZXRfdGhpc19wbGF5ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg1YzUyOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL3NldF90aGlzX3BsYXllcgpAQCAtMCwwICsxLDMxIEBACitHRVNDSFVFVFpUCitTWU5PUFNJUworICAgICAgICB2b2lkIHNldF90aGlzX3BsYXllcihvYmplY3Qgb2IpOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgQWVuZGVydCBkZW4gbW9tZW50YW5lbiBLb21tYW5kb2dlYmVyIHp1IDxvYj4uIERhYmVpIGthbm4gPG9iPiBhdWNoCisgICAgICAgIDAgc2Vpbiwgd2VubiBkZXIgYWt0dWVsbGUgS29tbWFuZG9nZWJlciAnZGVha3RpdmllcnQnIHdlcmRlbiBzb2xsLgorCisgICAgICAgIERpZXNlIEZ1bmt0aW9uIGlzdCBuaWNodCBnZXNjaHVldHp0IHVuZCBzb2xsdGUgZGVzaGFsYiB2b24gZWluZXIKKyAgICAgICAgc2ltdWxfZWZ1biB1ZWJlcmxhZ2VydCB3ZXJkZW4sIGRpZSBkaWUgRWZ1biBlbnR3ZWRlciBrb21wbGV0dAorICAgICAgICBhYnNjaGFsdGV0LCBvZGVyIG1pbmRlc3RlbnMgZ2V3aXNzZSBTaWNoZXJoZWl0c2NoZWNrcyBkdXJjaGZ1ZWhydC4KKyAgICAgICAgRXMgaXN0IHNvbnN0IGVpbmZhY2gsIGRpZSBTaWNoZXJoZWl0IGVpbmVzIE11ZHMgbWl0IEhpbGZlIGRpZXNlcgorICAgICAgICBFZnVuIHp1IHVudGVyZ3JhYmVuLgorCisgICAgICAgIERpZSBFZnVuIGlzdCBudXIgaW4gMy4yLjEgdmVyZnVlZ2Jhci4gRWluZSBtb2VnbGljaGUgU2ltdWxhdGlvbiBmdWVyCisgICAgICAgIDMuMiBrb2VubnRlIGV0d2Egc28gYXVzc2VoZW46CisKKyAgICAgICAgICAgIHZvaWQgc2V0X3RoaXNfcGxheWVyKG9iamVjdCBvYikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBJbnNlcnQgeW91ciBwcml2aWxlZ2UgY2hlY2tzIGhlcmUgKi8KKyAgICAgICAgICAgICAgICBpZiAobGl2aW5nKG9iKSkKKyAgICAgICAgICAgICAgICAgICAgZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VuYWJsZV9jb21tYW5kcywgb2IpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIChzdWdnZXN0ZWQgYnkgTWFyayBMZXdpcyAoTm9zdHJhZGFtdXNAWmViZWRlZSkpCisKK0FFTkRFUlVOR0VOCisgICAgICAgIEVpbmdlZnVlaHJ0IGluIExETXVkIDMuMi4xLgorICAgICAgICBMRE11ZCAzLjIuNiBmdWVocnRlIGRpZSAwIGFscyBtb2VnbGljaGVuIFBhcmFtZXRlciBlaW4uCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgc2V0X3RoaXNfb2JqZWN0KEUpLCB0aGlzX3BsYXllcihFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vc2V0ZXVpZCBiL2RvYy9lZnVuL3NldGV1aWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMyNzkzYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL3NldGV1aWQKQEAgLTAsMCArMSwxNyBAQAorU1lOT1BTSVMKKyAgICAgICAgaW50IHNldGV1aWQoc3RyaW5nIHN0cik7CisKK0JFU0NIUkVJQlVORworICAgICAgICBTZXR6dCBkaWUgZWZmZWt0aXZlIFVJRCBhdWYgPHN0cj4uIERhcyBhdWZydWZlbmRlIE9iamVrdCBtdXNzIGRhenUKKyAgICAgICAgdm9tIE1hc3Rlcm9iamVrdCBiZXJlY2h0aWd0IHNlaW4uIEluIGRlbiBtZWlzdGVuIEluc3RhbGxhdGlvbmVuCisgICAgICAgIGthbm4gZGllIGVmZmVrdGl2ZSBVSUQgamVkZXJ6ZWl0IGF1ZiBkaWUgbW9tZW50YW5lIFVJRCBkZXMgT2JqZWt0cywKKyAgICAgICAgYXVmIGRpZSBVSUQgZGVzIEVyc2NoYWZmZXJzIGRlcyBPYmpla3RzIG9kZXIgYXVmIDAgZ2VzZXR6dCB3ZXJkZW4uCisKKyAgICAgICAgTnVyIHdlbm4gZGllc2VyIFdlcnQgMCBpc3QsIGthbm4gZGllIFVJRCBkZXMgT2JqZWt0cyBkdXJjaAorICAgICAgICBleHBvcnRfdWlkKCkgdmVyYWVuZGVydCB3ZXJkZW4uCisKKyAgICAgICAgVW50ZXIgc3RyaWt0ZW4gZVVJRCBSZWdlbG4ga29lbm5lbiBPYmpla3RlIG1pdCBVSUQgMCBrZWluZSBhbmRlcmVuCisgICAgICAgIE9iamVrdGUgbGFkZW4gb2RlciBjbG9uZW4uCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgZXhwb3J0X3VpZChFKSwgZ2V0dWlkKEUpLCBnZXR1dWlkKEUpLCBnZXRldWlkKEUpLCBuYXRpdmUoQykKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL3NnbiBiL2RvYy9lZnVuL3NnbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzMxYzBkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vc2duCkBAIC0wLDAgKzEsMTcgQEAKK1NZTk9QU0lTCisgICAgICAgIGludCBzZ24gKGludHxmbG9hdCBhcmcpCisKK0JFU0NIUkVJQlVORworICAgICAgICBMaWVmZXJ0IGRhcyBWb3J6ZWljaGVuIGRlcyBBcmd1bWVudGVzLgorCisgICAgICAgIGFyZyAgc2duKGFyZykKKyAgICAgICAgLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgPiAwICAgMQorICAgICAgICAgIDAgICAwCisgICAgICAgIDwgMCAgLTEKKworQUVOREVSVU5HRU4KKyAgICAgICAgRWluZ2VmdWVocnQgaW4gTERNdWQgMy4yLjkuCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgYWJzKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9zaHV0ZG93biBiL2RvYy9lZnVuL3NodXRkb3duCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZWYwYWYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9zaHV0ZG93bgpAQCAtMCwwICsxLDE4IEBACitTWU5PUFNJUworICAgICAgICB2b2lkIHNodXRkb3duKCk7CisgICAgICAgIHZvaWQgc2h1dGRvd24oaW50IGV4aXRfY29kZSk7CisKK0JFU0NIUkVJQlVORworICAgICAgICBGYWVocnQgZGFzIE11ZCBoZXJ1bnRlci4gRGllc2UgRnVua3Rpb24gZGFyZiBuaWUgdmVyd2VuZGV0IHdlcmRlbiEKKyAgICAgICAgV2VubiBkYXMgTXVkIGhlcnVudGVyZ2VmYWhyZW4gd2VyZGVuIG11c3MsIHNvIGhhdCBkaWVzIHVlYmVyIGRlbgorICAgICAgICBTaHV0ZG93bmJlZmVobCB6dSBlcmZvbGdlbi4KKworICAgICAgICBJc3QgZWluIDxleGl0X2NvZGU+IEFyZ3VtZW50IGdlZ2ViZW4sIHdpcmQgc2VpbiBXZXJ0IGFscyBkZXIKKyAgICAgICAgVW5peC1SZXN1bHRhdHdlcnQgdmVyd2VuZGV0OyBhbmRlcm5mYWxscyB3aXJkIDAgdmVyd2VuZGV0LgorCisgICAgICAgIE1hbiBmcmFndCBzaWNoIG51biB2aWVsbGVpY2h0LCB3b3p1IGVzIGRhbm4gZGllc2UgRnVua3Rpb24gZ2lidCwKKyAgICAgICAgd2VubiBtYW4gc2llIG5pY2h0IHZlcndlbmRlbiBkYXJmLiBTb3JyeSwgZGFzIGRhcmYgaGllciBuaWNodAorICAgICAgICBiZWthbm50IGdlZ2ViZW4gd2VyZGVuLiBTdHJlbmcgZ2VoZWltLgorCitTSUVIRSBBVUNICisgICAgICAgIGJyZWFrX3BvaW50KEUpLCBzd2FwKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9zaW4gYi9kb2MvZWZ1bi9zaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVhYjdlYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL3NpbgpAQCAtMCwwICsxLDggQEAKK1NZTk9QU0lTCisgICAgICAgIGZsb2F0IHNpbihpbnR8ZmxvYXQpCisKK0JFU0NIUkVJQlVORworICAgICAgICBMaWVmZXJ0IGRlbiBTaW51cyBkZXMgQXJndW1lbnRlcy4KKworU0lFSEUgQVVDSAorICAgICAgICBhc2luKEUpLCBjb3MoRSksIGFjb3MoRSksIHRhbihFKSwgYXRhbihFKSwgYXRhbjIoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL3NpemVvZiBiL2RvYy9lZnVuL3NpemVvZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTAyM2I0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vc2l6ZW9mCkBAIC0wLDAgKzEsMTYgQEAKK1NZTk9QU0lTCisgICAgICAgIGludCBzaXplb2YobWl4ZWQgKiB2YWwpOworICAgICAgICBpbnQgc2l6ZW9mKHN0cmluZyAgdmFsKTsKKyAgICAgICAgaW50IHNpemVvZihtYXBwaW5nIHZhbCk7CisKK0JFU0NIUkVJQlVORworICAgICAgICBMaWVmZXJ0IGRpZSBBbnphaGwgRWxlbWVudGUgaW4gZWluZW0gQXJyYXkgPHZhbD4sIGRpZSBBbnphaGwKKyAgICAgICAgWmVpY2hlbiBpbiBlaW5lbSBTdHJpbmcgPHZhbD4gb2RlciBkaWUgQW56YWhsIEtleXMgaW4gZWluZW0gTWFwcGluZworICAgICAgICA8dmFsPi4KKworICAgICAgICBBbHMgU3BlemlhbGZhbGwga2FubiA8dmFsPiBhdWNoIDAgc2Vpbi4gSW4gZGllc2VtIEZhbGwgbGllZmVydCBkaWUKKyAgICAgICAgRnVua3Rpb24gMCB6dXJ1ZWNrLgorCitTSUVIRSBBVUNICisgICAgICAgIGFsbG9jYXRlKEUpLCBwb2ludGVycChFKSwgbWFwcGluZ3AoRSksIG1fYWxsb2NhdGUoRSksCisgICAgICAgIHdpZHRob2YoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL3NsX2Nsb3NlIGIvZG9jL2VmdW4vc2xfY2xvc2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUzOTQ4ZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL3NsX2Nsb3NlCkBAIC0wLDAgKzEsMTcgQEAKK09QVElPTkFMCitTWU5PUFNJUworICAgICAgICB2b2lkIHNsX2Nsb3NlKCkKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIFNjaGxpZXNzdCBkaWUgU1FMaXRlLURhdGVuYmFuaywgd2VsY2hlIHZvbSBha3R1ZWxsZW4gT2JqZWt0CisgICAgICAgIGdlb2VmZm5ldCB3dXJkZS4KKworICAgICAgICBEaWVzZSBGdW5rdGlvbiBpc3QgbnVyIHZlcmZ1ZWdiYXIsIHdlbm4gZGVyIERyaXZlciBtaXQgU1FMaXRlLQorICAgICAgICBVbnRlcnN0dWV0enVuZyBjb21waWxpZXJ0IHd1cmRlLiBJbiBkaWVzZW0gRmFsbCBpc3QgZGFzIE1ha3JvCisgICAgICAgIF9fU1FMSVRFX18gZGVmaW5pZXJ0LgorCitHRVNDSElDSFRFCisgICAgICAgIEVpbmdlZnVlaHJ0IGluIExETXVkIDMuMy43MTMuCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgc2xfb3BlbihFKSwgc2xfZXhlYyhFKSwgc2xfaW5zZXJ0X2lkKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9zbF9leGVjIGIvZG9jL2VmdW4vc2xfZXhlYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGM0YThmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vc2xfZXhlYwpAQCAtMCwwICsxLDI1IEBACitPUFRJT05BTAorU1lOT1BTSVMKKyAgICAgICAgbWl4ZWQqIHNsX2V4ZWMoc3RyaW5nIHN0YXRlbWVudCwgLi4uKQorCitCRVNDSFJFSUJVTkcKKyAgICAgICAgRnVlaHJ0IGRlbiBTUUwtQmVmZWhsIDxzdGF0ZW1lbnQ+IGluIGRlciBha3R1ZWxsIGdlb2VmZm5ldGVuCisgICAgICAgIFNRTGl0ZS1EYXRlbmJhbmsgYXVzLiBEaWVzZXIgU1FMLUJlZmVobCBrYW5uIFdpbGRjYXJkcyB3aWUgJz8nCisgICAgICAgIG5kICc/bm5uJywgd29iZWkgJ25ubicgZWluZSBaYWhsIGlzdCwgZW50aGFsdGVuLiBEaWVzZSBXaWxkY2FyZHMKKyAgICAgICAga29lbm5lbiBhbHMgd2VpdGVyZSBQYXJhbWV0ZXIgYW4gc2xfZXhlYyB1ZWJlcmdlYmVuIHdlcmRlbi4KKyAgICAgICAgTWl0ICc/bm5uJyBrYW5uIGRpcmVrdCBkaWUgTnVtbWVyIGVpbmVzIGJlc3RpbW10ZW4gUGFyYW1ldGVycworICAgICAgICBhbmdlZ2ViZW4gd2VyZGVuLCBkZXIgZXJzdGUgUGFyYW1ldGVyIGhhdCBkaWUgTnVtbWVyIDEuCisKKyAgICAgICAgRmFsbHMgZGVyIFNRTC1CZWZlaGwgRGF0ZW4genVydWVja2xpZWZlcnQsIGxpZWZlcnQgc2xfZXhlYyBlaW4KKyAgICAgICAgQXJyYXkgYXVzIGRlbiBlaW56ZWxuZW4gWmVpbGVuICh3ZWxjaGUgd2llZGVyIEFycmF5cyBkZXIgZWluemVsbmVuCisgICAgICAgIEZlbGRlciBzaW5kKSB6dXJ1ZWNrLgorCisgICAgICAgIERpZXNlIEZ1bmt0aW9uIGlzdCBudXIgdmVyZnVlZ2Jhciwgd2VubiBkZXIgRHJpdmVyIG1pdCBTUUxpdGUtCisgICAgICAgIFVudGVyc3R1ZXR6dW5nIGNvbXBpbGllcnQgd3VyZGUuIEluIGRpZXNlbSBGYWxsIGlzdCBkYXMgTWFrcm8KKyAgICAgICAgX19TUUxJVEVfXyBkZWZpbmllcnQuCisKK0dFU0NISUNIVEUKKyAgICAgICAgRWluZ2VmdWVocnQgaW4gTERNdWQgMy4zLjcxMy4KKworU0lFSEUgQVVDSAorICAgICAgICBzbF9vcGVuKEUpLCBzbF9pbnNlcnRfaWQoRSksIHNsX2Nsb3NlKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9zbF9pbnNlcnRfaWQgYi9kb2MvZWZ1bi9zbF9pbnNlcnRfaWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQyNWNlZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL3NsX2luc2VydF9pZApAQCAtMCwwICsxLDE4IEBACitPUFRJT05BTAorU1lOT1BTSVMKKyAgICAgICAgaW50IHNsX2luc2VydF9pZCgpCisKK0JFU0NIUkVJQlVORworICAgICAgICBOYWNoZGVtIGVpbmUgWmVpbGUgaW4gZWluZSBUYWJlbGxlIG1pdCBlaW5lciBBVVRPX0lOQ1JFTUVOVC1TcGFsdGUKKyAgICAgICAgZWluZ2VmdWVndCB3dXJkZSwga2FubiBtYW4gbWl0IGRpZXNlciBGdW5rdGlvbiBkZW4gKG5ldWVuKSBXZXJ0CisgICAgICAgIGRpZXNlcyBBVVRPX0lOQ1JFTUVOVC1GZWxkZXMgZGVyIGVpbmdlZnVlZ3RlbiBaZWlsZSBhYmZyYWdlbi4KKworICAgICAgICBEaWVzZSBGdW5rdGlvbiBpc3QgbnVyIHZlcmZ1ZWdiYXIsIHdlbm4gZGVyIERyaXZlciBtaXQgU1FMaXRlLQorICAgICAgICBVbnRlcnN0dWV0enVuZyBjb21waWxpZXJ0IHd1cmRlLiBJbiBkaWVzZW0gRmFsbCBpc3QgZGFzIE1ha3JvCisgICAgICAgIF9fU1FMSVRFX18gZGVmaW5pZXJ0LgorCitHRVNDSElDSFRFCisgICAgICAgIEVpbmdlZnVlaHJ0IGluIExETXVkIDMuMy43MTMuCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgc2xfb3BlbihFKSwgc2xfZXhlYyhFKSwgc2xfY2xvc2UoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL3NsX29wZW4gYi9kb2MvZWZ1bi9zbF9vcGVuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NDY4NWQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9zbF9vcGVuCkBAIC0wLDAgKzEsMjAgQEAKK09QVElPTkFMCitTWU5PUFNJUworICAgICAgICBpbnQgc2xfb3BlbihzdHJpbmcgZmlsZW5hbWUpCisKK0JFU0NIUkVJQlVORworICAgICAgICBPZWZmbmV0IGRpZSBEYXRlaSA8ZmlsZW5hbWU+IGFscyBTUUxpdGUtRGF0ZW5iYW5rLiBGYWxscworICAgICAgICBzaWUgbm9jaCBuaWNodCBleGlzdGllcnQsIHdpcmQgc2llIGVyc3RlbGx0LiBFcyBpc3QgbnVyCisgICAgICAgIGVpbmUgZ2VvZWZmbmV0ZSBEYXRlbmJhbmsgcHJvIE9iamVrdCBlcmxhdWJ0LiBJbSBFcmZvbGdzZmFsbGUKKyAgICAgICAgbGllZmVydCBkaWVzZSBGdW5rdGlvbiAxIHp1cnVlY2ssIGFuZGVyZW5mYWxscyB3aXJkCisgICAgICAgIG5vcm1hbGVyd2Vpc2UgZWluIEZlaGxlciBhdXNnZWxvZXN0LgorCisgICAgICAgIERpZXNlIEZ1bmt0aW9uIGlzdCBudXIgdmVyZnVlZ2Jhciwgd2VubiBkZXIgRHJpdmVyIG1pdCBTUUxpdGUtCisgICAgICAgIFVudGVyc3R1ZXR6dW5nIGNvbXBpbGllcnQgd3VyZGUuIEluIGRpZXNlbSBGYWxsIGlzdCBkYXMgTWFrcm8KKyAgICAgICAgX19TUUxJVEVfXyBkZWZpbmllcnQuCisKK0dFU0NISUNIVEUKKyAgICAgICAgRWluZ2VmdWVocnQgaW4gTERNdWQgMy4zLjcxMy4KKworU0lFSEUgQVVDSAorICAgICAgICBzbF9leGVjKEUpLCBzbF9pbnNlcnRfaWQoRSksIHNsX2Nsb3NlKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9zbm9vcCBiL2RvYy9lZnVuL3Nub29wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NGIyMDIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9zbm9vcApAQCAtMCwwICsxLDIyIEBACitHRVNDSFVFVFpUCitTWU5PUFNJUworICAgICAgICBpbnQgc25vb3Aob2JqZWN0IHNub29wZXIpOworICAgICAgICBpbnQgc25vb3Aob2JqZWN0IHNub29wZXIsIG9iamVjdCBzbm9vcGVlKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIEJlZ2lubnQgZGllIEJlb2JhY2h0dW5nIGRlcyBPYmpla3RzIDxzbm9vcGVlPiBkdXJjaCA8c25vb3Blcj4uIFdlbm4KKyAgICAgICAgPHNub29wZWU+IG5pY2h0IGFuZ2VnZWJlbiB3aXJkLCB3ZXJkZW4gYWxsZSBCZW9iYWNodHVuZ2VuIHZvbgorICAgICAgICA8c25vb3Blcj4gYmVlbmRldC4KKworICAgICAgICBEaWUgRnVua3Rpb24gbGllZmVydCAxIGJlaSBFcmZvbGcsIC0xIHdlbm4gZWluZSBTY2hsZWlmZSBlbnRzdGVoZW4KKyAgICAgICAgd3VlcmRlIHVuZCAwIGZ1ZXIgYWxsZSBhbmRlcmVuIEZlaGxlci4KKworICAgICAgICBEaWUgQmVvYmFjaHR1bmcgd2lyZCBtaXQgZGVtIE1hc3Rlci1PYmpla3QgYXVmIEd1ZWx0aWdrZWl0IGdlcHJ1ZWZ0LgorICAgICAgICBFcyB3aXJkIGF1Y2ggZWluIEZlaGxlciB2ZXJ1cnNhY2h0LCB3ZW5uIGVpbmUgQmVvYmFjaHR1bmcgenUgZWluZXIKKyAgICAgICAgUmVrdXJzaW9uIGZ1ZWhyZW4gd3VlcmRlLgorCitBTk1FUktVTkcKKyAgICAgICAgRGllc2UgRnVua3Rpb24gaXN0IGdlc2NodWV0enQuCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgcXVlcnlfc25vb3AoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL3NvcnRfYXJyYXkgYi9kb2MvZWZ1bi9zb3J0X2FycmF5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YTY1Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9zb3J0X2FycmF5CkBAIC0wLDAgKzEsMTExIEBACitzb3J0X2FycmF5KEUpCisKK0ZVTktUSU9OOgorICAgICBtaXhlZCAqc29ydF9hcnJheShtaXhlZCAqYXJyLCBtaXhlZCBmdW5jIFssIG1peGVkIG9iXSkKKworUEFSQU1FVEVSOgorICAgICBhcnIgIC0genUgc29ydGllcmVuZGVzIEFycmF5CisgICAgIGZ1bmMgLSB6dSBydWZlbmRlIE1ldGhvZGU7IGthbm4gYWxzIFN0cmluZyAoRnVua3Rpb25zbmFtZSkgb2RlciAKKyAgICAgICAgICAgIENsb3N1cmUgdWViZXJnZWJlbiB3ZXJkZW4KKyAgICAgb2IgICAtIE9iamVrdCwgYW4gZGVtIE1ldGhvZGUgZ2VydWZlbiB3ZXJkZW4gc29sbDsga2FubiBhbHMgU3RyaW5nCisgICAgICAgICAgICAoRmlsZW5hbWUpIG9kZXIgT2JqZWt0cG9pbnRlciB1ZWJlcmdlYmVuIHdlcmRlbgorCitCRVNDSFJFSUJVTkcKKyAgICAgRXJ6ZXVndCBlaW5lIChmbGFjaGUpIEtvcGllIGRlcyBBcnJheXMgJ2FycicgdW5kIHNvcnRpZXJ0IGRpZXNlIG1pdCBkZXIKKyAgICAgU29ydGllcmZ1bmt0aW9uICdmdW5jJy4gRGllIHNvcnRpZXJ0ZSBLb3BpZSB3aXJkIGRhbm4genVydWVja2dlZ2ViZW4uCisKKyAgICAgRGllIEVsZW1lbnRlIGRlcyB6dSBzb3J0aWVyZW5kZW4gQXJyYXlzIHdlcmRlbiBwYWFyd2Vpc2UgYW4gZGllCisgICAgIFNvcnRpZXJmdW5rdGlvbiBhbHMgQXJndW1lbnRlIHVlYmVyZ2ViZW4uCisgICAgIERpZSBTb3J0aWVyZnVua3Rpb24gc29sbHRlIGVpbmUgWmFobAorICAgICAtID4wIHp1cnVlY2tnZWJlbiwgd2VubiBkaWUgRWxlbWVudGUgaW4gZGVyIGZhbHNjaGVuCisgICAgICAgUmVpaGVuZm9sZ2Ugc2luZAorICAgICAtIDw9MCB6dXJ1ZWNrZ2ViZW4sIHdlbm4gZGllIEVsZW1lbnRlIGluIGRlciByaWNodGlnZW4KKyAgICAgICBSZWloZW5mb2xnZSBzaW5kLgorCisgICAgIFZlcndlbmR1bmcgdm9uIE1ldGhvZGVuOgorICAgICAgIFdlbm4gYmVpIGRlciBBbmdhYmUgdm9uICdmdW5jJyBrZWluIE9iamVrdCAnb2InIGluIEZvcm0gZWluZXMgU3RyaW5ncworICAgICAgIG9kZXIgT2JqZWt0cyBhbmdlZ2ViZW4gd2lyZCwgd2lyZCB0aGlzX29iamVjdCgpIGFuZ2Vub21tZW4uCisKKyAgICAgVmVyd2VuZHVuZyB2b24gQ2xvc3VyZXM6CisgICAgICAgRXMga29lbm5lbiBMZnVuLSwgTGFtYmRhLSB1bmQgSW5saW5lLUNsb3N1cmVzIHZlcndlbmRldCB3ZXJkZW4uIAorICAgICAgIExmdW4tQ2xvc3VyZXMga29lbm5lbiwgd2VubiBpbSBzZWxiZW4gT2JqZWt0IHZvcmhhbmRlbiwgYXVjaAorICAgICAgICdwcml2YXRlJyBvZGVyL3VuZCAnc3RhdGljJyBkZWtsYXJpZXJ0IHNlaW4sIG11ZXNzZW4gYWJlciB6dSBkZW0KKyAgICAgICBaZWl0cHVua3QgZGVyIFZlcndlbmR1bmcgYmVrYW5udCBzZWluIChGdW5rdGlvbnNwcm90b3R5cGVuIGJlbnV0emVuKS4KKyAgICAgICBWb24gZGVyIFZlcndlbmR1bmcgdm9uIExhbWJkYS1DbG9zdXJlcyB3aXJkIGF1c2RydWVja2xpY2ggYWJnZXJhdGVuLgorCitCRU1FUktVTkdFTjoKKyAgICAgKDEpIHNvcnRfYXJyYXkoKSB1bnRlcnN0dWV0enQga2VpbmVuIGV4dHJhLVBhcmFtZXRlcgorCisgICAgICgyKSBBY2h0dW5nLCBkaWUgRWxlbWVudGUgaW4gJ2Fycicgd2VyZGVuIG5pY2h0IHRpZWYga29waWVydCwgc2luZCBzaWUKKyAgICAgYWxzbyBzZWxic3QgQXJyYXlzIG9kZXIgTWFwcGluZ3MsIHNvIGZ1ZWhydCBlaW5lIEFlbmRlcnVuZyBpbSBSdWVja2dhYmUtCisgICAgIEFycmF5IHp1ciBBZW5kZXJ1bmcgaW0gVXJzcHJ1bmdzYXJyYXk6CisKKyAgICAgaW50ICppLCAqajsKKyAgICAgaT0oeyh7MX0pLCh7MiwzfSksKHs0LDUsNn0pfSk7CisgICAgIGo9c29ydF9hcnJheShpLCAgICAgICAgLy8gc29ydGllcnQgZGVyIEdyb2Vzc2UgbmFjaCBhYnN0ZWlnZW5kCisgICAgICAgICBmdW5jdGlvbiBpbnQgKCBtaXhlZCB4LCBtaXhlZCB5ICkgeworICAgICAgICAgICByZXR1cm4gc2l6ZW9mKHgpIDwgc2l6ZW9mKHkpOyB9CisgICAgICAgICApOworICAgICAKKyAgICAgWnUgZGllc2VtIFplaXRwdW5rdCBpc3QgIGkgPT0gKHsgKHsxfSksKHsyLDN9KSwoezQsNSw2fSkgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogPT0gKHsgKHs0LDUsNn0pLCh7MiwzfSksKHsxfSkgfSkKKyAgICAgCisgICAgIEZ1ZWhydCBtYW4gamV0enQgZGllIFp1d2Vpc3VuZyBqWzBdWzBdPTg7IGF1cworCisgICAgIHJlc3VsdGllcmVuIGZvbGdlbmRlIEFycmF5czogaSA9PSAoeyAoezF9KSwoezIsM30pLCh7OCw1LDZ9KSB9KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogPT0gKHsgKHs4LDUsNn0pLCh7MiwzfSksKHsxfSkgfSkKKworQkVJU1BJRUxFOgorICAgICAjIyMgU29ydGllcmVuIHZvbiBaYWhsZW4gaW4gYXVmc3RlaWdlbmRlciBSZWloZW5mb2xnZSAjIyMKKyAgICAgCisgICAgIGludCAqYXJyID0gKHsgMywgOCwgMSwgMyB9KQorCisgICAgIC8vIEZvbGdlbmQgaWRlbnRpc2NoZSBSZXN1bHRhdGUsIGFiZXIgYW5kZXJlIEFuc2FldHplOgorCisgICAgICMxOiBudXR6dCBkaWUgJ0VmdW4nID4gYWxzIExmdW4tQ2xvc3VyZSAoaWRlYWwgaGllcik6CisgICAgICAgICBzb3J0X2FycmF5KGFyciwgIyc+KTsKKworICAgICAjMjogbWl0IFNvcnRpZXJmdW5rdGlvbiBpbSBzZWxiZW4gT2JqZWt0OgorICAgICAgICAgaW50IGlzX2dyZWF0ZXIgKGludCBhLCBpbnQgYikgeworICAgICAgICAgICByZXR1cm4gYSA+IGI7CisgICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICMyYTogc29ydGllcnQgbWl0dGVscyBkZXIgTGZ1biBpbSBzZWxiZW4gT2JqZWt0IGRpZSBFbGVtZW50ZSBpbiBkYXMKKyAgICAgICAgICAgICAgUnVlY2tnYWJlYXJyYXkKKyAgICAgICAgICAgICAgc29ydF9hcnJheShhcnIsICJpc19ncmVhdGVyIiwgdGhpc19vYmplY3QoKSkKKyAgICAgICAgICAgICAgc29ydF9hcnJheShhcnIsICJpc19ncmVhdGVyIikKKworICAgICAgICAgIzJiOiBudXR6dCBkaWUgTGZ1biBpc19ncmVhdGVyKCkgYWxzIExmdW4tQ2xvc3VyZSAoRnVua3Rpb25zcG9pbnRlcikKKyAgICAgICAgICAgICAgc29ydF9hcnJheShhcnIsICMnaXNfZ3JlYXRlcikKKworICAgICAjMzogbnV0enQgZWluZSBMYW1iZGEtQ2xvc3VyZSAobGFuZ3NhbWVyLCBuaWNodCBmdWVyIGFsbGUgbGVzZXJsaWNoKQorICAgICAgICAgc29ydF9hcnJheShhcnIsIGxhbWJkYSgoeydhLCAnYn0pLCAoeyMnPiwgJ2EsICdifSkpKQorCisgICAgICM0OiBhbmFsb2cgenUgMywgbWl0IElubGluZS1DbG9zdXJlCisgICAgICAgICBzb3J0X2FycmF5KGFyciwgZnVuY3Rpb24gaW50IChpbnQgYSwgaW50IGIpIHsKKyAgICAgICAgICAgcmV0dXJuIGEgPiBiOyB9ICk7CisKKyAgICAgUmVzdWx0YXQgaW4gYWxsZW4gRmFlbGxlbjogKHsxLDMsMyw4fSkKKworICAgICAjIyMgU29ydGllcmVuIHZvbiBnZXNjaGFjaHRlbHRlbiBBcnJheXMgIyMjCisKKyAgICAgYXJyID0gKHsgKHsgImZvbyIsIDMgfSksICh7ICJxdXV4IiwgMSB9KSwgLi4uIH0pCisKKyAgICAgLy8gVm9yZ2VoZW4gaWRlbnRpc2NoLCBhbGxlcmRpbmdzIG11c3MgZGllIFNvcnRpZXJmdW5rdGlvbgorICAgICAvLyBhbmdlcGFzc3Qgd2VyZGVuIChzaWVoZSBhdWNoIGRhcyBCZWlzcGllbCB1bnRlciBWZXJ3ZW5kdW5nIHZvbgorICAgICAvLyBJbmxpbmUtQ2xvc3VyZXMgb2JlbiB1bnRlciAiQmVtZXJrdW5nZW4iKToKKyAgICAgCisgICAgIGludCBpc19ncmVhdGVyIChtaXhlZCAqYSwgbWl4ZWQgKmIpIHsKKyAgICAgICByZXR1cm4gYVsxXSA+IGJbMV07CisgICAgIH0KKworU0lFSEUgQVVDSDoKKyAgICAgQXJyYXlzOiAgICAgICAgZmlsdGVyKEUpLCBtYXAoRSkKKyAgICAgT2JqZWt0YXJyYXlzOiAgZmlsdGVyX29iamVjdHMoRSksIG1hcF9vYmplY3RzKEUpCisgICAgIE1hcHBpbmdzOiAgICAgIGZpbHRlcl9pbmRpY2VzKEUpLCBtYXBfaW5kaWNlcyhFKQorCisgICAgIFNvbnN0aWdlczogICAgIHVuaXF1ZV9hcnJheSgpCisgICAgICAgICAgICAgICAgICAgIGFsaXN0LCB0cmFuc3Bvc2VfYXJyYXkoRSkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogTW9uIEZlYiAxOCAyMzowOSAyMDA4IGJ5IEFyYXRob3JuCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9zcHJpbnRmIGIvZG9jL2VmdW4vc3ByaW50ZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2I2OTcwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vc3ByaW50ZgpAQCAtMCwwICsxLDE0NyBAQAorU1lOT1BTSVMNCisgICAgICAgIHN0cmluZyBzcHJpbnRmKHN0cmluZyBmbXQsIC4uLikNCisNCitCRVNDSFJFSUJVTkcNCisgICAgICAgIE1pdCBkaWVzZXIgRnVua3Rpb24ga2FubiBtYW4gYXVmIGVpbmZhY2hlIFdlaXNlIGF1cyBkZW0gSW5oYWx0DQorICAgICAgICB2b24gVmFyaWFibGVuIGVpbmVuIFN0cmluZyBiYXVlbjsgdW5kIGRpZXMgZWZmZWt0aXZlciBhbHMNCisgICAgICAgIG1pdCBkZXIgdWVibGljaGVuICJEdSBoYXN0ICIrYW56YWhsKyIgUHVua3QoZSkiLU1ldGhvZGUuDQorDQorICAgICAgICBEaWUgRnVua3Rpb24gYmVrb21tdCBhbHMgZXJzdGVzIEFyZ3VtZW50IGVpbmVuIEZvcm1hdHN0cmluZyBmbXQsDQorICAgICAgICBkZXIgSW5mb3JtYXRpb25lbiBkYXJ1ZWJlciBlbnRoYWVsdCwgd2llIGRpZSB3ZWl0ZXJlbiBiZWxpZWJpZ2VuDQorICAgICAgICBBcmd1bWVudGUgaW4gZGVuIEVyZ2Vibmlzc3RyaW5nIGVpbmdlYmF1dCB3ZXJkZW4gc29sbGVuLg0KKyAgICAgICAgRGllIG1laXN0ZW4gWmVpY2hlbiBnZWxhbmdlbiB2b20gRm9ybWF0c3RyaW5nIHVudmVyYWVuZGVydCBpbg0KKyAgICAgICAgZGVuIEF1c2dhYmVzdHJpbmcuIERpZSBSZWdlbG4genVtIEVpbmJhdSBlaW5lcyBBcmd1bWVudHMgd2VyZGVuDQorICAgICAgICBpbW1lciBtaXQgJyUnIGVpbmdlbGVpdGV0LiBNb2VjaHRlIG1hbiBlaW4gJyUnIGluIGRpZSBBdXNnYWJlDQorICAgICAgICBicmluZ2VuLCBzbyBtdXNzIG1hbiBpbSBGb3JtYXRzdHJpbmcgIiUlIiB2ZXJ3ZW5kZW4uDQorDQorICAgICAgICBFaW4gZWluZmFjaGVzIEJlaXNwaWVsIGlzdCBlcmc9c3ByaW50ZigiJXMgJWQiLCBzdHIsIGkpOw0KKyAgICAgICAgJyUnIGxlaXRldCBlaW5lbiBBcmd1bWVudGZvcm1hdHN0cmluZyAoQUZTKSBlaW4uIERhcyAncycgc2NobGllc3N0DQorICAgICAgICBpaG4gYWIgdW5kIGJlc2FndCwgZGFzcyBlaW4gU3RyaW5nIGVpbmdlYmF1dCB3ZXJkZW4gc29sbC4gRGFzDQorICAgICAgICBmb2xnZW5kZSBMZWVyemVpY2hlbiB3aXJkIHVudmVyYWVuZGVydCB1ZWJlcm5vbW1lbi4gJyUnIGxlaXRldA0KKyAgICAgICAgd2llZGVyIGVpbmVuIG5ldWVuIEZvcm1hdHN0cmluZyBlaW4sIHdvYmVpICdkJyBlaW5lIEdhbnp6YWhsDQorICAgICAgICBiZXplaWNobmV0IChlaW5lIFZhcmlhYmxlIHZvbiBUeXAgaW50KS4NCisgICAgICAgIERpZXMgaXN0IGVpbiBhbGxlcmRpbmdzIG51ciBlaW4gc2VociBlaW5mYWNoZXMgQmVpc3BpZWwuDQorDQorICAgICAgICBKZWRlciBBcmd1bWVudGZvcm1hdHN0cmluZyBrZW5uemVpY2huZXQgYWxzbywgYXVmIHdlbGNoZSBBcnQNCisgICAgICAgIGVpbiBBcmd1bWVudCBpbiBkYXMgRXJnZWJuaXMgZWluZ2ViYXV0IHdlcmRlbiBzb2xsLiBEZXIgZXJzdGUNCisgICAgICAgIEFGUyBpc3QgZnVlciBkYXMgendlaXRlIEFyZ3VtZW50IGRlciBGdW5rdGlvbiwgZGVyIHp3ZWl0ZSBBRlMNCisgICAgICAgIGZ1ZXIgZGFzIGRyaXR0ZSBBcmd1bWVudCB1LnMudy4gKGRhcyBlcnN0ZSBBcmd1bWVudCBkZXIgRnVua3Rpb24NCisgICAgICAgIGlzdCBqYSBkZXIgRm9ybWF0c3RyaW5nIHNlbGJzdCkuDQorDQorICAgICAgICBKZWRlciBBRlMgYmVnaW5udCBtaXQgZWluZW0gJyUnIHVuZCBlbmRldCBtaXQgZWluZW0gZGVyDQorICAgICAgICBmb2xnZW5kZW4gWmVpY2hlbiAoQXJndW1lbnR0eXAtS2VubnplaWNobmVyKToNCisgICAgICAgIFplaWNoZW4gICAgQXJndW1lbnR0eXAgICAgQmVtZXJrdW5nDQorICAgICAgICAncycgICAgICAgIHN0cmluZw0KKyAgICAgICAgJ2MnICAgICAgICBpbnRlZ2VyICAgICAgICBhbHMgQVNDSUktWmVpY2hlbg0KKyAgICAgICAgJ2QnICdpJyAgICBpbnRlZ2VyICAgICAgICBEZXppbWFsc2NocmVpYndlaXNlDQorICAgICAgICAnbycgICAgICAgIGludGVnZXIgICAgICAgIE9rdGFsc2NocmVpYndlaXNlDQorICAgICAgICAnYicgJ0InICAgIGludGVnZXIgICAgICAgIEJpbmFlcnNjaHJlaWJ3ZWlzZQ0KKyAgICAgICAgJ3gnICdYJyAgICBpbnRlZ2VyICAgICAgICBIZXhhZGV6aW1hbHNjaHJlaWJ3ZWlzZQ0KKyAgICAgICAgJ2UnICdFJyAgICBmbG9hdCAgICAgICAgICBFeHBvbmVudGlhbHNjaHJlaWJ3ZWlzZQ0KKyAgICAgICAgJ2YnICdGJyAgICBmbG9hdCAgICAgICAgICBHbGVpdGtvbW1hZGFyc3RlbGx1bmcNCisgICAgICAgICdnJyAnRycgICAgZmxvYXQgICAgICAgICAgR2xlaXRrb21tYWRhcnN0ZWxsdW5nDQorICAgICAgICAnTycgICAgICAgIG1peGVkICAgICAgICAgIEdpYnQgZnVlciBEZWJ1Z2dpbmcgYWxsZXMgaXJnZW5kd2llDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlc2JhciBhdXMsIGF1Y2ggQXJyYXlzIHVuZCBNYXBwaW5ncw0KKyAgICAgICAgJ1EnICAgICAgICBtaXhlZCAgICAgICAgICBXaWUgJ08nLCBnaWJ0IGplZG9jaCBTb25kZXJ6ZWljaGVuIGluDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ3MgaW4gZGVyIExQQy1Ob3RhdGlvbiBhdXMNCisgICAgICAgIA0KKyAgICAgICAgWndpc2NoZW4gZGVtICclJyB1bmQgZGVtIEFyZ3VtZW50dHlwLUtlbm56ZWljaG5lciBrYW5uIG1hbg0KKyAgICAgICAgbm9jaCBtZWhyZXJlIE1vZGlmaWthdG9yZW4gc2V0emVuLCBkaWUgZGFzIFZlcmhhbHRlbg0KKyAgICAgICAgYmVlaW5mbHVzc2VuLg0KKyAgICAgICAgSGllciBlaW5lIFVlYmVyc2ljaHQuIG4gc3RlaHQgaGllciBmdWVyIGVpbmUgR2FuenphaGwsIGFsc28NCisgICAgICAgIHp1bSBCZWlzcGllbCAiMTIiLg0KKyAgICAgICAgTW9kaWZpa2F0b3IgIEJlZGV1dHVuZw0KKyAgICAgICAgbiAgICAgICAgICAgIE1pbmltYWxlIFN0cmluZ2xhZW5nZSwgZGllIGZ1ZXIgZGllc2VzIEFyZ3VtZW50DQorICAgICAgICAgICAgICAgICAgICAgdmVyd2VuZGV0IHdlcmRlbiBzb2xsLiBGZWhsZW5kZSBaZWljaGVuIHdlcmRlbiBtaXQNCisgICAgICAgICAgICAgICAgICAgICBlaW5lbSBGdWVsbHplaWNoZW4gYXVmZ2VmdWVsbHQuIEJlZ2lubnQgbiBtaXQgZWluZXINCisgICAgICAgICAgICAgICAgICAgICAnMCcgKGV0d2EgIjA4Iikgc28gaXN0IGRhcyBGdWVsbHplaWNoZW4gJzAnIHNvbnN0DQorICAgICAgICAgICAgICAgICAgICAgaXN0IGVzIHBlciBEZWZhdWx0ICcgJy4gKHNvZ2VuYW5udGUgJ0ZlbGRicmVpdGUnKQ0KKyAgICAgICAgLm4gICAgICAgICAgIEJlaSBHYW56emFobGVuIGRpZSBNYXhhbnphaGwgZGVyIFN0ZWxsZW4sIGJlaSBHbGVpdC0NCisgICAgICAgICAgICAgICAgICAgICBrb21tYXphaGxlbiBkaWUgTWF4aW1hbHphaGwgZGVyIE5hY2hrb21tYXN0ZWxsZW4uDQorICAgICAgICAgICAgICAgICAgICAgQmVpIChlaW5mYWNoZW4pIFN0cmluZ3MgZGllIE1heGltYWxsYWVuZ2UuDQorICAgICAgICA6biAgICAgICAgICAgSXN0IGRhc3NlbGJlIHdpZSBuLm4gLSBzZXR6dCBhbHNvIGJlaWRlIFdlcnRlIGF1Zg0KKyAgICAgICAgICAgICAgICAgICAgIGRpZXNlbGJlIFphaGwuDQorICAgICAgICAnWCcgICAgICAgICAgQWxzIEZ1ZWxsemVpY2hlbiB3aXJkIFggZ2VudXR6dC4gWCBrb2VubmVuIGRhYmVpDQorICAgICAgICAgICAgICAgICAgICAgYXVjaCBtZWhyZXJlIFplaWNoZW4gc2VpbiwgZXR3YSBmdWVocnQgJy09JyB6dQ0KKyAgICAgICAgICAgICAgICAgICAgIEZ1ZWxsdW5nZW4gZGVyIEFydCAiLT0tPS09LT0iLiBVbSBtaXQgSG9jaGtvbW1hcw0KKyAgICAgICAgICAgICAgICAgICAgIHp1IGZ1ZWxsZW4gaXN0ICdcXCcnIGFuenVnZWJlbi4gUnVlY2t3YWVydHMtDQorICAgICAgICAgICAgICAgICAgICAgc2NocmFlZ3N0cmljaCBlbnRzcHJlY2hlbmQgbWl0ICdcXFxcJy4NCisgICAgICAgIDxTcGFjZT4gICAgICBWb3IgcG9zaXRpdmUgWmFobGVuIHdpcmQgZWluIExlZXJ6ZWljaGVuIGdlZnVlZ3QuDQorICAgICAgICArICAgICAgICAgICAgVm9yIHBvc2l0aXZlIFphaGxlbiB3aXJkIGVpbiAnKycgZ2VmdWVndC4NCisgICAgICAgIC0gICAgICAgICAgICBEZXIgV2VydCB3aXJkIGxpbmtzYnVlbmRpZyBpbiBkYXMgZnVlciBkaWVzZXMgQXJndW1lbnQNCisgICAgICAgICAgICAgICAgICAgICB2b3JnZXNlaGVuZSBGZWxkIGVpbmdlZnVlZ3QgKFN0YW5kYXJkIGlzdCByZWNodHMtDQorICAgICAgICAgICAgICAgICAgICAgYnVlbmRpZykuIEJlaSBTdHJpbmdzIHdpcmQgbWVpc3RlbnMgZGllc2UgQXVzcmljaHR1bmcNCisgICAgICAgICAgICAgICAgICAgICBkaWUgc2lubnZvbGxzdGUgc2Vpbi4NCisgICAgICAgIHwgICAgICAgICAgICBEZXIgV2VydCB3aXJkIHplbnRyaWVydCBpbiBkYXMgRmVsZCBlaW5nZWZ1ZWd0Lg0KKyAgICAgICAgICAgICAgICAgICAgIChTaWVoZSBNb2RpZmlrYXRvciBuLCBGZWxkYnJlaXRlKQ0KKyAgICAgICAgJCAgICAgICAgICAgIEJsb2Nrc2F0ei4gQmVub2V0aWd0IGVpbmUgRmVsZGJyZWl0ZSwgZnVua3Rpb25pZXJ0IG51cg0KKyAgICAgICAgICAgICAgICAgICAgIGJlaSBTdHJpbmdzIChhdWNoIGltIFNwYWx0ZW5tb2R1cykuDQorICAgICAgICA9ICAgICAgICAgICAgU3BhbHRlbm1vZHVzIChzaWVoZSB1bnRlbikuDQorICAgICAgICAjICAgICAgICAgICAgRnVlciBTdHJpbmdzOiBUYWJlbGxlbm1vZHVzIChzaWVoZSB1bnRlbikuDQorICAgICAgICAgICAgICAgICAgICAgRnVlciAnJU8nLyclUSc6IGtvbXBha3RlIEF1c2dhYmUuDQorICAgICAgICBAICAgICAgICAgICAgQXJyYXltb2R1cyAoc2llaGUgdW50ZW4pLg0KKyAgICAgICAgKiAgICAgICAgICAgIEVpbiBTdGVybiBrYW5uIGltbWVyIGRvcnQgZWluZ2VzZXR6dCB3ZXJkZW4sIHdvDQorICAgICAgICAgICAgICAgICAgICAgaGllciB3ZWl0ZXIgb2JlbiBlaW4gbiBmdWVyIGVpbmUgR2FuenphaGwgc3RlaHQuDQorICAgICAgICAgICAgICAgICAgICAgRGVyIFdlcnQgZGVyIFphaGwgbXVzcyBkYW5uIGFscyB3ZWl0ZXJlciBQYXJhbWV0ZXINCisgICAgICAgICAgICAgICAgICAgICBhbiBkaWUgRnVua3Rpb24gdWViZXJnZWJlbiB3ZXJkZW4uDQorDQorQkVJU1BJRUxFDQorICAgICAgICBNaXQgZGVuIGJpcyBqZXR6dCBlcndhZWhudGVuIE1vZWdsaWNoa2VpdGVuIGthbm4gbWFuIHpCIG1hY2hlbjoNCisNCisgICAgICAgIHNwcmludGYoIiVkIChkZWMpID09ICVvIChvY3RhbCkgPT0gJXggKGhleCkiLCAyMCwgMjAsIDIwKTsNCisgICAgICAgID0+ICIyMCAoZGVjKSA9PSAyNCAob2N0YWwpID09IDE0IChoZXgpIg0KKw0KKyAgICAgICAgc3ByaW50ZigiRHUgZHJlaHN0IGRlbiBLbm9wZiB1bSAlLjNmIFVtZHJlaHVuZ2VuIiwgMTIuMzQ1Nik7DQorICAgICAgICA9PiAiRHUgZHJlaHN0IGRlbiBLbm9wZiB1bSAxMi4zNDUgVW1kcmVodW5nZW4iDQorDQorICAgICAgICBzcHJpbnRmKCJEdSBsaWVzdCAlfCcqJzo5cyIsICJGaW9uYSIpOw0KKyAgICAgICAgPT4gIkR1IGxpZXN0ICoqRmlvbmEqKiINCisNCisgICAgICAgIHNwcmludGYoIkF1ZiBkZW0gWmV0dGVsc3R1ZWNrIHN0ZWh0OiAlLS4qcy4uLiIsIDcsICJIYWxsbyBEdSBkYSIpOw0KKyAgICAgICAgPT4gIkF1ZiBkZW0gWmV0dGVsc3R1ZWNrIHN0ZWh0OiBIYWxsbyBELi4uDQorDQorRVJXRUlURVJURSBNT0RJDQorICAgICAgICBNaXQgZGVtIE1vZGlmaWthdG9yZW4gPSAjIHVuZCBAIHN0ZWhlbiBtYWVjaHRpZ2UgV2Vya3pldWdlIHp1cg0KKyAgICAgICAgVmVyZnVlZ3VuZy4gTWl0IGVpbiB3ZW5pZyBVZWJlcmxlZ3VuZyBrYW5uIG1hbiBzaWNoIG9mdCB2aWVsZQ0KKyAgICAgICAgWmVpbGVuIENvZGUgZXJzcGFyZW4uDQorICAgICAgICBBcnJheW1vZHVzIChAKToNCisgICAgICAgICAgc3ByaW50ZigiJUBzIiwgYXJyX29mX3N0cmluZyk7DQorICAgICAgICAgIERlciBBcmd1bWVudGZvcm1hdHN0cmluZyAoYWxsZXJkaW5ncyBvaG5lIGRhcyBAKSB3aXJkIHNvb2Z0DQorICAgICAgICAgIGhpbnRlcmVpbmFuZGVyZ2VyZWlodCwgd2lldmllbGUgRWxlbWVudGUgZGFzIEFycmF5IGhhdC4NCisgICAgICAgICAgSmVkZXIgQUZTIHdpcmQgZGFubiBmdWVyIGVpbiBFbGVtZW50IGRlcyBBcnJheXMgYmVudXR6dC4NCisgICAgICAgICAgc3ByaW50ZigiJUBzIiwgKHsiYWFhIiwiYmJiIn0pKSBpc3Qgc29taXQgZGFzc2VsYmUgd2llDQorICAgICAgICAgIHNwcmludGYoIiVzJXMiLCAiYWFhIiwgImJiYiIpLiBBbGxlcmRpbmdzIHBhc3N0IGVzIHNpY2gNCisgICAgICAgICAgaW1tZXIgYW4gZGllIEVsZW1lbnR6YWhsIGRlciB1ZWJlcmdlYmVuZGVuIEFycmF5cyBhbi4NCisgICAgICAgICAgRGllcyBpc3QgbnVldHpsaWNoIHVtIEVyZ2Vibmlzc2Ugdm9uIG1hcCgpIG9kZXIgYWVobmxpY2gNCisgICAgICAgICAgYXVzenVnZWJlbi4NCisgICAgICAgICAgc3ByaW50ZigiJUBzIiwgbWFwX29iamVjdHMoYWxsX2ludmVudG9yeSgpLCAic2hvcnQiKSk7DQorICAgICAgICAgIERlciBBcmd1bWVudHR5cC1LZW5uemVpY2huZXIgbXVzcyBoaWVyYmVpIGltbWVyIGRlbSBUeXBlbg0KKyAgICAgICAgICBlaW5lcyBFbGVtZW50ZXMgZGVzIEFycmF5cyBlbnRzcHJlY2hlbi4NCisgICAgICAgIFNwYWx0ZW5tb2R1cyAoPSk6DQorICAgICAgICAgIERpZXNlIEZ1bmt0aW9uIGJyaWNodCBUZXh0IHVtLiBEaWUgRmVsZGJyZWl0ZSBtdXNzIGFuZ2VnZWJlbg0KKyAgICAgICAgICB3ZXJkZW4uIFdpcmQgbmViZW4gZGVyIEZlbGRicmVpdGUgYXVjaCBlaW5lIG1heGltYWxlIFN0cmluZy0NCisgICAgICAgICAgbGFlbmdlIGFuZ2VnZWJlbiwgc28gd2lyZCBkaWUgbGV0enRlcmUgZnVlciBkaWUgQnJlaXRlIGRlcw0KKyAgICAgICAgICBVbWJyZWNoZW5zIHZlcndlbmRldCwgZGllIEZlbGRicmVpdGUgd2lyZCBtaXQgRnVlbGx6ZWljaGVuDQorICAgICAgICAgIGF1ZmdlZnVlbGx0Lg0KKyAgICAgICAgICBzcHJpbnRmKCIlPS0yMHMiLCBzdHIpOyBicmljaHQgZGVuIFN0cmluZyBzdHIgJ3dvcmR3cmFwJ2VuZA0KKyAgICAgICAgICBhdWYgMjAgWmVpY2hlbiBMYWVuZ2UgdW0uIHNwcmludGYoIiU9LSpzIiwgbGVuLCBzdHIpOw0KKyAgICAgICAgICBpc3Qgc2Nob24gZWluZSBlaW5mYWNoZSBicmVha19zdHJpbmcoKSBWYXJpYW50ZS4NCisgICAgICAgIFRhYmVsbGVubW9kdXMgKCMpOg0KKyAgICAgICAgICBEaWVzZSBGdW5rdGlvbiBnaWJ0IFN0cmluZ3MgdGFiZWxsZW5hcnRpZyBhdXMuIERpZSBUZWlsc3RyaW5ncw0KKyAgICAgICAgICBtdWVzc2VuIG1pdCBcbiBnZXRyZW5udCBhbHMgZWluIFN0cmluZyBhbHMgQXJndW1lbnQgdWViZXJnZWJlbg0KKyAgICAgICAgICB3ZXJkZW4uIERpZSBGZWxkYnJlaXRlIG11c3MgYW5nZWdlYmVuIHdlcmRlbiB1bmQgYmV6ZWljaG5ldA0KKyAgICAgICAgICBkaWUgKG1heGltYWxlKSBHZXNhbXRicmVpdGUgZGVyIFRhYmVsbGUuDQorICAgICAgICAgIERpZSBBbnphaGwgZGVyIFNwYWx0ZW4gZGVyIFRhYmVsbGUgd2lyZCBtb2VnbGljaHN0IG9wdGltYWwNCisgICAgICAgICAgYmVzdGltbXQsIHVuZCBpc3QgZnVlciBhbGxlIFNwYWx0ZW4gZ2xlaWNoLiBXaXJkIGVpbg0KKyAgICAgICAgICBXZXJ0IGFscyAnUHJhZXppc2lvbicgYW5nZWdlYmVuLCBzbyBpc3QgZGllcyBkaWUgQW56YWhsIHZvbg0KKyAgICAgICAgICBTcGFsdGVuLCBkaWUgdmVyd2VuZGV0IHdlcmRlbiBzb2xsLg0KKyAgICAgICAgICBzcHJpbnRmKCIlIzMwLjRzIiwgc3RyKSBlcnpldWd0IGVpbmUgVGFiZWxsZSwgZGllIG1heGltYWwNCisgICAgICAgICAgMzAgWmVpY2hlbiBicmVpdCBpc3QgdW5kIDQgU3BhbHRlbiBlbnRoYWVsdC4NCisgICAgICAgICAgc3ByaW50ZigiJSMzMHMiLCBzdHIpIGxlZ3QgZGllIFNwYWx0ZW56YWhsIGR5bmFtaXNjaCBhbmhhbmQNCisgICAgICAgICAgZGVyIEVpbnplbHN0cmluZ2xhZW5nZW4gZmVzdCwgc28gZGFzcyBkZXIgbGFlbmdzdGUgU3RyaW5nDQorICAgICAgICAgIG5vY2ggZ2VuYXUgaW4gZGllIFRhYmVsbGUgcGFzc3QuDQorICAgICAgICAgIFdlbm4gc3RyaW5nKiB3b3J0ZSBkaWUgaW4gZGllIFRhYmVsbGUgZWluenViZXR0ZW5kZW4gV29ydGUNCisgICAgICAgICAgZW50aGFlbHQsIHNvIG11c3Mgc3RyPWltcGxvZGUod29ydGUsIlxuIikgc2Vpbi4NCisNCitTSUVIRSBBVUNIOg0KKyAgICAgICAgcHJpbnRmKEUpDQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vc3FydCBiL2RvYy9lZnVuL3NxcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRjNDgwNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL3NxcnQKQEAgLTAsMCArMSw5IEBACitTWU5PUFNJUworICAgICAgICBmbG9hdCBzcXJ0KGludCB2YWx1ZSk7CisgICAgICAgIGZsb2F0IHNxcnQoZmxvYWcgdmFsdWUpOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgTGllZmVydCBkaWUgUXVhZHJhdHd1cnplbCB2b24gPHZhbHVlPi4KKworU0lFSEUgQVVDSAorICAgICAgICBsb2coRSksIHBvdyhFKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL3NzY2FuZiBiL2RvYy9lZnVuL3NzY2FuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjE2YmYyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vc3NjYW5mCkBAIC0wLDAgKzEsMTE1IEBACitGVU5LVElPTjoKKyBpbnQgc3NjYW5mKHN0cmluZyBzdHIsc3RyaW5nIGZtdCxtaXhlZCB2YXIxLG1peGVkIHZhcjIsLi4uKQorCitBUkdVTUVOVEU6CisgICAgICBzdHIKKyAgICAgICAgLSBTdHJpbmcsIGRlciBuYWNoIGVpbmVtIE11c3RlciB6dSBkdXJjaHN1Y2hlbiBpc3QKKyAgICAgICAgLSBkYXJmIG5pY2h0IE5VTEwgc2VpbgorICAgICAgZm10CisgICAgICAgIC0gRm9ybWF0LVN0cmluZywgbmFjaCBkZXNzZW4gTXVzdGVyIHVudGVyc3VjaHQgd2lyZAorICAgICAgdmFyMSx2YXIyLC4uLgorICAgICAgICAtIEFyZ3VtZW50ZSBkaWUgbWl0ICVkIG9kZXIgJXMga29ycmVzcG9uZGllcmVuCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIEFuemFobCBkZXIgZ2VmdW5kZW5lbiBBcmd1bWVudGUuCisKK0JFU0NIUkVJQlVORzoKKyAgICAgV2VydGV0IGVpbmVuIFN0cmluZyA8c3RyPiB1bnRlciBCZXJ1ZWNrc2ljaHRpZ3VuZyBkZXMgRm9ybWF0cyA8Zm10PgorICAgICBhdXMuIDxmbXQ+IGthbm4gU3RyaW5ncyBiZWluaGFsdGVuLCBkaWUgZHVyY2ggJWQgdW5kICVzIGdldHJlbm50CisgICAgIHdlcmRlbi4gSmVkZXMgJWQgdW5kICVzIGVudHNwcmljaHQgZWluZXIgZGVyIFZhcmlhYmxlbiA8dmFyMT4sIDx2YXIyPiwKKyAgICAgZXRjLiBpbiBkaWUgZ2VzcGVpY2hlcnQgd2VyZGVuIHNvbGwuCisKKyAgICAgRGllIE9wZXJhdG9yZW4gaW0gRm9ybWF0LVN0cmluZyA8Zm10PiBoYWJlbiBlaW5lcyBkZXIgZm9sZ2VuZGVuCisgICAgIEZvcm1hdGU6CisKKyAgICAgICAgICVbK11bIXx+XVs8c2l6ZT5bLjxtaW5tYXRjaD5dXTx0eXBlPgorCisgICAgICAgIDx0eXBlPiBrYW5uIGZvbGdlbmRlcyBzZWluOgorICAgICAgICAgICAgZDogc3RlaHQgZnVlciBlaW5lIFphaGwKKyAgICAgICAgICAgIEQ6IHN0ZWh0IGZ1ZXIgZWluZSBaYWhsCisgICAgICAgICAgICBVOgorICAgICAgICAgICAgczogc3RlaHQgZnVlciBlaW5lIFplaWNoZW5rZXR0ZQorICAgICAgICAgICAgJTogc3RlaHQgZnVlciBkYXMgJS1aZWljaGVuCisgICAgICAgICAgICB0OiBzdGVodCBmdWVyIFdoaXRlc3BhY2VzIChhbHNvIExlZXJzY2hsYWVnZSB1bmQgVGFidWxhdG9yZW4pLAorICAgICAgICAgICAgICAgc3BlaWNoZXJ0IGRpZXNlIGFiZXIgbmljaHQuCisKKyAgICAgPHNpemU+IGlzdCBkaWUgZXJ3YXJ0ZXRlIEZlbGRncm9lc3NlLCA8bWlubWF0Y2g+IGRpZSB2ZXJsYW5ndGUKKyAgICAgbWluaW1hbGUgTGFlbmdlIGZ1ZXIgZWluZW4gVHJlZmZlciAoU3RhbmRhcmR3ZXJ0ZSBzaW5kIDAgZnVlcgorICAgICBTdHJpbmdzIHVuZCAxIGZ1ZXIgTnVtbWVybikuIFNvd29obCA8c2l6ZT4gYWxzIGF1Y2ggPG1pbm1hdGNoPiBrYW5uCisgICAgIGVudHdlZGVyIG51bWVyaXNjaCBvZGVyIG1pdCAnKicgYW5nZWdlYmVuIHdlcmRlbiAtIGltIHp3ZWl0ZW4gRmFsbAorICAgICB3aXJkIGRpZSBndWVsdGlnZSBWYXJpYWJsZSBpbiBkZXIgTGlzdGUgZGVyIEFyZ3VtZW50ZSBiZW51dHp0LgorCisgICAgIFdpcmQgKyBhbmdlZ2ViZW4sIG11ZXNzZW4gZGllIFplaWNoZW4gbmFjaCBkZW0gRmVsZCBlYmVuZmFsbHMKKyAgICAgbWF0Y2hlbi4gSXN0IGRpZXMgbmljaHQgZGVyIEZhbGwsIHdpcmQgYXVjaCBkaWVzZXMgRmVsZCBhbHMKKyAgICAgTWlzc2VyZm9sZyBpbiBkZXIgUnVlY2tnYWJlIGJldHJhY2h0ZXQgKGF1Y2ggd2VubiBkZXIgV2VydAorICAgICBiZXJlaXRzIGFuIGRpZSB6dWdlaG9lcmlnZSBWYXJpYWJsZSB6dWdld2llc2VuIHd1cmRlKS4KKworICAgICBXaXJkICEgYW5nZWdlYmVuLCB3aXJkIHp3YXIgZGllIFN1Y2hlIGR1cmNoZ2VmdWVocnQsIGFiZXIgVHJlZmZlcgorICAgICB3ZXJkZW4gd2VkZXIgZ2VzcGVpY2hlcnQgbm9jaCBnZXphZWhsdC4gTWl0IH4gYWxzIEFyZ3VtZW50IHdpcmQKKyAgICAgendhciBkaWUgU3VjaGUgZHVyY2hnZWZ1ZWhydCB1bmQgZGllIFRyZWZmZXIgZ2V6YWVobHQsIGRhcyBSZXN1bHRhdAorICAgICB3aXJkIGFiZXIgbmljaHQgZ2VzcGVpY2hlcnQuCisKKyAgICAgV2VubiBlaW4gJXMgbmljaHQgYW0gRW5kZSB2b24gPGZtdD4gc3RlaHQsIHdpcmQgbnVyIGVpbiBUcmVmZmVyCisgICAgIHJlZ2lzdHJpZXJ0LCB3ZW5uIGF1Y2ggZGVyIG5hY2hmb2xnZW5kZSBTdHJpbmcgYnp3LiBkYXMKKyAgICAgbmFjaGZvbGdlbmRlIEZvcm1hdCBnZWZ1bmRlbiB3aXJkLiBXZWl0ZXIgdW50ZW4gZ2lidCBlcyBkYXp1CisgICAgIGVpbiBCZWlzcGllbC4KKyAgICAgQmVpIGVpbmVtICVkIGFsbGVyZGluZ3MgbXVzcyBkaWVzZXMgVmVyaGFsdGVuIG1pdCBlaW5lbSAnKycKKyAgICAgZXJ6d3VuZ2VuIHdlcmRlbi4KKworICAgICBEZXIgVW50ZXJzY2hpZWQgendpc2NoZW4gJWQgdW5kICVEICVVIGlzdCwgZGFzcyBsZXR6dGVyZXMgZWluCisgICAgIHVubWl0dGVsYmFyIHZvcmF1c2dlaGVuZGVzICVzIHNvIGJhbGQgYWxzIG1vZWdsaWNoIGFiYnJpY2h0LAorICAgICB3YWVocmVuZCBlcnN0ZXJlcyB6dWVyc3QgdmVyc3VjaHQsIGVpbmVuIG1vZWdsaWNoc3QgZ3Jvc3NlbiBUcmVmZmVyCisgICAgIGZ1ZXIgJXMgenUgZXJ6aWVsZW4uIFRyb3R6ZGVtIHVlYmVyc3ByaW5ndCAlRC8lVSBrZWluZSBXaGl0ZXNwYWNlcywKKyAgICAgZGF6dSBtdXNzICUuMHQlRCBnZXNldHp0IHdlcmRlbi4KKworICAgICBEaWUgRnVua3Rpb24gc3NjYW5mKCkgaXN0IGluc29mZXJuIGVpbiBTcGV6aWFsZmFsbCwgYWxzIGRhc3MKKyAgICAgQXJndW1lbnRlIGF1dG9tYXRpc2NoIG5hY2ggUmVmZXJlbnogdWViZXJnZWJlbiB3ZXJkZW4uCisKK0JFSVNQSUVMRToKKyAgICAgc3RyaW5nIHdobywgd2hhdDsKKyAgICAgICAgIGlmIChzc2NhbmYoIndpcmYgZnJpc2JlZSB6dSByZXgiLAorICAgICAgICAgICAgICAgICAgICAid2lyZiAlcyB6dSAlcyIsIHdoYXQsIHdobykgIT0gMikKKyAgICAgICAgICAgICB3cml0ZSgiVXNhZ2U6IFdpcmYgPHdoYXQ+IHp1IDx3aG8+XG4iKTsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICB3cml0ZSgiRHUgd2lyZnN0IGVpbmVuICIrd2hhdCsiIHp1ICIrd2hvKyIuXG4iKTsKKworICAgICBzc2NhbmYoImFiIiwgIiVzJXMiLCB3aG8sIHdoYXQpCisgICAgID09PiBsaWVmZXJ0IDIsIHdobyA9ICIiLCB3aGF0ID0gImFiIgorCisgICAgIHNzY2FuZigiYWIiLCAiJXMgJXMiLCB3aG8sIHdoYXQpCisgICAgID09PiBsaWVmZXJ0IDAsIHdobyA9IDAsIHdoYXQgPSAwCisKKyAgICAgc3NjYW5mKCJhYiAiLCAiJXMgJXMiLCB3aG8sIHdoYXQpCisgICAgID09PiBsaWVmZXJ0IDIsIHdobyA9ICJhYiIsIHdoYXQgPSAiIgorCisKKyAgICAgLy8gQWNodHVuZyBiZWkgJWQKKyAgICAgc3NjYW5mKCIxMiAiLCIlZCB4eXoiLCBudW0xKTsKKyAgICAgPT0+IGxpZWZlcnQgMSwgbnVtMSA9IDEyCisKKyAgICAgc3NjYW5mKCIxMiAiLCIlcyB4eXoiLCBudW0xKTsKKyAgICAgPT0+IGxpZWZlcnQgMCwgbnVtMSA9IDAKKworICAgICAvLyBtaXQgJysnIHdpcmQgZGFzIFBhcnNlbiBkZXMgUmVzdGZvcm1hdHMgZXJ6d3VuZ2VuOgorICAgICBzc2NhbmYoIjEyICIsIiUrZCB4eXoiLCBudW0xKTsKKyAgICAgPT0+IGxpZWZlcnQgMCwgbnVtMSA9IDEyCisKKworICAgICAvLyBXZWl0ZXJlcyBCZWlzcGllbCB6dSAlZDoKKyAgICAgc3NjYW5mKCJnZXQgMTIgY29pbnMiLCJnZXQgJWQgcnVieXMiLG51bSkKKyAgICAgPT0+IGVyZ2lidCAxLCB3ZWlsICdydWJ5cycgaWdub3JpZXJ0IHdpcmQKKworICAgICAvLyBCZWlzcGllbCBGb3JtYXQtSWdub3JlIDIKKyAgICAgc3NjYW5mKCJnZXQgMTIgY29pbnMiLCJnZXQgJStkIHJ1YnlzIixudW0pOworICAgICA9PT4gZXJnaWJ0IDAsIGRhIG1pdCBkZW0gJysnIGRhcyBQYXJzZW4gZGVzIFJlc3Rmb3JtYXRzIGVyend1bmdlbiB3aXJkCisgICAgID09PiBlcmdpYnQgMSBiZWkgJ2dldCAxMiBydWJ5cycKKworICAgICAvLyBCZWlzcGllbCBGb3JtYXQtSWdub3JlIDMgW2FsdGUgVmFyaWFudGVdCisgICAgIHNzY2FuZigiZ2V0IDEyIGNvaW5zIiwiZ2V0ICVkIHJ1YnlzJXMiLCBudW0sIGR1bW15KQorICAgICA9PT4gZXJnaWJ0IDEKKyAgICAgPT0+IGVyZ2lidCAyIGJlaSAiZ2V0IDEyIHJ1YnlzIgorCitTSUVIRSBBVUNIOgorICAgICAgICBleHBsb2RlKEUpLCByZWdleHAoRSkKKworOC5BdWcgMjAwNyBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vc3RyZnRpbWUgYi9kb2MvZWZ1bi9zdHJmdGltZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTY3YWZiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vc3RyZnRpbWUKQEAgLTAsMCArMSwxMTIgQEAKK1NZTk9QU0lTCisgICAgIHN0cmluZyBzdHJmdGltZSgpCisgICAgIHN0cmluZyBzdHJmdGltZShzdHJpbmcgZm10KQorICAgICBzdHJpbmcgc3RyZnRpbWUoaW50IGNsb2NrKQorICAgICBzdHJpbmcgc3RyZnRpbWUoc3RyaW5nIGZtdCwgaW50IGNsb2NrKQorICAgICBzdHJpbmcgc3RyZnRpbWUoc3RyaW5nIGZtdCwgaW50IGNsb2NrLCBpbnQgbG9jYWxpemVkKQorCitCRVNDSFJFSUJVTkcKKyAgICAgR2lidCwgYWVobmxpY2hlIHdpZSBjdGltZSgpLCBlaW5lIFplaXQgYWxzIGZvcm1hdGllcnRlbiBTdHJpbmcgenVydWVjay4KKyAgICAgSGllcmJlaSBrYW5uIGVpbiBTdHJpbmcgbWl0IGRpdi4gUGxhdHpoYWx0ZXJuIHZvbSBCZW51dHplciBhbmdlZ2ViZW4KKyAgICAgd2VyZGVuIChzLnUuKS4gV2lyZCBrZWluIFN0cmluZyBhbmdlZ2ViZW4sIHdpcmQgIiVjIiBhbHMgRm9ybWF0c3RyaW5nCisgICAgIGJlbnV0enQuCisKKyAgICAgRGFzIEFyZ3VtZW50IDxjbG9jaz4gd2lyZCBhbHMgQW56YWhsIFNla3VuZGVuIHNlaXQgZGVtIDAxLjAxLjE5NzAsIDAwOjAwCisgICAgIFVociBpbnRlcnByZXRpZXJ0LiBXZW5uIDxjbG9jaz4gbmljaHQgYW5nZWdlYmVuIHdpcmQsIHdpcmQgdGltZSgpCisgICAgIHZlcndlbmRldC4KKworICAgICBEYXMgQXJndW1lbnQgPGxvY2FsaXplZD4gZ2lidCBhbiwgb2IgZGllIEF1c2dhYmUgZW5nbGlzY2ggKGRhcyBzb2cuCisgICAgIGtsYXNzaXNjaGUgIkMiIGxvY2FsZSkgb2RlciBpbiBkZXIgamV3ZWlsaWdlbiBMYW5kZXNzcHJhY2hlICh6LkIuCisgICAgIGRldXRzY2gpIGVyZm9sZ2VuIHNvbGwuIEhpZXJiZWkgaGFlbmd0IGRpZSBTcHJhY2hlIGFsbGVyZGluZ3Mgdm9uIGRlbiBhdWYKKyAgICAgZGVtIE11ZHJlY2huZXIgZ2VzZXR6dGVuIFVtZ2VidW5nc3ZhcmlhYmxlbiBMQ19USU1FIG9kZXIgTENfQUxMIGFiLCBzaWUKKyAgICAga2FubiBuaWNodCBzZWxiZXIgZ2V3YWVobHQgd2VyZGVuLiBXaXJkIGtlaW4gPGxvY2FsaXplZD4gYW5nZWdlYmVuLCB3aXJkCisgICAgIDEgdmVyd2VuZGV0LCB3YXMgZWluZXIgQXVzZ2FiZSBpbiBMYW5kZXNzcHJhY2hlIGVudHNwcmljaHQuCisgICAgIDA6IEF1c2dhYmUgaW0ga2xhc3Npc2NoZW4gIkMiIGxvY2FsZSAoZW5nbGlzaCkKKyAgICAgMTogQXVzZ2FiZSBpbiBMYW5kZXNzcHJhY2hlIGRlcyBNdWRyZWNobmVycy4KKworQkVNRVJLVU5HRU46CisgICAgIERlciB6dXJ1ZWNrZ2ViZW5lIEVyZ2Vibmlzc3RyaW5nIGlzdCBtYXguIDUxMSBaZWljaGVuIGxhbmcuCisKK1BMQVRaSEFMVEVSOgorICAgICBEaWVzZSBGdW5rdGlvbiB2ZXJzdGVodCBhbGxlIFBsYXR6aGFsdGVyLCBkaWUgZGllIEZ1bmt0aW9uIHN0cmZ0aW1lKCkgYXVzCisgICAgIGRlciBDLVN0YW5kYXJkYmlibGlvdGhlayB2ZXJzdGVodC4gTW9tZW50YW4gc2luZCBkaWVzOgorICAgICAgICVhICAgICBEZXIgYWJnZWt1ZXJ6dGUgV29jaGVudGFnIGFiaGFlbmdpZyB2b24gZGVyIG1vbWVudGFuZW4gTG9jYWxlLgorICAgICAgICVBICAgICBEZXIgZ2VzYW10ZSBXb2NoZW50YWcgYWJoYWVuZ2lnIHZvbiBkZXIgbW9tZW50YW5lbiBMb2NhbGUuCisgICAgICAgJWIgICAgIERlciBhYmdla3Vlcnp0ZSBNb25hdHNuYW1lIGFiaGFlbmdpZyB2b24gZGVyIG1vbWVudGFuZW4gTG9jYWxlLgorICAgICAgICVCICAgICBEZXIgdm9sbGUgTW9uYXRzbmFtZSBhYmhhZW5naWcgdm9uIGRlciBtb21lbnRhbmVuIExvY2FsZS4KKyAgICAgICAlYyAgICAgRGFzIGJldm9yenVndGUgRGF0dW1zLSB1bmQgVWhyemVpdC1SZXByYWVzZW50YXRpb24gbGF1dCBFaW5zdGVsLQorICAgICAgICAgICAgICBsdW5nZW4gZGVyIG1vbWVudGFuZW4gTG9jYWxlLgorICAgICAgICVDICAgICBEYXMgSmFocmh1bmRlcnQgYWxzIHp3ZWlzdGVsbGlnZSBaYWhsLgorICAgICAgICVkICAgICBEZXIgVGFnIGltIE1vbmF0IGFscyBEZXppbWFsemFobCAoMDEgLSAzMSkuCisgICAgICAgJUQgICAgIEFlcXVpdmFsZW50ICB6dSAlbS8lZC8leS4gIChVUy1hbWVyaWthbmlzY2hlcyBGb3JtYXQuICBJbiBhbmRlcmVuCisgICAgICAgICAgICAgIExhZW5kZXJuIGlzdCAlZC8lbS8leSBkdXJjaGF1cyB1ZWJsaWNoIC4gSW4gaW50ZXJuYXRpb25hbGVtIEtvbi0gCisgICAgICAgICAgICAgIHRleHQgaXN0IGRpZXNlcyBGb3JtYXQgZGFoZXIgbWVocmRldXRpZyB1bmQgc29sbHRlIG5pY2h0IHZlcndlbi0KKyAgICAgICAgICAgICAgZGV0IHdlcmRlbi4pCisgICAgICAgJWUgICAgIFdpZSAlZCwgZGVyIFRhZyBpbSBNb25hdCBhbHMgRGV6aW1hbHphaGwsIGFiZXIgZWluZSBmdWVocmVuZGUKKyAgICAgICAgICAgICAgTnVsbCBpc3QgZHVyY2ggZWluIExlZXJ6ZWljaGVuIGVyc2V0enQuCisgICAgICAgJUUgICAgIE1vZGlmaWthdG9yOiBBbHRlcm5hdGl2ZXMgRm9ybWF0IGJlbnV0emVuLCBzLnUuCisgICAgICAgJWcgICAgIFdpZSAgJUcsICBhYmVyIG9obmUgZGFzIEphaHJodW5kZXJ0LCBhbHNvIG1pdCB6d2Vpc3RlbGxpZ2VtIEphaHIKKyAgICAgICAgICAgICAgKDAwLTk5KS4KKyAgICAgICAlRyAgICAgRGFzIEphaHIgbGF1dCBJU08gODYwMSBtaXQgZGVtIEphaHJodW5kZXJ0IGFscyBEZXppbWFsemFobC4gIERhcworICAgICAgICAgICAgICB2aWVyc3RlbGxpZ2UgSmFociwgZGFzIHp1IElTTy1Xb2NoZW5udW1tZXIgKHNpZWhlICVWKSBwYXNzdC4gIEVzCisgICAgICAgICAgICAgIGhhdCBkYXNzZWxiZSBGb3JtYXQgdW5kIGRlbnNlbGJlbiBXZXJ0IHdpZSAleSwgIG51ciAgZGFzcywgIHdlbm4KKyAgICAgICAgICAgICAgZGllICBJU08tV29jaGVubnVtbWVyICB6dW0gIHZvcmhlcmdlaGVuZGVuICBvZGVyICBuYWVjaHN0ZW4gIEphaHIKKyAgICAgICAgICAgICAgZ2Vob2VydCwgZGllc2VzIEphaHIgc3RhdHRkZXNzZW4gYmVudXR6dCB3aXJkLgorICAgICAgICVoICAgICBBZXF1aXZhbGVudCB6dSAlYi4KKyAgICAgICAlSCAgICAgRGllIFN0dW5kZSBpbSAyNGgtRm9ybWF0IGFscyBHYW56emFobCAoMDAgLSAyMykuCisgICAgICAgJUkgICAgIERpZSBTdHVuZGUgaW0gMTJoLUZvcm1hdCBhbHMgR2FuenphaGwgKDAxIC0gMTIpLgorICAgICAgICVqICAgICBEZXIgVGFnIGltIEphaHIgYWxzIEdhbnp6YWhsICgwMDEgLSAzNjYpLgorICAgICAgICVrICAgICBEaWUgU3R1bmRlIGltIDI0aC1Gb3JtYXQgYWxzIEdhbnp6YWhsICgwIC0gMjMpOyBlaW56ZWxuZSBaaWZmZXJuCisgICAgICAgICAgICAgIGhhYmVuIGVpbiB2b3Jhbmdlc3RlbGx0ZXMgTGVlcnplaWNoZW4uIChTaWVoZSAlSC4pCisgICAgICAgJWwgICAgIERpZSBTdHVuZGUgaW0gMTJoLUZvcm1hdCBhbHMgR2FuenphaGwgKDAgLSAxMik7IGVpbnplbG5lIFppZmZlcm4KKyAgICAgICAgICAgICAgaGFiZW4gZWluIHZvcmFuZ2VzdGVsbHRlcyBMZWVyemVpY2hlbi4gKFNpZWhlICVJLikKKyAgICAgICAlbSAgICAgRGVyIE1vbmF0IGFscyBHYW56emFobCAoMDEgLSAxMikuCisgICAgICAgJU0gICAgIERpZSBNaW51dGUgYWxzIEdhbnp6YWhsICgwMCAtIDU5KS4KKyAgICAgICAlbiAgICAgRWluIFplaWxlbnZvcnNjaHViLgorICAgICAgICVwICAgICBFbnR3ZWRlciAnQU0nIG9kZXIgJ1BNJywgamUgbmFjaCBkZXIgdWViZXJnZWJlbmVuICBVaHJ6ZWl0LCAgb2RlcgorICAgICAgICAgICAgICBkaWUgIHp1Z2Vob2VyaWdlbiBaZWljaGVua2V0dGVuIGluIGRlciBtb21lbnRhbmVuIExvY2FsZS4gIE1pdHRhZworICAgICAgICAgICAgICBlcmhhZWx0ICdQTScsIE1pdHRlcm5hY2h0ICdBTScuCisgICAgICAgJVAgICAgIFdpZSAlcCwgYWJlciBpbiBLbGVpbmJ1Y2hzdGFiZW4uCisgICAgICAgJXIgICAgIFplaXQgaW4gQU0vUE0tTm90YXRpb247IGluIGRlciBQT1NJWC1Mb2NhbGUgaXN0IGRhcyBBZXF1aXZhbGVudAorICAgICAgICAgICAgICB6dSAnJUk6JU06JVMgJXAnLgorICAgICAgICVSICAgICBaZWl0IGluIDI0aC1Ob3RhdGlvbiAoJUg6JU0pLiAoU1UpIEZ1ZXIgZWluZSBWZXJzaW9uIG1pdCBTZWt1bmRlbgorICAgICAgICAgICAgICBzaWVoZSAlVC4KKyAgICAgICAlcyAgICAgRGllIFphaGwgZGVyIFNla3VuZGVuIHNlaXQgIGRlciAgRXBvY2hlLCAgYWxzbyAgc2VpdCAgMTk3MC0wMS0wMQorICAgICAgICAgICAgICAwMDowMDowMCBVVEMuCisgICAgICAgJVMgICAgIERpZSBTZWt1bmRlIGFscyBHYW56emFobCAoMDAgLSA2MSkuCisgICAgICAgJXQgICAgIEVpbiBUYWJ1bGF0b3J6ZWljaGVuLgorICAgICAgICVUICAgICBaZWl0IGluIDI0aC1Ob3RhdGlvbiAoJUg6JU06JVMpLgorICAgICAgICV1ICAgICBEZXIgVGFnIGRlciBXb2NoZSBhbHMgWmFobCB2b24gMSBiaXMgNywgbWl0IE1vbnRhZyBhbHMgMS4gIFNpZWhlCisgICAgICAgICAgICAgIGF1Y2ggJXcuCisgICAgICAgJVUgICAgIERpZSBXb2NoZW5udW1tZXIgZGVzIGFrdHVlbGxlbiBKYWhyZXMgYWxzIEdhbnp6YWhsICB2b24gIDAwICBiaXMKKyAgICAgICAgICAgICAgNTMsICBiZWdpbm5lbmQgIG1pdCBkZW0gZXJzdGVuIFNvbm50YWcgYWxzIGVyc3RlciBUYWcgZGVyIGVyc3RlbgorICAgICAgICAgICAgICBXb2NoZS4gIFNpZWhlIGF1Y2ggJVYgdW5kICVXLgorICAgICAgICVWICAgICBEaWUgV29jaGVubnVtbWVyIG5hY2ggSVNPIDg2MDE6MTk4OCBhbHMgRGV6aW1hbHphaGwgdm9uICAwMSAgYmlzCisgICAgICAgICAgICAgIDUzLCAgd29iZWkgV29jaGUgMSBkaWUgZXJzdGUgV29jaGUgaXN0LCBkaWUgd2VuaWdzdGVucyA0IFRhZ2UgaW0KKyAgICAgICAgICAgICAgbGF1ZmVuZGVuIEphaHIgaGF0LCBtaXQgTW9udGFnIGFscyBkZW0gIGVyc3RlbiAgVGFnICBkZXIgIFdvY2hlLgorICAgICAgICAgICAgICBTaWVoZSBhdWNoICVVIHVuZCAlVy4KKyAgICAgICAldyAgICAgRGVyICBUYWcgIGRlciAgV29jaGUgIGFscyAgWmFobCAgdm9uIDAgYmlzIDYsIG1pdCBTb25udGFnIGFscyAwLgorICAgICAgICAgICAgICBTaWVoZSBhdWNoICV1LgorICAgICAgICVXICAgICBEaWUgV29jaGVubnVtbWVyIGRlcyBha3R1ZWxsZW4gSmFocmVzIGFscyBHYW56emFobCAgdm9uICAwMCAgYmlzCisgICAgICAgICAgICAgIDUzLCAgYmVnaW5uZW5kICBtaXQgIGRlbSBlcnN0ZW4gTW9udGFnIGFscyBlcnN0ZXIgVGFnIGRlciBlcnN0ZW4KKyAgICAgICAgICAgICAgV29jaGUuCisgICAgICAgJXggICAgIERpZSBiZXZvcnp1Z3RlIERhdHVtcy1SZXByYWVzZW50YXRpb24gb2huZSBkaWUgWmVpdCBpbiBkZXIgbW9tZW4tCisgICAgICAgICAgICAgIHRhbmVuIExvY2FsZS4KKyAgICAgICAlWCAgICAgRGllICBiZXZvcnp1Z3RlICBVaHJ6ZWl0LVJlcHJhZXNlbnRhdGlvbiAgb2huZSAgZGFzICBEYXR1bSBpbiBkZXIKKyAgICAgICAgICAgICAgbW9tZW50YW5lbiBMb2NhbGUuCisgICAgICAgJXkgICAgIERhcyBKYWhyIGFscyBHYW56emFobCBvaG5lIGRhcyBKYWhyaHVuZGVydCAoMDAgLSA5OSkuCisgICAgICAgJVkgICAgIERhcyBKYWhyIGFscyBHYW56emFobCBtaXQgZGVtIEphaHJodW5kZXJ0LgorICAgICAgICV6ICAgICBEaWUgIFplaXR6b25lICBhbHMgIFN0dW5kZW5kaWZmZXJlbnogIHp1ICBHTVQuIEJlbm9ldGlndCwgdW0KKyAgICAgICAgICAgICAgUkZDODIyLWtvbmZvcm1lICBEYXR1bXNhbmdhYmVuICB6dSAgZXJoYWx0ZW4gIChtaXQgJyVhLCAlZCAlYiAlWQorICAgICAgICAgICAgICAlSDolTTolUyAleicpLgorICAgICAgICVaICAgICBEaWUgWmVpdHpvbmUgb2RlciBkZXIgTmFtZSBvZGVyIGRpZSBBYmt1ZXJ6dW5nLgorICAgICAgICUrICAgICBEYXR1bSB1bmQgWmVpdCBpbSBGb3JtYXQgdm9uIGRhdGUoMSkuCisgICAgICAgJSUgICAgIERhcyBaZWljaGVuICclJy4KKyAgICAgCitCRUlTUElFTAorICAgICB3cml0ZShzdHJmdGltZSgiSGV1dGUgaXN0ICVBLCBkZXIgJWQuICVCICVZLlxuIikpCisgICAgIGVyZ2lidCB6LkIuCisgICAgICJIZXV0ZSBpc3QgTW9udGFnLCBkZXIgMjQuIFNlcHRlbWJlciAyMDA3LlxuIgorCitTSUVIRSBBVUNICisgICAgIGN0aW1lKEUpLCBnbXRpbWUoRSksIGxvY2FsdGltZShFKSwgbWt0aW1lKEUpLCB0aW1lKEUpLCB1dGltZShFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vc3RyZnRpbWUuZW4gYi9kb2MvZWZ1bi9zdHJmdGltZS5lbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTBhYTY1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vc3RyZnRpbWUuZW4KQEAgLTAsMCArMSwxMjIgQEAKK1NZTk9QU0lTCisgICAgIHN0cmluZyBzdHJmdGltZSgpCisgICAgIHN0cmluZyBzdHJmdGltZShzdHJpbmcgZm10KQorICAgICBzdHJpbmcgc3RyZnRpbWUoaW50IGNsb2NrKQorICAgICBzdHJpbmcgc3RyZnRpbWUoc3RyaW5nIGZtdCwgaW50IGNsb2NrKQorICAgICBzdHJpbmcgc3RyZnRpbWUoc3RyaW5nIGZtdCwgaW50IGNsb2NrLCBpbnQgbG9jYWxpemVkKQorCitCRVNDSFJFSUJVTkcKKyAgICAgR2lidCwgYWVobmxpY2hlIHdpZSBjdGltZSgpLCBlaW5lIFplaXQgYWxzIGZvcm1hdGllcnRlbiBTdHJpbmcgenVydWVjay4KKyAgICAgSGllcmJlaSBrYW5uIGVpbiBTdHJpbmcgbWl0IGRpdi4gUGxhdHpoYWx0ZXJuIHZvbSBCZW51dHplciBhbmdlZ2ViZW4KKyAgICAgd2VyZGVuIChzLnUuKS4gV2lyZCBrZWluIFN0cmluZyBhbmdlZ2ViZW4sIHdpcmQgIiVjIiBhbHMgRm9ybWF0c3RyaW5nCisgICAgIGJlbnV0enQuCisKKyAgICAgRGFzIEFyZ3VtZW50IDxjbG9jaz4gd2lyZCBhbHMgQW56YWhsIFNla3VuZGVuIHNlaXQgZGVtIDAxLjAxLjE5NzAsIDAwOjAwCisgICAgIFVociBpbnRlcnByZXRpZXJ0LiBXZW5uIDxjbG9jaz4gbmljaHQgYW5nZWdlYmVuIHdpcmQsIHdpcmQgdGltZSgpCisgICAgIHZlcndlbmRldC4KKworICAgICBEYXMgQXJndW1lbnQgPGxvY2FsaXplZD4gZ2lidCBhbiwgb2IgZGllIEF1c2dhYmUgZW5nbGlzY2ggKGRhcyBzb2cuCisgICAgIGtsYXNzaXNjaGUgIkMiIGxvY2FsZSkgb2RlciBpbiBkZXIgamV3ZWlsaWdlbiBMYW5kZXNzcHJhY2hlICh6LkIuCisgICAgIGRldXRzY2gpIGVyZm9sZ2VuIHNvbGwuIEhpZXJiZWkgaGFlbmd0IGRpZSBTcHJhY2hlIGFsbGVyZGluZ3Mgdm9uIGRlbiBhdWYKKyAgICAgZGVtIE11ZHJlY2huZXIgZ2VzZXR6dGVuIFVtZ2VidW5nc3ZhcmlhYmxlbiBMQ19USU1FIG9kZXIgTENfQUxMIGFiLCBzaWUKKyAgICAga2FubiBuaWNodCBzZWxiZXIgZ2V3YWVobHQgd2VyZGVuLiBXaXJkIGtlaW4gPGxvY2FsaXplZD4gYW5nZWdlYmVuLCB3aXJkCisgICAgIDEgdmVyd2VuZGV0LCB3YXMgZWluZXIgQXVzZ2FiZSBpbiBMYW5kZXNzcHJhY2hlIGVudHNwcmljaHQuCisKK0JFTUVSS1VOR0VOOgorICAgICBEZXIgenVydWVja2dlYmVuZSBFcmdlYm5pc3N0cmluZyBpc3QgbWF4LiA1MTEgWmVpY2hlbiBsYW5nLgorICAgICBJbSBNRyBlcmZvbGd0IG1vbWVudGFuIGltbWVyIGVpbmUgZW5nbGlzY2hlIEF1c2dhYmUuCisKK1BMQVRaSEFMVEVSOgorICAgICBEaWVzZSBGdW5rdGlvbiB2ZXJzdGVodCBhbGxlIFBsYXR6aGFsdGVyLCBkaWUgZGllIEZ1bmt0aW9uIHN0cmZ0aW1lKCkgYXVzCisgICAgIGRlciBDLVN0YW5kYXJkYmlibGlvdGhlayB2ZXJzdGVodC4gTW9tZW50YW4gc2luZCBkaWVzOgorICAgICAKKyAgICAgJWEKKyAgICAgICAgaXMgcmVwbGFjZWQgYnkgdGhlIGxvY2FsZSdzIGFiYnJldmlhdGVkIHdlZWtkYXkgbmFtZS4gCisgICAgICVBCisgICAgICAgIGlzIHJlcGxhY2VkIGJ5IHRoZSBsb2NhbGUncyBmdWxsIHdlZWtkYXkgbmFtZS4gCisgICAgICViCisgICAgICAgIGlzIHJlcGxhY2VkIGJ5IHRoZSBsb2NhbGUncyBhYmJyZXZpYXRlZCBtb250aCBuYW1lLiAKKyAgICAgJUIKKyAgICAgICAgaXMgcmVwbGFjZWQgYnkgdGhlIGxvY2FsZSdzIGZ1bGwgbW9udGggbmFtZS4gCisgICAgICVjCisgICAgICAgIGlzIHJlcGxhY2VkIGJ5IHRoZSBsb2NhbGUncyBhcHByb3ByaWF0ZSBkYXRlIGFuZCB0aW1lIHJlcHJlc2VudGF0aW9uLiAKKyAgICAgJUMKKyAgICAgICAgaXMgcmVwbGFjZWQgYnkgdGhlIGNlbnR1cnkgbnVtYmVyICh0aGUgeWVhciBkaXZpZGVkIGJ5IDEwMCBhbmQgCisgICAgICAgIHRydW5jYXRlZCB0byBhbiBpbnRlZ2VyKSBhcyBhIGRlY2ltYWwgbnVtYmVyIFswMC05OV0uIAorICAgICAlZAorICAgICAgICBpcyByZXBsYWNlZCBieSB0aGUgZGF5IG9mIHRoZSBtb250aCBhcyBhIGRlY2ltYWwgbnVtYmVyIFswMSwzMV0uCisgICAgICVECisgICAgICAgIHNhbWUgYXMgJW0vJWQvJXkuIAorICAgICAlZQorICAgICAgICBpcyByZXBsYWNlZCBieSB0aGUgZGF5IG9mIHRoZSBtb250aCBhcyBhIGRlY2ltYWwgbnVtYmVyIFsxLDMxXTsgYSAKKyAgICAgICAgc2luZ2xlIGRpZ2l0IGlzIHByZWNlZGVkIGJ5IGEgc3BhY2UuIAorICAgICAlaAorICAgICAgICBzYW1lIGFzICViLiAKKyAgICAgJUgKKyAgICAgICAgaXMgcmVwbGFjZWQgYnkgdGhlIGhvdXIgKDI0LWhvdXIgY2xvY2spIGFzIGEgZGVjaW1hbCBudW1iZXIgCisgICAgICAgIFswMCwyM10uIAorICAgICAlSQorICAgICAgICBpcyByZXBsYWNlZCBieSB0aGUgaG91ciAoMTItaG91ciBjbG9jaykgYXMgYSBkZWNpbWFsIG51bWJlciAKKyAgICAgICAgWzAxLDEyXS4gCisgICAgICVqCisgICAgICAgIGlzIHJlcGxhY2VkIGJ5IHRoZSBkYXkgb2YgdGhlIHllYXIgYXMgYSBkZWNpbWFsIG51bWJlciAKKyAgICAgICAgWzAwMSwzNjZdLiAKKyAgICAgJW0KKyAgICAgICAgaXMgcmVwbGFjZWQgYnkgdGhlIG1vbnRoIGFzIGEgZGVjaW1hbCBudW1iZXIgWzAxLDEyXS4gCisgICAgICVNCisgICAgICAgIGlzIHJlcGxhY2VkIGJ5IHRoZSBtaW51dGUgYXMgYSBkZWNpbWFsIG51bWJlciBbMDAsNTldLiAKKyAgICAgJW4KKyAgICAgICAgaXMgcmVwbGFjZWQgYnkgYSBuZXdsaW5lIGNoYXJhY3Rlci4gCisgICAgICVwCisgICAgICAgIGlzIHJlcGxhY2VkIGJ5IHRoZSBsb2NhbGUncyBlcXVpdmFsZW50IG9mIGVpdGhlciBhLm0uIG9yIHAubS4gCisgICAgICVyCisgICAgICAgIGlzIHJlcGxhY2VkIGJ5IHRoZSB0aW1lIGluIGEubS4gYW5kIHAubS4gbm90YXRpb247IGluIHRoZSBQT1NJWCAKKyAgICAgICAgbG9jYWxlIHRoaXMgaXMgZXF1aXZhbGVudCB0byAlSTolTTolUyAlcC4gCisgICAgICVSCisgICAgICAgIGlzIHJlcGxhY2VkIGJ5IHRoZSB0aW1lIGluIDI0IGhvdXIgbm90YXRpb24gKCVIOiVNKS4gCisgICAgICVTCisgICAgICAgIGlzIHJlcGxhY2VkIGJ5IHRoZSBzZWNvbmQgYXMgYSBkZWNpbWFsIG51bWJlciBbMDAsNjFdLiAKKyAgICAgJXQKKyAgICAgICAgaXMgcmVwbGFjZWQgYnkgYSB0YWIgY2hhcmFjdGVyLiAKKyAgICAgJVQKKyAgICAgICAgaXMgcmVwbGFjZWQgYnkgdGhlIHRpbWUgKCVIOiVNOiVTKS4gCisgICAgICV1CisgICAgICAgIGlzIHJlcGxhY2VkIGJ5IHRoZSB3ZWVrZGF5IGFzIGEgZGVjaW1hbCBudW1iZXIgWzEsN10sIHdpdGggMSAKKyAgICAgICAgcmVwcmVzZW50aW5nIE1vbmRheS4gCisgICAgICVVCisgICAgICAgIGlzIHJlcGxhY2VkIGJ5IHRoZSB3ZWVrIG51bWJlciBvZiB0aGUgeWVhciAoU3VuZGF5IGFzIHRoZSBmaXJzdCBkYXkgCisgICAgICAgIG9mIHRoZSB3ZWVrKSBhcyBhIGRlY2ltYWwgbnVtYmVyIFswMCw1M10uIAorICAgICAlVgorICAgICAgICBpcyByZXBsYWNlZCBieSB0aGUgd2VlayBudW1iZXIgb2YgdGhlIHllYXIgKE1vbmRheSBhcyB0aGUgZmlyc3QgZGF5IAorICAgICAgICBvZiB0aGUgd2VlaykgYXMgYSBkZWNpbWFsIG51bWJlciBbMDEsNTNdLiBJZiB0aGUgd2VlayBjb250YWluaW5nIDEgCisgICAgICAgIEphbnVhcnkgaGFzIGZvdXIgb3IgbW9yZSBkYXlzIGluIHRoZSBuZXcgeWVhciwgdGhlbiBpdCBpcyBjb25zaWRlcmVkIAorICAgICAgICB3ZWVrIDEuIE90aGVyd2lzZSwgaXQgaXMgdGhlIGxhc3Qgd2VlayBvZiB0aGUgcHJldmlvdXMgeWVhciwgYW5kIHRoZSAKKyAgICAgICAgbmV4dCB3ZWVrIGlzIHdlZWsgMS4gCisgICAgICV3CisgICAgICAgIGlzIHJlcGxhY2VkIGJ5IHRoZSB3ZWVrZGF5IGFzIGEgZGVjaW1hbCBudW1iZXIgWzAsNl0sIHdpdGggMCAKKyAgICAgICAgcmVwcmVzZW50aW5nIFN1bmRheS4gCisgICAgICVXCisgICAgICAgIGlzIHJlcGxhY2VkIGJ5IHRoZSB3ZWVrIG51bWJlciBvZiB0aGUgeWVhciAoTW9uZGF5IGFzIHRoZSBmaXJzdCBkYXkgCisgICAgICAgIG9mIHRoZSB3ZWVrKSBhcyBhIGRlY2ltYWwgbnVtYmVyIFswMCw1M10uIEFsbCBkYXlzIGluIGEgbmV3IHllYXIgCisgICAgICAgIHByZWNlZGluZyB0aGUgZmlyc3QgTW9uZGF5IGFyZSBjb25zaWRlcmVkIHRvIGJlIGluIHdlZWsgMC4gCisgICAgICV4CisgICAgICAgIGlzIHJlcGxhY2VkIGJ5IHRoZSBsb2NhbGUncyBhcHByb3ByaWF0ZSBkYXRlIHJlcHJlc2VudGF0aW9uLiAKKyAgICAgJVgKKyAgICAgICAgaXMgcmVwbGFjZWQgYnkgdGhlIGxvY2FsZSdzIGFwcHJvcHJpYXRlIHRpbWUgcmVwcmVzZW50YXRpb24uIAorICAgICAleQorICAgICAgICBpcyByZXBsYWNlZCBieSB0aGUgeWVhciB3aXRob3V0IGNlbnR1cnkgYXMgYSBkZWNpbWFsIG51bWJlciBbMDAsOTldLiAKKyAgICAgJVkKKyAgICAgICAgaXMgcmVwbGFjZWQgYnkgdGhlIHllYXIgd2l0aCBjZW50dXJ5IGFzIGEgZGVjaW1hbCBudW1iZXIuIAorICAgICAlWgorICAgICAgICBpcyByZXBsYWNlZCBieSB0aGUgdGltZXpvbmUgbmFtZSBvciBhYmJyZXZpYXRpb24sIG9yIGJ5IG5vIGJ5dGVzIGlmIAorICAgICAgICBubyB0aW1lem9uZSBpbmZvcm1hdGlvbiBleGlzdHMuIAorICAgICAlJQorICAgICAgICBpcyByZXBsYWNlZCBieSAlLgorCitCRUlTUElFTAorICAgICB3cml0ZShzdHJmdGltZSgiSGV1dGUgaXN0ICVBLCBkZXIgJWQuICVCICVZLlxuIikpCisgICAgIGVyZ2lidCB6LkIuCisgICAgICJIZXV0ZSBpc3QgTW9udGFnLCBkZXIgMjQuIFNlcHRlbWJlciAyMDA3LlxuIgorCitTSUVIRSBBVUNICisgICAgIGdtdGltZShFKSwgbG9jYWx0aW1lKEUpLCBta3RpbWUoKSwgdGltZShFKSwgdXRpbWUoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL3N0cmluZ3AgYi9kb2MvZWZ1bi9zdHJpbmdwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZDgyYjAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9zdHJpbmdwCkBAIC0wLDAgKzEsMTAgQEAKK1NZTk9QU0lTCisgICAgICAgIGludCBzdHJpbmdwKG1peGVkIGFyZykKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIExpZWZlcnQgMSwgd2VubiBkYXMgQXJndW1lbnQgZWluZSBaZWljaGVua2V0dGUgKFN0cmluZykgaXN0LAorICAgICAgICBhbnNvbnN0ZW4gMC4KKworU0lFSEUgQVVDSAorICAgICAgICBjbG9zdXJlcChFKSwgZmxvYXRwKEUpLCBtYXBwaW5ncChFKSwgb2JqZWN0cChFKSwgaW50cChFKSwKKyAgICAgICAgcmVmZXJlbmNlcChFKSwgcG9pbnRlcnAoRSksIHN5bWJvbHAoRSksIGNsb25lcChFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vc3RybGVuIGIvZG9jL2VmdW4vc3RybGVuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwODFhN2EKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9zdHJsZW4KQEAgLTAsMCArMSwxMSBAQAorU1lOT1BTSVMKKyAgICAgICAgaW50IHN0cmxlbihzdHJpbmcgc3RyKQorCitCRVNDSFJFSUJVTkcKKyAgICAgICAgTGllZmVydCBkaWUgTGFlbmdlIGVpbmVzIFN0cmluZ3MuCisgICAgICAgIERpZXNlIGVmdW4gaXN0IFZFUkFMVEVUIHVuZCBlcnNldHp0IGR1cmNoIHNpemVvZigpLgorICAgICAgICBCaXR0ZSBpbiBuZXVlbSBDb2RlIG5pY2h0IG1laHIgYmVudXR6ZW4gdW5kIGluIGFsdGVtCisgICAgICAgIENvZGUgc3VremVzc2l2ZSBlcnNldHplbi4KKworU0lFSEUgQVVDSAorICAgICAgICBzaXplb2YoRSksIGV4dHJhY3QoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL3N0cnJzdHIgYi9kb2MvZWZ1bi9zdHJyc3RyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMDM5YjYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9zdHJyc3RyCkBAIC0wLDAgKzEsMjUgQEAKK1NZTk9QU0lTCisgICAgICAgIGludCBzdHJyc3RyKHN0cmluZyBzdHIsIHN0cmluZyBtdXN0ZXIpOworICAgICAgICBpbnQgc3RycnN0cihzdHJpbmcgc3RyLCBzdHJpbmcgbXVzdGVyLCBpbnQgcG9zKTsKKworQkVTQ0hSRUlCVU5HOgorICAgICAgICBMaWVmZXJ0IGRlbiBJbmRleCBkZXMgZXJzdGVuIEF1ZnRyZXRlbnMgdm9uIDxtdXN0ZXI+IGltIFN0cmluZyA8c3RyPiwKKyAgICAgICAgYXVzZ2VoZW5kIHZvbiBkZXIgUG9zaXRpb24gPHBvcz4gaGVyIHJ1ZWNrd2FlcnRzIGdlc3VjaHQuIFdpcmQgPHBvcz4KKyAgICAgICAgbmljaHQgYW5nZWdlYmVuLCB3aXJkIGFscyBTdGFuZGFyZCAtMSBnZXNldHp0LCB3YXMgZGVtIEVuZGUgdm9uIDxzdHI+CisgICAgICAgIGVudHNwcmljaHQuIE1pdCBhbmRlcmVuIFdvcnRlbjogZGllIEZ1bmt0aW9uIGxpZWZlcnQgZGVuIEluZGV4IGRlcworICAgICAgICBsZXR6dGVuIEF1ZnRyZXRlbnMgdm9uIDxtdXN0ZXI+IHZvciA8cG9zPi4KKworICAgICAgICBEZXIgSW5kZXgsIGRlciB6dXJ1ZWNrIGdlZ2ViZW4gd2lyZCwgaXN0IHJlbGF0aXYgenVtIEJlZ2lubiBkZXMKKyAgICAgICAgU3RyaW5ncyA8c3RyPi4KKworICAgICAgICBXZW5uIDxtdXN0ZXI+IG5pY2h0IGluIDxzdHI+IGdlZnVuZGVuIHdpcmQsIHdpcmQgLTEgenVydWVjayBnZWdlYmVuLgorCisgICAgICAgIFdlbm4gPHBvcz4gbmVnYXRpdiBpc3QsIGJlemVpY2huZXQgPHBvcz4gZGVuIEluZGV4IHZvbSBFbmRlIGRlcworICAgICAgICBTdHJpbmdzIGF1cyBnZXphZWhsdC4gRGFiZWkgd2lyZCBkaWUgU3VjaGUgYWJlciBkZW5ub2NoIHJ1ZWNrd2FlcnRzCisgICAgICAgIGltIFN0cmluZyA8c3RyPiBkdXJjaGdlZnVlaHJ0LgorCitBRU5ERVJVTkdFTgorICAgICAgICBFaW5nZWZ1ZWhydCBpbiBMRE11ZCAzLjIuMTAKKworU0lFSEUgQVVDSAorICAgICAgICBzdHJzdHIoRSksIHN0cmxlbihFKSwgc3NjYW5mKEUpLCBzcHJpbnRmKEUpLCBleHBsb2RlKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9zdHJzdHIgYi9kb2MvZWZ1bi9zdHJzdHIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE1Y2I4MwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL3N0cnN0cgpAQCAtMCwwICsxLDE3IEBACitTWU5PUFNJUworICAgICAgICBpbnQgc3Ryc3RyKHN0cmluZyBzdHIsIHN0cmluZyBtdXN0ZXIpOworICAgICAgICBpbnQgc3Ryc3RyKHN0cmluZyBzdHIsIHN0cmluZyBtdXN0ZXIsIGludCBwb3MpOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgTGllZmVydCBkZW4gSW5kZXggZGVzIGVyc3RlbiBBdWZ0cmV0ZW5zIHZvbiA8bXVzdGVyPiBpbiA8c3RyPiwKKyAgICAgICAgYXVzZ2VoZW5kIHZvbiBkZXIgUG9zaXRpb24gPHBvcz4sIHdvYmVpIGluIDxzdHI+IHZvcndhZXJ0cyBnZXN1Y2h0CisgICAgICAgIHdpcmQuIFdpcmQgPHBvcz4gbmljaHQgYW5nZWdlYmVuLCB3aXJkIGFscyBTdGFuZGFyZHdlcnQgMCBnZXNldHp0LAorICAgICAgICBhbHNvIHZvbSBCZWdpbm4gdm9uIDxzdHI+IGhlciBnZXN1Y2h0LgorCisgICAgICAgIFdlbm4gPG11c3Rlcj4gbmljaHQgZ2VmdW5kZW4gd2lyZCwgd2lyZCAtMSB6dXJ1ZWNrIGdlbGllZmVydC4KKworICAgICAgICBXZW5uIDxwb3M+IG5lZ2F0aXYgaXN0LCBiZXplaWNobmV0IDxwb3M+IGRpZSBTdGFydHBvc2l0aW9uIGRlciBTdWNoZQorICAgICAgICByZWxhdGl2IHp1bSBFbmRlIHZvbiA8c3RyPiwgZXMgd2lyZCBhYmVyIHdlaXRlcmhpbiB2b3J3YWVydHMgZ2VzdWNodC4KKworU0lFSEUgQVVDSAorICAgICAgICBzdHJyc3RyKEUpLCBzdHJsZW4oRSksIHNzY2FuZihFKSwgc3ByaW50ZihFKSwgZXhwbG9kZShFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vc3RydWN0X2luZm8gYi9kb2MvZWZ1bi9zdHJ1Y3RfaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDRjZDBiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vc3RydWN0X2luZm8KQEAgLTAsMCArMSw0NiBAQAorU1lOT1BTSVMKKyAgICAgICAgI2luY2x1ZGUgPHN0cnVjdF9pbmZvLmg+CisgICAgICAgICNpbmNsdWRlIDxscGN0eXBlcy5oPgorCisgICAgICAgIG1peGVkICogc3RydWN0X2luZm8gKHN0cnVjdCBzdCwgaW50IHdoYXQpCisKK0RFU0NSSVBUSU9OCisgICAgICAgIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RydWN0dXJlIG9mIHN0cnVjdCA8c3Q+IGluIGFuIGFycmF5LgorICAgICAgICBJZiA8c3Q+IGhhcyBhIGJhc2Ugc3RydWN0LCA8d2hhdD4gZGV0ZXJtaW5lcyBob3cgdGhlIGluZm9ybWF0aW9uCisgICAgICAgIGlzIHJldHVybmVkOgorCisgICAgICAgIDx3aGF0PiA9PSBTSU5GT19GTEFUOgorICAgICAgICAgICAgQWxsIG1lbWJlcnMgb2YgPHN0PiwgaW5jbHVkaW5nIHRob3NlIGluaGVyaXRlZCBmcm9tIHRoZSBiYXNlCisgICAgICAgICAgICBzdHJ1Y3QsIGFyZSByZXR1cm5lZCBvbiB0aGUgdG9wIGxldmVsIG9mIHRoZSByZXN1bHQuCisgICAgICAgICAgICBUaGUgYmFzZSBzdHJ1Y3QgaXMgc2lnbmlmaWVkIGJ5IGp1c3QgaXRzIG5hbWUuCisKKyAgICAgICAgPHdoYXQ+ID09IFNJTkZPX05FU1RFRDoKKyAgICAgICAgICAgIE9ubHkgdGhlIG1lbWJlcnMgZGVmaW5lZCBpbiA8c3Q+IGl0c2VsZiBhcmUgcmV0dXJuZWQgb24KKyAgICAgICAgICAgIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIHJlc3VsdC4gVGhlIGluZm9ybWF0aW9uIGZvciB0aGUgYmFzZQorICAgICAgICAgICAgc3RydWN0IGlzIGEgYXJyYXkgYnkgaXRzZWxmLCBhcyBpdCB3b3VsZCBiZSByZXR1cm5lZAorICAgICAgICAgICAgYnkgYSBjYWxsIHRvIHN0cnVjdF9pbmZvKCkgZm9yIGEgYmFzZSBzdHJ1Y3QgaW5zdGFuY2UuCisKKyAgICAgICAgVGhlIGVsZW1lbnRzIGluIHRoZSByZXN1bHRpbmcgYXJyYXkgYXJlOgorCisgICAgICAgICAgc3RyaW5nIFtTSV9OQU1FXTogICAgICAgIHRoZSBuYW1lIG9mIHRoZSBzdHJ1Y3QKKyAgICAgICAgICBzdHJpbmcgW1NJX1BST0dfTkFNRV06ICAgdGhlIG5hbWUgb2YgcHJvZ3JhbSBkZWZpbmluZyB0aGUgc3RydWN0CisgICAgICAgICAgc3RyaW5nIFtTSV9QUk9HX0lEXTogICAgIHRoZSBpZCBvZiB0aGUgcHJvZ3JhbSBkZWZpbmluZyB0aGUgc3RydWN0CisgICAgICAgICAgbWl4ZWQgIFtTSV9CQVNFXTogICAgICAgIDAsIG9yIHRoZSBiYXNlIHN0cnVjdCBpbmZvcm1hdGlvbgorICAgICAgICAgIG1peGVkKiBbU0lfTUVNQkVSKzBdOiAgICB0aGUgZmlyc3QgbWVtYmVyIGluZm9ybWF0aW9uCisgICAgICAgICAgbWl4ZWQqIFtTSV9NRU1CRVIrbl06ICAgIHRoZSBsYXN0IG1lbWJlciBpbmZvcm1hdGlvbgorCisgICAgICAgIFRoZSBtZW1iZXIgaW5mb3JtYXRpb24gZW50cmllcyBhcmUgYXJyYXlzIHRoZW1zZWx2ZXMgd2l0aAorICAgICAgICB0aGVzZSBlbGVtZW50czoKKworICAgICAgICAgIHN0cmluZyBbU0lNX05BTUVdOiAgbmFtZSBvZiB0aGUgbWVtYmVyCisgICAgICAgICAgaW50ICAgIFtTSU1fVFlQRV06ICB0aGUgdHlwZSBvZiB0aGUgbWVtYmVyIChjb21waWxlLXRpbWUgdmFsdWUpCisgICAgICAgICAgc3RyaW5nIFtTSU1fRVhUUkFdOiAwLCBvciBpZiB0aGUgbWVtYmVyIGlzIGEgc3RydWN0LCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBuYW1lCisKK0hJU1RPUlkKKyAgICAgICAgSW50cm9kdWNlZCBpbiBMRE11ZCAzLjMuMzQ0LgorICAgICAgICBMRE11ZCAzLjMuNDE3IGludHJvZHVjZWQgU0lfUFJPR19OQU1FIGFuZCBTSV9QUk9HX0lEIGluIGV4Y2hhbmdlCisgICAgICAgICAgZm9yIFNJX1VOSVFVRV9OQU1FLgorCitTRUUgQUxTTworICAgICAgICBzdHJ1Y3RzKExQQykKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL3N0cnVjdHAgYi9kb2MvZWZ1bi9zdHJ1Y3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMTY2OGQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9zdHJ1Y3RwCkBAIC0wLDAgKzEsMTMgQEAKK1NZTk9QU0lTCisgICAgICAgIGludCBzdHJ1Y3RwKG1peGVkIGFyZykKKworREVTQ1JJUFRJT04KKyAgICAgICAgUmV0dXJuIDEgaWYgYXJnIGlzIGEgc3RydWN0LgorCitISVNUT1JZCisgICAgICAgIEludHJvZHVjdGVkIGluIExETXVkIDMuMy4yNzMuCisKK1NFRSBBTFNPCisgICAgICAgIGJhc2VvZihFKSwgY2xvc3VyZXAoRSksIGZsb2F0cChFKSwgbWFwcGluZ3AoRSksIG9iamVjdHAoRSksCisgICAgICAgIGludHAoRSksIHJlZmVyZW5jZXAoRSksIHBvaW50ZXJwKEUpLCBzdHJpbmdwKEUpLCBzeW1ib2xwKEUpLAorICAgICAgICBjbG9uZXAoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL3N3YXAgYi9kb2MvZWZ1bi9zd2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMjQyZTQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9zd2FwCkBAIC0wLDAgKzEsNyBAQAorR0VTQ0hVRVRaVAorU1lOT1BTSVMKKyAgICAgICAgdm9pZCBzd2FwKG9iamVjdCBvYmopOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgTGFnZXJ0IGVpbiBPYmpla3QgYXVzLiBEaWVzZSBFZnVuIGlzdCBudXIgZnVlciBzeXN0ZW1pbnRlcm5lcworICAgICAgICBEZWJ1Z2dpbmcgdW5kIGthbm4gZWluZW4gQWJzdHVyeiB2ZXJ1cnNhY2hlbi4KZGlmZiAtLWdpdCBhL2RvYy9lZnVuL3N5bWJvbF9mdW5jdGlvbiBiL2RvYy9lZnVuL3N5bWJvbF9mdW5jdGlvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmI1M2QwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vc3ltYm9sX2Z1bmN0aW9uCkBAIC0wLDAgKzEsMzYgQEAKK1NZTk9QU0lTCisgICAgICAgIGNsb3N1cmUgc3ltYm9sX2Z1bmN0aW9uKHN5bWJvbCBhcmcpOworICAgICAgICBjbG9zcnVlIHN5bWJvbF9mdW5jdGlvbihzdHJpbmcgYXJnKTsKKyAgICAgICAgY2xvc3VyZSBzeW1ib2xfZnVuY3Rpb24oc3RyaW5nIGFyZywgb2JqZWN0fHN0cmluZyBvYmopOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgRXJ6ZXVndCBlaW5lIExmdW4tLCBFZnVuLSBvZGVyIE9wZXJhdG9yLUNsb3N1cmUgYXVzIDxhcmc+LCB3b2JlaQorICAgICAgICA8YXJnPiBlbnR3ZWRlciBlaW4gc3RyaW5nIG9kZXIgZWluIHN5bWJvbCBzZWluIG11c3MuIEZ1ZXIKKyAgICAgICAgTGZ1bi1DbG9zdXJlcyBnaWJ0IDxvYmo+IGFuLCB6dSB3ZWxjaGVtIE9iamVrdCBkaWUgTGZ1biBnZWhvZXJ0LAorICAgICAgICBlbnR3ZWRlciBhbmdlZ2ViZW4gZHVyY2ggZGFzIE9iamVrdCBzZWxic3QgKGJ6dy4gZWluZW4gcG9pbnRlcgorICAgICAgICBkYXJhdWYpIG9kZXIgZHVyY2ggZGVuIE9iamVrdG5hbWVuIGFscyBTdHJpbmcuIFdlbm4gZWluIFN0cmluZworICAgICAgICBhbmdlZ2ViZW4gd2lyZCwgd2lyZCBkYXMgT2JqZWt0IGJlaW0gQXVmcnVmIGdlbGFkZW4uCisKKyAgICAgICAgV2VubiBkaWUgQ2xvc3VyZSBmdWVyIGVpbmUgTGZ1biBpbiBlaW5lbSBhbmRlcmVuIGFscyBkZW0gbW9tZW50YW5lbgorICAgICAgICBPYmpla3QgZXJ6ZXVndCB3aXJkLCBlcmdpYnQgZGllcyBlaW5lICJhbGllbiBsZnVuIGNsb3N1cmUiLiBTb2xjaGUKKyAgICAgICAgQ2xvc3VyZXMgc2luZCBhbiBkYXMgT2JqZWt0IGdlYnVuZGVuLCBkYXMgc3ltYm9sX2Z1bmN0aW9uKCkKKyAgICAgICAgYXVmZ2VydWZlbiBoYXQgKGRpZXNlcyBPYmpla3Qgd2lyZCB2b24gdG9fb2JqZWN0KCkgZ2VsaWVmZXJ0KSwKKyAgICAgICAgb2J3b2hsIGRlciBlaWdlbnRsaWNoZSBDb2RlIGluIGVpbmVtIGFuZGVyZW4gT2JqZWt0IHN0ZWh0IChkYXMgbWl0CisgICAgICAgIGdldF90eXBlX2luZm8oKSBnZWZ1bmRlbiB3ZXJkZW4ga2FubikuCisKKyAgICAgICAgQWxzICJwcml2YXRlIiBkZWtsYXJpZXJ0ZSBGdW5rdGlvbmVuIGtvZW5uZW4gYXVmIGRpZXNlIFdlaXNlIG5pZQorICAgICAgICB6dSBlaW5lciBDbG9zdXJlIGdld2FuZGVsdCB3ZXJkZW4sICJzdGF0aWMiIHVuZCAicHJvdGVjdGVkIgorICAgICAgICBkZWtsYXJpZXJ0ZSBMZnVucyBudXIgZGFubiwgd2VubiA8b2JqPiBkYXMgZ3VlbHRpZ2UgT2JqZWt0CisgICAgICAgIChkLmguIHRoaXNfb2JqZWN0KCkpIGlzdC4KKyAgICAgICAgRXhwb3JkLmguIHRpZXJ0IG1hbiBkaWUgQ2xvc3VyZXMsIGtvZW5uZW4gc2llIHVuYWJoYWVuZ2lnIHZvbSBNb2RpZmllciBkZXIKKyAgICAgICAgVXJzcHJ1bmdzZnVua3Rpb25lbiB2b24gamVkZW0gZ2VydWZlbiB3ZXJkZW4uCisgICAgICAgIHVtZ2VoZW4pLgorCitCRUlTUElFTEUKKyAgICAgICAgc3ltYm9sX2Z1bmN0aW9uKCJlZnVuOjp1c2VycyIpOworICAgICAgICAgICAgLS0+IGVyZ2lidDogIyd1c2VycworICAgICAgICBzeW1ib2xfZnVuY3Rpb24oIlF1ZXJ5UHJvcCIsIG90aGVyX29iaik7CisgICAgICAgICAgICAtLT4gZXJnaWJ0OiBvdGhlcl9vYmotPlF1ZXJ5UHJvcCgpCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgbGFtYmRhKEUpLCBxdW90ZShFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vc3ltYm9sX3ZhcmlhYmxlIGIvZG9jL2VmdW4vc3ltYm9sX3ZhcmlhYmxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYTY2ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi9zeW1ib2xfdmFyaWFibGUKQEAgLTAsMCArMSwyOSBAQAorU1lOT1BTSVMKKyAgICAgICAgY2xvc3VyZSBzeW1ib2xfdmFyaWFibGUoc3RyaW5nIGFyZyk7CisgICAgICAgIGNsb3N1cmUgc3ltYm9sX3ZhcmlhYmxlKHN5bWJvbCBhcmcpOworICAgICAgICBjbG9zdXJlIHN5bWJvbF92YXJpYWJsZShpbnQgYXJnKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIEVyemV1Z3QgZWluZSBJZGVudGlmaWVyIChMZnVuKSBDbG9zdXJlIGF1cyBkZXIgZ2xvYmFsZW4gVmFyaWFibGVuCisgICAgICAgIDxhcmc+IGRlcyBndWVsdGlnZW4gT2JqZWt0cy4gRGllIFZhcmlhYmxlIGthbm4gYW5nZWdlYmVuIHdlcmRlbgorICAgICAgICBhbHMgU3ltYm9sLCBtaXQgaWhyZW0gTmFtZW4gb2RlciBkdXJjaCBkaWUgb3JkaW5hbGUgTnVtbWVyIGluIGRlcgorICAgICAgICBWYXJpYWJsZW50YWJlbGxlIGRlcyBPYmpla3RzLgorCisgICAgICAgIFdlbm4ga2VpbmUgc29sY2hlIFZhcmlhYmxlIGV4aXN0aWVydCBvZGVyIHNpZSB2b24gYXVzc2VuIG5pY2h0CisgICAgICAgIHNpY2h0YmFyIGlzdCwgd2lyZCAwIHp1cnVlY2sgZ2VsaWVmZXJ0LgorCisgICAgICAgIFdlbm4gPGFyZz4gZWluIEludGVnZXIgaXN0IHVuZCBzaWNoIGF1ZiBlaW5lIGdlZXJidGUgVmFyaWFibGUKKyAgICAgICAgYmV6aWVodCwgZGllIGltIGdlZXJidGVuIE9iamVrdCAicHJpdmF0ZSIgZGVrbGFyaWVydCBpc3QgKGQuaC4KKyAgICAgICAgdmVyc3RlY2t0KSwgZnVlaHJ0IGRpZXMgenUgZWluZXIgU2NodXR6dmVybGV0enVuZy4KKworQUVOREVSVU5HRU4KKyAgICAgICAgRWluZ2VmdWVocnQgaW4gMy4yLjFAOAorCitCRUlTUElFTEUKKyAgICAgICAgaW50IGJhc2U7CisgICAgICAgIGludCB2YXI7CisgICAgICAgIHN5bWJvbF92YXJpYWJsZSgidmFyIik7ICAgICAgICAgZXJnaWJ0OiAjJzx0aGlzX29iamVjdD4tPnZhcgorICAgICAgICBzeW1ib2xfdmFyaWFibGUoMCk7ICAgICAgICAgICAgIGVyZ2lidDogIyc8dGhpc19vYmplY3Q+LT5iYXNlCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgbGFtYmRhKEUpLCBxdW90ZShFKSwgc3ltYm9sX2Z1bmN0aW9uKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi9zeW1ib2xwIGIvZG9jL2VmdW4vc3ltYm9scApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmM2NGI3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vc3ltYm9scApAQCAtMCwwICsxLDE0IEBACitTWU5PUFNJUworICAgICAgICBpbnQgc3ltYm9scChtaXhlZCBhcmcpCisKK0JFU0NIUkVJQlVORworICAgICAgICBMaWVmZXJ0IDEsIHdlbm4gZGFzIEFyZ3VtZW50IGVpbiBTeW1ib2wgaXN0LCBhbnNvbnN0ZW4gMC4KKworQkVJU1BJRUwKKyAgICAgICAgc3ltYm9scCgnZm9vKSBsaWVmZXJ0IDEuCisKK0FFTkRFUlVOR0VOCisgICAgICAgIEVpbmdlZnVlaHJ0IGluIDMuMkA3MC4KKworU0lFSEUgQVVDSAorICAgICAgICBpbnRwKEUpLCBxdW90ZShFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vdGFpbCBiL2RvYy9lZnVuL3RhaWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM1MGIzNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL3RhaWwKQEAgLTAsMCArMSw5IEBACitTWU5PUFNJUworICAgICAgICB2b2lkIHRhaWwoc3RyaW5nIGZpbGUpOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgTGlzdGV0IGRhcyBFbmRlIGVpbmVzIEZpbGVzLiBFcyBnaWJ0IGtlaW4gWmVpbGVubGltaXQsIGVzIHdlcmRlbiBhYmVyCisgICAgICAgIG1heGltYWwgMTAwMCBCeXRlcyBhdXNnZWdlYmVuLgorCitTSUVIRSBBVUNICisgICAgICAgIGNhdChFKSwgZWQoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL3RhbiBiL2RvYy9lZnVuL3RhbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTlhMDg1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vdGFuCkBAIC0wLDAgKzEsMTEgQEAKK1NZTk9QU0lTCisgICAgICAgIGZsb2F0IHRhbihpbnR8ZmxvYXQpCisKK0JFU0NIUkVJQlVORworICAgICAgICBMaWVmZXJ0IGRlbiBUYW5nZW5zIGRlcyBBcmd1bWVudGVzLgorCitBRU5ERVJVTkdFTgorICAgICAgICBMRE11ZCAzLjIuOTogR2FuenphaGxlbiAoSW50ZWdlcnMpIGFscyBBcmd1bWVudCBoaW56dWdlZnVlZ3QuCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgc2luKEUpLCBhc2luKEUpLCBjb3MoRSksIGFjb3MoRSksIGF0YW4oRSksIGF0YW4yKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi90ZWxsX29iamVjdCBiL2RvYy9lZnVuL3RlbGxfb2JqZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyY2ZkOWMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi90ZWxsX29iamVjdApAQCAtMCwwICsxLDQ3IEBACitTWU5PUFNJUworICAgICAgICB2b2lkIHRlbGxfb2JqZWN0KG9iamVjdHxzdHJpbmcgb2JqLCBzdHJpbmcgc3RyKTsKKyAgICAgICAgdm9pZCB0ZWxsX29iamVjdChvYmplY3R8c3RyaW5nIG9iaiwgbWl4ZWQgKnxtYXBwaW5nfHN0cnVjdHxvYmplY3QgbXNnKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIFNlbmRldCBlaW5lbiBOYWNocmljaHQgYW4gZGFzIE9iamVrdCA8b2JqPiAoZGFzIGF1Y2ggZHVyY2ggc2VpbmVuCisgICAgICAgIE9iamVrdG5hbWVuIGFuZ2VnZWJlbiB3ZXJkZW4ga2FubikuCisKKyAgICAgICAgSXN0IGRpZSBOYWNocmljaHQgZWluIFN0cmluZywgd2lyZCBkZXIgVGV4dCBhbiBpbnRlcmFrdGl2ZSBPYmpla3RlCisgICAgICAgIGRpcmVrdCBhdXNnZWdlYmVuLCBmdWVyIGFuZGVyZSBPYmpla3RlIHdpcmQgZGllIGxmdW4gY2F0Y2hfdGVsbCgpCisgICAgICAgIGluIGRpZXNlbiBhdWZnZXJ1ZmVuLgorCisgICAgICAgIElzdCBkaWUgTmFjaHJpY2h0IGVpbiBhbmRlcmVyIFR5cCwgd2lyZCBkaWUgbGZ1biBjYXRjaF9tc2coKSBpbQorICAgICAgICBFbXBmYWVuZ2VyIGF1ZmdlcnVmZW4uCisKK0JFTUVSS1VOR0VOCisgICAgICAgIC0gd2lyZCBpbiBlaW5lbSBjYXRjaF9tc2coKSBkZXIgV2VydCB2b24gPG1zZz4gdmVyYWVuZGVydCwgZXJoYWx0ZW4KKyAgICAgICAgICBhbGxlIG5hY2hmb2xnZW5kZW4gT2JqZWt0ZSBkYXMgdmVyYWVuZGVydGUgPG1zZz4gKFJlZmVyZW56ISkKKworQkVJU1BJRUxFCisgICAgICAgIC8vIERpZXMgZ2lidCBlaW4gZWluZmFjaGVzICJIaSEiIGFuIGRlbiBTcGllbGVyIFRob21hcyBhdXM6CisKKyAgICAgICAgICAgIG9iamVjdCB3ZXI7CisgICAgICAgICAgICB3ZXIgPSBmaW5kX3BsYXllcigidGhvbWFzIik7CisgICAgICAgICAgICB0ZWxsX29iamVjdCh3ZXIsICJIaSFcbiIpOworCisgICAgICAgIC8vIEVpbiBCZWlzcGllbCBtaXQgendlaSBPYmpla3RlbiwgZGFzIHplaWd0LCB3aWUgZGFzIFp1c2FtbWVuc3BpZWwKKyAgICAgICAgLy8gdm9uIGNhdGNoX3RlbGwoKSB1bmQgdGVsbF9vYmplY3QoKSBhYmxhdWVmdC4gT2JqZWt0MSBpc3QgZWluCisgICAgICAgIC8vIExlYmV3ZXNlbiBtaXQgTmFtZW4gIkR1bW15bW9uc3RlciIsIE9iamVrdDIgdmVydGVpbHQgZGllIE1lbGR1bmc6CisKKyAgICAgICAgT2JqZWt0MToKKyAgICAgICAgICAgIHZvaWQgY2F0Y2hfdGVsbChzdHJpbmcgc3RyKSB7CisgICAgICAgICAgICAgICAgd3JpdGUoIkVyaGFsdGVuZXIgVGV4dDogIitzdHIrIlxuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgT2JqZWt0MjoKKyAgICAgICAgICAgIHZvaWQgZnVuKCkgeworICAgICAgICAgICAgICAgIG9iamVjdCB3ZXI7CisgICAgICAgICAgICAgICAgd2VyID0gZmluZF9saXZpbmcoImR1bW15bW9uc3RlciIpOworICAgICAgICAgICAgICAgIHRlbGxfb2JqZWN0KHdlciwgIkZvbGdlIG1pciwgU3RlcmJsaWNoZXIhXG4iKTsKKyAgICAgICAgICAgICAgICAuLi4KKyAgICAgICAgICAgIH0KKworU0lFSEUgQVVDSAorICAgICAgICBBZWhubGljaDogICB3cml0ZShFKSwgc2hvdXQoRSksIHNheShFKSwgdGVsbF9yb29tKEUpLCBwcmludGYoRSkKKyAgICAgICAgVmVyd2FuZHQ6ICAgY2F0Y2hfdGVsbChFKSwgY2F0Y2hfbXNnKEEpCisgICAgICAgIFNvbnN0aWdlczogIG9iamVjdF9uYW1lKEUpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vdGVsbF9yb29tIGIvZG9jL2VmdW4vdGVsbF9yb29tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZjMwMmMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi90ZWxsX3Jvb20KQEAgLTAsMCArMSw3OSBAQAorRlVOS1RJT046CisgICAgICAgIHZvaWQgdGVsbF9yb29tKHN0cmluZ3xvYmplY3Qgb2JqLCBzdHJpbmcgc3RyKTsKKyAgICAgICAgdm9pZCB0ZWxsX3Jvb20oc3RyaW5nfG9iamVjdCBvYmosIHN0cmluZyBzdHIsIG9iamVjdCAqZXhjbHVkZSk7CisKKyAgICAgICAgdm9pZCB0ZWxsX3Jvb20oc3RyaW5nfG9iamVjdCBvYmosIG1peGVkICp8bWFwcGluZ3xzdHJ1Y3R8b2JqZWN0IG1zZykKKyAgICAgICAgdm9pZCB0ZWxsX3Jvb20oc3RyaW5nfG9iamVjdCBvYmosIG1peGVkICp8bWFwcGluZ3xzdHJ1Y3R8b2JqZWN0ICBtc2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIG9iamVjdCAqZXhjbHVkZSk7CisKK0JFU0NIUkVJQlVORzoKKyAgICAgICAgR2lidCBlaW5lbiBUZXh0IDxzdHI+IGFuIGRlbiBSYXVtIDxvYmo+IGF1cy4gPG9iaj4ga2FubiBhdWNoIGRlcgorICAgICAgICBPYmpla3RuYW1lIGRlcyBSYXVtZXMgYWxzIFN0cmluZyBzZWluLgorICAgICAgICBXZW5uIGRhcyBSYXVtb2JqZWt0IG1pdCBzZWluZW0gTmFtZW4gYW5nZWdlYmVuIGlzdCwgc3VjaHQgZGVyIERyaXZlcgorICAgICAgICBkYXMgT2JqZWt0IHVudGVyIGRpZXNlbSBOYW1lbiB1bmQgbGFlZHQgZXMsIGZhbGxzIG5vdHdlbmRpZy4KKworICAgICAgICBJc3QgZGllIE5hY2hyaWNodCBlaW4gU3RyaW5nLCB3aXJkIGRlciBUZXh0IGFuIGludGVyYWt0aXZlIE9iamVrdGUKKyAgICAgICAgZGlyZWt0IGF1c2dlZ2ViZW4sIGZ1ZXIgYW5kZXJlIE9iamVrdGUgd2lyZCBkaWUgbGZ1biBjYXRjaF90ZWxsKCkKKyAgICAgICAgaW4gZGllc2VuIGF1ZmdlcnVmZW4uCisgICAgICAgIEZhbGxzIGVpbiBMZXdlYmVzZW4gZGllIEZ1bmt0aW9uIGNhdGNoX3RlbGwoKSBkZWZpbmllcnQgKC0+IHNoYWRvdyksCisgICAgICAgIHNvIHdpcmQgZGVyIFRleHQgaGllciBhdXNnZXdlcnRldCB1bmQgbmljaHQgYW4gZGVuIFVzZXIgYXVzZ2VnZWJlbi4KKworICAgICAgICBXZW5uIGRhcyB6d2VpdGUgQXJndW1lbnQsIGRpZSBOYWNocmljaHQsIGtlaW4gU3RyaW5nIGlzdCwgd2lyZCBpbgorICAgICAgICBhbGxlbiBMZWJld2VzZW4sIGRpZSBkZW4gVGV4dCBlcmhhbHRlbiwgY2F0Y2hfbXNnKCkgYW5zdGF0dAorICAgICAgICBjYXRjaF90ZWxsKCkgYXVmZ2VydWZlbi4KKworICAgICAgICBNaXQgZGVtIEFycmF5IDwqZXhjbHVkZT4ga2FubiBtYW4gdmVyaGluZGVybiwgZGFzcyBkaWUgTmFjaHJpY2h0IGFuCisgICAgICAgIGRpZSBkYXJpbiBlbnRoYWx0ZW5lbiBPYmpla3RlIGdlc2VuZGV0IHdpcmQuCisgICAgICAgIERhcyBpc3Qgc2lubnZvbGwsIHdlbm4gekIgZWluIFNwaWVsZXIgQXVzbG9lc2VyIGVpbmVyIE1lbGR1bmcgaXN0CisgICAgICAgIHVuZCBkaWVzZSBzZWxic3QgbmljaHQgZXJoYWx0ZW4gc29sbC4KKworQkVNRVJLVU5HRU46CisgICAgICAgIC0gZGVyIEVpbnRyYWcgdm9uIG1laHJlcmVuIEFud2VzZW5kZW4gaW4gKmV4Y2x1ZGUgaXN0IG1vZWdsaWNoCisgICAgICAgIC0gd2lyZCBpbiBlaW5lbSBjYXRjaF9tc2coKSBkZXIgV2VydCB2b24gPG1zZz4gdmVyYWVuZGVydCwgZXJoYWx0ZW4KKyAgICAgICAgICBhbGxlIG5hY2hmb2xnZW5kZW4gT2JqZWt0ZSBkYXMgdmVyYWVuZGVydGUgPG1zZz4gKFJlZmVyZW56ISkKKworICAgICAgICAtIHNheSgic3RyIikgaXN0IHZlcmhhbHRlbnNnbGVpY2ggenUKKyAgICAgICAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSwgInN0ciIsICh7dGhpc19wbGF5ZXIoKXx8dGhpc19vYmplY3QoKX0pKQorCitCRUlTUElFTEU6CisgICAgICAgIC8vIERpZXMgaXN0IGVpbiBlaW5mYWNoZXMgQmVpc3BpZWwgZnVlciBlaW5lIE1lbGR1bmcgYW4gYWxsZSBBbi0KKyAgICAgICAgLy8gd2VzZW5kZW4gaW0gUmF1bS4KKworICAgICAgICB0ZWxsX3Jvb20odGhpc19vYmplY3QoKSwiRWluIGxlaWNodGVyIFdpbmQga29tbXQgYXVmLlxuIik7CisKKyAgICAgICAgLy8gRGllc2UgTWVsZHVuZyB3aXJkIGltIFJhdW0gL2QvZWJlbmUvYXJrL3JhdW0uYyBhdXNnZWdlYmVuLCBkaWVzZXIKKyAgICAgICAgLy8gUmF1bSBtdXNzIG5pY2h0IGRlcmplbmlnZSBzZWluLCBpbiBkZW0gZGFzIHRlbGxfcm9vbSgpIGF1c2dlZnVlaHJ0CisgICAgICAgIC8vIHdpcmQuCisKKyAgICAgICAgdGVsbF9yb29tKCIvZC9lYmVuZS9hcmsvcmF1bSIsIkVpbiBsZWljaHRlciBXaW5kIGtvbW10IGF1Zi5cbiIpOworCisKKyAgICAgICAgLy8gRGllc2UgTWVsZHVuZyB3aXJkIGFuIGFsbGUgQW53ZXNlbmRlbiBpbSBSYXVtIEFVU1NFUiB0aGlzX3BsYXllcigpCisgICAgICAgIC8vIChkZXIgZGllc2UgTWVsZHVuZyBhdXNnZWxvZXN0IGhhdCkgYXVzZ2VnZWJlbi4gRGVyIG11c3MgZWluZSBnZS0KKyAgICAgICAgLy8gc29uZGVydGUgTWVsZHVuZyB1ZWJlciBzZWluIFN0b2xwZXJuIHBlciB3cml0ZSgpIG9kZXIKKyAgICAgICAgLy8gdGVsbF9vYmplY3QoKSBiZWtvbW1lbi4KKyAgICAgICAgdGVsbF9yb29tKHRoaXNfb2JqZWN0KCksCisgICAgICAgICAgICAgICAgICBicmVha19zdHJpbmcodGhpc19wbGF5ZXIoKS0+TmFtZSgpKyIgc3RvbHBlcnQuIiwgNzgpLAorICAgICAgICAgICAgICAgICAgKHsgdGhpc19wbGF5ZXIoKSB9KSk7CisgICAgICAgIHRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksICJEdSBzdG9scGVyc3QuXG4iKTsKKworICAgICAgICAvLyBFaW4gQmVpc3BpZWwgbWl0IHp3ZWkgT2JqZWt0ZW4sIGRhcyB6ZWlndCwgd2llIGRhcyBadXNhbW1lbnNwaWVsCisgICAgICAgIC8vIHZvbiBjYXRjaF90ZWxsKCkgdW5kIHRlbGxfcm9vbSgpIGFibGF1ZWZ0LiBPYmpla3QxIGlzdCBlaW4KKyAgICAgICAgLy8gTGViZXdlc2VuIG1pdCBOYW1lbiAiRHVtbXltb25zdGVyIiwgT2JqZWt0MiB2ZXJ0ZWlsdCBkaWUgTWVsZHVuZzoKKworICAgICAgICBPYmpla3QxIChlaW4gTGViZXdlc2VuLCBzdGVodCBpbSBFbnYgdm9uIHRoaXNfcGxheWVyKCkpOgorICAgICAgICAgICAgdm9pZCBjYXRjaF90ZWxsKHN0cmluZyBzdHIpIHsKKyAgICAgICAgICAgICAgICB3cml0ZSgiRW1wZmFuZ2VuOiAiK3N0cisiXG4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBPYmpla3QyOgorICAgICAgICAgICAgdm9pZCBmdW4oKSB7CisgICAgICAgICAgICAgICAgdGVsbF9yb29tKGVudmlyb25tZW50KHRoaXNfcGxheWVyKCkpLCAiSGFsbG8gV2VsdCFcbiIpOworICAgICAgICAgICAgfQorCitTSUVIRSBBVUNICisgICAgICAgIEFlaG5saWNoOiAgIHRlbGxfb2JqZWN0KEUpLCB3cml0ZShFKSwgc2hvdXQoRSksIHNheShFKSwgcHJpbnRmKEUpCisgICAgICAgIFZlcndhbmR0OiAgIGNhdGNoX3RlbGwoRSksIGNhdGNoX21zZyhBKQorICAgICAgICBTb25zdGlnZXM6ICBvYmplY3RfbmFtZShFKQorCis3LkF1ZyAyMDA3IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi90ZXJtaW5hbF9jb2xvdXIgYi9kb2MvZWZ1bi90ZXJtaW5hbF9jb2xvdXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNkMWJjZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL3Rlcm1pbmFsX2NvbG91cgpAQCAtMCwwICsxLDEyNyBAQAorU1lOT1BTSVMKKyAgICAgICAgdmFyYXJncyBzdHJpbmcgdGVybWluYWxfY29sb3VyKHN0cmluZyBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsIHwgbWFwcGluZyB8IGNsb3N1cmUgbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdyYXAsIGludCBpbmRlbnQpOworQkVTQ0hSRUlCVU5HCisgICAgICAgIElzdCA8bWFwPiBlaW4gV2VydCB1bmdsZWljaCAwLCBlcnNldHp0IGRpZXNlIEVmdW4gYWxsZSBGYXJiLQorICAgICAgICBEZWZpbml0aW9uZW4gZGVyIEZvcm0gIiVeS0VZJV4iIChzaWVoZSB1bnRlbiBmdWVyIERldGFpbHMpIGltCisgICAgICAgIFN0cmluZyA8c3RyPiB1bmQgZXJzZXR6dCBzaWUgZHVyY2ggZGllIGVudHNwcmVjaGVuZGVuIFdlcnRlIGF1cyBkZW0KKyAgICAgICAgdW50ZXIgPG1hcD4gYW5nZWdlYmVuZW4gRmFyYnNjaGx1ZXNzZWwuCisKKyAgICAgICAgSXN0IDxtYXA+IGVpbiBNYXBwaW5nLCBtdWVzc2VuIGRpZSBFaW50cmFlZ2UgZGFzIEZvcm1hdAorICAgICAgICAiS0VZIiA6ICJ3ZXJ0IiBoYWJlbjsgRWludHJhZWdlLCBkaWUga2VpbmUgU3RyaW5ncyBlbnRoYWx0ZW4sCisgICAgICAgIHdlcmRlbiBpZ25vcmllcnQuIEVpbnppZ2UgQXVzbmFobWUgZGF6dTogZW50aGFlbHQgPG1hcD4gZWluZW4KKyAgICAgICAgRWludHJhZyBkZXIgRm9ybSAwOndlcnQsIHdpcmQgZGllc2VyIGZ1ZXIgYWxsZSBGYXJiZGVmaW5pdGlvbmVuCisgICAgICAgIHZlcndlbmRldCwgZGllIGtlaW5lbSBhbmRlcmVuIFNjaGx1ZXNzZWwgenVnZW9yZG5ldCB3ZXJkZW4ga29lbm5lbi4KKyAgICAgICAgPHdlcnQ+IGthbm4gaW4gZGllc2VtIEZhbGwgZWluIFN0cmluZyBvZGVyIGVpbmUgQ2xvc3VyZSBzZWluLiBIYW5kZWx0CisgICAgICAgIGVzIHNpY2ggdW0gZWluZSBDbG9zdXJlLCBlcmhhZWx0IGRpZXNlIGRlbiA8S0VZPiBhbHMgQXJndW1lbnQgdW5kCisgICAgICAgIG11c3MgZWluZW4gU3RyaW5nIHp1cnVlY2sgbGllZmVybiwgZGVyIDxLRVk+IGVyc2V0enQuCisKKyAgICAgICAgSXN0IDxtYXA+IGVpbmUgQ2xvc3VyZSwgd2lyZCBkaWVzZSBtaXQgZGVuIEZhcmJkZWZpbml0aW9uZW4gPEtFWT4KKyAgICAgICAgYWxzIEFyZ3VtZW50IGF1ZmdlcnVmZW4gdW5kIG11c3MgZWluZW4gU3RyaW5nIHp1cnVlY2sgbGllZmVybiwgZGVyCisgICAgICAgIGRpZSA8S0VZPnMgZXJzZXR6dC4KKworICAgICAgICBEaWUgc3BlemllbGxlbiBTY2hsdWVzc2VsICIlXiVeIiB1bmQgIiUlXl4iIHdlcmRlbiBpbW1lciBkdXJjaCBkYXMKKyAgICAgICAgTGl0ZXJhbCAiJV4iIGVyc2V0enQuCisKKyAgICAgICAgRGllIFBhcmFtZXRlciA8d3JhcD4gdW5kIDxpbmRlbnQ+IHNpbmQgb3B0aW9uYWwuIElzdCBudXIgPHdyYXA+CisgICAgICAgIGFuZ2VnZWJlbiwgd2lyZCA8c3RyPiBpbiBkZXIgU3BhbHRlIDx3cmFwPiB1bWdlYnJvY2hlbi4gSXN0CisgICAgICAgIHp1c2FldHpsaWNoIDxpbmRlbnQ+IGFuZ2VnZWJlbiwgd2VyZGVuIGFsbGUgdW1nZWJyb2NoZW5lbiBaZWlsZW4KKyAgICAgICAgdW0gPGluZGVudD4gU3BhbHRlbiBlaW5nZXJ1ZWNrdC4KKworICAgICAgICBEZXIgWmVpbGVudW1icnVjaCBpZ25vcmllcnQgZGllIExhZW5nZSBkZXIgRmFyYm1ha3JvcyB1bmQgaWhyZXIKKyAgICAgICAgSW5oYWx0ZS4gRXIgYnJpY2h0IDxzdHI+IGFuaGFuZCBkZXIgTGFlbmdlIGRlciB1ZWJyaWdlbiBaZWljaGVuCisgICAgICAgIHVtLCBpc3QgYWxzbyBmYXJiLW5ldXRyYWwuCisKKyAgICAgICAgSXN0IDxtYXA+IGFscyAwIGFuZ2VnZWJlbiwgZnVlaHJ0IGRpZSBFZnVuIGtlaW4gU3VjaGVuIHVuZCBFcnNldHplbgorICAgICAgICB2b24gRmFyYmRlZmluaXRpb25lbiBkdXJjaC4gRGllIEZ1bmt0aW9uYWxpdGFldCB2b24gWmVpbGVudW1icnVjaAorICAgICAgICB1bmQgRWlucnVlY2t1bmcgYmxlaWJlbiBlcmhhbHRlbiwgd2VubiBnZXd1ZW5zY2h0LiBBdWYgZGllc2UgV2Vpc2UKKyAgICAgICAgZHVwbGl6aWVydCB0ZXJtaW5hbF9jb2xvdXIoKSBkaWUgRnVua3Rpb24gdm9uIHNwcmludGYoIiUtPXMiKSB1bmQKKyAgICAgICAgd2lya3QgYWxzIGVpbmZhY2hlIFplaWxlbnVtYnJ1Y2ggRnVua3Rpb24uCisKKworICAgICAgICBFUktFTk5FTiBWT04gRkFSQkRFRklOSVRJT05FTgorCisgICAgICAgIFdpZSBiZXJlaXRzIGVyd2FlaG50LCB3ZXJkZW4gZGllIHNwZXppZWxsZW4gU2NobHVlc3NlbCAiJV4lXiIgdW5kCisgICAgICAgICIlJV5eIiBkdXJjaCBkYXMgTGl0ZXJhbCAiJV4iIGVyc2V0enQgdW5kIHNwaWVsZW4gaW0gV2VpdGVyZW4KKyAgICAgICAga2VpbmUgUm9sbGUuCisKKyAgICAgICAgRnVlciBkZW4gRWluZ2FiZXN0cmluZyB3aXJkIGRhcyBmb2xnZW5kZSBGb3JtYXQgdm9yYXVzZ2VzZXR6dDoKKworICAgICAgICAgICAgdGV4dCB7ICclXicgY29sb3JrZXkgJyVeJyB0ZXh0IH0gWyAnJV4nIGNvbG9ya2V5IF0KKworICAgICAgICBPZGVyIGluIFdvcnRlbjogZGllIEVmdW4gdHJlbm50IGRlbiBTdHJpbmcgYmVpIGplZGVtICclXicsIGRhcworICAgICAgICBzaWUgYW50cmlmZnQgdW5kIGJlaGFuZGVsdCBhbnNjaGxpZXNzZW5kIGplZGVuIHp3ZWl0ZW4gVGVpbHN0cmluZworICAgICAgICBhbHMgRmFyYnNjaGx1ZXNzZWwuCisKKyAgICAgICAgTWVya2U6IGRpZXNlcyBWZXJoYWx0ZW4gdW50ZXJzY2hlaWRldCBzaWNoIHZvbiBkZXIgQmVoYW5kbHVuZyBkZXMKKyAgICAgICAgRWluZ2FiZXN0cmluZ3MgdW50ZXIgTXVkT1MuIERvcnQgbGF1dGV0IGRpZSBTeW50YXg6CisKKyAgICAgICAgICAgIGtleV9vZGVyX3RleHQgeyAnJV4nIGtleV9vZGVyX3RleHQgfQorCisgICAgICAgIE9kZXIgaW4gV29ydGVuOiBkaWUgTXVkT1MgRWZ1biB0cmVubnQgZGVuIFN0cmluZyBiZWkgamVkZW0gJyVeJworICAgICAgICB1bmQgdmVyc3VjaHQgZGFubiBqZWRlbiBUZWlsc3RyaW5nIGFscyBGYXJic2NobHVlc3NlbCB6dSBiZWhhbmRlbG4uCisgICAgICAgIERpZXNlcyBWZXJoYWx0ZW4gbGFlc3N0IHNpY2ggYXVjaCB1bnRlciBMUEMgZXJyZWljaGVuOgorCisgICAgICAgICAgc3RyaW5nIG11ZG9zX3Rlcm1pbmFsX2NvbG91cihzdHJpbmcgc3RyLCBtYXBwaW5nIGV4dCwgaW50IHcsIGludCBpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0ZXJtaW5hbF9jb2xvdXIoIiVeIitpbXBsb2RlKGV4cGxvZGUoc3RyLCAiJV4iKS0oeyIifSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCIlXiVeIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIGV4dCwgdywgaSk7CisgICAgICAgICAgfQorCisKK0JFSVNQSUVMRQorICAgICAgICBtYXBwaW5nIHRyYW5zOworICAgICAgICBzdHJpbmcgc3RyOworCisgICAgICAgIHRyYW5zID0gKFsgIkdSRUVOIiA6ICJhbnNpLWdyZWVuIiwgIlJFRCIgOiAiIiwgIkJMVUUiIDogMSBdKTsKKworICAgICAgICBzdHIgPSB0ZXJtaW5hbF9jb2xvdXIoICIlXkdSRUVOJV4gYW5kICVeUkVEJV4gYW5kICVeQkxVRSVeIiwgdHJhbnMgKTsKKworICAgICAgICBEaWVzIGZ1ZWhydCB6dSBzdHIgPT0gImFuc2ktZ3JlZW4gYW5kICBhbmQgQkxVRSIuCisKKyAgICAgICAgIiVeR1JFRU5eJSIgd2lyZCBlcnNldHp0IGR1cmNoICJhbnNpLWdyZWVuIiwgd2VpbCA8dHJhbnM+IGRhcyBzbworICAgICAgICBkZWZpbmllcnQsCisgICAgICAgICIlXlJFRCVeIiB3aXJkIGF1cyA8c3RyPiBlbnRmZXJudCwgd2VpbCBlcyBtaXQgIiIgZXJzZXR6dCB3aXJkLCB1bmQKKyAgICAgICAgIiVeQkxVRSVeIiB3aXJkIHVtIGRpZSAiJV4iIHZlcmt1ZXJ0LCB3ZWlsIGRlciBFaW50cmFnIHp1IEJMVUUgaW4KKyAgICAgICAgPHRyYW5zPiBrZWluZW4gZ3VlbHRpZ2VuIFdlcnQgZW50aGFlbHQgKGQuaC4ga2VpbiBTdHJpbmcgaXN0KS4gRGFzCisgICAgICAgIHNlbGJlIHd1ZXJkZSBwYXNzaWVyZW4sIHdlbm4gPHN0cj4gIiVeREVGSU5FJV4iIGVudGhhbHRlbiB3dWVyZGUsCisgICAgICAgIHp1IGRlbSBlcyBrZWluZW4gRWludHJhZyBpbiA8dHJhbnM+IGdpYnQuCisKKyAgICAgICAgTWVya2U6IHVtIGRpcmVrdCBiZW5hY2hiYXJ0ZSBTY2hsdWVzc2VsIHp1IGVyc2V0emVuLCBzb2xsIGRpZQorICAgICAgICBFZnVuIHdpZSBmb2xndCB2ZXJ3ZW5kZXQgd2VyZGVuOgorCisgICAgICAgICAgICBzdHIgPSB0ZXJtaW5hbF9jb2xvdXIoICIlXkdSRUVOJV4lXlJFRCVeIiwgdHJhbnMgKTsKKworICAgICAgICBFaW5lIEVpbmdhYmUgZGVyIEZvcm0KKworICAgICAgICAgICAgc3RyID0gdGVybWluYWxfY29sb3VyKCAiJV5HUkVFTiVeUkVEJV4iLCB0cmFucyApOworCisgICAgICAgIGZ1ZWhydCB6dW0gbG9naXNjaGVuLCBhYmVyIHZpZWxsZWljaHQgdW5lcndhcnRldGVuIEVyZ2VibmlzCisgICAgICAgICJhbnNpLWdyZWVuUkVEIi4KKworCisgICAgICAgIEVpbmlnZSBXb3J0ZSB6dW0gWmVpbGVudW1icnVjaDoKKworICAgICAgICBFaW4gU3RyaW5nLCBkZXIgb2huZSBFaW5ydWVja3VuZyB1bWdlYnJvY2hlbiB3aXJkICg8aW5kZW50PiBpc3QgMCksCisgICAgICAgIHNpZWh0IHNvIGF1czoKKworICAgICAgICAgICAgImRpZXMgaXN0IGRpZSBlcnN0ZSBaZWlsZVxudW5kIGRpZXMgaXN0IGRpZSB6d2VpdGUgWmVpbGUiCisKKyAgICAgICAgRWluIFN0cmluZywgZGVyIG1pdCA8aW5kZW50PiAzIHVtZ2Vicm9jaGVuIHdpcmQsIHNpZWh0IHNvIGF1czoKKworICAgICAgICAgICAgImRpZXMgaXN0IGRpZSBlcnN0ZSBaZWlsZVxuICAgdW5kIGRpZXMgaXN0IGRpZSB6d2VpdGUgWmVpbGUiCisKK0FFTkRFUlVOR0VOCisgICAgICAgIERpZSBJZGVlIGZ1ZXIgZGllc2UgRWZ1biB1bmQgZGllIGVyc3RlIEltcGxlbWVudGllcnVuZyBzdGFtbWVuCisgICAgICAgIGF1cyBNdWRPUzsgZGllIFN0cmF0ZWdpZSBmdWVyIGRhcyBFcmtlbm5lbiB2b24gU2NobHVlc3NlbG4KKyAgICAgICAgKGVpbmdlc2NobG9zc2VuIGRpZSBwdXJlIFplaWxlbnVtYnJ1Y2ggRnVua3Rpb24pIHd1cmRlIGluCisgICAgICAgIExETXVkIDMuMi44IGdlZ2xhZXR0ZXQuCisgICAgICAgIExETXVkIDMuMi45IGZ1ZWd0ZSBkaWUgVmVyd2VuZHVuZyB2b24gQ2xvc3VyZXMgenVyIERlZmluaXRpb24KKyAgICAgICAgdm9uIEZhcmJzY2hsdWVzc2VsbiBoaW56dS4gRXMgZXJrbGFlcnRlIHp1ZGVtIG9mZml6aWVsbCBkYXMKKyAgICAgICAgVmVyaGFsdGVuIGJldHJlZmZlbiAiJSVeXiIgYXVzIEdydWVuZGVuIGJlc3NlcmVyIEtvbXBhdGliaWxpdGFldAorICAgICAgICBtaXQgTXVkT1MuCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgc3ByaW50ZihFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vdGVzdF9iaXQgYi9kb2MvZWZ1bi90ZXN0X2JpdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjgyYzk1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vdGVzdF9iaXQKQEAgLTAsMCArMSwyMSBAQAorU1lOT1BTSVMKKyAgICAgICAgaW50IHRlc3RfYml0KHN0cmluZyBzdHIsIGludCBuKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIEdpYnQgMCBvZGVyIDEgZGVzIDxuPi10ZW4gQml0cyBpbSBTdHJpbmcgPHN0cj4genVydWVjay4KKworICAgICAgICBKZWRlcyBaZWljaGVuIGJlc3RlaHQgYXVzIDYgQml0cy4gSmVkZW0gWmVpY2hlbiBpc3QgYWxzbyBlaW4gV2VydAorICAgICAgICB6d2lzY2hlbiAwIHVuZCA2MyB6dWdlb3JkbmV0ICh3ZWlsIDJeNj02NCkuIERhcyBlcnN0ZSBaZWljaGVuIGlzdCBkZXIKKyAgICAgICAgTGVlcnNjaGxhZyAiICIgbWl0IGRlbSBXZXJ0IDAgKGtlaW5lcyBkZXIgQml0cyBpc3QgZ2VzZXR6dCkuIERhcworICAgICAgICBlcnN0ZSBaZWljaGVuIGltIFN0cmluZyBpc3QgZGFzamVuaWdlIG1pdCBkZW4gbmllZHJpZ3N0ZW4gQml0cyAoMC01KS4KKworQkVJU1BJRUxFCisgICAgICAgIHRlc3RfYml0KCJfIiwgNSk7ICAgTGllZmVydCAxLCB3ZWlsICJfIiBkYXMgNjMuIFplaWNoZW4gaXN0IHVuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2hhbGIgZGFzIDUuIEJpdCBnZXNldHp0IGhhdC4KKworICAgICAgICB0ZXN0X2JpdCgiICIsIDMpOyAgIExpZWZlcnQgMCwgd2VpbCAiICIgZGFzIDAuIFplaWNoZW4gaXN0IHVuZCBkZXNoYWxiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga2VpbiBCaXQgZ2VzZXR6dCBoYXQuCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgc2V0X2JpdChFKSwgY2xlYXJfYml0KEUpLCBsYXN0X2JpdChFKSwgbmV4dF9iaXQoRSksIGNvdW50X2JpdHMoRSksCisgICAgICAgIGFuZF9iaXRzKEUpLCBvcl9iaXRzKEUpLCB4b3JfYml0cyhFKSwgaW52ZXJ0X2JpdHMoRSksIGNvcHlfYml0cyhFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vdGhpc19pbnRlcmFjdGl2ZSBiL2RvYy9lZnVuL3RoaXNfaW50ZXJhY3RpdmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI5MzhiYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL3RoaXNfaW50ZXJhY3RpdmUKQEAgLTAsMCArMSw5IEBACitTWU5PUFNJUworICAgICAgICBvYmplY3QgdGhpc19pbnRlcmFjdGl2ZSgpOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgRGllIEZ1bmt0aW9uIGdpYnQgZGFzIG1vbWVudGFuZSBpbnRlcmFrdGl2ZSBPYmpla3QgenVydWVjaywgZmFsbHMKKyAgICAgICAgdm9yaGFuZGVuLCBhbHNvIGRhc2plbmlnZSB3ZWxjaGVzICJkaWUgRW50ZXJ0YXN0ZSBnZWRydWVja3QgaGF0Ii4KKworU0lFSEUgQVVDSAorICAgICAgICB0aGlzX3BsYXllcihFKSwgcHJldmlvdXNfb2JqZWN0KEUpLCBpbnRlcmFjdGl2ZShFKSwgbGl2aW5nKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi90aGlzX29iamVjdCBiL2RvYy9lZnVuL3RoaXNfb2JqZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNjAyNzYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi90aGlzX29iamVjdApAQCAtMCwwICsxLDEwIEBACitTWU5PUFNJUzoKKyAgICAgICAgb2JqZWN0IHRoaXNfb2JqZWN0KHZvaWQpCisKK0RFU0NSSVBUSU9OOgorICAgICAgICBSZXR1cm4gdGhlIG9iamVjdCBwb2ludGVyIGZvciB0aGlzIG9iamVjdC4gVGhpcyBpcyBub3QgdG8gYmUKKyAgICAgICAgY29uZnVzZWQgd2l0aCB0aGUgaW50ZXJuYWwgbmFtZSBvZiBhbiBvYmplY3QsIHdoaWNoIGlzIHVzZWQgYnkKKyAgICAgICAgdGhlIGlkKCkgZnVuY3Rpb24uCisKK1NFRSBBTFNPOgorICAgICAgICB0aGlzX3BsYXllcihFKSwgcHJldmlvdXNfb2JqZWN0KEUpLCBvYmplY3RfbmFtZShFKSwgZmluZF9vYmplY3QoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL3RoaXNfcGxheWVyIGIvZG9jL2VmdW4vdGhpc19wbGF5ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFiNjQyMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL3RoaXNfcGxheWVyCkBAIC0wLDAgKzEsMTggQEAKK1NZTk9QU0lTCisgICAgICAgIG9iamVjdCB0aGlzX3BsYXllcigpOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgTGllZmVydCBkZW4gbW9tZW50YW5lbiBLb21tYW5kb2dlYmVyLiBEYXMga2FubiBlaW4gaW50ZXJha3RpdmVyCisgICAgICAgIEJlbnV0emVyIG9kZXIgZWluIGxlYmVuZGlnZXMgT2JqZWt0IHNlaW4sIHp1bSBCZWlzcGllbCBlaW4gTlBDLgorCisgICAgICAgIFdlbm4gZGllIEZ1bmt0aW9uIHZvbiBpbm5lcmhhbGIgZGVzIGhlYXJ0X2JlYXQoKSBlaW5lcyBuaWNodAorICAgICAgICBsZWJlbmRpZ2VuIE9iamVrdHMgYXVmZ2VydWZlbiB3aXJkLCB3aXJkIDAgenVydWVjayBnZWdlYmVuLgorCitCRUlTUElFTAorICAgICAgICBpZih0aGlzX3BsYXllcigpICE9IHRoaXNfaW50ZXJhY3RpdmUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgd3JpdGUoIkhleSwgamVtYW5kIHp3aW5ndCB1bnMsIEtvbW1hbmRvcyBhdXN6dWZ1ZWhyZW4hXG4iKTsKKyAgICAgICAgfQorCitTSUVIRSBBVUNICisgICAgICAgIHRoaXNfb2JqZWN0KEUpLCBwcmV2aW91c19vYmplY3QoRSksIGludGVyYWN0aXZlKEUpLCBsaXZpbmcoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL3Rocm93IGIvZG9jL2VmdW4vdGhyb3cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEyMWNkZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL3Rocm93CkBAIC0wLDAgKzEsMTYgQEAKK1NZTk9QU0lTCisgICAgICAgIHZvaWQgdGhyb3cobWl4ZWQgYXJnKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIEJyaWNodCBkaWUgUHJvZ3JhbW12ZXJhcmJlaXR1bmcgYWIuIFdlbm4gZGllIFZlcmFyYmVpdHVuZyBtaXQgY2F0Y2goKQorICAgICAgICBnZXN0YXJ0ZXQgd3VyZGUsIGdpYnQgZGllc2VzIGNhdGNoKCkgPGFyZz4gYWxzIEZlaGxlcm1lbGR1bmcgYXVzLgorCisgICAgICAgIERlciBBdWZydWYgdm9uIHRocm93KCkgb2huZSB2b3JoZXJpZ2VzIGNhdGNoKCkgaXN0IHNpbm5sb3MgdW5kCisgICAgICAgIGVyemV1Z3QgZWluZW4gInRocm93IHdpdGhvdXQgY2F0Y2giIEZlaGxlci4KKworQkVJU1BJRUwKKyAgICAgICAgY2F0Y2godGhyb3coIlZlcmFyYmVpdHVuZyBhYmdlYnJvY2hlbiEiKSk7CisgICAgICAgIERhcyBtYWNodCBuaWNodHMgYWxzICJWZXJhcmJlaXR1bmcgYWJnZWJyb2NoZW4hIiBhdXN6dWdlYmVuLgorCitTSUVIRSBBVUNICisgICAgICAgIGNhdGNoKEUpLCByYWlzZV9lcnJvcihFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vdGltZSBiL2RvYy9lZnVuL3RpbWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcwMTZhNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL3RpbWUKQEAgLTAsMCArMSwyMSBAQAorU1lOT1BTSVMKKyAgICAgICAgaW50IHRpbWUoKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIExpZWZlcnQgZGllIEFuemFobCBTZWt1bmRlbiwgZGllIHNlaXQgZGVtIDAxLiBKYW51YXIgMTk3MCwKKyAgICAgICAgMDA6MDA6MDAgR01UIHZlcnN0cmljaGVuIHNpbmQuCisKKyAgICAgICAgRGllIFplaXRhbmdhYmUgYmFzaWVydCBhdWYgZGVyIFN5c3RlbXplaXQgZGVzIEhvc3RzLCBkZXIgRHJpdmVyCisgICAgICAgIHN0ZWxsdCBqZWRvY2ggc2ljaGVyLCBkYXNzIGRhcyBSZXN1bHRhdCB2b24gdGltZSgpIG1vbm90b24gYW5zdGVpZ3QKKyAgICAgICAgKGFsc28gaW1tZXIgbnVyIHp1IGhvZWhlcmVuIFdlcnRlbiB3ZWNoc2VsdCkuCisKKyAgICAgICAgRGFzIFJlc3VsdGF0IHZvbiB0aW1lKCkgdmVyYWVuZGVydCBzaWNoIG5pY2h0IHdhZWhyZW5kIGRlbSBBYmFyYmVpdGVuCisgICAgICAgIGVpbmVzIEtvbW1hbmRvcy4KKworQkVJU1BJRUwKKyAgICAgICAgVW0gZGFzIGFrdHVlbGxlIERhdHVtIHVuZCBkaWUgYWt0dWVsbGUgWmVpdCBhbnp1emVpZ2VuOgorCisgICAgICAgICAgICB3cml0ZShjdGltZSh0aW1lKCkpKyJcbiIpOworCitTSUVIRSBBVUNICisgICAgICAgIGN0aW1lKEUpLCBnbXRpbWUoRSksIGxvY2FsdGltZShFKSwgdXRpbWUoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL3Rsc19hdmFpbGFibGUgYi9kb2MvZWZ1bi90bHNfYXZhaWxhYmxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNGEwM2QKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi90bHNfYXZhaWxhYmxlCkBAIC0wLDAgKzEsMTkgQEAKK1BSRUxJTUlOQVJZCitTWU5PUFNJUworICAgICAgICBpbnQgdGxzX2F2YWlsYWJsZSgpCisKK0RFU0NSSVBUSU9OCisgICAgICAgIElmIHRoZSBnbG9iYWwgVExTIGluaXRpYWxpc2F0aW9uIGNvdWxkIG5vdCBiZWVuIHNldCB1cCwgCisgICAgICAgIHRsc19pc19hdmFpbGFibGUoKSByZXR1cm5zIDAsIG90aGVyd2lzZSAxLgorICAgICAgICBJdCBpcyBub3QgdmVyeSB1c2VmdWwgY2FsbGluZyBhbnkgb3RoZXIgdGxzXyotZWZ1biBpZiB0aGlzIG9uZSAKKyAgICAgICAgcmV0dXJucyAwLCBzaW5jZSB0aGVyZSBpcyBubyBUTFMtZW5jcnlwdGlvbiBhdmFpbGFibGUuCisgICAgICAgIE1vc3QgbGlrZWx5IHRoZSBnbG9iYWwgaW5pdGlhbGlzYXRpb24gZmFpbHMgZHVlIHRvIG1pc3Npbmcgb3IgCisgICAgICAgIHVucmVhZGFibGUga2V5IHJlc3AuIGNlcnRpZmljYXRlLWZpbGUuCisKK0hJU1RPUlkKKyAgICAgICAgSW50cm9kdWNlZCBpbiBMRE11ZCAzLjMuNDc0IGFuZCBmb2xsb3dpbmcsIGJhY2twb3J0ZWQgdG8gMy4yLjExLgorCitTRUUgQUxTTworICAgICAgICB0bHNfaW5pdF9jb25uZWN0aW9uKEUpLCB0bHNfZGVpbml0X2Nvbm5lY3Rpb24oRSksIAorICAgICAgICB0bHNfcXVlcnlfY29ubmVjdGlvbl9zdGF0ZShFKSwgdGxzX3F1ZXJ5X2Nvbm5lY3Rpb25faW5mbyhFKSwKKyAgICAgICAgdGxzX2NoZWNrX2NlcnRpZmljYXRlKEUpLCB0bHNfcmVmcmVzaF9jZXJ0cyhFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vdGxzX2NoZWNrX2NlcnRpZmljYXRlIGIvZG9jL2VmdW4vdGxzX2NoZWNrX2NlcnRpZmljYXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YWZjOGUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi90bHNfY2hlY2tfY2VydGlmaWNhdGUKQEAgLTAsMCArMSw0OSBAQAorUFJFTElNSU5BUlkKK1NZTk9QU0lTCisgICAgICAgIG1peGVkICp0bHNfY2hlY2tfY2VydGlmaWNhdGUob2JqZWN0IG9iaik7CisgICAgICAgIG1peGVkICp0bHNfY2hlY2tfY2VydGlmaWNhdGUob2JqZWN0IG9iaiwgaW50IGV4dHJhKTsKKworREVTQ1JJUFRJT04KKyAgICAgICAgdGxzX2NoZWNrX2NlcnRpZmljYXRlKCkgY2hlY2tzIHRoZSBjZXJ0aWZpY2F0ZSBvZiB0aGUgc2VjdXJlZAorICAgICAgICBjb25uZWN0aW9uIGJvdW5kIHRvIDxvYmo+IChkZWZhdWx0IGlzIHRoZSBjdXJyZW50IG9iamVjdCkuICBJZgorICAgICAgICA8b2JqPiBpcyBub3QgaW50ZXJhY3RpdmUsIG9yIGlmIFRMUyBpcyBub3QgYXZhaWxhYmxlLCBhbiBlcnJvcgorICAgICAgICBpcyB0aHJvd24uCisKKyAgICAgICAgSWYgPG9iaj4gZG9lc24ndCBoYXZlIGEgc2VjdXJlIGNvbm5lY3Rpb24gdXAgYW5kIHJ1bm5pbmcsIGFuCisgICAgICAgIGVycm9yIGlzIHRocm93bi4KKyAgICAgICAgT3RoZXJ3aXNlLCB0aGUgcmVzdWx0IGlzIGFuIGFycmF5IHdpdGggdGhlc2UgdmFsdWVzOgorCisgICAgICAgICAgaW50IFswXSAgICAgIDogUmVzdWx0IGNvZGUgb2YgU1NMX2dldF92ZXJpZnlfcmVzdWx0IChzZWUgbWFuIDEgdmVyaWZ5CisgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2VjdGlvbiBESUFHTk9TVElDUyBmb3IgcG9zc2libGUgdmFsdWVzKQorICAgICAgICAgIGFycmF5IFsxXSAgICA6IGFycmF5IHdpdGggMypuIGVudHJpZXMgb2YgZXh0cmEgeDUwOSBkYXRhLgorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZSBpczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAzKmkgICAgOiBudW1lcmljYWwgZm9ybSBvZiBvYmplY3QgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmcuICIyLjUuNC4zIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMqaSArIDE6IGxvbmcgb3Igc2hvcnQgbmFtZSBpZiBhdmFpbGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nLiAiY29tbW9uTmFtZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAzKmkgKyAyOiB2YWx1ZQorICAgICAgICAgIGFycmF5IFsyXSAgICA6IGlmIGV4dHJhIGlzIHNldDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheSB3aXRoIDMqbiBlbnRyaWVzIG9mIHg1MDkgZXh0ZW5zaW9uIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIHN0cnVjdHVyZSBpczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAzKmkgICAgOiBudW1lcmljYWwgZm9ybSBvZiBleHRlbnNpb24gbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMqaSArIDE6IGxvbmcgb3Igc2hvcnQgbmFtZSBvZiBleHRlbnNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lIGlmIGF2YWlsYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMqaSArIDI6IGFycmF5IG9mIHN0cmluZ3Mgd2l0aCB0aGUgZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZSBvZiBbMV0KKworICAgICAgICBOb3RlOiBhIHg1MDkgY2VydGlmaWNhdGUgY2FuIGhhdmUgbW9yZSB0aGFuIG9uZSBvYmplY3Qgd2l0aAorICAgICAgICB0aGUgc2FtZSBuYW1lCisKK0JVR1MKKyAgICAgICAgTm90IHN1cHBvcnRlZCB3aGVuIHVzaW5nIEdudVRMUy4KKworSElTVE9SWQorICAgICAgICBJbnRyb2R1Y2VkIGluIExETXVkIDMuMy42NzIvMy4yLjExLgorICAgICAgICBMRE11ZCAzLjMuNzExLzMuMi4xMiBtb2RpZmllZCB0aGUgYmVoYXZpb3VyIHRvIHJldHVybiB0aGUKKyAgICAgICAgbG93LWxldmVsIEFQSSByZXN1bHQgdmFsdWUsIGFuZCB0byB0aHJvdyBhbiBlcnJvciBpZiB0aGUgY29ubmVjdGlvbgorICAgICAgICBpcyBub3Qgc2VjdXJlLgorCitTRUUgQUxTTworICAgICAgICB0bHNfaW5pdF9jb25uZWN0aW9uKEUpLCB0bHNfZGVpbml0X2Nvbm5lY3Rpb24oRSksIHRsc19lcnJvcihFKSwKKyAgICAgICAgdGxzX3F1ZXJ5X2Nvbm5lY3Rpb25fc3RhdGUoRSksIHRsc19xdWVyeV9jb25uZWN0aW9uX2luZm8oRSksCisgICAgICAgIHRsc19hdmFpbGFibGUoRSksIHRsc19yZWZyZXNoX2NlcnRzKEUpLCBtdWRsaWIvcHN5Yy10bHMuYwpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vdGxzX2RlaW5pdF9jb25uZWN0aW9uIGIvZG9jL2VmdW4vdGxzX2RlaW5pdF9jb25uZWN0aW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ODM4MDEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi90bHNfZGVpbml0X2Nvbm5lY3Rpb24KQEAgLTAsMCArMSwyMCBAQAorUFJFTElNSU5BUlkKK1NZTk9QU0lTCisgICAgICAgIHZvaWQgdGxzX2RlaW5pdF9jb25uZWN0aW9uKG9iamVjdCBvYikKKworREVTQ1JJUFRJT04KKyAgICAgICAgdGxzX2RlaW5pdF9jb25uZWN0aW9uKCkgc2h1dHMgZG93biBhIFRMUyBjb25uZWN0aW9uIHRvCisgICAgICAgIHRoZSBpbnRlcmFjdGl2ZSBvYmplY3QgPG9iPiAob3IgdGhpc19vYmplY3QoKSBpZiA8b2I+IGlzIG5vdAorICAgICAgICBnaXZlbikgYnV0IHRoZSBjb25uZWN0aW9uIGlzIG5vdCBjbG9zZWQuCisKKyAgICAgICAgVW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMgdGhlcmUgaXMgbm8gbmVlZCB0byB1c2UgdGhpcyBlZnVuOiBtb3N0CisgICAgICAgIGNsaWVudHMgb3BlcmF0ZSBpbiBlaXRoZXIgc2VjdXJlIG9yIHVuc2VjdXJlIG1vZGUsIGJ1dCBkb24ndCBhbGxvdworICAgICAgICBzd2l0Y2hpbmcgY29ubmVjdGlvbiBzZWN1cml0eSBvbiB0aGUgZmx5LgorCitISVNUT1JZCisgICAgICAgIEludHJvZHVjZWQgaW4gTERNdWQgMy4zLjQ3NCBhbmQgZm9sbG93aW5nLCBiYWNrcG9ydGVkIHRvIDMuMi4xMS4KKworU0VFIEFMU08KKyAgICAgICAgdGxzX2luaXRfY29ubmVjdGlvbihFKSwgdGxzX2Vycm9yKEUpLCB0bHNfcXVlcnlfY29ubmVjdGlvbl9zdGF0ZShFKSwKKyAgICAgICAgdGxzX3F1ZXJ5X2Nvbm5lY3Rpb25faW5mbyhFKSwgdGxzX2F2YWlsYWJsZShFKSwKKyAgICAgICAgdGxzX2NoZWNrX2NlcnRpZmljYXRlKEUpLCB0bHNfcmVmcmVzaF9jZXJ0cyhFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vdGxzX2Vycm9yIGIvZG9jL2VmdW4vdGxzX2Vycm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNWM3ODgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi90bHNfZXJyb3IKQEAgLTAsMCArMSwxNSBAQAorUFJFTElNSU5BUlkKK1NZTk9QU0lTCisgICAgICAgIHN0cmluZyB0bHNfZXJyb3IoaW50IGVycm9ybm8pCisKK0RFU0NSSVBUSU9OCisgICAgICAgIHRsc19lcnJvcigpIHJldHVybnMgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZXJyb3IgYmVoaW5kIHRoZQorICAgICAgICBlcnJvciBudW1iZXIgZXJyb3Juby4KKworSElTVE9SWQorICAgICAgICBJbnRyb2R1Y2VkIGluIExETXVkIDMuMy40NzQgYW5kIGZvbGxvd2luZywgYmFja3BvcnRlZCB0byAzLjIuMTEuCisKK1NFRSBBTFNPCisgICAgICAgIHRsc19pbml0X2Nvbm5lY3Rpb24oRSksIHRsc19kZWluaXRfY29ubmVjdGlvbihFKSwgCisgICAgICAgIHRsc19xdWVyeV9jb25uZWN0aW9uX3N0YXRlKEUpLCB0bHNfcXVlcnlfY29ubmVjdGlvbl9pbmZvKEUpLAorICAgICAgICB0bHNfYXZhaWxhYmxlKEUpLCB0bHNfY2hlY2tfY2VydGlmaWNhdGUoRSksIHRsc19yZWZyZXNoX2NlcnRzKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi90bHNfaW5pdF9jb25uZWN0aW9uIGIvZG9jL2VmdW4vdGxzX2luaXRfY29ubmVjdGlvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzNhZmFlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vdGxzX2luaXRfY29ubmVjdGlvbgpAQCAtMCwwICsxLDUwIEBACitQUkVMSU1JTkFSWQorU1lOT1BTSVMKKyAgICAgICAgaW50IHRsc19pbml0X2Nvbm5lY3Rpb24ob2JqZWN0IG9iKQorICAgICAgICBpbnQgdGxzX2luaXRfY29ubmVjdGlvbihvYmplY3Qgb2IsIHN0cmluZyBmdW4sIHN0cmluZ3xvYmplY3QgZm9iLCBtaXhlZCBleHRyYS4uLikKKyAgICAgICAgaW50IHRsc19pbml0X2Nvbm5lY3Rpb24ob2JqZWN0IG9iLCBjbG9zdXJlIGZ1biwgbWl4ZWQgZXh0cmEuLi4pCisKK0RFU0NSSVBUSU9OCisgICAgICAgIHRsc19pbml0X2Nvbm5lY3Rpb24oKSB0cmllcyB0byBzdGFydCBhIFRMUyBzZWN1cmVkIGNvbm5lY3Rpb24gdG8gCisgICAgICAgIHRoZSBpbnRlcmFjdGl2ZSBvYmplY3QgPG9iPiAob3IgdGhpc19vYmplY3QoKSBpZiA8b2I+IGlzIG5vdCBnaXZlbikuCisKKyAgICAgICAgUmVzdWx0OgorICAgICAgICAgIGVycm9yY29kZSA8IDA6IHVuc3VjY2Vzc2Z1bCwgdXNlIHRsc19lcnJvcigpIHRvIGdldCBhbiB1c2VmdWwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3IKKyAgICAgICAgICAgICBudW1iZXIgPiAwOiB0aGUgc2VjdXJlIGNvbm5lY3Rpb24gaXMgc3RpbGwgYmVpbmcgc2V0IHVwIGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kCisgICAgICAgICAgICBudW1iZXIgPT0gMDogdGhlIHNlY3VyZSBjb25uZWN0aW9uIGlzIGFjdGl2ZS4KKyAgICAgICAgCisgICAgICAgIE9wZW5TU0wgb25seToKKworICAgICAgICAgICAgSWYgdGhlIGNhbGxiYWNrIDxmdW4+LzxmdW4+Ojxmb2I+IGlzIHNwZWNpZmllZCwgaXQgd2lsbCBiZSBjYWxsZWQKKyAgICAgICAgICAgIG9uY2UgdGhlIGZhdGUgb2YgdGhlIHNlY3VyZSBjb25uZWN0aW9uIGhhcyBiZWVuIGRldGVybWluZWQuIFRoZQorICAgICAgICAgICAgZmlyc3QgYXJndW1lbnQgd2lsbCBiZSB0aGUgcmV0dXJuIGNvZGUgZnJvbSB0aGUgaGFuZHNoYWtlCisgICAgICAgICAgICAoZXJyb3Jjb2RlIDwgMCBvbiBmYWlsdXJlLCBvciAwIG9uIHN1Y2Nlc3MpLCBmb2xsb3dlZCBieSB0aGUKKyAgICAgICAgICAgIGludGVyYWN0aXZlIG9iamVjdCA8b2I+IGFuZCBhbnkgPGV4dHJhPiBhcmd1bWVudHMuCisKKyAgICAgICAgSWYgdGhlIFRMUyBzZXR1cCBmYWlscywgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjYWxsCisgICAgICAgIHRsc19kZWluaXRfY29ubmVjdGlvbigpLgorCisgICAgICAgIElNUE9SVEFOVDogRHVyaW5nIHRoZSBUTFMgaGFuZHNoYWtlIG5vdGhpbmcgZWxzZSBtdXN0IGJlIHNlbnQKKyAgICAgICAgdG8gdGhlIGNsaWVudCEgRm9yIHRoZSBtb3N0IGNhc2VzIChUTFMtY2FwYWJsZSBjbGllbnRzIGxvZ2dpbmcgaW4pCisgICAgICAgIHRoaXMgbWVhbnMgdGhhdCB0aGUgVExTIGhhbmRzaGFrZSBpcyB0aGUgZmlyc3QgYW5kIG9ubHkgdGhpbmcgdGhlCisgICAgICAgIGNsaWVudCBnZXRzIHRvIHNlZSB3aGlsZSB0aGUgaGFuZHNoYWtlIGlzIGluIHByb2dyZXNzLgorCisgICAgICAgIFRoZSBkcml2ZXIgYXV0b21hdGljYWxseSBzdXBwcmVzc2VzIHRoZSBwcmludGluZyBvZiB0aGUgcHJvbXB0CisgICAgICAgIHdoaWxlIHRoZSBUTFMgaGFuZHNoYWtlIGlzIGluIHByb2dyZXNzLgorCisgICAgICAgIElmIHRsc19pbml0X2Nvbm5lY3Rpb24oKSBpcyBjYWxsZWQgaW4gdGhlIG1hc3Rlcjo6Y29ubmVjdCgpIGZ1bmN0aW9uLAorICAgICAgICB0aGUgZHJpdmVyIHdpbGwgZWl0aGVyIGNhbGwgdGhlIHNldCBjYWxsYmFjayBpbiBwbGFjZSBvZiBsb2dvbigpLCBvcgorICAgICAgICBpZiBub3QgY2FsbGJhY2sgaGFzIGJlZW4gc2V0LCBkZWxheSB0aGUgY2FsbCBvZiBsb2dvbigpIHVudGlsIHRoZQorICAgICAgICBzdGF0ZSBvZiB0aGUgY29ubmVjdGlvbiBpcyBjbGVhci4KKworSElTVE9SWQorICAgICAgICBJbnRyb2R1Y2VkIGluIExETXVkIDMuMy40NzQgYW5kIGZvbGxvd2luZywgYmFja3BvcnRlZCB0byAzLjIuMTEuCisgICAgICAgIExETXVkIDMuMi4xMy8zLjMuNzEzIHN0cmVhbWxpbmVkIHRoZSBoYW5kbGluZyBvZiBzZWN1cmUgY29ubmVjdGlvbnMKKyAgICAgICAgZHVyaW5nIGxvZ29uLgorCitTRUUgQUxTTworICAgICAgICB0bHNfZGVpbml0X2Nvbm5lY3Rpb24oRSksIHRsc19lcnJvcihFKSwgdGxzX3F1ZXJ5X2Nvbm5lY3Rpb25fc3RhdGUoRSksCisgICAgICAgIHRsc19xdWVyeV9jb25uZWN0aW9uX2luZm8oRSksIHRsc19hdmFpbGFibGUoRSksCisgICAgICAgIHRsc19jaGVja19jZXJ0aWZpY2F0ZShFKSwgdGxzX3JlZnJlc2hfY2VydHMoRSksIGNvbm5lY3QoTSksIGxvZ29uKEEpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi90bHNfcXVlcnlfY29ubmVjdGlvbl9pbmZvIGIvZG9jL2VmdW4vdGxzX3F1ZXJ5X2Nvbm5lY3Rpb25faW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmFlZWY3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vdGxzX3F1ZXJ5X2Nvbm5lY3Rpb25faW5mbwpAQCAtMCwwICsxLDM3IEBACitQUkVMSU1JTkFSWQorU1lOT1BTSVMKKyAgICAgICAgI2luY2x1ZGUgPHN5cy8gdGxzLmg+CisgICAgICAgIGludCAqdGxzX3F1ZXJ5X2Nvbm5lY3Rpb25faW5mbyAob2JqZWN0IG9iKQorCitERVNDUklQVElPTgorICAgICAgICBJZiA8b2I+IGRvZXMgbm90IGhhdmUgYSBUTFMgY29ubmVjdGlvbiBvciBpZiB0aGUgY29ubmVjdGlvbgorICAgICAgICBpcyBzdGlsbCBiZWluZyBzZXQtdXAsIG9yIGlmIDxvYj4gaXMgbm90IGludGVyYWN0aXZlLCB0aGUgZWZ1bgorICAgICAgICByZXR1cm5zIDAuCisKKyAgICAgICAgSWYgPG9iPiBoYXMgYSBUTFMgY29ubmVjdGlvbiwgdGxzX3F1ZXJ5X2Nvbm5lY3Rpb25faW5mbygpCisgICAgICAgIHJldHVybnMgYW4gYXJyYXkgdGhhdCBjb250YWlucyBzb21lIHBhcmFtZXRlcnMgb2YgPG9iPidzCisgICAgICAgIGNvbm5lY3Rpb246CisKKyAgICAgICAgICBpbnR8c3RyaW5nIFtUTFNfQ0lQSEVSXTogdGhlIGNpcGhlciB1c2VkCisgICAgICAgICAgaW50ICAgICAgICBbVExTX0NPTVBdOiAgIHRoZSBjb21wcmVzc2lvbiB1c2VkCisgICAgICAgICAgaW50ICAgICAgICBbVExTX0tYXTogICAgIHRoZSBrZXktZXhjaGFuZ2UgdXNlZAorICAgICAgICAgIGludCAgICAgICAgW1RMU19NQUNdOiAgICB0aGUgZGlnZXN0IGFsZ29yaXRobSB1c2VkCisgICAgICAgICAgaW50fHN0cmluZyBbVExTX1BST1RdOiAgIHRoZSBwcm90b2NvbCB1c2VkCisKKyAgICAgICAgVG8gdHJhbnNsYXRlIHRoZXNlIG51bWJlcnMgaW50byBzdHJpbmdzLCA8dGxzLmg+IG9mZmVycyBhCisgICAgICAgIG51bWJlciBvZiBtYWNyb3M6CisKKyAgICAgICAgICBUTFNfeHh4X1RBQkxFOiBhIGxpdGVyYWwgYXJyYXkgb2Ygc3RyaW5ncyBkZXNjcmliaW5nIHRoZQorICAgICAgICAgICAgdmFsdWUgaW4gcXVlc3Rpb24uCisgICAgICAgICAgVExTX3h4eF9OQU1FKHgpOiBhIG1hY3JvIHRyYW5zbGF0aW5nIHRoZSBudW1lcmljIHJlc3VsdAorICAgICAgICAgICAgdmFsdWUgaW50byBhIHN0cmluZy4KKworICAgICAgICAgIHh4eDogQ0lQSEVSLCBDT01QLCBLWCwgTUFDLCBQUk9UCisKK0hJU1RPUlkKKyAgICAgICAgSW50cm9kdWNlZCBpbiBMRE11ZCAzLjMuNDc0IGFuZCBmb2xsb3dpbmcsIGJhY2twb3J0ZWQgdG8gMy4yLjExLgorCitTRUUgQUxTTworCXRsc19pbml0X2Nvbm5lY3Rpb24oRSksIHRsc19kZWluaXRfY29ubmVjdGlvbihFKSwgdGxzX2Vycm9yKEUpLAorCXRsc19xdWVyeV9jb25uZWN0aW9uX3N0YXRlKEUpLCB0bHNfYXZhaWxhYmxlKEUpLAorICAgICAgICB0bHNfY2hlY2tfY2VydGlmaWNhdGUoRSksIHRsc19yZWZyZXNoX2NlcnRzKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi90bHNfcXVlcnlfY29ubmVjdGlvbl9zdGF0ZSBiL2RvYy9lZnVuL3Rsc19xdWVyeV9jb25uZWN0aW9uX3N0YXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MjRmMjAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi90bHNfcXVlcnlfY29ubmVjdGlvbl9zdGF0ZQpAQCAtMCwwICsxLDE2IEBACitQUkVMSU1JTkFSWQorU1lOT1BTSVMKKyAgICAgICAgaW50IHRsc19xdWVyeV9jb25uZWN0aW9uX3N0YXRlKG9iamVjdCBvYikKKworREVTQ1JJUFRJT04KKyAgICAgICAgdGxzX3F1ZXJ5X2Nvbm5lY3Rpb25fc3RhdGUoKSByZXR1cm5zIGEgcG9zaXRpdmUgbnVtYmVyIGlmIDxvYj4ncworICAgICAgICBjb25uZWN0aW9uIGlzIFRMUyBzZWN1cmVkLCAwIGlmIGl0J3MgdW5zZWN1cmVkLCBhbmQgYSBuZWdhdGl2ZSBudW1iZXIKKyAgICAgICAgaWYgdGhlIFRMUyBjb25uZWN0aW9uIHNldHVwIGlzIHN0aWxsIGJlaW5nIHNldC11cC4KKworSElTVE9SWQorICAgICAgICBJbnRyb2R1Y2VkIGluIExETXVkIDMuMy40NzQgYW5kIGZvbGxvd2luZywgYmFja3BvcnRlZCB0byAzLjIuMTEuCisKK1NFRSBBTFNPCisJdGxzX2luaXRfY29ubmVjdGlvbihFKSwgdGxzX2RlaW5pdF9jb25uZWN0aW9uKEUpLCB0bHNfZXJyb3IoRSksIAorCXRsc19xdWVyeV9jb25uZWN0aW9uX2luZm8oRSksIHRsc19hdmFpbGFibGUoRSksCisgICAgICAgIHRsc19jaGVja19jZXJ0aWZpY2F0ZShFKSwgdGxzX3JlZnJlc2hfY2VydHMoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL3Rsc19yZWZyZXNoX2NlcnRzIGIvZG9jL2VmdW4vdGxzX3JlZnJlc2hfY2VydHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgzNjRjNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL3Rsc19yZWZyZXNoX2NlcnRzCkBAIC0wLDAgKzEsMTcgQEAKK1BSRUxJTUlOQVJZCitTWU5PUFNJUworICAgICAgICB2b2lkIHRsc19yZWZyZXNoX2NlcnRzKCkKKworREVTQ1JJUFRJT04KKyAgICAgICAgUmVsb2FkIHRoZSBjZXJ0aWZpY2F0ZXMgYW5kIGNlcnRpZmljYXRlIHJldm9jYXRpb24gaW5mb3JtYXRpb24uCisKK0JVR1MKKyAgICAgICAgTm90IHN1cHBvcnRlZCB3aGVuIHVzaW5nIEdudVRMUy4KKworSElTVE9SWQorICAgICAgICBJbnRyb2R1Y2VkIGluIExETXVkIDMuMy43MTQvMy4yLjE1LgorCitTRUUgQUxTTworICAgICAgICB0bHNfaW5pdF9jb25uZWN0aW9uKEUpLCB0bHNfZGVpbml0X2Nvbm5lY3Rpb24oRSksIHRsc19lcnJvcihFKSwKKyAgICAgICAgdGxzX3F1ZXJ5X2Nvbm5lY3Rpb25fc3RhdGUoRSksIHRsc19xdWVyeV9jb25uZWN0aW9uX2luZm8oRSksCisgICAgICAgIHRsc19hdmFpbGFibGUoRSksIHRsc19jaGVja19jZXJ0aWZpY2F0ZShFKSwgbXVkbGliL3BzeWMtdGxzLmMKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL3RvX2FycmF5IGIvZG9jL2VmdW4vdG9fYXJyYXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFiMWE5MwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL3RvX2FycmF5CkBAIC0wLDAgKzEsMzAgQEAKK1NZTk9QU0lTCisgICAgICAgIG1peGVkICp0b19hcnJheShzdHJpbmcgYXJnKTsKKyAgICAgICAgbWl4ZWQgKnRvX2FycmF5KHN5bWJvbCBhcmcpOworICAgICAgICBtaXhlZCAqdG9fYXJyYXkocXVvdGVkYXJyYXkgYXJyKTsKKyAgICAgICAgbWl4ZWQgKnRvX2FycmF5KG1peGVkICphcmcpOworICAgICAgICBtaXhlZCAqdG9fYXJyYXkoc3RydWN0KTsKKworICAgICAgICAoaW50Kik8dmFsdWU+CisKK0JFU0NIUkVJQlVORworICAgICAgICBTdHJpbmdzIHVuZCBTeW1ib2xlIHdlcmRlbiB1bWdld2FuZGVsdCBpbiBlaW4gSW50ZWdlci1BcnJheSwgZGFzIGF1cworICAgICAgICBkZW4gWmVpY2hlbiB2b24gPGFyZz4gYmVzdGVodC4KKworICAgICAgICBHZXF1b3RldGUgQXJyYXlzIHdlcmRlbiAiZW50cXVvdGV0IiwgdW5kIEFycmF5cyBibGVpYmVuLCB3aWUgc2llIHNpbmQuCisKKyAgICAgICAgU3RydWN0cyB3ZXJkZW4gaW4gbm9ybWFsZSBBcnJheXMgdW1nZXdhbmRlbHQuCisKK0JFSVNQSUVMRToKKyAgICAgICAgdG9fYXJyYXkoIjEyIikgbGllZmVydCAoezMzLDM0fSkuCisKK0JVR1MKKyAgICAgICAgRGllIENhc3QtU2NocmVpYndlaXNlIGZ1bmt0aW9uaWVydCBudXIsIHdlbm4gZGVyIGdlbmF1ZSBXZXJ0IHZvbgorICAgICAgICA8dmFsdWU+IHp1bSBaZWl0cHVua3QgZGVyIEtvbXBpbGllcnVuZyBiZWthbm50IGlzdC4gRGllcyB3aXJkCisgICAgICAgIG5pY2h0IGdlYWVuZGVydCB3ZXJkZW4sIGRhIGRpZSBGdW5rdGlvbnNmb3JtIHZlcndlbmRldCB3ZXJkZW4ga2Fubi4KKworSElTVE9SWQorICAgICAgICBMRE11ZCAzLjMuMjUwIGFkZGVkIHN0cnVjdHMgdG8gdGhlIGFjY2VwdGVkIGRhdGEgdHlwZXMuCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgdG9faW50KEUpLCB0b19zdHJpbmcoRSksIHRvX3N0cnVjdChFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vdG9fZmxvYXQgYi9kb2MvZWZ1bi90b19mbG9hdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yjk4OWNlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vdG9fZmxvYXQKQEAgLTAsMCArMSwxOSBAQAorU1lOT1BTSVMKKyAgICAgICAgZmxvYXQgdG9fZmxvYXQoaW50IGFyZyk7CisgICAgICAgIGZsb2F0IHRvX2Zsb2F0KHN0cmluZyBhcmcpOworICAgICAgICBmbG9hdCB0b19mbGFvdChmbG9hdCBhcmcpOworCisgICAgICAgIChmbG9hdCk8dmFsdWU+CisKK0JFU0NIUkVJQlVORworICAgICAgICBJbnRlZ2VycyB3ZXJkZW4genUgRmxvYXRzIGVyd2VpdGVydCwgU3RyaW5ncyB3ZXJkZW4gaW4gRmxvYXRzCisgICAgICAgIGtvbnZlcnRpZXJ0IGJpcyB6dW0gZXJzdGVuIFplaWNoZW4sIGRhcyBuaWNodCBtZWhyIHp1bSBGbG9hdAorICAgICAgICBnZWhvZXJ0LiBGbG9hdHMgd2VyZGVuIGRpcmVrdCB6dXJ1ZWNrIGdlZ2ViZW4uCisKK0JVR1MKKyAgICAgICAgRGllIENhc3QtU2NocmVpYndlaXNlIGZ1bmt0aW9uaWVydCBudXIsIHdlbm4gZGVyIGdlbmF1ZSBXZXJ0IHZvbgorICAgICAgICA8dmFsdWU+IHp1bSBaZWl0cHVua3QgZGVyIEtvbXBpbGllcnVuZyBiZWthbm50IGlzdC4gRGllcyB3aXJkIG5pY2h0CisgICAgICAgIGdlYWVuZGVydCB3ZXJkZW4sIGRhIGRpZSBGdW5rdGlvbnNmb3JtIHZlcndlbmRldCB3ZXJkZW4ga2Fubi4KKworU0lFSEUgQVVDSAorICAgICAgICB0b19zdHJpbmcoRSksIHRvX2ludChFKSwgc3NjYW5mKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi90b19pbnQgYi9kb2MvZWZ1bi90b19pbnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM2NDhlNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL3RvX2ludApAQCAtMCwwICsxLDMyIEBACitTWU5PUFNJUworICAgICAgICBpbnQgdG9faW50KHN0cmluZyBhcmcpOworICAgICAgICBpbnQgdG9faW50KGZsb2F0IGFyZyk7CisgICAgICAgIGludCB0b19pbnQoaW50IGFyZyk7CisgICAgICAgIGludCB0b19pbnQoY2xvc3VyZSBhcmcpOworCisgICAgICAgIChpbnQpPHZhbHVlPgorCitCRVNDSFJFSUJVTkcKKyAgICAgICAgQmVpIEZsb2F0cyB3ZXJkZW4gZGllIE5hY2hrb21tYXN0ZWxsZW4gYWJnZXNjaG5pdHRlbiwgU3RyaW5ncyBtaXQKKyAgICAgICAgWmlmZmVybiBhbSBBbmZhbmcgd2VyZGVuIGJpcyB6dW0gZXJzdGVuIE5pY2h0LVppZmZlcm4tWmVpY2hlbiBpbgorICAgICAgICBJbnRlZ2VycyB1bWdld2FuZGVsdC4gTGZ1bi1DbG9zdXJlcyB3ZXJkZW4gaW4gaWhyZW4gRnVua3Rpb25zaW5kZXgKKyAgICAgICAga29udmVydGllcnQsIFZhcmlhYmxlbi1DbG9zdXJlcyBpbiBpaHJlbiBWYXJpYWJsZW5pbmRleC4gSW50ZWdlcnMKKyAgICAgICAgd2VyZGVuIHVudmVyYWVuZGVydCB6dXJ1ZWNrIGdlZ2ViZW4uCisKKyAgICAgICAgQmV6dWVnbGljaCBGbG9hdHMgaXN0IGVzIHdpY2h0aWcsIFJ1bmR1bmdzZWZmZWt0ZSB6dSBiZWFjaHRlbjoKKyAgICAgICAgdG9faW50KDMuMSoxMC4wKSBlcmdpYnQgbmljaHQgMzEsIHNvbmRlcm4gMzAsIHdlaWwgaW50ZXJuIGRhcworICAgICAgICBSZXN1bHRhdCBkZXIgTXVsdGlwbGlrYXRpb24gMzAuOTk5OTk5IGVyZ2lidC4KKyAgICAgCisgICAgICAgIERpZXNlIEZ1bmt0aW9uIHVudGVyc3R1ZXR6dCBkaWUgQmFzaXNwcmVmaXhlICcweCcsICcwbycgdW5kICcwYicuCisKK0JVR1MKKyAgICAgICAgRGllIENhc3QtU2NocmVpYndlaXNlIGZ1bmt0aW9uaWVydCBudXIsIHdlbm4gZGVyIGdlbmF1ZSBXZXJ0IHZvbgorICAgICAgICA8dmFsdWU+IHp1bSBaZWl0cHVua3QgZGVyIEtvbXBpbGllcnVuZyBiZWthbm50IGlzdC4gRGllcyB3aXJkCisgICAgICAgIG5pY2h0IGdlYWVuZGVydCB3ZXJkZW4sIGRhIGRpZSBGdW5rdGlvbnNmb3JtIHZlcndlbmRldCB3ZXJkZW4ga2Fubi4KKworQUVOREVSVU5HRU4KKyAgICAgICAgRWluZ2VmdWVocnQgaW4gMy4yLjFAMgorICAgICAgICBMRE11ZCAzLjIuMTEgZnVlaHJ0ZSBkaWUgQmFzaXNwcmVmaXhlIGVpbi4KKworU0lFSEUgQVVDSAorICAgICAgICB0b19zdHJpbmcoRSksIHNzY2FuZihFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vdG9fb2JqZWN0IGIvZG9jL2VmdW4vdG9fb2JqZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNTc3ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi90b19vYmplY3QKQEAgLTAsMCArMSwxNSBAQAorU1lOT1BTSVMKKwlvYmplY3QgdG9fb2JqZWN0KHN0cmluZyBhcmcpCisJb2JqZWN0IHRvX29iamVjdChjbG9zdXJlIGFyZykKKwlvYmplY3QgdG9fb2JqZWN0KG9iamVjdCBhcmcpCisKK0RFU0NSSVBUSU9OCisJVGhlIGFyZ3VtZW50IGlzIGNvbnZlcnRlZCBpbnRvIGFuIG9iamVjdCwgaWYgcG9zc2libGUuCisJRm9yIHN0cmluZ3MsIHRoZSBvYmplY3Qgd2l0aCBhIG1hdGNoaW5nIG9iamVjdF9uYW1lKCkgaXMKKwlyZXR1cm5lZCwgb3IgMCBpZiB0aGVyZSBpcyBub25lLCBhcyBmaW5kX29iamVjdCgpIGRvZXMuCisJRm9yIChib3VuZCEpIGNsb3N1cmVzLCB0aGUgb2JqZWN0IGhvbGRpbmcgdGhlIGNsb3N1cmUgaXMKKwlyZXR1cm5lZC4KKwlPYmplY3RzIGFuZCB0aGUgbnVtYmVyIDAgcmV0dXJuIHRoZW1zZWx2ZXMuCisKK1NFRSBBTFNPCisJZmluZF9vYmplY3QoRSksIHRvX2FycmF5KEUpLCB0b19pbnQoRSksIHRvX3N0cmluZyhFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vdG9fc3RyaW5nIGIvZG9jL2VmdW4vdG9fc3RyaW5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMjNlZjYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi90b19zdHJpbmcKQEAgLTAsMCArMSwyOSBAQAorU1lOT1BTSVMKKyAgICAgICAgc3RyaW5nIHRvX3N0cmluZyhtaXhlZCBhcmcpCisKK0JFU0NIUkVJQlVORworICAgICAgICA8YXJnPiB3aXJkIGluIGVpbmVuIFN0cmluZyB1bWdld2FuZGVsdC4gRGFzIGtsYXBwdCBtaXQgV2VydGVuIHZvbSBUeXAKKyAgICAgICAgaW50LCBmbG9hdCwgb2JqZWN0LCBhcnJheSwgc3RydWN0LCBzeW1ib2wsIHN0cmluZyBvZGVyIGNsb3N1cmUuCisKKyAgICAgICAgQ2xvc3VyZXMgd2VyZGVuIGluIGVpbmVuIHBhc3NlbmRlbiBOYW1lbiB1bWdld2FuZGVsdCAodm9yd2llZ2VuZCBmdWVyCisgICAgICAgIERlYnVnZ2luZy1ad2Vja2UgZ2VlaWduZXQpLgorCitBTk1FUktVTkdFTgorICAgICAgICBBcnJheXMgd2VyZGVuIGFscyAiZXhwbG9kZXRlIiBTdHJpbmdzIGJldHJhY2h0ZXQsIGFsc28gQXJyYXlzIHZvbgorICAgICAgICBaZWljaGVuY29kZXMuIFNpZSB3ZXJkZW4gYmlzIHp1ciBlcnN0ZW4gMCBvZGVyIGJpcyB6dW0gZXJzdGVuCisgICAgICAgIG5pY2h0LW51bWVyaXNjaGVuIEVpbnRyYWcgImltcGxvZGV0IiwgamUgbmFjaGRlbSwgd2FzIHp1ZXJzdCBlaW50cml0dC4KKworICAgICAgICBEYXMgYmVkZXV0ZXQsIGRhc3MgdG9fc3RyaW5nKCAoeyA0OSwgNTAgfSkgKTsgIjEyIiBsaWVmZXJ0LCB1bmQgbmljaHQKKyAgICAgICAgIih7IDQ5LCA1MCB9KSIKKworRkVITEVSCisgICAgICAgIERpZSBDYXN0LVNjaHJlaWJ3ZWlzZSBmdW5rdGlvbmllcnQgbnVyLCB3ZW5uIGRlciBnZW5hdWUgV2VydCB2b24KKyAgICAgICAgPHZhbHVlPiB6dW0gWmVpdHB1bmt0IGRlciBLb21waWxpZXJ1bmcgYmVrYW5udCBpc3QuIERpZXMgd2lyZCBuaWNodAorICAgICAgICBnZWFlbmRlcnQgd2VyZGVuLCBkYSBkaWUgRnVua3Rpb25zZm9ybSB2ZXJ3ZW5kZXQgd2VyZGVuIGthbm4uCisKK0dFU0NISUNIVEUKKyAgICAgICAgTERNdWQgMy4yLjggbGFlc3N0IExhbWJkYWNsb3N1cmVzIGFscyBndWVsdGlnZSBEYXRlbnR5cGVuIHp1LgorICAgICAgICBMRE11ZCAzLjMuMjUwIGxhZXNzdCBzdHJ1Y3RzIGFscyBndWVsdGlnZSBEYXRlbnR5cGVuIHp1LgorCitTSUVIRSBBVUNICisgICAgICAgIHRvX2FycmF5KEUpLCB0b19pbnQoRSksIHRvX29iamVjdChFKSwgdG9fc3RydWN0KEUpLCBzcHJpbnRmKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi90b19zdHJ1Y3QgYi9kb2MvZWZ1bi90b19zdHJ1Y3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTViMGJmYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL3RvX3N0cnVjdApAQCAtMCwwICsxLDQ3IEBACitTWU5PUFNJUworICAgICAgICBtaXhlZCB0b19zdHJ1Y3QobWl4ZWQgKnxtYXBwaW5nIGRhdGEpCisgICAgICAgIG1peGVkIHRvX3N0cnVjdChtaXhlZCAqfG1hcHBpbmcgZGF0YSwgc3RydWN0IHRlbXBsYXRlKQorICAgICAgICBtaXhlZCB0b19zdHJ1Y3Qoc3RydWN0IGRhdGEpCisgICAgICAgIG1peGVkIHRvX3N0cnVjdChzdHJ1Y3QgZGF0YSwgc3RydWN0IHRlbXBsYXRlKQorCitERVNDUklQVElPTgorICAgICAgICBUaGUgZ2l2ZW4gYXJyYXksIG1hcHBpbmcgb3Igc3RydWN0IDxkYXRhPiBpcyByZXR1cm5lZCBhcyBhIHN0cnVjdC4KKyAgICAgICAgSWYgYSA8dGVtcGxhdGU+IHN0cnVjdCBpcyBnaXZlbiwgdGhlIHJldHVybmVkIHN0cnVjdCBpcyBvZiB0aGUgc2FtZQorICAgICAgICB0eXBlLiBXaXRob3V0IGEgdGVtcGxhdGUsIGFuIGFub255bW91cyBzdHJ1Y3QgaXMgcmV0dXJuZWQgaW4gY2FzZSBvZgorICAgICAgICBhcnJheXMgYW5kIG1hcHBpbmdzIGFuZCBpbiBjYXNlIG9mIHN0cnVjdHMgPGRhdGE+IGlzIHJldHVybmVkCisgICAgICAgIHVuY2hhbmdlZC4KKworICAgICAgICBJZiA8ZGF0YT4gaXMgYW4gYXJyYXksIGl0cyBlbGVtZW50cyBhcmUgYXNzaWduZWQgaW4gb3JkZXIgdG8gdGhlCisgICAgICAgIHJlc3VsdGluZyBzdHJ1Y3QuIEZvciBhbiBhbm9ueW1vdXMgc3RydWN0LCBhbGwgZWxlbWVudHMgb2YgPGRhdGE+CisgICAgICAgIGFyZSBhc3NpZ25lZCwgZm9yIGEgdGVtcGxhdGVkIHN0cnVjdCBvbmx5IGFzIG1hbnkgYXMgZml0IGludG8KKyAgICAgICAgdGhlIHN0cnVjdC4KKworICAgICAgICBJZiA8ZGF0YT4gaXMgYSBtYXBwaW5nIGFuZCBubyB0ZW1wbGF0ZSBpcyBnaXZlbiwgdGhlIHJlc3VsdGluZworICAgICAgICBhbm9ueW1vdXMgc3RydWN0IGNvbnRhaW5zIGFsbCBlbGVtZW50cyBmcm9tIDxkYXRhPiB3aXRoIGEgc3RyaW5nCisgICAgICAgIGtleTsgdGhlIGtleSBuYW1lIGlzIHVzZWQgYXMgc3RydWN0IG1lbWJlciBuYW1lLgorCisgICAgICAgIElmIDxkYXRhPiBpcyBhIG1hcHBpbmcgYW5kIGEgdGVtcGxhdGUgaXMgZ2l2ZW4sIHRoZSBzdHJ1Y3QKKyAgICAgICAgbWVtYmVyIG5hbWVzIGFyZSB1c2VkIGFzIGtleXMgZm9yIGxvb2t1cHMgaW4gPGRhdGE+OyB0aGUgZm91bmQKKyAgICAgICAgZGF0YSBpcyBhc3NpZ25lZCB0byB0aGUgc3RydWN0IG1lbWJlcnMuCisKKyAgICAgICAgSWYgPGRhdGE+IGlzIGEgc3RydWN0IGFuZCBhIHRlbXBsYXRlIGlzIGdpdmVuLCBhIHN0cnVjdCBvZiB0aGUgdHlwZQorICAgICAgICBvZiB0ZW1wbGF0ZSBpcyBjcmVhdGVkIGFuZCBhbGwgbWVtYmVycyBmcm9tIDxkYXRhPiBhcmUgY29waWVkIHRvIHRoZQorICAgICAgICBuZXcgc3RydWN0LCB3aGljaCBleGlzdCBpbiBib3RoIHN0cnVjdHMuIFRoaXMgY29udmVyc2lvbiBpcyBvbmx5CisgICAgICAgIGFsbG93ZWQgYmV0d2VlbiBhIHN0cnVjdCBhbmQgb25lIG9mIGl0cyBiYXNlIHN0cnVjdHMgb3IgYSBiYXNlIHN0cnVjdAorICAgICAgICBhbmQgb25lIG9mIGl0cyBjaGlsZHJlbi4gT3RoZXJ3aXNlIGFuIGVycm9yIGlzIHJhaXNlZC4KKworICAgICAgICBOZWl0aGVyIDxkYXRhPiBub3IgPHRlbXBsYXRlPiB3aWxsIGJlIGNoYW5nZWQgaW4gdGhpcyBwcm9jZXNzIC0gdGhlCisgICAgICAgIHJlc3VsdCBpcyBhIG5ldyBzdHJ1Y3QgdmFsdWUuIFRoZSBhY3R1YWwgdmFsdWUgb2YgPHRlbXBsYXRlPiBkb2VzIG5vdAorICAgICAgICBtYXR0ZXIsIG9ubHkgaXRzIHR5cGUuCisKKyAgICAgICAgU2luY2UgdGhlIHJldHVybmVkIHN0cnVjdCBjYW4ndCBiZSBrbm93biBhdCBjb21waWxlIHRpbWUsIHRoZQorICAgICAgICBlZnVuIGlzIGRlY2xhcmVkIHRvIHJldHVybiAnbWl4ZWQnLgorCitISVNUT1JZCisgICAgICAgIEludHJvZHVjZWQgaW4gTERNdWQgMy4zLjI1MCAuCisgICAgICAgIExETXVkIDMuMy4zNDQgYWRkZWQgdGhlIHRlbXBsYXRlIGFyZ3VtZW50LgorICAgICAgICBMRE11ZCAzLjMuNDMzIGFkZGVkIHRoZSBjb252ZXJzaW9uIGZyb20gbWFwcGluZ3MuCisgICAgICAgIExETXVkIDMuMy43MjAgYWRkZWQgdGhlIGNvbnZlcnNpb24gb2Ygc3RydWN0cyBpbnRvIGFub3RoZXIgc3RydWN0LgorCitTRUUgQUxTTworICAgICAgICB0b19hcnJheShFKSwgdG9fc3RyaW5nKEUpLCBta21hcHBpbmcoRSksIHN0cnVjdHMoTFBDKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vdHJhY2UgYi9kb2MvZWZ1bi90cmFjZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmVkYzc5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vdHJhY2UKQEAgLTAsMCArMSw1NCBAQAorR0VTQ0hVRVRaVAorU1lOT1BTSVMKKyAgICAgICAgI2luY2x1ZGUgPHN5cy90cmFjZS5oPgorCisgICAgICAgIGludCB0cmFjZShpbnQgdHJhY2VmbGFncyk7CisKK0JFU0NIUkVJQlVORworICAgICAgICBTZXR6dCBkaWUgVHJhY2UgRmxhZ3MgdW5kIGxpZWZlcnQgZGllIGFsdGVuIFRyYWNlIEZsYWdzIHp1cnVlY2suCisgICAgICAgIFdlbm4gVHJhY2luZyBlaW5nZXNjaGFsdGV0IGlzdCwgd2lyZCB3YWVocmVuZCBkZXIgQXVzZnVlaHJ1bmcgZWluZQorICAgICAgICBNZW5nZSBJbmZvcm1hdGlvbmVuIGF1c2dlZ2ViZW4uIFp1IHZpZWwgT3V0cHV0IGthbm4gZGllIFZlcmJpbmR1bmcKKyAgICAgICAgbGFobSBsZWdlbiBvZGVyIHNvZ2FyIGRlbiBnYW56ZW4gVHJlaWJlciB6dW0gQWJzdHVyeiBicmluZ2VuLgorCisgICAgICAgIFRyYWNpbmcgZXJmb2xndCBhdWYgZWluZXIgUHJvLVZlcmJpbmR1bmctQmFzaXM6IGplZGVyIGludGVyYWt0aXZlICghKQorICAgICAgICBVc2VyIGthbm4gc2VpbiBlaWdlbmVzIFRyYWNlbGV2ZWwgdW5kIC1wcmFlZml4IGZlc3RsZWdlbi4gSmVkZXIKKyAgICAgICAgZXJoYWVsdCBudXIgZGVuIFRyYWNlb3V0cHV0IGZ1ZXIgZGVuIENvZGUsIGRlciB3YWVocmVuZCBkZXIKKyAgICAgICAgQXVzd2VydHVuZyBlaW5lcyB2b20gVXNlciBlaW5nZWdlYmVuIEtvbW1hbmRvcyBhdXNnZWZ1ZWhydCB3aXJkLgorCisgICAgICAgIERpZSBUcmFjZS1CaXRzIChhdXMgPHRyYWNlLmg+KSBzaW5kOgorCisgICAgICAgICAgICBUUkFDRV9OT1RISU5HICAgICAgICggIDApOiBCZWVuZGV0IGRhcyBUcmFjaW5nCisgICAgICAgICAgICBUUkFDRV9DQUxMICAgICAgICAgICggIDEpOiBUcmFjZXQgYWxsZSBBdWZydWZlIHZvbiBMZnVucworICAgICAgICAgICAgVFJBQ0VfQ0FMTF9PVEhFUiAgICAoICAyKTogVHJhY2V0IGFsbGUgY2FsbF9vdGhlcigpIEF1ZnJ1ZmUKKyAgICAgICAgICAgIFRSQUNFX1JFVFVSTiAgICAgICAgKCAgNCk6IFRyYWNldCBSZXN1bHRhdGUgdm9uIEZ1bmt0aW9uZW4KKyAgICAgICAgICAgIFRSQUNFX0FSR1MgICAgICAgICAgKCAgOCk6IEdpYnQgQXJndW1lbnRlIHVuZCBSZXN1bHRhdGUgdm9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5rdGlvbmVuIGF1cworICAgICAgICAgICAgVFJBQ0VfRVhFQyAgICAgICAgICAoIDE2KTogVHJhY2V0IGFsbGUgYXVzZ2VmdWVocnRlbiBBbndlaXN1bmdlbgorICAgICAgICAgICAgVFJBQ0VfSEVBUlRfQkVBVCAgICAoIDMyKTogVHJhY2V0IGRlbiBIZWFydGJlYXQgQ29kZQorICAgICAgICAgICAgVFJBQ0VfQVBQTFkgICAgICAgICAoIDY0KTogVHJhY2V0IFRyZWliZXItQXBwbGllcworICAgICAgICAgICAgVFJBQ0VfT0JKTkFNRSAgICAgICAoMTI4KTogR2lidCBkZW4gTmFtZW4gZGVzIE9iamVrdGVzIGF1cworCisgICAgICAgIFRSQUNFX0VYRUMgdW5kIFRSQUNFX0hFQVJUX0JFQVQgc29sbHRlbiBuaWNodCB2ZXJ3ZW5kZXQgd2VyZGVuLCB3ZWlsCisgICAgICAgIHNpZSBtYXNzaXZlbiBPdXRwdXQgdmVydXJzYWNoZW4uIFRSQUNFX09CSk5BTUUgc29sbHRlIG5pY2h0IHZlcndlbmRldAorICAgICAgICB3ZXJkZW4sIHdlbm4gYmVrYW5udCBpc3QsIHdlbGNoZXMgT2JqZWt0IGdldHJhY2V0IHdpcmQuCisKKyAgICAgICAgRGllIE1hc3Rlci1MZnVuIHZhbGlkX3RyYWNlKCkgd2lyZCBtaXQgKCJ0cmFjZSIsIHRyYWNlZmxhZ3MpCisgICAgICAgIGF1ZmdlcnVmZW4sIHVtIGRpZSBFcmxhdWJuaXMgZnVlciBkaWUgTnV0enVuZyB2b24gdHJhY2UoKSB6dSBlcmhhbHRlbi4KKworQkVJU1BJRUwKKyAgICAgICAgb2JqZWN0IG9iajsKKyAgICAgICAgc3RyaW5nIHByZWZpeDsKKyAgICAgICAgb2JqPWZpbmRfcGxheWVyKCJ0aG9tYXMiKTsKKyAgICAgICAgcHJlZml4PW9iamVjX25hbWUob2JqKTsKKyAgICAgICAgcHJlZml4PXByZWZpeFsxLi5zdHJsZW4ocHJlZml4KS0xXTsgIC8qIGVudGZlcm50IGRlbiBQcmFlZml4ICIvIiAqLworICAgICAgICB0cmFjZXByZWZpeChwcmVmaXgpOworICAgICAgICAvKiBWb24gaGllciBhbiB3aXJkIG51ciBDb2RlIGltIE9iamVrdCBzdGQvcGxheWVyIzY5IGdldHJhY2V0ICovCisgICAgICAgIHRyYWNlKFRSQUNFX0NBTEx8VFJBQ0VfQ0FMTF9PVEhFUnxUUkFDRV9SRVRVUk58VFJBQ0VfQVJHUyk7CisgICAgICAgIC4uLgorICAgICAgICB0cmFjZShUUkFDRV9OT1RISU5HKTsKKworQUVOREVSVU5HRU4KKyAgICAgICAgTERNdWQgMy4yLjkgdWViZXJnaWJ0IGF1Y2ggPHRyYWNlZmxhZ3M+IGFuIHZhbGlkX3RyYWNlKCkKKworU0lFSEUgQVVDSAorICAgICAgICB0cmFjZXByZWZpeChFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vdHJhY2VwcmVmaXggYi9kb2MvZWZ1bi90cmFjZXByZWZpeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjQ2ZjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vdHJhY2VwcmVmaXgKQEAgLTAsMCArMSwyNSBAQAorU1lOT1BTSVM6CisgICAgICAgIHN0cmluZyB0cmFjZXByZWZpeChzdHJpbmcgcHJlZml4KQorICAgICAgICBzdHJpbmcgdHJhY2VwcmVmaXgoaW50IGR1bW15KQorCitERVNDUklQVElPTjoKKyAgICAgICAgSWYgY2FsbGVkIHdpdGggYSBzdHJpbmcsIG9ubHkgb2JqZWN0cyBtYXRjaGluZyB0aGlzIHByZWZpeCB3aWxsCisgICAgICAgIGJlIHRyYWNlZC4gVGhlIHN0cmluZyBtdXN0IG5vdCBjb250YWluIGEgbGVhZGluZyAiLyIgYmVjYXVzZQorICAgICAgICB0aGUgb2JqZWN0IG5hbWVzIGFyZSBzdG9yZWQgaW50ZXJuYWxseSB3aXRob3V0IGl0LiBJZiBjYWxsZWQKKyAgICAgICAgd2l0aCBhIG51bWJlciwgdGhlIHRyYWNlcHJlZml4IHdpbGwgYmUgaWdub3JlZCBhbmQgYWxsIG9iamVjdHMKKyAgICAgICAgd2lsbCBiZSB0cmFjZWQuIFJldHVybnMgdGhlIGxhc3QgdHJhY2VwcmVmaXggb3IgMCBpZiB0aGVyZQorICAgICAgICB3YXNuJ3QgYW55LgorCitFWEFNUExFOgorICAgICAgICBvYmplY3Qgb2JqOworICAgICAgICBzdHJpbmcgcHJlZml4OworICAgICAgICBvYmogPSBmaW5kX3BsYXllcigiZGVlcHRob3VnaHQiKTsKKyAgICAgICAgcHJlZml4ID0gb2JqZWN0X25hbWUob2JqKTsKKyAgICAgICAgcHJlZml4ID0gcHJlZml4WzEuLnN0cmxlbihwcmVmaXgpLTFdOyAvKiBjdXQgb2ZmIHRoZSBsZWFkaW5nICIvIiAqLworICAgICAgICB0cmFjZXByZWZpeChwcmVmaXgpOworICAgICAgICB0cmFjZSgxfDJ8NHw4KTsKKyAgICAgICAgLi4uCisgICAgICAgIHRyYWNlKDApOworICAgICAgICAKK1NFRSBBTFNPOgorICAgICAgICB0cmFjZShFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vdHJhbnNmZXIgYi9kb2MvZWZ1bi90cmFuc2ZlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDEzZjAyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vdHJhbnNmZXIKQEAgLTAsMCArMSwyNSBAQAorVkVSQUxURVQKK1NZTk9QU0lTCisgICAgICAgIGludCB0cmFuc2ZlcihvYmplY3QgaXRlbSwgb2JqZWN0IGRlc3QpCisKK0JFU0NIUkVJQlVORworICAgICAgICBEaWVzZSBGdW5rdGlvbiBleGlzdGllcnQgbGVkaWdsaWNoIGF1cyBLb21wYXRpYmlsaXRhZXRzZ3J1bmRlbiwgdW5kCisgICAgICAgIGRhbm4gYXVjaCBudXIsIHdlbm5uIGRlciBEcml2ZXIgbWl0IFVTRV9ERVBSRUNBVEVEIGtvbXBpbGllcnQgd2lyZC4KKworICAgICAgICBEYXMgT2JqZWN0IDxpdGVtPiB3aXJkIGluIE9iamVrdCA8ZGVzdD4gYmV3ZWd0LiBWZXJzY2hpZWRlbmUgVGVzdHMKKyAgICAgICAgd2VyZGVuIGR1cmNoZ2VmdWVocnQsIHVuZCBkYXMgUmVzdWx0YXQgYmVzY2hyZWlidCBkZW4gKE1pc3MpRXJmb2xnOgorCisgICAgICAgIDA6IEVyZm9sZy4KKyAgICAgICAgMTogWnUgc2Nod2VyIGZ1ZXIgPGRlc3Q+CisgICAgICAgIDI6IEthbm4gbmljaHQgZmFsbGVuIGdlbGFzc2VuIHdlcmRlbi4KKyAgICAgICAgMzogS2FubiBuaWNodCBhdXMgc2VpbmVtICBCZWhhZWx0ZXIgZ2Vub21tZW4gd2VyZGVuLgorICAgICAgICA0OiA8aXRlbT4ga2FubiBpbiBrZWluZW4gQmVoYWVsdGVyIGdlc3RlY2t0IHdlcmRlbi4KKyAgICAgICAgNTogPGRlc3Q+IGFremVwdGllcnQgPGl0ZW0+IG5pY2h0LgorICAgICAgICA2OiA8aXRlbT4ga2FubiBuaWNodCBhdWZnZW5vbW1lbiB3ZXJkZW4uCisKKyAgICAgICAgRGllIEZ1bmt0aW9uIHJ1ZnQgZGllIGxmdW5zIGFkZF93ZWlnaHQoKSwgZHJvcCgpLCBnZXQoKSwKKyAgICAgICAgcHJldmVudF9pbnNlcnQoKSwgYWRkX3dlaWdodCgpLCB1bmQgY2FuX3B1dF9hbmRfZ2V0KCkgbmFjaCBCZWRhcmYuLgorCitTSUVIRSBBVUNICisgICAgICAgICBtb3ZlX29iamVjdChFKSwgZHJvcChBKSwgZ2V0KEEpLCBwcmV2ZW50X2luc2VydChBKSwKKyAgICAgICAgIGNhbl9wdXRfYW5kX2dldChBKSwgYWRkX3dlaWdodChBKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vdHJhbnNwb3NlX2FycmF5IGIvZG9jL2VmdW4vdHJhbnNwb3NlX2FycmF5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZTJhNzgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi90cmFuc3Bvc2VfYXJyYXkKQEAgLTAsMCArMSwyMiBAQAorU1lOT1BTSVM6CisJbWl4ZWQgKnRyYW5zcG9zZV9hcnJheSAobWl4ZWQgKmFycik7CisKK0RFU0NSSVBUSU9OOgorCXRyYW5zcG9zZV9hcnJheSAoICh7ICh7MSwyLDN9KSwgKHthLGIsY30pIH0pICkKKwkJCT09ICh7ICh7MSxhfSksICh7MixiKX0sICh7MyxjfSkgfSkgCisKKwl0cmFuc3Bvc2VfYXJyYXkoKSBhcHBsaWVkIHRvIGFuIGFsaXN0IHJlc3VsdHMgaW4gYW4gYXJyYXkgb2YKKwkoeyBrZXksIGRhdGEgfSkgcGFpcnMsIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byB1c2Ugc29ydF9hcnJheSgpCisJb3IgZmlsdGVyKCkgb24gdGhlIGFsaXN0LgorCitFWEFNUExFOgorCXNvcnRfYXJyYXkodHJhbnNwb3NlX2FycmF5KCAoeyBtX2luZGljZXMobWFwKSwgbV92YWx1ZXMobWFwKSB9KSApLAorCQkgICBsYW1iZGEoICh7ICdhLCAnYiB9KSwKKwkJCSAgICh7ICMnPCwgKHsgIydbLCAnYSwgMCB9KSwKKwkJCQkgICAoeyAjJ1ssICdiLCAwfSkgfSkgKSApCisKKwlUaGUgZ2l2ZW4gbWFwcGluZyAnbWFwJyBpcyByZXR1cm5lZCBhcyBhbiBhcnJheSBvZiAKKwkoeyBrZXksCWRhdGEgfSkgIHBhaXJzLCBzb3J0ZWQgYnkgdGhlIGtleXMuCisKK1NFRSBBTFNPOgorCWFsaXN0cyhMUEMpLCBzb3J0X2FycmF5KEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi90cmltIGIvZG9jL2VmdW4vdHJpbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTI1YTgyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vdHJpbQpAQCAtMCwwICsxLDMzIEBACitTWU5PUFNJUworICAgICAgICAjaW5jbHVkZSA8c3lzL3N0cmluZ3MuaD4KKworICAgICAgICBzdHJpbmcgdHJpbShzdHJpbmcgc3RyKTsKKyAgICAgICAgc3RyaW5nIHRyaW0oc3RyaW5nIHN0ciwgaW50IHdoZXJlKTsKKyAgICAgICAgc3RyaW5nIHRyaW0oc3RyaW5nIHN0ciwgaW50IHdoZXJlLCBzdHJpbmcgY2hhcik7CisKK0JFU0NIUkVJQlVORworICAgICAgICBFbnRmZXJudCBhbGxlIHZvcmF1c2dlaGVuZGVuIHVuZCBhYnNjaGxpZXNzZW5kZW4gWmVpY2hlbiA8Y2hhcj4gaW4KKyAgICAgICAgZWluZW0gU3RyaW5nIDxzdHI+IHVuZCBnaWJ0IGRlbiBuZXVlbiBTdHJpbmcgenVydWVjay4KKworICAgICAgICA8Y2hhcj4ga2FubiBlbnR3ZWRlciBlaW4gb2RlciBtZWhyZXJlIFplaWNoZW4gc2Vpbi4gV2lyZCA8Y2hhcj4gbmljaHQKKyAgICAgICAgYW5nZWdlYmVuLCB3aXJkIHN0YW5kYXJkbWFlc3NpZyBkZXIgTGVlcnNjaGxhZyAiIFx0IiBnZW51dHp0LgorCisgICAgICAgIE1pdCA8d2hlcmU+IGthbm4gYW5nZWdlYmVuIHdlcmRlbiwgd28gWmVpY2hlbiBlbnRmZXJudCB3ZXJkZW46CisKKyAgICAgICAgICAgIFRSSU1fTEVGVCAgICgxKTogICAgICAgIGVudGZlcm50IGFsbGUgdm9yYXVzZ2VoZW5kZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFplaWNoZW4gPGNoYXI+CisgICAgICAgICAgICBUUklNX1JJR0hUICAoMik6ICAgICAgICBlbnRmZXJudCBhbGxlIGFic2NobGllc3NlbmRlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWmVpY2hlbiA8Y2hhcj4KKyAgICAgICAgICAgIFRSSU1fQk9USCAgICgzIG9kZXIgMCk6IGVudGZlcm50IHNvd29obCB2b3JhdXNnZWhlbmRlIGFscyBhdWNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnNjaGxpZXNzZW5kZSBaZWljaGVuIDxjaGFyPgorCitCRUlTUElFTAorICAgICAgICB0cmltKCIgICAgMTIzNCAgICAiKTsgICAgICAgICAgICAgICAgICAgICAgIGVyZ2lidDogIjEyMzQiCisgICAgICAgIHRyaW0oIiAgICAxMjM0ICAgICIsIFRSSU1fUklHSFQpOyAgICAgICAgICAgZXJnaWJ0OiAiICAgIDEyMzQiCisgICAgICAgIHRyaW0oIiAgICAxMjM0ICAgICIsIFRSSU1fQk9USCwgIiAxIik7ICAgICAgZXJnaWJ0OiAiMjM0IgorCitBRU5ERVJVTkdFTgorICAgICAgICBFaW5nZWZ1ZWhydCBpbiBMRE11ZCAzLjIuNworCitTSUVIRSBBVUNICisgICAgICAgIHJlZ3JlcGxhY2UoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL3R5cGVvZiBiL2RvYy9lZnVuL3R5cGVvZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTFiYjk2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vdHlwZW9mCkBAIC0wLDAgKzEsMTMgQEAKK1NZTk9QU0lTCisgICAgICAgIGludCB0eXBlb2YobWl4ZWQgYXJnKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIEdpYnQgZWluZW4gQ29kZSBmdWVyIGRlbiBUeXAgZGVzIEFyZ3VtZW50cyA8YXJnPi4gRGllIFR5cGVuIHNpbmQKKyAgICAgICAgZGVmaW5pZXJ0IGluIDxzeXMvbHBjdHlwZXMuaD4KKworQUVOREVSVU5HRU4KKyAgICAgICAgRWluZ2VmdWVocnQgaW4gMy4yQDYzCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgZ2V0X3R5cGVfaW5mbyhFKSwgaW50cChFKSwgb2JqZWN0cChFKSwgZmxvYXRwKEUpLCBwb2ludGVycChFKSwKKyAgICAgICAgY2xvc3VyZXAoRSksIHN5bWJvbHAoRSksIHN0cmluZ3AoRSksIG1hcHBpbmdwKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi91bmJvdW5kX2xhbWJkYSBiL2RvYy9lZnVuL3VuYm91bmRfbGFtYmRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNGIxYjUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi91bmJvdW5kX2xhbWJkYQpAQCAtMCwwICsxLDI3IEBACitTWU5PUFNJUworICAgICAgICBjbG9zdXJlIHVuYm91bmRfbGFtYmRhKG1peGVkICphcmcsIG1peGVkIGNvZGUpOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgRXJ6ZXVndCBlaW5lIExhbWJkYS1DbG9zdXJlLCBkaWUgbmljaHQgYW4gZWluIE9iamVrdCBnZWJ1bmRlbiBpc3QsCisgICAgICAgIGVudHNwcmVjaGVuZCBlaW5lciBMYW1iZGEtRnVua3Rpb24gaW4gTElTUC4KKworICAgICAgICBEaWUgQ2xvc3VyZSBrYW5uIGtlaW5lIFJlZmVyZW56IHp1IGdsb2JhbGVuIFZhcmlhYmxlbiBlbnRoYWx0ZW4uCisgICAgICAgIExmdW4tQ2xvc3VyZXMgd2VyZGVuIHVudmVyYWVuZGVydCBpbiBkaWUgQ2xvc3VyZSBlaW5nZWJ1bmRlbiwgZGEgZXMKKyAgICAgICAga2VpbiBVcnNwcnVuZ3NvYmpla3QgZnVlciBkaWVzZSBDbG9zdXJlIGdpYnQuCisKKyAgICAgICAgQmV2b3IgZGllIENsb3N1cmUgYXVmZ2VydWZlbiB3ZXJkZW4ga2FubiwgbXVzcyBzaWUgYW4gZWluIE9iamVrdAorICAgICAgICBnZWJ1bmRlbiB3ZXJkZW4uIE5vcm1hbGUgT2JqZWt0ZSBrb2VubmVuIENsb3N1cmVzIG51ciBhbiBzaWNoIHNlbGJzdAorICAgICAgICBiaW5kZW4sIGRhcyBCaW5kZW4gYW4gYW5kZXJlIE9iamVrdGUgZXJ6ZXVndCBlaW5lIFNjaHV0enZlcmxldHp1bmcuCisKKyAgICAgICAgRGVyIFB1bmt0IGlzdCwgZGFzcyBwcmV2aW91c19vYmplY3QoKSBmdWVyIEF1ZnJ1ZmUgaW5uZXJoYWxiIGRlcgorICAgICAgICBDbG9zdXJlIGF1ZiBkYXMgT2JqZWt0IHplaWd0LCBkYXMgYmluZF9sYW1iZGEoKSBhdWZnZXJ1ZmVuIGhhdCwgdW5kCisgICAgICAgIGFsbGUgb2JqZWt0LSBvZGVyIHVpZC1iYXNpZXJ0ZW4gU2ljaGVyaGVpdHNjaGVja3MgYmV6aWVoZW4gc2ljaAorICAgICAgICBhdWYgamVuZXMgT2JqZWt0LgorCisgICAgICAgIERhcyBlcnN0ZSBBcmd1bWVudCA8KmFyZz4gaXN0IGVpbiBBcnJheSwgZGFzIGRpZSBBcmd1bWVudGUgKFN5bWJvbGUpCisgICAgICAgIGVudGhhZWx0LCBkaWUgYW4gZGllIENsb3N1cmUgdWViZXJnZWJlbiB3ZXJkZW4sIHdlbm4gZGllc2UgbWl0CisgICAgICAgIGZ1bmNhbGwoKSBvZGVyIGFwcGx5KCkgYXVzZ2V3ZXJ0ZXQgd2lyZC4gRGFzIHp3ZWl0ZSBBcmd1bWVudCA8Y29kZT4KKyAgICAgICAgZW50aGFlbHQgZGVuIENvZGUgZGVyIENsb3N1cmUuCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgY2xvc3VyZXMoTFBDKSwgbGFtYmRhKEUpLCBhcHBseShFKSwgZnVuY2FsbChFKSwgYmluZF9sYW1iZGEoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL3VuaXF1ZV9hcnJheSBiL2RvYy9lZnVuL3VuaXF1ZV9hcnJheQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTBjNTZlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vdW5pcXVlX2FycmF5CkBAIC0wLDAgKzEsNDcgQEAKK1NZTk9QU0lTCisgICAgICAgIG1peGVkIHVuaXF1ZV9hcnJheShvYmplY3QgKm9iaiwgc3RyaW5nfGNsb3N1cmUgZnVuKQorICAgICAgICBtaXhlZCB1bmlxdWVfYXJyYXkob2JqZWN0ICpvYmosIHN0cmluZ3xjbG9zdXJlIGZ1biwgbWl4ZWQgc2tpcCkKKyAgICAgICAgbWl4ZWQgdW5pcXVlX2FycmF5KG9iamVjdCAqb2JqLCBzdHJpbmd8Y2xvc3VyZSBmdW4sIG1peGVkIGV4dHJhLi4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgbWl4ZWQgc2tpcCkKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIEdydXBwaWVydCBhbGxlIE9iamVrdGUgYXVzIDwqb2JqPiwgZnVlciBkaWUgZGllIEZ1bmt0aW9uIDxmdW4+CisgICAgICAgIGRlbiBnbGVpY2hlbiBXZXJ0IGxpZWZlcnQuIFdlbm4gPCpvYmo+IGV0d2FzIGFuZGVyZXMgYWxzIE9iamVrdGUKKyAgICAgICAgZW50aGFlbHQsIHdlcmRlbiBkaWVzZSBpZ25vcmllcnQuCisgICAgICAgIAorICAgICAgICBJc3QgZGllIEZ1bmt0aW9uIG1pdCBOYW1lbiBhbmdlZ2ViZW4sIHdpcmQgc2llIGluIGplZGVtIE9iamVrdAorICAgICAgICBpbiA8Km9iaj4gZWlubWFsIGF1ZmdlcnVmZW4uIFd1cmRlbiA8ZXh0cmE+IEFyZ3VtZW50ZQorICAgICAgICBnZWdlYmVuLCB3ZXJkZW4gZGllc2UgYW4gZGllIEZ1bmt0aW9uIGJlaSBqZWRlbSBBdWZydWYgYWxzCisgICAgICAgIFBhcmFtZXRlciB1ZWJlcmdlYmVuLgorCisgICAgICAgIElzdCBkaWUgRnVua3Rpb24gYWxzIENsb3N1cmUgYW5nZWdlYmVuLCB3aXJkIHNpZSBmdWVyIGplZGVzIE9iamVrdAorICAgICAgICBpbiA8Km9iaj4gZWlubWFsIGF1ZmdlcnVmZW4sIHdvYmVpIGRhcyBPYmpla3QgYWxzIGVyc3RlcyBBcmd1bWVudAorICAgICAgICB1ZWJlcmdlYmVuIHdpcmQsIGdlZm9sZ3Qgdm9uIGV0d2FpaWdlbiA8ZXh0cmE+IEFyZ3VtZW50ZW4uCisKKyAgICAgICAgV2lyZCBlaW4gQXJndW1lbnQgPHNraXA+IGFuZ2VnZWJlbiAoYmVpIFZlcndlbmR1bmcgdm9uIDxleHRyYT4KKyAgICAgICAgQXJndW1lbnRlbiBtdXNzIGRpZXMgZ2VzY2hlaGVuKSwgdW5kIGVudHNwcmljaHQgPHNraXA+IGRlbQorICAgICAgICBSZXN1bHRhdCB2b24gPHNlcGFyYXRvcj4gZnVlciBlaW4gRWxlbWVudCBhdXMgPCpvYmo+LCBzbyB3aXJkCisgICAgICAgIGRpZXNlcyBFbGVtZW50IG5pY2h0IGluIGRhcyBSZXN1bHRhdCB2b24gdW5pcXVlX2FycmF5KCkKKyAgICAgICAgdWViZXJub21tZW4uCisgICAgICAgIAorICAgICAgICBEYXMgUmVzdWx0YXQgdm9uIHVuaXF1ZV9hcnJheSgpIGhhdCBkaWUgRm9ybToKKworICAgICAgICAgICAgKHsgKHtzYW1lMToxLCBzYW1lMToyLCAuLi4gc2FtZTE6bn0pLAorICAgICAgICAgICAgICAgKHtzYW1lMjoxLCBzYW1lMjoyLCAuLi4gc2FtZTI6bn0pLAorICAgICAgICAgICAgICAgKHtzYW1lbToxLCBzYW1lbToyLCAuLi4gc2FtZW06bn0pIH0pCisKK0JFSVNQSUVMCisgICAgICAgIFVtIGVpbiBBcnJheSB2b24gQXJyYXlzIHp1IGVyaGFsdGVuLCBkYXMgYWxsZSBCZW51dHplciwgbmFjaCBMZXZlbAorICAgICAgICBncnVwcGllcnQsIGVudGhhZWx0OgorCisgICAgICAgICAgICBtaXhlZCAqYXJyOworICAgICAgICAgICAgYXJyPXVuaXF1ZV9hcnJheSh1c2VycygpLCAiX3F1ZXJ5X2xldmVsIiwgLTEpOworCisgICAgICAgIEdvZXR0ZXIgaGFiZW4gZWluZW4gTGV2ZWwgdm9uIC0xLiBTaWUgd2VyZGVuIG5pY2h0IGluIGFyciBhdWZnZW5vbW1lbiwKKyAgICAgICAgd2VpbCA8c2tpcD4gPT0gLTEuCisKK1NJRUhFIEFVQ0gKKyAgICAgIEFycmF5czogICAgICAgZmlsdGVyKEUpLCBtYXAoRSkKKyAgICAgIE9iamVrdGFycmF5czogZmlsdGVyX29iamVjdHMoRSksIG1hcF9vYmplY3RzKEUpCisgICAgICBNYXBwaW5nczogICAgIGZpbHRlcihFKSwgbWFwKEUpLCBmaWx0ZXJfaW5kaWNlcyhFKSwgbWFwX2luZGljZXMoRSkKKwpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vdW5ta21hcHBpbmcgYi9kb2MvZWZ1bi91bm1rbWFwcGluZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmVlY2NiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vdW5ta21hcHBpbmcKQEAgLTAsMCArMSwyNyBAQAorU1lOT1BTSVMKKyAgICAgICAgKm1peGVkIHVubWttYXBwaW5nKG1hcHBpbmcgbWFwKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIFdhbmRlbHQgZGFzIE1hcHBpbmcgPG1hcD4gaW4gZWluIEFycmF5IHZvbiBBcnJheXMgYXVzLCBkYXMgYWxsZSBLZXlzCisgICAgICAgIHVuZCBXZXJ0ZSB2b24gPG1hcD4gZW50aGFlbHQgdW5kIGdpYnQgZGllc2VzIEFycmF5IHp1cnVlY2suCisKKyAgICAgICAgRGFzIFJlc3VsdGF0IHZvbiB1bm1rbWFwcGluZygpIGhhdCBkaWUgRm9ybSAoeyBrZXlzW10sIGRhdGEwW10sCisgICAgICAgIGRhdGExW10gLi4uIH0pLCB3b2JlaSBrZXlzW10gZWluIEFycmF5IGFsbGVyIEtleXMgaXN0LCBkYXRhMFtdIGVpbgorICAgICAgICBBcnJheSBtaXQgYWxsZW4gV2VydGVuIGF1cyBkZXIgZXJzdGVuIFNwYWx0ZSwgZGF0YTFbXSBlaW4gQXJyYXkgbWl0CisgICAgICAgIGFsbGVuIFdlcnRlbiBhdXMgZGVyIHp3ZWl0ZW4gU3BhbHRlIGV0Yy4gRGFzIGhlaXNzdCwgZGFzcyBkaWUKKyAgICAgICAgV2VydGUgdm9uIGtleVt4XSBpbiBkYXRhMFt4XSwgZGF0YTFbeF0gdXN3LiBnZXNwZWljaGVydCBzaW5kLgorCisgICAgICAgIHVubWttYXBwaW5nKCkgaXN0IGRpZSBVbWtlaHJmdW5rdGlvbiB2b24gbWttYXBwaW5nKCksIHNvZGFzcyBnaWx0OgorCisgICAgICAgICAgICBhcHBseSgjJ21rbWFwcGluZywgdW5ta21hcHBpbmcobSkpID09IG0KKworQkVJU1BJRUwKKyAgICAgICAgbWFwcGluZyBtID0gKFsgMToxMDsyMCwgMjoxMTsyMSBdKTsKKyAgICAgICAgdW5ta21hcHBpbmcobSkgZXJnaWJ0OiAoeyAoezEsIDJ9KSAsICh7MTAsIDExfSkgLCAoezIwLCAyMX0pIH0pCisKK0FFTkRFUlVOR0VOCisgICAgICAgIEVpbmdlZnVlaHJ0IGluIExETXVkIDMuMi42LgorCitTSUVIRSBBVUNICisgICAgICAgIG1hcHBpbmdzKExQQyksIG1hcHBpbmdwKEUpLCBtX2luZGljZXMoRSksIG1fdmFsdWVzKEUpLCBtX2RlbGV0ZShFKSwKKyAgICAgICAgc2l6ZW9mKEUpLCB3aWR0aG9mKEUpLgpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vdW5xdW90ZSBiL2RvYy9lZnVuL3VucXVvdGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAwMDA2MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL3VucXVvdGUKQEAgLTAsMCArMSwxNyBAQAorU1lOT1BTSVMKKyAgICAgICAgcXVvdGVkX2FycmF5IHVucXVvdGUocXVvdGVkX2FycmF5IGFycik7CisgICAgICAgIHN0cmluZ3xzeW1ib2wgdW5xdW90ZShzeW1ib2wgc3ltKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIEVudGZlcm50IGVpbiBRdW90ZSB2b24gZWluZW0gZ2VxdW90ZXRlbiBBcnJheSBvZGVyIFN5bWJvbC4gV2VubiBkYXMKKyAgICAgICAgbGV0enRlIFF1b3RlIHZvbiBlaW5lbSBTeW1ib2wgZW50ZmVybnQgd2lyZCwgZW50c3RlaHQgZWluIFN0cmluZy4KKworQkVJU1BJRUxFOgorICAgICAgICB1bnF1b3RlKCdmb28pOyAgICAgICAgICAgICAgZXJnaWJ0OiAiZm9vIgorICAgICAgICB1bnF1b3RlKCAnKHsxLDIsM30pICk7ICAgICAgZXJnaWJ0OiAoezEsMiwzfSkKKworQUVOREVSVU5HRU4KKyAgICAgICAgRWluZ2VmdWVocnQgaW4gTERNdWQgMy4yLjkuCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgcXVvdGUoRSksIHN5bWJvbHAoRSkKZGlmZiAtLWdpdCBhL2RvYy9lZnVuL3Vuc2hhZG93IGIvZG9jL2VmdW4vdW5zaGFkb3cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg4ZDVmZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL3Vuc2hhZG93CkBAIC0wLDAgKzEsMjEgQEAKK0ZVTktUSU9OCisgICAgIHZvaWQgdW5zaGFkb3coKQorCitCRVNDSFJFSUJVTkcKKyAgICAgRGFzIGF1ZnJ1ZmVuZGUgT2JqZWt0IHdpcmQgYWxzIFNoYWRvdyB2b24gYWxsZW4gYW5kZXJlbiBPYmpla3RlbgorICAgICBlbnRmZXJudCwgZGVuZW4gZXMgdWViZXJnZXdvcmZlbiB3YXIuIFdlbm4gZGVtIGF1ZnJ1ZmVuZGVuIE9iamVrdAorICAgICBzZWxic3QgZWluIFNoYWRvdyB1ZWJlcmdld29yZmVuIHdhciwgd2lyZCBkaWVzZXIgZW50ZmVybnQuCisgICAgIE1hbiBzb2xsdGUgZGllc2UgKHMpZWZ1biBydWZlbiwgYmV2b3IgbWFuIGRlbiBTY2hhdHRlbiB6ZXJzdG9lcnQuCisKK0JFSVNQSUVMRQorICAgICAvLyBCIGJlc2NoYXR0ZXQgQQorICAgICB2b2lkIGI6OnN0b3Bfc2hhZG93aW5nKCkgeworICAgICAgIHVuc2hhZG93KCk7CisgICAgIH0KKworU0lFSEUgQVVDSAorICAgICBHZW5lcmVsbDoJICAgICBzaGFkb3coRSkKKyAgICAgUmVjaHRlOgkgICAgIHF1ZXJ5X2FsbG93X3NoYWRvdyhNKSwgcXVlcnlfcHJldmVudF9zaGFkb3coTCkKKyAgICAgSW5mb3JtYXRpb25lbjogIHF1ZXJ5X3NoYWRvd2luZyhFKQorCisyMC4wOC4yMDA5LCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi91cHBlcl9jYXNlIGIvZG9jL2VmdW4vdXBwZXJfY2FzZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzFmZmE1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vdXBwZXJfY2FzZQpAQCAtMCwwICsxLDEyIEBACitTWU5PUFNJUworICAgICAgICBzdHJpbmcgdXBwZXJfY2FzZShzdHJpbmcgc3RyKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIFdhbmRlbHQgYWxsZSBaZWljaGVuIGluIDxzdHI+IGluIEdyb3NzYnVjaHN0YWJlbiB1bSB1bmQgZ2lidCBkYXMKKyAgICAgICAgUmVzdWx0YXQgenVydWVjay4KKworQkVJU1BJRUwKKyAgICAgICAgdXBwZXJfY2FzZSgiSGV5YSEiKSAgICAgZXJnaWJ0OiAiSEVZQSEiCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgY2FwaXRhbGl6ZShFKSwgbG93ZXJfY2FzZShFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vdXNlcnMgYi9kb2MvZWZ1bi91c2VycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGI0YWUzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vdXNlcnMKQEAgLTAsMCArMSw1IEBACitTWU5PUFNJUworICAgICAgICAqb2JqZWN0IHVzZXJzKCk7CisKK0JFU0NIUkVJQlVORworICAgICAgICBMaWVmZXJ0IGVpbiBBcnJheSwgZGFzIGFsbGUgaW50ZXJha3RpdmVuIEJlbnV0emVyIGVudGhhZWx0LgpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vdXRpbWUgYi9kb2MvZWZ1bi91dGltZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjIxOGFmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vdXRpbWUKQEAgLTAsMCArMSwyMiBAQAorU1lOT1BTSVMKKyAgICAgICAgKmludCB1dGltZSgpCisKK0JFU0NIUkVJQlVORworICAgICAgICBMaWVmZXJ0IGVpbiBBcnJheSBkZXIgWmVpdCwgZGllIHNlaXQgZGVtIDAxLiBKYW51YXIgMTk3MCwKKyAgICAgICAgMDA6MDA6MDAgR01UIHZlcmdhbmdlbiBpc3QsIG1pdCBHZW5hdWlna2VpdCBpbiBNaWtyb3Nla3VuZGVuCisgICAgICAgICgwLjAwMDAwMSBTZWt1bmRlbikuCisKKyAgICAgICAgWnVydWVjayBnZWdlYmVuIHdpcmQgZWluIEFycmF5IGRlciBGb3JtOgorICAgICAgICAgICAgaW50WzBdOiBBbnphaGwgU2VrdW5kZW4gc2VpdCBCZWdpbm4gZGVyIFplaXRyZWNobnVuZworICAgICAgICAgICAgaW50WzFdOiBBbnphaGwgTWlrcm9zZWt1bmRlbiBpbm5lcmhhbGIgZGVyIGFrdHVlbGxlbiBTZWt1bmRlCisKK0JFSVNQSUVMCisgICAgICAgIHdyaXRlKGN0aW1lKHV0aW1lKCkpKyJcbiIpOworCisgICAgICAgIEdpYnQgZGFzIGFrdHVlbGxlIERhdHVtIHVuZCBaZWl0IHp1cnVlY2suCisKK0FFTkRFUlVOR0VOCisgICAgICAgIEVpbmdlZnVlaHJ0IGluIExETXVkIDMuMi45LgorCitTSUVIRSBBVUNICisgICAgICAgIGN0aW1lKEUpLCBnbXRpbWUoRSksIGxvY2FsdGltZShFKSwgdGltZShFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vdmFyaWFibGVfZXhpc3RzIGIvZG9jL2VmdW4vdmFyaWFibGVfZXhpc3RzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYmQ4NDMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi92YXJpYWJsZV9leGlzdHMKQEAgLTAsMCArMSwyOSBAQAorU1lOT1BTSVMKKyAgICAgICAgI2luY2x1ZGUgPGZ1bmN0aW9ubGlzdC5oPgorCisgICAgICAgIHN0cmluZyB2YXJpYWJsZV9leGlzdHMoc3RyaW5nIHN0ciBbLCBpbnQgZmxhZ3NdKTsKKyAgICAgICAgc3RyaW5nIHZhcmlhYmxlX2V4aXN0cyhzdHJpbmcgc3RyLCBvYmplY3Qgb2JqIFssIGludCBmbGFnc10pOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgU3VjaHQgZWluZSBWYXJpYWxiZSA8c3RyPiBpbiB0aGlzX29iamVjdCgpIG9kZXIgKGZhbGxzIGFuZ2VnZWJlbikKKyAgICAgICAgaW0gT2JqZWt0IDxvYmo+LgorCisgICAgICAgIERhcyBSZXN1bHRhdCBpc3QgZGVyIE5hbWUgZGVzIFByb2dyYW1tcywgaW4gZGVtIGRpZSBWYXJpYWJsZSBkZWZpbmllcnQKKyAgICAgICAgaXN0LiBEYXMga2FubiBlbnR3ZWRlciBvYmplY3RfbmFtZShvYmopIHNlaW4gb2RlciBkZXIgTmFtZSBlaW5lcworICAgICAgICBnZWVyYnRlbiBQcm9ncmFtbXMuIFdlbm4gc2ljaCBkZXIgVHJlaWJlciBuaWNodCBpbSBDb21wYXQtTW9kdXMKKyAgICAgICAgYmVmaW5kZXQsIGJlZ2lubnQgZGVyIHp1cnVlY2sgZ2VsaWVmZXJ0ZSBOYW1lIGltbWVyIG1pdCAnLycuCisKKyAgICAgICAgV2lyZCA8ZmxhZ3M+IE5BTUVfSElEREVOIGdlc2V0enQsIHNvIGxpZWZlcnQgdmFyaWFibGVfZXhpc3RzKCkgYXVjaAorICAgICAgICBJbmZvcm1hdGlvbmVuIHVlYmVyIFZhcmlhYmxlbiB2b20gVHlwICJzdGF0aWMiIHVuZCAicHJvdGVjdGVkIiBpbgorICAgICAgICBhbmRlcmVuIE9iamVrdGVuLiBFcyBpc3QgbmljaHQgbW9lZ2xpY2gsIEluZm9ybWF0aW9uZW4gdWViZXIgInByaXZhdGUiCisgICAgICAgIGRla2xhcmllcnRlIFZhcmlhYmxlbiB6dSBlcmhhbHRlbi4KKworICAgICAgICBXaXJkIGRpZSBWYXJpYWJsZSBuaWNodCBnZWZ1bmRlbiAod2VpbCBzaWUgbmljaHQgZXhpc3RpZXJ0IG9kZXIgd2VpbAorICAgICAgICBzaWUgZnVlciBkYXMgYXVmcnVmZW5kZSBPYmpla3QgbmljaHQgc2ljaHRiYXIgc2luZCksIHdpcmQgMCB6dXJ1ZWNrCisgICAgICAgIGdlbGllZmVydC4KKworQUVOREVSVU5HRU4KKyAgICAgICAgRWluZ2VmdWVocnQgaW4gTERNdWQgMy4yLjEwLgorCitTSUVIRSBBVUNICisgICAgICAgIGZ1bmN0aW9uX2V4aXN0cyhFKSwgdmFyaWFibGVfbGlzdChFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vdmFyaWFibGVfbGlzdCBiL2RvYy9lZnVuL3ZhcmlhYmxlX2xpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjczYjM3NwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL3ZhcmlhYmxlX2xpc3QKQEAgLTAsMCArMSw2MCBAQAorR0VTQ0hVRVRaVAorU1lOT1BTSVMKKyAgICAgICAgI2luY2x1ZGUgPHN5cy9mdW5jdGlvbmxpc3QuaD4KKyAgICAgICAgI2luY2x1ZGUgPHN5cy9scGN0eXBlcy5oPgorCisgICAgICAgICptaXhlZCB2YXJpYWJsZV9saXN0KG9iamVjdCBvYmosIGludCBmbGFncyA9IFJFVFVSTl9GVU5DVElPTl9OQU1FKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIExpZWZlcnQgZWluIEFycmF5IG1pdCBJbmZvcm1hdGlvbmVuIHVlYmVyIGRpZSBWYXJpYWJsZW4gdm9uIDxvYmo+LgorICAgICAgICBGdWVyIGplZGUgVmFyaWFibGUgd2VyZGVuIDEgYmlzIDQgV2VydGUgaW4gZGllc2VtIEFycmF5IGdlc3BlaWNoZXJ0LAorICAgICAgICBhYmhhZW5naWcgdm9uIDxmbGFncz4uIERpZSBSZXN1bHRhdGUgd2VyZGVuIGluIGRpZXNlciBSZWloZW5mb2xnZQorICAgICAgICBpbSBBcnJheSBhYmdlc3BlaWNoZXJ0OgorICAgICAgICAgIC0gZGVyIE5hbWUgZGVyIFZhcmlhYmxlbgorICAgICAgICAgIC0gZGllIEZsYWdzIGRlciBWYXJpYWJsZW4gKHNpZWhlIHdlaXRlciB1bnRlbikKKyAgICAgICAgICAtIGRlciBSdWVja2dhYmV0eXAgKGdlbWFlc3MgbXVkbGliL3N5cy9scGN0eXBlcy5oKQorICAgICAgICAgIC0gZGVyIFdlcnQgZGVyIFZhcmlhYmxlbgorCisgICAgICAgIDxvYmo+IGthbm4gYWxzIE9iamVrdCBvZGVyIGFscyBEYXRlaW5hbWVuIHVlYmVyZ2ViZW4gd2VyZGVuLiBJbQorICAgICAgICB6d2VpdGVuIEZhbGwgdmVyc3VjaHQgdmFyaWFibGVfbGlzdCgpIG5pY2h0LCBkYXMgT2JqZWt0IHZvciBkZXIKKyAgICAgICAgVmVyYXJiZWl0dW5nIHp1IGxhZGVuLgorCisgICAgICAgIFdlbm4gPG9iaj4gbmljaHQgZGFzIGF1ZnJ1ZmVuZGUgT2JqZWt0IGlzdCB1bmQgZGVyIFdlcnQgZGVyIFZhcmlhYmxlbgorICAgICAgICBhYmdlZnJhZ3Qgd2lyZCwgZXJ6ZXVndCBkaWVzIGVpbmUgU2NodXR6dmVybGV0enVuZyAoInZhcmlhYmxlX2xpc3QiLAorICAgICAgICA8b2JqPikuCisKKyAgICAgICAgTWl0IDxmbGFncz4gd2lyZCBmZXN0Z2VsZWd0LCB3ZWxjaGUgSW5mb3JtYXRpb25lbiB1ZWJlciB3ZWxjaGUKKyAgICAgICAgVmFyaWFibGVuIGFiZ2VmcmFndCB3ZXJkZW4uIEZvbGdlbmRlIEZsYWdzIGF1cyA8c3lzL2Z1bmN0aW9ubGlzdC5oPgorICAgICAgICBrb2VubmVuIG1pdCBiaW5hZXJlbSBPZGVyIGtvbWJpbmllcnQgd2VyZGVuOgorCisgICAgICAgIEF1c3dhaGwgZGVyIGdlc2FtbWVsdGVuIEluZm9ybWF0aW9uOgorICAgICAgICAgICAgUkVUVVJOX0ZVTkNUSU9OX05BTUUgICAgbGllZmVydCBkZW4gTmFtZW4gZGVyIFZhcmlhYmxlbgorICAgICAgICAgICAgUkVUVVJOX0ZVTkNUSU9OX0ZMQUdTICAgbGllZmVydCBkaWUgRmxhZ3MgZGVyIFZhcmlhYmxlbiAocy4gdW50ZW4pCisgICAgICAgICAgICBSRVRVUk5fRlVOQ1RJT05fVFlQRSAgICBsaWVmZXJ0IGRlbiBSdWVja2dhYmV0eXAKKyAgICAgICAgICAgIFJFVFVSTl9WQVJJQUJMRV9WQUxVRSAgIGxpZWZlcnQgZGVuIFdlcnQgZGVyIFZhcmlhYmxlbgorCisgICAgICAgIEF1c3dhaGwgZGVyIFZhcmlhYmxlbiwgZGllIGF1c2dld2VydGV0IHdlcmRlbjoKKyAgICAgICAgICAgIE5BTUVfSU5IRVJJVEVEICAgICAgICBzY2hsaWVzc3QgZ2VlcmJ0ZSBWYXJpYWJsZW4gYXVzCisgICAgICAgICAgICBUWVBFX01PRF9TVEFUSUMgICAgICAgc2NobGllc3N0ICJzdGF0aWMiIGRla2xhcmllcnRlIFZhcmlhYmxlbiBhdXMKKyAgICAgICAgICAgIFRZUEVfTU9EX05PU0FWRSAgICAgICBzY2hsaWVzc3QgIm5vc2F2ZSIgZGVrbGFyaWVydGUgVmFyaWFibGVuIGF1cworICAgICAgICAgICAgVFlQRV9NT0RfUFJJVkFURSAgICAgIHNjaGxpZXNzdCAicHJpdmF0ZSIgZGVrbGFyaWVydGUgVmFyaWFibGVuIGF1cworICAgICAgICAgICAgVFlQRV9NT0RfUFJPVEVDVEVEICAgIHNjaGxpZXNzdCAicHJvdGVjdGVkIiBkZWtsYXJpZXJ0ZSBWYXJpYWJsZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXMKKyAgICAgICAgICAgIE5BTUVfSElEREVOICAgICAgICAgICBlbnRoYWVsdCBWYXJpYWJsZW4sIGRpZSBnZWVyYnQgd3VyZGVuLgorCisgICAgICAgIERpZSBGbGFncyBkZXIgVmFyaWFibGVuIGtvZW5uZW4gZGllIEF1c3dhaGwtRmxhZ3MgZW50aGFsdGVuIHVuZAorICAgICAgICB6dXNhZXp0bGljaCBmb2xnZW5kZSBXZXJ0ZToKKyAgICAgICAgICAgIFRZUEVfTU9EX1ZJUlRVQUwgICAgICBkaWUgVmFyaWFibGUgd3VyZGUgdmlydHVlbGwgZ2VlcmJ0CisgICAgICAgICAgICBUWVBFX01PRF9OT19NQVNHSyAgICAgZGllIFZhcmlhYmxlIGlzdCAibm9tYXNrIiBkZWtsYXJpZXJ0CisgICAgICAgICAgICBUWVBFX01PRF9QVUJMSUMgICAgICAgZGllIFZhcmlhYmxlIGlzdCAicHVibGljIiBkZWtsYXJpZXJ0CisKKyAgICAgICAgQWxsIGRpZXNlIEZsYWdzIHNpbmQgaW4gbXVkbGliL3N5cy9mdW5jdGlvbmxpc3QuaCBkZWZpbmllcnQgdW5kCisgICAgICAgIHNvbGx0ZW4gYW4gZWluZW4gYWxsZ2VtZWluIHp1Z2FlbmdsaWNoZW4gUGxhdHoga29waWVydCB3ZXJkZW4uCisgICAgICAgIERpZSBSdWVja2dhYmV3ZXJ0ZSBzaW5kIGluIG11ZGxpYi9zeXMvbHBjdHlwZXMuaCBkZWZpbmllcnQsIGRpZQorICAgICAgICBhdWNoIGluIGRpZSBNdWRsaWIga29waWVydCB3ZXJkZW4gc29sbHRlbi4KKworQUVOREVSVU5HRU4KKyAgICAgICAgRWluZ2VmdWVocnQgaW4gTERNdWQgMy4yLjEwCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgaW5oZXJpdF9saXN0KEUpLCBmdW5jdGlvbmxpc3QoRSksIHZhcmlhYmxlX2V4aXN0cyhFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vd2Fsa19tYXBwaW5nIGIvZG9jL2VmdW4vd2Fsa19tYXBwaW5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczOTZmY2YKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi93YWxrX21hcHBpbmcKQEAgLTAsMCArMSw4OCBAQAord2Fsa19tYXBwaW5nKEUpCisKK0ZVTktUSU9OOgorICAgICAgICB2b2lkIHdhbGtfbWFwcGluZyhtYXBwaW5nIG0sIHN0cmluZyBmdW4gWywgbWl4ZWQgZXh0cmEsIC4uLl0pCisgICAgICAgIHZvaWQgd2Fsa19tYXBwaW5nKG1hcHBpbmcgbSwgc3RyaW5nIGZ1biwgc3RyaW5nfG9iamVjdCBvYgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBtaXhlZCBleHRyYSwuLi4pCisgICAgICAgIHZvaWQgd2Fsa19tYXBwaW5nKG1hcHBpbmcgbSwgY2xvc3VyZSBjbCwgbWl4ZWQgZXh0cmEsLi4uKQorCitQQVJBTUVURVI6CisgICAgIG0JCS0gZHVyY2h6dWdlaGVuZGVzIE1hcHBpbmcKKyAgICAgZnVuL2NsCS0genUgcnVmZW5kZSBNZXRob2RlL0Nsb3N1cmUKKyAgICAgb2IJCS0gT2JqZWt0L0RhdGVpbmFtZSwgYW4gZGVtIE1ldGhvZGUgZ2VydWZlbiB3ZXJkZW4gc29sbAorICAgICBleHRyYQktIHdlaXRlcmUgUGFyYW1ldGVyIGZ1ZXIgTWV0aG9kZS9DbG9zdXJlCisKK0JFU0NIUkVJQlVORzoKKyAgICAgUnVmdCBkaWUgTWV0aG9kZSBmdWVyIGplZGVuIEVpbnRyYWcgaW0gTWFwcGluZzoKKyAgICAgIG9iLT5mdW5jKGtleSwgdmFsdWUxLCAuLi4sIHZhbHVlTiwgZXh0cmEsLi4uKQorICAgICBiZXppZWh1bmdzd2Vpc2UgZnVlaHJ0IGRpZSBDbG9zdXJlIGZ1ZXIgamVkZW4gZGllc2VyIEVpbnRyYWVnZSBhdXM6CisgICAgICBmdW5jYWxsKGNsLCBrZXksIHZhbHVlMSwgLi4uLCB2YWx1ZU4sIGV4dHJhLC4uLikKKworICAgICBEaWUgU2NobHVlc3NlbCB3ZXJkZW4gYWxzIFdlcnQgdWViZXJnZWJlbiB1bmQgZGllIGRhenVnZWhvZXJpZ2VuIFdlcnRlCisgICAgIHBlciBSZWZlcmVueiwgZGllc2Uga29lbm5lbiBzb21pdCBhbHNvIGluIGRlciBGdW5rdGlvbi9DbG9zdXJlIGdlYWVuZGVydAorICAgICB3ZXJkZW4uCisKKworICAgICBWZXJ3ZW5kdW5nIHZvbiBNZXRob2RlbjoKKwlXZW5uIGJlaSBkZXIgQW5nYWJlIHZvbiAnZnVuJyBrZWluIE9iamVrdCAnb2InIGluIEZvcm0gZWluZXMgU3RyaW5ncworCW9kZXIgT2JqZWt0cyBhbmdlZ2ViZW4gd2lyZCwgd2lyZCB0aGlzX29iamVjdCgpIGFuZ2Vub21tZW4uCisKKyAgICAgVmVyd2VuZHVuZyB2b24gQ2xvc3VyZXM6CisJRXMga29lbm5lbiBzb3dvaGwgTGZ1bi1DbG9zdXJlcyBhbHMgYXVjaCBMYW1iZGEtQ2xvc3VyZXMgdmVyd2VuZGV0CisJd2VyZGVuLiBMZnVuLUNsb3N1cmVzIGtvZW5uZW4sIHdlbm4gaW0gc2VsYmVuIE9iamVrdCB2b3JoYW5kZW4gYXVjaAorCSdwcml2YXRlJyBvZGVyL3VuZCAnc3RhdGljJyBkZWtsYXJpZXJ0IHNlaW4sIG11ZXNzZW4gYWJlciB6dSBkZW0KKwlaZWl0cHVua3QgZGVyIFZlcndlbmR1bmcgYmVrYW5udCBzZWluIChGdW5rdGlvbnNwcm90b3R5cGVuIGJlbnV0emVuKS4KKworQkVJU1BJRUxFOgorICAgICAvLyBMaXN0ZSBtaXQgU3BpZWxlcm4gZHVyY2hnZWhlbiAuLi4KKyAgICAgbWFwcGluZyB4PShbIFsvaHVtYW46bGlhZmFyXTogIDIwLAorCQkgIFsvZHdhcmY6bWVzaXJpaV06IDUwLAorCQkgIFsvZWxmOnphcm5peWFdOiAgIDQwLAorCQkgIFsvZmVsaW5lOnR1cmJvXTogIDMwXSk7CisKKyAgICAgLy8gLi4uIHVuZCBXZXJ0ZSBhZW5kZXJuOgorICAgICB2b2lkIGFkZF92YWwob2JqZWN0IGtleSwgaW50IHZhbCwgaW50IGFkZCkgeworICAgICAgIGlmKGtleS0+SW5GaWdodCgpKQorICAgICAgICAgdmFsKz1hZGQ7CisgICAgICAgZWxzZQorICAgICAgICAgdmFsLT1hZGQ7CisgICAgIH0KKworICAgICAvLyB2ZXJzY2hpZWRlbmUgQXVmcnVmYXJ0ZW4sIGlkZW50aXNjaGVzIFJlc3VsdGF0OgorICAgICB3YWxrX21hcHBpbmcoeCwgImFkZF92YWwiLCAwLCAxMCk7CisgICAgIHdhbGtfbWFwcGluZyh4LCAiYWRkX3ZhbCIsIHRoaXNfb2JqZWN0KCksIDEwCisgICAgIHdhbGtfbWFwcGluZyh4LCAiYWRkX3ZhbCIsICIvcGxheWVycy9qb2YvYWRkaWVyb2JqZWt0bWl0bWV0aG9kZSIsIDEwKTsKKworICAgICB3YWxrX21hcHBpbmcoeCwgIydhZGRfdmFsLCAxMCk7CisKKworQWVRVUlWQUxFTlpDT0RFIChuaWNodCBlbXBmb2hsZW4sIG51ciB6dW0gVmVyc3RhZW5kbmlzISk6CisgICAgIC8vIHNvIHJpY2h0aWcgYWVxdWl2YWxlbnQgd2lyZCBlcyBudXIgbWl0IGVpbmVyIENsb3N1cmUgaGllcgorICAgICBpbnQgaSwgd2lkdGg7CisgICAgIG1hcHBpbmcgaW5wdXQ7CisgICAgIG1peGVkICppbmRleCwgKnBhcmFtOworCisgICAgIHdpZHRoPWdldF90eXBlX2luZm8oaW5wdXQpWzFdOworICAgICBwYXJhbT1hbGxvY2F0ZSh3aWR0aCk7CisgICAgIGluZGV4PW1faW5kaWNlcyhpbnB1dCk7CisgICAgIGk9c2l6ZW9mKGluZGV4KTsKKyAgICAgd2hpbGUoaS0tKSB7CisgICAgICAgaj13aWR0aDsKKyAgICAgICB3aGlsZShqLS0gPiAxKQorICAgICAgICAgcGFyYW1bal09aW5wdXRbaW5kZXhbaV0sal07CisgICAgICAgalswXT1pbmRleFtpXTsKKworICAgICAgIGFwcGx5KGNsLCBwYXJhbSk7CisgICAgICAgLy8gZnVuKGluZGV4W2ldLCBpbnB1dFtpbmRleFtpXSwwXSwgaW5wdXRbaW5kZXhbaV0sMV0sIC4uLik7CisgICAgICB9CisKK1NJRUhFIEFVQ0g6CisgICAgIEFycmF5czoJCWZpbHRlcihFKSwgbWFwKEUpCisgICAgIE9iamVrdGFycmF5czoJZmlsdGVyX29iamVjdHMoRSksIG1hcF9vYmplY3RzKEUpCisgICAgIE1hcHBpbmdzOgkJZmlsdGVyX2luZGljZXMoRSksIG1hcF9pbmRpY2VzKEUpCisKKyAgICAgU29uc3RpZ2VzOgkJbV9jb250YWlucyhFKQorCQkJbWVtYmVyKCkKKwkJCW1faW5kaWNlcyhFKSwgbV92YWx1ZXMoRSkKKworMjAuSmFuIDIwMDUgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9lZnVuL3dpZHRob2YgYi9kb2MvZWZ1bi93aWR0aG9mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYWM1OTkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi93aWR0aG9mCkBAIC0wLDAgKzEsMTYgQEAKK1NZTk9QU0lTCisgICAgICAgIGludCB3aWR0aG9mKG1hcHBpbmcgbWFwKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIExpZWZlcnQgZGllIEFuemFobCBWYWx1ZXMgcHJvIEtleSBpbSBNYXBwaW5nIDxtYXA+LiBXZW5uIDxtYXA+IDAgaXN0LAorICAgICAgICBpc3QgZGFzIFJlc3VsdGF0IDAuCisKK0JFSVNQSUVMCisgICAgICAgIG1hcHBpbmcgbWFwID0gKFsiZm9vIiA6IDE7Ml0pOworICAgICAgICB3aWR0aG9mKG1hcCkgICAgZXJnaWJ0IDIuCisKK0FFTkRFUlVOR0VOCisgICAgICAgIEVpbmdlZnVlaHJ0IGluIExETXVkIDMuMi42CisKK1NJRUhFIEFVQ0gKKyAgICAgICAgc2l6ZW9mKEUpLCBta21hcHBpbmcoRSksIG1fcmVhbGxvY2F0ZShFKSwgbV92YWx1ZXMoRSksIHVubWttYXBwaW5nKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi93aXpsaXN0X2luZm8gYi9kb2MvZWZ1bi93aXpsaXN0X2luZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc0ZWM5YQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL3dpemxpc3RfaW5mbwpAQCAtMCwwICsxLDM4IEBACitTWU5PUFNJUworICAgICAgICAjaW5jbHVkZSA8d2l6bGlzdC5oPgorCisgICAgICAgIG1peGVkICogd2l6bGlzdF9pbmZvKCkKKworREVTQ1JJUFRJT04KKyAgICAgICAgUmV0dXJucyBhbiBhcnJheSB3aXRoIHRoZSBpbnRlcmVzdGluZyBlbnRyaWVzIG9mIHRoZSB3aXpsaXN0LgorICAgICAgICBOZWVkcyB0byBiZSBwcml2aWxlZ2VkIGJ5IHRoZSBtYXN0ZXIgb2JqZWN0LgorCisgICAgICAgIFRoZSByZXN1bHQgaXMgYW4gYXJyYXkgd2l0aCBvbmUgZW50cnkgZm9yIGV2ZXJ5IHdpemFyZCAodWlkKS4KKyAgICAgICAgRXZlcnkgZW50cnkgaXMgYW4gYXJyYXkgaXRzZWxmOgorCisgICAgICAgICAgc3RyaW5nIHdbV0xfTkFNRV0gICAgICAgID0gTmFtZSBvZiB0aGUgd2l6YXJkLgorICAgICAgICAgIGludCAgICB3W1dMX0NPTU1BTkRTXSAgICA9IFdlaWdodGVkIG51bWJlciBvZiBjb21tYW5kcyBleGVjdXRlIGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0cyBvZiB0aGlzIHdpemFyZC4KKyAgICAgICAgICBpbnQgICAgd1tXTF9DT1NUXSwKKyAgICAgICAgICBpbnQgICAgd1tXTF9HSUdBQ09TVF0gICAgICAgPSBXZWlnaHRlZCBzdW0gb2YgZXZhbF9jb3N0cy4KKyAgICAgICAgICBpbnQgICAgd1tXTF9UT1RBTF9DT1NUXSwKKyAgICAgICAgICBpbnQgICAgd1tXTF9UT1RBTF9HSUdBQ09TVF0gPSBUb3RhbCBzdW0gb2YgZXZhbF9jb3N0cy4KKyAgICAgICAgICBpbnQgICAgd1tXTF9IRUFSVF9CRUFUU10gICA9IFdlaWdodGVkIGNvdW50IG9mIGhlYXJ0X2JlYXRzLgorICAgICAgICAgIGludCAgICB3W1dMX0NBTExfT1VUXSAgICAgID0gUmVzZXJ2ZWQgZm9yIGNhbGxfb3V0KCkgKHVudXNlZCB5ZXQpLgorICAgICAgICAgIGludCAgICB3W1dMX0FSUkFZX1RPVEFMXSAgID0gVG90YWwgc2l6ZSBvZiBhcnJheXMgaW4gZWxlbWVudHMuCisgICAgICAgICAgaW50ICAgIHdbV0xfTUFQUElOR19UT1RBTF0gPSBUb3RhbCBzaXplIG9mIG1hcHBpbmdzIGluIGVsZW1lbnRzLgorICAgICAgICAgIGludCAgICB3W1dMX1NUUlVDVF9UT1RBTF0gID0gVG90YWwgc2l6ZSBvZiBzdHJ1Y3RzIGluIGVsZW1lbnRzLgorICAgICAgICAgIG1peGVkICB3W1dMX0VYVFJBXSAgICAgICAgID0gRXh0cmEgd2l6bGlzdC1pbmZvIGlmIHNldC4KKworICAgICAgICBUaGUgJ3dlaWdodGVkJyBlbnRyaWVzIGRlY2F5IGV2ZXJ5IGhvdXIgYnkgMTAlLgorCitISVNUT1JZCisgICAgICAgIExETXVkIDMuMi4xMCBzcGxpdCB0aGUgb2xkIFdMX0VWQUxfQ09TVCBpbnRvIFdMX0NPU1QgYW5kIFdMX0dJR0FDT1NUCisgICAgICAgICAgdG8gYWNjb21vZGF0ZSBmb3IgbG9uZ2VyIHVwdGltZXMsIGFuZCBpbnRyb2R1Y2VkCisgICAgICAgICAgV0xfVE9UQUxfQ09TVC9XTF9UT1RBTF9HSUdBQ09TVC4KKyAgICAgICAgTERNdWQgMy4zLjE3NCBhZGRlZCBXTF9NQVBQSU5HX1RPVEFMLgorICAgICAgICBMRE11ZCAzLjMuPyBhZGRlZCBXTF9TVFJVQ1RfVE9UQUwuCisKK1NFRSBBTFNPCisgICAgICAgIHByaXZpbGVnZV92aW9sYXRpb24oTSksIHNldF9leHRyYV93aXppbmZvX3NpemUoRSkKKyAgICAgICAgZ2V0X2V4dHJhX3dpemluZm8oRSksIHNldF9leHRyYV93aXppbmZvKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi93cml0ZSBiL2RvYy9lZnVuL3dyaXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMDQxYjAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi93cml0ZQpAQCAtMCwwICsxLDM3IEBACitTWU5PUFNJUzoKKyAgICAgICAgdm9pZCB3cml0ZShtaXhlZCBtc2cpCisKK0RFU0NSSVBUSU9OOgorICAgICAgICBXcml0ZSBvdXQgc29tZXRoaW5nIHRvIHRoZSBjdXJyZW50IHBsYXllci4gV2hhdCBleGFjdGx5IHdpbGwKKyAgICAgICAgYmUgcHJpbnRlZCBpbiB0aGUgZW5kIGRlcGVuZHMgb2YgdGhlIHR5cGUgb2YgbXNnLgorICAgICAgICBQbGVhc2UgbWluZDogaWYgdGhlcmUgaXMgbm8gY3VycmVudCBwbGF5ZXIgKHRoaXNfcGxheWVyKCkpLCB0aGUKKyAgICAgICAgZnVuY3Rpb24gd2lsbCBvdXRwdXQgZGlyZWN0bHkgdG8gdGhlIGRyaXZlciBkZWJ1ZyBsb2cuIFBsZWFzZSBjaGVjaworICAgICAgICBiZWZvcmUhCisgICAgICAgIAorICAgICAgICBJZiBpdCBpcyBhIHN0cmluZyBvciBhIG51bWJlciB0aGVuIGp1c3QgcHJpbnRzIGl0IG91dC4KKyAgICAgICAgCisgICAgICAgIElmIGl0IGlzIGFuIG9iamVjdCB0aGVuIHRoZSBvYmplY3Qgd2lsbCBiZSBwcmludGVkIGluIHRoZQorICAgICAgICBmb3JtOiAiT0JKKCIrb2JqZWN0X25hbWUoKG9iamVjdCltaXgpKyIpIgorICAgICAgICAKKyAgICAgICAgSWYgaXQgaXMgYW4gYXJyYXkganVzdCAiPEFSUkFZPiIgd2lsbCBiZSBwcmludGVkLgorICAgICAgICAKKyAgICAgICAgSWYgdGhlIHdyaXRlKCkgZnVuY3Rpb24gaXMgaW52b2tlZCBieSBhIGNvbW1hbmQgb2YgYW4gbGl2aW5nCisgICAgICAgIGJ1dCBub3QgaW50ZXJhY3RpdmUgb2JqZWN0IGFuZCB0aGUgZ2l2ZW4gYXJndW1lbnQgaXMgYSBzdHJpbmcKKyAgICAgICAgdGhlbiB0aGUgbGZ1biBjYXRjaF90ZWxsKCkgb2YgdGhlIGxpdmluZyB3aWxsIGJlIGludm9rZWQgd2l0aAorICAgICAgICB0aGUgbWVzc2FnZSBhcyBhcmd1bWVudC4KKworRVhBTVBMRVM6CisgICAgICAgIHdyaXRlKCJIZWxsbyB3b3JsZCFcbiIpOworICAgICAgICAKKyAgICAgICAgSnVzdCBwcmludCBvdXQgYSBzdHJpbmcuCisgICAgICAgIAorICAgICAgICB3cml0ZSh0aGlzX3BsYXllcigpKTsKKyAgICAgICAgCisgICAgICAgIFRoaXMgd2lsbCBwcmludCBvdXQgc29tZXRoaW5nIGxpa2UgIk9CSihzdGQvcGxheWVyIzEyMzQpIi4KKyAgICAgICAgCisgICAgICAgIHdyaXRlKCAoeyAiYmx1YiIgfSkgKTsKKyAgICAgICAgCisgICAgICAgIFdpbGwgcHJpbnQgb3V0ICI8QVJSQVk+Ii4KKyAgICAgICAgCitTRUUgQUxTTzoKKyAgICAgICAgc2F5KEUpLCB0ZWxsX29iamVjdChFKSwgdGVsbF9yb29tKEUpLCBzaG91dChFKSwgY2F0Y2hfdGVsbChMKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vd3JpdGVfYnl0ZXMgYi9kb2MvZWZ1bi93cml0ZV9ieXRlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjc1NDg0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4vd3JpdGVfYnl0ZXMKQEAgLTAsMCArMSwxMSBAQAorU1lOT1BTSVMKKyAgICAgICAgaW50IHdyaXRlX2J5dGVzKHN0cmluZyBmaWxlLCBpbnQgc3RhcnQsIHN0cmluZyBzdHIpOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgU2NocmVpYnQgZGVuIFN0cmluZyA8c3RyPiBpbnMgRmlsZSA8ZmlsZT4gdW5kIHVlYmVyc2NocmVpYnQgZGFiZWkgZGllCisgICAgICAgIGFsdGVuIEJ5dGVzIGFiIFBvc2l0aW9uIDxzdGFydD4uIFdlbm4gPHN0YXJ0PiBlaW5lIG5lZ2F0aXZlIFphaGwgaXN0LAorICAgICAgICB3ZXJkZW4gZGllIFplaWNoZW4gdm9tIEVuZGUgdm9uIDxmaWxlPiBhbiBnZXphZWhsdC4gd3JpdGVfYnl0ZXMoKQorICAgICAgICBsaWVmZXJ0IDEgYmVpIEVyZm9sZywgMCBiZWkgTWlzc2VyZm9sZy4KKworU0lFSEUgQVVDSAorICAgICAgICBzYXZlX29iamVjdChFKSwgd3JpdGVfZmlsZShFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4vd3JpdGVfZmlsZSBiL2RvYy9lZnVuL3dyaXRlX2ZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc5ZmI2YgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL3dyaXRlX2ZpbGUKQEAgLTAsMCArMSwxNCBAQAorU1lOT1BTSVMKKyAgICAgICAgaW50IHdyaXRlX2ZpbGUoc3RyaW5nIGZpbGUsIHN0cmluZyBzdHIpOworICAgICAgICBpbnQgd3JpdGVfZmlsZShzdHJpbmcgZmlsZSwgc3RyaW5nIHN0ciwgaW50IGZsYWdzKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIEhhZW5ndCBkZW4gU3RyaW5nIDxzdHI+IGFuIGRpZSBEYXRlaSA8ZmlsZT4gYW4uIExpZWZlcnQgMSBiZWkgRXJmb2xnLAorICAgICAgICAwIGJlaSBNaXNzZXJmb2xnLgorCisgICAgICAgIElmIDxmbGFncz4gPSAxLCBkYW5uIHdpcmQgZGllIERhdGVpIHZvciBkZW0gZWlnZW50bGljaGVuCisgICAgICAgIFNjaHJlaWJlbiBnZWxvZXNjaHQ7IGRhcyAnYW5oYWVuZ2VuJyB3aXJkIHNvIGVmZmVrdGl2IGVpbgorICAgICAgICAndWViZXJzY2hyZWliZW4nLiBEZWZhdWx0d2VydCBmdWVyIDxmbGFncz4gaXN0IDAuCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgZmlsZV9zaXplKEUpLCBjYXQoRSksIHdyaXRlX2J5dGVzKEUpLCByZWFkX2ZpbGUoRSksIHJtKEUpCmRpZmYgLS1naXQgYS9kb2MvZWZ1bi94bWxfZ2VuZXJhdGUgYi9kb2MvZWZ1bi94bWxfZ2VuZXJhdGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY1MDZlMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lZnVuL3htbF9nZW5lcmF0ZQpAQCAtMCwwICsxLDc3IEBACitPUFRJT05BTAorRVhQRVJJTUVOVEFMCitTWU5PUFNJUworICAgICAgICAjaW5jbHVkZSA8eG1sLmg+CisKKyAgICAgICAgc3RyaW5nIHhtbF9nZW5lcmF0ZShtaXhlZCAqeG1sKQorCitCRVNDSFJFSUJVTkcKKyAgICAgICAgV2FuZGVsdCBkYXMgdWViZXJnZWJlbmUgPHhtbD4tQXJyYXkgaW4gZWluZW4gWE1MLWtvbmZvcm1lbiBTdHJpbmcgdW0sCisgICAgICAgIHNvZmVybiBtb2VnbGljaC4gRGVyIDx4bWw+LVBhcmFtZXRlciBtdXNzIGZvbGdlbmRlIFN0cnVrdHVyIGhhYmVuOgorCisgICAgICAgIEVyIG11c3MgVGFnLUFycmF5cyBtaXQgZm9sZ2VuZGVuIGRyZWkgRWxlbWVudGVuIGVudGhhbHRlbjoKKworICAgICAgICAgICAgc3RyaW5nIFhNTF9UQUdfTkFNRQorICAgICAgICAgICAgICAgIERlciBOYW1lIGRlcyBYTUwtVGFncy4KKworICAgICAgICAgICAgbWFwcGluZyBYTUxfVEFHX0FUVFJJQlVURVMKKyAgICAgICAgICAgICAgICBBbGxlIEF0dHJpYnV0ZSBkaWVzZXMgWE1MLVRhZ3MgYWxzIGVpbiBNYXBwaW5nIG1pdCBkZW0KKyAgICAgICAgICAgICAgICBqZXdlaWxpZ2VuIEF0dHJpYnV0bmFtZW4gYWxzIFNjaGx1ZXNzZWwgdW5kIGRlbiBBdHRyaWJ1dHdlcnQKKyAgICAgICAgICAgICAgICBhbHMgZGVyIGRhenVnZWhvZXJpZ2UgU3RyaW5nLgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEZhbGxzIGVpbiBYTUwtVGFnIGtlaW5lIEF0dHJpYnV0ZSBlbnRoYWVsdCwgc28gaXN0IGRpZXNlcworICAgICAgICAgICAgICAgIEVsZW1lbnQgMC4KKworICAgICAgICAgICAgbWl4ZWQgKiBYTUxfVEFHX0NPTlRFTlRTCisgICAgICAgICAgICAgICAgRGVyIEluaGFsdCBkZXMgWE1MLVRhZ3MgYWxzIGVpbiBBcnJheS4gRGllc2VzIEFycmF5IGthbm4KKyAgICAgICAgICAgICAgICBlbnR3ZWRlciBTdHJpbmdzIChyZWluZSBaZWljaGVuZGF0ZW4pIG9kZXIgQXJyYXlzCisgICAgICAgICAgICAgICAgYWxzIHdlaXRlcmUgVGFncyBlbnRoYWx0ZW4sIHdlbGNoZSB3aWVkZXJ1bSBkaWVzZQorICAgICAgICAgICAgICAgIGRyZWkgRWxlbWVudGUgYmVzaXR6ZW4uCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgRmFsbHMgZGFzIFhNTC1UYWcgbmljaHRzIGVudGhhZWx0LCBzbyBpc3QgZGllc2VzIEVsZW1lbnQgMC4KKworICAgICAgICBGYWxscyBkZXIgdWViZXJnZWJlIFBhcmFtZXRlciBuaWNodCBkaWVzZSBTdHJ1a3R1ciBiZXNpdHp0LCBzbyB3aXJkCisgICAgICAgIGVpbmUgRmVobGVybWVsZHVuZyBhdXNnZWdlYmVuLiBBbnNvbnN0ZW4gaXN0IGVpbiBndWVsdGlnZXIgWE1MLVN0cmluZworICAgICAgICBkYXMgUmVzdWx0YXQuCisKKyAgICAgICAgRGllc2UgRnVua3Rpb24gaXN0IG51ciB2ZXJmdWVnYmFyLCB3ZW5uIGRlciBEcml2ZXIgbWl0IElrc2VtZWwtCisgICAgICAgIFVudGVyc3R1ZXR6dW5nIGNvbXBpbGllcnQgd3VyZGUuIEluIGRpZXNlbSBGYWxsIGlzdCBkYXMgTWFrcm8KKyAgICAgICAgX19YTUxfRE9NX18gZGVmaW5pZXJ0LgorCitCRUlTUElFTAorICAgICAgICB4bWxfZ2VuZXJhdGUoKHsgImFiYyIsIDAsIDAgfSkpIC0+ICI8YWJjLz4iCisgICAgICAgIHhtbF9nZW5lcmF0ZSgoeyAiYWJjIiwgKFsgInh5eiIgOiAiY2RlIiBdKSwgMCB9KSkgLT4gIjxhYmMgeHl6PSJjZGUiLz4iCisKKyAgICAgICAgbWl4ZWQqIHhtbCA9ICh7ICJidWNoIgorICAgICAgICAgICAgICAgICAgICAgICwgKFsgInNwcmFjaGUiIDogImRldXRzY2giIF0pCisgICAgICAgICAgICAgICAgICAgICAgLCAoeyAoeyAidGl0ZWwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAoeyAiRGllcyBpc3QgZGVyIFRpdGVsIiB9KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAsICh7ICJrYXBpdGVsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgKHsgIkRpZXMgaXN0IGVpbiBLYXBpdGVsIiB9KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAsICh7ICJrYXBpdGVsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgKHsgIkRhcyBzb2xsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICh7ICJiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICh7ICJmZXR0Z2VkcnVja3QiIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIiBzZWluLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgIH0pCisKKyAgICAgICAgeG1sX2dlbmVyYXRlKHhtbCkKKyAgICAgICAgICAgIC0+ICI8YnVjaCBzcHJhY2hlPSJkZXV0c2NoIj48dGl0ZWw+RGllcyBpc3QgZGVyIFRpdGVsPC90aXRlbD4iCisgICAgICAgICAgICAgICAiPGthcGl0ZWw+RGllcyBpc3QgZWluIEthcGl0ZWw8L2thcGl0ZWw+PGthcGl0ZWw+RGFzIHNvbGwgIgorICAgICAgICAgICAgICAgIjxiPmZldHRnZWRydWNrdDwvYj4gc2Vpbi48L2thcGl0ZWw+PC9idWNoPiIKKworR0VTQ0hJQ0hURQorICAgICAgICBFaW5nZWZ1ZWhydCBpbiBMRE11ZCAzLjMuNzE4LgorCitTSUVIRSBBVUNICisgICAgICAgIHhtbF9wYXJzZShFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4veG1sX3BhcnNlIGIvZG9jL2VmdW4veG1sX3BhcnNlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NDljOWEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWZ1bi94bWxfcGFyc2UKQEAgLTAsMCArMSw3OCBAQAorT1BUSU9OQUwKK0VYUEVSSU1FTlRBTAorU1lOT1BTSVMKKyAgICAgICAgI2luY2x1ZGUgPHhtbC5oPgorCisgICAgICAgIG1peGVkKiB4bWxfcGFyc2Uoc3RyaW5nIHhtbCkKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIFBhcnN0IGRlbiBhbmdlZ2ViZW5lbiBTdHJpbmcgPHhtbD4gYWxzIFhNTC4gRGVyIFN0cmluZyBkYXJmIG51ciBlaW4KKyAgICAgICAgZWluemlnZXMgUm9vdC1UYWcgZW50aGFsdGVuLCB3ZWl0ZXJlIFJvb3QtVGFncyB3ZXJkZW4gaWdub3JpZXJ0LgorCisgICAgICAgIEZhbGxzIGRlciBTdHJpbmcgWE1MLWtvbmZvcm0gd2FyLCBzbyB3aXJkIGVpbiBBcnJheSBtaXQgZHJlaSBFbGVtZW50ZW4KKyAgICAgICAgenVydWVja2dlZ2ViZW4sIGRlc3NlbiBFbGVtZW50ZSBmb2xnZW5kZXJtYXNzZW4gZGVmaW5pZXJ0IHNpbmQ6CisKKyAgICAgICAgICAgIHN0cmluZyBYTUxfVEFHX05BTUUKKyAgICAgICAgICAgICAgICBEZXIgTmFtZSBkZXMgWE1MLVRhZ3MuCisKKyAgICAgICAgICAgIG1hcHBpbmcgWE1MX1RBR19BVFRSSUJVVEVTCisgICAgICAgICAgICAgICAgQWxsZSBBdHRyaWJ1dGUgZGllc2VzIFhNTC1UYWdzIGFscyBlaW4gTWFwcGluZyBtaXQgZGVtCisgICAgICAgICAgICAgICAgamV3ZWlsaWdlbiBBdHRyaWJ1dG5hbWVuIGFscyBTY2hsdWVzc2VsIHVuZCBkZW4gQXR0cmlidXR3ZXJ0CisgICAgICAgICAgICAgICAgYWxzIGRlciBkYXp1Z2Vob2VyaWdlIFN0cmluZy4KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBGYWxscyBlaW4gWE1MLVRhZyBrZWluZSBBdHRyaWJ1dGUgZW50aGFlbHQsIHNvIGlzdCBkaWVzZXMKKyAgICAgICAgICAgICAgICBFbGVtZW50IDAuCisKKyAgICAgICAgICAgIG1peGVkICogWE1MX1RBR19DT05URU5UUworICAgICAgICAgICAgICAgIERlciBJbmhhbHQgZGVzIFhNTC1UYWdzIGFscyBlaW4gQXJyYXkuIERpZXNlcyBBcnJheSBrYW5uCisgICAgICAgICAgICAgICAgZW50d2VkZXIgU3RyaW5ncyAocmVpbmUgWmVpY2hlbmRhdGVuKSBvZGVyIEFycmF5cworICAgICAgICAgICAgICAgIGFscyB3ZWl0ZXJlIFRhZ3MgZW50aGFsdGVuLCB3ZWxjaGUgd2llZGVydW0gZGllc2UKKyAgICAgICAgICAgICAgICBkcmVpIEVsZW1lbnRlIGJlc2l0emVuLgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEZhbGxzIGRhcyBYTUwtVGFnIG5pY2h0cyBlbnRoYWVsdCwgc28gaXN0IGRpZXNlcyBFbGVtZW50IDAuCisKKyAgICAgICAgRmFsbHMgZGVyIFhNTC1TdHJpbmcgbmljaHQgd29obGdlZm9ybXQgaXN0IG9kZXIgZmFsbHMgbmljaHQgZ2VudWcgU3BlaWNoZXIKKyAgICAgICAgenVyIFZlcmZ1ZWd1bmcgc3RlaHQsIHdpcmQgZWluZSBGZWhsZXJtZWxkdW5nIGF1c2dlZ2ViZW4uCisKKyAgICAgICAgRGllc2UgRnVua3Rpb24gaXN0IG51ciB2ZXJmdWVnYmFyLCB3ZW5uIGRlciBEcml2ZXIgbWl0IElrc2VtZWwtCisgICAgICAgIFVudGVyc3R1ZXR6dW5nIGNvbXBpbGllcnQgd3VyZGUuIEluIGRpZXNlbSBGYWxsIGlzdCBkYXMgTWFrcm8KKyAgICAgICAgX19YTUxfRE9NX18gZGVmaW5pZXJ0LgorCitCRUlTUElFTAorICAgICAgICB4bWxfcGFyc2UoIjxhYmMvPiIpICAgICAgICAgICAtPiAoeyAiYWJjIiwgMCwgMCB9KQorICAgICAgICB4bWxfcGFyc2UoIjxhYmMgeHl6PSJjZGUiLz4iKSAtPiAoeyAiYWJjIiwgKFsgInh5eiIgOiAiY2RlIiBdKSwgMCB9KQorCisgICAgICAgIHhtbF9wYXJzZSgiPGJ1Y2ggc3ByYWNoZT0iZGV1dHNjaCI+IiArIAorICAgICAgICAgICAgICAgICAgIiAgICA8dGl0ZWw+RGllcyBpc3QgZGVyIFRpdGVsPC90aXRlbD4iICsgCisgICAgICAgICAgICAgICAgICAiICAgIDxrYXBpdGVsPkRpZXMgaXN0IGVpbiBLYXBpdGVsPC9rYXBpdGVsPiIgKyAKKyAgICAgICAgICAgICAgICAgICIgICAgPGthcGl0ZWw+RGFzIHNvbGwgPGI+ZmV0dGdlZHJ1Y2t0PC9iPiBzZWluLjwva2FwaXRlbD4iICsKKyAgICAgICAgICAgICAgICAgICI8L2J1Y2g+IikKKworICAgICAgICAgICAgLT4gKHsgImJ1Y2giCisgICAgICAgICAgICAgICAgLCAoWyAic3ByYWNoZSIgOiAiZGV1dHNjaCIgXSkKKyAgICAgICAgICAgICAgICAsICh7ICh7ICJ0aXRlbCIKKyAgICAgICAgICAgICAgICAgICAgICAsIDAKKyAgICAgICAgICAgICAgICAgICAgICAsICh7ICJEaWVzIGlzdCBkZXIgVGl0ZWwiIH0pCisgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICwgKHsgImthcGl0ZWwiCisgICAgICAgICAgICAgICAgICAgICAgLCAwCisgICAgICAgICAgICAgICAgICAgICAgLCAoeyAiRGllcyBpc3QgZWluIEthcGl0ZWwiIH0pCisgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICwgKHsgImthcGl0ZWwiCisgICAgICAgICAgICAgICAgICAgICAgLCAwCisgICAgICAgICAgICAgICAgICAgICAgLCAoeyAiRGllcyBzb2xsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAsICh7ICJiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICh7ICJmZXR0Z2VkcnVja3QiIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAgICAgICwgInNlaW4uIgorICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgfSkKKworR0VTQ0hJQ0hURQorICAgICAgICBFaW5nZWZ1ZWhydCBpbiBMRE11ZCAzLjMuNzE4LgorCitTSUVIRSBBVUNICisgICAgICAgIHhtbF9nZW5lcmF0ZShFKQpkaWZmIC0tZ2l0IGEvZG9jL2VmdW4veG9yX2JpdHMgYi9kb2MvZWZ1bi94b3JfYml0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjllYWI5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VmdW4veG9yX2JpdHMKQEAgLTAsMCArMSwxOSBAQAorU1lOT1BTSVMKKyAgICAgICAgc3RyaW5nIHhvcl9iaXRzKHN0cmluZyBzdHIxLCBzdHJpbmcgc3RyMik7CisKK0JFU0NIUkVJQlVORworICAgICAgICA8c3RyMT4gdW5kIDxzdHIyPiBzaW5kIGJlaWRlbiBCaXRzdHJpbmdzLiBEYXMgUmVzdWx0YXQgdm9uIHhvcl9iaXRzKCkKKyAgICAgICAgaXN0IGVpbiBCaXRzdHJpbmcgbWl0IGRlbSBiaW5hZXJlbiBYT1Igdm9uIDxzdHIxPiB1bmQgPHN0cjI+LCBhbHNvCisgICAgICAgIGVpbiBTdHJpbmcsIGluIGRlbSBlaW4gQml0IG51ciBnZXNldHp0IGlzdCwgd2VubiBlcyBlbnR3ZWRlciBpbiA8c3RyMT4KKyAgICAgICAgb2RlciBpbiA8c3RyMj4gdm9ya29tbXQsIG5pY2h0IGFiZXIgaW4gYmVpZGVuLgorCitCRUlTUElFTEUKKyAgICAgICAgc3RyaW5nIHMxLCBzMiwgczM7CisgICAgICAgIHMxID0gc2V0X2JpdCgiIiwgMyk7IHMxID0gc2V0X2JpdChzMSwgMTUpOyAgLT4gczEgaXN0ICIoICgiCisgICAgICAgIHMyID0gc2V0X2JpdCgiIiwgMyk7IHMyID0gc2V0X2JpdChzMiwgNCk7ICAgLT4gczIgaXN0ICI4IgorICAgICAgICBzMyA9IHhvcl9iaXRzKHMxLCBzMik7CisgICAgICAgIC0+IHMzIGlzdCAiMCAoIiwgZXMgc2luZCBhbHNvIGRhcyA0LiB1bmQgZGFzIDE1LiBCaXQgZ2VzZXR6dC4KKworU0lFSEUgQVVDSAorICAgICAgICBjbGVhcl9iaXQoRSksIHNldF9iaXQoRSksIHRlc3RfYml0KEUpLCBuZXh0X2JpdChFKSwgbGFzdF9iaXQoRSkKKyAgICAgICAgY291bnRfYml0cyhFKSwgYW5kX2JpdHMoRSksIG9yX2JpdHMoRSksIGludmVydF9iaXRzKEUpLCBjb3B5X2JpdHMoRSkKZGlmZiAtLWdpdCBhL2RvYy9ldmVudHMvRVZUX0dVSUxEX0FEVkFOQ0UgYi9kb2MvZXZlbnRzL0VWVF9HVUlMRF9BRFZBTkNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MjFmNDMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXZlbnRzL0VWVF9HVUlMRF9BRFZBTkNFCkBAIC0wLDAgKzEsMzYgQEAKK0VWRU5UOiAKKyAgIEVWVF9HVUlMRF9BRFZBTkNFCisKK0RFRklOSUVSVCBJTjoKKyAgIC9zeXMvZXZlbnRzLmgKKworR0VUUklHR0VSVCBWT046CisgICAvc3RkL2dpbGRlbl9vYi5jCisKK0JFU0NIUkVJQlVORzoKKyAgIERpZXNlciBFdmVudCB3aXJkIGltbWVyIGF1c2dlbG9lc3QsIHdlbm4gc2ljaCBkZXIgR2lsZGVubGV2ZWwgZWluZXMKKyAgIFNwaWVsZXJzIGVyaG9laHQgb2RlciBhdWNoLCB3ZW5uIG51ciBkZXIgR2lsZGVubGV2ZWwgZWluZXMgU3BpZWxlcnMgdm9uCisgICBlaW5lciBHaWxkZSBnZWFlbmRlcnQgd2lyZCAod2VpbCBzaWUga2VpbmUgR2lsZGVubGV2ZWwga2VubnQpLgorCitFVkVOVC1EQVRFTjoKKyAgIERpZSBEYXRlbiB3ZXJkZW4gYWxzIE1hcHBpbmcgdWViZXJnZWJlbjoKKyAgIChbIEVfT0JKRUNUOiAgICAgICAgIChvYmplY3QpIFNwaWVsZXJvYmpla3QKKyAgICAgIEVfUExOQU1FOiAgICAgICAgIChzdHJpbmcpIFVJRC9TcGllbGVybmFtZQorICAgICAgRV9FTlZJUk9OTUVOVDogICAgKG9iamVjdCkgRW52aXJvbm1lbnQgZGVzIFNwaWVsZXJzCisgICAgICBFX0dVSUxETkFNRTogICAgICAoc3RyaW5nKSBHaWxkZW5uYW1lCisgICAgICBQX0dVSUxEX0xFVkVMICAgICAoc3RyaW5nKSBzLiBQcm9wZXJ0eSwgbmV1ZXIgR2lsZGVubGV2ZWwKKyAgICAgIFBfR1VJTERfVElUTEU6ICAgIChzdHJpbmcpIHMuIFByb3BlcnR5LCBuZXVlciBHaWxkZW50aXRlbAorICAgICAgUF9TVUJHVUlMRF9USVRMRTogKHN0cmluZykgcy4gUHJvcGVydHksIG5ldWVyIFN1Ymd1aWxkLVRpdGxlCisgICAgXSkKKworQkVNRVJLVU5HRU46CisgICBXZW5uIEdpbGRlbiBrZWluZSBHaWxkZW5sZXZlbCBrZW5uZSwgc29uZGVybiBhbmRlcmUgRm9ybWVuIGRlcyBHaWxkZW5zdGF0dXMKKyAgIHZlcmdlYmVuIHVuZCBkZXIgR2lsZGVudGl0ZWwgYWxsZWluIG5pY2h0IGF1c3JlaWNodCwgIG11c3MgaGllciB1ZWJlciBlaW5lCisgICBFcmdhZW56dW5nIGRlciBEYXRlbiBuYWNoZ2VkYWNodCB3ZXJkZW4uCisKK1NJRUhFIEFVQ0g6CisgICBldmVudHMsIFJlZ2lzdGVyRXZlbnQoKSwgVW5yZWdpc3RlckV2ZW50KCksIFRyaWdnZXJFdmVudCgpLCBldmVudGQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzE2LjA4LjIwMDcsIFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL2V2ZW50cy9FVlRfR1VJTERfQ0hBTkdFIGIvZG9jL2V2ZW50cy9FVlRfR1VJTERfQ0hBTkdFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhY2I5MDYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXZlbnRzL0VWVF9HVUlMRF9DSEFOR0UKQEAgLTAsMCArMSwzMSBAQAorRVZFTlQ6IAorICAgRVZUX0dVSUxEX0NIQU5HRQorCitERUZJTklFUlQgSU46CisgICAvc3lzL2V2ZW50cy5oCisKK0dFVFJJR0dFUlQgVk9OOgorICAgL3NlY3VyZS9naWxkZW5tYXN0ZXIuYworCitCRVNDSFJFSUJVTkc6CisgICBEaWVzZXIgRXZlbnQgd2lyZCBpbW1lciBhdXNnZWxvZXN0LCB3ZW5uIGVpbiBTcGllbGVyIGVpbmUgR2lsZGUgd2VjaHNlbHQuCisgICBEYSBTcGllbGVyIGJlaSBlaW5lbSBHaWxkZW5hdXN0cml0dCBpbiBpaHJlciBTdGFuZGFyZGdpbGRlIGxhbmRlbiwgaXN0CisgICBqZWRlciBBdXMtIHVuZCBFaW50cml0dCBsZXR6dGVuZGxpY2ggZWluIFdlY2hzZWwuCisKK0VWRU5ULURBVEVOOgorICAgRGllIERhdGVuIHdlcmRlbiBhbHMgTWFwcGluZyB1ZWJlcmdlYmVuOgorICAgKFsgRV9PQkpFQ1Q6ICAgICAgICAgKG9iamVjdCkgU3BpZWxlcm9iamVrdCwgd2FzIGRpZSBHaWxkZSB3ZWNoc2VsdGUsCisgICAgICBFX1BMTkFNRTogICAgICAgICAoc3RyaW5nKSBVSUQvUGxheWVybmFtZSBkZXMgU3BpZWxlcnMsCisgICAgICBFX0VOVklST05NRU5UOiAgICAob2JqZWN0KSBFbnZpcm9ubWVudCBkZXMgU3BpZWxlcnMsCisgICAgICBFX0dVSUxETkFNRTogICAgICAoc3RyaW5nKSBuZXVlIEdpbGRlLAorICAgICAgRV9MQVNUX0dVSUxETkFNRTogKHN0cmluZykgYWx0ZSBHaWxkZSwKKyAgICBdKQorCitCRU1FUktVTkdFTjoKKworU0lFSEUgQVVDSDoKKyAgIGV2ZW50cywgUmVnaXN0ZXJFdmVudCgpLCBVbnJlZ2lzdGVyRXZlbnQoKSwgVHJpZ2dlckV2ZW50KCksIGV2ZW50ZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMTYuMDguMjAwNywgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2MvZXZlbnRzL0VWVF9MSUJfQURWQU5DRSBiL2RvYy9ldmVudHMvRVZUX0xJQl9BRFZBTkNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZDhmZDEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXZlbnRzL0VWVF9MSUJfQURWQU5DRQpAQCAtMCwwICsxLDMwIEBACitFVkVOVDogCisgICBFVlRfTElCX0FEVkFOQ0UKKworREVGSU5JRVJUIElOOgorICAgL3N5cy9ldmVudHMuaAorCitHRVRSSUdHRVJUIFZPTjoKKyAgIC9zdGQvZ2lsZGUuYworCitCRVNDSFJFSUJVTkc6CisgICBEaWVzZXMgRXZlbnQgd2lyZCBhdXNnZWxvZXN0LCB3ZW5uIHNpY2ggZGVyIFNwaWVsZXJsZXZlbCBlaW5lcyBTcGllbGVycworICAgYWVuZGVydC4gKE1vbWVudGFuIGVyaG9laHQgZXIgc2ljaCBudXIuKQorCitFVkVOVC1EQVRFTjoKKyAgIERpZSBEYXRlbiB3ZXJkZW4gYWxzIE1hcHBpbmcgdWViZXJnZWJlbjoKKyAgIChbIEVfT0JKRUNUOiAgICAgICAgIChvYmplY3QpIFNwaWVsZXJvYmpla3QKKyAgICAgIEVfUExOQU1FOiAgICAgICAgIChzdHJpbmcpIFVJRC9TcGllbGVybmFtZQorICAgICAgRV9FTlZJUk9OTUVOVDogICAgKG9iamVjdCkgRW52aXJvbm1lbnQgZGVzIFNwaWVsZXJzCisgICAgICBFX0dVSUxETkFNRTogICAgICAoc3RyaW5nKSBOYW1lIGRlciBHaWxkZSBkZXMgU3BpZWxlcnMKKyAgICAgIFBfTEVWRUw6ICAgICAgICAgIChpbnQpIHMuIFByb3AsIG5ldWVyIFNwaWVsZXJsZXZlbAorICAgIF0pCisKK0JFTUVSS1VOR0VOOgorCitTSUVIRSBBVUNIOgorICAgZXZlbnRzLCBSZWdpc3RlckV2ZW50KCksIFVucmVnaXN0ZXJFdmVudCgpLCBUcmlnZ2VyRXZlbnQoKSwgZXZlbnRkCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisxNi4wOC4yMDA3LCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9ldmVudHMvRVZUX0xJQl9DTE9DSyBiL2RvYy9ldmVudHMvRVZUX0xJQl9DTE9DSwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmZmNDUxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V2ZW50cy9FVlRfTElCX0NMT0NLCkBAIC0wLDAgKzEsMzIgQEAKK0VWRU5UOiAKKyAgIEVWVF9MSUJfQ0xPQ0sKKworREVGSU5JRVJUIElOOgorICAgL3N5cy9ldmVudHMuaAorCitHRVRSSUdHRVJUIFZPTjoKKyAgIC9vYmovdWhyLmMKKworQkVTQ0hSRUlCVU5HOgorICAgQWxsZSBWaWVydGVsc3R1bmRlIHdpcmQgZGllc2VyIEV2ZW50IGdlcnVmZW4uIFdlbm4gbWFuIEVyZWlnbmlzc2UgamV3ZWlscworICAgenVyIHZvbGxlbiBTdHVuZGUsIHh4OjE1LCB4eDozMCB1bmQgeHg6NDUgZHVyY2hmdWVocmVuIHdpbGwsIGJpZXRldCBlcyBzaWNoCisgICBhbiwgZGllc2VtIEV2ZW50IHp1IGxhdXNjaGVuLgorCitFVkVOVC1EQVRFTjoKKyAgIERpZSBEYXRlbiBzaW5kIGVpbiBNYXBwaW5nIG1pdCBkZW4gQXJyYXlpbmRpemVzIHZvbiBsb2NhbHRpbWUoKSBhbHMgS2V5cworICAgdW5kIGRlbiBkYXp1IGdlaG9lcmlnZW4gRGF0ZW4gYWxzIFZhbHVlcy4KKworQkVNRVJLVU5HRU46CisgICBXaWxsIG1hbiBlcm1pdHRlbG4sIGluIHdlbGNoZXIgVmllcnRlbHN0dW5kZSBtYW4gc2ljaCBnZXJhZGUgYmVmaW5kZXQsCisgICBiaWV0ZXQgc2ljaCAoKG1pbnV0ZW4vMTUpICUgNCkgYW4uIERhcyBlcmdpYnQgaW1tZXIgZWluZSBaYWhsIHp3aXNjaGVuIDAKKyAgIHVuZCAzLiAwLT4gdm9sbGUgU3R1bmRlLCAxLT4gdmllcnRlbCBuYWNoLCAyLT4gaGFsYiwgMy0+IHZpZXJ0ZWwgdm9yIHZvbGwuCisgICBIaWVyYmVpIHdpcmQgbmFjaCBCZW5hY2hyaWNodGlnZW4gZGVyIE9iamVrdCB1bSB1ZWJsaWNoZXJ3ZWlzZSAwLTJzCisgICB2ZXJ6b2VnZXJ0LCB3ZW5uIGVzIGFscyB3aXJrbGljaCBleGFrdCBzZWluIG11c3MsIGxhZXNzdCBzaWNoIGRpZXNlciBFdmVudAorICAgZGFubiBkb2NoIG5pY2h0IHZlcndlbmRlbi4KKworU0lFSEUgQVVDSDoKKyAgIGV2ZW50cywgUmVnaXN0ZXJFdmVudCgpLCBVbnJlZ2lzdGVyRXZlbnQoKSwgVHJpZ2dlckV2ZW50KCksIGV2ZW50ZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMjguMTEuMjAxMiwgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2MvZXZlbnRzL0VWVF9MSUJfREFURUNIQU5HRSBiL2RvYy9ldmVudHMvRVZUX0xJQl9EQVRFQ0hBTkdFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MzhiNDkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXZlbnRzL0VWVF9MSUJfREFURUNIQU5HRQpAQCAtMCwwICsxLDI0IEBACitFVkVOVDogCisgICBFVlRfTElCX0RBVEVDSEFOR0UKKworREVGSU5JRVJUIElOOgorICAgL3N5cy9ldmVudHMuaAorCitHRVRSSUdHRVJUIFZPTjoKKyAgIC9vYmovdWhyLmMKKworQkVTQ0hSRUlCVU5HOgorICAgRGllc2VyIEV2ZW50IHRyaXR0IGF1Ziwgd2VubiBzaWNoIGRhcyBEYXR1bSBhZW5kZXJ0LiBBbHNvIGltbWVyIHVtIDAwOjAwLgorCitFVkVOVC1EQVRFTjoKKyAgIERpZSBEYXRlbiBzaW5kIGVpbiBNYXBwaW5nIG1pdCBkZW4gQXJyYXlpbmRpemVzIHZvbiBsb2NhbHRpbWUoKSBhbHMgS2V5cworICAgdW5kIGRlbiBkYXp1IGdlaG9lcmlnZW4gRGF0ZW4gYWxzIFZhbHVlcy4KKworQkVNRVJLVU5HRU46CisKK1NJRUhFIEFVQ0g6CisgICBldmVudHMsIFJlZ2lzdGVyRXZlbnQoKSwgVW5yZWdpc3RlckV2ZW50KCksIFRyaWdnZXJFdmVudCgpLCBldmVudGQKKyAgIEVWVF9MSUJfQ0xPQ0sKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisyOC4xMS4yMDEyLCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9ldmVudHMvRVZUX0xJQl9MT0dJTiBiL2RvYy9ldmVudHMvRVZUX0xJQl9MT0dJTgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmNiYTMyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V2ZW50cy9FVlRfTElCX0xPR0lOCkBAIC0wLDAgKzEsMzIgQEAKK0VWRU5UOiAKKyAgIEVWVF9MSUJfTE9HSU4KKworREVGSU5JRVJUIElOOgorICAgL3N5cy9ldmVudHMuaAorCitHRVRSSUdHRVJUIFZPTjoKKyAgIC9zdGQvcGxheWVyL2Jhc2UuYworCitCRVNDSFJFSUJVTkc6CisgICBFaW4gU3BpZWxlciBoYXQgc2ljaCBnZXJhZGUgZWluZ2Vsb2dndC4KKyAgIEJpdHRlIGJlYWNodGVuOiBPYmpla3QgaW0gSW52ZW50YXIgdW5kIGltIEVudmlyb25tZW50IGVpbmVzIFNwaWVsZXIgc29sbHRlbgorICAgd2VpdGVyaGluIEJlY29tZXNOZXRBbGl2ZSgpIGJlbnV0emVuISBEaWVzZXIgRXZlbnQgaXN0IG51ciBmdWVyIE9iamVrdGUKKyAgIGdlZGFjaHQsIGRpZSBkYXMgRWlubG9nZ2VuIG1pdGtyaWVnZW4gd29sbGVuLCBhYmVyIG5pY2h0IGluIGRlciBOYWVoZSBkZXMKKyAgIFNwaWVsZXIgc2luZC4KKworRVZFTlQtREFURU46CisgICBEaWUgRGF0ZW4gd2VyZGVuIGFscyBNYXBwaW5nIHVlYmVyZ2ViZW46CisgICAoWyBFX09CSkVDVDogICAgICAob2JqZWN0KSBPYmpla3QgZGVzIGVpbmdlbG9nZ3RlbiBTcGllbGVycywKKyAgICAgIEVfUExOQU1FOiAgICAgIChzdHJpbmcpIFVJRC9OYW1lIGRlcyBlaW5nZWxvZ2d0ZW4gU3BpZWxlcnMsCisgICAgICBFX0VOVklST05NRU5UOiAob2JqZWN0KSBFbnZpcm9ubWVudCBuYWNoIGRlbSBFaW5sb2dnZW4sCisgICAgXSkKKworQkVNRVJLVU5HRU46CisKK1NJRUhFIEFVQ0g6CisgICBldmVudHMsIFJlZ2lzdGVyRXZlbnQoKSwgVW5yZWdpc3RlckV2ZW50KCksIFRyaWdnZXJFdmVudCgpLCBldmVudGQKKyAgIEVWVF9MSUJfTE9HT1VUCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisxNi4wOC4yMDA3LCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9ldmVudHMvRVZUX0xJQl9MT0dPVVQgYi9kb2MvZXZlbnRzL0VWVF9MSUJfTE9HT1VUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYjNhZmEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXZlbnRzL0VWVF9MSUJfTE9HT1VUCkBAIC0wLDAgKzEsMzIgQEAKK0VWRU5UOiAKKyAgIEVWVF9MSUJfTE9HT1VUCisKK0RFRklOSUVSVCBJTjoKKyAgIC9zeXMvZXZlbnRzLmgKKworR0VUUklHR0VSVCBWT046CisgICAvc3RkL3BsYXllci9iYXNlLmMKKworQkVTQ0hSRUlCVU5HOgorICAgRWluIFNwaWVsZXIgaGF0IHNpY2ggZ2VyYWRlIGF1c2dlbG9nZ3QuCisgICBCaXR0ZSBiZWFjaHRlbjogT2JqZWt0IGltIEludmVudGFyIHVuZCBpbSBFbnZpcm9ubWVudCBlaW5lcyBTcGllbGVyIHNvbGx0ZW4KKyAgIHdlaXRlcmhpbiBCZWNvbWVzTmV0RGVhZCgpIGJlbnV0emVuISBEaWVzZXIgRXZlbnQgaXN0IG51ciBmdWVyIE9iamVrdGUKKyAgIGdlZGFjaHQsIGRpZSBkYXMgQXVzbG9nZ2VuIG1pdGtyaWVnZW4gd29sbGVuLCBhYmVyIG5pY2h0IGluIGRlciBOYWVoZSBkZXMKKyAgIFNwaWVsZXIgc2luZC4KKworRVZFTlQtREFURU46CisgICBEaWUgRGF0ZW4gd2VyZGVuIGFscyBNYXBwaW5nIHVlYmVyZ2ViZW46CisgICAoWyBFX09CSkVDVDogICAgICAob2JqZWN0KSBPYmpla3QgZGVzIGF1c2dlbG9nZ3RlbiBTcGllbGVycywKKyAgICAgIEVfUExOQU1FOiAgICAgIChzdHJpbmcpIFVJRC9OYW1lIGRlcyBhdXNnZWxvZ2d0ZW4gU3BpZWxlcnMsCisgICAgICBFX0VOVklST05NRU5UOiAob2JqZWN0KSBsZXR6dGVzIEVudmlyb25tZW50IHZvciBkZW0gQXVzbG9nZ2VuLAorICAgIF0pCisKK0JFTUVSS1VOR0VOOgorCitTSUVIRSBBVUNIOgorICAgZXZlbnRzLCBSZWdpc3RlckV2ZW50KCksIFVucmVnaXN0ZXJFdmVudCgpLCBUcmlnZ2VyRXZlbnQoKSwgZXZlbnRkCisgICBFVlRfTElCX0xPR0lOCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisxNi4wOC4yMDA3LCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9ldmVudHMvRVZUX0xJQl9NSU5JUVVFU1RfU09MVkVEIGIvZG9jL2V2ZW50cy9FVlRfTElCX01JTklRVUVTVF9TT0xWRUQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMyZjAyZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9ldmVudHMvRVZUX0xJQl9NSU5JUVVFU1RfU09MVkVECkBAIC0wLDAgKzEsMjkgQEAKK0VWRU5UOiAKKyAgIEVWVF9MSUJfTUlOSVFVRVNUX1NPTFZFRAorCitERUZJTklFUlQgSU46CisgICAvc3lzL2V2ZW50cy5oCisKK0dFVFJJR0dFUlQgVk9OOgorICAgL3NlY3VyZS9xdWVzdG1hc3Rlci5jCisKK0JFU0NIUkVJQlVORzoKKyAgIERpZXNlciBFdmVudCB3aXJkIHZvbSBRdWVzdG1hc3RlciBhdXNnZWxvZXN0LCB3ZW5uIGVpbiBTcGllbGVyIGVpbmUKKyAgIE1pbmlxdWVzdCBnZWxvZXN0IGhhdC4KKworRVZFTlQtREFURU46CisgICBEaWUgRGF0ZW4gd2VyZGVuIGFscyBNYXBwaW5nIHVlYmVyZ2ViZW46CisgICAoWyBFX09CSkVDVDogICAgICAgIChvYmplY3QpIFF1ZXN0Z2ViZXItT2JqZWt0LAorICAgICAgRV9PQk5BTUU6ICAgICAgICAoc3RyaW5nKSBPYmpla3RuYW1lIGRlcyBRdWVzdGdlYmVycworICAgICAgRV9QTE5BTUU6ICAgICAgICAoc3RyaW5nKSBTcGllbGVybmFtZSwKKyAgICAgIEVfTUlOSVFVRVNUTkFNRTogKHN0cmluZykgVGl0ZWwgZGVyIE1pbmlxdWVzdAorICAgIF0pCisKK0JFTUVSS1VOR0VOOgorCitTSUVIRSBBVUNIOgorICAgZXZlbnRzLCBSZWdpc3RlckV2ZW50KCksIFVucmVnaXN0ZXJFdmVudCgpLCBUcmlnZ2VyRXZlbnQoKSwgZXZlbnRkCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisyMDE0LUZlYi0wMywgQXJhdGhvcm4KKwpkaWZmIC0tZ2l0IGEvZG9jL2V2ZW50cy9FVlRfTElCX05FV19FUlJPUiBiL2RvYy9ldmVudHMvRVZUX0xJQl9ORVdfRVJST1IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMwNDY0OAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9ldmVudHMvRVZUX0xJQl9ORVdfRVJST1IKQEAgLTAsMCArMSwzMSBAQAorRVZFTlQ6IAorICAgRVZUX0xJQl9ORVdfRVJST1IKKworREVGSU5JRVJUIElOOgorICAgL3N5cy9ldmVudHMuaAorICAgL3NlY3VyZS9lcnJvcmQuaCAoS29uc3RhbnRlbiBmdWVyIEV2ZW50ZGF0ZW4gc2luZCBkb3J0IGRlZmluaWVydCkKKworR0VUUklHR0VSVCBWT046CisgICAvc2VjdXJlL2Vycm9yZC5jCisKK0JFU0NIUkVJQlVORzoKKyAgIEVpbiBuZXVlciBGZWhsZXJlaW50cmFnIHd1cmRlIGltIEVycm9yRCBlaW5nZXRyYWdlbi4gSGllcmJlaSBtdXNzIGVzIGtlaW4KKyAgIGVjaHRlciBGZWhsZXIgc2Vpbiwgc29uZGVybiBrYW5uIGF1Y2ggZWluZSBXYXJudW5nIG9kZXIgZWluZSBJZGVlIGVpbmVzCisgICBTcGllbGVycyBzZWluIChhbGxlIEZlaGxlcnR5cGVuIFRfKiBhdXMgL3NlY3VyZS9lcnJvcmQuaCBzaW5kIG1vZWdsaWNoKS4KKworRVZFTlQtREFURU46CisgICBEaWUgRGF0ZW4gd2VyZGVuIGFscyBNYXBwaW5nIHVlYmVyZ2ViZW46CisgICAoWyBGX1RZUEU6ICAgICAoaW50KSBUeXAgZGVzIEZlaGxlcmVpbnRyYWdzCisgICAgICBGX0hBU0hLRVk6ICAoc3RyaW5nKSBJRCBkZXMgRmVobGVyZWludHJhZ2VzCisgICAgICBGX1VJRDogICAgICAoc3RyaW5nKSBVSUQgZGVzIE9iamVrdGVzLCBpbiB3ZWxjaGVuIGRlciBGZWhsZXIgYXVmdHJhdAorICAgIF0pCisKK0JFTUVSS1VOR0VOOgorCitTSUVIRSBBVUNIOgorICAgZXZlbnRzLCBSZWdpc3RlckV2ZW50KCksIFVucmVnaXN0ZXJFdmVudCgpLCBUcmlnZ2VyRXZlbnQoKSwgZXZlbnRkLAorICAgZmVobGVydGV1ZmVsCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiswNy4wOS4yMDExLCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9ldmVudHMvRVZUX0xJQl9OUENfREVBVEggYi9kb2MvZXZlbnRzL0VWVF9MSUJfTlBDX0RFQVRICm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMWZiMDAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXZlbnRzL0VWVF9MSUJfTlBDX0RFQVRICkBAIC0wLDAgKzEsNjkgQEAKK0VWRU5UOiAKKyAgIEVWVF9MSUJfTlBDX0RFQVRIKHgpCisKK0RFRklOSUVSVCBJTjoKKyAgIC9zeXMvZXZlbnRzLmgKKworR0VUUklHR0VSVCBWT046CisgICAvc3RkL2xpdmluZy9saWZlLmMKKworQkVTQ0hSRUlCVU5HOgorICAgRGllc2VyIEV2ZW50IHdpcmQgaW1tZXIgZGFubiB2b24gZWluZW0gTlBDIGF1c2dlbG9lc3QsIHdlbm4gZGllc2VyIGdlcmFkZQorICAgZ2V0b2V0ZXQgd3VyZGUgKHVtIGdlbmF1IHp1IHNlaW46IGltIGRpZSgpKS4KKyAgIERpZXNlciBFdmVudCBtYWNodCB2ZXJtdXRsaWNoIGRpZSBtZWlzdGVuIERpZS1Ib29rcyBlaW5mYWNoIHVubm9ldGlnLCBkYSBlcworICAgYmVpIHZpZWxlbiBudXIgZGFydW0gZ2VodCwgenUgZXJmYWhyZW4sIG9iIGRlciBOUEMgdG90IGlzdCwgd2VyIGlobgorICAgZ2V0b2V0ZXQgaGF0IHVuZCBvYiBkZXJqZW5pZ2UgZ2VudWcgU2NoYWRlbiBnZW1hY2h0IGhhdC4gRGllcyBsYWVzc3Qgc2ljaAorICAgYXVzIGRlbiBEYXRlbiBkaWVzZXMgRXZlbnQgZWJlbmZhbGxzIGVybWl0dGVsbiwgb2huZSBkZW4gQXVmd2FuZCBlaW5lcworICAgSG9va3MgenUgYmV0cmVpYmVuLgorCisgICBCaXR0ZSBiZWFjaHRldCwgZGFzcyBpbiBkaWVzZW0gRmFsbCBkYXMgZWJlbmZhbGxzIGdlbGllZmVydGUgdHJpZ2dlcm5kZQorICAgT2JqZWt0IChkZXIgTlBDKSBiZXJlaXRzIHplcnN0b2VydCBpc3QsIHdlbm4gaWhyIGRlbiBFdmVudCBlbXBmYW5ndCwKKyAgICd0cmlnb2InIGFsc28gMCBpc3QhIElociBtdWVzc3QgYWxzbyBkZW4gRWludHJhZyBFX09CTkFNRSBpbSBEYXRlbm1hcHBpbmcgCisgICBkZXMgRXZlbnRzIG51dHplbiwgdW0gaGVyYXVzenVmaW5kZW4sIHdlbGNoZXIgTlBDIGdldG9ldGV0IHd1cmRlLgorCitQQVJBTUVURVI6CisgICBEZXIgYW4gZGFzIEV2ZW50LURlZmluZSB6dSB1ZWJlcmdlYmVuZGUgUGFyYW1ldGVyICJ4IiBtdXNzIGVpbiBTdHJpbmcgCisgICBzZWluLgorICAgVWViZXJnaWJ0IG1hbiBkZW4gTGVlcnN0cmluZyAiIiwgcmVnaXN0cmllcnQgbWFuIHNpY2ggZnVlciBkYXMgZ2xvYmFsZQorICAgRXZlbnQgRVZUX0xJQl9OUENfREVBVEgoIiIpLCB1ZWJlciBkYXMgZGVyIFRvZCBzYWVtdGxpY2hlciBOUENzIAorICAgd2VpdGVyZ2VtZWxkZXQgd2lyZC4KKyAgIFVlYmVyZ2lidCBtYW4gZGVuIGxvYWRfbmFtZSgpIGRlcyBaaWVsb2JqZWt0cyBhbHMgUGFyYW1ldGVyLCBzbyB3ZXJkZW4KKyAgIG51ciBkaWUgVG9kZSB2b24gTlBDcyBnZW1lbGRldCwgZGllIHNpY2ggdm9uIGRlciBCbHVlcHJpbnQgZGVzCisgICBaaWVsb2JqZWt0cyBhYmxlaXRlbiwgYWxzbyBhdWNoIGFsbGVyIENsb25lcy4KKworRVZFTlQtREFURU46CisgICBEaWUgRGF0ZW4gd2VyZGVuIGFscyBNYXBwaW5nIHVlYmVyZ2ViZW46CisgICAoWyBFX09CTkFNRTogICAgICAgIChzdHJpbmcpICAgT2JqZWt0bmFtZSBkZXMgZ2V0b2V0ZXRlbiBOUENzLAorICAgICAgRV9FTlZJUk9OTUVOVDogICAob2JqZWN0KSAgIEVudmlyb25tZW50IGRlcyBPcGZlciBiZWltIFRvZCwKKyAgICAgIEVfVElNRTogICAgICAgICAgKGludCkgICAgICBaZWl0c3RlbXBlbCBkZXMgVG9kZXMsCisgICAgICBQX05BTUU6ICAgICAgICAgIChzdHJpbmcsc3RyaW5nKikgIFBfTkFNRSwKKyAgICAgIFBfS0lMTEVSOiAgICAgICAgKG9iamVjdCkgICBkZXIgS2lsbGVyLCBzLiBQcm9wZXJ0eSwKKyAgICAgIFBfRU5FTVlfREFNQUdFOiAgKG1hcHBpbmcpICBzLiBNYW5wYWdlIFBfRU5FTVlfREFNQUdFLAorICAgICAgUF9MQVNUX0RBTUFHRTogICAoaW50KSAgICAgIHMuIFByb3BlcnR5LAorICAgICAgUF9MQVNUX0RBTVRZUEVTOiAoc3RyaW5nICopIHMuIFByb3BlcnR5LAorICAgICAgRV9FWFRFUk5BTF9ERUFUSDooaW50KSAgICAgIEZsYWcsIG9iIGRpZSgpIHZvbiBhdXNzZW4gZ2VydWZlbiwKKyAgICAgIEVfUE9JU09OX0RFQVRIOiAgKGludCkgICAgICBGbGFnLCBvYiBkZXIgVG9kIGR1cmNoIEdpZnQgYXVzZ2Vsb2VzdCwKKyAgICAgIEVfQ09SUFNFOiAgICAgICAgKG9iamVjdCkgICBMZWljaGUsIHNvZmVybiBlcyBlaW5lIGdpYnQKKyAgICAgIFBfWFA6ICAgICAgICAgICAgKGludCkgICAgICBQX1hQLAorICAgICAgUF9BVFRSSUJVVEVTOiAgICAoaW50KikgICAgIFBfQVRUUklCVVRFUywKKyAgICAgIFBfTUFYX0hQOiAgICAgICAgKGludCkgICAgICBQX01BWF9IUCwKKyAgICAgIFBfSEFORFM6ICAgICAgICAgKG1peGVkKSAgICBQX0hBTkRTLAorICAgICAgUF9BTElHTjogICAgICAgICAoaW50KSAgICAgIFBfQUxJR04pCisgICAgICBQX1JBQ0U6ICAgICAgICAgIChzdHJpbmcpICAgUF9SQUNFLAorICAgICAgUF9DTEFTUzogICAgICAgICAoc3RyaW5nKikgIFBfQ0xBU1MsCisgICAgXSkKKworQkVNRVJLVU5HRU46CisgICBCZWkgZGVyIFJlZ2lzdHJpZXJ1bmcgZnVlciBkaWUgVG9kZXMtRXZlbnRzIHZvbiBlaW56ZWxuZW4gTlBDcyBrYW5uIGVzIAorICAgaW0gRmFsbCB2b24gVkMtZ2VuZXJpZXJ0ZW4gTlBDcyB6dSB1bmVyd2FydGV0ZW4gRWZmZWt0ZW4ga29tbWVuLCBkYSBoaWVyCisgICBsb2FkX25hbWUoKSBmdWVyIGplZGVzIE9iamVrdCBkZW4gTmFtZW4gZGVzIFZDLVN0YW5kYXJkb2JqZWt0cyAKKyAgIHp1cnVlY2tsaWVmZXJ0LgorICAgRGllIFJlZ2lzdHJpZXJ1bmcgZnVlciBkYXMgVG9kZXMtRXZlbnQgZWluZXMgZWluemVsbmVuIENsb25lcyBpc3QgbmljaHQKKyAgIG1vZWdsaWNoLgorCitTSUVIRSBBVUNIOgorICAgZXZlbnRzLCBSZWdpc3RlckV2ZW50KCksIFVucmVnaXN0ZXJFdmVudCgpLCBUcmlnZ2VyRXZlbnQoKSwgZXZlbnRkCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisyMS4wOC4yMDA3LCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9ldmVudHMvRVZUX0xJQl9QTEFZRVJfQVRUUl9DSEFOR0UgYi9kb2MvZXZlbnRzL0VWVF9MSUJfUExBWUVSX0FUVFJfQ0hBTkdFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZDJmZDQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXZlbnRzL0VWVF9MSUJfUExBWUVSX0FUVFJfQ0hBTkdFCkBAIC0wLDAgKzEsMjQgQEAKK0VWRU5UOiAKKyAgIEVWVF9MSUJfUExBWUVSX0FUVFJfQ0hBTkdFCisKK0RFRklOSUVSVCBJTjoKKyAgIC9zeXMvZXZlbnRzLmgKKworR0VUUklHR0VSVCBWT046CisgICAvc3RkL2xpdmluZy9saWZlLmMKKworQkVTQ0hSRUlCVU5HOgorCitFVkVOVC1EQVRFTjoKKyAgIERpZSBEYXRlbiB3ZXJkZW4gYWxzIE1hcHBpbmcgdWViZXJnZWJlbjoKKyAgIChbIAorICAgIF0pCisKK0JFTUVSS1VOR0VOOgorCitTSUVIRSBBVUNIOgorICAgZXZlbnRzLCBSZWdpc3RlckV2ZW50KCksIFVucmVnaXN0ZXJFdmVudCgpLCBUcmlnZ2VyRXZlbnQoKSwgZXZlbnRkCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisxNi4wOC4yMDA3LCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9ldmVudHMvRVZUX0xJQl9QTEFZRVJfQ1JFQVRJT04gYi9kb2MvZXZlbnRzL0VWVF9MSUJfUExBWUVSX0NSRUFUSU9OCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZmY4MjUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXZlbnRzL0VWVF9MSUJfUExBWUVSX0NSRUFUSU9OCkBAIC0wLDAgKzEsMzEgQEAKK0VWRU5UOiAKKyAgIEVWVF9MSUJfUExBWUVSX0NSRUFUSU9OCisKK0RFRklOSUVSVCBJTjoKKyAgIC9zeXMvZXZlbnRzLmgKKworR0VUUklHR0VSVCBWT046CisgICAvc3RkL3BsYXllci9iYXNlLmMKKworQkVTQ0hSRUlCVU5HOgorICAgRGllc2VyIEV2ZW50IHdpcmQgdm9tIFNwaWVsZXJvYmpla3QgYXVzZ2Vsb2VzdCwgd2VubiBzaWNoIGVpbiBTcGllbGVyCisgICBlcnN0bWFsaWcgaW5zIE1vcmdlbkdyYXVlbiBlaW5nZWxvZ2d0IGhhdC4KKworRVZFTlQtREFURU46CisgICBEaWUgRGF0ZW4gd2VyZGVuIGFscyBNYXBwaW5nIHVlYmVyZ2ViZW46CisgICAoWyBFX1BMTkFNRTogICAgICAgKHN0cmluZykgVUlEL05hbWUgZGVzIGVyc3RlbGx0ZW4gU3BpZWxlcnMsCisgICAgICBFX09CSkVDVDogICAgICAgKG9iamVjdCkgT2JqZWt0IGRlcyBTcGllbGVycywKKyAgICBdKQorCitCRU1FUktVTkdFTjoKKyAgIERhIHp1IGRpZXNlbSBaZWl0cHVua3QgZGFzIFNwaWVsZXJvYmpla3Qgbm9jaCBuaWNodCB2b2xsc3RhZW5kaWcKKyAgIGtvbmZpZ3VyaWVydCBpc3QsIHdlcmRlbiBudXIgT2JqZWt0IHVuZCBTcGllbGVybmFtZSBpbiBkZW4gRGF0ZW4gCisgICB1ZWJlcm1pdHRlbHQuCisKK1NJRUhFIEFVQ0g6CisgICBldmVudHMsIFJlZ2lzdGVyRXZlbnQoKSwgVW5yZWdpc3RlckV2ZW50KCksIFRyaWdnZXJFdmVudCgpLCBldmVudGQKKyAgIEVWVF9MSUJfUExBWUVSX0RFTEVUSU9OCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisxNi4wOC4yMDA3LCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9ldmVudHMvRVZUX0xJQl9QTEFZRVJfREVBVEggYi9kb2MvZXZlbnRzL0VWVF9MSUJfUExBWUVSX0RFQVRICm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZTU1OTgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXZlbnRzL0VWVF9MSUJfUExBWUVSX0RFQVRICkBAIC0wLDAgKzEsMzYgQEAKK0VWRU5UOiAKKyAgIEVWVF9MSUJfUExBWUVSX0RFQVRICisKK0RFRklOSUVSVCBJTjoKKyAgIC9zeXMvZXZlbnRzLmgKKworR0VUUklHR0VSVCBWT046CisgICAvc3RkL2xpdmluZy9saWZlLmMKKworQkVTQ0hSRUlCVU5HOgorICAgRGllc2VyIEV2ZW50IHdpcmQgaW1tZXIgZGFubiB2b24gZWluZW0gU3BpZWxlcm9iamVrdCBhdXNnZWxvZXN0LCB3ZW5uIAorICAgZGVyIFNwaWVsZXIgIGdlcmFkZSBnZXRvZXRldCB3dXJkZSAodW0gZ2VuYXUgenUgc2VpbjogaW0gZGllKCkpLgorCitFVkVOVC1EQVRFTjoKKyAgIERpZSBEYXRlbiB3ZXJkZW4gYWxzIE1hcHBpbmcgdWViZXJnZWJlbjoKKyAgIChbIEVfT0JKRUNUOiAgICAgICAgKG9iamVjdCkgT2JqZWt0IGRlcyBnZXRvZXRldGVuIFNwaWVsZXJzLAorICAgICAgRV9QTE5BTUU6ICAgICAgICAoc3RyaW5nKSBVSUQvUGxheWVybmFtZSBkZXMgZ2V0b2V0ZXRlbiBTcGllbGVycywgCisgICAgICBFX0VOVklST05NRU5UOiAgIChvYmplY3QpIEVudmlyb25tZW50IGRlcyBPcGZlciBiZWltIFRvZCwKKyAgICAgIEVfVElNRTogICAgICAgICAgKGludCkgWmVpdHN0ZW1wZWwgZGVzIFRvZGVzLAorICAgICAgUF9MQVNUX0tJTExFUjogICAob2JqZWN0KSBEZXIgS2lsbGVyLCBzLiBQcm9wZXJ0eQorICAgICAgUF9MQVNUX0RBTUFHRTogICAoaW50KSBzLiBQcm9wZXJ0eSwKKyAgICAgIFBfTEFTVF9EQU1UWVBFUzogKHN0cmluZyAqKSBzLiBQcm9wZXJ0eSwKKyAgICAgIFBfTEFTVF9ERUFUSF9QUk9QUzogKG1peGVkKSBzLiBQcm9wZXJ0eQorICAgICAgRV9FWFRFUk5BTF9ERUFUSDooaW50KSBGbGFnLCBvYiBkaWUoKSB2b24gYXVzc2VuIGdlcnVmZW4sCisgICAgICBFX1BPSVNPTl9ERUFUSDogIChpbnQpIEZsYWcsIG9iIGRlciBUb2QgZHVyY2ggR2lmdCBhdXNnZWxvZXN0LAorICAgICAgRV9DT1JQU0U6ICAgICAgICAob2JqZWN0KSBMZWljaGUsIHNvZmVybiBlcyBlaW5lIGdpYnQKKyAgICBdKQorCitCRU1FUktVTkdFTjoKKworU0lFSEUgQVVDSDoKKyAgIGV2ZW50cywgUmVnaXN0ZXJFdmVudCgpLCBVbnJlZ2lzdGVyRXZlbnQoKSwgVHJpZ2dlckV2ZW50KCksIGV2ZW50ZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMjEuMDguMjAwNywgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2MvZXZlbnRzL0VWVF9MSUJfUExBWUVSX0RFTEVUSU9OIGIvZG9jL2V2ZW50cy9FVlRfTElCX1BMQVlFUl9ERUxFVElPTgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDYzODU2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V2ZW50cy9FVlRfTElCX1BMQVlFUl9ERUxFVElPTgpAQCAtMCwwICsxLDMyIEBACitFVkVOVDogCisgICBFVlRfTElCX1BMQVlFUl9ERUxFVElPTgorCitERUZJTklFUlQgSU46CisgICAvc3lzL2V2ZW50cy5oCisKK0dFVFJJR0dFUlQgVk9OOgorICAgL3N0ZC9wbGF5ZXIvYmFzZS5jCisKK0JFU0NIUkVJQlVORzoKKyAgIERpZXNlciBFdmVudCB3aXJkIHZvbSBTcGllbGVyb2JqZWt0IGF1c2dlbG9lc3QsIHdlbm4gc2ljaCBlaW4gU3BpZWxlcgorICAgbWl0dGVscyAic2VsYnN0bG9lc2NodW5nIiBsb2VzY2h0LiBEZXIgRXZlbnQgd2lyZCB1bWl0dGVsYmFyIHZvciBkZXIKKyAgIFplcnN0b2VydW5nIGRlcyBTcGllbGVyb2JqZWt0cyBhdXNnZWxvZXN0LgorCitFVkVOVC1EQVRFTjoKKyAgIERpZSBEYXRlbiB3ZXJkZW4gYWxzIE1hcHBpbmcgdWViZXJnZWJlbjoKKyAgIChbIEVfUExOQU1FOiAgICAgICAoc3RyaW5nKSBVSUQvTmFtZSBkZXMgZ2Vsb2VzY2h0ZW4gU3BpZWxlcnMsCisgICAgICBFX0VOVklST05NRU5UOiAgKG9iamVjdCkgbGV0enRlcyBFbnZpcm9ubWVudCBkZXMgU3BpZWxlcnMsCisgICAgICBFX0dVSUxETkFNRTogICAgKHN0cmluZykgTmFtZSBkZXIgbGV0enRlbiBHaWxkZSBkZXMgU3BpZWxlcnMsLAorICAgIF0pCisKK0JFTUVSS1VOR0VOOgorICAgV2VubiBTcGllbGVyIHZvbSBMb2VzY2hzY3JpcHQgZXJmYXNzdCBvZGVyIHZvbSBTaGVyaWZmIG9kZXIgZWluZW0gRU0KKyAgIGdlbG9lc2NodCB3ZXJkZW4sIHdpcmQgZGllc2VyIEV2ZW50IG5hdHVlcmxpY2ggbmljaHQgYXVzZ2Vsb2VzdC4KKworU0lFSEUgQVVDSDoKKyAgIGV2ZW50cywgUmVnaXN0ZXJFdmVudCgpLCBVbnJlZ2lzdGVyRXZlbnQoKSwgVHJpZ2dlckV2ZW50KCksIGV2ZW50ZAorICAgRVZUX0xJQl9QTEFZRVJfQ1JFQVRJT04KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzE2LjA4LjIwMDcsIFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL2V2ZW50cy9FVlRfTElCX1FVRVNUX1NPTFZFRCBiL2RvYy9ldmVudHMvRVZUX0xJQl9RVUVTVF9TT0xWRUQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFiYmZjOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9ldmVudHMvRVZUX0xJQl9RVUVTVF9TT0xWRUQKQEAgLTAsMCArMSwzMCBAQAorRVZFTlQ6IAorICAgRVZUX0xJQl9RVUVTVF9TT0xWRUQKKworREVGSU5JRVJUIElOOgorICAgL3N5cy9ldmVudHMuaAorCitHRVRSSUdHRVJUIFZPTjoKKyAgIC9zdGQvcGxheWVyL3F1ZXN0cy5jCisKK0JFU0NIUkVJQlVORzoKKyAgIERpZXNlciBFdmVudCB3aXJkIHZvbSBTcGllbGVyb2JqZWt0IGF1c2dlbG9lc3QsIHdlbm4gZGVyIFNwaWVsZXIgZWluZSBRdWVzdAorICAgZ2Vsb2VzdCBoYXQuCisKK0VWRU5ULURBVEVOOgorICAgRGllIERhdGVuIHdlcmRlbiBhbHMgTWFwcGluZyB1ZWJlcmdlYmVuOgorICAgKFsgRV9PQkpFQ1Q6ICAgICAgICAgKG9iamVjdCkgU3BpZWxlcm9iamVrdCwKKyAgICAgIEVfUExOQU1FOiAgICAgICAgIChzdHJpbmcpIFNwaWVsZXJuYW1lLAorICAgICAgRV9FTlZJUk9OTUVOVDogICAgKG9iamVjdCkgRW52aXJvbm1lbnQgZGVzIFNwaWVsZXJzLAorICAgICAgRV9RVUVTVE5BTUU6ICAgICAgKHN0cmluZykgTmFtZSBkZXIgUXVlc3QsCisgICAgICBFX1FQX0dSQU5URUQ6ICAgICAoaW50KSAgICB2ZXJnZWJlbmUgQWJlbnRldWVycHVua3RlLAorICAgIF0pCisKK0JFTUVSS1VOR0VOOgorCitTSUVIRSBBVUNIOgorICAgZXZlbnRzLCBSZWdpc3RlckV2ZW50KCksIFVucmVnaXN0ZXJFdmVudCgpLCBUcmlnZ2VyRXZlbnQoKSwgZXZlbnRkCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisyMDE0LUZlYi0wMywgQXJhdGhvcm4KKwpkaWZmIC0tZ2l0IGEvZG9jL2V2ZW50cy9ldmVudGQgYi9kb2MvZXZlbnRzL2V2ZW50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTBlMzVmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V2ZW50cy9ldmVudGQKQEAgLTAsMCArMSwyOSBAQAorRXZlbnQtRGlzcGF0Y2hlcjogL3AvZGFlbW9uL2V2ZW50ZC5jCisKK0JFTlVUWlVORzoKKyAgICNpbmNsdWRlIDxldmVudHMuaD4KKyAgIEVWRU5URC0+ZnVuKGJsYSk7CisKK0JFU0NIUkVJQlVORzoKKyAgIERlciBFdmVudC1EaXNwYXRjaGVyIG1lcmt0IHNpY2ggRXZlbnQgdW5kIERhdGVuLCBkaWUgaWhyIHVlYmVyCisgICBUcmlnZ2VyRXZlbnQoKSBhbiBpaG4gbWVsZGV0IHVuZCBpbmZvcm1pZXJ0IG1pdCBrdXJ6ZXIgWmVpdHZlcnpvZWdlcnVuZworICAgYWxsZSBmdWVyIGRlbiBqZXdlaWxpZ2VuIEV2ZW50LVR5cCBhbmdlbWVsZGV0ZW4gT2JqZWt0ZS4KKworRlVOS1RJT05FTjoKKyAgIC0gUmVnaXN0ZXJFdmVudCgpOiBhbm1lbGRlbiBmdWVyIGVpbmVuIEV2ZW50CisgICAtIFVucmVnaXN0ZXJFdmVudCgpOiB2b24gZWluZW0gRXZlbnQgYWJtZWxkZW4KKyAgIC0gVHJpZ2dlckV2ZW50KCk6IGVpbmVuIEV2ZW50IG1lbGRlbgorICAgLSBDaGVja0V2ZW50SUQoKTogd2lldmllbGUgTGF1c2NoZXIgZ2lidCBlcyBmdWVyIGRlbiBFdmVudD8KKworQkVNRVJLVU5HRU46CisgICBXZW5uIEJlZGFyZiBmdWVyIGVpbmVuIHNwZXppYWxpc2llcnRlbiBFdmVudC1EaXNwYXRjaGVyIGJlc3RlaHQsIGRlcgorICAgU29uZGVyZnVua3Rpb25lbiBoYXQgb2RlciBhdWNoIG5pY2h0LW9lZmZlbnRsaWNoZSBFdmVudHMgYW5iaWV0ZXQsIGJlc3RlaHQKKyAgIGRpZSBNb2VnbGljaGtlaXQsIGRlbiBub3JtYWxlbiBldmVudGQgenUgZXJiZW4uIEJpdHRlIHNwcmVjaHQgaW4gZGVtIEZhbGwKKyAgIGFiZXIgYml0dGUgdm9yaGVyIFplc3N0cmEgYW4uCisKK1NJRUhFIEFVQ0g6CisgICBldmVudHMsIAorICAgUmVnaXN0ZXJFdmVudCgpLCBVbnJlZ2lzdGVyRXZlbnQoKSwgVHJpZ2dlckV2ZW50KCksIENoZWNrRXZlbnRJRCgpCisKKzE4LjA4LjIwMDcsIFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL2V2ZW50cy9ldmVudHMgYi9kb2MvZXZlbnRzL2V2ZW50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTBkZmE4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V2ZW50cy9ldmVudHMKQEAgLTAsMCArMSwxMjAgQEAKK1dhcyBzaW5kIEV2ZW50cz8KKz09PT09PT09PT09PT09PT0KK0V2ZW50cyBpbSBNb3JnZW5HcmF1ZW4gc2luZCBFcmVpZ25pc3NlLCBkaWUgdm9uIGJlbGllYmlnZW4gT2JqZWt0ZW4gYXVzZ2Vsb2VzdAord2VyZGVuIGtvZW5uZW4uIEVzIGdpYnQgZWluZSBSZWloZSB2b24gdm9yZGVmaW5pZXJ0ZW4gRXJlaWduaXNzZW4sIGRpZSBkaWUKK0Jhc2lzLUxpYiBiZXJlaXRzdGVsbHQgKHMudS4pLiBadXNhZXR6bGljaCB6dSBkaWVzZW4ga29lbm5lbiBNYWdpZXIgYmVsaWViaWdlCit3ZWl0ZXJlIEV2ZW50cyBlcnN0ZWxsZW4gYnp3LiBiZW51dHplbi4KKworV2VubiBlaW4gT2JqZWt0IGRlbSB6ZW50cmFsZW4gRXZlbnQtRGlzcGF0Y2hlciBlaW5lbiBiZXN0aW1tdGVuIEV2ZW50IG1lbGRldCwKK21lcmt0IGRpZXNlciBzaWNoIGRpZXMgdW5kIGRpZSBEYXRlbiwgZGllIGlobSB2b20gYXVzbG9lc2VuZGVuIE9iamVrdAordWViZXJnZWJlbiB3dXJkZS4gTWl0IGt1cnplciBWZXJ6b2VnZXJ1bmcgKDAtMnMpIGluZm9ybWllcnQgZGVyCitFdmVudC1EaXNwYXRjaGVyIGRhbm4gYWxsZSBPYmpla3RlLCBkaWUgc2ljaCBmdWVyIGRpZXNlbiBFdmVudCBpbnRlcmVzc2llcmVuLAorZC5oLiBkYWZ1ZXIgYW5nZW1lbGRldCBzaW5kLiBIaWVyenUgcnVmdCBlciBlaW5lIGJlc3RpbW10ZSBGdW5rdGlvbiBpbiBkZW4KK2FuZ2VtZWxkZXRlbiBPYmpla3RlbiBhdWYuCitIaWVyYmVpIGlzdCB6dSBiZWFjaHRlbiwgZGFzcyBkaWUgaW5mb3JtaWVydGVuIE9iamVrdGUgZGFzIEVyZWlnbmlzIGluIGtlaW5lbQorRmFsbCBtZWhyIGJlZWluZmx1c3NlbiBrb2VubmVuLCBkYSBlcyBiZXJlaXRzIGFiZ2VzY2hsb3NzZW4gd3VyZGUuIEVzIGlzdAorbGVkaWdsaWNoIGVpbmUgSW5mb3JtYXRpb24gdWViZXIgZGFzIEVyZWlnbmlzLiBXZW5uIGVpbiBPYmpla3QgRWluZmx1c3MgbmVobWVuCit3aWxsICh6LkIuIGF1ZiBlaW5lbiBUb2QpLCBpc3QgZGFmdWVyIGVpbiBIb29rIHp1IHZlcndlbmRlbi4KKworCitXZWxjaGUgRXZlbnRzIGRlZmluaWVydCBkaWUgTXVkbGliPworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorRGllc2UgRXZlbnRzIGhhYmVuIGluIC9zeXMvZXZlbnRzLmggdm9yZGVmaW5pZXJ0ZSBFdmVudC1JRHMgdW5kIHdlcmRlbiB2b24gZGVyCitCYXNpcy1NdWRsaWIgbWl0IGRlbiBlbnRzcHJlY2hlbmRlbiBEYXRlbiBhdXNnZWxvZXN0IChzLiBqZXcuIEV2ZW50KToKKy0gRVZUX0xJQl9MT0dJTjogTG9naW4gZWluZXMgU3BpZWxlcnMKKy0gRVZUX0xJQl9MT0dPVVQ6IExvZ291dCBlaW5lcyBTcGllbGVycworLSBFVlRfTElCX1BMQVlFUl9ERUFUSDogRWluIFNwaWVsZXIgaXN0IGdlc3RvcmJlbgorLSBFVlRfTElCX1BMQVlFUl9ERUxFVElPTjogRWluIFNwaWVsZXIgaGF0IHNpY2ggZ2Vsb2VzY2h0CistIEVWVF9MSUJfUExBWUVSX0NSRUFUSU9OOiBFaW4gU3BpZWxlciB3dXJkZSBuZXUgYW5nZWxlZ3QuCistIEVWVF9MSUJfTlBDX0RFQVRIKCk6IEVpbiBOUEMgaXN0IGdlc3RvcmJlbiAoUGFyYW1ldGVyIHMuIEV2ZW50LU1hbnBhZ2UpCistIEVWVF9MSUJfQURWQU5DRTogRWluIFNwaWVsZXIgaGF0IHNlaW5lIFNwaWVsZXJzdHVmZSBlcmhvZWh0CistIEVWVF9MSUJfUExBWUVSX0FUVFJfQ0hBTkdFOiBEaWUgQXR0cmlidXRlIGVpbmVzIFNwaWVsZXJzIHd1cmRlbiBnZWFlbmRlcnQKKy0gRVZUX0xJQl9DTE9DSzogRGllIHZvbGxlIFN0dW5kZSBpc3QgZXJyZWljaHQKKy0gRVZUX0xJQl9EQVRFQ0hBTkdFOiBFaW4gbmV1ZXIgVGFnIGlzdCBhbmdlYnJvY2hlbi4gOy0pCistIEVWVF9MSUJfUVVFU1RfU09MVkVEOiBFaW4gU3BpZWxlciBoYXQgZWluZSBRdWVzdCBnZWxvZXN0CistIEVWVF9MSUJfTUlOSVFVRVNUX1NPTFZFRDogRWluIFNwaWVsZXIgaGF0IGVpbmUgTWluaXF1ZXN0IGdlbG9lc3QKKworR2lsZGVuIG11ZXNzZW4gZGVmaW5pZXJlbiAoZ2dmLiB2aWEgL3N0ZC9naWxkZW5fb2IuYyk6CistIEVWVF9HVUlMRF9DSEFOR0U6IFNwaWVsZXIgaGF0IHNlaW5lIEdpbGRlIGdld2VjaHNlbHQuCistIEVWVF9HVUlMRF9BRFZBTkNFOiBFaW4gU3BpZWxlciBoYXQgc2VpbmUgR2lsZGVuc3R1ZmUgZXJob2VodAorCisKK05hbWVuc2tvbnZlbnRpb24gZnVlciBFdmVudC1JRHM6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistIERpZSBJRHMgYWxsZXIgU3RhbmRhcmRldmVudHMgYmVnaW5uZW4gbWl0ICJldnRfbGliXyIuIAorICBEZW1lbnRzcHJlY2hlbmQgc2luZCBhbGxlIFN0cmluZ3MsIGRpZSBkYW1pdCBhbmZhbmdlbiwgZnVlciBBTExFIGF1c3NlciAKKyAgZGVyIE11ZGxpYiBUQUJVISBELmguCisgIC0gZGllc2UgRXZlbnRzIHdlcmRlbiBOSUVNQUxTIHZvbiBPYmpla3RlbiBhdXNzZXJoYWxiIGRlciBCYXNpc2xpYgorICAgIGF1c2dlbG9lc3QhCisgIC0gZXMgZHVlcmZlbiBrZWluZSBFdmVudHMgcmVnaXN0cmllcnQgd2VyZGVuLCBkaWUgbWl0IGRpZXNlciBaZWljaGVuZm9sZ2UKKyAgICBhbmZhbmdlbiwgYXVzc2VyIG1pdCBkZW4gc3ltYm9saXNjaGVuIE5hbWVuIGluIC9zeXMvZXZlbnRzLmgKKy0gR2lsZGVuLUV2ZW50cyBiZWdpbm5lbiBtaXQgImV2dF9ndWlsZF8iLCBzb2Zlcm4gZXMgZWluIEV2ZW50IGlzdCwgZGVuIGplZGUKKyAgR2lsZGUgZGVmaW5pZXJ0IChzLiAvc3lzL2V2ZW50cy5oKS4KKyAgRGllIEV2ZW50cyBlaW56ZWxuZXIgR2lsZGVuIHNvbGx0ZW4gbWl0ICJldnRfZ2lsZGVubmFtZV8iIGJlZ2lubmVuLgorLSBEaWUgSURzIGVpbnplbG5lciBNYWdpZXIgc29sbHRlbiBhbSBiZXN0ZW4gendlY2tzIEVpbmRldXRpZ2tlaXQgbWl0CisgICJtYWdpZXJuYW1lXyIgYmVnaW5uZW4uCisKKworV2FzIGlzdCBhbHMgbGF1c2NoZW5kZXMgT2JqZWt0IHp1IGJlYWNodGVuPworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitEYXMgbGF1c2NoZW5kZSBPYmpla3QgbXVzcyB6dW5hZWNoc3QgL3N5cy9ldmVudHMuaCBpbmtsdWRpZXJlbiB1bmQgc2ljaAorbWl0dGVscyBBdWZydWZzIHZvbiBSZWdpc3RlckV2ZW50KCkgYWxzIExhdXNjaGVyIHJlZ2lzdHJpZXJlbi4KK1dlaXRlcmhpbiBtdXNzIGVzIGVpbmUgRnVua3Rpb24gb2VmZmVudGxpY2ggZGVmaW5pZXJlbiAoTmFtZSBiZWxpZWJpZyksIGRpZQorZGVyIEVWRU5URCBhdWZydWZlbiBrYW5uLiBEaWVzZSBGdW5rdGlvbiBiZWtvbW10IDMgQXJndW1lbnRlIHVlYmVyZ2ViZW46CitFdmVudC1JRCwgZXZlbnQtYXVzbG9lc2VuZGVzIE9iamVrdCB1bmQgZGllIEV2ZW50LURhdGVuOgorICAgcHVibGljIHZvaWQgbGlzdGVuX2V2ZW50KHN0cmluZyBlaWQsIG9iamVjdCB0cmlnb2IsIG1peGVkIGRhdGEpOworJ2RhdGEnIGlzdCBlaW4gRGF0ZW50eXAsIGRlciB2b20gRXZlbnR0eXAgYWJoYWVuZ3QuIE9mdCBoYW5kZWx0IGVzIHNpY2gKK3VtIGVpbiBNYXBwaW5nLiBGdWVyIGVpbmUgZ2VuYXVlIEJlc2NocmVpYnVuZyBzY2hhdXQgYml0dGUgZGllIGluIGRpZSBNYW5wYWdlCitkZXMga29ua3JldGVuIEV2ZW50cy4KKworQml0dGUgYmVhY2h0ZW46IERpZSBEYXRlbiBpbiAnZGF0YScgaW0gRmFsbGUgZWluZXMgQXJyYXlzL01hcHBpbmdzIG5pZW1hbHMKK2FlbmRlcm4uIEF1cyBFZmZpemllbnpncnVlbmRlbiB3aXJkICdkYXRhJyBuaWNodCBrb3BpZXJ0LCBiZXZvciBlcyBhbiBkaWUKK2VpbnplbG5lbiBPYmpla3RlIHVlYmVyZ2ViZW4gd2lyZC4gV2VubiBpaHIgYWxzbyBNdWVsbCByZWluc2NocmVpYnQsIHdlcmRlbgorbmFjaCBldWNoIGluZm9ybWllcnRlIExhdXNjaGVyIGV1cmVuIFNjaHJvdHQgZW1wZmFuZ2VuLiBTb2xsdGUgaGllcgorJ01pc3NicmF1Y2gnIGF1ZmZhbGxlbiwgd2lyZCBkYXMgZW50c3ByZWNoZW5kIGdlYWhuZGV0IQorCitVbmQgenVtIFNjaGx1c3M6IEJpdHRlIG1pc3NicmF1Y2h0IGRpZSBFdmVudHMgbmljaHQgdW5kIG1lbGRldCBldWNoIChzcGV6aWVsbCAKK2Z1ZXIgaGFldWZpZ2UgRXZlbnRzKSBudXIgYW4sIHdlbm4gaWhyIG1pdCBkZW4gSW5mb3JtYXRpb25lbiB3YXMgc2lubnZvbGxlcyAKK21hY2h0IChhbHNvIHouQi4gbmljaHQgbnVyLCB1bSBlaW4gTG9nIGRlciBnZXRvZXRldGVuIE5QQ3MgaW0gU3BpZWwgenUgCitlcnN0ZWxsZW4uIDstKSkuCisKKworV2FzIGlzdCBhbHMgYXVzbG9lc2VuZGVzIE9iamVrdCB6dSBiZWFjaHRlbj8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0VpZ2VudGxpY2ggZ2FyIG5pY2h0IHZpZWwuIElociBtdWVzc3QgbGVkaWdsaWNoIC9zeXMvZXZlbnRzLmggaW5rbHVkaWVyZW4gdW5kCitiZWkgQXVmdHJldGVuIGRlcyBFdmVudHMgZGllIEZ1bmt0aW9uIFRyaWdnZXJFdmVudCgpIGltIEVWRU5URCBhdWZydWZlbiB1bmQKK2lociBkaWUgRXZlbnQtSUQgdW5kIGRpZSBFdmVudC1EYXRlbiB1ZWJlcmdlYmVuLgorQml0dGUgdWViZXJnZWJ0IGFscyBFdmVudC1EYXRlbiBnZ2YuIEtvcGllbiB2b24gTWFwcGluZ3MvQXJyYXlzLCBkYSBsYXVzY2hlbmRlCitPYmpla3RlIGRpZXNlIERhdGVuIHZlcmFlbmRlcm4ga29lbm5lbi4KKworCitCZWlzcGllbGU6Cis9PT09PT09PQorMS4gRWluIE9iamVrdCBtb2VjaHRlIHVlYmVyIFNwaWVsZXJ0b2RlIGluZm9ybWllcnQgd2VyZGVuOgorICAgICBFVkVOVEQtPlJlZ2lzdGVyRXZlbnQoRVZUX0xJQl9QTEFZRVJfREVBVEgsICJzcGllbGVyX2lzdF90b3QiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfb2JqZWN0KCkpOworICAgQWIgamV0enQgd2lyZCBpbSBPYmpla3QgamVkZXMgTWFsLCB3ZW5uIGVpbiBTcGllbGVyIHN0aXJidCwgZGllIEZ1bmt0aW9uCisgICAic3BpZWxlcl9pc3RfdG90IiBhdWZnZXJ1ZmVuLgorCisyLiBFaW4gT2JqZWt0IG1vZWNodGUgbmljaHQgbWVociB1ZWJlciBTcGllbGVydG9kZSBpbmZvcm1pZXJ0IHdlcmRlbjoKKyAgICAgRVZFTlRELT5VbnJlZ2lzdGVyRXZlbnQoRVZUX0xJQl9QTEFZRVJfREVBVEgsIHRoaXNfb2JqZWN0KCkpOworCiszLiBFaW4gT2JqZWt0IHdpbGwgaW5mb3JtaWVydCB3ZXJkZW4sIHdlbm4gZGVyIEV2ZW50CisgICAiYm9pbmdfendlcmdlbmtvZW5pZ19hbmdyaWZmIiBhdXNnZWxvZXN0IHdpcmQ6CisgICAgIEVWRU5URC0+UmVnaXN0ZXJFdmVudCgiYm9pbmdfendlcmdlbmtvZW5pZ19hbmdyaWZmIiwiYWxhcm0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc19vYmplY3QoKSk7CisKKzQuIERlciBad2VyZ2Vua29lbmlnIChvZGVyIGVpbmVyIHNlaW5lciBXYWVjaHRlcikgd2lyZCBhbmdlZ3JpZmZlbjoKKyAgIEVWRU5URC0+VHJpZ2dlckV2ZW50KCJib2luZ196d2VyZ2Vua29lbmlnX2FuZ3JpZmYiLCBkYXRlbik7CisgICBBbnNjaGxpZXNzZW5kIHdpcmQgamVkZXMgT2JqZWt0LCBkYXMgZXMgd2lzc2VuIHdpbGwgKHMuIDMuKSB2b20gRVZFTlRECisgICBpbmZvcm1pZXJ0IHVuZCBrcmllZ3QgZGFiZWkgJ2RhdGVuJyB1ZWJlcmdlYmVuLiBEaWVzIGthbm4gZWluIGJlbGllYmlnZXIKKyAgIERhdGVudHlwIHNlaW4gKHouYi4gZWluIE1hcHBpbmcpLiBJbiBkaWVzZW0gRmFsbCBlbnRoYWVsdCAnZGF0ZW4nCisgICB6d2Vja21hZXNzaWdlcndlaXNlIGRlbiBBbmdyZWlmZXIuCisKKworU2llaGUgYXVjaDoKKz09PT09PT09PT0KKyAgZXZlbnRkLCBUcmlnZ2VyRXZlbnQoKSwgUmVnaXN0ZXJFdmVudCgpLCBVbnJlZ2lzdGVyRXZlbnQoKQorCisxOC4wOC4yMDA3LCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9oZWxwLy5yZWFkbWUgYi9kb2MvaGVscC8ucmVhZG1lCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMmE1N2YKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaGVscC8ucmVhZG1lCkBAIC0wLDAgKzEsMyBAQAorSGllciBiZWZpbmRlbiBzaWNoIEhpbGZlbiB6dSBhbGxnZW1laW5lbiBUaGVtZW4sIGRpZSBzb3dvaGwgZnVlciBTcGllbGVyCithbHMgYXVjaCBmdWVyIE1hZ2llciB2b24gSW50ZXJlc3NlIHNpbmQuCisKZGlmZiAtLWdpdCBhL2RvYy9oZWxwLy5zeW5vbnltIGIvZG9jL2hlbHAvLnN5bm9ueW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkzYzU2OAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9oZWxwLy5zeW5vbnltCkBAIC0wLDAgKzEsMTM4IEBACis0Z2V3aW5udCBzcGllbGUKK2FiYWxvbmUgc3BpZWxlCithYmVudGV1ZXJwdW5rdGUgYWJlbnRldWVyCithYmt1ZXJ6dW5nIGFiaworYWJrdWVyenVuZ2VuIGFiaworYWt1ZWZpIGFiaworYWxrb2hvbCBlc3Nlbl90cmlua2VuCithbmJldHVuZyBnb3R0CithbmZhZW5nZXIgZWluZnVlaHJ1bmcKK2FybWFnZWRkb24gcmVib290CithdHRyaWJ1dCBhdHRyaWJ1dGUKK2F1c2RhdWVyIGF0dHJpYnV0ZQorYmV6dWdzb2JqZWt0IGJlenVnc3B1bmt0Citib2luZyBnb3R0CitidWNoIGJ1ZWNoZXIKK2NpY2Vyb25lbiBjaWNlcm9uZXMKK2NsaWVudHMgY2xpZW50CitjcHUgbXVkcmVjaG5lcgorZGFydCBzcGllbGUKK2RvcHBlbGtvcGYgc3BpZWxlCitla3MgZXJzdGtpbGxzdHVmZW5wdW5rdGUKK2Vyc3RraWxscyBlcnN0a2lsbHN0dWZlbnB1bmt0ZQorZXJzdGllIHp3ZWl0c3BpZWxlcgorZXJzdHNwaWVsZXIgendlaXRzcGllbGVyCitlc3NlbiBlc3Nlbl90cmlua2VuCitmYWNlYm9vayBzb3ppYWxtZWRpZW4KK2ZlaWVyIHBhcnRpZXMKK2ZldGUgcGFydGllcworZmx1Y2ggZ2lmdAorZmx1ZWNoZSBnaWZ0CitmdHAgbXVkcmVjaG5lcgorZnVzc2JhbGwgc3BpZWxlCitnZXNjaGljayBhdHRyaWJ1dGUKK2dlc2NoaWNrbGljaGtlaXQgYXR0cmlidXRlCitnZXN1bmRoZWl0IGxlYmVuc3B1bmt0ZQorZ2V0cmFlbmtlIGVzc2VuX3RyaW5rZW4KK2dldHJhZW5rIGVzc2VuX3RyaW5rZW4KK2dpZnRlIGdpZnQKK2dpbGRlIGdpbGRlbgorZ2xhZGlvcG9saXMgc3BpZWxlCitnbWNwIEdNQ1AKK2dvZXR0ZXIgZ290dAorZ29vZ2xlIHNvemlhbG1lZGllbgorZ28gc3BpZWxlCitoZWlsZW4gaGVpbHVuZworaGVyenNjaGxhZyBsZWJlbgoraHAgbGViZW4KK2ludGVsbGlnZW56IGF0dHJpYnV0ZQoram9mIGdvdHQKK2thZW1wZmVuIGthbXBmCitrbmVpcGUgaGVpbHVuZwora25laXBlbiBoZWlsdW5nCitrb256ZW50cmF0aW9uc3B1bmt0ZSB6YXViZXJlaQora29uemVudHJhdGlvbiB6YXViZXJlaQora3JhZnQgYXR0cmlidXRlCitrcmFua2hlaXRlbiBnaWZ0CitrcmFua2hlaXQgZ2lmdAorbGFycyB0b2QKK2xlYmVuc3B1bmt0ZSBsZWJlbgorbG9lc2NoZW4gbG9lc2Noc2tyaXB0Citsb2VzY2h1bmcgbG9lc2Noc2tyaXB0CitscCBsZWJlbgorbWFleGNoZW4gc3BpZWxlCittYWdpZXB1bmt0ZSB6YXViZXJlaQorbWFnaWUgemF1YmVyZWkKK21ldHplbG4ga2FtcGYKK21pbmVzd2VlcGVyIHNwaWVsZQorbWluaXF1ZXN0cyBzdHVmZW5wdW5rdGUKK21pbmlxdWVzdCBzdHVmZW5wdW5rdGUKK21wYSB6ZWl0dW5nCituYWhydW5nIGVzc2VuX3RyaW5rZW4KK25ldGxhZyBsYWcKK25ldHpsYWcgbGFnCituZXR6IG11ZHJlY2huZXIKK29yYWtlbCB6YXViZXJ0cmFlbmtlCitwYXJ0eSBwYXJ0aWVzCitwb3J0YWxlIHNlaGVydG9yZQorcG9ydGFsIHNlaGVydG9yZQorcXAgYWJlbnRldWVyCitxdWVzdCBhYmVudGV1ZXIKK3F1ZXN0ZW4gYWJlbnRldWVyCitxdWVzdGxpc3RlIGFiZW50ZXVlcmxpc3RlCitxdWVzdHB1bmt0ZSBhYmVudGV1ZXIKK3F1ZXN0cyBhYmVudGV1ZXIKK3JhZ2Ugc3BpZWxlCityZWNobmVyIG11ZHJlY2huZXIKK3JlZ2VsIHJlZ2VsbgorcmVnaW9uIHJlZ2lvbmVuCityZWdpb25zbWFnaWVyIHJlZ2lvbmVuCityb2RlbG4gc3BpZWxlCitydW1hdGEgZ290dAorc2F1ZmVuIGVzc2VuX3RyaW5rZW4KK3NjaGFjaCBzcGllbGUKK3NjcmlwdGUgcmVnZWxuCitzY3JpcHQgcmVnZWxuCitzY3JpcHRzIHJlZ2Vsbgorc2VoZXJwb3J0YWxlIHNlaGVydG9yZQorc2VoZXJwb3J0YWwgc2VoZXJ0b3JlCitzZWhlcnRvciBzZWhlcnRvcmUKK3NrYXQgc3BpZWxlCitza3JpcHRlIHJlZ2Vsbgorc2tyaXB0IHJlZ2Vsbgorc2tyaXB0cyByZWdlbG4KK3NwZWljaGVyIG11ZHJlY2huZXIKK3NwZWlzZSBlc3Nlbl90cmlua2VuCitzcGVpc2VuIGVzc2VuX3RyaW5rZW4KK3NwaWVsZXJsb2VzY2hlbiBsb2VzY2hza3JpcHQKK3NwaWVsZXJsb2VzY2h1bmcgbG9lc2Noc2tyaXB0CitzcGllbGVydGVzdGllIHNwaWVsZXJ0ZXN0aWVzCitzdGFlcmtlIGF0dHJpYnV0ZQordGFibHV0IHNwaWVsZQordGFua2UgaGVpbHVuZwordGFua2VuIGhlaWx1bmcKK3RlYW0gdGVhbWthbXBmCit0ZXN0aWUgc3BpZWxlcnRlc3RpZXMKK3Rlc3RpZXMgc3BpZWxlcnRlc3RpZXMKK3Rlc3RzcGllbGVyIHNwaWVsZXJ0ZXN0aWVzCit0ZiBjbGllbnQKK3RvZGVzZm9sZ2VuIHRvZAordG9kZXNtYWx1cyB0b2QKK3RvdCB0b2QKK3RyaW5rZW4gZXNzZW5fdHJpbmtlbgordHMzIHRlYW1zcGVhawordHMgdGVhbXNwZWFrCit0d2l0dGVyIHNvemlhbG1lZGllbgordW1sYXV0ZSBzeW50YXgKK3ZlcmJpbmR1bmcgY2xpZW50Cit2ZXJnaWZ0dW5nIGdpZnQKK3dhZmZlbnNraWxscyB3YWZmZW5mZXJ0aWdrZWl0ZW4KK3dhZmZlbnNraWxsIHdhZmZlbmZlcnRpZ2tlaXRlbgord2FmZmVuIHdhZmZlbmZlcnRpZ2tlaXRlbgord2FmZmUgd2FmZmVuZmVydGlna2VpdGVuCit6YXViZXJ0cmFuayB6YXViZXJ0cmFlbmtlCit6YXViZXIgemF1YmVyZWkKK3pvb2sgZ290dAorenQgemF1YmVydHJhZW5rZQorendlaXRpZXMgendlaXRzcGllbGVyCit6d2VpdGllIHp3ZWl0c3BpZWxlcgpkaWZmIC0tZ2l0IGEvZG9jL2hlbHAvR01DUCBiL2RvYy9oZWxwL0dNQ1AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAwYWQ4OAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9oZWxwL0dNQ1AKQEAgLTAsMCArMSwzNTYgQEAKK0dlbmVyYWwgTXVkIENvbW11bmljYXRpb24gUHJvdG9jb2wgaW0gTW9yZ2VuR3JhdWVuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCiswLiBFaW5sZWl0dW5nCisgICBHTUNQIHdpcmQgYmVudXR6dCwgdW0gRGF0ZW4gendpc2NoZW4gTVVEIHVuZCBDbGllbnQgIm91dCBvZiBiYW5kIiB6dQorICAgdWViZXJ0cmFnZW4uICJPdXQgb2YgYmFuZCIgYmVkZXV0ZXQgaGllciwgZGFzcyBkZXIgRGF0ZW5hdXN0YXVzY2ggaGludGVyCisgICBkZW4gS3VsaXNzZW4gcGFzc2llcnQgc3RhdHQgaW4gZGVyIG5vcm1hbGVuIHRleHR1ZWxsZW4gU3BpZWxhdXNnYWJlLAorICAgd2VsY2hlciB2b20gQ2xpZW50IG1pdHRlbHMgbWVociBvZGVyIHdlbmlnZXIga29tcGxpemllcnRlciBUcmlnZ2VyCisgICBhdXNnZXdlcnRldCB3ZXJkZW4gbXVzcy4KKworICAgVm9ydGVpbGU6CisgICAqIGtlaW5lIGtvbXBsZXhlbiBUcmlnZ2VyIChSZWdleHBzKSBtZWhyLgorICAgKiBEYXRlbiB3ZXJkZW4gaW4gZWluZW0gZGVmaW5pZXJ0ZW4gRm9ybWF0IHVlYmVydHJhZ2VuLCB3ZWxjaGVzIGRlciBDbGllbnQKKyAgICAgZnVlciBldWNoIGludGVycHJldGllcnQuCisgICAqIGtlaW5lIEdhZ3RyaWdnZXIgbWVociBub2V0aWcsIHVtIGVtcGZhbmdlbmVuIFRleHQgYXVzenVibGVuZGVuCisgICAqIGtlaW5lIHN0b2VyZW5kZW4gQXVzZ2FiZW4sIGZhbGxzIG1hbiBkaWVzZSBHYWd0cmlnZ2VyIG5pY2h0IGhhdC4KKyAgICogRGF0ZW4ga29lbm5lbiBhdWNoIHVlYmVydHJhZ2VuIHdlcmRlbiBpbiBTaXR1YXRpb25lbiwgaW4gZGVuZW4gZWluZQorICAgICBub3JtYWxlIFRleHRhdXNnYWJlIG5pY2h0IHNvIGd1dCBnZWh0LCB6LkIuIGluIEVkaXRvcmVuLgorICAgKiBEYXRlbiwgZGllIGRpZSBDbGllbnRzY3JpcHRlIG5pY2h0IHZlcmFyYmVpdGVuLCBzdG9lcmVuIG5pY2h0IGRlbgorICAgICBUZXh0Zmx1c3MuCisgICAqIERlciBDbGllbnQga2FubiBrb25maWd1cmllcmVuLCB3ZWxjaGUgSW5mb3JtYXRpb25lbiBlciBiZWtvbW1lbiB3aWxsLgorICAgKiBJbSBNRyBpc3QgbmViZW4gRGluZ2VuIHdpZSBMUCB1bmQgS1AgZGllIFVlYmVydHJhZ3VuZyBkaXYuIGFuZGVyZXIgRGluZ2UKKyAgICAgZ2VwbGFudCwgdm9yIGFsbGVtIGFuZGVyZSBJbmZvcm1hdGlvbmVuICB1ZWJlciBkZW4gQ2hhciBvZGVyIGRlbiBSYXVtCisgICAgICh6LkIuIGVpbmRldXRpZ2UgUmF1bS1JRHMgKGluIGRlbiBtZWlzdGVuIEZhZWxsZW4pKS4KKworCisxLiBVbnRlcnN0dWV0enRlIE1vZHVsZQorCisxLjEuIENvcmUgKGF1cyBJUkUgKElyb24gUmVhbG1zIEVudGVydGFpbm1lbnQpIE1VRHMpCisgIERhcyBDb3JlIE1vZHVsIGlzdCBpbW1lciBha3Rpdi4gRXMgdmVyd2FsdGV0IGRpZSBncnVuZHNhZXR6bGljaGVuCisgIEVpbnN0ZWxsdW5nZW4gdm9uIEdNQ1AuIERpZSBNRy1WYXJpYW50ZSBpc3QgZmFzdCBpZGVudGlzY2ggenVyIElSRS1WYXJpYW50ZSwKKyAgaGF0IGFsbGVyZGluZ3MgenVzYWV0emxpY2hlIGRhcyAiRGVidWciLUtvbW1hbmRvLgorCisgIFZvbSBDbGllbnQgZ2VzZW5kZXQ6CisgICAgLSBDb3JlLkhlbGxvCisgICAgICAgIE11c3MgZGllIGVyc3RlIE5hY2hyaWNodCBzZWluLCB3ZWxjaGUgZGVyIENsaWVudCBuYWNoIEFrdGl2aWVydW5nIHZvbgorICAgICAgICBHTUNQIHNlbmRldC4KKyAgICAgICAgRGllIERhdGVuIHNpbmQgZWluIE9iamVrdCBtaXQgZGVuIFNjaGx1ZXNzZWxuICJjbGllbnQiIHVuZCAidmVyc2lvbiIsCisgICAgICAgIHdlbGNoZSBlbnRzcHJlY2hlbmQgZGVuIENsaWVudG5hbWVuIHVuZCBzZWluZSBWZXJzaW9uc2tlbm51bmcKKyAgICAgICAgZW50aGFsdGVuLgorICAgICAgQ29yZS5IZWxsbyB7ICJjbGllbnQiOiAiTmV4dXMiLCAidmVyc2lvbiI6ICIzLjEuOTAiIH0KKyAgICAtIENvcmUuU3VwcG9ydHMuU2V0CisgICAgICAgIEluZm9ybWllcnQgZGFzIE1VRCB1ZWJlciBkaWUgUGFrZXRlL01vZHVsZSwgZGllIGRlciBDbGllbnQKKyAgICAgICAgdW50ZXJzdHVldHp0LCBkLmguIGRpZSBkZXIgQ2xpZW50IGVtcGZhbmdlbiBrYW5uLiBFcyBpc3QgaW1tZXIgbm9jaAorICAgICAgICBFbnRzY2hlaWR1bmcgZGVzIE11ZHMsIHdlbGNoZSBkaWVzZXIgTW9kdWxlIGlocmUgRGF0ZW4gc2VuZGVuICh6LkIuCisgICAgICAgIHdpcmQgTUcgZWluZW0gIk1HLmNoYXIiIGRlbiBWb3J6dWcgZ2ViZW4gdm9yIGVpbmVtIGdlbmVyaXNjaGVuICJDaGFyIiwKKyAgICAgICAgZmFsbHMgdm9tIENsaWVudCBiZWlkZSB1bnRlcnN0dWV0enQgd2VyZGVuLgorICAgICAgICBXZW5uIGJlcmVpdHMgdm9yaGVyIGVpbiBDb3JlLlN1cHBvcnRzLiogS29tbWFuZG8gZW1wZmFuZ2VuIHd1cmRlLCB3aXJkCisgICAgICAgIGRpZSBMaXN0ZSBkZXIgdW50ZXJzdHVldHp0ZW4gTW9kdWxlIGR1cmNoIGRpZSBuZXVlIGVyc2V0enQuCisgICAgICAgIERhdGVuIHNpbmQgZWluIEFycmF5IHZvbiBTdHJpbmdzLCB3ZWxjaGUgamV3ZWlscyBkZW4gTW9kdWxuYW1lbiB1bmQKKyAgICAgICAgZGllIFZlcnNpb25zbnVtbWVyIGFuZ2ViZW4gKG1pdCBlaW5lbSBMZWVyemVpY2hlbiBnZXRyZW5udCkuCisgICAgICAgIERpZSBWZXJzaW9uc251bW1lciBtdXNzIGVpbmUgcG9zaXRpdmUgR2FuenphaGwgc2Vpbi4KKyAgICAgICAgRGllIG1laXN0ZW4gQ2xpZW50cyB3ZXJkZW4gU2V0IG51ciBlaW5tYWwgYW0gQW5mYW5nIHNlbmRlbiB1bmQKKyAgICAgICAgYnJhdWNoZW4ga2VpbiBBZGQvUmVtb3ZlLgorICAgICAgQ29yZS5TdXBwb3J0cy5TZXQgWyAiTUcuY2hhciAxIiwgIk1HLnJvb20gMSIgXQorICAgIC0gQ29yZS5TdXBwb3J0cy5BZGQKKyAgICAgICAgYWVobmxpY2ggenUgU2V0LCBhYmVyIGVzIGZ1ZWd0IGRpZSBhbmdlZ2ViZW4gTW9kdWxlIGFuIGRpZSBpbiBkZXIKKyAgICAgICAgVmVyZ2FuZ2VuaGVpdCB1ZWJlcm1pdHRlbHRlbiBhbi4KKyAgICAgICAgV2VubiBub2NoIGtlaW5lIExpc3RlIGdlc2VuZGV0IHd1cmRlLCBpc3QgZGFzIEVyZ2VibmlzIHdpZSBiZWkgU2V0LgorICAgICAgICBXZW5uIGRpZSBMaXN0ZSBNb2R1bGUgZW50aGFlbHQsIGRpZSBiZXJlaXRzIGFrdGl2IHNpbmQsIHdpcmQgZGllIG5ldWUKKyAgICAgICAgVmVyc2lvbnNudW1tZXIgUHJpb3JpdGFldCB2b3IgZGVyIGFsdGVuIGhhYmVuLCBzZWxic3Qgd2VubiBkaWUga2xlaW5lcgorICAgICAgICBpc3QuCisgICAgICAgIERpZSBEYXRlbiBzaW5kIGlkZW50aXNjaCB6dSBTZXQuCisgICAgLSBDb3JlLlN1cHBvcnRzLlJlbW92ZQorICAgICAgICBFbnRmZXJudCBkaWUgYW5nZWJlbmVuIE1vZHVsZSBhdXMgZGVyIExpc3RlIGRlciB1bnRlcnN0dWV0emVuIE1vZHVsZS4KKyAgICAgICAgRGllIERhdGVuIHNpbmQgaWRlbnRpc2NoIHp1IFNldC4gRGllIE1vZHVsdmVyc2lvbmVuIHNpbmQgTklDSFQKKyAgICAgICAgb3B0aW9uYWwgKGFuZGVycyBhbHMgYmVpIElSRSkuIEFsbGVyZGluZ3Mgd2VyZGVuIGF1Y2ggTW9kdWxlIGFuZGVyZXIKKyAgICAgICAgVmVyc2lvbiBhYmdlc2NoYWx0ZXQuIChJbnNvZmVybiBrb2VubnRlIG1hbiAtIHp1ciBaZWl0IC0gZWluZmFjaCBpbW1lciAxCisgICAgICAgIGFscyBWZXJzaW9uc251bW1lciBzZW5kZW4uKQorICAgIC0gQ29yZS5LZWVwQWxpdmUKKyAgICAgICAgVm9tIE1HIGlnbm9yaWVydCwgd2VpbCBWZXJiaW5kdW5nZW4gbmljaHQgYXV0b21hdGlzY2ggZ2V0cmVubnQgd2VyZGVuLgorICAgIC0gQ29yZS5QaW5nCisgICAgICAgIFZlcmFubGFzc3QgZGFzIE1HIG1pdCBlaW5lbSBDb3JlLlBpbmcgenUgYW50d29ydGVuLgorICAgICAgICBEaWUgRGF0ZW4gaXN0IGVpbmUgR2FuenphaGwsIHdlbGNoZSBkaWUgZHVyY2hzY2huaXR0bGljaGUgUGluZ3plaXQKKyAgICAgICAgYXVzIHZlcmhlcmlnZW4gUGluZ3MgZW50aGFlbHQsIGZhbGxzIHZlcmZ1ZWdiYXIuCisgICAgICAgIChBbm1lcmt1bmc6IElSRSBtYWNodCBrZWluZSBBbmdhYmUgdWViZXIgZGllIEVpbmhlaXQgZGllc2VyIFphaGwuIE1HCisgICAgICAgICBnZWh0IHZvbiBNaWxsaXNla3VuZGVuIGF1cy4pCisgICAgICBDb3JlLlBpbmcgMTIwCisgICAgLSBDb3JlLkRlYnVnCisgICAgICAgIEthbm4gZ2VzZW5kZXQgd2VyZGVuLCB1bSBkaWUgQXVzZ2FiZSB2b24gbWVuc2NoZW5sZXNiYXJlbgorICAgICAgICBEZWJ1Z21lbGR1bmdlbiB2b20gR01DUCB6dSBha3RpdmllcmVuLgorICAgICAgICBEaWUgRGF0ZW4gc2luZCBlaW5lIEdhbnp6YWhsLiBKZSBncm9lc3NlciwgZGVzdG8gbWVociBEZWJ1Z21lbGR1bmdlbgorICAgICAgICB3ZXJkZW4gYXVzZ2VnZWJlbi4KKyAgICAgICAgMCBzY2hhbHRldCBkaWUgRGVidWdtZWxkdW5nZW4gYXVzLgorICAgICAgICAxIHNjaGFsdGV0IG51ciBkaWUgQXVzZ2FiZSB2b24gR01DUC1GZWhsZXJuIGFuLgorICAgICAgICAxMDAgc2NoYWx0ZXQgYWxsZXMgYW4uCisgICAgICBDb3JlLkRlYnVnIDEKKyAgVm9tIFNlcnZlciBnZXNlbmRldDoKKyAgICAtIENvcmUuUGluZworICAgICAgICBBbHMgQW50d29ydCBlaW5lcyB2b20gQ2xpZW50IGVtcGZhbmdlbmVuIENvcmUuUGluZyBnZXNlbmRldC4KKyAgICAgICAgS2VpbmUgRGF0ZW4uCisgICAgLSBDb3JlLkdvb2RieWUgW05PVCBJTVBMRU1FTlRFRCBZRVQhXQorICAgICAgICBHZXNlbmRldCB2b20gTVVEIHVubWl0dGVsYmFyIHZvciBWZXJiaW5kdW5nc3RyZW5udW5nLgorICAgICAgICBEaWUgRGF0ZW4gc2luZCBlaW5lIE5hY2hyaWNodCAoc3RyaW5nKSwgd2VsY2hlIGRlbSBVc2VyIGFuZ2V6ZWlndAorICAgICAgICB3ZXJkZW4ga2FubiB1bmQga29lbm5lbiBkZW4gR3J1bmQgZnVlciBkZW4gRGlzY29ubmVjdCBlcmtsYWVyZW4uCisgICAgICBDb3JlLkdvb2RieWUgIkdvb2RieWUsIGFkdmVudHVyZXIiCisKKzEuMi4gTUcuY2hhciAxIChhbmdlbGVobnQgYW4gQWFyZHdvbGYsIGFiZXIgbW9kaWZpemllcnQpCisgIERpZSBVZWJlcnRyYWd1bmcgZGVyIEtvbW1hbmRvcyBpbiBkaWVzZW0gTW9kdWwgd2lyZCBha3RpdmllcnQsIHdlbm4KKyAgIk1HLmNoYXIiIGFrdGl2IGlzdC4gRXMgZ2lidCBrZWluZSBTdWJtb2R1bGUsIGRpZSBnZXRyZW5udCBha3RpdmllcnQgd2VyZGVuCisgIG11ZXNzdGVuLiBEaWUgamV3ZWlsaWdlbiBLb21tYW5kb3Mgd2VyZGVuIGdlc2VuZGV0LCB3ZW5uIHNpY2ggZWlucyBkZXIKKyAgZ2VzZW5kZXRlbiBEYXRlbiBhZW5kZXJ0LgorICBBbGxlIEtvbW1hbmRvcyB3ZXJkZW4gZWlubWFsIGJlaSBNb2R1bGFrdGl2aWVydW5nIGdlc2VuZGV0IChhdWNoIHdlbm4gZWluCisgIE1vZHVsIGR1cmNoIGVpbiBDb3JlLlN1cHBvcnRzLlNldCAoZXJuZXV0KSBha3RpdmllcnQgd2lyZCkuCisgIElzdCBkaWVzZXMgTW9kdWwgdm9tIENsaWVudCB1bnRlcnN0dWV0enQsIHdlcmRlbiBrZWluZSBEYXRlbiBhdXMgZGVuCisgIE1vZHVsZW4gIkNoYXIiIHVuZCAiY2hhciIgZ2VzZW5kZXQuCisgIChTcGllbGVyIGFlbHRlciBhbHMgMTIuMDUuMjAxMyBtdWVzc2VuIGVpbm1hbGlnIGRlbiB0ZXh0dWVsbGVuIFJlcG9ydCBtaXQKKyAgICJyZXBvcnQgZWluIiB1bmQgInJlcG9ydCB2b3JzaWNodCIgZWluc2NoYWx0ZW4sIGRhbWl0IGRpZSBVZWJlcnRyYWd1bmcKKyAgIHZpYSBHTUNQIGZyZWlnZXNjaGFsdGV0IHdpcmQuIERlciBSZXBvcnQga2FubiBkYW5hY2ggd2llZGVyCisgICBhdXNnZXNjaGFsdGV0IHdlcmRlbi4pCisKKzEuMi4yLiBNRy5jaGFyLmJhc2UKKyAgVm9tIFNlcnZlciBnZXNlbmRldDoKKyAgICAtIE1HLmNoYXIuYmFzZQorICAgICAgRWluaWdlIGdydW5kbGVnZW5kZSBFaWdlbnNjaGFmdGVuIGRlcyBDaGFycywgZGllIHNpY2ggc2VsdGVuIGFlbmRlcm4uCisgICAgICBFaW4gIndpemxldmVsIiB2b24gMSB6ZWlndCBhbiwgZGFzcyBkZXIgQ2hhciBlaW4gU2VoZXIgaXN0LgorICAgICAgRGVyICJ0aXRsZSIga2FubiBhbSBBbmZhbmcgZWluIEJhY2tzcGFjZSAiXGIiIGdlZm9sZ3Qgdm9uICIsIiBvZGVyICInIgorICAgICAgZW50aGFsdGVuLgorICAgICAgTUcuY2hhci5iYXNlIHsgIm5hbWUiOiAiSm9mIiwgImd1aWxkIjogIkFiZW50ZXVyZXIiLAorICAgICAgICAgICAgICAgICAgICAgInJhY2UiOiAiRWxmIiwgInByZXNheSI6ICJNdWRnb3R0IiwKKyAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJpZGxldC4iLCAid2l6bGV2ZWwiOiAxMDEgfQorCisxLjIuMy4gTUcuY2hhci52aXRhbHMKKyAgVm9tIFNlcnZlciBnZXNlbmRldDoKKyAgICAtIE1HLmNoYXIudml0YWxzCisgICAgICBBa3R1ZWxsZSBMZWJlbnNwdW5rdGUsIEtvbnplbnRyYXRpb25zcHVua3RlIHVuZCBWZXJnaWZ0dW5nenVzdGFuZC4KKyAgICAgIEltIEZhbGxlIHZvbiBHaWZ0OiBqZSBncm9lc3NlciwgZGVzdG8gc3RhZXJrZXIgZGllIFZlcmdpZnR1bmcuCisgICAgICBNRy5jaGFyLnZpdGFscyB7ICJocCI6IDIxMCwgInNwIjogOTAsICJwb2lzb24iOiAzIH0KKyAgICAtIE1HLmNoYXIubWF4dml0YWxzCisgICAgICBBa3R1ZWxsZSBNYXhpbWFsd2VydGUgZnVlciBMUCwgS1AgdW5kIFZlcmdpZnR1bmdzenVzdGFuZC4gV2VyZGVuIGluCisgICAgICBlaW5lciBzZXBhcmF0ZW4gR3J1cHBlIHVlYmVydHJhZ2VuLCB3ZWlsIHNpZSBzaWNoIHZpZWwgc2VsdGVuZXIgYWVuZGVybi4KKyAgICAgIE1HLmNoYXIubWF4dml0YWxzIHsgIm1heF9ocCI6IDIxMCwgIm1heF9zcCI6IDIyNiwgIm1heF9wb2lzb24iOiAxMCB9CisKKzEuMi40LiBNRy5jaGFyLmF0dHJpYnV0ZXMKKyAgVm9tIFNlcnZlciBnZXNlbmRldDoKKyAgICAtIE1HLmNoYXIuYXR0cmlidXRlcworICAgICAgQWt0dWVsbGUgQXR0cmlidXRlIGRlcyBDaGFycy4KKyAgICAgIERpZSBEYXRlbiBzaW5kIGVpbiBPYmpla3QgTmFtZS1XZXJ0LVBhYXJlbiB2b24gQXR0cmlidXRlbi4KKyAgICAgIE1HLmNoYXIuYXR0cmlidXRlcyB7wqAiaW50IjogMTIsICJjb24iOiAxMCwgInN0ciI6IDgsICJkZXgiOiAxMiB9CisKKzEuMi41LiBNRy5jaGFyLmluZm9WYXJzCisgIFZvbSBTZXJ2ZXIgZ2VzZW5kZXQ6CisgICAgLSBNRy5jaGFyLmluZm9WYXJzCisgICAgICBEaWVzZSBOYWNocmljaHQgZ2lidCBkZW4gInRlY2huaXNjaGVuIiBOYW1lbiBhdXMgTUcuY2hhci5pbmZvIGVpbmVuCisgICAgICBOYW1lbiwgZGVyIGRlbSBTcGllbGVyIHN0YXR0ZGVzc2VuIGFuZ2V6ZWlndCB3ZXJkZW4gc29sbHRlLgorICAgICAgRGllc2UgTmFjaHJpY2h0IHdpcmQgbnVyIGJlaSBNb2R1bGFrdGl2aWVydW5nIGdlc2VuZGV0LgorICAgICAgRGllIERhdGVuIHNpbmQgZWluIE9iamVrdCB2b24gTmFtZS1CZXNjaHJlaWJ1bmctUGFhcmVuLgorICAgICAgTUcuY2hhci5pbmZvVmFycyB7ICJsZXZlbCI6ICJTdHVmZSIsICJndWlsZGxldmVsIjogIkdpbGRlbnN0dWZlIiB9CisKKzEuMi42LiBNRy5jaGFyLmluZm8KKyAgVm9tIFNlcnZlciBnZXNlbmRldDoKKyAgICAtIE1HLmNoYXIuaW5mbworICAgICAgVWViZXJ0cmFlZ3QgKGF1c2dld2FlaGx0ZSkgRGF0ZW4gYXVzIGRlbSBLb21tYW5kbyA8aW5mbz4uCisgICAgICBEaWUgRGF0ZW4gc2luZCBlaW4gT2JqZWt0IHZvbiBOYW1lLVdlcnQtUGFhcmVuLgorICAgICAgKE1vZWdsaWNoZSB3ZWl0ZXJlIEFuZ2FiZW4gaW4gZGVyIFp1a3VuZnQ6IFF1ZXN0cHVua3RlLCBTdHVmZW5wdW5rdGUKKyAgICAgICAoR2VuYXVpZ2tlaXQgMjAlIGVpbmVyIFN0dWZlKSwgLi4uKQorICAgICAgTUcuY2hhci5pbmZvIHsgImxldmVsIjogMjEwLCAiZ3VpbGRsZXZlbCI6IDkgfQorCisxLjIuNy4gTUcuY2hhci53aW1weQorICBWb20gU2VydmVyIGdlc2VuZGV0OgorICAgIC0gTUcuY2hhci53aW1weQorICAgICAgQWt0dWVsbGUgVm9yc2ljaHQgdW5kIGdnZi4gRmx1Y2h0cmljaHR1bmcgZGVzIENoYXIuCisgICAgICBEaWUgRGF0ZW4gc2luZCBlaW4gT2JqZWt0IE5hbWUtV2VydC1QYWFyZSB2b24gVm9yc2ljaHQrRmx1Y2h0cmljaHR1bmcuCisgICAgICBJc3Qga2VpbmUgRmx1Y2h0cmljaHR1bmcgZ2VzZXR6dCwgd2lyZCAwIHVlYmVydHJhZ2VuLgorICAgICAgRnVlciBkaWUgVWViZXJtaXR0bHVuZyBkZXIgVm9yc2ljaHQgbXVzcyBkZXIgQ2hhciBkaWUgUXVlc3QgIkRlciBTY2hyYXQKKyAgICAgIGthbm4gbmljaHQgZWluc2NobGFmZW4iIGdlbG9lc3QgaGFiZW4gdW5kIGZ1ZXIgZGllIEZsdWNodHJpY2h0dW5nCisgICAgICBTZWhlciBzZWluLgorICAgICAgTUcuY2hhci53aW1weSB7wqAid2ltcHkiOiA1MCwgIndpbXB5X2RpciI6ICJub3JkZW4iIH0KKworCisxLjMuIGNoYXIgMSAoQWFyZHdvbGYpCisgIERpZXNlcyBNb2R1bCBpc3Qgc28gYWVobmxpY2ggenVtICJjaGFyIiBNb2R1bCB2b24gQWFyZHdvbGYgd2llIGVzIGdlaHQsIGQuaC4KKyAgZXMgYmVudXR6dCBkaWUgZ2xlaWNoZW4gU2NobHVlc3NlbG5hbWVuLiBFcyBpc3QgYWJlciByZWR1emllcnQgaW0gVW1mYW5nIGRlcgorICBEYXRlbiwgZC5oLiBlcyB1ZWJlcnRyYWVndCB3ZW5pZ2VyIERhdGVuIGFscyBBYXJkd29sZiBlcyB0dXQuCisgIFdhbm4gaW1tZXIgbW9lZ2xpY2gsIHdpcmQgZW1wZm9obGVuLCBkYXMgTW9kdWwgTUcuY2hhciBzdGF0dGRlc3NlbiB6dQorICB2ZXJ3ZW5kZW4uCisgIFdlbm4gTUcuY2hhciBha3RpdiBpc3QsIHdlcmRlbiB2b24gZGllc2VtIE1vZHVsIGtlaW5lIERhdGVuIHVlYmVydHJhZ2VuLgorICBFUyBXSVJEIERBVk9OIEFCR0VSQVRFTiwgRElFU0VTIE1PRFVMIFpVIFZFUldFTkRFTi4KKyAgV2FubiBpbW1lciBtb2VnbGljaCwgc29sbHRldCBpaHIgZXMgaW4gZXVyZW4gQ2xpZW50cyBhYnNjaGFsdGVuIQorCisxLjMuMS4gY2hhci5iYXNlCisgIFZvbSBTZXJ2ZXIgZ2VzZW5kZXQ6CisgICAgLSBjaGFyLmJhc2UKKyAgICAgIEVpbmlnZSBncnVuZGxlZ2VuZGUgRWlnZW5zY2hhZnRlbiBkZXMgQ2hhcnMsIGRpZSBzaWNoIHNlbHRlbiBhZW5kZXJuLgorICAgICAgY2hhci5iYXNlIHsgIm5hbWUiOiAiSm9mIiwgInJhY2UiOiAiRWxmIix9CisKKzEuMy4yLiBjaGFyLnZpdGFscworICBWb20gU2VydmVyIGdlc2VuZGV0OgorICAgIC0gY2hhci52aXRhbHMKKyAgICAgIEFrdHVlbGxlIExlYmVucy0gdW5kIEtvbnplbnRyYXRpb25zcHVua3RlLgorICAgICAgY2hhci52aXRhbHMgeyAiaHAiOiAyMTAsICJtYW5hIjogOTB9CisKKzEuMy4zLiBjaGFyLnN0YXRzCisgIFZvbSBTZXJ2ZXIgZ2VzZW5kZXQ6CisgICAgLSBjaGFyLnN0YXRzCisgICAgICBBa3R1ZWxsZSBBdHRyaWJ1dGUgZGVzIFNwaWVsZXJzLgorICAgICAgRGllIERhdGVuIHNpbmQgZWluIE9iamVrdCBOYW1lLVdlcnQtUGFhcmVuIHZvbiBBdHRyaWJ1dGVuLgorICAgICAgY2hhci5zdGF0cyB7wqAiaW50IjogMTIsICJjb24iOiAxMCwgInN0ciI6IDgsICJkZXgiOiAxMiB9CisKKzEuMy40LiBjaGFyLnN0YXR1cworICBWb20gU2VydmVyIGdlc2VuZGV0OgorICAgIC0gY2hhci5zdGF0dXMKKyAgICAgIEFrdHVlbGxlciBMZXZlbCBkZXMgQ2hhcnMuIChEaWVzIGlzdCBkaWUgZWluemlnZSBBbmdhYmUgYXVzIGRlbSBBYXJkd29sZgorICAgICAgY2hhci5zdGF0dXMsIHdlbGNoZSBkYXMgTUcgbWFjaGVuIGthbm4uKQorICAgICAgRGllIERhdGVuIHNpbmQgZWluIE9iamVrdCBOYW1lLVdlcnQtUGFhcmVuIHZvbiBBdHRyaWJ1dGVuLgorICAgICAgY2hhci5zdGF0dXMgeyAibGV2ZWwiOiAyMTAgfQorCisKKzEuNC4gQ2hhciAxIChJUkUpCisgIERpZXNlcyBNb2R1bCBpc3Qgc28gYWVobmxpY2ggenVtICJDaGFyIiBNb2R1bCB2b24gSVJFIHdpZSBlcyBnZWh0LCBkLmguCisgIGVzIGJlbnV0enQgZGllIGdsZWljaGVuIFNjaGx1ZXNzZWxuYW1lbi4gRXMgaXN0IGFiZXIgcmVkdXppZXJ0IGltIFVtZmFuZyBkZXIKKyAgRGF0ZW4sIGQuaC4gZXMgdWViZXJ0cmFlZ3Qgd2VuaWdlciBEYXRlbiBhbHMgSVJFIGVzIHR1dC4KKyAgV2FubiBpbW1lciBtb2VnbGljaCwgd2lyZCBlbXBmb2hsZW4sIGRhcyBNb2R1bCBNRy5jaGFyIHN0YXR0ZGVzc2VuIHp1CisgIHZlcndlbmRlbi4KKyAgV2VubiBNRy5jaGFyIGFrdGl2IGlzdCwgd2VyZGVuIHZvbiBkaWVzZW0gTW9kdWwga2VpbmUgRGF0ZW4gdWViZXJ0cmFnZW4uCisgIEVTIFdJUkQgREFWT04gQUJHRVJBVEVOLCBESUVTRVMgTU9EVUwgWlUgVkVSV0VOREVOLgorICBXYW5uIGltbWVyIG1vZWdsaWNoLCBzb2xsdGV0IGlociBlcyBpbiBldXJlbiBDbGllbnRzIGFic2NoYWx0ZW4hCisKKzEuNC4xLiBDaGFyLlZpdGFscworICBWb20gU2VydmVyIGdlc2VuZGV0OgorICAgIC0gQ2hhci5WaXRhbHMKKyAgICAgIEFrdHVlbGxlIHVuZCBtYXhpbWFsZSBMZWJlbnMtIHVuZCBLb256ZW50cmF0aW9uc3B1bmt0ZS4KKyAgICAgIENoYXIuVml0YWxzIHsgImhwIjogMjEwLCAibXAiOiA5MCwgIm1heGhwIjogMjEwLCAibWF4bXAiOiAyMjYgfQorCisxLjQuMi4gQ2hhci5TdGF0dXMKKyAgVm9tIFNlcnZlciBnZXNlbmRldDoKKyAgICAtIENoYXIuU3RhdHVzCisgICAgICBBa3R1ZWxsZXIgTGV2ZWwgdW5kIEdpbGRlIGRlcyBDaGFycy4gCisgICAgICBEaWUgRGF0ZW4gc2luZCBlaW4gT2JqZWt0IE5hbWUtV2VydC1QYWFyZW4gdm9uIEF0dHJpYnV0ZW4uCisgICAgICBDaGFyLlN0YXR1cyB7ICJsZXZlbCI6IDIxMCwgImd1aWxkIjogIlphdWJlcmVyIiB9CisKKzEuNC4zLiBDaGFyLlN0YXR1c1ZhcnMKKyAgVm9tIFNlcnZlciBnZXNlbmRldDoKKyAgICAtIENoYXIuU3RhdHVzVmFycworICAgICAgRGllc2UgTmFjaHJpY2h0IGdpYnQgZGVuICJ0ZWNobmlzY2hlbiIgTmFtZW4gYXVzIENoYXIuU3RhdHVzIGVpbmVuCisgICAgICBOYW1lbiwgZGVyIGRlbSBTcGllbGVyIHN0YXR0ZGVzc2VuIGFuZ2V6ZWlndCB3ZXJkZW4gc29sbHRlLgorICAgICAgRGllc2VzIEtvbW1hbmRvIHdpcmQgbnVyIGJlaSBNb2R1bGFrdGl2aWVydW5nIGdlc2VuZGV0LgorICAgICAgRGllIERhdGVuIHNpbmQgZWluIE9iamVrdCB2b24gTmFtZS1CZXNjaHJlaWJ1bmctUGFhcmVuLgorICAgICAgQ2hhci5TdGF0dXNWYXJzIHsgImxldmVsIjogIlNwaWVsZXJzdHVmZSIsICJndWlsZCI6ICJHaWxkZSIgfQorCisKKzEuNS4gY29tbS5jaGFubmVsIDEgKEFhcmR3b2xmKQorICBEaWVzZXMgTW9kdWwgaXN0IGdlbmF1c28gd2llIGVzIEFhcmR3b2xmIGRlZmluaWVydC4gQWxsZXJkaW5ncyB3ZXJkZW4KKyAgbmF0dWVybGljaCBhdXMgZGVtIE1HIGFuZGVyZSBFYmVuZW4gdWViZXJ0cmFnZW4uIDstKQorICBWb20gU2VydmVyIGdlc2VuZGV0OgorICAgIC0gY29tbS5jaGFubmVsCisgICAgICBEaWVzZSBOYWNocmljaHQgd2lyZCBpbW1lciBkYW5uIGdlc2VuZGV0LCB3ZW5uIGplbWFuZCB3YXMgYXVmIGVpbmVyCisgICAgICBlaW5nZXNjaGFsdGV0ZW4gRWJlbmUgc2FndC4gKE5pY2h0IGJlaSBBYnJ1ZiBkZXIgSGlzdG9yeSEpCisgICAgICBadXIgWmVpdCBpc3QgZXMgbmljaHQgbW9lZ2xpY2gsIEViZW5lbiBwZXIgR01DUCBlaW4tIG9kZXIgYXVzenVzY2hhbHRlbi4KKyAgICAgIFdlbm4gZGllc2VzIEdNQ1AtTW9kdWwgZWluZ2VzY2hhbHRldCBpc3QsIHdpcmQgZGllIEF1c2dhYmUgZGVyCisgICAgICBFYmVuZW5tZWxkdW5nIGluIGRlciBub3JtYWxlbiBTcGllbGF1c2dhYmUgZGVzIE1HIHVudGVyZHJ1ZWNrdC4KKyAgICAgIEFjaHR1bmc6IFp1ciBaZWl0IGVyZm9sZ3QgKG5vY2gpIGtlaW5lIEJlcnVlY2tzaWNodHVuZyBldXJlcgorICAgICAgImlnbm9yaWVyZSItRWluc3RlbGx1bmdlbiBiZWkgZGVuIHZpYSBHTUNQIHVlYmVydHJhZ2VuZW4KKyAgICAgIEViZW5lbm1lbGR1bmdlbi4KKyAgICAgIGNvbW0uY2hhbm5lbCB7ICJjaGFuIjogImFsbGdlbWVpbiIsCisgICAgICAgICAgIm1zZyI6ICJbQWxsZ2VtZWluOk1haGFyZXRdIEd1dGVuIE1vcmdlbiwgR3JhdWVuISIsIAorICAgICAgICAgICJwbGF5ZXIiOiAiTWFoYXJldCIgfQorCisKKzEuNS4gTUcudGVhbSAxIChlaWdlbmUgVmFyaWFudGUsIGluc3BpcmllcnQgdm9uIEFhcmR3b2xmKQorICAgICBLb21tdCBzcGFldGVyLiA7LSkKKworCisxLjYuIE1HLnJvb20gMSAoZWlnZW5lIFZhcmlhbnRlLCBpbnNwaXJpZXJ0IHZvbiBBYXJkd29sZikKKyAgTUcucm9vbSBiZWluaGFsdGV0IEluZm9ybWF0aW9uZW4gdWViZXIgZGVuIGFrdHVlbGxlbiBSYXVtIGRlcyBTcGllbGVycworCisgIFZvbSBTZXJ2ZXIgZ2VzZW5kZXQ6CisgIC0gTUcucm9vbS5pbmZvCisgICAgRGllc2UgTmFjaHJpY2h0aWcgd2lyZCBpbW1lciBuYWNoIEJldHJldGVuIGVpbmVzIG5ldWVuIFJhdW1lcyBnZXNlbmRldAorICAgIHVuZCBlbnRoYWVsdCBmb2xnZW5kZSBJbmZvcm1hdGlvbmVuOgorICAgICogaWQ6IEVpbmUgZWluZGV1dGlnZSBJRCBkZXMgUmF1bWVzICh0ZWNobmlzY2g6IGVpbiBNRDUtSGFzaCkKKyAgICAgICAgRGllc2UgQW5nYWJlIGZlaGx0IGluIExhYnlyaW50aHJhZXVtZW4gKG5pY2h0IGdld29sbHQpIHVuZCBpbiBlaW5pZ2VuCisgICAgICAgIHNwZXppZWxsZW4gUmFldW1lbiAodGVjaG5pc2NoZSBHcnVlbmRlLCB6LkIuIG1hbmNoZSAndmlydHVhbAorICAgICAgICBjb21waWxlcicpLiBJbiBkaWVzZW0gRmFsbCBpc3QgZGllIElEICIiIChsZWVyZXIgU3RyaW5nKS4KKyAgICAqIHNob3J0OiBEaWUgS3VyemJlc2NocmVpYnVuZyBkZXMgUmF1bWVzCisgICAgKiBkb21haW46IERpZSBSZWdpb24sIGluIGRlciBkZXIgUmF1bSBsaWVndAorICAgICAgICBNYW5jaGUgUmFldW1lIGxpZWdlbiBuaWNodCBpbiBkZW4gUmVnaW9uZW4uIEluIGRlbSBGYWxsIGZlaGx0IGRpZXNlCisgICAgICAgIEFuZ2FiZS4KKyAgICAqIGV4aXRzOiBlaW5lIExpc3RlIHZvbiBzaWNodGJhcmVuIEF1c2dhZW5nZW4gKGQuaC4gdW5zaWNodGJhcmUgQXVzZ2FlbmdlCisgICAgICAgIHdlcmRlbiBuaWNodCBhbmdlemVpZ3QpLgorICAgIEhpbndlaXM6IGVzIGlzdCBtb2VnbGljaCwgZGFzcyBkZXIgU3BpZWxlciBpbiBlaW5lbiBSYXVtIGJld2VndCB3aXJkLAorICAgIGRlciB6d2FyIHRlY2huaXNjaCBlaW4gYW5kZXJlciBSYXVtIGlzdCwgYWJlciBrZWluIGFuZGVyZXIgT3J0LiBJbgorICAgIGRpZXNlbSBGYWxsIHVudGVyYmxlaWJ0IGRpZXNlIE5hY2hyaWNodC4KKyAgICByb29tLmluZm8geyAiaWQiOiAiZDQxZDhjZDk4ZjAwYjIwNGU5ODAwOTk4ZWNmODQyN2UiLAorICAgICAgICAgICAgICAgICJzaG9ydCI6ICJEaWUgYmVydWVobXRlIEFiZW50ZXVyZXJnaWxkZSIsCisgICAgICAgICAgICAgICAgImRvbWFpbiI6ICJFYmVuZSIsCisgICAgICAgICAgICAgICAgZXhpdHM6IFsgIm5vcmRlbiIsICJvYmVuIiBdIH0KKworCisyLiBWZXJnbGVpY2ggbWl0IEdNQ1AgaW4gQWFyZHdvbGYgdW5kIElSRSBNdWRzCisgICBJbSBNb3JnZW5ncmF1ZW4gd2lyZCBHTUNQIGxldHp0ZW5kbGljaCBudXIgYWxzIFNwZXppZmlrYXRpb24gZGVzIFRyYW5zcG9ydAorICAgTGF5ZXJzIGJldHJhY2h0ZXQsIGRhIGJlaSBkZW4gTW9kdWxlbiBqZWRlcyBNdWQgc2VpbmUgZWlnZW5lIERlZmluaXRpb24gZGVyCisgICB1ZWJlcnRyYWdlbmVuIERhdGVuIHVuZCBpaHJlciBCZWRldXR1bmcgdm9ybmltbXQuCisKKyAgIERhcyBNb2R1bCAiQ2hhciIgaXN0IGF1cyBkZW4gSVJFLU11ZHMsIHdlbGNoZXMgbnVyIGV4aXN0aWVydCwgd2VpbCBlaW5pZ2UKKyAgIENsaWVudHMgZXMgc3RhbmRhcmRtYWVzc2lnIHNjaG9ubWFsIGVpbnNjaGFsdGVuLiBFcyBzZW5kZXQgYWJlciBudXIgZWluZW4KKyAgIE1pbmltYWxzYXR6IGFuIERhdGVuLgorICAgRGFzIE1vZHVsICJjaGFyIiBpc3QgYXVzIEFhcmR3b2xmLCB3ZWxjaGVzIG51ciBleGlzdGllcnQsIHdlaWwgZWluaWdlCisgICBDbGllbnRzIGVzIHN0YW5kYXJkbWFlc3NpZyBzY2hvbm1hbCBlaW5zY2hhbHRlbi4gRXMgc2VuZGV0IGFiZXIgbnVyIGVpbmVuCisgICBNaW5pbWFsc2F0eiBhbiBEYXRlbi4KKworICAgRGVtIE1vZHVsIE1HLmNoYXIgc29sbHRlIGltbWVyIGRlciBWb3J6dWcgdm9yICJDaGFyIiBvZGVyICJjaGFyIiBnZWdlYmVuCisgICB3ZXJkZW4sIGRhIGRvcnQgZGV1dGxpY2ggbWVociBEYXRlbiB1ZWJlcnRyYWdlbiB3ZXJkZW4uCisKKyAgIERhcyBNb2R1bCAiUm9vbSIgYXVzIElSRSB3aXJkIG5pY2h0IHVudGVyc3R1ZXR6dCwgd2VpbCBzZWluZSBEYXRlbiB2b20gTUcKKyAgIGdyb2Vzc3RlbnRlaWxzIG5pY2h0IGluIGRlciBnZWZvcmRlcnRlbiBGb3JtIGJlcmVpdGdlc3RlbGx0IHdlcmRlbiBrb2VubmVuCisgICAoenVtaW5kZXN0IG5pY2h0IG9obmUgdW5nZXJlY2h0ZmVydGlndGVuIEF1ZndhbmQpLgorCiszLiBUcmFuc3BvcnQgU3BlY2lmaWNhdGlvbgorICAgRWluc3R3ZWlsZW4gYW0gYmVzdGVuIGF1ZiBodHRwOi8vd3d3LmdhbW1vbi5jb20uYXUvZ21jcCBuYWNobGVzZW4uCisKKyAgIEtvbW10IGhpZXIgdmllbGxlaWNodCBzcGFldGVyIG5vY2gsIGVpbnN0d2VpbGVuIGFtIGJlc3RlbiBpbSBOZXR6CisgICBuYWNoZ3Vja2VuLgorCis0LiBJbXBsZW1lbnRhdGlvbnNkZXRhaWxzCisgIEltIE1HIGlzdCBHcm9zcy0vS2xlaW5zY2hyZWlidW5nIGRlcyBNb2R1bG5hbWVucyB3aWNodGlnLCBpbSBHZWdlbnNhdHogenVtCisgIElSRS4gTWVpbmVzIFdpc3NlbnMgKGJpdHRlIGtvcnJpZ2llcnQgbWljaCBnZ2YuKSwgbWFjaHRlIGRpZQorICBUcmFuc3BvcnRzcGV6aWZpa2F0aW9uIGtlaW5lIEF1c3NhZ2UgaW4gZGllc2VtIFB1bmt0LCBzb25kZXJuIElSRSBoYXQgZGllcworICBlbnRzY2hpZWRlbi4KKyAgSmV0enQgaXN0IGVzIHNvLCBkYXNzIEFhcmR3b2xmIHRlaWxzIE1vZHVsZSBtaXQgZGVtIGdsZWljaGVuIE5hbWVuLCBhYmVyCisgIGFuZGVyZXIgRnVua3Rpb24gd2llIElSRSBnZWJhdXQgaGF0LiBBbGxlIERva3Ugdm9uIEFhcmR3b2xmIHNjaHJlaWJ0IGFiZXIKKyAgaW1tZXIgdm9uIGtsZWluZ2VzY2hyaWViZW5lbiBNb2R1bG5hbWVuLiBJbnNvZmVybiBpc3QgZGFzIGpldHp0IGVpbiBWZXJzdWNoLAorICBkaWUgTW9kdWxlIHZvbiBJUkUvQWFyZHdvbGYgZG9jaCBpcmduZGVuZHdpZSBhdXNlaW5hbmRlciB6dSBoYWx0ZW4uCisKKworNS4gQ2xpZW50LUtyYW0KKzUuMS4gVGlwcyB1bmQgSGlud2Vpc3MKKyAgTWFuY2hlIENsaWVudHMgemVpZ2VuIGRpZSBlbXBmYW5nZW5lbiBHTUNQLURhdGVuIHN0YW5kYXJkbWFlc3NpZyBhdWYgZGVtCisgIEJpbGRzY2hpcm0gYW4uCisgIE5vcm1hbGVyd2Vpc2Ugc29ydGllcmVuIHNpZSBkaWUgRGF0ZW4gIGFiZXIgaW4gdm9uIFNjcmlwdGVuIG51dHpiYXJlCisgIFRhYmVsbGVuIGVpbiwgc28gZGFzcyBlcyBlbnRmYWVsbHQsIGlyZ2VuZGVpbmVuIFRleHQgenUgcGFyc2VuLgorICBJbiBkZXIgUmVnZWwgaXN0IGVzIGRhbm4gYXVjaCBzbywgZGFzcyBkZXIgQ2xpZW50IE1vZWdsaWNoa2VpdGVuIGFuYmlldGV0LAorICBhdWYgZGVuIEVtcGZhbmcgdm9uIEdNQ1AtRGF0ZW4gcmVhZ2llcmVuIHp1IGtvZW5uZW4gKHouQi4gbmVuIFNjcmlwdAorICBhdWZydWZlbiB6dSBsYXNzZW4pLgorCis1LjIuIENsaWVudHMgbWl0IEdNQ1AtTUctU3VwcG9ydAorCis1LjMuIENsaWVudHMgbWl0IEdNQ1AtU3VwcG9ydCAoVHJhbnNwb3J0IFNwZWMpCisgICogTXVkbGV0IChodHRwOi8vZm9ydW1zLm11ZGxldC5vcmcvdmlld3RvcGljLnBocD9mPTcmdD0xNTQ3KQorICAgIEltIE5ldHogc2luZCBkaXYuIHdlaXRlcmUgUXVlbGxlbiB1bmQgVHV0b3JpYWwgenUgZmluZGVuLgorICAqIFRpbnRpbisrIChodHRwOi8vdGludGluLnNvdXJjZWZvcmdlLm5ldC9ib2FyZC92aWV3dG9waWMucGhwP3A9NDY1MSkKKyAgKiBURiA1IChodHRwOi8vbWlrZXJpZGUuY2hhb3NuZXQub3JnL2FiZWxpbmMvc2NyaXB0cy90ZWxvcHQuaHRtbCkKKyAgKiBDTVVEIChodHRwOi8vZm9ydW1zLnp1Z2dzb2Z0LmNvbS9mb3J1bXMvdmlld3RvcGljLnBocD9wPTE1ODQ1NSMxNTg0NTUpCisgICogTXVzaGNsaWVudCAoaHR0cDovL3d3dy5hYXJkd29sZi5jb20vd2lraS9pbmRleC5waHAvQ2xpZW50cy9NdXNoY2xpZW50R01DUCkKKworCis2LiBBbmdlZGFjaHRlIE1vZHVsZSBmdWVyIGRpZSBadWt1bmZ0CitPYiB1bmQgd2FubiBldHdhcyBhdXMgZGllc2VtIEJlcmVpY2gga29tbXQsIGlzdCB2b2VsbGlnIG9mZmVuLiBIYWVuZ3QgYXVjaCB2b20KK0ludGVyZXNzZSBkZXIgU3BpZWxlcnNjaGFmdCBhYi4KKworNi4zLiBDaGFyLkl0ZW1zIChJUkUpCisgIEVpZ2VudGxpY2ggZWhlciB3ZW5pZ2VyIGdlcGxhbnQuLi4KKworTEVUWlRFIEFlTkRFUlVORzoKKzA5LjAxLjIwMTYsIFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL2hlbHAvYWJlbnRldWVyIGIvZG9jL2hlbHAvYWJlbnRldWVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMjlkYjQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaGVscC9hYmVudGV1ZXIKQEAgLTAsMCArMSw0MSBAQAorCitBYmVudGV1ZXIKKz09PT09PT09PQorCisgICAgVW0gaW0gTW9yZ2VuR3JhdWVuIHp1IGV0d2FzIHp1IGtvbW1lbiwgbXVzcyBtYW4gQWJlbnRldWVyIChpbgorICAgIGVuZ2xpc2Noc3ByYWNoaWdlbiBNVURzIGFscyAnUXVlc3RzJyBiZWthbm50KSBsb2VzZW4uIEZ1ZXIgYmVzdGFuZGVuZQorICAgIEFiZW50ZXVlciBiZWtvbW10IG1hbiBBYmVudGV1ZXJwdW5rdGUuIE51ciB3ZXIgZ2VudWcgQWJlbnRldWVycHVua3RlCisgICAgYmVrb21tZW4gaGF0LCBrYW5uIE1hZ2llciBvZGVyIFNlaGVyIHdlcmRlbi4gSmUga29tcGxpemllcnRlciBlaW4KKyAgICBBYmVudGV1ZXIgenUgbG9lc2VuIGlzdCwgZGVzdG8gbWVociBBYmVudGV1ZXJwdW5rdGUgYmVrb21tdCBtYW4gYmVpbQorICAgIEJlc3RlaGVuLgorCisgICAgRWluaWdlIEFiZW50ZXVlciBzaW5kIG5pY2h0IG51ciBzY2h3ZXIsIHNvbmRlcm4gYXVjaCBnZWZhZWhybGljaC4gRGllc2UKKyAgICBzb2xsdGVuIG51ciB2b24gU3BpZWxlcm4gYXVmIGVpbmVyIGhvaGVuIFN0dWZlIGluIEFuZ3JpZmYgZ2Vub21tZW4gd2VyZGVuLgorCisgICAgRWluZSBMaXN0ZSBhbGxlciB2b3JoYW5kZW5lbiBBYmVudGV1ZXIga2FubiBtYW4gaW4gZGVuIEdpbGRlbiBtaXQgZGVtCisgICAgQmVmZWhsICdsaXN0ZScgYmVrb21tZW4uIERvcnQgd2VyZGVuIGF1Y2ggZGllIFB1bmt0ZSBmdWVyIGRhcyBBYmVudGV1ZXIKKyAgICBhbmdlemVpZ3QuIERpZSBBYmVudGV1ZXIgc2luZCBpbiBkZXIgTGlzdGUgaW4gZXR3YSBuYWNoIGRlcgorICAgIEdlZmFlaHJsaWNoa2VpdCBzb3J0aWVydC4gRGllIFN0dWZlLCBkaWUgZG9ydCBhbmdlZ2ViZW4gaXN0LCBiZXppZWh0IHNpY2gKKyAgICBuaWNodCBhbGxlaW4gYXVmIGRpZSBTcGllbGVyc3R1ZmUsIHNvbmRlcm4ga2FubiBhdWNoIGFscyBIaW53ZWlzIGF1ZiBkaWUKKyAgICBkdXJjaHNjaG5pdHRsaWNoZW4gQXR0cmlidXRlIHZlcnN0YW5kZW4gd2VyZGVuLCBkaWUgbWFuIHp1bSBMb2VzZW4gZGVzCisgICAgQWJlbnRldWVycyBhdWZ3ZWlzZW4gc29sbHRlLgorCisgICAgSW4gZGVyIEhvY2hlYmVuZSBpc3QgZWluIGFsdGVyIFdhbmRlcmVyIHp1IGZpbmRlbiwgZGVyIGVpbmVtIHNhZ2VuIGthbm4sCisgICAgd29yaW4gZGllIEF1ZmdhYmUgYmVpIGRlbiBBYmVudGV1ZXJuIGJlc3RlaHQuIEVyIHNhZ3QgKHdpcmQgZWlubWFsIHNhZ2VuKSwKKyAgICBvYiBkYXMgQWJlbnRldWVyIG5pY2h0IHp1IGdlZmFlaHJsaWNoIGZ1ZXIgZGVuIFNwaWVsZXIgaXN0LgorCisgVEVDSE5JU0NIRVIgSElOV0VJUzoKKyAgICBXZW5uIG1hbiBlaW4gQWJlbnRldWVyIGR1cmNoc3BpZWx0LCBzb2xsdGUgbWFuIG5pY2h0IGVpbnNjaGxhZmVuIChzZWluZQorICAgIFZlcmJpbmR1bmcgenVtIE1vcmdlbkdyYXVlbiBrYXBwZW4pLCBkYSBuaWNodCBnYXJhbnRpZXJ0IHdlcmRlbiBrYW5uLCBkYXNzCisgICAgZGFzIEFiZW50ZXVlciBhdWNoIG5hY2ggZGVtIFdpZWRlcmVyd2FjaGVuIG5vY2ggd2VpdGVyZ2VzcGllbHQgd2VyZGVuCisgICAga2Fubi4KKworICAgIE1hbmNobWFsIGlzdCBlaW4gR2VnZW5zdGFuZC9RdWVzdC1OUEMgZ2VyYWRlIG5pY2h0IGRhLCB6QiB3ZWlsIGVpbgorICAgIE1pdHNwaWVsZXIgZGllIFF1ZXN0IGdlbG9lc3Qgb2RlciBkZW4gTlBDIGdldG9ldGV0IGhhdC4gRGFubiBtdXNzdCBkdQorICAgIGJpcyB6dW0gbmFlY2hzdGVuIFJlc2V0IHdhcnRlbi4KKworIFNJRUhFIEFVQ0g6CisgICAgYWJlbnRldWVybGlzdGUsIHN0dWZlbiwgc3R1ZmVucHVua3RlLCBzY2hsYWZlLCBrYW1wZiwgcmVzZXQKKworMS4xMS4yMDEyLCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9oZWxwL2FiZW50ZXVlcmxpc3RlIGIvZG9jL2hlbHAvYWJlbnRldWVybGlzdGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FjMmZmZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9oZWxwL2FiZW50ZXVlcmxpc3RlCkBAIC0wLDAgKzEsMzQgQEAKK0FiZW50ZXVlcmxpc3RlCis9PT09PT09PT09PT09PQorCisgRGllIExpc3RlIGRlciBzcGllbGJhcmVuIEFiZW50ZXVlciBoYWVuZ3QgaW4gamVkZXIgR2lsZGUgaW0gTW9yZ2VuR3JhdWVuIGF1cy4KKyBTaWUgaXN0IG1pdCBkZW0gS29tbWFuZG8gImxpc3RlIiBhYnJ1ZmJhci4KKworIERpZSBpbiBkZXIgTGlzdGUgdmVyd2VuZGV0ZW4gQWJrdWVyenVuZ2VuIHdlcmRlbiBpbSBGb2xnZW5kZW4gZXJsYWV1dGVydDoKKyAKKyBBUCAgICAgICA9IEZ1ZXIgZGllIFF1ZXN0IHZlcmdlYmVuZSBBYmVudGV1ZXJwdW5rdGUKKyBLbGFzc2UgICA9IFN1Ympla3RpdmUgRWluc3R1ZnVuZyBpbm5lcmhhbGIgZGVyIEdydXBwZSBiemdsLiBBcmJlaXRzYXVmd2FuZCwKKyAgICAgICAgICAgIERhdWVyIG9kZXIgR2VmYWhyZW4KKyBBdHRyaWJ1dCA9IEtlaW5lcyAgICAtPiBLZWluZSBiZXNvbmRlcmVuIENoYXJha3RlcmlzdGlrYQorICAgICAgICAgICAgRmxlaXNzaWcgIC0+IFZvcm5laG1saWNoIFNhbW1lbG4sIEF1ZmZpbmRlbiB2b24gSXRlbXMgb2RlciB2b24KKyAgICAgICAgICAgICAgICAgICAgICAgICBJbmZvcm1hdGlvbmVuCisgICAgICAgICAgICBIZXJvaXNjaCAgLT4gSGVsZGVudGF0LCBkaWUgTXV0LCBLYW1wZmJlcmVpdHNjaGFmdCB1bmQgZWluZQorICAgICAgICAgICAgICAgICAgICAgICAgIGdld2lzc2UgQmVyZWl0c2NoYWZ0IHp1bSBGb3JzY2hlbiBicmF1Y2h0CisgICAgICAgICAgICBFcGlzY2ggICAgLT4gR3Jvc3NlIEFuZm9yZGVydW5nZW4gYW4gQXVzZGF1ZXIgdW5kIE11dCwgZ3Jvc3NlcgorICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZndhbmQgZnVlciBkYXMgRXJmb3JzY2hlbiBkZXIgTG9lc3VuZywgS2FlbXBmZQorICAgICAgICAgICAgICAgICAgICAgICAgIG1pdHRsZXJlciBIYWVydGUKKyAgICAgICAgICAgIExlZ2VuZGFlciAtPiBCYXJkZW4gcHJlaXNlbiBkaWUgRWluc2F0emJlcmVpdHNjaGFmdCBkZXIgSGVsZGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2h0IGdyb3NzZSBHZWZhaHIgZnVlciBMZWliIHVuZCBMZWJlbiwgbWl0dW50ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICBsYW5nZSBRdWVzdHplaXQKKyBTdHVmZSAgICA9IFZvciBkZW0gLyBzdGVodCBkaWUgZW1wZm9obGVuZSBTdHVmZSBmdWVyIGRpZSBRdWVzdC4gRGllc2UgaXN0IAorICAgICAgICAgICAga2VpbmUgVm9yYXVzc2V0enVuZywgYXVzc2VyIGJlaSBTZWhlcnF1ZXN0cywgZGllIHRlaWx3ZWlzZSBkZW4KKyAgICAgICAgICAgIFN0YXR1cyB2b3JhdXNzZXR6ZW4uCisgICAgICAgICAgICBOYWNoIGRlbSAvIHN0ZWhlbiBkaWUgRHVyY2hzY2huaXR0c3N0dWZlbiBkZXIgbG9lc2VuZGVuIFNwaWVsZXIuCisgQXV0b3IgICAgPSBNYWdpZXIsIGRlciBkaWUgUXVlc3QgZ2VzY2hyaWViZW4gaGF0CisKKworIFNJRUhFIEFVQ0g6CisgICAgYWJlbnRldWVyLCBzdHVmZW4sIHN0dWZlbnB1bmt0ZSwgc2NobGFmZSwga2FtcGYsIHJlc2V0CisKKzI2LjA1LjIwMTYsIFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL2hlbHAvYWJlbnRldXJlciBiL2RvYy9oZWxwL2FiZW50ZXVyZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIyMzg2MQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9oZWxwL2FiZW50ZXVyZXIKQEAgLTAsMCArMSwzNSBAQAorCitEaWUgQWJlbnRldXJlcmdpbGRlCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBEaWUgbWVpc3RlbiBuZXVlbiBTcGllbGVyIHNpbmQgYXV0b21hdGlzY2ggTWl0Z2xpZWQgZGVyIEFiZW50ZXVyZXJnaWxkZS4KKyAgICBEaWUgR2lsZGUgYmVoZXJiZXJndCBhbGxlIFNwaWVsZXIsIGRpZSBrZWluZXIgYW5kZXJlbiBHaWxkZSBhbmdlaG9lcmVuLAorICAgIHNlaSBlcyBkdXJjaCBHZWJ1cnQgb2RlciBmcmVpd2lsbGlnZW4gV2VjaHNlbC4KKworICAgIERhcyBHaWxkZW5oYXVzIGJlZmluZGV0IHNpY2ggaW4gZGVyIFN0YWR0IFBvcnQgVmFpbi4gRG9ydCBpc3QgZWlnZW50bGljaAorICAgIGltbWVyIGV0d2FzIGxvcy4KKworICAgIERpZSBBYmVudGV1cmVyZ2lsZGUgc3RlbGx0IGVpbiBwYWFyIFphdWJlcnNwcnVlY2hlIHp1ciBWZXJmdWVndW5nLCBpc3QKKyAgICBhYmVyIG5pY2h0IHVuYmVkaW5ndCBkaWUgc3RhZXJrc3RlIEdpbGRlLiBTaWUgaXN0IGVoZXIgZGFmdWVyIGdlZGFjaHQsCisgICAgZGFzcyBtYW4gc2ljaCBhbHMgQWJlbnRldXJlciBpbiBkaWUgV2VsdCBkZXMgTW9yZ2VuR3JhdWVuIGVpbnNwaWVsZW4ga2FubgorICAgIHVuZCBzaWNoIGVpbmVuIFVlYmVyYmxpY2sgdmVyc2NoYWZmdCwgYmV2b3IgbWFuIHNpY2ggZnVlciBlaW5lIEthcnJpZXJlIGluCisgICAgZWluZXIgZGVyIGFuZGVyZW4gR2lsZGVuIGVudHNjaGxpZXNzdC4KKworICAgIEVzIGdpYnQgamVkb2NoIGF1Y2ggdmVyd2VnZW5lIFNwaWVsZXIsIGRpZSBlcyBhbHMgQWJlbnRldXJlciB6dSBncm9zc2VtCisgICAgUnVobSBnZWJyYWNodCBoYWJlbi4KKworIFNJRUhFIEFVQ0g6CisgICAgZ2lsZGVuLAorICAgIHN0ZWluc2NobGFnICg1UC9TMSksIGlkZW50aWZpemllcmUgKDEwUC9TMyksIGxpY2h0ICg1UC9TNiksCisgICAgc2NoYWV0eiAoM1AvUzgpLCBwZmVpbCAoMTBQL1MxMCksIGF1c3dlaWNoZW4gKDEwUC9TMTMpLCAKKyAgICBrYW1wZnNjaHJlaSAoMzBQL1MxNiksIGZldWVyYmFsbCAoMjBQL1MxOCksIHNjaG5lbGwgKDEwMFAvUzIxKSwgCisgICAgc2FldXJlc3RyYWhsICgyNVAvUzI4KS4KKworICAgIEZ1ZXIgZGllIFdlcnRlIGluIEtsYW1tZXJuIGdpbHQ6IFA9TWFnaWVrb3N0ZW47IFM9U3R1ZmUgenVtIEVybGVybmVuLgorCisgICAgKklzdCBtYW4gTWl0Z2xpZWQgZWluZXIgYW5kZXJlbiBHaWxkZSwgc28gbXVzcyBtYW4gZnVlciBkaWUgSGlsZmVuIHp1IGRlbgorICAgIFNwcnVlY2hlbiBgaGlsZmUgZ2lsZGUgYWJlbnRldXJlciA8bmFtZT4nIGJlbnV0emVuISoKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgMDMuMTEuMjAxMiwgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2MvaGVscC9hYmVudG9pcmEgYi9kb2MvaGVscC9hYmVudG9pcmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJiYWM4NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9oZWxwL2FiZW50b2lyYQpAQCAtMCwwICsxLDM1IEBACitEaWUgQWJlbnRvaXJhZ2lsZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEFscyBrbGVpbmVyLCBmcmlzY2ggZXJzY2hhZmZlbmVyIEdvYmxpbiBpc3QgbWFuIGF1dG9tYXRpc2NoIE1pdGdsaWVkIGRlcgorICAgIEFiZW50b2lyYWdpbGRlLiBEaWVzZSBpc3QgZGllIEdvYmxpbi1ad2VpZ3N0ZWxsZSBkZXIgYmVrYW5udGVuCisgICAgQWJlbnRldXJlcmdpbGRlLgorCisgICAgRGFzIEhhdXB0LUdpbGRlbmhhdXMgYmVmaW5kZXQgc2ljaCBpbiBkZXIgU3RhZHQgUG9ydCBWYWluLiBOdXIgZG9ydCBzaW5kCisgICAgR2lsZGVuZWluLSB1bmQgLWF1c3RyaXR0IG1vZWdsaWNoLCBhdWNoIGthbm4gbWFuIG51ciBkb3J0IG5ldWUKKyAgICBaYXViZXJzcHJ1ZWNoZSBsZXJuZW4uIFNlaW5lIFN0dWZlIGthbm4gbWFuIGluIGplZGVtIEdpbGRlbmhhdXMgZXJob2VoZW4sCisgICAgamVkb2NoIHdlcmRlbiBlaW5lbSBHb2JsaW4gbnVyIGluIGRlciBad2VpZ3N0ZWxsZSBpbSBHb2JsaW5kb3JmIGJlaW0KKyAgICBBdWZzdGllZyBzZWluZSBiZXNvbmRlcmVuIEFiZW50b2lyYS1UaXRlbCB2ZXJsaWVoZW4hCisKKyAgICBEaWUgQWJlbnRldXJlcmdpbGRlIHN0ZWxsdCBlaW4gcGFhciBaYXViZXJzcHJ1ZWNoZSB6dXIgVmVyZnVlZ3VuZywgaXN0CisgICAgYWJlciBuaWNodCB1bmJlZGluZ3QgZGllIHN0YWVya3N0ZSBHaWxkZS4gU2llIGlzdCBlaGVyIGRhZnVlciBnZWRhY2h0LAorICAgIGRhc3MgbWFuIHNpY2ggYWxzIEFiZW50ZXVyZXIgaW4gZGllIFdlbHQgZGVzIE1vcmdlbkdyYXVlbiBlaW5zcGllbGVuIGthbm4KKyAgICB1bmQgc2ljaCBlaW5lbiBVZWJlcmJsaWNrIHZlcnNjaGFmZnQsIGJldm9yIG1hbiBzaWNoIGZ1ZXIgZWluZSBLYXJyaWVyZQorICAgIGluIGVpbmVyIGRlciBhbmRlcmVuIEdpbGRlbiBlbnRzY2hsaWVzc3QuCisKKyAgICBFcyBnaWJ0IGplZG9jaCBhdWNoIHZlcndlZ2VuZSBTcGllbGVyLCBkaWUgZXMgYWxzIEFiZW50ZXVyZXIgenUgZ3Jvc3NlbQorICAgIFJ1aG0gZ2VicmFjaHQgaGFiZW4uCisKKyBTSUVIRSBBVUNIOgorICAgIGdpbGRlbiwKKyAgICBsaWNodCAoNVAvUzQpLCBpZGVudGlmaXppZXJlICgxMFAvUzgpLCBzY2hhZXR6ICgzUC9TMTApLCBwZmVpbCAoMTBQL1MxMSksCisgICAgYXVzd2VpY2hlbiAoMTBQL1MxMiksIGthbXBmc2NocmVpICgzMFAvUzEzKSwgZmV1ZXJiYWxsICgyMFAvUzE1KSwKKyAgICBzY2huZWxsICgxMDBQL1MxNyksIHNhZXVyZXN0cmFobCAoMjVQL1MzMCkuCisKKyAgICBGdWVyIGRpZSBXZXJ0ZSBpbiBLbGFtbWVybiBnaWx0OiBQPU1hZ2lla29zdGVuOyBTPVN0dWZlIHp1bSBFcmxlcm5lbi4KKworICAgICpJc3QgbWFuIE1pdGdsaWVkIGVpbmVyIGFuZGVyZW4gR2lsZGUsIHNvIG11c3MgbWFuIGZ1ZXIgZGllIEhpbGZlbiB6dSBkZW4KKyAgICBTcHJ1ZWNoZW4gYGhpbGZlIGdpbGRlIGFiZW50ZXVyZXIgPG5hbWU+JyBiZW51dHplbiEqCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIDEuSmFuIDIwMDggS2Vzc2EKZGlmZiAtLWdpdCBhL2RvYy9oZWxwL2FiayBiL2RvYy9oZWxwL2FiawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTljOTM4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2hlbHAvYWJrCkBAIC0wLDAgKzEsNzIgQEAKK0hhZXVmaWcgYmVudXR6dGUgQWJrdWVyenVuZ2VuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgIDExICAgICAgIEVsZgorICAgICAxMTIgICAgICBGZXVlcndlaHIKKyAgICAgQWRUICAgICAgQXVnZSBkZXMgVGV1ZmVscyAoUXVlc3QpCisgICAgIEFGUiAgICAgIEFudGktRmV1ZXItUmluZworICAgICBBUCAgICAgICBBYmVudGV1ZXJwdW5rdGUKKyAgICAgQUZBSUsgICAgQXMgZmFyIGFzIGkga25vdyAoc293ZWl0IGljaCB3ZWlzcykKKyAgICAgQUtVRUZJICAgQWJrdWVyenVuZ3NmaW1tZWwKKyAgICAgQXVyICAgICAgQXVyb3JhCisgICAgIEFVICAgICAgIEF1c2RhdWVyCisgICAgIEJTUyAgICAgIEJsdXRzYXVnZXItU2Nod2VydAorICAgICBDNCAgICAgICBaZXBoeXIKKyAgICAgQ0sgICAgICAgQ2hhb3NrbmVpcGUKKyAgICAgRDExICAgICAgRHVua2VsZWxmCisgICAgIEREICAgICAgIERhZW1vbmVuZGltZW5zaW9uCisgICAgIERFKExGKSAgIER1bmtlbGVsZgorICAgICBERyAgICAgICBEcmFjaGVuZ290dAorICAgICBFRSAgICAgICBFbGVtZW50YXJlYmVuZW4KKyAgICAgRUsgICAgICAgRXJzdGtpbGwKKyAgICAgRUtTUCAgICAgRXJzdGtpbGwtU3R1ZmVucHVua3RlCisgICAgIEVQICAgICAgIEVyZmFocnVuZ3NwdW5rdChlKQorICAgICBGYW11ICAgICBGZXVlci1BbXVsZXR0CisgICAgIEZFICAgICAgIEZldWVyZWJlbmUKKyAgICAgRmxhcGEgICAgRmxhbW1lbnBhbnplcgorICAgICBGJkUgICAgICBGb3JzY2h1bmdzLSB1bmQgRW50d2lja2x1bmdzYWJ0ZWlsdW5nCisgICAgIEZJICAgICAgIEZldWVyaW5zZWwKKyAgICAgRmlkS0cgICAgRnJhdWVuIGluIGRpZSBLbGVyaWtlcmdpbGRlIChjKSBMdWcKKyAgICAgRmlSWkcgICAgRmVobGVyIGltIFJhdW0tWmVpdC1HZWZ1ZWdlCisgICAgIEZLICAgICAgIEZyaWVkaG9mc2tuZWlwZQorICAgICBGTCAgICAgICBGbHVjaHRyaWNodHVuZworICAgICBGTFcgICAgICBGYW1vdXMgbGFzdCB3b3JkcworICAgICBGUCAgICAgICBGb3JzY2hlcnB1bmt0ZQorICAgICBGUiAgICAgICBGbHVjaHRyaWNodHVuZworICAgICBHRSAgICAgICBHZXNjaGlja2xpY2hrZWl0CisgICAgIEdMICAgICAgIEdpbGRlbmxldmVsCisgICAgIEdRICAgICAgIEdpbGRlbnF1ZXN0CisgICAgIEhFICAgICAgIEhvY2hlYmVuZQorICAgICBJTiAgICAgICBJbnRlbGxpZ2VuegorICAgICBJTUhPICAgICBJbiBteSBodW1ibGUgb3BpbmlvbiAobWVpbmVyIGJlc2NoZWlkZW5lbiBNZWludW5nIG5hY2gpCisgICAgIElJUkMgICAgIElmIEkgcmVtZW1iZXIgY29ycmVjdGx5ICh3ZW5uIGljaCBtaWNoIHJlY2h0IGVyaW5uZXJlKQorICAgICBLTCAgICAgICBLb21wbGV0dGxvZXN1bmcKKyAgICAgS1AgICAgICAgS29uemVudHJhdGlvbnNwdW5rdGUKKyAgICAgS1IgICAgICAgS3JhZnQKKyAgICAgTFAgICAgICAgTGViZW5zcHVua3RlCisgICAgIExPTCAgICAgIExhdWdoaW5nIG91dCBMb3VkIChsYXV0IGxhY2hlbikKKyAgICAgTUcgICAgICAgTW9yZ2VuR3JhdWVuIDotKQorICAgICBNUSAgICAgICBNaW5pUXVlc3QKKyAgICAgTk5BRFcgICAgTmljaHRzIE5ldWVzIGF1ZiBkZXIgV2VsdAorICAgICBuRkUgICAgICBOZXVlIEZldWVyZWJlbmUKKyAgICAgUEEqICAgICAgQm9lc2UgTWFnaWVyOiBQYXJhY2Vsc3VzLCBQYWRyZWljLCBbUGF0cnluXQorICAgICBQSyAgICAgICBQbGF5ZXJraWxsCisgICAgIFBWICAgICAgIFBvcnQgVmFpbgorICAgICBQQVJBICAgICBQYXJhbGxlbHdlbHQKKyAgICAgUFcgICAgICAgUGFyYWxsZWx3ZWx0CisgICAgIFJMICAgICAgIFJlYWwgTGlmZQorICAgICBST1RGTCAgICBSb2xsaW5nIG9uIHRoZSBGbG9vciwgbGF1Z2hpbmcgKHNpY2gga3JpbmdlbG4gdm9yIExhY2hlbikKKyAgICAgU0wgICAgICAgU3BpZWxlcmxldmVsCisgICAgIFNNUyAgICAgIFNjaHdlcnRtZWlzdGVyc2Nod2VydCAobWFuY2htYWwgYXVjaCBTcGVlck1laXN0ZXJTcGVlcikKKyAgICAgU1AgICAgICAgU3R1ZmVucHVua3RlCisgICAgIFNQTVNQICAgIFNwZWVybWVpc3RlcnNwZWVyCisgICAgIFNTUCAgICAgIFNjaHJlY2tlbnNzcGl0emUKKyAgICAgU3R1cHNlICAgU3R1ZmVucHVua3RlCisgICAgIHRhYiAgICAgIHRlYW0gYW5ncmlmZnNiZWZlaGwKKyAgICAgVEkgICAgICAgVG9ldGVyJ3MgSW5zZWwgKEFraGFyIE50aCd0YXIpCisgICAgIFV2U2RFUiAgIFVuZ2VoZXVlciB2b20gU2VlIGRlcyBld2lnZW4gUmVnZW5zCisgICAgIFZMICAgICAgIFZpcnR1YWwgTGlmZSBvZGVyIFZlcmxvcmVuZXMgTGFuZAorICAgICBWUyAgICAgICBWb2xsc3RyZWNrZXIgb2RlciBWb3JzaWNodAorICAgICBXVVcgICAgICBXYXNzZXJ1bndlc2VuCisgICAgIFdXSSAgICAgIFdlcndvbGZpbnNlbAorICAgICBXV1cgICAgICBXYWxkIGRlciBXb25uZXdpY2h0ZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9oZWxwL2FsdGdpbGRlbiBiL2RvYy9oZWxwL2FsdGdpbGRlbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzdhYzkyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2hlbHAvYWx0Z2lsZGVuCkBAIC0wLDAgKzEsMjkgQEAKKworRWhlbWFscyBnZXBsYW50ZSBHaWxkZW4KKz09PT09PT09PT09PT09PT09PT09PT09CisKKyAgIEZvbGdlbmRlIEdpbGRlbiB3YXJlbiBlaW5tYWwgYW5nZWRhY2h0LCBtaXQgZWluZXIgRmVydGlnc3RlbGx1bmcgZHVyY2ggZGllCisgICBkYW1hbGlnZW4gTWFnaWVyIGlzdCBhYmVyIG5pY2h0IG1laHIgenUgcmVjaG5lbi4KKworICAgRGllc2UgTGlzdGUgbWFnIGFscyBJbnNwaXJhdGlvbiBkaWVuZW4sIHdlbm4gamVtYW5kIGVpbmUgR2lsZGUgYmF1ZW4gCisgICBtb2VjaHRlLCBhYmVyIG5pY2h0IHdlaXNzLCB3ZWxjaGUuIE9iIGVzIG5vY2ggVGVpbGUgZGF2b24gZ2lidCwgaXN0IAorICAgdm9uIEdpbGRlIHp1IEdpbGRlIHZvZWxsaWcgdmVyc2NoaWVkZW4uCisKKyAgICAgKiBIZXhlbiAoVHdpbmdpKQorICAgICAqIEVpc2tyaWVnZXIgKFRpbGx5KQorICAgICAqIFBpcmF0ZW4gKEFzdGFyKQorICAgICAqIERydWlkZW4gKEJlcm5hcmQpCisgICAgICogQXNzYXNzaW5lbiAoQ2F0d2VhemxlKQorICAgICAqIFNjaHdlcnR0YWVuemVyIChEYW5jZXIpCisgICAgICogTmluamEgKE1vcmdvdGgpCisgICAgICogRWxlbWVudGFyZSAoTW9yZ290aCkKKyAgICAgKiBIYXJsZWtpbmUgKFB1bWEpCisgICAgICogVG9kZXNhbmJldGVyIChWcmFpKQorICAgICAqIFRoYXVtYXR1cmdlbiAoWW9ydSwgUGFyYWNlbHN1cykKKyAgICAgKiBJZGlvdGVuIChNdWFkaWIsIEJvaW5nKQorICAgICAqIFBhbGFkaW5lIChOb25uZSkKKworIFNJRUhFIEFVQ0g6CisKKyBMRVRaVEUgQWVOREVSVU5HOiAKKyAgICBGcmUsIDEuMTEuMjAxMywgdm9uIEh1bW5pIApkaWZmIC0tZ2l0IGEvZG9jL2hlbHAvYXR0cmlidXRlIGIvZG9jL2hlbHAvYXR0cmlidXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjODNlYzEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaGVscC9hdHRyaWJ1dGUKQEAgLTAsMCArMSwzNSBAQAorCitEaWUgQXR0cmlidXRlCis9PT09PT09PT09PT09CisKKyAgICBJbiBNb3JnZW5HcmF1ZW4gZ2lidCBlcyBmdWVyIFNwaWVsZXIgNCBBdHRyaWJ1dGU6ICpJbnRlbGxpZ2VueiosICpLcmFmdCosCisgICAgKkdlc2NoaWNrbGljaGtlaXQqIHVuZCAqQXVzZGF1ZXIqLiBKZSBob2VoZXIgZGVyIFdlcnQgZGllc2VyIEF0dHJpYnV0ZQorICAgIGlzdCwgZGVzdG8gYmVzc2VyIGlzdCBlcyBuYXR1ZXJsaWNoIGZ1ZXIgZGVuIFNwaWVsZXIuIERpZSBBdHRyaWJ1dGUgd2lya2VuCisgICAgc2ljaCB6LkIuIGF1ZiBmb2xnZW5kZSBCZXJlaWNoZSBhdXM6CisKKyAgICAgSW50ZWxsaWdlbnoKKyAgICAgICAgS29uemVudHJhdGlvbiwgTGVybmZhZWhpZ2tlaXRlbgorICAgICBLcmFmdAorICAgICAgICBLYW1wZmtyYWZ0LCBUcmFnZW4gdm9uIEdlZ2Vuc3RhZW5kZW4KKyAgICAgR2VzY2hpY2tsaWNoa2VpdAorICAgICAgICBCZW51dHplbiB2b24gV2FmZmVuLCBTY2h1dHogdm9yIFNjaGFkZW4gaW0gS2FtcGYKKyAgICAgQXVzZGF1ZXIKKyAgICAgICAgR2VzdW5kaGVpdCAoTGViZW5zcHVua3RlKQorCisgICAgRXJob2VodCB3ZXJkZW4gZGllIEF0dHJpYnV0ZSBkdXJjaCBaYXViZXJ0cmFlbmtlLCBkaWUgdWViZXJhbGwgaW0gU3BpZWwKKyAgICB2ZXJzdGVja3Qgc2luZC4gRGllIFphdWJlcnRyYWVua2Ugc2luZCB0ZWlsd2Vpc2UgcmVjaHQgbGVpY2h0IHp1IGZpbmRlbiwKKyAgICB0ZWlsd2Vpc2UgYWJlciBhdWNoIHNlaHIgc2Nod2VyLiBEYXMgT3Jha2VsIHZvbiBUaW5nYW4gZ2lidCBhbGxlcmRpbmdzIHp1CisgICAgamVkZW0gWmF1YmVydHJhbmsgZWluZW4gSGlud2Vpcy4KKworICAgIERpZSBlaW56ZWxuZW4gUmFzc2VuIGhhYmVuIGVpbmVuIHJhc3NlbnNwZXppZmlzY2hlbiBCb251cyBiZWkgZGVuCisgICAgQXR0cmlidXRlbiwgZGVyIGltbWVyIGJlc3RlaGVuYmxlaWJ0LgorCisgICAgV2VubiBtYW4gbmFjaCBlaW5lbSBUb2Qgd2llZGVyIGlucyBMZWJlbiB6dXJ1ZWNra2VocnQsIHNpbmQgZGllIEF0dHJpYnV0ZQorICAgIHVtIGVpbiBnZXdpc3NlcyBNYXNzIGhlcmFiZ2VzZXR6dC4gU2llIHJlZ2VuZXJpZXJlbiBzaWNoIGFiZXIgaW0gTGF1ZmUgZGVyCisgICAgWmVpdCB2b24gc2VsYnN0IHdpZWRlci4KKworIFNJRUhFIEFVQ0g6CisgICAgaW5mbywgemF1YmVydHJhZW5rZSwgbGViZW5zcHVua3RlCisKKyBMRVRaVEUgQWVOREVSVU5HOiAxNy4wMS4yMDA5LCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9oZWxwL2JhbGFuY2UgYi9kb2MvaGVscC9iYWxhbmNlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MzJkYzgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaGVscC9iYWxhbmNlCkBAIC0wLDAgKzEsNTggQEAKK0JhbGFuY2UgaW0gTW9yZ2VuR3JhdWVuCis9PT09PT09PT09PT09PT09PT09PT09PQorCitFaW4gVGhlbWEgdWViZXIgZGFzIGltbWVyIHdpZWRlciBnZXJuZSBnZXN0cml0dGVuIHdpcmQsIGlzdCBkaWUgQmFsYW5jZQoraW0gTW9yZ2VuR3JhdWVuLiBBdWYgZGVyIGVpbmVuIFNlaXRlIHN0ZWh0IGRlciAoYXVmIGRlbiBlcnN0ZW4gQmxpY2sgCit2ZXJzdGFlbmRsaWNoZSkgV3Vuc2NoIGRlciBTcGllbGVyLCBtb2VnbGljaHN0IG1hZWNodGlnIHp1IHNlaW4sIGF1ZgorZGVyIGFuZGVyZW4gU2VpdGUgc3RlaHQgZGVyIFd1bnNjaCBkZXIgTWFnaWVyc2VpdGUsIGRlbiBTcGllbGVybiBub2NoCitIZXJhdXNmb3JkZXJ1bmdlbiBzdGVsbGVuIHp1IGtvZW5uZW4uIFdlbm4gU3BpZWxlciBudXIgbm9jaCB6YXBwZW5kCitkdXJjaCBkaWUgR2VnZW5kIHJlbm5lbiwgZGFubiB3aXJkIGRhcyBhdWNoIHNjaG5lbGwgbGFuZ3dlaWxpZyAuLi4KKworCitFcyBnaWJ0IHZpZXIgJ0luc3RpdHV0aW9uZW4nIGRlciBCYWxhbmNlOgorCisxKSBHaWxkZW4tQmFsYW5jZQorCitIaWVyZnVlciB6dXN0YWVuZGlnIGlzdCBlaW4gRXJ6bWFnaWVyIChtb21lbnRhbiBIdW1uaSksIAorZGVyIHZlcnN1Y2h0LCBkaWUgR2lsZGVuIGluIGVpbmVtIGVpbmlnZXJtYXNzZW4gdmVybnVlbmZ0aWdlbiBSYWhtZW4KK3p1IGhhbHRlbi4gSGllcmJlaSBiZXJ1ZWNrc2ljaHRpZ3Qgd2VyZGVuIG5lYmVuIGRlbiBGYWVoaWdrZWl0ZW4gYXVjaAorZGVyIEF1ZndhbmQgdW5kIGRhcyBhbGxnZW1laW5lIEdpbGRlbi1GZWVsaW5nLgorCisyKSBPYmpla3QtQmFsYW5jZQorCitGdWVyIGRpZSBPYmpla3QtQmFsYW5jZSBpc3QgZWluZSBHcnVwcGUgdm9uIFNwaWVsZXJuIHVuZCBNYWdpZXJuIHp1c3RhZW5kaWcKKyhkYXMgc29nZW5hbm50ZSBCYWxhbmNlLVRlYW0pLiBCZWhhbmRlbHQgd2VyZGVuIHByYWt0aXNjaCBhbGxlIERpbmdlLCBkaWUKK2RlbiBLYW1wZiBpcmdlbmR3aWUgYmVlaW5mbHVzc2VuIChXYWZmZW4sIFJ1ZXN0dW5nZW4sIG1hZ2lzY2hlIE9iamVrdGUsIGV0Yy4pCitNb21lbnRhbiBzZXR6dCBzaWNoIGRhcyBCYWxhbmNlLVRlYW0gYXVzIGZvbGdlbmRlbiBQZXJzb25lbiB6dXNhbW1lbjoKKworICBNY0RlZSwgVGFzc3JhbSwgVGFsYW5pcywgQ3JvZnQsIFh1dGVsaXVzLCBTb3luYWRhLCBab29rIAorICB1bmQgSHVtbmkgKGFscyB2ZXJhbnR3b3J0bGljaGVyIEVyem1hZ2llcikuCisKKyoqIG91dCBvZiBvcmRlcjogMykgTlBDLUJhbGFuY2UKKyoqCisqKiBEaWUgTlBDLUJhbGFuY2Ugc29sbCBlaW4gQW5zcHJlY2hwYXJ0bmVyIGZ1ZXIgU3BpZWxlciBzZWluLCBkaWUgZGVyIEFuc2ljaHQKKyoqIHNpbmQsIGRhc3MgaXJnZW5kZWluIE1vbnN0ZXIgKE5QQyAtIG5vbiBwbGF5ZXIgY2hhcmFjdGVyKSB6dSBzdGFyaywgdW5mYWlyCisqKiBvZGVyIHNvbnN0IGlyZ2VuZHdpZSBkYW5lYmVuIGlzdC4gCisqKgorKiogRWluZSBJbnN0aXR1dGlvbiAiTlBDLUJhbGFuY2UiIGdpYnQgZXMgYmlzIGF1ZiB3ZWl0ZXJlcyBuaWNodCBtZWhyLgorKiogWnVzdGFlbmRpZyBmdWVyIGRpZSBFaW50cmFndW5nIHZvbiBFcnN0a2lsbC1TdHVwc2VuIGlzdCBBcmF0aG9ybi4gRnVlcgorKiogQmVzY2h3ZXJkZW4gdWViZXIgTW9uc3RlciwgZGllIHp1IHN0YXJrIG9kZXIgenUgdW5mYWlyIHNpbmQsIHN0ZWhlbgorKiogZGllIFJlZ2lvbnNtYWdpZXIgb2RlciBab29rIHp1ciBWZXJmdWVndW5nLgorCis0KSBIZWlsdW5ncy1CYWxhbmNlCisKK0RpZSBIZWlsdW5ncy1CYWxhbmNlIGRlY2t0IGFsbGVzIGFiLCB3YXMgaXJnZW5kd2llIG1pdCBIZWlsdW5nIHp1IHR1bgoraGF0LiBLb25rcmV0IHNpbmQgZGFzIEtuZWlwZW4sIEhlaWxlciAoYXVjaCBHaWZ0LCBLcmFua2hlaXQsIGV0Yy4pLCBmZXN0ZQorSGVpbHN0ZWxsZW4sIHRyYWdiYXJlIEhlaWx1bmcgdW5kIFNhY2hlbiBkaWUgU2FldHRpZ3VuZyBvZGVyIEFsa29ob2wKK3J1bnRlcnNldHplbi4gTW9tZW50YW4genVzdGFlbmRpZyBmdWVyIGRpZXNlcyBHZWJpZXQgaXN0IEh1bW5pLgorCisKK0FsbGUgSW5zdGl0dXRpb25lbiBhcmJlaXRlbiBiZXNzZXIsIHdlbm4gc2llIHNvd29obCB2b24gU3BpZWxlcm4gYWxzCithdWNoIE1hZ2llcm4gdW50ZXJzdHVldHp0IHdlcmRlbi4gU3BlemllbGwgZGllIE5QQy1CYWxhbmNlIGtvbW10IGluIGRlcgorUmVnZWwgTlVSIHp1bSBFaW5zYXR6LCB3ZW5uIGVpbiBTcGllbGVyIGVpbmVuIE1pc3N0YW5kIGFuc3ByaWNodC4gQWxzbworc3ByZWNodCBkaWUgZW50c3ByZWNoZW5kZW4gTGV1dGUgYW4sIHdlbm4gaWhyIGlyZ2VuZHdvIGVpbiBQcm9ibGVtIHNlaHQhCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIExFVFpURSBBRU5ERVJVTkc6CisgICAgMTMtMDEtMjAxMSwgWmVzc3RyYQorICAgIApkaWZmIC0tZ2l0IGEvZG9jL2hlbHAvYmV3ZWd1bmcgYi9kb2MvaGVscC9iZXdlZ3VuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2U2OGE2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2hlbHAvYmV3ZWd1bmcKQEAgLTAsMCArMSwyNCBAQAorCitCZXdlZ2VuIGltIE1vcmdlbkdyYXVlbgorPT09PT09PT09PT09PT09PT09PT09PT0KKworIEtPTU1BTkRPUzoKKyAgICBzKHVlZGVuKSwgdyhlc3RlbiksIG4ob3JkZW4pLCBvKHN0ZW4pLCBvYihlbiksIHUobnRlbiksIG4ob3JkKXcoZXN0ZW4pLAorICAgIC4uLgorCisgQVJHVU1FTlRFOgorICAgIGtlaW5lCisKKyBCRVNDSFJFSUJVTkc6CisgICAgTWl0IGRpZXNlbiBLb21tYW5kb3Mga2FubiBtYW4gZGVuIFJhdW0gaW4gZWluZSBiZXN0aW1tdGUgUmljaHR1bmcKKyAgICB2ZXJsYXNzZW4uIEplZGUgZGVyIEhpbW1lbHNyaWNodHVuZ2VuIGthbm4gZHVyY2ggZWluZW4gKG9kZXIgendlaSkKKyAgICBCdWNoc3RhYmVuIGFiZ2VrdWVyenQgd2VyZGVuLgorCisgICAgQUJFUjogTWFuY2htYWwgbXVzcyBtYW4gZWluZW4gV2VnIGZpbmRlbiwgZGVyIG5pY2h0IGluIGVpbmUgYmVzdGltbXRlCisgICAgSGltbWVsc3JpY2h0dW5nIGZ1ZWhydC4KKworIFNJRUhFIEFVQ0g6Cit1bnRlcnN1Y2hlLCBrdXJ6LCBhdXNnYWVuZ2UsIGtsZXR0ZXJlLCByZWlzZQorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBUaHUsIDI0LjA3LjE5OTcsIDA5OjAwOjAwIHZvbiBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9oZWxwL2JlenVnc3B1bmt0IGIvZG9jL2hlbHAvYmV6dWdzcHVua3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFlZDQyMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9oZWxwL2JlenVnc3B1bmt0CkBAIC0wLDAgKzEsNTQgQEAKKworRGVyIEJlenVnc3B1bmt0CistLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBEZXIgQmV6dWdzcHVua3Qgb2RlciBkYXMgQmV6dWdzb2JqZWt0IGlzdCBiZWkgZGVuIEJlZmVobGVuICJzY2hhdSIsCisgICAgInVudGVyc3VjaGUiLCAibGllcyIsICJ0YXN0ZSIsICJsYXVzY2hlIiB1bmQgInJpZWNoZSIgd2ljaHRpZy4KKworICAgIERpZXNlIEtvbW1hbmRvcyBtZXJrZW4gc2ljaCBkZW4gamV3ZWlscyB6dWxldHp0IGVyZm9sZ3JlaWNoIHVudGVyc3VjaHRlbgorICAgIEdlZ2Vuc3RhbmQgKGJ6dy4gZGVuIEdlZ2Vuc3RhbmQsIGFuIGRlbSBkYXMgenVsZXR6dCBlcmZvbGdyZWljaAorICAgIHVudGVyc3VjaHRlIERldGFpbCBrbGVidCkgYWxzIEJlenVnc3B1bmt0IGZ1ZXIgZGFzIG5hZWNoc3RlIEtvbW1hbmRvLgorICAgIEhpZXJiZWkgYmVudXR6ZW4gYWxsZSBnZW5hbm50ZW4gQmVmZWhsZSBkZW4gZ2xlaWNoZW4gQmV6dWdzcHVua3QuCisKKyBCRUlTUElFTEU6CisgICAgQmVpc3BpZWwgMToKKyAgICA+ICJ1bnQgc2NocmFuayIKKyAgICAtPiBnaWJ0IGVzIGVpbmVuIFNjaHJhbmssIHdpcmQgZGVyIGJlc2NocmllYmVuIF91bmRfIGVyIHdpcmQgZGVyIG5ldWUKKyAgICAgICBCZXp1Z3NwdW5rdC4KKyAgICA+ICJ1bnQgdHVlciIKKyAgICAtPiBKZXR6dCB3aXJkICJ0dWVyIiBhbSBCZXp1Z3NvYmpla3QgInNjaHJhbmsiIGdlc3VjaHQuIEV4aXN0aWVydCBkYXMKKyAgICAgICBEZXRhaWwsIGJsZWlidCBkZXIgU2NocmFuayBhdWNoIHdlaXRlcmhpbiBkZXIgQmV6dWdzcHVua3QuIEV4aXN0aWVydAorICAgICAgIGVzIG5pY2h0LCB3aXJkIGVpbiBEZXRhaWwgInR1ZXIiIG9kZXIgZWluIE9iamVrdCAidHVlciIgaW0gUmF1bSB1bmQKKyAgICAgICBkYW5uIGluIGV1Y2ggZ2VzdWNodC4gR2lidCBlcyBkYSBzb3dhcywgd2lyZCBlcyBiZXNjaHJpZWJlbiB1bmQgZGFzCisgICAgICAgbmV1ZSBCZXp1Z3NvYmpla3QuIFdlbm4gYWxsZXMgZmVobHNjaGxhZWd0LCBnaWJ0IGVzIGVpbmUKKyAgICAgICBGZWhsZXJtZWxkdW5nIHVuZCBkZXIgQmV6dWdzcHVua3QgZ2Vsb2VzY2h0LiBCZWltIG5hZWNoc3RlbiAidW50IiB3aXJkCisgICAgICAgIHp1ZXJzdCBpbSBSYXVtIHVuZCBkYW5uIGluIGV1Y2ggZ2VzdWNodC4KKyAgICAoRXMgd3VlcmRlIGF1Y2ggZ2VoZW46ICJ1bnQgdHVlciBhbiBzY2hyYW5rIi4pCisKKyAgICBCZWlzcGllbCAyOgorICAgID4gInVudCBwYWtldCIKKyAgICAtPiBEYXMgUGFrZXQgd2lyZCBiZXNjaHJpZWJlbiB1bmQgZGVyIG5ldWUgQmV6dWdzcHVua3QuCisgICAgPiAidW50IHNlaWwiCisgICAgLT4gRGFzIFNlaWwgaW0gcGFrZXQgd2lyZCBiZXNjaHJpZWJlbiAoc29mZXJuIHNpZSBleGlzdGllcnQpIHVuZCBkZXIKKyAgICAgICBuZXVlIEJlenVnc3B1bmt0LgorICAgID4gInVudCB3b2xsZSIKKyAgICAtPiBEYXMgRGV0YWlsICJ3b2xsZSIgYW0gU2VpbCB3aXJkIGJlc2NocmllYmVuLiBEYXMgU2VpbCBibGVpYnQgZGVyCisgICAgICAgQmV6dWdzcHVua3QuCisgICAgKEluIGRpZXNlbSBCZWlzcGllbCBrb2VubnRlIG1hbiBkaWUgV29sbGUgYXVjaCBkaXJla3RlciB1bnRlcnN1Y2hlbiwKKyAgICAgaW5kZW0gbWFuICJ1bnQgd29sbGUgYW4gc2VpbCBpbiBwYWtldCBpbiBtaXIiIGJlbnV0enQuKQorCisgICAgQmVpc3BpZWwgMzoKKyAgICA+ICJ1bnQgcnVja3NhY2siCisgICAgLT4gRGVyIFJ1Y2tzYWNrIHdpcmQgdW50ZXJzdWNodCB1bmQgZGVyIG5ldWUgQmV6dWdzcHVua3QuCisgICAgPiAibGllcyBzY2hpbGQiCisgICAgLT4gSGF0IGRlciBSdWNrc2FjayBlaW4gbGVzYmFyZXMgRGV0YWlsICJzY2hpbGQiLCB3aXJkIGVzIGF1c2dlZ2ViZW4uIERlcgorICAgICAgIFJ1Y2tzYWNrIGJsZWlidCBkZXIgQmV6dWdzcHVua3QuIFdlbm4gbmljaHQsIHdpcmQgZWluIGxlc2JhcmVzIERldGFpbAorICAgICAgIG9kZXIgZWluIGxlc2JhcmVyIEdlZ2Vuc3RhbmQgInNjaGlsZCIgaW0gUmF1bSB1bmQgaW4gZXVjaCBnZXN1Y2h0LgorICAgIChFcyB3dWVyZGUgYXVjaCBnZWhlbjogImxpZXMgc2NoaWxkIGFuIHJ1Y2tzYWNrIikKKyAKK1NJRUhFIEFVQ0g6CisgICAgc2NoYXUsIHVudGVyc3VjaGUsIGxpZXMsIHRhc3RlLCBsYXVzY2hlLCByaWVjaGUKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgMTguMDEuMjAxMywgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2MvaGVscC9iaWVyc2NodWV0dGxlciBiL2RvYy9oZWxwL2JpZXJzY2h1ZXR0bGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNmJhNTgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaGVscC9iaWVyc2NodWV0dGxlcgpAQCAtMCwwICsxLDQ4IEBACisKK0RpZSBCaWVyc2NodWV0dGxlcmdpbGRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVm9yIGVpbmlnZXIgWmVpdCBncnVlbmRldGVuIGRpZSBTaGFraWVzIGF1ZiBTaGFreSBJc2xhbmQgZGllIEdpbGRlIGRlcgorICAgIEJpZXJzY2h1ZXR0bGVyLCBkYW1pdCBkaWVzZSBLdW5zdCBkZXMgQmllcnNjaHVldHRlbG5zIG5pY2h0IGF1c3N0aXJidC4KKyAgICBCcnVubyB3dXJkZSB2b24gYWxsZW4gU2hha2llcyB6dW0gR2lsZGVuc2hha3kgZ2V3YWVobHQsIHdlaWwgZXIgc2ljaCBtaXQKKyAgICBkaWVzZW0gVGhlbWEgYmVzdGVucyBhdXNrZW5udC4gTnVuIGtvZW5uZW4gYWxsZSBTcGllbGVyIGJlaSBpaG0KKyAgICBlaW51bmR6d2FuemlnIFphdWJlcnNwcnVlY2hlIGxlcm5lbi4gRGEgZ2lidCBlcyB6dW0gQmVpc3BpZWwgZGFzIEVyZGJlYmVuCisgICAgb2RlciBkZW4gSGl0emVzY2hsYWcsIGRpZSBpbSBLYW1wZiBlaW5nZXNldHp0IHdlcmRlbiBrb2VubmVuLiBOYXR1ZXJsaWNoCisgICAga2FubiBlaW4gZWNodGVyIEJpZXJzY2h1ZXR0bGVyIHNlaW5lbiBGZWluZCBhdWNoIGFsa29ob2xpc2llcmVuIHVuZCBzaWNoCisgICAgc2VsYnN0IGF1Y2ggbnVlY2h0ZXJuZXIgbWFjaGVuLgorCisgICAgRGEgU2hha2llcyBzZWhyIGJlaGFhcnQgc2luZCwgaXN0IEJydW5vIGluIGRlciBMYWdlIGRlbSBHaWxkZW5taXRnbGllZCBkZW4KKyAgICBUcmljayBtaXQgZGVyIEhhYXJydWVzdHVuZyB6dSB6ZWlnZW4sIGRpZSBuaWNodCBudXIgc2NodWV0enQsIHNvbmRlcm4gbm9jaAorICAgIGVpbiBrbGVpbmVzIFNwZWNpYWwgaGF0LiBEaWUgU2hha2llcyBzaW5kIGVpbmUgZnJvaGUgUmFzc2UsIGRpZSBuYXR1ZXJsaWNoCisgICAgYXVjaCB1ZWJlciBkaWUgWmF1YmVyc3BydWVjaGUgUGFydHkgdW5kIEZyZWliaWVyIHZlcmZ1ZWdlbi4gRnVlciBqZWRlbgorICAgIEdpbGRlbmxldmVsYXVmc3RpZWcgaXN0IEJydW5vIGJlcmVpdCwgZGVtIE1pdGdsaWVkIGVpbmVuIG5ldWVuIFNwcnVjaAorICAgIGJlaXp1YnJpbmdlbi4gRGllIEdpbGRlbmxldmVsIHNpbmQgd2llIGluIGRlciBBYmVudGV1cmVyZ2lsZGUgYW4gZGllCisgICAgU3BpZWxlcmxldmVsIGdla29wcGVsdCwgc28gZGFzcyBhdWNoIEFuZmFlbmdlciBzY2huZWxsIGF1ZnN0ZWlnZW4ga29lbm5lbi4KKworICAgIFRyb3R6ZGVtIGlzdCBkaWUgR2lsZGUgZGVyIEJpZXJzY2h1ZXR0bGVyIGZ1ZXIgU2VoZXIgbmljaHQgdW5pbnRlcmVzc2FudC4KKyAgICBEaWUgR2lsZGVubGV2ZWwgcmVpY2hlbiB2b20gJ251ZWNodGVybmVuIEFuZmFlbmdlcicgYmlzIGhpbiB6dW0KKyAgICAnQmllcnNjaHVldHRlbG1laXN0ZXInLiBVZWJyaWdlbnMgZ2lidCBlcyBrZWluZXJsZWkgQXVmbGFnZW4gd2VubiBtYW4gZGVuCisgICAgQmllcnNjaHVldHRsZXJuIGJlaXRyZXRlbiBtb2VjaHRlLgorCisgICAgQnJ1bm8gZ2lidCBCaWVyc2NodWV0dGxlcm4gYWIgTGV2ZWwgendlaSBub2NoIGVpbiBrbGVpbmVzIEdlc2NoZW5rIG1pdCBhdWYKKyAgICBkZW4gV2VnLiBFcyBoYW5kZWx0IHNpY2ggZGFiZWkgdW0gZWluZSBCaWVyc2NodWVyemUsIGRpZSBkZW0gTWl0Z2xpZWQKKyAgICBlaW5pZ2UgVm9ydGVpbGUgYmlldGV0LiBNYW4gYmVrb21tdCBkYW5uIHp1bSBCZWlzcGllbCBpbiBlaW5pZ2VuIEtuZWlwZW4KKyAgICBlaW5lbiBSYWJhdHQgdm9uIGJpcyB6dSAyNSUgZWluZ2VyYWV1bXQuCisKKyAgICBXZWl0ZXJlIEluZm9ybWF0aW9uZW4sIHp1bSBCZWlzcGllbCB1ZWJlciBkaWUgZWluemVsbmVuIFNwcnVlY2hlLCBrYW5uIG1hbgorICAgIGRpcmVrdCBiZWkgQnJ1bm8gZWluaG9sZW4uIEF1c3NlcmRlbSBzdGVodCBlcyBqZWRlbSBTcGllbGVyIGZyZWksIGF1ZiBkZW0KKyAgICBLYW5hbCBbQmllcnNjaHVldHRsZXI6XSB6dSBsYXVzY2hlbiwgZGVuIG1hbiBtaXQgZGVtIEJlZmVobAorICAgIC1CaWVyc2NodWV0dGxlcisgZWluc2NoYWx0ZW4ga2Fubi4gSGllciBnaWJ0IEJydW5vIGF1Y2ggYmVrYW5udCwgd2VubiBkaWUKKyAgICBCaWVyc2NodWV0dGxlciBuZXVlIE1pdGdsaWVkZXIgYmVncnVlc3NlbiBkdWVyZmVuLgorCisgU0lFSEUgQVVDSDoKKyAgICBnaWxkZW4sIGF0dHJpYnV0ZSwgZWJlbmVuCisKKyBGVWVSIEdJTERFTk1JVEdMSUVERVI6CisgICAgemF1YmVyc3BydWVjaGUsIGJpZXJzY2h1ZXJ6ZSwgYWJzdHVmdW5nZW4KKworICAgICpJc3QgbWFuIE1pdGdsaWVkIGVpbmVyIGFuZGVyZW4gR2lsZGUsIHNvIG11c3MgbWFuIGZ1ZXIgZGllIEhpbGZlbiB6dSBkZW4KKyAgICBTcHJ1ZWNoZW4gYGhpbGZlIGdpbGRlIGJpZXJzY2h1ZXR0bGVyIDxuYW1lPicgYmVudXR6ZW4hKgorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBUaHUsIDI0LjA3LjE5OTcsIDA5OjAwOjAwIHZvbiBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9oZWxwL2J1ZWNoZXIgYi9kb2MvaGVscC9idWVjaGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZDQyMTgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaGVscC9idWVjaGVyCkBAIC0wLDAgKzEsMjYgQEAKKworQnVlY2hlcgorPT09PT09PQorCisgICAgSW0gTW9yZ2VuR3JhdWVuIGdpYnQgZXMgdmllbGUgQnVlY2hlciwgZGllIG1hbiBtaXQgJ2xpZXMgYnVjaCcgbGVzZW4ga2Fubi4KKyAgICBCZWkgc3RhbmRhcmRpc2llcnRlbiBCdWVjaGVybiBrYW5uIG1hbiBkaWUgZm9sZ2VuZGVuIEtvbW1hbmRvcyBiZW51dHplbjoKKworICAgICBvZWZmbmUgYnVjaAorICAgICAgICBadW0gT2VmZm5lbiBkZXMgQnVjaGVzOyBkaWUgbWVpc3RlbiBCdWVjaGVyIHNpbmQgYW5mYWVuZ2xpY2gKKyAgICAgICAgZ2VzY2hsb3NzZW4uCisKKyAgICAgc2NobGllc3NlIGJ1Y2gKKyAgICAgICAgWnVtIFNjaGxpZXNzZW4gZGVzIEJ1Y2hlczsgd2VubiBtYW4gZGFzIEJ1Y2ggYXVzZ2VsZXNlbiBoYXQsIHNjaGxpZXNzdAorICAgICAgICBtYW4gZXMgYXV0b21hdGlzY2guCisKKyAgICAgbGllcyBidWNoCisgICAgICAgIFdlbm4gZGFzIEJ1Y2ggZ2VzY2hsb3NzZW4gaXN0LCB6ZWlndCBkaWVzZXMgS29tbWFuZG8gZGllIFRpdGVsc2VpdGU7CisgICAgICAgIGlzdCBlcyBvZmZlbiwgemVpZ3QgZXMgZGllIFNlaXRlLCBhdWYgZGVyIGVzIGF1Zmdlc2NobGFnZW4gaXN0LCB1bmQKKyAgICAgICAgYmxhZXR0ZXJ0IHVtLiBXaXJkIGRhcyBFbmRlIGRlcyBCdWNoZXMgZXJyZWljaHQsIHdpcmQgZXMgZ2VzY2hsb3NzZW4uCisKKyAgICAgYmxhZXR0ZXJlIHp1IHNlaXRlIDxuPgorICAgICAgICBNaXQgZGllc2VtIEtvbW1hbmRvIGthbm4gbWFuIGltIEJ1Y2ggdm9yd2FlcnRzLSB1bmQgcnVlY2t3YWVydHMKKyAgICAgICAgYmxhZXR0ZXJuLCBuYXR1ZXJsaWNoIG51ciwgd2VubiBkYXMgQnVjaCBnZW9lZmZuZXQgaXN0LgorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBUaHUsIDI0LjA3LjE5OTcsIDA5OjAwOjAwIHZvbiBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9oZWxwL2NoYW9zIGIvZG9jL2hlbHAvY2hhb3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVhYWU4ZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9oZWxwL2NoYW9zCkBAIC0wLDAgKzEsNDYgQEAKKworRGllIEdpbGRlIGRlciBLcmllZ2VyIGRlcyBDaGFvcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgTWFuIGthbm4gaW4gZGllIEdpbGRlIGRlciBLcmllZ2VyIGRlcyBDaGFvcyBiZWkgS3J1dW9scSwgZGVtIG9iZXJzdGVuCisgICAgTWVpc3RlciBkZXMgQ2hhb3MsIGVpbnRyZXRlbi4gVW0gYXVmZ2Vub21tZW4genUgd2VyZGVuIG11c3MgbWFuIG1pbmRlc3RlbnMKKyAgICBTcGllbGVybGV2ZWwgOSAoS3VuZHNjaGFmdGVyL0t1bmRzY2hhZnRlcmluKSBzZWluLgorCisgICAgSW5zZ2VzYW10IGdpYnQgZXMgMTEgR2lsZGVuc3R1ZmVuLCB2b20ga2xlaW5lbiBDaGFvdGVuIGJpcyB6dW0gTWVpc3RlciBkZXMKKyAgICBDaGFvcy4gRnVlciBqZWRlIFN0dWZlbmVyaG9laHVuZyBtdXNzIG1hbiBlaW5lbiBLYW1wZiBhdWYgTGViZW4gdW5kIFRvZCBpbgorICAgIGRlciBnaWxkZW5laWdlbmVuIEFyZW5hIGF1c3RyYWdlbiwgbWFuIG11c3MgU3BydWVjaGUgdW5kIERhZW1vbmVuLCBkZXIKKyAgICBqZXdlaWxpZ2VuIFN0dWZlIGVudHNwcmVjaGVuZCBndXQsIGJlaGVycnNjaGVuIHVuZCBhYiBHaWxkZW5sZXZlbCA5IGtvbW1lbgorICAgIG5vY2ggYmVzb25kZXJlIEFuZm9yZGVydW5nZW4gaGluenUuCisKKyAgICBKZSBuYWNoIFN0dWZlIGthbm4gbWFuIHVudGVyc2NoaWVkbGljaGUgRmFlaGlna2VpdGVuIGVybGVybmVuLiBEaWVzZQorICAgIHRlaWxlbiBzaWNoIGdyb2IgaW4gendlaSBLYXRlZ29yaWVuOgorICAgIDEpIFphdWJlcnNwcnVlY2hlCisgICAgMikgQmVzY2h3b2VyZW4gdm9uIERhZW1vbmVuLgorICAgIE1pdCBIaWxmZSBkZXIgWmF1YmVyc3BydWVjaGUga2FubiBtYW4gei5CLiBSYWV1bWUgdmVyZHVua2VsbiBvZGVyIGVpbmVuCisgICAgQ2hhb3NiYWxsIHdlcmZlbiwgbWl0IEhpbGZlIGRlciBEYWVtb25lbiBrYW5uIG1hbiBTYWNoZW4gaWRlbnRpZml6aWVyZW4KKyAgICBvZGVyLCBtaXQgc3RlaWdlbmRlciBTdHVmZSwgRGFlbW9uZW4gYmVzY2h3b2VyZW4gZGllIGRlbiBTcGllbGVyIGltIEthbXBmCisgICAgdW50ZXJzdHVldHplbi4gRGEgZXMgbmljaHQgZ2FueiBzbyBlaW5mYWNoIGlzdCBEYWVtb25lbiB6dSBiZXNjaHdvZXJlbgorICAgIGthbm4gZXMgZGFiZWkgcGFzc2llcmVuLCBkYXNzIGRlciBmYWxzY2hlIERhZW1vbiBlcnNjaGVpbnQuIFVtIGRpZXMgenUKKyAgICB2ZXJoaW5kZXJuIHNvbGx0ZSBtYW4gc2ljaCBpbSBHaWxkZW5sYWRlbiAnTnVldHpsaWNoZSBadXRhdGVuIGZ1ZXIgYm9lc2UKKyAgICBaYXViZXJzcHJ1ZWNoZScgbWl0IGFsbGVybGVpIFV0ZW5zaWxpZW4gYXVzc3RhdHRlbiwgZGllIGVpbmVuIGJlaSBkZW4KKyAgICBCZXNjaHdvZXJ1bmdlbiB1bnRlcnN0dWV0emVuLiBHZW5hdWVyZXMgdWViZXIgZGllIFphdWJlcnNwcnVlY2hlIHVuZAorICAgIERhZW1vbmVuIGVyZmFlaHJzdCBEdSBiZWkgS3J1dW9scS4KKworICAgIFVlYmVuIGthbm4gbWFuIFNwcnVlY2hlIHVuZCBCZXNjaHdvZXJ1bmdlbiBpbiBkZW0gbnVyIGZ1ZXIKKyAgICBHaWxkZW5taXRnbGllZGVyIHp1Z2FlbmdsaWNoZW4gUml0dWFscmF1bSBiZWkgV3Vxb3VyLiBFciBoaWxmdCBBbmZhZW5nZXJuCisgICAgc2ljaCBiZXNzZXIgaW4gZGVyIFdlbHQgZGVzIENoYW9zIHp1cmVjaHQgenUgZmluZGVuLgorCisgICAgRXMgZ2lidCB6d2VpIFZvcmF1c3NldHp1bmdlbiB1bSBzZWluZSBjaGFvdGlzY2hlbiBGYWVoaWdrZWl0ZW4gdm9sbCB6dQorICAgIGVudGZhbHRlbi4gTWFuIG11c3MgYXVzcmVpY2hlbmQgJ2JvZXNlJyBzZWluIHVtIGRpZSBTcHJ1ZWNoZSBhbnp1d2VuZGVuCisgICAgdW5kIG1hbiBtdXNzIGVpbmVuIERhZW1vbmVuIGJlc2Nod29lcmVuLCBkZXIgaW4gZGllIGVpZ2VuZSBIYXV0IGVpbmRyaW5ndCwKKyAgICBzaWUgdmVyc3RhZXJrdCB1bmQgZGllIEF0dHJpYnV0ZSBkZXMgQ2hhb3RlbiBnZWdlYmVuZW5mYWxscyBtaXQgc2VpbmVuCisgICAgZWlnZW5lbiBhdWYtIG9kZXIgYWJ3ZXJ0ZXQuIERpZXNlciBEYWVtb24gZXJtb2VnbGljaHQgZXJzdCBkaWUgQW53ZW5kdW5nCisgICAgYWxsZXIgU3BydWVjaGUuCisKKyAgICBOYXR1ZXJsaWNoIGhhYmVuIGRpZSBDaGFvdGVuIGF1Y2ggZWluZSBlaWdlbmUgRWJlbmUgW0NoYW9zOl0uCisKKyBTSUVIRSBBVUNIOgorICAgIGF0dHJpYnV0ZSwgZWJlbmVuLCBnaWxkZW4KKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgVGh1LCAyNC4wNy4xOTk3LCAwOTowMDowMCB2b24gV2FyZ29uCmRpZmYgLS1naXQgYS9kb2MvaGVscC9jaWNlcm9uZXMgYi9kb2MvaGVscC9jaWNlcm9uZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE0ODhjYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9oZWxwL2NpY2Vyb25lcwpAQCAtMCwwICsxLDk1IEBACitDSUNFUk9ORVMgCistLS0tLS0tLS0KKworPGJpbGR1bmc+CisKK0RlciBCZWdyaWZmIHN0YW1tdCBhdXMgZGVtIGl0YWxpZW5pc2NoZW4gdW5kIGlzdCBlaW5lIEJlemVpY2hudW5nIGZ1ZXIgZWluZW4KK0ZyZW1kZW5mdWVocmVyIG9kZXIgQWVobmxpY2hlcy4KKworPC9iaWxkdW5nPgorCitDaWNlcm9uZXMgc2luZCBTcGllbGVyLCBkaWUgc2ljaCBiZXJlaXRlcmtsYWVydCBoYWJlbiwgZnVlciB1bnNlcmUga2xlaW5lbgorU3BpZWxlciBkYSB6dSBzZWluLiBTaWUgc2luZCBkaWUgQW5zcHJlY2hwYXJ0bmVyIGZ1ZXIgZGllIE5ldWxpbmdlIGltIE1VRC4KKworSmVkZXIgU3BpZWxlciBzb2xsdGUgYmVyZWl0IHNlaW4sIE5ldWxpbmdlbiB1bnRlciBkaWUgQXJtZSB6dSBncmVpZmVuLiBEaWUKK0NpY2Vyb25lcyBoYWJlbiBhYmVyIGFiZ2VzZWhlbiBkYXZvbiwgZGFzcyBzaWUgZGVuIFRpdGVsICwsQ2ljZXJvbmUnJyBmdWVocmVuCitkdWVyZmVuLCBrZWluZSBiZXNvbmRlcmVuIFZvcnJlY2h0ZS4KKworVW0gQ2ljZXJvbmUgenUgd2VyZGVuIGthbm4gbWFuIGRlbiBCZWZlaGwgLCxjaWNlcm9uZScnIHZlcndlbmRlbi4gTmFlaHJlcyAKK2RhenUgc2llaGUgYXVmIGRlciBkYXp1Z2Vob2VyaWdlbiBIaWxmZXNlaXRlLgorCitBVUZHQUJFTiBERVIgQ0lDRVJPTkVTCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0RpZSBDaWNlcm9uZXMgc29sbGVuIGtsZWluZW4gU3BpZWxlcm4gYXVmIEFuZnJhZ2UgYmVpc3RlaGVuLiBTaWUgc29sbGVuIGlobmVuCitGcmFnZW4gYmVhbnR3b3J0ZW4gKG5hdHVlcmxpY2gga2VpbmUgUXVlc3QtS0xzIHZvcmthdWVuKSB1bmQgaWhuZW4gZGllIGVyc3RlbgorU2Nocml0dGUgdW5kIEJlZmVobGUgaW0gTUcgZXJrbGFlcmVuLiBBdWNoIEtvbnplcHRlICgiR2lsZGVuIiBvZGVyIAorIlphdWJlcnRyYWVua2UiKSBzb2xsZW4gZXJsYWV1dGVydCB3ZXJkZW4uCisKK0NpY2Vyb25lcyBzb2xsZW4gYWJlciBkZWZpbml0aXYgbmljaHQgZGVtIGtsZWluZW4gU3BpZWxlciBkYXMgU3BpZWxlbiAKK2FibmVobWVuLiBLbGFyIGRhcmYgbWFuIGJlaSBkZXIgQW5mYWVuZ2VycXVlc3QgZGFuZWJlbnN0ZWhlbiB1bmQgYmVpIAorb2ZmZW5zaWNodGxpY2hlbiBQcm9ibGVtZW4gVGlwcyBnZWJlbi4gQWJlciBpbW1lciBtaXQgZGVtIEhpbnRlcmdydW5kLCBkYXNzCitkZXIgU3BpZWxlciBldHdhcyBkYWJlaSBsZXJudC4KKworQmVpc3BpZWw6IChkaWVzZSBRdWVzdCBpc3QgZmlrdGl2KQorCitIdW1uaSBzYWd0OiBXaWUgZ2VodCBkYXMgaGllciBqZXR6dD8KK011YWRpYiBzYWd0OiBJc3QgZG9jaCBnYW56IGtsYXIuIER1IG11c3N0IGRlbiBTdGVpbiBuZWhtZW4sIGRhbm4gZ2lic3QgRHUgZWluCitNdWFkaWIgc2FndDogLHdpcmYgc3RlaW4gYXVmIGJlcmcnLiBEYW5uIGtvbW10IGVpbiBTY2hhdHRlbiBydW50ZXIsIGRlbSBnaWJzdAorTXVhZGliIHNhZ3Q6IER1IGRhcyBBbXVsZXR0IHVuZCBzYWdzdCBkYW5uIGRhcyBaYXViZXJ3b3J0ICwsQmxvZXJkZXJrcmFtcGYuJycKK0h1bW5pIHNhZ3Q6IE9oIHRvbGwhIERhbmtlIQorCitfRkFMU0NIXy4KKworSHVtbmkgc2FndDogV2llIGdlaHQgZGFzIGhpZXIgamV0enQ/CitNdWFkaWIgc2FndDogTmEsIHNjaGF1IERpY2ggbWFsIGdlbmF1IHVtLiBEdSBrYW5uc3QgYXVjaCBnZXdpc3NlIERpbmdlIAorTXVhZGliIHNhZ3Q6IHVudGVyc3VjaGVuLCBkaWUgZXMgcXVhc2kgdWViZXJhbGwgZ2lidC4gRXMgZ2lidCBxdWFzaSB1ZWJlcmFsbAorTXVhZGliIHNhZ3Q6IGVpbmVuIEJvZGVuLgorSHVtbmkgc2FndDogQWhhLgorSHVtbmkgc2FndDogQm9haCwgZGEgbGllZ3QgamEgZWluIFN0ZWluPworTXVhZGliIHNhZ3Q6IEphLCByaWNodGlnLiBXYXMga2FubnN0IER1IGRhbWl0IG1hY2hlbj8KK0h1bW5pIGdydWViZWx0LgorSHVtbmkgc2FndDogQXVmZXNzZW4/CitNdWFkaWIgc2FndDogTmVpbi4gRGFzIGlzdCBlaW4gU3RlaW4uCitIdW1uaSBzYWd0OiBBY2ggc28uCitIdW1uaSBzYWd0OiBJY2gga2FubiBpaG4gamEgbWFsIGF1ZmhlYmVuLgorTXVhZGliIHNhZ3Q6IEdlbmF1LgorSHVtbmkgbmltbXQgZGVuIFN0ZWluLgorTXVhZGliIHNhZ3Q6IFNvLCBkYW5uIHNjaGF1IERpY2ggbWFsIHdlaXRlciB1bS4gV2FzIGlzdCBoaWVyIG5vY2g/CitIdW1uaSBzYWd0OiBFaW4gQmVyZy4KK011YWRpYiBzYWd0OiBIYXN0IER1IERpciBkZW4gbWFsIGdlbmF1ZXIgYW5nZWd1Y2t0PworSHVtbmkgc2FndDogRGEgc3RlaHQsIGljaCBrYW5uIGRlbiBtaXQgU3RlaW5lbiBiZXdlcmZlbiwgZGVyIG1hZyBkYXMuCisuCisuCisKK19SSUNIVElHXworCitKYSwgZGVyIHp3ZWl0ZSBGYWxsIGlzdCBuZXJ2aWdlciwgZXIga29zdGV0IG1laHIgWmVpdCB1bmQgZGVyIFNwaWVsZXIgaGF0IAord2VuaWdlciBFcmZvbGdzZXJsZWJuaXNzZSBhbHMgaW0gZXJzdGVuIEZhbGwuCisKK0hhbHQuCisKK1N0aW1tdCBuaWNodC4KKworS2xhciwgaW0gZXJzdGVuIEZhbGwgaGF0IGRlciBTcGllbGVyIG5hY2ggMiBNaW51dGVuIHNlaW5lIGVyc3RlIFF1ZXN0IAorZ2Vsb2VzdCAtIHRvbGwsIG9kZXI/IE51ciB3YXMgaXN0IG1pdCBkZXIgbmFlY2hzdGVuPyBXZW5uIGJlaSBkZXIgbmFlY2hzdGVuCitRdWVzdCBrZWluIENpY2Vyb25lIGRhbmViZW5zdGVodCBoYXQgZGVyIFNwaWVsZXIgdmVybG9yZW4uIEVyIGhhdCBuYWVtbGljaAorbmljaHRzIHNlbGJzdCByYXVzZ2VrcmllZ3QgdW5kIG5pY2h0cyBnZWxlcm50LgorCitJbSB6d2VpdGVuIEZhbGwgaGF0IGRlciBTcGllbGVyIGdhbnogdmllbCBnZWxlcm50OiBFciBoYXQgZ2VsZXJudCwgZGFzcyBtYW4KK2VpZ2VudGxpY2ggdWViZXJhbGwgZGVuIEJvZGVuIGFuZ3Vja2VuIGthbm4sIGRhc3MgbWFuIHNpY2ggZGllIERpbmdlIGFuZ3Vja2VuCittdXNzIHVuZCBkYXNzIG1hbiBtaXQgZGVuIEdlZ2Vuc3RhZW5kZW4gbG9naXNjaGUgU2FjaGVuIG1hY2hlbiBrYW5uIHVuZCBkYXNzCitzZWhyLCBzZWhyIG9mdCBpbiBkZW4gRGV0YWlscyBkaWUgQW53ZW5kdW5nc21vZWdsaWNoa2VpdGVuIHZlcnN0ZWNrdCBzaW5kLgorCitEQVMgaXN0IGRpZSBBdWZnYWJlIGVpbmVzIENpY2Vyb25lbiwgdW5kIGRpZSBrb3N0ZXQgWmVpdC4KKworRGFydW0gc29sbHRlIG1hbiBzaWNoIGd1dCB1ZWJlcmxlZ2VuLCBvYiBtYW4gZGllc2UgWmVpdCBnZXJhZGUgamV0enQgaW0gCitNb21lbnQgYXVmYnJpbmdlbiBrYW5uIHVuZCB3aWxsLiBXZW5uIG5pY2h0LCBzb2xsdGUgbWFuIGVzIGJlc3NlciBzZWluIAorbGFzc2VuLgorCitTSUVIRSBBVUNICistLS0tLS0tLS0tCisKK2VpbmZ1ZWhydW5nLCBjaWNlcm9uZQorCitMZXR6dGUgQWVuZGVydW5nOiAyMDA1LTAxLTA0LCB2b24gSHVtbmkKZGlmZiAtLWdpdCBhL2RvYy9oZWxwL2NsaWVudCBiL2RvYy9oZWxwL2NsaWVudApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzEzNmE0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2hlbHAvY2xpZW50CkBAIC0wLDAgKzEsMTkgQEAKK0NsaWVudHMKKz09PT09PT0KKworICAgIE1hbiBrYW5uIGluIE1vcmdlbmdyYXVlbiB1ZWJlciBlaW4gZWluZmFjaGVzICd0ZWxuZXQnLVByb2dyYW1tIHNwaWVsZW4sCisgICAgYWJlciBkaWVzZSB0cmVubmVuIG1laXN0IEVpbi0gdW5kIEF1c2dhYmUgbmljaHQgdW5kIG1hY2hlbiBkYW1pdCBkZW4KKyAgICBMZXNlZmx1c3MgbWVpc3QgdW5hbmdlbmVobS4KKyAgICAKKyAgICBFcyBnaWJ0IHZlcnNjaGllZGVuZSBQcm9ncmFtbWUsIHVlYmVyIGRpZSBkYXMgVW50ZXJzY2hlaWRlbiBkZXIgRWluLSB1bmQKKyAgICBBdXNnYWJlLCBlaW4gRWluZmFlcmJlbi9BdXNsYXNzZW4gdm9uIFRleHRlbiAod2llIHpCIGRlbiBLYW5hZWxlbiBvZGVyCisgICAgS2FtcGZtZWxkdW5nZW4pIHVuZCBub2NoIHZpZWxlcyBtZWhyIG1vZWdsaWNoIGlzdC4KKyAgICAKKyAgICBWZXJsaW5rdCBmaW5kZXQgaWhyIGF1ZiB1bnNlcmVyIFdlYnNlaXRlOiBodHRwOi8vbWcubXVkLmRlIGVpbmlnZSBkZXIKKyAgICBmdWVyIGFtIGJlc3RlbiBiZWZ1bmRlbmVuOiBodHRwOi8vbWcubXVkLmRlL25ld3dlYi9kb3dubG9hZC9pbmRleC5zaHRtbAorCisgU0lFSEUgQVVDSDoKKyAgICB3d3cKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgMjAuIEp1bGkgMjAwNyBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL2hlbHAvY3Jhc2ggYi9kb2MvaGVscC9jcmFzaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmMyNTYzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2hlbHAvY3Jhc2gKQEAgLTAsMCArMSwyMCBAQAorQ3Jhc2hzIHVuZCBpaHJlIEZvbGdlbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFZvcnNpY2h0aWcgYXVzZ2VkcnVlY2t0IGlzdCBlaW4gJ0NyYXNoJyBlaW4gdW5iZWFic2ljaHRpZ3RlciBOZXVzdGFydCAKKyAgICBkZXMgU3BpZWxlcyAoc2llaGU6IGhpbGZlIHJlYm9vdCksIGplZG9jaCBrYW5uIGVzIGhpZXJiZWkgenUgCisgICAgdW52b3JoZXJzZWhiYXJlbiBOZWJlbndpcmt1bmdlbiBrb21tZW4uIFNvbGx0ZXN0IER1IGFsc28gZGVyIE1laW51bmcKKyAgICBzZWluLCBkYXNzIG5hY2ggZWluZW0gJ0NyYXNoJyBpcmdlbmRldHdhcyBtaXQgRGlyIG5pY2h0IHN0aW1tZW4KKyAgICBrYW5uLCB3ZW5kZSBEaWNoIGFuIGVpbmVuIE1hZ2llciBEZWluZXMgVmVydHJhdWVucy4KKyAgICBEaWUgTmViZW53aXJrdW5nZW4gZWluZXMgJ0NyYXNocycgc2luZCBqZWRvY2ggcmVsYXRpdiBzZWx0ZW4uCisKKyAgICBEaWUgR3J1ZW5kZSBmdWVyIGVpbmVuICdDcmFzaCcgc2luZCB2aWVsZmFlbHRpZy4gRG9jaCB3ZW5uIG1hbiBlcworICAgIGF1ZiBkZW4gUHVua3QgYnJpbmdlbiBtb2VjaHRlLCB3aXJkIGVpbiAnQ3Jhc2gnIHNjaGxpY2h0IHVuZCAKKyAgICBlaW5mYWNoIGR1cmNoIHNjaHdlcmUgUHJvZ3JhbW1pZXJmZWhsZXIgYXVzZ2Vsb2VzdCwgYW4gZGVuZW4gc2ljaCBkYXMgCisgICAgTW9yZ2VuR3JhdWVuIHZlcnNjaGx1Y2t0LiAKKyAgICAKKyBTSUVIRSBBVUNIOgorICAgIHJlYm9vdCwgbWFnaWVyCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFNhdCwgMTQuMTAuMjAwMCwgMTA6MTY6MjUgdm9uIEJpZXJjaGVuLgpkaWZmIC0tZ2l0IGEvZG9jL2hlbHAvZHVua2VsZWxmZW4gYi9kb2MvaGVscC9kdW5rZWxlbGZlbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDc4MTg0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2hlbHAvZHVua2VsZWxmZW4KQEAgLTAsMCArMSw1MSBAQAorCitEaWUgRHVua2VsZWxmZW5naWxkZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgRGFzIFZvbGsgZGVyIER1bmtlbGVsZmVuIGxlYnQgaW4gZWluZXIgZ3Jvc3NlbiBIb2VobGVuc3RhZHQgZ3V0CisgICAgICB2ZXJzdGVja3QgaGludGVyIGVpbmVtIFdhc3NlcmZhbGwuIFVlYmVyIGthdW0gZWluIGFuZGVyZXMgVm9sayBnaWJ0IGVzCisgICAgICBzb3ZpZWxlIFZvcnVydGVpbGUgd2llIHVlYmVyIGRpZSBEdW5rZWxlbGZlbiB1bmQgc28gd2VyZGVuIHNpZSB2b24KKyAgICAgIGFsbGVuIG1pc3N0cmF1aXNjaCBiZWFldWd0IG9kZXIgc29nYXIgYmVrYWVtcGZ0LiBJbiBkaWVzZW0gS2FtcGYsCisgICAgICBpbnNiZXNvbmRlcmUgZ2VnZW4gZGllIEVsZmVuLCBzaW5kIHNpZSB2b2VsbGlnIGF1ZiBzaWNoIGFsbGVpbiBnZXN0ZWxsdAorICAgICAgdW5kIHNvIGhhdCBzaWNoIGVpbmUgbWVociBvZGVyIG1pbmRlciBhdXRhcmtlIEdlc2VsbHNjaGFmdCBlbnR3aWNrZWx0LgorICAgICAgRGllIER1bmtlbGVsZmVuIGhhYmVuIGVpbmUgZWlnZW5lIEt1bHR1ciB1bmQgZWluZSBlaWdlbmUgR29ldHRpbiBkZXIKKyAgICAgIHNpZSBodWxkaWdlbi4gV2llIGF1Y2ggZGllIEVsZmVuIHZlcmZ1ZWdlbiBzaWUgdWViZXIgYXVzc2Vyb3JkZW5saWNoCisgICAgICBncm9zc2UgbWFnaXNjaGUgRmFlaGlna2VpdGVuLCBhdWNoIHdlbm4gc2llIHNpY2ggbWVociBhdWYgZGllIHNjaHdhcnplCisgICAgICBTZWl0ZSBkZXIgTWFnaWUgc3BlemlhbGlzaWVydCBoYWJlbi4KKworICAgICAgRGllIEdpbGRlIGJlc3RlaHQgYXVzIHZpZXIgVGVpbGVuLCBlaW5lbSBhbGxnZW1laW5lbiBUZWlsIG1pdCBTa2lsbHMKKyAgICAgIHdpZSBpZGVudGlmaXppZXJlLCBzY2hhZXR6LCBmZXVlcmxhbnplIHVzdy4gZGllIGplZGVyIGluIGRlciBHaWxkZQorICAgICAgZXJsZXJuZW4gbXVzcy4gRGFydWViZXIgaGluYXVzIGdpYnQgZXMgZHJlaSB2ZXJzY2hpZWRlbmUgWndlaWdlIGRlcgorICAgICAgR2lsZGUsIHZvbiBkZW5lbiBqZWRlciBEdW5rZWxlbGYgaW4gendlaSBad2VpZ2UgZWludHJldGVuIHVuZCBzaWNoIGFtCisgICAgICBFbmRlIGRhbm4gaW4gZWluZW0gZGllc2VyIHp3ZWkgWndlaWdlIHNwZXppYWxpc2llcmVuIGthbm4uIERpZXNlIGRyZWkKKyAgICAgIFp3ZWlnZSBzaW5kIEthbXBmLCBNYWdpZSB1bmQgS2xlcnVzLiBJbnNnZXNhbXQgZ2lidCBlcyBhbHNvIDYgbW9lZ2xpY2hlCisgICAgICBad2VpZ2tvbWJpbmF0aW9uZW4sIHp3aXNjaGVuIGRlbmVuIGRpZSBEdW5rZWxlbGZlbiBmcmVpIHdhZWhsZW4ga29lbm5lbi4KKworICAgICAgRGVyIEthbXBmendlaWcgd2lkbWV0IHNpY2ggaW4gZXJzdGVyIExpbmllIGRlbSBVbWdhbmcgbWl0IGRlbQorICAgICAgUnVuZW5zY2h3ZXJ0LiBFcyBnaWJ0IGVpbmVuIFNjaHdlcnRza2lsbCwgZWluZW4gU2tpbGwgenVtIFNjaG1pZWRlbiB2b24KKyAgICAgIFJ1bmVuc2Nod2VydGVybiwgVmVyemF1YmVydW5nZW4gZGVzIFNjaHdlcnRzLCBzb3dpZSBlaW5pZ2UgYWxsZ2VtZWluZQorICAgICAgS2FtcGZmYWVoaWdrZWl0ZW4gd2llIEZpbnRlLCBQYXJhZGUsIEF1c3dlaWNoZW4sIEF1c2ZhbGwuCisKKyAgICAgIERlciBLbGVyaWthbGUgWndlaWcgd2lkbWV0IHNpY2ggZGVyIEh1bGRpZ3VuZyB2b24gU2V5dC1IYW1ha2hhIHVuZCBkZXIKKyAgICAgIGR1bmtsZW4gU2VpdGUgZGVyIE1hY2h0LiBEaWUgRmFlaGlna2VpdGVuIGRlciBLbGVyaWtlciBzaW5kIHouQi4KKyAgICAgIHZlcmZsdWNoZW4sIHZlcmdpZnRlbiwgZGFzIEJlc2Nod29lcmVuIHZvbiBab21iaWVzLCBqZWRvY2gga2VpbmUKKyAgICAgIEhlaWx6YXViZXIgb2RlciBzb2V0d2FzLgorCisgICAgICBJbSBNYWdpZXp3ZWlnIGdlaHQgZXMgZGFubiB1bSBaYXViZXJzcHJ1ZWNoZSBpbSBlbmdlcmVuIFNpbm5lLgorICAgICAgRmV1ZXJsYW56ZW4sIFNjaG1lcnplbiwgU2NodXR6emF1YmVyIHVuZCBhZWhubGljaGVzLgorCisgICAgICBKZWRlciBkZXIgZHJlaSBad2VpZ2UgaGF0IGVpbmVuIGVpZ2VuZW4gVm9yc2l0emVuZGVuLiBOeWVsYSBkaWUKKyAgICAgIFdhZmZlbnNjaG1pZWRpbiBzdGVodCBkZW0gS2FtcGZ6d2VpZyB2b3IuIFRlbyduYSdrYXRsIGRlciBIb2hlcHJpZXN0ZXIsCisgICAgICBkZW0gS2xlcmlrYWxlbiBad2VpZyB1bmQgTmVuYWlzJ3UgZGllIFphdWJlcmluIGRlbSBNYWdpZXp3ZWlnLgorICAgICAgQXVzc2VyZGVtIGlzdCBOZW5haXMndSBhbHMgVm9yc2l0emVuZGUgZGVzIE1hZ2llendlaWdzIHRyYWRpdGlvbmVsbAorICAgICAgYXVjaCBkYXMgR2lsZGVub2JlcmhhdXB0LiBadXNhZXR6bGljaCB6dSBkZW4gZHJlaSBWb3JzaXR6ZW5kZW4gZ2lidCBlcworICAgICAgZHJlaSB3ZWl0ZXJlIHdpY2h0aWdlIE5QQ3MuIERlciBSdWVzdHVuZ3NzY2htaWVkIEJhaXknU2FnYXIsIGRlciBXaXJ0CisgICAgICB1bmQgZWluZSBLcmFldXRlcmt1bmRpZ2UgaW0gTGFib3IgZGVyIERlbGZlbmdpbGRlLgorCisKKyBTSUVIRSBBVUNIOgorICAgIGdpbGRlbiwgYXR0cmlidXRlLCBlYmVuZW4sIGdpbGRlbnN0dWZlbiwgYWJzdHVmdW5nZW4KKworCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBNb24sIDI4LiBKdWwgMjAwMywgMjM6Mjc6MDQgdm9uIFBhZHJlaWMKZGlmZiAtLWdpdCBhL2RvYy9oZWxwL2VkaXRvciBiL2RvYy9oZWxwL2VkaXRvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWJjZmI0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2hlbHAvZWRpdG9yCkBAIC0wLDAgKzEsMTI5IEBACisKK0RlciBFZGl0b3IKKz09PT09PT09PT0KKworICAgIERlciBFZGl0b3Igd2lyZCB2b24gZGVyIFplaXR1bmcsIGRlciBQb3N0IHVuZCBpbiBkZW4gU2VoZXJoYWV1c2VybgorICAgIHZlcndlbmRldC4gRXMgYmVzdGVodCBrZWluZSBUcmVubnVuZyB6d2lzY2hlbiBFaW5nYWJlLSB1bmQgS29tbWFuZG9tb2R1czsKKyAgICBCZWZlaGxlIHdlcmRlbiBtaXQgZWluZXIgVGlsZGUgKH4pIGFscyBlcnN0ZW0gWmVpY2hlbiBpbiBkZXIgWmVpbGUKKyAgICBlaW5nZWxlaXRldCAoQXVzbmFobWVuOiAuLCAqKiB1bmQgITxjbWQ+KS4KKworICAgIERlciBFZGl0b3IgdmVyc3RlaHQgZm9sZ2VuZGUgQmVmZWhsZToKKworICAgICBBbGxnZW1laW5lIEtvbW1hbmRvcworCisgICAgICAgICAuIG9kZXIgKioKKyAgICAgICAgICAgIERlciBlaW5nZWdlYmVuZSBUZXh0IHdpcmQgdWViZXJub21tZW4sIGRlciBFZGl0b3IgYmVlbmRldC4KKworICAgICAgICAgITxjbWQ+CisgICAgICAgICAgICBEYXMgS29tbWFuZG8gPGNtZD4gd2lyZCBhdXNnZWZ1ZWhydCwgYWxzIHdlbm4gRHUgZ2VyYWRlIG5pY2h0CisgICAgICAgICAgICBzY2hyZWliZW4gd3VlcmRlc3QuCisKKyAgICAgICAgIH5xCisgICAgICAgICAgICBBYmJydWNoLiBTY2hvbiBlaW5nZWdlYmVuZXIgVGV4dCBpc3QgdmVybG9yZW47IGluIGRlciBQb3N0L01QQQorICAgICAgICAgICAgd2lyZCBrZWluIEFydGlrZWwgZXJ6ZXVndC4KKworICAgICAgICAgfmgKKyAgICAgICAgICAgIEVpbmUgSGlsZmVzZWl0ZSB3aXJkIGFuZ2V6ZWlndCAocXVhc2kgZWluZSBLdXJ6Zm9ybSBkaWVzZXIgU2VpdGUpCisKKyAgICAgICAgIH4hCisgICAgICAgICAgICBEZXIgRWRpdG9yIHdpcmQgdm9ydWViZXJnZWhlbmQgdmVybGFzc2VuLgorICAgICAgICAgICAgTWFuIGthbm4gbWl0IGRlbSBCZWZlaGwgfnIgd2VpdGVyc2NocmVpYmVuIChkYXMgfnIgaXN0IGFscworICAgICAgICAgICAgbm9ybWFsZXMgS29tbWFuZG8gYXVzc2VyaGFsYiBkZXMgRWRpdG9ycyBlaW56dWdlYmVuISkKKworICAgICAgICAgfnIKKyAgICAgICAgICAgIERlciBnZXNhbXRlIGJpc2hlciBnZXNjaHJpZWJlbmUgVGV4dCB3aXJkIGFuZ2V6ZWlndC4KKyAgICAgICAgIH5SCisgICAgICAgICAgICBXaWUgfnIsIGVzIHdlcmRlbiBqZWRvY2ggbm9jaCBaZWlsZW5udW1tZXJuIG1pdCBhdXNnZWdlYmVuLgorCisgICAgICAgICB+egorICAgICAgICAgICAgRGVyIFRleHRhdXNzY2huaXR0IHVtIGRlbiBDdXJzb3IgaGVydW0gd2lyZCBhbmdlemVpZ3QuCisgICAgICAgICB+WgorICAgICAgICAgICAgd2llIH56LCBlcyB3ZXJkZW4gamVkb2NoIG5vY2ggWmVpbGVubnVtbWVybiBtaXQgYXVzZ2VnZWJlbi4KKworICAgICAgICAgfnMKKyAgICAgICAgICAgIEVzIHdlcmRlbiBTdGF0dXNpbmZvcm1hdGlvbmVuIGFuZ2V6ZWlndC4KKworICAgICAgICAgfmIKKyAgICAgICAgICAgIEVzIHdpcmQgendpc2NoZW4gRmxhdHRlcnNhdHogKGRlZmF1bHQpIHVuZCBCbG9ja3NhdHogdW1nZXNjaGFsdGV0CisKKyAgICAgICAgTnVyIGZ1ZXIgTWFnaWVyOgorCisgICAgICAgICB+aSA8ZmlsZW5hbWU+CisgICAgICAgICAgICBEaWUgRGF0ZWkgPGZpbGVuYW1lPiB3aXJkIGFuIGRlciBtb21lbnRhbmVuIEN1cnNvcnBvc2l0aW9uIGluIGRlbgorICAgICAgICAgICAgVGV4dCBlaW5nZWZ1ZWd0LgorICAgICAgICAgICAgQXVzIEtvbXBhdGliaWxpdGFldHNncnVlbmRlbiBrYW5uIG1hbiBhdWNoIH5yIDxmaWxlbmFtZT4gbmVobWVuLgorCisgICAgIFplaWxlbm9yaWVudGllcnRlIEtvbW1hbmRvcworCisgICAgICAgICB+ZAorICAgICAgICAgICAgRGllIGxldHp0ZSBaZWlsZSB3aXJkIGdlbG9lc2NodCAoVGV4dC0sIG5pY2h0IEVpbmdhYmV6ZWlsZSkuCisKKyAgICAgICAgIH52CisgICAgICAgICAgICBFcyB3aXJkIHp3aXNjaGVuIGRlbSBFaW5mdWVnZW1vZHVzIChkZWZhdWx0KSB1bmQgZGVtCisgICAgICAgICAgICBVZWJlcnNjaHJlaWJtb2R1cyB1bWdlc2NoYWx0ZXQuCisKKyAgICAgICAgIH5zICFzMSFzMiEKKyAgICAgICAgICAgIEVyc2V0enQgZGFzIGVyc3RlIFZvcmtvbW1uaXMgZGVzIFN0cmluZ3MgczEgZHVyY2ggZGVuIFN0cmluZyBzMiBpbgorICAgICAgICAgICAgZGVyIGFrdHVlbGxlbiBaZWlsZS4KKyAgICAgICAgICAgIFN0YXR0IGR1cmNoICEga29lbm5lbiBkaWUgU3RyaW5ncyBhdWNoIGR1cmNoIGJlbGllYmlnZSBhbmRlcmUKKyAgICAgICAgICAgIFplaWNoZW4gZ2V0cmVubnQgd2VyZGVuLCBkaWUgd2VkZXIgaW4gczEgbm9jaCBpbiBzMiB2b3Jrb21tZW4uCisgICAgICAgICAgICBNaXQgZGVyIEZvcm0gfnMgIXMxIXMyIXAgd2lyZCBkaWUgZ2VhZW5kZXJ0ZSBaZWlsZSBkaXJla3QKKyAgICAgICAgICAgIGFuZ2V6ZWlndC4KKworICAgICAgICAgfmYKKyAgICAgICAgICAgIEZvcm1hdGllcnQgZGllIGFrdHVlbGxlIFplaWxlIG5ldS4KKworICAgICBDdXJzb3Jrb21tYW5kb3MKKworICAgICAgICAgfmN1CisgICAgICAgICAgICBEZXIgQ3Vyc29yIHdpcmQgdW0gZWluZSBaZWlsZSBuYWNoIG9iZW4gYmV3ZWd0LgorICAgICAgICAgfmNkCisgICAgICAgICAgICBEZXIgQ3Vyc29yIHdpcmQgdW0gZWluZSBaZWlsZSBuYWNoIHVudGVuIGJld2VndC4KKworICAgICAgICAgfmN0CisgICAgICAgICAgICBEZXIgQ3Vyc29yIHdpcmQgYW4gZGVuIEFuZmFuZyBkZXMgVGV4dGVzIGJld2VndC4KKyAgICAgICAgIH5jYgorICAgICAgICAgICAgRGVyIEN1cnNvciB3aXJkIGFuIGRhcyBFbmRlIGRlcyBUZXh0ZXMgYmV3ZWd0LgorCisgICAgICAgICB+Y3MKKyAgICAgICAgICAgIERlciBDdXJzb3Igd2lyZCBhbiBkZW4gQW5mYW5nIGRlcyBtYXJraWVydGVuIEJsb2NrcyBiZXdlZ3QuCisgICAgICAgICB+Y2UKKyAgICAgICAgICAgIERlciBDdXJzb3Igd2lyZCBhbiBkYXMgRW5kZSBkZXMgbWFya2llcnRlbiBCbG9ja3MgYmV3ZWd0LgorCisgICAgICAgICB+Yzxucj4KKyAgICAgICAgICAgIERlciBDdXJzb3Igd2lyZCBpbiBkaWUgWmVpbGUgPG5yPiBiZXdlZ3QuCisgICAgICAgICB+Yys8bnI+CisgICAgICAgICAgICBEZXIgQ3Vyc29yIHdpcmQgdW0gPG5yPiBaZWlsZW4gbmFjaCBvYmVuIGJld2VndC4KKyAgICAgICAgIH5jLTxucj4KKyAgICAgICAgICAgIERlciBDdXJzb3Igd2lyZCB1bSA8bnI+IFplaWxlbiBuYWNoIHVudGVuIGJld2VndC4KKworICAgICBCbG9ja29yaWVudGllcnRlIEtvbW1hbmRvcworCisgICAgICAgICB+YnMKKyAgICAgICAgICAgIERlciBCbG9ja2FuZmFuZyB3aXJkIGF1ZiBkaWUgYWt0dWVsbGUgWmVpbGUgZ2VzZXR6dC4KKyAgICAgICAgIH5iczxucj4KKyAgICAgICAgICAgIERlciBCbG9ja2FuZmFuZyB3aXJkIGF1ZiBkaWUgWmVpbGUgPG5yPiBnZXNldHp0LgorCisgICAgICAgICB+YmUKKyAgICAgICAgICAgIERhcyBCbG9ja2VuZGUgd2lyZCBhdWYgZGllIGFrdHVlbGxlIFplaWxlIGdlc2V0enQuCisgICAgICAgICB+YmU8bnI+CisgICAgICAgICAgICBEYXMgQmxvY2tlbmRlIHdpcmQgYXVmIGRpZSBaZWlsZSA8bnI+IGdlc2V0enQuCisKKyAgICAgICAgIH5GCisgICAgICAgICAgICBEZXIgbWFya2llcnRlIEJsb2NrIHdpcmQgbmV1IGZvcm1hdGllcnQuCisKKyAgICAgICAgIH5ECisgICAgICAgICAgICBEZXIgbWFya2llcnRlIEJsb2NrIHdpcmQgZ2Vsb2VzY2h0LgorCisgICAgICAgICB+bQorICAgICAgICAgICAgRGVyIG1hcmtpZXJ0ZSBCbG9jayB3aXJkIGFuIGRpZSBha3R1ZWxsZSBDdXJzb3Jwb3NpdGlvbgorICAgICAgICAgICAgdmVyc2Nob2Jlbi4KKworICAgIEFsbGVzIGFuZGVyZSBnaWx0IGFscyBUZXh0LiBVZWJlcmxhbmdlIFplaWxlbiB3ZXJkZW4gYXVmIGVpbmUgbWF4aW1hbGUKKyAgICBMYWVuZ2Ugdm9uIDc4IFplaWNoZW4gdW1nZWJyb2NoZW4uCisKKyAgICBOYWNoIH4hLCBvZGVyIHdlbm4gbWFuIGJlaW0gU2NocmVpYmVuIG5ldHp0b3Qgd2lyZCwga2FubiBtYW4gbWl0IH5yIHdpZWRlcgorICAgIGluIGRlbiBFZGl0b3IgZWluc3RlaWdlbi4KKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgVGh1LCAyNC4wNy4xOTk3LCAwOTowMDowMCB2b24gV2FyZ29uCmRpZmYgLS1naXQgYS9kb2MvaGVscC9laW5mdWVocnVuZyBiL2RvYy9oZWxwL2VpbmZ1ZWhydW5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjOGU4ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaGVscC9laW5mdWVocnVuZwpAQCAtMCwwICsxLDU4IEBACitFaW5lIGt1cnplIEVpbmZ1ZWhydW5nCis9PT09PT09PT09PT09PT09PT09PT09CisKK0hhbGxvIHVuZCB3aWxsa29tbWVuIGltIE1vcmdlbkdyYXVlbiEKKworRHUgYmVmaW5kZXN0IERpY2ggamV0enQgaW4gZWluZXIgdmlydHVlbGxlbiBXZWx0LCBpbiBkZXIgRHUgRGVpbmVuIENoYXJha3RlcgorKHNvIGJlemVpY2huZXQgbWFuIERlaW5lIFNwaWVsZmlndXIpIG1pdHRlbHMgdmVyYmFsZXIgQmVmZWhsZSBkYXp1IGJyaW5nZW4KK2thbm5zdCwgZGllIHZlcnNjaGllZGVuc3RlbiBCZXdlZ3VuZ2VuIHVuZCBBa3Rpb25lbiBhdXN6dWZ1ZWhyZW4uIER1IGthbm5zdAordW1oZXJnZWhlbiwgRGljaCB1bXNlaGVuLCBrYWVtcGZlbiwgRGluZ2UgYXVmaGViZW4gdW5kIGJlbnV0emVuIHVuZCB2aWVsZXMKK21laHIhIERhenUgc29sbHRlc3QgRHUgRGljaCBtaXQgZGVuIGdydW5kbGVnZW5kZW4gQmVmZWhsZW4gdmVydHJhdXQgbWFjaGVuLAorZGllIGRhenUgbm90d2VuZGlnIHNpbmQuIEZvbGdlbmRlIEhpbGZlc2VpdGVuIHNlaWVuIERpciBhbidzIEhlcnogZ2VsZWd0OgorCistICJoaWxmZSBiZXdlZ3VuZyIKKy0gImhpbGZlIHN5bnRheCIKKworRHUga2FubnN0IERpY2ggbWl0IGRlbiBhbmRlcmVuIFNwaWVsZXJuIGF1ZiB2ZXJzY2hpZWRlbmUgV2Vpc2UKK3ZlcnN0YWVuZGlnZW4uIFdpY2h0aWcgaXN0IHp1bSBlaW5lbiBkYXMgZGlyZWt0ZSBNaXR0ZWlsZW4sIGRhcyBmdW5rdGlvbmllcnQKK3NvOiAKKworInRlaWxlIDxzcGllbGVybmFtZT4gbWl0IDxuYWNocmljaHQ+IgorCithbHNvIHp1bSBCZWlzcGllbAorCisidGVpbGUgem9vayBtaXQgaGFsbG8gbXVkZ290dCEiCisKK0RhcyBhbmRlcmUgc2luZCBkaWUgc29nZW5hbm50ZW4gIkViZW5lbiIsIGF1ZiBkZW5lbiBEdSBhbGxlbiBTcGllbGVybiAoZGllCitkb3J0IGdyYWRlIG1pdGhvZXJlbikgZXR3YXMgbWl0dGVpbGVuIGthbm5zdC4gQW0gQW5mYW5nIGJlZmluZGVzdCBEdSBEaWNoCithdWYgZGVuIEViZW5lICJhbmZhZW5nZXIiIHVuZCAiYWJlbnRldWVyIi4gV2VubiBEdSB6dW0gQmVpc3BpZWwgZGllIGFuZGVyZW4KK1NwaWVsZXIgZXR3YXMgZnJhZ2VuIG1vZWNodGVzdCwgdGlwcCB6dW0gQmVpc3BpZWwKKworLWFuZmFlbmdlciBIYWxsbyBpaHIgZGEgZHJhdXNzZW4hIFdpZSBrb21tZSBpY2ggenVyIEFiZW50ZXVyZXJnaWxkZT8KKwordW5kIGFsbGUsIGRpZSBhdWYgZGVyIEFuZmFlbmdlcmViZW5lIG1pdGhvZXJlbiwgd2VyZGVuIGRpZXNlIE5hY2hyaWNodAorYmVrb21tZW4uIEZ1ZXIgd2VpdGVyZSBJbmZvcm1hdGlvbmVuIHp1IGRlbiBFYmVuZW4gbGllcyBlaW5mYWNoIG1hbAorZGllIEhpbGZlc2VpdGUgZGF6dSAoImhpbGZlIGViZW5lbiIpLgorCitFaW5lcyBkZXIgSGF1cHR6aWVsZSBkaWVzZXMgU3BpZWxlcyBpc3QsIHNlaW5lIFNwaWVsZmlndXIgd2VpdGVyenVlbnR3aWNrZWxuLAorYWxzbyBkaWUgV2VydGUgenUgdmVyYmVzc2Vybi4gSW5mb3JtYXRpb25lbiBkYXp1IGZpbmRlc3QgRHUgYXVmIGRlbgorSGlsZmVzZWl0ZW4gInN0dWZlbnB1bmt0ZSIsICJhYmVudGV1ZXIiIHVuZCAiYXR0cmlidXRlIi4KKworRXMgc2VpIG5vY2ggZGFyYXVmIGhpbmdld2llc2VuLCBkYXNzIGVzIG5hdHVlcmxpY2ggYXVjaCBnZXdpc3NlIFJlZ2VsbgorZ2lidCwgYW4gZGllIHNpY2ggZGllIFNwaWVsZXIgaGFsdGVuIG11ZXNzZW4gKCJoaWxmZSByZWdlbG4iKS4KK0xpZXMgRGlyIGRpZXNlIGF1ZiBqZWRlbiBGYWxsIGluIFJ1aGUgdm9sbHN0YWVuZGlnIGR1cmNoIQorCitFcyBnaWJ0IGF1Y2ggZ2V3aXNzZSBTcGllbGVyLCBkaWUgc2ljaCBleHRyYSBiZXJlaXRlcmtsYWVydCBoYWJlbiwgRGlyIGFscworQW5mYWVuZ2VyIHp1ciBTZWl0ZSB6dSBzdGVoZW4sIGRpZSBDaWNlcm9uZW4uIFdlbm4gRHUgd2lzc2VuIHdpbGxzdCwgd2VyIAorZGF2b24gb25saW5lIGlzdCwga2FubnN0IER1IGRlbiBCZWZlaGwKKworImt3ZXIgY2ljZXJvbmUiCisKK3ZlcndlbmRlbi4gRGllIHNvbGx0ZW4gZGFubiBhbndlc2VuZCBzZWluIHVuZCBhdWNoIFplaXQgZnVlciBEaWNoIHVuZCBEZWluZQorRnJhZ2VuIGhhYmVuLgorCisgU0lFSEUgQVVDSDoKKyAgICAgYWJlbnRldWVyLCBiZXdlZ3VuZywgZm9yc2NoZXJwdW5rdGUsIHJlZ2Vsbiwgc3R1ZmVuLCBzeW50YXgsIGNpY2Vyb25lbgorIAorIExFVFpURSBBZU5ERVJVTkc6CisgICAgU3VuLCAyNC4wNi4yMDAxLCAyMjozMDowMCB2b24gTmFjaHR3aW5kCmRpZmYgLS1naXQgYS9kb2MvaGVscC9lcnN0a2lsbHN0dWZlbnB1bmt0ZSBiL2RvYy9oZWxwL2Vyc3RraWxsc3R1ZmVucHVua3RlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNzY4ODEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaGVscC9lcnN0a2lsbHN0dWZlbnB1bmt0ZQpAQCAtMCwwICsxLDQzIEBACitFcnN0a2lsbC1TdHVmZW5wdW5rdGUgKEVLLVN0dXBzZSkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgWnVzYWV0emxpY2ggenUgZGVyIGFsbGdlbWVpbmVuIEVybGFldXRlcnVuZywgd2FzIEVLLVN0dWZlbnB1bmt0ZSBzaW5kCisgICAgdW5kIHdvZnVlciBkaWVzZSBndXRnZXNjaHJpZWJlbiB3ZXJkZW4sIGRpZSBpbiBkZXIgSGlsZmVzZWl0ZSB6dSBkZW4KKyAgICBTdHVmZW5wdW5rdGVuIG5hY2h6dWxlc2VuIGlzdCwgc2VpIGhpZXIgZWluIHRlY2huaXNjaGVzIERldGFpbCB6dSAKKyAgICBFcnN0a2lsbC1TdHVmZW5wdW5rdGVuIGluIFp1c2FtbWVuaGFuZyBtaXQgS2VyYmhvbHogdW5kIER1ZXN0ZXJ3YWxkLQorICAgIFBsYWtldHRlIChiZWlkZXMgUXVlc3RiZWxvaG51bmdlbikgbmFlaGVyIGVybGFldXRlcnQ6CisgICAgICAKKyAgICBXZW5uIGVpbiBNb25zdGVyLCBmdWVyIGRhcyBFSy1TdHVwc2UgZ3V0Z2VzY2hyaWViZW4gd2VyZGVuLCB6dW0KKyAgICBhbGxlcmVyc3RlbiBNYWwgdWViZXJoYXVwdCBnZXRvZXRldCB3aXJkLCBkLmguIGluIGRlciBSZWdlbCBuYWNoCisgICAgZGVtIE5ldWFuc2NobHVzcyBlaW5lcyBHZWJpZXRlcywgaXN0IGRpZXNlciBLaWxsIG5vY2ggbmljaHQgc29mb3J0CisgICAgYXVmIGRlciBQbGFrZXR0ZSBlcmtlbm5iYXIsIHVuZCBhdWNoIG5vY2ggbmljaHQgaW4gZGllIEdlc2FtdC0KKyAgICBTdHVmZW5wdW5rdGUgZGVzIFNwaWVsZXJzIGVpbmdlcmVjaG5ldC4gRGFzIEtlcmJob2x6IHdpcmQgamVkb2NoCisgICAgYW56ZWlnZW4sIGRhc3MgZGVyIFNwaWVsZXIgZGVuIEtpbGwgc2Nob24gaGF0LgorICAgIAorICAgIEF1cyB0ZWNobmlzY2hlbiBHcnVlbmRlbiBpc3QgZXMgdW51bWdhZW5nbGljaCwgc29sY2hlICJmcmlzY2hlbiIgRUtzCisgICAgenVuYWVjaHN0IG51ciB0ZW1wb3JhZXIgenUgcmVnaXN0cmllcmVuIHVuZCB2b24gZWluZW0gRXJ6bWFnaWVyIGF1ZgorICAgIEd1ZWx0aWdrZWl0IHBydWVmZW4genUgbGFzc2VuLiBTbyBsYW5nZSBkZXIgenVzdGFlbmRpZ2UgRU0gKHdlciBkYXMgCisgICAgamV3ZWlscyAgaXN0LCBsYWVzc3Qgc2ljaCBhdWYgZGVyIEhpbGZlc2VpdGUgImVyem1hZ2llciIgbmFjaGxlc2VuKQorICAgIGRlbiBFSyBuaWNodCBiZXN0YWV0aWd0IGhhdCwgZ2lidCBlcyB2b3J1ZWJlcmdlaGVuZCBhbHNvIGVpbmUKKyAgICBEaXNrcmVwYW56IHp3aXNjaGVuIEtlcmJob2x6LCBTdHVmZSB1bmQgUGxha2V0dGUuIFNvYmFsZCBkZXIKKyAgICBFSyBqZWRvY2ggYmVzdGFldGlndCB3dXJkZSwgdmVyc2Nod2luZGV0IGRpZXNlLgorCisgICAgV2VpdGVyaGluIGlzdCB6dSBiZWFjaHRlbiwgZGFzcyBldmVudHVlbGwgdmVyZ2ViZW5lIFNvbmRlci0KKyAgICBTdHVmZW5wdW5rdGUgZnVlciBiZXNvbmRlcnMgaGFydGUgTW9uc3RlciAoei5CLiBEcmFjaGVuZ290dCkKKyAgICBlcnN0ICpuYWNoKiBlaW5lciBCZXN0YWV0aWd1bmcgZGVzIEVLcyBkdXJjaCBkZW4genVzdGFlbmRpZ2VuCisgICAgRU0gZWluZ2V0cmFnZW4gd2VyZGVuIGtvZW5uZW4sIHNvIGRhc3MgZXMgbmFjaHRyYWVnbGljaCBub2NoIHp1CisgICAgZWluZXIgRXJob2VodW5nIGRlciBTdHVmZW5wdW5rdGUgZGVzIGJldHJlZmZlbmRlbiBTcGllbGVycyBrb21tZW4ga2Fubi4KKworICAgIFdJQ0hUSUc6CisgICAgRGllc2UgSGlud2Vpc2UgZ2VsdGVuIG51ciBmdWVyIHNvbGNoZSBTcGllbGVyLCBkaWUgTW9uc3RlciBnZXRvZXRldCAKKyAgICBoYWJlbiwgd2VsY2hlIG5vY2ggbmllIHp1dm9yIHVtZ2VoYXVlbiB3dXJkZW4uIEZ1ZXIgYWxsZSwgZGllIGRlbiBLaWxsIAorICAgIGVyc3Qgc3BhZXRlciBlcnJlaWNoZW4sIGFlbmRlcnQgc2ljaCBuaWNodHM6IERpZSBQdW5rdGUgd2VyZGVuIHNvZm9ydCBpbiAKKyAgICB2b2xsZXIgSG9laGUgZ3V0Z2VzY2hyaWViZW4sIHVuZCBkaWUgUGxha2V0dGUgemFlaGx0IGRlbiBFSyBhdWNoIHNvZm9ydCAKKyAgICBtaXQuCisKKyAgU0lFSEUgQVVDSDoKKyAgICBzdHVmZW4sIHN0dWZlbnB1bmt0ZSwgZXJ6bWFnaWVyCisKKyAgTEVUWlRFIEFlTkRFUlVORzoKKyAgICAxNi4gQXVndXN0IDIwMTMsIHZvbiBBcmF0aG9ybgorCmRpZmYgLS1naXQgYS9kb2MvaGVscC9lcnptYWdpZXIgYi9kb2MvaGVscC9lcnptYWdpZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk2MzAwMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9oZWxwL2Vyem1hZ2llcgpAQCAtMCwwICsxLDY2IEBACitFcnptYWdpZXIKKz09PT09PT09PQorCitFUlpNQUdJRVI6CisgIERlciBFaW5mbHVzc2JlcmVpY2ggZGVyIEVyem1hZ2llciBiZXNjaHJhZW5rdCBzaWNoIG5pY2h0IG51ciBhdWYgQmVyZWljaGUKKyAgaW5uZXJoYWxiIGRlcyBTcGllbHMsIHNvbmRlcm4gYXVjaCBhdWYgQmVyZWljaGUgYXVzc2VyaGFsYi4gU2llIGtvZW5uZW4KKyAgQWVuZGVydW5nZW4gYW4gZGVyIEJhc2lzLU11ZExpYiB2b3JuZWhtZW4gdW5kIGRhbWl0IGRpZSBSYWhtZW5iZWRpbmd1bmdlbgorICBkZXMgU3BpZWxzIGFlbmRlcm4gb2RlciBlcmdhZW56ZW4uIEF1c3NlcmRlbSBzaW5kIHNpZSBkaWUgcmljaHRpZ2VuCisgIEFuc3ByZWNocGFydG5lciwgd2VubiBtYW4gc2VpbiBQYXNzd29ydCB2ZXJnZXNzZW4gaGF0LCBvZGVyIHdlbm4gZHVyY2gKKyAgZWluZW4gQWJzdHVyeiBkZXMgUmVjaG5lcnMgZGFzIFNhdmVmaWxlIGVpbmVzIFNwaWVsZXJzIGthcHV0dCBnZWdhbmdlbgorICBpc3QuCisKKyAgRGllIE11ZEdvZXR0ZXIgSm9mLCBSdW1hdGEgdW5kIFpvb2sgc2luZCBkYWJlaSBkaWUgaG9lY2hzdGVuIEluc3RhbnplbjsKKyAgSm9mIG1hY2h0IHNpY2ggYWxsZXJkaW5ncyBpbiBsZXR6dGVyIFplaXQgZXR3YXMgcmFyLgorCitEaWUgQXVmZ2FiZW5iZXJlaWNoZSBkZXIgZWluemVsbmVuIEVyem1hZ2llciBzaW5kIHdpZSBmb2xndCBmZXN0Z2VsZWd0OgorCisgICAgICBBbWFyeWxsaXMKKyAgICAgICAgQW1hcnlsbGlzIGlzdCBmdWVyIGRpZSBBZG1pbmlzdHJhdGlvbiB1bmQgZGFzIEhvc3RpbmcgdW5zZXJlcworICAgICAgICBTZXJ2ZXJzIHp1c3RhZW5kaWcgdW5kIGhhdCBhdXNzZXJkZW0gZGFzIEFtdCBkZXMgU2hlcmlmZnMgaW5uZS4KKyAgICAgIEFyYXRob3JuCisgICAgICAgIEFyYXRob3JuIGt1ZW1tZXJ0IHNpY2ggdW0gZGllIFZlcmdhYmUgZGVyIEVyc3RraWxsLVN0dXBzZSAoZGF6dQorICAgICAgICBiZWd1dGFjaHRldCBlciBkaWUgTlBDcykuIERhcnVlYmVyaGluYXVzIGt1ZW1tZXJ0IGVyIHNpY2ggCisgICAgICAgIHVtIGRpZSBXZWl0ZXJlbnR3aWNrbHVuZyBkZXIgTXVkbGliLgorICAgICAgQXJrCisgICAgICAgIEFyayB0ZXN0ZXQgbmV1ZSBBYmVudGV1ZXIgc293aWUgc29nZW5hbm50ZSBNaW5pUXVlc3RzIGJldm9yIHNpZQorICAgICAgICBhdWYgU3BpZWxlciBsb3NnZWxhc3NlbiB3ZXJkZW4gdW5kIHRyYWVndCBkaWVzZSBtaXQgCisgICAgICAgIGFuZ2VtZXNzZW5lciBQdW5rdHphaGwgZWluLgorICAgICAgICBFciBrdWVtbWVydCBzaWNoIHVtIGRpZSBQZmxlZ2UgZGVyIGJlc3RlaGVuZGVuIFJhc3NlbiBzb3dpZSBkaWUKKyAgICAgICAgQXVzYXJiZWl0dW5nIHdlaXRlcmVyIFJhc3Nlbi4gRGF6dSBnZWhvZXJlbiBzb3dvaGwgZGllIFJhc3NlbnNoZWxscworICAgICAgICBhbHMgYXVjaCBkaWUgU2VlbGUuCisgICAgICBIdW1uaQorICAgICAgICBIdW1uaSBpc3QgZnVlciBkaWUgR2lsZGVuLUJhbGFuY2UgenVzdGFlbmRpZyB1bmQgbGVpdGV0IGRhcworICAgICAgICBCYWxhbmNlLVRlYW0uIERlcyBXZWl0ZXJlbiBpc3QgZXIgZnVlciBkaWUgSGVpbHVuZ3MtQmFsYW5jZQorICAgICAgICB6dXN0YWVuZGlnLgorICAgICAgSm9mCisgICAgICAgIEpvZiBpc3QgYWxzIE11ZEdvdHQgZnVlciBtZWhyIG9kZXIgd2VuaWdlciBhbGxlcyB6dXN0YWVuZGlnLgorICAgICAgUnVtYXRhCisgICAgICAgIFJ1bWF0YSBpc3QgTXVkR29ldHRpbiB1bmQgZGFtaXQgYXVjaCBNYWVkY2hlbiBmdWVyIGFsbGVzLgorICAgICAgICBVbmQgZGVsZWdpZXJ0IGRhbm4gOy0pCisgICAgICBNaXJpbAorICAgICAgICBNaXJpbCB2ZXJ3YWx0ZXQgZGllIEZvcnNjaGVycHVua3RlIHVuZCBaYXViZXJ0cmFlbmtlLgorICAgICAgTi5OLiAKKyAgICAgICAgRXIvU2llIGlzdCB3ZWl0ZXJoaW4gZnVlciBkaWUgUGZsZWdlIGRlcyBTdHVmZW5zeXN0ZW1zIHZlcmFudHdvcnRsaWNoIAorICAgICAgICB1bmQga3VlbW1lcnQgc2ljaCB1bSBkaWUgUGZsZWdlIGRlciBNdWRsaWIuCisgICAgICBaZXNzdHJhCisgICAgICAgIFplc3N0cmEga3VlbW1lcnQgc2ljaCB1bSB1bnNlcmVuIERyaXZlciB1bmQgZGllIE11ZGxpYi4KKyAgICAgIFpvb2sKKyAgICAgICAgWm9vayBpc3QgZWluZXIgZGVyIE11ZEdvZXR0ZXIgdW5kIGRhbWl0IE1hZWRjaGVuIGZ1ZXIgCisgICAgICAgIGFsbGVzLiBFciBlcm5lbm50IFJlZ2lvbnNtYWdpZXIgdW5kIGJlcnVmdCBkaWVzZSBnZWdlYmVuZW5mYWxscworICAgICAgICBhYi4gSnVuZ21hZ2llciBrb2VubmVuIHNpY2ggbWl0IGlocmVuIEdlc2VsbGVuc3R1ZWNrZW4gZ2VybmUgYmVpCisgICAgICAgIGlobSBtZWxkZW4uCisKK05vY2ggaW0gS3JlaXMgZGVyIEVyem1hZ2llciwgYWJlciBzY2hvbiBpaHJlciBBdWZnYWJlbiBlbnRidW5kZW4gCitzaW5kOiAKKworICAgICAgSGF0ZQorICAgICAgICBIYXRlIHdhciBmdWVyIGRpZSBBZG1pbmlzdHJhdGlvbiB1bnNlcmVzIE11ZC1SZWNobmVycyB6dXN0YWVuZGlnLgorCitTSUVIRSBBVUNIOgorICAgICAgICBlYmVuZW4sIHJlZ2lvbmVuLCBnb2V0dGVyCisgICAgICAgIChudXIgTWFnaWVyKTogYmFsYW5jZQorCitMRVRaVEUgQWVOREVSVU5HOgorICAgICAgICAyMDExLTA5LTI1IHZvbiBab29rLgorCmRpZmYgLS1naXQgYS9kb2MvaGVscC9lc3Nlbl90cmlua2VuIGIvZG9jL2hlbHAvZXNzZW5fdHJpbmtlbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODdjNGVkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2hlbHAvZXNzZW5fdHJpbmtlbgpAQCAtMCwwICsxLDMwIEBACisKK0Vzc2VuIHVuZCBUcmlua2VuCis9PT09PT09PT09PT09PT09PQorCisgICAgIEVpbmVzIHZvcmF1czogRXNzZW4gdW5kIFRyaW5rZW4gc2luZCBpbiBNb3JnZW5ncmF1ZW4gbmljaHQgbGViZW5zLQorICAgICBub3R3ZW5kaWcuIE5pZW1hbmQgd2lyZCBhbiBIdW5nZXIgb2RlciBEdXJzdCBzdGVyYmVuIHVuZCBhdWNoIGRlcgorICAgICBHYW5nIGF1ZiBkaWUgVG9pbGV0dGUgaXN0IGhvZWNoc3Qgb3B0aW9uYWwuCisKKyAgICAgSGF1cHRzYWVjaGxpY2ggaW4gS25laXBlbiBrYW5uIG1hbiBoaWVyIGVzc2VuLCB0cmlua2VuIG9kZXIgc2ljaAorICAgICBiZXNhdWZlbi4gRXMgZ2lidCBhdWNoIHRyYWdiYXJlIEdldHJhZW5rZSB1bmQgU3BlaXNlbi4KKyAgICAgRGFiZWkgaGFlbmdlbiBkaWUgR3JlbnplbiBkZXMgRmFzc3VuZ3N2ZXJtb2VnZW5zIGZ1ZXIgTmFocnVuZywKKyAgICAgRmx1ZXNzaWdrZWl0IHVuZCBBbGtvaG9sIHZvciBhbGxlbSB2b24gZGVyIFJhc3NlIGFiLCBhYmVyIGF1Y2ggbWFuY2hlCisgICAgIEdpbGRlbiBrb2VubmVuIGR1cmNoIE1hZ2llIG9kZXIgVWVidW5nIGZ1ZXIgbWVociBLYXBheml0YWV0IHNvcmdlbi4KKyAgICAgCisgICAgIE1pdCBkZXIgWmVpdCBlbnRsZWVydCBtYW4gc2ljaCBkYW5uIHdpZWRlciB2b24gYWxsZWluZS4gTWFuIGthbm4gZGllc2VtCisgICAgIFZvcmdhbmcgYXVjaCBldHdhcyBhdWYgZGllIFNwcnVlbmdlIGhlbGZlbiwgamVkb2NoIG5pY2h0IHVuYmVncmVuenQKKyAgICAgb2Z0IGluIGt1cnplciBaZWl0LiBIaWVyYmVpIHNvbGx0ZSBiZWRhY2h0IHdlcmRlbiwgZGFzcyBudXIgYXVmIEtsbworICAgICBnZWhlbiBrYW5uLCB3ZXIgYXVjaCB2b3JoZXIgZWluZSBiZXN0aW1tdGUgTWVuZ2UgYW4gTmFocnVuZyB6dSBzaWNoCisgICAgIGdlbm9tbWVuIGhhdC4KKworICAgICBTcGVpc2VuIHVuZCBHZXRyYWVua2UgaGVpbGVuIGluIGJlc3RpbW10ZW0gTWFzcy4gRGFiZWkga29lbm5lbiBzaWUKKyAgICAgTGViZW5zLSBvZGVyIEtvbnplbnRyYXRpb25zcHVua3RlIGF1Y2ggdW5hYmhhZW5naWcgdm9uZWluYW5kZXIKKyAgICAgc3RhZXJrZW4uIEVpbiBqZWRlciBzdWNoZSBzaWNoIGRpZSBLbmVpcGUgc2VpbmVyIFdhaGwuCisKKyBTSUVIRSBBVUNIOgorICAgICBoZWlsdW5nLCBsZWJlbgorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICAgMTQuTWFlcnogMjAwNCBHbG9pbnNvbgorCmRpZmYgLS1naXQgYS9kb2MvaGVscC9mYXEgYi9kb2MvaGVscC9mYXEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTljODlmNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9oZWxwL2ZhcQpAQCAtMCwwICsxLDI4IEBACisKK0RpZSBGQVEKKz09PT09PT0KKworICAgIER1IGhhc3QgSW50ZXJlc3NlIGFuIGRlbiBGQVE/IEd1dCBzbywgZWluZSBrbHVnZSBFbnRzY2hlaWR1bmcuCisKKyAgICBadXIgWmVpdCBmaW5kZXN0IER1IGRpZSBuZXVlc3RlIEF1c2dhYmUgZGVyIEZBUSBhdWYgZGVtIEZUUCBTZXJ2ZXIgZGVzCisgICAgTXVkcyBpbSBWZXJ6ZWljaG5pcyBgL29wZW4vVGV4dGUvRkFRLycuIERpZXNlcyBWZXJ6ZWljaG5pcyBpc3QgYXVjaCBmdWVyCisgICAgU3BpZWxlciB6dWdhZW5nbGljaC4gSW0gZWluemVsbmVuIHNvbGx0ZXN0IER1IGZvbGdlbmRlcm1hc3NlbiB2b3JnZWhlbjoKKworICAgID4gZnRwIG1nLm11ZC5kZQorICAgIFtBbHMgTG9naW4tTmFtZW4gJ2Fub255bW91cycgdW5kIGFscyBQYXNzd29ydCBEZWluZSBFTWFpbC1BZHJlc3NlIGFuZ2ViZW5dCisgICAgW01hZ2llciBrb2VubmVuIGF1Y2ggTmFtZW4gdW5kIFBhc3N3b3J0IGlocmVzIENoYXJha3RlcnMgbmVobWVuXQorICAgID4gY2QgL29wZW4vVGV4dGUvRkFRCisgICAgPiBnZXQgbWctZmFxLnYyMDIKKworICAgIEVpbmUgYW5kZXJlIE1vZWdsaWNoa2VpdCBpc3QsIGVpbmUgRS1NYWlsIGFuIG11ZEBtZy5tdWQuZGUgenUKKyAgICBzY2hpY2tlbiB1bmQgYWxzIFN1YmplY3QgYEZBUScgYW56dWdlYmVuLgorCisgICAgSGFzdCBEdSBkYXMgZ2VzY2hhZmZ0LCBiaXN0IER1IGltIEJlc2l0eiBlaW5lcyB1bWZhbmdyZWljaGVuIFdlcmtlcyB1ZWJlcgorICAgIHNlaHIgdmllbGUgRnJhZ2VuLCBkaWUgaW0gWnVzYW1tZW5oYW5nIG1pdCBkZW0gU3BpZWwgYXVmdGF1Y2hlbiBrb2VubmVuLgorICAgIFNvbGx0ZSBEZWluZXIgTWVpbnVuZyBuYWNoIGV0d2FzIGluIGRlbiBGQVEgZmVobGVuLCBzbyBzY2hyZWliIGVpbmZhY2gKKyAgICBlaW5lIE1haWwgYW4gUGlsZ3JpbSBvZGVyIFZpcGVyLiBQaWxncmltIGlzdCBhbHMgQXV0b3IgZGVzIFdlcmtlcyBmdWVyCisgICAgQW5yZWd1bmdlbiBzZWhyIGRhbmtiYXIuCisKK0xFVFpURSBBZU5ERVJVTkc6CisgICAgU2FtLCAyOS4gU2VwIDIwMDEsIDExOjM1OjAxIHZvbiBab29rLgorCmRpZmYgLS1naXQgYS9kb2MvaGVscC9mb3JzY2hlcnB1bmt0ZSBiL2RvYy9oZWxwL2ZvcnNjaGVycHVua3RlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMmRkZDkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaGVscC9mb3JzY2hlcnB1bmt0ZQpAQCAtMCwwICsxLDU0IEBACisKK0ZvcnNjaGVycHVua3RlCis9PT09PT09PT09PT09PQorCisgICAgRGllIEZvcnNjaGVycHVua3RlIGdlYmVuIERlaW5lbiBha3R1ZWxsZW4gR3JhZCBkZXIgS2VubnRuaXMgZGVzCisgICAgTW9yZ2VuR3JhdWVucyB3aWVkZXIuIFNpZSB3ZXJkZW4gYWxsZXJkaW5ncyBuaWNodCBhbHMgbmFja3RlIFphaGwKKyAgICBwcmFlc2VudGllcnQsIHNvbmRlcm4gaW4gRm9ybSBlaW5lciBFaW5zY2hhZXR6dW5nIGdlbWVzc2VuIGFuIGRlciBLZW5udG5pcworICAgIERlaW5lciBNaXRzcGllbGVyIHNvd2llIGFtIGdlc2FtdGVuIE1vcmdlbkdyYXVlbi4KKworICAgIERpZSBLZW5udG5pcyB3YWVjaHN0IGltIExhdWZlIGRlciBaZWl0LCB3ZW5uIER1IERpY2ggZWluaWdlcm1hc3NlbgorICAgIHNvcmdmYWVsdGlnIHVtc2llaHN0IHVuZCBtaXQgTlBDcyB1bnRlcmhhZWx0c3QuIFdlciBlaW5mYWNoIG51ciBzdHVtcGYgZGFzCisgICAgYWJzb2x1dCBOb2V0aWdzdGUgZWluZ2lidCwgdW0gZWluIEFiZW50ZXVlciB6dSBsb2VzZW4sIGRhcmYgc2ljaCBhbHNvCisgICAgbmljaHQgd3VuZGVybiwgd2VubiBlciBzaWNoIGltIE1vcmdlbkdyYXVlbiB0cm90emRlbSBzbyBndXQgd2llIGdhciBuaWNodAorICAgIGF1c2tlbm50LgorCisgICAgRGllIEZvcnNjaGVycHVua3RlIG1hY2hlbiBlaW5lbiBncm9zc2VuIFRlaWwgZGVyIFN0dWZlbnB1bmt0ZSBhdXMuCisKKyAgICBXZW5uIG1hbiBkaWUgZXJzdGUgSHVlcmRlIChgRHUga2VubnN0IERpY2ggaW0gTW9yZ2VuR3JhdWVuIHNvIGd1dCB3aWUgZ2FyCisgICAgbmljaHQgYXVzLicpIHVlYmVyd3VuZGVuIGhhdCwgc2luZCBmb2xnZW5kZSByZWxhdGl2ZW4gdW5kIGFic29sdXRlbgorICAgIEVpbnN0dWZ1bmdlbiBtb2VnbGljaDoKKworICAgIFZlcmdsaWNoZW4gbWl0IERlaW5lbiBNaXRzcGllbGVybiwga2VubnN0IER1IERpY2ggaW0gTW9yZ2VuR3JhdWVuCisKKyAgICAgKiBrYXVtIGF1cy4KKyAgICAgKiBhZXVzc2Vyc3Qgc2NobGVjaHQgYXVzLgorICAgICAqIHNlaHIgc2NobGVjaHQgYXVzLgorICAgICAqIHNjaGxlY2h0IGF1cy4KKyAgICAgKiB1bnRlcmR1cmNoc2Nobml0dGxpY2ggYXVzLgorICAgICAqIGR1cmNoc2Nobml0dGxpY2ggZ3V0IGF1cy4KKyAgICAgKiBiZXNzZXIgYWxzIGRlciBEdXJjaHNjaG5pdHQgYXVzLgorICAgICAqIHJlY2h0IGd1dCBhdXMuCisgICAgICogemllbWxpY2ggZ3V0IGF1cy4KKyAgICAgKiBndXQgYXVzLgorICAgICAqIHNlaHIgZ3V0IGF1cy4KKyAgICAgKiBhdXNzZXJvcmRlbnRsaWNoIGd1dCBhdXMuCisgICAgICogdW5oZWltbGljaCBndXQgYXVzLgorICAgICAqIGVpbmZhY2ggaGVydm9ycmFnZW5kIGF1cy4KKworICAgIEFic29sdXQgZ2VzZWhlbgorCisgICAgICoga2VubnN0IER1IG51ciB3ZW5pZyB2b20gTW9yZ2VuR3JhdWVuLgorICAgICAqIHNvbGx0ZXN0IER1IERpY2ggdmllbGxlaWNodCBub2NoIGdlbmF1ZXIgdW1zZWhlbi4KKyAgICAgKiBiaXN0IER1IGR1cmNoYXVzIHNjaG9uIGhlcnVtZ2Vrb21tZW4uCisgICAgICogaGFzdCBEdSBzY2hvbiBlaW5pZ2VzIGdlc2VoZW4uCisgICAgICogYmlzdCBEdSBzY2hvbiB3ZWl0IGhlcnVtZ2Vrb21tZW4uCisgICAgICoga29lbm50ZXN0IER1IGVpZ2VudGxpY2ggZWluZW4gUmVpc2VmdWVocmVyIGhlcmF1c2JyaW5nZW4uCisgICAgICogaGFzdCBEdSBzY2hvbiBzZWhyIHZpZWwgZ2VzZWhlbi4KKyAgICAgKiBiZXNpdHp0IER1IGVpbmUgaGVydm9ycmFnZW5kZSBPcnRza2VubnRuaXMuCisKKyBTSUVIRSBBVUNIOgorICAgIHN0dWZlbnB1bmt0ZSwgaW5mbworCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBUaHUsIDI0LjA3LjE5OTcsIDA5OjAwOjAwIHZvbiBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9oZWxwL2dlc2VsbGVuc3R1ZWNrIGIvZG9jL2hlbHAvZ2VzZWxsZW5zdHVlY2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU5ODBiYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9oZWxwL2dlc2VsbGVuc3R1ZWNrCkBAIC0wLDAgKzEsNzYgQEAKKworR0VTRUxMRU5TVFVFQ0sKKz09PT09PT09PT09PT09CisKKyAgICAgIEltIE1vcmdlbkdyYXVlbiBtdXNzdCBEdSBhbHMgSnVuZ21hZ2llciBlcnN0IGVpbiBHZXNlbGxlbnN0dWVjaworICAgICAgYWJsaWVmZXJuLCBiZXZvciBEdSB2b24gZGVuIHp1c3RhZW5kaWdlbiBFcnptYWdpZXJuIHp1bSBWb2xsbWFnaWVyCisgICAgICBiZWZvZXJkZXJ0IHdpcnN0LiBCaXMgZGFoaW4gYmlzdCBEdSBub2NoIExlaHJsaW5nIHVuZCBoYXN0IG51ciBlaW4tCisgICAgICBnZXNjaHJhZW5rdGUgTGVzZXJlY2h0ZS4KKworICAgICAgRGllc2UgRWluc2NocmFlbmt1bmcgZGVyIExlc2VyZWNodGUgc29sbCBEaWNoIGtlaW5lc2ZhbGxzIGJlaSBEZWluZXIKKyAgICAgIEFyYmVpdCBiZWhpbmRlcm4gLSB3ZW5uIER1IEZyYWdlbiB6dXIgUHJvZ3JhbW1pZXJ1bmcgaGFzdCwgZGllIGR1cmNoCisgICAgICBkaWUgQmVpc3BpZWxlIGltIFZlcnplaWNobmlzICcvZG9jJyBuaWNodCBiZWFudHdvcnRldCB3ZXJkZW4sIHNvCisgICAgICBrYW5uc3QgRHUgRGljaCBqZWRlcnplaXQgYW4gRGVpbmVuIFNwb25zb3Igd2VuZGVuLCB1bSB3ZWl0ZXJlCisgICAgICBCZWlzcGllbC1EYXRlaWVuIHp1IGJla29tbWVuLgorCisgICAgICBCZWkgZGVyIEdlc3RhbHR1bmcgRGVpbmVzIEdlc2VsbGVuc3R1ZWNrZXMga2FubnN0IER1IERlaW5lciBQaGFudGFzaWUKKyAgICAgIHZvbGxrb21tZW4gZnJlaWVuIExhdWYgbGFzc2VuLCBFcyBnaWJ0IGZ1ZXIgZGFzIEdlc2VsbGVuc3R1ZWNrIGltIE1HIAorICAgICAga2VpbmUgZmVzdGVuIFJlZ2VsbiB3aWUgIm1pbmRlc3RlbnMgMjAgUmFldW1lIHVuZCBmdWVuZiBOUENzIi4gRGVpbiAKKyAgICAgIEdlc2VsbGVuc3R1ZWNrIHNvbGx0ZSBqZWRvY2ggZXR3YXMgbmV1ZXMgc2VpbiB1bmQga2VpbmUgVWViZXJhcmJlaXR1bmcKKyAgICAgIHZvbiBiZXN0ZWhlbmRlbSBDb2RlLCB3ZWlsIGVzIExQQy1BbmZhZW5nZXJuIGVyZmFocnVuZ3NnZW1hZXNzCisgICAgICBzY2h3ZXJlciBmYWVsbHQsIHNpY2ggaW4gZnJlbWRlbiBDb2RlIGVpbnp1bGVzZW4uIEF1c3NlcmRlbSBzb2xsCisgICAgICBqYSBrbGFyIGVya2VubmJhciBzZWluLCBkYXNzIGRhcyBOZXVlIHRhdHNhZWNobGljaCBrb21wbGV0dCB2b24gRGlyCisgICAgICBzZWxic3Qgc3RhbW10LgorCisgICAgICBFaW4ga2xlaW5lciBQdW5rdCBzZWkgYWxzIERlbmthbnN0b3NzIGVyd2FlaG50OiBXaWUgd2FlcmUgZXMsIHdlbm4gCisgICAgICBEdSBldHdhcyBmdWVyIEFuZmFlbmdlciBzY2hyZWlic3QgdW5kIG5pY2h0IGRhcyB4LXRlIFN1cGVyLUR1cGVyIAorICAgICAgU2VoZXItVGVhbSBNZXR6ZWxnZWJpZXQ/IFZlcnN1Y2hlIGVpbiBHZWJpZXQgenUgc2NocmVpYmVuLCBhbiBkZW0gCisgICAgICB2aWVsZSBTcGllbGVyIGlocmUgRnJldWRlIGhhYmVuIGtvZW5uZW4gdW5kIG5pY2h0IG51ciBkaWUgc2VociBob2hlbiAKKyAgICAgIFNlaGVyLiAKKworICAgICAgR2VuYXVzbyBndXQga2FubnN0IER1IGVpbmUgbmV1ZSBRdWVzdCBwcm9ncmFtbWllcmVuIG9kZXIgKGdlcmFkZSBhdWNoCisgICAgICBpbiBUZWFtYXJiZWl0KSBlaW5lIG5ldWUgR2lsZGUuIExldHp0ZXJlcyBpc3QgYWxsZXJkaW5ncyBuaWNodCBmdWVyCisgICAgICBMUEMtQW5mYWVuZ2VyIHp1IGVtcGZlaGxlbi4gRXMgbXVzcyBuaWNodG1hbCB1bmJlZGluZ3QgZWluICJTdGFuZGFyZC0KKyAgICAgIEdlc2VsbGVuc3R1ZWNrIiBzZWluLiAKKworICAgICAgRGllIEVyem1hZ2llciBzaW5kIGF1Y2ggYW5kZXJlbiBoaWVyIG5pY2h0IGF1ZmdlZnVlaHJ0ZW4gSWRlZW4gaW1tZXIgCisgICAgICBhdWZnZXNjaGxvc3NlbiBnZWdlbnVlYmVyIC0gc3ByaWNoIHNpZSBlaW5mYWNoIGVpbm1hbCBhbiB1bmQgZXJ6YWVobGUsCisgICAgICB3YXMgRHUgc28gYW4gVm9yc3RlbGx1bmdlbiBkYXZvbiBoYXN0LCB3YXMgRHUgaW0gTW9yZ2VuR3JhdWVuIAorICAgICAgcHJvZ3JhbW1pZXJlbiBtb2VjaHRlc3QuICAgICAgICAKKyAKKyAgICAgIEJldm9yIER1IERpY2ggYW4gZGFzIFByb2dyYW1taWVyZW4gYmVnaWJzdCwgc29sbHRlc3QgRHUgZGFzIEtvbnplcHQKKyAgICAgIGZ1ZXIgRGVpbiBHZXNlbGxlbnN0dWVjayBtaXQgZWluZW0gZGVyIHp1c3RhZW5kaWdlbiBFcnptYWdpZXIKKyAgICAgIGFia2xhZXJlbiwgdW0gc2ljaGVyenVnZWhlbiwgZGFzcyBlcyBhbHMgR2VzZWxsZW5zdHVlY2sgYXVzcmVpY2h0LgorICAgICAgCisgICAgICBVbSBEZWluIEdlc2VsbGVuc3R1ZWNrIGJld2VydGVuIHp1IGxhc3Nlbiwgd2VuZGVzdCBEdSBEaWNoIGJpdHRlIGFuCisgICAgICBlaW5lbiBkZXIgaW4gZGVyIEhpbGZlIGFscyB6dXN0YWVuZGlnIGFuZ2VnZWJlbmVuIEVyem1hZ2llci4KKyAgICAgIER1IGthbm5zdCBhdWNoIGdlcm5lIGRhbmFjaCBmcmFnZW4sIHdhcyB2b24gZGVuIGFuZGVyZW4gSnVuZ21hZ2llcm4gCisgICAgICBiaXNoZXIgc28gYW4gR2VzZWxsZW5zdHVlY2tlbiBhYmdlZ2ViZW4gd3VyZGUsIHVtIERpciBlaW5lbiBrbGVpbmVuIAorICAgICAgVWViZXJibGljayB6dSB2ZXJzY2hhZmZlbiwgd2FzIHVuZ2VmYWVociB2b24gRGlyIGVyd2FydGV0IHdpcmQuCisKKyAgICAgIEZlc3RlIEdyZW56d2VydGUgdm9yenVnZWJlbiwgYWIgd2FubiBlaW4gR2VzZWxsZW5zdHVlY2sgYXVzcmVpY2hlbmQgCisgICAgICBpc3QsIGthbm4gbmljaHQgaW0gU2lubmUgZGllc2VyIFJlZ2VsdW5nIHNlaW4uIERhaGVyIGdpYnQgZXMgYW4gZGllc2VyCisgICAgICBTdGVsbGUgYXVjaCBudXIgZWluaWdlIHdlbmlnZSBncm9iZSBSaWNodGxpbmllbjoKKworICAgICAgLSBlaW4gR2VzZWxsZW5zdHVlY2sgc29sbHRlIGVpbmUgQmVyZWljaGVydW5nIGZ1ZXIgZGFzIE1vcmdlbkdyYXVlbgorICAgICAgICBzZWluIC0gYWxzbyBrZWluIGxpZWJsb3MgaGluZ2VrbGF0c2NodGVzIEdlYmlldCwgYmVpIGRlbSBtYW4gc29mb3J0CisgICAgICAgIG1lcmt0LCBkYXNzIGVzIG51ciB6dXIgQmVmb2VyZGVydW5nIHp1bSBWb2xsbWFnaWVyIHRhdWdlbiBzb2xsdGUuCisKKyAgICAgIC0gbWFuIHNvbGx0ZSBkZW0gR2VzZWxsZW5zdHVlY2sgYW5zZWhlbiBrb2VubmVuLCBkYXNzIGVpbmlnZXMgYW4KKyAgICAgICAgQXJiZWl0IGRhaGludGVyIHN0ZWNrdCwgdW5kIGRhc3MgZXMgbmljaHQgIm1hbCBlYmVuIiBhbiBlaW5lbQorICAgICAgICBXb2NoZW5lbmRlIHp1c2FtbWVuZ2VzdHJpY2t0IHd1cmRlLgorCisgICAgICAtIG1pdHRsZXJ3ZWlsZSBnaWJ0IGVzIGltIE1vcmdlbkdyYXVlbiBnZXdpc3NlIFF1YWxpdGFldHMtU3RhbmRhcmRzLAorICAgICAgICB3YXMgbmV1ZSBHZWJpZXRlIGFuZ2VodC4gRGF6dSBnZWhvZXJ0IHUuYS4sIGRhc3MgZGllIFJhZXVtZSBuaWNodAorICAgICAgICBhbGxlIGdsZWljaCBhdXNzZWhlbiAoQ29weSZQYXN0ZSBsYWVzc3QgZ3J1ZXNzZW4pLCBnZXdpc3NlCisgICAgICAgIFN0YW5kYXJkLURldGFpbHMgdWViZXJhbGwgYmVzY2hyaWViZW4gc2luZCBldGMuIERpZXNlciBTdGFuZGFyZCBnaWx0CisgICAgICAgIHNlbGJzdHZlcnN0YWVuZGxpY2ggYXVjaCBmdWVyIEdlc2VsbGVuc3R1ZWNrZS4KKworICAgICAgQmVpIHdlaXRlcmdlaGVuZGVuIEZyYWdlbiB3ZW5kZSBEaWNoIGVpbmZhY2ggYW4gZWluZW4gZGVyIGluIGRlciBIaWxmZSAKKyAgICAgIGFscyBBbnNwcmVjaHBhcnRuZXIgYW5nZWdlYmVuZW4gRXJ6bWFnaWVyLgorCisgU0lFSEUgQVVDSDoKKyAgICBlcnptYWdpZXIsIHJlZ2lvbnNtYWdpZXIsIG1hZ2llcgorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBNb24sIDI4LiBBVUcgMjAwMCwgMjI6MzA6MDAgdm9uIFdpbS4KZGlmZiAtLWdpdCBhL2RvYy9oZWxwL2dpZnQgYi9kb2MvaGVscC9naWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2OTllYWUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaGVscC9naWZ0CkBAIC0wLDAgKzEsMjggQEAKK0dpZnQvS3JhbmtoZWl0L0ZsdWVjaGUKKz09PT09PT09PT09PT09PT09PT09PT0KKworICAgIEVzIGdpYnQgaW0gTW9yZ2VuZ3JhdWVuIHZlcnNjaGllZGVuZSBHaWZ0ZSwgS3JhbmtoZWl0ZW4gdW5kIEZsdWVjaGUsCisgICAgZGllIGVpbmVtIGRhcyBMZWJlbiBzY2h3ZXJlciBtYWNoZW4uCisKKyAgICBLcmFua2hlaXRlbiB1bmQgR2lmdGUgYmVlaW5mbHVzc2VuIGZhc3QgaW1tZXIgIm51ciIgTGViZW5zLSB1bmQKKyAgICBLb256ZW50cmF0aW9uc3B1bmt0ZS4gRmx1ZWNoZSBoYWJlbiBnYW56IGFuZGVyZSBvZGVyIHdlaXRlcmdlaGVuZGUKKyAgICBXaXJrdW5nZW4uCisKKyAgICBEYWJlaSBuaW1tdCBtYW4gR2lmdGUgbWVpc3Qgc2VsYnN0ICh1bmQgb2Z0IGZyZWl3aWxsaWcpIGF1ZiwKKyAgICBLcmFua2hlaXRlbiB1bmQgRmx1ZWNoZSBqZWRvY2ggdmVycGFzc3QgZWluZW0gaXJnZW5kd2VyIG9kZXIKKyAgICBpcmdlbmR3YXMgb2huZSBlaW5lbiB6dSBmcmFnZW4uCisKKyAgICBEaWUgZ2VuZXJlbGxlIFZlcmdpZnR1bmcgd2lyZCBlaW5lbSBkdXJjaCBNZWxkdW5nZW4gdW5kIGRpZSBBbnplaWdlCisgICAgdm9uICJpbmZvIiBiZWthbm50IGdlbWFjaHQuIERpZSBXaXJrdW5nIGlzdCwgZGFzIG1hbiBuaWNodCBtZWhyCisgICAgb2huZSBUYW5rZW4gaGVpbHQgYmlzIGhpbiB6dW0gTGViZW5zcHVua3R2ZXJsdXN0LiBFaW5pZ2UgSGVpbGVyIHVuZAorICAgIEdpbGRlbiBrb2VubmVuIGRpZSBWZXJnaWZ0dW5nIGxpbmRlcm4gdW5kIGF1ZmhlYmVuLgorCisgICAgRGVyIGVpbmZhY2hlIEZsdWNoIHdpcmt0IGF1ZiBXYWZmZW4gdW5kIFJ1ZXN0dW5nZW4uIERpZXNlIHNpbmQgZGFubgorICAgIG5pY2h0IG1laHIgd2Vnc3RlY2tiYXIgYnp3LiBhdXN6aWVoYmFyLiBBdWNoIGhpZXIga29lbm5lbiBIZWlsZXIgdW5kCisgICAgR2lsZGVuIGhlbGZlbi4KKworIFNJRUhFIEFVQ0g6CisgICAgc3RlcmJlbgorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICAxOC4gTWFlcnogMjAwNCBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL2hlbHAvZ2lsZGVuIGIvZG9jL2hlbHAvZ2lsZGVuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0N2Y3YTMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaGVscC9naWxkZW4KQEAgLTAsMCArMSw1NSBAQAorRGllIEdpbGRlbgorPT09PT09PT09PQorCisgICAgRXMgZ2lidCBpbSBNb3JnZW5ncmF1ZW4gbWVocmVyZSBHaWxkZW4sIGluIGRlbmVuIG1hbiBlaW5pZ2UgYmVzb25kZXJlCisgICAgRmFlaGlna2VpdGVuIGVyd2VyYmVuIGthbm4uIE1hbiBrYW5uIGplZG9jaCBudXIgaW4gZWluZXIgR2lsZGUKKyAgICBnbGVpY2h6ZWl0aWcgc2VpbiB1bmQgaGF0IGF1Y2ggaW1tZXIgbnVyIGRpZSBGYWVoaWdrZWl0ZW4gZGVyIEdpbGRlLCBpbgorICAgIGRlciBtYW4gbW9tZW50YW4gaXN0LiBXZXIgbWl0IHNlaW5lciBHaWxkZSBuaWNodCB6dWZyaWVkZW4gaXN0LCBrYW5uCisgICAgbmF0dWVybGljaCBhdWNoIGplZGVyemVpdCB3aWVkZXIgYXVzdHJldGVuLCBoYXQgZGFubiwgZmFsbHMgZXIgZXJuZXV0CisgICAgZWludHJpdHQsIGplZG9jaCBudXIgbm9jaCBlaW5lbiBUZWlsIGRlciBmcnVlaGVyIGVyd29yYmVuZW4gRmFlaGlna2VpdGVuLgorCisgICAgSmVkZXIgaXN0IGJlaW0gU3RhcnQgc2Nob24gaW4gZWluZXIgR2lsZGU6IE1lbnNjaGVuLCBIb2JiaXRzIHVuZAorICAgIFp3ZXJnZSBpbiBkZXIgQWJlbnRldXJlcmdpbGRlLCBGZWxpbmVuIGJlaSBkZW4gS2F0emVua3JpZWdlcm4sIEVsZmVuIGluIAorICAgIGRlciBHaWxkZSBkZXIgV2lwZmVsbGFldWZlciwgT3JrcyBpbiBkZXIgR2lsZGUgZGVyIFVydWtoYWkgdW5kIAorICAgIER1bmtlbGVsZmVuIGluIGRlciBEdW5rZWxlbGZlbmdpbGRlLiAKKworICAgIERpZSBGYWVoaWdrZWl0ZW4gc2VpbmVyIEFuZmFuZ3NnaWxkZSB2ZXJsaWVydCBtYW4gbmljaHQsIHdlbm4gbWFuIGluIAorICAgIGVpbmVyIGFuZGVyZW4gR2lsZGUgd2FyIHVuZCBkb3J0IGF1c2dldHJldGVuIGlzdC4KKworICAgIER1bmtlbGVsZmVuIHNpbmQgYmVpIGRlciBBdXN3YWhsIHN0YXJrIGVpbmdlc2NocmFlbmt0LCBkYSBzaWUgaW4gZGVuCisgICAgbWVpc3RlbiBHaWxkZW4gbmljaHQgYWt6ZXB0aWVydCB3ZXJkZW4gdW5kIGF1Y2ggbnVyIGlocmUgR2lsZGUgaWhuZW4KKyAgICBkZW4gbGViZW5zbm90d2VuZGlnZW4gU2NodXR6IGJpZXRldCwgamVkb2NoIGtvZW5uZW4gc2llIHNpY2ggYXVmCisgICAgbWVocmVyZSBad2VpZ2Ugc3BlemlhbGlzaWVyZW4uCisKKyAgICBNb21lbnRhbiBnaWJ0IGVzIGZvbGdlbmRlIEdpbGRlbjoKKworICAgICAqIEFiZW50ZXVyZXJnaWxkZSwgaW4gUG9ydCBWYWluLCB2b24gQm9pbmcKKyAgICAgKiBXaXBmZWxsYWV1ZmVyLCBpbSBFbGZlbmRvcmYsIHZvbiBIdW1uaQorICAgICAqIEdpbGRlIGRlciBLYXJhdGVrYWVtcGZlciwgaW4gZGVyIFN0YWR0IFhpYW4gaW0gRmVybmVuIFdlc3Rlbiwgdm9uCisgICAgICAgUm9jaHVzCisgICAgICogS3JpZWdlciBkZXMgQ2hhb3MsIGluIGRlciBFaXN3dWVzdGUsIHZvbiBaYXJkb3oKKyAgICAgKiBBa2FkZW1pZSBkZXIgZ2Vpc3RpZ2VuIEtyYWZ0IHp1IFRhcmFtaXMsIHZvbiBTaWx2YW5hCisgICAgICogRGVyIEhlaWxpZ2UgT3JkZW4sIGluIERqZWxpYmVieSwgdm9uIFdhcmdvbgorICAgICAqIEJpZXJzY2h1ZXR0bGVyZ2lsZGUsIGF1ZiBTaGFreSBJc2xhbmQsIHZvbiBTaGFrZWRiZWVyCisgICAgICogS2FlbXBmZXJnaWxkZSwgYXVmIEFraGFyIE50aCd0YXIsIHZvbiBaYXJkb3osIFRvZXRlciB1bmQgQmVuZGVpZ2lkCisgICAgICogRGllIEthdHplbmtyaWVnZXIsIGluIGRlciBEc2NodW5nZWxzdGFkdCBLYXR6bWFuZHUsIHZvbiBQYXJhY2Vsc3VzCisgICAgICogRGllIFRhbmppYW4sIGltIEVpc3Rhbm5lbndhbGQsIHZvbiBQYXJhY2Vsc3VzCisgICAgICogRHVua2VsZWxmZW4sIGluIGRlciBIb2VobGVuc3RhZHQgWnplcmVuenplbiwgdm9uIFBhZHJlaWMKKyAgICAgKiBVcnVraGFpLCB2b24gTW9yZ290aCB1bmQgQnVnZml4CisgICAgICogV2Vyd29lbGZlLCB2b24gSHVtbmkKKworICAgIEZvbGdlbmRlIEdpbGRlbiBzaW5kIGRlcnplaXQgbm9jaCBpbiBFbnR3aWNrbHVuZywgZGVyIFplaXRwdW5rdCBpaHJlcgorICAgIEZlcnRpZ3N0ZWxsdW5nIGlzdCBhYmVyIG5vY2ggdW5nZXdpc3M6CisKKyAgICAgKiBNYWd1c2dpbGRlLCB2b24gQXJrCisgCisgU0lFSEUgQVVDSDoKKyAgICBhYmVudGV1cmVyLCBiaWVyc2NodWV0dGxlciwgY2hhb3MsIGthZW1wZmVyLCBrYXJhdGUsIGthdHplbmtyaWVnZXIsCisgICAga2xlcnVzLCB6YXViZXJlciwgdGFuamlhbiwgZHVua2VsZWxmZW4sIHdhZmZlbmZlcnRpZ2tlaXRlbiwKKyAgICBnaWxkZW5tYWdpZXIsIHdpcGZlbGxhZXVmZXIsIGFsdGdpbGRlbgorIAorIExFVFpURSBBRU5ERVJVTkc6IAorICAgIDIwMTEtMTEtMTMgdm9uIEh1bW5pCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvZG9jL2hlbHAvZ2lsZGVubWFnaWVyIGIvZG9jL2hlbHAvZ2lsZGVubWFnaWVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZDNmN2EKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaGVscC9naWxkZW5tYWdpZXIKQEAgLTAsMCArMSwzNyBAQAorCitEaWUgR2lsZGVubWFnaWVyIGRlcyBNb3JnZW5HcmF1ZW5zCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0plZGUgR2lsZGUgd2lyZCB2b24gZWluIG9kZXIgbWVocmVyZW4gTWFnaWVybiBiZXRyZXV0LCBkaWUgZGllIEdpbGRlIHdhcnRlbgordW5kIGVyd2VpdGVybi4gU2llIHNpbmQgZGllIEFuc3ByZWNocGFydG5lciwgd2VubiBlcyBQcm9ibGVtZSBpbm5lcmhhbGIKK2VpbmVyIGRpZXNlciBHaWxkZW4gZ2lidC4KKworSGllciBhbHNvIGFsbGUgR2lsZGVuIGRlcyBNb3JnZW5ncmF1ZW5zIG1pdCBpaHJlbiBHaWxkZW5tYWdpZXJuOgorKE1BIC0gTWl0YXJiZWl0ZXIpCisKKyhFaW5pZ2UgZGVyIEdpbGRlbm1hZ2llciBzaW5kIGRlcnplaXQgZWluIHdlbmlnIGluYWt0aXZlciBhbHMgc29uc3QuCitEaWVzZSBzaW5kIG1pdCBlaW5lbSAsLGknJyBnZWtlbm56ZWljaG5ldC4gSW4gZGllc2VtIEZhbGwgZ2lidCBlcyBkZXJ6ZWl0CituaWVtYW5kZW4sIGRlciBkaWUgR2lsZGUgd2VpdGVyZW50d2lja2VsdC4gRnVlciBkcmluZ2VuZGUgRnJhZ2VuIGthbm5zdCBEdQorRGljaCBkYW5uIGFuIGRlbiBFcnptYWdpZXIgZnVlciBHaWxkZW4sIGRlcnplaXQgSHVtbmksIHdlbmRlbi4pCisKKyAgQWJlbnRldXJlcmdpbGRlICAgICAgICAgICAgICAgLSBCb2luZworICBHaWxkZSBkZXIgS2FyYXRla2FlbXBmZXIgICAgICAtIEh1bW5pCisgIEtyaWVnZXIgZGVzIENoYW9zICAgICAgICAgICAgIC0gRW5ub3ggKGkpLCBNdXBmZWwgKGkpLCBCdWdmaXgKKyAgQWthZGVtaWUgZGVyIGdlaXN0aWdlbiBLcmFmdCAgLSBDaGFnYWxsCisgIERlciBIZWlsaWdlIE9yZGVuICAgICAgICAgICAgIC0gV2FyZ29uIChpKSwgR2xvaW5zb24KKyAgQmllcnNjaHVldHRsZXJnaWxkZSAgICAgICAgICAgLSBCaWVsZWZlbGQgKGkpLCBTaGFrZWRiZWVyKGkpLCBSYXNjaGF1YSAoaSkKKyAgS2FlbXBmZXJnaWxkZSAgICAgICAgICAgICAgICAgLSBHYWJ5bG9uCisgIERpZSBLYXR6ZW5rcmllZ2VyICAgICAgICAgICAgIC0gQmFtYmkKKyAgRGllIFRhbmppYW4gICAgICAgICAgICAgICAgICAgLSBDaGFnYWxsLCBOaWJlbCAoaSkKKyAgRHVua2VsZWxmZW4gICAgICAgICAgICAgICAgICAgLSBBbWFyeWxsaXMoKiksIFBhZHJlaWMgKGkpCisgIFVydWstSGFpICAgICAgICAgICAgICAgICAgICAgIC0gQnVnZml4LCBSaG92YW4sIE1vcmdvdGggKGkpCisgIFdpcGZlbGxhZXVmZXIgICAgICAgICAgICAgICAgIC0gSHVtbmkKKyAgV2Vyd29lbGZlICAgICAgICAgICAgICAgICAgICAgLSBIdW1uaQorCisoKikgQW1hcnlsbGlzIGhhdCBmdWVyIGRpZSBHaWxkZSBkZXJ6ZWl0IHdlbmlnIFplaXQuCisoaSkgRGllc2VyIE1hZ2llciBpc3QgenVyIFplaXQgaW5ha3Rpdi4KKworU0lFSEUgQVVDSDoKKyAgICAgR2lsZGVuLCBNYWdpZXIsIFJlZ2lvbmVuLCBSZWdpb25zbWFnaWVyLCBFcnptYWdpZXIKKworRnJlLCAwNS4gSnVuaSAyMDE1LCAyMjo1MjowMCB2b24gQm9pbmcKZGlmZiAtLWdpdCBhL2RvYy9oZWxwL2dvdHQgYi9kb2MvaGVscC9nb3R0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1Yzg4ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaGVscC9nb3R0CkBAIC0wLDAgKzEsMjYgQEAKKworR29ldHRlciBpbSBNb3JnZW5ncmF1ZW4KKz09PT09PT09PT09PT09PT09PT09PT09CisKKyBCRVNDSFJFSUJVTkc6CisgICAgIEVzIGdpYnQgZWluaWdlLCB3ZW5pZ2UgR29ldHRlciBpbSBNb3JnZW5ncmF1ZW4uIFdpZSBiZWkgYWxsZW4gR29ldHRlcm4KKyAgICAgZ2lsdCBlcyBpbiBkZXIgQW5iZXR1bmcgZGVzIEpvZiwgUnVtYXRhIHVuZCBab29rIGVyc3RlbnMgamV3ZWlscyBkZW4KKyAgICAgcmljaHRpZ2VuIEFuc3ByZWNocGFydG5lciB1bmQgendlaXRlbnMgZGllIHJpY2h0aWdlIEJhbGFuY2Ugendpc2NoZW4KKyAgICAgU2NobGVpbWVyZWkgdW5kIEdvdHRlc2JlbGFlc3RpZ3VuZyB6dSBmaW5kZW4uIEtsZWluZSBPcGZlcmdhYmVuIHdpZQorICAgICBCaWVycmVpY2h1bmdlbiBhdWYgUGFydGllcyBzaW5kIG5hdHVlcmxpY2ggZ2VybiBnZXNlaGVuLgorCisgICAgIFVuc2VyZSBHb2V0dGVyIHpvZ2VuIGVpbiBzY2h3ZXJlcyBMb3MgLSB3byBkaWUgRXJ6bWFnaWVyIEFyYmVpdAorICAgICBlcmxlZGlnZW4sIHRyYWdlbiBkaWUgR29ldHRlciBkaWUgc2Nod2VyZSBMYXN0IGRlciBWZXJhbnR3b3J0dW5nLiBTaWUKKyAgICAgbXVlc3NlbiBkYWZ1ZXIgc29yZ2VuLCBkYXNzIGRhcyByZWNodGUgTWFzcyBhbiBOZWlkLCBNaXNzZ3Vuc3QsIEdpZXIgdW5kCisgICAgIFZlcnN0aW1tdW5nIHp3aXNjaGVuIFNwaWVsZXJuLCBTZWhlcm4sIE1hZ2llcm4sIEVyem1hZ2llcm4gdW5kIHNvbnN0aWdlbgorICAgICBTcGllbHRlaWxuZWhtZXJuIGltbWVyIGdld2FocnQgYmxlaWJ0LgorCisgQkVNRVJLVU5HRU46CisgICAgIEVzIGdpYnQgZWluZW4genVydWVja2dldHJldGVuZW4gR290dCwgQm9pbmcuIERpZXNlciB3aXJkIGltbWVyIG5vY2gKKyAgICAgdm9uIGVpbmlnZW4gVW5nbGFldWJpZ2VuIGluIGJsdXRpZ2VuIFJpdHVhbGVuIGluIGRlciBTU1AgdmVyZWhydC4KKworIFNJRUhFIEFVQ0g6CisgICAgICAgIGVyem1hZ2llciwgd2lsbGt1ZXIsIHBhcnRpZXMKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgMjIuIE5vdmVtYmVyIDIwMDQgTXVhZGliCmRpZmYgLS1naXQgYS9kb2MvaGVscC9oYXJkY29yZSBiL2RvYy9oZWxwL2hhcmRjb3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhYzJiOTgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaGVscC9oYXJkY29yZQpAQCAtMCwwICsxLDI5IEBACitEZXIgSGFyZGNvcmVtb2R1cworPT09PT09PT09PT09PT09PT09PT09PQorCisgICAgRW50c2NoZWlkZXQgc2ljaCBkZXIgU3BpZWxlciBmdWVyIG51ciBlaW4gZWluemlnZXMgTGViZW4sIHNvIAorICAgIHNwaWVsdCBlciBpbSBIYXJkY29yZW1vZHVzLgorCisgICAgRGllcyBiZWRldXRldCwgZGFzcyBkZXIgU3BpZWxlciBuYWNoIHNlaW5lbSBlcnN0ZW4gVG9kIG5pY2h0IG1laHIKKyAgICBha3RpdiBhbSBTcGllbCB0ZWlsbmVobWVuIGthbm4uIExlZGlnbGljaCBrb21tdW5pa2F0aXZlIE1pdHRlbCB3aWUKKyAgICBkYXMgUnVmZW4gb2RlciBkaWUgRWJlbmVuIHN0ZWhlbiBpaG0gbm9jaCB6dXIgVmVyZnVlZ3VuZy4KKworICAgIERpZXNlciBNb2R1cyBzb2xsdGUgbnVyIHZvbiBlcmZhaHJlbmVuIFNwaWVsZXJuIGdld2FlaGx0IHdlcmRlbi4KKworICAgIERpZSBIYXJkY29yZXNwaWVsZXIgdW50ZXJsaWVnZW4gZGVuIFJlZ2VsbiB3aWUgZ2FueiBub3JtYWxlIAorICAgIFNwaWVsZXIuCisKKyAgICBXZW5uIGVpbiBTcGllbGVyIHd1ZW5zY2h0LCBpbSBIYXJkY29yZW1vZHVzIHp1IHNwaWVsZW4sIGthbm4gZXIvc2llIHZvcgorICAgIEVycmVpY2hlbiBkZXIgendlaXRlbiBTdHVmZSAoZC5oLiBiZXZvciBtYW4gZGFzIGVyc3RlIE1hbCBlcmhvZWhlbiBrYW5uKQorICAgIHVuZCB2b3IgZGVtIGVyc3RlbiBUb2QgZWluZW4gRXJ6bWFnaWVyIGFuc3ByZWNoZW4sIHdlbGNoZXIgZGVuIEhDLU1vZHVzCisgICAgYWt0aXZpZXJ0LiBEaWVzIGlzdCBlbmRndWVsdGlnIHVuZCB3aXJkIG5pY2h0IHJ1ZWNrZ2FlbmdpZyBnZW1hY2h0LgorCisgICAgRWluZSBXYXJudW5nOiBFaW4gZ2VzdG9yYmVuZXIgU3BpZWxlciB3aXJkIHVudGVyIGdhciBrZWluZW4gVW1zdGFlbmRlbgorICAgIHdpZWRlciBpbiBkYXMgTGViZW4genVydWVja2dlaG9sdC4KKworIFNJRUhFIEFVQ0g6CisgICAgcnVmZSwgZWJlbmVuLCB0b2QsIHJlZ2VsbiAKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgMjIuOC4yMDExLCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9oZWxwL2hlaWx1bmcgYi9kb2MvaGVscC9oZWlsdW5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyOWY4ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaGVscC9oZWlsdW5nCkBAIC0wLDAgKzEsNDAgQEAKKworRGllIEhlaWx1bmcKKz09PT09PT09PT09CisKKyAgICAgSW0gS2FtcGYgb2RlciBkdXJjaCBHaWZ0IHZlcmxpZXJ0IG1hbiBtZWhyIExlYmVuc3B1bmt0ZSBhbHMgZWluZW0KKyAgICAgbGllYiBzZWluIGthbm4uIFphdWJlcmVpIHZlcmJyYXVjaHQgenVzYWV0emxpY2ggS29uemVudHJhdGlvbi4KKworICAgICBFcyBnaWJ0IG1laHJlcmUgV2VnZSB1bSBzaWNoIHp1IGhlaWxlbjoKKworICAgICAgTWl0IEdlZHVsZDogSW0gSGVyenNjaGxhZyBoZWlsdCBlaW4gU3BpZWxlciAtIHNvIGVyIG5pY2h0IHZlcmdpZnRldAorICAgICAgICAgICAgICAgICAgaXN0IC0gbGFuZ3NhbSBzaWNoIHNlbGJzdC4gRGFzIGlzdCBpbW1lciBhdWNoIHZvbiBkZXIKKyAgICAgICAgICAgICAgICAgIFVtZ2VidW5nIHVuZCBkZXIgUmFzc2UgZGVzIFNwaWVsZXJzIGFiaGFlbmdpZy4KKworICAgICAgSW4gS25laXBlbjogTWFuIGthbm4gc2ljaCBkdXJjaCBWZXJ6ZWhyIHZvbiBTcGVpc2VuIG9kZXIgR2V0cmFlbmtlbgorICAgICAgICAgICAgICAgICAgcmFzY2hlciBzZWxic3QgaGVpbGVuLiBEYWJlaSB3aXJkIGVpbmVtIGRpZXNlIEhlaWx1bmcKKyAgICAgICAgICAgICAgICAgIGlubmVyaGFsYiBkZXMgSGVyenNjaGxhZ2VzIGxhbmdzYW0genV0ZWlsLgorICAgICAgICAgICAgICAgICAgV2ljaHRpZyBpc3QgaGllcmJlaSB2b3IgYWxsZW0sIGRhc3MgbWFuIG51ciBzb3ZpZWwKKyAgICAgICAgICAgICAgICAgIEhlaWx1bmdzcG90ZW50aWFsIG1pdCBlaW5lbSBNYWwgZXNzZW4gb2RlciB0cmlua2VuIGthbm4sCisgICAgICAgICAgICAgICAgICB3aWUgbWFuIG1heGltYWxlIExlYmVuc3B1bmt0ZS9Lb256ZW50cmF0aW9uc3B1bmt0ZSBoYXQuCisgICAgICAgICAgICAgICAgICBCZXNpdHp0IG1hbiBhbHNvIG1heGltYWwgOTAgTGViZW5zcHVua3RlLCBzbyBrYW5uIG1hbiBpbgorICAgICAgICAgICAgICAgICAgZWluZW0gTW9tZW50IG51ciBmdWVyIDkwIExlYmVuc3B1bmt0ZSBlc3NlbiBvZGVyIHRyaW5rZW4sCisgICAgICAgICAgICAgICAgICBhbGxlIGRhcnVlYmVyaGluYXVzZ2VoZW5kZSBIZWlsdW5nIGRlciBTcGVpc2UgZ2VodAorICAgICAgICAgICAgICAgICAgdmVybG9yZW4uCisgICAgICAgICAgICAgICAgICBCZWkgYWt0dWVsbGVuIDIwIExQIHdhZXJlIGVzIGFsc28gc2lubnZvbGwsIHp3ZWkgR2V0cmFlbmtlCisgICAgICAgICAgICAgICAgICBhIDM1IExlYmVuc3B1bmt0ZSB6dSBzaWNoIHp1IG5laG1lbi4gVm9yIGVpbmVtIEthbXBmIGthbm4KKyAgICAgICAgICAgICAgICAgIG1hbiBzaWNoIGRhZHVyY2ggdWVicmlnZW5zIGVpbmVuIHp1c2FldHpsaWNoZW4gUHVmZmVyCisgICAgICAgICAgICAgICAgICB2ZXJzY2hhZmZlbiwgaW5kZW0gbWFuIDIgR2V0cmFlbmtlIGEgMzUgdW5kIDEgR2V0cmFlbmsgYQorICAgICAgICAgICAgICAgICAgMjAgTGViZW5zcHVua3RlIHp1IHNpY2ggbmltbXQuIERpZSAyMCBMUCB3ZXJkZW4gZWluZW0gZGFubgorICAgICAgICAgICAgICAgICAgYmVpIGV2ZW50dWVsbGVtIExQLVZlcmx1c3QgaW0gS2FtcGYgd2llZGVyIHp1Z2VmdWVocnQuCisKKyAgICAgIE1pdCBNYWdpZTogIFZpZWxlIE9ydGUgb2RlciBhdWNoIEdpbGRlbmFuZ2Vob2VyaWdlIGJlc3RpbW10ZXIgR2lsZGVuCisgICAgICAgICAgICAgICAgICBiZXNpdHplbiBzcGV6aWVsbGUgTWFnaWUsIGRpZSBlaW5lbSBlYmVuZmFsbHMgenUgSGVpbHVuZworICAgICAgICAgICAgICAgICAgdmVyaGVsZmVuIGthbm4uIERpZXNlIEhlaWx1bmcgaXN0IGVudHdlZGVyIHNvZm9ydGlnIG9kZXIKKyAgICAgICAgICAgICAgICAgIHVudGVybGllZ3QgZGVuIGdsZWljaGVuIFJlZ2VsbiB3aWUgZGllIEhlaWx1bmcgaW4gS25laXBlbi4KKworIFNJRUhFIEFVQ0g6CisgICAgIHRvZCwgbGViZW4sIGVzc2VuLCBrYW1wZiwgcmVwb3J0CisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgICAxNC4gTWFlcnogMjAwNCBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL2hlbHAvaXJjIGIvZG9jL2hlbHAvaXJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZThhNzEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaGVscC9pcmMKQEAgLTAsMCArMSwyMyBAQAorSVJDDQorPT09DQorDQorICAgICBEZXIgSVJDLUthbmFsIGRlcyBNb3JnZW5ncmF1ZW5zICgtI21nKSBpc3Qgdm9uIGF1c3NlbiB3aWUgZm9sZ3QNCisgICAgIHp1IGVycmVpY2hlbjoNCisgICAgIA0KKyAgICAgU2VydmVyOglpcmMuZnJlZW5ldC5kZQ0KKwkJaXJjLmZ1LWJlcmxpbi5kZQ0KKwkJLSBzaWVoZSBhdWNoIGh0dHA6Ly9pcmMuZnUtYmVybGluLmRlL2lyY21hcC5odG1sDQorICAgICBLYW5hbDoJbWcuZGUNCisNCisgICAgIEJlZmVobGU6ICAgVW0gYXVzIGRlbSBJUkMgenUgc2VoZW4sIHdlbGNoZSBTcGllbGVyIGRlbiBJUkMtDQorICAgICAgICAgICAgICAgIEthbmFsIGRlcyBNRyBudXR6ZW46DQorICAgICAgICAgICAgICAgIC9tc2cgW01HXSB3aG8gI21nLmRlDQorDQorICAgICAgICAgICAgICAgIFVtIHZvbSBNRyBoZXJhdXMgZGllIExpc3RlIGRlciBJQ1ItVXNlciB6dSBzZWhlbjoNCisgICAgICAgICAgICAgICAgLSNNRyBAd2hvDQorCQkJCQkJCQ0KKyBTSUVIRSBBVUNIOg0KKyAgICAga2FuYWVsZSwgd3d3DQorDQorIExFVFpURSBBZU5ERVJVTkc6DQorICAgIDMwLiBNYWVyeiAyMDA2IEdsb2luc29uDQpkaWZmIC0tZ2l0IGEvZG9jL2hlbHAva2FlbXBmZXIgYi9kb2MvaGVscC9rYWVtcGZlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTNhMmYwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2hlbHAva2FlbXBmZXIKQEAgLTAsMCArMSw3OSBAQAorCitEaWUgS2FlbXBmZXJnaWxkZQorLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIERpZSBLYWVtcGZlcmdpbGRlIGltIE1vcmdlbkdyYXVlbiBpc3QgZGVtIEJ1bmQgZGVyIFRydmVzIGFuZ2VzY2hsb3NzZW4uCisgICAgU2llIGhhdCBpaHJlbiBIYXVwdHNpdHogaW0gS29ydS1Uc2NoYWthci1TdHJ1diwgd2VsY2hlcyBpbSBOb3Jkb3N0ZW4KKyAgICBkZXIgSW5zZWwgIkFraGFyIE50aCdUYXIiIGdlbGVnZW4gaXN0LgorCisgICAgTWFuIGVybGVybnQgZG9ydCBkZW4gVW1nYW5nIG1pdCBkZW4gdmVyc2NoaWVkZW5lbiBXYWZmZW50eXBlbiwgd29iZWkgZGllCisgICAgbWF4aW1hbGUgRmFlaGlna2VpdCBhYmhhZW5naWcgdm9uIGRlciBSYXNzZSBpc3QuIEVzIGdpYnQ6CisKKyAgICAgKiBNZXNzZXIgdW5kIERvbGNoZSwKKyAgICAgKiBTY2h3ZXJ0ZXIsCisgICAgICogS2FtcGZzdGFlYmUsCisgICAgICogQWV4dGUgdW5kIEJlaWxlLAorICAgICAqIHN0dW1wZmUgSGllYndhZmZlbiB1bmQKKyAgICAgKiBTcGVlcmUgYnp3LiBTdGFuZ2Vud2FmZmVuLgorCisgICAgV2VpdGVyaGluIGdpYnQgZXMgbm9jaCBkZW4gYWxsZ2VtZWluZW4gVW1nYW5nIG1pdCBad2VpaGFuZHdhZmZlbi4KKworICAgIEVzIGdpYnQgdmVyc2NoaWVkZW5lIEthbXBmdGFrdGlrZW4gYnp3LiBUZWNobmlrZW4sIGRpZSBtYW4gaW0gS2FtcGYgamUKKyAgICBuYWNoIEdlZ25lciB3YWVobGVuIGthbm46CisKKyAgICAgKiBBbGxnZW1laW5lIFRha3RpayAoVmVyaGFlbHRuaXMgdm9uIE9mZmVuc2l2ZSB6dSBEZWZlbnNpdmUpLAorICAgICAqIGRpZSBSYXNlcmVpIHVuZAorICAgICAqIGRpZSBUZWNobmlrIGRlciBTY2hpbGRrcm9ldGUsIERyYWNoZSBvZGVyIFNjaGxhbmdlCisKKyAgICBCZXNvbmRlcmUgQWt0aW9uZW4gaW0gS2FtcGYgc2luZCB6LkIuOgorCisgICAgICogZGFzIFNjaG5lbGxlIEthZW1wZmVuLAorICAgICAqIGRhcyBVbnRlcmxhdWZlbiBkZXIgV2FmZmUgZGVzIEdlZ25lcnMsCisgICAgICogZGllIEZpbnRlIHVuZAorICAgICAqIGRlciBLYW1wZndpbGxlLgorCisgICAgRXMgZ2lidCBlaW5lIFJlaWhlIHZvbiB6dXNhZXR6bGljaGVuIEFuZ3JpZmZlbiwgZGllIG1hbiBtYWNoZW4ga2FubiwKKyAgICB3aWUgei5CLjoKKworICAgICAqIEthbXBmdHJpdHQsCisgICAgICogS25pZXN0b3NzIHVuZAorICAgICAqIFRvZGVzc3Rvc3MuCisKKyAgICBBdXNzZXJkZW0ga2FubiBtYW4gZWluZW4gV2FmZmVuYnJ1Y2ggdW5kIGVpbmVuIEtPLVNjaGxhZyBhbmJyaW5nZW4uCisKKyAgICBFcyBnaWJ0IG5hdHVlcmxpY2ggYXVjaCBkZWZlbnNpdmUgS2FtcGZtaXR0ZWw6CisgICAgRGllIFBhcmFkZSB1bmQgZGllIFNjaGlsZHBhcmFkZS4gUmVjaHQgYW5zcHJ1Y2hzdm9sbCBpc3QgZGFzIEF1c3dlaWNoZW4KKyAgICB2b24gWmF1YmVyc3BydWVjaGVuLgorCisgICAgVGVjaG5pa2VuLCBkaWUgaW0gR3J1cHBlbmthbXBmIG51ZXR6bGljaCBzaW5kOgorCisgICAgICogUnVlY2tlbmRlY2t1bmcsCisgICAgICogZGFzIEJsb2NraWVyZW4gZGVyIFdhZmZlIGRlcyBHZWduZXJzIHVuZAorICAgICAqIGRhcyBCZXNjaGltcGZlbiBkZXMgR2VnbmVycy4KKworICAgIFp1c2FldHpsaWNoIGdpYnQgZXMgbm9jaDoKKworICAgICAqIGRhcyBXYWZmZW5zY2hhZXJmZW4sCisgICAgICogZGFzIEVpbnNjaGFldHplbiB2b24gTW9uc3Rlcm4sIFdhZmZlbiB1bmQgUnVlc3R1bmdlbiwKKyAgICAgKiBkYXMgSWRlbnRpZml6aWVyZW4gdm9uIERpbmdlbiwKKyAgICAgKiBkZW4gS2FtcGZzcHJ1bmcsCisgICAgICogZGFzIFNhdWZlbiB1bmQKKyAgICAgKiBkYXMgVHJhZ2VuIHZvbiBzY2h3ZXJlbiBMYXN0ZW4uCisKKyBJbnNnZXNhbXQgZ2lidCBlcyA0MSB2ZXJzY2hpZWRlbmUgRmFlaGlna2VpdGVuIHp1IGVybGVybmVuLgorIERhcnVlYmVyaGluYXVzIGdpbHQgZXMsIGF1ZiBzZWluZW0gV2VnIGR1cmNoIGRpZSB2ZXJzY2hpZWRlbmVuIEdpbGRlbmxldmVsCisgKHp1ciBaZWl0IGJpcyBHTCAyNCksIGltbWVyIGVpbmlnZSBkZXIgMzggQXVmZ2FiZW4sIGRpZSBkYXMgU3RydXYgZnVlcgorIGVpbmVuIGJlcmVpdGhhZWx0LCB6dSBlcmxlZGlnZW4uCisKKyBXZXIgc2ljaCBub2NoIG1laHIgSW5mb3JtYXRpb25lbiB2ZXJzY2hhZmZlbiBtb2VjaHRlLCBzY2hhdXQgZWluZmFjaCBtYWwKKyBhdWYgaHR0cDovL3d3dy50cnZlcy5kZSB2b3JiZWkuCisKKworIFNJRUhFIEFVQ0g6CisgICAgYXR0cmlidXRlLCBlYmVuZW4sIGdpbGRlbgorCisgICAgKklzdCBtYW4gTWl0Z2xpZWQgZWluZXIgYW5kZXJlbiBHaWxkZSwgc28gbXVzcyBtYW4gZnVlciBkaWUgSGlsZmVuIHp1IGRlbgorICAgIFNwcnVlY2hlbiBgaGlsZmUgZ2lsZGUga2FlbXBmZXIgPG5hbWU+JyBiZW51dHplbiEqCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFRodSwgMTcuMDEuMjAwOCwgMTQ6MDA6MDAgdm9uIEdhYnlsb24KZGlmZiAtLWdpdCBhL2RvYy9oZWxwL2thbXBmIGIvZG9jL2hlbHAva2FtcGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkxZTU0NQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9oZWxwL2thbXBmCkBAIC0wLDAgKzEsMzIgQEAKKworS2FlbXBmZW4KKz09PT09PT09CisKKyAgICAgS2FlbXBmZW4sIGF1Y2ggYWxsZ2VtZWluIGFscyBNZXR6ZWxuIGJla2FubnQgaXN0IGVpbmUgZGVyIExpZWJsaW5ncy0KKyAgICAgc3BvcnRhcnRlbiBkaXZlcnNlciBHaWxkZW4gdW5kIGFrdGl2ZXIgU3BpZWxlci4gRGFiZWkgc3VjaHQgbWFuIHNpY2gKKyAgICAgZWluZW4gbW9lZ2xpY2hzdCBpbnRlcmVzc2FudCBhdXNnZXN0YXR0ZXRlbiBOUEMsIGJyaW5ndCBpaG4gdW0gdW5kCisgICAgIGJlbnV0enQgZGVzc2VuIGVoZW1hbGlnZXMgSGFiIHVuZCBHdXQgdW0gZWluZW4gd2VpdGVyZW4gTlBDIHp1IHRvZXRlbi4KKyAgICAgRGFzIGlzdCBiZWxpZWJpZyBpdGVyaWVyYmFyLgorCisgICAgIEVpbiBLYW1wZiBpc3QgaW4gS2FtcGZydW5kZW4gYXVmZ2V0ZWlsdCwgZGllIGR1cmNoIGRlbiBIZXJ6c2NobGFnCisgICAgIGJlc3RpbW10IHNpbmQuIEJlbnV0enQgbWFuIGVpbmUgV2FmZmUgb2RlciBoYXQgSGFlbmRlIGZyZWksIHNvIGdyZWlmdAorICAgICBtYW4gbWl0IGRpZXNlbiBlaW5lbiBHZWduZXIgYW4sIGRlc3NlbiBIYXV0IHVuZCBSdWVzdHVuZyBzY2h1ZXR6dAorICAgICBkYXZvci4gRGFubiBncmVpZmVuIGRlciBvZGVyIGRpZSBHZWduZXIgYW4uCisKKyAgICAgSW4gamVkZXIgS2FtcGZydW5kZSBrYW5uIG1hbiB6dXNhZXR6bGljaCBtaXQgWmF1YmVyZWkgb2RlciBPYmpla3RlbgorICAgICBTY2hhZGVuIHZlcnVyc2FjaGVuIG9kZXIgZGVuIEthbXBmIGJlZWluZmx1c3Nlbi4gV2llIG9mdCBkYXMgbW9lZ2xpY2gKKyAgICAgaXN0LCBoYWVuZ3Qgdm9uIFNlaGVyc3RhdHVzLCAoU2VoZXIpbGV2ZWwgdW5kIGVpZ2VuZXIgR2VzY2h3aW5kaWdrZWl0CisgICAgIGFiLgorCisgICAgIEdlcmFkZSBzY2h3aWVyaWdlcmUgTW9uc3RlciBrb2VubmVuIG51ciBpbSBUZWFtIGJlc2llZ3Qgd2VyZGVuLiBJbgorICAgICBkZXIgUGFyYWxsZWx3ZWx0LCBkaWUgbnVyIGZ1ZXIgU2VoZXIgZXJyZWljaGJhciBpc3QsIHNpbmQgZGllIE1vbnN0ZXIKKyAgICAgbWFuY2htYWwgYXVjaCBub2NoIGV0d2FzIHN0YWVya2VyIG9kZXIgaGludGVyaGFlbHRpZ2VyLgorCisgU0lFSEUgQVVDSDoKKyAgICAgVmVyd2FuZHQ6IHRvZXRlLCBzdG9wLCByZXBvcnQsIHRlYW0KKyAgICAgQW5kZXJlczogIGhlaWx1bmcsIGxlYmVuLCB0b2QgCisgICAgICAgICAgICAgICB6YXViZXJlaSwgd2FmZmVuZmVydGlna2VpdGVuCisgICAgICAgICAgICAgICBiYWxhbmNlLCBhYmVudGV1ZXIKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgMTQuIE1hZXJ6IDIwMDQgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9oZWxwL2thcmF0ZSBiL2RvYy9oZWxwL2thcmF0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjEyMTZiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2hlbHAva2FyYXRlCkBAIC0wLDAgKzEsNzIgQEAKKworRGllIEdpbGRlIGRlciBLYXJhdGVrYWVtcGZlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgTWFuIGthbm4gaW4gZGVyIEdpbGRlIGRlciBLYXJhdGVrYWVtcGZlciBiZWkgU2Vuc2VpIEZ1bmFrb3NoaSBLYXJhdGUKKyAgICBsZXJuZW4uIFdlbm4gbWFuIGluIGRlciBHaWxkZSBlaW5nZXRyZXRlbiBpc3QsIHNvbGx0ZSBtYW4gaWhuIG5hY2ggZGVuCisgICAgQW5mb3JkZXJ1bmdlbiBmcmFnZW4gLSBlciBzYWd0IGVpbmVtIGRhbm4sIHdlbGNoZSBLYXJhdGV0ZWNobmlrZW4gbWFuCisgICAgbGVybmVuIHVuZCB1ZWJlbiBtdXNzLCB1bSBqZXdlaWxzIGRlbiBuYWVjaHN0ZW4gR3JhZCB6dSBlcnJlaWNoZW4uCisKKyAgICBFcyB3aXJkIGplZG9jaCBlaW5pZ2UgWmVpdCBkYXVlcm4sIGJpcyBtYW4gZGllIHZlcnNjaGllZGVuZW4gVGVjaG5pa2VuIGd1dAorICAgIGdlbnVnIGthbm4uIE1hbiBrYW5uIGluIGRlciBHaWxkZSBqZWRlIFRlY2huaWsgZWluemVsbiB1ZWJlbiwgYmVpIGRlbgorICAgIEFid2VocnRlY2huaWtlbiBpc3QgZXMgamVkb2NoIHJhdHNhbSwgZGllc2UgbWl0IGB1ZWJlIGFid2VocicgZ2VnZW4gZGVuCisgICAgU2Vuc2VpIHp1IHVlYmVuIC0gZGFiZWkgbXVzcyBtYW4gYXVmIGplZGVuIEFuZ3JpZmYgbWl0IGVpbmVyIEFid2VocnRlY2huaWsKKyAgICByZWFnaWVyZW4uIE5hdHVlcmxpY2ggbXVzcyBlcyBkaWUgcmljaHRpZ2UgQWJ3ZWhyIHNlaW4gLSBlaW5lbiBBZ2UtWnVraQorICAgIChGYXVzdHN0b3NzIG5hY2ggb2JlbiwgaW0gS29wZmJlcmVpY2gpIGthbm4gbWFuIG51biBlaW5tYWwgbmljaHQgbWl0IGVpbmVtCisgICAgR2VkYW4tQmFyYWkgKEFid2VociBuYWNoIHVudGVuLCBnZWdlbiBTY2hsYWVnZSB1bnRlcmhhbGIgZGVyIEd1ZXJ0ZWxsaW5pZSkKKyAgICBhYndlaHJlbi4gQW5mYW5ncyB3aXJkIG1hbiBhdWNoIG5vY2ggbmljaHQgamVkZW4gQW5ncmlmZiBhYndlaHJlbiBrb2VubmVuLgorICAgIEJlaW0gVHJhaW5pbmcgc29sbHRlIG1hbiB1ZWJyaWdlbnMgbmljaHQgenV2aWVsIEtyZW1wZWwgbWl0IHNpY2gKKyAgICBoZXJ1bXNjaGxlcHBlbiAtIGltbWVyaGluIG11c3MgbWFuIHNpY2ggYmVpIEthcmF0ZSB2aWVsIGJld2VnZW4uCisKKyAgICBJbSBLYW1wZiB3ZW5kZXQgbWFuIGRpZSBlcmxlcm50ZW4gVGVjaG5pa2VuIHVlYnJpZ2VucyBhdXRvbWF0aXNjaCBhbi4gQXVjaAorICAgIGRhZHVyY2ggbGVybnQgbWFuIGVpbmlnZXMgaGluenUuIFNjaHdlcmUgUnVlc3R1bmdlbiBzY2hyYWVua2VuIGFsbGVyZGluZ3MKKyAgICBkaWUgQmV3ZWdsaWNoa2VpdCBzdGFyayBlaW4gLSBtYW4gc29sbHRlIHNpY2ggYWxzbyBhdWYgR2kgdW5kIEd1ZXJ0ZWwKKyAgICBiZXNjaHJhZW5rZW4uCisKKyAgICBFcyB3ZXJkZW4gYmVpbSBLYW1wZiB1ZWJyaWdlbnMgbnVyIGRpZSBSdWVzdHVuZ2VuIGltIGdldHJvZmZlbmVuCisgICAgS29lcnBlcmJlcmVpY2ggYmVpbSBHZWduZXIgYmVydWVja3NpY2h0aWd0IC0gd2VubiBqZW1hbmQgaW4gZWluZW0gQmVyZWljaAorICAgIHNjaGxlY2h0IGdlc2NodWV0enQgaXN0LCBzb2xsdGUgbWFuIHNpY2ggbWl0IGBhbmdyaWZmIG1pdCB4eHgsIHl5eSB1bmQKKyAgICB6enonIGF1ZiBkaWUgQW5ncmlmZnN0ZWNobmlrZW4gaW0gcmljaHRpZ2VuIFppZWxiZXJlaWNoIGJlc2NocmFlbmtlbi4gV2VyCisgICAgZWluZW4gaG9oZW4gR3JhZCBoYXQsIHdhZWhsdCB1ZWJyaWdlbnMgZGllIHJpY2h0aWdlIFRlY2huaWsgYXV0b21hdGlzY2gKKyAgICBldHdhcyBnZXNjaGlja3Rlci4uLgorCisgICAgRXMgaXN0IGF1Y2ggd2ljaHRpZywgd2llIGdyb3NzIGRlciBHZWduZXIgaXN0IC0gZWluIEVsZiBzb2xsdGUgbmljaHQKKyAgICB2ZXJzdWNoZW4sIGVpbmVuIFp3ZXJnIG1pdCBlaW5lbSBBZ2UtWnVraSBhbnp1Z3JlaWZlbiwgd2VpbCBlciBkYW5uCisgICAgTG9lY2hlciBpbiBkaWUgTHVmdCB1ZWJlciBpaG0gc2NobGFlZ3QuCisKKyAgICBWb24gZGVuIEFuZ3JpZmZzdGVjaG5pa2VuIHNpbmQgVHJpdHRlIGFtIGVmZmVrdGl2c3RlbiwgZGFuYWNoIGtvbW1lbgorICAgIEhhbmRrYW50ZW5zY2hsYWVnZSwgZGFubiBFbGxib2dlbnNjaGxhZWdlIHVuZCBLbmlldHJpdHRlLCBkYW5uCisgICAgRmF1c3RzY2hsYWVnZSB1bmQgenVsZXR6dCBGYXVzdHN0b2Vzc2UuCisKKyAgICBNYW4ga2FubiBtaXQgendlaSBIYWVuZGVuIGltIFByaW56aXAgYmVzc2VyIHZlcnRlaWRpZ2VuIGFscyBtaXQgZWluZXIgLQorICAgIGplZG9jaCBpc3QgZWluZSBkYXJhdWYgZm9sZ2VuZGUgSGFuZHRlY2huaWsgaW1tZXIgZXR3YXMgc2NobGVjaHRlci4gQXVjaAorICAgIHp3ZWkgRnVzc3RlY2huaWtlbiBrdXJ6IGhpbnRlcmVpbmFuZGVyIHNpbmQgbmljaHQgZW1wZmVobGVuc3dlcnQuCisKKyAgICBEaWUgRXJmb2xnc3dhaHJzY2hlaW5saWNoa2VpdCBlaW5lciBUZWNobmlrIGhhZW5ndCBuaWNodCBudXIgdm9tIEtvZW5uZW4KKyAgICBhYiwgc29uZGVybiBhdWNoIHZvbiBkZXIgZ2Vpc3RpZ2VuIEtvbnplbnRyYXRpb24sIGFsc28gZGVuIE1hZ2llcHVua3Rlbi4KKyAgICBXZW5uIGRpZXNlIG5hY2hsYXNzZW4sIHNpbmt0IGRpZSBXYWhyc2NoZWlubGljaGtlaXQsIGJlaSBzY2h3aWVyaWdlbgorICAgIFRlY2huaWtlbiBmcnVlaGVyIHVuZCBiZWkgbGVpY2h0ZW4gc3BhZXRlci4gSmUgaG9laGVyIGplZG9jaCBkZXIgR3JhZCBpc3QsCisgICAgZGVzdG8gbGFuZ3NhbWVyIHNpbmt0IGRpZSBXYWhyc2NoZWlubGljaGtlaXQgZGFubi4KKworICAgIERpZSBtYXhpbWFsZSBXaXJrdW5nIGVpbmVzIG1pc3NsdW5nZW5lbiBTY2hsYWdlcyBpc3Qgc2NobGVjaHRlciBhbHMgZGllCisgICAgbWF4aW1hbGUgV2lya3VuZyBlaW5lcyBnZWx1bmdlbmVuIFNjaGxhZ2VzIC0gYmVpIGVpbmZhY2hlbiBTY2hsYWVnZW4gaGFsYgorICAgIHNvIGd1dCwgYmVpIHNjaHdpZXJpZ2VuIG5vY2ggd2VuaWdlci4gSmUgaG9laGVyIGRlciBHcmFkIGlzdCwgZGVzdG8gaG9laGVyCisgICAgaXN0IGRpZSBnYXJhbnRpZXJ0ZSBNaW5kZXN0d2lya3VuZyBlaW5lcyBnZWx1bmdlbmVuIFNjaGxhZ2VzLiBCZWkgaG9oZW4KKyAgICBHcmFkZW4ga2FubiBlcyBhdWNoIGdlc2NoZWhlbiwgZGFzcyBlaW4gU2NobGFnIGJlc29uZGVycyBndXQgZ2VsaW5ndCAtIGJlaQorICAgIHZvbGxlciBLb256ZW50cmF0aW9uIHdpcmQgZGllIFdpcmt1bmcgZGFkdXJjaCBmYXN0IHZlcmRvcHBlbHQuIEhhbmRzY2h1aGUKKyAgICBiencuIFNjaHVoZSBkYWVtcGZlbiBuYXR1ZXJsaWNoIGVpbmVuIFNjaGxhZyBiencuIFRyaXR0LgorCisgICAgRGllIFZlcnRlaWRpZ3VuZyBpc3QgYXVjaCBub2NoIHZvbiBkZXIgQXJ0IGRlcyBBbmdyaWZmcyBhYmhhZW5naWcgLSBlaW4KKyAgICBLYXJhdGVrYSBrYW5uIEFuZ3JpZmZlIG1pdCBzdHVtcGZlbiB1bmQgc3BpdHplbiBXYWZmZW4gZ3V0IGFid2VocmVuLAorICAgIFNjaHdlcnRlciB1bmQgYWVobmxpY2hlIFdhZmZlbiBhdWNoIG5vY2ggcmVjaHQgZ3V0LCBhYmVyIGV0d2FzIHNjaGxlY2h0ZXIuCisgICAgR2VnZW4gTWFnaWUsIEZldWVyIHVuZCBBZWhubGljaGVzIHNpZWh0IGVpbiBLYXJhdGVrYSBhbmZhbmdzIHJlY2h0IGFsdAorICAgIGF1cywgd2VpbCBlciBkaWVzIG5pY2h0IGFid2VocmVuIGthbm4gLSB3ZW5uIGVyIGVpbmVuIGhvaGVuIEdyYWQgaGF0CisgICAgZ2VsaW5ndCwgZXMgaWhtIGFiZXIgb2VmdGVyLCBlaW5lbSBzb2xjaGVuIEFuZ3JpZmYgYXVzenV3ZWljaGVuLCBqZWRvY2gKKyAgICBudXIsIHdlbm4gZXIgbmljaHQgenV2aWVsIEdld2ljaHQgZGFmdWVyIGJld2VnZW4gbXVzcy4KKworIFNJRUhFIEFVQ0g6CisgICAgYWJ3ZWhyLCBhbmdyaWZmLCBrb256ZW50cmF0aW9uLCBuZW1va3Utb3dhcnUsCisgICAgYXR0cmlidXRlLCBlYmVuZW4sIGdpbGRlbiwgZGFlbXBmdW5nCisKKyAgICAqSXN0IG1hbiBNaXRnbGllZCBlaW5lciBhbmRlcmVuIEdpbGRlLCBzbyBtdXNzIG1hbiBmdWVyIGRpZSBIaWxmZW4genUgZGVuCisgICAgS29tbWFuZG9zIGBoaWxmZSBnaWxkZSBrYXJhdGUgPG5hbWU+JyBiZW51dHplbiEqCmRpZmYgLS1naXQgYS9kb2MvaGVscC9rYXR6ZW5rcmllZ2VyIGIvZG9jL2hlbHAva2F0emVua3JpZWdlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzBkNDJiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2hlbHAva2F0emVua3JpZWdlcgpAQCAtMCwwICsxLDEzIEBACitLQVRaRU5LUklFR0VSOgorCisgICAgICAgIEFscyBkaWUgRHNjaHVuZ2Vsc3RhZHQgIEthdHptYW5kdSBpaHJlIFRvcmUgZnVlciAgZGllIFdlbHQgb2VmZm5ldGUsCisgICAgICAgIGxlcm50ZSBkaWUgV2VsdCBuaWNodCBudXIgZGllIEZlbGluZW4ga2VubmVuLCBzb25kZXJuIGF1Y2ggZGllIEdpbGRlCisgICAgICAgIGRlciAgS2F0emVua3JpZWdlci4gIERpZSBNaXRnbGllZGVyICBkaWVzZXIgIEdpbGRlICB2ZXJmdWVnZW4gIHVlYmVyCisgICAgICAgIHZlcnNjaGllZGVuZSBaYXViZXIgdW5kICBGYWVoaWdrZWl0ZW4sICBkZXJlbiBVcnNwcnVuZyBpbSB0YWVnbGljaGVuCisgICAgICAgIEthbXBmIHVtIGRhcyBVZWJlcmxlYmVuIGltIERzY2h1bmdlbCB6dSBzdWNoZW4gaXN0LgorCisgICAgICAgIE5hZWhlcmUgIEluZm9ybWF0aW9uZW4gIHp1ICBkaWVzZXIgIEdpbGRlIGZpbmRlc3QgIER1IGluIGRlciBncm9zc2VuCisgICAgICAgIEJpYmxpb3RoZWsgdm9uIEthdHptYW5kdS4KKworU0lFSEUgQVVDSDoKKwlhdHRyaWJ1dGUsIGdpbGRlbiwga2FuYWVsZQpkaWZmIC0tZ2l0IGEvZG9jL2hlbHAva2xlcnVzIGIvZG9jL2hlbHAva2xlcnVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYjg2OTMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaGVscC9rbGVydXMKQEAgLTAsMCArMSw3MiBAQAorCitEaWUgS2xlcmlrZXJnaWxkZQorLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIE9id29obCBkZXIgU3RhbW10ZW1wZWwgZGVzIEhlaWxpZ2VuIE9yZGVucyBzaWNoIGF1ZiBkZXIgSW5zZWwgYW0gRW5kZSBkZXIKKyAgICBXZWx0IGJlZmluZGV0LCBzcGllbHQgc2ljaCBkZXIgZnVlciBkaWUgU3BpZWxlciByZWxldmFudGUgVGVpbCBpbSBUZW1wZWwKKyAgICBpbiBkZXIgU3RhZHQgRGplbGliZWJ5IGFiLiBEaWUgQmVncnVlbmR1bmcga2FubiBtYW4gaW0gJ0J1Y2ggZGVyCisgICAgR3J1bmRzYWV0emUnIG5hY2hsZXNlbi4KKworICAgIFByYWt0aXNjaCBiZWRldXRldCBkaWVzLCBkYXNzIHNvIGd1dCB3aWUgYWxsZSBBa3Rpb25lbiwgd2llIGRlciBFaW4tIG9kZXIKKyAgICBBdXN0cml0dCwgZGFzIEVybGVybmVuIHZvbiBTcHJ1ZWNoZW4gKGJlaSBkZW4gS2xlcmlrZXJuIEFucnVmdW5nZW4KKyAgICBnZW5hbm50KSB1bmQgZGFzIEVyaG9laGVuIGRlciBTdHVmZSBudXIgaW0gVGVtcGVsIGluIERqZWxpYmVieSB2ZXJmdWVnYmFyCisgICAgc2luZC4gTnVyIGZ1ZXIgZGllIFByaWVzdGVyd2VpaGUgdW5kIGRlbiBBdWZzdGllZyB6dW0venVyIEVybGV1Y2h0ZXRlbgorICAgIG11c3MgbWFuIGRlbiBTdGFtbXRlbXBlbCBhdWZzdWNoZW4uIERlciBCZXN1Y2ggZGVzIFN0YW1tdGVtcGVscyBsb2hudCBzaWNoCisgICAgamVkb2NoIGF1Y2gsIHdlbm4gbWFuIHNpY2ggZ2VuYXVlciB1ZWJlciBkaWUgT3JkZW5zZ2VzY2hpY2h0ZSBpbmZvcm1pZXJlbgorICAgIHdpbGwsIGRhIGRvcnQgZGllIHdpY2h0aWdzdGVuIFNjaHJpZnRzdHVlY2tlIHp1IGZpbmRlbiBzaW5kLgorCisgSU5GT1JNQVRJT05FTjoKKyAgICBVbSBzaWNoIHVlYmVyIGRlbiBPcmRlbiB6dSBpbmZvcm1pZXJlbiwgc29sbHRlIG1hbiBpbSBUZW1wZWwgZm9sZ2VuZGUKKyAgICBCdWVjaGVyIGxlc2VuOgorCisgICAgIERhcyBCdWNoIGRlciBBbnJ1ZnVuZ2VuCisgICAgICAgIGhpZXIgc3RlaGVuIEluZm9ybWF0aW9uZW4genUgZGVuIGVpbnplbG5lbiBBbnJ1ZnVuZ2VuCisKKyAgICAgRGFzIEJ1Y2ggZGVyIEdydW5kc2FldHplCisgICAgIERhcyBCdWNoIGRlcyB6d2VpdGVuIEV4b2R1cworICAgICAgICBlaW4gcGFhciBoaXN0b3Jpc2NoZSBJbmZvcm1hdGlvbmVuCisKKyAgICAgRGFzIEJ1Y2ggZGVyIEhpZXJhcmNoaWUKKyAgICAgICAgZGllIGVpbnplbG5lbiBPcmRlbnNzdHVmZW4gbWl0IEFuZm9yZGVydW5nZW4gdW5kIEZhZWhpZ2tlaXRlbgorCisgWlVNIEVJTlRSSVRUOgorICAgIEZ1ZXIgZGVuIGFsbGVyZXJzdGVuIEVpbnRyaXR0IGluIGRlbiBPcmRlbiBiZW5vZXRpZ3QgbWFuIGVpbmVuCisgICAgRnVlcnNwcmVjaGVyLiBEaWVzZXIgbXVzcyBzZWxic3QgTWl0Z2xpZWQgZGVzIEhlaWxpZ2VuIE9yZGVucyB1bmQgaW4gZGVyCisgICAgT3JkZW5zaGllcmFyY2hpZSBzY2hvbiB6dW0gV2FuZGVycHJlZGlnZXIgYXVmZ2VzdGllZ2VuIHNlaW4uIFdlbm4gbWFuIChhdXMKKyAgICB3ZWxjaGVuIEdydWVuZGVuIGF1Y2ggaW1tZXIpIGF1cyBkZW0gSGVpbGlnZW4gT3JkZW4gYXVzdHJpdHQgdW5kIGRhbm4gZG9jaAorICAgIHdpZWRlciBlaW50cmV0ZW4gd2lsbCwgaXN0IGVpbiBGdWVyc3ByZWNoZXIgbmljaHQgbWVociBub2V0aWcuCisKKyAgICBXZWl0ZXJlIEVpbnRyaXR0c2JlZGluZ3VuZyBpc3QsIGRhc3MgbWFuIGVpbmVuIGhlaWxpZ2VuIENoYXJha3RlcgorICAgIGF1ZndlaXN0LgorCisgWlUgREVOIEFOUlVGVU5HU0tPU1RFTjoKKyAgICBCZWkgZGVuIEtvc3RlbiwgZGllIGF1ZiBkZW4gSGlsZmVzZWl0ZW4gYW5nZWdlYmVuIHNpbmQsIGhhbmRlbHQgZXMgc2ljaAorICAgIG51ciB1bSBHcnVuZHdlcnRlLiBEaWVzZSBXZXJ0ZSB2YXJpaWVyZW4gYWJoYWVuZ2lnIHZvbSBDaGFyYWt0ZXIgdW5kIGRlcgorICAgIEdsYXViZW5zc3RhZXJrZS4gRWluIGZyZWNoZXIsIGJvZXNlciBvZGVyIGdhciBzYXRhbmlzY2hlciBDaGFyYWt0ZXIgemllaHQKKyAgICBob2VoZXJlIEtvc3RlbiBuYWNoIHNpY2gsIHdhZWhyZW5kIGVzIGJlaSBuZXR0ZW0sIGd1dGVtIG9kZXIgaGVpbGlnZW0KKyAgICBDaGFyYWt0ZXIgenUgZWluZXIgS29zdGVuc2Vua3VuZyBrb21tdC4KKworICAgIEF1c3NlcmRlbSB3ZXJkZW4gYmVpIGRlciBXZWloZSB6dW0gUHJpZXN0ZXIgZGllIEtvc3RlbiBkZXIgQW5ydWZ1bmdlbiBkZXIKKyAgICBHb3R0aGVpdCwgZGVyIG1hbiBzaWNoIGdld2VpaHQgaGF0LCBnZW5lcmVsbCB1bSAyMCUgcmVkdXppZXJ0LCB3YWVocmVuZAorICAgIGRpZSBLb3N0ZW4gZnVlciBkaWUgQW5ydWZ1bmdlbiBkZXIgYW5kZXJlbiBHb2V0dGVyIHVtIDIwJSBzdGVpZ2VuLgorCisgICAgRGllIGdlbmF1ZW4gS29zdGVuIHp1IGdlZ2ViZW5lbSBDaGFyYWt0ZXIgdW5kIEdsYXViZW5zc3RhZXJrZSBrYW5uIG1hbgorICAgIGltbWVyIGltIEJ1Y2ggZGVyIEFucnVmdW5nZW4gbmFjaHNjaGxhZ2VuLgorCisgU09OU1RJR0VTOgorICAgIEluIGRlbiBUZW1wZWxuIHN0ZWh0IGRlbiBPcmRlbnNtaXRnbGllZGVybiBkZXIgQmVmZWhsIGB0ZW1wZWx0cmFuc3BvcnQnCisgICAgenVyIFZlcmZ1ZWd1bmcsIGRlciBkZW4gc2NobmVsbGVuIFdlY2hzZWwgendpc2NoZW4gYmVpZGVuIFRlbXBlbG4gZXJsYXVidC4KKworIFNJRUhFIEFVQ0g6CisgICAgZ2lsZGVuLAorICAgIGJldGUsIGVudGZyb3NjaGUsIGlkZW50aWZpemllcmUsIGxlYmVuc2tyYWZ0LCBzb25uZW5zY2h1dHosIGRvbm5lciwKKyAgICBlbnRmbHVjaGUsIGt1cmllcmUsIGxhZXV0ZXJlLCBibGl0eiwgaGVpbGUsIHNjaGFldHosIHNlZ25lLAorICAgIGVsZW1lbnRhcnNwaGFlcmUsIGVudGdpZnRlLCBsZXVjaHRlbiwgdHJhdWUsIHdlaWhlLCBlbGVtZW50YXJzY2hpbGQsCisgICAgaGVpbGlnZW5zY2hlaW4sIG1lc3NlcmtyZWlzLCByZWdlbmVyaWVyZSwgc3BhbHR1bmcsIGJlaXN0YW5kLCBoZWlsdHJhbmssCisgICAgc2NodXR6aGFuZCwgd3VuZGVyCisKKyAgICAqTmljaHQtS2xlcmlrZXIgbXVlc3NlbiBmdWVyIGRpZSBIaWxmZW4genUgZGVuIEFucnVmdW5nZW4gYGhpbGZlIGdpbGRlCisgICAga2xlcnVzIDxuYW1lPicgYmVudXR6ZW4hKgorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBGcmksIDA1LjA5LjE5OTcsIDA4OjQ3OjA4IHZvbiBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9oZWxwL2tvbnplcHQgYi9kb2MvaGVscC9rb256ZXB0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViODQxMzAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaGVscC9rb256ZXB0CkBAIC0wLDAgKzEsNTggQEAKKworRGllIElkZWUgaGludGVyIGRpZXNlbSBTcGllbAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgRGllcyBzaW5kIGRpZSAoZXR3YXMgdGVjaG5pc2NoIGdlaGFsdGVuZW4pIEdydW5ka29uemVwdGUgZGVzCisgICAgTW9yZ2VuR3JhdWVucywgYnp3LiB2b24gTFBNdWRzIGFuIHNpY2g6CisKKyAgICAgMS4gRWluIE1hZ2llciBrYW5uIGRhcyBTcGllbCBlcndlaXRlcm4uCisKKyAgICAgMi4gU3BpZWxlcndlaXRlcnVuZ2VuIGtvZW5uZW4gYW0gbGF1ZmVuZGVuIFNwaWVsIHZvcmdlbm9tbWVuIHdlcmRlbi4KKworICAgICAzLiBBbGxlcyBpbSBTcGllbCBiZXN0ZWh0IGF1cyBPYmpla3Rlbi4gUmFldW1lLCBTcGllbGVyLCBNb25zdGVyIHVuZAorICAgICAgICBTY2hhZXR6ZSBzaW5kIGFsbGVzIE9iamVrdGUuCisKKyAgICAgNC4gQWxsZSBPYmpla3RlIHdlcmRlbiBpbiBlaW5lbSBDLURpYWxla3QgKExQQykgZ2VzY2hyaWViZW4uIERpZQorICAgICAgICBPYmpla3RlIHdlcmRlbiBiZWkgQmVkYXJmIGdlbGFkZW4gdW5kIGhhbGJpbnRlcnByZXRpZXJ0LgorCisgICAgIDUuIEVzIGdpYnQga2VpbmVuIFBhcnNlci4gQWxsZSBLb21tYW5kb3Mgd2VyZGVuIHZvbiBkZW4gT2JqZWt0ZW4KKyAgICAgICAgZGVmaW5pZXJ0LiBFaW4gTWVzc2VyIGRlZmluaWVydCB6dW0gQmVpc3BpZWwgZGFzIEtvbW1hbmRvIGBzY2huZWlkZScKKyAgICAgICAgdW5kIGVpbmUgTGVkZXJqYWNrZSBkYXMgS29tbWFuZG8gYHRyYWdlJy4KKworICAgICAgICBFaW4gT2JqZWt0IGRlZmluaWVydCBlaW4gS29tbWFuZG8sIGluZGVtIGVzIHNpZSBtaXQgZWluZXIgaW0gT2JqZWt0CisgICAgICAgIGltcGxlbWVudGllcnRlbiBGdW5rdGlvbiB2ZXJrbnVlcGZ0LiBXZW5uIGRlciBTcGllbGVyIGRhcyBLb21tYW5kbworICAgICAgICBlaW5naWJ0LCBzbyB3aXJkIGRpZSB6dWdlaG9lcmlnZSBGdW5rdGlvbiBpbSBPYmpla3QgYXVmZ2VydWZlbi4gV2VubgorICAgICAgICBkZXIgU3BpZWxlciBgdHJhZ2UgamFja2UnIGVpbmdpYnQsIHNvIHdpcmQgYGphY2tlJyBhbHMgQXJndW1lbnQgYW4KKyAgICAgICAgZGllc2UgRnVua3Rpb24gdWViZXJnZWJlbi4gV2VubiBkZXIgU3BpZWxlciBgdHJhZ2Ugc2NoaWxkJyBlaW5naWJ0LCBzbworICAgICAgICBlcmtlbm50IGRpZSBGdW5rdGlvbiwgZGFzcyBgamFja2UnICE9IGBzY2hpbGQnIGlzdCwgdW5kIGdpYnQgZGVuIFdlcnQKKyAgICAgICAgZnVlciBNaXNzZXJmb2xnICgwKSB6dXJ1ZWNrLiBEYW5uIHdpcmQgZWluIGFuZGVyZXMgYHRyYWdlJy1Lb21tYW5kbworICAgICAgICBhdXNwcm9iaWVydCwgYmlzIGVpbiBQYXNzZW5kZXMgZ2VmdW5kZW4gd2lyZC4KKworICAgICAgICBCZXdlZ3QgZGVyIFNwaWVsZXIgZGllIEphY2tlIGF1cyBzZWluZW0gSW52ZW50b3J5IG9kZXIgc2VpbmVtCisgICAgICAgIEVudmlyb25tZW50IC0gc3ByaWNoIHNlaW5lbSBFaW5mbHVzc2JlcmVpY2ggc28gd2VyZGVuIGFsbGUgS29tbWFuZG9zLAorICAgICAgICBkaWUgenVyIEphY2tlIGdlaG9lcmVuIGdlbG9lc2NodC4KKworICAgICA2LiBSYWV1bWUgc2luZCBPYmpla3RlLCBkaWUgS29tbWFuZG9zIHdpZSBgb3N0ZW4nIG9kZXIgYGtsZXR0ZXInIHVuZAorICAgICAgICBhZWhubGljaGVzIGRlZmluaWVyZW4uIFdlbm4gZGVyIFNwaWVsZXIgYG9zdGVuJyBlaW5naWJ0LCBzbyB3aXJkIGRpZQorICAgICAgICB6dWdlaG9lcmlnZSBGdW5rdGlvbiBldHdhcyBtaXQgZGVtIFNwaWVsZXIgdHVuLgorCisgICAgIDcuIEVpbiBPYmpla3Qga2FubiBlaW5lIEZ1bmt0aW9uIG5hbWVucyBoZWFydF9iZWF0KCkgZGVmaW5pZXJlbi4gRGllc2UKKyAgICAgICAgRnVua3Rpb24gd2lyZCBhbGxlIHp3ZWkgU2VrdW5kZW4gYXVmZ2VydWZlbi4gRGllc2UgRnVua3Rpb24ga2FubiBmdWVyCisgICAgICAgIHNlbGJzdHN0YWVuZGlnIGFnaWVyZW5kZSBNb25zdGVyLCB2ZXJsb2VzY2hlbmRlIEZhY2tlbG4gb2RlcgorICAgICAgICB2ZXJ6b2VnZXJ0ZSBGYWxsZW4gZWluZ2VzZXR6dCB3ZXJkZW4uCisKKyAgICAgICAgRGVyIFBoYW50YXNpZSBkZXIgTWFnaWVyIHNpbmQga2VpbmUgR3JlbnplbiBnZXNldHp0LgorICAgICAgICAoRGVyIEVmZml6aWVueiBkaWVzZXIgRnVua3Rpb24gc2Nob24hKQorCisgICAgIDguIERhcyBrb21wbGl6aWVydGVzdGUgT2JqZWt0IGlzdCBkYXMgU3BpZWxlcm9iamVrdC4gRXMgZGVmaW5pZXJ0CisgICAgICAgIEtvbW1hbmRvcyB3aWUgYG5pbW0nLCBgbGFlY2hlbCcsIGBzY2hhdScgb2RlciBgdG9ldGUnLgorCisgICAgIDkuIFdlbm4gZWluIFNwaWVsZXIgTWFnaWVyIHdpcmQsIHNvIHdpcmQgZXIgZWluZXIgUmVnaW9uIHp1Z2V0ZWlsdC4KKyAgICAgICAgSW5uZXJoYWxiIGRpZXNlciBSZWdpb24gZGFyZiBlciBkYW5uIGRhcyBTcGllbCBlcndlaXRlcm4uIEVyIGthbm4KKyAgICAgICAgU2NobG9lc3NlciBiYXVlbiwgb2RlciBlaW5lIEhvZWhsZSAuLi4KKworICAgIDEwLiBGdWVyIE1hZ2llciwgZGllIE9iamVrdGUgc2NocmVpYmVuLCBzdGVoZW4gZWluIGVkLWtvbXBhdGlibGVyIEVkaXRvcgorICAgICAgICB1bmQgZWluIFVOSVgtYWVobmxpY2hlcyBGaWxlc3lzdGVtIHp1ciBWZXJmdWVndW5nLgorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICAxNC4gTWFlcnogMjAwNCBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL2hlbHAvbGFnIGIvZG9jL2hlbHAvbGFnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyN2E1YTEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaGVscC9sYWcKQEAgLTAsMCArMSw0MSBAQAorRGFzIExBRworPT09PT09PQorCisgICAgRGFzIExBRyBpc3QgZGFzIGdyb2Vzc3RlIHVuZCBmaWVzZXN0ZSBNb25zdGVyIGRlcyBNb3JnZW5ncmF1ZW4uIFNlbGJzdAorICAgIE1hZ2llciB1bmQgR29ldHRlciBzaW5kIG1hY2h0bG9zLiBFcyB0cml0dCBhdWYgZGVuIFBsYW4sIHdlbm4gZWluIE1hZ2llcgorICAgIG1hbCB3aWVkZXIgVW5zaW5uIGZhYnJpemllcnQsIGVpbiBTZWhlciBkYXMgZWlnZW5lIEhhdXMgYmlzIHp1bQorICAgIERhY2hzcGFudGVuIHZvbGxnZW11ZWxsdCBvZGVyIGVpbiBzZWhyIGJlbGllYnRlciBNaXRzcGllbGVyIGVpbgorICAgICJtYWlsIGZyZXVuZGUiIGFiZ2VzZXR6dCBoYXQuCisKKyAgICBHYW56IHRlY2huaXNjaCBiZXRyYWNodGV0IGlzdCBkZXIgUmVjaG5lciB1ZWJlcmxhc3RldCB1bmQga2FubiBkZW4KKyAgICBNdWQtUHJvemVzcyBuaWNodCBtaXQgZ2V3b2hudGVyIEdlc2Nod2luZGlna2VpdCBhdXNmdWVocmVuLiBEYWR1cmNoCisgICAgaGFlbmd0IGRhbm4gbmF0dWVybGljaCBhbGxlcyAtIGRlciBWb3J0ZWlsIGplZG9jaCBpc3QsIGRhc3MgbWFuIGltCisgICAgTm9ybWFsZmFsbCBhbiBMYWcgbmljaHQgc3RpcmJ0LCBkYSBhdWNoIGFsbGUgTW9uc3RlciB1bnRlciBaZWl0bWFuZ2VsCisgICAgbGVpZGVuLgorICAgIERhaGluZ2VnZW4gaXN0IGRhcyBrbGVpbmUgTW9uc3RlciBOZXR6bGFnIGhpbnRlcmhhZWx0aWdlci4gTWVpc3QgcmVpY2h0CisgICAgZXMgYWJlciwgZGVuIE5hY2hiYXJuIHZvbSBOZXR6a2FiZWwgaGVydW50ZXJ6dXNjaHVic2VuIHVtIGVzIHp1CisgICAgdmVydHJlaWJlbi4KKworCisgICAgRXMgZ2lidCBlaW5pZ2UgU3BpZWx6ZXVnZSwgbWl0IGRlbmVuIG1hbiBzaWNoIGRhcyBMYWcgaW4gWmFobGVuCisgICAgYW56ZWlnZW4gbGFzc2VuIGthbm4uIEFtIGJlbGllYnRlc3RlbiBpc3QgamVkb2NoIGRlciBLYW5hbCA8TWFzdGVSPjoKKworICAgIFs8TWFzdGVSPjpHbG9pbnNvbl0gbAorICAgIFs8TWFzdGVSPjo8TWFzdGVSPl0gNy44MCBjbWRzL3MsIDEyNy45NyBjb21wIGxpbmVzL3MKKyAgICBbPE1hc3RlUj46PE1hc3RlUj5dIExhZzogMC41JS82MCwgMC44JS8xNSwgMS4yLzUsIDAuMCUvMQorCisgICAgRGFiZWkgYmVkZXV0ZW4gZGllIFphaGxlbiwgdW0gd2lldmllbCBQcm96ZW50IGltIFZlcmdsZWljaCB6dXIgbm9ybWFsZW4KKyAgICBaZWl0IGRhcyBNVUQgaW4gZGVuIGxldHp0ZW4gNjAvMTUvNS8xIE1pbnV0ZW4gaW0gRHVyY2hzY2huaXR0IGxhbmdzYW1lcgorICAgIHdhci4KKyAgICAKKyAgICBIaWVyYmVpIGlzdCB6dSBiZWFjaHRlbiwgZGFzcyBzZWxic3QgZGVyIDEtTWludXRlbndlcnQgbnVyIGFsbGUgMTBzCisgICAgYmVyZWNobmV0IHdpcmQuIFRyaXR0IGFsc28gZ2VyYWRlIGpldHp0IGVpbiBMYWcgYXVmIHVuZCBpaHIgZnJhZ3Qgc29mb3J0CisgICAgZGFzIExhZyBhYiwgaXN0IGVzIHdhaHJzY2hlaW5saWNoLCBkYXNzIGVzIG5vY2ggbmljaHQgaW0gMS1NaW51dGVud2VydAorICAgIGVudGhhbHRlbiBpc3QuIERpZSBhbmRlcmVuIFdlcnRlIHdlcmRlbiBlbnRzcHJlY2hlbmQgc2VsdGVuZXIgbmV1CisgICAgYmVzdGltbXQuCisKKyBTSUVIRSBBVUNIOgorICAgIG11ZHJlY2huZXIsIHN0ZXJiZW4sIGViZW5lbgorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICAwNC4wOS4yMDEwLCBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL2hlbHAvbGViZW4gYi9kb2MvaGVscC9sZWJlbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODNiMzk5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2hlbHAvbGViZW4KQEAgLTAsMCArMSwyMyBAQAorCitMZWJlbiB1bmQgTGViZW5zcHVua3RlCis9PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgRWluIGplZGVyIGdlbmllc3N0IHNlaW4gKHZpcnR1ZWxsZXMpIExlYmVuIHNvIGd1dCBlciBrYW5uLCBvZnQgd2lyZAorICAgICBnZW1ldHplbHQsIG1hbmNobWFsIGdlcXVlc3RldCB1bmQgbm9jaCBoYWV1ZmlnZXIgZ2VpZGVsdC4KKworICAgICBEYXMgTGViZW4gd2lyZCBiZXN0aW1tdCBkdXJjaCBMZWJlbnNwdW5rdGUgdW5kIEtvbnplbnRyYXRpb25zcHVua3RlLAorICAgICB3b2JlaSBlcnN0ZXJlIHVlYmVyIGRlbiBUb2QgZW50c2NoZWlkZW4gdW5kIHp3ZWl0ZXJlIGVpbmVuIEVpbmZsdXNzCisgICAgIGF1ZiBkaWUgWmF1YmVyZWkgaGFiZW4uIFNpbmtlbiBkaWUgTGViZW5zcHVua3RlIGR1cmNoIEthbXBmIG9kZXIgR2lmdAorICAgICBhdWYgdW50ZXIgMCwgc3RpcmJ0IG1hbiAoZmFzdCBpbW1lcikuIERpZSBBbnphaGwgZGVyIExlYmVuc3B1bmt0ZQorICAgICBoYWVuZ3Qgdm9tIEF0dHJpYnV0IEF1c2RhdWVyIGFiLCBrYW5uIGFiZXIgYXVjaCBkdXJjaCBiZXNvbmRlcmUKKyAgICAgWmF1YmVyZWllbiBvZGVyIEF1c3J1ZXN0dW5nIGVyaG9laHQgd2VyZGVuLgorCisgICAgIEplZGVyIFNwaWVsZXIgaGF0IGVpbmVuIEhlcnpzY2hsYWcuIERpZXNlbiBzcHVlcnQgZXIgaW0gS2FtcGYgb2RlcgorICAgICBuYWNoIGRlbSBLYW1wZiwgZGVubiBkaWVzZXIgYmVzdGltbXQgS2FtcGZydW5kZW4gKHVuZCBkaWUgZGFyaW4KKyAgICAgbW9lZ2xpY2hlbiBBa3Rpb25lbikgdW5kIGRpZSBIZWlsdW5nLgorCisgU0lFSEUgQVVDSDoKKyAgICAgdG9kLCBoZWlsdW5nLCBrYW1wZiwgcmVwb3J0CisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgICA0LiBOb3YgMjAxMSBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL2hlbHAvbGVpdGZhZGVuIGIvZG9jL2hlbHAvbGVpdGZhZGVuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZWI1ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaGVscC9sZWl0ZmFkZW4KQEAgLTAsMCArMSwyMjggQEAKK0VpbiBrbGVpbmVyIExlaXRmYWRlbiB6dW0gU3BpZWwgaW0gTW9yZ2VuR3JhdWVuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBEYXMgTW9yZ2VuR3JhdWVuIGlzdCBlaW4gU3BpZWwuIFdpZSBiZWkgamVkZW0gU3BpZWwgbXVlc3NlbiwgdW0gZGVuCisgIFNwaWVsc3Bhc3MgbW9lZ2xpY2hzdCBmdWVyIGFsbGUgenUgZXJoYWx0ZW4sIGVpbiBwYWFyIHdlbmlnZSBSZWdlbG4KKyAgYmVhY2h0ZXQgd2VyZGVuLiBEaWVzZSBSZWdlbG4gZ2VsdGVuIHNvd29obCBmdWVyIFNwaWVsZXIgYWxzIGF1Y2gKKyAgZnVlciBNYWdpZXIuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorCisgICAgRGllIHdpY2h0aWdzdGUgUmVnZWwgYmV0cmlmZnQgZGFzIEFuZ3JlaWZlbiB1bmQgVG9ldGVuIGFuZGVyZXIKKyAgICBTcGllbGVyLgorCisgICAgRVMgSVNUIFNUUklLVCBVTlRFUlNBR1QgQU5ERVJFIFNQSUVMRVIgQU5aVUdSRUlGRU4gT0RFUiBaVSBUT0VURU4uCisKKyAgICBBdWNoIGRhcyBhYnNpY2h0bGljaGUgaW5kaXJla3RlIFRvZXRlbiB2b24gU3BpZWxlcm4gZHVyY2gKKyAgICBHaWxkZW5mYWVoaWdrZWl0ZW4sIHNwZXppZWxsZSBPYmpla3RlIG9kZXIgYWVobmxpY2hlcyBmYWVsbHQgdW50ZXIKKyAgICBkaWVzZSBSZWdlbC4KKworICAgIFNvbGx0ZSBtYW4gZWluZW4gU3BpZWxlciB1bWdlYnJhY2h0IGhhYmVuLCB0cmV0ZW4gc29mb3J0CisgICAgQmVzY2hyYWVua3VuZ2VuIGluIEtyYWZ0LCBkaWUgbnVyIGR1cmNoIGVpbmVuIEVyem1hZ2llciB3aWVkZXIKKyAgICBhdWZnZWhvYmVuIHdlcmRlbiBrb2VubmVuLgorCisgICAgV2lsbCBtYW4gc2ljaCBkZW5ub2NoIG1pdCBhbmRlcmVuIFNwaWVsZXJuIG1lc3Nlbiwgc28gZXhpc3RpZXJlbgorICAgIGV4dHJhIGRhZnVlciBlaW5nZXJpY2h0ZXRlIEdlYmlldGUsIHdpZSB6dW0gQmVpc3BpZWwgZGllIEFyZW5hIGluCisgICAgZGVyIFd1ZXN0ZSwgaW4gZGVuZW4gbWFuIHNpY2ggZ2VnZW5zZWl0aWcgYmVrYWVtcGZlbiBrYW5uLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKworICAgIEhhdCBtYW4gbWl0IHNlaW5lbSBDaGFyYWt0ZXIgZWluZSBaZWl0IGxhbmcgZ2VzcGllbHQsIHNvIGVudHN0ZWh0CisgICAgb2Z0IGRlciBXdW5zY2gsIGVpbm1hbCBlaW5lIGFuZGVyZSBSYXNzZSwgR2lsZGUgb2RlciBlaW5mYWNoIGVpbmVuCisgICAgYW5kZXJlbiBSb2xsZW5zcGllbGNoYXJha3RlciB6dSBzcGllbGVuLgorICAgIFNlaW5lbiBiaXNoZXJpZ2VuIENoYXJha3RlciBrYW5uIG9kZXIgbW9lY2h0ZSBtYW4gZGF6dSBhbGxlcmRpbmdzCisgICAgbmljaHQgYmVudXR6ZW4uCisgICAgRGFoZXIga2FubiBqZWRlciBTcGllbGVyIHdlaXRlcmUgQ2hhcmFrdGVyZSBhbmxlZ2VuLgorCisgICAgRGllc2UgbXVlc3NlbiBkYW5uIGplZG9jaCBhbHMgc29nZW5hbm50ZXIgWndlaXRzcGllbGVyIGRlcyBlcnN0ZW4KKyAgICBDaGFyYWt0ZXJzIG1hcmtpZXJ0IHdlcmRlbi4KKyAgICBEaWVzZSBNYXJraWVydW5nIGthbm4gbWFuIHp1bSBCZWlzcGllbCBiZWltIFNjaG1pZWQgaW4gZGVyCisgICAgWndlcmdlbnN0YWR0IG9kZXIgYmVpbSBEb3Jmc2NocmVpYmVyIGltIEVsZmVuZG9yZiBlcmhhbHRlbi4KKyAgICBEaWVzZSBNYXJraWVydW5nIGthbm4gbWFuIGF1Y2ggdm9yIGFuZGVyZW4gU3BpZWxlcm4gdmVyYmVyZ2VuLgorCisgICAgTWFuIGthbm4gYmVsaWViaWcgdmllbGUgc2VpbmVyIENoYXJha3RlcmUgZ2xlaWNoemVpdGlnIGVpbmxvZ2dlbiwKKyAgICBkb2NoIGlzdCBoaWVyYmVpIGRhcmF1ZiB6dSBhY2h0ZW4sIGRhc3MgbnVyIHp3ZWkgZGllc2VyIENoYXJha3RlcmUKKyAgICBha3RpdiBhbSBTcGllbGdlc2NoZWhlbiwgZGFzIGlzdCBhbGxlcyB3YXMgdWViZXIgcmVpbmUKKyAgICBLb21tdW5pa2F0aW9uIGhpbmF1c2dlaHQsIHRlaWxuZWhtZW4uCisgICAgRGllIGFuZGVyZW4gQ2hhcmFrdGVyZSBtdWVzc2VuIHNpY2ggYXVmIGRpZSBLb21tdW5pa2F0aW9uCisgICAgYmVzY2hyYWVua2VuLgorCisgICAgV2VpdGVyZSBFaW5zY2hyYWVua3VuZ2VuIGV4aXN0aWVyZW4gZnVlciBNYWdpZXIuCisKKyAgICBFaW4gTWFnaWVyIGRhcmYgbmljaHQgZ2xlaWNoemVpdGlnIG1pdCBzZWluZW4gU3BpZWxlcmNoYXJha3RlcmVuCisgICAgZWluZ2Vsb2dndCBzZWluLCBkaWVzZSBtYW5pcHVsaWVyZW4gb2RlciBmdWVyIHNlaW5lIFp3ZWl0c3BpZWxlcgorICAgIGZyZW1kZW4gQ29kZSBhbmFseXNpZXJlbi4KKworICAgIERlciBNYWdpZXItWndlaXRzcGllbGVyIHNvbGx0ZSBkYXJhdWYgYWNodGVuLCBhbmRlcmVuIFNwaWVsZXJuCisgICAgbmljaHQgZHVyY2ggc2VpbmVuIGV2ZW50dWVsbGVuIFdpc3NlbnN2b3J0ZWlsIGJlaSBRdWVzdGVuIHp1CisgICAgaGVsZmVuLgorCisgICAgRWluIE1hZ2llci1ad2VpdHNwaWVsZXIgc29sbHRlIHdlaXRlcmhpbiBkYXJhdWYgYWNodGVuLCBhbmRlcmUKKyAgICBTcGllbGVyIG5pY2h0IGluIGlocmVtIFNwaWVsIHp1IGJlaGluZGVybi4gRGllcyBrb2VubnRlIHp1bQorICAgIEJlaXNwaWVsIGR1cmNoIEJsb2NraWVyZW4gdm9uIFF1ZXN0cyBvZGVyIGJlc3RpbW10ZXIgbGltaXRpZXJ0ZXIKKyAgICBHaWxkZW5yYWVuZ2UgZ2VzY2hlaGVuLgorICAgIERlbiBQcm9ncmFtbWllcmVybiB2b24gUXVlc3RzIG9kZXIgR2lsZGVuIHN0ZWh0IGVzIG5hdHVlcmxpY2ggZnJlaSwKKyAgICBoaWVyIGVpbmUgZWlnZW5lIFZvcnNvcmdlIHp1IHRyZWZmZW4uCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorCisgICAgV2VyIGltIE1vcmdlbkdyYXVlbiBzcGllbHQsIGRlciBpc3QgZGVzIG9lZnRlcmVuIGF1ZiBkaWUgSGlsZmUKKyAgICBBbmRlcmVyIGFuZ2V3aWVzZW4uIEVpbmUgRm9ybSBkZXIgSGlsZmUgaXN0IGVzLCBlaW5lbiBDaGFyYWt0ZXIKKyAgICBhdXN6dWxlaWhlbiBvZGVyIGF1c2dlbGllaGVuIHp1IGJla29tbWVuLgorICAgIFVtIHNwcmFjaGxpY2ggYmVncnVlbmRldGUgTWlzc3ZlcnN0YWVuZG5pc3NlIGltIHdlaXRlcmVuIHp1CisgICAgdmVybWVpZGVuLCBoaWVyIGt1cnogZm9sZ2VuZGUgTm9tZW5rbGF0dXI6CisKKyAgICAgIEVpbiBTcGllbGVyLCBkZXIgZWluZW0gYW5kZXJlbiBTcGllbGVyIGVpbmVuIENoYXJha3RlciB6dXIKKyAgICAgIFZlcmZ1ZWd1bmcgc3RlbGx0LCB3aXJkIGFscyBWZXJsZWloZXIgYmV6ZWljaG5ldC4KKworICAgICAgRWluIFNwaWVsZXIsIGRlciBlaW5lbiBDaGFyYWt0ZXIgZWluZXMgYW5kZXJlbiBTcGllbGVycyBudXR6dCwKKyAgICAgIHdpcmQgYWxzIE51dHplciBiZXplaWNobmV0LgorCisgICAgRGFzIEF1c2xlaWhlbiB2b24gQ2hhcmFrdGVyZW4gaXN0IG1pdCBnZXdpc3NlbiBSYW5kYmVkaW5ndW5nZW4KKyAgICBlcmxhdWJ0LgorCisgICAgRWluIGF1c2dlbGllaGVuZXIgQ2hhcmFrdGVyIHdpcmQgYWxzIGFrdGl2ZXIgWndlaXRzcGllbGVyIGRlcworICAgIE51dHplcnMgYmV0cmFjaHRldCB1bmQgaXN0IHNvbWl0IGRlbiBSZWdlbHVuZ2VuIGZ1ZXIgWndlaXRzcGllbGVyCisgICAgdW50ZXJ3b3JmZW4uCisKKyAgICBCZXNvbmRlcnMgenUgYmVhY2h0ZW4gaXN0LCBkYXNzIGRlciBhdXNnZWxpZWhlbmUgQ2hhcmFrdGVyIG5pY2h0CisgICAgbWl0IGRlbSBOdXR6ZXIsIG9kZXIgZWluZW0gWndlaXRzcGllbGVyIGRlcyBOdXR6ZXJzLCBpbiBlaW4gVGVhbQorICAgIGRhcmYuCisKKyAgICBTb3dvaGwgZGVyIE51dHplciBkZXMgYXVzZ2VsaWVoZW5lbiBTcGllbGVycyBhbHMgYXVjaCBWZXJsZWloZXIsCisgICAga29lbm5lbiBmdWVyIGRpZSBIYW5kbHVuZ2VuIGRlcyBhdXNnZWxpZWhlbiBDaGFyYWt0ZXJzCisgICAgdmVyYW50d29ydGxpY2ggZ2VtYWNodCB3ZXJkZW4uCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorCisgICAgV2VyIG1pdCBlaW5lbSBDaGFyYWt0ZXIgQXVmZ2FiZW4gZ2Vsb2VzdCBoYXQgb2RlciB6dSBiZXN0aW1tdGVuCisgICAgVmVybXV0dW5nZW4gdWViZXIgRm9yc2NoZXJwdW5rdGUgZ2VsYW5ndCBpc3QsIGRlciBub3RpZXJ0IGRpZXMgb2Z0LAorICAgIHVtIGJlaSBzcGFldGVyZW4gQ2hhcmFrdGVyZW4gYXVmIGRpZXNlIEluZm9ybWF0aW9uZW4genVncmVpZmVuIHp1CisgICAga29lbm5lbi4KKworICAgIFNvbGNoZSBGb3JzY2hlcnB1bmt0bGlzdGVuIG9kZXIgS29tcGxldHRsb2VzdW5nZW4gc2luZCB6dW0KKyAgICBFaWdlbmdlYnJhdWNoLCBkYXMgaGVpc3N0IGZ1ZXIgZGllIGVpZ2VuZW4gWndlaXRzcGllbGVyIGVybGF1YnQuCisKKyAgICBEaWUgV2VpdGVyZ2FiZSBkaWVzZXIgSW5mb3JtYXRpb25lbiBvZGVyIGRhcyBOdXR6ZW4gdm9uIG5pY2h0CisgICAgc2VsYnN0IGVyc3RlbGx0ZW4gS29tcGxldHRsb2VzdW5nZW4gb2RlciBGb3JzY2hlcnB1bmt0bGlzdGVuIHNpbmQKKyAgICBhbmRlcmVuIFNwaWVsZXJuIGdlZ2VudWViZXIgaW0gaG9lY2hzdGVuIE1hc3NlIHVuZmFpciB1bmQgZGFoZXIKKyAgICB1bnRlcnNhZ3QuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorCisgICAgVW0gZGFzIFNwaWVsZW4gdm9uIE11ZHMgenUgdmVyZWluZmFjaGVuIHVuZCBrb21mb3J0YWJsZXIgenUKKyAgICBnZXN0YWx0ZW4sIGdpYnQgZXMgZWluZSBSZWloZSBzb2dlbmFubnRlciBNdWQtQ2xpZW50cy4KKworICAgIERpZXNlIENsaWVudGVuIGJpZXRlbiBvZnRtYWxzIGRpZSBNb2VnbGljaGtlaXQsIG1laHJlcmUgS29tbWFuZG9zCisgICAgaW0gTXVkIGF1ZiBlaW5lIGVpbnppZ2UgQWt0aW9uIGhpbiBhdXN6dWZ1ZWhyZW4gb2RlciBhdWYgQXVzZ2FiZW4KKyAgICBtaXQgc29sY2hlbiBLb21tYW5kb2tldHRlbiB6dSByZWFnaWVyZW4uCisKKyAgICBNYW4gc3ByaWNodCBoaWVyIHZvbiBTY3JpcHRlbiBvZGVyIFRyaWdnZXJuLgorCisgICAgWnVzYW1tZW4gbWl0IGVpbmVyIGludGVybmVuIFByb2dyYW1taWVyc3ByYWNoZSBkZXIgQ2xpZW50ZW4gbGFzc2VuCisgICAgc2ljaCB2aWVsZmFjaCBiZXN0aW1tdGUgQWt0aW9uZW4gaW0gTXVkIGF1dG9tYXRpc2llcmVuLgorCisgICAgRGllIFZlcndlbmR1bmcgc29sY2hlciBTY3JpcHRlIGlzdCBtaXQgZWluaWdlbiBBdWZsYWdlbiBqZWRlbQorICAgIFNwaWVsZXIgZnJlaWdlc3RlbGx0LgorCisgICAgU29nZW5hbm50ZSBVbnRlcnN1Y2hlc2NyaXB0ZSwgZGllIHNlbGJzdGFlbmRpZyBlaW5lIG9kZXIgbWVocmVyZQorICAgIERldGFpbHRpZWZlbiB2b24gUmFldW1lbiwgTW9uc3Rlcm4gb2RlciBhbmRlcmVuIEdlZ2Vuc3RhZW5kZW4KKyAgICBhYmZyYWdlbiwgc2luZCBuaWNodCBlcmxhdWJ0LgorCisgICAgSmVkZXIgQ2hhcmFrdGVyIHNvbGx0ZSBpbmRpdmlkdWVsbCBnZXN0ZXVlcnQgd2VyZGVuLCBkYWhlciBzaW5kCisgICAgU2NyaXB0ZSwgZGllIG1laHJlcmUgQ2hhcmFrdGVyZSBhdWYgZWlubWFsIHN0ZXVlcm4gdW50ZXJzYWd0LgorCisgICAgU2NyaXB0ZSwgd2VsY2hlIGVpbmVuIENoYXJha3RlciBpbSBTaW5uZSBlaW5lciBLb21wbGV0dGxvZXN1bmcKKyAgICBkdXJjaCBlaW5lIFF1ZXN0IGZ1ZWhyZW4gb2RlciBlaW5lIEZvcnNjaGVycHVua3RsaXN0ZSBhYmFyYmVpdGVuCisgICAgc2luZCBuaWNodCBlcmxhdWJ0LgorCisgICAgR3J1bmRzYWV0emxpY2ggZHVlcmZlbiBhbmRlcmUgU3BpZWxlciBkdXJjaCBTY3JpcHRlIG5pY2h0IGluIGlocmVtCisgICAgU3BpZWwgYmVoaW5kZXJ0IG9kZXIgYmVsYWVzdGlndCB3ZXJkZW4uCisKKyAgICBBbGxlIGFuZGVyZW4gU2NyaXB0ZSBzaW5kIGVybGF1YnQsIHNvd2VpdCBkZXIgU3BpZWxlciBpbm5lcmhhbGIKKyAgICBlaW5lciBNaW51dGUgaW0gUmFobWVuIHNlaW5lciBNb2VnbGljaGtlaXRlbiBhbnNwcmVjaGJhciBibGVpYnQuCisKKyAgICBBbHMgdW5lcmxhdWJ0ZXMgU2tyaXB0IHphZWhsdCBhdWNoIGRlciBLYW1wZiBtaXQgZWluZW0gTW9uc3RlciwKKyAgICB3ZW5uIGRlciBTcGllbGVyIGRhYmVpIGxhZW5nZXJlIFplaXQga2VpbmUgVGFzdGF0dXJlaW5nYWJlbgorICAgIHZvcm5pbW10IHVuZCBkYWJlaSBuaWNodCBhbnNwcmVjaGJhciBpc3QodG90aWRsZW4pLiBEaWVzIGdpbHQgdm9yCisgICAgYWxsZW0gd2VubiBkZXIgVG9kIGRlcyBNb25zdGVycyBuaWNodCBhYnNlaGJhciBpc3QuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorCisgICAgRGFzIE1vcmdlbkdyYXVlbiBiYXV0IGF1ZiBkaWUgQXJiZWl0IHZpZWxlciBmcmVpd2lsbGlnZXIKKyAgICBQcm9ncmFtbWllcmVyIGF1Zi4gV2llIGJlaSBqZWRlbSBQcm9ncmFtbSBrYW5uIGVzIGRhYmVpIHp1IEZlaGxlcm4sCisgICAgYXVjaCBCdWdzIGdlbmFubnQsIGtvbW1lbi4KKworICAgIEplZGVyIFNwaWVsZXIgc29sbHRlIGVpbiBJbnRlcmVzc2UgZGFyYW4gaGFiZW4sIGRhc3MgZGllc2UgRmVobGVyCisgICAgYmVzZWl0aWd0IHdlcmRlbi4KKworICAgIERpZXMga2FubiBtYW4gZHVyY2ggZWluZSBNZWxkdW5nIGRlcyBGZWhsZXJzIGFuIGRlbiBqZXdlaWxpZ2VuCisgICAgTWFnaWVyIG9kZXIgZmFsbHMgZGllc2VyIG5pY2h0IGVycmVpY2hiYXIgaXN0LCBkdXJjaCBlaW5lIE1lbGR1bmcKKyAgICBhbiBkZW4gZW50c3ByZWNoZW5kZW4gUmVnaW9uc21hZ2llciBlcnJlaWNoZW4uIEF1Y2ggZGVyIEJlZmVobAorICAgICJmZWhsZXIiIGthbm4gaGllciBudWV0emxpY2hlIERpZW5zdGUgbGVpc3Rlbi4KKworICAgIFdlciBkaWVzZSBNYWdpZXIgc2luZCwga2FubiBqZWRlbSBTcGllbGVyIGJlaSBCZWRhcmYgZHVyY2ggZWluZW4KKyAgICBhbndlc2VuZGVuIE1hZ2llciBvZGVyIG9mdCBhdWNoIGFuZGVyZW4gU3BpZWxlciBtaXRnZXRlaWx0IHdlcmRlbi4KKworICAgIERpZXNlcyBWb3JnZWhlbiBzb2xsdGUgYXVjaCBmdWVyIEZlaGxlciBnZWx0ZW4sIGRpZSBkZW0gU3BpZWxlciwKKyAgICBkZXIgZGllc2UgRmVobGVyIGVudGRlY2t0LCB6dW0gVm9ydGVpbCBnZXJlaWNoZW4uCisKKyAgICBTb2xsdGUgc2ljaCBlaW4gU3BpZWxlciBuaWNodCBzaWNoZXIgc2Vpbiwgb2IgZXMgc2ljaCBiZWkgZWluZW0KKyAgICBiZXN0aW1tdGVuIFZlcmhhbHRlbiB2b24gR2VnZW5zdGFlbmRlbiwgTW9uc3Rlcm4gb2RlciBSYWV1bWVuIHVtCisgICAgZWluZW4gRmVobGVyIGhhbmRlbHQgb2RlciB1bSBBYnNpY2h0IGRlcyBQcm9ncmFtbWllcmVzLCBzbyBrYW5uIGVyCisgICAgZGVuIHp1c3RhZW5kaWdlbiBNYWdpZXIgcHJvYmxlbWxvcyBkYW5hY2ggZnJhZ2VuIHVuZCBzb21pdCBiZWkgZGVyCisgICAgQmVzZWl0aWd1bmcgdm9uIEZlaGxlcm4gYWt0aXYgaGVsZmVuLgorCisgICAgRGFzIFZlcnNjaHdlaWdlbiB1bmQgQXVzbnV0emVuIHZvbiBGZWhsZXJuIGlzdCBhbmRlcmVuIFNwaWVsZXJuCisgICAgZ2VnZW51ZWJlciB1bmZhaXIgdW5kIGlzdCBkYWhlciB6dSB1bnRlcmxhc3Nlbi4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisKKyAgICBHcnVuZHNhZXR6bGljaCBzb2xsdGUgZGVyIFNwaWVsc3Bhc3MgZnVlciBtb2VnbGljaHN0IGFsbGUgU3BpZWxlcgorICAgIGVyaGFsdGVuIGJsZWliZW4uIERhenUgZ2Vob2VydCBhdWNoIGVpbiBnZXdpc3NlcyBNYXNzIGFuIEZhaXJuZXNzCisgICAgZGVyIFNwaWVsZXIgdW50ZXJlaW5hbmRlci4KKworICAgIEVzIGlzdCBuaWNodCBkZXIgU2lubiBkZXIgUmVnZWxuLCBkYXMgU3BpZWxlbiBpbSBNb3JnZW5HcmF1ZW4gZHVyY2gKKyAgICBVZWJlcnJlZ2xlbWVudCB6dSBiZWhpbmRlcm4gb2RlciByZWl6bG9zIHp1IGdlc3RhbHRlbi4KKworICAgIERhaGVyIGlzdCBlcyBqZWRvY2ggYXVjaCBtb2VnbGljaCwgZGFzcyBpbSBTcGllbCBTaXR1YXRpb25lbgorICAgIGF1ZnRyZXRlbiwgZGllIGRlbiBTcGllbHNwYXNzIGFuZGVyZXIgU3BpZWxlciB1bmQgZGllIGFsbGdlbWVpbmUKKyAgICBGYWlybmVzcyBiZWVpbnRyYWVjaHRpZ2VuLCBvaG5lIGRhc3MgZGllc2UgU2l0dWF0aW9uIGR1cmNoIGRpZXNlbgorICAgIExlaXRmYWRlbiBhYmdlZGVja3QgaXN0LgorCisgICAgSGllciBpc3QgamVkZXIgU3BpZWxlciB1bmQgYXVjaCBNYWdpZXIgZ2VmcmFndCwgc2VpbmVuIGdlc3VuZGVuCisgICAgTWVuc2NoZW52ZXJzdGFuZCB6dSBiZWZyYWdlbiB1bmQgenUgdWViZXJsZWdlbiwgd2llIGVyIGVpbmUgc29sY2hlCisgICAgU2l0dWF0aW9uIHZlcm1laWRlbiBvZGVyIGVudHNwYW5uZW4ga2FubiwgYXVjaCB3ZW5uIG1hbiBkYW1pdCBhdWNoCisgICAgZWlubWFsIGF1ZiBlaW5lbiBWb3J0ZWlsIHZlcnppY2h0ZW4gbXVzcy4KKworICAgIEVzIGlzdCBhbHNvIGR1cmNoYXVzIG5pY2h0IGFsbGVzIGVybGF1YnQsIHdhcyBuaWNodCBleHBsaXppdAorICAgIHZlcmJvdGVuIGlzdC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisKKyAgICBGdWVyIE1hZ2llciBnZWx0ZW4gbmF0dWVybGljaCB6dXNhZXR6bGljaCBkaWUgUmVnZWxuIGRlcworICAgIE1hZ2llcnZlcnRyYWdlcy4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisKKyAgICBTb2xsdGUgZWluIFNwaWVsZXIgb2RlciBNYWdpZXIgZ2VnZW4gUmVnZWxuIHZlcnN0b3NzZW4gaGFiZW4sIHNvCisgICAga2FubiBkaWVzIHZvbSBTaGVyaWZmLCBzZWluZW4gRGVwdXRpZXMgb2RlciBkZW4gRXJ6bWFnaWVybiBnZWFobmRldAorICAgIHdlcmRlbi4KKyAgICBTdHJhZmVuIGtvZW5uZW4gc2ljaCB2b24gZWluZXIgZWluZmFjaGVuIFZlcndhcm51bmcgYmlzIGhpbiB6dXIKKyAgICBMb2VzY2h1bmcgdm9uIENoYXJha3RlcmVuIGVyc3RyZWNrZW4uCisKKyAgICBEaWUgU3RyYWZlbiB3ZXJkZW4gaW4gZWluZW0gZ2VzdW5kZW4gVmVyaGFlbHRuaXMgenVtIEZlaGx2ZXJoYWx0ZW4KKyAgICBkZXMgU3BpZWxlcnMgc3RlaGVuLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKworICAgIFdlciBkaWUgRnVua3Rpb24gZGVzIFNoZXJpZmZzIG9kZXIgZWluZXMgRGVwdXRpZXMgd2Focm5pbW10LCBrYW5uCisgICAgbWFuIG1pdCBkZW0gS29tbWFuZG8gJ2hpbGZlIHNoZXJpZmYnIGVyZnJhZ2VuLgorCisKKyBTSUVIRSBBVUNIOgorICAgIHp3ZWl0aWVtYXJraWVydW5nLCBmZWhsZXIsIHNoZXJpZmYKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgV2VkLCAzMC4wOC4yMDAwLCAxMTozNTowMCB2b24gTXVhZGliCisgICAgCmRpZmYgLS1naXQgYS9kb2MvaGVscC9sb2VzY2hza3JpcHQgYi9kb2MvaGVscC9sb2VzY2hza3JpcHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU0YjRiZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9oZWxwL2xvZXNjaHNrcmlwdApAQCAtMCwwICsxLDE4IEBACitLcml0ZXJpZXJlbiBmdWVyIGRhcyBMb2VzY2hza3JpcHQNCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisNCisgICAgRGFzIFNjcmlwdCB6dW0gTG9lc2NoZW4gYWx0ZXIgQ2hhcmFrdGVyZSBsYWV1ZnQgamV3ZWlscyBhbSAyMC4gZWluZXMNCisgICAgTW9uYXRzLg0KKyAgICBDaGFyYWt0ZXJlIHdlcmRlbiBnZWxvZXNjaHQsIHdlbm4gc2llIEFMTEUgZm9sZ2VuZGVuIEJlZGluZ3VuZ2VuDQorICAgIGVyZnVlbGxlbjoNCisNCisgICAgKiA5MCBUYWdlIG5pY2h0IGVpbmdlbG9nZ3QNCisgICAgKiB3ZW5pZ2VyIGFscyAzMCBBYmVudGV1ZXJwdW5rdGUNCisgICAgKiB3ZW5pZ2VyIGFscyAzMDAwMCBFcmZhaHJ1bmdzcHVua3RlDQorICAgICogU3R1ZmUga2xlaW5lciAxMA0KKw0KKyBTSUVIRSBBVUNIOg0KKyAgICBzZWxic3Rsb2VzY2h1bmcsIHNwaWVscGF1c2UNCisNCisgTEVUWlRFIEFlTkRFUlVORzoNCisgICAgMDkuMDMuMjAxMyBaZXNzdHJhDQpkaWZmIC0tZ2l0IGEvZG9jL2hlbHAvbWFnaWVyIGIvZG9jL2hlbHAvbWFnaWVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MzlkYzgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaGVscC9tYWdpZXIKQEAgLTAsMCArMSwxMzAgQEAKKworTUFHSUVSCis9PT09PT0KKworICAgIEluIE1vcmdlbkdyYXVlbiBlcndlaXRlcm4gTWFnaWVyIGRhcyBNVUQuIEF1c3NlcmRlbSBoYWJlbiBzaWUgdmllbGUKKyAgICBNb2VnbGljaGtlaXRlbiwgZGllIFNwaWVsZXIgbmljaHQgaGFiZW4uCisKKyAgICAgV2VyIGthbm4gTWFnaWVyIHdlcmRlbj8KKyAgICAgICAgTWFnaWVyIGthbm4gamVkZXIgd2VyZGVuLCBkZXIgZGllIEFuZm9yZGVydW5nZW4genVyIFNlaGVyLVdlcmR1bmcKKyAgICAgICAgZXJmdWVsbHQ7IHNpZWhlIGRhenUgZGllIEhpbGZlc2VpdGUgJ3NlaGVyJy4KKyAgICAgICAgU29sbCBlaW4gQ2hhcmFrdGVyIE1hZ2llciB3ZXJkZW4sIGRlciBzZWxiZXIga2VpbiBTZWhlciBpc3QsIGFiZXIgZGVyCisgICAgICAgIEVyc3RzcGllbGVyIGRpZXNlcyBTcGllbGVycyBpc3QgU2VoZXIsIGlzdCBkaWVzIG1pdCBHZW5laG1pZ3VuZyBkZXIKKyAgICAgICAgRU1zIG1vZWdsaWNoLiBIaWVyenUgbXVzcyBkZW4gRU1zIChpbiBBYnNwcmFjaGUgbWl0IGRlbSB6dWt1ZW5mdGlnZW4KKyAgICAgICAgU3BvbnNvcikgZWluIEdTLUtvbnplcHQgdm9yZ2VzdGVsbHQgd2VyZGVuIChpbiBkaWVzZW0gRmFsbCBiaXR0ZSAKKyAgICAgICAgYXVjaCBBYnNjaG5pdHQgJ01hZ2llcndlcmR1bmcgbWl0IGVpbmVtIG5pY2h0LVNlaGVyJyB1bnRlbiBiZWFjaHRlbikuCisKKyAgICAgTXVzcyBpY2ggTWFnaWVyIHdlcmRlbj8KKyAgICAgICAgV2VyIGtlaW5lIEx1c3QgaGF0LCBNYWdpZXIgenUgd2VyZGVuIHVuZCBsaWViZXIgbm9jaCBzcGllbGVuIG1vZWNodGUsCisgICAgICAgIGthbm4gbWl0IGRpZXNlbiBWb3JhdXNzZXR6dW5nZW4gU2VoZXIgd2VyZGVuLiBBbHMgU2VoZXIgaGF0IG1hbiBhdWNoCisgICAgICAgIGVpbiBwYWFyIHp1c2FldHpsaWNoZSBGYWVoaWdrZWl0ZW4uCisKKyAgICAgV2llIHdlcmRlIGljaCBNYWdpZXI/CisgICAgICAgIFdlbm4gRHUgZGllIFZvcmF1c3NldHp1bmdlbiBlcmZ1ZWxsc3QsIHVtIE1hZ2llciB6dSB3ZXJkZW4sIG11c3N0IER1CisgICAgICAgIGVpbmVuIE1hZ2llciBmaW5kZW4sIGRlciBEaWNoIHVudGVyc3R1ZXR6dC4gRGllc2VyIE1hZ2llciBzb2xsIGRlbgorICAgICAgICBuZXVlbiBNYWdpZXIgaW4gc2VpbmUgTW9lZ2xpY2hrZWl0ZW4gZWlud2Vpc2VuIHVuZCBmdWVyIEZyYWdlbiBvZmZlbgorICAgICAgICBzZWluLiBELmguIGVzIHNvbGx0ZSBhbSBiZXN0ZW4gZWluIE1hZ2llciBzZWluLCBkZW4gRHUgc2Nob24ga2VubnN0CisgICAgICAgIHVuZCB2b24gZGVtIER1IEhpbGZlIGVyd2FydGVuIGthbm5zdC4KKworICAgICAgICBXZW5uIER1IHNvIGVpbmVuIE1hZ2llciBnZWZ1bmRlbiBoYXN0LCBmcmFnc3QgRHUgaWhuLCBvYiBlciBEaWNoIHp1CisgICAgICAgIGVpbmVtIG5ldWVuIE1hZ2llciBhdXNiaWxkZXQuIFZvbiBkZW0gTWFnaWVyIGJla29tbXN0IER1IGRhbm4gZWluZW4KKyAgICAgICAgVmVydHJhZywgZGVuIER1IHNvcmdmYWVsdGlnIGxlc2VuIHNvbGx0ZXN0LiBXZW5uIER1IGRhbm4gaW1tZXIgbm9jaAorICAgICAgICBNYWdpZXIgd2VyZGVuIHdpbGxzdCwgdW50ZXJzY2hyZWlic3QgRHUgZGVuIFZlcnRyYWcuIERhbmFjaCBnZWhzdCBEdQorICAgICAgICBtaXQgZGVtIFZlcnRyYWcgenUgTWVybGluIChlcnN0bWFsIHN1Y2hlbikgdW5kIGRlciBNYWdpZXIsIHZvbiBkZW0KKyAgICAgICAgRHUgZGVuIFZlcnRyYWcgaGFzdCwgYml0dGV0IE1lcmxpbiwgRGljaCB6dW0gTWFnaWVyIHp1IG1hY2hlbi4KKworICAgICAgICBEYW5hY2ggc29sbHRlc3QgRHUgdm9uIGRlbSBNYWdpZXIgZWluZSBFaW5mdWVocnVuZyBlcmhhbHRlbiwKKyAgICAgICAgZGVzd2VpdGVyZW4gd2lyZCBEaXIgTWVybGluIGVpbiBNYWlsIG1pdCBudWV0emxpY2hlbiBJbmZvcm1hdGlvbmVuCisgICAgICAgIHNjaGlja2VuLgorCisgICAgIFVuZCB3YXMgZGFubj8KKyAgICAgICAgRHUgYmVnaW5uc3QgRGVpbiBNYWdpZXJkYXNlaW4gYWxzIExlaHJsaW5nIChMdiAxNSkuIER1IGhhc3Qgbm9jaCBrZWluCisgICAgICAgIGVpZ2VuZXMgVmVyemVpY2huaXMsIGluIGRlbSBEdSBwcm9ncmFtbWllcmVuIGthbm5zdCwgdW5kIER1IGthbm5zdAorICAgICAgICBhdWNoIG5pY2h0IGluIGFsbGVuIFZlcnplaWNobmlzc2VuIGxlc2VuLiBEdSBrYW5uc3QgRGljaCBhbGxlcmRpbmdzCisgICAgICAgIHNjaG9uIGVpbm1hbCBtaXQgZGVuIEVpbnNjaHJhZW5rdW5nZW4gZGVzIE1hZ2llcmxlYmVucyAoc2llaGUgVmVydHJhZykKKyAgICAgICAgc293aWUgbWl0IGRlciBNdWRMaWIgdmVydHJhdXQgbWFjaGVuLiBEYXp1IGhhc3QgRHUgTGVzZXJlY2h0ZSBpbiBkZW4KKyAgICAgICAgVmVyemVpY2huaXNzZW4gYC9kb2MnLCBgL3N0ZCcsIGAvc2VjdXJlJyB1bmQgYC9zeXMnLgorCisgICAgICAgIFdlbm4gRHUgenUgZGllc2VtIFplaXRwdW5rdCBlcmtlbm5zdCwgZGFzcyBkZXIgTWFnaWVyc3RhdHVzIHdvaGwgZG9jaAorICAgICAgICBuaWNodHMgZnVlciBEaWNoIGlzdCwga2FubnN0IER1IERpY2ggaW1tZXIgbm9jaCBhbiBlaW5lbiBFcnptYWdpZXIKKyAgICAgICAgd2VuZGVuLCBkYW1pdCBlciBEaWNoIHdpZWRlciB6dW0gU3BpZWxlciBtYWNodC4gSGllcm1pdCBzb2xsdGVzdCBEdQorICAgICAgICBqZWRvY2ggbmljaHQgenVsYW5nZW4gd2FydGVuLCBkYSBoaWVyenUgZWluZSBhZWx0ZXJlIEtvcGllIERlaW5lcworICAgICAgICBlaGVtYWxpZ2VuIFNwaWVsZXJzIG5vZXRpZyBpc3QuCisKKyAgICAgICAgV2VubiBEdSBhbGxlcmRpbmdzIG1lcmtzdCwgZGFzcyBEdSBnZXJuZSBldHdhcyBwcm9ncmFtbWllcmVuIG1vZWNoLQorICAgICAgICB0ZXN0LCBkYW5uIG1lbGRlIERpY2ggKG1pdCBtYWlsIGVyem1hZ2llcikgdW50ZXIgQW5nYWJlIGVpbmVzIGt1cnplbgorICAgICAgICBBYnJpc3Nlcywgd2llIER1IERlaW5lbiB3ZWl0ZXJlbiBXZXJkZWdhbmcgYWxzIE1hZ2llciB2b3JzdGVsbHN0IGJlaQorICAgICAgICBkZW4gRXJ6bWFnaWVybiwgZGFtaXQgc2llIERpY2ggYXVmIGRpZSBuYWVjaHN0ZSBNYWdpZXJzdHVmZSAoTHYgMjApCisgICAgICAgIGJlZm9lcmRlcm4uIERpZSBCZWFyYmVpdHVnbnN6ZWl0IGRpZXNlciBNYWlsIGxpZWd0IGJlaSBlaW4gYmlzIHp3ZWkKKyAgICAgICAgV29jaGVuLiBBdWYgZGllc2VyIFN0dWZlIGJla29tbXN0IER1IGVpbiBlaWdlbmVzIFZlcnplaWNobmlzIHNhbXQKKyAgICAgICAgV29ya3Jvb20sIHVuZCBEdSBrYW5uc3QgRGVpbmUgZXJzdGVuIGVpZ2VuZW4gUHJvZ3JhbW1pZXJ2ZXJzdWNoZQorICAgICAgICBzdGFydGVuLgorCisgICAgICAgIFdlbm4gRHUgYXVjaCBuYWNoIERlaW5lbiBlcnN0ZW4gbWVociBvZGVyIHdlbmlnZXIgZXJmb2xncmVpY2hlbgorICAgICAgICBQcm9ncmFtbWllcnZlcnN1Y2hlbiBub2NoIGltbWVyIG5pY2h0IGRpZSBGbGludGUgaW5zIEtvcm4gZ2V3b3JmZW4KKyAgICAgICAgaGFzdCwgZGFubiBzb2xsdGVzdCBEdSBEaXIgZWlubWFsIEdlZGFua2VuIGRhcnVlYmVyIG1hY2hlbiwgd2FzIER1CisgICAgICAgIGltIE1vcmdlbkdyYXVlbiBnZW5hdSBwcm9ncmFtbWllcmVuIG1vZWNodGVzdC4gRGVyIHp1c3RhZW5kaWdlCisgICAgICAgIFJlZ2lvbnNtYWdpZXIgd2lyZCBEaWNoIGJlaSBkZXIgQXVzYXJiZWl0dW5nIERlaW5lcyBLb256ZXB0ZXMgZ2VybmUKKyAgICAgICAgYmVyYXRlbi4gQmV2b3IgRHUgYW5mYWVuZ3N0IHp1IHByb2dyYW1taWVyZW4sIHNvbGx0ZXN0IER1IG1pdAorICAgICAgICBEZWluZW0gZ2VuYXVlbiBLb256ZXB0IG5vY2ggZWlubWFsIGJlaSBlaW5lbSB6dXN0YWVuZGlnZW4KKyAgICAgICAgRXJ6bWFnaWVyIG5hY2hmcmFnZW4sIG9iIGVzIGFscyBHZXNlbGxlbnN0dWVjayBhdXNyZWljaHQuCisKKyAgICAgICAgU29iYWxkIERlaW4gUmVnaW9uc21hZ2llciB1bmQgRHUgZGVyIE1laW51bmcgc2VpZCwgZGFzcyBEZWluZQorICAgICAgICBTYWNoZW4gZmVydGlnIHNpbmQsIGtvZW5udCBJaHIgRXVjaCBkYW1pdCBhbiBlaW5lbiBkZXIgZnVlcgorICAgICAgICBkaWUgQWJuYWhtZSB2b24gR2VzZWxsZW5zdHVlY2tlbiB6dXN0YWVuZGlnZW4gRXJ6bWFnaWVyIChzaWVoZQorICAgICAgICBIaWxmZSBFcnptYWdpZXIpIHdlbmRlbi4gRGllc2VyIHdpcmQgc2ljaCBEZWluZSBBcmJlaXQgYW5zZWhlbiB1bmQKKyAgICAgICAgZGFubiBlbnRzY2hlaWRlbiwgb2Igc2llIGZ1ZXIgZWluIEdlc2VsbGVuc3R1ZWNrIGltIE1vcmdlbkdyYXVlbgorICAgICAgICBhdXNyZWljaGVuZCBpc3QuIEJlYWNodGUgYml0dGUsIGRhc3Mgdm9yIGVpbmVyIHNvbGNoZW4gR2VuZWhtaWd1bmcKKyAgICAgICAgZHVyY2ggZGllIHp1c3RhZW5kaWdlbiBFcnptYWdpZXIgdm9uIERpciBub2NoIGtlaW5lIE9iamVrdGUKKyAgICAgICAgdW50ZXIgZWlnZW5lbSBOYW1lbiBhbmdlc2NobG9zc2VuIHdlcmRlbiBrb2VubmVuL2R1ZXJmZW4uCisKKyAgICAgICAgU29mZXJuIER1IGRpZSBSZWdlbG4gZnVlciBHZXNlbGxlbnN0dWVja2UgZXJmdWVsbHQgaGFzdCwgd2lyZCBEaWNoCisgICAgICAgIGRlciB6dXN0YWVuZGlnZSBFcnptYWdpZXIgenUgZWluZW0gVm9sbG1hZ2llciBtYWNoZW4uIEVyc3QgZGFubgorICAgICAgICBrYW5uc3QgRHUgYXVjaCBpbiBhbmRlcmVuIFRlaWxlbiBkZXIgTXVkTGliIGVpbmVuIEJsaWNrIGluIGRlbgorICAgICAgICBRdWVsbGNvZGUgYW5kZXJlciBNYWdpZXIgd2VyZmVuLiBBdXNzZXJkZW0gYmVrb21tc3QgRHUgZWluIGVpZ2VuZXMKKyAgICAgICAgVmVyemVpY2huaXMgaW4gZGVyIFJlZ2lvbiwgaW4gZGVyIER1IG1pdGFyYmVpdGVuIG1vZWNodGVzdC4gRG9ydAorICAgICAgICBrYW5uc3QgRHUgRGVpbmUgU2FjaGVuIGF1c2dpZWJpZyB0ZXN0ZW4gdW5kIHNwYWV0ZXIgZGFubiBhdWNoIHZvbgorICAgICAgICBEZWluZW0gUmVnaW9uc21hZ2llciBhbnNjaGxpZXNzZW4gbGFzc2VuLgorCisKK01hZ2llcndlcmR1bmcgbWl0IGVpbmVtIG5pY2h0LVNlaGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAqIERpZSBCZXJ1ZnVuZyBlaW5lcyBuaWNodC1TZWhlci1DaGFyYWt0ZXJzIHp1bSBNYWdpZXIgaXN0IG1vZWdsaWNoLAorICAgICAgICBzb2Zlcm4gZGVyIGJldHJlZmZlbmRlIFJMLVNwaWVsZXIgYmVyZWl0cyBlaW5lbiBTZWhlciBoYXQuCisgICAgICAqIERpZSBCZXJ1ZnVuZyBlaW5lcyBzb2xjaGVuIENoYXJha3RlcnMgenVtIE1hZ2llciBpc3QgbnVyIGluIEFic3ByYWNoZQorICAgICAgICBtaXQgZGVuIEVNcyBtb2VnbGljaC4gQmVpIGtvbmtyZXRlbiBBbmZyYWdlbiBhbiBFTXMgbXVzcyBlaW5lIGVyc3RlIAorICAgICAgICBJZGVlIGFuZ2VnZWJlbiB3ZXJkZW4sIHdhcyBtYW4gc2ljaCBhbHMgR1Mgdm9yc3RlbGx0LgorICAgICAgKiBFaW4gdmVybnVlbmZ0aWdlcywgZC5oLiB6dXN0aW1tdW5nc2ZhZWhpZ2VzIEtvbnplcHQgbXVzcyBfdm9yXworICAgICAgICBNYWdpZXJ3ZXJkdW5nIGRlbiBFTXMgdm9yZ3N0ZWxsdCB3ZXJkZW4uLiBBbiBkaWVzZXMgd2VyZGVuIGRpZSBzb25zdAorICAgICAgICB1ZWJsaWNoZW4gQW5mb3JkZXJ1bmdlbiBiemdsLiBVbWZhbmcgdW5kIEtvbXBsZXhpdGFldCBnZXN0ZWxsdC4gRGFzCisgICAgICAgIEtvbnplcHQgd2lyZCB2b24gRU1zIGdlbmVobWlndCwgYmV2b3IgZGllIEJlcnVmdW5nIHp1bSBNYWdpZXIKKyAgICAgICAgZXJmb2xndC4KKyAgICAgICogTmFjaCBTcG9uc29ybiBkZXMgQ2hhcmFrdGVycyBlbnRmYWVsbHQgZGllIHNvbnN0IHVlYmxpY2hlIFdhcnRlemVpdAorICAgICAgICB2b24gMS0yIFdvY2hlbiAod2VpbCBkaWUgRU1zIGphIHZvcmhlciB6dWdlc3RpbW10IGhhYmVuKSB1bmQgZGVyCisgICAgICAgIENoYXIga2FubiBkaXJla3QgYXVmIExldmVsIDIwIGJlZm9lcmRlcnQgd2VyZGVuLgorICAgICAgKiBEYXMgR1MgbXVzcyBpbm5lcmhhbGIgdm9uIDYgTW9uYXRlbiBuYWNoIE1hZ2llcndlcmR1bmcgZmVydGlnZ2VzdGVsbHQgCisgICAgICAgIHdlcmRlbi4KKyAgICAgICAgRGllIEZlcnRpZ3N0ZWxsdW5nIGlzdCBkZWZpbmllcnQgYWxzIEVpbnJlaWNodW5nIGFuIGRlbiBSTSB6dXIgCisgICAgICAgIEFibmFobWUuCisgICAgICAgIERpZXMgZGFyZiBuYXR1ZXJsaWNoIGtlaW5lIHByby1mb3JtYSBFaW5yZWljaHVuZyB2b24gaGFsYmZlcnRpZ2VtIAorICAgICAgICBaZXVncyBzZWluLgorICAgICAgKiBFaW5lIFZlcmxhZW5nZXJ1bmcgZGllc2VyIEZyaXN0IGthbm4gZHVyY2ggZWluZW4gdm9uIGRlbiBFTXMgYmUtCisgICAgICAgIG5hbm50ZW4gRU0gKGlkUiBFTSBHZXNlbGxlbnN0dWVja2UpIGdlbmVobWlndCB3ZXJkZW4sIHNvZmVybiBpaG0KKyAgICAgICAgZGllcyBzaW5udm9sbCBlcnNjaGVpbnQgKCJiZWdydWVuZGV0ZSBGYWVsbGUiLCBmYXN0IGZlcnRpZywgZXRjLikuCisgICAgICAgIEluIFp3ZWlmZWxzZmFlbGxlbiB3aXJkIGRpZSBWZXJsYWVuZ2VydW5nIHZvbiBkZW4gRU1zIGRpc2t1dGllcnQuCisgICAgICAqIE11c3MgZGFzIEdTIG5hY2ggQWJuYWhtZSBkdXJjaCBkZW4gUk0gdW5kL29kZXIgZGVuIEVNIEdlc2VsbGVuc3R1ZWNrZQorICAgICAgICBuYWNoZ2ViZXNzZXJ0IHdlcmRlbiwgc29sbHRlIGRpZXNlcyBpbm5lcmhhbGIgdm9uIDIgTW9uYXRlbiBnZXNjaGVoZW4uCisgICAgICAgIFZlcmxhZW5nZXJ1bmdlbjogcy5vLgorICAgICAgKiBCZWkgTmljaHQtRWluaGFsdHVuZyBkZXIgRnJpc3QgZXJmb2xndCBkaWUgTG9lc2NodW5nIGRlcyBDaGFyYWt0ZXJzIAorICAgICAgICBvZGVyIERhdWVyc3BpZWxwYXVzZW4gYXVmIE1hZ2llcmxldmVsIDE1LgorICAgICAgKiBEZXIgU3BpZWxlciB1bnRlcmxpZWd0IGF1Y2ggbmFjaCBMb2VzY2h1bmcgZGVtIE1hZ2llcnZlcnRyYWcgaW5zb2Zlcm4sCisgICAgICAgIGFscyBkYXNzIGVyIHVlYmVyIGV0d2FpZ2UgYWxzIE1hZ2llciBnZXdvbm5lbmUgSW50ZXJuYSB2b24gbmljaHQtCisgICAgICAgIG9lZmZlbnRsaWNoZW0gQ29kZSBTdGlsbHNjaHdlaWdlbiB6dSB3YWhyZW4gaGF0LgorCisgU0lFSEUgQVVDSDoKKyAgICBzdHVmZW4sIG1hZ2llcnN0dWZlbiwgYWJlbnRldWVyLCBrb256ZXB0LCBnZXNlbGxlbnN0dWVjaworICAgIHNlaGVyLCByZWdpb25lbiwgZ2lsZGVubWFnaWVyLCBlcnptYWdpZXIsIGdvZXR0ZXIKKworIExFVFpURSBBZU5ERVJVTkc6IDIwMTUtMDUtMzAgdm9uIFpvb2sKKwpkaWZmIC0tZ2l0IGEvZG9jL2hlbHAvbWFnaWVyc3R1ZmVuIGIvZG9jL2hlbHAvbWFnaWVyc3R1ZmVuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNmM4YjMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaGVscC9tYWdpZXJzdHVmZW4KQEAgLTAsMCArMSw2OCBAQAorbWFnaWVyc3R1ZmVuCis9PT09PT09PT09PT0KKworICAgIEVzIGdpYnQgdmVyc2NoaWVkZW5lIE1hZ2llcnN0dWZlbiwgZGllIGJlc3RpbW10ZSBSZWNodGUgdW5kIFBmbGljaHRlbiBtaXQKKyAgICBzaWNoIGJyaW5nZW4uIFVlYmxpY2hlcndlaXNlIHNpbmQgZGllIGVudHNwcmVjaGVuZGVuIE1hZ2llciBvZnQgYXVjaCBlaW4KKyAgICBwYWFyIExldmVsIGhvZWhlciAoc28gaXN0IGVpbiBHb3R0IHVlYmxpY2hlcndlaXNlIExldmVsIDExMSksIGRpZXMgc2luZAorICAgIGRpZSBHcmVuemVuLCBhYiB3byBkaWUgQmV6ZWljaG51bmcgYnp3LiBkaWUgUmVjaHRlIGltIGJlc2NocmllYmVuZW4gCisgICAgVW1mYW5nIGd1ZWx0aWcgc2luZDoKKworICAgIExldmVsIDEwMAktLS0JR290dAorCQlFcm5lbm50IEVyem1hZ2llciwga2xhZXJ0IHNjaHdlcndpZWdlbmRlIFByb2JsZW1lLCB0cmFlZ3QgZGllCisJCUxhc3QgZGVyIFZlcmFudHdvcnR1bmcuCisJCVZvbGxlIFNjaHJlaWJyZWNodGUuCisKKyAgICBMZXZlbCA2MAktLS0JRXJ6bWFnaWVyCisJCVNpbmQgZnVlciB2ZXJzY2hpZWRlbmUgcHJha3Rpc2NoZSBBdWZnYWJlbmdlYmlldGUgd2llCisJCShHaWxkZW5iYWxhbmNlKSwgTXVkbGliIG9kZXIgR2VzZWxsZW5zdHVlY2tlIHZlcmFudHdvcnRsaWNoLgorCQlWb2xsZSBTY2hyZWlicmVjaHRlLgorCisgICAgTGV2ZWwgNTAJLS0tCVdlaXNlCisJCUJlYXJiZWl0ZW4gZWluIHNwZXppZWxsZXMgVGhlbWEuCisJCVZvbGxlIFNjaHJlaWJyZWNodGUgYmlzIGF1ZiBkaWUgTXVkbGliLgorCisgICAgTGV2ZWwgNDAJLS0tCVJlZ2lvbnNtYWdpZXIKKwkJU2luZCBmdWVyIGVpbmUgb2RlciBtZWhyZXJlIFJlZ2lvbmVuIHp1c3RhZW5kaWcgdW5kIGhhYmVuCisJCWRvcnQgdm9sbGUgU2NocmVpYnJlY2h0ZS4gRXJuZW5udCBSZWdpb25zbWl0YXJiZWl0ZXIuCisKKyAgICBMZXZlbCAzMAktLS0JSGlsZnNtYWdpZXIKKwkJS3VlbW1lcm4gc2ljaCB1bSBEb2t1bWVudGF0aW9uIG9kZXIgYW5kZXJlIFNwZXppYWxhdWZnYWJlbiwKKwkJaGFiZW4gZGFmdWVyIGltIERva3VtZW50YXRpb25zYmVyZWljaCB2b2xsZSBTY2hyZWlicmVjaHRlLgorCisgICAgTGV2ZWwgMjYgICAgLS0tICAgICBSZWdpb25zbWl0YXJiZWl0ZXIKKyAgICAgICAgICAgICAgICBXaWUgTGV2ZWwgMjUsIGRhcmYgenVzYWV0emxpY2ggc2VsYnN0IE5ldW1hZ2llciBiZXJ1ZmVuLgorCQlXaXJkIHZvbSBSZWdpb25zbWFnaWVyIHZlcmxpZWhlbiwgZnVlciBNYWdpZXIsIGRlbmVuIGRpZXNlCisJCVZlcmFudHdvcnR1bmcgenVnZXRyYXV0IHdlcmRlbiBrYW5uLgorCisgICAgTGV2ZWwgMjUJLS0tCVJlZ2lvbnNtaXRhcmJlaXRlcgorCQlBcmJlaXRldCBpbiBlaW5lciAob2RlciBtZWhyZXJlbikgUmVnaW9uZW4gbWl0IHVuZCBoYXQgZG9ydAorCQlhdWYgc2VpbiBWZXJ6ZWljaG5pcyB2b2xsZSBTY2hyZWlicmVjaHRlLgorCisgICAgTGV2ZWwgMjEJLS0tCVZvbGxtYWdpZXIKKwkJTWVpc3QgZWluIFVlYmVyZ2FuZ3N6dXN0YW5kLCB3ZW5uIGRhcyBHZXNlbGxlbnN0dWVjaworCQlha3plcHRpZXJ0IGFiZXIgaW4ga2VpbmVyIFJlZ2lvbiBhbmdlc2NobG9zc2VuIGlzdC4KKwkJU2NocmVpYnJlY2h0ZSBpbSBlaWdlbmVuIFZlcnplaWNobmlzLgorCQlMZXNlcmVjaHRlIGluIGFsbGVuIEdlYmlldGVuIHVuZCBkZXIgTXVkbGliLCBtaXQgZ2V3aXNzZW4KKwkJQXVzbmFobWVuLgorCisgICAgTGV2ZWwgMjAJLS0tCUxlaHJsaW5nCisJCVNjaHJlaWJ0IHNlaW4gR2VzZWxsZW5zdHVlY2sgKG9kZXIgc29sbHRlIGVzIHR1bikuCisJCVNjaHJlaWJyZWNodGUgaW0gZWlnZW5lbiBWZXJ6ZWljaG5pcy4KKwkJS2VpbmUgTGVzZXJlY2h0ZSBpbiBSZWdpb25lbiwgTWFnaWVyLSBvZGVyIEdpbGRlbi0KKwkJdmVyemVpY2huaXNzZW4uCisKKyAgICBMZXZlbCAxNQktLS0JTGVocmxpbmcvTmV1bWFnaWVyCisJCUF1ZiBkaWVzZW0gTGV2ZWwga2FubiBtYW4gaW4gZGVyIERva3VtZW50YXRpb24gdW5kIGluIGRlcgorCQlNdWRsaWIgc3RvZWJlcm4gdW5kIHNpY2ggbWl0IGRlbSBNYWdpZXJkYXNlaW4gdmVydHJhdXQKKwkJbWFjaGVuLiBEaWVzZW4gTGV2ZWwgZXJoYWVsdCBtYW4gZGlyZWt0IG5hY2ggZGVyCisJCU1hZ2llcndlcmR1bmcuCisJCUJlaSBBbm5haG1lIGRlcyBLb256ZXB0ZXMgZnVlciBkYXMgR2VzZWxsZW5zdHVlY2sgZXJmb2xndAorCQlCZWZvZXJkZXJ1bmcgYXVmIExldmVsIDIwLgorCQlLZWluZSBTY2hyZWlicmVjaHRlLgorCisgU0lFSEUgQVVDSDoKKyAgICBtYWdpZXIsIHN0dWZlbiwgdmVydHJhZworICAgIHNlaGVyLCByZWdpb25lbiwgZ2lsZGVubWFnaWVyLCBlcnptYWdpZXIsIGdvZXR0ZXIKKworIExFVFpURSBBZU5ERVJVTkc6CisJMjUuMDEuMjAwNiB2b24gSHVtbmkKZGlmZiAtLWdpdCBhL2RvYy9oZWxwL21lcmxpbiBiL2RvYy9oZWxwL21lcmxpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGViZTc4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2hlbHAvbWVybGluCkBAIC0wLDAgKzEsMTMgQEAKKworTWVybGluCis9PT09PT0KKworTWVybGluIGlzdCBkZXIgVWViZXJ2YXRlciBhbGxlciBNYWdpZXIuIEVyIGlzdCBhdWNoIHp1c3RhZW5kaWcsCitmYWxscyBlaW4gU3BpZWxlciBNYWdpZXIgb2RlciBTZWhlciB3ZXJkZW4gbW9lY2h0ZS4gU3ByaWNoIGlobgorZWluZmFjaCBlaW5tYWwgZGFyYXVmIGFuLgorCitEYW5lYmVuIGlzdCBlciBhdWNoIHJlaWNobGljaCB0dWV0dGVsaWcgdW5kIHZlcmdpc3N0IG1hbmNobWFsLAord28gZXIgc2ljaCBiZWZpbmRldC4uLi4KKworCitMRVRaVEUgQWVOREVSVU5HOiAyMDA2LTAyLTIxIHZvbiBab29rLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9oZWxwL211ZHJlY2huZXIgYi9kb2MvaGVscC9tdWRyZWNobmVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMzEwMGUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaGVscC9tdWRyZWNobmVyCkBAIC0wLDAgKzEsMzEgQEAKK0RlciBNdWRyZWNobmVyCis9PT09PT09PT09PT09PQorCisgICAgIERhcyBNdWQgbGFldWZ0IHNlaXQgMjEuIEZlYiAyMDEwIGF1ZjoKKyAgICAgLSBEZWxsIDI5NTAgbWl0IDIgTmV0enRlaWxlbgorICAgICAtIDIgKiBYRU9OIDU0MjAgMi41R0h6LCA4R0IgUkFNLCA3MEdCIChSQUlEMSkgT1MsIDUwMCBHQiAoUkFJRDEpIERhdGVuCisgICAgIHVuZCBpc3QgdWViZXIKKyAgICAgIC0gMUdCIEV0aGVybmV0IChleHRlcm4gMUdCKQorICAgICBhbiBkYXMgSW50ZXJuZXQgYW5nZXNjaGxvc3Nlbi4KKworICAgICBVbnRlciBkZXIgQWRyZXNzZSBtZy5tdWQuZGUgc2luZCBlYmVuZmFsbHM6CisgICAgICBzdHVubmVsOiAgLSB6dXIgVmVyc2NobHVlc3NlbHVuZyBkZXIgVmVyYmluZHVuZyBtaXQgZGVtIE1VRAorICAgICAgRlRQOiAgICAgIC0gYW5vbnltCisgICAgICAgICAgICAgICAgICAtIHp1bSBIb2NobGFkZW4gdm9uIFBhcnR5YmlsZGVybgorICAgICAgICAgICAgICAgICAgLSB6dW0gWnVncmlmZiBhdWYgU29mdHdhcmUgKGlua2x1c2l2ZSBha3R1ZWxsZXIgTXVkbGliKQorICAgICAgICAgICAgICAgIC0gbWl0IE1hZ2llcm5hbWUvUGFzc3dvcnQKKyAgICAgICAgICAgICAgICAgIC0genVtIFp1Z3JpZmYgYXVmIGRhcyBlaWdlbmUgVmVyemVpY2huaXMgaW0gTVVECisgICAgICBnaXQ6ICAgICAgLSBtaXQgaGludGVybGVndGVtIFNjaGx1ZXNzZWwgKGZ1ZXIgTWFnaWVyKQorICAgICAgICAgICAgICAgICAgLSB6dW0gWnVncmlmZiBhdWYgc2FlbXRsaWNoZSBmcmVpZW4vZWlnZW5lbiBnaXQtUmVwb3NpdG9yaWVzCisgICAgICBXV1c6ICAgICAgLSBkaWUgV2Vic2VpdGVuIGRlcyBNRworICAgICB6dSBlcnJlaWNoZW4uCisKKyBTSUVIRSBBVUNIOgorICAgbGFnLCBpcmMsIHN0dW5uZWwsIHRlYW1zcGVhaywgY2xpZW50LCB3d3cKKworIEhJU1RPUlk6CisgICAgICBSZWNobmVyIGJpcyAyMS4gRmViIDIwMTAsIChTdGFuZCAwOC4gQXByaWwgMjAwNCk6CisgICAgICAtIFhlb24gQ1BVIDIuNDBHSHogMTAyNE1CIFJBTSwgMzYgKyA3MCBHQiBQbGF0dGVucGxhdHogKFNDU0kpCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgICA4LiBOb3YgMjAxMiBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL2hlbHAvcGFydGllcyBiL2RvYy9oZWxwL3BhcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJkODcxOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9oZWxwL3BhcnRpZXMKQEAgLTAsMCArMSwyOCBAQAorCitQYXJ0aWVzIGRlcyBNb3JnZW5ncmF1ZW4KKz09PT09PT09PT09PT09PT09PT09PT09PQorCisgS09NTUFORE9TOgorICAgICBhbm1lbGRlbgorCisgQkVTQ0hSRUlCVU5HOgorICAgICBNaXQgZGllc2VuIEtvbW1hbmRvIG1lbGRldCBtYW4gc2ljaCBhbiBlaW5lbSBQYXJ0eWJyZXR0IHp1IGVpbmVyIGRlcgorICAgICByZWdlbG1hZXNzaWcgc3RhdHRmaW5kZW5kZW4gUGFydGllcyBkZXIgTW9yZ2VuZ3JhdWVuIE11ZGRlciBhbi4gRG9ydAorICAgICBkYXJmIG1hbiBkYW5uIGRlbSBQcm90emVuIHdlbHRlcmZhaHJlbmVyIFNwaWVsZXIsIGRlbiBBdWZzY2huZWlkZW4KKyAgICAgc2Nob24gbGFuZ2UgbmljaHQgbWVociBzcGllbGVuZGVyIFNlaGVyLCBkZW4gdmFnZW4gQW5kZXV0dW5nZW4gZGVyCisgICAgIE1hZ2llciB1bmQgc29uc3RpZ2VuIFByYWhsZXJlaWVuIGJlaSBnZXBmbGVndGVtIEFsa29ob2xrb25zdW0gdW5kIGltbWVyCisgICAgIHVudGVyIGRlciBBdWZzaWNodCBlaW5lcyBFcnptYWdpZXJzIGZ1ZXIgU2l0dGxpY2hrZWl0IGxhdXNjaGVuLgorICAgICBXaXJrbGljaCB3aWNodGlnZSBEZXRhaWxzIGtvZW5uZW4gdm9uIGRpciB0aGVtYXRpc2llcnQgd2VyZGVuLgorCisgICAgIE9ydCwgWmVpdCB1bmQgS29zdGVuIGRlciBkZW1uYWVjaHN0IHN0YXR0ZmluZGVuZGVuIFBhcnR5IGthbm4gbWFuIGluCisgICAgIGRlciBNUEEsIHJ1YnJpayAicGFydHkiIG9kZXIgaW0gV2ViIHVudGVyCisgICAgICAgaHR0cHM6Ly9tZy5tdWQuZGUvcmVhbHdvcmxkL3BhcnR5LnNodG1sCisgICAgIGVyZmFocmVuLgorCisgICAgIGVyZmFocmVuLgorCisgU0lFSEUgQVVDSDoKKyAgICAgdmVyZWluLCBtYWdpZXIKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgIDIyLiBNYWVyeiAyMDA0IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvaGVscC9wb3N0IGIvZG9jL2hlbHAvcG9zdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjEwYjU2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2hlbHAvcG9zdApAQCAtMCwwICsxLDE4MiBAQAorRGFzIFBvc3RzeXN0ZW0KKz09PT09PT09PT09PT09CisKKyAgICBJbSBNdWQgZ2lidCBlcyBhdWNoIGRpZSBNb2VnbGljaGtlaXQsIGFuZGVyZW4gU3BpZWxlcm4gUG9zdCB6dSBzZW5kZW4uCisgICAgQW5kZXJzIGFscyBiZWkgZGVyIEJ1bmRlc3Bvc3Qgc2luZCBhYmVyIHdlZGVyIEJyaWVmZSBub2NoIFBvc3RrYXJ0ZW4gaW0KKyAgICBNdWQgZnJlaW1hY2h1bmdzcGZsaWNodGlnLgorCisgICAgTWFuIGdlaHQgZWluZmFjaCBpbiBlaW5lIGRlciBQb3N0ZmlsaWFsZW4gdW5kIHRpcHB0IGBwb3N0JyBvZGVyIGBtYWlsJywgdW0KKyAgICBpbiBkYXMgUG9zdG1lbnVlIHp1IGdlbGFuZ2VuLiBEYXMgUG9zdG1lbnVlIGdpYnQgYXVmIGBoJyAob2RlciBgaGlsZmUnKQorICAgIGVpbmUga3VyemUgSGlsZnNzZWl0ZSBtaXQgZWluZXIgQmVmZWhsc3VlYmVyc2ljaHQuCisKKyAgICBXaWxsIG1hbiBuYWNoICdwb3N0JyBvZGVyICdtYWlsJyBuaWNodCBkaWUgaW0gRm9sZGVyIGVudGhhbHRlbmVuIE1haWxzCisgICAgYXVmZ2VsaXN0ZXQgYmVrb21tZW4sIHNvIG51dHplIG1hbiBzdGF0dGRlc3NlbiAncG9zdCAtc2lsZW50JyBvZGVyCisgICAgJ21haWwgLXNpbGVudCcuCisKKyBJbmhhbHRzdmVyemVpY2huaXMgZGllc2VyIEhpbGZzc2VpdGU6CisKKyAgICAxLiBNYWlsIHNjaHJlaWJlbgorICAgIDIuIE1haWwgbmFjaCB1bmQgdm9uIGF1c3NlcmhhbGIgZGVzIE11ZHMKKyAgICAzLiBNYWlsYWxpYXNlCisgICAgNC4gTWFpbCBsZXNlbiwgYmVhbnR3b3J0ZW4sIGxvZXNjaGVuIHVuZCB3ZWl0ZXJzZW5kZW4gLSBkaWUgYW5kZXJlbgorICAgICAgIE1lbnVlcHVua3RlIGltIFBvc3RtZW51ZQorICAgIDUuIE9yZG5lciAoZm9sZGVycykKKyAgICA2LiBOYWNoc2VuZGVhdWZ0cmFlZ2UgKC5mb3J3YXJkKQorICAgIDcuIFBha2V0cG9zdAorICAgIDguIEFic2VuZGVyIGlnbm9yaWVyZW4KKworIDEuIE1haWwgc2NocmVpYmVuOgorICAgIEdydW5kc2FldHpsaWNoIGdpYnQgZXMgendlaSBNb2VnbGljaGtlaXRlbjogRW50d2VkZXIgaW5uZXJoYWxiIGRlcworICAgIFBvc3RtZW51ZXMgYG0gPG5hbWU+Jywgb2RlciBhYmVyIG1hbiBydWZ0IGRpcmVrdCBtaXQgYG1haWwgPG5hbWU+JyBkYXMKKyAgICBTY2hyZWliZW4gYXVmIHVuZCBsYW5kZXQgZGFubiBuYWNoIEJlZW5kaWd1bmcgaW0gTWVudWUuCisKKyAgICBNYW4gd2lyZCB6dW5hZWNoc3QgbmFjaCBkZXIgVWViZXJzY2hyaWZ0IGdlZnJhZ3QgdW5kIGdpYnQgZGFubiBkZW4gVGV4dAorICAgIGVpbi4gRGllIEVpbmdhYmUgdmVyd2VuZGV0IGVpbmVuIGVpbmZhY2hlbiBFZGl0b3IgbWl0IGVpbmlnZW4KKyAgICBydWRpbWVudGFlcmVuIEVkaXRvcmZ1bmt0aW9uZW4sIGVpbmUgZWlnZW5lIEhpbGZzc2VpdGUgaXN0IG1pdCBgfmgnCisgICAgYWJ6dWZyYWdlbi4KKyAgICBVZWJlcmxhbmdlIFplaWxlbiB3ZXJkZW4gYXVmIDc4IFplaWNoZW4gcHJvIFplaWxlIHVtZ2Vicm9jaGVuLCBtYW4ga2FubgorICAgIGFsc28gZ2V0cm9zdCBhdWNoIGxhbmdlIFRleHRlIGFtIFN0dWVjayBzY2hyZWliZW4uCisKKyAgICBCZWVuZGV0IHdpcmQgZGllIEVpbmdhYmUgbWl0IGAuJyBvZGVyIGAqKicgKGFscyBlaWdlbmUgWmVpbGUgZWluZ2ViZW4pIHVuZAorICAgIHdpcmQgZGFubiBuYWNoIENDJ3MgZ2VmcmFndC4gQ0MgYmVkZXV0ZXQgYGNhcmJvbiBjb3B5JywgYWxzbyBEdXJjaHNjaGxhZy4KKyAgICBNYW4ga2FubiBqZXR6dCBlaW5lbiBvZGVyIG1laHJlcmUgZHVyY2ggS29tbWEgb2RlciBMZWVyemVpY2hlbiBnZXRyZW5udGUKKyAgICBOYW1lbiBhbmdlYmVuLCBhbiBkaWUgZGVyIEJyaWVmIHp1c2FldHpsaWNoIHp1bSBlaWdlbnRsaWNoZW4gRW1wZmFlbmdlcgorICAgIGdlc2VuZGV0IHdpcmQuCisKKyAgICBNYWlsIGFuIG1laHJlcmUgUGVyc29uZW46CisgICAgTWFuIGthbm4gZ2xlaWNoIGJlaW0gQXVmcnVmIG1laHJlcmUgTmFtZW4gZHVyY2ggS29tbWEgb2RlciBMZWVyemVpY2hlbgorICAgIGdldHJlbm50IGFuZ2ViZW4sIG9kZXIgZGllIGFuZGVyZW4gYWxzIGNjLiBBdWNoIGVpbmUgS29tYmluYXRpb24gaXN0CisgICAgZXJsYXVidC4gR2lidCBtYW4gbWVociBhbHMgZWluZW4gTmFtZW4gYWxzIEVtcGZhZW5nZXIgYW4sIHNvIGdpbHQgZGVyCisgICAgZXJzdGUgYWxzIEVtcGZhZW5nZXIsIGRpZSByZXN0bGljaGVuIGJla29tbWVuIGNjJ3MuCisKKyAgICBCbGluZCBDYXJib24gQ29waWVzIChCQ0MpOgorICAgIFNldHp0IG1hbiB2b3IgZWluZW4gTmFtZW4gZWluIGAtJywgc28gd2lyZCBkZXIgQnJpZWYgYXVjaCBhbiBkaWVzZSBBZHJlc3NlCisgICAgZ2VzZW5kZXQsIGFiZXIgZGllIEFkcmVzc2Ugc3RlaHQgbmljaHQgaW0gVmVydGVpbGVyLgorICAgICpBY2h0dW5nOiogRGVyIGVpZ2VudGxpY2hlIEVtcGZhZW5nZXIsIGFsc28gZGllIGVyc3RlIGFuZ2VnZWJlbmUgQWRyZXNzZSwKKyAgICBkYXJmIGtlaW5lIEJDQyBzZWluLgorCisgMi4gTWFpbCBuYWNoIHVuZCB2b24gYXVzc2VyaGFsYgorICAgIAorICAgIGEpIE1haWwgaW4gYW5kZXJlIE11ZHMgKChJbnRlci0pTXVkbWFpbCkKKyAgICAgIEVzIGlzdCBtb2VnbGljaCwgTWFpbHMgaW4gZWluZSBSZWloZSB2b24gYW5kZXJlbiBNdWRzIHp1IHNjaGlja2VuIHVuZAorICAgICAgd2VsY2hlIHZvbiBkb3J0IHp1IGVtcGZhbmdlbi4KKyAgICAgIFp1bSBFbXBmYW5nZW4gbXVzcyBtYW4gbml4IHR1bi4KKyAgICAgIFp1bSBWZXJzZW5kZW4gZ2lidCBtYW4gZGVuIENoYXJuYW1lbiBkZXMgRW1wZmFlbmdlciBnZWZvbGd0IHZvbiBlaW5lbSBACisgICAgICB1bmQgZGVtIE11ZG5hbWVuIGRlcyBFbXBmYWVuZ2VycyBhbiwgei5CLiAnYmxhQHVuaXRvcGlhJy4KKworICAgIGIpIE1haWwgaW4gZGVuIFJlc3QgZGVzIEludGVybmV0cworICAgICAgCisgICAgICBBY2h0dW5nOiBQb2xpdGlzY2hlIFZvcmdhYmVuIHVuZCBkYXMgQW53YWNoc2VuIHZvbiBTcGFtIGhhYmVuIHp1cgorICAgICAgICAgICAgICAgQWJzY2hhbHR1bmcgZGllc2VyIEZ1bmt0aW9uZW4gZ2VmdWVocnQuCisKKyAzLiBNYWlsYWxpYXNlOgorICAgIE1haWxhbGlhc2Uga29lbm5lbiB3aWUgTmFtZW4gdmVyd2VuZGV0IHdlcmRlbi4gRXMgZ2lidCBlaW5lIEFuemFobAorICAgIHZvcmRlZmluaWVydGVyIEFsaWFzZSwgZWluZSBMaXN0ZSBkZXIgQWxpYXNlIGJla29tbXQgbWFuIGltIFBvc3RtZW51ZSBtaXQKKyAgICBgYScuCisgICAgTWFnaWVyIGhhYmVuIGRpZSBNb2VnbGljaGtlaXQsIHNpY2ggZWluZSBEYXRlaSBgLm1haWxyYycgaW4gaWhyCisgICAgVmVyemVpY2huaXMgenUgbGVnZW4sIGRpZSBlaWdlbmUgTWFpbGFsaWFzZSBlbnRoYWVsdC4KKworICAgIEVzIGdpYnQgZWluaWdlIHZvcmRlZmluaWVydGUgTWFpbGFsaWFzZSwgZGllIGZ1ZXIgYWxsZSBnZWx0ZW46CisKKyAgICAgKiBgbWUnIHNlbmRldCBhbiBkaWVqZW5pZ2UgQWRyZXNzZSwgZGllIG1hbiBzZWxiZXIgYWxzIEVtYWlsYWRyZXNzZQorICAgICAgIGFuZ2VnZWJlbiBoYXQuIERhcyBpc3QgbnVldHpsaWNoLCB3ZW5uIG1hbiBQb3N0IGFuIHNlaW5lbiBlaWdlbmVuCisgICAgICAgYWNjb3VudCB3ZWl0ZXJzY2hpY2tlbiB3aWxsLgorICAgICAqIGBmcmV1bmRlJyAtIGRhcyBzaW5kIGFsbGUgRGVpbmUgRnJldW5kZSwgd2llIHNpZSBhdWYgRGVpbmVtCisgICAgICAgRnJldW5kc2NoYWZ0c2JhbmQgc3RlaGVuIChmYWxscyBEdSBlaW5zIGhhc3QpLgorICAgICAqIFJ1bmRzY2hyZWliZW4gYW4gYWxsZSBNaXRhcmJlaXRlciBlaW5lciBSZWdpb246IEVpbmZhY2ggYGQueHl6JyBhbHMKKyAgICAgICBFbXBmYWVuZ2VyIGFuZ2ViZW4sIHdvYmVpIGB4eXonIG5hdHVlcmxpY2ggZGVyIE5hbWUgZGVyIFJlZ2lvbiBpc3QuCisgICAgICogZWluaWdlIHdlaXRlcmUgQWxpYXNlIHdpZSBgZXJ6bWFnaWVyJywgYHBvbGl6ZWknLCBgZ29ldHRlcicsIC4uLiAoc2llaGUKKyAgICAgICBMaXN0ZSBtaXQgYGEnKSBlcmxlaWNodGVybiBlcywgZGVuIHJpY2h0aWdlbiBBbnNwcmVjaHBhcnRuZXIgenUgZmluZGVuLgorICAgICAqIEVpbmlnZSBBbGlhc2Ugc2luZCBlaWdlbnRsaWNoIE5hY2hzZW5kZWF1ZnRyYWVnZSB1bmQgd2VyZGVuIGJhbGQKKyAgICAgICB2ZXJzY2h3aW5kZW4uCisKKyA0LiBNYWlsIGxlc2VuIHVuZCBkaWUgYW5kZXJlbiBNZW51ZXB1bmt0ZSBpbSBQb3N0bWVudWUKKworICAgICBNYWlsIGxlc2VuOgorICAgICAgICBFaW5mYWNoIGRpZSBOdW1tZXIgZGVzIEJyaWVmZXMgdGlwcGVuLCBkaWUgbWFuIGxlc2VuIHdpbGwuIFVtIGRlbgorICAgICAgICBha3R1ZWxsZW4gQnJpZWYgKGRhcyBpc3QgZGVyLCBhdWYgZGVuIGRlciBQZmVpbCB6ZWlndCkgenUgbGVzZW4sIGAuJworICAgICAgICB0aXBwZW4sIGZ1ZXIgZGVuIG5hZWNoc3RlbiBgKycgKHByYWt0aXNjaCB6dW0gRHVyY2hibGFldHRlcm4pLCBgLScKKyAgICAgICAgZnVlciBkZW4gdm9yaGVyZ2VoZW5kZW4uCisKKyAgICAgTWFpbCBsb2VzY2hlbjoKKyAgICAgICAgQWxsZSBCcmllZmUgd2VyZGVuIGdlc3BlaWNoZXJ0LCBiaXMgbWFuIHNpZSBsb2VzY2h0LiBBbHMgQXJndW1lbnQKKyAgICAgICAgTnVtbWVyIGFuZ2ViZW4sIGFuc29uc3RlbiB3aXJkIGRlciBCcmllZiBnZWxvZXNjaHQsIGF1ZiBkZW4gZGVyIFBmZWlsCisgICAgICAgIGluIGRlciBMaXN0ZSB6ZWlndC4KKworICAgICAgICBMaXN0ZW5hcmd1bWVudGUgZGVyIEZvcm0gW25yXSBbbnItbnJdIC4uLiBzaW5kIHp1bGFlc3NpZy4KKworICAgICAgICBCZWlzcGllbDogYGQgMTggMTItMTQgMicgbG9lc2NodCBkaWUgQnJpZWZlIE51bW1lciAyLDEyLDEzLDE0LDE4LgorCisgICAgIE1haWwgYmVhbnR3b3J0ZW4sIEdydXBwZW5hbnR3b3J0OgorICAgICAgICBEYXNzZWxiZSB3aWUgYHNjaHJlaWJlbicsIG51ciBkYXNzIGRlciBFbXBmYWVuZ2VyIGF1dG9tYXRpc2NoIGRlcgorICAgICAgICBBYnNlbmRlciBkZXMgYmVhbnR3b3J0ZXRlbiBCcmllZmVzIGlzdCwgdW5kLCBhdXNzZXIgbWFuIGdpYnQgZWluZQorICAgICAgICBhbmRlcmUgYW4sIGRpZSBVZWJlcnNjaHJpZnQgYFJlOiA8T3JpZ2luYWx1ZWJlcnNjaHJpZnQ+JyBsYXV0ZXQuCisKKyAgICAgICAgQmVpICJHcnVwcGVuYW50d29ydCIgd2lyZCBkaWUgQW50d29ydCBhdXNzZXJkZW0gYW4gYWxsZSBFbXBmYWVuZ2VyIHZvbgorICAgICAgICBDQydzIGRlcyBPcmlnaW5hbGJyaWVmZXMgdmVyc2NoaWNrdC4KKworICAgICAgICBJc3QgZWluZSBgUmVwbHktdG86Jy1aZWlsZSBpbSBUZXh0IGVudGhhbHRlbiwgd2lyZCBkZXIgQnJpZWYgYW4gZGllCisgICAgICAgIGhpZXIgYW5nZWdlYmVuZSBBZHJlc3NlIGdlc2NoaWNrdC4KKworICAgICAgICAqQWNodHVuZzoqIEF1Y2ggaW4gZGllc2VtIEZhbGwgd2VyZGVuIE1haWxhbGlhc2UgdW5kIGdnZi4KKyAgICAgICAgTmFjaHNlbmRlYXVmdHJhZWdlIGF1c2dld2VydGV0IQorCisgICAgIE1haWwgd2VpdGVyc2VuZGVuIChmb3J3YXJkKToKKyAgICAgICAgRGVyIGVyaGFsdGVuZSBCcmllZiB3aXJkIGtvcGllcnQgdW5kIGFuIGRlbiBuZXVlbiBFbXBmYWVuZ2VyCisgICAgICAgIHdlaXRlcmdlc2NoaWNrdC4gQmVpIGBGJyBiencuIGBXZWl0ZXInIGthbm4gbWFuIGF1c3NlcmRlbSBub2NoCisgICAgICAgIHp1c2FldHpsaWNoIGVpZ2VuZW4gVGV4dCBhbmhhZW5nZW4uCisKKyAgICAgICAgTnVyIGZ1ZXIgYGYnIChhbHNvIG9obmUgenVzYWV0emxpY2hlbiBUZXh0KSBnaWx0OiBXaXJkIGVpbmUgTGlzdGUgYWxzCisgICAgICAgIEFyZ3VtZW50IGFuZ2VnZWJlbiwgc28gd2VyZGVuIGFsbGUgQnJpZWZlIHp1IGVpbmVtIGxhbmdlbiBCcmllZgorICAgICAgICB6dXNhbW1lbmdlaGFlbmd0IHVuZCBkaWVzZXIgd2VpdGVyZ2VzZW5kZXQuCisKKyA1LiBadW0gVGhlbWEgT3JkbmVyOgorICAgIE1hbiBrYW5uIEJyaWVmZSwgZGllIG1hbiBub2NoIG5pY2h0IGxvZXNjaGVuIHdpbGwsIGluIHZlcnNjaGllZGVuZSBPcmRuZXIKKyAgICAoZm9sZGVycykgc29ydGllcmVuLiBTb2xjaGUgT3JkbmVyIG11c3MgbWFuIHp1bmFlY2hzdCBhbmxlZ2VuLCBkYW5uIGthbm4KKyAgICBtYW4gZGllIEJyaWVmZSB2b24gZWluZW0genVtIGFuZGVyZW4gdmVyc2NoaWViZW4uIEFuZ2V6ZWlndCB3ZXJkZW4KKyAgICBuYXR1ZXJsaWNoIGltbWVyIG51ciBkaWUgQnJpZWZlIGRlcyBha3R1ZWxsZW4gT3JkbmVycy4gVW0gYW5kZXJlIHp1IGxlc2VuLAorICAgIG11c3MgbWFuIHp1bmFlY2hzdCBkZW4gT3JkbmVyIHdlY2hzZWxuLgorCisgICAgQmVpbSBFaW5zdGllZyBpbnMgUG9zdG1lbnVlIHNjaGxhZWd0IG1hbiB6dW5hZWNoc3QgZGVuIE9yZG5lciBgbmV3bWFpbCcKKyAgICBhdWYsIGluIGRlbiBhbGxlIGFua29tbWVuZGVuIEJyaWVmZSBhdWNoIGFiZ2VzcGVpY2hlcnQgd2VyZGVuLgorCisgICAgQWxsZSBCZWZlaGxlLCBkaWUgT3JkbmVybmFtZW4gYWxzIEFyZ3VtZW50ZSB2ZXJsYW5nZW4sIGFremVwdGllcmVuIGF1Y2gKKyAgICBgLScgZnVlciBkZW4gaW4gZGVyIExpc3RlIHZvcmhlcmdlaGVuZGVuIE9yZG5lciwgYCsnIGZ1ZXIgZGVuCisgICAgbmFjaGZvbGdlbmRlbiB1bmQgamVkZSBlaW5kZXV0aWdlIEFia3Vlcnp1bmcuCisKKyA2LiBOYWNoc2VuZGVhdWZ0cmFlZ2UKKyAgICBXaWxsIG1hbiBzZWluZSBQb3N0IGxpZWJlciBhbiBlaW5lbiBhbmRlcmVuIENoYXJha3RlciBhdXNnZWxpZWZlcnQKKyAgICBiZWtvbW1lbiwgc28gZ2VodCBkYXMgYXVjaC4gSGllcnp1IG11c3MgbWFuIGFiZXIgYWxzIEVtYWlsYWRyZXNzZSBkZW4KKyAgICBhbmRlcmVuIENoYXIgaW4gZGllc2VyIEZvcm0gYW5nZWJlbjogJ25ldWVyX2VtcGZhZW5nZXJAbW9yZ2VuZ3JhdWVuJyAKKyAgICAoc2llaGUgYXVjaCBCZWZlaGwgJ2VtYWlsJykuCisKKyAgICBVbSBlaW5lbiBzb2xjaGVuIE5hY2hzZW5kZWF1ZnRyYWcgenUgc3RlbGxlbiwgZ2VodCBtYW4genUgaXJnZW5kZWluZW0KKyAgICBQb3N0YW10IG1pdCBQYWtldHNjaGFsdGVyLiBHZW5hdWVyZXMgZXJ6YWVobHQgZGVyIFBvc3RiZWFtdGUgYXVmCisgICAgTmFjaGZyYWdlLgorCisgICAgTWFuIHNvbGx0ZSBzaWNoIGRpZXNlcyBhYmVyIGd1dCB1ZWJlcmxlZ2VuOiBoYXQgZWluIENoYXJha3RlciBrZWluZQorICAgIGd1ZWx0aWdlIGVNYWlsLUFkcmVzc2UgZWluZ2V0cmFnZW4sIGlzdCBkYXMgWnVydWVja3NldHplbiBkZXMgUGFzc3dvcnRlcworICAgIGVyaGVibGljaCBrb21wbGl6aWVydGVyIG9kZXIgc29nYXIgdW5tb2VnbGljaC4KKworICAgIEVzIGlzdCBOSUNIVCBtb2VnbGljaCwgZWluZSBlTWFpbC1BZHJlc3NlIGF1c3NlcmhhbGIgZGVzIE1vcmdlbmdyYXVlbnMKKyAgICBhbnp1Z2ViZW4uCisKKyA3LiBQYWtldHBvc3QKKyAgICBJbSBNb3JnZW5HcmF1ZW4gZ2lidCBlcyBlaW5lIFBha2V0cG9zdC4gSW5mb3JtYXRpb25lbiBlcnRlaWx0IGRlcgorICAgIFBvc3RiZWFtdGUgYW4gamVkZW0gUGFrZXRzY2hhbHRlci4KKworIDguIEFic2VuZGVyIGlnbm9yaWVyZW4KKyAgICBTb2xsdGUgbWFuIHZvbiBlaW5lbSBiZXN0aW1tdGVuIEFic2VuZGVyIHVlYmVyaGF1cHQga2VpbmUgUG9zdCBlbXBmYW5nZW4KKyAgICB3b2xsZW4sIHNvIGthbm4gZGllcyBkdXJjaCAiaWdub3JpZXJlIG5hbWUubWFpbCIgZXJyZWljaHQgd2VyZGVuLCB3b2JlaQorICAgICJuYW1lIiBuYXR1ZXJsaWNoIGR1cmNoIGRlbiBrb25rcmV0ZW4gU3BpZWxlcm5hbWVuIHp1IGVyc2V0emVuIGlzdC4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyhjKSAxOTkzLTE5OTYgTW9yZ2VuZ3JhdWVuIFBvc3R2ZXJ3YWx0dW5nCitBYnRlaWx1bmcgVGVjaG5paywgTG9jbyAoQWJ0ZWlsdW5nc2xlaXRlcikKK0FucmVndW5nZW4sIEZlaGxlcm1lbGR1bmdlbiB1bmQgRnJhZ2VuIGJpdHRlIGRpcmVrdCBhbiBMb2NvLAorRmxhbWVzIGRpcmVrdCBuYWNoIC9kZXYvbnVsbC4KKworTEVUWlRFIEFlTkRFUlVORzoKKyAgIDI4LjEwLjIwMTMsIFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL2hlbHAvcmFzc2VuIGIvZG9jL2hlbHAvcmFzc2VuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZTRlZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaGVscC9yYXNzZW4KQEAgLTAsMCArMSwxMDIgQEAKK0RJRSBSQVNTRU4gREVTIE1PUkdFTkdSQVVFTgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1dlbm4gRHUgamV0enQgbmljaHQgZ2VyYWRlIGVpbiBHYXN0IGJpc3QsIGthbm5zdCBEdSBEZWluZSBSYXNzZSBvaG5laGluIG5pY2h0CittZWhyIHZlcmFlbmRlcm4uIERlciBmb2xnZW5kZSBVZWJlcmJsaWNrIGlzdCB2aWVsbGVpY2h0IHRyb3R6ZGVtIHZvbiBOdXR6ZW4uCisKK0VyIGJlaW5oYWx0ZXQgZ2VuYXUgZGllIEhpbndlaXNlLCBkaWUgYXVjaCBiZWkgZGVyIENoYXJha3RlcmdlbmVyaWVydW5nCithbmdlemVpZ3Qgd2VyZGVuLgorCitNRU5TQ0hFTgorLS0tLS0tLS0KKworRGllIFN0YWVya2UgZGVzIE1lbnNjaGVuIGlzdCBzZWluZSBWaWVsc2VpdGlna2VpdC4KK0RlciBNZW5zY2gga2FubiB6d2FyIG5pY2h0cyBiZXNvbmRlcnMgZ3V0IC0gZGFmdWVyIGFiZXIgZWlnZW50bGljaCBhbGxlcy4KKworRFVOS0VMRUxGRU4KKy0tLS0tLS0tLS0tCisKK0RhcyBWb2xrIGRlciBEdW5rZWxlbGZlbiBsZWJ0IGluIGVpbmVyIGdyb3NzZW4gSG9laGxlbnN0YWR0IGd1dCB2ZXJzdGVja3QKK2hpbnRlciBlaW5lbSBXYXNzZXJmYWxsLiBVZWJlciBrYXVtIGVpbiBhbmRlcmVzIFZvbGsgZ2lidCBlcyBzb3ZpZWxlCitWb3J1cnRlaWxlIHdpZSB1ZWJlciBkaWUgRHVua2VsZWxmZW4sIHVuZCBzbyB3ZXJkZW4gc2llIHZvbiBhbGxlbiBtaXNzdHJhdWlzY2gKK2JlYWV1Z3Qgb2RlciBzb2dhciBiZWthZW1wZnQuIEluIGRpZXNlbSBLYW1wZiwgaW5zYmVzb25kZXJlIGdlZ2VuIGRpZSBFbGZlbiwKK3NpbmQgc2llIHZvZWxsaWcgYXVmIHNpY2ggYWxsZWluIGdlc3RlbGx0LCB1bmQgc28gaGF0IHNpY2ggZWluZSBtZWhyIG9kZXIKK21pbmRlciBhdXRhcmtlIEdlc2VsbHNjaGFmdCBlbnR3aWNrZWx0LiBEaWUgRHVua2VsZWxmZW4gaGFiZW4gZWluZSBlaWdlbmUKK0t1bHR1ciB1bmQgZWluZSBlaWdlbmUgR29ldHRpbiwgZGVyIHNpZSBodWxkaWdlbi4gV2llIGF1Y2ggZGllIEVsZmVuCit2ZXJmdWVnZW4gc2llIHVlYmVyIGF1c3Nlcm9yZGVubGljaCBncm9zc2UgbWFnaXNjaGUgRmFlaGlna2VpdGVuLCBhdWNoIHdlbm4KK3NpZSBzaWNoIG1laHIgYXVmIGRpZSBzY2h3YXJ6ZSBTZWl0ZSBkZXIgTWFnaWUgc3BlemlhbGlzaWVydCBoYWJlbi4KKworWldFUkdFCistLS0tLS0KKworWndlcmdlIHNpbmQga2xlaW5lIGFiZXIga3JhZWZ0aWdlIEdlYmlyZ3NiZXdvaG5lciwgbmljaHQgc2VociBnZXNwcmFlY2hpZywKK2xlaWNodCBlcnp1ZXJudCwgYWJlciBlaW5lIHNjaGxhZ2tyYWVmdGlnZSBVbnRlcnN0dWV0enVuZyBmdWVyIGlocmUgRnJldW5kZS4KK0lociBNdXQgdW5kIGlocmUgU3RhbmRmZXN0aWdrZWl0IGlzdCB3ZWl0IHVuZCBicmVpdCBiZXJ1ZWhtdCwgYXVjaCBpaHIKK0dlc2NoaWNrIGltIFVtZ2FuZyBtaXQgWndlcmdlbndhZmZlbiB2ZXJsZWlodCBpaG5lbiB6dXNhZXR6bGljaGUgS3JhZnQuCitMZWlkZXIgc2luZCBad2VyZ2UgbmljaHQgYWxsenUgc2NobGF1LCBzaWUgdmVybGFzc2VuIHNpY2ggbGllYmVyIGF1ZgoraWhyZSBLcmFmdCBhbHMgYXVmIGlociBHZWhpcm4uCisKK0dPQkxJTlMKKy0tLS0tLS0KK0dvYmxpbnMgc2luZCB3aW56aWdlLCBncnVlbmhhZXV0aWdlIFdlc2VuLCBzb2dhciBub2NoIGtsZWluZXIgYWxzIEhvYmJpdHMuCitBbiBpaHJlbiB6dSBkaWNrIGdlcmF0ZW5lbiBLb2VwZmNoZW4gYmVmaW5kZW4gc2ljaCBsYW5nZSwgc2VsdGVuIHJlZ2xvc2UsCitPaHJlbiB1bmQgZWluZSBncm9zc2UsIGtydW1tZSBOYXNlLiBJaHJlIGtsZWluZSBTdGF0dXIgc29sbHRlIGplZG9jaCBuaWNodAordGFldXNjaGVuLCBkZW5uIGlocmUgZmVobGVuZGUgS3JhZnQgbWFjaGVuIHNpZSBtaXQgR2VzY2h3aW5kaWdrZWl0LAorUHJhZXppc2lvbiB1bmQgbmljaHQgenVsZXR6dCBpaHJlciB1bmJlc3RyaXR0ZW5lbiBSdWNobG9zaWdrZWl0IGFsbGV3ZWlsCit3ZXR0LgorT2J3b2hsIGZ1ZXIgc2llIFBsdWVuZGVybiwgbGF1dGVzIEhlcnVtYnJ1ZWxsZW4gdW5kIGRpZSBnZW1laW5zdGVuIFN0cmVpY2hlCitzcGllbGVuIHp1bSBBbGx0YWcgZ2Vob2VyZW4sIHd1ZXJkZSBzaWUgbmllbWFuZCBhbHMgYm9lc2FydGlnIGJlemVpY2huZW4uCitEZW5uIEdvYmxpbnMgc2luZCB2aWVsZXMsIGFiZXIgc2ljaGVybGljaCBuaWNodCBkaWUgaW50ZWxsaWdlbnRlc3RlbgorS3JlYXR1cmVuLiBEdXJjaCBpaHJlbiB6YWVoZW4gV2lsbGVuIHVuZCBkaWUgZGlja2UsIGxlZGVybmUgSGF1dCBzaW5kIHNpZQorYXVzc2VyZ2V3b2VobmxpY2ggd2lkZXJzdGFuZHNmYWVoaWcsIHVuZCwgc29mZXJuIGZ1bmtlbG5kZSBCZXV0ZSB3aW5rdCwgZnVlcgoramVkZXMgQWJlbnRldWVyIHp1IGhhYmVuLgorCitFTEZFTgorLS0tLS0KKworQWxzIEVsZmVuIGJlemVpY2huZXQgbWFuIGluIGRlciBSZWdlbCBqZW5lIGhhZ2VyZW4gSGludGVyd2FlbGRsZXIsIGRlcmVuCitkZW1vbnN0cmF0aXZlcyBOYXR1cmdlaGFiZSBpbiBkZXIgUmVnZWwgbnVyIGR1cmNoIGlocmUgTGllYmUgenUga2l0c2NoaWdlbgorR2VkaWNodGVuIHVuZCBhdXNzY2h3ZWlmZW5kZW0gR2VzY2hsZWNodHNsZWJlbiBpbiBkZW4gU2NoYXR0ZW4gZ2VzdGVsbHQgd2lyZC4KK0VpbmVuIEVsZiBrYW5uIG1hbiBpbSBhbGxnZW1laW5lbiBuaWNodCBudXIgYW4gYWV1c3NlcmVuIE1pc3NiaWxkdW5nZW4KKyhzcGl0emUgT2hyZW4sIHNwaW5kZWxkdWVycmUgR2VzdGFsdCwgYmxvbmRlIEhhYXJlKSBlcmtlbm5lbiwgc29uZGVybiBhdWNoCithbiBzZWluZXIgYXVmZHJpbmdsaWNoZW4gQXJ0LCB1ZWJlciBqZWRlbiB1bmQgYWxsZXMgaGVtbXVuZ3Nsb3MgaW5zIEdydWVuZQorbG9zenVwaGlsb3NvcGhpZXJlbi4KKworRkVMSU5FTgorLS0tLS0tLQorCitGZWxpbmVuIHNpbmQgYXVmcmVjaHQgZ2VoZW5kZSBLYXR6ZW53ZXNlbi4KK0locmUgSGVpbWF0IGlzdCBkZXIgRHNjaHVuZ2VsLiBLYXVtIGplbWFuZCBkdWVyZnRlIHNpY2ggZG9ydCBiZXNzZXIKK3p1cmVjaHRmaW5kZW4gYWxzIHNpZS4gQmVkaW5ndCBkdXJjaCBkaWVzZSBVbWdlYnVuZyBoYWJlbiBzaWUgaW0gTGF1ZmUgZGVyCitaZWl0IGVpbmUgVm9ybGllYmUgZnVlciBlbGVnYW50ZSBIb2VsemVyIHVuZCBmdW5rZWxuZGUgRWRlbHN0ZWluZSBlbnR3aWNrZWx0LgorU2llIHNpbmQgendhciBuaWNodCBzbyAncmFmZmdpZXJpZycgd2llIFp3ZXJnZSwgYWJlciBkZW5ub2NoIHNvbGx0ZSBtYW4gYmVzc2VyCituaWNodCB2ZXJzdWNoZW4sIGVpbmVtIEZlbGluZW4gZWluZW4gRWRlbHN0ZWluIHdlZ3p1bmVobWVuLiBTaWUgYmVudXR6ZW4gZGllCitFZGVsc3RlaW5lIHNlaHIgZ2VybmUsIHVtIHNpY2ggZGFtaXQgenUgc2NobXVlY2tlbi4gRmVsaW5lbiBiZXRyZWliZW4gc29nYXIKK2VpbmVuIHJlZ2VscmVjaHRlbiBLb2VycGVya3VsdCwgaW5zYmVzb25kZXJlIHdlbm4gZXMgZGFydW0gZ2VodCwgZGFzIEZlbGwgb2RlcgorZGllIEtyYWxsZW4genUgZmFlcmJlbi4gRWRlbHN0ZWluZSBrb21tZW4gZGEgYWxzIEFjY2Vzc29pcmVzIGdlcmFkZSByZWNodC4KK0F1Y2ggaW0gS2FtcGYgZ2VnZW4gZWluZW4gRmVsaW5lbiBzb2xsdGUgbWFuIHNlaHIgdm9yc2ljaHRpZyBzZWluLCBkYSBGZWxpbmVuCitpaHJlIGdlcmluZ2UgQXVzZGF1ZXIgZHVyY2ggZWluZSBob2hlIEdlc2Nod2luZGlna2VpdCBzb3dpZSBHZXNjaGljayB1bmQKK0ludGVsbGlnZW56IHdldHRtYWNoZW4uIEF1Y2ggZGllIFNwaXR6ZW4gS3JhbGxlbiBzaW5kIGRhIG5pY2h0IHp1IHZlcmFjaHRlbgordW5kIHNvIG1hbmNoZXIgR2VnbmVyIG11c3N0ZSBzY2hvbiBhbHMgRXJzYXR6IGZ1ZXIgZWluZW4gS3JhdHpiYXVtIGhlcmhhbHRlbi4KKworSE9CQklUUworLS0tLS0tLQorCitIb2JiaXRzIHNpbmQga2xlaW5lIFdlc2VuLCBkaWUgYW0gZWhlc3RlbiBkZW4gTWVuc2NoZW4gYWVobmVsbi4KK1NpZSB6ZWljaG5lbiBzaWNoIHRyb3R6IElocmVyIEdyb2Vzc2UgZHVyY2ggaWhyZW4gTXV0IHVuZCBTdGFuZGZlc3RpZ2tlaXQgYXVzLgorT2J3b2hsIHNpZSB2aWVsIGxpZWJlciB6dWhhdXNlIHZvcm0gd2FybWVuIEthbWluIHNpdHplbiwgc2luZCBzaWUgaW1tZXIKK2Z1ZXIgZWluIEFiZW50ZXVlciB6dSBoYWJlbi4KKworT1JLUworLS0tLQorCitPcmtzIHNpbmQgaHVtYW5vaWRlIFdlc2VuLCBhbGxlcmRpbmdzIGV0d2FzIGtsZWluZXIgYWxzIE1lbnNjaGVuLiBWb24gTmF0dXIKK2F1cyBzaW5kIHNpZSBhdXNnZXNwcm9jaGVuIGhhZXNzbGljaCBhbnp1c2VoZW4gbWl0IGlocmVyZSBkdW5rbGVuIEhhdXQsIGRpZQorZmFzdCBpbnMgendlcmdlbmFydGlnLWRyZWNraWdlIGdlaHQuIEF1ZmdydW5kIGlocmVyIGNoYXJha3RlcmxpY2hlbiBOZWlndW5nCit6dSBHZXdhbHRiZXJlaXRzY2hhZnQgd2VyZGVuIHNpZSBnZXJuZSBhbHMgdW56aXZpbGlzaWVydCBhbmdlc2VoZW4sIGhhYmVuCitzaWNoIGplZG9jaCBhbHMgdW5lcnNjaHJvY2tlbmUsIHJpc2lrb2JlcmVpdGUgS2FlbXBmZXIgZWluZW4gTmFtZW4gZ2VtYWNodC4KKworTGV0enRlIEFlbmRlcnVuZzogMjAuMDUuMjAxNSwgQW1hcnlsbGlzCisKKworCmRpZmYgLS1naXQgYS9kb2MvaGVscC9yZWJvb3QgYi9kb2MvaGVscC9yZWJvb3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZmMTgzYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9oZWxwL3JlYm9vdApAQCAtMCwwICsxLDU3IEBACitSZWJvb3RzIHVuZCBpaHJlIEZvbGdlbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAKKyAgICBCZWkgZWluZW0gJ1JlYm9vdCcgd2lyZCBkYXMgTW9yZ2VuR3JhdWVuIGhlcnVudGVyZ2VmYWhyZW4sIGQuaC4KKyAgICBkYXMgYWt0dWVsbGUgU3BpZWwgd2lyZCBiZWVuZGV0IHVuZCwgd2VubiBhbGxlcyBndXQgZ2VodCwgZWluIG5ldWVzIAorICAgIFNwaWVsIGdlc3RhcnRldC4gRGllcyBpc3QgbWFuY2htYWwgbm9ldGlnLCB3ZW5uIGdyb2Vzc2VyZSBBZW5kZXJ1bmdlbiAKKyAgICBhbSBNb3JnZW5HcmF1ZW4gdm9yZ2Vub21tZW4gd3VyZGVuLgorICAgIAorICAgIERhYmVpIGdlaGVuIGluIGRlciBSZWdlbCBhbGxlIE9iamVrdGUgKFdhZmZlbiwgUnVlc3R1bmdlbiBldGMuKSwgZGllIAorICAgIGltIFVtbGF1ZiB3YXJlbiwgdmVybG9yZW4uIE5hY2ggZWluZW0gJ1JlYm9vdCcgc3RlaHN0IER1IGFsc28gZXJzdG1hbCAKKyAgICB6aWVtbGljaCBuYWNrdCBpbiBkZXIgR2VnZW5kIGhlcnVtIDopCisgICAgCisgICAgRWluZSBBdXNuYWhtZSBiaWxkZW4gamVkb2NoIHNvZ2VuYW5udGUgJ0F1dG9sb2FkLU9iamVrdGUnLiBPZnQgc2luZAorICAgIGRpZXMgT2JqZWt0ZSwgZGllIG1hbiBhbHMgQmVsb2hudW5nIGZ1ZXIgYmVzdGFuZGVuZSBBYmVudGV1ZXIgZXJoYWx0ZW4KKyAgICBoYXQsIEdpbGRlbm9iamVrdGUsIE11ZW56ZW4gdW5kIGVpbmlnZXMgbWVoci4gU2llIHVlYmVybGViZW4gc2VsYnN0CisgICAgZWluZW4gJ1JlYm9vdCcgdW5kIGJsZWliZW4gRGlyIGVyaGFsdGVuLiBXYXMgRHUgYW4gJ0F1dG9sb2FkLU9iamVrdGVuJworICAgIGJlaSBEaXIgdHJhZWdzdCwga2FubnN0IER1IG1pdCBkZW0gQmVmZWhsICdpICthJyBlcmZhaHJlbiAoU2llaGUgaGllcnp1OgorICAgIGhpbGZlIGludikuCisgICAgCisgICAgRnVlciBPYmpla3RlLCBkaWUgRHUgZHVyY2ggZWluZW4gJ1JlYm9vdCcgdmVybG9yZW4gaGFzdCwgYmVrb21tc3QKKyAgICBEdSBlaW5lIGZpbmFuemllbGxlIEVudHNjaGFlZGlndW5nLgorIAorICAgIEVpbiAnUmVib290JyBoYXQgamVkb2NoIGtlaW5lIEF1c3dpcmt1bmdlbiBhdWYgRGVpbmUgR2lsZGVuZmFlaGlna2VpdGVuLAorICAgIGRpZSBIb2VoZSBEZWluZXIgRXJmYWhydW5ncy0gb2RlciBBYmVudGV1ZXJwdW5rdGUgdS5hZS4sIGVyIGZ1ZWd0IERpcgorICAgIGxlZGlnbGljaCBlaW5lbiB1bndlc2VudGxpY2hlbiBtYXRlcmllbGxlbiBTY2hhZGVuIHp1LgorCitBcm1hZ2VkZG9uCistLS0tLS0tLS0tCisgICAgV2lyZCBlaW4gUmVib290IG5vZXRpZywgaXN0IGRhcyBtZWlzdCBrZWluZSBwbG9ldHpsaWNoZSBBbmdlbGVnZW5oZWl0LAorICAgIHNvbmRlcm4gdm9uIGxhbmdlciBIYW5kIHZvcmJlcmVpdGV0LiBEYWhlciBrYW5uIGRlciBSZWJvb3QgYXVjaCBlaW5pZ2UKKyAgICBUYWdlIHp1dm9yIGFuZ2VrdWVuZGlndCB3ZXJkZW4sIHNvIGRhc3MgU3BpZWxlciBzaWNoIGF1ZiBpaG4gZWluc3RlbGxlbgorICAgIGtvZW5uZW4uIERpZXNlIEF1ZmdhYmUgdWViZXJuaW1tdCBBcm1hZ2VkZG9uIGFscyBIZXJvbGQgZGVzIFdlbHR1bnRlci0KKyAgICBnYW5ncy4gRGllc2VyIHJ1ZnQgcmVnZWxtYWVzc2lnIGF1cywgd2llIGxhbmdlIGVzIG5vY2ggYmlzIHp1bSBSZWJvb3QgCisgICAgaXN0IHVuZCBzb3JndCBhdWNoIHNvbnN0IGZ1ZXIgZWluZSBwYXNzZW5kZSwgdW5oZWltbGljaGUsIGFsc28gZGVtIFdlbHQtCisgICAgdW50ZXJnYW5nIGFuZ2VtZXNzZW5lIFN0aW1tdW5nLgorCisgICAgV2VubiBEdSBuaWNodCBkdXJjaCBBcm1hZ2VkZG9ucyBNZWxkdW5nZW4gYmVsYWVzdGlndCB3ZXJkZW4gbW9lY2h0ZXN0LCAKKyAgICBrYW5uc3QgRHUgZGllcyBhdWYgendlaWVybGVpIEFydGVuIHR1bjoKKyAgICAKKyAgICBFbnR3ZWRlciBkdXJjaCAnaWdub3JpZXJlIGFybWFnZWRkb24nLiBEdSB3aXJzdCBhYiBzb2ZvcnQgbnVyIG5vY2ggZGFzIAorICAgIGFic29sdXRlIE1pbmltdW0gYW4gTWVsZHVuZ2VuIHZvbiBBcm1hZ2VkZG9uIGJla29tbWVuLiBXZWx0dW50ZXJnYW5ncy0KKyAgICBzdGltbXVuZyBnaWJ0IGVzIGRhbm4gYWJlciBhdWNoIG5pY2h0IG1laHIuCisKKyAgICBPZGVyIGR1cmNoICd0ZWlsZSBhcm1hZ2VkZG9uIG1pdCBydWhlJy4gRGFtaXQgYnJpbmdzdCBEdSBkaWVzZW4gZWluZW4KKyAgICBBcm1hZ2VkZG9uIHp1bSBzY2h3ZWlnZW4uIFdpcmQgZGllc2VyIGFiZXIgYWJnZWJyb2NoZW4sIG9kZXIga29tbXQgZXMKKyAgICBkb2NoIG1hbCB6dW0gUmVib290LCBpc3QgZWluIG5ldWVyIEFybWFnZWRkb24gcmVkc2VlbGlnIHdpZSBnZWhhYnQuIAorCisgICAgQXVmIGRpZXNlIFdlaXNlIHZlcnBhc3N0IER1IGtlaW5lbiBBcm1hZ2VkZG9uLCB3aXJzdCBhYmVyIGF1Y2ggbmljaHQgCisgICAgZHVyY2ggc3RhZW5kaWdlcyBnZXNjcm9sbGUgZ2VuZXJ2dC4gRmFsbHMgRHUgZG9jaCB3aWVkZXIgZ2VuZXJ2dCB3ZXJkZW4KKyAgICBtb2VjaHRlc3QsIHJlaWNodCBkaWUgV2llZGVyaG9sdW5nIGRlcyBvYmVuIGdlbmFubnRlbiB0bS4KKworICAgIAorIFNJRUhFIEFVQ0g6CisgICAgaW52LCBpZ25vcmllcmUsIGNyYXNoLCBlcnptYWdpZXIKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgTW9uIEFwciAwNSAyMTozMDowMCAyMDA0IHZvbiBWYW5pb24uCmRpZmYgLS1naXQgYS9kb2MvaGVscC9yZWdlbG4gYi9kb2MvaGVscC9yZWdlbG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE1MTM2ZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9oZWxwL3JlZ2VsbgpAQCAtMCwwICsxLDIzMiBAQAorRWluIGtsZWluZXIgTGVpdGZhZGVuIHp1bSBTcGllbCBpbSBNb3JnZW5HcmF1ZW4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIERhcyBNb3JnZW5HcmF1ZW4gaXN0IGVpbiBTcGllbC4gV2llIGJlaSBqZWRlbSBTcGllbCBtdWVzc2VuLCB1bSBkZW4KKyAgU3BpZWxzcGFzcyBtb2VnbGljaHN0IGZ1ZXIgYWxsZSB6dSBlcmhhbHRlbiwgZWluIHBhYXIgd2VuaWdlIFJlZ2VsbgorICBiZWFjaHRldCB3ZXJkZW4uIERpZXNlIFJlZ2VsbiBnZWx0ZW4gc293b2hsIGZ1ZXIgU3BpZWxlciBhbHMgYXVjaAorICBmdWVyIE1hZ2llci4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisKKyAgICBEaWUgd2ljaHRpZ3N0ZSBSZWdlbCBiZXRyaWZmdCBkYXMgQW5ncmVpZmVuIHVuZCBUb2V0ZW4gYW5kZXJlcgorICAgIFNwaWVsZXIuCisKKyAgICBFUyBJU1QgU1RSSUtUIFVOVEVSU0FHVCBBTkRFUkUgU1BJRUxFUiBBTlpVR1JFSUZFTiBPREVSIFpVIFRPRVRFTi4KKworICAgIEF1Y2ggZGFzIGFic2ljaHRsaWNoZSBpbmRpcmVrdGUgVG9ldGVuIHZvbiBTcGllbGVybiBkdXJjaAorICAgIEdpbGRlbmZhZWhpZ2tlaXRlbiwgc3BlemllbGxlIE9iamVrdGUgb2RlciBhZWhubGljaGVzIGZhZWxsdCB1bnRlcgorICAgIGRpZXNlIFJlZ2VsLgorCisgICAgU29sbHRlIG1hbiBlaW5lbiBTcGllbGVyIHVtZ2VicmFjaHQgaGFiZW4sIHRyZXRlbiBzb2ZvcnQKKyAgICBCZXNjaHJhZW5rdW5nZW4gaW4gS3JhZnQsIGRpZSBudXIgZHVyY2ggZWluZW4gRXJ6bWFnaWVyIHdpZWRlcgorICAgIGF1ZmdlaG9iZW4gd2VyZGVuIGtvZW5uZW4uCisKKyAgICBXaWxsIG1hbiBzaWNoIGRlbm5vY2ggbWl0IGFuZGVyZW4gU3BpZWxlcm4gbWVzc2VuLCBzbyBleGlzdGllcmVuCisgICAgZXh0cmEgZGFmdWVyIGVpbmdlcmljaHRldGUgR2ViaWV0ZSwgd2llIHp1bSBCZWlzcGllbCBkaWUgQXJlbmEgaW4KKyAgICBkZXIgV3Vlc3RlLCBpbiBkZW5lbiBtYW4gc2ljaCBnZWdlbnNlaXRpZyBiZWthZW1wZmVuIGthbm4uCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorCisgICAgSGF0IG1hbiBtaXQgc2VpbmVtIENoYXJha3RlciBlaW5lIFplaXQgbGFuZyBnZXNwaWVsdCwgc28gZW50c3RlaHQKKyAgICBvZnQgZGVyIFd1bnNjaCwgZWlubWFsIGVpbmUgYW5kZXJlIFJhc3NlLCBHaWxkZSBvZGVyIGVpbmZhY2ggZWluZW4KKyAgICBhbmRlcmVuIFJvbGxlbnNwaWVsY2hhcmFrdGVyIHp1IHNwaWVsZW4uCisgICAgU2VpbmVuIGJpc2hlcmlnZW4gQ2hhcmFrdGVyIGthbm4gb2RlciBtb2VjaHRlIG1hbiBkYXp1IGFsbGVyZGluZ3MKKyAgICBuaWNodCBiZW51dHplbi4KKyAgICBEYWhlciBrYW5uIGplZGVyIFNwaWVsZXIgd2VpdGVyZSBDaGFyYWt0ZXJlIGFubGVnZW4uCisKKyAgICBEaWVzZSBtdWVzc2VuIGRhbm4gamVkb2NoIGFscyBzb2dlbmFubnRlciBad2VpdHNwaWVsZXIgZGVzIGVyc3RlbgorICAgIENoYXJha3RlcnMgbWFya2llcnQgd2VyZGVuLgorICAgIERpZXNlIE1hcmtpZXJ1bmcga2FubiBtYW4genVtIEJlaXNwaWVsIGJlaW0gU2NobWllZCBpbiBkZXIKKyAgICBad2VyZ2Vuc3RhZHQgb2RlciBiZWltIERvcmZzY2hyZWliZXIgaW0gRWxmZW5kb3JmIGVyaGFsdGVuLgorICAgIERpZXNlIE1hcmtpZXJ1bmcga2FubiBtYW4gYXVjaCB2b3IgYW5kZXJlbiBTcGllbGVybiB2ZXJiZXJnZW4uCisKKyAgICBNYW4ga2FubiBiZWxpZWJpZyB2aWVsZSBzZWluZXIgQ2hhcmFrdGVyZSBnbGVpY2h6ZWl0aWcgZWlubG9nZ2VuLAorICAgIGRvY2ggaXN0IGhpZXJiZWkgZGFyYXVmIHp1IGFjaHRlbiwgZGFzcyBudXIgendlaSBkaWVzZXIgQ2hhcmFrdGVyZQorICAgIGFrdGl2IGFtIFNwaWVsZ2VzY2hlaGVuLCBkYXMgaXN0IGFsbGVzIHdhcyB1ZWJlciByZWluZQorICAgIEtvbW11bmlrYXRpb24gaGluYXVzZ2VodCwgdGVpbG5laG1lbi4KKyAgICBEaWUgYW5kZXJlbiBDaGFyYWt0ZXJlIG11ZXNzZW4gc2ljaCBhdWYgZGllIEtvbW11bmlrYXRpb24KKyAgICBiZXNjaHJhZW5rZW4uCisKKyAgICBXZWl0ZXJlIEVpbnNjaHJhZW5rdW5nZW4gZXhpc3RpZXJlbiBmdWVyIE1hZ2llci4KKworICAgIEVpbiBNYWdpZXIgZGFyZiBuaWNodCBnbGVpY2h6ZWl0aWcgbWl0IHNlaW5lbiBTcGllbGVyY2hhcmFrdGVyZW4KKyAgICBlaW5nZWxvZ2d0IHNlaW4sIGRpZXNlIG1hbmlwdWxpZXJlbiBvZGVyIGZ1ZXIgc2VpbmUgWndlaXRzcGllbGVyCisgICAgZnJlbWRlbiBDb2RlIGFuYWx5c2llcmVuLgorCisgICAgRGF6dSBnaWJ0IGVzIG51ciBlaW4gQXVzbmFobWU6IFp1bSBad2Vja2UgZGVyIFp3ZWl0aWVtYXJraWVydW5nCisgICAgZGFyZiBkZXIgTWFnaWVyIHNpY2ggZ2xlaWNoemVpdGlnIG1pdCBkZW0gU3BpZWxlcmNoYXJha3RlcgorICAgIGVpbmxvZ2dlbi4KKworICAgIERlciBNYWdpZXItWndlaXRzcGllbGVyIHNvbGx0ZSBkYXJhdWYgYWNodGVuLCBhbmRlcmVuIFNwaWVsZXJuCisgICAgbmljaHQgZHVyY2ggc2VpbmVuIGV2ZW50dWVsbGVuIFdpc3NlbnN2b3J0ZWlsIGJlaSBRdWVzdGVuIHp1CisgICAgaGVsZmVuLgorCisgICAgRWluIE1hZ2llci1ad2VpdHNwaWVsZXIgc29sbHRlIHdlaXRlcmhpbiBkYXJhdWYgYWNodGVuLCBhbmRlcmUKKyAgICBTcGllbGVyIG5pY2h0IGluIGlocmVtIFNwaWVsIHp1IGJlaGluZGVybi4gRGllcyBrb2VubnRlIHp1bQorICAgIEJlaXNwaWVsIGR1cmNoIEJsb2NraWVyZW4gdm9uIFF1ZXN0cyBvZGVyIGJlc3RpbW10ZXIgbGltaXRpZXJ0ZXIKKyAgICBHaWxkZW5yYWVuZ2UgZ2VzY2hlaGVuLgorICAgIERlbiBQcm9ncmFtbWllcmVybiB2b24gUXVlc3RzIG9kZXIgR2lsZGVuIHN0ZWh0IGVzIG5hdHVlcmxpY2ggZnJlaSwKKyAgICBoaWVyIGVpbmUgZWlnZW5lIFZvcnNvcmdlIHp1IHRyZWZmZW4uCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorCisgICAgV2VyIGltIE1vcmdlbkdyYXVlbiBzcGllbHQsIGRlciBpc3QgZGVzIG9lZnRlcmVuIGF1ZiBkaWUgSGlsZmUKKyAgICBBbmRlcmVyIGFuZ2V3aWVzZW4uIEVpbmUgRm9ybSBkZXIgSGlsZmUgaXN0IGVzLCBlaW5lbiBDaGFyYWt0ZXIKKyAgICBhdXN6dWxlaWhlbiBvZGVyIGF1c2dlbGllaGVuIHp1IGJla29tbWVuLgorICAgIFVtIHNwcmFjaGxpY2ggYmVncnVlbmRldGUgTWlzc3ZlcnN0YWVuZG5pc3NlIGltIHdlaXRlcmVuIHp1CisgICAgdmVybWVpZGVuLCBoaWVyIGt1cnogZm9sZ2VuZGUgTm9tZW5rbGF0dXI6CisKKyAgICAgIEVpbiBTcGllbGVyLCBkZXIgZWluZW0gYW5kZXJlbiBTcGllbGVyIGVpbmVuIENoYXJha3RlciB6dXIKKyAgICAgIFZlcmZ1ZWd1bmcgc3RlbGx0LCB3aXJkIGFscyBWZXJsZWloZXIgYmV6ZWljaG5ldC4KKworICAgICAgRWluIFNwaWVsZXIsIGRlciBlaW5lbiBDaGFyYWt0ZXIgZWluZXMgYW5kZXJlbiBTcGllbGVycyBudXR6dCwKKyAgICAgIHdpcmQgYWxzIE51dHplciBiZXplaWNobmV0LgorCisgICAgRGFzIEF1c2xlaWhlbiB2b24gQ2hhcmFrdGVyZW4gaXN0IG1pdCBnZXdpc3NlbiBSYW5kYmVkaW5ndW5nZW4KKyAgICBlcmxhdWJ0LgorCisgICAgRWluIGF1c2dlbGllaGVuZXIgQ2hhcmFrdGVyIHdpcmQgYWxzIGFrdGl2ZXIgWndlaXRzcGllbGVyIGRlcworICAgIE51dHplcnMgYmV0cmFjaHRldCB1bmQgaXN0IHNvbWl0IGRlbiBSZWdlbHVuZ2VuIGZ1ZXIgWndlaXRzcGllbGVyCisgICAgdW50ZXJ3b3JmZW4uCisKKyAgICBCZXNvbmRlcnMgenUgYmVhY2h0ZW4gaXN0LCBkYXNzIGRlciBhdXNnZWxpZWhlbmUgQ2hhcmFrdGVyIG5pY2h0CisgICAgbWl0IGRlbSBOdXR6ZXIsIG9kZXIgZWluZW0gWndlaXRzcGllbGVyIGRlcyBOdXR6ZXJzLCBpbiBlaW4gVGVhbQorICAgIGRhcmYuCisKKyAgICBTb3dvaGwgZGVyIE51dHplciBkZXMgYXVzZ2VsaWVoZW5lbiBTcGllbGVycyBhbHMgYXVjaCBWZXJsZWloZXIsCisgICAga29lbm5lbiBmdWVyIGRpZSBIYW5kbHVuZ2VuIGRlcyBhdXNnZWxpZWhlbiBDaGFyYWt0ZXJzCisgICAgdmVyYW50d29ydGxpY2ggZ2VtYWNodCB3ZXJkZW4uCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorCisgICAgV2VyIG1pdCBlaW5lbSBDaGFyYWt0ZXIgQXVmZ2FiZW4gZ2Vsb2VzdCBoYXQgb2RlciB6dSBiZXN0aW1tdGVuCisgICAgVmVybXV0dW5nZW4gdWViZXIgRm9yc2NoZXJwdW5rdGUgZ2VsYW5ndCBpc3QsIGRlciBub3RpZXJ0IGRpZXMgb2Z0LAorICAgIHVtIGJlaSBzcGFldGVyZW4gQ2hhcmFrdGVyZW4gYXVmIGRpZXNlIEluZm9ybWF0aW9uZW4genVncmVpZmVuIHp1CisgICAga29lbm5lbi4KKworICAgIFNvbGNoZSBGb3JzY2hlcnB1bmt0bGlzdGVuIG9kZXIgS29tcGxldHRsb2VzdW5nZW4gc2luZCB6dW0KKyAgICBFaWdlbmdlYnJhdWNoLCBkYXMgaGVpc3N0IGZ1ZXIgZGllIGVpZ2VuZW4gWndlaXRzcGllbGVyIGVybGF1YnQuCisKKyAgICBEaWUgV2VpdGVyZ2FiZSBkaWVzZXIgSW5mb3JtYXRpb25lbiBvZGVyIGRhcyBOdXR6ZW4gdm9uIG5pY2h0CisgICAgc2VsYnN0IGVyc3RlbGx0ZW4gS29tcGxldHRsb2VzdW5nZW4gb2RlciBGb3JzY2hlcnB1bmt0bGlzdGVuIHNpbmQKKyAgICBhbmRlcmVuIFNwaWVsZXJuIGdlZ2VudWViZXIgaW0gaG9lY2hzdGVuIE1hc3NlIHVuZmFpciB1bmQgZGFoZXIKKyAgICB1bnRlcnNhZ3QuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorCisgICAgVW0gZGFzIFNwaWVsZW4gdm9uIE11ZHMgenUgdmVyZWluZmFjaGVuIHVuZCBrb21mb3J0YWJsZXIgenUKKyAgICBnZXN0YWx0ZW4sIGdpYnQgZXMgZWluZSBSZWloZSBzb2dlbmFubnRlciBNdWQtQ2xpZW50cy4KKworICAgIERpZXNlIENsaWVudGVuIGJpZXRlbiBvZnRtYWxzIGRpZSBNb2VnbGljaGtlaXQsIG1laHJlcmUgS29tbWFuZG9zCisgICAgaW0gTXVkIGF1ZiBlaW5lIGVpbnppZ2UgQWt0aW9uIGhpbiBhdXN6dWZ1ZWhyZW4gb2RlciBhdWYgQXVzZ2FiZW4KKyAgICBtaXQgc29sY2hlbiBLb21tYW5kb2tldHRlbiB6dSByZWFnaWVyZW4uCisKKyAgICBNYW4gc3ByaWNodCBoaWVyIHZvbiBTY3JpcHRlbiBvZGVyIFRyaWdnZXJuLgorCisgICAgWnVzYW1tZW4gbWl0IGVpbmVyIGludGVybmVuIFByb2dyYW1taWVyc3ByYWNoZSBkZXIgQ2xpZW50ZW4gbGFzc2VuCisgICAgc2ljaCB2aWVsZmFjaCBiZXN0aW1tdGUgQWt0aW9uZW4gaW0gTXVkIGF1dG9tYXRpc2llcmVuLgorCisgICAgRGllIFZlcndlbmR1bmcgc29sY2hlciBTY3JpcHRlIGlzdCBtaXQgZWluaWdlbiBBdWZsYWdlbiBqZWRlbQorICAgIFNwaWVsZXIgZnJlaWdlc3RlbGx0LgorCisgICAgU29nZW5hbm50ZSBVbnRlcnN1Y2hlc2NyaXB0ZSwgZGllIHNlbGJzdGFlbmRpZyBlaW5lIG9kZXIgbWVocmVyZQorICAgIERldGFpbHRpZWZlbiB2b24gUmFldW1lbiwgTW9uc3Rlcm4gb2RlciBhbmRlcmVuIEdlZ2Vuc3RhZW5kZW4KKyAgICBhYmZyYWdlbiwgc2luZCBuaWNodCBlcmxhdWJ0LgorCisgICAgSmVkZXIgQ2hhcmFrdGVyIHNvbGx0ZSBpbmRpdmlkdWVsbCBnZXN0ZXVlcnQgd2VyZGVuLCBkYWhlciBzaW5kCisgICAgU2NyaXB0ZSwgZGllIG1laHJlcmUgQ2hhcmFrdGVyZSBhdWYgZWlubWFsIHN0ZXVlcm4gdW50ZXJzYWd0LgorCisgICAgU2NyaXB0ZSwgd2VsY2hlIGVpbmVuIENoYXJha3RlciBpbSBTaW5uZSBlaW5lciBLb21wbGV0dGxvZXN1bmcKKyAgICBkdXJjaCBlaW5lIFF1ZXN0IGZ1ZWhyZW4gb2RlciBlaW5lIEZvcnNjaGVycHVua3RsaXN0ZSBhYmFyYmVpdGVuCisgICAgc2luZCBuaWNodCBlcmxhdWJ0LgorCisgICAgR3J1bmRzYWV0emxpY2ggZHVlcmZlbiBhbmRlcmUgU3BpZWxlciBkdXJjaCBTY3JpcHRlIG5pY2h0IGluIGlocmVtCisgICAgU3BpZWwgYmVoaW5kZXJ0IG9kZXIgYmVsYWVzdGlndCB3ZXJkZW4uCisKKyAgICBBbGxlIGFuZGVyZW4gU2NyaXB0ZSBzaW5kIGVybGF1YnQsIHNvd2VpdCBkZXIgU3BpZWxlciBpbm5lcmhhbGIKKyAgICBlaW5lciBNaW51dGUgaW0gUmFobWVuIHNlaW5lciBNb2VnbGljaGtlaXRlbiBhbnNwcmVjaGJhciBibGVpYnQuCisKKyAgICBBbHMgdW5lcmxhdWJ0ZXMgU2tyaXB0IHphZWhsdCBhdWNoIGRlciBLYW1wZiBtaXQgZWluZW0gTW9uc3RlciwKKyAgICB3ZW5uIGRlciBTcGllbGVyIGRhYmVpIGxhZW5nZXJlIFplaXQga2VpbmUgVGFzdGF0dXJlaW5nYWJlbgorICAgIHZvcm5pbW10IHVuZCBkYWJlaSBuaWNodCBhbnNwcmVjaGJhciBpc3QodG90aWRsZW4pLiBEaWVzIGdpbHQgdm9yCisgICAgYWxsZW0gd2VubiBkZXIgVG9kIGRlcyBNb25zdGVycyBuaWNodCBhYnNlaGJhciBpc3QuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorCisgICAgRGFzIE1vcmdlbkdyYXVlbiBiYXV0IGF1ZiBkaWUgQXJiZWl0IHZpZWxlciBmcmVpd2lsbGlnZXIKKyAgICBQcm9ncmFtbWllcmVyIGF1Zi4gV2llIGJlaSBqZWRlbSBQcm9ncmFtbSBrYW5uIGVzIGRhYmVpIHp1IEZlaGxlcm4sCisgICAgYXVjaCBCdWdzIGdlbmFubnQsIGtvbW1lbi4KKworICAgIEplZGVyIFNwaWVsZXIgc29sbHRlIGVpbiBJbnRlcmVzc2UgZGFyYW4gaGFiZW4sIGRhc3MgZGllc2UgRmVobGVyCisgICAgYmVzZWl0aWd0IHdlcmRlbi4KKworICAgIERpZXMga2FubiBtYW4gZHVyY2ggZWluZSBNZWxkdW5nIGRlcyBGZWhsZXJzIGFuIGRlbiBqZXdlaWxpZ2VuCisgICAgTWFnaWVyIG9kZXIgZmFsbHMgZGllc2VyIG5pY2h0IGVycmVpY2hiYXIgaXN0LCBkdXJjaCBlaW5lIE1lbGR1bmcKKyAgICBhbiBkZW4gZW50c3ByZWNoZW5kZW4gUmVnaW9uc21hZ2llciBlcnJlaWNoZW4uIEF1Y2ggZGVyIEJlZmVobAorICAgICJmZWhsZXIiIGthbm4gaGllciBudWV0emxpY2hlIERpZW5zdGUgbGVpc3Rlbi4KKworICAgIFdlciBkaWVzZSBNYWdpZXIgc2luZCwga2FubiBqZWRlbSBTcGllbGVyIGJlaSBCZWRhcmYgZHVyY2ggZWluZW4KKyAgICBhbndlc2VuZGVuIE1hZ2llciBvZGVyIG9mdCBhdWNoIGFuZGVyZW4gU3BpZWxlciBtaXRnZXRlaWx0IHdlcmRlbi4KKworICAgIERpZXNlcyBWb3JnZWhlbiBzb2xsdGUgYXVjaCBmdWVyIEZlaGxlciBnZWx0ZW4sIGRpZSBkZW0gU3BpZWxlciwKKyAgICBkZXIgZGllc2UgRmVobGVyIGVudGRlY2t0LCB6dW0gVm9ydGVpbCBnZXJlaWNoZW4uCisKKyAgICBTb2xsdGUgc2ljaCBlaW4gU3BpZWxlciBuaWNodCBzaWNoZXIgc2Vpbiwgb2IgZXMgc2ljaCBiZWkgZWluZW0KKyAgICBiZXN0aW1tdGVuIFZlcmhhbHRlbiB2b24gR2VnZW5zdGFlbmRlbiwgTW9uc3Rlcm4gb2RlciBSYWV1bWVuIHVtCisgICAgZWluZW4gRmVobGVyIGhhbmRlbHQgb2RlciB1bSBBYnNpY2h0IGRlcyBQcm9ncmFtbWllcmVzLCBzbyBrYW5uIGVyCisgICAgZGVuIHp1c3RhZW5kaWdlbiBNYWdpZXIgcHJvYmxlbWxvcyBkYW5hY2ggZnJhZ2VuIHVuZCBzb21pdCBiZWkgZGVyCisgICAgQmVzZWl0aWd1bmcgdm9uIEZlaGxlcm4gYWt0aXYgaGVsZmVuLgorCisgICAgRGFzIFZlcnNjaHdlaWdlbiB1bmQgQXVzbnV0emVuIHZvbiBGZWhsZXJuIGlzdCBhbmRlcmVuIFNwaWVsZXJuCisgICAgZ2VnZW51ZWJlciB1bmZhaXIgdW5kIGlzdCBkYWhlciB6dSB1bnRlcmxhc3Nlbi4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisKKyAgICBHcnVuZHNhZXR6bGljaCBzb2xsdGUgZGVyIFNwaWVsc3Bhc3MgZnVlciBtb2VnbGljaHN0IGFsbGUgU3BpZWxlcgorICAgIGVyaGFsdGVuIGJsZWliZW4uIERhenUgZ2Vob2VydCBhdWNoIGVpbiBnZXdpc3NlcyBNYXNzIGFuIEZhaXJuZXNzCisgICAgZGVyIFNwaWVsZXIgdW50ZXJlaW5hbmRlci4KKworICAgIEVzIGlzdCBuaWNodCBkZXIgU2lubiBkZXIgUmVnZWxuLCBkYXMgU3BpZWxlbiBpbSBNb3JnZW5HcmF1ZW4gZHVyY2gKKyAgICBVZWJlcnJlZ2xlbWVudCB6dSBiZWhpbmRlcm4gb2RlciByZWl6bG9zIHp1IGdlc3RhbHRlbi4KKworICAgIERhaGVyIGlzdCBlcyBqZWRvY2ggYXVjaCBtb2VnbGljaCwgZGFzcyBpbSBTcGllbCBTaXR1YXRpb25lbgorICAgIGF1ZnRyZXRlbiwgZGllIGRlbiBTcGllbHNwYXNzIGFuZGVyZXIgU3BpZWxlciB1bmQgZGllIGFsbGdlbWVpbmUKKyAgICBGYWlybmVzcyBiZWVpbnRyYWVjaHRpZ2VuLCBvaG5lIGRhc3MgZGllc2UgU2l0dWF0aW9uIGR1cmNoIGRpZXNlbgorICAgIExlaXRmYWRlbiBhYmdlZGVja3QgaXN0LgorCisgICAgSGllciBpc3QgamVkZXIgU3BpZWxlciB1bmQgYXVjaCBNYWdpZXIgZ2VmcmFndCwgc2VpbmVuIGdlc3VuZGVuCisgICAgTWVuc2NoZW52ZXJzdGFuZCB6dSBiZWZyYWdlbiB1bmQgenUgdWViZXJsZWdlbiwgd2llIGVyIGVpbmUgc29sY2hlCisgICAgU2l0dWF0aW9uIHZlcm1laWRlbiBvZGVyIGVudHNwYW5uZW4ga2FubiwgYXVjaCB3ZW5uIG1hbiBkYW1pdCBhdWNoCisgICAgZWlubWFsIGF1ZiBlaW5lbiBWb3J0ZWlsIHZlcnppY2h0ZW4gbXVzcy4KKworICAgIEVzIGlzdCBhbHNvIGR1cmNoYXVzIG5pY2h0IGFsbGVzIGVybGF1YnQsIHdhcyBuaWNodCBleHBsaXppdAorICAgIHZlcmJvdGVuIGlzdC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisKKyAgICBGdWVyIE1hZ2llciBnZWx0ZW4gbmF0dWVybGljaCB6dXNhZXR6bGljaCBkaWUgUmVnZWxuIGRlcworICAgIE1hZ2llcnZlcnRyYWdlcy4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisKKyAgICBTb2xsdGUgZWluIFNwaWVsZXIgb2RlciBNYWdpZXIgZ2VnZW4gUmVnZWxuIHZlcnN0b3NzZW4gaGFiZW4sIHNvCisgICAga2FubiBkaWVzIHZvbSBTaGVyaWZmLCBzZWluZW4gRGVwdXRpZXMgb2RlciBkZW4gRXJ6bWFnaWVybiBnZWFobmRldAorICAgIHdlcmRlbi4KKyAgICBTdHJhZmVuIGtvZW5uZW4gc2ljaCB2b24gZWluZXIgZWluZmFjaGVuIFZlcndhcm51bmcgYmlzIGhpbiB6dXIKKyAgICBMb2VzY2h1bmcgdm9uIENoYXJha3RlcmVuIGVyc3RyZWNrZW4uCisKKyAgICBEaWUgU3RyYWZlbiB3ZXJkZW4gaW4gZWluZW0gZ2VzdW5kZW4gVmVyaGFlbHRuaXMgenVtIEZlaGx2ZXJoYWx0ZW4KKyAgICBkZXMgU3BpZWxlcnMgc3RlaGVuLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKworICAgIFdlciBkaWUgRnVua3Rpb24gZGVzIFNoZXJpZmZzIG9kZXIgZWluZXMgRGVwdXRpZXMgd2Focm5pbW10LCBrYW5uCisgICAgbWFuIG1pdCBkZW0gS29tbWFuZG8gJ2hpbGZlIHNoZXJpZmYnIGVyZnJhZ2VuLgorCisKKyBTSUVIRSBBVUNIOgorICAgIHp3ZWl0aWVtYXJraWVydW5nLCBmZWhsZXIsIHNoZXJpZmYKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgRnJpLCAwOC4wNi4yMDAxLCAxMTozNTowMCB2b24gTm9ubmUKKyAgICAKZGlmZiAtLWdpdCBhL2RvYy9oZWxwL3JlZ2lvbmVuIGIvZG9jL2hlbHAvcmVnaW9uZW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI3ODM1MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9oZWxwL3JlZ2lvbmVuCkBAIC0wLDAgKzEsMzcgQEAKK0RpZSBSZWdpb25lbiBpbSBNb3JnZW5HcmF1ZW4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRnVlciBzbyBtYW5jaGVuIFNwaWVsZXIgaXN0IGVzIHZpZWxsZWljaHQgdm9uIEludGVyZXNzZSB6dSBlcmZhaHJlbiwgd2VsY2hlcgorTWFnaWVyIGZ1ZXIgd2VsY2hlIFJlZ2lvbiB6dXN0YWVuZGlnIGlzdC4gRGFzIGlzdCB6dW0gZWluZW4gaGlsZnJlaWNoLCB3ZW5uCittYW4gZWluIFNlaGVyaGF1cyBiYXVlbiB3aWxsLCB6dW0gYW5kZXJlbiBhYmVyIGF1Y2ggZGFubiwgd2VubiBtYW4gc2ljaCBtaXQKK2RlciBBYnNpY2h0IHRyYWVndCBzZWxic3QgbWFsIE1hZ2llciB6dSB3ZXJkZW4gdW5kIGVpbmVuIEFuc3ByZWNocGFydG5lcgorc3VjaHQuCisKK0hpZXIgYWxzbyBhbGxlIFJlZ2lvbmVuIGRlcyBNb3JnZW5ncmF1ZW5zIG1pdCBpaHJlbiBSZWdpb25zbWFnaWVybjoKKworICAgQW5mYWVuZ2VyICAgICBBcmsKKyAgIERzY2h1bmdlbCAgICAgQXJrCisgICBFYmVuZSAgICAgICAgIEFyYXRob3JuCisgICBGZXJud2VzdCAgICAgIFZhbmlvbgorICAgR2ViaXJnZSAgICAgICBCYW1iaQorICAgSW5zZWxuICAgICAgICBNaXJpbAorICAgUG9sYXIgICAgICAgICBIdW1uaSwgQ2FsZHJhCisgICBTY2hhdHRlbndlbHQgIFpvb2sKKyAgIFNlaGVyICAgICAgICAgWm9vaworICAgVW50ZXJ3ZWx0ICAgICBaZXNzdHJhICh2ZXJ0cmV0dW5nc3dlaXNlIGluIEFid2VzZW5oZWl0IGVpbmVzIFJNKQorICAgVkxhbmQgICAgICAgICBCdWdmaXgsIEVzbWUsIG51ciBub2NoIHNwaXJpdHVzIHJlY3RvcjogTW9yZ290aAorICAgV2FsZCAgICAgICAgICBOb3RzdHJvbSAKKyAgIFd1ZXN0ZSAgICAgICAgTm90c3Ryb20sIEVubm94CisKK1dlbm4gRHUgZGVuIFJlZ2lvbnNtYWdpZXJuIGVpbmVyIFJlZ2lvbiBlaW5lIE1haWwgc2NocmVpYmVuIG1vZWNodGVzdCwKK3NvIHZlcndlbmRlIGFtIGJlc3RlbiBkaWUgTWFpbC1BbGlhc2UgInJtXzxyZWdpb25uYW1lPiIuCisKK0ZhbGxzIGRlci9kaWUgUk1zIGVpbmVyIFJlZ2lvbiB1ZWJlciBsYWVuZ2VyZSBaZWl0IG5pY2h0IGVycmVpY2hiYXIgc2luZDoKKyogYml0dGUgZXJzYXR6d2Vpc2UgZWluZW4gRXJ6bWFnaWVyIGFuc3ByZWNoZW4KKyogYmVpIGFrdXRlbiBQcm9ibGVtZW4gbWl0ICJtcnVmZSIgdW5kICJtYWlsIGVyem1hZ2llciIgYWxsZSBhbnNwcmVjaGVuCisKK1NJRUhFIEFVQ0g6CisJR2lsZGVubWFnaWVyCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IDIwMTUtMTItMTggdm9uIFpvb2suCmRpZmYgLS1naXQgYS9kb2MvaGVscC9yZXNldCBiL2RvYy9oZWxwL3Jlc2V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNDUxYTkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaGVscC9yZXNldApAQCAtMCwwICsxLDM5IEBACisKK1Jlc2V0Cis9PT09PQorCisgICAgUmVzZXRzIHNpbmQgZWluIEVyZWlnbmlzIGZ1ZXIgYWxsZSBPYmpla3RlIChhbHNvIFdlc2VuLCBSYWV1bWUsIFdhZmZlbgorICAgIHVuZCBSdWVzdHVuZ2VuKS4KKyAgICBEYWJlaSB3ZXJkZW4gZGllc2UgKG9mdCkgYXVmIGVpbmVuIGJlc3RpbW10ZW4gWnVzdGFuZCB6dXJ1ZWNrZ2VzZXR6dAorICAgIG9kZXIgZXMgd2VyZGVuIEFrdGlvbmVuLCB3aWUgekIgSGVpbHVuZyBkdXJjaCBBbXVsZXR0ZSBkdXJjaGdlZnVlaHJ0LgorCisgICAgU3BlemllbGwgYmVpIFJhZXVtZW4gd2VyZGVuIGltIFJlc2V0OgorICAgICAgMS4gT2JqZWt0ZSBkZXMgUmF1bWVzIG5ldWVyemV1Z3Q6CisgICAgICAgICAqIHNvd29obCBoZXJ1bWxpZWdlbmRlIE9iamVrdGUsIHdlbGNoZSBlbnRmZXJudCB3dXJkZW4KKyAgICAgICAgICogYWxzIGF1Y2ggZ2V0b2V0ZXRlIE5QQ3MsIGRpZSBqZXR6dCB3aWVkZXJiZWxlYnQgd2VyZGVuCisgICAgICAyLiBUdWVyZW4gZ2VzY2hsb3NzZW4vZ2VvZWZmbmV0IChqZSBuYWNoIFVyc3BydW5nc3p1c3RhbmQpLgorICAgICAgMy4gZ2xlaWNoZSwgaGVydW1saWVnZW5kZSBPYmpla3RlIGltIFJhdW0gYXVmZ2VyYWV1bXQuCisgICAgICAgICAoZGFuYWNoIGdpYnQgZXMgbWF4aW1hbCAzIGdsZWljaGUgT2JqZWt0ZSwgZGFzIGZpbmRldCBudXIgYmVpCisgICAgICAgICAgU3BpZWxlcmFid2VzZW5oZWl0IHN0YXR0KQorCisgICAgU3BlemllbGwgMS4gaXN0IGludGVyZXNzYW50LCB3ZWlsIGluIGVpbmVtIFJlc2V0IG1pdCBlaW5lbSBNYWwgd2llZGVyCisgICAgZGllc2VzIGZpZXNlIEJsb2NrYWRlbW9uc3RlciBhdWZ0YXVjaHQgb2RlciBlbmRsaWNoIGRlciBoZWlzc2Vyc2VobnRlCisgICAgUXVlc3RnZWdlbnN0YW5kIGVybGFuZ2JhciBpc3QuCisKKyAgICBOb3JtYWxlcndlaXNlIGlzdCBkaWUgWmVpdCB6d2lzY2hlbiB6d2VpIFJlc2V0cyAzMCtyYW5kb20oMzApIE1pbnV0ZW4uCisgICAgQWxsZXJkaW5ncyB2ZXJhZW5kZXJuIE1hZ2llciBkaWVzZSBXZXJ0ZSBnZXJuIG1hbC4KKworIEJFTUVSS1VOR0VOOgorICAgIEJlcnVlaG10LWJlcnVlY2h0aWd0IGlzdCBkZXIgc29nZW5hbm50ZSBCb2luZy1SZXNldDoKKyAgICBBdXMgdGVjaG5pc2NoZW4gR3J1ZW5kZW4gZmFuZCBmcnVlaGVyIGVpbiBSZXNldCBpbiBlaW5lbSBkYXMgZXJzdGUgTWFsCisgICAgc2VpdCBsYW5nZXIgWmVpdCBiZXRyZXRlbmVuICh1bmQgZGFtaXQgZ2VsYWRlbmVuKSBSYXVtIHNlaHIgZnJ1ZWggbmFjaAorICAgIGRpZXNlbSBCZXRyZXRlbiBzdGF0dC4KKyAgICBJbnNiZXNvbmRlcmUgaW4gZGVyIFNTUCAoYWxzbyBCb2luZ3MgR2ViaWV0KSBmYW5kIG1hbiBzaWNoIGRhZHVyY2gKKyAgICBwbG9ldHpsaWNoIGVybmV1dCBpbiBkZXIgR2VzZWxsc2NoYWZ0IGVpbmVzIGRvY2ggZ2VyYWRlIGViZW4gaG9lZmxpY2gKKyAgICBoaW5mb3J0a29tcGxpbWVudGllcnRlbiBCbG9ja2FkZW1vbnN0ZXJzIHdpZWRlci4KKworIFNJRUhFIEFVQ0g6CisgICAgYWJrLCByZWJvb3QsIGFiZW50ZXVlcgorCisyMS4xMC4yMDE0LCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9oZWxwL3NlaGVyIGIvZG9jL2hlbHAvc2VoZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlmMTQ3YwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9oZWxwL3NlaGVyCkBAIC0wLDAgKzEsNjIgQEAKKworU2VoZXIKKz09PT09CisKKyAgICBTZWhlciBpbSBNb3JnZW5HcmF1ZW4gc2luZCBTcGllbGVyLCBkaWUgZHVyY2ggZGFzIEVyZnVlbGxlbiAKKyAgICBiZXN0aW1tdGVyIEFuZm9yZGVydW5nZW4gemVpZ2VuLCBkYXNzIHNpZSBzaWNoIGltIE1vcmdlbkdyYXVlbgorICAgIGd1dCBhdXNrZW5uZW4gdW5kIHNjaG9uIGVpbmUgUmVpaGUgdm9uIEhlcmF1c2ZvcmRlcnVuZ2VuIAorICAgIGdlbWVpc3RlcnQgaGFiZW4uIERpZSBTZWhlci1BbmZvcmRlcnVuZ2VuIG11c3MgbWFuIGF1Y2ggZXJmdWVsbGVuLAorICAgIHVtIE1hZ2llciB3ZXJkZW4genUga29lbm5lbi4KKworICAgIE1pdCBkZW0gU3RhdHVzIGRlcyBTZWhlcnMgc2luZCBlaW5pZ2UgVm9ycmVjaHRlIHZlcmJ1bmRlbiwgZGllIGRlbQorICAgICdrbGVpbmVuJyBTcGllbGVyIG5pY2h0IHp1ciBWZXJmdWVndW5nIHN0ZWhlbjoKKworICAgICAqIFNlaGVyIGtvZW5uZW4gZWluaWdlIEFzcGVrdGUgaWhyZXIgQ2hhcmFrdGVyYmVzY2hyZWlidW5nIHdpZSB6LkIuIGRlbgorICAgICAgIFRpdGVsLCBkYXMgUHJlc2F5IG9kZXIgZGllIEJld2VndW5nc21lbGR1bmdlbiBhZW5kZXJuLgorICAgICAqIFNlaGVyIGtvZW5uZW4gc2ljaCBlaW4gSGF1cyBiYXVlbiB1bmQgd2VpdGdlaGVuZCBmcmVpIGVpbnJpY2h0ZW4uIERhcworICAgICAgIEhhdXMgZGllbnQgZGFuYWNoIGF1Y2ggYWxzIFN0YXJ0cHVua3QgbmFjaCBlbmRlIG9kZXIgZWluZW0gUmVib290LgorICAgICAqIEluIGVpbmlnZW4gR2lsZGVuIHN0ZWhlbiBkaWUgaG9lY2hzdGVuIFJhZW5nZSwgWmF1YmVyc3BydWVjaGUgb2RlcgorICAgICAgIEthbXBmdGVjaG5pa2VuIG51ciBTZWhlcm4gb2ZmZW4uCisgICAgICogV2VpdGVyZSBCb25ib25zIHN0ZWxsdCBkaWUgRnJhdGVybml0YXMgZG9ubyBBcmNobWFnb3J1bSAKKyAgICAgICB6dXIgVmVyZnVlZ3VuZy4gCisKKyAgICBEaWUgQmVkaW5ndW5nZW4gZnVlciBkZW4gU2VoZXJzdGF0dXMgc2luZCB3aWUgZm9sZ3QgZmVzdGdlbGVndDoKKworICAgIEluc2dlc2FtdCBiZW5vZXRpZ3QgbWFuIDM4MDAgU3R1ZmVucHVua3RlIHVuZCBtdXNzIGRpZSAKKyAgICBTcGllbGVyc3R1ZmUgNDIgZXJyZWljaHQgaGFiZW4sIHVtIFNlaGVyIHp1IHdlcmRlbi4gRnVlciBkaWUgCisgICAgU3R1ZmVucHVua3RlIG11c3MgbWFuIGluIGVpbmlnZW4gQmVyZWljaGVuIGdld2lzc2UgTWluZGVzdHB1bmt0LQorICAgIHphaGxlbiBlcnJlaWNoZW46CisKKyAgICAgKiBNYW4gbXVzcyBtaW5kZXN0ZW5zIDE2MTAgQWJlbnRldWVycHVua3RlIGVyemllbHQgaGFiZW4uCisgICAgICogTWFuIG11c3MgbWluZGVzdGVucyAxMDAgRm9yc2NoZXJwdW5rdGUgZ2VzYW1tZWx0IGhhYmVuLCBkZW0KKyAgICAgICBlbnRzcHJlY2hlbiA2MDAgU3R1ZmVucHVua3Rlbi4gCisgICAgICogTWFuIG11c3MgbWluZGVzdGVucyA0MCBaYXViZXJ0cmFlbmtlIGdlZnVuZGVuIGhhYmVuLCBkZW0KKyAgICAgICBlbnRzcHJlY2hlbiAyMDAgU3R1ZmVucHVua3RlLgorICAgICAqIE1hbiBtdXNzIGVpbmUgUmVpaGUgdm9uIHd1ZXJkaWdlbiBHZWduZXJuIGVybGVndCBoYWJlbiwgc28gCisgICAgICAgZGFzcyBtYW4gYXVzIGRpZXNlbiAiRXJzdGtpbGxzIiAxNTAgU3R1ZmVucHVua3RlIGVyemllbHQuCisKKyAgICBEaWUgdmVyYmxlaWJlbmRlbiBTdHVmZW5wdW5rdGUga29lbm5lbiBhdWYgamVkZSBiZWxpZWJpZWdlCisgICAgQXJ0IGdlc2FtbWVsdCB3ZXJkZW4gKHNvIGF1Y2ggZGllIFN0dWZlbnB1bmt0ZSwgZGllIGZ1ZXIgZGllIAorICAgIEdpbGRlbmZhZWhpZ2tlaXRlbiwgZnVlciBNaW5pUXVlc3RzIGV0Yy4gdmVyZ2ViZW4gd2VyZGVuKS4gCisKKyAgICAqKiBXSUNIVElHRVIgSElOV0VJUzogCisgICAgKiogRGllIFNlaGVyYW5mb3JkZXJ1bmdlbiB3ZXJkZW4gamFlaHJsaWNoIHZvbiBkZW4gRXJ6bWFnaWVybgorICAgICoqIGV2YWx1aWVydCB1bmQgZ2dmLiBuYWNoIG9iZW4gb2RlciB1bnRlbiBhbmdlcGFzc3QuIERlciBUZXJtaW4KKyAgICAqKiBmdWVyIHNvbGNoZSBldHdhaWcgd2lsbGt1ZXJsaWNoZSBBbnBhc3N1bmdlbiBpc3QgamVkZXMgSmFocgorICAgICoqIGRlciAxNS4gU2VwdGVtYmVyLiAKKworICAgIFdlbm4gbWFuIGFsbGUgQW5mb3JkZXJ1bmdlbiBlcmZ1ZWxsdCBoYXQsIGthbm4gbWFuIHNpY2ggdm9uCisgICAgTWVybGluIGJlZm9lcmRlcm4gbGFzc2VuLiAKKworICAgIElzdCBtYW4gZWlubWFsIFNlaGVyLCB1bmQgYmVrb21tdCBwbG9ldHpsaWNoIGRvY2ggTHVzdCwgc2ljaCBhbHMgTWFnaWVyIHp1CisgICAgYmV0YWV0aWdlbiwgc28ga2FubiBtYW4gb2huZSB3ZWl0ZXJlcyBNYWdpZXIgd2VyZGVuICh3ZW5uIG1hbiBlaW5lbgorICAgIFNwb25zb3IgZmluZGV0KS4KKworU0lFSEUgQVVDSDoKKyAgICBhbGxnLiBIaWxmZTogbWVybGluLCBzdHVmZW4sIHN0dWZlbnB1bmt0ZSwgYWJlbnRldWVyLCBmb3JzY2hlcnB1bmt0ZSwgCisgICAgICAgICAgICAgICAgIG1hZ2llcgorICAgIFNlaGVyaGlsZmU6IGhhdXNiYXUsIGV4dHJhbG9vaywgZmVobGVybWVsZHVuZywgZmx1Y2h0cmljaHR1bmcsIHByZXNheSwgCisgICAgICAgICAgICAgICAgcmV2aWV3LCBzZXRoYW5kcywgc2V0bWluLCBzZXRtb3V0LCBzZXRtbWluLCBzZXRtbW91dCwgdGl0ZWwKKyAgICAgICAgICAgICAgICAobnVyIGFiIFNlaGVyc3RhdHVzIGxlc2JhcikKKworTEVUWlRFIEFlTkRFUlVORzogMjAxNi0wNi0wNSB2b24gQXJhdGhvcm4KZGlmZiAtLWdpdCBhL2RvYy9oZWxwL3NlaGVydG9yZSBiL2RvYy9oZWxwL3NlaGVydG9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODZlNTA1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2hlbHAvc2VoZXJ0b3JlCkBAIC0wLDAgKzEsMzAgQEAKK1NlaGVydG9yZQorPT09PT09PT09CisKKyAgICBTZWhlcnRvcmUgc2luZCB1ZWJlciBkYXMgZ2VzYW10ZSBNb3JnZW5HcmF1ZW4gdmVydGVpbHQgdW5kIG51ciBmdWVyCisgICAgU2VoZXIgenUgZXJrZW5uZW4gdW5kIHp1IG51dHplbi4KKworICAgIE1pdGhpbGZlIGRpZXNlciBQb3J0YWxlIGlzdCBlcyBtb2VnbGljaCwgZ3Jvc3NlIERpc3RhbnplbiBpbSBNRworICAgIGR1cmNoIGVpbmVuIFRlbGVwb3J0IHZvbiBlaW5lbSBUb3IgenUgZWluZW0gYW5kZXJlbiB6dXJ1ZWNrenVsZWdlbi4KKyAgICBMaWVndCBkYXMgWmllbCBhdWYgZWluZXIgYW5kZXJlbiBJbnNlbCBhbHMgZGFzIFN0YXJ0dG9yLCBzaW5kIHp1bQorICAgIFRlbGVwb3J0aWVyZW4gTWFnaWVwdW5rdGUgbm90d2VuZGlnLgorCisgICAgRGllIGZydWVoZXIgbW9lZ2xpY2hlICJGZWhsdGVsZXBvcnRhdGlvbiIgaXN0IGluendpc2NoZW4genVtIAorICAgIEdsdWVjayBkZXIgU2VoZXIgYWJnZXNjaGFmZnQgd29yZGVuLiBXb2JlaSBpbiBkZXIgUGFyYWxsZWx3ZWx0IGF1Y2gKKyAgICBkaWVzYmV6dWVnbGljaCBtYW5jaG1hbCBhbmRlcmUgUmVnZWxuIGdlbHRlbi4KKworICAgIEJldm9yIGplZG9jaCBTZWhlcnRvcmUgYmVudXR6dCB3ZXJkZW4ga29lbm5lbiwgbXVlc3NlbiBzaWUgZW50ZGVja3QKKyAgICB3ZXJkZW4uIERpZXMgZ2VzY2hpZWh0IG9mdG1hbHMgZHVyY2ggYmxvc3NlcyBCZXRyZXRlbiBlaW5lcyBSYXVtZXMsCisgICAgaW4gZGVtIGVpbiBTZWhlcnRvciBhdWZnZXN0ZWxsdCBpc3Q7IGVzIGlzdCBqZWRvY2ggYXVjaCBkZW5rYmFyLCAKKyAgICBkYXNzIG5hZWhlcmUgVW50ZXJzdWNodW5nZW4gb2RlciBnYXIgQWt0aW9uZW4gbm90d2VuZGlnIHdlcmRlbiwgYmUtCisgICAgdm9yIHNpY2ggZWluIFNlaGVydG9yIHp1IGVya2VubmVuIGdpYnQuCisKKyAgICBFaW5tYWwgZ2VmdW5kZW5lIFNlaGVydG9yZSBibGVpYmVuIGJla2FubnQuCisKKyAgICBTZWl0IGVpbmlnZXIgWmVpdCBlcmxhdWJ0IGRpZSBGcmF0ZXJuaXRhcyBEb21vIEFyY2htYWdvcnVtIGF1Y2gKKyAgICBTcGllbGVybiBkYXMgRXJsZXJuZW4gdm9uIFBvcnRhbGVuLiBEaWVzIGlzdCBqZWRvY2ggZWluZ2VzY2hyYWVua3QuCisgICAgRGF6dSBzb2xsdGUgbWFuIHNpY2ggaW4gZGVyIEZyYXRlcm5pdGFzIGVpbmZhY2ggZWlubWFsIGVpbiB3ZW5pZyAKKyAgICB1bXNjaGF1ZW4uCisKKyBMRVRaVEUgQWVOREVSVU5HOgorCTIwMTMtMDEtMjcgdm9uIEh1bW5pCmRpZmYgLS1naXQgYS9kb2MvaGVscC9zaGVyaWZmIGIvZG9jL2hlbHAvc2hlcmlmZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDZjMTZlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2hlbHAvc2hlcmlmZgpAQCAtMCwwICsxLDE4IEBACitEZXIgU2hlcmlmZiB1ZWJlcm5pbW10IGRpZSBBdXNsZWd1bmcgZGVyIFJlZ2VsbiB1bmQgQWhuZHVuZyB2b24gUmVnZWwtCit2ZXJzdG9lc3Nlbi4gRXIgc3RlbGx0IGluc29mZXJuIGFsc28gZWluZSBBcnQgU2NoaWVkc3JpY2h0ZXIgZGEuIAorCitEZXJ6ZWl0IGlzdCBBbWFyeWxsaXMgZGFmdWVyIHp1c3RhZW5kaWcuCisKK0VzIHN0ZWh0IGRlbiBTaGVyaWZmcyBmcmVpLCB3ZWl0ZXJlIERlcHV0eXMgenUgZXJuZW5uZW4gZGllIHNpZSBiZWkKK2RlciBBcmJlaXQgdW50ZXJzdHVldHplbiwgaW4gamVkZW0gRmFsbCBpc3QgaWhyZW4gQW53ZWlzdW5nZW4gdW5kCitkZW5lbiBpaHJlciBEZXB1dHlzIEZvbGdlIHp1IGxlaXN0ZW4uCisKK01lbGRldCBFdWNoIGJlaSBGcmFnZW4gb2RlciBQcm9ibGVtZW4gYml0dGUgZGlyZWt0IGJlaSBpaG5lbiBvZGVyCitzY2hpY2t0IGlobmVuIGVpbmUgTWFpbCwgaGlsZnJlaWNoIGlzdCBoaWVyIGF1Y2ggZGFzIE1haWxhbGlhcworInBvbGl6ZWkiLgorCitTSUVIRSBBVUNIOgorICAgbGVpdGZhZGVuCisKK0xFVFpURSBBZU5ERVJVTkc6CisgICAwNC4wMi4yMDA4IHZvbiBaZXNzdHJhLgpkaWZmIC0tZ2l0IGEvZG9jL2hlbHAvc296aWFsbWVkaWVuIGIvZG9jL2hlbHAvc296aWFsbWVkaWVuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ODY5NDcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaGVscC9zb3ppYWxtZWRpZW4KQEAgLTAsMCArMSwxNCBAQAorRGl2ZXJzZSBNRy1HcnVwcGVuIGF1c3NlcmhhbGIgZGVzIE1VRHMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK01vcmdlbmdyYXVlbiBiZXNpdHp0IG1vbWVudGFuOgorCisgKiBlaW5lbiBUd2l0dGVyLUFjY291bnQ6IGh0dHBzOi8vdHdpdHRlci5jb20vbW9yZ2VuZ3JhdWVuCisgKiBlaW5lIEZhY2Vib29rLUdydXBwZTogaHR0cHM6Ly93d3cuZmFjZWJvb2suY29tL2dyb3Vwcy8xMjAzNzA4NDU1NzkKKyAqIGVpbmUgRystQ29tbXVuaXR5OgorICAgaHR0cHM6Ly9wbHVzLmdvb2dsZS5jb20vY29tbXVuaXRpZXMvMTAxMDkyNDU0OTc1NzgyMjUyNzAyCisKK1NJRUhFIEFVQ0g6CisgICAgdGVhbXNwZWFrCisKKzEuIEp1biAyMDE2LCBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL2hlbHAvc3BpZWxlIGIvZG9jL2hlbHAvc3BpZWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZDZkM2UKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaGVscC9zcGllbGUKQEAgLTAsMCArMSwzNCBAQAorCitTcGllbGUKKz09PT09PQorCisgICAgIEFscyB3YWVyZSBkYXMgTW9yZ2VuZ3JhdWVuIG5pY2h0IFNwaWVsIGdlbnVnLCBoYWJlbiBzaWNoIGRvY2ggZWluaWdlCisgICAgIG1hZ2lzY2ggd2Fua2VuZGUgR2VzdGFsdGVuIGRhcmFuIGdlbWFjaHQgbm9jaCBnYW56IGFuZGVyZSBTcGllbGUgenUKKyAgICAgYmFzdGVsbiwgYmVpIGRlbmVuIG1hbiBzaWNoIHZvbSBNZXR6ZWwtIHVuZCBRdWVzdGFsbHRhZyBlcmhvbGVuIGthbm4uCisKKyAgICAgV2VuIGVzIGFsc28gcmVpenQsIGRlciBrYW5uIGZvbGdlbmRlIFNwaWVsZSB6dXNhbW1lbiBtaXQgYW5kZXJlbgorICAgICBTcGllbGVybiBzdWNoZW4gdW5kIHZlcnN1Y2hlbjoKKworICAgICAxNyY0CQlXYWxkLCBFbGZlbmRvcmYsIENhc2lubworICAgICA0IEdld2lubnQJCUViZW5lLCBQb3J0IFZhaW4KKyAgICAgQWJhbG9uZQkJRWJlbmUsIFBvcnQgVmFpbiwgT3dlbiBCcmFkZG9uCisgICAgIERhcnQJCVZsYW5kLCBPcmtoYXVzZW4sIEtuZWlwZQorICAgICBEb3BwZWxrb3BmCQlJbnNlbG4sIFNoYWt5IElzbGFuZAorICAgICBGdXNzYmFsbAkJRWJlbmUsIEZldWVyYmVyZ3N0YWRpb24KKyAgICAgR28JCQlGZXJud2VzdCwgWGlhbgorICAgICBNYWV4Y2hlbgkJRWJlbmUsIFBvcnQgVmFpbiwgQWJlbnRldXJlcmtuZWlwZS9Pd2VuIEJyYWRkb24KKyAgICAgTWluZXN3ZWVwZXIJRHNjaHVuZ2VsLCBPaG9ydCwgSGludGVyemltbWVyCisgICAgIFJhZ2UJCVdhbGQsIERyYWtvbmllbiwgSHVldHRlCisgICAgIFJvZGVsbgkJUG9sYXIsIFR1bmRyYQorICAgICBTY2hhY2gJCUdlYmlyZ2UsIEhvY2hlYmVuZQorICAgICBTa2F0CQlHZWJpcmdlLCBMdXBpbmVudGFsLCBLbmVpcGUKKyAgICAgVGFibHV0CQlHZWJpcmdlLCBCZXJnZG9yZiwgS25laXBlCisgICAgIFRha2UgSXQgRWFzeQlEc2NodW5nZWwsIFN0ZXBwZSwgSHVldHRlCisgICAgIE1vbm9wb2x5ICAgICAgICAgICBGZXVlcmluc2VsLCBWdWxrYW4gZC4gUGFyYXdlbHQgKEdsYWRpb1BvbGlzKQorCisgU0lFSEUgQVVDSDoKKyAgICAgcGFydGllcywgc3RlcmJlbgorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICAgMjIuIE1hZXJ6IEdsb2luc29uCisKZGlmZiAtLWdpdCBhL2RvYy9oZWxwL3NwaWVsZXJ0ZXN0aWVzIGIvZG9jL2hlbHAvc3BpZWxlcnRlc3RpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAyMDRiZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9oZWxwL3NwaWVsZXJ0ZXN0aWVzCkBAIC0wLDAgKzEsODUgQEAKK1NwaWVsZXJ0ZXN0aWVzCis9PT09PT09PT09PT09PQorCitOYWNoIEFic3ByYWNoZSBtaXQgZWluZW0gRXJ6bWFnaWVyIGlzdCBlcyBlcmxhdWJ0LCBkYXNzIGVpbiBTcGllbGVyCit1bmFuZ2VzY2hsb3NzZW5lIEdlYmlldGUsIFF1ZXN0cyBvZGVyIGF1Y2ggR2lsZGVuIHRlc3RldC4gCisKK0Z1ZXIgZGFzIFRlc3RlbiB2b24gR2ViaWV0ZW4gdW5kIFF1ZXN0ZW4gZ2lidCBlcyB6d2VpIE1vZWdsaWNoa2VpdGVuOgorICAKK0RlciBNYWdpZXIgbGVpdGV0IGRlbiBUZXN0IGhhdXB0dmVyYW50d29ydGxpY2g6CitEaWVzZSBSZWdlbHVuZyBpc3Qgdm9yIGFsbGVtIGZ1ZXIgZGFzIFRlc3RlbiBrbGVpbmVyZXIgUXVlc3RzIHVuZCBHZWJpZXRlIGdlZGFjaHQuCitIaWVyIGdlbHRlbiBmb2xnZW5kZSBSZWdlbG46CisgRGVyIFNwaWVsZXIsIGRlciBkZW4gVGVzdCBkdXJjaGZ1ZWhydCwgYmVrb21tdCBlaW5lbiBUZXN0c3BpZWxlciBkZXMgTWFnaWVycyAKKyBzb3dpZSBlaW5lIGFuZ2VtZXNzZW5lIEF1c3J1ZXN0dW5nLiBCZWkgZGVyIEF1c3dhaGwgZWluZXMgVGVzdHNwaWVsZXJzCisgaXN0IGVzIGF1Y2ggbW9lZ2xpY2ggVGVzdHNwaWVsZXIgYW5kZXJlciBNYWdpZXIgbWl0IGRlcmVuIEVpbnZlcnN0YWVuZG5pcworIHp1IHZlcndlbmRlbi4KKyBEZXIgbGVpdGVuZGUgTWFnaWVyIGluZm9ybWllcnQgZWluZW4gRXJ6bWFnaWVyIHVlYmVyIGRlbiBUZXN0c3BpZWxlci4KKyBEZXIgVGVzdHNwaWVsZXIgZGFyZiB3YWVocmVuZCBkZXIgVGVzdHplaXQgZGFzIFRlc3RnZWJpZXQgbmljaHQgdmVybGFzc2VuIHVuZCAKKyBhdWNoIGtlaW5lIE9iamVrdGUgZGVzIHp1IHRlc3RlbmRlbiBHZWJpZXRlcyBhbiBhbmRlcmUgd2VpdGVycmVpY2hlbi4gCisgRGVyIFRlc3RzcGllbGVyIHdpcmQgd2FlaHJlbmQgZGVyIGdhbnplbiBUZXN0emVpdCB2b20gTWFnaWVyIHVlYmVyd2FjaHQuIAorIERpZXMgZ2VzY2hpZWh0IHNvd29obCB6dXIgVWViZXJ3YWNodW5nIGRpZXNlciBSZWdlbG4sIGFscyBhdWNoLCAgdW0gZGVtIAorIHByb2dyYW1taWVyZW5kZW4gTWFnaWVyIHdlaXRlcmUgSWRlZW4genVyIFZlcmZ1ZWd1bmcgenUgc3RlbGxlbi4KKyBEaWVzZXIgVGVzdCBrYW5uIG5hY2ggZGVyIEZlcnRpZ3N0ZWxsbmcgdW5kIFRlc3RzIGRlcyBHZWJpZXRlcyBkdXJjaCBkZW4gCisgdmVyYW50d29ydGxpY2hlbiBNYWdpZXIgc3RhdHRmaW5kZW4uCisgCitFaW4gRXJ6bWFnaWVyIGxlaXRldCBkZW4gVGVzdCBoYXVwdHZlcmFudHdvcnRsaWNoOgorRGllc2UgUmVnZWx1bmcgaXN0IHZvciBhbGxlbSBmdWVyIGRhcyBUZXN0ZW4gZ3JvZXNzZXJlciBRdWVzdHMgdW5kIEdlYmlldGUgCitnZWRhY2h0LgorSGllciBnZWx0ZW4gZm9sZ2VuZGUgUmVnZWxuOgorIERlciBTcGllbGVyLCBkZXIgZGVuIFRlc3QgZHVyY2hmdWVocnQsIGJla29tbXQgZHVyY2ggZGVuIEVyem1hZ2llciBlaW5lbiAKKyBUZXN0c3BpZWxlciBzb3dpZSBlaW5lIGFuZ2VtZXNzZW5lIEF1c3J1ZXN0dW5nIGdlc3RlbGx0LiBCZWkgZGVyIEF1c3dhaGwgCisgZWluZXMgVGVzdHNwaWVsZXJzIGlzdCBlcyBhdWNoIG1vZWdsaWNoIFRlc3RzcGllbGVyIGFuZGVyZXIgTWFnaWVyIG1pdCAKKyBkZXJlbiBFaW52ZXJzdGFlbmRuaXMgenUgdmVyd2VuZGVuLiBEaWVzZXIgVGVzdHNwaWVsZXIgZGFyZiB3YWVocmVuZCBkZXIgCisgVGVzdHplaXQgZGFzIFRlc3RnZWJpZXQgbmljaHQgdmVybGFzc2VuIHVuZCBhdWNoIGtlaW5lIE9iamVrdGUgZGVzIHp1IAorIHRlc3RlbmRlbiBHZWJpZXRlcyBhbiBhbmRlcmUgd2VpdGVycmVpY2hlbi4gCisgRGVyIFRlc3RzcGllbGVyIHdpcmQgd2FlaHJlbmQgZGVyIGdhbnplbiBUZXN0emVpdCB2b20gTWFnaWVyIHVuZCBFcnptYWdpZXIgCisgdWViZXJ3YWNodC4gRGllcyBnZXNjaGllaHQgc293b2hsIHp1ciBVZWJlcndhY2h1bmcgZGllc2VyIFJlZ2VsbiwgYWxzIGF1Y2gsICAKKyB1bSBkZW0gcHJvZ3JhbW1pZXJlbmRlbiBNYWdpZXIgd2VpdGVyZSBJZGVlbiB6dXIgVmVyZnVlZ3VuZyB6dSBzdGVsbGVuLgorIERlciBFcnN0Y2hhcmFrdGVyIGRlcyBTcGllbGVycyAoYXVmIFd1bnNjaCBhdWNoIGVpbiBad2VpdGllKSBlcmhhZWx0IG5hY2gKKyBBYnNjaGx1c3MgZGVzIFRlc3RzIGRpZSBnZWZ1bmRlbmVuIEZvcnNjaGVycHVua3RlIHVuZCBFcnN0a2lsbHN0dXBzZSAKKyBndXRnZXNjaHJpZWJlbiwgYWJlciBhdWNoIGRpZSBlcmxpdHRlbmVuIFNjaGFlZGVuIChpbnNiZXNvbmRlcmUgVG9kZSkgLSAKKyBzZWxic3R2ZXJzdGFlbmRsaWNoLCBzb3dlaXQgc2llIG5pY2h0IGR1cmNoIFByb2dyYW1taWVyLWZlaGxlciBiZWRpbmd0IHdhcmVuLgorRGllc2VyIFRlc3QgZmluZGV0IE5BQ0ggZGVtIFRlc3QgZGVzIEdlYmlldGVzIGR1cmNoIGRlbiB6dXN0YWVuZGlnZW4gCitSZWdpb25zbWFnaWVyIHVuZCAoYmVpIFF1ZXN0ZW4pIGR1cmNoIGRlbiBRdWVzdC1FcnptYWdpZXIsIHNvd2llIE5BQ0ggCitFaW50cmFnIGRlciBGb3JzY2hlcnB1bmt0ZSBzdGF0dC4KKworQmVpZGUgVGVzdHZhcmlhbnRlbiBlcnNldHplbiBhdWYga2VpbmVuIEZhbGwgZGllIFRlc3RzIGR1cmNoIE1hZ2llci4gIAorCitGdWVyIGRhcyBUZXN0ZW4gdm9uIEdpbGRlbiBnZWx0ZW4gYW5kZXJlIFJlZ2VsbiwgZGEgc2ljaCBkaWVzZSB6dXNhbW1lbiBtaXQKK2FuZGVyZW4gU3BpZWxlcm4gaW4gZ2xlaWNoZW4gR2ViaWV0ZW4gYXVmaGFsdGVuIGtvZW5uZW46CisKKzEpIEdpbGRlbnRlc3RpZXMgc2luZCBpbW1lciBlY2h0ZSwgenUgZGllc2VtIFp3ZWNrIGVyc2NoYWZmZW5lIFRlc3RzcGllbGVyLgorICAgUF9URVNUUExBWUVSIHdpcmQgZGFiZWkgYXVmIGRlbiBOYW1lbiBkZXIgR2lsZGUgZ2VzZXR6dC4KKworMikgSmVkZXIgZWluZW0gU3BpZWxlciB6dXIgVmVyZnVlZ3VuZyBnZXN0ZWxsdGUgR2lsZGVudGVzdGllIG11c3MgCisgICBtaXR0ZWxzIFBfU0VDT05EIG1pdCBkZW0gTmFtZW4gZGVzIEVyc3RzcGllbGVycyBtYXJraWVydCBzZWluLCBkZXIKKyAgIGlobiBmdWVocnQuIEplZGVyIFRlc3RzcGllbGVyIHNvbGx0ZSBlaW5kZXV0aWcgenV6dW9yZG5lbiBzZWluLgorICAKKzMpIERpZSBUZXN0aWVzIHVudGVybGllZ2VuIEFMTEVOIFJlZ2VsbiBkZXMgVGVzdGllLURhc2VpbnMuIERhcyBoZWlzc3QKKyAgIHVudGVyIGFuZGVyZW0sIGRhc3Mgc2llIE5JQ0hUIGZ1ZXIgYW5kZXJlIFNwaWVsZXIgQXVzcnVlc3R1bmcgYmVzY2hhZmZlbgorICAgb2RlciBXZWdlIGZyZWltZXR6ZWxuIGR1ZXJmZW4hIFZlcnN0b2Vzc2UgaGllcmdlZ2VuIGtvZW5uZW4gdW50ZXIKKyAgIFVtc3RhZW5kZW4genVyIExvZXNjaHVuZyBkZXIgYmVndWVuc3RpZ3RlbiBTcGllbGVyY2hhcmFrdGVyZSB1bmQKKyAgIGRlcyBUZXN0Y2hhcmFrdGVycyBmdWVocmVuLgorCis0KSBEaWUgVGVzdGllcyB3ZXJkZW4gc3RhZW5kaWcgdWViZXJ3YWNodC4gTG9nZmlsZXMga29lbm5lbiB1bnRlciBVbXN0YWVuZGVuCisgICB2b24gZGVuIEdpbGRlbm1hZ2llcm4gZWluZ2VzZWhlbiB3ZXJkZW4uCisKKzUpIEplZGVyIFRlc3RpZSBtdXNzIHZvbSBFTSBHaWxkZW4gKHouWi4gSHVtbmkpIGdlbmVobWlndCB3ZXJkZW4hCisKKzYpIDUgVGVzdGllcyBwcm8gR2lsZGUgc29sbHRlbiBnZW51ZWdlbi4gV2VubiBlaW4gVGVpbCBkZXIgVGVzdGllcyBuaWNodHMKKyAgIHR1dCwga2FubiBtYW4gZGVuIFRlc3RpZSBhdWNoIHdlaXRlcmdlYmVuIGxhc3Nlbi4KKworU0lFSEUgQVVDSDoKKyAgICAgICAgRXJ6bWFnaWVyLCBHaWxkZW5tYWdpZXIsIFJlZ2lvbnNtYWdpZXIsIFRvZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBGcmkgT2N0IDE4IDE2OjI0OjAwIDIwMDIgYnkgTXVhZGliCisKKworRnVlciBNYWdpZXIuCitNYWdpZXIga29lbm5lbiBuYXR1ZXJsaWNoIG9obmUgQWJzcHJhY2hlIFRlc3RzcGllbGVyIGVpbmVyIGJlc3RpbW10ZW4gR2lsZGUKK2hhYmVuLCBzb2Zlcm4gZGllc2Ugbm9ybWFsZW4gU3BpZWxlcm4genVnYWVuZ2xpY2ggaXN0LiBTb2Zlcm4gZWluZSBHaWxkZSBkYXMKK0FubGVnZW4gdm9uIFRlc3RzcGllbGVybiB1bnRlcnN0dWV0enQsIGdpYnQgZXMgZW50c3ByZWNoZW5kZSBIaWxmZXNlaXRlbiB1bnRlcgorPGdpbGRlbm5hbWU+LnRlc3RzcGllbGVyIC0genVtIEJlaXNwaWVsIGthdHplbmtyaWVnZXIudGVzdHNwaWVsZXIKKworWnVzYXR6OiBUdWUgSmFuICA3IDIzOjIyOjQ0IDIwMDMsIGR1cmNoIEJhbWJpLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9oZWxwL3N0ZXJiZW4gYi9kb2MvaGVscC9zdGVyYmVuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4YWIyNzAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaGVscC9zdGVyYmVuCkBAIC0wLDAgKzEsMzcgQEAKKyBTdGVyYmVuIGlzdCBpbiBkaWVzZW0gTXVkIHJlY2h0IGxlaWNodC4KKyBFaW5pZ2UgcmVjaHQgc2ljaGVyZSBNb2VnbGljaGtlaXRlbiBzaW5kOgorIC0gSW4gZGllIFN0ZWluYmVpc3NlcmhvZWhsZSwgcyxzLG8sbixuLAorIC0gSW4gZGVuIFNjaGFjaHQgZGVyIEYmRSAoQXJjaGllKSwgMTUgbWFsICJ1bnRlbiIgdGlwcGVuCisgLSBCZWkgZGVuIFJhZXViZXJuICJ2b3JzaWNodCAwIiwgInRvZXRlIGFsbGUiCisgLSBJbiBZYW50cm9zIEhhdXMgZGVyIEZhcmJlbiBpbSBzY2h3YXJ6ZW4gUmF1bTogYmVzY2h3b2VyZSBUb2QKKyAtIEluIGRlciBEYWVtb25lbmtuZWlwZSAoWmFyZG96JyBCdXJnKToga2F1ZmUgbGlxb3VyIG1hbm9yCisgLSBQYW5kb3JhOiBCZWltIFNraXNwcmluZ2VuIGRpZSBTa2llciBhdXN6aWVoZW4KKyAtIEJlaSBkZXIgSHlkcmEgc29sYW5nZSBLb2VwZmUgYWJzY2hsYWdlbiB1bmQgTklDSFQgYXVzYnJlbm5lbiwKKyAgIGJpcyBjYS4gNTAgU3R1ZWNrIGRhIHNpbmQsIERBTk4gZGVuIEtvZXJwZXIgYW5ncmVpZmVuLgorIC0gQXVmIFRhbWliYXI6IHRvZXRlIGhhaWF2YWhhIChOb2NoIHNpY2hlcmVyOiBNYW4gc2FnZSBCb3dhbidzCisgICBTcHJ1Y2ggYXVzICJUcmF1bXBhcmsiIGF1Zi4uLikKKyAtIEluIE9ya2hhdXNlbnMgS2F0YWtvbWJlbjogbnVyIGVpbiB3ZW5pZyBrYWVtcGZlbiB1bmQgaWRsZW4KKyAtIEltIFRhbCBkZXIgTHVwaW5lbiBhbSB6ZXJzdG9lcnRlbiBTY2hyZWluOiBiZXRlCisgLSBBbHMgU2VoZXI6ICJmbHVjaHRyaWNodHVuZyBlZ2Fsd29oaW4iLCAidG9ldGUgd2VnaGllciIKKyAtIEluIEZla2VzaCdzIExhZGVuICJrYXVmZSB0YW1haG9ybnkiLCAzeCAic2NobGFnZSB0YW1haG9ybnkiCisgLSBJbiBkZXIgU2F1bmEgIm5pbW0gaGFuZHR1Y2giLCAidG9ldGUgbWFzc2V1ciIKKyAtIEFscyBFbGY6IER1bmtlbGVsZmVuIHRvZXRlbiwgIm5pbW0gcnVuZW5zY2h3ZXJ0IiwgInp1ZWNrZSBydW5lbnNjaHdlcnQiCisgLSBBbHMgWmF1YmVyZXI6IEluIGRlciBBcmNoaWUtS25laXBlIGVpbmVuIEdyb2cgdW5kIGVpbmUgQ29sYSA0MCB0cmlua2VuLAorICAgYW5zY2hsaWVzc2VuZCAidmVybGV0emUgYXJjaGl0ZWt0IgorIC0gQWxzIEthcmF0ZWthOiBTdGVpbnRyb2xsIGFuZ3JlaWZlbgorCisgR2VuZXJlbGxlIFRpcHBzOgorIC0gInZvcnNpY2h0IDAiIGlzdCBiZWkgdmVyZWluemVsdGVuIEdlZ25lcm4gYW5nZWJyYWNodDsgd2VubiBhZ2dyZXNzaXZlCisgICBNb25zdGVyIGluIGRlbiBOZWJlbnJhZXVtZW4gc3RlaGVuLCBpc3QgaG9oZSB2b3JzaWNodCBzaW5udm9sbGVyLgorIC0gInRvZXRlIGFsbGUiIGJlaSB2aWVsZW4gc3RhcmtlbiBHZWduZXJuIGZ1ZWhydCByZWNodCBzaWNoZXIgenVtIFRvZAorIC0gb2huZSBSdWVzdHVuZyBzdGlyYnQgbWFuIGxlaWNodGVyCisgLSBBbHMgU2VoZXI6ICJmbHVjaHRyaWNodHVuZyAtQiBJY2ggd2lsbCBzdGVyYmVuISIKKyAtIEtleSBmcmFnZW4sIGRlciBrYW5uIGJyYXVjaGJhcmUgVGlwcyBnZWJlbgorIC0gTW9uc3RlciB2b24gUm9jaHVzIG9kZXIgUGF0cnluIGFuZ3JlaWZlbiAKKworIFNJRUhFIEFVQ0g6CisgICAgdG9ldGUsIHZvcnNpY2h0LCBmbHVjaHRyaWNodHVuZywga2FtcGYKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgMTIuMTIuMjAxMSwgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2MvaGVscC9zdHVmZW4gYi9kb2MvaGVscC9zdHVmZW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM0NzMyZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9oZWxwL3N0dWZlbgpAQCAtMCwwICsxLDUzIEBACisKK3N0dWZlbgorPT09PT09CisKKyAgICBTZWluZSAoU3BpZWxlci0pU3R1ZmUga2FubiBtYW4gaW4gamVkZXIgR2lsZGUgZXJob2VoZW4uIERpZSBlaW56aWdlCisgICAgVm9yYXVzc2V0enVuZyBkYWJlaSBpc3QgZXMsIGdlbnVlZ2VuZCBTdHVmZW5wdW5rdGUgenUgaGFiZW4uCisKKyAgICBBYiBTdHVmZSA5IGdpbHQ6CisgICAgVW0gYXVmIFN0dWZlIDx4PiBhdWZzdGVpZ2VuIHp1IGtvZW5uZW4sIGJlbm9ldGlndCBtYW4gPHgtND4qMTAwIGRpZXNlcgorICAgIFN0dWZlbnB1bmt0ZS4KKyAgICBCaXMgU3R1ZmUgOSBrb3N0ZW4gZGllIFN0dWZlbiB3ZW5pZ2VyIGFscyAxMDAgU3R1ZmVucHVua3RlIChzLiBUYWJlbGxlKS4KKworICAgIERpZSBlaW56aWdlIEF1c25haG1lIGlzdCBkZXIgQXVmc3RpZWcgdm9tIFNwaWVsZXIgenVtIFNlaGVyIG9kZXIgTWFnaWVyOgorICAgICBVbSBTZWhlciB6dSB3ZXJkZW4gZ2lidCBlcyB6dXNhZXR6bGljaGUgQmVkaW5ndW5nZW4sIHdpZSBiZXN0aW1tdGUKKyAgICAgQW56YWhsZW4gdm9uIEFiZW50ZXVlcnB1bmt0ZW4sIEZvcnNjaGVycHVua3RlbiB1bmQgRXJzdGtpbGxzLiBEaWUKKyAgICAgYWt0dWVsbGUgTGlzdGUgaXN0IHVudGVyIGRlciBIaWxmZXNlaXRlICJzZWhlciIgenUgZmluZGVuLgorICAgICBNYWdpZXIga2FubiBtYW4gbmFjaCBFcnJlaWNoZW4gZGVzIFNlaGVyc3RhbmRzIGF1ZiBBbmZyYWdlIGJlaSBlaW5lbQorICAgICBob2VoZXJlbiBNYWdpZXIgd2VyZGVuLgorCisgICAgQmlzIHp1ciBTdHVmZSAxOSBzZWhlbiBkaWUgU3R1ZmVuYmV6ZWljaG51bmdlbiBmdWVyIEFiZW50ZXVyZXIgd2llIGZvbGd0CisgICAgYXVzOgorCisgICAgICBTdHVmZSAgU3QucGt0ZSAgICAgICAgTWFlbm5saWNoICAgICAgICAgICAgICAgV2VpYmxpY2ggICAgICAgICAgCisgICAgICAgMTkgICAgIDE1MDAgICAgICBkZXIgYW5nZWhlbmRlIFNlaGVyICAgICBkaWUgYW5nZWhlbmRlIFNlaGVyaW4gICAgIAorICAgICAgIDE4ICAgICAxNDAwICAgICAgZGVyIEhlbGQgICAgICAgICAgICAgICAgZGllIEhlbGRpbiAgICAgICAgICAgICAgICAKKyAgICAgICAxNyAgICAgMTMwMCAgICAgIGRlciBFcm9iZXJlciAgICAgICAgICAgIGRpZSBFcm9iZXJlcmluICAgICAgICAgICAgCisgICAgICAgMTYgICAgIDEyMDAgICAgICBkZXIgRW50ZGVja2VyICAgICAgICAgICBkaWUgRW50ZGVja2VyaW4gICAgICAgICAgIAorICAgICAgIDE1ICAgICAxMTAwICAgICAgZGVyIEZldWVyYmFlbmRpZ2VyICAgICAgZGllIEZldWVyYmFlbmRpZ2VyaW4gICAgICAKKyAgICAgICAxNCAgICAgMTAwMCAgICAgIGRlciBTY2hhdHpzdWNoZXIgICAgICAgIGRpZSBTY2hhdHpzdWNoZXJpbiAgICAgICAgCisgICAgICAgMTMgICAgICA5MDAgICAgICBkZXIgRHJhdWZnYWVuZ2VyICAgICAgICBkaWUgRHJhdWZnYWVuZ2VyaW4gICAgICAgIAorICAgICAgIDEyICAgICAgODAwICAgICAgZGVyIFdlbHRlbmJ1bW1sZXIgICAgICAgZGllIFdlbHRlbmJ1bW1sZXJpbiAgICAgICAKKyAgICAgICAxMSAgICAgIDcwMCAgICAgIGRlciBBYmVudGV1cmVyICAgICAgICAgIGRpZSBBYmVudGV1cmVyaW4gICAgICAgICAgCisgICAgICAgMTAgICAgICA2MDAgICAgICBkZXIgUmVpc2VuZGUgICAgICAgICAgICBkaWUgUmVpc2VuZGUgICAgICAgICAgICAgIAorICAgICAgICA5ICAgICAgNTAwICAgICAgZGVyIEt1bmRzY2hhZnRlciAgICAgICAgZGllIEt1bmRzY2hhZnRlcmluICAgICAgICAKKyAgICAgICAgOCAgICAgIDQyMCAgICAgIGRlciBKYWVnZXIgICAgICAgICAgICAgIGRpZSBKYWVnZXJpbiAgICAgICAgICAgICAgCisgICAgICAgIDcgICAgICAzNDAgICAgICBkZXIgV2VnZWt1bmRpZ2UgICAgICAgICBkaWUgV2VnZWt1bmRpZ2UgICAgICAgICAgIAorICAgICAgICA2ICAgICAgMjgwICAgICAgZGVyIEZhZWhydGVuc3VjaGVyICAgICAgZGllIEZhZWhydGVuc3VjaGVyaW4gICAgICAKKyAgICAgICAgNSAgICAgIDIyMCAgICAgIGRlciBXYWxkbGFldWZlciAgICAgICAgIGRpZSBXYWxkbGFldWZlcmluICAgICAgICAgCisgICAgICAgIDQgICAgICAxODAgICAgICBkZXIgV2FuZGVyZ2VzZWxsZSAgICAgICBkaWUgV2FuZGVyZ2VzZWxsaW4gICAgICAgIAorICAgICAgICAzICAgICAgMTQwICAgICAgZGVyIFN0cmV1bmVyICAgICAgICAgICAgZGllIFN0cmV1bmVyaW4gICAgICAgICAgICAKKyAgICAgICAgMiAgICAgIDEyMCAgICAgIGRlciBMYW5kc3RyZWljaGVyICAgICAgIGRpZSBMYW5kc3RyZWljaGVyaW4gICAgICAgCisgICAgICAgIDEgICAgICAxMDAgICAgICBkZXIgaG9mZm51bmdzdm9sbGUgICAgICBkaWUgaG9mZm51bmdzdm9sbGUgICAgICAgIAorCisgICAgU2VoZXJzdHVmZW4gdHJhZ2VuIGtlaW5lbiBUaXRlbCwgZGEgamVkZXIgU2VoZXIgc2VpbmVuIFRpdGVsIHNlbGJzdCBmcmVpCisgICAgd2FlaGxlbiBkYXJmLgorCisgU0lFSEUgQVVDSDoKKyAgICBzZWhlciwgbWFnaWVyLCBtYWdpZXJzdHVmZW4KKyAgICBmb3JzY2hlcnB1bmt0ZSwgc3R1ZmVucHVua3RlCisgICAgYWJlbnRldWVyCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIDA0LjA1LjIwMTMsIFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9oZWxwL3N0dWZlbnB1bmt0ZSBiL2RvYy9oZWxwL3N0dWZlbnB1bmt0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTZmNDcwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2hlbHAvc3R1ZmVucHVua3RlCkBAIC0wLDAgKzEsNTYgQEAKKworU3R1ZmVucHVua3RlCis9PT09PT09PT09PT0KKworICAgIERpZSBTdHVmZW5wdW5rdGUgYmlsZGVuIGRpZSBHcnVuZGxhZ2UgZGVzIG5ldWVuIFN0dWZlbmtvbnplcHRlcyBpbQorICAgIE1vcmdlbkdyYXVlbi4gQW5zdGF0dCB3aWUgZnJ1ZWhlciBudXIgZHVyY2ggRXJmYWhydW5nc3B1bmt0ZSB1bmQgaW4KKyAgICBnZXdpc3NlbSBNYXNzZSBBYmVudGV1ZXJwdW5rdGUgd2lyZCBkaWUgTW9lZ2xpY2hrZWl0IHp1bSBBdWZzdGllZyBudW4gYXVjaAorICAgIG5vY2ggdm9uIGVpbmlnZW4gYW5kZXJlbiBGYWt0b3JlbiBiZXN0aW1tdCwgZGllIGluc2dlc2FtdCBlaW5lCisgICAgYXVzZ2V3b2dlbmVyZSBFaW5zY2hhZXR6dW5nIGRlcyBDaGFyYWt0ZXJzIGVybW9lZ2xpY2hlbiBzb2xsZW46CisKKyAgICBEZW4gd2ljaHRpZ3N0ZW4gQW50ZWlsIGJpbGRlbiBudW4gZGllIEFiZW50ZXVlcnB1bmt0ZS4gU2llIGdlaGVuIGltCisgICAgVmVyaGFlbHRuaXMgMToxIGluIGRpZSBTdHVmZW5wdW5rdGUgZWluLgorCisgICAgRGVyIHp3ZWl0Z3JvZXNzdGUgQW50ZWlsIHdpcmQgdm9uIGRlbiBGb3JzY2hlcnB1bmt0ZW4gZ2VzdGVsbHQuIERpZXNlCisgICAgUHVua3RlIHdlcmRlbiBlaW5lbSB6d2FyIG5pY2h0IGRpcmVrdCBhbHMgWmFobCBiZWthbm50IGdlZ2ViZW47IG1pdCBkZW0KKyAgICBCZWZlaGwgYGluZm8nIChhdWNoIGFscyBgc2NvcmUnIG9kZXIgYHB1bmt0ZScgYmVrYW5udCkga2FubiBtYW4gamVkb2NoCisgICAgZWluZSBFaW5zY2hhZXR6dW5nIGRlciBNdWQtS2VubnRuaXMgYWJmcmFnZW4uCisKKyAgICBEZW4gbmFlY2hzdGVuIEFudGVpbCBsaWVmZXJuIGdlZnVuZGVuZSBaYXViZXJ0cmFlbmtlIHVuZCBlaW4gd2VpdGVyZXMKKyAgICBMZXZlbCBkaWUgSGVpbHRyYWVua2UgKGRpZSBsZXR6dGVuIHZpZXIgWlRzKS4KKworICAgIERpZSBHaWxkZSwgaW4gZGVyIG1hbiBzaWNoIGJlZmluZGV0LCBsaWVmZXJ0IGVpbmVuIHZpZXJ0ZW4gQW50ZWlsLiBIaWVyCisgICAgZ2VoZW4gaW4gZGVyIFJlZ2VsIGRpZSBLZW5udG5pc3NlIGRlciBlaW56ZWxuZW4gU3BydWVjaGUgdW5kIGRlcgorICAgIEZhZWhpZ2tlaXRlbiBlaW4sIGRpZSBtYW4gaW4gZGVyIEdpbGRlIGVybGVybmVuIGthbm4gKGRhcyBpc3QgYWJlciBqZWRlcgorICAgIEdpbGRlIHNlbGJzdCB1ZWJlcmxhc3NlbikuIEdpbGRlbiwgYXVzIGRlbmVuIG1hbiBhdXNnZXRyZXRlbiBpc3QsIHdlcmRlbgorICAgIGRhYmVpIG5pY2h0IGJlcnVlY2tzaWNodGlndCEgTWFuY2hlIEdpbGRlbiB2ZXJnZWJlbiBzZWhyIHZpZWxlIFN0dWZlbi0KKyAgICBwdW5rdGUgc2Nob24gYmlzIExldmVsIDIwLiBEYW5uIHZlcmxpZXJ0IG1hbiBiZWltIFdlY2hzZWwgZWluaWdlIFN0dWZlbiwKKyAgICBkaWUgbWFuIGluIGRlciBuZXVlbiBHaWxkZSBhYmVyIG1pdCBkZXIgWmVpdCB3aWVkZXIgZXJsYW5ndC4KKworICAgIFNjaGxpZXNzbGljaCBnaWJ0IGVzIG5vY2ggU3R1ZmVucHVua3RlIGZ1ZXIgZGFzIFRvZXRlbiB2b24gTW9uc3Rlcm47CisgICAgYWxsZXJkaW5ncyBtdXNzIGRhcyBNb25zdGVyIGRhZnVlciBlaW5lIGJlc3RpbW10ZSBtaW5pbWFsZSBNZW5nZSB2b24KKyAgICBFcmZhaHJ1bmdzcHVua3RlbiBnZWJlbi4gRGllc2UgUHVua3RlIHdlcmRlbiBudXIgZnVlciBkYXMgZXJzdG1hbGlnZQorICAgIFRvZXRlbiBkZXMgTW9uc3RlcnMgdmVyZ2ViZW4uIEVzIG51ZXR6dCBhbHNvIG5pY2h0cywgZGVuIHNlbGJlbiBPcmsgMjcgbWFsCisgICAgenUgdG9ldGVuOyB3ZW5uIGVyIHVlYmVyaGF1cHQgU3R1ZmVucHVua3RlIGFid2lyZnQsIGRhbm4gbnVyIGJlaW0gZXJzdGVuCisgICAgTWFsLgorCisgICAgKEVpbiBlcndlaXRlcnRlciBIaW53ZWlzIHp1bSBUaGVtYSBFcnN0a2lsbC1TdHVmZW5wdW5rdGUsIGluc2Jlc29uZGVyZQorICAgICBpbiBadXNhbW1lbmhhbmcgbWl0IEtlcmJob2x6IHVuZCAgRHVlc3RlcndhbGQtUGxha2V0dGUsIGlzdCBpbiBkZXIKKyAgICAgSGlsZmVzZWl0ZSAiZXJzdGtpbGxzdHVmZW5wdW5rdGUiIChvZGVyICJla3MiKSB6dSBmaW5kZW4uKQorCisgICAgQXVjaCAiTWluaVF1ZXN0cyIga29lbm5lbiBTdHVmZW5wdW5rdGUgdmVyZ2ViZW4uIChNaW5pcXVlc3RzIHNpbmQga2xlaW5lCisgICAgQXVmZ2FiZW4sIGRpZSBrZWluZSBBYmVudGV1ZXJwdW5rdGUgZ2ViZW4pLgorCisgICAgVW5kIHp1bSBndXRlbiBTY2hsdXNzIGtvbW1lbiBhdWNoIGRpZSBFcmZhaHJ1bmdzcHVua3RlIG5vY2ggenUgRWhyZW4sIHdlbm4KKyAgICBhdWNoIG5pY2h0IHp1IGJlc29uZGVycyBncm9zc2VuLi4uIDstKQorICAgIEZ1ZXIgeCBFcmZhaHJ1bmdzcHVua3RlIGVyaGFlbHQgbWFuIHheMC4zMiBTdHVmZW5wdW5rdGUsIHNvIGRhc3MgaW0KKyAgICB1bnRlcmVuIEVyZmFocnVuZ3NwdW5rdGViZXJlaWNoIHJlY2h0IHNjaG5lbGwgU3R1ZmVucHVua3RlIGVyemllbHQKKyAgICB3ZXJkZW4sIG5hY2ggb2JlbiBoaW4gamVkb2NoIGltbWVyIHdlbmlnZXIgU3R1ZmVucHVua3RlIHBybyBlcnppZWx0ZW0KKyAgICBFcmZhaHJ1bmdzcHVua3QgdmVyZ2ViZW4gd2VyZGVuLgorCisgU0lFSEUgQVVDSDoKKyAgICBmb3JzY2hlcnB1bmt0ZSwgaW5mbywgc3R1ZmVuLCBlcnN0a2lsbHN0dWZlbnB1bmt0ZSwgZXJ6bWFnaWVyCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFdlZCwgMDkuMDUuMDEsIDE1OjAwOjAwIHZvbiBSaWt1cworIApkaWZmIC0tZ2l0IGEvZG9jL2hlbHAvc3R1bm5lbCBiL2RvYy9oZWxwL3N0dW5uZWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhiNDZkZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9oZWxwL3N0dW5uZWwKQEAgLTAsMCArMSw3MyBAQAorVmVyc2NobHVlc3NlbHVuZyBkZXIgTVVELUtvbW11bmlrYXRpb24gbWl0IHN0dW5uZWwKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBNaXQgJ3N0dW5uZWwnIGthbm4gbWFuIHNlaW5lIHNhZW10bGljaGUgS29tbXVuaWthdGlvbiBtaXQgZGVtIE1VRAorICAgIHZlcnNjaGx1ZXNzZWxuLiBEYXp1IHN0YXJ0ZXQgbWFuIGxva2FsIGJlaSBzaWNoIHN0dW5uZWwgdW5kIHZlcmJpbmRldAorICAgIHNpY2ggZGFubiBwZXIgdGVsbmV0L3RmLy4uLiBtaXQgZGllc2VtIENsaWVudC4KKyAgICBJbiBkZW4gZm9sZ2VuZGVuIEJlaXNwaWVsZW4gd2lyZCBkYWZ1ZXIgamV3ZWlscyBsb2NhbGhvc3Q6NDcxMSBiZW51dHp0LgorCisgICAgU3R1bm5lbCBnaWJ0IGVzIGZ1ZXIgZGl2ZXJzZSBPUyB1bnRlcjogaHR0cDovL3d3dy5zdHVubmVsLm9yZy8KKyAgICAKKyAgICBTdGFydCB2b24gc3R1bm5lbCB1bnRlciBMaW51eCB1QWU6CisgICAgKiBiaXMgenVyIFZlcnNpb24gMy4qIG1pdCBkZW0gS29tbWFuZG8KKyAgICAgIHN0dW5uZWwgLWMgLWQgNDcxMSAtciBtZy5tdWQuZGU6NDcxMgorICAgICogYWIgVmVyc2lvbiA0LiogbWl0IEtvbmZpZ3VyYXRpb25zZGF0ZWkgZm9sZ2VuZGVuIEluaGFsdHMsIGdlZm9sZ3QKKyAgICAgIHZvbiBTdGFydCB2aWEgInN0dW5uZWwgPGtvbmZpZ3VyYXRpb25zZGF0ZWk+IgorICAgIC0tCisgICAgICBmb3JlZ3JvdW5kID0geWVzCisgICAgICBjbGllbnQgPSB5ZXMKKworICAgICAgW21nXQorICAgICAgY29ubmVjdCA9IG1nLm11ZC5kZTo0NzEyCisgICAgICBhY2NlcHQgPSBsb2NhbGhvc3Q6NDcxMQorICAgIC0tCisKKyAgICBTdGFydCB2b24gc3R1bm5lbCB1bnRlciBXaW5kb3dzOgorICAgICogSW5zdGFsbGllcmVuL1N0YXJ0ZW4sIGRhbm4gdW50ZXIgQ29uZmlndXJhdGlvbiBkaWUgRGF0ZWkgc3R1bm5lbC5jb25mCisgICAgICBlZGl0aWVyZW4gdW5kIGJlaSAnU2VydmljZSBkZWZpbml0aW9ucycgZm9sZ2VuZGUgWmVpbGVuIGhpbnp1ZnVlZ2VuOgorICAgIC0tCisgICAgICBjbGllbnQgPSB5ZXMKKyAgICAgIFttZ10KKyAgICAgIGNvbm5lY3QgPSBtZy5tdWQuZGU6NDcxMgorICAgICAgYWNjZXB0ID0gMTI3LjAuMC4xOjQ3MTEKKyAgICAtLQorCisgQkVNRVJLVU5HRU46CisgICAgRGVyIFNlcnZlciB1bnRlcnN0dWV0enQgS29tcHJlc3Npb24sIHpCIGR1cmNoIGRpZSBLb25maWd1cmF0aW9uc3plaWxlOgorICAgICAgY29tcHJlc3Npb24gPSB6bGliCisgICAgYXVzc2VyaGFsYiBkZXMgUHJvZmlscy4KKyAgICAKKyAgICBBdXN6dWdzd2Vpc2UgbW9tZW50YW4gbW9lZ2xpY2hlIENoaWZmcmVuIHNpbmQsIG5hY2ggU3RhZXJrZSBhdWZzdGVpZ2VuZDoKKyAgICAgIERFUy1DQkMtU0hBICAgICAgICAgICBTU0x2MyBLeD1SU0EgICAgQXU9UlNBICBFbmM9REVTKDU2KSAgIE1hYz1TSEExCisgICAgICBSQzQtU0hBICAgICAgICAgICAgICAgU1NMdjMgS3g9UlNBICAgIEF1PVJTQSAgRW5jPVJDNCgxMjgpICBNYWM9U0hBMQorICAgICAgUkM0LU1ENSAgICAgICAgICAgICAgIFNTTHYzIEt4PVJTQSAgICBBdT1SU0EgIEVuYz1SQzQoMTI4KSAgTWFjPU1ENSAKKyAgICAgIENBTUVMTElBMTI4LVNIQSAgICAgICBTU0x2MyBLeD1SU0EgICAgQXU9UlNBICBFbmM9Q2FtZWxsaWEoMTI4KSBNYWM9U0hBMQorICAgICAgREhFLVJTQS1BRVMxMjgtU0hBICAgIFNTTHYzIEt4PURIICAgICBBdT1SU0EgIEVuYz1BRVMoMTI4KSAgTWFjPVNIQTEKKyAgICAgIERFUy1DQkMzLVNIQSAgICAgICAgICBTU0x2MyBLeD1SU0EgICAgQXU9UlNBICBFbmM9M0RFUygxNjgpIE1hYz1TSEExCisgICAgICBFREgtUlNBLURFUy1DQkMzLVNIQSAgU1NMdjMgS3g9REggICAgIEF1PVJTQSAgRW5jPTNERVMoMTY4KSBNYWM9U0hBMQorCisgICAgICBBRVMxMjgtU0hBICAgICAgICAgICAgU1NMdjMgS3g9UlNBICAgIEF1PVJTQSAgRW5jPUFFUygxMjgpICBNYWM9U0hBMQorICAgICAgQUVTMTI4LVNIQTI1NiAgICAgICAgIFRMU3YxLjIgS3g9UlNBICBBdT1SU0EgIEVuYz1BRVMoMTI4KSAgTWFjPVNIQTI1NgorICAgICAgQUVTMTI4LUdDTS1TSEEyNTYgICAgIFRMU3YxLjIgS3g9UlNBICBBdT1SU0EgIEVuYz1BRVNHQ00oMTI4KSBNYWM9QUVBRAorICAgICAgQUVTMjU2LVNIQSAgICAgICAgICAgIFNTTHYzIEt4PVJTQSAgICBBdT1SU0EgIEVuYz1BRVMoMjU2KSAgTWFjPVNIQTEKKyAgICAgIEFFUzI1Ni1TSEEyNTYgICAgICAgICBUTFN2MS4yIEt4PVJTQSAgQXU9UlNBICBFbmM9QUVTKDI1NikgIE1hYz1TSEEyNTYKKyAgICAgIEFFUzI1Ni1HQ00tU0hBMzg0ICAgICBUTFN2MS4yIEt4PVJTQSAgQXU9UlNBICBFbmM9QUVTR0NNKDI1NikgTWFjPUFFQUQKKworICAgICAgREhFLVJTQS1DQU1FTExJQTI1Ni1TSEEgU1NMdjMgS3g9REggICBBdT1SU0EgIEVuYz1DYW1lbGxpYSgyNTYpIE1hYz1TSEExCisgICAgICBESEUtUlNBLUFFUzI1Ni1TSEEgICAgU1NMdjMgS3g9REggICAgIEF1PVJTQSAgRW5jPUFFUygyNTYpICBNYWM9U0hBMQorICAgICAgREhFLVJTQS1BRVMyNTYtU0hBMjU2IFRMU3YxLjIgS3g9REggICBBdT1SU0EgIEVuYz1BRVMoMjU2KSAgTWFjPVNIQTI1NgorICAgICAgREhFLVJTQS1BRVMyNTYtR0NNLVNIQTM4NCBUTFN2MS4yIEt4PURIIEF1PVJTQSAgRW5jPUFFU0dDTSgyNTYpIE1hYz1BRUFECisgICAgCisgICAgRWluc3RlbGxiYXIgaXN0IGRhcyBiZWkgc3BlemllbGxlbiBXdWVuc2NoZW4gKFZvcnNjaHJpZnRlbgorICAgIHp1ciBWZXJzY2hsdWVzc2VsdW5nc3N0YWVya2UgaW0gQXVzbGFuZCB6QikgbWl0OgorICAgICAgY2lwaGVycyA9IFJDNC1TSEEKKyAgICBpbm5lcmhhbGIgZGVzIFByb2ZpbHMuIEZ1ZXIgZWluaWdlIG11c3MgYWxsZXJkaW5ncworICAgICAgZmlwcyA9IG5vCisgICAgZ2VzZXR6dCB3ZXJkZW4sIGRhIHNpZSBhbHMgbmljaHQgbWVociBzaWNoZXIgZ2VudWcgZ2VsdGVuLgorIAorIFNJRUhFIEFVQ0g6CisgICAgdGVhbXNwZWFrLCBtdWRyZWNobmVyCisgICAgRGV0YWlscyB6dSBaZXJ0aWZpa2F0ZW46IGh0dHA6Ly9tZy5tdWQuZGUvZG93bmxvYWQvc3R1bm5lbC5zaHRtbAorCisgTEVUWlRFIEFlTkRFUlVORzoKKzMuIEF1ZyAyMDE1IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvaGVscC9zeW50YXggYi9kb2MvaGVscC9zeW50YXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMxNWMzNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9oZWxwL3N5bnRheApAQCAtMCwwICsxLDYwIEBACisKK0RpZSBTeW50YXggZGVyIEVpbmdhYmVuIGltIE1vcmdlbkdyYXVlbgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBFaW5lIEVpbmdhYmUgc29sbHRlIGltIGFsbGdlbWVpbmVuIGZvbGdlbmRlcm1hc3NlbiBhdXNzZWhlbjoKKworICAgID4gPHZlcmI+IFs8b2JqZWt0KGUpPl0gWzxhZHZlcmI+IFt1bmQgPGFkdmVyYj5dXQorCisgICAgR3Jvc3MtIHVuZCBLbGVpbnNjaHJlaWJ1bmcgc293aWUgQXJ0aWtlbCBrb2VubmVuIGluIGRlbiBtZWlzdGVuIEZhZWxsZW4KKyAgICBiZW51dHp0IHdlcmRlbi4gRGFzIFZlcmIgTVVTUyBhbGxlcmRpbmdzIElNTUVSIGtsZWluIGdlc2NocmllYmVuIHdlcmRlbiEKKyAgICBGb2xnZW5kZSBBdXNkcnVlY2tlIHNvbGx0ZW4gYWxzbyBhZXF1aXZhbGVudCBzZWluOgorCisgICAgPiBzdGVjayBkYXMgU2Nod2VydCBpbiBkZW4gQmV1dGVsCisgICAgPiBzdGVjayBzY2h3ZXJ0IGluIGJldXRlbAorCisgICAgVW1sYXV0ZSB1bmQgYW5kZXJlIFNvbmRlcnplaWNoZW4gKFplaWNoZW4gbWl0IEFTQ0lJLUNvZGVzID49IDEyNykgc2luZAorICAgIHZlcmJvdGVuIHVuZCB3ZXJkZW4gZHVyY2ggYD8nIGVyc2V0enQuCisKKyAgICBXZW5uIG5pY2h0IGdlbmF1IGtsYXIgaXN0LCB3ZWxjaGVzIE9iamVrdCBnZW1laW50IGlzdCwga2FubiBtYW4gZGFzCisgICAgZ2V3dWVuc2NodGUgT2JqZWt0IG1pdCBlaW5lciBhbmdlaGFlbmd0ZW4gTnVtbWVyIGlkZW50aWZpemllcmVuOgorCisgICAgPiBzdGVjayBzY2h3ZXJ0IDIgaW4gYmV1dGVsCisgICAgPiBzdGVjayBkYXMgMi4gU2Nod2VydCBpbiBkZW4gQmV1dGVsCisKKyAgICBGb2xnZW5kZXMgZ2VodCBhbGxlcmRpbmdzIG5pY2h0OgorCisgICAgPiBzdGVjayBkYXMgendlaXRlIFNjaHdlcnQgaW4gZGVuIEJldXRlbAorCisgICAgU29sbHRlc3QgRHUgaXJnZW5kd28gaW0gU3BpZWwgYXVmIGVpbmUgU3RlbGxlIHN0b3NzZW4sIHdvIGtlaW5lCisgICAgZ3JhbW1hdGlrYWxpc2NoIHJpY2h0aWdlIEVpbmdhYmUgZXJ3YXJ0ZXQgd2lyZCwgZ2liIGJpdHRlIGVpbmVtIE1hZ2llcgorICAgIEJlc2NoZWlkLgorCisgICAgV2VubiBEdSBiZWkgZGVyIFZlcndlbmR1bmcgZWluZXMgQWR2ZXJicyBpbiBadXNhbW1lbmhhbmcgbWl0IGVpbmVtIFZlcmIKKyAgICBQcm9ibGVtZSBoYXN0LCBzbyB2ZXJnZXdpc3NlcmUgRGljaCwgb2IgZGFzIFZlcmIgdWViZXJoYXVwdCBkaWUgVmVyd2VuZHVuZworICAgIHZvbiBBZHZlcmJpZW4gdW50ZXJzdHVldHp0LgorCisgICAgQmVpIFZlcmJlbiwgZGllIGRpZSBWZXJ3ZW5kdW5nIHZvbiBBZHZlcmJpZW4gdW50ZXJzdHVldHplbiwga2FubnN0IER1IGF1Y2gKKyAgICBlaW5lbiBUZXh0IG5hY2ggV2FobCBiZW51dHplbiB1bmQgendhciBmb2xnZW5kZXJtYXNzZW46CisKKyAgICA+IDx2ZXJiPiAvPHRleHRfbmFjaF93YWhsPgorCisgICAgVmllbCBTcGFzcyBiZWltIEF1c3Byb2JpZXJlbi4KKworIEJFSVNQSUVMRToKKworICAgID4gbmltbSBidWNoCisgICAgPiBzdGVja2UgYnVjaCBpbiB0YXNjaGUKKyAgICA+IHppZWhlIHNjaGlsZCBhbgorICAgID4gbmltbSBzY2h3ZXJ0IGF1cyBsZWljaG5hbSAyCisKKyAgICA+IGdyaW5zZQorICAgID4gZ3JpbnNlIGphbW0gdW5kIGpvZmkgKGphbW0gdW5kIGpvZmkgbXVlc3NlbiBuYXR1ZXJsaWNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gZGVyICJhZHZlcmIiLUxpc3RlIHN0ZWhlbi4pCisgICAgPiBncmluc2UgL3dhcy1uZXVlcy13YXMtYXVjaC1uaWNodC1pbi1kZXItImFkdmVyYiItTGlzdGUtc3RlaHQKKworIFNJRUhFIEFVQ0g6CisgICAgdmVyYmVuLCBhZHZlcmIsIGlkZWUKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgVGh1LCAyNC4wNy4xOTk3LCAwOTowMDowMCB2b24gV2FyZ29uCmRpZmYgLS1naXQgYS9kb2MvaGVscC90YW5qaWFuIGIvZG9jL2hlbHAvdGFuamlhbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjQyYmQwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2hlbHAvdGFuamlhbgpAQCAtMCwwICsxLDMzIEBACisKK0RpZSBHaWxkZSBkZXIgVGFuamlhbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAjICAgICAgICAgIERpZSBHaWxkZSBkZXIgVGFuamlhbiBiZWZpbmRldCBzaWNoIGltIFdhbGQgZGVyIAorICAgICAgICAgICMjIyAgICAgICAgRWlzdGFubmVuLCBzdWVkb2VzdGxpY2ggZWluZXMgZHVua2xlbiBXYWxkZXMsIGRlcgorICAgICAgICAgICMjICAgICAgICAgYW5nZWJsaWNoIGJvZXNlIERyYWtvbmllciBiZWhlcmJlcmd0LiAKKyAgICAgICAgICAjICAgICMjICAgICAKKyAgICMjIyMjIyMjIyMjIyMjIyMgIERpZSBUYW5qaWFuIGJldHJhY2h0ZW4gc2ljaCBhbHMgV2FocmVyIGRlciBOZXV0cmFsaXRhZXQsCisgICAgIyMgICAjIyAgICAgIyMgICBkYWhlciB3ZW5kZW4gc2llIHNpY2ggc293b2hsIGdlZ2VuIGhlaWxpZ2UgYWxzIGF1Y2gKKyAgICAgICAgICMgICAgICAjIyAgIGdlZ2VuIHNhdGFuaXNjaGUgTGViZXdlc2VuLgorICAgICAgICAjIyAgICAgIyMgICAgIAorICAgICAgICMjICAgICAgIyMgICAgRGVyIFRhbmppYW4gbGVybnQgZGVuIFVtZ2FuZyBtaXQgdmVyc2NoaWVkZW5zdGVuIEZlcm4tCisgICAgICAjIyAgICAgICAjIyAgICB1bmQgTmFoa2FtcGZ3YWZmZW4sIGdsZWljaHplaXRpZyBzdHJlYnQgZXIgZGFuYWNoLCBkaWUKKyAgICAjIyAgICAgIyAgIyMgICAgIEtyYWVmdGUgZGVzIFVuaXZlcnN1bXMgaW4gRm9ybSB2b24gbWFlY2h0aWdlbiBTcHJ1ZWNoZW4KKyAgIyMjICAgICAgICMjIyMgICAgIGZ1ZXIgc2ljaCB6dSBudXR6ZW4uCisgIyAgICAgICAgICAgIyAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgTmFlaGVyZXMgenUgZGVyIEdpbGRlIGVyemFlaGx0IGVpbmVtIGdlcm5lIGRlcgorIExlaHJtZWlzdGVyIGRlciBHaWxkZSwgU2lhbWlsLCBvZGVyIGRlciBTY2h1bGxlaXRlciBPcnRob3NpdXMuIAorIAorIFVtIHNpY2ggZGVyIFRhbmppYW5naWxkZSBhbnp1c2NobGllc3NlbiBzb2xsdGUgRGVpbmUgU3R1ZmUgbWluZGVzdGVucyBkZXIKKyA1LiBlbnRzcHJlY2hlbiwgYWxsIERlaW5lIEF0dHJpYnV0ZSA1IG9kZXIgbWVociBiZXRyYWdlbiwgRGVpbiBDaGFyYWt0ZXIKKyB3ZWRlciBzYXRhbmlzY2ggbm9jaCBoZWlsaWcgc2VpbiB1bmQgRHUgc29sbHN0IGVpbiBBbHRlciB2b24gd2VuaWdzdGVucyAKKyBlaW5lbSBUYWcgYXVmd2Vpc2VuLiBadXNhZXR6bGljaCBiZW5vZXRpZ3N0IER1IDUwIEFiZW50ZXVlcnB1bmt0ZS4KKworIFdlciBlaW5tYWwgTWl0Z2xpZWQgZGVyIENoYW9zLSBvZGVyIEtsZXJpa2VyZ2lsZGUgd2FyLCBrYW5uIGRlciBUYW5qaWFuZ2lsZGUKKyBuaWNodCBtZWhyIGJlaXRyZXRlbiEKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyBTSUVIRSBBVUNIOgorICAgIGdpbGRlbgorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBNb24sIDE3LiBNYWkgMjAwNCwgMTc6MTA6MDAgdm9uIE5pYmVsCmRpZmYgLS1naXQgYS9kb2MvaGVscC90ZWFta2FtcGYgYi9kb2MvaGVscC90ZWFta2FtcGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFmNjVjMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9oZWxwL3RlYW1rYW1wZgpAQCAtMCwwICsxLDE1NSBAQAorVGVhbWthbXBmCis9PT09PT09PT0KKworR3J1ZW5kZW4gZWluZXMgVGVhbXMgdW5kIEF1Zm5haG1lIG5ldWVyIE1pdGdsaWVkZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0ZWFtIGZvbGdlICAgICAgICAgICAgRWluIFNwaWVsZXIga2FubiBtaXQgPHRlYW0gZm9sZ2UgbmFtZT4gYmVhbnRyYWdlbiwKKyAgICAgICAgICAgICAgICAgICAgICBkYXNzIDxuYW1lPiBpaG4gaW4gc2VpbiBUZWFtIGF1Zm5pbW10LgorCit0ZWFtIGF1Zm5haG1lICAgICAgICAgV2VubiBlaW4gU3BpZWxlciBkaWUgQXVmbmFobWUgaW5zIFRlYW0gYmVhbnRyYWd0IGhhdCwKKyAgICAgICAgICAgICAgICAgICAgICBrYW5uIGRlciBUZWFtbGVpdGVyIGlobiBtaXQgPHRlYW0gYXVmbmFobWUgbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgICBhdWZuZWhtZW4uIFdlbm4gbWFuIG5vY2ggbmljaHQgaW4gZWluZW0gVGVhbSBpc3QsCisgICAgICAgICAgICAgICAgICAgICAgc28gd2lyZCBoaWVybWl0IGVpbnMgZ2VncnVlbmRldC4KKyAgICAgICAgICAgICAgICAgICAgICBWb24gZGVyIEF1Zm5haG1lIGF1c2dlc2NobG9zc2VuIHNpbmQgR2Flc3RlIHVuZAorICAgICAgICAgICAgICAgICAgICAgIEdlaXN0ZXIgc293aWUgWndlaXRzcGllbGVyIHZvbiBUZWFtbWl0Z2xpZWRlcm4uCisKK3RlYW0gdmVybGFzc2UgICAgICAgICBNaXQgZGllc2VtIEJlZmVobCB2ZXJsYWVzc3QgbWFuIGRhcyBUZWFtLgorCitPcmdhbmlzYXRpb24gaW5uZXJoYWxiIGRlcyBUZWFtcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RlYW0gbGVpdGVyICAgICAgICAgICBEZXIgVGVhbWxlaXRlciBzZWluZSBBdWZnYWJlIGFuIGVpbiBhbmRlcmVzIE1pdGdsaWVkCisgICAgICAgICAgICAgICAgICAgICAgYWJnZWJlbi4gU2NobGFlZnQgZGVyIFRlYW1sZWl0ZXIgZWluIG9kZXIgaXN0IGxhZW5nZXIKKyAgICAgICAgICAgICAgICAgICAgICBhbHMgMTAgTWludXRlbiBpbmFrdGl2LCBrb2VubmVuIGF1Y2ggZGllIGFuZGVyZW4KKyAgICAgICAgICAgICAgICAgICAgICBNaXRnbGllZGVyIGVpbmVuIG5ldWVuIFRlYW1sZWl0ZXIgZXJuZW5uZW4uCisKK3RlYW0gZW50bGFzc2UgICAgICAgICBEZXIgVGVhbWxlaXRlciBrYW5uIGF1Y2ggTWl0Z2xpZWRlciBlbnRsYXNzZW4uCisKK0FuZ3JpZmZza29vcmRpbmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLQordGVhbSBhbmdyaWZmc2JlZmVobCAgIEVpbiBUZWFtbWl0Z2xpZWQga2FubiBlaW5lbiBCZWZlaGwgYW5nZWJlbiwgZGVyCisgICAgICAgICAgICAgICAgICAgICAgYXVzZ2Vsb2VzdCB3aXJkLCBzb2JhbGQgZGVyIFRlYW1sZWl0ZXIgZGFzIFNpZ25hbAorICAgICAgICAgICAgICAgICAgICAgIHp1bSBBbmdyaWZmIGdpYnQuCisgICAgICAgICAgICAgICAgICAgICAgQmVpc3BpZWw6IDx0ZWFtIGFuZ3JpZmZzYmVmZWhsIG5vcmRlbj4gLSB3ZW5uIGRlcgorICAgICAgICAgICAgICAgICAgICAgIFRlYW1sZWl0ZXIgZGFzIFNpZ25hbCBnaWJ0IGdlaHQgbWFuIG5hY2ggTm9yZGVuCisgICAgICAgICAgICAgICAgICAgICAgenVtIE1vbnN0ZXIuCisKK3RlYW0gYW5ncmlmZiAgICAgICAgICBEZXIgVGVhbWxlaXRlciBsb2VzdCBkZW4gQW5ncmlmZnNiZWZlaGwgYmVpIGFsbGVuCisgICAgICAgICAgICAgICAgICAgICAgVGVhbW1pdGdsaWVkZXJuIGF1cywgZGllIGltIGdsZWljaGVuIFJhdW0gc3RlaGVuCisgICAgICAgICAgICAgICAgICAgICAgdW5kIGVpbmVuIEFuZ3JpZmZzYmVmZWhsIGVpbmdlc3RlbGx0IGhhYmVuLgorCitPcmdhbmlzYXRpb24gZGVzIFRlYW1rYW1wZmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgICAgICAgVGVhbW1pdGdsaWVkZXIgaGFiZW4gZGllIE1vZWdsaWNoa2VpdCwgaWhyZSBQb3NpdGlvbgorICAgICAgICAgICAgICAgICAgICAgIGlubmVyaGFsYiBkZXIgS2FtcGZhdWZzdGVsbHVuZyB6dSBiZXN0aW1tZW4uIFNvIGtvZW5uZW4KKyAgICAgICAgICAgICAgICAgICAgICBkaWUgS2FlbXBmZXIgdm9ybmUga2FlbXBmZW4gdW5kIGRlbiBLbGVyaWtlciBkZWNrZW4KKyAgICAgICAgICAgICAgICAgICAgICBkZXIgc2llIHN0YWVuZGlnIGhlaWx0IDotKQorCit0ZWFtIGthbXBmcmVpaGUgICAgICAgSmVkZXMgVGVhbW1pdGdsaWVkIGthbm4gc2VpbmVuIFBvc2l0aW9uc3d1bnNjaCBtaXQKKyAgICAgICAgICAgICAgICAgICAgICA8dGVhbSBrYW1wZnJlaWhlIG5yPiBhbmdlYmVuLCB3b2JlaSA8bnI+IGltIEJlcmVpY2gKKyAgICAgICAgICAgICAgICAgICAgICB2b24gMSBiaXMgNSBzZWluIG11c3MuIERhYmVpIHdpcmQgamVkb2NoIGltbWVyIGRpZSB2b20KKyAgICAgICAgICAgICAgICAgICAgICBUZWFtbGVpdGVyIGdld3VlbnNjaHRlIEZvcm1hdGlvbiBlaW5nZWhhbHRlbi4KKyAgICAgICAgICAgICAgICAgICAgICBEdXJjaCBkaWUgVGVhbW1pdGdsaWVkZXIgaW4gZGVuIHZvcmRlcmVuIFJlaWhlbgorICAgICAgICAgICAgICAgICAgICAgIHdlcmRlbiBkaWUgaW4gZGVuIGhpbnRlcmVuIFJlaWhlbiBnZXNjaHVldHp0LgorICAgICAgICAgICAgICAgICAgICAgIEJlaXNwaWVsc3dlaXNlIHJlaWNoZW4gZHJlaSBNaXRnbGllZGVyIGluIFJlaWhlIDEgYXVzLAorICAgICAgICAgICAgICAgICAgICAgIHp3ZWkgaW4gUmVpaGUgMiB1bmQgZWluZXMgaW4gUmVpaGUgMyB6dSBzY2h1ZXR6ZW4uCisgICAgICAgICAgICAgICAgICAgICAgRGVyIEFudGVpbCBkZXIgU2NobGFlZ2UgZGllIGVpbiBNaXRnbGllZCBhYmJla29tbXQKKyAgICAgICAgICAgICAgICAgICAgICBlbnRzcHJpY2h0IGRlciBBbnphaGwgZGVyIHVuZ2VzY2h1ZXR6ZW4gTWl0Z2xpZWRlcgorICAgICAgICAgICAgICAgICAgICAgIHNlaW5lciBSZWloZSAoaW4gZGVyIGVyc3RlbiBSZWloZSBwbHVzIDEpLgorICAgICAgICAgICAgICAgICAgICAgIE51ciBkaWUgZXJzdGUgUmVpaGUga2FubiBzZWxiZXIgaW0gTmFoa2FtcGYgenVzY2hsYWdlbi4KKwordGVhbSBmbHVjaHRyZWloZSAgICAgIEVpbiBUZWFtbWl0Z2xpZWQga2FubiBlaW5lIFJlaWhlIGFuZ2ViZW4sIGluIGRpZSBlcgorICAgICAgICAgICAgICAgICAgICAgIGJlaSBkZXIgRmx1Y2h0IHdlY2hzZWxuIG1vZWNodGUgc3RhdHQgYWJ6dWhhdWVuLgorICAgICAgICAgICAgICAgICAgICAgIFNvIGthbm4gbWFuIHNpY2ggLSBhdXNyZWljaGVuZGUgRGVja3VuZyB2b3JhdXNnZXNldHp0IC0KKyAgICAgICAgICAgICAgICAgICAgICBpbiBSdWhlIHZvbiBkZW0gbWl0Z2VicmFjaHRlbiBLbGVyaWtlciBoZWlsZW4gbGFzc2VuLgorICAgICAgICAgICAgICAgICAgICAgIFdpcmQgZGllIEZsdWNodCBhdXNnZWxvZXN0LCBzbyB3aXJkIGRpZSBGbHVjaHRyZWloZSB6dXIKKyAgICAgICAgICAgICAgICAgICAgICBnZXd1ZW5zY2h0ZW4gS2FtcGZyZWloZS4gTWl0CisgICAgICAgICAgICAgICAgICAgICAgPHRlYW0gZmx1Y2h0cmVpaGUgMD4gd2lyZCBkaWUgRmx1Y2hyZWloZSBkZWFrdGl2aWVydC4KKyAgICAgICAgICAgICAgICAgICAgICBGYWxscyBkaWUgRmx1Y2h0IGluIGVpbmUgaGludGVyZSBSZWloZSBuaWNodCBnZWxpbmd0LAorICAgICAgICAgICAgICAgICAgICAgIHdpcmQgZGllIG5vcm1hbGUgRmx1Y2h0IGF1c2dlbG9lc3QuCisKK3RlYW0gZm9ybWF0aW9uICAgICAgICBEZXIgVGVhbWxlaXRlciBrYW5uIGJlc3RpbW1lbiwgaW5uZXJoYWxiIHdlbGNoZXIKKyAgICAgICAgICAgICAgICAgICAgICBHcmVuemVuIGRpZSBGb3JtYXRpb24gZWluZ2VoYWx0ZW4gd2VyZGVuIHNvbGwuCisgICAgICAgICAgICAgICAgICAgICAgRGllcyBnZXNjaGllaHQgbWl0IDx0ZWFtIGZvcm1hdGlvbiBtaW4xLW1heDEKKyAgICAgICAgICAgICAgICAgICAgICBtaW4yLW1heDIgbWluMy1tYXgzIG1pbjQtbWF4NCBtaW41LW1heDU+LiBEaWUKKyAgICAgICAgICAgICAgICAgICAgICBCZXNjaHJhZW5rdW5nZW4gZnVlciBuaWNodCBhbmdlZ2ViZW5lIFJlaWhlbgorICAgICAgICAgICAgICAgICAgICAgIHdlcmRlbiBuaWNodCBnZWFlbmRlcnQuIFdlbm4gc3RhdHQgTWluaW11bSB1bmQKKyAgICAgICAgICAgICAgICAgICAgICBNYXhpbXVtIG51ciBlaW5lIFphaGwgYW5nZWdlYmVuIHdpcmQsIGdpbHQgZGllc2UKKyAgICAgICAgICAgICAgICAgICAgICBmdWVyIGJlaWRlIFdlcnRlLiBEaWUgR3JlbnplbiB3ZXJkZW4gYXV0b21hdGlzY2ggc28KKyAgICAgICAgICAgICAgICAgICAgICBhbmdlcGFzc3QsIGRhc3Mgc2llIGVyZnVlbGxiYXIgc2luZCwgbWF4bWlhbCA2CisgICAgICAgICAgICAgICAgICAgICAgTWl0Z2xpZWRlciBpbiBqZWRlciBSZWloZSBzdGVoZW4gdW5kIG1pbmRlc3RlbnMgZWluZXMKKyAgICAgICAgICAgICAgICAgICAgICBpbiBSZWloZSAxLgorICAgICAgICAgICAgICAgICAgICAgIEJlaXNwaWVsOiAidGVhbSBmb3JtYXRpb24gMy00IDIgMSIKKwordGVhbSB1ZWJlcnNpY2h0ICAgICAgIFplaWd0IGRpZSBlaWdlbmVuIHVuZCBnZWduZXJpc2NoZW4gUmVpaGVuIGFuLgorCitXZWl0ZXJlIG51ZXR6bGljaGUgVGVhbWJlZmVobGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordGVhbSBhdXRvZm9sZ2UgICAgICAgIFRlYW1taXRnbGllZGVyLCBkaWUgbWl0IDx0ZWFtIGF1dG9mb2xnZSBlaW4+IGRlbgorICAgICAgICAgICAgICAgICAgICAgIEZvbGdlbW9kdXMgYWt0aXZpZXJ0IGhhYmVuLCBmdWVocmVuIGF1dG9tYXRpc2NoCisgICAgICAgICAgICAgICAgICAgICAgamVkZW4gQmVmZWhsIGRlcyBUZWFtbGVpdGVycyAobmFjaCBrdXJ6ZXIgVmVyem9lZ2VydW5nKQorICAgICAgICAgICAgICAgICAgICAgIGF1cywgZGVyIGVpbmVuIE9ydHN3ZWNoc2VsIGJld2lya3QsIHZvcmF1c2dlc2V0enQgc2llCisgICAgICAgICAgICAgICAgICAgICAgc3RlaGVuIGRvcnQgd28gZGVyIExlaXRlciBkaXJla3Qgdm9yIHNlaW5lbSBPcnRzd2VjaHNlbAorICAgICAgICAgICAgICAgICAgICAgIHdhci4KKyAgICAgICAgICAgICAgICAgICAgICBEZXIgVGVhbWxlaXRlciBtdXNzIGRlbiBGb2xnZW1vZHVzIGF1Y2ggYWt0aXZpZXJ0IGhhYmVuLAorICAgICAgICAgICAgICAgICAgICAgIGRhbWl0IGRpZSBhbmRlcmVuIGlobSBmb2xnZW4uCisgICAgICAgICAgICAgICAgICAgICAgV2VubiBkZXIgVGVhbWxlaXRlciB2ZXJzdWNodCB6dSBmbGllaGVuLCB3aXJkIGRlcgorICAgICAgICAgICAgICAgICAgICAgIEZvbGdlbW9kdXMgZnVlciBpaG4gZGVha3RpdmllcnQuCisKK3RlYW0gaW5mbyAgICAgICAgICAgICBHaWJ0IEluZm9ybWF0aW9uZW4gdWViZXIgZGllIFRlYW1taXRnbGllZGVyLgorICAgICAgICAgICAgICAgICAgICAgIERhYmVpIHN0ZWh0IGluIGRlbiBTcGFsdGVuOgorICAgICAgICAgICAgICAgICAgICAgICogICAgICAtIEtlbm56ZWljaG51bmcgZGVzIFRlYW1sZWl0ZXJzCisgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgIC0gZGVyIE5hbWUKKyAgICAgICAgICAgICAgICAgICAgICBHaWxkZSAgLSBkaWUgR2lsZGUKKyAgICAgICAgICAgICAgICAgICAgICBMViAgICAgLSBTdHVmZQorICAgICAgICAgICAgICAgICAgICAgIEdMViAgICAtIEdpbGRlbnN0dWZlCisgICAgICAgICAgICAgICAgICAgICAgTFAvTUxQIC0gTGViZW5zcHVua3RlCisgICAgICAgICAgICAgICAgICAgICAgS1AvTUtQIC0gS29uemVudHJhdGlvbnMvTWFnaWVwdW5rdGUKKyAgICAgICAgICAgICAgICAgICAgICBWb3JzLiAgLSBWb3JzaWNodAorICAgICAgICAgICAgICAgICAgICAgIEdSICAgICAtIEdld3VlbnNjaHRlIFJlaWhlCisgICAgICAgICAgICAgICAgICAgICAgQVIgICAgIC0gQWt0dWVsbGUgUmVpaGUgKGJlem9nZW4gYXVmcyBnYW56ZSBUZWFtKQorICAgICAgICAgICAgICAgICAgICAgIFRSICAgICAtIFRhdHNhZWNobGljaGUgUmVpaGUgKGJlem9nZW4gYXVmIEFud2VzZW5kZSkKKyAgICAgICAgICAgICAgICAgICAgICBGUiAgICAgLSBGbHVjaHRyZWloZQorICAgICAgICAgICAgICAgICAgICAgIEEgICAgICAtIEFuZ3JpZmZzYmVmZWhsIGVpbmdlc3RlbGx0CisgICAgICAgICAgICAgICAgICAgICAgViAgICAgIC0gVmVyZm9sZ2Vtb2R1cyBha3RpdmllcnQKKyAgICAgICAgICAgICAgICAgICAgICBEZXIgVGVhbWxlaXRlciBrYW5uIGR1cmNoIGRpZSBBbmdhYmUgImxhbmciIGVpbmUKKyAgICAgICAgICAgICAgICAgICAgICB6d2VpemVpbGlnZSBBdXNnYWJlIGJla29tbWVuLCBiZWkgZGVyIGF1Y2gKKyAgICAgICAgICAgICAgICAgICAgICBBbmdyaWZmc2JlZmVobCB1bmQgRmx1Y2h0cmljaHR1bmcgZ2V6ZWlndCB3ZXJkZW4uCisgICAgICAgICAgICAgICAgICAgICAgV2VubiBtYW4gInNvcnRpZXJ0IiBhbmdpYnQsIHdpcmQgZGllIEF1c2dhYmUgbmFjaAorICAgICAgICAgICAgICAgICAgICAgIChUUixBUixHUixOYW1lKSBzb3J0aWVydCwgYmVpICJhbHBoYWJldGlzY2giIGVyZm9sZ3QKKyAgICAgICAgICAgICAgICAgICAgICBkaWUgU29ydGllcnVuZyBuYWNoIGRlbSBOYW1lbiwgd29iZWkgU3BpZWxlciBqZWRvY2gKKyAgICAgICAgICAgICAgICAgICAgICB2b3IgYW5kZXJlbiBUZWFtbWl0Z2xpZWRlcm4gZWluZ2VvcmRuZXQgd2VyZGVuLgorICAgICAgICAgICAgICAgICAgICAgIEFuc29uc3RlbiB3aXJkIG5hY2ggQVIgZ2VvcmRuZXQuCisKK3RlYW0gZmFyYmVuICAgICAgICAgICBEYW1pdCBsYWVzc3Qgc2ljaCBhZW5kZXJuLCBhYiB3YW5uIGRpZSBlaWdlbmVuCisgICAgICAgICAgICAgICAgICAgICAgTGViZW5zcHVua3RlIGJ6dy4gS29uemVudHJhdGlvbnNwdW5rdGUgZ2VsYiBvZGVyCisgICAgICAgICAgICAgICAgICAgICAgZ2FyIHJvdCAoYnp3LiBmZXR0KSBhbmdlemVpZ3Qgd2VyZGVuLgorCit0ZWFtIG9ydGUgICAgICAgICAgICAgWmVpZ3QgYW4sIHdvIHNpY2ggZGllIFRlYW1taXRnbGllZGVyIGJlZmluZGVuLgorICAgICAgICAgICAgICAgICAgICAgIE5vcm1hbGVyd2Vpc2Ugd2VyZGVuIG51ciBTcGllbGVyIGFuZ2V6ZWlndCwgbWl0CisgICAgICAgICAgICAgICAgICAgICAgImFsbGUiIGplZG9jaCBhdWNoIGFuZGVyZSBUZWFtbWl0Z2xpZWRlci4KKwordGVhbSBydWZlICAgICAgICAgICAgIE1pdHRlaWx1bmcgYW4gYWxsZSBUZWFtbWl0Z2xpZWRlci4KKwordGVhbSBoaXN0ICAgICAgICAgICAgIEhpc3RvcnkgZGVyIFRlYW1taXR0ZWlsdW5nZW4uIERpZSBBbnphaGwgZGVyCisgICAgICAgICAgICAgICAgICAgICAgYW56dXplaWdlbmRlbiBaZWlsZW4gKGJpcyAxMDApIGthbm4gYW5nZWdlYmVuIHdlcmRlbi4KKwordGVhbSBuYW1lICAgICAgICAgICAgIE1hbiBrYW5uIHNlaW5lbSBUZWFtIGF1Y2ggZWluZW4gTmFtZW4gZ2ViZW4uCisKK3RlYW0gaGlsZmUgICAgICAgICAgICBHaWJ0IGVpbmUga3VyemUgQmVmZWhsc3VlYmVyc2ljaHQuCisKK3RlYW0gbGlzdGUgICAgICAgICAgICBaZWlndCBhbiwgd2VsY2hlIFRlYW1zIGVzIHNjaG9uIGdpYnQuCisKK1B1bmt0ZXZlcnRlaWx1bmcKKy0tLS0tLS0tLS0tLS0tLS0KK0RpZSBFcmZhaHJ1bmdzcHVua3RlIGZ1ZXJzIFRvZXRlbiBlaW5lcyBNb25zdGVycyB3ZXJkZW4genVyIEhhZWxmdGUKK3VudGVyIGRlbiBhbndlc2VuZGVuIFRlYW1taXRnbGllZGVybiB1bmQgenVyIEhhZWxmdGUgYW50ZWlsbWFlc3NpZwordmVydGVpbHQuIERpZXMgZ2lsdCBudXIgZnVlciBkYXMgVGVhbSBkZXMgS2lsbGVycywgZnVlciBhbGxlIGFuZGVyZW4KK2lzdCBkaWUgVmVydGVpbHVuZyB3aWUgYmlzaGVyIGFudGVpbG1hZXNzaWcuCisKK0RpZSBFcnN0a2lsbHB1bmt0ZSB3ZXJkZW4gYW4gZWluIFRlYW1taXRnbGllZCB2ZXJnZWJlbiwgZGFzIGRpZXNlIG5vY2gKK25pY2h0IGhhdC4gRGFiZWkgd2VyZGVuIFRlYW1taXRnbGllZGVyIGluIGRlciBlcnN0ZW4gUmVpaGUgYmV2b3J6dWd0LgorCitBYmsuCistLS0tCitTdGF0dCAidGVhbSIgc2luZCBhdWNoICJncnVwcGUiIHVuZCBkaWUgQWJrdWVyenVuZyAiZyIgbW9lZ2xpY2guCisKZGlmZiAtLWdpdCBhL2RvYy9oZWxwL3RlYW1zcGVhayBiL2RvYy9oZWxwL3RlYW1zcGVhawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmQxNDMzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2hlbHAvdGVhbXNwZWFrCkBAIC0wLDAgKzEsNjQgQEAKKworRGFzIE1vcmdlbmdyYXVlbi1UZWFtc3BlYWsKKz09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RlYW1zcGVhayAtIHdhcyBpc3QgZGFzIHVlYmVyaGF1cHQ/CisKKyAgICBUZWFtc3BlYWsgaXN0IGVpbiBWb2ljZS1DaGF0LVN5c3RlbSwgenUgZGVtIG1hbiBzaWNoIG1pdCBlaW5lbSBnZWVpZ25ldGVuCisgICAgQ2xpZW50IHZlcmJpbmRlbiBrYW5uLCB1bSBzaWNoIG1pdCBhbmRlcmVuIExldXRlbiB6dSB1bnRlcmhhbHRlbi4gRGFzCisgICAgR2FuemUgZnVua3Rpb25pZXJ0IGltIEdydW5kZSBhZWhubGljaCB3aWUgU2t5cGUsIGhhdCBhYmVyIGdlZ2VudWViZXIKKyAgICBkaWVzZW0gZGVuIFZvcnRlaWwsIGRhc3MgZGllIEtvbW11bmlrYXRpb24gdWViZXIgU2VydmVyIGxhZXVmdCwgZGllCisgICAgbmljaHQgdW50ZXIgZGVyIEtvbnRyb2xsZSB2b24gRnJlbWRmaXJtZW4gc3RlaGVuLCBzbyBkYXNzIGF1Y2ggbmljaHRzCisgICAgbWl0Z2Vsb2dndCB3aXJkLCB3YXMgZG9ydCBnZXNwcm9jaGVuIHdpcmQuCisKKworV29mdWVyIGJyYXVjaHQgbWFuIGRhcz8KKyAgICAKKyAgICBJbSBUZWFtc3BlYWsga2FubiBtYW4gc2ljaCB0cmVmZmVuLCB1bSBnZW1laW5zYW0gTWVocnNwaWVsZXJxdWVzdHMgenUKKyAgICBsb2VzZW4sIGdyb2Vzc2VyZSBNZXR6ZWxha3Rpb25lbiB6dSBrb29yZGluaWVyZW4gb2RlciBlaW5mYWNoIG51cgorICAgIHp1IHF1YXRzY2hlbi4KKworICAgIEZ1ZXIgTWFnaWVyIGdpYnQgZXMgc2VwYXJhdGUgQ2hhbm5lbCwgaW4gZGVuZW4gbWFuIHNpY2ggenVyIERpc2t1c3Npb24KKyAgICB2b24gUHJvZ3JhbW1pZXJ0aGVtZW4gdW5kIC1wcm9ibGVtZW4gdHJlZmZlbiBrYW5uLgorCisKK0JpbiBpY2ggc2Nob24gZHJpbj8KKworICAgIFdlbm4gRHUgTHVzdCBiZWtvbW1lbiBoYXN0LCB1bnNlciBUUyBtYWwgYXVzenVwcm9iaWVyZW4sIGJlbm9ldGlnc3QgRHUKKyAgICBmb2xnZW5kZXM6CisKKyAgICAtIGVpbmUgU291bmRrYXJ0ZSBpbSBQQworICAgIC0gTGF1dHNwcmVjaGVyIHVuZCBlaW4gTWlrcm9mb24sIGJlc3NlciBqZWRvY2ggZWluIEhlYWRzZXQKKyAgICAtIGRlbiBUZWFtc3BlYWszLUNsaWVudCB2b24gaHR0cDovL3d3dy50ZWFtc3BlYWsuY29tCisgICAgLSBkaWUgWnVnYW5nc2RhdGVuOgorCisgICAgICBTZXJ2ZXJuYW1lOiAgICAgbWd0cy5tdWQuZGUgKHNvbGx0ZSBvaG5lIFBvcnRhbmdhYmUgZnVua3Rpb25pZXJlbikKKyAgICAgIFNlcnZlcnBhc3N3b3J0OiBkZXIgTmFtZSB1bnNlcmVzIGJla2FubnRlbiBVcnZhdGVycyBhbGxlciBNYWdpZXIKKyAgICAgIFNlcnZlci1JUCAoZmFsbHMgYmVub2V0aWd0KTogODUuMjE0LjI1MC4xODg6NDcxMQorCisKKyAgICBJbSBUZWFtc3BlYWstQ2xpZW50IGthbm5zdCBEdSBkaWVzZSBEYXRlbiBpbSBNZW51ZSB1bnRlciAiRmF2b3JpdGVuIC0KKyAgICBGYXZvcml0ZW4gdmVyd2FsdGVuIiBlaW50cmFnZW4sIGluZGVtIER1IGVpbmVuIG5ldWVuIEZhdm9yaXRlbiBhbmxlZ3N0CisgICAgdW5kIHVudGVyICJBZHJlc3NlIiBkZW4gU2VydmVybmFtZW4gZWludHJhZWdzdC4gRGVpbmVuIFNwaWVsZXJuYW1lbgorICAgIHRyYWVnc3QgRHUgbm9jaCB1bnRlciAiTmlja25hbWUiIGVpbiwgdW5kIHVudGVyICJTZXJ2ZXIgUGFzc3dvcnQiIAorICAgIGplbmVzLCBkYXMgRHUgKGhvZmZlbnRsaWNoKSBhdXMgZGVtIEhpbndlaXMgb2JlbiBhYmxlaXRlbiBrb25udGVzdC4KKworICAgIFdlbm4gRHUgbW9lY2h0ZXN0LCBrYW5uc3QgRHUgZGFzIE1HLVRTIG5vY2ggYWxzIFN0YW5kYXJkLVNlcnZlcgorICAgIGVpbnN0ZWxsZW4sIGluZGVtIER1IGluIGRlciBGYXZvcml0ZW52ZXJ3YWx0dW5nIHVudGVuIGxpbmtzIGF1ZiAiTWVociIKKyAgICBrbGlja3N0IHVuZCBkYW5uIGVpbiBIYWVrY2hlbiBiZWkgIkJlaW0gU3RhcnQgdmVyYmluZGVuIiBzZXR6dC4gRGFubgorICAgIHdpcnN0IER1IGJlaSBqZWRlbSBTdGFydGVuIGRlcyBUUzMtQ2xpZW50cyBkaXJla3QgbWl0IGRlbSBNRy1UUyAKKyAgICB2ZXJidW5kZW4uCisKKyAgCitOb2NoIGVpbmlnZSBIaW53ZWlzZToKKworICAgIERlciBTZXJ2ZXIgd2lyZCBkZXJ6ZWl0IHZvbiBPbGxpIHp1ciBWZXJmdWVndW5nIGdlc3RlbGx0LCB1bSBkaWUKKyAgICBNb2VnbGljaGtlaXQgenVtIEF1c3Byb2JpZXJlbiBhbnp1YmlldGVuLCBiZW5laG10IEV1Y2ggYWxzbywgd2VubiBJaHIKKyAgICBkYSBkcmF1ZiBzZWlkLiA6LSkKKworICAgIERpZSBSZWNodGV2ZXJ3YWx0dW5nIHZvbiBUUzMgaXN0IGF1c2dlc3Byb2NoZW4ga29tcGxleCBnZXJhdGVuLCBzbyBkYXNzCisgICAgd2lyIHVtIEdlZHVsZCBiaXR0ZW4gbW9lY2h0ZW4sIHdlbm4gaXJnZW5kZXR3YXMgbmljaHQgYXVmIEFuaGllYgorICAgIGZ1bmt0aW9uaWVydC4KKworMzEuMTAuMjAxMiAgQXJhdGhvcm4KKwpkaWZmIC0tZ2l0IGEvZG9jL2hlbHAvdG9kIGIvZG9jL2hlbHAvdG9kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZTIwNTkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaGVscC90b2QKQEAgLTAsMCArMSwzNyBAQAorCitEZXIgVG9kIHVuZCBzZWluZSBGb2xnZW4KKz09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgSW0gTW9yZ2VuR3JhdWVuIGdpYnQgZXMgdmllbGUgdmVyc2NoaWVkZW5lIE1vZWdsaWNoa2VpdGVuLCB6dSBzdGVyLQorICAgIGJlbi4gRGVyIGhhZXVmaWdzdGUgR3J1bmQgaXN0IGplZG9jaCBkYXMgU2lua2VuIGRlciBMZWJlbnNwdW5rdGUKKyAgICBhdWYgdW50ZXIgTnVsbC4KKworICAgIERlbiBUb2QgYmVtZXJrdCBtYW4gYW4gZWluZXIgbWVociBvZGVyIHdlbmlnZXIgb3JpZ2luZWxsZW4gVG9kZXMtCisgICAgc2VxdWVueiwgZGllIGF1dG9tYXRpc2NoIHZvciBlaW5lbSBhYmxhZXVmdDsgaW4gZGllc2Uga2FubiBuaWNodAorICAgIGVpbmdlZ3JpZmZlbiB3ZXJkZW4uIEF1c3NlcmRlbSB2ZXJsaWVydCBtYW4gYWxzIFNwaWVsZXIgMzMlIHNlaW5lcgorICAgIEVyZmFocnVuZ3NwdW5rdGUuIEplIG1laHIgRXJmYWhydW5nIG1hbiBnZXNhbW1lbHQgaGF0LCBkZXN0byBtZWhyCisgICAgUHVua3RlIHZlcmxpZXJ0IG1hbiBlcmdvLiBEYW1pdCBkZXIgVmVybHVzdCBuaWNodCBpbnMgQm9kZW5sb3NlIAorICAgIHN0ZWlnZW4ga2FubiwgZ2VuaWVzc2VuIFNlaGVyIGRlbiBWb3J0ZWlsLCBtaXQgamVkZXIgbmV1ZW4gU3R1ZmUKKyAgICB3ZW5pZ2VyIEVyZmFocnVuZ3NwdW5rdGUgaW0gVG9kZXNmYWxsIHp1IHZlcmxpZXJlbi4KKworICAgIEVpbiB3ZWl0ZXJlciBFZmZla3QgZGVzIFN0ZXJiZW5zIGlzdCBuYXR1ZXJsaWNoIGRlciBWZXJsdXN0IGRlcyAKKyAgICBLb2VycGVycy4gQXVzIGRlciBUb2Rlc3NlcXVlbnoga29tbXQgbWFuIGFscyBHZWlzdCB3aWVkZXIgenVydWVjaworICAgIGF1ZiBkaWUgV2VsdC4gKFRpcDogInJhc3NsZSAvZnJldW5kbGljaCIgOy0pIFVtIHdpZWRlciBpbiBkZW4gR2UtCisgICAgbnVzcyB2b24ga29lcnBlcmxpY2hlbiBGcmV1KG4pZGVuIHp1IGtvbW1lbiwgbXVzcyBtYW4gZWluZW4gaGVpbGlnZW4KKyAgICBPcnQgYXVmc3VjaGVuIHVuZCBkYXMgd2VsdGxpY2hlIEtvbW1hbmRvICJiZXRlIiBlaW5nZWJlbi4KKyAgICBbQ2hhb3RlbiBiZXNjaHdvZXJlbiBhbHRlcm5hdGl2IGVpbmVuIHVuaGVpbGlnZW4gRGFlbW9uZW4uXQorCisgICAgTmFjaCBkZW0gVG9kIHZlcmxpZXJ0IG1hbiB6ZWl0bGljaCBiZWdyZW56dCBBdHRyaWJ1dGUgdW5kIGJ1ZXNzdAorICAgIEdpbGRlbmZhZWhpZ2tlaXRlbiBlaW4uIE5pY2h0c2Rlc3RvdHJvdHoga2FubiBtYW4gbWl0IGRpZXNlbSBNYWx1cworICAgIGFuIGFuZGVyZXIgU3RlbGxlIGltIE1HIHdlaXRlcnNwaWVsZW4uIFdlciBkYXMgdWViZXJwcnVlZmVuIG1vZWNodGUsCisgICAgc29sbHRlIG1pdCAiaGlsZmUgc3RlcmJlbiIgZWluZSBzY2huZWxsZSBsZWdhbGUgTW9lZ2xpY2hrZWl0IGZpbmRlbiwKKyAgICBMYXJzIGVpbmVuIEJlc3VjaCBhYnp1c3RhdHRlbiBvZGVyIFJvY2h1cyBlaW5lIE1haWwgc2NoaWNrZW4uCisKKyAgICBMYXJzIGlzdCB1ZWJyaWdlbnMgZGVyIEdlaGlsZmUgZGVzIFRvZGVzLCB1bmQgUm9jaHVzIGRpZSBsaW5rZSB1bmQKKyAgICBkaWUgcmVjaHRlIEhhbmQgZGVzIFRvZGVzLiA6LSkKKyAgIAorIFNJRUhFIEFVQ0g6CisgICAgc3RlcmJlbiwgbGViZW4sIGthbXBmCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIDE0LiBNYWVyeiAyMDA0IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvaGVscC90b3BsaXN0ZSBiL2RvYy9oZWxwL3RvcGxpc3RlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkOTg2YzEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaGVscC90b3BsaXN0ZQpAQCAtMCwwICsxLDIxIEBACisKKyBUT1BMSVNURU46CisgPT09PT09PT09PQorCisgICAgSW4gKGZhc3QpIGplZGVyIEtuZWlwZSBpbSBNb3JnZW5ncmF1ZW4gZmluZGV0IG1hbiBlaW5lIFRvcGxpc3RlLgorICAgIEF1ZiBkaWVzZXIgVG9wbGlzdGUgc3RlaGVuIGRpZSAxMDAgU3BpZWxlciwgZGllIGRpZSBtZWlzdGVuCisgICAgU3R1ZmVucHVua3RlIGhhYmVuLgorICAgIFdlciAtIGF1cyB3ZWxjaGVuIEdydWVuZGVuIGF1Y2ggaW1tZXIgLSBkYXJhdWYgdmVyemljaHRlbiBtb2VjaHRlLAorICAgIGluIGRpZXNlciBUb3BsaXN0ZSBhdWZ6dXRhdWNoZW4gKHdlbm4gZXIvc2llIGRlbm4gZ3V0IGdlbnVnIGRhZnVlcgorICAgIGlzdCksIGthbm4gc2ljaCBzZWxic3QgbWl0IGRlbSBLb21tYW5kbworCisgICAgICAgIHRvcGxpc3RlIG5laW4KKworICAgIGZ1ZXIgZGllIFRvcGxpc3RlIHNwZXJyZW4uIE1pdCBkZW0gS29tbWFuZG8KKworICAgICAgICB0b3BsaXN0ZSBqYQorCisgICAgd2lyZCBkaWVzIHdpZWRlciBydWVja2dhZW5naWcgZ2VtYWNodC4KKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgU29uLCAzMC44LjE5OTgsIDIyOjEwOjAwIHZvbiBQYXJhY2Vsc3VzCmRpZmYgLS1naXQgYS9kb2MvaGVscC91cnVraGFpIGIvZG9jL2hlbHAvdXJ1a2hhaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTY1NTM4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2hlbHAvdXJ1a2hhaQpAQCAtMCwwICsxLDI4IEBACisKK0RpZSBHaWxkZSBkZXIgVXJ1a2hhaQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0luIE9ya2hhdXNlbiBpbSBWZXJsb3JlbmVuIExhbmQgZ2lidCBlcyBkaWUgR2lsZGUgZGVyIFVydWtoYWkuIERpZXMgaXN0IGRpZQorU3RhbmRhcmRnaWxkZSBkZXIgT3Jrcy4KKworQWxsZXJkaW5ncyBrb2VubmVuIGF1Y2ggYW5kZXJlIFNwaWVsZXIgVXJ1a2hhaSB3ZXJkZW4uIE51ciBGZWxpbmVuIHdlcmRlbgorbmljaHQgenVnZWxhc3NlbiwgZGEgZGllIEthdHplbndlc2VuIGVpbmZhY2ggZmVobCBhbSBQbGF0emUgd2FlcmVuLiBXZWl0ZXJlCitWb3JhdXNzZXR6dW5nZW4sIHVtIGVpbiBVcnVraGFpIHp1IHdlcmRlbiwgZ2lidCBlcyBuaWNodCwgYWxsZXJkaW5ncyBzb2xsdGUKK21hbiBkaWUgcmljaHRpZ2UgRWluc3RlbGx1bmcgbWl0YnJpbmdlbiB1bmQgZXMgZ2VybmUgYmx1dGlnIG1vZWdlbi4KKworSHJhZ3pub3IgaXN0IGRlciBHaWxkZW5tZWlzdGVyIGRlciBVcnVraGFpLiBCZWkgaWhtIGthbm4gbWFuIGRlciBHaWxkZSAKK2JlaXRyZXRlbiB1bmQgZGllIHZlcnNjaGllZGVuZW4gU3BydWVjaGUgbGVybmVuLCBlciB3ZWlzcyBhdWNoIHZpZWxlcyAKK3VlYmVyIGRpZSBHaWxkZS4KKworT3JrcyBrb2VubmVuIHZvbiBOYXR1ciBhdXMgZ3V0IG1pdCBiZXN0aW1tdGVuIFdhZmZlbiBrYWVtcGZlbi4gQXVjaCBkYXp1Cit3ZWlzcyBIcmFnem5vciBtZWhyLgorCitTSUVIRSBBVUNIOgorYmVpc3NlLCBuYWNodHNpY2h0LCBpZGVudGlmaXppZXJlLCBzY2hhZXR6LCBydWVscHNlLCB3aXJiZWx3aW5kLAorc3B1Y2tlLCBoYW1tZXJmYXVzdCwgc3RlaW5oYXV0LCByaWVzZW5wcmFua2UsIGxlaWNoZW5mbGVkZGVyLAorZnVyY2h0LCB0cm9sbHN0YWVya2UKKworQUxTIE5JQ0hULVVSVUtIQUkgTVVTUyBNQU4gREFGVUVSIEZPTEdFTkRFIFNZTlRBWCBOVVRaRU46CitoaWxmZSBnaWxkZSB1cnVraGFpIDx6YXViZXJuYW1lPgorei5CLiBoaWxmZSBnaWxkZSB1cnVraGFpIG5hY2h0c2ljaHQKKwpkaWZmIC0tZ2l0IGEvZG9jL2hlbHAvdmVyZWluIGIvZG9jL2hlbHAvdmVyZWluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NDVkNjYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaGVscC92ZXJlaW4KQEAgLTAsMCArMSw3MyBAQAorIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0jDQorIyAgIERVIEJJU1QgTk9DSCBOSUNIVCBNSVRHTElFRD8gREFOTiBMSUVTIEJFU09OREVSUyBTT1JHRkFFTFRJRyEgICAjDQorIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0jDQorDQorSW5mb3JtYXRpb25lbiB6dW0gRm9lcmRlcnZlcmVpbiBQcm9qZWt0IE1vcmdlbkdyYXVlbiBlLiBWLjoNCistIFdXVy1TZWl0ZTogaHR0cDovL21nLm11ZC5kZS9WZXJlaW4gDQorLSBNUEEgdW50ZXIgZGVyIFJ1YnJpayAibW9yZ2VuZ3JhdWVuLnZlcmVpbiINCisNCitad2VjayBkZXMgVmVyZWluczoNCitGb2VyZGVydW5nIGRlcyBNVURzIE1vcmdlbkdyYXVlbg0KKy0gZmluYW56aWVsbGUgTWl0dGVsIGR1cmNoIFNwZW5kZW4NCistIEJldHJldXVuZyBkZXMgdmVyZWluc2VpZ2VuZW4gUmVjaG5lcnMsIGF1ZiBkZW0gZGFzIE1VRCBsYWV1ZnQNCistIEt1cnNlIHVuZCBWb3J0cmFlZ2UgZnVlciBQcm9ncmFtbWllcmVyIHVuZCBTcGllbGVyDQorICAoTmF0dWVybGljaCBrZWluZSBRdWVzdGxvZXN1bmdlbikNCitEaWVzZSBaaWVsZSBzaW5kIHNhdHp1bmdzYmVkaW5ndC4gDQorDQorU2F0enVuZzoNCistIGltIFZlcmVpbnNidWVybyBpbSBPcmRuZXINCistIGF1ZiBkZW4gV1dXLVNlaXRlbiBkZXMgVmVyZWlucyAoYXVjaCB6dW0gYXVzZHJ1Y2tlbikNCisNCitXaWUgd2VyZGUgaWNoIE1pdGdsaWVkPw0KKy0gQW50cmFnDQorLSBtb2VnbGljaHN0IGF1Y2ggRWluenVnc2VybWFlY2h0aWd1bmcNCisoU2llaGUgV1dXLVNlaXRlKQ0KKw0KK1dhcyBtYWNoIGljaCBhbHMgTWl0Z2xpZWQ/DQorLSB6dSBkZW4gVmVyc2FtbWx1bmdlbiBrb21tZW4NCistIG1pdGhlbGZlbiwgZGllIFp3ZWNrZSBkZXMgVmVyZWlucyB6dSBlcmZ1ZWxsZW4NCistIFNwb25zb3JlbiBmdWVyIGRlbiBNRyBlLiBWLiBzdWNoZW4gdW5kIGRlbSBWb3JzdGFuZCBtaXR0ZWlsZW4NCisgIChiaXR0ZSBrZWluZSBBbGxlaW5nYWVuZ2UpDQorLSBLdXJzdGhlbWVuIHZvcnNjaGxhZ2VuDQorLSBzZWxic3QgZWluZW4gVm9ydHJhZyBoYWx0ZW4NCisNCitXZXIgaXN0IGVpZ2VudGxpY2ggZGVyIFZvcnN0YW5kPw0KK0RlciBWb3JzdGFuZCBiZXN0ZWh0IGF1cyBmb2xnZW5kZW4gdmllciBQZXJzb25lbjoNCisNCisxLiBWb3JzaXR6ZW5kZXI6ICAgWHV0ZWxpdXMKKyAgICAgICAgICAgICAgICAgICBIZW5uaW5nIFVsbHJpY2gKKyAgICAgICAgICAgICAgICAgICBIaW1tZWxwZm9ydGVuZXIgV2VnIDUyCisgICAgICAgICAgICAgICAgICAgNTk4MjMgQXJuc2JlcmcKKworMi4gVm9yc2l0emVuZGVyOiAgIEdsb2luc29uCisgICAgICAgICAgICAgICAgICAgQ2hyaXN0aWFuIEJlY2tlcgorICAgICAgICAgICAgICAgICAgIEFidC1UaG9tYXMtU3RyYXNzZSA0MAorICAgICAgICAgICAgICAgICAgIDg4NjgyIFNhbGVtCisKK0thc3NlbndhcnQ6ICAgICAgICBWYW5pb24KKyAgICAgICAgICAgICAgICAgICBDaHJpc3RpYW4gRmllZGxlcgorICAgICAgICAgICAgICAgICAgIEF0aGVuc3RyLiAyNgorICAgICAgICAgICAgICAgICAgIDI2Mzg0IFdpbGhlbG1zaGF2ZW4KKworU2NocmlmdGZ1ZWhyZXI6ICAgIEd1YXJkCisgICAgICAgICAgICAgICAgICAgUmVuZSBXYWVjaHRlcgorICAgICAgICAgICAgICAgICAgIEthcmwtS3VuZ2VyLVN0ci4gNjYgICAgICAgICAgICAgICAgIG9mZml6aWVsbGUKKyAgICAgICAgICAgICAgICAgICAxMjQzNSBCZXJsaW4gICAgICAgICAgICAgICAgICAgICAgICBWZXJlaW5zYWRyZXNzZSEhCisKK1Vuc2VyZSBLb250b3ZlcmJpbmR1bmc6CisKK0lCQU4gREUwOSAyODAyIDAwNTAgOTIwNCAxNDE3IDAwCitTV0lGVC1CSUMgT0xCT0RFSDJYWFgKK0tvbnRvbnVtbWVyOiA5MjA0MTQxNzAwCitPbGRlbmJ1cmdpc2NoZSBMYW5kZXNiYW5rIEFHCitCTFo6IDI4MCAyMDAgNTAKKworQmVpIEZyYWdlbiB1ZWJlciBkZW4gVmVyZWluIGtvZW5udCBJaHIgRXVjaCBkaXJla3QgYW4gZWluZSBkaWVzZXIgdmllcg0KK1BlcnNvbmVuIHdlbmRlbi4gSWhyIGVycmVpY2h0IGFsbGUgVm9yc3RhbmRzbWl0Z2xpZWRlciBhdWNoIHBlciBFLU1haWwNCit1bnRlciBkZXIgQWRyZXNzZSANCisgICAgICAgICAgICAgICAgICAgICAgICB2b3JzdGFuZEBtZy5tdWQuZGUuDQorDQorIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0jDQorIyAgICAgICAgICAgICAgV0FTIFpPRUdFUlNUIERVIE5PQ0gsIFdFUkRFIE1JVEdMSUVEISAgICAgICAgICAgICAgICAjDQorIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0jDQorDQpkaWZmIC0tZ2l0IGEvZG9jL2hlbHAvd2FmZmVuZmVydGlna2VpdGVuIGIvZG9jL2hlbHAvd2FmZmVuZmVydGlna2VpdGVuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2YTUyODUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaGVscC93YWZmZW5mZXJ0aWdrZWl0ZW4KQEAgLTAsMCArMSwzMyBAQAorQWxsZ2VtZWluZSBXYWZmZW5mZXJ0aWdrZWl0ZW46Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQmVzdGltbXRlIEdpbGRlbiBlcmxlcm5lbiBXYWZmZW5mZXJ0aWdrZWl0ZW4uIERpZXMgc2luZCBiaXNoZXIgZGllCitNaXRnbGllZGVyIGZvbGdlbmRlciBHaWxkZW46CisKKyAtIEFiZW50ZXVyZXIKKyAtIEJpZXJzY2h1ZXR0bGVyCisgLSBDaGFvcworIC0gS2F0emVua3JpZWdlcgorIC0gV2lwZmVsbGFldWZlcgorCitEaWUgU3BpZWxlciBkaWVzZXIgR2lsZGUga29lbm5lbiBkYXMgS2FlbXBmZW4gbWl0IGRlbiBXYWZmZW5nYXR0dW5nZW4gCitLZXVsZW4sIFN0YWViZSwgQWV4dGUsIFNwZWVyZSwgTWVzc2VyLCBTY2h3ZXJ0ZXIgdW5kIFBlaXRzY2hlbiBkdXJjaCAKK0JlbnV0enVuZyBkaWVzZXIgV2FmZmVuIGVybGVybmVuLiBKZSBiZXNzZXIgbWFuIG1pdCBkZW4gV2FmZmVuIHVtZ2VoZW4KK2thbm4sIGRlc3RvIG1laHIgU2NoYWRlbiBrYW5uIG1hbiBiZWkgc2VpbmVtIEdlZ25lciB2ZXJ1cnNhY2hlbi4KKworTmViZW4gZGVyIEZhZWhpZ2tlaXQgaW0gVW1nYW5nIG1pdCBkZW4gV2FmZmVuIHNwaWVsdCBhdWNoIGRpZSBXYWZmZQorZWluZSBSb2xsZSwgc293aWUgZGllIGVpZ2VuZSBLcmFmdCB1bmQgR2VzY2hpY2tsaWNoa2VpdC4gRGFiZWkgc29sbHRlCittYW4gYmVydWVja3NpY2h0aWdlbiwgZGFzcyBkaWUgV2FmZmVuIHVudGVyc2NoaWVkbGljaGUgQW5mb3JkZXJ1bmdlbiAKK2FuIGRhcyBHZXNjaGljayBzdGVsbGVuLiBTbyBpc3QgZGllIEJlbnV0enVuZyBlaW5lciBQZWl0c2NoZSBzZWhyCitrb21wbGV4LCB6dW0gS2FtcGYgbWl0IGVpbmVtIE1lc3NlciBtdXNzIG1hbiBzaWNoIGViZW5zbyByZWNodAorZ2VzY2hpY2t0IGFuc3RlbGxlbiwgZGljaHQgZ2Vmb2xndCB2b20gS2FtcGYgbWl0IFNwZWVyZW4uIFJlY2h0IAorYXVzZ2VnbGljaGVuIHp3aXNjaGVuIEdlc2NoaWNrbGljaGtlaXQgdW5kIEtyYWZ0IGlzdCBkZXIgS2FtcGYgbWl0IGVpbmVtCitTY2h3ZXJ0LiBEaWUgQmVudXR6dW5nIHZvbiBBZXh0ZW4gZXJmb3JkZXJ0IG5vY2ggZWluaWdlcyBHZXNjaGljaywgd2FlaHJlbmQKK21hbiBiZWkgS2V1bGVuIGFtIGVoZXN0ZW4gbWl0IHB1cmVyIEtyYWZ0IGJlZGllbnQgaXN0LgorCitXZXIgd2lzc2VuIG1vZWNodGUsIHdpZSBndXQgZXIgZGVuIFVtZ2FuZyBtaXQgZGVuIFdhZmZlbiBiZXJlaXRzCitiZWhlcnJzY2h0LCBrYW5uIGRhenUgZWluZW4gS2FlbXBmZXIgKG1pbmRlc3RlbnMgaW0gUmFuZ2UgZWluZXMKK1VudGVyb2ZmaXppZXJzKSBiZWZyYWdlbi4gRGVyIHNvbGx0ZSBkaWVzIGJldXJ0ZWlsZW4ga29lbm5lbi4gCisKKworTGV0enRlIEFlbmRlcnVuZzogMjAxMi0wOC0yNiB2b24gQXJhdGhvcm4uCmRpZmYgLS1naXQgYS9kb2MvaGVscC93ZXJ3b2VsZmUgYi9kb2MvaGVscC93ZXJ3b2VsZmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEwNGYzYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9oZWxwL3dlcndvZWxmZQpAQCAtMCwwICsxLDEzIEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRGllIEdpbGRlIGRlciBXZXJ3b2VsZmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK01hbiBrYW5uIGF1ZiBkZXIgV2Vyd29sZmluc2VsIE1pdGdsaWVkIGRlciBHaWxkZSBkZXIgV2Vyd29lbGZlIHdlcmRlbi4KK0RhenUgbXVzcyBtYW4gTW9uZGhldWxlciBmaW5kZW4gdW5kIGJlaSBpaG0gaW4gZGllIEdpbGRlIGVpbnRyZXRlbi4KKworV2FzIGRpZSBXZXJ3b2VsZmUga29lbm5lbiB1bmQgd2VsY2hlIEZhZWhpZ2tlaXRlbiBzaWUgaGFiZW4ga2FubiBtYW4gCitkYW5uIHZvbiBkaXZlcnNlbiBHaWxkZW5taXRnbGllZGVybiBlcmZyYWdlbi4KKworRWluZSBFaW5mdWVocnVuZyBrYW5uIG1hbiBiZWtvbW1lbiwgd2VubiBtYW4gTW9uZGhldWxlciBuYWNoIEhpbGZlIGZyYWd0LgorCitMZXR6dGUgQWVuZGVydW5nOiAxLjExLjIwMTMsIEh1bW5pCmRpZmYgLS1naXQgYS9kb2MvaGVscC93aWxsa3VlciBiL2RvYy9oZWxwL3dpbGxrdWVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3OGUwMzgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaGVscC93aWxsa3VlcgpAQCAtMCwwICsxLDkgQEAKK1dpbGxrdWVyCis9PT09PT09PQorICAgICAgICBXaWxsa3VlciBpc3Qgc3ViamVrdGl2LgorCisgU0lFSEUgQVVDSDoKKyAgICAgICAgZ29ldHRlciwgZXJ6bWFnaWVyCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgICBtb3JnZW4sIEdsb2luc29uIGkuQS4gVmFuaW9uCmRpZmYgLS1naXQgYS9kb2MvaGVscC93aXBmZWxsYWV1ZmVyIGIvZG9jL2hlbHAvd2lwZmVsbGFldWZlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDY2MmY1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2hlbHAvd2lwZmVsbGFldWZlcgpAQCAtMCwwICsxLDcxIEBACitHSUxERSBERVIgV0lQRkVMTEFFVUZFUgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVWViZXIgZGVtIGhlaWxpZ2VuIEhhaW4gZGVyIEVsZmVuIGJlZmluZGV0IHNpY2ggZGllIEdpbGRlIGRlciBXaXBmZWxsYWV1ZmVyLgorSWxsZGVyZXRoLCBkZXIgR2lsZGVudm9yc3RlaGVyLCBicmluZ3QganVuZ2VuIEVsZmVuIHVuZCBhbGxlbiwgZGllIHNvbnN0IGRlcgorR2lsZGUgYmVpdHJldGVuIG1vZWNodGVuLCBhbGxlcyBiZWksIHdhcyBkaWUgV2lwZmVsbGFldWZlciB3aXNzZW4gbXVlc3Nlbi4KKworRUlOU1RVRlVORyBERVIgR0lMREUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0RpZSBXaXBmZWxsYWV1ZmVyIHNpbmQgZWluZSBleHBsaXppdGUgQW5mYWVuZ2VyZ2lsZGUgdW5kIGFscyBBbmZhZW5nZXJnaWxkZQorZGVyIEVsZmVuIGF1c2dlbGVndC4gQWxsZXJkaW5ncyB3ZXJkZW4gc2llIGltIExhdWZlIGRlciBTdHVmZW4gYXVjaCBkdXJjaGF1cworaW4gdmllbGVuIEJlcmVpY2hlbiBub2NoIGJlc3Nlciwgc28gZGFzcyBlaW4gcGFhciBpaHJlciBGYWVoaWdrZWl0ZW4gYXVjaCAKK2Z1ZXIgZ3JvZXNzZXJlIFNwaWVsZXIgaW50ZXJlc3NhbnQgc2VpbiBrb2VubmVuLgorCitQUklOWklQSUVOCistLS0tLS0tLS0tCisKK1dpcGZlbGxhZXVmZXIgc2luZCBLcmVhdHVyZW4gZGVzIFdhbGRlcywgaW4gZGVyIFJlZ2VsIEVsZmVuLCBmdWVyIGRpZSBkaWVzZQorR2lsZGUgYXVjaCBkaWUgQW5mYW5nc2dpbGRlIGlzdC4gU2llIHZlcnN0ZWhlbiBzaWNoIGF1ZiBkYXMgQm9nZW5zY2hpZXNzZW4sIAord2FzIHZvciBhbGxlbSBkYW5uIHNlaHIgZ3V0IG51dHpiYXIgaXN0LCB3ZW5uIHNpY2ggamVtYW5kIHNjaHVldHplbmQgaW0gS2FtcGYKK3ZvciBzaWUgc3RlbGx0LgorCitGZXJuZXIgYmVoZXJyc2NoZW4gc2llIGVpbiBwYWFyIEFuZ3JpZmZzemF1YmVyIHVuZCBrZW5uZW4gbmF0dWVybGljaCBkaWUKK2VsZW1lbnRhcmVuIERpbmdlLCBkaWUgZnVlciBkYXMgVWViZXJsZWJlbiBpbSBXYWxkIG5vZXRpZyBzaW5kLgorCitTT05TVElHRVMKKy0tLS0tLS0tLQorCitEaWUgd2ljaHRpZ3N0ZW4gSW5mb3JtYXRpb25lbiB1ZWJlciBkaWUgV2lwZmVsbGFldWZlciBrZW5udCBJbGxkZXJldGgsIAorYW5zb25zdGVuIGthbm4gbWFuIGFuZGVyZSBNaXRzcGllbGVyIGF1ZiBkZXIgV2lwZmVsbGFldWZlci1FYmVuZSBiZWZyYWdlbi4KKworRGllIFdpcGZlbGxhZXVmZXItRWJlbmUga2FubiBtYW4gbWl0IC13aXBmZWwrIGJldHJldGVuLiAoTWVociBkYXp1IHVudGVyIAorImhpbGZlIGViZW5lbiIpLgorCitCRVNDSFJBRU5LVU5HRU4KKy0tLS0tLS0tLS0tLS0tLQorCitad2VyZ2Uga29lbm5lbiBrZWluZSBXaXBmZWxsYWV1ZmVyIHdlcmRlbi4gRGllIHp3ZXJnaXNjaGVuIFByaW56aXBpZW4gZGVzCitTdG9sbGVuYmF1cyB3dWVyZGVuIGF1Y2ggbmljaHQgZGF6dSBwYXNzZW4sIHVuZCBkaWUgbWVpc3RlbiBad2VyZ2UgaGFiZW4gYXVjaAorZ2FyIGtlaW4gSW50ZXJlc3NlIGRhcmFuLgorCitGZXJuZXIga29lbm5lbiBEdW5rZWxlbGZlbiBhdWZncnVuZCBkZXMgYWx0ZW4gSGFzc2VzIHp3aXNjaGVuIGRlbiBWb2Vsa2VybgorYXVjaCBrZWluZSBXaXBmZWxsYWV1ZmVyIHdlcmRlbi4KKworWkFVQkVSU1BSVUVDSEUKKy0tLS0tLS0tLS0tLS0tCisKK2dsdWVod3Vlcm1jaGVuCitpZGVudGlmaXppZXJlCitzY2hhZXR6CityZWdlbmd1c3MKK2JhdW1yaW5kZQoraGFnZWxzY2hsYWcKK3BmZWlsc2NobmVsbAorYmxpdHoKKworR2lsZGVubWFnaWVyCistLS0tLS0tLS0tLS0KKworRGllIEdpbGRlIHd1cmRlIHZvbiBIdW1uaSBnZXNjaHJpZWJlbiwgZGVyIGRlcnplaXQgYXVjaCBkYWZ1ZXIgenVzdGFlbmRpZyBpc3QuCisKK1NpZWhlIGF1Y2g6IAorLS0tLS0tLS0tLS0KK2dpbGRlbiwgKGRpZSBlaW56ZWxuZW4gWmF1YmVyc3BydWVjaGUpLCBib2dlbnNjaGllc3NlbgorCisqIFdFTk4gTUFOIEVJTkVSIEFOREVSRU4gR0lMREUgQU5HRUhPRVJULCBNVVNTIE1BTiBGVUVSIERJRSBISUxGRQorLCxoaWxmZSBnaWxkZSB3aXBmZWxsYWV1ZmVyIDx0aGVtYT4nJyBFSU5HRUJFTiEgKgorCitMZXR6dGUgQWVuZGVydW5nOiBIdW1uaSwgMjAxMS0xMC0yNworCmRpZmYgLS1naXQgYS9kb2MvaGVscC93d3cgYi9kb2MvaGVscC93d3cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q5NjM4YQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9oZWxwL3d3dwpAQCAtMCwwICsxLDE5IEBACitEaWUgV2Vic2VpdGUobikKKz09PT09PT09PT09PT09PQorCisgICAgIEF1ZiBmb2xnZW5kZW4gV2Vic2VpdGVuIGZpbmRlbiBzaWNoIEluZm9ybWF0aW9uZW4gdWViZXIgdW5zZXIKKyAgICAgTVVEIHVuZCBkYXp1Z2Vob2VyaWdlIFByb2pla3RlOgorCisgICAgIE9mZml6aWVsbGUgU2VpdGU6IGh0dHA6Ly9tZy5tdWQuZGUKKyAgICAgKiBlcm1vZWdsaWNodCBadWdyaWZmIGF1ZiBNUEEvQXJjaGl2ZQorICAgICAqIGVudGhhZWx0IGVpbmVuIFdlYi1DbGllbnQgdW5kIExpbmtzIGF1ZiBDbGllbnRzCisgICAgICogZW50aGFlbHQgSW5mb3JtYXRpb25lbiB6dW0gQXVzcmljaHRlbiB1bmQgQmlsZGVyIHZvbiBQYXJ0aWVzCisgICAgICogZW50aGFlbHQgZGllIFZlcmVpbnMtU2VpdGU6IGh0dHA6Ly9tZy5tdWQuZGUvdmVyZWluCisKKyAgICAgRGllIFdpa2ktU2VpdGU6IGh0dHA6Ly9odHRwOi8vd2lraS5tb3JnZW5ncmF1ZW4uaW5mby8KKyAgICAgKiBhdWNoIHZvbiBOaWNodG1hZ2llcm4gZWRpdGllcmJhcmUgUHJvamVrdHNlaXRlbgorCitTSUVIRSBBVUNIOgorICAgICBtdWRyZWNobmVyLCBjbGllbnQsIHRlYW1zcGVhaywgaXJjCisKKzI2LiBBdWcgMjAxMyBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL2hlbHAvemF1YmVyZWkgYi9kb2MvaGVscC96YXViZXJlaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWNkNTAyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2hlbHAvemF1YmVyZWkKQEAgLTAsMCArMSwzNyBAQAorCitaYXViZXJlaSBpbSBNb3JnZW5HcmF1ZW4KKz09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgRGllIG1laXN0ZW4gR2lsZGVuIHN0ZWxsZW4gaWhyZW4gTWl0Z2xpZWRlcm4gbWVociBvZGVyIHdlbmlnZXIgbnVldHpsaWNoZQorICAgIFphdWJlcnNwcnVlY2hlIHp1ciBWZXJmdWVndW5nLiBHZW5hdWVyZXMgenUgZGVuIGVpbnplbG5lbiBTcHJ1ZWNoZW4KKyAgICBmaW5kZXN0IER1IGF1ZiBkZW4gamV3ZWlsaWdlbiBIaWxmZXNlaXRlbi4KKworICAgIEFsbGdlbWVpbiBsYWVzc3Qgc2ljaCBzYWdlbiwgZGFzcyBkaWUgQW53ZW5kdW5nIHZvbiBNYWdpZSBpbSB3ZXNlbnRsaWNoZW4KKyAgICBhbiBkaWUgSW50ZWxsaWdlbnogZGVzIENoYXJha3RlcnMgZ2Vrb3BwZWx0IGlzdC4KKworICAgIFNvIHZlcmJyYXVjaGVuIGRpZSBTcHJ1ZWNoZSBpbiBkZXIgUmVnZWwgbWVociBvZGVyIHdlbmlnZXIgdmllbGUKKyAgICBNYWdpZXB1bmt0ZS4gRGVyZW4gQW56YWhsIHdpZWRlcnVtIGhhZW5ndCBkaXJla3Qgdm9uIGRlciBJbnRlbGxpZ2VueiBhYiwKKyAgICBrYW5uIGFiZXIgYXVjaCBkdXJjaCBhbmRlcmUgTWFnaWUgZXJob2VodCB3ZXJkZW4uCisKKyAgICBMZXJudCBtYW4gZWluZW4gU3BydWNoIG5ldSBkYXp1LCBzbyB3aXJkIGlobSBlaW4gQW5mYW5nc3dlcnQgZnVlciBkaWUKKyAgICBFcmZvbGdzd2FocnNjaGVpbmxpY2hrZWl0IHp1Z2VvcmRuZXQuIEF1Y2ggZGllc2VyIEFuZmFuZ3N3ZXJ0IGhhZW5ndCBiZWkKKyAgICBkZW4gbWVpc3RlbiBHaWxkZW4gdm9uIGRlciBJbnRlbGxpZ2VueiBhYiAoaGllciBrb2VubmVuIGFiZXIgYXVjaCBub2NoCisgICAgd2VpdGVyZSBGYWt0b3JlbiB3aXJrc2FtIHdlcmRlbikuCisKKyAgICBEaWUgRXJmb2xnc3dhaHJzY2hlaW5saWNoa2VpdCBlaW5lcyBTcHJ1Y2hlcyB2ZXJiZXNzZXJ0IHNpY2gsIHdlbm4gZGVyCisgICAgU3BydWNoIGZlaGxzY2hsYWVndCAoYER1IGxlcm5zdCBhdXMgRGVpbmVtIEZlaGxlci4nKS4gSGllciBtdXNzIG1hbgorICAgIGFsbGVyZGluZ3MgYXVmcGFzc2VuOiBFaW5pZ2UgU3BydWVjaGUgaGFiZW4gZWluZSBCZXNjaHJhZW5rdW5nIGRlciBtYXhpbWFsCisgICAgZXJyZWljaGJhcmVuIFdhaHJzY2hlaW5saWNoa2VpdC4gRGllIFNjaHJhbmtlIHdhbmRlcnQgbWl0IHp1bmVobWVuZGVyCisgICAgU3BpZWxlcnN0dWZlIHdlaXRlciBuYWNoIG9iZW4uIEhhdCBtYW4gZGVuIGZ1ZXIgc2VpbmUgU3R1ZmUgbWF4aW1hbGVuIFdlcnQKKyAgICBlcnJlaWNodCwgc28ga2FubiBlcyBiZWkgZWluaWdlbiBHaWxkZW4gaW1tZXIgbm9jaCB6dSBkZXIgTGVybm1lbGR1bmcKKyAgICBrb21tZW4sIG9id29obCBtYW4gZWlnZW50bGljaCBuaWNodHMgZGF6dWxlcm50IQorCisgICAgRGllIFZlcmJlc3NlcnVuZyBkZXIgV2FocnNjaGVpbmxpY2hrZWl0IGltIEZhbGxlIGVpbmVzIEZlaGxzY2hsYWdzIGhhZW5ndAorICAgIHVlYnJpZ2VucyB3aWVkZXJ1bSBpbiBkZW4gbWVpc3RlbiBGYWVsbGVuIHZvbiBkZXIgSW50ZWxsaWdlbnogYWIuCisKKyBTSUVIRSBBVUNIOgorICAgIGF0dHJpYnV0ZSwgZ2lsZGVuLCBoZWlsdW5nCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIDE4LiBNYWVyeiAyMDA0IEdsb2luc29uCisKZGlmZiAtLWdpdCBhL2RvYy9oZWxwL3phdWJlcmVyIGIvZG9jL2hlbHAvemF1YmVyZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ2YTM3NQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9oZWxwL3phdWJlcmVyCkBAIC0wLDAgKzEsMzYgQEAKKworRGllIEdpbGRlIGRlciBaYXViZXJlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRGllIEdpbGRlIGRlciBaYXViZXJlciBiZWZpbmRldCBzaWNoIGluIFRhcmFtaXMgdW5kIGlzdCBpbSBNb21lbnQgbnVyCisgICAgdWViZXIgZWluIG1hZ2lzY2hlcyBUb3IgenUgZXJyZWljaGVuLiBVbSBkZXIgR2lsZGUgYmVpdHJldGVuIHp1IGtvZW5uZW4sCisgICAgbXVzcyBtYW4gZGVuIHp3ZWl0ZW4gTGV2ZWwgZXJyZWljaHQgaGFiZW4gdW5kIDUwIEFiZW50ZXVlcnB1bmt0ZQorICAgIGF1ZndlaXNlbi4gSW5zZ2VzYW10IGdpYnQgZXMgemVobiBTdHVmZW4uIERhdm9uIHNpbmQgZGllIGVyc3RlbiB2aWVyCisgICAgQW5mYWVuZ2VybiB2b3JiZWhhbHRlbi4gVm9yIGRlbSBFcnJlaWNoZW4gZGVyIGZ1ZW5mdGVuIFN0dWZlIG11c3MgbWFuIGRpZQorICAgIExlaHJsaW5nc3BydWVmdW5nIGFibGVnZW4uIE5hY2ggQmVzdGVoZW4gZGVyIFBydWVmdW5nIGJla29tbXQgbWFuIHNlaW5lbgorICAgIFphdWJlcnN0YWIsIGRlciBlaW5lIGdyb3NzZSBIaWxmZSBmdWVyIGRlbiBaYXViZXJlciBpc3QuCisKKyAgICBEYW5hY2gga2FubiBtYW4gYmlzIHp1ciBTdHVmZSBBY2h0IGF1ZnN0ZWlnZW4uIFZvciBkZW0gRXJyZWljaGVuIGRlciBTdHVmZQorICAgIE5ldW4gbXVzcyBkaWUgTWFnaXN0ZXJwcnVlZnVuZyBhYmdlbGVndCB3ZXJkZW4uIEltIEdlZ2Vuc2F0eiB6dXIKKyAgICBMZWhybGluZ3NwcnVlZnVuZyBpc3QgZGllIE1hZ2lzdGVycHJ1ZWZ1bmcgYWV1c3NlcnN0IHNjaHdlci4gRGFuYWNoIHN0ZWlndAorICAgIG1hbiB6dW0gTWFnaXN0ZXIgYXVmIHVuZCBrYW5uIGVpbmVuIE1hZ2lzdGVycG9zdGVuIGluIGVpbmVtIGRlciBad2VpZ2UKKyAgICBiZWFudHJhZ2VuLiBBdXMgc3BpZWx0ZWNobmlzY2hlbiB1bmQgYmFsYW5jZXRlY2huaXNjaGVuIEdydWVuZGVuIGlzdCBkZXIKKyAgICBSYW5nIGVpbmVzIEVyem1hZ2lzdGVycyBtb21lbnRhbiBuaWNodCB2b24gU3BpZWxlcm4genUgZXJyZWljaGVuLgorCisgICAgRGllIFphdWJlcnNwcnVlY2hlLCBkaWUgZGVyIFphdWJlcmVyIGxlcm5lbiBrYW5uLCB1bnRlcnRlaWxlbiBzaWNoIGluCisgICAgc2VjaHMgWndlaWdlOiBBbmdyaWZmLCBCZWhlcnJzY2h1bmcsIEhlbGxzaWNodCwgSWxsdXNpb24sIFNjaHV0eiB1bmQKKyAgICBWZXJ3YW5kbHVuZy4KKyAgICBadSBCZWdpbm4gbGVybnQgbWFuIGF1cyBqZWRlbSBad2VpZyBlaW5lbiBTcHJ1Y2guIE5hY2ggZGVyCisgICAgTGVocmxpbmdzcHJ1ZWZ1bmcga2FubiBtYW4gYXVmIGplZGVyIFN0dWZlICg1LTgpIGplIGVpbmVuIFNwcnVjaCBhdXMgZWluZW0KKyAgICBad2VpZyBsZXJuZW4uIEFscyBNYWdpc3RlciBrYW5uIG1hbiBzaWNoIGZ1ZXIgZWluZW4gWndlaWcgZW50c2NoZWlkZW4gdW5kCisgICAgZG9ydCB6d2VpIE1hZ2lzdGVyc3BydWVjaGUgbGVybmVuLiAKKworCisgU0lFSEUgQVVDSDoKKyAgICBhdHRyaWJ1dGUsIGViZW5lbiwgZ2lsZGVuCisKKyAgICBBbmdlaG9lcmlnZSBmcmVtZGVyIEdpbGRlbiBrb2VubmVuIHNpY2ggaW4gZGVyIEJpYmxpb3RoZWsgZGVyIFphdWJlcmVyCisgICAgdWViZXIgZGllIGVpbnplbG5lbiBTcHJ1ZWNoZSB1bmQgWndlaWdlIGluZm9ybWllcmVuLgorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBEaWUsIDAzLjEwLjIwMDYsIDIwOjMyOjAwIHZvbiBDaGFnYWxsCmRpZmYgLS1naXQgYS9kb2MvaGVscC96YXViZXJ0cmFlbmtlIGIvZG9jL2hlbHAvemF1YmVydHJhZW5rZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzY1ODYwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2hlbHAvemF1YmVydHJhZW5rZQpAQCAtMCwwICsxLDY0IEBACisKK1phdWJlcnRyYWVua2UKKz09PT09PT09PT09PT0KKworIFpBVUJFUlRSQWVOS0U6CisgICAgSW0gZ2FuemVuIE1vcmdlbkdyYXVlbiBzaW5kIFphdWJlcnRyYWVua2UgKFpUKSB2ZXJzdGVja3QsIHdlbGNoZSBkaWUKKyAgICBBdHRyaWJ1dGUgZXJob2VoZW4uIERhIGRhcyBTcGllbCBhYmVyIGluendpc2NoZW4gc28gZ3Jvc3MgZ2V3b3JkZW4gaXN0LAorICAgIGRhc3MgbWFuIHNpZSBvaG5lIEhpbGZlIHByYWt0aXNjaCBuaWNodCBtZWhyIGZpbmRlbiBrYW5uLCBnaWJ0IGVzIGRhcworICAgIE9yYWtlbCB2b24gVGluZ2FuLiBEb3J0IGJla29tbXQgbWFuIGluIEFiaGFlbmdpZ2tlaXQgdm9uIGRlbgorICAgIFN0dWZlbnB1bmt0ZW4ga29ua3JldGUgSGlud2Vpc2UsIHdvIG1hbiBlaW5lbiBaYXViZXJ0cmFuayBmaW5kZW4ga2Fubi4KKyAgICBOYXR1ZXJsaWNoIGJla29tbWVuIEFuZmFlbmdlciB6dWVyc3QgZGllIGxlaWNodGVzdGVuIFZlcnN0ZWNrZSB2ZXJyYXRlbiwKKyAgICBkZXIgU2Nod2llcmlna2VpdHNncmFkIHN0ZWlnZXJ0IHNpY2ggZGFubiBpbSBTcGllbHZlcmxhdWYuIFNvIHNvbGx0ZSBlcworICAgIGltbWVyIG1vZWdsaWNoIHNlaW4sIG1pdCBkZW4gVGlwcHMgYXVjaCBldHdhcyBhbnp1ZmFuZ2VuIChzaWVoZSBERVRBSUxTKS4KKworICAgIEtvbmtyZXQgc2llaHQgZGFzIHNvIGF1czoKKworICAgICAqIDggVGlwcHMga2FubiBtYW4gc2ljaCBkaXJla3QgYmVpIFNwaWVsYmVnaW5uIHVtc29uc3QgaG9sZW4KKyAgICAgKiAyNiBUaXBwcyBnaWJ0IGVzIGZ1ZXIgamV3ZWlscyAyNSBTdHVmZW5wdW5rdGUKKyAgICAgKiAyNiBUaXBwcyBnaWJ0IGVzIGZ1ZXIgamV3ZWlscyA0MCBTdHVmZW5wdW5rdGUKKyAgICAgKiAxMCBUaXBwcyBnaWJ0IGVzIGZ1ZXIgamV3ZWlscyA3MCBTdHVmZW5wdW5rdGUKKyAgICAgKiAxMCBUaXBwcyBnaWJ0IGVzIGZ1ZXIgamV3ZWlscyAxMDAgU3R1ZmVucHVua3RlCisKKyAgICBOYXR1ZXJsaWNoIG11c3MgbWFuIGtlaW5lIFN0dWZlbnB1bmt0ZSBiZXphaGxlbiwgbWFuIG11c3Mgc2llIG51ciBoYWJlbi4KKworICAgIEFDSFRVTkc6IE1hbiBrYW5uIGRpZSBaYXViZXJ0cmFlbmtlIGVyc3QgZmluZGVuLCB3ZW5uIG1hbiBkZW4KKyAgICBlbnRzcHJlY2hlbmRlbiBIaW53ZWlzIHZvbSBPcmFrZWwgYmVrb21tZW4gaGF0LgorCisgICAgV28gaXN0IGRhcyBPcmFrZWw/CisgICAgRGFzIE9yYWtlbCBrYW5uIG1hbiBmaW5kZW4sIHdlbm4gbWFuIHNpY2ggZGVuIHdlc3RsaWNoZW4gVGVpbCBkZXIKKyAgICBIb2NoZWJlbmUgZXR3YXMgZ2VuYXVlciBhbnNjaGF1dC4gV2llIG1hbiBkaWUgSG9jaGViZW5lIGZpbmRldD8gRGFzIGthbm4KKyAgICBqZWRlciBTcGllbGVyIG1pdCBlaW4gYmlzc2NoZW4gU3BpZWxlcmZhaHJ1bmcgZXJrbGFlcmVuLCBhbHNvIGZyYWd0IHJ1aGlnCisgICAgZWluIGJpc3NjaGVuIGhlcnVtLgorCisgICAgV2llIHNlaGVuIGRpZSBIaW53ZWlzZSBhdXM/CisgICAgTmF0dWVybGljaCBvcmFrZWxtYWVzc2lnIHZlcnNjaGx1ZXNzZWx0LCBhYmVyIG5pY2h0ICp6dSogdW5kdXJjaHNpY2h0aWcuCisgICAgTWFuIHNvbGx0ZSBpbiBkZXIgUmVnZWwgc2Nob24gZXR3YXMgZGFtaXQgYW5mYW5nZW4ga29lbm5lbiwgZGFzIGhlaXNzdAorICAgIGFiZXIgbmljaHQsIGRhc3MgbWFuIHVlYmVyaGF1cHQgbmljaHQgbWVociBzdWNoZW4gb2RlciBuYWNoZGVua2VuIG11c3MuCisgICAgRGFtaXQgbWFuIHNpY2ggbmljaHQgYWxsZXMgYXVmc2NocmVpYmVuIG11c3MsIG1lcmt0IHNpY2ggZGVyIFNwaWVsZXIgZGllCisgICAgbW9tZW50YW4gYWt0dWVsbGVuIFNwcnVlY2hlIGF1dG9tYXRpc2NoLCBtYW4ga2FubiBzaWUgbWl0IGRlbSBCZWZlaGwKKyAgICBgemF1YmVydHJhZW5rZScgYWJydWZlbi4gV2VubiBkZXIgWmF1YmVydHJhbmsgZ2VmdW5kZW4gd3VyZGUsIHZlcnNjaHdpbmRldAorICAgIGF1Y2ggZGVyIGVudHNwcmVjaGVuZGUgSGlud2VpcyBhdXMgZGVyIExpc3RlLgorICAgIEZ1ZXIgZWluaWdlIFphdWJlcnRyYWVua2UgZ2lidCBlcyBtZWhyZXJlIFNwcnVlY2hlLCBkaWUgaW4gZGVyIExpc3RlCisgICAgenVmYWVsbGlnIGF1c2dld2FlaGx0IHVuZCBhbmdlemVpZ3Qgd2VyZGVuLgorCisgREVUQUlMUzoKKyAgICBUZWNobmlzY2ggZ2VuYXVlcjogRWluIFNwaWVsZXIgYmVrb21tdCBiZWkgc2VpbmVtIGVyc3RlbiBMb2dpbiBlaW5lIExpc3RlCisgICAgdm9uIFpUcyB6dWdlb3JkbmV0LiBEaWVzZSBMaXN0ZSBpc3QgZWluZSBBdXN3YWhsIGF1cyBhbGxlbiBleGlzdGllcmVuZGVuCisgICAgWlRzLgorICAgIERhcyBPcmFrZWwgcHJhZXNlbnRpZXJ0IGVpbmVtIGRhbm4gamV3ZWlscyBkaWUgbGVpY2h0ZXN0ZW4gWlRzIGF1cyBkaWVzZXIKKyAgICBlaWdlbmVuIExpc3RlICh1bmQgbmljaHQgYXVzIGFsbGVuIFpUcyEpCisgICAgRGFzIGhlaXNzdCBhbHNvLCBkYXNzIGV1Y2ggZHVyY2ggYW5kZXJlIFNwaWVsZXIgYmVrYW5udGUsIGxlaWNodGUgWlRzCisgICAgbmljaHQgdW5iZWRpbmd0IGF1Y2ggZXVyZSBaVHMgc2VpbiBtdWVzc2VuLiBVbmQgZXMga2FubiBiZWRldXRlbiwgZGFzcworICAgIGV1cmUgbGVpY2h0ZW4gWlRzIGV0d2FzIHNjaHdlcmVyIHNpbmQuIE5pY2h0IGF1ZmdlYmVuIQorCisgICAgV2VubiBldWNoIFpUcyBhbiBudXIgaW4gZWluZXIgUXVlc3QgZXJyZWljaGJhcmVuIFN0ZWxsZW4gYXVmZmFsbGVuLCBzbworICAgIHdlbmRldCBldWNoIGJpdHRlIGFuIGRlbiBFcnptYWdpZXIsIGRlciBmdWVyIGRpZSBaVHMgenVzdGFlbmRpZyBpc3QKKyAgICAoc2llaGUgaGlsZmUgZXJ6bWFnaWVyKS4KKworIFNJRUhFIEFVQ0g6CisgICAgYXR0cmlidXRlLCBzdHVmZW5wdW5rdGUKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgMjUuIE5vdiAyMDA3IEdsb2luc29uCisKZGlmZiAtLWdpdCBhL2RvYy9oZWxwL3plaXR1bmcgYi9kb2MvaGVscC96ZWl0dW5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMWMyOGUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaGVscC96ZWl0dW5nCkBAIC0wLDAgKzEsMjEgQEAKKworWmVpdHVuZyBpbSBNb3JnZW5ncmF1ZW4KKz09PT09PT09PT09PT09PT09PT09PT09CisKKyBCRVNDSFJFSUJVTkc6CisgICAgIEluIE1vcmdlbmdyYXVlbiBnaWJ0IGVzIGVpbmUgZnVlciBhbGxlIHZlcmZ1ZWdiYXJlIFplaXR1bmcsIGRpZQorICAgICBNb3JnZW5ncmF1ZW4gUHJlc3NlLUFnZW50dXIgKE1QQSkuIEJlc3VjaGUgZWluZW4gU3RhcnRyYXVtIGRlaW5lcgorICAgICBXYWhsIHVuZCBuaW1tIGRpciBlaW5lIG1pdC4KKworICAgICBEaWUgWmVpdHVuZyBzZWxic3QgaGF0IGRhbm4gZWluZSBlaWdlbmUgSGlsZmVmdW5rdGlvbi4KKworIEJFTUVSS1VOR0VOOgorICAgICBFaW5lIGRlciB3aWNodGlnc3RlbiBSdWJyaWtlbiBpc3QgZGllIFJ1YnJpayAibWVnYXNjaG1hcnJuIi4gRG9ydAorICAgICB3ZXJkZW4gYWxsZSAoISkgcmVsZXZhbnRlbiBUaGVtZW4gYmVzcHJvY2hlbi4gUmVnZWxuIHNpZWhlCisgICAgIFJ1YnJpay4KKworIFNJRUhFIEFVQ0g6CisgICAgIHRlaWxlIG1pdCwgZWJlbmVuCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIDUuIE9rdG9iZXIgMjAwNCBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL2hlbHAvem9va2VsbiBiL2RvYy9oZWxwL3pvb2tlbG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU2MzI5ZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9oZWxwL3pvb2tlbG4KQEAgLTAsMCArMSwxNiBAQAorCitFeHRyYSBmdWVyIE1lc2lyaWkgZ2lidCBlcyBudW4gYXVjaCB6dW0gVGhlbWEgem9va2VsbiBlaW5lIEhpbGZlc2VpdGU6CisKK1pPT0tFTE4gKFRNKTogIFZlcnNlaGVudGxpY2hlcyBHZWxhYmVyIGF1ZiBkZXIgZmFsc2NoZW4gRWJlbmUuIEJlc29uZGVycworICAgICAgICAgICAgICAgc3Bhbm5lbmQsIHdlbm4gbWFuIGdlcmFkZSB1ZWJlcmF1cyB3aWNodGlnZSB1bmQgZ2VoZWltZQorICAgICAgICAgICAgICAgRGluZ2UgYXVmIC1hbGwgc3RhdHQgYXVmIC1nb2V0dGVyIGVyemFlaGx0LiBPZnRtYWxzIHZvZWxsaWcKKyAgICAgICAgICAgICAgIHp1c2FtbWVuaGFuZ3Nsb3NlcyBHZWxhYmVyLCBtaXQgZGVtIG51ciBkaWUgd2FzIGFuZmFuZ2VuIAorICAgICAgICAgICAgICAga29lbm5lbiwgZGllIGRpZSBFYmVuZSBlaW5nZXNjaGFsdGV0IGhhYmVuLCBhdWYgZGVyIGRpZXNlcgorICAgICAgICAgICAgICAgVGV4dCBnZXNlbmRldCB3ZXJkZW4gc29sbHRlLgorCitCRU1FUktVTkdFTjogICBVZWJlcmZsdWVzc2lnCisKK1NJRUhFIEFVQ0g6ICAgIHpvb2sKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGV0enRlIEFlbmRlcnVuZzogMTkuMTAuMjAwNSAgTWlyaWwKKwpkaWZmIC0tZ2l0IGEvZG9jL2hlbHAvendlaXRzcGllbGVyIGIvZG9jL2hlbHAvendlaXRzcGllbGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNTdmNzQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaGVscC96d2VpdHNwaWVsZXIKQEAgLTAsMCArMSwyMyBAQAorCitad2VpdHNwaWVsZXIKKz09PT09PT09PT09PQorCisgQkVTQ0hSRUlCVU5HOgorICAgICBad2VpdHNwaWVsZXIgc2luZCBTcGllbGVyLCB3ZWxjaGUgbWFuIHp1c2FldHpsaWNoIHp1IHNlaW5lbSBIYXVwdC0KKyAgICAgY2hhcmFrdGVyIGVyc2NoYWZmZW4gaGF0LiBIYXVwdHNhZWNobGljaCBudXR6dCBtYW4gc2llLCB1bSBmdWVyIGRlbgorICAgICBFcnN0aWUgU2FjaGVuIHp1IHNjaGxlcHBlbiwgenUgc3RlcmJlbiwgdW0gYW5kZXJlIEdpbGRlbiB6dSB0ZXN0ZW4gb2RlcgorICAgICBnYXIgTWFnaWVyIHp1IHdlcmRlbi4KKworIEJFTUVSS1VOR0VOOgorICAgICBKZWRlciBTcGllbGVyIGltIE1VRCBpc3QgdmVycGZsaWNodGV0LCBzZWluZSBad2VpdGllcyB6dSBtYXJraWVyZW4sIHVtCisgICAgIGRhbWl0IFZlcmFudHdvcnRsaWNoa2VpdGVuIGJlc3NlciB6dW9yZG5lbiB6dSBrb2VubmVuLgorCisgICAgIERpZXNlIE1hcmtpZXJ1bmcga2FubiBtYW4genVtIEJlaXNwaWVsIGJlaW0gU2NobWllZCBpbiBkZXIgWndlcmdlbnN0YWR0CisgICAgIG9kZXIgYmVpbSBEb3Jmc2NocmVpYmVyIGltIEVsZmVuZG9yZiBlcmhhbHRlbi4gIERpZXNlIE1hcmtpZXJ1bmcga2FubgorICAgICBtYW4gYXVjaCB2b3IgYW5kZXJlbiBTcGllbGVybiB2ZXJiZXJnZW4uCisKKyBTSUVIRSBBVUNIOgorICAgICB6d2VpdGllbWFya2llcnVuZywgcmVnZWxuCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgICA1LiBNYWkgMjAwNCBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL2hpbGZlLm1hZ2llciBiL2RvYy9oaWxmZS5tYWdpZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJlODhkNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9oaWxmZS5tYWdpZXIKQEAgLTAsMCArMSwzNiBAQAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLU1BR0lFUkhJTEZTU0VJVEUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQWxzIE1hZ2llciBoYXQgbWFuIG5lYmVuIGRlbiBTcGllbGVyLSB1bmQgU2VoZXJiZWZlaGxlbiBlaW5pZ2Ugd2VpdGVyZQorQmVmZWhsZSB6dXIgVmVyZnVlZ3VuZy4gQmVpIGRlciBBbnplaWdlIGRlciBIaWxmZXNlaXRlbiB3aXJkIG5pY2h0IHp3aXNjaGVuCitkZW4gU3R1ZmVuIGRlciBNYWdpZXIgdW50ZXJzY2hpZWRlbiB3aXJkLiBEaWVzZSB3aXJkIGFiZXIgYmVpIEVybGFldXRlcnVuZworYmVydWVja3NpY2h0aWd0OgorCitBbGxnZW1laW5lIFRoZW1lbiB1bmQgUkVHRUxOOgkgICAgfCAgS29tbXVuaWthdGlvbjoKKyAgICBiYWxhbmNlLCBmb3JzY2hlcnB1bmt0ZSwJICAgIHwgICAgICBlY2hvYWxsLCBlY2hvdG8sIGVjaG8sIG1lY2hvLAorICAgIHRlc3RzcGllbGVyLCB6d2VpdHNwaWVsZXIsCSAgICB8ICAgICAgbXJ1ZmUsIG9yb3BheCwgcmVtb3RlCisgICAgZWZmaXppZW56LCBvYmpla3RlCQkgICAgfAorCQkJCSAgICB8CitCZXdlZ3VuZzoJCQkgICAgfCAgS2FtcGY6CisgICAgZ290bywgdHJhbnMsIGhvbWUsIHZlcmZvbGdlLCAgICB8ICAgICAgemFwLCBmcmllZGVuLCBzZXRoYW5kcworICAgIGF0LCBpbiwgKwkJCSAgICB8CisJCQkJICAgIHwKK0RhdGVpc3lzdGVtOgkJCSAgICB8ICBPYmpla3RlOgorICAgIGNkLCBwd2QsIGxzLCBjYXQsIGhlYWQsIHRhaWwsICAgfCAgICAgIGNsb25lLCBkZXN0cnVjdCwgdXBkKGF0ZSksIGxvYWQsCisgICAgbW9yZSwgZ3JlcCwgY3AsIG12LCBybSwgbWtkaXIsICB8CSAgIHNldGNtc2csIHNldGRtc2cKKyAgICBybWRpciwgc2V0LCBwcm9tcHQsIGVkCSAgICB8CisJCQkJICAgIHwgIEFuZGVyZXM6CitJbmZvcm1hdGlvbjogICAgICAgICAgICAgICAgICAgICAgICB8ICAgICBoZWlsZSwgendpbmdlLCB0aXRlbCwgZXh0cmFsb29rLAorICAgIG1zY2hhdSwgcGVvcGxlLCBwd2hvLCBtYW4sICAgICAgfCAgICAgdHJhZW5rZSwgaW52aXMsIHZpcywgcHJvdGVjdCwgZG8KKyAgICBzbm9vcCwgc2FsbG93LCBzcGllbGVyLCBybWFuLCAgIHwgICAgIHNob3dwcmVzYXksIHBpbmcsIHRvZG8KKyAgICBsb2NhbGNtZAkJCSAgICB8CisJCQkJICAgIHwgIEVyem1hZ2llcmJlZmVobGU6CitSZWdpb25zbWFnaWVyYmVmZWhsZToJCSAgICB8ICAgICBhZGRtYXN0ZXIsIHJlbW92ZW1hc3RlciwgbWJhbmlzaCwKKyAgICByZWdpb25zbWFnaWVyLCBiYW5pc2gsIGV4ZWMgICAgIHwgICAgIHNodXRkb3duCisJCQkJICAgIHwKKworSW4gZGVuIFZlcnplaWNobmlzc2VuIHVudGVyIC9kb2MvIGZpbmRlc3QgZHUgd2VpdGVyZSBEb2t1bWVudGF0aW9uOgorLSBmdW5rdGlvbmllcmVuZGUgQmVpc3BpZWxlIHVudGVyIC9kb2MvYmVpc3BpZWxlLworLSBNRy1zcGV6aWZpc2NoZSBJbmZvcm1hdGlvbmVuIHVudGVyIC9kb2MvTUcvCistIGVpbmVuIFByb2dyYW1taWVya3VycyB1bnRlciAvZG9jL0tVUlMvCisKZGlmZiAtLWdpdCBhL2RvYy9oaWxmZS5zZWhlciBiL2RvYy9oaWxmZS5zZWhlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjgxOTc4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2hpbGZlLnNlaGVyCkBAIC0wLDAgKzEsMjIgQEAKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tU0VIRVJISUxGU1NFSVRFLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FscyBTZWhlciBoYXQgbWFuIGVpbmlnZSB6dXNhZXR6bGljaGUgQmVmZWhsZS4gWnUgZGVuIGZvbGdlbmRlbiBCZWZlaGxlbgora2FubiBtYW4gbWl0ICJoaWxmZSA8dGhlbWE+IiBlaW5lIEVybGFldXRlcnVuZyBlcmhhbHRlbi4KKworS29tbXVuaWthdGlvbjoJCQkgICAgfCAgS2FtcGYKKyAgICByZW1vdGUsCQkJICAgIHwgICAgICBmbHVjaHRyaWNodHVuZywgc2V0aGFuZHMsIHJldmlldworICAgIGVjaG8gKG5hY2ggQXJjaGl0ZWt0ZW5xdWVzdCkgICAgfAorCQkJCSAgICB8CitCZXdlZ3VuZ3NtZWxkdW5nZW46CQkgICAgfCAgQXVzc2VoZW46CisgICAgc2V0bWluLCBzZXRtb3V0LCBzZXRtbWluLAkgICAgfCAgICAgIHRpdGVsLCBleHRyYWxvb2ssIHByZXNheQorICAgIHNldG1tb3V0LCByZXZpZXcJCSAgICB8CisKK0hhdXNiYXU6CisgICAgaGF1c2JhdSwgaW5zdGFudGhhdXMsIHNlaGVyaGF1cywKKyAgICBhZW5kZXJlLCBhdXNnYW5nLCBiZXNjaHJlaWJlLCBlcmxhdWJlLCBrb3BpZXJlLCBsaWNodCwgbG9lc2NoZSwKKyAgICBtZWxkdW5nZW4sIG5vdGl6LCBzY2hpZWJlLCBzcGVycmUsIHNwaW9uLCB1ZWJlcnNpY2h0LCB2ZXJiaWV0ZSwgd2VyZmUKKworQW5kZXJlczoKKyAgICBmZWhsZXJtZWxkdW5nLCByZXZpZXcKKwpkaWZmIC0tZ2l0IGEvZG9jL2hpbGZlLnNwaWVsZXIgYi9kb2MvaGlsZmUuc3BpZWxlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjA3MmY4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2hpbGZlLnNwaWVsZXIKQEAgLTAsMCArMSw2MiBAQAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVNQSUVMRVJISUxGU1NFSVRFLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRnVlciBmb2xnZW5kZSBhbGxnZW1laW5lIEJlZmVobGUgdW5kIFRoZW1lbiBrYW5uIG1pdCAiaGlsZmUgPHRoZW1hPiIgZWluZQorRXJsYWV1dGVydW5nIGFuZ2V6ZWlndCB3ZXJkZW46CisKK0VpbmZ1ZWhydW5nIHVuZCBlcnN0ZSBTY2hyaXR0ZToKKyAgICBHcnVuZGxlZ2VuZDogCisgICAgICBzeW50YXgsIGJld2VndW5nLCByZWdlbG4sIGVpbmZ1ZWhydW5nCisgICAgQ2hhcmFrdGVyOgorICAgICAgYXR0cmlidXRlLCB6YXViZXJ0cmFlbmtlLCBzdHVmZW4sIHN0dWZlbnB1bmt0ZQorICAgIFNwaWVsOiAgIAorICAgICAgYWJlbnRldWVyLCBnaWxkZW4sIHphdWJlcmVpCisgICAgTmV1c3BpZWxlcjogIAorICAgICAgY2ljZXJvbmVzLCB0dXRvcmlhbAorCitLb21tdW5pa2F0aW9uOgorICAgIEltIFJhdW06CQorICAgICAgc2FnZSwgZ2VzcHJhZWNoLCBmcmFnZSwgYW50d29ydGUKKyAgICBQcml2YXQ6CQorICAgICAgdGVpbGUgKG1pdCksIGVyemFlaGxlLCBlcndpZGVyZSwgZmx1ZXN0ZXJlLAorICAgIE1VRC13ZWl0OgkKKyAgICAgIHJ1ZmUsIGViZW5lbiwgcG9zdCwgbXJ1ZmUKKyAgICBBbmRlcmVzOgkKKyAgICAgIGlnbm9yaWVyZSwga29ib2xkLCB3ZWcsIHBhcnRpZXMsIHNlbmRlcndpZWRlcmhvbHVuZywga2xpbmdlbHRvbgorICAgICAgdGVhbXNwZWFrCisKK0FsbGdlbWVpbmUgQWt0aW9uZW46CisgICAgZ2liIChhbiksIGhvbGUgKGF1cyksIG5pbW0gW2F1c10sIHN0ZWNrZSAoaW4pLCB3aXJmICh3ZWcpLAorICAgIGJlaGFsdGUsIGtsZXR0ZXJlLCByZWlzZQorCitJbnRlcmFrdGlvbiB1bmQgSW5mb3JtYXRpb246CisgICAgc2NoYXUgKGFuKSwgdW50ZXJzdWNoZSwgbGF1c2NoZSwgcmllY2hlLCBzdWNoZSwgaSAoPWludmVudHVyKSwKKyAgICBhdXNydWVzdHVuZywgaW5mbywga3VyemluZm8sIHRhc3RlCisgICAgaW5mb3JtLCBlcndhcnRlLCB3ZXIsIGt3ZXIsIGtrd2VyLCBtdWRzLCB6ZWl0LCBmaW5nZXIsIGlkbGV6ZWl0CisgICAgZW1haWwsIHVybCwgb3J0LCBpY3EsIHdlZ21lbGR1bmcKKworU29uc3RpZ2UgVmVyYmVuOgorICAgIHZlcmJlbiAobWl0IGVpZ2VuZXIgSGlsZmVmdW5rdGlvbiksIGFkdmVyYiwgZW1vdGUsIHJrbnVkZGxlLCByd2lua2UKKworRWluZ2FiZW4gdW5kIEVyc2V0enVuZ2VuOgorICAgIGFsaWFzLCB1bmFsaWFzLCBlcnNldHp1bmdzYW56ZWlnZSwgaGlzdG9yeQorCitLYW1wZjoKKyAgICB0b2V0ZSwgc3RvcCwgdm9yc2ljaHQsIHp1ZWNrZSwgemllaGUgKGhlcnZvci9hdXMpLCB0cmFnZSwKKyAgICBzdGVja2UgKHdlZy96dXJ1ZWNrKSwgaGVpbHVuZywgc3RlcmJlbiwgc3BydWNoZXJtdWVkdW5nCisgICAgdGVhbSwgd2FmZmVuZmVydGlna2VpdGVuLCBnaWZ0L2tyYW5raGVpdGVuL2ZsdWVjaGUKKworR2lsZGVudWViZXJzaWNodDoKKyAgICBhYmVudGV1cmVyLCBiaWVyc2NodWV0dGxlciwgY2hhb3MsIGR1bmtlbGVsZmVuLCBrYWVtcGZlciwga2FyYXRlLAorICAgIGtsZXJ1cywgdGFuamlhbiwgdXJ1ay1oYWksIHdlcndvZWxmZSwgemF1YmVyZXIKKworQW5kZXJlIEJlZmVobGU6CisgICAgZW5kZSwgc2NobGFmZSAoZWluKSwgc3BlaWNoZXJuLCBsYW5nLCBrdXJ6LCB1bHRyYWt1cnosIGF1c2dhZW5nZSwKKyAgICBwYXNzd29ydCwgZmVobGVyLCBpZGVlLCB0eXBvLCB6ZWlsZW4sIHNlbGJzdGxvZXNjaHVuZywgc3BpZWxkYXVlciwKKyAgICBzcGllbHBhdXNlLCB1aHJtZWxkdW5nLCB6d2VpdGllbWFya2llcnVuZywgdGVsbmVncywgc3R0eSwgZ3JhZmlrLCAKKyAgICB0ZWxuZXQKKworU29uc3RpZ2UgVGhlbWVuOgorICAgIHZlcmVpbiwga29uemVwdCwgc2VoZXIsIG1hZ2llciwgcmVnaW9uZW4sIGVkaXRvciwgYnVlY2hlciwgZmFxLAorICAgIGJhbGFuY2UsIG11ZHJlY2huZXIsIGVpbmZ1ZWhydW5nLCBzcGllbGUKKwpkaWZmIC0tZ2l0IGEvZG9jL2hvb2svYXV0b19pbmNsdWRlIGIvZG9jL2hvb2svYXV0b19pbmNsdWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MmFkZGEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaG9vay9hdXRvX2luY2x1ZGUKQEAgLTAsMCArMSwzNyBAQAorU1lOT1BTSVMKKyAgICAgICAgI2luY2x1ZGUgPHN5cy9kcml2ZXJfaG9va3MuaD4KKworICAgICAgICBzZXRfZHJpdmVyX2hvb2soSF9BVVRPX0lOQ0xVREUsIHZhbHVlKQorCisgICAgICAgIDx2YWx1ZT4gYmVpbmc6CisKKyAgICAgICAgICBzdHJpbmcgPHRleHQ+CisgICAgICAgICAgc3RyaW5nIDxjbG9zdXJlPihzdHJpbmcgYmFzZV9maWxlLCBzdHJpbmcgY3VycmVudF9maWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICwgaW50IHN5c19pbmNsdWRlKQorCitERVNDUklQVElPTgorICAgICAgICBPcHRpb25hbCBob29rIHNwZWNpZnlpbmcgYSBzdHJpbmcgdG8gYmUgaW5jbHVkZWQgYmVmb3JlCisgICAgICAgIHRoZSBzb3VyY2Ugb2YgZXZlcnkgY29tcGlsZWQgTFBDIG9iamVjdC4KKyAgICAgICAgSG9vayBzZXR0aW5nIGNhbiBiZSBhIHN0cmluZyBvciBhIGNsb3N1cmUuCisKKyAgICAgICAgSWYgdGhlIHNldHRpbmcgaXMgYSBzdHJpbmcsIGl0IHdpbGwgYmUgYXV0b21hdGljYWxseSBpbmNsdWRlZCBiZWZvcmUKKyAgICAgICAgdGhlIHNvdXJjZSBvZiBldmVyeSBjb21waWxlZCBMUEMgb2JqZWN0LgorCisgICAgICAgIElmIHRoZSBzZXR0aW5nIGlzIGEgY2xvc3VyZSwgaXQgaXMgY2FsbGVkIGZvciBldmVyeSBmaWxlCisgICAgICAgIG9wZW5lZCBieSB0aGUgY29tcGlsZXIuIDxiYXNlX2ZpbGU+IHdpbGwgYmUgdGhlIGZpbGVuYW1lIG9mCisgICAgICAgIHRoZSBjb21waWxlZCBvYmplY3QsIDxjdXJyZW50X2ZpbGU+IHRoZSBuYW1lIG9mIGEgZmlsZQorICAgICAgICBpbmNsdWRlZCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGJ5IHRoZSA8YmFzZV9maWxlPi4gV2hlbiB0aGUKKyAgICAgICAgPGJhc2VfZmlsZT4gaXRzZWxmIGlzIG9wZW5lZCwgPGN1cnJlbnRfZmlsZT4gd2lsbCBiZSAwLiBGb3IgYW4KKyAgICAgICAgaW5jbHVkZWQgZmlsZSwgPHN5c19pbmNsdWRlPiB3aWxsIGJlIFRSVUUgaWYgaXQgaXMgYSA8Pi10eXBlCisgICAgICAgIGluY2x1ZGUuCisKKyAgICAgICAgSWYgdGhlIHJlc3VsdCBmcm9tIHRoZSBjYWxsIGlzIGEgc3RyaW5nLCBpdCB3aWxsIGJlIGluY2x1ZGVkCisgICAgICAgIGJlZm9yZSB0aGUgYWN0dWFsIHRleHQgb2YgdGhlIGZpbGUuCisKKyAgICAgICAgSW4gYm90aCBjYXNlcywgdGhlIHN0cmluZyB3aWxsIGJlIGluY2x1ZGVkIGFzLWlzOyBpbgorICAgICAgICBwYXJ0aWN1bGFyIG5vIHRlcm1pbmF0aW5nICdcbicgd2lsbCBiZSBhZGRlZC4KKworSElTVE9SWQorCitTRUUgQUxTTworICAgICAgICBob29rcyhDKSwgaW5jbHVkZV9kaXJzKEgpCmRpZmYgLS1naXQgYS9kb2MvaG9vay9jbGVhbl91cCBiL2RvYy9ob29rL2NsZWFuX3VwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMDUyMWEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaG9vay9jbGVhbl91cApAQCAtMCwwICsxLDQ1IEBACitTWU5PUFNJUworICAgICAgICAjaW5jbHVkZSA8c3lzL2RyaXZlcl9ob29rcy5oPgorCisgICAgICAgIHNldF9kcml2ZXJfaG9vayhIX0NMRUFOX1VQLCB2YWx1ZSkKKworICAgICAgICA8dmFsdWU+IGJlaW5nOgorCisgICAgICAgICAgaW50IDxjbG9zdXJlPihpbnQgcmVmLCBvYmplY3Qgb2IpCisgICAgICAgICAgdm9pZHxpbnQgPG5hbWU+KGludCByZWYpCisKK0RFU0NSSVBUSU9OCisgICAgICAgIE9wdGlvbmFsIGhvb2sgdG8gY2xlYW4gdXAgYW4gb2JqZWN0LgorICAgICAgICBIb29rIHNldHRpbmcgY2FuIGJlIGFueSBjbG9zdXJlLCBvciB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24KKyAgICAgICAgdG8gY2FsbCBpbiB0aGUgb2JqZWN0LgorCisgICAgICAgIFRoaXMgaG9vayBpcyBjYWxsZWQgZm9yIGFuIG9iamVjdCBpZiBpdCBoYXNuJ3QgYmVlbiB1c2VkCisgICAgICAgIGZvciBhdCBsZWFzdCBUSU1FX1RPX0NMRUFOX1VQIHNlY29uZHMsIHRvIGdpdmUgaXQgdGhlCisgICAgICAgIG9wcG9ydHVuaXR5IHRvIHNlbGYgZGVzdHJ1Y3QuCisKKyAgICAgICAgSWYgdGhlIGhvb2sgaXMgYSBjbG9zdXJlLCBpdCBpcyBjYWxsZWQgd2l0aCB0aGUgcmVmY291bnQgb2YKKyAgICAgICAgdGhlIG9iamVjdCB0byBjbGVhbiB1cCBhcyBmaXJzdCBhcmd1bWVudCwgYW5kIHdpdGggdGhlIG9iamVjdAorICAgICAgICBpdHNlbGYgYXMgc2Vjb25kLiBMYW1iZGEgY2xvc3VyZXMgYXJlIGFsc28gYm91bmQgdG8gdGhlIG9iamVjdAorICAgICAgICBwcmlvciB0byB0aGUgY2FsbC4KKworICAgICAgICBJZiB0aGUgaG9vayBpcyB0aGUgbmFtZSBvZiBhbiBsZnVuLCBpdCBpcyBjYWxsZWQgaW4gdGhlCisgICAgICAgIG9iamVjdCB3aXRoIGl0cyByZWZjb3VudCBhcyBhcmd1bWVudC4KKworICAgICAgICBJbiBib3RoIGNhbGxzLCB0aGUgcmVmY291bnQgaXMgY29uc3RydWN0ZWQgYXM6CisKKyAgICAgICAgICByZWYgPSAwOiB0aGUgb2JqZWN0IGlzIGEgY2xvbmUsIG9yIGEgYmx1ZXByaW50IHdpdGgKKyAgICAgICAgICAgICAgICAgICByZXBsYWNlZCBwcm9ncmFtLgorICAgICAgICAgIHJlZiA9IDE6IHRoZSBvYmplY3QgaXMgYSBzd2FwcGVkIG9yIHVudXNlZCBibHVlcHJpbnQuCisgICAgICAgICAgcmVmID4gMTogdGhlIG9iamVjdCBpcyBhIHVzZWQgYmx1ZXByaW50IHdpdGggPHJlZj4gcmVmZXJlbmNlcy4KKworICAgICAgICBUaGUgY2xlYW51cCBtZXRob2QgaGFzIHRoZSBwb3NzaWJpbGl0eSB0byBkZXN0cnVjdCB0aGUKKyAgICAgICAgb2JqZWN0LiBUbyBzdXJ2aXZlIHRoaXMgdGltZSwgYnV0IHRyeSBhZ2FpbiBzb21lIHRpbWUgbGF0ZXIsCisgICAgICAgIHRoZSBjYWxsIGhhcyB0byByZXN1bHQgaW4gYSBub24temVybyB2YWx1ZS4KKworICAgICAgICBJZiB0aGUgaG9vayBzcGVjaWZpZXMgYSBub24tZXhpc3RpbmcgbGZ1biwgb3IgaWYgdGhlIGNhbGwKKyAgICAgICAgcmV0dXJucyAwLCBubyBmdXJ0aGVyIGF0dGVtcHQgdG8gY2xlYW4gdXAgdGhpcyBvYmplY3Qgd2lsbCBiZSBkb25lLgorCitISVNUT1JZCisKK1NFRSBBTFNPCisgICAgICAgIGhvb2tzKEMpCmRpZmYgLS1naXQgYS9kb2MvaG9vay9jbG9uZV91aWRzIGIvZG9jL2hvb2svY2xvbmVfdWlkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmY5MDJhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2hvb2svY2xvbmVfdWlkcwpAQCAtMCwwICsxLDM2IEBACitTWU5PUFNJUworICAgICAgICAjaW5jbHVkZSA8c3lzL2RyaXZlcl9ob29rcy5oPgorCisgICAgICAgIHNldF9kcml2ZXJfaG9vayhIX0NMT05FX1VJRFMsIHZhbHVlKQorCisgICAgICAgIDx2YWx1ZT4gYmVpbmc6CisKKyAgICAgICAgICBtaXhlZCA8Y2xvc3VyZT4ob2JqZWN0IGJsdWVwcmludCwgc3RyaW5nIG9iamVjdG5hbWUpCisKK0RFU0NSSVBUSU9OCisgICAgICAgIE1hbmRhdG9yeSBob29rcyB0byBkZXRlcm1pbmUgdGhlIHVpZCBhbmQgZXVpZCBvZiBjbG9uZWQKKyAgICAgICAgb2JqZWN0cy4gIEhvb2sgc2V0dGluZ3MgY2FuIGJlIGFueSBjbG9zdXJlLgorCisgICAgICAgIFdoZW4gYW4gb2JqZWN0IGlzIGNsb25lZCwgdGhlIEhfQ0xPTkVfVUlEUyBob29rIGlzIGNhbGxlZCB3aXRoCisgICAgICAgIHRoZSBibHVlcHJpbnQgb2JqZWN0IGFzIGZpcnN0IGFuZCB0aGUgY2xvbmUncyBkZXNpZ25hdGVkIG5hbWUKKyAgICAgICAgYXMgc2Vjb25kIGFyZ3VtZW50LiBUaGUgbmV3IG9iamVjdCBhbHJlYWR5IGV4aXN0cywgYnV0IGhhcyAwCisgICAgICAgIHVpZHMuCisKKyAgICAgICAgRm9yIHRoZSByZXN1bHQsIHRoZSBmb2xsb3dpbmcgcG9zc2liaWxpdGllcyBleGlzdCAoPG51bT4gaXMKKyAgICAgICAgYSBub24temVybyBudW1iZXIsIDxuby1zdHJpbmc+IGlzIGFueXRoaW5nIGJ1dCBhIHN0cmluZyk6CisKKyAgICAgICAgICAgIjx1aWQ+IiAgICAgICAgICAgICAgICAgICAgLT4gdWlkID0gIjx1aWQ+IiwgZXVpZCA9ICI8dWlkPiIKKyAgICAgICAgICAgKHsgIjx1aWQ+IiwgIjxldWlkPiIgfSkgICAgLT4gdWlkID0gIjx1aWQ+IiwgZXVpZCA9ICI8ZXVpZD4iCisgICAgICAgICAgICh7ICI8dWlkPiIsIDxuby1zdHJpbmc+IH0pIC0+IHVpZCA9ICI8dWlkPiIsIGV1aWQgPSAwCisKKyAgICAgICAgSWYgc3RyaWN0LWV1aWRzIGlzIG5vdCBhY3RpdmUsIHRoZSBmb2xsb3dpbmcgcmVzdWx0cyBhcmUKKyAgICAgICAgcG9zc2libGUsIHRvbzoKKworICAgICAgICAgICA8bnVtPiAgICAgICAgICAgICAgICAgICAgICAtPiB1aWQgPSAwLCBldWlkID0gMAorICAgICAgICAgICAoeyA8bnVtPiwgIjxldWlkPiIgfSkgICAgICAtPiB1aWQgPSAwLCBldWlkID0gIjxldWlkPiIKKyAgICAgICAgICAgKHsgPG51bT4sIDxuby1zdHJpbmc+IH0pICAgLT4gdWlkID0gMCwgZXVpZCA9IDAKKworSElTVE9SWQorCitTRUUgQUxTTworICAgICAgICBob29rcyhDKSwgdWlkcyhDKSwgbG9hZF91aWRzKEgpCmRpZmYgLS1naXQgYS9kb2MvaG9vay9jb21tYW5kIGIvZG9jL2hvb2svY29tbWFuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTFiNjA5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2hvb2svY29tbWFuZApAQCAtMCwwICsxLDMzIEBACitTWU5PUFNJUworICAgICAgICAjaW5jbHVkZSA8c3lzL2RyaXZlcl9ob29rcy5oPgorCisgICAgICAgIHNldF9kcml2ZXJfaG9vayhIX0NPTU1BTkQsIHZhbHVlKQorCisgICAgICAgIDx2YWx1ZT4gYmVpbmc6CisKKyAgICAgICAgICBpbnQgPGNsb3N1cmU+KHN0cmluZyBjb21tYW5kLCBvYmplY3QgY29tbWFuZF9naXZlcikKKyAgICAgICAgICBpbnQgPG5hbWU+KHN0cmluZyBjb21tYW5kLCBvYmplY3QgY29tbWFuZF9naXZlcikKKworREVTQ1JJUFRJT04KKyAgICAgICAgT3B0aW9uYWwgaG9vayB0byBwYXJzZSBhbmQgZXhlY3V0ZSBjb21tYW5kcy4gSWYgdGhpcyBob29rIGlzCisgICAgICAgIHVzZWQsIGl0IGJ5cGFzc2VzIHRoZSBub3JtYWwgY29tbWFuZCBwYXJzaW5nIGRvbmUgYnkgdGhlCisgICAgICAgIGRyaXZlciAoaW5jbHVkaW5nIHRoZSBNT0RJRllfQ09NTUFORCBhbmQgTk9USUZZX0ZBSUwgaG9va3MpLgorCisgICAgICAgIFRoZSBob29rIGlzIGNhbGxlZCB3aXRoIHR3byBwYXJhbWV0ZXJzOiB0aGUgY29tbWFuZCByZWNlaXZlZAorICAgICAgICBmcm9tIHRoZSBsaXZpbmcgKGludGVyYWN0aXZlIHVzZXIgb3IgTlBDKSwgYW5kIHRoZSBsaXZpbmcKKyAgICAgICAgb2JqZWN0ICh0aGUgJ2NvbW1hbmQgZ2l2ZXInKSBpdHNlbGYuIFRoZSBob29rIGhhcyB0byByZXR1cm4KKyAgICAgICAgbm9uLTAgaWYgdGhlIGNvbW1hbmQgd2FzIGZvdW5kIGFuZCBleGVjdXRlZCwgYW5kIDAgb3RoZXJ3aXNlLgorCisgICAgICAgIEF0IHRoZSB0aW1lIHRoZSBob29rIGlzIGNhbGxlZCwgcXVlcnlfY29tbWFuZCgpIHJldHVybnMgdGhlCisgICAgICAgIGNvbW1hbmQgc3RyaW5nIGFuZCB0aGlzX3BsYXllcigpIHJldHVybnMgdGhlIGxpdmluZyBvYmplY3QuCisgICAgICAgIHF1ZXJ5X3ZlcmIoKSBhbmQgcXVlcnlfbm90aWZ5X2ZhaWwoKSByZXR1cm4gMC4KKworICAgICAgICBJZiB0aGUgaG9vayBpcyBhIHN0cmluZywgaXQgaXMgdGhlIG5hbWUgb2YgYW4gbGZ1biBpbiB0aGUKKyAgICAgICAgY29tbWFuZCBnaXZlcjsgaWYgdGhlIGhvb2sgaXMgYSBsYW1iZGEgY2xvc3VyZSwgaXQgaXMgYm91bmQgdG8KKyAgICAgICAgdGhlIGNvbW1hbmQgZ2l2ZXIgYmVmb3JlIHRoZSBjYWxsLgorCitISVNUT1JZCisKK1NFRSBBTFNPCisgICAgICAgIGhvb2tzKEMpLCBtb2RpZnlfY29tbWFuZChIKSwgbW9kaWZ5X2NvbW1hbmRfZm5hbWUoSCksIG5vdGlmeV9mYWlsKEgpLAorICAgICAgICBzZW5kX25vdGlmeV9mYWlsKEgpCmRpZmYgLS1naXQgYS9kb2MvaG9vay9jcmVhdGVfY2xvbmUgYi9kb2MvaG9vay9jcmVhdGVfY2xvbmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYzMTAwZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9ob29rL2NyZWF0ZV9jbG9uZQpAQCAtMCwwICsxLDM0IEBACitTWU5PUFNJUworICAgICAgICAjaW5jbHVkZSA8c3lzL2RyaXZlcl9ob29rcy5oPgorCisgICAgICAgIHNldF9kcml2ZXJfaG9vayhIX0NSRUFURV9DTE9ORSwgdmFsdWUpCisKKyAgICAgICAgPHZhbHVlPiBiZWluZzoKKworICAgICAgICAgIHZvaWQgPG5hbWU+ICgwKQorICAgICAgICAgIGludCA8Y2xvc3VyZT4gKCB2b2lkICkKKyAgICAgICAgICBpbnQgPGNsb3N1cmU+IChvYmplY3Qgb2JqX3RvX2luaXQpCisKK0RFU0NSSVBUSU9OCisgICAgICAgIE9wdGlvbmFsIGhvb2tzIHRvIGluaXRpYWxpemUgYSBjbG9uZWQgb2JqZWN0IGFmdGVyIGNyZWF0aW9uLgorICAgICAgICBIb29rIHNldHRpbmcgY2FuIGJlIHVuYm91bmQgbGFtYmRhIGNsb3N1cmVzLCBvciB0aGUgbmFtZSBvZgorICAgICAgICB0aGUgZnVuY3Rpb24gKHN0YXRpYyBvciBwdWJsaWMpIHRvIGNhbGwgaW4gdGhlIG9iamVjdC4KKworICAgICAgICBJZiB0aGUgaG9vayBpcyBhIGNsb3N1cmUgZXhwZWN0aW5nIGFuIGFyZ3VtZW50LCBpdCBpcyBib3VuZAorICAgICAgICB0byB0aGUgY3VycmVudCBvYmplY3QgYW5kIGNhbGxlZCB3aXRoIHRoZSBjcmVhdGVkIG9iamVjdCBhcworICAgICAgICBhcmd1bWVudC4gSWYgdGhlIGhvb2sgYXMgYSBjbG9zdXJlIHdpdGhvdXQgYXJndW1lbnRzLCBpdCBpcyBib3VuZCB0bworICAgICAgICB0aGUgb2JqZWN0IHRvIGJlIGluaXRhbGl6ZWQgYW5kIGNhbGxlZC4KKworICAgICAgICBJZiB0aGUgcmVzdWx0IG9mIHRoZSBjbG9zdXJlIGNhbGwgaXMgYSBub24temVybyBudW1iZXIsIGl0IGlzIHVzZWQKKyAgICAgICAgYXMgdGhlIGludGVydmFsIHRvIHdhaXQgYmVmb3JlIHRoZSBmaXJzdCByZXNldCgpLCBlbHNlIHRoZSBkZWZhdWx0CisgICAgICAgIGludGVydmFsIGNvbXB1dGVkIGZyb20gVElNRV9UT19SRVNFVCBpcyB1c2VkLgorCisgICAgICAgIElmIHRoZSBob29rIGlzIGRlZmluZWQgYXMgdGhlIG5hbWUgb2YgYW4gbGZ1biBpbiB0aGUgb2JqZWN0LAorICAgICAgICBpdCBpcyBjYWxsZWQgaW4gdGhlIG9iamVjdCB3aXRoIDAgYXMgYXJndW1lbnQsIGFuZCBhbnkgcmVzdWx0CisgICAgICAgIGlzIGlnbm9yZWQuCisKK0hJU1RPUlkKKyAgICAgICAgTERNdWQgMy4yLjEwIGFsbG93ZWQgc3RhdGljIGZ1bmN0aW9ucyB0byBiZSBnaXZlbiBieSBuYW1lLgorCitTRUUgQUxTTworICAgICAgICBob29rcyhDKSwgY3JlYXRlX29iKEgpLCBjcmVhdGVfc3VwZXIoSCkKZGlmZiAtLWdpdCBhL2RvYy9ob29rL2NyZWF0ZV9vYiBiL2RvYy9ob29rL2NyZWF0ZV9vYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGU3YmEzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2hvb2svY3JlYXRlX29iCkBAIC0wLDAgKzEsMzUgQEAKK1NZTk9QU0lTCisgICAgICAgICNpbmNsdWRlIDxzeXMvZHJpdmVyX2hvb2tzLmg+CisKKyAgICAgICAgc2V0X2RyaXZlcl9ob29rKEhfQ1JFQVRFX09CLCB2YWx1ZSkKKworICAgICAgICA8dmFsdWU+IGJlaW5nOgorCisgICAgICAgICAgdm9pZCA8bmFtZT4gKDApCisgICAgICAgICAgaW50IDxjbG9zdXJlPiAoIHZvaWQgKQorICAgICAgICAgIGludCA8Y2xvc3VyZT4gKG9iamVjdCBvYmpfdG9faW5pdCkKKworREVTQ1JJUFRJT04KKyAgICAgICAgT3B0aW9uYWwgaG9va3MgdG8gaW5pdGlhbGl6ZSBhbiBleHBsaWN0ZWx5IGxvYWRlZAorICAgICAgICBvYmplY3QvYmx1ZXByaW50IGFmdGVyIGNyZWF0aW9uLiAgSG9vayBzZXR0aW5nIGNhbiBiZSB1bmJvdW5kCisgICAgICAgIGxhbWJkYSBjbG9zdXJlcywgb3IgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIChzdGF0aWMgb3IgcHVibGljKSB0bworICAgICAgICBjYWxsIGluIHRoZSBvYmplY3QuCisKKyAgICAgICAgSWYgdGhlIGhvb2sgaXMgYSBjbG9zdXJlIGV4cGVjdGluZyBhbiBhcmd1bWVudCwgaXQgaXMgYm91bmQKKyAgICAgICAgdG8gdGhlIGN1cnJlbnQgb2JqZWN0IGFuZCBjYWxsZWQgd2l0aCB0aGUgY3JlYXRlZCBvYmplY3QgYXMKKyAgICAgICAgYXJndW1lbnQuIElmIHRoZSBob29rIGFzIGEgY2xvc3VyZSB3aXRob3V0IGFyZ3VtZW50cywgaXQgaXMgYm91bmQgdG8KKyAgICAgICAgdGhlIG9iamVjdCB0byBiZSBpbml0YWxpemVkIGFuZCBjYWxsZWQuCisKKyAgICAgICAgSWYgdGhlIHJlc3VsdCBvZiB0aGUgY2xvc3VyZSBjYWxsIGlzIGEgbm9uLXplcm8gbnVtYmVyLCBpdCBpcyB1c2VkCisgICAgICAgIGFzIHRoZSBpbnRlcnZhbCB0byB3YWl0IGJlZm9yZSB0aGUgZmlyc3QgcmVzZXQoKSwgZWxzZSB0aGUgZGVmYXVsdAorICAgICAgICBpbnRlcnZhbCBjb21wdXRlZCBmcm9tIFRJTUVfVE9fUkVTRVQgaXMgdXNlZC4KKworICAgICAgICBJZiB0aGUgaG9vayBpcyBkZWZpbmVkIGFzIHRoZSBuYW1lIG9mIGFuIGxmdW4gaW4gdGhlIG9iamVjdCwKKyAgICAgICAgaXQgaXMgY2FsbGVkIGluIHRoZSBvYmplY3Qgd2l0aCAwIGFzIGFyZ3VtZW50LCBhbmQgYW55IHJlc3VsdAorICAgICAgICBpcyBpZ25vcmVkLgorCitISVNUT1JZCisgICAgICAgIExETXVkIDMuMi4xMCBhbGxvd2VkIHN0YXRpYyBmdW5jdGlvbnMgdG8gYmUgZ2l2ZW4gYnkgbmFtZS4KKworU0VFIEFMU08KKyAgICAgICAgaG9va3MoQyksIGNyZWF0ZV9zdXBlcihIKSwgY3JlYXRlX2Nsb25lKEgpCmRpZmYgLS1naXQgYS9kb2MvaG9vay9jcmVhdGVfc3VwZXIgYi9kb2MvaG9vay9jcmVhdGVfc3VwZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUwMjczMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9ob29rL2NyZWF0ZV9zdXBlcgpAQCAtMCwwICsxLDM1IEBACitTWU5PUFNJUworICAgICAgICAjaW5jbHVkZSA8c3lzL2RyaXZlcl9ob29rcy5oPgorCisgICAgICAgIHNldF9kcml2ZXJfaG9vayhIX0NSRUFURV9TVVBFUiwgdmFsdWUpCisKKyAgICAgICAgPHZhbHVlPiBiZWluZzoKKworICAgICAgICAgIHZvaWQgPG5hbWU+ICgwKQorICAgICAgICAgIGludCA8Y2xvc3VyZT4gKCB2b2lkICkKKyAgICAgICAgICBpbnQgPGNsb3N1cmU+IChvYmplY3Qgb2JqX3RvX2luaXQpCisKK0RFU0NSSVBUSU9OCisgICAgICAgIE9wdGlvbmFsIGhvb2tzIHRvIGluaXRpYWxpemUgYSBibHVlcHJpbnQgd2hpY2ggaXMgbG9hZGVkIGJ5CisgICAgICAgIGluaGVyaXRhbmNlIGFmdGVyIGNyZWF0aW9uLgorICAgICAgICBIb29rIHNldHRpbmcgY2FuIGJlIHVuYm91bmQgbGFtYmRhIGNsb3N1cmVzLCBvciB0aGUgbmFtZSBvZgorICAgICAgICB0aGUgZnVuY3Rpb24gKHN0YXRpYyBvciBwdWJsaWMpIHRvIGNhbGwgaW4gdGhlIG9iamVjdC4KKworICAgICAgICBJZiB0aGUgaG9vayBpcyBhIGNsb3N1cmUgZXhwZWN0aW5nIGFuIGFyZ3VtZW50LCBpdCBpcyBib3VuZAorICAgICAgICB0byB0aGUgY3VycmVudCBvYmplY3QgYW5kIGNhbGxlZCB3aXRoIHRoZSBjcmVhdGVkIG9iamVjdCBhcworICAgICAgICBhcmd1bWVudC4gSWYgdGhlIGhvb2sgYXMgYSBjbG9zdXJlIHdpdGhvdXQgYXJndW1lbnRzLCBpdCBpcyBib3VuZCB0bworICAgICAgICB0aGUgb2JqZWN0IHRvIGJlIGluaXRhbGl6ZWQgYW5kIGNhbGxlZC4KKworICAgICAgICBJZiB0aGUgcmVzdWx0IG9mIHRoZSBjbG9zdXJlIGNhbGwgaXMgYSBub24temVybyBudW1iZXIsIGl0IGlzIHVzZWQKKyAgICAgICAgYXMgdGhlIGludGVydmFsIHRvIHdhaXQgYmVmb3JlIHRoZSBmaXJzdCByZXNldCgpLCBlbHNlIHRoZSBkZWZhdWx0CisgICAgICAgIGludGVydmFsIGNvbXB1dGVkIGZyb20gVElNRV9UT19SRVNFVCBpcyB1c2VkLgorCisgICAgICAgIElmIHRoZSBob29rIGlzIGRlZmluZWQgYXMgdGhlIG5hbWUgb2YgYW4gbGZ1biBpbiB0aGUgb2JqZWN0LAorICAgICAgICBpdCBpcyBjYWxsZWQgaW4gdGhlIG9iamVjdCB3aXRoIDAgYXMgYXJndW1lbnQsIGFuZCBhbnkgcmVzdWx0CisgICAgICAgIGlzIGlnbm9yZWQuCisKK0hJU1RPUlkKKyAgICAgICAgTERNdWQgMy4yLjEwIGFsbG93ZWQgc3RhdGljIGZ1bmN0aW9ucyB0byBiZSBnaXZlbiBieSBuYW1lLgorCitTRUUgQUxTTworICAgICAgICBob29rcyhDKSwgY3JlYXRlX29iKEgpLCBjcmVhdGVfY2xvbmUoSCkKZGlmZiAtLWdpdCBhL2RvYy9ob29rL2RlZmF1bHRfbWV0aG9kIGIvZG9jL2hvb2svZGVmYXVsdF9tZXRob2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI3YTEzMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9ob29rL2RlZmF1bHRfbWV0aG9kCkBAIC0wLDAgKzEsNDQgQEAKK1NZTk9QU0lTCisgICAgICAgICNpbmNsdWRlIDxzeXMvZHJpdmVyX2hvb2tzLmg+CisKKyAgICAgICAgc2V0X2RyaXZlcl9ob29rKEhfREVGQVVMVF9NRVRIT0QsIHZhbHVlKQorCisgICAgICAgIDx2YWx1ZT4gYmVpbmc6CisKKyAgICAgICAgICBpbnQgPG5hbWU+KG1peGVkICYgcmVzdWx0LCBzdHJpbmcgZnVuLCB2YXJhcmdzIGFyZ3MpCisgICAgICAgICAgaW50IDxjbG9zdXJlPihtaXhlZCAmIHJlc3VsdCwgb2JqZWN0IG9iLCBzdHJpbmcgZnVuLCB2YXJhcmdzIGFyZ3MpCisKK0RFU0NSSVBUSU9OCisgICAgICAgIE9wdGlvbmFsIGhvb2sgdG8gcHJvdmlkZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciB1bnJlc29sdmVkCisgICAgICAgIGNhbGxzLiBIb29rIHNldHRpbmcgY2FuIGJlIGFueSBjbG9zdXJlLCBvciB0aGUgbmFtZSBvZiB0aGUKKyAgICAgICAgZnVuY3Rpb24gdG8gY2FsbCBpbiB0aGUgb2JqZWN0LgorCisgICAgICAgIFRoaXMgaG9vayBpcyBjYWxsZWQgd2hlbmV2ZXIgYSBjYWxsX290aGVyKCksIGNhbGxfcmVzb2x2ZWQoKQorICAgICAgICBvciBjYWxsX291dCgpIG9uIG5hbWVkIGZ1bmN0aW9uIChhcyBvcHBvc2VkIHRvIGEgY2xvc3VyZSkKKyAgICAgICAgY291bGRuJ3QgYmUgcmVzb2x2ZWQuIFRoZSBob29rIGhhcyB0aGVuIHRoZSBvcHBvcnR1bml0eSB0bworICAgICAgICBwcm92aWRlIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4KKworICAgICAgICBFeGVtcHQgZnJvbSB0aGlzIGJlaGF2aW91ciBhcmUgY2FsbHMgdG8gdGhlIG1hc3RlciBvYmplY3QsIHRvCisgICAgICAgIHNpbXVsLWVmdW5zLCBhbmQgY2FsbHMgZG9uZSB3aXRoIGNhbGxfZGlyZWN0KCkgYW5kCisgICAgICAgIGNhbGxfZGlyZWN0X3Jlc29sdmVkKCkuCisKKyAgICAgICAgSWYgdGhlIGhvb2sgaXMgdGhlIG5hbWUgb2YgYW4gbGZ1biwgaXQgaXMgY2FsbGVkIGluIHRoZSB0YXJnZXQKKyAgICAgICAgb2JqZWN0OyBvdGhlcndpc2UgaWYgaXQgaXMgYSBjbG9zdXJlLCB0aGUgdGFyZ2V0IG9iamVjdCBpcworICAgICAgICBwYXNzZWQgYXMgcGFyYW1ldGVyIDxvYj4uCisKKyAgICAgICAgVGhlIG90aGVyIHBhcmFtZXRlcnMgcGFzc2VkIGFyZSB0aGUgbmFtZSA8ZnVuPiBvZiB0aGUgY2FsbGVkCisgICAgICAgIGZ1bmN0aW9uLCB0aGUgYXJndW1lbnRzIDxhcmdzPiBwYXNzZWQgdG8gdGhlIGNhbGwgKGlmIGFueSksCisgICAgICAgIGFuZCBhIHJlZmVyZW5jZSA8cmVzdWx0PiB0byBhIHZhcmlhYmxlIGZvciB0aGUgY2FsbCByZXN1bHQuCisKKyAgICAgICAgSWYgdGhlIGhvb2sgY2FuIHJlc29sdmUgdGhlIGNhbGwsIGl0IGhhcyB0byByZXR1cm4gdGhlIGNhbGwKKyAgICAgICAgcmVzdWx0IGluIDxyZXN1bHQ+IGFuZCAxIGFzIGZ1bmN0aW9uIHJlc3VsdC4KKworICAgICAgICBJZiB0aGUgaG9vayBjYW4gbm90IChvciBkb2Vzbid0IHdhbnQgdG8pIHJlc29sdmUgdGhlIGNhbGwsIGl0CisgICAgICAgIGhhcyB0byByZXR1cm4gMC4KKworCitISVNUT1JZCisgICAgICAgIEludHJvZHVjZWQgaW4gTERNdWQgMy4zLjExMworCitTRUUgQUxTTworICAgICAgICBob29rcyhDKQpkaWZmIC0tZ2l0IGEvZG9jL2hvb2svZGVmYXVsdF9wcm9tcHQgYi9kb2MvaG9vay9kZWZhdWx0X3Byb21wdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjMxYmI0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2hvb2svZGVmYXVsdF9wcm9tcHQKQEAgLTAsMCArMSwyNCBAQAorU1lOT1BTSVMKKyAgICAgICAgI2luY2x1ZGUgPHN5cy9kcml2ZXJfaG9va3MuaD4KKworICAgICAgICBzZXRfZHJpdmVyX2hvb2soSF9ERUZBVUxUX1BST01QVCwgdmFsdWUpCisKKyAgICAgICAgPHZhbHVlPiBiZWluZzoKKworICAgICAgICAgIHN0cmluZyA8cHJvbXB0PgorICAgICAgICAgIHN0cmluZyA8Y2xvc3VyZT4oKQorCitERVNDUklQVElPTgorICAgICAgICBPcHRpb25hbCBob29rIGZvciB0aGUgY29tbWFuZCBwcm9tcHQuIElmIHRoaXMgaG9vayBpcyBub3QgdXNlZCwKKyAgICAgICAgdGhlIGRyaXZlciB3aWxsIHVzZSAiPiAiIGFzIHRoZSBjb21tYW5kIHByb21wdC4KKworICAgICAgICBUaGUgaG9vayBjYW4gYmUgZ2l2ZW4gYXMgc3RyaW5nIG9yIGFzIGNsb3N1cmUuIElmIGl0IGlzIGEKKyAgICAgICAgY2xvc3VyZSwgaXQgaXMgY2FsbGVkIHdpdGggdGhlIGNvbW1hbmRnaXZlciBiZWluZyB0aGUgY2FsbGluZworICAgICAgICBvYmplY3QuIElmIHRoZSByZXN1bHQgaXMgYSBzdHJpbmcsIGl0IHdpbGwgYmUgcHJpbnRlZCwKKyAgICAgICAgb3RoZXJ3aXNlIGlnbm9yZWQuCisKK0hJU1RPUlkKKyAgICAgICAgSW50cm9kdWNlZCBpbiBMRE11ZCAzLjMuMTYzLgorCitTRUUgQUxTTworICAgICAgICBob29rcyhDKSwgcHJpbnRfcHJvbXB0KEgpCmRpZmYgLS1naXQgYS9kb2MvaG9vay9lcnFfc3RvcCBiL2RvYy9ob29rL2VycV9zdG9wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMzVhMWMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaG9vay9lcnFfc3RvcApAQCAtMCwwICsxLDIwIEBACitTWU5PUFNJUworICAgICAgICAjaW5jbHVkZSA8c3lzL2RyaXZlcl9ob29rcy5oPgorCisgICAgICAgIHNldF9kcml2ZXJfaG9vayhIX0VSUV9TVE9QLCB2YWx1ZSkKKworICAgICAgICA8dmFsdWU+IGJlaW5nOgorCisgICAgICAgICAgdm9pZCA8Y2xvc3VyZT4oKQorCitERVNDUklQVElPTgorICAgICAgICBPcHRpb25hbCBob29rIHRvIG5vdGlmeSB0aGUgbXVkbGliIGFib3V0IHRoZSB0ZXJtaW5hdGlvbiBvZgorICAgICAgICB0aGUgZXJxIGRlbW9uLiAgSG9vayBzZXR0aW5nIG1heSBiZSBhbnkgY2xvc3VyZS4KKworICAgICAgICBUaGUgY2xvc3VyZSBpcyBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHMgYW5kIG1heSBkbyB3aGF0ZXZlciBpdAorICAgICAgICBsaWtlcyB0byBjbGVhbi11cCBhZnRlciB0aGUgZXJxLgorCitISVNUT1JZCisKK1NFRSBBTFNPCisgICAgICAgIGhvb2tzKEMpCmRpZmYgLS1naXQgYS9kb2MvaG9vay9ob29rIGIvZG9jL2hvb2svaG9vawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjE4NDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2hvb2svaG9vawpAQCAtMCwwICsxLDE4IEBACitDT05DRVBUCisgICAgICAgIGRyaXZlciBob29rcworCitERVNDUklQVElPTgorICAgICAgICBUbyBhbGxvdyBhIGdyZWF0ZXIgZmxleGliaWxpdHkgb2YgdGhlIG11ZHMsIHRoZSBnYW1lZHJpdmVycworICAgICAgICBzaW5jZSAzLjIuMSBtb3ZlZCBzZXZlcmFsIG9uY2UgaGFyZGNvZGVkICd1bmRlcmdyb3VuZCcKKyAgICAgICAgYWN0aXZpdGllcyBmcm9tIHRoZSBkcml2ZXIgaW50byB0aGUgbXVkbGliLiBUaGlzIGluY2x1ZGVzIGZvcgorICAgICAgICBleGFtcGxlIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGNvbXBhdCBhbmQgbmF0aXZlIG1vZGUuCisKKyAgICAgICAgVGhlIGhvb2tzIGFyZSBzZXQgd2l0aCB0aGUgcHJpdmlsZWdlZCBlZnVuIHNldF9kcml2ZXJfaG9vaygpLgorICAgICAgICBTb21lIG9mIHRoZSBob29rcyBhcmUgbWFuZGF0b3J5LCBzb21lIG5vdC4gTW9zdCBob29rcyBhY2NlcHQKKyAgICAgICAgdW5ib3VuZCBsYW1iZGEgY2xvc3VyZXMgYXMgdmFsdWVzLCBzb21lIGFsc28gbGZ1biBjbG9zdXJlcyBvcgorICAgICAgICBldmVuIHN0cmluZ3MuCisgICAgICAgIFRoZSBob29rcyBhcmUgaWRlbnRpZmllZCBieSBhbiBvcmRpbmFsIG51bWJlciwgZm9yIHdoaWNoCisgICAgICAgIHN5bWJvbGljIG5hbWVzIGFyZSBkZWZpbmVkIGluIC9zeXMvZHJpdmVyaG9va3MuaC4KKworU0VFIEFMU08KKyAgICAgICAgbmF0aXZlKEMpLCBzZXRfZHJpdmVyX2hvb2soRSkKZGlmZiAtLWdpdCBhL2RvYy9ob29rL2luY2x1ZGVfZGlycyBiL2RvYy9ob29rL2luY2x1ZGVfZGlycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTU3MzU5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2hvb2svaW5jbHVkZV9kaXJzCkBAIC0wLDAgKzEsMzggQEAKK1NZTk9QU0lTCisgICAgICAgICNpbmNsdWRlIDxzeXMvZHJpdmVyX2hvb2tzLmg+CisKKyAgICAgICAgc2V0X2RyaXZlcl9ob29rKEhfSU5DTFVERV9ESVJTLCB2YWx1ZSkKKworICAgICAgICA8dmFsdWU+IGJlaW5nOgorCisgICAgICAgICAgc3RyaW5nICo8ZGlycz4KKyAgICAgICAgICBzdHJpbmcgPGNsb3N1cmU+KHN0cmluZyBpbmNsdWRlX25hbWUsIHN0cmluZyBjdXJyZW50X2ZpbGUpCisKK0RFU0NSSVBUSU9OCisgICAgICAgIFNlbWktbWFuZGF0b3J5IGhvb2sgc3BlY2lmeWluZyB0aGUgZGlyZWN0b3JpZXMgd2hlcmUgPD4tdHlwZQorICAgICAgICBpbmNsdWRlIGZpbGVzIGFyZSBzZWFyY2hlZCAodGhpcyBpbmNsdWRlcyAiIi1pbmNsdWRlcyBub3QKKyAgICAgICAgZm91bmQgYXMgc3BlY2lmaWVkKS4gIEhvb2sgc2V0dGluZyBtYXkgYmUgYW55IGNsb3N1cmUgb3IgYQorICAgICAgICBzdHJpbmcgYXJyYXkuIElmIG5vdCBzZXQsIG9ubHkgIiItdHlwZSBpbmNsdWRlcyBtYXkgYmUgdXNlZCBpbiBMUEMKKyAgICAgICAgcHJvZ3JhbXMuCisKKyAgICAgICAgVGhlIGhvb2sgaXMgY2FsbGVkIG9ubHkgaWYgYSBjYWxsIHRvIG1hc3Rlcjo6aW5jbHVkZV9maWxlKCkKKyAgICAgICAgZG9lcyBub3QgcmV0dXJuIGEgdXNhYmxlIGZpbGVuYW1lLgorCisgICAgICAgIElmIHRoZSBob29rIHNldHRpbmcgaXMgYSBzdHJpbmcgYXJyYXksIGl0IGhhcyB0byBjb250YWluIHRoZQorICAgICAgICBwYXRoIG5hbWVzIG9mIHRob3NlIGRpcmVjdG9yaWVzIHdoZXJlIDw+LXR5cGUgaW5jbHVkZXMgYXJlIHRvCisgICAgICAgIGJlIHNlYXJjaGVkLiBUaGUgZGlyZWN0b3JpZXMgYXJlIHNlYXJjaGVkIGluIHRoZSBvcmRlciB0aGV5CisgICAgICAgIGFwcGVhciBpbiB0aGUgYXJyYXkuIFRoZSBkaXJlY3RvcnkgbmFtZSBhbmQgdGhlIG5hbWUgb2YgdGhlCisgICAgICAgIGFjdHVhbCBpbmNsdWRlIGZpbGUgYXJlIGNvbmNhdGVuYXRlZCwgdGhlcmVmb3JlIHRoZSBkaXJlY3RvcnkKKyAgICAgICAgbmFtZXMgaGF2ZSB0byBlbmQgaW4gJy8nLiBMZWFkaW5nIHNsYXNoZXMgbWF5IGJlIG9taXR0ZWQuCisKKyAgICAgICAgSWYgdGhlIHNldHRpbmcgaXMgYSBjbG9zdXJlLCBpdCBpcyBjYWxsZWQgd2l0aCB0aGUgbmFtZSBvZiB0aGUKKyAgICAgICAgZGVzaXJlZCBpbmNsdWRlIGZpbGUgYXMgZmlyc3QsIGFuZCB0aGUgbmFtZSBvZiB0aGUgY29tcGlsZWQKKyAgICAgICAgTFBDIGZpbGUgYXMgc2Vjb25kIGFyZ3VtZW50LiAgUmVzdWx0IGhhcyB0byBiZSB0aGUgY29tcGxldGUKKyAgICAgICAgcGF0aCBuYW1lIG9mIHRoZSBpbmNsdWRlIGZpbGUgdG8gdXNlLiBMZWFkaW5nIHNsYXNoZXMgbWF5IGJlCisgICAgICAgIG9taXR0ZWQuICBJZiB0aGUgY2xvc3VyZSBpcyBhIGxhbWJkYSBjbG9zdXJlLCBpdCBpcyBib3VuZCB0bworICAgICAgICB0aGlzX29iamVjdCgpIHByaW9yIHRvIGV4ZWN1dGlvbi4KKworSElTVE9SWQorCitTRUUgQUxTTworICAgICAgICBob29rcyhDKSwgYXV0b19pbmNsdWRlKEgpLCBpbmNsdWRlX2ZpbGUoTSkKZGlmZiAtLWdpdCBhL2RvYy9ob29rL2xvYWRfdWlkcyBiL2RvYy9ob29rL2xvYWRfdWlkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDFlMTYwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2hvb2svbG9hZF91aWRzCkBAIC0wLDAgKzEsMzUgQEAKK1NZTk9QU0lTCisgICAgICAgICNpbmNsdWRlIDxzeXMvZHJpdmVyX2hvb2tzLmg+CisKKyAgICAgICAgc2V0X2RyaXZlcl9ob29rKEhfTE9BRF9VSURTLCB2YWx1ZSkKKworICAgICAgICA8dmFsdWU+IGJlaW5nOgorCisgICAgICAgICAgbWl4ZWQgPGNsb3N1cmU+IChzdHJpbmcgb2JqZWN0bmFtZSkKKworREVTQ1JJUFRJT04KKyAgICAgICAgTWFuZGF0b3J5IGhvb2tzIHRvIGRldGVybWluZSB0aGUgdWlkIGFuZCBldWlkIG9mIGxvYWRlZCBvcgorICAgICAgICBjbG9uZWQgb2JqZWN0cy4gIEhvb2sgc2V0dGluZ3MgY2FuIGJlIGFueSBjbG9zdXJlLgorCisgICAgICAgIFdoZW4gYW4gb2JqZWN0IGlzIG5ld2x5IGxvYWRlZCwgdGhlIEhfTE9BRF9VSURTIGhvb2sgaXMgY2FsbGVkCisgICAgICAgIHdpdGggdGhlIG9iamVjdCBuYW1lIGFzIGFyZ3VtZW50LiAgVGhlIG5ldyBvYmplY3QgYWxyZWFkeQorICAgICAgICBleGlzdHMsIGJ1dCBoYXMgMCB1aWRzLgorCisgICAgICAgIEZvciB0aGUgcmVzdWx0LCB0aGUgZm9sbG93aW5nIHBvc3NpYmlsaXRpZXMgZXhpc3QgKDxudW0+IGlzCisgICAgICAgIGEgbm9uLXplcm8gbnVtYmVyLCA8bm8tc3RyaW5nPiBpcyBhbnl0aGluZyBidXQgYSBzdHJpbmcpOgorCisgICAgICAgICAgICI8dWlkPiIgICAgICAgICAgICAgICAgICAgIC0+IHVpZCA9ICI8dWlkPiIsIGV1aWQgPSAiPHVpZD4iCisgICAgICAgICAgICh7ICI8dWlkPiIsICI8ZXVpZD4iIH0pICAgIC0+IHVpZCA9ICI8dWlkPiIsIGV1aWQgPSAiPGV1aWQ+IgorICAgICAgICAgICAoeyAiPHVpZD4iLCA8bm8tc3RyaW5nPiB9KSAtPiB1aWQgPSAiPHVpZD4iLCBldWlkID0gMAorCisgICAgICAgIElmIHN0cmljdC1ldWlkcyBpcyBub3QgYWN0aXZlLCB0aGUgZm9sbG93aW5nIHJlc3VsdHMgYXJlCisgICAgICAgIHBvc3NpYmxlLCB0b286CisKKyAgICAgICAgICAgPG51bT4gICAgICAgICAgICAgICAgICAgICAgLT4gdWlkID0gMCwgZXVpZCA9IDAKKyAgICAgICAgICAgKHsgPG51bT4sICI8ZXVpZD4iIH0pICAgICAgLT4gdWlkID0gMCwgZXVpZCA9ICI8ZXVpZD4iCisgICAgICAgICAgICh7IDxudW0+LCA8bm8tc3RyaW5nPiB9KSAgIC0+IHVpZCA9IDAsIGV1aWQgPSAwCisKK0hJU1RPUlkKKworU0VFIEFMU08KKyAgICAgICAgaG9va3MoQyksIHVpZHMoQyksIGNsb25lX3VpZHMoSCkKZGlmZiAtLWdpdCBhL2RvYy9ob29rL21vZGlmeV9jb21tYW5kIGIvZG9jL2hvb2svbW9kaWZ5X2NvbW1hbmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ3ODMxMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9ob29rL21vZGlmeV9jb21tYW5kCkBAIC0wLDAgKzEsNjEgQEAKK1NZTk9QU0lTCisgICAgICAgICNpbmNsdWRlIDxzeXMvZHJpdmVyX2hvb2tzLmg+CisKKyAgICAgICAgc2V0X2RyaXZlcl9ob29rKEhfTU9ESUZZX0NPTU1BTkQsIHZhbHVlKQorCisgICAgICAgIDx2YWx1ZT4gYmVpbmc6CisKKyAgICAgICAgICBpbnR8c3RyaW5nIDxjbG9zdXJlPihzdHJpbmcgY21kLCBvYmplY3QgcGxheWVyKQorICAgICAgICAgIGludHxzdHJpbmcgPG5hbWU+KHN0cmluZyBjbWQpCisgICAgICAgICAgPG1hcHBpbmc+CisKK0RFU0NSSVBUSU9OCisgICAgICAgIE9wdGlvbmFsIGhvb2sgdG8gbW9kaWZ5IGNvbW1hbmRzIChib3RoIGVudGVyZWQgb3IgZ2l2ZW4gYnkgYQorICAgICAgICBjYWxsIHRvIGNvbW1hbmQoKSkgYmVmb3JlIHRoZSBwYXJzZXIgc2VlcyB0aGVtICh0aGlzIGluY2x1ZGVzCisgICAgICAgIHNwZWNpYWwgY29tbWFuZHMgbGlrZSAnc3RhdHVzJykuCisKKyAgICAgICAgSG9vayBzZXR0aW5nIGNhbiBiZSBhbnkgY2xvc3VyZSwgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvCisgICAgICAgIGNhbGwgaW4gdGhlIG9iamVjdCwgb3IgYSBtYXBwaW5nLgorCisgICAgICAgIEZvciBpbnRlcmFjdGl2ZXMgdGhpcyBob29rIGlzIHVzZWQgb25seSBpZiB0aGUgaW50ZXJhY3RpdmUKKyAgICAgICAgb2JqZWN0IGhhcyBubyBjb21tYW5kIG1vZGlmaWVyIGFscmVhZHkgc2V0IGJ5IHRoZSBlZnVuCisgICAgICAgIHNldF9tb2RpZnlfY29tbWFuZCgpLgorCisgICAgICAgIElmIHRoZSBob29rIGlzIGEgY2xvc3VyZSwgaXQgaXMgY2FsbGVkIHdpdGggdGhlIGVudGVyZWQKKyAgICAgICAgY29tbWFuZCBhcyBmaXJzdCwgYW5kIHRoZSBjb21tYW5kIGdpdmluZyBwbGF5ZXIgYXMgc2Vjb25kCisgICAgICAgIGFyZ3VtZW50LiBMYW1iZGEgY2xvc3VyZXMgYXJlIGJvdW5kIHRvIHRoZSBjb21tYW5kIGdpdmluZyBwbGF5ZXIsCisgICAgICAgIHVuYm91bmQtbGFtYmRhIGNsb3N1cmVzIHJlbWFpbiB1bmJvdW5kLgorCisgICAgICAgIElmIHRoZSBob29rIGlzIGEgc3RyaW5nLCBpdCBpcyB1c2VkIGFzIHRoZSBuYW1lIG9mIGFuIGxmdW4KKyAgICAgICAgaW4gdGhlIGNvbW1hbmQgZ2l2aW5nIHBsYXllciwgd2hpY2ggaXMgY2FsbGVkIHdpdGggdGhlIGNvbW1hbmQKKyAgICAgICAgYXMgYXJndW1lbnQuCisKKyAgICAgICAgSWYgdGhlIGhvb2sgaXMgYSBtYXBwaW5nLCBpdCBpcyBxdWVyaWVkIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQKKyAgICAgICAgYXMgaW5kZXgsIGFuZCB0aGUgZGF0YSByZXRyaWV2ZWQgaXMgdXNlZCBhcyBuZXcgY29tbWFuZAorICAgICAgICAoZGVmYXVsdHMgdG8gMCBpZiBubyBkYXRhIGlzIHN0b3JlZCBmb3IgYSBnaXZlbiBjb21tYW5kKS4gSWYKKyAgICAgICAgYW4gZW50cnkgaXMgYSBjbG9zdXJlIGluc3RlYWQgb2YgYSBzdHJpbmcsIGl0IGlzIGNhbGxlZCBhcworCisgICAgICAgICAgaW50fHN0cmluZyA8Y2xvc3VyZT4oc3RyaW5nIGNtZCwgb2JqZWN0IHBsYXllcikKKworICAgICAgICBhbmQgdGhlIHJlc3VsdCBmcm9tIHRoZSBjYWxsIGlzIHVzZWQgYXMgJ3RoZScgY29tbWFuZC4KKworICAgICAgICBUaGUgcmVzdWx0IGlzIHRyZWF0ZWQgZXF1YWwgaW4gYWxsIHRocmVlIGNhc2VzOgorICAgICAgICAgLSBJZiB0aGUgcmVzdWx0IGlzIGEgc3RyaW5nLCBpdCBpcyB0aGUgbmV3IGNvbW1hbmQgdG8gZXhlY3V0ZQorICAgICAgICAgICBpbnN0ZWFkIG9mIHRoZSBnaXZlbiBvbmUuIE5vdGUgdGhhdCBpdCBpcyBub3QgcG9zc2libGUgdG8KKyAgICAgICAgICAgbWFrZSBzZXZlcmFsIGNvbW1hbmRzIGZyb20gb25lIHRoaXMgd2F5IQorICAgICAgICAgLSBJZiB0aGUgcmVzdWx0IGlzIGEgbm9uLXplcm8gbnVtYmVyLCB0aGUgZ2l2ZW4gY29tbWFuZCBpcyB0bworICAgICAgICAgICBiZSBpZ25vcmVkLiBJbiBjYXNlIG9mIHRoZSBjbG9zdXJlL2xmdW4gc2V0dGluZyB0aGlzIG1heQorICAgICAgICAgICBtZWFuIHRoYXQgdGhlIGNsb3N1cmUvbGZ1biBhbHJlYWR5IGV4ZWN1dGVkIGl0LgorICAgICAgICAgLSBJZiB0aGUgcmVzdWx0IGlzIDAsIHRoZSBvcmlnaW5hbGx5IGdpdmVuIGNvbW1hbmQgaXMgdG8gYmUKKyAgICAgICAgICAgdXNlZC4KKworICAgICAgICBJdCBpcyBwb3NzaWJsZSBmb3IgdGhlIGhvb2sgdG8gY2hhbmdlIHRoZSBjb21tYW5kIGdpdmVyCisgICAgICAgICh0aGlzX3BsYXllcigpKSBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgY29tbWFuZC4gVGhpcyBtZWFucyB0aGF0CisgICAgICAgIGV2ZW4gdGhvdWdoIHRoZSBjb21tYW5kcyBhcmUgZXhlY3V0ZSBmb3IgdGhlIG9yaWdpbmFsIGNvbW1hbmRnaXZlciwKKyAgICAgICAgdGhpc19wbGF5ZXIoKSB3aWxsIHJldHVybiB0aGUgY2hhbmdlZCBjb21tYW5kZ2l2ZXIuCisKK0hJU1RPUlkKKworU0VFIEFMU08KKyAgICAgICAgaG9va3MoQyksIGNvbW1hbmQoSCksIG1vZGlmeV9jb21tYW5kX2ZuYW1lKEgpLCBub3RpZnlfZmFpbChIKSwKKyAgICAgICAgc2VuZF9ub3RpZnlfZmFpbChIKQpkaWZmIC0tZ2l0IGEvZG9jL2hvb2svbW9kaWZ5X2NvbW1hbmRfZm5hbWUgYi9kb2MvaG9vay9tb2RpZnlfY29tbWFuZF9mbmFtZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTVlZjgwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2hvb2svbW9kaWZ5X2NvbW1hbmRfZm5hbWUKQEAgLTAsMCArMSw0NCBAQAorU1lOT1BTSVMKKyAgICAgICAgI2luY2x1ZGUgPHN5cy9kcml2ZXJfaG9va3MuaD4KKworICAgICAgICBzZXRfZHJpdmVyX2hvb2soSF9NT0RJRllfQ09NTUFORF9GTkFNRSwgdmFsdWUpCisKKyAgICAgICAgPHZhbHVlPiBiZWluZzoKKworICAgICAgICAgIGludHxzdHJpbmcgPG5hbWU+KHN0cmluZyBjbWQpCisKK0RFU0NSSVBUSU9OCisgICAgICAgIE1hbmRhdG9yeSBob29rIHNwZWNpZnlpbmcgdGhlIG5hbWUgb2YgdGhlICdtb2RpZnlfY29tbWFuZCcKKyAgICAgICAgbGZ1biB0byBjYWxsIGZvciBuZXdseSBlbnRlcmVkIGNvbW1hbmRzIGFzIHJlc3VsdCBvZiBhCisgICAgICAgIHNldF9tb2RpZnlfY29tbWFuZCgpLgorCisgICAgICAgIEhvb2sgc2V0dGluZyBtdXN0IGJlIGEgc3RyaW5nLgorCisgICAgICAgIElmIHNldF9tb2RpZnlfY29tbWFuZCgpIGlzIHVzZWQgZm9yIGFuIGludGVyYWN0aXZlIHVzZXIsIGFsbAorICAgICAgICBuZXdseSBlbnRlcmVkIGNvbW1hbmRzIGFyZSBmaXJzdCBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uIG5hbWVkCisgICAgICAgIGJ5IHRoaXMgaG9vay4KKworICAgICAgICBUaGUgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggdGhlIGNvbW1hbmQgYXMgYXJndW1lbnQuCisKKyAgICAgICAgSWYgdGhlIHJlc3VsdCBpcyBhIHN0cmluZywgaXQgaXMgdGhlIG5ldyBjb21tYW5kIHRvIGV4ZWN1dGUKKyAgICAgICAgaW5zdGVhZCBvZiB0aGUgZ2l2ZW4gb25lLiBOb3RlIHRoYXQgaXQgaXMgbm90IHBvc3NpYmxlIHRvIG1ha2UKKyAgICAgICAgc2V2ZXJhbCBjb21tYW5kcyBmcm9tIG9uZSB0aGlzIHdheSEKKworICAgICAgICBJZiB0aGUgcmVzdWx0IGlzIGEgbm9uLXplcm8gbnVtYmVyLCB0aGUgZ2l2ZW4gY29tbWFuZCBpcyB0byBiZQorICAgICAgICBpZ25vcmVkLiBJbiBjYXNlIG9mIHRoZSBjbG9zdXJlL2xmdW4gc2V0dGluZyB0aGlzIG1heSBtZWFuCisgICAgICAgIHRoYXQgdGhlIGNsb3N1cmUvbGZ1biBhbHJlYWR5IGV4ZWN1dGVkIGl0LgorCisgICAgICAgIElmIHRoZSByZXN1bHQgaXMgMCwgdGhlIG9yaWdpbmFsbHkgZ2l2ZW4gY29tbWFuZCBpcyB0byBiZQorICAgICAgICB1c2VkLgorCisgICAgICAgIEl0IGlzIHBvc3NpYmxlIGZvciB0aGUgaG9vayB0byBjaGFuZ2UgdGhlIGNvbW1hbmQgZ2l2ZXIKKyAgICAgICAgKHRoaXNfcGxheWVyKCkpIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBjb21tYW5kLiBUaGlzIG1lYW5zCisgICAgICAgIHRoYXQgZXZlbiB0aG91Z2ggdGhlIGNvbW1hbmRzIGFyZSBleGVjdXRlIGZvciB0aGUgb3JpZ2luYWwKKyAgICAgICAgY29tbWFuZGdpdmVyLCB0aGlzX3BsYXllcigpIHdpbGwgcmV0dXJuIHRoZSBjaGFuZ2VkCisgICAgICAgIGNvbW1hbmRnaXZlci4KKworSElTVE9SWQorCitTRUUgQUxTTworICAgICAgICBob29rcyhDKSwgY29tbWFuZChIKSwgbW9kaWZ5X2NvbW1hbmQoSCksIG5vdGlmeV9mYWlsKEgpLAorICAgICAgICBzZW5kX25vdGlmeV9mYWlsKEgpCmRpZmYgLS1naXQgYS9kb2MvaG9vay9tb3ZlX29iamVjdCBiL2RvYy9ob29rL21vdmVfb2JqZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMjQ0NWQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaG9vay9tb3ZlX29iamVjdApAQCAtMCwwICsxLDI3IEBACitTWU5PUFNJUworICAgICAgICAjaW5jbHVkZSA8c3lzL2RyaXZlcl9ob29rcy5oPgorCisgICAgICAgIHNldF9kcml2ZXJfaG9vayhIX01PVkVfT0JKRUNUMCwgdmFsdWUpCisgICAgICAgIHNldF9kcml2ZXJfaG9vayhIX01PVkVfT0JKRUNUMSwgdmFsdWUpCisKKyAgICAgICAgPHZhbHVlPiBiZWluZzoKKworICAgICAgICAgIHZvaWQgPGNsb3N1cmU+KG9iamVjdCBpdGVtLCBvYmplY3QgZGVzdCkKKworREVTQ1JJUFRJT04KKyAgICAgICAgTWFuZGF0b3J5IGhvb2tzIHRvIGltcGxlbWVudCB0aGUgZWZ1biB2b2lkIG1vdmVfb2JqZWN0KCkuCisgICAgICAgIEhvb2sgc2V0dGluZyBtdXN0IGJlIGFuIHVuYm91bmQgbGFtYmRhIGNsb3N1cmUuCisKKyAgICAgICAgVXBvbiBjYWxsLCB0aGUgaG9vayBoYXMgdG8gcGVyZm9ybSB0aGUgbW92ZSBpdHNlbGYgKGJ5IHVzaW5nCisgICAgICAgIHNldF9lbnZpcm9ubWVudCgpKSBhbmQgYWxsIGRlcGVuZGluZyBhY3Rpb25zIChsaWtlIHRoZSBjYWxscyB0bworICAgICAgICBpbml0KCkgdG8gYWRkIGFjdGlvbnMpLgorCisgICAgICAgIFRoZSBkaWZmZXJlbmNlIGxpZXMgaW4gdGhlIGJpbmRpbmcgb2YgdGhlIHNldCBob29rIHByaW9yIHRvCisgICAgICAgIHRoZSBjYWxsOiB0aGUgSF9NT1ZFX09CSkVDVDAgY2xvc3VyZSBpcyBib3VuZCB0byB0aGUgY3VycmVudAorICAgICAgICBvYmplY3QsIHRoZSBIX01PVkVfT0JKRUNUMSB0byAnaXRlbScuCisgICAgICAgIElmIGJvdGggaG9va3MgYXJlIHNldCwgSF9NT1ZFX09CSkVDVDAgaXMgaWdub3JlZC4KKworSElTVE9SWQorCitTRUUgQUxTTworICAgICAgICBtb3ZlX29iamVjdChFKSwgc2V0X2Vudmlyb25tZW50KEUpLCBob29rcyhDKQpkaWZmIC0tZ2l0IGEvZG9jL2hvb2svbXNnX2Rpc2NhcmRlZCBiL2RvYy9ob29rL21zZ19kaXNjYXJkZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM2MGRmZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9ob29rL21zZ19kaXNjYXJkZWQKQEAgLTAsMCArMSwyOCBAQAorU1lOT1BTSVMKKyAgICAgICAgI2luY2x1ZGUgPHN5cy9kcml2ZXJfaG9va3MuaD4KKworICAgICAgICBzZXRfZHJpdmVyX2hvb2soSF9NU0dfRElTQ0FSREVELCB2YWx1ZSkKKworICAgICAgICA8dmFsdWU+IGJlaW5nOgorCisgICAgICAgICAgc3RyaW5nIDxtc2c+CisgICAgICAgICAgc3RyaW5nIDxjbG9zdXJlPihvYmplY3QgdXNlcikKKworREVTQ1JJUFRJT04KKyAgICAgICAgT3B0aW9uYWwgaG9vayB0byBzcGVjaWZ5IGEgbWVzc2FnZSBvciB0YWtlIG90aGVyIG1lYXN1cmVzCisgICAgICAgIHdoZW4gYSBtZXNzYWdlIGhhZCB0byBiZSBkaXNjYXJkZWQsIGJlY2F1c2UgdGhleSBjb3VsZCBub3QKKyAgICAgICAgYmUgZGVsaXZlcmVkIHRvIHRoZSBwbGF5ZXIgPHVzZXI+LiBJZiB0aGUgaG9vayBpcyBub3Qgc2V0LAorICAgICAgICBhIHN0YW5kYXJkIG1lc3NhZ2UgaXMgdXNlZC4KKworICAgICAgICBJZiB0aGUgaG9vayBpcyBhIHN0cmluZywgdGhpcyB0ZXh0IHdpbGwgYmUgc2VudCBhcyBzb29uIGFzCisgICAgICAgIHBvc3NpYmxlIHRvIHRoZSBwbGF5ZXIgaW5mb3JtaW5nIGFib3V0IHRoZSBsb3N0IHRyYW5zbWlzc2lvbi4KKworICAgICAgICBJZiB0aGUgaG9vayBpcyBhIGNsb3N1cmUsIGl0IGlzIHRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQKKyAgICAgICAgYW5kIHRoZSByZXN1bHQgaXMgdXNlZCBhcyB0aGUgbWVzc2FnZSB0byBiZSBzZW50LiBMYW1iZGEKKyAgICAgICAgY2xvc3VyZXMgYXJlIGJvdW5kIHRvIHRoZSBpbnRlcmFjdGl2ZSA8dXNlcj4gZmlyc3QuCisKK0hJU1RPUlkKKyAgICAgICAgSW50cm9kdWNlZCBpbiBMRE11ZCAzLjMuNzE5CisKK1NFRSBBTFNPCisgICAgICAgIGhvb2tzKEMpLCBjb25maWd1cmVfaW50ZXJhY3RpdmUoRSkKZGlmZiAtLWdpdCBhL2RvYy9ob29rL25vX2VjaG8gYi9kb2MvaG9vay9ub19lY2hvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1OTI1MjkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaG9vay9ub19lY2hvCkBAIC0wLDAgKzEsNDEgQEAKK1NZTk9QU0lTCisgICAgICAgICNpbmNsdWRlIDxzeXMvZHJpdmVyX2hvb2tzLmg+CisKKyAgICAgICAgc2V0X2RyaXZlcl9ob29rKEhfVEVMTkVUX05FRywgdmFsdWUpCisKKyAgICAgICAgPHZhbHVlPiBiZWluZzoKKworICAgICAgICAgIHZvaWQgPG5hbWU+KGludCBmbGFnLCBvYmplY3QgdXNlciwgaW50IG5vX3RlbG5ldCkKKyAgICAgICAgICB2b2lkIDxjbG9zdXJlPihpbnQgZmxhZywgb2JqZWN0IHVzZXIsIGludCBub190ZWxuZXQpCisKK0RFU0NSSVBUSU9OCisgICAgICAgIE9wdGlvbmFsIGhvb2sgdG8gc3BlY2lmaXkgaG93IHRvIHBlcmZvcm0gdGhlIHRlbG5ldCBhY3Rpb25zIHRvCisgICAgICAgIHN3aXRjaCB0aGUgZWNobyBtb2RlICh1c2VkIGZvciBlLmcuIHBhc3N3b3JkIGlucHV0X3RvKClzKS4KKyAgICAgICAgSG9vayBzZXR0aW5nIG1heSBiZSBhbnkgY2xvc3VyZSBvciBhIHN0cmluZy4gIElmIG5vdCBzZXQsIGEKKyAgICAgICAgZGVmYXVsdCBoYW5kbGluZyBpcyBwZXJmb3JtZWQuCisKKyAgICAgICAgSWYgdGhlIHNldHRpbmcgaXMgYSBzdHJpbmcsIGl0IHVzZWQgYXMgbmFtZSBvZiBhbiBsZnVuIHRvIGNhbGwKKyAgICAgICAgaW4gdGhlIGludGVyYWN0aXZlIDx1c2VyPiwgd2hlcmUgPGZsYWc+IGlzIHRoZSBlY2hvLWZsYWcKKyAgICAgICAgcGFzc2VkIHRvIHRoZSBpbnB1dF90bygpIHN0YXRlbWVudC4KKworICAgICAgICBJZiB0aGUgc2V0dGluZyBpcyBhIGNsb3N1cmUsIGl0IGlzIGNhbGxlZCB3aXRoIHRoZSBzYW1lCisgICAgICAgIGFyZ3VtZW50cywgYW5kIHVuYm91bmQgbGFtYmRhLWNsb3N1cmVzIGJlaW5nIGJvdW5kIHRvCisgICAgICAgIHRoaXNfcGxheWVyKCkgcHJpb3IgdG8gZXhlY3V0aW9uLgorCisgICAgICAgIDxsb2NhbD4gaXMgYSBib29sZWFuIGZsYWc6IGl0IGlzIFRSVUUgd2hlbiBpbnB1dF90bygpIHdhcworICAgICAgICBjYWxsZWQgd2l0aCB0aGUgSU5QVVRfTk9fVEVMTkVUIGZsYWcuCisKKyAgICAgICAgV2hlbiBzZXQsIHRoZSBob29rIGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgZHJpdmVyIG5lZWRzIHRvCisgICAgICAgIGNoYW5nZSB0aGUgZWNobyBtb2RlLCB0aHVzIHlvdSBjYW4gbmVnb3RpYXRlIGFib3V0IHRoaW5ncyB0aGF0CisgICAgICAgIGFyZSBjb3VwbGVkIHdpdGggaXQsIGxpa2UgTElORU1PREUgb3IgY2hhcmFjdGVyLWF0LWEtdGltZS4KKworICAgICAgICBJTVBPUlRBTlQ6IElmIHRoaXMgaG9vayBpcyB1c2VkLCB0aGUgY29udHJvbCBvZiBhbGwgdGVsbmV0CisgICAgICAgIG5lZ290aWF0aW9uIGlzIHRyYW5zZmVycmVkIHRvIHRoZSBtdWRsaWI6IGFsbCBpbmNvbWluZyBuZWdvdGlhdGlvbnMKKyAgICAgICAgYXJlIHBhc3NlZCB0byBIX1RFTE5FVF9ORUcsIGFuZCB0aGUgc2VuZGluZyBvZiBuby1lY2hvIG5lZ290aWF0aW9ucworICAgICAgICBpcyBoYW5kbGVkIGJ5IHRoaXMgaG9vay4KKworSElTVE9SWQorICAgICAgICBMRE11ZCAzLjIuMTEvTERNdWQgMy4zLjU5MyBhZGRlZCB0aGUgPG5vX3RlbG5ldD4gYXJndW1lbnQuCisKK1NFRSBBTFNPCisgICAgICAgIGhvb2tzKEMpLCB0ZWxuZXQoQyksIHRlbG5ldF9uZWcoSCkKZGlmZiAtLWdpdCBhL2RvYy9ob29rL25vX2lwY19zbG90IGIvZG9jL2hvb2svbm9faXBjX3Nsb3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQxYjBmYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9ob29rL25vX2lwY19zbG90CkBAIC0wLDAgKzEsMjIgQEAKK1NZTk9QU0lTCisgICAgICAgICNpbmNsdWRlIDxzeXMvZHJpdmVyX2hvb2tzLmg+CisKKyAgICAgICAgc2V0X2RyaXZlcl9ob29rKEhfTk9fSVBDX1NMT1QsIHZhbHVlKQorCisgICAgICAgIDx2YWx1ZT4gYmVpbmc6CisKKyAgICAgICAgICAwCisgICAgICAgICAgc3RyaW5nIDxtc2c+CisKK0RFU0NSSVBUSU9OCisgICAgICAgIE9wdGlvbmFsIGhvb2sgc3BlY2lmeWluZyB0aGUgbWVzc2FnZSBnaXZlbiB0byBsb2dpbnMKKyAgICAgICAgcmVqZWN0ZWQgZHVlIHRvIHNwYWNlIGxpbWl0YXRpb25zIChNQVhfUExBWUVSKS4KKyAgICAgICAgSG9vayBzZXR0aW5nIGhhcyB0byBiZSBzdHJpbmcuCisKKyAgICAgICAgSWYgc2V0IHRvIDAsIHRoZSBkZWZhdWx0IG1lc3NhZ2UgIkxwbXVkIGlzIGZ1bGwuIENvbWUgYmFjaworICAgICAgICBsYXRlci4iIGlzIGlzc3VlZC4KKworSElTVE9SWQorCitTRUUgQUxTTworICAgICAgICBob29rcyhDKQpkaWZmIC0tZ2l0IGEvZG9jL2hvb2svbm90aWZ5X2ZhaWwgYi9kb2MvaG9vay9ub3RpZnlfZmFpbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTRiYWNmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2hvb2svbm90aWZ5X2ZhaWwKQEAgLTAsMCArMSwzMyBAQAorU1lOT1BTSVMKKyAgICAgICAgI2luY2x1ZGUgPHN5cy9kcml2ZXJfaG9va3MuaD4KKworICAgICAgICBzZXRfZHJpdmVyX2hvb2soSF9OT1RJRllfRkFJTCwgdmFsdWUpCisKKyAgICAgICAgPHZhbHVlPiBiZWluZzoKKworICAgICAgICAgIHN0cmluZyA8bXNnPgorICAgICAgICAgIHN0cmluZyA8Y2xvc3VyZT4oc3RyaW5nIGVudGVyZWRfY29tbWFuZCwgb2JqZWN0IGNtZF9naXZlcikKKworREVTQ1JJUFRJT04KKyAgICAgICAgTWFuZGF0b3J5IGhvb2sgdG8gaXNzdWUgdGhlIGRlZmF1bHQgbWVzc2FnZSBpZiBhbiBlbnRlcmVkCisgICAgICAgIGNvbW1hbmQgY291bGRuJ3QgYmUgcGFyc2VkIGFuZCBubyBub3RpZnlfZmFpbCgpIGNvbW1hbmQgaXMgaW4KKyAgICAgICAgZWZmZWN0LiAgSG9vayBzZXR0aW5nIGNhbiBiZSBhIGFueSBjbG9zdXJlLCBvciBhIHN0cmluZy4KKworICAgICAgICBJZiBzZXQgdG8gYSBzdHJpbmcsIGl0IGlzIHRoZSBtZXNzYWdlIHJldHVybmVkIHRvIHRoZQorICAgICAgICBwbGF5ZXIuCisKKyAgICAgICAgSWYgc2V0IHRvIGEgY2xvc3VyZSwgaXQgaXMgY2FsbGVkIHdpdGggdGhlIGNvbW1hbmQgYW5kIHRoZQorICAgICAgICBjb21tYW5kIGdpdmVyIGFzIGFyZ3VtZW50cywgYW5kIHRoZSByZXN1bHQgaXMgdXNlZCBhcyBmYWlsdXJlCisgICAgICAgIG1lc3NhZ2UuIExhbWJkYSBjbG9zdXJlcyBhcmUgYm91bmQgdG8gdGhpc19wbGF5ZXIoKSBwcmlvciB0bworICAgICAgICBleGVjdXRpb24uCisKKyAgICAgICAgPGNtZF9naXZlcj4gaXMgdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgY29tbWFuZCBpbiB0aGUKKyAgICAgICAgZmlyc3QgcGxhY2UuIEl0IGlzIHVzdWFsbHkgaWRlbnRpY2FsIHdpdGggdGhpc19wbGF5ZXIoKSwKKyAgICAgICAgdW5sZXNzIHRoZSBIX01PRElGWV9DT01NQU5EIGhvb2sgY2hhbmdlZCBpdC4KKworSElTVE9SWQorICAgICAgICBMRE11ZCAzLjIuNyBhZGRlZCB0aGUgbmV3ICdjb21tYW5kX2dpdmVyJyBhcmd1bWVudC4KKworU0VFIEFMU08KKyAgICAgICAgaG9va3MoQyksIGNvbW1hbmQoSCksIG1vZGlmeV9jb21tYW5kKEgpLCBtb2RpZnlfY29tbWFuZF9mbmFtZShIKSwKKyAgICAgICAgc2VuZF9ub3RpZnlfZmFpbChIKQpkaWZmIC0tZ2l0IGEvZG9jL2hvb2svcHJpbnRfcHJvbXB0IGIvZG9jL2hvb2svcHJpbnRfcHJvbXB0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NjRkYjcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaG9vay9wcmludF9wcm9tcHQKQEAgLTAsMCArMSwyOCBAQAorU1lOT1BTSVMKKyAgICAgICAgI2luY2x1ZGUgPHN5cy9kcml2ZXJfaG9va3MuaD4KKworICAgICAgICBzZXRfZHJpdmVyX2hvb2soSF9QUklOVF9QUk9NUFQsIHZhbHVlKQorCisgICAgICAgIDx2YWx1ZT4gYmVpbmc6CisKKyAgICAgICAgICB2b2lkIDxuYW1lPihzdHJpbmcgcHJvbXB0KS4KKyAgICAgICAgICB2b2lkIDxjbG9zdXJlPihzdHJpbmcgcHJvbXB0KQorCitERVNDUklQVElPTgorICAgICAgICBPcHRpb25hbCBob29rIHRvIHByaW50IHRoZSBjdXJyZW50IGNvbW1hbmQgcHJvbXB0LiBJZiB0aGlzCisgICAgICAgIGhvb2sgaXMgbm90IHNldCwgdGhlIGRyaXZlciB3aWxsIGp1c3QgcHJpbnQgdGhlIHByb21wdCB0byB0aGUKKyAgICAgICAgdXNlci4KKworICAgICAgICBUaGUgaG9vayBpcyBjYWxsZWQgd2l0aCB0aGUgcHJvbXB0IHN0cmluZyBhcyBzaW5nbGUgYXJndW1lbnQKKyAgICAgICAgYW5kIGhhcyB0byBwcmludCB0aGUgcHJvbXB0LCBlLmcuIHVzaW5nIHdyaXRlKCkgb3IKKyAgICAgICAgYmluYXJ5X21lc3NhZ2UoKS4KKworICAgICAgICBJZiB0aGUgaG9vayBpcyBhIHN0cmluZywgaXQgaXMgdGhlIG5hbWUgb2YgYW4gbGZ1biBpbiB0aGUKKyAgICAgICAgY29tbWFuZCBnaXZlci4gSWYgdGhlIGhvb2sgaXMgYSBjbG9zdXJlLCBpdCBpcyBjYWxsZWQKKyAgICAgICAgd2l0aCB0aGUgY29tbWFuZCBnaXZlciBhcyBwcmV2aW91cyBvYmplY3QuCisKK0hJU1RPUlkKKyAgICAgICAgSW50cm9kdWNlZCBpbiBMRE11ZCAzLjMuMTYzLgorCitTRUUgQUxTTworICAgICAgICBob29rcyhDKSwgZGVmYXVsdF9wcm9tcHQoSCkKZGlmZiAtLWdpdCBhL2RvYy9ob29rL3JlZ2V4cF9wYWNrYWdlIGIvZG9jL2hvb2svcmVnZXhwX3BhY2thZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU1MmUzZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9ob29rL3JlZ2V4cF9wYWNrYWdlCkBAIC0wLDAgKzEsMjMgQEAKK1NZTk9QU0lTCisgICAgICAgICNpbmNsdWRlIDxzeXMvZHJpdmVyX2hvb2tzLmg+CisgICAgICAgICNpbmNsdWRlIDxzeXMvcmVnZXhwLmg+CisKKyAgICAgICAgc2V0X2RyaXZlcl9ob29rKEhfUkVHRVhQX1BBQ0tBR0UsIHZhbHVlKQorCisgICAgICAgIDx2YWx1ZT4gYmVpbmcgYW4gaW50ZWdlcjoKKyAgICAgICAgICAwCisgICAgICAgICAgUkVfUENSRQorICAgICAgICAgIFJFX1RSQURJVElPTkFMCisKK0RFU0NSSVBUSU9OCisgICAgICAgIE9wdGlvbmFsIGhvb2sgdG8gc2VsZWN0IHRoZSBkZWZhdWx0IHJlZ2V4cCBwYWNrYWdlIHRvIHVzZQorICAgICAgICBmb3IgcmVndWxhciBleHByZXNzaW9uIGZ1bmN0aW9ucy4KKworICAgICAgICBJZiBzZXQgdG8gMCwgdGhlIGRlZmF1bHQgcGFja2FnZSBkZXRlcm1pbmVkIGJ5IHRoZSBkcml2ZXIncworICAgICAgICBjb25maWd1cmF0aW9uL2NvbW1hbmRsaW5lIG9wdGlvbnMgaXMgdXNlZC4KKworSElTVE9SWQorICAgICAgICBJbnRyb2R1Y2VkIGluIExETXVkIDMuMy41OTUuCisKK1NFRSBBTFNPCisgICAgICAgIGhvb2tzKEMpLCBkZWZhdWx0X3Byb21wdChIKSwgaW52b2NhdGlvbihEKSwgcmVnZXhwKEMpCmRpZmYgLS1naXQgYS9kb2MvaG9vay9yZXNldCBiL2RvYy9ob29rL3Jlc2V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZjFkZWEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaG9vay9yZXNldApAQCAtMCwwICsxLDM4IEBACitTWU5PUFNJUworICAgICAgICAjaW5jbHVkZSA8c3lzL2RyaXZlcl9ob29rcy5oPgorCisgICAgICAgIHNldF9kcml2ZXJfaG9vayhIX1JFU0VULCB2YWx1ZSkKKworICAgICAgICA8dmFsdWU+IGJlaW5nOgorCisgICAgICAgICAgdm9pZHxpbnQgPGNsb3N1cmU+ICggdm9pZCApCisgICAgICAgICAgdm9pZCA8bmFtZT4oMSkKKworREVTQ1JJUFRJT04KKyAgICAgICAgT3B0aW9uYWwgaG9vayB0byByZXNldCBhbiBvYmplY3QuCisgICAgICAgIEhvb2sgc2V0dGluZyBjYW4gYmUgdW5ib3VuZCBsYW1iZGEgY2xvc3VyZXMsIG9yIHRoZSBuYW1lIG9mCisgICAgICAgIHRoZSBmdW5jdGlvbiAoc3RhdGljIG9yIHB1YmxpYykgdG8gY2FsbCBpbiB0aGUgb2JqZWN0LgorCisgICAgICAgIElmIHRoZSBob29rIGlzIGEgY2xvc3VyZSwgaXQgaXMgYm91bmQgdG8gdGhlIG9iamVjdCB0byBiZQorICAgICAgICByZXNldCBhbmQgY2FsbGVkIHdpdGggbm8gYXJndW1lbnQuCisKKyAgICAgICAgSWYgdGhlIHJlc3VsdCBvZiB0aGlzIGNhbGwgaXMgYSBwb3NpdGl2ZSBudW1iZXIsIGl0IGlzIHVzZWQgYXMKKyAgICAgICAgdGhlIGludGVydmFsIHRvIHdhaXQgYmVmb3JlIHRoZSBuZXh0IHJlc2V0KCkuICBJZiB0aGUgcmVzdWx0CisgICAgICAgIGlzIDAsIHRoZSBkZWZhdWx0IGludGVydmFsIGNvbXB1dGVkIGZyb20gVElNRV9UT19SRVNFVCBpcworICAgICAgICB1c2VkLiAgSWYgdGhlIHJlc3VsdCBpcyBhIG5lZ2F0aXZlIG51bWJlciwgdGhlIG9iamVjdCB3aWxsIG5vdAorICAgICAgICBiZSByZXNldCBhZ2FpbiwgdW5sZXNzIGRpcmVjdGVkIG90aGVyd2lzZSBieSBzZXRfbmV4dF9yZXNldCgpLgorCisgICAgICAgIElmIHRoZSBob29rIGlzIGRlZmluZWQgYXMgdGhlIG5hbWUgb2YgYW4gbGZ1biBpbiB0aGUgb2JqZWN0LAorICAgICAgICBpdCBpcyBjYWxsZWQgaW4gdGhlIG9iamVjdCB3aXRoIDEgYXMgYXJndW1lbnQsIGFuZCBhbnkgcmVzdWx0CisgICAgICAgIGlzIGlnbm9yZWQuICBJbiB0aGlzIGNhbGwgdGhlIHByZXZpb3VzX29iamVjdCgpIGlzIHRoZSBvYmplY3QKKyAgICAgICAgaW5pdGlhdGluZyB0aGUgcmVzZXQuICBJZiB0aGUgZnVuY3Rpb24gZG9lcyBub3QgZXhpc3QsIHRoZQorICAgICAgICBvYmplY3Qgd29uJ3QgYmUgcmVzZXQgYWdhaW4uCisKKyAgICAgICAgTm90ZSB0aGF0IGFuIG9iamVjdCBpcyBvbmx5IHJlc2V0IGJ5IGNhbGwgdG8gdGhpcyBob29rIGlmIGl0CisgICAgICAgIGhhcyBiZWVuIHVzZWQgc2luY2UgdGhlIGxhc3QgcmVzZXQuCisKK0hJU1RPUlkKKyAgICAgICAgTERNdWQgMy4yLjEwIGFsbG93ZWQgc3RhdGljIGZ1bmN0aW9ucyB0byBiZSBnaXZlbiBieSBuYW1lLgorCitTRUUgQUxTTworICAgICAgICBob29rcyhDKQpkaWZmIC0tZ2l0IGEvZG9jL2hvb2svc2VuZF9ub3RpZnlfZmFpbCBiL2RvYy9ob29rL3NlbmRfbm90aWZ5X2ZhaWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y2MWJiNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9ob29rL3NlbmRfbm90aWZ5X2ZhaWwKQEAgLTAsMCArMSwzNCBAQAorU1lOT1BTSVMKKyAgICAgICAgI2luY2x1ZGUgPHN5cy9kcml2ZXJfaG9va3MuaD4KKworICAgICAgICBzZXRfZHJpdmVyX2hvb2soSF9TRU5EX05PVElGWV9GQUlMLCB2YWx1ZSkKKworICAgICAgICA8dmFsdWU+IGJlaW5nOgorCisgICAgICAgICAgdm9pZCA8bmFtZT4oc3RyaW5nIG1zZywgb2JqZWN0IG1zZ29iaiwgb2JqZWN0IG9yaWdfY21kX2dpdmVyKQorICAgICAgICAgIHZvaWQgPGNsb3N1cmU+KHN0cmluZyBtc2csIG9iamVjdCBtc2dvYmosIG9iamVjdCBvcmlnX2NtZF9naXZlcikKKworREVTQ1JJUFRJT04KKyAgICAgICAgT3B0aW9uYWwgaG9vayB0byBzZW5kIHRoZSBub3RpZnkgZmFpbCBtZXNzYWdlLCByZWdhcmRsZXNzCisgICAgICAgIG9mIGhvdyBpdCB3YXMgZGV0ZXJtaW5lZCwgdG8gdGhlIHBsYXllci4gSWYgdGhlIGhvb2sgaXMgbm90CisgICAgICAgIHNldCwgdGhlIG1lc3NhZ2UgaXMgZGVsaXZlcmVkIHVzaW5nIHRlbGxfb2JqZWN0KCkgaW50ZXJuYWxseS4KKyAgICAgICAgSG9vayBzZXR0aW5nIGNhbiBiZSBhIHN0cmluZyBvciBhIGNsb3N1cmUuCisKKyAgICAgICAgSWYgdGhlIGhvb2sgaXMgYSBzdHJpbmcsIGl0IGlzIHRoZSBuYW1lIG9mIGEgKHBvc3NpYmx5IHN0YXRpYykKKyAgICAgICAgZnVuY3Rpb24gdG8gY2FsbCBpbiB0aGUgY3VycmVudCBjb21tYW5kIGdpdmVyLiBJZiB0aGUgaG9vaworICAgICAgICBpcyBhIGNsb3N1cmUsIGl0IGlzIHRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQuIExhbWJkYSBjbG9zdXJlcworICAgICAgICBhcmUgYm91bmQgdG8gdGhlIGN1cnJlbnQgY29tbWFuZCBnaXZlciBmaXJzdC4KKworICAgICAgICBUaGUgYXJndW1lbnRzIHRvIHRoZSBjYWxsIGFyZToKKyAgICAgICAgIC0gPG1zZz4gaXMgdGhlIG5vdGlmeSBmYWlsIG1lc3NhZ2UgdG8gYmUgZGVsaXZlcmVkLgorICAgICAgICAgLSA8bXNnb2JqPiBpcyB0aGUgb2JqZWN0IHdoaWNoIHNldCB0aGUgbWVzc2FnZS4gSXQgaXMgMCBmb3IKKyAgICAgICAgICAgdGhlIGRlZmF1bHQgbWVzc2FnZS4KKyAgICAgICAgIC0gPG9yaWdfY21kX2dpdmVyPiBpcyB0aGUgb2JqZWN0IGZvciB3aGljaCB0aGUgb3JpZ2luYWwKKyAgICAgICAgICAgY29tbWFuZCB3YXMgZmlyc3QgcmVjZWl2ZWQuIEl0IGlzIHVzdWFsbHkgaWRlbnRpY2FsIHdpdGgKKyAgICAgICAgICAgdGhlIGN1cnJlbnQgY29tbWFuZCBnaXZlciB0aGlzX3BsYXllcigpLgorCitISVNUT1JZCisKK1NFRSBBTFNPCisgICAgICAgIGhvb2tzKEMpLCBjb21tYW5kKEgpLCBtb2RpZnlfY29tbWFuZChIKSwgbW9kaWZ5X2NvbW1hbmRfZm5hbWUoSCksCisgICAgICAgIG5vdGlmeV9mYWlsKEgpCmRpZmYgLS1naXQgYS9kb2MvaG9vay90ZWxuZXRfbmVnIGIvZG9jL2hvb2svdGVsbmV0X25lZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjhiOGMxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2hvb2svdGVsbmV0X25lZwpAQCAtMCwwICsxLDcyIEBACitTWU5PUFNJUworICAgICAgICAjaW5jbHVkZSA8c3lzL2RyaXZlcl9ob29rcy5oPgorCisgICAgICAgIHNldF9kcml2ZXJfaG9vayhIX1RFTE5FVF9ORUcsIHZhbHVlKQorCisgICAgICAgIDx2YWx1ZT4gYmVpbmc6CisKKyAgICAgICAgICB2b2lkfG1peGVkIDxuYW1lPihpbnQgYWN0aW9uLCBpbnQgb3B0aW9uIFssIGludCAqIG9wdHMgXSApCisgICAgICAgICAgdm9pZHxtaXhlZCA8Y2xvc3VyZT4oaW50IGFjdGlvbiwgaW50IG9wdGlvbiBbLCBpbnQgKiBvcHRzIF0gKQorCitERVNDUklQVElPTgorICAgICAgICBPcHRpb25hbCBob29rIHRvIHNwZWNpZml5IGhvdyB0byBwZXJmb3JtIGEgc2luZ2xlIHRlbG5ldAorICAgICAgICBuZWdvdGlhdGlvbi4gIEhvb2sgc2V0dGluZyBtYXkgYmUgYW55IGNsb3N1cmUgb3IgYSBzdHJpbmcuICBJZgorICAgICAgICBub3Qgc2V0LCBtb3N0IHRlbG5ldCBvcHRpb25zIGFyZSByZWplY3RlZCAocmVhZDogb25seSBhIHZlcnkKKyAgICAgICAgbWluaW1hbCBuZWdvdGlhdGlvbiB0YWtlcyBwbGFjZSkuCisKKyAgICAgICAgVGhlIGhvb2sgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBkcml2ZXIgcmVjZWl2ZXMgYSBkZW1hbmQgZm9yCisgICAgICAgIG9wdGlvbiBuZWdvdGlhdGlvbiBmb3IgYW55IG9wdGlvbiB0aGUgZHJpdmVyIGRvZXMgbm90IGhhbmRsZSBpdHNlbGYuCisgICAgICAgIEJ5IGRlZmF1bHQsIHRoZSBkcml2ZXIgZGVhbHMgd2l0aCB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CisgICAgICAgICAgICBURUxPUFRfRUNITzogICAgICBFY2hvIG9wdGlvbgorICAgICAgICAgICAgVEVMT1BUX1NHQTogICAgICAgU3VwcHJlc3MgR28gQWhlYWQgKG5lYXJseSBhbHdheXMgb24pCisgICAgICAgICAgICBURUxPUFRfQ09NUFJFU1M6ICBNdWQgY2xpZW50IGNvbXByZXNzaW9uIHByb3RvY29sIChvYnNvbGV0ZSkKKyAgICAgICAgICAgIFRFTE9QVF9DT01QUkVTUzI6IE11ZCBjbGllbnQgY29tcHJlc3Npb24gcHJvdG9jb2wgVjIKKworICAgICAgICBGb3IgYWxsIG90aGVyIHRlbG5ldCBvcHRpb25zIG5lZ290aWF0aW9ucywgdGhpcyBob29rIGlzIGNhbGxlZC4KKworICAgICAgICBUaGUgaG9vayBoYXMgdGhlbiB0byBwZXJmb3JtIHRoZSBuZWdvdGlhdGlvbiB1c2luZyB0aGUgZWZ1bgorICAgICAgICBiaW5hcnlfbWVzc2FnZSgpLgorCisgICAgICAgIEFsdGVybmF0aXZlbHksIGlmIEhfTk9FQ0hPIGlzIHNldCwgdGhpcyBob29rIGlzIGNhbGxlZCBmb3IKKyAgICAgICAgX2FsbF8gdGVsbmV0IGRhdGEgcmVjZWl2ZWQuCisKKyAgICAgICAgSWYgdGhlIHNldHRpbmcgaXMgYSBzdHJpbmcsIGl0IHVzZWQgYXMgbmFtZSBvZiBhbiBsZnVuIHRvIGNhbGwKKyAgICAgICAgaW4gdGhpc19wbGF5ZXIoKS4gQ2xvc3VyZXMgYXJlIGp1c3QgY2FsbGVkLCB3aXRoIHVuYm91bmQKKyAgICAgICAgbGFtYmRhLWNsb3N1cmVzIGJlaW5nIGJvdW5kIHRvIHRoaXNfcGxheWVyKCkgcHJpb3IgdG8KKyAgICAgICAgZXhlY3V0aW9uLgorCisgICAgICAgIFRoZSBob29rIGlzIGNhbGxlZCBmb3IgYSAnRE8vRE9OVC9XSUxML1dPTlQgPG9wdD4nIHdpdGggdGhlIGFjdGlvbgorICAgICAgICAoRE8vRE9OVC8uLi4pIGFzIHRoZSBmaXJzdCwgYW5kIDxvcHQ+IGFzIHRoZSBzZWNvbmQgYXJndW1lbnQuCisKKyAgICAgICAgRm9yIGV4YW1wbGU6LCBpZiB0aGUgZHJpdmVyIHJlY2VpdmVzIHRoZSBzZXF1ZW5jZQorCisgICAgICAgICAgSUFDIFNCIDxvcHQ+IDxvcHRzPi4uLgorCisgICAgICAgIGZvbGxvd2VkIGJ5IElBQyBTQi9TRSwgIHRoZSBob29rIGlzIGNhbGxlZCB3aXRoICdTQicgYXMgZmlyc3QKKyAgICAgICAgYXJndW1lbnQsIDxvcHQ+IGFzIHNlY29uZCwgYW5kIDxvcHRzPiBhcyBhbiBhcnJheSBvZiBpbnRlZ2VycyBhcworICAgICAgICB0aGlyZCBhcmd1bWVudC4KKworUkVNQVJLUworICAgICAgICBBbiBpbmNvbXBsZXRlIGxpc3Qgb2YgdGVsbmV0IG5lZ290aWF0aW9ucyB0aGlzIGhvb2sgaXMgY2FsbGVkCisgICAgICAgIGZvciBpbmNsdWRlcyB0aGUgZm9sbG93aW5nOgorICAgICAgICAgICAgU0I6ICAgICAgICAgICAgICAgU3Vib3B0aW9uIG5lZ290aWF0aW9uCisgICAgICAgICAgICBURUxPUFRfTElORU1PREU6ICBsaW5lbW9kZQorICAgICAgICAgICAgVEVMT1BUX05BV1M6ICAgICAgd2luZG93IHNpemUKKyAgICAgICAgICAgIFRFTE9QVF9UVFlQRTogICAgIHRlcm1pbmFsIHR5cGUKKyAgICAgICAgICAgIFRFTE9QVF9UTTogICAgICAgIHRpbWluZyBtYXJrCisgICAgICAgICAgICBURUxPUFRfTkVXRU5WOiAgICByZW1vdGUgZW52aXJvbm1lbnQgdmFyaWFibGVzCisgICAgICAgICAgICBURUxPUFRfRU5WSVJPTjogICByZW1vdGUgZW52aXJvbm1lbnQgdmFyaWFibGVzCisgICAgICAgICAgICBURUxPUFRfWERJU1BMT0M6ICByZW1vdGUgWCBkaXNwbGF5IGFkZHJlc3MKKyAgICAgICAgICAgIFRFTE9QVF9UU1BFRUQ6ICAgIHRlcm1pbmFsIHNwZWVkCisgICAgICAgICAgICBURUxPUFRfQklOQVJZOiAgICBiaW5hcnkgZGF0YSwgbmVlZGVkIGZvciBub24tQVNDSUkgY2hhcnNldHMKKyAgICAgICAgICAgIFRFTE9QVF9FT1I6ICAgICAgIFRpbnlGdWd1ZSBwcm9tcHQgbWFya2VyICh0b2dldGhlciB3aXRoIEVPUikKKworICAgICAgICAgICAgVEVMT1BUX01TUDogICAgICAgTXVkIFNvdW5kIFByb3RvY29sCisgICAgICAgICAgICBURUxPUFRfTVhQOiAgICAgICBNdWQgRXh0ZW5zaW9uIFByb3RvY29sCisgICAgICAgICAgICBURUxPUFRfTVNTUDogICAgICBNdWQgU2VydmVyIFN0YXR1cyBQcm90b2NvbAorICAgICAgICAgICAgVEVMT1BUX0dNQ1A6ICAgICAgR2VuZXJpYyBNdWQgQ29tbXVuaWNhdGlvbiBQcm90b2NvbAorCitISVNUT1JZCisKK1NFRSBBTFNPCisgICAgICAgIGhvb2tzKEMpLCB0ZWxuZXQoQyksIG5vX2VjaG8oSCkKZGlmZiAtLWdpdCBhL2RvYy9pbmZvbWFpbHMvaW5mb19tbDE1IGIvZG9jL2luZm9tYWlscy9pbmZvX21sMTUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM5MzZiZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9pbmZvbWFpbHMvaW5mb19tbDE1CkBAIC0wLDAgKzEsNzQgQEAKK0hlcnpsaWNoIHdpbGxrb21tZW4gaW0gS3JlaXNlIGRlciBNYWdpZXIhCitIYWxsbyBAV0VSMSwKKworaWNoIG5laG1lIGFuLCBkYXNzIERpciBEZWluIFNwb25zb3IgYmVyZWl0cyBlaW5pZ2UgSGlud2Vpc2UgdW5kIFRpcHMKK3VuZCB2b3IgYWxsZW4gRGluZ2VuIGRlbiB3ZWl0ZXJlbiBBYmxhdWYgRGVpbmVzIE1hZ2llcmRhc2VpbnMgaGllciBpbSBNRworZXJsYWV1dGVydCBoYXQuIFRyb3R6ZGVtIG1vZWNodGUgaWNoIERpciBhdWNoIG5vY2ggZWluIHBhYXIgSGlud2Vpc2UKK2dlYmVuLCBkYW1pdCBuaWNodHMgc2NoaWVmIGdlaHQuCisKK1p1bSBlaW5lbiBmaW5kZXN0IER1IHp1c2FldHpsaWNoZSBJbmZvcm1hdGlvbmVuIGluIGRlbiBIaWxmZXNlaXRlbiB6dQorIm1hZ2llciIgdW5kICJnZXNlbGxlbnN0dWVjayIuIExpZXMgRGlyIGRpZSBlaW5tYWwgaW4gUnVoZSBkdXJjaCB1bmQgd2VubgorRHUgZGF6dSBub2NoIHdlaXRlcmUgRnJhZ2VuIGhhc3QsIGthbm5zdCBEdSBEaWNoIGdlcm5lIGFuIERlaW5lbiBTcG9uc29yIAord2VuZGVuLgorCitEZXMgd2VpdGVyZW4gaGFzdCBEdSBtb21lbnRhbiBudXIgTGVzZXJlY2h0ZSBpbiAvZG9jLCBkYXMgaXN0IGRhcyAKK1ZlcnplaWNobmlzLCBpbiBkZW0gZGllIGdlc2FtdGUgRG9rdW1lbnRhdGlvbiBkZXMgTW9yZ2VuZ3JhdWVucworYWJnZWxlZ3QgaXN0LiBEdSBrYW5uc3QgRGlyIGRpZSBEYXRlaWVuIG1pdCBIaWxmZSBkZXMgQmVmZWhscyAibWFuIgorYW56ZWlnZW4gbGFzc2VuLiBFaW5lIFVlYmVyc2ljaHQgdWViZXIgZGllIFN0cnVrdHVyIGRlciBEb2t1bWVudGF0aW9uIHVuZAorZGllIFRoZW1lbiBkZXIgZWluemVsbmVuIFVudGVydmVyemVpY2huaXNzZSB2ZXJzY2hhZmZ0IERpciBkZXIgQmVmZWhsCisibW9yZSAvZG9jL1JFQURNRSIuCitVbnRlciAvZG9jL2JlaXNwaWVsZS8gYmVmaW5kZW4gc2ljaCBlaW4gcGFhciBCZWlzcGllbGUgZGVyIFByb2dyYW1taWVydW5nIAorbWl0IExQQyAtIGF1Y2ggd2VubiBsZWlkZXIgbmljaHQgYWxsZSBhdWYgZGVtIGFrdHVlbGxzdGVuIFN0YW5kIHNpbmQuCisKK0RlciBCZWZlaGwgIm1hbiA8YmVncmlmZj4iIGR1cmNoc3VjaHQgYWxsZSBkaWVzZSBWZXJ6ZWljaG5pc3NlIGF1dG9tYXRpc2NoCituYWNoIGRlbSBhbmdlZ2ViZW5lbiBCZWdyaWZmLCBkZXIgei5CLiBlaW5lIE11ZGxpYi1GdW5rdGlvbiBzZWluIGthbm4uCitXZW5uIGVyIGVpbmUgcGFzc2VuZGUgTWFucGFnZSBnZWZ1bmRlbiBoYXQsIHdpcmQgRGlyIGRpZXNlIGFuZ2V6ZWlndC4KK1Byb2JpZXIgZG9jaCB6LkIuIGVpbmZhY2ggbWFsICJtYW4gQWRkRXhpdCIgYXVzLCB1bSB6dSBlcmZhaHJlbiwgd2llIER1CitpbiBlaW5lbSBSYXVtIGVpbmVuIEF1c2dhbmcgYW5sZWdzdCwgb2RlciBzY2hhdSBtaXQgIm1hbiBQX0tJTExfTVNHIiBuYWNoLAord2llIER1IERlaW5lbSBOUEMgYmVpYnJpbmdzdCwgc2VpbmVuIEdlZ25lciBhdWYgZGVyIEViZW5lICJUb2QiIGFuZ2VtZXNzZW4KK3p1IHZlcnNwb3R0ZW4uIEF1ZiBkaWVzZSBXZWlzZSBrYW5uc3QgRHUgRGlyIGVpbmVuIGVyc3RlbiBVZWJlcmJsaWNrIHVlYmVyCitkaWUgRnVua3Rpb25hbGl0YWV0IHVuZCBBcmJlaXRzd2Vpc2UgZGVyIE11ZGxpYiB1bmQgZGVzIERyaXZlcnMgdmVyc2NoYWZmZW4uCitXaWUgaW1tZXIgZ2lsdCBhYmVyLCBkYXNzIERlaW4gU3BvbnNvciwgb2RlciBhdWNoIGRpZSBhbmRlcmVuIE1hZ2llciBEaXIKK2dlcm5lIHdlaXRlcmhlbGZlbiwgd2VubiBldHdhcyB1bmtsYXIgYmxlaWJlbiBzb2xsdGUuIFNjaGV1ZSBEaWNoIGJpdHRlCituaWNodCwgZWluZmFjaCBqZW1hbmRlbiB6dSBmcmFnZW4uCisKK1p1bSBBYmxhdWYgRGVpbmVzIEdlc2VsbGVuc3R1ZWNrcyBtb2VjaHRlIGljaCB6dW5hZWNoc3QgbnVyIHNvdmllbCBzYWdlbiwKK2Rhc3MgRHUgZXJzdCBhdWYgTWFnaWVybGV2ZWwgMjAgZWluIGVpZ2VuZXMgSG9tZS1WZXJ6ZWljaG5pcyBiZWtvbW1lbiB3aXJzdCwKK2luIGRlbSBEdSBkYW5uIGFyYmVpdGVuIGthbm5zdC4gVm9yaGVyIG11c3N0IER1IGRlbiBFcnptYWdpZXJuLCBpbnNiZXNvbmRlcmUKK2RlbSBmdWVyIGRpZSBHZXNlbGxlbnN0dWVja2UgenVzdGFlbmRpZ2VuICh3ZXIgZGFzIGlzdCwgYmVrb21tc3QgRHUgbWl0dGVscworImhpbGZlIGVyem1hZ2llciIgaGVyYXVzKSwgRGVpbiBLb256ZXB0IGZ1ZXIgZGllc2VzIEdlc2VsbGVuc3R1ZWNrIAorZXJsYWV1dGVybi4gU2VpIGRhYmVpIHJ1aGlnIGVpbiB3ZW5pZyBhdXNmdWVocmxpY2hlciB1bmQgc2NocmVpYiBlaW4gd2VuaWcKK2V0d2FzIHp1IHNhbW1lbi4gRmFsbHMgRHUgZWluIG5ldWVzIEdlYmlldCBzY2hyZWliZW4gbW9lY2h0ZXN0LCBpc3QgZWluZSAKK2tsZWluZSBBU0NJSS1LYXJ0ZSBhbHMgR2ViaWV0c3VlYmVyYmxpY2sgaW1tZXIgZ2VybiBnZXNlaGVuLgorCitFaW4gd2ljaHRpZ2VyIEhpbndlaXMgenVtIEtvbnplcHQ6IFNwcmljaCBiaXR0ZSByZWNodHplaXRpZyBtaXQgZGVtCit6dXN0YWVuZGlnZW4gUmVnaW9uc21hZ2llciBkZXIgUmVnaW9uLCBkaWUgRGVpbiBHUyBhdWZuZWhtZW4gc29sbCwgRGVpbmVtCitTcG9uc29yIHVuZCBhdWNoIG1pdCBkZW0gR1MtRU0gRGVpbiBHZXNlbGxlbnN0dWVjayBhYi4gQml0dGUgdGVpbGUgdW5zIGF1Y2ggCittaXQsIHdlbm4gRHUgd2FlaHJlbmQgZGVyIFByb2dyYW1taWVydW5nIEFlbmRlcnVuZ2VuIHZvcm5pbW1zdC4gSmUgYmVzc2VyCit3aXIgdW5zIGltIFZvcmZlbGQgYWJzcHJlY2hlbiwgZGVzdG8gd2VuaWdlciBQcm9ibGVtZSB0cmV0ZW4gYmVpIGRlciAKK0FibmFobWUgZHVyY2ggZGllIGJldGVpbGlndGVuIEluc3RhbnplbiBhdWYuIEVzIGhhdCBzaWNoIGF1c3NlcmRlbSBnZXplaWd0LAorZGFzcyBtYW4gc2FlbXRsaWNoZSAodW5kIGRhbWl0IG1laW5lIGljaCB3aXJrbGljaCBfYWxsZV8pIEFic3ByYWNoZW4gCitiZXp1ZWdsaWNoIGRlcyBLb256ZXB0cyBzYXViZXIgZG9rdW1lbnRpZXJlbiBzb2xsdGUsIHouQi4gcGVyIE1haWwuCisKK0JlaSBkZXIgQXVzYXJiZWl0dW5nIGVpbmVzIEtvbnplcHRlcyBpc3QgRGlyIGdlcm5lIERlaW4gU3BvbnNvciBvZGVyIAorYXVjaCBkZXIgUmVnaW9uc21hZ2llciBiZWhpbGZsaWNoIC0gamVkZXIgdm9uIGRlbmVuIGhhdCBzZWxiZXIgc2Nob24KK2VpbiBHUy1Lb256ZXB0IGVpbmdlcmVpY2h0IHVuZCBzb2xsdGUgZXR3YXMgZGF6dSBzYWdlbiBrb2VubmVuLiBGYWxscworRGlyIG5vY2ggZWluIHdlbmlnIGRpZSBJZGVlbiBhYmdlaGVuLCBzY2hhdSBkb2NoIGVpbmZhY2ggbWFsIGF1ZiBkYXMKK1Byb2pla3RicmV0dCBpbiBkZXIgQWJlbnRldXJlci1HaWxkZTogZG9ydCBzaW5kIGhhZXVmaWcgR2VzZWxsZW5zdHVlY2stCitQcm9qZWt0ZSBhdXNnZXNjaHJpZWJlbi4KKworV2VubiBEZWluIEtvbnplcHQgdm9ybGllZ3QgdW5kIHZvbSBVbWZhbmcgdW5kIFNjaHdpZXJpZ2tlaXQgaGVyIGZ1ZXIgCithdXNyZWljaGVuZCBiZWZ1bmRlbiB3dXJkZSwgc28gd2lyc3QgRHUgbmFjaCBjYS4gOCBUYWdlbiBhdWYgTWFnaWVybGV2ZWwKKzIwIGJlZm9lcmRlcnQuCitXZW5uIER1IG5vY2ggRnJhZ2VuIGhhc3QsIFNvcmdlbiwgTm9ldGUgby5hZS4gc28gc3RlaGVuIERpciBEZWluIFNwb25zb3IsCitqZWRlciBhbmRlcmUgTWFnaWVyIHVuZCBkZXIgR1MtRU0gbmF0dWVybGljaCBhdWNoIGdlcm5lIHp1ciBWZXJmdWVndW5nLgorCitJY2ggd3VlbnNjaGUgRGlyIGltIE5hbWVuIGRlciBNYWdpZXJzY2hhZnQgdmllbCBTcGFzcyBiZWltIFByb2dyYW1taWVyZW4gCit1bmQgaG9mZmUsIGRhc3MgRHUgc2Nob24gYmFsZCBlaW5lIE1haWwgbWl0IERlaW5lbSBLb256ZXB0IGFuIGRpZSBFcnptYWdpZXIKK2Fic2VuZGVuIHdpcnN0IQorCitWaWVsZSBHcnVlc3NlLCBEZWluIE1lcmxpbi4KKworUC5TLjogV2VubiBEdSBtYWdzdCwga2FubnN0IER1IGF1Y2ggZ2VybmUgZGllIEViZW5lbiAtbWFnaWVyIHVuZCAtbHBjIAorICAgICAgYmV0cmV0ZW4sIHVtIGRvcnQgZWluIHdlbmlnIG1pdHp1bGVzZW4gb2RlciBEZWluZSBlaWdlbmVuIEZyYWdlbgorICAgICAgbG9zenV3ZXJkZW4uCmRpZmYgLS1naXQgYS9kb2MvaW5mb21haWxzL2luZm9fbWwyMCBiL2RvYy9pbmZvbWFpbHMvaW5mb19tbDIwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMDExYTYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaW5mb21haWxzL2luZm9fbWwyMApAQCAtMCwwICsxLDgzIEBACitXaWxsa29tbWVuIGF1ZiBNYWdpZXJsZXZlbCAyMC4gOi0pCitIYWxsbyBAV0VSMSwKKworRHUgYmlzdCBnZXJhZGUgdm9uIG1pciBhdWYgTWFnaWVybGV2ZWwgMjAgYmVmb2VyZGVydCB3b3JkZW4uIERhcyAKK2JlZGV1dGV0IGZ1ZXIgRGljaCB2b3IgYWxsZW0sIGRhc3MgRGVpbiBLb256ZXB0IGZ1ZXIgZWluIEdlc2VsbGVuc3R1ZWNrCitkYXMgV29obHdvbGxlbiBkZXIgRXJ6bWFnaWVyIGdlZnVuZGVuIGhhdCB1bmQgYW5nZW5vbW1lbiB3dXJkZS4gSGVyemxpY2hlbgorR2x1ZWNrd3Vuc2NoIGVyc3QgZWlubWFsIGRhenUhIDotKQorCitXZWl0ZXJoaW4gd3VyZGUgamV0enQgYXVjaCBlaW4gSG9tZS1WZXJ6ZWljaG5pcyB1bnRlciAvcGxheWVycy9AV0VSMQorYW5nZWxlZ3QsIGluIGRlbSBEdSBkaWUgRGF0ZWllbiBEZWluZXMgR2VzZWxsZW5zdHVlY2tzIHVuZCBhbmRlcmVzIGFibGVnZW4KK2thbm5zdC4gVW50ZXIgL3BsYXllcnMvQFdFUjEvd29ya3Jvb20uYyBleGlzdGllcnQgamV0enQgYXVjaCBEZWluIGVpZ2VuZXIKK1dvcmtyb29tLCBpbiBkZW0gRHUgRGljaCBzdGFuZGFyZG1hZXNzaWcgbmFjaCBkZW0gRWlubG9nZ2VuIG1hdGVyaWFsaXNpZXJzdC4KKworQWxzIGtsZWluZSBIaWxmZXN0ZWxsdW5nIGZ1ZXIgRGVpbmUgQXJiZWl0IGFtIEdlc2VsbGVuc3R1ZWNrIG1vZWNodGVuIERpcgorZGllIEVyem1hZ2llciBlaW5pZ2UgVGlwcyBtaXQgYXVmIGRlbiBXZWcgZ2ViZW4sIGRpZSBEaXIgZGFzIExlYmVuIAoraG9mZmVudGxpY2ggZXJsZWljaHRlcm4uCisKKzEpIFp1ciBQcm9ncmFtbWllcnVuZzoKKworICAgSW0gTXVkIHNlbGJzdCBrYW5uc3QgRHUgbnVyIHVlYmVyIGRlbiBaZWlsZW4tVGV4dGVkaXRvciAiZWQiIGV0d2FzCisgICBwcm9ncmFtbWllcmVuLiBIaWxmZSB6dSBkaWVzZW0gV2Vya3pldWcgYmVrb21tc3QgRHUgdWViZXIgIm1hbiBlZCIKKyAgIHVuZCAibWFuIGVkMC4uZWQ1Ii4gQWxzIHNpbm52b2xsZSBBbHRlcm5hdGl2ZSBzdGVodCBEaXIgZWluIEZUUC0KKyAgIFp1Z2FuZyB6dXIgVmVyZnVlZ3VuZywgdWViZXIgZGVuIER1IGRpZSBhdWYgRGVpbmVtIGVpZ2VuZW4gUmVjaG5lcgorICAgZ2VzY2hyaWViZW5lbiBGaWxlcyBpbnMgTXVkIGtvcGllcmVuIGthbm5zdC4gSGllcmJlaSBrYW5uc3QgRHUgZGFubgorICAgRGVpbmVuIGVpZ2VuZW4gRWRpdG9yIHZlcndlbmRlbi4gQml0dGUgYWNodGUgYWJlciBkYXJhdWYsIGRhc3MgRHUKKyAgIGFscyBEYXRlaWZvcm1hdCBkYXMgVW5peC1Gb3JtYXQgdmVyd2VuZGVzdC4gQXVjaCB1bnRlciBXaW5kb3dzIAorICAgYmVoZXJyc2NoZW4gaW56d2lzY2hlbiBkaWUgbWVpc3RlbiBFZGl0b3JlbiBkaWVzZXMgRGF0ZWlmb3JtYXQuCisKKyAgIFVtIHZlcm51ZW5mdGlnIGFyYmVpdGVuIHp1IGtvZW5uZW4sIHNvbGx0ZXN0IER1IERpciBkYXMgTUdUb29sICh6dQorICAgZmluZGVuIHVudGVyIC9vYmovdG9vbHMvTUd0b29sKSBiZXNjaGFmZmVuIChkaWUgSGlsZmUgaGllcnp1IGZpbmRlc3QKKyAgIER1IGRhbm4gbWl0dGVscyAieG1hbiIpLiBXZWl0ZXJoaW4gc2VpIERpciBkcmluZ2VuZCBkaWUgVmVyd2VuZHVuZyBkZXMKKyAgIEZlaGxlcnRldWZlbHMgKHNpZWhlICJoaWxmZSBmZWhsZXJ0ZXVmZWwiKSBlbXBmb2hsZW4sIGRlciBEaXIgZGllCisgICBGZWhsZXJzdWNoZSBzdGFyayBlcmxlaWNodGVydC4gV2llIER1IGRpZXNlIE9iamVrdGUgY2xvbnN0LCBrYW5uIERpcgorICAgRGVpbiBTcG9uc29yIG9kZXIgZWluIGFuZGVyZXIgTWFnaWVyIHNpY2hlciB6ZWlnZW4uCisKKyAgIFdlaXRlcmhpbiBzb2xsdGVzdCBEdSBudW4genVzYWV0emxpY2ggbm9jaCBkaWUgRWJlbmVuIC1kZWJ1ZywgCisgICAtZW50d2lja2x1bmcgdW5kIC13YXJudW5nZW4gZWluc2NoYWx0ZW4sIGF1ZiBkZW5lbiBEdSB1ZWJlciBhdWZ0cmV0ZW5kZQorICAgQnVncyBpbmZvcm1pZXJ0IHdpcnN0IChuaWNodCBudXIgRGVpbmUgZWlnZW5lbiwgYWJlciBEdSB3aXJzdCBEaWNoCisgICBkYW1pdCBzaWNoZXIgc2NobmVsbCB6dXJlY2h0ZmluZGVuKS4KKworICAgV2FzIGZvcm1hbGUgdW5kIGF1Y2ggaW5oYWx0bGljaGUgQW5mb3JkZXJ1bmdlbiBhbiBEZWluZW4gQ29kZSBhbmdlaHQsCisgICBsaWVzIERpciBiaXR0ZSAiaGlsZmUgcmVnaW9uc2xlaXRmYWRlbiIgZHVyY2gsIGhpZXIgZmluZGVzdCBEdSBhbGxlcworICAgd2VzZW50bGljaGUga29tcGFrdCB6dXNhbW1lbmdlZmFzc3QuIFdlbm4gZGFydWViZXIgaGluYXVzIHNwZXppZWxsZQorICAgRnJhZ2VuIHp1IGRlciBSZWdpb24gYmVzdGVoZW4sIGRpZSBEZWluIEdlc2VsbGVuc3R1ZWNrIHNwYWV0ZXIgYXVmbmVobWVuCisgICBzb2xsLCBrYW5uc3QgRHUgZ2VybmUgYXVjaCBkZW4gUmVnaW9uc21hZ2llciBhbnNwcmVjaGVuLiBEdSBzb2xsdGVzdCAKKyAgIGFiZXIgYXVmIGplZGVuIEZhbGwgZGF2b24gYXVzZ2VoZW4sIGRhc3MgZGllc2VyIERpciBudXIgc2VociBnZXJpbmdlCisgICBBYndlaWNodW5nZW4gdm9uIGRlbiBpbSBSZWdpb25zbGVpdGZhZGVuIGJlc2NocmllYmVuZW4gU3RhbmRhcmRzIHp1Z2UtCisgICBzdGVoZW4gd2lyZCwgd2VubiB1ZWJlcmhhdXB0IChpbnNiZXNvbmRlcmUgd2lyZCB2aWVsIFdlcnQgYXVmIGVpbmUgCisgICBzaW5udm9sbGUgS29tbWVudGllcnVuZyBEZWluZXMgQ29kZXMgZ2VsZWd0KS4KKworMikgWnVyIEZlcnRpZ3N0ZWxsdW5nIHVuZCBBYm5haG1lIGRlcyBHZXNlbGxlbnN0dWVja3M6CisKKyAgIERlciB1ZWJsaWNoZSBBYmxhdWYgaXN0IGRlciwgZGFzcyBkZXIgenVzdGFlbmRpZ2UgUmVnaW9uc21hZ2llcgorICAgKGRlbiBEdSBzY2hvbiB2b24gZGVyIEtvbnplcHRwaGFzZSBoZXIga2VubmVuIGR1ZXJmdGVzdCkgRGVpbiAKKyAgIEdlc2VsbGVuc3R1ZWNrIGFscyBlcnN0ZXIgYWJuaW1tdCB1bmQgc2VpbmUgQW5tZXJrdW5nZW4gZGF6dSBnaWJ0LgorICAgV2VubiBkaWVzZSBnZWtsYWVydCB1bmQgdW1nZXNldHp0IHNpbmQsIGlzdCBkZXIgR1MtRXJ6bWFnaWVyIGFuIGRlcgorICAgUmVpaGUsIGRlciBEZWluIFdlcmsgbm9jaG1hbHMgZHVyY2hzaWVodCB1bmQgZXZ0bC4gd2VpdGVyZSBLb21tZW50YXJlCisgICBkYXp1IGFldXNzZXJ0LiBXZW5uIGRpZXNlIGJlaWRlbiBTY2hyaXR0ZSBlcmxlZGlndCBzaW5kLCBpc3QgRGVpbgorICAgR2VzZWxsZW5zdHVlY2sgZmFzdCBmZXJ0aWcgZnVlciBkZW4gQW5zY2hsdXNzLgorCisgICBJbiBkZXIgUmVnZWwgaXN0IGpldHp0IGF1Y2ggZGVyIFplaXRwdW5rdCBnZWtvbW1lbiwgZGFzcyBEdSB6dW0KKyAgIFZvbGxtYWdpZXIgKExldmVsIDIxKSBiZWZvZXJkZXJ0IHdlcmRlbiBrYW5uc3QgdW5kIERlaW4gQ29kZSBpbgorICAgZGllIFJlZ2lvbiBrb3BpZXJ0IHdpcmQsIGluIGRlciBlciBhbmdlc2NobG9zc2VuIHdlcmRlbiB3aXJkLgorCisgICBBbGxlcmRpbmdzIHNlaSBEaXIgZWluIFB1bmt0IGpldHp0IHNjaG9uIGFucyBIZXJ6IGdlbGVndDogU29sbHRlc3QKKyAgIER1IE9iamVrdGUgaW4gRGVpbmVtIEdlc2VsbGVuc3R1ZWNrIGJhdWVuIHdvbGxlbiwgZGllIHZvbiBkZXIgQmFsYW5jZQorICAgZ2VuZWhtaWd0IHdlcmRlbiBtdWVzc2VuIChzaWVoZSBoaWVyenUgenVuYWVjaHN0ICJtYW4gYmFsYW5jZSIgdW5kIAorICAgIm1hbiBncmVuendlcnRlIiksIHNvbGx0ZXN0IER1IGRlbiBub2V0aWdlbiBBbnRyYWcgcmVjaHR6ZWl0aWcgc3RlbGxlbiwKKyAgIGRhIGRpZSBFcmZhaHJ1bmcgemVpZ3QsIGRhc3Mgc29sY2hlIEVudHNjaGVpZHVuZ2VuIGluIGRlciBSZWdlbCBuaWNodAorICAgdm9uIGhldXRlIGF1ZiBtb3JnZW4gZ2V0cm9mZmVuIHdlcmRlbiBrb2VubmVuLiAKKyAgIEhpbGZlc3RlbGx1bmcgYmVpIGRlciBGcmFnZSwgd2FzIGdlbmVobWlndCB3ZXJkZW4gbXVzcywgZ2lidCBkaWUKKyAgIEJhbGFuY2UgZ2VybmUgYXVmIEFuZnJhZ2UsIGFuc29uc3RlbiB3aXJkIGFiZXIgYXVjaCBqZWRlciBlcmZhaHJlbmUKKyAgIE1hZ2llciBhdXNoZWxmZW4gb2RlciB6dW1pbmRlc3QgZWluZW4gQW5zcHJlY2hwYXJ0bmVyIHZlcm1pdHRsbiBrb2VubmVuLgorCitEYW1pdCB1ZWJlcmxhc3NlIGljaCBEaWNoIG51biBEZWluZXIgQXJiZWl0IGFtIEdTLiBXZW5uIER1IG5vY2ggRnJhZ2VuCitoYXN0ICh3YXMgc2ljaGVyIGRlciBGYWxsIHNlaW4gd2lyZCksIHNjaGV1ZSBEaWNoIG5pY2h0LCBzaWUgenUgc3RlbGxlbiwgCitvYiBhdWYgZWluZXIgZGVyIE1hZ2llcmViZW5lbiBvZGVyIGRpcmVrdCBEZWluZW0gU3BvbnNvciBvZGVyIGFuZGVyZW4gCitNYWdpZXJuISBFcyB3aXJkIHNpY2ggc2ljaGVyIGplbWFuZCBmaW5kZW4sIGRlciBEaXIgaGVsZmVuIGthbm4gb2RlciBkZXIKK0RpY2ggenVtaW5kZXN0IGF1ZiBkaWUgcmljaHRpZ2UgRmFlaHJ0ZSBicmluZ3QuCisKK1ZpZWxlIEdydWVzc2UgdW5kIHZpZWwgRXJmb2xnLAorRGVpbiBNZXJsaW4uCisKZGlmZiAtLWdpdCBhL2RvYy9pbmZvbWFpbHMvaW5mb19tbDIxIGIvZG9jL2luZm9tYWlscy9pbmZvX21sMjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAxMzMwNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9pbmZvbWFpbHMvaW5mb19tbDIxCkBAIC0wLDAgKzEsMzIgQEAKK0dyYXR1bGF0aW9uIHp1ciBCZWZvZXJkZXJ1bmcgenVtIFZvbGxtYWdpZXIKK0hhbGxvIEBXRVIxLAorCitpY2ggYmluJ3MgbWFsIHdpZWRlciwgZGVyIE1lcmxpbi4gOi0pCisKK0R1IGJpc3QgamEgamV0enQgYXVmIE1hZ2llcmxldmVsIDIxIGFuZ2Vrb21tZW4sIGRhcyBoZWlzc3QsIGljaCBrYW5uIERpcgorYXVmIGRpZXNlbSBXZWdlIHp1ciBlcmZvbGdyZWljaGVuIEFibmFobWUgRGVpbmVzIEdlc2VsbGVuc3R1ZWNrcyAKK2dyYXR1bGllcmVuISBXYXIgamEgYXVjaCBlaW5lIE1lbmdlIEFyYmVpdCwgb2Rlcj8gOy0pCisKK0Jldm9yIER1IGpldHp0IGFiZXIgZnJldWRlc3RyYWhsZW5kIGFuc2NobGllc3NlbiBrYW5uc3QsIG1vZWNodGUgaWNoIERpY2gKK2F1ZiBlaW5pZ2UgRGluZ2UgaGlud2Vpc2VuLCBkaWUgdm9yIGRlbSBBbnNjaGx1c3MgZXJsZWRpZ3Qgd2VyZGVuIG11ZXNzZW4uCitLZWluZSBTb3JnZSwgZGFzIGlzdCBuaWNodCBhbGx6dXZpZWwsIHVuZCBtZWlzdCByZWNodCBzY2huZWxsIGVybGVkaWd0LgorCitBbHMgZXJzdGVzIHdpcmQgc2ljaGVybGljaCBkZXIgUmVnaW9uc21hZ2llciBEZWluZW4gQ29kZSBpbiBzZWluZSBSZWdpb24KK2tvcGllcmVuIChsYXNzdCBiaXR0ZSBuaWNodHMgZGF2b24gaW4gRGVpbmVtIEhvbWUtVmVyemVpY2huaXMgenVydWVjaywKK2RhcyBrYW5uIHNwYWV0ZXIgZWluZSBNZW5nZSBBZXJnZXIgdmVydXJzYWNoZW4pLiBEZXIgQ29kZSBrYW5uIGFiZXIgZXJzdCAKK2FuZ2VzY2hsb3NzZW4gd2VyZGVuLCB3ZW5uIGRpZSBGb3JzY2hlcnB1bmt0ZSAoRlApLCBaYXViZXJ0cmFuay1GdW5kb3J0ZQorKFpUcykgdW5kIEVyc3RraWxsc3R1ZmVucHVua3RlIChFS3MpIGJlYW50cmFndCB1bmQgZ2VuZWhtaWd0IHNpbmQKKyhkaWUgaGllcmZ1ZXIgenVzdGFlbmRpZ2VuIEVNcyBzaW5kIGluICJoaWxmZSBlcnptYWdpZXIiIGF1ZmdlZnVlaHJ0KS4KK0R1IHdpcnN0IGhpZXJmdWVyIC0gamUgbmFjaCBaZWl0YXVmd2FuZCBmdWVyIGRpZSBiZXRlaWxpZ3RlbiBFTXMgLSBlaW5lCitnZXdpc3NlIFdhcnRlemVpdCB2b3IgZGVtIEFuc2NobHVzcyBlaW5rYWxrdWxpZXJlbiBtdWVzc2VuLiBJbiBkaWVzZXIgCitaZWl0IGthbm5zdCBEdSBqYSBzY2hvbiBlaW5tYWwgZWluZW4gc2Nob2VuZW4gQXJ0aWtlbCB6dXIgc3RpbGVjaHRlbgorQW5rdWVuZGlndW5nIGluIGRlciBNUEEgZW50d2VyZmVuLgorV2VpdGVyaGluIG11ZXNzZW4gbmF0dWVybGljaCBhbGxlIEJhbGFuY2UtcmVsZXZhbnRlbiBPYmpla3RlIGdlbmVobWlndCBzZWluLgorCitXZW5uIGRhcyBhbGxlcyBlcmxlZGlndCBpc3QsIHVuZCBkYW1pdCBEZWluIFdlcmsgYW5zY2hsdXNzZmVydGlnLCB3aXJkCitEaWNoIGRlciBSZWdpb25zbWFnaWVyIGF1ZiBNYWdpZXJsZXZlbCAyNSBiZWZvZXJkZXJuLiBTb2JhbGQgZGFzIGdlc2NoYWZmdAoraXN0LCB2ZXJnaXNzIG5pY2h0LCBtaWNoIHp1ciBQYXJ0eSBlaW56dWxhZGVuISA6LSkKKworTGllYmUgR3J1ZXNzZSwKK0RlaW4gTWVybGluCisKZGlmZiAtLWdpdCBhL2RvYy9pbmZvbWFpbHMvaW5mb19tbDI1IGIvZG9jL2luZm9tYWlscy9pbmZvX21sMjUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIwMWE4YgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9pbmZvbWFpbHMvaW5mb19tbDI1CkBAIC0wLDAgKzEsMzggQEAKK0R1IGFyYmVpdGVzdCBqZXR6dCBhbiBlaW5lciBSZWdpb24gbWl0IQorSGFsbG8gQFdFUjEsCisKK21pdCBkZXIgQmVmb2VyZGVydW5nIGF1ZiBNYWdpZXJsZXZlbCAyNSBpc3QgamV0enQgRGVpbiBHZXNlbGxlbnN0dWVjaworZW5kZ3VlbHRpZyBhbmdlc2NobG9zc2VuIHVuZCB3aXJkIHNpY2hlciBpbiBLdWVyemUgdmllbGZhY2hlbiBadXNwcnVjaAordm9uIFNwaWVsZXJuIGZpbmRlbiEKKworSWNoIHd1ZXJkZSBtaWNoIGZyZXVlbiwgd2VubiBEdSBhdWNoIG5hY2ggZGVtIEFuc2NobHVzcyBpbW1lciBtYWwgZWluCitBdWdlIGF1ZiBEZWluZW4gQ29kZSB3ZXJmZW4gd3VlcmRlc3QsIHVtIChkaWUgZ2VyYWRlIGluIGRlciBBbmZhbmdzemVpdAorcmVjaHQgaGFldWZpZ2VuKSBCdWdzIHp1IGJlaGViZW4uIEljaCBoYWV0dGUgYWJlciBuYXR1ZXJsaWNoIGF1Y2gKK3VlYmVyaGF1cHQgbmljaHRzIGRhZ2VnZW4sIHdlbm4gRHUgbm9jaCBtZWhyIGZ1ZXJzIE1vcmdlbmdyYXVlbiBlbnR3aWNrZWxuCit3b2xsdGVzdC4gV2VubiBEdSBJZGVlbiBkYWZ1ZXIgaGFzdCwgZGFubiBzcHJpY2ggZG9jaCBlaW5mYWNoIG1pdCBlaW5lbQorUmVnaW9uc21hZ2llciwgaW4gZGVzc2VuIFJlZ2lvbiBEdSBlaW4gUGxhZXR6Y2hlbiBkYWZ1ZXIgYmVub2V0aWdzdCEgOi0pCisKK0FuIGRpZXNlciBTdGVsbGUgc2VpIERpciBlcm5ldXQgZGVyIEhpbndlaXMgYXVmIHNvcmdmYWVsdGlnZQorRG9rdW1lbnRhdGlvbiBEZWluZXMgS29uemVwdHMgdW5kIGRlciBBYnNwcmFjaGVuIG1pdCBkZW0gUk0gZHJpbmdlbmQgYW5zCitIZXJ6IGdlbGVndC4gU293YXMgaGF0IHVlYmVyaGF1cHQgbmljaHRzIG1pdCBNaXNzdHJhdWVuIERpciBvZGVyIGRlbSBSTQorZ2VnZW51ZWJlciB6dSB0dW4sIHNvbmRlcm4gZWluZmFjaCBkYW1pdCwgZGFzcyBtYW4gYXVmIGRpZXNlIFdlaXNlIAorTWlzc3ZlcnN0YWVuZG5pc3NlbiB2b3JiZXVnZW4ga2FubiAtIGFsbGVpbiBkaWUgVm9yc3RlbGx1bmcsIHdhcyBlaW4KKyJrbGVpbmVzIiBvZGVyICJncm9lc3NlcmVzIiBHZWJpZXQgc2VpbiBzb2xsLCB1bnRlcnNjaGVpZGV0IHNpY2ggdGVpbHMKK2VyaGVibGljaCB6d2lzY2hlbiB6d2VpIFBlcnNvbmVuLiAoVWVicmlnZW5zIHNvbGx0ZXN0IER1IGZ1ZXIgZGVuIEZhbGwsIAorZGFzcyBkZXIgZnVlciBEZWluZSBSZWdpb24genVzdGFlbmRpZ2UgUmVnaW9uc21hZ2llciBlaW5tYWwgd2VjaHNlbG4gc29sbHRlLAorZGVtIG5ldWVuIFJNIERlaW4gS29uemVwdCB2b3JsZWdlbiwgdW0gc2ljaGVyenVnZWhlbiwgZGFzcyBkaWVzZXIgZGF2b24KK0tlbm50bmlzIGhhdCB1bmQgZ2dmLiBzZWluZSBBbnNpY2h0IGJlcnVlY2tzaWNodGlnZW4genUga29lbm5lbi4pCisKK1NvbGx0ZXN0IER1IERpY2ggaGluZ2VnZW4genUgaG9laGVyZW0gYmVydWZlbiBmdWVobGVuLCB1bmQgZ2VybmUgc2VsYnN0CitlaW5lIFJlZ2lvbiBhbHMgUk0gdWViZXJuZWhtZW4gd29sbGVuLCBvZGVyIGFuZGVyZSBBdWZnYWJlbiBhbHMgTWFnaWVyCit3YWhybmVobWVuLCBzbyBrYW5uc3QgRHUgZ2VybmUgZWluZW4gRXJ6bWFnaWVyIGFuc3ByZWNoZW4gb2RlciBEaWNoIGRpcmVrdAorYmV3ZXJiZW4uIEF1Y2ggd2VubiBtYW4gZ2VybmUgYW5kZXJlcyBlcnphZWhsdDogZGllIGJlaXNzZW4gYWxsZSBuaWNodC4gOy0pCisKK0FjaHNvLCBlaW5zIG5vY2g6IFdlbm4gRHUgc2VsYnN0IGVpbmVuIFNlaGVyIHNwb25zb3JuIG1vZWNodGVzdCwgYWxzbworZGllc2VuIHp1bSBNYWdpZXIgbWFjaGVuLCBiZW5vZXRpZ3N0IER1IE1hZ2llcmxldmVsIDI2IGRhZnVlci4gRGllc2VuCitrYW5uc3QgRHUgZHVyY2ggQmVmb2VyZGVydW5nIHNlaXRlbnMgRGVpbmVzIFJlZ2lvbnNtYWdpZXJzIGVycmVpY2hlbi4gCitTcHJpY2ggaWhuIGRvY2ggZWluZmFjaCBtYWwgZGFyYXVmIGFuLgorCitWaWVsZSBHcnVlc3NlLAorRGVpbiBNZXJsaW4uCisKZGlmZiAtLWdpdCBhL2RvYy9pbmZvbWFpbHMvaW5mb19tbDQ1IGIvZG9jL2luZm9tYWlscy9pbmZvX21sNDUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZmZDRiOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9pbmZvbWFpbHMvaW5mb19tbDQ1CkBAIC0wLDAgKzEsMjEgQEAKK1dpbGxrb21tZW4gaW0gS3JlaXMgZGVyIFJlZ2lvbnNtYWdpZXIhCitIZXJ6bGljaGVuIEdsdWVja3d1bnNjaCBAV0VSMSEKKworSWNoIGZyZXVlIG1pY2gsIGRhc3MgRHUgaW4gZGVuIEtyZWlzIGRlciBSZWdpb25zbWFnaWVyIGF1Zmdlbm9tbWVuIHd1cmRlc3QKK3VuZCBkYXMgTW9yZ2VuR3JhdWVuIGpldHp0IGVpbmVuIHdlaXRlcmVuIGFrdGl2ZW4gTWFnaWVyIHp1ciBQZmxlZ2UgZGVyCitSZWdpb25lbiBoYXQuIDotKQorVW0gRGlyIGRpZSBBcmJlaXQgenUgZXJsZWljaHRlcm4sIGhhYmVuIERlaW5lIEtvbGxlZ2VuIGhhZXVmaWcgZ2VmcmFndGUKK0ZyYWdlbiBiencuIGhhZXVmaWdlIFRhZXRpZ2tlaXRlbiBlaW5lcyBSTXMgenVzYW1tZW5nZXN0ZWxsdC4gSWNoCitlbXBmZWhsZSBEaXIgZGFoZXIsIGRpZXNlcyBIb3d0byB6dSBsZXNlbiwgRHUgZmluZGVzdCB3aWNodGlnZSBIaW53ZWlzZQorZG9ydDogJ21hbiBybS1ob3d0bycuCitFYmVuZmFsbHMgdm9uIEludGVyZXNzZSBpc3QgZnVlciBEaWNoIHNpY2hlcmxpY2ggZGllIEhpbGZlc2VpdGUgCisicmVnaW9uc21hZ2llciIsIHdlbGNoZXMgZWluaWdlIHdlaXRlcmUgSW5mb3JtYXRpb25lbiBmdWVyIERpY2ggaGF0LgorRmFsbHMgRHUgZWlubWFsIERpc2t1c3Npb25lbiBmdWVocmVuIHdpbGxzdCAob2RlciBGcmFnZW4gaGFzdCksIGRpZSBEdSBudXIgbWl0CitEZWluZW4gUmVnaW9uc21hZ2llcmtvbGxlZ2VuIChiencuIFJNKykgZXJvZXJ0ZXJuIG1vZWNodGVzdCwga2FubnN0IER1IGhpZXJ6dQorZGllIE1QQS1SdWJyaWsgJ3JlZ2lvbnNtYWdpZXInIGJlbnV0emVuLgorCitVbmQgbnVuIHd1ZW5zY2hlIGljaCBEaXIgdmllbCBTcGFzcyBpbiBEZWluZW0gbmV1ZW4gQW10IQorCitMaWViZSBHcnVlc3NlLAorICAgICAgTWVybGluCisKZGlmZiAtLWdpdCBhL2RvYy9sZnVuLy5kZWZhdWx0IGIvZG9jL2xmdW4vLmRlZmF1bHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUxOWY2OQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuLy5kZWZhdWx0CkBAIC0wLDAgKzEsMTYgQEAKK211c3RlcigpCisKK0ZVTktUSU9OOgorCXR5cGUgbXVzdGVyKC4uLikKKwkKK0FSR1VNRU5URToKKwkKK0JFU0NIUkVJQlVORzoKKworUlVFQ0tHQUJFV0VSVDoKKwkKK0JFTUVSS1VORzoKKwkKK0JFSVNQSUVMOgorCitTSUVIRSBBVUNIOgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vLnN5bm9ueW0gYi9kb2MvbGZ1bi8uc3lub255bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2M5MmE1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vLnN5bm9ueW0KQEAgLTAsMCArMSwxNCBAQAorQV9DT04gUXVlcnlBdHRyaWJ1dGUKK0FfREVYIFF1ZXJ5QXR0cmlidXRlCitBX0lOVCBRdWVyeUF0dHJpYnV0ZQorQV9TVFIgUXVlcnlBdHRyaWJ1dGUKK3BhdGhkIFNlYXJjaFBhdGgKK3FwcCBRdWVyeVBvc3NQcm9ub3VuCitTUF9OQU1FIERlZmVuZAorU1BfTk9fQUNUSVZFX0RFRkVOU0UgRGVmZW5kCitTUF9OT19FTkVNWSBEZWZlbmQKK1NQX1BIWVNJQ0FMX0FUVEFDSyBEZWZlbmQKK1NQX1JFQ1VSU0lWRSBEZWZlbmQKK1NQX1JFRFVDRV9BUk1PVVIgRGVmZW5kCitTUF9TSE9XX0RBTUFHRSBEZWZlbmQKK1Rlc3RJZ25vcmVFeHQgVGVzdElnbm9yZQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vQWRkQWN0aW9uIGIvZG9jL2xmdW4vQWRkQWN0aW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMTgzY2EKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9BZGRBY3Rpb24KQEAgLTAsMCArMSw3NiBAQAorQWRkQWN0aW9uKEwpCitGVU5LVElPTjoKKyAgICAgdmFyYXJncyB2b2lkIEFkZEFjdGlvbihtaXhlZCBmdW4sIG1peGVkIGNtZCwgaW50IGZsYWcsIGludCBsdmwpOworCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvcGxheWVyL2NvbW1hbmQuYworCitBUkdVTUVOVEU6CisgICAgIGZ1bgl6dSBydWZlbmRlIE1ldGhvZGUgaW0gU3BpZWxlciBvZGVyIGVpbmUgQ2xvc3VyZQorICAgICBjbWQJYXVzbG9lc2VuZGVzIEtvbW1hbmRvdmVyYgorICAgICBmbGFnCXVuc2NoYXJmIGF1c2Z1ZWhyZW4KKyAgICAgbHZsCWFiIHdlbGNoZW0gKE1hZ2llcmxldmVsKSBmdW5rdGlvbmllcnQgZGFzIEtvbW1hbmRvCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGVtIFNwaWVsZXIgd2lyZCBlaW4gbmV1ZXMgS29tbWFuZG8gZGVmaW5pZXJ0LiBEaWVzZXMga2FubiBlaW5lIE1ldGhvZGUKKyAgICAgaW4gaWhtIHNlaW4sIHNvIHdpZSBiZWkgYWxsZW4gU3BpZWxlcmtvbW1hbmRvcyB1ZWJsaWNoLCBrYW5uIGFiZXIgYXVjaAorICAgICBlaW5lIENsb3N1cmUgKExmdW4tQ2xvc3VyZSBvZGVyIExhbWJkYSkgZW50aGFsdGVuLgorCisgICAgIE1pdHRlbHMgImZsYWciIGthbm4gbWFuIGRpZSBLb21tYW5kb2Vya2VubnVuZyB1bnNjaGFyZiBoYWx0ZW4sIGQuaC4gd2llCisgICAgIGJlaSBBZGRDbWQoTCkgdW5kIGFkZF9hY3Rpb24oRSkgd2lyZCBlaW4gJ2NtZCcgYmVpICdmbGFnID0gMScgYXVjaAorICAgICBzY2hvbiB2b24gUHJhZWZpeC1TdHJpbmdzIChoaWVyIG9obmUgTGVlcnplaWNoZW4pIGdldHJpZ2dlcnQ6CisgICAgIEFkZEFjdGlvbihbLi4uXSwgIm11aCIsIDEsIDApIHdpcmQgekIgYXVjaCB2b24gJ211aHRlbnMnIG9kZXIgJ211aDQnCisgICAgIGF1c2dlbG9lc3QuCisKKyAgICAgTWl0ICJsdmwiIGJlZ3Jlbnp0IG1hbiBkaWUgQXVzZnVlaHJiYXJrZWl0LiBTcGllbGVyIGhhYmVuIGVpbgorICAgICBNYWdpZXJsZXZlbCB2b24gMCwgU2VoZXIgdm9uIDEuCisKKyAgICAgRGFzIEtvbW1hbmRvIHdpcmQgaW4gUF9MT0NBTENNRFMgZWluZ2V0cmFnZW4uIERpZXNlIFByb3BlcnR5IHdpcmQKKyAgICAgbmljaHQgZ2VzcGVpY2hlcnQhIEVmZmVrdGl2IGthbm4gbWFuIG1pdCBBZGRBY3Rpb24oKSBlaW4ga29tbWFuZG8tCisgICAgIGdlYmVuZGVzIE9iamVrdCBpbSBTcGllbGVyIGVpbnNwYXJlbi4KKworQkVNRVJLVU5HRU46CisgICAgIC0gZXMgZ2lidCBfbm9jaF8ga2VpbiBSZW1vdmVBY3Rpb24hIFBlciBIYW5kIGluIFBfTE9DQUxDTURTIGVkaXRpZXJlbgorICAgICAgIGthbm4genUgZXJuc3RlbiBGZWhsZXJuIGZ1ZWhyZW4uCisgICAgIC0gZWNodGUgU3BpZWxlcmtvbW1hbmRvcyBrYW5uIG1hbiBkYW1pdCBfbmljaHRfIHVlYmVyc2NocmVpYmVuLAorICAgICAgIGVpbiBBZGRBY3Rpb24oLi4uLCJzYWciLDEsMCk7IGZ1bmt0aW9uaWVydCBuaWNodAorICAgICAtIGVpbiBnZW5lcmVsbGVzIEFkZEFjdGlvbiguLi4sIiIsMSwwKTsgZ2VodCBuaWNodAorCitCRUlTUElFTEU6CisgICAgIC4uLgorICAgICB0aGlzX3BsYXllcigpLT5BZGRBY3Rpb24oc3ltYm9sX2Z1bmN0aW9uKCJ6ZWlnZV9teXN0ZXJpdW0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRfb2JqZWN0KCIuLi4vbXlzdHplaWdlciIpKSwKKwkJCSAgICAgICJrbm9yZnVsYSIsMCwwKTsKKyAgICAgd3JpdGUoYnJlYWtfc3RyaW5nKCJXYW5uIGltbWVyIGR1IGpldHp0IGRhcyBLb21tYW5kbyBcImtub3JmdWxhXCIgIgorCQkJImVpbmdpYnN0LCB3ZXJkZW4gZGlyIE15c3RlcmllbiBlbnRodWVsbHQhIiw3OCkpOworICAgICAuLi4KKworICAgICAvLyBpbSBPYmpla3QgImtub3JmdWxhIiAuLi4KKyAgICAgaW50IHplaWdlX215c3Rlcml1bShzdHJpbmcgc3RyKSB7CisgICAgICAgc3RyaW5nIG15c3Q7CisgICAgICAgbXlzdD1lbnZpcm9ubWVudChUUCktPlF1ZXJ5TXlzdGVyaXVtKHN0cik7CisgICAgICAgaWYobXlzdCkgeworICAgICAgICAgd3JpdGUoIkR1IGhhc3QgZWluIE15c3Rlcml1bSBlbnRkZWNrdCFcbiIpOworCSB3cml0ZShicmVha19zdHJpbmcobXlzdCw3OCkpOworCSBzYXkoYnJlYWtfc3RyaW5nKAorCQlUUC0+TmFtZShXRVIpKyIgc2NoZWludCBuYWNoIGt1cnplciBLb256ZW50cmF0aW9uIGV0d2FzICIKKwkJImVudGRlY2t0IHp1IGhhYmVuISIsNzgpKTsKKyAgICAgICB9IGVsc2UgeworICAgICAgICAgd3JpdGUoYnJlYWtfc3RyaW5nKAorCQkiTGVpZGVyIGVudGRlY2tzdCBkdSB0cm90eiBkZWluZXIgbWFnaXNjaGVuIEZhZWhpZ2tlaXQgIgorCQkia2VpbiBNeXN0ZXJpdW0gaW4gZGVpbmVyIFVtZ2VidW5nLiIsNzgpKTsKKwkgc2F5KGJyZWFrX3N0cmluZygKKwkJVFAtPk5hbWUoV0VSKSsiIGtvbnplbnRyaWVydCBzaWNoIHNpY2h0YmFyLCBzaWVodCBkYW5uICIKKwkJImplZG9jaCBldHdhcyBlbnR0YWV1c2NodCBhdXMuIiw3OCkpOworICAgICAgIH0KKyAgICAgICByZXR1cm4gMTsKKyAgICAgfQorCitTSUVIRSBBVUNIOgorCQkJUF9MT0NBTENNRFMKKyAgICAgRmVobGVybWVsZHVuZ2VuOglub3RpZnlfZmFpbChFKSwgX25vdGlmeV9mYWlsKEUpCisgICAgIEFyZ3VtZW50c3RyaW5nOglxdWVyeV92ZXJiKEUpLCBfdW5wYXJzZWRfYXJncyhMKQorICAgICBTb25zdGlnZXM6CQlyZXBsYWNlX3BlcnNvbmFsKEUpLCBlbmFibGVfY29tbWFuZHMoRSkKKyAgICAgQWx0ZXJuYXRpdmVuOglBZGRDbWQoTCksIGFkZF9hY3Rpb24oRSkKKworMjQuIE1hZXJ6IDIwMDQgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0FkZEFkamVjdGl2ZSBiL2RvYy9sZnVuL0FkZEFkamVjdGl2ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjU4MTAxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vQWRkQWRqZWN0aXZlCkBAIC0wLDAgKzEsMzkgQEAKK0FkZEFkamVjdGl2ZSgpCisKK0ZVTktUSU9OOgorICAgICB2b2lkIEFkZEFkamVjdGl2ZShzdHJpbmd8c3RyaW5nKiBhZGopOworCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvdGhpbmcvZGVzY3JpcHRpb24uYworCitBUkdVTUVOVEU6CisgICAgIGFkagorICAgICAgICAgIFN0cmluZyBvZGVyIEFycmF5IHZvbiBTdHJpbmcgbWl0IGRlbiBBZGpla3RpdmVuLgorCitCRVNDSFJFSUJVTkc6CisgICAgIFp1c2FldHpsaWNoIHp1IGRlbiBtaXQgQWRkSWQoKSB2ZXJnZWJlbmVuIEJlemVpY2huZXJuIGxhZXNzdCBzaWNoIG1pdAorICAgICBkZXIgVmVyZ2FiZSB2b24gQWRqZWt0aXZlbiBkaWUgQW5zcHJlY2hiYXJrZWl0IGVpbmVzIE9iamVrdGVzIGVyaG9laGVuLgorCitSVWVDS0dBQkVXRVJUOgorICAgICBrZWluZXIKKworQkVNRVJLVU5HRU46CisgICAgIERpZSBBZGpla3RpdmUgd2VyZGVuIG5pY2h0IGRla2xpbmllcnQsIG1hbiBtdXNzIGFsc28gZnVlciBqZWRlbgorICAgICBzaW5udm9sbGVuIEZhbGwgZWluIEFkamVrdGl2IHVlYmVyZ2ViZW4uCisKK0JFSVNQSUVMRToKKworICAgICAgIEFkZElkKCAoeyAiemV0dGVsIiwgImJsYXR0IiB9KSApOworICAgICAgIEFkZEFkamVjdGl2ZSggKHsgImtsZWluZW4iLCAia2xlaW5lcyIgfSkgKTsKKworICAgICBEYXMgT2JqZWt0IHJlYWdpZXJ0IGpldHp0IGF1ZiAiemV0dGVsIiwgImtsZWluZW4gemV0dGVsIiwgImJsYXR0IiwKKyAgICAgImtsZWluZXMgYmxhdHQiIHNvd2llIGF1ZiBkaWUgKHNwcmFjaGxpY2ggbmljaHQgZ2FueiBzbyBrb3JyZWt0ZW4pCisgICAgIEtvbnN0cnVrdGlvbmVuICJrbGVpbmVzIHpldHRlbCIsICJrbGVpbmVuIGJsYXR0IiwgImtsZWluZXMga2xlaW5lbgorICAgICB6ZXR0ZWwiLCAuLi4KKworU0lFSEUgQVVDSDoKKyAgICAgQWRkSWQoKSwgUmVtb3ZlQWRqZWN0aXZlKCkgaWQoKSwgcHJlc2VudCgpLCAvc3RkL3RoaW5nL2Rlc2NyaXB0aW9uLmMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMjAuMDEuMjAxNSwgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9BZGRBbW91bnQgYi9kb2MvbGZ1bi9BZGRBbW91bnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JlOGUzZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0FkZEFtb3VudApAQCAtMCwwICsxLDI1IEBACitBZGRBbW91bnQoKQorCitGVU5LVElPTjoKKyAgICAgdm9pZCBBZGRBbW91bnQoaW50IG1lbmdlKTsKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL3VuaXQuYworCitBUkdVTUVOVEU6CisgICAgIG1lbmdlCisgICAgICAgICAgRGllIE1lbmdlLCBkaWUgZGVyIFVuaXQgaGluenVnZWZ1ZWd0IHdlcmRlbiBzb2xsIChrYW5uIGF1Y2gKKyAgICAgICAgICBuZWdhdGl2IHNlaW4pLgorCitCRVNDSFJFSUJVTkc6CisgICAgIG1lbmdlIHdpcmQgenVyIGFrdHVlbGxlbiBNZW5nZSBoaW56dWdlemFlaGx0LiBTb2xsdGUgZGFzIEVyZ2VibmlzIDAKKyAgICAgd2VyZGVuLCB3aXJkIGRpZSBVbml0IGluIGFic2VoYmFyZXIgWmVpdCB6ZXJzdG9lcnQuCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIGtlaW5lcgorCitTSUVIRSBBVUNIOgorICAgICAvc3RkL3VuaXQuYworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBXZWQgTWF5IDggMTA6MTU6NTAgMTk5NiBieSBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0FkZENsYXNzIGIvZG9jL2xmdW4vQWRkQ2xhc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk3NzMwYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0FkZENsYXNzCkBAIC0wLDAgKzEsMjggQEAKK0FkZENsYXNzKCkKK0ZVTktUSU9OOgorICAgICB2b2lkIEFkZENsYXNzKHN0cmluZ3xzdHJpbmcqIGNsYXNzKTsKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL3RoaW5nL2Rlc2NyaXB0aW9uLmMKKworQVJHVU1FTlRFOgorICAgICBzdHJpbmcvc3RyaW5nKiBjbGFzcwktIFN0cmluZyBvZGVyIFN0cmluZ2FycmF5IGRlciBLbGFzc2UobikKKworQkVTQ0hSRUlCVU5HOgorICAgICBEZW0gT2JqZWt0IHdlcmRlbiB3ZWl0ZXJlIEtsYXNzaWZpemllcnVuZ2VuIGhpbnp1Z2VmdWVndC4KKworICAgICBEaWUgYWxsZ2VtZWluIHZlcmZ1ZWdiYXJlbiBLbGFzc2VuIHNpbmQgdW50ZXIgL3N5cy9jbGFzcy5oIGRlZmluaWVydC4KKworQkVNRVJLVU5HRU46CisgICAgIFZvciBkZW0gNy4gTm92IDIwMTIgcHJ1ZWZ0ZSBpc19jbGFzc19tZW1iZXIoKSBhdWNoIGRpZSBQX0lEUy4gRGFtaXQgd2FyCisgICAgIHpCIGVpbiBBZGRJZCgiZGFlbW9uIikgZ2xlaWNoYmVkZXV0ZW5kIGVpbmVtIEFkZENsYXNzKENMX0RFTU9OKS4KKworICAgICBCaXR0ZSBwcnVlZnQgZXVyZSBPYmpla3RlIChOUENzLCBLcmFua2hlaXRlbiwgR2lmdGUsIC4uLikgYXVmIGtvcnJla3RlCisgICAgIEtsYXNzaWZpemllcnVuZy4KKworU0lFSEUgQVVDSDoKKyAgICAgUmVtb3ZlQ2xhc3MoKSwgaXNfY2xhc3NfbWVtYmVyKCkKKyAgICAgUF9DTEFTUworCisyMC4wMS4yMDE1LCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0FkZENtZCBiL2RvYy9sZnVuL0FkZENtZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWVhOGRiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vQWRkQ21kCkBAIC0wLDAgKzEsMjEwIEBACitBZGRDbWQoTCkKK0ZVTktUSU9OOgorICAgIHZhcmFyZ3Mgdm9pZCBBZGRDbWQobWl4ZWQgY21kLCBtaXhlZCBmdW5jLCBbbWl4ZWQgZmxhZywgW21peGVkIGlkXV0pOworCitERUZJTklFUlQgSU46CisgICAgL3N0ZC90aGluZy9jb21tYW5kcy5jCisKK0FSR1VNRU5URToKKyAgICBjbWQKKyAgICAgICBWZXJiZW4sIGF1ZiBkaWUgcmVhZ2llcnQgd2VyZGVuIHNvbGwKKyAgICAgICBPREVSCisgICAgICAgUmVnZWwgbWl0IFRyaWdnZXJ2ZXJiIHVuZCBub2V0aWdlbiBLZXl3b3Jkcy9TeW5vbnltZW4KKyAgICBmdW5jCisgICAgICAgRnVua3Rpb25zbmFtZSBpbSBzZWxiZW4gT2JqZWt0IG9kZXIgQ2xvc3VyZSAoRnVua3Rpb25zcG9pbnRlcikKKyAgICBmbGFnIChvcHRpb25hbCkKKyAgICAgICBVbnNjaGFyZmUgQXVzZnVlaHJ1bmcgPT0gMQorICAgICAgIE9ERVIKKyAgICAgICBGZWhsZXJtZWxkdW5nZW4gYmVpIE51dHp1bmcgdm9uIFJlZ2VsbgorICAgIGlkIChvcHRpb25hbCkKKyAgICAgICBlaW5lIElELCB1ZWJlciBkaWUgZGFzIEtvbW1hbmRvIGVpbmRldXRpZyB3aWVkZXIgZ2Vsb2VzY2h0CisgICAgICAgd2VyZGVuIGthbm4KKworQkVTQ0hSRUlCVU5HOgorICAgIFdlbm4gZWluIFNwaWVsZXIgaW0gRWluZmx1c3NiZXJlaWNoIGRlcyBPYmpla3RlcyBkYXMgVmVyYiBiZW51dHp0LAorICAgIHdpcmQgZGllIGVudHNwcmVjaGVuZGUgRnVua3Rpb24gaW0gT2JqZWt0IGF1ZmdlcnVmZW46CisgICAgLSBkaWUgVmVyYmVuIHNvbGx0ZW4gSW1wZXJhdGl2ZSBzZWluCisgICAgLSBkaWUgRnVua3Rpb24gbXVzcyAxIGZ1ZXIgRVJGT0xHICh1bmQgRlBzISkgdW5kIDAgc29uc3QgenVydWVja2dlYmVuCisgICAgICAoc29uc3Qgd2VyZGVuIGV2dGwuIHdlaXRlcmUgRnVua3Rpb25lbiBtaXQgZGllc2VtIEtvbW1hbmRvdmVyYiBnZXJ1ZmVuKQorICAgIC0gaW5uZXJoYWxiIGRlciBGdW5rdGlvbmVuIGtvZW5uZW4gRmVobGVybWVsZHVuZ2VuIGZ1ZXIgZGVuIHRvdGFsZW4KKyAgICAgIE1pc3NlcmZvbGcgZGVzIEtvbW1hbmRvcyBtaXQgbm90aWZ5X2ZhaWwgZ2VzZXR6dCB3ZXJkZW4KKyAgICAgIChhbnN0YXR0ICJXaWUgYml0dGU/IikKKworICAgIEFkZENtZCBpc3QgZWluIGR5bmFtaXNjaGVyIEVyc2F0eiBmdWVyIGFkZF9hY3Rpb24gLSBpbSBHZWdlbnNhdHoKKyAgICB6dSBhZGRfYWN0aW9uIGtvZW5uZW4gYXVjaCBvaG5lIGVybmV1dGVuIEF1ZnJ1ZiBkZXIgaW5pdCgpIG5ldWUKKyAgICBLb21tYW5kb3MgaGluenVnZWZ1ZWd0IHdlcmRlbi4KKworICAgIEFkZENtZCBrYW5uIGRhcyBMZWJlbiBlaW5mYWNoZXIgbWFjaGVuIG1pdDoKKyAgICAjIyMgUkVHRUxOOiAjIyMKKyAgICAgIEJlaSBrb21wbGV4ZW4gU3ludGF4ZW4ga2FubiBlaW4gU3RyaW5nIGFuZ2VnZWJlbiB3ZXJkZW4sIGRlciBkaWUKKyAgICAgIF9ub3R3ZW5kaWdlbl8gKG5pY2h0IGRpZSBlcmxhdWJ0ZW4hKSBTY2hsdWVzc2Vsd29ydGUgdW5kIGRlcmVuCisgICAgICB6dWxhZXNzaWdlIFN5bm9ueW1lIGJlc2NocmVpYnQuIERhbWl0IGthbm4gbWFuIHNpY2ggZWluZW4gZ3Jvc3NlbgorICAgICAgVGVpbCBlaWdlbmVyIEF1c3dlcnR1bmcgZXJzcGFyZW4uCisKKyAgICAgIE51ciB3ZW5uIGluIHJpY2h0aWdlciBSZWloZW5mb2xnZSBhdXMgSkVERVIgZGVyIGR1cmNoICYgZ2V0cmVubnRlbgorICAgICAgU3lub255bWdydXBwZW4gZWluIFdvcnQgaW0gU3BpZWxlcmtvbW1hbmRvIGVudGhhbHRlbiBpc3QsIHdpcmQKKyAgICAgIGRpZSB6dWdlaG9lcmlnZSBGdW5rdGlvbiBhdXNnZWZ1ZWhydC4KKworICAgICAgVHJlbm5lciBzaW5kOiB8IGZ1ZXIgQWx0ZXJuYXRpdmVuCisgICAgICAgICAgICAgICAgICAgICYgZnVlciBLb25qdW5rdGlvbmVuCisKKyAgICAgIEJlaXNwaWVsOgorICAgICAgICAicml0enxyaXR6ZXxzY2huaXR6fHNjaG5pdHplJm1pdCZtZXNzZXJ8c2Nobml0em1lc3NlciYiCisgICAgICAgICJoZXJ6fGhlcnpjaGVuJnJpbmRlfGJhdW1yaW5kZSIKKyAgICAgIHd1ZXJkZSB6LkIuIGR1cmNoCisgICAgICAgICJyaXR6IG1pdCBkZW0gTWVzc2VyIGVpbiBIZXJ6IGluIGRpZSBSaW5kZSBkZXMgQmF1bWVzIgorICAgICAgICAic2Nobml0eiBtaXQgTWVzc2VyIEhlcnpjaGVuIEJhdW1yaW5kZSIKKyAgICAgICAgInNjaG5pdHogbWl0IG1laW5lbSBNZXNzZXIgSGVyemNoZW4gaW4gZGllIGhhcnRlIEJhdW1yaW5kZSIKKyAgICAgIGVyZnVlbGx0IHdlcmRlbi4KKworICAgICAgU3BlemlhbHJlZ2VsdGVpbGUgc2luZDoKKyAgICAgIC0gQFBSRVNFTlQ6IGVudHNwcmljaHQgZWluZW0gT2JqZWt0IGluIEludiBvZGVyIEVudiBkZXMgU3BpZWxlcnMKKyAgICAgIC0gQElEOiAgICAgIGVudHNwcmljaHQgZGVyIElEIGRlcyBrb21tYW5kb2Jlc2l0emVuZGVuIE9iamVrdGVzCisgICAgICAgICAgICAgICAgICAod28gZGllIEtvbW1hbmRvbWV0aG9kZSBkZWZpbmllcnQgaXN0LCBpc3Qgbm9jaCB1bndpY2h0aWcpCisgICAgICAtIEBQVVRfR0VUX0RST1AsIEBQVVRfR0VUX1RBS0UsIEBQVVRfR0VUX05PTkU6CisgICAgICAgICAgICAgICAgICBlbnRzcHJlY2hlbmQgZGVuIEZpbHRlcm9wdGlvbmVuIGZ1ZXIgZmluZF9vYnMoKQorICAgICAgQUNIVFVORzogWnVzYWV0emxpY2hlIFppZmZlcm4gaW4gVmVyYmluZHVuZyBtaXQgZGVuIEAtU3BlemlhbHJlZ2VsbgorICAgICAgICAgICAgICAgc2luZCBzY2hsZWNodC4gQC1SZWdlbG4gdmVyc3VjaGVuIGdpZXJpZywgT2JqZWt0ZSBleGFrdCBpbQorICAgICAgICAgICAgICAgSW52ZW50b3J5IHp1IG1hdGNoZW4gKCJvYmpla3QgMyIgYW5zdGF0dCAib2JqZWt0IikgdW5kIG1pc3MtCisgICAgICAgICAgICAgICBpbnRlcnByZXRpZXJlbiBkYWhlciB6QiBkaWUgNCBpbiAic3RvcGYgb2JqZWt0IDMgaW4gbG9jaCA0IiBhbHMKKyAgICAgICAgICAgICAgIFRlaWwgZGVzIE9iamVrdC1JRC1TdHJpbmdzLgorICAgICAgICAgICAgICAgSW50ZXJuYTogMyBTdWJzdHJpbmdzIGZ1ZXIgQFBSRVNFTlQvQElEICgiZ3J1ZW5lciBrcmlzdGFsbCAyIikKKyAgICAgICAgICAgICAgICAgICAgICAgIDUgZnVlciBAUFVULi4uICgia3Jpc3RhbGwgMiBpbiBiZXV0ZWwgMyIpCisKKyAgICAjIyMgRkVITEVSTUVMRFVOR0VOIChiZWkgQW53ZW5kdW5nIHZvbiBSZWdlbG4pOiAjIyMKKyAgICAgIEFscyBkcml0dGVyIFBhcmFtZXRlciBrb2VubmVuIGF1Y2ggRmVobGVybWVsZHVuZ2VuIGZ1ZXIgamV3ZWlscworICAgICAgZmVobGVuZGUgU3lub255bWdydXBwZW4gKGF1c3NlciBkZXIgZXJzdGVuIC0gZGVuIEtvbW1hbmRvdmVyYmVuKQorICAgICAgYW5nZWdlYmVuIHdlcmRlbi4gU2llIHdlcmRlbiBpbiBkZXJzZWxiZW4gUmVpaGVuZm9sZ2UgKCEpIHdpZSBkaWUKKyAgICAgIFN5bm9ueW1ncnVwcGVuIGFuZ2VnZWJlbi4KKworICAgICAgTWl0IG5pY2h0IHZvbiBTcGllbGVybiBlcmZ1ZWxsYmFyZW4gUmVnZWxuIHVuZCBeLUZlaGxlcm1lbGR1bmdlbgorICAgICAga2FubiBtYW4gYXVjaCBvaG5lIEF1c2Z1ZWhydW5nIGVpbmVyIEZ1bmt0aW9uIFRleHRlIGFuIFNwaWVsZXIKKyAgICAgIHVuZCBVbWdlYnVuZyBhdXNnZWJlbi4gU2llaGUgZGF6dSBBZGRDbWRfYnNwLgorCisgICAgICBUcmVubmVyIHNpbmQ6IHwgenVtIFRyZW5uZW4gZGVyIGVpbnplbG5lbiBGZWhsZXJtZWxkdW5nZW4KKyAgICAgICAgICAgICAgICAgICAgXiB1bQorICAgICAgICAgICAgICAgICAgICAgICAtIGRpZSBBdXN3ZXJ0dW5nIChhYiBkaWVzZXIgRmVobGVybWVsZHVuZyEpIG1pdAorICAgICAgICAgICAgICAgICAgICAgICAgICJyZXR1cm4gMTsiIHp1IGJlZW5kZW4gdW5kCisgICAgICAgICAgICAgICAgICAgICAgIC0gZWluZSB3cml0ZV5zYXktTWVsZHVuZyB6dSB0cmVubmVuIHVuZAorICAgICAgICAgICAgICAgICAgICAgICAtIChmdWVyIGZ1bmt0aW9uc2xvc2UgQWRkQ21kIGF1Y2ggRlBzIHp1IHZlcmdlYmVuISkKKworICAgICAgQmVpc3BpZWxmZWhsZXJtZWxkdW5nZW4gZnVlciBvYmlnZSBSZWdlbDoKKyAgICAgICAgIldvbWl0IHdpbGxzdCBEdSBzY2huaXR6ZW4/fFdhcyB3aWxsc3QgRHUgc2Nobml0emVuP3wiCisgICAgICAgICJXb2hpbmVpbiB3aWxsc3QgRHUgZGFzIHNjaG5pdHplbj8iCisKKyAgICAgIEVzIGtvZW5uZW4gaW4gZGVuIEZlaGxlcm1lbGR1bmdlbiBmb2xnZW5kZSBQbGF0emhhbHRlciBiZW51dHp0CisgICAgICB3ZXJkZW46CisgICAgICAtIEB2ZXJiIChlcnNldHp0IGR1cmNoIHF1ZXJ5X3ZlcmIoKSBvaG5lIGJlZW5kZW5kZXMgJ2UnKQorICAgICAgLSBAVkVSQiAoZXJzZXR6dCBkdXJjaCBjYXBpdGFsaXplKHF1ZXJ5X3ZlcmIoKSkgb2huZSBiZWVuZGVuZGVzICdlJykKKyAgICAgIC0gQFdFUngsIEBXRVNTRU54LCBAV0VNeCwgQFdFTng6IHNpZWhlIGFsbGVzIGF1cyByZXBsYWNlX3BlcnNvbmFsKCkKKyAgICAgICAgLSBAV0UuLjEgaXN0IGltbWVyIGRlciBha3RpdmUgU3BpZWxlcgorICAgICAgICAtIGFsbGUgZm9sZ2VuZGVuIHNpbmQgZGllIG1hdGNoZW5kZW4gUGFyYW1ldGVyIGRlciBTcGllbGVyZWluZ2FiZQorICAgICAgICAgIC0gKHgtMSk8PUZlaGxlcm1lbGR1bmcgKGRhIHg9MSBTcGllbGVyIHVuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh4LTEpPkZlaGxlcm1lbGR1bmdzb2JqZWt0IG5pY2h0IGV4aXN0ZW50KQorCisgICAgICBBdXNmdWVocnVuZ3NiZWlzcGllbDoKKyAgICAgICAgQWRkQ21kKCJyaXR6fHJpdHplfHNjaG5pdHp8c2Nobml0emUmbWl0Jm1lc3NlcnxzY2huaXR6bWVzc2VyJiIKKyAgICAgICAgICAgICAgICJoZXJ6fGhlcnpjaGVuJnJpbmRlfGJhdW1yaW5kZSIsIydmdW4sCisgICAgICAgICAgICAgICJXaWxsc3QgRHUgbWl0IGV0d2FzIEB2ZXJiZW4/fFdvbWl0IHdpbGxzdCBkdSBAdmVyYmVuP3wiCisgICAgICAgICAgICAgICJXYXMgd2lsbHN0IGR1IG1pdCBkZW0gQFdFTTMgQHZlcmJlbj98IgorICAgICAgICAgICAgICAiV29oaW5laW4gd2lsbHN0IER1IGRhcyBAV0VONCBzY2huaXR6ZW4/Iik7CisgICAgICAgIDEuICJyaXR6ZSIgPT0gIldpbGxzdCBEdSBtaXQgZXR3YXMgcml0emVuPyIKKyAgICAgICAgMi4gInNjaG5pdHogbWl0IiA9PSAiV29taXQgd2lsbHN0IGR1IHNjaG5pdHplbj8iCisgICAgICAgIDMuICJyaXR6IG1pdCBtZXNzZXIiID09ICJXYXMgd2lsbHN0IGR1IG1pdCBkZW0gbWVzc2VyIHJpdHplbj8iCisgICAgICAgIDQuICJyaXR6ZSBtaXQgZGVtIG1lc3NlciBlaW4gaGVyeiIgPT0KKyAgICAgICAgICAgICAiV29oaW5laW4gd2lsbHN0IER1IGRhcyBoZXJ6IHNjaG5pdHplbj8iCisgICAgICAgIDUuICJyaXR6ZSBtaXQgZGVtIG1lc3NlciBlaW4gaGVyemNoZW4gaW4gZGllIGJhdW1yaW5kZSIKKyAgICAgICAgICAgICA9PSBFcmZvbGchCisKKyAgICAjIyMgVU5TQ0hBUkZFUiBBVVNGVUVIUlVORzogIyMjCisgICAgICBCZWkgdW5zY2hhcmZlciBBdXNmdWVocnVuZyB3aXJkIGRpZSB6dWdlaG9lcmlnZSBNZXRob2RlIGF1Y2ggZGFubgorICAgICAgYXVzZ2VmdWVocnQsIHdlbm4gZGFzIHZlcndlbmRldGUgVmVyYiBlaW4gU3VwZXJzdHJpbmcgaXN0IHVuZAorICAgICAgYmlzaGVyIG5vY2ggbmljaHQgYmVoYW5kZWx0IHd1cmRlLgorICAgICAgRGllc2VzIFZlcmhhbHRlbiBzb2xsdGUgbnVyIGJlaW0gZ2VuZXJlbGxlbiBBYmZhbmdlbiB2b24KKyAgICAgIEJlZmVobHNncnVwcGVuIGJlbnV0enQgd2VyZGVuIHVuZCBpc3QgYW5zb25zdGVuIHZlcmFsdGV0LiBFcworICAgICAgZW50c3ByaWNoIGFkZF9hY3Rpb24oImZ1biIsImtvbW1hbmRvIiwxKS4KKworCisgICAgICBCZWlzcGllbDoKKyAgICAgICAgMS4gQWRkQ21kKCJrbGV0dCIsImZ1biIsMSk7CisgICAgICAgIDIuIEFkZENtZCgia2xldHRlcnxrbGV0dGVyZSZob2NoIiwjJ2Z1bjIsIldvaGluIGtsZXR0ZXJuPyIpOworCisgICAgICAgIGEpICJrbGV0dCIKKyAgICAgICAgYikgImtsZXR0ZXIiCisgICAgICAgIGMpICJrbGV0dGVyZSBob2NoIgorCisgICAgICAgIEF1c2dlZnVlaHJ0ZSBGdW5rdGlvbiBiZWk6IDFhLCAxYiwgMWM7IDJjCisgICAgICAgKDEgd3VlcmRlIGFsc28gaW1tZXIgYXVzZ2VmdWVocnQpCisgICAgICAgIEZlaGxlcm1lbGR1bmcgYmVpOiAyYiAoIldvaGluIGtsZXR0ZXJuPyIpCisKK0JFTUVSS1VOR0VOOgorICAgIC0gTWV0aG9kZW4gZGVyIHB1dF9hbmRfZ2V0IChuaW1tL25laG1lKSBzb2xsdGVuIHNvIG5pY2h0IHZlcnN1Y2h0CisgICAgICB3ZXJkZW4genUgdWViZXJzY2hyZWliZW4gLSBkYXp1IHNpbmQgaW52aXMgQ29udGFpbmVyIGRhCisgICAgLSBiZW51dHp0IG1hbiBmdWVyIDxmdW5jdGlvbj4gZWluZSBDbG9zdXJlLCBrYW5uIG1hbiBkaWUgRmt0LiBhdWNoCisgICAgICBwcm90ZWN0ZWQgb2RlciBwcml2YXRlIGRla2xhcmllcmVuIF91bmRfIHNpZSBrYW5uIGluIGVpbmVtCisgICAgICBhbmRlcmVuIE9iamVrdCBzZWluCisgICAgLSBiZWkgUmVnZWxuIHdpcmQgYW4gZGllIGdnZi4gZ2VydWZlbmUgTWV0aG9kZSBhbHMgendlaXRlciBQYXJhbWV0ZXIKKyAgICAgIGVpbiBBcnJheSBkZXIgZXJmdWVsbGVuZGVuIEVpbmdhYmV0ZWlsZSB1ZWJlcmdlYmVuOgorICAgICAgInN0ZWNrJkBQUkVTRU5UJmluJmxvY2giIGJlaSBFcmZ1ZWxsdW5nIC0+ICh7PE9iamVrdD4sImluIiwibG9jaH0pCisgICAgICAtIGJlaSBOdXR6dW5nIHZvbiBAUFVUX0dFVF9YWFgga29lbm5lbiBkaWUgUGFyYW1ldGVyIHdpZWRlcnVtCisgICAgICAgIEFycmF5cyBzZWluICgiamVkZSBIb3NlIiAtPiBtZWhyZXJlIGd1ZWx0aWdlIE9iamVrdGUpCisgICAgLSBqdWVuZ2VyZSBBZGRDbWQgdWViZXJzY2hyZWliZW4gYWVsdGVyZSwgYnp3LiB3ZXJkZW4gdm9yIGRpZXNlbgorICAgICAgYXVzZ2V3ZXJ0ZXQKKyAgICAtIEBQVVRfR0VUX1hYWCBrb3N0ZW4gc2VociB2aWVsIEF1c3dlcnR1bmdzemVpdAorCitCRUlTUElFTEUgKFNJRUhFIEFVQ0ggQUREQ01EX0JTUCk6CisgICAgLy8gU0lNUEVMOiBnYW56IHNpbXBlbCwgYmVpbmFoZSB3aWUgYWRkX2FjdGlvbgorICAgIEFkZENtZCgiYmVmaWVobCIsImFjdGlvbl9iZWZlaGxlbiIpOworICAgIC4uLgorICAgIGludCBhY3Rpb25fYmVmZWhsZW4oc3RyaW5nIHN0cikgeworICAgICBpZighc3RyIHx8ICFzdHJsZW4oc3RyKSkKKyAgICAgIC8vIEZlaGxlcm1lbGR1bmcsIGZhbGxzIGdhciBrZWluZSBGdW5rdGlvbiAxIGRhZnVlciB6dXJ1ZWNrZ2lidAorICAgICAgbm90aWZ5X2ZhaWwoIldhcyB3aWxsc3QgZHUgYmVmZWhsZW4/IVxuIik7CisgICAgIGVsc2UgeworICAgICAgd3JpdGUoIkR1IGJlZmllaGxzdCBcIiIrc3RyKyJcIiwgdW5kIGFsbGUgZm9sZ2VuIVxuIik7CisgICAgICBzYXkoVFAtPk5hbWUoV0VSKSsiIGJlZmllaGx0IFwiIitzdHIrIlwiLCB1bmQgZHUgZm9sZ3N0IVxuIik7CisgICAgICByZXR1cm4gMTsgIC8vIEVSRk9MRyAtIEFiYnJ1Y2ggZGVyIEtvbW1hbmRvYXVzd2VydHVuZworICAgICB9CisgICAgIHJldHVybiAwOyAgLy8gTUlTU0VSRk9MRyAtIEZlaGxlcm1lbGR1bmcgb2JlbiBnZXNldHp0CisgICAgfQorCisgICAgLy8gU0lNUEVMIC4uIHdlaXRlcmUgQmVpc3BpZWxlCisgICAgQWRkQ21kKCh7ImtsZXR0ZXIiLCJrbGV0dGVyZSJ9KSwiYWN0aW9uX2tsZXR0ZXJuIiApOworICAgIEFkZENtZCgoeyJyZW5uIiwicmVubmUifSksIydhY3Rpb25fcmVubmVuKTsKKworICAgIC8vIFJFR0VMTjogZWluZSBrb21wbGV4ZXJlIFJlZ2VsCisgICAgQWRkQ21kKCJsb2VzY2h8bG9lc2NoZXxlcnN0aWNrZSZmZXVlcnxicmFuZHxmbGFtbWVuJmRlY2tlfHdvbGxkZWNrZSIsCisgICAgICAgICAgICJhY3Rpb25fbG9lc2NoZW4iLAorICAgICAgICAgICAiV2FzIHdpbGxzdCBkdSBsb2VzY2hlbj98V29taXQgd2lsbHN0IGR1IGxvZXNjaGVuPyIpOworCisgICAgLy8gUkVHRUxOOiBtaXQgUGxhdHpoYWx0ZXJuIGltIEZlaGxlcnN0cmluZworICAgIEFkZENtZCgic3ByaW5nfHNwcmluZ2V8aHVlcGZ8aHVlcGZlJnZvbnx2b20mYmF1bXxhc3R8ZWljaGUiLAorICAgICAgICAgICAjJ2FjdGlvbl9odWVwZmUsCisgICAgICAgICAgICJXaWxsc3QgZHUgdm9uIGV0d2FzIEB2ZXJiZW4/fFZvbiB3byB3aWxsc3QgZHUgQHZlcmJlbj8iKTsKKworICAgIC8vIFNDSExFQ0hUOiBlaW5lIHVuc2NoYXJmZSBSZWdlbCAtIHNpZSBzb2xsdGVuIGVpbmUgQXVzbmFobWUgc2VpbiAoISkKKyAgICBBZGRDbWQoImtsZXR0ZXIiLCJmdW5fa2xldHRlcm4iLDEpOworCisgICAgLy8gRkFMU0NIOiBzZWhyIHNjaGxlY2h0LCBrZWluIEltcGVyYXRpdiB2ZXJ3ZW5kZXQKKyAgICAvLyBhdXNzZXJkZW0gc29sbHRlIG1hbiBmdWVyIHNvbGNoZSBTeW50YXhlbiBBZGRSZWFkRGV0YWlsIGJlbnV0emVuCisgICAgQWRkQ21kKCJsZXNlIiwiZXZhbF9sZXNlbiIpOworCisgICAgLy8gU0lNUExFIFJFR0VMIE9ITkUgTUVUSE9ERQorICAgIC8vIG1pdCBSZWdlbG4ga2FubiBtYW4gYXVjaCBBa3Rpdml0YWV0ZW4gaW0gUmF1bSBlcmxhdWJlbiwgb2huZSBlaW5lCisgICAgLy8gRnVua3Rpb24gYXVmcnVmZW4genUgbXVlc3NlbjogZGllIGxldHp0ZSBSZWdlbCBpc3QgZnVlciBTcGllbGVyCisgICAgLy8gdW5tb2VnbGljaCB6dSBlcmZ1ZWxsZW4sIGRpZSBkYXp1Z2Vob2VyaWdlIEZlaGxlcm1lbGR1bmcgd2lyZCBtaXQKKyAgICAvLyBkZW0gXiAod3JpdGUtRmxhZykgdmVyc2VoZW4gdW5kIGVudHNwcmVjaGVuZCBhbiBkZW4gU3BpZWxlcgorICAgIC8vICh1bmQgZGVuIFJhdW0gKGhpbnRlciBkZW0gXikpIGF1c2dlZ2ViZW4KKyAgICBBZGRDbWQoInNwcmluZ3xzcHJpbmdlJmhlcnVudGVyfHJ1bnRlciZcblxiaW1wb3NzaWJsZSIsMCwKKyAgICAgICAgICAgIldvaGluIG9kZXIgd292b24gd2lsbHN0IER1IHNwcmluZ2VuP3wiCisgICAgICAgICAgICJEdSBzcHJpbmdzdCB2b20gQmF1bSB1bmQga29tbXN0IGhhcnQgYXVmLl4iCisgICAgICAgICAgICJAV0VSMSBzcHJpbmd0IHZvbSBCYXVtIHVuZCBrb21tdCBoYXJ0IGF1Zi4iKTsKKworU0lFSEUgQVVDSDoKKyAgICBBZGRDbWRfYnNwLCBSZW1vdmVDbWQoTCksIGluaXQoRSkKKyAgICBGZWhsZXJtZWxkdW5nZW46IG5vdGlmeV9mYWlsKEUpLCBfbm90aWZ5X2ZhaWwoRSkKKyAgICBBcmd1bWVudHN0cmluZzogcXVlcnlfdmVyYihFKSwgX3VucGFyc2VkX2FyZ3MoTCkKKyAgICBTb25zdGlnZXM6ICByZXBsYWNlX3BlcnNvbmFsKEUpLCBlbmFibGVfY29tbWFuZHMoRSkKKyAgICBBbHRlcm5hdGl2ZW46IEFkZEFjdGlvbihMKSwgYWRkX2FjdGlvbihFKQorCiszMC4gQXVnIDIwMTMgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0FkZENtZF9ic3AgYi9kb2MvbGZ1bi9BZGRDbWRfYnNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYjhkOTgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9BZGRDbWRfYnNwCkBAIC0wLDAgKzEsMzIwIEBACitBRERDTUQoKSAtIEJFSVNQSUVMRQorRlVOS1RJT04KKyAgICB2YXJhcmdzIHZvaWQgQWRkQ21kKG1peGVkIGNtZCwgbWl4ZWQgZnVuYywgbWl4ZWQgZmxhZyk7CisKK0JFTUVSS1VOR0VOCisgICAgRGllIGhpZXIgYXVmZ2VmdWVocnRlbiBLb21wbGV4YmVpc3BpZWxlIHNpbmQgenVtIFZlcnN0YWVuZG5pcyBnZWRhY2h0LAorICAgIGRhaGVyIGZ1ZWhyZW4gc2llIG9mdCBBbHRlcm5hdGl2ZW4gYXVmLiBEaWUgbGV0enRlIFZhcmlhbnRlIGlzdCBkYW5uCisgICAgamV3ZWlscyBkaWVqZW5pZ2UsIHdlbGNoZSBhbSBsZWljaHRlc3RlbiBkYXMgUHJvYmxlbSBsb2VzZW4ga29lbm50ZS4KKyAgICBGYWxscyBkaWUgZWluZW0genUga29tcGxleCBpc3QsIGhpbGZ0IHZpZWxsZWljaHQgZGllIHZvcmxldHp0ZS4KKworQkVJU1BJRUxFCisgICAgLy8gU0lNUEVMOiBnYW56IHNpbXBlbCwgYmVpbmFoZSB3aWUgYWRkX2FjdGlvbgorICAgIEFkZENtZCgiYmVmaWVobCIsImFjdGlvbl9iZWZlaGxlbiIpOworICAgIC4uLgorICAgIGludCBhY3Rpb25fYmVmZWhsZW4oc3RyaW5nIHN0cikgeworICAgICBpZighc3RyIHx8ICFzdHJsZW4oc3RyKSkKKyAgICAgIC8vIEZlaGxlcm1lbGR1bmcsIGZhbGxzIGdhciBrZWluZSBGdW5rdGlvbiAxIGRhZnVlciB6dXJ1ZWNrZ2lidAorICAgICAgbm90aWZ5X2ZhaWwoIldhcyB3aWxsc3QgZHUgYmVmZWhsZW4/IVxuIik7CisgICAgIGVsc2UgeworICAgICAgd3JpdGUoIkR1IGJlZmllaGxzdCBcIiIrc3RyKyJcIiwgdW5kIGFsbGUgZm9sZ2VuIVxuIik7CisgICAgICBzYXkoVFAtPk5hbWUoV0VSKSsiIGJlZmllaGx0IFwiIitzdHIrIlwiLCB1bmQgZHUgZm9sZ3N0IVxuIik7CisgICAgICByZXR1cm4gMTsJCS8vIEVSRk9MRyAtIEFiYnJ1Y2ggZGVyIEtvbW1hbmRvYXVzd2VydHVuZworICAgICB9CisgICAgIHJldHVybiAwOwkJLy8gTUlTU0VSRk9MRyAtIEZlaGxlcm1lbGR1bmcgb2JlbiBnZXNldHp0CisgICAgfQorCisgICAgLy8gU0lNUEVMIC4uIHdlaXRlcmUgQmVpc3BpZWxlCisgICAgQWRkQ21kKCh7ImtsZXR0ZXIiLCJrbGV0dGVyZSJ9KSwiYWN0aW9uX2tsZXR0ZXJuIiApOworICAgIEFkZENtZCgoeyJyZW5uIiwicmVubmUifSksIydhY3Rpb25fcmVubmVuKTsKKworICAgIC8vIFJFR0VMTjogZWluZSBrb21wbGV4ZXJlIFJlZ2VsCisgICAgQWRkQ21kKCJsb2VzY2h8bG9lc2NoZXxlcnN0aWNrZSZmZXVlcnxicmFuZHxmbGFtbWVuJmRlY2tlfHdvbGxkZWNrZSIsCisgICAgICAgICAgICJhY3Rpb25fbG9lc2NoZW4iLAorICAgICAgICAgICAiV2FzIHdpbGxzdCBkdSBsb2VzY2hlbj98V29taXQgd2lsbHN0IGR1IGxvZXNjaGVuPyIpOworCisgICAgLy8gUkVHRUxOOiBtaXQgUGxhdHpoYWx0ZXJuIGltIEZlaGxlcnN0cmluZworICAgIEFkZENtZCgic3ByaW5nfHNwcmluZ2V8aHVlcGZ8aHVlcGZlJnZvbnx2b20mYmF1bXxhc3R8ZWljaGUiLAorICAgICAgICAgICAjJ2FjdGlvbl9odWVwZmUsCisgICAgICAgICAgICJXaWxsc3QgZHUgdm9uIGV0d2FzIEB2ZXJiZW4/fFZvbiB3byB3aWxsc3QgZHUgQHZlcmJlbj8iKTsKKworICAgIC8vIFNDSExFQ0hUOiBlaW5lIHVuc2NoYXJmZSBSZWdlbCAtIHNpZSBzb2xsdGVuIGVpbmUgQXVzbmFobWUgc2VpbiAoISkKKyAgICBBZGRDbWQoImtsZXR0ZXIiLCJmdW5fa2xldHRlcm4iLDEpOworCisgICAgLy8gRkFMU0NIOiBzZWhyIHNjaGxlY2h0LCBrZWluIEltcGVyYXRpdiB2ZXJ3ZW5kZXQKKyAgICAvLyBhdXNzZXJkZW0gc29sbHRlIG1hbiBmdWVyIHNvbGNoZSBTeW50YXhlbiBBZGRSZWFkRGV0YWlsIGJlbnV0emVuCisgICAgQWRkQ21kKCJsZXNlIiwiZXZhbF9sZXNlbiIpOworCisgICAgLy8gU0lNUExFIFJFR0VMCisgICAgc3RhdGljIGludCBhY3Rpb25fanVtcChzdHJpbmcgc3RyKTsgICAgICAgIC8vIFByb3RvdHlwZSAod2VnZW4gY2xvc3VyZSkKKyAgICAuLi4KKyAgICBBZGRDbWQoInNwcmluZ3xzcHJpbmdlfGh1ZXBmfGh1ZXBmZSZ2b24mYmF1bXxhc3QiLCMnYWN0aW9uX2p1bXAsCisgICAgICAgICAgICJXaWxsc3QgRHUgdm9uIGV0d2FzIEB2ZXJiZW4/fFdvdm9uIHdpbGxzdCBEdSBAdmVyYmVuPyIpOworICAgIC4uLgorICAgIHN0YXRpYyBpbnQgYWN0aW9uX2p1bXAoc3RyaW5nIHN0cikgeworICAgICAgd3JpdGUoYnJlYWtfc3RyaW5nKCJEdSBzcHJpbmdzdCB2b20gQmF1bSB1bmQga29tbXN0IGhhcnQgYXVmISIsNzgpKTsKKyAgICAgIHRoaXNfcGxheWVyKCktPm1vdmUoKFhYWFJPT00rImJvZGVuIiksIE1fR08sIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJzcHJpbmd0IHVuZWxlZ2FudCB2b20gQmF1bSIsImZhZWxsdCB2b20gQmF1bSIpOworICAgICAgdGhpc19wbGF5ZXIoKS0+RGVmZW5kKHJhbmRvbSgxMDApLCh7RFRfQkxVREdFT059KSwoW1NQX1JFQ1VSU0lWRToxXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc19vYmplY3QoKSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvLyBTSU1QTEUgUkVHRUwgT0hORSBNRVRIT0RFCisgICAgLy8gbWl0IFJlZ2VsbiBrYW5uIG1hbiBhdWNoIEFrdGl2aXRhZXRlbiBpbSBSYXVtIGVybGF1YmVuLCBvaG5lIGVpbmUKKyAgICAvLyBGdW5rdGlvbiBhdWZydWZlbiB6dSBtdWVzc2VuOiBkaWUgbGV0enRlIFJlZ2VsIGlzdCBmdWVyIFNwaWVsZXIKKyAgICAvLyB1bm1vZWdsaWNoIHp1IGVyZnVlbGxlbiwgZGllIGRhenVnZWhvZXJpZ2UgRmVobGVybWVsZHVuZyB3aXJkIG1pdAorICAgIC8vIGRlbSBeICh3cml0ZS1GbGFnKSB2ZXJzZWhlbiB1bmQgZW50c3ByZWNoZW5kIGFuIGRlbiBTcGllbGVyCisgICAgLy8gKHVuZCBkZW4gUmF1bSAoaGludGVyIGRlbSBeKSkgYXVzZ2VnZWJlbgorICAgIEFkZENtZCgic3ByaW5nfHNwcmluZ2UmaGVydW50ZXJ8cnVudGVyJlxuXGJpbXBvc3NpYmxlIiwwLAorICAgICAgICAgICAiV29oaW4gb2RlciB3b3ZvbiB3aWxsc3QgRHUgc3ByaW5nZW4/fCIKKyAgICAgICAgICAgIkR1IHNwcmluZ3N0IHZvbSBCYXVtIHVuZCBrb21tc3QgaGFydCBhdWYuXiIKKyAgICAgICAgICAgIkBXRVIxIHNwcmluZ3Qgdm9tIEJhdW0gdW5kIGtvbW10IGhhcnQgYXVmLiIpOworCisjIyBLb21wbGV4YmVpc3BpZWw6IFJlZ2VsbiBtaXQgRmVobGVybWVsZHVuZ2VuICMjCisgIyMgVmFyaWFudGUgMSwgT0hORSBSRUdFTE4gIyMKKyAgICAvLyBiZWkgTmljaHR2ZXJ3ZW5kdW5nIHZvbiBSZWdlbG4gbXVzcyBtYW4gUGFyYW1ldGVyIHNlbGJzdCBhdXN3ZXJ0ZW4KKyAgICBBZGRDbWQoKHsiYm9ociIsImJvaHJlIn0pLCMnYWN0aW9uX2JvaHJlbik7CisgICAgLi4uCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGFjdGlvbl9ib2hyZW4oc3RyaW5nIHN0cikgeworICAgICAgc3RyaW5nICp0bXA7CisgICAgICBub3RpZnlfZmFpbCgiV28gd2lsbHN0IChldHdhcykgRHUgYm9ocmVuP1xuIik7CisgICAgICBpZighc3RyKSByZXR1cm4gMDsgICAgICAgLy8gVGphLCBrZWluZSBBcmd1bWVudGUgLi4uCisgICAgICB0bXA9ZXhwbG9kZShzdHIsIiAiKTsgICAgLy8gbmFjaCAiICIgaW4gQXJndW1lbnQtQXJyYXkgYXVmc3BhbHRlbgorICAgICAgaWYoKGk9bWVtYmVyKHRtcCwibG9jaCIpKT49MCkgeyAvLyBhaGEsIGFiIGpldHp0IHVlYmVybmVobWVuIHdpciA6KQorICAgICAgIGlmKChqPW1lbWJlcih0bXBbKGkrMSkuLl0sImluIikpPDAgJiYKKyAgICAgICAgICAoaj1tZW1iZXIodG1wWyhpKzEpLi5dLCJkdXJjaCIpKTwwKQorICAgICAgICAgd3JpdGUoIldpbGxzdCBEdSBkYXMgTG9jaCBpbiBldHdhcyBib2hyZW4/XG4iKTsKKyAgICAgICAgZWxzZSBpZigoaT1tZW1iZXIodG1wWyhqKzEpLi5dLCJib2RlbiIpKTwwICYmCisgICAgICAgICAgICAgICAgKGk9bWVtYmVyKHRtcFsoaisxKS4uXSwiZXJkZSIpKTwwKQorICAgICAgICAgd3JpdGUoIkluL0R1cmNoIHdhcyB3aWxsc3QgZHUgZGFzIExvY2ggYm9ocmVuP1xuIik7CisgICAgICAgIGVsc2UgeworICAgICAgICAgd3JpdGUoIkR1IGJvaHJzdCBlaW4gTG9jaCBpbiBkZW4gQm9kZW4uXG4iKTsKKyAgICAgICAgIHNheSh0aGlzX3BsYXllcigpLT5OYW1lKFdFUikrIiBib2hydCBlaW4gTG9jaCBpbiBkZW4gQm9kZW4uXG4iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMTsgICAgICAvLyAiYm9ocmUgbG9jaCIgd2FyIHNvIGVpbmRldXRpZywgZGFzcyBudXIgZGllc2UKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gTWV0aG9kZSBnZW1laW50IHNlaW4ga29ubnRlLCBhbHNvIGJyZWNoZW4gd2lyIGRpZQorICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZWl0ZXJlIEF1c3dlcnR1bmcgYXVmIGplZGVuIEZhbGwgYWIgKHVuZCBnZWJlbgorICAgICAgICAgICAgICAgICAgICAgICAvLyBlaW5lIHdyaXRlLUZlaGxlcm1lbGR1bmcpCisgICAgICB9IC8vIGVuZCBpZiguLi4ibG9jaCIpCisgICAgICByZXR1cm4gMDsgICAgICAgIC8vICJib2hyZSIgYWxsZWluIG11c3MgbmljaHQgZGllc2UgTWV0aG9kZSBtZWluZW4sCisgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsc28gbnVyIG9iaWdlIG5vdGlmeV9mYWlsKCktTWVsZHVuZywgZmFsbHMKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gc2ljaCBuYWNoIGRpZXNlciBNZXRob2RlIGdhciBrZWluZSBzb25zdAorICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmdlc3Byb2NoZW4gZnVlaGx0CisgICAgfSAvLyBlbmQgZnVuCisKKyAjIyBWYXJpYW50ZSAxYSwgT0hORSBSRUdFTE4gIyMKKyAgICAvLyBwcmluemlwaWVsbCBrb2VubnRlIGRpZSBNZXRob2RlIGFjdGlvbl9ib2hyZW4gYXVjaCBzbworICAgIC8vIGF1c3NlaGVuLCBpc3QgYWJlciBuaWNodCBnYW56IHNvIGZsZXhpYmVsOgorICAgIHByaXZhdGUgc3RhdGljIGludCBhY3Rpb25fYm9ocmVuKHN0cmluZyBzdHIpIHsKKyAgICAgc3RyaW5nIHRtcDsKKyAgICAgaWYoIXN0ciB8fCAoc3ByaW50ZihzdHIsImxvY2ggaW4gZXJkZSVzIix0bXApIT0xICYmCisgICAgICAgICAgICAgICAgIHNwcmludGYoc3RyLCJsb2NoIGR1cmNoIGVyZGUlcyIsdG1wKSE9MSAmJgorICAgICAgICAgICAgICAgICBzcHJpbnRmKHN0ciwibG9jaCBpbiBib2RlbiVzIix0bXApIT0xICYmCisgICAgICAgICAgICAgICAgIHNwcmludGYoc3RyLCJsb2NoIGR1cmNoIGJvZGVuJXMiLHRtcCkhPTEpKQorICAgICAgbm90aWZ5X2ZhaWwoIldpbGxzdCBEdSBpbiBpcmdlbmR3YXMgZWluIExvY2ggYm9ocmVuP1xuIik7CisgICAgIGVsc2UgeworICAgICAgLi4uCisgICAgICByZXR1cm4gMTsKKyAgICAgfQorICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAjIyBWYXJpYW50ZSAyLCBNSVQgUkVHRUwgIyMKKyAgICAvLyBkYXMgZ2xlaWNoZSBpbiBldHdhIG1hbCBhbHMgZWluZmFjaGUgUmVnZWwKKyAgICBBZGRDbWQoImJvaHJ8Ym9ocmUmbG9jaCZpbnxkdXJjaCZlcmRlfGJvZGVuIiwjJ2FjdGlvbl9ib2hyZW4sCisgICAgICAgICAgICJXYXMgd2lsbHN0IGR1ICh3b2hpbikgYm9ocmVuP3wiCisgICAgICAgICAgICJXaWxsc3QgZHUgZGFzIExvY2ggaW4gZXR3YXMgYm9ocmVuP3wiCisgICAgICAgICAgICJXb2hpbiB3aWxsc3QgZHUgZGFzIExvY2ggYm9ocmVuPyIpOworICAgIC4uLgorICAgIHByaXZhdGUgc3RhdGljIGludCBhY3Rpb25fYm9ocmVuKHN0cmluZyBzdHIsIG1peGVkICpwYXJhbSkgeworICAgICB3cml0ZSgiRHUgYm9ocnN0IGVpbiBMb2NoIGluIGRlbiBCb2Rlbi5cbiIpOworICAgICBzYXkodGhpc19wbGF5ZXIoKS0+TmFtZShXRVIpKyIgYm9ocnQgZWluIExvY2ggaW4gZGVuIEJvZGVuLlxuIik7CisgICAgIC4uLgorICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAjIyBWYXJpYW50ZSAzLCBNSVQgUkVHRUwgVU5EIEZFSExFUk1FTERVTkcgIyMKKyAgICAvLyB1bmQgbnVuIG1pdCBGZWhsZXJtZWxkdW5nZW4gbWl0IEVyc2V0enVuZ2VuLCBzbyBkYXNzIHdpciBtZWhyCisgICAgLy8gYXVmIGRpZSBFaW5nYWJlbiBkZXMgU3BpZWxlcnMgZWluZ2VoZW4KKyAgICBBZGRDbWQoImJvaHJ8Ym9ocmUmbG9jaCZpbnxkdXJjaCZlcmRlfGJvZGVuIiwjJ2FjdGlvbl9ib2hyZW4sCisgICAgICAgICAgICJXYXMgd2lsbHN0IGR1ICh3b2hpbikgQHZlcmJlbj98IgorICAgICAgICAgICAiV2lsbHN0IGR1IGRhcyBMb2NoIGluIGV0d2FzIEB2ZXJiZW4/fCIKKyAgICAgICAgICAgIkBXRVIzIHdhcyB3aWxsc3QgZHUgZGFzIExvY2ggQHZlcmJlbj8iKTsKKyAgICAuLi4KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgYWN0aW9uX2JvaHJlbihzdHJpbmcgc3RyLCBtaXhlZCAqcGFyYW0pIC4uLgorCisgIyMgVmFyaWFudGUgNCwgTUlUIFJFR0VMLCBGRUhMRVJNRUxEVU5HIFVORCBSRVRVUk4gMSAjIworICAgIC8vIGluIFZhcmlhbnRlIDEga2FtIHNpbm52b2xsZXJ3ZWlzZSBzZWhyIGZydWVoIGRlciBBYmJydWNoIG1pdAorICAgIC8vICJyZXR1cm4gMTsiIHVuZCBkaWUgQXVzZ2FiZSB2b24gd3JpdGUtRmVobGVybWVsZHVuZ2VuLAorICAgIC8vIGRhcyBrb2VubmVuIHdpciBhdWNoCisgICAgQWRkQ21kKCJib2hyfGJvaHJlJmxvY2gmaW58ZHVyY2gmZXJkZXxib2RlbiIsIydhY3Rpb25fYm9ocmVuLAorICAgICAgICAgICAiV2FzIHdpbGxzdCBkdSAod29oaW4pIEB2ZXJiZW4/fCIKKyAgICAgICAgICAgIldpbGxzdCBkdSBkYXMgTG9jaCBpbiBldHdhcyBAdmVyYmVuP158IgorICAgICAgICAgICAiQFdFUjMgd2FzIHdpbGxzdCBkdSBkYXMgTG9jaCBAdmVyYmVuP14iKTsKKyAgICAuLi4KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgYWN0aW9uX2JvaHJlbihzdHJpbmcgc3RyLCBtaXhlZCAqcGFyYW0pIC4uLgorCisgIyMgVmFyaWFudGUgNSwgTUlUIFJFR0VMLCBGRUhMRVJNRUxEVU5HLCBSRVRVUk4gMSwgT0hORSBGVU4gIyMKKyAgICAvLyB1bmQgZmFsbHMgaW4gYWN0aW9uX2JvaHJlbigpIG5pY2h0cyBhdXNzZXIgQXVzZ2FiZW4gcGFzc2llcnQsIGtvZW5uZW4KKyAgICAvLyB3aXIgdW5zIGRpZSBhdWNoIGdhbnogc3BhcmVuIGluZGVtIHdpciBlaW5lIG5pY2h0ZXJmdWVsbGJhcmUgUmVnZWwKKyAgICAvLyBzYW10IEZlaGxlcm1lbGR1bmcgYmF1ZW4KKyAgICBBZGRDbWQoImJvaHJ8Ym9ocmUmbG9jaCZpbnxkdXJjaCZlcmRlfGJvZGVuJlxuaW1wb3NzaWJsZSIsMCwKKyAgICAgICAgICAgIldhcyB3aWxsc3QgZHUgKHdvaGluKSBAdmVyYmVuP3wiCisgICAgICAgICAgICJXaWxsc3QgZHUgZGFzIExvY2ggaW4gZXR3YXMgQHZlcmJlbj9efCIKKyAgICAgICAgICAgIkBXRVIzIHdhcyB3aWxsc3QgZHUgZGFzIExvY2ggQHZlcmJlbj9efCIKKyAgICAgICAgICAgIkR1IEB2ZXJic3QgZWluIExvY2ggQFdFUjMgZGVuIEJvZGVuLl5AV0VSMSBAdmVyYnQgIgorICAgICAgICAgICAiZWluIExvY2ggQFdFUjMgZGVuIEJvZGVuLiIpOworCisgICAtLS0gRW5kZSBLb21wbGV4YmVpc3BpZWwgUmVnZWxuIG1pdCBGZWhsZXJtZWxkdW5nZW4gLS0tCisKKyMjIEtvbXBsZXhiZWlzcGllbDogU3BlemlhbHJlZ2VsbiBAUFJFU0VOVCB1bmQgQElEICMjCisgIyMgVmFyaWFudGUgMSwgT0hORSBSRUdFTE4gIyMKKyAgICAvLyBvZnQgYWdpZXJlbiBLb21tYW5kb3MgYXVmIE9iamVrdGVuIGltIFJhdW0sIGRpZXNlIG11ZXNzZW4gZGFiZWkgcGVyCisgICAgLy8gcHJlc2VudCgpIGlkZW50aWZpemllcnQgd2VyZGVuOgorICAgIC8vIEJlaXNwaWVsIGlzdCBlaW4gR2VsZGF1dG9tYXQgKGRlbiBtYW4gYmVzc2VyIG1pdCBlaW5lbSBDb250YWluZXIKKyAgICAvLyBtaXQgUHJldmVudEluc2VydCgpIGJhc3RlbG4gc29sbHRlKQorICAgIEFkZENtZCgoeyJzdG9wZiIsInN0b3BmZSJ9KSwjJ2FjdGlvbl9zdG9wZik7CisgICAgLi4uCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGFjdGlvbl9zdG9wZihzdHJpbmcgc3RyKSB7CisgICAgIHN0cmluZyB0bXAsdG1wMjsKKyAgICAgb2JqZWN0IG87CisKKyAgICAgaWYoc3RyICYmIChzcHJpbnRmKCIlcyBpbiBhdXRvbWF0JXMiLHRtcCx0bXAyKT09MiB8fAorICAgICAgICAgICAgICAgIHNwcmludGYoIiVzIGluIGdlbGRhdXRvbWF0JXMiLHRtcCx0bXAyKT09MiB8fAorICAgICAgICAgICAgICAgIHNwcmludGYoIiVzIGluIGJhbmtvbWF0JXMiLHRtcCx0bXAyKT09MikgeworICAgICAgbz1wcmVzZW50KHRtcCx0aGlzX3BsYXllcigpKTsKKyAgICAgIGlmKG8pIHsKKyAgICAgICBpZihvLT5RdWVyeVByb3AoLi4uKSkgeworICAgICAgICB3cml0ZShicmVha19zdHJpbmcoCisgICAgICAgICAiRHUgc3RvcGZzdCAiK28tPm5hbWUoV0VOLDEpKyIgaW4gZGVuIEF1dG9tYXRlbi4iLDc4KSk7CisgICAgICAgIHNheSguLi4pOworICAgICAgIH0gZWxzZSB7CisgICAgICAgIHdyaXRlKGJyZWFrX3N0cmluZygKKyAgICAgICAgICJEdSB2ZXJzdWNoc3QgIitvLT5uYW1lKFdFTiwxKSsiIGluIGRlbiBBdXRvbWF0ZW4genUgc3RvcGZlbiwgIgorICAgICAgICAgImFiZXIgIitvLT5RdWVyeVByb25vdW4oV0VSKSsiIHBhc3N0IG5pY2h0IGhpbmVpbi4iLDc4KSk7CisgICAgICAgIHNheSguLi4pOworICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgd3JpdGUoIldhcyB3aWxsc3QgZHUgaW4gZGVuIEF1dG9tYXRlbiBzdG9wZmVuP1xuIik7CisgICAgICAgc2F5KC4uLi4pOworICAgICAgfQorICAgICAgcmV0dXJuIDE7CisgICAgIH0KKyAgICAgbm90aWZ5X2ZhaWwoIldhcyB3aWxsc3QgZHUgd29oaW4gc3RlY2tlbj9cbiIpOworICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAjIyBWYXJpYW50ZSAyLCBNSVQgUkVHRUwgIyMKKyAgICAvLyBlaW5lcnNlaXRzIGtvZW5uZW4gd2lyIGRhcyBGaW5kZW4gdm9uIE9iamVrdGVuIGluIEludiB1bmQgRW52CisgICAgLy8gaW50ZWdyaWVyZW4gdW5kIHVucyBhbmRlcmVyc2VpdHMgZGFzIEF1ZnphZWhsZW4gYWxsZXIgSURzIGRlcworICAgIC8vIEF1dG9tYXRlbiBlcnNwYXJlbgorICAgIEFkZENtZCgic3RlY2t8c3RlY2tlJkBQUkVTRU5UJmluJkBJRCIsIydhY3Rpb25fc3RvcGYsCisgICAgICAgICAgICJXYXMgd2lsbHN0IGR1IHdvaGluIHN0b3BmZW4/fCIKKyAgICAgICAgICAgIldpbGxzdCBkdSBAV0VOMiBpbiBldHdhcyBzdG9wZmVuP3wiCisgICAgICAgICAgICJXb2hpbmVpbiB3aWxsc3QgZHUgQFdFTjIgc3RvcGZlbj8iKTsKKyAgICAuLi4KKyAgICAvLyBkYWJlaSB3ZXJkZW4gd2llIGltbWVyIGRpZSBnZWZ1bmRlbiBNYXRjaGVzIGFscyBQYXJhbWV0ZXJhcnJheQorICAgIC8vIHVlYmVyZ2ViZW4gLi4uIHVuZCBkaWUgQFBSRVNFTlQgdW5kIEBJRCBhbHMgT2JqZWt0ZSEKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgYWN0aW9uX3N0b3BmKHN0cmluZyBzdHIsIG1peGVkICpwYXJhbSkgeworICAgICBpZihwYXJhbVswXS0+UXVlcnlQcm9wKC4uLikpIHsKKyAgICAgIHdyaXRlKGJyZWFrX3N0cmluZygKKyAgICAgICAiRHUgc3RvcGZzdCAiK3BhcmFtWzBdLT5uYW1lKFdFTiwxKSsiIGluIGRlbiBBdXRvbWF0ZW4uIiw3OCkpOworICAgICAgc2F5KC4uLik7CisgICAgIH0gZWxzZSB7CisgICAgICB3cml0ZShicmVha19zdHJpbmcoCisgICAgICAgIkR1IHZlcnN1Y2hzdCAiK3BhcmFtWzBdLT5uYW1lKFdFTiwxKSsiIGluIGRlbiBBdXRvbWF0ZW4genUgIgorICAgICAgICJzdG9wZmVuLCBhYmVyICIrcGFyYW1bMF0tPlF1ZXJ5UHJvbm91bihXRVIpKyIgcGFzc3QgbmljaHQgIgorICAgICAgICJoaW5laW4uIiw3OCkpOworICAgICAgc2F5KC4uLik7CisgICAgIH0KKyAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAtLS0gRW5kZSBLb21wbGV4YmVpc3BpZWwgU3BlemlhbHJlZ2VsbiBAUFJFU0VOVCB1bmQgQElEICAtLS0KKworIyMgS29tcGxleGJlaXNwaWVsOiBnbGVpY2hlcyBWZXJiLCBtZWhyZXJlIFJlZ2VsbiAjIworIC8vIERhcyBQcm9ibGVtIG1laHJlcmVyIFJlZ2VsbiBmdWVyIGVpbiBLb21tYW5kb3ZlcmIgYmVzdGVodCBkYXJpbiwgZGFzcworIC8vIGxldHp0bGljaCBudXIgZWluZSBkZXIgRmVobGVybWVsZHVuZ2VuIHp1bSBUcmFnZW4ga29tbXQgLSB3ZWxjaGUKKyAvLyBnZW5hdSBpc3QgZXR3YXMgdmFnZS4KKyAvLyBEYWJlaSBrYW5uIG1hbiBzaWNoIGF1ZiBlaW5lcyB2ZXJsYXNzZW46IGp1ZW5nZXJlIEFkZENtZCB3ZXJkZW4KKyAvLyB6dWVyc3QgYXVzZ2V3ZXJ0ZXQuIFdlbm4gc2ljaCBkYXMgYWVuZGVydCwgdHJldGV0IGV1cmVuIEVNLgorCisgIyMgUHJvYmxlbSAxOiBNZWhyZXJlIFJlZ2VsbiB3ZWlsIG1laHJlcmUgWndlY2tlICMjCisgICAgIyMgVmFyaWFudGUgMSAtIEdMRUlDSExBVVRFTkRFIEZFSExFUk1FTERVTkcKKyAgICAvLyBmdWVyIGFsbGVzIHdpcmQgZWluZSBpZGVudGlzY2hlIEZlaGxlcm1lbGR1bmcgZ2VzZXR6dCwgZGFzIGlzdAorICAgIC8vIG5hdHVlcmxpY2ggbmljaHQgc2VociBmbGV4aWJlbCBvZGVyIHNjaG9lbgorICAgIEFkZENtZCgia3JpZWNofGtyaWVjaGUmaG9jaHxoaW5hdWZ8aGluYXVzfGhlcmF1c3xyYXVzIiwjJ3Jlc3VsdF9rcmllY2gsCisgICAgICAgICAgICJXb2hpbiB3aWxsc3QgRHUga3JpZWNoZW4/Iik7CisgICAgQWRkQ21kKCJrcmllY2h8a3JpZWNoZSZuYWNoJm9iZW4iLCMncmVzdWx0X2tyaWVjaCwKKyAgICAgICAgICAgIldvaGluIHdpbGxzdCBEdSBrcmllY2hlbj8/fFdvaGluIHdpbGxzdCBEdSBrcmllY2hlbj8iKTsKKyAgICBBZGRDbWQoImtyaWVjaHxrcmllY2hlJmF1cyZsb2NofGdydWJlfGZhbGxlIiwjJ3Jlc3VsdF9rcmllY2gpOworICAgICAgICAgICAiV29oaW4gd2lsbHN0IER1IGtyaWVjaGVuP3xXb2hpbiB3aWxsc3QgRHUga3JpZWNoZW4/Iik7CisKKyAgICAvLyBvZGVyIG1hbiB2ZXJzdWNodCBlaW5lIGJlc3NlcmUgUmVnZWwgenUgc2NoYWZmZW4sIHdhcyBoaWVyIGR1cmNoCisgICAgLy8gZGllIE1vZWdsaWNoa2VpdCB2b24gendlaSBvZGVyIGRyZWkgUGFyYW1ldGVyIHVubW9lZ2xpY2ggaXN0CisKKyAgICAjIyBWYXJpYW50ZSAyIC0gRUlHRU5FIEFVU1dFUlRVTkcKKyAgICAvLyBlcyBiaWV0ZXQgc2ljaCBhbHNvIGVpZ2VuZSBXZWl0ZXJhdXN3ZXJ0dW5nIGFuLCB3YXMgZHVyY2ggZGllCisgICAgLy8gVWViZXJnYWJlIGRlciBnZXRyaWdnZXJ0ZW4gVmVyYmVuIGVybGVpY2h0ZXJ0IHdpcmQ6CisgICAgQWRkQ21kKCJrcmllY2h8a3JpZWNoZSZob2NofGhpbmF1ZnxoaW5hdXN8aGVyYXVzfHJhdXN8YXVzfG5hY2giLAorICAgICAgICAgICAjJ3Jlc3VsdF9rcmllY2gsCisgICAgICAgICAgICJXb2hpbiB3aWxsc3QgRHUga3JpZWNoZW4/Iik7CisgICAgLi4uCisgICAgc3RhdGljIGludCByZXN1bHRfa3JpZWNoKHN0cmluZyBzdHIsIG1peGVkICpleHRyYSkgeworICAgICAgaWYobWVtYmVyKGV4dHJhLCJhdXMiKT49MCAmJgorICAgICAgICAgIXNpemVvZigoe3N0cn0pLCIqLlxcPChob2VobGV8Z3J1YmV8ZmFsbGUpXFw+LioiKSkKKyAgICAgICBub3RpZnlfZmFpbCgiV29yYXVzIHdpbGxzdCBEdSBrcmllY2hlbj9cbiIpOworICAgICAgZWxzZSBpZihtZW1iZXIoZXh0cmEsIm5hY2giKT49MCAmJiBzdHJzdHIoc3RyLCJvYmVuIik8MCkKKyAgICAgICBub3RpZnlfZmFpbCgiSW4gd2VsY2hlIFJpY2h0dW5nIHdpbGxzdCBEdSBrcmllY2hlbj9cbiIpOworICAgICAgZWxzZSBpZih0aGlzX3BsYXllcigpLT5RdWVyeUF0dHJpYnV0ZShBX0RFWCk+MTAgfHwKKyAgICAgICAgICAgICAgbWVtYmVyKGhvbGRpbmdfcm9vdCx0aGlzX3BsYXllcigpKSkgeworICAgICAgICB3cml0ZSgiRHUga3JpZWNoc3QgbWl0IE11ZWhlIGhlcmF1cy5cbiIpOworICAgICAgICB0aGlzX3BsYXllcigpLT5tb3ZlKChYWFhST09NKyJkcmF1c3NlbiIpLCBNX0dPLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrcmllY2h0IG1pdCBNdWVoZSBhdXMgZGVyIEdydWJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAia3JpZWNodCBhdXMgZWluZXIgR3J1YmUiKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9IGVsc2UKKyAgICAgICAgd3JpdGUoIkR1IGJpc3QgenUgdW5nZXNjaGlja3QsIGhhbHQgRGljaCBpcmdlbmR3byBmZXN0LlxuIik7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8vIChvYiBzaWNoIGRlciBBdWZ3YW5kIGZ1ZXIgZGllc2UgQmVpc3BpZWxzeW50YXggbG9obnQgaXN0IGZyYWdsaWNoKQorCisgIyMgUHJvYmxlbSAyOiBtZWhyZXJlIFJlZ2Vsbiwgd2VpbCBvcHRpb25hbGUgUGFyYW1ldGVyICMjCisgICAgLy8gTWFuY2htYWwgd2lsbCBtYW4gb3B0aW9uYWxlIFBhcmFtZXRlciBlcmxhdWJlbiwgZGllIGFiZXIgZWluZQorICAgIC8vIFdpcmt1bmcgemVpZ2VuIHNvbGxlbjoKKyAgICBBZGRDbWQoInNjaGxhZ3xzY2hsYWdlJkBJRCZoYXJ0IiwjJ2FjdGlvbl9zY2hsYWdfaGFydCwKKyAgICAgICAgICAgIldhcyBvZGVyIHdlbiB3aWxsc3QgZHUgQHZlcmJlbj98IgorICAgICAgICAgICAiV2llIHdpbGxzdCBkdSBAV0VOMiBzY2hsYWdlbj8iKTsKKyAgICBBZGRDbWQoInNjaGxhZ3xzY2hsYWdlJkBJRCIsIydhY3Rpb25fc2NobGFnLAorICAgICAgICAgICAiV2FzIG9kZXIgd2VuIHdpbGxzdCBkdSBAdmVyYmVuPyIpOworCisgICAgLy8gRGEganVlbmdlcmUgQWRkQ21kIGFlbHRlcmVuIHZvcmdlaGVuLCB3aXJkIGRpZSBrb21wbGV4ZXJlIFJlZ2VsIHNhbXQKKyAgICAvLyBpaHJlciBGZWhsZXJtZWxkdW5nIG5pZSBhdXNnZXdlcnRldCwgZGEgZWluICJzY2hsYWcgYmFsbCBoYXJ0IiBhdWNoCisgICAgLy8gZGllIHp3ZWl0ZSBSZWdlbCB0cmlnZ2VydC4KKworICAgIC8vIGFuZGVycyBoZXJ1bToKKyAgICBBZGRDbWQoInNjaGxhZ3xzY2hsYWdlJkBJRCIsIydhY3Rpb25fc2NobGFnLAorICAgICAgICAgICAiV2FzIG9kZXIgd2VuIHdpbGxzdCBkdSBAdmVyYmVuPyIpOworICAgIEFkZENtZCgic2NobGFnfHNjaGxhZ2UmQElEJmhhcnQiLCMnYWN0aW9uX3NjaGxhZ19oYXJ0LAorICAgICAgICAgICAiV2FzIG9kZXIgd2VuIHdpbGxzdCBkdSBAdmVyYmVuP3wiCisgICAgICAgICAgICJXaWUgd2lsbHN0IGR1IEBXRU4yIHNjaGxhZ2VuPyIpOworCisgICAgLy8gSmV0enQgd2lyZCBkaWUga29tcGxleGVyZSBSZWdlbCB6dWVyc3QgdWViZXJwcnVlZnQgdW5kIHRyaWdnZXJ0CisgICAgLy8gYXVjaCBkaWUgcmljaHRpZ2UgRnVua3Rpb24uCisgICAgLy8gTGVpZGVyIGtvbW10IGRpZSBGZWhsZXJtZWxkdW5nIG5pZSB6dW0gVHJhZ2VuLCBkZW5uIHdhcyBkdXJjaCBSZWdlbCAyCisgICAgLy8gZHVyY2hmYWVsbHQsIHRyaWdnZXJ0IGVudHdlZGVyIFJlZ2VsIDEgb2RlciBmYWVsbHQgYXVjaCBkdXJjaCBSZWdlbCAxCisgICAgLy8gZHVyY2ggdW5kIHVlYmVyc2NocmVpYnQgZGFiZWkgZGllIE1lbGR1bmcuCisKKyAgICBBZGRDbWQoInNjaGxhZ3xzY2hsYWdlJkBJRCIsIydhY3Rpb25fc2NobGFnLAorICAgICAgICAgICAiV2FzIG9kZXIgd2VuIHdpbGxzdCBkdSB3aWUgQHZlcmJlbj8iKTsKKyAgICBBZGRDbWQoInNjaGxhZ3xzY2hsYWdlJkBJRCZoYXJ0IiwjJ2FjdGlvbl9zY2hsYWdfaGFydCk7CisKKyAgICAvLyBGYXN0IHBlcmZla3QuIEJlc3NlciB3aXJkIGVzIG5pY2h0LgorCisKKyAgICAtLS0gRW5kZSBLb21wbGV4YmVpc3BpZWwgbWVocmVyZSBSZWdlbG4gLS0tCisKKzEwIEp1bmkgMjAwNCBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vQWRkRGVmZW5kZXIgYi9kb2MvbGZ1bi9BZGREZWZlbmRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWI3OTIzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vQWRkRGVmZW5kZXIKQEAgLTAsMCArMSwzNCBAQAorQWRkRGVmZW5kZXIoKQorCitGVU5LVElPTjoKKwl2b2lkIEFkZERlZmVuZGVyKG9iamVjdCBmcmllbmQpOworCitERUZJTklFUlQgSU46CisJL3N0ZC9saXZpbmcvY29tYmF0LmMKKworQVJHVU1FTlRFOgorCWZyaWVuZAorCSAgT2JqZWt0IChub3JtYWwgTGViZXdlc2VuKSwgd2VsY2hlcyB6dWt1ZW5mdGlnIHVlYmVyIEFuZ3JpZmZlCisJICBpbmZvcm1pZXJ0IHdlcmRlbiBzb2xsIG9kZXIgZGllc2Ugc29nYXIgYWJ3ZWhydC4KKworQkVTQ0hSRUlCVU5HOgorCUVpbiBMZWJld2VzZW4sIHdlbGNoZXMgYW5nZWdyaWZmZW4gd2lyZCwga2FubiBhbmRlcmUgT2JqZWt0ZSB1ZWJlcgorCWVpbmVuIHNvbGNoZW4gQW5ncmlmZiBwZXIgSW5mb3JtRGVmZW5kKCkgaW5mb3JtaWVyZW4gb2RlciBpaG5lbgorCXNvZ2FyIGRpZSBNb2VnbGljaGtlaXQgZ2ViZW4sIHBlciBEZWZlbmRPdGhlcigpIGRpcmVrdCBpbiBkZW4KKwlsYXVmZW5kZW4gQW5ncmlmZiBlaW56dWdyZWlmZW4gKFNjaGFlZGVuIGFid2VocmVuIG9kZXIgdW13YW5kZWxuKS4KKwlJbSBOb3JtYWxmYWxsIGhhbmRlbHQgZXMgc2ljaCBoaWVyYmVpIHVtIGFuZGVyZSBMZWJld2VzZW4sIHdlbGNoZQorCWFscyBWZXJ0ZWlkaWdlciBkZXMgYW5nZWdyaWZmZW5lbiBMZWJld2VzZW5zIGF1ZnRyZXRlbjogRGFoZXIgZGVyCisJTmFtZSBkZXIgRnVua3Rpb24uCisJRGllIE9iamVrdGUgc2luZCBpbiBGb3JtIGVpbmVzIEFycmF5cyBpbiBkZXIgUHJvcGVydHkgUF9ERUZFTkRFUlMKKwlhYmdlc3BlaWNoZXJ0IHVuZCBrb2VubmVuIGRvcnQgYWJnZXJ1ZmVuIHdlcmRlbi4gTmF0dWVybGljaCBrYW5uCisJbWFuIHdlaXRlcmUgT2JqZWt0ZSBkaXJla3QgZG9ydCBlaW50cmFnZW4sIGplZG9jaCBzb2xsdGUgbWFuIGRpZQorCWhpZXJmdWVyIGJlcmVpdGdlc3RlbGx0ZSBGdW5rdGlvbmVuIEFkZERlZmVuZGVyKCkgdmVyd2VuZGVuLgorCVp1bSBMb2VzY2hlbiB2b24gRWludHJhZWdlbiBpbSBBcnJheSBzdGVodCBlYmVuZmFsbHMgZWluZSBGdW5rdGlvbgorCWJlcmVpdDogUmVtb3ZlRGVmZW5kZXIoKS4KKworU0lFSEUgQVVDSDoKKwlSZW1vdmVEZWZlbmRlcigpLCBJbmZvcm1EZWZlbmQoKSwgRGVmZW5kT3RoZXIoKSwKKwlQX0RFRkVOREVSUywgL3N0ZC9saXZpbmcvY29tYmF0LmMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogVGh1IEp1bCAyOSAxODo0ODo0NSAxOTk5IGJ5IFBhdHJ5bgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vQWRkRGV0YWlsIGIvZG9jL2xmdW4vQWRkRGV0YWlsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyOTE5N2IKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9BZGREZXRhaWwKQEAgLTAsMCArMSw5MSBAQAorQWRkRGV0YWlsKCkKKworRlVOS1RJT046CisgICAgdm9pZCBBZGREZXRhaWwoc3RyaW5nfHN0cmluZyoga2V5cywKKyAgICAgICAgICAgICAgICAgICBzdHJpbmd8c3RyaW5nKnxtYXBwaW5nfGNsb3N1cmUgZGVzYyk7CisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3RkL3RoaW5nL2Rlc2NyaXB0aW9uLmMKKworQVJHVU1FTlRFOgorICAgIGtleXMKKyAgICAgIFN0cmluZyBvZGVyIEFycmF5IHZvbiBTdHJpbmdzIG1pdCBkZW4gTmFtZW4gZGVyIERldGFpbHMuCisgICAgZGVzYworICAgICAgU3RyaW5nLCBNYXBwaW5nLCBTdHJpbmctQXJyYXkgb2RlciBDbG9zdXJlIG1pdC96dXIgQmVzY2hyZWlidW5nLgorCitCRVNDSFJFSUJVTkc6CisgICAgRGllIEJlc2NocmVpYnVuZyBkZXIgRGV0YWlscyA8a2V5cz4gd2lyZCBnZXNldHp0LiBXaWUgZGllIERldGFpbHMKKyAgICBiZWkgZGVyIFVudGVyc3VjaHVuZyBhdXNzZWhlbiwgaGFlbmd0IGltIHdlc2VudGxpY2hlbiB2b20gVHlwIGRlcgorICAgIEJlc2NocmVpYnVuZyA8ZGVzYz4gYWI6CisgICAgICA8ZGVzYz4gaXN0IGVpbiBTdHJpbmcuCisgICAgICAgIEJlaW0gVW50ZXJzdWNoZW4gd2lyZCBkaWVzZXIgU3RyaW5nIHp1cnVlY2tnZWdlYmVuLgorICAgICAgPGRlc2M+IGlzdCBlaW4gU3RyaW5nLUFycmF5LgorICAgICAgICBCZWltIFVudGVyc3VjaGVuIHdpcmQgenVmYWVsbGlnIGVpbmVyIGRlciBTdHJpbmdzIHp1cnVlY2tnZWdlYmVuLgorICAgICAgPGRlc2M+IGlzdCBlaW4gTWFwcGluZy4KKyAgICAgICAgRGFzIE1hcHBpbmcgbXVzcyBmb2xnZW5kZW4gQXVmYmF1IGhhYmVuOgorICAgICAgICAgIChbMDogICAgICAgICJEZWZhdWx0dGV4dCIsCisgICAgICAgICAgICAicmFzc2UxIjogInIxdGV4dCIsIC4uLl0pLgorCisgICAgICAgIEZhbGxzIGZ1ZXIgZGllIFJhc3NlIGRlcyBkYXMgRGV0YWlsIHVudGVyc3VjaGVuZGVuIFNwaWVsZXJzIGVpbgorICAgICAgICBFaW50cmFnIGltIE1hcHBpbmcgZXhpc3RpZXJ0LCB3aXJkIGRlciBlbnRzcHJlY2hlbmRlIFRleHQKKyAgICAgICAgenVydWVja2dlZ2ViZW4sIGFuc29uc3RlbiBkZXIgRGVmYXVsdHRleHQuIEF1ZiBkaWVzZSBXZWlzZSBzaW5kCisgICAgICAgIHJhc3NlbmFiaGFlbmdpZ2UgRGV0YWlscyBtb2VnbGljaC4gU2llaGUgYXVjaCBkaWUgQmVpc3BpZWxlLgorICAgICAgPGRlc2M+IGlzdCBlaW5lIENsb3N1cmUuCisgICAgICAgIEluIGRpZXNlbSBGYWxsIHdpcmQgZGllIENsb3N1cmUgYXVzZ2VmdWVocnQgdW5kIGRhcyBFcmdlYm5pcworICAgICAgICB6dXJ1ZWNrZ2VnZWJlbi4gRGllIENsb3N1cmUgYmVrb21tdCBkYWJlaSBkZW4gTmFtZW4gZGVzIERldGFpbHMKKyAgICAgICAgYWxzIFBhcmFtZXRlciB1ZWJlcmdlYmVuLgorCisgICAgRnVlciBEZXRhaWxzIGtvZW5uZW4gRm9yc2NoZXJwdW5rdGUgZWluZ2V0cmFnZW4gd2VyZGVuLgorCitCRUlTUElFTEU6CisgICAgRWluIHNjaGxpY2h0ZXMgRGV0YWlsOgorCisgICAgICBBZGREZXRhaWwoKHsic29mYSIsImNvdWNoIn0pLCAiRWluZSBrbGVpbmUgQ291Y2guXG4iKTsKKworICAgIExhZW5nZXJlIERldGFpbHMgc29sbHRlbiBoaWVyYmVpIG5pY2h0IHBlciBIYW5kIHVtZ2Vicm9jaGVuIHdlcmRlbiwKKyAgICBzb25kZXJuIG1hbiBrYW5uIGhpZXJ6dSBkaWUgRnVua3Rpb24gYnJlYWtfc3RyaW5nKCkgbnV0emVuOgorCisgICAgICBBZGREZXRhaWwoImRldGFpbCIsIGJyZWFrX3N0cmluZygKKyAgICAgICAgIkR1IHdvbGx0ZXN0IGVzIGphIG5pY2h0IGFuZGVycywgamV0enQgbXVzc3QgRHUgRGlyIGRpZXNlcyAiCisgICAgICAgICJmdWVyY2h0ZXJsaWNoIGxhbmdlIERldGFpbCBkdXJjaGxlc2VuISEhIiwgNzgpKTsKKworICAgIE5vZXRpZ2UgWmVpbGVudW1icnVlY2hlIGJlaSBaZWlsZW5sYWVuZ2VuIGdyb2Vzc2VyIDc3IHdlcmRlbiBzbworICAgIGF1dG9tYXRpc2NoIGdlbmVyaWVydC4KKyAgICBFaW4gcmFzc2VuYWJoYWVuZ2lnZXMgRGV0YWlsOgorCisgICAgICBBZGREZXRhaWwoKHsiYmV0dCIsImJldHRjaGVuIn0pLAorICAgICAgICAoWzAgICAgICA6IkVpbmUga2xlaW5lcyBCZXR0LlxuIiwgLy8gRGVyIERlZmF1bHR0ZXh0CisgICAgICAgICAgInp3ZXJnIjogICAgICAgICAgICAgICAgICAgICAgICAvLyBEaWUgUmFzc2Uga2xlaW4gc2NocmVpYmVuCisgICAgICAgICAgICAgICAgIkRhcyBCZXR0IGxhZWR0IGdlcmFkZXp1IHp1IGVpbmVtIE5pY2tlcmNoZW4gZWluLlxuIl0pKTsKKworICAgIFVuZCBudW4gZWluIERldGFpbCBtaXQgQ2xvc3VyZSAoZGllc2UgVmVyc2lvbiBlcnNldHp0IGRhcyBWZXJoYWx0ZW4KKyAgICAgdm9uIEFkZFNwZWNpYWxEZXRhaWwpLgorCisgICAgICBpbnQgaGViZWxfYmV0YWV0aWd0OworICAgICAgLi4uCisgICAgICBzdHJpbmcgaGViZWwoc3RyaW5nIHN0cik7IC8vIEZ1bmt0aW9uIGJla2FubnQgbWFjaGVuIChQcm90b3R5cGluZykKKyAgICAgIC4uLgorICAgICAgQWRkRGV0YWlsKCh7ImhlYmVsIiwic2NoYWx0ZXIifSksICMnaGViZWwpOworICAgICAgLi4uCisgICAgICBzdHJpbmcgaGViZWwoc3RyaW5nIGtleSkgeworICAgICAgICBpZihoZWJlbF9iZXRhZXRpZ3QpCisgICAgICAgICAgcmV0dXJuICJEZXIgIitjYXBpdGFsaXplKGtleSkrIiBzdGVodCBhdWYgRUlOLlxuIjsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJldHVybiAiRGVyICIrY2FwaXRhbGl6ZShrZXkpKyIgc3RlaHQgYXVmIEFVUy5cbiI7CisgICAgICB9CisKKyAgICBNYW4gZXJoYWVsdCB2ZXJzY2hpZWRlbmUgRXJnZWJuaXNzZSBiZWltIFVudGVyc3VjaGVuLCBqZSBuYWNoZGVtCisgICAgb2IgZGFzIEZsYWcgaGViZWxfYmV0YWV0aWd0IGdlc2V0enQgaXN0IG9kZXIgbmljaHQuCisKK1NJRUhFIEFVQ0g6CisgICAgU2V0emVuOiAgICBBZGRSZWFkRGV0YWlsKCksIEFkZFNtZWxscygpLCBBZGRTb3VuZHMoKSwKKyAgICAgICAgICAgICAgIEFkZFRvdWNoRGV0YWlsKCkKKyAgICBMb2VzY2hlbjogIFJlbW92ZURldGFpbCgpLCBSZW1vdmVSZWFkRGV0YWlsKCksIFJlbW92ZVNtZWxscygpLAorICAgICAgICAgICAgICAgUmVtb3ZlU291bmRzKCksIFJlbW92ZVRvdWNoRGV0YWlsKCkKKyAgICBEYXRlbjogICAgIFBfREVUQUlMUywgUF9SRUFEX0RFVEFJTFMsIFBfU01FTExTLCBQX1NPVU5EUywKKyAgICAgICAgICAgICAgIFBfVE9VQ0hfREVUQUlMUywgUF9TUEVDSUFMX0RFVEFJTFMKKyAgICBWZXJhbHRldDogIEFkZFNwZWNpYWxEZXRhaWwoKSwgUmVtb3ZlU3BlY2lhbERldGFpbCgpLCBQX1JFQURfTVNHCisgICAgU29uc3RpZ2VzOiBHZXREZXRhaWwoKSwgYnJlYWtfc3RyaW5nKCkKKworMjAuMDEuMjAxNSwgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9BZGREcmluayBiL2RvYy9sZnVuL0FkZERyaW5rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiOTllMDgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9BZGREcmluawpAQCAtMCwwICsxLDEyIEBACitBZGREcmluaygpCisKK0JFTUVSS1VOR0VOOgorCisgICAgICAgIERpZSBGdW5rdGlvbiBBZGREcmluaygpIHNvbGx0ZSBOSUNIVCBNRUhSIEJFTlVUWlQgd2VyZGVuLgorICAgICAgICBCaXR0ZSBBZGRUb01lbnUoKSB2ZXJ3ZW5kZW4uCisKK1NJRUhFIEFVQ0g6CisJQWRkVG9NZW51KCksIFJlbW92ZUZyb21NZW51KCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogRnJpIE1hciAwMyAxMzoyMzowMCAyMDAwIGJ5IFBhcmFjZWxzdXMKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0FkZEV4aXQgYi9kb2MvbGZ1bi9BZGRFeGl0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNzA2ODIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9BZGRFeGl0CkBAIC0wLDAgKzEsOTEgQEAKK0FkZEV4aXQoKQorRlVOS1RJT046CisgICAgIHZvaWQgQWRkRXhpdChzdHJpbmd8c3RyaW5nKiBjbWQsIGNsb3N1cmV8c3RyaW5nIGRlc3QpOworCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvcm9vbS9leGl0cworCitBUkdVTUVOVEU6CisgICAgIHN0cmluZy9zdHJpbmcqIGNtZAorICAgICAgICAgIGRpZSBSaWNodHVuZyhlbiksIGluIGRpZSBkZXIgQXVzZ2FuZyBmdWVocnQKKyAgICAgc3RyaW5nL2Nsb3N1cmUgZGVzdAorICAgICAgICAgIGRhcyBaaWVsIGRlcyBBdXNnYW5ncyBtaXQgVGV4dC9DbG9zdXJlCisKK0JFU0NIUkVJQlVORzoKKworICAgICBFcyB3aXJkIGVpbiBBdXNnYW5nIGluIGRpZSBSaWNodHVuZyhlbikgY21kIGVpbmdlZnVlZ3QuIERpZSBBcnQgZGVzCisgICAgIEF1c2dhbmdzIGhhZW5ndCBhYiB2b24gZGVzdDoKKworICAgICAtIGVpbiBTdHJpbmc6CisgICAgICAgLSBtaXQgZWluZW0gRGF0ZWluYW1lbjoKKyAgICAgICAgIERlciBBdXNnYW5nIGZ1ZWhydCBpbiBkZW4gUmF1bSwgZGVuIGRlciBEYXRlaW5hbWUgYmV6ZWljaG5ldC4KKyAgICAgICAtIGRlciBGb3JtICI8bXNnPiNkYXRlaW5hbWUiCisgICAgICAgICBEZXIgQXVzZ2FuZyBmdWVocnQgaW4gZGVuIFJhdW0sIGRlbiBkZXIgRGF0ZWluYW1lIGJlemVpY2huZXQsCisgICAgICAgICBiZWkgZGVyIEJlbnV0enVuZyB3aXJkIGplZG9jaCBzdGF0dCAiPG5hbWU+IGdlaHQgbmFjaCA8cmljaHR1bmc+IgorICAgICAgICAgIjxuYW1lPiBnZWh0IG5hY2ggPG1zZz4iIGF1c2dlZ2ViZW4uCisgICAgIC0gZWluZSBDbG9zdXJlOgorICAgICAgIERpZSBDbG9zdXJlIHdpcmQgYmVpIE51dHp1bmcgZGVzIEF1c2dhbmdzIGF1ZmdlcnVmZW4uIERhcyBlbnRzcHJpY2h0CisgICAgICAgZWluZSBTcGVjaWFsRXhpdCAtIGluIGRlciBnZXJ1ZmVuZW4gRnVua3Rpb24gbXVzcyBtYW4gZGVuIFNwaWVsZXIKKyAgICAgICBzZWxic3QgaW4gZGVuIFppZWxyYXVtIGJld2VnZW4uCisgICAgICAgR2VnZWJlbmVuZmFsbHMga2FubiBkYXMgZHVyY2ggQWRkQ21kKCkgZXJzZXR6dCB3ZXJkZW4uCisKK0JFTUVSS1VOR0VOOgorICAgICBNYW4ga2FubiBmdWVyIGRlbiBEYXRlaW5hbWVuIGRlcyBaaWVscmF1bWVzIGF1Y2ggZWluZW4gcmVsYXRpdmVuIFBmYWQKKyAgICAgYW5nZWJlbi4gRGllIEF1c3dlcnR1bmcgZXJmb2xndCBuYWNoIGZvbGdlbmRlbSBTY2hlbWE6CisgICAgIC0gIi4vPGRhdGVpbmFtZT4iCisgICAgICAgRXMgd2lyZCBlaW4gWmllbHJhdW0gcmVsYXRpdiB6dW0gZ2xlaWNoZW4gVmVyemVpY2huaXMgd2llIGRpZXNlcgorICAgICAgIFJhdW0gYW5nZXNwcm9jaGVuLgorICAgICAtICIuLi88ZGF0ZWluYW1lPiIKKyAgICAgICBFcyB3aXJkIGVpbiBaaWVscmF1bSByZWxhdGl2IHp1ciBWZXJ6ZWljaG5pc2ViZW5lIHVlYmVyIGRlcgorICAgICAgIGRpZXNlcyBSYXVtZXMgYW5nZXNwcm9jaGVuIChhbmFsb2cgbWl0IG1laHJlcmVybiAiLi4vLi4iKQorCisgICAgIE1pdHRlbHMgUF9ISURFX0VYSVRTIGthbm4gbWFuIEF1c2dhZW5nZSB2ZXJzdGVja2VuLgorCisgICAgIEJlaSBkZXIgQmVudXR6dW5nIGVpbmVzIEF1c2dhbmdzIHdpcmQgZGVyIEhvb2sgSF9IT09LX0VYSVRfVVNFCisgICAgIGF1c2dlbG9lc3QuCisKK0JFSVNQSUVMRToKKyAgICAgIyMjIG5vcm1hbGUgQXVzZ2FlbmdlICMjIworICAgICAvLyBCZWltIEtvbW1hbmRvICJzdWVkZW4iIGtvbW10OiAiPG5hbWU+IGdlaHQgbmFjaCBTdWVkZW4uIgorICAgICBBZGRFeGl0KCJzdWVkZW4iLCAiL2dpbGRlbi9hYmVudGV1cmVyIik7CisKKyAgICAgLy8gQmVpbSBLb21tYW5kbyAic3VlZGVuIiBrb21tdDogIjxuYW1lPiBnZWh0IGluIGRpZSBHaWxkZS4iCisgICAgIEFkZEV4aXQoInN1ZWRlbiIsICJpbiBkaWUgR2lsZGUjL2dpbGRlbi9hYmVudGV1cmVyIik7CisKKyAgICAgIyMjIEF1c2dhZW5nZSBtaXQgcmVsYXRpdmVuIFBmYWRlbiAjIyMKKyAgICAgLy8gRGVyIE5hbWUgZGVzIFJhdW1lcyBzZWkgIi9kL2luc2Vsbi93YXJnb24vaGFmZW4xIgorICAgICAvLyBEaWVzZXIgQXVzZ2FuZyBnZWh0IG5hY2ggIi9kL2luc2Vsbi93YXJnb24va25laXBlIjoKKyAgICAgQWRkRXhpdCgibm9yZGVuIiwgIi4va25laXBlIiApOworCisgICAgIC8vIFVuZCBkaWVzZXIgbmFjaCAiL2QvaW5zZWxuL2FudGhlYS9hbmxlZ2UiOgorICAgICBBZGRFeGl0KCJzdWVkZW4iLCAiLi4vYW50aGVhL2FubGVnZSIgKTsKKworICAgICAjIyMgZHluYW1pc2NoZSBBdXNnYWVuZ2UgIyMjCisgICAgIC8vIGVpbiBBdXNnYW5nIHNvbGwgbnVyIHZvbiBGcm9lc2NoZW4gYmVudXR6YmFyIHNlaW46CisKKyAgICAgc3RhdGljIGludCBsb2NoZmt0KHN0cmluZyBkaXIpOwkJLy8gUHJvdG90eXAKKyAgICAgLi4uCisgICAgIEFkZEV4aXQoImxvY2giLCAjJ2xvY2hma3QpOworICAgICAvLyBhdWNoIGlkZW50aXNjaCB6dToKKyAgICAgLy8gQWRkU3BlY2lhbEV4aXQoImxvY2giLCAjJ2xvY2hma3QpOyBbZWluZSBDbG9zdXJlXSBvZGVyCisgICAgIC8vIEFkZFNwZWNpYWxFeGl0KCJsb2NoIiwgImxvY2hma3QiKTsgW2VpbiBGdW5rdGlvbnNuYW1lXQorCisgICAgIHN0YXRpYyBpbnQgbG9jaGZrdChzdHJpbmcgZGlyKSB7CisgICAgICAgaWYgKCEodGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKFBfRlJPRykpKSB7CisgICAgICAgICAvLyBLZWluIEZyb3NjaCA9PiBwYXNzdCBuaWNodCEKKyAgICAgICAgIG5vdGlmeV9mYWlsKCJEdSBiaXN0IHp1IGdyb3NzIVxuIik7CisgICAgICAgICByZXR1cm4gMDsKKyAgICAgICB9CisgICAgICAgLy8gTWVsZHVuZ2VuIHdlcmRlbiBpbSBtb3ZlKCkgZ2xlaWNoIG1pdGdlZ2ViZW4KKyAgICAgICByZXR1cm4gdGhpc19wbGF5ZXIoKS0+bW92ZSgiL3Jvb20vbG9jaCIsIE1fR08sIDAsCisgICAgICAgICAgICAgICAgICAgICJodWVwZnQgaW5zIExvY2giLCAiaHVlcGZ0IGhlcmVpbiIpOworICAgICB9CisKK1NJRUhFIEFVQ0g6CisgICAgIEFkZFNwZWNpYWxFeGl0KCksIEdldEV4aXRzKCkKKyAgICAgUmVtb3ZlRXhpdCgpLCBSZW1vdmVTcGVjaWFsRXhpdCgpLAorICAgICBIX0hPT0tfRVhJVF9VU0UsIFBfRVhJVFMsIFBfSElERV9FWElUUywgL3N0ZC9yb29tL2V4aXRzLmMKKyAgICAgYXVzZ2FlbmdlCisKKzMxLjAxLjIwMTUsIFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vQWRkRXhwIGIvZG9jL2xmdW4vQWRkRXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYWVkNTUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9BZGRFeHAKQEAgLTAsMCArMSwzMiBAQAorQWRkRXhwKCkKK0ZVTktUSU9OOgorICAgICBpbnQgQWRkRXhwKGludCBlKQorCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvbGl2aW5nL2xpZmUuYworCitBUkdVTUVOVEU6CisgICAgIGludCBlIC0gQW56YWhsIGRlciBoaW56dXp1ZnVlZ2VuZGVuIChhYnp1emllaGVuZGVuKSBYUAorCitCRVNDSFJFSUJVTkc6CisgICAgIERlbSBMaXZpbmcgd2VyZGVuIGUgWFAgYXVmIHNlaW5lIGJpc2hlcmlnZW4gUF9YUCBhZGRpZXJ0LgorCisgICAgIEZhbGxzIGVzIHNpY2ggdW0gZWluZW4gU3BpZWxlciBtaXQgUF9LSUxMUz4wIGhhbmRlbHQgdW5kCisgICAgIGUgcG9zaXRpdiBpc3QsIGJla29tbXQgZGVyIFNwaWVsZXIga2VpbmUgWFAgZ3V0Z2VzY2hyaWViZW4uCisKKyAgICAgUF9MQVNUX1hQIHdpcmQgYWt0dWFsaXNpZXJ0LgorCitCRU1FUktVTkc6CisgICAgIC0gcG9zaXRpdmUgdW5kIG5lZ2F0aXZlIFdlcnRlIHNpbmQgbW9lZ2xpY2gKKyAgICAgLSBQX1hQIHdpcmQgbmljaHQgPDAgZ2VzZXR6dC4KKworUlVFQ0tHQUJFV0VSVDoKKyAgICAgaW50IC0gbmV1ZXIgWFAtV2VydAorCitTSUVIRSBBVUNIOgorICAgICBGdW5rdGlvbmVuOiAgZG9fZGFtYWdlKCksIERpc3RyaWJ1dGVFeHAoKQorICAgICBQcm9wZXJ0aWVzOiAgUF9YUCwgUF9MQVNUX1hQCisgICAgIFNvbnN0aWdlczogICBQX05PX1hQLCBQX05PX1NDT1JFCisgICAgICAgICAgICAgICAgICBjcmVhdGVfZGVmYXVsdF9ucGMoKQorCisxNC5GZWIgMjAwNyBHbG9pbnNvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0FkZEV4dHJhTG9vayBiL2RvYy9sZnVuL0FkZEV4dHJhTG9vawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjZhODUxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vQWRkRXh0cmFMb29rCkBAIC0wLDAgKzEsOTYgQEAKK0FkZEV4dHJhTG9vaygpCit2YXJhcmdzIGludCBBZGRFeHRyYUxvb2soc3RyaW5nIGxvb2ssIFtpbnQgZHVyYXRpb24sIHN0cmluZyBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGxvb2tlbmRlLCBvYmplY3Qgb2JdKTsKK0RFRklOSUVSVCBJTjoKKyAgIC9zdGQvbGl2aW5nL2Rlc2NyaXB0aW9uLmMKKworQkVTQ0hSRUlCVU5HOgorICAgRGVyIEV4dHJhbG9vayBlcnNjaGVpbnQgaW4gZGVyIExhbmdiZXNjaHJlaWJ1bmcgZGVzIExlYmV3ZXNlbnMuCisgICBFaW50cmFlZ2Uga29lbm5lbiBtaXQgZGllc2VyIEZ1bmt0aW9uIGhpbnp1Z2VmdWVndCB3ZXJkZW4uIERpZXMgaXN0IGRlcgorICAgYmV2b3J6dWd0ZSBXZWcsIHdlbm4gYW5zb25zdGVuIGV4dHJhIGVpbiBPYmpla3QgaW0gU3BpZWxlcmludmVudGFyIGFiZ2VsZWd0CisgICB3ZXJkZW4gbXVlc3N0ZS4KKyAgIAorICAgQWxsZSBQYXJhbWV0ZXIgYmlzIGF1ZiA8bG9vaz4gc2luZCBvcHRpb25hbC4KKworQVJHVU1FTlRFOgorICAtIHN0cmluZyBsb29rOgorICAgIFN0cmluZywgZGVyIGluIGRlciBMYW5nYmVzY2hyZWlidW5nIGRlcyBMZWJld2VzZW5zIHp1c2FldHpsaWNoIGF1c2dlZ2ViZW4KKyAgICB3aXJkLgorICAgIEthbm4gYXVjaCBlaW4gRnVua3Rpb25zbmFtZSBzZWluLCB3ZW5uIDxvYj4gYW5nZWdlYmVuIHdpcmQgKHMudS4pLgorICAtIGludCBkdXJhdGlvbjoKKyAgICA+IDA6IFdpZSBsYW5nIGJsZWlidCBkZXIgRXh0cmFsb29rIGd1ZWx0aWcgKGluIFNla3VuZGVuKT8gQW5zY2hsaWVzc2VuZCAKKyAgICAgICAgIHdpcmQgZXIgYXV0b21hdGlzY2ggZ2Vsb2VzY2h0LgorICAgIDA6ICAgRGllc2VyIEVpbnRyYWcgYmxlaWJ0IHVuYmVncmVuenQgZ3VlbHRpZy4KKyAgICA8IDA6IERpZXNlciBFaW50cmFnIGJsZWlidCBiaXMgenVtIEVuZGUvUmVib290IGJlc3RlaGVuLgorICAtIHN0cmluZyBrZXk6CisgICAgU2NobHVlc3NlbHdvcnQsIHVudGVyIGRlbSBkZXIgRWludHJhZyByZWdpc3RyaWVydCB3aXJkIHVuZCBtaXQgZGVtIG1hbiBpaG4KKyAgICBhdWNoIG1pdHRlbHMgUmVtb3ZlRXh0cmFMb29rKCkgZW50ZmVybmVuIGthbm4uIFNvbGx0ZSBuYXR1ZXJsaWNoCisgICAgbW9lZ2xpY2hzdCBlaW5kZXV0aWcgc2Vpbi4gOy0pIFdlbm4gPGtleT4gbmljaHQgYW5nZWJlbiB3aXJkLCB3aXJkIGRlciAKKyAgICBPYmpla3RuYW1lIChvYmplY3RfbmFtZSgpKSBiZW51dHp0LgorICAtIHN0cmluZyBsb29rZW5kZToKKyAgICBTdHJpbmcsIGRlciBhbiBkYXMgTGViZXdlc2VuIChudXIgYmVpIFNwaWVsZXJuKSBhdXNnZWdlYmVuIHdpcmQsIHdlbm4gZGVyCisgICAgZWluZ2V0cmFnZW5lIEV4dHJhbG9vayBhYmdlbGF1ZmVuIGlzdC4KKyAgICBLYW5uIGF1Y2ggZWluIEZ1bmt0aW9uc25hbWUgc2Vpbiwgd2VubiA8b2I+IGFuZ2VnZWJlbiB3aXJkLgorICAtIG9iamVjdCBvYjoKKyAgICBXZW5uIGhpZXIgZWluIE9iamVrdCBhbmdlZ2ViZW4gd2lyZCwgd2VyZGVuIDxsb29rPiB1bmQgPGxvb2tlbmRlPiBhbHMKKyAgICBGdW5rdG9uc25hbWVuIGF1ZmdlZmFzc3QuIERpZXNlIEZ1bmt0aW9uZW4gd2VyZGVuIGluIDxvYj4gYXVmZ2VydWZlbiwgd2VubgorICAgIGRlciBFeHRyYWxvb2sgZGVzIExlYmV3ZXNlbiBhbmdlemVpZ3Qgd2lyZCBiencuIGRlciBlaW5nZXRyYWdlbmUgRXh0cmFsb29rCisgICAgYWJnZWxhdWZlbiBpc3QuIERpZXNlIEZ1bmt0aW9uZW4gYmVrb21tZW4gZGFzIGpld2VpbGlnZSBMZWJlbndlc2VuIGFscworICAgIE9iamVrdCB1ZWJlcmdlYmVuLiBTaWUgbXVlc3NlbiBlaW5lbiBTdHJpbmcgenVydWVja2xpZWZlcm4sIGRlciBhdXNnZWdlYmVuCisgICAgd2lyZC4gRGllc2VyIFN0cmluZyB3aXJkIGRpcmVrdCBzbyBhdXNnZWJlbiwgYWxzbyBzZWxiZXIgZnVlciBaZWlsZW51bWJydWNoCisgICAgZXRjLiBzb3JnZW4hCisgICAgV0lDSFRJRzogRGFzIE9iamVrdCBzb2xsdGUgbmFjaCBNb2VnbGljaGtlaXQgZWluZSBCbHVlcHJpbnQgc2VpbiwgZGEgZGFzCisgICAgZ2FuemUgbml4IG1laHIgYXVzZ2lidCwgc29iYWxkIGRlciBDbG9uZSB6ZXJzdG9lcnQgd2lyZCwgZmFsbHMgaGllciAKKyAgICBlaW5lciBhbmdlYmVuIHdpcmQuIFdlbm4gaWhyIGtlaW5lIEJQIHVlYmVyZ2VidDogV2lzc3QsIHdhcyBpaHIgdHV0LiA7LSkKKworUlVFQ0tHQUJFV0VSVEU6CisgID4gMCwgZmFsbHMgZGVyIEVpbnRyYWcgZXJmb2xncmVpY2ggcmVnaXN0cmllcnQgd3VyZGUuCisgIDwgMCBzb25zdC4KKyAgICAtMTogPGtleT4gd2FyIG5pY2h0IGd1ZWx0aWcgdW5kIGVzIGtvbm50ZSBrZWluZXIgZXJtaXR0ZWx0IHdlcmRlbi4KKyAgICAtMjogPGxvb2s+IHdhciBrZWluIGd1ZWx0aWdlciBTdHJpbmcuCisgICAgLTM6IDxkdXJhdGlvbj4gd2FyIGtlaW4gSW50ZWdlci4KKyAgICAtNDogdW50ZXIgPGtleT4gZ2lidCBlcyBzY2hvbiBlaW5lbiBFaW50cmFnLgorCitCRU1FUktVTkdFTjoKKyAgRGllIFN0cmluZ3MgPGxvb2s+IHVuZCA8bG9va2VuZGU+IHdlcmRlbiB2b3IgQXVzZ2FiZSBkdXJjaAorICByZXBsYWNlX3BlcnNvbmFsKCkgZ2VzY2hpY2t0LCBkYWhlciBpc3QgZGllIFZlcndlbmR1bmcgdm9uIEBXRVIxLCBAV0VTU0VOMQorICB1c3cuIG1vZWdsaWNoIChzLiByZXBsYWNlX3BlcnNvbmFsKS4gRGllcyBnaWx0IGFiZXIgX25pY2h0XyBmdWVyIGRlbiBGYWxsLAorICBkYXNzIGRpZSBlbnRzcHJlY2hlbmRlbiBGdW5rdGlvbmVuIGluIDxvYj4gZ2VydWZlbiB3ZXJkZW4sIGRhbm4gbXVlc3NlbiBkaWUKKyAgRnVua3Rpb25lbiBzZWxiZXIgdW1icmVjaGVuLCBldGMuCisgIE5hY2ggcmVwbGFjZV9wZXJzb25hbCgpIHdlcmRlbiBkaWUgU3RyaW5ncyBub2NoIHZvbiBicmVha19zdHJpbmcoKSBhdWYgNzgKKyAgWmVpbGVuIHVtZ2Vicm9jaGVuLCBhbGxlcmRpbmdzIGJsZWliZW4gZGFiZWkgdm9yaGFuZGVuZSBVbWJydWVjaGUgZXJoYWx0ZW4uCisgIERpZSBNZWxkdW5nIHZvbiA8bG9va2VuZGU+IGJ6dy4gZGVyIEZ1bmt0aW9uc2F1ZnJ1ZiBlcmZvbGd0LCB3ZW5uIGRlcgorICBFeHRyYWxvb2sgZGVyIExlYmV3ZXNlbiBkYXMgZXJzdGUgTWFsIG5hY2ggQWJsYXVmIGRlciBHdWVsdGlna2VpdCBhdWZnZXJ1ZmVuCisgIHdpcmQuCisKK0JFSVNQSUVMRToKKyAgIyBlaW5mYWNoZXIgRWludHJhZywgImZ1ZXIgZGllIEV3aWdrZWl0IgorICBsaXZpbmctPkFkZEV4dHJhTG9vaygiQFdFUjEgaGF0IGRlbiBEcmFjaGVuZ290dCBkZXIgU1NQIGJlc2llZ3QuIik7CisKKyAgIyBFaW50cmFnIGRlciBuYWNoIDFoIGF1dG9tYXRpc2NoIHdlZyBpc3QuCisgIGxpdmluZy0+QWRkRXh0cmFMb29rKCJAV0VSMSBpc3QgZ2FueiBtaXQgTWFybWVsYWRlIGJlZGVja3QuIiwgMzYwMCk7CisgIAorICAjIEVpbnRyYWcgbWl0IGJlc3RpbW10ZW4gU2NobHVlc3NlbCwgZGFtaXQgbWFuIGlobiB3aWVkZXIgZW50ZmVybmVuIGthbm4uCisgIGxpdmluZy0+QWRkRXh0cmFMb29rKCJAV0VSMSBpc3QgZ2FueiBtaXQgTWFybWVsYWRlIGJlZGVja3QuIiwgMzYwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgImh1bW5pX21hcm1lbGFkZW5fbG9vayIpOworICAKKyAgIyBNaXQgIkVuZGUiLU1lbGR1bmcsIGFiZXIga2VpbiBlaWdlbmVyIFNjaGx1ZXNzZWwuCisgIGxpdmluZy0+QWRkRXh0cmFMb29rKCJAV0VSMSBpc3QgcGF0c2NobmFzcy4iLCAxMjAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAiRHUgYmlzdCBlbmRsaWNoIHdpZWRlciB0cm9ja2VuLiBQdXVoLiIpOworICAKKyAgIyBNaXQgT2JqZWt0LCB3YXMgZGVuIEV4dHJhbG9vayBkeW5hbWlzY2ggZXJ6ZXVndAorICBsaXZpbmctPkFkZEV4dHJhTG9vaygiZ2V0X215X3NwZWNpYWxfZXh0cmFsb29rIiwgMzYwMCwgMCwgMCwgdGhpc19vYmplY3QoKSk7CisgICAgSW4gZGllc2VtIEZhbGwgbXVzcyB0aGlzX29iamVjdCgpIG5hdHVlcmxpY2ggZGllIEZ1bmt0aW9uCisgICAgImdldF9teV9zcGVjaWFsX2V4dHJhbG9vaygpIiBkZWZpbmllcmVuLCBkaWUgZWluZW4gU3RyaW5nIHp1cnVlY2tnaWJ0LgorCisgICMgTWl0IE9iamVrdCwgd2FzIGRlbiBFeHRyYWxvb2sgdW5kIGRpZSBFbmRlbWVsZHVuZyBkeW5hbWlzY2ggZXJ6ZXVndAorICBsaXZpbmctPkFkZEV4dHJhTG9vaygiZ2V0X215X3NwZWNpYWxfZXh0cmFsb29rIiwgMzYwMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgImV4dHJhbG9va2VuZGUiLCB0aGlzX29iamVjdCgpKTsKKworU0lFSEUgQVVDSDoKKyAgIFJlbW92ZUV4dHJhTG9vaygpLAorICAgcmVwbGFjZV9wZXJzb25hbCgpLCBicmVha19zdHJpbmcoKQorICAgUF9JTlRFUk5BTF9FWFRSQV9MT09LCisKKzE0LjA1LjIwMDcsIFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vQWRkRml4ZWRPYmplY3QgYi9kb2MvbGZ1bi9BZGRGaXhlZE9iamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTJlMTcyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vQWRkRml4ZWRPYmplY3QKQEAgLTAsMCArMSw1MiBAQAorQWRkRml4ZWRPYmplY3QoKQorCitGVU5LVElPTjoKKyAgICAgICAgdmFyYXJncyB2b2lkIEFkZEZpeGVkT2JqZWN0KHN0cmluZyBzdHIsIGludCB2YWwsIG1peGVkIGlkcyk7CisKK0RFRklOSUVSVCBJTjoKKyAgICAgICAgL3N0ZC9yb29tL3Nob3AuYworCitBUkdVTUVOVEU6CisgICAgICAgIHN0cgorICAgICAgICAgIERlciBhYnNvbHV0ZSBGaWxlbmFtZSBlaW5lcyBPYmpla3RzLCBkYXMgaW4gcXVhc2kgYmVsaWViaWdlciBNZW5nZQorICAgICAgICAgIHZvbSBiZXRyZWZmZW5kZW4gTGFkZW4gdmVya2F1ZnQgd2VyZGVuIHNvbGwuCisgICAgICAgIHZhbAorICAgICAgICAgIFNvZmVybiBhbmdlZ2ViZW4gZGVyIGFuZ2Vub21tZW5lIFdlcnQgZGVzIE9iamVrdHMuIEZhbGxzIHZhbCBuaWNodAorICAgICAgICAgIGFuZ2VnZWJlbiBvZGVyIDAgaXN0LCB3aXJkIGRlciBXZXJ0IGF1cyBkZW0gYW5nZWdlYmVuZW4gT2JqZWt0CisgICAgICAgICAgc2VsYnN0IGVybWl0dGVsdC4KKyAgICAgICAgICBEZXIgVmVya2F1ZnNwcmVpcyBpc3QgMyAqIFdlcnQgZGVzIE9iamVrdHMuCisgICAgICAgIGlkcworICAgICAgICAgIFN0cmluZyBvZGVyIFN0cmluZ2FycmF5IG1pdCBkZXIgSUQgb2RlciBkZW4gSURzLCB1ZWJlciBkaWUgbWFuIGRhcworICAgICAgICAgIE9iamVrdCBpbSBMYWRlbiBhbnNwcmVjaGVuIGthbm4uIEZhbGxzIG5pY2h0IGFuZ2VnZWJlbiwgd2lyZCBkaWUKKyAgICAgICAgICBJRC1MaXN0ZSBhdXMgZGVyIGJsdWVwcmludCBkZXMgT2JqZWt0cyBhdXNnZWxlc2VuLgorCitCRVNDSFJFSUJVTkc6CisgICAgICAgIE1pdCBkaWVzZXIgRnVua3Rpb24ga2FubiBtYW4gZWluZW0gTGFkZW4gbWl0dGVpbGVuLCBkYXNzIGVpbiBPYmpla3QKKyAgICAgICAgaW4gaWhtIGluIHVuYmVncmVuenRlciBBbnphaGwgdmVya2F1ZnQgd2VyZGVuIHNvbGwuCisgICAgICAgIFdJQ0hUSUc6IERhcyB6dSB2ZXJrYXVmZW5kZSBPYmpla3Qgc29sbHRlIGRpZXMgaW5zb2Zlcm4gdW50ZXJzdHVldHplbiwgCisgICAgICAgIGRhc3MgZGllIEJsdWVwcmludCBkaWUgbm90d2VuZGlnZW4gSW5mb3JtYXRpb25lbgorICAgICAgICAoUF9TSE9SVCwgUF9JRFMsIFBfVkFMVUUsIFBfTE9ORywgUF9OQU1FKSBiZWluaGFsdGV0LiBEaWVzIGJlZGV1dGV0IGltCisgICAgICAgIGVpbmZhY2hzdGVuIEZhbGwsIGRhc3MgaW0gY3JlYXRlKCkgYXVmCisgICAgICAgICAgaWYgKCFjbG9uZXAoKSkgcmV0dXJuOworICAgICAgICB2ZXJ6aWNodGV0IHdpcmQuCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgICAgIGtlaW5lcgorICAgICAgICAKK0JFSVNQSUVMRToKKyAgICAgICAgQWRkRml4ZWRPYmplY3QoIi9vYmovZmFja2VsIiwgNTAwMCwgImZhY2tlbCIpOworICAgICAgICAgIERlciBMYWRlbiB2ZXJrYXVmdCBGYWNrZWxuIHp1bSBQcmVpcyB2b24gMyo1MDAwIEdvbGRtdWVuemVuIHVuZCBtYW4KKyAgICAgICAgICBrYW5uIGRpZSBGYWNrZWwgKGF1c3NlciB1ZWJlciBkaWUgSW52ZW50YXJudW1tZXIpIG51ciBtaXR0ZWxzIGRlcgorICAgICAgICAgIGlkICJmYWNrZWwiIGthdWZlbi4KKyAgICAgICAgICAKKyAgICAgICAgQWRkRml4ZWRPYmplY3QoIi9vYmovZmFja2VsIik7CisgICAgICAgICAgRGVyIExhZGVuIHZlcmthdWZ0IEZhY2tlbG4genVtIGRyZWlmYWNoZW4gV2VydCBkZXNzZW4sIHdhcyBpbSBPYmpla3QKKyAgICAgICAgICAvb2JqL2ZhY2tlbC5jIGFuZ2VnZWJlbiBpc3QgKGRlcnplaXQgc2luZCBkYXMgNSBNdWVuemVuKSB1bmQgbGFlc3N0CisgICAgICAgICAgYWxsZSBJRHMgenUsIGRpZSBpbiAvb2JqL2ZhY2tlbC5jIGFuZ2VnZWJlbiBzaW5kLiBEZXJ6ZWl0IGlzdCBkYXMKKyAgICAgICAgICBhdWNoIG51ciAiZmFja2VsIi4KKworU0lFSEUgQVVDSDoKKwlSZW1vdmVGaXhlZE9iamVjdCgpLCBTZXRTdG9yYWdlUm9vbSgpLCAvc3RkL3N0b3JlLmMKKyAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMZXR6dGUgQWVuZGVydW5nOiBTYXQgTm92ICA5IDEyOjU5OjI1IDIwMDIgZHVyY2ggQmFtYmkKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0FkZEZvb2QgYi9kb2MvbGZ1bi9BZGRGb29kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYTE4ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9BZGRGb29kCkBAIC0wLDAgKzEsMTIgQEAKK0FkZEZvb2QoKQorCitCRU1FUktVTkdFTjoKKworICAgICAgICBEaWUgRnVua3Rpb24gQWRkRm9vZCgpIHNvbGx0ZSBOSUNIVCBNRUhSIEJFTlVUWlQgd2VyZGVuLgorICAgICAgICBCaXR0ZSBBZGRUb01lbnUoKSB2ZXJ3ZW5kZW4uCisKK1NJRUhFIEFVQ0g6CisgICAgICAgIEFkZFRvTWVudSgpLCBSZW1vdmVGcm9tTWVudSgpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IEZyaSBNYXIgMDMgMTM6MjM6MDAgMjAwMCBieSBQYXJhY2Vsc3VzCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9BZGRGdWVsIGIvZG9jL2xmdW4vQWRkRnVlbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjAwMzUwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vQWRkRnVlbApAQCAtMCwwICsxLDI5IEBACitBZGRGdWVsKCkKKworRlVOS1RJT046CisgICAgIHZvaWQgQWRkRnVlbChpbnQgZnVlbCk7CisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC9saWdodHNvdXJjZS5jCisKK0FSR1VNRU5URToKKyAgICAgZnVlbAorICAgICAgICAgIERpZSB6dXNhZXR6bGljaGUgQnJlbm5kYXVlciBpbiBTZWt1bmRlbi4KKworQkVTQ0hSRUlCVU5HOgorICAgICBEaWUgQnJlbm5kYXVlciBkZXIgTGljaHRxdWVsbGUgd2lyZCB1bSBmdWVsIFNla3VuZGVuIHZlcmxhZW5nZXJ0LgorCitSVWVDS0dBQkVXRVJUOgorICAgICBrZWluZXIKKworQkVNRVJLVU5HRU46CisgICAgIEVzIHdlcmRlbiBrZWluZSBDaGVja3MgZHVyY2hnZWZ1ZWhydCEgV2VubiBtYW4gc2VpbmUgTGljaHRxdWVsbGUKKyAgICAgbmFjaGZ1ZWxsYmFyIGdlc3RhbHRlbiB3aWxsLCBzb2xsdGUgZGllIE5hY2hmdWVsbGZ1bmt0aW9uIHZvciBkZW0KKyAgICAgQWRkRnVlbCgpLUF1ZnJ1ZiBuYWNoc2VoZW4sIHdpZSB2b2xsIGRpZSBMaWNodHF1ZWxsZSBub2NoIGlzdCwgdW5kIGZ1ZWwKKyAgICAgZW50c3ByZWNoZW5kIGJlZ3Jlbnplbi4KKworU0lFSEUgQVVDSDoKKyAgICAgL3N0ZC9saWdodHNvdXJjZS5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFdlZCBNYXkgOCAxMDoxNjozOSAxOTk2IGJ5IFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vQWRkRnVuIGIvZG9jL2xmdW4vQWRkRnVuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNWI1YWMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9BZGRGdW4KQEAgLTAsMCArMSw2MyBAQAorQWRkRnVuKCkKKworRlVOS1RJT046CisgICAgIHZvaWQgQWRkRnVuKHN0cmluZyBmdW4sIGludCBuZXh0KTsKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL3RyYW5zcG9ydC5jCisKK0FSR1VNRU5URToKKyAgICAgZnVuCisgICAgICAgICAgTmFtZSBkZXIgRnVua3Rpb24uCisgICAgIG5leHQKKyAgICAgICAgICBaZWl0IGJpcyB6dXIgbmFlY2hzdGVuIEZhaHJwbGFuc3RhdGlvbi4KKworQkVTQ0hSRUlCVU5HOgorICAgICBEZW0gRmFocnBsYW4gd2lyZCBkZXIgQXVmcnVmIGRlciBGdW5rdGlvbiBmdW4sIGRpZSBpbSBUcmFuc3BvcnRlcgorICAgICBkZWZpbmllcnQgc2VpbiBtdXNzLCBoaW56dWdlZnVlZ3QuIE5hY2ggQXVmcnVmIGRlciBGdW5rdGlvbiB2ZXJnZWhlbgorICAgICBuZXh0IFNla3VuZGVuLCBiaXMgZGllIG5hZWNoc3RlIFN0YXRpb24gYW5nZWZhaHJlbiB3aXJkLgorCitSVWVDS0dBQkVXRVJUOgorICAgICBrZWluZXIKKworQkVJU1BJRUxFOgorICAgICBXZW5uIGVpbiB6dWZhZWxsaWcgYXVzZ2V3YWVobHRlciBQYXNzYWdpZXIgZWluZXMgU2NoaWZmZXMgdW50ZXJ3ZWdzCisgICAgIHNlZWtyYW5rIHdlcmRlbiBzb2xsLCBrb2VubnRlIG1hbiBkYXMgd2llIGZvbGd0IHJlYWxpc2llcmVuOgorCisgICAgIGNyZWF0ZSgpCisgICAgIHsKKyAgICAgICAuLi4KKworICAgICAgIEFkZEZ1bigic2Vla3JhbmsiLCA1KTsKKyAgICAgICAuLi4KKyAgICAgfQorCisgICAgIHNlZWtyYW5rKCkKKyAgICAgeworICAgICAgIG9iamVjdCAqcGFzc2FnaWVyZSwgb3BmZXI7CisKKyAgICAgICAvLyBzb2xsIG5pY2h0IGltbWVyIHBhc3NpZXJlbgorICAgICAgIGlmIChyYW5kb20oNSkpCisgICAgICAgICByZXR1cm47CisKKyAgICAgICAvLyBPcGZlciBhdXN3YWVobGVuCisgICAgICAgcGFzc2FnaWVyZSA9IFF1ZXJ5UGFzc2VuZ2VycygpOworICAgICAgIGlmIChzaXplb2YocGFzc2FnaWVyZSkpCisgICAgICAgICBvcGZlciA9IHBhc3NhZ2llcmVbcmFuZG9tKHNpemVvZihwYXNzYWdpZXJlKSldOworCisgICAgICAgLy8gVW5kIHZpZWwgU3Bhc3MuLi4KKyAgICAgICB0ZWxsX29iamVjdChvcGZlciwKKyAgICAgICAgICJEdSB3aXJzdCBzZWVrcmFuayEgU2NobmVsbCBzdHVlcnp0IER1IHp1ciBSZWxpbmcgdW0gIERpY2ggenVcbiIKKyAgICAgICAgKyJ1ZWJlcmdlYmVuLlxuIik7CisgICAgICAgdGVsbF9yb29tKHRoaXNfb2JqZWN0KCksCisgICAgICAgICBzcHJpbnRmKCIlcyB1ZWJlcmtvbW10IGRpZSBTZWVrcmFua2hlaXQhXG4lcyBzdHVlcnp0IGFuIGRpZSBSZWxpbmcsICIKKyAgICAgICAgICAgICAgICArInVtIHNpY2ggenUgdWViZXJnZWJlbi5cbiIsCisgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUob3BmZXItPm5hbWUoV0VOKSksCisgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUob3BmZXItPlF1ZXJ5UHJvbm91bihXRVIpKSksICh7IG9wZmVyIH0pICk7CisgICAgIH0KKworU0lFSEUgQVVDSDoKKyAgICAgQWRkUm91dGUoKSwgQWRkTXNnKCksIC9zdGQvdHJhbnNwb3J0LmMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogV2VkIE1heSA4IDEwOjE2OjQ2IDE5OTYgYnkgV2FyZ29uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9BZGRJZCBiL2RvYy9sZnVuL0FkZElkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMWNlNzYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9BZGRJZApAQCAtMCwwICsxLDUwIEBACitBZGRJZCgpCisKK0ZVTktUSU9OOgorICAgICB2b2lkIEFkZElkKHN0cmluZ3xzdHJpbmcqIGlkcyk7CisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC90aGluZy9kZXNjcmlwdGlvbi5jCisKK0FSR1VNRU5URToKKyAgICAgaWRzCisgICAgICAgICAgU3RyaW5nIG9kZXIgQXJyYXkgdm9uIFN0cmluZ3MgbWl0IGRlbiBCZXplaWNobnVuZ2VuLCBtaXQgZGVuZW4KKyAgICAgICAgICBzaWNoIHNpY2ggZGFzIE9iamVrdCBhbnNwcmVjaGVuIGxhc3NlbiBzb2xsLgorCitCRVNDSFJFSUJVTkc6CisgICAgIEplZGVzIE9iamVrdCBzb2xsdGUgc2ljaCBhdWYgZGllIGVpbmUgb2RlciBhbmRlcmUgV2Vpc2UgYW5zcHJlY2hlbgorICAgICBsYXNzZW4uIFp1IGRpZXNlbSBad2VjayBrYW5uIG1hbiBkZW0gT2JqZWt0IG1pdCBkaWVzZXIgRnVua3Rpb24KKyAgICAgQmV6ZWljaG5lciB1ZWJlcmdlYmVuLgorCitSVWVDS0dBQkVXRVJUOgorICAgICBrZWluZXIKKworQkVNRVJLVU5HRU46CisgICAgIEplZGVzIE9iamVrdCBzb2xsdGUgbWFuIHp1bWluZGVzdCBtaXQgc2VpbmVyIEt1cnpiZXNjaHJlaWJ1bmcKKyAgICAgYW5zcHJlY2hlbiBrb2VubmVuISBGdWVyIEFiZnJhZ2VuIHZvbiBRdWVzdG9iamVrZW4gby5hZS4gc29sbHRlIG1hbgorICAgICB6dXNhZXR6bGljaCBJRHMgdmVyd2VuZGVuLCBkaWUgU29uZGVyemVpY2hlbiB3aWUgIlxuIiBvZGVyICJcdCIKKyAgICAgZW50aGFsdGVuLCBkYW1pdCBzaWNoZXJnZXN0ZWxsdCBpc3QsIGRhc3MgZGVyIFNwaWVsZXIgYXVjaCB3aXJrbGljaCBkaWUKKyAgICAgcmljaHRpZ2VuIE9iamVrdGUgZGFiZWloYXQuCisKK0JFSVNQSUVMRToKKworICAgICBBZGRJZCggImJ1Y2giICk7CisgICAgIEFkZElkKCAiYnVlY2hsZWluIiApOworCisgICAgIERhcyBPYmpla3QgbGFlc3N0IHNpY2ggamV0enQgYWxzICJidWNoIiB1bmQgYWxzICJidWVjaGxlaW4iIGFuc3ByZWNoZW4uCisKKyAgICAgQWRkSWQoICh7ICJidWNoIiwgImJ1ZWNobGVpbiIgfSkgKTsKKworICAgICBEaWVzZSBaZWlsZSBiZXdpcmt0IGRhcyBnbGVpY2hlIHdpZSBkaWUgb2JpZ2VuIHp3ZWkgWmVpbGVuLgorCisgICAgIEFkZElkKCAoeyAicHV6emxlIiwgIlxucXVlc3RfcHV6emxlIiB9KSApOworCisgICAgIERlciBTcGllbGVyIGthbm4gZGFzIE9iamVrdCBhbHMgInB1enpsZSIgYW5zcHJlY2hlbiwgcXVlc3RyZWxldmFudGUKKyAgICAgT2JqZWt0ZSBrb2VubmVuIG1pdCBkZXIgSUQgIlxucXVlc3RfcHV6emxlIiBuYWNoIGlobSBzdWNoZW4uCisKK1NJRUhFIEFVQ0g6CisgICAgIEFkZEFkamVjdGl2ZSgpLCBSZW1vdmVJZCgpLCBpZCgpLCBwcmVzZW50KCksIC9zdGQvdGhpbmcvZGVzY3JpcHRpb24uYworCisgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisyMC4wMS4yMDE1LCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0FkZEluZm8gYi9kb2MvbGZ1bi9BZGRJbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZTdiZDIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9BZGRJbmZvCkBAIC0wLDAgKzEsMjE5IEBACitBZGRJbmZvKCkKK0ZVTktUSU9OOgorICAgICB2YXJhcmdzIHZvaWQgQWRkSW5mbyggZnJhZ2UsIG1lbGR1bmcKKwkJCSAgIFssIGluZGVudCBbLCBbc2lsZW50IFssIGNhc2ViYXNlZF0gXSBdICk7CisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC9ucGMvaW5mby5jCisKK0FSR1VNRU5URToKKyAgICAgc3RyaW5nL3N0cmluZyogZnJhZ2UKKwlTY2hsdWVzc2VsdGV4dChlKSBhdWYgZGllIEluZm9ybWF0aW9uZW4gZ2VnZWJlbiB3ZXJkZW4gc29sbGVuLgorICAgICBzdHJpbmcvY2xvc3VyZSBtZWxkdW5nCisJSW5mb3JtYXRpb24sIGRpZSBnZWdlYmVuIHdlcmRlbiBzb2xsL0Nsb3N1cmUKKyAgICAgc3RyaW5nIGluZGVudAorCVRleHQsIGRlciBzaWNoIGJlaSBtZWhyemVpbGlnZW4gTWVsZHVuZ2VuIHdpZWRlcmhvbGVuIHNvbGwuCisgICAgIGludC9zdHJpbmcgc2lsZW50CisJSXN0IHNpbGVudCBnZXNldHp0LCBzbyBlcmZvbGd0IEFudHdvcnQgbnVyIGFuIEZyYWdlbmRlbi4KKyAgICAgc3RyaW5nL2Nsb3N1cmUgY2FzZWJhc2VkCisJQ2xvc3VyZSBtaXQgUmV0dXJud2VydCBzdHJpbmcgb2RlciBpbnQuCisKK0JFU0NIUkVJQlVORzoKKyAgICAgV2VubiBlaW4gU3BpZWxlciBlaW4gTlBDIG1pdHRlbHMgImZyYWdlIDxtb25zdGVybmFtZT4gbmFjaCA8ZnJhZ2U+IiBuYWNoCisgICAgIGVpbmVyIEluZm9ybWF0aW9uIG1pdCBkZW0gU2NobHVlc3NlbCAnZnJhZ2UnIGZyYWd0LCBzbyB3aXJkIGRpZQorICAgICBlbnRzcHJlY2hlbmRlICdtZWxkdW5nJyBhdXNnZWdlYmVuIChvZGVyIGRpZSBDbG9zdXJlIGluICdtZWxkdW5nJworICAgICBnZXJ1ZmVuIHVuZCBkZXIgenVydWVja2dlZ2ViZW5lIFRleHQgYXVzZ2VnZWJlbikuIERlciBNZWxkdW5nIHdpcmQKKyAgICAgZGVyIE5hbWUgZGVzIE1vbnN0ZXJzIHZvcmFuZ2VzdGVsbHQuCisKKyAgICAgRnJhZ2U6CisgICAgICBTY2hsdWVzc2VsIG11ZXNzZW4ga2xlaW5nZXNjaHJpZWJlbiBzZWluLCBrb2VubmVuIGFiZXIgTGVlcnplaWNoZW4KKyAgICAgIGVudGhhbHRlbi4KKworICAgICBNZWxkdW5nOgorICAgICAgV2VubiBrZWluICdpbmRlbnQnIGFuZ2VnZWJlbiBpc3QsIG11c3MgbWFuIGRpZSBNZWxkdW5nIHNlbGJzdAorICAgICAgdW1icmVjaGVuLgorCisgICAgIEluZGVudDoKKyAgICAgIFdpcmQgZWluICdpbmRlbnQnIGFuZ2VnZWJlbiBzbyB3aXJkIGplZGVyIFplaWxlIGhpbnRlciBkZW0KKyAgICAgIE1vbnN0ZXJuYW1lbiBub2NoIGRhcyAnaW5kZW50JyB2b3Jhbmdlc2V0enQuIFp1c2FldHpsaWNoIHdpcmQKKyAgICAgICdtZWxkdW5nJyBhdWYgamVkZW4gRmFsbCBzYXViZXIgdW1nZWJyb2NoZW4uCisgICAgICBFaW4gdHlwaXNjaGVzIGluZGVudCBpc3QgInNhZ3Q6ICIuCisKKyAgICAgU2lsZW50OgorICAgICAgQmVpICdzaWxlbnQnPT0xIGVyZm9sZ3Qga2VpbmUgVGV4dGF1c2dhYmUgZGVyIEFudHdvcnRtZWxkdW5nIGltIFJhdW0sCisgICAgICBpc3QgJ3NpbGVudCcgZWluIFN0cmluZywgc28gd2lyZCBqZW5lciBhbiBhbGxlIGFuZGVyZW4gU3BpZWxlciBhdXNzZXIKKyAgICAgIGRlbSBGcmFnZXN0ZWxsZXIgaW0gUmF1bSBhdXNnZWdlYmVuLgorCisgICAgIENhc2ViYXNlZDoKKyAgICAgIERpZSBhbHMgQ2xvc3VyZSBhbmdlZ2ViZW5lIE1ldGhvZGUgZW50c2NoZWlkZXQsIG9iIG9kZXIgd2llIGRlciBOUEMgCisgICAgICBhdWYgZGllc2UgRnJhZ2UgYW50d29ydGVuIHNvbGw6CisgICAgICAtIHJldHVybiAwOglub3JtYWxlIEFudHdvcnQgbWl0ICJtZWxkdW5nIgorICAgICAgLSByZXR1cm4gMToJa2VpbmUgQW50d29ydC9BbnR3b3J0IG1pdCBERUZBVUxUX05PSU5GTworICAgICAgLSByZXR1cm4gc3RyaW5nOglBbnR3b3J0IG1pdCBzdHJpbmcgdW50ZXIgQmVydWVja3NpY2h0aWd1bmcgZWluZXMKKwkJCWluZGVudAorCisgICAgIERpZSBTdHJpbmdzIHZvbiAnc2lsZW50JyB1bmQgJ21lbGR1bmcnIHdlcmRlbiBnZXBhcnNlZC4gRGFiZWkgd2VyZGVuIGRpZQorICAgICBTY2hsdWVzc2Vsd29ydGUgQFdFUiwgQFdFU1NFTiwgQFdFTSwgQFdFTiBkdXJjaCBUUC0+TmFtZSguLikgZXJzZXR6dCB1bmQKKyAgICAgQENBUF9XRVIsIEBDQVBfV0VTU0VOLCBAQ0FQX1dFTSwgQENBUF9XRU4gZHVyY2ggY2FwaXRhbGl6ZShUUC1OYW1lKC4uKSkuCisKKyAgICAgTWl0dGVscyBkZXIgaW4gPG5wYy5oPiBkZWZpbmllcnRlbiBGcmFnZSBERUZBVUxUX0lORk8ga2FubiBlaW5lCisgICAgIE1lbGR1bmcgZ2VzZXR6dCB3ZXJkZW4sIGRpZSBnZWdlYmVuIHdlcmRlbiBzb2xsLCB3ZW5uIGRlciBTcGllbGVyCisgICAgIGV0d2FzIGZyYWd0LCBhdWYgZGFzIGtlaW5lIEFudHdvcnQgdm9yZ2VnZWJlbiBpc3QgKGRhcyBsb2VzdAorICAgICBTZXRQcm9wKFBfREVGQVVMVF9JTkZPLCA8dGV4dD4pIGFiKS4KKworQkVJU1BJRUxFOgorICAgICAjIyMgZWluZSBTdGFuZGFyZGFudHdvcnQgc2V0emVuICMjIworICAgICBBZGRJbmZvKERFRkFVTFRfSU5GTywgInN0YXJydCBEaXIgYm9lc2UgaW4gZGllIEF1Z2VuLlxuIik7CisgICAgIC8vIGlkZW50aXNjaCB6dQorICAgICBTZXRQcm9wKFBfREVGQVVMVF9JTkZPLCAic3RhcnJ0IERpciBib2VzZSBpbiBkaWUgQXVnZW4uXG4iKTsKKworICAgICAjIyMgZWluZmFjaGUgQmVpc3BpZWxlLCBhdWNoIG1pdCBjYXNlYmFzZWQgIyMjCisgICAgIEFkZEluZm8oKHsia25ldGUiLCJrb2hsZSJ9KSwKKwkgICAgICJzYWd0OiBpY2ggaGFiZSBzbyBldHdhcyBuaWNodC5cbiIpOworICAgICBBZGRJbmZvKCJnZWxkIiwKKwkgICAgICJJY2ggaGFiZSB6d2FyIGtlaW4gR2VsZCwgYWJlciAuLi4gYmxhYmxhYmxhIC4uLiIsCisJICAgICAic2FndDogIiApOworICAgICBBZGRJbmZvKCJtdWVuemVuIiwKKwkgICAgICJmbHVlc3RlcnQ6IER1IHdpbGxzdCBHZWxkP1xuIiwKKwkgICAgIDAsCisJICAgICAiZmx1ZXN0ZXJ0IEBXRU0gZXR3YXMgenUuXG4iKTsKKworICAgICAvLyAiZnJhZ2UgbW9uc3RlciBuYWNoIGdlbGQiOiBhbGxlIGltIFJhdW0gaG9lcmVuCisgICAgIC8vICBEYXMgTW9uc3RlciBzYWd0OiBJY2ggaGFiZSB6d2FyIGtlaW4gR2VsZCwgYWJlciAuLi4KKyAgICAgLy8gIERhcyBNb25zdGVyIHNhZ3Q6IC4uLiBibGFibGFibGEgLi4uCisKKyAgICAgLy8gImZyYWdlIG1vbnN0ZXIgbmFjaCBtdWVuemVuIjoKKyAgICAgLy8gLSBkZXIgRnJhZ2Vuc3RlbGxlciBob2VydDoKKyAgICAgLy8gICAiRGFzIE1vbnN0ZXIgZmx1ZXN0ZXJ0OiBEdSB3aWxsc3QgR2VsZD8iCisgICAgIC8vIC0gYWxsZSBhbmRlcmUgaG9lcmVuOgorICAgICAvLyAgICJEYXMgTW9uc3RlciBmbHVlc3RlcnQgPEZyYWdlbnN0ZWxsZXJuYW1lbj4gZXR3YXMgenUuIgorCisgICAgICMjIyBkeW5hbWlzY2ggIyMjCisgICAgIC8vIGVpbiBQcm90b3R5cCwgZGFtaXQgd2lyIGRpZSBNZXRob2RlIGJla2FubnQgbWFjaGVuCisgICAgIHN0YXRpYyBzdHJpbmcgcXVlcnlfa2Vrc2UoKTsKKyAgICAgLi4uCisgICAgIEFkZEluZm8oKHsia2VrcyIsImtla3NlIn0pLAorCSAgICAgIydxdWVyeV9rZWtzZSwJCS8vIGVpbiBWZXJ3ZWlzIGF1ZiBkaWUgRnVua3Rpb24KKwkgICAgICJzYWd0OiAiKTsKKyAgICAgLi4uCisgICAgIHN0YXRpYyBzdHJpbmcgcXVlcnlfa2Vrc2UoKSB7CisgICAgICBpZihwcmVzZW50KCJrZWtzIikpCisgICAgICAgcmV0dXJuKCJJY2ggaGFiIG5vY2ggd2VsY2hlLiBBZXRzY2ghIik7CisgICAgICByZXR1cm4oIk1lbm5vLiBLZWluZSBtZWhyIGRhISIpOworICAgICB9CisKKyAgICAgLy8gImZyYWdlIG1vbnN0ZXIgbmFjaCBrZWtzIjoKKyAgICAgLy8gLSB3ZW5uIGVzIG5vY2ggS2Vrc2UgaGF0LCBob2VyZW4gYWxsZToKKyAgICAgLy8gICAiRGFzIE1vbnN0ZXIgc2FndDogSWNoIGhhYiBub2NoIHdlbGNoZS4gQWV0c2NoIQorICAgICAvLyAtIHNvbnN0OgorICAgICAvLyAgICJEYXMgTW9uc3RlciBzYWd0OiAiTWVubm8uIEtlaW5lIG1laHIgZGEhCisKKyAgICAgIyMjIGR5bmFtaXNjaGVyICMjIworICAgICAvLyBlaW4gUHJvdG90eXAsIGRhbWl0IHdpciBkaWUgTWV0aG9kZSBiZWthbm50IG1hY2hlbgorICAgICBzdGF0aWMgc3RyaW5nIHF1ZXJ5X2tla3NlKCk7CisgICAgIHN0YXRpYyBtaXhlZCBjYXNlX2ZpZ2h0aW5nKCk7CisgICAgIC4uLgorICAgICBBZGRJbmZvKCh7Imtla3MiLCJrZWtzZSJ9KSwKKwkgICAgICMncXVlcnlfa2Vrc2UsIgkJLy8gZWluIFZlcndlaXMgYXVmIGRpZSBGdW5rdGlvbgorCSAgICAgc2FndDogIiwKKwkgICAgIDAsCQkJCS8vIG5pY2h0IHNpbGVudCA6KQorCSAgICAgIydjYXNlX2ZpZ2h0aW5nKTsJCS8vIG5vY2ggZWluIEZ1bmt0aW9uc3ZlcndlaXMKKyAgICAgLi4uCisgICAgIHN0YXRpYyBzdHJpbmcgcXVlcnlfa2Vrc2UoKSB7CisgICAgICBpZihwcmVzZW50KCJrZWtzIikpCisgICAgICAgcmV0dXJuKCJJY2ggaGFiIG5vY2ggd2VsY2hlLiBBZXRzY2ghIik7CisgICAgICByZXR1cm4oIk1lbm5vLiBLZWluZSBtZWhyIGRhISIpOworICAgICB9CisKKyAgICAgc3RhdGljIG1peGVkIGNhc2VfZmlnaHRpbmcoKSB7CisgICAgICBpZihJbkZpZ2h0KCkpCisgICAgICAgcmV0dXJuKCJLZWluZSBaZWl0IGZ1ZXIgS2Vrc2UuIE11c3Mga2FlbXBmZW4uIik7CisgICAgICByZXR1cm4gMDsKKyAgICAgfQorCisgICAgIC8vICJmcmFnZSBtb25zdGVyIG5hY2gga2VrcyI6CisgICAgIC8vIC0gd2VubiBlcyBrYWVtcGZ0LCBob2VyZW4gYWxsZToKKyAgICAgLy8gICAiRGFzIE1vbnN0ZXIgc2FndDogS2VpbmUgWmVpdCBmdWVyIEtla3NlLiBNdXNzIGthZW1wZmVuLgorICAgICAvLyAtIHNvbnN0LCB3ZW5uIGVzIG5vY2ggS2Vrc2UgaGF0LCBob2VyZW4gYWxsZToKKyAgICAgLy8gICAiRGFzIE1vbnN0ZXIgc2FndDogSWNoIGhhYiBub2NoIHdlbGNoZS4gQWV0c2NoIQorICAgICAvLyAtIHNvbnN0OgorICAgICAvLyAgICJEYXMgTW9uc3RlciBzYWd0OiAiTWVubm8uIEtlaW5lIG1laHIgZGEhCisKKworICAgICAjIyMgZHluYW1pc2NoIHVuZCBrb21wbGV4ICMjIworICAgICAvLyBlaW4gUHJvdG90eXAsIGRhbWl0IHdpciBkaWUgTWV0aG9kZSBiZWthbm50IG1hY2hlbgorICAgICBzdGF0aWMgc3RyaW5nIHF1ZXN0aW9uX2dvbGQoKTsKKyAgICAgLi4uCisKKyAgICAgLy8gImdvbGQiIHdpcmQgZWluZSBDbG9zdXJlIGF1ZiBkaWUgTWV0aG9kZSBxdWVzdGlvbl9nb2xkKCkKKyAgICAgLy8genVnZXdpZXNlbiwgYXVzc2VyZGVtIHNvbGwgZXMgc3RpbGwgYmxlaWJlbiAod2lyIGluZm9ybWllcmVuCisgICAgIC8vIGRlbiBSZXN0cmF1bSBzZWxic3QpCisgICAgIEFkZEluZm8oImdvbGQiLCMncXVlc3Rpb25fZ29sZCwibXVybWVsdDogIiwxKTsKKyAgICAgLi4uCisKKyAgICAgLy8gbG9zIGdlaHRzLCB3aXIgZ2VuZXJpZXJlbiB1bnNlcmUgQW50d29ydCBzZWxic3QKKyAgICAgc3RhdGljIHN0cmluZyBxdWVzdGlvbl9nb2xkKCkgeworICAgICAgaW50IG1vbmV5OworICAgICAgc3RyaW5nICp5LCBvYmpzdHI7CisgICAgICBvYmplY3QgbzsKKyAgICAgIC8vIHdpZXZpZWwgS29obGUgaGF0IGRlciBTcGllbGVyCisgICAgICBtb25leT10aGlzX3BsYXllcigpLT5RdWVyeU1vbmV5KCk7CisgICAgICB5PWFsbG9jYXRlKDApOworICAgICAgLy8gdW5kIGpldHp0IHN1Y2hlbiB3aXIgZGllIERpbmdlIGF1cyBHb2xkCisgICAgICBvPWZpcnN0X2ludmVudG9yeSh0aGlzX3BsYXllcigpKTsKKyAgICAgIHdoaWxlKG8pIHsKKyAgICAgICBpZihvLT5RdWVyeU1hdGVyaWFsKE1BVF9HT0xEKT4wICYmCisgICAgICAgICAgc3Ryc3RyKG9iamVjdF9uYW1lKG8pLCIvb2JqL21vbmV5IikpCisgICAgICAgIHkrPSh7by0+bmFtZShXRVIsMSl9KTsKKyAgICAgICBvPW5leHRfaW52ZW50b3J5KG8pOworICAgICAgfQorCisgICAgICAvLyBkYXMgZ2VodCBhbiBhbGxlIGFuZGVyZW4gaW0gUmF1bSwgc2lsZW50IGJpZXRldCBzaWNoIGhpZXIKKyAgICAgIC8vIG5pY2h0IGFuLCB3ZWlsIGVzIG1laHJlcmUgTW9lZ2xpY2hrZWl0ZW4gZ2lidAorICAgICAgc2F5KGJyZWFrX3N0cmluZygKKyAgICAgICBOYW1lKFdFUiwxKSsiIG11cm1lbHQgIisKKyAgICAgICB0aGlzX3BsYXllcigpLT5uYW1lKFdFTSwxKSsKKyAgICAgICAiIGV0d2FzIHp1IisKKyAgICAgICAoKG1vbmV5IHx8IHNpemVvZih5KSk/CisgICAgICAgICIgdW5kIGdsb3R6dCAiKworICAgICAgICB0aGlzX3BsYXllcigpLT5RdWVyeVByb25vdW4oV0VOKSsiIGdpZXJpZyBhbi4iOgorICAgICAgICAiLiIpLDc4KSwoe3RoaXNfcGxheWVyKCl9KSk7CisKKyAgICAgIC8vIHVuZCBoaWVyIGRpZSBBbnR3b3J0IGFuIGRlbiBTcGllbGVyIHNlbGJzdCwgbWl0IHZpZWxlbgorICAgICAgLy8gVmVyendlaWd1bmdlbiBmdWVyIGRlc3NlbiBCZXNpdHp0dW0KKyAgICAgIHJldHVybigiSWNoIGhhYiBrZWluIEdvbGQgYmVpIG1pci4iKworICAgICAgICAgICgobW9uZXkgfHwgc2l6ZW9mKHkpKT8KKyAgICAgICAgICAgIiBBYmVyIGR1ICIrCisgICAgICAgICAgIChtb25leT8iaGFzdCBqYSBqZWRlIE1lbmdlIEtvaGxlIGJlaSBkaXIsIHNvIGV0d2EgIittb25leSsKKyAgICAgICAgICAgICIgTXVlbnplbi4iKworICAgICAgICAgICAgKHNpemVvZih5KT8KKyAgICAgICAgICAgICAiIEF1c3NlcmRlbSAiKworICAgICAgICAgICAgICgoc2l6ZW9mKHkpPT0xKT8iaXN0Ijoic2luZCIpKworICAgICAgICAgICAgICIgYXVjaCBub2NoICIrQ291bnRVcCh5KSsiIGF1cyBHb2xkLiI6CisgICAgICAgICAgICAgIiIpOgorICAgICAgICAgICAgKHNpemVvZih5KT8iIEFiZXIgd2FzIGR1IHNvIGJlaSBkaXIgaGFzdDogIisKKyAgICAgICAgICAgICBDb3VudFVwKHkpKworICAgICAgICAgICAgIChzaXplb2YoeSk9PTE/IiBpc3QiOiIgc2luZCIpKworICAgICAgICAgICAgICIgYXVzIEdvbGQuIjoiIikpOgorICAgICAgICAgICAiIikpOworICAgICB9CisKKyAgICAgLy8gImZyYWdlIG1vbnN0ZXIgbmFjaCBnb2xkIgorICAgICAvLyAtIGRlciBGcmFnZXN0ZWxsZXIgaG9lcnQgekI6CisgICAgIC8vICAgRGFzIE1vbnN0ZXIgbXVybWVsdDogSWNoIGhhYiBrZWluIEdvbGQgYmVpIG1pci4gQWJlciBkdSBoYXN0IGphCisgICAgIC8vICAgRGFzIE1vbnN0ZXIgbXVybWVsdDogamVkZSBNZW5nZSBLb2hsZSBiZWkgZGlyLCBzbyBldHdhcyA8bnVtYmVyPgorICAgICAvLyAgIERhcyBNb25zdGVyIG11cm1lbHQ6IE11ZW56ZW4uIEF1c3NlcmRlbSBpc3Qvc2luZCBub2NoIDxvYmplY3QxPgorICAgICAvLyAgIERhcyBNb25zdGVyIG11cm1lbHQ6IHVuZCA8b2JqZWN0Mj4gYXVzIEdvbGQuIgorICAgICAvLyAtIGRpZSBVbXN0ZWhlbmRlbiBob2VyZW46CisgICAgIC8vICAgIkRhcyBNb25zdGVyIG11cm1lbHQgQFdFTSBldHdhcyB6dS4iCisgICAgIC8vICAgb2RlcgorICAgICAvLyAgICJEYXMgTW9uc3RlciBtdXJtZWx0IEBXRU0gZXR3YXMgenUgdW5kIGdsb3R6dCBpaG4vc2llIGdpZXJpZyBhbi4iCisKK1NJRUhFIEFVQ0g6CisgICAgIFZlcndhbmR0OiAgQWRkU3BlY2lhbEluZm8oTCksIFJlbW92ZUluZm8oTCkKKyAgICAgUHJvcHM6ICAgICBQX1BSRV9JTkZPLCBQX0RFRkFVTFRfSU5GTworICAgICBGaWxlczogICAgIC9zdGQvbnBjL2luZm8uYworICAgICBMb2dnZW46ICAgIFBfTE9HX0lORk8KKyAgICAgSW50ZXJuYTogICBHZXRJbmZvQXJyLCBkb19mcmFnZQorCis3LkFwciAyMDA0IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9BZGRJdGVtIGIvZG9jL2xmdW4vQWRkSXRlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTgxMmVhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vQWRkSXRlbQpAQCAtMCwwICsxLDE1OSBAQAorQWRkSXRlbSgpCisKK0ZVTktUSU9OOgorCXZhcmFyZ3Mgb2JqZWN0IEFkZEl0ZW0obWl4ZWQgZmlsZW5hbWUsaW50IHJlZnJlc2gsbWl4ZWQgcHJvcHMpOworCitERUZJTklFUlQgSU46CisJL3N0ZC9yb29tL2l0ZW1zLmMKKwkvc3RkL25wYy9pdGVtcy5jCisKK0FSR1VNRU5URToKKwlmaWxlbmFtZQorCSAgU3RyaW5nIG1pdCBkZW0gTmFtZW4gZGVzIHp1IGVyemV1Z2VuZGVuIE9iamVrdGVzIG9kZXIgQXJyYXkgdm9uCisJICBTdHJpbmdzIG1pdCBkZW4gTmFtZW4gZGVyIHp1IGVyemV1Z2VuZGVuIE9iamVrdGUuIEJlaSBlaW5lbSBBcnJheQorCSAgd2lyZCBlaW4gTmFtZSB6dWZhZWxsaWcgYXVzZ2V3YWVobHQuCisJcmVmcmVzaAorCSAgV2FubiB1bmQgd2llIHNvbGwgZGFzIE9iamVrdCBlcm5ldWVydCB3ZXJkZW46CisJICAtIFJFRlJFU0hfTk9ORSAgICAgIC0gS2VpbiBSZWZyZXNoIGJpcyB6dW0gTmV1bGFkZW4gZGVzIFJhdW1zCisgICAgICAgICAgICAgICAgICAgICAgICAtIG9kZXIgTlBDcy4KKwkgIC0gUkVGUkVTSF9ERVNUUlVDVCAgLSBSZWZyZXNoIGJlaSBSZXNldCwgd2VubiBJdGVtIHplcnN0b2VydAorCSAgICAgICAgICAgICAgICAgICAgICAgIHd1cmRlLgorCSAgLSBSRUZSRVNIX1JFTU9WRSAgICAtIFJlZnJlc2ggYmVpIFJlc2V0LCB3ZW5uIEl0ZW0gZW50ZmVybnQgd3VyZGUuCisJICAtIFJFRlJFU0hfQUxXQVlTICAgIC0gTmV1ZXIgQ2xvbmUgYmVpIGplZGVtIFJlc2V0LgorCSAgLSBSRUZSRVNIX01PVkVfSE9NRSAtIE9iamVrdCB3aXJkIGJlaSBSZXNldCBhdXRvbWF0aXNjaAorCSAgICAgICAgICAgICAgICAgICAgICAgIHp1cnVlY2tnZWhvbHQsIHdlbm4gZXMgd2VnYmV3ZWd0IHd1cmRlLgorCSAgICAgICAgICAgICAgICAgICAgICAgIChudXIgaW4gUmFldW1lbiEpCisJICBCZWkgTlBDJ3MgZ2lsdCB6dXNhZXR6bGljaDoKKwkgIC0gQ0xPTkVfV0VBUiAgICAgICAtIEl0ZW0gQW56aWVoZW4sIHdlbm4gZXMgZWluZSBSdWVzdHVuZyBpc3QuCisJICAtIENMT05FX1dJRUxEICAgICAgLSBJdGVtIHp1ZWNrZW4sIHdlbm4gZXMgZWluZSBXYWZmZSBpc3QuCisJICAtIENMT05FX05PX0NIRUNLICAgLSBadWVja2VuIG9kZXIgQW56aWVoZW4gb2huZSBVZWJlcnBydWVmdW5nZW4uCisJcHJvcHMgKG9wdGlvbmFsKQorCSAgTWFwcGluZyBtaXQgZGVuZW4gaW4gZWluZW0gZ2VjbG9udGVuIE9iamVrdCB6dSBzZXR6ZW5kZW4KKwkgIFByb3BlcnRpZXMgb2RlciAxIGZ1ZXIgZGllIEVyemV1Z3VuZyBlaW5lciBCbHVlcHJpbnQuCisKK1JVZUNLR0FCRVdFUlQ6CisJSW5uZXJoYWxiIHZvbiBSYWV1bWVuIHdpcmQgZGFzIGVyemV1Z3RlIE9iamVrdCB6dXJ1ZWNrZ2VsaWVmZXJ0LiBCZWkKKwlOUEMncyBrbGFwcHQgZGllcyBsZWlkZXIgbmljaHQsIGRhIGRvcnQgZGllIE9iamVrdGUgbmljaHQgc29mb3J0CisJZXJ6ZXVndCB3ZXJkZW4sIHNvbmRlcm4gZXJzdCwgbmFjaGRlbSBkZXIgTlBDIGFuIHNlaW5lbgorCUJlc3RpbW11bmdzb3J0IHRyYW5zZmVyaWVydCB3dXJkZS4gRGFoZXIgd2lyZCBiZWkgTlBDIGltbWVyIDAgCisJenVydWVja2dlZ2ViZW4uCisKK0JFU0NIUkVJQlVORzoKKwlBYmhhZW5naWcgdm9uIDxmaWxlbmFtZT4gdW5kIDxwcm9wcz4gd2lyZCBlaW4gT2JqZWt0IGVyemV1Z3QgdW5kIGluCisJZGVuIFJhdW0gYnp3LiBOUEMgYmV3ZWd0LiBEYWJlaSBnaWJ0IGVzIGZvbGdlbmRlIE1vZWdsaWNoa2VpdGVuOgorCS0gPGZpbGVuYW1lPiBpc3QgZWluIERhdGVpbmFtZS4KKwkgIEVzIHdpcmQgZWluIENsb25lIGRpZXNlciBEYXRlaSBlcnN0ZWxsdCBvZGVyICh3ZW5uIDxwcm9wcz49MSBpc3QpCisJICBkZXJlbiBCbHVlcHJpbnQgdmVyd2VuZGV0LgorCS0gPGZpbGVuYW1lPiBpc3QgZWluIEFycmF5IHZvbiBEYXRlaW5hbWVuLgorCSAgRXMgd2lyZCBlaW5lIERhdGVpIHp1ZmFlbGxpZyBhdXMgZGVtIEFycmF5IGF1c2dld2FlaGx0IHVuZCB2b24KKwkgIGRpZXNlciBEYXRlaSBlaW4gQ2xvbmUgZXJzdGVsbHQgb2RlciAod2VubiA8cHJvcHM+PTEgaXN0KSBkZXJlbgorCSAgQmx1ZXByaW50IHZlcndlbmRldC4KKwlVZWJlcmdpYnQgbWFuIGZ1ZXIgPHByb3BzPiBlaW4gTWFwcGluZyBtaXQgZGVtIEF1ZmJhdQorCSAgKFtwcm9wX25hbWU6cHJvcF93ZXJ0LC4uLl0pLAorCXNvIHdlcmRlbiBkaWVzZSBQcm9wZXJ0aWVzIGltIGVyemV1Z3RlbiBPYmpla3QgZ2VzZXR6dC4KKwlEZXIgUGFyYW1ldGVyIDxyZWZyZXNoPiBnaWJ0IGFuLCB3YXMgd2FlaHJlbmQgZWluZXMgUmVzZXRzIGltIFJhdW0KKwliencuIGluIE5QQydzIG9kZXIgd2FzIGJlaW0gRXJ6ZXVnZW4gdm9uIE5QQydzIGdlc2NoZWhlbiBzb2xsOgorCUluIDxyb29tcy5oPiBzaW5kIGRhenUgZm9sZ2VuZGUgTW9lZ2xpY2hrZWl0ZW4gZGVmaW5pZXJ0OgorCS0gUkVGUkVTSF9OT05FCisgICAgICAgICAgICBEYXMgT2JqZWt0IHdpcmQgbmllbWFscyBlcm5ldWVydDsgZmFsbHMgZXMgemVyc3RvZXJ0IHd1cmRlLCB3aXJkCisJICAgIGVzIGVyc3QgZGFubiB3aWVkZXIgZXJ6ZXVndCwgd2VubiBkZXIgUmF1bSBlcm5ldXQgZ2VsYWRlbiBiencuCisJICAgIGRlciBOUEMgbmV1IGVyemV1Z3Qgd2lyZC4gTWFuIGJlYWNodGUsIGRhc3MgbmljaHQgamVkZXIgTlBDCisJICAgIHdpcmtsaWNoIHJlZnJlc2hlbmRlIE9iamVrdGUgYmVub2V0aWd0LCBSRUZSRVNIX05PTkUgc3BhcnQKKwkgICAgaGllcmJlaSBzb3dvaGwgUmVjaGVuemVpdCBhbHMgYXVjaCBTcGVpY2hlciEKKwktIFJFRlJFU0hfREVTVFJVQ1QKKwkgICAgRGFzIE9iamVrdCB3aXJkIG51ciBkYW5uIGVybmV1ZXJ0LCB3ZW5uIGVzIGluIGRlciBad2lzY2hlbnplaXQKKwkgICAgemVyc3RvZXJ0IHd1cmRlIChiZWkgTlBDJ3MgaXN0IGRhcyB6dW0gQmVpc3BpZWwgZGVyIEZhbGwsIHdlbm4KKwkgICAgc2llIGdldG9ldGV0IHd1cmRlbikuCisJICAgIFJFRlJFU0hfTk9ORSAmIFJFRlJFU0hfREVTVFJVQ1QgKyBCbHVlcHJpbnQtT2JqZWt0IGJlZGV1dGV0IGJlaQorCSAgICBOUEMncyBlaW4gVW5pcXVlLU9iamVrdCwgZXMgd2lyZCBhbHNvIG5pY2h0IGJlaW0gTmV1ZXJ6ZXVnZW4gZGVzCisJICAgIE5QQydzIHp1cnVlY2tnZXNldHp0LgorCS0gUkVGUkVTSF9SRU1PVkUKKwkgICAgRGFzIE9iamVrdCB3aXJkIGVybmV1ZXJ0LCB3ZW5uIGVzIHNpY2ggbmljaHQgbWVociBpbSBSYXVtIGJ6dy4KKwkgICAgaW0gTlBDIGJlZmluZGV0LiBEYXMga2VpbiBzZWluLCB3ZWlsIGVzIHplcnN0b2VydCB3dXJkZSwgYWJlcgorCSAgICBhdWNoIHp1bSBCZWlzcGllbCBpbiBmb2xnZW5kZW4gRmFlbGxlbjoKKwkgICAgKiB3ZWlsIGVzIGplbWFuZCBtaXRnZW5vbW1lbiBoYXQKKwkgICAgICAgKGluIFJhZXVtZW4gYmVpIEdlZ2Vuc3RhZW5kZW4pCisJICAgICogd2VpbCBlcyBmb3J0Z2VnYW5nZW4gaXN0CisJICAgICAgIChpbiBSYWV1bWVuIGJlaSBOUEMncywgZGllIGhlcnVtbGF1ZmVuKQorCSAgICAqIHdlaWwgZXMgd2VnZ2V3b3JmZW4gd3VyZGUKKwkgICAgICAgKGluIE5QQydzIGJlaSBHZWdlbnN0YWVuZGVuKQorCS0gUkVGUkVTSF9BTFdBWVMKKwkgICAgRGFzIE9iamVrdCB3aXJkIGltbWVyIGVybmV1ZXJ0LiBWb24gZGllc2VyIFJlZnJlc2htZXRob2RlIHNvbGx0ZQorCSAgICBtYW4gYWxsZXJkaW5ncyBBYnN0YW5kIG5laG1lbiwgZGEgc2ljaCBzb25zdCBtaXQgZGVyIFplaXQKKwkgICAgZ2V3YWx0aWdlIE1lbmdlbiB2b24gT2JqZWt0ZW4gYW5zYW1tZWxuIGtvZW5uZW4hCisJLSBSRUZSRVNIX01PVkVfSE9NRQorCSAgICBEYXMgT2JqZWt0IHdpcmQgaW4gZWluZW4gUmF1bSB6dXJ1ZWNrYmV3ZWd0LCBzb2Zlcm4gZXMgbm9jaAorCSAgICBleGlzdGllcnQsIGplZG9jaCBuaWNodCBtZWhyIGluIGRlbSBSYXVtIGlzdC4gU2lubnZvbGwgaXN0IGRpZXMKKwkgICAgZWlnZW50bGljaCBudXIgZnVlciBMZWJld2VzZW4sIGZ1bmt0aW9uaWVydCBhYmVyIGF1Y2ggYmVpCisJICAgIGJlbGllYmlnZW4gT2JqZWt0ZW4uIEhhdXB0c2FlY2hsaWNoIGdlaHQgZXMgaGllcmJlaSBkYXJ1bSwKKwkgICAgaGVydW1sYXVmZW5kZSBOUENzIG9kZXIgYmVpIGVyend1bmdlbmVuIEJld2VndW5nZW4gbmljaHQgdm9uCisJICAgIFBfR1VBUkQgenVydWVja2dlaGFsdGVuZSBOUENzIHdpZWRlciBhbiBlaW5lbiBkZWZpbmllcnRlbgorCSAgICBBdXNnYW5nc29ydCB6dXJ1ZWNrenVicmluZ2VuLgorCUhhdCBtYW4gaW4gUmFldW1lbiBhbHMgPGZpbGVuYW1lPiBlaW4gQXJyYXkgdm9uIERhdGVpbmFtZW4KKwl1ZWJlcmdlYmVuLCBzbyB3aXJkIGJlaW0gUmVzZXQgamVkZXNtYWwgYXVmcyBOZXVlIGVpbiB6dWZhZWxsaWdlcworCU9iamVrdCBhdXMgZGVyIExpc3RlIGF1c2dld2FlaGx0IChuaWNodCBpbiBOUEMncykuCisJSW4gTlBDJ3MgZ2lsdCBkZXIgR3J1bmRzYXR6IGRlciBWZXJtZWlkdW5nIHZvbiB1ZWJlcmZsdWVzc2lnZW4KKwlPYmpla3RlbiBpbSBNVUQuIE5ldSBlcnpldWd0IHdlcmRlbiBPYmpla3RlIGJlaW0gRXJ6ZXVnZW4gZWluZXMKKwlOUEMncyBvZGVyIGJlaSBlaW5lbSBSZXNldCBpbSBzZWxiaWdlbi4gQW5zdGF0dCBkaWUgT2JqZWt0ZSBnbGVpY2gKKwluZXUgenUgZXJzY2hhZmZlbiwgd2lyZCBlcnN0IGdlc2NoYXV0LCBvYiBzaWNoIGlkZW50aXNjaGUgT2JqZWt0ZQorCXNjaG9uIGltIFJhdW0gYmVmaW5kZW4uIElzdCBkaWVzIGRlciBGYWxsLCBzbyBuaW1tdCBkZXIgTlBDIHNpZSBhdWYsCisJcnVmdCBqZWRvY2ggdm9yaGVyIG5vY2htYWxzIGNyZWF0ZSgpIGluIGlobmVuIGF1ZiEKKwkgIChub2V0aWcgd2VnZW4gbW9lZ2xpY2hlciBWZXJhZW5kZXJ1bmdlbiBhbiBkZW4gT2JqZWt0ZW4pCisJV2FzIGRhbm4gcGFzc2llcnQsIGhhZW5ndCB2b24gd2VpdGVyZW4gQW5nYWJlbiBpbiA8cmVmcmVzaD4gYWIuCisJRm9sZ2VuZGUgd2VpdGVyZSBNb2VnbGljaGtlaXRlbiBzaW5kIGluIDxucGMuaD4gZGVmaW5pZXJ0OgorICAgICAgICAtIENMT05FX1dFQVIKKwkgIElzdCBkYXMgaGluenVnZWZ1ZWd0ZSBJdGVtIGVpbmUgUnVlc3R1bmcsIHNvIHdpcmQgc2llIG5hY2gKKwkgIEF1Zm5haG1lIG9kZXIgTmV1ZXJ6ZXVndW5nIGFuZ2V6b2dlbi4KKyAgICAgICAgLSBDTE9ORV9XSUVMRAorCSAgSXN0IGRhcyBoaW56dWdlZnVlZ3RlIEl0ZW0gZWluZSBXYWZmZSwgc28gd2lyZCBzaWUgbmFjaCBBdWZuYWhtZQorCSAgb2RlciBOZXVlcnpldWd1bmcgZ2V6dWVja3QuCisgICAgICAgIC0gQ0xPTkVfTk9fQ0hFQ0sKKwkgIEhpZXJtaXQgdmVyaGluZGVydCBtYW4gZWluZSBVZWJlcnBydWVmdW5nLCBvYiBlaW5lIFJ1ZXN0dW5nCisJICBhbmdlem9nZW4gb2RlciBlaW5lIFdhZmZlIGdlenVlY2t0IHdlcmRlbiBrYW5uLiBFcyBpc3QgamVkb2NoCisJICBWb3JzaWNodCBnZWJvdGVuOiBTbyBrYW5uIGVzIG9obmUgd2VpdGVyZXMgcGFzc2llcmVuLCBkYXNzIGVpbiBOUEMKKwkgIG1laHJlcmUgUnVlc3R1bmdlbiBnbGVpY2hlbiBUeXBzIGFuZ2V6b2dlbiBvZGVyIG1laHJlcmUgV2FmZmVuCisJICBnZXp1ZWNrdCBoYXQuCisJQmVudXR6dCBtYW4gQmx1ZXByaW50cyAoPHByb3BzPj0xKSBtaXQgUkVGUkVTSF9SRU1PVkUgb2RlcgorCVJFRlJFU0hfQUxXQVlTLCBzbyBrYW5uIGVzIHp1IHVuZ2V3b2xsdGVuIFVlYmVycmFzY2h1bmdlbiBrb21tZW4sIGRhCisJZGllIEJsdWVwcmludCBkYW5uIHVuYWJoYWVuZ2lnIHZvbiBpaHJlbSBtb21lbnRhbmVuIEF1ZmVudGhhbHRzb3J0CisJd2llZGVyIGluIGRlbiBSYXVtIGJ6dy4gTlBDIGJld2VndCB3aXJkLCB2b24gZGVtIHNpZSBlcnpldWd0IHd1cmRlIQorCitCRU1FUktVTkdFTjoKKwlXZW5uIG1hbiBCbHVlcHJpbnRzIGJlbnV0enQsIHNvbGx0ZSBtYW4gZGFyYW4gZGVua2VuLCBkYXNzIHNpY2ggdm9uCisJZGllc2VyIGRhbm4ga2VpbmUgQ2xvbmVzIG1laHIgZXJzdGVsbGVuIGxhc3NlbiEKKwlSZW1vdmVJdGVtKCkgenVtIEVudGZlcm5lbiB2b24gSXRlbXMgaXN0IG51ciBmdWVyIFJhZXVtZSBkZWZpbmllcnQhCisKKwlEaWUgT3B0aW9uIENMT05FX05FVyBpc3QgdmVyYWx0ZXQuIERpZSBPYmpla3RlIHdlcmRlbiBudW4gaW1tZXIKKwluZXUgZXJ6ZXVndC4gRGllIE9wdGlvbiBkYXJmIG5vY2ggYW5nZWdlYmVuIHdlcmRlbiwgaGF0IGFiZXIga2VpbmUKKwlCZWRldXR1bmcgbWVoci4KKworQkVJU1BJRUxFOgorCS8vIEVpbiBXdWVyZmVsLCBkZXIgc2ljaCBuYWNoIEVudGZlcm5lbiBlcm5ldWVydDoKKwkgIEFkZEl0ZW0oIi9vYmovbWlzYy93dWVyZmVsIixSRUZSRVNIX1JFTU9WRSk7CisJLy8gRWluIGV0d2FzIHZlcmFlbmRlcnRlciBXdWVyZmVsOgorCSAgQWRkSXRlbSgiL29iai9taXNjL3d1ZXJmZWwiLAorCSAgICAgICAgICBSRUZSRVNIX1JFTU9WRSwKKwkgICAgICAgICAgKFtQX1NIT1JUIDoiRWluIHNjaHdlcmVyIFd1ZXJmZWwiLAorCSAgICAgICAgICAgIFBfV0VJR0hUOjEwMF0pKTsKKwkvLyBFaW5lIEJsdWVwcmludCwgZGllIG51ciBlaW5tYWwgaW0gTVVEIGV4aXN0aWVydC4gV2VubiBzaWUKKwkvLyB6ZXJzdG9lcnQgd3VyZGUsIHdpcmQgc2llIGJlaSBSZXNldCBuZXUgZXJ6ZXVndDoKKwkgIEFkZEl0ZW0oIi9tb24vYW5nc3RoYXNlIixSRUZSRVNIX0RFU1RSVUNULDEpOworCS8vIEVpbmUgQmx1ZXByaW50LCBkaWUgbnVyIGVpbm1hbCBpbSBNVUQgZXhpc3RpZXJ0LiBXZW5uIHNpZSBhdXMgZGVtCisJLy8gUmF1bSBlbnRmZXJudCB3dXJkZSwgd2lyZCBzaWUgYmVpIFJlc2V0IHp1cnVlY2tnZWhvbHQ6CisJICBBZGRJdGVtKCIvbW9uL2FuZ3N0aGFzZSIsUkVGUkVTSF9NT1ZFX0hPTUUsMSk7CisJLy8gRWluIHp1ZmFlbGxpZ2VzIE9iamVrdDoKKwkgIEFkZEl0ZW0oKHsiL29iai9taXNjL2xvbGxpIiwKKwkgICAgICAgICAgICAiL29iai9taXNjL2JvbmJvbiIsCisJICAgICAgICAgICAgIi9vYmovbWlzYy9iaWVyIn0pLFJFRlJFU0hfUkVNT1ZFKTsKKwkvLyBFaW5lIFJ1ZXN0dW5nLCBkaWUgYXVjaCBhbmdlem9nZW4gd2lyZCAobnVyIGluIE5QQydzKToKKwkgIEFkZEl0ZW0oIi9ydWVzdHVuZy9zb21tZXJrbGVpZCIsUkVGUkVTSF9SRU1PVkV8Q0xPTkVfV0VBUik7CisJLy8gRWluZSBVbmlxdWUtV2FmZmUsIGRpZSBhdWNoIGdlenVlY2t0IHdpcmQgKG51ciBpbiBOUEMncyk6CisJICBBZGRJdGVtKCIvd2FmZmUvemFwcGVyIixSRUZSRVNIX0RFU1RSVUNUfENMT05FX1dJRUxELDEpOworCitTSUVIRSBBVUNIOgorCVJlbW92ZUl0ZW0oKSwgcmVwbGFjZV9wcm9ncmFtKCksIGNyZWF0ZSgpLCBQX0dVQVJELAorCS9zdGQvcm9vbS9pdGVtcy5jLCAvc3RkL25wYy9pdGVtcy5jLAorCS9zeXMvcm9vbXMuaCwgL3N5cy9ucGMuaAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBUaHUgTm92IDIzIDEzOjQzOjMwIENFVCAyMDA2IGJ5IFJ1bWF0YQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vQWRkS25vd25Qb3Rpb24gYi9kb2MvbGZ1bi9BZGRLbm93blBvdGlvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDRkMjk2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vQWRkS25vd25Qb3Rpb24KQEAgLTAsMCArMSwyNSBAQAorQWRkS25vd25Qb3Rpb24oKQorCitGVU5LVElPTjoKKyAgICAgaW50IEFkZEtub3duUG90aW9uKGludCBucikKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL3BsYXllci9wb3Rpb24uYworCitBUkdVTUVOVEU6CisgICAgIGludCBuciAgICAgICBOdW1tZXIgZWluZXMgWlRzCisKK0JFU0NIUkVJQlVORzoKKyAgICAgQWRkaWVydCBlaW5lbiBaVCBhbHMgYmVrYW5udCBpbiBlaW5lbSBTcGllbGVyLiBOdXIgdm9tIE9yYWtlbCBydWZiYXIuCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIDEgIEVyZm9sZworICAgICAtMSBmZWhsZW5kZSBCZXJlY2h0aWd1bmcKKyAgICAgLTIgTnVtbWVyIGJlcmVpdHMgZWluZ2V0cmFnZW4KKworU0lFSEUgQVVDSDoKKyAgICAgU29uc3RpZ2VzOiB6YXViZXJ0cmFlbmtlLCAvc2VjdXJlL3BvdGlvbm1hc3Rlci5jLCAvcm9vbS9vcmFrZWwuYworICAgICBWZXJ3YW5kdDogIEZpbmRQb3Rpb24oKSwgUmVtb3ZlS25vd25Qb3Rpb24oKSwgSW5MaXN0KCkKKyAgICAgUHJvcHM6ICAgICBQX1BPVElPTlJPT01TLCBQX0tOT1dOX1BPVElPTlJPT01TCisKKzYuRmViIDIwMTYgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0FkZE1hdGVyaWFsIGIvZG9jL2xmdW4vQWRkTWF0ZXJpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRmNTBiNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0FkZE1hdGVyaWFsCkBAIC0wLDAgKzEsNzYgQEAKK0FkZE1hdGVyaWFsKCkKK0ZVTktUSU9OOgorICAgICBwcml2YXRlIHN0YXRpYyB2YXJhcmdzIHZvaWQgQWRkTWF0ZXJpYWwoc3RyaW5nIG1hdCwgaW50IGdlbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peGVkIG5hbWVzLCBtaXhlZCBncm91cHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXhlZCBkaWYpIHsKKworREVGSU5JRVJUIElOOgorICAgICAvcC9kYWVtb24vbWF0ZXJpYWxkYi5jIChNQVRFUklBTERCKQorCitBUkdVTUVOVEU6CisgICAgIHN0cmluZyBtYXQKKyAgICAgICBNYXRlcmlhbHN0cmluZywgZGVmaW5pZXJ0IGluIDx0aGluZy9tYXRlcmlhbC5oPgorCisgICAgIGludCBnZW5kZXIKKyAgICAgICBHZXNjaGxlY2h0IGRlcyBlaW56dXRyYWdlbmRlbiBNYXRlcmlhbHMKKworICAgICBtaXhlZCBuYW1lcworICAgICAgIE5hbWUgZGVzIE1hdGVyaWFsczoKKyAgICAgICAtICI8Tm9taW5hdGl2PiIgb2RlciAobWVpc3QgbnVyIE5vbS4gdW5kIEdlbi4gbm9ldGlnKQorICAgICAgIC0gKHsiPE5vbWluYXRpdj4iLCI8R2VuaXRpdj4iLCI8RGF0aXY+IiwiPEFra3VzYXRpdj4ifSkKKworICAgICBtaXhlZCBncm91cHMKKyAgICAgICBFaW5ncnVwcGllcnVuZyBkZXMgTWF0ZXJpYWxzOgorICAgICAgIC0gTUFUR1JPVVBfWFhYIG9kZXIgKHtNQVRHUk9VUF9YWFgsLi4ufSkKKyAgICAgICAtIChbTUFUX0dST1VQX1hYWDp4eCxNQVRHUk9VUF9ZWVk6eXksLi4uXSkKKworICAgICBtaXhlZCBkaWYKKyAgICAgICBTY2h3aWVyaWdrZWl0ZW4gYmVpIGRlciBFcmtlbm5iYXJrZWl0OgorICAgICAgIC0gaW50IHggb2RlciAoe01JTk1BVCx4MSxNQVRQT1MxLHgyLE1BVFBPUzIgLi4ufSkKKyAgICAgICAtIHhuOiBFcmtlbm5iYXJrZWl0c3NjaHdpZXJpZ2tlaXQgKDEwMD0xMDAlKSAtMTAwLi4xMDAKKyAgICAgICAtIE1JTk1BVDogRXJrZW5udW5nIHp1bWluZGVzdCBhbHMgX2RpZXNlc18gTWF0ZXJpYWwKKyAgICAgICAgICAgICAgICAgbW9lZ2xpY2gKKyAgICAgICAtIE1BVFBPU246IG1vZWdsaWNoZXMgTWF0ZXJpYWwsIGVya2VubmJhciwgd2VubgorICAgICAgICAgICAgICAgICAgRXJrZW5uYmFya2VpdGZhZWhpZ2tlaXQ+PXhuCisgICAgICAgICAgICAgICAgICAtPiBkYXMgbGV0enRlIE1BVFBPUyBtdXNzIG5hdHVlcmxpY2gKKyAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtYXQgZW50c3ByZWNoZW4KKworQkVTQ0hSRUlCVU5HOgorICAgICBFcyB3aXJkIGluIGRpZSBNYXRlcmlhbGllbmRhdGVuYmFuayBlaW5lIG5ldWVzIE1hdGVyaWFsIGF1Zmdlbm9tbWVuLAorICAgICBkaWUgU3RyaW5na29uc3RhbnRlIGRhZnVlciB3aXJkIHZvcmhlciBpbiA8dGhpbmcvbWF0ZXJpYWwuaD4gZmVzdC0KKyAgICAgZ2VsZWd0LiBGYWxscyBkZXIgR2VuaXRpdiBuaWNodCBOb21pbmF0aXYrInMiIGVudHNwcmljaHQgKHouQi4gIlNlaWRlIiksCisgICAgIHNvbGx0ZSBkaWVzZXIgZXhwbGl6aXQgYW5nZWdlYmVuIHdlcmRlbi4KKyAgICAgTmFjaCBOZXVsYWRlbiBkZXIgRGF0ZW5iYW5rIGlzdCBkaWVzZXMgTWF0ZXJpYWwgYXVjaCBwZXIgTWF0ZXJpYWxOYW1lKCksCisgICAgICdlcmtlbm5iYXInIChzaWVoZSBtaXhlZCBkaWYsIHNpZWhlIEJlaXNwaWVsKSBiencuIHNlaW5lbiBlaW56ZWxuZW4KKyAgICAgR3J1cHBlbiB6dW9yZG5iYXIuCisKK0JFSVNQSUVMRToKKyAgICAgQWRkTWF0ZXJpYWwoTUFUX05JVFJPR0xZQ0VSSU5FLE5FVVRFUiwiTml0cm9nbHljZXJpbiIsCisgICAgICAgICAgICAgICAgICh7TUFUR1JPVVBfRVhQTE9TSVZFLE1BVEdST1VQX0ZMVUlEfSksCisgICAgICAgICAgICAgICAgICh7TUFUX09JTCwyNSxNQVRfTUlTQ19FWFBMT1NJVkUsNTAsTUFUX05JVFJPR0xZQ0VSSU5FfSkpOworCisgICAgIERhbWl0IHdpcmQgZGFzIE1hdGVyaWFsIE55dHJvZ2x5Y2VyaW4gYXVmZ2Vub21tZW4sIGVpbiBleHBsb3NpdmVyCisgICAgIChkYW1pdCBlbnRmbGFtbWJhcmVyKSBzb3dpZSBmbHVlc3NpZ2VyIFN0b2ZmLiBMaWVndCBkaWUgRXJrZW5udW5ncy0KKyAgICAgZmFlaGlna2VpdCAoTWF0ZXJpYWxOYW1lKCkpIHVudGVyIDI1LCB3aXJkIGVzIG51ciBhbHMgT2VsIGVya2FubnQsCisgICAgIGxpZWd0IHNpZSB1bnRlciA1MCwgd2lyZCBlcyB6dW1pbmRlc3QgYWxzIGV4cGxvc2l2ZXMgTWF0ZXJpYWwgZXJrYW5udCwKKyAgICAgbGllZ3Qgc2llIHVlYmVyIDQ5LCBzbyB3aXJkIGVzIGtvcnJla3QgZXJrYW5udCAod2llIHNjaGFkZSA6KSApLgorCitCRU1FUktVTkdFTjoKKyAgICAgV2lyZCBpbiBkZXIgY3JlYXRlKCkgZGVyIERhdGVuYmFuayBhdWZnZXJ1ZmVuLiBadSBiZWFjaHRlbjoKKyAgICAgLSB2b3IgRWludHJhZyBlaW5lcyBfbmV1ZW5fIE1hdGVyaWFscyBkaWUgRGF0ZW5iYW5rIGR1cmNoc3VjaGVuIQorICAgICAtIGJlaSBkZW4gTWF0ZXJpYWxpZW5ncnVwcGVuIGRpZSBhdXRvbWF0aXNjaGVuIEFiaGFlbmdpZ2tlaXRlbiBpbgorICAgICAgIEFkZE1hdGVyaWFsKCkgZHVyY2hzZWhlbiEKKyAgICAgLSBiaXR0ZSBEYXRlbmJhbmsgbmV1IGxhZGVuCisKK1NJRUhFIEFVQ0g6CisgICAgIEtvbnplcHRlOgkgIG1hdGVyaWFsLCBtYXRlcmlhbGVya2VubnVuZworICAgICBHcnVuZGxlZ2VuZDogUF9NQVRFUklBTCwgL3N5cy90aGluZy9tYXRlcmlhbC5oCisgICAgIE1ldGhvZGVuOiAgICBRdWVyeU1hdGVyaWFsKCksIFF1ZXJ5TWF0ZXJpYWxHcm91cCgpLCBNYXRlcmlhbExpc3QoKSwKKyAgICAgTGlzdGVuOgkgIEFsbE1hdGVyaWFscygpLCBBbGxHcm91cHMoKSwgRHVtcCgpCisJCSAgbWF0ZXJpYWxsaXN0ZSwgbWF0ZXJpYWxncnVwcGVuCisgICAgIE1hc3RlcjoJICBDb252TWF0ZXJpYWxMaXN0KCksIE1hdGVyaWFsR3JvdXAoKSwKKwkJICBHcm91cE5hbWUoKSwgTWF0ZXJpYWxOYW1lKCksCisJCSAgR2V0R3JvdXBNZW1iZXJzKCksIEdldE1hdE1lbWJlcnNoaXAoKQorICAgICBTb25zdGlnZXM6CSAgUF9NQVRFUklBTF9LTk9XTEVER0UKKworNy4gTWFpIDIwMDQgR2xvaW5zb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9BZGRNaW5pUXVlc3QgYi9kb2MvbGZ1bi9BZGRNaW5pUXVlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFlNzg1NwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0FkZE1pbmlRdWVzdApAQCAtMCwwICsxLDU0IEBACitBZGRNaW5pUXVlc3QoKQorCitGVU5LVElPTjoKKyAgICBpbnQgQWRkTWluaVF1ZXN0KGludCBzdHVwc2UsIHN0cmluZyBxdWVzdGdlYmVyLCBzdHJpbmcgZGVzYywgaW50IGFjdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0aXRlbCwgc3RyaW5nIGVybGVkaWd0LCBtYXBwaW5nIHZvcmF1c3NldHp1bmdlbiwKKyAgICAgICAgICAgICAgICAgICAgIHN0cmluZyByZWdpb24sIHN0cmluZyAqZXJsYXVidGUpCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc2VjdXJlL3F1ZXN0bWFzdGVyCisKK0JFU0NIUkVJQlVORzoKKyAgICBEaWVzZSBGdW5rdGlvbiB0cmFlZ3QgZWluZSBuZXVlIE1pbmlxdWVzdCBpbSBRdWVzdG1hc3RlciBlaW4uCisKK0FSR1VNRU5URToKKworICAgIHN0dXBzZSAoPjApICAtIEFuemFobCBTdHVmZW5wdW5rdGUsIGRpZSBmdWVyIGRpZSBNUSBndXRnZXNjaHJpZWJlbiB3ZXJkZW4KKyAgICBxdWVzdGdlYmVyICAgLSBMYWRlbmFtZSBkZXMgT2JqZWt0cywgZGFzIEdpdmVNaW5pUXVlc3QoKSBhdWZydWZ0CisgICAgZGVzYyAgICAgICAgIC0gQXVmZ2FiZW5iZXNjaHJlaWJ1bmcgZGVyIE1pbmlxdWVzdAorICAgIGFjdGl2ZSAoMC8xKSAtIGlzdCBkaWUgTWluaXF1ZXN0IGFrdGl2LCBkLmguIHNwaWVsYmFyLCBvZGVyIG5pY2h0PworICAgIHRpdGVsICAgICAgICAtIFRpdGVsIGRlciBNaW5pcXVlc3QsIGRhcmYgd2VkZXIgImluIiwgbm9jaCAiaW0iIGVudGhhbHRlbiwKKyAgICAgICAgICAgICAgICAgICB3ZWlsIGRhbm4gZGVyIEVpbnRyYWcgaW4gZGVyIEZyYXRlcm5pdGFzLUJpYmxpb3RoZWsgbmljaHQKKyAgICAgICAgICAgICAgICAgICBnZWxlc2VuIHdlcmRlbiBrYW5uLgorICAgIGVybGVkaWd0ICAgICAtIEJlc2NocmVpYnVuZyBkZXIgTWluaXF1ZXN0LCBuYWNoZGVtIG1hbiBzaWUgZXJsZWRpZ3QgaGF0CisgICAgICAgICAgICAgICAgICAgRGVyIFRleHQga2FubiBpbiBkZXIgQmlibGlvdGhlayBkZXIga2xlaW5lbiB1bmQgZ3Jvc3NlbgorICAgICAgICAgICAgICAgICAgIEhlbGRlbnRhdGVuIGluIGRlciBGcmF0ZXJuaXRhcyBlaW5nZXNlaGVuIHdlcmRlbi4KKyAgICB2b3JhdXNzZXR6dW5nZW4gLSBNYXBwaW5nIGltIEZvcm1hdCB2b24gUF9SRVNUUklDVElPTlMgKHMuIGRvcnQpLCB1bQorICAgICAgICAgICAgICAgICAgIGRpZSBWb3JhdXNzZXR6dW5nZW4gZmVzdHp1bGVnZW4sIGRpZSBlaW4gU3BpZWxlciAKKyAgICAgICAgICAgICAgICAgICBlcmZ1ZWxsZW4gbXVzcywgdW0gZGllIE1RIHVlYmVyaGF1cHQgc3BpZWxlbiB6dSBrb2VubmVuCisgICAgICAgICAgICAgICAgICAgV2lyZCBmdWVyIGRpZSByZWdpb25zYmV6b2dlbmVuIEluZm9ybWF0aW9uc3B1bmt0ZS8tTlBDcworICAgICAgICAgICAgICAgICAgIGF1c2dld2VydGV0LiAwIG9kZXIgKFtdKSBlaW50cmFnZW4sIHdlbm4ga2VpbmUgCisgICAgICAgICAgICAgICAgICAgVm9yYXVzc2V0enVuZ2VuIGJlc3RlaGVuLgorICAgIHJlZ2lvbiAgICAgICAtIFp1b3JkbnVuZyBkZXIgTWluaXF1ZXN0IHp1IGVpbmVyIFJlZ2lvbjsgd2lyZCBmdWVyIGRlcgorICAgICAgICAgICAgICAgICAgIEJpYmxpb3RoZWsgZGVyIEZyYXRlcm5pdGFzIHZlcndlbmRldCwgdW0gZGllIE1RcyBkZXIKKyAgICAgICAgICAgICAgICAgICBlaW56ZWxuZW4gUmVnaW9uZW4gaGVyYXVzenVmaWx0ZXJuLgorICAgIGVybGF1YnRlICAgICAtIEFycmF5IG1pdCBMYWRlbmFtZW4gdm9uIE9iamVrdGVuLCBkaWUgYmVyZWNodGlndCBzaW5kLAorICAgICAgICAgICAgICAgICAgIGRpZSBEYXRlbiBkZXIgTVEgYWJ6dWZyYWdlbiwgdW0gU3BpZWxlcm4gZWluZW4gSGlud2VpcworICAgICAgICAgICAgICAgICAgIGRhcmF1ZiB6dSBnZWJlbiwgZGllIHNpZSBub2NoIG5pY2h0IGJlc3RhbmRlbiBoYWJlbi4KKworUlVFQ0tHQUJFV0VSVEU6CisgICAgIDE6IEhhdCBnZWtsYXBwdAorICAgIC0xOiBQYXJhbWV0ZXJmb3JtYXQgc3RpbW10IG5pY2h0IChxdWVzdGdlYmVyIGtlaW4gU3RyaW5nIG9kZXIgTGVlcnN0cmluZywKKyAgICAgICAgdm9yYXVzc2V0enVuZ2VuIGtlaW4gTWFwcGluZywgcmVnaW9uIG9kZXIgdGl0ZWwga2VpbmUgU3RyaW5ncywgCisgICAgICAgIGVybGF1YnRlIGtlaW4gQXJyYXkpCisgICAgLTI6IHdlbmlnZXIgYWxzIDEgU3R1ZmVucHVua3QgZWluenV0cmFnZW4gdmVyc3VjaHQKKyAgICAtMzogRGFzIEFycmF5IGluICJlcmxhdWJ0ZSIgaXN0IGxlZXIsIG9kZXIgenVtIGFuZ2VnZWJlbmVuIFF1ZXN0Z2ViZXIKKyAgICAgICAgd3VyZGUga2VpbmUgRGF0ZWkgZ2VmdW5kZW4uCisgICAgLTQ6IERlciBhbmdlZ2ViZW5lIFF1ZXN0Z2ViZXIgdmVyZ2lidCBzY2hvbiBlaW5lIGFuZGVyZSBNaW5pcXVlc3QKKworCitTSUVIRSBBVUNIOgorICAgIEdpdmVNaW5pUXVlc3QoTCksIEhhc01pbmlRdWVzdChMKQorICAgIFBfUkVTVFJJQ1RJT05TCisgICAgL3NlY3VyZS9xdWVzdG1hc3Rlci5jCisKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0FkZE1vbmV5IGIvZG9jL2xmdW4vQWRkTW9uZXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI5ZDFjYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0FkZE1vbmV5CkBAIC0wLDAgKzEsNjIgQEAKK0FkZE1vbmV5KEwpCitGVU5LVElPTjoKKyAgICAgcHVibGljIGludCBBZGRNb25leShpbnQgYW1vdW50KTsKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL2NvbnRhaW5lci9tb25leWhhbmRsZXIuYworICAgICAvc3RkL2xpdmluZy9tb25leWhhbmRsZXIuYworICAgICAvc3RkL3BsYXllci9tb25leWhhbmRsZXIuYworCitBUkdVTUVOVEU6CisgICAgIGludCBhbW91bnQKKyAgICAgICAgIERpZSB6dWZ1ZWhyZW5kZSBvZGVyIGFiemllaGVuZGUgR2VsZG1lbmdlCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGVtIFNwaWVsZXIgd2lyZCBkaWUgaW4gPGFtb3VudD4gZmVzdGdlbGVndGUgR2VsZG1lbmdlIGFiZ2V6b2dlbiBvZGVyCisgICAgIHp1Z2VmdWVocnQuCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIFRlY2huaXNjaCBnZXNlaGVuIHdpcmQgR2VsZCBtaXQgZW50c3ByZWNoZW5kZW0gPGFtb3VudD4gZXJ6ZXVndAorICAgICAoIi9pdGVtcy9tb25leS5jIikgdW5kIG1pdHRlbHMgIm1vdmUiIGluIGRlbiBTcGllbGVyIGJld2VndC4gIERhcyBFcmdlYm5pcworICAgICBkaWVzZXMgIm1vdmUiLUF1ZnJ1ZmVzIHdpcmQgaGllciB1ZWJlcmdlYmVuLCB6LkIuIDEgZnVlciBPSy4KKyAgICAgRGllIG1vZWdsaWNoZW4gRmVobGVyLUtvbnN0YW50ZW4gc2luZCBpbiAvc3lzL21vdmluZy5oIGRlZmluaWVydCwgc2llaGUKKyAgICAgYXVjaCBEb2t1bWVudGF0aW9uIHp1ICJtb3ZlIi4KKworQkVNRVJLVU5HRU46CisgICAgIDxhbW91bnQ+IGthbm4gc293b2hsIHBvc2l0aXYgYWxzIGF1Y2ggbmVnYXRpdiBzZWluLiBXZWxjaGUgQXVzd2lya3VuZ2VuCisgICAgIGJlaWRlIEZhZWxsZSBoYWJlbiwgc29sbHRlIGtsYXIgc2Vpbi4gRG9jaCBzb2xsdGUgYmVpIGVpbmVtIG5lZ2F0aXZlbgorICAgICA8YW1vdW50PiB2b3JoZXIgbWl0dGVscyBRdWVyeU1vbmV5KCkgYWJnZWZyYWd0IHdlcmRlbiwgb2IgZGVyIFNwaWVsZXIKKyAgICAgYXVjaCB1ZWJlciBhdXNyZWljaGVuZCBHZWxkIHZlcmZ1ZWd0LgorICAgICBXaXJkIGRlbSBTcGllbGVyIEdlbGQgYWJnZXpvZ2VuLCBpc3QgZGFyYXVmIHp1IGFjaHRlbiwgZGllc2VzIGluIGRlcgorICAgICBaZW50cmFsYmFuayBlaW56dXphaGxlbiAocy5hLjpQYXlJbigpICkuIAorICAgICBWZXJzY2hhZmZ0IG1hbiBkZW0gU3BpZWxlciBHZWxkIGF1cyBkZW0gTmljaHRzLCBtdXNzIGVzIHZvcmhlciBiZWkgZGVyCisgICAgIFplbnRyYWxiYW5rIGFiZ2VidWNodCAoV2l0aERyYXcoKSkgd2VyZGVuLgorCisgICAgIEFjaHR1bmc6IEthbm4gZGVyIFNwaWVsZXIgZGllIGluIDxhbW91bnQ+IGFuZ2ViZW5lIEdlbGRtZW5nZSBuaWNodAorCSAgICAgIHRyYWdlbiwgd2VyZGVuIGlobSBrZWluZSBNdWVuemVuIGluIHNlaW4gSW52ZW50YXIgYmV3ZWd0LiAgRGllCisJICAgICAgRmVobGVybWVsZHVuZyBlcmtlbm50IG1hbiBhbiBkZW0gUnVlY2tnYWJld2VydCBNRV9UT09fSEVBVlkuCisKKyAgICAgSW0gR2VnZW5zYXR6IHp1IFNwaWVsZXJuIGhhYmVuIGFsbGUgYW5kZXJlbiBPYmpla3RlIChSYWV1bWUsIE5QQywgZXRjLikKKyAgICAgc3RhbmRhcmRtYWVzc2lnIGtlaW5lbiBNb25leWhhbmRsZXIuIEluIGRpZXNlbSBGYWxsIG11c3MgaW4gTGViZXdlc2VuCisgICAgICIvc3RkL2xpdmluZy9tb25leWhhbmRsZXIiCisgICAgIHVuZCBpbiBuaWNodC1MZWJld2VzZW4KKyAgICAgIi9zdGQvY29udGFpbmVyL21vbmV5aGFuZGxlciIKKyAgICAgZ2VlcmJ0IHdlcmRlbi4KKworQkVJU1BJRUxFOgorICAgICAvLyBnaWIgaWhtIEdlbGQKKyAgICAgdGhpc19wbGF5ZXIoKS0+QWRkTW9uZXkoNTApOworCisgICAgIC8vIG5pbW0gaWhtIEdlbGQKKyAgICAgaWYodGhpc19wbGF5ZXIoKS0+QWRkTW9uZXkoLTUwKT09MSkKKyAgICAgIHdyaXRlKCJEZXIgT3JrIGJla2xhdXQgZGljaCFcbiIpOworCitTSUVIRSBBVUNIOgorICAgICBHZWxkaGFuZGxpbmc6CVF1ZXJ5TW9uZXkoTCkKKyAgICAgWmVudHJhbGJhbms6CVBheUluKEwpLCBXaXRoRHJhdyhMKQorICAgICBTb25zdGlnZXM6CQltb3ZlKEwpLAorCQkJL2l0ZW1zL21vbmV5LmMsIC9zeXMvbW92aW5nLmgsIC9zeXMvbW9uZXkuaCwgL3N5cy9iYW5rLmgKKwkJCS9zdGQvY29udGFpbmVyL21vbmV5aGFuZGxlci5jCisKKzE4LjAyLjIwMTMsIFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vQWRkTXNnIGIvZG9jL2xmdW4vQWRkTXNnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NGM5MDUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9BZGRNc2cKQEAgLTAsMCArMSw0MiBAQAorQWRkTXNnKCkKKworRlVOS1RJT046CisgICAgIHZvaWQgQWRkTXNnKHN0cmluZyBtc2csIGludCBuZXh0KTsKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL3RyYW5zcG9ydC5jCisKK0FSR1VNRU5URToKKyAgICAgbXNnCisgICAgICAgICAgRGllIGF1c3p1Z2ViZW5kZSBNZWxkdW5nLgorICAgICBuZXh0CisgICAgICAgICAgWmVpdCBiaXMgenVyIG5hZWNoc3RlbiBGYWhycGxhbnN0YXRpb24uCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGVtIEZhaHJwbGFuIHdpcmQgZGllIEF1c2dhYmUgZWluZXIgTWVsZHVuZyBhbiBkZW4gVHJhbnNwb3J0ZXIKKyAgICAgaGluenVnZWZ1ZWd0LiBEaWVzZSBNZWxkdW5nIGtvZW5udGUgenVtIEJlaXNwaWVsIGRhcyBOYWhlbiBkZXIKKyAgICAgbmFlY2hzdGVuIEhhbHRlc3RlbGxlIGFua3VlbmRpZ2VuIG8uYWUuIE5hY2ggQXVzZ2FiZSBkZXIgTWVsZHVuZworICAgICB2ZXJnZWhlbiBuZXh0IFNla3VuZGVuLCBiaXMgZGllIG5hZWNoc3RlIFN0YXRpb24gYW5nZWZhaHJlbiB3aXJkLgorCisgICAgIFVtIGRhcyBVbWJyZWNoZW4gZGVyIE1lbGR1bmcgKG5vcm1hbGVyd2Vpc2UgYXVmIDc4IFplaWNoZW4gcHJvIFplaWxlKQorICAgICBtdXNzIHNpY2ggZGVyIEF1ZnJ1ZmVyIHNlbGJlciBrdWVtbWVybi4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICAga2VpbmVyCisKK0JFSVNQSUVMRToKKworICAgICBBZGRNc2coIkluIGRlciBGZXJuZSB0YXVjaHQgZWluZSBrbGVpbmUgSW5zZWxuIGF1Zi5cbiIsIDEwKTsKKyAgICAgQWRkTXNnKCJEYXMgU2NoaWZmIHN0ZXVlcnQgZWluZW4ga2xlaW5lbiBTdGVnIGFuLlxuIik7CisgICAgIEFkZFJvdXRlKC4uLik7CisKKyAgICAgTmFjaCBkZXIgQW5rdWVuZGlndW5nIGRlciBJbnNlbCB2ZXJnZWhlbiAxMCBTZWt1bmRlbiwgYmlzIGRpZSBuYWVjaHN0ZQorICAgICBNZWxkdW5nIGF1c2dlZ2ViZW4gd2lyZC4gRGEgYmVpIGRlciB6d2VpdGVuIE1lbGR1bmcga2VpbmUgWmVpdAorICAgICBhbmdlZ2ViZW4gd2FyLCBsZWd0IGRhcyBTY2hpZmYgZGlyZWt0IG5hY2ggZGVyIEF1c2dhYmUgZGVyIE1lbGR1bmcgYW4uCisKK1NJRUhFIEFVQ0g6CisgICAgIEFkZFJvdXRlKCksIEFkZEZ1bigpLCAvc3RkL3RyYW5zcG9ydC5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzI1LjAxLjIwMTUsIFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vQWRkUGxhbnQgYi9kb2MvbGZ1bi9BZGRQbGFudApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzliY2ZmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vQWRkUGxhbnQKQEAgLTAsMCArMSw1OCBAQAorQWRkUGxhbnQoKQorCitGVU5LVElPTjoKKyAgICAgICAgdmFyYXJncyBpbnQgQWRkUGxhbnQoc3RyaW5nIGZpbGVuYW1lLCBbc3RyaW5nfHN0cmluZyogbnBjSWRdKSAKKworREVGSU5JRVJUIElOOgorICAgICAgICAvc3RkL3Jvb20va3JhZXV0ZXIuYworCitBUkdVTUVOVEU6CisgICAgICAgIGZpbGVuYW1lCisgICAgICAgICAgRGVyIEZpbGVuYW1lIGRlcyBLcmF1dHMgZGFzIGhpZXIgZ2VmdW5kZW4gd2VyZGVuIHNvbGwuCisgICAgICAgIG5wY0lkCisgICAgICAgICAgRGllIElEIGVpbmVzIE5QQ3Mgb2RlciBkaWUgSURzIGVpbmVyIExpc3RlIHZvbiBOUENzLCBkZXIvZGllIGRhcyAKKyAgICAgICAgICBLcmF1dCBiZXdhY2hlbiBzb2xsL2VuLiBCZWZpbmRldCBzaWNoIGVpbiBOUEMgbWl0IGVpbmVyIGRpZXNlciBJRHMKKyAgICAgICAgICBpbSBSYXVtLCBrYW5uIGRhcyBLcmF1dCBuaWNodCBnZXBmbHVlY2t0IHdlcmRlbi4gRGllc2VzIEFyZ3VtZW50IAorICAgICAgICAgIGlzdCBvcHRpb25hbCEKKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgICAgLTEgd2VubiBkYXMgT2JqZWt0IG5pY2h0IGdlY2xvbnQgd2VyZGVuIGtvbm50ZQorICAgICAgICA+PTAgc29uc3QKKworQkVTQ0hSRUlCVU5HOgorICAgICAgICBNaXQgSGlsZmUgZGllc2VyIEZ1bmt0aW9uIGtvZW5uZW4gS3JhZXV0ZXIgZnVlciBkZW4gbXVkd2VpdGVuCisgICAgICAgIEtyYWV1dGVyc2tpbGwgcmVjaHQgZWluZmFjaCBlaW5nZWJhdXQgd2VyZGVuLiBBbGxlcyB3YXMgbWFuCisgICAgICAgIG5vY2ggbWFjaGVuIG11c3MsIGlzdCBkZW4gTmFtZW4gZGVyIFBmbGFuemUgaW4gZWluZW0gRGV0YWlsIG9kZXIKKyAgICAgICAgZGVyIExhbmdiZXNjaHJlaWJ1bmcgenUgZXJ3YWVobmVuLgorICAgICAgICBNaXQgZGVtIEJlZmVobCAic2hvd3BsYW50IiBpbiAvb2JqL3Rvb2xzL3BsYW50dG9vbCBrYW5uIG1hbiBzaWNoIAorICAgICAgICBiZXF1ZW0gYW56ZWlnZW4gbGFzc2VuLCB3YXMgZXMgYWxsZXMgYW4gS3JhZXV0ZXJuIGdpYnQsIGRpZSBtYW4gCisgICAgICAgIG5laG1lbiBrYW5uLgorCitCRU1FUktVTkdFTjoKKyAgICAgICAgRGFtaXQgZGllIEtyYWV1dGVyIHZvbiBkZW4gU3BpZWxlcm4genVtIEJyYXVlbiB2b24gVHJhZW5rZW4gYmVudXR6dAorICAgICAgICB3ZXJkZW4ga29lbm5lbiwgbXVzcyBkZXIgUmF1bSBlcnN0IGluIGVpbmVtIE1hc3RlciBlaW5nZXRyYWdlbiB3ZXJkZW4uCisgICAgICAgIERlcnplaXQgc2NoaWNrdCBpaHIgZGF6dSBhbSBiZXN0ZW4gZWluZSBrdXJ6ZSBNYWlsIGFuIGVpbmVuIEVyem1hZ2llciwKKyAgICAgICAgZ2VybmUgbmltbXQgSHVtbmkgZGllIGRlcnplaXQgZW50Z2VnZW4uCisgICAgICAgIERpZSBLcmFldXRlciB3dXJkZW4gdm9uIGRlciBCYWxhbmNlIGJlcmVpdHMgYWxsZSBpbSB2b3JoaW5laW4KKyAgICAgICAgYWJnZW5vbW1lbi4gTGVkaWdsaWNoIGRpZSBFaW5oYWx0dW5nIGRlciBLYXRlZ29yaWVuIGlzdCB6dSBiZWFjaHRlbi4KKyAgICAgICAgU2luZCBLcmFldXRlciBuaWNodCBpbSBNYXN0ZXIga29uZmlndXJpZXJ0ICh3aWUgei5CLiBpbSBIb21lbXVkKSwgc2luZAorICAgICAgICBhbGxlIGVyemV1Z3RlbiBLcmFldXRlciBudXIgIlRlc3RrcmFldXRlciIgbWl0IG51ciBkZXIgSUQgImtyYXV0Ii4KKworQkVJU1BJRUxFOgorICAgICAgICAjaW5jbHVkZSA8aXRlbXMva3JhZXV0ZXIva3JhZXV0ZXJsaXN0ZS5oPgorICAgICAgICBpbmhlcml0ICIvc3RkL3Jvb20va3JhZXV0ZXIiOworICAgICAgICBpbmhlcml0ICIvc3RkL3Jvb20iOworICAgICAgICAKKyAgICAgICAgdm9pZCBjcmVhdGUoKQorICAgICAgICB7CisgICAgICAgICAgOjpjcmVhdGUoKTsKKyAgICAgICAgICBTZXRQcm9wKFBfSU5UX0xPTkcsICJEdSBzaWVoc3QgZWluZSBXaWVzZSB2b2xsZXIgRmVsZGtsZWUuXG4iKTsKKyAgICAgICAgICBBZGRQbGFudChGRUxES0xFRSk7CisgICAgICAgIH0KKworU0lFSEUgQVVDSDoKKyAgICAgICAgQWRkSXRlbSgpOworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisxOC4wMS4yMDE1LCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0FkZFBsdXJhbElkIGIvZG9jL2xmdW4vQWRkUGx1cmFsSWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQzN2JiMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0FkZFBsdXJhbElkCkBAIC0wLDAgKzEsMjcgQEAKK0FkZFBsdXJhbElkKCkKKworRlVOS1RJT046CisgICAgIHZvaWQgQWRkUGx1cmFsSWQobWl4ZWQgaWQpOworCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvdW5pdC5jCisKK0FSR1VNRU5URToKKyAgICAgaWQKKyAgICAgICAgICBJZGVudGZpa2F0aW9uc3N0cmluZyBvZGVyIEFycmF5IHZvbiBTdHJpbmdzCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRXMgd2VyZGVuIGVpbiBvZGVyIG1laHJlcmUgQmV6ZWljaG5lciBoaW56dWdlZnVlZ3QsIG1pdCBkZW5lbiBzaWNoIAorICAgICBtZWhyZXJlIEVpbmhlaXRlbiBkZXIgTWVuZ2UgYW5zcHJlY2hlbiBsYXNzZW4uCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIGtlaW5lcgorCitCRUlTUElFTEU6CisgICAgIHNpZWhlIC9pdGVtcy9tb25leS5jCisKK1NJRUhFIEFVQ0g6CisgICAgIEFkZFNpbmd1bGFySWQoKSwgUmVtb3ZlUGx1cmFsSWQoKSwgQWRkSWQoKSwgaWQoKSwgL3N0ZC91bml0LmMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogTW9uIEp1bCAxNCAxMTozMDowMCAxOTk3IGJ5IFNpbHZhbmEKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0FkZFB1cnN1ZXIgYi9kb2MvbGZ1bi9BZGRQdXJzdWVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MWVhOWQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9BZGRQdXJzdWVyCkBAIC0wLDAgKzEsMjkgQEAKK0FkZFB1cnN1ZXIoKQorCitGVU5LVElPTjoKKyAgdm9pZCBBZGRQdXJzdWVyKG9iamVjdCBwdXJzdWVyKQorCitBUkdVTUVOVEU6CisgIHB1cnN1ZXI6IE9iamVrdCwgZGFzIGRlbWplbmlnZW4gZm9sZ2VuIHNvbGwsIGluIGRlbSBBZGRQdXJzdWVyCisgICAgICAgICAgIGF1ZmdlcnVmZW4gd3VyZGUuCisKK0ZVTktUSU9OOgorICBEdXJjaCBkZW4gQXVmcnVmIHZvbiBBZGRQdXJzdWVyIGluIGVpbmVtIE9iamVrdCwgd2VsY2hlcyBsaXZpbmcoKSBpc3QsCisgIHdpcmQgZGFzIE9iamVjdCwgd2VsY2hlcyBhbHMgQXJndW1lbnQgdWViZXJnZWJlbiB3dXJkZSBpbiBkaWUgTGlzdGUKKyAgZGVyIFZlcmZvbGdlciBlaW5nZXRyYWdlbi4gQWxsZSBPYmpla3RlLCBkaWUgaW4gZGVyIFZlcmZvbGdlcmxpc3RlIHN0ZWhlbgorICB3ZXJkZW4gYmVpIEJld2VndW5nZW4gZGVzIFZlcmZvbGd0ZW4gaW4gZGFzc2VsYmUgRW52aXJvbm1lbnQgYmV3ZWd0LgorCitSVUVDS0dBQkVXRVJUOgorICBrZWluZXIKKworQkVNRVJLVU5HOgorICBJbSBWZXJmb2xnZXIgd2lyZCBQcmV2ZW50Rm9sbG93IG1pdCBkZW0gWmllbG9iamVrdCwgaW4gZGFzIGRlciBWZXJmb2xndGUgCisgIGJld2VndCB3aXJkLCBhdWZnZXJ1ZmVuLiBEYWR1cmNoIGthbm4gZGVyIHJhZXVtbGljaGUgQmVyZWljaCwgaW4gZGVtIAorICB2ZXJmb2xndCB3aXJkLCBlaW5nZXNjaHJhZW5rdCB3ZXJkZW4uCisKK0JFSVNQSUVMRToKKyAgZmluZF9wbGF5ZXIoImpvZiIpLT5BZGRQdXJzdWVyKGZpbmRfcGxheWVyKCJraXJrIikpCisgIERhbmFjaCB3aXJkIEpvZiB2b24gS2lyayB2ZXJmb2xndC4KKworU0lFSEUgQVVDSDoKKyAgIlJlbW92ZVB1cnN1ZXIiLCAiUHJldmVudEZvbGxvdyIKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0FkZFJlYWREZXRhaWwgYi9kb2MvbGZ1bi9BZGRSZWFkRGV0YWlsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZGU3NzUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9BZGRSZWFkRGV0YWlsCkBAIC0wLDAgKzEsODAgQEAKK0FkZFJlYWREZXRhaWwoKQorCitGVU5LVElPTjoKKyAgICB2b2lkIEFkZFJlYWREZXRhaWwoc3RyaW5nfHN0cmluZyprZXlzLAorICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmd8c3RyaW5nKnxtYXBwaW5nfGNsb3N1cmUgZGVzYyk7CisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3RkL3RoaW5nL2Rlc2NyaXB0aW9uLmMKKworQVJHVU1FTlRFOgorICAgIGtleXMKKyAgICAgIFN0cmluZyBvZGVyIEFycmF5IHZvbiBTdHJpbmdzIG1pdCBkZW4gTmFtZW4gZGVyIERldGFpbHMuCisgICAgZGVzYworICAgICAgU3RyaW5nLCBNYXBwaW5nLCBTdHJpbmctQXJyYXkgb2RlciBDbG9zdXJlIG1pdC96dXIgQmVzY2hyZWlidW5nLgorCitCRVNDSFJFSUJVTkc6CisgICAgRGllIEJlc2NocmVpYnVuZyBkZXIgRGV0YWlscyA8a2V5cz4gd2lyZCBnZXNldHp0LiBXaWUgZGllIERldGFpbHMKKyAgICBiZWltIExlc2VuIGF1c2dlZ2ViZW4gd2VyZGVuLCBoYWVuZ3QgaW0gd2VzZW50bGljaGVuIHZvbSBUeXAgZGVyCisgICAgQmVzY2hyZWlidW5nIDxkZXNjPiBhYjoKKyAgICAgIDxkZXNjPiBpc3QgZWluIFN0cmluZy4KKyAgICAgICBCZWltIExlc2VuIHdpcmQgZGllc2VyIFN0cmluZyB6dXJ1ZWNrZ2VnZWJlbi4KKyAgICAgIDxkZXNjPiBpc3QgZWluIFN0cmluZy1BcnJheS4KKyAgICAgICBCZWltIExlc2VuIHdpcmQgenVmYWVsbGlnIGVpbmVyIGRlciBTdHJpbmdzIHp1cnVlY2tnZWdlYmVuLgorICAgICAgPGRlc2M+IGlzdCBlaW4gTWFwcGluZy4KKyAgICAgICAgRGFzIE1hcHBpbmcgbXVzcyBmb2xnZW5kZW4gQXVmYmF1IGhhYmVuOgorICAgICAgICAgIChbMDogICAgICAgICJEZWZhdWx0dGV4dCIsCisgICAgICAgICAgICAicmFzc2UxIjogInIxdGV4dCIsIC4uLl0pLgorCisgICAgICAgIEZhbGxzIGZ1ZXIgZGllIFJhc3NlIGRlcyBkYXMgRGV0YWlsIHVudGVyc3VjaGVuZGVuIFNwaWVsZXJzIGVpbgorICAgICAgICBFaW50cmFnIGltIE1hcHBpbmcgZXhpc3RpZXJ0LCB3aXJkIGRlciBlbnRzcHJlY2hlbmRlIFRleHQKKyAgICAgICAgenVydWVja2dlZ2ViZW4sIGFuc29uc3RlbiBkZXIgRGVmYXVsdHRleHQuIEF1ZiBkaWVzZSBXZWlzZSBzaW5kCisgICAgICAgIHJhc3NlbmFiaGFlbmdpZ2UgVGV4dGUgbW9lZ2xpY2guCisgICAgICA8ZGVzYz4gaXN0IGVpbmUgQ2xvc3VyZS4KKyAgICAgICAgSW4gZGllc2VtIEZhbGwgd2lyZCBkaWUgQ2xvc3VyZSBhdXNnZWZ1ZWhydCB1bmQgZGFzIEVyZ2VibmlzCisgICAgICAgIHp1cnVlY2tnZWdlYmVuLiBEaWUgQ2xvc3VyZSBiZWtvbW10IGRhYmVpIGRlbiBOYW1lbiBkZXMgRGV0YWlscworICAgICAgICBhbHMgUGFyYW1ldGVyIHVlYmVyZ2ViZW4uCisKKyAgICBGdWVyIGxlc2JhcmUgRGV0YWlscyBrb2VubmVuIEZvcnNjaGVycHVua3RlIGVpbmdldHJhZ2VuIHdlcmRlbi4KKworICAgIFdpbGwgbWFuIGVpbiBsZXNiYXJlcyBEZXRhaWwgYW4gZWluZW0gT2JqZWt0IGhhYmVuLCB3ZWxjaGVzIGRlciBTcGllbGVyCisgICAgbWl0ICJsaWVzIDxpZD4iICg8aWQ+IGlzdCBlaW5lIElEIGRlcyBPYmpla3RzKSBiZWtvbW10LCBtdXNzIG1hbiBlaW4KKyAgICBEZXRhaWwgU0VOU0VfREVGQVVMVCBoaW56dWZ1ZWdlbi4KKyAgICAoRWluIERldGFpbCAiPGlkPiIgaGluenV6dWZ1ZWdlbiwgaGF0IGVpbmVuIGdhbnogYW5kZXJlcyBFZmZla3QhIERpZXNlcworICAgICB3dWVyZGUgdm9tIFNwaWVsZXIgbWl0ICJsaWVzIDxpZD4gYW4gPGlkPiIgZ2VsZXNlbiB3ZXJkZW4gdW5kIGlzdAorICAgICBtZWlzdGVucyBuaWNodCBkYXMsIHdhcyBnZXd1ZW5zY2h0IHdpcmQuKQorCitCRU1FUktVTkdFTjoKKyAgICAoMSkgQXVmIGRpZSAnZGVzYycgd2lyZCBrZWluIHByb2Nlc3Nfc3RyaW5nKCkgbWVociBhbmdld2VuZGV0LgorICAgICAgICBCaXR0ZSBzdGF0dGRlc3NlbiBsZnVuIGNsb3N1cmVzIGJ6dy4gJ2lubGluZSBjbG9zdXJlcycKKyAgICAgICAgdmVyd2VuZGVuLgorCisgICAgKDIpIEltIEdlZ2Vuc2F0eiB6dW0gVmVyaGFsdGVuIHZvbiBBZGRUb3VjaERldGFpbCgpLCBBZGRTbWVsbHMoKSB1bmQKKyAgICAgICAgQWRkU291bmRzKCkgd2lya3QgZWluIFNFTlNFX0RFRkFVTFQtRGV0YWlsIGluIGVpbmVtIFJhdW0gbmljaHQuCisgICAgICAgIEVpbiBlaW5mYWNoZXMgImxpZXMiIGJsZWlidCBkYW5uIG9obmUgUnVlY2tnYWJld2VydC4KKworQkVJU1BJRUxFOgorICAgIEFkZFJlYWREZXRhaWwoICh7ICJzY2hpbGQiIH0pLAorICAgICAgIkJFVFJFVEVOIFNUUkVOR1NURU5TIFZFUkJPVEVOIVxuIiApOworCisgICAgQWRkUmVhZERldGFpbCgiaW5zY2hyaWZ0IiwKKyAgICAgICAgICAgICAgICAgIChbMDogIkRvcnQgc3RlaHQ6IEVpbiBSaW5nIHNpZSB6dSBiaW5kZW4uIC4uLi5cbiIsCisgICAgICAgICAgICAgICAgICAgICJlbGYiOiAiQWxsZXMgaW4gZGlyIHN0cmFldWJ0IHNpY2gsIERBUyBEQSB6dSBsZXNlbi5cbiJdKSk7CisKKyAgICBBZGRSZWFkRGV0YWlsKCJyZWdlbG4iLAorICAgICAgZnVuY3Rpb24gc3RyaW5nKCkgeworICAgICAgICB0aGlzX3BsYXllcigpLT5Nb3JlKCIvZXRjL1dJWlJVTEVTIiwgMSk7CisgICAgICAgIHJldHVybiAiIjsKKyAgICAgIH0pOworCitTSUVIRSBBVUNIOgorICAgIFNldHplbjogICAgQWRkRGV0YWlsKCksIEFkZFNtZWxscygpLCBBZGRTb3VuZHMoKSwKKyAgICAgICAgICAgICAgIEFkZFRvdWNoRGV0YWlsKCkKKyAgICBMb2VzY2hlbjogIFJlbW92ZURldGFpbCgpLCBSZW1vdmVSZWFkRGV0YWlsKCksIFJlbW92ZVNtZWxscygpLAorICAgICAgICAgICAgICAgUmVtb3ZlU291bmRzKCksIFJlbW92ZVRvdWNoRGV0YWlsKCkKKyAgICBEYXRlbjogICAgIFBfREVUQUlMUywgUF9SRUFEX0RFVEFJTFMsIFBfU01FTExTLCBQX1NPVU5EUywgUF9UT1VDSF9ERVRBSUxTCisgICAgVmVyYWx0ZXQ6ICBBZGRTcGVjaWFsRGV0YWlsKCksIFJlbW92ZVNwZWNpYWxEZXRhaWwoKSwgUF9SRUFEX01TRworICAgIFNvbnN0aWdlczogR2V0RGV0YWlsKCksIGJyZWFrX3N0cmluZygpCisKKzIwLjAxLjIwMTUsIFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vQWRkUmVzaXN0YW5jZU1vZGlmaWVyIGIvZG9jL2xmdW4vQWRkUmVzaXN0YW5jZU1vZGlmaWVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NzZmODYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9BZGRSZXNpc3RhbmNlTW9kaWZpZXIKQEAgLTAsMCArMSw0OSBAQAorQWRkUmVzaXN0YW5jZU1vZGlmaWVyKCkKKworRlVOS1RJT046CisgICAgIHZhcmFyZ3MgaW50IEFkZFJlc2lzdGFuY2VNb2RpZmllcihtYXBwaW5nIG1vZCwgc3RyaW5nIGFkZCkKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL2xpdmluZy9jb21iYXQuYworCitBUkdVTUVOVEU6CisgICAgIG1hcHBpbmcgbW9kOgorICAgICAgTWFwcGluZyBtaXQgU2NoYWRlbnNhcnRlbiB1bmQgaWhyZW0gUmVzaXN0ZW56bW9kaWZpa2F0b3IgKGRlciBpbSBCZXJlaWNoCisgICAgICB2b24gLTEuMCBiaXMgK3ggbGllZ2VuIGthbm4pLCB6LkIuIChbRFRfRklSRTotMS4wXSkgKFRvdGFscmVzaXN0ZW56KS4KKyAgICAgc3RyaW5nIGFkZDoKKyAgICAgIEVpbiBJZGVudGlmaWthdG9yIGZ1ZXIgX2RpZXNlbl8gRWludHJhZyBkZXMgc2V0emVuZGVuIE9iamVrdGVzLgorCitCRVNDSFJFSUJVTkc6CisgICAgIEVzIHdlcmRlbiBSZXNpc3RlbnplbiBpbiBkZW0gT2JqZWt0IGdlc2V0enQsIGRpZSBzb2xhbmdlIGJlc3RlaGVuLCB3aWUKKyAgICAgZGFzIHNldHplbmRlIE9iamVrdCBleGlzdGllcnQsIG9kZXIgbmljaHQgUmVtb3ZlUmVzaXN0YW5jZU1vZGlmaWVyCisgICAgIChtaXQgZXZlbnR1ZWxsZW0gU2NobHVlc3NlbCBhZGQpIGF1ZmdlcnVmZW4gd2lyZC4gWnVzYWV0emxpY2hlIFJlc2lzdGVuemVuCisgICAgIHdlcmRlbiBlaW5nZXJlY2huZXQuCisKK0JFTUVSS1VOR0VOOgorICAgICBGdWVyIFJ1ZXN0dW5nZW4ga2FubiB1bmQgc29sbHRlIG1hbiBQX1JFU0lTVEFOQ0VfU1RSRU5HVEhTIHZlcndlbmRlbi4KKworQkVJU1BJRUxFOgorICAgICAvLyBPZWwgbWl0IHZlcnZpZXJmYWNodGVtIEZldWVyc2NoYWRlbgorICAgICBpbnQgYWRkX2FjdGlvbigpIHsKKyAgICAgIC4uLgorICAgICAgd3JpdGUoYnJlYWtfc3RyaW5nKCJEdSBzY2h1ZXR0ZXN0IGRhcyBPZWwgdWViZXIgIisKKwkJCSBucGMtPm5hbWUoV0VOKSsiLiIsNzgpKTsKKyAgICAgIC4uLgorICAgICAgbnBjLT5BZGRSZXNpc3RhbmNlTW9kaWZpZXIoKFtEVF9GSVJFOjMuMF0pLCAib2VsIik7CisgICAgICBTZXRQcm9wKFBfSU5WSVMsMSk7CisgICAgICBTZXRQcm9wKFBfRVhUUkFfTE9PSywgIlVlYmVyYWxsIHRyb3BmdCBPZWwgaGVydW50ZXIuXG4iKTsKKyAgICAgIG1vdmUobnBjLE1fTk9DSEVDSyk7CisgICAgICAuLi4KKyAgICAgfQorCitSVWVDS0dBQkVXRVJUOgorICAgICAxIGZ1ZXIgRXJmb2xnCisKK1NJRUhFIEFVQ0g6CisgICAgIE1vZGlmaWthdG9yZW46CVJlbW92ZVJlc2lzdGFuY2VNb2RpZmllcigpLCBQX1JFU0lTVEFOQ0VfTU9ESUZJRVIKKyAgICAgc2ltcGxlIFJlc2lzdGVuejoJUF9SRVNJU1RBTkNFLCBQX1ZVTE5FUkFCSUxJVFkKKyAgICAgSGF1cHRtYXBwaW5nOglQX1JFU0lTVEFOQ0VfU1RSRU5HVEhTCisgICAgIEJlcmVjaG51bmc6CUNoZWNrUmVzaXN0YW5jZSgpLCBVcGRhdGVSZXNpc3RhbmNlU3RyZW5ndGhzKCkKKyAgICAgYW5kZXJlczoJCWJhbGFuY2UsIC9zdGQvYXJtb3VyL2NvbWJhdC5jLCAvc3RkL2xpdmluZy9jb21iYXQuYworCisyOS5BcHIgMjAwMiwgR2xvaW5zb25ATUcKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0FkZFJvb21DbWQgYi9kb2MvbGZ1bi9BZGRSb29tQ21kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMjA2ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9BZGRSb29tQ21kCkBAIC0wLDAgKzEsMTMgQEAKK0FkZFJvb21DbWQoKQorCitTWU5UQVg6CisJQWRkUm9vbUNtZCggc3RyaW5nIGtvbW1hbmRvLCBzdHJpbmcgZnVua3Rpb24gKTsKKwlBZGRSb29tQ21kKCBzdHJpbmcgKmtvbW1hbmRvcywgc3RyaW5nIGZ1bmt0aW9uICk7CisKK0ZVTktUSU9OOgorCQorCURpZXNlIEZ1bmt0aW9uIGlzdCB2ZXJhbHRldC4gU2llIHdpcmQgdm9sbHN0YWVuZGlnIGR1cmNoCisJZGllIEZ1bmt0aW9uIEFkZENtZCBlcnNldHp0LgorCitTSUVIRSBBVUNIOgorCSJBZGRDbWQiCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9BZGRSb29tTWVzc2FnZSBiL2RvYy9sZnVuL0FkZFJvb21NZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhOWNhMTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9BZGRSb29tTWVzc2FnZQpAQCAtMCwwICsxLDgwIEBACitBZGRSb29tTWVzc2FnZSgpCisKK0ZVTktUSU9OOgorICAgICB2b2lkIEFkZFJvb21NZXNzYWdlKHN0cmluZyAqbXNnLCBpbnQgdGltZSwgbWl4ZWQgKmZ1bmMpOworCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvcm9vbS9kZXNjcmlwdGlvbi5jCisKK0FSR1VNRU5URToKKyAgICAgbXNnCisgICAgICAgICAgQXJyYXkgdm9uIFN0cmluZ3MgbWl0IGRlbiBNZWxkdW5nZW4uCisgICAgIHRpbWUKKyAgICAgICAgICBEZXIgQWJzdGFuZCB6d2lzY2hlbiB6d2VpIE1lbGR1bmdlbiBpbiBTZWt1bmRlbi4KKyAgICAgZnVuYyAob3B0aW9uYWwpCisgICAgICAgICAgU3RyaW5nIG9kZXIgQXJyYXkgdm9uIFN0cmluZ3MgbWl0IEZ1bmt0aW9uc25hbWVuCisKK0JFU0NIUkVJQlVORzoKKyAgICAgTWl0IGRpZXNlciBGdW5rdGlvbiBsZWd0IG1hbiBmZXN0LCBkYXNzIGluIGJlc3RpbW10ZW4gWmVpdGFic3RhZW5kZW4KKyAgICAgTWVsZHVuZ2VuIGFuIGRlbiBSYXVtIGdlc2NoaWNrdCB3ZXJkZW4gc29sbGVuLgorCisgICAgIEVzIHdpcmQgYWxsZSB0aW1lIFNla3VuZGVuIHp1ZmFlbGxpZyBlaW5lIGRlciBpbiBtc2cgYW5nZWdlYmVuZW4KKyAgICAgTWVsZHVuZ2VuIGF1c2dlZ2ViZW4uIEhhdCBtYW4gYXVjaCBub2NoIGZ1bmMgYW5nZWdlYmVuLCBzbyB3aXJkCisgICAgIHp1c2FldHpsaWNoIGRpZXNlIEZ1bmt0aW9uIChiZWkgZWluZW0gQXJyYXk6IGVpbmUgenVmYWVsbGlnIGF1c2dlc3VjaHRlCisgICAgIEZ1bmt0aW9uKSBpbSBSYXVtIGF1ZmdlcnVmZW4uIEFscyBQYXJhbWV0ZXIgYmVrb21tdCBkaWUgRnVua3Rpb24gZGllCisgICAgIE51bW1lciBkZXIgYXVzZ2VnZWJlbmVuIE1lbGR1bmcuCisKKyAgICAgQmV2b3IgbWFuIGFsbGVyZGluZ3MgamVkZW4gUmF1bSBtaXQgQWRkUm9vbU1lc3NhZ2UoKSBwZmxhc3RlcnQsIHNvbGx0ZQorICAgICBtYW4gZm9sZ2VuZGVzIGJlZGVua2VuOgorICAgICAgICBvIFZpZWxlIE1lbGR1bmdlbiBpbiB2aWVsZW4gUmFldW1lbiB0ZW5kaWVyZW4gZGF6dSwgZGVuIFNwaWVsZXJuIGF1ZgorICAgICAgICAgIGRpZSBOZXJ2ZW4genUgZ2VoZW4hCisgICAgICAgIG8gRGEgZGFzIFRpbWluZyB1ZWJlciBlaW5lbiBjYWxsX291dCgpIGdlc3RldWVydCB3aXJkLCBpc3QgZGFzIEdhbnplCisgICAgICAgICAgYXVzIFNpY2h0IGRlcyBHYW1lRHJpdmVycyBhdWNoIG5vY2ggcmVsYXRpdiB0ZXVlciEKKyAgICAgRmF6aXQ6IHdlbmlnZXIgaXN0IG1laHIhCisKK0JFTUVSS1VOR0VOOgorICAgICAqIEZhbGxzIHRpbWUgPCAxNSBTZWt1bmRlbiBpc3QsIHdpcmQgYXVmIDE1IFNla3VuZGVuIGF1ZmdlcnVuZGV0LgorICAgICAqIGRlciBQcmFlZml4IEFkZC4uLiB0YWV1c2NodCBoaWVyLiBFaW4gQXVmcnVmIHZvbiBBZGRSb29tTWVzc2FnZSgpCisgICAgICAgdWViZXJzY2hyZWlidCBhbGxlIHZvcmhlcmlnZW4gV2VydGUKKyAgICAgKiBUSElTX1BMQVlFUigpIE5JQ0hUIFZFUldFTkRFTiEKKyAgICAgSW4gRnVua3Rpb25lbiwgZGllIGR1cmNoIEFkZFJvb21NZXNzYWdlKCkgYXVzZ2Vsb2VzdCB3ZXJkZW4sIGRhcmYKKyAgICAgdGhpc19wbGF5ZXIoKSBuaWNodCB2ZXJ3ZW5kZXQgd2VyZGVuLiBBZGRSb29tTWVzc2FnZSBpc3QgY2FsbF9vdXQtCisgICAgIGdlc3RldWVydCB1bmQgc3BlaWNoZXJ0IHNvbWl0IGRhcyB0aGlzX3BsYXllcigpLiBEYW1pdCBpc3QgdGhpc19wbGF5ZXIoKQorICAgICBpbW1lciBkZXIgU3BpZWxlciwgZGVyIGRlbiBSYXVtIGdlbGFkZW4sIGFsc28gZGVuIFJhdW0gYWxzIGVyc3RlcgorICAgICBiZXRyZXRlbiBoYXQuIAorICAgICBTcGllbGVyIGFsc28gYml0dGUgc2VsYnN0IHVlYmVyIGZpbHRlcihhbGxfaW52ZW50b3J5KHRoaXNfb2JqZWN0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjJ2ludGVyYWN0aXZlKSBzdWNoZW4uCisKK0JFSVNQSUVMRToKKyAgICAgRXMgc29sbCBhbGxlIGhhbGJlIE1pbnV0ZSBlaW5lIE1lbGR1bmcgYXVzZ2VnZWJlbiB3ZXJkZW4uIEZhbGxzIGVzCisgICAgIHVudGVyIGRlbiBGdWVzc2VuIGtuYWNrdCwgc29sbCBtYW4genVkZW0gbWl0IDMwJS1pZ2VyCisgICAgIFdhaHJzY2hlaW5saWNoa2VpdCB6dXNhbW1lbnp1Y2tlbjoKKworICAgICBpbmhlcml0ICIvc3RkL3Jvb20iOworCisgICAgIHZvaWQgY3JlYXRlKCkgeworICAgICAgIDo6Y3JlYXRlKCk7CisgICAgICAgQWRkUm9vbU1lc3NhZ2UoICh7ICJJbiBkZXIgRmVybmUgc2NocmVpdCBlaW4gS2FldXpjaGVuLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkVzIHJhc2NoZWx0IGltIEdlYnVlc2NoLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkV0d2FzIGtuYWNrdCB1bnRlciBEZWluZW4gRnVlc3Nlbi5cbiIgfSksCisgICAgICAgICAgICAgICAgICAgICAgICAzMCwgKHsic291bmQiLCAic291bmRfbW9yZV9ybmQifSkgKTsKKyAgICAgICAuLi4KKyAgICAgfQorCisgICAgIHZvaWQgc291bmQoaW50IG1zZykgeworICAgICAgIGlmIChtc2cgPT0gMikgICAgICAgICAvLyBFcyBoYXQgZ2VrbmFja3QuLi4KKyAgICAgICAgIGlmIChyYW5kb20oMTApIDwgMykgLy8gU2NocmVjayBsYXNzIG5hY2ghIDstKQorICAgICAgICAgICB0ZWxsX3Jvb20odGhpc19vYmplY3QoKSwgIkVyc2Nocm9ja2VuIGZhZWhyc3QgRHUgenVzYW1tZW4hXG4iICk7CisgICAgIH0KKworICAgICAvLyBFeHRyYS1CZWlzcGllbDogd2lyIHNldHplbiBkaWUgV2FydGVkYXVlciAoUGFyYW1ldGVyIHRpbSkgbmV1CisgICAgIHZvaWQgc291bmRfbW9yZV9ybmQoKSB7CisgICAgICAgc291bmQoMCk7ICAgLy8gZGllIE1lc3NhZ2UtTnVtbWVyIGlzdCBoaWVyIHVud2ljaHRpZworICAgICAgIFNldFByb3AoUF9NU0dfUFJPQiwgMjUrcmFuZG9tKDIwKSk7ICAvLyBuZXVlIFdhcnRlZGF1ZXIKKyAgICAgfQorCitTSUVIRSBBVUNIOgorICAgICBWZXJ3YW5kdDogdGVsbF9yb29tKCksIFJlY2VpdmVNc2coKQorICAgICBQcm9wczogICAgUF9ST09NX01TRywgUF9GVU5DX01TRywgUF9NU0dfUFJPQgorCisyLkZlYiAyMDE2IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9BZGRSb3V0ZSBiL2RvYy9sZnVuL0FkZFJvdXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjYTAwOTMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9BZGRSb3V0ZQpAQCAtMCwwICsxLDg0IEBACitBZGRSb3V0ZSgpCitGVU5LVElPTjoKKyAgICBwdWJsaWMgdmFyYXJncyB2b2lkIEFkZFJvdXRlKHN0cmluZyByb29tLCBpbnQgc3RheSwgaW50IG5leHQsIAorICAgICAgICBzdHJpbmcgaGFyYm91cl9kZXNjLCBtaXhlZCBkZXN0X2lkcywgc3RyaW5nIGRlc3RzdHIpCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3RkL3RyYW5zcG9ydC5jCisKK0FSR1VNRU5URToKKyAgICBzdHJpbmcgcm9vbQorICAgICAgICBGaWxlbmFtZSBkZXIgSGFsdGVzdGVsbGUgKGRlcyBaaWVscykKKyAgICBpbnQgc3RheQorICAgICAgICBBdWZlbnRoYWx0c3plaXQgYW4gZGVyIEhhbHRlc3RlbGxlLgorICAgIGludCBuZXh0CisgICAgICAgIEZhaHJ0emVpdCB2b24gZG9ydCBiaXMgenVtIG5hZWNoc3RlbiBGYWhycGxhbnB1bmt0CisgICAgc3RyaW5nIGhhcmJvdXJfZGVzYworICAgICAgICBOYW1lIGRlciBIYWx0ZXN0ZWxsZSAoZnVlciBRdWVyeUFycml2ZWQpCisgICAgbWl4ZWQgZGVzdF9pZHMKKyAgICAgICAga2xlaW5nZXNjaHJpZWJlbmUgSURzIGRlciBIYWx0ZXN0ZWxsZQorICAgIHN0cmluZyBkZXN0cnN0cgorICAgICAgICBVbmJlbnV0enQgLyBVbmRlZmluaWVydC4KKworQkVTQ0hSRUlCVU5HOgorICAgIERlbSBGYWhycGxhbiBkZXMgVHJhbnNwb3J0ZXJzIHdpcmQgZWluZSBuZXVlIEhhbHRlc3RlbGxlIGhpbnp1Z2VmdWVndC4KKworICAgIEJlaSBFcnJlaWNoZW4gZGVyIEhhbHRlc3RlbGxlIHdpcmQgZGVyIFRyYW5zcG9ydGVyIGluIGRlbiBSYXVtICdyb29tJworICAgIGJld2VndCB1bmQgc2ljaHRiYXIgZ2VtYWNodC4gTnVuIGthbm4gbWFuIGlobiBmdWVyICdzdGF5JyBTZWt1bmRlbgorICAgIGJldHJldGVuIG9kZXIgdmVybGFzc2VuLCBiZXZvciBlciBhYmxlZ3QgKHVuc2ljaHRiYXIgZ2VtYWNodCB3aXJkKS4KKyAgICBOYWNoICduZXh0JyBTZWt1bmRlbiB3aXJkIGRhbm4gZGVyIG5hZWNoc3RlIFB1bmt0IGRlcyBGYWhycGxhbnMKKyAgICBhdXNnZWZ1ZWhydC4KKyAgICAgCisgICAgJ2hhcmJvdXJfZGVzYycgaXN0IGVpbiBTdHJpbmcsIGRlbiBRdWVyeUFycml2ZWQoKSB6dXJ1ZWNrZ2lidCwgd2VubiBzaWNoCisgICAgZGVyIFRyYW5zcG9ydGVyIGFuIGVpbmVyIEhhbHRlc3RlbGxlIGJlZmluZGV0LiBJbiBkZXIgUmVnZWwgaXN0IGRhcyBlaW4KKyAgICBTdHJpbmcsIGRlciBkaWUgSGFsdGVzdGVsbGUgbmFlaGVyIGJlc2NocmVpYnQuCisgICAgCisgICAgJ2Rlc3RfaWRzJyBpc3QgZWluIEFycmF5IHZvbiBTdHJpbmdzLCBkaWUgYWxzIElELUNvZGUgZnVlciBkaWVzZSAKKyAgICBIYWx0c3RlbGxlIGRpZW5lbi4gRGFzIHdpcmQgekIgYmVpIGRlciBFcm1pdHRsdW5nIGVpbmVyIEhhbHRlc3RlbGxlIGJlaSAKKyAgICAicmVpc2UgbmFjaCIgYmVudXR6dC4gV2VubiAnZGVzdF9pZHMnIG5pY2h0IGdlc2V0enQgaXN0LCB1bmQgYXVjaCAKKyAgICBQX0hBUkJPVVIgZGVzIFppZWxoYWZlbnMgbmljaHQga29ycmVrdCBnZXNldHp0IGlzdCwgd2VyZGVuIAorICAgIGdyb3NzZ2VzY2hyaWViZW5lIEJlZ3JpZmZlIGF1cyAnaGFyYm91cl9kZXNjJyB2ZXJ3ZW5kZXQuCisKK0JFSVNQSUVMRToKKyAgICAjMSBIaWVyIGVpbiBBdXN6dWcgYXVzIC9kL2luc2Vsbi9zY2hpZmZlL2pvbGxlLmM6CisKKyAgICAgIEFkZFJvdXRlKCIvZC9lYmVuZS9yb29tL1BvcnRWYWluL3BvX2hhZjIiLCA0MCwKKyAgICAgICAgICAgICAgIDEwLCAiSGFmZW4gdm9uIFBvcnQgVmFpbiIpOworCisgICAgRGllIEpvbGxlIHdpcmQgYWxzbyBiZWltIEFubGVnZW4gaW4gZGVuIFBvcnQgVmFpbmVyIEhhZmVuIGJld2VndCB1bmQKKyAgICBsYWVzc3Qgc2ljaCBkb3J0IDQwIFNla3VuZGVuIGxhbmcgYmV0cmV0ZW4gb2RlciB2ZXJsYXNzZW4uCisgICAgUXVlcnlBcnJpdmVkKCkgbGllZmVydCB3YWVocmVuZCBkaWVzZXIgWmVpdCBkZW4gU3RyaW5nICJIYWZlbiB2b24gUG9ydAorICAgIFZhaW4iIHp1cnVlY2suIE5hY2ggZGVuIDQwIFNla3VuZGVuIGxlZ3QgZGllIEpvbGxlIGFiLCB1bmQgbmFjaAorICAgIHdlaXRlcmVuIDEwIFNla3VuZGVuIHdpcmQgZGllIG5hZWNoc3RlIFN0YXRpb24gaW4gaWhyZW0gRmFocnBsYW4KKyAgICBhbmdlZmFocmVuLgorCisgICAgIzIgRGllIEdhbGVlcmUgbmFjaCBPcmtoYXVzZW46CisgICAgICBBZGRSb3V0ZShJTlNFTCgic3RlZyIpLCAzMCwgMjAsICJWZXJsb3JlbmUgTGFuZCAoIE9ya2hhdXNlbiApIiApOworICAgICAgLSBoYWVsdCAzMCBTZWt1bmRlbgorICAgICAgLSByZWlzdCAyMCBTZWt1bmRlbgorICAgICAgLSByZWlzdCBuYWNoIElOU0VMKCJzdGVnIiksIGJla2FubnQgYWxzICJWZXJsb3JlbmUgTGFuZCAoIE9ya2hhdXNlbiApIgorICAgICAgLSBkYSBrZWluZSAnZGVzdF9pZHMnIGFuZ2VnZWJlbiBzaW5kLCB3YWVyZSBlaW5lIHNvIGRlZmluaWVydGUgCisgICAgICAgIEhhbHRzdGVsbGUgbnVyIG1pdCBkZW4gSURzIGFuc3ByZWNoYmFyLCBkaWUgaW4gUF9IQVJCT1VSUyBpbSBaaWVscmF1bQorICAgICAgICBhbmdlZ2ViZW4gc2luZC4KKworICAgIFdlbm4gbWFuIG51biBlcnJlaWNoZW4gd29sbHRlLCBkYXNzIGRhcyBaaWVsIGF1Y2ggbWl0IGRlbSBLdWVyemVsICJ2bGFuZCIKKyAgICBhbnNwcmVjaGJhciBpc3QsIGthbm4gbWFuIHp1bSBlaW5lbiBleHBsaXppdGUgJ2Rlc3RfaWRzJyBlaW50cmFnZW46CisgICAgICBBZGRSb3V0ZShJTlNFTCgic3RlZyIpLCAzMCwgMjAsICJWZXJsb3JlbmUgTGFuZCAoIE9ya2hhdXNlbiApIiwKKyAgICAgICAgICAgICAgICh7InZlcmxvcmVuZXMiLCAibGFuZCIsICJvcmtoYXVzZW4iLCAidmxhbmQifSkpOworICAgIERpZXMgbGFlc3N0IHNpY2ggaW0gWmllbGhhZmVuIGFiZXIgYXVjaCBkdXJjaCBFaW50cmFnZW4gZGVzIEt1ZXJ6ZWxzCisgICAgInZsYW5kIiBpbiBQX0hBUkJPVVIgZXJyZWljaGVuLiBEaWVzIGhhdCBkZW4gVm9ydGVpbCwgZGFzcyBkaWVzZXIgSGFmZW4KKyAgICBkYW5uIHZvbiBhbGxlbiBUcmFuc3BvcnRlcm4sIGRpZSBkb3J0IGFubGVnZW4sIHVudGVyIGRlbXNlbGJlbiBOYW1lbgorICAgIGVycmVpY2h0IHdlcmRlbiBrYW5uLgorICAgIAorSElOV0VJU0U6CisgICAgRGFkdXJjaCwgZGFzcyBkaWUgRWludHJhZWdlIGF1cyBQX0hBUkJPVVIgdW5kICdkZXN0X2lkcycgZ2xlaWNoYmVyZWNodGlndAorICAgIGZ1ZXIgInJlaXNlIG5hY2ggPHppZWw+IiB2ZXJ3ZW5kZXQgd2VyZGVuIGtvZW5uZW4sIGlzdCBlcyBtb2VnbGljaCwKKyAgICBkYXNzIGRpZSBSZWlzZXppZWxlIGF1ZiBlaW5lbSBTY2hpZmYgdW50ZXIgenVzYWV0emxpY2hlbiBCZXplaWNobnVuZ2VuIAorICAgIGJla2FubnQgc2luZCwgYWxzIGFuIExhbmQgKHp1bSBCZWlzcGllbCBrb2VubnRlIGVpbmUgZmVybndlc3RsaWNoZQorICAgIEJlc2F0enVuZyBkaWUgWmllbGUgYW5kZXJzIG5lbm5lbikuCisKK1NJRUhFIEFVQ0g6CitGdW5rdGlvbmVuOiAgQWRkTXNnKEwpLCBBZGRGdW4oTCksIC9zdGQvdHJhbnNwb3J0LmMKK1Byb3BlcnRpZXM6ICBQX0hBUkJPVVIsIFBfTk9fVFJBVkVMSU5HLCBQX1RSQVZFTF9JTkZPCisKKzIwMTUtSmFuLTE4LCBBcmF0aG9ybi4KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0FkZFNpbmd1bGFySWQgYi9kb2MvbGZ1bi9BZGRTaW5ndWxhcklkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NTY1NjcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9BZGRTaW5ndWxhcklkCkBAIC0wLDAgKzEsMjcgQEAKK0FkZFNpbmd1bGFySWQoKQorCitGVU5LVElPTjoKKyAgICAgdm9pZCBBZGRTaW5ndWxhcklkKG1peGVkIGlkKTsKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL3VuaXQuYworCitBUkdVTUVOVEU6CisgICAgIGlkCisgICAgICAgICAgSWRlbnRpZmlrYXRpb25zc3RyaW5nIG9kZXIgQXJyYXkgdm9uIFN0cmluZ3MKKworQkVTQ0hSRUlCVU5HOgorICAgICBFcyB3ZXJkZW4gZWluIG9kZXIgbWVocmVyZSBCZXplaWNobmVyIGhpbnp1Z2VmdWVndCwgbWl0IGRlbmVuIHNpY2ggZWluZQorICAgICBlaW56ZWxuZSBFaW5oZWl0IGFuc3ByZWNoZW4gbGFlc3N0LgorCitSVWVDS0dBQkVXRVJUOgorICAgICBrZWluZXIKKworQkVJU1BJRUxFOgorICAgICBzaWVoZSAvaXRlbXMvbW9uZXkuYworCitTSUVIRSBBVUNIOgorICAgICBBZGRQbHVyYWxJZCgpLCBSZW1vdmVTaW5ndWxhcklkKCksIEFkZElkKCksIGlkKCksIC9zdGQvdW5pdC5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IE1vbiBKdWwgMTQgMTE6MzE6MDAgMTk5NyBieSBTaWx2YW5hCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9BZGRTbWVsbHMgYi9kb2MvbGZ1bi9BZGRTbWVsbHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY4MmYwMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0FkZFNtZWxscwpAQCAtMCwwICsxLDcxIEBACitBZGRTbWVsbHMoKQorCitGVU5LVElPTjoKKyAgICB2b2lkIEFkZFNtZWxscyhzdHJpbmd8c3RyaW5nKiBrZXlzLCBzdHJpbmd8c3RyaW5nKnxtYXBwaW5nfGNsb3N1cmUgZGVzYyk7CisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3RkL3RoaW5nL2Rlc2NyaXB0aW9uLmMKKworQVJHVU1FTlRFOgorICAgIGtleXMKKyAgICAgIFN0cmluZyBvZGVyIEFycmF5IHZvbiBTdHJpbmdzIG1pdCBkZW4gTmFtZW4gZGVyIERldGFpbHMuCisgICAgZGVzYworICAgICAgU3RyaW5nLCBNYXBwaW5nLCBTdHJpbmctQXJyYXkgb2RlciBDbG9zdXJlIG1pdC96dXIgQmVzY2hyZWlidW5nLgorCitCRVNDSFJFSUJVTkc6CisgICAgRGllc2UgRnVua3Rpb24gZW50c3ByaWNodCBkZW0gQWRkRGV0YWlsKCkgZnVlciBTdGFuZGFyZGRldGFpbHMsIG51cgorICAgIGtvZW5uZW4gaGllcm1pdCBHZXJ1ZWNoZSByZWFsaXNpZXJ0IHdlcmRlbjoKKyAgICBEaWUgQmVzY2hyZWlidW5nIGRlciBEZXRhaWxzIDxrZXlzPiB3aXJkIGdlc2V0enQuIFdpZSBkaWUgRGV0YWlscworICAgIGJlaSBkZXIgVW50ZXJzdWNodW5nIGF1c3NlaGVuLCBoYWVuZ3QgaW0gd2VzZW50bGljaGVuIHZvbSBUeXAgZGVyCisgICAgQmVzY2hyZWlidW5nIDxkZXNjPiBhYjoKKyAgICAgIDxkZXNjPiBpc3QgZWluIFN0cmluZy4KKyAgICAgICAgQmVpbSBVbnRlcnN1Y2hlbiB3aXJkIGRpZXNlciBTdHJpbmcgenVydWVja2dlZ2ViZW4uCisgICAgICA8ZGVzYz4gaXN0IGVpbiBTdHJpbmctQXJyYXkuCisgICAgICAgIEJlaW0gVW50ZXJzdWNoZW4gd2lyZCB6dWZhZWxsaWcgZWluZXIgZGVyIFN0cmluZ3MgenVydWVja2dlZ2ViZW4uCisgICAgICA8ZGVzYz4gaXN0IGVpbiBNYXBwaW5nLgorICAgICAgICBEYXMgTWFwcGluZyBtdXNzIGZvbGdlbmRlbiBBdWZiYXUgaGFiZW46CisgICAgICAgICAgKFswOiAgICAgICAgIkRlZmF1bHR0ZXh0IiwKKyAgICAgICAgICAgICJyYXNzZTEiOiAicjF0ZXh0IiwgLi4uXSkuCisKKyAgICAgICAgRmFsbHMgZnVlciBkaWUgUmFzc2UgZGVzIGRhcyBEZXRhaWwgdW50ZXJzdWNoZW5kZW4gU3BpZWxlcnMgZWluCisgICAgICAgIEVpbnRyYWcgaW0gTWFwcGluZyBleGlzdGllcnQsIHdpcmQgZGVyIGVudHNwcmVjaGVuZGUgVGV4dAorICAgICAgICB6dXJ1ZWNrZ2VnZWJlbiwgYW5zb25zdGVuIGRlciBEZWZhdWx0dGV4dC4gQXVmIGRpZXNlIFdlaXNlIHNpbmQKKyAgICAgICAgcmFzc2VuYWJoYWVuZ2lnZSBEZXRhaWxzIG1vZWdsaWNoLiBTaWVoZSBhdWNoIGRpZSBCZWlzcGllbGUuCisgICAgICA8ZGVzYz4gaXN0IGVpbmUgQ2xvc3VyZS4KKyAgICAgICAgSW4gZGllc2VtIEZhbGwgd2lyZCBkaWUgQ2xvc3VyZSBhdXNnZWZ1ZWhydCB1bmQgZGFzIEVyZ2VibmlzCisgICAgICAgIHp1cnVlY2tnZWdlYmVuLiBEaWUgQ2xvc3VyZSBiZWtvbW10IGRhYmVpIGRlbiBOYW1lbiBkZXMgRGV0YWlscworICAgICAgICBhbHMgUGFyYW1ldGVyIHVlYmVyZ2ViZW4uCisKKyAgICBGdWVyIEdlcnVjaHNkZXRhaWxzIGtvZW5uZW4gRm9yc2NoZXJwdW5rdGUgZWluZ2V0cmFnZW4gd2VyZGVuLgorCisgICAgR2VydWVjaGUga29lbm5lbiBhbGxnZW1laW4gZWluZW4gUmF1bSBvZGVyIE9iamVrdCB6dWdlb3JkbmV0IHdlcmRlbjoKKyAgICBkYWZ1ZXIgbXVzcyBtYW4gYWxzIDxrZXk+IFNFTlNFX0RFRkFVTFQgdWViZXJnZWJlbi4KKyAgICAKKyAgICBTcGllbGVya29tbWFuZG9zOiAicmllY2giLCAicmllY2hlIiwgInNjaG51cHBlciIsICJzY2hudXBwZXJlIgorCitCRUlTUElFTEU6CisgICAgRWluIGtsZWluZXMgQmVpc3BpZWwgZnVlciByYXNzZW5hYmhhZW5naWdlIEdlcnVlY2hlIG1pdCBDbG9zdXJlczoKKyAgICAgIHN0cmluZyBzdHJhZmUoc3RyaW5nIGtleSk7CisgICAgICAuLi4KKyAgICAgIEFkZFNtZWxscyhTRU5TRV9ERUZBVUxULAorICAgICAgICAiRGVyIEdlcnVjaCB2b24gS25vYmxhdWNoIGlzdCB1ZWJlcndhZWx0aWdlbmQhXG4iKTsKKyAgICAgIEFkZFNtZWxscygoeyJrbm9ibGF1Y2giLCJnZXJ1Y2gifSksCisgICAgICAgICAgICAgICAgKFswOiAgICAgICAgIlB1aGgsIGRhcyBzdGlua3QhXG4iLAorICAgICAgICAgICAgICAgICAgInZhbXBpciI6ICMnc3RyYWZlXSkpOworICAgICAgLi4uCisgICAgICBzdHJpbmcgc3RyYWZlKHN0cmluZyBrZXkpIHsKKyAgICAgICAgdGhpc19wbGF5ZXIoKS0+cmVkdWNlX2hpdF9wb2ludHMoMTAwKTsKKyAgICAgICAgcmV0dXJuICJEZXIgS25vYmxhdWNoIHNjaG1lcnp0IGRpY2ggZnVyY2h0YmFyIVxuIjsKKyAgICAgIH0KKworU0lFSEUgQVVDSDoKKyAgICBTZXR6ZW46ICAgIEFkZERldGFpbCgpLCBBZGRSZWFkRGV0YWlsKCksIEFkZFNvdW5kcygpLAorICAgICAgICAgICAgICAgQWRkVG91Y2hEZXRhaWwoKQorICAgIExvZXNjaGVuOiAgUmVtb3ZlRGV0YWlsKCksIFJlbW92ZVJlYWREZXRhaWwoKSwgUmVtb3ZlU21lbGxzKCksCisgICAgICAgICAgICAgICBSZW1vdmVTb3VuZHMoKSwgUmVtb3ZlVG91Y2hEZXRhaWwoKQorICAgIERhdGVuOiAgICAgUF9ERVRBSUxTLCBQX1JFQURfREVUQUlMUywgUF9TTUVMTFMsIFBfU09VTkRTLCBQX1RPVUNIX0RFVEFJTFMKKyAgICBWZXJhbHRldDogIEFkZFNwZWNpYWxEZXRhaWwoKSwgUmVtb3ZlU3BlY2lhbERldGFpbCgpLCBQX1JFQURfTVNHCisgICAgU29uc3RpZ2VzOiBHZXREZXRhaWwoKSwgYnJlYWtfc3RyaW5nKCkKKworMjAuMDEuMjAxNSwgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9BZGRTb3VuZHMgYi9kb2MvbGZ1bi9BZGRTb3VuZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM4Mzg5YQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0FkZFNvdW5kcwpAQCAtMCwwICsxLDYzIEBACitBZGRTb3VuZHMoKQorCitGVU5LVElPTjoKKyAgICB2b2lkIEFkZFNvdW5kcyhzdHJpbmd8c3RyaW5nKiBrZXlzLCBzdHJpbmd8c3RyaW5nKnxtYXBwaW5nfGNsb3N1cmUgZGVzYyk7CisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3RkL3RoaW5nL2Rlc2NyaXB0aW9uLmMKKworQVJHVU1FTlRFOgorICAgIGtleXMKKyAgICAgIFN0cmluZyBvZGVyIEFycmF5IHZvbiBTdHJpbmdzIG1pdCBkZW4gTmFtZW4gZGVyIERldGFpbHMuCisgICAgZGVzYworICAgICAgU3RyaW5nLCBNYXBwaW5nLCBTdHJpbmctQXJyYXkgb2RlciBDbG9zdXJlIG1pdC96dXIgQmVzY2hyZWlidW5nLgorCitCRVNDSFJFSUJVTkc6CisgICAgRGllc2UgRnVua3Rpb24gZW50c3ByaWNodCBkZW0gQWRkRGV0YWlsKCkgZnVlciBTdGFuZGFyZGRldGFpbHMsIG51cgorICAgIGtvZW5uZW4gaGllcm1pdCBHZXJhZXVzY2hlIHJlYWxpc2llcnQgd2VyZGVuOgorICAgIERpZSBCZXNjaHJlaWJ1bmcgZGVyIERldGFpbHMgPGtleXM+IHdpcmQgZ2VzZXR6dC4gV2llIGRpZSBEZXRhaWxzCisgICAgYmVpIGRlciBVbnRlcnN1Y2h1bmcgYXVzc2VoZW4sIGhhZW5ndCBpbSB3ZXNlbnRsaWNoZW4gdm9tIFR5cCBkZXIKKyAgICBCZXNjaHJlaWJ1bmcgPGRlc2M+IGFiOgorICAgICAgPGRlc2M+IGlzdCBlaW4gU3RyaW5nLgorICAgICAgICBCZWltIFVudGVyc3VjaGVuIHdpcmQgZGllc2VyIFN0cmluZyB6dXJ1ZWNrZ2VnZWJlbi4KKyAgICAgIDxkZXNjPiBpc3QgZWluIFN0cmluZy1BcnJheS4KKyAgICAgICAgQmVpbSBVbnRlcnN1Y2hlbiB3aXJkIHp1ZmFlbGxpZyBlaW5lciBkZXIgU3RyaW5ncyB6dXJ1ZWNrZ2VnZWJlbi4KKyAgICAgIDxkZXNjPiBpc3QgZWluIE1hcHBpbmcuCisgICAgICAgIERhcyBNYXBwaW5nIG11c3MgZm9sZ2VuZGVuIEF1ZmJhdSBoYWJlbjoKKyAgICAgICAgICAoWzA6ICAgICAgICAiRGVmYXVsdHRleHQiLAorICAgICAgICAgICAicmFzc2UxIjogInIxdGV4dCIsIC4uLl0pLgorCisgICAgICAgIEZhbGxzIGZ1ZXIgZGllIFJhc3NlIGRlcyBkYXMgRGV0YWlsIHVudGVyc3VjaGVuZGVuIFNwaWVsZXJzIGVpbgorICAgICAgICBFaW50cmFnIGltIE1hcHBpbmcgZXhpc3RpZXJ0LCB3aXJkIGRlciBlbnRzcHJlY2hlbmRlIFRleHQKKyAgICAgICAgenVydWVja2dlZ2ViZW4sIGFuc29uc3RlbiBkZXIgRGVmYXVsdHRleHQuIEF1ZiBkaWVzZSBXZWlzZSBzaW5kCisgICAgICAgIHJhc3NlbmFiaGFlbmdpZ2UgRGV0YWlscyBtb2VnbGljaC4gU2llaGUgYXVjaCBkaWUgQmVpc3BpZWxlLgorICAgICAgPGRlc2M+IGlzdCBlaW5lIENsb3N1cmUuCisgICAgICAgIEluIGRpZXNlbSBGYWxsIHdpcmQgZGllIENsb3N1cmUgYXVzZ2VmdWVocnQgdW5kIGRhcyBFcmdlYm5pcworICAgICAgICB6dXJ1ZWNrZ2VnZWJlbi4gRGllIENsb3N1cmUgYmVrb21tdCBkYWJlaSBkZW4gTmFtZW4gZGVzIERldGFpbHMKKyAgICAgICAgYWxzIFBhcmFtZXRlciB1ZWJlcmdlYmVuLgorCisgICAgRnVlciBHZXJhZXVzY2hkZXRhaWxzIGtvZW5uZW4gRm9yc2NoZXJwdW5rdGUgZWluZ2V0cmFnZW4gd2VyZGVuLgorCisgICAgR2VyYXVlc2NoZSBrb2VubmVuIGFsbGdlbWVpbiBlaW5lbiBSYXVtIG9kZXIgT2JqZWt0IHp1Z2VvcmRuZXQgd2VyZGVuOgorICAgIGRhZnVlciBtdXNzIG1hbiBhbHMgPGtleT4gU0VOU0VfREVGQVVMVCB1ZWJlcmdlYmVuLgorCisgICAgU3BpZWxlcmtvbW1hbmRvczogImxhdXNjaGUiLCAibGF1c2NoIiwgImhvZXIiLCAiaG9lcmUiCisKK0JFSVNQSUVMRToKKyAgICBFaW4ga2xlaW5lcyBCZWlzcGllbCBmdWVyIHJhc3NlbmFiaGFlbmdpZ2UgR2VyYXVlc2NoZQorICAgICAgQWRkU291bmRzKFNFTlNFX0RFRkFVTFQsICJEaWUgWndlcmdlbm11c2lrIHVlYmVydG9lbnQgYWxsZXMhXG4iKTsKKyAgICAgIEFkZFNvdW5kcygoeyJ6d2VyZ2VubXVzaWsiLCJtdXNpayJ9KSwKKyAgICAgICAgICAgICAgICAoWzAgICAgICA6ICJTZWx0c2FtZXIgS3JhY2ghXG4iLAorICAgICAgICAgICAgICAgICAgInp3ZXJnIjogIkRhcyBrbGluZ3QgZWluZmFjaCBmYW50YXN0aXNjaCFcbiJdKSk7CisKK1NJRUhFIEFVQ0g6CisgICAgU2V0emVuOiAgICBBZGREZXRhaWwoKSwgQWRkUmVhZERldGFpbCgpLCBBZGRTbWVsbHMoKSwKKyAgICAgICAgICAgICAgIEFkZFRvdWNoRGV0YWlsKCkKKyAgICBMb2VzY2hlbjogIFJlbW92ZURldGFpbCgpLCBSZW1vdmVSZWFkRGV0YWlsKCksIFJlbW92ZVNtZWxscygpLAorICAgICAgICAgICAgICAgUmVtb3ZlU291bmRzKCksIFJlbW92ZVRvdWNoRGV0YWlsKCkKKyAgICBEYXRlbjogICAgIFBfREVUQUlMUywgUF9SRUFEX0RFVEFJTFMsIFBfU01FTExTLCBQX1NPVU5EUywgUF9UT1VDSF9ERVRBSUxTCisgICAgVmVyYWx0ZXQ6ICBBZGRTcGVjaWFsRGV0YWlsKCksIFJlbW92ZVNwZWNpYWxEZXRhaWwoKSwgUF9SRUFEX01TRworICAgIFNvbnN0aWdlczogR2V0RGV0YWlsKCksIGJyZWFrX3N0cmluZygpCisKKzIwLjAxLjIwMTUsIFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vQWRkU3BlY2lhbERldGFpbCBiL2RvYy9sZnVuL0FkZFNwZWNpYWxEZXRhaWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBjNTU0MwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0FkZFNwZWNpYWxEZXRhaWwKQEAgLTAsMCArMSw2MSBAQAorVkVSQUxURVQ6IEFkZFNwZWNpYWxEZXRhaWwoKQorCitGVU5LVElPTjoKKyAgICB2b2lkIEFkZFNwZWNpYWxEZXRhaWwoc3RyaW5nfHN0cmluZyoga2V5cywgc3RyaW5nIGZ1bmMpOworCitERUZJTklFUlQgSU46CisgICAgL3N0ZC90aGluZy9kZXNjcmlwdGlvbi5jCisKK0FSR1VNRU5URToKKyAgICBrZXlzCisgICAgICBTdHJpbmcgb2RlciBBcnJheSB2b24gU3RyaW5ncyBtaXQgZGVuIE5hbWVuIGRlciBEZXRhaWxzLgorICAgIGZ1bmMKKyAgICAgIFN0cmluZyBtaXQgZGVtIE5hbWVuIGRlciBGdW5rdGlvbiwgZGllIHp1ciBBdXN3ZXJ0dW5nIGF1ZmdlcnVmZW4KKyAgICAgIHdpcmQuCisKK0JFU0NIUkVJQlVORzoKKyAgICBFcyB3aXJkIGVpbiBEZXRhaWwgaGluenVnZWZ1ZWd0LCBkZXNzZW4gSW5oYWx0IG5pY2h0IHZvbiB2b3JuaGVyZWluCisgICAgZmVzdHN0ZWh0LCBzb25kZXJuIHZvbiBhZXVzc2VyZW4gQmVkaW5ndW5nZW4gYWJoYWVuZ3QuIFp1IGRpZXNlbQorICAgIFp3ZWNrIHdpcmQgaW1tZXIsIHdlbm4gZGllc2VzIERldGFpbCB1bnRlcnN1Y2h0IHdpcmQsIGRpZSBGdW5rdGlvbgorICAgIGZ1bmMgYXVmZ2VydWZlbiwgdW0gZGVuIGFrdHVlbGxlbiBadXN0YW5kIGRlcyBEZXRhaWxzIHp1IGJlc3RpbW1lbi4KKyAgICBEZXIgRnVua3Rpb24gd2lyZCBhbHMgUGFyYW1ldGVyIGRhcyBTY2hsdWVzc2Vsd29ydCB1ZWJlcmdlYmVuLCBtaXQKKyAgICBkZW0gZGFzIERldGFpbCB1bnRlcnN1Y2h0IHd1cmRlLgorCisgICAgVkVSQUxURVQ6IEJpdHRlIEFkZERldGFpbCBtaXQgQ2xvc3VyZSBiZW51dHplbi4KKworQkVJU1BJRUxFOgorICAgIEVpbiB6dXN0YW5kc2FiaGFlbmdpZ2VzIERldGFpbDoKKworICAgICAgaW50IGhlYmVsX2JldGFldGlndDsKKyAgICAgIHN0cmluZyBoZWJlbChzdHJpbmcga2V5KTsKKyAgICAgIC4uLgorICAgICAgLy8gQUxUOiBBZGRTcGVjaWFsRGV0YWlsKCAoeyAiaGViZWwiLCAic2NoYWx0ZXIiIH0pLCAiaGViZWwiICk7CisgICAgICBBZGREZXRhaWwoKHsgImhlYmVsIiwgInNjaGFsdGVyIiB9KSwgIydoZWJlbCApOworICAgICAgLi4uCisgICAgICBzdHJpbmcgaGViZWwoc3RyaW5nIGtleSkKKyAgICAgIHsgaWYoaGViZWxfYmV0YWV0aWd0KQorICAgICAgICAgIHJldHVybiAiRGVyICIrY2FwaXRhbGl6ZShrZXkpKyIgc3RlaHQgYXVmIEVJTi5cbiI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4gIkRlciAiK2NhcGl0YWxpemUoa2V5KSsiIHN0ZWh0IGF1ZiBBVVMuXG4iOworICAgICAgfQorCisgICAgTWFuIGVyaGFlbHQgdmVyc2NoaWVkZW5lIEVyZ2Vibmlzc2UgYmVpbSBVbnRlcnN1Y2hlbiwgamUgbmFjaGRlbQorICAgIG9iIGRhcyBGbGFnIGhlYmVsX2JldGFldGlndCBnZXNldHp0IGlzdCBvZGVyIG5pY2h0LgorCitCRU1FUktVTkc6CisgICAgSW50ZXJuIHdlcmRlbiBEZXRhaWxzIHVuZCBTcGVjaWFsRGV0YWlscyBpbSBzZWxiZW4gTWFwcGluZworICAgIHZlcndhbHRldC4KKyAgICBNYW4ga2FubiBzdGF0dCBkaWVzZXIgRnVua3Rpb24gZGVzaGFsYiBhdWNoIEFkZERldGFpbCBtaXQgQ2xvc3VyZXMKKyAgICBudXR6ZW4uCisKK1NJRUhFIEFVQ0g6CisgICAgU2V0emVuIDogICBBZGREZXRhaWwoKSwgQWRkUmVhZERldGFpbCgpLCBBZGRTbWVsbHMoKSwgQWRkU291bmRzKCksCisgICAgICAgICAgICAgICBBZGRUb3VjaERldGFpbCgpCisgICAgTG9lc2NoZW46ICBSZW1vdmVEZXRhaWwoKSwgUmVtb3ZlUmVhZERldGFpbCgpLCBSZW1vdmVTbWVsbHMoKSwKKyAgICAgICAgICAgICAgIFJlbW92ZVNvdW5kcygpLCBSZW1vdmVUb3VjaERldGFpbCgpCisgICAgRGF0ZW46ICAgICBQX0RFVEFJTFMsIFBfUkVBRF9ERVRBSUxTLCBQX1NNRUxMUywgUF9TT1VORFMsIFBfVE9VQ0hfREVUQUlMUworICAgIFZlcmFsdGV0OiAgUmVtb3ZlU3BlY2lhbERldGFpbCgpLCBQX1JFQURfTVNHCisgICAgU29uc3RpZ2VzOiBHZXREZXRhaWwoKSwgYnJlYWtfc3RyaW5nKCkKKworMjAuMDEuMjAxNSwgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9BZGRTcGVjaWFsRXhpdCBiL2RvYy9sZnVuL0FkZFNwZWNpYWxFeGl0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlN2U1YjgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9BZGRTcGVjaWFsRXhpdApAQCAtMCwwICsxLDU3IEBACitBZGRTcGVjaWFsRXhpdCgpCitGVU5LVElPTjoKKyAgICAgdm9pZCBBZGRTcGVjaWFsRXhpdChzdHJpbmd8c3RyaW5nKiBjbWQsIHN0cmluZ3xjbG9zdXJlIGZ1bmMpOworCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvcm9vbS9leGl0cworCitBUkdVTUVOVEU6CisgICAgIHN0cmluZy9zdHJpbmcqIGNtZAorICAgICAgICAgIGRpZSBSaWNodHVuZyhlbiksIGluIGRpZSBkZXIgQXVzZ2FuZyBmdWVocnQKKyAgICAgc3RyaW5nL2Nsb3N1cmUgZnVuYworICAgICAgICAgIGRlciBOYW1lIGRlciBhdWZ6dXJ1ZmVuZGVuIEZ1bmt0aW9uL0Nsb3N1cmUKKworQkVTQ0hSRUlCVU5HOgorICAgICBFcyB3aXJkIGVpbiBBdXNnYW5nIGluIGRpZSBSaWNodHVuZyhlbikgY21kIGVpbmdlZnVlZ3QuIFdpcmQgZGVyCisgICAgIEF1c2dhbmcgYmVudXR6dCwgc28gd2lyZCBkaWUgQ2xvc3VyZSBiencuIEZ1bmt0aW9uIGZ1bmMgYXVzZ2VmdWVocnQuCisKKyAgICAgQWRkU3BlY2lhbEV4aXQoY21kLCAiZnVuYyIpIGVudHNwcmljaHQ6CisgICAgIC0gQWRkRXhpdChrZXlzLCAjJ2Z1bmMpCisKK0JFTUVSS1VOR0VOOgorICAgICBJbiBmdW5jIG11c3MgbWFuIGRlbiBTcGllbGVyIHNlbGJzdCBpbiBkZW4gWmllbHJhdW0gYmV3ZWdlbi4gSW0KKyAgICAgRXJmb2xnc2ZhbGwgc29sbHRlIG1hbiBlaW5lbiBXZXJ0ID4wIHp1cnVlY2tnZWJlbiwgaW0gRmVobGVyZmFsbCBlaW5lbgorICAgICBXZXJ0IDw9MC4KKworICAgICBmdW5jIGJla29tbXQgYWxzIFBhcmFtZXRlciBlaW5lbiBTdHJpbmcgbWl0IGRlciBnZXdhZWhsdGVuCisgICAgIEJld2VndW5nc3JpY2h0dW5nIHVlYmVyZ2ViZW4uCisKK0JFSVNQSUVMRToKKyAgICAgLy8gZWluIEF1c2dhbmcgc29sbCBudXIgdm9uIEZyb2VzY2hlbiBiZW51dHpiYXIgc2VpbjoKKworICAgICBBZGRTcGVjaWFsRXhpdCgibG9jaCIsICJsb2NoZmt0Iik7CisgICAgIC8vIGRlciBnbGVpY2hlIEF1ZnJ1ZiwgbnVyIGFuZGVyczoKKyAgICAgLy8gc3RhdGljIGludCBsb2NoZmt0KHN0cmluZyBkaXIpOwkJLy8gUHJvdG90eXAKKyAgICAgLy8gLi4uCisgICAgIC8vIEFkZFNwZWNpYWxFeGl0KCJsb2NoIiwgIydsb2NoZmt0KTsKKyAgICAgLy8gYXVjaCBpZGVudGlzY2ggenU6CisgICAgIC8vIEFkZEV4aXQoImxvY2giLCAjJ2xvY2hma3QpOworCisgICAgIHN0YXRpYyBpbnQgbG9jaGZrdChzdHJpbmcgZGlyKSB7CisgICAgICAgaWYgKCEodGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKFBfRlJPRykpKSB7CisgICAgICAgICAvLyBLZWluIEZyb3NjaCA9PiBwYXNzdCBuaWNodCEKKyAgICAgICAgIG5vdGlmeV9mYWlsKCJEdSBiaXN0IHp1IGdyb3NzIVxuIik7CisgICAgICAgICByZXR1cm4gMDsKKyAgICAgICB9CisgICAgICAgLy8gTWVsZHVuZ2VuIHdlcmRlbiBpbSBtb3ZlKCkgZ2xlaWNoIG1pdGdlZ2ViZW4KKyAgICAgICByZXR1cm4gdGhpc19wbGF5ZXIoKS0+bW92ZSgiL3Jvb20vbG9jaCIsIE1fR08sIDAsCisgICAgICAgICAgICAgICAgICAgICJodWVwZnQgaW5zIExvY2giLCAiaHVlcGZ0IGhlcmVpbiIpOworICAgICB9CisKK1NJRUhFIEFVQ0g6CisgICAgIEFkZEV4aXQoKSwgR2V0RXhpdHMoKQorICAgICBSZW1vdmVFeGl0KCksIFJlbW92ZVNwZWNpYWxFeGl0KCkKKyAgICAgSF9IT09LX0VYSVRfVVNFLCBQX0VYSVRTLCBQX0hJREVfRVhJVFMsIC9zdGQvcm9vbS9leGl0cy5jCisgICAgIGF1c2dhZW5nZQorCiszMS4wMS4yMDE1LCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9BZGRTcGVjaWFsSW5mbyBiL2RvYy9sZnVuL0FkZFNwZWNpYWxJbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNTk4M2YKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9BZGRTcGVjaWFsSW5mbwpAQCAtMCwwICsxLDY0IEBACitBZGRTcGVjaWFsSW5mbygpCitGVU5LVElPTjoKKyAgICAgdmFyYXJncyB2b2lkIEFkZFNwZWNpYWxJbmZvKCBmcmFnZSwgbWVsZHVuZworCQkJICAgWywgaW5kZW50IFssIFtzaWxlbnQgWywgY2FzZWJhc2VkXSBdIF0gKTsKKworQVJHVU1FTlRFOgorICAgICBzdHJpbmcvc3RyaW5nKiBmcmFnZQorCVNjaGx1ZXNzZWx0ZXh0KGUpIGF1ZiBkaWUgSW5mb3JtYXRpb25lbiBnZWdlYmVuIHdlcmRlbiBzb2xsZW4uCisgICAgIHN0cmluZy9jbG9zdXJlIGZ1bmN0aW9uCisJTWV0aG9kZW5uYW1lIGltIE5QQy9DbG9zdXJlCisgICAgIHN0cmluZyBpbmRlbnQKKwlUZXh0LCBkZXIgc2ljaCBiZWkgbWVocnplaWxpZ2VuIE1lbGR1bmdlbiB3aWVkZXJob2xlbiBzb2xsLgorICAgICBpbnQvc3RyaW5nIHNpbGVudAorCUlzdCBzaWxlbnQgZ2VzZXR6dCwgc28gZXJmb2xndCBBbnR3b3J0IG51ciBhbiBGcmFnZW5kZW4uCisgICAgIHN0cmluZy9jbG9zdXJlIGNhc2ViYXNlZAorCUZ1bmt0aW9uc25hbWUgb2RlciBDbG9zdXJlIG1pdCBSZXR1cm53ZXJ0IHN0cmluZyBvZGVyIGludC4KKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL25wYy9pbmZvLmMKKworQkVTQ0hSRUlCVU5HOgorICAgICBXZW5uIGVpbiBTcGllbGVyIGVpbiBOUEMgbWl0dGVscyAiZnJhZ2UgPG1vbnN0ZXJuYW1lPiBuYWNoIDxmcmFnZT4iIG5hY2gKKyAgICAgZWluZXIgSW5mb3JtYXRpb24gbWl0IGRlbSBTY2hsdWVzc2VsIGZyYWdlIGZyYWd0LCBzbyB3aXJkIGRpZSBNZXRob2RlCisgICAgICJmdW5jdGlvbiIgZ2VydWZlbi4gRGllIFJ1ZWNrZ2FiZSB3aXJkIGFscyBNZWxkdW5nIGF1c2dlZ2ViZW4uCisKKyAgICAgRnVlciBkaWUgQmVzY2hyZWlidW5nIGRlciB3ZWl0ZXJlbiBQYXJhbWV0ZXIgc2llaGUgbWFuIEFkZEluZm8oTCkuCisKKyAgICAgQWRkU3BlY2lhbEluZm8oa2V5cywgImZ1bmN0aW9uIiwgLi4uKSBlbnRzcHJpY2h0OgorICAgICAtIEFkZEluZm8oa2V5cywgIydmdW5jdGlvbiwgLi4uKSAKKworQkVNRVJLVU5HRU46CisgICAgIERhIEFkZFNwZWNpYWxJbmZvKCkgdW5kIEFkZEluZm8oKSBhdWYgZGllIGdsZWljaGVuIERhdGVuIHp1Z3JlaWZlbiwKKyAgICAga2FubiBtYW4gSW5mb3JtYXRpb25lbiwgZGllIG1pdCBBZGRTcGVjaWFsSW5mbygpIGdlc2V0enQgd3VyZGVuLCBhdWNoCisgICAgIG1pdCBSZW1vdmVJbmZvKCkgZW50ZmVybmVuLiBFcyBnaWJ0IGtlaW4gUmVtb3ZlU3BlY2lhbEluZm8oKS4KKworQkVJU1BJRUxFOgorICAgICAvLyBEYXMgZm9sZ2VuZGUgQmVpc3BpZWwgaXN0IGF1Y2ggdW50ZXIgbWFuIEFkZEluZm8oTCkgenUgZmluZGVuLgorICAgICAjIyMgZHluYW1pc2NoICMjIworICAgICBBZGRTcGVjaWFsSW5mbygoeyJrZWtzIiwia2Vrc2UifSksCisJCSAgICAicXVlcnlfa2Vrc2UiLAkvLyBkZXIgTWV0aG9kZW5uYW1lCisJCSAgICAic2FndDogIik7CisgICAgIC8vIGlzdCB1ZWJyaWdlbnMgZGFzIGdsZWljaGUgd2llOgorICAgICAvLyBzdGF0aWMgc3RyaW5nIHF1ZXJ5X2tla3NlKCk7CisgICAgIC8vIC4uLgorICAgICAvLyBBZGRJbmZvKCh7Imtla3MiLCJrZWtzZSJ9KSwKKyAgICAgLy8JCSMncXVlcnlfa2Vrc2UsCQkvLyBlaW4gVmVyd2VpcyBhdWYgZGllIE1ldGhvZGUKKyAgICAgLy8JCSJzYWd0OiAiKTsKKyAgICAgLi4uCisgICAgIHN0YXRpYyBzdHJpbmcgcXVlcnlfa2Vrc2UoKSB7CisgICAgICBpZihwcmVzZW50KCJrZWtzIikpCisgICAgICAgcmV0dXJuKCJJY2ggaGFiIG5vY2ggd2VsY2hlLiBBZXRzY2ghIik7CisgICAgICByZXR1cm4oIk1lbm5vLiBLZWluZSBtZWhyIGRhISIpOworICAgICB9CisKKyAgICAgLy8gImZyYWdlIG1vbnN0ZXIgbmFjaCBrZWtzIjoKKyAgICAgLy8gLSB3ZW5uIGVzIG5vY2ggS2Vrc2UgaGF0LCBob2VyZW4gYWxsZToKKyAgICAgLy8gICAiRGFzIE1vbnN0ZXIgc2FndDogSWNoIGhhYiBub2NoIHdlbGNoZS4gQWV0c2NoIQorICAgICAvLyAtIHNvbnN0OgorICAgICAvLyAgICJEYXMgTW9uc3RlciBzYWd0OiAiTWVubm8uIEtlaW5lIG1laHIgZGEhCisKK1NJRUhFIEFVQ0g6CisgICAgIEFkZEluZm8oTCksIFJlbW92ZUluZm8oTCkKKworNy5BcHIgMjAwNCBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vQWRkU3BlbGwgYi9kb2MvbGZ1bi9BZGRTcGVsbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmM2ODY5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vQWRkU3BlbGwKQEAgLTAsMCArMSwxNDkgQEAKK0FkZFNwZWxsKCkKKworRlVOS1RJT046CisgICAgdmFyYXJncyBpbnQgQWRkU3BlbGwoaW50IHJhdGUsIGludCBkYW1hZ2UsIHN0cmluZyBUZXh0Rm9yRW5lbXksCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIFRleHRGb3JPdGhlcnMsIHN0cmluZ3xzdHJpbmcqIGRhbV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmdW5jLCBpbnR8bWFwcGluZyBzcGVsbGFyZykKKworREVGSU5JRVJUIElOOgorICAgIC9zdGQvbnBjL2NvbWJhdC5jCisKK0FSR1VNRU5URToKKyAgICByYXRlICAgICAgICAgIC0gUmVsYXRpdmUgSGFldWZpZ2tlaXQgZGVyIEFud2VuZHVuZyAoKiksCisgICAgICAgICAgICAgICAgICAgIG11c3MgPj0gMCBzZWluCisgICAgZGFtYWdlICAgICAgICAtIERlciBTY2hhZGVuc3dlcnQgZnVlciBEZWZlbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgbXVzcyA+IDAgc2VpbgorICAgIFRleHRGb3JFbmVteSAgLSBUZXh0LCBkZW4gZGVyIEZlaW5kIGVyaGFsdGVuIHNvbGwKKyAgICBUZXh0Rm9yT3RoZXJzIC0gVGV4dCwgZGVuIGFuZGVyZSBpbSBSYXVtIGVyaGFsdGVuIHNvbGxlbgorICAgIGRhbV90eXBlICAgICAgLSBTY2hhZGVuc3R5cChlbikgZnVlciBEZWZlbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgKERlZmF1bHQ6ICh7RFRfTUFHSUN9KSApCisgICAgZnVuYyAgICAgICAgICAtIEZ1bmt0aW9uc25hbWUsIGRpZSBuYWNoIEFud2VuZHVuZyBhdWZnZXJ1ZmVuIHdlcmRlbiBzb2xsCisgICAgICAgICAgICAgICAgICAgIChPcHRpb25hbCwgZ2VydWZlbiBhbiB0aGlzX29iamVjdCgpLCBiZWtvbW10IGFscyBBcmd1bWVudGUKKyAgICAgICAgICAgICAgICAgICAgIG9iamVjdCBlbmVteSwgaW50IHJlYWxfZGFtYWdlLCBzdHJpbmcqIGRhbV90eXBlKQorICAgIHNwZWxsYXJnICAgICAgLSBTcGVsbC1Bcmd1bWVudCBmdWVyIERlZmVuZCgpLCBEZWZhdWx0IGlzdCAiMSIKKworQkVTQ0hSRUlCVU5HOgorICAgIEVybW9lZ2xpY2h0IGVpbmZhY2hlIEFuZ3JpZmZzLVphdWJlcnNwcnVlY2hlIGZ1ZXIgTlBDcy4gRGFzIEF1c2Z1ZWhyZW4gdm9uCisgICAgU3BlbGxzIHZlcnVyc2FjaHQgYmVpIGRlbSBOUEMga2VpbmUgS1AtS29zdGVuLgorCisgICAgTWl0IFBfU1BFTExSQVRFIHdpcmQgZGllIGdlbmVyZWxsZSBXYWhyc2NoZWlubGljaGtlaXQgZGVyIEF1c2Z1ZWhydW5nCisgICAgc29sY2hlciBTcGVsbHMgaW0gSGVhcnRiZWF0IGFuZ2VnZWJlbiwgbWl0ICdyYXRlJyBrYW5uIG1hbiBkaWUgcmVsYXRpdmUKKyAgICBXYWhyc2NoZWlubGljaGtlaXQgZGVyIFNwZWxscyB1bnRlcmVpbmFuZGVyIHN0ZXVlcm4uCisKKyAgICAoKikgUmVsYXRpdmUgSGFldWZpZ2tlaXQgaGVpc3N0LCBkYXNzIHNpY2ggYWxsZSAncmF0ZScgZGVyIFNwZWxscworICAgIGF1ZmFkZGllcmVuIHVuZCBlaW4gZWluemVsbmVzICdyYXRlJyBkYW5uIGluIFJlbGF0aW9uIHp1ciBHZXNhbXRzdW1tZQorICAgIHN0ZWh0LiBELmguIGRyZWkgU3BlbGxzIG1pdCA4MCwgMTAsIDEwIChTdW1tZSAxMDApIGhhYmVuIGRpZSBzZWxiZW4KKyAgICBBdWZydWYtV2FocnNjaGVpbmxpY2hrZWl0ZW4gd2llIGRyZWkgU3BlbGxzIG1pdCAxMjAsIDE1LCAxNSBvZGVyIGRyZWkKKyAgICBTcGVsbHMgbWl0IDE2MCwgMjAsIDIwLgorCisgICAgRWluIFNwZWxsIHdpcmQgaW1tZXIgaW4gZm9sZ2VuZGVyIFJlaWhlbmZvbGdlIGFiZ2VhcmJlaXRldDoKKyAgICAgMS4gRGllIFRleHRlIHdlcmRlbiBhbiBkaWUgQmV0ZWlsaWd0ZW4gYXVzZ2VnZWJlbi4KKyAgICAgMi4gRXMgd2lyZCBnZ2YuIFNwZWxsRGVmZW5kIGdlcnVmZW4gKHdlbm4ga2VpbiBTUF9QSFlTSUNBTF9BVFRBQ0spLgorICAgICAgICBBYmJydWNoIGJlaSBTY2h1dHouCisgICAgIDMuIEltIE9wZmVyIHdpcmQgRGVmZW5kKCkgbWl0IGRlbiBhbmdlZ2ViZW5lbiBXZXJ0ZW4gYXVmZ2VydWZlbi4KKyAgICAgICAgQWJicnVjaCBiZWkgVG9kL1plcnN0b2VydW5nIGRlcyBPcGZlcnMuCisgICAgIDQuIEVpbmUgRnVua3Rpb24sIHNvIGRlZmluaWVydCwgd2lyZCBhdXNnZWZ1ZWhydC4KKworQkVNRVJLVU5HRU46CisgICAgVGV4dEZvck90aGVycyB3aXJkIHZvciBkZXIgQXVzZ2FiZSBkZXIgTWVsZHVuZyBkdXJjaCByZXBsYWNlX3BlcnNvbmFsKCkKKyAgICBnZXNjaGlja3QsIGQuaC4gZXMga29lbm5lbiBQbGF0emhhbHRlciB3aWUgQFdFUjEsIEBXRU1RUDEgdW5kIGFlaG5saWNoZQorICAgIHZlcndlbmRldCB3ZXJkZW4gKHNpZWhlIGF1Y2ggZGllIE1hbnBhZ2Ugdm9uIHJlcGxhY2VfcGVyc29uYWwoKSkuCisgICAgRGEgRXJzZXR6dW5nZW4gbnVyIGZ1ZXIgZGFzIEdlZ25lcm9iamVrdCBiZXJ1ZWNrc2ljaHRpZ3Qgd2VyZGVuLCBrb2VubmVuCisgICAgbnVyIFBsYXR6aGFsdGVyIG1pdCBFbmR6aWZmZXIgMSB2ZXJ3ZW5kZXQgd2VyZGVuLiBEaWUgRXJzZXR6dW5nZW4gd2VyZGVuCisgICAgc28gZ2VzdGV1ZXJ0LCBkYXNzIGRpZSBlaW5nZWZ1ZWd0ZW4gTmFtZW4gbmFjaCBTYXR6YW5mYWVuZ2VuIGF1dG9tYXRpc2NoCisgICAgZ3Jvc3MgZ2VzY2hyaWViZW4gd2VyZGVuLgorICAgIEZydWVoZXIgd3VyZGVuIHN0YXR0IHJlcGxhY2VfcGVyc29uYWwoKSBkaWUgUGxhdHpoYWx0ZXIgQFdFUiwgQFdFU1NFTiwgCisgICAgQFdFTSwgQFdFTiB2ZXJ3ZW5kZXQuIERpZXNlIGZ1bmt0aW9uaWVyZW4gd2VpdGVyaGluLCBzb2xsdGVuIGFiZXIgbmljaHQgCisgICAgbWVociBpbiBuZXVlbSBDb2RlIGJlbnV0enQgd2VyZGVuLgorCisgICAgSW4gZGVyIHZvbiBBZGRTcGVsbCBnZXJ1ZmVuZW4gTWV0aG9kZSAiZnVuYyIga29lbm5lbiBzcGV6aWVsbGVyZQorICAgIFNhY2hlbiBtaXQgZGVtIGFrdHVlbGxlbiBGZWluZCBhbmdlc3RlbGx0IHdlcmRlbiBrb2VubmVuLiBEaWUgTWV0aG9kZQorICAgIGRhcmYgYWxzIFNpY2h0YmFya2VpdHNtb2RpZmlrYXRvciBtYXhpbWFsICIiLCAicHVibGljIiBvZGVyICJzdGF0aWMiCisgICAgKG9ic29sZXQpIGhhYmVuIHVuZCBtdXNzIGltIHNlbGJlbiBPYmpla3QgZGVmaW5pZXJ0IHNlaW4uCisKKyAgICBXaWxsIG1hbiBlaW5lbiBwaHlzaXNjaGVuIEFuZ3JpZmYgYXVzbG9lc2VuLCBNVVNTIDxzcGVsbGFyZz4gZWluIE1hcHBpbmcKKyAgICBtaXQgKFtTUF9QSFlTSUNBTF9BVFRBQ0s6IDFdKSBzZWluLiBCZWkgVWViZXJnZWJlbiBlaW5lciAwIG9kZXIgV2VnbGFzc2VuCisgICAgZGVzIFdlcnRzIHdpcmQgYW4gRGVmZW5kIGRhcyBEZWZhdWx0ICcxJyAoZGEgZXMgU3BlbGxzIHNpbmQpIHVlYmVyZ2ViZW4uCisKKyAgICBXZW5uIGRhbWFnZTw9MCBvZGVyIHJhdGU8MCBvZGVyIGtlaW5lIE1lbGR1bmdlbiB1ZWJlcmdlYmVuIHdlcmRlbiwgd2lyZAorICAgIGRlciBTcGVsbCBOSUNIVCBlaW5nZXRyYWdlbiwgc29uZGVybiBkaWUgRnVua3Rpb24gYnJpY2h0IG1pdCBSdWVja2dhYmUKKyAgICB2b24gMCBhYi4KKworQkVJU1BJRUxFOgorICAgIC8vICMxIEVpbmZhY2hlciBOUEMgbWl0IGRyZWkgU3BlbGxzLCBHZXNhbXRyYXRlID0gMTAwLCBhbHNvIHNpbmQgZGllCisgICAgLy8gICAgUmF0ZW4gZGlyZWt0IGFscyBQcm96ZW50IEF1ZnJ1ZndhaHJzY2hlaW5saWNoa2VpdCBsZXNiYXIuCisgICAgQWRkU3BlbGwoODAsIDQwMCwKKyAgICAgICAgICAgICAiRGVyIEhleGVyIGdyZWlmdCBEaWNoIG1pdCBlaW5lbSBrbGVpbmVuIEZldWVyYmFsbCBhbi5cbiIsCisgICAgICAgICAgICAgIkRlciBIZXhlciBncmVpZnQgQFdFTiBtaXQgZWluZW0ga2xlaW5lbiBGZXVlcmJhbGwgYW4uXG4iLAorICAgICAgICAgICAgICh7RFRfRklSRSwgRFRfTUFHSUN9KSk7CisgICAgQWRkU3BlbGwoMTAsIDgwMCwKKyAgICAgICAgICAgICAiRGVyIEhleGVyIGdyZWlmdCBEaWNoIG1pdCBlaW5lbSByaWVzaWdlbiBGZXVlcmJhbGwgYW4uXG4iLAorICAgICAgICAgICAgICJEZXIgSGV4ZXIgZ3JlaWZ0IEBXRU4gbWl0IGVpbmVtIHJpZXNpZ2VuIEZldWVyYmFsbCBhbi5cbiIsCisgICAgICAgICAgICAgKHtEVF9GSVJFLCBEVF9NQUdJQ30pKTsKKyAgICBBZGRTcGVsbCg4LCAxMDAsCisgICAgICAgICAgICAgIkRlciBIZXhlciBwaWVrc3QgRGlyIGluIGRpZSBBdWdlbiEiLAorICAgICAgICAgICAgICJEZXIgSGV4ZXIgcGlla3N0IEBXRU0gaW4gZGllIEF1Z2VuISIsICh7RFRfUElFUkNFfSksCisgICAgICAgICAgICAgImF1Z2VuX3N0ZWNoZW4iKTsKKyAgICBBZGRTcGVsbCgyLCA1LCAoc3RyaW5nKTAsIChzdHJpbmcpMCwgKHN0cmluZyopMCwgInNhbHRvX21vcnRhbGlzIik7CisKKyAgICAoS2xlaW5lciBGZXVlcmJhbGwgbWl0IDgwJSBXYWhyc2NoZWlubGljaGtlaXQsIHJpZXNpZ2VyIG1pdCAxMCUsCisgICAgICJhdWdlbl9zdGVjaGVuIiBtaXQgOCUsICJzYWx0b19tb3J0YWxpcyIgbWl0IDIlKQorCisgICAgLy8gRGllIEZ1bmt0aW9uICJhdWdlbl9zdGVjaGVuIiBrYW5uIGRhbm4gc28gYXVzc2VoZW46CisgICAgdm9pZCBhdWdlbl9zdGVjaGVuKG9iamVjdCBlbmVteSwgaW50IGRhbWFnZSwgbWl4ZWQgZGFtX3R5cGVzICkgeworICAgICAgaWYgKGRhbWFnZT4xMCAmJiAhZW5lbXktPlF1ZXJ5UHJvcChQX0JMSU5EKSkgeworICAgICAgICBlbmVteS0+U2V0UHJvcChQX0JMSU5ELCAxKTsKKyAgICAgICAgaWYoZW5lbXktPlF1ZXJ5UHJvcChQX0JMSU5EKSkKKyAgICAgICAgICB0ZWxsX29iamVjdChlbmVteSwgIkR1IGJpc3QgbnVuIGJsaW5kIVxuIik7CisgICAgICB9CisgICAgfQorCisgICAgLy8gWnVyIEZ1bmt0aW9uICJzYWx0b19tb3J0YWxpcyIgZ2lidCBlcyBrZWluZSBNZWxkdW5nZW4sIGRlbm5vY2gKKyAgICAvLyB3aXJkIERlZmVuZCBtaXQ6IGVuZW15LT5EZWZlbmQoNSwgKHtEVF9NQUdJQ30pLCAxLCB0aGlzX29iamVjdCgpKQorICAgIC8vIGdlcnVmZW4hCisgICAgdm9pZCBzYWx0b19tb3J0YWxpcyhvYmplY3QgZW5lbXksIGludCBkYW1hZ2UsIG1peGVkIGRhbV90eXBlcyApIHsKKyAgICAgIC8vIGRlbSBnZW5laWd0ZW4gTGVzZXIgdWViZXJsYXNzZW4sIGRlbiBHZWduZXIgenUgdG9ldGVuCisgICAgfQorCisgICAgLy8gIzIgUGh5c2lzY2hlIEFuZ3JpZmZlOiBkaWUgUnVlc3R1bmdlbiBzb2xsZW4gYmVydWVja3NpY2h0aWd0IHdlcmRlbiEKKyAgICAvLyAgICBTUF9QSFlTSUNBTF9BVFRBQ0sgbXVzcyBpbiBlaW5lbSBNYXBwaW5nIGF1ZiAxIGdlc2V0enQgd2VyZGVuLAorICAgIC8vICAgIGRhbWl0IFJ1ZXN0dW5nZW4gcGh5c2lzY2ggd2lya2VuIChhbnNvbnN0ZW4gd2VyZGVuIG51ciBpaHJlCisgICAgLy8gICAgRGVmZW5kRnVuY3MoKSBhdXNnZXdlcnRldCkuIEVzIG11c3MgYXVjaCBlaW5lIHBoeXNpc2NoZSBTY2hhZGVuc2FydAorICAgIC8vICAgIGVudGhhbHRlbiBzZWluIQorICAgIC8vICAgIFNwZWxsRGVmZW5kKCkgd2lyZCBiZWkgZGllc2VtIEZsYWcgbmljaHQgbWVociBhbSBHZWduZXIgZ2VydWZlbi4KKyAgICBBZGRTcGVsbCgxMDAsIDIwMCtyYW5kb20oMjAwKSwKKyAgICAgICJEaWUga2xlaW5lIFJhdHRlIGJlaXNzdCBEaWNoIVxuIiwKKyAgICAgICJAV0VSIHdpcmQgdm9uIGVpbmVyIGtsZWluZW4gUmF0dGUgZ2ViaXNzZW4hXG4iLAorICAgICAgKHtEVF9QSUVSQ0UsIERUX1BPSVNPTn0pLCAoc3RyaW5nKTAsCisgICAgICAoW1NQX1BIWVNJQ0FMX0FUVEFDSzoxXSkpOworCisgICAgLy8gIzMgU2VsZWt0aXZlIHBoeXNpc2NoZSBBbmdyaWZmZSAoc2llaGUgYXVjaCBtYW4gRGVmZW5kX2JzcCk6CisgICAgLy8gICAgV2lsbCBtYW4gZXJyZWljaGVuLCBkYXNzIGVpbmlnZSBSdWVzdHVuZ2VuIHdpcmtlbiwgYW5kZXJlIGFiZXIKKyAgICAvLyAgICBuaWNodCBvZGVyIG51ciB0ZWlsd2Vpc2UsIGthbm4gbWFuIGRhcyB1ZWJlciBkaWUgU3BlbGxwYXJhbWV0ZXIKKyAgICAvLyAgICBhdXNmdWVocmxpY2ggc3RldWVybjoKKworICAgIC8vIGVyc3RtYWwgZnVlciBhbGxlIFJ1ZXN0dW5nc2FydGVuIGVpbmVuIFNjaHV0eiB2b24gMCUgZWluc3RlbGxlbjoKKyAgICBtYXBwaW5nIGFybW91cnMgPSBtYXBfaW5kaWNlcyhWQUxJRF9BUk1PVVJfQ0xBU1MsICMnISk7CisgICAgYXJtb3Vyc1tBVF9UUk9VU0VSU10gPSAxMjA7ICAvLyAxMjAlIFNjaHV0eiBkdXJjaCBIb3NlbgorICAgIGFybW91cnNbQVRfQk9PVF0gPSAzMDsgICAgICAgLy8gIDMwJSBTY2h1dHogZHVyY2ggU3RpZWZlbAorCisgICAgQWRkU3BlbGwoMjAsMjAwK3JhbmRvbSgyMDApLAorICAgICAgIkRpZSBrbGVpbmUgUmF0dGUgYmVpc3N0IERpciBibGl0enNjaG5lbGwgaW4gZGllIFdhZGUhXG4iLAorICAgICAgIkBXRVIgd2lyZCB2b24gZWluZXIga2xlaW5lbiBSYXR0ZSBpbiBkaWUgV2FkZSBnZWJpc3NlbiFcbiIsCisgICAgICAoe0RUX1BJRVJDRSwgRFRfUE9JU09OfSksIChzdHJpbmcpMCwKKyAgICAgIChbU1BfUEhZU0lDQUxfQVRUQUNLOjEsIFNQX05PX0FDVElWRV9ERUZFTlNFOjEsCisgICAgICAgIFNQX1JFRFVDRV9BUk1PVVI6IGFybW91cnNdKSk7CisKKyAgICAvLyBTUF9OT19BQ1RJVkVfREVGRU5TRSA9IDEgc2NoYWx0ZXQgYWt0aXZlIEFid2VociAoS2FyYXRlL0tsZXJ1cykgYWIKKyAgICAvLyBTUF9SRURVQ0VfQVJNT1VSIGVudGhhZWx0IGVpbmUgTGlzdGUgdm9uIFJ1ZXN0dW5nc3R5cGVuIG1pdCBpaHJlbgorICAgIC8vIG5ldWVuIFdpcmt1bmdzZ3JhZGVuIGluIFByb3plbnQuIE5pY2h0IGVudGhhbHRlbmUgUnVlc3R1bmdlbiBoYWJlbgorICAgIC8vIHdlaXRlcmhpbiAxMDAlIFNjaHV0endpcmt1bmcuCisKK1NJRUhFIEFVQ0g6CisgICAgIFNvbnN0aWdlczogIFNwZWxsQXR0YWNrLCBTcGVsbERlZmVuZCwgRGVmZW5kLCBRdWVyeURlZmVuZCwgU2VsZWN0RW5lbXkKKyAgICAgICAgICAgICAgICAgcmVwbGFjZV9wZXJzb25hbAorICAgICBQcm9wZXJ0aWVzOiBQX0RJU0FCTEVfQVRUQUNLLCBQX1NQRUxMUkFURSwgUF9BR0dSRVNTSVZFCisgICAgIEFid2VocjogICAgIERlZmVuZCwgRGVmZW5kX2JzcCwgU3BlbGxEZWZlbmQKKyAgICAgTWV0aG9kZW46ICAgbW9kaWZpZXJzCisKKzExLjEyLjIwMTUgQXJhdGhvcm4KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0FkZFRvTWVudSBiL2RvYy9sZnVuL0FkZFRvTWVudQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjQwN2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vQWRkVG9NZW51CkBAIC0wLDAgKzEsMjMzIEBACitBZGRUb01lbnUoKQorCitGVU5LVElPTjoKKyAgICAgICAgdmFyYXJncyBzdHJpbmcgQWRkVG9NZW51KHN0cmluZyAgbWVudWV0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZWQgICBpZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nIG1pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZWQgICByYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZWQgICBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXhlZCAgIHJlZnJlc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXhlZCAgIGRlbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZWQgICBkX21zZyk7CisKK0RFRklOSUVSVCBJTjoKKyAgICAgICAgL3N0ZC9wdWIuYworCitBUkdVTUVOVEU6CisgICAgICAgIERpZSBFcmxhZXV0ZXJ1bmcgZGVyIFBhcmFtZXRlciBiZXNjaHJhZW5rdCBzaWNoIGltIEZvbGdlbmRlbgorICAgICAgICB6dW5hZWNoc3QgYXVmIGRpZSBHcnVuZGZ1bmt0aW9uYWxpdGFldCBiZWkgVmVyd2VuZHVuZyBmZXN0ZXIKKyAgICAgICAgV2VydGUuIERpZSBNb2VnbGljaGtlaXRlbiB6dXIgUmVhbGlzaWVydW5nIGR5bmFtaXNjaGVuIFZlcmhhbHRlbnMKKyAgICAgICAgc2luZCBpbiBkZW4gRnVzc25vdGVuIHp1IGRlbiBlaW56ZWxuZW4gUGFyYW1ldGVybiBiZXNjaHJpZWJlbi4KKworICAgICAgICBtZW51ZXRleHQKKyAgICAgICAgICBEZXIgVGV4dCBzdGVodCBhbHMga3VyemUgQmVzY2hyZWlidW5nIGltIE1lbnVlLgorICAgICAgICBpZHMKKyAgICAgICAgICBTdHJpbmcgb2RlciBBcnJheSB2b24gU3RyaW5ncywgbWl0IGRlbmVuIHNpY2ggZGllIFNwZWlzZSBiencuIGRhcworICAgICAgICAgIEdldHJhZW5rIGJlaW0gQmVzdGVsbGVuIGFuc3ByZWNoZW4gbGFlc3N0LgorICAgICAgICBtaW5mbworICAgICAgICAgIE1hcHBpbmcgbWl0IEVpbnRyYWVnZW4gZnVlcjoKKyAgICAgICAgICBQX0hQICAgICAgTFAtSGVpbHVuZyBpbiBQdW5rdGVuIFsqXQorICAgICAgICAgIFBfU1AgICAgICBLUC1IZWlsdW5nIGluIFB1bmt0ZW4gWypdCisgICAgICAgICAgUF9GT09EICAgIFNhZXR0aWd1bmdzd2lya3VuZyBkZXIgU3BlaXNlIFsqXQorICAgICAgICAgIFBfRFJJTksgICBTYWV0dGlndW5nc3dpcmt1bmcgZGVzIEdldHJhZW5rcyBbKl0KKyAgICAgICAgICBQX0FMQ09IT0wgQWxrb2hvbGdlaGFsdCBkZXMgR2V0cmFlbmtzIFsqXQorICAgICAgICAgIFBfVkFMVUUgICBQcmVpcyBkZXIgU3BlaXNlIGJ6dy4gZGVzIEdldHJhZW5rcyBbKl0KKyAgICAgICAgcmF0ZSBbKl0KKyAgICAgICAgICBIZWlscmF0ZSBpbiBQdW5rdGVuIHBybyBIZWFydEJlYXQuCisgICAgICAgIG1zZyBbKipdCisgICAgICAgICAgTWVsZHVuZyBiZWltIEVzc2VuOgorICAgICAgICAgIEFycmF5IG1pdCAyIFN0cmluZ3M6ICgxKSBmdWVyIEVtcGZhZW5nZXIsICgyKSBmdWVyIEFuZGVyZS4KKyAgICAgICAgICBWZXJmdWVnYmFyZSBQbGF0emhhbHRlciBzaW5kIHdlaXRlciB1bnRlbiBpbSBBYnNjaG5pdHQgIkJlaXNwaWVsIgorICAgICAgICAgIGRva3VtZW50aWVydC4KKyAgICAgICAgcmVmcmVzaAorICAgICAgICAgIE1hcHBpbmcgbWl0IEVpbnRyYWVnZW4gZnVlcjoKKyAgICAgICAgICAgIFBSX1VTRVIgKEtvbnRpbmdlbnQgZnVlciBlaW56ZWxuZW4gU3BpZWxlcikgWypdCisgICAgICAgICAgICBQUl9BTEwgIChadXNhdHprb250aW5nZW50IGZ1ZXIgYWxsZSkgWypdCisgICAgICAgICAgQWx0ZXJuYXRpdjogMCBmdWVyIHVuYmVncmVuenRlIFZlcmZ1ZWdiYXJrZWl0CisgICAgICAgICAgRWluZW0gS2V5IG11ZXNzZW4gZGFiZWkgendlaSBXZXJ0ZSB6dWdlb3JkbmV0IHdlcmRlbjoKKyAgICAgICAgICBEZXIgRXJzdGUgZ2lidCBkaWUgSG9laGUgZGVzIEtvbnRpbmdlbnRzIGFuLCBkZXIgWndlaXRlIGxlZ3QKKyAgICAgICAgICBmZXN0LCBhbGxlIHdpZXZpZWwgcmVzZXQoKXMgZGFzIEtvbnRpbmdlbnQgd2llZGVyIGF1ZmdlZnVlbGx0CisgICAgICAgICAgd2lyZC4KKyAgICAgICAgICBWZXJ3ZW5kdW5nIGRlcyBNYXBwaW5ncyBlcmZvcmRlcnQgSW5rbHVkaWVyZW4gdm9uIHB1Yi5oLgorICAgICAgICBkZWxheSBbKl0KKyAgICAgICAgICBaYWhsIGRlciBTZWt1bmRlbiwgdW0gZGllIHZlcnpvZWdlcnQgZGllIEhlaWx1bmcgZWludHJpdHQsCisgICAgICAgICAgei5CLiB3ZWlsIGRhcyBFc3NlbiBlcnN0IHp1YmVyZWl0ZXQgd2VyZGVuIG11c3MuCisgICAgICAgIGRfbXNnIFsqKl0KKyAgICAgICAgICBNZWxkdW5nIGJlaW0gQmVzdGVsbGVuLCBmYWxscyBkaWUgSGVpbHVuZyB2ZXJ6b2VnZXJ0IHdpcmQKKyAgICAgICAgICBBcnJheSBtaXQgMiBTdHJpbmdzOiAoMSkgZnVlciBFbXBmYWVuZ2VyLCAoMikgZnVlciBBbmRlcmUuCisKKyAgICAgICAgICAKKyAgICAgICAgWypdIERpZXNlciBQYXJhbWV0ZXIga2FubiBzdGF0dCBlaW5lcyBmZXN0ZW4gWmFobGVud2VydHMgbWl0IAorICAgICAgICAgICAgZm9sZ2VuZGVuIFdlcnRlbiBnZWZ1ZWxsdCB3ZXJkZW46CisKKyAgICAgICAgICAgIDEpIE1hcHBpbmcgPHJhY2Vtb2RpZmllcj4gZGVyIEZvcm06CisgICAgICAgICAgICAgICAgICAgKFsgMCA6IDxzdGFuZGFyZHdlcnQ+ICwKKyAgICAgICAgICAgICAgICAgICAgPHJhc3NlXzE+IDogPHdlcnRfMT4sIAorICAgICAgICAgICAgICAgICAgICAuLi4gLCAKKyAgICAgICAgICAgICAgICAgICAgPHJhc3NlX24+IDogPHdlcnRfbj4gXSkuCisgICAgICAgICAgICAgICBEaWUgRWludHJhZWdlIGluIGRpZXNlbSBNYXBwaW5nIHdlcmRlbiBnZWdlbiBkaWUgUmFzc2UgZGVzCisgICAgICAgICAgICAgICBiZXN0ZWxsZW5kZW4gU3BpZWxlcnMgZ2VwcnVlZnQgdW5kIGVudHNwcmVjaGVuZCBkaWUgCisgICAgICAgICAgICAgICB6dWdlaG9lcmlnZW4gV2VydGUgdmVyd2VuZGV0LgorICAgICAgICAgICAgMikgc3RyaW5nIDxmdW5jPjogQXVmcnVmIGVyZm9sZ3QgbWl0dGVscyAKKyAgICAgICAgICAgICAgICAgY2FsbF9vdGhlcih0aGlzX29iamVjdCgpLCBmdW5jLCBlbXBmYWVuZ2VyKTsKKyAgICAgICAgICAgICAgIGdlcnVmZW4gKGFiZXI6IHNpZWhlIEhpbndlaXNlKS4KKyAgICAgICAgICAgIDMpIGNsb3N1cmUgPGZ1bmM+OiBBdWZydWYgZXJmb2xndCBtaXR0ZWxzCisgICAgICAgICAgICAgICAgIGZ1bmNhbGwoZnVuYywgZW1wZmFlbmdlcik7CisgICAgICAgICAgICA0KSBBcnJheSBkZXIgRm9ybSAgKHtzdHJpbmcgPG9iaj4sIHN0cmluZyA8ZnVuYz59KSBvZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHtvYmplY3QgPG9iaj4sIHN0cmluZyA8ZnVuYz59KQorICAgICAgICAgICAgICAgQXVmcnVmIGVyZm9sZ3QgbWl0dGVscworICAgICAgICAgICAgICAgICBjYWxsX290aGVyKG9iaiwgZnVuYywgZW1wZmFlbmdlcik7CisgICAgICAgICAgICAgICAoYWJlcjogc2llaGUgSGlud2Vpc2UpLiA8b2JqPiBpc3QgZm9sZ2xpY2ggYWxzIE9iamVrdHBvaW50ZXIgCisgICAgICAgICAgICAgICBvZGVyIGRlc3NlbiBvYmplY3RfbmFtZSgpIGFuenVnZWJlbi4gPGZ1bmM+IHdpcmQgbWl0dGVscyAKKyAgICAgICAgICAgICAgIGZ1bmN0aW9uX2V4aXN0cygpIGF1ZiBFeGlzdGVueiB1ZWJlcnBydWVmdC4KKworICAgICAgICAgICAgICAgSElOV0VJU0U6IGltIEZhbGxlIHZvbiBMaWVmZXJ2ZXJ6b2VnZXJ1bmcgKCJkZWxheSIpIHVuZAorICAgICAgICAgICAgICAgUHJlaXMgKFBfVkFMVUUpIHdpcmQgYmVpIGFsbGVuIEZ1bmt0aW9uc2F1ZnJ1ZmVuIE5JQ0hUIGRlciAKKyAgICAgICAgICAgICAgIEVtcGZhZW5nZXIsIHNvbmRlcm4gZGVyIFphaGxlciB1ZWJlcmdlYmVuLgorICAgICAgICAgICAgICAgSW0gRmFsbGUgZGVyIEtvbnRpbmdlbnQtTGlzdGUgKCJyZWZyZXNoIikga2FubiBudXIgZGllCisgICAgICAgICAgICAgICB2ZXJmdWVnYmFyZSBNZW5nZSBtb2RpZml6aWVydCB3ZXJkZW4sIG5pY2h0IGRpZSBaZWl0CisgICAgICAgICAgICAgICBiaXMgenVtIFdpZWRlci1BdWZmdWVsbGVuLgorCisgICAgICAgIFsqKl0gWnVyIEVyemV1Z3VuZyB2YXJpYWJsZXIgTWVsZHVuZ2VuIGtvZW5uZW4gZm9sZ2VuZGUgV2VydGUKKyAgICAgICAgICAgICBlaW5nZXRyYWdlbiB3ZXJkZW46CisKKyAgICAgICAgICAgICAxKSBjbG9zdXJlIDxmdW5jPjogQXVmcnVmIGVyZm9sZ3QgbWl0dGVscyAKKyAgICAgICAgICAgICAgICAgIGZ1bmNhbGwoZnVuYywgemFobGVyLCBlbXBmYWVuZ2VyLCBpZGVudCwgbWluZm8pOworICAgICAgICAgICAgIDIpIHN0cmluZyA8ZnVuYz46IEF1ZnJ1ZiBlcmZvbGd0IG1pdHRlbHMKKyAgICAgICAgICAgICAgICAgIGNhbGxfb3RoZXIodGhpc19vYmplY3QoKSwgZnVuYywgemFobGVyLCBlbXBmYWVuZ2VyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsIG1pbmZvKTsKKyAgICAgICAgICAgICA8ZnVuYz4gYmVrb21tdCBaYWhsZXIgdW5kIEVtcGZhZW5nZXIgYWxzIE9iamVrdHBvaW50ZXIsCisgICAgICAgICAgICAgaWRlbnQgYWxzIFN0cmluZyB1bmQgbWluZm8gYWxzIE1hcHBpbmcgbWl0IGRlbiAKKyAgICAgICAgICAgICBqZXdlaWxpZ2VuIEhlaWx3ZXJ0ZW4gdWViZXJnZWJlbi4gbWluZm8gZW50c3ByaWNodCBoaWVyYmVpCisgICAgICAgICAgICAgZGVuIERhdGVuLCBkaWUgYWxzIGRyaXR0ZXIgUGFyYW1ldGVyIGFuIEFkZFRvTWVudSgpCisgICAgICAgICAgICAgdWViZXJnZWJlbiB3dXJkZW4uCisgICAgICAgICAgICAgSElOV0VJUzogd2VubiBpbiBkYXMgbWluZm8tTWFwcGluZyBrZWluZSBpbnQtRmVzdHdlcnRlIAorICAgICAgICAgICAgIGVpbmdldHJhZ2VuIHd1cmRlbiwgd2VyZGVuIGRpZXNlIGdlbWFlc3MgZGVuIFJlZ2VsbiB1bnRlciBbKl0KKyAgICAgICAgICAgICBnZXBydWVmdDsgRnVua3Rpb25lbi9DbG9zdXJlcyB3ZXJkZW4gZ2dmLiBhdXNnZXdlcnRldCB1bmQgCisgICAgICAgICAgICAgZGVyZW4gUnVlY2tnYWJld2VydGUgYW4gZGllIEZ1bmt0aW9uIDxmdW5jPiB1ZWJlcmdlYmVuLgorICAgICAgICAgICAgIFdJQ0hUSUc6IERpZSBSdWVja2dhYmV3ZXJ0ZSBkZXIgRnVua3Rpb24gd2VyZGVuIG5pY2h0IAorICAgICAgICAgICAgIGF1c2dld2VydGV0LiBKZWRlciwgZGVyIGFuc3RhdHQgZWluZXIgTWVsZHVuZyBlaW5lbiAKKyAgICAgICAgICAgICBGdW5rdGlvbnNhdWZydWYgcHJvZ3JhbW1pZXJ0LCBtdXNzIGZ1ZXIgZGllIEF1c2dhYmUgZGVyCisgICAgICAgICAgICAgTWVsZHVuZ2VuIHNlbGJzdCBzb3JnZW4uCisgICAgICAgICAgICAgICAgICAgCitCRVNDSFJFSUJVTkc6CisgICAgICAgIE1pdCBkaWVzZXIgRnVua3Rpb24gd2VyZGVuIFNwZWlzZW4gb2RlciBHZXRyYWVua2UgaW4gZGllIEthcnRlCisgICAgICAgIHZvbiBLbmVpcGVuIHVuZCBSZXN0YXVyYW50cyBlaW5nZWZ1ZWd0LgorCitSVUVDS0dBQkVXRVJUOgorICAgICAgICBSdWVja2dhYmV3ZXJ0IGlzdCBlaW4gU3RyaW5nICJtZW51ZW50cnklZCIsIHdvYmVpICVkIGVpbmUgTnVtbWVyCisgICAgICAgIGlzdCwgZGllIGRhcnVlYmVyIEF1c2t1bmZ0IGdpYnQsIGRlbiB3aWV2aWVsdGVuIEVpbnRyYWcgaW4gZGllCisgICAgICAgIGludGVybmUgS2FydGUgZGVyIEtuZWlwZSBkaWVzZSBTcGVpc2UgYnp3LiBkaWVzZXMgR2V0cmFlbmsKKyAgICAgICAgZGFyc3RlbGx0LiBJbSBQcmluemlwIGhhbmRlbHQgZXMgc2ljaCBiZWkgZGVtIFN0cmluZyB1bSBlaW5lbiBLZXkKKyAgICAgICAgZnVlciBlaW4gTWFwcGluZywgaW4gZGVtIGRpZSBTcGVpc2VuIGJ6dy4gR2V0cmFlbmtlIGdlc3BlaWNoZXJ0CisgICAgICAgIHNpbmQuCisKK0JFTUVSS1VOR0VOOgorICAgICAgICBEaWUgYWVsdGVyZW4gRnVua3Rpb25lbiAnQWRkRHJpbmsnIGJ6dy4gJ0FkZEZvb2QnIHdlcmRlbiB6d2FyIG1pdGhpbGZlCisgICAgICAgIGRpZXNlciBtYWVjaHRpZ2VyZW4gRnVua3Rpb24gYXVzIEdydWVuZGVuIGRlciBBYndhZXJ0c2tvbXBhdGliaWxpdGFldAorICAgICAgICBzaW11bGllcnQsIHNvbGxlbiBhYmVyIG5pY2h0IG1laHIgZWluZ2VzZXR6dCB3ZXJkZW4uCisgICAgICAgIAorICAgICAgICBGdWVyIGRhcyBUZXN0ZW4gZGVyIEtuZWlwZSBnaWJ0IGVzIGluIGplZGVyIEtuZWlwZSBkZW4gQmVmZWhsCisgICAgICAgICdwdWJpbml0Jy4gSGllcm1pdCBsYXNzZW4gc2ljaCBkaWUgU3BlaXNlbiB1bmQgR2V0cmFlbmtlIGR1cmNoLQorICAgICAgICBjaGVja2VuLiBTdGVodCBpbiBkZXIgQXVzZ2FiZSBiZWkgZWluZW0gR2V0cmFlbmsvRXNzZW4gZWluIEZBSUwsCisgICAgICAgIHNvIHdpcmQgZGllIGVudHNwcmVjaGVuZGUgU3BlaXNlIChvZGVyIEdldHJhZW5rKSBOSUNIVCBhbiBTcGllbGVyCisgICAgICAgIHZlcmthdWZ0LiBBdXNuYWhtZW4gZnVlciBTcGVpc2VuL0dldHJhZW5rZSBtaXQgaG9laGVyZW4gbWF4aW1hbGVuCisgICAgICAgIFdlcnRlbiBzaW5kIGR1cmNoIEJhbGFuY2UtRU0genUgZ2VuZWhtaWdlbi4KKworQkVJU1BJRUw6CisKKyAgICAgICAgaW5jbHVkZSA8cHViLmg+CisKKyAgICAgICAgY3JlYXRlKCkKKyAgICAgICAgeworICAgICAgICBBZGRUb01lbnUoIidPcGEncyBEcmFjaGVua2V1bGUnIiwoeyJkcmFjaGVua2V1bGUiLCJrZXVsZSJ9KSwKKyAgICAgICAgKFtQX0hQOjYzLFBfU1A6NjMsUF9GT09EOjksUF9WQUxVRTo1MjhdKSwgNSwKKyAgICAgICAgKHsiRHUgaXNzdCBkaWUgS2V1bGUgbWl0IGVpbmVtIHNjaGxlY2h0ZW4gR2V3aXNzZW4uIiwKKyAgICAgICAgICAiJiYgaXNzdCBkaWUgS2V1bGUgbWl0IGVpbmVtIHNjaGxlY2h0ZW4gR2V3aXNzZW4uIn0pLAorICAgICAgICAoWyBQUl9VU0VSIDogNDsgMSAsIFBSX0FMTCA6IDIwOyAzIF0pLCA5LAorICAgICAgICAoeyJEZXIgdW5zaWNodGJhcmUgS25laXBpZXIgc2NobmVpZGV0IGVpbmVtIFJlbnRuZXIgZWluIGdyb3NzZXMgIgorICAgICAgICAgICJTdHVlY2sgYXVzIGRlc3NlbiBLZXVsZSB1bmQgYmVyZWl0ZXQgc2llIERpciB6dS4gS29taXNjaCwgbXVzcyAiCisgICAgICAgICAgIndvaGwgZWluIFRpcHBmZWhsZXIgYXVmIGRlciBLYXJ0ZSBnZXdlc2VuIHNlaW4uIiwKKyAgICAgICAgICAiRGVyIHVuc2ljaHRiYXJlIEtuZWlwaWVyIHNjaG5laWRldCBlaW5lbSBoaWxmbG9zZW4gT3BhIGVpbiAiCisgICAgICAgICAgIlN0dWVjayBhdXMgZGVzc2VuIEtldWxlIHVuZCBicmFldCBkaWVzZSBmdWVyICYmLiJ9KSApOworICAgICAgICB9CisKKyAgICAgICAgMSkgTmFtZSBkZXIgU3BlaXNlIChkZXMgR2V0cmFlbmtzKSBhdWYgZGVyIEthcnRlIChiZWkgbWVudWUpLgorCisgICAgICAgICAgIEFkZFRvTWVudSgiJ09wYSdzIERyYWNoZW5rZXVsZSciLCAgICAgCisKKyAgICAgICAgMikgaWRzIG1pdCBkZW5lbiBzaWNoIGJlc3RlbGxlbiBsYWVzc3QgKHouQi4gImthdWZlIGtldWxlIikuCisKKyAgICAgICAgICAgKHsiZHJhY2hlbiIsImRyYWNoZW5rZXVsZSIsImtldWxlIn0pLAorCisgICAgICAgIDMpIEhlaWx1bmcgZnVlciBMUCB1bmQgS1AsIFNhZXR0aWd1bmcgKFBfRk9PRCBvZGVyIFBfRFJJTkssCisgICAgICAgICAgIFBfQUxDT0hPTCBuYWNoIEJlbGllYmVuIHNldHplbiksIFByZWlzIChQX1ZBTFVFKS4gCisgICAgICAgICAgIEhQIHVuZCBTUCBtdWVzc2VuIG5pY2h0IGdsZWljaCBzZWluLiBTcGVpc2VuIHVuZCBHZXRyYWVua2UsCisgICAgICAgICAgIGRpZSBudXIgZWluZXMgdm9uIGJlaWRlbiBoZWlsZW4sIHNpbmQgYXVjaCBtb2VnbGljaC4KKworICAgICAgICAgICAoW1BfSFA6NjMsUF9TUDo2MyxQX0ZPT0Q6OSxQX1ZBTFVFOjUyOF0pLAorCisgICAgICAgIDQpIEhlaWx1bmcgcHJvIEhlYXJ0YmVhdCAoaW4gZGllc2VtIEJlaXNwaWVsIGplIDUgS1AvTFApLgorICAgIAorICAgICAgICAgICA1LAorCisgICAgICAgIDUpIE1lbGR1bmdlbiBmdWVyIFNwaWVsZXIgdW5kIFVtc3RlaGVuZGUgZGllIGJlaSBHZW51c3MgYXVzZ2VnZS0KKyAgICAgICAgICAgYmVuIHdlcmRlbiAoYWxzbyBOSUNIVCBkZXIgQmVzdGVsbC1UZXh0KS4KKworICAgICAgICAgICAoeyJEdSBpc3N0IGRpZSBLZXVsZSBtaXQgZWluZW0gc2NobGVjaHRlbiBHZXdpc3Nlbi4iLAorICAgICAgICAgICAgICImJiBpc3N0IGRpZSBLZXVsZSBtaXQgZWluZW0gc2NobGVjaHRlbiBHZXdpc3Nlbi4ifSksCisKKyAgICAgICAgICAgVmVyZnVlZ2JhcmUgUGxhdHpoYWx0ZXIgc2luZCAocGwgPSB0aGlzX3BsYXllcigpKToKKworICAgICAgICAgICAmJiAgLSBwbC0+bmFtZShXRVIsMikKKyAgICAgICAgICAgJjEmIC0gcGwtPm5hbWUoV0VSLDIpCisgICAgICAgICAgICYyJiAtIHBsLT5uYW1lKFdFU1NFTiwyKQorICAgICAgICAgICAmMyYgLSBwbC0+bmFtZShXRU0sMikKKyAgICAgICAgICAgJjQmIC0gcGwtPm5hbWUoV0VOLDIpCisgICAgICAgICAgICYxIyAtIGNhcGl0YWxpemUocGwtPm5hbWUoV0VSLDIpKQorICAgICAgICAgICAmMiMgLSBjYXBpdGFsaXplKHBsLT5uYW1lKFdFU1NFTiwyKSkKKyAgICAgICAgICAgJjMjIC0gY2FwaXRhbGl6ZShwbC0+bmFtZShXRU0sMikpCisgICAgICAgICAgICY0IyAtIGNhcGl0YWxpemUocGwtPm5hbWUoV0VOLDIpKQorICAgICAgICAgICAmISAgLSBwbC0+UXVlcnlQcm9ub3VuKFdFUikKKyAgICAgICAgICAgJjUmIC0gcGwtPlF1ZXJ5UHJvbm91bihXRSk7CisgICAgICAgICAgICY2JiAtIHBsLT5RdWVyeVByb25vdW4oV0VTU0VOKQorICAgICAgICAgICAmNyYgLSBwbC0+UXVlcnlQcm9ub3VuKFdFTSkKKyAgICAgICAgICAgJjgmIC0gcGwtPlF1ZXJ5UHJvbm91bihXRU4pCisgICAgICAgICAgICY1IyAtIGNhcGl0YWxpemUocGwtPlF1ZXJ5UHJvbm91bihXRVIpKQorICAgICAgICAgICAmNiMgLSBjYXBpdGFsaXplKHBsLT5RdWVyeVByb25vdW4oV0VTU0VOKSkKKyAgICAgICAgICAgJjcjIC0gY2FwaXRhbGl6ZShwbC0+UXVlcnlQcm9ub3VuKFdFTSkpCisgICAgICAgICAgICY4IyAtIGNhcGl0YWxpemUocGwtPlF1ZXJ5UHJvbm91bihXRU4pKQorICAgICAgICAgIAorICAgICAgICA2KSBEaWUgU3BlaXNlIGlzdCBpbiBpaHJlciBBbnphaGwgYmVncmVuenQuIEZ1ZXIgamVkZW4gU3BpZWxlcgorICAgICAgICAgICBzaW5kIDQgS2V1bGVuIHBybyByZXNldCgpIGRhLiBBdXNzZXJkZW0gZ2lidCBlcyBub2NoIGVpbmVuCisgICAgICAgICAgICJOb3R2b3JyYXQiIHZvbiAyMCBLZXVsZW4sIGRlciBhbGxlIDMgcmVzZXQoKXMgYXVmZ2VmdWVsbHQKKyAgICAgICAgICAgd2lyZC4gQXVzIGRpZXNlbSAoc28gbm9jaCB2b3JoYW5kZW4pIHdlcmRlbiBkaWUgU3BpZWxlcgorICAgICAgICAgICB2ZXJzb3JndCwgd2VubiBpaHIgInBlcnNvZW5saWNoZXIgVm9ycmF0IiBhdWZnZWJyYXVjaHQgaXN0LgorCisgICAgICAgICAgIChbIFBSX1VTRVIgOiA0OyAxICwgUFJfQUxMIDogMjA7IDMgXSksCisgICAgICAgICAgIAorICAgICAgICAgICBISU5XRUlTOiBiZWkgQmVudXR6dW5nIGRlcyBNYXBwaW5ncyBtdXNzIDxwdWIuaD4gaW5rbHVkaWVydCAKKyAgICAgICAgICAgd2VyZGVuIQorICAgICAgICAgICAKKyAgICAgICAgICAgV2VubiBtYW4ga2VpbmUgcmVzZXQtYWJoYWVuZ2lnZW4gU3BlaXNlbiBoYWJlbiBtb2VjaHRlLCB0cmFlZ3QKKyAgICAgICAgICAgbWFuIGhpZXIgZWluZSAwIGVpbi4KKworICAgICAgICA3KSBEaWUgWmFobCBpc3QgZGllIFdhcnRlemVpdCBpbiBTZWt1bmRlbiwgZGllIGRlciBXaXJ0IHouQi4gZnVlcgorICAgICAgICAgICBkaWUgWnViZXJlaXR1bmcgdW5kIEF1c2xpZWZlcnVuZyBhbiBkZW4gU3BpZWxlciBicmF1Y2h0LgorCisgICAgICAgICAgIDksCisgICAgICAgICAKKyAgICAgICAgOCkgTGV0enRlbmRsaWNoIGRpZSBNZWxkdW5nZW4gYW4gU3BpZWxlciB1bmQgVW1zdGVoZW5kZSwgZGllIGJlaSBCZS0KKyAgICAgICAgICAgc3RlbGx1bmcgKGhpZXIgJ2thdWZlIGtldWxlJykgYXVzZ2VnZWJlbiB3ZXJkZW4uCisKKyAgICAgICAgICAgKHsiRGVyIHVuc2ljaHRiYXJlIEtuZWlwaWVyIHNjaG5laWRldCBlaW5lbSBSZW50bmVyIGVpbiBncm9zc2VzICIKKyAgICAgICAgICAgIlN0dWVjayBhdXMgZGVzc2VuIEtldWxlIHVuZCBiZXJlaXRldCBzaWUgRGlyIHp1LiBLb21pc2NoLCBtdXNzICIKKyAgICAgICAgICAgIndvaGwgZWluIFRpcHBmZWhsZXIgYXVmIGRlciBLYXJ0ZSBnZXdlc2VuIHNlaW4uIiwKKyAgICAgICAgICAgIkRlciB1bnNpY2h0YmFyZSBLbmVpcGllciBzY2huZWlkZXQgZWluZW0gaGlsZmxvc2VuIE9wYSBlaW4gIgorICAgICAgICAgICAiU3R1ZWNrIGF1cyBkZXNzZW4gS2V1bGUgdW5kIGJyYWV0IGRpZXNlIGZ1ZXIgJiYuIn0pKTsKKworU0lFSEUgQVVDSDoKKyAgICAgICAgQWRkRm9vZCgpLCBBZGREcmluaygpLCAvc3lzL3B1Yi5oCisgICAgICAgIFJlbW92ZUZyb21NZW51KCkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFNhbSwgMDEuIE9rdCAyMDExLCAyMzo0MCBieSBBcmF0aG9ybgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vQWRkVG91Y2hEZXRhaWwgYi9kb2MvbGZ1bi9BZGRUb3VjaERldGFpbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTNlM2NhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vQWRkVG91Y2hEZXRhaWwKQEAgLTAsMCArMSw3MSBAQAorQWRkVG91Y2hEZXRhaWwoKQorCitGVU5LVElPTjoKKyAgICB2b2lkIEFkZFRvdWNoRGV0YWlsKHN0cmluZ3xzdHJpbmcqIGtleXMsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmd8c3RyaW5nKnxtYXBwaW5nfGNsb3N1cmUgZGVzYyk7CisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3RkL3RoaW5nL2Rlc2NyaXB0aW9uLmMKKworQVJHVU1FTlRFOgorICAgIGtleXMKKyAgICAgU3RyaW5nIG9kZXIgQXJyYXkgdm9uIFN0cmluZ3MgbWl0IGRlbiBOYW1lbiBkZXIgRGV0YWlscy4KKyAgICBkZXNjCisgICAgIFN0cmluZywgTWFwcGluZywgU3RyaW5nLUFycmF5IG9kZXIgQ2xvc3VyZSBtaXQvenVyIEJlc2NocmVpYnVuZy4KKworQkVTQ0hSRUlCVU5HOgorICAgIERpZXNlIEZ1bmt0aW9uIGVudHNwcmljaHQgZGVtIEFkZERldGFpbCgpIGZ1ZXIgU3RhbmRhcmRkZXRhaWxzLCBudXIKKyAgICBrb2VubmVuIGhpZXJtaXQgKGFiKXRhc3RiYXJlIGJ6dy4gZnVlaGxiYXJlIERldGFpbHMgcmVhbGlzaWVydCB3ZXJkZW46CisgICAgRGllIEJlc2NocmVpYnVuZyBkZXIgRGV0YWlscyA8a2V5cz4gd2lyZCBnZXNldHp0LiBXaWUgZGllIERldGFpbHMKKyAgICBiZWltIChBYilUYXN0ZW4gYXVzc2VoZW4sIGhhZW5ndCBpbSB3ZXNlbnRsaWNoZW4gdm9tIFR5cCBkZXIKKyAgICBCZXNjaHJlaWJ1bmcgPGRlc2M+IGFiOgorICAgICA8ZGVzYz4gaXN0IGVpbiBTdHJpbmcuCisgICAgICAgQmVpbSBVbnRlcnN1Y2hlbiB3aXJkIGRpZXNlciBTdHJpbmcgenVydWVja2dlZ2ViZW4uCisgICAgICA8ZGVzYz4gaXN0IGVpbiBTdHJpbmctQXJyYXkuCisgICAgICAgIEJlaW0gVW50ZXJzdWNoZW4gd2lyZCB6dWZhZWxsaWcgZWluZXIgZGVyIFN0cmluZ3MgenVydWVja2dlZ2ViZW4uCisgICAgIDxkZXNjPiBpc3QgZWluIE1hcHBpbmcuCisgICAgICAgRGFzIE1hcHBpbmcgbXVzcyBmb2xnZW5kZW4gQXVmYmF1IGhhYmVuOgorICAgICAgICAgKFswOiAgICAgICAgIkRlZmF1bHR0ZXh0IiwKKyAgICAgICAgICAgInJhc3NlMSI6ICJyMXRleHQiLCAuLi5dKS4KKworICAgICAgIEZhbGxzIGZ1ZXIgZGllIFJhc3NlIGRlcyBkYXMgRGV0YWlsIHVudGVyc3VjaGVuZGVuIFNwaWVsZXJzIGVpbgorICAgICAgIEVpbnRyYWcgaW0gTWFwcGluZyBleGlzdGllcnQsIHdpcmQgZGVyIGVudHNwcmVjaGVuZGUgVGV4dAorICAgICAgIHp1cnVlY2tnZWdlYmVuLCBhbnNvbnN0ZW4gZGVyIERlZmF1bHR0ZXh0LiBBdWYgZGllc2UgV2Vpc2Ugc2luZAorICAgICAgIHJhc3NlbmFiaGFlbmdpZ2UgRGV0YWlscyBtb2VnbGljaC4gU2llaGUgYXVjaCBkaWUgQmVpc3BpZWxlLgorICAgICA8ZGVzYz4gaXN0IGVpbmUgQ2xvc3VyZS4KKyAgICAgICBJbiBkaWVzZW0gRmFsbCB3aXJkIGRpZSBDbG9zdXJlIGF1c2dlZnVlaHJ0IHVuZCBkYXMgRXJnZWJuaXMKKyAgICAgICB6dXJ1ZWNrZ2VnZWJlbi4gRGllIENsb3N1cmUgYmVrb21tdCBkYWJlaSBkZW4gTmFtZW4gZGVzIERldGFpbHMKKyAgICAgICBhbHMgUGFyYW1ldGVyIHVlYmVyZ2ViZW4uCisKKyAgICBGdWVyIGZ1ZWhsYmFyZSBEZXRhaWxzIGtvZW5uZW4gRm9yc2NoZXJwdW5rdGUgZWluZ2V0cmFnZW4gd2VyZGVuLgorCisgICAgRnVlaGxiYXJlIERldGFpbHMga29lbm5lbiBhbGxnZW1laW4gZWluZW4gUmF1bSBvZGVyIE9iamVrdCB6dWdlb3JkbmV0CisgICAgd2VyZGVuOiBkYWZ1ZXIgbXVzcyBtYW4gYWxzIDxrZXk+IFNFTlNFX0RFRkFVTFQgdWViZXJnZWJlbi4KKworICAgIFNwaWVsZXJrb21tYW5kb3M6ICJ0YXN0ZSIKKworQkVJU1BJRUxFOgorICAgIEVpbiBrbGVpbmVzIEJlaXNwaWVsIGZ1ZXIgcmFzc2VuYWJoYWVuZ2lnZSwgZnVlaGxiYXJlIERldGFpbHMgbWl0IENsb3N1cmVzOgorICAgICAgc3RyaW5nIHN0cmFmZShzdHJpbmcga2V5KTsKKyAgICAgIC4uLgorICAgICAgQWRkVG91Y2hEZXRhaWwoU0VOU0VfREVGQVVMVCwgIkR1IGZ1ZWhsc3QgZWluaWdlIEtub2xsZW5cbiIpOworICAgICAgQWRkVG91Y2hEZXRhaWwoKHsia25vbGxlbiJ9KSwKKyAgICAgICAgICAgICAgICAgICAgIChbMDogICAgICAgIlNpZSBmdWVobGVuIHNpY2ggYW4gd2llIEtub2JsYXVjaGtub2xsZW4uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJpZWNoIGRvY2ggbWFsIGRhcmFuLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgInZhbXBpciI6ICMnc3RyYWZlXSkpOworCisgICAgICBzdHJpbmcgc3RyYWZlKHN0cmluZyBrZXkpIHsKKyAgICAgICAgdGhpc19wbGF5ZXIoKS0+cmVkdWNlX2hpdF9wb2ludHMoMTAwKTsKKyAgICAgICAgcmV0dXJuICJBdSEgRGFzIHdhcmVuIGphIEtub2JsYXVjaGtub2xsZW4hXG4iOworICAgICAgfQorCitTSUVIRSBBVUNIOgorICAgIFNldHplbjogICAgQWRkRGV0YWlsKCksIEFkZFJlYWREZXRhaWwoKSwgQWRkU21lbGxzKCksIEFkZFNvdW5kcygpCisgICAgTG9lc2NoZW46ICBSZW1vdmVEZXRhaWwoKSwgUmVtb3ZlUmVhZERldGFpbCgpLCBSZW1vdmVTbWVsbHMoKSwKKyAgICAgICAgICAgICAgIFJlbW92ZVNvdW5kcygpLCBSZW1vdmVUb3VjaERldGFpbCgpCisgICAgRGF0ZW46ICAgICBQX0RFVEFJTFMsIFBfUkVBRF9ERVRBSUxTLCBQX1NNRUxMUywgUF9TT1VORFMsIFBfVE9VQ0hfREVUQUlMUworICAgIFZlcmFsdGV0OiAgQWRkU3BlY2lhbERldGFpbCgpLCBSZW1vdmVTcGVjaWFsRGV0YWlsKCksIFBfUkVBRF9NU0cKKyAgICBTb25zdGlnZXM6IEdldERldGFpbCgpLCBicmVha19zdHJpbmcoKQorCisyMC4wMS4yMDE1LCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0FsbEdyb3VwcyBiL2RvYy9sZnVuL0FsbEdyb3VwcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmZiYmNhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vQWxsR3JvdXBzCkBAIC0wLDAgKzEsMjEgQEAKK0FsbEdyb3VwcygpCitGVU5LVElPTjoKKyAgICAgc3RyaW5nICpBbGxHcm91cHMoKQorCitERUZJTklFUlQgSU46CisgICAgIC9wL2RhZW1vbi9tYXRlcmlhbGRiLmMgKE1BVEVSSUFMREIpCisKK0JFU0NIUkVJQlVORzoKKyAgICAgR2lidCBlaW4gQXJyYXkgYWxsZXIgZXhpc3RlbnRlbiBNYXRlcmlhbGdydXBwZW4genVydWVjayAoaWhyZQorICAgICBEZWZpbml0aW9uc2Zvcm0gd2llIGluIDx0aGluZy9tYXRlcmlhbC5oPiBhdWZnZWxpc3RldCkuCisKK1NJRUhFIEFVQ0g6CisgICAgIEtvbnplcHRlOgkgIG1hdGVyaWFsLCBtYXRlcmlhbGVya2VubnVuZworICAgICBHcnVuZGxlZ2VuZDogUF9NQVRFUklBTCwgL3N5cy90aGluZy9tYXRlcmlhbC5oCisgICAgIExpc3RlbjoJICBBbGxNYXRlcmlhbHMoKSwgRHVtcCgpCisJCSAgbWF0ZXJpYWxsaXN0ZSwgbWF0ZXJpYWxncnVwcGVuCisgICAgIE1hc3RlcjoJICBBZGRNYXRlcmlhbCgpLCBDb252TWF0ZXJpYWxMaXN0KCksIE1hdGVyaWFsR3JvdXAoKSwKKwkJICBHcm91cE5hbWUoKSwgTWF0ZXJpYWxOYW1lKCksCisJCSAgR2V0R3JvdXBNZW1iZXJzKCksIEdldE1hdE1lbWJlcnNoaXAoKQorCis3LiBNYWkgMjAwNCBHbG9pbnNvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0FsbE1hdGVyaWFscyBiL2RvYy9sZnVuL0FsbE1hdGVyaWFscwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjMwZTliCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vQWxsTWF0ZXJpYWxzCkBAIC0wLDAgKzEsMjEgQEAKK0FsbE1hdGVyaWFscygpCitGVU5LVElPTjoKKyAgICAgc3RyaW5nICpBbGxNYXRlcmlhbHMoKQorCitERUZJTklFUlQgSU46CisgICAgIC9wL2RhZW1vbi9tYXRlcmlhbGRiLmMgKE1BVEVSSUFMREIpCisKK0JFU0NIUkVJQlVORzoKKyAgICAgR2lidCBlaW4gQXJyYXkgYWxsZXIgZXhpc3RlbnRlbiBNYXRlcmlhbGllbiB6dXJ1ZWNrIChpaHJlIERlZmluaXRpb25zLQorICAgICBmb3JtIHdpZSBpbiA8dGhpbmcvbWF0ZXJpYWwuaD4gYXVmZ2VsaXN0ZXQpLgorCitTSUVIRSBBVUNIOgorICAgICBLb256ZXB0ZToJICBtYXRlcmlhbCwgbWF0ZXJpYWxlcmtlbm51bmcKKyAgICAgR3J1bmRsZWdlbmQ6IFBfTUFURVJJQUwsIC9zeXMvdGhpbmcvbWF0ZXJpYWwuaAorICAgICBMaXN0ZW46CSAgQWxsR3JvdXBzKCksIER1bXAoKQorCQkgIG1hdGVyaWFsbGlzdGUsIG1hdGVyaWFsZ3J1cHBlbgorICAgICBNYXN0ZXI6CSAgQWRkTWF0ZXJpYWwoKSwgQ29udk1hdGVyaWFsTGlzdCgpLCBNYXRlcmlhbEdyb3VwKCksCisJCSAgR3JvdXBOYW1lKCksIE1hdGVyaWFsTmFtZSgpLAorCQkgIEdldEdyb3VwTWVtYmVycygpLCBHZXRNYXRNZW1iZXJzaGlwKCkKKworNy4gTWFpIDIwMDQgR2xvaW5zb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9Bc3NvY01lbWJlciBiL2RvYy9sZnVuL0Fzc29jTWVtYmVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0OTE1N2IKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9Bc3NvY01lbWJlcgpAQCAtMCwwICsxLDUyIEBACisKK0Fzc29jTWVtYmVyKCkKKworCitGVU5LVElPTjoKKyAgICAgICAgaW50IEFzc29jTWVtYmVyKG9iamVjdCBucGMpCisKK0RFRklOSUVSVCBJTjoKKyAgICAgICAgL3N0ZC9saXZpbmcvdGVhbS5jCisKK0FSR1VNRU5URToKKyAgICAgICAgRGVyIHp1enVvcmRuZW5kZSBOUEMuCisKK0JFU0NIUkVJQlVORzoKKyAgICAgICAgT3JkbmV0IGVpbmVuIE5QQyBlaW5lbSBTcGllbGVyIHp1LiBEaWVzZXIgaXN0IGRhbm4KKyAgICAgICAgaW1tZXIgaW0gVGVhbSBkZXMgU3BpZWxlcnMsIG1vZWdsaWNoc3QgaW4gZGVyIGdsZWljaGVuIFJlaWhlLgorCitSVUVDS0dBQkVXRVJUOgorICAgICAgICAxLCBmYWxscyBadW9yZG51bmcgZXJmb2xncmVpY2gsIHNvbnN0IDAuCisKK0JFSVNQSUVMOgorICAgICAgICB2b2lkIGZ1bihvYmplY3QgcGwpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIHBsICYmIHBsLT5Bc3NvY01lbWJlcih0aGlzX29iamVjdCgpKSApCisgICAgICAgICAgICB0ZWxsX29iamVjdChwbCxicmVha19zdHJpbmcoCisgICAgICAgICAgICAgICJJY2gga2FlbXBmZSBudW4gYXVmIERlaW5lciBTZWl0ZSFcbiIsNzgsIkVpbiBGZXVlcnRldWZlbCAiCisgICAgICAgICAgICAgICJ0ZWlsdCBEaXIgbWl0OiIpOworICAgICAgICAgLi4uCisgICAgICAgIH0KKworQkVNRVJLVU5HRU46CisgICAgICAgIDEuIEthbm4gbnVyIHZvbiBHaWxkZW4sIFNwZWxsYm9va3MsIHZvbSBPYmpla3Qgc2VsYmVyIHVuZCB2b20KKyAgICAgICAgICAgenV6dW9yZG5lbmRlbiBOUEMgYXVmZ2VydWZlbiB3ZXJkZW4uCisgICAgICAgIDIuIEVpbmVtIE5QQywgZGVyIHNlbGJlciBlaW5lbSBTcGllbGVyIHp1Z2VvcmRuZXQgaXN0LCBrYW5uIGtlaW4KKyAgICAgICAgICAgTlBDIHp1Z2VvcmRuZXQgd2VyZGVuLgorCitTSUVIRSBBVUNIOgorICAgICAgICBVZWJlcnNpY2h0OiB0ZWFta2FtcGYKKyAgICAgICAgUHJvcGVydGllczogUF9URUFNLCBQX1RFQU1fQVNTT0NfTUVNQkVSUywgUF9URUFNX0FUVEFDS19DTUQsCisgICAgICAgICAgICAgICAgICAgIFBfVEVBTV9BVVRPRk9MTE9XLCBQX1RFQU1fQ09MT1JTLCBQX1RFQU1fTEVBREVSLAorICAgICAgICAgICAgICAgICAgICBQX1RFQU1fTkVXTUVNQkVSLCBQX1RFQU1fV0FOVEVEX1JPVywgUF9URUFNX1dJTVBZX1JPVworICAgICAgICBCZXdlZ3VuZzogICBJc1RlYW1Nb3ZlLCBUZWFtRmxlZQorICAgICAgICBNaXRnbGllZGVyOiBJc1RlYW1MZWFkZXIsIFRlYW1NZW1iZXJzCisgICAgICAgIEthbXBmOiAgICAgIERlQXNzb2NNZW1iZXIsIEluc2VydEVuZW15VGVhbSwgU2VsZWN0TmVhckVuZW15LAorICAgICAgICAgICAgICAgICAgICBTZWxlY3RGYXJFbmVteQorICAgICAgICBQb3NpdGlvbmVuOiBQcmVzZW50UG9zaXRpb24sIFByZXNlbnRSb3dzLCBQcmVzZW50RW5lbXlSb3dzLAorICAgICAgICAgICAgICAgICAgICBQcmVzZW50VGVhbVBvc2l0aW9uLCBTd2FwUm93cworICAgICAgICBTb25zdGlnZXM6ICBUZWFtUHJlZml4LCB0ZWFta2FtcGZfaW50ZXJuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IDA0LjEwLjIwMTEsIFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vQXR0YWNrIGIvZG9jL2xmdW4vQXR0YWNrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NTZhZTkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9BdHRhY2sKQEAgLTAsMCArMSwyMiBAQAorQXR0YWNrKCkKKworRlVOS1RJT046CisJdm9pZCBBdHRhY2sob2JqZWN0IGVuZW15KQorCitBUkdVTUVOVEU6CisJZW5lbXk6IERlciBGZWluZC4KKworQkVTQ0hSRUlCVU5HOgorCURlciBGZWluZCB3aXJkIGRlciBTdGFlcmtlIGRlciBXYWZmZSAoYnp3LiBkZXIgSGFlbmRlKSBlbnRzcHJlY2hlbmQKKwlzdGFyayBhbmdlZ3JpZmZlbi4KKworUlVFQ0tHQUJFV0VSVDoKKwlLZWluZXIuCisKK0JFTUVSS1VORzoKKwlEaWVzZSBGdW5rdGlvbiBnaWJ0IGRpZSBBbmdyaWZmc21lbGR1bmcgYXVzLgorCUZhbGxzIG1pdCBibG9zc2VuIEhhZW5kZW4gYW5nZWdyaWZmZW4gd2lyZCwgaXN0IGRpZSBTdGFlcmtlCisJKDIqU3RhZXJrZV9kZXJfSGFlbmRlICsgMTAqQV9TVFIpLzMKKworU0lFSEUgQVVDSDoKKwkiRGVmZW5kIiwgIlF1ZXJ5RGFtYWdlIgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vQmVjb21lc05ldEFsaXZlIGIvZG9jL2xmdW4vQmVjb21lc05ldEFsaXZlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYTZjZGMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9CZWNvbWVzTmV0QWxpdmUKQEAgLTAsMCArMSw0NiBAQAorQmVjb21lc05ldEFsaXZlKCkKKworRlVOS1RJT046CisgICAgdm9pZCBCZWNvbWVzTmV0QWxpdmUob2JqZWN0IHBsKTsKKworR0VSVUZFTiBWT046CisgICAgL3N0ZC9wbGF5ZXIvYmFzZS5jCisKK0FSR1VNRU5URToKKyAgICBwbAorICAgICAgU3BpZWxlciwgZGVyIFZlcmJpbmR1bmcgenVtIE1VRCB3aWVkZXJlcmxhbmd0LgorCitCRVNDSFJFSUJVTkc6CisgICAgU3BpZWxlciwgd2VsY2hlIGRpZSBWZXJiaW5kdW5nIHp1bSBNVUQgZnJlaXdpbGxpZworICAgICh6LkIuIHBlciAnc2NobGFmZSBlaW4nKSBvZGVyIHVuZnJlaXdpbGxpZyB2ZXJsaWVyZW4sIGdlaGVuIGluIGRlbgorICAgIE5ldHp0b3RlbnN0YXR1cyB1ZWJlci4gU2llIHZlcmJsZWliZW4gbm9jaCBlaW5lIGRlZmluaWVydGUgWmVpdCBpbgorICAgIGRlciB6dWxldHp0IGJldHJldGVuZW4gVW1nZWJ1bmcgdW5kIHdlcmRlbiBzY2hsaWVzc2xpY2ggYXV0b21hdGlzY2gKKyAgICBpbiBkZW4gTmV0enRvdGVucmF1bSB1ZWJlcmZ1ZWhydC4KKyAgICBXaXJkIGRpZSBWZXJiaW5kdW5nIHdpZWRlciBhdWZnZWJhdXQsIHNvIHdpcmQgZGVyIFNwaWVsZXJjaGFyYWt0ZXIKKyAgICB3aWVkZXIgenVtIExlYmVuIGVyd2Vja3QgdW5kIGdlZ2ViZW5lbmZhbGxzIHp1dm9yIGF1cyBkZW0KKyAgICBOZXR6dG90ZW5yYXVtIHp1cnVlY2sgenUgc2VpbmVyIGxldHp0ZW4gVW1nZWJ1bmcgdGVsZXBvcnRpZXJ0LgorICAgIFVtIG51biBlaW5lbiBVZWJlcmJsaWNrIGRhcnVlYmVyIHp1IGVyaGFsdGVuLCB3YW5uIGVpbiBTcGllbGVyIGRpZQorICAgIFZlcmJpbmR1bmcgenVtIE1VRCB3aWVkZXJoZXJzdGVsbHQsIGdpYnQgZXMgZGllIEZ1bmt0aW9uCisgICAgQmVjb21lc05ldEFsaXZlKCkuIFNpZSB3aXJkIGF1dG9tYXRpc2NoIGluIGRlciBVbWdlYnVuZyBkZXMKKyAgICBTcGllbGVycywgaW4gYWxsZW4gT2JqZWt0ZW4gaW4gZGVyIFVtZ2VidW5nIGRlcyBTcGllbGVycworICAgIChuaWNodCByZWt1cnNpdikgdW5kIGluIGFsbGVuIE9iamVrdGVuIGltIFNwaWVsZXIgKHJla3Vyc2l2KQorICAgIGF1ZmdlcnVmZW4uIFVlYmVyZ2ViZW4gd2lyZCBoaWVyYmVpIGRhcyBTcGllbGVyb2JqZWt0LgorCisgICAgRXMgZ2lidCBhdWNoIG5vY2ggZGllIEZ1bmt0aW9uIEJlY29tZXNOZXREZWFkKCksIG1pdCBkZXIgbWFuCisgICAgYXVmIGFlaG5saWNoZSBXZWlzZSBlaW5zY2hsYWZlbmRlIFNwaWVsZXIgcmVnaXN0cmllcmVuIGthbm4uCisKK0JFSVNQSUVMRToKKyAgICBJbiBlaW5lbSBOUEMgd2FlcmUgZm9sZ2VuZGVzIGRlbmtiYXI6CisgICAgCisgICAgdm9pZCBCZWNvbWVzTmV0QWxpdmUob2JqZWN0IHBsKSB7CisgICAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSxicmVha19zdHJpbmcoCisgICAgICAgICJHdXRlbiBNb3JnZW4gIitwbC0+bmFtZShXRVIpKyIsIGF1Y2ggc2Nob24gYXVzZ2VzY2hsYWZlbj8hIiwgNzcsCisgICAgICAgIE5hbWUoV0VSKSsiIHNhZ3QgZ3JpbnNlbmQ6ICIpKTsKKyAgICB9CisgICAgU3RlaHQgZGVyIE5QQyBpbiBlaW5lbSBSYXVtLCB3byBlaW4gU3BpZWxlciBhdWZ3YWNodCwgc28gd2lyZCBkZXIKKyAgICBTcGllbGVyIGdlYnVlaHJlbmQgYmVncnVlc3N0LgorCitTSUVIRSBBVUNIOgorICAgIEJlY29tZXNOZXREZWFkKCksIFBsYXllclF1aXQoKSwgL3N0ZC9wbGF5ZXIvYmFzZS5jLCAvcm9vbS9uZXR6dG90LmMKKworMjQuIEF1ZyAyMDExIEdsb2luc29uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vQmVjb21lc05ldERlYWQgYi9kb2MvbGZ1bi9CZWNvbWVzTmV0RGVhZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2ZlZDdjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vQmVjb21lc05ldERlYWQKQEAgLTAsMCArMSw0NSBAQAorQmVjb21lc05ldERlYWQoKQorCitGVU5LVElPTjoKKyAgICB2b2lkIEJlY29tZXNOZXREZWFkKG9iamVjdCBwbCk7CisKK0dFUlVGRU4gVk9OOgorICAgIC9zdGQvcGxheWVyL2Jhc2UuYworCitBUkdVTUVOVEU6CisgICAgb2JqZWN0IHBsCisgICAgICBTcGllbGVyLCBkZXIgVmVyYmluZHVuZyB6dW0gTVVEIHZlcmxpZXJ0LgorCitCRVNDSFJFSUJVTkc6CisgICAgU3BpZWxlciwgd2VsY2hlIGRpZSBWZXJiaW5kdW5nIHp1bSBNVUQgZnJlaXdpbGxpZworICAgICh6LkIuIHBlciAnc2NobGFmZSBlaW4nKSBvZGVyIHVuZnJlaXdpbGxpZyB2ZXJsaWVyZW4sIGdlaGVuIGluIGRlbgorICAgIE5ldHp0b3RlbnN0YXR1cyB1ZWJlci4gU2llIHZlcmJsZWliZW4gbm9jaCBlaW5lIGRlZmluaWVydGUgWmVpdCBpbgorICAgIGRlciB6dWxldHp0IGJldHJldGVuZW4gVW1nZWJ1bmcgdW5kIHdlcmRlbiBzY2hsaWVzc2xpY2ggYXV0b21hdGlzY2gKKyAgICBpbiBkZW4gTmV0enRvdGVucmF1bSB1ZWJlcmZ1ZWhydC4KKyAgICBVbSBudW4gZWluZW4gVWViZXJibGljayBkYXJ1ZWJlciB6dSBlcmhhbHRlbiwgd2FubiBlaW4gU3BpZWxlciBkaWUKKyAgICBWZXJiaW5kdW5nIHp1bSBNVUQgdmVybGllcnQsIGdpYnQgZXMgZGllIEZ1bmt0aW9uIEJlY29tZXNOZXREZWFkKCkuCisgICAgU2llIHdpcmQgYXV0b21hdGlzY2ggaW4gZGVyIFVtZ2VidW5nIGRlcyBTcGllbGVycywgaW4gYWxsZW4gT2JqZWt0ZW4KKyAgICBpbiBkZXIgVW1nZWJ1bmcgZGVzIFNwaWVsZXJzIChuaWNodCByZWt1cnNpdikgdW5kIGluIGFsbGVuIE9iamVrdGVuCisgICAgaW0gU3BpZWxlciAocmVrdXJzaXYpIGF1ZmdlcnVmZW4uIFVlYmVyZ2ViZW4gd2lyZCBoaWVyYmVpIGRhcworICAgIFNwaWVsZXJvYmpla3QuCisKKyAgICBFcyBnaWJ0IGF1Y2ggbm9jaCBkaWUgRnVua3Rpb24gQmVjb21lc05ldEFsaXZlKCksIG1pdCBkZXIgbWFuCisgICAgYXVmIGFlaG5saWNoZSBXZWlzZSBlcndhY2hlbmRlIFNwaWVsZXIgcmVnaXN0cmllcmVuIGthbm4uCisKK0JFSVNQSUVMRToKKyAgICBFcyBnaWJ0IEdlYmlldGUsIGluIGRlbmVuIG5ldHp0b3RlIFNwaWVsZXIgdW5lcnd1ZW5zY2h0IHNpbmQuCisgICAgRm9sZ2VuZGVybWFzc2VuIGthbm4gbWFuIHNpY2ggaWhyZXIgd2lya3VuZ3N2b2xsIGVudGxlZGlnZW46CisgICAgCisgICAgdm9pZCBCZWNvbWVzTmV0RGVhZChvYmplY3QgcGwpIHsKKyAgICAgIHBsLT5tb3ZlKCJlaW5nYW5nc3JhdW0genUgZ2ViaWV0IiwgTV9UUE9SVHxNX05PQ0hFQ0spOworICAgIH0KKyAgICBNYW4gc2NoaWNrdCBkaWVzZSBTcGllbGVyIHdpZWRlciB6dW0gRWluZ2FuZyBkZXMgR2ViaWV0ZXMuCisgICAgRGEgZGVyIGxldHp0ZSBBdWZlbnRoYWx0c29ydCBlaW5lcyBTcGllbGVycywgZGVyIGluIGRlbgorICAgIE5ldHp0b3RlbnN0YXR1cyB1ZWJlcmdlaHQsIGVyc3QgbmFjaCBBdWZydWYgZGVyIEZ1bmt0aW9uCisgICAgQmVjb21lc05ldERlYWQoKSBhYmdlc3BlaWNoZXJ0IHdpcmQsIHdhY2h0IGRlciBTcGllbGVyIGRhbm4gYW4gZGVtCisgICAgT3J0IGF1Ziwgd28gbWFuIElobiBpbm5lcmhhbGIgZGllc2VyIEZ1bmt0aW9uIGhpbnRlbGVwb3J0aWVydCBoYXQuCisKK1NJRUhFIEFVQ0g6CisgICAgQmVjb21lc05ldEFsaXZlKCksIFBsYXllclF1aXQoKSwgL3N0ZC9wbGF5ZXIvYmFzZS5jLCAvcm9vbS9uZXR6dG90LmMKKworMjQuIEF1ZyAyMDExLCBHbG9pbnNvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0Nhbm5vdFNlZSBiL2RvYy9sZnVuL0Nhbm5vdFNlZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODY5NTQxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vQ2Fubm90U2VlCkBAIC0wLDAgKzEsMzAgQEAKK0Nhbm5vdFNlZSgpCisKK0ZVTktUSU9OOgorICAgICB2YXJhcmdzIGludCBDYW5ub3RTZWUoaW50IHNpbGVudCk7CisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC9saXZpbmcvbGlnaHQuYworCitBUkdVTUVOVEU6CisgICAgIHNpbGVudCAtIFNvbGwgYW4gZGFzIExlYmV3ZXNlbiBkaXJla3QgYXV0b21hdGlzY2ggZWluZSBNZWxkdW5nCisgICAgICAgICAgICAgIGF1c2dlZ2ViZW4gd2VyZGVuIHdlbm4gZXMgbmljaHRzIHNlaGVuIGthbm4/CisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGllc2UgRnVua3Rpb24gcHJ1ZWZ0IG9iIGRhcyBMZWJld2VzZW4gZXR3YXMgc2VoZW4ga2Fubiwgb2RlciBuaWNodC4KKyAgICAgSGllcmJlaSB3aXJkIHNvd29obCBkYXMgTGljaHRsZXZlbCBtaXQgc2FlbXRsaWNoZW4gTW9kaWZpa2F0b3JlbiwKKyAgICAgYWxzIGF1Y2ggTmFjaHRzaWNodCB1bmQgZGllIFByb3BlcnR5IFBfQkxJTkQgYmVydWVja3NpY2h0aWd0LiBEYQorICAgICBkaWVzZSBGdW5rdGlvbiBiZWkgenVrdWVuZnRpZ2VuIE11ZGxpYmFlbmRlcnVuZ2VuIGltbWVyIGFrdHVhbGlzaWVydAorICAgICB3ZXJkZW4gZHVlcmZ0ZSwgc29sbHRlIG1hbiBzaWUgbmFjaCBNb2VnbGljaGtlaXQgYmVudXR6ZW4gdW5kIGRpZQorICAgICBBYmZyYWdlbiBuaWNodCBzZWxic3QgaW1wbGVtZW50aWVyZW4uCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIDAsIHdlbm4gZGVyIFNwaWVsZXIgZXR3YXMgc2VoZW4ga2FubgorICAgICAxLCB3ZW5uIGRlciBTcGllbGVyIG5pY2h0cyBzZWhlbiBrYW5uOiBCbGluZGhlaXQKKyAgICAgMiwgd2VubiBkZXIgU3BpZWxlciBuaWNodHMgc2VoZW4ga2FubjogenUgd2VuaWcgTGljaHQva2VpbmUgTmFjaHRzaWNodAorCitTSUVIRSBBVUNIOgorICAgICBQX0JMSU5ELCBQX0xJR0hUX01PRElGSUVSLCBQX1BMQVlFUl9MSUdIVAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBNb24gSmFuIDE3IDE4OjIyOjI3IDIwMDAgYnkgUGFkcmVpYwpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vQ2hhbmdlTWluaVF1ZXN0IGIvZG9jL2xmdW4vQ2hhbmdlTWluaVF1ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YmZiN2QKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9DaGFuZ2VNaW5pUXVlc3QKQEAgLTAsMCArMSw0OCBAQAorRlVOS1RJT046CisgICAgaW50IENoYW5nZU1pbmlRdWVzdChtaXhlZCBxdWVzdGdlYmVyLCBpbnQgcGFyYW1ldGVyLCBtaXhlZCBuZXd2YWx1ZSkKKworREVGSU5JRVJUIElOOgorICAgIC9zZWN1cmUvcXVlc3RtYXN0ZXIKKworQkVTQ0hSRUlCVU5HOgorICAgIERpZXNlIEZ1bmt0aW9uIGFlbmRlcnQgZWluZW4gUGFyYW1ldGVyIGVpbmVyIE1pbmlxdWVzdCBpbSBRdWVzdG1hc3RlciwKKyAgICBzY2hyZWlidCBmdWVyIGRpZXNlIEFrdGlvbiBlaW5lbiBMb2ctRWludHJhZyB1bmQgZXJzdGVsbHQgZGFzIE1pbmlxdWVzdC0KKyAgICBEdW1wZmlsZSBuZXUuCisKK0FSR1VNRU5URToKKyAgICBxdWVzdGdlYmVyIC0gTGFkZW5hbWUgZGVzIE9iamVrdHMgKHN0cmluZyksIGRhcyBkaWUgTWluaXF1ZXN0IHZlcmdpYnQsIAorICAgICAgICAgICAgICAgICBvZGVyZGllIEluZGV4bnVtbWVyIChpbnQpIGRlciBNaW5pcXVlc3QgaW4gZGVyIE1RLUxpc3RlCisgICAgcGFyYW1ldGVyICAtIEFuZ2FiZSBkZXMgenUgYWVuZGVybmVuIFBhcmFtZXRlcnMgKFBvc2l0aW9uIGRlcyBWYWx1ZXMKKyAgICAgICAgICAgICAgICAgaW0gTWluaXF1ZXN0cy1NYXBwaW5nKToKKyAgICAgICAgICAgICAgICAgMCA6IE1pbmlxdWVzdC1TdHVmZW5wdW5rdGUsIG1pbmQuIDEKKyAgICAgICAgICAgICAgICAgMiA6IEF1ZmdhYmVuYmVzY2hyZWlidW5nIGRlciBNaW5pcXVlc3QgKHN0cmluZykKKyAgICAgICAgICAgICAgICAgMyA6IFNpY2h0YmFya2VpdCBkZXIgTWluaXF1ZXN0ICgwLzEpLCBkZWZhdWx0IGlzdCAxCisgICAgICAgICAgICAgICAgIDQgOiBha3Rpdi9pbmFrdGl2ICgxLzApCisgICAgICAgICAgICAgICAgIDUgOiBUaXRlbCBkZXIgTWluaXF1ZXN0CisgICAgICAgICAgICAgICAgIDYgOiAiZ2VzY2hhZmZ0Ii1CZXNjaHJlaWJ1bmcgbmFjaCBBYnNjaGx1c3MgZGVyIE1RCisgICAgICAgICAgICAgICAgIDcgOiBWb3JhdXNzZXR6dW5nZW4sIE1hcHBpbmcgaW0gRm9ybWF0IHZvbiBQX1JFU1RSSUNUSU9OUworICAgICAgICAgICAgICAgICA4IDogenVnZW9yZG5ldGUgUmVnaW9uLCBTdHJpbmcgd2llIHouQi4icG9sYXIiLCAiZ2ViaXJnZSIKKyAgICAgICAgICAgICAgICAgOSA6IGVybGF1YnRlIEFiZnJhZ2VvYmpla3RlLCBBcnJheSB2b24gTGFkZW5hbWVuLCB6LkIuCisgICAgICAgICAgICAgICAgICAgICAoeyIvZC9yZWdpb24vbWFnaWVyL25wYy9pbmZvbnBjIn0pLCBlcyBrb2VubmVuIG1laHJlcmUgCisgICAgICAgICAgICAgICAgICAgICBPYmpla3RlIGVpbmdldHJhZ2VuIHNlaW4KKyAgICBuZXd2YWx1ZSAgIC0gbmV1ZXIgV2VydCBmdWVyIGRlbiBhbmdlZ2ViZW5lbiBQYXJhbWV0ZXIKKworUlVFQ0tHQUJFV0VSVEU6CisgICAgIDE6IGhhdCBnZWtsYXBwdAorICAgICAwOiBadWdyaWZmIHZlcndlaWdlcnQKKyAgICAtMjogdW5ndWVsdGlnZXIgRGF0ZW50eXAgZWluZXMgZGVyIEFyZ3VtZW50ZSwgYmVpIFBhcmFtZXRlciA5IHdpcmQKKyAgICAgICAgZWluIHVlYmVyZ2ViZW5lcyBBcnJheSB6dXNhZXR6bGljaCBhdWYgTGVlcnN0cmluZ3MgdW5kIEVsZW1lbnRlCisgICAgICAgIGdlcHJ1ZWZ0LCBkaWUga2VpbmUgU3RyaW5ncyBzaW5kLiBXZW5uIGRhcyBBcnJheSBhdXNzY2hsaWVzc2xpY2gKKyAgICAgICAgYXVzIHNvbGNoZW4gRWxlbWVudGVuIGJlc3RlaHQsIHdpcmQgZWJlbmZhbGxzIC0yIHp1cnVlY2tnZWdlYmVuLgorCitCRU1FUktVTkdFTjoKKyAgICBEYXMgRmxhZyAiYWN0aXZlIiBsYWVzc3Qgc2ljaCBiZXF1ZW1lciB1ZWJlciBkaWUgUXVlc3RtYXN0ZXItRnVua3Rpb24KKyAgICBTd2l0Y2hNaW5pUXVlc3RBY3RpdmUoKSB1bXNjaGFsdGVuLgorICAgIERlciBNaW5pcXVlc3QtVGl0ZWwgZGFyZiBrZWluICJpbiIgb2RlciAiaW0iIGVudGhhbHRlbiwgd2VpbCBkYW5uIGRpZQorICAgIEVpbnRyYWVnZSBpbiBkZXIgRnJhdGVybml0YXMtQmlibGlvdGhlayBuaWNodCBnZWxlc2VuIHdlcmRlbgorICAgIGtvZW5uZW4uCisKK1NJRUhFIEFVQ0g6CisgICBBZGRNaW5pUXVlc3QoTCkKKyAgIFBfUkVTVFJJQ1RJT05TCisKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0NoYW5nZVJlcHV0YXRpb24gYi9kb2MvbGZ1bi9DaGFuZ2VSZXB1dGF0aW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3YzNhZjYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9DaGFuZ2VSZXB1dGF0aW9uCkBAIC0wLDAgKzEsNDUgQEAKK0NoYW5nZVJlcHV0YXRpb24KK0ZVTktUSU9OOgorICAgICBwdWJsaWMgdmFyYXJncyBpbnQgQ2hhbmdlUmVwdXRhdGlvbihzdHJpbmcgcmVwaWQsIGludCB2YWx1ZSwgaW50IHNpbGVudCkKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL3BsYXllci9yZXB1dGF0aW9uLmMKKworQVJHVU1FTlRFOgorICAgICByZXBpZAorICAgICAgIEplZGUgbmV1ZSBSZXB1dGF0aW9uc2dydXBwZSBtdXNzIGFuZmFuZ3MgbWl0IGVpbmVyIGVpbmRldXRpZ2VuIElEIHZvbiAKKyAgICAgICBlaW5lbSBFTSBpbiBkZW4gUmVwdXRhdGlvbnNtYXN0ZXIgZWluZ2V0cmFnZW4gd2VyZGVuLiBEYW5hY2gga2FubiBtYW4gCisgICAgICAgdWViZXIgZGllIGVpbmRldXRpZ2UgSUQgPHJlcGlkPiBhdWYgc2llIHp1Z3JlaWZlbi4KKyAgICAgdmFsdWUKKyAgICAgICBEZXIgV2VydCwgdW0gZGVuIGRpZSBSZXB1dGF0aW9uIGdlYWVuZGVydCB3ZXJkZW4gc29sbC4gUG9zaXRpdmUgV2VydGUgCisgICAgICAgZXJob2VoZW4gZGllIFJlcHV0YXRpb24sIG5lZ2F0aXZlIHZlcnNjaGxlY2h0ZXJuIHNpZS4KKyAgICAgc2lsZW50CisgICAgICAgRWluIG9wdGlvbmFsZXMgRmxhZy4gRmFsbHMgZ2VzZXR6dCwgd2lyZCBrZWluZSBTdGFuZGFyZG1lbGR1bmcgdWViZXIgCisgICAgICAgZGllIFJlcHV0YXRpb25zYWVuZGVydW5nIGFuIGRlbiBTcGllbGVyIGF1c2dlZ2ViZW4uIE1hbiBrb2VubnRlIGRhbm4gCisgICAgICAgZWlnZW5lIE1lbGR1bmdlbiBhdXNnZWJlbi4KKworQkVTQ0hSRUlCVU5HOgorICAgICBWb3IgZGVyIEFlbmRlcnVuZyB3aXJkIGVpbiBDaGVjayBhdWYgZGllIFVJRCBkZXMgYXVzZnVlaHJlbmRlbiBPYmpla3RlcworICAgICBhdXNnZWZ1ZWhydCwgImZyZW1kZSIgUmVwdXRhdGlvbmVuIGRhcmYgbWFuIHNvbWl0IG5pY2h0IHZlcmFlbmRlcm4uCisgICAgIE1hbiBrYW5uIGFiZXIgc2VsYnN0dmVyc3RhZW5kbGljaCBpbiBiZWdydWVuZGV0ZW4gRmFlbGxlbiBtaXQgZGVtCisgICAgIHp1c3RhZW5kaWdlbiBNYWdpZXIvUmVnaW9uc21hZ2llciBzcHJlY2hlbiwgb2IgbWFuIGViZW5mYWxscyBadWdyaWZmCisgICAgIGVyaGFlbHQuIEVpbmdldHJhZ2VuIHdpcmQgZGllcyBzY2hsdXNzZW5kbGljaCBkdXJjaCBlaW5lbiBFTS4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgUkVQX1JFVF9TVUNDRVNTICAgIFJlcHV0YXRpb24gd3VyZGUgdmVyYWVuZGVyLgorICAgICBSRVBfUkVUX1NVQ0NFU1NDVVQgUmVwdXRhdGlvbiB3dXJkZSBhdWYgTWluIC8gTWF4IHZlcmFlbmRlcnQKKyAgICAgUkVQX1JFVF9XUk9OR0FSR1MgIEZhbHNjaGUgQXJndW1lbnRlIGZ1ZXIgQ2hhbmdlUmVwKCkKKyAgICAgUkVQX1JFVF9JTlZBTElEVUlEIFVuenVsYWVzc2lnZSBVSUQgLyBrZWluZSBadWdyaWZmc3JlY2h0ZQorICAgICBSRVBfUkVUX0FMUkVBRFlNQVggUmVwdXRhdGlvbiBiZXJlaXRzIE1heCAvIE1pbgorICAgICBSRVBfUkVUX0lOQUNUSVZFICAgUmVwdXRhdGlvbiBtb21lbnRhbiBpbmFrdGl2CisgICAgIFJFUF9SRVRfSU5WQUxJRFJFUCBSZXB1dGF0aW9uIG5pY2h0IHZvcmhhbmRlbgorCitCRUlTUElFTEU6CisgICAgIHMuIHJlcHV0YXRpb24KKworU0lFSEUgQVVDSDoKKyAgICAgcmVwdXRhdGlvbgorICAgICBHZXRSZXB1dGF0aW9uKCksIEdldFJlcHV0YXRpb25zKCkKKworWlVMRVRaVCBHRUFlTkRFUlQ6CiswNi4wNC4yMDA5LCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9DaGVja0ZpbmRSZXN0cmljdGlvbnMgYi9kb2MvbGZ1bi9DaGVja0ZpbmRSZXN0cmljdGlvbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjljOTZlNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0NoZWNrRmluZFJlc3RyaWN0aW9ucwpAQCAtMCwwICsxLDIzIEBACitDaGVja0ZpbmRSZXN0cmljdGlvbnMKKworRlVOS1RJT046CisgICAgdmFyYXJncyBpbnQgQ2hlY2tGaW5kUmVzdHJpY3Rpb25zKG9iamVjdCBvYiwgbWl4ZWQgcmVzdHIsIGNsb3N1cmUgcXApCisgCitERUZJTklFUlQgSU46CisgICAgL3N0ZC9yb29tL3Nob3AuYworIAorQVJHVU1FTlRFOgorICAgIG9iICAgICAtIE9iamVrdAorICAgIHJlc3RyICAtIHp1c2FldHpsaWNoZXMgQXJndW1lbnQKKyAgICBxcCAgICAgLSBzeW1ib2xfZnVuY3Rpb24oIlF1ZXJ5UHJvcCIsb2IpCisKK0JFU0NIUkVJQlVORzoKKyAgICBGdW5rdGlvbiwgZGllIEZpbmRCZXN0V2VhcG9uIC8gRmluZEJlc3RBcm1vdXJzIGVpbnNjaHJhZW5rdC4KKyAgICBXaXJkIGluIFdlcnQgdW5nbGVpY2ggMCB6dXJ1ZWNrZ2VsaWVmZXJ0LCBzbyB3aXJkIGRhcyBPYmpla3QKKyAgICBuaWNodCBnZW5vbW1lbi4KKworUlVFQ0tHQUJFV0VSVDoKKyAgICBOb3JtYWxlcndlaXNlIDAKKworU0lFSEUgQVVDSDoKKyAgICBGaW5kQmVzdFdlYXBvbigpLCBGaW5kQmVzdEFybW91cnMoKQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vQ2hlY2tMaWdodFR5cGUgYi9kb2MvbGZ1bi9DaGVja0xpZ2h0VHlwZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTA0OTBhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vQ2hlY2tMaWdodFR5cGUKQEAgLTAsMCArMSw4NCBAQAorQ2hlY2tMaWdodFR5cGUoKQorCitGVU5LVElPTjoKKwl2YXJhcmdzIGludCBDaGVja0xpZ2h0VHlwZShpbnQgbGlnaHR0eXBlLCBpbnQgbW9kZSk7CisKK0RFRklOSUVSVCBJTjoKKwkvc3RkL3RoaW5nL2Rlc2NyaXB0aW9uLmMKKworQVJHVU1FTlRFOgorCWxpZ2h0dHlwZQorCSAgQXVmIGRpZXNlbiBMaWNodHR5cCB3aXJkIGdldGVzdGV0LgorCW1vZGUKKwkgIERpZSBNZXRob2RlLCBuYWNoIGRlciBkZXIgTGljaHR0eXAgdWViZXJwcnVlZnQgd2lyZC4KKworQkVTQ0hSRUlCVU5HOgorICAgICAgICBEaWUgRnVua3Rpb24gcHJ1ZWZ0LCBvYiBkZXIgdWViZXJnZWJlbmUgbGlnaHR0eXBlIG1pdCBkZW0gaW4KKyAgICAgICAgUF9MSUdIVF9UWVBFIGRlZmluaWVydGVuIExpY2h0dHlwIHVlYmVyZWluc3RpbW10LiAKKworICAgICAgICBEYWJlaSBrYW5uIGluIHZlcnNjaGllZGVuZW4gTW9kaSBnZXRlc3RldCB3ZXJkZW46CisKKyAgICAgICAgTFRfQ0hFQ0tfQU5ZCisgICAgICAgICAgRXMgd2lyZCBnZXBydWVmdCwgb2IgbWluZGVzdGVucyBlaW5lciBkZXIgaW4gbGlnaHR0eXBlIHVlYmVyCisgICAgICAgICAgZ2ViZW5lbiBMaWNodHR5cGVuIGltIE9iamVrdCB2b3JoYW5kZW4gaXN0LiBEaWVzIGlzdCBkYXMKKyAgICAgICAgICBTdGFuZGFyZHZlcmhhbHRlbiAoZGVmYXVsdCkgZGVyIEZ1bmt0aW9uLgorCisgICAgICAgIExUX0NIRUNLX0FMTCAgICAgCisgICAgICAgICAgRXMgd2lyZCBnZXBydWVmdCwgb2IgYWxsZSBpbiBsaWdodHR5cGUgZGVmaW5pZXJ0ZW4gTGljaHR0eXBlbgorICAgICAgICAgIHZvcmhhbmRlbiBzaW5kLiBFcyBrb2VubmVuIGFiZXIgYXVjaCBtZWhyIExpY2h0dHlwZW4gZGVmaW5pZXJ0CisgICAgICAgICAgc2Vpbi4KKworICAgICAgICBMVF9DSEVDS19NQVRDSCAgIAorICAgICAgICAgIEVzIHdpcmQgZ2VwcnVlZnQsIG9iIGdlbmF1IGRpZSBpbiBsaWdodHR5cGUgZGVmaW5pZXJ0ZW4gTGljaHQtCisgICAgICAgICAgdHllbiBkZWZpbmllcnQgc2luZCwgc2luZCBtZWhyIG9kZXIgd2VuaWdlciB2b3JoYW5kZW4sIGdpYnQgZGllCisgICAgICAgICAgRnVua3Rpb24gMCB6dXJ1ZWNrLgorCisgICAgICAgIExUX0NIRUNLX05PTkUgICAgCisgICAgICAgICAgRXMgd2lyZCBnZXBydWVmdCwgb2Iga2VpbmVyIGRlciB1ZWJlcmdlYmVuZW4gTGljaHR0eXBlbiB2b3JoYW5kZW4KKyAgICAgICAgICBzaW5kLiBPYiBzb25zdCBub2NoIGFuZGVyZSBMaWNodHR5cGVuIHZvcmhhbmRlbiBzaW5kLCBpc3QgZGFiZWkgCisgICAgICAgICAgZWdhbC4KKworUlVlQ0tHQUJFV0VSVDoKKwkwIHdlbm4gZGllIGdlcHJ1ZWZ0ZW4gQmVkaW5ndW5nZW4gbmljaHQga29ycmVrdCBzaW5kLCBzb25zdCAKKyAgICAgICAgZWluIFdlcnQgdW5nbGVpY2ggMC4KKworQkVJU1BJRUxFOgorICAgICAgICBJbiBlaW5lbSBSYXVtIHNjaGVpbnQgZGllIFNvbm5lLCBhdXNzZXJkZW0gZ2lidCBlcyBkb3J0IGVpbiBMYWdlci0KKyAgICAgICAgZmV1ZXIgdW5kIGVpbiBPYmpla3QgbWl0IG1hZ2lzY2hlbSBHbHVlaGVuIChtZWluZSBQaGFudGFzaWUgc3RyZWlrdAorICAgICAgICBncmFkKToKKworICAgICAgICByYXVtLT5TZXRQcm9wKCBQX0xJR0hUX1RZUEUsIExUX1NVTnxMVF9PUEVOX0ZJUkV8TFRfR0xPV0lORyApOworCisgICAgICAgIEVzIHNvbGwgZ2V0ZXN0ZXQgd2VyZGVuLCBvYiBhbiBpbiBkZW0gUmF1bSBUYWdlc2xpY2h0IGhlcnJzY2h0OgorCisgICAgICAgIHJhdW0tPkNoZWNrTGlnaHRUeXBlKExUX0RBWUxJR0hULCBMVF9DSEVDS19BTlkpOworICAgICAgICByYXVtLT5DaGVja0xpZ2h0VHlwZShMVF9EQVlMSUdIVCk7IC8vIGdsZWljaHdlcnRpZworCisgICAgICAgIERpZSBGdW5rdGlvbiBlcmdpYnQgd2FociwgZGEgTFRfREFZTElHSFQgdW50ZXIgYW5kZXJlbSBMVF9TVU4gZW50LQorICAgICAgICBoYWVsdCAodmdsIG1hbiBQX0xJR0hUX1RZUEVTKS4KKworICAgICAgICBFcyBzb2xsIGdldGVzdGV0IHdlcmRlbiwgZGFzcyB3ZWRlciBNb25kIG5vY2ggU3Rlcm5lIGltIFJhdW0gc2luZDoKKworICAgICAgICByYXVtLT5DaGVja0xpZ2h0VHlwZShMVF9NT09OfExUX1NUQVJTLCBMVF9DSEVDS19OT05FKTsKKworICAgICAgICBEaWUgRnVua3Rpb24gZXJnaWJ0IHdhaHIsIGRhIGRpZSBiZWlkZW4gbmljaHQgZ2VzZXR6dCBzaW5kLgorCisgICAgICAgIEVzIHNvbGwgZ2VwcnVlZnQgd2VyZGVuLCBvYiBNb25kIHVuZCBTdGVybmUgaW0gUmF1bSBsZXVjaHRlbjoKKworICAgICAgICByYXVtLT5DaGVja0xpZ2h0VHlwZShMVF9NT09OfExUX1NUQVJTLCBMVF9DSEVDS19BTEwpOworCisgICAgICAgIERpZSBGdW5rdGlvbiBlcmdpYnQgZmFsc2NoLCBkYSBrZWlucyBkZXIgYmVpZGVuIExpY2h0ZXIgdm9yaGFuZGVuCisgICAgICAgIGlzdC4gU2llIGVyZ2FlYmUgYWJlciBhdWNoIGZhbHNjaCwgd2VubiBlaW5lciBkZXIgYmVpZGVuIFR5cGVuCisgICAgICAgIHZvcmhhbmRlbiB3YWVyLiBOdXIgd2VubiBiZWlkZSB2b3JoYW5kZW4gc2luZCwgZ2lidCBMVF9DSEVDS19BTEwKKyAgICAgICAgd2Foci4KKworQkVNRVJLVU5HOgorICAgICAgICBMaWdodHR5cGVzIGhhYmVuIG5pY2h0cyBtaXQgZGVtIExpY2h0c3lzdGVtIHp1IHR1bi4gU2llIGRpZW5lbiAKKyAgICAgICAgbnVyIGRlciBCZXNjaHJlaWJ1bmcgZGVyIExpY2h0dmVyaGFlbHRuaXNzZSBhbi9pbiBlaW5lbSBPYmpla3QuCisgICAgICAgIE9iamVrdGUgbWl0IHZlcnNjaGllZGVuZW4gTGljaHR2ZXJoYWVsdG5pc3NlbiBiZWVpbmZsdXNzZW4gc2ljaAorICAgICAgICBnZWdlbnNlaXRpZyBuaWNodC4KKworU0lFSEUgQVVDSDoKKyAgICAgICAgL3N0ZC90aGluZy9kZXNjcmlwdGlvbi5jLCAvc3RkL3RoaW5nL2xpZ2h0dHlwZXMuaCwgUF9MSUdIVF9UWVBFCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBGcmkgSnVuIDExIDIwOjQ3OjMzIDIwMDQgYnkgVmFuaW9uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9DaGVja1Jlc2lzdGFuY2UgYi9kb2MvbGZ1bi9DaGVja1Jlc2lzdGFuY2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU0ODZhNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0NoZWNrUmVzaXN0YW5jZQpAQCAtMCwwICsxLDIwIEBACitDaGVja1Jlc2lzdGFuY2UoKQorCitGVU5LVElPTjoKKwlDaGVja1Jlc3Npc3RhbmNlKHN0cmluZyogZGFtX3R5cGVfbGlzdCkKKworQVJHVU1FTlRFOgorCWRhbV90eXBlX2xpc3Q6IExpc3RlIGRlciBTY2hhZGVuc2FydGVuLCBkaWUgZ2VwcnVlZnQgd2VyZGVuCisKK0JFU0NIUkVJQlVORzoKKwlEaWVzZSBGdW5rdGlvbiB1ZWJlcnBydWVmdCwgZ2VnZW4gd2VsY2hlIGRlciBhbmdlZ2ViZW5lbgorCVNjaGFkZW5zYXJ0ZW4gZGFzIExlYmV3ZXNlbiByZXNpc3RlbnQgb2RlciB2ZXJsZXR6bGljaCBpc3QgdW5kCisJZ2lidCBlaW5lbiBGYWt0b3IgenVydWVjaywgZGVyIG1pdCBkZW0gU2NoYWRlbiBtdWx0aXBsaXppZXJ0IHdpcmQuCisJRGllc2VyIEZha3RvciBiZXRyYWVndCBub3JtYWxlcndlaXNlIDEsIGJlaSBiZWkgamVkZXIgUmVzaXN0ZW56CisJd2lyZCBlciBoYWxiaWVydCB1bmQgYmVpIGplZGVyIFZlcmxldHpsaWNoa2VpdCB2ZXJkb3BwZWx0LgorCitSVUVDS0dBQkVXRVJUOgorCUVpbiBGYWt0b3IsIGRlciBtaXQgZGVtIFNjaGFkZW4gbXVsdGlwbGl6aWVydCB3aXJkLCB2b20gVHlwICJmbG9hdCIuCisKK1NJRUhFIEFVQ0g6CisJIkRlZmVuZCIKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0NoZWNrU2Vuc2l0aXZlQXR0YWNrIGIvZG9jL2xmdW4vQ2hlY2tTZW5zaXRpdmVBdHRhY2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJhZWMyZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0NoZWNrU2Vuc2l0aXZlQXR0YWNrCkBAIC0wLDAgKzEsMzMgQEAKK0NoZWNrU2Vuc2l0aXZlQXR0YWNrKCkKK0ZVTktUSU9OOgorICAgICB2b2lkIENoZWNrU2Vuc2l0aXZlQXR0YWNrKGludCBkYW0sIHN0cmluZyAqZGFtX3R5cGUsIG1peGVkIHNwZWxsLAorCQkJICAgICAgIG9iamVjdCBlbmVteSkKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL2xpdmluZy9pbnZlbnRvcnkuYworCitBUkdVTUVOVEU6CisgICAgIGRhbQktIGFuIERlZmVuZCB1ZWJlcmdlYmVuZXIgU2NoYWRlbgorICAgICBkYW1fdHlwZQktIFNjaGFkZW5zdHlwKGVuKQorICAgICBzcGVsbAktIHNwZWxsLCBpbnQgb2RlciBtYXBwaW5nCisgICAgIGVuZW15CS0gRmVpbmRlc29iamVrdAorCitCRVNDSFJFSUJVTkc6CisgICAgIFdpcmQgdm9uIERlZmVuZCgpIGF1ZmdlcnVmZW4gdW5kIHBydWVmdCBkaWUgTGlzdGVuIGluCisgICAgIFBfU0VOU0lUSVZFX0FUVEFDSyBkdXJjaC4KKyAgICAgV2VubiBkaWUgU2NobHVlc3NlbCB1bmQgVGhyZXNob2xkLVdlcnRlIHN0aW1tZW4sIHdpcmQKKyAgICAgdHJpZ2dlcl9zZW5zaXRpdmVfYXR0YWNrKGVuZW15LGtleSxkYW0sc3BlbGwsb3B0aW9ucykKKyAgICAgaW0gT2JqZWt0IGdlcnVmZW4uCisKK0JFTUVSS1VOR0VOOgorICAgICBPYmpla3RlIG1pdCBQX1NFTlNJVElWRSBtaXQgU2NobHVlc3NlbCBTRU5TSVRJVkVfQVRUQUNLIGJpdHRlIHZvcnNpY2h0aWcKKyAgICAgdmVyd2VuZGVuLCBkYSByZWNoZW5pbnRlbnNpdi4KKworU0lFSEUgQVVDSDoKKyAgICAgUF9TRU5TSVRJVkUKKyAgICAgSW5zZXJ0U2Vuc2l0aXZlT2JqZWN0LCBSZW1vdmVTZW5zaXRpdmVPYmplY3QKKyAgICAgaW5zZXJ0X3NlbnNpdGl2ZV9pbnZfdHJpZ2dlciwgaW5zZXJ0X3NlbnNpdGl2ZV9pbnYKKyAgICAgUF9TRU5TSVRJVkVfQVRUQUNLLCBQX1NFTlNJVElWRV9JTlZFTlRPUlksCisgICAgIFBfU0VOU0lUSVZFX0lOVkVOVE9SWV9UUklHR0VSCisKKzI4Lkphbi4yMDAxLCBHbG9pbnNvbkBNRwpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vQ2hlY2tTcGVsbEZhdGlndWUgYi9kb2MvbGZ1bi9DaGVja1NwZWxsRmF0aWd1ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDdjYzJhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vQ2hlY2tTcGVsbEZhdGlndWUKQEAgLTAsMCArMSw2MSBAQAorQ2hlY2tTcGVsbEZhdGlndWUKKworRlVOS1RJT046CisgICAgcHVibGljIHZhcmFyZ3MgaW50IENoZWNrU3BlbGxGYXRpZ3VlKHN0cmluZyBrZXkpCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3RkL2xpdmluZy9za2lsbHMuYworICAgIC9zdGQvcGxheWVyL3NraWxscy5jCisgICAgL3N5cy9saXZpbmcvc2tpbGxzLmgKKworQVJHVU1FTlRFOgorICAgIHN0cmluZyBrZXkgIDogRWluZGV1dGlnZXIgTmFtZSBkZXMgU3BydWNoZXMsIGVpbmVyIEdydXBwZSB2b24gU3BydWVjaGVuCisgICAgICAgICAgICAgICAgICBvZGVyIDAgZnVlciBkaWUgZ2xvYmFsZSBTcHJ1Y2hlcm11ZWR1bmcuCisKK0JFU0NIUkVJQlVORzoKKyAgICBEaWVzZSBGdW5rdGlvbiBkaWVudCB6dW0gUHJ1ZWZlbiB2b24gaW5kaXZpZHVlbGxlbiBTcHJ1Y2hlcm11ZWR1bmdlbgorICAgIChTcGVsbGZhdGlndWUsIFNwcnVjaHNwZXJyZW4pLgorICAgIEhpZXJtaXQgbGFzc2VuIHNpY2ggdW5hYmhhZW5naWdlIEVybXVlZHVuZ2VuL1NwZXJyZW4gZnVlciBlaW56ZWxuZQorICAgIFNwcnVlY2hlIG9kZXIgR3J1cHBlbiB2b24gU3BydWVjaGVuIGdlc3RhbHRlbi4KKworICAgIFdpcmQgPGtleT4gbmljaHQgYW5nZWdlYmVuIG9kZXIgaXN0IDAsIHdpcmQgZGllIGdsb2JhbGUgU3BydWNoc3BlcnJlCisgICAgZ2VwcnVlZnQgKGlkZW50aXNjaCB6dSBkZXIgUHJvcGVydHkgUF9ORVhUX1NQRUxMX1RJTUUpLCBhbmRlcmVuZmFsbHMgCisgICAgZGllIHVudGVyIDxrZXk+IGdlc3BlaWNoZXJ0ZSBTcHJ1Y2hlcm11ZWR1bmcuCisgICAgUHJ1ZWZ0IG1hbiBlaW5lbiBFaW50cmFnIG9obmUgQW5nYWJlIHZvbiA8a2V5PiBpc3QgZGFzIEVyZ2VibmlzIGRpZXNlcgorICAgIEZ1bmt0aW9uIGlkZW50aXNjaCB6dXIgQWJmcmFnZSB2b24gUF9ORVhUX1NQRUxMX1RJTUUuCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgMCAgICBTcHJ1Y2hlcm11ZWR1bmcgZXhpc3RpZXJ0IG5pY2h0IG9kZXIgaXN0IGFiZ2VsYXVmZW4uCisKKyAgICA+MCAgIFNwcnVjaGVybXVlZHVuZyBpc3Qgbm9jaCBuaWNodCBhYmdlbGF1ZmVuLCBSdWVja2dhYmV3ZXJ0IGlzdCBkaWUKKyAgICAgICAgIFplaXQsIGJlaSBkZXIgZGllc2VyIEVpbnRyYWcgYWJsYWV1ZnQuIERlciBTcHJ1Y2ggZGFyZiBfbmljaHRfCisgICAgICAgICBhdXNnZWZ1ZWhydCB3ZXJkZW4uCisKK0JFSVNQSUVMRToKKyAgICBFaW4gU3BlbGwgZ2Vob2VydCB6dSBlaW5lciBHcnVwcGUgdm9uIFNwZWxscyBtaXQgZGVtIE5hbWVuICdleHRyYXN1ZXNzJy4KKyAgICBFciBkYXJmIG51ciBhdXNnZWZ1ZWhydCB3ZXJkZW4sIHdlbm4gc2VpdCA1cyBrZWluIGFuZGVyZXIgU3BydWNoIGF1cyBkZXIKKyAgICBHcnVwcGUgYXVzZ2VmdWVocnQgd3VyZGUuCisgICAgaWYgKG9iLT5DaGVja1NwZWxsRmF0aWd1ZSgiZXh0cmFzdWVzcyIpIHsKKyAgICAgIC8vIGFsdGUgU3BlcnJlIG5vY2ggbmljaHQgYWJnZWxhdWZlbi4KKyAgICAgIHRlbGxfb2JqZWN0KG9iLCAiRGVpbmUgdW5lbmRsaWNoZSBTY2hva290b3J0ZSBpc3Qgbm9jaCBuaWNodCB3aWVkZXIgIgorICAgICAgICAibmFjaGdld2FjaHNlbi5cbiIpOworICAgICAgcmV0dXJuIC4uLiA7CisgICAgfQorCitCRU1FUktVTkdFTjoKKyAgICBEaWUgZ2VuYXVlbiBaZWl0ZGF1ZXJuIGtvZW5uZW4gdm9uIFNwaWVsZXJuIGJlZWluZmx1c3N0IHdlcmRlbiwgc2llCisgICAgdW50ZXJsaWVnZW4gZGVyIGpld2VpbGlnZW4gRWluc3RlbGx1bmcgdm9uICdzcHJ1Y2hlcm11ZWR1bmcnLCBkLmguIGtvZW5uZW4KKyAgICBhdWYgdm9sbGUgMnMgYXVmZ2VydW5kZXQgd2VyZGVuLgorICAgIEF1Y2ggd2VubiBkaWVzZSBGdW5rdGlvbiB6dW0gVmVyd2FsdGVuIHZvbiBiZWxpZWJpZ2VuIFplaXRzcGVycmVuIGdlbnV0enQKKyAgICB3ZXJkZW4ga29lbm5lbiwgYmVzY2hyYWVua3QgZXVjaCBiaXR0ZSBhdWYgU3BydWNoZXJtdWVkdW5nZW4gdW5kIGJlbnV0enQKKyAgICBhbnNvbnN0ZW4gY2hlY2tfYW5kX3VwZGF0ZV90aW1lZF9rZXkoKS4gRmFsbHMgaWhyIGRpZXNiemdsLiB3ZWl0ZXJlL2FuZGVyZQorICAgIFd1ZW5zY2hlIGhhYnQsIHNwcmVjaHQgZGVuL2RpZSBNdWRsaWItRU0gYW4uCisKK1NJRUhFIEFVQ0g6CisgICAgU2V0U3BlbGxGYXRpZ3VlKEwpLCBEZWxldGVTcGVsbEZhdGlndWUoTCkKKyAgICBQX05FWFRfU1BFTExfVElNRQorICAgIHNwcnVjaGVybXVlZHVuZworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisyNy4wMy4yMDEwLCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0NsZWFyUmluZ0J1ZmZlciBiL2RvYy9sZnVuL0NsZWFyUmluZ0J1ZmZlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDk1ZGVjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vQ2xlYXJSaW5nQnVmZmVyCkBAIC0wLDAgKzEsMzQgQEAKK0NsZWFyUmluZ0J1ZmZlcigpCisKK0ZVTktUSU9OOgorICAgIHByb3RlY3RlZCBzdHJ1Y3Qgc3RkX3JpbmdidWZmZXIgQ2xlYXJSaW5nQnVmZmVyKHN0cnVjdCBzdGRfcmluZ2J1ZmZlciBiKTsKKworREVGSU5JRVJUIElOOgorICAgIC9zdGQvdXRpbC9yaW5nYnVmZmVyLmMKKyAgICAvc3lzL3V0aWwvcmluZ2J1ZmZlci5oCisKK0FSR1VNRU5URToKKyAgICBiIC0gZGVyIHp1IGxvZXNjaGVuZGUgUmluZ3B1ZmZlcgorCitCRVNDSFJFSUJVTkc6CisgICAgRGllc2UgRnVua3Rpb24gbG9lc2NodCBhbGxlIERhdGVuIGF1cyBkZW0gUHVmZmVyIDxiPiB1bmQgcmUtaW5pdGlhbGlzaWVydAorICAgIGlobi4KKyAgICAKK1JVZUNLR0FCRVdFUlQ6CisgICAgRGVyIGdlbG9lc2NodGUgUHVmZmVyIDxiPiB3aXJkIHdpZWRlciB6dXJ1ZWNrZ2VnZWJlbi4KKworQkVJU1BJRUxFOgorICAgIC8vIFJpbmdwdWZmZXIgYW5sZWdlbjoKKyAgICBzdHJ1Y3Qgc3RkX3JpbmdidWZmZXIgYnVmZmVyPUNyZWF0ZVJpbmdCdWZmZXIoMTAsIE1PREVfRklGTyk7CisgICAgLy8gbWl0IGlyZ2VuZHdlbGNoZW4gRGF0ZW4gZnVlbGxlbi4uLgorICAgIC8vIC4uLgorICAgIC8vIFB1ZmZlciBsb2VzY2hlbgorICAgIGJ1ZmZlciA9IENsZWFyUmluZ0J1ZmZlcihidWZmZXIpOworICAgIC8vIG9kZXI6CisgICAgQ2xlYXJSaW5nQnVmZmVyKGJ1ZmZlcik7CisKK1NJRUhFIEFVQ0g6CisgICAgQ3JlYXRlUmluZ0J1ZmZlcigpLCBSaW5nQnVmZmVyR2V0KCksIFJlc2l6ZVJpbmdCdWZmZXIoKQorCisyMy4wNS4yMDA4LCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0NvbmZpZ3VyZSBiL2RvYy9sZnVuL0NvbmZpZ3VyZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzYzOTk5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vQ29uZmlndXJlCkBAIC0wLDAgKzEsNzYgQEAKK0NvbmZpZ3VyZSgpCisKKyAgcHVibGljIG1peGVkIENvbmZpZ3VyZShtaXhlZCBkYXRhKQorCitERUZJTklFUlQgSU46CisgICBCZWxpZWJpZ2VuIE9iamVrdGVuCisKK0FSR1VNRU5URToKKyAgIDxkYXRhPgorICAgICAwIGZ1ZXIgRGF0ZW5hYmZyYWdlCisgICAgIGJlbGllYmlnZSBEYXRlbiwgZGllIGVpbiBDb25maWd1cmUoMCkgdm9yaGVyIGxpZWZlcnRlCisKK0JFU0NIUkVJQlVORzoKKyAgIFZpZWxlIE9iamVrdGUgd2VyZGVuIGZ1ZXIgYmVzdGltbXRlIFNwaWVsZXIga29uZmlndXJpZXJ0IHVuZCBzbworICAgcGVyc29uYWxpc2llcnQuIFNpZSBlbnRoYWx0ZW4genVzYWV0emxpY2ggenUgZGVuIERhdGVuLCB3ZWxjaGUgd2FlaHJlbmQgZGVzCisgICBjcmVhdGUoKSBnZXNldHp0IHd1cmRlbiwgbm9jaCB3ZWl0ZXJlIHNwaWVsZXItaW5kaXZpZHVlbGxlIERhdGVuLgorICAgRGFtaXQgZGllc2UgT2JqZWt0ZSBpbSBCZWRhcmZzZmFsbCBuZXUgZXJzdGVsbHQgd2VyZGVuIGtvZW5uZW4sIHNvbGx0ZSBlaW4KKyAgIGdlZWlnbmV0ZXMgQ29uZmlndXJlKCkgZGVmaW5maWVydCB3ZXJkZW4sIHVtIGRpZXNlIERhdGVuIGFienVydWZlbiB1bmQgaW4KKyAgIGVpbmVtIG5ldWVuIENsb25lIChvZGVyIG5ldWdlbGFkZW5lciBCbHVlcHJpbnQpIHdpZWRlciB6dSBzZXR6ZW4uCisgICAKKyAgIEV4aXN0aWVydCBDb25maWd1cmUoKSBpbSBPYmpla3QsIE1VU1MgZGllc2VzIGJlaSBlaW5lbSBBdWZydWYgbWl0CisgICA8ZGF0YT49PTAgKGQuaC4gQ29uZmlndXJlKDApKSBhbGxlIGluZGl2aWR1ZWxsZW4gRGF0ZW4genVydWVja2xpZWZlcm4sCisgICBkaWUgbm9ldGlnIHNpbmQsIHVtIGRlbiBha3R1ZWxsZW4gWnVzdGFuZCBkZXMgT2JqZWt0ZXMgc3BhZXRlcgorICAgd2llZGVyaGVyenVzdGVsbGVuLgorICAgRGFzIE9iamVrdCBkYXJmIG5hY2ggZGVtIFp1cnVlY2tnZWJlbiBkaWVzZXIgRGF0ZW4gZGllc2UgTklDSFQgbWVocgorICAgdmVyYWVuZGVybiwgZC5oLiBlcyBtdXNzIGdnZi4gZWluZSBLb3BpZSBlcnN0ZWxsdCB3ZXJkZW4gKGNvcHksIGRlZXBfY29weSkKKworICAgR2VuYXUgZGllc2UgRGF0ZW4gd2VyZGVuIGluIGVpbmVtIG5ldSBnZWNsb250ZW4gT2JqZWt0IGR1cmNoIGRlbiBBdWZydWYKKyAgIHZvbiBDb25maWd1cmUoZGF0YSkgd2llZGVyIGdlc2V0enQuIERhcyBDb25maWd1cmUgTVVTUyBnZW5hdSBkaWUgRGF0ZW4sIGRpZQorICAgZXMgaW0gYWx0ZW4gT2JqZWt0IHp1cnVlY2tsaWVmZXJ0LCB3aWVkZXIgYWt6ZXB0aWVyZW4uCisKK1JVZUNLR0FCRVdFUlQ6CisgICBXZW5uIDxkYXRhPj09MDoKKyAgICAgQWxsZSBpbmRpdmlkdWVsbGVuIERhdGVuIGluIGVpbmVyIGJlbGllYmlnZW4gRm9ybS4gRWluIE1hcHBpbmcgYmlldGV0CisgICAgIHNpY2ggamVkb2NoIGFuLgorICAgICBOaWNodCBlcmxhdWJ0IHNpbmQ6IE9iamVrdGUgdW5kIENsb3N1cmVzLgorCisgICBXZW5uIDxkYXRhPiE9MDoKKyAgICAgMSwgd2VubiBkaWUgRGF0ZW4genVyIEtvbmZpZ3VyYXRpb24gYWt6ZXB0aWVydCB3dXJkZW4uCisgICAgIDAsIHNvbnN0LgorCitCRU1FUktVTkdFTjoKKyAgIENvbmZpZ3VyZSgpIGlzdCBuaWNodCB2ZXJwZmxpY2h0ZXQsIGVybmV1dCBEYXRlbiB6dSBha3plcHRpZXJlbiwgd2VubiBlcworICAgYmVyZWl0cyBlaW5tYWwgbWl0IGd1ZWx0aWdlbiBEYXRlbiBhdWZnZXJ1ZmVuIHd1cmRlLgorICAgRGFzIFp1cnVlY2tzY2hyZWliZW4gZGVyIERhdGVuIGthbm4gYXVjaCBuYWNoIEFibGF1ZiBsYWVuZ2VyZXIgWmVpdAorICAgdW5kL29kZXIgaW4gZWluZXIgYW5kZXJlbiBVcHRpbWUgZXJmb2xnZW4uCisKK0JFSVNQSUVMRToKKyAgIEVpbiBPYmpla3QsIHdlbGNoZXMgZWluIGFuZGVyZXMgT2JqZWt0IHNpY2hlciBlcnNldHp0LCBkLmguIGRpZQorICAgaW5kaXZpZHVlbGxlIEtvbmZpZ3VyYXRpb24gYmxlaWJ0IGVyaGFsdGVuOgorICAgbWl4ZWQgZGF0YTsKKyAgIGlmIChjYWxsX3Jlc29sdmVkKGRhdGEsb2IsIkNvbmZpZ3VyZSIsMCkgPT0gMSkgeworICAgICBzdHJpbmcgb2JuYW1lID0gbG9hZF9uYW1lKG9iKTsKKyAgICAgb2ItPnJlbW92ZSgpOworICAgICBvYiA9IGNsb25lX29iamVjdChvYm5hbWUpOworICAgICBpZiAoZGF0YSkgeworICAgICAgIGlmIChvYi0+Q29uZmlndXJlKGRhdGEpID09IDEpIHsKKyAgICAgICAgIHByaW50ZigiSW5zdGFueiB2b24gJXMgZXJmb2xncmVpY2ggZXJzZXR6dCwgbmV1ZXMgT2JqZWt0OiAlT1xuIiwKKyAgICAgICAgICAgICBvYm5hbWUsb2IpOworICAgICAgIH0KKyAgICAgICBlbHNlIHsKKyAgICAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIkNvbmZpZ3VyZSgpIGluICVPIGFremVwdGllcnRlIERhdGVuIG5pY2h0IVxuIiwKKyAgICAgICAgICAgICBvYikpOworICAgICAgIH0KKyAgICAgfQorICAgfQorICAgZWxzZSB7CisgICAgIHByaW50ZihicmVha19zdHJpbmcoCisgICAgICAgICAiRGFzIE9iamVrdCAlTyBkZWZpbmllcnQga2VpbmUgRnVua3Rpb24gQ29uZmlndXJlKCkuIEVzIGthbm4gIgorICAgICAgICAgIm5pY2h0IHNpY2hlciBlcnNldHp0IHdlcmRlbiwgZGEgdW5iZWthbm50IGlzdCwgb2IgZXMgaW5kaXZpZHVlbGxlICIKKyAgICAgICAgICJEYXRlbiBlbnRoYWVsdC4iLDc4KSk7CisgICB9CisKK0xFVFpURSBBZU5ERVJVTkc6CisyNi4wOS4yMDExLCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0NvbnZNYXRlcmlhbExpc3QgYi9kb2MvbGZ1bi9Db252TWF0ZXJpYWxMaXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNDYxOGEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9Db252TWF0ZXJpYWxMaXN0CkBAIC0wLDAgKzEsNDEgQEAKK0NvbnZNYXRlcmlhbExpc3QoKQorRlVOS1RJT046CisgICAgIHZhcmFyZ3Mgc3RyaW5nIENvbnZNYXRlcmlhbExpc3QobWl4ZWQgbWF0cywgaW50IGNhc3VzLCBtaXhlZCBpZGluZikKKworREVGSU5JRVJUIElOOgorICAgICAvcC9kYWVtb24vbWF0ZXJpYWxkYi5jIChNQVRFUklBTERCKQorCitBUkdVTUVOVEU6CisgICAgIG1peGVkIG1hdHM6ICAtIGRhcyB6dSBlcmtlbm5lbmRlIE1hdGVyaWFsOgorICAgICAgICAgICAgICAgICAgICAtIGVpbiBNYXBwaW5nLCBlaW4gU3RyaW5nIG9kZXIgZWluIFN0cmluZ2FycmF5CisgICAgICAgICAgICAgICAgICAgICAgKFtNQVRfQTp5LE1BVF9COngsLi5dKSBvZGVyIE1BVF9BIG9kZXIgKHtNQVRfQSxNQVRfQiwuLn0pCisgICAgIGludCBjYXN1czogICAtIGRlciBGYWxsOiAwLi4zIC0+IDxsYW5ndWFnZS5oPjogV0FTLCBXRVNTRU4sIFdFTSwgV0VOCisgICAgIG1peGVkIGlkaW5mICAtIERpbmdlLCB3ZWxjaGUgZGllIEZhZWhpZ2tlaXRlbiBkZXMgRXJrZW5uZW5zIGJlZWluZmx1c3NlbgorCQkgICAgKHNpZWhlICJtYW4gTWF0ZXJpYWxMaXN0IikKKworQkVTQ0hSRUlCVU5HOgorICAgICBNYW4gdWViZXJnaWJ0IENvbnZNYXRlcmlhbExpc3QoKSBlaW5lIExpc3RlIHZvbiBNYXRlcmlhbGllbiwgZGllIGRpZQorICAgICBGdW5rdGlvbiB1bnRlciBWZXJ3ZW5kdW5nIHZvbiBNYXRlcmlhbE5hbWUoKSBpbiBpaHJlIEJlc3RhbmR0ZWlsZQorICAgICBhdWZzcGxpdHRldCB1bmQgbWl0ICJ1bmQiIHVuZCAiLCIgdmVya251ZXBmdCB6dXJ1ZWNrZ2lidC4KKworUlVFQ0tHQUJFV0VSVDoKKyAgICAgc3RyaW5nIC0gTWF0ZXJpYWxpZW4sIGR1cmNoIEtvbW1hIHVuZCAidW5kIiBnZXRyZW5udCBvZGVyCisgICAgICAgICAgICAgICJ1bmJla2FubnRlcyBNYXRlcmlhbCIKKworQkVNRVJLVU5HRU46CisgICAgIFdpcmQgdm9uIC9zdGQvdGhpbmcvZGVzY3JpcHRpb246Ok1hdGVyaWFsTGlzdCgpIGdlcnVmZW4uCisgICAgIEJpdHRlIGFuIE9iamVrdGVuIGF1Y2ggTWF0ZXJpYWxMaXN0KCkgdmVyd2VuZGVuLgorICAgICBSdWZ0IGRpcmVrdCBNYXRlcmlhbE5hbWUoKSBhdWYuCisKK1NJRUhFIEFVQ0g6CisgICAgIEtvbnplcHRlOgkgIG1hdGVyaWFsLCBtYXRlcmlhbGVya2VubnVuZworICAgICBHcnVuZGxlZ2VuZDogUF9NQVRFUklBTCwgL3N5cy90aGluZy9tYXRlcmlhbC5oCisgICAgIE1ldGhvZGVuOiAgICBRdWVyeU1hdGVyaWFsKCksIFF1ZXJ5TWF0ZXJpYWxHcm91cCgpLCBNYXRlcmlhbExpc3QoKSwKKyAgICAgTGlzdGVuOgkgIEFsbE1hdGVyaWFscygpLCBBbGxHcm91cHMoKSwgRHVtcCgpCisJCSAgbWF0ZXJpYWxsaXN0ZSwgbWF0ZXJpYWxncnVwcGVuCisgICAgIE1hc3RlcjoJICBBZGRNYXRlcmlhbCgpLCBNYXRlcmlhbEdyb3VwKCksCisJCSAgR3JvdXBOYW1lKCksIE1hdGVyaWFsTmFtZSgpLAorCQkgIEdldEdyb3VwTWVtYmVycygpLCBHZXRNYXRNZW1iZXJzaGlwKCkKKyAgICAgU29uc3RpZ2VzOgkgIFBfTUFURVJJQUxfS05PV0xFREdFCisKKzcuIE1haSAyMDA0IEdsb2luc29uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vQ3JlYXRlUmluZ0J1ZmZlciBiL2RvYy9sZnVuL0NyZWF0ZVJpbmdCdWZmZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ3MWFmNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0NyZWF0ZVJpbmdCdWZmZXIKQEAgLTAsMCArMSw0NSBAQAorQ3JlYXRlUmluZ0J1ZmZlcigpCisKK0ZVTktUSU9OOgorICAgIHByb3RlY3RlZCBzdHJ1Y3Qgc3RkX3JpbmdidWZmZXIgQ3JlYXRlUmluZ0J1ZmZlcihpbnQgc2l6ZSwgaW50IG5ld21vZGUpOworCitERUZJTklFUlQgSU46CisgICAgL3N0ZC91dGlsL3JpbmdidWZmZXIuYworICAgIC9zeXMvdXRpbC9yaW5nYnVmZmVyLmgKKworQVJHVU1FTlRFOgorICAgIHNpemUgICAgLSBHcm9lc3NlIGRlcyBuZXVlbiBSaW5ncHVmZmVycyAoaW50KQorICAgIG5ld21vZGUgLSBBdXNnYWJlbW9kdXMgYmVpbSBBYnJ1ZmVuIGRlcyBQdWZmZXJzIChpbnQpOgorICAgICAgICAgICAgICBNT0RFX0ZJRk86IEZpcnN0LWluLUZpcnN0LU91dAorICAgICAgICAgICAgICBNT0RFX0xJRk86IExhc3QtaW4tRmlyc3QtT3V0CisKK0JFU0NIUkVJQlVORzoKKyAgICBEaWVzZSBGdW5rdGlvbiBlcnN0ZWxsdCBlaW5lbiBuZXVlbiwgbGVlcmVuIFJpbmdwdWZmZXIgZGVyIEdyb2Vzc2UgPHNpemU+CisgICAgdW5kIGxpZWZlcnQgaWhuIHp1cnVlY2suIERpZSBEYXRlbiBkZXMgUHVmZmVycyB3ZXJkZW4gc3BhZXRlciBnZW1hZXNzCisgICAgPG5ld21vZGU+IHNvIGdlc3BlaWNoZXJ0LCBkYXNzIGJlaSBkZXIgQXVzZ2FiZSBkZXMgUHVmZmVycyBtaXR0ZWxzCisgICAgUmluZ0J1ZmZlckdldCgpIGRpZSBlbnR3ZWRlciBkaWUgbmV1ZXN0ZW4gRGF0ZW4genVlcnN0IChNT0RFX0xJRk8pIG9kZXIKKyAgICBkaWUgYWVsdGVzdGVuIERhdGVuIHp1ZXJzdCAoTU9ERV9GSUZPKSBnZWxpZWZlcnQgd2VyZGVuLgorCitSVWVDS0dBQkVXRVJUOgorICAgIERlciBuZXVlIFJpbmdwdWZmZXIuIERpZXNlciB3aXJkIGluIGVpbmVyIFN0cnVjdCBzdGRfcmluZ2J1ZmZlcgorICAgIGdlc3BlaWNoZXJ0LiBFciBpc3QgaW4gZWluZXIgVmFyaWFibGUgJ21peGVkJyBvZGVyIGluIGVpbmVyIG1pdHRlbHMKKyAgICAnc3RydWN0IHN0ZF9yaW5nYnVmZmVyJyBhbmdlbGVndGVuIFZhcmlhYmxlIHNwZWljaGVyYmFyLgorCitCRU1FUktVTkdFTjoKKyAgICBEZXIgZ2VsaWVmZXJ0ZSBSaW5ncHVmZmVyIHNvbGx0ZSBuaWNodCBwZXIgSGFuZCB2ZXJhcmJlaXRldCBvZGVyCisgICAgZ2VuYWVuZGVydCB3ZXJkZW4sIHNvbmRlcm4gbnVyIHVlYmVyIGRpZSBWZXJ3YWx0dW5nc2Z1bmt0aW9uZW4gYXVzCisgICAgL3N0ZC91dGlsL3JpbmdidWZmZXIuYy4KKworQkVJU1BJRUxFOgorICAgIC8vIFZhcmlhYmxlIGFubGVnZW46CisgICAgc3RydWN0IHN0ZF9yaW5nYnVmZmVyIGJ1ZmZlcjsKKyAgICAvLyBfb2Rlcl86IG1peGVkIGJ1ZmZlcjsKKyAgICAvLyBuZXVlbiBQdWZmZXIgbWl0IG1heC4gNTAgRWxlbWVudGVuIGFubGVnZW4sIGRlciBiZWkgZGVyIEFiZnJhZ2UgZGllCisgICAgLy8gYWVsdGVzdGVuIERhdGVuIHp1ZXJzdCB6dXJ1ZWNrbGllZmVydDoKKyAgICBidWZmZXIgPSBDcmVhdGVSaW5nQnVmZmVyKDUwLCBNT0RFX0ZJRk8pOworCitTSUVIRSBBVUNIOgorICAgIFJpbmdCdWZmZXJQdXQoKSwgUmluZ0J1ZmZlckdldCgpLCBSZXNpemVSaW5nQnVmZmVyKCkKKworMjMuMDUuMjAwOCwgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9DdXN0b21pemVPYmplY3QgYi9kb2MvbGZ1bi9DdXN0b21pemVPYmplY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIzNTA5MgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0N1c3RvbWl6ZU9iamVjdApAQCAtMCwwICsxLDUyIEBACitDdXN0b21pemVPYmplY3QoKQorCitGVU5LVElPTjoKKyAgIHN0cmluZyBDdXN0b21pemVPYmplY3QoKTsKKworREVGSU5JRVJUIElOOgorICAgL3N0ZC92aXJ0dWFsL3ZfY29tcGlsZXIuYworCitBUkdVTUVOVEU6CisgICBrZWluZQorCitSVWVDS0dBQkVXRVJUOgorICAgRGVuIE9iamVrdG5hbWVuLCBkZW4gZGFzIHp1bGV0enQgZXJ6ZXVndGUgT2JqZWt0ICh3ZWxjaGVzIGdlcmFkZSBkaWUKKyAgIEZ1bmt0aW9uIGF1ZnJ1ZnQpIHNwYWV0ZXIgdm9tIERyaXZlciBiZWtvbW1lbiB3aXJkLgorCitCRVNDSFJFSUJVTkc6CisgICBEaWVzZSBGdW5rdGlvbiBpc3QgYXVzIGRlbSBHcnVuZGUgZGEsIGRhIHp1bSBaZWl0cHVua3QgZGVzIENsb25lbnMgZGVzCisgICBWQy1PYmpla3RlcyAoUF9TVERfT0JKRUNUKSBkaWVzZXMgT2JqZWt0IGphIG5vY2ggbmljaHQgd2Vpc3MgV2VyCisgICBvZGVyIFdhcyBlcyBzcGFldGVyIG1hbCBzZWluIHdpcmQuCisgICBEZXNoYWxiIGthbm4gZGllc2VzIFZDLU9iamVrdCBpbSBjcmVhdGUoKSAodW5kIG51ciBkYSEpIGRpZSBGdW5rdGlvbgorICAgQ3VzdG9taXplT2JqZWN0KCkgaW4gZGVtIHZpcnR1YWxfY29tcGlsZXIgYXVmcnVmZW4sIHdlbGNoZXMgZGFzIE9iamVrdAorICAgZ2VjbG9udCBoYXQgdW5kIGJla29tbXQgdm9uIGRpZXNlbSBkZW4gT2JqZWt0bmFtZW4genVyZWNrLCB3ZWxjaGVzIGVzCisgICBzcGFldGVyIG1hbCBiZWtvbW1lbiB3aXJkLgorICAgRGEgZGFzIFZDLU9iamVrdCB2b20gVkMgZ2VjbG9udCB3dXJkZSwgaXN0IHByZXZpb3VzX29iamVjdCgpIGltIGNyZWF0ZSgpCisgICBkZXMgVkMtT2JqZWt0ZXMgZGVyIFZDLCBpbiBkZW0gbWFuIEN1c3RvbWl6ZU9iamVjdCgpIHJ1ZnQuCisKK0JFTUVSS1VOR0VOOgorICAgRGFzIEN1c3RvbWl6ZU9iamVjdCgpIGltIFN0YW5kYXJkLVZDIGdpYnQgbnVyIGRlbiB6dWt1ZW5mdGlnZW4gT2JqZWt0bmFtZW4KKyAgIHp1cnVlY2sgdW5kIG1hY2h0IHNvbnN0IG5peC4KKworQkVJU1BJRUxFOgorICAgY3JlYXRlKCkgZWluZXMgVkMtT2JqZWt0ZXM6CisgICAKKyAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZSgpIHsKKyAgICAgLi4uCisgICAgIAorICAgICAvLyB3ZXIgYmluIGljaCBkZW5uIGVpZ2VudGxpY2g/CisgICAgIHN0cmluZyBteW5hbWUgPSBwcmV2aW91c19vYmplY3QoKS0+Q3VzdG9taXplT2JqZWN0KCk7CisgICAgIHN3aXRjaChteW5hbWUpIHsKKyAgICAgICAvLyBLcmFtIGtvbmZpZ3VyaWVyLCBqYSBuYWNoIG15bmFtZS4uLiAKKyAgICAgfQorICAgICAKKyAgICAgLi4uCisgICB9CisKK1NJRUhFIEFVQ0g6CisgICAgIHZpcnR1YWxfY29tcGlsZXIKKyAgICAgQ3VzdG9taXplT2JqZWN0KCksIFZhbGlkYXRlKCksIE5vUGFyYU9iamVjdHMoKSwgCisgICAgIFBfQ09NUElMRVJfUEFUSCwgUF9QQVJBCisgICAgIC9zdGQvdmlydHVhbC92X2NvbXBpbGVyLmMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzIxLjEwLjIwMDcsIFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0RhbWFnZSBiL2RvYy9sZnVuL0RhbWFnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjU4NTMxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vRGFtYWdlCkBAIC0wLDAgKzEsMzQgQEAKK0RhbWFnZSgpCisKK0ZVTktUSU9OOgorICAgICBpbnQgRGFtYWdlKGludCBkYW0pOworCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvYXJtb3VyL2NvbWJhdC5jIHVuZAorICAgICAvc3RkL3dlYXBvbi9jb21iYXQuYworCitBUkdVTUVOVEU6CisgICAgIGRhbSAgRGVyIFdlcnQsIG1pdCBkZW0gZGllIFdhZmZlL1J1ZXN0dW5nIGJlc2NoYWVkaWcgd2VyZGVuIHNvbGwuCisKK0JFU0NIUkVJQlVORzoKKyAgICAgUF9XQyBiencuIFBfQUMgd2lyZCB1bSBkYW0gcmVkdXppZXJ0IHVuZCBQX0RBTUFHRUQgd2lyZCB1bQorICAgICBkYW0gZXJob2VodC4KKyAgICAgQmVpIGRhbT4wIHdpcmQgZGFzIE9iamVrdCBiZXNjaGFlZGlndCwgYmVpIGRhbTwwIHJlcGFyaWVydC4KKyAgICAgRGFiZWkgd2VyZGVuIHNvd29obCBkaWUgT2JlcmdyZW56ZW4gKHMuIC9zeXMvY29tYmF0LmgpIHdpZSBhdWNoCisgICAgIGRpZSBVbnRlcmdyZW56ZW4gKFdhZmZlbjozMCwgUnVlc3R1bmdlbjogMCkgZnVlciBQX1dDIHVuZCBQX0FDCisgICAgIGJlYWNodGV0LiBFcyBrYW5uIGF1Y2ggbmljaHQgbWVociByZXBhcmllcnQgd2VyZGVuLCBhbHMgdm9yaGVyCisgICAgIGJlc2NoYWVkaWd0IHd1cmRlLgorCitSVWVDS0dBQkVXRVJUOgorICAgICBEZXIgV2VydCBkZXIgQmVzY2hhZWRpZ3VuZywgZGllIHRhdHNhZWNobGljaCB2b3JnZW5vbW1lbiB3dXJkZS4KKworQkVNRVJLVU5HRU46CisgICAgIElzdCBkYXMgT2JqZWt0IGluIEJlbnV0enVuZywgc2V0enQgZGllIEZ1bmt0aW9uIERhbWFnZSBhdXRvbWF0aXNjaAorICAgICBkaWUgUHJvcGVydGllcyBQX1RPVEFMX1dDIGJ6dy4gUF9UT1RBTF9BQyBpbiBkZW0gYmVudXR6ZW5kZW4gU3BpZWxlcgorICAgICBhdWYgZGllIHJpY2h0aWdlbiBXZXJ0ZS4KKworU0lFSEUgQVVDSDoKKyAgICAgL3N0ZC9hcm1vdXIvY29tYmF0LmMsIC9zdGQvd2VhcG9uL2NvbWJhdC5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFRodSBNYXkgMjIgMTA6MTM6MjMgMTk5NyBieSBQYXJhY2Vsc3VzCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9EZUFzc29jTWVtYmVyIGIvZG9jL2xmdW4vRGVBc3NvY01lbWJlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjM1MzI2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vRGVBc3NvY01lbWJlcgpAQCAtMCwwICsxLDQ4IEBACisKK0RlQXNzb2NNZW1iZXIoKQorCisKK0ZVTktUSU9OOgorICAgICAgICBpbnQgRGVBc3NvY01lbWJlcihvYmplY3QgbnBjKQorCitERUZJTklFUlQgSU46CisgICAgICAgIC9zdGQvbGl2aW5nL3RlYW0uYworCitBUkdVTUVOVEU6CisgICAgICAgIERlciBOUEMsIGRlciBuaWNodCBtZWhyIHp1Z2VvcmRuZXQgc2VpbiBzb2xsLgorCitCRVNDSFJFSUJVTkc6CisgICAgICAgIEhlYnQgZGllIFp1b3JkbnVuZyBlaW5lcyBOUENzIHp1IGVpbmVtIFNwaWVsZXIgYXVmLgorCitSVUVDS0dBQkVXRVJUOgorICAgICAgICAxLCBmYWxscyBBdWZoZWJ1bmcgZXJmb2xncmVpY2gsIHNvbnN0IDAuCisKK0JFSVNQSUVMOgorICAgICAgICB2b2lkIGZ1bihvYmplY3QgcGwpCisgICAgICAgIHsKKyAgICAgICAgIGlmICggcGwgJiYgcGwtPkRlQXNzb2NNZW1iZXIodGhpc19vYmplY3QoKSkgKQorICAgICAgICAgIHRlbGxfb2JqZWN0KHBsLGJyZWFrX3N0cmluZygKKyAgICAgICAgICAgICAgIkljaCBrYWVtcGZlIG51biBuaWNodCBtZWhyIGF1ZiBEZWluZXIgU2VpdGUhXG4iLDc4LAorICAgICAgICAgICAgICAiRWluIEZldWVydGV1ZmVsIHRlaWx0IERpciBtaXQ6Iik7CisgICAgICAgICAuLi4KKyAgICAgICAgfQorCitCRU1FUktVTkdFTjoKKyAgICAgICAgS2FubiBudXIgdm9uIEdpbGRlbiwgU3BlbGxib29rcywgdm9tIE9iamVrdCBzZWxiZXIgdW5kIHZvbQorICAgICAgICB6dWdlb3JkbmV0ZW4gTlBDIGF1ZmdlcnVmZW4gd2VyZGVuLgorCitTSUVIRSBBVUNIOgorICAgICAgICBVZWJlcnNpY2h0OiB0ZWFta2FtcGYKKyAgICAgICAgUHJvcGVydGllczogUF9URUFNLCBQX0FTU09DX01FTUJFUlMsIFBfVEVBTV9BVFRBQ0tfQ01ELAorICAgICAgICAgICAgICAgICAgICBQX1RFQU1fQVVUT0ZPTExPVywgUF9URUFNX0NPTE9SUywgUF9URUFNX0xFQURFUiwKKyAgICAgICAgICAgICAgICAgICAgUF9URUFNX05FV01FTUJFUiwgUF9URUFNX1dBTlRFRF9ST1csIFBfVEVBTV9XSU1QWV9ST1cKKyAgICAgICAgQmV3ZWd1bmc6ICAgSXNUZWFtTW92ZSwgVGVhbUZsZWUKKyAgICAgICAgTWl0Z2xpZWRlcjogSXNUZWFtTGVhZGVyLCBUZWFtTWVtYmVycworICAgICAgICBLYW1wZjogICAgICBBc3NvY01lbWJlciwgSW5zZXJ0RW5lbXlUZWFtLCBTZWxlY3ROZWFyRW5lbXksCisgICAgICAgICAgICAgICAgICAgIFNlbGVjdEZhckVuZW15CisgICAgICAgIFBvc2l0aW9uZW46IFByZXNlbnRQb3NpdGlvbiwgUHJlc2VudFJvd3MsIFByZXNlbnRFbmVteVJvd3MsCisgICAgICAgICAgICAgICAgICAgIFByZXNlbnRUZWFtUG9zaXRpb24sIFN3YXBSb3dzCisgICAgICAgIFNvbnN0aWdlczogIFRlYW1QcmVmaXgsIHRlYW1rYW1wZl9pbnRlcm4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogMTYtMDgtMjAxMCwgR2FieWxvbgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vRGVjbEFkaiBiL2RvYy9sZnVuL0RlY2xBZGoKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZlNDI0NAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0RlY2xBZGoKQEAgLTAsMCArMSw0NiBAQAorRGVjbEFkaigpCisKK0ZVTktUSU9OOgorICAgICB2YXJhcmdzIHN0cmluZyBEZWNsQWRqKCBzdHJpbmcgYWRqLCBpbnQgY2FzdXMsIGludCBkZW1vbik7CisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC90aGluZy9sYW5ndWFnZS5jCisKK0FSR1VNRU5URToKKyAgICAgYWRqCisgICAgICAgICAgRGFzIHp1IGRla2xpbmllcmVuZGUgQWRqZWt0aXYuCisKKyAgICAgY2FzdXMKKyAgICAgICAgICBEZXIgRmFsbCwgaW4gZGVuIGVzIGRla2xpbmllcnQgd2VyZGVuIHNvbGwuCisKKyAgICAgZGVtb24KKyAgICAgICAgICBCZXppZWh0IHNpY2ggZGFzIEFkamVrdGl2IGF1ZiBlaW5lbiBiZXN0aW1tdGVuIG9kZXIgZWluZW4KKyAgICAgICAgICB1bmJlc3RpbW10ZW4gR2VnZW5zdGFuZD8KKworQkVTQ0hSRUlCVU5HOgorICAgICBEZWtsaW5pZXJ0IGRhcyB1ZWJlcmdlYmVuZSBBZGpla3RpdiBpbiBkZW4gYW5nZWdlYmVuZW4gRmFsbC4gSXN0IGRlbW9uCisgICAgIHVuZ2xlaWNoIE51bGwsIHNvIHdpcmQgZGFzIEFkamVrdGl2IHNvIGJlaGFuZGVsdCwgYWxzIHd1ZXJkZSBlcyBzaWNoCisgICAgIGF1ZiBlaW5lbiBiZXN0aW1tdGVuIEdlZ2Vuc3RhbmQgYmV6aWVoZW4sIGFuc29uc3RlbiBiZXppZWh0IGVzIHNpY2ggYXVmCisgICAgIGVpbmVuIHVuYmVzdGltbXRlbiBHZWdlbnN0YW5kLgorCitSVWVDS0dBQkVXRVJUOgorICAgICBEYXMgZGVrbGluaWVydGUgQWRqZWt0aXYuIEVzIHdpcmQgenVzYWV0emxpY2ggbm9jaCBlaW4gTGVlcnplaWNoZW4KKyAgICAgaGludGVuIGFuZ2VmdWVndCEKKworQkVJU1BJRUxFOgorICAgICBadW5hZWNoc3QgZWluIGJlc3RpbW10ZXMgQWRqZWt0aXY6CisKKyAgICAgcHJpbnRmKCJEZXIgJXNCYWxsLlxuIiwgYmFsbC0+RGVjbEFkaigiZ3J1ZW4iLCBXRVIsIDEpOworCisgICAgIE51biBlaW4gdW5iZXN0aW1tdGVzIEFkamVrdGl2OgorCisgICAgIHByaW50ZigiRWluICVzQmFsbC5cbiIsIGJhbGwtPkRlY2xBZGooImdydWVuIiwgV0VSLCAwKTsKKworICAgICBEYSBEZWNsQWRqKCkgImdydWVuZSAiIGJ6dy4gImdydWVuZXIgIiB6dXJ1ZWNrZ2lidCwgZGFyZiB6d2lzY2hlbiBkZW0KKyAgICAgIiVzIiB1bmQgZGVtICJCYWxsIiBrZWluIExlZXJ6ZWljaGVuIHN0ZWhlbiEKKworU0lFSEUgQVVDSDoKKyAgICAgL3N0ZC90aGluZy9sYW5ndWFnZS5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFdlZCBNYXkgOCAxMDoxODowNSAxOTk2IGJ5IFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vRGVmZW5kIGIvZG9jL2xmdW4vRGVmZW5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMjI2NGEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9EZWZlbmQKQEAgLTAsMCArMSwxNTAgQEAKK0RlZmVuZCgpCitGVU5LVElPTjoKKyAgICAgcHVibGljIGludCBEZWZlbmQoaW50IGRhbSwgc3RyaW5nfHN0cmluZyogZGFtX3R5cGUsIGludHxtYXBwaW5nIHNwZWxsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCBlbmVteSkKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL2xpdmluZy9jb21iYXQKKworQVJHVU1FTlRFOgorICAgICBpbnQgZGFtICAgICAgICAgICAgICAgICAgaW5pdGlhbGUgU3RhZXJrZSBkZXMgQW5ncmlmZnMgKDEwIGRhbSB+IDEgSFApCisgICAgIHN0cmluZyogZGFtX3R5cGUgICAgICAgICBBcnQoZW4pIGRlcyBTY2hhZGVucywgZGVyIGFuZ2VyaWNodGV0IHdlcmRlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29sbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVzcyBlaW4gQXJyYXkgdm9uIFNjaGFkZW5zdHlwZW4gc2VpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGUgT2JqZWt0ZSB1ZWJlcmdlYmVuIGhpZXIgbWFuY2htYWwgc3RyaW5ncy4KKyAgICAgaW50L21hcHBpbmcgc3BlbGwgICAgICAgIC0gMCBmdWVyIG5vcm1hbGUgQW5ncmlmZmUgKGtlaW5lIFphdWJlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMSBmdWVyIFphdWJlciAoU3RhbmRhcmRydWVzdHVuZ2VuIGlnbm9yaWVyZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG1hcHBpbmcgZnVlciBtZWhyIEluZm9ybWF0aW9uZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhldXRlIGJpdHRlIG5hY2ggTW9lZ2xpY2hrZWl0IGVpbiBNYXBwaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZWJlcmdlYmVuLgorICAgICBvYmplY3QgZW5lbXkgICAgICAgICAgICAgZGVyIEZlaW5kL1NjaGFkZW52ZXJ1cnNhY2hlcgorCitCRVNDSFJFSUJVTkc6CisgICAgIDEuIEdlbmVyZWxsCisgICAgIFdlbm4gZGFzIExlYmV3ZXNlbiBhbmdlZ3JpZmZlbiB3aXJkLCB3aXJkIGdlcHJ1ZWZ0LCB3aWUgc3RhcmsgZGllCisgICAgIFJ1ZXN0dW5nZW4gdW5kIGtvZXJwZXJlaWdlbmVuIEFid2VocmtyYWVmdGUgc2luZCB1bmQgZGllIFN0YWVya2UgZGVzCisgICAgIFNjaGFkZW5zIGRlbWVudHNwcmVjaGVuZCB2ZXJtaW5kZXJ0LgorICAgICBHZ2YuIHdpcmQgZGVyIFNjaGFkZW4genVnZWZ1ZWd0IHVuZCBkZXIgRmVpbmQgaW4gIGRpZSBMaXN0ZSBkZXIgRmVpbmRlCisgICAgIGF1Zmdlbm9tbWVuLiBEZXIgU2NoYWRlbiBiZXRyYWVndDoKKyAgICAgIChkYW0tU3VtbWUoUnVlc3R1bmdzc3RhZXJrZW4pLXJhbmRvbShQX0JPRFkrQV9ERVgpKSpDaGVja1Jlc2lzdGFuY2UvMTAKKyAgICAgYWJlciBuaWNodCB1bnRlciAwLgorCisgICAgIDIuIERlciBQYXJhbWV0ZXIgJ3NwZWxsJworICAgICBJc3QgJ3NwZWxsJyAwLCBkYW5uIGdpbHQgZGVyIEFuZ3JpZmYgYWxzIG5vcm1hbGUgcGh5c2lzY2hlIEF0dGFja2UKKyAgICAgVWViZXJnaWJ0IG1hbiBhbHMgJ3NwZWxsJy1QYXJhbWV0ZXIgZWluIE1hcHBpbmcsIHNvIGdpYnQgZXMgZGFmdWVyCisgICAgIGRpdmVyc2UgRmxhZ3MsIGRpZSBkYXMgRXJnZWJuaXMgbWFuaXB1bGllcmVuIChpbiBuZXdfc2tpbGxzLmgKKyAgICAgZW50aGFsdGVuKS4gTmljaHRhbmdhYmUgZWluZXMgRmxhZ3MgZ2lsdCBhbHMgMC4KKworICAgICAtIFNQX1BIWVNJQ0FMX0FUVEFDSyAtLS0tLS0tLS0tIDAvMQorICAgICAgICAgICAgICAgIDEsIHdlbm4gUnVlc3R1bmdlbiB3aXJrZW4gc29sbGVuLCAwIHNvbnN0CisgICAgICAgICAgICAgICAgLT4gZW50c3ByaWNodCAhc3BlbGwsIHdlbm4gZGllc2VzIEludCBpc3QKKyAgICAgLSBTUF9OT19FTkVNWSAtLS0tLS0tLS0tLS0tLS0tLSAwLzEKKyAgICAgICAgICAgICAgICAxLCBmYWxscyBkZXIgQW5ncmlmZiBuaWNodCB0b2VkbGljaCBpc3QsIGVzIGFsc28ga2VpbmVuIGVjaHRlbgorICAgICAgICAgICAgICAgIEdlZ25lciBnaWJ0CisgICAgICAgICAgICAgICAgLT4gZXMgd2lyZCBkYW5uIHJlZHVjZV9oaXRfcG9pbnRzKCkgZ2VydWZlbiBzdGF0dCBkb19kYW1hZ2UoKQorICAgICAtIFNQX05PX0FDVElWRV9ERUZFTlNFIC0tLS0tLS0tIDAvMQorICAgICAgICAgICAgICAgIDEsIGZhbGxzIGFrdGl2ZSBBYndlaHJlbiAod2llIHp1cnVlY2tzY2hsYWdlbmRlIEFtdWxldHRlLAorICAgICAgICAgICAgICAgIEthcmF0ZWFid2VocmVuIG9kZXIgQXVzd2VpY2htYW5vZXZlcikgdW50ZXJibGVpYmVuIHNvbGxlbgorICAgICAgICAgICAgICAgIC0+IHpCIGJlaSBLcmF0emVuIGR1cmNoIERvcm5lbiBvZGVyIEZhbGwgYXVzIGdyb3NzZXIgSG9laGUKKyAgICAgICAgICAgICAgICAgICBpc3QgYWt0aXZlIEFid2VociBvZGVyIEF1c3dlaWNoZW4gdW5sb2dpc2NoCisgICAgIC0gU1BfUkVDVVJTSVZFIC0tLS0tLS0tLS0tLS0tLS0gMC8xCisgICAgICAgICAgICAgICAgMSwgZmFsbHMgZGVyIFNwZWxsIGF1cyBlaW5lbSBEZWZlbmQgZ2VydWZlbiB3dXJkZSAob2RlciBlaW5lcgorICAgICAgICAgICAgICAgIERlZmVuZEZ1bmMpCisgICAgICAgICAgICAgICAgLT4gdmVyaGluZGVydCBSZWt1cnNpb25zcHJvYmxlbWUKKyAgICAgLSBTUF9OQU1FIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzdHJpbmcKKyAgICAgICAgICAgICAgICBOYW1lIGRlcyBTcGVsbHMKKyAgICAgLSBTUF9SRURVQ0VfQVJNT1VSIC0tLS0tLS0tLS0tLSBNYXBwaW5nOiBrZXlzIEFUX1gvUF9CT0RZLCB2YWx1ZXMgaW50Pj0wCisgICAgICAgICAgICAgICAgRGllIFNjaHV0endpcmt1bmcgZHVyY2ggUF9BQy9NYWdpZSBlaW5lciBSdWVzdHVuZyB3aXJkCisgICAgICAgICAgICAgICAgdHlwYWJoYWVuZ2lnIHJlZHV6aWVydC4gQXVmYmF1IGVpbmVzIE1hcHBpbmdzIGltIEJlaXNwaWVsOgorICAgICAgICAgICAgICAgIChbQVRfQk9PVFM6IDAsICAvLyBTdGllZmVsIHNjaHVldHplbiBnYXIgbmljaHQKKyAgICAgICAgICAgICAgICAgIFBfQk9EWTogIDUwLCAgLy8gS29lcnBlciB6dSA1MCUKKyAgICAgICAgICAgICAgICAgIEFUX0JFTFQ6IDYwMCAgLy8gR3VlcnRlbCB6dSA2MDAlCisgICAgICAgICAgICAgICAgXSkKKyAgICAgICAgICAgICAgICAtPiBhbGxlICdmZWhsZW5kZW4nIEVpbnRyYWVnZSB3aXJrZW4gbm9ybWFsCisgICAgIC0gU1BfU0hPV19EQU1BR0UgLS0tLS0tLS0tLS0tLS0gMC8xIG9kZXIgQXJyYXkgdm9uIEFycmF5cworICAgICAgICAgICAgICAgIDAsIGZ1ZXIga2VpbmUgVHJlZmZlcm1lbGR1bmcsIDEgc29uc3QKKyAgICAgICAgICAgICAgICBJbiBlaW5lbSBBcnJheSBrb2VubmVuIEVyc2F0ei1UcmVmZmVybWVsZHVuZ2VuIGRlZmluaWVydAorICAgICAgICAgICAgICAgIHdlcmRlbi4gRm9ybWF0IGlzdDoKKyAgICAgICAgICAgICAgICAoeworICAgICAgICAgICAgICAgICAoeyBpbnQgbHBoaXQxLCBzdHJpbmcgbWVzc19tZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1lc3NfZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtZXNzX3Jvb20gfSksCisgICAgICAgICAgICAgICAgICh7IGxwaGl0MiwgbWVzc19tZSwgbWVzc19lbiwgbWVzc19yb29tIH0pLAorICAgICAgICAgICAgICAgICAuLi4KKyAgICAgICAgICAgICAgICAgKHsgbHBoaXRuLCBtZXNzX21lLCBtZXNzX2VuLCBtZXNzX3Jvb20gfSksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICB3b2JlaSBscGhpdDE8bHBoaXQyPC4uLjxscGhpdG4gc2VpbiBtdXNzLCBkLmguIGRhcyBBcnJheS0KKyAgICAgICAgICAgICAgICBBcnJheSBhdWZzdGVpZ2VuZCBzb3J0aWVydC4KKworICAgICAgICAgICAgICAgIElzdCBlaW4gVHJlZmZlciB4IExQIGhhcnQsIHdlcmRlbiBkaWUgTWVsZHVuZ2VuIGRlcyBscGhpdC0KKyAgICAgICAgICAgICAgICBBcnJheXMgYXVzZ2VnZWJlbiwgZGVzc2VuIFdlcnQgYW0gbmFlaGVzdGVuIHVudGVyIGRlbSBTY2hhZGVuCisgICAgICAgICAgICAgICAgbGllZ3QuCisKKyAgICAgICAgICAgICAgICBJbiBkZW4gTWVsZHVuZ2VuIG1lc3NfbWUgKGFuIGRlbiBHZXRyb2ZmZW5lbiksIG1lc3NfZW4gKGFuCisgICAgICAgICAgICAgICAgZGVuIEZlaW5kKSwgbWVzc19yb29tIChhbiBkaWUgcmVzdGxpY2hlbiBVbXN0ZWhlbmRlbikga29lbm5lbgorICAgICAgICAgICAgICAgIEVyc2F0enN0cmluZ3Mgd2llIGZvbGd0IHZlcndlbmRldCB3ZXJkZW46CisgICAgICAgICAgICAgICAgQFdFUjEvQFdFU1NFTjEvQFdFTTEvQFdFTjEgLSBuYW1lKGNhc3VzKSBkZXMgR2V0cm9mZmVuZW4gKFRPKQorICAgICAgICAgICAgICAgIEBXRVIyL0BXRVNTRU4yL0BXRU0yL0BXRU4yIC0gbmFtZShjYXN1cykgZGVzIEZlaW5kZXMgKGVuZW15KQorICAgICAtIEVJTkZPX0RFRkVORCAtLS0tLS0tLS0tLS0gTWFwcGluZworICAgICAgICAgICAgICAgIERpZXNlcyBNYXBwaW5nIGxpZWZlcnQgZXJ3ZWl0ZXJ0ZSBJbmZvcm1hdGlvbmVuIHp1IGRlbQorICAgICAgICAgICAgICAgIGJpc2hlcmlnZW4gQWJsYXVmIGRlcyBha3RpdmVuIEF0dGFja3MuCisgICAgICAgICAgICAgICAgRGllIHZlcmZ1ZWdiYXJlbiBJbmZvcm1hdGlvbmVuIHNpbmQgaW4gZGVyIE1hbnBhZ2UgenUKKyAgICAgICAgICAgICAgICBEZWZlbmRJbmZvIGZlc3RnZWhhbHRlbi4KKworICAgICAzLiBSZWloZW5mb2xnZW4gaW4gRGVmZW5kCisgICAgIC0gZGFzIExpdmluZyB3aXJkIGFuZ2VncmlmZmVuLCB3ZW5uCisgICAgICAgLSBQX05PX0FUVEFDSyAhPSAwCisgICAgICAgLSAnZW5lbXknIGV4aXN0aWVydCB1bmQga2VpbiBuZXR6dG90ZXIgU3BpZWxlciBpc3QKKyAgICAgLSBQX0RFRkVOREVSUyB3ZXJkZW4gZHVyY2hnZWdhbmdlbiAodW5kIGV2ZW50dWVsbCBiZW5hY2hyaWNodGlndCkKKyAgICAgLSBQX1RNUF9BVFRBQ0tfSE9PSyB3aXJkIGFiZ2VmcmFndAorICAgICAtIGRpZSBSdWVzdHVuZ2VuIHdlcmRlbiB2b20gU2NoYWRlbiBnZWdlYmVuZW5mYWxscyBhYmdlem9nZW4KKyAgICAgLSBtYWdpc2NoZXIgQXVzd2VpY2hza2lsbCBiZXJ1ZWNrc2ljaHRpZ3QKKyAgICAgLSBzZW5zaXRpdmUgT2JqZWt0ZSB3ZXJkZW4gZ2dmLiBiZW5hY2hyaWNodGlndAorICAgICAtIEludGVybmFsTW9kaWZ5RGVmZW5kIHdpcmQgZ2VydWZlbgorICAgICAtIEtvZXJwZXJhYndlaHIgYWJnZXpvZ2VuCisgICAgIC0gZGVyIFNjaGFkZW4gYW4gZG9fZGFtYWdlKCkvcmVkdWNlX2hpdF9wb2ludHMoKSB1ZWJlcmdlYmVuCisgICAgIC0gRmx1Y2h0IHVlYmVycHJ1ZWZlbiBtaXQgQ2hlY2tXaW1weUFuZEZsZWUoKQorCitCRU1FUktVTkdFTjoKKyAgICAgUnVlc3R1bmdlbiB3aXJrZW4ga29udmVudGlvbmVsbCBudXIsIHdlbm4gbWluZGVzdGVucyBlaW4gU2NoYWRlbnNhbnRlaWwKKyAgICAgbWVjaGFuaXNjaCBpc3QgdW5kIGVzIGtlaW4gU3BlbGwgb2RlciBlaW4gU3BlbGwgbWl0IFNQX1BIWVNJQ0FMX0FUVEFDSworICAgICBhdWYgMSBpc3QuCisKKyAgICAgRGVmZW5kKCkgYmVydWVja3NpY2h0aWd0IG1hZ2lzY2hlIFZlcnRlaWRpZ3VuZ2VuLCBkaWUgZGVyIFNwaWVsZXIgYmVpCisgICAgIHNpY2ggaGF0LCBzb2xsdGUgYWxzbyBhdXMgRmFpcm5lc3MgZ2VnZW51ZWJlciBkZW4gT2JqZWt0ZW4gYW5kZXJlcgorICAgICBNYWdpZXIgaW1tZXIgZGVtIGRpcmVrdGVuIHJlZHVjZV9oaXRfcG9pbnRzKCkgb2RlciBkb19kYW1hZ2UoKQorICAgICB2b3JnZXpvZ2VuIHdlcmRlbi4gTWl0dGVscyBkZXIgRmxhZ3MgaW4gJ3NwZWxsJyBrYW5uIG1hbiBzZWhyIHZpZWwKKyAgICAgYWVuZGVybi4KKworUlVFQ0tHQUJFV0VSVDoKKyAgICAgSG9laGUgZGVzIHRhdHNhZWNobGljaGVuIFNjaGFkZW5zLiBEaWVzIGthbm4gbWVociBzZWluIGFscyBkaWUKKyAgICAgTGViZW5zcHVua3RlIGRlcyBMZWJld2VzZW5zLgorCitCRUlTUElFTEUgKFNJRUhFIEFVQ0ggRGVmZW5kX2JzcCk6CisgICAgIC8vIGVpbiBzaW1wbGVyIEFuZ3JpZmY6CisgICAgIGVuZW0tPkRlZmVuZCgxMDAsICh7RFRfQkxVREdFT059KSwgMCwgdGhpc19vYmplY3QoKSk7CisKKyAgICAgLy8gZWluIG1hZ2lzY2hlciBBbmdyaWZmIChvaG5lIFRyZWZmZXJtZWxkdW5nKToKKyAgICAgZW5lbS0+RGVmZW5kKDEwMCwgKHtEVF9CTFVER0VPTiwgRFRfRklSRX0pLCAxLCB0aGlzX29iamVjdCgpKTsKKworICAgICAvLyBlaW4gbWFnaXNjaGVyIEFuZ3JpZmYgbWl0IFRyZWZmZXJtZWxkdW5nOgorICAgICBlbmVtLT5EZWZlbmQoMTAwLCAoe0RUX0JMVURHRU9OLCBEVF9GSVJFfSksIChbU1BfU0hPV19EQU1BR0U6MV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfb2JqZWN0KCkpOworCitTSUVIRSBBVUNIOgorICAgICBBbmdyaWZmOiAgIEF0dGFjayhMKSwgUF9OT19BVFRBQ0ssIEluc2VydEVuZW15KEwpCisgICAgIFNjaGFkZW46ICAgUF9FTkFCTEVfSU5fQVRUQUNLX09VVCwgUF9MQVNUX01PVkUsCisgICAgICAgICAgICAgICAgZG9fZGFtYWdlKEwpLCByZWR1Y2VfaGl0X3BvaW50cyhMKQorICAgICBTY2h1dHo6ICAgIFBfREVGRU5ERVJTLCBJbmZvcm1EZWZlbmQoTCksIERlZmVuZE90aGVyKEwpCisgICAgICAgICAgICAgICAgUF9BUk1PVVJTLCBQX0FDLCBQX0RFRkVORF9GVU5DLCBRdWVyeURlZmVuZChMKQorICAgICAgICAgICAgICAgIFBfQk9EWSwgQV9ERVgKKyAgICAgRGF0ZW46ICAgICBQX0xBU1RfQ09NQkFUX1RJTUUKKyAgICAgICAgICAgICAgICBQX0xBU1RfREFNVFlQRVMsIFBfTEFTVF9EQU1USU1FLCBQX0xBU1RfREFNQUdFCisgICAgICAgICAgICAgICAgUF9EQU1BR0VfTVNHCisgICAgIFJlc2lzdGVuejogUF9SRVNJU1RBTkNFX1NUUkVOR1RIUywgQ2hlY2tSZXNpc3RhbmNlKEwpCisgICAgIFNvbnN0aWdlczogQ2hlY2tTZW5zaXRpdmVBdHRhY2soTCkKKyAgICAgICAgICAgICAgICBJbnRlcm5hbE1vZGlmeURlZmVuZChMKQorICAgICAgICAgICAgICAgIFVzZVNraWxsKEwpLAorICAgICAgICAgICAgICAgIERlZmVuZEluZm8KKworMTUuMDkuMjAxMCwgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vRGVmZW5kRnVuYyBiL2RvYy9sZnVuL0RlZmVuZEZ1bmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA0M2UwNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0RlZmVuZEZ1bmMKQEAgLTAsMCArMSw3OCBAQAorRGVmZW5kRnVuYyhMKQorCitGVU5LVElPTjoKKyAgICAgaW50IERlZmVuZEZ1bmMoc3RyaW5nfHN0cmluZyAqZHR5cCwgaW50fG1hcHBpbmdzcGVsbCwgb2JqZWN0IGVuZW15KTsKKworREVGSU5JRVJUIElOOgorICAgICBlaWdlbmVuIE9iamVrdGVuOyBmdWVyIC9zdGQvYXJtb3VyL2NvbWJhdC5jCisKK0FSR1VNRU5URToKKyAgICAgZHR5cAorICAgICAgICAgIFNjaGFkZW5zdHlwZW4gZGVyIEFuZ3JpZmZzYXJ0LgorICAgICAgICAgIFNvbGx0ZSBoZXV0ZSBlaW4gc3RyaW5nKiBzZWluLgorICAgICBzcGVsbAorICAgICAgICAgIDAgYmVpIHZlcmFsdGV0ZW4ga29udmVudGlvbmVsbGVuIEFuZ3JpZmZlbiBpbSBSZWdlbGZhbGwgamVkb2NoCisgICAgICAgICAgZWluIE1hcHBpbmcgbWl0IHdlaXRlcmVuIEluZm9zLgorICAgICAgICAgIEJlaSBlaW5lbSBrb252ZW50aW9uZWxsZW4gQW5ncmlmZiBpc3Qgc3BlbGxbU1BfUEhZU0lDQUxfQVRUQUNLXSBnbGVpY2gKKyAgICAgICAgICAxLgorICAgICBlbmVteQorICAgICAgICAgIERlciBhbmdyZWlmZW5kZSBHZWduZXIKKworQkVTQ0hSRUlCVU5HOgorICAgICBBbmhhbmQgZGVyIHVlYmVyZ2ViZW5lbiBQYXJhbWV0ZXIga2FubiBoaWVyIGVpbiBSdWVzdHVuZ3Nib251cyAob2RlcgorICAgICBhdWNoIGVpbiBSdWVzdHVuZ3NtYWx1cykgZXJyZWNobmV0IHdlcmRlbiwgZGVyIHp1IGRlbSBub3JtYWxlbgorICAgICBSdWVzdHVuZ3N3ZXJ0IChhYmhhZW5naWcgdm9uIGRlciBBbmdyaWZmc2FydCkgaGluenVhZGRpZXJ0IHdpcmQuCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIERlciBSdWVzdHVuZ3Nib251cywgZGVyIHp1ciBSdWVzdHVuZ3NrbGFzc2UgYWRkaWVydCB3ZXJkZW4gc29sbC4KKworQkVNRVJLVU5HRU46CisgICAgIEF1Y2ggd2VubiBtYW4gZWluZSBEZWZlbmRGdW5jKCkgYmVudXR6dCwgZGFyZiBkZXIgUnVlY2tnYWJld2VydAorICAgICB6dXNhbW1lbiBtaXQgZGVyIFBfQUMgaW5zZ2VzYW10IG51ciBpbiBzZWhyIHNlbHRlbmVuLCB3b2hsZHVyY2gtCisgICAgIGRhY2h0ZW4gQXVzbmFobWVmYWVsbGVuIGRpZSBtYXhpbWFsIHp1bGFlc3NpZ2UgUF9BQyBmdWVyIGRpZXNlbgorICAgICBSdWVzdHVuZ3N0eXAgdWViZXJzY2hyZWl0ZW4uIEluIHNvbGNoZW4gQXVzbmFobWVmYWVsbGVuIGR1ZXJmZW4KKyAgICAgZGllIERlZmVuZEZ1bmNzIG5pY2h0IGtvbnN0YW50IHdpcmtlbi4KKworICAgICBCZWkgYWt0aXZlbSBadXJ1ZWNrc2NobGFnZW4gSU1NRVIgYXVmIEZsYWdzIHdpZSBTUF9SRUNVUlNJVkUgdW5kCisgICAgIFNQX05PX0FDVElWRV9ERUZFTlNFIHBydWVmZW4gdW5kIGdnZi4gYWJicmVjaGVuLgorCitCRUlTUElFTEU6CisgICAgIEVpbmUgUnVlc3R1bmcsIGRpZSBiZWkgQW5ncmlmZmVuIG1pdCBGZXVlciBpaHJlIHZvbGxlIFN0YWVya2UgZW50ZmFsdGV0CisgICAgIHVuZCBiZWkgQW5ncmlmZmVuIGR1cmNoIEdlaXN0ZXIgZ2VzY2h3YWVjaHQgd2lyZDoKKworICAgICB2b2lkIGNyZWF0ZSgpCisgICAgIHsKKyAgICAgICA6OmNyZWF0ZSgpOworCisgICAgICAgU2V0UHJvcChQX0FSTU9VUl9UWVBFLCBBVF9BUk1PVVIpOworICAgICAgIFNldFByb3AoUF9BQywgMjApOworICAgICAgIC4uLgorICAgICAgIC8vIERpZSBEZWZlbmRGdW5jKCkgaXN0IGluIGRlciBSdWVzdHVuZyBzZWxic3QgZGVmaW5pZXJ0CisgICAgICAgU2V0UHJvcChQX0RFRkVORF9GVU5DLCB0aGlzX29iamVjdCgpKTsKKyAgICAgfQorCisgICAgIGludCBEZWZlbmRGdW5jKHN0cmluZyAqZHR5cCwgbWl4ZWQgc3BlbGwsIG9iamVjdCBlbmVteSkKKyAgICAgeworICAgICAgIGludCBwcm90OworCisgICAgICAgLy8gWnVlcnN0IGZyYWdlbiB3aXIgZGVuIEFuZ3JpZmYgZHVyY2ggRmV1ZXIgYWI6CisgICAgICAgaWYgKG1lbWJlcihkdHlwLCBEVF9GSVJFKSA+PSAwKSAgLy8gRmV1ZXIgZ2Vob2VydCB6dSBkZW4gU2NoYWRlbnN0eXBlbgorICAgICAgICAgcHJvdCA9IDUgKyByYW5kb20oMTApOyAvLyBEYXMgZXJnaWJ0IG1heGltYWwgMTQuIFp1c2FtbWVuIG1pdCBQX0FDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtvbW10IG1hbiBhbHNvIG1heGltYWwgYXVmIDE0KzIwID0gMzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpZWd0IGFsc28gdW50ZXIgZGVyIGZ1ZXIgQVRfQVJNT1VSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdlbHRlbmRlbiBPYmVyZ3JlbnplCisKKyAgICAgICAvLyBVbmQgamV0enQgZGVyIEdlaXN0ZXJ0ZXN0CisgICAgICAgaWYgKGVuZW15LT5RdWVyeVByb3AoUF9SQUNFKSA9PSAiR2Vpc3QiIHx8CisgICAgICAgICAgIGVuZW15LT5pc19jbGFzc19tZW1iZXIoQ0xfR0hPU1QpKQorICAgICAgICAgcHJvdCAtPSByYW5kb20oMTApOworCisgICAgICAgLy8gRGVyIFJ1ZWNrZ2FiZXdlcnQgd2lyZCBhdWYgZGVuIGF1cyBQX0FDIGVycmVjaG5ldGVuIFdlcnQgZHJhdWZnZXNjaGxhZ2VuCisgICAgICAgcmV0dXJuIHByb3Q7CisgICAgIH0KKworU0lFSEUgQVVDSDoKKyAgICAgUF9ERUZFTkRfRlVOQywgUXVlcnlEZWZlbmQoKSwgL3N0ZC9hcm1vdXIvY29tYmF0LmMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogMTguSnVsIDIwMDYgTXVhZGliCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9EZWZlbmRJbmZvIGIvZG9jL2xmdW4vRGVmZW5kSW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjAzNTJhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vRGVmZW5kSW5mbwpAQCAtMCwwICsxLDE2OCBAQAorRGVmZW5kSW5mbworRlVOS1RJT046CisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N5cy9jb21iYXQuaAorCitBUkdVTUVOVEU6CisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGllIERlZmVuZEluZm9ybWF0aW9uZW4gd2VyZGVuIGltIFJ1bmRlIGVpbmVzIEF0dGFjay9EZWZlbmQgVm9yZ2FuZ3MgCisgICAgIGluIEF0dGFjayBpbml0aWFsIGFuZ2VsZWd0IHVuZCBkZW0gRGVmZW5kIHVlYmVyIGRlbiBQYXJhbWV0ZXIgc3BlbGwKKyAgICAgdWViZXJnZWJlbi4gSXN0IGRpZXNlciBQYXJhbWV0ZXIgZWluIE1hcHBpbmcsIHNvIHNpbmQgZGllIAorICAgICBEZWZlbmRJbmZvcm1hdGlvbmVuIHVlYmVyIGRlbiBLZXkgRUlORk9fREVGRU5EIHp1IGVyaGFsdGVuLgorICAgICBEaWUgSW5mb3JtYXRpb25lbiBsaWVnZW4gaW4gRm9ybSBlaW5lcyBNYXBwaW5ncyB2b3IuCisgICAgIFZvciBadWdyaWZmIHNvbGx0ZSBpbW1lciBhdWYgZGllIEV4aXN0ZW56IGRpZXNlcyBLZXlzIGluIGRlbSBNYXBwaW5nCisgICAgIGdlcHJ1ZWZ0IHdlcmRlbiwgZGEgbmljaHQgYWxsZSBJbmZvcm1hdGlvbmVuIGltbWVyIGV4aXN0aWVyZW4uCisgICAgIERpZSBLZXlzIHNpbmQgaW4gY29tYmF0LmggZGVmaW5pZXJ0IHVuZCBzaW5kIGZvbGdlbmRlOgorICAgICAKKyAgICBPUklHSU5BTF9BSU5GTyAtIE1hcHBpbmcgCisgICAgICAgIEhpZXIgaXN0IGVpbmUgS29waWUgZGVzIG9yaWdpbmFsZW4gYWluZm8tbWFwcGluZ3MgZGVzIEF0dGFja3MgCisgICAgICAgIHZvcmhhbmRlbiBtaXQgZm9sZ2VuZGVuIEVpbnRyYWVnZW46CisgICAgICAgIEltbWVyIHZvcmhhbmRlbmUgRWludHJhZWdlOgorICAgICAgICAgIFNJX0VORU1ZICAgICAgICAgICAgICBkZXIgYW5nZWdyaWZmZW5lIEdlZ25lcgorICAgICAgICAKKyAgICAgICAgQW5ncmlmZiBtaXQgZ2V6dWVja3RlciBXYWZmZToKKyAgICAgICAgICBQX1dFQVBPTiAgICAgICAgICAgICAgZGFzIFdhZmZlbm9iamVrdCBzZWxic3QKKyAgICAgICAgICBQX1dFQVBPTl9UWVBFICAgICAgICAgUF9XRUFQT05fVFlQRSBkZXIgV2FmZmUKKyAgICAgICAgICBQX1dDICAgICAgICAgICAgICAgICAgUF9XQyBkZXIgV2FmZmUKKyAgICAgICAgICBQX05SX0hBTkRTICAgICAgICAgICAgUF9OUl9IQU5EUyBkZXIgV2FmZmUKKyAgICAgICAgICBTSV9TS0lMTERBTUFHRV9UWVBFICAgUF9EQU1fVFlQRSBkZXIgV2FmZmUKKyAgICAgICAgICBTSV9TS0lMTERBTUFHRSAgICAgICAgd2FmZmUtPlF1ZXJ5RGFtYWdlKGVuZW15KQorICAgICAgICAgICAgIGJlaSB2b3JoYW5kZW5lbSBad2VpaGFuZHNraWxsIFNLX1RXT0hBTkRFRCB3aXJkIG51ciBkZXIgZHVyY2ggCisgICAgICAgICAgICAgZGVuIFNraWxsIG1vZGlmaXppZXJ0ZSBTY2hhZGVuc3dlcnQgdWViZXJub21tZW4KKyAgICAgICAgICBTSV9TS0lMTERBTUFHRV9NU0cgICAgIm1pdCAiK3dhZmZlLT5uYW1lKFdFTSwwKQorICAgICAgICAgIFNJX1NLSUxMREFNQUdFX01TRzIgICAibWl0ICIrd2FmZmUtPm5hbWUoV0VNLDEpCisgICAgICAgICAgU0lfU1BFTEwgICAgICAgICAgICAgIDAKKworICAgICAgICBBbmdyaWZmIG1pdCBibG9zc2VuIEhhZW5kZW46CisgICAgICAgICAgUF9XRUFQT05fVFlQRSAgICAgICAgIFdUX0hBTkRTCisgICAgICAgICAgUF9XQyAgICAgICAgICAgICAgICAgIFBfSEFORFNbMV0KKyAgICAgICAgICBTSV9TS0lMTERBTUFHRSAgICAgICAgU2NoYWRlbnN3ZXJ0LCBhdXMgUF9IQU5EU1sxXSB1bmQgQV9TVFIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlcmVjaG5ldAorICAgICAgICAgIFNJX1NLSUxMREFNQUdFX1RZUEUgICBQX0hBTkRTWzJdCisgICAgICAgICAgU0lfU0tJTExEQU1BR0VfTVNHCisgICAgICAgICAgU0lfU0tJTExEQU1BR0VfTVNHMiAgIGJlaWRlcyBQX0hBTkRTWzBdCisgICAgICAgICAgU0lfU1BFTEwgICAgICAgICAgICAgIDAKKyAgICAgICAgICAKKyAgICAgICAgQW5ncmlmZiBtaXQgZWluZW0gU3BlbGwgKFNLX01BR0lDX0FUVEFDSyk6CisgICAgICAgICAgU0lfU0tJTExEQU1BR0UgICAgICAgIFNjaGFkZW5zd2VydCBkZXMgU3BlbGxzCisgICAgICAgICAgU0lfU0tJTExEQU1BR0VfVFlQRSAgIFNjaGFkZW5zdHlwZW4gZGVzIFNwZWxscworICAgICAgICAgIFNJX1NLSUxMREFNQUdFX01TRyAgICBTY2hhZGVuc21lbGR1bmcgZGVzIFNwZWxscywgd2VubiB2b3JoYW5kZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvbnN0ICJtaXQgbWFnaXNjaGVuIEZhZWhpZ2tlaXRlbiIKKyAgICAgICAgICBTSV9TS0lMTERBTUFHRV9NU0cyICAgZW50c3ByZWNoZW5kZSBNZWxkdW5nIGRlcyBTcGVsbHMsIHdlbm4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlc2V0enQsIGFuc29uc3RlbiBpZGVudGlzY2ggbWl0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSV9TS0lMTERBTUFHRV9NU0cKKyAgICAgICAgICBQX1dFQVBPTl9UWVBFICAgICAgICAgUF9XRUFQT05fVFlQRSBkZXMgU3BlbGxzLCB3ZW5uIHZvcmhhbmRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29uc3QgV1RfTUFHSUMKKyAgICAgICAgICBTSV9TUEVMTCAgICAgICAgICAgICAgU0lfU1BFTEwgZGVzIFNwZWxscworICAgICAgICAgIAorICAgICAgICBIaW53ZWlzZToKKyAgICAgICAgLSBBbGxlIEVpbnRyYWVnZSBpbiBkaWVzZW0gTWFwcGluZyBrb2VubmVuIGJlcmVpdHMgZHVyY2gKKyAgICAgICAgICBJbnRlcm5hbE1vZGlmeUF0dGFjaygpIHZlcmFlbmRlcnQgd29yZGVuIHNlaW4uCisgICAgICAgIC0gRGllIERhdGVuIHdlcmRlbiBtaXR0ZWxzIGRlZXBfY29weShhaW5mbykgZWluZ2V0cmFnZW4uCisgICAgICAgIC0gRGF0ZW4gaW4gZGVuIEVpbnRyYWVnZW4gU0lfU0tJTExEQU1BR0UqIHVuZCBTSV9TUEVMTCBrb2VubmVuIGJlaQorICAgICAgICAgIHBoeXNpa2FsaXNjaGVuIEFuZ3JpZmZlbiBkdXJjaCBkaWUgU2tpbGxzIEZJR0hUKFBfV0VBUE9OX1RZUEUpIG9kZXIKKyAgICAgICAgICBTS19GSUdIVCBvZGVyIGR1cmNoIGVpbmVuIFBfVE1QX0FUVEFDS19NT0QgYnp3LiBIb29rIHZvbSBUeXAgCisgICAgICAgICAgSF9IT09LX0FUVEFDS19NT0QgbW9kaWZpemllcnQgd29yZGVuIHNlaW4uCisgICAgICAgIAorICAgIE9SSUdJTkFMX0RBTSAtIGludAorICAgICAgICBEZXIgT3JpZ2luYWxzY2hhZGVuIGF1cyBkZW0gQXR0YWNrCisKKyAgICBPUklHSU5BTF9EQU1fVFlQRSAtIHN0cmluZy9zdHJpbmcqIAorICAgICAgICBEZXIgT3JpZ2luYWxkYW1hZ2V0eXAgYXVzIGRlbSBBdHRhY2sKKworICAgIENVUlJFTlRfREFNIC0gaW50CisgICAgICAgIERlciBtb21lbnRhbmUgU2NoYWRlbiwgbmFjaCBzY2hvbiBlcmZvbGd0ZW4gTW9kaWZpa2F0aW9uZW4KKyAgCisgICAgQ1VSUkVOVF9EQU1fVFlQRSAtIHN0cmluZy9zdHJpbmcqCisgICAgICAgIERlciBtb21lbnRhbmUgRGFtYWdldHlwLCBuYWNoIHNjaG9uIGVyZm9sZ3RlbiBNb2RpZmlrYXRpb25lbgorICAKKyAgICBFTkVNWV9JTlNFUlRFRCAtIGludAorICAgICAgICAwIG9kZXIgMSBqZSBuYWNoZGVtIG9iIGRlciBBbmdyZWlmZXIgc2Nob24gaW4gZGVyIGVuZW15LWxpc3QKKyAgICAgICAgdm9yaGFuZGVuIHdhciBvZGVyIG5pY2h0CisgIAorICAgIFJGUl9SRURVQ0UgLSBpbnQgCisgICAgICAgIDAgb2RlciByZWR1emllcnRlciBTY2hhZGVuIGR1cmNoIFJGUiBNb2RpZmlrYXRpb24KKyAgCisgICAgUFJFU0VOVF9ERUZFTkRFUlMgLSBBcnJheSAKKyAgICAgICAgTGlzdGUgZGVyIGR1cmNoIEluZm9ybURlZmVuZCBpbmZvcm1pZXJ0ZW4gRGVmZW5kZXIgYWxzIE9iamVrdC4KKyAgICAgICAgRWluIERlZmVuZGVyIHdpcmQgaW1tZXIgTkFDSCBJbmZvcm1EZWZlbmQKKyAgICAgICAgZGF6dWdlZnVlZ3QKKyAgCisgICAgREVGRU5ESU5HX0RFRkVOREVSIC0gQXJyYXkgKHt9KQorICAgICAgICBIYXQgZWluIGR1cmNoIEluZm9ybURlZmVuZCBlaW4gRGVmZW5kZXIgdmVydGVpZGlndCwgc28gd2lyZAorICAgICAgICBmdWVyIGRpZXNlbiBEZWZlbmRlciBlaW4gRWludHJhZyBpbiBkaWVzZW0gQXJyYXkgdm9yZ2Vub21tZW4sCisgICAgICAgIHdlbGNoZXIgZm9sZ2VuZGUgU3RydWt0dXIgYmVzaXR6dC4KKyAgICAgICAgICAgICAgICAoeworICAgICAgICAgICAgICAgICAgICAgICAgREVGX0RFRkVOREVSIC0gT2JqZWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgIERlciBWZXJ0ZWlkaWdlciwgd2VsY2hlciBWT1IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmZW5kT3RoZXIgZWluZ2VmdWVndCB3aXJkCisgICAgICAgICAgICAgICAgICAgICAgICBERUZfREFNIC0gaW50CisgICAgICAgICAgICAgICAgICAgICAgICAgIERlciB2ZXJhZW5kZXJ0ZSBTY2hhZGVuLCB3ZWxjaGVyIE5BQ0ggCisgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmVuZE90aGVyIGVpbmdlZnVlZ3Qgd2lyZAorICAgICAgICAgICAgICAgICAgICAgICAgREVGX0RBTVRZUEUgc3RyaW5nL3N0cmluZyogIAorICAgICAgICAgICAgICAgICAgICAgICAgICBEaWUgdmVyYWVuZGVydGUgU2NoYWRlbnNhcnQsIHdlbGNoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTkFDSCBEZWZlbmRPdGhlciBlaW5nZWZ1ZWd0IHdpcmQKKyAgICAgICAgICAgICAgICAgICAgICAgIERFRl9TUEVMTCAtIE1hcHBpbmcgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGFzIE1hcHBpbmcgZGVzIHZlcmFlbmRlcnRlbiBTcGVsbHMsIHdlbGNoZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWxzIEtvcGllIE5BQ0ggRGVmZW5kT3RoZXIgZWluZ2VmdWVndCB3aXJkCisgICAgICAgICAgICAgICAgfSkKKyAgCisgICAgREVGRU5EX0hPT0sgLSBJbnQvQXJyYXkgCisgICAgICAgIERJX05PSE9PSywgd2VubiBrZWluIEhvb2sgZGEgd2FyLCBESV9IT09LSU5URVJSVVBULCB3ZW5uIGRlcgorICAgICAgICBIb29rIGRhcyBEZWZlbmQgdW50ZXJicmljaHQsIERJX0hPT0ssIHdlbm4gZWluIEhvb2sgdm9yaGFuZGVuIAorICAgICAgICBpc3QsIGRpZXNlciBkYXMgRGVmZW5kIGFiZXIgdW52ZXJhZW5kZXJ0IGxhZXNzdC4KKyAgICAgICAgVmVyYWVuZGVydCBlaW4gSG9vayBkYXMgRGVmZW5kLCBzbyBpc3QgaGllciBlaW4gQXJyYXkgenUgZmluZGVuCisgICAgICAgIG1pdCBkZW4gdmVyYWVuZGVydGVuIFBhcmFtZXRlcm4gaW4gZGVyIFN0cnVrdHVyOgorICAgICAgICAgICAgICAgICh7CisgICAgICAgICAgICAgICAgICAgICAgICBIT09LX0RBTSAtIGludAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVyIHZlcmFlbmRlcnRlIFNjaGFkZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIEhPT0tfREFNVFlQRSAtIHN0cmluZy9zdHJpbmcqICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWUgdmVyYWVuZGVydGUgU2NoYWRlbnNhcnQKKyAgICAgICAgICAgICAgICAgICAgICAgIEhPT0tfU1BFTEwgLSBNYXBwaW5nIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRGFzIE1hcHBpbmcgZGVzIHZlcmFlbmRlcnRlbiBTcGVsbHMgYWxzIEtvcGllCisgICAgICAgICAgICAgICAgfSkKKyAgCisgICAgREVGRU5EX0FSTU9VUlMgLSBNYXBwaW5nICgyIFdlcnRlIHBybyBLZXkpCisgICAgICAgIExpc3RlIGRlciBiZXJ1ZWNrc2ljaHRpZ3RlbiBSdWVzdHVuZ2VuLiBGdWVyIGplZGUgUnVlc3R1bmcKKyAgICAgICAgd2lyZCBlaW4gRWludHJhZyB2b3JnZW5vbW1lbiwgbWl0IGRlbSBPYmpla3QgZGVyIGpld2VpbGlnZW4KKyAgICAgICAgUnVlc3R1bmcgYWxzIEtleS4gSGllcmJlaSB3ZXJkZW4gZGllIFJ1ZXN0dW5nZW4gZXJzdCBlaW5nZXRyYWdlbiwKKyAgICAgICAgd2VubiBpaHIgamV3ZWlsaWdlcyBRdWVyeURlZmVuZCgpIGF1ZmdlcnVmZW4gd2lyZCwgZC5oLiBlcyBzaW5kIG5pY2h0CisgICAgICAgIHZvbiBBbmZhbmcgYW4gYWxsZSBnZXRyYWdlbmVuIFJ1ZXN0dW5nIGRyaW4uIEplZGVyIEVpbnRyYWcgaW0gTWFwcGluZworICAgICAgICBiZXNpdHp0IGRpZSBmb2xnZW5kZW4gMiBXZXJ0ZToKKyAgICAgICAgICAgICAgICBERUZfQVJNT1VSX0RBTSAtIGludCAKKyAgICAgICAgICAgICAgICAgICAgRGVyIFNjaGFkZW4gTkFDSCBRdWVyeURlZmVuZCAodm9yaGVyIDApCisgICAgICAgICAgICAgICAgREVGX0FSTU9VUl9QUk9UIC0gaW50CisgICAgICAgICAgICAgICAgICAgIFZlcnRlaWRpZ3VuZ3N3ZXJ0IGRlciBSdWVzdHVuZyBWT1IgRGVmZW5kRnVuYworICAgICAgICBCc3A6IEljaCB3aWxsIHdpc3Nlbiwgd2llIGd1dCAncnVlc3R1bmcnIHNjaHVldHp0ZToKKyAgICAgICAgICAgICBzcGVsbFtFSU5GT19ERUZFTkRdW0RFRkVORF9BUk1PVVJTXVtydWVzdHVuZyxERUZfQVJNT1VSX1BST1RdCisKKyAgICBERUZFTkRfR1VJTEQgLSBBcnJheSAKKyAgICAgICAgRWluZSBMaXN0ZSBtaXQgZGVyIE1vZGlmaWthdGlvbiBkZXIgR2lsZGUgbWl0IGRlciBTdHJ1a3R1cgorICAgICAgICAgICAgICAgICh7CisgICAgICAgICAgICAgICAgICAgICAgICBHVUlMRF9EQU0gLSBpbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGVyIHZlcmFlbmRlcnRlIFNjaGFkZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIEdVSUxEX0RBTVRZUEUgLSBzdHJpbmcvc3RyaW5nKgorICAgICAgICAgICAgICAgICAgICAgICAgICBEaWUgdmVyYWVuZGVydGUgU2NoYWRlbnNhcnQKKyAgICAgICAgICAgICAgICB9KQorICAKKyAgICBERUZFTkRfUkVTSSAtIGludAorICAgICAgICBTY2hhZGVuIG5hY2ggQ2hlY2tSZXNpc3RhbmNlCisgIAorICAgIERFRkVORF9CT0RZIC0gaW50CisgICAgICAgIFNjaGFkZW4gbmFjaCBCZXJ1ZWNrc2ljaHRpZ3VuZyBkZXMgQm9kaWVzIChudXIKKyAgICAgICAgcGh5c2lrYWxpc2NoKQorICAKKyAgICBERUZFTkRfTE9TVExQIC0gaW50CisgICAgICAgIFRhdHNhZWNobGljaCBhYmdlem9nZW5lIExQCisgIAorICAgIERFRkVORF9DVVJfQVJNT1VSX1BST1QgLSBpbnQKKyAgICAgICAgU2NodXR6IGRlciBSdWVzdHVuZyB2b3IgQ2FsbCBkZXIKKyAgICAgICAgRGVmZW5kRnVuYy4gSXN0IG51ciBpbiBkZXIgRGVmZW5kRnVuYyBkZWZpbmllcnQuIEthbm4gYXVjaCBhdXMKKyAgICAgICAgREVGRU5EX0FSTU9VUlMgZW50bm9tbWVuIHdlcmRlbgorICAgICAKK1NJRUhFIEFVQ0g6CisgICAgIEF0dGFjaywgRGVmZW5kCisKKzE4Lkp1bCAyMDA2IE11YWRpYgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vRGVmZW5kT3RoZXIgYi9kb2MvbGZ1bi9EZWZlbmRPdGhlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGIyMjc3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vRGVmZW5kT3RoZXIKQEAgLTAsMCArMSw4NSBAQAorRGVmZW5kT3RoZXIoKQorCitGVU5LVElPTjoKKwltaXhlZCBEZWZlbmRPdGhlcihpbnQgZGFtLG1peGVkIGRhbV90eXBlLG1peGVkIHNwZWxsLG9iamVjdCBlbmVteSk7CisKK0RFRklOSUVSVCBJTjoKKwkvc3RkL2xpdmluZy9jb21iYXQuYworCitBUkdVTUVOVEU6CisJZGFtCisJICBEZXIgU2NoYWRlbiwgZGVyIHZvcmF1c3NpY2h0bGljaCBiZWltIHp1IHZlcnRlaWRpZ2VuZGVuIExlYmV3ZXNlbgorCSAgdmVydXJzYWNodCB3ZXJkZW4gc29sbC4KKwlkYW1fdHlwZQorCSAgRGVyIFNjaGFkZW5zdHlwIChvZGVyIGRpZSBTY2hhZGVuc3R5cGVuKSwgZGVyIGJlaW0genUKKwkgIHZlcnRlaWRpZ2VuZGVuIExlYmV3ZXNlbiB2ZXJ1cnNhY2h0IHdlcmRlbiBzb2xsZW4uCisJc3BlbGwKKwkgIFdlbm4gZGFzIHp1IHZlcnRlaWRpZ2VuZGUgTGViZXdlc2VuIG1pdCBTcGVsbHMgYW5nZWdyaWZmZW4gd3VyZGUsCisJICBzbyBrb2VubnRlIG1hbiBoaWVyIG1laHIgSW5mb3MgZW50bmVobWVuLgorCWVuZW15CisJICBEZXIgRmVpbmQsIGRlciBlaW4genUgdmVydGVpZGlnZW5kZXMgTGViZXdlc2VuIGFuZ2VncmlmZmVuIGhhdC4KKworUlVlQ0tHQUJFV0VSVDoKKwlBcnJheSBtaXQgZGVuIEVpbnRyYWVnZW4gZGVyIGdlZ2ViZW5lbmZhbGxzIHZlcmFlbmRlcnRlbgorCXVlYmVyZ2ViZW5lbiBQYXJhbWV0ZXI6IAorICAgICAgICAgICAgKDEpIGRhbSAgICAgIFtUeXAgaW50XSwgCisgICAgICAgICAgICAoMikgZGFtX3R5cGUgW1R5cCBzdHJpbmcqXSwgCisgICAgICAgICAgICAoMykgc3BlbGwgICAgW1R5cCBtYXBwaW5nXS4KKworQkVTQ0hSRUlCVU5HOgorCUVzIGlzdCBtb2VnbGljaCwgZGFzcyBPYmpla3RlIEFuZ3JpZmZlIGF1ZiBMZWJld2VzZW4gYWJ3ZWhyZW4gb2RlcgorCXVtd2FuZGVsbiwgc29mZXJuIGRpZXNlIE9iamVrdGUgYmVpIGRlbSBhbmdlZ3JpZmZlbmVuIExlYmV3ZXNlbgorCW1pdHRlbHMgQWRkRGVmZW5kZXIoKSBhbmdlbWVsZGV0IHd1cmRlbiB1bmQgc2ljaCBkZXIgc2VsYmVuIFVtZ2VidW5nCisJYmVmaW5kZW4uCisJWnVtZWlzdCB3aXJkIGVzIHNpY2ggYmVpIGRlbiBPYmpla3RlbiBuYXR1ZXJsaWNoIGViZW5mYWxscyB1bQorCWFuZGVyZSBMZWJld2VzZW4gaGFuZGVsbiwgZGllIGRhcyBMZWJld2VzZW4sIGJlaSBkZW0gc2llIGFuZ2VtZWxkZXQKKwlzaW5kLCB2ZXJ0ZWlkaWdlbiBzb2xsZW4uCisJQmVpIGVpbmVtIEFuZ3JpZmYgYXVmIGRhcyBMZWJld2VzZW4ga29lbm5lbiBhbGxlIE9iamVrdGUgcGVyIEF1ZnJ1ZgorCXZvbiBEZWZlbmRPdGhlcigpIGluIGVpbmVuIEFuZ3JpZmYgZWluZ3JlaWZlbiwgd29iZWkgZGllCisJU2NoYWRlbnNzdGFlcmtlLCBkZXIgU2NoYWRlbnN0eXAgKGRpZSBTY2hhZGVuc3R5cGVuKSwKKwladXNhdHppbmZvcm1hdGlvbmVuIGZ1ZXIgQW5ncmlmZnNzcGVsbHMgdW5kIGRlciBBbmdyZWlmZXIgYWxzCisJUGFyYW1ldGVyIHVlYmVyZ2ViZW4gd2VyZGVuLgorCURlc3dlaXRlcmVuIGlzdCB6dSBiZWFjaHRlbiwgZGFzcyBiZWkgYWxzIHBoeXNpa2FsaXNjaCBtYXJraWVydGVuCisJQW5ncmlmZmVuIGluIGVpbmVtIFRlYW0gbnVyIFZlcnRlaWRpZ2VyIGF1cyBkZXIgZXJzdGVuIFJlaWhlCisJYmVydWVja3NpY2h0aWd0IHdlcmRlbiB1bmQgZGFzcyBiZWkgZWluZW0gQW5ncmlmZiB6dWZhZWxsaWcgYXVzCisJYWxsZW4gbW9lZ2xpY2hlbiBWZXJ0ZWlkaWdlcm4gYXVzZ2V3YWVobHQgd2lyZC4KKwlTdGFuZGFyZG1hZXNzaWcgaXN0IGRpZXNlIEZ1bmt0aW9uIGluIExlYmV3ZXNlbiBiZXJlaXRzIGRlZmluaWVydCwKKwl3b2JlaSBkZXIgU2tpbGwgU0tfREVGRU5EX09USEVSLCBzb2Zlcm4gdm9yaGFuZGVuLCBhdWZnZXJ1ZmVuIHdpcmQuCisKK0JFSVNQSUVMOgorCVNlaHIgYmVsaWVidCBzaW5kIGluIEdpbGRlbiBOUENzLCBkaWUgZGVuIEJlc2Nod29lcmVyIGJlZ2xlaXRlbiB1bmQKKwl2ZXJ0ZWlkaWdlbiwgei5CLiBiZXNjaHdvcmVuZSBEYWVtb25lbjoKKwkgIGluaGVyaXQgInN0ZC9ucGMiOworCSAgaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCSAgb2JqZWN0IG93bmVyOworCSAgdm9pZCBjcmVhdGUoKQorCSAgeyA6OmNyZWF0ZSgpOworCSAgICBTZXRQcm9wKFBfTkFNRSwiRGFlbW9uIik7CisJICAgIC4uLgorCSAgfQorCS8vIG5hY2ggQ2xvbmVuIGRlcyBEYWVtb25zIGZvbGdlbmRlIEZ1bmt0aW9uIG1pdCBCZXNjaHdvZXJlciBhbHMKKwkvLyBQYXJhbWV0ZXIgYXVmcnVmZW4KKwkgIElkZW50aWZ5KG9iamVjdCBjYXN0ZXIpCisJICB7IGlmKCFvYmplY3RwKGNhc3RlcikpCisJICAgICAgY2FsbF9vdXQoIydyZW1vdmUsMCk7CisJICAgIG93bmVyPWNhc3RlcjsKKwkgICAgb3duZXItPkFkZERlZmVuZGVyKHRoaXNfb2JqZWN0KCkpOworCSAgfQorCS8vIGRlciBEYWVtb24gd2VocnQgamVkZW4gQW5ncmlmZiBtaXQgRmV1ZXIgdm9sbCBhYiwgbWFuIG11c3MgenVlcnN0CisJLy8gZGVuIFZlcnRlaWRpZ2VyIHVtYnJpbmdlbiwgdW0gZGVuIEJlc2Nod29lcmVyIHRvZXRlbiB6dSBrb2VubmVuCisJICBtaXhlZCBEZWZlbmRPdGhlcihpbnQgZGFtLG1peGVkIGRhbV90eXBlLG1peGVkIHNwZWxsLG9iamVjdCBlbmVteSkKKwkgIHsgaWYoc2l6ZW9mKGRhbV90eXBlKSYmbWVtYmVyX2FycmF5KERUX0ZJUkUsZGFtX3R5cGUpIT0tMSkKKwkgICAgICBkYW09MDsKKwkgICAgcmV0dXJuKHtkYW0sZGFtX3R5cGUsc3BlbGx9KTsKKwkgIH0KKwlTb2xsIGRlciBEYWVtb24gc2ljaCBhdWNoIGluIGVpbiBUZWFtIGVpbm9yZG5lbiwgaW4gd2VsY2hlbSBzaWNoIGRlcgorCUJlc2Nod29lcmVyIGV2ZW50dWVsbCBiZWZpbmRldCwgc28gaXN0IHp1c2FldHpsaWNoIEFzc29jTWVtYmVyKCkgaW4KKwlkaWVzZW0gQmVzY2h3b2VyZXIgYXVmenVydWZlbiwgd29iZWkgZGVyIERhZW1vbiBhbHMgUGFyYW1ldGVyCisJdWViZXJnZWJlbiB3aXJkLgorCitTSUVIRSBBVUNIOgorCUFkZERlZmVuZGVyKCksIFJlbW92ZURlZmVuZGVyKCksIEluZm9ybURlZmVuZCgpLCBLaWxsKCksIElzRW5lbXkoKSwKKwlQX0RFRkVOREVSUywgL3N0ZC9saXZpbmcvY29tYmF0LmMsIC9zeXMvbmV3X3NraWxscy5oCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IEZyaSBGZWIgMjUgMTQ6NDU6MDAgMjAwMCBieSBQYXJhY2Vsc3VzCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9EZWZlbmRfYnNwIGIvZG9jL2xmdW4vRGVmZW5kX2JzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjQ1OGE1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vRGVmZW5kX2JzcApAQCAtMCwwICsxLDEzNyBAQAorRGVmZW5kKCkgLSBCRUlTUElFTEUKKworRlVOS1RJT046CisgICAgIHZhcmFyZ3MgaW50IERlZmVuZChpbnQgZGFtLCBtaXhlZCBkYW1fdHlwZSwgbWl4ZWQgc3BlbGwsIG9iamVjdCBlbmVteSkKKworQkVNRVJLVU5HRU46CisgICAgIERpZSBoaWVyIGF1ZmdlZnVlaHJ0ZW4gS29tcGxleGJlaXNwaWVsZSBzaW5kIHp1bSBWZXJzdGFlbmRuaXMgZ2VkYWNodC4KKworQkVJU1BJRUxFOgorICAxKSBFaW4gb3JkaW5hZXJlciBCaXNzIGlucyBCZWluLgorICAgICB0aGlzX3BsYXllcigpLT5EZWZlbmQocmFuZG9tKDUwMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoe0RUX1BJRVJDRSwgRFRfUklQfSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc19vYmplY3QoKSk7CisKKyAgMikgRWluIEJpc3MgaW5zIEJlaW4sIG1pdCBkZXIgSG9zZSBhbHMgMjAwJWlnZSBSdWVzdHVuZyB1bmQgUmVzdCBtaXQgMTAwJS4KKyAgICAgdGhpc19wbGF5ZXIoKS0+RGVmZW5kKHJhbmRvbSg1MDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHtEVF9QSUVSQ0UsIERUX1JJUH0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKFtTUF9QSFlTSUNBTF9BVFRBQ0s6IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQX1JFRFVDRV9BUk1PVVI6ICAgKFtBVF9UUk9VU0VSUzogMjAwXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc19vYmplY3QoKSk7CisKKyAgMykgRGVyIEJpc3MsIHdlbm4gZWluIFRpZXIgaW4gZGllIEhvc2UgZ2Vrcm9jaGVuIGlzdCB1bmQgZGllc2VyIG9obmUKKyAgICAgVHJlZmZlcm1lbGR1bmcgdW5kIHBoeXNpc2NoZW4gUnVlc3R1bmdzc2NodXR6IGR1cmNoZ2VodC4KKyAgICAgdGhpc19wbGF5ZXIoKS0+RGVmZW5kKHJhbmRvbSg1MDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHtEVF9QSUVSQ0UsIERUX1JJUH0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKFtTUF9QSFlTSUNBTF9BVFRBQ0s6IDBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfb2JqZWN0KCkpOworCisgIDQpIFNwZWxsLVBhcmFtZXRlcgorICAgICAvLyBCZWlzcGllbCBmdWVyIGVpbmVuIFNwZWxsLCBkZXIgbnVyIHZvbSBIZWxtIG5vcm1hbCB1bmQgdm9uIGVpbmVtCisgICAgIC8vIEFtdWxldHQgbWl0IDExNSUgYXVmZ2VoYWx0ZW4gd2lyZCwgYWxsZSBhbmRlcmVuIChhbmdlYmVuZW5lbikKKyAgICAgLy8gUnVlc3R1bmdlbiBoYWJlbiAwJSBTY2h1dHp3aXJrdW5nLgorICAgICAvLyBNaXQgQXVzZ2FiZSBlaWdlbmVyIE1lbGR1bmdlbjogYmVnaW5uZW5kIG1pdCAtMSwgZGEgZGVyIHZlcnVyc2FjaHRlCisgICAgIC8vIFNjaGFkZW5zd2VydCBtaW5pbWFsIDAgd2lyZCAoZnVlcnMgRXJzZXR6ZW46IEZlaW5kOiBAV0V4MiwKKyAgICAgLy8gU3BpZWxlcjogV0V4MSk7IG1heGltYWwgd2lyZCBlciAoRW1wZmluZGxpY2hrZWl0ZW4gamV0enQgbWFsIGF1c3NlbgorICAgICAvLyB2b3IpIDQ5ICg0OTkvMTAgPSA0OSksIG5pY2h0IDQ5OSEhIQorICAgICB0aGlzX3BsYXllcigpLT5EZWZlbmQoCisgICAgICAgcmFuZG9tKDUwMCksCisgICAgICAgKHtEVF9QSUVSQ0UsIERUX0FJUn0pLAorICAgICAgIChbU1BfUEhZU0lDQUxfQVRUQUNLOiAxLCAvLyB3ZWdlbiBEVF9QSUVSQ0UKKyAgICAgICAgIFNQX1JFRFVDRV9BUk1PVVI6ICAgKFtBVF9BUk1PVVI6ICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVF9IRUxNRVQ6IDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVF9SSU5HOiAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVF9HTE9WRTogICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVF9DTE9BSzogICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVF9CT09UOiAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVF9UUk9VU0VSUzogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVF9TSElFTEQ6ICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVF9BTVVMRVQ6IDExNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVF9NSVNDOiAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVF9CRUxUOiAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVF9RVUlWRVI6ICAgMF0pCisgICAgICAgICBTUF9TSE9XX0RBTUFHRToKKyAgICAgICAgICAgICAgICh7KHstMSwiQFdFUjIgc2NocmFtbXQgRGljaCBtaXQgZWluZW0gZHVyY2hib2hyZW5kZW4gQmxpY2suIiwKKyAgICAgICAgICAgICAgICAgICAgICAiRHUgc2NocmFtbXN0IEBXRU4xIG1pdCBlaW5lbSBkdXJjaGJvaHJlbmRlbiBCbGljay4iLAorICAgICAgICAgICAgICAgICAgICAgICJAV0VSMiBzY2hyYW1tdCBAV0VOMSBtaXQgZWluZW0gZHVyY2hib2hyZW5kZW4gQmxpY2suIgorICAgICAgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgICAgICAgKHs1LCJEZXIgZHVyY2hib2hyZW5kZSBCbGljayB2b24gQFdFTTIgdHJpZmZ0IERpY2guIiwKKyAgICAgICAgICAgICAgICAgICAgICJEZWluIGR1cmNoYm9ocmVuZGVyIEJsaWNrIHRyaWZmdCBAV0VOMS4iLAorICAgICAgICAgICAgICAgICAgICAgIkRlciBkdXJjaGJvaHJlbmRlIEJsaWNrIHZvbiBAV0VNMiB0cmlmZnQgQFdFTjEuIgorICAgICAgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgICAgICAgKHsyMCwiQFdFU1NFTjIgc3RlY2hlbmRlciBCbGljayBkdXJjaGJvaHJ0IERpY2guIiwKKyAgICAgICAgICAgICAgICAgICAgICAiRGVpbiBzdGVjaGVuZGVyIEJsaWNrIGR1cmNoYm9ocnQgQFdFTjEuIiwKKyAgICAgICAgICAgICAgICAgICAgICAiQFdFU1NFTjIgc3RlY2hlbmRlciBCbGljayBkdXJjaGJvaHJ0IEBXRU4xLiIKKyAgICAgICAgICAgICAgIH0pfSkKKyAgICAgICBdKSwKKyAgICAgICB0aGlzX29iamVjdCgpKTsKKworICAgICAvLyBFdHdhcyBnZXNjaGlja3RlciBnZWh0IGRhcyBHYW56ZSwgd2VubiB3aXIgZWluZmFjaCBhdXMgZGVyIE11ZGxpYgorICAgICAvLyBhbGxlIGV4aXN0aWVyZW5kZW4gUnVlc3R1bmdlbiBpbiBlaW4gTWFwcGluZyBwYWNrZW4gdW5kIGRpZXNlCisgICAgIC8vIG51bGxlbiAoZGFtaXQgc2luZCB3aXIgYXVjaCBnZWdlbiBuZXVlIFJ1ZXN0dW5nc3R5cGVuIHNpY2hlcik6CisgICAgIG1hcHBpbmcgYW1hcCA9IG1hcF9pbmRpY2VzKFZBTElEX0FSTU9VUl9DTEFTUywjJyEpOworICAgICBhbWFwW0FUX0hFTE1FVF09MTAwOworICAgICBhbWFwW0FUX0FNVUxFVF09MTE1OworCisgICAgIHRoaXNfcGxheWVyKCktPkRlZmVuZChyYW5kb20oNTAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh7RFRfUElFUkNFLCBEVF9BSVJ9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChbU1BfUEhZU0lDQUxfQVRUQUNLOiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUF9SRURVQ0VfQVJNT1VSOiBhbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUF9TSE9XX0RBTUFHRTogKHsgLi4uIChzaWVoZSBvYmVuKQorCisgIDUpIERlciBCaXNzIHZvbiB3ZWl0ZXIgb2JlbiBtaXQgTWVsZHVuZy4KKyAgICAgLy8gRWluZSBNZWxkdW5nLCBkaWUgbnVyIGF1c2dlZ2ViZW4gd2lyZCwgd2VubiBkZXIgQmlzcyBhdWNoIG1pbmRlc3RlbnMKKyAgICAgLy8gZWluZW4gTFAgYWJ6aWVodC4KKyAgICAgdGhpc19wbGF5ZXIoKS0+RGVmZW5kKHJhbmRvbSg1MDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHtEVF9QSUVSQ0UsIERUX1JJUH0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKFtTUF9QSFlTSUNBTF9BVFRBQ0s6IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQX1JFRFVDRV9BUk1PVVI6ICAgKFtBVF9UUk9VU0VSUzogMjAwXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQX1NIT1dfREFNQUdFOiAoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7MSwiQFdFUjIgYmVpc3N0IERpY2ggaW5zIEJlaW4hIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkR1IGJlaXNzdCBAV0VOMSBpbnMgQmVpbiEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQFdFUjIgYmVpc3N0IEBXRU4xIGlucyBCZWluISIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfb2JqZWN0KCkpOworCisgIDYpIERlZmVuZEZ1bmMoKSB1bmQgRGVmZW5kKCkgaW4gZWluZW0gT2JqZWt0CisgICAgIDZhKQorICAgICAvLyBlaW5lIEx1ZnRhbmdyaWZmZSByZWZsZWt0aWVyZW5kZSBSdWVzdHVuZzoKKyAgICAgaW50IERlZmVuZEZ1bmMoc3RyaW5nICpkdHlwLCBtaXhlZCBzcGVsbCwgb2JqZWN0IGVuZW15KSB7CisgICAgICAgaWYobWVtYmVyKGR0eXAsIERUX0FJUik+PTAgJiYgIXNwZWxsW1NQX1JFQ1VSU0lWRV0pCisgICAgICAgICBlbmVteS0+RGVmZW5kKHJhbmRvbSgyMDApLAorICAgICAgICAgICAgICAgICAgICAgICAoe0RUX0FJUn0pLAorICAgICAgICAgICAgICAgICAgICAgICAoW1NQX1JFQ1VSU0lWRTogMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTUF9TSE9XX0RBTUFHRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAoeyJFaW4gTHVmdHdpcmJlbCBlcmZhc3N0IGF1Y2ggRGljaC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlaW5lIFJ1ZXN0dW5nIHdpcmJlbHQgQFdFTjEgaGVydW0uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJAV0VTU0VOMiBSdWVzdHVuZyB3aXJiZWx0IEBXRU4xIGhlcnVtLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgXSksCisgICAgICAgICAgICAgICAgICAgICAgIFF1ZXJ5UHJvcChQX1dPUk4pKTsKKworICAgICAgIHJldHVybiAwOyAvLyAtPiBJbiBkaWVzZW0gRmFsbCBnaWJ0cyBrZWluZW4gUnVlc3R1bmdzYm9udXMhCisgICAgIH0KKworICAgICA2YikKKyAgICAgLy8gRWluZSBOVVIgUkVJTkUgTHVmdGFuZ3JpZmZlIHJlZmxla3RpZXJlbmRlIFJ1ZXN0dW5nOgorICAgICBpbnQgRGVmZW5kRnVuYyhzdHJpbmcgKmR0eXAsIG1peGVkIHNwZWxsLCBvYmplY3QgZW5lbXkpIHsKKyAgICAgICBpZighc2l6ZW9mKGR0eXAtKHtEVF9BSVJ9KSkgJiYgIXNwZWxsW1NQX1JFQ1VSU0lWRV0pCisgICAgICAgICAuLi4KKworU0lFSEUgQVVDSDoKKyAgICAgQW5ncmlmZjogICBBdHRhY2soTCksIFBfTk9fQVRUQUNLLCBJbnNlcnRFbmVteShMKQorICAgICBTY2hhZGVuOiAgIFBfRU5BQkxFX0lOX0FUVEFDS19PVVQsIFBfTEFTVF9NT1ZFLCBkb19kYW1hZ2UoTCksCisgICAgICAgICAgICAgICAgcmVkdWNlX2hpdF9wb2ludHMoTCksIHJlZHVjZV9zcGVsbF9wb2ludHMoTCkKKyAgICAgU2NodXR6OiAgICBQX0RFRkVOREVSUywgSW5mb3JtRGVmZW5kKEwpLCBEZWZlbmRPdGhlcihMKSwKKyAgICAgICAgICAgICAgICBQX0FSTU9VUlMsIFBfQUMsIFBfREVGRU5EX0ZVTkMsIFF1ZXJ5RGVmZW5kKEwpLAorICAgICAgICAgICAgICAgIFBfQk9EWSwgQV9ERVgsIERlZmVuZChMKQorICAgICBEYXRlbjogICAgIFBfTEFTVF9DT01CQVRfVElNRSwgUF9MQVNUX1hQLCBQX0xBU1RfREFNQUdFLAorICAgICAgICAgICAgICAgIFBfTEFTVF9EQU1UWVBFUywgUF9MQVNUX0RBTVRJTUUKKyAgICAgUmVzaXN0ZW56OiBQX1JFU0lTVEFOQ0VfU1RSRU5HVEhTLCBDaGVja1Jlc2lzdGFuY2UoTCkKKyAgICAgU29uc3RpZ2VzOiBDaGVja1NlbnNpdGl2ZUF0dGFjayhMKSwgVXNlU2tpbGwoTCksCisgICAgICAgICAgICAgICAgSW50ZXJuYWxNb2RpZnlEZWZlbmQoTCkKKworMjUuIE1haSAyMDExIEdhYnlsb24KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0RlbGV0ZVNwZWxsRmF0aWd1ZSBiL2RvYy9sZnVuL0RlbGV0ZVNwZWxsRmF0aWd1ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDA0OWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vRGVsZXRlU3BlbGxGYXRpZ3VlCkBAIC0wLDAgKzEsMzcgQEAKK0RlbGV0ZVNwZWxsRmF0aWd1ZQorCitGVU5LVElPTjoKKyAgICBwdWJsaWMgdm9pZCBEZWxldGVTcGVsbEZhdGlndWUoc3RyaW5nIGtleSkKKworREVGSU5JRVJUIElOOgorICAgIC9zdGQvbGl2aW5nL3NraWxscy5jCisgICAgL3N0ZC9wbGF5ZXIvc2tpbGxzLmMKKyAgICAvc3lzL2xpdmluZy9za2lsbHMuaAorCitBUkdVTUVOVEU6CisgICAgc3RyaW5nIGtleSAgOiBFaW5kZXV0aWdlciBOYW1lIGRlcyBTcHJ1Y2hlcywgZWluZXIgR3J1cHBlIHZvbiBTcHJ1ZWNoZW4KKyAgICAgICAgICAgICAgICAgIG9kZXIgMCBmdWVyIGRpZSBnbG9iYWxlIFNwcnVjaGVybXVlZHVuZy4KKworQkVTQ0hSRUlCVU5HOgorICAgIERpZXNlIEZ1bmt0aW9uIGRpZW50IHp1bSBMb2VzY2hlbiB2b24gaW5kaXZpZHVlbGxlbiBTcHJ1Y2hlcm11ZWR1bmdlbgorICAgIChTcGVsbGZhdGlndWUsIFNwcnVjaHNwZXJyZW4pLgorCisgICAgSXN0IDxrZXk+IDAsIHdpcmQgZGllIGdsb2JhbGUgU3BydWNoc3BlcnJlIGdlbG9lc2NodCAoaWRlbnRpc2NoIHp1IGRlcgorICAgIFByb3BlcnR5IFBfTkVYVF9TUEVMTF9USU1FKSwgYW5kZXJlbmZhbGxzIGRpZSB1bnRlciA8a2V5PiBnZXNwZWljaGVydGUKKyAgICBTcHJ1Y2hlcm11ZWR1bmcuCisgICAgTG9lc2NodCBtYW4gZWluZW4gRWludHJhZyAwIGlzdCBkYXMgRXJnZWJuaXMgZGllc2VyIEZ1bmt0aW9uIGlkZW50aXNjaCB6dW0KKyAgICBMb2VzY2hlbi9OdWxsZW4gdm9uIFBfTkVYVF9TUEVMTF9USU1FLgorCitCRU1FUktVTkdFTjoKKyAgICBTcHJ1Y2hzcGVycmVuIChpbnNiLiBmcmVtZGUpIGR1ZXJmZW4gbmljaHQgb2huZSB3ZWl0ZXJlcyBnZWxvZXNjaHQgb2RlcgorICAgIGdlYWVuZGVydCB3ZXJkZW4uIERpZXNlcyBiZWRhcmYgZ3J1bmRzYWV0emxpY2ggZGVyIEdlbmVobWlndW5nIGR1cmNoIGRpZQorICAgIEdpbGRlbmJhbGFuY2UhCisKK1NJRUhFIEFVQ0g6CisgICAgU2V0U3BlbGxGYXRpZ3VlKEwpLCBDaGVja1NwZWxsRmF0aWd1ZShMKQorICAgIFBfTkVYVF9TUEVMTF9USU1FCisgICAgc3BydWNoZXJtdWVkdW5nCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzI3LjAzLjIwMTAsIFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vRGVsZXRlVGltZWRBdHRyTW9kaWZpZXIgYi9kb2MvbGZ1bi9EZWxldGVUaW1lZEF0dHJNb2RpZmllcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTFiNmM5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vRGVsZXRlVGltZWRBdHRyTW9kaWZpZXIKQEAgLTAsMCArMSwzMCBAQAorRGVsZXRlVGltZWRBdHRyTW9kaWZpZXIoKQorRlVOS1RJT046CisgICAgIGludCBEZWxldGVUaW1lZEF0dHJNb2RpZmllcihzdHJpbmcga2V5KQorCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvbGl2aW5nL2F0dHJpYnV0ZXMuYworCitBUkdVTUVOVEU6CisgICAgIGtleQktCWF1cyBQX1RJTUVEX0FUVFJfTU9EIHp1IGxvZXNjaGVuZGVyIEVpbnRyYWcKKworQkVTQ0hSRUlCVU5HOgorICAgICBEZXIgenUga2V5IGdlaG9lcmVuZGUgRWludHJhZyBpbiBQX1RJTUVEX0FUVFJfTU9EIHdpcmQgZ2Vsb2VzY2h0IHVuZAorICAgICB1cGRhdGVfbWF4X3NwX2FuZF9ocCBhdXNnZWb8aHJ0Lg0KKw0KK1JVZUNLR0FCRVdFUlQ6DQorICAgICBUQVRUUl9JTlZBTElEX0FSR1MgICAgICAtICAgICBJbSBGYWxsZSBlaW5lcyBmZWhsZW5kZW4ga2V5LUFyZ3VtZW50cyAKKyAgICAgVEFUVFJfTk9fU1VDSF9NT0RJRklFUiAgLSAgICAgRmFsbHMgZGVyIE1vZGlmaWVyIG1pdCBkaWVzZW0gS2V5IG5pY2h0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aWVydA0KKyAgICAgVEFUVFJfT0sgICAgICAgICAgICAgICAgLSAgICAgSW0gRXJmb2xnc2ZhbGwNCisgICAgIA0KKyAgICAgRGllIFJ1ZWNrZ2FiZXdlcnRlIHNpbmQgaW4gL3N5cy9saXZpbmcvYXR0cmlidXRlcy5oIGRlZmluaWVydC4NCisgICAgCitTSUVIRSBBVUNIOg0KKwlRdWVyeUF0dHJpYnV0ZSgpLCBRdWVyeVJlYWxBdHRyaWJ1dGUoKSwgUXVlcnlBdHRyaWJ1dGVPZmZzZXQoKSwNCisJU2V0QXR0cmlidXRlKCksIFNldFJlYWxBdHRyaWJ1dGUoKSwgVXBkYXRlQXR0cmlidXRlcygpLA0KKwlTZXRUaW1lZEF0dHJNb2RpZmllcigpLCBRdWVyeVRpbWVkQXR0ck1vZGlmaWVyKCksIA0KKwlQX0FUVFJJQlVURVMsIFBfQVRUUklCVVRFU19PRkZTRVRTLCBQX1RJTUVEX0FUVFJfTU9ELA0KKwlQX1hfQVRUUl9NT0QsIFBfTV9BVFRSX01PRCwgL3N0ZC9saXZpbmcvYXR0cmlidXRlcy5jDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK0xhc3QgbW9kaWZpZWQ6IFR1ZSBKdWwgMjcgMjA6MDA6MjAgMjAwNCBieSBNdWFkaWINCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9EaXNjb3ZlckRvb3IgYi9kb2MvbGZ1bi9EaXNjb3ZlckRvb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgzMTBkNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0Rpc2NvdmVyRG9vcgpAQCAtMCwwICsxLDMxIEBACitEaXNjb3ZlckRvb3IoKQorCitGVU5LVElPTjoKKyAgICB2YXJhcmdzIGludCBEaXNjb3ZlckRvb3Ioc3RyaW5nIGRuYW1lKQorCitBUkdVTUVOVEU6CisgICAgZG5hbWU6IE5hbWUgZGVzIFJhdW1lcywgaW4gZGVtIGRlciBTZWhlciBkYXMgU2VoZXJ0b3Iga2VubmVubGVybmVuIHNvbGwuCisgICAgICAgICAgIERlZmF1bHQ6IERpZSBVbWdlYnVuZyBkZXMgU2VoZXJzLgorCitCRVNDSFJFSUJVTkc6CisgICAgTmFjaGRlbSBkaWVzZSBGdW5rdGlvbiBhdWZnZXJ1ZmVuIHd1cmRlLCBrYW5uIGRlciBTZWhlciAodGhpc19wbGF5ZXIoKSkKKyAgICBkYXMgVG9yIGluIGRlbSBhbmdlZ2ViZW5lbiBSYXVtIGltbWVyIHZlcndlbmRlbi4KKworUlVFQ0tHQUJFV0VSVDoKKyAgICAxLCBmYWxscyBkZXIgU2VoZXIgZWluIE5FVUVTIFRvciBrZW5uZW5nZWxlcm50IGhhdAorICAgIDAsIGZhbGxzIGVyIGRhcyBUb3Igc2Nob24ga2FubnRlIG9kZXIga2VpbiBTZWhlciB3YXIKKworQkVNRVJLVU5HRU46CisgICAgVm9uIGVpbmVtIFNlaGVydG9yIHdpcmQgZGllc2UgRnVua3Rpb24gYXV0b21hdGlzY2ggYmVpbSBCZXRyZXRlbiBkZXMKKyAgICB1bWdlYmVuZGVuIFJhdW1lcyBhdWZnZXJ1ZmVuLCBmYWxscyBQX1NFRVJET09SX0RJU0NPVkVSIGdlc2V0enQgaXN0LiBXZW5uCisgICAgZWluIFRvciBhdWYgZGllc2UgQXJ0IG5pY2h0IGVudGRlY2t0IHdlcmRlbiBzb2xsLCBzbyBkYXJmCisgICAgUF9TRUVSRE9PUl9ESVNDT1ZFUiBuaWNodCBnZXNldHp0IHNlaW4gdW5kIG11c3MgRGlzY292ZXJEb29yKCkgc2VwYXJhdCwKKyAgICB6LkIuIHZvbiBlaW5lbSBRdWVzdG9iamVrdCwgYXVmZ2VydWZlbiB3ZXJkZW4uCisgICAgRGllc2UgRnVua3Rpb24gd2lyZCB2b24gL2Qvc2VoZXIvcG9ydGFsZS9zZWhlcnRvcm1hc3RlciBkZWZpbmllcnQuCisKK0JFSVNQSUVMRToKKyAgICB3cml0ZSgiRGVyIFphdWJlcmVyIHNhZ3Q6IEltIE5pY2h0cyB3aXJzdCBEdSBlaW4gd2VpdGVyZXMgVG9yIGZpbmRlbiFcbiIpOworICAgICIvZC9zZWhlci9wb3J0YWxlL3NlaGVydG9ybWFzdGVyIi0+RGlzY292ZXJEb29yKCIvcm9vbS92b2lkIik7CisKK1NJRUhFIEFVQ0g6CisgICAgRG9vcklzS25vd24sIFNob3dEb29ycywgVGVsZXBvcnQsIEdldERvb3JzTWFwcGluZwpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vRGlzdHJpYnV0ZUV4cCBiL2RvYy9sZnVuL0Rpc3RyaWJ1dGVFeHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAyZjY5YQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0Rpc3RyaWJ1dGVFeHAKQEAgLTAsMCArMSwyNCBAQAorRGlzdHJpYnV0ZUV4cCgpDQorRlVOS1RJT046DQorICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIERpc3RyaWJ1dGVFeHAob2JqZWN0IGVuZW15LCBpbnQgZXhwX3RvX2dpdmUpDQorDQorREVGSU5JRVJUIElOOg0KKyAgICAgL3N0ZC9saXZpbmcvbGlmZS5jDQorDQorQVJHVU1FTlRFOg0KKyAgICAgb2JqZWN0IGVuZW15ICAgICAtIHRvZXRlbmRlciBGZWluZA0KKyAgICAgaW50IGV4cF90b19naXZlICAtIHp1IHZlcnRlaWxlbmRlIFhQICg9PSBQX1hQLzEwMCkNCisNCitCRVNDSFJFSUJVTkc6DQorICAgICBEYXMgc3RlcmJlbmRlIFdlc2VuIHZlcnRlaWx0IHNlaW5lIFhQIGFuIHNlaW5lIEZlaW5kZS4NCisNCisgICAgIERhYmVpIGJla29tbXQgamVkZXIgR2VnbmVyIHNlaW5lbiBBbnRlaWwgKGFiaORuZ2lnIHZvbiA1MCUgdm9uIHNlaW5lbQ0KKyAgICAgZ2VtYWNodGVuIFNjaGFkZW4pIHVuZCBlaW5lbiBUZWFtYW50ZWlsIChkaWUgYW5kZXJlbiA1MCUg/GJlciBkYXMNCisgICAgIGdlc2FtdGUgVGVhbSBhZGRpZXJ0IHVuZCBkdXJjaCBkaWUgVGVhbWFuemFobCBnZXRlaWx0KS4NCisNCitTSUVIRSBBVUNIOg0KKyAgICAgRnVua3Rpb25lbjogIEFkZEV4cCgpDQorICAgICBQcm9wZXJ0aWVzOiAgUF9YUA0KKyAgICAgU29uc3RpZ2VzOiAgIHRlYW1rYW1wZg0KKw0KKzE0LkZlYiAyMDA3IEdsb2luc29uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vRG9EZWNheSBiL2RvYy9sZnVuL0RvRGVjYXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVjZjU0MQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0RvRGVjYXkKQEAgLTAsMCArMSw0NCBAQAorRG9EZWNheSgpCisKK0ZVTktUSU9OOgorICAgICAgcHVibGljICBpbnQgICAgRG9EZWNheShpbnQgc2lsZW50KSAKKworREVGSU5JRVJUIElOOgorICAgICAgL3N0ZC91bml0LmMKKworQVJHVU1FTlRFOgorICAgICBzaWxlbnQgKGludCkKKyAgICAgICBGYWxscyAhPSAwLCBlcmZvbGd0IGJlaW0gWmVyZmFsbCBrZWluZSBNZWxkdW5nLCBkLmguIGRvRGVjYXlNZXNzYWFnZSgpCisgICAgICAgd2lyZCBuaWNodCBnZXJ1ZmVuLgorCitSVWVDS0dBQkVXRVJUOgorICAgICBEaWUgRnVua3Rpb24gZ2lidCBkaWUgbmFjaCBkZW0gWmVyZmFsbCBub2NoIHVlYnJpZyBnZWJsaWViZW5lIE1lbmdlCisgICAgIHp1cnVlY2sgKGludCkuCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGllc2UgRnVua3Rpb24gd2lyZCBpbiBDbG9uZXMgdm9uIFVuaXRvYmpla3RlbiBhdXMgZGVyIEJsdWVwcmludCBnZXJ1ZmVuLAorICAgICB3ZW5uIGVpbiBaZXJmYWxsc2ludGVydmFsbCBhYmdlbGF1ZmVuIGlzdCAobmF0dWVybGljaCBudXIsIHdlbm4gaW4gZGVyIEJQCisgICAgIGRlciBaZXJmYWxsIGtvbmZpZ3VyaWVydCBpc3QpLgorICAgICBEaWUgRnVua3Rpb24gcHJ1ZWZ0IG5vcm1hbGVyd2Vpc2UgdmlhIFBfVU5JVF9ERUNBWV9GTEFHUywgb2IgZGVyIFplcmZhbGwKKyAgICAgc3RhdHRmaW5kZW4gc29sbCwgYmVzdGltbXQgYXVzIFBfVU5JVF9ERUNBWV9RVU9UQSBkaWUgenUgemVyZmFsbGVuZGUKKyAgICAgTWVuZ2UsIHJ1ZnQgRG9EZWNheU1lc3NhZ2UoKSB1bmQgcmVkdXppZXJ0IFBfQU1PVU5ULgorICAgICAKKyAgICAgU2llIGthbm4gYXVjaCB2b24gSGFuZCBnZXJ1ZmVuIHdlcmRlbiwgdW0gZWluZW4gWmVyZmFsbCBhdXN6dWxvZXNlbiwgYXVjaAorICAgICB3ZW5uIG1pciBnZXJhZGUgbmljaHQgZWluZmFlbGx0LCBpbiB3ZWxjaGVuIFNpdHVhdGlvbmVuIGRhcyBzaW5udm9sbAorICAgICB3YWVyZSAodmllbGxlaWNodCBhbHMgU3BydWNobWlzc2VyZm9sZy4gKmcqKQorCitCRU1FUktVTkdFTjoKKyAgICAgV2VubiBtYW4gZWluZW4gYW5kZXJlbiBaZXJmYWxsc21lY2hhbmlzbXVzIGhhYmVuLCB3aWxsIG11c3MgbWFuIGRpZXNlCisgICAgIEZ1bmt0aW9uIHdvaGwgdWViZXJzY2hyZWliZW4uIEluIGZhc3QgYWxsZW4gRmFlbGxlbiBzb2xsdGUgZGllcyBqZWRvY2gKKyAgICAgdW5ub2V0aWcgc2Vpbi4gSGF0IGplbWFuZCBkYXMgVmVybGFuZ2VuLCBkaWVzZSBGdW5rdGlvbiB6dQorICAgICB1ZWJlcnNjaHJlaWJlbiwgaXN0IHZpZWxsZWljaHQgdm9yaGVyIGVpbmUgRGlza3Vzc2lvbiBtaXQgZGVtIE11ZGxpYi1FTQorICAgICBhbmdlYnJhY2h0LgorCitTSUVIRSBBVUNIOgorICAgICB1bml0CisgICAgIFBfVU5JVF9ERUNBWV9JTlRFUlZBTCwgUF9VTklUX0RFQ0FZX0ZMQUdTLCBQX1VOSVRfREVDQVlfUVVPVEEsCisgICAgIFBfVU5JVF9ERUNBWV9NSU4KKyAgICAgRG9EZWNheU1lc3NhZ2UoKQorICAgICAvc3RkL3VuaXQuYworCisxNC4xMC4yMDA3LCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9Eb0RlY2F5TWVzc2FnZSBiL2RvYy9sZnVuL0RvRGVjYXlNZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMzkzMDkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9Eb0RlY2F5TWVzc2FnZQpAQCAtMCwwICsxLDM0IEBACitEb0RlY2F5TWVzc2FnZSgpCisKK0ZVTktUSU9OOgorICAgICAgcHJvdGVjdGVkIHZvaWQgRG9EZWNheU1lc3NhZ2UoaW50IG9sZGFtb3VudCwgaW50IHplcmZhbGwpOworICAgICAgCitERUZJTklFUlQgSU46CisgICAgICAvc3RkL3VuaXQuYworCitBUkdVTUVOVEU6CisgICAgIG9sZGFtb3VudCAoaW50KQorICAgICAgICBNZW5nZSB2b3IgZGVtIFplcmZhbGwKKyAgICAgemVyZmFsbCAoaW50KQorICAgICAgICBqZXR6dCB6ZXJmYWxsZW5kZSBNZW5nZQorCitCRVNDSFJFSUJVTkc6CisgICAgIERpZXNlIEZ1bmt0aW9uIHdpcmQgdm9uIERvRGVjYXkoKSBnZXJ1ZmVuIHVuZCBnaWJ0IGRpZSBTdGFuZGFyZG1lbGR1bmdlbgorICAgICBiZWltIFplcmZhbGwgdm9uIFVuaXRvYmpla3RlbiBhdXMuCisgICAgIEhpZXJiZWkgaXN0IGFuIGRlciBVbml0IG5vY2ggYWxsZXMgdW52ZXJhZW5kZXJ0LCB3ZW5uIGRpZXNlIEZ1bmt0aW9uCisgICAgIGdlcnVmZW4gd2lyZCwgZGllIFJlZHVrdGlvbiB2b24gUF9BTU9VTlQgZXJmb2xndCBkaXJla3QgaW0gQW5zY2hsdXNzLgorICAgICBEaWUgRnVua3Rpb24gd2lyZCBuaWNodCBnZXJ1ZmVuLCB3ZW5uIERvRGVjYXkoKSBtaXQgc2lsZW50IT0wIGdlcnVmZW4KKyAgICAgd2lyZC4KKworQkVNRVJLVU5HRU46CisgICAgIFdpbGwgbWFuIG5pY2h0IGRpZSBTdGFuZGFyZHplcmZhbGxzbWVsZHVuZ2VuICh3b3ZvbiBpY2ggbWVpc3QgYXVzZ2VoZSksCisgICAgIGthbm4gbWFuIGRpZXNlIEZ1bmt0aW9uIHVlYmVyc2NocmVpYmVuIHVuZCBlaWdlbmUgTWVsZHVuZ2VuIGVyemV1Z2VuLgorCitTSUVIRSBBVUNIOgorICAgICB1bml0CisgICAgIFBfVU5JVF9ERUNBWV9JTlRFUlZBTCwgUF9VTklUX0RFQ0FZX0ZMQUdTLCBQX1VOSVRfREVDQVlfUVVPVEEsCisgICAgIFBfVU5JVF9ERUNBWV9NSU4KKyAgICAgRG9EZWNheSgpCisgICAgIC9zdGQvdW5pdC5jCisKKzE0LjEwLjIwMDcsIFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0RvVW53ZWFyIGIvZG9jL2xmdW4vRG9VbndlYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM4ZWRhNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0RvVW53ZWFyCkBAIC0wLDAgKzEsMzMgQEAKK0RvVW53ZWFyKCkKKworRlVOS1RJT046CisgICAgIHZhcmFyZ3MgaW50IERvVW53ZWFyKGludCBzaWxlbnQsIGludCBhbGwpOworCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvY2xvdGhpbmcvd2Vhci5jCisKK0FSR1VNRU5URToKKyAgICAgc2lsZW50CisgICAgICAgICAgRmFsbHMgdW5nbGVpY2ggMCwgc28gd2VyZGVuIGtlaW5lIE1lbGR1bmdlbiBhdXNnZWdlYmVuLgorICAgICAgICAgIEZhbGxzIChzaWxlbnQmTV9OT0NIRUNLKSB3ZXJkZW4gYXVjaCB2ZXJmbHVjaHRlIFJ1ZXN0dW5nZW4KKyAgICAgICAgICBhdXNnZXpvZ2VuCisgICAgIGFsbAorICAgICAgICAgIFVuZ2xlaWNoIDAsIHdlbm4gRG9VbndlYXIoKSBhdXMgZWluZW0gInppZWhlIGFsbGVzIGF1cyIgaGVyYXVzCisgICAgICAgICAgYXVmZ2VydWZlbiB3dXJkZS4KKworQkVTQ0hSRUlCVU5HOgorICAgICBFcyB3aXJkIHZlcnN1Y2h0LCBkaWUgUnVlc3R1bmcgYXVzenV6aWVoZW4uIERhYmVpIHdlcmRlbiBlaW5lIGV2ZW50dWVsbAorICAgICB2b3JoYW5kZW5lIFJlbW92ZUZ1bmMoKSB1bmQgRmx1ZWNoZSBtaXQgYmVydWVja3NpY2h0aWd0LgorCitSVWVDS0dBQkVXRVJUOgorICAgICAwLCB3ZW5uIGRpZSBSdWVzdHVuZyBnYXIgbmljaHQgZ2V0cmFnZW4gd2FyLCBhbnNvbnN0ZW4gMS4KKworQkVNRVJLVU5HRU46CisgICAgIEF1Y2ggd2VubiBlaW5lIDEgenVydWVja2dlZ2ViZW4gd2lyZCwgbXVzcyBkYXMgbmljaHQgaGVpc3NlbiwgZGFzcyBkaWUKKyAgICAgUnVlc3R1bmcgZXJmb2xncmVpY2ggYXVzZ2V6b2dlbiB3dXJkZSEKKworU0lFSEUgQVVDSDoKKyAgICAgRG9XZWFyKCksIFJlbW92ZUZ1bmMoKSwgSW5mb3JtVW53ZWFyKCksIC9zdGQvYXJtb3VyL2NvbWJhdC5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFN1biBKdW4gMjcgMjI6MjI6MDAgMTk5OSBieSBQYXJhY2Vsc3VzCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9Eb1Vud2llbGQgYi9kb2MvbGZ1bi9Eb1Vud2llbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUyN2IyYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0RvVW53aWVsZApAQCAtMCwwICsxLDMwIEBACitEb1Vud2llbGQoKQorCitGVU5LVElPTjoKKyAgICAgdmFyYXJncyBpbnQgRG9VbndpZWxkKGludCBzaWxlbnQpOworCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvd2VhcG9uL2NvbWJhdC5jCisKK0FSR1VNRU5URToKKyAgICAgc2lsZW50CisgICAgICAgICAgVW5nbGVpY2ggMCwgd2VubiBkaWUgV2FmZmUgb2huZSBNZWxkdW5nZW4gd2VnZ2VzdGVja3Qgd2VyZGVuIHNvbGwuCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRXMgd2lyZCB2ZXJzdWNodCwgZGllIFdhZmZlIHdlZ3p1c3RlY2tlbi4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgMCwgd2VubiBkaWUgV2FmZmUgZ2FyIG5pY2h0IGdlenVlY2t0IHdhciwgYW5zb25zdGVuIDEuCisKK0JFTUVSS1VOR0VOOgorICAgICBBbmhhbmQgZGVzIFJ1ZWNrZ2FiZXdlcnRlcyBsYWVzc3Qgc2ljaCBuaWNodCBlcnNlaGVuLCBvYiBkaWUgV2FmZmUgc2ljaAorICAgICB3ZWdzdGVja2VuIGxpZXNzIG9kZXIgbmljaHQhCisKKyAgICAgV2VubiBkaWUgV2FmZmUgdmVyZmx1Y2h0IGlzdCBvZGVyIChmYWxscyBkZWZpbmllcnQpIFVud2llbGRGdW5jKCkgMAorICAgICB6dXJ1ZWNrZ2lidCwgbGFlc3N0IHNpZSBzaWNoIG5pY2h0IHdlZ3N0ZWNrZW4uCisKK1NJRUhFIEFVQ0g6CisgICAgIFVud2llbGRGdW5jKCksIEluZm9ybVVud2llbGQoKSwgL3N0ZC93ZWFwb24uYworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBTdW4gSnVuIDI3IDIyOjI0OjAwIDE5OTkgYnkgUGFyYWNlbHN1cwpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vRG9XZWFyIGIvZG9jL2xmdW4vRG9XZWFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNjRlNWEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9Eb1dlYXIKQEAgLTAsMCArMSw0MiBAQAorRG9XZWFyKCkKKworRlVOS1RJT046CisgICAgIHZhcmFyZ3MgaW50IERvV2VhcihpbnQgc2lsZW50LCBpbnQgYWxsKTsKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL2FybW91ci9jb21iYXQuYworCitBUkdVTUVOVEU6CisgICAgIHNpbGVudAorICAgICAgICAgIEZhbGxzIHVuZ2xlaWNoIDAsIHNvIHdlcmRlbiBrZWluZSBNZWxkdW5nZW4gYXVzZ2VnZWJlbi4KKyAgICAgYWxsCisgICAgICAgICAgVW5nbGVpY2ggMCwgd2VubiBEb1dlYXIoKSBhdXMgZWluZW0gInppZWhlIGFsbGVzIGFuIiBoZXJhdXMKKyAgICAgICAgICBhdWZnZXJ1ZmVuIHd1cmRlLgorCitCRVNDSFJFSUJVTkc6CisgICAgIEVzIHdpcmQgdmVyc3VjaHQsIGRpZSBSdWVzdHVuZyBhbnp1emllaGVuLiBEYWJlaSB3aXJkIGVpbmUgZXZlbnR1ZWxsCisgICAgIHZvcmhhbmRlbmUgV2VhckZ1bmMoKSBtaXQgYmVydWVja3NpY2h0aWd0LgorCitSVWVDS0dBQkVXRVJUOgorICAgICAwLCB3ZW5uIG1hbiBkaWUgUnVlc3R1bmcgZ2FyIG5pY2h0IGJlaSBzaWNoIGhhdCBvZGVyIHNpZSBzY2hvbiBhbiBoYXQsCisgICAgIGFuc29uc3RlbiAxLgorCitCRU1FUktVTkdFTjoKKyAgICAgQXVjaCB3ZW5uIGVpbmUgMSB6dXJ1ZWNrZ2VnZWJlbiB3aXJkLCBtdXNzIGRhcyBuaWNodCBoZWlzc2VuLCBkYXNzIGRpZQorICAgICBSdWVzdHVuZyBlcmZvbGdyZWljaCBhbmdlem9nZW4gd3VyZGUhCisKKyAgICAgR3J1ZW5kZSBmdWVyIGVpbiBGZWhsc2NobGFnZW4gZGVzIEFuemllaGVucyBrb2VubmVuIHNlaW46CisgICAgICAgIG8gTWFuIGhhdCBkaWUgUnVlc3R1bmcgbmljaHQgYmVpIHNpY2guCisgICAgICAgIG8gTWFuIGhhdCBkaWUgUnVlc3R1bmcgc2Nob24gYW4uCisgICAgICAgIG8gTWFuIGhhdCBzY2hvbiBlaW5lIFJ1ZXN0dW5nIGRlcyBnbGVpY2hlbiBUeXBzIGFuLgorICAgICAgICBvIERlciBUeXAgZGVyIFJ1ZXN0dW5nIG9kZXIgZGllIFJ1ZXN0dW5nc2tsYXNzZSBpc3QgaWxsZWdhbC4KKyAgICAgICAgbyBGYWxscyBkZWZpbmllcnQ6IFdlYXJGdW5jKCkgZ2FiIDAgenVydWVjay4KKyAgICAgICAgbyBGYWxscyBlcyBzaWNoIHVtIGVpbmVuIFNjaGlsZCBoYW5kZWx0OiBNYW4gaGF0IGtlaW5lIEhhbmQgbWVocgorICAgICAgICAgIGZyZWkuCisKK1NJRUhFIEFVQ0g6CisgICAgIERvVW53ZWFyKCksIFdlYXJGdW5jKCksIEluZm9ybVdlYXIoKSwgUF9FUVVJUF9USU1FLCAKKyAgICAgL3N0ZC9hcm1vdXIvY29tYmF0LmMsIFBfVU5XRUFSX01TRywgUF9XRUFSX01TRworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBTdW4gSnVuIDI3IDIyOjIyOjAwIDE5OTkgYnkgUGFyYWNlbHN1cwpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vRG9XaWVsZCBiL2RvYy9sZnVuL0RvV2llbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZjNDM2ZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0RvV2llbGQKQEAgLTAsMCArMSw0MSBAQAorRG9XaWVsZCgpCisKK0ZVTktUSU9OOgorICAgICB2YXJhcmdzIGludCBEb1dpZWxkKGludCBzaWxlbnQpOworCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvd2VhcG9uL2NvbWJhdC5jCisKK0FSR1VNRU5URToKKyAgICAgc2lsZW50CisgICAgICAgICAgVW5nbGVpY2ggMCwgd2VubiBkaWUgV2FmZmUgb2huZSBNZWxkdW5nZW4gZ2V6dWVja3Qgd2VyZGVuIHNvbGwuCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRXMgd2lyZCB2ZXJzdWNodCwgZGllIFdhZmZlIHp1IHp1ZWNrZW4uIEhhdCBtYW4gc2Nob24gZWluZSBXYWZmZQorICAgICBnZXp1ZWNrdCwgc28gd2lyZCB2ZXJzdWNodCwgZGllc2Ugd2VnenVzdGVja2VuLiBLbGFwcHQgZGFzIG5pY2h0LCBrYW5uCisgICAgIGRpZSBXYWZmZSBuaWNodCBnZXp1ZWNrdCB3ZXJkZW4uCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIDAsIHdlbm4gbWFuIGRpZSBXYWZmZSBnYXIgbmljaHQgYmVpIHNpY2ggdHJhZWd0LCBhbnNvbnN0ZW4gMS4KKworQkVNRVJLVU5HRU46CisgICAgIEFuaGFuZCBkZXMgUnVlY2tnYWJld2VydGVzIGxhZXNzdCBzaWNoIG5pY2h0IGVudHNjaGVpZGVuLCBvYiBkaWUgV2FmZmUKKyAgICAgc2ljaCBlcmZvbGdyZWljaCB6dWVja2VuIGxpZXNzIQorCisgICAgIEdydWVuZGUsIHdhcnVtIHNpY2ggZWluZSBXYWZmZSBuaWNodCB6dWVja2VuIGxhc3NlbiBrYW5uLCBzaW5kCisgICAgIGZvbGdlbmRlOgorICAgICAgICBvIE1hbiB0cmFlZ3Qgc2llIG5pY2h0IGJlaSBzaWNoIChvZGVyIHNpZSBzdGVja3QgaW4gZWluZW0gQmV1dGVsCisgICAgICAgICAgby5hZS4pLgorICAgICAgICBvIE1hbiBoYXQgc2llIHNjaG9uIGdlenVlY2t0LgorICAgICAgICBvIEZhbGxzIGRlZmluaWVydDogV2llbGRGdW5jKCkgZ2lidCAwIHp1cnVlY2suCisgICAgICAgIG8gTWFuIGlzdCBuaWNodCBnZXNjaGlja3QgZ2VudWcgKGRhcyBoYWVuZ3Qgdm9uIGRlciBXYWZmZW5rbGFzc2UKKyAgICAgICAgICBhYikuCisgICAgICAgIG8gRWluZSBzY2hvbiBnZXp1ZWNrdGUgV2FmZmUgbGFlc3N0IHNpY2ggbmljaHQgd2Vnc3RlY2tlbi4KKyAgICAgICAgbyBEaWUgV2FmZmVua2xhc3NlIGlzdCBob2VoZXIgYWxzIGVybGF1YnQuCisgICAgICAgIG8gTWFuIGhhdCBuaWNodCBnZW51ZyBIYWVuZGUgZnJlaS4KKworU0lFSEUgQVVDSDoKKyAgICAgV2llbGRGdW5jKCksIEluZm9ybVdpZWxkKCksIFBfRVFVSVBfVElNRSwgL3N0ZC93ZWFwb24uYworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBXZWQgQXByIDA4IDEwOjI1OjAwIDIwMDQgYnkgTXVhZGliCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9Eb29ySXNLbm93biBiL2RvYy9sZnVuL0Rvb3JJc0tub3duCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MDllMzAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9Eb29ySXNLbm93bgpAQCAtMCwwICsxLDI0IEBACitEb29ySXNLbm93bigpCisKK0ZVTktUSU9OOgorCWludCBEb29ySXNLbm93bigpCisKK0FSR1VNRU5URToKKwlLZWluZS4KKworQkVTQ0hSRUlCVU5HOgorCVRlc3RldCwgb2IgZGVyIFNlaGVyICh0aGlzX3BsYXllcigpKSBkYXMgVG9yIGluIHNlaW5lciBtb21lbnRhbmVuCisJVW1nZWJ1bmcgc2Nob24ga2VubnQuCisKK1JVRUNLR0FCRVdFUlQ6CisJRGllIE51bW1lciBkZXMgVG9yZXMuCisKK0JFTUVSS1VOR0VOOgorICAgIERpZXNlIEZ1bmt0aW9uIHdpcmQgdm9uIC9kL3NlaGVyL3BvcnRhbGUvc2VoZXJ0b3JtYXN0ZXIgZGVmaW5pZXJ0LgorCitCRUlTUElFTEU6CisgICAgL2Qvc2VoZXIvcG9ydGFsZS9zZWhlcnRvcm1hc3Rlci0+RG9vcklzS25vd24oKQorCitTSUVIRSBBVUNIOgorICAgIERpc2NvdmVyRG9vciwgU2hvd0Rvb3JzLCBUZWxlcG9ydCwgR2V0RG9vcnNNYXBwaW5nCisKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0R1bXAgYi9kb2MvbGZ1bi9EdW1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NGZiYjQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9EdW1wCkBAIC0wLDAgKzEsMjMgQEAKK0R1bXAoKQorRlVOS1RJT046CisgICAgIHZvaWQgRHVtcCgpCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3AvZGFlbW9uL21hdGVyaWFsZGIuYyAoTUFURVJJQUxEQikKKworQkVTQ0hSRUlCVU5HOgorICAgICBTY2hyZWlidCBhbGxlIE1hdGVyaWFsaWVuIHNhbXQgaWhyZW4gR3J1cHBlbiB1bmQgYWxsZSBHcnVwcGVuIG1pdAorICAgICBkYXp1Z2Vob2VyZW5kZW4gTWF0ZXJpYWxpZW4gaW4gRFVNUEZJTEUgKC9wL2RhZW1vbi9zYXZlL01BVEVSSUFMUykKKyAgICAgV2lyZCBpbiBjcmVhdGUoKSBkZXIgTWF0ZXJpYWxpZW5kYXRlbmJhbmsgYXV0b21hdGlzY2ggYXVmZ2VydWZlbi4KKyAgICAgRGFzIER1bXBmaWxlIGlzdCB6dW0gUmVjaGVyY2hpZXJlbiBkZXIgTWF0ZXJpYWxpZW4gZ2VkYWNodC4KKworU0lFSEUgQVVDSDoKKyAgICAgS29uemVwdGU6CSAgbWF0ZXJpYWwsIG1hdGVyaWFsZXJrZW5udW5nCisgICAgIEdydW5kbGVnZW5kOiBQX01BVEVSSUFMLCAvc3lzL3RoaW5nL21hdGVyaWFsLmgKKyAgICAgTGlzdGVuOgkgIEFsbE1hdGVyaWFscygpLCBBbGxHcm91cHMoKQorCQkgIG1hdGVyaWFsbGlzdGUsIG1hdGVyaWFsZ3J1cHBlbgorICAgICBNYXN0ZXI6CSAgQWRkTWF0ZXJpYWwoKSwgQ29udk1hdGVyaWFsTGlzdCgpLCBNYXRlcmlhbEdyb3VwKCksCisJCSAgR3JvdXBOYW1lKCksIE1hdGVyaWFsTmFtZSgpLAorCQkgIEdldEdyb3VwTWVtYmVycygpLCBHZXRNYXRNZW1iZXJzaGlwKCkKKworNy4gTWFpIDIwMDQgR2xvaW5zb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9FbmVteVByZXNlbnQgYi9kb2MvbGZ1bi9FbmVteVByZXNlbnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY1YWUzZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0VuZW15UHJlc2VudApAQCAtMCwwICsxLDE5IEBACitFbmVteVByZXNlbnQKK0ZVTktUSU9OOgorICAgICBwdWJsaWMgbWl4ZWQgRW5lbXlQcmVzZW50KCkKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL2xpdmluZy9jb21iYXQuYworCitCRVNDSFJFSUJVTkc6CisgICAgIEdpYnQgYXVzIGRlciBGZWluZGVzbGlzdGUgZGVuIGVyc3RlbiBhbndlc2VuZGVuLCBsZWJlbmRlbiB1bmQgCisgICAgIGFuZ3JlaWZiYXJlbiBha3R1ZWxsZW4gR2VnbmVyIGltIFJhdW0genVydWVjay4KKyAgICAgRGFtaXQgaXN0IGRpZSBGdW5rdGlvbiBpZGVudGlzY2ggenUgSW5GaWdodCgpLgorCisgICAgIFdpbGwgbWFuIGFsbGUgR2VnbmVyLCBhdWYgZGllIGRpZXNlIEtyaXRlcmllbiB6dXRyZWZmZW4sIHNvbGx0ZSBtYW4KKyAgICAgUHJlc2VudEVuZW1pZXMoKSB2ZXJ3ZW5kZW4uCisKK1NJRUhFIEFVQ0g6CisgICAgIFByZXNlbnRFbmVtaWVzKCksIEluZmlnaHQoKQorCisyMi4wMy4yMDA5LCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9FbnRlciBiL2RvYy9sZnVuL0VudGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ODdlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9FbnRlcgpAQCAtMCwwICsxLDQwIEBACitFbnRlcigpCisKK0ZVTktUSU9OOgorICAgICBpbnQgRW50ZXIoKTsKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL3RyYW5zcG9ydC5jCisKK0FSR1VNRU5URToKKyAgICAga2VpbmUKKworQkVTQ0hSRUlCVU5HOgorICAgICBXZW5uIHNpY2ggZGVyIFNwaWVsZXIgbm9jaCBuaWNodCBhdWYgZGVtIFRyYW5zcG9ydGVyIGJlZmluZGV0LCB1bmQgZGVyCisgICAgIFRyYW5zcG9ydGVyIG1vbWVudGFuIGFuIGVpbmVyIEhhbHRlc3RlbGxlIGxpZWd0LCBiZXRyaXR0IGRlciBTcGllbGVyCisgICAgIGRlbiBUcmFuc3BvcnRlci4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgTnVsbCwgd2VubiBkZXIgU3BpZWxlciBkZW4gVHJhbnNwb3J0ZXIgbmljaHQgYmV0cmV0ZW4ga29ubnRlLCBzb25zdAorICAgICB1bmdsZWljaCBOdWxsLgorCitCRU1FUktVTkdFTjoKKyAgICAgRXMgd2VyZGVuIGtlaW5lIFRlc3RzIGR1cmNoZ2VmdWVocnQsIG9iIGRlciBUcmFuc3BvcnRlciB1ZWJlcmhhdXB0CisgICAgIGFuZ2VzcHJvY2hlbiB3dXJkZSEgRGFzIG11c3MgbWFuIHNlbGJlciBtYWNoZW4uCisKK0JFSVNQSUVMRToKKworICAgICBpbnQgbXlFbnRlcihzdHJpbmcgc3RyKQorICAgICB7CisgICAgICAgaWYgKHN0ciAmJiBpZChzdHIpKQorICAgICAgICAgcmV0dXJuIEVudGVyKCk7CisKKyAgICAgICBub3RpZnlfZmFpbCgiV2FzIHdpbGxzdCBEdSBiZXRyZXRlbj9cbiIpOworICAgICAgIHJldHVybiAwOworICAgICB9CisKK1NJRUhFIEFVQ0g6CisgICAgIExlYXZlKCksIC9zdGQvdHJhbnNwb3J0LmMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogV2VkIE1heSA4IDEwOjE4OjQyIDE5OTYgYnkgV2FyZ29uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9FdmFsQXJtb3VyIGIvZG9jL2xmdW4vRXZhbEFybW91cgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWQzNTZhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vRXZhbEFybW91cgpAQCAtMCwwICsxLDIxIEBACitFdmFsQXJtb3VyKCkKKworRlVOS1RJT046CisgICAgaW50IEV2YWxBcm1vdXIob2JqZWN0IG9iLCBjbG9zdXJlIHFwKQorIAorREVGSU5JRVJUIElOOgorICAgIC9zdGQvcm9vbS9zaG9wLmMKKyAKK0FSR1VNRU5URToKKyAgICBvYiAtIEVpbmUgUnVlc3R1bmcuCisgICAgcXAgLSBzeW1ib2xfZnVuY3Rpb24oIlF1ZXJ5UHJvcCIsb2IpCisKK0JFU0NIUkVJQlVORzoKKyAgICBCZXdlcnRldCBkaWUgUnVlc3R1bmcuCisgCitSVUVDS0dBQkVXRVJUOgorICAgIE1heChQX0FDLFBfRUZGRUNUSVZFX0FDKTsKKyAKK1NJRUhFIEFVQ0g6CisgICAgRmluZEJlc3RBcm1vdXIoKQorCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9FdmFsV2VhcG9uIGIvZG9jL2xmdW4vRXZhbFdlYXBvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTY3MWEzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vRXZhbFdlYXBvbgpAQCAtMCwwICsxLDIxIEBACitFdmFsV2VhcG9uKCkKKworRlVOS1RJT046CisgICAgaW50IEV2YWxXZWFwb24ob2JqZWN0IG9iLCBjbG9zdXJlIHFwKQorIAorREVGSU5JRVJUIElOOgorICAgIC9zdGQvcm9vbS9zaG9wLmMKKyAKK0FSR1VNRU5URToKKyAgICBvYiAtIEVpbmUgV2FmZmUuCisgICAgcXAgLSBzeW1ib2xfZnVuY3Rpb24oIlF1ZXJ5UHJvcCIsb2IpCisKK0JFU0NIUkVJQlVORzoKKyAgICBCZXdlcnRldCBkaWUgV2FmZmUuCisgCitSVUVDS0dBQkVXRVJUOgorICAgIE1heChQX1dDLFBfRUZGRUNUSVZFX1dDKTsKKyAKK1NJRUhFIEFVQ0g6CisgICAgRmluZEJlc3RXZWFwb24oKQorCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9FeHRyYUF0dGFjayBiL2RvYy9sZnVuL0V4dHJhQXR0YWNrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNmI1YzEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9FeHRyYUF0dGFjawpAQCAtMCwwICsxLDMwIEBACitFeHRyYUF0dGFjaygpCisKK0ZVTktUSU9OOgorCXZhcmFyZ3MgcHVibGljIHZvaWQgRXh0cmFBdHRhY2sob2JqZWN0IGVuZW15LCBpbnQgaWdub3JlX3ByZXZpb3VzKTsKKworQVJHVU1FTlRFOgorCWVuZW15OiBEZXIgRmVpbmQuCisJaWdub3JlX3ByZXZpb3VzOiBFaW4gRmxhZworCitCRVNDSFJFSUJVTkc6CisJRGVyIEZlaW5kIHdpcmQgZGVyIFN0YWVya2UgZGVyIFdhZmZlIChiencuIGRlciBIYWVuZGUpIGVudHNwcmVjaGVuZAorCXN0YXJrIGFuZ2VncmlmZmVuLiBIaWVyYmVpIHdpcmQgQXR0YWNrKCkgYXVmZ2VydWZlbi4KKwlJc3QgaWdub3JlX3ByZXZpb3VzIHVuZ2xlaWNoIDAsIGRhbm4gd2lyZCBkaWUgRXJzdHNjaGxhZ3NwZXJyZSB2b24KKwlBdHRhY2sgaWdub3JpZXJ0LiBEaWVzZXIgQW5ncmlmZiBpc3QgYWxzbyBhdWNoIGRhbm4gbW9lZ2xpY2gsIHdlbm4KKwlkYXMgTGViZXdlc2VuIGVpZ2VudGxpY2gga2VpbmVuIFNjaGxhZyBtZWhyIGluIGRpZXNlciBSdW5kZSBhdXNmdWVocmVuCisJZHVlcmZ0ZS4KKworUlVFQ0tHQUJFV0VSVDoKKwlLZWluZXIuCisKK0JFTUVSS1VORzoKKwlEZXIgRWluc2F0eiBkaWVzZXIgRnVua3Rpb24gaXN0IGdlbmVobWlndW5nc3BmbGljaHRpZy4KKwlXZWl0ZXJlIEhpbndlaXNlIHNpZWhlICJtYW4gQXR0YWNrIi4KKworU0lFSEUgQVVDSDoKKwkiQXR0YWNrIgorCS9zdGQvbGl2aW5nL2NvbWJhdC5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFN1biBOb3YgMjEgMTI6MzI6MjAgMjAwNCBieSBCYW1iaQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vRmlsdGVyQXJtb3VycyBiL2RvYy9sZnVuL0ZpbHRlckFybW91cnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkzNDkzMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0ZpbHRlckFybW91cnMKQEAgLTAsMCArMSw2OSBAQAorRmlsdGVyQXJtb3VycworRlVOS1RJT046CisgICAgIHB1YmxpYyBvYmplY3QgKkZpbHRlckFybW91cnMoY2xvc3VyZSBmaWx0ZXJmdW4sIHZhcmFyZ3MgbWl4ZWQqIGV4dHJhKQorCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvbGl2aW5nL2Nsb3RoaW5nLmMKKworQVJHVU1FTlRFOgorICAgICBjbG9zdXJlIGZpbHRlcmZ1bgorICAgICAgIERpZSBDbG9zdXJlLCBkaWUgZW50c2NoZWlkZW4gc29sbCwgb2IgZWluZSBSdWVzdHVuZyBpbSBFcmdlYm5pc2FycmF5CisgICAgICAgZW50aGFsdGVuIHNlaW4gc29sbC4KKyAgICAgCisgICAgIG1peGVkIGV4dHJhCisgICAgICAgQmVsaWViaWcgdmllbGUgRXh0cmEtQXJndW1lbnRlLCBkaWUgPGZpbHRlcmZ1bj4gdWViZXJnZWJlbiB3ZXJkZW4uCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGllc2UgRnVua3Rpb24gcnVmdCA8ZmlsdGVyZnVuYz4gZnVlciBqZWRlIGdldHJhZ2VuZSBSdWVzdHVuZyBkZXMKKyAgICAgTGViZXdlc2VuIG1pdCBkZXIgamV3ZWlsaWdlbiBSdWVzdHVuZyBhbHMgQXJndW1lbnQgYXVmIHVuZCBsaWVmZXJ0IGVpbgorICAgICBBcnJheSBtaXQgYWxsZW4gUnVlc3R1bmdlbiB6dXJ1ZWNrLCBmdWVyIGRpZSA8ZmlsdGVyZnVuPiBlaW5lbiBXZXJ0ICE9IDAKKyAgICAgenVydWVja2xpZWZlcnQuCisgICAgIERpZSA8ZXh0cmE+IEFyZ3VtZW50ZSB3ZXJkZW4gYWxzIHp1c2FldHpsaWNoZSBQYXJhbWV0ZXIgYW4gPGZpbHRlcmZ1bj4KKyAgICAgdWViZXJnZWJlbiB1bmQgZHVlcmZlbiBrZWluZSBSZWZlcmVuemVuIHNlaW4uCisgICAgIAorICAgICBEaWVzZSBWYXJpYW50ZSBpc3QgenUgYmV2b3J6dWdlbiwgd2VubiBtYW4gUnVlc3R1bmdlbiBuYWNoIGJlc3RpbW10ZW4KKyAgICAgS3JpdGVyaWVuIGR1cmNoc3VjaGVuIHdpbGwgdW5kIFF1ZXJ5QXJtb3VyQnlUeXBlKCkgbmljaHQgYXVzcmVpY2hlbmQgc2VpbgorICAgICBzb2xsdGUuCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIEVpbiBBcnJheSB2b24gT2JqZWt0ZW4gbWl0IGFsbGVuIHBhc3NlbmRlbiBSdWVzdHVuZ2VuLgorCitCRUlTUElFTEU6CisgICAgIDEpIEljaCBtb2VjaHRlIGdlcm5lIGFsbGUgUnVlc3R1bmdlbiBoYWJlbiwgZGllIGJlc2NoYWVkaWd0IHNpbmQ6CisgICAgIHByaXZhdGUgaW50IF9pc19kYW1hZ2VkKG9iamVjdCBydWVzdHVuZykgeworICAgICAgICAgcmV0dXJuIHJ1ZXN0dW5nLT5RdWVyeVByb3AoUF9EQU1BR0UpOworICAgICB9CisgICAgIC4uLgorICAgICBvYmplY3QgKmRhbWFnZWRfYXJtb3VycyA9IFBMLT5GaWx0ZXJBcm1vdXJzKCMnX2lzX2RhbWFnZWQpOworCisgICAgIDIpIEljaCBtb2VjaHRlIGFsbGUgUnVlc3R1bmdlbiwgZGllIGdyb2Vzc2VyIGFscyA1MGNtIHNpbmQuCisgICAgIHByaXZhdGUgaW50IF9hcm1vdXJfaXNfYmlnZ2VyKG9iamVjdCBydWVzdHVuZywgaW50IHNpemUpIHsKKyAgICAgICByZXR1cm4gcnVlc3R1bmctPlF1ZXJ5UHJvcChQX1NJWkUpID4gc2l6ZTsKKyAgICAgfQorICAgICAuLi4KKyAgICAgb2JqZWN0ICpiaWdfYXJtb3VycyA9IFBMLT5GaWx0ZXJBcm1vdXJzKCMnX2Ftb3VyX2lzX2JpZ2dlciwgNTApOyAKKworICAgICAzKSBhbGxlIFJ1ZXN0dW5nZW4gbWl0IGVpbmVyIHNwZXppZWxsZW4gSUQuCisgICAgIHByaXZhdGUgaW50IF9oYXNfaWQob2JqZWN0IHJ1ZXN0dW5nLCBzdHJpbmcgaWRzdHIpIHsKKyAgICAgICByZXR1cm4gcnVlc3R1bmctPmlkKGlkc3RyKTsKKyAgICAgfQorICAgICBvYmplY3QgKmhhc19pZCA9IFBMLT5GaWx0ZXJBcm1vdXJzKCMnX2hhc19pZCwgIlxudG9sbGVydWVzdHVuZyIpOworCisgICAgIDQpIGFsbGUgUnVlc3R1bmdlbiBtaXQgZWluZXIgc3BlemllbGxlbiBJRCwgZGllIGdyb2Vzc2VyIGFscyA1MGNtIHNpbmQuCisgICAgIHByaXZhdGUgaW50IF9oYXNfaWQob2JqZWN0IHJ1ZXN0dW5nLCBzdHJpbmcgaWRzdHIsIGludCBzaXplKSB7CisgICAgICAgcmV0dXJuIHJ1ZXN0dW5nLT5pZChpZHN0cikgJiYgcnVlc3R1bmctPlF1ZXJ5UHJvcChQX1NJWkUpID4gc2l6ZTsKKyAgICAgfQorICAgICBvYmplY3QgKmhhc19pZCA9IFBMLT5GaWx0ZXJBcm1vdXJzKCMnX2hhc19pZCwgIlxudG9sbGVydWVzdHVuZyIsIDUwKTsKKworICAgICA1KSB1ZWJlcmhhdXB0IGFsbGUgZ2V0cmFnZW5lIFJ1ZXN0dW5nCisgICAgIG9iamVjdCAqcnVlID0gUEwtPkZpbHRlckFybW91cnMoIydvYmplY3RwKQorCisKK1NJRUhFIEFVQ0g6CisgICAgIFdlYXIoKSwgV2VhckFybW91cigpLCBXZWFyQ2xvdGhpbmcoKSwgVW53ZWFyKCksIFVud2VhckFybW91cigpLCAKKyAgICAgVW53ZWFyQ2xvdGhpbmcoKQorICAgICBQX0NMT1RISU5HLCBQX0FSTU9VUlMKKyAgICAgRmlsdGVyQ2xvdGhpbmcoKSwgUXVlcnlBcm1vdXJCeVR5cGUoKQorCitaVUxFVFpUIEdFQWVOREVSVDoKKzE0LjAzLjIwMDksIFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0ZpbHRlckNsb3RoaW5nIGIvZG9jL2xmdW4vRmlsdGVyQ2xvdGhpbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTViMDBlMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0ZpbHRlckNsb3RoaW5nCkBAIC0wLDAgKzEsNTEgQEAKK0ZpbHRlckNsb3RoaW5nCitGVU5LVElPTjoKKyAgICAgcHVibGljIG9iamVjdCAqRmlsdGVyQ2xvdGhpbmcoY2xvc3VyZSBmaWx0ZXJmdW4sIHZhcmFyZ3MgbWl4ZWQqIGV4dHJhKQorCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvbGl2aW5nL2Nsb3RoaW5nLmMKKworQVJHVU1FTlRFOgorICAgICBjbG9zdXJlIGZpbHRlcmZ1bgorICAgICAgIERpZSBDbG9zdXJlLCBkaWUgZW50c2NoZWlkZW4gc29sbCwgb2IgZWluZSBLbGVpZHVuZyBpbSBFcmdlYm5pc2FycmF5CisgICAgICAgZW50aGFsdGVuIHNlaW4gc29sbC4KKworQkVTQ0hSRUlCVU5HOgorICAgICBEaWVzZSBGdW5rdGlvbiBydWZ0IDxmaWx0ZXJmdW5jPiBmdWVyIGplZGUgZ2V0cmFnZW5lIEtsZWlkdW5nIGRlcworICAgICBMZWJld2VzZW4gbWl0IGRlciBqZXdlaWxpZ2VuIEtsZWlkdW5nIGFscyBBcmd1bWVudCBhdWYgdW5kIGxpZWZlcnQgZWluCisgICAgIEFycmF5IG1pdCBhbGxlciBLbGVpZHVuZyB6dXJ1ZWNrLCBmdWVyIGRpZSA8ZmlsdGVyZnVuPiBlaW5lbiBXZXJ0ICE9IDAKKyAgICAgenVydWVja2xpZWZlcnQuCisgICAgIERpZSA8ZXh0cmE+IEFyZ3VtZW50ZSB3ZXJkZW4gYWxzIHp1c2FldHpsaWNoZSBQYXJhbWV0ZXIgYW4gPGZpbHRlcmZ1bj4KKyAgICAgdWViZXJnZWJlbiB1bmQgZHVlcmZlbiBrZWluZSBSZWZlcmVuemVuIHNlaW4uCisgICAgIAorICAgICBEaWVzZSBWYXJpYW50ZSBpc3QgenUgYmV2b3J6dWdlbiwgd2VubiBtYW4gZGllIGdldHJhZ2UgS2xlaWR1bmcgbmFjaAorICAgICBiZXN0aW1tdGVuIEtyaXRlcmllbiBkdXJjaHN1Y2hlbiB3aWxsLiAKKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgRWluIEFycmF5IHZvbiBPYmpla3RlbiBtaXQgYWxsZW4gcGFzc2VuZGVuIEtsZWlkdW5nLgorCitCRUlTUElFTEU6CisgICAgIDEpIEljaCBtb2VjaHRlIGFsbGUgS2xlaWR1bmcsIGRpZSBncm9lc3NlciBhbHMgNTBjbSBpc3QuCisgICAgIHByaXZhdGUgaW50IF9hcm1vdXJfaXNfYmlnZ2VyKG9iamVjdCBjbG90aGluZywgaW50IHNpemUpIHsKKyAgICAgICByZXR1cm4gY2xvdGhpbmctPlF1ZXJ5UHJvcChQX1NJWkUpID4gc2l6ZTsKKyAgICAgfQorICAgICAuLi4KKyAgICAgb2JqZWN0ICpiaWdfYXJtb3VycyA9IFBMLT5GaWx0ZXJDbG90aGluZygjJ19hbW91cl9pc19iaWdnZXIsIDUwKTsgCisKKyAgICAgMikgYWxsZSBLbGVpZHVuZyBtaXQgZWluZXIgc3BlemllbGxlbiBJRC4KKyAgICAgcHJpdmF0ZSBpbnQgX2hhc19pZChvYmplY3QgY2xvdGhpbmcsIHN0cmluZyBpZHN0cikgeworICAgICAgIHJldHVybiBjbG90aGluZy0+aWQoaWRzdHIpOworICAgICB9CisgICAgIG9iamVjdCAqaGFzX2lkID0gUEwtPkZpbHRlckNsb3RoaW5nKCMnX2hhc19pZCwgIlxudG9sbGVrbGVpZHVuZyIpOworCisgICAgIDMpIHVlYmVyaGF1cHQgYWxsZSBnZXRyYWdlbmUgS2xlaWR1bmcKKyAgICAgb2JqZWN0ICpjbG90aGluZyA9IFBMLT5GaWx0ZXJDbG90aGluZygjJ29iamVjdHApCisKK1NJRUhFIEFVQ0g6CisgICAgIFdlYXIoKSwgV2VhckFybW91cigpLCBXZWFyQ2xvdGhpbmcoKSwgVW53ZWFyKCksIFVud2VhckFybW91cigpLCAKKyAgICAgVW53ZWFyQ2xvdGhpbmcoKQorICAgICBQX0NMT1RISU5HLCBQX0FSTU9VUlMKKyAgICAgRmlsdGVyQXJtb3VycygpLCBRdWVyeUFybW91ckJ5VHlwZSgpCisKK1pVTEVUWlQgR0VBZU5ERVJUOgorMTQuMDMuMjAwOSwgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vRmluZEJlc3RBcm1vdXJzIGIvZG9jL2xmdW4vRmluZEJlc3RBcm1vdXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZTczNGIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9GaW5kQmVzdEFybW91cnMKQEAgLTAsMCArMSwzOCBAQAorRmluZEJlc3RBcm1vdXJzKCkKKworRlVOS1RJT046CisgICAgdmFyYXJncyBvYmplY3QgKkZpbmRCZXN0QXJtb3VycyhtaXhlZCB0eXBlLCBpbnQgbWF4bW9uLCBpbnQgbWF4dywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgbWluYWMsIG1peGVkIHJlc3RyKQorIAorREVGSU5JRVJUIElOOgorICAgIC9zdGQvcm9vbS9zaG9wLmMKKyAKK0FSR1VNRU5URToKKyAgICB0eXBlICAgLSBnZXd1ZW5zY2h0ZXIgUnVlc3R1bmdzdHlwIC8gUnVlc3R1bmdzdHlwZW4KKyAgICBtYXhtb24gLSBHZWxkIGRhcyBhdXNnZWdlYmVuIHdlcmRlbiBkYXJmCisgICAgbWF4dyAgIC0gTWF4aW1hbGVzIEdld2ljaHQKKyAgICBtaW5hYyAgLSBtaW5pbWFsZSBnZXd1ZW5zY2h0ZSBSdWVzdHVuZ3NrbGFzc2UgcHJvIFR5cAorICAgIHJlc3RyICAtIHp1c2FldHpsaWNoZXMgQXJndW1lbnQgZnVlciBDaGVja0ZpbmRSZXN0cmljdGlvbnMoKQorCitCRVNDSFJFSUJVTkc6CisgICAgU3VjaHQgZGllIGJlc3RlbiBSdWVzdHVuZ2VuLCBkaWUgZGVyIExhZGVuIHZlcmthdWZlbiBrYW5uLgorIAorUlVFQ0tHQUJFV0VSVDoKKyAgICBEaWUgYmVzdGVuIFJ1ZXN0dW5nZW4KKyAKK0JFTUVSS1VORzoKKyAgICBEaWUgUXVhbGl0YWV0IGRlciBSdWVzdHVuZyB3aXJkIG1pdCBFdmFsQXJtb3VyKCkgYmVzdGltbXQuCisgICAgSGFiZW4gendlaSBSdWVzdHVuZ2VuIGRpZSBnbGVpY2hlIFF1YWxpdGFldCwKKyAgICB3aXJkIGRpZSBwcmVpc3dlcnRlcmUgZ2Vub21tZW4uCisgCitCRUlTUElFTDoKKyAgICBGaW5kQmVzdEFybW91cnMoQVRfQVJNT1VSLDUwMDApCisgICAgQmVzdGVzIFJ1ZXN0dW5nIHVudGVyIDUwMDAgTXVlbnplbi4KKworICAgIEZpbmRCZXN0QXJtb3Vycygoe0FUX0FSTU9VUixBVF9DTE9BSyxBVF9CT09UfSksMTAwMDAsKFtBVF9BUk1PVVI6MjBdKSkKKyAgICBGaW5kZWQgYmVzdGUgUnVlc3R1bmcsIFVtaGFuZyB1bmQgU2NodWhlLCBkaWUgZGVyIExhZGVuIGZ1ZXIKKyAgICBpbnNnZXNhbXQgMTAwMDAgTXVlbnplbiB2ZXJrYXVmZW4ga2Fubiwgd29iZWkgZGllIFJ1ZXN0dW5nIG1pbmRlc3RlbnMKKyAgICBBQyAyMCBoYWJlbiBtdXNzLgorCitTSUVIRSBBVUNIOgorICAgIEZpbmRCZXN0V2VhcG9uKCksIENoZWNrRmluZFJlc3RyaWN0aW9ucygpLCBFdmFsQXJtb3VyKCkKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0ZpbmRCZXN0V2VhcG9uIGIvZG9jL2xmdW4vRmluZEJlc3RXZWFwb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBiYThmMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0ZpbmRCZXN0V2VhcG9uCkBAIC0wLDAgKzEsMzMgQEAKK0ZpbmRCZXN0V2VhcG9uKCkKKworRlVOS1RJT046CisgICAgdmFyYXJncyBvYmplY3QgRmluZEJlc3RXZWFwb24obWl4ZWQgdHlwZSwgaW50IG1heG1vbiwgaW50IG1heHcsIGludCBoYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWlud2MsIG1peGVkIHJlc3RyKQorIAorREVGSU5JRVJUIElOOgorICAgIC9zdGQvcm9vbS9zaG9wLmMKKyAKK0FSR1VNRU5URToKKyAgICB0eXBlICAgLSBnZXd1ZW5zY2h0ZXIgV2FmZmVudHlwIC8gV2FmZmVudHlwZW4KKyAgICBtYXhtb24gLSBHZWxkIGRhcyBhdXNnZWdlYmVuIHdlcmRlbiBkYXJmCisgICAgbWF4dyAgIC0gTWF4aW1hbGVzIEdld2ljaHQKKyAgICBoYW5kcyAgLSBBbnphaGwgSGFlbmRlLCBkaWUgZGllIFdhZmZlIGJlbGVnZW4gZGFyZgorICAgIG1pbndjICAtIG1pbmltYWxlIGdld3VlbnNjaHRlIFdhZmZlbmtsYXNzZQorICAgIHJlc3RyICAtIHp1c2FldHpsaWNoZXMgQXJndW1lbnQgZnVlciBDaGVja0ZpbmRSZXN0cmljdGlvbnMoKQorCitCRVNDSFJFSUJVTkc6CisgICAgU3VjaHQgZGllIGJlc3RlIFdhZmZlLCBkaWUgZGVyIExhZGVuIHZlcmthdWZlbiBrYW5uLgorIAorUlVFQ0tHQUJFV0VSVDoKKyAgICBEaWUgYmVzdGUgV2FmZmUgOi0pCisgCitCRU1FUktVTkc6CisgICAgRGllIFF1YWxpdGFldCBkZXIgV2FmZmUgd2lyZCBtaXQgRXZhbFdlYXBvbigpIGJlc3RpbW10LgorICAgIEhhYmVuIHp3ZWkgV2FmZmVuIGRpZSBnbGVpY2hlIFF1YWxpdGFldCwgd2lyZCBkaWUgcHJlaXN3ZXJ0ZXJlIGdlbm9tbWVuLgorIAorQkVJU1BJRUw6CisgICAgRmluZEJlc3RXZWFwb24oV1RfU1dPUkQsNTAwMCwxKQorICAgIEJlc3RlcyBlaW5oYWVuZGlnZXMgU2Nod2VydCB1bnRlciA1MDAwIE11ZW56ZW4uCisKK1NJRUhFIEFVQ0g6CisgICAgRmluZEJlc3RBcm1vdXJzKCksIENoZWNrRmluZFJlc3RyaWN0aW9ucygpLCBFdmFsV2VhcG9uKCkKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0ZpbmREaXN0YW50RW5lbXlWaWN0aW0gYi9kb2MvbGZ1bi9GaW5kRGlzdGFudEVuZW15VmljdGltCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MWMyN2YKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9GaW5kRGlzdGFudEVuZW15VmljdGltCkBAIC0wLDAgKzEsMzIgQEAKK0ZpbmREaXN0YW50RW5lbXlWaWN0aW0oKQorCitGVU5LVElPTjoKKwlvYmplY3QgRmluZERpc3RhbnRFbmVteVZpY3RpbShzdHJpbmcgd2VuLCBvYmplY3QgcGwsIHN0cmluZyBtc2csCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpc3QsIGludCBkeSkKKworREVGSU5JRVJUIElOOgorCS9zdGQvc3BlbGxib29rLmMKKworQVJHVU1FTlRFOgorCXdlbiAgLSBpZCBkZXMgZ2V3dWVuc2NodGVuIEdlZ25lcnMsIGZhbGxzIG5pY2h0IGFuZ2VnZWJlbjoKKyAgICAgICAgICAgICAgIFNlbGVjdEVuZW15KEZpbmREaXN0YW50R3JvdXAocGwsLTEsZGlzdCxkeSwxMDAwMCkKKwlwbCAgIC0gQ2FzdGVyLgorCW1zZyAgLSBOYWNocmljaHQgZmFsbHMgR2VnbmVyIG5pY2h0IGFud2VzZW5kIGlzdC4KKwlkaXN0IC0gRW50ZmVybnVuZworCWR5ICAgLSAyKmVybGF1YnRlIEFid2VpY2h1bmcgdm9uIGRlciBFbnRmZXJudW5nLCBkZWZhdWx0IDEwMAorCitCRVNDSFJFSUJVTkc6CisJRmluZGV0IGVpbmVuIEdlZ25lciBpbiBFbnRmZXJudW5nIGRpc3QtZHkvMiBiaXMgZGlzdCtkeS8yCisJei5CLiBmdWVyIGVpbmVuIEFuZ3JpZmZzc3BydWNoLgorCQorUlVFQ0tHQUJFV0VSVDoKKwlEZXIgQXVzZXJ3YWVobHRlIDotKQorCitCRU1FUktVTkdFTjoKKwkxLiBEZXIgR2VnbmVyIHdpcmQgYXVmIGplZGVuIEZhbGwgYW5nZWdyaWZmZW4uCisJMi4gZGlzdCB3aXJkIG1pdCBTQV9SQU5HRSBtb2RpZml6aWVydCwKKwkgICBkeSB3aXJkIG1pdCBTQV9FWFRFTlNJT04gbW9kaWZpemllcnQuCisJMy4gRGllIEVudGZlcm51bmcgaXN0IHJlbGF0aXYgenVtIFNwaWVsZXIuCisKK1NJRUhFIEFVQ0g6CisJdGVhbXMsIEZpbmRFbmVteVZpY3RpbSwgRmluZE5lYXJFbmVteVZpY3RpbSwgRmluZEZhckVuZW15VmljdGltCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9GaW5kRGlzdGFudEdyb3VwIGIvZG9jL2xmdW4vRmluZERpc3RhbnRHcm91cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGVkYWI2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vRmluZERpc3RhbnRHcm91cApAQCAtMCwwICsxLDMxIEBACitGaW5kRGlzdGFudEdyb3VwKCkKKworRlVOS1RJT046CisJdmFyYXJncyBvYmplY3QgKkZpbmREaXN0YW50R3JvdXAob2JqZWN0IHBsLCBpbnQgd2hvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlzdCwgaW50IGR5LCBpbnQgZHgpCisKK0RFRklOSUVSVCBJTjoKKwkvc3RkL3NwZWxsYm9vay5jCisKK0FSR1VNRU5URToKKwlwbCAgIC0gQ2FzdGVyCisJd2hvICAtIDE9RnJldW5kZSwgLTE9R2VnbmVyLCAwPWJlaWRlCisJZGlzdCAtIEVudGZlcm51bmcKKwlkeSAgIC0gVGllZmUgICAgICAoZGVmYXVsdCAxMDApCisJZHggICAtIEJyZWl0ZSAgICAgKGRlZmF1bHQgMTAwKk1BWF9URUFNX1JPV0xFTikKKworQkVTQ0hSRUlCVU5HOgorCUVybWl0dGVsdCBMZWJld2VzZW4sIGRpZSBzaWNoIGluIEVudGZlcm51bmcgPGRpc3Q+IGluIGVpbmVtIEJlcmVpY2gKKwlkZXIgQnJlaXRlIDxkeD4gdW5kIFRpZWZlIDxkeT4gYmVmaW5kZW4uCisKK1JVRUNLR0FCRVdFUlQ6CisJQXJyYXkgbWl0IGRlbiBnZWZ1bmRlbmVuIExlYmV3ZXNlbi4KKworQkVNRVJLVU5HRU46CisJR2VuYXVlcmUgSGlud2Vpc2UgdW50ZXIgIkZpbmREaXN0YW50R3JvdXBzIi4KKwlXZXIgc293b2hsIEZyZXVuZGUgd2llIGF1Y2ggRmVpbmRlIGluIGdldHJlbm50ZW4gQXJyYXlzIGJyYXVjaHQsCisJc29sbHRlIEZpbmREaXN0YW50R3JvdXBzIHN0YXR0IEZpbmREaXN0YW50R3JvdXAgdmVyd2VuZGVuLgorCitTSUVIRSBBVUNIOgorCXRlYW1zLCBGaW5kRGlzdGFudEdyb3VwcworCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9GaW5kRGlzdGFudEdyb3VwcyBiL2RvYy9sZnVuL0ZpbmREaXN0YW50R3JvdXBzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwN2I3MmUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9GaW5kRGlzdGFudEdyb3VwcwpAQCAtMCwwICsxLDU5IEBACitGaW5kRGlzdGFudEdyb3VwcygpCisKK0ZVTktUSU9OOgorCXZhcmFyZ3MgbWl4ZWQgRmluZERpc3RhbnRHcm91cHMob2JqZWN0IHBsLCBpbnQgZGlzdCwgaW50IGR5LCBpbnQgZHgpCisKK0RFRklOSUVSVCBJTjoKKwkvc3RkL3NwZWxsYm9vay5jCisKK0FSR1VNRU5URToKKwlwbCAgIC0gQ2FzdGVyCisJZGlzdCAtIEVudGZlcm51bmcKKwlkeSAgIC0gVGllZmUgICAgICAoZGVmYXVsdCAxMDApCisJZHggICAtIEJyZWl0ZSAgICAgKGRlZmF1bHQgMTAwKk1BWF9URUFNX1JPV0xFTikKKworQkVTQ0hSRUlCVU5HOgorCUVybWl0dGVsZCBmZWluZGxpY2hlIChiZWkgU3BpZWxlcm4gTlBDcywgYmVpIE5QQ3MgU3BpZWxlcikgdW5kCisJZnJldW5kbGljaGUgKGJlaSBTcGllbGVybiBTcGllbGVyLCBiZWkgTlBDcyBOUENzKSBMZWJld2VzZW4sCisJZGllIHNpY2ggaW4gRW50ZmVybnVuZyA8ZGlzdD4gaW4gZWluZW0gQmVyZWljaCBkZXIgQnJlaXRlIDxkeD4KKwl1bmQgVGllZmUgPGR5PiBiZWZpbmRlbi4KKworUlVFQ0tHQUJFV0VSVDoKKwlBcnJheSBtaXQgendlaSBBcnJheXMgYWxzIEluaGFsdDoKKwkoeyBmZWluZGxpY2hlIExlYmV3ZXNlbiwgZnJldW5kbGljaGUgTGViZXdlc2VuIH0pCisKK0JFTUVSS1VOR0VOOgorCURpZSBFbnRmZXJudW5nc2FuZ2FiZW4gc2luZCBhbHMgY20uIHp1IHZlcnN0ZWhlbi4KKwlKZWRlcyBMZWJld2VzZW4gYmVsZWd0IDUwY20geCA1MGNtIG1pdCBBYnN0YW5kIDUwY20KKwl6dW0gbmFlY2hzdGVuIExlYmV3ZXNlbiBpbiBqZWRlciBSaWNodHVuZy4KKwlEaWUgQnJlaXRlbmFuZ2FiZSB3aXJrdCBzaWNoIG51ciBpbiBkZXIgQW56YWhsIGRlcgorCUxlYmV3ZXNlbiBhdXMsIGRpZSB6dWZhZWxsaWcgcHJvIFJlaWhlIGF1c2dld2FlaGx0IHdlcmRlbi4KKwlEaWUgU2tpbGxhdHRyaWJ1dGUgU0FfUkFOR0UgdW5kIFNBX0VYVEVOU0lPTiB3ZXJkZW4gYmVydWVja3NpY2h0aWd0LgorCitCRUlTUElFTDoKKwlkaXN0PTIwMCwgZHk9MjAwLCBkeD0yMDAsIGVpbiBQdW5rdCA9IDUwY20geCA1MGNtCisJICAgLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLgorCTMuIC4gLiAuIC4gLiAuIEcgLiAuIC4gLiAuIC4KKwkgICAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuCisJMi4gLiAuIC4gLiAuIEcgLiBHIC4gLiAuIC4gLmRpc3QrZHkvMi0rCisJICAgLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAgICAgICAgICB8ICAKKwkxLiAuIC4gLiAuIEcgLiBHIC4gRyAuIC4gLiAuICAgICBkaXN0ICstKyAoR2VnbmVyIEcpCisJLS0tLi0uLS4tLi0uLS4tLi0uLS4tLi0uLS4tLiAgICAgICAgICB8IHwKKwkxLiAuIC4gLiAuIEYgLiBGIC4gRiAuIC4gLiAuZGlzdC1keS8yLSsgfCAoRnJldW5kZSBGKQorCSAgIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gICAgICAgICAgICB8CisJMi4gLiAuIC4gLiAuIEYgLiBTIC4gLiAuIC4gLi0tLS0tLS0tLS0tLSsgKFJlaWhlIGRlcyBTcGllbGVycyBTKQorCSAgIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4KKwkzLiAuIC4gLiAuIC4gLiBGIC4gLiAuIC4gLiAuCisJICAgLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLgorCUFiZ2VkZWNrdGVyIEJlcmVpY2g6ICAgICAgICAgICAxMDBjbSAgYmlzICAzMDBjbQorICAgICAgICAgICAgICAgIFJlaWhlIDM6ICAzNzVjbS4uNDI1Y20gICAgICAgICAzNzU+MzAwIC0+IG5pY2h0IGVyd2lzY2h0CisgICAgICAgICAgICAgICAgUmVpaGUgMjogIDI3NWNtLi4zMjVjbSAgICAgICAgIDI3NTwzMDAgLT4gZXJ3aXNjaHQKKwlHZWduZXIgIFJlaWhlIDE6ICAxNzVjbS4uMjI1Y20gMTAwPDE3NSwyMjU8MzAwIC0+IGVyd2lzY2h0CisJRnJldW5kZSBSZWloZSAxOiAgIDc1Y20uLjEyNWNtIDEwMDwxMjUgICAgICAgICAtPiBlcndpc2NodAorCSAgICAgICAgUmVpaGUgMjogIC0yNWNtLi4uMjVjbSAxMDA+IDI1ICAgICAgICAgLT4gbmljaHQgZXJ3aXNjaHQKKyAgICAgICAgICAgICAgICBSZWloZSAzOiAtMTI1Y20uLi03NWNtIDEwMD4tNzUgICAgICAgICAtPiBuaWNodCBlcndpc2NodAorCUVyZ2VibmlzOiAoeyh7RyxHLEcsR30pLCh7RixGfSl9KQorCShNYXhpbWFsIDIgTGViZXdlc2VuIHBybyBSZWloZSBiZWkgQnJlaXRlIDIwMCkuCisKK1NJRUhFIEFVQ0g6CisJdGVhbXMsIEZpbmREaXN0YW50R3JvdXAKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0ZpbmRFbmVteVZpY3RpbSBiL2RvYy9sZnVuL0ZpbmRFbmVteVZpY3RpbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWI3MmZjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vRmluZEVuZW15VmljdGltCkBAIC0wLDAgKzEsMjQgQEAKK0ZpbmRFbmVteVZpY3RpbSgpCisKK0ZVTktUSU9OOgorCW9iamVjdCBGaW5kRW5lbXlWaWN0aW0oc3RyaW5nIHdlbiwgb2JqZWN0IHBsLCBzdHJpbmcgbXNnKQorCitERUZJTklFUlQgSU46CisJL3N0ZC9zcGVsbGJvb2suYworCitBUkdVTUVOVEU6CisJd2VuIC0gaWQgZGVzIGdld3VlbnNjaHRlbiBHZWduZXJzLCBmYWxscyBuaWNodCBhbmdlZ2ViZW4gU2VsZWN0RW5lbXkuCisJcGwgIC0gQ2FzdGVyLgorCW1zZyAtIE5hY2hyaWNodCBmYWxscyBHZWduZXIgbmljaHQgYW53ZXNlbmQgaXN0LgorCitCRVNDSFJFSUJVTkc6CisJRmluZGV0IGVpbmVuIEdlZ25lciwgei5CLiBmdWVyIGVpbmVuIEFuZ3JpZmZzc3BydWNoLgorCQorUlVFQ0tHQUJFV0VSVDoKKwlEZXIgQXVzZXJ3YWVobHRlIDotKQorCitCRU1FUktVTkdFTjoKKwlEZXIgR2VnbmVyIHdpcmQgYXVmIGplZGVuIEZhbGwgYW5nZWdyaWZmZW4uCisKK1NJRUhFIEFVQ0g6CisJRmluZExpdmluZ1ZpY3RpbQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vRmluZEZhckVuZW15VmljdGltIGIvZG9jL2xmdW4vRmluZEZhckVuZW15VmljdGltCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0M2RkYTYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9GaW5kRmFyRW5lbXlWaWN0aW0KQEAgLTAsMCArMSwzMCBAQAorRmluZEZhckVuZW15VmljdGltKCkKKworRlVOS1RJT046CisJb2JqZWN0IEZpbmRGYXJFbmVteVZpY3RpbShzdHJpbmcgd2VuLCBvYmplY3QgcGwsIHN0cmluZyBtc2csCisJICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWluLCBpbnQgbWF4KQorCitERUZJTklFUlQgSU46CisJL3N0ZC9zcGVsbGJvb2suYworCitBUkdVTUVOVEU6CisJd2VuIC0gaWQgZGVzIGdld3VlbnNjaHRlbiBHZWduZXJzLCBTZWxlY3RGYXJFbmVteSBmYWxscyBuL2EuCisJcGwgIC0gQ2FzdGVyLgorCW1zZyAtIE5hY2hyaWNodCBmYWxscyBHZWduZXIgbmljaHQgYW53ZXNlbmQgaXN0LgorCW1pbiAtIG1pbmltYWxlIEthbXBmcmVpaGUKKwltYXggLSBtYXhpbWFsZSBLYW1wZnJlaWhlCisKK0JFU0NIUkVJQlVORzoKKwlGaW5kZXQgZWluZW4gR2VnbmVyIGF1cyBLYW1wZnJlaWhlIDxtaW4+IGJpcyA8bWF4PgorCXouQi4gZnVlciBlaW5lbiBBbmdyaWZmc3NwcnVjaC4KKwkKK1JVRUNLR0FCRVdFUlQ6CisJRGVyIEF1c2Vyd2FlaGx0ZSA6LSkKKworQkVNRVJLVU5HRU46CisJMS4gRGVyIEdlZ25lciB3aXJkIGF1ZiBqZWRlbiBGYWxsIGFuZ2VncmlmZmVuLgorCTIuIERpZSBSZWloZW5hbmdhYmVuIHdlcmRlbiBOSUNIVCBtaXQgU2tpbGxhdHRyaWJ1dGVuIG1vZGlmaXppZXJ0LgorCTMuIERpZSBBbmdhYmUgZGVyIFJlaWhlIGlzdCBhYnNvbHV0LgorCitTSUVIRSBBVUNIOgorCXRlYW1zLCBGaW5kRW5lbXlWaWN0aW0sIEZpbmROZWFyRW5lbXlWaWN0aW0sIEZpbmREaXN0YW50RW5lbXlWaWN0aW0KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0ZpbmRHcm91cCBiL2RvYy9sZnVuL0ZpbmRHcm91cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzFjNjkzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vRmluZEdyb3VwCkBAIC0wLDAgKzEsNzYgQEAKK0ZpbmRHcm91cCgpCisKK0ZVTktUSU9OOgorICAgIG9iamVjdCpGaW5kR3JvdXAob2JqZWN0IHBsLGludCB3aG8pOworCitERUZJTklFUlQgSU46CisgICAgL3N0ZC9zcGVsbGJvb2suYworCitBUkdVTUVOVEU6CisgICAgcGwKKyAgICAgIExlYmV3ZXNlbiwgdm9uIHdlbGNoZW0gZGllIEZyZXVuZGUgb2RlciBGZWluZGUgaW4gZGVyIFVtZ2VidW5nCisgICAgICBnZWZ1bmRlbiB3ZXJkZW4gc29sbGVuLgorICAgIHdobworICAgICAgRmxhZywgd2VsY2hlcyBhbnplaWd0LCBvYiBGcmV1bmRlIG9kZXIgRmVpbmRlIGdlZnVuZGVuIHdlcmRlbgorICAgICAgc29sbGVuIChLb25zdGFudGVuIGRlZmluaWVydCBpbiAnL3N5cy9uZXdfc2tpbGxzLmgnKToKKyAgICAgICAgRkdfRU5FTUlFUyAtIChXZXJ0IC0xKSBGZWluZGUgc29sbGVuIGdlZnVuZGVuIHdlcmRlbgorICAgICAgICBGR19GUklFTkRTIC0gKFdlcnQgIDEpIEZyZXVuZGUgc29sbGVuIGdlZnVuZGVuIHdlcmRlbgorICAgICAgICBGR19BTEwgICAgIC0gKFdlcnQgIDApIGFsbGUgTGViZXdlc2VuIHNvbGxlbiBnZWZ1bmRlbiB3ZXJkZW4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICBBcnJheSBtaXQgZ2VmdW5kZW5lbiBMZWJld2VzZW4KKworQkVTQ0hSRUlCVU5HOgorICAgIEJlaSBTcGVsbHMsIGRpZSBzaWNoIGF1ZiBtZWhyZXJlIEdlZ25lciBhdXN3aXJrZW4gb2RlciBiZWkgZGVuZW4gbWFuCisgICAgcGVyIEhhbmQgZWluIE9wZmVyIGF1c3dhZWhsZW4gbW9lY2h0ZSwgbGFlc3N0IHNpY2ggbWl0dGVscyBkZXIKKyAgICBGdW5rdGlvbiBGaW5kR3JvdXAoKSBlaW5lIExpc3RlIHZvbiBMZWJld2VzZW4gZXJtaXR0ZWxuLCB3ZWxjaGUgaW4KKyAgICBkZXIgVW1nZWJ1bmcgdm9uIDxwbD4genUgZmluZGVuIHNpbmQuCisgICAgSmUgbmFjaGRlbSwgd2FzIG1hbiBkZW5uIGdlbmF1IHZvcmhhdCwga2FubiBtYW4gc2ljaCB2b24gZGVyCisgICAgRnVua3Rpb24gZnJldW5kbGljaCBvZGVyIGZlaW5kbGljaCBnZXNpbm50ZSBMZWJld2VzZW4gaGVyYXVzc3VjaGVuCisgICAgbGFzc2VuLgorICAgIFdpbGwgbWFuIGRpZSBmcmV1bmRsaWNoIGdlc2lubnRlbiBMZWJld2VzZW4gZXJtaXR0ZWxuLCBzbyB1ZWJlcmdpYnQKKyAgICBtYW4gaW4gPHdobz4gZGllIEtvbnN0YW50ZSBGR19GUklFTkRTLCBiZWkgZmVpbmRsaWNoIGdlc2lubnRlbiBkaWUKKyAgICBLb25zdGFudGUgRkdfRU5FTUlFUywgdW5kIHdlbm4gbWFuIGFsbGUgTGViZXdlc2VuIGJla29tbWVuIG1vZWNodGUKKyAgICBzY2hsaWVzc2xpY2ggRkdfQUxMLgorICAgIEJlaSBkZXIgQXVzd2FobCBnZWx0ZW4gZm9sZ2VuZGUgUmVnZWxuOgorICAgICAgKDEpIExlYmV3ZXNlbiwgbWl0IGRlbmVuIDxwbD4gaW0gS2FtcGYgaXN0LCBzaW5kIGdydW5kc2FldHpsaWNoCisgICAgICAgICAgZmVpbmRsaWNoIGdlc2lubnQuCisgICAgICAoMikgVGVhbW1pdGdsaWVkZXIgdm9uIDxwbD4gc2luZCBncnVuZHNhZXR6bGljaCBmcmV1bmRsaWNoCisgICAgICAgICAgZ2VzaW5udC4KKyAgICAgICgzKSBTcGllbGVyIHNpbmQgZ2VnZW51ZWJlciBTcGllbGVybiBmcmV1bmRsaWNoIGdlc2lubnQsIE5QQ3MKKyAgICAgICAgICBnZWdlbnVlYmVyIE5QQ3MuIE5QQ3Mga2FubiBtYW4gaGllcmJlaSBtaXQgSGlsZmUgZGVyIFByb3BlcnR5CisgICAgICAgICAgUF9GUklFTkQgZGVuIFNwaWVsZXJuIHp1b3JkbmVuLgorICAgICAgKDQpIERhcmF1cyBmb2xndCBuYXR1ZXJsaWNoLCBkYXNzIFNwaWVsZXIgdW5kIE5QQ3MgZ3J1bmRzYWV0emxpY2gKKyAgICAgICAgICBlaW5lIGZlaW5kbGljaGUgRWluc3RlbGx1bmcgZ2VnZW51ZWJlciBoYWJlbiwgc29mZXJuIGRpZSBOUENzCisgICAgICAgICAgbmljaHQgZGllIFByb3BlcnR5IFBfRlJJRU5EIGdlc2V0enQgaGFiZW4KKyAgICAgICAgICAgKHdhcyBzdGFuZGFyZG1hZXNzaWcgbmF0dWVybGljaCBuaWNodCBkZXIgRmFsbCBpc3QpLgorICAgICAgKDUpIE5ldHp0b3RlIHdlcmRlbiBuaWNodCBlcmthbm50LgorICAgICAgKDYpIE1hZ2llciB3ZXJkZW4gbmljaHQgZXJrYW5udCwgd2VubiBzaWUgdW5zaWNodGJhciBzaW5kLgorICAgICAgKDcpIEVpbiBNYWdpZXIgd2lyZCBhbHMgZmVpbmRsaWNoIGdlc2lubnQgbnVyIGRhbm4gZXJrYW5udCwgd2VubgorICAgICAgICAgIDxwbD4gbWl0IGlobSBpbSBLYW1wZiBpc3QuCisgICAgICAoNikgU3VjaHQgbWFuIGZlaW5kbGljaCBnZXNpbm50ZSBMZWJld2VzZW4sIHNvIHdlcmRlbiBkaWUsIHdlbGNoZQorICAgICAgICAgIGVpbmUgdm9uIGRlbiBQcm9wZXJ0aWVzIFBfTk9fQVRUQUNLIG9kZXIgUF9OT19HTE9CQUxfQVRUQUNLCisgICAgICAgICAgZ2VzZXR6dCBoYWJlbiwgbmljaHQgZXJrYW5udC4KKyAgICBEaWUgUHJvcGVydHkgUF9GUklFTkQgc29sbHRlIG1hbiBpbiBOUENzIHNldHplbiwgZGllIGRlbSBTcGllbGVyCisgICAgaGlsZnJlaWNoIGJlaXNlaXRlIHN0ZWhlbiwgei5CLiB2b20gU3BpZWxlciBiZXNjaHdvcmVuZSBIaWxmc05QQ3MuCisKK0JFSVNQSUVMRToKKyAgICBXZW5uIG1hbiBlaW5lbiBGZXVlcmJhbGwgbmFjaCBqZW1hbmRlbSB3aXJmdCwgc28gdHJpZmZ0IGRpZXNlciB1bnRlcgorICAgIFVtc3RhZW5kZW4gYXVjaCBhbmRlcmUsIHdlbm4gZXIgZ3Jvc3MgZ2VudWcgaXN0LiBNYW4gbmltbXQgaGllcmJlaQorICAgIGFuLCBkYXNzIHNpY2ggZGllIGZyZXVuZGxpY2ggZ2VzaW5udGVuIExlYmV3ZXNlbiBkZXMgR2VnbmVycyBhdWNoCisgICAgbmFlaGVyIGJlaSBpaG0gYmVmaW5kZW4gYWxzIGRpZSBmZWluZGxpY2ggZ2VzaW5udGVuOgorICAgICAgdmljdGltLT5EZWZlbmQoNTAwLERUX0ZJUkUsKFtTUF9TSE9XX0RBTUFHRToxXSksY2FzdGVyKTsKKyAgICAgIHZpY3RpbUxpc3Q9RmluZEdyb3VwKHZpY3RpbSxGR19GUklFTkRTKTsKKyAgICAgIG1hcF9vYmplY3RzKHZpY3RpbUxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgIkRlZmVuZCIsCisgICAgICAgICAgICAgICAgICAgICAgMTAwLAorICAgICAgICAgICAgICAgICAgICAgIERUX0ZJUkUsCisgICAgICAgICAgICAgICAgICAgICAgKFtTUF9TSE9XX0RBTUFHRToxXSksCisgICAgICAgICAgICAgICAgICAgICAgY2FzdGVyKTsKKyAgICBIaWVybWl0IHRyaWZmdCBtYW4gYWxzbyBhdWNoIGRpZSBGcmV1bmRlIHZvbiA8dmljdGltPi4KKworU0lFSEUgQVVDSDoKKyAgICBGaW5kR3JvdXBOKCksIEZpbmRHcm91cFAoKSwgUF9GUklFTkQsIFBfTk9fR0xPQkFMX0FUVEFDSworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBNb24gSmFuIDI4IDIxOjQ1OjAwIDIwMDIgYnkgVGlhbWFrCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9GaW5kR3JvdXBOIGIvZG9jL2xmdW4vRmluZEdyb3VwTgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzY0Zjc3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vRmluZEdyb3VwTgpAQCAtMCwwICsxLDQ1IEBACitGaW5kR3JvdXBOKCkKKworRlVOS1RJT046CisJb2JqZWN0KkZpbmRHcm91cE4ob2JqZWN0IHBsLGludCB3aG8saW50IG4pOworCitERUZJTklFUlQgSU46CisJL3N0ZC9zcGVsbGJvb2suYworCitBUkdVTUVOVEU6CisJcGwKKwkgIExlYmV3ZXNlbiwgdm9uIHdlbGNoZW0gZGllIEZyZXVuZGUgb2RlciBGZWluZGUgaW4gZGVyIFVtZ2VidW5nCisJICBnZWZ1bmRlbiB3ZXJkZW4gc29sbGVuLgorCXdobworCSAgRmxhZywgd2VsY2hlcyBhbnplaWd0LCBvYiBGcmV1bmRlIG9kZXIgRmVpbmRlIGdlZnVuZGVuIHdlcmRlbgorCSAgc29sbGVuIChLb25zdGFudGVuIGRlZmluaWVydCBpbiAnL3N5cy9uZXdfc2tpbGxzLmgnKToKKwkgICAgRkdfRU5FTUlFUyAtIChXZXJ0IC0xKSBGZWluZGUgc29sbGVuIGdlZnVuZGVuIHdlcmRlbgorCSAgICBGR19GUklFTkRTIC0gKFdlcnQgIDEpIEZyZXVuZGUgc29sbGVuIGdlZnVuZGVuIHdlcmRlbgorCSAgICBGR19BTEwgICAgIC0gKFdlcnQgIDApIGFsbGUgTGViZXdlc2VuIHNvbGxlbiBnZWZ1bmRlbiB3ZXJkZW4KKwluCisJICBBbnphaGwgZGVyIExlYmV3ZXNlbiwgZGllIHp1cnVlY2tnZWdlYmVuIHdlcmRlbiBzb2xsZW4uCisJICBIaWVyYmVpIGdlaHQgdm9yaGVyIG5vY2ggZGFzIFNraWxsYXR0cmlidXRlIFNBX0VYVEVOU0lPTiBlaW4hCisJICBFcyB3aXJkIG1pbmRlc3RlbnMgMSBMZWJld2VzZW4genVydWVja2dlbGllZmVydCAoc29mZXJuIGdlZnVuZGVuKS4KKworUlVlQ0tHQUJFV0VSVDoKKwlBcnJheSBtaXQgZ2VmdW5kZW5lbiBMZWJld2VzZW4KKworQkVTQ0hSRUlCVU5HOgorCUF1c2dlc3VjaHQgd2VyZGVuIGRpZSBMZWJld2VzZW4gZ2VuYXVzbyB3aWUgYmVpIEZpbmRHcm91cCgpLCBudXIKKwlkYXNzIHp1bSBTY2hsdXNzIGRpZSBBbnphaGwgbm9jaCBiZWdyZW56dCB3aXJkLgorCitCRUlTUElFTEU6CisJTWFuIG1vZWNodGUgbWF4aW1hbCA1IEZlaW5kZSBmaW5kZW4sIGRpZSBtYW4gZ2xlaWNoemVpdGlnIG1pdCBlaW5lbQorCVNwZWxsIGJlbGVnZW4ga2FubjoKKwkgIGVuZW15TGlzdD1GaW5kR3JvdXBOKGNhc3RlcixGR19FTkVNSUVTLDUpOworCURpZXMgZ2lsdCBqZWRvY2ggbnVyIGJlaSBTQV9FWFRFTlNJT049PTEwMCwgc29uc3Qgd2lyZAorCWRlbWVudHNwcmVjaGVuZCBtZWhyIG9kZXIgd2VuaWdlciB6dXJ1ZWNrZ2VnZWJlbi4KKwkgKGFsc28gYmVpIFNBX0VYVEVOU0lPTj09MjAwIGRvcHBlbHQgc28gdmllbGUgLT4gMTAgTGViZXdlc2VuKQorCURhcyBTa2lsbGF0dHJpYnV0ZSBTQV9FWFRFTlNJT04ga2FubiBhdWNoIGR1cmNoIFNBX1FVQUxJVFkKKwl2ZXJhZW5kZXJ0IHdvcmRlbiBzZWluOyBkYXMgc29sbHRlIGJlYWNodGV0IHdlcmRlbi4KKworU0lFSEUgQVVDSDoKKwlGaW5kR3JvdXAoKSwgRmluZEdyb3VwUCgpLCBQX0ZSSUVORCwgUF9OT19HTE9CQUxfQVRUQUNLCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IE1vbiBKYW4gMjUgMTU6MDQ6MzEgMTk5OSBieSBQYXRyeW4KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0ZpbmRHcm91cFAgYi9kb2MvbGZ1bi9GaW5kR3JvdXBQCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZWY1NjgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9GaW5kR3JvdXBQCkBAIC0wLDAgKzEsNDYgQEAKK0ZpbmRHcm91cFAoKQorCitGVU5LVElPTjoKKwlvYmplY3QqRmluZEdyb3VwUChvYmplY3QgcGwsaW50IHdobyxpbnQgcHIpOworCitERUZJTklFUlQgSU46CisJL3N0ZC9zcGVsbGJvb2suYworCitBUkdVTUVOVEU6CisJcGwKKwkgIExlYmV3ZXNlbiwgdm9uIHdlbGNoZW0gZGllIEZyZXVuZGUgb2RlciBGZWluZGUgaW4gZGVyIFVtZ2VidW5nCisJICBnZWZ1bmRlbiB3ZXJkZW4gc29sbGVuLgorCXdobworCSAgRmxhZywgd2VsY2hlcyBhbnplaWd0LCBvYiBGcmV1bmRlIG9kZXIgRmVpbmRlIGdlZnVuZGVuIHdlcmRlbgorCSAgc29sbGVuIChLb25zdGFudGVuIGRlZmluaWVydCBpbiAnL3N5cy9uZXdfc2tpbGxzLmgnKToKKwkgICAgRkdfRU5FTUlFUyAtIChXZXJ0IC0xKSBGZWluZGUgc29sbGVuIGdlZnVuZGVuIHdlcmRlbgorCSAgICBGR19GUklFTkRTIC0gKFdlcnQgIDEpIEZyZXVuZGUgc29sbGVuIGdlZnVuZGVuIHdlcmRlbgorCSAgICBGR19BTEwgICAgIC0gKFdlcnQgIDApIGFsbGUgTGViZXdlc2VuIHNvbGxlbiBnZWZ1bmRlbiB3ZXJkZW4KKwlwcgorCSAgV2FocnNjaGVpbmxpY2hrZWl0LCBtaXQgZGVyIGVpbiBMZWJld2VzZW4gYXVzZ2VzdWNodCB3ZXJkZW4gc29sbC4KKwkgIEhpZXJiZWkgZ2VodCB2b3JoZXIgbm9jaCBkYXMgU2tpbGxhdHRyaWJ1dGUgU0FfRVhURU5TSU9OIGVpbiEKKworUlVlQ0tHQUJFV0VSVDoKKwlBcnJheSBtaXQgZ2VmdW5kZW5lbiBMZWJld2VzZW4KKworQkVTQ0hSRUlCVU5HOgorCUF1c2dlc3VjaHQgd2VyZGVuIGRpZSBMZWJld2VzZW4gZ2VuYXVzbyB3aWUgYmVpIEZpbmRHcm91cCgpLCBudXIKKwlkYXNzIHp1bSBTY2hsdXNzIGRpZSBlaW56ZWxuZW4gTGViZXdlc2VuIHBlciBadWZhbGwgYXVzZ2V3YWVobHQKKwl3ZXJkZW4uIEVzIGlzdCBhbHNvIG5pY2h0IGdlc2ljaGVydCwgZGFzcyB1ZWJlcmhhdXB0IGVpbiBMZWJld2VzZW4KKwl6dXJ1ZWNrZ2VsaWVmZXJ0IHdpcmQsIHRyb3R6ZGVtIHdlbGNoZSBnZWZ1bmRlbiB3dXJkZW4uCisKK0JFSVNQSUVMRToKKwlNYW4gbW9lY2h0ZSBpbSBTY2huaXR0IDUwJSBkZXIgRmVpbmRlIGZpbmRlbiwgZGllIG1hbiBnbGVpY2h6ZWl0aWcKKwltaXQgZWluZW0gU3BlbGwgYmVsZWd0OgorCSAgZW5lbXlMaXN0PUZpbmRHcm91cFAoY2FzdGVyLEZHX0VORU1JRVMsNTApOworCURpZXMgZ2lsdCBqZWRvY2ggbnVyIGJlaSBTQV9FWFRFTlNJT049PTEwMCwgc29uc3Qgd2lyZCBtaXQKKwlkZW1lbnRzcHJlY2hlbmQgbWVociBvZGVyIHdlbmlnZXIgV2FocnNjaGVpbmxpY2hrZWl0IHp1cnVlY2tnZWdlYmVuLgorCSAoYWxzbyBiZWkgU0FfRVhURU5TSU9OPT0yMDAgZG9wcGVsdCBzbyB2aWVsZSAtPiAxMDAlLCBhbHNvIGFsbGUpCisJRGFzIFNraWxsYXR0cmlidXRlIFNBX0VYVEVOU0lPTiBrYW5uIGF1Y2ggZHVyY2ggU0FfUVVBTElUWQorCXZlcmFlbmRlcnQgd29yZGVuIHNlaW47IGRhcyBzb2xsdGUgYmVhY2h0ZXQgd2VyZGVuLgorCitTSUVIRSBBVUNIOgorCUZpbmRHcm91cCgpLCBGaW5kR3JvdXBQKCksIFBfRlJJRU5ELCBQX05PX0dMT0JBTF9BVFRBQ0sKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogTW9uIEphbiAyNSAxNTowNDozMSAxOTk5IGJ5IFBhdHJ5bgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vRmluZE5lYXJFbmVteVZpY3RpbSBiL2RvYy9sZnVuL0ZpbmROZWFyRW5lbXlWaWN0aW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZkNzdjZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0ZpbmROZWFyRW5lbXlWaWN0aW0KQEAgLTAsMCArMSwyNSBAQAorRmluZE5lYXJFbmVteVZpY3RpbSgpCisKK0ZVTktUSU9OOgorCW9iamVjdCBGaW5kTmVhckVuZW15VmljdGltKHN0cmluZyB3ZW4sIG9iamVjdCBwbCwgc3RyaW5nIG1zZykKKworREVGSU5JRVJUIElOOgorCS9zdGQvc3BlbGxib29rLmMKKworQVJHVU1FTlRFOgorCXdlbiAtIGlkIGRlcyBnZXd1ZW5zY2h0ZW4gR2VnbmVycywgU2VsZWN0TmVhckVuZW15IGZhbGxzIG4vYS4KKwlwbCAgLSBDYXN0ZXIuCisJbXNnIC0gTmFjaHJpY2h0IGZhbGxzIEdlZ25lciBuaWNodCBhbndlc2VuZCBpc3QuCisKK0JFU0NIUkVJQlVORzoKKwlGaW5kZXQgZWluZW4gaW0gTmFoa2FtcGYgZXJyZWljaGJhcmVuIEdlZ25lciwKKwl6LkIuIGZ1ZXIgZWluZW4gQW5ncmlmZnNzcHJ1Y2guCisJCitSVUVDS0dBQkVXRVJUOgorCURlciBBdXNlcndhZWhsdGUgOi0pCisKK0JFTUVSS1VOR0VOOgorCURlciBHZWduZXIgd2lyZCBhdWYgamVkZW4gRmFsbCBhbmdlZ3JpZmZlbi4KKworU0lFSEUgQVVDSDoKKwl0ZWFtcywgRmluZEVuZW15VmljdGltLCBGaW5kRmFyRW5lbXlWaWN0aW0sIEZpbmREaXN0YW50RW5lbXlWaWN0aW0KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0ZpbmRQb3Rpb24gYi9kb2MvbGZ1bi9GaW5kUG90aW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxN2M4OWIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9GaW5kUG90aW9uCkBAIC0wLDAgKzEsNDkgQEAKK0ZpbmRQb3Rpb24oKQorCitGVU5LVElPTjoKKyAgICAgdmFyYXJncyBpbnQgRmluZFBvdGlvbihzdHJpbmcgcyk7CisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC9wbGF5ZXIvcG90aW9uLmMKKworQVJHVU1FTlRFOgorICAgICBzdHJpbmcgcworICAgICAgIEF1c2dhYmV0ZXh0LiBXZW5uIDAvTGVlcnN0cmluZywgd2lyZCBEZWZhdWx0IHZlcndlbmRldC4KKworQkVTQ0hSRUlCVU5HOgorICAgICBEaWVzZSBGdW5rdGlvbiBnaWJ0IGVpbmVtIGF1ZnJ1ZmVuZGVuIFNwaWVsZXIgZXZlbnR1ZWxsIGRpZXNlbiBaVC4KKyAgICAgCisgICAgIERhcyBhdWZydWZlbmRlIFNwaWVsZXJvYmpla3QgbXVzcyBkYWZ1ZXI6CisgICAgICogZGllc2VuIFpUIGltIFBvdGlvbm1hc3RlciBpbiBzZWluZXIgTGlzdGUgZWluZ2V0cmFnZW4gaGFiZW4KKyAgICAgKiBkaWVzZW4gWlQgaW4gZGVyIExpc3RlIGRlciBiZWthbm50ZW4gVHJhZW5rZSBoYWJlbiAoZHVyY2gKKyAgICAgICBPcmFrZWwgYWxzbyBmdWVyIGlobiBhdWNoIGZyZWlnZXNjaGFsdGV0KQorICAgICAqIGRhcmYga2VpbmUgUGxheWVya2lsbHMgaGFiZW4gKFBfS0lMTFMpCisgICAgICogZGFyZiBuaWNodCBpbSBFZGl0aWVybW9kdXMgc2VpbgorICAgICAqIGRhcmYga2VpbiBHZWlzdCBzZWluIChBdXNuYWhtZTogR2Vpc3RlcnNjaGxvc3MpCisKKyAgICAgV2VubiBhbGxlIEtyaXRlcmllbiBlcmZvbGdyZWljaCBlcmZ1ZWxsdCBzaW5kLCB3aXJkICdzJyBvZGVyIAorICAgICAiRHUgZmluZGVzdCBlaW5lbiBaYXViZXJ0cmFuaywgZGVuIER1IHNvZm9ydCB0cmlua3N0LiIgYXVzZ2VnZWJlbgorICAgICB1bmQgZGVtIFNwaWVsZXIgZ2dmIGRpZSBXYWhsIGRlciBBdHRyaWJ1dGUgZ2VnZWJlbi4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgMCBiZWkgTmljaHR2ZXJnYWJlLCAxIGJlaSBlcmZvbGdyZWljaGVyIFZlcmdhYmUuCisKK0JFSVNQSUVMRToKKyAgICAgc3RyaW5nIGRldGFpbF9wYXBpZXJlKCkgeworICAgICAgIGlmICh0aGlzX3BsYXllcigpLT5GaW5kUG90aW9uKAorICAgICAgICAgYnJlYWtfc3RyaW5nKCJCZWltIFJ1bXd1ZWhsZW4gaW4gZGVuIFBhcGllcmVuIGVudGRlY2tzdCBEdSBlaW5lbiAiCisgICAgICAgICAgICAgICAgICAgICAgImtsZWluZW4gWmF1YmVydHJhbmssIGRlbiBEdSBzb2ZvcnQgdHJpbmtzdC4iLCA3OCkpKQorICAgICAgICAgcmV0dXJuICIiOyAgCisgICAgICAgICAvLyBFcyBtdXNzIGVpbiBTdHJpbmcgenVydWVja2dlZ2ViZW4gd2VyZGVuLCBkYSBtYW4gc29uc3QKKyAgICAgICAgIC8vIGRpZSBGZWhsZXJtZWxkdW5nICJTb3dhcyBzaWVoc3QgZHUgaGllciBuaWNodC4iIGJla29tbXQKKyAgICAgICBlbHNlCisgICAgICAgICByZXR1cm4gIkRpZSBQYXBpZXJlIHNpbmQgYWxsZSB1bmJlc2NocmlmdGV0LlxuIjsKKyAgICAgfQorCitTSUVIRSBBVUNIOgorICAgICBTb25zdGlnZXM6IHphdWJlcnRyYWVua2UsIC9zZWN1cmUvcG90aW9ubWFzdGVyLmMsIC9yb29tL29yYWtlbC5jCisgICAgIFZlcndhbmR0OiAgQWRkS25vd25Qb3Rpb24oKSwgUmVtb3ZlS25vd25Qb3Rpb24oKSwgSW5MaXN0KCkKKyAgICAgUHJvcHM6ICAgICBQX1BPVElPTlJPT01TLCBQX0tOT1dOX1BPVElPTlJPT01TCisgICAgIEJlZmVobDogICAgdHJhZW5rZSAoZnVlciBNYWdpZXIgenVtIEVpbnNjaGFsdGVuIGRlcyBGaW5kZW5zIHZvbiBaVHMpCisKKzYuRmViIDIwMTYgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0ZpbmRSYW5nZWRUYXJnZXQgYi9kb2MvbGZ1bi9GaW5kUmFuZ2VkVGFyZ2V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1OTcwZmIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9GaW5kUmFuZ2VkVGFyZ2V0CkBAIC0wLDAgKzEsNDAgQEAKK0ZpbmRSYW5nZWRUYXJnZXQoKQorCitGVU5LVElPTjoKKyAgICBzdGF0aWMgc3RyaW5nIEZpbmRSYW5nZWRUYXJnZXQoc3RyaW5nIHN0ciwgbWFwcGluZyBzaG9vdCkKKworREVGSU5JRVJUIElOOgorICAgIC9zdGQvcmFuZ2VkX3dlYXBvbi5jCisKK0FSR1VNRU5URToKKyAgICBzdHJpbmcgc3RyICAgIC0gU2NodXNzc3ludGF4CisgICAgbWFwcGluZyBzaG9vdCAtIFNjaHVzc2RhdGVuCisKK0JFU0NIUkVJQlVORzoKKyAgICBFcmhhZWx0IHZvbiAvc3RkL3JhbmdlZF93ZWFwb246OmNtZF9zaG9vdCgpIGRpZSBTY2h1c3NkYXRlbiB1bmQgZWluZQorICAgIGV2ZW50dWVsbCBiZXJlaXRzIG1vZGlmaXppZXJ0ZSBTeW50YXggdW5kIHZlcnN1Y2h0IGVpbmVuIHBhc3NlbmRlbiBHZWduZXIKKyAgICBpbSBSYXVtIG9kZXIgaW0gR2ViaWV0IChQX1NIT09USU5HX0FSRUEpIHp1IGZpbmRlbi4KKyAgICBEaWVzZXIgd2lyZCBpbiBTSV9FTkVNWSBpbSBNYXBwaW5nICdzaG9vdCcgZWluZ2V0cmFnZW4gdW5kIGVpbiBXZXJ0ICE9IDAKKyAgICB6dXJ1ZWNrZ2VnZWJlbi4KKworUlVFQ0tHQUJFV0VSVDoKKyAgICAwICAgICBiZWkgRmVobHNjaGxhZworICAgICE9IDAgIGJlaSBndWVsdGlnZW0gU0lfRU5FTVkgaW4gJ3Nob290JworCitCRU1FUktVTkdFTjoKKyAgICAnc2hvb3QnIGVudGhhZWx0IG5vcm1hbGVyd2Vpc2UgZm9sZ2VuZGUgRWludHJhZWdlOgorICAgICogS2V5IFBfV0VBUE9OOiAgICAgICBkaWUgU2NodXNzd2FmZmUKKyAgICAqIEtleSBQX1dFQVBPTl9UWVBFOiAgUF9BTU1VTklUSU9OLCBhbHNvIGRpZSBNdW5pdGlvbnMtSUQKKyAgICAqIEtleSBQX1NUUkVUQ0hfVElNRTogUF9TVFJFVENIX1RJTUUgZGVyIFdhZmZlCisgICAgKiBLZXkgUF9XQzogICAgICAgICAgIFBfU0hPT1RJTkdfV0MgZGVyIFdhZmZlCisKK1NJRUhFIEFVQ0g6CisgICAgR2VuZXJlbGw6ICBQX0FNTVVOSVRJT04sIFBfU0hPT1RJTkdfV0MsIFBfU1RSRVRDSF9USU1FCisgICAgTWV0aG9kZW46ICBzaG9vdF9kYW0oTCksIGNtZF9zaG9vdChMKQorICAgIEdlYmlldDogICAgUF9SQU5HRSwgUF9TSE9PVElOR19BUkVBLCBQX1RBUkdFVF9BUkVBCisgICAgVGVhbTogICAgICBQcmVzZW50UG9zaXRpb24oTCkKKyAgICBTdWNoZTogICAgIHByZXNlbnQsIFNlbGVjdEZhckVuZW15KEwpCisgICAgU3ludGF4OiAgICBfdW5wYXJzZWRfYXJncyhMKQorICAgIFNvbnN0aWdlczogZmVybndhZmZlbgorCisyOC5KdWwgMjAxNCBHbG9pbnNvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0ZsZWUgYi9kb2MvbGZ1bi9GbGVlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNjNkODkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9GbGVlCkBAIC0wLDAgKzEsNTcgQEAKK0ZsZWUoKQorCitGVU5LVElPTjoKKyAgICAgICAgcHVibGljIHZhcmFyZ3Mgdm9pZCBGbGVlKCBvYmplY3Qgb2xkZW52LCBpbnQgZm9yY2UgKQorCitERUZJTklFUlQgSU46CisgICAgICAgIC9zeXMvbGl2aW5nL2NvbWJhdC5oCisgICAgICAgIC9zdGQvbGl2aW5nL2NvbWJhdC5jCisKK0FSR1VNRU5URToKKyAgICAgICAgb2xkZW52CisgICAgICAgICAgRWluIFJhdW0gb2RlciAwLgorICAgICAgICAgIFdpcmQgZWluIFJhdW0gYW5nZWdlYmVuLCBkYW5uIG11c3Mgc2ljaCBkZXIgRmx1ZWNodGVuZGUgaW4gZGllc2VtCisgICAgICAgICAgUmF1bSBiZWZpbmRlbiwgZGFtaXQgZXIgdmVyc3VjaHQsIHp1IGZsdWVjaHRlbiwgZXMgc2VpIGRlbm4sIGRhcworICAgICAgICAgIG9wdGlvbmFsZSBGbGFnICJmb3JjZSIgaXN0IGdlc2V0enQuCisgICAgICAgIGZvcmNlCisgICAgICAgICAgMSwgd2VubiBkZXIgc3BpZWxlciB1bmFiaGFlbmdpZyB2b24gc2VpbmVyIFZvcnNpY2h0IGZsdWVjaHRlbiBzb2xsLgorICAgICAgICAgIDAgc29uc3QuCisKK0JFU0NIUkVJQlVORzoKKyAgICAgICAgRmxlZSgpIHdpcmQgaW0gaGVhcnRfYmVhdCgpIG9kZXIgdm9uIENoZWNrV2ltcHlBbmRGbGVlKCkgYXVmZ2VydWZlbiwKKyAgICAgICAgdW0gZGVuIFNwaWVsZXIgZmx1ZWNodGVuIHp1IGxhc3Nlbi4gTWFuIGthbm4gZGllIEZ1bmt0aW9uIGltIFNwaWVsZXIKKyAgICAgICAgYXVjaCAidm9uIEhhbmQiIGF1ZnJ1ZmVuLCBiZWlzcGllbHN3ZWlzZSBpbiBlaW5lbSBTcGVsbC4gTWFuIHNvbGx0ZQorICAgICAgICBkYW5uIGZvcmNlIGF1ZiAxIHNldHplbiwgZGFtaXQgZGVyIFNwaWVsZXIgdW5hYmhhZW5naWcgdm9uIHNlaW5lcgorICAgICAgICBWb3JzaWNodCBmbHVlY2h0ZXQuCisgICAgICAgIEhpZXJiZWkga2FubiBkaWUgRmx1Y2h0IGRhenUgZnVlaHJlbiwgZGFzcyBtYW4gZGllIFRlYW1yZWloZSB3ZWNoc2VsdCwKKyAgICAgICAgYWJlciBhdWNoLCBkYXNzIG1hbiBkZW4gUmF1bSB2ZXJsYWVzc3QuCisgICAgICAgIAorUlVlQ0tHQUJFV0VSVDoKKyAgICAgICAga2VpbmVyCisKK0JFTUVSS1VOR0VOOgorCitCRUlTUElFTEU6CisgICAgICAgIHRoaXNfcGxheWVyKCktPkZsZWUoMCwgMSk7CisgICAgICAgIC8vIERlciBTcGllbGVyIHNvbGwgZmx1ZWNodGVuLCBlZ2FsLCBvYiBzZWluZSBMZWJlbnNwdW5rdGUgZ2VyaW5nZXIKKyAgICAgICAgLy8gYWxzIHNlaW5lIFZvcnNpY2h0IHNpbmQgdW5kIHVuYWJoYWVuZ2lnIHZvbiBzZWluZXIgUG9zaXRpb24uCisgICAgICAgIAorICAgICAgICB0aGlzX3BsYXllcigpLT5GbGVlKCBmaW5kX29iamVjdCgiL2dpbGRlbi9hYmVudGV1cmVyIikgKTsKKyAgICAgICAgLy8gRGVyIFNwaWVsZXIgc29sbCBmbHVlY2h0ZW4sIHdlbm4gZXIgc2ljaCBpbiBkZXIgQWJlbnRldXJlcmdpbGRlCisgICAgICAgIC8vIGJlZmluZGV0IChvZGVyIHdlbm4gZGllc2UgbmljaHQgZXhpc3RpZXJ0KQorICAgICAgICAKKyAgICAgICAgdGhpc19wbGF5ZXIoKS0+RmxlZSggIi9naWxkZW4vYWJlbnRldXJlciIgKTsKKyAgICAgICAgLy8gRGVyIFNwaWVsZXIgd2lyZCBuaWNodCBmbHVlY2h0ZW4sIGRhIGRlciBWZXJnbGVpY2ggdm9uIERhdGVpbmFtZQorICAgICAgICAvLyB1bmQgZGVtIFJhdW0gMCBlcmdpYnQuCisKKyAgICAgICAgdGhpc19wbGF5ZXIoKS0+RmxlZSggZmluZF9vYmplY3QoIi9naWxkZW4vYWJlbnRldXJlciIpLCAxKTsKKyAgICAgICAgLy8gRGVyIFNwaWVsZXIgc29sbCBhdWYgamVkZW4gRmFsbCBmbHVlY2h0ZW4sIGVnYWwgb2IgZXIgc2ljaCBpbiBkZXIKKyAgICAgICAgLy8gQWJlbnRldXJlcmdpbGRlIGJlZmluZGV0IG9kZXIgbmljaHQuIEdydW5kOiBHZXNldHp0ZXMgZm9yY2UtRmxhZy4KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKK1NJRUhFIEFVQ0g6CisgICAgICAgIENoZWNrV2ltcHlBbmRGbGVlKCksIERlZmVuZCgpLCBoZWFydF9iZWF0KCksIAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBXZWQgTm92IDEyIDE0OjQ0OjQyIDIwMDMgYnkgQmFtYmkKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0ZyZWVIYW5kcyBiL2RvYy9sZnVuL0ZyZWVIYW5kcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmVkOWIwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vRnJlZUhhbmRzCkBAIC0wLDAgKzEsMzYgQEAKK0ZyZWVIYW5kcworRlVOS1RJT046CisgICAgIHB1YmxpYyB2YXJhcmdzIGludCBGcmVlSGFuZHMob2JqZWN0IG9iKQorCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvbGl2aW5nL2NvbWJhdC5jCisKK0FSR1VNRU5URToKKyAgICAgb2IgLSBkYXMgT2JqZWt0LCBkZXNzZW4gSGFuZG51dHp1bmcgdm9yYmVpIGlzdAorICAgICAgICAtIGthbm4gMCBzZWluLCBkYW5uIHdpcmQgUE8gYmVudXR6dAorCitSVUVDS0dBQkVXRVJUOgorICAgICAwLCB3ZW5uIGtlaW4gT2JqZWt0IHVlYmVyZ2ViZW4gd3VyZGUgb2RlciBrZWluIFBPIGV4aXN0aWVydAorICAgICAxLCBzb25zdAorCitCRVNDSFJFSUJVTkc6CisgICAgIEJlZnJlaXQgZGllIEhhZW5kZSBlaW5lcyBMaXZpbmdzIHZvbiBlaW4gYmVzdGltbXRlbiBPYmpla3QuCisgICAgIEVzIHdlcmRlbiBfYWxsZV8gSGFlbmRlIHdpZWRlciBmcmVpZ2VnZWJlbi4KKworQkVJU1BJRUxFOgorICAgICA+IGhhbHRlIHNlaWwgZmVzdAorICAgICAuLi4KKyAgICAgdGhpc19wbGF5ZXIoKS0+VXNlSGFuZHModGhpc19vYmplY3QoKSwyKTsKKyAgICAgLi4uCisKKyAgICAgPiBsYXNzZSBzZWlsIGxvcworICAgICAuLi4KKyAgICAgdGhpc19wbGF5ZXIoKS0+RnJlZUhhbmRzKHRoaXNfb2JqZWN0KCkpOworICAgICAuLi4KKworU0lFSEUgQVVDSDoKKyAgICAgUF9IQU5EUywgUF9IQU5EU19VU0VEX0JZCisgICAgIFBfTUFYX0hBTkRTLCBQX1VTRURfSEFORFMsIFBfRlJFRV9IQU5EUworICAgICBVc2VIYW5kcworCisxLkZlYi4yMDA0IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9HZXRBcXVhcml1bSBiL2RvYy9sZnVuL0dldEFxdWFyaXVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYThkNDkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9HZXRBcXVhcml1bQpAQCAtMCwwICsxLDM3IEBACitHZXRBcXVhcml1bSgpCisKK0ZVTktUSU9OOgorICAgICB2YXJhcmdzIHB1YmxpYyBzdHJpbmcqIEdldEFxdWFyaXVtKG9iamVjdCBhbmdlbCkKKworQVJHVU1FTlRFOgorICAgICBEYXMgb3B0aW9uYWxlIEFyZ3VtZW50IDxhbmdlbD4gaXN0IGRpZSBBbmdlbCBzZWxic3QuCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGllIEZ1bmt0aW9uIHdpcmQgYmVpbSBBbmdlbG4gaW4gUmFldW1lbiBnZXJ1ZmVuLCB3ZW5uIGRpZXNlIGFscyAKKyAgICAgR2V3YWVzc2VydHlwIFdfVVNFUiBnZXNldHp0IGhhYmVuIChzaWVoZSBNYW5wYWdlIHp1IFBfV0FURVIpLgorICAgICBBdXMgZGVyIHp1cnVlY2tnZWdlYmVuZW4gTGlzdGUgZGVyIFBmYWRlIHdpcmQgZWluZXIgenVmYWVsbGlnIGF1cy0KKyAgICAgZ2V3YWVobHQgdW5kIGRhcyBPYmpla3QgZ2VjbG9udC4gCisKK1JVRUNLR0FCRVdFUlQ6CisgICAgIFN0cmluZy1BcnJheSBtaXQgUGZhZG5hbWVuIHp1IGRlbiBpbiBkaWVzZW0gUmF1bSBmYW5nYmFyZW4gRmlzY2hlbi4KKworQkVNRVJLVU5HOgorICAgICBNYW4ga2FubiBkaWUgRmFuZ2NoYW5jZW4gZHVyY2ggTWVocmZhY2huZW5udW5nIGVpbnplbG5lciBFaW50cmFlZ2UgCisgICAgIG1vZGlmaXppZXJlbi4gRXMgbXVzcyBzaWNoIGJlaSBkZW4gRWludHJhZWdlbiB1bSBsYWQtIHVuZCBjbG9uZWJhcmUKKyAgICAgT2JqZWt0ZSBoYW5kZWxuLgorICAgICBGdWVyIHNlbGJzdHByb2dyYW1taWVydGUgRmlzY2hlIGlzdCBkYXMgQmFzaXNvYmpla3QgCisgICAgIC9zdGQvaXRlbXMvZmlzaGluZy9maXNoIHp1IHZlcndlbmRlbi4gRWluaWdlIHZvcmdlZmVydGlndGUgRmlzY2hlIAorICAgICBmaW5kZW4gc2ljaCBkYXJ1ZWJlciBoaW5hdXMgaW4gL2l0ZW1zL2Zpc2hpbmcvYXF1YXJpdW0vCisKK0JFSVNQSUVMOgorICAgICB2YXJhcmdzIHN0cmluZyogR2V0QXF1YXJpdW0ob2JqZWN0IGFuZ2VsKSB7CisgICAgICAgcmV0dXJuICh7Ii9kL2RzY2h1bmdlbC9yaWt1cy9xNGUvb2JqL3N0aWNobGluZyIsCisgICAgICAgICAgICAgICAgIi9kL2RzY2h1bmdlbC9yaWt1cy9xNGUvb2JqL2thcnBmZW4iLAorICAgICAgICAgICAgICAgICIvcC9zZWhlci9wYXJ0eW1vbnN0ZXIvb2JqL2Zpc2NoIn0pOworICAgICB9CisKK1NJRUhFIEFVQ0g6CisgICAgUHJvcGVydGllczogUF9XQVRFUiwgUF9GSVNICisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit6dWxldHp0IGdlYWVuZGVydDogMjAxNC1TZXAtMDIsIEFyYXRob3JuCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9HZXREZXRhaWwgYi9kb2MvbGZ1bi9HZXREZXRhaWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJkNzMwMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0dldERldGFpbApAQCAtMCwwICsxLDY3IEBACitHZXREZXRhaWwoKQorCitGVU5LVElPTjoKKyAgICB2YXJhcmdzIHN0cmluZyBHZXREZXRhaWwoc3RyaW5nIGtleSwgc3RyaW5nIHJhY2UsIGludCBzZW5zZSkKKworREVGSU5JRVJUIElOOgorICAgIC9zdGQvdGhpbmcvZGVzY3JpcHRpb24uYworCitBUkdVTUVOVEU6CisgICAga2V5CisgICAgICBEYXMgenUgZXJtaXR0ZWxuZGUgRGV0YWlsLgorICAgIHJhY2UKKyAgICAgIFJhc3NlIGRlcyBlcm1pdHRlbG5kZW4gT2JqZWt0ZXMgKGZhbGxzIGVzIGVpbiBMZWJld2VzZW4gaXN0KS4KKyAgICBzZW5zZQorICAgICAgRGllIEFydCBkZXMgenUgdW50ZXJzdWNoZW5kZW4gRGV0YWlsczoKKyAgICAgICAgVW50ZXJzdWNoZW4sIFJpZWNoZW4sIEhvZXJlbiwgVGFzdGVuLgorCitCRVNDSFJFSUJVTkc6CisgICAgRGllIEJlc2NocmVpYnVuZyBkZXMgZ2V3dWVuc2NodGVuIERldGFpbHMgd2lyZCBlcm1pdHRlbHQuIERhYmVpCisgICAgd2VyZGVuIHJhc3NlbnNwZXppZmlzY2hlIERldGFpbHMgYmVydWVja3NpY2h0aWd0LiBFcyBnaWJ0IGhpZXJiZWkKKyAgICB2ZXJzY2hpZWRlbmUgRGV0YWlsYXJ0ZW4sIGRlcmVuIFR5cCBtYW4gaW4gPHNlbnNlPiBhbmdpYnQ6CisgICAgICBTRU5TRV9WSUVXICAgIC0gRnVlciBEZWZhdWx0ZGV0YWlscyB6dW0gVW50ZXJzdWNoZW4uCisgICAgICBTRU5TRV9TTUVMTCAgIC0gRnVlciBEZXRhaWxzLCBkaWUgbWFuIHJpZWNoZW4ga2Fubi4KKyAgICAgIFNFTlNFX1NPVU5EICAgLSBGdWVyIERldGFpbHMsIGRpZSBtYW4gaG9lcmVuIGthbm4uCisgICAgICBTRU5TRV9UT1VDSCAgIC0gRnVlciBEZXRhaWxzLCBkaWUgbWFuIGFidGFzdGVuIGthbm4uCisgICAgICBTRU5TRV9SRUFEICAgIC0gRnVlciBEZXRhaWxzLCBkaWUgbWFuIGxlc2VuIGthbm4uCisKKyAgICBEYWJlaSBpc3QgMCA9PSBTRU5TRV9WSUVXLgorCitSVWVDS0dBQkVXRVJUOgorICAgIERpZSBCZXNjaHJlaWJ1bmcgZGVzIERldGFpbHMgb2RlciAwLCB3ZW5uIGVzIGRpZXNlcyBEZXRhaWwgbmljaHQKKyAgICBnaWJ0LgorCitCRUlTUElFTDoKKyAgICBJbSBmb2xnZW5kZW4gd2lyZCBlaW4ga2xlaW5lcyBUZXN0ZGV0YWlsIGdlbmVyaWVydDoKKyAgICAgIEFkZERldGFpbCgidGVzdCIsIkRhcyBpc3QgZWluIFRlc3QhXG4iKTsKKyAgICBJbSBmb2xnZW5kZW4gd2lyZCBkYXMgRGV0YWlsIGVudGZlcm50LCB3ZW5uIGVzIGV4aXN0aWVydC4gRGllcyBpc3QKKyAgICBlaWdlbnRsaWNoIG5pY2h0IG5vZXRpZywgZGEgUmVtb3ZlRGV0YWlsKCkgZGFtaXQgenVyZWNodGtvbW10LCBhYmVyCisgICAgZXZlbnR1ZWxsIHNpbmQgamEgbm9jaCB3ZWl0ZXJlIEFrdGlvbmVuIG5vZXRpZy4KKyAgICAgIGlmKEdldERldGFpbCgidGVzdCIpKQorICAgICAgeyBSZW1vdmVEZXRhaWwoInRlc3QiKTsKKyAgICAgICAgLi4uCisgICAgICB9CisgICAgRWluIEdlcnVjaCBrYW5uIG1hbiBmb2xnZW5kZXJtYXNzZW4gZXJ6ZXVnZW46CisgICAgICBBZGRTbWVsbHMoImdvbGQiLAorICAgICAgICAoWzAgICAgICA6IkdvbGQga2FubiBtYW4gbmljaHQgcmllY2hlbiFcbiIsCisgICAgICAgICAgInp3ZXJnIjoiRGVpbmUgdHJhaW5pZXJ0ZSBOYXNlIHJpZWNodCBlcyBtdWVoZWxvcyFcbiJdKSk7CisgICAgRGllIEFiZnJhZ2UgZGVzIERldGFpbHMgZ2VzdGFsdGV0IHNpY2ggcmVjaHQgZWluZmFjaDoKKyAgICAgIEdldERldGFpbCgiZ29sZCIsInp3ZXJnIixTRU5TRV9TTUVMTCk7CisgICAgRGllIEZ1bmt0aW9uIGxpZWZlcnQgZGFzIERldGFpbCBmdWVyIGRlbiBad2VyZy4KKyAgICAgIEdldERldGFpbCgiZ29sZCIsMCxTRU5TRV9TTUVMTCk7CisgICAgRGllIEZ1bmt0aW9uIGxpZWZlcnQgZGFzIERldGFpbCBmdWVyIGRpZSByZXN0bGljaGVuIFJhc3Nlbi4KKyAgICAgIEdldERldGFpbCgiZ29sZCIsMCxTRU5TRV9TT1VORCk7CisgICAgRWluIFNvdW5kZGV0YWlsIG1pdCBkZW0gTmFtZW4gImdvbGQiIGV4aXN0aWVydCBuaWNodCwgZGllIEZ1bmt0aW9uCisgICAgbGllZmVydCAwIHp1cnVlY2suCisKK1NJRUhFIEFVQ0g6CisgICAgU2V0emVuOiAgICBBZGREZXRhaWwoKSwgQWRkUmVhZERldGFpbCgpLCBBZGRTbWVsbHMoKSwgQWRkU291bmRzKCksCisgICAgICAgICAgICAgICBBZGRUb3VjaERldGFpbCgpCisgICAgTG9lc2NoZW46ICBSZW1vdmVSZWFkRGV0YWlsKCksIFJlbW92ZVNtZWxscygpLCBSZW1vdmVEZXRhaWwoKSwKKyAgICAgICAgICAgICAgIFJlbW92ZVNvdW5kcygpLCBSZW1vdmVUb3VjaERldGFpbCgpCisgICAgRGF0ZW46ICAgICBQX0RFVEFJTFMsIFBfUkVBRF9ERVRBSUxTLCBQX1NNRUxMUywgUF9TT1VORFMsCisgICAgICAgICAgICAgICBQX1RPVUNIX0RFVEFJTFMsIFBfU1BFQ0lBTF9ERVRBSUxTCisgICAgVmVyYWx0ZXQ6ICBBZGRTcGVjaWFsRGV0YWlsKCksIFJlbW92ZVNwZWNpYWxEZXRhaWwoKSwgUF9SRUFEX01TRworICAgIFNvbnN0aWdlczogYnJlYWtfc3RyaW5nKCkKKworMjcuIEphbiAyMDEzIEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9HZXREb29yc01hcHBpbmcgYi9kb2MvbGZ1bi9HZXREb29yc01hcHBpbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM2OGE5ZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0dldERvb3JzTWFwcGluZwpAQCAtMCwwICsxLDI0IEBACitHZXREb29yc01hcHBpbmcoKQorCitGVU5LVElPTjoKKyAgICBtYXBwaW5nIEdldERvb3JzTWFwcGluZygpCisKK0JFU0NIUkVJQlVORzoKKyAgICBNaXQgZGllc2VyIEZ1bmt0aW9uIGVyaGFlbHQgbWFuIGRhcyBNYXBwaW5nIGRlciB2b3JoYW5kZW5lbgorICAgIFNlaGVycG9ydGFsZS4KKyAgICAKKyAgICBEaWUgU3RydWt0dXIgaXN0IHZvbiBkZXIgRm9ybTogCisJKFsgUGZhZDogUG9ydGFsbnVtbWVyOyBQb3J0YWxiZXNjaHJlaWJ1bmcsIF0pCisgICAgRXMgd2lyZCBlaW5lIEtvcGllIGRpZXNlcyBNYXBwaW5ncyBnZWxpZWZlcnQuCisKK1JVRUNLR0FCRVdFUlQ6CisgICAgRGFzIFNlaGVydG9ybWFwcGluZworCitCRU1FUktVTkdFTjoKKyAgICBEaWVzZSBGdW5rdGlvbiB3aXJkIHZvbiAvZC9zZWhlci9wb3J0YWxlL3NlaGVydG9ybWFzdGVyIGRlZmluaWVydC4KKworQkVJU1BJRUxFOgorICAgICIvZC9zZWhlci9wb3J0YWxlL3NlaGVydG9ybWFzdGVyIi0+R2V0RG9vcnNNYXBwaW5nKCk7CisKK1NJRUhFIEFVQ0g6CisgICAgRG9vcklzS25vd24sIFNob3dEb29ycywgVGVsZXBvcnQsIERpc2NvdmVyRG9vcgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vR2V0RW5lbWllcyBiL2RvYy9sZnVuL0dldEVuZW1pZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM0ZDBiZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0dldEVuZW1pZXMKQEAgLTAsMCArMSwzNCBAQAorR2V0RW5lbWllcygpCisKK0ZVTktUSU9OOgorCW1hcHBpbmcgR2V0RW5lbWllcygpOworCitERUZJTklFUlQgSU46CisJL3N0ZC9saXZpbmcvY29tYmF0LmMKKworQVJHVU1FTlRFOgorCWtlaW5lCisKK1JVZUNLR0FCRVdFUlQ6CisJTWFwcGluZyBtaXQgYmVrYW5udGVuIEdlZ25lcm4gYWxzIFNjaGx1ZXNzZWwgdW5kIFplaXRlbiBhbHMKKwlFaW50cmFlZ2VuLgorCitCRVNDSFJFSUJVTkc6CisJRGllc2UgRnVua3Rpb24gbGllZmVydCBkYXMgaW50ZXJuZSBNYXBwaW5nIHp1cnVlY2ssIGluIGRlbSBhbGxlCisJR2VnbmVyIGFiZ2VzcGVpY2hlcnQgc2luZC4gRGllc2UgR2VnbmVyIHN0ZWxsZW4gZGllIFNjaGx1ZXNzZWwgaW4KKwlkZW0gTWFwcGluZyBkYXIuIEFscyBFaW50cmFlZ2Ugc2luZCBkaWUgWmVpdGVuIHZlcm1lcmt0LCBuYWNoCisJd2VsY2hlciBaZWl0IGVpbiBHZWduZXIgYXV0b21hdGlzY2ggd2llZGVyIHZlcmdlc3NlbiB3ZXJkZW4gc29sbC4KKwlNZWhyIEluZm9ybWF0aW9uZW4gZGF6dSBzaW5kIGluIGRlciBEb2t1bWVudGF0aW9uIHp1ciBhZWhubGljaAorCWdlYXJ0ZXRlbiBGdW5rdGlvbiBRdWVyeUVuZW1pZXMoKSB6dSBmaW5kZW4sIGRpZSBqZWRvY2ggendlaSBBcnJheXMKKwlnZXRyZW5udGUgenVydWVja2xpZWZlcnQuCisJQWNodHVuZzogRXMgd2lyZCBrZWluZSBLb3BpZSBkZXMgTWFwcGluZ3MgZXJzdGVsbHQuIFNhZW10bGljaGUKKwlWZXJhZW5kZXJ1bmdlbiBpbiBkZW0gTWFwcGluZyB3aXJrZW4gc2ljaCB1bm1pdHRlbGJhciBhdWYgZGllCisJaW50ZXJuZSBHZWduZXJsaXN0ZSBhdXMuIERpZSBGdW5rdGlvbiBzb2xsdGUgZGVzaGFsYiBuaWNodCBnZW51dHp0CisJd2VyZGVuLiBHZWduZXIgZWluLSB1bmQgYXVzdHJhZ2VuIHNvbGx0ZSBtYW4gbnVyIG1pdHRlbHMKKwlJbnNlcnRFbmVteSgpIHVuZCBTdG9wSHVudEZvcigpLgorCitTSUVIRSBBVUNIOgorCVF1ZXJ5RW5lbWllcygpLCBTZXRFbmVtaWVzKCksIEluc2VydEVuZW15KCksIFN0b3BIdW50Rm9yKCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogV2VkIE1heSAyNiAxNjo0Nzo1MSAxOTk5IGJ5IFBhdHJ5bgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vR2V0RXhpdHMgYi9kb2MvbGZ1bi9HZXRFeGl0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmYwMDRlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vR2V0RXhpdHMKQEAgLTAsMCArMSwyMyBAQAorR2V0RXhpdHMoKQorCitGVU5LVElPTjoKKyAgICAgdmFyYXJncyBzdHJpbmcgR2V0RXhpdHMob2JqZWN0IHZpZXdlcik7CisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC9yb29tL2V4aXRzCisKK0FSR1VNRU5URToKKyAgICAgdmlld2VyCisgICAgICAgICAgRGVyamVuaWdlLCBkZXIgc2ljaCBkaWUgQXVzZ2FlbmdlIGFuc2NoYXV0LgorCitCRVNDSFJFSUJVTkc6CisgICAgIEVzIHdpcmQgZWluZSBMaXN0ZSBkZXIgZnVlciB2aWV3ZXIgc2ljaHRiYXJlbiBBdXNnYWVuZ2UgZXJzdGVsbHQuCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIFN0cmluZyBtaXQgZGVyIExpc3RlIGRlciBzaWNodGJhcmVuIEF1c2dhZW5nZS4KKworU0lFSEUgQVVDSDoKKyAgICAgQWRkRXhpdCgpLCBBZGRTcGVjaWFsRXhpdCgpLCAvc3RkL3Jvb20vZXhpdHMuYworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBXZWQgTWF5IDggMTA6MTg6NDcgMTk5NiBieSBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0dldEZWYWx1ZSBiL2RvYy9sZnVuL0dldEZWYWx1ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzE3MjI0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vR2V0RlZhbHVlCkBAIC0wLDAgKzEsMzcgQEAKK0ZVTktUSU9OOgorCisJdmFyYXJncyBpbnQgR2V0RlZhbHVlKHN0cmluZyB2bmFtZSwgbWFwcGluZyBtYXAsIG9iamVjdCBwbCkgCisKKworQVJHVU1FTlRFOgorCisJdm5hbWUJOiBuYW1lIGRlcyBwYXJhbWV0ZXJzIGF1cyBkZW0gc3BlbGxtYXBwaW5nCisJbWFwICAgCTogc3BlbGxtYXBwaW5nCisJcGwgCTogY2FzdGVyCisKKworQkVTQ0hSRUlCVU5HOgorCisJQmVyZWNobmV0IGRlbiBXZXJ0IHVuZCBkZW4gRmFjdG9yIGRlcyBQYXJhbWV0ZXJzIGluIHNwZWxsbWFwcGluZy4KKworCitSVUVDS0dBQkVXRVJUOgorCisJQmVyZWNobmV0ZXIgV2VydCpGYWN0b3IgYXVzIGRlbSBTcGVsbG1hcHBpbmcuCisKKworQkVNRVJLVU5HRU46CisKKwlSdWZ0IEdldFZhbHVlKHZuYW1lLG1hcCxwbCkqR2V0RmFjdG9yKHZuYW1lLG1hcCxwbCkvMTAwIGF1Zi4KKworCitCRUlTUElFTDoKKworCXh4eD1HZXRGVmFsdWUoU0lfU0tJTExEQU1BR0Usc2luZm8sY2FzdGVyKTsKKworU2llaGUgYXVjaDoKKworCSJHZXRWYWx1ZSIsICJHZXRGYWN0b3IiLCAiR2V0T2Zmc2V0IiwgIkdldFZhbHVlTyIsICJHZXRGVmFsdWVPIgorCisJQXVzZnVlaHJsaWNoZXMgQmVpc3BpZWwgc2llaGUgIkdldEZWYWx1ZU8iLgorCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9HZXRGVmFsdWVPIGIvZG9jL2xmdW4vR2V0RlZhbHVlTwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTU0ZTRiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vR2V0RlZhbHVlTwpAQCAtMCwwICsxLDc0IEBACitGVU5LVElPTjoKKworCXZhcmFyZ3MgaW50IEdldEZWYWx1ZU8oc3RyaW5nIHZuYW1lLCBtYXBwaW5nIG1hcCwgb2JqZWN0IHBsKSAKKworCitBUkdVTUVOVEU6CisKKwl2bmFtZQk6IG5hbWUgZGVzIHBhcmFtZXRlcnMgYXVzIGRlbSBzcGVsbG1hcHBpbmcKKwltYXAgICAJOiBzcGVsbG1hcHBpbmcKKwlwbCAJOiBjYXN0ZXIKKworCitCRVNDSFJFSUJVTkc6CisKKwknQmVyZWNobmV0JyBkZW4gV2VydCwgZGVuIEZhY3RvciB1bmQgZGVuIE9mZnNldCBkZXMgUGFyYW1ldGVycyAKKwlpbiBzcGVsbG1hcHBpbmcuCisKKworUlVFQ0tHQUJFV0VSVDoKKworCUJlcmVjaG5ldGVyIChXZXJ0KkZhY3RvcikvMTAwK09mZnNldCBhdXMgZGVtIFNwZWxsbWFwcGluZy4KKworCitCRU1FUktVTkdFTjoKKworCVJ1ZnQgKEdldFZhbHVlKHZuYW1lLG1hcCxwbCkqR2V0RmFjdG9yKHZuYW1lLG1hcCxwbCkpLzEwMCsKKwlHZXRPZmZzZXQodm5hbWUsbWFwLHBsKSBhdWYuCisKKworQkVJU1BJRUw6CisKKwlBZGRTcGVsbCgiZWdhbCIsMTAsCisJKFsKKwlPRkZTRVQoU0lfQ09TVCk6KFtTTV9SQUNFOihbIlp3ZXJnIjo0XSkgXSksCisJRkFDVE9SKFNJX0NPU1QpOihbU01fUkFDRTooWyJNZW5zY2giOjkwXSkgXSksCisJU0lfU0tJTExEQU1BR0U6MTAwLAorCU9GRlNFVChTSV9TS0lMTERBTUFHRSk6MjUsCisJU0lfU0tJTExEQU1BR0VfVFlQRTpEVF9FWEFNUExFLAorCUZBQ1RPUihTSV9TS0lMTERBTUFHRSk6KFtTTV9SQUNFOihbIlp3ZXJnIjo4MCwiRWxmIjoxMjBdKSBdKSAKKwldKSk7CisKKwlTbywgd2FzIHNvbGxlbiB1bnMgZGllc2UgWmVpbGVuIHNhZ2VuPworCisJRXMgd2lyZCBlaW4gU3BydWNoIE5hbWVzICdlZ2FsJyBpbnMgU3BlbGxib29rIGVpbmdldHJhZ2VuLiBFciBrb3N0ZXQKKwlyZWd1bGFlciAxMCBNUC4gRnVlciBad2VyZ2UgYWxsZXJkaW5ncyB3aXJkIGVpbiBPZmZzZXQgdm9uIDQgTVAgCisJYXVmZ2VzY2hsYWdlbi4gQXVzc2VyZGVtIG1hY2hlbiBad2VyZ2UgbnVyIDgwJSBTY2hhZGVuLCBFbGZlbiAKKwloaW5nZWdlbiAxMjAlLiBEZXIgR3J1bmRzY2hhZGVuIGJldHJhZWd0IDEwMCBTY2hhZGVuc3B1bmt0ZSwgZGVyIAorCU9mZnNldCBkZXMgU2NoYWRlbnMgbm9jaG1hbCAyNS4gTWVuc2NoZW4gYmV6YWhsZW4gZnVlciBkaWVzZW4gCisJU3BydWNoIG51ciA5MCUgZGVyIEtvc3Rlbi4KKworCU51biBkaWUgUmVjaGVuYmVpc3BpZWxlOgorCisJRnVlciBkaWUgS29zdGVuOgorCQlWYWx1ZQlWYWx1ZU8JRlZhbHVlCUZWYWx1ZU8KKwlNZW5zY2gJICAgMTAJICAgIDEwCSAgICAgOQkgICAgICA5CisJRWxmICAgCSAgIDEwCSAgICAxMAkgICAgMTAgICAgICAgMTAKKwlIb2JiaXQJICAgMTAJICAgIDEwCSAgICAxMAkgICAgIDEwCisJWndlcmcJICAgMTAJICAgIDE0CSAgICAxMAkgICAgIDE0CisKKwlGdWVyIGRlbiBTY2hhZGVuOgorCQkJVmFsdWUJVmFsdWVPCUZWYWx1ZQlGVmFsdWVPCisJTWVuc2NoCQkxMDAJMTI1CTEwMAkxMjUKKwlFbGYgIAkJMTAwCTEyNQkxMjAJMTUwCisJSG9iYml0CQkxMDAJMTI1CTEwMAkxMjUKKwlad2VyZwkJMTAwCTEyNQkgODAJMTAwCisKKwlBbiBkaWVzZW0gQmVpc3BpZWwgc2llaHQgbWFuIGRldXRsaWNoLCB3aWUgbWFuIG1pdCBlaW4gcGFhciAKKwlPZmZzZXRzIHVuZCBGYWt0b3JlbiBkaWUgV2lya3VuZyBlaW5lcyBTcHJ1Y2hlcyBkZXV0bGljaCAKKwl2ZXJhZW5kZXJuIGthbm4uIEVzIHNvbGx0ZSBiZWkgZWlnZW5lbiBCZXJlY2hudW5nZW4gaW1tZXIgCisJR2V0RlZhbHVlTyBiZW51dHp0IHdlcmRlbi4KKworU2llaGUgYXVjaDoKKworCSJHZXRWYWx1ZSIsICJHZXRGYWN0b3IiLCAiR2V0T2Zmc2V0IiwgIkdldEZWYWx1ZSIsICJHZXRWYWx1ZU8iCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9HZXRGYWN0b3IgYi9kb2MvbGZ1bi9HZXRGYWN0b3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI4MTJkZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0dldEZhY3RvcgpAQCAtMCwwICsxLDM3IEBACitGVU5LVElPTjoKKworCXZhcmFyZ3MgaW50IEdldEZhY3RvcihzdHJpbmcgdm5hbWUsIG1hcHBpbmcgbWFwLCBvYmplY3QgcGwpIAorCisKK0FSR1VNRU5URToKKworCXZuYW1lCTogbmFtZSBkZXMgcGFyYW1ldGVycyBhdXMgZGVtIHNwZWxsbWFwcGluZworCW1hcCAgIAk6IHNwZWxsbWFwcGluZworCXBsIAk6IGNhc3RlcgorCisKK0JFU0NIUkVJQlVORzoKKworCSdCZXJlY2huZXQnIGRlbiBGYWN0b3IgZGVzIFBhcmFtZXRlcnMgaW4gc3BlbGxtYXBwaW5nLgorCisKK1JVRUNLR0FCRVdFUlQ6CisKKwlCZXJlY2huZXRlciBGYWN0b3IgYXVzIGRlbSBTcGVsbG1hcHBpbmcuCisKKworQkVNRVJLVU5HRU46CisKKwlCZXNjaHJhZWt1bmcgYXVmIDEwLTEwMDAuIFdlcnRlIGdyb2Vzc2VyIG9kZXIga2xlaW5lciBhbHMgZGllc2UKKwl3ZXJkZW4gJ2FiZ2VzY2huaXR0ZW4nLgorCisKK0JFSVNQSUVMOgorCisJeHh4PUdldEZhY3RvcihTSV9TS0lMTERBTUFHRSxzaW5mbyxjYXN0ZXIpOworCitTaWVoZSBhdWNoOgorCisJIkdldFZhbHVlIiwgIkdldE9mZnNldCIsICJHZXRGVmFsdWUiLCAiR2V0VmFsdWVPIiwgIkdldEZWYWx1ZU8iCisKKwlBdXNmdWVocmxpY2hlcyBCZWlzcGllbCBzaWVoZSAiR2V0RlZhbHVlTyIuCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9HZXRHcm91cE1lbWJlcnMgYi9kb2MvbGZ1bi9HZXRHcm91cE1lbWJlcnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY3MGFhMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0dldEdyb3VwTWVtYmVycwpAQCAtMCwwICsxLDM2IEBACitHZXRHcm91cE1lbWJlcnMoKQorRlVOS1RJT046CisgICAgIHN0cmluZyAqR2V0R3JvdXBNZW1iZXJzKHN0cmluZyBncnApCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3AvZGFlbW9uL21hdGVyaWFsZGIuYyAoTUFURVJJQUxEQikKKworQVJHVU1FTlRFOgorICAgICBzdHJpbmcgZ3JwIC0gR3J1cHBlbm5hbWUKKworQkVTQ0hSRUlCVU5HOgorICAgICBHaWJ0IGFsbGUgZGllc2VyIEdydXBwZSB6dWdlaG9lcmlnZW4gTWF0ZXJpYWxpZW4genVydWVjay4gRGF6dSBndXQsIHNpY2gKKyAgICAgZWluZW4gVWViZXJibGljayB1ZWJlciBkaWUgYWt0dWVsbGUgTGlzdGUgenUgdmVyc2NoYWZmZW4uCisKK1JVRUNLR0FCRVdFUlQ6CisgICAgIEFycmF5IHZvbiBTdHJpbmdzIG1pdCBNYXRlcmlhbGllbiBvZGVyICh7fSkKKworQkVJU1BJRUxFOgorICAgICAvLyB3aXIgd29sbGVuIGlyZ2VuZCBlaW4gTWV0YWxsIGhhYmVuLCBuZW5uZW4gZGllcyBhYmVyIGJlaW0gTmFtZW4KKyAgICAgaW50IGluZDsKKyAgICAgc3RyaW5nKiBsaWtlaXQ7CisgICAgIGxpa2VpdD1NQVRFUklBTERCLT5HZXRHcm91cE1lbWJlcnMoTUFUR1JPVVBfTUVUQUwpOworICAgICBpbmQ9cmFuZG9tKHNpemVvZihsaWtlaXQpKTsKKyAgICAgLi4uCisgICAgIHdyaXRlKCJEZXIgU2NobWllZCBzYWd0OiBNaXIgZmVobHQgbm9jaCAiKworCSAgIE1BVEVSSUFMREItPk1hdGVyaWFsTmFtZShsaWtlaXRbaW5kXSwgV0VSLCAxMDApKyIuXG4iKTsKKyAgICAgLi4uCisKK1NJRUhFIEFVQ0g6CisgICAgIEtvbnplcHRlOgkgIG1hdGVyaWFsLCBtYXRlcmlhbGVya2VubnVuZworICAgICBHcnVuZGxlZ2VuZDogUF9NQVRFUklBTCwgL3N5cy90aGluZy9tYXRlcmlhbC5oCisgICAgIE1hc3RlcjoJICBBZGRNYXRlcmlhbCgpLCBDb252TWF0ZXJpYWxMaXN0KCksIE1hdGVyaWFsR3JvdXAoKSwKKwkJICBHcm91cE5hbWUoKSwgTWF0ZXJpYWxOYW1lKCksCisJCSAgR2V0TWF0TWVtYmVyc2hpcCgpCisKKzcuIE1haSAyMDA0IEdsb2luc29uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vR2V0SW5mb0FyciBiL2RvYy9sZnVuL0dldEluZm9BcnIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFlMjUxYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0dldEluZm9BcnIKQEAgLTAsMCArMSwzMSBAQAorR2V0SW5mb0FycigpCitGVU5LVElPTjoKKyAgICAgc3RhdGljIG1peGVkICpHZXRJbmZvQXJyKHN0cmluZyBzdHIpCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC9ucGMvaW5mby5jCisKK0FSR1VNRU5URToKKyAgICAgc3RyaW5nIHN0cgkgLSBTY2hsdWVzc2Vsd29ydCBkZXIgRnJhZ2UKKworQkVTQ0hSRUlCVU5HOgorICAgICBTdWNodCBuYWNoIGVpbmVtIFNjaGx1ZXNzZWx3b3J0IGluIGRlbiBhYmdlbGVndGVuIEFudHdvcnRlbgorICAgICB1bmQgZ2lidCBkaWUgSW5mb3JtYXRpb25lbiBvZGVyIGVpbmVuIDBlci1BcnJheSB6dXL8Y2suCisKK0JFTUVSS1VOR0VOOgorICAgICBVZWJlcnNjaHJlaWJiYXIgOikKKworUlVFQ0tHQUJFV0VSVDoKKyAgICAgU2llaGUgUGFyYW1ldGVyIHZvbiBBZGRJbmZvOgorCisgICAgIEFycmF5IG1pdDoKKyAgICAgKHsgPEluZm9zdHJpbmc+ICgwIGZ1ZXIga2VpbmUgQW50d29ydCksCisgICAgICAgIDxJbmRlbnQtU3RyaW5nPiAoRGVmYXVsdDogMCksCisgICAgICAgIDxTaWxlbnQ+IChEZWZhdWx0OiAwKSwKKyAgICAgICAgPENhc2ViYXNlZD4gKERlZmF1bHQ6IDApCisgICAgIH0pCisKK1NJRUhFIEFVQ0g6CisgICAgIFZlcndhbmR0OiBBZGRJbmZvLCBkb19mcmFnZQorCiszMS5NYXIgMjAwNyBHbG9pbnNvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0dldE1hdE1lbWJlcnNoaXAgYi9kb2MvbGZ1bi9HZXRNYXRNZW1iZXJzaGlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NTlhMzgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9HZXRNYXRNZW1iZXJzaGlwCkBAIC0wLDAgKzEsNTUgQEAKK0dldE1hdE1lbWJlcnNoaXAoKQorRlVOS1RJT046CisgICAgIHN0cmluZyAqR2V0TWF0TWVtYmVyc2hpcChzdHJpbmcgbWF0KQorCitERUZJTklFUlQgSU46CisgICAgIC9wL2RhZW1vbi9tYXRlcmlhbGRiLmMgKE1BVEVSSUFMREIpCisKK0FSR1VNRU5URToKKyAgICAgc3RyaW5nIG1hdCAtIGVpbiBNYXRlcmlhbAorCitCRVNDSFJFSUJVTkc6CisgICAgIEdpYnQgYWxsZSBHcnVwcGVuLCBkZW5lbiBkYXMgTWF0ZXJpYWwgYW5nZWhvZXJ0IHp1cnVlY2suIEdlZWlnbmV0LCB1bQorICAgICBkaWUgRWlnZW5zY2hhZnRlbiBlaW5lcyBNYXRlcmlhbHMgenUgdWViZXJwcnVlZmVuLgorCitSVUVDS0dBQkVXRVJUOgorICAgICBBcnJheSB2b24gU3RyaW5ncyBtaXQgTWF0ZXJpYWxpZW5ncnVwcGVuIG9kZXIgKHt9KQorCitCRUlTUElFTEU6CisgICAgIC8vIGVpbiB3ZWlzZXIgU2NobWllZDoKKyAgICAgaW50IGk7CisgICAgIHN0cmluZyAqbWF0LCBtbmFtZSwgbWdyb3VwOworICAgICBtYXQ9bV9pbmRpY2VzKG9iLT5RdWVyeVByb3AoUF9NQVRFUklBTCkpOworICAgICBpPXNpemVvZihtYXQpOworCisgICAgIHdyaXRlKCJEZXIgU2NobWllZCBzYWd0OiAiK29iLT5OYW1lKFdFUikrIiBiZXN0ZWh0IGF1cyAuLi5cbiIpOworICAgICB3aGlsZShpLS0pIHsKKyAgICAgIC8vIGRlbiBOYW1lbiBlcmtlbm5lbi9hdXNzcHJlY2hlbjoKKyAgICAgIC8vIE1hdGVyaWFsaWVuIHdlcmRlbiBhbGxnZW1laW4gZXR3YXMgYmVzc2VyIGVya2FubnQgKHp1IDUlKSwgYWJlcgorICAgICAgLy8gYWxsZXMgYXVzIE1ldGFsbCB3aXJkIHp1ICsxMDAlIGJlc3NlciBlcmthbm50IC4uLgorICAgICAgbW5hbWU9TUFURVJJQUxEQi0+TWF0ZXJpYWxOYW1lKG1hdFtpXSwgV0VSLAorCSAgICAgKHs1LCAoW01BVFJHUk9VUF9NRVRBTCwgMTAwXSl9KSk7CisKKyAgICAgIC8vIHVuZCBudXIgTWV0YWxsZSBhbmFseXNpZXJlbiAuLi4KKyAgICAgIGlmKE1BVEVSSUFMREItPk1hdGVyaWFsR3JvdXAoKFttYXRbaV06MTAwXSksTUFUR1JPVVBfTUVUQUwpPj0xMDApIHsKKyAgICAgICBpbnQgajsKKyAgICAgICBzdHJpbmcgKm1ncjsKKyAgICAgICBtZ3I9TUFURVJJQUxEQi0+R2V0TWF0TWVtYmVyc2hpcChtYXRbaV0pOworICAgICAgIGo9c2l6ZW9mKG1ncik7CisgICAgICAgbWdyb3VwPSIgZ2Vob2VydCB6dSAiOworICAgICAgIHdoaWxlKGotLSkgeworICAgICAgICBtZ3JvdXArPU1BVEVSSUFMREItPkdyb3VwTmFtZShtZ3Jbal0pOworICAgICAgICBpZihqPjApIG1ncm91cCs9IiwgIjsKKyAgICAgICB9CisgICAgICB9IGVsc2UgbWdyb3VwPSIga2VubmUgaWNoIG5pY2h0IjsKKyAgICAgIHByaW50ZigiJS0xMi4xMnM6ICVzXG4iLG1uYW1lLCBtZ3JvdXApOworICAgICB9CisKK1NJRUhFIEFVQ0g6CisgICAgIEtvbnplcHRlOgkgIG1hdGVyaWFsLCBtYXRlcmlhbGVya2VubnVuZworICAgICBHcnVuZGxlZ2VuZDogUF9NQVRFUklBTCwgL3N5cy90aGluZy9tYXRlcmlhbC5oCisgICAgIE1hc3RlcjoJICBBZGRNYXRlcmlhbCgpLCBDb252TWF0ZXJpYWxMaXN0KCksIE1hdGVyaWFsR3JvdXAoKSwKKwkJICBHcm91cE5hbWUoKSwgTWF0ZXJpYWxOYW1lKCksCisJCSAgR2V0R3JvdXBNZW1iZXJzKCkKKworNy4gTWFpIDIwMDQgR2xvaW5zb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9HZXRPZmZzZXQgYi9kb2MvbGZ1bi9HZXRPZmZzZXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNlYmE1NAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0dldE9mZnNldApAQCAtMCwwICsxLDM4IEBACitGVU5LVElPTjoKKworCXZhcmFyZ3MgaW50IEdldE9mZnNldChzdHJpbmcgdm5hbWUsIG1hcHBpbmcgbWFwLCBvYmplY3QgcGwpIAorCisKK0FSR1VNRU5URToKKworCXZuYW1lCTogbmFtZSBkZXMgcGFyYW1ldGVycyBhdXMgZGVtIHNwZWxsbWFwcGluZworCW1hcCAgIAk6IHNwZWxsbWFwcGluZworCXBsIAk6IGNhc3RlcgorCisKK0JFU0NIUkVJQlVORzoKKworCSdCZXJlY2huZXQnIGRlbiBPZmZzZXQgZGVzIFBhcmFtZXRlcnMgaW4gc3BlbGxtYXBwaW5nLgorCisKK1JVRUNLR0FCRVdFUlQ6CisKKwlCZXJlY2huZXRlciBPZmZzZXQgYXVzIGRlbSBTcGVsbG1hcHBpbmcuCisKKworQkVNRVJLVU5HRU46CisKKwlCZXNjaHJhZWt1bmcgYXVmIC0xMDAwMCBiaXMgKzEwMDAwLiBXZXJ0ZSBncm9lc3NlciBvZGVyIGtsZWluZXIgCisJYWxzIGRpZXNlIHdlcmRlbiAnYWJnZXNjaG5pdHRlbicuIE1laHIgYWxzIDEwMCUgQm9udXMgb2RlciBNYWx1cworCWdpYnRzIG5pY2h0IDstKS4KKworCitCRUlTUElFTDoKKworCXh4eD1HZXRPZmZzZXQoU0lfU0tJTExEQU1BR0Usc2luZm8sY2FzdGVyKTsKKworU2llaGUgYXVjaDoKKworCSJHZXRWYWx1ZSIsICJHZXRGYWN0b3IiLCAiR2V0RlZhbHVlIiwgIkdldFZhbHVlTyIsICJHZXRGVmFsdWVPIgorCisJQXVzZnVlaHJsaWNoZXMgQmVpc3BpZWwgc2llaGUgIkdldEZWYWx1ZU8iLgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vR2V0T3duZXIgYi9kb2MvbGZ1bi9HZXRPd25lcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmIwZjk4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vR2V0T3duZXIKQEAgLTAsMCArMSwxOSBAQAorR2V0T3duZXIoTCkKK0ZVTktUSU9OOgorICAgICBzdHJpbmcgR2V0T3duZXIoKTsKKworQkVTQ0hSRUlCVU5HOgorICAgICBXaXJkIHZvbSBIb2Vycm9ociBnZXJ1ZmVuOgorICAgICAgL2QvaW5zZWxuL3NoYWtlZGJlZXIvc2hha3lpc2xhbmQvb2JqL2hvZXJyb2hyLmMKKyAgICAgdW5kIGthbm4gZWluZW4gQmVzaXR6ZXIgZGVyIERhdGVpZW4genVydWVja2dlYmVuLCBkZXIgdm9tIEJlc2l0emVyCisgICAgIGRlciBQZmFkZSBpbiBkZW5lbiBkaWUgRGF0ZWkgbGllZ3QgYWJ3ZWljaHQuCisKK0JFSVNQSUVMRToKKyAgICAgc3RyaW5nIEdldE93bmVyKCkgeworICAgICAgcmV0dXJuICJUaWFtYWsiOworICAgICB9CisKK1NJRUhFIEFVQ0g6CisgICAgIFBfSU5GTworCisxMS4gTWFpIDIwMDQgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0dldFBoaW9sZW5JbmZvcyBiL2RvYy9sZnVuL0dldFBoaW9sZW5JbmZvcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDRkNjk3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vR2V0UGhpb2xlbkluZm9zCkBAIC0wLDAgKzEsOTcgQEAKK0dldFBoaW9sZW5JbmZvcyhMKQorCitGVU5LVElPTjoKKyAgICAgbWl4ZWQgKkdldFBoaW9sZW5JbmZvcygpOworCitCRVNDSFJFSUJVTkc6CisKKyAgICAgV2lyZCB2b24gZGVyIFBoaW9sZSBhdWZnZXJ1ZmVuOgorICAgICAvZC9pbnNlbG4vbWlyaWwvc3Rlcm5xdWVzdC9vYmovcGhpb2xlLmMKKyAgICAgRGVyIFJhdW0gbXVzcyAvcC9zZXJ2aWNlL21pcmlsL3BoaW9sZS5oIGluY2x1ZGVuLiAgICAgCisgICAgIE1pdCBkZXIgUGhpb2xlIGthbm4gZWluIFNwaWVsZXIgZHVyY2ggVHVlcmVuIHNjaGF1ZW4uIEJlaSBUdWVyZW4sIGRpZQorICAgICB2b20gRG9vcm1hc3RlciAoL29iai9kb29ybWFzdGVyLmMpIHZlcndhbHRldCB3ZXJkZW4sIGtsYXBwdCBkaWVzIGF1dG8tCisgICAgIG1hdGlzY2guIE1vZWNodGUgbWFuIGRhcyB2ZXJiaWV0ZW4sIHNvIG11c3MgZGllIEZ1bmt0aW9uIAorICAgICBHZXRQaGlvbGVuSW5mb3MoKSBpbSBlbnRzcHJlY2hlbmRlbiBSYXVtIGRlZmluaWVydCBzZWluLgorICAgICBCZWZpbmRlbiBzaWNoIFR1ZXJlbiBpbSBSYXVtLCBkaWUgbmljaHQgdm9tIERvb3JtYXN0ZXIgdmVyd2FsdGV0IHdlcmRlbiwKKyAgICAgYWJlciBiZWkgZGVuZW4gZGllIFBoaW9sZSBmdW5rdGlvbmllcmVuIHNvbGwsIHNvIGthbm4gZGllcyBlYmVuZmFsbHMKKyAgICAgbWl0dGVscyBHZXRQaGlvbGVuSW5mb3MoKSBnZXNjaGVoZW4uCisgICAgIAorICAgICBGdW5rdGlvbiBkZXIgUGhpb2xlOgorICAgICBTaWUgcHJvaml6aWVydCBlaW4gQmlsZCBkZXNzZW4sIHdhcyBoaW50ZXIgZGVyIFR1ZXIgbGllZ3QgYXVmIGRpZSBUdWVyLgorICAgICBTdGVodCBkaWUgVHVlciBvZmZlbiwgc28gc2llaHQgZGVyIFNwaWVsZXIgbnVyIGVpbmUgV2FuZCwgZGVubiBlcyB3aXJkCisgICAgIGdlemVpZ3QsIHdhcyBoaW50ZXIgZGllc2VyIFR1ZXIgaXN0LgorICAgICAKKyAgICAgSXN0IGRpZSBUdWVyIGplZG9jaCBnZS0gb2RlciB2ZXJzY2hsb3NzZW4sIHNvIHNpZWh0IGVyIGF1ZiBkZXIgVHVlcgorICAgICBkaWUgTGFuZ2Jlc2NocmVpYnVuZyBkZXMgUmF1bWVzLCBkZXIgaGludGVyIGRlciBUdWVyIGxpZWd0LCBzb3dpZSBkYXMKKyAgICAgSW52ZW50YXIgZGllc2VzIFJhdW1lcy4gCisKKyAgICAgQXVmYmF1IGRlciBGdW5rdGlvbjoKKyAgICAgbWl4ZWQgKkdldFBoaW9sZW5JbmZvcygpIHsKKyAgICAgICByZXR1cm4gKHsKKyAgICAgICAgICAgICAgICAoWworICAgICAgICAgICAgICAgICAgUEhJT0xFX0RFU1Q6ICAgICBzdHJpbmcsICAgICAgIAorICAgICAgICAgICAgICAgICAgUEhJT0xFX0lEUzogICAgICAqc3RyaW5nLCAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgIFBISU9MRV9HRU5ERVI6ICAgaW50LCAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICBQSElPTEVfU1RBVFVTOiAgIGludCwgICAgIChvcHRpb25hbCkKKyAgICAgICAgICAgICAgICAgIFBISU9MRV9MT05HOiAgICAgc3RyaW5nLCAgKG9wdGlvbmFsKQorICAgICAgICAgICAgICAgICAgUEhJT0xFX1ZFUkJPVEVOOiBpbnQgICAgICAob3B0aW9uYWwpCisgICAgICAgICAgICAgICAgXSksCisgICAgICAgICAgICAgICAgKFsKKyAgICAgICAgICAgICAgICAgIC4uLiBOYWVjaHN0ZSBUdWVyCisgICAgICAgICAgICAgICAgXSkKKyAgICAgICAgICAgICAgfSk7CisgICAgIH0KKyAgICAgCisgICAgIFBISU9MRV9ERVNUICAgICAgRGF0ZWluYW1lIGRlcyBaaWVscmF1bXMKKyAgICAgUEhJT0xFX0lEUwkgICAgICBBcnJheSBkZXIgU3RyaW5ncywgbWl0IGRlbmVuIHNpY2ggZGllIFR1ZXIgCisgICAgICAgICAgICAgICAgICAgICAgYW5zcHJlY2hlbiBsYWVzc3QKKyAgICAgUEhJT0xFX0dFTkRFUiAgICBHZXNjaGxlY2h0IGRlciBUdWVyCisgICAgIFBISU9MRV9TVEFUVVMgICAgYWt0dWVsbGVyIFN0YXR1cyBkZXIgVHVlcjoKKyAgICAgICAgICAgICAgICAgICAgICAwIGdlc2NobG9zc2VuL3ZlcnNjaGxvc3NlbiwgMSBvZmZlbgorICAgICAgICAgICAgICAgICAgICAgIEJlaSBUdWVyZW4sIGRpZSBtaXQgTmV3RG9vciBlcnpldWd0IHd1cmRlbgorICAgICAgICAgICAgICAgICAgICAgIG5pY2h0IHNldHplbgorICAgICBQSElPTEVfTE9ORyAgICAgIEJlc2NocmVpYnVuZyBkZXMgWmllbHJhdW1zICh6LkIuIGJlaSBlaW5lciAKKyAgICAgICAgICAgICAgICAgICAgICBGYWtldHVlcikKKyAgICAgUEhJT0xFX1ZFUkJPVEVOICAwIGVybGF1YnQsIDEgdmVyYm90ZW4KKworQkVJU1BJRUw6CisgICAgIEVpbiBSYXVtIGVudGhhZWx0IGVpbmUgSG9senR1ZXIgdW5kIGVpbiBQb3J0YWwuIEVyc3RlcmUgaXN0IG1pdHRlbHMgCisgICAgIE5ld0Rvb3IoLi4uKSBnZWJhdXQsIHNvbGwgYWJlciBuaWNodCB6dSBkdXJjaHNjaGF1ZW4gc2VpbiwgbGV0enRlcmUgaXN0IAorICAgICBzZWxic3RnZXN0cmlja3QuIERpZSBlcnN0ZSBmdWVocnQgaW4gZGVuIFdvcmtyb29tIHZvbiBKb2YsIGRpZSB6d2VpdGUKKyAgICAgaXN0IG51ciBlaW4gRmFrZSB1bmQgaW1tZXIgZ2VzY2hsb3NzZW4uIEJlaSB2b20gRG9vcm1hc3RlciBlcnpldWd0ZW4gCisgICAgIFR1ZXJlbiBzb2xsdGUgUEhJT0xFX1NUQVRVUyBuaWNodCBnZXNldHp0IHdlcmRlbiwgZGEgZGllcyBhdXRvbWF0aXNjaAorICAgICBhYmdlZnJhZ3Qgd2lyZC4KKyAgICAgCisgICAgICNpbmNsdWRlICIvcC9zZXJ2aWNlL21pcmlsL3BoaW9sZS5oIgorICAgICAuLi4KKyAgICAgbWl4ZWQgKkdldFBoaW9sZW5JbmZvcygpeworICAgICAgIHJldHVybiAoeworICAgICAgICAgICAgICAgIChbCisgICAgICAgICAgICAgICAgICBQSElPTEVfREVTVDoiL3BsYXllcnMvam9mL3dvcmtyb29tIiwKKyAgICAgICAgICAgICAgICAgIFBISU9MRV9JRFM6KHsiaG9senR1ZXIifSksICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgIFBISU9MRV9HRU5ERVI6RkVNQUxFLCAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICBQSElPTEVfVkVSQk9URU46MSAgICAgICAgICAKKyAgICAgICAgICAgICAgICBdKSwKKyAgICAgICAgICAgICAgICAoWworICAgICAgICAgICAgICAgICAgUEhJT0xFX0RFU1Q6MCwKKyAgICAgICAgICAgICAgICAgIFBISU9MRV9JRFM6KHsicG9ydGFsIn0pLCAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICBQSElPTEVfR0VOREVSOk5FVVRFUiwgCisgICAgICAgICAgICAgICAgICBQSElPTEVfU1RBVFVTOjAsCisgICAgICAgICAgICAgICAgICBQSElPTEVfTE9ORzoiRHUgc3RlaHN0IGluIGVpbmVyIHJpZXNpZ2VuIFNjaGF0emthbW1lciB1bmQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImthbm5zdCBEZWluIEdsdWVjayBrYXVtIGZhc3Nlbi4gTnVuIGJyYXVjaHN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEdSBudXIgbm9jaCB6dXp1Z3JlaWZlbiB1bmQgYmlzdCBkZXIgcmVpY2hzdGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJld29obmVyIGRlcyBNb3JnZW5HcmF1ZW4uIiwKKyAgICAgICAgICAgICAgICAgIFBISU9MRV9WRVJCT1RFTjowCisgICAgICAgICAgICAgICAgXSkKKyAgICAgICAgICAgICAgfSk7CisgICAgICB9CisgICAgICBNaXR0ZWxzIFBISU9MRV9MT05HIGxhZXNzdCBzaWNoIGF1Y2ggYmVpIGVybGF1YnRlbiB1bmQgdmVyYm90ZW5lbiBUdWVyZW4gCisgICAgICBlaW5zdGVsbGVuLCB3YXMgZGVyIFNwaWVsZXIgc3RhdHQgZGVyIG5vcm1hbGVuIFJhdW1iZXNjaHJlaWJ1bmcgdW5kIGRlbiAKKyAgICAgIGltIFJhdW0gYmVmaW5kbGljaGVuIE9iamVrdGVuIHNlaGVuIHNvbGwuIERhcyBrb2VubnRlIHouQi4gc2lubnZvbGwgCisgICAgICBzZWluLCBmYWxscyBkZXIgU3BpZWxlciB6d2FyIGRpZSBSYXVtYmVzY2hyZWlidW5nLCBhYmVyIG5pY2h0IGRlbiBmaWVzZW4gCisgICAgICBEcmFjaGVuIHNlaGVuIHNvbGwsIGRlciBzaWNoIGViZW5mYWxscyBpbSBSYXVtIGJlZmluZGV0LgorICAgICAgCitTSUVIRSBBVUNIOgorICAgICAgTmV3RG9vcigpLCBRdWVyeURvb3JTdGF0dXMoKSwgU2V0RG9vclN0YXR1cygpLCBRdWVyeUFsbERvb3JzKCkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMZXR6dGUgQWVuZGVydW5nOiBTYW0sIDE0LiBKYW4gMjAwNiwgMTI6MjEsIE1pcmlsCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9HZXRSZXB1dGF0aW9uIGIvZG9jL2xmdW4vR2V0UmVwdXRhdGlvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjBjZGY4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vR2V0UmVwdXRhdGlvbgpAQCAtMCwwICsxLDI2IEBACitHZXRSZXB1dGF0aW9uCitGVU5LVElPTjoKKyAgICAgcHVibGljIGludCBHZXRSZXB1dGF0aW9uKHN0cmluZyByZXBpZCkKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL3BsYXllci9yZXB1dGF0aW9uLmMKKworQVJHVU1FTlRFOgorICAgICByZXBpZAorICAgICAgIEVpbmRldXRpZ2UgSUQgZGVyIGFuZ2VmcmFndGVuIFJlcHV0YXRpb24uCisKK0JFU0NIUkVJQlVORzoKKyAgICAgTGllZmVydCBkZW4gYWt0dWVsbGVuIFdlcnQgZGVyIGFuZ2VnZWJlbmVuIFJlcHV0YXRpb24gPHJlcGlkPiB6dXJ1ZWNrLgorCitSVWVDS0dBQkVXRVJUOgorICAgICBaYWhsZW53ZXJ0LCBJbnRlZ2VyLgorCitCRUlTUElFTEU6CisgICAgIHMuIHJlcHV0YXRpb24KKworU0lFSEUgQVVDSDoKKyAgICAgcmVwdXRhdGlvbgorICAgICBDaGFuZ2VSZXB1dGF0aW9uKCksIEdldFJlcHV0YXRpb25zKCkKKworWlVMRVRaVCBHRUFlTkRFUlQ6CiswNi4wNC4yMDA5LCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9HZXRSZXB1dGF0aW9ucyBiL2RvYy9sZnVuL0dldFJlcHV0YXRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZDU3MWUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9HZXRSZXB1dGF0aW9ucwpAQCAtMCwwICsxLDIzIEBACitHZXRSZXB1dGF0aW9ucworRlVOS1RJT046CisgICAgIHB1YmxpYyBtYXBwaW5nIEdldFJlcHV0YXRpb25zKCkKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL3BsYXllci9yZXB1dGF0aW9uLmMKKworQkVTQ0hSRUlCVU5HOgorICAgICBMaWVmZXJ0IGVpbiBNYXBwaW5nIGFsbGVyIGltIFNwaWVsZXIgZ2VzcGVpY2hlcnRlbiBSZXB1dGF0aW9uZW4gdW5kIGlocmVyCisgICAgIFdlcnRlIHp1cnVlY2suCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIE1hcHBpbmcgKFsoc3RyaW5nKXJlcGlkOiAoaW50KXdlcnRdKQorCitCRUlTUElFTEU6CisgICAgIHMuIHJlcHVhdGlvbgorCitTSUVIRSBBVUNIOgorICAgICByZXB1dGF0aW9uCisgICAgIEdldFJlcHV0YXRpb24oKSwgR2V0UmVwdXRhdGlvbnMoKQorCitaVUxFVFpUIEdFQWVOREVSVDoKKzA2LjA0LjIwMDksIFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0dldFZhbHVlIGIvZG9jL2xmdW4vR2V0VmFsdWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM5NTExOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0dldFZhbHVlCkBAIC0wLDAgKzEsMzcgQEAKK0ZVTktUSU9OOgorCisJdmFyYXJncyBpbnQgR2V0VmFsdWUoc3RyaW5nIHZuYW1lLCBtYXBwaW5nIG1hcCwgb2JqZWN0IHBsKSAKKworCitBUkdVTUVOVEU6CisKKwl2bmFtZQk6IG5hbWUgZGVzIHBhcmFtZXRlcnMgYXVzIGRlbSBzcGVsbG1hcHBpbmcKKwltYXAgICAJOiBzcGVsbG1hcHBpbmcKKwlwbCAJOiBjYXN0ZXIKKworCitCRVNDSFJFSUJVTkc6CisKKwknQmVyZWNobmV0JyBkZW4gV2VydCBkZXMgdWViZXJnZWJlbmVuIFBhcmFtZXRlcnMgYXVzIGRlbSAKKwlTcGVsbG1hcHBpbmcuCisKKworUlVFQ0tHQUJFV0VSVDoKKworCUJlcmVjaG5ldGVyIFdlcnQgYXVzIGRlbSBTcGVsbG1hcHBpbmcuCisKKworQkVNRVJLVU5HRU46CisKKwkKKworCitCRUlTUElFTDoKKworCXh4eD1HZXRWYWx1ZShTSV9TS0lMTERBTUFHRSxzaW5mbyxjYXN0ZXIpOworCitTaWVoZSBhdWNoOgorCisJIkdldEZhY3RvciIsICJHZXRPZmZzZXQiLCAiR2V0RlZhbHVlIiwgIkdldFZhbHVlTyIsICJHZXRGVmFsdWVPIgorCisJQXVzZnVlaHJsaWNoZXMgQmVpc3BpZWwgc2llaGUgIkdldEZWYWx1ZU8iLgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vR2V0VmFsdWVPIGIvZG9jL2xmdW4vR2V0VmFsdWVPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NWI4ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9HZXRWYWx1ZU8KQEAgLTAsMCArMSwzNiBAQAorRlVOS1RJT046CisKKwl2YXJhcmdzIGludCBHZXRWYWx1ZU8oc3RyaW5nIHZuYW1lLCBtYXBwaW5nIG1hcCwgb2JqZWN0IHBsKSAKKworCitBUkdVTUVOVEU6CisKKwl2bmFtZQk6IG5hbWUgZGVzIHBhcmFtZXRlcnMgYXVzIGRlbSBzcGVsbG1hcHBpbmcKKwltYXAgICAJOiBzcGVsbG1hcHBpbmcKKwlwbCAJOiBjYXN0ZXIKKworCitCRVNDSFJFSUJVTkc6CisKKwlCZXJlY2huZXQgZGVuIFdlcnQgdW5kIGRlbiBPZmZzZXQgZGVzIFBhcmFtZXRlcnMgaW4gc3BlbGxtYXBwaW5nLgorCisKK1JVRUNLR0FCRVdFUlQ6CisKKwlCZXJlY2huZXRlciBXZXJ0K09mZnNldCBhdXMgZGVtIFNwZWxsbWFwcGluZy4KKworCitCRU1FUktVTkdFTjoKKworCVJ1ZnQgR2V0VmFsdWUodm5hbWUsbWFwLHBsKStHZXRPZmZzZXQodm5hbWUsbWFwLHBsKSBhdWYuCisKKworQkVJU1BJRUw6CisKKwl4eHg9R2V0VmFsdWVPKFNJX1NLSUxMREFNQUdFLHNpbmZvLGNhc3Rlcik7CisKK1NpZWhlIGF1Y2g6CisKKwkiR2V0VmFsdWUiLCAiR2V0RmFjdG9yIiwgIkdldE9mZnNldCIsICJHZXRGVmFsdWUiLCAiR2V0RlZhbHVlTyIKKworCUF1c2Z1ZWhybGljaGVzIEJlaXNwaWVsIHNpZWhlICJHZXRGVmFsdWVPIi4KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0dpbGRlbnByb3BlcnRpZXMgYi9kb2MvbGZ1bi9HaWxkZW5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYTE2YzMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9HaWxkZW5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTMxIEBACitOYW1lCQkJQmVzY2hyZWlidW5nCisKK1BfR1VJTERfU0tJTExTCQlQcm9wZXJ0eSBmdWVyIFNraWxscyBpbiBkZXIgR2lsZGUKK1BfR1VJTERfUkVTVFJJQ1RJT05TIAlSZXN0cmlrdGlvbmVuIGZ1ZXIgZGVuIEVpbnRyaXR0IGluIGRpZSBHaWxkZQorUF9HVUlMRF9ERUZBVUxUX1NQRUxMQk9PSyAgCitQX0dVSUxEX01BTEVfVElUTEVTIAlNYWVubmxpY2hlIEdpbGRlbnRpdGVsCitQX0dVSUxEX0ZFTUFMRV9USVRMRVMJV2VpYmxpY2hlIEdpbGRlbnRpdGVsCitQX0dVSUxEX0xFVkVMUwkJR2lsZGVuc3R1ZmVuCitQX1NCX1NQRUxMUyAJCVByb3BlcnR5IGZ1ZXIgU3BlbGxzIGluIFNwZWxsYm9vaworUF9HTE9CQUxfU0tJTExQUk9QUwlQcm9wZXJ0aWVzIGRlciBHaWxkZSBVTkQgZGVzIFNwZWxsYm9va3MKKworUHJvcGVydGllcyBkZXMgU3BpZWxlcnM6CitQX0dVSUxECQkJU3RyaW5nIG1pdCBkZW0gTmFtZW4gZGVyIEdpbGRlCitQX0dVSUxEX0xFVkVMCQlHaWxkZW5zdHVmZQorUF9HVUlMRF9USVRMRQkJR2lsZGVudGl0ZWwKK1BfR1VJTERfUkFUSU5HCQlSYXRpbmcgaW4gZGVyIEdpbGRlCitQX05FV1NLSUxMUwkJbWFwcGluZyBtaXQgU2tpbGxzIHVuZCBTcGVsbHMKK1BfTkVYVF9TUEVMTF9USU1FCVplaXQgYmlzIGRlciBuYWVjaHN0ZSBTcGVsbCBnZXNwcm9jaGVuIHdlcmRlbiBrYW5uCitQX1RNUF9BVFRBQ0tfSE9PSwlBbmdyaWZmcy1FcnNhdHpmdW5rdGlvbgorUF9UTVBfQVRUQUNLX01PRAlBbmdyaWZmcy1Nb2RpZml6aWVydW5nCitQX1RNUF9ERUZFTkRfSE9PSwlBYndlaHItRXJzYXR6ZnVua3Rpb24KK1BfVE1QX0RJRV9IT09LCQkiRGllIi1FcnNhdHpmdW5rdGlvbgorUF9UTVBfTU9WRV9IT09LCQlCZXdlZ3VuZ3MtRXJzYXR6ZnVua3Rpb24KK1BfREVGRU5ERVJTCQlWZXJ0ZWlkaWdlcgorUF9QUkVQQVJFRF9TUEVMTAlWb3JiZXJlaXRldGVyIFNwZWxsCitQX0RFRkFVTFRfR1VJTEQJCVN0YW5kYXJkZ2lsZGUKK1BfTUFHSUNfUkVTSVNUQU5DRV9PRkZTRVQgT2Zmc2V0IGZ1ZXIgTWFnaWUtUmVzaXN0ZW56ZW4KKworU3RhbmRhcmQtU2tpbGxzOgorU0tfRklHSFQJCUthbXBmc2tpbGwoZ2xvYmFsKQorU0tfU1dPUkRGSUdIVElORwlTY2h3ZXJ0a2FtcGYKK1NLX1dFQVBPTkxFU1MJCVdhZmZlbmxvc2VyIEthbXBmCitTS19UV09IQU5ERUQgICAgICAgCVp3ZWloYW5ka2FtcGYKK1NLX0NBU1RJTkcgICAgICAgICAJWmF1YmVyLVNraWxsCitTS19NQUdJQ19BVFRBQ0sgICAgCU1hZ2lzY2hlciBBbmdyaWZmCitTS19NQUdJQ19ERUZFTlNFICAgCU1hZ2lzY2hlIEFid2VocgorU0tfTklHSFRWSVNJT04gICAgIAlOYWNodHNpY2h0CitTS19CT09aRSAgICAgICAgICAgCVNhdWYtU2tpbGwKK1NLX0lORk9STV9ERUZFTkQgICAJCitTS19ERUZFTkRfT1RIRVIJCQorU0tfQ0FSUlkJCVRyYWdlLVNraWxsCitTS19TUEVMTF9ERUZFTkQJCVNwcnVjaC1BYndlaHIKKworU2tpbGwtQXR0cmlidXRlOgorUF9TS0lMTF9BVFRSSUJVVEVTCVByb3BlcnR5IGZ1ZXIgU2tpbGwtQXR0cmlidXRlCitQX1NLSUxMX0FUVFJJQlVURV9PRkZTRVRTICAgUHJvcGVydHkgZnVlciBPZmZzZXRzIGRlciBTa2lsbC1BdHRyaWJ1dGUKK1NBX1FVQUxJVFkJCUFsbGdlbWVpbmUgUXVhbGl0YWV0CitTQV9EQU1BR0UJCVNjaGFkZW4KK1NBX1NQRUVECQlHZXNjaHdpbmRpZ2tlaXQKK1NBX0RVUkFUSU9OCQlEYXVlcgorU0FfRVhURU5TSU9OCQlBdXNkZWhudW5nCitTQV9SQU5HRQkJUmVpY2h3ZWl0CitTQV9FTkVNWV9TQVZFOiBpZGVudGlzY2ggenUgU0FfU1BFTExfUEVORVRSQVRJT04gKE9CU09MRVQhKQorU0FfU1BFTExfUEVORVRSQVRJT046IENoYW5jZSBkZXMgX0Nhc3RlcnNfLCBlaW5lbiBTcGVsbCBkdXJjaCBlaW4KKyAgICAgICAgICAgICAgICAgICAgICBQX05PTUFHSUMgZHVyY2h6dWtyaWVnZW4uCisKK1NraWxsLUluZm86CitGQUNUT1IoeCkJCUZha3RvcgorT0ZGU0VUKHgpCQlPZmZzZXQKK1NJX1NLSUxMRlVOQwkJRnVua3Rpb24sIGRpZSBhdWZnZXJ1ZmVuIHdpcmQKK1NJX0NMT1NVUkUJCUludGVybiAoR2VzY2h3aW5kaWdrZWl0c29wdGltaWVydW5nKQorU0lfU1BFTExCT09LCQlTcGVsbGJvb2ssIGluIGRlbSBkZXIgU3BlbGwgc3RlaHQKK1NJX1NQRUxMQ09TVAkJS29zdGVuIGRlcyBTcGVsbHMKK1NJX1RJTUVfTVNHCQlEaWUgTWVsZHVuZyB3aXJkIGFuc3RlbGxlIHZvbiAiRHUgYmlzdCBub2NoIHp1IAorCQkJZXJzY2hvZXBmdCB2b24gRGVpbmVtIGxldHp0ZW4gU3BydWNoLiIgYXVzZ2VnZWJlbi4KK1NJX1NQX0xPV19NU0cJCURpZSBNZWxkdW5nIHdpcmQgYW5zdGVsbGUgdm9uICJEdSBoYXN0IHp1IHdlbmlnIAorCQkJWmF1YmVycHVua3RlIGZ1ZXIgZGllc2VuIFNwcnVjaC4iIGF1c2dlZ2ViZW4uCitTSV9OT01BR0lDCQlQcm96ZW50d2VydCwgbWl0IGRlbSBQX05PTUFHSUMgbWdhbmdlbiB3ZXJkZW4ga2FubgorU0lfU1BFTExGQVRJR1VFCQlFcnNjaG9lcGZ1bmcgLSBaZWl0LCBpbiBkZXIga2VpbmUgd2VpdGVyZW4gU3BlbGxzCisJCQlhdWZnZXJ1ZmVuIHdlcmRlbiBrb2VubmVuCitTSV9TS0lMTExFQVJOCQlMZXJuZ2VzY2h3aW5kaWdrZWl0IGluIDAuMDElIHBybyBBX0lOVC8yCitTSV9TS0lMTEFCSUxJVFkJCUZhZWhpZ2tlaXQsIGRpZXNlbiBTcHJ1Y2ggenUgYmVudXR6ZW4KK1NJX1NLSUxMQVJHCQlBcmd1bWVudGUsIGRpZSB1ZWJlcmdlYmVuIHd1cmRlbgorU0lfU0tJTExSRVNUUl9VU0UJQmVzY2hyYWVua3VuZ2VuIGJlaW0gR2VicmF1Y2gKK1NJX1NLSUxMUkVTVFJfTEVBUk4JQmVzY2hyYWVua3VuZ2VuIGJlaW0gTGVybmVuCitTSV9TS0lMTElORk8JCUt1cnplciBJbmZvcm1hdGlvbnN0ZXh0CitTSV9TS0lMTElORk9fTE9ORwlMYW5nZXIgSW5mb3JtYXRpb25zdGV4dAorU0lfU0tJTExEQU1BR0UJCVNjaGFkZW4KK1NJX1NLSUxMREFNQUdFX1RZUEUJQXJ0IGRlcyBTY2hhZGVucworU0lfU0tJTExEQU1BR0VfTVNHCU1lbGR1bmcgZGllIGFuc3RlbGxlIGVpbmVyIFdhZmZlIGtvbW1lbiBzb2xsCitTSV9TS0lMTERBTUFHRV9NU0cyCWRpdG8gZnVlciBkZW4gVGV4dCBmdWVyIGFuZGVyZSBpbSBSYXVtCitTSV9TUEVMTAkJU3BlbGwsIG1pdCBkZW0gYW5nZWdyaWZmZW4gd3VyZGUKK1NJX0lOSEVSSVQJCVNraWxsLCB2b24gZGVtIGV0d2FzIHVlYmVybm9tbWVuIHdlcmRlbiBzb2xsCitTSV9ESUZGSUNVTFRZCQlXZXJ0LCBkZXIgZGllIE9iZXJncmVuemUgZGVyIEZhZWhpZ2tlaXQgYWJncmVuenQKK1NJX0xBU1RMSUdIVAkJRnVlciBOYWNodHNpY2h0OiBXYW5uIGhhdCBkZXIgU3BpZWxlciB6dW0gbGV0enRlbiAKKwkJCW1hbCBMaWNodCBnZXNlaGVuLgorU0lfU0tJTExIRUFMCQlIZWlsdW5nCitTSV9VU1IJCQlzZWxic3QgZGVmaW5pZXJ0ZSBJbmZvcworU0lfR1VJTEQJCUdpbGRlLCBmYWxscyBBdXN3YWhsIGF1cyBtZWhyZXJlbiBtb2VnbGljaAorU0lfRU5FTVkJCUZlaW5kIGJlaSBLYW1wZnNwcnVlY2hlbgorU0lfRlJJRU5ECQlEZXIgenUgdmVydGVpZGlnZW5kZSBGcmV1bmQgYmVpIERlZmVuZE90aGVyIAorCQkJdW5kIEluZm9ybURlZmVuZAorU0lfTUFHSUNfVFlQRQkJVm9uIHdhcyBmdWVyIGVpbmVyIEFydCBpc3QgZGllIE1hZ2llIChzLnUuKQorU0lfUFJFUEFSRV9USU1FCQlaZWl0IGRpZSB6dXIgVm9yYmVyZWl0dW5nIGJlbm9ldGlndCB3aXJkLgorU0lfQVRUQUNLX0JVU1lfTVNHCU1lbGR1bmcsIHdlbm4gZGVyIFNwaWVsZXIgenUgYmVzY2hhZWZ0aWd0IGlzdAorU0lfTk9fQVRUQUNLX0JVU1kJV2VubiBkZXIgU3BlbGwgbmljaHQgYWxzIFRhZXRpZ2tlaXQgemFlaGxlbi9nZXphZWhsdCAKKwkJCXdlcmRlbiBzb2xsLCBrYW5uIG1hbiBoaWVyIAorCQkJTk9fQVRUQUNLX0JVU1lbX1NFVHxfUVVFUlldIHNldHplbgorU1BfTkFNRQkJCU5hbWUgZGVzIFNwZWxscywgZmFsbHMgTWFwcGluZworU1BfU0hPV19EQU1BR0UJCVRyZWZmZXJtZWxkdW5nIHNvbGwgZ2V6ZWlndCB3ZXJkZW4uCitTUF9SRURVQ0VfQVJNT1VSCUFDIHNvbGwgVHlwYWJoYWVuZ2lnIHJlZHV6aWVydCB3ZXJkZW4uCitTUF9QSFlTSUNBTF9BVFRBQ0sJS29lcnBlcmxpY2hlciBBbmdyaWZmCitTUF9SRUNVUlNJVkUJCVJla3Vyc2lvbmVuCisKK1NraWxsLVJlc3RyaWN0aW9uczoKK1NSX0ZVTgkJCUZ1bmt0aW9uLCBkaWUgd2VpdGVyZSBFaW5zY2hyYWVua3VuZ2VuIHBydWVmdAorU1JfRVhDTFVERV9SQUNFCQlBdXNnZXNjaGxvc3NlbmUgUmFzc2VuCitTUl9JTkNMVURFX1JBQ0UJCUVpbmdlc2NobG9zc2VuZSBSYXNzZW4KK1NSX0dPT0QJCQlBbGlnbiA8IAorU1JfQkFECQkJQWxpZ24gPgorU1JfRlJFRV9IQU5EUwkJQmVub2V0aWd0ZSBmcmVpZSBIYWVuZGUKK1NSX1NFRVIJCQlNdXNzIFNlaGVyIHNlaW4KK1NSX01JTl9TSVpFCQlNaW5kZXN0Z3JvZXNzZQorU1JfTUFYX1NJWkUJCU1heGltYWxncm9lc3NlCitTTV9SQUNFCQkJUmFzc2Vuc3BlemlmaXNjaGUgQmVzb25kZXJoZWl0ZW4KKworTWFnaWUtQXJ0ZW46CitNVF9BTkdSSUZGICAgICAgCUFuZ3JpZmYKK01UX1NDSFVUWiAgICAgICAJU2NodXR6CitNVF9JTExVU0lPTiAgICAgCUlsbHVzaW9uCitNVF9CRUhFUlJTQ0hVTkcgCUJlaGVycnNjaHVuZworTVRfSEVMTFNJQ0hUICAgIAlIZWxsc2ljaHQKK01UX1ZFUldBTkRMVU5HICAJVmVyd2FuZGx1bmcKK01UX0JFU0NIV09FUlVORyAJQmVzY2h3b2VydW5nCitNVF9CRVdFR1VORyAgICAgCUJld2VndW5nCitNVF9TQUtSQUwgICAgICAgCSdHb2V0dGxpY2hlcycKK01UX0hFSUxVTkcgICAgICAJSGVpbHVuZworTVRfQ1JFQVRJT04gICAgIAlFcnNjaGFmZnVuZworTVRfUFNZQ0hPICAgICAgIAlQc3ljaG8tS3JhbQorTVRfTUlTQyAgICAgICAgIAlTb25zdGlnZXMKKwpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vR2l2ZU1pbmlRdWVzdCBiL2RvYy9sZnVuL0dpdmVNaW5pUXVlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA4NDE4YwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0dpdmVNaW5pUXVlc3QKQEAgLTAsMCArMSw0MyBAQAorR2l2ZU1pbmlRdWVzdCgpCisKK0ZVTktUSU9OOgorICAgICAgICBpbnQgR2l2ZU1pbmlRdWVzdChvYmplY3Qgd2lubmVyKQorCitERUZJTklFUlQgSU46CisgICAgICAgIC9zZWN1cmUvcXVlc3RtYXN0ZXIKKworQVJHVU1FTlRFOgorCXdpbm5lcgorCSAgU3BpZWxlcm9iamVrdCwgZGFzIGRpZSBRdWVzdCBiZXN0YW5kZW4gaGF0LgorCitSVWVDS0dBQkVXRVJUOgorICAgICAgICAoRGllIERlZmluZXMgZnVlciBkZW4gUnVlY2tnYWJld2VydCBmaW5kZW4gc2ljaCBpbiAKKyAgICAgICAgIC9zZWN1cmUvcXVlc3RtYXN0ZXIuaCkKKyAgICAgICAgIDEgOiBIYXQgZ2VrbGFwcHQgICAgICAgICAgICAgICAgICAgICAgICAgICAoT0spCisgICAgICAgIC0xIDogU3BpZWxlciBoYXQgZGllIFF1ZXN0IGJlcmVpdHMgZ2Vsb2VzdCAgKE1RX0FMUkVBRFlfU0VUKQorICAgICAgICAtMiA6IFVuZ3VlbHRpZ2VyIFF1ZXN0bmFtZSAgICAgICAgICAgICAgICAgIChNUV9LRVlfSU5WQUxJRCkKKyAgICAgICAgLTMgOiBVbmJlZnVndGVyIFp1Z3JpZmYgICAgICAgICAgICAgICAgICAgICAoTVFfSUxMRUdBTF9PQkopCisgICAgICAgIC00IDogUXVlc3QgenVyIFplaXQgaW5ha3RpdiAgICAgICAgICAgICAgICAgKE1RX0lTX0lOQUNUSVZFKQorICAgICAgICAtNSA6IEdhZXN0ZSBsb2VzZW4ga2VpbmUgUXVlc3RzICAgICAgICAgICAgIChNUV9HVUVTVCkKKworQkVTQ0hSRUlCVU5HOgorCU1pdCBkaWVzZXIgRnVua3Rpb24gd2lyZCBuYWNoIGRlbSBlcmZvbGdyZWljaGVuIExvZXNlbiBlaW5lciAKKyAgICAgICAgTWluaVF1ZXN0IGRpZSBRdWVzdCBpbSBTcGllbGVyIGVpbmdldHJhZ2VuLiBEYWJlaSBtdXNzIGRlcgorICAgICAgICBBdWZydWYgaW4gZGVtIE9iamVrdCBlcmZvbGdlbiwgd2VsY2hlcyBpbSBRdWVzdG1hc3RlciAKKyAgICAgICAgZWluZ2V0cmFnZW4gaXN0LiBBbHMgQXJndW1lbnQgbXVzcyBkYXMgU3BpZWxlcm9iamVrdCAKKwlhbmdlZ2ViZW4gd2VyZGVuLCB3ZWxjaGVzIGRpZSBRdWVzdCBiZXN0YW5kZW4gaGF0LgorICAgICAgICAKK0JFSVNQSUVMOgorCVFNLT5HaXZlTWluaVF1ZXN0KHRoaXNfcGxheWVyKCkpOworCitTSUVIRSBBVUNIOgorICAgICAgICBIYXNNaW5pUXVlc3QKKyAgICAgICAgL3NlY3VyZS9xdWVzdG1hc3Rlci5oLCAvc2VjdXJlL3F1ZXN0bWFzdGVyLmMKKworSElOV0VJUzoKKyAgICAgICAgRGllIEluZm9ybWF0aW9uZW4gZnVlciBkZW4gRU0gZnVlciBRdWVzdHMgc29sbHRlbiBkaWVzZW0KKyAgICAgICAgYmVpbSBFaW50cmFnZW4gZGVyIE1pbmlxdWVzdCBpbiBkZW4gUXVlc3RtYXN0ZXIgcGVyIE1haWwKKyAgICAgICAgenVnZXNjaGlja3Qgd2VyZGVuLiBTaWVoZSBkYXp1IGRpZSBIaWxmZSB6dSBBZGRNaW5pUXVlc3QuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1p1bGV0enQgZ2VhZW5kZXJ0OiBEb24sIDMwLiBKYW4gMjAxNCwgMjI6MTQ6MTIgdm9uIEFyay4KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0dpdmVRdWVzdCBiL2RvYy9sZnVuL0dpdmVRdWVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTNhNTAxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vR2l2ZVF1ZXN0CkBAIC0wLDAgKzEsNjMgQEAKK0dpdmVRdWVzdCgpCisKK0ZVTktUSU9OOgorICAgICAgICB2YXJhcmdzIGludCBHaXZlUXVlc3Qoc3RyaW5nIHF1ZXN0bmFtZSwgc3RyaW5nIG1lc3NhZ2UpCisKK0RFRklOSUVSVCBJTjoKKyAgICAgICAgL3N0ZC9wbGF5ZXIvcXVlc3RzLmMKKworQVJHVU1FTlRFOgorICAgICAgICBxdWVzdG5hbWUKKyAgICAgICAgICBRdWVzdG5hbWUsIHdpZSBlciBpbSBRdWVzdG1hc3RlciBlaW5nZXRyYWdlbiB3dXJkZS4KKyAgICAgICAgbWVzc2FnZSAKKyAgICAgICAgICBPcHRpb25hbGUgTWVsZHVuZywgZGllIGF1ZiBkZW0gQWJlbnRldWVyLUthbmFsIHN0YXR0IGRlciAKKyAgICAgICAgICBTdGFuZGFyZG1lbGR1bmcgZ2VzZW5kZXQgd2lyZC4KKyAgICAgICAgICBEYWJlaSB3aXJkIEBAbmFtZUBAIGR1cmNoIGRlbiBTcGllbGVybmFtZW4gZXJzZXR6dC4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgICAgKERpZSBEZWZpbmVzIGZ1ZXIgZGVuIFJ1ZWNrZ2FiZXdlcnQgZmluZGVuIHNpY2ggaW4gCisgICAgICAgICAvc2VjdXJlL3F1ZXN0bWFzdGVyLmgpCisgICAgICAgICAxIDogSGF0IGdla2xhcHB0ICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9LKQorICAgICAgICAtMSA6IFNwaWVsZXIgaGF0IGRpZSBRdWVzdCBiZXJlaXRzIGdlbG9lc3QgIChHUV9BTFJFQURZX1NFVCkKKyAgICAgICAgLTIgOiBVbmd1ZWx0aWdlciBRdWVzdG5hbWUgICAgICAgICAgICAgICAgICAoR1FfS0VZX0lOVkFMSUQpCisgICAgICAgIC0zIDogVW5iZWZ1Z3RlciBadWdyaWZmICAgICAgICAgICAgICAgICAgICAgKEdRX0lMTEVHQUxfT0JKKQorICAgICAgICAtNCA6IFF1ZXN0IHp1ciBaZWl0IGluYWt0aXYgICAgICAgICAgICAgICAgIChHUV9JU19JTkFDVElWRSkKKworQkVTQ0hSRUlCVU5HOgorICAgICAgICBNaXQgZGllc2VyIEZ1bmt0aW9uIHdpcmQgbmFjaCBkZW0gZXJmb2xncmVpY2hlbiBMb2VzZW4gZWluZXIgCisgICAgICAgIFF1ZXN0IGRpZSBRdWVzdCBpbSBTcGllbGVyIGVpbmdldHJhZ2VuLiBEYWJlaSBtdXNzIGRlciBBdWZydWYgCisgICAgICAgIGluIGRlbSBPYmpla3QgZXJmb2xnZW4sIHdlbGNoZXMgaW0gUXVlc3RtYXN0ZXIgZWluZ2V0cmFnZW4gaXN0LgorICAgICAgICBadXNhZXR6bGljaCB3aXJkIGRlciBaZWl0cHVua3QgZWluZ2V0cmFnZW4sIGFuIGRlbSBkaWUgUXVlc3QKKyAgICAgICAgYmVzdGFuZGVuIHd1cmRlLgorICAgICAgICAKKyAgICAgICAgV2VyIHNpY2ggZGEgbmljaHQgc2ljaGVyIGlzdCwga2FubiBtaXQgZGVtIFF1ZXN0dG9vbCAKKyAgICAgICAgKC9vYmovdG9vbHMvcXVlc3R0b29sKSBuYWNoc2VoZW4uIAorCisgICAgICAgIE5hY2hkZW0gZWluZSBRdWVzdCBhbHMgZ2Vsb2VzdCBtYXJraWVydCB3dXJkZSwgaXN0IGRpZXMgaW4gZWluZW0gCisgICAgICAgIExvZ2ZpbGUgZnVlciBkaWUgUXVlc3QgaW0gVmVyemVpY2huaXMgL2xvZy9xdWVzdCBlaW56dXRyYWdlbi4gRGF6dQorICAgICAgICB3aXJkIHdyaXRlX2ZpbGUgdmVyd2VuZGV0LgorCitCRUlTUElFTDoKKworICAgICAgICBpbnQgcXVlc3Q7CisKKyAgICAgICAgcXVlc3QgPSB0aGlzX3BsYXllcigpLT5HaXZlUXVlc3QoIlphY2hhcmlhcyBFaXNwYWxhc3QiKTsKKworICAgICAgICBpZiAocXVlc3QgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgIHdyaXRlKCJEdSBmdWVobHN0LCB3aWUgRGVpbmUgRXJmYWhydW5nIGFuc3RlaWd0LlxuIik7CisgICAgICAgICAgd3JpdGVfZmlsZSgiL2xvZy9xdWVzdC9laXNwYWxhc3QiLCAKKyAgICAgICAgICAgICAgICAgICAgIGR0aW1lKHRpbWUoKSkrIiAgIEF1ZmdhYmUgZ2Vsb2VzdCB2b24gIgorICAgICAgICAgICAgICAgICAgICAgK3RoaXNfcGxheWVyKCktPm5hbWUoKSsiXG4iKTsKKyAgICAgICAgfSAKKyAgICAgICAgZWxzZSBpZiAocXVlc3QgIT0gLTEpCisgICAgICAgICAgd3JpdGUoICJEaWUgV2VsdGVubWFzY2hpbmUgd2lsbCBEaXIgRGVpbmUgQXJiZWl0ICIKKyAgICAgICAgICAgICAgICAgKyJuaWNodCBhbmVya2VubmVuLlxuIgorICAgICAgICAgICAgICAgICArIkZyYWdlIGVpbmVuIEVyem1hZ2llciB1bSBIaWxmZS5cbiIgKTsKKworU0lFSEUgQVVDSDoKKyAgICAgICAgL3NlY3VyZS9xdWVzdG1hc3Rlci5oLCAvb2JqL3Rvb2xzL3F1ZXN0dG9vbAorICAgICAgICBRdWVyeVF1ZXN0KCksIHdyaXRlX2ZpbGUoKSwgTW9kaWZ5UXVlc3RUaW1lKCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorWnVsZXR6dCBnZWFlbmRlcnQ6IFNvbiwgMjcuIEFwciAyMDE0LCBBcmF0aG9ybgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vR3JvdXBOYW1lIGIvZG9jL2xmdW4vR3JvdXBOYW1lCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhODFjNDUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9Hcm91cE5hbWUKQEAgLTAsMCArMSw2MyBAQAorR3JvdXBOYW1lKCkKK0ZVTktUSU9OOgorICAgICBzdHJpbmcgR3JvdXBOYW1lKHN0cmluZyBncnApCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3AvZGFlbW9uL21hdGVyaWFsZGIuYyAoTUFURVJJQUxEQikKKworQVJHVU1FTlRFOgorICAgICBzdHJpbmcgZ3JwIC0gZWluIEdydXBwZW5uYW1lCisKK0JFU0NIUkVJQlVORzoKKyAgICAgR2lidCBkaWUgTGFuZ2Jlc2NocmVpYnVuZyBkZXMgR3J1cHBlbm5hbWVucyB6dXJ1ZWNrLgorCitSVUVDS0dBQkVXRVJUOgorICAgICBEaWUgR3J1cHBlbmJlc2NocmVpYnVuZyBvZGVyICJVbmJla2FubnRlcyIKKworQkVJU1BJRUxFOgorICAgICAvLyBzaW1wZWwKKyAgICAgdG1wPW1faW5kaWNlcyhvYi0+UXVlcnlQcm9wKFBfTUFURVJJQUwpKTsKKyAgICAgd3JpdGUoIkRpZXNlcyBPYmpla3QgZ2Vob2VydCB1LmEuIHp1ciBHcnVwcGUgIisKKyAgICAgICAgICAgTUFURVJJQUxEQi0+R3JvdXBOYW1lKE1BVEVSSUFMREItPkdldE1hdE1lbWJlcnNoaXAodG1wWzBdKVswXSkrCisgICAgICAgICAgICIuXG4iKTsKKyAgICAgLy8gZ2lidCBkaWUgZXJzdGUgR3J1cHBlbnp1Z2Vob2VyaWdrZWl0IGRlcyBlcnN0ZSBNYXRlcmlhbHMgaW4KKyAgICAgLy8gUF9NQVRFUklBTCB6dXJ1ZWNrIChiZWkgTUFUR1JPVVBfTUVUQUwgei5CLiAiLi4uIHp1ciBHcnVwcGUgTWV0YWxsZS4iKQorCisgICAgIC8vIGVpbiB3ZWlzZXIgU2NobWllZDoKKyAgICAgaW50IGk7CisgICAgIHN0cmluZyAqbWF0LCBtbmFtZSwgbWdyb3VwOworICAgICBtYXQ9bV9pbmRpY2VzKG9iLT5RdWVyeVByb3AoUF9NQVRFUklBTCkpOworICAgICBpPXNpemVvZihtYXQpOworCisgICAgIHdyaXRlKCJEZXIgU2NobWllZCBzYWd0OiAiK29iLT5OYW1lKFdFUikrIiBiZXN0ZWh0IGF1cyAuLi5cbiIpOworICAgICB3aGlsZShpLS0pIHsKKyAgICAgIC8vIGRlbiBOYW1lbiBlcmtlbm5lbi9hdXNzcHJlY2hlbjoKKyAgICAgIC8vIE1hdGVyaWFsaWVuIHdlcmRlbiBhbGxnZW1laW4gZ2FueiBzY2hsZWNodCBlcmthbm50ICh6dSA1JSksIGFiZXIKKyAgICAgIC8vIGFsbGVzIGF1cyBNZXRhbGwgd2lyZCB6dSArMTAwJSBndXQgZXJrYW5udCAuLi4KKyAgICAgIG1uYW1lPU1BVEVSSUFMREItPk1hdGVyaWFsTmFtZShtYXRbaV0sIFdFUiwKKwkgICAgICh7NSwgKFtNQVRFUklBTF9TWU1NRVRSSUNfUkVDT0dOSVpBQklMSVRZOgorCQkJKHtNQVRHUk9VUF9NRVRBTCwgMTAwfSldKX0pKTsKKworICAgICAgLy8gdW5kIG51ciBNZXRhbGxlIGFuYWx5c2llcmVuIC4uLgorICAgICAgaWYoTUFURVJJQUxEQi0+TWF0ZXJpYWxHcm91cCgoW21hdFtpXToxMDBdKSxNQVRHUk9VUF9NRVRBTCk+PTEwMCkgeworICAgICAgIGludCBqOworICAgICAgIHN0cmluZyAqbWdyOworICAgICAgIG1ncj1NQVRFUklBTERCLT5HZXRNYXRNZW1iZXJzaGlwKG1hdFtpXSk7CisgICAgICAgaj1zaXplb2YobWdyKTsKKyAgICAgICBtZ3JvdXA9IiBnZWhvZXJ0IHp1ICI7CisgICAgICAgd2hpbGUoai0tKSB7CisgICAgICAgIG1ncm91cCs9TUFURVJJQUxEQi0+R3JvdXBOYW1lKG1ncltqXSk7CisgICAgICAgIGlmKGo+MCkgbWdyb3VwKz0iLCAiOworICAgICAgIH0KKyAgICAgIH0gZWxzZSBtZ3JvdXA9IiBrZW5uZSBpY2ggbmljaHQiOworICAgICAgcHJpbnRmKCIlLTEyLjEyczogJXNcbiIsbW5hbWUsIG1ncm91cCk7CisgICAgIH0KKworU0lFSEUgQVVDSDoKKyAgICAgS29uemVwdGU6CSAgbWF0ZXJpYWwsIG1hdGVyaWFsZXJrZW5udW5nCisgICAgIEdydW5kbGVnZW5kOiBQX01BVEVSSUFMLCAvc3lzL3RoaW5nL21hdGVyaWFsLmgKKyAgICAgTWFzdGVyOgkgIEFkZE1hdGVyaWFsKCksIENvbnZNYXRlcmlhbExpc3QoKSwgTWF0ZXJpYWxHcm91cCgpLAorCQkgIE1hdGVyaWFsTmFtZSgpLAorCQkgIEdldEdyb3VwTWVtYmVycygpLCBHZXRNYXRNZW1iZXJzaGlwKCkKKworNy4gTWFpIDIwMDQgR2xvaW5zb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9HdWFyZEV4aXQgYi9kb2MvbGZ1bi9HdWFyZEV4aXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJhNTNjNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0d1YXJkRXhpdApAQCAtMCwwICsxLDg1IEBACitGVU5LVElPTjoKKyAgICAgcHJvdGVjdGVkIDxpbnR8PHN0cmluZ3xjbG9zdXJlPiogPiogR3VhcmRFeGl0KG9iamVjdCByb29tLCBpbnQgaG9va2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmluZ3xjbG9zdXJlPiogaGRhdGEpOworCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvbnBjL21vdmluZy5jCisKK0FSR1VNRU5URToKKyAgICAgcm9vbQorICAgICAgICAgIERlciBkZW4gSG9vayBhdXNsb2VzZW5kZSBSYXVtIChlbnZpcm9ubWVudCgpKQorICAgICBob29raWQKKyAgICAgICAgICBEaWUgSUQgZGVzIEhvb2tzIChIX0hPT0tfRVhJVF9VU0UpCisgICAgIGhkYXRhCisgICAgICAgICAgRWluIEFycmF5IG1pdCAzIEVsZW1lbnRlbjoKKyAgICAgICAgICAoeworICAgICAgICAgICAgICB2ZXJiIC0gRGFzIEtvbW1hbmRvdmVyYi9BdXNnYW5nc25hbWUgKHN0cmluZykKKyAgICAgICAgICAgICAgZGVzdCAtIFppZWxyYXVtIChzdHJpbmcpIG9kZXIgY2xvc3VyZSAoc3BlY2lhbCBleGl0cykKKyAgICAgICAgICAgICAgbXNnICAtIEJld2VndW5nc3JpY2h0dW5nIChzdHJpbmcpIG9kZXIgMAorICAgICAgICAgIH0pCisKK0JFU0NIUkVJQlVORzoKKyAgICAgSXN0IGRpZXNlIEZ1bmt0aW9uIGluIGVpbmVtIE5QQyBkZWZpbmllcnQsIHRyYWVndCBzaWNoIGRlciBOUEMgYmVpIGplZGVyCisgICAgIEJld2VndW5nIGF1dG9tYXRpc2NoIGFscyBLb25zdW1lbnQgdm9uIEhfSE9PS19FWElUX1VTRSBlaW4gdW5kIGRpZXNlCisgICAgIEZ1bmt0aW9uIHdpcmQgaW1tZXIgZ2VydWZlbiwgd2VubiBlaW4gTGViZXdlc2VuIGltIGdsZWljaGVuIEVudmlyb25tZW50CisgICAgIHdpZSBkZXIgTlBDIHZlcnN1Y2h0LCBlaW5lbiBBdXNnYW5nIHp1IGJlbnV0emVuLgorICAgICBEZXIgTlBDIGthbm4gZGFubiBkaWUgQmV3ZWd1bmcgYWJicmVjaGVuICh1bmQgc28gZGVuIEF1c2dhbmcKKyAgICAgYmxvY2tpZXJlbiksIFppZWwgb2RlciBCZXdlZ3VuZ3NtZWxkdW5nIGFlbmRlcm4gb2RlciBrZWluZSBWZXJhZW5kZXJ1bmcKKyAgICAgdm9ybmVobWVuLgorICAgICBEaWUgS29uc3RhbnRlbiBmdWVyIEhvb2tpZCB1bmQgSG9va3N0YXR1cyAocy4gUnVlY2tnYWJld2VydCkgc2luZCBpbgorICAgICA8aG9vay5oPiBkZWZpbmllcnQuCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIEFycmF5IG1pdCB6d2VpIEVsZW1lbnRlbjoKKyAgICAgKHsKKyAgICAgICAgIEhfTk9fTU9EIC8gSF9BTFRFUkVEIC8gSF9DQU5DRUxMRUQsCisgICAgICAgICBoZGF0YQorICAgICB9KQorICAgICBoZGF0YSBpc3QgZ2dmLiBkYXMgZ2VhZW5kZXJ0ZSBBcnJheSwgd2VsY2hlcyBkaWUgRnVua3Rpb24gdWViZXJnZWJlbgorICAgICB3aXJkLiBXZWl0ZXJlIERldGFpbHMgcy4gYXVjaCAvZG9jL3N0ZC9ob29rcworCitCRU1FUktVTkdFTjoKKyAgICAgRGllIEFuemFobCBhbiBLb25zdW1lbnRlbiBlaW5lcyBIb29rcyBpc3QgYmVncmVuenQuIEVzIGlzdCBkYWhlcgorICAgICBtb2VnbGljaCwgZGFzcyBkaWUgUmVnaXN0cmllcnVuZyBuaWNodCBrbGFwcHQsIHdlbm4genV2aWVsZSAoPjUpIFdhZWNodGVyCisgICAgIGltIFJhdW0gc2luZC4gV2lsbCBtYW4gZGFyYXVmIHJlYWdpZXJlbiwgbXVlc3N0ZSBtYW4gZGllIFJlZ2lzdHJpZXJ1bmcKKyAgICAgcHJ1ZWZlbi4KKyAgICAgRWluIE5QQywgd2VsY2hlciBHdWFyZEV4aXQoKSBkZWZpbmllcnQsIGFiZXIgaW0gYWt0dWVsbGVuIEVudmlyb25tZW50CisgICAgIGtlaW5lIFdhY2hlIGhhbHRlbiB3aWxsLCBr9m5udGUgc2ljaCBzZWxiZXIgZGUtcmVnaXN0cmllcmVuLgorCitCRUlTUElFTEU6CisgICAgIDxpbnR8PHN0cmluZ3xjbG9zdXJlPiogPiogR3VhcmRFeGl0KG9iamVjdCByb29tLCBpbnQgaG9va2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RyaW5nfGNsb3N1cmU+KiBoZGF0YSkKKyAgICAgeworICAgICAgIC8vIE51ciBpbiBHZWZhZW5nbmlzcmFldW1lbiBXYWNoZSBoYWx0ZW4KKyAgICAgICBpZiAoc3Ryc3RyKG9iamVjdF9uYW1lKGVudmlyb25tZW50KCkpLCAiL3Jvb20vamFpbCIpPT0wKQorICAgICAgIHsKKyAgICAgICAgIC8vIEhpZXIgZ2VodHMgbmljaHQgcmF1cy4gOy0pCisgICAgICAgICBpZiAoaGRhdGFbMF0gPT0gInJhdXMiKSB7CisgICAgICAgICAgICAgdGVsbF9vYmplY3QodGhpc19wbGF5ZXIoKSwgLi4uKTsKKyAgICAgICAgICAgICByZXR1cm4gKHtIX0NBTkNFTExFRCwgaGRhdGF9KTsKKyAgICAgICAgIH0KKyAgICAgICAgIC8vIFNwZWNpYWwgZXhpdHMgZXJzZXR6ZW4gd2lyIGR1cmNoIGVpbmVuIGVpZ2VuZW4KKyAgICAgICAgIGVsc2UgaWYgKGNsb3N1cmVwKGhkYXRhWzFdKSkgeworICAgICAgICAgICBoZGF0YVsxXSA9ICMnbXlfc3BlY2lhbF9leGl0OworICAgICAgICAgICByZXR1cm4gKHtIX0FMVEVSRUQsIGhkYXRhfSk7CisgICAgICAgICB9CisgICAgICAgICAvLyBhbGxlIGFuZGVyZW4gQXVzZ2FlbmdlIGluIGRpZSBwZXJzb2VubGljaGUgWmVsbGUKKyAgICAgICAgIGVsc2UgeworICAgICAgICAgICB0ZWxsX29iamVjdCh0aGlzX3BsYXllcigpLCAuLi4pOworICAgICAgICAgICBoZGF0YVsxXSA9ICIvcm9vbS9qYWlsXyIrZ2V0dWlkKHRoaXNfcGxheWVyKCkpOworICAgICAgICAgICBoZGF0YVsyXSA9ICJTdWVkZW4iOworICAgICAgICAgICByZXR1cm4gKHtIX0FMVEVSRUQsIGhkYXRhfSk7CisgICAgICAgICB9CisgICAgICB9CisgICAgICAvLyBpbiBhbGxlbiBhbmRlcmVuIFJhZXVtZW4gbmljaHQgZWluZ3JlaWZlbgorICAgICAgcmV0dXJuICh7SF9OT19NT0QsIGhkYXRhfSk7CisgICAgfQorCisKK1NJRUhFIEFVQ0g6CisgICAgIEFkZEV4aXQsIEFkZFNwZWNpYWxFeGl0LCBSZW1vdmVFeGl0CisgICAgIEhSZWdpc3RlclRvSG9vaywgSFJlZ2lzdGVyTW9kaWZpZXIsIEhVbnJlZ2lzdGVyRnJvbUhvb2sKKyAgICAgL2RvYy9zdGQvaG9va3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzIwLjAyLjIwMTYsIFplc3N0cmEKKzIyLjA1LjIwMTYsIE11cGZlbCAoQmVpc3BpZWwga29ycmlnaWVydCkKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0hhbHQgYi9kb2MvbGZ1bi9IYWx0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YmZkYTQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9IYWx0CkBAIC0wLDAgKzEsMzAgQEAKK0hhbHQoKQorCitGVU5LVElPTjoKKyAgICAgdm9pZCBIYWx0KCk7CisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC90cmFuc3BvcnQuYworCitBUkdVTUVOVEU6CisgICAgIGtlaW5lCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGllIEZhaHJ0IGRlcyBUcmFuc3BvcnRlcnMgd2lyZCBhYmdlYnJvY2hlbi4gU2llIG11c3MgZXhwbGl6aXQgbWl0CisgICAgIFN0YXJ0KCkgd2llZGVyIGF1Zmdlbm9tbWVuIHdlcmRlbiEKKworUlVlQ0tHQUJFV0VSVDoKKyAgICAga2VpbmVyCisKK0JFTUVSS1VOR0VOOgorICAgICBFcyBnaWJ0IGtlaW5lIGVpbmZhY2hlIE1vZWdsaWNoa2VpdCwgZGllIEZhaHJ0IGVpbmVzIFRyYW5zcG9ydGVycyBhbgorICAgICBkZXIgU3RlbGxlIHdpZWRlciBhdWZ6dW5laG1lbiwgYW4gZGVyIHNpZSB1bnRlcmJyb2NoZW4gd3VyZGUuIE1hbgorICAgICBtdWVzc3RlIGRpZSBha3R1ZWxsZSBQb3NpdGlvbiBtaXQgUXVlcnlQb3NpdGlvbigpIGVybWl0dGVsbiwgbWl0IEhpbGZlCisgICAgIGRlciBBZGRYWFgoKS1BdWZydWZlIGluIGVpbmUgUG9zaXRpb25zbnVtbWVyIHVtd2FuZGxlbiB1bmQgZGllc2UgYW4KKyAgICAgU3RhcnQoKSB1ZWJlcmdlYmVuLgorCitTSUVIRSBBVUNIOgorICAgICBTdGFydCgpLCAvc3RkL3RyYW5zcG9ydC5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFdlZCBNYXkgOCAxMDoxOToyMyAxOTk2IGJ5IFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vSGFzTWluaVF1ZXN0IGIvZG9jL2xmdW4vSGFzTWluaVF1ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZmMzOTQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9IYXNNaW5pUXVlc3QKQEAgLTAsMCArMSwzNyBAQAorSGFzTWluaVF1ZXN0KCkKKworRlVOS1RJT046CisgICAgICAgIGludCBIYXNNaW5pUXVlc3QobWl4ZWQgcGwsIG1peGVkIG5hbWUpCisKK0RFRklOSUVSVCBJTjoKKyAgICAgICAgL3NlY3VyZS9xdWVzdG1hc3RlcgorCitBUkdVTUVOVEU6CisgICAgICAgIHBsCisgICAgICAgICAgTmFtZSBkZXMgU3BpZWxlcnMgb2RlciBkYXMgU3BpZWxlcm9iamVrdAorICAgICAgICBuYW1lCisgICAgICAgICAgRmlsZW5hbWUgZGVzIE9iamVrdHMgb2RlciBkYXMgT2JqZWt0IHNlbGJzdCwgd2VsY2hlcyBkaWUgTWluaXF1ZXN0CisgICAgICAgICAgaW0gU3BpZWxlciBlaW50cmFnZW4gZGFyZiwgb2RlciBkaWUgTnVtbWVyIChpbnQpIGRlciBNaW5pcXVlc3QKKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgICAgIDEgOiBEZXIgU3BpZWxlciBoYXQgZGllIE1pbmlRdWVzdAorICAgICAgICAgMCA6IERlciBTcGllbGVyIGhhdCBkaWUgTWluaVF1ZXN0IG5vY2ggbmljaHQKKyAgICAgICAgLTIgOiBhbmdlZ2ViZW5lIE1pbmlxdWVzdCBleGlzdGllcnQgbmljaHQKKyAgICAgICAgLTMgOiBmYWxzY2hlIERhdGVudHlwZW4gZnVlciBwbCBvZGVyIG5hbWUgdWViZXJnZWJlbgorCitCRVNDSFJFSUJVTkc6CisgICAgICAgIE1pdCBkaWVzZXIgRnVua3Rpb24ga2FubiBnZXRlc3RldCB3ZXJkZW4sIG9iIGVpbiBTcGllbGVyIGVpbmUgCisgICAgICAgIE1pbmlRdWVzdCBiZXJlaXRzIGdlbG9lc3QgaGF0LiBEYWJlaSBpc3QgZW50d2VkZXIgZGVyIEZpbGVuYW1lIGRlcyAKKyAgICAgICAgT2JqZWt0ZXMgYW56dWdlYmVuLCBkYXMgZGllIFF1ZXN0IGltIFNwaWVsZXIgZWludHJhZ2VuIGRhcmYgb2RlcgorICAgICAgICBkYXMgT2JqZWt0IHNlbGJzdC4KKyAgICAgICAgCitCRUlTUElFTDoKKyAgICAgICAgaWYoIFFNLT5IYXNNaW5pUXVlc3QoZ2V0dWlkKHRoaXNfcGxheWVyKCkpLCB0aGlzX29iamVjdCgpKSE9MSApCisgICAgICAgICAgd3JpdGUoIkR1IGJpc3Qgbm9jaCBuaWNodCByZWlmIGdlbnVnLlxuIik7CisKK1NJRUhFIEFVQ0g6CisgICAgICAgIEdpdmVNaW5pUXVlc3QoTCkKKyAgICAgICAgL3NlY3VyZS9xdWVzdG1hc3Rlci5oLCAvc2VjdXJlL3F1ZXN0bWFzdGVyLmMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorWnVsZXR6dCBnZWFlbmRlcnQ6IDIwMTQtRmViLTAzLCBBcmF0aG9ybi4KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0hpdEZ1bmMgYi9kb2MvbGZ1bi9IaXRGdW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMjIwNzUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9IaXRGdW5jCkBAIC0wLDAgKzEsNjggQEAKK0hpdEZ1bmMoKQorCitGVU5LVElPTjoKKyAgICAgaW50IEhpdEZ1bmMob2JqZWN0IGVuZW15KTsKKworREVGSU5JRVJUIElOOgorICAgICBlaWdlbmVuIE9iamVrdGVuLCBmdWVyIC9zdGQvd2VhcG9uL2NvbWJhdC5jCisKK0FSR1VNRU5URToKKyAgICAgZW5lbXkKKyAgICAgICAgICBEZXIgR2VnbmVyLCBnZWdlbiBkZW4gZGllIFdhZmZlIGVpbmdlc2V0enQgd2lyZC4KKworQkVTQ0hSRUlCVU5HOgorICAgICBEaWUgV2FmZmUga2FubiBhbmhhbmQgZGVzIEdlZ25lcnMgZW5lbXkgZW50c2NoZWlkZW4sIG9iIGVpbgorICAgICBTY2hhZGVuc2JvbnVzIG9kZXIgYXVjaCBlaW4gU2NoYWRlbnNtYWx1cyB3aXJrc2FtIHdpcmQuIERpZXNlciBCb251cworICAgICB3aXJkIHp1IGRlbSBub3JtYWxlbiBTY2hhZGVuIGRlciBXYWZmZSBoaW56dWFkZGllcnQuCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIERlciBTY2hhZGVuc2JvbnVzIGJ6dy4gZGVyIEFic2NobGFnLgorCitCRU1FUktVTkdFTjoKKyAgICAgV2VubiBkdXJjaCBkZW4gQm9udXMgZGllIEdlbmVobWlndW5nc2dyZW56ZW4gZGVyIEJhbGFuY2UKKyAgICAgdWViZXJzY2hyaXR0ZW4gd2VyZGVuIGtvZW5uZW4sIG11c3MgbWFuIHNlaW5lbiBSZWdpb25zbWFnaWVyIHVuZAorICAgICBkaWUgT2JqZWt0LUJhbGFuY2Uga29uc3VsdGllcmVuIQorCisgICAgIFdlcnRlIGRlciBIaXRGdW5jIHNvbGx0ZW4gaW1tZXIgdWViZXIgZWluIHJhbmRvbSgpIHp1cnVlY2tnZWdlYmVuIAorICAgICB3ZXJkZW4hCisKKyAgICAgRGllc2UgRnVua3Rpb24gc29sbHRlIGRpZSBXYWZmZSBuaWNodCB6ZXJzdG9lcmVuISBGYWxscyBpaHIgaW0gS2FtcGYgZWluZQorICAgICBXYWZmZSAoZ2dmLiBpbiBBYmhhZW5naWdrZWl0IHZvbSBHZWduZXIpIHplcnN0b2VyZW4gd29sbHQsIG51dHp0IGRhenUKKyAgICAgYml0dGUgVGFrZUZsYXcoKS4gCisKK0JFSVNQSUVMRToKKyAgICAgRWluZSBXYWZmZSwgZGllIGdlZ2VuIE9ya3MgYmVzb25kZXJzIGd1dCB3aXJrdDoKKworICAgICBpbmhlcml0ICJzdGQvd2VhcG9uIjsKKworICAgICAjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorICAgICAjaW5jbHVkZSA8Y29tYmF0Lmg+CisgICAgICNpbmNsdWRlIDxjbGFzcy5oPgorCisgICAgIGNyZWF0ZSgpeworICAgICAgIGlmKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHsKKyAgICAgICAgICAgc2V0X25leHRfcmVzZXQoLTEpOworICAgICAgICAgICByZXR1cm47CisgICAgICAgfQorICAgICAgIDo6Y3JlYXRlKCk7CisgICAgICAgLyogCisgICAgICAgemlnIFNldFByb3AncywgdW0gZGllIFdhZmZlIHp1IGtvbmZpZ3VyaWVyZW4KKyAgICAgICBIaXRGdW5jKCkgaXN0IGluIGRlciBXYWZmZSBzZWxic3QgZGVmaW5pZXJ0IAorICAgICAgICovCisgICAgICAgU2V0UHJvcChQX0hJVF9GVU5DLCB0aGlzX29iamVjdCgpKTsKKyAgICAgfQorCisgICAgIGludCBIaXRGdW5jKG9iamVjdCBlbmVteSkKKyAgICAgeworICAgICAgIC8qIGxhZXNzdCBzaWNoIGRlciBHZWduZXIgYWxzIE9yayBhbnNwcmVjaGVuPyAqLworICAgICAgIGlmIChlbmVteS0+aXNfY2xhc3NfbWVtYmVyKENMX09SQykpCisgICAgICAgICByZXR1cm4gcmFuZG9tKDEwK3JhbmRvbSg1MCkpOyAvKiBKYSA9PiBTY2hhZGVuIGVyaG9laGVuICovCisKKyAgICAgICByZXR1cm4gMDsgICAvKiBhbnNvbnN0ZW4ga2VpbmVuIHp1c2FldHpsaWNoZW4gU2NoYWRlbiBhbnJpY2h0ZW4gKi8KKyAgICAgfQorCitTSUVIRSBBVUNIOgorICAgICBRdWVyeURlZmVuZCgpLCAvc3RkL3dlYXBvbi5jCisgICAgIFRha2VGbGF3KCkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzExLjA4LjIwMDcsIFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0lkZW50aWZ5IGIvZG9jL2xmdW4vSWRlbnRpZnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM2ZTU4YgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0lkZW50aWZ5CkBAIC0wLDAgKzEsMjQgQEAKK0lkZW50aWZ5KCkKKworRlVOS1RJT046CisgICAgIHZvaWQgSWRlbnRpZnkob2JqZWN0IG9iKTsKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL2NvcnBzZS5jCisKK0FSR1VNRU5URToKKyAgICAgb2IKKyAgICAgICAgICBEYXMga3VlcnpsaWNoIG5hY2ggbGFuZ2VtLCBoYXJ0ZW0gS2FtcGYgdmVyc3RvcmJlbmUgT2JqZWt0LgorCitCRVNDSFJFSUJVTkc6CisgICAgIEluIGRpZXNlciBGdW5rdGlvbiB3ZXJkZW4gTGFuZy0gdW5kIEt1cnpiZXNjaHJlaWJ1bmcgZGVyIExlaWNoZSBnZXNldHp0CisgICAgIHNvd2llIGRpZSBWZXJ3ZXN1bmcgaW4gR2FuZyBnZXNldHp0LgorCitSVWVDS0dBQkVXRVJUOgorICAgICBrZWluZXIKKworU0lFSEUgQVVDSDoKKyAgICAgL3N0ZC9jb3Jwc2UuYworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBXZWQgTWF5IDggMTA6MTk6NTcgMTk5NiBieSBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0luRmlnaHQgYi9kb2MvbGZ1bi9JbkZpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NmM1YmQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9JbkZpZ2h0CkBAIC0wLDAgKzEsMzIgQEAKK0luRmlnaHQoKQorCitGVU5LVElPTjoKKyAgICAgICAgbWl4ZWQgSW5GaWdodCgpCisKK0FSR1VNRU5URToKKyAgICAgICAga2VpbmUKKworQkVTQ0hSRUlCVU5HOgorICAgICAgICBEaWVzZSBGdW5rdGlvbiB3dXJkZSBkYXp1IGdlc2NocmllYmVuLCB1bSBoZXJhdXN6dWZpbmRlbiwKKyAgICAgICAgb2Igc2ljaCBlaW4gUEMvTlBDIGRpcmVrdCBpbSBLYW1wZiBiZWZpbmRldC4gRGF6dSB3aXJkCisgICAgICAgIGRhcyBBcnJheSBtaXQgZGVuIE5hbWVuIGRlciBGZWluZGVuIGRlcyBQQy9OUENzIGR1cmNoIGRpZQorICAgICAgICBGdW5rdGlvbiBlbnZpcm9ubWVudCBnZWZpbHRlcnQgdW5kIHNvIGZlc3RnZXN0ZWxsdCwgb2IKKyAgICAgICAgZGllIFVtZ2VidW5nIGRlciBiZWlkZW4gRmVpbmRlIGdsZWljaCBpc3QuCisKK1JVRUNLR0FCRVdFUlQ6IAorICAgICAgICBBbHMgUnVlY2tnYWJld2VydCBlbnRoYWVsdCBtYW4gZW50d2VkZXIgMCwgd2VubiBkYXMgT2JqZWt0CisgICAgICAgIGltIE1vbWVudCBrZWluZSBGZWluZGUgaGF0IGJ6dy4gZGllIG5pY2h0IGltIHNlbGJlbiBSYXVtCisgICAgICAgIHNpbmQsIG9kZXIgYWJlciBkYXMgRmVpbmRvYmpla3QsIGRhcyBhbHMgZXJzdGVzIGltIEFycmF5CisgICAgICAgIHN0ZWh0IHVuZCBhbndlc2VuZCBpc3QuCisKK0JFSVNQSUVMOgorICAgICAgICBTZWxic3RlcmtsYWVyZW5kIDspCisKK0JFTUVSS1VORzoKKyAgICAgICAgSW5GaWdodCgpIGdpYnQgbGVkaWdsaWNoIGRhcyBFcmdlYm5pcyB2b24gRW5lbXlQcmVzZW50KCkgenVydWVjay4KKworU0lFSEUgQVVDSDoKKyAgICAgICAgRW5lbXlQcmVzZW50KCksIFByZXNlbnRFbmVtaWVzKCkKKyAgICAgICAgL3N0ZC9saXZpbmcvY29tYmF0LmMKKworMjIuMDMuMjAwOSwgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vSW5MaXN0IGIvZG9jL2xmdW4vSW5MaXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkY2Q0MzEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9Jbkxpc3QKQEAgLTAsMCArMSwyOCBAQAorSW5MaXN0KCkKKworRlVOS1RJT046CisgICAgIGludCBJbkxpc3Qob2JqZWN0IHJvb20sIGludCAqcG90aW9ubGlzdCwgaW50ICprbm93bmxpc3QpCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3NlY3VyZS9wb3Rpb25tYXN0ZXIuYworCitBUkdVTUVOVEU6CisgICAgIEltcGxpeml0OiBwcmV2aW91c19vYmplY3QoKSAtIFNwaWVsZXJvYmpla3QsIGRhcyBaVCBiZWtvbW1lbiBzb2xsCisgICAgIG9iamVjdCByb29tICAgICAgICAgICAgICAgICAtIE9iamVrdCwgd2VsY2hlcyBaVCB2ZXJnZWJlbiB3aWxsCisgICAgIGludCogcG90aW9ubGlzdCAgICAgICAgICAgICAtIExpc3RlIGRlciBaVHMgZGVzIFNwaWVsZXJzCisgICAgIGludCoga25vd25saXN0ICAgICAgICAgICAgICAtIExpc3RlIGRlciBiZWthbm50ZW4gWlRzIGRlcyBTcGllbGVycworCitCRVNDSFJFSUJVTkc6CisgICAgIFBydWVmdCwgb2IgJ3Jvb20nIGVpbmVuIFpUIHZlcmdlYmVuIGRhcmYgdW5kIGdpYnQgenVydWVjaywgb2IgZGllCisgICAgIE51bW1lciBkaWVzZXMgWlRzIGluIGRlciAna25vd25saXN0JyBlbnRoYWx0ZW4gaXN0LgorCitSVWVDS0dBQkVXRVJUOgorICAgICAwICBLZWluIGFrdGl2ZXIgWlQgb2RlciBuaWNodCBpbiBMaXN0ZSBlbnRoYWx0ZW4uCisgICAgIDEgIEFrdGl2ZXIgWlQgdW5kIGluIExpc3RlLgorCitTSUVIRSBBVUNIOgorICAgICBTb25zdGlnZXM6IHphdWJlcnRyYWVua2UsIC9yb29tL29yYWtlbC5jCisgICAgIFZlcndhbmR0OiAgRmluZFBvdGlvbigpLCBSZW1vdmVLbm93blBvdGlvbigpLCBBZGRLbm93blBvdGlvbigpCisgICAgIFByb3BzOiAgICAgUF9QT1RJT05ST09NUywgUF9LTk9XTl9QT1RJT05ST09NUworCis2LkZlYiAyMDE2IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9JbmZvcm1BbGNvaG9sRWZmZWN0IGIvZG9jL2xmdW4vSW5mb3JtQWxjb2hvbEVmZmVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmE1Mjk3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vSW5mb3JtQWxjb2hvbEVmZmVjdApAQCAtMCwwICsxLDQzIEBACitJbmZvcm1BbGNvaG9sRWZmZWN0CisKK0ZVTktUSU9OOgorCXZvaWQgSW5mb3JtQWxjb2hvbEVmZmVjdChvYmplY3QgcGwsIGludCBtc2dpZCwgaW50IGFyZWEpCisKK0RFRklOSUVSVCBJTjoKKyAgICAgZWlnZW5lbiBPYmpla3RlbjsgZnVlciAvc3RkL2xpdmluZy9saWZlLmMKKyAKK0FSR1VNRU5URToKKwlwbAorICAgICAgICAgIERhcyBMZWJld2VzZW4sIGRhcyBhbGtvaG9saXNpZXJ0IGlzdC4KKyAgICAgICAgbXNnaWQKKyAgICAgICAgICBGbGFnIGZ1ZXIgZGllIE1lbGR1bmcsIGRpZSBhdXNnZWdlYmVuIHdpcmQuCisgICAgICAgIGFyZWEKKyAgICAgICAgICBBdWZydWYgZXJmb2xndCBpbiBHaWxkZSAoMCkgb2RlciBpbSBFbnZpcm9ubWVudCAoMSkuCisKK0JFU0NIUkVJQlVORzoKKyAgICAgICAgV2VubiBlaW4gTGViZXdlc2VuIGFsa29ob2xpc2llcnQgaXN0LCB3ZXJkZW4gaW4gdW5yZWdlbG1hZXNzaWdlbgorICAgICAgICBBYnN0YWVuZGVuIE1lbGR1bmdlbiBhbiBkaWUgVW1nZWJ1bmcgdW5kIGFucyBMZWJld2VzZW4gYXVzZ2VnZWJlbi4KKyAgICAgICAgR2xlaWNoemVpdGlnIHdpcmQgZGllIEZ1bmt0aW9uIEluZm9ybUFsY29ob2xFZmZlY3QgaW4gZGVyIEdpbGRlCisgICAgICAgIHVuZCBpbSBFbnZpcm9ubWVudCBkZXMgTGViZXdlc2VucyBhdWZnZXJ1ZmVuLgorICAgICAgICAKKyAgICAgICAgRXMgZ2lidCB2aWVyIHZlcnNjaGllZGVuZSBNZWxkdW5nZW4gKGRlZmluaWVydCBpbiAvc3lzL2hlYWx0aC5oKToKKyAgICAgICAgQUxDX0VGRkVDVF9ISUNLICAgICAgKDApIDogIjxIaWNrPiEgT2gsIFRzY2h1bGRpZ3VuZy5cbiIKKyAgICAgICAgQUxDX0VGRkVDVF9SVUVMUFMgICAgKDEpIDogIkR1IHJ1ZWxwc3QuXG4iCisgICAgICAgIEFMQ19FRkZFQ1RfTE9PS0RSVU5LICgyKSA6ICJEdSBmdWVobHN0IERpY2ggYmVub21tZW4uXG4iCisgICAgICAgIEFMQ19FRkZFQ1RfU1RVTUJMRSAgICgzKSA6ICJEdSBzdG9scGVyc3QuXG4iCisgICAgICAgIAorICAgICAgICBXaXJkIGRpZSBGdW5rdGlvbiBpbiBlaW5lbSBHaWxkZW5yYXVtIGltcGxlbWVudGllcnQsIHNvIGthbm4gbWFuCisgICAgICAgIGFuaGFuZCBkZXMgMy4gUGFyYW1ldGVycyB1bnRlcnNjaGVpZGVuLCBvYiBkaWUgR2lsZGUgYWxzIEdpbGRlCisgICAgICAgIG9kZXIgYWxzIFJhdW0gZ2VtZWludCBpc3QgKGRpZSBGdW5rdGlvbiB3aXJkIGplIGVpbm1hbCBhdWZnZXJ1ZmVuKToKKyAgICAgICAgQUxDX0VGRkVDVF9BUkVBX0dVSUxEICgwKSA6IGRlciBBdWZydWYgYmV0cmlmZnQgZGllIEdpbGRlLAorICAgICAgICBBTENfRUZGRUNUX0FSRUFfRU5WICAgKDEpIDogZGVyIEF1ZnJ1ZiBiZXRyaWZmdCBkaWUgVW1nZWJ1bmcuCisKK1JVZUNLR0FCRVdFUlQ6CisJa2VpbmVyCisKK1NJRUhFIEFVQ0g6CisgICAgICAgIFBfQUxDT0hPTCwgL3N5cy9oZWFsdGguaAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBUaHUgTWF5IDIzIDIzOjA4OjAwIDIwMDIgYnkgTXVwZmVsCisKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0luZm9ybURlZmVuZCBiL2RvYy9sZnVuL0luZm9ybURlZmVuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjM2OTIxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vSW5mb3JtRGVmZW5kCkBAIC0wLDAgKzEsNjIgQEAKK0luZm9ybURlZmVuZCgpCisKK0ZVTktUSU9OOgorCXZvaWQgSW5mb3JtRGVmZW5kKG9iamVjdCBlbmVteSk7CisKK0RFRklOSUVSVCBJTjoKKwkvc3RkL2xpdmluZy9jb21iYXQuYworCitBUkdVTUVOVEU6CisJZW5lbXkKKwkgIERlciBGZWluZCwgZGVyIGVpbiB6dSB2ZXJ0ZWlkaWdlbmRlcyBMZWJld2VzZW4gYW5nZWdyaWZmZW4gaGF0LgorCitCRVNDSFJFSUJVTkc6CisJRXMgaXN0IG1vZWdsaWNoLCBkYXNzIE9iamVrdGUgdWViZXIgQW5ncmlmZmUgYXVmIExlYmV3ZXNlbgorCWluZm9ybWllcnQgd2VyZGVuLCBzb2Zlcm4gZGllc2UgT2JqZWt0ZSBiZWkgZGVtIGFuZ2VncmlmZmVuZW4KKwlMZWJld2VzZW4gbWl0dGVscyBBZGREZWZlbmRlcigpIGFuZ2VtZWxkZXQgd3VyZGVuIHVuZCBzaWNoIGRlcgorCXNlbGJlbiBVbWdlYnVuZyBiZWZpbmRlbi4KKwladW1laXN0IHdpcmQgZXMgc2ljaCBiZWkgZGVuIE9iamVrdGVuIG5hdHVlcmxpY2ggZWJlbmZhbGxzIHVtCisJYW5kZXJlIExlYmV3ZXNlbiBoYW5kZWxuLCBkaWUgZGFzIExlYmV3ZXNlbiwgYmVpIGRlbSBzaWUgYW5nZW1lbGRldAorCXNpbmQsIHZlcnRlaWRpZ2VuIHNvbGxlbi4KKwlCZWkgZWluZW0gQW5ncmlmZiBhdWYgZGFzIExlYmV3ZXNlbiB3ZXJkZW4gYWxsZSBPYmpla3RlIHBlciBBdWZydWYKKwl2b24gSW5mb3JtRGVmZW5kKCkgZGFydWViZXIgaW5mb3JtaWVydCwgd29iZWkgZGVyIEFuZ3JlaWZlciBhbHMKKwlQYXJhbWV0ZXIgdWViZXJnZWJlbiB3aXJkLgorCVN0YW5kYXJkbWFlc3NpZyBpc3QgZGllc2UgRnVua3Rpb24gaW4gTGViZXdlc2VuIGJlcmVpdHMgZGVmaW5pZXJ0LAorCXdvYmVpIGRlciBTa2lsbCBTS19JTkZPUk1fREVGRU5ELCBzb2Zlcm4gdm9yaGFuZGVuLCBhdWZnZXJ1ZmVuIHdpcmQuCisKK0JFSVNQSUVMOgorCVNlaHIgYmVsaWVidCBzaW5kIGluIEdpbGRlbiBOUENzLCBkaWUgZGVuIEJlc2Nod29lcmVyIGJlZ2xlaXRlbiB1bmQKKwl2ZXJ0ZWlkaWdlbiwgei5CLiBiZXNjaHdvcmVuZSBEYWVtb25lbjoKKwkgIGluaGVyaXQgInN0ZC9ucGMiOworCSAgaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCSAgb2JqZWN0IG93bmVyOworCSAgdm9pZCBjcmVhdGUoKQorCSAgeyA6OmNyZWF0ZSgpOworCSAgICBTZXRQcm9wKFBfTkFNRSwiRGFlbW9uIik7CisJICAgIC4uLgorCSAgfQorCS8vIG5hY2ggQ2xvbmVuIGRlcyBEYWVtb25zIGZvbGdlbmRlIEZ1bmt0aW9uIG1pdCBCZXNjaHdvZXJlciBhbHMKKwkvLyBQYXJhbWV0ZXIgYXVmcnVmZW4KKwkgIElkZW50aWZ5KG9iamVjdCBjYXN0ZXIpCisJICB7IGlmKCFvYmplY3RwKGNhc3RlcikpCisJICAgICAgY2FsbF9vdXQoIydyZW1vdmUsMCk7CisJICAgIG93bmVyPWNhc3RlcjsKKwkgICAgb3duZXItPkFkZERlZmVuZGVyKHRoaXNfb2JqZWN0KCkpOworCSAgfQorCS8vIGZvbGdlbmRlIEZ1bmt0aW9uIHdpcmQgYXV0b21hdGlzY2ggYXVmZ2VydWZlbiwgd2VubiBkZXIKKwkvLyBCZXNjaHdvZXJlciBhbmdlZ3JpZmZlbiB3aXJkCisJICB2b2lkIEluZm9ybURlZmVuZChvYmplY3QgZW5lbXkpCisJICB7IGlmKCFJc0VuZW15KGVuZW15KSYmZW5lbXkhPW93bmVyKQorCSAgICAgIEtpbGwoZW5lbXkpOworCSAgfQorCVNvbGwgZGVyIERhZW1vbiBzaWNoIGF1Y2ggaW4gZWluIFRlYW0gZWlub3JkbmVuLCBpbiB3ZWxjaGVtIHNpY2ggZGVyCisJQmVzY2h3b2VyZXIgZXZlbnR1ZWxsIGJlZmluZGV0LCBzbyBpc3QgenVzYWV0emxpY2ggQXNzb2NNZW1iZXIoKSBpbgorCWRpZXNlbSBCZXNjaHdvZXJlciBhdWZ6dXJ1ZmVuLCB3b2JlaSBkZXIgRGFlbW9uIGFscyBQYXJhbWV0ZXIKKwl1ZWJlcmdlYmVuIHdpcmQuCisKK1NJRUhFIEFVQ0g6CisJQWRkRGVmZW5kZXIoKSwgUmVtb3ZlRGVmZW5kZXIoKSwgRGVmZW5kT3RoZXIoKSwgS2lsbCgpLCBJc0VuZW15KCksCisJUF9ERUZFTkRFUlMsIC9zdGQvbGl2aW5nL2NvbWJhdC5jLCAvc3lzL25ld19za2lsbHMuaAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBUaHUgSnVsIDI5IDE4OjQ4OjQ1IDE5OTkgYnkgUGF0cnluCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9JbmZvcm1Sb3dDaGFuZ2UgYi9kb2MvbGZ1bi9JbmZvcm1Sb3dDaGFuZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJhYThmYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0luZm9ybVJvd0NoYW5nZQpAQCAtMCwwICsxLDIzIEBACitJbmZvcm1Sb3dDaGFuZ2UoKQorCitGVU5LVElPTjoKKwl2YXJhcmdzIHZvaWQgSW5mb3JtUm93Q2hhbmdlKGludCBmcm9tLCBpbnQgdG8sIG9iamVjdCBjYXN0ZXIpOworCitERUZJTklFUlQgSU46CisJL3N0ZC9saXZpbmcvdGVhbS5jCisKK0FSR1VNRU5URToKKwlmcm9tICAgLSBSZWloZSwgaW4gZGllIGRlciBTcGllbGVyIHZvcmhlciB3YXIuCisJdG8gICAgIC0gUmVpaGUgaW4gZGVyIGRlciBTcGllbGVyIGpldHp0IGlzdC4KKwljYXN0ZXIgLSBEZXIgU3BpZWxlciwgZmFsbHMgZGllIEZ1bmt0aW9uIGluIGRlciBHaWxkZSBhdWZnZXJ1ZmVuIHdpcmQuCisgICAgICAgIAorQkVTQ0hSRUlCVU5HOgorCURpZXNlIEZ1bmt0aW9uIHdpcmQgaW0gU3BpZWxlciB1bmQgaW4gc2VpbmVyIEdpbGRlIGF1ZmdlcnVmZW4sCisJZmFsbHMgc2ljaCBkaWUgYWt0dWVsbGUgS2FtcGZyZWloZSBpbiBkZXIgVGVhbWF1ZnN0ZWxsdW5nCisJYWVuZGVydC4KKworUlVFQ0tHQUJFV0VSVDoKKwlLZWluZXIuCisKK1NJRUhFIEFVQ0g6CisJdGVhbXMKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0luZm9ybVVud2VhciBiL2RvYy9sZnVuL0luZm9ybVVud2VhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDcxMDI4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vSW5mb3JtVW53ZWFyCkBAIC0wLDAgKzEsMjkgQEAKK0luZm9ybVVud2VhcgorCitGVU5LVElPTjoKKwlwcm90ZWN0ZWQgdm9pZCBJbmZvcm1VbndlYXIob2JqZWN0IHBsLCBpbnQgc2lsZW50LCBpbnQgYWxsKQorCitERUZJTklFUlQgSU46CisgICAgICAgIC9zdGQvY2xvdGhpbmcvd2Vhci5jCisKK0FSR1VNRU5URToKKwlwbAorICAgICAgICAgIERhcyBMZWJld2VzZW4sIGRhcyBkaWUgUnVlc3R1bmcgYXVzZ2V6b2dlbiBoYXQuCisgICAgICAgIHNpbGVudAorICAgICAgICAgIEZsYWcsIG9iIE1lbGR1bmdlbiB1bnRlcmRydWNrdCB3ZXJkZW4gc29sbGVuLgorICAgICAgICBhbGwKKyAgICAgICAgICBGbGFnLCBvYiBkaWUgUnVlc3R1bmcgbWl0ICJ6aWVoZSBhbGxlcyBhdXMiLworICAgICAgICAgICJ6aWVoZSBhbGxlIHJ1ZXN0dW5nZW4gYXVzIiBhdXNnZXpvZ2VuIHd1cmRlLgorCitCRVNDSFJFSUJVTkc6CisgICAgICAgIERpZXNlIEZ1bmt0aW9uIHdpcmQgYXVmZ2VydWZlbiwgd2VubiBkaWUgUnVlc3R1bmcgZXJmb2xncmVpY2gKKyAgICAgICAgYXVzZ2V6b2dlbiB3dXJkZS4KKworUlVlQ0tHQUJFV0VSVDoKKwlrZWluZXIKKworU0lFSEUgQVVDSDoKKyAgICAgICAgSW5mb3JtVW53aWVsZCgpLCBJbmZvcm1XaWVsZCgpLCBJbmZvcm1XZWFyKCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMDYuMTAuMjAwNywgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vSW5mb3JtVW53aWVsZCBiL2RvYy9sZnVuL0luZm9ybVVud2llbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYyZDliYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0luZm9ybVVud2llbGQKQEAgLTAsMCArMSwyNiBAQAorSW5mb3JtVW53aWVsZAorCitGVU5LVElPTjoKKwlwcm90ZWN0ZWQgdm9pZCBJbmZvcm1VbndpZWxkKG9iamVjdCBwbCwgaW50IHNpbGVudCkKKworREVGSU5JRVJUIElOOgorCS9zdGQvd2VhcG9uL2NvbWJhdC5jCisKK0FSR1VNRU5URToKKwlwbAorICAgICAgICAgIERhcyBMZWJld2VzZW4sIGRhcyBkaWUgV2FmZmUgZ2V6dWVja3QgaGF0dGUuCisgICAgICAgIHNpbGVudAorICAgICAgICAgIEZsYWcsIG9iIE1lbGR1bmdlbiB1bnRlcmRydWNrdCB3ZXJkZW4gc29sbGVuLgorCitCRVNDSFJFSUJVTkc6CisgICAgICAgIERpZXNlIEZ1bmt0aW9uIHdpcmQgYXVmZ2VydWZlbiwgd2VubiBkaWUgV2FmZmUgZXJmb2xncmVpY2gKKyAgICAgICAgd2VnZ2VzdGVja3Qgd3VyZGUuCisKK1JVZUNLR0FCRVdFUlQ6CisJa2VpbmVyCisKK1NJRUhFIEFVQ0g6CisgICAgICAgIEluZm9ybVdpZWxkKCksIEluZm9ybVdlYXIoKSwgSW5mb3JtVW53ZWFyKCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMDYuMTAuMjAwNywgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vSW5mb3JtV2VhciBiL2RvYy9sZnVuL0luZm9ybVdlYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM3YzliNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0luZm9ybVdlYXIKQEAgLTAsMCArMSwyOSBAQAorSW5mb3JtV2VhcgorCitGVU5LVElPTjoKKwlwcm90ZWN0ZWQgdm9pZCBJbmZvcm1XZWFyKG9iamVjdCBwbCwgaW50IHNpbGVudCwgaW50IGFsbCkKKworREVGSU5JRVJUIElOOgorICAgICAgICAvc3RkL2Nsb3RoaW5nL3dlYXIuYworCitBUkdVTUVOVEU6CisJcGwKKyAgICAgICAgICBEYXMgTGViZXdlc2VuLCBkYXMgZGllIFJ1ZXN0dW5nIGFuZ2V6b2dlbiBoYXQuCisgICAgICAgIHNpbGVudAorICAgICAgICAgIEZsYWcsIG9iIE1lbGR1bmdlbiB1bnRlcmRydWNrdCB3ZXJkZW4gc29sbGVuLgorICAgICAgICBhbGwKKyAgICAgICAgICBGbGFnLCBvYiBkaWUgUnVlc3R1bmcgbWl0ICJ0cmFnZSBhbGxlcyIvInRyYWdlIGFsbGUgcnVlc3R1bmdlbiIKKyAgICAgICAgICBhbmdlem9nZW4gd3VyZGUuCisKK0JFU0NIUkVJQlVORzoKKyAgICAgICAgRGllc2UgRnVua3Rpb24gd2lyZCBhdWZnZXJ1ZmVuLCB3ZW5uIGRpZSBSdWVzdHVuZyBlcmZvbGdyZWljaAorICAgICAgICBhbmdlem9nZW4gd3VyZGUuCisKK1JVZUNLR0FCRVdFUlQ6CisJa2VpbmVyCisKK1NJRUhFIEFVQ0g6CisgICAgICAgIEluZm9ybVVud2llbGQoKSwgSW5mb3JtV2llbGQoKSwgSW5mb3JtVW53ZWFyKCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMDYuMTAuMjAwNywgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vSW5mb3JtV2llbGQgYi9kb2MvbGZ1bi9JbmZvcm1XaWVsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2M2Yjk4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vSW5mb3JtV2llbGQKQEAgLTAsMCArMSwyNiBAQAorSW5mb3JtV2llbGQKKworRlVOS1RJT046CisJcHJvdGVjdGVkIHZvaWQgSW5mb3JtV2llbGQob2JqZWN0IHBsLCBpbnQgc2lsZW50KQorCitERUZJTklFUlQgSU46CisJL3N0ZC93ZWFwb24vY29tYmF0LmMKKworQVJHVU1FTlRFOgorCXBsCisgICAgICAgICAgRGFzIExlYmV3ZXNlbiwgZGFzIGRpZSBXYWZmZSBnZXp1ZWNrdCBoYXQuCisgICAgICAgIHNpbGVudAorICAgICAgICAgIEZsYWcsIG9iIE1lbGR1bmdlbiB1bnRlcmRydWNrdCB3ZXJkZW4gc29sbGVuLgorCitCRVNDSFJFSUJVTkc6CisgICAgICAgIERpZXNlIEZ1bmt0aW9uIHdpcmQgYXVmZ2VydWZlbiwgd2VubiBkaWUgV2FmZmUgZXJmb2xncmVpY2gKKyAgICAgICAgZ2V6dWVja3Qgd3VyZGUuCisKK1JVZUNLR0FCRVdFUlQ6CisJa2VpbmVyCisKK1NJRUhFIEFVQ0g6CisgICAgICAgIEluZm9ybVVud2llbGQoKSwgSW5mb3JtV2VhcigpLCBJbmZvcm1VbndlYXIoKQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiswNi4xMC4yMDA3LCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9JbnNlcnRFbmVteSBiL2RvYy9sZnVuL0luc2VydEVuZW15Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZDFkN2QKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9JbnNlcnRFbmVteQpAQCAtMCwwICsxLDI4IEBACitnZWZ1bmRlbiA6IGxmdW4vSW5zZXJ0RW5lbXkKKworRlVOS1RJT046CisgICAgICAgIGludCBJbnNlcnRFbmVteShvYmplY3QgZW5lbXkpCisgICAgICAgIAorREVGSU5JRVJUIElOOgorICAgICAgICAvc3RkL2xpdmluZy9jb21iYXQuYworICAgICAgICAKK0FSR1VNRU5URToKKyAgICAgICAgZW5lbXk6IERhcyBMZWJld2VzZW4sIGRhcyBhbmdlZ3JpZmZlbiB3ZXJkZW4gc29sbC4KKyAgICAgICAgCitCRVNDSFJFSUJVTkc6CisgICAgICAgIE5hY2ggQXVmcnVmIGRlciBGdW5rdGlvbiB3aXJkIGRhcyBXZXNlbiBpbiBkaWUgTGlzdGUgZGVyIEZlaW5kZQorICAgICAgICBhdWZnZW5vbW1lbi4KKyAgICAgICAgSW4gamVkZW0gaGVhcnRfYmVhdCgpIHdpcmQgZGFubiBlaW4gYW53ZXNlbmRlciBGZWluZAorICAgICAgICBhbmdlZ3JpZmZlbi4KKyAgICAgICAgCitSVUVDS0dBQkVXRVJUOgorICAgICAgICAwLCBmYWxscyBkZXIgRmVpbmQgbmljaHQgZXhpc3RpZXJ0LCBrZWluIExlYmV3ZXNlbiBpc3QsIGVpbiBHZWlzdCBpc3QsIAorICAgICAgICAgICBvZGVyIGltIEdlZ25lciBQX05PX0FUVEFDSyBnZXNldHp0IGlzdCwgb2RlciBzY2hvbiBhbmdlZ2VncmlmZmVuIAorICAgICAgICAgICB3dXJkZQorICAgICAgICAxICBzb25zdAorICAgICAgICAKK1NJRUhFIEFVQ0g6CisgICAgICAgIEtpbGwsIElzRW5lbXksIFN0b3BIdW50Rm9yLCBQX05PX0FUVEFDSworCitMRVRaVEUgQUVOREVSVU5HOgorMjYuMDguMjAxMCwgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vSW5zZXJ0RW5lbXlUZWFtIGIvZG9jL2xmdW4vSW5zZXJ0RW5lbXlUZWFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YWRlNjMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9JbnNlcnRFbmVteVRlYW0KQEAgLTAsMCArMSw0NiBAQAorCitJbnNlcnRFbmVteVRlYW0oKQorCisKK0ZVTktUSU9OOgorICAgICAgICB2YXJhcmdzIHZvaWQgSW5zZXJ0RW5lbXlUZWFtKG1peGVkIGVucywgaW50IHJlaykKKworREVGSU5JRVJUIElOOgorICAgICAgICAvc3RkL2xpdmluZy90ZWFtLmMKKworQVJHVU1FTlRFOgorICAgICAgICBlbnMgICAgIG9iamVjdCBGZWluZCBvZGVyIG9iamVjdCAqRmVpbmRlCisgICAgICAgIHJlayAgICAgV3VyZGUgdm9uIEluc2VydEVuZW15VGVhbSBhdWZnZXJ1ZmVuCisKK0JFU0NIUkVJQlVORzoKKyAgICAgICAgQWxsZSBUZWFtbWl0Z2xpZWRlciBkZXMgRmVpbmRlcyBiencuIGRpZSBhbmdlZ2ViZW5lbiBGZWluZGUgKGFiZXIKKyAgICAgICAgbmljaHQgZGVyZW4gVGVhbW1pdGdsaWVkZXIpIHdlcmRlbiB6dSBGZWluZGVuCisgICAgICAgICBhKSBkZXMgU3BpZWxlcnMgdW5kIGFsbGVyIFRlYW1taXRnbGllZGVyLCBmYWxscyByZWs9PTAKKyAgICAgICAgIGIpIGRlcyBTcGllbGVycywgZmFsbHMgcmVrIT0wCisKK1JVRUNLR0FCRVdFUlQ6CisgICAgICAgIGtlaW5lcgorCitCRU1FUktVTkdFTjoKKyAgICAgICAgMS4gTnVyIHdlbm4gR2VnbmVyIHVuZCBUZWFtbWl0Z2xpZWQgaW0gZ2xlaWNoZW4gUmF1bSBzdGVoZW4gKGFiZXIKKyAgICAgICAgICAgbmljaHQgbm90d2VuZGlnZXJ3ZWlzZSBpbSBnbGVpY2hlbiBSYXVtIHdpZSBkZXIgU3BpZWxlcikgd2VyZGVuCisgICAgICAgICAgIHNpZSB6dSBGZWluZGVuLgorICAgICAgICAyLiBGYWxscyBUZWFtbWl0Z2xpZWQgdW5kIEdlZ25lciBiZWlkZXMgU3BpZWxlciBzaW5kLCB3ZXJkZW4gc2llCisgICAgICAgICAgIG5pY2h0IHp1IEZlaW5kZW4gZ2VtYWNodC4KKyAgICAgICAgMy4gSXN0IGRlciBHZWduZXIgaW0gZWlnZW5lbiBUZWFtLCBzbyB3aXJkIG5pY2h0cyBnZW1hY2h0LgorCitTSUVIRSBBVUNIOgorICAgICAgICBVZWJlcnNpY2h0OiB0ZWFta2FtcGYKKyAgICAgICAgUHJvcGVydGllczogUF9URUFNLCBQX0FTU09DX01FTUJFUlMsIFBfVEVBTV9BVFRBQ0tfQ01ELAorICAgICAgICAgICAgICAgICAgICBQX1RFQU1fQVVUT0ZPTExPVywgUF9URUFNX0NPTE9SUywgUF9URUFNX0xFQURFUiwKKyAgICAgICAgICAgICAgICAgICAgUF9URUFNX05FV01FTUJFUiwgUF9URUFNX1dBTlRFRF9ST1csIFBfVEVBTV9XSU1QWV9ST1cKKyAgICAgICAgQmV3ZWd1bmc6ICAgSXNUZWFtTW92ZSwgVGVhbUZsZWUKKyAgICAgICAgTWl0Z2xpZWRlcjogSXNUZWFtTGVhZGVyLCBUZWFtTWVtYmVycworICAgICAgICBLYW1wZjogICAgICBBc3NvY01lbWJlciwgRGVBc3NvY01lbWJlciwgU2VsZWN0TmVhckVuZW15LAorICAgICAgICAgICAgICAgICAgICBTZWxlY3RGYXJFbmVteQorICAgICAgICBQb3NpdGlvbmVuOiBQcmVzZW50UG9zaXRpb24sIFByZXNlbnRSb3dzLCBQcmVzZW50RW5lbXlSb3dzLAorICAgICAgICAgICAgICAgICAgICBQcmVzZW50VGVhbVBvc2l0aW9uLCBTd2FwUm93cworICAgICAgICBTb25zdGlnZXM6ICBUZWFtUHJlZml4LCB0ZWFta2FtcGZfaW50ZXJuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IDE2LTA4LTIwMTAsIEdhYnlsb24KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0luc2VydFNlbnNpdGl2ZU9iamVjdCBiL2RvYy9sZnVuL0luc2VydFNlbnNpdGl2ZU9iamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODljZWY4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vSW5zZXJ0U2Vuc2l0aXZlT2JqZWN0CkBAIC0wLDAgKzEsNDggQEAKK0luc2VydFNlbnNpdGl2ZU9iamVjdCgpCitGVU5LVElPTjoKKyAgICAgdm9pZCBJbnNlcnRTZW5zaXRpdmVPYmplY3Qob2JqZWN0IG9iLCBtaXhlZCAqYXJnKQorCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvY29udGFpbmVyL2ludmVudG9yeS5jCisgICAgIGdlbmVyYWxpemVzIC9zdGQvbGl2aW5nL2ludmVudG9yeS5jCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRnVlZ3QgIm9iIiBpbiBkaWUgQmVuYWNocmljaHRpZ3VuZ3NsaXN0ZW4gZGVzIENvbnRhaW5lcnMgZWluLgorICAgICBXaXJkIHZvbiB0aGluZy9tb3ZpbmcuYyBpbSBaaWVsLUVudmlyb25tZW50IGdlcnVmZW4sIHdlbm4KKyAgICAgUF9TRU5TSVRJVkUgZ2VzZXR6dCBpc3QuCisKK0JFTUVSS1VOR0VOOgorICAgICBTZXR6dCBtYW4gUF9TRU5TSVRJVkUgbmljaHQgYWxzIERlZmF1bHQgc29uZGVybiBzaXR1YXRpb25zYWJoYWVuZ2lnLAorICAgICBkYW5uIG11c3MgbWFuIGF1Y2ggSW5zZXJ0U2Vuc2l0aXZlT2JqZWN0KCkgaW0gRW52aXJvbm1lbnQKKyAgICAgYXVjaCBzZWxic3QgcnVmZW4hCisKK0JFSVNQSUVMOgorICAgICAvLyBGYWNrZWwgKGluaGVyaXRpbmcgbGlnaHRzb3VyY2UpCisgICAgIC8vIHdlbm4gYW5nZXp1ZW5kZXQsIGFlbmRlcnQgZXMgZGllIEVpZ2Vuc2NoYWZ0ZW4gdW5kIHdpcmQgenVtCisgICAgIC8vIGFrdGl2ZW4gT2JqZWt0IC0gZGFzIG11c3MgbWFuIGRlbSBlbnZpcm9ubWVudCgpIG1pdHRlaWxlbgorICAgICBzdGF0aWMgaW50IGxpZ2h0KHN0cmluZyBzdHIpIHsKKyAgICAgIGludCBpOworICAgICAgaT06OmxpZ2h0KHN0cik7CisgICAgICBpZihpICYmIFF1ZXJ5UHJvcChQX0xJR0hUKT4wKSB7CisgICAgICAgU2V0UHJvcChQX1NFTlNJVElWRSwKKyAgICAgICAgKHsoe1NFTlNJVElWRV9JTlZFTlRPUllfVFJJR0dFUixEVF9GSVJFLDEyMH0pfSkpOworICAgICAgIGlmKGVudmlyb25tZW50KCkpCisgICAgICAgIGVudmlyb25tZW50KCktPkluc2VydFNlbnNpdGl2ZU9iamVjdCh0aGlzX29iamVjdCgpLAorCQkJCQkgICAgIFF1ZXJ5UHJvcChQX1NFTlNJVElWRSkpOworICAgICAgfQorICAgICAgcmV0dXJuIGk7CisgICAgIH0KKworICAgICAtIGZhbGxzIGVpbiBlbXBmaW5kbGljaGVzIE9iamVrdCBpbSBlbnZpcm9ubWVudCgpIGlzdCwgZGFubiB3aXJkCisgICAgICAgaW4gZGllc2VtIG51biBldmVudHVlbGwgKFRyZXNob2xkKSB0cmlnZ2VyX3NlbnNpdGl2ZV9pbnYoKQorICAgICAgIGdlcnVmZW4KKworU0lFSEUgQVVDSDoKKyAgICAgUF9TRU5TSVRJVkUKKyAgICAgUmVtb3ZlU2Vuc2l0aXZlT2JqZWN0CisgICAgIGluc2VydF9zZW5zaXRpdmVfaW52X3RyaWdnZXIsIGluc2VydF9zZW5zaXRpdmVfaW52CisgICAgIFBfU0VOU0lUSVZFX0FUVEFDSywgUF9TRU5TSVRJVkVfSU5WRU5UT1JZLCBQX1NFTlNJVElWRV9JTlZFTlRPUllfVFJJR0dFUgorICAgICBDaGVja1NlbnNpdGl2ZUF0dGFjaworCisyNS5BcHIuMjAwMSwgR2xvaW5zb25ATUcKKwpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vSW50ZXJuYWxNb2RpZnlBdHRhY2sgYi9kb2MvbGZ1bi9JbnRlcm5hbE1vZGlmeUF0dGFjawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWMyZDE5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vSW50ZXJuYWxNb2RpZnlBdHRhY2sKQEAgLTAsMCArMSwzNyBAQAorSW50ZXJuYWxNb2RpZnlBdHRhY2soTCkKKworRlVOS1RJT046CisgICAgIHByb3RlY3RlZCB2b2lkIEludGVybmFsTW9kaWZ5QXR0YWNrKG1hcHBpbmcgYWluZm8pCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC9saXZpbmcvY29tYmF0CisKK0FSR1VNRU5URToKKyAgICAgbWFwcGluZyBhaW5mbwkJV2VydGUgYXVzIGRlciBBdHRhY2sKKworQkVTQ0hSRUlCVU5HOgorICAgICBEaWVudCBkYXp1IG5vY2ggQWVuZGVydW5nZW4gYW0gVmVyaGFsdGVuIGRlciBBdHRhY2soKSB2b3JuZWhtZW4genUKKyAgICAga29lbm5lbi4gRGllIFBhcmFtZXRlciB3ZXJkZW4gYWxsZSBwZXIgUmVmZXJlbnogdWViZXJnZWJlbiwgQWVuZGVydW5nZW4KKyAgICAgd2lya2VuIGFsc28gZGlyZWt0IGluIGRlciBBdHRhY2soKSEKKyAgICAgRWluZmFjaCB1ZWJlcnNjaHJlaWJlbiAoYWJlciA6OkludGVybmFsTW9kaWZ5QXR0YWNrKCZhaW5mbykgbmljaHQKKyAgICAgdmVyZ2Vzc2VuIQorCisgICAgIEF1ZmJhdSB2b24gJ2FpbmZvJzoKKyAgICAgKFsgU0lfRU5FTVkgOiAgICAgICAgICAgIG9iamVjdCBBbmdyZWlmZXIsCQkJKC0+IERlZmVuZCkKKyAgICAgICAgU0lfU1BFTEwgOiAgICAgICAgICAgMC8xL2FycmF5IFNwZWxscGFyYW1ldGVyLAkJKC0+IERlZmVuZCkKKyAgICAgICAgUF9XRUFQT04gOiAgICAgICAgICAgLSBvZGVyIFdhZmZlLAorICAgICAgICBTSV9TS0lMTERBTUFHRV9NU0c6ICBzdHJpbmcgQW5ncmlmZnNtZWxkdW5nc2VuZGUgYW4gUmF1bSwKKyAgICAgICAgU0lfU0tJTExEQU1BR0VfTVNHMjogc3RyaW5nIEFuZ3JpZmZzbWVsZHVuZ3NlbmRlIGFuIEthZW1wZmVuZGUsCisgICAgICAgIFNJX1NLSUxMREFNQUdFOiAgICAgIGludCBTY2hhZGVuIGluIFplaG50ZWwgSFAgKFNraWxscyBzY2hvbiBkcmluKQorCQkJCQkJCQkoLT4gRGVmZW5kKSwKKyAgICAgICAgU0lfU0tJTExEQU1BR0VfVFlQRTogc3RyaW5nL3N0cmluZyogU2NoYWRlbnN0eXBlbiwJKC0+IERlZmVuZCkKKyAgICAgICAgUF9XRUFQT05fVFlQRTogICAgICAgc3RyaW5nIFdhZmZlbnR5cCAoY29tYmF0LmgpLAorICAgICAgICBQX1dDOgkJICAgICAtIG9kZXIgaW50IFdDIGRlciBXYWZmZS9IYW5kLAorICAgICAgICBQX05SX0hBTkRTOgkgICAgIC0gb2RlciBpbnQgSGFuZHMgZGVyIFdhZmZlL0hhbmQsCisgICAgIF0pOworCitTSUVIRSBBVUNIOgorICAgICBJbnRlcm5hbE1vZGlmeURlZmVuZChMKQorICAgICBBdHRhY2soTCkKKworMjguMDMuMjAwOCwgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vSW50ZXJuYWxNb2RpZnlEZWZlbmQgYi9kb2MvbGZ1bi9JbnRlcm5hbE1vZGlmeURlZmVuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2YwZDM5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vSW50ZXJuYWxNb2RpZnlEZWZlbmQKQEAgLTAsMCArMSwyOSBAQAorSW50ZXJuYWxNb2RpZnlEZWZlbmQoTCkKKworRlVOS1RJT046CisgICAgIHByb3RlY3RlZCB2b2lkIEludGVybmFsTW9kaWZ5RGVmZW5kKGludCBkYW0sIG1peGVkIGR0LCBtaXhlZCBzcGVsbCwKKwkJCQkgICAgICBvYmplY3QgZW5lbXkpCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC9saXZpbmcvY29tYmF0CisKK0FSR1VNRU5URToKKyAgICAgaW50IGRhbSAgICAgICAgICAgICBTdGFlcmtlIGRlcyBhYnp1d2VocmVuZGVuIEFuZ3JpZmZzIChpbiBIUC8xMCkKKyAgICAgc3RyaW5nL3N0cmluZyogZHQgICBBcnQoZW4pIGRlcyBTY2hhZGVucywgZGVyIGFuZ2VyaWNodGV0IHdlcmRlbiBzb2xsCisgICAgIGludC9tYXBwaW5nIHNwZWxsICAgMCBmdWVyIG5vcm1hbGUgQW5ncmlmZmUgKGtlaW5lIFphdWJlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAxIGZ1ZXIgWmF1YmVyIChTdGFuZGFyZHJ1ZXN0dW5nZW4gaWdub3JpZXJlbikKKyAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nIGZ1ZXIgbWVociBJbmZvcm1hdGlvbmVuCisgICAgIG9iamVjdCBlbmVteSAgICAgICAgZGVyIEZlaW5kL1NjaGFkZW52ZXJ1cnNhY2hlcgorCitCRVNDSFJFSUJVTkc6CisgICAgIERpZW50IGRhenUgbm9jaCBBZW5kZXJ1bmdlbiBhbSBWZXJoYWx0ZW4gZGVyIERlZmVuZCgpIHZvcm5laG1lbiB6dQorICAgICBrb2VubmVuLiBEaWUgUGFyYW1ldGVyIHdlcmRlbiBhbGxlIHBlciBSZWZlcmVueiB1ZWJlcmdlYmVuLCBBZW5kZXJ1bmdlbgorICAgICB3aXJrZW4gYWxzbyBkaXJla3QgaW4gZGVyIERlZmVuZCgpIQorICAgICBFaW5mYWNoIHVlYmVyc2NocmVpYmVuLCBhYmVyIDo6SW50ZXJuYWxNb2RpZnlEZWZlbmQoJi4uLiwgJi4uLi4pIG5pY2h0CisgICAgIHZlcmdlc3NlbiEKKworU0lFSEUgQVVDSDoKKyAgICAgSW50ZXJuYWxNb2RpZnlBdHRhY2soTCkKKyAgICAgRGVmZW5kKEwpCisKKzI4LjAzLjIwMDgsIFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0lzRW5lbXkgYi9kb2MvbGZ1bi9Jc0VuZW15Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MDZjZDUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9Jc0VuZW15CkBAIC0wLDAgKzEsMzEgQEAKK0lzRW5lbXkoKQorCitGVU5LVElPTjoKKwlpbnQgSXNFbmVteShvYmplY3Qgd2VyKTsKKworREVGSU5JRVJUIElOOgorCS9zdGQvbGl2aW5nL2NvbWJhdC5jCisKK0FSR1VNRU5URToKKwl3ZXIKKwkgIERhcyBPYmpla3QsIHdlbGNoZXMgZGFyYXVmIHVlYmVycHJ1ZWZ0IHdlcmRlbiBzb2xsLCBvYiBlcworCSAgZGVyemVpdCBhbHMgR2VnbmVyIGJla2FubnQgaXN0LgorCitSVWVDS0dBQkVXRVJUOgorCUZsYWc6IDEgYmVpIEZlaW5kc2NoYWZ0LCAwIHNvbnN0CisKK0JFU0NIUkVJQlVORzoKKwlNaXQgZGllc2VyIEZ1bmt0aW9uIGthbm4gbWFuIHVlYmVycHJ1ZWZlbiwgb2IgZGFzIE9iamVrdCA8d2VyPiwgYWxzbworCWltIE5vcm1hbGZhbGwgZWluIExlYmV3ZXNlbiwgZGVyemVpdCBhbHMgR2VnbmVyIGVya2FubnQgd2lyZC4gTmFjaAorCWVpbmVyIGdld2lzc2VuIFplaXQgbGFldWZ0IGRpZSBGZWluZHNjaGFmdCBhdXRvbWF0aXNjaCBhdXMsIHNvZGFzcworCW1hbiBzaWNoIG5pY2h0IGRhcmF1ZiB2ZXJsYXNzZW4sIGRhc3MgZWluIEdlZ25lciBhdWNoIHp1a3VlbmZ0aWcgYWxzCisJc29sY2hpZ2VyIGVya2FubnQgd2lyZC4gKERpZXNlIFplaXQgYmV0cmFlZ3Qgbm9ybWFsIDMwMCBTZWt1bmRlbi4pCisJU29sY2ggZWluZSBGZWluZHNjaGFmdCBrYW5uIGltIHVlYnJpZ2VuIGF1Y2ggZWluc2VpdGlnIHNlaW4hIE1laHIKKwlkYXp1IGZpbmRldCBtYW4gaW4gZGVyIERva3VtZW50YXRpb24genUgU3RvcEh1bnRGb3IoKSwgZWluZXIKKwlGdW5rdGlvbiwgZGllIEZyaWVkZW4gendpc2NoZW4gR2VnbmVybiBzdGlmdGVuIHNvbGwuCisKK1NJRUhFIEFVQ0g6CisJU2VsZWN0RW5lbXkoKSwgUXVlcnlFbmVtaWVzKCksIFN0b3BIdW50Rm9yKCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogV2VkIE1heSAyNiAxNjo0Nzo1MSAxOTk5IGJ5IFBhdHJ5bgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vSXNFcXVhbCBiL2RvYy9sZnVuL0lzRXF1YWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA2NjYxZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0lzRXF1YWwKQEAgLTAsMCArMSwzOSBAQAorSXNFcXVhbCgpCisKK0ZVTktUSU9OCisgICAgaW50IElzRXF1YWwob2JqZWN0IG9iKQorCitERUZJTklFUlQgSU46CisgICAgL3N0ZC91bml0LmMKKworQVJHVU1FTlRFOgorICAgIG9iICAgICAgRGFzIE9iamVrdCBkYXMgZ2VwcnVlZnQgd2VyZGVuIHNvbGwuCisKK0JFU0NIUkVJQlVORzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBEaWVzZSBGdW5rdGlvbiBwcnVlZnQgb2IgendlaSBPYmpla3RlIHZvbSBnbGVpY2hlbiBUeXAgc2luZCwgYWxzbyBvYgorICAgIHouQi4gb2IgdW5kIHRoaXNfb2JqZWN0KCkgYmVpZGVzIE11ZW56ZW4gc2luZCBvZGVyIGJlaWRlcyBFZGVsc3RlaW5lLgorICAgIEJlaSBlaW5lbSBFcmdlYm5pcyAhPSAwIGZhc3N0IHVuaXQuYyBkaWVzZSB6d2VpIE9iamVrdGUgYXV0b21hdGlzY2gKKyAgICB6dXNhbW1lbiwgd2VubiBvYi0+SXNFcXVhbCh0aGlzX29iamVjdCgpKSBhdWNoIGVpbmVuIFdlcnQgIT0gMCBlcmdpYnQuCisgICAgSGllcmJlaSB3aXJkIGRhcyBJc0VxdWFsKCkgdm9uIGJlaWRlbiBiZXRlaWxpZ3RlbiBPYmpla3RlbiBnZXJ1ZmVuIHVuZCBzaWUKKyAgICBtdWVzc2VuIHVlYmVyZWluc3RpbW1lbiwgZGFzcyBzaWUgZWlnZW50bGljaCBkYXMgZ2xlaWNoZSBPYmpla3Qgc2luZC4KKyAgICBTZWxic3R2ZXJzdGFlbmRsaWNoIGlzdCBkaWVzZSBGdW5rdGlvbiBudXIgaW0gRmFsbGUgdm9uIFVuaXRvYmpla3RlbgorICAgIHNpbm52b2xsLgorCitSVWVDS0dBQkVXRVJUOgorICAgIDAgLSB0aGlzX29iamVjdCgpIGlzdCBuaWNodCB2b20gc2VsYmVuIFR5cCB3aWUgb2IKKyAgICAxIC0gdGhpc19vYmplY3QoKSBpc3Qgdm9tIGdsZWljaGVuIFR5cCB3aWUgb2IKKworQkVJU1BJRUxFOgorICAgIG8gRWluIFVuaXRvYmpla3QgZGFzIHZlcnNjaGllZGVuZSBCZXNjaHJlaWJ1bmdlbiBoYWJlbiBrYW5uLi4uCisKKyAgICAgICBpbnQgSXNFcXVhbChvYmplY3Qgb2IpCisgICAgICAgeworICAgICAgICAgIGlmICghKGludCk6OklzRXF1YWwob2IpKSByZXR1cm4gMDsKKyAgICAgICAgICByZXR1cm4gKFF1ZXJ5UHJvcChQX1NIT1JUKT09b2ItPlF1ZXJ5UHJvcChQX1NIT1JUKSk7CisgICAgICAgfQorCitTSUVIRSBBVUNIOgorICAgIC9zdGQvdW5pdC5jCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzI1LjAxLjIwMTUsIFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vSXNUZWFtTGVhZGVyIGIvZG9jL2xmdW4vSXNUZWFtTGVhZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYTAwOGYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9Jc1RlYW1MZWFkZXIKQEAgLTAsMCArMSw0OCBAQAorCitJc1RlYW1MZWFkZXIoKQorCisKK0ZVTktUSU9OOgorICAgICAgICBvYmplY3QgSXNUZWFtTGVhZGVyKCkKKworREVGSU5JRVJUIElOOgorICAgICAgICAvc3RkL2xpdmluZy90ZWFtLmMKKworQVJHVU1FTlRFOgorICAgICAgICBrZWluZQorCitCRVNDSFJFSUJVTkc6CisgICAgICAgIFRlc3RldCwgb2IgZGVyIFNwaWVsZXIgZWluIFRlYW1sZWl0ZXIgaXN0LgorCitSVUVDS0dBQkVXRVJUOgorICAgICAgICBGYWxscyBkZXIgU3BpZWxlciBUZWFtbGVpdGVyIGlzdCwgd2lyZCBkYXMgVGVhbW9iamVrdCB6dXJ1ZWNrZ2VnZWJlbiwKKyAgICAgICAgc29uc3QgMC4KKworQkVJU1BJRUw6CisgICAgICAgIHN0cmluZyBsZWFkZXJfdGVzdChvYmplY3QgcGwpCisgICAgICAgIHsKKyAgICAgICAgIC4uLgorCisgICAgICAgICBpZiAoIG9iamVjdHAocGwtPklzVGVhbUxlYWRlcigpKSApCisgICAgICAgICAgcmV0dXJuICJBbHMgTGVpdGVyIGVpbmVzIFRlYW1zIGhhc3QgRHUgZ3Jvc3NlIFZlcmFudHdvcnR1bmcgenUgIgorICAgICAgICAgICAgInRyYWdlbiEiOworICAgICAgICAgZWxzZQorICAgICAgICAgIHJldHVybiAiV2VubiBEdSBtYWwgTGVpdGVyIGVpbmVzIFRlYW1zIHNlaW4gbW9lY2h0ZXMsIHNvbGx0ZXN0ICIKKyAgICAgICAgICAgICJEdSBEaXIgdm9yaGVyIGRlciBWZXJhbnR3b3J0dW5nIGJld3Vzc3Qgd2VyZGVuISI7CisgICAgICAgIH0KKworU0lFSEUgQVVDSDoKKyAgICAgICAgVWViZXJzaWNodDogdGVhbWthbXBmCisgICAgICAgIFByb3BlcnRpZXM6IFBfVEVBTSwgUF9BU1NPQ19NRU1CRVJTLCBQX1RFQU1fQVRUQUNLX0NNRCwKKyAgICAgICAgICAgICAgICAgICAgUF9URUFNX0FVVE9GT0xMT1csIFBfVEVBTV9DT0xPUlMsIFBfVEVBTV9MRUFERVIsCisgICAgICAgICAgICAgICAgICAgIFBfVEVBTV9ORVdNRU1CRVIsIFBfVEVBTV9XQU5URURfUk9XLCBQX1RFQU1fV0lNUFlfUk9XCisgICAgICAgIEJld2VndW5nOiAgIElzVGVhbU1vdmUsIFRlYW1GbGVlCisgICAgICAgIE1pdGdsaWVkZXI6IFRlYW1NZW1iZXJzCisgICAgICAgIEthbXBmOiAgICAgIEFzc29jTWVtYmVyLCBEZUFzc29jTWVtYmVyLCBJbnNlcnRFbmVteVRlYW0sCisgICAgICAgICAgICAgICAgICAgIFNlbGVjdE5lYXJFbmVteSwgU2VsZWN0RmFyRW5lbXkKKyAgICAgICAgUG9zaXRpb25lbjogUHJlc2VudFBvc2l0aW9uLCBQcmVzZW50Um93cywgUHJlc2VudEVuZW15Um93cywKKyAgICAgICAgICAgICAgICAgICAgUHJlc2VudFRlYW1Qb3NpdGlvbiwgU3dhcFJvd3MKKyAgICAgICAgU29uc3RpZ2VzOiAgVGVhbVByZWZpeCwgdGVhbWthbXBmX2ludGVybgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiAxNi0wOC0yMDEwLCBHYWJ5bG9uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9Jc1RlYW1Nb3ZlIGIvZG9jL2xmdW4vSXNUZWFtTW92ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDRiMDQxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vSXNUZWFtTW92ZQpAQCAtMCwwICsxLDQwIEBACisKK0lzVGVhbU1vdmUoKQorCisKK0ZVTktUSU9OOgorICAgICAgICBvYmplY3QgSXNUZWFtTW92ZSgpCisKK0RFRklOSUVSVCBJTjoKKyAgICAgICAgL3N0ZC9saXZpbmcvdGVhbS5jCisKK0FSR1VNRU5URToKKyAgICAgICAga2VpbmUKKworQkVTQ0hSRUlCVU5HOgorICAgICAgICBUZXN0ZXQsIG9iIG1vbWVudGFuIGRpZSBBbmdyaWZmc2Jld2VndW5nIGF1c2dlZnVlaHJ0IHdpcmQuCisKK1JVRUNLR0FCRVdFUlQ6CisgICAgICAgIEZhbGxzIGRpZSBBbmdyaWZmc2Jld2VndW5nIGdlcmFkZSBhdXNnZWZ1ZWhydCB3aXJkLCB3aXJkIGRhcworICAgICAgICBUZWFtb2JqZWt0IHp1cnVlY2tnZWdlYmVuLCBzb25zdCAwLgorCitCRU1FUktVTkdFTjoKKyAgICAgICAgV2lyZCBpbnRlcm4gYmVub2V0aWd0LCBkYW1pdCBkZXIgQmVncnVlc3N1bmdzc2NobGFnIHZlcnpvZWdlcnQKKyAgICAgICAgd2VyZGVuIGthbm4sIGJpcyBhbGxlIFRlYW1taXRnbGllZGVyIGlocmUgQW5ncmlmZnNiZXdlZ3VuZworICAgICAgICBhdXNnZWZ1ZWhydCBoYWJlbi4KKworU0lFSEUgQVVDSDoKKyAgICAgICAgVWViZXJzaWNodDogdGVhbWthbXBmCisgICAgICAgIFByb3BlcnRpZXM6IFBfVEVBTSwgUF9BU1NPQ19NRU1CRVJTLCBQX1RFQU1fQVRUQUNLX0NNRCwKKyAgICAgICAgICAgICAgICAgICAgUF9URUFNX0FVVE9GT0xMT1csIFBfVEVBTV9DT0xPUlMsIFBfVEVBTV9MRUFERVIsCisgICAgICAgICAgICAgICAgICAgIFBfVEVBTV9ORVdNRU1CRVIsIFBfVEVBTV9XQU5URURfUk9XLCBQX1RFQU1fV0lNUFlfUk9XCisgICAgICAgIEJld2VndW5nOiAgIFRlYW1GbGVlCisgICAgICAgIE1pdGdsaWVkZXI6IElzVGVhbUxlYWRlciwgVGVhbU1lbWJlcnMKKyAgICAgICAgS2FtcGY6ICAgICAgQXNzb2NNZW1iZXIsIERlQXNzb2NNZW1iZXIsIEluc2VydEVuZW15VGVhbSwKKyAgICAgICAgICAgICAgICAgICAgU2VsZWN0TmVhckVuZW15LCBTZWxlY3RGYXJFbmVteQorICAgICAgICBQb3NpdGlvbmVuOiBQcmVzZW50UG9zaXRpb24sIFByZXNlbnRSb3dzLCBQcmVzZW50RW5lbXlSb3dzLAorICAgICAgICAgICAgICAgICAgICBQcmVzZW50VGVhbVBvc2l0aW9uLCBTd2FwUm93cworICAgICAgICBTb25zdGlnZXM6ICBUZWFtUHJlZml4LCB0ZWFta2FtcGZfaW50ZXJuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IDE2LTA4LTIwMTAsIEdhYnlsb24KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL0lzVW5pdCBiL2RvYy9sZnVuL0lzVW5pdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2U4YWIwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vSXNVbml0CkBAIC0wLDAgKzEsMjMgQEAKK0lzVW5pdCgpCisKK0ZVTktUSU9OOgorICAgICBpbnQgSXNVbml0KCk7CisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC91bml0LmMKKworQVJHVU1FTlRFOgorICAgICBrZWluZQorCitCRVNDSFJFSUJVTkc6CisgICAgIERpZXNlIEZ1bmt0aW9uIGxpZWZlcnQgaW1tZXIgMSB6dXJ1ZWNrIHVuZCB6ZWlndCBkYW1pdCBhbiwgZGFzcyBlcyBzaWNoCisgICAgIGJlaSBkaWVzZW0gT2JqZWt0IHVtIGVpbiBNZW5nZW5vYmpla3QgaGFuZGVsdC4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgMSBiZWkgYWxsZW4gT2JqZWt0ZW4sIGRpZSAvc3RkL3VuaXQuYyBlcmJlbiwgYW5zb25zdGVuIDAuCisKK1NJRUhFIEFVQ0g6CisgICAgIC9zdGQvdW5pdC5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFdlZCBNYXkgOCAxMDoyMDoxOSAxOTk2IGJ5IFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vS2lsbCBiL2RvYy9sZnVuL0tpbGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThlNDU0MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0tpbGwKQEAgLTAsMCArMSwyNCBAQAorS2lsbCgpCisKK0ZVTktUSU9OOgorCWludCBLaWxsKG9iamVjdCBlbmVteSkKKworQVJHVU1FTlRFOgorCWVuZW15OiBEZXIgYm9lc2UsIGJvZXNlIEZlaW5kLgorCitCRVNDSFJFSUJVTkc6CisJTmFjaCBBdWZydWYgZGVyIEZ1bmt0aW9uIHdpcmQgZGVyIEZlaW5kIGluIGplZGVtCisJaGVhcnRfYmVhdCgpIGF0dGFja2llcnQuCisKK1JVRUNLR0FCRVdFUlQ6CisJMCwgIEZhbGxzIGRlciBGZWluZCBuaWNodCBleGlzdGllcnQKKyAgLTEsIGZhbGxzIGRlciBGZWluZCBlaW4gR2Vpc3QgaXN0CisgIC0yLCBmYWxscyBkZXIgRmVpbmQgUF9OT19BVFRBQ0sgZ2VzZXR6dCBoYXQKKyAgLTMsIGZhbGxzIGRlciBBbmdyZWlmZXIgc2VsYmVyIFBfTk9fQVRUQUNLIGdlc2V0enQgaGF0CisgIC00LCBmYWxscyBkZXIgRmVpbmQgYmVyZWl0cyBhbmdlZ3JpZmZlbiB3dXJkZQorCTEgICBmYWxscyBkZXIgRmVpbmQgZXJmb2xncmVpY2ggYWxzIEZpbmQgcmVnaXN0cmllcnQgd3VyZGUuCisKK0JFTUVSS1VOR0VOOgorCitTSUVIRSBBVUNIOgorCUluc2VydEVuZW15CmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9MZWFyblNraWxsIGIvZG9jL2xmdW4vTGVhcm5Ta2lsbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzczZmJiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vTGVhcm5Ta2lsbApAQCAtMCwwICsxLDM1IEBACitMZWFyblNraWxsKCkKK0ZVTktUSU9OOgorICAgIHB1YmxpYyB2YXJhcmdzIHZvaWQgTGVhcm5Ta2lsbChzdHJpbmcgc25hbWUsIGludCBhZGQsIGludCBkaWZmKQorCitERUZJTklFUlQgSU46CisgICAgL3N0ZC9saXZpbmcvc2tpbGxzLmMKKworQVJHVU1FTlRFOgorICAgIHN0cmluZyBzbmFtZSAgICAgZGVyIHp1IGxlcm5lbmRlIFNraWxsCisgICAgc3RyaW5nIGFkZCAgICAgICBBbnphaGwgenUgbGVybmVuZGVyIFNraWxscHVua3RlCisgICAgaW50IGRpZmYgICAgICAgICBTY2h3aWVyaWdrZWl0CisKK0JFU0NIUkVJQlVORzoKKyAgICBEaWUgTWV0aG9kZSBsYWVzc3QgZWluZW4gaW50ZXJha3RpdmVuIChlaW5nZWxvZ2d0ZW4pIFNwaWVsZXIgZGVuCisgICAgU2tpbGwgJ3NuYW1lJyB1bSAnYWRkJyBQdW5rdGUgbGVybmVuLgorCisgICAgRGFiZWkgd2lyZCBzaWNoZXJnZXN0ZWxsdCwgZGFzcyAnYWRkJyBkZW4gV2VydCBNQVhfU0tJTExFQVJOIG5pY2h0CisgICAgdWViZXJzY2hyZWl0ZXQsIGRlciBTa2lsbCBuaWNodCB2ZXJzY2h3aW5kZXQgdW5kIGZ1ZXIgdWViZXJnZW9yZG5ldGUKKyAgICBTa2lsbHMgKFNJX0lOSEVSSVQpIGRpZXNlciB1ZWJlcmdlb3JkbmV0ZSBTa2lsbCBhdWNoIGVpbmVuIExlcm5lZmZla3QKKyAgICBlcmZhZWhydC4KKworICAgIFdpcmQgekIgdm9uIExlYXJuIChzcGVsbGJvb2spIHVuZCBTcGVsbFN1Y2Nlc3MgKHNwZWxsYm9vaykgZ2VydWZlbi4KKworU0lFSEUgQVVDSDoKKyAgICBTa2lsbHMgTGVybmVuOiAgTW9kaWZ5U2tpbGwsIExpbWl0QWJpbGl0eQorICAgICogTnV0enVuZzogICAgICBVc2VTcGVsbCwgVXNlU2tpbGwKKyAgICAqIEFiZnJhZ2VuOiAgICAgUXVlcnlTa2lsbCwgUXVlcnlTa2lsbEFiaWxpdHkKKyAgICAqIE1vZGlmaWthdGlvbjogTW9kaWZ5U2tpbGxBdHRyaWJ1dGUsIFF1ZXJ5U2tpbGxBdHRyaWJ1dGUsCisgICAgICAgICAgICAgICAgICAgIFF1ZXJ5U2tpbGxBdHRyaWJ1dGVNb2RpZmllciwgUmVtb3ZlU2tpbGxBdHRyaWJ1dGVNb2RpZmllcgorICAgICAgKiBQcm9wZXJ0aWVzOiBQX1NLSUxMX0FUVFJJQlVURVMsIFBfU0tJTExfQVRUUklCVVRFX09GRlNFVFMKKyAgICAqIHNvbnN0aWc6ICAgICAgc3BydWNoZXJtdWVkdW5nCisgICAgKiBQcm9wZXJ0aWVzOiAgIFBfTkVXU0tJTExTCisgICAgU3BlbGxib29rOiAgICAgIExlYXJuLCBTcGVsbFN1Y2Nlc3MKKworMy4gT2t0IDIwMTEgR2xvaW5zb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9MZWF2ZSBiL2RvYy9sZnVuL0xlYXZlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYjUyZDIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9MZWF2ZQpAQCAtMCwwICsxLDQwIEBACitMZWF2ZSgpCisKK0ZVTktUSU9OOgorICAgICBpbnQgTGVhdmUoKTsKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL3RyYW5zcG9ydC5jCisKK0FSR1VNRU5URToKKyAgICAga2VpbmUKKworQkVTQ0hSRUlCVU5HOgorICAgICBXZW5uIHNpY2ggZGVyIFNwaWVsZXIgYXVmIGVpbmVtIFRyYW5zcG9ydGVyIGJlZmluZGV0LCB1bmQgZGllc2VyIHNpY2gKKyAgICAgbW9tZW50YW4gYW4gZWluZXIgSGFsdGVzdGVsbGUgbGllZ3QsIHZlcmxhZXNzdCBkZXIgU3BpZWxlciBkZW4KKyAgICAgVHJhbnNwb3J0ZXIuCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIE51bGwsIHdlbm4gZGVyIFNwaWVsZXIgZGVuIFRyYW5zcG9ydGVyIG5pY2h0IHZlcmxhc3NlbiBrb25udGUsIHNvbnN0CisgICAgIHVuZ2xlaWNoIE51bGwuCisKK0JFTUVSS1VOR0VOOgorICAgICBFcyB3ZXJkZW4ga2VpbmUgVGVzdHMgZHVyY2hnZWZ1ZWhydCwgb2IgZGVyIFRyYW5zcG9ydGVyIHVlYmVyaGF1cHQKKyAgICAgYW5nZXNwcm9jaGVuIHd1cmRlISBEYXMgbXVzcyBtYW4gc2VsYmVyIG1hY2hlbi4KKworQkVJU1BJRUxFOgorCisgICAgIGludCBteUxlYXZlKHN0cmluZyBzdHIpCisgICAgIHsKKyAgICAgICBpZiAoc3RyICYmIGlkKHN0cikpCisgICAgICAgICByZXR1cm4gTGVhdmUoKTsKKworICAgICAgIG5vdGlmeV9mYWlsKCJXYXMgd2lsbHN0IER1IHZlcmxhc3Nlbj9cbiIpOworICAgICAgIHJldHVybiAwOworICAgICB9CisKK1NJRUhFIEFVQ0g6CisgICAgIEVudGVyKCksIC9zdGQvdHJhbnNwb3J0LmMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogV2VkIE1heSA4IDEwOjIwOjMwIDE5OTYgYnkgV2FyZ29uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9MaW1pdEFiaWxpdHkgYi9kb2MvbGZ1bi9MaW1pdEFiaWxpdHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZhMjgxMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL0xpbWl0QWJpbGl0eQpAQCAtMCwwICsxLDQ3IEBACitMaW1pdEFiaWxpdHkoKQorRlVOS1RJT046CisgICAgcHJvdGVjdGVkIHZhcmFyZ3MgbWl4ZWQgTGltaXRBYmlsaXR5KG1peGVkIHNpbmZvLCBpbnQgZGlmZikKKworREVGSU5JRVJUIElOOgorICAgIC9zdGQvbGl2aW5nL3NraWxscy5jCisKK0FSR1VNRU5URToKKyAgICBtaXhlZCBzaW5mbyAgICAgIFNraWxsLUluZm9ybWF0aW9uZW4KKyAgICBpbnQgZGlmZiAgICAgICAgIFNjaHdpZXJpZ2tlaXQKKworQkVTQ0hSRUlCVU5HOgorICAgIFNldHp0IGVpbiBNYXhpbXVtIGFuIFNraWxsZmVydGlna2VpdCBiYXNpZXJlbmQgYXVmIGRlciBTY2h3aWVyaWdrZWl0CisgICAgdW5kIGRlbSBQX0xFVkVMIGRlcyBTcGllbGVycy4KKyAgICAKKyAgICBGb2xnZW5kIGVpbmUgS29waWUgKCEpIGRlciBUYWJlbGxlIGF1cyAvc3RkL2xpdmluZy9za2lsbHM6CisgICAgZGlmZnxsdmwgMTp8ICAgMzp8ICAgNzp8IDEwOnwgMTM6fCAxNjp8IDE5OnwgMjI6fCAyNTp8IDI4OnwgMzE6fCAzNDp8CisgICAgLS0tLSstLS0tLS0rLS0tLS0rLS0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rCisgICAgIC01MHwgICA4MyV8ICA4NCV8ICA4NiV8IDg3JXwgODklfCA5MCV8IDkyJXwgOTMlfCA5NSV8IDk2JXwgOTglfCA5OSV8CisgICAgIC0xMHwgICA2OSV8ICA3MiV8ICA3NCV8IDc3JXwgODAlfCA4MiV8IDg1JXwgODglfCA5MSV8IDkzJXwgOTYlfCA5OSV8CisgICAgICAgMHwgICA2NiV8ICA2OSV8ICA3MiV8IDc1JXwgNzglfCA4MSV8IDg0JXwgODclfCA5MCV8IDkzJXwgOTYlfCA5OSV8CisgICAgICAxMHwgICA2MiV8ICA2NSV8ICA2OSV8IDcyJXwgNzUlfCA3OSV8IDgyJXwgODUlfCA4OSV8IDkyJXwgOTUlfCA5OCV8CisgICAgICAyMHwgICA1OSV8ICA2MiV8ICA2NiV8IDcwJXwgNzMlfCA3NyV8IDgwJXwgODQlfCA4OCV8IDkxJXwgOTUlfCA5OCV8CisgICAgICAzMHwgICA1NSV8ICA1OSV8ICA2MyV8IDY3JXwgNzElfCA3NSV8IDc5JXwgODMlfCA4NyV8IDkwJXwgOTQlfCA5OCV8CisgICAgICA0MHwgICA1MiV8ICA1NiV8ICA2MCV8IDY1JXwgNjklfCA3MyV8IDc3JXwgODElfCA4NiV8IDkwJXwgOTQlfCA5OCV8CisgICAgICA1MHwgICA0OSV8ICA1MyV8ICA1OCV8IDYyJXwgNjclfCA3MSV8IDc2JXwgODAlfCA4NSV8IDg5JXwgOTQlfCA5OCV8CisgICAgIDEwMHwgICAzMiV8ICAzOCV8ICA0NCV8IDUwJXwgNTYlfCA2MiV8IDY4JXwgNzQlfCA4MCV8IDg2JXwgOTIlfCA5OCV8CisgICAgIDE1MHwgICAxNSV8ICAyMiV8ICAzMCV8IDM3JXwgNDUlfCA1MiV8IDYwJXwgNjclfCA3NSV8IDgyJXwgOTAlfCA5NyV8CisgICAgIDIwMHwgICAtMiV8ICAgNyV8ICAxNiV8IDI1JXwgMzQlfCA0MyV8IDUyJXwgNjElfCA3MCV8IDc5JXwgODglfCA5NyV8CisgICAgIDI1MHwgIC0xOSV8ICAtOCV8ICAgMiV8IDEyJXwgMjMlfCAzMyV8IDQ0JXwgNTQlfCA2NSV8IDc1JXwgODYlfCA5NiV8CisgICAgIDMwMHwgIC0zNiV8IC0yNCV8IC0xMiV8ICAwJXwgMTIlfCAyNCV8IDM2JXwgNDglfCA2MCV8IDcyJXwgODQlfCA5NiV8CisgICAgIDQwMHwgIC03MCV8IC01NSV8IC00MCV8LTI1JXwtMTAlfCAgNSV8IDIwJXwgMzUlfCA1MCV8IDY1JXwgODAlfCA5NSV8CisgICAgIDUwMHwgLTEwNCV8IC04NiV8IC02OCV8LTUwJXwtMzIlfC0xNCV8ICA0JXwgMjIlfCA0MCV8IDU4JXwgNzYlfCA5NCV8CisgICAgIDYwMHwgLTEzOCV8LTExNyV8IC05NiV8LTc1JXwtNTQlfC0zMyV8LTEyJXwgIDklfCAzMCV8IDUxJXwgNzIlfCA5MyV8CisKK1NJRUhFIEFVQ0g6CisgICAgU2tpbGxzIExlcm5lbjogIExlYXJuU2tpbGwsIE1vZGlmeVNraWxsCisgICAgKiBOdXR6dW5nOiAgICAgIFVzZVNwZWxsLCBVc2VTa2lsbAorICAgICogQWJmcmFnZW46ICAgICBRdWVyeVNraWxsLCBRdWVyeVNraWxsQWJpbGl0eQorICAgICogTW9kaWZpa2F0aW9uOiBNb2RpZnlTa2lsbEF0dHJpYnV0ZSwgUXVlcnlTa2lsbEF0dHJpYnV0ZSwKKyAgICAgICAgICAgICAgICAgICAgUXVlcnlTa2lsbEF0dHJpYnV0ZU1vZGlmaWVyLCBSZW1vdmVTa2lsbEF0dHJpYnV0ZU1vZGlmaWVyCisgICAgICAqIFByb3BlcnRpZXM6IFBfU0tJTExfQVRUUklCVVRFUywgUF9TS0lMTF9BVFRSSUJVVEVfT0ZGU0VUUworICAgICogc29uc3RpZzogICAgICBzcHJ1Y2hlcm11ZWR1bmcKKyAgICAqIFByb3BlcnRpZXM6ICAgUF9ORVdTS0lMTFMKKyAgICBTcGVsbGJvb2s6ICAgICAgTGVhcm4sIFNwZWxsU3VjY2VzcworCiszLiBPa3QgMjAxMSBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vTWF0ZXJpYWxHcm91cCBiL2RvYy9sZnVuL01hdGVyaWFsR3JvdXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE1MWNhZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL01hdGVyaWFsR3JvdXAKQEAgLTAsMCArMSwzNyBAQAorTWF0ZXJpYWxHcm91cCgpCitGVU5LVElPTjoKKyAgICAgaW50IE1hdGVyaWFsR3JvdXAobWFwcGluZyBtYXRzLCBzdHJpbmcgZ3JwKQorCitERUZJTklFUlQgSU46CisgICAgIC9wL2RhZW1vbi9tYXRlcmlhbGRiLmMgKE1BVEVSSUFMREIpCisKK0FSR1VNRU5URToKKyAgICAgbWFwcGluZyBtYXRzIC0gTWF0ZXJpYWxpZW5tYXBwaW5nCisgICAgIHN0cmluZyBncnAgICAtIE1hdGVyaWFsaWVuZ3J1cHBlCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGllIE1hdGVyaWFsaWVuIGltIE1hcHBpbmcgd2VyZGVuIGF1ZiBadWdlaG9lcmlna2VpdCB6dSBkZXIgR3J1cHBlCisgICAgIHVudGVyc3VjaHQgdW5kIGRlciBHZXNhbXRhbnRlaWwgZGllc2VyIE1hdGVyaWFsaWVuZ3J1cHBlIGFtIE1hcHBpbmcKKyAgICAgaW4gUHJvemVudCB6dXJ1ZWNrZ2VnZWJlbiAod2VubiBkYXMgTWFwcGluZyBzaWNoIGF1ZiAxMDAlIGF1ZmFkZGllcnQpLgorCitSVUVDS0dBQkVXRVJUOgorICAgICBpbnQgLSBwcm96ZW50dWFsZXIgQW50ZWlsIGRlciBNYXRlcmlhbGllbmdydXBwZSAtMTAwIC4uLiAxMDAgJQorCitCRUlTUElFTEU6CisgICAgIGlmKE1BVEVSSUFMREItPk1hdGVyaWFsR3JvdXAoCisJCShbTUFUX01JU0NfU1RPTkU6NDAsTUFUX0FNRVRIWVNUOjUwLE1BVF9NSVNDX01FVEFMOjEwXSksCisJCU1BVEdST1VQX0pFV0VMKT41MCkKKyAgICAgIHdyaXRlKCJPaCBqYSwgZGFyaW4gc2luZCBzZWhyIHZpZWxlIEVkZWxzdGVpbmUhXG4iKTsKKworQkVNRVJLVU5HRU46CisgICAgIFdpcmQgdm9uIC9zdGQvdGhpbmcvZGVzY3JpcHRpb246OlF1ZXJ5TWF0ZXJpYWxHcm91cCgpIGdlcnVmZW4uCisgICAgIEJpdHRlIGFuIE9iamVrdGVuIGF1Y2ggUXVlcnlNYXRlcmlhbEdyb3VwKCkgdmVyd2VuZGVuLgorCitTSUVIRSBBVUNIOgorICAgICBLb256ZXB0ZToJICBtYXRlcmlhbCwgbWF0ZXJpYWxlcmtlbm51bmcKKyAgICAgR3J1bmRsZWdlbmQ6IFBfTUFURVJJQUwsIC9zeXMvdGhpbmcvbWF0ZXJpYWwuaAorICAgICBNYXN0ZXI6CSAgQWRkTWF0ZXJpYWwoKSwgQ29udk1hdGVyaWFsTGlzdCgpCisJCSAgR3JvdXBOYW1lKCksIE1hdGVyaWFsTmFtZSgpLAorCQkgIEdldEdyb3VwTWVtYmVycygpLCBHZXRNYXRNZW1iZXJzaGlwKCkKKworNy4gTWFpIDIwMDQgR2xvaW5zb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9NYXRlcmlhbExpc3QgYi9kb2MvbGZ1bi9NYXRlcmlhbExpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdlZjUyNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL01hdGVyaWFsTGlzdApAQCAtMCwwICsxLDY1IEBACitNYXRlcmlhbExpc3QoTCkKK0ZVTktUSU9OOgorICAgICB2YXJhcmdzIHN0cmluZyBNYXRlcmlhbExpc3QoaW50IGNhc3VzLCBtaXhlZCBpZGluZikKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL3RoaW5nL2Rlc2NyaXB0aW9uLmMKKworQVJHVU1FTlRFOgorICAgICBpbnQgY2FzdXMJIC0gZGVyIEZhbGwsIGluIGRlbSBkaWUgTWF0ZXJpYWxpZW4gZGVrbGluaWVydCB3ZXJkZW4gc29sbGVuCisgICAgIG1peGVkIGlkaW5mIC0gRGluZ2UsIHdlbGNoZSBkaWUgRmFlaGlna2VpdGVuIGRlcyBFcmtlbm5lbnMgYmVlaW5mbHVzc2VuOgorCQkgICBFaW56ZWxuZSBXZXJ0ZToKKyAgICAgICAgICAgICAgICAgICAqIHg6IGFsbGdlbWVpbmUgRXJrZW5udW5nIC0xMDAgLi4uIDEwMAorICAgICAgICAgICAgICAgICAgICogd2hvOiBkZXIgU3BpZWxlciAtIFBfTUFURVJJQUxfS05PV0xFREdFIHdpcmQgYWJnZWZyYWd0CisgICAgICAgICAgICAgICAgICAgKiBmdW46IHdpcmQgZXZhbHVpZXJ0CisgICAgICAgICAgICAgICAgICAgKiB3aGF0LCBrYW5uIGZvbGdlbmRlcyBlbnRoYWx0ZW46CisgICAgICAgICAgICAgICAgICAgICAtIEVpbnRyYWcgZnVlciBNYXRlcmlhbGllbiAoW01BVF9YWFg6LTEwMC4uLjEwMF0pCisgICAgICAgICAgICAgICAgICAgICAtIEVpbnRyYWcgZnVlciBNYXRlcmlhbGllbmdydXBwZW4gKGRpdG8pCisgICAgICAgICAgICAgICAgICAgICAtIChbTUFURVJJQUxfU1lNTUVUUklDX1JFQ09HTklaQUJJTElUWTogbWl4ZWQgbWddKQorICAgICAgICAgICAgICAgICAgICAgICAqIG1nIGVpbiBBcnJheToKKyAgICAgICAgICAgICAgICAgICAgICAgICAoe01BVEdST1VQX1gxLGludCB6MSwgTUFUR1JPVVBfWDIsIGludCB6MiwgLi4ufSkKKyAgICAgICAgICAgICAgICAgICAgICAgICB3b2JlaSBiZWkgWnVnZWhvZXJpZ2tlaXQgdm9uIHN0cmluZyBtYXQgenUgR3J1cHBlCisgICAgICAgICAgICAgICAgICAgICAgICAgejxuPiBhdWYgZGllIEZhZWhpZ2tlaXQgYWRkaWVydCwgYW5kZXJuZmFsbHMgZGF2b24KKyAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0cmFoaWVydCB3aXJkCisJCSAgIEFycmF5IG1pdCBvYmlnZW4gV2VydGVuOgorICAgICAgICAgICAgICAgICAgIC0gYWxsZSBQYXJhbWV0ZXIgZGVzIEFycmF5cyBzaW5kIG9wdGlvbmFsIHVuZCBhZGRpdGl2CisgICAgICAgICAgICAgICAgICAgLSAoe2ludCB4LCBvYmplY3Qgd2hvLCBtYXBwaW5nIHdoYXQsIGNsb3N1cmUgZnVufSkKKworQkVTQ0hSRUlCVU5HOgorICAgICBMaXN0ZXQgZGllIE1hdGVyaWFsaWVuIGF1ZiwgYXVzIGRlbmVuIGVpbiBPYmpla3QgYmVzdGVodC4KKyAgICAgRGFiZWkgaGFlbmd0IGRpZSBHZW5hdWlna2VpdCBkZXIgTWF0ZXJpYWxlcmtlbm51bmcgdm9uIGlkaW5mIGFiLiBELmguCisgICAgIGplIG5hY2ggZGVuIEZhZWhpZ2tlaXRlbi9kZXIgYW5nZWdlYmVuZW4gRmFlaGlna2VpdCB3aXJkIHpCIFdvbGZyYW0KKyAgICAgYWxzICJXb2xmcmFtIiBvZGVyIG51ciBhbHMgIk1ldGFsbCIgZXJrYW5udC4KKworICAgICBXZW5uIGVpbiBTcGllbGVyIGV0d2FzIGlkZW50aWZpemllcnQsIHNvbGx0ZSBhdWNoIFRQIHVlYmVyZ2ViZW4gd2VyZGVuLAorICAgICBiZWkgTlBDcyBrb2VubnRlIGRhcyBhbmRlcnMgYXVzc2VoZW4uCisKK1JVRUNLR0FCRVdFUlQ6CisgICAgIFN0cmluZyBtaXQgTGlzdGUgZGVyIE1hdGVyaWFsaWVuLgorCitCRU1FUktVTkdFTjoKKyAgICAgLSBlcyB3ZXJkZW4gbnVyIGRpZSBNYXRlcmlhbGllbiBhbmdlZ2ViZW4sIG5pY2h0IGRpZSBNZW5nZS4KKyAgICAgLSBydWZ0IENvbnZNYXRlcmlhbExpc3QoKSBhbiBkZXIgTUFURVJJQUxEQgorCitCRUlTUElFTEU6CisgICAgIC8vIHNpbXBlbAorICAgICB3cml0ZSgiRGVyIEdlZ2Vuc3RhbmQgYmVzdGVodCBhdXMiK29iLT5NYXRlcmlhbExpc3QoV0VNLFRQKSsiLlxuIikKKyAgICAgLy8gLT4gIkRlciBHZWdlbnN0YW5kIGJlc3RlaHQgYXVzIEdvbGQsIFNpbGJlciB1bmQgUnViaW4uXG4iCisKKyAgICAgLy8ga29tcGxleGVyCisgICAgIG9iLT5TZXRQcm9wKFBfTUFURVJJQUwsIChbUF9OSVRST0dMWUNFUklORTo5MCxQX0dVTlBPV0RFUjoxMF0pKTsKKyAgICAgd3JpdGUoIkRhcyBlbnRoYWVsdCAiK29iLT5NYXRlcmlhbExpc3QoV0VSLFRQKSsiLlxuIik7CisgICAgIC8vIC0+ICJEYXMgZW50aGFlbHQgU2Nod2FyenB1bHZlciB1bmQgTml0cm9nbHljZXJpbi4iCisKK1NJRUhFIEFVQ0g6CisgICAgIEtvbnplcHRlOgkgIG1hdGVyaWFsLCBtYXRlcmlhbGVya2VubnVuZworICAgICBHcnVuZGxlZ2VuZDogUF9NQVRFUklBTCwgL3N5cy90aGluZy9tYXRlcmlhbC5oCisgICAgIE1ldGhvZGVuOiAgICBRdWVyeU1hdGVyaWFsKCksIFF1ZXJ5TWF0ZXJpYWxHcm91cCgpCisgICAgIExpc3RlbjoJICBBbGxNYXRlcmlhbHMoKSwgQWxsR3JvdXBzKCksIER1bXAoKQorCQkgIG1hdGVyaWFsbGlzdGUsIG1hdGVyaWFsZ3J1cHBlbgorICAgICBNYXN0ZXI6CSAgQWRkTWF0ZXJpYWwoKSwgQ29udk1hdGVyaWFsTGlzdCgpLCBNYXRlcmlhbEdyb3VwKCksCisJCSAgR3JvdXBOYW1lKCksIE1hdGVyaWFsTmFtZSgpLAorCQkgIEdldEdyb3VwTWVtYmVycygpLCBHZXRNYXRNZW1iZXJzaGlwKCkKKyAgICAgU29uc3RpZ2VzOgkgIFBfTUFURVJJQUxfS05PV0xFREdFCisKKzcuIE1haSAyMDA0IEdsb2luc29uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vTWF0ZXJpYWxOYW1lIGIvZG9jL2xmdW4vTWF0ZXJpYWxOYW1lCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMzM4YTMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9NYXRlcmlhbE5hbWUKQEAgLTAsMCArMSw3MiBAQAorTWF0ZXJpYWxOYW1lKCkKK0ZVTktUSU9OOgorICAgICB2YXJhcmdzIHN0cmluZyBNYXRlcmlhbE5hbWUoc3RyaW5nIG1hdCwgaW50IGNhc3VzLCBtaXhlZCBpZGluZikKKworREVGSU5JRVJUIElOOgorICAgICAvcC9kYWVtb24vbWF0ZXJpYWxkYi5jIChNQVRFUklBTERCKQorCitBUkdVTUVOVEU6CisgICAgIHN0cmluZyBtYXQJIC0gZGFzIHp1IGVya2VubmVuZGUgTWF0ZXJpYWwKKyAgICAgaW50IGNhc3VzCSAtIGRlciBGYWxsCisgICAgIG1peGVkIGlkaW5mIC0gRGluZ2UsIHdlbGNoZSBkaWUgRmFlaGlna2VpdGVuIGRlcyBFcmtlbm5lbnMgYmVlaW5mbHVzc2VuCisJCSAgIChzaWVoZSAibWFuIE1hdGVyaWFsTGlzdCIpCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGllc2UgRnVua3Rpb24gc3VjaHQgdW50ZXIgQmVydWVja3NpY2h0aWd1bmcgZGVyIEVya2VubnVuZ3NiZS0KKyAgICAgc2NocmFlbmt1bmdlbiBkZXMgTWF0ZXJpYWxzIHVuZCBGYWVoaWdrZWl0ZW4gZGVzIFNwaWVsZXJzIGRlbgorICAgICBLbGFybmFtZW4gZGVzIE1hdGVyaWFscyBoZXJhdXMgdW5kIGdpYnQgZGVuIHp1cnVlY2suCisKK1JVRUNLR0FCRVdFUlQ6CisgICAgIHN0cmluZzogTWF0ZXJpYWxuYW1lIG9kZXIgZ2VuZXJlbGxlciBOYW1lLgorCitCRUlTUElFTEU6CisgICAgIC8vIGRlciBoaWVyIG1hZyBhbGxlIGV4aXN0aWVyZW5kZW4gSnV3ZWxlbiwgYXVjaCB3ZW5uIHdlbGNoZSBlcmdhZW56dAorICAgICAvLyB3ZXJkZW4gc29sbHRlbgorICAgICAvLyBQYXJhbWV0ZXI6IDEuIGVpbiBKdXdlbCwgMi4gQ2FzdXMsIDMuIDEwMCUgRXJrZW5udW5nIC0gb2IgZXIgc2llCisgICAgIC8vIGJlaW0gRW1wZmFuZyBkYW5uIGF1Y2ggenUgMTAwJSBlcmtlbm50LCBzdGVodCBoaWVyIG5pY2h0IQorICAgICBzdHJpbmcqIGxpa2VpdDsKKyAgICAgbGlrZWl0PU1BVEVSSUFMREItPkdldEdyb3VwTWVtYmVycyhNQVRHUk9VUF9KRVdFTCk7CisgICAgIC4uLgorICAgICB3cml0ZSgiRGVyIEFsdGUgc2FndDogSWNoIG1hZyAiKworCSAgIE1BVEVSSUFMREItPk1hdGVyaWFsTmFtZShsaWtlaXRbcmFuZG9tKHNpemVvZihsaWtlaXQpKV0sIFdFTiwgMTAwKSsKKwkgICAiLlxuIik7CisgICAgIC4uLgorCisgICAgIC8vIGVpbiB3ZWlzZXIgc2NobWllZDoKKyAgICAgaW50IGk7CisgICAgIHN0cmluZyAqbWF0LCBtbmFtZSwgbWdyb3VwOworICAgICBtYXQ9bV9pbmRpY2VzKG9iLT5xdWVyeXByb3AocF9tYXRlcmlhbCkpOworICAgICBpPXNpemVvZihtYXQpOworCisgICAgIHdyaXRlKCJkZXIgc2NobWllZCBzYWd0OiAiK29iLT5uYW1lKHdlcikrIiBiZXN0ZWh0IGF1cyAuLi5cbiIpOworICAgICB3aGlsZShpLS0pIHsKKyAgICAgIC8vIGRlbiBuYW1lbiBlcmtlbm5lbi9hdXNzcHJlY2hlbjoKKyAgICAgIC8vIG1hdGVyaWFsaWVuIHdlcmRlbiBhbGxnZW1laW4gZ2FueiBzY2hsZWNodCBlcmthbm50ICh6dSA1JSksIGFiZXIKKyAgICAgIC8vIGFsbGVzIGF1cyBtZXRhbGwgd2lyZCB6dSArMTAwJSBndXQgZXJrYW5udCAuLi4KKyAgICAgIG1uYW1lPW1hdGVyaWFsZGItPm1hdGVyaWFsbmFtZShtYXRbaV0sIHdlciwKKwkgICAgICh7NSwgKFttYXRlcmlhbF9zeW1tZXRyaWNfcmVjb2duaXphYmlsaXR5OgorCQkJKHttYXRncm91cF9tZXRhbCwgMTAwfSldKX0pKTsKKworICAgICAgLy8gdW5kIG51ciBtZXRhbGxlIGFuYWx5c2llcmVuIC4uLgorICAgICAgaWYobWF0ZXJpYWxkYi0+bWF0ZXJpYWxncm91cCgoW21hdFtpXToxMDBdKSxtYXRncm91cF9tZXRhbCk+PTEwMCkgeworICAgICAgIGludCBqOworICAgICAgIHN0cmluZyAqbWdyOworICAgICAgIG1ncj1tYXRlcmlhbGRiLT5nZXRtYXRtZW1iZXJzaGlwKG1hdFtpXSk7CisgICAgICAgaj1zaXplb2YobWdyKTsKKyAgICAgICBtZ3JvdXA9IiBnZWhvZXJ0IHp1ICI7CisgICAgICAgd2hpbGUoai0tKSB7CisgICAgICAgIG1ncm91cCs9bWF0ZXJpYWxkYi0+Z3JvdXBuYW1lKG1ncltqXSk7CisgICAgICAgIGlmKGo+MCkgbWdyb3VwKz0iLCAiOworICAgICAgIH0KKyAgICAgIH0gZWxzZSBtZ3JvdXA9IiBrZW5uZSBpY2ggbmljaHQiOworICAgICAgcHJpbnRmKCIlLTEyLjEyczogJXNcbiIsbW5hbWUsIG1ncm91cCk7CisgICAgIH0KKworU0lFSEUgQVVDSDoKKyAgICAgS29uemVwdGU6CSAgbWF0ZXJpYWwsIG1hdGVyaWFsZXJrZW5udW5nCisgICAgIEdydW5kbGVnZW5kOiBQX01BVEVSSUFMLCAvc3lzL3RoaW5nL21hdGVyaWFsLmgKKyAgICAgTWFzdGVyOgkgIEFkZE1hdGVyaWFsKCksIENvbnZNYXRlcmlhbExpc3QoKSwgTWF0ZXJpYWxHcm91cCgpLAorCQkgIEdyb3VwTmFtZSgpCisJCSAgR2V0R3JvdXBNZW1iZXJzKCksIEdldE1hdE1lbWJlcnNoaXAoKQorCis3LiBNYWkgMjAwNCBHbG9pbnNvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL01heUFkZE9iamVjdCBiL2RvYy9sZnVuL01heUFkZE9iamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTAyZGE0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vTWF5QWRkT2JqZWN0CkBAIC0wLDAgKzEsMzMgQEAKK01heUFkZE9iamVjdCgpCisKK0ZVTktUSU9OOgorICAgICBpbnQgTWF5QWRkT2JqZWN0KG9iamVjdCBvYik7CisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC9jb250YWluZXIvcmVzdHJpY3Rpb25zLmMKKworQVJHVU1FTlRFOgorICAgICBvYiAtIERhcyBPYmplY3QgYmVpIGRlbSBnZXBydWVmdCB3ZXJkZW4gc29sbCwgb2IgZXMgbm9jaCBpbiBkZW4KKyAgICAgICAgICBDb250YWluZXIgcGFzc3QuCisKK0JFU0NIUkVJQlVORzoKKyAgICAgV2VubiBlaW4gT2JqZWt0IGluIGVpbmVuIENvbnRhaW5lciBiZXdlZ3Qgd2lyZCwgcHJ1ZWZ0IG1vdmUoKSB1ZWJlcgorICAgICBkaWVzZSBGdW5rdGlvbiwgb2IgZGFzIE9iamVrdCB1ZWJlcmhhdXB0IG5vY2ggaW4gZGVuIEJlaGFlbHRlciBoaW5laW4KKyAgICAgcGFzc3QuIERhenUgdWViZXJnaWJ0IG1vdmUoKSBkYXMgT2JqZWt0IGRhcyBpbiBkZW4gQ29udGFpbmVyIGJld2VndAorICAgICB3ZXJkZW4gc29sbC4gKEluIFJhZXVtZW4gaXN0IGRpZXNlIEZ1bmt0aW9uZW4gdWViZXJzY2hyaWViZW4gdW5kCisgICAgIGxpZWZlcnQgaW1tZXIgVHJ1ZSB6dXJ1ZWNrLikKKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgMSAtIHdlbm4gZGFzIE9iamVrdCBub2NoIHZvbSBDb250YWluZXIgYXVmZ2Vub21tZW4gd2VyZGVuIGthbm4uCisgICAgIDAgc29uc3QuCisKK0JFTUVSS1VOR0VOOgorICAgICBpbnZpcy1PYmpla3RlIHBhc3NlbiBpbW1lciBpbiBkZW4gQ29udGFpbmVyIGhpbmVpbiEKKyAgICAgbW92ZSgpIHJ1ZnQgZGllc2UgRnVua3Rpb24gbmljaHQgYXVmLCB3ZW5uIGluIGRlbiBGbGFncyBNX05PQ0hFQ0sKKyAgICAgZ2VzZXR6dCB3YXIhCisKK1NJRUhFIEFVQ0g6CisgICAgIE1heUFkZFdlaWdodCgpLCBQcmV2ZW50SW5zZXJ0KCksIG1vdmUoKSwgL3N0ZC9jb250YWluZXIvcmVzdHJpY3Rpb25zLmMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogMjMuMDkuMjAwNywgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vTWF5QWRkV2VpZ2h0IGIvZG9jL2xmdW4vTWF5QWRkV2VpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjYzRlNDcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9NYXlBZGRXZWlnaHQKQEAgLTAsMCArMSw0NyBAQAorTWF5QWRkV2VpZ2h0KCkKKworRlVOS1RJT046CisgICAgIGludCBNYXlBZGRXZWlnaHQoaW50IGdld2ljaHQpOworCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvY29udGFpbmVyL3Jlc3RyaWN0aW9ucy5jCisKK0FSR1VNRU5URToKKyAgICAgZ2V3aWNodAorICAgICAgICAgIERhcyB6dSBwcnVlZmVuZGUgR2V3aWNodC4KKworQkVTQ0hSRUlCVU5HOgorICAgICBXZW5uIGVpbiBPYmpla3QgZWluIGVpbmVuIEJlaGFlbHRlciBiZXdlZ3Qgd2lyZCwgcHJ1ZWZ0IG1vdmUoKSB1ZWJlcgorICAgICBkaWVzZSBGdW5rdGlvbiwgb2IgZGFzIE9iamVrdCB1ZWJlcmhhdXB0IG5vY2ggaW4gZGVuIEJlaGFlbHRlciBoaW5laW4KKyAgICAgcGFzc3QuIERhenUgdWViZXJnaWJ0IG1vdmUoKSBkaWVzZXIgRnVua3Rpb24gZGFzIEdld2ljaHQgZGVzIHp1CisgICAgIGJld2VnZW5kZW4gT2JqZWt0ZXMuCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIDAsIHdlbm4gZGVyIEJlaGFlbHRlciBub2NoIGVpbiBnZXdpY2h0IEdyYW1tIHdpZWdlbmRlcyBPYmpla3QgYXVmbmVobWVuCisgICAgIGthbm4sIC0xIGltIGFuZGVyZW4gRmFsbC4KKworQkVNRVJLVU5HRU46CisgICAgIG1vdmUoKSBydWZ0IGRpZXNlIEZ1bmt0aW9uIG5pY2h0IGF1Ziwgd2VubiBpbiBkZW4gRmxhZ3MgTV9OT0NIRUNLCisgICAgIGdlc2V0enQgd2FyIQorCitCRUlTUElFTEU6CisgICAgIERpZSBlbnRzcHJlY2hlbmRlIEFiZnJhZ2UgaW4gL3N0ZC90aGluZy9tb3ZpbmcuYyBzaWVodCBldHdhCisgICAgIGZvbGdlbmRlcm1hc3NlbiBhdXM6CisKKyAgICAgaW50IHdlaWdodDsKKworICAgICAuLi4KKyAgICAgd2VpZ2h0ID0gUXVlcnlQcm9wKFBfVE9UQUxfV0VJR0hUKTsgICAvLyBCZWhhZWx0ZXI/IEphID0+IEdlc2FtdGdld2ljaHQKKyAgICAgaWYgKCF3ZWlnaHQpCisgICAgICAgd2VpZ2h0ID0gUXVlcnlQcm9wKFBfV0VJR0hUKTsgICAgICAgLy8gTmVpbjogZWluZmFjaGVzIEdld2ljaHQKKworICAgICBpZiAoemllbC0+TWF5QWRkV2VpZ2h0KHdlaWdodCkgPT0gLTEpIC8vIFBhc3N0IGVzIG5vY2ggcmVpbj8KKyAgICAgICByZXR1cm4gTUVfVE9PX0hFQVZZOyAgICAgICAgICAgICAgICAvLyBOZWluLCBlbnRzcHIuIEZlaGxlciB6dXJ1ZWNrZ2ViZW4KKworICAgICAuLi4KKworU0lFSEUgQVVDSDoKKyAgICAgTWF5QWRkT2JqZWN0KCksIFByZXZlbnRJbnNlcnQoKSwgbW92ZSgpLCAvc3RkL2NvbnRhaW5lci9yZXN0cmljdGlvbnMuYworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiAyMy4wOS4yMDA3LCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9NZXNzYWdlIGIvZG9jL2xmdW4vTWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjM1ZjZlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vTWVzc2FnZQpAQCAtMCwwICsxLDIzIEBACitNZXNzYWdlKCkKKworRlVOS1RJT046CisgICAgICAgIHZhcmFyZ3MgaW50IE1lc3NhZ2Uoc3RyaW5nIHN0ciwgaW50IGZsYWcpCisKK0FSR1VNRU5URToKKyAgICAgICAgc3RyOiBEZW4genUgdWViZXJtaXR0ZWxuZGVuIFRleHQuCisJZmxhZzogQmVzY2hyZWlidCBkaWUgQXJ0IGRlciBNZWxkdW5nIG5hZWhlciwgc2llaGUKKwkgICAgICAvc3lzL3BsYXllci9jb21tLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICAgICBFaW5lbSBTcGllbGVyIHdpcmQgZGVyIFRleHQgc3RyIHVlYmVybWl0dGVsdC4KKworUlVFQ0tHQUJFV0VSVDoKKyAgICAgICAgMSBiZWkgZXJmb2xncmVpY2hlciBVZWJlcm1pdHRsdW5nCisgICAgICAgIDAgd2VubiBkZXIgS29ib2xkIGFrdGl2IHdhcgorICAgICAgIDwwIHdlbm4gU3BpZWxlciBvZGVyIHZlcndlbmRldGVzIFZlcmIgaWdub3JpZXJ0CisgICAgICAgICAgd2VyZGVuCisKK1NJRUhFIEFVQ0g6CisgICAgIFBfSUdOT1JFLCBUZXN0SWdub3JlKCkKKworMTIuIE1haSAyMDA0IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9Nb2RpZnlRdWVzdFRpbWUgYi9kb2MvbGZ1bi9Nb2RpZnlRdWVzdFRpbWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAyMGJhZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL01vZGlmeVF1ZXN0VGltZQpAQCAtMCwwICsxLDQ0IEBACitNb2RpZnlRdWVzdFRpbWUoKQorCitGVU5LVElPTjoKKyAgICAgICAgaW50IE1vZGlmeVF1ZXN0VGltZShzdHJpbmcgcXVlc3RuYW1lLCBpbnQgemVpdCkKKworREVGSU5JRVJUIElOOgorICAgICAgICAvc3RkL3BsYXllci9xdWVzdHMuYworCitBUkdVTUVOVEU6CisgICAgICAgIHF1ZXN0bmFtZQorICAgICAgICAgIFF1ZXN0bmFtZSwgd2llIGVyIGltIFF1ZXN0bWFzdGVyIGVpbmdldHJhZ2VuIHd1cmRlLgorICAgICAgICB6ZWl0CisgICAgICAgICAgWmVpdHB1bmt0LCB6dSBkZW0gZGllIFF1ZXN0IGdlbG9lc3Qgd3VyZGUKKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgICAgIDEgOiBRdWVzdHplaXRwdW5rdCBlcmZvbGdyZWljaCBuYWNoZ2V0cmFnZW4KKyAgICAgICAgLTEgOiBrZWluZSBadWdyaWZmc3JlY2h0ZSAobnVyIEVNKyB1bmQgZGVyIFRhZ2VidWNobWFzdGVyIGVybGF1YnQpCisgICAgICAgIC0yIDogUXVlc3RsaXN0ZSBpbSBTcGllbGVyb2JqZWt0IGlzdCB1bmVyd2FydGV0IGtlaW4gTWFwcGluZworICAgICAgICAtMyA6IFNwaWVsZXIgaGF0IGRpZXNlIFF1ZXN0IG5vY2ggbmljaHQgYmVzdGFuZGVuCisgICAgICAgIC00IDoga2VpbiBndWVsdGlnZXIgWmVpdHB1bmt0IHVlYmVyZ2ViZW4gKGtlaW4gSW50ZWdlciwgV2VydCA8IC0xCisgICAgICAgICAgICAgb2RlciBXZXJ0ID4gdGltZSgpKS4KKworQkVTQ0hSRUlCVU5HOgorICAgICAgICBNaXQgZGllc2VyIEZ1bmt0aW9uIGthbm4gZGVyIFplaXRwdW5rdCBuYWNoZ2V0cmFnZW4gd2VyZGVuLCB6dQorICAgICAgICBkZW0gZWluIFNwaWVsZXIgZWluZSBiZXN0aW1tdGUgUXVlc3QgYmVyZWl0cyBnZWxvZXN0IGhhdC4gCisgICAgICAgIEFscyBRdWVzdG5hbWUgd2lyZCBkYXp1IGRlciBOYW1lIGFuZ2VnZWJlbiwgZGVyIGltIFF1ZXN0bWFzdGVyIAorICAgICAgICBlaW5nZXRyYWdlbiBpc3QuIERlciBaZWl0cHVua3QgaXN0IGFscyBJbnRlZ2VyLVdlcnQgaW0gdWVibGljaGVuCisgICAgICAgIHRpbWUoKS1Gb3JtYXQgYW56dWdlYmVuLiBVZWJlcmdpYnQgbWFuIC0xIGFscyA8emVpdD4sIGRhbm4gd2lyZAorICAgICAgICBkZXIgVGFnZWJ1Y2htYXN0ZXIgZXJuZXV0IHZlcnN1Y2hlbiwgZGFzIExvZ2ZpbGUgZWluenVsZXNlbiwgCisgICAgICAgIHdlbm4gZGVyIFNwaWVsZXIgZGFzIG5hZWNoc3RlIG1hbCBzZWluIEFiZW50ZXVlcnRhZ2VidWNoIGxpZXN0LgorCitISU5XRUlTOgorICAgICAgICBEaWUgRnVua3Rpb24gbWt0aW1lKCkgaXN0IG51ZXR6bGljaCwgd2VubiBkZXIgWmVpdHB1bmt0IGRlcyAKKyAgICAgICAgQmVzdGVoZW5zIGVpbmVyIFF1ZXN0IG1hbnVlbGwgcmVrb25zdHJ1aWVydCB3ZXJkZW4gbXVzcywgZGVyCisgICAgICAgIFplaXRwdW5rdCBhYmVyIG51ciBhbHMgRGF0dW1zLS9aZWl0YW5nYWJlIGluIFRleHRmb3JtIHZvcmxpZWd0IAorICAgICAgICAoZXR3YSBhdXMgZWluZW0gTG9nZmlsZSBvZGVyIGF1cyBkZXIgUXVlc3QtRmVlZGJhY2ttYWlsKS4KKworU0lFSEUgQVVDSDoKKyAgICAgICAgL3NlY3VyZS9xdWVzdG1hc3Rlci5oLCAvb2JqL3Rvb2xzL3F1ZXN0dG9vbAorICAgICAgICBHaXZlUXVlc3QoTCkKKyAgICAgICAgbWt0aW1lKEUpLCBkdGltZShTRSkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorWnVsZXR6dCBnZWFlbmRlcnQ6IE1vbiwgMjcuIEphbi4gMjAxNSwgQXJhdGhvcm4KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL01vZGlmeVNraWxsIGIvZG9jL2xmdW4vTW9kaWZ5U2tpbGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRkNjIyZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL01vZGlmeVNraWxsCkBAIC0wLDAgKzEsNzMgQEAKK01vZGlmeVNraWxsKCkKK0ZVTktUSU9OOgorICAgIHB1YmxpYyB2YXJhcmdzIHZvaWQgTW9kaWZ5U2tpbGwoc3RyaW5nIHNuYW1lLCBtaXhlZCB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlmZiwgc3RyaW5nIGdpbGRlKQorCitERUZJTklFUlQgSU46CisgICAgL3N0ZC9saXZpbmcvc2tpbGxzLmMKKworQVJHVU1FTlRFOgorICAgIHN0cmluZyBzbmFtZSAgICAgZGVyIHp1IGFlbmRlcm5kZSBTa2lsbAorICAgIG1peGVkIHZhbCAgICAgICAgQWVuZGVydW5nc3dlcnQ6IGludCBmdWVyIFNJX1NLSUxMQUJJTElUWSwgc29uc3QgbWFwcGluZworICAgIGludCBkaWZmICAgICAgICAgU2Nod2llcmlna2VpdCAob3B0aW9uYWw6IGRlZmF1bHQgaXN0IGV4aXN0aWVyZW5kZXMgZGlmZikKKyAgICBzdHJpbmcgZ2lsZGUgICAgIEdpbGRlIChvcHRpb25hbDogZGVmYXVsdCBpc3QgZWlnZW5lIEdpbGRlKQorCitCRVNDSFJFSUJVTkc6CisgICAgTWl0IGRlciBNZXRob2RlIGthbm4gbWFuIGRpZSBXZXJ0ZSBlaW5lcyBTa2lsbHMvU3BlbGxzIHZlcmFlbmRlcm4uIERhYmVpCisgICAgd2lyZCBlaW4gU2tpbGwgaW1tZXIgaW4gZWluIE1hcHBpbmcgdW1nZXdhbmRlbHQgKFNraWxscy9TcGVsbHMga29lbm5lbgorICAgIGF1Y2ggZWluZmFjaCBudXIgaWhyZW4gU2tpbGx3ZXJ0IGVudGhhbHRlbiwgZGllc2UgaXN0IGFlcXVpdmFsZW50IHp1CisgICAgZWluZW0gTWFwcGluZyBtaXQgKFtTSV9TS0lMTEFCSUxJVFk6PFNraWxsd2VydD5dKS4KKworICAgIElzdCAndmFsJyBlaW4gaW50LCB3aXJkIGRpZXNlcyBhbHMgU0lfU0tJTExBQklMSVRZIGdlc2V0enQuIEZhbGxzIGRlcgorICAgIFNraWxsIG51ciBlaW4gaW50IHdhciwgd2lyZCBlaW4gJ2RpZmYnIT0wIGFscyBTSV9ESUZGSUNVTFRZIGdlc2V0enQuCisKKyAgICBJc3QgJ3ZhbCcgZWluIE1hcHBpbmcsIHdpcmQgZGllc2VzIHp1bSBTa2lsbG1hcHBpbmcgYWRkaWVydC4KKyAgICAKKyAgICBFdHdhaWdlIFNJX1NLSUxMQUJJTElUWS1BZW5kZXJ1bmdlbiBsYXVmZW4gZGFuYWNoIG5vY2ggZHVyY2ggTGltaXRBYmlsaXR5LgorCitCRUlTUElFTEU6CisgICAgLy8gIzFhOiBMZXJuZSBlaW5lbiBTcGVsbC9Ta2lsbCAoZWluZXIgR2lsZGUpCisgICAgY2FzdGVyLT5Nb2RpZnlTa2lsbCgiZmV1ZXJiYWxsIiwgTUFYX0FCSUxJVFksIDEwMCwgImFiZW50ZXVyZXIiKQorICAgIC8vICMxYjogLi4uIG9kZXIgLi4uCisgICAgY2FzdGVyLT5Nb2RpZnlTa2lsbCgiZmV1ZXJiYWxsIiwgKFtTSV9TS0lMTEFCSUxJVFk6IE1BWF9BQklMSVRZXSksIDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhYmVudGV1cmVyIikKKyAgICAvLyAjMWM6IC4uLiBvZGVyIGZ1ZXIgZWluZW4gQWJlbnRldXJlciAuLi4KKyAgICBjYXN0ZXItPk1vZGlmeVNraWxsKCJmZXVlcmJhbGwiLCAoW1NJX1NLSUxMQUJJTElUWTogTUFYX0FCSUxJVFldKSwgMTAwKTsKKyAgICAKKyAgICAvLyAjMjogU2V0emUgZWluZSBTa2lsbC1GdW5rdGlvbiBmdWVyIGVpbmVuIEthbXBmc2tpbGwgZGVzIEtsZXJ1cworICAgIHRoaXNfcGxheWVyKCktPk1vZGlmeVNraWxsKEZJR0hUKFdUX0NMVUIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChbU0lfU0tJTExGVU5DOiAiS2V1bGVua2FtcGYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfRElGRklDVUxUWTogMTAwXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAia2xlcnVzIik7CisKKyAgICAvLyAjMzogU3BlaWNoZXJlIGltIFNraWxsIChhbHNvIFNwaWVsZXIpIGVpbmUgT3B0aW9uIGZ1ZXIgZGllc2VuIFNraWxsCisgICAgLy8gVm9ydGVpbDogZGllc2VyIEVpbnRyYWcgd2lyZCBkZW0gU3BlbGwgaW1tZXIgdWViZXJnZWJlbgorICAgIGNhc3Rlci0+TW9kaWZ5U2tpbGwoImJsaXR6IiwgKFsia2xlcnVzX3NwZWxsX29wdGlvbiI6IDJdKSk7CisKKyAgICAoQ29kZSBpbiAvZG9jL2JlaXNwaWVsZS90ZXN0b2JqZWt0ZS9tb2RpZnlza2lsbHNwZWxsX3Rlc3QpCisgICAgLy8gIzQ6IExlcm5lIGVpbmVuIHVuYWJoYWVuZ2lnZW4gU3BlbGw6IEFDSFRVTkcKKyAgICAvLyBkaWVzZXIgU3BlbGwgZnVua3Rpb25pZXJ0IG51ciBzb2xhbmdlLCB3aWUgZGllIENsb3N1cmUgZXhpc3RpZXJ0LAorICAgIC8vIFNJX1NLSUxMQUJJTElUWSB1bmQgU3BlbGwgYmxlaWJlbiBqZWRvY2ggaW0gU3BpZWxlciBnZXNwZWljaGVydCAoISkKKyAgICB0aGlzX3BsYXllcigpLT5Nb2RpZnlTa2lsbCgiZm5yeCIsCisgICAgICAoW1NJX0NMT1NVUkU6CisgICAgICAgICAgZnVuY3Rpb24gaW50IChvYmplY3QgY2FzdGVyLCBzdHJpbmcgc2tpbGwsIG1hcHBpbmcgc2luZikgeworICAgICAgICAgICAgY2FzdGVyLT5MZWFyblNraWxsKCJmbnJ4IiwgMSk7CisgICAgICAgICAgICB0ZWxsX29iamVjdChjYXN0ZXIsICJQZW5nISBEZWluIFNraWxsd2VydCBzdGVpZ3QgYXVmICIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3Rlci0+UXVlcnlTa2lsbEFiaWxpdHkoImZucngiKSsiLlxuIik7CisgICAgICAgICAgICByZXR1cm4gRVJGT0xHOworICAgICAgICAgIH0sCisgICAgICAgIFNJX1NLSUxMQUJJTElUWTogODQzMl0pLAorICAgICAgMTAwLAorICAgICAgIkFOWSIpOworCitTSUVIRSBBVUNIOgorICAgIFNraWxscyBMZXJuZW46ICBMZWFyblNraWxsLCBMaW1pdEFiaWxpdHkKKyAgICAqIE51dHp1bmc6ICAgICAgVXNlU3BlbGwsIFVzZVNraWxsCisgICAgKiBBYmZyYWdlbjogICAgIFF1ZXJ5U2tpbGwsIFF1ZXJ5U2tpbGxBYmlsaXR5CisgICAgKiBNb2RpZmlrYXRpb246IE1vZGlmeVNraWxsQXR0cmlidXRlLCBRdWVyeVNraWxsQXR0cmlidXRlLAorICAgICAgICAgICAgICAgICAgICBRdWVyeVNraWxsQXR0cmlidXRlTW9kaWZpZXIsIFJlbW92ZVNraWxsQXR0cmlidXRlTW9kaWZpZXIKKyAgICAgICogUHJvcGVydGllczogUF9TS0lMTF9BVFRSSUJVVEVTLCBQX1NLSUxMX0FUVFJJQlVURV9PRkZTRVRTCisgICAgKiBzb25zdGlnOiAgICAgIHNwcnVjaGVybXVlZHVuZworICAgICogUHJvcGVydGllczogICBQX05FV1NLSUxMUworCiszLiBPa3QgMjAxMSBHbG9pbnNvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL01vZGlmeVNraWxsQXR0cmlidXRlIGIvZG9jL2xmdW4vTW9kaWZ5U2tpbGxBdHRyaWJ1dGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTViMzY2OQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL01vZGlmeVNraWxsQXR0cmlidXRlCkBAIC0wLDAgKzEsMTA1IEBACitNb2RpZnlTa2lsbEF0dHJpYnV0ZSgpCitGVU5LVElPTjoKKyAgICBwdWJsaWMgaW50IE1vZGlmeVNraWxsQXR0cmlidXRlKHN0cmluZyBhdHJuYW1lLCBtaXhlZCB2YWx1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHVyYXRpb24pCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3RkL2xpdmluZy9za2lsbF9hdHRyaWJ1dGVzLmMKKworQVJHVU1FTlRFOgorICAgIDxhdHJuYW1lPiAgIHN0cmluZworICAgICAgICAgICAgICAgIE5hbWUgZGVzIHp1IHZlcmFlbmRlcm5kZW4gQXR0cmlidXRlcworICAgICAgICAgICAgICAgIChEZWZpbmllcnQgaW4gL3N5cy9saXZpbmcvc2tpbGxfYXR0cmlidXRlcy5oKQorCisgICAgPHZhbHVlPiAgICAgaW50IG9kZXIgY2xvc3VyZQorICAgICAgICAgICAgICAgIFdlcnQgZGVzIE1vZGlmaWthdG9ycworICAgICAgICAgICAgICAgIG9kZXIKKyAgICAgICAgICAgICAgICBlaW5lIENsb3N1cmUsIHdlbGNoZSBiZWkgQWJmcmFnZSBkZXMgYmV0cmVmZmVuZGVuIFNBcworICAgICAgICAgICAgICAgIGFiZ2VmcmFndCB1bSBkZW4gTW9kaWZpa2F0b3IgenUgYmVzdGltbWVuLgorCisgICAgPGR1cmF0aW9uPiAgaW50CisgICAgICAgICAgICAgICAgRGF1ZXIgaW4gU2VrdW5kZW4KKworQkVTQ0hSRUlCVU5HOgorICAgIEFlbmRlcnQgdGVtcG9yYWVyLCBkLmguIGZ1ZXIgZWluZSBiZXN0aW1tdGUgWmVpdCwgZWluIFNraWxsLUF0dHJpYnV0CisgICAgZWluZXMgTGViZXdlc2VuLCBpbmRlbSBlaW4gTW9kaWZpa2F0b3IgaGluenVnZWZ1ZWd0IHdpcmQuCisgICAgCisgICAgRGVyIFN0YW5kYXJkd2VydCBlaW5lcyBTQSB3aXJkIHZvbiBQX1NLSUxMX0FUVFJJQlVURV9PRkZTRVRTIGZlc3RnZWxlZ3QKKyAgICBvZGVyIGlzdCAxMDAsIHdlbm4gYmVzYWd0ZSBQcm9wZXJ0eSBsZWVyIGlzdC4KKyAgICBBbGxlIE1vZGlmaWthdG9yZW4gKG5lZ2F0aXYgd2llIHBvc2l0aXYpIHdlcmRlbiBhZGRpZXJ0IHVuZCBiaWxkZW4KKyAgICB6dXNhbW1lbiBtaXQgZGVtIFN0YW5kYXJkd2VydCBlaW5lIEdlc2FtdHN1bW1lLgorICAgIEJlaSBhbGxlbiBTQXMgYXVzc2VyIFNBX1FVQUxJVFkgd2lyZCBkaWVzZSBHZXNhbXRzdW1tZSBub2NoIG1pdAorICAgIFNBX1FVQUxJVFkgKHdlbGNoZXMgc2ljaCBkYW1pdCBhdWYgYWxsZSBhbmRlcmVuIFNraWxsLUF0dHJpYnV0ZQorICAgIGF1c3dpcmt0KSBtdWx0aXBsaXppZXJ0IHVuZCBkYXMgRXJnZWJuaXMgc3RlbGx0IGRlbiBFbmR3ZXJ0IGRlcyBTQSBkYXIuCisgICAgKEJlaXNwaWVsIHMudS4pCisKKyAgICBEZXIgV2VydCBlaW5lcyBNb2RpZmlrYXRvcnMgbXVzcyB6d2lzY2hlbiAtMTAwMCB1bmQgMTAwMCBsaWVnZW4uIERlcgorICAgIEdlc2FtdHdlcnQgZWluZXMgU0Ega2FubiAxMCBuaWNodCB1bnRlci0gdW5kIDEwMDAgbmljaHQgdWViZXJzY2hyZWl0ZW4uCisKKyAgICBGYWxsZSA8dmFsdWU+IGVpbmUgQ2xvc3VyZSBpc3QsIHdpcmQgZGllc2UgQ2xvc3VyZSBqZWRlc21hbAorICAgIGF1c2dlZnVlaHJ0LCB3ZW5uIGRhcyBlbnRzcHJlY2hlbmRlIFNBIGFiZ2VmcmFndCB3aXJkLiBEZXIKKyAgICBSdWVja2dhYmV3ZXJ0IGRpZXNlciBDbG9zdXJlIHN0ZWxsdCBkYW5uIGRlbiBXZXJ0IGRlcyBNb2RpZmlrYXRvcnMKKyAgICBkYXIuIEF1Y2ggZGllc2VyIG11c3Mgendpc2NoZW4gLTEwMDAgdW5kIDEwMDAgbGllZ2VuLiBHaWJ0IGRpZQorICAgIENsb3N1cmUga2VpbmVuIGludCB6dXJ1ZWNrLCB3aXJkIGRlciBNb2RpZmlrYXRvciBnZWxvZXNjaHQuCisKKyAgICBHdWVsdGlnZSBTa2lsbC1BdHRyaWJ1dGUgc2luZCBtb21lbnRhbjoKKyAgICAqIFNBX1FVQUxJVFk6ICAgIEFsbGdlbWVpbmUgUXVhbGl0YWV0OiB3aXJrdCBzaWNoIGF1ZiBhbGxlIGFuZGVyZW4KKyAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZSBhdWNoIGF1cyAobXVsdHBsaWthdGl2IGF1ZiBCYXNpcyAxMDApCisgICAgKiBTQV9EQU1BR0U6ICAgICBTY2hhZGVuLCBkZW4gZGFzIExlYmV3ZXNlbiBtYWNodAorICAgICogU0FfU1BFRUQ6ICAgICAgR2VzY2h3aW5kaWdrZWl0IGRlcyBMZWJld2VzZW5zICh6QiBBbmdyaWZmZS9SdW5kZSkKKyAgICAqIFNBX0RVUkFUSU9OOiAgIFNwZWxsLS9Ta2lsbGRhdWVyCisgICAgKiBTQV9FTkVNWV9TQVZFOiBpZGVudGlzY2ggenUgU0FfU1BFTExfUEVORVRSQVRJT04gKE9CU09MRVQhKQorICAgICogU0FfU1BFTExfUEVORVRSQVRJT046IENoYW5jZSBkZXMgX0Nhc3RlcnNfLCBlaW5lbiBTcGVsbCBkdXJjaCBlaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQX05PTUFHSUMgZHVyY2h6dWtyaWVnZW4uCisgICAgKiBTQV9SQU5HRTogICAgICBSZWljaHdlaXRlIGRlcyBMZWJld2VzZW5zIChlaGVyIHVuYmVudXR6dCkKKyAgICAqIFNBX0VYVEVOU0lPTjogICJBdXNkZWhudW5nIiBiZWkgR3J1cHBlbi0vRmxhZWNoZW5zcGVsbHM6IEZpbmRHcm91cE4vUAorCitSVUVDS0dBQkVXRVJUOgorICAgIFNBX01PRF9PSyAgICAgICAgICAgICAgd2VubiBkZXIgTW9kaWZpa2F0b3IgZ2VzZXR6dCB3dXJkZQorICAgIFNBX1RPT19NQU5ZX01PRFMgICAgICAgd2VubiBkaWUgbWF4LiBBbnphaGwgYW4gTW9kcyBzY2hvbiBlcnJlaWNodCBpc3QuCisgICAgU0FfTU9EX1RPT19TTUFMTCAgICAgICB3ZW5uIGRlciBNb2RpZmlrYXRvciB6dSBrbGVpbiBpc3QgCisgICAgU0FfTU9EX1RPT19CSUcgICAgICAgICB3ZW5uIGRlciBNb2RpZmlrYXRvciB6dSBncm9zcyBpc3QKKyAgICBTQV9NT0RfSU5WQUxJRF9BVFRSICAgIHdlbm4gZGFzIGdld3VlbnNjaHRlIFNBIGdhciBuaWNodCBleGlzdGllcnQKKyAgICBTQV9NT0RfSU5WQUxJRF9PQkpFQ1QgIHdlbm4gZGFzIHNldHplbmRlIE9iamVrdCB1bmd1ZWx0aWcgaXN0CisgICAgU0FfTU9EX0lOVkFMSURfVkFMVUUgICB3ZW5uIGRlciBNb2RpZmlrYXRvciB1bmd1ZWx0aWcgaXN0CisgICAgV2VubiBtYW4gbnVyIHdpc3NlbiB3aWxsLCBvYiBkaWUgT3BlcmF0aW9uIGVyZm9sZ3JlaWNoIHdhciwgZW1wZmllaGx0CisgICAgZXMgc2ljaCwgYXVmID09IFNBX01PRF9PSyB6dSBwcnVlZmVuLgorCitCRU1FUktVTkdFTjoKKyAgICBOYWNoZGVtIGVpbiBPYmpla3QsIHdlbGNoZXMgTW9kaWZpa2F0b3JlbiBzZXR6dGUsIHplcnN0b2VydCB3dXJkZSwKKyAgICB3ZXJkZW4gZGllIE1vZGlmaWthdG9yZW4gc3BhZXRlc3RlbnMgdW5ndWVsdGlnLCBzb2JhbGQgaW4gZGVtCisgICAgbWFuaXB1bGllcnRlbiBMZWJld2VzZW4gZXJuZXV0IE1vZGlmeVNraWxsQXR0cmlidXRlKCkgZ2VydWZlbiB3aXJkIQorICAgIEJlaSBDbG9zdXJlcyBpc3QgZGVyIE1vZCBzb2ZvcnQgd2VnLgorCitCRUlTUElFTEU6CisgICAgLy8gc2VpIFBMIGVpbiBTcGllbGVyLCBkZW4gbWVpbiBOUEMgc2Nod2FlY2hlbiB3aWxsOgorICAgIFBMLT5Nb2RpZnlTa2lsbEF0dHJpYnV0ZShTQV9RVUFMSVRZLCAtNzUsIDEzKTsKKyAgICAvLyBGdWVyIDEzcyB3aXJkIFNBX1FVQUxJVFkgdW0gNzUgcmVkdXppZXJ0LiBEaWVzIHdpcmt0IHNpY2ggYXVmIGFsbGUKKyAgICAvLyBhbmRlcmVuIFNBcyBhdXMhIChzLiBkcml0dGVzIEJlaXNwaWVsKQorCisgICAgLy8gc2VpIFBMIGVpbiBMZWJld2VzZW4sIHdlbGNoZW0gaWNoIGZ1ZXIgMTFzIDIgU2NobGFlZ2UgcHJvIEthbXBmcnVuZGUKKyAgICAvLyB6dXNhZXR6bGljaCBnZWJlbiBtb2VjaHRlOgorICAgIFBMLT5Nb2RpZnlTa2lsbEF0dHJpYnV0ZShTQV9TUEVFRCwgMjAwLCAxMSk7CisgICAgLy8gd2VubiBrZWluZSB3ZWl0ZXJlcyBNb2RpZmlrYXRvcmVuIHdpcmtlbiwgaGF0IFBMIGpldHp0IDMgU2NobGFlZ2UKKyAgICAvLyBwcm8gS2FtcGZydW5kZSAoQmFzaXN3ZXJ0IDEwMCArIDIwMCA9PSAzMDAgPT4gMykuCisKKyAgICBBbmdlbm9tbWVuLCBlaW4gTGViZXdlc2VuIGhhdCBlaW5lbiBCYXNpc3dlcnQgdm9uIDEzMCBhdWYgU0FfU1BFRUQgdW5kCisgICAgMTAwIGF1ZiBTQV9RVUFMSVRZIChQX1NLSUxMX0FUVFJJQlVURV9PRkZTRVRTKSB1bmQgbnVuIDMgTW9kaWZpa2F0b3JlbgorICAgIGdlc2V0enQ6IFNBX1NQRUVEICsxMDAsIFNBX1NQRUVEIC0zMCB1bmQgU0FfUVVBTElUWSB2b24gLTEwOgorICAgIFp1bmFlY2hzdCB3aXJkIFNBX1FVQUxJVFkgYmVzdGltbXQ6IDEwMCAtIDEwID0gOTAgID0+IDAuOQorICAgIEFuc2NobGllc3NlbmQgd2lyZCBTQV9TUEVFRCBiZXN0aW1tdDogMTMwICsgMTAwIC0gMzAgPSAyMDAgPT4gMgorICAgIE51biB3aXJkIFNBX1NQRUVEIG5vY2ggbWl0IFNBX1FVQUxJVFkgbXVsdGlwbGl6aWVydDogMiAqIDAuOSA9IDEuOAorICAgIERhcyBMZWJld2VzZW4gaGF0IG51biBhbHNvIGltIEVuZGVmZmVrdCAxLjggU2NobGFlZ2UgcHJvIEthbXBmcnVuZGUuCisKKyAgICAKK1NJRUhFIEFVQ0g6CisgICAgU2tpbGxzIExlcm5lbjogIExlYXJuU2tpbGwsIE1vZGlmeVNraWxsLCBMaW1pdEFiaWxpdHkKKyAgICAqIE51dHp1bmc6ICAgICAgVXNlU3BlbGwsIFVzZVNraWxsCisgICAgKiBBYmZyYWdlbjogICAgIFF1ZXJ5U2tpbGwKKyAgICAqIE1vZGlmaWthdGlvbjogUXVlcnlTa2lsbEF0dHJpYnV0ZSwKKyAgICAgICAgICAgICAgICAgICAgUXVlcnlTa2lsbEF0dHJpYnV0ZU1vZGlmaWVyLCBSZW1vdmVTa2lsbEF0dHJpYnV0ZU1vZGlmaWVyCisgICAgICAqIFByb3BlcnRpZXM6IFBfU0tJTExfQVRUUklCVVRFUywgUF9TS0lMTF9BVFRSSUJVVEVfT0ZGU0VUUworICAgICogc29uc3RpZzogICAgICBzcHJ1Y2hlcm11ZWR1bmcsIHNraWxsX2luZm9fbGlzdGUKKyAgICAqIFByb3BlcnRpZXM6ICAgUF9ORVdTS0lMTFMKKworNS4gT2t0IDIwMTEgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL01vcmUgYi9kb2MvbGZ1bi9Nb3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNzNmYTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9Nb3JlCkBAIC0wLDAgKzEsNTYgQEAKK01vcmUoKQorCitGVU5LVElPTjoKKyAgICAgdmFyYXJncyBwdWJsaWMgdm9pZCBNb3JlKHN0cmluZyB0eHQsIGludCBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZWQgY3RybCwgbWl4ZWQgKmN0cmxhcmdzLCBpbnQgZmxhZ3MpOworCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvdXRpbC9wYWdlci5jCisKK0FSR1VNRU5URToKKyAgICAgdHh0ICAtIGVudHdlZGVyIGVpbiBUZXh0IGRlciBhdXNnZWdlYmVuIHdlcmRlbiBzb2xsLCBvZGVyIGVpbiBmaWxlbmFtZS4KKyAgICAgZmlsZSAtIGRhcyBmbGFnIGZpbGUgZ2lidCBhbiwgb2IgZXMgc2ljaCBiZWkgPHR4dD4gdW0gZWluZW4gdGV4dCBvZGVyCisgICAgICAgICAgICBlaW5lbiBGaWxlbmFtZW4gaGFuZGVsdC4gQmVpIGVpbmVtIEZpbGVuYW1lbiB3aXJkIGRlciBJbmhhbHQKKyAgICAgICAgICAgIGRpZXNlcyBGaWxlcyBlaW5nZWxlc2VuIHVuZCBhdXNnZWdlYmVuLgorICAgICBjdHJsIC0gRWluZSBjbG9zdXJlLCBkaWUgYXVmZ2VydWZlbiB3aXJkLCBmYWxscyBrZWluIDx0eHQ+IGFuZ2VnZWJlbgorICAgICAgICAgICAgd3VyZGUuCisgICAgIGN0cmxhcmdzIC0gY3RybGFyZ3Mgd2lyZCBhbHMgUGFyYW1ldGVyIGFuIGN0cmwgdWViZXJnZWJlbi4KKyAgICAgZmxhZ3MgLSBmbGFncyB3aXJkIG1pdCBkZW4gaW0gU3BpZWxlciBkZWZpbmllcnRlbiBQX01PUkVfRkxBR1MKKyAgICAgICAgICAgICBrb21iaW5pZXJ0LgorCitCRVNDSFJFSUJVTkc6CisKKyAgICAgTW9yZSgpIGRpZW50IGRlciBBdXNnYWJlIHZvbiBUZXh0ZW4gYW4gU3BpZWxlci4gTWl0IEhpbGZlIGVpbmVzCisgICAgIFBMLT5Nb3JlKHR4dCkgb2RlciBQTC0+TW9yZSh0eHQsIDEpIGlzdCBlcyBzZWhyIGVpbmZhY2ggbGFlbmdlcmUgVGV4dGUKKyAgICAgYW4gU3BpZWxlciBhdXN6dWdlYmVuLiBCZWkgZGVyIEF1c2dhYmUgd2VyZGVuIGRpZSBwZXJzb2VubGljaGVuCisgICAgIEVpbnN0ZWxsdW5nZW4gZGVzIFNwaWVsZXJuICh3aWUgei5iLiBaZWlsZW4gcHJvIEJpbGRzY2hpcm1zZWl0ZSkKKyAgICAgYXV0b21hdGlzY2ggYmVydWVja3NpY2h0aWd0IHVuZCBkZXIgVGV4dCBkYWR1cmNoIGdnZi4gemVyc3R1ZWNrZWx0CisgICAgIHVuZCBpbiBtZWhyZXJlbiBTY2hyaXR0ZW4gbmFjaGVpbmFuZGVyIGFuZ2V6ZWlndC4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICAga2VpbmVyCisKK0JFTUVSS1VOR0VOOgorICAgICBCZWltIGVpbmxlc2VuIGRlcyBGaWxlcyBzaW5kIGRpZSBMZXNlcmVjaHRlIGRlcyBTcGllbGVyIGluIGRlbSBNb3JlKCkKKyAgICAgYXVmZ2VydWZlbiB3aXJkIHZvbiBCZWRldXR1bmcgdW5kIG5pY2h0IGRpZSBSZWNodGUgZGVzIE9iamVrdGVzIGRhcworICAgICBNb3JlKCkgYXVmcnVmdC4gU3BpZWxlcm9iamVrdGUgaGFiZW4gaW0gTW9yZ2VuR3JhdWVuIGplZG9jaCBudXIgc2VocgorICAgICBlaW5nZXNjaHJhZW5rdGUgTGVzZXJlY2h0ZSEgQXVzZ2VnZWJlbiB3ZXJkZW4ga29lbm5lbiBudXIgZmlsZXMKKyAgICAgYXVzIC9wLyosIC9naWxkZW4vKiB1bmQgL2QvKiBkaWUgX2tlaW5lbl8gY29kZSBlbnRoYWx0ZW4uIEFscyBDb2RlCisgICAgIHdpcmQgaGllcmJlaSBqZWRlcyBGaWxlIGJldHJhY2h0ZXQgZGFzIGFscyB2b3JsZXR6dGVzIFplaWNoZW4gZWluZW4gLgorICAgICBoYXQgKGFsc28gLmMsIC5oLCAubyB1c3cuKS4KKyAgICAgV2lsbCBtYW4gYXVzIGlyZ2VuZHdlbGNoZW4gR3J1ZW5kZW4gZWluIEZpbGUgKHouYi4gYXVzIC9wbGF5ZXJzLykKKyAgICAgYXVzZ2ViZW4sIHNvIHNvbGx0ZSBtYW4gc3RhdHRkZXNzZW4gZm9sZ2VuZGVzIHZlcndlbmRlbjoKKyAgICAgdGhpc19wbGF5ZXIoKS0+TW9yZShyZWFkX2ZpbGUoZmlsZW5hbWUpKQorCitCRUlTUElFTEU6CisKKyAgICAgLy8gQXVzZ2FiZSBlaW5lcyBub3JtYWxlbiB0ZXh0ZXMuLi4KKyAgICAgdGhpc19wbGF5ZXIoKS0+TW9yZSgiRWluZmFjaCBudXIgbWFsIHNvIGVpbiBUZXN0Li4uXG4iKTsKKworICAgICAvLyBBdXNnYWJlIGVpbmVzIGtvbXBsZXR0ZW4gZmlsZXMKKyAgICAgdGhpc19wbGF5ZXIoKS0+TW9yZSgiL2V0Yy9XSVpSVUxFUyIsIDEpOworCitTSUVIRSBBVUNIOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBNb24gRmViIDIyIDE1OjA5OjE4IDE5OTkgYnkgUGFkcmVpYwpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vTlBDX0tpbGxlZF9ieSBiL2RvYy9sZnVuL05QQ19LaWxsZWRfYnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzczOTJiYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL05QQ19LaWxsZWRfYnkKQEAgLTAsMCArMSwxMyBAQAorRlVOS1RJT046CisJdm9pZCBOUENfS2lsbGVkX0J5KG9iamVjdCBwbCkKKwkKK0FSR1VNRU5URToKKwlTcGllbGVyLCBkZXIgZWluZW4gTlBDIGdla2lsbHQgaGF0LgorCQorQkVTQ0hSRUlCVU5HOgorCVdpcmQgaW4gZGVyIEdpbGRlIGRlcyBTcGllbGVycyBhdWZnZXJ1ZmVuLAorCXdlbm4gZGllc2VyIGVpbmVuIE5QQyBnZWtpbGx0IGhhdC4KKwkKK1JVRUNLR0FCRVdFUlQ6CisJS2VpbmVyCisJCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9OYW1lIGIvZG9jL2xmdW4vTmFtZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzRhYzY4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vTmFtZQpAQCAtMCwwICsxLDI4IEBACitOYW1lKCkKKworRlVOS1RJT046CisgICAgIHZhcmFyZ3Mgc3RyaW5nIE5hbWUoaW50IGNhc3VzLCBpbnQgZGVtb24pOworCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvdGhpbmcvZGVzY3JpcHRpb24uYworCitBUkdVTUVOVEU6CisgICAgIGNhc3VzCisgICAgICAgICAgRGVyIEZhbGwsIGluIGRlbSBkZXIgTmFtZSBkZWtsaW5pZXJ0IHdlcmRlbiBzb2xsLgorICAgICBkZW1vbgorICAgICAgICAgIEdpYnQgYW4sIG9iIGRlciBOYW1lIG1pdCBiZXN0aW1tdGVtIG9kZXIgdW5iZXN0aW1tdGVtIEFydGlrZWwKKyAgICAgICAgICB2ZXJzZWhlbiB3ZXJkZW4gc29sbDoKKyAgICAgICAgICAgICArIGRlbW9uID0gMDogVW5iZXN0aW1tdGVyIEFydGlrZWwuCisgICAgICAgICAgICAgKyBkZW1vbiA9IDE6IEJlc3RpbW10ZXIgQXJ0aWtlbC4KKyAgICAgICAgICAgICArIGRlbW9uID0gMjogRmluZGUgc2VsYnN0IGhlcmF1cywgb2IgZWluIGJlc3RpbW10ZXIgb2RlciBlaW4KKyAgICAgICAgICAgICAgIHVuYmVzdGltbXRlciBBcnRpa2VsIHZlcndlbmRldCB3ZXJkZW4gc29sbC4KKworQkVTQ0hSRUlCVU5HOgorICAgICBEaWVzZXIgRnVua3Rpb25zYXVmcnVmIGlzdCBlaW4gQWxpYXMgZnVlciAKKyAgICAgY2FwaXRhbGl6ZSggbmFtZSggY2FzdXMsIGRlbW9uICkgKQorCitTSUVIRSBBVUNIOgorICAgICBuYW1lKCksIC9zdGQvdGhpbmcvZGVzY3JpcHRpb24uYworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBTYXQgQXVnICAzIDExOjI0OjA2IDIwMDIgYnkgVmFuaW9uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9OZXdEb29yIGIvZG9jL2xmdW4vTmV3RG9vcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWY1Nzk2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vTmV3RG9vcgpAQCAtMCwwICsxLDIyMyBAQAorRlVOS1RJT046CisgICAgIHZhcmFyZ3MgaW50IE5ld0Rvb3Ioc3RyaW5nfHN0cmluZyogY21kcywgc3RyaW5nIGRlc3QsIHN0cmluZ3xzdHJpbmcqIGlkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nfDxpbnR8c3RyaW5nfHN0cmluZyo+KiBwcm9wcyk7CitERUZJTklFUlQgSU46CisgICAgIC9zdGQvcm9vbS9kb29ycy5jCisKK0FSR1VNRU5URToKKyAgICAgY21kcyAoc3RyaW5nfHN0cmluZyopCisgICAgICAgICAgU3RyaW5nIG9kZXIgQXJyYXkgdm9uIFN0cmluZ3MgbWl0IGRlbiBCZWZlaGxlbiwgbWl0IGRlbmVuIG1hbgorICAgICAgICAgIGR1cmNoIGRpZSBUdWVyIGdlaHQgKGluIGRlciBSZWdlbCBSaWNodHVuZ2VuIHdpZSAibm9yZGVuIikuCisgICAgIGRlc3QgKHN0cmluZykKKyAgICAgICAgICBQZmFkIGRlcyBaaWVscmF1bWVzLCBPSE5FICIuYyIsIHNvbnN0IHdpcmQgZWluZSB6d2Vpc2VpdGlnZSBUdWVyCisgICAgICAgICAgKHdpZSBzaWUgdWVibGljaCBpc3QpIG5pY2h0IGFscyBzb2xjaGUgZXJrYW5udC4KKyAgICAgaWRzIChzdHJpbmd8c3RyaW5nKikKKyAgICAgICAgICBTdHJpbmcgb2RlciBBcnJheSB2b24gU3RyaW5ncyBtaXQgZGVuIEJlemVpY2huZXJuIGRlciBUdWVyLiBLYW5uCisgICAgICAgICAgYXVjaCAwIHNlaW47IGluIGRpZXNlbSBGYWxsIGxhZXNzdCBzaWNoIGRpZSBUdWVyIG51ciBhbHMgInR1ZXIiCisgICAgICAgICAgYW5zcHJlY2hlbi4KKyAgICAgcHJvcHMgKG1hcHBpbmd8PGludHxzdHJpbmd8c3RyaW5nKj4qKQorICAgICAgICAgIERpZSBFaWdlbnNjaGFmdGVuIGRlciBUdWVyIChzLnUuKS4KKworQkVTQ0hSRUlCVU5HOgorICAgICBFcyB3aXJkIGVpbmUgbmV1ZSBUdWVyIGdlc2NoYWZmZW4uIERpZSBUdWVyIGxhZXNzdCBzaWNoLCB3ZW5uIHNpZQorICAgICBnZW9lZmZuZXQgaXN0LCBtaXQgZGVuIGluIDxjbWRzPiBhbmdlZ2ViZW5lbiBCZWZlaGxlbiBkdXJjaHNjaHJlaXRlbi4KKyAgICAgTWFuIGdlbGFuZ3QgZGFubiBpbiBkZW4gUmF1bSA8ZGVzdD4uCisKKyAgICAgRGllIEtvbW1hbmRvcyB3ZXJkZW4gYmVpIGdlb2VmZm5ldGVyIFR1ZXIgaW4gZGllIExpc3RlIGRlciBzaWNodGJhcmVuCisgICAgIEF1c2dhZW5nZSBlaW5nZWZ1ZWd0LgorCisgICAgIEluIDxwcm9wcz4gbGFzc2VuIHNpY2ggQXVzc2VoZW4gdW5kIEVpZ2Vuc2NoYWZ0ZW4gZGVyIFR1ZXIgZmVzdGxlZ2VuLgorICAgICBIaXN0b3Jpc2NoIGlzdCBlcyBlaW4gQXJyYXkgbWl0IFBhYXJlbiB2b24gU2NobHVlc3NlbG4gdW5kIFdlcnRlbiwgZC5oLgorICAgICBlcyBrb21tdCBpbW1lciBlcnN0IGVpbiBFbGVtZW50LCB3ZWxjaGVzIGRpZSBFaWdlbnNjaGFmdCBiZXplaWNobmV0IHVuZAorICAgICBkYW5uIGVpbiBFbGVtZW50IG1pdCBkZW0gV2VydCBkaWVzZXIgRWlnZW5zY2hhZnQuCisgICAgIE1vZGVybmVyIGlzdCBlcywgZWluIE1hcHBpbmcgbWl0IGRlbiBlbnRzcHJlY2hlbmRlbiBTY2hsdWVzc2VsbiB1bmQKKyAgICAgV2VydGVuIHp1IHVlYmVyZ2ViZW4uIERpZXMgaXN0IGF1Y2ggZHJpbmdlbmQgZW1wZm9obGVuLgorCisgICAgIEluIDxkb29ycm9vbS5oPiBzaW5kIGRhenUgZm9sZ2VuZGUgRWlnZW5zY2hhZnRlbiBkZWZpbmllcnQ6CisgICAgIERfRkxBR1MKKyAgICAgICAgICBET09SX09QRU4KKyAgICAgICAgICAgICAgIERpZSBUdWVyIGlzdCBiZWltIEVyemV1Z2VuIGdlb2VmZm5ldC4KKyAgICAgICAgICBET09SX0NMT1NFRAorICAgICAgICAgICAgICAgRGllIFR1ZXIgaXN0IGJlaW0gRXJ6ZXVnZW4gZ2VzY2hsb3NzZW4uCisgICAgICAgICAgRE9PUl9ORUVES0VZCisgICAgICAgICAgICAgICBNYW4gYmVub2V0aWd0IGVpbmVuIFNjaGx1ZXNzZWwgenVtIE9lZmZuZW4gZGVyIFR1ZXIuCisgICAgICAgICAgRE9PUl9DTE9TRUtFWQorICAgICAgICAgICAgICAgTWFuIGJlbm9ldGlndCBlaW5lbiBTY2hsdWVzc2VsIHp1bSBTY2hsaWVzc2VuIGRlciBUdWVyLgorICAgICAgICAgIERPT1JfUkVTRVRfQ0wKKyAgICAgICAgICAgICAgIERpZSBUdWVyIHNjaGxpZXNzdCBzaWNoIGJlaW0gUmVzZXQuCisgICAgICAgICAgRE9PUl9SRVNFVF9PUAorICAgICAgICAgICAgICAgRGllIFR1ZXIgb2VmZm5ldCBzaWNoIGJlaW0gUmVzZXQuCisKKyAgICAgRF9MT05HCisgICAgICAgICAgRGllIExhbmdiZXNjaHJlaWJ1bmcgZGVyIFR1ZXIuIAorICAgICAgICAgIEhpZXIga2FubiBlaW4gTWFwcGluZyBlaW5nZXRyYWdlbiB3ZXJkZW4sIGRhcyBhbHMgS2V5cyBkZW4gVHVlci0KKyAgICAgICAgICBTdGF0dXMgaGF0IHVuZCBkaWUgenVnZWhvZXJpZ2UgTGFuZ2Jlc2NocmVpYnVuZyBkYXp1LiBCZWlzcGllbDoKKyAgICAgICAgICAoWyBEX1NUQVRVU19DTE9TRUQgOiAiRGllIFR1ZXIgaXN0IGdlc2NobG9zc2VuLlxuIiwKKyAgICAgICAgICAgICBEX1NUQVRVU19PUEVOICAgOiAiRGllIFR1ZXIgaXN0IG9mZmVuLlxuIiBdKQorICAgICAgICAgIAorICAgICAgICAgIERlZmF1bHQ6ICJFaW5lIFR1ZXIuXG4iCisKKyAgICAgRF9TSE9SVAorICAgICAgICAgIERpZSBLdXJ6YmVzY2hyZWlidW5nIGRlciBUdWVyLiBFaW4gIiVzIiB3aXJkIGR1cmNoICJnZW9lZmZuZXQiCisgICAgICAgICAgYnp3LiAiZ2VzY2hsb3NzZW4iIGVyc2V0enQuCisKKyAgICAgICAgICBFcyB3ZXJkZW4gZGllIEt1cnpiZXNjaHJlaWJ1bmdlbiBhbGxlciBpbSBSYXVtIHZvcmhhbmRlbmVuIFR1ZXJlbgorICAgICAgICAgIGFuZWluYW5kZXJnZWhhZW5ndCAoZXMgd2lyZCBqZXdlaWxzIGVpbiBMZWVyemVpY2hlbiBlaW5nZXNjaG9iZW4pLAorICAgICAgICAgIGRhcyBHYW56ZSBtaXQgYnJlYWtfc3RyaW5nKCkgdW1nZWJyb2NoZW4gdW5kIGFuIFBfSU5UX0xPTkcKKyAgICAgICAgICBhbmdlaGFlbmd0LgorCisgICAgICAgICAgRGVmYXVsdDogIkVpbmUgJXNlIFR1ZXIuIgorCisgICAgIERfTkFNRQorICAgICAgICAgIERlciBOYW1lIGRlciBUdWVyLiBEaWVzZXIgTmFtZSB3aXJkIGJlaW0gT2VmZm5lbiB1bmQgU2NobGllc3NlbgorICAgICAgICAgIGRlciBUdWVyIHNvd2llIGJlaSBGZWhsZXJtZWxkdW5nZW4gYXVzZ2VnZWJlbi4gTWFuIGthbm4gd2llIGJlaQorICAgICAgICAgIFBfTkFNRSBlaW5lbiBTdHJpbmcgb2RlciBlaW4gQXJyYXkgdm9uIFN0cmluZ3MgYW5nZWJlbi4KKworICAgICAgICAgIERlZmF1bHQ6ICJUdWVyIgorCisgICAgIERfR0VOREVSCisgICAgICAgICAgRGFzIEdlc2NobGVjaHQgZGVyIFR1ZXIuCisKKyAgICAgICAgICBEZWZhdWx0OiBGRU1BTEUKKworICAgICBEX01TR1MKKyAgICAgICAgICBTdHJpbmcgb2RlciBBcnJheSB2b24gZHJlaSBTdHJpbmdzLiBEaWVzZSBTdHJpbmdzIHdlcmRlbiBiZWltCisgICAgICAgICAgRHVyY2hzY2hyZWl0ZW4gZGVyIFR1ZXIgYW4gbW92ZSgpIGFscyBkaXIgYnp3LiBkaXIsIHRleHRvdXQgdW5kCisgICAgICAgICAgdGV4dGluIHVlYmVyZ2ViZW4uCisKKyAgICAgRF9GVU5DCisgICAgICAgICAgU3RyaW5nIG1pdCBkZW0gTmFtZW4gZWluZXIgRnVua3Rpb24sIGRpZSBpbSBTdGFydHJhdW0gdm9yIGRlbQorICAgICAgICAgIER1cmNoc2NocmVpdGVuIGRlciBUdWVyIGF1ZmdlcnVmZW4gd2VyZGVuIHNvbGwuIERpZXNlIEZ1bmt0aW9uCisgICAgICAgICAga2FubiBkYXMgRHVyY2hzY2hyZWl0ZW4gamVkb2NoIG5pY2h0IHZlcmhpbmRlcm4hCisKKyAgICAgRF9GVU5DMgorICAgICAgICAgIFN0cmluZyBtaXQgZGVtIE5hbWVuIGVpbmVyIEZ1bmt0aW9uLCBkaWUgaW0gWmllbHJhdW0gbmFjaCBkZW0KKyAgICAgICAgICBEdXJjaHNjaHJlaXRlbiBkZXIgVHVlciBhdWZnZXJ1ZmVuIHdlcmRlbiBzb2xsLgorCisgICAgIERfVEVTVEZVTkMKKyAgICAgICAgICBGYWxscyBhdWYgZGVuIE5hbWVuIGVpbmVyIEZ1bmt0aW9uIGdlc2V0enQsIHdpcmQgZGllc2UgRnVua3Rpb24KKyAgICAgICAgICB2b3IgZGVtIER1cmNoc2NocmVpdGVuIGltIFN0YXJ0cmF1bSBhdWZnZXJ1ZmVuLiBXZW5uIHNpZSBlaW5lbgorICAgICAgICAgIFdlcnQgIT0gMCB6dXJ1ZWNrbGllZmVydCwgd2lyZCBkaWUgVHVlciBOSUNIVCBkdXJjaHNjaHJpdHRlbi4gCisKKyAgICAgRF9SRVNFVF9NU0cKKyAgICAgICAgICBNZWxkdW5nLCBkaWUgYmVpbSBSZXNldCBkZXIgVHVlciBhdXNnZWdlYmVuIHdpcmQuCisKKyAgICAgRF9PUEVOX1dJVEhfTU9WRQorICAgICAgICAgIFR1ZXIgb2VmZm5ldCBhdXRvbWF0aXNjaCBiZWkgRWluZ2FiZSBkZXMgQmVmZWhscyB6dW0gCisgICAgICAgICAgSGluZHVyY2hnZWhlbi4KKyAgICAgICAgICAKK1JVRUNLR0FCRVdFUlQ6CisgICAgIDEsIHdlbm4gZGllIFR1ZXIgb3JkdW5nc2dlbWFlc3MgZWluZ2ViYXV0IHdlcmRlbiBrb25udGUsIHNvbnN0IDAuCisKK0JFTUVSS1VOR0VOOgorICAgICBad2VpIFR1ZXJzZWl0ZW4gZ2VsdGVuIGFscyB2ZXJzY2hpZWRlbmUgU2VpdGVuIGVpbmVyIFR1ZXIsIHdlbm4gYWxzCisgICAgIFppZWwgaW4gUmF1bSBBIFJhdW0gQiB1bmQgaW4gUmF1bSBCIFJhdW0gQSBhbmdlZ2ViZW4gaXN0LiBEZXIgWnVzdGFuZAorICAgICB3aXJkIGFiZ2VmcmFndCwgd2VubiBkZXIgUmF1bSBiZXRyZXRlbiB3aXJkIChpbml0KSwgd2VubiBkaWUgVHVlcgorICAgICBnZW9lZmZuZXQvZ2VzY2hsb3NzZW4gd2lyZCwgUF9JTlRfTE9ORyBvZGVyIFBfRVhJVFMgYWJnZWZyYWd0IHdpcmQKKyAgICAgdW5kIGJlaW0gUmVzZXQuCisKKyAgICAgRXMgc2luZCBhdWNoIFR1ZXJlbiBtb2VnbGljaCwgZGllIG51ciBhdWYgZWluZXIgU2VpdGUgZXhpc3RpZXJlbiwgb2RlcgorICAgICBhdWNoIHNvbGNoZSwgZGllIGF1ZiBiZWlkZW4gU2VpdGVuIHZlcnNjaGllZGVuIGF1c3NlaGVuIG9kZXIgZ2FyIGF1ZgorICAgICBlaW5lciBTZWl0ZSBudXIgbWl0IGVpbmVtIFNjaGx1ZXNzZWwgenUgb2VmZm5lbiBzaW5kLCBhdWYgZGVyIGFuZGVyZW4KKyAgICAgamVkb2NoIGtlaW4gU2NobHVlc3NlbCBub2V0aWcgaXN0LgorCisgICAgIFdlciBhdXMgaXJnZW5kZWluZW0gR3J1bmQgZGVuIFp1c3RhbmQgZWluZXIgVHVlciBzZWxiZXIgYWJmcmFnZW4gb2RlcgorICAgICB2ZXJhZW5kZXJuIHdpbGwsIGthbm4gZGFmdWVyIGluIC9vYmovZG9vcm1hc3RlciBkaWUgRnVua3Rpb25lbgorICAgICBRdWVyeURvb3JTdGF0dXMoemllbCkgYnp3LiBTZXREb29yU3RhdHVzKHppZWwsc3RhdHVzKSBhdWZydWZlbi4KKworICAgICAqKiogQUNIVFVORyAqKioKKyAgICAgRXMgZ2lidCBlaW5lIFF1ZXN0YmVsb2hudW5nIChQaGlvbGUgYXVzIGRlciBTdGVybmVubGljaHQtUXVlc3Qgdm9uCisgICAgIE1pcmlsKSwgbWl0IGRlciBtYW4gZHVyY2ggVHVlcmVuIGhpbmR1cmNoc2NoYXVlbiBrYW5uLiBEZXJ6ZWl0IGlzdCBkYXMKKyAgICAgcGVyIGRlZmF1bHQgZnVlciBhbGxlIFR1ZXJlbiBlcmxhdWJ0LiBXZW5uIG1hbiBkYXMgbmljaHQgbW9lY2h0ZSwKKyAgICAgb2RlciBhbmRlcmUgVGV4dGUgYXVzZ2ViZW4sIGFscyBkaWUgUGhpb2xlIG5vcm1hbGVyd2Vpc2UgZXJ6ZXVndCwKKyAgICAgZGFubiBrYW5uIG1hbiBkaWVzIGR1cmNoIE51dHp1bmcgYmVzdGltbXRlciBGdW5rdGlvbmVuIGJ6dy4gRmxhZ3MKKyAgICAgZXJyZWljaGVuLiBadXIgRG9rdW1lbnRhdGlvbiBzaWVoZSBNYW5wYWdlIHp1IEdldFBoaW9sZW5JbmZvcygpLgorCitCRUlTUElFTEU6CisKKyAgKiogRGllcyBpc3QgZWluZSBnZXdvZWhubGljaGUgVHVlciBvaG5lIEJlc29uZGVyaGVpdGVuIHVuZCBvaG5lCisgICAgIEV4dHJhLUJlc2NocmVpYnVuZzoKKworICAgICBOZXdEb29yKCJzdWVkZW4iLCIvcGxheWVycy9yb2NodXMvcm9vbS90ZXN0MSIpOworCisgICoqIEVpbiBQb3J0YWw6CisKKyAgICAgTmV3RG9vcigibm9yZGVuIiwiL3BsYXllcnMvcm9jaHVzL3Jvb20vdGVzdDIiLAorICAgICAgICAgICAgICJwb3J0YWwiLAorICAgICAgICAgICAgIChbIERfTkFNRTogICAiUG9ydGFsIiwKKyAgICAgICAgICAgICAgICBEX0dFTkRFUjogTkVVVEVSLAorICAgICAgICAgICAgICAgIERfU0hPUlQ6ICAiSW0gTm9yZGVuIHNpZWhzdCBEdSBlaW4gJXNlcyBQb3J0YWwuIiwKKyAgICAgICAgICAgICAgICBEX0xPTkc6ICAgIkRhcyBQb3J0YWwgaXN0IGVpbmZhY2ggbnVyIGdpZ2FudGlzY2guXG4iLAorICAgICAgICAgICAgICBdKSApOworCisgICAgIEFsdGVybmF0aXYgbWl0IHByb3BzIGluIGFsdGVyIEFycmF5bm90YXRpb246CisgICAgIE5ld0Rvb3IoIm5vcmRlbiIsIi9wbGF5ZXJzL3JvY2h1cy9yb29tL3Rlc3QyIiwKKyAgICAgICAgICAgICAicG9ydGFsIiwKKyAgICAgICAgICAgICAoeyBEX05BTUUsICAgIlBvcnRhbCIsCisgICAgICAgICAgICAgICAgRF9HRU5ERVIsIE5FVVRFUiwKKyAgICAgICAgICAgICAgICBEX1NIT1JULCAgIkltIE5vcmRlbiBzaWVoc3QgRHUgZWluICVzZXMgUG9ydGFsLiIsCisgICAgICAgICAgICAgICAgRF9MT05HLCAgICJEYXMgUG9ydGFsIGlzdCBlaW5mYWNoIG51ciBnaWdhbnRpc2NoLlxuIgorICAgICAgICAgICAgICB9KSApOworICAgICAKKyAgKiogVHVlcmVuIG1pdCBCZXdlZ3VuZ3NtZWxkdW5nOgorCisgICAgIE5ld0Rvb3IoIm5vcmRlbiIsIi9yb29tL3NlZTIiLAorICAgICAgICAgICAgICh7IERfTVNHUywgICh7Im5hY2ggTm9yZGVuIiwic2Nod2ltbXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImtvbW10IGhlcmVpbmdlc2Nod29tbWVuIn0pIH0pICk7CisKKyAgKiogRWluZSBUdWVyIG1pdCBUZXN0ZnVua3Rpb246CisKKyAgICAgTmV3RG9vcigib3N0ZW4iLCIvbWVpbi96aWVscmF1bSIsCisgICAgICAgICAgICAgKHsgRF9URVNURlVOQywgImJsb2NrZXJfZGEiIH0pICk7CisKKyAgICAgRGllIEZ1bmt0aW9uIGJsb2NrZXJfZGE6CisKKyAgICAgaW50IGJsb2NrZXJfZGEoKSAgICAgIC8vIEtFSU5FIHByb3RlY3RlZC1GdW5rdGlvbiEgU2llIHdpcmQgc29uc3QgTklDSFQKKyAgICAgeyAgICAgICAgICAgICAgICAgICAgIC8vIGF1ZmdlcnVmZW4gdW5kIGF1c2dld2VydGV0IQorICAgICAgIGlmICggcHJlc2VudCgibWVpbl9maWVzZXNfbW9cbnN0ZXIiLHRoaXNfb2JqZWN0KCkpICkKKyAgICAgICAgeworICAgICAgICAgd3JpdGUoIkVpbiBmaWVzZXMgTW9uc3RlciBzdGVsbHQgc2ljaCBEaXIgaW4gZGVuIFdlZy5cbiIpOworICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICByZXR1cm4gMDsgICAgICAgICAgIC8vIG9wdGlvbmFsCisgICAgIH0KKworICAqKiBOdW4gbm9jaCBlaW5lIFR1ZXIgbWl0IGVpbmlnZW4gRXh0cmFzOgorCisgICAgIE5ld0Rvb3IoIm5vcmR3ZXN0ZW4iLCIvcm9vbXMva2FtbWVyIiwKKyAgICAgICAgICAgICAoeyJ0dWVyIiwiaG9senR1ZXIifSksCisgICAgICAgICAgICAgKHsKKyAgICAgICAgICAgICAgIERfRkxBR1MsICAoRE9PUl9DTE9TRUR8RE9PUl9SRVNFVF9DTCksCisgICAgICAgICAgICAgICBEX01TR1MsICAgKHsibmFjaCBOb3Jkd2VzdGVuIiwiZ2VodCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgImtvbW10IGR1cmNoIGVpbmUgVHVlciBoZXJlaW4ifSksCisgICAgICAgICAgICAgICBEX1NIT1JULCAgIkltIE5vcmR3ZXN0ZW4gc2llaHN0IER1IGVpbmUgJXNlIEhvbHp0dWVyLiIsCisgICAgICAgICAgICAgICBEX0xPTkcsICAgIlNpZSB0cmVubnQgZGVuIExhZGVuIHZvbSBkYWhpbnRlcmxpZWdlbmRlbiBSYXVtLlxuIiwKKyAgICAgICAgICAgICAgIERfTkFNRSwgICAiSG9senR1ZXIiLAorICAgICAgICAgICAgICAgRF9GVU5DLCAgICJ2aWV3IiwKKyAgICAgICAgICAgICAgIERfRlVOQzIsICAibG9va191cCIKKyAgICAgICAgICAgICB9KSApOworCisgICAgIEltIFN0YXJ0cmF1bToKKworICAgICB2b2lkIHZpZXcoKQorICAgICB7CisgICAgICAgd3JpdGUoIkRlciBBbmdlc3RlbGx0ZSB3aXJmdCBEaXIgZWluZW4gbWlzc2JpbGxpZ2VuZGVuIEJsaWNrIHp1LCAiCisgICAgICAgICAgICAgImxhZXNzdCBEaWNoIGFiZXIgcGFzc2llcmVuLlxuIik7CisgICAgIH0KKworICAgICBJbSBaaWVscmF1bToKKworICAgICB2b2lkIGxvb2tfdXAoKQorICAgICB7CisgICAgICAgd3JpdGUoIkVpbiBhbHRlciBNYW5uIHNjaGF1dCBrdXJ6IHp1IERpciBhdWYgdW5kIHZlcnRpZWZ0IHNpY2ggZGFubiAiCisgICAgICAgICAgICAgIndpZWRlciBpbiBzZWluZSBBa3Rlbi5cbiIpOworICAgICB9CisKKworU0lFSEUgQVVDSDoKKyAgICBRdWVyeURvb3JLZXkoKSwgUXVlcnlEb29yU3RhdHVzKCksIFNldERvb3JTdGF0dXMoKSwKKyAgICAvc3RkL3Jvb20vZG9vcnMuYywgL29iai9kb29ybWFzdGVyLmMsIEdldFBoaW9sZW5JbmZvcygpLCBRdWVyeUFsbERvb3JzKCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzA4LjAyLjIwMTUsIEFyYXRob3JuCisKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL05vUGFyYU9iamVjdHMgYi9kb2MvbGZ1bi9Ob1BhcmFPYmplY3RzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNGU3YjcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9Ob1BhcmFPYmplY3RzCkBAIC0wLDAgKzEsMjggQEAKKyoqKioqKioqKioqKioqKioqKioqKiogVkVSQUxURVRFIExGVU4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTm9QYXJhT2JqZWN0cygpCisKK0ZVTktUSU9OOgorCWludCBOb1BhcmFPYmplY3RzKCkKKworREVGSU5JRVJUIElOOgorCS9zdGQvdmlydHVhbC92X2NvbXBpbGVyLmMKKworUlVlQ0tHQUJFV0VSVDoKKyAgICAxLCB3ZW5uIGRlciBWQyBrZWluZSBQYXJhd2VsdC1PYmpla3RlIGVyemV1Z3QsCisgICAgMCwgd2VubiBlciBlcyBkb2NoIHR1dC4KKworQkVTQ0hSRUlCVU5HOgorICAgIERpZXNlIEZ1bmt0aW9uIGlzdCB2ZXJhbHRldC4gUXVlcnlWYWxpZE9iamVjdCgpIGlzdCBnZW5lcmVsbGVyIHVuZAorICAgIGVpbmZhY2hlciB6dSBoYW5kaGFiZW4uIEJpdHRlIGluIFp1a3VuZnQgUF9QQVJBIGltIFZDIHNldHplbiwgc2llaGUgaGllcnp1CisgICAgZGllIE1hbnBhZ2Ugdm9uIFF1ZXJ5VmFsaWRPYmplY3QoKS4KKworICAgIERpZSBGdW5rdGlvbiBnaWJ0IGFuLCBvYiBlaW4gVmlydHVhbCBDb21waWxlciBhdWNoIFBhcmF3ZWx0LU9iamVrdGUKKyAgICBlcnpldWdlbiBrYW5uLgorICAgIFdpY2h0aWc6IEVudHdlZGVyIGRpZXNlciBGdW5rdGlvbiBpbSBWQyBkZWZpbmllcmVuLCB3ZW5uIGRlciBWQyBrZWluZQorICAgIFBhcmEtT2JqZWt0ZSBlcnpldWdlbiB3aXJkIG9kZXIgUF9QQVJBIHBhc3NlbmQgc2V0emVuIQorCitTSUVIRSBBVUNIOgorCXZpcnR1YWxfY29tcGlsZXIsIFBfUEFSQSwgUXVlcnlWYWxpZE9iamVjdAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiswNC4wMy4yMDA3LCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9Ob3RpZnlEZXN0cnVjdCBiL2RvYy9sZnVuL05vdGlmeURlc3RydWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZTcxZWUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9Ob3RpZnlEZXN0cnVjdApAQCAtMCwwICsxLDQ3IEBACitOb3RpZnlEZXN0cnVjdCgpCisKK0ZVTktUSU9OOgorICAgICBwdWJsaWMgaW50fHN0cmluZyBOb3RpZnlSZW1vdmUob2JqZWN0IHplcnN0b2VyZXIpOworCitBUkdVTUVOVEU6CisgICAgIHplcnN0b2VyZXIKKyAgICAgICAgICBEYXMgT2JqZWt0LCB3ZWxjaGVzIGRlc3RydWN0KCkgYXVmIGRpZXNlcyBPYmpla3QgYW53ZW5kZXQuCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGllc2UgRnVua3Rpb24gd2lyZCB2b20gTWFzdGVyIGRlciBNdWRsaWIgaW4gamVkZW0gT2JqZWt0IGdlcnVmZW4sCisgICAgIHdlbGNoZXMgemVyc3RvZXJ0IHdpcmQsIHVtIE9iamVrdGVuIGVpbmUgbGV0enRlIENoYW5jZSB6dSBnZWJlbiwgc2ljaAorICAgICBhdWZ6dXJhZXVtZW4uCisgICAgIFdlbm4gaWhyIGRpZXNlIEZ1bmt0aW9uIHNlbGJlciBkZWZpbmllcnQsIGFjaHRldCBiaXR0ZXQgZGFyYXVmLCBkYXNzIHNpZQorICAgICBpbiBrZWluZW0gRmFsbCBGZWhsZXIgYXVzbG9lc2VuIHNvbGx0ZSwgZC5oLiB0ZXN0ZXQgZW50c3ByZWNoZW5kCisgICAgIGdydWVuZGxpY2guCisgICAgIFdlbm4gaWhyIGF1cyAvc3RkLyBlcmJ0IHVuZCBkaWVzZSBGdW5rdGlvbiB1ZWJlcnNjaHJlaWJ0LCwgX211ZXNzdF8gaWhyCisgICAgIGRpZSBnZWVyYnRlIE5vdGlmeURlc3RydWN0KCkgYXVmcnVmZW4sIGRhIHNvbnN0IGRhcyBMaWNodHN5c3RlbSBuaWNodAorICAgICBha3R1YWxpc2llcnQgd2lyZC4KKworICAgICBQcml2aWxlZ2llcnRlIE9iamVrdGUgKHouQi4gUm9vdC1PYmpla3RlLCBzcGV6aWVsbGUgQXVzbmFobWVuIHdpZSBkZXIKKyAgICAgTmV0enRvdGVucmF1bSwgQXJtYWdlZGRvbikga29lbm5lbiBkaWUgWmVyc3RvZXJ1bmcgaW4gbGV0enRlciBTZWt1bmRlCisgICAgIHZlcmhpbmRlcm4sIGluZGVtIHNpZSBoaWVyIGVpbmVuIFdlcnQgIT0gMCB6dXJ1ZWNrbGllZmVybi4gV2lyZCBlaW4KKyAgICAgc3RyaW5nIHp1cnVlY2tnZWxpZWZlcnQsIHdpcmQgZGllc2VyIGRpZSBGZWhsZXJtZWxkdW5nIGRlcworICAgICBwcmVwYXJlX2Rlc3RydWN0KCkgaW0gTWFzdGVyIHNlaW4uCisgICAgIEJlaSBuaWNodC1wcml2aWxlZ2llcnRlbiBPYmpla3RlbiAoYWxzbyBmYXN0IGFsbGUpIGlzdCBhbiBkaWVzZXIgU3RlbGxlCisgICAgIF9rZWluXyBBYmJydWNoIGRlciBaZXJzdG9lcnVuZyBtb2VnbGljaCEKKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgRGVyIFJ1ZWNrZ2FiZXdlcnQgbXVzcyBlaW4gc3RyaW5nIG9kZXIgZWluIGludCBzZWluLiBBbGxlcmRpbmdzIHdpcmQgZGVyCisgICAgIE1hc3RlciBkZW4gUnVlY2tnYWJld2VydCBudXIgZnVlciBwcml2aWxlZ2llcnRlIE9iamVrdGUgYXVzd2VydGVuLgorCitCRU1FUktVTkdFTjoKKyAgICAgV2llIGdlc2FndCwgYml0dGUga2VpbmUgRmVobGVyIGF1c2xvZXNlbiAoYXVjaCB3ZW5uIGRlciBNYXN0ZXIKKyAgICAgZ3J1bmRzYWV0emxpY2ggZGFtaXQga2xhciBrb21tdCkuIFNwZXppZWxsIGlzdCBlaW4gcmFpc2VfZXJyb3IoKSB6dXIKKyAgICAgVmVyaGluZGVydW5nIGVpbmVzIGRlc3RydWN0cyBudXR6bG9zLgorICAgICBCaXR0ZSBtYWNodCBpbiBkaWVzZXIgRnVua2lvbiBudXIgZGFzLCB3YXMgX3VuYmVkaW5ndF8gbm90d2VuZGlnIGlzdC4KKyAgICAgV2VubiBqZW1hbmQgZWluIGRlc3RydWN0KCkgYW53ZW5kZXQgc3RhdHQgZWluIHJlbW92ZSgpIHp1IHJ1ZmVuLCBoYXQgZGFzCisgICAgIGluIGRlciBSZWdlbCBlaW5lbiBHcnVuZCAoei5CLiB1bSBidWdnZW5kZSByZW1vdmUoKSB6dSB1bWdlaGVuKS4gSW5zYi4KKyAgICAgaXN0IGVpbiBzYXZlX29iamVjdCgpIGluIHJlbW92ZSgpIHVuZCBOb3RpZnlEZXN0cnVjdCgpIHZvbGxzdGFlbmRpZworICAgICB1ZWJlcmZsdWVzc2lnLgorCitTSUVIRSBBVUNIOgorICAgIE5vdGlmeUxlYXZlKCksIE5vdGlmeUluc2VydCgpLCBOb3RpZnlSZW1vdmUoKQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiAyNS4wMi4yMDA5LCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9Ob3RpZnlJbnNlcnQgYi9kb2MvbGZ1bi9Ob3RpZnlJbnNlcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEyYzZlYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL05vdGlmeUluc2VydApAQCAtMCwwICsxLDI4IEBACitOb3RpZnlJbnNlcnQoKQorCitGVU5LVElPTjoKKyAgICAgdm9pZCBOb3RpZnlJbnNlcnQob2JqZWN0IG9iLCBvYmplY3Qgb2xkZW52KTsKKworQVJHVU1FTlRFOgorICAgICBvYgorICAgICAgICAgIERhcyBPYmpla3QsIGRhcyBpbiBkZW4gQmVoYWVsdGVyIGVpbmdlZnVlZ3Qgd3VyZGUuCisgICAgIG9sZGVudgorICAgICAgICAgIERhcyBPYmpla3QsIGF1cyBkZW0gPG9iPiBrYW0uCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGllc2UgRnVua3Rpb24gd2lyZCBpbSBCZWhhZWx0ZXIgYXVmZ2VydWZlbiwgbmFjaGRlbSBlaW4gT2JqZWt0IGluCisgICAgIGJlc2FndGVuIEJlaGFlbHRlciBoaW5laW4gYmV3ZWd0IHd1cmRlLiAKKworUlVlQ0tHQUJFV0VSVDoKKyAgICAga2VpbmVyCisKK0JFTUVSS1VOR0VOOgorICAgICBEaWVzZSBGdW5rdGlvbiB3aXJkIG51ciBpbSBGYWxsZSB1bmJlbGVidGVyIE9iamVrdGUgZ2VydWZlbi4gRnVlciAKKyAgICAgTGViZXdlc2VuIHMuIGJpdHRlLiBpbml0KCkuCisKK1NJRUhFIEFVQ0g6CisgICAgTm90aWZ5TGVhdmUoKSwgUHJldmVudEluc2VydCgpLCBQcmV2ZW50TGVhdmUoKSwgbW92ZSgpLCBOb3RpZnlSZW1vdmUoKQorICAgIGV4aXQoKSwgaW5pdCgpLCBOb3RpZnlNb3ZlKCksIFByZXZlbnRNb3ZlKCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogMjEuMDUuMjAxMiwgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vTm90aWZ5TGVhdmUgYi9kb2MvbGZ1bi9Ob3RpZnlMZWF2ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjFmY2E4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vTm90aWZ5TGVhdmUKQEAgLTAsMCArMSwyOCBAQAorTm90aWZ5TGVhdmUoKQorCitGVU5LVElPTjoKKyAgICAgdm9pZCBOb3RpZnlMZWF2ZShvYmplY3Qgb2IsIG9iamVjdCBkZXN0KTsKKworQVJHVU1FTlRFOgorICAgICBvYgorICAgICAgICAgIERhcyBPYmpla3QsIGRhcyBhdXMgZGVtIEJlaGFlbHRlciBlbnRmZXJudCB3dXJkZS4KKyAgICAgZGVzdAorICAgICAgICAgIERhcyBPYmpla3QsIGluIGRhcyA8b2I+IGJld2VndCB3dXJkZS4KKworQkVTQ0hSRUlCVU5HOgorICAgICBEaWVzZSBGdW5rdGlvbiB3aXJkIGltIEJlaGFlbHRlciBhdWZnZXJ1ZmVuLCBuYWNoZGVtIGVpbiBPYmpla3QgYXVzCisgICAgIGJlc2FndGVuIEJlaGFlbHRlciBlbnRmZXJudCB3dXJkZS4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICAga2VpbmVyCisKK0JFTUVSS1VOR0VOOgorICAgICBEaWVzZSBGdW5rdGlvbiB3aXJkIG51ciBpbSBGYWxsZSB1bmJlbGVidGVyIE9iamVrdGUgZ2VydWZlbi4gRnVlcgorICAgICBMZWJld2VzZW4gcy4gYml0dGUuIGV4aXQoKS4KKworU0lFSEUgQVVDSDoKKyAgICBOb3RpZnlSZW1vdmUoKSwgTm90aWZ5SW5zZXJ0KCksIFByZXZlbnRJbnNlcnQoKSwgUHJldmVudExlYXZlKCksIG1vdmUoKSwKKyAgICBleGl0KCksIGluaXQoKSwgTm90aWZ5TW92ZSgpLCBQcmV2ZW50TW92ZSgpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IDIxLjA1LjIwMTIsIFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL05vdGlmeU1vdmUgYi9kb2MvbGZ1bi9Ob3RpZnlNb3ZlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZTE4NjEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9Ob3RpZnlNb3ZlCkBAIC0wLDAgKzEsNTggQEAKKworRlVOS1RJT046CisgICAgIHByb3RlY3RlZCB2b2lkIE5vdGlmeU1vdmUob2JqZWN0IGRlc3QsIG9iamVjdCBvbGRlbnYsIGludCBtZXRob2QpOworCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvdGhpbmcvbW92aW5nLmMKKyAgICAgL3N0ZC9saXZpbmcvbW92aW5nLmMKKyAgICAgL3N0ZC9wbGF5ZXIvbW92aW5nLmMKKworQVJHVU1FTlRFOgorICAgICBkZXN0CisgICAgICAgICAgRGFzIFppZWwgZGVzIE1vdmVzIGJ6dy4gZGFzIGpldHp0IGFrdHVlbGxlIEVudmlyb25tZW50CisgICAgIG9sZGVudgorICAgICAgICAgIERhcyBhbHRlIEVudmlyb25tZW50IGRlcyBPYmpla3RzCisgICAgIG1ldGhvZAorICAgICAgICAgIERpZSBNb3ZlLU1ldGhvZGUobiksIG1pdCBkZXIvZGVuZW4gYmV3ZWd0IHd1cmRlLgorCitCRVNDSFJFSUJVTkc6CisgICAgIERpZXNlIEZ1bmt0aW9uIHdpcmQgdm9tIG1vdmUoKSBpbSBPYmpla3QgZ2VydWZlbiwgc29iYWxkIGRpZSBCZXdlZ3VuZyBpbQorICAgICB3ZXNlbnRsaWNoZW4gYWJnZXNjaGxvc3NlbiBpc3QuIFNpZSBzb2xsIGVpbmVyc2VpdHMgZGFzIE9iamVrdCB1ZWJlciBlaW5lCisgICAgIHN0YXR0Z2VmdW5kZW5lIEJld2VndW5nIGluZm9ybWllcmVuLCBhYmVyIGF1Y2ggZWluaWdlIERpbmdlIGVybGVkaWdlbiwKKyAgICAgZGllIGJlaSBkZXIgQmV3ZWd1bmcgc3RhdHRmaW5kZW4gbXVlc3NlbiAoYmVpIExpdmluZ3Mgei5CLiBkYXMgVGVhbQorICAgICBuYWNoaG9sZW4pLgorCitSVWVDS0dBQkVXRVJUOgorICAgICBrZWluZXIKKworQkVNRVJLVU5HRU46CisgICAgIERpZXNlIEZ1bmt0aW9uIGthbm4gdWViZXJzY2hyaWViZW4gd2VyZGVuLCBkYW1pdCBkYXMgT2JqZWt0IEJld2VndW5nZW4KKyAgICAgbWl0Z2Vrb21tdCwgb2huZSBkYXMgbW92ZSgpIHNlbGJlciB6dSB1ZWJlcnNjaHJlaWJlbiBvZGVyIGVpbmVuIE1vdmUtSG9vaworICAgICB6dSBzZXR6ZW4uIERhYmVpIGFiZXIgYml0dGUgdW5iZWRpbmd0IGJlYWNodGVuOgorICAgICBEYXMgZ2VlcmJ0ZSBOb3RpZnlNb3ZlKCkgX01VU1MgSU4gSkVERU0gRkFMTF8gbWl0IGF1ZmdlcnVmZW4gd2VyZGVuIQorICAgICBTb2xsdGV0IGlociBkYXMgdmVyZ2Vzc2VuLCB3ZXJkZW4gZXVyZSBPYmpla3RlIGJ1Z2dlbi4gOy0pCisgICAgIERpZSBGdW5rdGlvbiBkYXJmIG51ciBvYmpla3RpbnRlcm4gdmVyd2VuZGV0IHdlcmRlbi4gQmVpbSBVZWJlcnNjaHJlaWJlbgorICAgICBkYXMgJ3Byb3RlY3RlZCcgbmljaHQgdmVyZ2Vzc2VuIQorCitCRUlTUElFTEU6CisgICAgIEVpbmUgQm9tYmUsIGRpZSBpbiBTZWhlcmhhdXN0cnVoZW4gZXhwbG9kaWVydDoKKworICAgICBwcm90ZWN0ZWQgdm9pZCBOb3RpZnlNb3ZlKG9iamVjdCBkZXN0LCBvYmplY3Qgb2xkZW52LCBpbnQgbWV0aG9kKSB7CisgICAgICAgICA6Ok5vdGlmeU1vdmUoZGVzdCwgb2xkZW52LCBtZXRob2QpOyAvLyBXSUNIVElHIQorICAgICAgICAgaWYgKG9iamVjdHAoZGVzdCkgJiYKKyAgICAgICAgICAgICBsb2FkX25hbWUoZGVzdCkgPT0gIi9kL3NlaGVyL2hhZXVzZXIvdHJ1aGUiKSB7CisgICAgICAgICAgICAgaWYgKGZpbmRfY2FsbF9vdXQoImV4cGxvZGllcmUiKT09LTEpCisgICAgICAgICAgICAgICAgIGNhbGxfb3V0KCJleHBsb2RpZXJlIiw5MDApOworICAgICAgICAgfQorICAgICAgICAgZWxzZQorICAgICAgICAgICAgIHJlbW92ZV9jYWxsX291dCgiZXhwbG9kaWVyZSIpOworICAgICB9CisKKworU0lFSEUgQVVDSDoKKyAgICAgUHJldmVudExlYXZlKCksIE5vdGlmeUluc2VydCgpLCBOb3RpZnlMZWF2ZSgpLCBNYXlBZGRPYmplY3QoKSwKKyAgICAgUHJldmVudEluc2VydExpdmluZygpLCBQcmV2ZW50TGVhdmVMaXZpbmcoKSwgTm90aWZ5TW92ZSgpLAorICAgICBQcmV2ZW50TW92ZSgpLCBNYXlBZGRXZWlnaHQoKSwgbW92ZSgpLCAvc3RkL2NvbnRhaW5lci9yZXN0cmljdGlvbnMuYworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiAwNC4wOC4yMDA3LCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9Ob3RpZnlQbGF5ZXJEZWF0aCBiL2RvYy9sZnVuL05vdGlmeVBsYXllckRlYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNjYxNTAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9Ob3RpZnlQbGF5ZXJEZWF0aApAQCAtMCwwICsxLDc0IEBACitOb3RpZnlQbGF5ZXJEZWF0aCgpCisKK0ZVTktUSU9OOgorICB2b2lkIE5vdGlmeVBsYXllckRlYXRoKG9iamVjdCB2aWN0aW0sb2JqZWN0IGtpbGxlcixpbnQgbG9zdF9leHApOworCitERUZJTklFUlQgSU46CisgIC9zdGQvcGxheWVyL2xpZmUuYworCitBUkdVTUVOVEU6CisgIHZpY3RpbQorICAgIEdldG9ldGV0ZXIgU3BpZWxlci4KKyAga2lsbGVyCisgICAgT2JqZWt0LCB3ZWxjaGVzIGRlbiBTcGllbGVyIGdldG9ldGV0IGhhdC4KKyAgbG9zdF9leHAKKyAgICBFcmZhaHJ1bmdzcHVua3RlLCBkaWUgZGVyIFNwaWVsZXIgZHVyY2ggZGVuIFRvZCB2ZXJsb3JlbiBoYXQuCisKK0JFU0NIUkVJQlVORzoKKyAgRGllc2UgRnVua3Rpb24gd2lyZCBhdXMgZGVtIFNwaWVsZXJvYmpla3QgaGVyYXVzIGltbWVyIGRhbm4KKyAgYXVmZ2VydWZlbiwgd2VubiBkZXIgU3BpZWxlciBzdGlyYnQgdW5kIHp3YXI6CisgICAgMSkgaW0gR2VnbmVyLCBkZXIgZGVuIFNwaWVsZXIgZ2V0b2V0ZXQgaGF0LAorICAgIDIpIGltIEVudmlyb25tZW50IGRlcyBnZXRvZXRldGVuIFNwaWVsZXJzLAorICAgIDMpIGluIGRlciBHaWxkZSBkZXMgU3BpZWxlcnMsCisgICAgNCkgaW4gYWxsZW4gT2JqZWt0ZW4gaW4gZGllc2VtIEVudmlyb25tZW50IHVuZAorICAgIDUpIGluIGFsbGVuIE9iamVrdGVuIChhdWNoIGlubmVyaGFsYiBDb250YWluZXJuKSBpbSBTcGllbGVyLgorICBEZXIgR2VnbmVyIHdpcmQgaGllcmJlaSBudXIgZWlubWFsIGluZm9ybWllcnQsIGFsc28gYmVpIGxldHp0ZXJlbgorICBGYWVsbGVuIGhlcmF1c2dlZmlsdGVydCwgZmFsbHMgbm9ldGlnIQorICBIYXVwdGF1ZmdhYmUgZGllc2VyIEZ1bmt0aW9uIGlzdCBlcyBzb21pdCwgYXVmIFRvZGUgdm9uIFNwaWVsZXJuIHp1CisgIHJlYWdpZXJlbiBvZGVyIHNlbGJpZ2UgZWluZmFjaCBudXIgbWl0enVsb2dnZW4uCisKKyAgWnUgZGVtIFplaXRwdW5rdCBkZXMgQXVmcnVmcyBkaWVzZXIgRnVua3Rpb24gaXN0IGRlciBTcGllbGVyIG5vY2ggX25pY2h0XworICBHZWlzdCB1bmQgbm9jaCBfbmljaHRfIGltIFRvZGVzcmF1bSAtIGRpZXMgd2lyZCBpbSBBbnNjaGx1c3MgYW4gZGVuIEF1ZnJ1ZgorICBkZXIgTm90aWZ5UGxheWVyRGVhdGgoKSBkdXJjaGdlZnVlaHJ0LgorICAKKyAgQXVmZ2VydWZlbiB3aXJkIGRpZSBGdW5rdGlvbiBhdXMgJy9zdGQvcGxheWVyL2xpZmUuYycgbWl0dGVscyBjYXRjaCgpIHVuZAorICB3ZXJkZW4gbWl0IGxpbWl0ZWQoKSBhdWYgbWF4LiAxNTBrIChHZWduZXIsIEVudmlyb25tZW50LCBHaWxkZSkgYnp3LiA4MGsgCisgIChhbGxlIGFuZGVyZW4gT2JqZWt0ZSkgVGlja3MgYmVzY2hyYWVua3QuCisgIEZlaGxlciBpbiBkaWVzZXIgRnVua3Rpb24gaGFiZW4gc29taXQga2VpbmUgbmVnYXRpdmVuIEF1c3dpcmt1bmdlbgorICBhdWYgZGFzIFN0ZXJiZW4gZGVzIFNwaWVsZXJzLgorCitSVWVDS0dBQkVXRVJUOgorICBrZWluZXIKKworQkVJU1BJRUxFOgorICBGb2xnZW5kZXMgQmVpc3BpZWwgZGVtb25zdHJpZXJ0IGJlaXNwaWVsc3dlaXNlLCB3aWUgbWFuIFRvZGUgdm9uCisgIFNwaWVsZXJuIG1pdGxvZ2dlbiBrYW5uIChkYXMgQmVpc3BpZWwgaXN0IGhpZXJiZWkgYXVmIGRlbiBhbQorICBoYWV1Zmlnc3RlbiBhdWZ0cmV0ZW5kZW4gRmFsbCBiZXpvZ2VuLCBkYXNzIG51ciBkYXMgdG9ldGVuZGUgT2JqZWt0CisgIGRlbiBUb2QgcHJvdG9rb2xsaWVyZW4gc29sbCk6CisKKyAgICB2b2lkIE5vdGlmeVBsYXllckRlYXRoKG9iamVjdCBkZWFkLCBvYmplY3Qga2lsbGVyLCBpbnQgbG9zdF9leHApIAorICAgIHsgCisgICAgICBpZiAoIGludHAobG9zdF9leHApICYmIG9iamVjdHAoZGVhZCkgJiYgb2JqZWN0cChraWxsZXIpICYmIAorICAgICAgICAgICBraWxsZXI9PXRoaXNfb2JqZWN0KCkgKQorICAgICAgICB3cml0ZV9maWxlKCAiL2xvZy9wYXRyeW4vZGVhZCIsIHNwcmludGYoCisgICAgICAgICAgIiVzIC0gJXMgdm9uICVzIGdldG9ldGV0LiBYUDogLSVkIiwgY3RpbWUoKSwgZ2V0dWlkKGRlYWQpLAorICAgICAgICAgICBraWxsZXItPm5hbWUoV0VNKSwgbG9zdF9leHApICk7CisgICAgfQorCisgIEJpdHRlIGJlYWNodGVuOiB3cml0ZV9maWxlKCkgc2NocmVpYnQgb2huZSBHcm9lc3NlbmJlZ3Jlbnp1bmcgaW4gZGFzCisgIExvZ2ZpbGUuIERhIGRpZXMgYXVmIERhdWVyIGJ6dy4gaW4gR2ViaWV0ZW4gbWl0IGhvaGVyIExvZy1Ba3Rpdml0YWV0CisgIHp1IExvZ2ZpbGVzIHZvbiBlbm9ybWVyIEdyb2Vzc2UgZnVlaHJlbiBrYW5uLCBpc3QgZGllIFZlcndlbmR1bmcKKyAgdm9uIHdyaXRlX2ZpbGUoKSBuaWNodCBlbXBmZWhsZW5zd2VydC4gQXVzbmFobWVuIGtvZW5uZW4gbmF0dWVybGljaAorICBtaXQgZGVtIHp1c3RhZW5kaWdlbiBSZWdpb25zbWFnaWVyIGFiZ2VzcHJvY2hlbiB3ZXJkZW4sIHouQi4gZnVlcgorICBiZWdyZW56dGUgQW53ZW5kdW5nIGV0d2EgYmVpIHNlaHIgc3Rhcmtlbiwgc2VsdGVuIGJlc2llZ3RlbiBHZWduZXJuLgorCisgIFdlaXRlcmhpbiBpc3QgZXMgZW1wZmVobGVuc3dlcnQsIGRhcyB0b2V0ZW5kZSBPYmpla3QgKGtpbGxlcikgbmljaHQKKyAgaW0gTm90aWZ5UGxheWVyRGVhdGgoKSB6dSB6ZXN0b2VyZW4sIHNvbmRlcm4gZXR3YXMgemVpdHZlcnNldHp0LAorICBkYW1pdCBuaWNodCBldHdhIGltIG5hY2hmb2xnZW5kZW4gTm90aWZ5UGxheWVyRGVhdGgoKSBlaW5lcyBhbmRlcmVuCisgIE9iamVrdGVzIChzLm8uIFJlaWhlbmZvbGdlKSBraWxsZXI9PTAgaXN0LgorCitTSUVIRSBBVUNIOgorICBEZWZlbmQoKSwgZG9fZGFtYWdlKCksIE5vdGlmeUhwQ2hhbmdlKCksIGNhdGNoKCksIHdyaXRlX2ZpbGUoKSwgbG9nX2ZpbGUoKQorICBQX0xBU1RfREVBVEhfUFJPUFMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzI0LjAzLjIwMTIsIFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL05vdGlmeVJlbW92ZSBiL2RvYy9sZnVuL05vdGlmeVJlbW92ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGIwNGZhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vTm90aWZ5UmVtb3ZlCkBAIC0wLDAgKzEsMjYgQEAKK05vdGlmeVJlbW92ZSgpCisKK0ZVTktUSU9OOgorICAgICB2b2lkIE5vdGlmeVJlbW92ZShvYmplY3Qgb2IpOworCitBUkdVTUVOVEU6CisgICAgIG9iCisgICAgICAgICAgRGFzIE9iamVrdCwgZGFzIGF1cyBkZW0gQmVoYWVsdGVyIGVudGZlcm50IHd1cmRlLgorCitCRVNDSFJFSUJVTkc6CisgICAgIERpZXNlIEZ1bmt0aW9uIHdpcmQgaW0gQmVoYWVsdGVyIGF1ZmdlcnVmZW4sIHdlbm4gZWluIE9iamVrdCBpbQorICAgICBiZXNhZ3RlbiBCZWhhZWx0ZXIgemVyc3RvZXJ0IHdpcmQuCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIGtlaW5lcgorCitCRU1FUktVTkdFTjoKKyAgICAgV2lyZCBuaWNodCBnZXJ1ZmVuLCB3ZW5uIGVpbiBTcGllbGVyb2JqZWt0IHplcnN0b2VydCB3aXJkLgorCitTSUVIRSBBVUNIOgorICAgIE5vdGlmeUxlYXZlKCksIE5vdGlmeUluc2VydCgpLCBQcmV2ZW50SW5zZXJ0KCksIFByZXZlbnRMZWF2ZSgpLCBtb3ZlKCksCisgICAgTm90aWZ5TW92ZSgpLCBQcmV2ZW50TW92ZSgpLAorICAgIEJlY29tZXNOZXREZWFkKCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogMDQuMDguMjAwNywgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vTm90aWZ5VGltZWRBdHRyTW9kRXhwaXJlZCBiL2RvYy9sZnVuL05vdGlmeVRpbWVkQXR0ck1vZEV4cGlyZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU5YTc5YQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL05vdGlmeVRpbWVkQXR0ck1vZEV4cGlyZWQKQEAgLTAsMCArMSwyMCBAQAorTm90aWZ5VGltZWRBdHRyTW9kRXhwaXJlZAorRlVOS1RJT046CisgICAgIHZvaWQgTm90aWZ5VGltZWRBdHRyTW9kRXhwaXJlZChzdHJpbmcga2V5KQorCitERUZJTklFUlQgSU46CisgICAgIFB1c2gtTWV0aG9kZSBpbiBub3RpZnktT2JqZWt0ZW4uCisKK0FSR1VNRU5URToKKyAgICAgc3RyaW5nIGtleQkJLSBkZXIgZ2Vsb2VzY2h0ZSBNb2RpZmllcgorCitCRVNDSFJFSUJVTkc6CisgICAgIFdpcmQgYXVzIGRlbSBMZWJld2VzZW4gYXVzIGF1ZmdlcnVmZW4sIGluIGRlbSBkZXIgZW50c3ByZWNoZW5kZW4KKyAgICAgTW9kaWZpZXIgc29lYmVuIHVuZ3VlbHRpZyBnZXdvcmRlbiBpc3QuICAgICAKKworU0lFSEUgQVVDSDoKKyAgICAgUHJvcGVydGllczogUF9BVFRSSUJVVEVTLCBQX1RJTUVEX0FUVFJfTU9ECisgICAgIE1ldGhvZGVuOgkgU2V0VGltZWRBdHRyTW9kaWZpZXIoTCksIERlbGV0ZVRpbWVkQXR0ck1vZGlmaWVyKEwpLAorCQkgUXVlcnlUaW1lZEF0dHJNb2RpZmllcihMKQorCisyNy4gSnVsaSAyMDA0IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9Ob3RpZnlYTUF0dHJNb2RMaW1pdFZpb2xhdGlvbiBiL2RvYy9sZnVuL05vdGlmeVhNQXR0ck1vZExpbWl0VmlvbGF0aW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZjM5YzAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9Ob3RpZnlYTUF0dHJNb2RMaW1pdFZpb2xhdGlvbgpAQCAtMCwwICsxLDIwIEBACitOb3RpZnlYTUF0dHJNb2RMaW1pdFZpb2xhdGlvbigpCitGVU5LVElPTjoKKyAgICAgIHZvaWQgTm90aWZ5WE1BdHRyTW9kTGltaXRWaW9sYXRpb24oKQorCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvdGhpbmcvcmVzdHJpY3Rpb25zLmMKKw0KK0JFU0NIUkVJQlVORzoKKyAgICAgV2lyZCBnZXJ1ZmVuIHdlbm4gZGllIFN1bW1lIGRlciBpbiBQX1hfQVRUUl9NT0Qgb2RlciBQX1hfQVRUUl9NT0QKKyAgICAgYW5nZWdlYmVuZW4gTW9kaWZpa2F0b3JlbiBkaWUgU3VtbWUgYWxsZXIgTW9kaWZpa2F0b3JlbiBpbSBTcGllbGVyIAorICAgICB1ZWJlciBkZW4genVnZWxhc3NlbmVuIEdyZW56d2VydCBoZWJ0IHVuZCBzb21pdCBuaWNodCBtZWhyIGluIGRpZQorICAgICBCZXJlY2hudW5nIGVpbmdlaHQuCisgICAgIAorU0lFSEUgQVVDSDoKKyAgICAgUXVlcnlBdHRyaWJ1dGUoKSwgUXVlcnlSZWFsQXR0cmlidXRlKCksIFF1ZXJ5QXR0cmlidXRlT2Zmc2V0KCksDQorICAgICBTZXRBdHRyKCksIFNldEF0dHJpYnV0ZSgpLCBTZXRSZWFsQXR0cmlidXRlKCksIFVwZGF0ZUF0dHJpYnV0ZXMoKSwNCisgICAgIFBfQVRUUklCVVRFUywgUF9BVFRSSUJVVEVTX09GRlNFVFMsIFBfQVRUUklCVVRFU19NT0RJRklFUiwNCisgICAgIFBfWF9BVFRSX01PRCwgUF9NX0FUVFJfTU9ELCAvc3RkL2xpdmluZy9hdHRyaWJ1dGVzLmMNCisKKzEzLkp1bi4yMDA0LCBNdWFkaWIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9QYWNpZnkgYi9kb2MvbGZ1bi9QYWNpZnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkwZWQ4MwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL1BhY2lmeQpAQCAtMCwwICsxLDExMyBAQAorRlVOS1RJT04KKwlwdWJsaWMgaW50IFBhY2lmeShvYmplY3QgY2FzdGVyKQorCitERUZJTklFUlQgSU4KKwkvc3RkL2xpdmluZy9jb21iYXQuYworCitCRVNDSFJFSUJVTkcKKwlEaWVzZSBGdW5rdGlvbiB2ZXJzdWNodCwgZWluIExlYmV3ZXNlbiB6dSBiZWZyaWVkZW4uCisgIFdpbGwgZWluZSBHaWxkZSBlaW4gTGViZXdlc2VuIGJlZnJpZWRlbiwgbXVzcyBzaWUgaGllcmZ1ZXIgZGllc2UgRnVua3Rpb24KKyAgaW4gZGVtIExlYmV3ZXNlbiBhdWZydWZlbi4KKworICBFaW4gaW1tZXIgYmVmcmllZGJhcmVyIE5QQyBrYW5uIGR1cmNoIGRhcyBTZXR6ZW4gdm9uIFBfQUNDRVBUX1BFQUNFIGluIGVpbmVtCisgIExlYmV3ZXNlbiByZWFsaXNpZXJ0IHdlcmRlbi4KKworCVN0YW5kYXJkbWFlc3NpZyBmdW5rdGlvbmllcnQgZGllIEZ1bmt0aW9uIHdpZSBmb2xndDoKKyAgKiBLb21tdCBkZXIgVmVyc3VjaCB2b20gU3BlbGxjYXN0ZXIgc2VsYnN0LCBpc3QgZXIgaW1tZXIgZXJmb2xncmVpY2guCisgICogS29tbXQgZGVyIFZlcnN1Y2ggdm9uIGVpbmVtIFRlYW1rb2xsZWdlbiwgaXN0IGVyIGltbWVyIGVyZm9sZ3JlaWNoLgorICAqIEhhdCBkYXMgTGViZXdlc2VuIGtlaW5lIEdlZ25lciwgaXN0IGRlciBWZXJzdWNoIGltbWVyIGVyZm9sZ2xvcy4KKyAgSW4gZGllc2VuIEZhZWxsZW4gZXJmb2xndCBhdWNoIGtlaW5lIEVyaG9laHVuZyBkZXMgQmVmcmllZGV6YWVobGVycy4KKyAgCisgIEluIGFuZGVyZW4gRmFlbGxlbiB3aXJkIGRpZSBpbiBQX1BFQUNFX0hJU1RPUlkgZnVlciBkaWUgR2lsZGUgZGVzIENhc3RlcnMKKyAgYWJnZWxlZ3RlIFphaGwgZXJmb2xncmVpY2hlciBCZWZyaWVkdW5nZW4gKEFOWiksIGRpZSBJbnRlbGxpZ2VueiBkZXMKKyAgQ2FzdGVycyAoSU5UX0NBU1RFUikgdW5kIGRpZSBJbnRlbGxpZ2VueiBkZXMgTGViZW53ZXNlbnMgc2VsYmVyIChJTlRfTUUpCisgIGVybWl0dGVsdC4KKyAgQW5zY2hsaWVzc2VuZCB3aXJkIGVpbmUgV2FocnNjaGVpbmxpY2hrZWl0IHcgYXVzZ2VyZWNobmV0OgorICAKKyAgICB3ID0gKElOVF9DQVNURVIgKyAxMCAtIEFOWio0KSAvIChJTlRfTUUgKyAxMCkKKyAgCisgIEhpZXJiZWkgZ2lidCB3IGRpZSBDaGFuY2UgYXVmIGVpbmUgZXJmb2xncmVpY2hlIEJlZnJpZWR1bmcgYW4uIE1pdHRlbHMgZWluZXIKKyAgWnVmYWxsc3phaGwgd2lyZCBiZXN0aW1tdCwgb2IgZGVyIGFrdHVlbGxlIFZlcnN1Y2ggZXJmb2xncmVpY2ggaXN0LiBGYWxscworICBqYSwgd2lyZCBkZXIgWmFlaGxlciBmdWVyIGRpZSBHaWxkZSBkZXMgQ2FzdGVycyBpbiBQX1BFQUNFX0hJU1RPUlkgZXJob2VodC4KKworICBKZSBvZWZ0ZXIgZWluIExlYmV3ZXNlbiBhbHMgdm9uIGVpbmVyIEdpbGRlIHNjaG9uIGJlZnJpZWRldCB3dXJkZSwgZGVzdG8KKyAgdW53YWhyc2NoZWlubGljaGVyLCBkYXNzIGVzIGVybmV1dCBkYXJhdWYgJ2hlcmVpbmZhZWxsdCcuCisKK0JFTUVSS1VOR0VOOgorICAqCURpZSBGdW5rdGlvbiBrYW5uIGF1Y2ggdWViZXJzY2hyaWViZW4gd2VyZGVuLCB1bSBlaW4gdm9tIE1hZ2llcgorICAgIGdld3VlbnNjaHRlcyBWZXJoYWx0ZW4genUgcmVhbGlzaWVyZW4uIEVpbiBrb21wbGV0dGVzIEFiaGFlbmdlbiB2b24KKyAgICBCZWZyaWVkdW5nZW4gc29sbHRlIGRhYmVpIGFiZXIgZGllIEF1c25haG1lIHNlaW4hCisgICogRGllc2UgRnVua3Rpb24gdmVyd2FsdGV0IGF1Y2ggZGFzIFBfUEVBQ0VfSElTVE9SWSwgc3BlemllbGwgZGllIFJlZHVrdGlvbgorICAgIGRlciBFcmZvbGdzemFlaGxlci4gVWViZXJzY2hyZWlidCBtYW4gc2llIG9obmUgZGFzIGdlZXJidGUgUGFjaWZ5KCkKKyAgICB6dSBudXR6ZW4sIHdpcmQgUF9QRUFDRV9ISVNUT1JZIG5pY2h0IG1laHIgdmVyd2FsdGV0LgorCitSVUVDS0dBQkVXRVJURToKKyAgICAxIC0gZGFzIExlYmV3ZXNlbiB3dXJkZSBlcmZvbGdyZWljaCBiZWZyaWVkZXQuLgorICAgIDAgLSBkZXIgQmVmcmllZGV2ZXJzdWNoIGlzdCBnZXNjaGVpdGVydC4KKyAgICAKK0JFSVNQSUVMRToKKyAgICBBbmdlbm9tbWVuLCBkZXIgQ2FzdGVyIGhhdCBlaW5lIEludGVsbGlnZW56IHZvbiAyMi4gRGllIGZvbGdlbmRlIFRhYmVsbGUKKyAgICBnaWJ0IGRhbm4gZGllIFdhaHJzY2hlaW5saWNoa2VpdGVuIGZ1ZXIgZWluZSBlcmZvbGdyZWljaGUgQmVmcmllZHVuZyBhbjoKKyAgICAoaW4gQWJoYWVuZ2lna2VpdCB2b24gZWlnZW5lciBJbnRlbGxpZ2VueiB1bmQgdmVyZ2FuZ2VuZXIgZXJmb2xncmVpY2hlcgorICAgICBWZXJzdWNoZSkKKyBJTlRfTUUgIEVyZm9sZ3N3YWhyc2NoZWlubGljaGtlaXRlbiBqZSBuYWNoIEFuemFobCBlcmZvbGdyZWljaGVyIFZlcnN1Y2hlCisgICAgICAgICAgICAgIDEgICAgICAgMiAgICAgICAzICAgICAgIDQgICAgICAgNSAgICAgICA2ICAgICAgIDcgICAgICAgOAorICAgICAgMCAgICAgMjgwICAgICAyNDAgICAgIDIwMCAgICAgMTYwICAgICAxMjAgICAgICA4MCAgICAgIDQwICAgICAgIDAKKyAgICAgIDIgIDIzMywzMyAgICAgMjAwICAxNjYsNjcgIDEzMywzMyAgICAgMTAwICAgNjYsNjcgICAzMywzMyAgICAgICAwCisgICAgICA0ICAgICAyMDAgIDE3MSw0MyAgMTQyLDg2ICAxMTQsMjkgICA4NSw3MSAgIDU3LDE0ICAgMjgsNTcgICAgICAgMAorICAgICAgNiAgICAgMTc1ICAgICAxNTAgICAgIDEyNSAgICAgMTAwICAgICAgNzUgICAgICA1MCAgICAgIDI1ICAgICAgIDAKKyAgICAgIDggIDE1NSw1NiAgMTMzLDMzICAxMTEsMTEgICA4OCw4OSAgIDY2LDY3ICAgNDQsNDQgICAyMiwyMiAgICAgICAwCisgICAgIDEwICAgICAxNDAgICAgIDEyMCAgICAgMTAwICAgICAgODAgICAgICA2MCAgICAgIDQwICAgICAgMjAgICAgICAgMAorICAgICAxMiAgMTI3LDI3ICAxMDksMDkgICA5MCw5MSAgIDcyLDczICAgNTQsNTUgICAzNiwzNiAgIDE4LDE4ICAgICAgIDAKKyAgICAgMTQgIDExNiw2NyAgICAgMTAwICAgODMsMzMgICA2Niw2NyAgICAgIDUwICAgMzMsMzMgICAxNiw2NyAgICAgICAwCisgICAgIDE2ICAxMDcsNjkgICA5MiwzMSAgIDc2LDkyICAgNjEsNTQgICA0NiwxNSAgIDMwLDc3ICAgMTUsMzggICAgICAgMAorICAgICAxOCAgICAgMTAwICAgODUsNzEgICA3MSw0MyAgIDU3LDE0ICAgNDIsODYgICAyOCw1NyAgIDE0LDI5ICAgICAgIDAKKyAgICAgMjAgICA5MywzMyAgICAgIDgwICAgNjYsNjcgICA1MywzMyAgICAgIDQwICAgMjYsNjcgICAxMywzMyAgICAgICAwCisgICAgIDIyICAgIDg3LDUgICAgICA3NSAgICA2Miw1ICAgICAgNTAgICAgMzcsNSAgICAgIDI1ICAgIDEyLDUgICAgICAgMAorICAgICAyNCAgIDgyLDM1ICAgNzAsNTkgICA1OCw4MiAgIDQ3LDA2ICAgMzUsMjkgICAyMyw1MyAgIDExLDc2ICAgICAgIDAKKyAgICAgMjYgICA3Nyw3OCAgIDY2LDY3ICAgNTUsNTYgICA0NCw0NCAgIDMzLDMzICAgMjIsMjIgICAxMSwxMSAgICAgICAwCisgICAgIDI4ICAgNzMsNjggICA2MywxNiAgIDUyLDYzICAgNDIsMTEgICAzMSw1OCAgIDIxLDA1ICAgMTAsNTMgICAgICAgMAorICAgICAzMCAgICAgIDcwICAgICAgNjAgICAgICA1MCAgICAgIDQwICAgICAgMzAgICAgICAyMCAgICAgIDEwICAgICAgIDAKKyAgICAgMzIgICA2Niw2NyAgIDU3LDE0ICAgNDcsNjIgICAgMzgsMSAgIDI4LDU3ICAgMTksMDUgICAgOSw1MiAgICAgICAwCisgICAgIDM0ICAgNjMsNjQgICA1NCw1NSAgIDQ1LDQ1ICAgMzYsMzYgICAyNywyNyAgIDE4LDE4ICAgIDksMDkgICAgICAgMAorICAgICAzNSAgIDYyLDIyICAgNTMsMzMgICA0NCw0NCAgIDM1LDU2ICAgMjYsNjcgICAxNyw3OCAgICA4LDg5ICAgICAgIDAKKyAgICAgMzYgICA2MCw4NyAgIDUyLDE3ICAgNDMsNDggICAzNCw3OCAgIDI2LDA5ICAgMTcsMzkgICAgIDgsNyAgICAgICAwCisgICAgIDM4ICAgNTgsMzMgICAgICA1MCAgIDQxLDY3ICAgMzMsMzMgICAgICAyNSAgIDE2LDY3ICAgIDgsMzMgICAgICAgMAorICAgICA0MCAgICAgIDU2ICAgICAgNDggICAgICA0MCAgICAgIDMyICAgICAgMjQgICAgICAxNiAgICAgICA4ICAgICAgIDAKKyAgICAgNDIgICA1Myw4NSAgIDQ2LDE1ICAgMzgsNDYgICAzMCw3NyAgIDIzLDA4ICAgMTUsMzggICAgNyw2OSAgICAgICAwCisgICAgIDQ0ICAgNTEsODUgICA0NCw0NCAgIDM3LDA0ICAgMjksNjMgICAyMiwyMiAgIDE0LDgxICAgIDcsNDEgICAgICAgMAorICAgICA0NiAgICAgIDUwICAgNDIsODYgICAzNSw3MSAgIDI4LDU3ICAgMjEsNDMgICAxNCwyOSAgICA3LDE0ICAgICAgIDAKKyAgICAgNDggICA0OCwyOCAgIDQxLDM4ICAgMzQsNDggICAyNyw1OSAgIDIwLDY5ICAgMTMsNzkgICAgIDYsOSAgICAgICAwCisgICAgIDUwICAgNDYsNjcgICAgICA0MCAgIDMzLDMzICAgMjYsNjcgICAgICAyMCAgIDEzLDMzICAgIDYsNjcgICAgICAgMAorICAgICA1MiAgIDQ1LDE2ICAgMzgsNzEgICAzMiwyNiAgIDI1LDgxICAgMTksMzUgICAgMTIsOSAgICA2LDQ1ICAgICAgIDAKKyAgICAgNTQgICA0Myw3NSAgICAzNyw1ICAgMzEsMjUgICAgICAyNSAgIDE4LDc1ICAgIDEyLDUgICAgNiwyNSAgICAgICAwCisgICAgIDU2ICAgNDIsNDIgICAzNiwzNiAgICAzMCwzICAgMjQsMjQgICAxOCwxOCAgIDEyLDEyICAgIDYsMDYgICAgICAgMAorICAgICA1OCAgIDQxLDE4ICAgMzUsMjkgICAyOSw0MSAgIDIzLDUzICAgMTcsNjUgICAxMSw3NiAgICA1LDg4ICAgICAgIDAKKyAgICAgNjAgICAgICA0MCAgIDM0LDI5ICAgMjgsNTcgICAyMiw4NiAgIDE3LDE0ICAgMTEsNDMgICAgNSw3MSAgICAgICAwCisgICAgIDYyICAgMzgsODkgICAzMywzMyAgIDI3LDc4ICAgMjIsMjIgICAxNiw2NyAgIDExLDExICAgIDUsNTYgICAgICAgMAorICAgICA2NCAgIDM3LDg0ICAgMzIsNDMgICAyNywwMyAgIDIxLDYyICAgMTYsMjIgICAxMCw4MSAgICA1LDQxICAgICAgIDAKKyAgICAgNjYgICAzNiw4NCAgIDMxLDU4ICAgMjYsMzIgICAyMSwwNSAgIDE1LDc5ICAgMTAsNTMgICAgNSwyNiAgICAgICAwCisgICAgIDY4ICAgIDM1LDkgICAzMCw3NyAgIDI1LDY0ICAgMjAsNTEgICAxNSwzOCAgIDEwLDI2ICAgIDUsMTMgICAgICAgMAorICAgICA3MCAgICAgIDM1ICAgICAgMzAgICAgICAyNSAgICAgIDIwICAgICAgMTUgICAgICAxMCAgICAgICA1ICAgICAgIDAKKyAgICAgNzIgICAzNCwxNSAgIDI5LDI3ICAgMjQsMzkgICAxOSw1MSAgIDE0LDYzICAgIDksNzYgICAgNCw4OCAgICAgICAwCisgICAgIDc0ICAgMzMsMzMgICAyOCw1NyAgIDIzLDgxICAgMTksMDUgICAxNCwyOSAgICA5LDUyICAgIDQsNzYgICAgICAgMAorICAgICA3NiAgIDMyLDU2ICAgMjcsOTEgICAyMywyNiAgICAxOCw2ICAgMTMsOTUgICAgIDksMyAgICA0LDY1ICAgICAgIDAKKyAgICAgNzggICAzMSw4MiAgIDI3LDI3ICAgMjIsNzMgICAxOCwxOCAgIDEzLDY0ICAgIDksMDkgICAgNCw1NSAgICAgICAwCisgICAgIDgwICAgMzEsMTEgICAyNiw2NyAgIDIyLDIyICAgMTcsNzggICAxMywzMyAgICA4LDg5ICAgIDQsNDQgICAgICAgMAorICAgICA4MiAgIDMwLDQzICAgMjYsMDkgICAyMSw3NCAgIDE3LDM5ICAgMTMsMDQgICAgIDgsNyAgICA0LDM1ICAgICAgIDAKKyAgICAgODQgICAyOSw3OSAgIDI1LDUzICAgMjEsMjggICAxNywwMiAgIDEyLDc3ICAgIDgsNTEgICAgNCwyNiAgICAgICAwCisgICAgIDg2ICAgMjksMTcgICAgICAyNSAgIDIwLDgzICAgMTYsNjcgICAgMTIsNSAgICA4LDMzICAgIDQsMTcgICAgICAgMAorICAgICA4OCAgIDI4LDU3ICAgMjQsNDkgICAyMCw0MSAgIDE2LDMzICAgMTIsMjQgICAgOCwxNiAgICA0LDA4ICAgICAgIDAKKyAgICAgOTAgICAgICAyOCAgICAgIDI0ICAgICAgMjAgICAgICAxNiAgICAgIDEyICAgICAgIDggICAgICAgNCAgICAgICAwCisgICAgIDkyICAgMjcsNDUgICAyMyw1MyAgIDE5LDYxICAgMTUsNjkgICAxMSw3NiAgICA3LDg0ICAgIDMsOTIgICAgICAgMAorICAgICA5NCAgIDI2LDkyICAgMjMsMDggICAxOSwyMyAgIDE1LDM4ICAgMTEsNTQgICAgNyw2OSAgICAzLDg1ICAgICAgIDAKKyAgICAgOTYgICAyNiw0MiAgIDIyLDY0ICAgMTgsODcgICAxNSwwOSAgIDExLDMyICAgIDcsNTUgICAgMyw3NyAgICAgICAwCisgICAgIDk4ICAgMjUsOTMgICAyMiwyMiAgIDE4LDUyICAgMTQsODEgICAxMSwxMSAgICA3LDQxICAgICAzLDcgICAgICAgMAorICAgIDEwMCAgIDI1LDQ1ICAgMjEsODIgICAxOCwxOCAgIDE0LDU1ICAgMTAsOTEgICAgNywyNyAgICAzLDY0ICAgICAgIDAKKworU0lFSEUgQVVDSAorICAgICAgICBQX0FDQ0VQVF9QRUFDRSwgUF9QRUFDRV9ISVNUT1JZCisKK0xFVFpURSBBRU5ERVJVTkcKKzA3LjA2LjIwMDgsIFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vUGF5SW4gYi9kb2MvbGZ1bi9QYXlJbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzE0YzUzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vUGF5SW4KQEAgLTAsMCArMSw0NyBAQAorUGF5SW4oKQorRlVOS1RJT046CisgICAgIHZhcmFyZ3Mgdm9pZCBQYXlJbihpbnQgYW1vdW50LCBpbnQgcGVyY2VudCk7CisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3AvZGFlbW9uL3plbnRyYWxiYW5rLmMKKworQVJHVU1FTlRFOgorICAgICBpbnQgYW1vdW50CS0JZWluenV6YWhsZW5kZXIgQmV0cmFnCisgICAgIGludCBwZXJjZW50IC0JQmV3ZXJ0dW5nc3Byb3plbnRzYXR6CisKK0JFU0NIUkVJQlVORzoKKyAgICAgRXMgd2lyZCBCcnV0dG8gYW1vdW50IEdlbGQgaW4gZGllIEJhbmsgZWluZ2V6YWhsdC4gRGVyIFByb3plbnRzYXR6IGxlZ3QKKyAgICAgZmVzdCwgd2lldmllbCB0YXRzYWVjaGxpY2ggZ3V0Z2VzY2hyaWViZW4gd2lyZDoKKyAgICAgR3V0c2NocmlmdCA9IGFtb3VudCpwZXJjZW50LzEwMAorCisgICAgIFdpcmQgcGVyY2VudCBuaWNodCBhbmdlZ2ViZW4sIGRhbm4gd2lyZCBkZXIgZGVyemVpdGlnZSBCYW5rYmV3ZXJ0dW5ncy0KKyAgICAgbWFzc3N0YWIgZnVlciBHZWxkIGFuZ2Vub21tZW4uCisKK0JFSVNQSUVMRToKKyAgICAgI2luY2x1ZGUgPGJhbmsuaD4KKyAgICAgLi4uCisgICAgIEFkZENtZCgic3BlbmRlIiwjJ2FjdGlvbl9zcGVuZGUsCisJICAgICJXYXMgd2lsbHN0IGR1IHNwZW5kZW4/Iik7CisgICAgIC4uLgorICAgICBpbnQgYWN0aW9uX3NwZW5kZShzdHJpbmcgc3RyLCBleHRyYSAqbykgeworICAgICAgaW50IGk7CisgICAgICBpZihzc2NhbmYoIiVkIG11ZW56ZSIsaSk9PTEgJiYgaT4wKQorICAgICAgIGlmKHRoaXNfcGxheWVyKCktPlF1ZXJ5TW9uZXkoaSkgJiYgdGhpc19wbGF5ZXIoKS0+QWRkTW9uZXkoLWkpKSB7CisgICAgICAgIHdyaXRlKCJEdSBzcGVuZGVzdCAiK2krIiBNdWVuemVuLlxuIik7CisJc2F5KHRoaXNfcGxheWVyKCktPk5hbWUoV0VSKSsiIHNwZW5kZXQgIitpKyIgTXVlbnplbi5cbiIpOworCVpFTlRSQUxCQU5LLT5QYXlJbihpKTsKKwkKKyAgICAgICB9IGVsc2UKKyAgICAgICAgd3JpdGUoIlNvdmllbCBoYXN0IGR1IG5pY2h0IGRhYmVpIVxuIik7CisgICAgICAuLi4KKworQkVNRVJLVU5HRU46CisgICAgIFVuc2VyZSBaZW50cmFsYmFuayBpc3Qga29ycnVwdCwgdm9yIGFsbGVtIGRhZHVyY2gsIGRhc3MgaW4gTGFlZGVuIHVuZAorICAgICBhbiBhbmRlcmVuIFN0ZWxsZW4gR2VsZCBlcnpldWd0IHdpcmQuCisKK1NJRUhFIEFVQ0g6CisgICAgIEdlbGRoYW5kbGluZzoJQWRkTW9uZXkoTCksIFF1ZXJ5TW9uZXkoTCkKKyAgICAgWmVudHJhbGJhbms6CVdpdGhEcmF3KEwpLCBfcXVlcnlfY3VycmVudF9tb25leShMKQorICAgICBTb25zdGlnZXM6CQkvaXRlbXMvbW9uZXkuYywgL3N5cy9iYW5rLmgKKworMjcuIEFwciAyMDA0IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9QbGF5ZXJRdWl0IGIvZG9jL2xmdW4vUGxheWVyUXVpdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmUzZDZlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vUGxheWVyUXVpdApAQCAtMCwwICsxLDIwIEBACitQbGF5ZXJRdWl0KCkKKworRlVOS1RJT046CisgICAgdm9pZCBQbGF5ZXJRdWl0KG9iamVjdCBwbCk7CisKK0dFUlVGRU4gVk9OOgorICAgIC9zdGQvcGxheWVyL2Jhc2UuYworCitBUkdVTUVOVEU6CisgICAgb2JqZWN0IHBsCisgICAgICBTcGllbGVyLCBkZXIgVmVyYmluZHVuZyBiZWVuZGV0CisKK0JFU0NIUkVJQlVORzoKKyAgICBXaXJkIGltIGVudmlyb25tZW50KCkgZ2VydWZlbiwgd2VubiBkZXIgU3BpZWxlciBkYXMgTVVEIG1pdCAiZW5kZSIKKyAgICB2ZXJsYWVzc3QuCisKK1NJRUhFIEFVQ0g6CisgICAgQmVjb21lc05ldEFsaXZlKCksIEJlY29tZXNOZXREZWFkKCkKKyAgICAKKzI0LiBBdWcgMjAxMSBHbG9pbnNvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1ByZXNlbnRFbmVtaWVzIGIvZG9jL2xmdW4vUHJlc2VudEVuZW1pZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMzMWVmZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL1ByZXNlbnRFbmVtaWVzCkBAIC0wLDAgKzEsNzEgQEAKK0ZVTktUSU9OOgorCW9iamVjdCAqUHJlc2VudEVuZW1pZXMoKTsKKworREVGSU5JRVJUIElOOgorCS9zdGQvbGl2aW5nL2NvbWJhdC5jCisKK0FSR1VNRU5URToKKwlrZWluZQorCitSVWVDS0dBQkVXRVJUOgorCWFud2VzZW5kZSBGZWluZGUKKworQkVTQ0hSRUlCVU5HOgorCURpZXNlIEZ1bmt0aW9uIGxpZWZlcnQgZ2VuYXUgZGllIEZlaW5kZSB6dXJ1ZWNrLCBkaWUgc2ljaCBkZXJ6ZWl0IGltCisJc2VsYmVuIFJhdW0gYmVmaW5kZW4uIERpZSBGZWluZGUgdW50ZXJsaWVnZW4gaGllcmJlaSBub2NoIGdld2lzc2VuCisJRWluc2NocmFlbmt1bmdlbjoKKwkgICgxKSBTaWUgZHVlcmZlbiBhbHMgTlBDIG5pY2h0IGdlc3RvcmJlbiBzZWluLCBkYXMgaGVpc3N0LCBzaWUKKwkgICAgICBtdWVzc2VuIGFscyBPYmpla3Qgbm9jaCBleGlzdGllcmVuLgorCSAgKDIpIFNpZSBkdWVyZmVuIGFscyBTcGllbGVyIG5pY2h0IGdlc3RvcmJlbiBzZWluLCBkYXMgaGVpc3N0LCBzaWUKKwkgICAgICBkdWVyZmVuIGtlaW5lIEdlaXN0ZXIgc2VpbiAoUHJvcGVydHkgUF9HSE9TVCBuaWNodCBnZXNldHp0KS4KKwkgICgzKSBTaWUgbXVlc3NlbiBhbmdyZWlmYmFyIHNlaW4sIGRhcyBoZWlzc3QsIGRpZSBQcm9wZXJ0eQorCSAgICAgIFBfTk9fQVRUQUNLIGRhcmYgbmljaHQgZ2VzZXR6dCBzZWluLgorCVdpcmQgZWluZSBkaWVzZXIgQmVkaW5ndW5nZW4gdmVybGV0enQsIHNvIHdpcmQgZGVyIEdlZ25lciBhdXMgZGVyCisJaW50ZXJuZW4gR2VnbmVybGlzdGUgZW50ZmVybnQuIFp1c2FldHpsaWNoIGdpbHQ6CisJICBOZXR6dG90ZSB3ZXJkZW4gbnVyIGFscyBHZWduZXIgZXJrYW5udCwgd2VubiBrZWluZSBhbmRlcmVuIEdlZ25lcgorCSAgenVyIFZlcmZ1ZWd1bmcgc3RlaGVuLgorCitCRUlTUElFTDoKKwlJbSBGb2xnZW5kZW4gZXJibGluZGVuIGFsbGUgR2VnbmVyIGltIFJhdW06CisJICBzdHJpbmcgYmxpbmRUaGVtQWxsKCkKKwkgIHsgb2IqbGl2TGlzdDsKKwkgICAgaWYoIWxpdkxpc3Q9UHJlc2VudEVuZW1pZXMoKSkKKwkgICAgICByZXR1cm4gYnJlYWtfc3RyaW5nKAorCSAiTWlzdC4uLmtlaW5lciBkYSwgZGVyIGJsaW5kIHdlcmRlbiBtb2VjaHRlLiIsNzcsCisJIE5hbWUoV0VSKSsiIGdydW1tZWx0OiAiKTsKKwkgICAgZm9yKGk9c2l6ZW9mKGxpdkxpc3QpO2ktLTspCisJICAgIHsgaWYobGl2TGlzdFtpXS0+UXVlcnlQcm9wKFBfQkxJTkQpKQorCSAgICAgIHsgdGVsbF9vYmplY3QodGhpc19vYmplY3QoKSxicmVha19zdHJpbmcoCisJIGxpdkxpc3RbaV0tPk5hbWUoV0VSKSsiIGlzdCBzY2hvbiBibGluZC4iLDc3KSk7CisJICAgICAgICBjb250aW51ZTsKKwkgICAgICB9CisJICAgICAgdGVsbF9vYmplY3QodGhpc19vYmplY3QoKSxicmVha19zdHJpbmcoCisJICJEdSBrcmF0enQgIitsaXZMaXN0W2ldLT5uYW1lKFdFTSkrIiBkaWUgQXVnZW4gYXVzLiIsNzcpKTsKKwkgICAgICB0ZWxsX29iamVjdChsaXZMaXN0W2ldLGJyZWFrX3N0cmluZygKKwkgTmFtZShXRVIpKyIga3JhdHp0IERpciBkaWUgQXVnZW4gYXVzISIsNzcpKTsKKwkgICAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQodGhpc19vYmplY3QoKSksYnJlYWtfc3RyaW5nKAorCSBOYW1lKFdFUikrIiBrcmF0enQgIitsaXZMaXN0W2ldLT5uYW1lKFdFTSkKKwkrIiBkaWUgQXVnZW4gYXVzLiIsNzcpLCh7dGhpc19vYmplY3QoKSxsaXZMaXN0W2ldfSkpOworCSAgICAgIGxpdkxpc3RbaV0tPlNldFByb3AoUF9CTElORCwxKTsKKwkgICAgfQorCSAgICByZXR1cm4iIjsKKwkgIH0KKwlBdWZnZXJ1ZmVuIHdpcmQgZGFzIGdhbnplIGFtIEJlc3RlbiBpbiBlaW5lbSBDaGF0OgorCSAgdm9pZCBjcmVhdGUoKQorCSAgeyA6OmNyZWF0ZSgpOworCSAgICAuLi4KKwkgICAgU2V0UHJvcChQX0NIQVRfQ0hBTkNFLDEwKTsKKwkgICAgU2V0Q2hhdHMoMjAsKHticmVha19zdHJpbmcoCisJICJOaWNodCBhbmdyZWlmZW4sIHNvbnN0IHdpcnN0IER1IG5vY2ggYmxpbmQhIiw3NywKKwkgTmFtZShXRVIpKyIgYnJ1ZWxsdDogIiksCisJICAgICAgICAgICAgICAgICAgIkBAYmxpbmRUaGVtQWxsQEAifSkpOworCSAgfQorCU5hdHVlcmxpY2ggc2luZCBhdWNoIG5vY2ggbWVociBGdW5rdGlvbmVuIHVuZCBNZWxkdW5nZW4gYWxzIENoYXRzCisJbW9lZ2xpY2g6IERpZSB6d2VpIGltIEJlaXNwaWVsIHNpbmQgaW0gTm9ybWFsZmFsbCBldHdhcyB3ZW5pZy4KKworU0lFSEUgQVVDSDoKKwlTZWxlY3RFbmVteSgpLCBRdWVyeUVuZW1pZXMoKSwgSXNFbmVteSgpLCBQX0dIT1NULCBQX05PX0FUVEFDSywKKwlTZXRDaGF0cywgUF9DSEFUX0NIQU5DRQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBUaHUgTWF5IDI3IDE1OjAxOjQ4IDE5OTkgYnkgUGF0cnluCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9QcmVzZW50RW5lbXlSb3dzIGIvZG9jL2xmdW4vUHJlc2VudEVuZW15Um93cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzk2NDJjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vUHJlc2VudEVuZW15Um93cwpAQCAtMCwwICsxLDQwIEBACisKK1ByZXNlbnRFbmVteVJvd3MoKQorCisKK0ZVTktUSU9OOgorICAgICAgICB2YXJhcmdzIG1peGVkICpQcmVzZW50RW5lbXlSb3dzKG9iamVjdCAqaGVyZSkKKworREVGSU5JRVJUIElOOgorICAgICAgICAvc3RkL2xpdmluZy90ZWFtLmMKKworQVJHVU1FTlRFOgorICAgICAgICBSdWVja2dhYmV3ZXJ0IHZvbiBQcmVzZW50RW5lbWllcyBrYW5uIHVlYmVyZ2ViZW4gd2VyZGVuLgorCitCRVNDSFJFSUJVTkc6CisgICAgICAgIEVyZ2lidCBkaWUgZmVpbmRsaWNoZW4gUmVpaGVuLgorCitSVUVDS0dBQkVXRVJUOgorICAgICAgICBFaW4gQXJyYXksIGJlc3RlaGVuZCBhdXMgTUFYX1RFQU1ST1dTIEFycmF5cyBtaXQgZGVuIE9iamVrdGVuCisgICAgICAgIGRlciBhbndlc2VuZGVuIEZlaW5kZS4KKworQkVNRVJLVU5HRU46CisgICAgICAgIEplZGUgUmVpaGUgaXN0IFN1bW1lIGRlciBlbnRzcHJlY2hlbmRlbiBSZWloZW4gZGVyCisgICAgICAgIGFud2VzZW5kZW4gVGVhbXMuCisgICAgICAgIEZlaW5kZSwgZGllIGluIGtlaW5lbSBUZWFtIHNpbmQsIHN0ZWhlbiBpbSBlcnN0ZW4gQXJyYXkuCisKK1NJRUhFIEFVQ0g6CisgICAgICAgIFVlYmVyc2ljaHQ6IHRlYW1rYW1wZgorICAgICAgICBQcm9wZXJ0aWVzOiBQX1RFQU0sIFBfQVNTT0NfTUVNQkVSUywgUF9URUFNX0FUVEFDS19DTUQsCisgICAgICAgICAgICAgICAgICAgIFBfVEVBTV9BVVRPRk9MTE9XLCBQX1RFQU1fQ09MT1JTLCBQX1RFQU1fTEVBREVSLAorICAgICAgICAgICAgICAgICAgICBQX1RFQU1fTkVXTUVNQkVSLCBQX1RFQU1fV0FOVEVEX1JPVywgUF9URUFNX1dJTVBZX1JPVworICAgICAgICBCZXdlZ3VuZzogICBJc1RlYW1Nb3ZlLCBUZWFtRmxlZQorICAgICAgICBNaXRnbGllZGVyOiBJc1RlYW1MZWFkZXIsIFRlYW1NZW1iZXJzCisgICAgICAgIEthbXBmOiAgICAgIEFzc29jTWVtYmVyLCBEZUFzc29jTWVtYmVyLCBJbnNlcnRFbmVteVRlYW0sCisgICAgICAgICAgICAgICAgICAgIFNlbGVjdE5lYXJFbmVteSwgU2VsZWN0RmFyRW5lbXkKKyAgICAgICAgUG9zaXRpb25lbjogUHJlc2VudFBvc2l0aW9uLCBQcmVzZW50Um93cywgUHJlc2VudFRlYW1Qb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgU3dhcFJvd3MKKyAgICAgICAgU29uc3RpZ2VzOiAgVGVhbVByZWZpeCwgdGVhbWthbXBmX2ludGVybgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiAxNi0wOC0yMDEwLCBHYWJ5bG9uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9QcmVzZW50UG9zaXRpb24gYi9kb2MvbGZ1bi9QcmVzZW50UG9zaXRpb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE3NjVjZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL1ByZXNlbnRQb3NpdGlvbgpAQCAtMCwwICsxLDM4IEBACisKK1ByZXNlbnRQb3NpdGlvbigpCisKKworRlVOS1RJT046CisgICAgICAgIHZhcmFyZ3MgaW50IFByZXNlbnRQb3NpdGlvbihtaXhlZCBwbWFwKQorCitERUZJTklFUlQgSU46CisgICAgICAgIC9zdGQvbGl2aW5nL3RlYW0uYworCitBUkdVTUVOVEU6CisgICAgICAgIFJ1ZWNrZ2FiZXdlcnQgdm9uIFByZXNlbnRUZWFtUm93cygpIG9kZXIgUHJlc2VudFRlYW1Qb3NpdGlvbnMoKQorICAgICAgICBrYW5uIHVlYmVyZ2ViZW4gd2VyZGVuLgorCitCRVNDSFJFSUJVTkc6CisgICAgICAgIEVyZ2lidCBkaWUgTnVtbWVyIGRlciBSZWloZSwgaW4gZGVyIGRlciBTcGllbGVyIGdlcmFkZSBzdGVodC4KKworUlVFQ0tHQUJFV0VSVDoKKyAgICAgICAgUmVpaGVubnVtbWVyIGltIEJlcmVpY2ggdm9uIDEgYmlzIFRFQU1fTUFYUk9XUy4KKworQkVNRVJLVU5HRU46CisgICAgICAgIElzdCBlaW4gU3BpZWxlciBpbiBrZWluZW0gVGVhbSwgc28gc3RlaHQgZXIgYXV0b21hdGlzY2ggaW4gUmVpaGUgMS4KKworU0lFSEUgQVVDSDoKKyAgICAgICAgVWViZXJzaWNodDogdGVhbWthbXBmCisgICAgICAgIFByb3BlcnRpZXM6IFBfVEVBTSwgUF9BU1NPQ19NRU1CRVJTLCBQX1RFQU1fQVRUQUNLX0NNRCwKKyAgICAgICAgICAgICAgICAgICAgUF9URUFNX0FVVE9GT0xMT1csIFBfVEVBTV9DT0xPUlMsIFBfVEVBTV9MRUFERVIsCisgICAgICAgICAgICAgICAgICAgIFBfVEVBTV9ORVdNRU1CRVIsIFBfVEVBTV9XQU5URURfUk9XLCBQX1RFQU1fV0lNUFlfUk9XCisgICAgICAgIEJld2VndW5nOiAgIElzVGVhbU1vdmUsIFRlYW1GbGVlCisgICAgICAgIE1pdGdsaWVkZXI6IElzVGVhbUxlYWRlciwgVGVhbU1lbWJlcnMKKyAgICAgICAgS2FtcGY6ICAgICAgQXNzb2NNZW1iZXIsIERlQXNzb2NNZW1iZXIsIEluc2VydEVuZW15VGVhbSwKKyAgICAgICAgICAgICAgICAgICAgU2VsZWN0TmVhckVuZW15LCBTZWxlY3RGYXJFbmVteQorICAgICAgICBQb3NpdGlvbmVuOiBQcmVzZW50Um93cywgUHJlc2VudEVuZW15Um93cywgUHJlc2VudFRlYW1Qb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgU3dhcFJvd3MKKyAgICAgICAgU29uc3RpZ2VzOiAgVGVhbVByZWZpeCwgdGVhbWthbXBmX2ludGVybgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiAxNi0wOC0yMDEwLCBHYWJ5bG9uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9QcmVzZW50Um93cyBiL2RvYy9sZnVuL1ByZXNlbnRSb3dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4Yzg1NGEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9QcmVzZW50Um93cwpAQCAtMCwwICsxLDg4IEBACisKK1ByZXNlbnRSb3dzKCkKKworCitGVU5LVElPTjoKKyAgICBtaXhlZCAqUHJlc2VudFJvd3Mob2JqZWN0IGVudik7CisKK0RFRklOSUVSVCBJTjoKKyAgICBURUFNX09CSkVDVCAocy4gPGxpdmluZy90ZWFtLmg+KQorCitBUkdVTUVOVEU6CisgICAgb2JqZWN0IGVudgorICAgICAgICBEYXMgRW52aXJvbm1lbnQgZGVzIGdld3VlbnNjaHRlbiBPYmpla3Rlcy4KKworQkVTQ0hSRUlCVU5HOgorICAgIE1pdCBkaWVzZXIgRnVua3Rpb24gYmVrb21tdCBtYW4gZGllIGFrdHVlbGxlbiBUZWFtcmVpaGVuLCBkaWUgaW0gQXJndW1lbnQKKyAgICBlbnYgYW53ZXNlbmQgc2luZCwgZGVzIFRlYW1zIHp1cnVlY2tnZWdlYmVuLiBJc3QgZW52IGtlaW4gT2JqZWt0LCBzbworICAgIHdpcmQgZW52aXJvbm1lbnQodGhpc19wbGF5ZXIoKSkgYWxzIHNvbGNoZXMgYW5nZW5vbW1lbi4KKworUlVFQ0tHQUJFV0VSVDoKKyAgICBFcyB3aXJkIGVpbiBtaXhlZC1BcnJheSB6dXJ1ZWNrZ2VnZWJlbiwgZGFiZWkgc2luZCBkaWUgZWluemVsbmVuIFJlaWhlbgorICAgIHNlbGJzdCB3aWVkZXJ1bSBBcnJheXMgbWl0IGRlbiBTcGllbGVyb2JqZWt0ZW4uCisKK0JFSVNQSUVMOgorCisgICAgRWluIE5QQyBpbSBLYW1wZiBsYWVzc3QgZWluZSBGZXVlcndhbHplIGF1ZiBlaW4gVGVhbSBsb3MsIHdlbGNoZSBhYmVyIG51cgorICAgIFNwaWVsZXIgaW4gZGVyIGVyc3RlbiB1bmQgendlaXRlbiBUZWFtcmVpaGUgU2NoYWRlbiB6dWZ1ZWdlbiBzb2xsLgorCisgICAgdm9pZCBBdHRhY2soIG9iamVjdCBlbmVteSApCisgICAgeworICAgICAuLi4KKworICAgICBvYmplY3QgdGVhbSA9IGVuZW15LT5RdWVyeVByb3AoUF9URUFNKTsKKworICAgICBpZiAoIG9iamVjdHAodGVhbSkgKQorICAgICAgeworICAgICAgIG1peGVkIHRlYW1yb3dzID0gdGVhbS0+UHJlc2VudFJvd3MoZW5lbXkpOworCisvLyAgSW5oYWx0IHZvbiAidGVhbXJvd3MiIHp1IGRpZXNlbSBaZWl0cHVua3Q6CisKKy8vICAoeyAoe1svZHdhcmY6aGF1d2VnXX0pLCh7fSksKHtbL2VsZjpzcGl0em9ocl19KSwoe30pLCh7fSksKHt9KSB9KQorCisvLyAgSW4gZGVyIFVtZ2VidW5nIHZvbiBad2VyZyBIYXV3ZWcgc3RlaHQgYWxzbyBub2NoIEVsZiBTcGl0em9ociwgdW5kIHp3YXIKKy8vICBpbiBkZXIgZHJpdHRlbiBUZWFtcmVpaGUgKGRlciBoYXQgR2x1ZWNrIGdlaGFidCkuCisvLyAgV2VubiBkZW0gVGVhbSBub2NoIG1laHIgU3BpZWxlciBhbmdlaG9lcmVuLCBiZWZpbmRlbiBzaWUgc2ljaCBnZXJhZGUKKy8vICBuaWNodCBpbiBkZXIgVW1nZWJ1bmcgKHNwcmljaCBpbSBzZWxiZW4gUmF1bSkgd2llIEhhdXdlZy4KKworICAgICAgIGZvcmVhY2ggKCBpIDogMiApCisgICAgICAgIHsKKyAgICAgICAgIGZvcmVhY2ggKCBvYmplY3QgcGwgOiB0ZWFtcm93c1tpXSApCisgICAgICAgICAgeworICAgICAgICAgICB0ZWxsX29iamVjdChwbCwiRGVyIEZldWVydGV1ZmVsIGxhZXNzdCBlaW5lIEZldWVyd2FsemUgYXVmIERpY2ggIgorICAgICAgICAgICAgICAgInVuZCBEZWluIFRlYW0gbG9zLlxuIik7CisKKyAgICAgICAgICAgcGwtPkRlZmVuZCgyMDArcmFuZG9tKDIwMCksKHtEVF9GSVJFfSksKFtTUF9TSE9XX0RBTUFHRToxXSksVE8pOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICBlbHNlCisgICAgICB7CisgICAgICAgdGVsbF9vYmplY3QoZW5lbXksIkRlciBGZXVlcnRldWZlbCBsYWVzc3QgZWluZSBGZXVlcndhbHplIGF1ZiBEaWNoICIKKyAgICAgICAgICAgImxvcy5cbiIpOworCisgICAgICAgZW5lbXktPkRlZmVuZCgyMDArcmFuZG9tKDIwMCksKHtEVF9GSVJFfSksKFtTUF9TSE9XX0RBTUFHRToxXSksVE8pOworICAgICAgfQorCisgICAgIC4uLgorICAgIH0KKworQkVNRVJLVU5HOgorICAgIE1hbiBiZWFjaHRlLCBkYXNzIGRhcyBlcnN0ZSBBcmd1bWVudCAoYWxzbyBBcmd1bWVudCAwKSBkaWUgZXJzdGUKKyAgICBUZWFtcmVpaGUgaXN0LgorCitTSUVIRSBBVUNIOgorICAgICAgICBVZWJlcnNpY2h0OiB0ZWFta2FtcGYKKyAgICAgICAgUHJvcGVydGllczogUF9URUFNLCBQX0FTU09DX01FTUJFUlMsIFBfVEVBTV9BVFRBQ0tfQ01ELAorICAgICAgICAgICAgICAgICAgICBQX1RFQU1fQVVUT0ZPTExPVywgUF9URUFNX0NPTE9SUywgUF9URUFNX0xFQURFUiwKKyAgICAgICAgICAgICAgICAgICAgUF9URUFNX05FV01FTUJFUiwgUF9URUFNX1dBTlRFRF9ST1csIFBfVEVBTV9XSU1QWV9ST1cKKyAgICAgICAgQmV3ZWd1bmc6ICAgSXNUZWFtTW92ZSwgVGVhbUZsZWUKKyAgICAgICAgTWl0Z2xpZWRlcjogSXNUZWFtTGVhZGVyLCBUZWFtTWVtYmVycworICAgICAgICBLYW1wZjogICAgICBBc3NvY01lbWJlciwgRGVBc3NvY01lbWJlciwgSW5zZXJ0RW5lbXlUZWFtLAorICAgICAgICAgICAgICAgICAgICBTZWxlY3ROZWFyRW5lbXksIFNlbGVjdEZhckVuZW15CisgICAgICAgIFBvc2l0aW9uZW46IFByZXNlbnRQb3NpdGlvbiwgUHJlc2VudEVuZW15Um93cywgUHJlc2VudFRlYW1Qb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgU3dhcFJvd3MKKyAgICAgICAgU29uc3RpZ2VzOiAgVGVhbVByZWZpeCwgdGVhbWthbXBmX2ludGVybgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiAxNi0wOC0yMDEwLCBHYWJ5bG9uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9QcmVzZW50VGVhbVBvc2l0aW9ucyBiL2RvYy9sZnVuL1ByZXNlbnRUZWFtUG9zaXRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YWRjMTcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9QcmVzZW50VGVhbVBvc2l0aW9ucwpAQCAtMCwwICsxLDQwIEBACisKK1ByZXNlbnRUZWFtUG9zaXRpb25zKCkKKworCitGVU5LVElPTjoKKyAgICAgICAgdmFyYXJncyBtYXBwaW5nIFByZXNlbnRUZWFtUG9zaXRpb25zKG1peGVkIHBtYXApCisKK0RFRklOSUVSVCBJTjoKKyAgICAgICAgL3N0ZC9saXZpbmcvdGVhbS5jCisKK0FSR1VNRU5URToKKyAgICAgICAgUnVlY2tnYWJld2VydCB2b24gUHJlc2VudFRlYW1Sb3dzKCkga2FubiB1ZWJlcmdlYmVuIHdlcmRlbi4KKworQkVTQ0hSRUlCVU5HOgorICAgICAgICBFcm1pdHRlbHQgZGllIFJlaWhlbm51bW1lcm4gYWxsZXIgYW53ZXNlbmRlciBUZWFtbWl0Z2xpZWRlci4KKworUlVFQ0tHQUJFV0VSVDoKKyAgICAgICAgRWluIE1hcHBpbmcgbWl0IGRlbiBSZWloZW5udW1tZXJuICh2b24gMSBiaXMgTUFYX1RFQU1ST1dTKQorICAgICAgICBkZXIgYW53ZXNlbmRlbiBUZWFtbWl0Z2xpZWRlci4KKworQkVNRVJLVU5HRU46CisgICAgICAgIEthbm4gYXVjaCB6dXIgS29udmVydGllcnVuZyBhbmRlcmVyIEthbXBmcmVpaGVuLUFycmF5cyBpbgorICAgICAgICBlaW4gUG9zaXRpb25zLU1hcHBpbmcgdmVyd2VuZGV0IHdlcmRlbi4KKyAgICAgICAgSXN0IGRlciBTcGllbGVyIGluIGtlaW5lbSBUZWFtLCBzbyBzdGVodCBlciBpbiBSZWloZSAxLgorCitTSUVIRSBBVUNIOgorICAgICAgICBVZWJlcnNpY2h0OiB0ZWFta2FtcGYKKyAgICAgICAgUHJvcGVydGllczogUF9URUFNLCBQX0FTU09DX01FTUJFUlMsIFBfVEVBTV9BVFRBQ0tfQ01ELAorICAgICAgICAgICAgICAgICAgICBQX1RFQU1fQVVUT0ZPTExPVywgUF9URUFNX0NPTE9SUywgUF9URUFNX0xFQURFUiwKKyAgICAgICAgICAgICAgICAgICAgUF9URUFNX05FV01FTUJFUiwgUF9URUFNX1dBTlRFRF9ST1csIFBfVEVBTV9XSU1QWV9ST1cKKyAgICAgICAgQmV3ZWd1bmc6ICAgSXNUZWFtTW92ZSwgVGVhbUZsZWUKKyAgICAgICAgTWl0Z2xpZWRlcjogSXNUZWFtTGVhZGVyLCBUZWFtTWVtYmVycworICAgICAgICBLYW1wZjogICAgICBBc3NvY01lbWJlciwgRGVBc3NvY01lbWJlciwgSW5zZXJ0RW5lbXlUZWFtLAorICAgICAgICAgICAgICAgICAgICBTZWxlY3ROZWFyRW5lbXksIFNlbGVjdEZhckVuZW15CisgICAgICAgIFBvc2l0aW9uZW46IFByZXNlbnRQb3NpdGlvbiwgUHJlc2VudFJvd3MsIFByZXNlbnRFbmVteVJvd3MsCisgICAgICAgICAgICAgICAgICAgIFN3YXBSb3dzCisgICAgICAgIFNvbnN0aWdlczogIFRlYW1QcmVmaXgsIHRlYW1rYW1wZl9pbnRlcm4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogMTYtMDgtMjAxMCwgR2FieWxvbgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vUHJlc2VudFRlYW1Sb3dzIGIvZG9jL2xmdW4vUHJlc2VudFRlYW1Sb3dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YmZhN2UKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9QcmVzZW50VGVhbVJvd3MKQEAgLTAsMCArMSwyNCBAQAorUHJlc2VudFRlYW1Sb3dzKCkKKworRlVOS1RJT046CisJbWl4ZWQgKlByZXNlbnRUZWFtUm93cygpCisKK0RFRklOSUVSVCBJTjoKKwkvc3RkL2xpdmluZy90ZWFtLmMKKworQVJHVU1FTlRFOgorCWtlaW5lCisKK0JFU0NIUkVJQlVORzoKKwlFcmdpYnQgZGllIFJlaWhlbiBtaXQgZGVuIGFud2VzZW5kZW4gVGVhbW1pdGdsaWVkZXJuLgorCitSVUVDS0dBQkVXRVJUOgorCUVpbiBBcnJheSBiZXN0ZWhlbmQgYXVzIE1BWF9URUFNUk9XUyBBcnJheXMgbWl0IGRlbiBPYmpla3RlbgorICAgICAgICBkZXIgYW53ZXNlbmRlbiBUZWFtbWl0Z2xpZWRlci4KKworQkVNRVJLVU5HRU46CisJV2VubiBkZXIgU3BpZWxlciBpbiBrZWluZW0gVGVhbSBpc3QsIGVudGhhZWx0IGRhcyBlcnN0ZSBBcnJheQorCW51ciBkZW4gU3BpZWxlciB1bmQgZGllIGFuZGVyZW4gQXJyYXlzIHNpbmQgbGVlci4KKworU0lFSEUgQVVDSDoKKwl0ZWFtcwpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vUHJldmVudEZvbGxvdyBiL2RvYy9sZnVuL1ByZXZlbnRGb2xsb3cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAwZjkyZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL1ByZXZlbnRGb2xsb3cKQEAgLTAsMCArMSw0OSBAQAorUHJldmVudEZvbGxvdygpCisKK0ZVTktUSU9OOgorICBpbnQgUHJldmVudEZvbGxvdyhvYmplY3QgZGVzdCkKKworQVJHVU1FTlRFOgorICBkZXN0OiBaaWVsb2JqZWt0LCBpbiBkYXMgZGVyIFZlcmZvbGd0ZSBiZXdlZ3Qgd2VyZGVuIHNvbGwuCisKK0ZVTktUSU9OOgorICBJbiBqZWRlbSBWZXJmb2xnZXIsIGRlciBtaXQgQWRkUHVyc3VlciBpbiBkaWUgTGlzdGUgZGVyIFZlcmZvbGdlciAKKyAgZWluZ2V0cmFnZW4gd3VyZGUsIHdpcmQgdm9yIGRlbSBCZXdlZ2VuIGluIGRhcyBaaWVsb2JqZWt0IGRpZSBGdW5rdGlvbgorICBQcmV2ZW50Rm9sbG93IG1pdCBkZW0gWmllbG9iamVrdCBhbHMgQXJndW1lbnQgYXVmZ2VydWZlbi4KKworUlVFQ0tHQUJFV0VSVDoKKyAgMDogVmVyZm9sZ2VyIGRhcmYgaW4gZGFzIFppZWxvYmpla3QgZm9sZ2VuCisgIDE6IFZlcmZvbGdlciBkYXJmIGluIGRpZXNlcyBaaWVsb2JqZWt0IG5pY2h0IGZvbGdlbgorICAgICAoVmVyZm9sZ3VuZyBibGVpYnQgd2VpdGVyaGluIGFrdGl2KQorICAyOiBWZXJmb2xnZXIgZGFyZiBpbiBkaWVzZXMgWmllbG9iamVrdCBuaWNodCBmb2xnZW4KKyAgICAgKFZlcmZvbGd1bmcgd2lyZCBhYmdlYnJvY2hlbiB1bmQgVmVyZm9sZ2VyIGF1cyBkZXIgVmVyZm9sZ2VybGlzdGUKKyAgICAgIGF1c2dldHJhZ2VuKQorCitCRU1FUktVTkc6CisgIER1cmNoIFByZXZlbnRGb2xsb3cga2FubiBkZXIgcmFldW1saWNoZSBCZXJlaWNoLCBpbiBkZW0gdmVyZm9sZ3Qgd2VyZGVuCisgIGRhcmYsIGVpbmdlc2NocmFlbmt0IHdlcmRlbi4KKworQkVJU1BJRUxFOgorICBNYW4gbW9lY2h0ZSwgZGFzcyBlaW4gTlBDIGF1ZiBlaW5lciBJbnNlbCBuaWNodCBtaXQgZGVtIFNwaWVsZXIgaW4gZGFzCisgIEJvb3Qgc3RlaWd0LCB1bSBtaXQgZGVtIFNwaWVsZXIgenVzYW1tZW4gdm9uIGRlciBJbnNlbCBoZXJ1bnRlcnp1a29tbWVuLgorCisgICNkZWZpbmUgUEFUSCh4KSAoIi9kLy4uLi8uLi4vbWVpbi9wZmFkLysoeCkiKSAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIGludCBQcmV2ZW50Rm9sbG93KG9iamVjdCBib290KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgIHsKKyAgICBpZiAoIG9iamVjdF9uYW1lKGJvb3QpWzAuLnN0cmxlbihQQVRIKCJib290IikpLTFdID09IFBBVEgoImJvb3QiKSApCisgICAgIHJldHVybiAxOworICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICBEaWVzZSBGdW5rdGlvbnMtRGVmaW5pdGlvbiBpc3Qgc2VociBmbGV4aWJlbCwgZGVubiBzaWUgZXJsYXVidCBzb3dvaGwKKyAgc3BhZXRlcmUgUGZhZGFucGFzc3VuZyBhbHMgYXVjaCBtZWhyZXJlIEJvb3RlLgorICBEYSB1ZWJlciBkaWUgRnVua3Rpb24gc3RybGVuKCkgbnVyIGJpcyB6dW0gbGV0enRlbiBCdWNoc3RhYmVuIGRlcyAgICAKKyAgYW5nZWdlYmVuZW4gU3RyaW5ncyBnZXRlc3RldCB3aXJkLCB3aXJkIGFsc28gZ2xlaWNoemVpdGlnIGF1Y2ggYXVmICAgICAgICAgIAorICBib290WzFdLCBib290WzJdIHVzdy4gZ2V0ZXN0ZXQuCisKK1NJRUhFIEFVQ0g6CisgICJBZGRQdXJzdWVyIiwgIlJlbW92ZVB1cnN1ZXIiCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBUdWUgSnVuIDEwIDEzOjU5OjMwIDIwMDMgYnkgR2FieWxvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1ByZXZlbnRJbnNlcnQgYi9kb2MvbGZ1bi9QcmV2ZW50SW5zZXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1YzE1MzMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9QcmV2ZW50SW5zZXJ0CkBAIC0wLDAgKzEsNDYgQEAKK1ByZXZlbnRJbnNlcnQoKQorCitGVU5LVElPTjoKKyAgICAgaW50IFByZXZlbnRJbnNlcnQob2JqZWN0IG9iKTsKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL2NvbnRhaW5lci9yZXN0cmljdGlvbnMuYworCitBUkdVTUVOVEU6CisgICAgIG9iCisgICAgICAgICAgRGFzIE9iamVrdCwgZGFzIGluIGRlbiBCZWhhZWx0ZXIgZWluZ2VmdWVndCB3ZXJkZW4gc29sbC4KKworQkVTQ0hSRUlCVU5HOgorICAgICBNaXQgZGllc2VyIEZ1bmt0aW9uIGthbm4gZWluIEJlaGFlbHRlciBwcnVlZmVuLCBvYiBlciBkYXMgT2JqZWt0IG9iCisgICAgIGF1Zm5laG1lbiBtb2VjaHRlIG9kZXIgbmljaHQuCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIDAsIHdlbm4gZGFzIE9iamVrdCBhdWZnZW5vbW1lbiB3ZXJkZW4ga2FubjsgZWluIFdlcnQgZ3JvZXNzZXIgYWxzIDAKKyAgICAgemVpZ3QgYW4sIGRhc3MgZGFzIE9iamVrdCBuaWNodCBhdWZnZW5vbW1lbiB3ZXJkZW4gc29sbC4KKworQkVNRVJLVU5HRU46CisgICAgIFdlbm4gb2IgbWl0IGRlbSBGbGFnIE1fTk9DSEVDSyBiZXdlZ3Qgd2lyZCwgd2lyZCBQcmV2ZW50SW5zZXJ0KCkgendhcgorICAgICBhdWZnZXJ1ZmVuLCBkYXMgT2JqZWt0IHdpcmQgamVkb2NoIGF1ZiBqZWRlbiBGYWxsIGluIGRlbiBCZWhhZWx0ZXIKKyAgICAgYmV3ZWd0LCB1bmFiaGFlbmdpZyB2b20gUnVlY2tnYWJld2VydCEKKworQkVJU1BJRUxFOgorICAgICBVbSB6dSB2ZXJoaW5kZXJuLCBkYXNzIG1hbiBHZWxkIGluIGVpbmVuIEJlaGFlbHRlciBzdGVja2VuIGthbm4sIHNvbGx0ZQorICAgICBtYW4gd2llIGZvbGd0IHZvcmdlaGVuOgorCisgICAgIHZhcmFyZ3MgaW50IFByZXZlbnRJbnNlcnQob2JqZWN0IG9iKQorICAgICB7CisgICAgICAgLy8gV2VubiBlcyBHZWxkIGlzdCwgZXJoZWJlbiB3aXIgc29mb3J0IEVpbnNwcnVjaAorICAgICAgIGlmIChvYi0+aWQoImdlbGQiKSkKKyAgICAgICAgIHJldHVybiAxOworICAgICAgIC8vIEFuc29uc3RlbiBrb2VubnRlIGVpbiBlcmVyYnRlcyBPYmpla3Qgbm9jaCBFaW5zcHJ1Y2ggZXJoZWJlbiEKKyAgICAgICBlbHNlCisgICAgICAgICByZXR1cm4gOjpQcmV2ZW50SW5zZXJ0KG9iKTsKKyAgICAgfQorCitTSUVIRSBBVUNIOgorICAgICBQcmV2ZW50TGVhdmUoKSwgTm90aWZ5SW5zZXJ0KCksIE5vdGlmeUxlYXZlKCksIE1heUFkZE9iamVjdCgpLAorICAgICBQcmV2ZW50SW5zZXJ0TGl2aW5nKCksIFByZXZlbnRMZWF2ZUxpdmluZygpLCBOb3RpZnlNb3ZlKCksCisgICAgIFByZXZlbnRNb3ZlKCksIE1heUFkZFdlaWdodCgpLCBtb3ZlKCksIC9zdGQvY29udGFpbmVyL3Jlc3RyaWN0aW9ucy5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFNhdCBEZWMgMTggMDI6MDA6MDAgMTk5OSBieSBUaWFtYWsKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1ByZXZlbnRJbnNlcnRMaXZpbmcgYi9kb2MvbGZ1bi9QcmV2ZW50SW5zZXJ0TGl2aW5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZjQzMWYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9QcmV2ZW50SW5zZXJ0TGl2aW5nCkBAIC0wLDAgKzEsMzUgQEAKK1ByZXZlbnRJbnNlcnRMaXZpbmcoKQorCitGVU5LVElPTjoKKyAgICAgaW50IFByZXZlbnRJbnNlcnRMaXZpbmcob2JqZWN0IG9iKTsKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL2NvbnRhaW5lci9yZXN0cmljdGlvbnMuYworCitBUkdVTUVOVEU6CisgICAgIG9iCisgICAgICAgICAgRGFzIExpdmluZywgZGFzIGluIGRlbiBCZWhhZWx0ZXIgZWluZ2VmdWVndCB3ZXJkZW4gc29sbC4KKworQkVTQ0hSRUlCVU5HOgorICAgICBNaXQgZGllc2VyIEZ1bmt0aW9uIGthbm4gZWluIEJlaGFlbHRlciBwcnVlZmVuLCBvYiBlciBkYXMgTGl2aW5nIG9iCisgICAgIGF1Zm5laG1lbiBtb2VjaHRlIG9kZXIgbmljaHQuCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIDAsIHdlbm4gZGFzIExpdmluZyBhdWZnZW5vbW1lbiB3ZXJkZW4ga2FubjsgZWluIFdlcnQgZ3JvZXNzZXIgYWxzIDAKKyAgICAgemVpZ3QgYW4sIGRhc3MgZGFzIExpdmluZyBuaWNodCBhdWZnZW5vbW1lbiB3ZXJkZW4gc29sbC4KKworQkVNRVJLVU5HRU46CisgICAgIFdlbm4gb2IgbWl0IGRlbSBGbGFnIE1fTk9DSEVDSyBiZXdlZ3Qgd2lyZCwgd2lyZCBQcmV2ZW50SW5zZXJ0TGl2aW5nKCkgCisgICAgIHp3YXIgYXVmZ2VydWZlbiwgZGFzIExpdmluZyB3aXJkIGplZG9jaCBhdWYgamVkZW4gRmFsbCBpbiBkZW4gQmVoYWVsdGVyCisgICAgIGJld2VndCwgdW5hYmhhZW5naWcgdm9tIFJ1ZWNrZ2FiZXdlcnQhCisKKworU0lFSEUgQVVDSDoKKyAgICAgUHJldmVudExlYXZlTGl2aW5nKCksIC9zdGQvY29udGFpbmVyL3Jlc3RyaWN0aW9ucy5jLAorICAgICBQcmV2ZW50TW92ZSgpLCBQcmV2ZW50SW5zZXJ0KCksIFByZXZlbnRMZWF2ZSgpLAorICAgICBOb3RpZnlNb3ZlKCksIE5vdGlmeUluc2VydCgpLCBOb3RpZnlMZWF2ZSgpLCBOb3RpZnlSZW1vdmUoKSwKKyAgICAgbW92ZSgpLCBpbml0KCksIGV4aXQoKSwKKyAgICAgSW5pdEF0dGFjaygpLCBFeGl0QXR0YWNrKCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogMDQuMDguMjAwNywgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vUHJldmVudExlYXZlIGIvZG9jL2xmdW4vUHJldmVudExlYXZlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZDQ2YTMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9QcmV2ZW50TGVhdmUKQEAgLTAsMCArMSwzNSBAQAorUHJldmVudExlYXZlKCkKKworRlVOS1RJT046CisgICAgIGludCBQcmV2ZW50TGVhdmUob2JqZWN0IG9iLCBtaXhlZCBkZXN0KTsKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL2NvbnRhaW5lci9yZXN0cmljdGlvbnMuYworCitBUkdVTUVOVEU6CisgICAgIG9iCisgICAgICAgICAgRGFzIE9iamVrdCwgZGFzIGF1cyBkZW0gQmVoYWVsdGVyIGdlbm9tbWVuIHdlcmRlbiBzb2xsLgorICAgICBkZXN0IAorICAgICAgICAgIERhcyBaaWVsIGluIGRhcyBkYXMgT2JqZWt0IG9iIGJld2VndCB3ZXJkZW4gc29sbC4KKworQkVTQ0hSRUlCVU5HOgorICAgICBNaXQgZGllc2VyIEZ1bmt0aW9uIGthbm4gZWluIEJlaGFlbHRlciBwcnVlZmVuLCBvYiBlciBkYXMgT2JqZWt0IG9iCisgICAgIHNpY2ggYmV3ZWdlbiBsYXNzZW4gbW9lY2h0ZSBvZGVyIG5pY2h0LgorCitSVWVDS0dBQkVXRVJUOgorICAgICAwLCB3ZW5uIGRhcyBPYmpla3QgYmV3ZWd0IHdlcmRlbiBrYW5uOyBlaW4gV2VydCBncm9lc3NlciBhbHMgMAorICAgICB6ZWlndCBhbiwgZGFzcyBkYXMgT2JqZWt0IG5pY2h0IGJld2VndCB3ZXJkZW4gc29sbC4KKworQkVNRVJLVU5HRU46CisgICAgIFdlbm4gb2IgbWl0IGRlbSBGbGFnIE1fTk9DSEVDSyBiZXdlZ3Qgd2lyZCwgd2lyZCBQcmV2ZW50TGVhdmUoKSB6d2FyCisgICAgIGF1ZmdlcnVmZW4sIGRhcyBPYmpla3Qgd2lyZCBqZWRvY2ggYXVmIGplZGVuIEZhbGwgYXVzIGRlbSBCZWhhZWx0ZXIKKyAgICAgYmV3ZWd0LCB1bmFiaGFlbmdpZyB2b20gUnVlY2tnYWJld2VydCEKKworU0lFSEUgQVVDSDoKKyAgICAgUHJldmVudEluc2VydCgpLCBOb3RpZnlJbnNlcnQoKSwgTm90aWZ5TGVhdmUoKSwKKyAgICAgTWF5QWRkV2VpZ2h0KCksIG1vdmUoKSwgL3N0ZC9jb250YWluZXIvcmVzdHJpY3Rpb25zLmMKKyAgICAgUHJldmVudExlYXZlTGl2aW5nKCksIFByZXZlbnRJbnNlcnRMaXZpbmcoKSwgUHJldmVudE1vdmUoKSwKKyAgICAgTm90aWZ5TW92ZSgpLCBNYXlBZGRPYmplY3QoKSwgTm90aWZ5UmVtb3ZlKCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogMDQuMDguMjAwNywgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vUHJldmVudExlYXZlTGl2aW5nIGIvZG9jL2xmdW4vUHJldmVudExlYXZlTGl2aW5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMTNiNTQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9QcmV2ZW50TGVhdmVMaXZpbmcKQEAgLTAsMCArMSwzNSBAQAorUHJldmVudExlYXZlTGl2aW5nKCkKKworRlVOS1RJT046CisgICAgIGludCBQcmV2ZW50TGVhdmVMaXZpbmcob2JqZWN0IG9iLCBtaXhlZCBkZXN0KTsKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL2NvbnRhaW5lci9yZXN0cmljdGlvbnMuYworCitBUkdVTUVOVEU6CisgICAgIG9iCisgICAgICAgICAgRGFzIExpdmluZywgZGFzIGF1cyBkZW0gQmVoYWVsdGVyIGdlbm9tbWVuIHdlcmRlbiBzb2xsLgorICAgICBkZXN0IAorICAgICAgICAgIERhcyBaaWVsIGluIGRhcyBkYXMgTGl2aW5nIG9iIGJld2VndCB3ZXJkZW4gc29sbC4KKworQkVTQ0hSRUlCVU5HOgorICAgICBNaXQgZGllc2VyIEZ1bmt0aW9uIGthbm4gZWluIEJlaGFlbHRlciBwcnVlZmVuLCBvYiBlciBkYXMgTGl2aW5nIG9iCisgICAgIHNpY2ggYmV3ZWdlbiBsYXNzZW4gbW9lY2h0ZSBvZGVyIG5pY2h0LgorCitSVWVDS0dBQkVXRVJUOgorICAgICAwLCB3ZW5uIGRhcyBMaXZpbmcgYmV3ZWd0IHdlcmRlbiBrYW5uOyBlaW4gV2VydCBncm9lc3NlciBhbHMgMAorICAgICB6ZWlndCBhbiwgZGFzcyBkYXMgTGl2aW5nIG5pY2h0IGJld2VndCB3ZXJkZW4gc29sbC4KKworQkVNRVJLVU5HRU46CisgICAgIFdlbm4gb2IgbWl0IGRlbSBGbGFnIE1fTk9DSEVDSyBiZXdlZ3Qgd2lyZCwgd2lyZCBQcmV2ZW50TGVhdmUoKSB6d2FyCisgICAgIGF1ZmdlcnVmZW4sIGRhcyBMaXZpbmcgd2lyZCBqZWRvY2ggYXVmIGplZGVuIEZhbGwgYXVzIGRlbSBCZWhhZWx0ZXIKKyAgICAgYmV3ZWd0LCB1bmFiaGFlbmdpZyB2b20gUnVlY2tnYWJld2VydCEKKworU0lFSEUgQVVDSDoKKyAgICAgUHJldmVudEluc2VydExpdmluZygpLCAvc3RkL2NvbnRhaW5lci9yZXN0cmljdGlvbnMuYworICAgICBQcmV2ZW50TW92ZSgpLCBQcmV2ZW50TGVhdmUoKSwgUHJldmVudEluc2VydCgpLAorICAgICBOb3RpZnlNb3ZlKCksIE5vdGlmeUxlYXZlKCksIE5vdGlmeUluc2VydCgpLCBOb3RpZnlSZW1vdmUoKSwKKyAgICAgbW92ZSgpLCBleGl0KCksIGluaXQoKSwKKyAgICAgSW5pdEF0dGFjaywgRXhpdEF0dGFjaygpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiAwNC4wOC4yMDA3LCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9QcmV2ZW50TW92ZSBiL2RvYy9sZnVuL1ByZXZlbnRNb3ZlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5OGVlMGIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9QcmV2ZW50TW92ZQpAQCAtMCwwICsxLDgxIEBACitQcmV2ZW50SW5zZXJ0KCkKKworRlVOS1RJT046CisgICAgIHByb3RlY3RlZCBpbnQgUHJldmVudE1vdmUob2JqZWN0IGRlc3QsIG9iamVjdCBvbGRlbnYsIGludCBtZXRob2QpOworCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvdGhpbmcvbW92aW5nLmMKKyAgICAgL3N0ZC9saXZpbmcvbW92aW5nLmMKKyAgICAgL3N0ZC9wbGF5ZXIvbW92aW5nLmMKKworQVJHVU1FTlRFOgorICAgICBkZXN0CisgICAgICAgICAgRGFzIFppZWwgZGVzIE1vdmVzCisgICAgIG9sZGVudgorICAgICAgICAgIERhcyAoTm9jaC0pRW52aXJvbm1lbnQgZGVzIE9iamVrdHMKKyAgICAgbWV0aG9kCisgICAgICAgICAgRGllIE1vdmUtTWV0aG9kZShuKSwgbWl0IGRlci9kZW5lbiBiZXdlZ3Qgd2VyZGVuIHNvbGwKKworQkVTQ0hSRUlCVU5HOgorICAgICBNaXQgZGllc2VyIEZ1bmt0aW9uIHBydWVmdCBlaW4gT2JqZWt0LCBvYiBlcyB2b24gJ29sZGVudicgbmFjaCAnZGVzdCcKKyAgICAgYmV3ZWd0IHdlcmRlbiBtYWcuIERhYmVpIHdpcmQgJ21ldGhvZCcgYmVydWVja3NpY2h0aWd0ICh6LkIuIHNjaGFsdGV0CisgICAgIE1fTk9DSEVDSyBkaWUgbWVpc3RlbiBQcnVlZnVuZ2VuIGFiKS4KKyAgICAgQmVpIEdlZ2Vuc3RhZW5kZW4gd2lyZCB6LkIuIFBfTk9EUk9QLCBQX05PR0VULCBkYXMgR2V3aWNodCwgb2IgZGFzIFppZWwKKyAgICAgZGFzIE9iamVrdCBhdWZuZWhtZW4gd2lsbCAoTWF5QWRkV2VpZ2h0KCksIFByZXZlbnRJbnNlcnQpIG9kZXIgYXVjaAorICAgICBQcmV2ZW50TGVhdmUoKSBnZXBydWVmdC4KKyAgICAgQmVpIExlYmV3ZXNlbiB3aXJkIHouQi4gUF9OT19UUE9SVCBpbiAnZGVzdCcgdW5kICdvbGRlbnYnIHVuZAorICAgICBQcmV2ZW50TGVhdmVMaXZpbmcvUHJldmVudEluc2VydExpdmluZygpIGF1c2dld2VydGV0LgorICAgICBCZWkgU3BpZWxlcm4gd2lyZCBhdWNoIG5vY2ggZ2V0ZXN0ZXQsIG9iIG1ldGhvZCBNX0dPIG9kZXIgTV9UUE9SVAorICAgICBlbnRoYWVsdCB1bmQgb2IgZGFzIFppZWwgbnVyIHZvbiBUZXN0c3BpZWxlcm4gYmV0cmV0ZW4gd2VyZGVuIGthbm4uCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIDAsIHdlbm4gZGFzIE9iamVrdCBiZXdlZ3Qgd2VyZGVuIGRhcmYuCisgICAgIFdlbm4gZXMgbmljaHQgYmV3ZWd0IHdlcmRlbiBkYXJmLCBzaW5kIGFscyBSdWVja2dhYmV3ZXJ0ZSBkaWUgaW4KKyAgICAgL3N5cy9tb3ZpbmcuaCBkZWZpbmllcnRlbiBNb3ZlLUZlaGxlcndlcnRlIHp1bGFlc3NpZyAocy4gbW92ZSgpKS4gU29sbHRlCisgICAgIGhpZXIgZWluIHVuZ3VlbHRpZ2VyIEZlaGxlcndlcnQgenVydWVja2dlZ2ViZW4gd2VyZGVuLCB3aXJkIGRhcyBtb3ZlKCkKKyAgICAgZWJlbmZhbGxzIGFiZ2Vicm9jaGVuIHVuZCBNRV9ET05UX1dBTlRfVE9fQkVfTU9WRUQgenVydWVja2dlYmVuLgorCitCRU1FUktVTkdFTjoKKyAgICAgRGllc2UgRnVua3Rpb24ga2FubiB1ZWJlcnNjaHJpZWJlbiwgdW0gZmVpbmVyZSBLb250cm9sbGUgdWViZXIgZGllCisgICAgIEJld2VndW5nZW4gZGVzIE9iamVrdCB6dSBoYWJlbi4gRGFiZWkgYWJlciBiaXR0ZSBlaW5pZ2UgRGluZ2UgYmVhY2h0ZW46CisgICAgIDEuIERlbmt0IGRhcmFuLCBnZ2YuIE1fTk9DSEVDSyB6dSBiZXJ1ZWNrc2ljaHRpZ2VuIHVuZCB1bmQgZXVyZQorICAgICBQcnVlZnVuZ2VuIG51ciB6dSBtYWNoZW4sIHdlbm4gZXMgbmljaHQgaW4gbWV0aG9kIHZvcmtvbW10LgorICAgICAyLiBHQU5aIFdJQ0hUSUc6IFdlbm4gaWhyIG1pdCBldXJlbiBQcnVlZnVuZ2VuIGZlcnRpZyBzZWluIHVuZCBkYXMgT2JqZWt0CisgICAgIGJld2VndCB3ZXJkZW4gZHVlcmZ0ZSwgZGllIGdlZXJidGVuIFBydWVmdW5nZW4gbm9jaCB0ZXN0ZW4sIGFsc28gX0lNTUVSXworICAgICBkYXMgZ2VlcmJ0ZSBQcmV2ZW50TW92ZSgpIG5vY2ggYXVmcnVmZW4gdW5kIGRlc3NlbiBXZXJ0CisgICAgIHp1cnVlY2tnZWJlbi9iZXJ1ZWNrc2ljaHRpZ2VuLCBkYSBzb25zdCBQcnVlZnVuZ2VuIGRlcyBHZXdpY2h0cyBldGMuIAorICAgICBuaWNodCBmdW5rdGlvbmllcmVuIG9kZXIgYmVpIExlYmV3ZXNlbiBkaWUgUHJldmVudCooKSBpbSBFbnZpcm9ubWVudCAKKyAgICAgbmljaHQgZ2VydWZlbiB3ZXJkZW4hCisgICAgIDMuIERpZSBGdW5rdGlvbiBpc3QgbnVyIG9iamVrdGludGVybiB6dSB2ZXJ3ZW5kZW4sIENhbGwtT3RoZXIgdm9uIGF1c3NlbgorICAgICBzaW5kIG5pY2h0IG1vZWdsaWNoLCBiZWltIFVlYmVyc2NocmVpYmVuICdwcm90ZWN0ZWQnIG5pY2h0IHZlcmdlc3Nlbi4KKyAgICAgNC4gTm9jaG1hbDogR2VlcmJ0ZXMgUHJldmVudE1vdmUoKSBfTklDSFQgVkVSR0VTU0VOXyEKKworQkVJU1BJRUxFOgorICAgICBFaW4gT2JqZWt0LCB3YXMgbnVyIGltIFN0ZXJuZW5saWNodCBhdWZnZW5vbW1lbiB3ZXJkZW4ga2FubiAod2FydW0KKyAgICAgYXVjaCBpbW1lcik6CisKKyAgICAgcHJvdGVjdGVkIGludCBQcmV2ZW50TW92ZShvYmplY3QgZGVzdCwgb2JqZWN0IG9sZGVudiwgaW50IG1ldGhvZCkgeworICAgICAgIGlmICggKG1ldGhvZCAmIE1fTk9DSEVDSykgKSB7CisgICAgICAgICAgIC8vIHdlbm4gbWl0IE1fTk9DSEVDSyBiZXdlZ3QsIGlzdCBkYXMgU3Rlcm5lbmxpY2h0IGVnYWwsIG51cgorICAgICAgICAgICAvLyBnZWVyYnRlcyBQcmV2ZW50TW92ZSgpIGJlcnVlY2tzaWNodGVuOgorICAgICAgICAgICByZXR1cm4gOjpQcmV2ZW50TW92ZShkZXN0LCBvbGRlbnYsIG1ldGhvZCk7CisgICAgICAgfQorICAgICAgIGVsc2UgaWYgKCBtZXRob2QgJiBNX0dFVCkgeworICAgICAgICAgICAvLyB3ZW5uIGVzIGF1Zmdlbm9tbWVuIHdlcmRlbiBzb2xsOiBuYWNoIFN0ZXJuZW5saWNodCBpbSBSYXVtCisgICAgICAgICAgIC8vIGd1Y2tlbjoKKyAgICAgICAgICAgaWYgKG9iamVjdHAoZGVzdCkgJiYgCisgICAgICAgICAgICAgICAoZGVzdC0+UXVlcnlQcm9wKFBfTElHSFRfVFlQRSkgIT0gTFRfU1RBUlMpKQorICAgICAgICAgICAgICAgcmV0dXJuIE1FX0NBTlRfQkVfVEFLRU47CisgICAgICAgfQorICAgICAgIC8vIEZhbGwtdGhyb3VnaDoKKyAgICAgICByZXR1cm4gOjpQcmV2ZW50TW92ZShkZXN0LCBvbGRlbnYsIG1ldGhvZCk7CisgICAgIH0KKworCitTSUVIRSBBVUNIOgorICAgICBQcmV2ZW50TGVhdmUoKSwgTm90aWZ5SW5zZXJ0KCksIE5vdGlmeUxlYXZlKCksIE1heUFkZE9iamVjdCgpLAorICAgICBQcmV2ZW50SW5zZXJ0TGl2aW5nKCksIFByZXZlbnRMZWF2ZUxpdmluZygpLCBOb3RpZnlNb3ZlKCksCisgICAgIFByZXZlbnRNb3ZlKCksIE1heUFkZFdlaWdodCgpLCBtb3ZlKCksIC9zdGQvY29udGFpbmVyL3Jlc3RyaWN0aW9ucy5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IDA0LjA4LjIwMDcsIFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1F1ZXJ5IGIvZG9jL2xmdW4vUXVlcnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIzOTk5OAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL1F1ZXJ5CkBAIC0wLDAgKzEsODEgQEAKK1F1ZXJ5KCkKK0ZVTktUSU9OOgorICAgICBwdWJsaWMgdmFyYXJncyBtaXhlZCBRdWVyeShzdHJpbmcgbmFtZSwgaW50IFR5cGUpOworCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvdGhpbmcvcHJvcGVydGllcy5jCisKK0FSR1VNRU5URToKKyAgICAgc3RyaW5nIG5hbWUgLSBQcm9wZXJ0eSwgZGVyZW4gV2VydChlKSBhdXNnZWxlc2VuIHdlcmRlbgorICAgICBpbnQgdHlwZSAgLSBBcnQgZGVyIGdld3VlbnNjaHRlbiBJbmZvcm1hdGlvbi4KKworQkVTQ0hSRUlCVU5HOgorICAgICBEZXIgV2VydCBlaW5lciBkZXIgaW5uZXJlbiBFaWdlbnNjaGFmdGVuIGRlciBQcm9wZXJ0eSAnbmFtZScgd2lyZAorICAgICB6dXJ1ZWNrZ2VnZWJlbi4gICdUeXBlJyBpc3QgZGFiZWkgZWluZXIgZGVyIGluIC9zeXMvdGhpbmcvcHJvcGVydGllcy5oCisgICAgIHVuZCBmb2xnZW5kIGF1ZmdlbGlzdGV0ZW4gRl9YWFgtV2VydGU6CisKKyAgICAgRl9WQUxVRSAoPT0wLCBEZWZhdWx0KQorICAgICAgICAgVW50ZXIgVW1nZWh1bmcgZWluZXIgZXZlbnR1ZWxsIHZvcmhhbmRlbmVuIEFiZnJhZ2VtZXRob2RlIG9kZXIKKyAgICAgICAgIF9xdWVyeV8nbmFtZScoKSB3aXJkIGRlciBEYXRlbndlcnQgZGVyIFByb3BlcnR5ICduYW1lJworICAgICAgICAgenVydWVja2dlZ2ViZW4uCisgICAgIEZfTU9ERQorICAgICAgICAgIERpZSBpbnRlcm5lbiBGbGFncyBkZXIgUHJvcGVydHkgd2VyZGVuIHp1cnVlY2tnZWdlYmVuLkRpZXMga29lbm5lbgorICAgICAgICAgIChsb2dpc2NoIG1pdCAmIHZlcmtudWVwZnQpIHNlaW46CisgICAgICAgICAgU0FWRSAgLSBQcm9wZXJ0eSBzb2xsIGJlaSBzYXZlX29iamVjdCgpIGdlc3BlaWNoZXJ0IHdlcmRlbgorICAgICAgICAgIFBST1RFQ1RFRCAtIE9iamVrdCBzZWxic3QvRU0vUm9vdCBrYW5uIFByb3BlcnR5IG1hbmlwdWxpZXJlbgorICAgICAgICAgIFNFQ1VSRUQgIC0gd2llIFBST1RFQ1RFRCwgZGFzIEZsYWcga2FubiBhYmVyIG5pY2h0CisgICAgICAgICAgICAgICAgICAgICB6dXJ1ZWNrZ2VzZXR6dCB3ZXJkZW4gKGltbWVyIFNFQ1VSRUQpCisgICAgICAgICAgTk9TRVRNRVRIT0QgLSBuaWVtYW5kIGthbm4gUHJvcGVydHkgbWFuaXB1bGllcmVuCisgICAgICAgICAgICAgICAgICAgICAgICAoYXVjaCBrZWluIEZfU0VUX01FVEhPRCBvZGVyIF9zZXRfJ25hbWUnKCkpCisgICAgIEZfU0VUX01FVEhPRAorICAgICAgICAgIEVpbiBldmVudHVlbGwgZnVlciBkaWUgUHJvcGVydHkgZWluZ2V0cmFnZW5lIEZfU0VUX01FVEhPRCB3aXJkCisgICAgICAgICAgenVydWVja2dlZ2ViZW4uCisgICAgICAgICAgKF9zZXRfJ25hbWUnKCktTWV0aG9kZW4gd2VyZGVuIHNvIG5pY2h0IGF1ZmdlZnVlaHJ0ISkKKyAgICAgRl9RVUVSWV9NRVRIT0QKKyAgICAgICAgICBFaW4gZXZlbnR1ZWxsIGZ1ZXIgZGllIFByb3BlcnR5IGVpbmdldHJhZ2VuZSBGX1FVRVJZX01FVEhPRCB3aXJkCisgICAgICAgICAgenVydWVja2dlZ2ViZW4uCisgICAgICAgICAgKF9xdWVyeV8nbmFtZScoKS1NZXRob2RlbiB3ZXJkZW4gc28gbmljaHQgYXVmZ2VmdWVocnQhKQorCitSVWVDS0dBQkVXRVJUOgorICAgICBEaWUgZ2V3dWVuc2NodGUgRWlnZW5zY2hhZnQsIGFiaGFlbmdpZyB2b24gJ1R5cGUnLgorCitCRU1FUktVTkdFTjoKKyAgICAgLSBRdWVyeSgpIHNvbGx0ZSBuaWNodCB6dW0gcmVndWxhZXJlbiBBdXNsZXNlbiBkZXMgSW5oYWx0IGVpbmVyCisgICAgICAgUHJvcGVydHkgdmVyd2VuZGV0IHdlcmRlbiwgZGEgc293b2hsIEZfUVVFUllfTUVUSE9EIGFscyBhdWNoCisgICAgICAgbGliaW50ZXJuZSBfcXVlcnlfJ25hbWUnKCktTWV0aG9kZW4gdW1nYW5nZW4gd2VyZGVuIHVuZCBkYXMgRXJnZWJuaXMKKyAgICAgICBmdWVyIHNvIHZlcmFlbmRlcnRlIFByb3BlcnR5cyB1bmRlZmluaWVydCBpc3QKKyAgICAgLSBfc2V0XyduYW1lJygpIHVuZCBfcXVlcnlfJ25hbWUnKCkgc2luZCBhbHRlIFByb3BlcnR5bWV0aG9kZW4gdW5kCisgICAgICAgc29sbHRlbiBuaWNodCBpbiBub3JtYWxlbiBPYmpla3RlbiBiZW51dHp0IHdlcmRlbiAtPgorICAgICAgIEZfU0VUX01FVEhPRC9GX1FVRVJZX01FVEhPRCAoZ2dmLiBtaXQgUFJPVEVDVEVEKSBudXR6ZW4KKyAgICAgLSBGX1NFVC9GX1FVRVJZX01FVEhPRHMga29lbm5lbiAncHJvdGVjdGVkJyAoZW1wZm9obGVuKSBvZGVyICdzdGF0aWMnCisgICAgICAgc2Vpbi4gX3NldF8vX3F1ZXJ5XyBkdWVyZmVuIG1vbWVudGFuIF9uaWNodF8gJ3Byb3RlY3RlZCcgc2VpbiwgZnVlcgorICAgICAgIGRpZXNlIGdlaHQgbnVyICdzdGF0aWMnIChpbiBkaWVzZW0gRmFsbCBlbXBmb2hsZW4pLgorCitCRUlTUElFTEU6CisgICAgIC8vIEF1c2xlc2VuIGRlcyBXZXJ0ZXMgdW50ZXIgVW1nZWh1bmcgZWluZXIgQWJmcmFnZW1ldGhvZGUKKyAgICAgUXVlcnkoUF9YWVosIEZfVkFMVUUpOworCisgICAgIC8vIEF1c2xlc2VuIGRlciBGbGFncyBlcmZhZWhydCBtYW4gbWl0OgorICAgICBRdWVyeShQX1hZWiwgRl9NT0RFKTsKKworICAgICAvLyBzYXViZXJlcyBQcm9ncmFtbWllcmVuLCB3aXIgd29sbGVuIGVpbmUgRl9RVUVSWV9NRVRIT0Qgc2V0emVuLAorICAgICAvLyBwcnVlZmVuIHZvcmhlciBhdWYgRXhpc3Rlbno6CisgICAgIGlmKHRoaXNfcGxheWVyKCktPlF1ZXJ5KFBfRlJPRywgRl9RVUVSWV9NRVRIT0QpIHsKKyAgICAgIHdyaXRlKGJyZWFrX3N0cmluZygKKyAgICAgICAiSWNoIGthbm4gZGljaCBuaWNodCB3ZWl0ZXIgdm9yIEZyb3NjaHNlaW4gc2NodWV0emVuISIsCisgICAgICAgIkRlciBNYWdpZXIgd2lua3QgYWI6ICIsIDc4KSk7CisgICAgICBzYXkoYnJlYWtfc3RyaW5nKAorICAgICAgICJJY2gga2FubiBkaWNoIG5pY2h0IHdlaXRlciB2b3IgRnJvc2Noc2VpbiBzY2h1ZXR6ZW4hIiwKKyAgICAgICAiRGVyIE1hZ2llciBzYWd0IHp1ICIrdGhpc19wbGF5ZXIoKS0+bmFtZShXRU0pKyI6ICIsIDc4KSk7CisgICAgIH0gZWxzZSB7CisgICAgICB0aGlzX3BsYXllcigpLT5TZXQoUF9GUk9HLCAjJ3F1ZXJ5X3Byb3RlY3RfZnJvZywgRl9RVUVSWV9NRVRIT0QpOworICAgICAgLi4uCisgICAgIH0KKworU0lFSEUgQVVDSDoKKyAgICAgQWVobmxpY2hlczogU2V0UHJvcChMKSwgUXVlcnlQcm9wKEwpLCBTZXQoTCkKKyAgICAgR2VuZXJlbGw6ICBTZXRQcm9wZXJ0aWVzKEwpLCBRdWVyeVByb3BlcnRpZXMoTCkKKyAgICAgS29uemVwdDogIHByb3BlcnRpZXMsIC9zdGQvdGhpbmcvcHJvcGVydGllcy5jCisgICAgIFNvbnN0aWdlczogIFBfQVVUT0xPQURPQkoKKworMjguMDMuMjAwOCwgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vUXVlcnlBbGxEb29ycyBiL2RvYy9sZnVuL1F1ZXJ5QWxsRG9vcnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JiYmZiYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL1F1ZXJ5QWxsRG9vcnMKQEAgLTAsMCArMSwzMiBAQAorRlVOS1RJT046CisgICAgIG1hcHBpbmcgUXVlcnlBbGxEb29ycygpOworCitERUZJTklFUlQgSU46CisgICAgIC9vYmovZG9vcm1hc3Rlci5jCisKK0FSR1VNRU5URToKKyAgICAga2VpbmUKKworQkVTQ0hSRUlCVU5HOgorICAgICBFcyB3ZXJkZW4gZGllIFp1c3RhZW5kZSBBTExFUiBUdWVyZW4gaW0gTW9yZ2VuR3JhdWVuIGVybWl0dGVsdC4KKworUlVFQ0tHQUJFV0VSVDoKKyAgICAgRWluIE1hcHBpbmcgbWl0IGRlbiBadXN0YWVuZGVuIGFsbGVyIFR1ZXJlbiBpbSBNb3JnZW5HcmF1ZW4uIEFscworICAgICBTY2hsdWVzc2VsIGRpZW5lbiBkaWUgRGF0ZWluYW1lbiBkZXIgU3RhcnQtIHVuZCBaaWVscmFldW1lIGluCisgICAgIGxleGlrb2dyYXBoaXNjaGVyIChhbHBoYWJldGlzY2hlcikgUmVpaGVuZm9sZ2UsIGdldHJlbm50IGR1cmNoICI6IiwKKyAgICAgZGVyIFdlcnQgZGVzIEtleXMgaXN0IGRlciBha3R1ZWxsZSBadXN0YW5kIGRpZXNlciBUdWVyLCB6LkIuOgorCisgICAgKFsgIi9kL2luc2Vsbi9zY2hpZmZlL2pvbGxlOi9kL2luc2Vsbi9zY2hpZmZlL2pvbGxlL21hc2NoIiA6IC0xLAorICAgICAgIC4uLgorICAgICBdKTsKKworICAgICBFcyBnaWJ0IGFsc28gZWluZSBUdWVyIHp3aXNjaGVuIEpvbGxlIHVuZCBNYXNjaGluZW5yYXVtLCBkaWUKKyAgICAgbW9tZW50ZW4gZ2VzY2hsb3NzZW4gaXN0ICgtMSA9IERfU1RBVFVTX0NMT1NFRCkuCisKKworU0lFSEUgQVVDSDoKKyAgICBOZXdEb29yKCksIFF1ZXJ5RG9vcktleSgpLCBRdWVyeURvb3JTdGF0dXMoKSwgU2V0RG9vclN0YXR1cygpLAorICAgIC9zdGQvcm9vbS9kb29ycy5jLCAvb2JqL2Rvb3JtYXN0ZXIuYywgR2V0UGhpb2xlbkluZm9zKCksIFBfRE9PUl9JTkZPUworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGV0enRlIEFlbmRlcnVuZzogRG9uLCAwOC4wNS4yMDE0LCBHYWJ5bG9uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9RdWVyeUFybW91ckJ5VHlwZSBiL2RvYy9sZnVuL1F1ZXJ5QXJtb3VyQnlUeXBlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZDQzZTkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9RdWVyeUFybW91ckJ5VHlwZQpAQCAtMCwwICsxLDY0IEBACitReWVyeUFybW91ckJ5VHlwZSgpCisKK0ZVTktUSU9OOgorICAgICBtaXhlZCBRdWVyeUFybW91ckJ5VHlwZShzdHJpbmcgdHlwZSkKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL2xpdmluZy9jb21iYXQuYworCitBUkdVTUVOVEU6CisgICAgIHN0cmluZyB0eXBlCisgICAgICAgIFR5cCBkZXIgUnVlc3R1bmcgYXVzIC9zeXMvY29tYmF0LmgsIGF1ZiBkaWUgZ2V0ZXN0ZXQgd2VyZGVuIHNvbGwuCisKK0JFU0NIUkVJQlVORzoKKyAgICAgQWJmcmFnZSwgb2IgZGFzIExlYmV3ZXNlbiBlaW5lIFJ1ZXN0dW5nIGRlcyBhbmdlZ2ViZW5lbiBUeXBzIHRyYWVndC4KKworICAgICBadXJ1ZWNrZ2VnZWJlbiB3aXJkIGplIG5hY2ggVHJhZ2VzdGF0dXMgdW5kIDx0eXBlPjoKKyAgICAgKiAwLCBmYWxscyBkYXMgTGViZXdlc2VuIGRpZSBnZXN1Y2h0ZSBSdWVzdHVuZ3NhcnQgbmljaHQgdHJhZWd0CisgICAgICogaW0gRXJmb2xnc2ZhbGwgZGFzIFJ1ZXN0dW5nc29iamVrdAorICAgICAqIGZhbGxzIDx0eXBlPiBBVF9NSVNDIGlzdDoKKyAgICAgICAqICh7fSksIHdlbm4gZXMga2VpbmUgQVRfTUlTQy1SdWVzdHVuZyB0cmFlZ3QKKyAgICAgICAqIGVpbiBBcnJheSB2b24gQVRfTUlTQy1SdWVzdHVuZ2VuCisgICAgICogZmFsbHMgPHR5cGU+IDAgaXN0OiBlaW4gTWFwcGluZywgZGFzIGRpZXNlIEluZm9ybWF0aW9uZW4gbWl0IGRlbQorICAgICAgIFJ1ZXN0dW5nc3R5cGVuIGFscyBTY2hsdWVzc2VsIGVudGhhZWx0OgorICAgICAgIChbQVRfTUlTQzogKHtbb2JqZWN0XSwgLi4ufSksCisgICAgICAgICBBVF8uLi46IDxvYmplY3Q+LAorICAgICAgICAgLi4uIF0pCisKK0JFTUVSS1VORzoKKyAgICAgSXN0IDx0eXBlPiBBVF9NSVNDLCBzbyB3aXJkIGF1ZiBqZWRlbiBGYWxsIGVpbiBBcnJheSB6dXJ1ZWNrZ2VnZWJlbiEKKworQkVJU1BJRUxFOgorICAgICBXaXIgd29sbGVuIHdpc3Nlbiwgb2IgdGhpc19wbGF5ZXIoKSBIYW5kc2NodWhlIHRyYWVndDoKKworICAgICBpZiAob2JqZWN0cCh0aGlzX3BsYXllcigpLT5RdWVyeUFybW91ckJ5VHlwZShBVF9HTE9WRSkpKQorICAgICAgIC4uLgorCisKKyAgICAgV2lyIGJhdWVuIGVpbmVuIFR1ZXJzdGVoZXIsIGRlciBhdWYgQVRfTUlTQy1LbGVpZHVuZyBhY2h0ZXQ6CisKKyAgICAgaWYgKHNpemVvZih0aGlzX3BsYXllcigpLT5RdWVyeUFybW91ckJ5VHlwZShBVF9NSVNDKSkgPiAzKSB7CisgICAgICAgaWYodGhpc19wbGF5ZXIoKS0+UmVjZWl2ZU1zZygKKyAgICAgICAgICAgICJEdSBkYXJmc3QgbmljaHQgcGFzc2llcmVuLCBEdSBoYXN0IHp1dmllbGUgIgorICAgICAgICAgICAgInVucGFzc2VuZGUgRGluZ2UgYW4hIiwKKyAgICAgICAgICAgIE1UX0xJU1RFTnxNU0dfRE9OVF9TVE9SRSwgTUFfVEVMTCwKKyAgICAgICAgICAgICJEZXIgV2FlY2h0ZXIgdGVpbHQgRGlyIG1pdDogIik8TVNHX0RFTElWRVJFRCAmJiAvLyB0YXViPworICAgICAgICAgIHRoaXNfcGxheWVyKCktPlJlY2VpdmVNc2coCisgICAgICAgICAgICAiRGVyIFdhZWNodGVyIGhhZWx0IGRpY2ggYXVmLiIsIE1UX0xPT0spPE1TR19ERUxJVkVSRUQpIC8vIGJsaW5kPworICAgICAgICAgICAgdGhpc19wbGF5ZXIoKS0+UmVjZWl2ZU1zZygKKyAgICAgICAgICAgICAgIkplbWFuZCBoYWVsdCBkaWNoIGF1Zi4iLCBNVF9GRUVMKTsgLy8gbnUgYWJlciEKKyAgICAgICAvLyBBdWZoYWx0ZW4hCisgICAgIH0gZWxzZSB0aGlzX3BsYXllcigpLT5SZWNlaXZlTXNnKAorICAgICAgICAgICAgICAiRHUgZGFyZnN0IHBhc3NpZXJlbiwgdmllbCBTcGFzcyBpbSBDYXNpbm8hIiwKKyAgICAgICAgICAgICAgTVRfTElTVEVOfE1TR19ET05UX1NUT1JFLCBNQV9URUxMLAorICAgICAgICAgICAgICAiRGVyIFdhZWNodGVyIHRlaWx0IERpciBtaXQ6ICIpOworICAgICAgIC8vIGltIEVyZm9sZ3NmYWxsIGlzdCBlcyB1bnMgZWdhbCwgd2VubiBlcyBkZXIgU3BpZWxlciBuaWNodAorICAgICAgIC8vIGxpZXN0OiBlciB3aXJkIGRhbm4gZWJlbiAid29ydGxvcyIgZHVyY2hnZWxhc3NlbgorCitTSUVIRSBBVUNIOgorICAgICBXZWFyKCksIFdlYXJBcm1vdXIoKSwgV2VhckNsb3RoaW5nKCksIFVud2VhcigpLCBVbndlYXJBcm1vdXIoKSwKKyAgICAgVW53ZWFyQ2xvdGhpbmcoKSwgRmlsdGVyQ2xvdGhpbmcoKSwKKyAgICAgUF9BUk1PVVJfVFlQRSwgUF9DTE9USElORywgUF9BUk1PVVJTLAorICAgICAvc3RkL2xpdmluZy9jb21iYXQuYworCiswMi4wMi4yMDE2LCBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vUXVlcnlBcnJpdmVkIGIvZG9jL2xmdW4vUXVlcnlBcnJpdmVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzY2Y4ODcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9RdWVyeUFycml2ZWQKQEAgLTAsMCArMSwyNiBAQAorUXVlcnlBcnJpdmVkKCkKKworRlVOS1RJT046CisgICAgIG1peGVkIFF1ZXJ5QXJyaXZlZCgpOworCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvdHJhbnNwb3J0LmMKKworQVJHVU1FTlRFOgorICAgICBrZWluZQorCitCRVNDSFJFSUJVTkc6CisgICAgIERpZXNlIEZ1bmt0aW9uIGVybWl0dGVsdCwgb2Igc2ljaCBkZXIgVHJhbnNwb3J0ZXIgbW9tZW50YW4gYW4gZWluZXIKKyAgICAgSGFsdGVzdGVsbGUgYmVmaW5kZXQgKHVuZCBiZXN0aWVnZW4gb2RlciB2ZXJsYXNzZW4gd2VyZGVuIGthbm4pIG9kZXIgb2IKKyAgICAgZXIgdW50ZXJ3ZWdzIGlzdC4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgTnVsbCwgd2VubiBkZXIgVHJhbnNwb3J0ZXIgdW50ZXJ3ZWdzIGlzdC4gTGllZ3QgZGVyIFRyYW5zcG9ydGVyIGFuCisgICAgIGVpbmVyIEhhbHRlc3RlbGxlLCBzbyB3aXJkIGRlciBtaXQgQWRkUm91dGUgYWxzIG5hbWUgdWViZXJnZWJlbmUgU3RyaW5nCisgICAgIHp1cnVlY2tnZWdlYmVuLgorCitTSUVIRSBBVUNIOgorICAgICBBZGRSb3V0ZSgpLCAvc3RkL3RyYW5zcG9ydC5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFdlZCBNYXkgOCAxMDoyMTo0NyAxOTk2IGJ5IFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vUXVlcnlBcnRpY2xlIGIvZG9jL2xmdW4vUXVlcnlBcnRpY2xlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5OTNiM2UKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9RdWVyeUFydGljbGUKQEAgLTAsMCArMSw5MiBAQAorUXVlcnlBcnRpY2xlKCkKKworRlVOS1RJT046CisgICAgIHZhcmFyZ3Mgc3RyaW5nIFF1ZXJ5QXJ0aWNsZShpbnQgY2FzdXMsIGludCBkZW0sIGludCBmb3JjZSk7CisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC90aGluZy9sYW5ndWFnZS5jCisKK0FSR1VNRU5URToKKyAgICAgY2FzdXMKKyAgICAgICAgICBEZXIgRmFsbCwgaW4gZGVtIGRlciBBcnRpa2VsIGdld3VlbnNjaHQgd2lyZC4KKyAgICAgICAgICAoS29uc3RhbnRlbiBhdXMgL3N5cy90aGluZy9sYW5ndWFnZS5oOiBXRVIsIFdFTSwgV0VTU0VOLCBXRU4uKQorCisgICAgIGRlbQorICAgICAgICAgIFdpcmQgZWluIGJlc3RpbW10ZXIgb2RlciBlaW4gdW5iZXN0aW1tdGVyIEFydGlrZWwgdmVybGFuZ3Q/CisgICAgICAgICAgICAgKyBkZW0gPSAwOiBVbmJlc3RpbW10ZXIgQXJ0aWtlbCEKKyAgICAgICAgICAgICArIGRlbSA9IDE6IEJlc3RpbW10ZXIgQXJ0aWtlbCEKKyAgICAgICAgICAgICArIGRlbSA9IDI6IEZpbmRlIHNlbGJzdCBoZXJhdXMsIHdlbGNoZXIgQXJ0aWtlbCBwYXNzdCEKKworICAgICBmb3JjZQorICAgICAgICAgIEZhbGxzIHVuZ2xlaWNoIE51bGwsIHNvIHdpcmQgYXVmIGplZGVuIEZhbGwgZWluIEFydGlrZWwKKyAgICAgICAgICB6dXJ1ZWNrZ2VnZWJlbiwgdHJvdHogUF9BUlRJQ0xFID09IDAuCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGllc2UgRnVua3Rpb24gZ2lidCBlaW5lbiB6dW0gR2VzY2hsZWNodCBkZXMgT2JqZWt0ZXMgcGFzc2VuZGVuIEFydGlrZWwKKyAgICAgenVydWVjaywgZGVyIGluIGRlbiBwYXNzZW5kZW4gRmFsbCBkZWtsaW5pZXJ0IHdpcmQuCisKKyAgICAgRGFzIEhlcmF1c2ZpbmRlbiBkZXMgcGFzc2VuZGVuIEFydGlrZWxzIGJlaSAnZGVtJyA9IDIgYmV6aWVodCBzaWNoIGF1ZgorICAgICBTaXR1YXRpb25lbiwgaW4gZGVuZW4gbWVocmVyZSBnbGVpY2huYW1pZ2UgT2JqZWt0ZSBpbSBzZWxiZW4gRW52aXJvbm1lbnQKKyAgICAgc2luZC4gTWFuICduaW1tdCcgZGFubiB6QiBuaWNodCAiZGVuIFN0YW1tIiBzb25kZXJuICJlaW5lbiBTdGFtbSIuCisKKyAgICAgSXN0IFBfQVJUSUNMRSA9IDAsIHNvIHdpcmQgZWluIExlZXJzdHJpbmcgenVydWVja2dlZ2ViZW4sIGVzIHNlaSBkZW5uLAorICAgICBtYW4gdWViZXJnaWJ0IGluIGRlbSBBcmd1bWVudCAnZm9yY2UnIGVpbmVuIFdlcnQgdW5nbGVpY2ggTnVsbC4KKworQkVNRVJLVU5HRU46CisgICAgIEFjaHR1bmc6IGJlaSBndWVsdGlnZW0gQXJ0aWtlbCB3aXJkIGVpbiBMZWVyemVpY2hlbiBhbmdlaGFlbmd0IQorCisgICAgIE5hbWUoKS9uYW1lKCkgbnV0emVuIGJlcmVpdHMgUXVlcnlBcnRpY2xlKCksIHdlbm4gUF9BUlRJQ0xFIGdlc2V0enQKKyAgICAgaXN0LiBEZXNoYWxiIG11c3MgbWFuIHNpY2ggIkVpbmVzIE9ya3MiIG5pY2h0IHNlbGJzdCBhdXMgZGVtCisgICAgIFF1ZXJ5QXJ0aWNsZSgpIHVuZCBkZW0gTmFtZW4genVzYW1tZW5iYXN0ZWxuLCB3ZW5uIG1laHJlcmUgT3JrcworICAgICBpbSBSYXVtIGhlcnVtc3RlaGVuIHVuZCBtYW4gZWluZSBOYWNocmljaHQgd2llOgorICAgICAgICJEdSBoYXVzdCBkZW4gT3JrLiIgdW5kIGZvbGdlbmQKKyAgICAgICAiW0Rlc3xFaW5lc10gT3JrcyBOYXNlIHNjaHdpbGx0IGFuLiIKKyAgICAgaGFiZW4gbW9lY2h0ZToKKyAgICAgICAiRHUgaGF1c3QgIitvcmstPm5hbWUoV0VOLCAxKSsiLiAiCisgICAgICAgb3JrLT5OYW1lKFdFU1NFTiwgMikrIiBOYXNlIHNjaHdpbGx0IGFuLiIKKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgKiBnZXd1ZW5zY2h0ZXIgQXJ0aWtlbCBhbHMgU3RyaW5nIHBsdXMgTGVlcnplaWNoZW4gKCEpIE9ERVIKKyAgICAgKiBMZWVyc3RyaW5nCisKK0JFSVNQSUVMRToKKyAgICAgLy8gIlggaGF1dCBZIGF1ZiBkaWUgTmFzZS4gW0RlcnxEaWV8RGFzXSBpc3QgbmljaHQgYmVlaW5kcnVja3QuIgorICAgICAvLyBNYW4gd2lsbDoKKyAgICAgLy8gKiBhdWYgamVkZW4gRmFsbCBlaW5lbiBBcnRpa2VsLCBhdWNoIHdlbm4ga2VpbiBQX0FSVElDTEUgZ2VzZXR6dCBpc3QKKyAgICAgLy8gKiBudXIgZGVuIGJlc3RpbW10ZW4gQXJ0aWtlbAorICAgICBzZW5kX3Jvb20odGhpc19vYmplY3QoKSwKKyAgICAgICBwbDEtPk5hbWUoV0VSKSsiIGhhdXQgIitwbDItPm5hbWUoV0VNKSsiIGF1ZiBkaWUgTmFzZS4gIisKKyAgICAgICBjYXBpdGFsaXplKHBsMi0+UXVlcnlBcnRpY2xlKFdFUiwgMSwgMSkpKyJpc3QgbmljaHQgYmVlaW5kcnVja3QuIiwKKyAgICAgICBNVF9MT09LfE1UX0xJU1RFTiwgMCwgMCwgKHtwbDEsIHBsMn0pKTsKKworICAgICAvLyAiWCBnaWJ0IGRpciBZLiBbRXJ8U2llfEVzXSBwcnVlZnQgW2RlbnxkaWV8ZGFzXSAuLi4iCisgICAgIC8vIE1hbiB3aWxsOgorICAgICAvLyAqIGF1ZiBqZWRlbiBGYWxsIGVpbmVuIEFydGlrZWwsIGF1Y2ggd2VubiBrZWluIFBfQVJUSUNMRSBnZXNldHp0IGlzdAorICAgICAvLyAqIG51ciBkZW4gYmVzdGltbXRlbiBBcnRpa2VsCisgICAgIHNlbmRfcm9vbSh0aGlzX29iamVjdCgpLAorICAgICAgIHBsMS0+TmFtZShXRVIpKyIgZ2lidCAiK3BsMi0+bmFtZShXRU0pKyIgIitvYmotPm5hbWUoV0VSKSsiLiAiKworICAgICAgIGNhcGl0YWxpemUocGwyLT5RdWVyeVByb25vdW4oV0VSKSkrIiBwcnVlZnQgIisKKyAgICAgICBvYi0+UXVlcnlBcnRpY2xlKFdFTiwgMSwgMSkrIi4uLiIsCisgICAgICAgTVRfTE9PS3xNVF9MSVNURU4sIDAsIDAsICh7cGwxLCBwbDJ9KSk7CisKKyAgICAgLy8gIkRpciBmYWVsbHQgWCBhdWYgZGVuIEtvcGYuIER1IHNpZWhzdCBbZGllfGRlbnxkYXN8ZWluZXxlaW5lbnxlaW5lcyAiCisgICAgIC8vICJhdWYgZGVtIEJvZGVuIGxpZWdlbi4gW1NpZXxFcnxFc10gc2llaHQgYmx1dGlnIGF1cy4gQXVhLiBJc3QgZGFzICIKKyAgICAgLy8gInZvbiBkaXI/IgorICAgICAvLyBNYW4gd2lsbDoKKyAgICAgLy8gKiBhdWYgamVkZW4gRmFsbCBlaW5lbiBBcnRpa2VsLCBhdWNoIHdlbm4ga2VpbiBQX0FSVElDTEUgZ2VzZXR6dCBpc3QKKyAgICAgLy8gKiBiZXN0aW1tdGUvdW5iZXN0aW1tdGUgQXJ0aWtlbCwgd2VubiBiZXJlaXRzIGdsZWljaGUgR2VnZW5zdGFlbmRlCisgICAgIC8vICAgKHpCIEtva29zbnVlc3NlKSBhdWYgZGVtIEJvZGVuIGxpZWdlbiAuLi4KKyAgICAgb2ItPm1vdmUoZW52aXJvbm1lbnQoKSwgTV9OT0NIRUNLKTsgLy8gdm9yaGVyIG1hY2hlbiEKKyAgICAgcGwtPlJlY2VpdmVNc2coCisgICAgICAgIkRpciBmYWVsbHQgIitvYi0+bmFtZShXRVIsIDApKyIgYXVmIGRlbiBLb3BmLiBEdSBzaWVoc3QgIisKKyAgICAgICBvYi0+UXVlcnlBcnRpY2xlKFdFTiwgMiwgMSkrIiBhdWYgZGVtIEJvZGVuIGxpZWdlbi4gIisKKyAgICAgICBjYXBpdGFsaXplKG9iLT5RdWVyeVByb25vdW4oV0VSKSkrIiBzaWVodCBibHV0aWcgLi4uCisKK1NJRUhFIEFVQ0g6CisgICAgIEFlaG5saWNoOiAgU3VnZ2VzdEFydGljbGUoKSwgcXVlcnlfY19hcnRpY2xlKCksIHF1ZXJ5X2dfc3VmZml4KCkKKyAgICAgU29uc3RpZ2VzOiBRdWVyeU93bigpLCBRdWVyeUR1KCksCisgICAgICAgICAgICAgICAgUXVlcnlQcm9ub3VuKCksIFF1ZXJ5UG9zc1Byb25vdW4oKQorICAgICAgICAgICAgICAgIERlY2xBZGooKQorICAgICAgICAgICAgICAgIG5hbWUoKQorCis5LiBKdW4gMjAxNiwgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1F1ZXJ5QXR0cmlidXRlIGIvZG9jL2xmdW4vUXVlcnlBdHRyaWJ1dGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBhNjhjOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL1F1ZXJ5QXR0cmlidXRlCkBAIC0wLDAgKzEsMzIgQEAKK1F1ZXJ5QXR0cmlidXRlKCkKK0ZVTktUSU9OOgorICAgICBpbnQgUXVlcnlBdHRyaWJ1dGUoc3RyaW5nIGF0dHIpCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC9saXZpbmcvYXR0cmlidXRlcy5jCisKK0FSR1VNRU5URToKKyAgICAgYXR0ciAgICAgICAtIGludGVyZXNzaWVyZW5kZXMgR2VzYW10YXR0cmlidXQKKworQkVTQ0hSRUlCVU5HOgorICAgICBEYXMgQXR0cmlidXQgc2FtdCBzZWluZXIgT2Zmc2V0cyAoTW9kaWZpZXIpIHdpcmQgenVydWVja2dlZ2ViZW4uCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIFdlcnQgZGVzIEF0dHJpYnV0ZXMsIGJlaSBTcGllbGVybiBuaWNodCBncm9lc3NlciBhbHMgMzAuCisKK0JFSVNQSUVMRToKKyAgICAgaWYgKHRoaXNfcGxheWVyKCktPlF1ZXJ5QXR0cmlidXRlKEFfQ09OKSA+IDIwKQorICAgICAgIHdyaXRlKCJEdSBzY2hhZmZzdCBlcyBkZW4gQmVyZyBob2NoLiBBYmVyIG51ciBtdWVoc2FtLlxuIik7CisKK0JFTkVSS1VOR0VOOgorICAgICBXZW5uIGVzIHVtIEF0dHJpYnV0YWJmcmFnZW4gZ2VodCwgYml0dGUgZGllc2UgTWV0aG9kZSB2ZXJ3ZW5kZW4hCisKK1NJRUhFIEFVQ0g6DQorCVF1ZXJ5QXR0cmlidXRlKCksIFF1ZXJ5UmVhbEF0dHJpYnV0ZSgpLCBRdWVyeUF0dHJpYnV0ZU9mZnNldCgpLA0KKwlTZXRBdHRyaWJ1dGUoKSwgU2V0UmVhbEF0dHJpYnV0ZSgpLCBVcGRhdGVBdHRyaWJ1dGVzKCksDQorCVNldFRpbWVkQXR0ck1vZGlmaWVyKCksIFF1ZXJ5VGltZWRBdHRyTW9kaWZpZXIoKSwgDQorCURlbGV0ZVRpbWVkQXR0ck1vZGlmaWVyKCksDQorCVBfQVRUUklCVVRFUywgUF9BVFRSSUJVVEVTX09GRlNFVFMsIFBfVElNRURfQVRUUl9NT0QsDQorCVBfWF9BVFRSX01PRCwgUF9NX0FUVFJfTU9ELCAvc3RkL2xpdmluZy9hdHRyaWJ1dGVzLmMNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorTGFzdCBtb2RpZmllZDogVHVlIEp1bCAyNyAyMDowMDoyMCAyMDA0IGJ5IE11YWRpYg0KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1F1ZXJ5QXR0cmlidXRlT2Zmc2V0IGIvZG9jL2xmdW4vUXVlcnlBdHRyaWJ1dGVPZmZzZXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkzOGFiOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL1F1ZXJ5QXR0cmlidXRlT2Zmc2V0CkBAIC0wLDAgKzEsMjYgQEAKK1F1ZXJ5QXR0cmlidXRlT2Zmc2V0KCkKK0ZVTktUSU9OOgorICAgICBpbnQgUXVlcnlBdHRyaWJ1dGVPZmZzZXQoc3RyaW5nIGF0dHIpCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC9saXZpbmcvYXR0cmlidXRlcy5jCisKK0FSR1VNRU5URToKKyAgICAgYXR0cgktCWdlc3VjaHRlciBBdHRyaWJ1dE9mZnNldAorCitCRVNDSFJFSUJVTkc6CisgICAgIERpZSBPZmZzZXRzIGRlcyBBdHRyaWJ1dHMgKGlua2x1c2l2ZSBNb2RpZmllcikgd2VyZGVuIHp1cnVlY2tnZWdlYmVuLgorCitCRUlTUElFTEU6CisgICAgIGlmKHRoaXNfcGxheWVyKCktPlF1ZXJ5QXR0cmlidXRlT2Zmc2V0KEFfU1RSKTwwKQorICAgICAgd3JpdGUoIkR1IGJpc3QgZ2VzY2h3YWVjaHQuXG4iKTsKKworU0lFSEUgQVVDSDoNCisJUXVlcnlBdHRyaWJ1dGUoKSwgUXVlcnlSZWFsQXR0cmlidXRlKCksIFF1ZXJ5QXR0cmlidXRlT2Zmc2V0KCksDQorCVNldEF0dHJpYnV0ZSgpLCBTZXRSZWFsQXR0cmlidXRlKCksIFVwZGF0ZUF0dHJpYnV0ZXMoKSwNCisJU2V0VGltZWRBdHRyTW9kaWZpZXIoKSwgUXVlcnlUaW1lZEF0dHJNb2RpZmllcigpLCANCisJRGVsZXRlVGltZWRBdHRyTW9kaWZpZXIoKSwNCisJUF9BVFRSSUJVVEVTLCBQX0FUVFJJQlVURVNfT0ZGU0VUUywgUF9USU1FRF9BVFRSX01PRCwNCisJUF9YX0FUVFJfTU9ELCBQX01fQVRUUl9NT0QsIC9zdGQvbGl2aW5nL2F0dHJpYnV0ZXMuYw0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitMYXN0IG1vZGlmaWVkOiBUdWUgSnVsIDI3IDIwOjAwOjIwIDIwMDQgYnkgTXVhZGliDQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vUXVlcnlCdXlGYWN0IGIvZG9jL2xmdW4vUXVlcnlCdXlGYWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNWU4YmUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9RdWVyeUJ1eUZhY3QKQEAgLTAsMCArMSwyMiBAQAorUXVlcnlCdXlGYWN0KCkKKworRlVOS1RJT046CisgICAgIGludCBRdWVyeUJ1eUZhY3QoKTsKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL2xhZGVuLmMKKworQVJHVU1FTlRFOgorICAgICBrZWluZQorCitCRVNDSFJFSUJVTkc6CisgICAgIEdpYnQgZGVuIG1pdCBTZXRCdXlGYWN0KCkgZ2VzZXR6dGVuIEZha3RvciB6dXJ1ZWNrLgorCitSVWVDS0dBQkVXRVJUOgorICAgICBEZXIgRWlua2F1ZnNwcmVpc211bHRpcGxpa2F0b3IuCisKK1NJRUhFIEFVQ0g6CisgICAgIFNldEJ1eUZhY3QoKSwgL3N0ZC9sYWRlbi5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFdlZCBNYXkgOCAxMDoyMTo1NyAxOTk2IGJ5IFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vUXVlcnlCdXlWYWx1ZSBiL2RvYy9sZnVuL1F1ZXJ5QnV5VmFsdWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYxYTQzNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL1F1ZXJ5QnV5VmFsdWUKQEAgLTAsMCArMSw1MiBAQAorUXVlcnlCdXlWYWx1ZSgpDQorDQorRnVua3Rpb246DQorICAgIHN0YXRpYyB2YXJhcmdzIGludCBRdWVyeUJ1eVZhbHVlKG1peGVkIG9iLCBvYmplY3QgY2xpZW50KQ0KKw0KK0RlZmluaWVydCBpbjoNCisgICAgL3N0ZC9yb29tL3Nob3ANCisNCitBcmd1bWVudGU6DQorICAgIG9iOiANCisgICAgICBEYXMgenUga2F1ZmVuZGUgT2JqZWt0IChTdHJpbmcgb2RlciBvYmplY3QpLg0KKyAgICAgIEltIE5vcm1hbGZhbGwgaGFuZGVsdCBlcyBzaWNoIHVtIGVpbiBPYmpla3QuIEF1c25haG1lIHNpbmQgDQorICAgICAgR2VnZW5zdGFlbmRlLCBkaWUgbWl0IEFkZEZpeGVkT2JqZWN0KCkgaGluenVnZWZ1ZWd0IHd1cmRlbi4NCisgICAgY2xpZW50OiANCisgICAgICBEZXIgS2FldWZlci4NCisNCitCZXNjaHJlaWJ1bmc6DQorICAgIEVybWl0dGVsdCBkZW4gUHJlaXMsIGRlbiA8Y2xpZW50PiBmdWVyIDxvYj4genUgYmV6YWhsZW4gaGF0Lg0KKw0KK1J1ZWNrZ2FiZXdlcnQ6DQorICAgIERlciBQcmVpcyBhbHMgSW50ZWdlci4NCisNCitCZWlzcGllbDoNCisgICAgRWluIEhhZW5kbGVyLCBkZXIgU3BpZWxlcm4gZGllIGlobSBnZWhvbGZlbiBoYWJlbiBlaW5lbiBSYWJhdHQgdm9uIDEwJSANCisgICAgZ2V3YWVocnQ6DQorICAgIA0KKyAgICBvYmplY3QgKmhlbHBlcnM7DQorICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZSgpDQorICAgIHsNCisgICAgICA6OmNyZWF0ZSgpOw0KKyAgICAgIGhlbHBlcnM9KHt9KTsNCisgICAgICAuLi4NCisgICAgfQ0KKyAgICANCisgICAgc3RhdGljIHZhcmFyZ3MgaW50IFF1ZXJ5QnV5VmFsdWUobWl4ZWQgb2IsIG9iamVjdCBjbGllbnQpDQorICAgIHsNCisgICAgICBpZihtZW1iZXIoaGVscGVycyxjbGllbnQpIT0tMSkNCisgICAgICB7DQorICAgICAgICByZXR1cm4gOjpRdWVyeUJ1eVZhbHVlKG9iLGNsaWVudCkqOS8xMDsNCisgICAgICB9DQorICAgICAgcmV0dXJuIDo6UXVlcnlCdXlWYWx1ZShvYixjbGllbnQpOw0KKyAgICB9DQorDQorU2llaGUgYXVjaDoNCisgICAgRnVua3Rpb25lbjoNCisgICAgICBBZGRGaXhlZE9iamVjdCgpLCBSZW1vdmVGaXhlZE9iamVjdCgpLCBTZXRTdG9yYWdlUm9vbSgpLCANCisgICAgICBRdWVyeVN0b3JhZ2VSb29tKCksIFF1ZXJ5QnV5RmFjdCgpLCBzZWxsX29iaigpLCBidXlfb2JqKCkNCisgICAgUHJvcGVydGllczoNCisgICAgICBQX0tFRVBFUiwgUF9NSU5fU1RPQ0ssIFBfU1RPUkVfQ09OU1VNRQ0KKw0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK0xldHp0ZSBBZW5kZXJ1bmc6IDIxLjA1LjIwMTQsIEJ1Z2ZpeApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1F1ZXJ5Q29pbnNQZXJVbml0cyBiL2RvYy9sZnVuL1F1ZXJ5Q29pbnNQZXJVbml0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDhjMWIwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vUXVlcnlDb2luc1BlclVuaXRzCkBAIC0wLDAgKzEsMzEgQEAKK1F1ZXJ5Q29pbnNQZXJVbml0KCkKKworRlVOS1RJT046CisgICAgIGludCAqUXVlcnlDb2luc1BlclVuaXRzKCk7CisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC91bml0LmMKKworQVJHVU1FTlRFOgorICAgICBrZWluZQorCitCRVNDSFJFSUJVTkc6CisgICAgIExpZWZlcnQgZGFzIFdlcnR2ZXJoYWVsdG5pcyBmdWVyIGRpZSBFaW5oZWl0ZW4genVydWVjay4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgRWluIEFycmF5IHZvbiB6d2VpIFphaGxlbi4gRGllIGVyc3RlIFphaGwgaXN0IGRlciBXZXJ0IGRlciBpbiBkZXIKKyAgICAgendlaXRlbiBaYWhsIGFuZ2VnZWJlbmVuIEVpbmhlaXRlbi4KKworQkVJU1BJRUxFOgorICAgICBTdGVodCBpbSBVbml0LU9iamVrdCBmb2xnZW5kZSBXZXJ0enV3ZWlzdW5nOgorCisgICAgICAgU2V0Q29pbnNQZXJVbml0cyg3LDIpOworCisgICAgIHNvIGxpZWZlcnQgUXVlcnlDb2luc1BlclVuaXRzKCkgYWxzIEVyZ2VibmlzICh7NywgMn0pLgorCitTSUVIRSBBVUNIOgorICAgICBTZXRDb2luc1BlclVuaXRzKCksIFNldEdyYW1zUGVyVW5pdHMoKSwgUXVlcnlHcmFtc1BlclVuaXQoKSwKKyAgICAgL3N0ZC91bml0LmMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogV2VkIE1heSA4IDEwOjIyOjAyIDE5OTYgYnkgV2FyZ29uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9RdWVyeURhbWFnZSBiL2RvYy9sZnVuL1F1ZXJ5RGFtYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YzRmZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9RdWVyeURhbWFnZQpAQCAtMCwwICsxLDM5IEBACitRdWVyeURhbWFnZSgpCisKK0ZVTktUSU9OOgorICAgICBpbnQgUXVlcnlEYW1hZ2Uob2JqZWN0IGVuZW15KTsKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL3dlYXBvbi9jb21iYXQuYworCitBUkdVTUVOVEU6CisgICAgIGVuZW15CisgICAgICAgICAgRGVyIEdlZ25lciwgZ2VnZW4gZGVuIGRpZSBXYWZmZSBlaW5nZXNldHp0IHdpcmQuCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGllcyBpc3QgZGllIHplbnRyYWxlIEZ1bmt0aW9uIGRlciBXYWZmZS4gU2llIHdpcmQgaW4gamVkZXIgS2FtcGZydW5kZQorICAgICB2b24gQXR0YWNrKCkgYXVzIGF1ZmdlcnVmZW4gdW5kIGdpYnQgZGVuIFNjaGFkZW4genVydWVjaywgZGVuIGRlcgorICAgICBHZWduZXIgYWJ3ZWhyZW4gbXVzcy4KKworICAgICBJbiBkZW4gU2NoYWRlbiBnZWhlbiBzb3dvaGwgZGllIFN0YWVya2UgZGVyIFdhZmZlIGFscyBhdWNoIGRpZSBTdGFlcmtlCisgICAgIGRlcyBUcmFlZ2VycyBkZXIgV2FmZmUgZWluLgorCisgICAgIFd1cmRlIGVpbmUgSGl0RnVuYygpIGFuZ2VnZWJlbiwgc28gd2lyZCBkaWVzZSBtaXQgZGVuIGdsZWljaGVuCisgICAgIFBhcmFtZXRlcm4gd2llIFF1ZXJ5RGFtYWdlKCkgYXVmZ2VydWZlbi4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgRGllIFN0YWVya2UgZGVzIFNjaGxhZ2VzIGZ1ZXIgZGllc2UgS2FtcGZydW5kZS4gU2llIGVybWl0dGVsdCBzaWNoIGFscworICAgICBadWZhbGxzemFobCB6d2lzY2hlbiAwIHVuZCBlaW5lbSBXZXJ0LCBkZXIgc2ljaCBhdXMgZGVyIFN0YWVya2UgZGVyCisgICAgIFdhZmZlIHVuZCBkZXIgU3RhZXJrZSBpaHJlcyBUcmFlZ2VycyBlcmdpYnQuIERhcyBFcmdlYm5pcyBkZXMKKyAgICAgSGl0RnVuYygpLUF1ZnJ1ZnMgd2lyZCB6dSBkaWVzZXIgWmFobCBoaW56dWdlemFlaGx0LgorCitCRU1FUktVTkdFTjoKKyAgICAgQXVjaCB3ZW5uIG1hbiBlaW5lIEhpdEZ1bmMoKSB2ZXJ3ZW5kZXQsIGRhcmYgZGVyIFJ1ZWNrZ2FiZXdlcnQKKyAgICAgaW5zZ2VzYW10IG5pY2h0IGdyb2Vzc2VyIGFscyAyMDAgd2VyZGVuLiBJbSBad2VpZmVsc2ZhbGwgc29sbHRlIAorICAgICBtYW4gc2ljaCBtaXQgZGVyIHp1c3RhZW5kaWdlbiBCYWxhbmNlIGJlc3ByZWNoZW4hCisKK1NJRUhFIEFVQ0g6CisgICAgIEhpdEZ1bmMoKSwgQXR0YWNrKCksIC9zdGQvd2VhcG9uLmMsIGdyZW56d2VydGUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogRnJlIEZlYiAxNi4wMi4wMSAxMjo1ODowMCB2b24gVGlsbHkKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1F1ZXJ5RGVmZW5kIGIvZG9jL2xmdW4vUXVlcnlEZWZlbmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQzZDNlMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL1F1ZXJ5RGVmZW5kCkBAIC0wLDAgKzEsNDUgQEAKK1F1ZXJ5RGVmZW5kKCkKKworRlVOS1RJT046CisgICAgIGludCBRdWVyeURlZmVuZChzdHJpbmd8c3RyaW5nKiBkdHlwLCBpbnR8bWFwcGluZyBzcGVsbCwgb2JqZWN0IGVuZW15KTsKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL2FybW91ci9jb21iYXQuYworCitBUkdVTUVOVEU6CisgICAgIGR0eXAgIC0gU2NoYWRlbnN0eXBlbiBkZXIgQW5ncmlmZnNhcnQKKyAgICAgc3BlbGwgLSAwICAgICAgIGJlaSBrb252ZW50aW9uZWxsZW0gQW5ncmlmZiwKKyAgICAgICAgICAgICAhPSAwICAgIGJlaSBBbmdyaWZmIG1pdCBlaW5lbSBuaWNodHBoeXNpc2NoZW4gU3BlbGwsCisgICAgICAgICAgICAgbWFwcGluZyBiZWkgZ2VuYXVlcmVuIEFuZ2FiZW4genVyIFdpcmt1bmcKKyAgICAgZW5lbXkgLSBEZXIgYW5ncmVpZmVuZGUgR2VnbmVyCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGllcyBpc3QgZGllIHplbnRyYWxlIEZ1bmt0aW9uIGVpbmVyIFJ1ZXN0dW5nLiBTaWUgd2lyZCBpbiBqZWRlcgorICAgICBLYW1wZnJ1bmRlIGF1cyAvc3RkL2xpdmluZy9jb21iYXQ6OkRlZmVuZCgpIGZ1ZXIgamVkZSBSdWVzdHVuZyBhdWZnZXJ1ZmVuLAorICAgICBkaWUgZGVyIFNwaWVsZXIgYW5nZXpvZ2VuIGhhdC4KKworICAgICBEZXIgU2NodXR6d2VydCB2b24gUF9BQyBlbnRmYWx0ZXQgc2VpbmUgV2lya3VuZyBudXIgYmVpIGtvbnZlbnRpb25lbGxlbgorICAgICBBbmdyaWZmZW46CisgICAgICogd2VubiAnc3BlbGwnIDAgaXN0IChiZWkgQXVmcnVmIGF1cyBkZXIgRGVmZW5kIGhlcmF1cyBhdXNnZXNjaGxvc3NlbikKKyAgICAgKiB3ZW5uICdzcGVsbCcgZWluIE1hcHBpbmcgbWl0IGRlbSBGbGFnIFNQX1BIWVNJQ0FMX0FUVEFDSyAhPSAwIFVORAorICAgICAgICAgICAgICAgICAgICBpbiAnZHR5cCcgbWluZGVzdGVucyBlaW4gcGh5c2lzY2hlciBTY2hhZGVuIGVudGhhbHRlbiBpc3QKKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgRGllIFJ1ZXN0dW5nc3N0YWVya2UgaW4gZGllc2VyIEthbXBmcnVuZGUuIFNpZSBlcm1pdHRlbHQgc2ljaCBhbHMKKyAgICAgWnVmYWxsc3phaGwgendpc2NoZW4gMCB1bmQgUF9BQywgenV6dWVnbGljaCBkZXMgRXJnZWJuaXNzZXMgZGVzCisgICAgIERlZmVuZEZ1bmMoKS1BdWZydWZzLgorCitCRU1FUktVTkdFTjoKKyAgICAgQXVjaCB3ZW5uIG1hbiBlaW5lIERlZmVuZEZ1bmMoKSBiZW51dHp0LCBkYXJmIGRlciBSdWVja2dhYmV3ZXJ0CisgICAgIGluc2dlc2FtdCBuaWNodCBncm9lc3NlciB3ZXJkZW4gYWxzIGRlciBmdWVyIGRlbiBSdWVzdHVuZ3N0eXAKKyAgICAgbWF4aW1hbCB6dWxhZXNzaWdlIQorCitTSUVIRSBBVUNIOgorICAgICBSdWVzdHVuZ2VuOiBQX0FSTU9VUl9UWVBFLCBQX05SX0hBTkRTLCBQX0FSTU9VUlMsIFBfV09STgorICAgICBTY2h1dHo6ICAgICBQX0FDLCBEZWZlbmQoKSwgRGVmZW5kRnVuYworICAgICBTb25zdGlnZXM6ICBQX0VRVUlQX1RJTUUsIFBfTEFTVF9VU0UsIFBfREFNX1RZUEUKKyAgICAgVmVyd2FuZHQ6ICAgUXVlcnlBcm1vdXJCeVR5cGUoTCksIFBfV0VBUE9OLCBGaWx0ZXJDbG90aGluZygpLAorICAgICAgICAgICAgICAgICBGaWx0ZXJBcm1vdXJzKCkKKyAgICAgUmVzaXN0ZW56OiAgUF9SRVNJU1RBTkNFX1NUUkVOR1RIUywgQ2hlY2tSZXNpc3RhbmNlKEwpCisKKzI4Lkp1bCAyMDE0IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9RdWVyeURpc2d1aXNlIGIvZG9jL2xmdW4vUXVlcnlEaXNndWlzZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzBhYTNmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vUXVlcnlEaXNndWlzZQpAQCAtMCwwICsxLDI5IEBACitRdWVyeURpc2d1aXNlKCkKKworRlVOS1RJT046CisgICAgIG1peGVkIFF1ZXJ5RGlzZ3Vpc2UoKTsKKworREVGSU5JRVJUIElOOgorICAgICA/Pz8KKworQVJHVU1FTlRFOgorICAgICBrZWluZQorCitCRVNDSFJFSUJVTkc6CisgICAgIFBydWVmdCwgb2IgZGVyIFNwaWVsZXIgZHVyY2ggZWluZW4gU2hhZG93IChtZWlzdGVucyBkZXIgVGFybmhlbG0pIAorICAgICAnbWFuaXB1bGllcnQnIGlzdC4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgMCwgd2VubiBkaWVzIG5pY2h0IGRlciBGYWxsIGlzdCwgYW5zb25zdGVuIGRpZSBCZXNjaHJlaWJ1bmcgZGVzIFNoYWRvdworICAgICB2b20gVHlwIHN0cmluZy4KKworQkVNRVJLVU5HRU46CisgICAgIEluIFdhZmZlbiAvIFJ1ZXN0dW5nZW4gdS5hZS4gZGllIFBfUkVTVFJJQ1RJT05TIGdlc2V0enQgaGFiZW4sCisgICAgIGVydWVicmlndCBzaWNoIGVpbmUgQWJmcmFnZSBhdWYgUXVlcnlEaXNndWlzZSgpLCBkYSBkaWVzIGJlcmVpdHMgaW0KKyAgICAgcmVzdHJpY3Rpb25fY2hlY2tlciBlcmxlZGlndCB3aXJkLgorCitTSUVIRSBBVUNIOgorICAgICBQX1JFU1RSSUNUSU9OUywgL3N0ZC9yZXN0cmljdGlvbl9jaGVja2VyLmMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogTW9uIE1hciAyNiAxNDo0ODoyMCAyMDAxIHZvbiBUaWxseQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vUXVlcnlEb29yS2V5IGIvZG9jL2xmdW4vUXVlcnlEb29yS2V5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZDZhMjkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9RdWVyeURvb3JLZXkKQEAgLTAsMCArMSw0OCBAQAorRlVOS1RJT046CisgICAgIG1peGVkIFF1ZXJ5RG9vcktleSgpOworCitERUZJTklFUlQgSU46CisgICAgIHZlcnNjaC4gU2NobHVlc3NlbG4KKworQVJHVU1FTlRFOgorICAgICBrZWluZQorCitCRVNDSFJFSUJVTkc6CisgICAgIERpZXNlIEZ1bmt0aW9uIHdpcmQgaW4gZWluZW0gU2NobHVlc3NlbCBhdWZnZXJ1ZmVuLCB3ZW5uIG1hbiBtaXQgZGllc2VtCisgICAgIGVpbmUgVHVlciBhdWYtIG9kZXIgYWJzY2hsaWVzc2VuIHdpbGwuIEFuaGFuZCBkZXMgUnVlY2tnYWJld2VydGVzIHdpcmQKKyAgICAgZW50c2NoaWVkZW4sIG9iIGRlciBTY2hsdWVzc2VsIHBhc3N0IG9kZXIgbmljaHQuCisKK1JVRUNLR0FCRVdFUlQ6CisgICAgIFN0cmluZyBvZGVyIEFycmF5IHZvbiBTdHJpbmdzIGRlciBSYXVtcGZhZGUsIGRlcmVuIGdlbWVpbnNhbWUgVHVlcmVuCisgICAgIHNpY2ggbWl0IGRpZXNlbSBTY2hsdWVzc2VsIGF1Zi0gYnp3LiBhYnNjaGxpZXNzZW4gbGFzc2VuLiBEaWUgS2V5cyBzaW5kCisgICAgIGRhYmVpIGRpZSBSYXVtcGZhZGUsIGdldHJlbm50IGR1cmNoIGVpbiAiOiIuIERhYmVpIG11ZXNzZW4gZGllIFBmYWRlCisgICAgIGluIGxleGlrb2dyYXBoaXNjaGVyIChhbHBoYWJldGlzY2hlcikgUmVpaGVuZm9sZ2Ugc29ydGllcnQgc2VpbjoKKworICAgICAiPG5hbWVfcmF1bV8xPjo8bmFtZV9yYXVtXzI+IgorCitCRUlTUElFTEU6CisgICAgIEVpbiBTY2hsdWVzc2VsLCBtaXQgZGVtIHNpY2ggZWluZSBlaW56aWdlIFR1ZXIgb2VmZm5lbiBsYWVzc3QgKGZhbGxzIGVzCisgICAgIGplbWFscyBlaW5lIFR1ZXIgendpc2NoZW4gS2FyYXRlLSB1bmQgQWJlbnRldXJlcmdpbGRlIGdlYmVuIHNvbGx0ZS4uLik6CisKKyAgICAgc3RyaW5nIFF1ZXJ5RG9vcktleSgpCisgICAgIHsKKyAgICAgICByZXR1cm4gIi9naWxkZW4vYWJlbnRldXJlcjovZ2lsZGVuL2thcmF0ZSI7CisgICAgIH0KKworICAgICBFaW4gU2NobHVlc3NlbCwgZGVyIGluIG1laHJlcmVuIFR1ZXJlbiBwYXNzdDoKKworICAgICBzdHJpbmcqIFF1ZXJ5RG9vcktleSgpCisgICAgIHsKKyAgICAgICByZXR1cm4gKHsgIi9naWxkZW4vYWJlbnRldXJlcjovcGxheWVycy93YXJnb24vd29ya3Jvb20iLAorICAgICAgICAgICAgICAgICAiL2dpbGRlbi9hYmVudGV1cmVyOi9naWxkZW4va2FyYXRlIiwKKyAgICAgICAgICAgICAgICAgIi9wbGF5ZXJzL2pvZi93b3Jrcm9vbTovcGxheWVycy93YXJnb24vd29ya3Jvb20iCisgICAgICAgICAgICAgIH0pOworICAgICB9CisKKworU0lFSEUgQVVDSDoKKyAgICBOZXdEb29yKCksIFF1ZXJ5RG9vclN0YXR1cygpLCBTZXREb29yU3RhdHVzKCksIFBfRE9PUl9JTkZPUywKKyAgICAvc3RkL3Jvb20vZG9vcnMuYywgL29iai9kb29ybWFzdGVyLmMsIEdldFBoaW9sZW5JbmZvcygpLCBRdWVyeUFsbERvb3JzKCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xldHp0ZSBBZW5kZXJ1bmc6IERvbiwgMDguMDUuMjAxNCwgR2FieWxvbgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vUXVlcnlEb29yU3RhdHVzIGIvZG9jL2xmdW4vUXVlcnlEb29yU3RhdHVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZWU2YjgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9RdWVyeURvb3JTdGF0dXMKQEAgLTAsMCArMSwyOCBAQAorRlVOS1RJT046CisgICAgIGludCBRdWVyeURvb3JTdGF0dXMoc3RyaW5nIGRlc3QpOworCitERUZJTklFUlQgSU46CisgICAgIC9vYmovZG9vcm1hc3Rlci5jCisKK0FSR1VNRU5URToKKyAgICAgPGRlc3Q+ID0gWmllbHJhdW0gZGVyIFR1ZXIuCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRXMgd2lyZCBkZXIgWnVzdGFuZCBkZXIgVHVlciwgZGllIHZvbiBkaWVzZW0gUmF1bSBuYWNoIDxkZXN0PiBmdWVocnQsCisgICAgIGVybWl0dGVsdC4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgMCBiZWkgbmljaHQgdm9yaGFuZGVuZSBUdWVyLCBhbnNvbnN0ZW4gZWluZXIgZGVyIGZvbGdlbmRlbiBadXN0YWVuZGUgKGF1cworICAgICAgIDxkb29ycm9vbS5oPik6CisKKyAgICAgICBEX1NUQVRVU19MT0NLRUQgLSBUdWVyIGFiZ2VzY2hsb3NzZW4KKyAgICAgICBEX1NUQVRVU19DTE9TRUQgLSBUdWVyIGdlc2NobG9zc2VuCisgICAgICAgRF9TVEFUVVNfT1BFTiAgIC0gVHVlciBnZW9lZmZuZXQKKworCitTSUVIRSBBVUNIOgorICAgIE5ld0Rvb3IoKSwgUXVlcnlEb29yS2V5KCksIFNldERvb3JTdGF0dXMoKSwgUF9ET09SX0lORk9TLAorICAgIC9zdGQvcm9vbS9kb29ycy5jLCAvb2JqL2Rvb3JtYXN0ZXIuYywgR2V0UGhpb2xlbkluZm9zKCksIFF1ZXJ5QWxsRG9vcnMoKQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGV0enRlIEFlbmRlcnVuZzogRG9uLCAwOC4wNS4yMDE0LCBHYWJ5bG9uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9RdWVyeUR1IGIvZG9jL2xmdW4vUXVlcnlEdQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmU2MmE4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vUXVlcnlEdQpAQCAtMCwwICsxLDM5IEBACitRdWVyeUR1KCkKKworRlVOS1RJT046CisgICAgIHZhcmFyZ3Mgc3RyaW5nIFF1ZXJ5RHUoaW50IGNhc3VzLCBpbnQgZ2VuZGVyLCBpbnQgYW56YWhsKTsKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL3RoaW5nL2xhbmd1YWdlLmMKKworQVJHVU1FTlRFOgorICAgICBjYXN1cworICAgICAgICAgIERlciBGYWxsIGZ1ZXIgZGllIEFucmVkZS4KKworICAgICBnZW5kZXIKKyAgICAgICAgICBEYXMgR2VzY2hsZWNodCBkZXMgYW56dXJlZGVuZGVuIE9iamVrdGVzLgorCisgICAgIGFuemFobAorICAgICAgICAgIElzdCBudXIgZWluIE9iamVrdCBhbnp1c3ByZWNoZW4gb2RlciBtZWhyZXJlPworCitCRVNDSFJFSUJVTkc6CisgICAgIERpZXNlIEZ1bmt0aW9uIGxpZWZlcnQgZGllIGRlbSBBbmxhc3MgZW50c3ByZWNoZW5kZSBBbnJlZGUgZnVlciBlaW4KKyAgICAgT2JqZWt0LgorCitSVWVDS0dBQkVXRVJUOgorICAgICBFaW4gU3RyaW5nIG1pdCBkZXIgQW5yZWRlLgorCitCRUlTUElFTEU6CisKKyAgICAgcHJpbnRmKCIlcyBzZXR6dCAlcyBhdWYgZGVuIEJvZGVuLlxuIiwKKyAgICAgICAgICAgY2FwaXRhbGl6ZShRdWVyeUR1KFdFUiwgVFAtPlF1ZXJ5UHJvcChQX0dFTkRFUiksIFNJTkdVTEFSKSwKKyAgICAgICAgICAgUXVlcnlEdShXRU4sIFRQLT5RdWVyeVByb3AoUF9HRU5ERVIpLCBTSU5HVUxBUikpOworCisgICAgIChJbiBkZW4gbWVpc3RlbiBGYWVsbGVuIGthbm4gbWFuIGhpZXIgYXVjaCBkaXJla3QgIkR1IiB1bmQgImRpY2giCisgICAgIGVpbnNldHplbi4pCisKK1NJRUhFIEFVQ0g6CisgICAgIC9zdGQvdGhpbmcvbGFuZ3VhZ2UuYworICAgICBRdWVyeVBvc3NQcm9ub3VuKCksIFF1ZXJ5T3duKCksIFF1ZXJ5UHJvbm91bigpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBXZWQgTWF5IDggMTA6MjI6MjcgMTk5NiBieSBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1F1ZXJ5RW5lbWllcyBiL2RvYy9sZnVuL1F1ZXJ5RW5lbWllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzM5M2I0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vUXVlcnlFbmVtaWVzCkBAIC0wLDAgKzEsMzMgQEAKK0ZVTktUSU9OOgorCW1peGVkIFF1ZXJ5RW5lbWllcygpOworCitERUZJTklFUlQgSU46CisJL3N0ZC9saXZpbmcvY29tYmF0LmMKKworQVJHVU1FTlRFOgorCWtlaW5lCisKK1JVZUNLR0FCRVdFUlQ6CisJQXJyYXkgbWl0IEFycmF5IGF1cyBiZWthbm50ZW4gR2VnbmVybiB1bmQgQXJyYXkgYXVzIFplaXRlbgorCitCRVNDSFJFSUJVTkc6CisJRGllc2UgRnVua3Rpb24gZW50aGFlbHQgZWluIEFycmF5LCBkYXMgendlaSBFbGVtZW50ZSBlbnRoYWVsdCwgZGllCisJd2llZGVydW0gQXJyYXlzIHNpbmQ6CisJICAxLiBBcnJheTogRGllIGJla2FubnRlbiBHZWduZXIgYWxzIE9iamVrdHBvaW50ZXIuCisJICAyLiBBcnJheTogRGllIHp1Z2VvcmRuZXRlbiBaZWl0ZW4sIHdpZSBsYW5nZSBlaW4gR2VnbmVyIG5vY2ggYWxzCisJICAgICAgICAgICAgc29sY2hlciBiZWthbm50IHNlaW4gc29sbC4KKwlJbSBOb3JtYWxmYWxsIHdpcmQgZWluIEdlZ25lciBkYW5uIGJla2FubnQsIHdlbm4gbWFuIGdlemllbHQKKwlqZW1hbmRlbiBhdGFja2llcnQsIG9kZXIgd2VubiBtYW4gZWluZW4gQW5ncmlmZiBhYndlaHJlbiBtdXNzLgorCURhbm4gd2lyZCBkZXIgR2VnbmVyIGludGVybiBhYmdlc3BlaWNoZXJ0LCB1bmQgZXMgd2lyZCBlaW5lIFplaXQKKwlnZXNldHp0LCBkaWUgZGFubiBydW50ZXJnZXphZWhsdCB3aXJkLiBJc3QgZGllIFplaXQgYXVmIDAsIHNvIHdpcmQKKwlkZXIgR2VnbmVyIHdpZWRlciBhdXRvbWF0aXNjaCBhdXNnZXRyYWdlbi4KKwkoU3RhbmRhcmRtYWVzc2lnIGJldHJhZWd0IGRpZXNlIFplaXQgNjAwIFNla3VuZGVuICgzMDAgSGVhcnRiZWF0cykuKQorCU1hbiBrYW5uIHNpY2ggZGllIEdlZ25lciBhdWNoIGluIEZvcm0gZWluZXMgTWFwcGluZ3MgenVydWVja2dlYmVuCisJbGFzc2VuLiBEaWVzIGVycmVpY2h0IG1hbiBtaXR0ZWxzIGRlciBGdW5rdGlvbiBHZXRFbmVtaWVzKCkuCisKK1NJRUhFIEFVQ0g6CisJS2lsbCgpLCBBdHRhY2soKSwgRGVmZW5kKCksIGRvX215X2hlYXJ0X2JlYXQoKSwgUHJlc2VudEVuZW1pZXMoKSwKKwlHZXRFbmVtaWVzKCksIFNlbGVjdEVuZW15KCksIFF1ZXJ5UHJlZmVyZWRFbmVteSgpLCBQX1BSRUZFUkVEX0VORU1ZCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzI5LjEyLjIwMDcsIFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1F1ZXJ5RmxhdyBiL2RvYy9sZnVuL1F1ZXJ5RmxhdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTM3ZDgxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vUXVlcnlGbGF3CkBAIC0wLDAgKzEsNDEgQEAKK1F1ZXJ5RmxhdygpCisKK0ZVTktUSU9OOgorICAgICBtaXhlZCAqUXVlcnlGbGF3KCk7CisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC9hcm1vdXIvY29tYmF0LmMsCisgICAgIC9zdGQvd2VhcG9uL2NvbWJhdC5jCisKK0FSR1VNRU5URToKKyAgICAga2VpbmUKKworQkVTQ0hSRUlCVU5HOgorICAgICBRdWVyeUZsYXcoKSBsaWVmZXJ0IEluZm9ybWF0aW9uZW4gdWViZXIgZGVuIEdyYWQgZGVyIEFibnV0enVuZyBkZXIKKyAgICAgV2FmZmUgYnp3LiBSdWVzdHVuZy4gRGVyIFp1c3RhbmQgd2lyZCBhbHMgQXJyYXkgbWl0IGRlciBaYWhsIGRlcgorICAgICBUYWtlRmxhdygpLUF1ZnJ1ZmUgdW5kIGRlbSBEYXR1bSBkZXMgZXJzdGVuIFRha2VGbGF3KCktQXVmcnVmcworICAgICB6dXJ1ZWNrZ2VnZWJlbi4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgRWluIEFycmF5IG1pdCBkcmVpIEVsZW1lbnRlbjoKKyAgICAgICAxLiBkZXIgYWt0dWVsbGUgWmFlaGxlcnN0YW5kCisgICAgICAgMi4gWmVpdCBkZXIgZXJzdGVuIEJlbnV0enVuZworICAgICAgIDMuIGRpZSBaZWl0IGRlciBlcnN0ZW4gQmVudXR6dW5nIGFscyBTdHJpbmcKKworQkVJU1BJRUxFOgorICAgICBEZW4gYWt0dWVsbGVuIEFibnV0enVuZ3NncmFkIGVpbmVyIFJ1ZXN0dW5nIGthbm4gbWFuIHNpY2ggd2llIGZvbGd0CisgICAgIGFuemVpZ2VuIGxhc3NlbjoKKworICAgICBtaXhlZCAqZmxhdzsKKworICAgICBmbGF3ID0gcnVlc3R1bmctPlF1ZXJ5RmxhdygpOworCisgICAgIHByaW50ZigiWmFlaGxlcnN0YW5kOiAlZCwgZXJzdGVyIFNjaGxhZzogJXNcbiIsIGZsYXdbMF0sIGZsYXdbMl0pOworICAgICAvLyBvZGVyIGFuYWxvZzoKKyAgICAgcHJpbnRmKCJaYWVobGVyc3RhbmQ6ICVkLCBlcnN0ZXIgU2NobGFnOiAlc1xuIiwgZmxhd1swXSwgZHRpbWUoZmxhd1sxXSkpOworCitTSUVIRSBBVUNIOgorICAgICBUYWtlRmxhdygpLCAvc3RkL2FybW91ci9jb21iYXQuYywgL3N0ZC93ZWFwb24vY29tYmF0LmMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogV2VkIE1heSA4IDEwOjIyOjMyIDE5OTYgYnkgV2FyZ29uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9RdWVyeUdlbmRlclN0cmluZyBiL2RvYy9sZnVuL1F1ZXJ5R2VuZGVyU3RyaW5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2N2ExNmUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9RdWVyeUdlbmRlclN0cmluZwpAQCAtMCwwICsxLDIzIEBACitRdWVyeUdlbmRlclN0cmluZygpCisKK0ZVTktUSU9OOgorICAgICBzdHJpbmcgUXVlcnlHZW5kZXJTdHJpbmcoKTsKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL3RoaW5nL2xhbmd1YWdlLmMKKworQVJHVU1FTlRFOgorICAgICBrZWluZQorCitCRVNDSFJFSUJVTkc6CisgICAgIEVzIHdpcmQgZWluIFN0cmluZyBtaXQgZGVtIEdlc2NobGVjaHQgZGVzIE9iamVrdGVzIHp1cnVlY2tnZWdlYmVuCisgICAgICgibWFlbm5saWNoIiwgIndlaWJsaWNoIiwgInNhZWNobGljaCIpLgorCitSVWVDS0dBQkVXRVJUOgorICAgICBEZXIgU3RyaW5nIG1pdCBkZW0gR2VzY2hsZWNodC4KKworU0lFSEUgQVVDSDoKKyAgICAgL3N0ZC90aGluZy9sYW5ndWFnZS5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFdlZCBNYXkgOCAxMDoyMzowMCAxOTk2IGJ5IFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vUXVlcnlHcmFtc1BlclVuaXRzIGIvZG9jL2xmdW4vUXVlcnlHcmFtc1BlclVuaXRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NDllNTQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9RdWVyeUdyYW1zUGVyVW5pdHMKQEAgLTAsMCArMSwzMSBAQAorUXVlcnlHcmFtc1BlclVuaXRzKCkKKworRlVOS1RJT046CisgICAgIGludCAqUXVlcnlHcmFtc1BlclVuaXRzKCk7CisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC91bml0LmMKKworQVJHVU1FTlRFOgorICAgICBrZWluZQorCitCRVNDSFJFSUJVTkc6CisgICAgIExpZWZlcnQgZGFzIEdld2ljaHRzdmVyaGFlbHRuaXMgZnVlciBkaWUgRWluaGVpdGVuIHp1cnVlY2suCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIEVpbiBBcnJheSB2b24gendlaSBaYWhsZW4uIERpZSBlcnN0ZSBaYWhsIGlzdCBkYXMgR2V3aWNodCBkZXIgaW4gZGVyCisgICAgIHp3ZWl0ZW4gWmFobCBhbmdlZ2ViZW5lbiBFaW5oZWl0ZW4uCisKK0JFSVNQSUVMRToKKyAgICAgU3RlaHQgaW0gVW5pdC1PYmpla3QgZm9sZ2VuZGUgR2V3aWNodHN6dXdlaXN1bmc6CisKKyAgICAgICBTZXRHcmFtc1BlclVuaXRzKDQsMSk7CisKKyAgICAgc28gbGllZmVydCBRdWVyeUdyYW1zUGVyVW5pdHMoKSBhbHMgRXJnZWJuaXMgKHs0LCAxfSkuCisKK1NJRUhFIEFVQ0g6CisgICAgIFNldENvaW5zUGVyVW5pdHMoKSwgUXVlcnlDb2luc1BlclVuaXRzKCkgU2V0R3JhbXNQZXJVbml0cygpLAorICAgICAvc3RkL3VuaXQuYworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBXZWQgTWF5IDggMTA6MjI6MzkgMTk5NiBieSBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1F1ZXJ5R3JvdXBlZEtleXMgYi9kb2MvbGZ1bi9RdWVyeUdyb3VwZWRLZXlzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlN2UzMTYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9RdWVyeUdyb3VwZWRLZXlzCkBAIC0wLDAgKzEsMjYgQEAKK1F1ZXJ5R3JvdXBlZEtleXMoKQorCitGVU5LVElPTjoKKyAgICBtaXhlZCAqUXVlcnlHcm91cGVkS2V5cygpCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc2VjdXJlL3F1ZXN0bWFzdGVyLmMKKworQVJHVU1FTlRFOgorICAgIGtlaW5lCisKK1JVRUNLR0FCRVdFUlQ6CisgICAgQXJyYXkgbWl0IEFycmF5cyBtaXQgZGVuIFNjaGx1ZXNzZWx3b2VydGVybiBkZXIgUXVlc3RzCisKK0JFU0NIUkVJQlVORzoKKyAgICBEaWVzZSBGdW5rdGlvbiBsaWVmZXJ0IGVpbiBBcnJheSBtaXQgbWVocmVyZW4gQXJyYXlzIHp1cnVlY2ssIGRpZQorICAgIGRpZSBTY2hsdWVzc2Vsd29lcnRlciBkZXIgUXVlc3RzIGVudGhhbHRlbi4gRGFiZWkgZW50aGFlbHQgZGFzIAorICAgIGVyc3RlIEFycmF5IGRpZSBTY2hsdWVzc2Vsd29lcnRlciBkZXIgUXVlc3RzIGRlciBlcnN0ZW4gR3J1cHBlIGV0Yy4KKyAgICBEYXMgbGV0enRlIEFycmF5IGVudGhhZWx0IGRpZSBHcnVwcGUgZGVyIG9wdGlvbmFsZW4gUXVlc3RzLgorCitTSUVIRSBBVUNIOgorICAgIEdpdmVRdWVzdCwgUXVlcnlRdWVzdCwgL3NlY3VyZS9xdWVzdG1hc3Rlci5oCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1p1bGV0enQgZ2VhZW5kZXJ0OiBTb24sIDE5LiBOb3YgMjAwMCwgMTM6MjI6MTUgdm9uIFpvb2suCisKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1F1ZXJ5R3Vlc3QgYi9kb2MvbGZ1bi9RdWVyeUd1ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjOTk3MWIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9RdWVyeUd1ZXN0CkBAIC0wLDAgKzEsMzMgQEAKK1F1ZXJ5R3Vlc3QoKQorRlVOS1RJT046CisgICAgIGludCBRdWVyeUd1ZXN0KCk7CisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC9wbGF5ZXIvYmFzZQorCitCRVNDSFJFSUJVTkc6CisgICAgIEF1ZiBkZXIgdWlkIGJhc2llcmVuZGUgSGlsZnNmdW5rdGlvbiwgdW0gR2Flc3RlIHp1IGlkZW50aWZpemllcmVuLgorCitSVWVDS0dBQkVXRVJUOgorICAgICAxLCB3ZW5uIFNwaWVsZXJvYmpla3QgZWluIEdhc3QgaXN0OyAwIHNvbnN0CisKK0JFSVNQSUVMRToKKyAgICAgaWYodGhpc19pbnRlcmFjdGl2ZSgpLT5RdWVyeUd1ZXN0KCkpCisgICAgIHsKKyAgICAgICAodGhpc19pbnRlcmFjdGl2ZSgpLT5SZWNlaXZlTXNnKAorICAgICAgICAgICJXaXIgYmVkaWVuZW4gaGllciBudXIgb3JkZW50bGljaGUgQ2hhcmFrdGVyZS4iLAorICAgICAgICAgIE1UX0xJU1RFTiwgTUFfU0FZLAorICAgICAgICAgICJEZXIgV2lydCBzYWd0OiAiKSAhPSBNU0dfU0VOU0VfQkxPQ0spIHx8CisgICAgICAgKHRoaXNfaW50ZXJhY3RpdmUoKS0+UmVjZWl2ZU1zZygKKyAgICAgICAgICAiRGVyIFdpcnQgZ2VzdGlrdWxpZXJ0IGRpY2ggaGluYXVzLiIsCisgICAgICAgICAgTVRfTE9PSywgTUFfTE9PSykgIT0gTVNHX1NFTlNFX0JMT0NLKSB8fAorICAgICAgICh0aGlzX2ludGVyYWN0aXZlKCktPlJlY2VpdmVNc2coCisgICAgICAgICAgIklyZ2VuZHdlciBzdHVwc3QgZGljaCBhbi4gRHUgc29sbHN0IHdvaGwgZ2VoZW4uIiwKKyAgICAgICAgICBNVF9GRUVMLCBNQV9GRUVMKSk7CisgICAgICAgcmV0dXJuIDE7CisgICAgIH0KKworU0lFSEUgQVVDSDoKKyAgICAgZ2V0dWlkKCkKKworMTQuIE1haSAyMDE1IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9RdWVyeUhlYWxJbmZvIGIvZG9jL2xmdW4vUXVlcnlIZWFsSW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2I3NTQyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vUXVlcnlIZWFsSW5mbwpAQCAtMCwwICsxLDI2IEBACitRdWVyeUhlYWxJbmZvKCkKKworRlVOS1RJT046CisgICAgIHN0cmluZyBRdWVyeUhlYWxJbmZvKCk7CisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC9jb3Jwc2UuYywKKworQVJHVU1FTlRFOgorICAgICBrZWluZQorCitCRVNDSFJFSUJVTkc6CisgICAgIFF1ZXJ5SGVhbEluZm8oKSBsaWVmZXJ0IGVpbmVuIFN0YW5kYXJkdGV4dCB6dXJ1ZWNrLCBkZXIgZ3JvYiBBdXNrdW5mdCAKKyAgICAgZGFydWViZXIgZ2lidCwgd2VsY2hlIEF1c3dpcmt1bmdlbiBkYXMgRXNzZW4gZWluZXIgTGVpY2hlIGhhZXR0ZS4gCisgICAgIERpZXNlIEluZm8ga2FubiB6LkIuIHZvbiBHaWxkZW4gdmVyd2VuZGV0IHdlcmRlbiwgZGllIFBfSEVBTCAocy5kb3J0KQorICAgICBlaW5lciBMZWljaGUgbmljaHQgc2VsYnN0IGF1c3dlcnRlbiB3b2xsZW4uCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIEVpbiBuaWNodCB1bWJyb2NoZW5lciBTdHJpbmcuIEZ1ZXIgWmVpbGVudW1icnVlY2hlIGthbm4gZGVyamVuaWdlLAorICAgICBkZXIgZGVuIFRleHQgYXVzbGllc3QsIHNlbGJzdCBzb3JnZW4uCisKK1NJRUhFIEFVQ0g6CisgICAgIC9zdGQvY29ycHNlLmMsIFBfSEVBTAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiAzMS4wMy4yMDA4LCBBcmF0aG9ybgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vUXVlcnlNYXRlcmlhbCBiL2RvYy9sZnVuL1F1ZXJ5TWF0ZXJpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFlM2EzMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL1F1ZXJ5TWF0ZXJpYWwKQEAgLTAsMCArMSwzNCBAQAorUXVlcnlNYXRlcmlhbChMKQorRlVOS1RJT046CisgICAgIGludCBRdWVyeU1hdGVyaWFsKHN0cmluZyBtYXQpCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC90aGluZy9kZXNjcmlwdGlvbi5jCisKK0FSR1VNRU5URToKKyAgICAgc3RyaW5nIG1hdCAtCU1hdGVyaWFsLCBhdWYgZGFzIGdldGVzdGV0IHdlcmRlbiBzb2xsCisKK0JFU0NIUkVJQlVORzoKKyAgICAgVGVzdGV0LCBvYiBlaW4gR2VnZW5zdGFuZCBhdXMgZGVtIGFuZ2VnZWJlbmVuIE1hdGVyaWFsIGJlc3RlaHQKKyAgICAgdW5kIGdpYnQgZGVzc2VuIEFudGVpbCB6dXJ1ZWNrLgorICAgICBEaWUgUnVlY2tnYWJlIGlzdCBpbSBXZXJ0ZWJlcmVpY2ggLTEwMCAoQW50aWdydXBwZW4pIGJpcyArMTAwICglKS4KKworUlVFQ0tHQUJFV0VSVDoKKyAgICAgQW50ZWlsIGluIFByb3plbnQuCisKK0JFSVNQSUVMRToKKyAgICAgaWYob2ItPlF1ZXJ5TWF0ZXJpYWwoTUFUX0lWT1JZKTw9MCkKKyAgICAgICB3cml0ZSgiRGFyYXVzIGthbm5zdCBEdSBrZWluZSBCaWxsaWFyZGt1Z2VsbiBzY2huaXR6ZW4hXG4iKTsKKworU0lFSEUgQVVDSDoKKyAgICAgS29uemVwdGU6CSAgbWF0ZXJpYWwsIG1hdGVyaWFsZXJrZW5udW5nCisgICAgIEdydW5kbGVnZW5kOiBQX01BVEVSSUFMLCAvc3lzL3RoaW5nL21hdGVyaWFsLmgKKyAgICAgTWV0aG9kZW46ICAgIFF1ZXJ5TWF0ZXJpYWxHcm91cCgpLCBNYXRlcmlhbExpc3QoKSwKKyAgICAgTGlzdGVuOgkgIEFsbE1hdGVyaWFscygpLCBBbGxHcm91cHMoKSwgRHVtcCgpCisJCSAgbWF0ZXJpYWxsaXN0ZSwgbWF0ZXJpYWxncnVwcGVuCisgICAgIE1hc3RlcjoJICBBZGRNYXRlcmlhbCgpLCBDb252TWF0ZXJpYWxMaXN0KCksIE1hdGVyaWFsR3JvdXAoKSwKKwkJICBHcm91cE5hbWUoKSwgTWF0ZXJpYWxOYW1lKCksCisJCSAgR2V0R3JvdXBNZW1iZXJzKCksIEdldE1hdE1lbWJlcnNoaXAoKQorICAgICBTb25zdGlnZXM6CSAgUF9NQVRFUklBTF9LTk9XTEVER0UKKworNy4gTWFpIDIwMDQgR2xvaW5zb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9RdWVyeU1hdGVyaWFsR3JvdXAgYi9kb2MvbGZ1bi9RdWVyeU1hdGVyaWFsR3JvdXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNiNjg2MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL1F1ZXJ5TWF0ZXJpYWxHcm91cApAQCAtMCwwICsxLDUwIEBACitRdWVyeU1hdGVyaWFsR3JvdXAoTCkKK0ZVTktUSU9OOgorICAgICBpbnQgUXVlcnlNYXRlcmlhbEdyb3VwKHN0cmluZyBncnApCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC90aGluZy9kZXNjcmlwdGlvbi5jCisKK0FSR1VNRU5URToKKyAgICAgc3RyaW5nIGdycAkJLSBNYXRlcmlhbGdydXBwZSwgYXVmIGRpZSBnZXRlc3RldCB3ZXJkZW4gc29sbAorCitCRVNDSFJFSUJVTkc6CisgICAgIExpZWZlcnQgZWluZSBBbmdhYmUsIHp1IHdlbGNoZW0gQW50ZWlsIGRhcyBPYmpla3QgYXVzIE1hdGVyaWFsaWVuCisgICAgIGRpZXNlciBHcnVwcGUgYmVzdGVodC4KKyAgICAgRGllIFJ1ZWNrZ2FiZSBpc3QgaW0gV2VydGViZXJlaWNoIC0xMDAgKEFudGlncnVwcGVuKSBiaXMgKzEwMCAoJSkuCisKK1JVRUNLR0FCRVdFUlQ6CisgICAgIEFudGVpbCBpbiBQcm96ZW50LgorCitCRU1FUktVTkdFTjoKKyAgICAgUnVmdCBNYXRlcmlhbEdyb3VwKCkgYW4gZGVyIE1BVEVSSUFMREIuCisKK0JFSVNQSUVMRToKKyAgICAgLy8ga2FubiBtYW4gZGFtaXQgd2FzIGFuZmFuZ2VuPworICAgICBpZihvYi0+UXVlcnlNYXRlcmlhbEdyb3VwKE1BVEdST1VQX01FVEFMKTw1MCkKKyAgICAgICB3cml0ZSgiRGVyIFNjaG1pZWQgc2FndDogRGFyYXVzIGthbm4gaWNoIGtlaW4gU2Nod2VydCBmZXJ0aWdlbi5cbiIpOworCisgICAgIC8vIHZlcmJyZW5udCBkYXMgRGluZz8KKyAgICAgaWYob2ItPlF1ZXJ5TWF0ZXJpYWxHcm91cChNQVRHUk9VUF9JTkZMQU1NQUJMRSk+NTApIHsKKyAgICAgICB3cml0ZShvYi0+TmFtZShXRVIpKyIgZ2VodCBpbiBGbGFtbWVuIGF1Zi5cbiIpOworICAgICAgIG9iLT5yZW1vdmUoKTsKKyAgICAgfQorCisgICAgIC8vIHdpZSBtYWduZXRpc2NoIGlzdCBlcyBkZW5uPworICAgICBpZihvYi0+UXVlcnlNYXRlcmlhbEdyb3VwKE1BVEdST1VQX01BR05FVElDKT41MCkKKyAgICAgIHdyaXRlKGJyZWFrX3N0cmluZygKKyAgICAgICBvYi0+TmFtZShXRVIpKyIgZmx1dHNjaHQgRGlyIGF1cyBkZXIgSGFuZCB1bmQgYmxlaWJ0IGFtIE1hZ25ldGVuICIKKwkJICAgICAia2xlYmVuISIsNzgpKTsKKworU0lFSEUgQVVDSDoKKyAgICAgS29uemVwdGU6CSAgbWF0ZXJpYWwsIG1hdGVyaWFsZXJrZW5udW5nCisgICAgIEdydW5kbGVnZW5kOiBQX01BVEVSSUFMLCAvc3lzL3RoaW5nL21hdGVyaWFsLmgKKyAgICAgTWV0aG9kZW46ICAgIFF1ZXJ5TWF0ZXJpYWwoKSwgTWF0ZXJpYWxMaXN0KCksCisgICAgIExpc3RlbjoJICBBbGxNYXRlcmlhbHMoKSwgQWxsR3JvdXBzKCksIER1bXAoKQorCQkgIG1hdGVyaWFsbGlzdGUsIG1hdGVyaWFsZ3J1cHBlbgorICAgICBNYXN0ZXI6CSAgQWRkTWF0ZXJpYWwoKSwgQ29udk1hdGVyaWFsTGlzdCgpLCBNYXRlcmlhbEdyb3VwKCksCisJCSAgR3JvdXBOYW1lKCksIE1hdGVyaWFsTmFtZSgpLAorCQkgIEdldEdyb3VwTWVtYmVycygpLCBHZXRNYXRNZW1iZXJzaGlwKCkKKyAgICAgU29uc3RpZ2VzOgkgIFBfTUFURVJJQUxfS05PV0xFREdFCisKKzcuIE1haSAyMDA0IEdsb2luc29uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vUXVlcnlNYXhRUCBiL2RvYy9sZnVuL1F1ZXJ5TWF4UVAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZhMGY1YQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL1F1ZXJ5TWF4UVAKQEAgLTAsMCArMSwyNyBAQAorUXVlcnlNYXhRUCgpCisKK0ZVTktUSU9OOgorICAgIGludCBRdWVyeU1heFFQKCkKKworREVGSU5JRVJUIElOOgorICAgIC9zZWN1cmUvcXVlc3RtYXN0ZXIuYworCitBUkdVTUVOVEU6CisgICAga2VpbmUKKworUlVFQ0tHQUJFV0VSVDoKKyAgICBBYmVudGV1ZXJwdW5rdGUgZGVyIFBmbGljaHRxdWVzdHMKKworQkVTQ0hSRUlCVU5HOgorICAgIERpZXNlIEZ1bmt0aW9uIGxpZWZlcnQgZGllIEFiZW50ZXVlcnB1bmt0ZSBkZXIgYWxzIFBmbGljaHRxdWVzdAorICAgIGVpbmdldHJhZ2VuZW4gQWJlbnRldWVyIHp1cnVlY2suIFBmbGljaHRxdWVzdCBiZWRldXRldCBlbnR3ZWRlciwKKyAgICBkYXNzIGRpZSBRdWVzdCB6d2luZ2VuZCBnZWxvZXN0IHdlcmRlbiBtdXNzIG9kZXIgZGFzcyBzaWUgenUKKyAgICBkZXIgODAlLVJlZ2VsIGdlaG9lcnQuCisKK1NJRUhFIEFVQ0g6CisgICAgR2l2ZVF1ZXN0LCBRdWVyeVF1ZXN0LCAvc2VjdXJlL3F1ZXN0bWFzdGVyLmgsIFF1ZXJ5R3JvdXBlZEtleXMsCisgICAgUXVlcnlPcHRRUCwgUXVlcnlUb3RhbFFQCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1p1bGV0enQgZ2VhZW5kZXJ0OiBTYW0sIDI1LiBOb3YgMjAwMCwgMTQ6MDQ6Mjggdm9uIFpvb2suCisKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1F1ZXJ5TW9uZXkgYi9kb2MvbGZ1bi9RdWVyeU1vbmV5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5OWI1MGUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9RdWVyeU1vbmV5CkBAIC0wLDAgKzEsMjggQEAKK1F1ZXJ5TW9uZXkoKQorRlVOS1RJT046CisgICAgIGludCBRdWVyeU1vbmV5KCkKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL3BsYXllci9tb25leWhhbmRsZXIuYworCitCRVNDSFJFSUJVTkc6CisgICAgIFRlc3RldCwgb2IgZWluIFNwaWVsZXIsIE9iamVrdCwgUmF1bSBvZGVyIE5wYyB1ZWJlciBlaW5lIGRlZmluaWVydGUgCisgICAgIEdlbGRtZW5nZSB2ZXJmdWVndCwgb2RlciBuaWNodC4KKworUlVFQ0tHQUJFV0VSVDoKKyAgICAgR2VsZG1lbmdlIGltIEJlc2l0eiBkZXMgYWJnZWZyYWd0ZW4gU3BpZWxlcnMKKworQkVJU1BJRUxFOgorICAgICBpbnQgaTsKKyAgICAgaT01MCtyYW5kb20oMTApOworICAgICBpZighdGhpc19wbGF5ZXIoKS0+UXVlcnlNb25leSgpKQorICAgICAgIHdyaXRlKCJEdSBiZXNpdHp0IGtlaW5lIE11ZW56ZW4hXG4iKTsKKyAgICAgaWYodGhpc19wbGF5ZXIoKS0+UXVlcnlNb25leSgpIDwgaSkKKyAgICAgICB3cml0ZSgiRHUgYmVzaXR6dCBuaWNodCBkaWUgZXJmb3JkZXJsaWNoZW4gIitpKyIgTXVlbnplbi5cbiIpOworCitTSUVIRSBBVUNIOgorICAgICBHZWxkaGFuZGxpbmc6CUFkZE1vbmV5KEwpCisgICAgIFplbnRyYWxiYW5rOglQYXlJbihMKSwgV2l0aERyYXcoTCksIF9xdWVyeV9jdXJyZW50X21vbmV5KEwpCisgICAgIFNvbnN0aWdlczoJCS9pdGVtcy9tb25leS5jCisKK0xhc3QgbW9kaWZpZWQ6IERpZSwgIDEuIEF1ZyAyMDAwLCAxNjozOTowNiBieSBUaWxseQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vUXVlcnlOYW1lIGIvZG9jL2xmdW4vUXVlcnlOYW1lCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNmNkMWEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9RdWVyeU5hbWUKQEAgLTAsMCArMSwyNCBAQAorUXVlcnlOYW1lKCkKKworRlVOS1RJT046CisgICAgIG1peGVkIFF1ZXJ5TmFtZSgpOworCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvdGhpbmcvZGVzY3JpcHRpb24uYworCitBUkdVTUVOVEU6CisgICAgIGtlaW5lCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRElFU0UgRlVOS1RJT04gU09MTFRFIE5JQ0hUIE1FSFIgQkVOVVRaVCBXRVJERU4hCisgICAgIEVzIHdpcmQgZGVyIEluaGFsdCBkZXIgUHJvcGVydHkgUF9OQU1FIHp1dWVja2dlZ2ViZW47IGRpZXMgbGFlc3N0IHNpY2gKKyAgICAgamVkb2NoIGdlbmF1IHNvIGd1dCBtaXQgUXVlcnlQcm9wKFBfTkFNRSkgYmV3ZXJrc3RlbGxpZ2VuIQorCitSVWVDS0dBQkVXRVJUOgorICAgICBTdHJpbmcgb2RlciBBcnJheSB2b24gU3RyaW5ncyBtaXQgZGVtIE5hbWVuIGRlcyBPYmpla3Rlcy4KKworU0lFSEUgQVVDSDoKKyAgICAgUXVlcnlQcm9wKCksIE5hbWUoKSwgbmFtZSgpLCAvc3RkL3RoaW5nL2Rlc2NyaXB0aW9uLmMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogU2F0IEF1ZyAgMyAxMToyMTowNSAyMDAyIGJ5IFZhbmlvbgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vUXVlcnlPcGVuTWluaVF1ZXN0c0ZvclBsYXllciBiL2RvYy9sZnVuL1F1ZXJ5T3Blbk1pbmlRdWVzdHNGb3JQbGF5ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAyNDZhZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL1F1ZXJ5T3Blbk1pbmlRdWVzdHNGb3JQbGF5ZXIKQEAgLTAsMCArMSw1NCBAQAorRlVOS1RJT046CisgICAgbWFwcGluZyBRdWVyeU9wZW5NaW5pUXVlc3RzRm9yUGxheWVyKG9iamVjdCBwbGF5ZXIpCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc2VjdXJlL3F1ZXN0bWFzdGVyCisKK0JFU0NIUkVJQlVORzoKKyAgICBEaWVzZSBGdW5rdGlvbiBnaWJ0IGRpZSBMaXN0ZSBkZXIgb2ZmZW5lbiBNaW5pcXVlc3RzIGRlcyBTcGllbGVycyBhbHMKKyAgICBNYXBwaW5nIHp1cnVlY2suCisKK0FSR1VNRU5URToKKyAgICBwbGF5ZXIgLSBkYXMgaW50ZXJlc3NpZXJlbmRlIFNwaWVsZXJvYmpla3QKKworUlVFQ0tHQUJFV0VSVEU6CisgICAgTWFwcGluZyBtaXQgZGVyIExpc3RlIGRlciBNaW5pcXVlc3RzLCBmdWVyIGRpZSBkYXMgYWJmcmFnZW5kZSBPYmpla3QKKyAgICB6dXN0YWVuZGlnIGlzdCwgb2RlciBsZWVyZXMgTWFwcGluZywgd2VubiBkZXIgU3BpZWxlciBrZWluZSBNUXMgbWVocgorICAgIG9mZmVuIGhhdC4KKworICAgIERpZSBMaXN0ZSBlbnRoYWVsdCBkaWUgTWluaXF1ZXN0bnVtbWVyIGFscyBLZXkuIERpZXNlbSBzaW5kIHp3ZWkgV2VydGUKKyAgICB6dWdlb3JkbmV0OiB6dW0gZWluZW4gZWluIE1pbmlxdWVzdC1BdWZnYWJlbnRleHQsIHVuZCB6dW0gYW5kZXJlbiAtCisgICAgZmFsbHMgZGVyIFNwaWVsZXIgZWluZSBkZXIgVm9yYmVkaW5ndW5nZW4gZnVlciBkaWUgTWluaXF1ZXN0IG5pY2h0CisgICAgZXJmdWVsbHQgLSBlaW4gSGlud2Vpc3RleHQsIGRlciBBdXNrdW5mdCBnaWJ0LCB3ZWxjaGUgQmVkaW5ndW5nIG5vY2gKKyAgICB6dSBlcmZ1ZWxsZW4gaXN0ICgiU2VoZXJzdGF0dXMgZmVobHQiKS4gRGllc2UgSGlud2Vpc3RleHRlIGVudHNwcmVjaGVuCisgICAgZGVuZW4gYXVzIGNoZWNrX3Jlc3RyaWN0aW9ucygpIGluIC9zdGQvcmVzdHJpY3Rpb25fY2hlY2tlci5jLiBEZXIgCisgICAgamV3ZWlscyBhbmRlcmUgVGV4dCB3aXJkIGF1ZiAwIGdlc2V0enQuCisKKyAgICBEaWUgU3RydWt0dXIgZGVzIE1hcHBpbmdzIGlzdCBkYWhlciBmb2xnZW5kZToKKyAgICAgIChbIE1RLU51bW1lciA6IDxBdWZnYWJlbnN0ZWxsdW5nPiA7IDxIaW5kZXJ1bmdzZ3J1bmQ+IF0pCisgICAgCisgICAgQmVpc3BpZWw6IGVpbiBTcGllbGVyIGhhdCBkaWUgTWluaXF1ZXN0cyAxOCB1bmQgNDkgbm9jaCBuaWNodCBnZWxvZXN0LAorICAgIGVyZnVlbGx0IGFiZXIgbnVyIGZ1ZXIgTWluaXF1ZXN0IDQ5IGRpZSBBbmZvcmRlcnVuZ2VuLiBNaW5pcXVlc3QgMTgKKyAgICBlcmZvcmRlcnQgZGVuIFNlaGVyc3RhdHVzLiBEYW5uIHNhZWhlIGRhcyBNYXBwaW5nIHNvIGF1czoKKyAgICAgIChbIDE4IDogMCAgICAgICAgICAgICAgICAgICAgOyAiRGF6dSBtdXNzdCBEdSBlcnN0IFNlaGVyIHdlcmRlbi5cbiIsCisgICAgICAgICA0OSA6ICJBdWZnYWJlbnRleHRfenVfNDkiIDsgMCBdKQorCisgICAgSmVkZXMgYWJmcmFnZW5kZSBPYmpla3QgbXVzcyBkYWhlciBkaWVzZXMgTWFwcGluZyB6dW5hZWNodCBnZWVpZ25ldAorICAgIGF1ZiBzZWluZW4gSW5oYWx0IHBydWVmZW4sIHVtIHp1IGVybWl0dGVsbiwgd2VsY2hlIE1lbGR1bmcgamV3ZWlscworICAgIGF1c3p1Z2ViZW4gaXN0LgorCitCRU1FUktVTkdFTjoKKyAgICBEYXMgYWJmcmFnZW5kZSBPYmpla3QgbXVzcyB2b24gZWluZW0gRXJ6bWFnaWVyIG9kZXIgR290dCAoei5CLiBkZW0KKyAgICB6dXN0YWVuZGlnZW4gUXVlc3QtRU0pIGltIFF1ZXN0bWFzdGVyIGFscyB6dWdyaWZmc2JlcmVjaHRpZ3QgYmVpIGRlbi0KKyAgICBqZW5pZ2VuIE1pbmlxdWVzdHMgZWluZ2V0cmFnZW4gc2VpbiwgZnVlciBkaWUgZXMgZGllIGVudHNwcmVjaGVuZGVuCisgICAgTWluaXF1ZXN0LUhpbndlaXNlIGF1c2dlYmVuIGRhcmYuIERpZXNlIEJlcmVjaHRpZ3VuZyBpc3QgbWl0IGRlbSAKKyAgICBRdWVzdC1FTSBhYnp1c3RpbW1lbi4gQW5kZXJlbiBPYmpla3RlbiB3aXJkIGVpbiBsZWVyZXMgTWFwcGluZyB6dXJ1ZWNrLQorICAgIGdlZ2ViZW4uCisKK1NJRUhFIEFVQ0g6CisgICAgQWRkTWluaVF1ZXN0KEwpLCBDaGFuZ2VNaW5pUXVlc3QoTCkKKyAgICBQX1JFU1RSSUNUSU9OUworICAgIGVyem1hZ2llcgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiA2LiBKdW5pIDIwMTQsIEFyYXRob3JuLgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vUXVlcnlPd24gYi9kb2MvbGZ1bi9RdWVyeU93bgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWE1NWY2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vUXVlcnlPd24KQEAgLTAsMCArMSwzMiBAQAorUXVlcnlPd24oKQorCitGVU5LVElPTjoKKyAgICAgdmFyYXJncyBzdHJpbmcgUXVlcnlPd24oaW50IGNhc3VzKQorCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvdGhpbmcvbGFuZ3VhZ2UuYworCitBUkdVTUVOVEU6CisgICAgIGNhc3VzCisgICAgICAgICAgRGVyIEZhbGwgZnVlciBkaWUgQW5yZWRlLgorCitCRVNDSFJFSUJVTkc6CisgICAgIERpZXNlIEZ1bmt0aW9uIGxpZWZlcnQgZGFzIGRlbSBBbmxhc3MgZW50c3ByZWNoZW5kZSBQb3NzZXNzaXYtCisgICAgIHByb25vbWVuIGZ1ZXIgZGVuIFNwaWVsZXIgc2VsYmVyIChEZWluL0RlaW5lKS4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgRWluIFN0cmluZyBtaXQgZGVtIFByb25vbWVuLgorCitCRUlTUElFTEU6CisKKyAgICAgcHJpbnRmKCIlcyAlcyBsb2VzdCBzaWNoIGF1Zi5cbiIsCisgICAgICAgICAgIGNhcGl0YWxpemUob2JqLT5RdWVyeU93bihXRVIpKSxvYmotPm5hbWUoV0VSKSk7CisKKyAgICAgKEluIGRlbiBtZWlzdGVuIEZhZWxsZW4ga2FubiBtYW4gaGllciBhdWNoIGRpcmVrdCAiRGVpbiIgb2RlciAiRGVpbmUiCisgICAgICBlaW5zZXR6ZW4uKQorCitTSUVIRSBBVUNIOgorICAgICAvc3RkL3RoaW5nL2xhbmd1YWdlLmMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogU3VuIEF1ZyAxMCAyMzo1NToyNyAyMDAzIGJ5IE1hbmRyYWdvbgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vUXVlcnlQYXNzZW5nZXJzIGIvZG9jL2xmdW4vUXVlcnlQYXNzZW5nZXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MWFmNjcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9RdWVyeVBhc3NlbmdlcnMKQEAgLTAsMCArMSwyOSBAQAorUXVlcnlQYXNzZW5nZXJzKCkKKworRlVOS1RJT046CisgICAgIG9iamVjdCAqUXVlcnlQYXNzZW5nZXJzKCk7CisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC90cmFuc3BvcnQuYworCitBUkdVTUVOVEU6CisgICAgIGtlaW5lCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGllc2UgRnVua3Rpb24gZXJtaXR0ZWx0IGRpZSBtb21lbnRhbiBhdWYgZGVtIFRyYW5zcG9ydGVyIGJlZmluZGxpY2hlbgorICAgICBQYXNzYWdpZXJlLgorCitSVWVDS0dBQkVXRVJUOgorICAgICBBcnJheSB2b24gT2JqZWt0ZW4gbWl0IGRlbiBQYXNzYWdpZXJlbi4KKworQkVNRVJLVU5HRU46CisgICAgIEVzIHdlcmRlbiBudXIgZGllIFBhc3NhZ2llcmUgenVydWVja2dlZ2ViZW4sIGRpZSBzaWNoIGluIGRlbQorICAgICBlaWdlbnRsaWNoZW4gVHJhbnNwb3J0ZXJvYmpla3QgYmVmaW5kZW4hIFdlbm4gZGVyIFRyYW5zcG9ydGVyIG5vY2ggdW0KKyAgICAgenVzYWV0emxpY2hlIFJhZXVtZSB2ZXJncm9lc3NlcnQgd2lyZCwgd2VyZGVuIHVudGVyIFVtc3RhZW5kZW4gbmljaHQKKyAgICAgYWxsZSBQYXNzYWdpZXJlIGVyZmFzc3QhCisKK1NJRUhFIEFVQ0g6CisgICAgIC9zdGQvdHJhbnNwb3J0LmMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogV2VkIE1heSA4IDEwOjIyOjQ4IDE5OTYgYnkgV2FyZ29uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9RdWVyeVBvc2l0aW9uIGIvZG9jL2xmdW4vUXVlcnlQb3NpdGlvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDUxNzlkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vUXVlcnlQb3NpdGlvbgpAQCAtMCwwICsxLDI5IEBACitRdWVyeVBvc2l0aW9uKCkKKworRlVOS1RJT046CisgICAgIHN0cmluZyAqUXVlcnlQb3NpdGlvbigpOworCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvdHJhbnNwb3J0LmMKKworQVJHVU1FTlRFOgorICAgICBrZWluZQorCitCRVNDSFJFSUJVTkc6CisgICAgIEVzIHdpcmQgZWluIEFycmF5IHZvbiB6d2VpIFN0cmluZ3MgbWl0IEtlbm56ZWljaG5lcm4gZGVyIGxldHp0ZW4gKG9kZXIKKyAgICAgYWt0dWVsbGVuKSB1bmQgZGVyIG5hZWNoc3RlbiBTdGF0aW9uIGltIEZhaHJwbGFuIHp1cnVlY2tnZWdlYmVuLgorCisgICAgIERpZSBLZW5uemVpY2huZXIgc2luZCBkYWJlaSBkaWUgZXJzdGVuIEFyZ3VtZW50ZSBkZXIgZW50c3ByZWNoZW5kZW4KKyAgICAgQWRkWFhYKCktQXVmcnVmZW4sIGFsc28gZGVyIE5hbWUgZGVyIEhhbHRlc3RlbGxlIGJlaSBBZGRSb3V0ZSwgZGVyIFRleHQKKyAgICAgZGVyIE1lbGR1bmcgYmVpIEFkZE1zZygpIHVuZCBkZXIgTmFtZSBkZXIgRnVua3Rpb24gYmVpIEFkZEZ1bigpLgorCitSVWVDS0dBQkVXRVJUOgorICAgICBBcnJheSBtaXQgendlaSBTdHJpbmdzLiBEZXIgZXJzdGUgU3RyaW5nIGdpYnQgZGVuIEtlbm56ZWljaG5lciBkZXIKKyAgICAgbW9tZW50YW5lbiBGYWhycGxhbnN0YXRpb24gYW4sIGRlciB6d2VpdGUgU3RyaW5nIGRlbiBLZW5uemVpY2huZXIgZGVyCisgICAgIG5hZWNoc3RlbiBGYWhycGxhbnN0YXRpb24uCisKK1NJRUhFIEFVQ0g6CisgICAgIEFkZFJvdXRlKCksIEFkZE1zZygpLCBBZGRGdW4oKSwgL3N0ZC90cmFuc3BvcnQuYworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBXZWQgTWF5IDggMTA6MjI6NTIgMTk5NiBieSBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1F1ZXJ5UG9zc1Byb25vdW4gYi9kb2MvbGZ1bi9RdWVyeVBvc3NQcm9ub3VuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZjQxMDYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9RdWVyeVBvc3NQcm9ub3VuCkBAIC0wLDAgKzEsNDggQEAKK1F1ZXJ5UG9zc1Byb25vdW4oKQorCitGVU5LVElPTjoKKyAgICAgdmFyYXJncyBzdHJpbmcgUXVlcnlQb3NzUHJvbm91bihtaXhlZCB3aGF0LCBpbnQgY2FzdXMsIGludCBhbnphaGwpOworCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvdGhpbmcvbGFuZ3VhZ2UuYworCitBUkdVTUVOVEU6CisgICAgIHdoYXQKKyAgICAgICAgICBHZXNjaGxlY2h0IGRlcyBPYmpla3RlcywgZGFzIGJlc2Vzc2VuIHdpcmQsIG9kZXIgZGFzIE9iamVrdAorICAgICAgICAgIHNlbGJzdC4KKworICAgICBjYXN1cworICAgICAgICAgIERlciBGYWxsLCBpbiBkZW0gZGFzIE9iamVrdCBiZXNlc3NlbiB3aXJkLgorCisgICAgIGFuemFobAorICAgICAgICAgIEhhbmRlbHQgZXMgc2ljaCB1bSBudXIgZWluIE9iamVrdCBvZGVyIHVtIG1laHJlcmU/CisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGllc2UgRnVua3Rpb24gZ2lidCBlaW4gUG9zc2Vzc2l2cHJvbm9tZW4genVydWVjaywgZGFzIGRhcworICAgICBCZXNpdHp2ZXJoYWVsdG5pcyBlaW5lcyBPYmpla3RlcyB6dSBkaWVzZW0gT2JqZWt0IGFuemVpZ3QuCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIERhcyBQb3NzZXNzaXZwcm9ub21lbiBpbSBlbnRzcHJlY2hlbmRlbiBGYWxsLgorCitCRU1FUktVTkdFTjoKKyAgICAgd2hhdCB1bmQgY2FzdXMgYmV6aWVoZW4gc2ljaCBhdWYgZGFzIE9iamVrdCwgd2VsY2hlcyBiZXNlc3NlbiB3aXJkLCB1bmQKKyAgICAgbmljaHQgYXVmIGRlbiBCZXNpdHplciEhIQorCitCRUlTUElFTEU6CisgICAgIFVtIGVpbmUga29ycmVrdGUgQXVzZ2FiZSBiZWltIEhhZW5kZWtsYXRzY2hlbiB6dSBlcnJlaWNoZW4sIGtvZW5udGUgbWFuCisgICAgIHpCLiBmb2xnZW5kZSBaZWlsZSB2ZXJ3ZW5kZW46CisKKyAgICAgIHByaW50ZigiJXMga2xhdHNjaHQgaW4gJXMgSGFlbmRlLlxuIix0aGlzX3BsYXllcigpLT5uYW1lKFdFUiksCisgICAgICAgICAgIHRoaXNfcGxheWVyKCktPlF1ZXJ5UG9zc1Byb25vdW4oRkVNQUxFLCBXRU4sIFBMVVJBTCkpOworCisgICAgIEZFTUFMRSwgZGEgImRpZSBIYW5kIiB3ZWlibGljaCBpc3QsIFdFTiwgZGEgbWFuIGltIEFra3VzYXRpdiBrbGF0c2NodCwKKyAgICAgdW5kIFBMVVJBTCwgZGEgbWFuIGRhenUgYmVpZGUgSGFlbmRlIGJyYXVjaHQuCisKKyAgICAgRWluIGJlbGllYnRlciBGZWhsZXIgaXN0IGVzLCBhbHMgRmFsbCBXRVNTRU4genUgdmVyd2VuZGVuIChpbiBXRVNTRU4KKyAgICAgSGFlbmRlIGtsYXRzY2h0IG1hbj8gPT4gaW4gc2VpbmUpLgorICAgICBEaWUgcmljaHRpZ2UgRnJhZ2Ugd2FlcmUgYWJlcjogV0VOIGtsYXRzY2h0IG1hbj8gKGluIGRpZSBIYWVuZGUpCisKK1NJRUhFIEFVQ0g6CisgICAgIFF1ZXJ5T3duKCksIFF1ZXJ5UHJvbm91bigpLCAvc3RkL3RoaW5nL2xhbmd1YWdlLmMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFdlZCBKYW4gMTEgMTM6MTM6MzUgQ0VUIDIwMDYgYnkgUnVtYXRhCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9RdWVyeVByYXlSb29tIGIvZG9jL2xmdW4vUXVlcnlQcmF5Um9vbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTA5N2QzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vUXVlcnlQcmF5Um9vbQpAQCAtMCwwICsxLDMzIEBACitRdWVyeVByYXlSb29tKCkKKworRlVOS1RJT046CisgICAgIHB1YmxpYyBzdHJpbmcgUXVlcnlQcmF5Um9vbSgpCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC9wbGF5ZXIvYmFzZS5jCisKK0FSR1VNRU5URToKKyAgICAga2VpbmUKKworQkVTQ0hSRUlCVU5HOgorICAgIERpZXMgaXN0IGRlciBSYXVtLCBpbiBkZW4gZGVyIFNwaWVsZXIgbmFjaCBkZW0gRW5kZSBkZXIgVG9kZXNzZXF1ZW56CisgICAgYmV3ZWd0IHdpcmQsIGQuaC4gZWluIFJhdW0sIHdvIGVyIGJldGVuIGthbm4sIHVtIGVpbmVuIG5ldWVuIEtvZXJwZXIgenUKKyAgICBlcmhhbHRlbi4KKyAgICBEZXIgUmF1bSB3aXJkIGFscyBTdHJpbmcgYW5nZWdlYmVuIChrZWluIE9iamVrdCkuCisKKyAgICBKZWRlIFJhc3NlIGhhdCBlaW5lbiBEZWZhdWx0IGZ1ZXIgZGllc2UgRnVua3Rpb24sIHdlbGNoZXIgbWl0CisgICAgU2V0RGVmYXVsdFByYXlSb29tKCkgZ2VzZXR6dCB3aXJkLiBEaWVzZXIgRGVmYXVsdCBrYW5uIG1pdCBkZXIgUHJvcGVydHkKKyAgICBQX1BSQVlfUk9PTSB1ZWJlcmxhZ2VydCB3ZXJkZW4uIFdpcmQgZGllIFByb3BlcnR5IGF1ZiAwIGRnZXNldHp0LCB3aXJkCisgICAgZGllc2VyIERlZmF1bHQgYWt0aXYuCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgRGVyIE9iamVrdG5hbWUgZGVzIEJldHJhdW1zIChzdHJpbmcpCisKKworU0lFSEUgQVVDSDoKKyAgICAgUF9QUkFZX1JPT00KKyAgICAgU2V0RGVmYXVsdFByYXlSb29tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzIxLjA1LjIwMTMsIFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vUXVlcnlQcmVmZXJlZEVuZW15IGIvZG9jL2xmdW4vUXVlcnlQcmVmZXJlZEVuZW15Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2N2QyN2QKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9RdWVyeVByZWZlcmVkRW5lbXkKQEAgLTAsMCArMSwzNSBAQAorRlVOS1RJT046CisJb2JqZWN0IFF1ZXJ5UHJlZmVyZWRFbmVteSgpOworCitERUZJTklFUlQgSU46CisJL3N0ZC9saXZpbmcvY29tYmF0LmMKKworQVJHVU1FTlRFOgorCWtlaW5lCisKK1JVZUNLR0FCRVdFUlQ6CisJYmV2b3J6dWd0ZXIgR2VnbmVyCisKK0JFU0NIUkVJQlVORzoKKwlEaWVzZSBGdW5rdGlvbiBsaWVmZXJ0IHVudGVyIGZvbGdlbmRlbiBCZWRpbmd1bmdlbiB6dWZhZWxsaWcgZWluZXMKKwlkZXIgTGViZXdlc2VuIGFscyBiZXZvcnp1Z3RlbiBHZWduZXIgenVydWVjaywgd2VsY2hlIGluIGRlcgorCVByb3BlcnR5IFBfUFJFRkVSRURfRU5FTVkgaW4gZWluZW0gQXJyYXkgZWluZ2V0cmFnZW4gc2luZDoKKwkgICgxKSBEZXIgZXJzdGUgRWludHJhZyBkZXMgZXJ3YWVobnRlbiBQcm9wZXJ0eWFycmF5cyBlbnRoYWVsdAorCSAgICAgIGVpbmVuIFdlcnQgendpc2NoZW4gMCB1bmQgMTAwLCBkZXIgZGllIFdhaHJzY2hlaW5saWNoa2VpdAorCSAgICAgIGRhZnVlciBhbmdpYnQsIGRhc3MgZWluIExlYmV3ZXNlbiBhbHMgR2VnbmVyIGJldm9yenVndCB3ZXJkZW4KKwkgICAgICBzb2xsLiBFcyB3aXJkIGFsc28gbmljaHQgaW1tZXIgYmV2b3J6dWd0LCB3ZW5uIGRvcnQgZWluIFdlcnQKKwkgICAgICBrbGVpbmVyIDEwMCBzdGVodCEgSW4gZGllc2VtIEZhbGwgd2lyZCBlaW5lIDAgenVydWVja2dlZ2ViZW4uCisJICAoMikgRGFzIHBlciBadWZhbGwgYXVzIGRlbiBBcnJheWVsZW1lbnRlbiBhYiBFbGVtZW50IDIgZ2V3YWVobHRlCisJICAgICAgTGViZXdlc2VuIG11c3MgYXVjaCB3aXJrbGljaCBleGlzdGllcmVuLiBJc3QgZGllcyBuaWNodCBkZXIKKwkgICAgICBGYWxsLCB3aXJkIGRhcyBudW5tZWhyIGxlZXJlIEVsZW1lbnQgYXVzIGRlbSBBcnJheSBlbnRmZXJudAorCSAgICAgIHVuZCBlaW5lIDAgenVydWVja2dlbGllZmVydC4KKwkgICgzKSBEYXMgTGViZXdlc2VuIG11c3MgZGVyemVpdCBhdWNoIHdpcmtsaWNoIEZlaW5kIHNlaW4hIElzdCBkaWVzCisJICAgICAgbmljaHQgZGVyIEZhbGwsIHdpcmQgZWluZSAwIHp1cnVlY2tnZWdlYmVuLgorCVdpbGwgbWFuIGVpbmUgYW5kZXJlIEJldm9yenVndW5nIHZvbiBHZWduZXJuIGVycmVpY2hlbiwKKwl1ZWJlcnNjaHJlaWJ0IG1hbiBhbSBiZXN0ZW4gZGllc2UgRnVua3Rpb24uCisKK1NJRUhFIEFVQ0g6CisJU2VsZWN0RW5lbXkoKSwgSXNFbmVteSgpLCBQX1BSRUZFUkVEX0VORU1ZCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFdlZCBNYXkgMjYgMTY6NDc6NTEgMTk5OSBieSBQYXRyeW4KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1F1ZXJ5UHJvbm91biBiL2RvYy9sZnVuL1F1ZXJ5UHJvbm91bgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDA0MWNiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vUXVlcnlQcm9ub3VuCkBAIC0wLDAgKzEsMzIgQEAKK1F1ZXJ5UHJvbm91bigpCisKK0ZVTktUSU9OOgorICAgICBzdHJpbmcgUXVlcnlQcm9ub3VuKGludCBjYXN1cyk7CisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC90aGluZy9sYW5ndWFnZS5jCisKK0FSR1VNRU5URToKKyAgICAgY2FzdXMKKyAgICAgICAgICBEZXIgRmFsbCwgaW4gZGVtIGRhcyBQZXJzb25hbHByb25vbWVuIHZlcmxhbmd0IHdpcmQuCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRXMgd2lyZCBlaW4gUGVyc29uYWxwcm9ub21lbiAoImVyIiwgInNpZSIsICJlcyIpIGltIGVudHNwcmVjaGVuZGVuIEZhbGwKKyAgICAgZnVlciBkaWVzZXMgT2JqZWt0IGJlcmVjaG5ldC4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgRGFzIFByb25vbWVuIGltIGVudHNwcmVjaGVuZGVuIEZhbGwuCisKK0JFSVNQSUVMRToKKworICAgICBwcmludGYoIkR1IHZlcnN1Y2h0LCAlcyB6dSBuZWhtZW4sIGFiZXIgJXMgaXN0IHp1IHNjaHdlci5cbiIsCisgICAgICAgICAgIG9iLT5uYW1lKFdFTiksIG9iLT5RdWVyeVByb25vdW4oV0VSKSk7CisKKyAgICAgSGllciB3aXJkIGltbWVyIGRhcyByaWNodGlnZSBQcm9ub21lbiB2ZXJ3ZW5kZXQsIGVnYWwsIHdlbGNoZXMKKyAgICAgR2VzY2hsZWNodCBkYXMgT2JqZWt0IG9iIGhhdC4KKworU0lFSEUgQVVDSDoKKyAgICAgU3VnZ2VzdEFydGljbGUoKSwgUXVlcnlQb3NzUHJvbm91bigpLCAvc3RkL3RoaW5nL2xhbmd1YWdlLmMKKyAgICAgUXVlcnlPd24oKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogV2VkIE1heSA4IDEwOjIzOjE0IDE5OTYgYnkgV2FyZ29uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9RdWVyeVByb3AgYi9kb2MvbGZ1bi9RdWVyeVByb3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU3NTJlMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL1F1ZXJ5UHJvcApAQCAtMCwwICsxLDM5IEBACitRdWVyeVByb3AoKQorRlVOS1RJT046CisgICAgIG1peGVkIFF1ZXJ5UHJvcChzdHJpbmcgbmFtZSk7CisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC90aGluZy9wcm9wZXJ0aWVzLmMKKworQVJHVU1FTlRFOgorICAgICBzdHJpbmcgbmFtZQktIGFienVmcmFnZW5kZSBQcm9wZXJ0eQorCitCRVNDSFJFSUJVTkc6CisgICAgIERlciBEYXRlbndlcnQgZGVyIFByb3BlcnR5ICduYW1lJyB3aXJkIHp1cnVlY2tnZWdlYmVuLgorCisgICAgIEV4aXN0aWVydCBlaW5lIEZfUVVFUllfTUVUSE9EIG9kZXIgZWluZSBfcXVlcnlfJ25hbWUnKCktTWV0aG9kZSBmdWVyCisgICAgIGRpZXNlIFByb3BlcnR5LCBzbyB3aXJkIGRpZXNlIGF1ZmdlcnVmZW4gdW5kIGlociAnVmFsdWUnIHVlYmVyZ2ViZW4uCisgICAgIEVpbmUgRl9RVUVSWV9NRVRIT0QgaGF0IGRhYmVpIFZvcnJhbmcgdm9yIF9xdWVyeV8nbmFtZScoKSwgZC5oLgorICAgICBfcXVlcnlfJ25hbWUnKCkgd2lyZCBuYWNoIGVyZm9sZ3JlaWNoZXIgRl9RVUVSWV9NRVRIT0QgbmljaHQgbWVocgorICAgICBnZXJ1ZmVuLgorCisgICAgIChEaWVzZSBNZXRob2RlbiBudXR6ZW4gZGFubiBTZXQoKSwgdW0gYXVmIGRlbiBEYXRlbndlcnQgZGVyIFByb3BlcnR5CisgICAgICAnbmFtZScgenVydWVja3p1Z3JlaWZlbi4gVGVpbHdlaXNlIHdlcmRlbiBhYmVyIGF1Y2ggaW50ZXJuZSBWYXJpYWJsZW4KKyAgICAgIHNvIG9lZmZlbnRsaWNoIGdlbWFjaHQgdW5kIHNpbmQgbmljaHQgaW4gZGVyIHVlYmVyIFNldC9RdWVyeQorICAgICAgdmVyZnVlZ2JhcmVuIFByb3BlcnR5ICduYW1lJyBhYmdlbGVndC4pCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIERlciBEYXRlbndlcnQgZGVyIFByb3BlcnR5LgorICAgICAwLCBmYWxscyBkaWVzZSBuaWNodCBleGlzdGllcnQuCisKK0JFSVNQSUVMRToKKyAgICAgLy8gd2llIGhvY2ggc2luZCBkaWUgYWt0dWVsbGUgTFAgZGVzIFNwaWVsZXJzPworICAgICBocCA9IHRoaXNfcGxheWVyKCktPlF1ZXJ5UHJvcChQX0hQKTsKKworU0lFSEUgQVVDSDoKKyAgICAgQWVobmxpY2hlczoJU2V0UHJvcChMKSwgU2V0KEwpLCBRdWVyeShMKQorICAgICBHZW5lcmVsbDoJCVNldFByb3BlcnRpZXMoTCksIFF1ZXJ5UHJvcGVydGllcyhMKQorICAgICBLb256ZXB0OgkJcHJvcGVydGllcywgL3N0ZC90aGluZy9wcm9wZXJ0aWVzLmMKKyAgICAgU29uc3RpZ2VzOgkJUF9BVVRPTE9BRE9CSgorCisxNS5EZXogMjAwNCBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vUXVlcnlQcm9wZXJ0aWVzIGIvZG9jL2xmdW4vUXVlcnlQcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNzQwYjUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9RdWVyeVByb3BlcnRpZXMKQEAgLTAsMCArMSwzMCBAQAorUXVlcnlQcm9wZXJ0aWVzKCkKK0ZVTktUSU9OOgorICAgICBtYXBwaW5nIFF1ZXJ5UHJvcGVydGllcygpCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC90aGluZy9wcm9wZXJ0aWVzLmMKKworQVJHVU1FTlRFOgorICAgICBrZWluZQorCitCRVNDSFJFSUJVTkc6CisgICAgIERpZXNlIEZ1bmt0aW9uIGxpZWZlcnQgZWluIE1hcHBpbmcgbWl0IGFsbGVuIGZ1ZXIgZGFzIE9iamVrdAorICAgICBkZWZpbmllcnRlbiBQcm9wZXJ0aWVzIHp1cnVlY2suCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIEVpbiBNYXBwaW5nIG1pdCBkZW4gUHJvcGVydGllcy4gRGFzIE1hcHBpbmcgaGF0IGZvbGdlbmRlbiBBdWZiYXU6CisJKFsgbmFtZTogd2VydDsgZmxhZ3M7IHNldF9tZXRob2Q7IHF1ZXJ5X21ldGhvZCwKKwkgICBuYW1lMjogLi4uIF0pOworCitCRU1FUktVTkdFTjoKKyAgICAgLSBkaWVzZSBGdW5rdGlvbiB3aXJkIHZvbiByZXN0b3JlX29iamVjdCgpIHVuZCBzYXZlX29iamVjdCgpCisgICAgIC0gRl9RVUVSWV9NRVRIT0RzIHVuZCBfcXVlcnlfJ3Byb3AnKCktTWV0aG9kZW4gaGFiZW4ga2VpbmUgQXVzd2lya3VuZworICAgICAgIGF1ZiBkaWUgV2VydGVmZWxkZXIhCisKK1NJRUhFIEFVQ0g6CisgICAgIEFlaG5saWNoZXM6CVNldFByb3AoTCksIFF1ZXJ5UHJvcChMKSwgU2V0KEwpLCBRdWVyeShMKQorICAgICBHZW5lcmVsbDoJCVNldFByb3BlcnRpZXMoTCkgCisgICAgIEtvbnplcHQ6CQlwcm9wZXJ0aWVzLCAvc3RkL3RoaW5nL3Byb3BlcnRpZXMuYworCisxLk1haSAyMDA0IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9RdWVyeVF1ZXN0IGIvZG9jL2xmdW4vUXVlcnlRdWVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTVhZDE2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vUXVlcnlRdWVzdApAQCAtMCwwICsxLDM0IEBACitRdWVyeVF1ZXN0KCkKKworRlVOS1RJT046CisgICAgICAgIGludCBRdWVyeVF1ZXN0KHN0cmluZyBxdWVzdG5hbWUpCisKK0RFRklOSUVSVCBJTjoKKyAgICAgICAgL3N0ZC9wbGF5ZXIvcXVlc3RzLmMKKworQVJHVU1FTlRFOgorICAgICAgICBxdWVzdG5hbWUKKyAgICAgICAgICBRdWVzdG5hbWUsIHdpZSBlciBpbSBRdWVzdG1hc3RlciBlaW5nZXRyYWdlbiB3dXJkZS4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgICAgKERpZSBEZWZpbmVzIGZ1ZXIgZGVuIFJ1ZWNrZ2FiZXdlcnQgZmluZGVuIHNpY2ggaW4gCisgICAgICAgICAvc2VjdXJlL3F1ZXN0bWFzdGVyLmgpCisgICAgICAgICAxIDogU3BpZWxlciBoYXQgZGllIFF1ZXN0IGJlcmVpdHMgZ2Vsb2VzdCAgKE9LKQorICAgICAgICAgMCA6IFVuZ3VlbHRpZ2VyIFF1ZXN0bmFtZSBvZGVyIGRlciBTcGllbGVyCisgICAgICAgICAgICAgaGF0IGRpZSBRdWVzdCBub2NoIG5pY2h0LiAgICAgICAgICAgICAgKFFRX0tFWV9JTlZBTElEKQorICAgICAgICAgMiA6IEdhZXN0ZSBrb2VubmVuIGtlaW5lIFF1ZXN0IGxvZXNlbiAgICAgIChRUV9RVUVTVCkKKworQkVTQ0hSRUlCVU5HOgorCU1pdCBkaWVzZXIgRnVua3Rpb24ga2FubiBnZXRlc3RldCB3ZXJkZW4sIG9iIGVpbiBTcGllbGVyIGVpbmUgCisgICAgICAgIGJlc3RpbW10ZSBRdWVzdCBiZXJlaXRzIGdlbG9lc3QgaGF0LiBBbHMgUXVlc3RuYW1lIHdpcmQgZGF6dQorICAgICAgICBkZXIgTmFtZSBhbmdlZ2ViZW4sIGRlciBpbSBRdWVzdG1hc3RlciBlaW5nZXRyYWdlbiB3dXJkZS4KKworICAgICAgICBXZXIgc2ljaCBkYSBuaWNodCBzaWNoZXIgaXN0LCBrYW5uIG1pdCBkZW0gUXVlc3R0b29sIAorICAgICAgICAoL29iai90b29scy9xdWVzdHRvb2wpIG5hY2hzZWhlbi4gCisKK1NJRUhFIEFVQ0g6CisgICAgICAgIC9zZWN1cmUvcXVlc3RtYXN0ZXIuaCwgL29iai90b29scy9xdWVzdHRvb2wKKyAgICAgICAgR2l2ZVF1ZXN0CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1p1bGV0enQgZ2VhZW5kZXJ0OiBNb24sIDE3LiBKdWwgMjAwMCwgMTI6MTY6NDEgdm9uIFpvb2suCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9RdWVyeVF1ZXN0VGltZSBiL2RvYy9sZnVuL1F1ZXJ5UXVlc3RUaW1lCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MTBkNmEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9RdWVyeVF1ZXN0VGltZQpAQCAtMCwwICsxLDI5IEBACitRdWVyeVF1ZXN0VGltZSgpCisKK0ZVTktUSU9OOgorICAgICAgICBpbnQgUXVlcnlRdWVzdFRpbWUoc3RyaW5nIHF1ZXN0bmFtZSkKKworREVGSU5JRVJUIElOOgorICAgICAgICAvc3RkL3BsYXllci9xdWVzdHMuYworCitBUkdVTUVOVEU6CisgICAgICAgIHF1ZXN0bmFtZQorICAgICAgICAgIFF1ZXN0bmFtZSwgd2llIGVyIGltIFF1ZXN0bWFzdGVyIGVpbmdldHJhZ2VuIHd1cmRlLgorCitSVWVDS0dBQkVXRVJUOgorICAgICAgICBRdWVzdHplaXRwdW5rdCBpbiBTZWt1bmRlbiBzZWl0IEVwb2NoIGFscyBwb3NpdGl2ZXIgSW50ZWdlci1XZXJ0CisgICAgICAgICAwIDogVGFnZWJ1Y2htYXN0ZXIgaGF0IGtlaW5lIERhdGVuIGluIGRlbiBMb2dmaWxlcyBnZWZ1bmRlbiB1bmQKKyAgICAgICAgICAgICBtYWNodCBkYXMgYXVmIGRpZXNlIFdlaXNlIGtlbm50bGljaAorICAgICAgICAtMSA6IFF1ZXN0emVpdHB1bmt0IHVuYmVrYW5udAorCitCRVNDSFJFSUJVTkc6CisgICAgICAgIE1pdCBkaWVzZXIgRnVua3Rpb24ga2FubiBkZXIgWmVpdHB1bmt0IGFiZ2VmcmFndCB3ZXJkZW4sIHp1CisgICAgICAgIGRlbSBlaW4gU3BpZWxlciBlaW5lIGJlc3RpbW10ZSBRdWVzdCBnZWxvZXN0IGhhdC4gCisgICAgICAgIEFscyBRdWVzdG5hbWUgd2lyZCBkYXp1IGRlciBOYW1lIGFuZ2VnZWJlbiwgZGVyIGltIFF1ZXN0bWFzdGVyIAorICAgICAgICBlaW5nZXRyYWdlbiBpc3QuCisKK1NJRUhFIEFVQ0g6CisgICAgICAgIEdpdmVRdWVzdChMKSwgUXVlcnlRdWVzdChMKSwgTW9kaWZ5UXVlc3RUaW1lKEwpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1p1bGV0enQgZ2VhZW5kZXJ0OiAxOS4gRGV6LiAyMDE1LCBBcmF0aG9ybgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vUXVlcnlSZWFsQXR0cmlidXRlIGIvZG9jL2xmdW4vUXVlcnlSZWFsQXR0cmlidXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZTlmODMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9RdWVyeVJlYWxBdHRyaWJ1dGUKQEAgLTAsMCArMSwyNiBAQAorUXVlcnlSZWFsQXR0cmlidXRlKCkKK0ZVTktUSU9OOgorICAgICBpbnQgUXVlcnlSZWFsQXR0cmlidXRlKHN0cmluZyBhdHRyKQorCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvbGl2aW5nL2F0dHJpYnV0ZXMuYworCitBUkdVTUVOVEU6CisgICAgIGF0dHIgICAgICAgLSAgICAgICBkYXMgaW50ZXJlc3NpZXJlbmRlIEF0dHJpYnV0CisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGFzIHJlYWxlIEF0dHJpYnV0IChvaG5lIE9mZnNldHMpIHdpcmQgenVydWVja2dlZ2ViZW4uCisKK0JFSVNQSUVMRToKKyAgICAgaWYodGhpc19wbGF5ZXIoKS0+UXVlcnlSZWFsQXR0cmlidXRlKEFfSU5UKT4xNSkKKyAgICAgIHdyaXRlKCJEdSBiaXN0IGF1Y2ggc28gZ2FueiBzY2hvZW4gY2xldmVyLlxuIik7CisKK1NJRUhFIEFVQ0g6DQorCVF1ZXJ5QXR0cmlidXRlKCksIFF1ZXJ5UmVhbEF0dHJpYnV0ZSgpLCBRdWVyeUF0dHJpYnV0ZU9mZnNldCgpLA0KKwlTZXRBdHRyaWJ1dGUoKSwgU2V0UmVhbEF0dHJpYnV0ZSgpLCBVcGRhdGVBdHRyaWJ1dGVzKCksDQorCVNldFRpbWVkQXR0ck1vZGlmaWVyKCksIFF1ZXJ5VGltZWRBdHRyTW9kaWZpZXIoKSwgDQorCURlbGV0ZVRpbWVkQXR0ck1vZGlmaWVyKCksDQorCVBfQVRUUklCVVRFUywgUF9BVFRSSUJVVEVTX09GRlNFVFMsIFBfVElNRURfQVRUUl9NT0QsDQorCVBfWF9BVFRSX01PRCwgUF9NX0FUVFJfTU9ELCAvc3RkL2xpdmluZy9hdHRyaWJ1dGVzLmMNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorTGFzdCBtb2RpZmllZDogVHVlIEp1bCAyNyAyMDowMDoyMCAyMDA0IGJ5IE11YWRpYg0KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1F1ZXJ5U2VsbFZhbHVlIGIvZG9jL2xmdW4vUXVlcnlTZWxsVmFsdWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ0Y2IyOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL1F1ZXJ5U2VsbFZhbHVlCkBAIC0wLDAgKzEsNDMgQEAKK0ZVTktUSU9OOgorCisgICAgICB2YXJhcmdzIGludCBRdWVyeVNlbGxWYWx1ZShvYmplY3Qgb2IsIG9iamVjdCBjbGllbnQpOworCitERUZJTklFUlQgSU46CisKKyAgICAgIC9zdGQvdHJhZGluZ19wcmljZS5jCisKK0JFU0NIUkVJQlVORzoKKworICAgICAgRGllc2UgRnVua3Rpb24ga2FubiBkYXp1IGdlbnV0enQgd2VyZGVuLCBkZW4gVmVya2F1ZnNwcmVpcyBpbiBlaW5lbSAKKyAgICAgIExhZGVuIGdsb2JhbCB6dSB2ZXJhZW5kZXJuLiBTb2Zlcm4gZGllcyB6dWd1bnN0ZW4gZGVyIFNwaWVsZXIgZ2VzY2hpZWh0LAorICAgICAgbXVzcyBkYWZ1ZXIgZGllIFp1c3RpbW11bmcgZGVzIHp1c3RhZW5kaWdlbiBSZWdpb25zbWFnaWVycyB1bmQgZGVyCisgICAgICBCYWxhbmNlIGVpbmdlaG9sdCB3ZXJkZW4uIFp1ZGVtIHNvbGx0ZSBlcyBuaWNodCBpbiBqZWRlbSB4LWJlbGllYmlnZW4gCisgICAgICBMYWRlbiBnZW51dHp0IHdlcmRlbiwgc29uZGVybiBudXIgaW4gcmVjaHQgYWJnZWxlZ2VuZW4gR2ViaWV0ZW4sIGluCisgICAgICBkaWUgbWFuIG5pY2h0IGVpbmZhY2ggc2tyaXB0ZW4ga2Fubi4KKworICAgICAgRWluIEJlaXNwaWVsIGlzdCBkZXIgTGFkZW4gYXVmIGRlbSBLdXR0ZXIgaW4gUG9ydCBWYWluLCBkZXIgbnVyIGluCisgICAgICBsYWVuZ2VyZW4gSW50ZXJ2YWxsZW4gbWFsIHp1Z2FlbmdsaWNoIGlzdC4KKworQkVJU1BJRUw6CisKKyAgICAgIEVpbiBMYWRlbiB6YWhsdCAxMCUgdWViZXIgZGVtIG5vcm1hbGVuIFZlcmthdWZzcHJlaXM6CisKKyAgICAgIHByaXZhdGUgaW50IHNlbGxfZmFjdG9yID0gMTEwOworCisgICAgICB2YXJhcmdzIGludCBRdWVyeVNlbGxWYWx1ZShvYmplY3Qgb2IsIG9iamVjdCBjbGllbnQpIHsKKyAgICAgICAgLy8gRXMgd2lyZCBuaWNodCBuYWVoZXIgZ2VwcnVlZnQsIG9iIDxvYj4gZWluIGd1ZWx0aWdlciBPYmpla3Rwb2ludGVyCisgICAgICAgIC8vIGlzdCwgZGEgZGVyIExhZGVuIHNlbGJzdCBzaWNoZXJzdGVsbHQsIGRhc3MgZGFzIHNvIGlzdC4gV2VubiAKKyAgICAgICAgLy8gZGFzIGRvY2ggZWlubWFsIG5pY2h0IGRlciBGYWxsIHNlaW4gc29sbHRlLCBsaWVndCBkZXIgRmVobGVyCisgICAgICAgIC8vIHdvYW5kZXJzLiBFaW5lbiBCdWcgYXVzenVsb2VzZW4gaXN0IGRhbm4gc2lubnZvbGwuCisKKyAgICAgICAgLy8gQmFzaXNwcmVpcyBlcm1pdHRlbG4gCisgICAgICAgIGludCBwcmVpcyA9IDo6UXVlcnlTZWxsVmFsdWUob2IsIGNsaWVudCk7CisgICAgICAgIC8vIHVuZCBkZW4gQm9udXMgYXVmc2NobGFnZW4uCisgICAgICAgIHByZWlzID0gKHNlbGxfZmFjdG9yICogcHJlaXMpLzEwMDsgCisKKyAgICAgICAgLy8gTmljaHQgbWVociBhdXN6YWhsZW4sIGFscyBkYXMgT2JqZWt0IGFuIHNpY2ggd2VydCBpc3QuCisgICAgICAgIHJldHVybiBtaW4ocHJlaXMsIG9iLT5RdWVyeVByb3AoUF9WQUxVRSkpOworICAgICAgfQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMRVRaVEUgQUVOREVSVU5HOiAxOC1KdW4tMjAxNSwgQXJhdGhvcm4KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1F1ZXJ5U2tpbGwgYi9kb2MvbGZ1bi9RdWVyeVNraWxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxN2I5ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9RdWVyeVNraWxsCkBAIC0wLDAgKzEsMzUgQEAKK1F1ZXJ5U2tpbGwoKQorRlVOS1RJT046CisgICAgcHVibGljIHZhcmFyZ3MgbWFwcGluZyBRdWVyeVNraWxsKHN0cmluZyBzbmFtZSwgc3RyaW5nIGdpbGRlKQorCitERUZJTklFUlQgSU46CisgICAgL3N0ZC9saXZpbmcvc2tpbGxzLmMKKyAgICAKK0FSR1VNRU5URToKKyAgICBzdHJpbmcgc25hbWUgICAgTmFtZSBkZXMgYWJ6dWZyYWdlbmRlbiBTa2lsbAorICAgIHN0cmluZyBnaWxkZSAgICBOYW1lIGRlciBHaWxkZSwgdW50ZXIgZGVyIGRlciBTa2lsbCBnZXN1Y2h0IHdlcmRlbiBzb2xsCisKK0JFU0NIUkVJQlVORzoKKyAgICBEaWVzZSBGdW5rdGlvbiBsaWVmZXJ0IGRhcyBTa2lsbG1hcHBpbmdzIGRlcyBTa2lsbHMgJ3NubWUnIGltIExlYmV3ZXNlbgorICAgIHp1cnVlY2suIERpZXNlIGVudGhhZWx0IEVpbnRyYWVnZSwgZGllIGluIGRlciBNYW4tUGFnZSBza2lsbF9pbmZvX2xpc3RlCisgICAgYmVzY2hyaWViZW4gc2luZC4KKworICAgIEZhbGxzICdnaWxkZScgbmljaHQgYW5nZWdlYmVuIHdpcmQsIHdpcmQgZGVyIFNraWxsIHp1ZXJzdCBmdWVyIGRpZSBHaWxkZQorICAgIFBfR1VJTEQgZGVzIExlYmV3ZXNlbnMgZ2VzdWNodCwgYW5zb25zdGVuIGluIGRlbiBhbGxnZW1laW5lbiBTa2lsbHMKKyAgICAiQU5ZIiAoZXMgd2lyZCBOSUNIVCBpbiBHaWxkZW5vYmpla3Qgb2RlciBTcGVsbGJvb2sgZXR3YXMgYWJnZWZyYWd0KS4KKworUlVFQ0tHQUJFV0VSVDoKKyAgICBFaW4gTWFwcGluZyBtaXQgU2tpbGxpbmZvcyBvZGVyIDAsIGZhbGxzIGRlciBTa2lsbCBuaWNodCB2b3JoYW5kZW4gaXN0LgorICAgIERhcyBNYXBwaW5nIGlzdCBlaW5lIEtvcGllLgorCitTSUVIRSBBVUNIOgorICAgIFNraWxscyBMZXJuZW46ICBMZWFyblNraWxsLCBNb2RpZnlTa2lsbCwgTGltaXRBYmlsaXR5CisgICAgKiBOdXR6dW5nOiAgICAgIFVzZVNwZWxsLCBVc2VTa2lsbAorICAgICogQWJmcmFnZW46ICAgICBRdWVyeVNraWxsQWJpbGl0eQorICAgICogTW9kaWZpa2F0aW9uOiBNb2RpZnlTa2lsbEF0dHJpYnV0ZSwgUXVlcnlTa2lsbEF0dHJpYnV0ZSwKKyAgICAgICAgICAgICAgICAgICAgUXVlcnlTa2lsbEF0dHJpYnV0ZU1vZGlmaWVyLCBSZW1vdmVTa2lsbEF0dHJpYnV0ZU1vZGlmaWVyCisgICAgICAqIFByb3BlcnRpZXM6IFBfU0tJTExfQVRUUklCVVRFUywgUF9TS0lMTF9BVFRSSUJVVEVfT0ZGU0VUUworICAgICogc29uc3RpZzogICAgICBzcHJ1Y2hlcm11ZWR1bmcsIHNraWxsX2luZm9fbGlzdGUKKyAgICAqIFByb3BlcnRpZXM6ICAgUF9ORVdTS0lMTFMKKworNS4gT2t0IDIwMTEgR2xvaW5zb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9RdWVyeVNraWxsQWJpbGl0eSBiL2RvYy9sZnVuL1F1ZXJ5U2tpbGxBYmlsaXR5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZmQ4MTUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9RdWVyeVNraWxsQWJpbGl0eQpAQCAtMCwwICsxLDI5IEBACitRdWVyeVNraWxsQWJpbGl0eSgpCitGVU5LVElPTjoKKyAgICBwdWJsaWMgdmFyYXJncyBpbnQgUXVlcnlTa2lsbEFiaWxpdHkoc3RyaW5nIHNuYW1lLCBzdHJpbmcgZ2lsZGUpCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3RkL2xpdmluZy9za2lsbHMuYworICAgIAorQVJHVU1FTlRFOgorICAgIHN0cmluZyBzbmFtZSAgICAgICAgTmFtZSBkZXMgYWJ6dWZyYWdlbmRlbiBTa2lsbAorICAgIHN0cmluZyBnaWxkZSAgICAgICAgIEdpbGRlLCB1bnRlciBkZXIgZGVyIFNraWxsIGdlc3VjaHQgd2VyZGVuIHNvbGwKKworQkVTQ0hSRUlCVU5HOgorICAgIERpZXNlIEZ1bmt0aW9uIGxpZWZlcnQgZWluZW4gV2VydCB6dXJ1ZWNrLCBkZXIgYXVzc2FndCwgd2llIGd1dCBkYXMKKyAgICBMZWJld2VzZW4gZGVuIFNraWxsICdzbmFtZScgYmVoZXJyc2NodCAoS2V5IFNJX1NLSUxMQUJJTElUWSBpbQorICAgIFNraWxsbWFwcGluZykuCisgICAgRGllc2VyIFdlcnQga2FubiB6d2lzY2hlbiAtTUFYX0FCSUxJVFkgdW5kIE1BWF9BQklMSVRZIGxpZWdlbiwKKyAgICBub3JtYWwgaXN0IDAgYmlzIE1BWF9BQklMSVRZICgxMDAwMCAtIFNraWxsIHBlcmZla3Rpb25pZXJ0KS4KKworU0lFSEUgQVVDSDoKKyAgICBTa2lsbHMgTGVybmVuOiAgTGVhcm5Ta2lsbCwgTW9kaWZ5U2tpbGwsIExpbWl0QWJpbGl0eQorICAgICogTnV0enVuZzogICAgICBVc2VTcGVsbCwgVXNlU2tpbGwKKyAgICAqIEFiZnJhZ2VuOiAgICAgUXVlcnlTa2lsbAorICAgICogTW9kaWZpa2F0aW9uOiBNb2RpZnlTa2lsbEF0dHJpYnV0ZSwgUXVlcnlTa2lsbEF0dHJpYnV0ZSwKKyAgICAgICAgICAgICAgICAgICAgUXVlcnlTa2lsbEF0dHJpYnV0ZU1vZGlmaWVyLCBSZW1vdmVTa2lsbEF0dHJpYnV0ZU1vZGlmaWVyCisgICAgICAqIFByb3BlcnRpZXM6IFBfU0tJTExfQVRUUklCVVRFUywgUF9TS0lMTF9BVFRSSUJVVEVfT0ZGU0VUUworICAgICogc29uc3RpZzogICAgICBzcHJ1Y2hlcm11ZWR1bmcsIHNraWxsX2luZm9fbGlzdGUKKyAgICAqIFByb3BlcnRpZXM6ICAgUF9ORVdTS0lMTFMKKworNS4gT2t0IDIwMTEgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1F1ZXJ5U2tpbGxBdHRyaWJ1dGUgYi9kb2MvbGZ1bi9RdWVyeVNraWxsQXR0cmlidXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYjFiZDEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9RdWVyeVNraWxsQXR0cmlidXRlCkBAIC0wLDAgKzEsNTggQEAKK1F1ZXJ5U2tpbGxBdHRyaWJ1dGUoKQorRlVOS1RJT046CisgICAgcHVibGljIGludCBRdWVyeVNraWxsQXR0cmlidXRlKHN0cmluZyBhdHJuYW1lKQorCitERUZJTklFUlQgSU46CisgICAgL3N0ZC9saXZpbmcvc2tpbGxfYXR0cmlidXRlcy5jCisgICAgCitBUkdVTUVOVEU6CisgICAgc3RyaW5nIGF0cm5hbWUgICAgICAgICAgICBOYW1lIGRlcyBhYnp1ZnJhZ2VuZGVuIEF0dHJpYnV0cworICAgIAorQkVTQ0hSRUlCVU5HOgorICAgIE1pdCBkaWVzZXIgRnVua3Rpb24ga2FubiBtYW4gZGVuIFdlcnQgYmVzdGltbXRlciBBdHRyaWJ1dGUKKyAgICBhYmZyYWdlbiwgZGFiZWkgd2VyZGVuIGRhcyBhYmdlZnJhZ3RlIEF0dHJpYnV0LCBUb2Rlc2ZvbGdlbiwKKyAgICBTQV9RVUFMSVRZIHVuZCBXZXJ0ZSBpbiBQX1NLSUxMX0FUVFJJQlVURV9PRkZTRVRTCisgICAgYmVydWVja3NpY2h0aWd0LgorICAgIAorICAgIE1vbWVudGFuZSBTa2lsbHMgc2llaGUgTW9kaWZ5U2tpbGxBdHRyaWJ1dGUuCisKK1JVRUNLR0FCRVdFUlQ6CisgICAgRGVyIFdlcnQgZGVzIEF0dHJpYnV0cy4gSXN0IG5pY2h0cyBiZXN0aW1tdGVzIGdlc2V0enQsIHdpcmQKKyAgICBkZXIgU3RhbmRhcmR3ZXJ0IDEwMCB6dXJ1ZWNrZ2VnZWJlbi4KKyAgICBEZXIgUnVlY2tnYWJld2VydCBsaWVndCB6d2lzY2hlbiAxMCBiaXMgMTAwMCAoUHJvemVudCkuCisgICAgCitCRU1FUktVTkc6CisgICAgRGllIEZ1bmt0aW9uIGlzdCB6d2FyIGFscyAndmFyYXJncycgZGVmaW5pZXJ0LCBnaWJ0IG1hbiBhbGxlcmRpbmdzCisgICAga2VpbmVuIEF0dHJpYnV0bmFtZW4gYW4sIHdpcmQgaW1tZXIgMTAwIHp1cnVlY2tnZWdlYmVuLgorICAgIAorQkVJU1BJRUw6CisgICAgLy8gZWluIFNwaWVsZXIga2FubiBlaW4gU3R1ZWNrIEthZXNlIHN0aWJpdHplbiwgd2VubiBlciBzY2huZWxsCisgICAgLy8gZ2VudWcgaXN0IC4uLiAoMTUlIHVlYmVyIG5vcm1hbCkKKyAgICBpZih0aGlzX3BsYXllcigpLT5RdWVyeVNraWxsQXR0cmlidXRlKFNBX1NQRUVEKT49MTE1KSB7CisgICAgICB0ZWxsX29iamVjdCh0aGlzX3BsYXllcigpLAorICAgICAgICAiRHUgc2NobmFwcHN0IGRhcyBTdHVlY2sgS2Flc2UgYXVzIGRlciBGYWxsZS5cbiIpOworICAgICAgb2JqIGthZXNlID0gY2xvbmVfb2JqZWN0KC4uLik7CisgICAgICBbLi4uXQorICAgIH0gZWxzZSB7CisgICAgICBtYXBwaW5nIGFtYXA9bWFwX2luZGljZXMoVkFMSURfQVJNT1VSX0NMQVNTLCMnISk7CisgICAgICBhbWFwW0FUX0dMT1ZFXT0xMDA7CisgICAgICB0ZWxsX29iamVjdCh0aGlzX3BsYXllcigpLAorICAgICAgICAiRHUgYmlzdCB6dSBsYW5nc2FtIHVuZCBkaWUgRmFsbGUgc2NobmFwcHQgaHVuZ3JpZyB6dS5cbiIpOworICAgICAgdGhpc19wbGF5ZXIoKS0+RGVmZW5kKHJhbmRvbSgxMDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHtEVF9QSUVSQ0UsIERUX1NRVUVFWkV9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChbU1BfUEhZU0lDQUxfQVRUQUNLOiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUF9SRURVQ0VfQVJNT1VSOiBhbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUF9TSE9XX0RBTUFHRTogMF0pKTsKKyAgICB9CisKK1NJRUhFIEFVQ0g6CisgICAgU2tpbGxzIExlcm5lbjogIExlYXJuU2tpbGwsIE1vZGlmeVNraWxsLCBMaW1pdEFiaWxpdHkKKyAgICAqIE51dHp1bmc6ICAgICAgVXNlU3BlbGwsIFVzZVNraWxsCisgICAgKiBBYmZyYWdlbjogICAgIFF1ZXJ5U2tpbGwsIFF1ZXJ5U2tpbGxBYmlsaXR5CisgICAgKiBNb2RpZmlrYXRpb246IE1vZGlmeVNraWxsQXR0cmlidXRlLAorICAgICAgICAgICAgICAgICAgICBRdWVyeVNraWxsQXR0cmlidXRlTW9kaWZpZXIsIFJlbW92ZVNraWxsQXR0cmlidXRlTW9kaWZpZXIKKyAgICAgICogUHJvcGVydGllczogUF9TS0lMTF9BVFRSSUJVVEVTLCBQX1NLSUxMX0FUVFJJQlVURV9PRkZTRVRTCisgICAgKiBzb25zdGlnOiAgICAgIHNwcnVjaGVybXVlZHVuZywgc2tpbGxfaW5mb19saXN0ZQorICAgICogUHJvcGVydGllczogICBQX05FV1NLSUxMUworCis1LiBPa3QgMjAxMSBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vUXVlcnlTa2lsbEF0dHJpYnV0ZU1vZGlmaWVyIGIvZG9jL2xmdW4vUXVlcnlTa2lsbEF0dHJpYnV0ZU1vZGlmaWVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwN2M1MWIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9RdWVyeVNraWxsQXR0cmlidXRlTW9kaWZpZXIKQEAgLTAsMCArMSw5MCBAQAorUXVlcnlTa2lsbEF0dHJpYnV0ZU1vZGlmaWVyKCkKK0ZVTktUSU9OOgorICAgIHB1YmxpYyB2YXJhcmdzIG1hcHBpbmcgUXVlcnlTa2lsbEF0dHJpYnV0ZU1vZGlmaWVyKG9iamVjdCBjYXN0ZXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyAqYXRybmFtZXMpCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3RkL2xpdmluZy9za2lsbF9hdHRyaWJ1dGVzLmMKKworQVJHVU1FTlRFOgorICAgIDxjYXN0ZXI+ICAgIG9iamVjdAorICAgICAgICAgICAgICAgIE9iamVrdCwgd2VsY2hlcyBkaWUgZ2VzdWNodGVuIE1vZHMgZ2VzZXR6dCBoYXQKKworICAgIDxhdHJuYW1lcz4gIHN0cmluZyoKKyAgICAgICAgICAgICAgICBBcnJheSB2b24gU2tpbGwtQXR0cmlidXRlbiwgd2VsY2hlIGR1cmNoc3VjaHQgd2VyZGVuIHNvbGxlbi4KKworQkVTQ0hSRUlCVU5HOgorICAgIERpZXNlIEZ1bmt0aW9uIGxpZWZlcnQgYWxsZSBNb2RzIHZvbiA8Y2FzdGVyPiBhdWYgZGVuIFNraWxsLQorICAgIEF0dHJpYnV0ZW4gPGF0cm5hbWVzPiBpbiBlaW5lbSBNYXBwaW5nIHp1cnVlY2suCisgICAgV2lyZCA8YXRybmFtZXM+IG5pY2h0IGFuZ2VnZWJlbiBvZGVyIGlzdCBlaW4gbGVlcmVzIEFycmF5LCB3ZXJkZW4gYWxsZQorICAgIFNraWxsLUF0dHJpYnV0ZSBuYWNoIE1vZHMgYWJnZXN1Y2h0LgorICAgIFdpcmQgPGNhc3Rlcj4gbmljaHQgYW5nZWJlbiBvZGVyIGlzdCAwLCBzbyB3ZXJkZW4gYWxsZSBNb2RzIGRlciAKKyAgICBnZXd1ZW5zY2h0ZW4gU2tpbGwtQXR0cmlidXRlIGdlbGllZmVydC4KKyAgICBEZW1lbnRzcHJlY2hlbmQgYmVrb21tdCBtYW4gYWxsZSBNb2RzIGFsbGVyIFNraWxsLUF0dHJpYnV0ZSwgd2VubiBrZWlucworICAgIHZvbiBiZWlkZW0gYW5nZWdlYmVuIHdpcmQuCisKK1JVRUNLR0FCRVdFUlQ6CisgICAgKFtdKSwgZmFsbHMga2VpbmUgTW9kaWZpa2F0b3JlbiBnZWZ1bmRlbiB3dXJkZW4uCisgICAgSW4gYW5kZXJlbiBGYWVsbGVuIGlzdCBkaWUgRGF0ZW5zdHJ1a3R1ciBkZXMgTWFwcGluZ3Mgd2llIGZvbGd0OgorICAgIChbIGF0cm5hbWUxOiAoWyA8Y2FzdGVyPjogPHZhbHVlPjsgPGR1cmF0aW9uPiBdKSwKKyAgICAgICBhdHJuYW1lMjogKFsgPGNhc3Rlcj46IDx2YWx1ZT47IDxkdXJhdGlvbj4gXSkgXSkKKyAgICBEaWUgU2NobHVlc3NlbCBpbSBNYXBwaW5nIHNpbmQgZGllIGpld2VpbGlnZW4gU2tpbGwtQXR0cmlidXRlLCBkaWUgV2VydGUKKyAgICBkZXMgTWFwcGluZ3Mgc2luZCBlcm5ldXQgTWFwcGluZ3MsIHdlbGNoZSBhbHMgU2NobHVlc3NlbCBkaWUgT2JqZWt0ZQorICAgIGhhYmVuLCB3ZWxjaGUgZGllIE1vZHMgZ2VzZXR6dCBoYWJlbi4gSW4gZGllc2VtIE1hcHBpbmcgZ2Vob2VyZW4genUgamVkZW0KKyAgICBTY2hsdWVzc2VsIHp3ZWkgV2VydGUsIGRlbiBXZXJ0IGRlcyBNb2RpZmlrYXRvcnMgdW5kIGRpZSBBYmxhdWZ6ZWl0LgorICAgIDx2YWx1ZT4ga2FubiBoaWVyYmVpIGVpbiBpbnQgb2RlciBlaW5lIGNsb3N1cmUgc2VpbiwgPGR1cmF0aW9uPiBpc3QgZWluCisgICAgaW50LCA8Y2FzdGVyPiBpc3QgZWluIE9iamVrdC4KKyAgICBHZ2YuIGthbm4gZGFzIGlubmVyZSBNYXBwaW5nIG5hdHVlcmxpY2ggYXVjaCBtZWhyZXJlIE1vZGlmaWthdG9yZW4KKyAgICBlbnRoYWx0ZW4gKGFsc28gY2FzdGVyMSwgY2FzdGVyMiwgdXN3LikuCisKK0JFTUVSS1VOR0VOOgorCitCRUlTUElFTEU6CisgICAgIEVpbiBPYmpla3QgbW9lY2h0ZSBzZWluZW4gYmVzdGVoZW5kZW4gTW9kaWZpa2F0b3IgdW0gMjAgdW5kIGRpZQorICAgICBHdWVsdGlna2VpdCB1bSAxMyBlcmhvZWhlbi4KKyAgICAgbWFwcGluZyByZXMgPSBvYi0+UXVlcnlTa2lsbEF0dHJpYnV0ZU1vZGlmaWVyKHRoaXNfb2JqZWN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7U0FfREFNQUdFfSkgKTsKKyAgICAgaWYgKG1lbWJlcihyZXMsIFNBX0RBTUFHRSkgJiYgbWVtYmVyKHJlc1tTQV9EQU1BR0VdLCB0aGlzX29iamVjdCgpKSkgeworICAgICAgICAgIC8vIGFsdGVuIE1vZCB1ZWJlcnNjaHJlaWJlbiB1bmQgV2VydGUgZGFiZWkgYW5oZWJlbi4KKyAgICAgICAgICBvYi0+TW9kaWZ5U2tpbGxBdHRyaWJ1dGVNb2RpZmllcihTQV9EQU1BR0UsCisgICAgICAgICAgICAgIHJlc1tTQV9EQU1BR0VdW3RoaXNfb2JqZWN0KCksMF0gKyAyMCwKKyAgICAgICAgICAgICAgcmVzW1NBX0RBTUFHRV1bdGhpc19vYmplY3QoKSwxXSArIDEzICk7CisgICAgIH0KKyAgICAgZWxzZQorICAgICAgICAgIC8vIG5ldWVuIE1vZCBzZXR6ZW4uCisgICAgICAgICAgb2ItPk1vZGlmeVNraWxBdHRyaWJ1dGVNb2RpZmllcihTQV9EQU1BR0UsIDIwLCAxMyk7CisgICAgICAKKyAgICAgRWluIE9iamVrdCBoYXQgZGVuIEZsdWNoIGRlciB1bnByYWV6aXNlbiBTY2huZWxsaWdrZWl0LCB3ZWxjaGVyIFNBX0RBTUFHRQorICAgICByZWR1emllcnQsIHNvZmVybiBkYXMgTGViZXdlc2VuIGVpbmVuIHBvc2l0aXZlbiBNb2RpZmlrYXRvciBhdWYgU0FfU1BFRUQKKyAgICAgaGF0OgorICAgICBtYXBwaW5nIHJlcyA9IG9iLT5RdWVyeVNraWxsQXR0cmlidXRlTW9kaWZpZXIoMCwgKHtTQV9TUEVFRH0pICk7CisgICAgIGlmIChtZW1iZXIocmVzLCBTQV9TUEVFRCkgeworICAgICAgICAgaW50IHZhbCwgaW50IGR1cjsKKyAgICAgICAgIGZvcmVhY2gob2JqZWN0IGNhc3RlciwgaW50IHYsIGludCBkOiByZXNbU0FfU1BFRURdKSB7CisgICAgICAgICAgICAgLy8gZ3JvZXNzdGVuIE1vZCByYXVzZmluZGVuLCBkYWJlaSBrZWluZSBjbG9zdXJlcworICAgICAgICAgICAgIC8vIGJlcnVlY2tzaWNodGlnZW4uCisgICAgICAgICAgICAgaWYgKGludHAodikgJiYgdj52YWwpIHsKKyAgICAgICAgICAgICAgICAgdmFsPXY7CisgICAgICAgICAgICAgICAgIGR1cj1kOworICAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIGlmICh2YWwgPiAwKSB7CisgICAgICAgICAgICAgLy8gcG9zLiBNb2QgYXVmIFNBX1NQRUVEIGdlZnVuZGVuLCBlbnRzcHJlY2hlbmRlbiBuZWcuIE1vZCBhdWYKKyAgICAgICAgICAgICAvLyBTQV9EQU1BR0Ugc2V0emVuLCBkZXIgenVtIGdsZWljaGVuIFplaXRwdW5rdCB1bmd1ZWx0aWcgd2lyZAorICAgICAgICAgICAgIC8vIHdpZSBkZXIgTW9kIGF1ZiBTQV9TUEVFRC4KKyAgICAgICAgICAgICBpZiAob2ItPk1vZGlmeVNraWxsQXR0cmlidXRlKFNBX0RBTUFHRSwgLXZhbCwgZHVyKSA9PSBTQV9NT0RfT0spCisgICAgICAgICAgICAgICAgdGVsbF9vYmplY3Qob2IsICJ0b2xsZSBGbHVjaG1lbGR1bmcuIik7CisgICAgICAgICB9CisgICAgIH0KKworU0lFSEUgQVVDSDoKKyAgICBTa2lsbHMgTGVybmVuOiAgTGVhcm5Ta2lsbCwgTW9kaWZ5U2tpbGwsIExpbWl0QWJpbGl0eQorICAgICogTnV0enVuZzogICAgICBVc2VTcGVsbCwgVXNlU2tpbGwKKyAgICAqIEFiZnJhZ2VuOiAgICAgUXVlcnlTa2lsbCwgUXVlcnlTa2lsbEFiaWxpdHkKKyAgICAqIE1vZGlmaWthdGlvbjogTW9kaWZ5U2tpbGxBdHRyaWJ1dGUsIFF1ZXJ5U2tpbGxBdHRyaWJ1dGUsCisgICAgICAgICAgICAgICAgICAgIFJlbW92ZVNraWxsQXR0cmlidXRlTW9kaWZpZXIKKyAgICAgICogUHJvcGVydGllczogUF9TS0lMTF9BVFRSSUJVVEVTLCBQX1NLSUxMX0FUVFJJQlVURV9PRkZTRVRTCisgICAgKiBzb25zdGlnOiAgICAgIHNwcnVjaGVybXVlZHVuZywgc2tpbGxfaW5mb19saXN0ZQorICAgICogUHJvcGVydGllczogICBQX05FV1NLSUxMUworCisxNC4wOC4yMDA4LCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9RdWVyeVNraWxsQm9udXMgYi9kb2MvbGZ1bi9RdWVyeVNraWxsQm9udXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE0ZWY0NwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL1F1ZXJ5U2tpbGxCb251cwpAQCAtMCwwICsxLDY1IEBACitRdWVyeVNraWxsQm9udXMoKQorCitGVU5LVElPTjoKKyAgICAgaW50IFF1ZXJ5U2tpbGxCb251cyhvYmplY3QgY2FzdGVyLCBvYmplY3QgdGFyZ2V0LCBtYXBwaW5nIHNpbmZvKQorCitERUZJTklFUlQgSU46CisgICAgIGJlbGllYmlnZW4gT2JqZWt0ZW4KKworQVJHVU1FTlRFOgorICAgICBvYmplY3QgY2FzdGVyCisgICAgICAgICAgZGVyIEJlbnV0emVyIGVpbmVzIFNraWxscy9TcGVsbHMgKExlYmV3ZXNlbikKKyAgICAgb2JqZWN0IHRhcmdldAorICAgICAgICAgIGRhcyBaaWVsIGVpbmVzIFNraWxscy9TcGVsbHMgKGJlbGllYmlnZXMgT2JqZWt0IG9kZXIgMCkKKyAgICAgbWFwcGluZyBzaW5mbworICAgICAgICAgIGRhcyBTa2lsbGluZm9tYXBwaW5nCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGllc2UgRnVua3Rpb24gd2lyZCB2b24gZGVyIEdpbGRlIGRlcyBDYXN0ZXJzIGltIEVudmlyb25tZW50IHVuZCBnZ2YuCisgICAgIGF1Y2ggaW0gWmllbCBlaW5lcyBTa2lsbHMvU3BlbGxzIGdlcnVmZW4uCisgICAgIERpZSBHaWxkZSB1ZWJlcmdpYnQgbmViZW4gQ2FzdGVyIHVuZCBaaWVsIGVpbiBNYXBwaW5nIG1pdCBTa2lsbGluZm9zIChzLgorICAgICBTSSBLb25zdGFudGVuIGF1cyBuZXdfc2tpbGxzLmggZnVlciBEZXRhaWxzKSwgd2VsY2hlcyBhbGxlIHdlc2VudGxpY2hlbgorICAgICBJbmZvcm1hdGlvbmVuIHVlYmVyIGRlbiBiZW51dHp0ZW4gU2tpbGwvU3BlbGwgZW50aGFlbHQuCisKKyAgICAgUXVlcnlTa2lsbEJvbnVzKCkgbGllZmVydCBlaW5lbiBCb251cyAob2RlciBNYWx1cykgenVydWVjaywgZGVuIGRlcgorICAgICBBdWZydWZlciBhbHMgRmFrdG9yIGluIGRlciBCZXJlY2hudW5nIGRlcyBFZmZla3RzIGRlcyBTa2lsbHMKKyAgICAgYmVydWVja3NpY2h0aWdlbiBrYW5uIChhYmVyIG5pY2h0IG11c3MpLgorICAgICBEZXIgQm9udXMvTWFsdXMgd2lyZCBoaWVyYmVpIGFscyBnYW56emFobGlnZXIgMC4wMS1Qcm96ZW50d2VydCBhdWZnZWZhc3N0CisgICAgICgxMDAwMCA9PSAxMDAlID09IGtlaW5lIFZlcmFlbmRlcnVuZywgMSA9PSAwLjAxJSkuCisKKyAgICAgRGllc2UgRnVua3Rpb24ga2FubiBpbiBiZWxpZWJpZ2VuIE9iamVrdGVuIChyZS0pZGVmaW5pZXJ0IHdlcmRlbi4gSW0KKyAgICAgRmFsbGUgbW9iaWxlciBPYmpla3RlIG9kZXIgYW5oYWx0ZW5kZXIgRWZmZWt0ZSBpc3QgamVkb2NoIGVpbmUKKyAgICAgQmFsYW5jZWdlbmVobWlndW5nIGVyZm9yZGVybGljaCwgc29mZXJuIGthbXBmcmVsZXZhbnRlIFNraWxscyBiZWVpbmZsdXNzdAorICAgICB3ZXJkZW4uCisgICAgIEVpbmUgZmxhZWNoZW5kZWNrZW5kZSBSZWR1emllcnVuZyB2b24gU2tpbGxzL0dpbGRlbmZhZWhpZ2tlaXRlbiBpc3QKKyAgICAgZXhwbGl6aXQgX25pY2h0XyBlcnd1ZW5zY2h0IHVuZCBzb2xsIGF1ZiBlaW56ZWxuZSBSYWV1bWUgdW5kIE9iamVrdGUKKyAgICAgYmVzY2hyYWVua3Qgc2Vpbi4KKworQkVNRVJLVU5HRU46CisgICAgIERhcyBNYXBwaW5nIDxzaW5mbz4ga2FubiBpbiBkaWVzZXIgRnVua3Rpb24gZ2VhZW5kZXJ0IHdlcmRlbi4gRGllc2VzIGthbm4KKyAgICAgYWxsZXJkaW5ncyBzZWhyIHdlaXRyZWljaGVuZGUgRm9sZ2VuIGhhYmVuLCBzcGV6aWVsbCBiZWkgbWFuZ2VsbmRlbgorICAgICBLZW5udG5pc3NlbiB1ZWJlciBJbnRlcm5hIGRlcyBTa2lsbHN5c3RlbXMuIERhaGVyIGJpdHRlIHZvbiBBZW5kZXJ1bmdlbgorICAgICBhYnNlaGVuIGJ6dy4gdm9yaGVyIG1pdCBkZW0gamV3ZWlsaWdlbiBHaWxkZW5tYWdpZXIgdW5kL29kZXIgZGVyCisgICAgIEdpbGRlbmJhbGFuY2UgYWJrbGFlcmVuLgorICAgICBEaWUgQmVkZXV0dW5nIGRlciBXZXJ0ZSBpbiA8c2luZm8+IGthbm4gamUgbmFjaCBHaWxkZSB2YXJpaWVyZW4uIEltCisgICAgIFp3ZWlmZWxzZmFsbCBiaXR0ZSBiZWkgZGVuIGpld2VpbGlnZW4gR2lsZGVubWFnaWVybiBuYWNoZnJhZ2VuLiAKKyAgICAgRGllIEdpbGRlIGthbm4gZGllc2UgRnVua3Rpb24gcnVmZW4sIG11c3MgYWJlciBuaWNodC4gRWJlbnNvIGthbm4gc2llIGRhcworICAgICBFcmdlYm5pcyBiZXJ1ZWNrc2ljaHRpZ2VuLCBtdXNzIGFiZXIgbmljaHQuCisKK0JFSVNQSUVMRToKKyAgICAgSW4gZWluZW0gUmF1bSBzb2xsZW4gSGVpbHphdWJlciBiZXNvbmRlcnMgZWZmaXppZW50IHNlaW46CisgICAgIGludCBRdWVyeVNraWxsQm9udXMob2JqZWN0IGNhc3Rlciwgb2JqZWN0IHRhcmdldCwgbWFwcGluZyBzaW5mbykgeworICAgICAgICBpZiAocG9pbnRlcnAoc2luZm9bU0lfTUFHSUNfVFlQRV0pCisgICAgICAgICAgICAmJiBtZW1iZXIoc2luZm9bU0lfTUFHSUNfVFlQRV0sIE1UX0hFSUxVTkcpID4gLTEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAxMjAwMCArIHJhbmRvbSgzMDAwKTsgLy8gYm9udXMgdm9uIDEyMC0xNTAlCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDEwMDAwOworICAgICB9CisKK1NJRUhFIEFVQ0g6CisgICAgIGdpbGRlbi1kb2t1CisgICAgIDxuZXdfc2tpbGxzLmg+CisKK0xFVFpURSBBZU5ERVJVTkc6CisxOS4wOC4yMDEzLCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9RdWVyeVN0b3JhZ2VSb29tIGIvZG9jL2xmdW4vUXVlcnlTdG9yYWdlUm9vbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjJlNDBkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vUXVlcnlTdG9yYWdlUm9vbQpAQCAtMCwwICsxLDIxIEBACitRdWVyeVN0b3JhZ2VSb29tKCkNCisNCitGdW5rdGlvbjoNCisgICAgc3RyaW5nIFF1ZXJ5U3RvcmFnZVJvb20oKQ0KKw0KK0RlZmluaWVydCBpbjoNCisgICAgL3N0ZC9yb29tL3Nob3ANCisNCitSdWVja2dhYmV3ZXJ0Og0KKyAgICBEYXRlaW5hbWUgZGVzIExhZ2VycywgaW4gZGVtIGRpZSBhdWZnZWthdWZ0ZW4gR2VnZW5zdGFlbmRlIGF1ZmJld2FocnQgDQorICAgIHdlcmRlbi4NCisNCitTaWVoZSBhdWNoOg0KKyAgICBGdW5rdGlvbmVuOg0KKyAgICAgIEFkZEZpeGVkT2JqZWN0KCksIFJlbW92ZUZpeGVkT2JqZWN0KCksIFNldFN0b3JhZ2VSb29tKCksIA0KKyAgICAgIFF1ZXJ5QnV5VmFsdWUoKSwgUXVlcnlCdXlGYWN0KCksIHNlbGxfb2JqKCksIGJ1eV9vYmooKQ0KKyAgICBQcm9wZXJ0aWVzOg0KKyAgICAgIFBfS0VFUEVSLCBQX01JTl9TVE9DSywgUF9TVE9SRV9DT05TVU1FDQorDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorTGV0enRlIEFlbmRlcnVuZzogMjEuMDUuMjAxNCwgQnVnZml4DQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vUXVlcnlUaW1lZEF0dHJNb2RpZmllciBiL2RvYy9sZnVuL1F1ZXJ5VGltZWRBdHRyTW9kaWZpZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkwODYwOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL1F1ZXJ5VGltZWRBdHRyTW9kaWZpZXIKQEAgLTAsMCArMSw0MiBAQAorUXVlcnlUaW1lZEF0dHJNb2RpZmllcigpCitGVU5LVElPTjoKKyAgICAgbWFwcGluZyBRdWVyeVRpbWVkQXR0ck1vZGlmaWVyKHN0cmluZyBrZXkpCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC9saXZpbmcvYXR0cmlidXRlcy5jCisKK0FSR1VNRU5URToKKyAgICAga2V5CS0JYXVzIFBfVElNRURfQVRUUl9NT0QgYWJ6dWZyYWdlbmRlciBFaW50cmFnCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGVyIHp1IGtleSBnZWhvZXJlbmRlIEVpbnRyYWcgaW4gUF9USU1FRF9BVFRSX01PRCB3aXJkIGFiZ2VmcmFndC4NCisNCitSVWVDS0dBQkVXRVJUOg0KKyAgICAgRWluIGxlZXJlcyBNYXBwaW5nIGltIEZhbGxlIGVpbmVzIGZlaGxlcmhhZnRlbiBrZXktQXJndW1lbnRlcyBvZGVyIAorICAgICBlaW5lcyBuaWNodCBleGlzdGVudGVuIEtleXMuDQorICAgICANCisgICAgIEFuc29uc3RlbiB3aXJkIGVpbiBNYXBwaW5nIGRlciBGb3JtDQorICAgICANCisgICAgICAgIChbDQorICAgICAgICAgICBLZXkgOiAoWyBNYXBwaW5nIG1pdCBkZW4gTW9kaWZpa2F0b3JlbiBdKSA7DQorICAgICAgICAgICAgICAgICBBYmxhdWZ6ZWl0IDsgQWJsYXVmb2JqZWt0IDsgTmFjaHJpY2h0ZW5lbXBmYWVuZ2VyIA0KKyAgICAgICAgXSkgICAgDQorDQorICAgICB6dXJ1ZWNrZ2VnZWJlbi5EaWUgQWJsYXVmemVpdCBpc3QgaGllcmJlaSBkaWUgWmVpdCBpbiBTZWt1bmRlbiBzZWl0DQorICAgICBkZW0gMS4gSmFuIDE5NzAsIDAuMDowIEdNVCwgZGFzIEFibGF1Zm9iamVrdCBpc3QgZGFzIE9iamVrdCBhbiBkZXNzZW4NCisgICAgIEV4aXN0ZW56IGRpZSBBdHRyaWJ1dHZlcmFlbmRlcnVuZ2VuIGdlYnVuZGVuIGlzdCB1bmQgZGVyDQorICAgICBOYWNocmljaHRlbmVtcGZhZW5nZXIgaXN0IGRhc2plbmlnZW4gT2JqZWt0ZSB3ZWxjaGVzIGltIEZhbGxlIA0KKyAgICAgZHVyY2ggZGVuIEF1ZnJ1ZiB2b24gIk5vdGlmeVRpbWVkQXR0ck1vZEV4cGlyZWQiIGJlbmFjaHJpY2h0aWd0IA0KKyAgICAgd2lyZCBzb2JhbGQgZGFzIEF0dHJpYnV0IGFiZ2VsYXVmZW4gaXN0LiANCisgICAgIERlciBGdW5rdGlvbiBOb3RpZnlUaW1lZEF0dHJNb2RFeHBpcmVkIHdpcmQgYWxzIEFyZ3VtZW50IGRlciBrZXkNCisgICAgIGRlciBhYmdlbGF1ZmVuZW4gQXR0cmlidXR2ZXJhZW5kZXJ1bmcgdWViZXJnZWJlbi4NCisgICAgIERhcyBNYXBwaW5nIGlzdCBlaW5lIEtvcGllIGRlciBPcmlnaW5hbGRhdGVuc3RydWt0dXIgenUgZGllc2VtIEtleS4NCisgICAgCitTSUVIRSBBVUNIOg0KKwlRdWVyeUF0dHJpYnV0ZSgpLCBRdWVyeVJlYWxBdHRyaWJ1dGUoKSwgUXVlcnlBdHRyaWJ1dGVPZmZzZXQoKSwNCisJU2V0QXR0cmlidXRlKCksIFNldFJlYWxBdHRyaWJ1dGUoKSwgVXBkYXRlQXR0cmlidXRlcygpLA0KKwlTZXRUaW1lZEF0dHJNb2RpZmllcigpLCBEZWxldGVUaW1lZEF0dHJNb2RpZmllcigpLA0KKwlQX0FUVFJJQlVURVMsIFBfQVRUUklCVVRFU19PRkZTRVRTLCBQX1RJTUVEX0FUVFJfTU9ELA0KKwlQX1hfQVRUUl9NT0QsIFBfTV9BVFRSX01PRCwgL3N0ZC9saXZpbmcvYXR0cmlidXRlcy5jDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK0xhc3QgbW9kaWZpZWQ6IFR1ZSBKdWwgMjcgMjA6MDA6MjAgMjAwNCBieSBNdWFkaWINCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9RdWVyeVRvdGFsUVAgYi9kb2MvbGZ1bi9RdWVyeVRvdGFsUVAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YxNWNjMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL1F1ZXJ5VG90YWxRUApAQCAtMCwwICsxLDI1IEBACitRdWVyeVRvdGFsUVAoKQorCitGVU5LVElPTjoKKyAgICBpbnQgUXVlcnlUb3RhbFFQKCkKKworREVGSU5JRVJUIElOOgorICAgIC9zZWN1cmUvcXVlc3RtYXN0ZXIuYworCitBUkdVTUVOVEU6CisgICAga2VpbmUKKworUlVFQ0tHQUJFV0VSVDoKKyAgICBBYmVudGV1ZXJwdW5rdGUgc2FlbXRsaWNoZXIgUXVlc3RzCisKK0JFU0NIUkVJQlVORzoKKyAgICBEaWVzZSBGdW5rdGlvbiBsaWVmZXJ0IGRpZSBBYmVudGV1ZXJwdW5rdGUgZGVyIHNhZW10bGljaGVyIGFrdGl2aWVydGVyCisgICAgUXVlc3RzIHp1cnVlY2suCisKK1NJRUhFIEFVQ0g6CisgICAgR2l2ZVF1ZXN0LCBRdWVyeVF1ZXN0LCAvc2VjdXJlL3F1ZXN0bWFzdGVyLmgsIFF1ZXJ5R3JvdXBlZEtleXMsCisgICAgUXVlcnlNYXhRUCwgUXVlcnlPcHRRUAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitadWxldHp0IGdlYWVuZGVydDogU2FtLCAyNS4gTm92IDIwMDAsIDE0OjA0OjI4IHZvbiBab29rLgorCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9RdWVyeVVzZXIgYi9kb2MvbGZ1bi9RdWVyeVVzZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI5YTBhNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL1F1ZXJ5VXNlcgpAQCAtMCwwICsxLDUwIEBACitRdWVyeVVzZXIoKQorCitGVU5LVElPTjoKKyAgICAgcHVibGljIG9iamVjdCBRdWVyeVVzZXIoKQorCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvbnBjL2NvbWJhdC5jCisgICAgIC9zdGQvY2xvdGhpbmcvd2Vhci5jCisgICAgIC9zdGQvd2VhcG9uL2NvbWJhdC5jCisgICAgIGFsbGUgT2JqZWt0ZSwgaW4gZGVuZW4gZXMgZGFydWViZXIgaGluYXVzIG5vZXRpZyBpc3QKKworQVJHVU1FTlRFOgorICAgICBrZWluZQorCitCRVNDSFJFSUJVTkc6CisgICAgIExpZWZlcnQgZGVuIGFrdHVlbGxlbiBOdXR6ZXIgKExlYmV3ZXNlbikgZWluZXMgSXRlbXMgb2RlciBOUENzLgorICAgICAKKyAgICAgRGllc2UgRnVua3Rpb24gd2lyZCB6LkIuIHZvbiBnZXRfa2lsbGluZ19wbGF5ZXIoKSBiZW51dHp0LCB1bQorICAgICBoZXJhdXN6dWZpbmRlbiwgenUgd2VsY2hlbSBTcGllbGVyIGRlbm4gZGFzIE9iamVrdCBnZWhvZXJ0LCB3YXMgZGVuCisgICAgIHRvZWRsaWNoZW4gU2NoYWRlbiB2ZXJ1cnNhY2h0IGhhdC4KKworICAgICBJbSBGYWxsZSBlaW5lcyBOUENzIGlzdCBkaWVzIHN0YW5kYXJkbWFlc3NpZyBkZXIgU3BpZWxlciwgYmVpIGRlbSBkZXIKKyAgICAgTlBDIGFscyBIZWxmZXItTlBDIGVpbmdldHJhZ2VuIGlzdCAocy4gUmVnaXN0ZXJIZWxwZXJOUEMpLgorICAgICBJbSBGYWxsZSBlaW5lciBSdWVzdHVuZyBpc3QgZXMgZGFzIExlYmV3ZXNlbiwgd2VsY2hlcyBzaWUgZ2VyYWRlIHRyYWVndC4KKyAgICAgSW0gRmFsbGUgZWluZXIgV2FmZmUgaXN0IGVzIGRhcyBMZWJld2VzZW4sIHdlbGNoZXMgc2llIGdlcmFkZSBnZXp1ZWNrdAorICAgICBoYXQuCisgICAgIEFsbGUgYW5kZXJlbiBPYmpla3RlIGVudGhhbHRlbiBrZWluZW4gRGVmYXVsdCBmdWVyIGRpZXNlIEZ1bmt0aW9uLgorCitSVWVDS0dBQkVXRVJUOgorICAgICBEYXMgbnV0emVuZGUgTGViZXdlc2VuLCBmYWxscyBlcyBlcm1pdHRlbHQgd2VyZGVuIGtvbm50ZSwgc29uc3QgMC4KKworQkVNRVJLVU5HRU46CisgICAgIFNvbGx0ZSBpbiBhbGxlbiBPYmpla3RlbiBkZWZpbmllcnQgd2VyZGVuLCB3ZWxjaGUgTGViZXdlc2VuIFNjaGFkZW4KKyAgICAgenVmdWVnZW4sIG9obmUgZGFzcyBkYXMgdmVydXJzYWNoZW5kZSBMZWJld2VzZW4gZGFiZWkgYWxzIEZlaW5kIGltCisgICAgIERlZmVuZCgpIGFuZ2ViZW4gd2lyZC4KKyAgICAgRGVyIGdlbGllZmVydGUgTnV0emVyIG11c3MgZXhwbGl6aXQga2VpbiBTcGllbGVyIHNlaW4uIEVzIHdhZXJlIHouQi4KKyAgICAgbW9lZ2xpY2gsIGRhc3Mgdm9uIGVpbmVtIFNwaWVsZXIga29udHJvbGxpZXJ0ZXIgTlBDIGVpbmVuIEJ1bWVyYW5nIG51dHp0LgorCitCRUlTUElFTEU6CisgICAgIEVpbiB2b24gZWluZW0gU3BpZWxlciBiZXNjaHdvcmVuZXMgV2VzZW4gd2lyZnQgZWluZW4gQnVtZXJhbmcgbmFjaCBlaW5lbQorICAgICBGZWluZC4KKyAgICAgRGFubiBsaWVmZXJ0IFF1ZXJ5VXNlcigpIGltIEJ1bWVyYW5nIGRlbiBOUEMgYWxzIE51dHplciB1bmQKKyAgICAgUXVlcnlVc2VyKCkgaW0gTlBDIHdpZWRlcnVtIGRlbiBTcGllbGVyLgorICAgICAKK1NJRUhFIEFVQ0g6CisgICAgIFJlZ2lzdGVySGVscGVyTlBDKCksIGdldF9raWxsZXJfcGxheWVyKCkKKyAgICAgUF9XT1JOLCBQX1dJRUxERUQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzEyLjExLjIwMTMsIFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vUXVlcnlWYWxpZE9iamVjdCBiL2RvYy9sZnVuL1F1ZXJ5VmFsaWRPYmplY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYyMmQ2NQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL1F1ZXJ5VmFsaWRPYmplY3QKQEAgLTAsMCArMSw0NyBAQAorUXVlcnlWYWxpZE9iamVjdCgpCisKK0ZVTktUSU9OOgorICAgICBwdWJsaWMgaW50IFF1ZXJ5VmFsaWRPYmplY3Qoc3RyaW5nIG9uYW1lKTsKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL3ZpcnR1YWwvdl9jb21waWxlci5jCisKK0FSR1VNRU5URToKKyAgICAgb25hbWUKKyAgICAgICBPYmpla3RuYW1lLCBkZXIgZ2VwcnVlZnQgd2VyZGVuIHNvbGwgKGtvbXBsZXR0ZXIgUGZhZCBtaXQgLyBhbSBBbmZhbmcpIAorCitSVWVDS0dBQkVXRVJUOgorICAgICA8PTAgLSBmYWxscyBWQyBuaWNodCB6dXN0YWVuZGlnIGlzdC4KKyAgICAgPjAgLSBmYWxscyBkZXIgVkMgc2ljaCBmdWVyIGRhcyBPYmpla3QgenVzdGFlbmRpZyBlcmtsYWVydC4KKworQkVTQ0hSRUlCVU5HOgorICAgICBVZWJlciBkaWUgRnVua3Rpb24gbGFlc3N0IHNpY2ggaGVyYXVzZmluZGVuLCBvYiBlaW4gVkMgc2ljaCBmdWVyIGRhcworICAgICBnZXd1ZW5zY2h0ZSBPYmpla3QgenVzdGFlbmRpZyBmdWVobHQuIERhYmVpIHdpcmQgVmFsaWRhdGUoKSwKKyAgICAgUF9DT01QSUxFUl9QQVRILCBOb1BhcmFPYmplY3RzKCkgdW5kIFBfUEFSQSBpbSBWQyBhdXNnZXdlcnRldDoKKyAgICAgMS4gWnVlcnN0IHdpcmQgbWl0IFZhbGlkYXRlKCkgZ2VwcnVlZnQsIG9iIGRlciBGaWxlbmFtZSAob2huZSBQZmFkKSBvayBpc3QuCisgICAgIDIuIHdpcmQgZ2VndWNrdCwgb2IgZGFzIGFuZ2VmcmFndGUgT2JqZWt0IGltIHJpY2h0aWdlbiBQZmFkIGxpZWd0IAorICAgICAgICAoUF9DT01QSUxFUl9QQVRIKS4KKyAgICAgMy4gd2VubiBkYXMgYW5nZWZyYWd0ZSBPYmpla3QgZWluIFBhcmEtT2JqZWt0IGlzdDoKKyAgICAgICBhKSB3aXJkIE5vUGFyYU9iamVjdHMoKSBnZXBydWVmdCwgd2VubiBkYXMgIT0wIGlzdCwgc2luZCBnYXIga2VpbmUgUGFyYS0KKyAgICAgICAgICBPYmpla3RlIGVybGF1YnQuCisgICAgICAgYikgd2lyZCBQX1BBUkEgX2ltIFZDXyBhYmdlZnJhZ3QsIGRvcnQga2FubiBtYW4gZWluIEFycmF5IGFsbGVyIAorICAgICAgICAgIGVybGF1YnRlbiBQYXJhLURpbWVuc2lvbmVuIHJlaW5zY2hyZWliZW4uIEZ1ZXIgYWxsZSBhbmRlcmVuIGVya2xhZXJ0IAorICAgICAgICAgIHNpY2ggZGVyIFZDIGZ1ZXIgbmljaHQgenVzdGFlbmRpZy4gV2VubiBQX1BBUkEgbmljaHQgZ2VzZXR6dCBpc3QsIAorICAgICAgICAgIHNpbmQgYWxsZSBlcmxhdWJ0LiBFaW4gbGVlcmVzIEFycmF5ICh7fSkgd3VlcmRlIGVpbmVtIAorICAgICAgICAgIE5vUGFyYU9iamVjdHMoKSB7cmV0dXJuIDE7fSBlbnRzcHJlY2hlbi4KKworQkVNRVJLVU5HRU46CisgICAgIERpZXNlIEZ1bmt0aW9uIHdpcmQgdm9tIG1vdmUgYWJnZWZyYWd0LiBCaXR0ZSBhdWYgamVkZW4gRmFsbCBQX1BBUkEgb2RlcgorICAgICBOb1BhcmFPYmplY3RzKCkgcGFzc2VuZCBkZWZpbmllcmVuLCBzb25zdCBidWdndHMuCisKKyAgICAgV2VubiBqZW1hbmQgbWl0IGRlbSBvYmVuIGJlc2NocmllYmVuIFN0YW5kYXJkdmVyaGFsdGVuIG5pY2h0IGdsdWVja2xpY2gKKyAgICAgaXN0LCBrYW5uIG1hbiBkaWUgRnVua3Rpb24gcGFzc2VuZCB1ZWJlcnNjaHJlaWJlbi4KKworCitTSUVIRSBBVUNIOgorICAgICB2aXJ0dWFsX2NvbXBpbGVyCisgICAgIEN1c3RvbWl6ZU9iamVjdCgpLCBWYWxpZGF0ZSgpLCBOb1BhcmFPYmplY3RzKCksIAorICAgICBQX0NPTVBJTEVSX1BBVEgsIFBfUEFSQQorICAgICAvc3RkL3ZpcnR1YWwvdl9jb21waWxlci5jCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisyMS4xMC4yMDA3LCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9SZWNlaXZlTXNnIGIvZG9jL2xmdW4vUmVjZWl2ZU1zZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDQzYmNkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vUmVjZWl2ZU1zZwpAQCAtMCwwICsxLDI1MCBAQAorUmVjZWl2ZU1zZygpCisKK3B1YmxpYyB2YXJhcmdzIGludCBSZWNlaXZlTXNnKHN0cmluZyBtc2csIGludCBtc2dfdHlwLCBzdHJpbmcgbXNnX2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtc2dfcHJlZml4LCBtaXhlZCBvcmlnaW4pCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3RkL2xpdmluZy9jb21tLmMKKyAgICAvc3RkL25wYy9jb21tLmMKKyAgICAvc3RkL3BsYXllci9jb21tLmMKKyAgICAvc3RkL3Jvb20vaXRlbXMuYworCitBUkdVTUVOVEU6CisgICAgc3RyaW5nIG1zZworICAgICAgU3RyaW5nIG1pdCBkZXIgdWViZXJtaXR0ZWx0ZW4gTmFjaHJpY2h0LiBNdXNzIG5pY2h0IHVtZ2Vicm9jaGVuIHNlaW4sCisgICAgICBkYSBSZWNlaXZlTXNnKCkgZGFzIGViZW5mYWxscyBlcmxlZGlndC4KKyAgICBpbnQgbXNnX3R5cAorICAgICAgTmFjaHJpY2h0ZW50eXAoZW4pIGZ1ZXIgRmlsdGVydW5nIHVuZCBGbGFncyBmdWVyIEJlaGFuZGx1bmcvVW1icnVjaC4KKyAgICAgIFNpZWhlIHVudGVuIGZ1ZXIgbWl0IHwga29tYmluaWVyYmFyZSBLb25zdGFudGVuLgorICAgIHN0cmluZyBtc2dfYWN0aW9uIChvcHRpb25hbCkKKyAgICAgIEF1c2xvZXNlbmRlIEFrdGlvbiwgd2lyZCBhdWNoIGZ1ZXIgSWdub3JpZXJlbiB2ZXJ3ZW5kZXQuCisgICAgICBEZWZhdWx0IGlzdCBxdWVyeV92ZXJiKCkuIFNpZWhlIHVudGVuIGZ1ZXIgYWx0ZXJuYXRpdmUgS29uc3RhbnRlbi4KKyAgICBzdHJpbmcgbXNnX3ByZWZpeCAob3B0aW9uYWwpCisgICAgICBTdHJpbmcsIHdlbGNoZXIgZ2dmLiBpbSBicmVha19zdHJpbmcoKSBhbHMgaW5kZW50IHZlcndlbmRldCB3aXJkLgorICAgICAgRGVmYXVsdCBpc3QgMCAoa2VpbiBJbmRlbnQpCisgICAgbWl4ZWQgb3JpZ2luICg8b2JqZWN0PikgKG9wdGlvbmFsKQorICAgICAgRGFzIGRpZSBNZWxkdW5nIGF1c2xvZXNlbmRlIE9iamVrdCwgd2lyZCBmdWVyIElnbm9yaWVyZW4gdmVyd2VuZGV0LgorICAgICAgRGVmYXVsdDogcHJldmlvdXNfb2JqZWN0KCkKKworQkVTQ0hSRUlCVU5HOgorICAgIFJlY2VpdmVNc2coKSB3aXJkIGJlbnV0enQsIHVtIGVpbmVtIExlYmV3ZXNlbiBlaW5lIE5hY2hyaWNodCB6dSBzZW5kZW4uCisgICAgRGFiZWkgcnVmdCBlcyBkYXMgc29uc3QgdWVibGljaGUgdGVsbF9vYmplY3QoKSBmdWVyIFNwaWVsZXIgYnp3LgorICAgIGNhdGNoX3RlbGwoKSBpbSBOUEMgYXVmLgorCisgICAgR2VyYWRlIGZ1ZXIgTmFjaHJpY2h0ZW4gYW4gU3BpZWxlciBiaWV0ZXQgZGllIE1ldGhvZGUgd2VpdGVyZSBGZWF0dXJlcywKKyAgICBkaWUgYmlzaGVyIHNvbnN0IGhhZW5kaXNjaCB6dSBpbXBsZW1lbnRpZXJlbiB3YXJlbjoKKyAgICAxKSBQcnVlZnVuZyBhdWYgRW1wZmFuZ2JhcmtlaXQsIGplIG5hY2ggJ21zZ190eXAnLCB6QgorICAgICAgIE1UX0xPT0sgbnVyIGFuIE5pY2h0YmxpbmRlCisgICAgICAgTVRfTElTVEVOIG51ciBhbiBOaWNodHRhdWJlCisgICAgICAgTVRfREVCVUcgbnVyIGFuIE1hZ2llci9UZXN0c3BpZWxlcgorICAgIDIpIFBydWVmZW4gYXVmIElnbm9yaWVyZW4gdm9uCisgICAgICAgLSBBa3Rpb24gKCdtc2dfYWN0aW9uJykKKyAgICAgICAgIC0gbWl0ICdtc2dfYWN0aW9uJyB8fCBxdWVyeV92ZXJiKCkKKyAgICAgICAtIFVyaGViZXIgKCdvcmlnaW4nKQorICAgICAgICAgLSBmdWVyIHNlbmRlbmRlIFNwaWVsZXIgbWl0IG9yaWdpbi0+cXVlcnlfcmVhbG5hbWUoKQorICAgICAgICAgLSBmdWVyIHNlbmRlbmRlIE5QQ3MgbWl0IG9yaWdpbi0+TmFtZShSQVcpKQorICAgIDMpIFNwZWljaGVydW5nIGluIGRlciB0bWhpc3QgKFR5cCBNVF9DT01NKQorICAgIDQpIFNwZWljaGVydW5nIGltIEtvYm9sZCAoVHlwIE1UX0NPTU0gKyBha3RpdmVyIEtvYm9sZCkKKyAgICA1KSBVbWJyZWNoZW4gdW50ZXIgQmVydWVja3NpY2h0aWd1bmcgdm9uIGluZGVudCwgJ21zZ190eXAnLUZsYWdzCisgICAgICAgZnVlciBVbWJydWNoIHVuZCBQX1BSRVBFTkRfQlMKKworICAgIFJhZXVtZSBkZWZpbmllcmVuIHN0YW5kYXJkbWFlc3NpZyBlYmVuZmFsbHMgZWluIFJlY2VpdmVNc2coKSwgd2VsY2hlcyBpbgorICAgIGplZGVtIE9iamVrdCBpbSBSYXVtIFJlY2VpdmVNc2coKSBtaXQgZGVuIHVlYmVyZ2ViZW5lbiBBcmd1bWVudGVuIGF1ZnJ1ZnQuCisgICAgSW4gZGllc2VtIEZhbGwgaXN0IGRlciBSdWVja2dhYmUgZGVyIGtsZWluc3RlIHZvbiBhbGxlbiBnZXJ1ZmVuZW4KKyAgICBSZWNlaXZlTXNnKCkgenVydWVja2dlbGllZmVydGUgV2VydC4KKyAgICAKK1JVZUNLR0FCRVdFUlQ6CisgICAgPiAwIGZ1ZXIgRXJmb2xnLCA8IDAgZnVlciBNaXNzZXJmb2xnLCBzLnUuCisgICAgTVNHX0RFTElWRVJFRCAgICBiZWkgZXJmb2xncmVpY2hlciBadXN0ZWxsdW5nCisgICAgTVNHX0JVRkZFUkVEICAgICBiZWkgWndpc2NoZW5zcGVpY2hlcnVuZyBkdXJjaCBkZW4gS29ib2xkCisKKyAgICBNU0dfRkFJTEVEICAgICAgIG5pY2h0IG5hZWhlciBzcGV6aWZpemllcnRlciBGZWhsZXIgYmVpIFp1c3RlbGx1bmcKKyAgICBNU0dfSUdOT1JFRCAgICAgIE5hY2hyaWNodCB3dXJkZSBpZ25vcmllcnQgKEFic2VuZGVyLCBvcmlnaW4pCisgICAgTVNHX1ZFUkJfSUdOICAgICBOYWNocmljaHQgd3VyZGUgaWdub3JpZXJ0IChLb21tYW5kb3ZlcmIsIG1zZ19hY3Rpb24pCisgICAgTVNHX01VRF9JR04gICAgICBBYnNlbmRlbmRlcyBNdWQgd3VyZGUgaWdub3JpZXJ0LgorICAgIE1TR19TRU5TRV9CTE9DSyAgUGFzc2VuZGUgU2lubmUgZGVzIEVtcGZhZW5nZXIgc2luZCBibG9ja2llcnQgKHouQi4KKyAgICAgICAgICAgICAgICAgICAgIGJsaW5kLCB0YXViKQorICAgIE1TR19CVUZGRVJfRlVMTCAgS29ib2xkIGthbm4gc2ljaCBuaWNodHMgbWVociBtZXJrZW4KKworQkVNRVJLVU5HRU46CisgICAgRnVlciBzYWVtdGxpY2hlIEFsdGVybmF0aXZtZWxkdW5nZW4gaW0gRmFsbGUgZWluZXIgbmljaHQgZXJmb2xncmVpY2gKKyAgICB6dWdlc3RlbGx0ZW4gTmFjaHJpY2h0IGlzdCBkZXIgQXVmcnVmZXIgdm9uIFJlY2VpdmVNc2coKSB2ZXJhbnR3b3J0bGljaC4KKworICAgIE5QQ3M6CisgICAgKiBSZWNlaXZlTXNnKCkgcnVmdCB6d2Vja3MgQWJ3YWVydHNrb21wYXRpYmlsaXRhZXQgY2F0Y2hfdGVsbCgpIGF1ZgorICAgICogZW1wZm9obGVuIGlzdCwgaW4gTlBDcyBudW4gUmVjZWl2ZU1zZygpIHp1IHVlYmVyc2NocmVpYmVuLgorICAgICAgKiBjYXRjaF90ZWxsKCkgbXVzcyB3ZWl0ZXJoaW4gZnVlciBhbmRlcmUgdGVsbF9vYmplY3QoKQorICAgICAgICB1ZWJlcnNjaHJpZWJlbiAgd2VyZGVuCisKK0JFSVNQSUVMRToKKyAgICAjMS4xIE5hY2hyaWNodCBhbiBlaW5lbiBTcGllbGVyLCB6QiBpbiBkZXIgV3Vlc3RlCisgICAgdGhpc19wbGF5ZXIoKS0+UmVjZWl2ZU1zZygiRGllIFNvbm5lIGJyZW5udCBkaXIgYXVmIGRlbiBLb3BmLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVF9GRUVMfE1UX0xPT0spOworCisgICAgIzEuMiBOYWNocmljaHQgYW4gZWluZW4gU3BpZWxlciB2b24gZWluZW0gTlBDIG1pdCBJbmRlbnQKKyAgICAvLyBiZWkgYWt0aXZlbSBFZGl0b3IrS29ib2xkIGxhbmRldCBkaWVzZXIgVGV4dCBhdWNoIGltIEtvYm9sZAorICAgIHRoaXNfcGxheWVyKCktPlJlY2VpdmVNc2coIkR1IGhhdXN0IGphIGdhbnogc2Nob2VuIHJlaW4hIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UX0NPTU18TVRfRkFSfE1TR19ET05UX1NUT1JFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFfVEVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcmtzaGF0IHRlaWx0IGRpciBtaXQ6ICIpOworCisgICAgIzEuMyBOYWNocmljaHQgYW4gZWluZW4gU3BpZWxlciBtaXQgRmFsbGJhY2stS2Fza2FkZQorICAgIC8vIEFjaHR1bmcsIGJlaSBNVF9DT01NIG9kZXIgSWdub3JpZXJlbiBnaWJ0IGVzIG5hdHVlcmxpY2ggYXVjaAorICAgIC8vIE1pc3NlcmZvbGdzLVJ1ZWNrZ2FiZW4uIEJlaSBlaW5lbSBub3JtYWxlbiBLb21tYW5kbyB3aWUgZGllc2VtCisgICAgLy8gaGllciBpc3QgZGFzIHVucHJvYmxlbWF0aXNjaCB1bmQgZGFoZXIgc2lubnZvbGw6CisgICAgaWYodGhpc19wbGF5ZXIoKS0+UmVjZWl2ZU1zZygKKyAgICAgICAgICJEdSBkcnVlY2tzdCBkZW4gS25vcGYgdW5kIGVzIG9lZmZuZXQgc2ljaCBrbmlyc2NoZW5kICIKKyAgICAgICAgICJlaW4ga2xlaW5lcyBGYWNoIGluIGRlciBXYW5kLiIsIE1UX0xPT0spIDwgTVNHX0RFTElWRVJFRCAmJgorICAgICAgIHRoaXNfcGxheWVyKCktPlJlY2VpdmVNc2coCisgICAgICAgICAiRHUgZHJ1ZWNrc3QgZGVuIEtub3BmIHVuZCBpcmdlbmQgZXR3YXMgc2NoZWludCBzaWNoICIKKyAgICAgICAgICJrbmlyc2NoZW5kIHp1IG9lZmZuZW4uIERhcyBHZXJhZXVzY2gga2FtIHZvbiBkZXIgV2FuZC4iLAorICAgICAgICAgTVRfTElTVEVOKSA8IE1TR19ERUxJVkVSRUQpIC8vIGxlaWRlciBibGluZCBVTkQgdGF1YiAuLi4gYWxzbzoKKyAgICAgIHRoaXNfcGxheWVyKCktPlJlY2VpdmVNc2coCisgICAgICAgICJEdSBkcnVlY2tzdCBkZW4gS25vcGYgdW5kIGlyZ2VuZCBldHdhcyBzY2hlaW50IHp1IHBhc3NpZXJlbiwgIgorICAgICAgICAiYWJlciBsZWlkZXIgc2llaHN0IHVuZCBob2Vyc3QgZHUgbmljaHRzLiIsIE1UX0ZFRUwpOworCisKKyAgICAjMi4xIEltIE5QQyBhbHMgRW1wZmFlbmdlciBhdWYgZWluIFRNIHJlYWdpZXJlbgorICAgIHB1YmxpYyB2YXJhcmdzIGludCBSZWNlaXZlTXNnKHN0cmluZyBtc2csIGludCBtc2dfdHlwLCBzdHJpbmcgbXNnX2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbXNnX3ByZWZpeCwgbWl4ZWQgb3JpZ2luKSB7CisgICAgICBpbnQgcmV0ID0gTVNHX0RFTElWRVJFRDsgIC8vIERlZmF1bHQKKworICAgICAgLy8gZWluZSBPT0MtS29tbXVuaWthdGlvbj8KKyAgICAgIGlmKG1zZ190eXAmTVRfQ09NTSkgeworICAgICAgICBpZihzdHJzdHIobXNnLCAiaGlsZmUiKT49MCkKKyAgICAgICAgICBpZihlbnZpcm9ubWVudChvcmlnaW4pPT1lbnZpcm9ubWVudCgpKSB7CisgICAgICAgICAgICBvcmlnaW4tPlJlY2VpdmVNc2coIkljaCB3ZXJkIGRpciBnbGVpY2ggaGVsZmVuISIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVRfQ09NTXxNU0dfRE9OVF9TVE9SRSwgTUFfVEVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXJrc2hhdCB0ZWlsdCBkaXIgbWl0OiAiKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3JpZ2luLT5SZWNlaXZlTXNnKCJIaWxmIGRpciBzZWxic3QsIGRhbm4gaGlsZnQgZGlyIEdvdHQhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVF9DT01NfE1UX0ZBUnxNU0dfRE9OVF9TVE9SRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQV9URUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcmtzaGF0IHRlaWx0IGRpciBtaXQ6ICIpOworICAgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiguLi4pCisgICAgICAgIFsuLi5dCisgICAgICB9IGVsc2UgaWYobXNnX3R5cCZNVF9MSVNURU4gJiYgbXNnX2FjdGlvbj09TUFfU0FZKSB7CisgICAgICAgIFsuLi5dCisgICAgICB9CisKKyAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisKKyAgICAjMy4xIGFscyBTZW5kZXIgYW4gdmllbGUsIFZhcmlhbnRlIG1pdCBlaWdlbmVtIGZpbHRlcgorICAgIC8vIEFjaHR1bmc6IHNpZWhlIDMuMy4gc2VuZF9yb29tKCkgbG9lc3QgdmllbGVzLgorICAgIC8vIExpdmluZyBuaWNrdCBudXIgc2VpbmVuIE5pY2h0Z2VnbmVybiB6dQorICAgIG9iamVjdCAqYWxsID0gZmlsdGVyKGFsbF9pbnZlbnRvcnkoZW52aXJvbm1lbnQodGhpc19wbGF5ZXIoKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICMnbGl2aW5nKSAtICh7dGhpc19wbGF5ZXIoKX0pOworICAgIGFsbCAtPSB0aGlzX3BsYXllcigpLT5QcmVzZW50RW5lbWllcygpOworICAgIGFsbC0+UmVjZWl2ZU1zZyh0aGlzX3BsYXllcigpLT5OYW1lKCkrCisgICAgICAgICAgICAgICAgICAgICIgbmlja3QgZGlyIHZlcnN0b2hsZW4genUgdW5kIHNjaGVpbnQgYmVyZWl0LiIsCisgICAgICAgICAgICAgICAgICAgIE1UX0xPT0ssIE1BX0VNT1RFKTsKKworICAgICMzLjIgYWxzIFNlbmRlciBhbiB2aWVsZSwgVmFyaWFudGUgbWl0IGVpbnplbG5lbSBJdGVyaWVyZW4KKyAgICAvLyBBY2h0dW5nOiBzaWVoZSAzLjMuIHNlbmRfcm9vbSgpIGxvZXN0IHZpZWxlcy4KKyAgICAvLyBMaXZpbmcgdHJpbmt0IGV0d2FzLCBqZWRlciBpbSBSYXVtIHNvbGwgZXMgc2VoZW4gb2RlciBob2VyZW4KKyAgICBvYmplY3Qgb2IgPSBmaXJzdF9pbnZlbnRvcnkoZW52aXJvbm1lbnQodGhpc19wbGF5ZXIoKSkpOworICAgIGRvIHsKKyAgICAgIGlmKGxpdmluZyhvYikgJiYgb2IhPXRoaXNfcGxheWVyKCkpCisgICAgICAgIG9iLT5SZWNlaXZlTXNnKHRoaXNfcGxheWVyKCktPk5hbWUoKSsiIHRyaW5rdCBlaW5lbiBTY2huYXBzIGF1cy4iLAorICAgICAgICAgICAgICAgICAgICAgICBNVF9MT09LfE1UX0xJU1RFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgTUFfRFJJTkspOworICAgICAgb2IgPSBuZXh0X2ludmVudG9yeShvYik7CisgICAgfSB3aGlsZShvYik7CisKKyAgICAjMy4zIGFscyBTZW5kZXIgYW4gdmllbGUsIFZhcmlhbnRlIG1pdCBzZW5kX3Jvb20KKyAgICAvLyBMaXZpbmcgZ3J1ZXNzdCBzZWluZSBGcmV1bmRlCisgICAgLy8gc2VuZF9yb29tKCkgcnVmdCBSZWNlaXZlTXNnIG1pdCBhbGxlbiBlbnRzcHJlY2hlbmRlbiBQYXJhbWV0ZXJuCisgICAgb2JqZWN0ICpleGNsdWRlID0gdGhpc19wbGF5ZXIoKS0+UHJlc2VudEVuZW1pZXMoKTsKKyAgICBzZW5kX3Jvb20odGhpc19vYmplY3QoKSwKKyAgICAgICAgICAgICAgdGhpc19wbGF5ZXIoKS0+TmFtZSgpKyIgZ3J1ZXNzdCBkaWNoLiIsCisgICAgICAgICAgICAgIE1UX0xPT0t8TVRfTElTVEVOLAorICAgICAgICAgICAgICBNQV9FTU9URSwKKyAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgZXhjbHVkZSk7CisKKyAgICAjMy40IGFscyBTZW5kZXIgYW4gdmllbGUgbWl0IHNlbmRfcm9vbSB1bmQgUmVjZWl2ZU1zZygpCisgICAgLy8gTGl2aW5nIGdydWVzc3Qgc2VpbmUgRnJldW5kZSwgc2VpbmUgRmVpbmRlIHNlaGVuIGRhcworICAgIC8vIHNlbmRfcm9vbSgpIHJ1ZnQgUmVjZWl2ZU1zZyBtaXQgYWxsZW4gZW50c3ByZWNoZW5kZW4gUGFyYW1ldGVybgorICAgIG9iamVjdCAqZXhjbHVkZSA9IHRoaXNfcGxheWVyKCktPlByZXNlbnRFbmVtaWVzKCk7CisgICAgc2VuZF9yb29tKHRoaXNfb2JqZWN0KCksCisgICAgICAgICAgICAgIHRoaXNfcGxheWVyKCktPk5hbWUoKSsiIGdydWVzc3QgZGljaC4iLAorICAgICAgICAgICAgICBNVF9MT09LfE1UX0xJU1RFTiwgTUFfRU1PVEUsIDAsIGV4Y2x1ZGUpOworICAgIGV4Y2x1ZGUtPlJlY2VpdmVNZXNzYWdlKAorICAgICAgdGhpc19wbGF5ZXIoKS0+TmFtZSgpKyIgZ3J1ZXNzdCwgYWJlciBuaWNodCBkaWNoLiIsCisgICAgICBNVF9MT09LfE1UX0xJU1RFTiwgTUFfRU1PVEUpOworCitLT05TVEFOVEVOIEZVRVIgUEFSQU1FVEVSOgorICAgIFNhZW10bGljaCBpbiAiL3N5cy9saXZpbmcvY29tbS5oIi4gSGllciBuaWNodCBub3R3ZW5kaWdlcndlaXNlCisgICAgaW1tZXIgYWt0dWVsbCBvZGVyIHZvbGxzdGFlbmRpZy4KKworICAgIDxtc2dfdHlwPgorICAgICAgTVRfVU5LTk9XTiAgICAgIHVuc3Blei4gTmFjaHJpY2h0ZW50eXAgKG5pY2h0IHZlcndlbmRlbikuIEVzIHdpcmQKKyAgICAgICAgICAgICAgICAgICAgICB2ZXJzdWNodCwgYXVmZ3J1bmQgPG1zZ19hY3Rpb24+IGRlbiBUeXAgenUgZXJyYXRlbi4KKyAgICAgIE1UX0xPT0sgICAgICAgICBhbGxlcywgd2FzIG1hbiBzaWVodAorICAgICAgTVRfTElTVEVOICAgICAgIGFsbGVzLCB3YXMgbWFuIGhvZXJ0CisgICAgICBNVF9GRUVMICAgICAgICAgYWxsZXMsIHdhcyBtYW4gZnVlaGx0CisgICAgICBNVF9UQVNURSAgICAgICAgYWxsZXMsIHdhcyBtYW4gc2NobWVja3QKKyAgICAgIE1UX1NNRUxMICAgICAgICBhbGxlcywgd2FzIG1hbiByaWVjaHQKKyAgICAgIE1UX01BR0lDICAgICAgICBhbGxlIHNvbnN0aWdlbiAodWViZXJzaW5ubGljaGVuKSBXYWhybmVobXVuZ2VuCisgICAgICBNVF9OT1RJRklDQVRJT04gU3RhdHVzbWVsZHVuZ2VuLCBLb21tYW5kb2Jlc3RhZXRpZ3VuZ2VuCisgICAgICBNVF9DT01NICAgICAgICAgYWxsZSBPT0MtS29tbXVuaWthdGlvbiwgZC5oLiBuaWNodCBkdXJjaCBvLmcuIFNpbm5lCisgICAgICAgICAgICAgICAgICAgICAgYWJnZWRlY2t0LgorICAgICAgTVRfRkFSICAgICAgICAgIGFsbGVzLCB3YXMgYXVzIGRlciBGZXJuZSAvIGVpbmVtIGFuZGVyZW4gUmF1bSBrb21tdC4KKyAgICAgICAgICAgICAgICAgICAgICBtdXNzIG1pdCBtaW4uIGVpbmVtIGFuZGVyZW4gVHlwIGtvbWJpbmllcnQgd2VyZGVuCisgICAgICBNVF9ERUJVRyAgICAgICAgRGVidWdtZWxkdW5nZW4sIHNlaGVuIG51ciBNYWdpZXIgaW0gTWFnaWVybW9kdXMKKyAgICAgIE1UX05FV1MgICAgICAgICBNYWlscyAmIE1QQQorCisgICAgICBNU0dfRE9OVF9CVUZGRVIgTmFjaHJpY2h0IGRhcmYgbmljaHQgaW0gS29ib2xkIGdlc3BlaWNoZXJ0IHdlcmRlbgorICAgICAgTVNHX0RPTlRfU1RPUkUgIE5hY2hyaWNodCBkYXJmIG5pY2h0IGluIGRpZSBDb21tLUhpc3RvcnkKKyAgICAgIE1TR19ET05UX1dSQVAgICBOYWNocmljaHQgbmljaHQgcGVyIGJyZWFrX3N0cmluZyB1bWJyZWNoZW4KKyAgICAgIE1TR19ET05UX0lHTk9SRSBOYWNocmljaHQga2FubiBuaWNodCBpZ25vcmllcnQgd2VyZGVuCisKKyAgICAgIE1TR19CU19MRUFWRV9MRlMgICAgd2llIEJTX0xFQVZFX01ZX0xGUyBmdWVyIGJyZWFrX3N0cmluZygpCisgICAgICBNU0dfQlNfU0lOR0xFX1NQQUNFIHdpZSBCU19TSU5HTEVfU1BBQ0UgZnVlciBicmVha19zdHJpbmcoKQorICAgICAgTVNHX0JTX0JMT0NLICAgICAgICB3aWUgQlNfQkxPQ0sgZnVlciBicmVha19zdHJpbmcoKQorICAgICAgTVNHX0JTX05PX1BBUklOREVOVCB3aWUgQlNfTk9fUEFSSU5ERU5UIGZ1ZXIgYnJlYWtfc3RyaW5nKCkKKyAgICAgIE1TR19CU19JTkRFTlRfT05DRSAgd2llIEJTX0lOREVOVF9PTkNFIGZ1ZXIgYnJlYWtfc3RyaW5nKCkKKyAgICAgIE1TR19CU19QUkVQX0lOREVOVCAgd2llIEJTX1BSRVBFTkRfSU5ERU5UIGZ1ZXIgYnJlYWtfc3RyaW5nKCkKKworICAgIDxtc2dfYWN0aW9uPiAob3B0aW9uYWwpCisgICAgICBNQV9VTktOT1dOICAgICBVbnNwZXouIEFrdGlvbi4gRXMgd2lyZCBkZXIgRGVmYXVsdCBxdWVyeV92ZXJiKCkKKyAgICAgICAgICAgICAgICAgICAgIGJlbnV0enQgYnp3LiB2ZXJzdWNodCwgZGllIEFrdGlvbiB6dSBlcnJhdGVuLgorICAgICAgTUFfUFVUICAgICAgICAgSmVtYW5kIGxlZ3QgZXR3YXMgaGluIHVuZCBnaWJ0IGplbWFuZGVuIGV0d2FzCisgICAgICBNQV9UQUtFICAgICAgICBKZW1hbmQgbmltbXQgZXR3YXMKKyAgICAgIE1BX01PVkVfSU4gICAgIEplbWFuZCBiZXRyaXR0IGRlbiBSYXVtCisgICAgICBNQV9NT1ZFX09VVCAgICBKZW1hbmQgdmVybGFlc3N0IGRlbiBSYXVtCisgICAgICBNQV9NT1ZFICAgICAgICBKZW1hbmQgYmV3ZWd0IHNpY2ggCisgICAgICBNQV9GSUdIVCAgICAgICBKZW1hbmQga2FlbXBmdAorICAgICAgTUFfV0lFTEQgICAgICAgSmVtYW5kIHp1ZWNrdCBlaW5lIFdhZmZlCisgICAgICBNQV9VTldJRUxEICAgICBKZW1hbmQgc3RlY2t0IGVpbmUgV2FmZmUgd2VnCisgICAgICBNQV9XRUFSICAgICAgICBKZW1hbmQgemllaHQgZXR3YXMgYW4KKyAgICAgIE1BX1VOV0VBUiAgICAgIEplbWFuZCB6aWVodCBldHdhcyBhdXMKKyAgICAgIE1BX0VBVCAgICAgICAgIEplbWFuZCBpc3N0IGV0d2FzCisgICAgICBNQV9EUklOSyAgICAgICBKZW1hbmQgdHJpbmt0IGV0d2FzCisgICAgICBNQV9TUEVMTCAgICAgICBKZW1hbmQgd2lya3QgZWluZW4gU3BlbGwKKyAgICAgIE1BX0xPT0sgICAgICAgIEplbWFuZCBzaWVodCBldHdhcyBhbiwgdW50ZXJzdWNodCBldHdhcworICAgICAgTUFfTElTVEVOICAgICAgSmVtYW5kIGhvcmNodCBvZGVyIGxhdXNjaHQgYW4gZXR3YXMKKyAgICAgIE1BX0ZFRUwgICAgICAgIEplbWFuZCBiZXRhc3RldCBldHdhcworICAgICAgTUFfU01FTEwgICAgICAgSmVtYW5kIHNjaG51ZWZmZWx0IGhlcnVtCisgICAgICBNQV9TRU5TRSAgICAgICBKZW1hbmQgbWFjaHQgZWluZSB1ZWJlcnNpbm5saWNoZSBXYWhybmVobXVuZworICAgICAgTUFfUkVBRCAgICAgICAgSmVtYW5kIGxpZXN0IGV0d2FzCisgICAgICBNQV9VU0UgICAgICAgICBKZW1hbmQgYmVudXR6dCBldHdhcworICAgICAgTUFfU0FZICAgICAgICAgSmVtYW5kIHNhZ3QgZXR3YXMKKyAgICAgIE1BX1JFTU9WRSAgICAgIEV0d2FzIHZlcnNjaHdpbmRldAorICAgICAgLy8gTUFfQ0hBVCAgICAgICAgQ2hhdGtyYW1zICh6LkIuIHRlaWxlLW1pdCwgVGVhbWthbXBmY2hhdCkKKyAgICAgIE1BX0NIQU5ORUwgICAgIEViZW5lbgorICAgICAgTUFfRU1PVEUgICAgICAgKHIpRW1vdGVzLCBTb3VsdmVyYmVuIChyZW1vdGVzIG1pdCBUeXAgTVRfQ09NTXxNVF9GQVIpCisgICAgICBNQV9TSE9VVCAgICAgICBSdWZlbiAobmljaHQ6IHNob3V0KCkhKQorICAgICAgTUFfU0hPVVRfU0VGVU4gUnVmZW4gdWViZXIgc2hvdXQoU0UpCisKK1NJRUhFIEFVQ0g6CisgICAgVmVyd2FuZHQ6IHNlbmRfcm9vbShTRSkKKyAgICBMZnVuczogICAgVGVzdElnbm9yZShMKQorICAgIEVmdW5zOiAgICB0ZWxsX29iamVjdChFKSwgY2F0Y2hfdGVsbChMKSwgY2F0Y2hfbXNnKEwpCisgICAgICAgICAgICAgIHF1ZXJ5X3ZlcmIoRSksIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoRSksIGJyZWFrX3N0cmluZyhTRSkKKworMTMuMDMuMjAxNiwgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9SZWdpc3RlckV2ZW50IGIvZG9jL2xmdW4vUmVnaXN0ZXJFdmVudApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmM1ZDhkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vUmVnaXN0ZXJFdmVudApAQCAtMCwwICsxLDgyIEBACisKK0ZVTktUSU9OOgorICAgICBpbnQgUmVnaXN0ZXJFdmVudChzdHJpbmcgZWlkLCBzdHJpbmcgZnVuLCBvYmplY3QgbGlzdGVuZXIpOworCitERUZJTklFUlQgSU46CisgICAgIC9wL2RhZW1vbi9ldmVudGQuYworREVLTEFSSUVSVCBJTjoKKyAgICAgL3N5cy9ldmVudHMuaAorCitBUkdVTUVOVEU6CisgICAgIHN0cmluZyBlaWQsCisgICAgICAgRGllIElEIGRlcyBFdmVudHMsIGZ1ZXIgZGVuIG1hbiBzaWNoIHJlZ2lzdHJpZXJlbiB3aWxsLiBEYSBkaWVzZXIKKyAgICAgICBTdHJpbmcgZnVlciBhbGxlIEV2ZW50cyBqZXdlaWxzIGVpbmRldXRpZyBzZWluIG11c3MsIGVtcGZpZWhsdCBlcyBzaWNoLAorICAgICAgIGZ1ZXIgZWlnZW5lIEV2ZW50cyB6LkIuIGFscyBQcmFlZml4IGRlbiBlaWdlbmVuIE1hZ2llcm5hbWVuIHp1IG5laG1lbiwKKyAgICAgICB6LkIuICJ6ZXNzdHJhX3Z1bGthbmF1c2JydWNoIi4KKyAgICAgICBBQ0hUVU5HOiBJRHMsIGRpZSBtaXQgJ19ldnRfbGliXycgYmVnaW5uZW4sIHNpbmQgQVVTU0NITElFU1NMSUNIIGRlcgorICAgICAgIE11ZGxpYiB2b3JiZWhhbHRlbiEKKyAgICAgc3RyaW5nIGZ1biwKKyAgICAgICBOYW1lIGRlciBGdW5rdGlvbiwgZGllIGltIE9iamVrdCBsaXN0ZW5lciBiZWkgQXVmdHJldGVuIGRlcyBFdmVudHMKKyAgICAgICBnZXJ1ZmVuIHdlcmRlbiBzb2xsLgorICAgICBvYmplY3QgbGlzdGVuZXIsCisgICAgICAgRGFzIE9iamVrdCwgZGFzIGFscyBMYXVzY2hlciBmdWVyIGRpZXNlbiBFdmVudCByZWdpc3RyaWVydCB3ZXJkZW4gc29sbC4KKworQkVTQ0hSRUlCVU5HOgorICAgICBEYXMgT2JqZWt0ICdsaXN0ZW5lcicgd2lyZCBhbHMgTGF1c2NoZXIgZGllc2VzIEV2ZW50cyByZWdpc3RyaWVydC4gQWIKKyAgICAgZGllc2VtIE1vbWVudCB3aXJkIGltbWVyIGRhbm4sIHdlbm4gZWluIEV2ZW50IG1pdCBkZXIgSUQgJ2VpZCcgYXVzZ2Vsb2VzdAorICAgICB3aXJkLCBpbiAnbGlzdGVuZXInIGRpZSBGdW5rdGlvbiAnZnVuJyBhdWZnZXJ1ZmVuICh6ZWl0dmVyem9lZ2VydCwgbWVpc3QKKyAgICAgMC0ycykuCisgICAgIAorICAgICBEaWUgRnVua3Rpb24gd2lyZCBkYWJlaSBpbW1lciBtaXQgMyBBcmd1bWVudGVuIGF1ZmdlcnVmZW46CisgICAgIGxpc3RlbmVyLT5mdW4oZWlkLCB0cmlnZ2Vyb2IsIGRhdGEpOworICAgICBIaWVyYmVpIGlzdCAnZWlkJyBkaWUgamV3ZWlsaWdlIEV2ZW50LUlEIHVuZCAndHJpZ2dlcm9iJyBpc3QgZGFzIE9iamVrdCwKKyAgICAgd2VsY2hlcyBkZW4gRXZlbnQgYXVzbG9lc3RlLiAKKyAgICAgJ2RhdGEnIGthbm4gamVkZXIgTFBDLURhdGVudHlwIHNlaW4gdW5kIGVudGhhZWx0IGRpZSBEYXRlbiwgZGllIGRhcworICAgICB0cmlnZ2VybmRlIE9iamVrdCBhbiBhbGxlIExpc3RlbmVyIHVlYmVybWl0dGVsbiB3aWxsIChkYW1pdCBzaW5kIERhdGVudHlwCisgICAgIHVuZCBJbmhhbHQga29tcGxldHQgYWJoYWVuZ2lnIHZvbSBFdmVudCEpCisKKyAgICAgRXhpc3RpZXJ0IGJpc2hlciBub2NoIGtlaW4gRXZlbnQgbWl0IGRlciBJRCAnZWlkJywgd2lyZCBpbXBsaXppdCBlaW4KKyAgICAgbmV1ZXIgRXZlbnQgZXJzdGVsbHQsIGRlciBlcnN0bWFsIG51ciBkYXMgc2ljaCBnZXJhZGUgcmVnaXN0cmllcmVuZGUKKyAgICAgT2JqZWt0IGFscyBMYXVzY2hlciBoYXQuCisKKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgMSBmdWVyIEVyZm9sZywgPD0wIGZ1ZXIgTWlzc2VyZm9sZy4KKyAgICAgMSAgIC0gRXJmb2xnLCAnbGlzdGVuZXInIHd1cmRlIGVpbmdldHJhZ2VuLgorICAgICAtMSAgLSBmYWxzY2hlIEFyZ3VtZW50ZSB3dXJkZW4gdWViZXJnZWJlbgorICAgICAtMiAgLSBuaWNodC1vZWZmZW50bGljaGVyIEV2ZW50IHVuZCAnbGlzdGVuZXInIHd1cmRlIG5pY2h0IGZ1ZXIgZGllc2VuCisgICAgICAgICAgIEV2ZW50IGZyZWlnZWdlYmVuIChtb21lbnRhbiBnaWJ0IGVzIG5vY2gga2VpbmUgbmljaHQtb2VmZmVudGxpY2hlbgorICAgICAgICAgICBFdmVudHMpCisgICAgIC0zICAtICdmdW4nIGluICdsaXN0ZW5lcicgaXN0IG5pY2h0IHZvcmhhbmRlbiBvZGVyIG5pY2h0IHZvbiBhdXNzZW4gCisgICAgICAgICAgIGF1ZnJ1ZmJhciAocHJvdGVjdGVkLCBzdGF0aWMsIHByaXZhdGUpLgorICAgICAKK0JFTUVSS1VOR0VOOgorICAgICBXZW5uICdsaXN0ZW5lcicgYmVyZWl0cyBmdWVyIGRlbiBFdmVudCByZWdpc3RyaWVydCB3aXJkLCB3aXJkIGRpZSBhbHRlCisgICAgIFJlZ2lzdHJpZXJ1bmcgdWViZXJzY2hyaWViZW4gKGFscyBnZ2YuIGdpbHQgZGFubiBkZXIgamV0enQgdWViZXJnZWJlbmUKKyAgICAgRnVua3Rpb25zbmFtZSkuCisgICAgIERpZSBGdW5rdGlvbiAnZnVuJyBzb2xsdGUgc3BhcnNhbSBtaXQgZGVuIEV2YWwtVGlja3MgdW1nZWhlbi4gTW9tZW50YW4KKyAgICAgaXN0IGRpZSBtYXguIE1lbmdlIGFuIFRpY2tzIGF1ZiAzMDAwMCBiZXNjaHJhZW5rdC4gRGllcyBrYW5uIGJlaQorICAgICBQcm9ibGVtZW4gYXVjaCBqZWRlcnplaXQgcmVkdXppZXJ0IHdlcmRlbiEKKyAgICAgRGVyIEVWRU5URCBtZXJrdCBzaWNoIEV2ZW50LUxhdXNjaGVyIG5pY2h0IHVlYmVyIFJlYm9vdHMgaGluYXVzLgorICAgICBTb2xsdGUgc2ljaCBlaW5lIEJsdWVwcmludCBhbm1lbGRlbiwgc2ljaCB6ZXJzdG9lcmVuIHVuZCBuZXVnZWxhZGVuCisgICAgIHdlcmRlbiwgaXN0IGRpZSBuZXVlIEJsdWVwcmludCBub2NoIGFuZ2VtZWxkZXQsIHdlaWwgZGFzIG5ldWUgT2JqZWt0CisgICAgIHVudGVyIGRlbSBhbHRlbiBOYW1lbiB3aWVkZXJnZWZ1bmRlbiB3aXJkLiBEaWVzIGdpbHQgX25pY2h0XyBmdWVyCisgICAgIENsb25lcyEKKworQkVJU1BJRUxFOgorICAgICAxLiBFaW4gT2JqZWt0IG1vZWNodGUgdWViZXIgU3BpZWxlcnRvZGUgaW5mb3JtaWVydCB3ZXJkZW46CisgICAgICAgICAgRVZFTlRELT5SZWdpc3RlckV2ZW50KEVWVF9MSUJfUExBWUVSX0RFQVRILCAic3BpZWxlcl9pc3RfdG90IiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfb2JqZWN0KCkpOworICAgICAgICBBYiBqZXR6dCB3aXJkIGltIE9iamVrdCBqZWRlcyBNYWwsIHdlbm4gZWluIFNwaWVsZXIgc3RpcmJ0LCBkaWUgCisgICAgICAgIEZ1bmt0aW9uICJzcGllbGVyX2lzdF90b3QiIGF1ZmdlcnVmZW4uCisKKyAgICAgMi4gRWluIE9iamVrdCB3aWxsIGluZm9ybWllcnQgd2VyZGVuLCB3ZW5uIGRlciBFdmVudAorICAgICAgICAiYm9pbmdfendlcmdlbmtvZW5pZ19hbmdyaWZmIiBhdXNnZWxvZXN0IHdpcmQ6CisgICAgICAgICAgIEVWRU5URC0+UmVnaXN0ZXJFdmVudCgiYm9pbmdfendlcmdlbmtvZW5pZ19hbmdyaWZmIiwiYWxhcm0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfb2JqZWN0KCkpOworCitTSUVIRSBBVUNIOgorICAgICBldmVudHMsIGV2ZW50ZCwgVW5yZWdpc3RlckV2ZW50KCksIFRyaWdnZXJFdmVudCgpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IDE1LjA4LjIwMDcsIFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1JlZ2lzdGVySGVscGVyTlBDIGIvZG9jL2xmdW4vUmVnaXN0ZXJIZWxwZXJOUEMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcwZThiMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL1JlZ2lzdGVySGVscGVyTlBDCkBAIC0wLDAgKzEsODcgQEAKK1JlZ2lzdGVySGVscGVyTlBDKCkKK0ZVTktUSU9OOgorICAgICBwdWJsaWMgaW50IFJlZ2lzdGVySGVscGVyTlBDKG9iamVjdCBucGMsIGludCBmbGFncyk7CisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC9wbGF5ZXIvY29tYmF0LmMKKyAgICAgL3N5cy9saXZpbmcvY29tYmF0LmgKKworQVJHVU1FTlRFOgorICAgICBvYmplY3QgbnBjCisgICAgICAgT2JqZWt0IGRlcyBoZWxmZW5kZW4gTlBDLCBkZXIgYW5nZW1lbGRldCB3ZXJkZW4gc29sbC4KKworICAgICBpbnQgZmxhZ3MKKyAgICAgICB2ZXItb2Rlci10ZSBLb25zdGFudGVuLCBkaWUgZGllIEFydCBkZXMgSGVsZmVyLU5QQyBiZXNjaHJlaWJlbiAocy51LikKKworQkVTQ0hSRUlCVU5HOgorICAgICBNaXQgZGllc2VyIEZ1bmt0aW9uIHdpcmQgZWluIGVpbmVtIFNwaWVsZXIgaGVsZmVuZGVyIE5QQyBpbSBTcGllbGVyCisgICAgIGFuZ2VtZWxkZXQuIEhpZXJkdXJjaCBrYW5uIHNwYWV0ZXIgaGVyYXVzZ2VmdW5kZW4gd2VyZGVuLCB3ZWxjaGUgTlBDCisgICAgIGVpbmVtIFNwaWVsZXIgaGVsZmVuIHVuZCBnZ2YuIGRlbiB2b24gZGllc2VuIHZlcnVyc2FjaHRlbiBTY2hhZGVuIGltCisgICAgIEthbXBmIGRlbSBTcGllbGVyIHp1enVyZWNobmVuLgorCisgICAgIERpZSBGbGFncyBzaW5kIGVpbmUgZGVyIGZvbGdlbmRlbiBLb25zdGFudGVuIG9kZXIgZWluZSBiZWxpZWJpZ2UgZHVyY2gKKyAgICAgdmVyLW9kZXItdW5nIGdlYmlsZGV0ZSBLb21iaW5hdGlvbi4KKworICAgICBNb21lbnRhbiBnaWJ0IGVzIDIgS2xhc3NlbiB2b24gSGVsZmVyLU5QQzoKKyAgICAgKyBHVUlMRF9IRUxQRVI6IGRlciBIZWxmZXItTlBDIGlzdCBlaW4gR2lsZGVuLU5QQworICAgICArIE1JU0NfSEVMUEVSOiAgZGVyIEhlbGZlci1OUEMgaXN0IGlyZ2VuZGVpbiBOUEMsIGRlciBuaWNodCB6dSBlaW5lciBHaWxkZQorICAgICAgICAgICAgICAgICAgICAgZ2Vob2VydC4KKworICAgICBadXNhZXR6bGljaCB6dSBkZW4gS2xhc3NlbiBnaWJ0IGVzIG5vY2ggd2VpdGVyZSBGbGFncywgZGllIGV0d2FzIHVlYmVyCisgICAgIGRlbiBIZWxmZXItTlBDIHNhZ2VuOgorCisgICAgICsgRVhDTFVTSVZFX0hFTFBFUjogZGllc2VyIEhlbGZlci1OUEMgZHVsZGV0IGtlaW5lbiB3ZWl0ZXJlbiBOUEMgZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2xlaWNoZW4gS2xhc3NlLgorICAgICArIEFDVElWRV9IRUxQRVI6IGlzdCBkaWVzZXMgRmxhZyBnZXNldHp0LCBpc3QgZGVyIE5QQyBtZWhyIGFscyBudXIgcmVpbmVyCisgICAgICAgICAgICAgICAgICAgICAgU2NobGFnZmFlbmdlci4KKworICAgICBXaXJkIEVYQ0xVU0lWRV9IRUxQRVIgZ2VzZXR6dCB1bmQgZXMgaXN0IGluIGRlciBnbGVpY2hlbiBLbGFzc2Ugc2Nob24gZWluCisgICAgIE5QQyBhbmdlbWVsZGV0LCBzY2hsYWVndCBkaWUgUmVnaXN0cmllcnVuZyBmZWhsLgorICAgICBJc3QgaW4gZGVyIGdsZWljaGVuIEtsYXNzZSBiZXJlaXRzIGVpbiBOUEMgbWl0IEVYQ0xVU0lWRV9IRUxQRVIKKyAgICAgYW5nZW1lbGRldCwgc2NobGFlZ3QgZGllIFJlZ2lzdGllcnVuZyBlYmVuZmFsbHMgZmVobCwgYXVjaCB3ZW5uIGRlciBuZXVlCisgICAgIE5QQyBrZWluIEVYQ0xVU0lWRV9IRUxQRVIgc2V0enQuCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIDEsIHdlbm4gZGllIFJlZ2lzdHJpZXJ1bmcgZXJmb2xncmVpY2ggd2FyLgorICAgICAwIHNvbnN0LiBJbiBkaWVzZW0gRmFsbCBkYXJmIGRlciBOUEMgZGVtIFNwaWVsZXIgTklDSFQgaGVsZmVuLCB3ZWRlcgorICAgICAgIHBhc3NpdiAoU2NobGFnZmFlbmdlciksIG5vY2ggYWt0aXYuCisKK0JFTUVSS1VOR0VOOgorICAgICBEaWVzZSBGdW5rdGlvbiBzZXR6dCBiZWkgZGVyIEVyZm9sZyBkaWUgUHJvcGVydHkgUF9IRUxQRVJfTlBDIGluIDxucGM+CisgICAgIGF1ZiBwYXNzZW5kZSBXZXJ0ZS4KKyAgICAgQml0dGUgYXVmIGdhciBrZWluZW4gRmFsbCBkaWUgbnVtZXJpc2NoZW4gV2VydGUgZGVyIEtvbnN0YW50ZW4gZnVlcgorICAgICA8ZmxhZ3M+IG51dHplbiwgZGllc2Uga29lbm5lbiBzaWNoIGplZGVyemVpdCBhZW5kZXJuLgorCitCRUlTUElFTEU6CisgICAgIDEuIEVpbiBuaWNodC1leGtsdXNpdmVyIEdpbGRlbi1OUEMsIGRlciBkZW0gU3BpZWxlciBmb2xndC4KKyAgICAgaWYgKHNwaWVsZXItPlJlZ2lzdGVySGVscGVyTlBDKHRoaXNfb2JqZWN0KCksIEdVSUxEX0hFTFBFUikgPT0gMSkgeworICAgICAgIG1vdmUoZW52aXJvbm1lbnQoc3BpZWxlciksIE1fR08pOworICAgICAgIHNwaWVsZXItPkFkZFB1cnN1ZXIodGhpc19vYmplY3QoKSk7CisgICAgICAgLy8gbWVsZHVuZyBhdXNnZWJlbmUuLi4KKyAgICAgfQorCisgICAgIDJhLiBFaW4gZXhrbHVzaXZlciBOaWNodC1HaWxkZW4tTlBDCisgICAgIGlmIChzcGllbGVyLT5SZWdpc3RlckhlbHBlck5QQyh0aGlzX29iamVjdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlTQ19IRUxQRVJ8RVhDTFVTSVZFX0hFTFBFUikgPT0gMSkgeworICAgICAgIG1vdmUoZW52aXJvbm1lbnQoc3BpZWxlciksIE1fR08pOworICAgICB9CisKKyAgICAgMmIuIEVpbiBuaWNodC1leGtsdXNpdmVyIE5pY2h0LUdpbGRlLU5QQywgZGVyIG5hY2ggMmEuIGtvbW10LgorICAgICBpZiAoc3BpZWxlci0+UmVnaXN0ZXJIZWxwZXJOUEModGhpc19vYmplY3QoKSwgTUlTQ19IRUxQRVIpID09IDEpIHsKKyAgICAgICAvLyAuLi4gd2VubiBkZXIgTlBDIGF1cyAyYSBub2NoIGV4aXN0aWVydCwgdHJpZmZ0IGRpZXMgaGllciBuaWUgenUuCisgICAgIH0KKworICAgICAzLiBFaW4gZXhrbHVzaXZlciBOUEMsIGRlciB3ZWl0ZXJlIEdpbGRlbi0gdW5kIHNvbnN0aWdlIE5QQyBhdXNzY2hsaWVzc3QKKyAgICAgICAgKFNvbGNoZSBLb21iaW5hdGlvbiBiaXR0ZSBtaXQgZGVyIEdpbGRlbi1CYWxhbmNlIGFic3RpbW1lbi4pCisgICAgIGlmIChzcGllbGVyLT5SZWdpc3RlckhlbHBlck5QQyh0aGlzX29iamVjdCgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSVNDX0hFTFBFUnxHVUlMRF9IRUxQRVJ8RVhDTFVTSVZFX0hFTFBFUikgPT0gMSkgeworICAgICAgIG1vdmUoZW52aXJvbm1lbnQoc3BpZWxlciksIE1fR08pOworICAgICB9CisKKyAgICAgNC4gRGllIFJlZ2lzdHJpZXJ1bmcgb2huZSBLbGFzc2Ugc2NobGFlZ3QgZmVobCwgei5CLjoKKyAgICAgICBzcGllbGVyLT5SZWdpc3RlckhlbHBlck5QQyh0aGlzX29iamVjdCgpLCAwKTsKKyAgICAgICBzcGllbGVyLT5SZWdpc3RlckhlbHBlck5QQyh0aGlzX29iamVjdCgpLCBFWENMVVNJVkVfSEVMUEVSKTsKKworU0lFSEUgQVVDSDoKKyAgICBVbnJlZ2lzdGVySGVscGVyTlBDKCkKKyAgICBQX0hFTFBFUl9OUEMKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1JlZ2lzdGVySGVscGVyT2JqZWN0IGIvZG9jL2xmdW4vUmVnaXN0ZXJIZWxwZXJPYmplY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWExY2I2NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL1JlZ2lzdGVySGVscGVyT2JqZWN0CkBAIC0wLDAgKzEsMTEzIEBACisKK0ZVTktUSU9OOgorICAgICBpbnQgUmVnaXN0ZXJIZWxwZXJPYmplY3Qob2JqZWN0IGhlbHBlciwgaW50IHR5cGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nfGNsb3N1cmUgY2FsbGJhY2spOworCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvbGl2aW5nL2hlbHBlcnMuYworCitBUkdVTUVOVEU6CisgICAgIG9iamVjdCBoZWxwZXIKKyAgICAgICBEYXMgT2JqZWt0LCBkYXMgYmVpIGVpbmVtIExlYmV3ZXNlbiBhbHMgSGlsZnNvYmpla3QgcmVnaXN0cmllcnQgCisgICAgICAgd2VyZGVuIHNvbGwuIERhcyBPYmpla3QgbXVzcyBzaWNoIGRhenUgbmljaHQgaW0gSW52ZW50YXIgZGVzCisgICAgICAgTGViZXdlc2VucyBiZWZpbmRlbi4KKyAgICAgaW50IHR5cGUKKyAgICAgICBIZWxmZXJ0eXAsIGVpbmVyIGRlciBpbiAvc3lzL2xpdmluZy9oZWxwZXJzLmggZGVmaW5pZXJ0ZW4gVHlwZW46CisgICAgICAgLSBIRUxQRVJfVFlQRV9BRVJJQUwgZnVlciBkaWUgRmx1Zy0vU2VnZWx1bnRlcnN0dWV0enVuZworICAgICAgIC0gSEVMUEVSX1RZUEVfQVFVQVRJQyBmdWVyIFRhdWNodW50ZXJzdHVldHp1bmcKKyAgICAgc3RyaW5nfGNsb3N1cmUgY2FsbGJhY2sKKyAgICAgICAgQ2xvc3VyZSBvZGVyIEZ1bmt0aW9uc25hbWUgYWxzIFN0cmluZzsgZGllcyBpc3QgZGllIEZ1bmt0aW9uLCBkaWUgaW0KKyAgICAgICAgT2JqZWt0IGhlbHBlciBnZXJ1ZmVuIHdpcmQsIHVtIGFienVmcmFnZW4sIG9iIGVzIHNpY2ggYWt0dWVsbCBmdWVyCisgICAgICAgIHp1c3RhZW5kaWcgZXJrbGFlcnQgb2RlciBuaWNodC4KKworQkVTQ0hSRUlCVU5HOgorICAgICBEYXMgT2JqZWt0ICJoZWxwZXIiIHdpcmQgYWxzIEhpbGZzb2JqZWt0IGZ1ZXIgYmVzdGltbXRlIEFrdGl2aXRhZXRlbiB3aWUKKyAgICAgenVtIEJlaXNwaWVsIEZsaWVnZW4gb2RlciBUYXVjaGVuIHJlZ2lzdHJpZXJ0LiAKKyAgICAgCisgICAgIERpZSBhbHMgQ2FsbGJhY2sgdWViZXJnZWJlbmUgRnVua3Rpb24gd2lyZCBiZWkgZGVyIEFiZnJhZ2UgZGVyIAorICAgICBQXypfSEVMUEVSUy1Qcm9wZXJ0aWVzIChzaWVoZSB1bnRlbikgYXVmZ2VydWZlbiB1bmQgZGVyZW4gCisgICAgIFJ1ZWNrZ2FiZXdlcnQgaW4gZGVyIFByb3BlcnR5IHZlcm1lcmt0LiAKKyAgICAgCisgICAgIERlciBSdWVja2dhYmV3ZXJ0IGRlciBDYWxsYmFjay1NZXRob2RlIG11c3MgaW0gV2VydGViZXJlaWNoIAorICAgICAwLi4xMDAwMCBsaWVnZW4sIHdvYmVpIGVpbiBXZXJ0IHZvbiAwIGJlZGV1dGV0LCBkYXNzIGRhcyBIaWxmc29iamVrdCAKKyAgICAgc2ljaCBnZXJhZGUgbmljaHQgenVzdGFlbmRpZyBmdWVobHQuIEJlaSBkZW4gV2VydGVuID4wIGlzdCBlcyBkZW0gCisgICAgIGFiZnJhZ2VuZGVuIE9iamVrdCB1ZWJlcmxhc3Nlbiwgd2llIGVzIGRpZXNlIERhdGVuIGJld2VydGV0LgorCisgICAgIERpZSBGdW5rdGlvbiBtdXNzIGV4aXN0aWVyZW4gdW5kIHB1YmxpYyBzZWluLCBkLmguIHZvbiBhdXNzZW4gZ2VydWZlbiAKKyAgICAgd2VyZGVuIGtvZW5uZW4uCisgICAgIAorICAgICBEaWUgRnVua3Rpb24gYmVrb21tdCBkYXMgU3BpZWxlcm9iamVrdCB1bmQgZGFzIGFiZnJhZ2VuZGUgT2JqZWt0IGFscworICAgICBQYXJhbWV0ZXIgdWViZXJnZWJlbi4KKworSElOV0VJUzoKKyAgICAgRXMgaXN0IGVpbiBVbnRlcnNjaGllZCwgb2Igc2ljaCBlaW4gT2JqZWt0IHZpYSBVbnJlZ2lzdGVySGVscGVyT2JqZWN0KCkKKyAgICAgYWxzIEhlbGZlciBhdXN0cmFlZ3QsIG9kZXIgb2IgZGVyIEF1ZnJ1ZiBkZXIgQ2FsbGJhY2stRnVua3Rpb24gZWluZQorICAgICAwIHp1cnVlY2tnaWJ0LiBJbSBsZXR6dGVyZW4gRmFsbCBpc3QgZGFzIE9iamVrdCBuYWNoIHdpZSB2b3IgCisgICAgIHJlZ2lzdHJpZXJ0IHVuZCBrYW5uIHRyb3R6ZGVtIHZvbSBhYmZyYWdlbmRlbiBPYmpla3QgYWxzIAorICAgICBmdW5rdGlvbnNmYWVoaWcgYW5nZXNlaGVuIHdlcmRlbi4KKworUlVFQ0tHQUJFV0VSVEU6CisgICAgICAxICBPYmpla3Qgd3VyZGUgZXJmb2xncmVpY2ggcmVnaXN0cmllcnQgKEhFTFBFUl9TVUNDRVNTKQorICAgICAtMSAgYW5nZWdlYmVuZXMgSGlsZnNvYmpla3QgZXhpc3RpZXJ0IG5pY2h0IChIRUxQRVJfTk9fQ0FMTEJBQ0tfT0JKRUNUKQorICAgICAtMiAgYW5nZWdlYmVuZXMgSGlsZnNvYmpla3QgaXN0IGJlcmVpdHMgZnVlciBkaWVzZSBBcnQgZGVyCisgICAgICAgICBVbnRlcnN0dWV0enVuZyByZWdpc3RyaWVydCAoSEVMUEVSX0FMUkVBRFlfTElTVEVEKQorCitCRUlTUElFTEU6CisgICAgIGEpIEVpbmUgbHVmdGdlZnVlbGx0ZSBCbGFzZSB3aWxsIHNpY2ggYWxzIFRhdWNoLUhlbGZlciBhbSBTcGllbGVyCisgICAgIGFubWVsZGVuIHVuZCBpc3QgenVzdGFlbmRpZywgc29sYW5nZSBzaWNoIG5vY2ggTHVmdCBpbiBpaHIgYmVmaW5kZXQ6CisKKyAgICAgaW50IGx1ZnQgPSA1OyAvLyBnbG9iYWxlIFZhcmlhYmxlIHouQi4gZnVlciBMdWZ0aW5oYWx0IHZvbiA1IEF0ZW16dWVnZW4KKworICAgICAvLyBSZWdpc3RyaWVydW5nIGltIFNwaWVsZXJvYmpla3QKKyAgICAgaWYgKCBUUC0+UmVnaXN0ZXJIZWxwZXJPYmplY3QoTUUsIEhFTFBFUl9UWVBFX0FRVUFUSUMsCisgICAgICAgICAgIkRpdmluZ0NhbGxiYWNrIikgPT0gSEVMUEVSX1NVQ0NFU1MgKSB7CisgICAgICAgdGVsbF9vYmplY3QoVFAsICJEdSBrYW5uc3QgamV0enQgbWl0IEhpbGZlIGRlciBMdWZ0Ymxhc2UgdW50ZXIgV2Fzc2VyICIKKyAgICAgICAgICJhdG1lbi5cbiIpOworICAgICB9CisKKyAgICAgLy8gaGllciBrb2VubmVuIG5hdHVlcmxpY2ggYXVjaCBub2NoIGtvbXBsZXhlcmUgRGluZ2UgYWJsYXVmZW4sIHouQi4KKyAgICAgLy8gd2VubiBlaW4gV2VydCB6dXJ1ZWNrZ2VnZWJlbiB3ZXJkZW4gc29sbCwgZGVyIG5pY2h0IG51ciAwIG9kZXIgMSBpc3QuCisgICAgIHB1YmxpYyBpbnQgRGl2aW5nQ2FsbGJhY2sob2JqZWN0IHBsYXllciwgb2JqZWN0IGNhbGxlcikgeworICAgICAgIHJldHVybiAoZW52aXJvbm1lbnQoTUUpPT1wbGF5ZXIgJiYgbHVmdD4wKTsKKyAgICAgfQorCisgICAgIGIpIEVpbiBTcGllbGVyIGJlZmluZGV0IHNpY2ggaW4gZWluZW0gUmF1bSBtaXQgZWluZW0gc3RlaWxlbiBBYmhhbmcsIGRlbgorICAgICBtYW4gaGludW50ZXJzcHJpbmdlbiBrYW5uLiBEaWVzIGdlaHQgYWJlciBudXIgZGFubiBnZWZhaHJsb3MsIHdlbm4gZXMKKyAgICAgSGlsZnNvYmpla3RlIGdpYnQsIGRpZSBkZW4gKFNlZ2VsKWZsdWcgZXJsYXViZW46CisKKyAgICAgLy8gY21kX3NwcmluZ2VuKCkgc2VpIGRpZSBGdW5rdGlvbiwgZGllIGJlaSBkZXIgRWluZ2FiZSBkZXMgQmVmZWhscyBkdXJjaAorICAgICAvLyBkZW4gU3BpZWxlciBhdWZnZXJ1ZmVuIHdpcmQuCisgICAgIHN0YXRpYyBpbnQgY21kX3NwcmluZ2VuKHN0cmluZyBzdHIpIHsKKyAgICAgICBbLi4uXQorICAgICAgIC8vIFByb3BlcnR5IGFiZnJhZ2VuCisgICAgICAgbWFwcGluZyBoZWxwZXJzID0gVFAtPlF1ZXJ5UHJvcChQX0FFUklBTF9IRUxQRVJTKTsKKyAgICAgICAvLyBMaXN0ZSBkZXIgV2VydGUgZnVlciBkaWUgZWluemVsbmVuIFVudGVyc3R1ZXR6dW5nc29iamVrdGUgZXJtaXR0ZWxuCisgICAgICAgaW50ICp2YWx1ZXMgPSBtX3ZhbHVlcyhoZWxwZXJzLDApOworICAgICAgIC8vIFNwaWVsZXIgc2Nob25tYWwgcnVudGVyYmV3ZWdlbiwgZGllIEZvbGdlbiBzZWluZXMgSGFuZGVsbnMgc3B1ZXJ0CisgICAgICAgLy8gZXIgZGFubiwgd2VubiBlciB1bnRlbiBhbmdla29tbWVuIGlzdC4KKyAgICAgICBUUC0+bW92ZSh6aWVscmF1bSwgTV9HT3xNX1NJTEVOVCk7CisgICAgICAgLy8gImhlbHBlcnMiIGlzdCBpbW1lciBlaW4gTWFwcGluZywgZGFzIHBydWVmZW4gd2lyIG5pY2h0IGV4dHJhLgorICAgICAgIC8vIFdlbm4gZGllIExpc3RlIGRlciBPYmpla3RlIG5vY2ggbWluZGVzdGVucyBlaW4gRWxlbWVudCBlbnRoYWVsdCwKKyAgICAgICAvLyBuYWNoZGVtIGFsbGUgdW56dXN0YWVuZGlnZW4gSGlsZnNvYmpla3RlIChSdWVja2dhYmV3ZXJ0IGRlcgorICAgICAgIC8vIENhbGxiYWNrLUZ1bmt0aW9uID09IDApIHJhdXNnZXJlY2huZXQgd3VyZGVuLCBleGlzdGllcnQgbWluZGVzdGVucworICAgICAgIC8vIGVpbiBnZWVpZ25ldGVzIEhpbGZzb2JqZWt0LgorICAgICAgIGlmICggc2l6ZW9mKHZhbHVlcy0oezB9KSkgKSB7CisgICAgICAgICB0ZWxsX29iamVjdChUUCwgIlNhbmZ0IHNlZ2Vsc3QgRHUgZGVuIEhhbmcgaGluYWIuXG4iKTsKKyAgICAgICB9CisgICAgICAgZWxzZSB7CisgICAgICAgICB0ZWxsX29iamVjdChUUCwgQlMoIlRvZGVzbXV0aWcgc3ByaW5nc3QgRHUgZGVuIEhhbmcgaGluYWIgdW5kICIKKyAgICAgICAgICAgInNjaGxhZWdzdCBoYXJ0IHVudGVuIGF1Zi4gRHUgaGFldHRlc3QgdmllbGxlaWNodCBkYXJhbiBkZW5rZW4gIgorICAgICAgICAgICAic29sbGVuLCBEaXIgZ2VlaWduZXRlIEhpbGZzbWl0dGVsIGZ1ZXIgc28gZWluZSBBa3Rpb24genUgIgorICAgICAgICAgICAiYmVzb3JnZW4uIik7CisgICAgICAgICBUUC0+RGVmZW5kKDgwMCwgKHtEVF9CTFVER0VPTn0pLCAoW1NQX05PX0FDVElWRV9ERUZFTlNFOjFdKSwgTUUpOworICAgICAgIH0KKyAgICAgICByZXR1cm4gMTsKKyAgICAgfQorCitTSUVIRSBBVUNIOgorICAgICBGdW5rdGlvbmVuOiAgVW5yZWdpc3RlckhlbHBlck9iamVjdCgpCisgICAgIFByb3BlcnRpZXM6ICBQX0hFTFBFUl9PQkpFQ1RTLCBQX0FFUklBTF9IRUxQRVJTLCBQX0FRVUFUSUNfSEVMUEVSUworICAgICBTb25zdGlnZXM6ICAgL3N5cy9saXZpbmcvaGVscGVycy5oCisKKzA1LjAyLjIwMTUgQXJhdGhvcm4KKwpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vUmVtb3ZlQWRqZWN0aXZlIGIvZG9jL2xmdW4vUmVtb3ZlQWRqZWN0aXZlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NjA1ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9SZW1vdmVBZGplY3RpdmUKQEAgLTAsMCArMSwyNCBAQAorUmVtb3ZlQWRqZWN0aXZlKCkKKworRlVOS1RJT046CisgICAgIHZvaWQgUmVtb3ZlQWRqZWN0aXZlKHN0cmluZ3xzdHJpbmcqIGFkaik7CisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC90aGluZy9kZXNjcmlwdGlvbi5jCisKK0FSR1VNRU5URToKKyAgICAgYWRqCisgICAgICAgICAgU3RyaW5nIG9kZXIgQXJyYXkgdm9uIFN0cmluZyBtaXQgZGVuIEFkamVrdGl2ZW4uCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRmFsbHMgZWluaWdlIGRlciB2b3JoYW5kZW5lbiBBZGpla3RpdmUgbmljaHQgbWVociB2ZXJ3ZW5kZXQgd2VyZGVuCisgICAgIHNvbGxlbiwga29lbm5lbiBzaWUgbWl0IGRpZXNlciBGdW5rdGlvbiBlbnRmZXJudCB3ZXJkZW4uCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIGtlaW5lcgorCitTSUVIRSBBVUNIOgorICAgICBBZGRBZGplY3RpdmUoKSwgUmVtb3ZlSWQoKSwgL3N0ZC90aGluZy9kZXNjcmlwdGlvbi5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzIwLjAxLjIwMTUsIFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1JlbW92ZUNsYXNzIGIvZG9jL2xmdW4vUmVtb3ZlQ2xhc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VlZGE2YwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL1JlbW92ZUNsYXNzCkBAIC0wLDAgKzEsMjMgQEAKK1JlbW92ZUNsYXNzKCkKKworRlVOS1RJT046CisgICAgIHZvaWQgUmVtb3ZlQ2xhc3Moc3RyaW5nfHN0cmluZyogY2xhc3MpOworCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvdGhpbmcvZGVzY3JpcHRpb24uYworCitBUkdVTUVOVEU6CisgICAgIHN0cmluZy9zdHJpbmcqIGNsYXNzCS0gU3RyaW5nIG9kZXIgU3RyaW5nYXJyYXkgZGVyIEtsYXNzZShuKQorCitCRVNDSFJFSUJVTkc6CisgICAgIERlbSBPYmpla3Qgd2VyZGVuIGVpbmlnZSBkZXIgbWl0IEFkZENsYXNzKCkgZ2VzZXR6dGVuIEtsYXNzZW4gd2llZGVyIA0KKyAgICAgZW50em9nZW4uCisgICAgIERpZSBhbGxnZW1laW4gdmVyZnVlZ2JhcmVuIEtsYXNzZW4gc2luZCB1bnRlciAvc3lzL2NsYXNzLmggZGVmaW5pZXJ0LgorCitTSUVIRSBBVUNIOgorICAgICBBZGRDbGFzcygpLCBpc19jbGFzc19tZW1iZXIoKQorICAgICBQX0NMQVNTCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzIwLjAxLjIwMTUsIFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vUmVtb3ZlQ21kIGIvZG9jL2xmdW4vUmVtb3ZlQ21kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1OTQxYzYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9SZW1vdmVDbWQKQEAgLTAsMCArMSw2MCBAQAorUmVtb3ZlQ21kKEwpCitGVU5LVElPTjoKKyAgICB2YXJhcmdzIGludCBSZW1vdmVDbWQobWl4ZWQgY21kLCBpbnQgbm9ydWxlLCBtaXhlZCBpZCkKKworREVGSU5JRVJUIElOOgorICAgIC9zdGQvdGhpbmcvY29tbWFuZHMuYworCitBUkdVTUVOVEU6CisgICAgY29tCisgICAgICAgICBTdHJpbmcgb2RlciBBcnJheSB2b24gU3RyaW5ncyBtaXQgZGVuIHp1IGVudGZlcm5lbmRlbiBLb21tYW5kb3MuCisgICAgbm9ydWxlCisgICAgICAgICBLb21tYW5kb3MgbWl0IFJlZ2VsbiB3ZXJkZW4gbmljaHQgZW50ZmVybnQgKGF1c3NlciBiZWkgY21kPT0wKQorICAgIGlkCisgICAgICAgICBlaW5lIElELCBtaXQgZGVyIG1hbiBlaW4gdm9yaGVyIG1pdCBkaWVzZXIgSUQgZ2VzcGVpY2hlcnRlcworICAgICAgICAgS29tbWFuZG8gZWluZGV1dGlnIGx2c2NoZW4ga2FubgorCitCRVNDSFJFSUJVTkc6CisgICAgTWl0IEFkZENtZCgpIGhpbnp1Z2VmdWVndGUgS29tbWFuZG9zIGtvZW5uZW4gbWl0IGRpZXNlbSBCZWZlaGwgd2llZGVyCisgICAgYWJnZW1lbGRldCB3ZXJkZW4uIERpZSBlbnRmZXJudGVuIEtvbW1hbmRvcyBzaW5kIGRpcmVrdCBuYWNoIGRlbQorICAgIFJlbW92ZUNtZCgpLUF1ZnJ1ZiBuaWNodCBtZWhyIGFuc3ByZWNoYmFyLgorCisgICAgV2lyZCBlaW4gUmVnZWxzdHJpbmcgYW5nZWdlYmVuLCBzbyB3aXJkIGRpZSBpZGVudGlzY2hlIEFkZENtZC0KKyAgICBSZWdlbCBlbnRmZXJudC4KKworQkVNRVJLVU5HRU46CisgICAgVWViZXJnaWJ0IG1hbiBmdWVyIGNvbSBlaW5lIDAsIHNvIHdlcmRlbiBhbGxlIGRlZmluaWVydGVuIEtvbW1hbmRvcworICAgIGVudGZlcm50IQorCitSVUVDS0dBQkVXRVJUOgorICAgIEFuemFobCBkZXIgZW50ZmVybnRlbiBLb21tYW5kb3MuCisKK0JFSVNQSUVMRToKKyAgICAoMSkgQWRkQ21kKCJ0ZXN0Iik7CisgICAgKDIpIEFkZENtZCgidGVzdHx0ZXN0ZSZtaXQmcGFyYW1ldGVyIik7CisgICAgKDMpIEFkZENtZCgoeyJ0ZXN0In0pLDEpOworICAgICg0KSBBZGRDbWQoInRlc3QiLDAsMCwiWFlaIik7CisgICAgKDUpIEFkZENtZCgidGVzdCZtaXQmcGFyYW1ldGVyIiwwLDAsIlhZWiIpOworCisgICAgUmVtb3ZlQ21kKDApOworICAgIC0gZW50ZmVybnQgYWxsZSBLb21tYW5kb3MKKyAgICBSZW1vdmVDbWQoInRlc3QiLDEpOworICAgIC0gZW50ZmVybnQgKDEpIHVuZCAoMykKKyAgICBSZW1vdmVDbWQoInRlc3QiKTsKKyAgICAtIGVudGZlcm50ICgxKSwgKDMpIHVuZCBlaW5lbiBUZWlsIHZvbiAoMiksCisgICAgICBlcyB2ZXJibGVpYnQgInRlc3RlJm1pdCZwYXJhbWV0ZXIiCisgICAgUmVtb3ZlQ21kKCJ0ZXN0fHRlc3RlJm1pdCZwYXJhbWV0ZXIiCisgICAgLSBlbnRmZXJudCAoMikKKyAgICBSZW1vdmVDbWQoInRlc3QiLDAsIlhZWiIpOworICAgIC0gZW50ZmVybnQgKDQpIHVuZCAoNSkKKyAgICBSZW1vdmVDbWQoInRlc3QiLDEsIlhZWiIpOworICAgIC0gZW50ZmVybnQgKDQpLCBuaWNodCAoNSkKKyAgICBSZW1vdmVDbWQoMCwwLCJYWVoiKTsKKyAgICAtIGVudGZlcm50ICg0KSB1bmQgKDUpCisKK1NJRUhFIEFVQ0g6CisJCQlBZGRDbWQoTCksIEFkZENtZF9ic3AKKyAgICBTb25zdGlnZXM6CQlyZXBsYWNlX3BlcnNvbmFsKEUpLCBlbmFibGVfY29tbWFuZHMoRSksIGluaXQoRSkKKyAgICBBbHRlcm5hdGl2ZW46CUFkZEFjdGlvbihMKSwgYWRkX2FjdGlvbihFKQorCisyNC5NYWVyeiAyMDA0IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9SZW1vdmVEZWZlbmRlciBiL2RvYy9sZnVuL1JlbW92ZURlZmVuZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZDQ2ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9SZW1vdmVEZWZlbmRlcgpAQCAtMCwwICsxLDM2IEBACitSZW1vdmVEZWZlbmRlcigpCisKK0ZVTktUSU9OOgorCXZvaWQgUmVtb3ZlRGVmZW5kZXIob2JqZWN0IGZyaWVuZCk7CisKK0RFRklOSUVSVCBJTjoKKwkvc3RkL2xpdmluZy9jb21iYXQuYworCitBUkdVTUVOVEU6CisJZnJpZW5kCisJICBPYmpla3QgKG5vcm1hbCBMZWJld2VzZW4pLCB3ZWxjaGVzIHp1a3VlbmZ0aWcgbmljaHQgbWVociB1ZWJlcgorCSAgQW5ncmlmZmUgaW5mb3JtaWVydCB3ZXJkZW4gc29sbCB1bmQgZGllc2UgYXVjaCBuaWNodCBtZWhyIGFid2VocnQuCisKK0JFU0NIUkVJQlVORzoKKwlFaW4gTGViZXdlc2VuLCB3ZWxjaGVzIGFuZ2VncmlmZmVuIHdpcmQsIGthbm4gYW5kZXJlIE9iamVrdGUgdWViZXIKKwllaW5lbiBzb2xjaGVuIEFuZ3JpZmYgcGVyIEluZm9ybURlZmVuZCgpIGluZm9ybWllcmVuIG9kZXIgaWhuZW4KKwlzb2dhciBkaWUgTW9lZ2xpY2hrZWl0IGdlYmVuLCBwZXIgRGVmZW5kT3RoZXIoKSBkaXJla3QgaW4gZGVuCisJbGF1ZmVuZGVuIEFuZ3JpZmYgZWluenVncmVpZmVuIChTY2hhZWRlbiBhYndlaHJlbiBvZGVyIHVtd2FuZGVsbikuCisJSW0gTm9ybWFsZmFsbCBoYW5kZWx0IGVzIHNpY2ggaGllcmJlaSB1bSBhbmRlcmUgTGViZXdlc2VuLCB3ZWxjaGUKKwlhbHMgVmVydGVpZGlnZXIgZGVzIGFuZ2VncmlmZmVuZW4gTGViZXdlc2VucyBhdWZ0cmV0ZW46IERhaGVyIGRlcgorCU5hbWUgZGVyIEZ1bmt0aW9uLiBBdXNzZXJkZW0gYmVzdGVodCBkaWUgRWluc2NocmFlbmt1bmcsIGRhc3MgZGllc2UKKwlPYmpla3RlIGluIGRlciBnbGVpY2hlbiBVbWdlYnVuZyBzZWluIG11ZXNzZW4sIHdpZSBkYXMgenUKKwl2ZXJ0ZWlkaWdlbmRlIExlYmV3ZXNlbi4KKwlEaWUgT2JqZWt0ZSBzaW5kIGluIEZvcm0gZWluZXMgQXJyYXlzIGluIGRlciBQcm9wZXJ0eSBQX0RFRkVOREVSUworCWFiZ2VzcGVpY2hlcnQgdW5kIGtvZW5uZW4gZG9ydCBhYmdlcnVmZW4gd2VyZGVuLiBOYXR1ZXJsaWNoIGthbm4KKwltYW4gYWx0ZSBPYmpla3RlIGRpcmVrdCBkb3J0IGxvZXNjaGVuLCBqZWRvY2ggc29sbHRlIG1hbiBkaWUKKwloaWVyZnVlciBiZXJlaXRnZXN0ZWxsdGUgRnVua3Rpb25lbiBSZW1vdmVEZWZlbmRlcigpIHZlcndlbmRlbi4KKwladW0gSGluenVmdWVnZW4gdm9uIEVpbnRyYWVnZW4gaW0gQXJyYXkgc3RlaHQgZWJlbmZhbGxzIGVpbmUKKwlGdW5rdGlvbiBiZXJlaXQ6IEFkZERlZmVuZGVyKCkuCisKK1NJRUhFIEFVQ0g6CisJQWRkRGVmZW5kZXIoKSwgSW5mb3JtRGVmZW5kKCksIERlZmVuZE90aGVyKCksCisJUF9ERUZFTkRFUlMsIC9zdGQvbGl2aW5nL2NvbWJhdC5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFRodSBKdWwgMjkgMTg6NDg6NDUgMTk5OSBieSBQYXRyeW4KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1JlbW92ZURldGFpbCBiL2RvYy9sZnVuL1JlbW92ZURldGFpbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzNhZjJhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vUmVtb3ZlRGV0YWlsCkBAIC0wLDAgKzEsNTcgQEAKK1JlbW92ZURldGFpbCgpCisKK0ZVTktUSU9OOgorICAgIHZvaWQgUmVtb3ZlRGV0YWlsKG1peGVkICprZXlzKTsKKworREVGSU5JRVJUIElOOgorICAgIC9zdGQvdGhpbmcvZGVzY3JpcHRpb24uYworCitBUkdVTUVOVEU6CisgICAga2V5cworICAgICAgU3RyaW5nIG9kZXIgQXJyYXkgdm9uIFN0cmluZ3MgbWl0IGRlbiB6dSBlbnRmZXJuZW5kZW4gRGV0YWlscy4KKworQkVTQ0hSRUlCVU5HOgorICAgIEVudGZlcm50IGRpZSBpbiA8a2V5cz4gYW5nZWdlYmVuZW4gRGV0YWlscyBhdXMgZGVyIExpc3RlIGRlcgorICAgIHZvcmhhbmRlbmVuIERldGFpbHMuIFVlYmVyZ2lidCBtYW4gZnVlciA8a2V5cz4gZWluZSAwLCBzbyB3ZXJkZW4KKyAgICBzYWVtdGxpY2hlIERldGFpbHMgZW50ZmVybnQhCisKK0JFSVNQSUVMOgorICAgIEVpbiBrbGVpbmVzIEJlaXNwaWVsLCBiZWkgZGVtIGVpbmUgT2VmZm51bmcgZXJzY2hlaW50IHVuZCB3aWVkZXIKKyAgICB2ZXJzY2h3aW5kZXQsIGplIG5hY2hkZW0sIG9iIG1hbiBlaW5lIEx1a2Ugb2VmZm5ldCBvZGVyIHNjaGxpZXNzdC4KKyAgICAgIGludCBvZWZmbmVMdWtlKHN0cmluZyBzdHIpOworICAgICAgaW50IHNjaGxpZXNzZUx1a2Uoc3RyaW5nIHN0cik7CisgICAgICAuLi4KKyAgICAgIEFkZENtZCgib2VmZm5lIiwgIydvZWZmbmVMdWtlKTsKKyAgICAgIEFkZENtZCgic2NobGllc3NlIiwgIydzY2hsaWVzc2VMdWtlKTsKKyAgICAgIC4uLgorICAgICAgaW50IG9lZmZuZUx1a2Uoc3RyaW5nIHN0cikgeworICAgICAgICBpZihzdHIhPSJsdWtlIiB8fCBHZXREZXRhaWwoIm9lZmZudW5nIikpCisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIEFkZERldGFpbCgib2VmZm51bmciLCJEdSBzaWVoc3QgZWluZSBrbGVpbmUgT2VmZm51bmcuXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisKKyAgICAgIGludCBzY2hsaWVzc2VMdWtlKHN0cmluZyBzdHIpIHsKKyAgICAgICAgaWYoc3RyIT0ibHVrZSIgfHwgIUdldERldGFpbCgib2VmZm51bmciKSkKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgUmVtb3ZlRGV0YWlsKCJvZWZmbnVuZyIpOyAvLyBEZXRhaWwgd2llZGVyIGVudGZlcm5lbgorICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKworQkVNRVJLVU5HRU46CisgICAgRGEgaW50ZXJuIERldGFpbHMgdW5kIFNwZWNpYWxEZXRhaWxzIGltIGdsZWljaGVuIE1hcHBpbmcgdmVyd2FsdGV0CisgICAgd2VyZGVuLCBsYXNzZW4gc2ljaCBtaXQgZGllc2VyIEZ1bmt0aW9uIGF1Y2ggU3BlY2lhbERldGFpbHMKKyAgICBlbnRmZXJuZW4uCisgICAgRGllIEZ1bmt0aW9uIFJlbW92ZVNwZWNpYWxEZXRhaWwoKSBzb2xsdGUgYWxzbyBuaWNodCBnZW51dHp0IHdlcmRlbiEKKworU0lFSEUgQVVDSDoKKyAgICBTZXR6ZW46ICAgIEFkZERldGFpbCgpLCBBZGRSZWFkRGV0YWlsKCksIEFkZFNtZWxscygpLCBBZGRTb3VuZHMoKSwKKyAgICAgICAgICAgICAgIEFkZFRvdWNoRGV0YWlsKCkKKyAgICBMb2VzY2hlbjogIFJlbW92ZVJlYWREZXRhaWwoKSwgUmVtb3ZlU21lbGxzKCksCisgICAgICAgICAgICAgICBSZW1vdmVTb3VuZHMoKSwgUmVtb3ZlVG91Y2hEZXRhaWwoKQorICAgIERhdGVuOiAgICAgUF9ERVRBSUxTLCBQX1JFQURfREVUQUlMUywgUF9TTUVMTFMsIFBfU09VTkRTLAorICAgICAgICAgICAgICAgUF9UT1VDSF9ERVRBSUxTLCBQX1NQRUNJQUxfREVUQUlMUworICAgIFZlcmFsdGV0OiAgQWRkU3BlY2lhbERldGFpbCgpLCBSZW1vdmVTcGVjaWFsRGV0YWlsKCksIFBfUkVBRF9NU0cKKyAgICBTb25zdGlnZXM6IEdldERldGFpbCgpLCBicmVha19zdHJpbmcoKQorCis4LiBKdWxpIDIwMTEgR2xvaW5zb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9SZW1vdmVFeGl0IGIvZG9jL2xmdW4vUmVtb3ZlRXhpdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGM2MWYyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vUmVtb3ZlRXhpdApAQCAtMCwwICsxLDI4IEBACitSZW1vdmVFeGl0KCkKK0ZVTktUSU9OOgorICAgICB2b2lkIFJlbW92ZUV4aXQoc3RyaW5nfHN0cmluZyogY21kKTsKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL3Jvb20vZXhpdHMKKworQVJHVU1FTlRFOgorICAgICBzdHJpbmcvc3RyaW5nKiBjbWQKKyAgICAgICAgICBSaWNodHVuZyhlbiksIGRpZSBlbnRmZXJudCB3ZXJkZW4gc29sbGVuLgorCitCRVNDSFJFSUJVTkc6CisgICAgIERpZSBpbiBjbWQgYW5nZWdlYmVuZW4gQXVzZ2FlbmdlIHdlcmRlbiB3aWVkZXIgZW50ZmVybnQuCisKKyAgICAgSXN0IGNtZCA9IDAsIHNvIHdlcmRlbiBhbGxlIEF1c2dhZW5nZSBlbnRmZXJudC4KKworQkVNRVJLVU5HRU46CisgICAgIEF1c2dhZW5nZSB3ZXJkZW4gYW4gZGVyIGdsZWljaGVuIFN0ZWxsZSBnZXNwZWljaGVydDoKKyAgICAgLSBSZW1vdmVFeGl0KCkgZ3JlaWZ0IGF1ZiBkaWUgZ2xlaWNoZW4gRGF0ZW4gd2llIFJlbW92ZVNwZWNpYWxFeGl0KCkKKyAgICAgICB6dSwgZW50ZmVybnQgYWxzbyBhdWNoIHNwZXppZWxsZSBBdXNnYWVuZ2UhCisKK1NJRUhFIEFVQ0g6CisgICAgIEFkZEV4aXQoKSwgQWRkU3BlY2lhbEV4aXQoKSwgR2V0RXhpdHMoKQorICAgICBSZW1vdmVTcGVjaWFsRXhpdCgpLAorICAgICBIX0hPT0tfRVhJVF9VU0UsIFBfRVhJVFMsIFBfSElERV9FWElUUywgL3N0ZC9yb29tL2V4aXRzLmMKKyAgICAgYXVzZ2FlbmdlCisKKzMxLjAxLjIwMTUsIFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1JlbW92ZUV4dHJhTG9vayBiL2RvYy9sZnVuL1JlbW92ZUV4dHJhTG9vawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmExOTZlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vUmVtb3ZlRXh0cmFMb29rCkBAIC0wLDAgKzEsMzkgQEAKK1JlbW92ZUV4dHJhTG9vaygpCisKK2ludCBSZW1vdmVFeHRyYUxvb2soc3RyaW5nIGxvb2spOworCitERUZJTklFUlQgSU46CisgICAvc3RkL2xpdmluZy9kZXNjcmlwdGlvbi5jCisKK0JFU0NIUkVJQlVORzoKKyAgIERlciBFeHRyYWxvb2sgZXJzY2hlaW50IGluIGRlciBMYW5nYmVzY2hyZWlidW5nIGRlcyBMZWJld2VzZW5zLgorICAgRWludHJhZWdlIGtvZW5uZW4gbWl0IGRpZXNlciBGdW5rdGlvbiAodm9yemVpdGlnKSB3aWVkZXIgZW50ZmVybnQgd2VyZGVuLgorCitBUkdVTUVOVEU6CisgIC0gc3RyaW5nIGtleToKKyAgICBTY2hsdWVzc2Vsd29ydCwgdW50ZXIgZGVtIGRlciBFaW50cmFnLCBkZW4gbWFuIGVudGZlcm5lbiBtb2VjaHRlLCB2b24KKyAgICBBZGRFeHRyYUxvb2soKSByZWdpc3RyaWVydCB3dXJkZS4KKworUlVFQ0tHQUJFV0VSVEU6CisgID4gMCwgZmFsbHMgZGVyIEVpbnRyYWcgZXJmb2xncmVpY2ggZW50ZmVybnQgd3VyZGUuCisgIDwgMCBzb25zdC4KKyAgICAtMToga2VpbmVuIChndWVsdGlnZW4pIDxrZXk+IHVlYmVyZ2ViZW4uCisgICAgLTI6IGtlaW4gRWludHJhZyBmdWVyIDxrZXk+IGdlZnVuZGVuLgorCitCRU1FUktVTkdFTjoKKyAgQmVpbSBFbnRmZXJuZW4gbWl0IGRpZXNlciBGdW5rdGlvbiB3aXJkIGRpZSAiRW5kZW1lbGR1bmciIGRlcyBlbnRmZXJudGVuCisgIEVpbnRyYWdlcyBuaWNodCBhdXNnZWdlYmVuLgorCitCRUlTUElFTEU6CisgICMgRXh0cmFsb29rIHJlZ2lzdHJpZXJlbi4KKyAgbGl2aW5nLT5BZGRFeHRyYUxvb2soIkBXRVIxIHdpcmQgdm9uIGVpbmVyIEhvcmRlIERhZW1vbmVuIHZlcmZvbGd0LiIsCisgICAgICAgICAgICAgICAgICAgICAgICJlbm5veF9kYWVtb25lbmhvcmRlbnZlcmZvbGdlcmxvb2siKTsKKyAgIyBOdW4ga2FubiBkZXIgRWludHJhZyBhdWNoIHdpZWRlciBlbnRmZXJudCB3ZXJkZW46CisgIGxpdmluZy0+UmVtb3ZlRXh0cmFMb29rKCJlbm5veF9kYWVtb25lbmhvcmRlbnZlcmZvbGdlcmxvb2siKTsKKworU0lFSEUgQVVDSDoKKyAgIEFkZEV4dHJhTG9vaygpLAorICAgUF9JTlRFUk5BTF9FWFRSQV9MT09LCisKKzE0LjA1LjIwMDcsIFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vUmVtb3ZlRml4ZWRPYmplY3QgYi9kb2MvbGZ1bi9SZW1vdmVGaXhlZE9iamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjE2YjJiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vUmVtb3ZlRml4ZWRPYmplY3QKQEAgLTAsMCArMSw0MCBAQAorUmVtb3ZlRml4ZWRPYmplY3QoKQorCitGVU5LVElPTjoKKwl2b2lkIFJlbW92ZUZpeGVkT2JqZWN0KHN0cmluZyBmaWxlbmFtZSk7CisKK0RFRklOSUVSVCBJTjoKKwkvc3RkL2xhZGVuLmMKKworQVJHVU1FTlRFOgorCXN0cgorCSAgRGF0ZWluYW1lIGRlcyBPYmpla3Rlcywgd2VsY2hlcyBuaWNodCBtZWhyIGRhdWVyaGFmdCBpbSBMYWRlbiBzZWluCisJICBzb2xsLgorCitSVWVDS0dBQkVXRVJUOgorICAgICAgICBrZWluZXIKKworQkVTQ0hSRUlCVU5HOgorCU9iamVrdGUsIGRpZSBtaXR0ZWxzIGRlciBGdW5rdGlvbiBBZGRGaXhlZE9iamVjdCgpIGltIExhZGVuCisJZWluZ2VidW5kZW4gd2VyZGVuLCBzaW5kIGRvcnQgc3RhZW5kaWcgdmVyZnVlZ2Jhci4gVW0gZGllc2VuIFp1c3RhbmQKKwl3aWVkZXIgYXVmenVoZWJlbiwga2FubiBtYW4gc2llIG1pdHRlbHMgZGllc2VyIEZ1bmt0aW9uIHdpZWRlcgorCWVudGZlcm5lbi4gRXZlbnR1ZWxsIGltIExhZ2VyIGJlZmluZGxpY2hlIE9iamVrdGUgZGllc2VyIEFydCB3ZXJkZW4KKwloaWVyYmVpIG5pY2h0IHplcnN0b2VydCB1bmQga29lbm5lbiBkdXJjaGF1cyBub2NoIGdla2F1ZnQgd2VyZGVuLAorCWJpcyBzaWUgYWxsZSBzaW5kLiBEYW5hY2ggZ2lidCBlcyBzaWUgZG9ydCBuaWNodCBtZWhyIQorCitCRUlTUElFTEU6CisJSW0gYWxsZW4gTGFlZGVuIGdpYnQgZXMgc2Nob24gZWluIE9iamVrdCwgd2VsY2hlcyBkb3J0CisJc3RhbmRhcmRtYWVzc2lnIGVyaGFlbHRsaWNoIGlzdC4gRm9sZ2VuZGUgWmVpbGUgc29yZ3QgZGFmdWVyOgorCSAgQWRkRml4ZWRPYmplY3QoIi9vYmovYm9lcnNlIiw4MCwoeyJib2Vyc2UiLCJnZWxkYm9lcnNlIn0pKTsKKwlXZW5uIG1hbiBkYXMgaW4gc2VpbmVtIExhZGVuIG5pY2h0IHd1ZW5zY2h0LCBrYW5uIG1hbiBkaWUgR2VsZGJvZXJzZQorCW1pdHRlbHMgZm9sZ2VuZGVyIFplaWxlIHdpZWRlciBhdXMgZGVtIExhZGVuIGxvZXNjaGVuOgorCSAgUmVtb3ZlRml4ZWRPYmplY3QoIi9vYmovYm9lcnNlIik7CisJRXMgaXN0IG5pY2h0IG1vZWdsaWNoLCBrZWluZSBvZGVyIG1laHJlcmUgT2JqZWt0ZSBhbnp1Z2ViZW4sIHVtIGF1ZgorCWRpZXNlIFdlaXNlIGFsbGUgYnp3LiBtZWhyZXJlIE9iamVrdGUgYWxzIG5pY2h0IG1laHIgc3RhZW5kaWcKKwl2ZXJmdWVnYmFyIHp1IG1hcmtpZXJlbi4KKworU0lFSEUgQVVDSDoKKwlBZGRGaXhlZE9iamVjdCgpLCBTZXRTdG9yYWdlUm9vbSgpLCAvc3RkL3N0b3JlLmMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogVGh1IEp1biAxOCAxNDoxOToxOSAxOTk4IGJ5IFBhdHJ5bgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vUmVtb3ZlRnJvbU1lbnUgYi9kb2MvbGZ1bi9SZW1vdmVGcm9tTWVudQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODMyNmFmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vUmVtb3ZlRnJvbU1lbnUKQEAgLTAsMCArMSwzMiBAQAorUmVtb3ZlRnJvbU1lbnUoKQorCitGVU5LVElPTjoKKyAgICAgaW50IFJlbW92ZUZyb21NZW51KG1peGVkIGlkcykKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL3B1Yi5jCisKK0FSR1VNRU5URToKKyAgICAgaWRzIC0gc3RyaW5nIG9kZXIgc3RyaW5nKgorCSAgIFN0cmluZyBvZGVyIEFycmF5IHZvbiBTdHJpbmdzLCBtaXQgZGVuZW4gc2ljaCBkaWUgU3BlaXNlIGJ6dy4KKyAgICAgICAgICAgZGFzIEdldHJhZW5rIGJlaW0gQmVzdGVsbGVuIGFuc3ByZWNoZW4gbGFlc3N0LgorCitSVUVDS0dBQkVXRVJUOgorICAgICBpbnQgLSBBbnphaGwgZW50ZmVybnRlciBFaW56ZWxtZW51ZWVpbnRyYWVnZQorCitCRVNDSFJFSUJVTkc6CisgICAgIE1pdCBkaWVzZXIgTWV0aG9kZSBrYW5uIG1hbiBpZC1iYXNpZXJ0IFNwZWlzZW4gdW5kIEdldHJhZW5rZQorICAgICB3aWVkZXIgdm9uIGRlciBLYXJ0ZSBlbnRmZXJuZW4gKHdlbm4gekIgbnVyIHNhaXNvbmJhc2llcnQKKyAgICAgYmVzdGltbXRlIERpbmdlIGFuZ2Vib3RlbiB3ZXJkZW4gc29sbGVuKS4KKyAgICAgCitCRU1FUktVTkdFTjoKKyAgICAgLSBzaWNoIHp3aXNjaGVuIHp3ZWkgU3BlaXNlbiB1ZWJlcnNjaG5laWRlbmRlIElEcyBmdWVocmVuIHp1CisgICAgICAgdW5kZWZpbmllcnRlbSBWZXJoYWx0ZW4hCisgICAgIC0gYmVpIEJlbnV0enVuZyB2b24gUmVtb3ZlRnJvbU1lbnUgc29sbHRlIG1hbiBpbiBEZWxheS1TcGVpc2VuIG9kZXIKKyAgICAgICAtR2V0cmFlbmtlbiBhdWYgZGllIE51dHp1bmcgdm9tIGlkZW50LVBhcmFtZXRlciBpbiBkZW4KKyAgICAgICBTZXJ2aWVybmFjaHJpY2h0ZW4gdmVyemljaHRlbiAoZXMgc2VpLCBtYW4gd2Vpc3Mgd2FzIG1hbiB0dXQpCisKK1NJRUhFIEFVQ0g6CisgICAgIEFkZFRvTWVudSgpLCBBZGRGb29kKCksIEFkZERyaW5rKCksIC9zeXMvcHViLmgKKworMTUuIEZlYnJ1YXIgMjAwOSBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vUmVtb3ZlRnVuYyBiL2RvYy9sZnVuL1JlbW92ZUZ1bmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU0YWJlNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL1JlbW92ZUZ1bmMKQEAgLTAsMCArMSw4NyBAQAorUmVtb3ZlRnVuYygpCisKK0ZVTktUSU9OOgorICAgICBpbnQgUmVtb3ZlRnVuYyhvYmplY3QgcnVlc3QsIGludCBpbmZvLCBvYmplY3QgdXNlcik7CisKK0RFRklOSUVSVCBJTjoKKyAgICAgZWlnZW5lbiBPYmpla3RlbiAoZnVlciAvc3RkL2Nsb3RoaW5nL3dlYXIpCisKK0FSR1VNRU5URToKKyAgICAgcnVlc3QgKG9iamVjdCkKKyAgICAgICAgICBEaWUgUnVlc3R1bmcvS2xlaWR1bmcsIGRpZSBhdXNnZXpvZ2VuIHdlcmRlbiBzb2xsLgorICAgICBpbmZvIChpbnQpCisgICAgICAgICAgQmVpIChpbmZvJk1fU0lMRU5UKSB3aXJkIGtlaW5lIE1lbGR1bmcgdWViZXIgZGFzIEF1c3ppZWhlbgorICAgICAgICAgIGF1c2dlZ2ViZW4uCisgICAgICAgICAgQmVpIChpbmZvJk1fTk9DSEVDSykgd2lyZCBkaWUgS2xlaWR1bmcgYXVzZ2V6b2dlbiwgZWdhbCB3YXMgZGllc2UKKyAgICAgICAgICBGdW5rdGlvbiB6dXJ1ZWNrZ2lidC4gRGllcyB0cml0dCBpbnNiZXNvbmRlcmUgZGFubiBhdWYsIHdlbm4gZGVyCisgICAgICAgICAgU3BpZWxlciwgZGVyIGRpZSBSdWVzdHVuZyB0cmFlZ3QsIHN0aXJidCB1bmQgZGllIFJ1ZXN0dW5nIGluCisgICAgICAgICAgZGllIExlaWNoZSBiZXdlZ3Qgd2lyZC4KKyAgICAgdXNlciAob2JqZWN0KQorICAgICAgICAgIERhcyBMZWJld2VzZW4sIHdlbGNoZXMgZGllIFJ1ZXN0dW5nL0tsZWlkdW5nIGdlcmFkZSB0cmFlZ3QgdW5kIHNpZQorICAgICAgICAgIGF1c3ppZWhlbiB3aWxsLgorCitCRVNDSFJFSUJVTkc6CisgICAgIE1pdCBkaWVzZXIgRnVua3Rpb24ga2FubiBtYW4gcHJ1ZWZlbiwgb2Igc2ljaCBkYXMgS2xlaWR1bmdzc3R1ZWNrIGJ6dy4KKyAgICAgUnVlc3R1bmcgPHJ1ZXN0PiB2b24gdGhpc19wbGF5ZXIoKSBhdXN6aWVoZW4gbGFlc3N0IG9kZXIgbmljaHQuCisgICAgIEthbm4gZGllIFJ1ZXN0dW5nIGF1c2dlem9nZW4gd2VyZGVuLCBzbyBtdXNzIGVpbiBXZXJ0IHVuZ2xlaWNoIDAKKyAgICAgenVydWVja2dlZ2ViZW4gd2VyZGVuLgorICAgICAKKyAgICAgRGllc2UgRnVua3Rpb24gbWVsZGV0IG51ciBlaW5lbiBfV3Vuc2NoXyBhbi4gRGllc2VyIGthbm4gaWdub3JpZXJ0CisgICAgIHdlcmRlbiAoei5CLiBiZWkgYmVzdGltbXRlbiBCZXdlZ3VuZ2VuLCBUb2QgZGVzIFNwaWVsZXJzIGV0Yy4pLgorICAgICBVbmFiaGFlbmdpZyB2b20gV2VydCBkaWVzZXIgRnVua3Rpb24ga2FubiBkYXMgQXVzemllaGVuIG5vY2ggU2NoZWl0ZXJuCisgICAgIG9kZXIgRXJ6d3VuZ2VuIHdlcmRlbi4KKyAgICAgV2VubiBpaHIgc2ljaGVyIHNlaW4gd29sbHQsIGRhc3MgZGVyIFNwaWVsZXIgZWluIE9iamVrdCBhbmdlem9nZW4gaGF0LAorICAgICBiZW51dHp0IGJpdHRlIEluZm9ybVVud2VhcigpLgorCitSVWVDS0dBQkVXRVJUOgorICAgICAwLCB3ZW5uIHNpY2ggZGllIFJ1ZXN0dW5nIG5pY2h0IGF1c3ppZWhlbiBsYWVzc3QsIGFuc29uc3RlbiB1bmdsZWljaCAwLgorCitCRU1FUktVTkdFTjoKKyAgICAgVmVyZmx1Y2h0ZSBSdWVzdHVuZ2VuLCBkaWUgc2ljaCBlcnN0IG5hY2ggRW50ZmVybnVuZyBkZXMgRmx1Y2hlcyB3aWVkZXIKKyAgICAgYXVzemllaGVuIGxhc3Nlbiwgc29sbHRlIG1hbiBiZXNzZXIgbWl0IFBfQ1VSU0VEIHJlYWxpc2llcmVuIChtYW4gc3BhcnQKKyAgICAgZGllIFJlbW92ZUZ1bmMoKSBlaW4pLgorICAgICBCaXR0ZSBuaWNodCBkcmF1ZiB2ZXJsYXNzZW4sIGRhc3MgdGhpc19wbGF5ZXIoKSBkYXMgYXVzemllaGVuZGUgTGViZXdlc2VuCisgICAgIGlzdC4KKyAgICAgRGllIFJlaWhlbmZvbGdlIGRlciBBcmd1bWVudGUgaXN0IGV0d2FzIHVuc2Nob2VuLCBhYmVyIGxlaWRlciB3dXJkZSA8dXNlcj4KKyAgICAgZXJoZWJsaWNoIHNwYWV0ZXIgaGluenVnZWZ1ZWd0IHVuZCBlcyB3YXIgdW5tb2VnbGljaCwgZWluaWdlIGh1bmRlcnQKKyAgICAgT2JqZWt0ZSB6dSBhZW5kZXJuLgorCitCRUlTUElFTEU6CisgICAgIEVpbiBVbWhhbmcsIGRlbiBtYW4gbnVyIG1pdCBndXRlciBFaW5zdGVsbHVuZyB3aWVkZXIgYXVzemllaGVuIGthbm46CisKKyAgICAgaW5oZXJpdCAic3RkL2FybW91ci5jIjsKKworICAgICAjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorICAgICAjaW5jbHVkZSA8bW92aW5nLmg+CisKKyAgICAgY3JlYXRlKCkKKyAgICAgeworICAgICAgIDo6Y3JlYXRlKCk7CisKKyAgICAgICBTZXRQcm9wKFBfQVJNT1VSX1RZUEUsIEFUX0NMT0FLKTsKKyAgICAgICAvKiB6aWcgd2VpdGVyZSBTZXRQcm9wJ3MsIHVtIGRlbiBVbWhhbmcgenUga29uZmlndXJpZXJlbiAqLworCisgICAgICAgLyogUmVtb3ZlRnVuYygpIGlzdCBpbSBVbWhhbmcgc2VsYnN0IHp1IGZpbmRlbiAqLworICAgICAgIFNldFByb3AoUF9SRU1PVkVfRlVOQywgdGhpc19vYmplY3QoKSk7CisgICAgIH0KKworICAgICBpbnQgUmVtb3ZlRnVuYyhvYmplY3QgbWUsIGludCBpbmZvLCBvYmplY3QgdXNlcikKKyAgICAgeworICAgICAgIGlmICh1c2VyLT5RdWVyeVByb3AoUF9BTElHTikgPj0gMCB8fCAoaW5mbyZNX05PQ0hFQ0spKQorICAgICAgICAgcmV0dXJuIDE7ICAgLyogZ3V0ZSBDaGFyYWt0ZXJlIGtvZW5uZW4gZGVuIFVtaGFuZyBhdXN6aWVoZW4gKi8KKworICAgICAgIC8qIEFuc29uc3RlbiBnZWJlbiB3aXIgZXZ0bC4gZWluZW4gZW50c3ByZWNoZW5kZW4gSGlud2VpcyBhdXM6ICovCisgICAgICAgaWYgKCEoaW5mbyZNX1NJTEVOVCkpCisgICAgICAgICAgIHdyaXRlKCAiRGVyIFVtaGFuZyB3aXJkIHZvbiBEZWluZXIgQm9zaGVpdCBzbyBzZWhyICIKKyAgICAgICAgICAgICAgICAgKyJhbmdlem9nZW4sIGRhc3MgRHUgaWhuXG5uaWNodCBtZWhyIGF1c3ppZWhlbiBrYW5uc3QhXG4iKTsKKyAgICAgICByZXR1cm4gMDsKKyAgICAgfQorCitTSUVIRSBBVUNIOgorICAgICBQX1dFQVJfTVNHLCBQX1VOV0VBUl9NU0csIFBfV0lFTERfTVNHLCBQX1VOV0lFTERfTVNHCisgICAgIERvVW53ZWFyKCksIERvV2VhcigpLCBJbmZvcm1XZWFyKCksIEluZm9ybVVud2VhcigpCisgICAgIC9zdGQvY2xvdGhpbmcvd2Vhci5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzAyLjA3LjIwMTMsIFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vUmVtb3ZlSWQgYi9kb2MvbGZ1bi9SZW1vdmVJZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWU3MDk5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vUmVtb3ZlSWQKQEAgLTAsMCArMSwyNiBAQAorUmVtb3ZlSWQoKQorCitGVU5LVElPTjoKKyAgICAgdm9pZCBSZW1vdmVJZChzdHJpbmd8c3RyaW5nKiBpZHMpOworCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvdGhpbmcvZGVzY3JpcHRpb24uYworCitBUkdVTUVOVEU6CisgICAgIGlkcworICAgICAgICAgIFN0cmluZyBvZGVyIEFycmF5IHZvbiBTdHJpbmdzIG1pdCBkZW4gQmV6ZWljaG51bmdlbiwgZGllIGF1cyBkZXIKKyAgICAgICAgICBMaXN0ZSBkZXIgSURzIGRlcyBPYmpla3RlcyBlbnRmZXJudCB3ZXJkZW4gc29sbGVuLgorCitCRVNDSFJFSUJVTkc6CisgICAgIFdlbm4gZWluIE9iamVrdCBzaWNoIG5pY2h0IG1laHIgbWl0IGdld2lzc2VuIEJlemVpY2huZXJuIGFuc3ByZWNoZW4KKyAgICAgbGFzc2VuIHNvbGwsIGthbm4gbWFuIGRpZXNlIG1pdCBkaWVzZXIgRnVua3Rpb24gZW50ZmVybmVuLgorCitSVWVDS0dBQkVXRVJUOgorICAgICBrZWluZXIKKworU0lFSEUgQVVDSDoKKyAgICAgQWRkSWQoKSwgUmVtb3ZlQWRqZWN0aXZlKCksIC9zdGQvdGhpbmcvZGVzY3JpcHRpb24uYworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisyMC4wMS4yMDE1LCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1JlbW92ZUluZm8gYi9kb2MvbGZ1bi9SZW1vdmVJbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZWQ2MmMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9SZW1vdmVJbmZvCkBAIC0wLDAgKzEsMjQgQEAKK1JlbW92ZUluZm8oKQorRlVOS1RJT046CisgICAgIHZvaWQgUmVtb3ZlSW5mbyhzdHJpbmcga2V5KQorCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvbnBjL2luZm8uYworCitBUkdVTUVOVEU6CisgICAgIGtleQl6dSBsb2VzY2hlbmRlciBTY2hsdWVzc2VsCisKK0JFU0NIUkVJQlVORzoKKyAgICAgTG9lc2NodCBkaWUgQW50d29ydCB6dW0gZW50c3ByZWNoZW5kZW4gRnJhZ2VzY2hsdWVzc2VsLgorCitCRUlTUElFTDoKKyAgICAgLy8gZXJzdGVsbGVuIHVuZCBsb2VzY2hlbgorICAgICBBZGRJbmZvKCJnb2xkIiwic2FndDogSWNoIGhhYmUga2VpbmVzLlxuIik7CisgICAgIFJlbW92ZUluZm8oImdvbGQiKTsKKworU0lFSEUgQVVDSDoKKyAgICAgQWRkSW5mbyhMKSwgQWRkU3BlY2lhbEluZm8oTCkKKyAgICAgUF9QUkVfSU5GTywgUF9ERUZBVUxUX0lORk8KKyAgICAgL3N0ZC9ucGMvaW5mby5jCisKKzE3LkF1Zy4yMDAzIEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9SZW1vdmVJdGVtIGIvZG9jL2xmdW4vUmVtb3ZlSXRlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTQ1NGY3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vUmVtb3ZlSXRlbQpAQCAtMCwwICsxLDQxIEBACitSZW1vdmVJdGVtKCkKKworRlVOS1RJT046CisJdm9pZCBSZW1vdmVJdGVtKG1peGVkIGZpbGUpOworCitERUZJTklFUlQgSU46CisJL3N0ZC9yb29tL2l0ZW1zLmMKKworQVJHVU1FTlRFOgorCWZpbGUKKwkgICAgIFN0cmluZyBvZGVyIEFycmF5IHZvbiBTdHJpbmdzIG1pdCBkZW0gTmFtZW4gZGVzIHp1IGVudGZlcm5lbmRlbgorCSAgICAgT2JqZWt0cy4KKworQkVTQ0hSRUlCVU5HOgorCURhcyBtaXQgQWRkSXRlbShmaWxlKSBkZW0gUmF1bSBoaW56dWdlZnVlZ3RlIE9iamVrdCB3aXJkIHdpZWRlciBhdXMKKwlkZXIgTGlzdGUgZGVyIE9iamVrdGUgZW50ZmVybnQuCisJV3VyZGUgYmVpIEFkZEl0ZW0oKSBlaW4gQXJyYXkgdm9uIERhdGVpbmFtZW4gdWViZXJnZWJlbiwgc28gbXVzcyBkYXMKKwlzZWxiZSBBcnJheSBhdWNoIGJlaSBSZW1vdmVJdGVtKCkgdWViZXJnZWJlbiB3ZXJkZW4hCisJRmFsbHMgZGFzIE9iamVrdCwgZGFzIGR1cmNoIGRlbiBBZGRJdGVtKCktQXVmcnVmIGVyemV1Z3Qgd3VyZGUsIHNpY2gKKwlub2NoIGltIFJhdW0gYmVmaW5kZXQsIHdpcmQgZXMgZHVyY2ggZGVuIFJlbW92ZUl0ZW0oKS1BdWZydWYgemVyc3RvZXJ0LgorCitSVUVDS0dBQkVXRVJUOgorCWtlaW5lcgorCitCRUlTUElFTEU6CisJRWluIG11ZWxsc2NobHVja2VyZnJlaWVyIExhZGVuIGxhZXNzdCBzaWNoIHdpZSBmb2xndCBlcnpldWdlbjoKKworCWluaGVyaXQgIi9zdGQvbGFkZW4iOworCSNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisKKwljcmVhdGUoKQorCXsKKwkgIDo6Y3JlYXRlKCk7ICAvLyBIaWVyIHdpcmQgdS5hLiBkZXIgTXVlbGxzY2hsdWNrZXIgZXJ6ZXVndAorCisJICBSZW1vdmVJdGVtKCIvb2JqL2VudHNvcmciKTsgLy8gdW5kIHdlZyBkYW1pdCEKKworCSAgU2V0UHJvcCguLi4pOyAgLy8gdW5kIGRpZSBub3JtYWxlIEJlc2NocmVpYnVuZy4uLgorCX0KKworU0lFSEUgQVVDSDoKKwlBZGRJdGVtKCksIC9zdGQvcm9vbS9pdGVtcy5jCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9SZW1vdmVLbm93blBvdGlvbiBiL2RvYy9sZnVuL1JlbW92ZUtub3duUG90aW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMTQxOGMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9SZW1vdmVLbm93blBvdGlvbgpAQCAtMCwwICsxLDI1IEBACitSZW1vdmVLbm93blBvdGlvbigpCisKK0ZVTktUSU9OOgorICAgICBpbnQgUmVtb3ZlS25vd25Qb3Rpb24oaW50IG5yKQorCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvcGxheWVyL3BvdGlvbi5jCisKK0FSR1VNRU5URToKKyAgICAgaW50IG5yICAgICAgIE51bW1lciBlaW5lcyBaVHMKKworQkVTQ0hSRUlCVU5HOgorICAgICBFbnRmZXJudCBlaW5lbiBiZWthbm50ZW4gWlQgYXVzIGVpbmVuIFNwaWVsZXIuIE51ciB2b20gT3Jha2VsIHJ1ZmJhci4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgMSAgRXJmb2xnCisgICAgIC0xIGZlaGxlbmRlIEJlcmVjaHRpZ3VuZworICAgICAtMiBOdW1tZXIgbmljaHQgZWluZ2V0cmFnZW4KKworU0lFSEUgQVVDSDoKKyAgICAgU29uc3RpZ2VzOiB6YXViZXJ0cmFlbmtlLCAvc2VjdXJlL3BvdGlvbm1hc3Rlci5jLCAvcm9vbS9vcmFrZWwuYworICAgICBWZXJ3YW5kdDogIEZpbmRQb3Rpb24oKSwgQWRkS25vd25Qb3Rpb24oKSwgSW5MaXN0KCkKKyAgICAgUHJvcHM6ICAgICBQX1BPVElPTlJPT01TLCBQX0tOT1dOX1BPVElPTlJPT01TCisKKzYuRmViIDIwMTYgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1JlbW92ZVBsdXJhbElkIGIvZG9jL2xmdW4vUmVtb3ZlUGx1cmFsSWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk2MGUwMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL1JlbW92ZVBsdXJhbElkCkBAIC0wLDAgKzEsMjggQEAKK1JlbW92ZVBsdXJhbElkKCkKKworRlVOS1RJT046CisgICAgIHZvaWQgUmVtb3ZlUGx1cmFsSWQobWl4ZWQgaWQpOworCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvdW5pdC5jCisKK0FSR1VNRU5URToKKyAgICAgaWQKKyAgICAgICAgICBJZGVudGZpa2F0aW9uc3N0cmluZyBvZGVyIEFycmF5IHZvbiBTdHJpbmdzCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRXMgd2VyZGVuIGVpbiBvZGVyIG1laHJlcmUgQmV6ZWljaG5lciBlbnRmZXJudCwgbWl0IGRlbmVuIHNpY2ggCisgICAgIG1laHJlcmUgRWluaGVpdGVuIGRlciBNZW5nZSBhbnNwcmVjaGVuIGxhc3Nlbi4KKworUlVFQ0tHQUJFV0VSVDoKKyAgICAga2VpbmVyCisKK0JFSVNQSUVMRToKKyAgICAgc2llaGUgL2l0ZW1zL21vbmV5LmMKKworU0lFSEUgQVVDSDoKKyAgICAgUmVtb3ZlU2luZ3VsYXJJZCgpLCBBZGRQbHVyYWxJZCgpLCBBZGRJZCgpLCBpZCgpLCAvc3RkL3VuaXQuYworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBNb24gSnVsIDE0IDExOjMwOjAwIDE5OTcgYnkgU2lsdmFuYQorCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9SZW1vdmVQdXJzdWVyIGIvZG9jL2xmdW4vUmVtb3ZlUHVyc3VlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmEyMzU4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vUmVtb3ZlUHVyc3VlcgpAQCAtMCwwICsxLDI2IEBACitSZW1vdmVSdXJzdWVyKCkKKworRlVOS1RJT046CisgIHZvaWQgUmVtb3ZlUHVyc3VlcihvYmplY3QgcHVyc3VlcikKKworQVJHVU1FTlRFOgorICBwdXJzdWVyOiBPYmpla3QsIGRhcyBhdXMgZGVyIFZlcmZvbGdlcmxpc3RlIGRlcyBPYmpla3RlcywgaW4gZGVtCisgICAgICAgICAgIFJlbW92ZVB1cnN1ZXIgYXVmZ2VydWZlbiB3dXJkZSwgYXVzZ2V0cmFnZW4gd2VyZGVuIHNvbGwuCisKK0ZVTktUSU9OOgorICBEdXJjaCBkZW4gQXVmcnVmIHZvbiBSZW1vdmVQdXJzdWVyIGluIGVpbmVtIE9iamVrdCwgd2VsY2hlcyBsaXZpbmcoKSBpc3QsCisgIHdpcmQgZGFzIE9iamVjdCwgd2VsY2hlcyBhbHMgQXJndW1lbnQgdWViZXJnZWJlbiB3dXJkZSBhdXMgZGVyIExpc3RlCisgIGRlciBWZXJmb2xnZXIgYXVzZ2V0cmFnZW4uCisKK1JVRUNLR0FCRVdFUlQ6CisgIGtlaW5lcgorCitCRU1FUktVTkc6CisgIGtlaW5lCisKK0JFSVNQSUVMRToKKyAgZmluZF9wbGF5ZXIoImpvZiIpLT5SZW1vdmVQdXJzdWVyKGZpbmRfcGxheWVyKCJraXJrIikpCisgIERhbmFjaCB3aXJkIEpvZiBuaWNodCBtZWhyIHZvbiBLaXJrIHZlcmZvbGd0LgorCitTSUVIRSBBVUNIOgorICAiQWRkUHVyc3VlciIsICJQcmV2ZW50Rm9sbG93IgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vUmVtb3ZlUmVhZERldGFpbCBiL2RvYy9sZnVuL1JlbW92ZVJlYWREZXRhaWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM1Nzk1NAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL1JlbW92ZVJlYWREZXRhaWwKQEAgLTAsMCArMSwzMSBAQAorUmVtb3ZlUmVhZERldGFpbCgpCisKK0ZVTktUSU9OOgorICAgIHZvaWQgUmVtb3ZlUmVhZERldGFpbChzdHJpbmd8c3RyaW5nKiBrZXlzKTsKKworREVGSU5JRVJUIElOOgorICAgIC9zdGQvdGhpbmcvZGVzY3JpcHRpb24uYworCitBUkdVTUVOVEU6CisgICAga2V5cworICAgICAgICAgU3RyaW5nIG9kZXIgQXJyYXkgdm9uIFN0cmluZ3MgbWl0IGRlbiB6dSBlbnRmZXJuZW5kZW4gRGV0YWlscy4KKworQkVTQ0hSRUlCVU5HOgorICAgIEVudGZlcm50IGRpZSBpbiBrZXlzIGFuZ2VnZWJlbmVuIERldGFpbHMgYXVzIGRlciBMaXN0ZSBkZXIgdm9yaGFuZGVuZW4KKyAgICBsZXNiYXJlbiBEZXRhaWxzLgorCitCRU1FUktVTkdFTjoKKyAgICBVZWJlcmdpYnQgbWFuIGZ1ZXIga2V5cyBlaW5lIDAsIHNvIHdlcmRlbiBzYWVtdGxpY2hlIGxlc2JhcmVuIERldGFpbHMKKyAgICBlbnRmZXJudCEKKworU0lFSEUgQVVDSDoKKyAgICBTZXR6ZW46ICAgIEFkZERldGFpbCgpLCBBZGRSZWFkRGV0YWlsKCksIEFkZFNtZWxscygpLCBBZGRTb3VuZHMoKSwKKyAgICAgICAgICAgICAgIEFkZFRvdWNoRGV0YWlsKCkKKyAgICBMb2VzY2hlbjogIFJlbW92ZURldGFpbCgpLCBSZW1vdmVTbWVsbHMoKSwKKyAgICAgICAgICAgICAgIFJlbW92ZVNvdW5kcygpLCBSZW1vdmVUb3VjaERldGFpbCgpCisgICAgRGF0ZW46ICAgICBQX0RFVEFJTFMsIFBfUkVBRF9ERVRBSUxTLCBQX1NNRUxMUywgUF9TT1VORFMsIFBfVE9VQ0hfREVUQUlMUworICAgIFZlcmFsdGV0OiAgQWRkU3BlY2lhbERldGFpbCgpLCBSZW1vdmVTcGVjaWFsRGV0YWlsKCksIFBfUkVBRF9NU0cKKyAgICBTb25zdGlnZXM6IEdldERldGFpbCgpLCBicmVha19zdHJpbmcoKQorCisyMC4wMS4yMDE1LCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1JlbW92ZVJlc2lzdGFuY2VNb2RpZmllciBiL2RvYy9sZnVuL1JlbW92ZVJlc2lzdGFuY2VNb2RpZmllcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTYzMGZiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vUmVtb3ZlUmVzaXN0YW5jZU1vZGlmaWVyCkBAIC0wLDAgKzEsMzcgQEAKK1JlbW92ZVJlc2lzdGFuY2VNb2RpZmllcigpCisKK0ZVTktUSU9OOgorICAgICB2YXJhcmdzIHZvaWQgUmVtb3ZlUmVzaXN0YW5jZU1vZGlmaWVyKHN0cmluZyBhZGQpOworCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvbGl2aW5nL2NvbWJhdC5jCisKK0FSR1VNRU5URToKKyAgICAgc3RyaW5nIGFkZDoKKyAgICAgIEVpbiBldmVudHVlbGxlciBJZGVudGlmaWthdG9yIGZ1ZXIgZWluZW4gZ2VzZXR6dGVuIE1vZGlmaWthdG9yLgorCitCRVNDSFJFSUJVTkc6CisgICAgIERpZSB2b24gZWluZW0gT2JqZWt0IGltIFppZWxvYmpla3QgZ2VzZXR6dGUgUmVzaXN0ZW56IHdpcmQgZ2Vsb2VzY2h0LAorICAgICBkZXIgU2NobHVlc3NlbCBhZGQgd2lyZCBkYXp1IGJlbnV0enQsIGVpbmUgYmVzdGltbXRlIFJlc2lzdGVueiB6dQorICAgICBsb2VzY2hlbiAoc28ga2FubiBlaW4gc2V0emVuZGVzIE9iamVrdCBtZWhyZXJlIHZlcnNjaGllZGVuZSBSZS0KKyAgICAgc2lzdGVuemVuIHNldHplbiB1bmQgc2VsZWt0aXYgbG9lc2NoZW4pLgorCitCRUlTUElFTEU6CisgICAgIC8vIHVuc2VyIE9lbCBhdXMgQWRkUmVzaXN0YW5jZU1vZGlmaWVyKCkgdmVyYnJlbm50IGVuZGd1ZWx0aWcKKyAgICAgdmFyYXJncyB2b2lkIHRyaWdnZXJfc2Vuc2l0aXZlX2F0dGFjaygpIHsKKyAgICAgIC4uLgorICAgICAgaWYoZW52aXJvbm1lbnQoKSAmJiBsaXZpbmcoZW52aXJvbm1lbnQoKSkpIHsKKyAgICAgICBlbnZpcm9ubWVudCgpLT5SZW1vdmVSZXNpc3RhbmNlTW9kaWZpZXIoIm9lbCIpOworICAgICAgIHRlbGxfb2JqZWN0KGVudmlyb25tZW50KCksIkRhcyBPZWwgdmVyYnJlbm50IGVuZGd1ZWx0aWcuXG4iKTsKKyAgICAgIH0KKyAgICAgIHJlbW92ZSgpOworICAgICB9CisKK1NJRUhFIEFVQ0g6CisgICAgIE1vZGlmaWthdG9yZW46CUFkZFJlc2lzdGFuY2VNb2RpZmllciwgUF9SRVNJU1RBTkNFX01PRElGSUVSCisgICAgIHNpbXBsZSBSZXNpc3Rlbno6CVBfUkVTSVNUQU5DRSwgUF9WVUxORVJBQklMSVRZCisgICAgIEhhdXB0bWFwcGluZzoJUF9SRVNJU1RBTkNFX1NUUkVOR1RIUworICAgICBCZXJlY2hudW5nOglDaGVja1Jlc2lzdGFuY2UoKSwgVXBkYXRlUmVzaXN0YW5jZVN0cmVuZ3RocygpCisgICAgIGFuZGVyZXM6CQliYWxhbmNlLCAvc3RkL2FybW91ci9jb21iYXQuYywgL3N0ZC9saXZpbmcvY29tYmF0LmMKKworMjkuQXByIDIwMDIsIEdsb2luc29uQE1HCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9SZW1vdmVSb3V0ZSBiL2RvYy9sZnVuL1JlbW92ZVJvdXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMDE3MTkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9SZW1vdmVSb3V0ZQpAQCAtMCwwICsxLDIzIEBACitSZW1vdmVSb3V0ZSgpCisKK0ZVTktUSU9OOgorICAgICB2b2lkIFJlbW92ZVJvdXRlKCk7CisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC90cmFuc3BvcnQuYworCitBUkdVTUVOVEU6CisgICAgIGtlaW5lCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGVyIFRyYW5zcG9ydGVyIHdpcmQgYW5nZWhhbHRlbiB1bmQgZGVyIGdlc2FtdGUgRmFocnBsYW4gd2lyZAorICAgICBnZWxvZXNjaHQuIERhbWl0IGxhc3NlbiBzaWNoIHp1bSBCZWlzcGllbCB2YXJpYWJsZSBSb3V0ZW4ga29uc3RydWllcmVuLgorCitSVWVDS0dBQkVXRVJUOgorICAgICBrZWluZXIKKworU0lFSEUgQVVDSDoKKyAgICAgQWRkUm91dGUoKSwgQWRkTXNnKCksIEFkZEZ1bigpLCAvc3RkL3RyYW5zcG9ydC5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFdlZCBNYXkgOCAxMDoyNDoyNiAxOTk2IGJ5IFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vUmVtb3ZlU2Vuc2l0aXZlT2JqZWN0IGIvZG9jL2xmdW4vUmVtb3ZlU2Vuc2l0aXZlT2JqZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNmUwZGMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9SZW1vdmVTZW5zaXRpdmVPYmplY3QKQEAgLTAsMCArMSw1NiBAQAorUmVtb3ZlU2Vuc2l0aXZlT2JqZWN0KCkKK0ZVTktUSU9OOgorICAgICB2b2lkIFJlbW92ZVNlbnNpdGl2ZU9iamVjdChvYmplY3Qgb2IpCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC9jb250YWluZXIvaW52ZW50b3J5LmMKKyAgICAgZ2VuZXJhbGl6ZXMgL3N0ZC9saXZpbmcvaW52ZW50b3J5LmMKKworQVJHVU1FTlRFOgorICAgICBvYiAtIHp1IGVudGZlcm5lbmRlcyBPYmpla3QKKworQkVTQ0hSRUlCVU5HOgorICAgICBFbnRmZXJudCBvYiBhdXMgZGVuIEJlbmFjaHJpY2h0aWd1bmdzbGlzdGVuIGRlcyBDb250YWluZXJzLgorICAgICBXaXJkIHZvbiB0aGluZy9tb3ZpbmcuYyBpbSBhbHRlbiBFbnZpcm9ubWVudCBnZXJ1ZmVuLCB3ZW5uCisgICAgIFBfU0VOU0lUSVZFIGdlc2V0enQgaXN0LgorICAgICBSdWZ0IGRhenUgUmVtb3ZlU2Vuc2l0aXZlT2JqZWN0RnJvbUxpc3QoKS4KKworQkVNRVJLVU5HRU46CisgICAgIFNldHp0IG1hbiBQX1NFTlNJVElWRSBuaWNodCBhbHMgRGVmYXVsdCBzb25kZXJuIHNpdHVhdGlvbnNhYmhhZW5naWcsCisgICAgIGRhbm4gbXVzcyBtYW4gYXVjaCBSZW1vdmVTZW5zaXRpdmVPYmplY3QgaW0gRW52aXJvbm1lbnQKKyAgICAgYXVjaCBzZWxic3QgcnVmZW4hCisKK0JFSVNQSUVMOgorICAgICAvLyBGYWNrZWwgKGluaGVyaXRpbmcgbGlnaHRzb3VyY2UpCisgICAgIHZvaWQgY3JlYXRlKCkgeworICAgICAuLi4KKyAgICAgICBTZXRQcm9wKFBfU0VOU0lUSVZFLAorICAgICAgICAoeyh7U0VOU0lUSVZFX0lOVkVOVE9SWV9UUklHR0VSLERUX0ZJUkUsMTIwfSl9KSk7CisgICAgIC4uLgorICAgICB9CisKKyAgICAgLy8gd2VubiBkaWUgRmFja2VsIGdlbG9lc2NodCB3aXJkLCB2ZXJsaWVydCBzaWUgaWhyZSBha3RpdmUKKyAgICAgLy8gRWlnZW5zY2hhZnQgdW5kIG11c3MgZGFzIGRlbSBlbnZpcm9ubWVudCgpIG1pdHRlaWxlbgorICAgICBzdGF0aWMgaW50IGV4dGluZ3Vpc2goc3RyaW5nIHN0cikgeworICAgICAgaW50IGk7CisgICAgICBpPTo6ZXh0aW5ndWlzaChzdHIpOworICAgICAgaWYoaSAmJiBRdWVyeVByb3AoUF9MSUdIVCk8PTApIHsKKyAgICAgICBTZXRQcm9wKFBfU0VOU0lUSVZFLDApOworICAgICAgIGlmKGVudmlyb25tZW50KCkpCisgICAgICAgIGVudmlyb25tZW50KCktPlJlbW92ZVNlbnNpdGl2ZU9iamVjdCh0aGlzX29iamVjdCgpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBpOworICAgICB9CisKKyAgICAgLSBlbXBmaW5kbGljaGUgT2JqZWt0ZSB3aWUgRWlzemFwZmVuIGtvZW5uZW4gamV0enQgd2llZGVyIGdlZmFocmxvcworICAgICAgIGluIGRhcyBzZWxiZSBlbnZpcm9ubWVudCgpIGJld2VndCB3ZXJkZW4KKworU0lFSEUgQVVDSDoKKyAgICAgUF9TRU5TSVRJVkUKKyAgICAgSW5zZXJ0U2Vuc2l0aXZlT2JqZWN0CisgICAgIGluc2VydF9zZW5zaXRpdmVfaW52X3RyaWdnZXIsIGluc2VydF9zZW5zaXRpdmVfaW52CisgICAgIFBfU0VOU0lUSVZFX0FUVEFDSywgUF9TRU5TSVRJVkVfSU5WRU5UT1JZLCBQX1NFTlNJVElWRV9JTlZFTlRPUllfVFJJR0dFUgorICAgICBDaGVja1NlbnNpdGl2ZUF0dGFjaworCisyNS5BcHIuMjAwMSwgR2xvaW5zb25ATUcKKwpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vUmVtb3ZlU2luZ3VsYXJJZCBiL2RvYy9sZnVuL1JlbW92ZVNpbmd1bGFySWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE2OTk5YwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL1JlbW92ZVNpbmd1bGFySWQKQEAgLTAsMCArMSwyOCBAQAorUmVtb3ZlU2luZ3VsYXJJZCgpCisKK0ZVTktUSU9OOgorICAgICB2b2lkIFJlbW92ZVNpbmd1bGFySWQobWl4ZWQgaWQpOworCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvdW5pdC5jCisKK0FSR1VNRU5URToKKyAgICAgaWQKKyAgICAgICAgICBJZGVudGlmaWthdGlvbnNzdHJpbmcgb2RlciBBcnJheSB2b24gU3RyaW5ncworCitCRVNDSFJFSUJVTkc6CisgICAgIEVzIHdlcmRlbiBlaW4gb2RlciBtZWhyZXJlIEJlemVpY2huZXIgZW50ZmVybnQsIG1pdCBkZW5lbiBzaWNoIGVpbmUKKyAgICAgZWluemVsbmUgRWluaGVpdCBhbnNwcmVjaGVuIGxhZXNzdC4KKworUlVFQ0tHQUJFV0VSVDoKKyAgICAga2VpbmVyCisKK0JFSVNQSUVMRToKKyAgICAgc2llaGUgL2l0ZW1zL21vbmV5LmMKKworU0lFSEUgQVVDSDoKKyAgICAgQWRkU2luZ3VsYXJJZCgpLCBSZW1vdmVQbHVyYWxJZCgpLCBBZGRJZCgpLCBpZCgpLCAvc3RkL3VuaXQuYworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBNb24gSnVsIDE0IDExOjMxOjAwIDE5OTcgYnkgU2lsdmFuYQorCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9SZW1vdmVTa2lsbEF0dHJpYnV0ZU1vZGlmaWVyIGIvZG9jL2xmdW4vUmVtb3ZlU2tpbGxBdHRyaWJ1dGVNb2RpZmllcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWRmZDEwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vUmVtb3ZlU2tpbGxBdHRyaWJ1dGVNb2RpZmllcgpAQCAtMCwwICsxLDU5IEBACitSZW1vdmVTa2lsbEF0dHJpYnV0ZU1vZGlmaWVyKCkKK0ZVTktUSU9OOgorICAgIHB1YmxpYyBpbnQgUmVtb3ZlU2tpbGxBdHRyaWJ1dGVNb2RpZmllcihvYmplY3QgY2FzdGVyLCBzdHJpbmcgYXRybmFtZSkKKworREVGSU5JRVJUIElOOgorICAgIC9zdGQvbGl2aW5nL3NraWxsX2F0dHJpYnV0ZXMuYworCitBUkdVTUVOVEU6CisgICAgPGF0cm5hbWU+ICAgc3RyaW5nCisgICAgICAgICAgICAgICAgTmFtZSBkZXMgU2tpbGwtQXR0cmlidXRlcywgdm9uIGRlbSBkZXIgTW9kaWZpa2F0b3IgZ2Vsb2VzY2h0CisgICAgICAgICAgICAgICAgd2VyZGVuIHNvbGwuCisgICAgICAgICAgICAgICAgKERlZmluaWVydCBpbiAvc3lzL2xpdmluZy9za2lsbF9hdHRyaWJ1dGVzLmgpCisKKyAgICA8Y2FzdGVyPiAgICBvYmplY3QKKyAgICAgICAgICAgICAgICBPYmpla3QsIGRlc3NlbiBNb2RpZmlrYXRvciB3aWVkZXIgZW50ZmVybnQgd2VyZGVuIHNvbGwuCisKK0JFU0NIUkVJQlVORzoKKyAgICBFbnRmZXJudCBkZW4gTW9kaWZpa2F0b3IsIGRlbiBPYmplY3QgPGNhc3Rlcj4gZ2VzZXR6dCBoYXQsIHdpZWRlci4gRGllcworICAgIGlzdCBudXIgbm90d2VuZGlnLCB3ZW5uIGRlciBFZmZla3Qgdm9yIEFibGF1ZiBkZXIgR3VlbHRpZ2tlaXQgZGVzCisgICAgTW9kaWZpa2F0b3JzIGF1ZmdlaG9iZW4gd2VyZGVuIHNvbGwuCisKK1JVRUNLR0FCRVdFUlQ6CisgICAgU0FfTU9EX1JFTU9WRUQgICAgICAgICB3ZW5uIGRlciBNb2RpZmlrYXRvciBnZWxvZXNjaHQgd3VyZGUKKyAgICBTQV9NT0RfTk9UX0ZPVU5EICAgICAgIHdlbm4gZGVyIE1vZGlmaWthdG9yIG5pY2h0IGdlZnVuZGVuIHd1cmRlCisgICAgV2VubiBtYW4gbnVyIHdpc3NlbiB3aWxsLCBvYiBkaWUgT3BlcmF0aW9uIGVyZm9sZ3JlaWNoIHdhciwgZW1wZmllaGx0IGVzCisgICAgc2ljaCwgYXVmID09IFNBX01PRF9SRU1PVkVEIHp1IHBydWVmZW4uCisKK0JFSVNQSUVMRToKKyAgICAvLyBlaW5lIFdhZmZlIHNldHp0IGltIEluZm9ybVdpZWxkKCkgZWluZW4gQm9udXMgYXVmIFNBX0RBTUFHRSBmdWVyIDEwbWluCisgICAgcHJvdGVjdGVkIHZvaWQgSW5mb3JtV2llbGQob2JqZWN0IHBsLCBpbnQgc2lsZW50KSB7CisgICAgICBpZiAob2JqZWN0cChwbCkpIHsKKyAgICAgICAgaWYgKHBsLT5Nb2RpZnlTa2lsbEF0dHJpYnV0ZShTQV9EQU1BR0UsIDIwLCA2MDApID09IFNBX01PRF9PSykKKyAgICAgICAgICAvLyBFcmZvbGdzbWVsZHVuZyBhbiBTcGllbGVyCisgICAgICAgIGVsc2UKKyAgICAgICAgICAvLyBNaXNzZXJmb2xnc21lbGR1bmcgYW4gU3BpZWxlci4KKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyB3ZW5uIGRlciBTcGllbGVyIGRpZSBXYWZmZSB2b3IgQWJsYXVmIGRlciA2MDBzIHdlZ3N0ZWNrZW4gd2lsbCwgbXVzcworICAgIC8vIGRlciBCb251cyBuYXR1ZXJsaWNoIGF1Y2ggd2llZGVyIHJhdXMKKyAgICBwcm90ZWN0ZWQgdm9pZCBJbmZvcm1VbndpZWxkKG9iamVjdCBwbCwgaW50IHNpbGVudCkgeworICAgICAgaWYgKG9iamVjdHAocGwpKQorICAgICAgICBwbC0+UmVtb3ZlU2tpbGxBdHRyaWJ1dGVNb2RpZmllcih0aGlzX29iamVjdCgpLCBTQV9EQU1BR0UpOworICAgICAgICAvLyBmYWxscyBrZWluIHNvbGNoZXIgTW9kIG1laHIgZ2VzZXR6dCB3YXIsIGxpZWZlcnQgUlNBTSgpCisgICAgICAgIC8vIFNBX01PRF9OT1RfRk9VTkQgenVydWVjay4gQXVzd2VydHVuZyBkZXMgUnVlY2tnYWJld2VydGVzIGlzdAorICAgICAgICAvLyB2ZXJuYWNobGFlc3NpZ3QuCisgICAgfQorICAgIAorU0lFSEUgQVVDSDoKKyAgICBTa2lsbHMgTGVybmVuOiAgTGVhcm5Ta2lsbCwgTW9kaWZ5U2tpbGwsIExpbWl0QWJpbGl0eQorICAgICogTnV0enVuZzogICAgICBVc2VTcGVsbCwgVXNlU2tpbGwKKyAgICAqIEFiZnJhZ2VuOiAgICAgUXVlcnlTa2lsbCwgUXVlcnlTa2lsbEFiaWxpdHkKKyAgICAqIE1vZGlmaWthdGlvbjogTW9kaWZ5U2tpbGxBdHRyaWJ1dGUsIFF1ZXJ5U2tpbGxBdHRyaWJ1dGUsCisgICAgICAgICAgICAgICAgICAgIFF1ZXJ5U2tpbGxBdHRyaWJ1dGVNb2RpZmllcgorICAgICAgKiBQcm9wZXJ0aWVzOiBQX1NLSUxMX0FUVFJJQlVURVMsIFBfU0tJTExfQVRUUklCVVRFX09GRlNFVFMKKyAgICAqIHNvbnN0aWc6ICAgICAgc3BydWNoZXJtdWVkdW5nLCBza2lsbF9pbmZvX2xpc3RlCisgICAgKiBQcm9wZXJ0aWVzOiAgIFBfTkVXU0tJTExTCisKKzEzLjA4LjIwMDgsIFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1JlbW92ZVNtZWxscyBiL2RvYy9sZnVuL1JlbW92ZVNtZWxscwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzcyMjA3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vUmVtb3ZlU21lbGxzCkBAIC0wLDAgKzEsMzggQEAKK1JlbW92ZVNtZWxscygpCisKK0ZVTktUSU9OOgorICAgIHZvaWQgUmVtb3ZlU21lbGxzKHN0cmluZ3xzdHJpbmcqIGtleXMpOworCitERUZJTklFUlQgSU46CisgICAgL3N0ZC90aGluZy9kZXNjcmlwdGlvbi5jCisKK0FSR1VNRU5URToKKyAgICBrZXlzCisgICAgICBTdHJpbmcgb2RlciBBcnJheSB2b24gU3RyaW5ncyBtaXQgZGVuIHp1IGVudGZlcm5lbmRlbiBEZXRhaWxzLgorCitCRVNDSFJFSUJVTkc6CisgICAgRGllc2UgRnVua3Rpb24gZW50c3ByaWNodCBkZW0gUmVtb3ZlRGV0YWlsKCkgZnVlciBTdGFuZGFyZGRldGFpbHMsCisgICAgbnVyIGtvZW5uZW4gaGllcm1pdCBHZXJ1ZWNoZSBlbnRmZXJudCB3ZXJkZW46CisgICAgRW50ZmVybnQgZGllIGluIDxrZXlzPiBhbmdlZ2ViZW5lbiBEZXRhaWxzIGF1cyBkZXIgTGlzdGUgZGVyCisgICAgdm9yaGFuZGVuZW4gRGV0YWlscy4gVWViZXJnaWJ0IG1hbiBmdWVyIDxrZXlzPiBlaW5lIDAsIHNvIHdlcmRlbgorICAgIHNhZW10bGljaGUgRGV0YWlscyBlbnRmZXJudCEKKworQkVJU1BJRUw6CisgICAgWnVlcnN0IGVyemV1Z2VuIHdpciBlaW4ga2xlaW5lcyBEZXRhaWwsIG1pdCBkZW0gd2lyIGFtIFJhdWNoIHJpZWNoZW4KKyAgICBrb2VubmVuLiBEYXMgRmV1ZXIgYnJlbm50IGxhbmdzYW0gYWIgdW5kIGRhcyBEZXRhaWwgd2lyZCB3aWVkZXIKKyAgICBlbnRmZXJudDoKKworICAgICAgQWRkU21lbGxzKCJyYXVjaCIsKiBIIFUgUyBUICpcbiIpOworICAgICAgY2FsbF9vdXQoIydSZW1vdmVTbWVsbHMsIDEwMCwgInJhdWNoIik7CisKK1NJRUhFIEFVQ0g6CisgICAgU2V0emVuOiAgICBBZGREZXRhaWwoKSwgQWRkUmVhZERldGFpbCgpLCBBZGRTbWVsbHMoKSwgQWRkU291bmRzKCksCisgICAgICAgICAgICAgICBBZGRUb3VjaERldGFpbCgpCisgICAgTG9lc2NoZW46ICBSZW1vdmVEZXRhaWwoKSwgUmVtb3ZlUmVhZERldGFpbCgpLCBSZW1vdmVTbWVsbHMoKSwKKyAgICAgICAgICAgICAgIFJlbW92ZVNvdW5kcygpLCBSZW1vdmVUb3VjaERldGFpbCgpCisgICAgRGF0ZW46ICAgICBQX0RFVEFJTFMsIFBfUkVBRF9ERVRBSUxTLCBQX1NNRUxMUywgUF9TT1VORFMsIFBfVE9VQ0hfREVUQUlMUworICAgIFZlcmFsdGV0OiAgQWRkU3BlY2lhbERldGFpbCgpLCBSZW1vdmVTcGVjaWFsRGV0YWlsKCksIFBfUkVBRF9NU0cKKyAgICBTb25zdGlnZXM6IEdldERldGFpbCgpLCBicmVha19zdHJpbmcoKQorCisyMC4wMS4yMDE1LCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1JlbW92ZVNvdW5kcyBiL2RvYy9sZnVuL1JlbW92ZVNvdW5kcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGQ5MDBhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vUmVtb3ZlU291bmRzCkBAIC0wLDAgKzEsNDYgQEAKK1JlbW92ZVNvdW5kcygpCisKK0ZVTktUSU9OOgorICAgIHZvaWQgUmVtb3ZlU291bmRzKHN0cmluZ3xzdHJpbmcqIGtleXMpOworCitERUZJTklFUlQgSU46CisgICAgL3N0ZC90aGluZy9kZXNjcmlwdGlvbi5jCisKK0FSR1VNRU5URToKKyAgICBrZXlzCisgICAgICBTdHJpbmcgb2RlciBBcnJheSB2b24gU3RyaW5ncyBtaXQgZGVuIHp1IGVudGZlcm5lbmRlbiBEZXRhaWxzLgorCitCRVNDSFJFSUJVTkc6CisgICAgRGllc2UgRnVua3Rpb24gZW50c3ByaWNodCBkZW0gUmVtb3ZlRGV0YWlsKCkgZnVlciBTdGFuZGFyZGRldGFpbHMsICAgCisgICAgbnVyIGtvZW5uZW4gaGllcm1pdCBHZXJhdWVzY2hlIGVudGZlcm50IHdlcmRlbjoKKyAgICBFbnRmZXJudCBkaWUgaW4gPGtleXM+IGFuZ2VnZWJlbmVuIERldGFpbHMgYXVzIGRlciBMaXN0ZSBkZXIKKyAgICB2b3JoYW5kZW5lbiBEZXRhaWxzLiBVZWJlcmdpYnQgbWFuIGZ1ZXIgPGtleXM+IGVpbmUgMCwgc28gd2VyZGVuCisgICAgc2FlbXRsaWNoZSBEZXRhaWxzIGVudGZlcm50IQorCitCRUlTUElFTDoKKyAgICBXaXIgbGFzc2VuIGV0d2FzIE11c2lrIHNwaWVsZW4gdW5kIHdlbm4gd2lyIGRlbiBQbGF0dGVuc3BpZWxlcgorICAgIGF1c21hY2hlbiwgZGFubiBlbmRldCBzaWUgdW5kIG1hbiBob2VydCBhdWNoIG5pY2h0cyBtZWhyOgorCisgICAgICBpbnQgYXVzbWFjaGVuKHN0cmluZyBzdHIpOworICAgICAgLi4uCisgICAgICBBZGRTb3VuZHMoKHsibXVzaWsiLCJoaXAtaG9wIn0pICwiS2xpbmd0IG5hY2ggSGlwLUhvcC4uLlxuIik7CisgICAgICBBZGRDbWQoIm1hY2h8bWFjaGUmcGxhdHRlbnNwaWVsZXImYXVzIiwgIydhdXNtYWNoZW4sCisgICAgICAgICAgICAgIldhcyB3aWxsc3QgZHUgKGF1cyltYWNoZW4/fFdpbGxzdCBkdSBkZW4gYXVzbWFjaGVuP14iKTsKKyAgICAgIC4uLgorICAgICAgaW50IGF1c21hY2hlbihzdHJpbmcgc3RyKSB7CisgICAgICAgIGlmKCFHZXREZXRhaWwoIm11c2lrIiwgMCwgU0VOU0VfU09VTkQpKSAvLyBleGlzdGllcnQgTXVzaWtkZXRhaWwgPworICAgICAgICAgIHJldHVybigiRGVyIFBsYXR0ZW5zcGllbGVyIGxhZXVmdCBkb2NoIGdhciBuaWNodCFcbiIsIDEpOworICAgICAgICBSZW1vdmVTb3VuZHMoMCk7CisgICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKworU0lFSEUgQVVDSDoKKyAgICBTZXR6ZW46ICAgIEFkZERldGFpbCgpLCBBZGRSZWFkRGV0YWlsKCksIEFkZFNtZWxscygpLCBBZGRTb3VuZHMoKSwKKyAgICAgICAgICAgICAgIEFkZFRvdWNoRGV0YWlsKCkKKyAgICBMb2VzY2hlbjogIFJlbW92ZURldGFpbCgpLCBSZW1vdmVSZWFkRGV0YWlsKCksIFJlbW92ZVNtZWxscygpLAorICAgICAgICAgICAgICAgUmVtb3ZlVG91Y2hEZXRhaWwoKQorICAgIERhdGVuOiAgICAgUF9ERVRBSUxTLCBQX1JFQURfREVUQUlMUywgUF9TTUVMTFMsIFBfU09VTkRTLCBQX1RPVUNIX0RFVEFJTFMKKyAgICBWZXJhbHRldDogIEFkZFNwZWNpYWxEZXRhaWwoKSwgUmVtb3ZlU3BlY2lhbERldGFpbCgpLCBQX1JFQURfTVNHCisgICAgU29uc3RpZ2VzOiBHZXREZXRhaWwoKSwgYnJlYWtfc3RyaW5nKCkKKworOC4gSnVsaSAyMDExIEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9SZW1vdmVTcGVjaWFsRGV0YWlsIGIvZG9jL2xmdW4vUmVtb3ZlU3BlY2lhbERldGFpbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmVjNGNiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vUmVtb3ZlU3BlY2lhbERldGFpbApAQCAtMCwwICsxLDM3IEBACitWRVJBTFRFVDogUmVtb3ZlU3BlY2lhbERldGFpbCgpCisKK0ZVTktUSU9OOgorICAgIHZvaWQgUmVtb3ZlU3BlY2lhbERldGFpbChzdHJpbmd8c3RyaW5nKiBrZXlzKTsKKworREVGSU5JRVJUIElOOgorICAgIC9zdGQvdGhpbmcvZGVzY3JpcHRpb24uYworCitBUkdVTUVOVEU6CisgICAga2V5cworICAgICAgU3RyaW5nIG9kZXIgQXJyYXkgdm9uIFN0cmluZ3MgbWl0IGRlbiB6dSBlbnRmZXJuZW5kZW4gRGV0YWlscy4KKworQkVTQ0hSRUlCVU5HOgorICAgIEVudGZlcm50IGRpZSBpbiBrZXlzIGFuZ2VnZWJlbmVuIERldGFpbHMgYXVzIGRlciBMaXN0ZSBkZXIKKyAgICB2b3JoYW5kZW5lbiBTcGVjaWFsRGV0YWlscy4KKworICAgIFZFUkFMVEVUOiBCaXR0ZSBSZW1vdmVEZXRhaWwoKSBiZW51dHplbi4KKworQkVNRVJLVU5HRU46CisgICAgVWViZXJnaWJ0IG1hbiBmdWVyIGtleXMgZWluZSAwLCBzbyB3ZXJkZW4gc2FlbXRsaWNoZSBTcGVjaWFsRGV0YWlscworICAgIGVudGZlcm50IQorICAgIERhIGludGVybiBEZXRhaWxzIHVuZCBTcGVjaWFsRGV0YWlscyBpbSBnbGVpY2hlbiBNYXBwaW5nIHZlcndhbHRldAorICAgIHdlcmRlbiwgbGFzc2VuIHNpY2ggbWl0IGRpZXNlciBGdW5rdGlvbiBhdWNoIERldGFpbHMgZW50ZmVybmVuLgorICAgIE1hbiBzb2xsdGUgZGllc2UgRnVua3Rpb24gZGVzaGFsYiBuaWNodCBtZWhyIHZlcndlbmRlbiwgc2llaGUKKyAgICBBZGREZXRhaWwgbWl0IENsb3N1cmVzLgorCitTSUVIRSBBVUNIOgorICAgIFNldHplbiA6ICAgQWRkRGV0YWlsKCksIEFkZFJlYWREZXRhaWwoKSwgQWRkU21lbGxzKCksIEFkZFNvdW5kcygpLAorICAgICAgICAgICAgICAgQWRkVG91Y2hEZXRhaWwoKQorICAgIExvZXNjaGVuOiAgUmVtb3ZlRGV0YWlsKCksIFJlbW92ZVJlYWREZXRhaWwoKSwgUmVtb3ZlU21lbGxzKCksCisgICAgICAgICAgICAgICBSZW1vdmVTb3VuZHMoKSwgUmVtb3ZlVG91Y2hEZXRhaWwoKQorICAgIERhdGVuOiAgICAgUF9ERVRBSUxTLCBQX1JFQURfREVUQUlMUywgUF9TTUVMTFMsIFBfU09VTkRTLCBQX1RPVUNIX0RFVEFJTFMKKyAgICBWZXJhbHRldDogIEFkZFNwZWNpYWxEZXRhaWwoKSwgUF9SRUFEX01TRworICAgIFNvbnN0aWdlczogR2V0RGV0YWlsKCksIGJyZWFrX3N0cmluZygpCisKKzIwLjAxLjIwMTUsIFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vUmVtb3ZlU3BlY2lhbEV4aXQgYi9kb2MvbGZ1bi9SZW1vdmVTcGVjaWFsRXhpdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWExOGU0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vUmVtb3ZlU3BlY2lhbEV4aXQKQEAgLTAsMCArMSwyOSBAQAorUmVtb3ZlU3BlY2lhbEV4aXQoKQorRlVOS1RJT046CisgICAgIHZvaWQgUmVtb3ZlU3BlY2lhbEV4aXQoc3RyaW5nfHN0cmluZyogY21kKTsKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL3Jvb20vZXhpdHMKKworQVJHVU1FTlRFOgorICAgICBzdHJpbmcvc3RyaW5nKiBjbWQKKyAgICAgICAgICBSaWNodHVuZyhlbiksIGRpZSBlbnRmZXJudCB3ZXJkZW4gc29sbGVuLgorCitCRVNDSFJFSUJVTkc6CisgICAgIERpZSBpbiBjbWQgYW5nZWdlYmVuZW4gQXVzZ2FlbmdlIHdlcmRlbiB3aWVkZXIgZW50ZmVybnQuCisKKyAgICAgSXN0IGNtZCA9IDAsIHNvIHdlcmRlbiBhbGxlIEF1c2dhZW5nZSBlbnRmZXJudC4KKworQkVNRVJLVU5HRU46CisgICAgIEF1c2dhZW5nZSB3ZXJkZW4gYW4gZGVyIGdsZWljaGVuIFN0ZWxsZSBnZXNwZWljaGVydDoKKyAgICAgLSBSZW1vdmVTcGVjaWFsRXhpdCgpIGdyZWlmdCBhdWYgZGllIGdsZWljaGVuIERhdGVuIHdpZSBSZW1vdmVFeGl0KCkKKyAgICAgICB6dSwgZW50ZmVybnQgYWxzbyBhdWNoIG5vcm1hbGUgQXVzZ2FlbmdlIQorCitTSUVIRSBBVUNIOgorICAgICBBZGRFeGl0KCksIEFkZFNwZWNpYWxFeGl0KCksIEFkZEd1YXJkZWRFeGl0KCksIEdldEV4aXRzKCkKKyAgICAgUmVtb3ZlRXhpdCgpLAorICAgICBQX0VYSVRTLCBQX0hJREVfRVhJVFMsIC9zdGQvcm9vbS9leGl0cy5jCisgICAgIGF1c2dhZW5nZQorCiszMS4wMS4yMDE1LCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1JlbW92ZVRvdWNoRGV0YWlsIGIvZG9jL2xmdW4vUmVtb3ZlVG91Y2hEZXRhaWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI4MTZhNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL1JlbW92ZVRvdWNoRGV0YWlsCkBAIC0wLDAgKzEsNTQgQEAKK1JlbW92ZVRvdWNoRGV0YWlsKCkKKworRlVOS1RJT046CisgICAgdm9pZCBSZW1vdmVUb3VjaERldGFpbChzdHJpbmd8c3RyaW5nKiBrZXlzKTsKKworREVGSU5JRVJUIElOOgorICAgIC9zdGQvdGhpbmcvZGVzY3JpcHRpb24uYworCitBUkdVTUVOVEU6CisgICAga2V5cworICAgICAgU3RyaW5nIG9kZXIgQXJyYXkgdm9uIFN0cmluZ3MgbWl0IGRlbiB6dSBlbnRmZXJuZW5kZW4gRGV0YWlscy4KKworQkVTQ0hSRUlCVU5HOgorICAgIERpZXNlIEZ1bmt0aW9uIGVudHNwcmljaHQgZGVtIFJlbW92ZURldGFpbCgpIGZ1ZXIgU3RhbmRhcmRkZXRhaWxzLAorICAgIG51ciBrb2VubmVuIGhpZXJtaXQgKGFiKXRhc3RiYXJlIERldGFpbHMgZW50ZmVybnQgd2VyZGVuOgorICAgIEVudGZlcm50IGRpZSBpbiA8a2V5cz4gYW5nZWdlYmVuZW4gRGV0YWlscyBhdXMgZGVyIExpc3RlIGRlcgorICAgIHZvcmhhbmRlbmVuIERldGFpbHMuIFVlYmVyZ2lidCBtYW4gZnVlciA8a2V5cz4gZWluZSAwLCBzbyB3ZXJkZW4KKyAgICBzYWVtdGxpY2hlIHRhc3RiYXJlbi9mdWVobGJhcmVuIERldGFpbHMgZW50ZmVybnQhCisKK0JFSVNQSUVMOgorICAgIFp1ZXJzdCB3aXJkIGVpbiBEZXRhaWwgImJvZGVuIiBlcnpldWd0LCBkYXMgYWJnZXRhc3RldCB3ZXJkZW4ga2Fubi4KKyAgICBEaWVzZXMga2FubiBkdXJjaCBCZXRhZXRpZ2VuIGVpbmVzIEtub3BmZXMsIGFlaCwgZW50ZmVybnQgd2VyZGVuLgorCisgICAgICBpbnQga25vcGYoKTsKKyAgICAgIHZvaWQga25vcGYyKCk7CisKKyAgICAgIEFkZFRvdWNoRGV0YWlsKCJib2RlbiIsICJFciBpc3QgYXVzIFN0ZWluLlxuIik7CisgICAgICBBZGRDbWQoImRydWVja3xkcnVlY2tlJmtub3BmIiwgIydrbm9wZiwgIldhcyB3aWxsc3QgZHUgZHJ1ZWNrZW4/Iik7CisKKyAgICAgIHZvaWQga25vcGYoKSB7CisgICAgICAgIHRlbGxfcm9vbSh0aGlzX29iamVjdCgpLCBicmVha19zdHJpbmcoCisgICAgICAgICAgdGhpc19wbGF5ZXIoKS0+TmFtZShXRVIpKyIgZHJ1ZWNrdCBlaW5lbiBLbm9wZiwgZGVyIGRhYmVpIHNhdHQgIisKKyAgICAgICAgICAia2xhY2t0LiIsIDc4KSk7CisKKyAgICAgICAgaWYoZmluZF9jYWxsX291dCgjJ2tub3BmMik8PTApCisgICAgICAgICAgY2FsbF9vdXQoIydrbm9wZjIsIDEpOworICAgICAgfQorICAgICAgCisgICAgICB2b2lkIGtub3BmMigpIHsKKyAgICAgICAgdGVsbF9yb29tKHRoaXNfb2JqZWN0KCksICJVaG9oLiBEZXIgQm9kZW4ga2xhcHB0IHdlZy4gRHUgZmFlbGxzdC4iKTsKKyAgICAgICAgUmVtb3ZlVG91Y2hEZXRhaWxzKCJib2RlbiIpOworICAgICAgfQorCitTSUVIRSBBVUNIOgorICAgIFNldHplbjogICAgQWRkRGV0YWlsKCksIEFkZFJlYWREZXRhaWwoKSwgQWRkU21lbGxzKCksIEFkZFNvdW5kcygpLAorICAgICAgICAgICAgICAgQWRkVG91Y2hEZXRhaWwoKQorICAgIExvZXNjaGVuOiAgUmVtb3ZlRGV0YWlsKCksIFJlbW92ZVJlYWREZXRhaWwoKSwgUmVtb3ZlU21lbGxzKCksCisgICAgICAgICAgICAgICBSZW1vdmVTb3VuZHMoKQorICAgIERhdGVuOiAgICAgUF9ERVRBSUxTLCBQX1JFQURfREVUQUlMUywgUF9TTUVMTFMsIFBfU09VTkRTLCBQX1RPVUNIX0RFVEFJTFMKKyAgICBWZXJhbHRldDogIEFkZFNwZWNpYWxEZXRhaWwoKSwgUmVtb3ZlU3BlY2lhbERldGFpbCgpLCBQX1JFQURfTVNHCisgICAgU29uc3RpZ2VzOiBHZXREZXRhaWwoKSwgYnJlYWtfc3RyaW5nKCkKKworMjAuMDEuMjAxNSwgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9SZXNpemVSaW5nQnVmZmVyIGIvZG9jL2xmdW4vUmVzaXplUmluZ0J1ZmZlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWE2YzA4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vUmVzaXplUmluZ0J1ZmZlcgpAQCAtMCwwICsxLDQ0IEBACitSZXNpemVSaW5nQnVmZmVyKCkKKworRlVOS1RJT046CisgICAgcHJvdGVjdGVkIHN0cnVjdCBzdGRfcmluZ2J1ZmZlciBidWYgUmluZ0J1ZmZlclB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzdGRfcmluZ2J1ZmZlciBidWYsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUpOworCitERUZJTklFUlQgSU46CisgICAgL3N0ZC91dGlsL3JpbmdidWZmZXIuYworICAgIC9zeXMvdXRpbC9yaW5nYnVmZmVyLmgKKyAgICAKK0FSR1VNRU5URToKKyAgICBidWYgIC0gUmluZ3B1ZmZlciwgZGVzc2VuIEdyb2Vzc2UgZ2VhZW5kZXJ0IHdlcmRlbiBzb2xsCisgICAgc2l6ZSAtIG5ldWUgR3JvZXNzZSAoaW50KSAKKworQkVTQ0hSRUlCVU5HOgorICAgIERpZXNlIEZ1bmt0aW9uIGVyc3RlbGx0IGVpbmVuIG5ldWVuIFJpbmdwdWZmZXIgZGVyIEdyb2Vzc2UgPHNpemU+LCB3ZWxjaGVyCisgICAgZGVuIGdsZWljaGVuIE1vZHVzIGhhdCB3aWUgPGJ1Zj4gdW5kIGRpZSBnbGVpY2hlbiBEYXRlbiBlbnRoYWVsdC4KKyAgICBJc3QgZGVyIG5ldWUgUHVmZmVyIGtsZWluZXIgYWxzIDxidWY+LCBzbyBrb21tdCBlcyBoaWVyYmVpIHp1CisgICAgRGF0ZW52ZXJsdXN0LgorICAgIDxidWY+IHdpcmQgbmljaHQgdmVyYWVuZGVydC4gSXN0IGRpZSBHcm9lc3NlIHZvbiA8YnVmPiBnbGVpY2ggZGVyCisgICAgbmV1ZW4gZ2V3dWVuc2NodGVuIEdyb2Vzc2UsIHdpcmQgbGV0enRlbmRsaWNoIGRlciBSaW5ncHVmZmVyIGtvcGllcnQuIAorICAgIEplIG5hY2ggR3JvZXNzZSB2b24gPGJ1Zj4gdW5kIFdlcnQgdm9uIDxzaXplPiBrYW5uIGRpZXMgZWluZSB0ZXVyZQorICAgIEFuZ2VsZWdlbmhlaXQgc2Vpbi4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICBEZXIgbmV1ZSBSaW5ncHVmZmVyIG1pdCBHcm9lc3NlIDxzaXplPi4KKworQkVJU1BJRUxFOgorICAgIC8vIFJpbmdwdWZmZXIgYW5sZWdlbjoKKyAgICBzdHJ1Y3Qgc3RkX3JpbmdidWZmZXIgYnVmZmVyID0gQ3JlYXRlUmluZ0J1ZmZlcig1LCBNT0RFX0ZJRk8pOworICAgIC8vIDUgV2VydGUgcmVpbnNjaHJlaWJlbjoKKyAgICBmb3JlYWNoKGludCBpOiA1KSBSaW5nQnVmZmVyUHV0KGJ1ZmZlciwgaSk7CisgICAgLy8gR3JvZXNzZSBhZW5kZXJuCisgICAgYnVmZmVyID0gUmVzaXplUmluZ0J1ZmZlcihidWZmZXIsIDEwKTsKKyAgICAvLyBEYXRlbiBhbHMgQXJyYXkgZXJtaXR0ZWxuOgorICAgIG1peGVkIGFycmF5ID0gUmluZ0J1ZmZlckdldChidWZmZXIpOworICAgIC8vIGFycmF5IGVudGhhZWx0OiAoezAsMCwwLDAsMCwwLDEsMiwzLDR9KQorCitTSUVIRSBBVUNIOgorICAgIFJpbmdCdWZmZXJHZXQoKSwgUmluZ0J1ZmZlclB1dCgpLCBDcmVhdGVSaW5nQnVmZmVyKCkKKworMjMuMDUuMjAwOCwgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9SaW5nQnVmZmVyR2V0IGIvZG9jL2xmdW4vUmluZ0J1ZmZlckdldApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDZiNDY3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vUmluZ0J1ZmZlckdldApAQCAtMCwwICsxLDQxIEBACitSaW5nQnVmZmVyR2V0KCkKKworRlVOS1RJT046CisgICAgcHJvdGVjdGVkIG1peGVkIFJpbmdCdWZmZXJHZXQoc3RydWN0IHN0ZF9yaW5nYnVmZmVyIGJ1Zik7CisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3RkL3V0aWwvcmluZ2J1ZmZlci5jCisgICAgL3N5cy91dGlsL3JpbmdidWZmZXIuaAorCitBUkdVTUVOVEU6CisgICAgYnVmIC0gUmluZ3B1ZmZlciwgd2VsY2hlciBhdXNnZWJlbiB3ZXJkZW4gc29sbAorCitCRVNDSFJFSUJVTkc6CisgICAgRGllc2UgRnVua3Rpb24gbGllZmVydCBkaWUgRGF0ZW4gZGVzIFJpbmdwdWZmZXJzIGluIEZvcm0gZWluZXMgQXJyYXlzCisgICAgenVydWVjaywgd2VsY2hlcyBkYW5uIHdlaXRlcnZlcmFyYmVpdGV0IHdlcmRlbiBrYW5uLgorICAgIERpZSBSZWloZW5mb2xnZSBkZXIgRGF0ZW4gaXN0IGVudHNwcmVjaGVuZCBkZXMgYmVpbSBBbmxlZ2VuIGRlcworICAgIFJpbmdwdWZmZXJzIGFuZ2ViZW5lbiBNb2RlczoKKyAgICBNT0RFX0ZJRk86IGFlbHRlc3RlIERhdGVuIHp1ZXJzdAorICAgIE1PREVfTElGTzogbmV1ZXN0ZSBEYXRlbiB6dWVyc3QKKworQkVNRVJLVU5HRU46CisgICAgQWVuZGVydW5nZW4gYW0gQXJyYXkgYmVlaW5mbHVzc2VuIGRpZSBEYXRlbiBkZXMgUmluZ3B1ZmZlcnMgbmljaHQuIEFiZXI6CisgICAgSGllcmJlaSB3ZXJkZW4gZGllIERhdGVuIG5pY2h0IHRpZWYga29waWVydC4gRC5oLiBlbnRoYWVsdCBkZXIgUmluZ3B1ZmZlcgorICAgIFJlZmVyZW56ZW4gYXVmIHdlaXRlcmUgRGF0ZW4sIHplaWdlbiBkZXIgUmluZ3B1ZmZlciB1bmQgZGFzIGhpZXIKKyAgICBnZWxpZWZlcnRlIEFycmF5IGF1ZiBkaWUgZ2xlaWNoZW4gRGF0ZW4uCisKK0JFSVNQSUVMRToKKyAgICAvLyBSaW5ncHVmZmVyIGFubGVnZW46CisgICAgc3RydWN0IHN0ZF9yaW5nYnVmZmVyIGJ1ZmZlciA9IENyZWF0ZVJpbmdCdWZmZXIoMTAsIE1PREVfRklGTyk7CisgICAgLy8gMTUgV2VydGUgcmVpbnNjaHJlaWJlbjoKKyAgICBmb3JlYWNoKGludCBpOiAxNSkgUmluZ0J1ZmZlclB1dChidWZmZXIsIGkpOworICAgIC8vIFdlcnRlIGFicnVmZW46CisgICAgbWl4ZWQgYXJyYXk9UmluZ0J1ZmZlckdldChidWZmZXIpOworICAgIC8vIGFycmF5IGVudGhhZWx0IG51bjoKKyAgICAvLyAoezUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNH0pIAorCitTSUVIRSBBVUNIOgorICAgIENyZWF0ZVJpbmdCdWZmZXIoKSwgUmluZ0J1ZmZlclB1dCgpLCBSZXNpemVSaW5nQnVmZmVyKCkKKworMjMuMDUuMjAwOCwgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9SaW5nQnVmZmVyUHV0IGIvZG9jL2xmdW4vUmluZ0J1ZmZlclB1dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmE3OGJiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vUmluZ0J1ZmZlclB1dApAQCAtMCwwICsxLDMwIEBACitSaW5nQnVmZmVyUHV0KCkKKworRlVOS1RJT046CisgICAgcHJvdGVjdGVkIHZvaWQgUmluZ0J1ZmZlclB1dChzdHJ1Y3Qgc3RkX3JpbmdidWZmZXIgYnVmLCBtaXhlZCB2YWwpOworCitERUZJTklFUlQgSU46CisgICAgL3N0ZC91dGlsL3JpbmdidWZmZXIuYworICAgIC9zeXMvdXRpbC9yaW5nYnVmZmVyLmgKKworQVJHVU1FTlRFOgorICAgIGJ1ZiAtIFJpbmdwdWZmZXIsIGluIGRlbiA8dmFsPiBnZXNjaHJpZWJlbiB3ZXJkZW4gc29sbAorICAgIHZhbCAtIG5ldWVzIERhdHVtCisKK0JFU0NIUkVJQlVORzoKKyAgICBEaWVzZSBGdW5rdGlvbiBzY2hyZWlidCA8dmFsPiBpbiBkZW4gUmluZ3B1ZmZlciA8YnVmPi4gSGllcmJlaSB3aXJkIGdnZi4KKyAgICBkYXMgYWVsdGVzdGUgaW0gUHVmZmVyIGV4aXN0aWVyZW5kZSBEYXR1bSB1ZWJlcnNjaHJpZWJlbi4gPGJ1Zj4gbXVzcyBlaW5lCisgICAgdm9uIENyZWF0ZVJpbmdCdWZmZXIoKSBvZGVyIFJlc2l6ZVJpbmdCdWZmZXIoKSB6dXJ1ZWNrZ2VsaWVmZXJ0ZXIKKyAgICBSaW5ncHVmZmVyIHNlaW4uCisKK0JFSVNQSUVMRToKKyAgICAvLyBSaW5ncHVmZmVyIGFubGVnZW46CisgICAgc3RydWN0IHN0ZF9yaW5nYnVmZmVyIGJ1ZmZlciA9IENyZWF0ZVJpbmdCdWZmZXIoMTAsIE1PREVfRklGTyk7CisgICAgLy8gMTUgV2VydGUgcmVpbnNjaHJlaWJlbjoKKyAgICBmb3JlYWNoKGludCBpOiAxNSkgUmluZ0J1ZmZlclB1dChidWZmZXIsIGkpOworCitTSUVIRSBBVUNIOgorICAgIFJpbmdCdWZmZXJHZXQoKSwgQ3JlYXRlUmluZ0J1ZmZlcigpLCBSZXNpemVSaW5nQnVmZmVyKCkKKworMjMuMDUuMjAwOCwgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9TZWFyY2hQYXRoIGIvZG9jL2xmdW4vU2VhcmNoUGF0aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzVmZGNiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vU2VhcmNoUGF0aApAQCAtMCwwICsxLDgzIEBACitTZWFyY2hQYXRoCisKK0ZVTktUSU9OOgorICAgICBwdWJsaWMgaW50IFNlYXJjaFBhdGgoc3RyaW5nIGZyb20sIHN0cmluZyB0bywgaW50IHBhcmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zdXJlIGNhbGxiYWNrKQorCitERUZJTklFUlQgSU46CisgICAgIC9wL2RhZW1vbi9wYXRoZC5jCisgICAgIDxzeXMvcGF0aC5kPgorCitBUkdVTUVOVEU6CisgICAgIGZyb20gICAgIC0gRGVyIFN0YXJ0cHVua3QKKyAgICAgdG8gICAgICAgLSBEZXIgRW5kcHVua3QKKyAgICAgcGFyYSAgICAgLSBEaWUgUGFyYXdlbHQgaW4gZGVyIGdlc3VjaHQgd2lyZCAoTm9ybWFsd2VsdDogMCkKKyAgICAgY2FsbGJhY2sgLSBDbG9zdXJlLCBkaWUgYW0gRW5kZSBkZXIgUGZhZHN1Y2hlIGdlcnVmZW4gd2lyZAorCitCRVNDSFJFSUJVTkc6CisgICAgRGllc2UgRnVua3Rpb24gYmVyZWNobmV0IC0gc29mZXJuIG1vZWdsaWNoIC0gZGVuIGt1ZXJ6ZXN0ZW4gUGZhZCB6d2lzY2hlbgorICAgIDxmcm9tPiB1bmQgPHRvPiBpbiBkZXIgKFBhcmEtKVdlbHQgPHBhcmE+LgorICAgIAorICAgIERpZSBQZmFkc3VjaGUgd2lyZCBhbmhhbmQgdm9uIERhdGVuIHVlYmVyIHZvbiBTcGllbGVybiBnZWxhdWZlbmUgV2VnZQorICAgIGR1cmNoZ2VmdWVocnQuIEQuaC4gR2ViaWV0ZSwgZGllIHZvbiBTcGllbGVybiBuaWNodCAoaW4gbGV0enRlciBaZWl0IG1hbCkKKyAgICBiZXRyZXRlbiB3ZXJkZW4sIHNpbmQgYXVjaCBkZW0gUGZhZGRhZW1vbiBuaWNodCBiZWthbm50LiBBdWNoIGthbm4gZXMKKyAgICBHZWJpZXRlIGdlYmVuLCB3byB6d2FyIGdlYmlldHNpbnRlcm4gUGZhZGUgYmVrYW5udCBzaW5kLCBhYmVyIGtlaW5lIFdlZ2UKKyAgICBpbiBkZW4gUmVzdCB2b20gTUcuCisKKyAgICBEYSBkaWVzZSBTdWNoZSBpbSBBbGxnZW1laW5lbiBTRUhSIGF1ZndlbmRpZyBzZWluIGthbm4sIHdpcmQgc2llIG1laXN0ZW5zCisgICAgbmljaHQgc29mb3J0IGZlcnRpZywgc29uZGVybiBkYXVlcnQgZWluZSBXZWlsZS4gV2VubiBzaWUgZmVydGlnIGlzdCwgd2lyZAorICAgIGRpZSBDbG9zdXJlIDxjYWxsYmFjaz4gYXVmZ2VydWZlbiB1bmQgaWhyIGRpZSBBcmd1bWVudGUgPGZyb20+LCA8dG8+LAorICAgIDxwYXJhd2VsdD4sIDxrb3N0ZW4+LCA8cGF0aD4gdW5kIDxjbWRzPiB1ZWJlcmdlYmVuLiBEaWUgQmVkZXV0dW5nCisgICAgZGllc2VyIEFyZ3VtZW50ZSBpc3QgdW50ZW4gZXJrbGFlcnQuCisKKyAgICBFaW5lIFN1Y2hlIG5hY2ggZWluZW0gUGZhZCBpbiBlaW5lciBQYXJhd2VsdCBmdWVocnQgZHVyY2ggUmFldW1lIGRlcgorICAgIGdld3VlbnNjaGVuIFBhcmF3ZWx0IHVuZCBkdXJjaCBSYWV1bWUgZGVyIE5vcm1hbHdlbHQuCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIDEgICAgICAtIFN1Y2hlIHd1cmRlIGdlc3RhcnRldAorICAgICAyICAgICAgLSBQZmFkIGdlZnVuZGVuICh1bmQgY2FsbGJhY2sgZ2VydWZlbikKKyAgICAtMSAgICAgIC0gZXMgbGFldWZ0IHNjaG9uIGVpbiBTdWNoYXVmdHJhZ2UgZnVlciBkaWUgVUlEIGRlcyBhbmZyYWdlbmRlbgorICAgICAgICAgICAgICBPYmpla3RlcworICAgIC0yICAgICAgLSBlcyBsYXVmZW4gYmVyZWl0cyB6dXZpZWxlIFN1Y2hhbmZyYWdlbgorICAgIC0zICAgICAgLSA8ZnJvbT4gdW5kL29kZXIgPHRvPiBzaW5kIG5pY2h0IGJla2FubnQKKyAgICAKKyAgICBBbiA8Y2FsbGJhY2s+IHVlYmVyZ2ViZW5lIEFyZ3VtZW50ZSBhbSBFbmRlIGRlciBQZmFkc3VjaGU6CisgICAgICAgIDxmcm9tPiAtIFN0YXJ0cHVua3QgZGVzIFdlZ2VzIChzdHJpbmcpCisgICAgICAgIDx0bz4gICAtIFppZWxwdW5rdCBkZXMgV2VnZXMgKHN0cmluZykKKyAgICAgICAgPHBhcmE+IC0gUGFyYXdlbHQgZGVzIFdlZ2VzIChpbnQpCisgICAgICAgIDxjb3N0cz4tIEtvc3RlbiBkZXMgV2VnZS4gKGludCkgSmUgaG9laGVyLCBkZXN0bworICAgICAgICAgICAgICAgICBsYWVuZ2VyL3VuZ3VlbnN0aWdlci4gMCwgd2VubiBrZWluIFBmYWQgZ2VmdW5kZW4KKyAgICAgICAgPHBhdGg+IC0gQXJyYXkgbWl0IFJhdW1uYW1lbiwgZGllIGR1cmNobGF1ZmVuIHdlcmRlbiAoc3RyaW5nKikKKyAgICAgICAgICAgICAgICAgMCwgd2VubiBrZWluIFBmYWQgZ2VmdW5kZW4KKyAgICAgICAgPGNtZHM+IC0gQXJyYXkgbWl0IEtvbW1hbmRvcyB6dW0gQWJsYXVmZW4gZGVzIFdlZ2VzIChzdHJpbmcqKQorICAgICAgICAgICAgICAgICAwLCB3ZW5uIGtlaW4gUGZhZCBnZWZ1bmRlbgorCitCRU1FUktVTkdFTjoKKyAgIEVzIGlzdCBuYXR1ZXJsaWNoIG5pY2h0IGRhenUgZ2VkYWNodCwgU3BpZWxlcm4gZmVydGlnZSBSb3V0ZW4gendpc2NoZW4KKyAgIE9ydGVuIHp1IGdlYmVuIC0gYnp3LiBudXIgaW4gQXVzbmFobWVmYWVsbGVuLgorICAgUGZhZGFiZnJnZW4gd2VyZGVuIGdlbG9nZ3QuCisKKyAgIERpZSBBbmdhYmUgPGNvc3RzPiBzYWd0IGdyb2IgZXR3YXMgdWViZXIgZGllIExhZW5nZSB1bmQgdm9yIGFsbGVtIHVlYmVyIGRpZQorICAgIlF1YWxpdGFldCIgZGVzIFBmYWRlcyBhdXMuIERpZSBzdGVpZ3QgYmVpIFBhcmF3ZWx0d2VjaHNlbG4sIHdlbmlnCisgICBhYmdlbGF1ZmVuZW4gVmVyYmluZHVuZ2VuIHp3aXNjaGVuIFJhZXVtZW4gb2RlciB3ZW5uIGVpbmUgVmVyYmluZHVuZyBrZWluCisgICBub3JtYWxlciBBdXNnYW5nIGlzdC4KKworICAgRGllIENsb3N1cmUgPGNhbGxiYWNrPiBzb2xsdGUgbmljaHQgenV2aWVsZSBUaWNrcyB2ZXJicmF1Y2hlbi4KKworQkVJU1BJRUw6CisgICAjaW5jbHVkZSA8cGF0aGQuaD4KKyAgIHZvaWQgc3VjaGVyZ2VibmlzKHN0cmluZyBmcm9tLCBzdHJpbmcgdG8sIGludCBwYXJhLCBpbnQgY29zdHMsIHN0cmluZyoKKyAgICAgICAgcGF0aCwgc3RyaW5nKiBjbWRzKSB7CisgICAgICAgIHRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJ6ZXNzdHJhIiksIHNwcmludGYoCisgICAgICAgICAgICAiRXJnZWJuaXMgUGZhZHN1Y2hlIHZvbiAlcyBuYWNoICVzIGluIFBhcmEgJWQgZnVlciAlZDpcbiAlT1xuICVPXG4iLAorICAgICAgICAgICAgZnJvbSwgdG8sIHBhcmEsIGNvc3RzLCBwYXRoLCBjbWRzKSk7CisgICB9OworCisgICAuLi4KKyAgIG1peGVkIHJlcz1QQVRIRC0+U2VhcmNoUGF0aCgiL2dpbGRlbi9hYmVudGV1cmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL2QvZWJlbmUvZGFuY2VyL2x1Y2t5L3Jvb20vcG92YV9sYTMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICMnc3VjaGVyZ2VibmlzKTsKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMjIuMTIuMjAxNSwgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9TZWxlY3RFbmVteSBiL2RvYy9sZnVuL1NlbGVjdEVuZW15Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2M2UwYzAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9TZWxlY3RFbmVteQpAQCAtMCwwICsxLDMyIEBACitTZWxlY3RFbmVteSgpCisKK0ZVTktUSU9OOgorCXZhcmFyZ3Mgb2JqZWN0IFNlbGVjdEVuZW15KG9iamVjdCpoZXJlKTsKKworREVGSU5JRVJUIElOOgorCS9zdGQvbGl2aW5nL2NvbWJhdC5jCisKK0FSR1VNRU5URToKKwloZXJlCisJICBHZWduZXIsIGF1cyB3ZWxjaGVuIGF1c2dld2FlaGx0IHdlcmRlbiBzb2xsIChvcHRpb25hbCEpCisKK1JVZUNLR0FCRVdFUlQ6CisJQXVzZ2V3YWVobHRlciBHZWduZXIsIGRlciBhbmdlZ3JpZmZlbiB3ZXJkZW4gc29sbC4KKworQkVTQ0hSRUlCVU5HOgorCURpZXNlIEZ1bmt0aW9uIHdhZWhsdCBlaW5lbiBHZWduZXIgYXVzLCBkZXIgYW5nZWdyaWZmZW4gd2VyZGVuIHNvbGwuCisJV2VyZGVuIGtlaW5lIEdlZ25lciBpbSBQYXJhbWV0ZXIgPGhlcmU+IGFuZ2VnZWJlbiwgc28gd2lyZCBkZXIKKwlSdWVja2dhYmV3ZXJ0IGRlciBGdW5rdGlvbiBQcmVzZW50RW5lbWllcygpIHZlcndhbmR0LCB3ZWxjaGUgZGllCisJYWt0dWVsbCBhbndlc2VuZGVuIEdlZ25lciBpbSBSYXVtIGxpZWZlcnQuCisJU2luZCBrZWluZSBHZWduZXIgYW53ZXNlbmQsIHNvIHdpcmQgMCB6dXJ1ZWNrZ2VsaWVmZXJ0LgorCURhbmFjaCB3aXJkIGdlc2NoYXV0LCBvYiBHZWduZXIgYmV2b3J6dWd0IGF1c2dld2FlaGx0IHdlcmRlbiBzb2xsZW4uCisJRGllcyBnZXNjaGllaHQgbWl0dGVscyBkZXIgRnVua3Rpb24gUXVlcnlQcmVmZXJlZEVuZW15KCkuCisJQXVjaCBkaWVzZXIgYmV2b3J6dWd0ZSBHZWduZXIgbXVzcyBpbSBzZWxiZW4gUmF1bSBzZWluISBXZW5uIG5pY2h0LAorCXdpcmQgZG9jaCBpcmdlbmRlaW4gYW5kZXJlciBHZWduZXIgYXVzZ2V3YWVobHQgdW5kIHp1cnVlY2tnZWdlYmVuLgorCitTSUVIRSBBVUNIOgorCVByZXNlbnRFbmVtaWVzKCksIFF1ZXJ5UHJlZmVyZWRFbmVteSgpLCBQX1BSRUZFUkVEX0VORU1ZLAorCUluc2VydEVuZW15KCksIFN0b3BIdW50Rm9yKCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogVGh1IE1heSAyNyAxNTowMTo0OCAxOTk5IGJ5IFBhdHJ5bgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vU2VsZWN0RmFyRW5lbXkgYi9kb2MvbGZ1bi9TZWxlY3RGYXJFbmVteQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTc0ZGNjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vU2VsZWN0RmFyRW5lbXkKQEAgLTAsMCArMSw0NSBAQAorCitTZWxlY3RGYXJFbmVteSgpCisKKworRlVOS1RJT046CisgICAgICAgIHZhcmFyZ3Mgb2JqZWN0IFNlbGVjdEZhckVuZW15KG9iamVjdCAqaGVyZSwgaW50IG1pbiwgaW50IG1heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcmNlZnJvbSkKKworREVGSU5JRVJUIElOOgorICAgICAgICAvc3RkL2xpdmluZy90ZWFtLmMKKworQVJHVU1FTlRFOgorICAgICAgICBoZXJlICAgICAgIC0gUnVlY2tnYWJld2VydCB2b24gUHJlc2VudEVuZW1pZXMoKQorICAgICAgICBtaW4gICAgICAgIC0gbWluaW1hbGUgS2FtcGZyZWloZQorICAgICAgICBtYXggICAgICAgIC0gbWF4aW1hbGUgS2FtcGZyZWloZQorICAgICAgICBmb3JjZWZyb20gIC0gR2VnbmVyIE1VU1MgYXVzIHVlYmVyZ2ViZW5lbSBBcnJheSBhdXNnZXdhZWhsdCB3ZXJkZW4KKworQkVTQ0hSRUlCVU5HOgorICAgICAgICBXYWVobHQgZWluZW4gRmVpbmQgYXVzIFJlaWhlIDxtaW4+IGJpcyA8bWF4PiBhdXMuCisKK1JVRUNLR0FCRVdFUlQ6CisgICAgICAgIERlciBBdXNlcndhZWhsdGUgOi0pCisKK0JFTUVSS1VOR0VOOgorICAgICAgICAxLiBXZW5uIGluIGRlbiBhbmdlZ2ViZW4gUmVpaGVuIGtlaW4gRmVpbmQgaXN0IG9kZXIgPG1heD4ga2xlaW5lcgorICAgICAgICAgICBhbHMgPG1pbj4gaXN0LCB3aXJkIGF1Y2gga2VpbmVyIHp1cnVlY2tnZWdlYmVuLgorICAgICAgICAyLiBBdXMgRWZmaXppZW56Z3J1ZW5kZW4gc29sbHRlIGZvcmNlZnJvbSBudXIgYmVudXR6dCB3ZXJkZW4sIHdlbm4KKyAgICAgICAgICAgZXMgd2lya2xpY2ggbm9ldGlnIGlzdCAocy4gaGllcnp1IGF1Y2ggU2VsZWN0TmVhckVuZW15KCkpLgorICAgICAgICAzLiAwIDw9IDxtaW4+IDw9IDxtYXg+IDwgTUFYX1RFQU1ST1dTCisKK1NJRUhFIEFVQ0g6CisgICAgICAgIFVlYmVyc2ljaHQ6IHRlYW1rYW1wZgorICAgICAgICBQcm9wZXJ0aWVzOiBQX1RFQU0sIFBfQVNTT0NfTUVNQkVSUywgUF9URUFNX0FUVEFDS19DTUQsCisgICAgICAgICAgICAgICAgICAgIFBfVEVBTV9BVVRPRk9MTE9XLCBQX1RFQU1fQ09MT1JTLCBQX1RFQU1fTEVBREVSLAorICAgICAgICAgICAgICAgICAgICBQX1RFQU1fTkVXTUVNQkVSLCBQX1RFQU1fV0FOVEVEX1JPVywgUF9URUFNX1dJTVBZX1JPVworICAgICAgICBCZXdlZ3VuZzogICBJc1RlYW1Nb3ZlLCBUZWFtRmxlZQorICAgICAgICBNaXRnbGllZGVyOiBJc1RlYW1MZWFkZXIsIFRlYW1NZW1iZXJzCisgICAgICAgIEthbXBmOiAgICAgIEFzc29jTWVtYmVyLCBEZUFzc29jTWVtYmVyLCBJbnNlcnRFbmVteVRlYW0sCisgICAgICAgICAgICAgICAgICAgIFNlbGVjdE5lYXJFbmVteQorICAgICAgICBQb3NpdGlvbmVuOiBQcmVzZW50UG9zaXRpb24sIFByZXNlbnRSb3dzLCBQcmVzZW50RW5lbXlSb3dzLAorICAgICAgICAgICAgICAgICAgICBQcmVzZW50VGVhbVBvc2l0aW9uLCBTd2FwUm93cworICAgICAgICBTb25zdGlnZXM6ICBUZWFtUHJlZml4LCB0ZWFta2FtcGZfaW50ZXJuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IDE2LTA4LTIwMTAsIEdhYnlsb24KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1NlbGVjdE5lYXJFbmVteSBiL2RvYy9sZnVuL1NlbGVjdE5lYXJFbmVteQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OThiZWU4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vU2VsZWN0TmVhckVuZW15CkBAIC0wLDAgKzEsNDkgQEAKKworU2VsZWN0TmVhckVuZW15KCkKKworCitGVU5LVElPTjoKKyAgICAgICAgdmFyYXJncyBvYmplY3QgU2VsZWN0TmVhckVuZW15KG9iamVjdCAqaGVyZSwgaW50IGZvcmNlZnJvbSkKKworREVGSU5JRVJUIElOOgorICAgICAgICAvc3RkL2xpdmluZy90ZWFtLmMKKworQVJHVU1FTlRFOgorICAgICAgICBoZXJlICAgICAgLSBSdWVja2dhYmV3ZXJ0IHZvbiBQcmVzZW50RW5lbWllcygpCisgICAgICAgIGZvcmNlZnJvbSAtIEdlZ25lciBNVVNTIGF1cyB1ZWJlcmdlYmVuZW0gQXJyYXkgYXVzZ2V3YWVobHQgd2VyZGVuCisKK0JFU0NIUkVJQlVORzoKKyAgICAgICAgV2FlaGx0IGVpbmVuIGltIE5haGthbXBmIGVycmVpY2hiYXJlbiBGZWluZCBhdXMKKworUlVFQ0tHQUJFV0VSVDoKKyAgICAgICAgRGVyIEF1c2Vyd2FlaGx0ZSA6LSkKKworQkVNRVJLVU5HRU46CisgICAgICAgIDEuIEZhbGxzIGRlciBTcGllbGVyIGluIGVpbmVtIFRlYW0gaXN0IHVuZCBpbiBlaW5lciBoaW50ZXJlbiBSZWloZQorICAgICAgICAgICBzdGVodCwgd2lyZCBrZWluIEZlaW5kIGF1c2dld2FlaGx0LCBlcyBzZWkgZGVubiwgZGVyIFNwaWVsZXIgaGF0CisgICAgICAgICAgIGVpbmVuIEthbXBmIG1pdCBlaW5lbSBUZWFtbWl0Z2xpZWQgYW5nZWZhbmdlbi4KKyAgICAgICAgMi4gV2VubiBlaW4gYmV2b3J6dWd0ZXIgRmVpbmQgaW4gZWluZXIgZGVyIGhpbnRlcmVuIFJlaWhlbiBlaW5lcworICAgICAgICAgICBUZWFtcyBzdGVodCwgd2lyZCBzb2xhbmdlIGRhcyBUZWFtIGJldm9yenVndC4KKyAgICAgICAgMy4gQXVjaCBGZWluZGUgaW4gZGVuIGhpbnRlcmVuIFJlaWhlbiBrb2VubmVuIGltIE5haGthbXBmIGVycmVpY2hiYXIKKyAgICAgICAgICAgc2Vpbiwgd2VubiBkaWUgdm9yZGVyZW4gUmVpaGVuIG5pY2h0IGdlbnVlZ2VuZCBEZWNrdW5nIGJpZXRlbi4KKyAgICAgICAgNC4gQUNIVFVORzogRGVyIEF1c2Vyd2FlaGx0ZSBrb21tdCBuaWNodCBub3R3ZW5kaWdlcndlaXNlIGF1cyBkZW0KKyAgICAgICAgICAgdWViZXJnZWJlbmVuIEFycmF5LCB3ZW5uIGZvcmNlZnJvbT0wIGlzdC4gTm9ybWFsZXJ3ZWlzZSBpc3QgZGllc2VzCisgICAgICAgICAgIFZlcmhhbHRlbiBiZWFic2ljaHRpZ3QsIGRhbWl0IGplbWFuZCwgZGVyIHNpY2ggaW4gZGVyIFJlaWhlIHZvcgorICAgICAgICAgICBlaW5lbiBHZWduZXIgc3RlbGx0LCBhbmdlZ3JpZmZlbiB3aXJkLCBhdWNoIHdlbm4gZXIgbm9jaCBuaWNodAorICAgICAgICAgICBGZWluZCBpc3QuCisKK1NJRUhFIEFVQ0g6CisgICAgICAgIFVlYmVyc2ljaHQ6IHRlYW1rYW1wZgorICAgICAgICBQcm9wZXJ0aWVzOiBQX1RFQU0sIFBfQVNTT0NfTUVNQkVSUywgUF9URUFNX0FUVEFDS19DTUQsCisgICAgICAgICAgICAgICAgICAgIFBfVEVBTV9BVVRPRk9MTE9XLCBQX1RFQU1fQ09MT1JTLCBQX1RFQU1fTEVBREVSLAorICAgICAgICAgICAgICAgICAgICBQX1RFQU1fTkVXTUVNQkVSLCBQX1RFQU1fV0FOVEVEX1JPVywgUF9URUFNX1dJTVBZX1JPVworICAgICAgICBCZXdlZ3VuZzogICBJc1RlYW1Nb3ZlLCBUZWFtRmxlZQorICAgICAgICBNaXRnbGllZGVyOiBJc1RlYW1MZWFkZXIsIFRlYW1NZW1iZXJzCisgICAgICAgIEthbXBmOiAgICAgIEFzc29jTWVtYmVyLCBEZUFzc29jTWVtYmVyLCBJbnNlcnRFbmVteVRlYW0sCisgICAgICAgICAgICAgICAgICAgIFNlbGVjdEZhckVuZW15CisgICAgICAgIFBvc2l0aW9uZW46IFByZXNlbnRQb3NpdGlvbiwgUHJlc2VudFJvd3MsIFByZXNlbnRFbmVteVJvd3MsCisgICAgICAgICAgICAgICAgICAgIFByZXNlbnRUZWFtUG9zaXRpb24sIFN3YXBSb3dzCisgICAgICAgIFNvbnN0aWdlczogIFRlYW1QcmVmaXgsIHRlYW1rYW1wZl9pbnRlcm4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogMTYtMDgtMjAxMCwgR2FieWxvbgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vU2V0IGIvZG9jL2xmdW4vU2V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZTY5MzAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9TZXQKQEAgLTAsMCArMSwxMzcgQEAKK1NldCgpCitGVU5LVElPTjoKKyAgICAgcHVibGljIHZhcmFyZ3MgbWl4ZWQgU2V0KHN0cmluZyBuYW1lLCBtaXhlZCBWYWx1ZSwgaW50IFR5cGUsIGludCBleHRlcm4pOworCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvdGhpbmcvcHJvcGVydGllcy5jCisgICAgIC9zeXMvdGhpbmcvcHJvcGVydGllcy5oIChQcm90b3R5cCkKKworQVJHVU1FTlRFOgorICAgICBuYW1lIC0gUHJvcGVydHksIGRpZSBtYW5pcHVsaWVydCB3ZXJkZW4gc29sbAorICAgICBWYWx1ZSAtIGRlciB6dSBzZXR6ZW5kZS9hZW5kZXJuZGUgV2VydAorICAgICBUeXBlIC0gZGllIEVpZ2Vuc2NoYWZ0IGRlciBQcm9wZXJ0eSwgZGllIG1hbmlwdWxpZXJ0IHdlcmRlbiBzb2xsCisgICAgIGV4dGVybiAtIEludGVybmUgVmVyd2VuZHVuZzoKKyAgICBXdXJkZSBTZXQgdWViZXIgU2V0UHJvcCB2b24gYXVzc2VuIGdlcnVmZW4uCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRWluZSBkZXIgaW5uZXJlbiBFaWdlbnNjaGFmdGVuIGRlciBQcm9wZXJ0eSAnbmFtZScgd2lyZCB2ZXJhZW5kZXJ0LgorICAgICAnVHlwZScgaXN0IGRhYmVpIGVpbmVyIGRlciBpbiAvc3lzL3RoaW5nL3Byb3BlcnRpZXMuaCBkZWZpbmllcnRlbgorICAgICBGX1hYWCAtIFdlcnRlOgorCisgICAgIEZfVkFMVUUgKD09MCwgZGVmYXVsdCkKKyAgICAgICBTZXR6dCBkZW4gSW5oYWx0IGRlciBQcm9wZXJ0eSBhdWYgJ1ZhbHVlJy4gQWVobmxpY2ggIlNldFByb3AiLAorICAgICAgIHVtZ2VodCBqZWRvY2ggZWluZSBldHdhaWdlIEZfU0VUX01FVEhPRCBvZGVyIF9zZXRfJ25hbWUnKCktTWV0aG9kZS4KKyAgICAgRl9NT0RFCisgICAgIEZfTU9ERV9BUworICAgICBGX01PREVfQUQKKyAgICAgICBBZW5kZXJ0IGVpbmVzIGRlciBpbnRlcm5lbiBGbGFncyBkZXIgUHJvcGVydHkuIEZfTU9ERSBuZWdpZXJ0IGRlbgorICAgICAgIHZvcmhlcmlnZW4gV2VydCB2b20gRmxhZyAnVmFsdWUnLCBGX01PREVfQVMgc2V0enQgdW5kIEZfTU9ERV9BRAorICAgICAgIGxvZXNjaHQgaWhuLgorICAgICAgIFZlcmZ1ZWdiYXJlIGludGVybmUgRmxhZ3M6CisgICAgICAgICBTQVZFIAorICAgICAgICAgICBQcm9wZXJ0eSB3aXJkIGJlaSBzYXZlX29iamVjdCgpIGdlc3BlaWNoZXJ0CisgICAgICAgICBQUk9URUNURUQgCisgICAgICAgICAgIEZsYWcgc2V0emJhciBkdXJjaDogICBiZWxpZWJpZ2VzIE9iamVrdAorICAgICAgICAgICBGbGFnIGxvZXNjaGJhciBkdXJjaDogdGhpc19vYmplY3QoKSwgUk9PVCwgRU0rCisgICAgICAgICAgIEluaGFsdCBkZXIgUHJvcGVydHkgdmVyYWVuZGVybiBzb3dpZSBTZXQtIHVuZCBRdWVyeS1NZXRob2RlbgorICAgICAgICAgICBzZXR6ZW4gb2RlciBsb2VzY2hlbiBkdWVyZmVuIG51ciBub2NoIHRoaXNfb2JqZWN0KCksIFJPT1QsIEVNKworICAgICAgICAgICBXQVJOVU5HOiBEaWVzZXMgRmxhZyBuaWNodCBsZWljaHRmZXJ0aWcgYmVpIFNwaWVsZXJuIHNldHplbiEKKyAgICAgICAgIFNFQ1VSRUQgIAorICAgICAgICAgICBGbGFnIHNldHpiYXIgZHVyY2g6ICAgdGhpc19vYmplY3QoKSwgUk9PVCwgRU0rCisgICAgICAgICAgIEZsYWcgbG9lc2NoYmFyIGR1cmNoOiBOaWVtYW5kZW4hCisgICAgICAgICAgIEluaGFsdCBkZXIgUHJvcGVydHkgdmVyYWVuZGVybiBzb3dpZSBTZXQtIHVuZCBRdWVyeS1NZXRob2RlbgorICAgICAgICAgICBzZXR6ZW4gb2RlciBsb2VzY2hlbiBkdWVyZmVuIG51ciBub2NoIHRoaXNfb2JqZWN0KCksIFJPT1QsIEVNKworICAgICAgICAgTk9TRVRNRVRIT0QgCisgICAgICAgICAgIFByb3BlcnR5IG5pY2h0IG1laHIgdWViZXIgU2V0UHJvcCgpIGFlbmRlcmJhcgorICAgICAgICAgICAoZGFtaXQgZW50ZmFsbGVuIGF1Y2ggU0VUX01FVEhPRCwgX3NldF8nbmFtZScpCisgICAgIEZfU0VUX01FVEhPRAorICAgICAgIEFlbmRlcnQgZGVuIEVpbnRyYWcgZnVlciBlaW5lIFNldE1ldGhvZCAtIGVpbmUgQ2xvc3VyZSwgZGllIGFuc3RhdHQKKyAgICAgICBkZXMgU2V0emVucyBkZXIgUHJvcGVydHkgYmVpbSBBdWZydWYgdm9uIFNldFByb3AgbWl0ICdWYWx1ZScKKyAgICAgICBhdWZnZXJ1ZmVuIHdpcmQuCisgICAgIEZfUVVFUllfTUVUSE9ECisgICAgICAgQWVuZGVydCBkZW4gRWludHJhZyBmdWVyIGVpbmUgUXVlcnlNZXRob2QgLSBlaW5lIENsb3N1cmUsIGRpZSBhbnN0YXR0CisgICAgICAgZGVzIExlc2VucyBkZXIgUHJvcGVydHkgYmVpbSBBdWZydWYgdm9uIFF1ZXJ5UHJvcCBhdWZnZXJ1ZmVuIHdpcmQuCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIERhcyBFcmdlYm5pcyBkZXIgTWFuaXB1bGF0aW9uIGJ6dy4gZWluZXIgZGVyIGRlZmluaWVydGVuCisgICAgIEZlaGxlcmNvZGVzLgorCitCRU1FUktVTkdFTjoKKyAgICAgLSBTZXQoKSBzb2xsdGUgbmljaHQgenVtIHJlZ3VsYWVyZW4gTWFuaXB1bGllcmVuIGRlcyBJbmhhbHRzIGVpbmVyCisgICAgICAgUHJvcGVydHkgdmVyd2VuZGV0IHdlcmRlbiwgZGEgc293b2hsIEZfU0VUX01FVEhPRCBhbHMgYXVjaCBsaWJpbnRlcm5lCisgICAgICAgX3NldF8nbmFtZScoKS1NZXRob2RlbiB1bWdhbmdlbiB3ZXJkZW4gdW5kIGRhcyBFcmdlYm5pcyBmdWVyIHNvCisgICAgICAgdmVyYWVuZGVydGUgUHJvcGVydGllcyB1bmRlZmluaWVydCBpc3QuCisgICAgIC0gZWluZSBnZXNldHp0ZSBGX1NFVC9GX1FVRVJZX01FVEhPRCBoYXQgYmVpIFNldFByb3AvUXVlcnlQcm9wIFZvcnJhbmcKKyAgICAgICB2b3IgZWluZXIgX3NldC9fcXVlcnlfbWV0aG9kCisgICAgICAgLT4gX3NldC9fcXVlcnkgd2lyZCBuYWNoIGVyZm9sZ3JlaWNoZW0gUnVmIHZvbiBGX1hYWF9NRVRIT0QgaWdub3JpZXJ0CisgICAgIC0gRl9TRVQvRl9RVUVSWV9NRVRIT0Qgc29sbHRlIG5vcm1hbGVyd2Vpc2UgVm9yenVnIHZvciBlaW5lcgorICAgICAgIF9zZXRfL19xdWVyeV8qIGdlZ2ViZW4gd2VyZGVuLgorCisgICAgU2V0TWV0aG9kcy9RdWVyeU1ldGhvZHM6CisgICAgIC0gZmFsbHMgaWhyIFF1ZXJ5L1NldE1ldGhvZHMgYW4gb2VmZmVudGxpY2hlbiBQcm9wZXJ0aWVzIHNldHplbgorICAgICAgIHdvbGx0LCBwcnVlZnQgYml0dGUgdm9yaGVyLCBvYiBkb3J0IG5pY2h0IHNjaG9uIGVpbmUgKGZyZW1kZSkgZ2VzZXR6dAorICAgICAgIGlzdCB1bmQgYnJlY2h0IGdnZi4gZXVlciBTZXQoKSBhYiwgdW0gbmljaHQgZGllIEFyYmVpdCBhbmRlcmVyCisgICAgICAgTWl0bWFnaWVyIHp1IHNhYm90aWVyZW4gKHouQi4gUF9IQU5EUykKKyAgICAgLSBQcm9wZXJ0aWVzIHNvbGx0ZW4gbWl0IFF1ZXJ5LSBvZGVyIFNldE1ldGhvZGVuIG51ciBzbyBsYW5nZSB3aWUKKyAgICAgICBub2V0aWcgYmVsZWd0IHdlcmRlbgorICAgICAgIC0+IG1hbmNoZSBQcm9wZXJ0aWVzIHNvbGx0ZSBtYW4gYWxzIFdlcnQgc2V0emVuLCBfYXVjaCB3ZW5uXyBkaWUKKyAgICAgICAgICBTcGllbGVyIHNpZSB6dXJ1ZWNrc2V0emVuIGtvZW5udGVuICh6QiBQX01TR0lOL1BfTVNHT1VUKQorICAgICAtIGF1ZiBrZWluZW4gRmFsbCBkZW4gV2VydCBzcGVpY2hlcm4sIHVlYmVyc2NocmVpYmVuLCBydWVja3NjaHJlaWJlbiwKKyAgICAgICBkYXMgZnVlaHJ0IGZhc3QgaW1tZXIgenUgUHJvYmxlbWVuLgorICAgICAtIFNldC9RdWVyeU1ldGhvZGVuIHNvbGx0ZW4gbmljaHQgYWxzIFRyaWdnZXIvTGlzdGVuZXIgZnVlciBlaW4KKyAgICAgICBFcmVpZ25pcyAoei5CLiBQX0RJRV9NU0cgZnVlciBkYXMgRXJlaWduaXMgIlRvZCBkZXMgU3BpZWxlcnMiKQorICAgICAgIG1pc3NicmF1Y2h0IHdlcmRlbgorICAgICAgIC0+IGVzIGdpYnQgc2ljaGVyZSB1bmQgc2F1YmVyZSBNb2VnbGljaGtlaXRlbiAoTm90aWZ5UGxheWVyRGVhdGgpLAorICAgICAgICAgIHVuZCB3ZW5uIG5pY2h0LCB3ZW5kZXQgZXVjaCBhbiBkZW4gRU0gZXVyZXMgVmVydHJhdWVucworICAgICAtIEZfU0VUL0ZfUVVFUllfTUVUSE9EcyBrb2VubmVuICdwcm90ZWN0ZWQnIChlbXBmb2hsZW4pIG9kZXIgJ3N0YXRpYycKKyAgICAgICBzZWluLiBfc2V0Xy9fcXVlcnlfIGR1ZXJmZW4gbW9tZW50YW4gX25pY2h0XyAncHJvdGVjdGVkJyBzZWluLCBmdWVyCisgICAgICAgZ2VodCBudXIgJ3N0YXRpYycgKGluIGRpZXNlbSBGYWxsIGVtcGZvaGxlbikuCisKK0JFSVNQSUVMRToKKyAgICAgIyMjIEFlbmRlcm4gdm9uIEVpZ2Vuc2NoYWZ0ZW4gZWluZXIgUHJvcGVydHkgIyMjCisgICAgIC8vIFNldHplbiBkZXMgU0FWRS1GbGFncyAoYmVpIHNhdmVfb2JqZWN0KCkgbWl0enVzcGVpY2hlcm4pCisgICAgIFNldChQX1hZWiwgU0FWRSwgRl9NT0RFX0FTKTsKKworICAgICAvLyBMb2VzY2hlbiBkZXMgU0FWRS1GbGFncworICAgICBTZXQoUF9YWVosIFNBVkUsIEZfTU9ERV9BRCk7CisgICAgIAorICAgICAvLyBOZWdpZXJlbiBkZXMgYmlzaGVyaWdlbiBTQVZFLUZsYWdzCisgICAgIFNldChQX1hZWiwgU0FWRSwgRl9NT0RFKTsKKyAgICAgLy8gSGlud2VpczogZGFzIFNldHplbiBkZXMgRmxhZ3MgZnVua3Rpb25pZXJ0IG1pdHRlbHMgRl9NT0RFIG51ciBkYW5uLAorICAgICAvLyB3ZW5uIHNpY2hlcmdlc3RlbGx0IGlzdCwgZGFzcyBlcyB2b3JoZXIgbmljaHQgZ2VzZXR6dCB3YXIuIERpZSAKKyAgICAgLy8gc2ljaGVyZSBWYXJpYW50ZSBpc3QgZGFoZXIsIEZfTU9ERV9BUyB6dSB2ZXJ3ZW5kZW4uCisKKyAgICAgLy8gU3BlcnJlbiBkZXMgU2V0UHJvcC9TRVRfTUVUSE9ELVp1Z3JpZmZzOgorICAgICBTZXQoUF9YWVosIE5PU0VUTUVUSE9ELCBGX01PREVfQVMpOworCisgICAgIC8vIFZvcmxhZXVmaWdlciBadWdyaWZmc3NjaHV0eiBmdWVyIGVpbmUgUHJvcGVydHk6CisgICAgIFNldChQX1hZWiwgUFJPVEVDVEVELCBGX01PREVfQVMpOworCisgICAgIC8vIFBlcm1hbmVudGVyIFp1Z3JpZmZzc2NodXR6IGZ1ZXIgZWluZSBQcm9wZXJ0eToKKyAgICAgU2V0KFBfWFlaLCBTRUNVUkVELCBGX01PREVfQVMpOworCisgICAgICMjIyBTZXR6ZW4gZWluZXIgU2V0TWV0aG9kL1F1ZXJ5TWV0aG9kICMjIworICAgICAvLyBTZXR6ZW4gZWluZXIgaW50ZXJuZW4gU2V0TWV0aG9kCisgICAgIG1peGVkIGZvbyhtaXhlZCB2YWwpOworICAgICAuLi4KKyAgICAgU2V0KFBfWFlaLCAjJ2ZvbywgRl9TRVRfTUVUSE9EKTsKKyAgICAgLi4uCisKKyAgICAgLy8gU2V0emVuIGVpbmVyIFF1ZXJ5TWV0aG9kIGJlaSBlaW5lbSBhbmRlcmVuIE9iamVrdAorICAgICBtaXhlZCBiYXIoKTsKKyAgICAgLi4uCisgICAgIG90aGVyLT5TZXQoUF9YWVosICMnYmFyLCBGX1FVRVJZX01FVEhPRCk7CisgICAgIC4uLgorCisgICAgIC8vIERlciBWb2xsc3RhZW5kaWdrZWl0IGhhbGJlciBzZWkgZGFzIEFlbmRlcm4gZWluZXIgUHJvcGVydHkgdW50ZXIKKyAgICAgLy8gVW1nZWh1bmcgdm9uIFNldC1NZXRob2RlbiBhbmdlZ2ViZW4uIEVzIGlzdCBhYmVyIGF1cyBvLmcuIEdydWVuZGVuCisgICAgIC8vIHp1IGVtcGZlaGxlbiwgZGllc2UgVmFyaWFudGUgbmljaHQgenUgdmVyd2VuZGVuLgorICAgICBTZXQoUF9YWVosICJibGEiLCBGX1ZBTFVFKTsKKworU0lFSEUgQVVDSDoKKyAgICAgQWVobmxpY2hlczogU2V0UHJvcChMKSwgUXVlcnlQcm9wKEwpLCBRdWVyeShMKQorICAgICBHZW5lcmVsbDogIFNldFByb3BlcnRpZXMoTCksIFF1ZXJ5UHJvcGVydGllcyhMKQorICAgICBLb256ZXB0OiAgcHJvcGVydGllcywgL3N0ZC90aGluZy9wcm9wZXJ0aWVzLmMKKyAgICAgU29uc3RpZ2VzOiAgUF9BVVRPTE9BRE9CSgorCiswNi4gSmFuIDIwMDggQXJhdGhvcm4KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1NldEF0dGFja0NoYXRzIGIvZG9jL2xmdW4vU2V0QXR0YWNrQ2hhdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcyMDNhMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL1NldEF0dGFja0NoYXRzCkBAIC0wLDAgKzEsNjggQEAKK1NldEF0dGFja0NoYXRzKCkKKworRlVOS1RJT046CisgICAgIHZvaWQgU2V0QXR0YWNrQ2hhdHMoaW50IGNoYW5jZSwgbWl4ZWQgc3Rycyk7CisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC9ucGMvY2hhdC5jCisKK0FSR1VNRU5URToKKyAgICAgY2hhbmNlCisgICAgICAgICAgUHJvemVudHVhbGUgV2FocnNjaGVpbmxpY2hrZWl0IGVpbmVyIEF1c2dhYmUKKyAgICAgc3RycworICAgICAgICAgIFN0cmluZ2FycmF5IG1pdCBkZW4gTW9uc3RlcmNoYXRzCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGVyIE5QQyBnaWJ0IG1pdCBkZXIgV2FocnNjaGVpbmxpY2hrZWl0ICdjaGFuY2UnIGVpbmVuIHp1ZmFlbGxpZworICAgICBnZXdhZWhsdGVuIFRleHQgYXVzICdzdHJzJyB2b24gc2ljaC4gRGllIEFycmF5ZWxlbWVudGUga29lbm5lbiAKKyAgICAgYXVjaCBGdW5rdGlvbmVuICgiQEBmdW5jQEAiKSBvZGVyIENsb3N1cmVzIGVudGhhbHRlbiwgZGllIGRhbm4KKyAgICAgYXVmZ2VydWZlbiB3ZXJkZW4gdW5kIGRlcmVuIFJ1ZWNrZ2FiZXdlcnRlIGRhcyBNb25zdGVyIGRhbm4gYXVzZ2lidC4KKworUlVFQ0tHQUJFV0VSVDoKKyAgICAga2VpbmVyCisgICAgIAorQkVNRVJLVU5HRU46CisgICAgIEF0dGFja0NoYXRzIHdlcmRlbiBudXIgaW0gS2FtcGYgYXVzZ2VnZWJlbi4gQW5zb25zdGVuIGlzdCBTZXRDaGF0cygpCisgICAgIHp1IHZlcndlbmRlbi4KKyAgICAgCisgICAgICdjaGFuY2UnIHdpcmQgaW4gZGVyIFByb3BlcnR5IFBfQUNIQVRfQ0hBTkNFIGFiZ2VsZWd0LiBVbSBlaW5lbiBOUEMKKyAgICAgdm9ydWViZXJnZWhlbmQgJ3N0aWxsenVsZWdlbicsIGthbm4gbWFuIFBfQUNIQVRfQ0hBTkNFIGF1ZiAwIHNldHplbi4KKyAgICAgCisgICAgIE1hbiBrYW5uIEF0dGFja0NoYXRzIG51dHplbiwgdW0gTW9uc3RlcnNwZWxscyB6dSByZWFsaXNpZXJlbi4gQmVzc2VyCisgICAgIGlzdCBlcyBhYmVyLCBkYWZ1ZXIgJ0FkZFNwZWxsJyB6dSB2ZXJ3ZW5kZW4uCisgICAgIAorQkVJU1BJRUxFOgorCisgICAgIFNldEF0dGFja0NoYXRzKCAyMCwKKyAgICAgICAoeyAiRGVyIE9yayB0cml0dCBEaXIgaW4gZGVuIEhpbnRlcm4uXG4iLAorICAgICAgICAgICJEZXIgT3JrIGJydWVsbHQ6IExlYmVuZCBrb21tc3QgRHUgaGllciBuaWNodCByYXVzIVxuIiwKKyAgICAgICAgICAiRGVyIE9yayBibHV0ZXQgc2Nob24gYXVzIG1laHJlcmVuIFd1bmRlbi5cbiIsCisgICAgICAgICAgIkBAa25pcnNjaEBAIiB9KSApOworICAgICAgICAgIAorICAgICBzdHJpbmcga25pcnNjaCgpCisgICAgIHsKKyAgICAgICBvYmplY3QgKnJ1ZXN0dW5nLCAqdG1wLCBoZWxtOworICAgICAgIAorICAgICAgIHJ1ZXN0dW5nID0gdGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKFBfQVJNT1VSUyk7IC8vIGdldHJhZ2VuZSBSdWVzdHVuZworICAgICAgIHRtcCA9IGZpbHRlcl9vYmplY3RzKHJ1ZXN0dW5nLCAiaWQiLCBBVF9IRUxNRVQpOworICAgICAgIC8vIFdlbm4gZGVyIFNwaWVsZXIgZWluZW4gSGVsbSB0cmFlZ3QsIGVudGhhZWx0ICd0bXAnIGpldHp0CisgICAgICAgLy8gZWluIEFycmF5IG1pdCBkZW0gSGVsbW9iamVrdCBhbHMgZWluemlnZW0gRWxlbWVudAorICAgICAgIGlmIChzaXplb2YodG1wKSkgaGVsbSA9IHRtcFswXTsKKwkgaWYgKG9iamVjdHAoaGVsbSkpCisJIHsKKwkgICAvLyBBQyBudXIgZGFubiBzZW5rZW4sIHdlbm4gc2llIG5pY2h0IHNjaG9uIDAgaXN0LgorCSAgIGlmIChoZWxtLT5RdWVyeVByb3AoUF9BQyk+MCkgeworCSAgICAgaGVsbS0+RGFtYWdlKDEpOworCSAgICAgcmV0dXJuICJEZXIgT3JrIGJlc2NoYWVkaWd0IERlaW5lbiBIZWxtIVxuIjsKKwkgICB9CisJICAgcmV0dXJuICIiOworCSB9CisJIGVsc2UKKwkgICByZXR1cm4gIiI7IC8vIGtlaW5lIE1lbGR1bmcKKyAgICAgfQorCitTSUVIRSBBVUNIOgorICAgICBQX0FDSEFUX0NIQU5DRSwgU2V0Q2hhdHMoKSwgL3N0ZC9ucGMvY2hhdC5jLCBBZGRTcGVsbCgpCisKK0xFVFpURSBBRU5ERVJVTkc6CisJRG9uLCAyNy4xMi4yMDA3LCAxNjozNTowMCB2b24gQXJhdGhvcm4KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1NldEF0dHIgYi9kb2MvbGZ1bi9TZXRBdHRyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlY2YzODEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9TZXRBdHRyCkBAIC0wLDAgKzEsMzEgQEAKK1NldEF0dHIoKQorRlVOS1RJT046CisgICAgIHByaXZhdGUgc3RhdGljIGludCBTZXRBdHRyKHN0cmluZyBhdHRyLCBpbnQgdmFsKQorCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvbGl2aW5nL2F0dHJpYnV0ZXMuYworCitBUkdVTUVOVEU6CisgICAgIGF0dHIgICAgICAgLSB6dSBzZXR6ZW5kZXMgQXR0cmlidXQKKyAgICAgdmFsICAgICAgICAtIFdlcnQKKworQkVTQ0hSRUlCVU5HOgorICAgICBGaWx0ZXJ0IGRlbiBXZXJ0IGR1cmNoIF9maWx0ZXJhdHRyKCkuIERhZHVyY2ggd2VyZGVuIFNUUiwgSU5ULCBDT04sIERFWAorICAgICBhdWYgMjAgYmVncmVuenQuIFNldHp0IGRhbm4gZGFzIEF0dHJpYnV0LgorICAgICBPZmZzZXRzIHdlcmRlbiBoaWVyIG5pY2h0IGJlcnVlY2tzaWNodGlndCwgUXVlcnlBdHRyaWJ1dGUoKSBnaWJ0IGFsc28KKyAgICAgdmFsICsgZXR3YWlnZSBPZmZzZXRzL01vZGlmaWVyIHp1cnVlY2suCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIFRhdHNhZWNobGljaCBnZXNldHp0ZXIgV2VydC4KKworQkVNRVJLVU5HRU46CisgICAgIFdpcmQgdm9uIFNldEF0dHJpYnV0ZSgpIHVuZCBTZXRSZWFsQXR0cmlidXRlKCkgYXVmZ2VydWZlbi4KKworU0lFSEUgQVVDSDoKKyAgICAgUXVlcnlBdHRyaWJ1dGUoKSwgUXVlcnlSZWFsQXR0cmlidXRlKCksIFF1ZXJ5QXR0cmlidXRlT2Zmc2V0KCksDQorICAgICBTZXRBdHRyaWJ1dGUoKSwgU2V0UmVhbEF0dHJpYnV0ZSgpLCBVcGRhdGVBdHRyaWJ1dGVzKCksDQorICAgICBUZXN0QXR0cmlidXRlTG9jaygpLA0KKyAgICAgUF9BVFRSSUJVVEVTLCBQX0FUVFJJQlVURVNfT0ZGU0VUUywgUF9BVFRSSUJVVEVTX01PRElGSUVSLA0KKyAgICAgUF9YX0FUVFJfTU9ELCBQX01fQVRUUl9NT0QsIC9zdGQvbGl2aW5nL2F0dHJpYnV0ZXMuYw0KKworMTMuTm92LjIwMDIsIEdsb2luc29uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vU2V0QXR0cmlidXRlIGIvZG9jL2xmdW4vU2V0QXR0cmlidXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYjU0ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9TZXRBdHRyaWJ1dGUKQEAgLTAsMCArMSwyOCBAQAorU2V0QXR0cmlidXRlKCkKK0ZVTktUSU9OOgorICAgICBpbnQgU2V0QXR0cmlidXRlKHN0cmluZyBhdHRyLCBpbnQgdmFsKQorCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvbGl2aW5nL2F0dHJpYnV0ZXMuYworCitBUkdVTUVOVEU6CisgICAgIGF0dHIgICAgICAgLSB6dSBzZXR6ZW5kZXMgQXR0cmlidXQKKyAgICAgdmFsICAgICAgICAtIFdlcnQKKworQkVTQ0hSRUlCVU5HOgorICAgICBOaW1tIHZhbCBhbHMgR2VzYW10d2VydCBkZXMgQXR0cmlidXRlcywgZC5oLiB6aWVodCBldHdhaWdlIE9mZnNldHMgdm9yCisgICAgIFNldHplbiBhYi4gKFF1ZXJ5QXR0cmlidXRlIGdpYnQgZGFubiBhbHNvIHZhbCB6dXJ1ZWNrKQorCitSVWVDS0dBQkVXRVJUOgorICAgICBEZW4gZHVyY2ggU2V0QXR0ciBnZWZpbHRlcnRlbiBnZXNldHp0ZW4gV2VydC4KKyAgICAgQml0dGUgbmljaHQgYXVmIFNwaWVsZXIgYW53ZW5kZW4hCisKK1NJRUhFIEFVQ0g6DQorCVF1ZXJ5QXR0cmlidXRlKCksIFF1ZXJ5UmVhbEF0dHJpYnV0ZSgpLCBRdWVyeUF0dHJpYnV0ZU9mZnNldCgpLA0KKwlTZXRBdHRyaWJ1dGUoKSwgU2V0UmVhbEF0dHJpYnV0ZSgpLCBVcGRhdGVBdHRyaWJ1dGVzKCksDQorCVNldFRpbWVkQXR0ck1vZGlmaWVyKCksIFF1ZXJ5VGltZWRBdHRyTW9kaWZpZXIoKSwgDQorCURlbGV0ZVRpbWVkQXR0ck1vZGlmaWVyKCksDQorCVBfQVRUUklCVVRFUywgUF9BVFRSSUJVVEVTX09GRlNFVFMsIFBfVElNRURfQVRUUl9NT0QsDQorCVBfWF9BVFRSX01PRCwgUF9NX0FUVFJfTU9ELCAvc3RkL2xpdmluZy9hdHRyaWJ1dGVzLmMNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorTGFzdCBtb2RpZmllZDogVHVlIEp1bCAyNyAyMDowMDoyMCAyMDA0IGJ5IE11YWRpYg0KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1NldEJ1eUZhY3QgYi9kb2MvbGZ1bi9TZXRCdXlGYWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MTU0YzcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9TZXRCdXlGYWN0CkBAIC0wLDAgKzEsMzYgQEAKK1NldEJ1eUZhY3QoKQorCitGVU5LVElPTjoKKyAgICAgdm9pZCBTZXRCdXlGYWN0KGludCBmYWN0KTsKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL2xhZGVuLmMKKworQVJHVU1FTlRFOgorICAgICBmYWN0CisgICAgICAgICAgRGVyIEVpbmthdWZzcHJlaXNtdWx0aXBsaWthdG9yLgorCitCRVNDSFJFSUJVTkc6CisgICAgIERlciBQcmVpcywgZGVyIGJlaW0gS2F1ZiBlaW5lcyBPYmpla3RzIGltIExhZGVuIHp1IGVudHJpY2h0ZW4gaXN0LAorICAgICBlcnJlY2huZXQgc2ljaCBhdXMgc2VpbmVtIFdlcnQgKCBQX1ZBTFVFKSwgbXVsdGlwbGl6aWVydCBtaXQgZGVtIEZha3RvcgorICAgICBmYWN0LiBEaWVzZXIgUHJlaXMgaXN0IGtvbnN0YW50IHVuZCBuaWNodCB2b24gZGVyIGFrdHVlbGxlbiBNYXJrdGxhZ2UKKyAgICAgYWJoYWVuZ2lnLgorCisgICAgIERlciBEZWZhdWx0d2VydCBpc3QgMy4gRWluIGhvZWhlcmVyIFdlcnQgZW50c3ByaWNodCBlaW5lbSB0ZXVyZW4gTGFkZW4sCisgICAgIHdhZWhyZW5kIGVpbiBrbGVpbmVyZXIgV2VydCB6dSBrbGVpbmVuIFByZWlzZW4gZnVlaHJ0LgorCitSVWVDS0dBQkVXRVJUOgorICAgICBrZWluZXIKKworQkVNRVJLVU5HRU46CisgICAgIE5vcm1hbGVyd2Vpc2Uga29tbXQgbWFuIG9obmUgZGllc2UgRnVua3Rpb24gYXVzOiBpbiB0ZXVyZW4gTGFlZGVuIHdpcmQKKyAgICAgbmljaHQgdmllbCBlaW5nZWthdWZ0IChlcyBzZWkgZGVubiwgZXMgbGllZ2VuIHN0YW5kYXJkbWFlc3NpZyBndXRlCisgICAgIE9iamVrdGUgaW0gU3BlaWNoZXIpLCBlaW5lbSBCaWxsaWdsYWRlbiB3aXJkIGJhbGQgZGFzIEdlbGQgYXVzZ2VoZW4gbWl0CisgICAgIGRlciBGb2xnZSwgZGFzcyBkZXIgTGFkZW5iZXNpdHplciBuaWNodHMgbWVociBhbmthdWZlbiBrYW5uIHVuZCBzZWluCisgICAgIExhZ2VyIGdhZWhuZW5kIGxlZXIgaXN0LgorCitTSUVIRSBBVUNIOgorICAgICBRdWVyeUJ1eUZhY3QoKSwgL3N0ZC9sYWRlbi5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFdlZCBNYXkgOCAxMDoyNDo1MiAxOTk2IGJ5IFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vU2V0Q2hhdHMgYi9kb2MvbGZ1bi9TZXRDaGF0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjQyNWE4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vU2V0Q2hhdHMKQEAgLTAsMCArMSw2OSBAQAorU2V0Q2hhdHMoKQorCitGVU5LVElPTjoKKwl2b2lkIFNldENoYXRzKGludCBjaGFuY2UsbWl4ZWQgc3Rycyk7CisKK0RFRklOSUVSVCBJTjoKKwkvc3RkL25wYy9jaGF0LmMKKworQVJHVU1FTlRFOgorCWNoYW5jZQorCSAgUHJvemVudHVhbGUgV2FocnNjaGVpbmxpY2hrZWl0IGVpbmVyIEF1c2dhYmUKKwlzdHJzCisJICBTdHJpbmdhcnJheSBtaXQgZGVuIE1vbnN0ZXJjaGF0cworCitCRVNDSFJFSUJVTkc6CisJRGVyIE5QQyBnaWJ0IG1pdCBkZXIgV2FocnNjaGVpbmxpY2hrZWl0IDxjaGFuY2U+IHBybyBIZWFydGJlYXQgZWluZW4KKwl6dWZhZWxsaWcgZ2V3YWVobHRlbiBUZXh0IGF1cyBkZW0gQXJyYXkgPHN0cnM+IHZvbiBzaWNoLgorCURpZSBBcnJheWVsZW1lbnRlIGtvZW5uZW4gYXVjaCBDbG9zdXJlcyBvZGVyCisJcHJvY2Vzc19zdHJpbmcoKS1GdW5rdGlvbmVuICgiQEBmdW5jQEAiKSBlbnRoYWx0ZW4sIGRpZSBkYW5uCisJYXVmZ2VydWZlbiB3ZXJkZW4gdW5kIGRlcmVuIFJ1ZWNrZ2FiZXdlcnRlIGRhcyBNb25zdGVyIGRhbm4gYXVzZ2lidC4KKwkgKEZ1ZXIga2VpbmUgQXVzZ2FiZSBkYW5uIExlZXJzdHJpbmcgIiIgenVydWVja2dlYmVuISkKKwlJbiBkaWVzZW4gRnVua3Rpb25lbiBpc3QgdGhpc19wbGF5ZXIoKSBkYXMgTW9uc3RlciBzZWxic3QhCisJRnVlciBaZWlsZW51bWJydWVjaGUgaXN0IGltbWVyIHNlbGJzdCB6dSBzb3JnZW4uCisKK1JVRUNLR0FCRVdFUlQ6CisJa2VpbmVyCisKK0JFSVNQSUVMRToKKwlFaW4gZWluZmFjaGVzIEJlaXNwaWVsOgorCSAgLy8gUHJvdG90eXBlIGZ1ZXIgQ2xvc3VyZS4KKwkgIHN0YXRpYyBzdHJpbmcgaW5mbzEoKTsKKwkgIHZvaWQgY3JlYXRlKCkKKwkgIHsgLi4uCisJICAgIFNldENoYXRzKDIwLAorCSAgICh7IkRlciBPcmsgc2FndDogSGF1IGFiLCBiZXZvciBpY2ggRGljaCBmcmVzc2UuXG4iLAorCSAgICAgIkRlciBPcmsgZ3JpbnN0IERpY2ggdW52ZXJzY2hhZW10IGFuLlxuIiwKKwkgICAgICJEZXIgT3JrIHdlZGVsdCBtaXQgc2VpbmVtIFNhZWJlbCB2b3IgRGVpbmVtIEdlc2ljaHQgaGVydW0uXG4iLAorCSAgICAgIkRlciBPcmsgZHJvaHQgRGlyIG1pdCBkZXIgRmF1c3QuXG4iLAorICAgICAgICAgICAgICMnaW5mbzEsCisJICAgICAiQEBpbmZvMkBAIn0pKTsKKyAgICAgICAgICB9CisJICAvLyBGdW5rdGlvbiBhbHMgQ2xvc3VyZS4gUHJvdG90eXBlIG5vdHdlbmRpZyEKKwkgIHN0YXRpYyBzdHJpbmcgaW5mbzEoKQorCSAgeyBpZihRdWVyeVByb3AoUF9IUCk8UXVlcnlQcm9wKFBfQUxJR04pKQorCSAgICAgIHJldHVybiJHbGVpY2ggd2VyZGUgaWNoIHZvbiBoaWVyIGZsaWVoZW4hXG4iOworCSAgICByZXR1cm4iIjsKKwkgIH0KKwkgIC8vIEZ1bmt0aW9uIGFscyBwcm9jZXNzX3N0cmluZygpLgorCSAgc3RyaW5nIGluZm8yKCkKKwkgIHsgcmV0dXJuIFF1ZXJ5UHJvcChQX0hQKT09UXVlcnlQcm9wKFBfTUFYX0hQKT8KKwkgIkRlciBPcmsgZ3JpbnN0OiBNaXIgZ2VodCBlcyBmYW50YXN0aXNjaCFcbiI6CisJICJEZXIgT3JrIHNldWZ6dDogTWlyIGdpbmcgZXMgd2lya2xpY2ggc2Nob24gbWFsIGJlc3Nlci5cbiI7CisJICB9CisKK0JFTUVSS1VOR0VOOgorCUltIEthbXBmIHdlcmRlbiBrZWluZSBDaGF0cyBhdXNnZWdlYmVuLiBFcyBpc3QgZGFubiBTZXRBdHRhY2tDaGF0cygpCisJenUgdmVyd2VuZGVuLgorCUZ1bmt0aW9uZW4gYWxzIHByb2Nlc3Nfc3RyaW5nKCkgc29sbHRlIG1hbiBuaWNodCBtZWhyIHZlcndlbmRlbi4KKwk8Y2hhbmNlPiB3aXJkIGluIGRlciBQcm9wZXJ0eSBQX0NIQVRfQ0hBTkNFIGFiZ2VsZWd0LiBVbSBlaW5lbiBOUEMKKwl2b3J1ZWJlcmdlaGVuZCAnc3RpbGx6dWxlZ2VuJywga2FubiBtYW4gUF9DSEFUX0NIQU5DRSBhdWYgMCBzZXR6ZW4uCisgIFdlbm4ga2VpbiBTcGllbGVyIGFud2VzZW5kIGlzdCwgaGFiZW4gTlBDIGluIGRlciBSZWdlbCBrZWluZW4gSGVhcnRiZWF0LAorICB3ZXN3ZWdlbiBkYW5uIGF1Y2ggZGllIENoYXRzIGF1c2dlc2NoYWx0ZXQgc2luZC4KKyAgU3BpZWxlciBrb2VubmVuIE5QQyAnc3RpbGxlbicsIGQuaC4gQ2hhdHMgdW5kIEF0dGFja0NoYXRzIGFic2NoYWx0ZW4uCisKK1NJRUhFIEFVQ0g6CisJUF9DSEFUX0NIQU5DRSwgU2V0QXR0YWNrQ2hhdHMoKSwgcHJvY2Vzc19zdHJpbmcoKQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBTYXQgSmFuIDE4IDE4OjQ4OjA2IDIwMDMgYnkgUGF0cnluCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9TZXRDb2luc1BlclVuaXRzIGIvZG9jL2xmdW4vU2V0Q29pbnNQZXJVbml0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2UzODc5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vU2V0Q29pbnNQZXJVbml0cwpAQCAtMCwwICsxLDM4IEBACitTZXRDb2luc1BlclVuaXRzKCkKKworRlVOS1RJT046CisgICAgIHZvaWQgU2V0Q29pbnNQZXJVbml0cyhpbnQgY29pbnMsIGludCB1bml0cyk7CisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC91bml0LmMKKworQVJHVU1FTlRFOgorICAgICBjb2lucworICAgICAgICAgIFphaGwgZGVyIE11ZW56ZW4KKyAgICAgdW5pdHMKKyAgICAgICAgICBaYWhsIGRlciBFaW5oZWl0ZW4KKworQkVTQ0hSRUlCVU5HOgorICAgICBFcyB3aXJkIGZlc3RnZWxlZ3QsIHdpZXZpZWwgZWluZSBiZXN0aW1tdGUgTWVuZ2UgZGVyIEVpbmhlaXRlbiBrb3N0ZXQuCisgICAgIEVpbmUgZWluemVsbmUgRWluaGVpdCBrb3N0ZXQgY29pbnMvdW5pdHMgTXVlbnplbi4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICAga2VpbmVyCisKK0JFTUVSS1VOR0VOOgorICAgICBCZWkgZGVyIFByZWlzYmVyZWNobnVuZyB3aXJkIGFiZ2VydW5kZXQuIEhhdCBtYW4gYWxzbyBlaW4gVmVyaGFlbHRuaXMKKyAgICAgdm9uIGVpbmVyIE11ZW56ZSBwcm8gendlaSBFaW5oZWl0ZW4sIHNvIGlzdCBkZXIgUHJlaXMgZWluZXIgZWluemVsbmVuCisgICAgIEVpbmhlaXQgMCEKKworQkVJU1BJRUxFOgorICAgICBFaW5lIEVpbmhlaXQgc29sbCAzLjUgTXVlbnplbiB3ZXJ0IHNlaW46CisKKyAgICAgLyogNyBNdWVuemVuIC8gMiBFaW5oZWl0ZW4gPSAzLjUgTXVlbnplbiAvIEVpbmhlaXQgKi8KKyAgICAgU2V0Q29pbnNQZXJVbml0cyg3LDIpOworCitTSUVIRSBBVUNIOgorICAgICBRdWVyeUNvaW5zUGVyVW5pdHMoKSwgU2V0R3JhbXNQZXJVbml0cygpLCBRdWVyeUdyYW1zUGVyVW5pdHMoKSwKKyAgICAgL3N0ZC91bml0LmMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogV2VkIE1heSA4IDEwOjI0OjU3IDE5OTYgYnkgV2FyZ29uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9TZXREb29yU3RhdHVzIGIvZG9jL2xmdW4vU2V0RG9vclN0YXR1cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTQ4NjM3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vU2V0RG9vclN0YXR1cwpAQCAtMCwwICsxLDI5IEBACitGVU5LVElPTjoKKyAgICAgdm9pZCBTZXREb29yU3RhdHVzKHN0cmluZyBkZXN0LCBpbnQgc3RhdHVzKTsKKworREVGSU5JRVJUIElOOgorICAgICAvb2JqL2Rvb3JtYXN0ZXIuYworCitBUkdVTUVOVEU6CisgICAgIDxkZXN0PiAgID0gWmllbHJhdW0gZGVyIFR1ZXIuCisgICAgIDxzdGF0dXM+ID0gRGVyIG5ldWUgWnVzdGFuZCBkZXIgVHVlci4KKworQkVTQ0hSRUlCVU5HOgorICAgICBEZXIgWnVzdGFuZCBkZXIgVHVlciwgZGllIHZvbiBkaWVzZW0gUmF1bSBuYWNoIDxkZXN0PiBmdWVocnQsIHdpcmQgYXVmCisgICAgIDxzdGF0dXM+IGdlYWVuZGVydC4gSGllcmJlaSBtdXNzIDxzdGF0dXM+IGVpbmVyIGRlciBkcmVpIGZvbGdlbmRlbiBXZXJ0ZQorICAgICBhdXMgPGRvb3Jyb29tLmg+IHNlaW46CisKKyAgICAgICBEX1NUQVRVU19MT0NLRUQgLSBUdWVyIGFiZ2VzY2hsb3NzZW4KKyAgICAgICBEX1NUQVRVU19DTE9TRUQgLSBUdWVyIGdlc2NobG9zc2VuCisgICAgICAgRF9TVEFUVVNfT1BFTiAgIC0gVHVlciBnZW9lZmZuZXQKKworUlVFQ0tHQUJFV0VSVDoKKyAgICAga2VpbmVyCisKKworU0lFSEUgQVVDSDoKKyAgICBOZXdEb29yKCksIFF1ZXJ5RG9vcktleSgpLCBRdWVyeURvb3JTdGF0dXMoKSwgUF9ET09SX0lORk9TLAorICAgIC9zdGQvcm9vbS9kb29ycy5jLCAvb2JqL2Rvb3JtYXN0ZXIuYywgR2V0UGhpb2xlbkluZm9zKCksIFF1ZXJ5QWxsRG9vcnMoKQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGV0enRlIEFlbmRlcnVuZzogRG9uLCAwOC4wNS4yMDE0LCBHYWJ5bG9uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9TZXRFbmVtaWVzIGIvZG9jL2xmdW4vU2V0RW5lbWllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yzc5YTU2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vU2V0RW5lbWllcwpAQCAtMCwwICsxLDMzIEBACitTZXRFbmVtaWVzKCkKKworRlVOS1RJT046CisgICAgIG1hcHBpbmcgU2V0RW5lbWllcyhvYmplY3QgKm15ZW5lbWllcyk7CisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC9saXZpbmcvY29tYmF0LmMKKworQVJHVU1FTlRFOgorICAgICBteWVuZW1pZXMKKwkgIEFycmF5OiAoe0dlZ25lcmFycmF5LCBaZWl0ZW5hcnJheX0pCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIEludGVybmVzIE1hcHBpbmcgbWl0IGJla2FubnRlbiBHZWduZXJuIHVuZCBaZWl0ZW4uCisKK0JFU0NIUkVJQlVORzoKKyAgICAgTm9ybWFsZXJ3ZWlzZSBmdWVndCBtYW4gZWluemVsbmUgR2VnbmVyIG1pdHRlbHMgSW5zZXJ0RW5lbXkoKSBlaW4gdW5kCisgICAgIGxvZXNjaHQgYWx0ZSBGZWluZGUgbWl0dGVscyBTdG9wSHVudEZvcigpLgorCisgICAgIFVtIGplZG9jaCBtaXQgZWluZW0gU2NobGFnIHZpZWxlIFZlcmFlbmRlcnVuZ2VuIHZvcnp1bmVobWVuLCBrYW5uIG1hbgorICAgICBkaWUgRnVua3Rpb24gU2V0RW5lbWllcygpIG51dHplbi4KKworICAgICBJaHIgdWViZXJnaWJ0IG1hbiBlaW4gQXJyYXkgbWl0IGVpbmVtIEFycmF5IG1pdCBkZW4gZ2V3dWVuc2NodGVuIEdlZ25lcm4KKyAgICAgYWxzIHVuZCBlaW5lbSB6d2VpdGVuLCBnbGVpY2hncm9zc2VuIEFycmF5IG1pdCBkZW4gWmVpdGVuLCB3aWUgbGFuZ2UKKyAgICAgZGllc2UgR2VnbmVyIGFrdHVlbGwgc2VpbiBzb2xsZW4sIGFscyBFaW50cmFlZ2UuCisKKyAgICAgRGllIEZ1bmt0aW9uIHRyYWVndCBkaWVzZSBXZXJ0ZSBhbHMgR2VnbmVyIG1pdCBlbnRzcHJlY2hlbmRlcgorICAgICBGZWluZGVzemVpdCBlaW4uCisKK1NJRUhFIEFVQ0g6CisgICAgIEluc2VydEVuZW15KCksIFN0b3BIdW50Rm9yKCksIFNlbGVjdEVuZW15KCksIFByZXNlbnRFbmVtaWVzKCkKKworMTAuRmViIDIwMDUgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1NldEdyYW1zUGVyVW5pdHMgYi9kb2MvbGZ1bi9TZXRHcmFtc1BlclVuaXRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYmY5YTQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9TZXRHcmFtc1BlclVuaXRzCkBAIC0wLDAgKzEsMzIgQEAKK1NldEdyYW1zUGVyVW5pdHMoKQorCitGVU5LVElPTjoKKyAgICAgdm9pZCBTZXRHcmFtc1BlclVuaXRzKGludCBncmFtcywgaW50IHVuaXRzKTsKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL3VuaXQuYworCitBUkdVTUVOVEU6CisgICAgIGdyYW1zCisgICAgICAgICAgR2V3aWNodCBpbiBHcmFtbQorICAgICB1bml0cworICAgICAgICAgIFphaGwgZGVyIEVpbmhlaXRlbgorCitCRVNDSFJFSUJVTkc6CisgICAgIEVzIHdpcmQgZmVzdGdlbGVndCwgd2lldmllbCBlaW5lIGJlc3RpbW10ZSBNZW5nZSBkZXIgRWluaGVpdGVuIHdpZWd0LgorICAgICBFaW5lIGVpbnplbG5lIEVpbmhlaXQgd2llZ3QgZ3JhbXMvdW5pdHMgR3JhbW0uCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIGtlaW5lcgorCitCRUlTUElFTEU6CisgICAgIFZpZXIgRWluaGVpdGVuIHNvbGxlbiAzIEdyYW1tIHdpZWdlbjoKKworICAgICBTZXRHcmFtc1BlclVuaXRzKDMsNCk7CisKK1NJRUhFIEFVQ0g6CisgICAgIFNldENvaW5zUGVyVW5pdHMoKSwgUXVlcnlDb2luc1BlclVuaXRzKCksIFF1ZXJ5R3JhbXNQZXJVbml0cygpLAorICAgICAvc3RkL3VuaXQuYworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBXZWQgTWF5IDggMTA6MjU6MDkgMTk5NiBieSBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1NldFByb3AgYi9kb2MvbGZ1bi9TZXRQcm9wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNjAyZmIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9TZXRQcm9wCkBAIC0wLDAgKzEsNDcgQEAKK1NldFByb3AoKQorRlVOS1RJT046CisgICAgIHB1YmxpYyBtaXhlZCBTZXRQcm9wKHN0cmluZyBuYW1lLCBtaXhlZCBWYWx1ZSk7CisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC90aGluZy9wcm9wZXJ0aWVzLmMKKyAgICAgL3N5cy90aGluZy9wcm9wZXJ0aWVzLmggKFByb3RvdHlwKQorCitBUkdVTUVOVEU6CisgICAgIG5hbWUJLSBQcm9wZXJ0eSwgZGVyZW4gV2VydCB2ZXJhZW5kZXJ0IHdlcmRlbiBzb2xsLgorICAgICBWYWx1ZQktIFdlcnQsIGF1ZiBkZW4gZGVyIEluaGFsdCBkZXIgUHJvcGVydHkgZ2VzZXR6dCB3ZXJkZW4gc29sbAorCitCRVNDSFJFSUJVTkc6CisgICAgIERlciBEYXRlbndlcnQgZGVyIFByb3BlcnR5ICduYW1lJyB3aXJkIGF1ZiBkZW4gV2VydCAnVmFsdWUnIGdlc2V0enQuCisKKyAgICAgRXhpc3RpZXJ0IGVpbmUgRl9TRVRfTUVUSE9EIG9kZXIgZWluZSBfc2V0XyduYW1lJygpLU1ldGhvZGUgZnVlcgorICAgICBkaWVzZSBQcm9wZXJ0eSwgc28gd2lyZCBkaWVzZSBhdWZnZXJ1ZmVuIHVuZCBpaHIgJ1ZhbHVlJyB1ZWJlcmdlYmVuLgorICAgICBFaW5lIEZfU0VUX01FVEhPRCBoYXQgZGFiZWkgVm9ycmFuZyB2b3IgX3NldF8nbmFtZScoKSwgZC5oLgorICAgICBfc2V0XyduYW1lJygpIHdpcmQgbmFjaCBlcmZvbGdyZWljaGVyIEZfUVVFUllfTUVUSE9EIG5pY2h0IG1laHIKKyAgICAgZ2VydWZlbi4KKworICAgICAoRGllc2UgTWV0aG9kZW4gbnV0emVuIGRhbm4gU2V0KCksIHVtIGRlbiBEYXRlbndlcnQgZGVyIFByb3BlcnR5CisgICAgICAnbmFtZScgenUgYWVuZGVybi4gVGVpbHdlaXNlIHdlcmRlbiBhYmVyIGF1Y2ggaW50ZXJuZSBWYXJpYWJsZW4gc28KKyAgICAgIG9lZmZlbnRsaWNoIGdlbWFjaHQgdW5kIHNpbmQgbmljaHQgaW4gZGVyIHVlYmVyIFNldC9RdWVyeSB2ZXJmdWVnYmFyZW4KKyAgICAgIFByb3BlcnR5ICduYW1lJyBhYmdlbGVndC4pCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIERlciBXZXJ0LCBkZXIgbnVuIGluIGRlciBQcm9wZXJ0eSBnZXNwZWljaGVydCBpc3QuCisgICAgIEluIGRlciBSZWdlbCBpc3QgZGFzICdWYWx1ZScuIFdlbm4gZGllIFByb3BlcnR5IHVlYmVyIGVpbmUgU0VUX01FVEhPRAorICAgICBvZGVyIGVpbmUgX3NldF8nbmFtZScoKS1GdW5rdGlvbiB2ZXJmdWVndCB1bmQgZGllc2UgJ1ZhbHVlJyBhZW5kZXJ0CisgICAgICh6dW0gQmVpc3BpZWwsIGluZGVtIHNpZSAnVmFsdWUnIGFuIGVpbmVuIGJlc3RpbW10ZW4gZXJsYXVidGVuCisgICAgIFdlcnRlYmVyZWljaCBhbnBhc3N0KSwga2FubiBkZXIgUnVlY2tnYWJld2VydCBqZWRvY2ggYXVjaCB2ZXJhZW5kZXJ0CisgICAgIHNlaW4uCisKKyAgICAgV2VubiBkaWUgUHJvcGVydHkgbmljaHQgdmVyYWVuZGVydCB3ZXJkZW4gZGFyZiwgd2lyZCAtMSB6dXJ1ZWNrZ2VnZWJlbi4KKworQkVJU1BJRUxFOgorICAgICAvLyBnZWJlbiB3aXIgZGVtIFp3ZXJnIGVpbmUgS3VyemJlc2NocmVpYnVuZworICAgICBTZXRQcm9wKFBfU0hPUlQsICJFaW4ga2xlaW5lciBad2VyZyIpOworCitTSUVIRSBBVUNIOgorICAgICBBZWhubGljaGVzOglRdWVyeVByb3AoTCksIFNldChMKSwgUXVlcnkoTCkKKyAgICAgR2VuZXJlbGw6CQlTZXRQcm9wZXJ0aWVzKEwpLCBRdWVyeVByb3BlcnRpZXMoTCkKKyAgICAgS29uemVwdDoJCXByb3BlcnRpZXMsIC9zdGQvdGhpbmcvcHJvcGVydGllcy5jCisKKzE1LkRleiAyMDA0IEdsb2luc29uCisKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1NldFByb3BlcnRpZXMgYi9kb2MvbGZ1bi9TZXRQcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMWZhMWQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9TZXRQcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjcgQEAKK1NldFByb3BlcnRpZXMoKQorRlVOS1RJT046CisgICAgIHZvaWQgU2V0UHJvcGVydGllcyhtYXBwaW5nIHByb3BzKTsKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL3RoaW5nL3Byb3BlcnRpZXMuYworCitBUkdVTUVOVEU6CisgICAgIHByb3BzCS0gTWFwcGluZyBtaXQgZGVuIERhdGVuIGZ1ZXIgYWxsZSBQcm9wZXJ0aWVzCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGllc2UgRnVua3Rpb24gc2V0enQgYW5nZWdlYmVuZSBQcm9wZXJ0aWVzIGF1ZiBlaW5lbiBTY2hsYWcuCisgICAgIE1hcHBpbmcgbXVzcyB3aWUgZm9sZ3QgYXVmZ2ViYXV0IHNlaW46CisJKFsgbmFtZTogd2VydDsgZmxhZ3M7IHNldF9tZXRob2Q7IHF1ZXJ5X21ldGhvZCwKKwkgICBuYW1lMjogLi4uIF0pOworCitCRU1FUktVTkdFTjoKKyAgICAgLSBkaWVzZSBGdW5rdGlvbiB3aXJkIHZvbiByZXN0b3JlX29iamVjdCgpIHZlcndlbmRldCwgdW0gbmljaHQgYWxsZQorICAgICAgIHJlc3RhdXJpZXJ0ZW4gUHJvcGVydGllcyBlaW56ZWxuIHNldHplbiB6dSBtdWVzc2VuLgorICAgICAtIFNFQ1VSRUQvUFJPVEVDVEVEL05PU0VUTUVUSE9EIFByb3BlcnRpZXMgd2VyZGVuIGJlcnVlY2tzaWNodGlndAorCitTSUVIRSBBVUNIOgorICAgICBBZWhubGljaGVzOglTZXRQcm9wKEwpLCBRdWVyeVByb3AoTCksIFNldChMKSwgUXVlcnkoTCkKKyAgICAgR2VuZXJlbGw6CQlRdWVyeVByb3BlcnRpZXMoTCkKKyAgICAgS29uemVwdDoJCXByb3BlcnRpZXMsIC9zdGQvdGhpbmcvcHJvcGVydGllcy5jCisKKzEuTWFpIDIwMDQgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1NldFJlYWxBdHRyaWJ1dGUgYi9kb2MvbGZ1bi9TZXRSZWFsQXR0cmlidXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZWExNGMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9TZXRSZWFsQXR0cmlidXRlCkBAIC0wLDAgKzEsMzEgQEAKK1NldFJlYWxBdHRyaWJ1dGUoKQorRlVOS1RJT046CisgICAgIGludCBTZXRSZWFsQXR0cmlidXRlKHN0cmluZyBhdHRyLCBpbnQgdmFsKQorCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvbGl2aW5nL2F0dHJpYnV0ZXMuYworCitBUkdVTUVOVEU6CisgICAgIGF0dHIgICAgICAgLSB6dSBzZXR6ZW5kZXMgQXR0cmlidXQKKyAgICAgdmFsICAgICAgICAtIFdlcnQKKworQkVTQ0hSRUlCVU5HOgorICAgICBTZXR6dCBkZW4gcmVhbGVuIFdlcnQgZGVzIEF0dHJpYnV0ZXMsIGQuaC4gZGFzIHJlaW5lIEF0dHJpYnV0LAorICAgICB3ZW5uIG1vZWdsaWNoLiBMZWRpZ2xpY2ggZWluZSBBbGlhcy1NZXRob2RlIGZ1ZXIgU2V0QXR0cigpLgorICAgICAoUXVlcnlBdHRyaWJ1dGUoKSBnaWJ0IGFsc28gdmFsICsgZXR3YWlnZSBPZmZzZXRzL01vZGlmaWVyIHp1cnVlY2spCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIERlbiBnZXNldHp0ZW4gV2VydC4KKworQkVNRVJLVU5HRU46CisgICAgIEJpdHRlIG5pY2h0IGF1ZiBTcGllbGVyIGFud2VuZGVuIQorCitTSUVIRSBBVUNIOg0KKwlRdWVyeUF0dHJpYnV0ZSgpLCBRdWVyeVJlYWxBdHRyaWJ1dGUoKSwgUXVlcnlBdHRyaWJ1dGVPZmZzZXQoKSwNCisJU2V0QXR0cmlidXRlKCksIFNldFJlYWxBdHRyaWJ1dGUoKSwgVXBkYXRlQXR0cmlidXRlcygpLA0KKwlTZXRUaW1lZEF0dHJNb2RpZmllcigpLCBRdWVyeVRpbWVkQXR0ck1vZGlmaWVyKCksIA0KKwlEZWxldGVUaW1lZEF0dHJNb2RpZmllcigpLA0KKwlQX0FUVFJJQlVURVMsIFBfQVRUUklCVVRFU19PRkZTRVRTLCBQX1RJTUVEX0FUVFJfTU9ELA0KKwlQX1hfQVRUUl9NT0QsIFBfTV9BVFRSX01PRCwgL3N0ZC9saXZpbmcvYXR0cmlidXRlcy5jDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK0xhc3QgbW9kaWZpZWQ6IFR1ZSBKdWwgMjcgMjA6MDA6MjAgMjAwNCBieSBNdWFkaWINCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9TZXRTcGVsbEZhdGlndWUgYi9kb2MvbGZ1bi9TZXRTcGVsbEZhdGlndWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM0NjI3YgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL1NldFNwZWxsRmF0aWd1ZQpAQCAtMCwwICsxLDc1IEBACitTZXRTcGVsbEZhdGlndWUKKworRlVOS1RJT046CisgICAgcHVibGljIHZhcmFyZ3MgaW50IFNldFNwZWxsRmF0aWd1ZShpbnQgZHVyYXRpb24sIHN0cmluZyBrZXkpCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3RkL2xpdmluZy9za2lsbHMuYworICAgIC9zdGQvcGxheWVyL3NraWxscy5jCisgICAgL3N5cy9saXZpbmcvc2tpbGxzLmgKKworQVJHVU1FTlRFOgorICAgIGludCBkdXJhdGlvbjogV2llIGxhbmcgc29sbCBkaWUgU3BydWNoZXJtdWVkdW5nIGFuZGF1ZXJuPworICAgIHN0cmluZyBrZXkgIDogRWluZGV1dGlnZXIgTmFtZSBkZXMgU3BydWNoZXMsIGVpbmVyIEdydXBwZSB2b24gU3BydWVjaGVuCisgICAgICAgICAgICAgICAgICBvZGVyIDAgZnVlciBkaWUgZ2xvYmFsZSBTcHJ1Y2hlcm11ZWR1bmcuCisKK0JFU0NIUkVJQlVORzoKKyAgICBEaWVzZSBGdW5rdGlvbiBkaWVudCB6dW0gVmVyd2FsdGVuIHZvbiBpbmRpdmlkdWVsbGVuIFNwcnVjaGVybXVlZHVuZ2VuCisgICAgKFNwZWxsZmF0aWd1ZSwgU3BydWNoc3BlcnJlbikuCisgICAgSGllcm1pdCBsYXNzZW4gc2ljaCB1bmFiaGFlbmdpZ2UgRXJtdWVkdW5nZW4vU3BlcnJlbiBmdWVyIGVpbnplbG5lCisgICAgU3BydWVjaGUgb2RlciBHcnVwcGVuIHZvbiBTcHJ1ZWNoZW4gZ2VzdGFsdGVuLgorCisgICAgPGR1cmF0aW9uPiBpc3QgZGllIFplaXQgKGluIFNla3VuZGVuKSwgd2VsY2hlIGRpZSBTcHJ1Y2hlcm11ZWR1bmcKKyAgICBhbmhhbHRlbiBzb2xsIChuaWNodCBkaWUgRW5kemVpdCkuCisKKyAgICBXaXJkIDxrZXk+IG5pY2h0IGFuZ2VnZWJlbiBvZGVyIGlzdCAwLCB3aXJkIGRpZSBnbG9iYWxlIFNwcnVjaHNwZXJyZQorICAgIGdlc2V0enQgKGlkZW50aXNjaCB6dSBkZXIgUHJvcGVydHkgUF9ORVhUX1NQRUxMX1RJTUUpLCBhbmRlcmVuZmFsbHMgZGllCisgICAgdW50ZXIgPGtleT4gZ2VzcGVpY2hlcnRlIFNwcnVjaGVybXVlZHVuZy4KKyAgICBTZXR6dCBtYW4gZWluZW4gRWludHJhZyBvaG5lIEFuZ2FiZSB2b24gPGtleT4gYmVkZXV0ZXQgZGllcyBkYW1pdCBhdWNoLAorICAgIGRhc3MgZGVyIFdlcnQgdm9uIFBfTkVYVF9TUEVMTF9USU1FIGdlYWVuZGVydCB3aXJkLgorCitSVWVDS0dBQkVXRVJUOgorICAgIC0xICAgIERlciBFaW50cmFnIDxrZXk+IGlzdCBub2NoIG5pY2h0IGFiZ2VsYXVmZW4sIGVzIHd1cmRlIF9rZWluZV8KKyAgICAgICAgICBuZXVlIFNwcnVjaGVybXVlZHVuZy8tU3BlcnJlIGdlc3BlaWNoZXJ0LgorCisgICAgPjAgICAgRWludHJhZyB3dXJkZSBnZXNwZWljaGVydCwgUnVlY2tnYWJld2VydCBpc3QgZGllIFplaXQsIHp1IGRlciBkaWUKKyAgICAgICAgICBTcGVycmUgYWJsYWV1ZnQuCisKK0JFSVNQSUVMRToKKyAgICBFaW4gU3BlbGwgZ2Vob2VydCB6dSBlaW5lciBHcnVwcGUgdm9uIFNwZWxscyBtaXQgZGVtIE5hbWVuICdleHRyYXN1ZXNzJy4KKyAgICBFciBkYXJmIG51ciBhdXNnZWZ1ZWhydCB3ZXJkZW4sIHdlbm4gc2VpdCA1cyBrZWluIGFuZGVyZXIgU3BydWNoIGF1cyBkZXIKKyAgICBHcnVwcGUgYXVzZ2VmdWVocnQgd3VyZGUuCisgICAgaWYgKENhbGN1bGF0ZVNwZWxsU3VjY2VzcyguLi4pID4geCkgeworICAgICAgLy8gU3BlbGxmYXRpZ3VlIHNldHplbiAodW5kIEVyZm9sZyBwcnVlZmVuISkKKyAgICAgIGlmIChvYi0+U2V0U3BlbGxGYXRpZ3VlKDUsICJleHRyYXN1ZXNzIikgPiAtMSkgeworICAgICAgICB0ZWxsX29iamVjdChvYiwgIkR1IGZ1ZXR0ZXJzdCAiICsgZW5lbXktPk5hbWUoV0VOKSArICIgbWl0IGVpbmVtICIKKyAgICAgICAgICAiU3R1ZWNrIHN1ZXNzZXIgU2Nob2tvdG9ydGUuXG4iKTsKKyAgICAgICAgLi4uCisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgLy8gU2F1ZXJlaSEgWnUgZXJtdWVkZXQgZnVlciBkaWVzZW4gU3BydWNoLiBGZWhsZXJtZGVsZHVuZyAuLi4KKyAgICAgIH0KKyAgICB9CisgICAgRGllc2VzIHNldHp0IG5hdHVlcmxpY2ggdm9yYXVzLCBkYXNzIGFsbGUgYW5kZXJlbiBTcHJ1ZWNoZSBkZXIgR3J1cHBlCisgICAgImV4dHJhc3Vlc3MiIGRlbiBnbGVpY2hlbiA8a2V5PiBwcnVlZmVuIHVuZCBzZXR6ZW4uCisgICAgKFdpbGwgbWFuIHZvciBDYWxjdWxhdGVTcGVsbFN1Y2Nlc3MoKSB3aXNzZW4sIG9iIGRlciBTcHJ1Y2ggdWViZXJoYXVwdAorICAgICBnZXdpcmt0IHdlcmRlbiBkdWVyZnRlLCBzb2xsdGUgbWFuIGhpZXJ6dSBkYW5uIENoZWNrU3BlbGxGYXRpZ3VlKCkKKyAgICAgdmVyd2VuZGVuLikKKworQkVNRVJLVU5HRU46CisgICAgRGllIGdlbmF1ZW4gWmVpdGRhdWVybiBrb2VubmVuIHZvbiBTcGllbGVybiBiZWVpbmZsdXNzdCB3ZXJkZW4sIHNpZQorICAgIHVudGVybGllZ2VuIGRlciBqZXdlaWxpZ2VuIEVpbnN0ZWxsdW5nIHZvbiAnc3BydWNoZXJtdWVkdW5nJywgZC5oLiBrb2VubmVuCisgICAgYXVmIHZvbGxlIDJzIGF1ZmdlcnVuZGV0IHdlcmRlbi4gKERpZXMgaXN0IG5pY2h0IGRlciBGYWxsIGJlaSBOUEMuKQorICAgIEF1Y2ggd2VubiBkaWVzZSBGdW5rdGlvbiB6dW0gVmVyd2FsdGVuIHZvbiBiZWxpZWJpZ2VuIFplaXRzcGVycmVuIGdlbnV0enQKKyAgICB3ZXJkZW4ga29lbm5lbiwgYmVzY2hyYWVua3QgZXVjaCBiaXR0ZSBhdWYgU3BydWNoZXJtdWVkdW5nZW4gdW5kIGJlbnV0enQKKyAgICBhbnNvbnN0ZW4gY2hlY2tfYW5kX3VwZGF0ZV90aW1lZF9rZXkoKS4gRmFsbHMgaWhyIGRpZXNiemdsLiB3ZWl0ZXJlL2FuZGVyZQorICAgIFd1ZW5zY2hlIGhhYnQsIHNwcmVjaHQgZGVuL2RpZSBNdWRsaWItRU0gYW4uCisKK1NJRUhFIEFVQ0g6CisgICAgQ2hlY2tTcGVsbEZhdGlndWUoTCksIERlbGV0ZVNwZWxsRmF0aWd1ZShMKQorICAgIFBfTkVYVF9TUEVMTF9USU1FCisgICAgc3BydWNoZXJtdWVkdW5nCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzI3LjAzLjIwMTAsIFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vU2V0U3RvcmFnZVJvb20gYi9kb2MvbGZ1bi9TZXRTdG9yYWdlUm9vbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjU1YTFlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vU2V0U3RvcmFnZVJvb20KQEAgLTAsMCArMSw3NCBAQAorU2V0U3RvcmFnZVJvb20oKQorCitGVU5LVElPTjoKKyAgICAgICAgdm9pZCBTZXRTdG9yYWdlUm9vbShzdHJpbmcgc3RvcmUpOworCitERUZJTklFUlQgSU46CisgICAgICAgIC9zdGQvcm9vbS9zaG9wLmMKKworQVJHVU1FTlRFOgorICAgICAgICBzdG9yZQorICAgICAgICAgIERhdGVpbmFtZSBkZXMgTGFnZXJzLCBpbiBkZW0gZGllIGF1Zmdla2F1ZnRlbiBPYmpla3RlIGF1ZmJld2FocnQKKyAgICAgICAgICB3ZXJkZW4uCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgICAgIGtlaW5lcgorCitCRVNDSFJFSUJVTkc6CisgICAgICAgIE1pdCBkaWVzZXIgRnVua3Rpb24gd2lyZCBkZW0gTGFkZW4gYmVrYW5udCBnZWdlYmVuLCB3ZWxjaGVzIE9iamVrdAorICAgICAgICBhbHMgTGFnZXIgZnVlciBhbmdla2F1ZnRlIE9iamVrdGUgZGllbmVuIHNvbGwuIEplZGVyIExhZGVuIG11c3MKKyAgICAgICAgZXhwbGl6aXQgZWluZW4gZWlnZW5lbiBMYWdlcnJhdW0gc2V0emVuLCBhbnNvbnN0ZW4gd2lyZCBlaW4gCisgICAgICAgIExhdWZ6ZWl0ZmVobGVyIGF1c2dlbG9lc3QgdW5kIGRlciBMYWRlbiBpc3QgbmljaHQgbGFkYmFyLgorICAgICAgICAKKyAgICAgICAgRGFzIFNwZWljaGVyb2JqZWt0IHNvbGx0ZSAvc3RkL3N0b3JlLmMgZXJiZW4sIGRhIGRvcnQgZWluaWdlCisgICAgICAgIEF1ZnJhZXVtZnVua3Rpb25lbiBkZWZpbmllcnQgc2luZC4gRW50c2NoZWlkZW5kIGZ1ZXIgc2VsYmlnZSBzaW5kCisgICAgICAgIGRpZSBQcm9wZXJ0aWVzIFBfTUlOX1NUT0NLIHVuZCBQX1NUT1JFX0NPTlNVTUUuCisKK0JFSVNQSUVMRToKKyAgICAgICAgRGVyIFJhdW0gJ215bGFkZW4uYycga29lbm50ZSBldHdhIHNvIGF1c3NlaGVuOgorICAgICAgICAgIAorICAgICAgICAgIC8vIG15bGFkZW4uYworICAgICAgICAgIGluaGVyaXQgIi9zdGQvc2hvcCI7CisgICAgICAgICAgI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyAgICAgICAgICAKKyAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSB7CisgICAgICAgICAgICA6OmNyZWF0ZSgpOworICAgICAgICAgICAgU2V0UHJvcCguLi4pOyAvLyBCZXNjaHJlaWJ1bmcgd2llIGJlaSBub3JtYWxlbiBSYWV1bWVuCisgICAgICAgICAgICBTZXRTdG9yYWdlUm9vbSgiL2QvYmVpc3BpZWwvbXlzdG9yZSIpOworICAgICAgICAgICAgQWRkRml4ZWRPYmplY3QoIi9pdGVtcy9mYWNrZWwiKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgSW4gZGllc2VtIExhZGVuIHdpcmQgbnVuIGRpZSBTdGFuZGFyZGZhY2tlbCBhbHMgbWVuZ2VubWFlc3NpZyAKKyAgICAgICAgdW5iZWdyZW56dGVyIEFydGlrZWwgdmVya2F1ZnQuCisKKyAgICAgICAgRGVyIHp1Z2Vob2VyaWdlIExhZ2VycmF1bSAnbXlzdG9yZS5jJyBrYW5uIGRhbm4gaW0gZWluZmFjaHN0ZW4gRmFsbAorICAgICAgICBzbyBhdXNzZWhlbjoKKyAgICAgICAgICAKKyAgICAgICAgICAvLyBteXN0b3JlLmMKKyAgICAgICAgICBpbmhlcml0ICIvc3RkL3N0b3JlIjsKKyAgICAgICAgICAjaW5jbHVkZSA8cm9vbXMuaD4gIC8vIEZ1ZXIgQWRkSXRlbS1Lb25zdGFudGVuCisgICAgICAgICAgCisgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkgeworICAgICAgICAgICAgOjpjcmVhdGUoKTsKKyAgICAgICAgICAgIC8vIEtFSU5FIHdlaXRlcmVuIEJlc2NocmVpYnVuZ2VuIQorICAgICAgICAgICAgLy8gMS4gZXJidCBkZXIgU3BlaWNoZXIga2VpbmUgQmVzY2hyZWlidW5nc21vZHVsZSwKKyAgICAgICAgICAgIC8vIDIuIHNvbGxlbiBkYSBlaCBudXIgU2FjaGVuIHVuZCBrZWluZSBTcGllbGVyIHJlaW4hCisgICAgICAgICAgICBBZGRJdGVtKCIvaXRlbXMvc2NoYXVmZWwiLCBSRUZSRVNIX1JFTU9WRSk7CisgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgRGVyIExhZGVuIHZlcmthdWZ0IG51biBhdWNoIFNjaGF1ZmVsbiwgamVkb2NoIG51ciBlaW5lIHBybyBSZXNldC4KKworSElOV0VJU0U6ICAgICAgICAKKyAgICAgICAgRnVlciBzdGFuZGFyZG1hZXNzaWcgdmVya2F1ZnRlIFdhcmVuIGJlYWNodGUgbWFuIGRlbiBVbnRlcnNjaGllZCAKKyAgICAgICAgendpc2NoZW4gZGVuIEZ1bmt0aW9uZW4gQWRkSXRlbSgpIHVuZCBBZGRGaXhlZE9iamVjdCgpLgorICAgICAgICBEaWUgZXJzdGdlbmFubnRlIEZ1bmt0aW9uIGlzdCBpbSBMYWdlciB6dSB2ZXJ3ZW5kZW4sIGxldHp0ZXJlIGplZG9jaAorICAgICAgICBpbSBMYWRlbi4KKworU0lFSEUgQVVDSDoKKyAgICAgICAgQWxsZ2VtZWluZXM6ICBsYWRlbgorICAgICAgICBGdW5rdGlvbmVuOiAgIEFkZEl0ZW0oTCksIEFkZEZpeGVkT2JqZWN0KEwpLCBSZW1vdmVGaXhlZE9iamVjdChMKSAKKyAgICAgICAgQmFzaXNvYmpla3RlOiAvc3RkL3N0b3JlLmMKKyAgICAgICAgUHJvcGVydGllczogICBQX01JTl9TVE9DSywgUF9TVE9SRV9DT05TVU1FCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IDE5LUp1bi0yMDE1LCBBcmF0aG9ybgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vU2V0VGltZWRBdHRyTW9kaWZpZXIgYi9kb2MvbGZ1bi9TZXRUaW1lZEF0dHJNb2RpZmllcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODA0ODIzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vU2V0VGltZWRBdHRyTW9kaWZpZXIKQEAgLTAsMCArMSw5MiBAQAorU2V0VGltZWRBdHRyTW9kaWZpZXIoKQorRlVOS1RJT046CisgICAgIGludCBTZXRUaW1lZEF0dHJNb2RpZmllcihzdHJpbmcga2V5LCBtYXBwaW5nIG1vZGlmaWVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRkYXRlZCwgb2JqZWN0IGRlcGVuZGVudCwgbWl4ZWQgbm90aWZ5KSAKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC9saXZpbmcvYXR0cmlidXRlcy5jCisKK0FSR1VNRU5URToKKyAgICAga2V5CS0JaW4gUF9USU1FRF9BVFRSX01PRCB2b3J6dW5laG1lbmRlciBvZGVyIHp1IAorICAgICAgICAgICAgICAgICAgICAgICAgYWVuZGVybmRlciBFaW50cmFnDQorICAgICBtb2RpZmllciAgIC0gICAgICAgTWFwcGluZyBtaXQgZGVuIEF0dHJpYnV0dmVyYWVuZGVydW5nZW4NCisgICAgIG91dGRhdGVkICAgLSAgICAgICBaZWl0cHVua3QgenUgZGVtIGRpZSBBdHRyaWJ1dHZlcmFlbmRlcnVuZ2VuDQorICAgICAgICAgICAgICAgICAgICAgICAgYWJsYXVmZW4gc29sbGVuIGluIFNla3VuZGVuIHNlaXQgZGVtDQorICAgICAgICAgICAgICAgICAgICAgICAgMS4gSmFuIDE5NzAsIDAuMDowIEdNVCBvZGVyIDANCisgICAgIGRlcGVuZGVudCAgLSAgICAgICBPYmpla3QgZGVzc2VuIEV4aXN0ZW56IGVpbmUgQmVkaW5ndW5nIGZ1ZXIgZGllDQorICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXR2ZXJhZW5kZXJ1bmcgc2VpbiBzb2xsIG9kZXIgMA0KKyAgICAgbm90aWZ5ICAgICAtICAgICAgIE9iamVrdCBvZGVyIEZpbGUgZGFzIG1pdHRlbHMgCisgICAgICAgICAgICAgICAgICAgICAgICBOb3RpZnlUaW1lZEF0dHJNb2RFeHBpcmVkIHVlYmVyDQorICAgICAgICAgICAgICAgICAgICAgICAgZGVuIEF0dHJpYnV0YWJsYXVmIGluZm9ybWllcnQgd2VyZGVuIHNvbGwNCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGVyIHp1IGtleSBnZWhvZXJlbmRlIEVpbnRyYWcgd2lyZCBpbiBQX1RJTUVEX0FUVFJfTU9EIGFuZ2VsZWd0IG9kZXINCisgICAgIG1vZGlmaXppZXJ0IHVuZCB1cGRhdGVfbWF4X3NwX2FuZF9ocCBhdWZnZXJ1ZmVuLg0KKyAgICAgRXMgZW1wZmllaGx0IHNpY2ggYXVmIGRpZSBFaW5kZXV0aWdrZWl0IGRlcyBzdHJpbmctUGFyYW1ldGVycyBrZXkKKyAgICAgYmVzb25kZXJlcyBBdWdlbm1lcmsgenUgbGVnZW4uCisNCisgICAgIFVudGVyIGRlbSBLZXkga2V5IHdpcmQgaW4gUF9USU1FRF9BVFRSX01PRCBlaW4gRWludHJhZyB2b3JnZW5vbW1lbiwNCisgICAgIHdlbGNoZXIgZGllIEF0dHJpYnV0ZSBkZXMgTGl2aW5ncyB1bSBkaWUgaW4gbW9kaWZpZXIgc3RlaGVuZGVuIE9mZnNldHMNCisgICAgIHZlcmFlbmRlcnQuDQorDQorICAgICBEaWVzZSBWZXJhZW5kZXJ1bmcgaXN0IHNvbGFuZ2UgYWt0aXYgYmlzIGVudHdlZGVyIGRpZSBpbiBvdXRkYXRlZA0KKyAgICAgc3RlaGVuZGUgWmVpdCB1ZWJlcnNjaHJpdHRlbiBpc3Qgb2RlciBkYXMgaW4gZGVwZW5kZW50IHVlYmVyZ2ViZW5lDQorICAgICBPYmpla3QgbmljaHQgbWVociBleGlzdGllcnQuDQorICAgICBTaW5kIGJlaWRlIEFyZ3VtZW50ZSAwIHNvIGxhZXVmdCBkaWUgQXR0cmlidXR2ZXJhZW5kZXJ1bmcgbmljaHQgYWINCisgICAgIHVuZCBrYW5uIGR1cmNoIERlbGV0ZVRpbWVkQXR0ck1vZGlmaWVyIGdlbG9lc2NodCB3ZXJkZW4uDQorICAgICBMYWV1ZnQgZGllIEF0dHJpYnV0dmVyYWVuZGVydW5nIGFiLCBzbyB3aXJkIGRlciBpbiBub3RpZnkgYW5nZWdlYmVuZQ0KKyAgICAgRW1wZmFlbmdlciBtaXR0ZWxzIEF1ZnJ1ZiBOb3RpZnlUaW1lZEF0dHJNb2RFeHBpcmVkIGRhdm9uIAorICAgICBiZW5hY2hyaWNodGlndC4NCisgICAgIERlciBGdW5rdGlvbiBOb3RpZnlUaW1lZEF0dHJNb2RFeHBpcmVkIHdpcmQgYWxzIEFyZ3VtZW50IGRlciBrZXkNCisgICAgIGRlciBhYmdlbGF1ZmVuZW4gQXR0cmlidXR2ZXJhZW5kZXJ1bmcgdWViZXJnZWJlbi4NCisNCitCRUlTUElFTEU6DQorICAgICBFaW4gTlBDIGthbm4gZWluZW4gU3BpZWxlciBhdWYgZGllIGZvbGdlbmRlIFdlaXNlIHNvbGFuZ2UgZGllDQorICAgICBBdHRyaWJ1dGUgdW0gZWlucyBoZXJhYnNldHplbiBiaXMgZW50d2VkZXIgZWluZSBTdHVuZGUgdmVyc3RyaWNoZW4NCisgICAgIGlzdCBvZGVyIGRlciBOUEMgbmljaHQgbWVociBleGlzdGllcnQgenVtIEJlaXNwaWVsIHdlaWwgZXIgZ2V0b2V0ZXQNCisgICAgIHd1cmRlLg0KKw0KKyAgICAgICBwbGF5ZXItPlNldFRpbWVkQXR0ck1vZGlmaWVyKCBwbGF5ZXItPnF1ZXJ5X3JlYWxfbmFtZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoW0FfU1RSOi0xLEFfSU5UOi0xLEFfREVYOi0xLEFfQ09OOi0xXSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUoKSszNjAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX29iamVjdCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX29iamVjdCgpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOw0KKw0KKyAgICAgV2lsbCBkZXIgTlBDIG51biBub2NoIGRhcmF1ZiByZWFnaWVyZW4sIGRhc3MgZGllIEF0dHJpYnV0bW9kaWZpa2F0aW9uDQorICAgICBkdXJjaCBUaW1lb3V0IGFiZ2VsYXVmZW4gaXN0LCBzbyBrb2VubnRlIGRpZXMgZm9sZ2VuZGVybWFzc2VuIGdlc2NoZWhlbi4NCisNCisgICAgICAgdm9pZCBOb3RpZnlUaW1lZEF0dHJNb2RFeHBpcmVkKHN0cmluZyBzdHIpDQorICAgICAgIHsNCisgICAgICAgICAgIC8vIERpZSBGdW5rdGlvbiB3aXJkIGF1cyBkZW0gTGViZXdlc2VuIGdlcnVmZW4sIGluIHdlbGNoZW0gZGVyIE1vZAorICAgICAgICAgICAvLyBnZXJhZGUgYWJnZWxhdWZlbiBpc3QuIEFsc28gTWVsZHVuZ3NhdXNnYWJlIGFuCisgICAgICAgICAgIC8vIHByZXZpb3VzX29iamVjdCgpLgorICAgICAgICAgICB0ZWxsX29iamVjdChwcmV2aW91c19vYmplY3QoKQorICAgICAgICAgICAgICAgLCJEYSBoYXN0IER1IGFiZXIgbm9jaG1hbCBHbHVlY2sgZ2VoYWJ0LlxuIik7DQorICAgICAgIH0NCisNCisNCitSVWVDS0dBQkVXRVJUOg0KKyAgICAgVEFUVFJfSU5WQUxJRF9BUkdTICAgICAgLSAgICAgSW0gRmFsbGUgZWluZXMgZmVobGVuZGVuIGtleS1Bcmd1bWVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlaW5lcyBmZWhsZW5kZW4gbW9kaWZpZXItQXJndW1lbnRzIG9kZXINCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVpbmVzIGJlcmVpdHMgYWJnZWxhdWZlbmVuDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRkYXRldC1Bcmd1bWVudHMNCisgICAgIFRBVFRSX09LICAgICAgICAgICAgICAgIC0gICAgIEltIEVyZm9sZ3NmYWxsDQorDQorICAgICBEaWUgUnVlY2tnYWJld2VydGUgc2luZCBpbiAvc3lzL2xpdmluZy9hdHRyaWJ1dGVzLmggZGVmaW5pZXJ0Lg0KKworU0lFSEUgQVVDSDoNCisgICAgIEF0dHJpYnV0ZTogIFF1ZXJ5QXR0cmlidXRlKCksIFNldEF0dHJpYnV0ZSgpDQorICAgICAgICAgICAgICAgICBTZXRSZWFsQXR0cmlidXRlKCksIFF1ZXJ5UmVhbEF0dHJpYnV0ZSgpLA0KKyAgICAgICAgICAgICAgICAgUXVlcnlBdHRyaWJ1dGVPZmZzZXQoKSwNCisgICAgICAgICAgICAgICAgIFVwZGF0ZUF0dHJpYnV0ZXMoKQ0KKyAgICAgTWV0aG9kZW46ICAgUXVlcnlUaW1lZEF0dHJNb2RpZmllcigpLCBEZWxldGVUaW1lZEF0dHJNb2RpZmllcigpDQorICAgICBDYWxsYmFjazogICBOb3RpZnlUaW1lZEF0dHJNb2RFeHBpcmVkKCkNCisgICAgIFByb3BlcnRpZXM6IFBfQVRUUklCVVRFUywgUF9BVFRSSUJVVEVTX09GRlNFVFMNCisJCSBQX1hfQVRUUl9NT0QsIFBfTV9BVFRSX01PRA0KKwkJIFBfVElNRURfQVRUUl9NT0QNCisgICAgIFNvbnN0aWdlczogIC9zdGQvbGl2aW5nL2F0dHJpYnV0ZXMuYw0KKworTEVUWlRFIEFlbmRlcnVuZzoKKzE1LjAyLjIwMDksIFplc3N0cmEKKworCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9TaG93RG9vcnMgYi9kb2MvbGZ1bi9TaG93RG9vcnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNkMzZiMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL1Nob3dEb29ycwpAQCAtMCwwICsxLDIzIEBACitTaG93RG9vcnMoKQorCitGVU5LVElPTjoKKwl2b2lkIFNob3dEb29ycygpCisKK0FSR1VNRU5URToKKwlLZWluZS4KKworQkVTQ0hSRUlCVU5HOgorCVplaWd0IGFsbGUgU2VoZXJ0b3IgYW4sIGRpZSBkZXIgU2VoZXIgKHRoaXNfcGxheWVyKCkpIHNjaG9uIGtlbm50LgorCUZhbGxzIGluIHNlaW5lciBVbWdlYnVuZyBlaW4gVG9yIHN0ZWh0LCBzbyB3aXJkIGRpZXNlcyBlaW5nZWtsYW1tZXJ0LgorCitSVUVDS0dBQkVXRVJUOgorCUtlaW5lci4KKworQkVNRVJLVU5HRU46CisgICAgRGllc2UgRnVua3Rpb24gd2lyZCB2b24gL2Qvc2VoZXIvcG9ydGFsZS9zZWhlcnRvcm1hc3RlciBkZWZpbmllcnQuCisKK0JFSVNQSUVMRToKKyAgICAvZC9zZWhlci9wb3J0YWxlL3NlaGVydG9ybWFzdGVyLT5TaG93RG9vcnMoKQorCitTSUVIRSBBVUNIOgorICAgIERpc2NvdmVyRG9vciwgRG9vcklzS25vd24sIFRlbGVwb3J0LCBHZXREb29yc01hcHBpbmcKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1Nob3dQcm9wTGlzdCBiL2RvYy9sZnVuL1Nob3dQcm9wTGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGJjNGNiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vU2hvd1Byb3BMaXN0CkBAIC0wLDAgKzEsNDkgQEAKK1Nob3dQcm9wTGlzdCgpCisKK0ZVTktUSU9OOgorICAgICB2b2lkIFNob3dQcm9wTGlzdChzdHJpbmcgKnByb3BzKTsKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL3RoaW5nL3V0aWwuYworCitBUkdVTUVOVEU6CisgICAgIHByb3BzCisgICAgICAgICAgQXJyYXkgdm9uIFN0cmluZ3MgbWl0IGRlbiBOYW1lbiBkZXIgUHJvcGVydGllcywgZGllIGF1c2dlZ2ViZW4KKyAgICAgICAgICB3ZXJkZW4gc29sbGVuLgorCitCRVNDSFJFSUJVTkc6CisgICAgIEdpYnQgZGllIEluaGFsdGUgZGVyIGluIHByb3BzIGFuZ2VnZWJlbmVuIFByb3BlcnRpZXMgYXVzLgorCitSVWVDS0dBQkVXRVJUOgorICAgICBrZWluZXIKKworQkVJU1BJRUxFOgorICAgICBTZWkgdGVzdC5jIGZvbGdlbmRlcyBQcm9ncmFtbToKKworICAgICBpbmhlcml0ICJzdGQvdGhpbmciOworICAgICBpbmhlcml0ICJzdGQvdGhpbmcvdXRpbCI7CisKKyAgICAgY3JlYXRlKCkgeworICAgICAgIDo6Y3JlYXRlKCk7CisKKyAgICAgICBTZXRQcm9wKFBfU0hPUlQsICJLdXJ6Iik7CisgICAgICAgU2V0UHJvcChQX05BTUUsICh7ICJOYW1lIiwgIk5hbWVucyIsICJOYW1lbiIsICJOYW1lbiIgfSkpOworICAgICAgIFNldFByb3AoIm1lIiwgdGhpc19vYmplY3QoKSApOworICAgICB9CisKKyAgICAgTWl0IHhjYWxsIHRlc3QtPlNob3dQcm9wTGlzdCggKHsgUF9TSE9SVCwgUF9OQU1FLCAibWUiIH0pICk7IGVyaGllbHRlCisgICAgIG1hbiBkYW5uIGZvbGdlbmRlIEF1c2dhYmU6CisKKyAgICAgKnNob3J0OiAiS3VyeiIKKyAgICAgKm5hbWU6ICh7ICJOYW1lIiwgIk5hbWVucyIsICJOYW1lbiIsICJOYW1lbiIgfSkKKyAgICAgKm1lOiBPQkooL3BsYXllcnMvd2FyZ29uL3Rlc3QjMTIzNDUpCisKK0JFTUVSS1VOR0VOOgorICAgICBNaXQgZGVtIEJlZmVobCB4cHJvcHMgZGVzIE1HdG9vbHMgbGFzc2VuIHNpY2ggdWVicmlnZW5zIHNhZW10bGljaGUKKyAgICAgUHJvcGVydGllcyBlaW5lcyBPYmpla3RlIGF1ZiBlaW5lbiBTY2hsYWcgYXVzZ2ViZW4uCisKK1NJRUhFIEFVQ0g6CisgICAgIC9zdGQvdGluZy91dGlsLmMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogV2VkIE1heSA4IDEwOjI1OjI2IDE5OTYgYnkgV2FyZ29uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9Ta2lsbFJlc1RyYW5zZmVyIGIvZG9jL2xmdW4vU2tpbGxSZXNUcmFuc2ZlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTgzZWVhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vU2tpbGxSZXNUcmFuc2ZlcgpAQCAtMCwwICsxLDI4IEBACitTa2lsbFJlc1RyYW5zZmVyKCkKKworRlVOS1RJT046CisgICAgIHByb3RlY3RlZCB2b2lkIFNraWxsUmVzVHJhbnNmZXIobWFwcGluZyBmcm9tX00sIG1hcHBpbmcgdG9fTSkKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL2xpdmluZy9za2lsbF91dGlscworCitBUkdVTUVOVEU6CisgICAgIG1hcHBpbmcgZnJvbV9NOiBNYXBwaW5nIG1pdCB6dSBrb3BpZXJlbmRlbiBXZXJ0ZW4KKyAgICAgbWFwcGluZyB0b19NOiAgIFppZWxtYXBwaW5nCisKK0JFU0NIUkVJQlVORzoKKyAgICAgSW50ZXJuZSBNZXRob2RlLCBkaWUgekIgKCEpIHdhZWhyZW5kIGRlciBBdXNmdWVocnVuZyB2b24gQXR0YWNrKCkgZHVyY2gKKyAgICAgU2tpbGxzIG9kZXIgUF9UTVBfQVRUQUNLX01PRCBnZWFlbmRlcnRlIFdlcnRlIHNlbGVrdGllcnQgaW4gZGFzCisgICAgIEhhdXB0YW5ncmlmZnNtYXBwaW5nIHVlYmVydHJhZWd0LgorCisgICAgIERlcnplaXQgd2VyZGVuIGZvbGdlbmRlIFdlcnRlIGtvcGllcnQ6CisgICAgIFNJX1NLSUxMREFNQUdFLCBTSV9TS0lMTERBTUFHRV9NU0csIFNJX1NLSUxMREFNQUdFX01TRzIsCisgICAgIFNJX1NLSUxMREFNQUdFX1RZUEUsIFNJX1NQRUxMCisKK0JFTUVSS1VOR0VOOgorICAgICAqIHdpcmQgYW4gbWVocmVyZW4gU3RlbGxlbiwgbmljaHQgbnVyIGRlciBsaXZpbmcvY29tYmF0IHZlcndlbmRldAorCitTSUVIRSBBVUNIOgorICAgICBQX1RNUF9BVFRBQ0tfTU9ELCBVc2VTa2lsbCAoV2FmZmVuZmFlaGlna2VpdGVuKQorCisxOC5KdWwgMjAxNCBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vU3BlbGxBdHRhY2sgYi9kb2MvbGZ1bi9TcGVsbEF0dGFjawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTI0ZmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vU3BlbGxBdHRhY2sKQEAgLTAsMCArMSw3MSBAQAorU3BlbGxBdHRhY2soKQorCitGVU5LVElPTjoKKyAgICAgICAgdm9pZCBTcGVsbEF0dGFjayhvYmplY3QgZW5lbXkpCisKK0FSR1VNRU5URToKKyAgICAgICAgZW5lbXk6IERlciBGZWluZC4KKworQkVTQ0hSRUlCVU5HOgorICAgICAgICBEaWVzZSBGdW5rdGlvbiB3aXJkIGluIGplZGVtIEhlYXJ0YmVhdCBlaW5lcyBOUENzIGF1c2dlZnVlaHJ0LAorICAgICAgICBmYWxscyBuaWNodCBQX0RJU0FCTEVfQVRUQUNLIGdlc2V0enQgaXN0IChQYXJhbHlzZSkuCisgICAgICAgIFN0YW5kYXJkbWFlc3NpZyB0dXQgZGllc2UgRnVua3Rpb24gbmljaHRzLCBhYmVyIG1hbiBrYW5uIHNpZQorICAgICAgICB1ZWJlcnNjaHJlaWJlbiwgZGFtaXQgaW4gamVkZW0gSGVhcnRiZWF0IEFuZ3JpZmZlIG1pdCBTcGVsbHMKKyAgICAgICAgYXVzZ2VmdWVocnQgd2VyZGVuLgorCisgICAgICAgIE1hbiBzb2xsdGUgaGllcmJlaSBlaW4gcmFuZG9tKCkgZWluYmF1ZW4sIGRhbWl0IGRlciBOUEMgbmljaHQKKyAgICAgICAgaW4gamVkZW0gSGVhcnRiZWF0IGF1Y2ggd2lya2xpY2ggZWluZW4gQW5ncmlmZiBhdXNmdWVocnQuCisgICAgICAgIEF1c3NlcmRlbSBzb2xsdGUgbWFuIGF1Y2ggZnVlciBldmVudHVlbGxlIEF1c2dhYmVuIHNvcmdlbi4KKworUlVFQ0tHQUJFV0VSVDoKKyAgICAgICAgS2VpbmVyLgorCitCRU1FUktVTkc6CisgICAgICAgIERpZSBBdHRhY2tDaGF0cywgZGllIG1pdHRlbHMgU2V0QXR0YWNrQ2hhdHMgZ2VzZXR6dCB3ZXJkZW4KKyAgICAgICAga29lbm5lbiwgbWFjaHQgaW0gR3J1bmRlIG5pY2h0cyBhbmRlcmVzLCBhYmVyIENoYXRzIHNpbmQgaGFsdAorICAgICAgICBrZWluZSBBbmdyaWZmZS4gOi0pCisKK0JFSVNQSUVMRToKKyAgICAgICAgSW0gR3J1bmRlIGlzdCBkaWVzZXMgc2ltcGxlIEJlaXNwaWVsIGVpbmUgTmFjaGJpbGR1bmcgdm9uCisgICAgICAgIEF0dGFjay1DaGF0cyB1bmQgc29sbCBkZW1lbnRzcHJlY2hlbmQgbnVyIGRlciBBbnNjaGF1dW5nIGRpZW5lbi4KKworICAgICAgICB2b2lkIFNwZWxsQXR0YWNrKG9iamVjdCBlbmVteSkgCisgICAgICAgIHsKKyAgICAgICAgICAvLyBtaXQgODAlIFdhaHJzY2hlaW5saWNoa2VpdCB3aXJkIG5pY2h0cyBnZW1hY2h0LgorICAgICAgICAgIHN3aXRjaChyYW5kb20oNSkpCisgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSAwOiAKKyAgICAgICAgICAgICAgd3JpdGUoIkRlciBPcmsgdHJpdHQgRGlyIGluIGRlbiBIaW50ZXJuLlxuIik7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGNhc2UgMTogCisgICAgICAgICAgICAgIHdyaXRlKCJEZXIgT3JrIGJydWVsbHQ6IExlYmVuZCBrb21tc3QgRHUgaGllciBuaWNodCByYXVzIVxuIik7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgd3JpdGUoIkRlciBPcmsgYmx1dGV0IHNjaG9uIGF1cyBtZWhyZXJlbiBXdW5kZW4uXG4iKTsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICB3cml0ZShrbmlyc2NoKGVuZW15KSk7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdHJpbmcga25pcnNjaChvYmplY3QgZW5lbXkpCisgICAgICAgIHsKKyAgICAgICAgICAgaWYgKG9iamVjdHAoZW5lbXkpKQorICAgICAgICAgICAgIGhlbG0gPSBlbmVteS0+UXVlcnlBcm1vdXJCeVR5cGUoQVRfSEVMTUVUKTsKKyAgICAgICAgICAgaWYgKG9iamVjdHAoaGVsbSkpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICBoZWxtLT5EYW1hZ2UoMSk7CisgICAgICAgICAgICAgcmV0dXJuICJEZXIgT3JrIGJlc2NoYWVkaWd0IERlaW5lbiBIZWxtIVxuIjsKKyAgICAgICAgICAgfQorICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgcmV0dXJuICIiOyAvLyBrZWluZSBNZWxkdW5nCisgICAgICAgIH0KKworU0lFSEUgQVVDSDoKKyAgICAgICAgIkF0dGFjayIsICJTZXRBdHRhY2tDaGF0cyIsIC9zdGQvbnBjL2NvbWJhdC5jCisKK0xFVFpURSBBRU5ERVJVTkc6CisgRG9uLCAyNy4wMi4yMDAzLCAxMjo1MDowMCB2b24gSGlydWRvCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9TcGVsbERlZmVuZCBiL2RvYy9sZnVuL1NwZWxsRGVmZW5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NTM3ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9TcGVsbERlZmVuZApAQCAtMCwwICsxLDQzIEBACitTcGVsbERlZmVuZCgpCitGVU5LVElPTjoKKyAgICAgcHVibGljIGludCBTcGVsbERlZmVuZChvYmplY3QgY2FzdGVyLG1hcHBpbmcgc2luZm8pOworCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvbGl2aW5nL2NvbWJhdC5jCisKK0FSR1VNRU5URToKKyAgICAgb2JqZWN0IGNhc3RlcgktIEdlZ25lcgorICAgICBtYXBwaW5nIHNpbmZvCS0gWnVzYXR6aW5mb3JtYXRpb25lbiB6dW0gU3BlbGwKKworQkVTQ0hSRUlCVU5HOgorICAgICBVZWJlciBkZW4gU2tpbGwgU0tfU1BFTExfREVGRU5EIG1pdCBkZW4gQXVmcnVmcGFyYW1ldGVybgorICAgICAgIFNJX0VORU1ZICAgIDogPGNhc3Rlcj4KKyAgICAgdW5kCisgICAgICAgU0lfU0tJTExBUkcgOiA8c2luZm8+CisgICAgIHdpcmQgZWluZSBBYndlaHJjaGFuY2UgaW4gMC4wMSUtU2Nocml0dGVuIGZ1ZXIgZWluZW4KKyAgICAgU3BlbGwgZXJtaXR0ZWx0LCBhbHNvIDAlIC0gMTAwJSBiencuIGFscyBSdWVja2dhYmV3ZXJ0CisgICAgIDAgLSAxMDAwMC4KKyAgICAgCisgICAgIFdlaXRlcmhpbiB3aXJkIGF1dG9tYXRpc2NoIFBfTUFHSUNfUkVTSVNUQU5DRV9PRkZTRVQgdW5kIGRlciBTa2lsbAorICAgICBTS19TUEVMTF9ERUZFTkQgYmVydWVja3NpY2h0aWd0LgorCitSVWVDS0dBQkVXRVJUOgorICAgICBEaWUgQWJ3ZWhyY2hhbmNlIGluIDAuMDElLVNjaHJpdHRlbi4KKyAgICAgCisgICAgIEZ1ZXIgU3BpZWxlciB3aXJkIGRpZXNlciBSdWVja2dhYmV3ZXJ0IGF1ZiAzMzMzIG1heGltYWwsIGFsc28gMzMsMzMlCisgICAgIEFid2Vocm1vZWdsaWNoa2VpdCBiZXNjaHJhZW5rdC4KKworQkVNRVJLVU5HRU46CisgICAgIERpZSBTcGVsbGJvb2tzIG11ZXNzZW4gc2VsYnN0IGF1ZiBkaWUgQXVzd2VydHVuZyBkaWVzZXIgRnVua3Rpb24KKyAgICAgYWNodGVuISBEaWVzIGdlc2NoaWVodCBudXIgaW0gRmFsbGUgdm9uIFRyeUdsb2JhbEF0dGFja1NwZWxsKCkKKyAgICAgdW5kIGJlaSBTcGVsbHMgZnVlciBOUENzIG1pdHRlbHMgUF9TUEVMTFMgYXV0b21hdGlzY2ghCisKKyAgICAgQml0dGUgYmVpIE5QQ3MgbmljaHQgcGF1c2NoYWwgMTAwJSAvIDEwMDAwIHp1cnVlY2tnZWJlbi4gRGFua2UuCisKK1NJRUhFIEFVQ0g6CisgICAgIFZlcndhbmR0OiAgICAgUF9NQUdJQ19SRVNJU1RBTkNFX09GRlNFVAorICAgICBBZWhubGljaDogICAgIFBfTk9NQUdJQworICAgICBHZW5lcmVsbDogICAgIFRyeUdsb2JhbEF0dGFja1NwZWxsLCAvc3RkL3NwZWxsYm9vay5jCisgICAgIFNvbnN0aWdlczogICAgVXNlU2tpbGwsIFNLX1NQRUxMX0RFRkVORAorCisyOS5EZXogMjAwNyBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vU3BlbGxJbmZvcm0gYi9kb2MvbGZ1bi9TcGVsbEluZm9ybQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjliMjAxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vU3BlbGxJbmZvcm0KQEAgLTAsMCArMSwzMSBAQAorU3BlbGxJbmZvcm0KKworRlVOS1RJT046CisgICAgICAgIHZvaWQgU3BlbGxJbmZvcm0oY2FzdGVyLHNwZWxsLHNpbmZvKTsKKworREVGSU5JRVJUIElOOgorICAgICAgICBzZWxiZXIgenUgZGVmaW5pZXJlbgorCitBUkdVTUVOVEU6CisgICAgICAgIHBsCisgICAgICAgICAgRGFzIExlYmV3ZXNlbiwgZGFzIGVyZm9sZ3JlaWNoIGdlemF1YmVydCBoYXQuCisgICAgICAgIHNwZWxsCisgICAgICAgICAgRGVyIE5hbWUgZGVzIGdlemF1YmVydGVuIFNwZWxscworICAgICAgICBzaW5mbworICAgICAgICAgIERhcyBrb21wbGV0dGUgU3BlbGxtYXBwaW5nIGRlcyBnZXphdWJlcnRlbiBTcGVsbHMKKworQkVTQ0hSRUlCVU5HOgorICAgICAgICBEaWVzZSBGdW5rdGlvbiB3aXJkIHZvbSBTcGVsbGJ1Y2ggZWluZXIgR2lsZGUgaW4gZGVyIFVtZ2VidW5nCisgICAgICAgIChFbnZpcm9ubWVudCkgZWluZXMgTGViZXdlc2VucyBhdWZnZXJ1ZmVuLCB3ZW5uIGltbWVyIGRhcyBMZWJld2VzZW4KKyAgICAgICAgZWluZW4gU3BlbGwgX2VyZm9sZ3JlaWNoXyBnZXphdWJlcnQgaGF0LgorICAgICAgICBCZW1lcmt1bmc6IEJpdHRlIHZlcm1laWRlbiwgYXVmd2FlbmRpZ2UgU2FjaGVuIGluIGRlciBGdW5rdGlvbiB6dQorICAgICAgICBtYWNoZW4sIGRhIHNvbnN0IHUuVS4gZGVzd2VnZW4gR2lsZGVuIGFuZmFuZ2VuIHp1IGJ1Z2dlbi4gRmFsbHMgZXMKKyAgICAgICAgc2VpbiBtdXNzLCBtYWNodCBkYW5uIGxpZWJlciBlaW5lbiBjYWxsX291dCBtaXQgMnMgV2FydGV6ZWl0LgorCitSVWVDS0dBQkVXRVJUOgorICAgICAgICBrZWluZXIKKworU0lFSEUgQVVDSDoKKyAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisxNi4wNC4yMDA3LCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9TdGFydCBiL2RvYy9sZnVuL1N0YXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZjYzZWYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9TdGFydApAQCAtMCwwICsxLDI1IEBACitTdGFydCgpCisKK0ZVTktUSU9OOgorICAgICB2YXJhcmdzIHZvaWQgU3RhcnQoaW50IHBvcyk7CisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC90cmFuc3BvcnQuYworCitBUkdVTUVOVEU6CisgICAgIHBvcworICAgICAgICAgIEZhaHJwbGFuc3RhdGlvbiwgYW4gZGVyIGJlZ29ubmVuIHdlcmRlbiBzb2xsLgorCitCRVNDSFJFSUJVTkc6CisgICAgIERpZXNlIEZ1bmt0aW9uIHNjaGlja3QgZGVuIFRyYW5zcG9ydGVyIGF1ZiBkaWUgU3RyZWNrZS4gRGFiZWkgYmVnaW5udAorICAgICBkZXIgV2VnIGFuIGRlciBtaXQgcG9zIGJlemVpY2huZXRlbiBTdGVsbGUgaW0gRmFocnBsYW4uIERlZmF1bHQgaXN0IDAsCisgICAgIGQuaC4gZGVyIFRyYW5zcG9ydGVyIGJlZ2lubnQgc2VpbmVuIFdlZyBhbiBkZXIgZXJzdGVuIEZhaHJwbGFucG9zaXRpb24uCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIGtlaW5lcgorCitTSUVIRSBBVUNIOgorICAgICBIYWx0KCksIC9zdGQvdHJhbnNwb3J0LmMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogV2VkIE1heSA4IDEwOjI1OjMwIDE5OTYgYnkgV2FyZ29uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9TdG9wSHVudEZvciBiL2RvYy9sZnVuL1N0b3BIdW50Rm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczOGI5MjAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9TdG9wSHVudEZvcgpAQCAtMCwwICsxLDUyIEBACitTdG9wSHVudEZvcigpCisKK0ZVTktUSU9OOgorICB2YXJhcmdzIGludCBTdG9wSHVudEZvcihvYmplY3QgYXJnLGludCBzaWxlbnQpOworCitERUZJTklFUlQgSU46CisgIC9zdGQvbGl2aW5nL2NvbWJhdC5jCisKK0FSR1VNRU5URToKKyAgYXJnCisgICAgRGVyIEdlZ25lciwgd2VsY2hlciBuaWNodCBtZWhyIGJla2FlbXBmdCB3ZXJkZW4gc29sbC4KKyAgc2lsZW50CisgICAgRmxhZywgd2VsY2hlcyBnZXNldHp0IGFuemVpZ3QsIGRhc3MgZGllIGJlaWRlbiBFeC1TdHJlaXRoYWVobmUKKyAgICB1ZWJlciBkYXMgZWluc2VpdGlnZSBGcmllZGVuc2FuZ2Vib3QgbmljaHQgaW5mb3JtaWVydCB3ZXJkZW4KKyAgICBzb2xsZW4uCisKK1JVZUNLR0FCRVdFUlQ6CisgIEZsYWc6IEJlaSAwIHdhciBkZXIgR2VnbmVyIG5pY2h0IGF1ZmZpbmRiYXIsIGJlaSAxIEVyZm9sZy4KKworQkVTQ0hSRUlCVU5HOgorICBNaXQgZGllc2VyIEZ1bmt0aW9uIGthbm4gbWFuIGVpbiBMZWJld2VzZW4gPGFyZz4gYWxzIEdlZ25lcgorICBhdXN0cmFnZW4uIEltIE5vcm1hbGZhbGwgZXJoYWx0ZW4gc293b2hsIGRhcyBha3R1ZWxsZSBPYmpla3QsIGFscworICBhdWNoIGRlciBHZWduZXIgZWluZSBJbmZvcm1hdGlvbiBkYXJ1ZWJlci4gRGllcyBrYW5uIGplZG9jaCBtaXQgZGVtCisgIGdlc2V0enRlbiBGbGFnIDxzaWxlbnQ+IHVudGVyYnVuZGVuIHdlcmRlbi4KKyAgRXMgaXN0IGF1Y2ggbW9lZ2xpY2gsIGF1ZiBkaWVzZSBNZWxkdW5nIEVpbmZsdXNzIHp1IG5laG1lbiwgaW5kZW0KKyAgbWFuIGRpZSBGdW5rdGlvbiBTdG9wSHVudFRleHQoKSB1ZWJlcnNjaHJlaWJ0LCB3ZWxjaGUgZGFmdWVyCisgIHZlcmFudHdvcnRsaWNoIGlzdC4KKyAgQWNodHVuZzogVW0gendpc2NoZW4gYmVpZGVuIFN0cmVpdGhhZWhuZW4gRnJpZWRlbiB6dSBzY2hsaWVzc2VuLAorICBtdXNzIGRlciBlaW5lIEdlZ25lciBqZXdlaWxzIGJlaSBkZW0gYW5kZXJlbiBhdXNnZXRyYWdlbiB3ZXJkZW4uIEVpbgorICBlaW56ZWxuZXMgU3RvcEh1bnRGb3IoKSBpc3Qgc296dXNhZ2VuIG51ciBlaW4gZWluc2VpdGlnZXMKKyAgRnJpZWRlbnNhbmdlYm90LgorCitCRU1FUktVTkdFTjoKKyAgU29sbCBlaW4gVmllY2ggdW50ZXIgYmVzdGltbXRlbiBVbXN0YWVuZGVuIG5pY2h0IGFuZ3JlaWZiYXIgc2VpbiwgaXN0IGluCisgIGtlaW5lbSBGYWxsIFN0b3BIdW50Rm9yKCkgaW0gRGVmZW5kKCkgenUgdmVyd2VuZGVuLCBzb25kZXJuIFBfTk9fQVRUQUNLLgorICBHcnVuZDogU3RvcHB0IG1hbiB1bmxpZWJzYW1lIEthZW1wZmUgamV3ZWlscyBhbSBBbmZhbmcgdm9tIERlZmVuZCwga2FubiBlaW4KKyAgR2VnbmVyIGdlZmFocmxvcyBBbmdyaWZmc3NwZWxscyBhdXNmdWVocmVuICh1bmQgdWViZW4pLCBvaG5lIGRhc3MgZGllIEdlZmFocgorICBiZXN0ZWh0LCBkYXNzIGRlciBOUEMgenVydWVja3NjaGxhZWd0LgorCitCRUlTUElFTEU6CisgIE1hbiB3aWxsIGF1cyBpcmdlbmRlaW5lbSBHcnVuZCBkZW4gS2FtcGYgendpc2NoZW4gc2ljaCB1bmQgR2VnbmVyIGVuZW15CisgIGVpbnN0ZWxsZW46CisgIC4uLgorICBTdG9wSHVudEZvcihlbmVteSk7IC8vIGVuZW15IG5pY2h0IG1laHIgYmVrYWVtcGZlbgorICBlbmVteS0+U3RvcEh1bnRGb3IodGhpc19vYmplY3QoKSk7IC8vIGVuZW15IHNvbGwgbWljaCBuaWNodCBiZWthZW1wZmVuLgorICAuLi4KKworU0lFSEUgQVVDSDoKKyAgU3RvcEh1bnRUZXh0KCksIFNlbGVjdEVuZW15KCksIFF1ZXJ5RW5lbWllcygpLCBJc0VuZW15KCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMTYuMDMuMjAwOCwgWmVzc3RyYSAKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1N0b3BIdW50VGV4dCBiL2RvYy9sZnVuL1N0b3BIdW50VGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2E4Y2ZiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vU3RvcEh1bnRUZXh0CkBAIC0wLDAgKzEsNTggQEAKK1N0b3BIdW50VGV4dCgpCisKK0ZVTktUSU9OOgorCXZvaWQgU3RvcEh1bnRUZXh0KG9iamVjdCBhcmcpOworCitERUZJTklFUlQgSU46CisJL3N0ZC9saXZpbmcvY29tYmF0LmMKKworQVJHVU1FTlRFOgorCWFyZworCSAgRGVyIEdlZ25lciwgd2VsY2hlciBuaWNodCBtZWhyIGJla2FlbXBmdCB3aXJkLgorCitCRVNDSFJFSUJVTkc6CisJTWl0IGRlciBGdW5rdGlvbiBTdG9wSHVudEZvcigpIGthbm4gbWFuIGVpbiBMZWJld2VzZW4gYWxzIEdlZ25lcgorCWF1c3RyYWdlbi4gRGFiZWkgZXJoYWx0ZW4gc293b2hsIGRlciBHZWduZXIsIGFscyBhdWNoIGRhcyBMZWJld2VzZW4sCisJd2VsY2hlcyAoZWluc2VpdGlnISkgRnJpZWRlbiBzY2hsaWVzc3QsIGpld2VpbHMgZWluZSBNZWxkdW5nLCBzb2Zlcm4KKwltYW4gZGllcyBuaWNodCBtaXR0ZWxzIGVpbmVzIEZsYWdzIHVudGVyYmluZGV0LgorCUVzIGlzdCBudW4gbW9lZ2xpY2gsIGF1ZiBkaWVzZSBNZWxkdW5nIEVpbmZsdXNzIHp1IG5laG1lbiwgaW5kZW0KKwltYW4gZGllIEZ1bmt0aW9uIFN0b3BIdW50VGV4dCgpIHVlYmVyc2NocmVpYnQsIHdlbGNoZSBkYWZ1ZXIKKwl2ZXJhbnR3b3J0bGljaCBpc3QuCisKK0JFSVNQSUVMOgorCUVpbiBMZWJld2VzZW4gbW9lY2h0ZSBlaW5lbiBLYW1wZiBzb2ZvcnQgYWJicmVjaGVuLCB3ZW5uIGVzIHZvbgorCWVpbmVtIEZyb3NjaCBhbmdlZ3JpZmZlbiB3aXJkOgorCSAgaW50IERlZmVuZChpbnQgZGFtLG1peGVkIGRhbV90eXBlLG1peGVkIHNwZWxsLG9iamVjdCBlbmVteSkKKwkgIHsgaWYoZW5lbXkmJmVuZW15LT5RdWVyeVByb3AoUF9GUk9HKSkKKwkgICAgeyBpZihTdG9wSHVudEZvcihlbmVteSkpCisgICAgICAgICAgICAgIHsgLy8gd2VubiBGcm9zY2ggYW5ncmVpZmVuIHdpbGwsIGRlciBub2NoIGtlaW4gR2VnbmVyIHdhcgorICAgICAgICAgICAgICAgIHRlbGxfb2JqZWN0KGFyZywKKyAgICAgICAgIHRoaXNfb2JqZWN0KCktPk5hbWUoV0VSKSsiIGthZW1wZnQgbmljaHQgbWl0IERpci5cbiIKKwkrIldhaHJzY2hlaW5saWNoIHdlcmRlbiBGcm9lc2NoZSB2ZXJzY2hvbnQuXG4iKTsKKwkgICAgICAgIHRlbGxfb2JqZWN0KHRoaXNfb2JqZWN0KCksCisJICJEZXIgYmxvZWRlIEZyb3NjaCB3b2xsdGUgRGljaCBkb2NoIHRhdHNhZWNobGljaCBhbmdyZWlmZW4uXG4iKTsKKyAgICAgICAgICAgICAgfQorCSAgICAgIGVuZW15LT5TdG9wSHVudEZvcih0aGlzX29iamVjdCgpLDEpOworICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKwkgICAgcmV0dXJuOjpEZWZlbmQoZGFtLGRhbV90eXBlLHNwZWxsLGVuZW15KTsKKwkgIH0KKwkgIC8vIHdpcmQgbnVyIGF1ZmdlcnVmZW4sIHdlbm4gZGVyIEdlZ25lciBpcmdlbmR3YW5uIEZyb3NjaCB3dXJkZQorCSAgdm9pZCBTdG9wSHVudFRleHQob2JqZWN0IGFyZykKKwkgIHsgdGVsbF9vYmplY3QoYXJnLAorCSB0aGlzX29iamVjdCgpLT5OYW1lKFdFUikrIiBqYWdkIERpY2ggbmljaHQgbWVoci5cbiIKKwkrIldhaHJzY2hlaW5saWNoIHdlcmRlbiBGcm9lc2NoZSB2ZXJzY2hvbnQuXG4iKTsKKwkgICAgdGVsbF9vYmplY3QodGhpc19vYmplY3QoKSwKKwkiRGVpbiBHZWduZXIgaXN0IGRvY2ggdGF0c2FlY2hsaWNoIHBsb2V0emxpY2ggRnJvc2NoIGdld29yZGVuIVxuIik7CisJICB9CisJV2FydW0gYnJhdWNodCBtYW4gbnVuIGRhcyBlcnN0ZSBTdG9wSHVudEZvcigpLCB3ZW5uIGRvY2ggR2VnbmVyIGVyc3QKKwlpbiA6OkRlZmVuZCgpIGVpbmdldHJhZ2VuIHdlcmRlbiwgd2VsY2hlcyBkb2NoIGdhciBuaWNodCBhdXNnZWZ1ZWhydAorCXdpcmQsIHdlbm4gZGVyIEdlZ25lciBlaW4gRnJvc2NoIGlzdD8gTWFuIGJlYWNodGUgaGllcmJlaSwgZGFzcyBkZXIKKwlHZWduZXIgamEgYXVjaCB3YWVocmVuZCBkZXMgS2FtcGZlcyBvZGVyIHdhZWhyZW5kIGRlciBGZWluZHNjaGFmdAorCWlyZ2VuZHdhbm4gRnJvc2NoIHdlcmRlbiBrb2VubnRlIHVuZCBkYW5uIHNjaG9uIEdlZ25lciB3YXIuCisKK1NJRUhFIEFVQ0g6CisJU3RvcEh1bnRGb3IoKSwgU2VsZWN0RW5lbXkoKSwgUXVlcnlFbmVtaWVzKCksIElzRW5lbXkoKQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBXZWQgTWF5IDI2IDE2OjQ3OjUxIDE5OTkgYnkgUGF0cnluCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9TdWdnZXN0QXJ0aWNsZSBiL2RvYy9sZnVuL1N1Z2dlc3RBcnRpY2xlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNGJhNWMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9TdWdnZXN0QXJ0aWNsZQpAQCAtMCwwICsxLDM1IEBACitTdWdnZXN0QXJ0aWNsZSgpCisKK0ZVTktUSU9OOgorICAgICB2YXJhcmdzIGludCBTdWdnZXN0QXJ0aWNsZShzdHJpbmcgbmFtZSk7CisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC90aGluZy9sYW5ndWFnZS5jCisKK0FSR1VNRU5URToKKyAgICAgbmFtZQorICAgICAgICAgIERlciBOYW1lIHp1ciBFbnRzY2hlaWR1bmdzaGlsZmUuCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGllc2UgRnVua3Rpb24gdmVyc3VjaHQgaGVyYXVzenVmaW5kZW4sIG9iIGRlciBBcnRpa2VsIHp1IGRpZXNlbSBPYmpla3QKKyAgICAgZWluIHVuYmVzdGltbXRlciBvZGVyIGJlc3NlciBlaW4gYmVzdGltbXRlciBBcnRpa2VsIHNlaW4gc29sbHRlLiBEaWUKKyAgICAgVm9yZ2VoZW5zd2Vpc2UgaXN0IGZvbGdlbmRlOiBHaWJ0IGVzIGluIGRlciBVbWdlYnVuZyBkaWVzZXMgT2JqZWt0ZXMKKyAgICAgZWluIHdlaXRlcmVzIE9iamVrdCwgZGFzIGRlbiBOYW1lbiBuYW1lIGJlc2l0enQsIHNvIHdpcmQgZWluCisgICAgIHVuYmVzdGltbXRlciBBcnRpa2VsIHZvcmdlc2NobGFnZW4sIGFuc29uc3RlbiBlaW4gYmVzdGltbXRlci4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgMCwgd2VubiBlaW4gdW5iZXN0aW1tdGVyIEFydGlrZWwgZ2VlaWduZXQgaXN0LCBhbnNvbnN0ZW4gMS4KKworQkVNRVJLVU5HRU46CisgICAgIERlciBWZXJnbGVpY2ggZXJmb2xndCBtaXR0ZWxzIGRlciBQcm9wZXJ0eSBQX05BTUUuIFVtIEVyZm9sZyB6dSBoYWJlbiwKKyAgICAgc29sbHRlIG1hbiBkaWVzZSBGdW5rdGlvbiBkYWhlciBpbiBkZXIgRm9ybQorCisgICAgIFN1Z2dlc3RBcnRpY2xlKFF1ZXJ5UHJvcChQX05BTUUpKQorCisgICAgIGF1ZnJ1ZmVuLgorCitTSUVIRSBBVUNIOgorICAgICBRdWVyeUFydGljbGUoKSwgbmFtZSgpLCAvc3RkL3RoaW5nL2xhbmd1YWdlLmMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogV2VkIE1heSA4IDEwOjI1OjM0IDE5OTYgYnkgV2FyZ29uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9Td2FwUm93cyBiL2RvYy9sZnVuL1N3YXBSb3dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNWQ5MjgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9Td2FwUm93cwpAQCAtMCwwICsxLDQwIEBACisKK1N3YXBSb3dzKCkKKworCitGVU5LVElPTjoKKyAgICBpbnQgU3dhcFJvd3MoIG9iamVjdCBvYjEsIG9iamVjdCBvYjIgKQorCitERUZJTklFUlQgSU46CisgICAgL3N0ZC9saXZpbmcvdGVhbS5jCisKK0FSR1VNRU5URToKKyAgICBvYjEsIG9iMiAtIFNwaWVsZXIsIGRpZSBkaWUgUmVpaGVuIHRhdXNjaGVuIHNvbGxlbi4KKworQkVTQ0hSRUlCVU5HOgorICAgIERpZSBhbmdlZ2ViZW5lbiBTcGllbGVyIHRhdXNjaGVuIGRpZSBSZWloZW4uCisKK1JVRUNLR0FCRVdFUlQ6CisgICAgMSBiZWkgZXJmb2xncmVpY2hlbSBUYXVzY2gsIDAgc29uc3QuCisKK0JFTUVSS1VORzoKKyAgICBEZXIgVGF1c2NoIHdpcmQgbnVyIGR1cmNoZ2VmdWVocnQsIHdlbm4gZGllIGFuZ2VnZWJlbmVuIFNwaWVsZXIgYXVjaAorICAgIHRhdHNhZWNobGljaCBpbSBUZWFtIHNpbmQgdW5kIGRhbWl0IGtlaW4gTlBDIHZvciBlaW5lbiBTcGllbGVyIGdlc3RlbGx0CisgICAgd3VlcmRlLgorICAgIE1vZWNodGUgbWFuIHdpc3Nlbiwgb2IgZWluIFNwaWVsZXIgZWluZSBSZWloZSBnZXdlY2hzZWx0IGhhdCwgbXVzcyBtYW4KKyAgICBzaWNoIGRlciBIaWxmZSBlaW5lcyBIb29rcyBiZWRpZW5lbjogSF9IT09LX1RFQU1ST1dDSEFOR0UKKworU0lFSEUgQVVDSDoKKyAgICAgICAgVWViZXJzaWNodDogdGVhbWthbXBmCisgICAgICAgIFByb3BlcnRpZXM6IFBfVEVBTSwgUF9URUFNX0xFQURFUiwgUF9URUFNX0FTU09DX01FTUJFUlMsCisgICAgICAgICAgICAgICAgICAgIFBfVEVBTV9ORVdNRU1CRVIKKyAgICAgICAgQmV3ZWd1bmc6ICAgSXNUZWFtTW92ZSwgVGVhbUZsZWUKKyAgICAgICAgTWl0Z2xpZWRlcjogSXNUZWFtTGVhZGVyLCBUZWFtTWVtYmVycworICAgICAgICBLYW1wZjogICAgICBBc3NvY01lbWJlciwgRGVBc3NvY01lbWJlciwgSW5zZXJ0RW5lbXlUZWFtCisgICAgICAgICAgICAgICAgICAgIFNlbGVjdE5lYXJFbmVteSwgU2VsZWN0RmFyRW5lbXkKKyAgICAgICAgUG9zaXRpb25lbjogUHJlc2VudFBvc2l0aW9uLCBQcmVzZW50Um93cywgUHJlc2VudEVuZW15Um93cywKKyAgICAgICAgICAgICAgICAgICAgUHJlc2VudFRlYW1Qb3NpdGlvbgorICAgICAgICBTb25zdGlnZXM6ICBUZWFtUHJlZml4LCB0ZWFta2FtcGZfaW50ZXJuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IDE2LTA4LTIwMTAsIEdhYnlsb24KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1Rha2VGbGF3IGIvZG9jL2xmdW4vVGFrZUZsYXcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JmZDAzYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL1Rha2VGbGF3CkBAIC0wLDAgKzEsNzUgQEAKK1Rha2VGbGF3KCkKKworRlVOS1RJT046CisgICAgIHZhcmFyZ3Mgdm9pZCBUYWtlRmxhdyhvYmplY3QgZW5lbXkpOyAoV2FmZmVuKQorICAgICB2YXJhcmdzIHZvaWQgVGFrZUZsYXcobWl4ZWQgZGFtX3R5cGVzLG1hcHBpbmcgZWluZm9zKSAoUnVlc3R1bmdlbikKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL2FybW91ci9jb21iYXQuYywKKyAgICAgL3N0ZC93ZWFwb24vY29tYmF0LmMKKworQVJHVU1FTlRFOgorICAgICBrZWluZQorCitCRVNDSFJFSUJVTkc6CisgICAgIERpZXNlIEZ1bmt0aW9uIHdpcmQgaW4gV2FmZmVuIHVuZCBSdWVzdHVuZ2VuIHdhZWhyZW5kIGRlcyBLYW1wZmVzCisgICAgIGF1ZmdlcnVmZW4uIEluIGVpbmVyIFdhZmZlIGVyZm9sZ3QgZGVyIEF1ZnJ1ZiBiZWkgamVkZW0gU2NobGFnIG1pdAorICAgICBkaWVzZXIgV2FmZmUsIGJlaSBSdWVzdHVuZ2VuIHdpcmQgVGFrZUZsYXcoKSBpbiBlaW5lciB6dWZhZWxsaWcKKyAgICAgYXVzZ2V3YWVobHRlbiBnZXRyYWdlbmVuIFJ1ZXN0dW5nIGF1ZmdlcnVmZW4uCisgICAgIFdhZmZlbiBiZWtvbW1lbiBkYXMgR2VnbmVyb2JqZWt0IHVlYmVyZ2ViZW4sIFJ1ZXN0dW5nZW4gZGllIGVyd2VpdGVydGVuCisgICAgIERlZmVuZEluZm9zIChzLiBkb3J0IGZ1ZXIgRGV0YWlscykuIEF1ZmdydW5kIGRpZXNlciBJbmZvcm1hdGlvbmVuIGthbm4KKyAgICAgbWFuIGRlbiBTY2hhZGVuLCBkZW4gZWluIEdlZ2Vuc3RhbmQgbmltbXQsIGZsZXhpYmxlciBnZXN0YWx0ZW4gKHouQi4gYmVpCisgICAgIGVpbmVyIFdhZmZlIGluIEFiaGFlbmdpZ2tlaXQgdm9uIFBfQk9EWSBkZXMgR2VnbmVycy4pCisKKyAgICAgU293ZWl0IG1hbiBkaWUgRnVua3Rpb24gbmljaHQgdWViZXJsYWVkdCwgYmV3aXJrdCBzaWUgbmljaHRzIHdlaXRlciBhbHMKKyAgICAgZGFzIEVyaG9laGVuIGVpbmVzIFphZWhsZXJzLCBkZXIgbWl0IFF1ZXJ5RmxhdygpIGFiZ2VmcmFndCB3ZXJkZW4ga2Fubi4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICAga2VpbmVyCisKK0JFTUVSS1VOR0VOOgorICAgICBEaWUgV2FmZmVuLS8gUnVlc3R1bmdza2xhc3NlIHdpcmQgbmljaHQgYXV0b21hdGlzY2ggcmVkdXppZXJ0ISBXZW5uCisgICAgIGVpbmUgV2FmZmUgb2RlciBSdWVzdHVuZyBzaWNoIGFibnV0emVuIHNvbGwsIG11c3MgbWFuIFRha2VGbGF3KCkKKyAgICAgdWViZXJsYWRlbiB1bmQgZG9ydCBlbnRzcHJlY2hlbmQgaGFuZGVsbiwgb2RlciAoZnVlciBlaW5mYWNoZQorICAgICBGYWVsbGUpIGRpZSBQcm9wZXJ0eSBQX1FVQUxJVFkgc2V0emVuLgorCitCRUlTUElFTEU6CisgICAgIEVpbmUgV2FmZmUsIGRlcmVuIFdhZmZlbmtsYXNzZSBhbGxlIDIwIFNjaGxhZWdlIHVtIDEgYWJuaW1tdDoKKworICAgICBpbmhlcml0ICJzdGQvd2VhcG9uIjsKKworICAgICAjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorICAgICAjaW5jbHVkZSA8Y29tYmF0Lmg+CisKKyAgICAgY3JlYXRlKCkKKyAgICAgeworICAgICAgIC8qIERhcyBVZWJsaWNoZS4uLiAqLworICAgICB9CisKKyAgICAgVGFrZUZsYXcoKQorICAgICB7CisgICAgICAgaW50IGZsYXc7CisKKyAgICAgICAvKiBlcnN0IG1hbCBkZW4gWmFlaGxlciBlcmhvZWhlbi4uLiAqLworICAgICAgIDo6VGFrZUZsYXcoKTsKKworICAgICAgIC8qIGpldHp0IGRlbiBha3R1ZWxsZW4gWmFlaGxlcnN0YW5kIGFiZnJhZ2VuICovCisgICAgICAgZmxhdyA9IFF1ZXJ5RmxhdygpWzBdOworCisgICAgICAgLyogQWJ6dWcgbnVyIGplZGVuIDIwLiBTY2hsYWcgKi8KKyAgICAgICBpZiAoIShmbGF3ICUgMjApKSB7CisgICAgICAgICAvKiBTbywgamV0enQgZnVlciBkZW4gU2NoYWRlbiBzb3JnZW4uIEhpZXJmdWVyIGJlbnV0enQgKi8KKyAgICAgICAgIC8qIG1hbiBhbSBzaWNoZXJzdGVuIGRpZSBlaW5nZWJhdXRlIEZ1bmt0aW9uIERhbWFnZSgpICovCisgICAgICAgICBEYW1hZ2UoMSk7CisgICAgICAgfQorICAgICB9CisKKyAgICAgRGllc2VzIGVpbmZhY2hlIEJlaXNwaWVsIGhhZXR0ZSBuYXR1ZXJsaWNoIGF1Y2ggdWViZXIgZWluCisgICAgIFNldFByb3AoUF9RVUFMSVRZLDIwKTsgaW0gY3JlYXRlKCkgcmVhbGlzaWVydCB3ZXJkZW4ga29lbm5lbi4KKworU0lFSEUgQVVDSDoKKyAgICAgUXVlcnlGbGF3KCksIERhbWFnZSgpLCBEZWZlbmRJbmZvLCBQX1FVSUFMSVRZLCAvc3RkL2FybW91ci9jb21iYXQuYywKKyAgICAgL3N0ZC93ZWFwb24vY29tYmF0LmMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogVGh1IE1heSAyMiAxMDozMDoxMCAxOTk3IGJ5IFBhcmFjZWxzdXMKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1RlYW1GbGVlIGIvZG9jL2xmdW4vVGVhbUZsZWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIzMTdhMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL1RlYW1GbGVlCkBAIC0wLDAgKzEsNDAgQEAKKworVGVhbUZsZWUoKQorCisKK0ZVTktUSU9OOgorICAgICAgICBpbnQgVGVhbUZsZWUoKQorCitERUZJTklFUlQgSU46CisgICAgICAgIC9zdGQvbGl2aW5nL3RlYW0uYworCitBUkdVTUVOVEU6CisgICAgICAgIGtlaW5lCisKK0JFU0NIUkVJQlVORzoKKyAgICAgICAgU3BpZWxlciB3aXJkIHp1ciBGbHVjaHQgaW4gaGludGVyZSBSZWloZSB2ZXJhbmxhc3N0LCBmYWxscyBlciBkaWVzCisgICAgICAgIGVpbmdlc3RlbGx0IGhhdC4KKworUlVFQ0tHQUJFV0VSVDoKKyAgICAgICAgMSwgZmFsbHMgZGVyIFNwaWVsZXIgaW4gZWluZSBoaW50ZXJlIFJlaWhlIGZsaWVoZW4gd29sbHRlIHVuZCBuYWNoCisgICAgICAgIGRlbSBWZXJzdWNoIG5pY2h0IG1laHIgaW4gZGVyIGVyc3RlbiBSZWloZSBzdGVodCwgc29uc3QgMC4KKworQkVNRVJLVU5HRU46CisgICAgICAgIEJlaW0gVGVhbWxlaXRlciBmdWVocnQgZGVyIEZsdWNodHZlcnN1Y2ggZGF6dSwgZGFzcyBzZWluIFRlYW0gbmljaHQKKyAgICAgICAgbWVociBmb2xndC4KKworU0lFSEUgQVVDSDoKKyAgICAgICAgVWViZXJzaWNodDogdGVhbWthbXBmCisgICAgICAgIFByb3BlcnRpZXM6IFBfVEVBTSwgUF9BU1NPQ19NRU1CRVJTLCBQX1RFQU1fQVRUQUNLX0NNRCwKKyAgICAgICAgICAgICAgICAgICAgUF9URUFNX0FVVE9GT0xMT1csIFBfVEVBTV9DT0xPUlMsIFBfVEVBTV9MRUFERVIsCisgICAgICAgICAgICAgICAgICAgIFBfVEVBTV9ORVdNRU1CRVIsIFBfVEVBTV9XQU5URURfUk9XLCBQX1RFQU1fV0lNUFlfUk9XCisgICAgICAgIEJld2VndW5nOiAgIElzVGVhbU1vdmUKKyAgICAgICAgTWl0Z2xpZWRlcjogSXNUZWFtTGVhZGVyLCBUZWFtTWVtYmVycworICAgICAgICBLYW1wZjogICAgICBBc3NvY01lbWJlciwgRGVBc3NvY01lbWJlciwgSW5zZXJ0RW5lbXlUZWFtLAorICAgICAgICAgICAgICAgICAgICBTZWxlY3ROZWFyRW5lbXksIFNlbGVjdEZhckVuZW15CisgICAgICAgIFBvc2l0aW9uZW46IFByZXNlbnRQb3NpdGlvbiwgUHJlc2VudFJvd3MsIFByZXNlbnRFbmVteVJvd3MsCisgICAgICAgICAgICAgICAgICAgIFByZXNlbnRUZWFtUG9zaXRpb24sIFN3YXBSb3dzCisgICAgICAgIFNvbnN0aWdlczogIFRlYW1QcmVmaXgsIHRlYW1rYW1wZl9pbnRlcm4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogMTYtMDgtMjAxMCwgR2FieWxvbgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vVGVhbU1lbWJlcnMgYi9kb2MvbGZ1bi9UZWFtTWVtYmVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGNhOTNiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vVGVhbU1lbWJlcnMKQEAgLTAsMCArMSwzOCBAQAorCitUZWFtTWVtYmVycygpCisKKworRlVOS1RJT046CisgICAgICAgIG9iamVjdCAqVGVhbU1lbWJlcnMoKQorCitERUZJTklFUlQgSU46CisgICAgICAgIC9zdGQvbGl2aW5nL3RlYW0uYworCitBUkdVTUVOVEU6CisgICAgICAgIGtlaW5lCisKK0JFU0NIUkVJQlVORzoKKyAgICAgICAgTGllZmVydCBUZWFtbWl0Z2xpZWRlciBkZXMgVGVhbXMgZGVzIFNwaWVsZXJzLgorCitSVUVDS0dBQkVXRVJUOgorICAgICAgICBBcnJheSBtaXQgQUxMRU4gVGVhbW1pdGdsaWVkZXJuLgorCitCRU1FUktVTkdFTjoKKyAgICAgICAgRmFsbHMgZGVyIFNwaWVsZXIgaW4ga2VpbmVtIFRlYW0gaXN0LCBlbnRoYWVsdCBkYXMgQXJyYXkgbnVyIGRlbgorICAgICAgICBTcGllbGVyLgorCitTSUVIRSBBVUNIOgorICAgICAgICBVZWJlcnNpY2h0OiB0ZWFta2FtcGYKKyAgICAgICAgUHJvcGVydGllczogUF9URUFNLCBQX0FTU09DX01FTUJFUlMsIFBfVEVBTV9BVFRBQ0tfQ01ELAorICAgICAgICAgICAgICAgICAgICBQX1RFQU1fQVVUT0ZPTExPVywgUF9URUFNX0NPTE9SUywgUF9URUFNX0xFQURFUiwKKyAgICAgICAgICAgICAgICAgICAgUF9URUFNX05FV01FTUJFUiwgUF9URUFNX1dBTlRFRF9ST1csIFBfVEVBTV9XSU1QWV9ST1cKKyAgICAgICAgQmV3ZWd1bmc6ICAgSXNUZWFtTW92ZSwgVGVhbUZsZWUKKyAgICAgICAgTWl0Z2xpZWRlcjogSXNUZWFtTGVhZGVyCisgICAgICAgIEthbXBmOiAgICAgIEFzc29jTWVtYmVyLCBEZUFzc29jTWVtYmVyLCBJbnNlcnRFbmVteVRlYW0sCisgICAgICAgICAgICAgICAgICAgIFNlbGVjdE5lYXJFbmVteSwgU2VsZWN0RmFyRW5lbXkKKyAgICAgICAgUG9zaXRpb25lbjogUHJlc2VudFBvc2l0aW9uLCBQcmVzZW50Um93cywgUHJlc2VudEVuZW15Um93cywKKyAgICAgICAgICAgICAgICAgICAgUHJlc2VudFRlYW1Qb3NpdGlvbiwgU3dhcFJvd3MKKyAgICAgICAgU29uc3RpZ2VzOiAgVGVhbVByZWZpeCwgdGVhbWthbXBmX2ludGVybgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiAxNi0wOC0yMDEwLCBHYWJ5bG9uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9UZWFtUHJlZml4IGIvZG9jL2xmdW4vVGVhbVByZWZpeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmJlYmI3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vVGVhbVByZWZpeApAQCAtMCwwICsxLDM3IEBACisKK1RlYW1QcmVmaXgoKQorCisKK0ZVTktUSU9OOgorICAgICAgICBzdHJpbmcgVGVhbVByZWZpeCgpCisKK0RFRklOSUVSVCBJTjoKKyAgICAgICAgL3N0ZC9saXZpbmcvdGVhbS5jCisKK0FSR1VNRU5URToKKyAgICAgICAga2VpbmUKKworQkVTQ0hSRUlCVU5HOgorICAgICAgICBFcmdpYnQgVGVhbS1QcmVmaXggZWluZXMgU3BpZWxlcnMuCisKK1JVRUNLR0FCRVdFUlQ6CisgICAgICAgICJbVGVhbSBUZWFtbmFtZV0gIiwgZmFsbHMgZGVyIFNwaWVsZXIgaW4gZWluZW0gVGVhbSBpc3QsCisgICAgICAgICIiICAgICAgICAgICAgICAgICAgc29uc3QuCisKK0JFTUVSS1VOR0VOOgorCitTSUVIRSBBVUNIOgorICAgICAgICBVZWJlcnNpY2h0OiB0ZWFta2FtcGYKKyAgICAgICAgUHJvcGVydGllczogUF9URUFNLCBQX0FTU09DX01FTUJFUlMsIFBfVEVBTV9BVFRBQ0tfQ01ELAorICAgICAgICAgICAgICAgICAgICBQX1RFQU1fQVVUT0ZPTExPVywgUF9URUFNX0NPTE9SUywgUF9URUFNX0xFQURFUiwKKyAgICAgICAgICAgICAgICAgICAgUF9URUFNX05FV01FTUJFUiwgUF9URUFNX1dBTlRFRF9ST1csIFBfVEVBTV9XSU1QWV9ST1cKKyAgICAgICAgQmV3ZWd1bmc6ICAgSXNUZWFtTW92ZSwgVGVhbUZsZWUKKyAgICAgICAgTWl0Z2xpZWRlcjogSXNUZWFtTGVhZGVyLCBUZWFtTWVtYmVycworICAgICAgICBLYW1wZjogICAgICBBc3NvY01lbWJlciwgRGVBc3NvY01lbWJlciwgSW5zZXJ0RW5lbXlUZWFtLAorICAgICAgICAgICAgICAgICAgICBTZWxlY3ROZWFyRW5lbXksIFNlbGVjdEZhckVuZW15CisgICAgICAgIFBvc2l0aW9uZW46IFByZXNlbnRQb3NpdGlvbiwgUHJlc2VudFJvd3MsIFByZXNlbnRFbmVteVJvd3MsCisgICAgICAgICAgICAgICAgICAgIFByZXNlbnRUZWFtUG9zaXRpb24sIFN3YXBSb3dzCisgICAgICAgIFNvbnN0aWdlczogIHRlYW1rYW1wZl9pbnRlcm4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogMTYtMDgtMjAxMCwgR2FieWxvbgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vVGVsZXBvcnQgYi9kb2MvbGZ1bi9UZWxlcG9ydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTAyZDA3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vVGVsZXBvcnQKQEAgLTAsMCArMSwyOCBAQAorVGVsZXBvcnQoKQorCitGVU5LVElPTjoKKyAgICBpbnQgVGVsZXBvcnQoc3RyaW5nIHppZWwpCisKK0FSR1VNRU5URToKKyAgICB6aWVsOiBOdW1tZXIgZGVzIFNlaGVydG9ycywgenUgZGVtIHRlbGVwb3J0aWVydCB3ZXJkZW4gc29sbC4KKworQkVTQ0hSRUlCVU5HOgorICAgIFRlbGVwb3J0aWVydCBkZW4gU2VoZXIgKHRoaXNfcGxheWVyKCkpIHp1IGRlbSBUb3IgbWl0IGRlciBhbmdlZ2ViZW5lbgorICAgIE51bW1lci4gRmFsbHMga2VpbmUgTnVtbWVyIGFuZ2VnZWJlbiB3aXJkLCB3aXJkIG1pdCBTaG93RG9vcnMoKSBkaWUKKyAgICBMaXN0ZSBkZXIgYmVrYW5udGVuIFRvcmUgYW5nZXplaWd0IHVuZCBhdWYgZGllIEVpbmdhYmUgZWluZXIgTnVtbWVyCisgICAgZ2V3YXJ0ZXQuCisKK1JVRUNLR0FCRVdFUlQ6CisgICAgMCwgZmFsbHMgZGVyIFNlaGVyIG5pY2h0IG5lYmVuIGVpbmVtIFRvciBzdGVodCwgZGFzcyBlciBrZW5udC4KKyAgICAxICBzb25zdC4KKworQkVNRVJLVU5HRU46CisgICAgRGVyIFNlaGVyIG11c3MgaW4gZWluZW0gUmF1bSBzdGVoZW4sIGluIGRlbSBzaWNoIGVpbiBTZWhlcnRvciBiZWZpbmRldCwKKyAgICBkYXNzIGVyIGtlbm50LiBEZXIgU2VoZXIgbXVzcyBhdWNoIGRhcyBhbmdlZ2ViZW5lIFppZWwga2VubmVuLgorICAgIERpZXNlIEZ1bmt0aW9uIHdpcmQgdm9uIC9kL3NlaGVyL3BvcnRhbGUvc2VoZXJ0b3JtYXN0ZXIgZGVmaW5pZXJ0LgorCitCRUlTUElFTEU6CisgICAgL2Qvc2VoZXIvcG9ydGFsZS9zZWhlcnRvcm1hc3Rlci0+VGVsZXBvcnQoMSkKKworU0lFSEUgQVVDSDoKKyAgICBEaXNjb3ZlckRvb3IsIERvb3JJc0tub3duLCBTaG93RG9vcnMsIEdldERvb3JzTWFwcGluZwpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vVGVzdElnbm9yZSBiL2RvYy9sZnVuL1Rlc3RJZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U2NjRjMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL1Rlc3RJZ25vcmUKQEAgLTAsMCArMSw2NiBAQAorVGVzdElnbm9yZSgpCisKK0ZVTktUSU9OOgorICAgICBwdWJsaWMgaW50IFRlc3RJZ25vcmUoc3RyaW5nfHN0cmluZyogYXJnKQorCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvcGxheWVyL2NvbW0uYworCitBUkdVTUVOVEU6CisgICAgIGFyZworICAgICAgICAgU3RyaW5nIG9kZXIgQXJyYXkgdm9uIFN0cmluZ3MsIGRpZSBnZXRlc3RldCB3ZXJkZW4gc29sbGVuLAorICAgICAgICAgRm9ybWF0IGpld2VpbHM6IFtzcGllbGVyXS5ha3Rpb25bLnF1YWxpZml6aWVyZXJdCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIDAsIHdlbm4gYXJnIG5pY2h0IGlnbm9yaWVydCB3aXJkCisgICAgIE1TR19JR05PUkVELCB3ZW5uIChtaW4uIGVpbiBFbGVtZW50IHZvbikgYXJnIGlnbm9yaWVydCB3aXJkCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRXMgd2lyZCBnZXBydWVmdCwgb2IgZGVyIFNwaWVsZXIgaXJnZW5kZWluZW4gRWludHJhZyBhdWYgc2VpbmVyIExpc3RlCisgICAgIGhhdCwgZGVyIGRhenUgZnVlaHJ0LCBkYXNzIDxhcmc+IGlnbm9yaWVydCB3aXJkLiBIaWVyYmVpIGtvbW1lbiBqZSBuYWNoCisgICAgIGRlbiBBbmdhYmVuIGluIDxhcmc+IGZvbGdlbmRlIFJlZ2VsbiB6dW0gVHJhZ2VuOgorICAgICAxKSBzcGllbGVyCisgICAgICAgIFdpcmQgZGVyIFNwaWVsZXIgaWdub3JpZXJ0PworICAgICAyKSAuYWt0aW9uCisgICAgICAgIElnbm9yaWVydCBkZXIgU3BpZWxlciAuYWt0aW9uLCBkLmguIGRpZSBBa3Rpb24ga29tcGxldHQgKE9ITkUKKyAgICAgICAgUXVhbGlmaXppZXJlcik/CisgICAgIDMpIHNwaWVsZXIuYWt0aW9uCisgICAgICAgIElnbm9yaWVydCBkZXIgU3BpZWxlciBzcGllbGVyLCAuYWt0aW9uIG9kZXIgc3BpZWxlci5ha3Rpb24/CisgICAgIDQpIHNwaWVsZXIuYWt0aW9uLnF1YWxpZml6aWVyZXIKKyAgICAgICAgSWdub3JpZXJ0IGRlciBTcGllbGVyIHNwaWVsZXIsIC5ha3Rpb24sIHNwaWVsZXIuYWt0aW9uIG9kZXIKKyAgICAgICAgc3BpZWxlci5ha3Rpb24ucXVhbGlmaXppZXJlcj8KKyAgICAgNSkgLmFrdGlvbi5xdWFsaWZpemllcmVyCisgICAgICAgIElnbm9yaWVydCBkZXIgU3BpZWxlciAuYWt0aW9uIG9kZXIgLmFrdGlvbi5xdWFsaWZpemllcmVyPworCisgICAgIERhIFRlc3RJZ25vcmUoKSBkYW1pdCBkdXJjaGF1cyBldHdhcyBhdWZ3ZW5kaWdlciBzZWluIGthbm4sIHNvbGx0ZQorICAgICBtYW4gZGllcyBuaWNodCB1bm5vZXRpZyBvZnQgYXVmcnVmZW4uIChCcmF1Y2h0IG1hbiBkYXMgRXJnZWJuaXMgei5CLgorICAgICBrdXJ6IHNwYWV0ZXIgbm9jaG1hbCwga29lbm50ZSBtYW4gZGFzIEVyZ2VibmlzIHNwZWljaGVybi4pIFdpcmQgZGVyCisgICAgIFF1YWxpZml6aWVyZXIgbmljaHQgZ2VicmF1Y2h0LCBzb2xsdGUgbWFuIGlobiB3ZWdsYXNzZW4uCisKK0JFSVNQSUVMOgorICAgICBpZiAoIXRoaXNfcGxheWVyKCktPlRlc3RJZ25vcmUoImFuZHkiKSkKKyAgICAgICB0ZWxsX29iamVjdCh0aGlzX3BsYXllcigpLCAiQW5keSB0ZWlsdCBEaXIgbWl0OiBIYWxsbyFcbiIpOworCisgICAgIC8vIEJlaXNwaWVsIGZ1ZXIgZWluZSBJZ25vcmUtQ2hlY2sgZnVlciBBa3Rpb24gKGtyYXR6ZW4pIGZ1ZXIgZWluZW4KKyAgICAgLy8gU3BpZWxlciAodGhpc19wbGF5ZXIoKSkgYW4gZWluZW0gYW5kZXJlbiBTcGllbGVyICh0YXJnZXQpCisgICAgIGlmICghdGFyZ2V0LT5UZXN0SWdub3JlKCAoe2dldHVpZCh0aGlzX3BsYXllcigpKSArICIua3JhdHplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0dWlkKHRoaXNfcGxheWVyKCkpICsgIi5rcmF0eiJ9KSApKQorICAgICB7CisgICAgICAgdGVsbF9vYmplY3QodGFyZ2V0LCB0aGlzX3BsYXllcigpLT5OYW1lKCkrIiBrcmF0enQgZGljaC5cbiIpOworICAgICAgIHRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksICJEdSBrcmF0enQgIit0YXJnZXQtPk5hbWUoKSsiLlxuIik7CisgICAgIH0KKyAgICAgZWxzZQorICAgICAgIHRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksIHRhcmdldC0+TmFtZSgpKyIgaWdub3JpZXJ0IGRpY2guXG4iKTsKKworICAgICAvLyBhbGx1bWZhc3NlbmRlciBJZ25vcmllci1DaGVjayBpbiBlaW5lciBHaWxkZSAoS2xlcnVzKSBhdWYKKyAgICAgLy8gZWluZSBBa3Rpb24gKGt1cmllcmVuKSBmdWVyIGVpbmVuIGJlc3RpbW10ZW4gU3BpZWxlciAoZGVuIGNhc3RlcikKKyAgICAgLy8gYW4gZWluZW0genUga3VyaWVyZW5kZW4gU3BpZWxlciAodGFyZ2V0KQorICAgICBpZiAodGFyZ2V0LT5UZXN0SWdub3JlKGdldHVpZChjYXN0ZXIpKyIua3VyaWVyZS5rbGVydXMiKSkKKyAgICAgICB0ZWxsX29iamVjdChjYXN0ZXIsIGJyZWFrX3N0cmluZygKKyAgICAgICAgIHRhcmdldC0+TmFtZSgpKyIgaWdub3JpZXJ0IGRlaW5lbiBWZXJzdWNoLiIsIDc4KSk7CisKK1NJRUhFIEFVQ0g6CisgICAgIFBfSUdOT1JFLCBBZGRJZ25vcmUsIFJlbW92ZUlnbm9yZSwgVGVzdElnbm9yZVNpbXBsZSwgL3N0ZC9wbGF5ZXIvY29tbS5jCisKKzI2LjA0LjIwMTQgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9UZXN0SWdub3JlU2ltcGxlIGIvZG9jL2xmdW4vVGVzdElnbm9yZVNpbXBsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDI2MzJlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vVGVzdElnbm9yZVNpbXBsZQpAQCAtMCwwICsxLDU1IEBACitUZXN0SWdub3JlU2ltcGxlKCkKKworRlVOS1RJT046CisgICAgIHB1YmxpYyBpbnQgVGVzdElnbm9yZVNpbXBsZShzdHJpbmcgKmFyZykKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL3BsYXllci9jb21tLmMKKworQVJHVU1FTlRFOgorICAgICBhcmcKKyAgICAgICAgIExpc3RlIHZvbiBTdHJpbmdzLCBkaWUgZ2V0ZXN0ZXQgd2VyZGVuIHNvbGxlbgorCitCRVNDSFJFSUJVTkc6CisgICAgIFRlc3RJZ25vcmVTaW1wbGUoKSBwcnVlZnQsIG9iIGRlciBTcGllbGVyIG1pbi4gZWluZW4gZGVyIHVlYmVyZ2ViZW5lbgorICAgICBFaW50cmFlZ2UgYXVmIHNlaW5lciBJZ25vcmllcmVsaXN0ZSBoYXQuCisgICAgIEZhbGxzIG1hbiBtZWhyZXJlIEVpbnRyYWVnZSBwcnVlZmVuIG11c3MvbW9lY2h0ZSwgaXN0IGVzIHNjaG5lbGxlciwgYWxsZQorICAgICBFaW50cmFlZ2UgaW4gZWluZW0genUgdWViZXJnZWJlbiBhbnN0YXR0IGZ1ZXIgamVkZW4gZWluemVsbiAKKyAgICAgVGVzdElnbm9yZVNpbXBsZSgpIGF1Znp1cnVmZW4uCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIDEsIGZhbGxzIGVzIG1pbmRlc3RlbnMgZWluZSBVZWJlcmVpbnN0aW1tdW5nZW4gdm9uIGFyZyB1bmQgZGVyCisgICAgIElnbm9yaWVyZS1MaXN0ZSBkZXMgU3BpZWxlcnMgZ2lidC4KKyAgICAgMCwgc29uc3QuCisKK0JFSVNQSUVMOgorICAgICBpZiAoIXRoaXNfcGxheWVyKCktPlRlc3RJZ25vcmVTaW1wbGUoKHsiYW5keSJ9KSkpCisgICAgICAgdGVsbF9vYmplY3QodGhpc19wbGF5ZXIoKSwgIkFuZHkgdGVpbHQgRGlyIG1pdDogSGFsbG8hXG4iKTsKKworICAgICAvLyBCZWlzcGllbCBmdWVyIGVpbmUgSWdub3JlLUNoZWNrIGZ1ZXIgQWt0aW9uIChrcmF0emVuKSBmdWVyIGVpbmVuCisgICAgIC8vIFNwaWVsZXIgKHRoaXNfcGxheWVyKCkpIGFuIGVpbmVtIGFuZGVyZW4gU3BpZWxlciAodGFyZ2V0KQorICAgICBpZiAoIXRhcmdldC0+VGVzdElnbm9yZVNpbXBsZShnZXR1aWQodGhpc19wbGF5ZXIoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldHVpZCh0aGlzX3BsYXllcigpKSsiLmtyYXR6IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0dWlkKHRoaXNfcGxheWVyKCkpKyIua3JhdHplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi5rcmF0eiIsICIua3JhdHplIn0pKSkgeworICAgICAgIHRlbGxfb2JqZWN0KHRhcmdldCwgdGhpc19wbGF5ZXIoKS0+TmFtZSgpKyIga3JhdHp0IGRpY2guXG4iKTsKKyAgICAgICB0ZWxsX29iamVjdCh0aGlzX3BsYXllcigpLCAiRHUga3JhdHp0ICIrdGFyZ2V0LT5OYW1lKCkrIi5cbiIpOworICAgICB9IGVsc2UKKyAgICAgICB0ZWxsX29iamVjdCh0aGlzX3BsYXllcigpLCB0YXJnZXQtPk5hbWUoKSsiIGlnbm9yaWVydCBkaWNoLlxuIik7CisKKyAgICAgLy8gYWxsdW1mYXNzZW5kZXIgSWdub3JpZXItQ2hlY2sgaW4gZWluZXIgR2lsZGUgKEtsZXJ1cykgYXVmCisgICAgIC8vIGVpbmUgQWt0aW9uIChrdXJpZXJlbikgZnVlciBlaW5lbiBiZXN0aW1tdGVuIFNwaWVsZXIgKGRlbiBjYXN0ZXIpCisgICAgIC8vIGFuIGVpbmVtIHp1IGt1cmllcmVuZGVuIFNwaWVsZXIgKHRhcmdldCkKKyAgICAgaWYgKHRhcmdldC0+VGVzdElnbm9yZVNpbXBsZSgoe2dldHVpZChjYXN0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0dWlkKGNhc3RlcikrIi5rdXJpZXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldHVpZChjYXN0ZXIpKyIua3VyaWVyZS5rbGVydXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi5rdXJpZXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIua3VyaWVyZS5rbGVydXMifSkpKQorICAgICAgIHRlbGxfb2JqZWN0KGNhc3RlciwgYnJlYWtfc3RyaW5nKAorICAgICAgICAgdGFyZ2V0LT5OYW1lKCkrIiBpZ25vcmllcnQgZGVpbmVuIFZlcnN1Y2guIiwgNzgpKTsKKworU0lFSEUgQVVDSDoKKyAgICAgUF9JR05PUkUsIEFkZElnbm9yZSwgUmVtb3ZlSWdub3JlLCBUZXN0SWdub3JlLCAvc3RkL3BsYXllci9jb21tLmMKKworMjYuMDQuMjAxNCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1Rlc3RMaW1pdFZpb2xhdGlvbiBiL2RvYy9sZnVuL1Rlc3RMaW1pdFZpb2xhdGlvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzQ0Mjk5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vVGVzdExpbWl0VmlvbGF0aW9uCkBAIC0wLDAgKzEsMjEgQEAKK1Rlc3RMaW1pdFZpb2xhdGlvbigpCitGVU5LVElPTjoKKyAgICAgIHN0YXR1cyBUZXN0TGltaXRWaW9sYXRpb24obWFwcGluZyBjaGVjaykKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL2xpdmluZy9hdHRyaWJ1dGVzLmMKKw0KK1BBUkFNRVRFUjoNCisgICAgIGNoZWNrCS0gTWFwcGluZyBtaXQgQXR0cmlidXRlbjogKFs8YXR0cj46PHdlcnQ+XSkNCisKK0JFU0NIUkVJQlVORzoKKyAgICAgUHJ1ZWZ0LCBvYiBkaWUgU3VtbWUgZGVyIGluIGNoZWNrIGVudGhhbHRlbmVuIE1vZGlmaWthdG9yZW4gZGllIFN1bW1lCisgICAgIGFsbGVyIE1vZGlmaWthdG9yZW4gaW0gU3BpZWxlciB1ZWJlciBkZW4genVnZWxhc3NlbmVuIEdyZW56d2VydCBoZWJ0LgorICAgICAKK1NJRUhFIEFVQ0g6CisgICAgIFF1ZXJ5QXR0cmlidXRlKCksIFF1ZXJ5UmVhbEF0dHJpYnV0ZSgpLCBRdWVyeUF0dHJpYnV0ZU9mZnNldCgpLA0KKyAgICAgU2V0QXR0cigpLCBTZXRBdHRyaWJ1dGUoKSwgU2V0UmVhbEF0dHJpYnV0ZSgpLCBVcGRhdGVBdHRyaWJ1dGVzKCksDQorICAgICBQX0FUVFJJQlVURVMsIFBfQVRUUklCVVRFU19PRkZTRVRTLCBQX0FUVFJJQlVURVNfTU9ESUZJRVIsDQorICAgICBQX1hfQVRUUl9NT0QsIFBfTV9BVFRSX01PRCwgL3N0ZC9saXZpbmcvYXR0cmlidXRlcy5jDQorCisxMy5KdW4uMjAwNCwgTXVhZGliClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vVHJpZ2dlckV2ZW50IGIvZG9jL2xmdW4vVHJpZ2dlckV2ZW50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMDA4OWYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9UcmlnZ2VyRXZlbnQKQEAgLTAsMCArMSw1OSBAQAorCitGVU5LVElPTjoKKyAgICAgdmFyYXJncyBpbnQgVHJpZ2dlckV2ZW50KHN0cmluZyBlaWQsIG1peGVkIGRhdGEpOworCitERUZJTklFUlQgSU46CisgICAgIC9wL2RhZW1vbi9ldmVudGQuYworREVLTEFSSUVSVCBJTjoKKyAgICAgL3N5cy9ldmVudHMuaAorCitBUkdVTUVOVEU6CisgICAgIHN0cmluZyBlaWQsCisgICAgICAgRGllIElEIGRlcyBFdmVudHMsIGRlciBhdXNnZWxvZXN0IHdlcmRlbiBzb2xsLgorICAgICAgIERhIGRpZXNlciBTdHJpbmcgZnVlciBhbGxlIEV2ZW50cyBqZXdlaWxzIGVpbmRldXRpZyBzZWluIG11c3MsIAorICAgICAgIGVtcGZpZWhsdCBlcyBzaWNoLCBmdWVyIGVpZ2VuZSBFdmVudHMgei5CLiBhbHMgUHJhZWZpeCBkZW4gZWlnZW5lbiAKKyAgICAgICBNYWdpZXJuYW1lbiB6dSBuZWhtZW4sIHouQi4gInplc3N0cmFfdnVsa2FuYXVzYnJ1Y2giLgorICAgICAgIEFDSFRVTkc6IElEcywgZGllIG1pdCAnZXZ0X2xpYl8nIGJlZ2lubmVuLCBzaW5kIEFVU1NDSExJRVNTTElDSCBkZXIKKyAgICAgICBNdWRsaWIgdm9yYmVoYWx0ZW4hCisKKyAgICAgbWl4ZWQgZGF0YSwKKyAgICAgICBEYXRlbiwgZGllIGplZGVyIExhdXNjaGVyIHVlYmVyZ2ViZW4gYmVrb21tdC4gS2FubiBlaW4gYmVsaWViaWdlcgorICAgICAgIERhdGVudHlwIHNlaW4uIEdnZi4gZWluIE1hcHBpbmcgb2RlciBBcnJheSBiZW51dHplbi4KKworQkVTQ0hSRUlCVU5HOgorICAgICBEZXIgRXZlbnQgbWl0IGRlciBJRCAnZWlkJyB3aXJkIGF1c2dlbG9lc3QuIE1pdCBrdXJ6ZXIgVmVyem9lZ2VydW5nCisgICAgIChtZWlzdCAwLTJzKSB3ZXJkZW4gYWxsZSBmdWVyICdlaWQnIHJlZ2lzdHJpZXJ0ZW4gTGF1c2NoZXIgZHVyY2ggQXVmcnVmCisgICAgIGVpbmVyIEZ1bmt0aW9uIGluIGlobmVuIGluZm9ybWllcnQ6CisgICAgIGxpc3RlbmVyLT5mdW4oZWlkLCB0cmlnZ2Vyb2IsIGRhdGEpOworICAgICAndHJpZ2dlcm9iJyBpc3QgaGllcmJlaSBkYXMgT2JqZWt0LCB3ZWxjaGUgVHJpZ2dlckV2ZW50KCkgZ2VydWZlbiBoYXQsCisgICAgICdkYXRhJyBkYXMsIHdhcyBkYXMgdHJpZ2dlcm5kZSBPYmpla3RlIGFscyBEYXRlbiB3ZWl0ZXJ2ZXJ0ZWlsZW4gbW9lY2h0ZS4KKyAgICAgRGllIGVpbnplbG5lbiBmdW4oKSBpbiBkZW4gbGF1c2NoZW5kZW4gT2JqZWt0ZW4gbXVlc3NlbiB3aXNzZW4sIHdhcyBzaWUKKyAgICAgbWl0ICdkYXRhJyBhbmZhbmdlbiBzb2xsZW4uIDstKQorCitSVWVDS0dBQkVXRVJUOgorICAgICAxIGZ1ZXIgRXJmb2xnLCA8PTAgZnVlciBNaXNzZXJmb2xnLgorICAgICAxICAgLSBFcmZvbGcsIEV2ZW50ICdlaWQnIHd1cmRlIGF1c2dlbG9lc3QuCisgICAgIC0xICAtIGZhbHNjaGUgQXJndW1lbnRlIHd1cmRlbiB1ZWJlcmdlYmVuCisgICAgIC0yICAtIG5pY2h0LW9lZmZlbnRsaWNoZXIgRXZlbnQgdW5kIGRhcyB0cmlnZ2VybmRlIE9iamVrdCB3dXJkZSBuaWNodAorICAgICAgICAgICBmdWVyIGRpZXNlbiBFdmVudCBmcmVpZ2VnZWJlbiAobW9tZW50YW4gZ2lidCBlcyBub2NoIGtlaW5lCisgICAgICAgICAgIG5pY2h0LW9lZmZlbnRsaWNoZW4gRXZlbnRzKQorICAgICAtMyAgLSBFdmVudCAnZWlkJyBleGlzdGllcnQgbmljaHQsIGQuaC4gZXMgZ2lidCBrZWluZSBMYXVzY2hlci4KKyAgICAgLTQgIC0gRXMgZ2lidCB6dXZpZWxlIG5pY2h0IHZlcmFyYmVpdGV0ZSBFdmVudHMuCisKK0JFTUVSS1VOR0VOOgorCisKK0JFSVNQSUVMRToKKyAgICAgMS4gRWluIFdhZWNodGVyIHdpcmQgYW5nZWdyaWZmZW46CisgICAgICAgIEVWRU5URC0+VHJpZ2dlckV2ZW50KCJ4YW5kX2hvbHpmYWVsbGVybGFnZXJfYW5ncmlmZiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoWyJhbmdyZWlmZXIiOiBlbmVteSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3J0IjogZW52aXJvbm1lbnQodGhpc19vYmplY3QoKSkgXSkgKTsKKyAgICAgICAgQWxsZSBhbmRlcmVuIGFuZ2VtZWxkZXRlbiBXYWVjaHRlciBkZXIgTGFnZXJzIHdlcmRlbiBudW4gaW5mb3JtaWVydAorICAgICAgICB1bmQga29lbm5lbiBpaHJlcnNlaXRzIHJlYWdpZXJlbiAoZGVtIGVyc3RlbiBXYWVjaHRlciB6dWhpbGZlIGtvbW1lbgorICAgICAgICBvZGVyIGF1Y2ggZGllIExhZ2VydG9yZSBzY2hsaWVzc2VuKS4KKworU0lFSEUgQVVDSDoKKyAgICAgZXZlbnRzLCBldmVudGQsIFVucmVnaXN0ZXJFdmVudCgpLCBSZWdpc3RlckV2ZW50KCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogMTUuMDguMjAwNywgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vVW5yZWdpc3RlckV2ZW50IGIvZG9jL2xmdW4vVW5yZWdpc3RlckV2ZW50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZTM2MWEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9VbnJlZ2lzdGVyRXZlbnQKQEAgLTAsMCArMSw0OSBAQAorCitGVU5LVElPTjoKKyAgICAgaW50IFVucmVnaXN0ZXJFdmVudChzdHJpbmcgZWlkLCBvYmplY3QgbGlzdGVuZXIpOworCitERUZJTklFUlQgSU46CisgICAgIC9wL2RhZW1vbi9ldmVudGQuYworREVLTEFSSUVSVCBJTjoKKyAgICAgL3N5cy9ldmVudHMuaAorCitBUkdVTUVOVEU6CisgICAgIHN0cmluZyBlaWQsCisgICAgICAgRGllIElEIGRlcyBFdmVudHMsIHZvbSBkZW0gbWFuIHNpY2ggYWJtZWxkZW4gd2lsbC4KKyAgICAgb2JqZWN0IGxpc3RlbmVyLAorICAgICAgIERhcyBPYmpla3QsIGRhcyBhbHMgTGF1c2NoZXIgYXVzZ2V0cmFnZW4gd2VyZGVuIHNvbGwuCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGFzIE9iamVrdCAnbGlzdGVuZXInIHdpcmQgYWxzIExhdXNjaGVyIGRpZXNlcyBFdmVudHMgYXVzZ2V0cmFnZW4uIEFiCisgICAgIGRpZXNlbSBNb21lbnQgd2lyZCBlcyBiZWkgRXZlbnRzIHZvbSBUeXAgJ2VpZCcgbmljaHQgbWVociBpbmZvcm1pZXJ0LiAgICAgCisKKyAgICAgSGF0IGRlciBFdmVudCAnZWlkJyBpbSBBbnNjaGx1c3Mga2VpbmUgTGF1c2NoZXIgbWVociwgd2lyZCBlciBpbXBsaXppdAorICAgICBnZWxvZXNjaHQuCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIDEgZnVlciBFcmZvbGcsIDw9MCBmdWVyIE1pc3NlcmZvbGcuCisgICAgIDEgICAtIEVyZm9sZywgJ2xpc3RlbmVyJyB3dXJkZSBlaW5nZXRyYWdlbi4KKyAgICAgLTEgIC0gZmFsc2NoZSBBcmd1bWVudGUgdWViZXJnZWJlbgorICAgICAtMiAgLSAnbGlzdGVuZXInIGlzdCBuaWNodCBmdWVyICdlaWQnIHJlZ2lzdHJpZXJ0LgorICAgIAorQkVNRVJLVU5HRU46CisgICAgIFdlbm4gc2ljaCBlaW4gT2JqZWt0IHZvciBaZXJzdG9lcnVuZyBuaWNodCBhYm1lbGRldCwgd2lyZCBlcyBnZ2YuIGJlaW0KKyAgICAgbmFlY2hzdGVuIEF1ZnRyZXRlbiB2b24gJ2VpZCcgYXV0b21hdGlzY2ggYXVzZ2V0cmFnZW4uCisgICAgIEZhbGxzIEJsdWVwcmludHMgbmFjaCBOZXVsYWRlbiBuaWNodCBhdXRvbWF0aXNjaCBhbmdlbWVsZGV0IHNlaW4gc29sbGVuLAorICAgICBzb2xsdGVuIHNpZSBzaWNoIGltIHJlbW92ZSgpIGV4cGxpeml0IGFibWVsZGVuLgorCitCRUlTUElFTEU6CisgICAgIDEuIEVpbiBPYmpla3QgbW9lY2h0ZSBuaWNodCBtZWhyIHVlYmVyIFNwaWVsZXJ0b2RlIGluZm9ybWllcnQgd2VyZGVuOgorICAgICAgICAgIEVWRU5URC0+VW5yZWdpc3RlckV2ZW50KEVWVF9MSUJfUExBWUVSX0RFQVRILCB0aGlzX29iamVjdCgpKTsKKworICAgICAyLiBFaW4gT2JqZWt0IG1vZWNodGUgc2ljaCBiZWkgWmVyc3RvZXJ1bmcgYWJtZWxkZW46CisgICAgICAgdmFyYXJncyBpbnQgcmVtb3ZlKGludCBzaWxlbnQpIHsKKyAgICAgICAgICAgLi4uCisgICAgICAgICAgIEVWRU5URC0+VW5yZWdpc3RlckV2ZW50KCJ6ZXNzdHJhX3Z1bGthbmF1c2JydWNoIix0aGlzX29iamVjdCgpKTsKKyAgICAgICB9CisKK1NJRUhFIEFVQ0g6CisgICAgIGV2ZW50cywgZXZlbnRkLCBVbnJlZ2lzdGVyRXZlbnQoKSwgUmVnaXN0ZXJFdmVudCgpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IDE1LjA4LjIwMDcsIFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1VucmVnaXN0ZXJIZWxwZXJOUEMgYi9kb2MvbGZ1bi9VbnJlZ2lzdGVySGVscGVyTlBDCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMzg0ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9VbnJlZ2lzdGVySGVscGVyTlBDCkBAIC0wLDAgKzEsNDUgQEAKK1VucmVnaXN0ZXJIZWxwZXJOUEMoKQorRlVOS1RJT046CisgICAgIHB1YmxpYyBpbnQgVW5yZWdpc3RlckhlbHBlck5QQyhvYmplY3QgbnBjKTsKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL3BsYXllci9jb21iYXQuYworCitBUkdVTUVOVEU6CisgICAgIG9iamVjdCBucGMKKyAgICAgICBPYmpla3QgZGVzIGhlbGZlbmRlbiBOUEMsIGRlciBhYmdlbWVsZGV0IHdlcmRlbiBzb2xsLgorCitCRVNDSFJFSUJVTkc6CisgICAgIE1pdCBkaWVzZXIgRnVua3Rpb24gd2lyZCBlaW4gZWluZW0gU3BpZWxlciBoZWxmZW5kZXIgTlBDIGltIFNwaWVsZXIKKyAgICAgd2llZGVyIGFiZ2VtZWxkZXQsIHdlbm4gZGllc2VyIGRlbSBTcGllbGVyIGFiIGpldHp0IG5pY2h0IG1laHIgaGlsZnQuCisKKyAgICAgV2VubiBlaW4gSGVsZmVyLU5QQyB6ZXJzdG9lcnQgd2lyZCwgaXN0IGRlciBBdWZydWYgbmljaHQgbm9ldGlnLgorICAgICBCbGVpYnQgZGFzIE9iamVrdCBkZXMgTlBDIGFiZXIgZXhpc3RlbnQsIGJpdHRlIGF1ZiBqZWRlbiBGYWxsIHdpZWRlcgorICAgICBvcmRlbnRsaWNoIGFibWVsZGVuLCBkYSBhbnNvbnN0ZW4gZ2dmLiBkZXIgU3BpZWxlciB1bm5vZXRpZyBibG9ja2llcnQKKyAgICAgd2lyZC4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgMSwgd2VubiBkaWUgQWJtZWxkdW5nIGVyZm9sZ3JlaWNoIHdhci4KKyAgICAgMCBzb25zdCwgei5CLiB3ZW5uIGRlciBOUEMgZ2FyIG5pY2h0IGFscyBIZWxmZXIgcmVnaXN0cmllcnQgd2FyLgorCitCRU1FUktVTkdFTjoKKyAgICAgRGllc2UgRnVua3Rpb24gc2V0enQgYmVpIGRlciBFcmZvbGcgZGllIFByb3BlcnR5IFBfSEVMUEVSX05QQyBpbiA8bnBjPgorICAgICBhdWYgMC4KKworQkVJU1BJRUxFOgorICAgICAxLiBFaW4gTlBDLCBkZXIgZGVtIFNwaWVsZXIgbmljaHQgbWVociBoZWxmZW4gd2lsbCB1bmQgbm9ybWFsZXJ3ZWlzZW4gaW0KKyAgICAgICAgUmF1bSB2ZXJibGVpYmVuIHNvbGw6CisgICAgIHRlbGxfb2JqZWN0KHNwaWVsZXIsICJJY2ggbWFnIERpY2ggbmljaHQgbWVociwgRHUgYmlzdCBkb29mIVxuIik7CisgICAgIGlmIChzcGllbGVyLT5VbnJlZ2lzdGVySGVscGVyTlBDKHRoaXNfb2JqZWN0KCkpICE9IDEpIHsKKyAgICAgICAvLyBkYXMgaXN0IGphIGJsb2VkLi4uCisgICAgICAgcmVtb3ZlKDApOworICAgICB9CisgICAgIGVsc2UgeworICAgICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudCgpLAorICAgICAgICAgICBOYW1lKCkrIiBkcmVodCAiICtzcGllbGVyLT5OYW1lKFdFTSkgKyAiIHNjaG1vbGxlbmQgZGVuIFJ1ZWNrZW4gIgorICAgICAgICAgICAienUuXG4iKTsKKyAgICAgfQorCitTSUVIRSBBVUNIOgorICAgIFVucmVnaXN0ZXJIZWxwZXJOUEMoKQorICAgIFBfSEVMUEVSX05QQwpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vVW5yZWdpc3RlckhlbHBlck9iamVjdCBiL2RvYy9sZnVuL1VucmVnaXN0ZXJIZWxwZXJPYmplY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVmZDg0ZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL1VucmVnaXN0ZXJIZWxwZXJPYmplY3QKQEAgLTAsMCArMSw0NyBAQAorRlVOS1RJT046CisgICAgIGludCBVbnJlZ2lzdGVySGVscGVyT2JqZWN0KG9iamVjdCBoZWxwZXIsIGludCB0eXBlKTsKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL2xpdmluZy9oZWxwZXJzLmMKKworQVJHVU1FTlRFOgorICAgICBvYmplY3QgaGVscGVyCisgICAgICAgRGFzIE9iamVrdCwgZGFzIGFscyBIaWxmc29iamVrdCBkZXJlZ2lzdHJpZXJ0IHdlcmRlbiBzb2xsLgorICAgICBpbnQgdHlwZQorICAgICAgIEhlbGZlcnR5cCwgZWluZXIgZGVyIGluIC9zeXMvbGl2aW5nL2hlbHBlcnMuaCBkZWZpbmllcnRlbiBUeXBlbjoKKyAgICAgICAtIEhFTFBFUl9UWVBFX0FFUklBTCBmdWVyIGRpZSBGbHVnLS9TZWdlbHVudGVyc3R1ZXR6dW5nCisgICAgICAgLSBIRUxQRVJfVFlQRV9BUVVBVElDIGZ1ZXIgVGF1Y2h1bnRlcnN0dWV0enVuZworCitCRVNDSFJFSUJVTkc6CisgICAgIERhcyBhbHMgSGlsZnNvYmpla3QgZnVlciBiZXN0aW1tdGUgQWt0aXZpdGFldGVuIHdpZSB6dW0gQmVpc3BpZWwgVGF1Y2hlbgorICAgICBvZGVyIEZsaWVnZW4gYmVpIGVpbmVtIExlYmV3ZXNlbiByZWdpc3RyaWVydGUgT2JqZWt0ICJoZWxwZXIiIG1lbGRldAorICAgICBzaWNoIGJlaSBkaWVzZW0gYWIuCisgICAgIEhpbndlaXM6IGZ1ZXIgZWluZSB0ZW1wb3JhZXIgZ3VlbHRpZ2UgIk5pY2h0LVp1c3RhZW5kaWdrZWl0IiBrYWVtZSBhdWNoCisgICAgIGluIEZyYWdlLCBpbiBkaWVzZXIgWmVpdCBlaW5mYWNoICIwIiB6dXJ1ZWNrenVnZWJlbiwgc3RhdHQgc2ljaAorICAgICBrb21wbGV0dCBhYnp1bWVsZGVuLgorCitSVUVDS0dBQkVXRVJURToKKyAgICAgIDEgIE9iamVrdCB3dXJkZSBlcmZvbGdyZWljaCBhdXNnZXRyYWdlbiAoSEVMUEVSX1NVQ0NFU1MpCisgICAgIC0xICBhbmdlZ2ViZW5lcyBIaWxmc29iamVrdCBleGlzdGllcnQgbmljaHQgKEhFTFBFUl9OT19DQUxMQkFDS19PQkpFQ1QpCisgICAgIC0zICBhbmdlZ2ViZW5lcyBIaWxmc29iamVrdCB3YXIgZ2FyIG5pY2h0IGFuZ2VtZWxkZXQKKyAgICAgICAgIChIRUxQRVJfTk9USElOR19UT19VTlJFR0lTVEVSKQorCitCRUlTUElFTDoKKyAgICAgRWluZSBsdWZ0Z2VmdWVsbHRlIEJsYXNlIGhhdHRlIHNpY2ggYWxzIFRhdWNoLUhlbGZlciBhbSBTcGllbGVyCisgICAgIGFuZ2VtZWxkZXQsIGlzdCBqZXR6dCBhYmVyIHZlcmJyYXVjaHQgdW5kIG1lbGRldCBzaWNoIGRhaGVyIGFiOgorCisgICAgIC8vIEF1c3RyYWdlbiBpbSBTcGllbGVyb2JqZWt0CisgICAgIHZvaWQgQmxhc2VBdXN0cmFnZW4oKSB7CisgICAgICAgWy4uLl0KKyAgICAgICBpZiAoIFRQLT5VbnJlZ2lzdGVySGVscGVyT2JqZWN0KE1FLCBIRUxQRVJfVFlQRV9BUVVBVElDKQorICAgICAgICAgICAgPT0gSEVMUEVSX1NVQ0NFU1MgKQorICAgICAgICAgcmVtb3ZlKCk7CisgICAgIH0KKworU0lFSEUgQVVDSDoKKyAgICAgRnVua3Rpb25lbjogIFJlZ2lzdGVySGVscGVyT2JqZWN0KCkKKyAgICAgUHJvcGVydGllczogIFBfSEVMUEVSX09CSkVDVFMsIFBfQUVSSUFMX0hFTFBFUlMsIFBfQVFVQVRJQ19IRUxQRVJTCisgICAgIFNvbnN0aWdlczogICAvc3lzL2xpdmluZy9oZWxwZXJzLmgKKworMTkuMDIuMjAxMyBBcmF0aG9ybgorCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9VbndlYXIgYi9kb2MvbGZ1bi9VbndlYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI0YzdmYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL1Vud2VhcgpAQCAtMCwwICsxLDM4IEBACitVbndlYXIoKQorRlVOS1RJT046CisgICAgIHB1YmxpYyBpbnQgVW53ZWFyKG9iamVjdCBvYikgCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC9saXZpbmcvY2xvdGhpbmcuYworCitBUkdVTUVOVEU6CisgICAgIG9iamVjdCBvYgorICAgICAgIERpZSBSdWVzdHVuZyBvZGVyIEtsZWlkdW5nLCBkaWUgYXVzZ2V6b2dlbiB3aXJkLgorCitCRVNDSFJFSUJVTkc6CisgICAgIERhcyBMZWJld2VzZW4sIGluIGRlbSBkaWVzZSBGdW5rdGlvbiBnZXJ1ZmVuIHdpcmQsIHppZWh0IGRpZSBSdWVzdHVuZworICAgICBvZGVyIGRhcyBLbGVpZHVuZ3NzdHVlY2sgPG9iPiBhdXMuCisgICAgIEFCRVI6ICdBdXN6aWVoZW4nIGJlZGV1dGV0IGluIGRpZXNlbSBLb250ZXh0IGxlZGlnbGljaCwgZGFzcyBkaWUKKyAgICAgUnVlc3R1bmcvS2xlaWR1bmcgYXVzIFBfQVJNT1VSUyBiencuIFBfQ0xPVEhJTkcgYXVzZ2V0cmFnZW4gd2lyZC4gRXMKKyAgICAgZmluZGVuIHp1ciBaZWl0IGtlaW5lIFBydWVmdW5nZW4gc3RhdHQsIG9iIGRhcyBMZWJld2VzZW4gZGVuIEdlZ2Vuc3RhbmQKKyAgICAgdWViZXJoYXVwdCBhdXN6aWVoZW4ga2Fubi4gR2VuYXVzb3dlbmlnIHdlcmRlbiBGdW5rdGlvbmVuIHdpZQorICAgICBJbmZvcm1VbndlYXIoKS9SZW1vdmVGdW5jKCkgZ2VydWZlbiBvZGVyIGV0d2FpZ2UgU3RhdC1Cb25pIGRlYWt0aXZpZXJ0LgorCisgICAgIERpZSBGdW5rdGlvbiBpc3QgbnVyIGRhenUgZ2VkYWNodCwgaW0gWnVnZSBkZXMgQXVzemllaGVucyBlaW5lcyBPYmpla3RzCisgICAgIHZvbiBkaWVzZW0gaW0gTGViZXdlc2VuIGdlcnVmZW4genUgd2VyZGVuLgorCitSVWVDS0dBQkVXRVJUOgorICAgICAxLCB3ZW5uIGRhcyBBdXN6aWVoZW4gZXJmb2xncmVpY2ggd2FyLgorICAgICAwIHNvbnN0LgorCitCRU1FUktVTkdFTjoKKyAgICAgTmljaHQgdm9uIEhhbmQgYXVmcnVmZW4sIGVzIHNlaSBkZW5uIG1hbiB3ZWlzcyBnZW5hdSwgd2FzIG1hbiB0dXQuIFVuZCBhbQorICAgICBiZXN0ZW4gYXVjaCBkYW5uIG5pY2h0LgorCitTSUVIRSBBVUNIOgorICAgICBXZWFyKCksIFdlYXJBcm1vdXIoKSwgV2VhckNsb3RoaW5nKCksIFVud2VhckFybW91cigpLCBVbndlYXJDbG90aGluZygpCisgICAgIFBfQ0xPVEhJTkcsIFBfQVJNT1VSUworICAgICBGaWx0ZXJDbG90aGluZygpLCBGaWx0ZXJBcm1vdXJzKCkKKworWlVMRVRaVCBHRUFlTkRFUlQ6CisxNC4wMy4yMDA5LCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9VbndlYXJBcm1vdXIgYi9kb2MvbGZ1bi9VbndlYXJBcm1vdXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZiNTVkYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL1Vud2VhckFybW91cgpAQCAtMCwwICsxLDM4IEBACitVbndlYXJBcm1vdXIoKQorRlVOS1RJT046CisgICAgIHB1YmxpYyBpbnQgVW53ZWFyQXJtb3VyKG9iamVjdCBvYikgCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC9saXZpbmcvY2xvdGhpbmcuYworCitBUkdVTUVOVEU6CisgICAgIG9iamVjdCBvYgorICAgICAgIERpZSBSdWVzdHVuZywgZGllIGF1c2dlem9nZW4gd2lyZC4KKworQkVTQ0hSRUlCVU5HOgorICAgICBEYXMgTGViZXdlc2VuLCBpbiBkZW0gZGllc2UgRnVua3Rpb24gZ2VydWZlbiB3aXJkLCB6aWVodCBkaWUgUnVlc3R1bmcKKyAgICAgPG9iPiBhdXMuCisgICAgIEFCRVI6ICdBdXN6aWVoZW4nIGJlZGV1dGV0IGluIGRpZXNlbSBLb250ZXh0IGxlZGlnbGljaCwgZGFzcyBkaWUKKyAgICAgUnVlc3R1bmcvS2xlaWR1bmcgYXVzIFBfQVJNT1VSUyBhdXNnZXRyYWdlbiB3aXJkLiBFcyBmaW5kZW4genVyIFplaXQKKyAgICAga2VpbmUgUHJ1ZWZ1bmdlbiBzdGF0dCwgb2IgZGFzIExlYmV3ZXNlbiBkZW4gR2VnZW5zdGFuZCB1ZWJlcmhhdXB0CisgICAgIGF1c3ppZWhlbiBrYW5uLiBHZW5hdXNvd2VuaWcgd2VyZGVuIEZ1bmt0aW9uZW4gd2llCisgICAgIEluZm9ybVVud2VhcigpL1JlbW92ZUZ1bmMoKSBnZXJ1ZmVuIG9kZXIgZXR3YWlnZSBTdGF0LUJvbmkgZGVha3RpdmllcnQuCisKKyAgICAgRGllIEZ1bmt0aW9uIGlzdCBudXIgZGF6dSBnZWRhY2h0LCBpbSBadWdlIGRlcyBBdXN6aWVoZW5zIGVpbmVzIE9iamVrdHMKKyAgICAgdm9uIGRpZXNlbSBpbSBMZWJld2VzZW4gZ2VydWZlbiB6dSB3ZXJkZW4uCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIDEsIHdlbm4gZGFzIEF1c3ppZWhlbiBlcmZvbGdyZWljaCB3YXIuCisgICAgIDAgc29uc3QuCisKK0JFTUVSS1VOR0VOOgorICAgICBOaWNodCB2b24gSGFuZCBhdWZydWZlbiwgZXMgc2VpIGRlbm4gbWFuIHdlaXNzIGdlbmF1LCB3YXMgbWFuIHR1dC4gVW5kIGFtCisgICAgIGJlc3RlbiBhdWNoIGRhbm4gbmljaHQuCisKK1NJRUhFIEFVQ0g6CisgICAgIFdlYXIoKSwgV2VhckFybW91cigpLCBXZWFyQ2xvdGhpbmcoKSwgVW53ZWFyKCksIFVud2VhckNsb3RoaW5nKCkKKyAgICAgUF9DTE9USElORywgUF9BUk1PVVJTCisgICAgIEZpbHRlckNsb3RoaW5nKCksIEZpbHRlckFybW91cnMoKQorCitaVUxFVFpUIEdFQWVOREVSVDoKKzE0LjAzLjIwMDksIFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1Vud2VhckNsb3RoaW5nIGIvZG9jL2xmdW4vVW53ZWFyQ2xvdGhpbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU1NjY1NAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL1Vud2VhckNsb3RoaW5nCkBAIC0wLDAgKzEsMzggQEAKK1Vud2VhckNsb3RoaW5nKCkKK0ZVTktUSU9OOgorICAgICBwdWJsaWMgaW50IFVud2VhckNsb3RoaW5nKG9iamVjdCBvYikgCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC9saXZpbmcvY2xvdGhpbmcuYworCitBUkdVTUVOVEU6CisgICAgIG9iamVjdCBvYgorICAgICAgIERhcyBLbGVpZHVuZ3NzdHVjaywgZGFzIGF1c2dlem9nZW4gd2lyZC4KKworQkVTQ0hSRUlCVU5HOgorICAgICBEYXMgTGViZXdlc2VuLCBpbiBkZW0gZGllc2UgRnVua3Rpb24gZ2VydWZlbiB3aXJkLCB6aWVodCBkYXMKKyAgICAgS2xlaWR1bmdzc3R1ZWNrIDxvYj4gYXVzLgorICAgICBBQkVSOiAnQXVzemllaGVuJyBiZWRldXRldCBpbiBkaWVzZW0gS29udGV4dCBsZWRpZ2xpY2gsIGRhc3MgZGllCisgICAgIFJ1ZXN0dW5nL0tsZWlkdW5nIGF1cyBQX0NMT1RISU5HIGF1c2dldHJhZ2VuIHdpcmQuIEVzIGZpbmRlbiB6dXIgWmVpdAorICAgICBrZWluZSBQcnVlZnVuZ2VuIHN0YXR0LCBvYiBkYXMgTGViZXdlc2VuIGRlbiBHZWdlbnN0YW5kIHVlYmVyaGF1cHQKKyAgICAgYXVzemllaGVuIGthbm4uIEdlbmF1c293ZW5pZyB3ZXJkZW4gRnVua3Rpb25lbiB3aWUKKyAgICAgSW5mb3JtVW53ZWFyKCkvUmVtb3ZlRnVuYygpIGdlcnVmZW4uCisKKyAgICAgRGllIEZ1bmt0aW9uIGlzdCBudXIgZGF6dSBnZWRhY2h0LCBpbSBadWdlIGRlcyBBdXN6aWVoZW5zIGVpbmVzIE9iamVrdHMKKyAgICAgdm9uIGRpZXNlbSBpbSBMZWJld2VzZW4gZ2VydWZlbiB6dSB3ZXJkZW4uCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIDEsIHdlbm4gZGFzIEF1c3ppZWhlbiBlcmZvbGdyZWljaCB3YXIuCisgICAgIDAgc29uc3QuCisKK0JFTUVSS1VOR0VOOgorICAgICBOaWNodCB2b24gSGFuZCBhdWZydWZlbiwgZXMgc2VpIGRlbm4gbWFuIHdlaXNzIGdlbmF1LCB3YXMgbWFuIHR1dC4gVW5kIGFtCisgICAgIGJlc3RlbiBhdWNoIGRhbm4gbmljaHQuCisKK1NJRUhFIEFVQ0g6CisgICAgIFdlYXIoKSwgV2VhckFybW91cigpLCBXZWFyQ2xvdGhpbmcoKSwgVW53ZWFyKCksIFVud2VhckFybW91cigpCisgICAgIFBfQ0xPVEhJTkcsIFBfQVJNT1VSUworICAgICBGaWx0ZXJDbG90aGluZygpLCBGaWx0ZXJBcm1vdXJzKCkKKworWlVMRVRaVCBHRUFlTkRFUlQ6CisxNC4wMy4yMDA5LCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9VbndpZWxkRnVuYyBiL2RvYy9sZnVuL1Vud2llbGRGdW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNDkyOWMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9VbndpZWxkRnVuYwpAQCAtMCwwICsxLDUyIEBACitVbndpZWxkRnVuYygpCisKK0ZVTktUSU9OOgorICAgICBpbnQgVW53aWVsZEZ1bmMob2JqZWN0IHdlYXBvbiwgaW50IGluZm8sIG9iamVjdCB1c2VyKTsKKworREVGSU5JRVJUIElOOgorICAgICBlaWdlbmVuIE9iamVrdGVuLCBmdWVyIC9zdGQvd2VhcG9uL2NvbWJhdC5jCisKK0FSR1VNRU5URToKKyAgICAgd2VhcG9uIChvYmplY3QpCisgICAgICAgICAgRGllIFdhZmZlLCBkaWUgd2VnZ2VzdGVja3Qgd2VyZGVuIHNvbGwuCisgICAgIGluZm8gKGludCkKKyAgICAgICAgICBCZWkgKGluZm8mTV9TSUxFTlQpIHdpcmQga2VpbmUgTWVsZHVuZyB1ZWJlciBkYXMgV2Vnc3RlY2tlbgorICAgICAgICAgIGF1c2dlZ2ViZW4uCisgICAgICAgICAgQmVpIChpbmZvJk1fTk9DSEVDSykgd2lyZCBkaWUgV2FmZmUgYXVjaCB3ZWdnZXN0ZWNrdCwgd2VubgorICAgICAgICAgIHNpZSB2ZXJmbHVjaHQgaXN0LiBEaWUgdHJpdHQgaW5zYmVzb25kZXJlIGRhbm4gYXVmLCB3ZW5uIGRlcgorICAgICAgICAgIFNwaWVsZXIsIGRlciBkaWUgV2FmZmUgYmVudXR6dCwgc3RpcmJ0IHVuZCBkaWUgV2FmZmUgaW4KKyAgICAgICAgICBkaWUgTGVpY2hlIGJld2VndCB3aXJkLgorICAgICB1c2VyIChvYmplY3QpCisgICAgICAgICAgRGFzIExlYmV3ZXNlbiwgd2VsY2hlcyBkaWUgV2FmZmUgZ2VyYWRlIGdlenVlY2t0IGhhdCB1bmQgc2llIG51bgorICAgICAgICAgIGF1c3ppZWhlbiB3aWxsLgorCitCRVNDSFJFSUJVTkc6CisgICAgIEhpZXIga29lbm5lbiB6dXNhZXR6bGljaGUgQWJmcmFnZW4gdm9yZ2Vub21tZW4gd2VyZGVuLCBvYiBzaWNoIGRpZQorICAgICBXYWZmZSA8d2VhcG9uPiB3ZWdzdGVja2VuIGxhZXNzdCBvZGVyIG5pY2h0LgorCitSVWVDS0dBQkVXRVJUOgorICAgICAwLCB3ZW5uIHNpY2ggZGllIFdhZmZlIG5pY2h0IHdlZ3N0ZWNrZW4gbGFlc3N0LCBhbnNvbnN0ZW4gdW5nbGVpY2ggMC4KKworQkVNRVJLVU5HRU46CisgICAgIFZlcmZsdWNodGUgV2FmZmVuLCBkaWUgc2ljaCBlcnN0IG5hY2ggRW50ZmVybnVuZyBkZXMgRmx1Y2hlcyB3ZWdzdGVja2VuCisgICAgIGxhc3Nlbiwgc29sbHRlIG1hbiBiZXNzZXIgbWl0IFBfQ1VSU0VEIHJlYWxpc2llcmVuLgorICAgICBTZWxic3Qgd2VubiBtYW4gZWluZW4gV2VydCB1bmdsZWljaCBOdWxsIHp1cnVlY2tnaWJ0LCBpc3QgZGFzIG5vY2gKKyAgICAga2VpbmUgR2FyYW50aWUsIGRhc3Mgc2ljaCBkaWUgV2FmZmUgYXVjaCB3aXJrbGljaCB6dWVja2VuIGxhZXNzdCEgRGVyCisgICAgIFNwaWVsZXIga29lbm50ZSB6dW0gQmVpc3BpZWwgbm9jaCBlaW5lIFdhZmZlIGdlenVlY2t0IGhhYmVuLCBkaWUgc2ljaAorICAgICBuaWNodCB3ZWdzdGVja2VuIGxhZXNzdCwgZXRjLgorICAgICBXZW5uIGlociBzaWNoZXIgc2VpbiB3b2xsdCwgZGFzcyBkZXIgU3BpZWxlciBlaW4gT2JqZWt0IGdlenVlY2t0IGhhdCwKKyAgICAgYmVudXR6dCBiaXR0ZSBJbmZvcm1XZWFyKCkuCisgICAgIEJpdHRlIG5pY2h0IGRyYXVmIHZlcmxhc3NlbiwgZGFzcyB0aGlzX3BsYXllcigpIGRhcyBMZWJld2VzZW4gaXN0LAorICAgICB3ZWxjaGVzIGRpZSBXYWZmZSBnZXp1ZWNrdCB1bmQgd2Vnc3RlY2tlbiB3aWxsLgorICAgICBEaWUgUmVpaGVuZm9sZ2UgZGVyIEFyZ3VtZW50ZSBpc3QgZXR3YXMgdW5zY2hvZW4sIGFiZXIgbGVpZGVyIHd1cmRlIDx1c2VyPgorICAgICBlcmhlYmxpY2ggc3BhZXRlciBoaW56dWdlZnVlZ3QgdW5kIGVzIHdhciB1bm1vZWdsaWNoLCBlaW5pZ2UgaHVuZGVydAorICAgICBPYmpla3RlIHp1IGFlbmRlcm4uCisKK1NJRUhFIEFVQ0gKKyAgICAgUF9XSUVMRF9NU0csIFBfVU5XSUVMRF9NU0csIFBfV0VBUl9NU0csIFBfVU5XRUFSX01TRworICAgICBEb1dpZWxkKCksIERvVW53aWVsZCgpLCBJbmZvcm1XaWVsZCgpLCBJbmZvcm1VbndpZWxkKCksIAorICAgICBVbndpZWxkRnVuYywgV2llbGRGdW5jKCkgCisgICAgIC9zdGQvd2VhcG9uL2NvbWJhdC5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzAyLjAyLjIwMDksIFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1VwZGF0ZUF0dHJpYnV0ZXMgYi9kb2MvbGZ1bi9VcGRhdGVBdHRyaWJ1dGVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNWEyNGYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9VcGRhdGVBdHRyaWJ1dGVzCkBAIC0wLDAgKzEsMzIgQEAKK1VwZGF0ZUF0dHJpYnV0ZXMoKQorRlVOS1RJT046CisgICAgIHZvaWQgVXBkYXRlQXR0cmlidXRlcygpCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC9saXZpbmcvYXR0cmlidXRlcy5jCisKK0JFU0NIUkVJQlVORzoKKyAgICAgUmVjaG5ldCBkYW1pdCBhbGxlIEF0dHJpYnV0bW9kaWZpZXIgZGVyIGltIEludmVudG9yeSBiZWZpbmRsaWNoZW4gDQorICAgICAoUF9YX0FUVFJfTU9ELCBQX1hfSEVBTFRIX01PRCkgdW5kIGdldHJhZ2VuZW4vZ2V6dWVja3RlbiANCisgICAgIChQX01fSEVBTFRIX01PRCwgUF9NX0FUVFJfTU9EKSBPYmpla3RlIHVuZCBhbGxlciBBdHRyaWJ1dG9mZnNldHMgDQorICAgICB6dXNhbW1lbiB1bmQgc3BlaWNoZXJ0IHNpZSBpbiBlaW5lciBpbnRlcm4gZnVlciBBdHRyaWJ1dGUgDQorICAgICB2ZXJ3ZW5kZXRlIFZhcmlhYmxlbi4KKyAgICAgQmVyZWNobmV0IGRhcmF1ZiBiYXNpZXJlbmQgSFAgdW5kIFNQIG5ldS4KKyAgICAgDQorICAgICBEaWUgQmVkaW5ndW5nZW4gZnVlciBkaWUgdWViZXIgUF9USU1FRF9BVFRSX01PRCBnZXNldHp0ZW4gDQorICAgICBBdHRyaWJ1dHZlcmFlbmRlcnVuZ2VuIHdlcmRlbiBpbSBIZWFydGJlYXQgaW4gZGVyIEZ1bmt0aW9uDQorICAgICBhdHRyaWJ1dGVfaGIgdWViZXJwcnVlZnQuDQorCitCRU1FUktVTkdFTjoKKyAgICAgU29sbHRlIG5hY2ggRWluYnJpbmdlbiBuZXVlciBNb2RpZmlrYXRvcm9iamVrdGUgYW0gTGl2aW5nIGdlcnVmZW4KKyAgICAgd2VyZGVuLgorCitTSUVIRSBBVUNIOg0KKwlRdWVyeUF0dHJpYnV0ZSgpLCBRdWVyeVJlYWxBdHRyaWJ1dGUoKSwgUXVlcnlBdHRyaWJ1dGVPZmZzZXQoKSwNCisJU2V0QXR0cmlidXRlKCksIFNldFJlYWxBdHRyaWJ1dGUoKSwgVXBkYXRlQXR0cmlidXRlcygpLA0KKwlTZXRUaW1lZEF0dHJNb2RpZmllcigpLCBRdWVyeVRpbWVkQXR0ck1vZGlmaWVyKCksIA0KKwlEZWxldGVUaW1lZEF0dHJNb2RpZmllcigpLA0KKwlQX0FUVFJJQlVURVMsIFBfQVRUUklCVVRFU19PRkZTRVRTLCBQX1RJTUVEX0FUVFJfTU9ELA0KKwlQX1hfQVRUUl9NT0QsIFBfTV9BVFRSX01PRCwgL3N0ZC9saXZpbmcvYXR0cmlidXRlcy5jDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKzA5LjA1LjIwMDcgYnkgWmVzc3RyYQ0KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1VwZGF0ZVJlc2lzdGFuY2VTdHJlbmd0aHMgYi9kb2MvbGZ1bi9VcGRhdGVSZXNpc3RhbmNlU3RyZW5ndGhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NzQ3YjMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9VcGRhdGVSZXNpc3RhbmNlU3RyZW5ndGhzCkBAIC0wLDAgKzEsMjYgQEAKK1VwZGF0ZVJlc2lzdGFuY2VTdHJlbmd0aHMoKQorCitGVU5LVElPTjoKKyAgICAgcHVibGljIHZvaWQgVXBkYXRlUmVzaXN0YW5jZVN0cmVuZ3RocygpCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC9saXZpbmcvY29tYmF0LmMKKworQkVTQ0hSRUlCVU5HOgorICAgICBEaWUgRnVua3Rpb24gd2lyZCBpbnRlcm4gbWVocm1hbHMgKGR1cmNoIERlZmVuZCwgQWRkUmVzaXN0YW5jZU1vZGlmaWVyCisgICAgIHVuZCBSZW1vdmVSZXNpc3RhbmNlTW9kaWZpZXIpIGF1ZmdlcnVmZW4uIEluIGlociB3aXJkIGRhcyBSZXNpc3RlbnotCisgICAgIG1hcHBpbmcgenVzYW1tZW5nZXJlY2huZXQgdW5kIEVpbnRyYWVnZSBnZWxvZXNjaHQsIGRlcmVuIEVpbnRyYWVnZQorICAgICBpbnZhbGlkIHNpbmQgb2RlciBkZXJlbiBzZXR6ZW5kZSBPYmpla3RlIGdlbG9lc2NodCB3dXJkZW4uCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIGtlaW5lcgorCitTSUVIRSBBVUNIOgorICAgICBCZXJlY2hudW5nOglDaGVja1Jlc2lzdGFuY2UoKSwgRGVmZW5kKCkKKyAgICAgTW9kaWZpa2F0b3JlbjoJQWRkUmVzaXN0YW5jZU1vZGlmaWVyLCBSZW1vdmVSZXNpc3RhbmNlTW9kaWZpZXIoKSwKKwkJCVBfUkVTSVNUQU5DRV9NT0RJRklFUgorICAgICBzaW1wbGUgUmVzaXN0ZW56OglQX1JFU0lTVEFOQ0UsIFBfVlVMTkVSQUJJTElUWQorICAgICBIYXVwdG1hcHBpbmc6CVBfUkVTSVNUQU5DRV9TVFJFTkdUSFMKKyAgICAgYW5kZXJlczoJCWJhbGFuY2UsIC9zdGQvYXJtb3VyL2NvbWJhdC5jLCAvc3RkL2xpdmluZy9jb21iYXQuYworCisyOS5BcHIgMjAwMiwgR2xvaW5zb25ATUcKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1VzZUhhbmRzIGIvZG9jL2xmdW4vVXNlSGFuZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRmYmM4ZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL1VzZUhhbmRzCkBAIC0wLDAgKzEsMzcgQEAKK1VzZUhhbmRzCitGVU5LVElPTjoKKyAgICAgcHVibGljIHZhcmFyZ3MgaW50IFVzZUhhbmRzKG9iamVjdCBvYiwgaW50IG51bSkKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL2xpdmluZy9jb21iYXQuYworCitBUkdVTUVOVEU6CisgICAgIG9iICAtIGRhcyBPYmpla3QsIGRhcyBkaWUgSGFlbmRlIGJlbGVnZW4gc29sbAorICAgICBudW0gLSBkaWUgQW56YWhsIGRlciB6dSBiZWxlZ2VuZGVuIEhhZW5kZSAgICAKKworUlVFQ0tHQUJFV0VSVDoKKyAgICAgMSwgZnVlciBFcmZvbGcKKyAgICAgMCwgc29uc3QgICAgIAorCitCRVNDSFJFSUJVTkc6CisgICAgIEJlbGVndCwgd2VubiBtb2VnbGljaCBIYWVuZGUgZWluZXMgTGl2aW5ncyBkdXJjaCBlaW4gYmVzdGltbXRlcworICAgICBPYmpla3QuIFdlbm4gZGllIEFuemFobCBkZXIgZnJlaWVuIEhhZW5kZSAoUF9NQVhfSEFORFMtUF9VU0VEX0hBTkRTKQorICAgICBrbGVpbmVyIGlzdCBhbHMgIm51bSIsIGRhbm4gc2NobGFlZ3QgZGllc2UgQmVsZWd1bmcgZmVobC4KKworQkVJU1BJRUxFOgorICAgICA+IGhhbHRlIHNlaWwgZmVzdAorICAgICAuLi4KKyAgICAgdGhpc19wbGF5ZXIoKS0+VXNlSGFuZHModGhpc19vYmplY3QoKSwyKTsKKyAgICAgLi4uCisKKyAgICAgPiBsYXNzZSBzZWlsIGxvcworICAgICAuLi4KKyAgICAgdGhpc19wbGF5ZXIoKS0+RnJlZUhhbmRzKHRoaXNfb2JqZWN0KCkpOworICAgICAuLi4KKworU0lFSEUgQVVDSDoKKyAgICAgUF9IQU5EUywgUF9IQU5EU19VU0VEX0JZCisgICAgIFBfTUFYX0hBTkRTLCBQX1VTRURfSEFORFMsIFBfRlJFRV9IQU5EUworICAgICBGcmVlSGFuZHMKKworMS5GZWIuMjAwNCBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vVXNlU2tpbGwgYi9kb2MvbGZ1bi9Vc2VTa2lsbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjEyYmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vVXNlU2tpbGwKQEAgLTAsMCArMSw0OCBAQAorVXNlU2tpbGwoKQorRlVOS1RJT046CisgICAgcHVibGljIHZhcmFyZ3MgbWl4ZWQgVXNlU2tpbGwoc3RyaW5nIHNraWxsLCBtYXBwaW5nIGFyZ3MpCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3RkL2xpdmluZy9za2lsbHMuYworCitBUkdVTUVOVEU6CisgICAgc3RyaW5nIHNraWxsICAgICBTa2lsbC1OYW1lCisgICAgbWFwcGluZyBhcmdzICAgICBBcmd1bWVudGUgKHZlcmFlbmRlcnRlIFNraWxsbWFwcGluZy1JbmZvcm1hdGlvbmVuKQorCitCRVNDSFJFSUJVTkc6CisgICAgQmVudXR6dCBlaW5lbiBTa2lsbC4gRGllc2VyIFNraWxsIHNvbGx0ZSAoYWxzIGdyb3NzZ2VzY2hyaWViZW5lciBTa2lsbCkKKyAgICBpbSBMaXZpbmcgdm9ybGllZ2VuIHVuZCBkYXMgTGl2aW5nIGRhcmYga2VpbiBHZWlzdCBzZWluLgorICAgIAorICAgIERpZSBBcmd1bWVudGUgJ2FyZ3MnIHdlcmRlbiB0ZW1wb3JhZXIgYXVmIGRhcyBTa2lsbG1hcHBpbmcgZGVzIExpdmluZworICAgIGFkZGllcnQgKGFsc28gbnVyIGZ1ZXIgZGllc2VuIEF1ZnJ1ZiB1bmQgU0lfSU5IRVJJVCBndWVsdGlnKS4KKyAgICAKKyAgICBFaW5lIGF1c2Z1ZWhyYmFyZSBTa2lsbC1GdW5rdGlvbiB6dW0gU2tpbGwgd2lyZCBpbiBmb2xnZW5kZXIKKyAgICBSZWloZW5mb2xnZSBiZXN0aW1tdDoKKyAgICAtIGVpbmUgZ2VzZXR6dGUgU0lfQ0xPU1VSRSBudXR6ZW4KKyAgICAtIGVpbiBnZXNldHp0ZXMgU0lfU0tJTExGVU5DIGluIGRlciBnZXNldHp0ZW4gR2lsZGUgbnV0emVuCisgICAgLSBpbSBMaXZpbmcgZGllIEZ1bmt0aW9uICJTdGRTa2lsbF8iK3NraWxsICh6QiBXYWZmZW5za2lsbHMpIG51dHplbgorICAgIC0gUXVlcnlTa2lsbEFiaWxpdHkoKSBudXR6ZW4KKyAgICBEaWUgc28gYmVzdGltbXRlIFNraWxsLUZ1bmt0aW9uIHdpcmQgZGFubiBhbHMgU0lfQ0xPU1VSRSBpbSBTcGllbGVyCisgICAgZ2VzZXR6dCB1bmQgaXN0IGJpcyB6dXIgWmVyc3RvZXJ1bmcgZGVyIGVudHNwcmVjaGVuZGVuIE9iamVrdGUgZ3VlbHRpZy4KKyAgICBEaWUgTWV0aG9kZSB3aXJkIGRhbm4gZ2VydWZlbiAoZGVyIFNraWxsIGFsc28gYW5nZXdhbmR0KS4KKyAgICAKKyAgICBTdGFuZGFyZG1hZXNzaWcgZ2lidCBlaW4gVXNlU2tpbGwoKSBhbHNvIGVpbmZhY2ggZGVuIFNJX1NLSUxMQUJJTElUWS1XZXJ0CisgICAgZWluZXMgU2tpbGxzIHp1cnVlY2ssIGVzIHNlaSBkZW5uLCBlaW5lIEZ1bmt0aW9uIHd1cmRlIGZ1ZXIgZGVuIFNraWxsCisgICAgYW4gZWluZXIgZGVyIG9iZW4gZ2VuYW5udGVuIFN0ZWxsZW4gaW1wbGVtZW50aWVydC4KKyAgICAKKyAgICBFaW4gZXZlbnR1ZWxsIHVlYmVyZ2VvcmRuZXRlciBTa2lsbCAoU0lfSU5IRVJJVCkgd2lyZCBtaXQgZGVtIGR1cmNoIGRlbgorICAgIEF1ZnJ1ZiBkZXIgU2tpbGwtRnVua3Rpb24gdmVyYWVuZGVydGVuIE1hcHBpbmcgbWl0IFVzZVNraWxsKHNraWxsLCBhcmdzKQorICAgIGViZW5mYWxscyBub2NoIGF1c2dlZnVlaHJ0LCBiZXZvciBkYXMgUmVzdWx0YXQgenVydWVja2dlZ2ViZW4gd2lyZC4KKworU0lFSEUgQVVDSDoKKyAgICBTa2lsbHMgTGVybmVuOiAgTGVhcm5Ta2lsbCwgTW9kaWZ5U2tpbGwsIExpbWl0QWJpbGl0eQorICAgICogTnV0enVuZzogICAgICBVc2VTcGVsbAorICAgICogQWJmcmFnZW46ICAgICBRdWVyeVNraWxsLCBRdWVyeVNraWxsQWJpbGl0eQorICAgICogTW9kaWZpa2F0aW9uOiBNb2RpZnlTa2lsbEF0dHJpYnV0ZSwgUXVlcnlTa2lsbEF0dHJpYnV0ZSwKKyAgICAgICAgICAgICAgICAgICAgUXVlcnlTa2lsbEF0dHJpYnV0ZU1vZGlmaWVyLCBSZW1vdmVTa2lsbEF0dHJpYnV0ZU1vZGlmaWVyCisgICAgICAqIFByb3BlcnRpZXM6IFBfU0tJTExfQVRUUklCVVRFUywgUF9TS0lMTF9BVFRSSUJVVEVfT0ZGU0VUUworICAgICogc29uc3RpZzogICAgICBzcHJ1Y2hlcm11ZWR1bmcsIHNraWxsX2luZm9fbGlzdGUKKyAgICAqIFByb3BlcnRpZXM6ICAgUF9ORVdTS0lMTFMKKyAgICBTcGVsbGJvb2s6ICAgICAgTGVhcm4sIFNwZWxsU3VjY2VzcywgRXJmb2xnLCBNaXNzZXJmb2xnCisKKzQuIE9rdCAyMDExIEdsb2luc29uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vVXNlU3BlbGwgYi9kb2MvbGZ1bi9Vc2VTcGVsbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGYxYzRkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vVXNlU3BlbGwKQEAgLTAsMCArMSw3NyBAQAorVXNlU3BlbGwoKQorRlVOS1RJT046CisgICAgcHVibGljIHZhcmFyZ3MgaW50IFVzZVNwZWxsKHN0cmluZyBzdHIsIHN0cmluZyBzcGVsbCkKKworREVGSU5JRVJUIElOOgorICAgIC9zdGQvbGl2aW5nL3NraWxscy5jCisKK0FSR1VNRU5URToKKyAgICBzdHJpbmcgc3RyICAgICAgIFNwZWxsLU9wdGlvbmVuCisgICAgc3RyaW5nIHNwZWxsICAgICBvcHRpb25hbGVyIFNwZWxsbmFtZQorCitCRVNDSFJFSUJVTkc6CisgICAgQmVudXR6dCBlaW5lbiBTcGVsbCwgZGVzc2VuIFNwZWxsbmFtZSAnc3BlbGwnIGdnZiB1ZWJlciBxdWVyeV92ZXJiKCkKKyAgICBlcm1pdHRlbHQgd2lyZC4gRGllc2VyIFNwZWxsIHNvbGx0ZSAoYWxzIGtsZWluZ2VzY2hyaWViZW5lcgorICAgIFNraWxsL1NwZWxsKSBpbSBMaXZpbmcgdm9ybGllZ2VuLgorICAgIAorICAgIERpZSBBcmd1bWVudGUgJ3N0cicgd2VyZGVuIGFscyBTSV9TS0lMTEFSRyB0ZW1wb3JhZXIgaW4gZGFzCisgICAgU2tpbGxtYXBwaW5nIGVpbmdldHJhZ2VuIChhbHNvIG51ciBmdWVyIGRpZXNlbiBBdWZydWYgZ3VlbHRpZykuCisgICAgCisgICAgRWluZSBhdXNmdWVocmJhcmUgU3BlbGwtRnVua3Rpb24genVtIFNwZWxsIHdpcmQgaW4gZm9sZ2VuZGVyCisgICAgUmVpaGVuZm9sZ2UgYmVzdGltbXQ6CisgICAgLSBlaW5lIGdlc2V0enRlIFNJX0NMT1NVUkUgbnV0emVuCisgICAgLSAiVXNlU3BlbGwiIGFuIGVpbmVtIGdlc2V0enRlbiBTSV9TUEVMTEJPT0sgbnV0emVuCisgICAgLSAiVXNlU3BlbGwiIGFuIGRlciBnZXNldHp0ZW4gUF9HVUlMRCBudXR6ZW4KKyAgICAgIC0gW1VzZVNwZWxsIGRlciBHaWxkZSBzdWNodCBpQSBlYmVuZmFsbHMgbnVyIGRlbiBTcGVsbCBhbSBTcGVsbGJvb2tdCisgICAgLSBlaW5lIENsb3N1cmUgbWl0IFJ1ZWNrZ2FiZXdlcnQgMCBlcnN0ZWxsZW4KKyAgICBEaWUgc28gYmVzdGltbXRlIFNwZWxsLUZ1bmt0aW9uIHdpcmQgZGFubiBhbHMgU0lfQ0xPU1VSRSBpbSBTcGllbGVyCisgICAgZ2VzZXR6dCB1bmQgaXN0IGJpcyB6dXIgWmVyc3RvZXJ1bmcgZGVyIGVudHNwcmVjaGVuZGVuIE9iamVrdGUgZ3VlbHRpZy4KKyAgICBEaWUgTWV0aG9kZSB3aXJkIGRhbm4gZ2VydWZlbiAoZGVyIFNwZWxsIGFsc28gYW5nZXdhbmR0KS4KKworICAgIFN0YW5kYXJkbWFlc3NpZyBnaWJ0IGVpbiBVc2VTcGVsbCgpIGFsc28gMCB6dXJ1ZWNrLCBlcyBzZWkgZGVubiwgZWluZQorICAgIEZ1bmt0aW9uIHd1cmRlIGZ1ZXIgZGVuIFNwZWxsIGFuIGVpbmVyIGRlciBvYmVuIGdlbmFubnRlbiBTdGVsbGVuCisgICAgaW1wbGVtZW50aWVydC4KKworICAgIFNJX0lOSEVSSVQgaXN0IGZ1ZXIgU3BlbGxzIGJlaW0gQXVmcnVmIHdpcmt1bmdzbG9zIChnaWx0IGFiZXIgYmVpCisgICAgTGVhcm5Ta2lsbCBub3JtYWwpLgorCisgICAgRWluIER1cmNobGF1ZiB2b24gVXNlU3BlbGwgZHVyY2ggZGVuIFNwaWVsZXIgc2llaHQgaW4gZXR3YSBzbyBhdXM6CisgICAgICAxKSBEaWUgTWV0aG9kZSB3aXJkIGFscyBFbXBmYWVuZ2VyIGZ1ZXIgS29tbWFuZG9zIGJla2FubnQgZ2VtYWNodC4KKyAgICAgICAgIERhcyBwYXNzaWVydCBtaXQgZGVyIEFud2Vpc3VuZworICAgICAgICAgJ2FkZF9hY3Rpb24oIlVzZVNwZWxsIiwgIiIsIDEpOycgaW4gZGVuIERhdGVpZW4gcGxheWVyL2Jhc2UuYyB1bmQKKyAgICAgICAgIGluIGxpdmluZy9ucGMuYy4KKworICAgICAgMikgL3N0ZC9saXZpbmcvc2tpbGxzOjpVc2VTcGVsbCB3aXJkIGR1cmNoIEtvbW1hbmRvIG9kZXIgSGVhcnRiZWF0CisgICAgICAgICBnZXJ1ZmVuLgorICAgICAgCisgICAgICAzKSBVc2VTcGVsbCgpIGVybWl0dGVsdCBlaW5lIFNJX0NMT1NVUkUgb2RlciBkZWxlZ2llcnQgZGllc2VuIEF1ZnJ1ZgorICAgICAgICAgYW4gZGllIGd1ZWx0aWdlIEdpbGRlL2RhcyBTcGVsbGJvb2sgd2VpdGVyLgorICAgICAgCisgICAgICA0KSBFaW5lIGd1ZWx0aWdlIENsb3N1cmUgd2lyZCBhdXNnZWZ1ZWhydC4gVXNlU3BlbGwoKSB1ZWJlcmdpYnQgZGFiZWkKKyAgICAgICAgIGRpZSBTcGVsbC9Ta2lsbC1JbmZvcm1hdGlvbmVuIHVuZCBTSV9TS0lMTEFSRy4KKyAgICAgIAorICAgICAgNC4xLikgSW0gTm9ybWFsZmFsbCBlaW5lciBHaWxkZS9TcGVsbGJvb2sgbGFuZGV0IGRlciBBdWZydWYgdWViZXIKKyAgICAgICAgICAgIC9zdGQvZ2lsZGVuX29iOjpVc2VTcGVsbCgpIGluIC9zdGQvc3BlbGxib29rOjpVc2VTcGVsbCgpIHVuZAorICAgICAgICAgICAgZGllc2VzIHJ1ZnQgZWluZSBTcGVsbGZ1bmt0aW9uIGltIFNwZWxsYm9vayBhdWYuCisgICAgICAgICAgICBEaWUgU3BlbGxmdW5rdGlvbiBhcmJlaXRldCBtaXQgZGVuIFNwZWxsLUluZm9ybWF0aW9uZW4gdW5kCisgICAgICAgICAgICBnaWJ0IGVpbiBFUkZPTEcsIE1JU1NFUkZPTEcgb2RlciAwIGRhZnVlciB6dXJ1ZWNrLCBvYiBkYXMKKyAgICAgICAgICAgIFNwZWxsYm9vayBMZXJuZW4vRmVobGVybWVsZHVuZyBvZGVyIG5pY2h0cyBtYWNoZW4gc29sbC4KKyAgICAgICAgICAgIERlbWVudHNwcmVjaGVuZCB3ZXJkZW4gUF9TUCwgUF9BVFRBQ0tfQlVTWSB1bmQKKyAgICAgICAgICAgIFBfTkVYVF9TUEVMTF9USU1FIGltIFNwZWxsYm9vayBnZWFlbmRlcnQuCisKKyAgICAgIDUuKSBEZXIgQXVmcnVmIGRlciBDbG9zdXJlIGtlaHJ0IHp1cnVlY2sgdW5kIHdpcmQgenVydWVja2dlZ2ViZW4uCisgICAgICAgICAgRGFtaXQgaXN0IGRlciAwLVJ1ZWNrZ2FiZXdlcnQgZGVyIFNwZWxsZnVua3Rpb24gaW0gU3BlbGxib29rCisgICAgICAgICAgYWVxdWl2YWxlbnQgZWluZW0gbmljaHQgYXVzZ2VmdWVocnRlbiBLb21tYW5kby4KKworU0lFSEUgQVVDSDoKKyAgICBTa2lsbHMgTGVybmVuOiAgTGVhcm5Ta2lsbCwgTW9kaWZ5U2tpbGwsIExpbWl0QWJpbGl0eQorICAgICogTnV0enVuZzogICAgICBVc2VTa2lsbAorICAgICogQWJmcmFnZW46ICAgICBRdWVyeVNraWxsLCBRdWVyeVNraWxsQWJpbGl0eQorICAgICogTW9kaWZpa2F0aW9uOiBNb2RpZnlTa2lsbEF0dHJpYnV0ZSwgUXVlcnlTa2lsbEF0dHJpYnV0ZSwKKyAgICAgICAgICAgICAgICAgICAgUXVlcnlTa2lsbEF0dHJpYnV0ZU1vZGlmaWVyLCBSZW1vdmVTa2lsbEF0dHJpYnV0ZU1vZGlmaWVyCisgICAgICAqIFByb3BlcnRpZXM6IFBfU0tJTExfQVRUUklCVVRFUywgUF9TS0lMTF9BVFRSSUJVVEVfT0ZGU0VUUworICAgICogc29uc3RpZzogICAgICBzcHJ1Y2hlcm11ZWR1bmcsIHNraWxsX2luZm9fbGlzdGUKKyAgICAqIFByb3BlcnRpZXM6ICAgUF9ORVdTS0lMTFMKKyAgICBTcGVsbGJvb2s6ICAgICAgVXNlU3BlbGwgKHNwZWxsYm9vayksIExlYXJuLCBTcGVsbFN1Y2Nlc3MKKworNS4gT2t0IDIwMTEgR2xvaW5zb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9WYWxpZGF0ZSBiL2RvYy9sZnVuL1ZhbGlkYXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZjQ3OTEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9WYWxpZGF0ZQpAQCAtMCwwICsxLDQ3IEBACitWYWxpZGF0ZSgpCisKK0ZVTktUSU9OOgorICAgc3RyaW5nIFZhbGlkYXRlKHN0cmluZyBvbmFtZSk7CisKK0RFRklOSUVSVCBJTjoKKyAgIC9zdGQvdmlydHVhbC92X2NvbXBpbGVyLmMKKworQVJHVU1FTlRFOgorICAgb25hbWUKKyAgICAgICBPYmpla3RuYW1lLCBkZXIgZ2VwcnVlZnQgd2VyZGVuIHNvbGwgCisKK1JVZUNLR0FCRVdFUlQ6CisgICAKK0JFU0NIUkVJQlVORzoKKyAgIERpZXNlIEZ1bmt0aW9uIGhhdCBkaWUgQXVmZ2FiZSB6dSB1ZWJlcnBydWVmZW4gb2IgZWluIE9iamVrdCB3ZWxjaGVzCisgICBnZWxhZGVuIHdlcmRlbiBzb2xsLCBpbiBkZW0gVkMgIHVlYmVyaGF1cHQgZXJsYXVidCBpc3QuIERpZXNlciAKKyAgIEZ1bmt0aW9uIHdpcmQgbnVyIGRlciByZWluZSBGaWxlbmFtZSB1ZWJlcmdlYmVuLCBvaG5lIFBmYWQhCisgICBEaWVzZSBGdW5rdGlvbiBtYWNodCBpbSBTdGFuZGFyZC1WQyBpbiAvc3RkLyBuaWNodHMgd2VpdGVyLCBhbHMKKyAgIGRhcyAnLmMnIGFtIEZpbGUgTmFtZW4gYWJ6dXNjaG5laWRlbi4KKyAgIFNvbGx0ZSBkZXIgRGF0ZWluYW1lIGd1ZWx0aWcgc2VpbiBsaWVmZXJ0IGRpZSBGdW5rdGlvbiBhbHMgUnVlY2tnYWJld2VydAorICAgZGVuIEZpbGVuYW1lbiBvaG5lIC5jIHVuZCBzb25zdCAwLgorCitCRU1FUktVTkdFTjoKKyAgIEFtIGJlc3RlbiBydWZ0IG1hbiBpbiBzZWluZW0gVmFsaWRhdGUoKSBkYXMgOjpWYWxpZGF0ZSgpLCB3YXMgZWluZW0gZGllCisgICBBcmJlaXQgYWJuaW1tdCwgZWluIC5jIGFtIEVuZGUgenUgZW50ZmVybmVuLgorCitCRUlTUElFTDoKKyAgIHN0cmluZyBWYWxpZGF0ZShzdHJpbmcgb25hbWUpIHsKKyAgICAgc3RyaW5nIHJhdW0sIHNwaWVsZXI7CisgICAgIC8vLmMgYWJzY2huZWlkZW4KKyAgICAgb25hbWU9OjpWYWxpZGF0ZShvbmFtZSk7CisgICAgIAorICAgICAvLyBmb2xndCBkZXIgUmF1bSBkZW0gTXVzdGVyICJhcmVuYXxuYW1lIj8gV2VubiBuZWluIC0+IHVuZ3VlbHRpZywKKyAgICAgLy8gMCB6dXJlY2tnZWJlbiwgc29uc3QgZGVuIEZpbGVuYW1lbi4KKyAgICAgaWYoc3NjYW5mKG9uYW1lLCIlc3wlcyIscmF1bSxzcGllbGVyKTwyIHx8IHJhdW0hPSJhcmVuYSIpCisgICAgICAgIHJldHVybiAwOworICAgICByZXR1cm4gb25hbWU7CisgICB9CisKK1NJRUhFIEFVQ0g6CisgICAgIHZpcnR1YWxfY29tcGlsZXIKKyAgICAgQ3VzdG9taXplT2JqZWN0KCksIFZhbGlkYXRlKCksIE5vUGFyYU9iamVjdHMoKSwgCisgICAgIFBfQ09NUElMRVJfUEFUSCwgUF9QQVJBCisgICAgIC9zdGQvdmlydHVhbC92X2NvbXBpbGVyLmMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzI3LjEwLjIwMDcsIFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1dlYXIgYi9kb2MvbGZ1bi9XZWFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYzhhZDIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9XZWFyCkBAIC0wLDAgKzEsMzcgQEAKK1dlYXIoKQorRlVOS1RJT046CisgICAgIHB1YmxpYyBpbnQgV2VhcihvYmplY3Qgb2IpIAorCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvbGl2aW5nL2Nsb3RoaW5nLmMKKworQVJHVU1FTlRFOgorICAgICBvYmplY3Qgb2IKKyAgICAgICBEaWUgUnVlc3R1bmcgb2RlciBLbGVpZHVuZywgZGllIGFuZ2V6b2dlbiB3aXJkLgorCitCRVNDSFJFSUJVTkc6CisgICAgIERhcyBMZWJld2VzZW4sIGluIGRlbSBkaWVzZSBGdW5rdGlvbiBnZXJ1ZmVuIHdpcmQsIHppZWh0IGRpZSBSdWVzdHVuZworICAgICBvZGVyIGRhcyBLbGVpZHVuZ3NzdHVlY2sgPG9iPiBhbi4KKyAgICAgQUJFUjogJ0FuemllaGVuJyBiZWRldXRldCBpbiBkaWVzZW0gS29udGV4dCBsZWRpZ2xpY2gsIGRhc3MgZGllCisgICAgIFJ1ZXN0dW5nL0tsZWlkdW5nIGluIFBfQVJNT1VSUyBiencuIFBfQ0xPVEhJTkcgZWluZ2V0cmFnZW4gd2lyZC4gRXMKKyAgICAgZmluZGVuIHp1ciBaZWl0IGtlaW5lIFBydWVmdW5nZW4gc3RhdHQsIG9iIGRhcyBMZWJld2VzZW4gZGVuIEdlZ2Vuc3RhbmQKKyAgICAgdWViZXJoYXVwdCBhbnppZWhlbiBrYW5uLiBHZW5hdXNvd2VuaWcgd2VyZGVuIEZ1bmt0aW9uZW4gd2llIEluZm9ybVdlYXIoKQorICAgICBnZXJ1ZmVuIG9kZXIgZXR3YWlnZSBTdGF0LUJvbmkgYWt0aXZpZXJ0LgorICAgICBEaWUgRnVua3Rpb24gaXN0IG51ciBkYXp1IGdlZGFjaHQsIGltIFp1Z2UgZGVzIEFuemllaGVucyBlaW5lcyBPYmpla3RzCisgICAgIHZvbiBkaWVzZW0gaW0gTGViZXdlc2VuIGdlcnVmZW4genUgd2VyZGVuLgorCitSVWVDS0dBQkVXRVJUOgorICAgICAxLCB3ZW5uIGRhcyBBbnppZWhlbiBlcmZvbGdyZWljaCB3YXIuCisgICAgIDAgc29uc3QuCisKK0JFTUVSS1VOR0VOOgorICAgICBOaWNodCB2b24gSGFuZCBhdWZydWZlbiwgZXMgc2VpIGRlbm4gbWFuIHdlaXNzIGdlbmF1LCB3YXMgbWFuIHR1dC4gVW5kIGFtCisgICAgIGJlc3RlbiBhdWNoIGRhbm4gbmljaHQuCisKK1NJRUhFIEFVQ0g6CisgICAgIFdlYXJBcm1vdXIoKSwgV2VhckNsb3RoaW5nKCksIFVud2VhcigpLCBVbndlYXJBcm1vdXIoKSwgVW53ZWFyQ2xvdGhpbmcoKQorICAgICBQX0NMT1RISU5HLCBQX0FSTU9VUlMKKyAgICAgRmlsdGVyQ2xvdGhpbmcoKSwgRmlsdGVyQXJtb3VycygpCisKK1pVTEVUWlQgR0VBZU5ERVJUOgorMTQuMDMuMjAwOSwgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vV2VhckFybW91ciBiL2RvYy9sZnVuL1dlYXJBcm1vdXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZkOGU5NQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL1dlYXJBcm1vdXIKQEAgLTAsMCArMSwzNyBAQAorV2VhckFybW91cigpCitGVU5LVElPTjoKKyAgICAgcHVibGljIGludCBXZWFyQXJtb3VyKG9iamVjdCBvYikgCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC9saXZpbmcvY2xvdGhpbmcuYworCitBUkdVTUVOVEU6CisgICAgIG9iamVjdCBvYgorICAgICAgIERpZSBSdWVzdHVuZywgZGllIGFuZ2V6b2dlbiB3aXJkLgorCitCRVNDSFJFSUJVTkc6CisgICAgIERhcyBMZWJld2VzZW4sIGluIGRlbSBkaWVzZSBGdW5rdGlvbiBnZXJ1ZmVuIHdpcmQsIHppZWh0IGRpZSBSdWVzdHVuZworICAgICA8b2I+IGFuLgorICAgICBBQkVSOiAnQW56aWVoZW4nIGJlZGV1dGV0IGluIGRpZXNlbSBLb250ZXh0IGxlZGlnbGljaCwgZGFzcyBkaWUKKyAgICAgUnVlc3R1bmcvS2xlaWR1bmcgaW4gUF9BUk1PVVJTIGVpbmdldHJhZ2VuIHdpcmQuIEVzIGZpbmRlbiB6dXIgWmVpdCBrZWluZQorICAgICBQcnVlZnVuZ2VuIHN0YXR0LCBvYiBkYXMgTGViZXdlc2VuIGRlbiBHZWdlbnN0YW5kIHVlYmVyaGF1cHQgYW56aWVoZW4KKyAgICAga2Fubi4gR2VuYXVzb3dlbmlnIHdlcmRlbiBGdW5rdGlvbmVuIHdpZSBJbmZvcm1XZWFyKCkgZ2VydWZlbiBvZGVyCisgICAgIGV0d2FpZ2UgU3RhdC1Cb25pIGFrdGl2aWVydC4KKyAgICAgRGllIEZ1bmt0aW9uIGlzdCBudXIgZGF6dSBnZWRhY2h0LCBpbSBadWdlIGRlcyBBbnppZWhlbnMgZWluZXMgT2JqZWt0cworICAgICB2b24gZGllc2VtIGltIExlYmV3ZXNlbiBnZXJ1ZmVuIHp1IHdlcmRlbi4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgMSwgd2VubiBkYXMgQW56aWVoZW4gZXJmb2xncmVpY2ggd2FyLgorICAgICAwIHNvbnN0LgorCitCRU1FUktVTkdFTjoKKyAgICAgTmljaHQgdm9uIEhhbmQgYXVmcnVmZW4sIGVzIHNlaSBkZW5uIG1hbiB3ZWlzcyBnZW5hdSwgd2FzIG1hbiB0dXQuIFVuZCBhbQorICAgICBiZXN0ZW4gYXVjaCBkYW5uIG5pY2h0LgorCitTSUVIRSBBVUNIOgorICAgICBXZWFyKCksIFdlYXJDbG90aGluZygpLCBVbndlYXIoKSwgVW53ZWFyQXJtb3VyKCksIFVud2VhckNsb3RoaW5nKCkKKyAgICAgUF9DTE9USElORywgUF9BUk1PVVJTCisgICAgIEZpbHRlckNsb3RoaW5nKCksIEZpbHRlckFybW91cnMoKQorCitaVUxFVFpUIEdFQWVOREVSVDoKKzE0LjAzLjIwMDksIFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1dlYXJDbG90aGluZyBiL2RvYy9sZnVuL1dlYXJDbG90aGluZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2MwMjgwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vV2VhckNsb3RoaW5nCkBAIC0wLDAgKzEsMzcgQEAKK1dlYXJDbG90aGluZygpCitGVU5LVElPTjoKKyAgICAgcHVibGljIGludCBXZWFyQ2xvdGhpbmcob2JqZWN0IG9iKSAKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL2xpdmluZy9jbG90aGluZy5jCisKK0FSR1VNRU5URToKKyAgICAgb2JqZWN0IG9iCisgICAgICAgRGFzIEtsZWlkdW5nc3N0dWNrLCBkYXMgYW5nZXpvZ2VuIHdpcmQuCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGFzIExlYmV3ZXNlbiwgaW4gZGVtIGRpZXNlIEZ1bmt0aW9uIGdlcnVmZW4gd2lyZCwgemllaHQgZGFzCisgICAgIEtsZWlkdW5nc3N0dWVjayA8b2I+IGFuLgorICAgICBBQkVSOiAnQW56aWVoZW4nIGJlZGV1dGV0IGluIGRpZXNlbSBLb250ZXh0IGxlZGlnbGljaCwgZGFzcyBkaWUKKyAgICAgUnVlc3R1bmcvS2xlaWR1bmcgaW4gUF9DTE9USElORyBlaW5nZXRyYWdlbiB3aXJkLiBFcyBmaW5kZW4genVyIFplaXQKKyAgICAga2VpbmUgUHJ1ZWZ1bmdlbiBzdGF0dCwgb2IgZGFzIExlYmV3ZXNlbiBkZW4gR2VnZW5zdGFuZCB1ZWJlcmhhdXB0CisgICAgIGFuemllaGVuIGthbm4uIEdlbmF1c293ZW5pZyB3ZXJkZW4gRnVua3Rpb25lbiB3aWUgSW5mb3JtV2VhcigpIGdlcnVmZW4uCisKKyAgICAgRGllIEZ1bmt0aW9uIGlzdCBudXIgZGF6dSBnZWRhY2h0LCBpbSBadWdlIGRlcyBBbnppZWhlbnMgZWluZXMgT2JqZWt0cworICAgICB2b24gZGllc2VtIGltIExlYmV3ZXNlbiBnZXJ1ZmVuIHp1IHdlcmRlbi4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgMSwgd2VubiBkYXMgQW56aWVoZW4gZXJmb2xncmVpY2ggd2FyLgorICAgICAwIHNvbnN0LgorCitCRU1FUktVTkdFTjoKKyAgICAgTmljaHQgdm9uIEhhbmQgYXVmcnVmZW4sIGVzIHNlaSBkZW5uIG1hbiB3ZWlzcyBnZW5hdSwgd2FzIG1hbiB0dXQuIFVuZCBhbQorICAgICBiZXN0ZW4gYXVjaCBkYW5uIG5pY2h0LgorCitTSUVIRSBBVUNIOgorICAgICBXZWFyKCksIFdlYXJBcm1vdXIoKSwgVW53ZWFyKCksIFVud2VhckFybW91cigpLCBVbndlYXJDbG90aGluZygpCisgICAgIFBfQ0xPVEhJTkcsIFBfQVJNT1VSUworICAgICBGaWx0ZXJDbG90aGluZygpLCBGaWx0ZXJBcm1vdXJzKCkKKworWlVMRVRaVCBHRUFlTkRFUlQ6CisxNC4wMy4yMDA5LCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9XZWFyRnVuYyBiL2RvYy9sZnVuL1dlYXJGdW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNmZkNjQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9XZWFyRnVuYwpAQCAtMCwwICsxLDgwIEBACitXZWFyRnVuYygpCisKK0ZVTktUSU9OOgorICAgICBpbnQgV2VhckZ1bmMob2JqZWN0IHJ1ZXN0LCBpbnQgc2lsZW50LCBvYmplY3QgdXNlcik7CisKK0RFRklOSUVSVCBJTjoKKyAgICAgZWlnZW5lbiBPYmpla3RlbiAoZnVlciAvc3RkL2Nsb3RoaW5nL3dlYXIpCisKK0FSR1VNRU5URToKKyAgICAgcnVlc3QgKG9iamVjdCkKKyAgICAgICAgICBEaWUgUnVlc3R1bmcvS2xlaWR1bmcsIGRpZSBhbmdlem9nZW4gd2VyZGVuIHNvbGwuCisgICAgIHNpbGVudCAoaW50KQorICAgICAgICAgIE9iIGRhYmVpIGVpbmUgTWVsZHVuZyBhdXNnZWdlYmVuIHdpcmQuCisgICAgIHVzZXIgKG9iamVjdCkKKyAgICAgICAgICBEYXMgTGViZXdlc2VuLCB3ZWxjaGVzIGRpZSBSdWVzdHVuZy9LbGVpZHVuZyBhbnppZWhlbiB3aWxsLgorCitCRVNDSFJFSUJVTkc6CisgICAgIE1pdCBkaWVzZXIgRnVua3Rpb24ga2FubiBtYW4gcHJ1ZWZlbiwgb2Igc2ljaCBkYXMgS2xlaWR1bmdzc3R1ZWNrIGJ6dy4KKyAgICAgUnVlc3R1bmcgPHJ1ZXN0PiB2b24gdGhpc19wbGF5ZXIoKSBhbnppZWhlbiBsYWVzc3Qgb2RlciBuaWNodC4KKyAgICAgS2FubiBkaWUgUnVlc3R1bmcgYW5nZXpvZ2VuIHdlcmRlbiwgc28gbXVzcyBlaW4gV2VydCB1bmdsZWljaCAwCisgICAgIHp1cnVlY2tnZWdlYmVuIHdlcmRlbi4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgMCwgd2VubiBzaWNoIGRpZSBSdWVzdHVuZyBuaWNodCBhbnppZWhlbiBsYWVzc3QsIGFuc29uc3RlbiB1bmdsZWljaCAwLgorCitCRU1FUktVTkdFTjoKKyAgICAgQml0dGUgbmljaHQgZGFyYXVmIHZlcmxhc3NlbiwgZGFzcyBkZXIgU3BpZWxlciBkYXMgT2JqZWt0IGF1Y2ggd2lya2xpY2gKKyAgICAgYW56aWVodCwgd2VubiBtYW4gaGllciAxIHp1cnVlY2tnaWJ0LgorICAgICBTcGV6aWVsbCBiZWkgU2NoaWxkZW4ga2FubiBkYXMgQW56aWVoZW4gdHJvdHogZWluZXMgUnVlY2tnYWJld2VydGVzIAorICAgICAhPSAwIGltbWVyIG5vY2ggc2NoaWVmIGdlaGVuLCB3ZW5uIGRlciBTcGllbGVyIGtlaW5lIEhhbmQgbWVociBmcmVpIGhhdC4KKyAgICAgV2VubiBpaHIgc2ljaGVyIHNlaW4gd29sbHQsIGRhc3MgZGVyIFNwaWVsZXIgZWluIE9iamVrdCBhbmdlem9nZW4gaGF0LAorICAgICBiZW51dHp0IGJpdHRlIEluZm9ybVdlYXIoKS4KKyAgICAgQml0dGUgbmljaHQgZHJhdWYgdmVybGFzc2VuLCBkYXNzIHRoaXNfcGxheWVyKCkgZGFzIGF1c3ppZWhlbmRlIExlYmV3ZXNlbgorICAgICBpc3QuCisgICAgIERpZSBSZWloZW5mb2xnZSBkZXIgQXJndW1lbnRlIGlzdCBldHdhcyB1bnNjaG9lbiwgYWJlciBsZWlkZXIgd3VyZGUgPHVzZXI+CisgICAgIGVyaGVibGljaCBzcGFldGVyIGhpbnp1Z2VmdWVndCB1bmQgZXMgd2FyIHVubW9lZ2xpY2gsIGVpbmlnZSBodW5kZXJ0CisgICAgIE9iamVrdGUgenUgYWVuZGVybi4KKworQkVJU1BJRUxFOgorICAgICBFaW4gSGVsbSwgZGVyIG51ciB2b24gRWxmZW4gZ2V0cmFnZW4gd2VyZGVuIGthbm46CisKKyAgICAgaW5oZXJpdCAic3RkL2FybW91ci5jIjsKKworICAgICAjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCisgICAgIGNyZWF0ZSgpCisgICAgIHsKKyAgICAgICA6OmNyZWF0ZSgpOworCisgICAgICAgU2V0UHJvcChQX0FSTU9VUl9UWVBFLCBBVF9IRUxNRVQpOworICAgICAgIC8qIHppZyB3ZWl0ZXJlIFNldFByb3AncywgdW0gZGVuIEhlbG0genUga29uZmlndXJpZXJlbiAqLworCisgICAgICAgLyogV2VhckZ1bmMoKSBpc3QgaW0gSGVsbSBzZWxic3QgenUgZmluZGVuICovCisgICAgICAgU2V0UHJvcChQX1dFQVJfRlVOQywgdGhpc19vYmplY3QoKSk7CisgICAgIH0KKworICAgICBpbnQgV2VhckZ1bmMob2JqZWN0IG1lLCBpbnQgc2lsZW50LCBvYmplY3QgdXNlcikKKyAgICAgeworICAgICAgIGlmICh1c2VyLT5RdWVyeVByb3AoUF9SQUNFKSA9PSAiRWxmIikKKyAgICAgICAgIHJldHVybiAxOyAgIC8qIEVsZmVuIGR1ZXJmZW4gZGVuIEhlbG0gdHJhZ2VuICovCisKKyAgICAgICAvKiBEaWUgYW5kZXJlbiBSYXNzZW4gc29sbHRlbiB6dW1pbmRlc3QgZXJmYWhyZW4ga29lbm5lbiwgd2llc28KKyAgICAgICAgICBzaWUgZGVuIEhlbG0gbmljaHQgdHJhZ2VuIGtvZW5uZW4uLi4gKi8KKyAgICAgICBpZiAoIXNpbGVudCkKKyAgICAgICAgICAgd3JpdGUoICJEZXIgSGVsbSBydXRzY2h0IERpciBpbW1lciB1ZWJlciBEZWluZSBydW5kZW4gIgorICAgICAgICAgICAgICAgICArIk9ocmVuLlxuIiApOworICAgICAgIHJldHVybiAwOworICAgICB9CisKKyAgICAgR2lidCBqZXR6dCBlaW4gTmljaHQtRWxmICJ0cmFnZSBoZWxtIiBlaW4sIHNvIGJla29tbXQgZXIgZGllIE1lbGR1bmcKKyAgICAgIkRlciBIZWxtIHJ1dHNjaHQgRGlyIGltbWVyIHVlYmVyIERlaW5lIHJ1bmRlbiBPaHJlbi4iLCBFbGZlbiBkYWdlZ2VuCisgICAgIHBhc3N0IGRhcyBUZWlsIHdpZSBhbmdlZ29zc2VuLgorCitTSUVIRSBBVUNIOgorICAgICBQX1dFQVJfTVNHLCBQX1VOV0VBUl9NU0csIFBfV0lFTERfTVNHLCBQX1VOV0lFTERfTVNHCisgICAgIERvV2VhcigpLCBEb1Vud2VhcigpLCBJbmZvcm1VbndlYXIoKSwgSW5mb3JtV2VhcigpCisgICAgIC9zdGQvY2xvdGhpbmcvd2Vhci5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzAyLjAyLjIwMDksIFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL1dpZWxkRnVuYyBiL2RvYy9sZnVuL1dpZWxkRnVuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2UyOTlmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vV2llbGRGdW5jCkBAIC0wLDAgKzEsNzcgQEAKK1dpZWxkRnVuYygpCisKK0ZVTktUSU9OOgorICAgICBpbnQgV2llbGRGdW5jKG9iamVjdCB3ZWFwb24sIGludCBzaWxlbnQsIG9iamVjdCB1c2VyKTsKKworREVGSU5JRVJUIElOOgorICAgICBlaWdlbmVuIE9iamVrdGVuIChmdWVyIC9zdGQvd2VhcG9uL2NvbWJhdCkKKworQVJHVU1FTlRFOgorICAgICB3ZWFwb24gKG9iamVjdCkKKyAgICAgICAgICBEaWUgV2FmZmUsIGRpZSBnZXp1ZWNrdCB3ZXJkZW4gc29sbC4KKyAgICAgc2lsZW50IChpbnQpCisgICAgICAgICAgT2IgZGFiZWkgZWluZSBNZWxkdW5nIGF1c2dlZ2ViZW4gd2VyZGVuIHNvbGwuCisgICAgIHVzZXIgKG9iamVjdCkKKyAgICAgICAgICBEYXMgTGViZXdlc2VuLCB3ZWxjaGVzIGRpZSBXYWZmZSB6dWVja2VuIHdpbGwuCisKK0JFU0NIUkVJQlVORzoKKyAgICAgSW4gZGllc2VyIEZ1bmt0aW9uIGthbm4gbWFuIHp1c2FldHpsaWNoZSBBYmZyYWdlbiB2b3JuZWhtZW4sIG9iIHNpY2gKKyAgICAgZGllIFdhZmZlIDx3ZWFwb24+IHZvbiA8dXNlcj4genVlY2tlbiBsYWVzc3Qgb2RlciBuaWNodC4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgMCwgd2VubiBkaWUgV2FmZmUgbmljaHQgZ2V6dWVja3Qgd2VyZGVuIGthbm4sIHNvbnN0IHVuZ2xlaWNoIDAuCisKK0JFTUVSS1VOR0VOOgorICAgICBTZWxic3Qgd2VubiBtYW4gZWluZW4gV2VydCB1bmdsZWljaCBOdWxsIHp1cnVlY2tnaWJ0LCBpc3QgZGFzIG5vY2gKKyAgICAga2VpbmUgR2FyYW50aWUsIGRhc3Mgc2ljaCBkaWUgV2FmZmUgYXVjaCB3aXJrbGljaCB6dWVja2VuIGxhZXNzdCEgRGVyCisgICAgIFNwaWVsZXIga29lbm50ZSB6dW0gQmVpc3BpZWwgbm9jaCBlaW5lIFdhZmZlIGdlenVlY2t0IGhhYmVuLCBkaWUgc2ljaAorICAgICBuaWNodCB3ZWdzdGVja2VuIGxhZXNzdCwgZXRjLgorICAgICBXZW5uIGlociBzaWNoZXIgc2VpbiB3b2xsdCwgZGFzcyBkZXIgU3BpZWxlciBlaW4gT2JqZWt0IGdlenVlY2t0IGhhdCwKKyAgICAgYmVudXR6dCBiaXR0ZSBJbmZvcm1XaWVsZCgpLgorICAgICBCaXR0ZSBuaWNodCBkcmF1ZiB2ZXJsYXNzZW4sIGRhc3MgdGhpc19wbGF5ZXIoKSBkYXMgTGViZXdlc2VuIGlzdCwKKyAgICAgd2VsY2hlcyBkaWUgV2FmZmUgenVlY2tlIHdpbGwuCisgICAgIERpZSBSZWloZW5mb2xnZSBkZXIgQXJndW1lbnRlIGlzdCBldHdhcyB1bnNjaG9lbiwgYWJlciBsZWlkZXIgd3VyZGUgPHVzZXI+CisgICAgIGVyaGVibGljaCBzcGFldGVyIGhpbnp1Z2VmdWVndCB1bmQgZXMgd2FyIHVubW9lZ2xpY2gsIGVpbmlnZSBodW5kZXJ0CisgICAgIE9iamVrdGUgenUgYWVuZGVybi4KKworQkVJU1BJRUxFOgorICAgICBFaW5lIFdhZmZlLCBkaWUgc2ljaCBuaWNodCB2b24gWndlcmdlbiB6dWVja2VuIGxhZXNzdDoKKworICAgICBpbmhlcml0ICJzdGQvd2VhcG9uIjsKKworICAgICAjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorICAgICAjaW5jbHVkZSA8Y29tYmF0Lmg+CisKKyAgICAgY3JlYXRlKCkKKyAgICAgeworICAgICAgIDo6Y3JlYXRlKCk7CisKKyAgICAgICAuLi4gLyogemlnIFNldFByb3AncywgdW0gZGllIFdhZmZlIHp1IGtvbmZpZ3VyaWVyZW4gKi8KKworICAgICAgIC8qIFdpZWxkRnVuYygpIGlzdCBpbiBkZXIgV2FmZmUgc2VsYnN0IHp1IGZpbmRlbiAqLworICAgICAgIFNldFByb3AoUF9XSUVMRF9GVU5DLCB0aGlzX29iamVjdCgpKTsKKyAgICAgfQorCisgICAgIGludCBXaWVsZEZ1bmMob2JqZWN0IHdlYXBvbiwgaW50IHNpbGVudCwgb2JqZWN0IHVzZXIpCisgICAgIHsKKyAgICAgICAvKiBOaWNodC1ad2VyZ2UgZHVlcmZlbiBkaWUgV2FmZmUgenVlY2tlbiAqLworICAgICAgIGlmICh1c2VyLT5RdWVyeVByb3AoUF9SQUNFKSAhPSAiWndlcmciKQorICAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgICAvKiBBbnNvbnN0ZW4gc2FnZW4gd2lyIGV2dGwuLCB3YXJ1bSBkYXMgWnVlY2tlbiBuaWNodCBrbGFwcHQuLi4gKi8KKyAgICAgICBpZiAoIXNpbGVudCkKKyAgICAgICAgIHdyaXRlKCAiRGVpbmUga2xlaW5lbiBIYWVuZGNoZW4ga29lbm5lbiBkZW4gR3JpZmYgbmljaHQgIisKKyAgICAgICAgICAgICAgICAidW1rbGFtbWVybi5cbiIpOworCisgICAgICAgLyogLi4udW5kIGJyZWNoZW4gZGFzIFp1ZWNrZW4gYWIuICovCisgICAgICAgcmV0dXJuIDA7CisgICAgIH0KKworU0lFSEUgQVVDSDoKKyAgICAgUF9XSUVMRF9NU0csIFBfVU5XSUVMRF9NU0csIFBfV0VBUl9NU0csIFBfVU5XRUFSX01TRworICAgICBEb1dpZWxkKCksIERvVW53aWVsZCgpLCBJbmZvcm1VbndpZWxkKCksIEluZm9ybVdpZWxkKCkgCisgICAgIFVud2llbGRGdW5jLCBXaWVsZEZ1bmMgCisgICAgIC9zdGQvd2VhcG9uL2NvbWJhdC5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMDIuMDIuMjAwOSwgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vV2l0aERyYXcgYi9kb2MvbGZ1bi9XaXRoRHJhdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTUzMmEyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vV2l0aERyYXcKQEAgLTAsMCArMSw0MiBAQAorV2l0aERyYXcoKQorRlVOS1RJT046CisgICAgIGludCBXaXRoRHJhdyhpbnQgYW1vdW50KTsKKworREVGSU5JRVJUIElOOgorICAgICAvcC9kYWVtb24vemVudHJhbGJhbmsuYworCitBUkdVTUVOVEU6CisgICAgIGludCBhbW91bnQJLSBhbmdlZm9yZGVydGUgR2VsZG1lbmdlCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGFtaXQgd2lyZCBiZWkgZGVyIFplbnRyYWxiYW5rIGVpbmUgYmVzdGltbXRlIE1lbmdlIEdlbGQgYW5nZWZvcmRlcnQuCisgICAgIERlciBSdWVja2dhYmV3ZXJ0IGhhZW5ndCB2b20gS2Fzc2Vuc3RhbmQgZGVyIFplbnRyYWxiYW5rIGFiIHVuZCBpc3QKKyAgICAgZW50d2VkZXIgYW1vdW50IG9kZXIgYW1vdW50LzMuCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIE1lbmdlIGRlcyBiZWkgZGVyIFplbnRyYWxiYW5rICJhYmdlaG9iZW5lbiIgR2VsZGVzLgorCitCRUlTUElFTEU6CisgICAgICNpbmNsdWRlIDxiYW5rLmg+CisgICAgIC4uLgorICAgICBpZihaRU5UUkFMQkFOSy0+V2l0aERyYXcoNTAwMDApPDUwMDAwKQorICAgICAgd3JpdGUoYnJlYWtfc3RyaW5nKAorICAgICAgICJMZWlkZXIga29lbm5lbiB3aXIgaWhuZW4ga2VpbmVuIHZvbGxlbiBadXNjaHVzcyB6dSBpaHJlbSBIb3RlbGJhdSAiCisgICAgICAgImdlYmVuISIsCisgICAgICAgIkRlciBCZWFtdGUgc2FndDogIiw3OCkpOworICAgICAgc2F5KGJyZWFrX3N0cmluZygKKyAgICAgICAiTGVpZGVyIGtvZW5uZW4gd2lyIGlobmVuIGtlaW5lbiB2b2xsZW4gWnVzY2h1c3MgenUgaWhyZW0gSG90ZWxiYXUgIgorICAgICAgICJnZWJlbiEiLAorICAgICAgICJEZXIgQmVhbXRlIHNhZ3QgenUgIit0aGlzX3BsYXllcigpLT5uYW1lKFdFTSkrIjogIiw3OCkpOworICAgICAgLi4uCisKK0JFTUVSS1VOR0VOOgorICAgICBVbnNlcmUgWmVudHJhbGJhbmsgaXN0IGtvcnJ1cHQsIHZvciBhbGxlbSBkYWR1cmNoLCBkYXNzIGluIExhZWRlbiB1bmQKKyAgICAgYW4gYW5kZXJlbiBTdGVsbGVuIEdlbGQgZXJ6ZXVndCB3aXJkLgorCitTSUVIRSBBVUNIOgorICAgICBHZWxkaGFuZGxpbmc6CUFkZE1vbmV5KEwpLCBRdWVyeU1vbmV5KEwpCisgICAgIFplbnRyYWxiYW5rOglQYXlJbihMKSwgX3F1ZXJ5X2N1cnJlbnRfbW9uZXkoTCkKKyAgICAgU29uc3RpZ2VzOgkJL2l0ZW1zL21vbmV5LmMsIC9zeXMvYmFuay5oCisKKzI3LiBBcHIgMjAwNCBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vX19JTklUIGIvZG9jL2xmdW4vX19JTklUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwOGI2NTUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9fX0lOSVQKQEAgLTAsMCArMSwxMiBAQAorU1lOT1BTSVM6CisJX19JTklUCisKK0RFU0NSSVBUSU9OOgorCVRoaXMgZnVuY3Rpb24gaXMgY29uc3RydWN0ZWQgYXV0b21hZ2ljYWxseSBieSB0aGUgcGFyc2VyIGF0CisJY29tcGlsZXIsIGlmIHRoZSBwYXJzZXIgd2FzIGNvbXBpbGVkIHdpdGggI2RlZmluZQorCUlOSVRJQUxJU0FUSU9OX19JTklULiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBpbnRlbmRlZCB0byBiZQorCWRlZmluZWQgYnkgdGhlIGxwYyBvYmplY3RzLCBhbmQgbmV2ZXIgdG8gYmUgY2FsbGVkIGZyb20gbHBjCisJb2JqZWN0cy4gVGhpcyBtYW4gcGFnZSBpcyBoZXJlIGp1c3QgZm9yIGNvbXBsZXRlbmVzcy4KKworU0VFIEFMU086CisJaW5pdGlhbGlzYXRpb24oTFBDKQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vX3F1ZXJ5X2N1cnJlbnRfbW9uZXkgYi9kb2MvbGZ1bi9fcXVlcnlfY3VycmVudF9tb25leQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmI3ZWU1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vX3F1ZXJ5X2N1cnJlbnRfbW9uZXkKQEAgLTAsMCArMSwzMiBAQAorX3F1ZXJ5X2N1cnJlbnRfbW9uZXkoKQorRlVOS1RJT046CisgICAgIGludCBfcXVlcnlfY3VycmVudF9tb25leSgpCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3AvZGFlbW9uL3plbnRyYWxiYW5rLmMKKworQkVTQ0hSRUlCVU5HOgorICAgICBFcyB3aXJkIHp1cnVlY2tnZWdlYmVuLCB3aWV2aWVsIEdlbGQgZGllIFplbnRyYWxiYW5rIGJlc2l0enQuCisKK0JFSVNQSUVMRToKKyAgICAgI2luY2x1ZGUgPGJhbmsuaD4KKyAgICAgLi4uCisgICAgIGlmKFpFTlRSQUxCQU5LLT5fcXVlcnlfY3VycmVudF9tb25leSgpPDMwMDAwKSB7CisgICAgICB3cml0ZShicmVha19zdHJpbmcoCisgICAgICAgIkxlaWRlciBrb2VubmVuIHdpciBpaHJlbiBCYXVzcGFydmVydHJhZyBkZXJ6ZWl0IG5pY2h0IGVpbmxvZXNlbi4iLAorICAgICAgICJEZXIgQmVhbXRlIHNhZ3Q6ICIsNzgpKTsKKyAgICAgIHNheShicmVha19zdHJpbmcoCisgICAgICAgIkxlaWRlciBrb2VubmVuIHdpciBpaHJlbiBCYXVzcGFydmVydHJhZyBkZXJ6ZWl0IG5pY2h0IGVpbmxvZXNlbi4iLAorICAgICAgICJEZXIgQmVhbXRlIHNhZ3QgenUgIit0aGlzX3BsYXllcigpLT5uYW1lKFdFTSkrIjogIiw3OCkpOworICAgICB9CisKK0JFTUVSS1VOR0VOOgorICAgICBVbnNlcmUgWmVudHJhbGJhbmsgaXN0IGtvcnJ1cHQsIHZvciBhbGxlbSBkYWR1cmNoLCBkYXNzIGluIExhZWRlbiB1bmQKKyAgICAgYW4gYW5kZXJlbiBTdGVsbGVuIEdlbGQgZXJ6ZXVndCB3aXJkLgorCitTSUVIRSBBVUNIOgorICAgICBHZWxkaGFuZGxpbmc6CUFkZE1vbmV5KEwpLCBRdWVyeU1vbmV5KEwpCisgICAgIFplbnRyYWxiYW5rOglXaXRoRHJhdyhMKSwgUGF5SW4oTCkKKyAgICAgU29uc3RpZ2VzOgkJL2l0ZW1zL21vbmV5LmMsIC9zeXMvYmFuay5oCisKKzI3LiBBcHIgMjAwNCBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vX3VucGFyc2VkX2FyZ3MgYi9kb2MvbGZ1bi9fdW5wYXJzZWRfYXJncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTUyN2I4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vX3VucGFyc2VkX2FyZ3MKQEAgLTAsMCArMSwyOSBAQAorX3VucGFyc2VkX2FyZ3MoKQorRlVOS1RJT046CisgICAgIHZhcmFyZ3Mgc3RyaW5nIF91bnBhcnNlZF9hcmdzKGludCBsZXZlbCkKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL3BsYXllci9jb21tYW5kLmM6CisKK0FSR1VNRU5URToKKyAgICAgbGV2ZWwKKyAgICAgICAgICBHaWJ0IGFuLCB3aWV2aWVsIGRlcyBUZXh0ZXMgIndlZ2dlcGFyc2VkIiB3ZXJkZW4gc29sbC4KKworQkVTQ0hSRUlCVU5HOgorICAgICBHaWJ0IGRlbiBUZXh0IGRlcyBsZXR6dGVuIEJlZmVobHMgZGVzIFNwaWVsZXJzIChvaG5lIGRhcyBCZWZlaGxzd29ydAorICAgICBzZWxic3QpIHp1cnVlY2suICJsZXZlbCIgZ2lidCBkYWJlaSBhbiwgd2lldmllbCBnZXBhcnNlZCB3aXJkOgorICAgICBsZXZlbCA9IDAgOiBHYXIga2VpbiBQYXJzaW5nLgorICAgICAgICAgICAgICAgICAtPiBlbnRzcHJpY2h0IGVpbmVtIHF1ZXJ5X2NvbW1hbmQoKQorICAgICBsZXZlbCA9IDEgOiBEZXIgVGV4dCB3aXJkIGluIEtsZWluYnVjaHN0YWJlbiB1bWdld2FuZGVsdCwgZG9wcGVsdGUKKyAgICAgICAgICAgICAgICAgTGVlcnplaWNoZW4gd2VyZGVuIGVudGZlcm50LgorICAgICBsZXZlbCA9IDIgOiBTZW1pa29saSwgS29tbWF0YSB1bmQgRG9wcGVscHVua3RlIHdlcmRlbiBpbiBMZWVyemVpY2hlbgorCQkgdW1nZXdhbmRlbHQsIGRvcHBlbHRlIExlZXJ6ZWljaGVuIHVuZCBBcnRpa2VsIChkZXIsIGRpZSwKKwkJIGRhcywgZWluLC4uLikgd2VyZGVuIGVudGZlcm50LgorCitSVWVDS0dBQkVXRVJUOgorICAgICBEZXIgZ2VwYXJzdGUgVGV4dC4KKworU0lFSEUgQVVDSDoKKyAgICAgcXVlcnlfY29tbWFuZCgpCisKKzcuQXVnIDIwMDcgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL2FjY2Vzc19yaWdodHMgYi9kb2MvbGZ1bi9hY2Nlc3NfcmlnaHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NTk3NjEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9hY2Nlc3NfcmlnaHRzCkBAIC0wLDAgKzEsNzUgQEAKK2FjY2Vzc19yaWdodHMoKQorCitGVU5LVElPTjoKKyAgICBpbnQgYWNjZXNzX3JpZ2h0cyhzdHJpbmcgZXVpZCwgc3RyaW5nIGZpbGUpOworCitERUZJTklFUlQgSU46CisgICAgYWNjZXNzX3JpZ2h0cy5jIChtdXNzIG1hbiBzZWxiZXIgc2NocmVpYmVuKQorCitQQVJBTUVURVI6CisgICAgZXVpZAorICAgICAgICBEaWUgZXVpZCBkZXNqZW5pZ2VuLCBkZXIgYXVmIGRhcyBWZXJ6ZWljaG5pcyBzY2hyZWliZW4gd2lsbAorICAgIGZpbGUKKyAgICAgICAgTmFtZSBkZXIgRGF0ZWksIGF1ZiBkaWUgenVnZWdyaWZmZW4gd2VyZGVuIHNvbGwKKworQkVTQ0hSRUlCVU5HOgorICAgIGFjY2Vzc19yaWdodHMoKSB3aXJkIGltbWVyIGRhbm4gYXVmZ2VydWZlbiwgd2VubiBqZW1hbmQsIGRlciBuaWNodAorICAgIHNvd2llc28gc2Nob24gc2NocmVpYmJlcmVjaHRpZ3QgaXN0LCBpbiBkaWUgRGF0ZWkvZGFzIFZlcnplaWNobmlzIGZpbGUKKyAgICBzY2hyZWliZW4gb2RlciBsb2VzY2hlbiB3aWxsLgorCisgICAgQW5oYW5kIHZvbiBldWlkIGthbm4gbWFuIGRhbm4gZW50c2NoZWlkZW4sIG9iIGRlciBTY2hyZWlienVncmlmZiBlcmxhdWJ0CisgICAgd2lyZCBvZGVyIG5pY2h0LgorCitSVUVDS0dBQkVXRVJUOgorICAgIDAsIHdlbm4gZGVyIFp1Z3JpZmYgdmVyd2VpZ2VydCB3aXJkLAorICAgIDEsIHdlbm4gZGVyIFp1Z3JpZmYgZXJsYXVidCB3aXJkLgorCitCRUlTUElFTEU6CisgICAgLyogL2QvaW5zZWxuL3dhcmdvbi9hY2Nlc3NfcmlnaHRzLmMgKi8KKworICAgIGludCBhY2Nlc3NfcmlnaHRzKHN0cmluZyBldWlkLCBzdHJpbmcgZmlsZSkKKyAgICB7CisgICAgICBzdHJpbmcgZGlyLCByZXN0OworCisgICAgICAvLyBDYXR3ZWF6bGUgZGFyZiBhdWYgYWxsZXMgenVncmVpZmVuICgqYXJnbCogO14pCisgICAgICBpZiAoZXVpZCA9PSAiY2F0d2VhemxlIikKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgIC8vIFJlY2h0ZSBhdWYgZWluemVsbmUgVmVyemVpY2huaXNzZSBlcm1pdHRlbG46CisgICAgICBpZiAoc3NjYW5mKGZpbGUsICIlcy8lcyIsIGRpciwgcmVzdCkgIT0gMikKKyAgICAgICAgcmVzdCA9IGZpbGU7CisKKyAgICAgIC8vIEpvZiB1bmQgQm9pbmcgZHVlcmZlbiBhbiBUYXJrbyBSZXViIHJ1bXBmdXNjaGVuOgorICAgICAgaWYgKGRpciA9PSAidGFya28iICYmIChldWlkID09ICJqb2YiIHx8IGV1aWQgPT0gImJvaW5nIikpCisgICAgICAgIHJldHVybiAxOworCisgICAgICAvLyBBbnRoZWEgZGFyZiBkaWUgS2FydGVuIHZvbiBBdXJvcmEgdW5kIGRlciBQaXJhdGVuaG9laGxlIGJlYXJiZWl0ZW46CisgICAgICBpZiAoZGlyID09ICJNQVBTIiAmJiAKKyAgICAgICAgICBtZW1iZXIoICh7IkF1cm9yYSIsICJQaXJhdGVuaG9laGxlIiB9KSwgcmVzdCkgPj0gMCAmJiAKKyAgICAgICAgICBldWlkID09ICJhbnRoZWEiKQorICAgICAgICByZXR1cm4gMTsKKworICAgICAgLy8gYWxsZSBhbmRlcmVuIGR1ZXJmZW4gbmljaHQhCisgICAgICByZXR1cm4gMDsKKyAgICB9CisKK0JFTUVSS1VOR0VOOgorICAgIGZpbGUgaXN0IGltbWVyIHJlbGF0aXYgenUgZGVtIFZlcnplaWNobmlzLCBpbiBkZW0gZGFzIGFjY2Vzc19yaWdodHMuYworICAgIGxpZWd0ISBXaWxsIGFsc28gamVtYW5kIGF1ZiAvZC9pbnNlbG4vd2FyZ29uL3RhcmtvL21hY3Jvcy5oIHNjaHJlaWJlbiwKKyAgICB3aXJkIGZpbGUgInRhcmtvL21hY3Jvcy5oIiB1ZWJlcmdlYmVuLgorCisgICAgSW4gVmVyemVpY2huaXNzZW4gdm9uIE1hZ2llcm4gbWl0IGVpbmVtIExldmVsID49IEVMREVSX0xWTCB3aXJkIGRhcworICAgIGFjY2Vzc19yaWdodHMuYyBOSUNIVCBhdXNnZXdlcnRldCAoZGEgZGFtaXQgYW5kZXJlIE1hZ2llciB6Qi4gYW4KKyAgICBFcnptYWdpZXJyZWNodGUgZ2VsYW5nZW4ga29lbm50ZW4pLgorCisgICAgRXMgd2lyZCBpbW1lciBudXIgRUlOIGFjY2Vzc19yaWdodHMuYyBhdXNnZXdlcnRldCwgbmFlbWxpY2ggZGFzIGluIGRlcgorICAgIHRpZWZzdGVuIFZlcnplaWNobmlzZWJlbmUuCisKKyAgICBNYW4ga2FubiBzb3dvaGwgaW4gc2VpbmVuIFJlZ2lvbnN2ZXJ6ZWljaG5pc3NlbiBhbHMgYXVjaCBpbiBzZWluZW4KKyAgICBIb21ldmVyemVpY2huaXNzZW4gYWNjZXNzX3JpZ2h0cy5jLURhdGVpZW4gYW5sZWdlbi4KKworICAgIEdBTlogV0lDSFRJRyEhIQorICAgIEZ1ZXIgZGllIERhdGVpZW4sIGRpZSBldnRsLiB2b24gYW5kZXJlbiBhbmdlbGVndCB3ZXJkZW4sIGlzdCBtYW4gaW1tZXIKKyAgICBub2NoIHNlbGJzdCB2ZXJhbnR3b3J0bGljaCEgV2VubiBqZW1hbmQgYWxzbyBlaW4gR2ViaWV0IGJlaSBEaXIgYW4tCisgICAgc2NobGllc3N0LCBtdXNzIGVzIGVyc3Qgdm9uIGRlbiB2ZXJhbnR3b3J0bGljaGVuIFJlZ2lvbnNtYWdpZXJuIGFiZ2VzZWduZXQKKyAgICBzZWluIQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vYnVmZmVyX2hwIGIvZG9jL2xmdW4vYnVmZmVyX2hwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZTdiMWIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9idWZmZXJfaHAKQEAgLTAsMCArMSw3NiBAQAorRlVOS1RJT046CisgICAgaW50IGJ1ZmZlcl9ocCggaW50IHZhbCwgaW50IHJhdGUgKTsKKworREVGSU5JRVJUIElOOgorICAgIC9zdGQvbGl2aW5nL2xpZmUuYworCitBUkdVTUVOVEU6CisgICAgdmFsOiAgR2VzYW10ZSBIZWlsdW5nLgorICAgIHJhdGU6IExQLVJhdGUuCisgICAgICAgIAorQkVTQ0hSRUlCVU5HOgorICAgIEVyaG9laHQgZGllIExQIGVpbmVzIFNwaWVsZXJzIGF1dG9tYXRpc2NoIGluc2dlc2FtdCB1bSBkZW4gV2VydCAidmFsIi4KKyAgICBQcm8gaGVhcnRfYmVhdCgpIHdpcmQgaWhtIGRhYmVpIGRlciBXZXJ0ICJyYXRlIiB6dWdlZnVlaHJ0LgorICAgIFNvbGxlbiBuZWJlbiBQX0hQIG5vY2ggd2VpdGVyZSBQcm9wcyBtYW5pcHVsaWVydCB3ZXJkZW4gLSBic3B3LiB6dXIKKyAgICBQX0ZPT0QgLSBiaWV0ZXQgc2ljaCBkaWUgRnVua3Rpb24gY29uc3VtZSgpIGFuLgorCitSVUVDS0dBQkVXRVJURToKKyAgICBEZXIgZ2V0YW5rdGUgV2VydCBwcm8gaGVhcnRfYmVhdCgpLgorCitCRU1FUktVTkc6CisgICAgU29sbHRlIHZvbiBqZWRlciB0cmFnYmFyZW4gSGVpbHVuZyBnZW51dHp0IHdlcmRlbiwgd2VsY2hlIGRlbiBTcGllbGVyCisgICAgZGFyYXVmIHNjaGxpZXNzZW4gbGFzc2VuIGthbm4sIGF1ZiBuYXR1ZXJsaWNoZW0gdW5kIG5pY2h0bWFnaXNjaGVtIFdlZworICAgIChFc3NlbiwgVHJpbmtlbikgZ2VoZWlsdCB3b3JkZW4genUgc2Vpbi4KKworQkVJU1BJRUw6CisgICAgI2RlZmluZSBUUCB0aGlzX3BsYXllcigpCisgICAgLi4uCisKKyAgICBpbnQgaGVpbHVuZz0xOworICAgIC4uLgorCisgICAgY3JlYXRlKCkKKyAgICB7CisgICAgIDo6Y3JlYXRlKCk7CisgICAgIFNldFByb3AoUF9OQU1FLCJIZWlscGZsYW56ZSIpOworICAgICAuLi4KKworICAgICBBZGRDbWQoImlzcyIsImVhdCIpOworICAgIH0KKworICAgIGludCBlYXQoc3RyaW5nIHN0cikKKyAgICB7CisgICAgICBub3RpZnlfZmFpbCgiV0FTIHdpbGxzdCBEdSBlc3Nlbj9cbiIpOworICAgICAgaWYgKCAhc3RyIHx8ICFpZChzdHIpICkKKyAgICAgICByZXR1cm4gMDsKKyAgICAgIC4uLgorCisgICAgICBpZiAoICFUUC0+ZWF0X2Zvb2QoMjUpICkKKyAgICAgICByZXR1cm4gMTsKKworICAgICAgVFAtPmJ1ZmZlcl9ocCgyMCw1KTsKKyAgICAgIFRQLT5idWZmZXJfc3AoODAsMTApOworICAgICAgaGVpbHVuZy0tOworICAgICAgd3JpdGUoQlMoIkR1IGZ1ZWhsc3QgbGFuZ3NhbSwgd2llIERlaW5lIEtyYWVmdGUgenVydWVja2tlaHJlbi4iKSk7CisKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHJlc2V0KCkKKyAgICB7CisgICAgICBoZWlsdW5nPTE7CisgICAgICA6OnJlc2V0KCk7CisgICAgfQorCisgICAgRXMgd2lyZCBkdXJjaCBlYXRfZm9vZCBnZXRlc3RldCwgb2IgZGVyIFNwaWVsZXIgbm9jaCBnZW51ZWdlbmQgZXNzZW4ga2Fubi4KKyAgICBXZW5uIGphLCBrcmllZ3QgdW5zZXIgSGVsZCBkaWUgMjUgYXV0b21hdGlzY2ggb2JlbiBkcmF1ZiB1bmQgYXVzc2VyZGVtCisgICAgMjAgTFAgaW4gNS1MUC1TY2hyaXR0ZW4gdW5kIDgwIEtQIGluIDEwLUxQLVNjaHJpdHRlbiBndXRnZXNjaHJpZWJlbi4KKworU0lFSEUgQVVDSDoKKyAgICAgQWVobmxpY2g6ICBoZWFsX3NlbGYsIHJlc3RvcmVfc3BlbGxfcG9pbnRzLCByZXN0b3JlX2hpdF9wb2ludHMsIAorICAgICAgICAgICAgICAgIGJ1ZmZlcl9zcAorICAgICBUYW5rZW46ICAgIGNvbnN1bWUsIGRyaW5rX2FsY29ob2wsIGRyaW5rX3NvZnQsIGVhdF9mb29kCisgICAgIFByb3BzOiAgICAgUF9TUCwgUF9IUCwKKyAgICAgS29uemVwdGU6ICBoZWlsdW5nCisKKzkuIEF1Z3VzdCAyMDE1IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9idWZmZXJfc3AgYi9kb2MvbGZ1bi9idWZmZXJfc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM3MzQxYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL2J1ZmZlcl9zcApAQCAtMCwwICsxLDM2IEBACitGVU5LVElPTjoKKyAgICBpbnQgYnVmZmVyX3NwKCBpbnQgdmFsLCBpbnQgcmF0ZSApOworCitERUZJTklFUlQgSU46CisgICAgL3N0ZC9saXZpbmcvbGlmZS5jCisKK0FSR1VNRU5URToKKyAgICB2YWw6ICBHZXNhbXRlIEhlaWx1bmcuCisgICAgcmF0ZTogS1AtUmF0ZS4KKyAgICAgICAgCitCRVNDSFJFSUJVTkc6CisgICAgRXJob2VodCBkaWUgS1AgZWluZXMgU3BpZWxlcnMgYXV0b21hdGlzY2ggaW5zZ2VzYW10IHVtIGRlbiBXZXJ0ICJ2YWwiLgorICAgIFBybyBoZWFydF9iZWF0KCkgd2lyZCBpaG0gZGFiZWkgZGVyIFdlcnQgInJhdGUiIHp1Z2VmdWVocnQuCisgICAgU29sbGVuIG5lYmVuIFBfU1Agbm9jaCB3ZWl0ZXJlIFByb3BzIG1hbmlwdWxpZXJ0IHdlcmRlbiAtIGJzcHcuIHp1cgorICAgIFBfRk9PRCAtIGJpZXRldCBzaWNoIGRpZSBGdW5rdGlvbiBjb25zdW1lKCkgYW4uCisKK1JVRUNLR0FCRVdFUlRFOgorICAgIERlciBnZXRhbmt0ZSBXZXJ0IHBybyBoZWFydF9iZWF0KCkuCisKK0JFTUVSS1VORzoKKyAgICBTb2xsdGUgdm9uIGplZGVyIHRyYWdiYXJlbiBIZWlsdW5nIGdlbnV0enQgd2VyZGVuLCB3ZWxjaGUgZGVuIFNwaWVsZXIKKyAgICBkYXJhdWYgc2NobGllc3NlbiBsYXNzZW4ga2FubiwgYXVmIG5hdHVlcmxpY2hlbSB1bmQgbmljaHRtYWdpc2NoZW0gV2VnCisgICAgKEVzc2VuLCBUcmlua2VuKSBnZWhlaWx0IHdvcmRlbiB6dSBzZWluLgorCitCRUlTUElFTDoKKyAgICBzLiBCc3AuIHp1ICJidWZmZXJfaHAiCisKK1NJRUhFIEFVQ0g6CisgICAgIEFlaG5saWNoOiAgaGVhbF9zZWxmLCByZXN0b3JlX3NwZWxsX3BvaW50cywgcmVzdG9yZV9oaXRfcG9pbnRzLCAKKyAgICAgICAgICAgICAgICBidWZmZXJfaHAKKyAgICAgVGFua2VuOiAgICBjb25zdW1lLCBkcmlua19hbGNvaG9sLCBkcmlua19zb2Z0LCBlYXRfZm9vZAorICAgICBQcm9wczogICAgIFBfU1AsIFBfSFAsCisgICAgIEtvbnplcHRlOiAgaGVpbHVuZworCis5LiBBdWd1c3QgMjAxNSBHbG9pbnNvbgorCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9idXlfb2JqIGIvZG9jL2xmdW4vYnV5X29iagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjE5OTViCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vYnV5X29iagpAQCAtMCwwICsxLDQyIEBACitidXlfb2JqKCkKKworRlVOS1RJT046CisJc3RhdGljIHN0cmluZyBidXlfb2JqKG1peGVkIG9iLCBpbnQgc2hvcnQpOworCitERUZJTklFUlQgSU46CisJL3N0ZC9zaG9wLmMKKworQVJHVU1FTlRFOgorCW9iIC0gZGVyIEdlZ2Vuc3RhbmQgYmVpIGRlbSBnZXBydWVmdCB3ZXJkZW4gc29sbCwgb2IgZGVyIExhZGVuIGlobgorCSAgICAgYW4gdGhpc19wbGF5ZXIoKSB2ZXJrYXVmdC4gU29sbHRlIGVzIHNpY2ggaGllcmJlaSB1bSBlaW4KKwkgICAgIEZpeGVkT2JqZWN0IGhhbmRlbG4sIHdpcmQgZWluIFN0cmluZyB1ZWJlcmdlYmVuLCBhbnNvbnN0ZW4gZWluCisJICAgICBvYmplY3QuCisgICAgICAgIHNob3J0IC0gQmlzaGVyIG5vY2ggbmljaHQgaW4gQmVudXR6dW5nLiBBYmVyIGZ1ZXIgZGllIFp1a3VuZnQKKyAgICAgICAgICAgICB2b3JnZXNlaG4sIGZhbGxzIG1hbiBtZWhyZXJlIE9iamVrdGUgYXVmIGVpbm1hbCBrYXVmdC4KKyAgICAgICAgICAgICBFaW4gYXVzd2VydGVuIGlzdCBrZWluZSBQZmxpY2h0LCB3YWVyZSBhYmVyIHByYWt0aXNjaCwgZGFtaXQKKyAgICAgICAgICAgICBkZXIgU2Nyb2xsIGRhYmVpIG5pY2h0IHp1IGdyb3NzIHdpcmQuCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgICAgIEVpbiBTdHJpbmcgd2FzIGRlciBIYWVuZGxlciBzYWdlbiBzb2xsIHdpZXNvIGRlciBHZWdlbnN0YW5kIG5pY2h0CisJdmVya2F1ZnQgd2lyZC4gRGVyIFN0cmluZyB3aXJkIGRhYmVpIHdpZSBmb2xndCB1bWdlYnJvY2hlbjoKKyAgICAgICAgYnJlYWtfc3RyaW5nKHN0ciwgNzgsIE5hbWUoV0VSLCAxKSsiIHNhZ3Q6ICIpCitCRVNDSFJFSUJVTkc6CisJRHVyY2ggdWViZXJzY2hyZWliZW4gZGllc2VyIEZ1bmt0aW9uIGlzdCBlcyBtb2VnbGljaCBiZXN0aW1tdGUKKwlPYmpla3RlICh3aWUgei5iLiBRdWVzdG9iamVrdGUpIG51ciBhbiBhdXNnZXdhZWhsdGUgU3BpZWxlciB6dQorCXZlcmthdWZlbikuIEFiZXIgYXVjaCBhYmZyYWdlbiBvYiBkZXIgTGFkZW4gdWViZXJoYXVwdCBtaXQKKwl0aGlzX3BsYXllcigpIGhhbmRlbHQsIHNpbmQgbW9lZ2xpY2guCisKK0JFSVNQSUVMRToKKwlzdGF0aWMgc3RyaW5nIGJ1eV9vYmoobWl4ZWQgb2IsIGludCBzaG9ydCkKKwl7CisJICAgaWYgKFBMLT5RdWVyeVByb3AoUF9SQUNFKT09Ilp3ZXJnIikKKwkgICAgICByZXR1cm4gIkljaCB2ZXJrYXVmZSBuaWNodHMgYW4gWndlcmdlISI7CisJICAgcmV0dXJuIDo6YnV5X29iaihvYiwgc2hvcnQpOworCX0KKworU0lFSEUgQVVDSDoKKwlzZWxsX29iaigpLCBBZGRGaXhlZE9iamVjdCgpLCBSZW1vdmVGaXhlZE9iamVjdCgpLCBTZXRTdG9yYWdlUm9vbSgpLAorICAgICAgICAvc3RkL3Nob3AuYworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBUaHUgTWFyIDQgMTU6MjY6MTMgMTk5OSBieSBQYWRyZWljCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9jYXRjaF9tc2cgYi9kb2MvbGZ1bi9jYXRjaF9tc2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JmMDljOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL2NhdGNoX21zZwpAQCAtMCwwICsxLDE1IEBACitjYXRjaF9tc2coKQorCitTWU5PUFNJUzoKKyAgICB2b2lkIGNhdGNoX21zZyhtaXhlZCAqYXJyLCBvYmplY3Qgb2JqKQorCitERVNDUklQVElPTjoKKyAgICBXaGVuIHNheSgpLCB0ZWxsX29iamVjdCgpICBvciB0ZWxsX3Jvb20oKSBhcmUgdXNlZCB3aXRoIGFuIGFycmF5IAorICAgIGFzIG1lc3NhZ2UsIHRoZSBhcnJheSB3aWxsIGJlIHBhc3NlZCB0byBjYXRjaF9tZXNzYWdlKCkgaW4gYWxsIGxpdmluZworICAgIG9iamVjdHMgdGhhdCBjYW4gaGVhciBpdCwgaW5zdGVhZCBvZiB3cml0aW5nIHRvIHRoZSB1c2VyIHJlc3AuCisgICAgc2VuZGluZyB0byBjYXRjaF90ZWxsKCkuIFRoaXMgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50CisgICAgY29tbXVuaWNhdGlvbiBwcm90b2NvbHMgYmV0d2VlbiBsaXZpbmdzLiBUaGUgc2Vjb25kIGRlbm90ZXMKKyAgICB0aGUgb2JqZWN0IHRoYXQgaGFzIHNlbnQgdGhlIG1lc3NhZ2UuCisKK1NFRSBBTFNPOgorIHNheShFKSwgdGVsbF9yb29tKEUpLCB0ZWxsX29iamVjdChFKSwgY2F0Y2hfdGVsbChMKQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vY2F0Y2hfdGVsbCBiL2RvYy9sZnVuL2NhdGNoX3RlbGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY0ODMyYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL2NhdGNoX3RlbGwKQEAgLTAsMCArMSwyNSBAQAorY2F0Y2hfdGVsbCgpCisKK1NZTk9QU0lTOgorCXZvaWQgY2F0Y2hfdGVsbChzdHJpbmcpCisKK0RFU0NSSVBUSU9OOgorCVdoZW4gYSBtZXNzYWdlIGlzIHNlbnQgdG8gYSBub25pbnRlcmFjdGl2ZSBwbGF5ZXIsIHZpYSBzYXkoKSwKKwl0ZWxsX29iamVjdCwgdGVsbF9yb29tKCksIHByaW50ZigpIG9yIHdyaXRlKCksIGl0IHdpbGwgZ2V0IHRvIHRoZQorCWZ1bmN0aW9uIGNhdGNoX3RlbGwoc3RyaW5nKS4gVGhpcyB3aWxsIGVuYWJsZSBjb21tdW5pY2F0aW9ucyBiZXR3ZWVuCisJTlBDcyBhbmQgZnJvbSBhIHBsYXllciB0byBhbiBOUEMuCisKKwlBbHNvLCBpZiBhbiBpbnRlcmFjdGl2ZSBvYmplY3QgaXMgYmVpbmcgc2hhZG93ZWQgYW5kIHRoZQorCXNoYWRvdyBoYXMgY2F0Y2hfdGVsbCgpIGRlZmluZWQsIGl0IHdpbGwgcmVjZWl2ZSBhbGwgb3V0cHV0CisJdGhhdCB3b3VsZCBvdGhlcndpc2UgYmUgd3JpdHRlbiB0byB0aGUgdXNlci4KKworCUlmIGEgbWVzc2FnZSBpcyBzZW50IGJ5IGFuIGludGVyYWN0aXZlIG9iamVjdCwgY2F0Y2hfdGVsbCgpIGlzCisJbm90IGNhbGxlZCBpbiB0aGF0IG9iamVjdCwgdG8gcHJldmVudCByZWN1cnNpdmUgY2FsbHMuIFRodXMKKwljYXRjaF90ZWxsKCkgaW4gaW50ZXJhY3RpdmUgb2JqZWN0cyBjYW4gYmUgdXNlZCB0byBmaWx0ZXIgdGhlCisJb3V0cHV0IHRoYXQgZ29lcyB0byB0aGUgdXNlcnMuCisKKwlUaGUgZWZ1biBzaG91dCgpIHNlbmRzIHRvIGludGVyYWN0aXZlIG9iamVjdHMgb25seS4KKworU0VFIEFMU086CisJZW5hYmxlX2NvbW1hbmRzKEUpLCBzYXkoRSksIHRlbGxfb2JqZWN0KEUpLCB0ZWxsX3Jvb20oRSksCisJd3JpdGUoRSksIGNhdGNoX21zZyhMKSAKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL2NoZWNrX2FuZF91cGRhdGVfdGltZWRfa2V5IGIvZG9jL2xmdW4vY2hlY2tfYW5kX3VwZGF0ZV90aW1lZF9rZXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEzYzI2MQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL2NoZWNrX2FuZF91cGRhdGVfdGltZWRfa2V5CkBAIC0wLDAgKzEsOTMgQEAKK2NoZWNrX2FuZF91cGRhdGVfdGltZWRfa2V5KCkKKworRlVOS1RJT046CisgICAgICAgcHVibGljIGludCBjaGVja19hbmRfdXBkYXRlX3RpbWVkX2tleShpbnQgZHVyYXRpb24sIHN0cmluZyBrZXkpCisgICAgICAgCitERUZJTklFUlQgSU46CisgICAgICAgL3N0ZC9saXZpbmcvbGlmZS5jICAgIAorCitBUkdVTUVOVEU6CisgICAgICAgaW50IGR1cmF0aW9uOiBJbiB3aWV2aWVsIFNla3VuZGVuIHdpcmQgPGtleT4gd2llZGVyIGZyZWlnZWJlYmVuLAorICAgICAgICAgICAgICAgICAgICAgKHouQi4gd2FubiBrYW5uIGRlciBTcGllbGVyIGFuIGRpZXNlciBTdGVsbGUgZWluZSBuZXVlIAorICAgICAgICAgICAgICAgICAgICAgSGVpbHVuZyBiZWtvbW1lbikuCisgICAgICAgc3RyaW5nIGtleSAgOiBFaW5kZXV0aWdlciBOYW1lLCB3aXJkIHp1c2FtbWVuIG1pdCA8ZHVyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICBnZXNwZWljaGVydC4KKworQkVTQ0hSRUlCVU5HOgorICAgICAgIERpZXNlIEZ1bmt0aW9uIGhhdCBkaWUgQXVmZ2FiZSwgWmVpdHNwZXJyZW4gdmVyc2NoaWVkZW5zdGVyIEFydAorICAgICAgIGVpbmZhY2ggenUgZXJtb2VnbGljaGVuICh6LkIuIGRpZSBSZWFsaXNpZXJ1bmcgY2hhcmFrdGVyLWFiaGFlbmdpZ2VyCisgICAgICAgSGVpbHN0ZWxsZW4gdS5hZS4pLgorCisgICAgICAgPGtleT4gbXVzcyBlaW5kZXV0aWcgc2VpbiwgYW0gYmVzdGVuIHZlcndlbmRldCBtYW4gZGVuIGVpZ2VuZW4KKyAgICAgICBNYWdpZXJuYW1lbiAodW5kIGdnZi4gbmVuIEdlYmlldHNuYW1lbikgYWxzIFRlaWwgZGVzIFN0cmluZ3MuCisKKyAgICAgICBEaWUgRnVua3Rpb24gaXN0IGRlZmluaWVydCBpbiAvc3RkL2xpdmluZy9saWZlLmMuIFNvbWl0IGZ1bmt0aW9uaWVydAorICAgICAgIHNpZSBhdWNoIGJlaSBOUENzLiBEaWUgRGF0ZW4gd2VyZGVuIGluIFBfVElNSU5HX01BUCBnZXNwZWljaGVydCwgc2luZAorICAgICAgIGFsc28gZ2VnZW4gImVuZGUiIHJlc2lzdGVudC4gKHdlcmRlbiBhbGxlcmRpbmdzIG5hY2ggQWJsYXVmIGdnZi4KKyAgICAgICAnYXVmZ2VyYWV1bXQnKQorCisgICAgICAgRGFzIE1hcHBpbmcgUF9USU1JTkdfTUFQIGlzdCBOSUNIVCB6dXIgQWJmcmFnZSB1bmQgLyBvZGVyIE1hbmlwdWxhdGlvbgorICAgICAgICdwZXIgSGFuZCcgdm9yZ2VzZWhlbi4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgICAwICAgIElyZ2VuZGVpbiBGZWhsZXIgaW0gQXVmcnVmLCBldnRsLiBleGlzdGllcnQgZGllIEZ1bmt0aW9uIChub2NoKQorICAgICAgICAgICAgbmljaHQgaW0gamV3LiBPYmpla3QuCisKKyAgICAgIC0xICAgIEFsbGVzIG9rYXkuIE5ldWVyIFplaXRwdW5rdCB3aXJkIGF1dG9tYXRpc2NoIGdlc3BlaWNoZXJ0LiBJbgorICAgICAgICAgICAgZGllc2VtIEZhbGwgZGFyZiBkZXIgU3BpZWxlciBnZWhlaWx0IHdlcmRlbi4KKworICAgICAgPjAgICAgS2V5IG5vY2ggZ2VzcGVycnQsIGluIGRlbSBGYWxsIGRhcmYgYWxzbyBuaWNodCBnZWhlaWx0IHdlcmRlbi4gCisgICAgICAgICAgICBEZXIgUnVlY2tnYWJld2VydCBpc3QgZGVyIFplaXRwdW5rdCwgYWIgZGVtIDxrZXk+IHdpZWRlciBmcmVpIGlzdCwKKyAgICAgICAgICAgIGxhZXNzdCBzaWNoIGRhaGVyIGRhenUgbnV0emVuLCB1bSBkZW0gU3BpZWxlciBlaW5lbiBBbmhhbHRzcHVua3QKKyAgICAgICAgICAgIHp1IGdlYmVuLCB3YW5uIGVyIGRpZSBTdGVsbGUgd2llZGVyIG51dHplbiBrYW5uLCBldHdhOgorCisgICAgICAgICAgICAiRGllIFNjaGFsZSBpc3QgZXJzdCBoYWxiIHZvbGwsIER1IG11c3N0IG5vY2ggZXR3YXMgd2FydGVuLiIKKworQkVJU1BJRUxFOgorICAgICAgIEVpbmUgSGVpbHN0ZWxsZSBzb2xsIGplZGVtIFNwaWVsZXIgYWxsZSA1bWluIHp1ciBWZXJmdWVndW5nIHN0ZWhlbjoKKworICAgICAgIEFkZENtZCgoeyJ0cmluayIsInRyaW5rZSJ9KSwidHJpbmtfY21kIik7CisKKyAgICAgICBpbnQgdHJpbmtfY21kKHN0cmluZyBzdHIpeworICAgICAgICAgLi4uCisgICAgICAgICAuLi4KKyAgICAgICAgIC8qCisgICAgICAgICBEZXIga2V5IHNvbGx0ZSBuYXR1ZXJsaWNoIGVpbmUgZXR3YXMgZWluZGV1dGlnZXJlIEtlbm56ZWljaG51bmcKKyAgICAgICAgIHdpZSBldHdhICJ0aWxseV90cmlua2VuIiBiZWtvbW1lbiwgYXVjaCB3ZW5uIGVyIGR1cmNoIGVpbmVuCisgICAgICAgICBhbmRlcmVuIChnbGVpY2huYW1pZ2VuKSBuaWNodCB1ZWJlcnNjaHJpZWJlbiB3ZXJkZW4ga2Fubi4KKworICAgICAgICAgVHJpZmZ0IGRpZXNlIEFiZnJhZ2UgaGllciB6dSwga2FubiBkZW0gU3BpZWxlciBIZWlsdW5nIG8uYWUuIHp1LQorICAgICAgICAgZ2VmdWVocnQgd2VyZGVuLiBEaWUgbmV1ZSBaZWl0IChkdXJhdGlvbikgd2lyZCBhdXRvbWF0aXNjaCBnZXNldHp0LgorICAgICAgICAgKi8KKyAgICAgICAgIGlmKHRoaXNfcGxheWVyKCktPmNoZWNrX2FuZF91cGRhdGVfdGltZWRfa2V5KDMwMCwiam9mX3RyaW5rZW4iKT09LTEpeworICAgICAgICAgICBpZih0aGlzX3BsYXllcigpLT5kcmlua19zb2Z0KDIpKXsKKyAgICAgICAgICAgICB0aGlzX3BsYXllcigpLT5oZWFsX3NlbGYoNTApOworICAgICAgICAgICAgIHdyaXRlKCJEdSBmdWVobHN0IERpY2ggc2ljaHRsaWNoIGVyZnJpc2NodC5cbiIpOworICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICBlbHNleworICAgICAgICAgICAgIHdyaXRlKCJEdSBoYXN0IHNjaG9uIHp1dmllbCBnZXRydW5rZW4uXG4iKTsKKyAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgd3JpdGUoIkR1IHRyaW5rc3QgdW5kIGRlbmtzdCAuIG8gTyAoSG1tLCBuaWNodCBzY2hsZWNodCkuXG4iKTsKKyAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgfQorICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworQkVNRVJLVU5HRU46IAorICAgICAgIEF1Y2ggYmVpIGRpZXNlciBGdW5rdGlvbiBpc3QgZGFyYXVmIHp1IGFjaHRlbiwgZGFzcyBQcm9wZXJ0aWVzIHdpZQorICAgICAgIFBfRk9PRCwgUF9EUklOSyB1bmQgUF9BTENPSE9MIGJlcnVlY2tzaWNodGlndCB3ZXJkZW4uCisgICAgICAgSGVpbHN0ZWxsZW4gc2luZCBkZW0genVzdGFlbmRpZ2VuIE1hZ2llciBmdWVyIEhlaWx1bmdzLUJhbGFuY2UgenUgCisgICAgICAgbWVsZGVuLiBXZXIgZGllcyBtb21lbnRhbiBpc3QsIGthbm4gZGVtIE1haWxhbGlhcyBoZWlsdW5nc19iYWxhbmNlCisgICAgICAgZW50bm9tbWVuIHdlcmRlbi4KKworU0lFSEUgQVVDSDoKKyAgICAgICBjaGVja190aW1lZF9rZXksIGVhdF9mb29kLCBkcmlua19hbGNvaG9sLCBkcmlua19zb2Z0LCBoZWFsX3NlbGYsCisgICAgICAgcmVzdG9yZV9zcGVsbF9wb2ludHMsIHJlZHVjZV9oaXRfcG9pbnQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMDguMDEuMjAxMiwgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9jaGVja19yZXN0cmljdGlvbnMgYi9kb2MvbGZ1bi9jaGVja19yZXN0cmljdGlvbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM4MTVjZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL2NoZWNrX3Jlc3RyaWN0aW9ucwpAQCAtMCwwICsxLDE0OSBAQAorY2hlY2tfcmVzdHJpY3Rpb25zKCkKK0ZVTktUSU9OOgorICAgIHN0cmluZyBjaGVja19yZXN0cmljdGlvbnMob2JqZWN0IHBsLCBtYXBwaW5nIHJlc3RyKQorCitERUZJTklFUlQgSU46CisgICAgL3N0ZC9yZXN0cmljdGlvbl9jaGVja2VyLmMKKworQVJHVU1FTlRFOgorICAgIG9iamVjdCBwbCAgICAgICAgZ2VwcnVlZnRlcyBMZWJld2VzZW4KKyAgICBtYXBwaW5nIHJlc3RyICAgIE1hcHBpbmcgbWl0IFJlc3RyaWt0aW9uZW4sIHMudS4KKworQkVTQ0hSRUlCVU5HOgorICAgIERpZSBNZXRob2RlIHdpcmQgdmVyd2VuZGV0LCB1bSBSZXN0cmlrdGlvbmVuICh6dW0gQmVpc3BpZWwgZnVlciBkYXMKKyAgICBDYXN0ZW4gZWluZXMgU3BlbGxzKSB6dSBwcnVlZmVuLiBTaWUgd2lyZCB2b24gU3BlbGxib29rIHVuZAorICAgIEdpbGRlbm9iamVrdCBkaXJla3QgZ2VudXR6dC4KKworICAgIElociB3aXJkIGRhYmVpIGVpbiBTcGllbGVyb2JqZWt0IHNvd2llIGVpbiBNYXBwaW5nIG1pdCBkZW4gamV3ZWlsaWdlbgorICAgIFJlc3RyaWt0aW9uZW4gdWViZXJnZWJlbi4gRGllIGFrdHVlbGwgbW9lZ2xpY2hlbiBLZXlzIGRlcyBNYXBwaW5ncyBzaW5kCisgICAgd2VpdGVyIHVudGVuIGdlbGlzdGV0LgorCitCRU1FUktVTkdFTjoKKyAgICBFcyB3aXJkIGJlaSBkZXIgUmFzc2UgUF9SRUFMX1JBQ0UgZ2VwcnVlZnQuIERlciBUYXJuaGVsbSBmdW5rdGlvbmllcnQKKyAgICBhbHNvIG5pY2h0LgorCisgICAgQmVpIEVyd2VpdGVydW5nc3ZvcnNjaGxhZWdlbiB3ZW5kZXQgZXVjaCBiaXR0ZSBhbiBlaW5lbiBFTSBvZGVyCisgICAgaW5oZXJpdGV0IGltIFp3ZWlmZWxzZmFsbCBuYWNoIEFic3ByYWNoZS4KKyAgICBOSUVNQUxTIHNvbGNoZW4gQ29kZSBlaW5mYWNoIEtPUElFUkVOLiBTcGFldGVyIG11c3MgbnVyIGlyZ2VuZHdlcgorICAgIGV1cmVtIGFsdGVuIENvZGUgaGludGVyaGVycmFldW1lbi4KKworQWt0dWVsbGUgTGlzdGUgZGVyIHBydWVmYmFyZW4gUGFyYW1ldGVyOgorICAgIFBfTEVWRUwKKyAgICAgIE1pbmRlc3RzdHVmZSwgZGllIGRhcyBMZWJld2VzZW4gYmVzaXR6ZW4gbXVzcywgdW0gZGllIEFrdGlvbgorICAgICAgYXVzenVmdWVocmVuLgorICAgIFBfR1VJTERfTEVWRUwKKyAgICAgIEdpbGRlbmxldmVsLCBkYXMgZGFzIExlYmV3ZXNlbiBtaW5kZXN0ZW5zIGVycmVpY2h0IGhhYmVuIG11c3MsIHVtIGRpZQorICAgICAgQWt0aW9uIGF1c3p1ZnVlaHJlbi4KKyAgICBTUl9TRUVSCisgICAgICBJc3QgZ2VzZXR6dCwgd2VubiBkYXMgTGViZXdlc2VuIFNlaGVyIHNlaW4gbXVzcy4KKyAgICAgIEF1c3dlcnR1bmcgbnVyIGZ1ZXIgSW50ZXJhY3RpdmVzLCBOU0MgaWdub3JpZXJlbiBkYXMgRmxhZy4KKyAgICBQX1hQCisgICAgICBNaW5kZXN0bWVuZ2UgYW4gRXJmYWhydW5nc3B1bmt0ZW4sIGRpZSBlaW4gTGViZXdlc2VuIGJlc2l0emVuIG11c3MsCisgICAgICB1bSBkaWUgQWt0aW9uIGF1c3p1ZnVlaHJlbi4KKyAgICBQX1FQCisgICAgICBNaW5kZXN0bWVuZ2UgYW4gQWJlbnRldWVycHVua3RlbiwgZGllIGRhcyBMZWJld2VzZW4gaGFiZW4gbXVzcy4KKyAgICBQX0FMQ09IT0wKKyAgICAgIE1lbmdlIGFuIEFsa29ob2wsIHVudGVyIGRlciBkZXIgQWxrb2hvbHNwaWVnZWwgZGVzIExlYmV3ZXNlbiBsaWVnZW4KKyAgICAgIG11c3MsIHVtIGRpZSBBa3Rpb24gbm9jaCBhdXNmdWVocmVuIHp1IGtvZW5uZW4uCisgICAgUF9EUklOSworICAgICAgTWVuZ2UgYW4gRmx1ZXNzaWdrZWl0LCB1bnRlciBkZXIgZGVyIEZsdWVzc2lna2VpdHNzcGllZ2VsIGRlcworICAgICAgTGViZXdlc2VuIGxpZWdlbiBtdXNzLCB1bSBkaWUgQWt0aW9uIG5vY2ggYXVzZnVlaHJlbiB6dSBrb2VubmVuLgorICAgIFBfRk9PRAorICAgICAgQmVpbmhhbHRldCBkaWUgTWVuZ2UgYW4gTmFocnVuZywgdW50ZXIgZGVyIGRlciBOYWhydW5nc3NwaWVnZWwgZGVzCisgICAgICBTcGllbGVycyBsaWVnZW4gbXVzcywgdW0gZGllIEFrdGlvbiBub2NoIGF1c2Z1ZWhyZW4genUga29lbm5lbi4KKyAgICBQX0RFQUYKKyAgICAgIElzdCBnZXNldHp0LCBmYWxscyBkZXIgU3BpZWxlciBuaWNodCB0YXViIHNlaW4gZGFyZi4KKyAgICBQX0ZST0cKKyAgICAgIElzdCBnZXNldHp0LCBmYWxscyBkZXIgU3BpZWxlciBrZWluIEZyb3NjaCBzZWluIGRhcmYuCisgICAgUF9CTElORAorICAgICAgSXN0IGdlc2V0enQsIGZhbGxzIGRlciBTcGllbGVyIG5pY2h0IGJsaW5kIHNlaW4gZGFyZi4KKyAgICAgIEFjaHR1bmc6IGRhcyBpc3QgbmljaHQgZ2xlaWNoYmVkZXV0ZW5kIG1pdCBkZW0gVW1zdGFuZCwgZGFzcyBlciBldnRsLgorICAgICAgbmljaHRzIG1laHIgc2VoZW4ga2Fubi4gQXVjaCBhbmRlcmUgR3J1ZW5kZSAoenVtIEJlaXNwaWVsIER1bmtlbGhlaXQpCisgICAgICBrb2VubmVuIGJld2lya2VuLCBkYXNzIGVpbiBTcGllbGVyIG5pY2h0cyBtZWhyIHNpZWh0LgorICAgIEFfSU5ULCBBX0RFWCwgQV9DT04sIEFfU1RSCisgICAgICBKZXdlaWxpZ2UgTWluZGVzdGhvZWhlIGVpbmVzIEF0dHJpYnV0LCB1bSBlaW5lIEFrdGlvbiBhdXNmdWVocmVuIHp1CisgICAgICBrb2VubmVuLgorICAgIFNSX0JBRCwgU1JfR09PRAorICAgICAgR2lidCBhbiwgd2llIFttaW5pbWFsXSBib2VzZSBiencuIHdpZSBbbWF4aW1hbF0gZ3V0IGVpbiBDaGFyYWt0ZXIgc2VpbgorICAgICAgZGFyZiwgdW0gZWluZSBBa3Rpb24gYXVzZnVlaHJlbiB6dSBrb2VubmVuLgorICAgIFNSX01JTl9TSVpFLCBTUl9NQVhfU0laRQorICAgICAgR2lidCBkaWUgbWluaW1hbGUsIGJ6dy4gZGllIG1heGltYWxlIEdyb2Vzc2UgYW4sIGRpZSBlaW4gQ2hhcmFrdGVyCisgICAgICBtYXhpbWFsIGhhYmVuIGRhcmYsIHVtIGVpbmUgQWt0aW9uIGF1c2Z1ZWhyZW4genUga29lbm5lbi4KKyAgICBTUl9GUkVFX0hBTkRTCisgICAgICBHaWJ0IGFuLCB3aWV2aWVsZSBmcmVpZSBIYWVuZGUgZWluIENoYXJha3RlciBmdWVyIGRpZXNlIEFrdGlvbgorICAgICAgYmVzaXR6ZW4gbXVzcy4KKyAgICBTUl9FWENMVURFX1JBQ0UKKyAgICAgIE1pdGdsaWVkZXIgYWxsZXIgaW4gZGllc2VyIExpc3RlIGF1ZmdlZnVlaHJ0ZW4gUmFzc2VuIGtvZW5uZW4KKyAgICAgIGRpZXNlIEFrdGlvbiBuaWNodCBhdXNmdWVocmVuLgorICAgIFNSX0lOQ0xVREVfUkFDRQorICAgICAgTWl0Z2xpZWRlciBhbGxlciBOSUNIVCBpbiBkaWVzZXIgTGlzdGUgYXVmZ2VmdWVocnRlbiBSYXNzZW4ga29lbm5lbgorICAgICAgZGllc2UgQWt0aW9uIG5pY2h0IGF1c2Z1ZWhyZW4uCisgICAgU01fUkFDRQorICAgICAgSGllciBrYW5uIHBybyBSYXNzZSBlaW4gTWFwcGluZyBtaXQgYmVzb25kZXJlbiAobnVyKSBmdWVyIGRpZXNlIFJhc3NlCisgICAgICBnZWx0ZW5kZW4gRWluc2NocmFlbmt1bmdlbiB2b3JnZW5vbW1lbiB3ZXJkZW4uIEFscyBLZXlzIHNpbmQgZGllCisgICAgICBpbiBkaWVzZXIgTWFucGFnZSBiZXNjaHJpZWJlbmVuIEtleXMgZXJsYXVidCwgd29iZWkgU01fUkFDRSBuaWNodAorICAgICAgcmVrdXJzaXYgYXVzZ2V3ZXJ0ZXQgd2lyZC4KKyAgICAgIERlciBSYXNzZW5uYW1lIGlzdCBncm9zcyBnZXNjaHJpZWJlbiB1bmQgIioiIHN0ZWh0IGZ1ZXIgYWxsZSBSYXNzZW4uCisgICAgU1JfRVhDTFVERV9HVUlMRAorICAgIFNSX0lOQ0xVREVfR1VJTEQKKyAgICAgIERpZXNlIGJlaWRlbiBLZXlzIHZlcmhhbHRlbiBzaWNoIHdpZSBTUl8qX1JBQ0UsIG51ciBkYXNzIGhpZXIgR2lsZGVuCisgICAgICBnZW5hbm50IHdlcmRlbi4KKyAgICBTUl9GVU4KKyAgICAgIEhpZXIga2FubiBlaW5lIEZ1bmt0aW9uIGluIHZlcnNjaGllZGVuZW4gRm9ybWVuIHp1bSBQcnVlZmVuIGRlcgorICAgICAgUmVzdHJpa3Rpb25lbiBhbmdlZ2ViZW4gd2VyZGVuLCBzaWVoZSBleGVjdXRlX2FueXRoaW5nKCkuCisgICAgICBEYXMga2FubiBudWV0emxpY2ggc2VpbiwgdW0gYW5kZXJlIFJlc3RyaWt0aW9uZW4genUgcHJ1ZWZlbiwKKyAgICAgIHdpZSBkYXMgQmVzdGVoZW4gdm9uIE1pbmlxdWVzdHMgb2RlciBhbmRlcmUgRmFlaGlna2VpdGVuL0ZsYWdzLgorICAgICAgSXN0IGRlciBUZXN0IG5pY2h0IGJlc3RhbmRlbiwgZ2lidCBkaWUgRnVua3Rpb24gZWluZW4gU3RyaW5nIHp1cnVlY2suCisgICAgU1JfUFJPUAorICAgICAgSGllciBrYW5uIGVpbiBNYXBwaW5nIG1pdCBQcm9wZXJ0aWVzIHVuZCB6dWdlaG9lcmlnZW4gV2VydGVuIGFuZ2VnZWJlbgorICAgICAgd2VyZGVuLCBkaWUgamV3ZWlscyBhdWYgSWRlbnRpdGFldCBnZXBydWVmdCB3ZXJkZW4uIFp1c2FldHpsaWNoIHNvbGx0ZQorICAgICAgZWluZSBNZWxkdW5nIGFuZ2VnZWJlbiB3ZXJkZW4sIGRpZSBhbHMgRmVobGVybWVsZHVuZyBhdXNnZWdlYmVuIHdpcmQsCisgICAgICB3ZW5uIGRlciBTcGllbGVyIGRpZSBCZWRpbmd1bmcgbmljaHQgZXJmdWVsbHQuIEVzIHNvbGx0ZSBpbW1lciBlaW5lCisgICAgICBwYXNzZW5kZSBNZWxkdW5nIGZ1ZXIgZGVuIFNwaWVsZXIgZWluZ2ViYXV0IHdlcmRlbi4gQmVpc3BpZWw6CisgICAgICAoWyBTUl9QUk9QOiAoW1BfQVVTR0FOR19FTlRERUNLVDogMTsgIkRlaW4gU2Nod2VydCBmbHVlc3RlcnQgIgorICAgICAgICAgICJ2ZXJhZXJnZXJ0OiBJY2ggd2VyZGUgRGlyIGVyc3QgZGFubiB6dSBEaWVuc3RlbiBzZWluLCB3ZW5uIER1ICIKKyAgICAgICAgICAiRGljaCBhbHMgd3VlcmRpZyBlcndpZXNlbiBoYXN0ISJdKSBdKQorICAgICAgQXVmZ3J1bmQgZGVyIE1lbGR1bmcgd2lyZCBlbXBmb2hsZW4sIFNSX1BST1AgbmljaHQgaW4gUmVzdHJpa3Rpb25lbgorICAgICAgZWluenVzZXR6ZW4sIGRpZSBtYXNzZW53ZWlzZSBpbiBTYXZlZmlsZXMgbGFuZGVuICh6LkIuCisgICAgICBTcGllbGVyc2F2ZWZpbGVzKS4KKyAgICBTUl9RVUVTVAorICAgICAgSGllciBrYW5uIGVpbiBTdHJpbmctQXJyYXkgbWl0IGRlbiBOYW1lbiAoS2V5cykgZGVyIFF1ZXN0KHMpIGFuZ2VnZWJlbgorICAgICAgd2VyZGVuLCBkaWUgZGVyIFNwaWVsZXIgYmVzdGFuZGVuIGhhYmVuIG11c3MsIHVtIGRpZSBBa3Rpb24gYXVzZnVlaHJlbgorICAgICAgenUga29lbm5lbi4KKyAgICBTUV9NSU5JUVVFU1QKKyAgICAgIEhpZXIga2FubiBlbnR3ZWRlciBlaW4gU3RyaW5nLUFycmF5IG1pdCBkZW4gTGFkZW5hbWVuIGRlciB2ZXJnZWJlbmRlbgorICAgICAgT2JqZWt0ZSBvZGVyIGVpbiBJbnQtQXJyYXkgbWl0IGRlbiBJbmRleC1OdW1tZXJuIChJRHMpIGRlcgorICAgICAgTWluaXF1ZXN0KHMpIChlbXBmb2hsZW4hKSBhbmdlZ2ViZW4gd2VyZGVuLCBkaWUgZGVyIFNwaWVsZXIgYmVzdGFuZGVuCisgICAgICBoYWJlbiBtdXNzLCB1bSBkaWUgQWt0aW9uIGF1c2Z1ZWhyZW4genUga29lbm5lbi4KKworQkVJU1BJRUxFOgorICAgIC8vICMxIExldmVsYmVzY2hyYWVua3VuZyBpbiBkZXIgQWJlbnRldXJlcmdpbGRlCisgICAgQWRkU3BlbGwoImZldWVyYmFsbCIsMjAsCisgICAgICAgICAgICAgKFtTSV9TS0lMTFJFU1RSX0xFQVJOOihbUF9MRVZFTDoxNV0pLCAuLi4KKworICAgIC8vICMyIEdsYXViZW5zdGVzdCBpbSBLbGVydXMKKyAgICBBZGRTcGVsbCgiYmV0ZSIsCisgICAgICAgICAgICAgKFtTSV9TS0lMTFJFU1RSX0xFQVJOOiAoW1BfR1VJTERfTEVWRUwgOiBMVkxfTk9WSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUl9GVU4gOiAjJ2dsYXViZW5zVGVzdCBdKSwgLi4uCisgICAgLy8gbWl0CisgICAgc3RhdGljIHN0cmluZyBnbGF1YmVuc1Rlc3Qob2JqZWN0IHBsKSB7CisgICAgICBpZiAocGwtPlF1ZXJ5UHJvcChLX1NUUkVOR1RIKSA8IDgwMDApCisgICAgICAgIHJldHVybiAoIkRlaW5lIEdsYXViZW5zc3RhZXJrZSBsYWVzc3QgenUgd3VlbnNjaGVuIHVlYnJpZyFcbiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gIzMgU01fUkFDRS1Nb2RpZmlrYXRpb24gZGVyIFJlc3RyaWt0aW9uZW46CisgICAgLy8gICAgaGFlcnRlcmUgUmVzdHJpa3Rpb25lbiBmdWVyIFp3ZXJnZQorICAgIC8vICAgIC0gaG9laGVyZXMgTGV2ZWwKKyAgICAvLyAgICAtIHp1c2FldHpsaWNoIEFfU1RSIHBydWVmZW4KKyAgICAoW1BfTEVWRUw6MTUsCisgICAgICBBX0lOVDoxMCwKKyAgICAgIFNNX1JBQ0U6IChbIlp3ZXJnIjogKFtQX0xFVkVMOjE3LCBBX1NUUjoyMF0pXSldKQorICAgIC8vIGlzdCBpZGVudGlzY2ggenUKKyAgICAoW1NNX1JBQ0U6IChbIioiOiAgICAgKFtQX0xFVkVMOjE1LCBBX0lOVDoxMF0pLAorICAgICAgICAgICAgICAgICAiWndlcmciOiAoW1BfTEVWRUw6MTcsIEFfSU5UOjEwLCBBX1NUUjoyMF0pXSldKQorCitTSUVIRSBBVUNIOgorICAgIGV4ZWN1dGVfYW55dGhpbmcoTCksIEFkZFNwZWxsIChHaWxkZSksIFBfUkVTVFJJQ1RJT05TCisKKzAzLiBKYW51YXIgMjAxNCwgQXJhdGhvcm4KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL2NoZWNrX3RpbWVkX2tleSBiL2RvYy9sZnVuL2NoZWNrX3RpbWVkX2tleQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWJhZmY3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vY2hlY2tfdGltZWRfa2V5CkBAIC0wLDAgKzEsMzQgQEAKK2NoZWNrX3RpbWVkX2tleSgpCisKK0ZVTktUSU9OOgorICAgICAgIHB1YmxpYyBpbnQgY2hlY2tfdGltZWRfa2V5KHN0cmluZyBrZXkpCisgICAgICAgCitERUZJTklFUlQgSU46CisgICAgICAgL3N0ZC9saXZpbmcvbGlmZS5jICAgIAorCitBUkdVTUVOVEU6CisgICAgICAgc3RyaW5nIGtleSAgOiBFaW5kZXV0aWdlciBOYW1lCisKK0JFU0NIUkVJQlVORzoKKyAgICAgICBEaWVzZSBGdW5rdGlvbiBoYXQgZGllIEF1ZmdhYmUsIG1pdHRlbHMgY2hlY2tfYW5kX3VwZGF0ZV90aW1lZF9rZXkoKQorICAgICAgIGdlc3BlaWNoZXJ0ZSBaZWl0c3BlcnJlbiB6dSBwcnVlZmVuLCBhYmVyIGRhYmVpIG5pY2h0IHp1IHZlcmFlbmRlcm4uCisKKyAgICAgICBFcyBNVVNTIGJlaSBkZXIgZWlnZW50bGljaGVuIEFrdGlvbiAoei5CLiBIZWlsdW5nIGRlcyBTcGllbGVycykgZGVyCisgICAgICAgUnVlY2tnYWJld2VydCB2b24gY2hlY2tfYW5kX3VwZGF0ZV90aW1lZF9rZXkoKSBiZXJ1ZWNrc2ljaHRpZ3Qgd2VyZGVuLAorICAgICAgIHNvbGx0ZSBkaWVzZXMgbmljaHQgLTEgZ2VsaWVmZXJ0IGhhYmVuLCBNVVNTIDxrZXk+IGFscyBnZXNwZXJydAorICAgICAgIGJldHJhY2h0ZXQgd2VyZGVuLCBkLmguIGNoZWNrX3RpbWVkX2tleSgpIGhhdCBudXIgaW5mb3JtYXRpdmVuCisgICAgICAgQ2hhcmFrdGVyLgorCitSVWVDS0dBQkVXRVJUOgorICAgICAgIDAgICAgRGllIFplaXRzcGVycmUgPGtleT4gaXN0IGFiZ2VsYXVmZW4uCisKKyAgICAgICA+MCAgIDxrZXk+IGlzdCBub2NoIGdlc3BlcnJ0LgorICAgICAgICAgICAgRGVyIFJ1ZWNrZ2FiZXdlcnQgaXN0IGRlciBaZWl0cHVua3QsIGFiIGRlbSA8a2V5PiB3aWVkZXIgZnJlaSBpc3QsCisKK1NJRUhFIEFVQ0g6CisgICAgICAgY2hlY2tfYW5kX3VwZGF0ZV90aW1lZF9rZXksIGVhdF9mb29kLCBkcmlua19hbGNvaG9sLCBkcmlua19zb2Z0LAorICAgICAgIGhlYWxfc2VsZiwgcmVzdG9yZV9zcGVsbF9wb2ludHMsIHJlZHVjZV9oaXRfcG9pbnQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMDguMDEuMjAxMiwgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9jbGVhbl91cCBiL2RvYy9sZnVuL2NsZWFuX3VwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZGRmMDkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9jbGVhbl91cApAQCAtMCwwICsxLDQzIEBACitjbGVhbl91cCgpCitGVU5LVElPTjoKKyAgICAgaW50IGNsZWFuX3VwKGludCByZWYpOworCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvcm9vbS5jCisgICAgIG1hbiBrYW5uIGRpZSBGdW5rdGlvbiBqZWRvY2ggYXVjaCBpbiBiZWxpZWJpZ2VuIE9iamVrdGVuIHNlbGJzdAorICAgICBkZWZpbmllcmVuLgorCitBUkdVTUVOVEU6CisgICAgIHJlZgorICAgICAgICAgICAgICsgMCBiZWkgZ2VjbG9uZXRlbiBPYmpla3RlbgorICAgICAgICAgICAgICsgMSBiZWkgZWluZmFjaGVuIGdlbGFkZW5lbiBPYmpla3RlbgorICAgICAgICAgICAgICsgPjEgYmVpIE9iamVrdGVuLCBkaWUgZ2VlcmJ0IHd1cmRlbiBvZGVyIGFscyBCbHVlcHJpbnQgZGllbmVuCisgICAgICAgICAgICAgKyA8MCwgd2VubiBjbGVhbl91cCgpIHZvbiBhdXNzZW4gYXVmZ2VydWZlbiB3dXJkZSAoZGFzIG11c3MgbWFuCisgICAgICAgICAgICAgICBzZWxic3QgYmVhY2h0ZW4hKQorCitCRVNDSFJFSUJVTkc6CisgICAgIFdlbm4gZWluIE9iamVrdCBzZWl0IGxhbmdlciBaZWl0IG5pY2h0IG1laHIgYmVudXR6dCB3dXJkZSwga2FubiBlcyBzaWNoCisgICAgIGhpZXIgc2VsYnN0IHplcnN0b2VyZW4uIERhcyBzb2xsdGUgZGFzIE9iamVrdCBhbGxlcmRpbmdzIG51ciB0dW4sIHdlbm4KKyAgICAgcmVmIGtsZWluZXIgb2RlciBnbGVpY2ggMSBpc3QuCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIERlciBSdWVja2dhYmV3ZXJ0IGhhdCBudXIgZGFubiBlaW5lIEJlZGV1dHVuZywgd2VubiBzaWNoIGRhcyBPYmpla3QKKyAgICAgbmljaHQgc2VsYnN0IHplcnN0b2VydCBoYXQuIFdpcmQgMCB6dXJ1ZWNrZ2VnZWJlbiwgc28gd2lyZCBjbGVhbl91cCgpCisgICAgIGVyc3QgZGFubiB3aWVkZXIgYXVmZ2VydWZlbiwgbmFjaGRlbSBkYXMgT2JqZWt0IGF1cy0gdW5kIHdpZWRlcgorICAgICBlaW5nZXN3YXBwdCB3dXJkZS4KKworICAgICBFaW4gUnVlY2tnYWJld2VydCB1bmdsZWljaCAwIHplaWd0IGFuLCBkYXNzIGRhcyBPYmpla3Qgc2ljaAorICAgICB3YWhyc2NoZWlubGljaCBpbiBkZXIgbmFlY2hzdGVuIGNsZWFuX3VwKCktUnVuZGUgemVyc3RvZXJlbiBrYW5uLCB3ZW5uCisgICAgIGluIGRlciBad2lzY2hlbnplaXQgekIuIG5vY2ggZWlubWFsIHJlc2V0KCkgYXVmZ2VydWZlbiB3dXJkZS4KKworQkVNRVJLVU5HRU46CisgICAgIFN0YW5kYXJkbWFlc3NpZyBkZWZpbmllcmVuIG51ciBSYWV1bWUgY2xlYW5fdXAoKS4KKworICAgICBEaWUgWmVpdGVuIHp3aXNjaGVuIHp3ZWkgQXVmcnVmZW4gdm9uIGNsZWFuX3VwKCkgYmV0cmFnZW4gbW9tZW50YW4KKyAgICAgZWluZW4gVGFnICg4NjQwMCBTZWt1bmRlbikuCisKK1NJRUhFIEFVQ0g6CisgICAgIHJlc2V0KCksIFBfTkVWRVJfQ0xFQU4KKyAgICAgbWVtb3J5CisKKzIxLiBNYWVyeiAyMDA0IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9jbWRfc2hvb3QgYi9kb2MvbGZ1bi9jbWRfc2hvb3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NkNTJjZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL2NtZF9zaG9vdApAQCAtMCwwICsxLDMxIEBACitjbWRfc2hvb3QoKQorCitGVU5LVElPTjoKKyAgICBzdGF0aWMgaW50IGNtZF9zaG9vdChzdHJpbmcgc3RyKQorCitERUZJTklFUlQgSU46CisgICAgL3N0ZC9yYW5nZWRfd2VhcG9uLmMKKworQVJHVU1FTlRFOgorICAgIHN0cmluZyBzdHIgICAgLSBTY2h1c3NzeW50YXgKKworQkVTQ0hSRUlCVU5HOgorICAgIEtvbW1hbmRvZnVua3Rpb24gZGVyIEZlcm53YWZmZS4gRW50aGFlbHQgZGllIFZvcmJlcmVpdHVuZyB1bmQgZGVuIFNjaHVzcy4KKworQkVNRVJLVU5HRU46CisgICAgSXN0IGluIGRlciBGZXJud2FmZmUgbWl0IEFkZENtZCggKHsic2NoaWVzcyIsICJzY2hpZXNzZSJ9KSwgImNtZF9zaG9vdCIpOworICAgIGFuZ2VidW5kZW4uIFdpbGwgbWFuIGVpbmUgYW5kZXJlIFN5bnRheCBoYWJlbiwga2FubiBtYW4gbWl0CisgICAgQWRkQ21kL1JlbW92ZUNtZCBkaWVzZSB1bXNldHplbi4KKworQkVJU1BJRUxFOgorICAgIFJlbW92ZUNtZCgoeyJzY2hpZXNzIiwgInNjaGllc3NlIn0pKTsgLy8gZW50ZmVybmUgRGVmYXVsdC1Lb21tYW5kbworICAgIEFkZENtZCgoeyJzY2hsZXVkZXIiLCAic2NobGV1ZGVyZSJ9KSwgIydjbWRfc2hvb3QpOworCitTSUVIRSBBVUNIOgorICAgIEdlbmVyZWxsOiAgUF9BTU1VTklUSU9OLCBQX1NIT09USU5HX1dDLCBQX1NUUkVUQ0hfVElNRQorICAgIE1ldGhvZGVuOiAgc2hvb3RfZGFtKEwpLCBjbWRfc2hvb3QoTCkKKyAgICBLb21tYW5kb3M6IEFkZENtZChMKSwgUmVtb3ZlQ21kKEwpCisgICAgU3ludGF4OiAgICBfdW5wYXJzZWRfYXJncyhMKQorICAgIFNvbnN0aWdlczogZmVybndhZmZlbgorCisyOC5KdWwgMjAxNCBHbG9pbnNvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL2NvbW1hbmRfbWUgYi9kb2MvbGZ1bi9jb21tYW5kX21lCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYjFlZjIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9jb21tYW5kX21lCkBAIC0wLDAgKzEsODEgQEAKK2NvbW1hbmRfbWUoKQorRlVOS1RJT046CisgICAgaW50IGNvbW1hbmRfbWUoc3RyaW5nIHN0cikKKworQVJHVU1FTlRFOgorICAgIHN0cmluZyBzdHIgLSBhdXN6dWZ1ZWhyZW5kZXMgS29tbWFuZG8KKworREVGSU5JRVJUIElOOgorICAgIC9zdGQvbnBjLmMsIC9zdGQvcGxheWVyL2NvbW1hbmQuYworCitCRVNDSFJFSUJVTkc6CisgICAgRnVlaHJ0ICdzdHInIHdpZSBlaW4gS29tbWFuZG8gYXVzLCB3ZWxjaGVzIGRpcmVrdCB2b20gTGl2aW5nCisgICAgYWJnZWdlYmVuIHd1cmRlLgorCisgICAgRGVyIFJ1ZWNrZ2FiZXdlcnQgaXN0ID49MSBmdWVyIEVyZm9sZyB1bmQgMCBmdWVyIE1pc3NlcmZvbGcuIAorICAgIFJ1ZWNrZ2FiZXdlcnQgaXN0IGltIEVyZm9sZ3NmYWxsIGRpZSBIb2VoZSBkZXIgRXZhbENvc3QgaW4gVGlja3MuIAorCisgICAgY29tbWFuZF9tZSgpIGxlaXRldCBkZW4gQmVmZWhsIGFuIGNvbW1hbmQoKShFKSB3ZWl0ZXIgdW5kIGVybGF1YnQKKyAgICBkYWR1cmNoIGF1Y2ggZGVuIEF1ZnJ1ZiB2b24gc29uc3QgZHVyY2ggInN0YXRpYyIsICJwcm90ZWN0ZWQiIG9kZXIKKyAgICAicHJpdmF0ZSIgdm9yIGV4dGVybmVtIEF1ZnJ1ZiBnZXNjaHVldHp0ZW4gS29tbWFuZG8tRnVua3Rpb25lbi4KKworICAgIEtvbW1hbmRvcyBtaXQgb2VmZmVudGxpY2hlbiBLb21tYW5kb2Z1bmt0aW9uZW4gKGFsc28gZGFtaXQgYWxsZSBtaXQKKyAgICBBZGRDbWQgZGVmaW5pZXJ0ZW4gS29tbWFuZG9zKSBrb2VubmVuIGF1Y2ggZHVyY2ggY29tbWFuZCgpKEUpCisgICAgdm9uIGF1c3NlbiBhdXNnZWxvZXN0IHdlcmRlbi4KKworQkVNRVJLVU5HRU46ICAgIAorICAgIC0gYmVydWVja3NpY2h0aWd0IEFsaWFzZSwgZC5oLiB3ZW5uIG1hbiBBbGlhc2UgZWluZXMgU3BpZWxlcnMKKyAgICAgIGlnbm9yaWVyZW4gd2lsbCwgbXVzcyBtYW4gZWluIFxcIChmdWVyIGVpbiBcIGltIEVpbmdhYmVzdHJpbmcpCisgICAgICB2b3IgZGVuIEJlZmVobCBzdGVsbGVuCisgICAgLSBmdWVyIG9iamVrdGludGVybmUgS29tbWFuZG9zIGZ1bmt0aW9uaWVydCBhbHNvIGF1Y2ggY29tbWFuZCgpKEUpCisKK0JFSVNQSUVMOgorICAgIChDb2RlIGRlcyBUZXN0cmF1bSBpc3QgaW4gL2RvYy9iZWlzcGllbGUvdGVzdG9iamVrdGUvY29tbWFuZF9tZV90ZXN0cmF1bSkKKyAgICAvLyAjMTogVGVzdHJhdW0sIHp3aW5nZSBTcGllbGVyIGJlaSAic2NobGVpY2hlIGhlcmFuIiB6dW0gRnVyemVuCisgICAgLy8gICAgIGNvbW1hbmRfbWUoKSBpc3QgaGllciBub2V0aWcsIGRhIGRhcyBGdXJ6ZW4gZWluZSBnZXNjaHVldHp0ZQorICAgIC8vICAgICBLb21tYW5kb2Z1bmt0aW9uIGhhdAorICAgIGluaGVyaXQgIi9zdGQvcm9vbSI7CisKKyAgICB2b2lkIGNyZWF0ZSgpIHsKKyAgICAgIDo6Y3JlYXRlKCk7CisgICAgICBBZGRDbWQoInNjaGxlaWNoZSZoZXJhbnxoZXJ1bSIsICJhY3Rpb25fc2NobGVpY2hlbiIpOworICAgIH0KKyAgICAKKyAgICB2b2lkIGluaXQoKSB7CisgICAgICA6OmluaXQoKTsKKyAgICAgIGFkZF9hY3Rpb24oImFjdGlvbl9rcmllY2hlbiIsICJrcmllY2giLCAxKTsKKyAgICB9CisKKyAgICBzdGF0aWMgaW50IGFjdGlvbl9zY2hsZWljaGVuKHN0cmluZyBzdHIpIHsKKyAgICAgIHN0cmluZyB0bXAgPSB0aGlzX3BsYXllcigpLT5RdWVyeVByb3AoUF9SQUNFKTsKKyAgICAgIC8vIC4uLiAKKyAgICAgIGlmKHRtcFs8MV09PSdlJykgdG1wPXRtcFswLi48Ml07CisgICAgICB3cml0ZShicmVha19zdHJpbmcoIkR1IHZlcnN1Y2hzdCBsZWlzZSB6dSBzY2hsZWljaGVuLCBkYWJlaSBwYXNzaWVydCAiCisgICAgICAgICJkaXIgYWJlciBlaW4gYWxsenUgIisKKyAgICAgICAgKHRtcD09Ik1lbnNjaCI/Im1lbnNjaGxpY2hlcyI6bG93ZXJfY2FzZSh0bXApKyJpc2NoZXMiKSsKKyAgICAgICAgIiBNaXNzZ2VzY2hpY2suIFZlcmZsdWNodCEiLCA3OCkpOworICAgICAgdGhpc19wbGF5ZXIoKS0+Y29tbWFuZF9tZSgiXFxmdXJ6ZSIpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIAorICAgIHN0YXRpYyBpbnQgYWN0aW9uX2tyaWVjaGVuKHN0cmluZyBzdHIpIHsKKyAgICAgIHdyaXRlKGJyZWFrX3N0cmluZygiRGVpbmUgS25pZSB0dW4genUgc2VociB3ZWggZGFmdWVyLiIsIDc4KSk7CisgICAgICB0ZWxsX3Jvb20odGhpc19vYmplY3QoKSwgYnJlYWtfc3RyaW5nKHRoaXNfcGxheWVyKCktPk5hbWUoV0VSKSsKKyAgICAgICAgIiBrbmFja3QgbWl0IGRlbiBLbmllbi4iLCA3OCkpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIAorICAgIC8vICMyIChpbiBvYmlnZW0gUmF1bSk6IHp3aW5nZSBTcGllbGVyIGluIFJhdW0genUgb2JpZ2VtIEtvbW1hbmRvCisgICAgLy8gICAgQmVpZGUgS29tbWFuZG9zIGdlbGluZ2VuLCBkYSBLb21tYW5kbyBtaXQgQWRkQ21kIGRlZmluaWVydC4KKyAgICBmaW5kX3BsYXllcigibmFkZGwiKS0+Y29tbWFuZF9tZSgic2NobGVpY2hlIGhlcnVtIikKKyAgICBjb21tYW5kKCJzY2hsZWljaGUgaGVydW0iLCBmaW5kX3BsYXllcigibmFkZGwiKSk7IAorCisgICAgLy8gIzMgKGluIG9iaWdlbSBSYXVtKTogendpbmdlIFNwaWVsZXIgaW4gUmF1bSB6dSBvYmlnZW0gS29tbWFuZG8KKyAgICBmaW5kX3BsYXllcigibmFkZGwiKS0+Y29tbWFuZF9tZSgia3JpZWNoZSIpCisgICAgLy8gICAgRm9sZ2VuZGVzIEtvbW1hbmRvIHNjaGxhZWd0IGZlaGwsIGRhIEtvbW1hbmRvZnVua3Rpb24gc3RhdGljIGlzdC4KKyAgICBjb21tYW5kKCJrcmllY2hlIiwgZmluZF9wbGF5ZXIoIm5hZGRsIikpOworICAgIAorU0lFSEUgQVVDSDoKKyAgICAgZW5hYmxlX2NvbW1hbmRzKEUpLCBjb21tYW5kKEUpCisKKzA2IFNlcCAyMDEyIEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9jb25zdW1lIGIvZG9jL2xmdW4vY29uc3VtZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTc5ZWM0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vY29uc3VtZQpAQCAtMCwwICsxLDg1IEBACitwdWJsaWMgdmFyYXJncyBpbnQgY29uc3VtZShtYXBwaW5nIGNpbmZvLCBpbnQgdGVzdG9ubHkpCisKK0ZVTktUSU9OOgorICAgIHB1YmxpYyB2YXJhcmdzIGludCBjb25zdW1lKG1hcHBpbmcgY2luZm8sIGludCB0ZXN0b25seSk7CisKKyAgICBBZW5kZXJ1bmcgZGVyIEdlc3VuZGhlaXQgZWluZXMgTGViZXdlc2VucyBkdXJjaCBldHdhcyBLb25zdW1pZXJiYXJlcy4KKworREVGSU5JRVJUIElOOgorICAgIC9zdGQvbGl2aW5nL2xpZmUuYworCitBUkdVTUVOVEU6CisgICAgY2luZm8KKyAgICAgICAgTWFwcGluZyBtaXQgSW5mb3JtYXRpb25lbiB1ZWJlciBkaWUgR2VzdW5kaGVpdHNhZW5kZXJ1bmcKKyAgICAgICAgSGVpbHVuZy4KKyAgICB0ZXN0b25seQorICAgICAgICBHaWJ0IGFuLCBvYiBudXIgZGllIEJlZGluZ3VuZ2VuIGFiZ2V0ZXN0ZXQgd2VyZGVuIHNvbGxlbiwKKyAgICAgICAgb2RlciBhdWNoIGRpZSBXaXJrdW5nIGVpbnRyZXRlbiBzb2xsLgorCitSVUVDS0dBQkVXRVJUOgorICAgIDEgZXJmb2xncmVpY2gga29uc3VtaWVydAorICAgIDAga2VpbmUgb2RlciBmYWxzY2hlIEFlbmRlcnVuZ3NkYXRlbiBpbiBjaW5mbyAobmljaHQgYmVudXR6YmFyKQorICAgPDAgQmVkaW5ndW5nIGZ1ZXIga29uc3VtaWVyZW4gbmljaHQgZXJmdWVsbHQsIEJpdHNldCBhdXM6CisgICAgICBIQ19NQVhfRk9PRF9SRUFDSEVEICAgIC0gS2FubiBuaWNodHMgbWVociBlc3NlbgorICAgICAgSENfTUFYX0RSSU5LX1JFQUNIRUQgICAtIEthbm4gbmljaHRzIG1laHIgdHJpbmtlbgorICAgICAgSENfTUFYX0FMQ09IT0xfUkVBQ0hFRCAtIEthbm4gbmljaHRzIG1laHIgc2F1ZmVuCisgICAgICBIQ19IT09LX0NBTkNFTExFVElPTiAgIC0gZHVyY2ggSF9IT09LX0NPTlNVTUUgYWJnZWJyb2NoZW4KKworQkVTQ0hSRUlCVU5HOgorICAgIERpZSBGdW5rdGlvbiBzdGVsbHQgZWluZSBNb2VnbGljaGtlaXQgenVyIFZlcmZ1ZWd1bmcsIGRpZSBBZW5kZXJ1bmcKKyAgICBkZXIgR2VzdW5kaGVpdCBlaW5lcyBMZWJld2VzZW5zIGJlaW0gS29uc3VtaWVyZW4gdm9uIGlyZ2VuZGV0d2FzICh6LkIgaW4KKyAgICBlaW5lciBLbmVpcGUsIGR1cmNoIGVpbmUgSGVpbHN0ZWxsdGUgb2RlciB0cmFnYmFyZSBUYW5rZSwgLi4uKSB6ZW50cmFsIHp1CisgICAgZXJsZWRpZ2VuLiBTaWUgdmVyZWludCBpbiBzaWNoIGRpZSBQcnVlZnVuZyBhdWYgRHVyY2hmdWVyYmFya2VpdCBkZXIKKyAgICBBZW5kZXJ1bmcgdW5kIEFud2VuZHVuZyBkZXIgQWVuZGVydW5nLgorCisgICAgRGVyIGVyc3RlIFBhcmFtZXRlciBnaWJ0IGRpZSBFaWdlbnNjaGFmdGVuIGRlciBBZW5kZXJ1bmcgYW4sIGRlciB6d2VpdGUgb2IKKyAgICBhdXNzY2hsaWVzc2xpY2ggZGllIFBydWVmdW5nIGF1ZiBBbndlbmRiYXJrZWl0IGVyZm9sZ2VuIHNvbGwuCisKKyAgICBEYXMgTWFwcGluZyBjaW5mbyBoYXQgZm9sZ2VuZGUgU3RydWt0dXI6CisgICAgYSkgRWluZmFjaGUgQW5nYWJlIGRlciBiZXRyb2ZmZW5lbiBQcm9wZXJ0aWVzLiBJbiBuZXVlbSBDb2RlIGJpdHRlIG5pY2h0CisgICAgICAgbWFjaGVuLCBkb3J0IGVpbiBNYXBwaW5nIHdpZSB1bnRlciBiKSBiZXNjaHJpZWJlbiBudXR6ZW4hCisKKyAgICBiKSBTdHJ1a3R1cmllcnQgaW4gRWZmZWt0ZSB1bmQgQmVkaW5ndW5nZW4gbWl0IGZvbGdlbmRlbiBTY2hsdWVzc2VsbjoKKyAgICAgIEhfRUZGRUNUUyAtIE1hcHBpbmcgZGVyIHp1IGFlbmRlcm5kZW4gUHJvcGVydGllcyBtaXQgZGVtIFVtZmFuZyBkZXIKKyAgICAgICAgICAgICAgICAgIEFlbmRlcnVuZywgZXJsYXVidGUgUHJvcGVydGllcyBzaWVoZSBIX0FMTE9XRURfRUZGRUNUUworCisgICAgICBIX0NPTkRJVElPTlMgLSBNYXBwaW5nIGRlciB6dSBwcnVlZmVuZGVuIFByb3BlcnRpZXMgbWl0IGRlbSBVbWZhbmcgZGVyCisgICAgICAgICAgICAgICAgICAgICBBZW5kZXJ1bmcsIGVybGF1YnRlIFByb3BlcnRpZXMgc2llaGUgSF9BTExPV0VEX0NPTkRJVElPTlMKKworICAgICAgSF9ESVNUUklCVVRJT04gLSBWZXJ0ZWlsdW5nIGRlciBBZW5kZXJ1bmcgZnVlciBQX1NQLCBQX0hQCisgICAgICAgICAgICAgICAgICAgICAgIEhEX0lOU1RBTlQgYnp3LiAwOiBpbnN0YW50ZSBIZWlsdW5nCisgICAgICAgICAgICAgICAgICAgICAgIDEgLSA1MDogYW5nZWJlbmUgWmFobCBwcm8gSGVhcnRiZWF0CisgICAgICAgICAgICAgICAgICAgICAgIEhEX1NUQU5EQVJEOiA1IHBybyBIZWFydGJlYXQKKworICAgIEFlbmRlcnVuZ2VuIGtvZW5uZW4gc293b2hsIHBvc2l0aXYgYWxzIGF1Y2ggbmVnYXRpdiBzZWluLgorCitCRU1FUktVTkdFTjoKKyAgICBIaWVyYmVpIGFiZXIgYml0dGUgYmVhY2h0ZW4sIGRhc3MgVGFua2VuL0VudGFua2VuIHNvd2llIEhlaWx1bmdlbiBnZ2YuIHZvbgorICAgIGRlciAoSGVpbHVuZ3MtKUJhbGFuY2UgZ2VuZWhtaWd0IHdlcmRlbiBtdWVzc2VuIQorCitCRUlTUElFTEU6CisgICAgSGVpbHVuZyB1bSAxMDAgS1AsIDUwIExQLCBhYmVyIG51ciB3ZW5uIDMwIFBfRk9PRCBnZWdlc3NlbiB3ZXJkZW4ga2FubjoKKworICAgIGNvbnN1bWUoIChbSF9FRkZFQ1RTOiAoW1BfSFA6NTAsIFBfU1A6MTAwXSksCisgICAgICAgICAgICAgICBIX0NPTkRJVElPTlM6IChbUF9GT09EOjMwXSkgXSkgKTsKKworICAgIEhlaWx1bmcgdW0gMTAwIEtQIHVuZCBWZXJnaWZ0dW5nIHVtIDIsIHdlbm4gMTUgQWxrb2hvbCBnZXRydW5rZW4gd2VyZGVuCisgICAga29lbm5lbi4gRGllIFNQIHdlcmRlbiB6ZWl0dmVyem9lZ2VydCBtaXQgMTAgcHJvIEhlYXJ0YmVhdCB6dWdlZnVlaHJ0LgorCisgICAgY29uc3VtZSgoW0hfRUZGRUNUUzogKFtQX1NQOiAxMDAsIFBfUE9JU09OOiAyXSksCisgICAgICAgICAgICAgIEhfQ09ORElUSU9OUzogKFtQX0FMQ09IT0w6IDE1XSksCisgICAgICAgICAgICAgIEhfRElTVFJJQlVUSU9OOiAxMF0pICkKKworU0lFSEUgQVVDSDoKKyAgICAgQWVobmxpY2g6ICBkcmlua19hbGNvaG9sLCBlYXRfZm9vZCwgZHJpbmtfc29mdAorICAgICBIZWlsdW5nOiAgIGhlYWxfc2VsZiwgcmVzdG9yZV9zcGVsbF9wb2ludHMsIHJlc3RvcmVfaGl0X3BvaW50cywgCisgICAgICAgICAgICAgICAgYnVmZmVyX2hwLCBidWZmZXJfc3AKKyAgICAgVGltaW5nOiAgICBjaGVja19hbmRfdXBkYXRlX3RpbWVkX2tleQorICAgICBFbnR0YW5rZW46IGRlZnVlbF9kcmluaywgZGVmdWVsX2Zvb2QKKyAgICAgUHJvcHM6ICAgICBQX0RSSU5LLCBQX0ZPT0QsIFBfQUxDT0hPTCwgUF9TUCwgUF9IUCwKKyAgICAgICAgICAgICAgICBQX0RFRlVFTF9USU1FX0RSSU5LCisgICAgIEtvbnplcHRlOiAgaGVpbHVuZywgZW50dGFua2VuLCBmb29kCisKK0xFVFpURSBBZU5ERVJVTkc6CisgICAgMjkuMDUuMjAxNSwgQm9pbmcKKwpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vY3JlYXRlIGIvZG9jL2xmdW4vY3JlYXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ODI2MDkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9jcmVhdGUKQEAgLTAsMCArMSw3OCBAQAorY3JlYXRlKCkKKworRlVOS1RJT046CisgICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZSgpOworICAgICB2b2lkIGNyZWF0ZSgpOworCitERUZJTklFUlQgSU46CisgICAgIGFsbGVuIFN0YW5kYXJkb2JqZWt0ZW4KKworQVJHVU1FTlRFOgorICAgICBrZWluZQorCitCRVNDSFJFSUJVTkc6CisgICAgIERpZXNlIEZ1bmt0aW9uIHdpcmQgYXVmZ2VydWZlbiwgd2VubiBlaW4gT2JqZWt0IGdlbGFkZW4gb2RlciBnZWNsb250CisgICAgIHdpcmQuCisgICAgIEluIGRpZXNlciBGdW5rdGlvbiB3aXJkIGRhcyBPYmpla3QgaW5pdGlhbGlzaWVydCB1bmQga29uZmlndXJpZXJ0LgorICAgICBXYWVocmVuZCBkZXMgY3JlYXRlKCkga2FubiBlcyBlaW5lbiB0aGlzX3BsYXllcigpL3RoaXNfaW50ZXJhY3RpdmUoKQorICAgICBnZWJlbiwgbXVzcyBhYmVyIG5pY2h0IQorICAgICBJbSBjcmVhdGUoKSBoYXQgZGFzIE9iamVrdCBub2NoIGtlaW4gZW52aXJvbm1lbnQoKS4KKyAgICAgY3JlYXRlKCkgd2lyZCBudXIgZ2VydWZlbiwgd2VubiBkYXMgT2JqZWt0ZSBnZWNsb250IG9kZXIgZXhwbGl6aXQgZ2VsYWRlbgorICAgICB3aXJkLiBXZW5uIGVzIGF1ZmdydW5kIGVpbmVzIGluaGVyaXQgaW4gZWluZW0gYW5kZXJlbiBPYmpla3Qgdm9tIERyaXZlcgorICAgICBnZWxhZGVuIHdpcmQsIHdpcmQgZGFzIGNyZWF0ZSgpIG5pY2h0IGF1c2dlZnVlaHJ0IChzLiBjcmVhdGVfc3VwZXIoKSkuCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIGtlaW5lcgorCitCRU1FUktVTkdFTjoKKyAgICAgRXJidCBtYW4gdm9uIGFuZGVyZW4gT2JqZWt0ZW4sIHNvIGJlc3RlaHQgZGllIGVyc3RlIEFrdGlvbiBpbm5lcmhhbGIKKyAgICAgdm9uIGNyZWF0ZSgpIG5vcm1hbGVyd2Vpc2UgZGFyaW4sIGluIGRpZXNlbiBPYmpla3RlbiBjcmVhdGUoKQorICAgICBhdWZ6dXJ1ZmVuLgorICAgICBEaWUgRnVua3Rpb24ga2FubiBwcm90ZWN0ZWQgb2RlciBzdGF0aWMgc2VpbiAoYWJlciBuaWNodCBwcml2YXRlKS4gRXMKKyAgICAgZHVlcmZ0ZSBmdWVyIGRpZSBtZWlzdGVuIE9iamVrdGUgc2lubnZvbGwgc2VpbiwgY3JlYXRlKCkgcHJvdGVjdGVkIHp1CisgICAgIGRla2xhcmllcmVuLgorCisgICAgIFVtIFNwZWljaGVyIHp1IHNwYXJlbiwga2FubiBtYW4gYmVpIEJsdWVwcmludHMgdm9uIGRlciBLb25maWd1cmllcnVuZworICAgICBhYnNlaGVuIChzaWVoZSBCZWlzcGllbCkuIERpZXMgc29sbHRlIG1hbiBhbGxlcmRpbmdzIG5pY2h0IGJlaSBPYmpla3RlbgorICAgICBtYWNoZW4sIHZvbiBkZW5lbiBrZWluZSBDbG9uZXMgZXJ6ZXVndCB3ZXJkZW4gc29sbGVuICh6Qi4gYmVpIFJhZXVtZW4pLiAKKworICAgICBNYW4gc29sbHRlIGJlaSBBYmJydWNoIGRlcyBjcmVhdGUoKSBpbiBCUCB1bmJlZGluZ3Qgc2V0X25leHRfcmVzZXQoLTEpOworICAgICBydWZlbiwgZGEgc29uc3QgZGllIChuaWNodCBrb25maWd1cmllcnRlKSBCUCByZXNldHRlbiBrYW5uIHVuZCBkYW5uCisgICAgIGJ1Z2d0LgorCitCRUlTUElFTEU6CisgICAgIEVpbiBHZWdlbnN0YW5kIHd1ZXJkZSB3aWUgZm9sZ3Qga29uZmlndXJpZXJ0OgorCisgICAgIGluaGVyaXQgInN0ZC90aGluZyI7CisKKyAgICAgI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKworICAgICBjcmVhdGUoKQorICAgICB7CisgICAgICAgLy8gV2VubiB3aXIgZGllIEJsdWVwcmludCBzaW5kOiBOSUNIVCBrb25maWd1cmllcmVuIQorICAgICAgIC8vIEJlaSBub3JtYWxlbiBSYWV1bWVuIG9kZXIgVHJhbnNwb3J0ZXJuIHNpbmQgZGllc2UgYmVpZGVuCisgICAgICAgLy8gWmVpbGVuIHdlZ3p1bGFzc2VuISEhCisgICAgICAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHsKKyAgICAgICAgICAgc2V0X25leHRfcmVzZXQoLTEpOyAgICAvLyB3aWNodGlnLCBkYW1pdCBkaWUgQlAgbmljaHQgcmVzZXR0ZXQuCisgICAgICAgICAgIHJldHVybjsKKyAgICAgICB9CisKKyAgICAgICAvLyBBbnNvbnN0ZW4gZGllIGFsbGdlbWVpbmVuIEVpZ2Vuc2NoYWZ0ZW4gdm9uIC9zdGQvdGhpbmcKKyAgICAgICAvLyBrb25maWd1cmllcmVuLi4uCisgICAgICAgOjpjcmVhdGUoKTsKKworICAgICAgIC8vIC4uLnVuZCBudW4gdW5zZXJlIHNwZXppZWxsZW4gRWlnZW5zY2hhZnRlbjoKKyAgICAgICBTZXRQcm9wKFBfTkFNRSwgIk11ZWxsIik7CisgICAgICAgU2V0UHJvcChQX1NIT1JULCAiTXVlbGwiKTsKKyAgICAgICBTZXRQcm9wKFBfTE9ORywgIlZvZWxsaWcgdW5udWV0emVyIE11ZWxsIVxuIik7CisgICAgICAgU2V0UHJvcChQX0FSVElDTEUsIDApOworICAgICAgIFNldFByb3AoUF9WQUxVRSwgMCk7CisgICAgICAgU2V0UHJvcChQX0dFTkRFUiwgTUFMRSk7CisgICAgIH0KKworU0lFSEUgQVVDSDoKKyAgICAgY3JlYXRlKEwpLCByZXNldChMKQorICAgICBob29rKEMpLCBjcmVhdGUoSCksIGNyZWF0ZV9vYihIKSwgY3JlYXRlX3N1cGVyKEgsIHJlc2V0KEgpCisgICAgIGNyZWF0ZShBKSwgcmVzZXQoQSkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzIyLjEwLjIwMDcsIFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL2NyZWF0ZV9kZWZhdWx0X25wYyBiL2RvYy9sZnVuL2NyZWF0ZV9kZWZhdWx0X25wYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzMxYzVjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vY3JlYXRlX2RlZmF1bHRfbnBjCkBAIC0wLDAgKzEsNTUgQEAKK2NyZWF0ZV9kZWZhdWx0X25wYygpCitGVU5LVElPTjoKKyAgICAgdmFyYXJncyB2b2lkIGNyZWF0ZV9kZWZhdWx0X25wYyggaW50IGxldmVsLCBpbnQgbWF4aHAgKTsKKworQkVOVVRaVU5HOgorICAgICBpbmhlcml0ICJzdGQvbnBjIjsKKworRlVOS1RJT046CisgICAgIFNldHplIGRpZSBEYXRlbiBlaW5lcyBNb25zdGVycyBhdWYgZWluZW4gZ2V3aXNzZW4gTGV2ZWwuCisKKyAgICAgRGVyIExldmVsIHNvbGx0ZSB6d2lzY2hlbiAxIHVuZCAyMCBsaWVnZW4uIERpZSBTdGF0cyB3ZXJkZW4gYXVmIGRpZXNlbgorICAgICBMZXZlbCBnZXNldHp0IHVuZCBtZWhyZXJlIGFuZGVyZSBXZXJ0ZSwgc28gZGFzcyBkYXMgTW9uc3RlciB2b24gZGVyCisgICAgIFN0YWVya2UgaGVyIGVpbmVtIFNwaWVsZXIgZ2xlaWNoZW4gTGV2ZWxzIGVudHNwcmljaHQuCisKKyAgICAgV2lyZCBkZXIgKG9wdGlvbmFsZSkgUGFyYW1ldGVyIG1heGhwIHdlZ2dlbGFzc2VuLCB3aXJkIGRpZXNlciBiZXJlY2huZXQKKyAgICAgbmFjaDoKKyAgICAgICAgICBtYXhocCA9IDQyICsgOCAqIGxldmVsCisKKyAgICAgRGllIGdlbmF1ZW4gV2VydGUgc2luZDoKKyAgICAgICAgICBQX0xFVkVMIDogbGV2ZWwKKyAgICAgICAgICBQX01BWF9IUDogbWF4aHAKKyAgICAgICAgICBQX01BWF9TUDogbWF4aHAKKyAgICAgICAgICBQX0hBTkRTIDogMTAgKiBsZXZlbAorICAgICAgICAgIFBfQk9EWSAgOiAoMjAvMykgKiBsZXZlbAorICAgICAgICAgIFBfWFAgICAgOiA1MCAqIGxldmVsICogbWF4aHAgKD09IDUgKiBQX0hBTkRTICogbWF4X2hwKQorCisgICAgICAgICAgQV9TVFIsIEFfSU5ULCBBX0RFWCwgQV9DT04gOiBsZXZlbAorCitCRU1FUktVTkc6CisgICAgIERpZXNlIEZ1bmt0aW9uIHNvbGx0ZSBudXIgaW0gY3JlYXRlKCkgZWluZXMgTW9uc3RlcnMgYmVudXR6dCB3ZXJkZW4uCisgICAgIE9iZW4gYmVzY2hyaWViZW5lIFdlcnRlLCBkaWUgdm9yIGRlbSBBdWZydWYgZGVyIEZ1bmt0aW9uIGdlc2V0enQKKyAgICAgd3VyZGVuLCB3ZXJkZW4gZHVyY2ggZGllIG5ldWVuIFdlcnRlIGVyc2V0enQuCisKKyAgICAgQWIgZWluZW0gQXVmcnVmIG1pdCBMZXZlbCAyMCB3ZXJkZW4gUF9YUCA9IDIwMjAwMCBnZXNldHp0LCBhbHNvIGVpbgorICAgICBLaWxsLVN0dXAgdmVyZ2ViZW4gKHNpZWhlIFBfWFApLgorCitCRUlTUElFTDoKKyAgICAgY3JlYXRlX2RlZmF1bHRfbnBjKDE3KSBlcmdpYnQ6CisKKyAgICAgICAgICBQX0xFVkVMIDogMTcKKyAgICAgICAgICBQX01BWF9IUDogMTc4CisgICAgICAgICAgUF9NQVhfU1A6IDE3OAorICAgICAgICAgIFBfSEFORFMgOiAxNzAKKyAgICAgICAgICBQX0JPRFkgIDogMTEzCisgICAgICAgICAgUF9YUCAgICA6IDE1MTMwMAorCisgICAgICAgICAgQV9TVFIsIEFfSU5ULCBBX0RFWCwgQV9DT04gOiAxNworCitTSUVIRSBBVUNIOgorICAgICBGdW5rdGlvbmVuOiAgQWRkRXhwKCksIEdpdmVLaWxsU2NvcmUoKQorICAgICBQcm9wZXJ0aWVzOiAgUF9YUAorICAgICAgICAgICAgICAgICAgUF9MRVZFTCwgUF9NQVhfSFAsIFBfTUFYX1NQLCBQX0hBTkRTLCBQX0JPRFkKKyAgICAgU29uc3RpZ2VzOiAgIG5wY3MKKworMTQuRmViIDIwMDcgR2xvaW5zb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9jcmVhdGVfc3VwZXIgYi9kb2MvbGZ1bi9jcmVhdGVfc3VwZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ3MjVhNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL2NyZWF0ZV9zdXBlcgpAQCAtMCwwICsxLDQ5IEBACitjcmVhdGVfc3VwZXIoKQorCitGVU5LVElPTjoKKyAgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlX3N1cGVyKCk7CisKK0RFRklOSUVSVCBJTjoKKyAgICAgYWxsZW4gU3RhbmRhcmRvYmpla3RlbgorCitBUkdVTUVOVEU6CisgICAgIGtlaW5lCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGllc2UgRnVua3Rpb24gd2lyZCBpbW1lciBkYW5uIGF1ZmdlcnVmZW4sIHdlbm4gZWluIE9iamVrdCBpbXBsaXppdCBkdXJjaAorICAgICBlaW4gJ2luaGVyaXQnIGluIGVpbmVtIGVyYmVuZGVuIE9iamVrdGUgZ2VsYWRlbiB3aXJkLgorICAgICBOb3JtYWx3ZWlzZSBtdXNzIG1hbiBkaWVzZXMgc28gZ2VsYWRlbmUgT2JqZWt0ZSBuaWNodCBrb25maWd1cmllcmVuLCB3ZWlsCisgICAgIG51ciBkYXMgUHJvZ3JhbW0gZGllc2VzIE9iamVrdGVzIGZ1ZXIgZGllIGVyYmVuZGVuIE9iamVrdGUgaW50ZXJlc3NhbnQKKyAgICAgaXN0LCBuaWNodCBzZWluZSBEYXRlbi4KKyAgICAgV2FzIGhpZXIgYWJlciB6LkIuIHNpbm52b2xsIGlzdCwgaXN0IGRhcyBBYnNjaGFsdGVuIGRlcyBSZXNldHMsIGRlbm4gZWluCisgICAgIE9iamVrdCwgd2FzIG51ciBkYXp1IGRpZW50LCBkYXNzIGVzIHZvbiBhbmRlcmVuIGdlZXJidCB3aXJkLCBicmF1Y2h0CisgICAgIGtlaW5lbiBSZXNldCwgYXVjaCB3ZW5uIGVzIGVpbiByZXNldCgpIGRlZmluaWVydCAod2FzIGluIGVyYmVuZGVuIE9iamVrdGUKKyAgICAgYmVudXR6dCB3aXJkKS4KKyAgICAgRGllIGNyZWF0ZV9zdXBlcigpIGluIGRlbiBTdGFuZGFyZG9iamVrdGVuIHR1biBtb21lbnRhbiBnZW5hdSBkaWVzZXMuCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIGtlaW5lcgorCitCRU1FUktVTkdFTjoKKyAgICAgV2VubiBpaHIgdm9uIC9zdGQvIGVyYnQsIGJyYXVjaHQgaWhyIGV1Y2ggaW4gYWxsZXIgUmVnZWwgdW0gZGllc2UKKyAgICAgRnVua3Rpb24ga2VpbmUgR2VkYW5rZW4gbWFjaGVuLgorICAgICBJaHIga29lbm50IGRpZXNlIEZ1bmt0aW9uIGFiZXIgaW4gT2JqZWt0ZW4gc2VsYmVyIGRlZmluaWVyZW4sIGRpZSBudXIgenVtCisgICAgIEVyYmVuIGdlZGFjaHQgc2luZC4gRGllcyBrYW5uIHNpbm52b2xsIGVpbiwgd2VubiBpaHIgbmljaHQgdm9uIC9zdGQvIGVyYnQKKyAgICAgdW5kIGVpbiByZXNldCgpIGltIE9iamVrdCBoYWJ0IG9kZXIgd2FzIG1hY2hlbiB3b2xsdCwgd2FzIHVlYmVyIGRhcworICAgICBBYnNjaGFsdGVuIGRlcyBSZXNldHMgaGluYXVzZ2VodC4KKworQkVJU1BJRUxFOgorICAgICBHZWdlYmVuIHNlaSBmb2xnZW5kZSBWZXJlcmJ1bmdza2V0dGU6CisgICAgIC9zdGQvcm9vbSAtPiAvZC9pbnNlbG4vemVzc3RyYS9zdGRyYXVtIC0+IC9kL2luc2Vsbi96ZXNzdHJhL3JhdW0KKworICAgICBXaXJkIG51biAncmF1bScgZ2VsYWRlbiB1bmQgJ3N0ZHJhdW0nIGlzdCBub2NoIG5pY2h0IGdlbGFkZW4sIHdpcmQgZGVyCisgICAgIERyaXZlciBpbXBsaXppdCB2b24gc2VsYnN0ICdzdGRyYXVtJyBsYWRlbiAod2VpbCAncmF1bScgZGFzIFByb2dyYW1tIHZvbgorICAgICAnc3RkcmF1bScgYnJhdWNodCkuIEJlaSBkaWVzZW0gTGFkZW4gd2lyZCBkYXMgY3JlYXRlKCkgaW4gJ3N0ZHJhdW0nIG5pY2h0CisgICAgIGF1c2dlZnVlaHJ0LCBzb25kZXJuIHN0YXR0ZGVzc2VuIGNyZWF0ZV9zdXBlcigpLgorICAgIAorU0lFSEUgQVVDSDoKKyAgICAgY3JlYXRlKEwpLCByZXNldChMKQorICAgICBob29rKEMpLCBjcmVhdGUoSCksIGNyZWF0ZV9vYihIKSwgY3JlYXRlX3N1cGVyKEgsIHJlc2V0KEgpCisgICAgIGNyZWF0ZShBKSwgcmVzZXQoQSkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzIyLjEwLjIwMDcsIFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL2RlZnVlbF9kcmluayBiL2RvYy9sZnVuL2RlZnVlbF9kcmluawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2U4MzRkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vZGVmdWVsX2RyaW5rCkBAIC0wLDAgKzEsNTkgQEAKK0ZVTktUSU9OOgorICAgIGludCBkZWZ1ZWxfZHJpbmsoKTsKKworREVGSU5JRVJUIElOOgorICAgIC9zdGQvbGl2aW5nL2xpZmUuYworCitBUkdVTUVOVEU6CisgICAgS2VpbmUuCisgICAgICAgIAorQkVTQ0hSRUlCVU5HOgorICAgIEVudHRhbmt0IGRlbiBTcGllbGVyIGF1dG9tYXRpc2NoIHVtIGVpbmVuIGdld2lzc2VuIEZsdWVzc2lna2VpdHMtV2VydCwKKyAgICBzb2Zlcm4gZGVyIFNwaWVsZXIgdWViZXIgZWluZXIgYmVzdGltbXRlbiBFbnR0YW5rLUdyZW56ZSBsaWVndCB1bmQgc2VpdAorICAgIHNlaW5lbSBsZXR6dGVuIEVudHRhbmtlbiBlaW5lIGdld2lzc2UgWmVpdCB2ZXJnYW5nZW4gaXN0LgorICAgIEFsbGUgZGllc2UgV2VydGUgc2luZCByYXNzZW5hYmhhZW5naWcuCisgICAgQXVzc2VyZGVtIHdpcmQgZGVtIFNwaWVsZXIgZWluZSBnZXdpc3NlIE1lbmdlIEFsa29ob2wgZW50em9nZW4uIEVyIHdpcmQKKyAgICBhbHNvIG1pdCBqZWRlbSBmbHVlc3NpZ2VuIEVudHRhbmtlbiBldHdhcyBudWVjaHRlcm5lci4KKworICAgIEVzIGlzdCBhbHNvIE5JQ0hUIG1vZWdsaWNoLCBFaW5mbHVzcyBhdWYgZGllIE1lbmdlIGRlcyBFbnR0YW5rZW5zCisgICAgenUgbmVobWVuLiBEYXMgaXN0IGhpZXIgc28gZ2V3b2xsdC4KKworICAgIEhhdCBkZXIgU3BpZWxlciBtaW5kZXN0ZW5zIAorICAgICogUF9ERUZVRUxfTElNSVRfRFJJTksgaW4gUF9EUklOSworICAgIGthbm4gZXIgYWxsZQorICAgICogUF9ERUZVRUxfVElNRV9EUklOSworICAgIHVtCisgICAgKiAoeD1QX0RSSU5LKlBfREVGVUVMX0FNT1VOVF9EUklOSy8yKSArIHJhbmRvbSh4KQorICAgICAgKGFsc28gdW0gKDUwIGJpcyAxMDAgKiBQX0RSSU5LKSBQcm96ZW50KQorICAgIGVudHRhbmtlbi4KKworUlVFQ0tHQUJFV0VSVEU6CisgICAgREVGVUVMX1RPT19TT09OOiAtMiwgd2VubiBFbnR0YW5raW50ZXJ2YWxsemVpdGVuIHp1IGt1cnouCisgICAgREVGVUVMX1RPT19MT1c6ICAtMSwgd2VubiBFbnR0YW5rZ3JlbnplIG5vY2ggbmljaHQgZXJyZWljaHQuCisgICAgTk9fREVGVUVMOiAgICAgICAgMCwgd2VubiBFbnR0YW5rZW4gbmljaHQgbm9ldGlnIHdhciAoU3BpZWxlciB3YXIgbGVlcikKKyAgICA+MCwgd2VubiBFcmZvbGcgKGVudHRhbmt0ZSBXZXJ0IHdpcmQgenVydWVja2dlZ2ViZW4pLgorCisgICAgKEtvbnN0YW50ZW4ga29tbWVuIGF1cyAvc3lzL2RlZnVlbC5oKQorCitCRU1FUktVTkc6CisgICAgQml0dGUgZGVmdWVsX2RyaW5rKCkgYmVudXR6ZW4gdW5kIG5pY2h0IFBfRFJJTksgb2RlciBQX01BWF9EUklOSyBkZXMKKyAgICBtYW5pcHVsaWVyZW4hCisKKyAgICBFcyBnaWJ0IGtlaW5lIGVpZ2VuZSBNZXRob2RlIGZ1ZXIgZGllIFZlcnJpbmdlcnVuZyB2b24gUF9BTENPSE9MLgorCisgICAgQWNodHVuZzogTnVyIFRvaWxldHRlbiBzb2xsdGVuIGRpZXNlIEZ1bmt0aW9uIGltIFNwaWVsZXIgYXVmcnVmZW4hCisKK0JFSVNQSUVMOgorICAgIHMuIEJzcC4genUgZGVmdWVsX2Zvb2QoKQorCitTSUVIRSBBVUNIOgorICAgICBBZWhubGljaDogIGRlZnVlbF9mb29kCisgICAgIFRhbmtlbjogICAgY29uc3VtZSwgZHJpbmtfYWxjb2hvbCwgZHJpbmtfc29mdCwgZWF0X2Zvb2QKKyAgICAgSGVpbHVuZzogICBoZWFsX3NlbGYsIHJlc3RvcmVfc3BlbGxfcG9pbnRzLCByZXN0b3JlX2hpdF9wb2ludHMsIAorICAgICAgICAgICAgICAgIGJ1ZmZlcl9ocCwgYnVmZmVyX3NwCisgICAgIFRpbWluZzogICAgY2hlY2tfYW5kX3VwZGF0ZV90aW1lZF9rZXkKKyAgICAgUHJvcHM6ICAgICBQX0RSSU5LLCBQX0ZPT0QsIFBfQUxDT0hPTCwgUF9TUCwgUF9IUCwKKyAgICAgICAgICAgICAgICBQX0RFRlVFTF9USU1FX0ZPT0QsIFBfREVGVUVMX1RJTUVfRFJJTksKKyAgICAgS29uemVwdGU6ICBoZWlsdW5nLCBlbnR0YW5rZW4sIGZvb2QKKworOS4gQXVndXN0IDIwMTUgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL2RlZnVlbF9mb29kIGIvZG9jL2xmdW4vZGVmdWVsX2Zvb2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU4OTExMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL2RlZnVlbF9mb29kCkBAIC0wLDAgKzEsODUgQEAKK0ZVTktUSU9OOgorICAgIGludCBkZWZ1ZWxfZm9vZCgpOworCitERUZJTklFUlQgSU46CisgICAgL3N0ZC9saXZpbmcvbGlmZS5jCisKK0FSR1VNRU5URToKKyAgICBLZWluZS4KKworQkVTQ0hSRUlCVU5HOgorICAgIEVudHRhbmt0IGRlbiBTcGllbGVyIGF1dG9tYXRpc2NoIHVtIGVpbmVuIGdld2lzc2VuIEVzc2Vucy1XZXJ0LAorICAgIHNvZmVybiBkZXIgU3BpZWxlciB1ZWJlciBlaW5lciBiZXN0aW1tdGVuIEVudHRhbmstR3JlbnplIGxpZWd0IHVuZCBzZWl0CisgICAgc2VpbmVtIGxldHp0ZW4gRW50dGFua2VuIGVpbmUgZ2V3aXNzZSBaZWl0IHZlcmdhbmdlbiBpc3QuCisgICAgQWxsZSBkaWVzZSBXZXJ0ZSBzaW5kIHJhc3NlbmFiaGFlbmdpZy4KKworICAgIEVzIGlzdCBhbHNvIE5JQ0hUIG1vZWdsaWNoLCBFaW5mbHVzcyBhdWYgZGllIE1lbmdlIGRlcyBFbnR0YW5rZW5zCisgICAgenUgbmVobWVuLiBEYXMgaXN0IGhpZXIgc28gZ2V3b2xsdC4KKworICAgIEhhdCBkZXIgU3BpZWxlciBtaW5kZXN0ZW5zIAorICAgICogUF9ERUZVRUxfTElNSVRfRk9PRCBpbiBQX0ZPT0QKKyAgICBrYW5uIGVyIGFsbGUKKyAgICAqIFBfREVGVUVMX1RJTUVfRk9PRAorICAgIHVtCisgICAgKiAoeD1QX0RSSU5LKlBfREVGVUVMX0FNT1VOVF9GT09ELzIpICsgcmFuZG9tKHgpCisgICAgICAoYWxzbyB1bSAoNTAgYmlzIDEwMCAqIFBfRk9PRCkgUHJvemVudCkKKyAgICBlbnR0YW5rZW4uCisKK1JVRUNLR0FCRVdFUlRFOgorICAgIERFRlVFTF9UT09fU09PTjogLTIsIHdlbm4gRW50dGFua2ludGVydmFsbHplaXRlbiB6dSBrdXJ6LgorICAgIERFRlVFTF9UT09fTE9XOiAgLTEsIHdlbm4gRW50dGFua2dyZW56ZSBub2NoIG5pY2h0IGVycmVpY2h0LgorICAgIE5PX0RFRlVFTDogICAgICAgIDAsIHdlbm4gRW50dGFua2VuIG5pY2h0IG5vZXRpZyB3YXIgKFNwaWVsZXIgd2FyIGxlZXIpCisgICAgPjAsIHdlbm4gRXJmb2xnIChlbnR0YW5rdGUgV2VydCB3aXJkIHp1cnVlY2tnZWdlYmVuKS4KKworICAgIChLb25zdGFudGVuIGtvbW1lbiBhdXMgL3N5cy9kZWZ1ZWwuaCkKKworQkVNRVJLVU5HOgorICAgIEJpdHRlIGRlZnVlbF9mb29kKCkgYmVudXR6ZW4gdW5kIG5pY2h0IFBfRk9PRCBvZGVyIFBfTUFYX0ZPT0QgZGVzCisgICAgU3BpZWxlcnMgbWFuaXB1bGllcmVuIQorCisgICAgQWNodHVuZzogTnVyIFRvaWxldHRlbiBzb2xsdGVuIGRpZXNlIEZ1bmt0aW9uIGltIFNwaWVsZXIgYXVmcnVmZW4hCisKK0JFSVNQSUVMOgorICAgIGludCBhY3Rpb25fZW50dGFua2VuKCkgeworICAgICAgc3RyaW5nIG1zZzsKKyAgICAgIGludCB2YWwgPSB0aGlzX3BsYXllcigpLT5kZWZ1ZWxfZm9vZCgpOworCisgICAgICBzd2l0Y2ggKHZhbCkgeworICAgICAgICBjYXNlIERFRlVFTF9UT09fU09PTjoKKyAgICAgICAgICBtc2cgPSAiRHUgd2Fyc3QgZG9jaCBlcnN0IHZvciBrdXJ6ZW0gYXVmIFRvaWxldHRlLi4uIjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBERUZVRUxfVE9PX0xPVzoKKyAgICAgICAgICBtc2cgPSAiRHUgdmVyc3VjaHN0IERpY2ggenUgZW50bGVlcmVuLCBhYmVyIGlyZ2VuZHdpZSB3aWxsICIKKyAgICAgICAgICAgICAgICAiZGFzIG5pY2h0IHNvIHJlY2h0IGtsYXBwZW4uIjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOT19ERUZVRUw6CisgICAgICAgICAgbXNnID0gIkR1IGhhc3Qgc2VpdCBsYW5nZW0gbmljaHRzIGdlZ2Vzc2VuLCB3aWUgd2lsbHN0IER1IGRhbm4gIgorICAgICAgICAgICAgICAgICJ3YXMgbG9zd2VyZGVuIGtvZW5uZW4/IjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBzdHJpbmcgcXVhbGlmaWVyOworICAgICAgICAgIGludCBmdXp6eXBlcmNlbnQgPSAoOTArcmFuZG9tKDIwKSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwvdGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKFBfTUFYX0ZPT0QpOworICAgICAgICAgIHN3aXRjaChmdXp6eXBlcmNlbnQpIHsKKyAgICAgICAgICAgIGNhc2UgMC4uNTA6ICBxdWFsaWZpZXIgPSAiZXR3YXMiOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTEuLjc1OiBxdWFsaWZpZXIgPSAiZW5vcm0iOyBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6ICAgICBxdWFsaWZpZXIgPSAidW5nbGF1YmxpY2giOyBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgbXNnID0gIkR1IGVudGxlZXJzdCBEaWNoICIrcXVhbGlmaWVyIisuIFB1aCwgZGFzIHRhdCBndXQhIjsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksIGJyZWFrX3N0cmluZyhtc2csIDc4KSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKK1NJRUhFIEFVQ0g6CisgICAgIEFlaG5saWNoOiAgZGVmdWVsX2RyaW5rCisgICAgIFRhbmtlbjogICAgY29uc3VtZSwgZHJpbmtfYWxjb2hvbCwgZHJpbmtfc29mdCwgZWF0X2Zvb2QKKyAgICAgSGVpbHVuZzogICBoZWFsX3NlbGYsIHJlc3RvcmVfc3BlbGxfcG9pbnRzLCByZXN0b3JlX2hpdF9wb2ludHMsIAorICAgICAgICAgICAgICAgIGJ1ZmZlcl9ocCwgYnVmZmVyX3NwCisgICAgIFRpbWluZzogICAgY2hlY2tfYW5kX3VwZGF0ZV90aW1lZF9rZXkKKyAgICAgUHJvcHM6ICAgICBQX0RSSU5LLCBQX0ZPT0QsIFBfQUxDT0hPTCwgUF9TUCwgUF9IUCwKKyAgICAgICAgICAgICAgICBQX0RFRlVFTF9USU1FX0ZPT0QsIFBfREVGVUVMX1RJTUVfRFJJTksKKyAgICAgS29uemVwdGU6ICBoZWlsdW5nLCBlbnR0YW5rZW4sIGZvb2QKKworOS4gQXVndXN0IDIwMTUgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL2RlcmVnaXN0ZXJfbW9kaWZpZXIgYi9kb2MvbGZ1bi9kZXJlZ2lzdGVyX21vZGlmaWVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYjU0MWUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9kZXJlZ2lzdGVyX21vZGlmaWVyCkBAIC0wLDAgKzEsMjQgQEAKK2RlcmVnaXN0ZXJfbW9kaWZpZXIoKQorRlVOS1RJT046CisgICAgIHZvaWQgZGVyZWdpc3Rlcl9tb2RpZmllcihvYmplY3QgbW9kaWZpZXIpCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC9saXZpbmcvYXR0cmlidXRlcy5jCisNCitQQVJBTUVURVI6DQorICAgICBtb2RpZmllcgktIE9iamVrdCBtaXQgUF9YX0FUVFJfTU9EIG9kZXIgUF9NX0FUVFJfTU9EDQorCitCRVNDSFJFSUJVTkc6CisgICAgIE1lbGRldCBlaW5lbiBNb2RpZmllciBpbSBTcGllbGVyIGFiLiBXaXJkIGR1cmNoIFJlbW92ZVNlbnNpdGl2ZU9iamVjdAorICAgICBiZXppZWh1bmdzd2Vpc2UgYmVpbSBBdXN6aWVoZW4gb2RlciBXZWdzdGVja2VuIGdlcnVmZW4uCisgICAgIE11c3MgbmljaHQgZGlyZWt0IGdlcnVmZW4gd2VyZGVuLiBCZWkgVmVyYWVuZGVydW5nZW4gdm9uIE1vZGlmaWthdG9yZW4KKyAgICAgc29sbHRlIHN0YXR0ZGVzc2VuIFVwZGF0ZUF0dHJpYnV0ZXMgZ2VydWZlbiB3ZXJkZW4uICAgICAKKworU0lFSEUgQVVDSDoKKyAgICAgUXVlcnlBdHRyaWJ1dGUoKSwgUXVlcnlSZWFsQXR0cmlidXRlKCksIFF1ZXJ5QXR0cmlidXRlT2Zmc2V0KCksDQorICAgICBTZXRBdHRyKCksIFNldEF0dHJpYnV0ZSgpLCBTZXRSZWFsQXR0cmlidXRlKCksIFVwZGF0ZUF0dHJpYnV0ZXMoKSwNCisgICAgIHJlZ2lzdGVyX21vZGlmaWVyKCksUF9BVFRSSUJVVEVTLCBQX0FUVFJJQlVURVNfT0ZGU0VUUywgCisgICAgIFBfQVRUUklCVVRFU19NT0RJRklFUiwgUF9YX0FUVFJfTU9ELCBQX01fQVRUUl9NT0QsIAorICAgICAvc3RkL2xpdmluZy9hdHRyaWJ1dGVzLmMNCisKKzEzLkp1bi4yMDA0LCBNdWFkaWIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9kaWUgYi9kb2MvbGZ1bi9kaWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UwNTVmOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL2RpZQpAQCAtMCwwICsxLDQ1IEBACitkaWUoKQorCitGVU5LVElPTjoKKyAgICAgcHVibGljIHZhcmFyZ3Mgdm9pZCBkaWUoaW50IHBvaXNvbmRlYXRoLGludCBleHRlcm4pOworCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvbGl2aW5nL2xpZmUuYworCitBUkdVTUVOVEU6CisgICAgIGludCBwb2lzb25kZWF0aAorCSAgRGllc2VzIEZsYWcgc29sbHRlIGJlaSBlaW5lbSBHaWZ0dG9kIChQX1BPSVNPTikgZ2VzZXR6dCBzZWluLgorICAgICBpbnQgZXh0ZXJuCisJICBJbnRlcm4uCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGFzIExlYmV3ZXNlbiBzdGlyYnQsIG1laXN0IGF1dG9tYXRpc2NoIHZvbiBkb19kYW1hZ2UoKSBhdXNnZWxvZXN0LCB3ZW5uCisgICAgIDAgSFAgdW50ZXJzY2hyaXR0ZW4gd2VyZGVuLiBJbiBkaWVzZW0gRmFsbCB3aXJkIGRlciBLYW1wZiBiZWVuZGV0LCBHaWZ0LAorICAgICBBbGtvaG9sLCBUcmluay0gdW5kIEVzc3dlcnRlLCBCbGluZGhlaXQsIFRhdWJoZWl0IHUucy53LiBhdWYgTnVsbAorICAgICBnZXNldHp0IG9kZXIgZ2Vsb2VzY2h0LgorCisgICAgIEVzIHdpcmQgYXV0b21hdGlzY2ggZWluZSBMZWljaGUgKHNpZWhlIGF1Y2ggUF9DT1JQU0UsIFBfTk9DT1JQU0UpIG5lYnN0CisgICAgIFRvZGVzbWVsZHVuZ2VuIChzaWVoZSBhdWNoIFBfRElFX01TRykgZXJ6ZXVndCwgdW5kIGZ1ZXIgU3BpZWxlciB3ZXJkZW4KKyAgICAgS2lsbHN0dXBzZSB2ZXJnZWJlbiwgc29mZXJuIG5vdHdlbmRpZy4KKworICAgICBVZWJlciBkZW4gSG9vayBQX1RNUF9ESUVfSE9PSyBrYW5uIG1hbiBqZWRvY2ggYXVmIGRlbiBBdXRvbWF0aXNtdXMKKyAgICAgRWluZmx1c3MgbmVobWVuLCB6LkIuIGtvZW5udGUgZWluIHRlbXBvcmFlcmVyIFRvZGVzYmFubi1aYXViZXIgZGFzCisgICAgIFN0ZXJiZW4gZnVlciBrdXJ6ZSBaZWl0IHZlcmhpbmRlcm4uCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIGtlaW5lcgorCitCRU1FUktVTkdFTjoKKyAgICAgRGllc2UgRnVua3Rpb24gc29sbHRlIG51ciBzZWx0ZW4gZGlyZWt0IHZlcndlbmRldCB3ZXJkZW4uIE1laXN0IGlzdCBkZXIKKyAgICAgdWVibGljaGUgV2VnIHVlYmVyIERlZmVuZCgpIC0+IGRvX2RhbWFnZSgpIC0+IGRpZSgpIGRpZSBsb2dpc2NoIGJlc3NlcmUKKyAgICAgdW5kIGJhbGFuY2V0ZWNobmlzY2ggZ3VlbnN0aWdlcmUgTG9lc3VuZy4KKworU0lFSEUgQVVDSDoKKyAgICAgVG9kZXN1cnNhY2hlbjoJRGVmZW5kKEwpLCBkb19kYW1hZ2UoTCksIFBfUE9JU09OCisgICAgIFZlcndhbmR0OgkJUF9UTVBfRElFX0hPT0ssIFBfREVBRFMKKyAgICAgVG9kZXNtZWxkdW5nZW46CVBfS0lMTF9OQU1FLCBQX0tJTExfTVNHLCBQX01VUkRFUl9NU0csIFBfRElFX01TRworCQkJUF9aQVBfTVNHLCBQX0VORU1ZX0RFQVRIX1NFUVVFTkNFCisgICAgIFNvbnN0aWdlczoJCVBfQ09SUFNFLCBQX05PQ09SUFNFLCAvc3RkL2NvcnBzZS5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IE1vbiBNYXkgMTQgMTY6MjA6MzQgMjAwMSBieSBQYXRyeW4KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL2RvVW53ZWFyTWVzc2FnZSBiL2RvYy9sZnVuL2RvVW53ZWFyTWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDI5ZWEyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vZG9VbndlYXJNZXNzYWdlCkBAIC0wLDAgKzEsMjggQEAKK2RvVW53ZWFyTWVzc2FnZSgpCisKK0ZVTktUSU9OOgorCXZvaWQgZG9VbndlYXJNZXNzYWdlKG9iamVjdCB3b3JuX2J5LCBpbnQgYWxsKTsKKworREVGSU5JRVJUIElOOgorCS9zdGQvYXJtb3VyL2NvbWJhdC5jCisKK0FSR1VNRU5URToKKwl3b3JuX2J5CisgICAgICAgICAgRGFzIExlYmV3ZXNlbiwgZGFzcyBkaWUgUnVlc3R1bmcgYmlzaGVyIGdldHJhZ2VuIGhhdAorICAgICAgICBhbGwKKyAgICAgICAgICBXdXJkZSAiemllaGUgYWxsZXMgYXVzIi8iemllaGUgYWxsZSBydWVzdHVuZ2VuIGF1cyIgZWluZ2VnZWJlbiwKKyAgICAgICAgICBzbyBpc3QgYWxsIGdlc2V0enQsIGFuc29uc3RlbiBuaWNodC4KKworQkVTQ0hSRUlCVU5HOgorICAgICAgICBEaWVzZSBGdW5rdGlvbiBnaWJ0IGJlaW0gQXVzemllaGVuIGVpbmVyIFJ1ZXN0dW5nIGRpZSBlbnRzcHIuCisgICAgICAgIE1lbGR1bmcgYW4gZGVuIFRyYWVnZXIgdW5kIGRpZSBVbWdlYnVuZyBhdXMuCisKK1JVZUNLR0FCRVdFUlQ6CisJa2VpbmVyCisKK1NJRUhFIEFVQ0g6CisgICAgICAgIGRvV2Vhck1lc3NhZ2UoKSwgZG9XaWVsZE1lc3NhZ2UoKSwgZG9VbndpZWxkTWVzc2FnZSgpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFNhdCBKdW4gMjYgMTU6NDE6MDAgMTk5OSBieSBQYXJhY2Vsc3VzCisKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL2RvVW53aWVsZE1lc3NhZ2UgYi9kb2MvbGZ1bi9kb1Vud2llbGRNZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZjA3Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9kb1Vud2llbGRNZXNzYWdlCkBAIC0wLDAgKzEsMjUgQEAKK2RvVW53aWVsZE1lc3NhZ2UoKQorCitGVU5LVElPTjoKKwl2b2lkIGRvVW53aWVsZE1lc3NhZ2Uob2JqZWN0IHdpZWxkZWRfYnkpOworCitERUZJTklFUlQgSU46CisJL3N0ZC93ZWFwb24vY29tYmF0LmMKKworQVJHVU1FTlRFOgorCXdpZWxkZWRfYnkKKyAgICAgICAgICBEYXMgTGViZXdlc2VuLCBkYXNzIGRpZSAoUGFyaWVyKVdhZmZlIGJpc2hlciBnZXp1ZWNrdCBoYXR0ZS4KKworQkVTQ0hSRUlCVU5HOgorICAgICAgICBEaWVzZSBGdW5rdGlvbiBnaWJ0IGJlaW0gV2Vnc3RlY2tlbiBlaW5lciBXYWZmZSBkaWUgZW50c3ByLgorICAgICAgICBNZWxkdW5nIGFuIGRlbiBCZW51dHplciB1bmQgZGllIFVtZ2VidW5nIGF1cy4KKworUlVlQ0tHQUJFV0VSVDoKKwlrZWluZXIKKworU0lFSEUgQVVDSDoKKyAgICAgICAgZG9XZWFyTWVzc2FnZSgpLCBkb1Vud2Vhck1lc3NhZ2UoKSwgZG9XaWVsZE1lc3NhZ2UoKQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBTYXQgSnVuIDI2IDE1OjMyOjAwIDE5OTkgYnkgUGFyYWNlbHN1cworCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9kb1dlYXJNZXNzYWdlIGIvZG9jL2xmdW4vZG9XZWFyTWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTYyZDVjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vZG9XZWFyTWVzc2FnZQpAQCAtMCwwICsxLDI2IEBACitkb1dlYXJNZXNzYWdlKCkKKworRlVOS1RJT046CisJdmFyYXJncyB2b2lkIGRvV2Vhck1lc3NhZ2UoaW50IGFsbCk7CisKK0RFRklOSUVSVCBJTjoKKwkvc3RkL2FybW91ci9jb21iYXQuYworCitBUkdVTUVOVEU6CisJYWxsCisgICAgICAgICAgV3VyZGUgInRyYWdlIGFsbGVzIi8idHJhZ2UgYWxsZSBydWVzdHVuZ2VuIiBlaW5nZWdlYmVuLCBzbworICAgICAgICAgIGlzdCBhbGwgZ2VzZXR6dCwgYW5zb25zdGVuIG5pY2h0LgorCitCRVNDSFJFSUJVTkc6CisgICAgICAgIERpZXNlIEZ1bmt0aW9uIGdpYnQgYmVpbSBBbnppZWhlbiBlaW5lciBSdWVzdHVuZyBkaWUgZW50c3ByLgorICAgICAgICBNZWxkdW5nIGFuIGRlbiBUcmFlZ2VyIHVuZCBkaWUgVW1nZWJ1bmcgYXVzLgorCitSVWVDS0dBQkVXRVJUOgorCWtlaW5lcgorCitTSUVIRSBBVUNIOgorICAgICAgICBkb1Vud2Vhck1lc3NhZ2UoKSwgZG9XaWVsZE1lc3NhZ2UoKSwgZG9VbndpZWxkTWVzc2FnZSgpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFNhdCBKdW4gMjYgMTU6MzA6MDAgMTk5OSBieSBQYXJhY2Vsc3VzCisKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL2RvV2llbGRNZXNzYWdlIGIvZG9jL2xmdW4vZG9XaWVsZE1lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMxNWZhYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL2RvV2llbGRNZXNzYWdlCkBAIC0wLDAgKzEsMjQgQEAKK2RvV2llbGRNZXNzYWdlKCkKKworRlVOS1RJT046CisJdm9pZCBkb1dpZWxkTWVzc2FnZSgpOworCitERUZJTklFUlQgSU46CisJL3N0ZC93ZWFwb24vY29tYmF0LmMKKworQVJHVU1FTlRFOgorCWtlaW5lCisKK0JFU0NIUkVJQlVORzoKKyAgICAgICAgRGllc2UgRnVua3Rpb24gZ2lidCBiZWltIFp1ZWNrZW4gZWluZXIgV2FmZmUgZGllIGVudHNwci4KKyAgICAgICAgTWVsZHVuZyBhbiBkZW4gQmVudXR6ZXIgdW5kIGRpZSBVbWdlYnVuZyBhdXMuCisKK1JVZUNLR0FCRVdFUlQ6CisJa2VpbmVyCisKK1NJRUhFIEFVQ0g6CisgICAgICAgIGRvV2Vhck1lc3NhZ2UoKSwgZG9VbndlYXJNZXNzYWdlKCksIGRvVW53aWVsZE1lc3NhZ2UoKQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBTYXQgSnVuIDI2IDE1OjMzOjAwIDE5OTkgYnkgUGFyYWNlbHN1cworCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9kb19kYW1hZ2UgYi9kb2MvbGZ1bi9kb19kYW1hZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ1ODgzOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL2RvX2RhbWFnZQpAQCAtMCwwICsxLDQ0IEBACitkb19kYW1hZ2UoTCkKK0ZVTktUSU9OOgorICAgICBpbnQgZG9fZGFtYWdlKGludCBkYW0sbWl4ZWQgZW5lbXkpOworCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvbGl2aW5nL2xpZmUuYworCitBUkdVTUVOVEU6CisgICAgIGludCBkYW0KKwkgIERpZSBhYnp1emllaGVuZGVuIExlYmVuc3B1bmt0ZSAoSFApLgorICAgICBvYmplY3QgZW5lbXkKKwkgIERhcyBPYmpla3QsIHdlbGNoZXMgZGVuIFNjaGFkZW4genVmdWVndC4KKworQkVTQ0hSRUlCVU5HOgorICAgICBEZW0gTGViZXdlc2VuIHdlcmRlbiA8ZGFtPiBIUCBhYmdlem9nZW4uIEZhbGxzIHdlbmlnZXIgYWxzIDAgSFAgdWVicmlnCisgICAgIGJsZWliZW4sIHNvIHN0aXJidCBlcyBhdXRvbWF0aXNjaCBtaXR0ZWxzIGRpZSgpLgorICAgICBFaW4gTGViZXdlc2VuLCB3ZWxjaGVzIHNpY2ggYmV3ZWd0IGhhdCwgdHJpZmZ0IGRpZSBlcnN0ZW4gS2FtcGZydW5kZW4KKyAgICAgc2VociB2aWVsIHNjaGxlY2h0ZXIsIHVtIFJlaW4tUmF1cy1BdHRhY2tlbiB6dSB2ZXJoaW5kZXJuLiBEaWVzZXMKKyAgICAgVm9yZ2VoZW4ga2FubiBtYW4gbWl0dGVscyBQX0VOQUJMRV9JTl9BVFRBQ0tfT1VUIGRlYWt0aXZpZXJlbi4KKyAgICAgTGViZXdlc2VuLCB3ZWxjaGUgUF9OT19BVFRBQ0sgZ2VzZXR6dCBoYWJlbiwga2FubiBtYW4gbWl0IGRpZXNlcgorICAgICBGdW5rdGlvbiBuaWNodCBzY2hhZGVuLgorCitSVWVDS0dBQkVXRVJUOgorICAgICBEZXIgdGF0c2FlY2hsaWNoIHZlcnVyc2FjaHRlIFNjaGFkZW4uCisKK0JFTUVSS1VOR0VOOgorICAgICBCZWltIEdlZ25lciA8ZW5lbXk+LCBmYWxscyB2b3JoYW5kZW4sIHdlcmRlbiBYUCB1bmQgQUxJR04gZW50c3ByZWNoZW5kCisgICAgIGFuZ2VwYXNzdCwgaW0gT3BmZXIgd2lyZCBkZXIgR2VnbmVyIGluIFBfS0lMTEVSIHZlcm1lcmt0LCBkZXIgS2FtcGYgd2lyZAorICAgICBiZWVuZGV0LgorICAgICBEaWVzZSBGdW5rdGlvbiBzb2xsdGUgbnVyIHNlbHRlbiBkaXJla3QgdmVyd2VuZGV0IHdlcmRlbi4gTWVpc3QgaXN0IGRlcgorICAgICB1ZWJsaWNoZSBXZWcgdWViZXIgRGVmZW5kKCkgLT4gZG9fZGFtYWdlKCkgLT4gZGllKCkgZGllIGxvZ2lzY2ggYmVzc2VyZQorICAgICB1bmQgYmFsYW5jZXRlY2huaXNjaCBndWVuc3RpZ2VyZSBMb2VzdW5nLCBkYSBEZWZlbmQoKSBtYWdpc2NoZQorICAgICBWZXJ0ZWlkaWd1bmdlbiwgZGllIGRlciBTcGllbGVyIGJlaSBzaWNoIGhhdCBiZXJ1ZWNrc2ljaHRpZ3QuCisgICAgIEVzIHNvbGx0ZSBhbHNvIGFsbGVpbiBzY2hvbiBhdXMgRmFpcm5lc3MgZ2VnZW51ZWJlciBkZW4gT2JqZWt0ZW4KKyAgICAgYW5kZXJlciBNYWdpZXIgRGVmZW5kKCkgaW1tZXIgZGVtIGRpcmVrdGVuIHJlZHVjZV9oaXRfcG9pbnRzKCkgb2RlcgorICAgICBkb19kYW1hZ2UoKSB2b3JnZXpvZ2VuIHdlcmRlbi4gTWl0dGVscyBkZXIgRmxhZ3MgaW4gJ3NwZWxsJyBrYW5uIG1hbgorICAgICBzZWhyIHZpZWxlIFBhcmFtZXRlciBiZWVpbmZsdXNzZW4uCisKK1NJRUhFIEFVQ0g6CisgICAgIFZlcndhbmR0OglEZWZlbmQoTCksIHJlZHVjZV9oaXRfcG9pbnRzKEwpLCBkaWUoTCkKKyAgICAgUHJvcHM6CVBfTk9fQVRUQUNLLCBQX0VOQUJMRV9JTl9BVFRBQ0tfT1VULCBQX0tJTExFUgorCQlQX1hQLCBQX0FMSUdOCisKKzIzLkZlYi4yMDA0IEdsb2luc29uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vZG9fZnJhZ2UgYi9kb2MvbGZ1bi9kb19mcmFnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzA4NjEwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vZG9fZnJhZ2UKQEAgLTAsMCArMSwyMSBAQAorZG9fZnJhZ2UoKQorRlVOS1RJT046CisgICAgIGludCBkb19mcmFnZShzdHJpbmcgdGV4dCkKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL25wYy9pbmZvLmMKKworQVJHVU1FTlRFOgorICAgICBzdHJpbmcgc3RyCSAtIFNjaGx1ZXNzZWx3b3J0IGRlciBGcmFnZQorCitCRVNDSFJFSUJVTkc6CisgICAgIEJlYXJiZWl0ZXQgZWluIFNjaGx1ZXNzZWx3b3J0LCBkYXMgbWl0ICJmcmFnZSA8d2VuPiBuYWNoICIgdWViZXJnZWJlbgorICAgICB3dXJkZS4gR2lidCBlbnRzcHJlY2hlbmRlIEFudHdvcnRlbiBmb3JtYXRpZXJ0IGF1cy4KKworQkVNRVJLVU5HRU46CisgICAgIFJlY2h0IGtvbXBsZXgsIGJlc3NlciBuaWNodCB1ZWJlcnNjaHJlaWJlbiB3ZW5uIG1hbiBlcyBuaWNodCB2ZXJzdGVodC4KKworU0lFSEUgQVVDSDoKKyAgICAgVmVyd2FuZHQ6ICBHZXRJbmZvQXJyLCBBZGRJbmZvCisKKzMxLk1hciAyMDA3IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9kb191bndlYXIgYi9kb2MvbGZ1bi9kb191bndlYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VjZmEzNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL2RvX3Vud2VhcgpAQCAtMCwwICsxLDM0IEBACitkb191bndlYXIoKQorCitGVU5LVElPTjoKKyAgICAgdmFyYXJncyBpbnQgZG9fdW53ZWFyKHN0cmluZyBzdHIsIGludCBzaWxlbnQpOworCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvYXJtb3VyL2NvbWJhdC5jCisKK0FSR1VNRU5URToKKyAgICAgc3RyCisgICAgICAgICAgU3RyaW5nIGRlciBub3JtYWxlcndlaXNlIGRlbSBQYXJhbWV0ZXIgZGVzICJ6aWVoZSItS29tbWFuZG9zCisgICAgICAgICAgZW50c3ByaWNodC4KKworICAgICBzaWxlbnQKKyAgICAgICAgICAxLCB3ZW5uIGRhcyBBdXN6aWVoZW4gb2huZSBNZWxkdW5nZW4gZHVyY2hnZWZ1ZWhydCB3ZXJkZW4gc29sbC4KKworQkVTQ0hSRUlCVU5HOgorICAgICBEaWVzZSBGdW5rdGlvbiBzdGVsbHQgZmVzdCwgb2IgZGllIFJ1ZXN0dW5nIHNpY2ggZHVyY2ggc3RyCisgICAgIGlkZW50aWZpemllcmVuIGxhZXNzdCB1bmQgYW5nZXpvZ2VuIGlzdCB1bmQgcnVmdCBpbSBFcmZvbGdzZmFsbAorICAgICBVbldlYXIoc2lsZW50KSBhdWYuCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIDEsIHdlbm4gYWxsZXMgZ3V0IGdpbmcsIGFuc29uc3RlbiAwLgorCitCRU1FUktVTkdFTjoKKyAgICAgV2VubiBtYW4gUnVlc3R1bmdlbiAidm9uIGF1c3NlbiIgYXVzemllaGVuIHdpbGwsIHNvbGx0ZSBtYW4gZGlyZWt0CisgICAgIFVuV2VhcigpIHZlcndlbmRlbiEKKworU0lFSEUgQVVDSDoKKyAgICAgZG9fd2VhcigpLCBVbldlYXIoKSwgUmVtb3ZlRnVuYygpLCBJbmZvcm1VbndlYXIoKSwKKyAgICAgL3N0ZC9hcm1vdXIvY29tYmF0LmMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogU3VuIEp1biAyNyAyMjoyOTowMCAxOTk5IGJ5IFBhcmFjZWxzdXMKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL2RvX3dlYXIgYi9kb2MvbGZ1bi9kb193ZWFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMjI3ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9kb193ZWFyCkBAIC0wLDAgKzEsMjcgQEAKK2RvX3dlYXIoKQorCitGVU5LVElPTjoKKyAgICAgdmFyYXJncyBpbnQgZG9fd2VhcihzdHJpbmcgc3RyLCBpbnQgc2lsZW50KTsKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL2FybW91ci9jb21iYXQuYworCitBUkdVTUVOVEU6CisgICAgIHN0cgorICAgICAgICAgIFN0cmluZywgZGVyIG5vcm1hbGVyd2Vpc2UgZGVtIFBhcmFtZXRlciBkZXMKKyAgICAgICAgICAiemllaGUvdHJhZ2UiLUtvbW1hbmRvcyBlbnRzcHJpY2h0LgorICAgICBzaWxlbnQKKyAgICAgICAgICAxLCB3ZW5uIGRhcyBBbnppZWhlbiBvaG5lIE1lbGR1bmdlbiBkdXJjaGdlZnVlaHJ0IHdlcmRlbiBzb2xsLgorCitCRVNDSFJFSUJVTkc6CisgICAgIFdlbm4gc2ljaCBkaWUgUnVlc3R1bmcgbWl0ICJzdHIiIGlkZW50aWZpemllcmVuIGxhZXNzdCwgd2lyZCB2ZXJzdWNodCwKKyAgICAgc2llIG1pdHRlbHMgRG9XZWFyKCkgYW56dXppZWhlbi4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgMSwgd2VubiBzaWNoIGRpZSBSdWVzdHVuZyBhbnppZWhlbiBsaWVzcywgc29uc3QgMC4KKworU0lFSEUgQVVDSDoKKyAgICAgZG9fdW53ZWFyKCksIERvV2VhcigpLCBXZWFyRnVuYygpLCBJbmZvcm1XZWFyKCksIC9zdGQvYXJtb3VyL2NvbWJhdC5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFN1biBKdW4gMjcgMjI6MzE6MDAgMTk5OSBieSBQYXJhY2Vsc3VzCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9kcmlua19hbGNvaG9sIGIvZG9jL2xmdW4vZHJpbmtfYWxjb2hvbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGVkMWRkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vZHJpbmtfYWxjb2hvbApAQCAtMCwwICsxLDgzIEBACitGVU5LVElPTjoKKyAgICBwdWJsaWMgdmFyYXJncyBpbnQgZHJpbmtfYWxjb2hvbChpbnQgc3RyZW5ndGgsIGludCB0ZXN0b25seSwgc3RyaW5nIG15dGV4dCkKKworREVGSU5JRVJUIElOOgorICAgIC9zdGQvbGl2aW5nL2xpZmUuYworCitBUkdVTUVOVEU6CisgICAgc3RyZW5ndGg6IHdpcmQgenVyIGFrdHVlbGxlbiBTYWV0dGlndW5nIFBfQUxDT0hPTCBkYXp1IGFkZGllcnQKKyAgICB0ZXN0b25seTogSXN0IGRhcyBGbGFnIGdlc2V0enQsIHdpcmQgZGVtIFNwaWVsZXIga2VpbiBBTENPSE9MIHp1Z2VmdWVocnQuCisgICAgICAgICAgICAgIERhcmYgbnVyIHp1bSBUZXN0ZW4gZGVyIEhlaWxzdGVsbGUgdmVyd2VuZGV0IHdlcmRlbiB1bmQgbXVzcworICAgICAgICAgICAgICBpbSBub3JtYWxlbiBCZXRyaWViIGF1ZiAnMCcgc3RlaGVuIQorICAgIG15dGV4dDogV2VyIHNlbGJlciBlaW5lbiBUZXh0IGJlaSBNaXNzZXJmb2xnIGF1c2dlYmVuIGxhc3NlbiBtb2VjaHRlLAorICAgICAgICAgICAgZGFyZiBzaWNoIGhpZXIgd2FzIG5ldHRlcyBhdXNkZW5rZW4uCisgICAgICAgICAgICBBY2h0dW5nOiBEYXMgdW50ZXJkcnVlY2t0IG5pY2h0IGRpZSAiTnVlY2h0ZXJuIi1NZWxkdW5nLCBkaWUgYmVpCisgICAgICAgICAgICBuZWdhdGl2ZW0gc3RyZW5ndGggYXVmdHJldGVuIGthbm4sIHdlbm4gUF9BTENPSE9MIHdpZWRlciAwIGlzdC4KKworQkVTQ0hSRUlCVU5HOgorICAgIEVzIHdpcmQgZ2VwcnVlZnQsIG9iIGRlbSBTcGllbGVyIGRlciBhbmdlZ2ViZW5lIFdlcnQgZnVlciAnc3RyZW5ndGgnCisgICAgYXVmIHNlaW5lIGFrdHVlbGxlIFBfQUxDT0hPTCBhZGRpZXJ0IHdlcmRlbiBrYW5uIG9kZXIgbmljaHQuIEZhbGxzCisgICAgZGFzIG1vZWdsaWNoIGlzdCB1bmQgdGVzdG9ubHkgPSAwLCB3aXJkIFBfQUxDT0hPTCBlbnRzcHJlY2hlbmQKKyAgICBha3R1YWxpc2llcnQuCisKKyAgICBTb2xsZW4gbmViZW4gUF9BTENPSE9MIG5vY2ggd2VpdGVyZSBQcm9wcyBtYW5pcHVsaWVydCB3ZXJkZW4gLSBic3B3LiB6dXIKKyAgICBIZWlsdW5nIGVpbmVzIExlYmV3ZXNlbnMgLSBiaWV0ZXQgc2ljaCBkaWUgRnVua3Rpb24gY29uc3VtZSgpIGFuLgorCitSVUVDS0dBQkVXRVJUOgorICAgIDAgYmVpIFtwb3RlbnRpZWxsZW1dIE1pc3NlcmZvbGcgKHN0cmVuZ3RoICsgUF9BTENPSE9MID4gUF9NQVhfQUxDT0hPTCkKKyAgICAxIGJlaSBbcG90ZW50aWVsbGVtXSBFcmZvbGcKKyAgICAqIHBvdGVudGllbGwgYmV6aWVodCBzaWNoIGhpZXIgYXVmIE51dHp1bmcgbWl0ICd0ZXN0b25seScgIT0gMAorCitCRU1FUktVTkc6CisgICAgZHJpbmtfYWxvY29ob2woKSBiaXR0ZSBhbnN0YXR0IGVpZ2VuZXIgTWFuaXB1bGF0aW9uZW4gdm9uIFBfQUxDT0hPTCB1bmQKKyAgICBQX01BWF9BTENPSE9MIHZlcndlbmRlbi4KKworICAgIEFjaHR1bmc6IEltbWVyIGVyc3QgVk9SIGVpbmVyIEhlaWx1bmcgYXVzZnVlaHJlbiB1bmQgYmVpIEVyZm9sZyBoZWlsZW4uCisKKyAgICBCZWkgSGVpbHN0ZWxsZW4gc29sbHRlIGVpbmUgZXZ0bC4gSGVpbHVuZyBkZXMgU3BpZWxlcnMgbWl0IGRlciBlaWdlbnMKKyAgICBkYWZ1ZXIgZWluZ2VyaWNodGV0ZW4gRnVua3Rpb24gY2hlY2tfYW5kX3VwZGF0ZV90aW1lZF9rZXkgcmVhbGlzaWVydAorICAgIHdlcmRlbi4KKworQkVJU1BJRUw6CisgICAgaW50IGhlaWxzdGVsbGUoKSB7CisgICAgICBpZih0aGlzX3BsYXllcigpLT5kcmlua19hbGNvaG9sKDEwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRHUgcHJ1c3Rlc3QgaW4gZGVuIFNjaG5hcHMuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlciBwYXNzdCBuaWNodCBtZWhyIHJlaW4uXG4iKSkgeworICAgICAgICAvLyBQbGF0eiBmdWVyIDEwICJBbGtvaG9sIiB3YXIgbm9jaCwgZGllc2Ugc2luZCBqZXR6dCBiZXJlaXRzIGFkZGllcnQKKyAgICAgICAgLy8gTmFjaHJpY2h0IGFuIGRlbiBTcGllbGVyOgorICAgICAgICB0ZWxsX29iamVjdCh0aGlzX3BsYXllcigpLAorICAgICAgICAgICAgICAgICAgICBicmVha19zdHJpbmcoIkR1IHRyaW5rc3QgZGVuIFNjaG5hcHMgYXVzLiIsIDc4KSk7CisKKyAgICAgICAgLy8gTmFjaHJpY2h0IGFuIGFuZGVyZSBMaXZpbmdzIGltIFJhdW0KKyAgICAgICAgb2JqZWN0IG9iID0gZmlyc3RfaW52ZW50b3J5KGVudmlyb25tZW50KHRoaXNfcGxheWVyKCkpKTsKKyAgICAgICAgZG8geworICAgICAgICAgIGlmKGxpdmluZyhvYikgJiYgb2IhPXRoaXNfcGxheWVyKCkpCisgICAgICAgICAgICBvYi0+UmVjZWl2ZU1zZyh0aGlzX3BsYXllcigpLT5OYW1lKCkrIiB0cmlua3QgZWluZW4gU2NobmFwcyBhdXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UX0xPT0t8TVRfTElTVEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFfRFJJTkspOworICAgICAgICAgIG9iID0gbmV4dF9pbnZlbnRvcnkob2IpOworICAgICAgICB9IHdoaWxlKG9iKTsKKworICAgICAgICAvLyBSYXNzZW5hYmhhZW5naWdlIEhlaWx1bmc6IFNvZm9ydCBvZGVyIGluIFNjaHJpdHRlbgorICAgICAgICAvLyBUcmFnYmFyZSBIZWlsdW5nZW4gc29sbHRlbiBhdWNoIGVoZXIgYnVmZmVyX2hwL19zcCBiZW51dHplbi4KKyAgICAgICAgaWYodGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKFBfUkVBTF9SQUNFKT09IlNjaG5hcHNkcm9zc2VsIikKKyAgICAgICAgICB0aGlzX3BsYXllcigpLT5oZWFsX3NlbGYoMzApOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICB0aGlzX3BsYXllcigpLT5idWZmZXJfaHAoMzAsNSk7CisgICAgICAgICAgdGhpc19wbGF5ZXIoKS0+YnVmZmVyX3NwKDMwLDUpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiAxOworICAgICB9CitTSUVIRSBBVUNIOgorICAgICBBZWhubGljaDogIGNvbnN1bWUsIGVhdF9mb29kLCBkcmlua19zb2Z0CisgICAgIEhlaWx1bmc6ICAgaGVhbF9zZWxmLCByZXN0b3JlX3NwZWxsX3BvaW50cywgcmVzdG9yZV9oaXRfcG9pbnRzLCAKKyAgICAgICAgICAgICAgICBidWZmZXJfaHAsIGJ1ZmZlcl9zcAorICAgICBUaW1pbmc6ICAgIGNoZWNrX2FuZF91cGRhdGVfdGltZWRfa2V5CisgICAgIEVudHRhbmtlbjogZGVmdWVsX2RyaW5rLCBkZWZ1ZWxfZm9vZAorICAgICBQcm9wczogICAgIFBfRFJJTkssIFBfRk9PRCwgUF9BTENPSE9MLCBQX1NQLCBQX0hQLAorICAgICAgICAgICAgICAgIFBfREVGVUVMX1RJTUVfRFJJTksKKyAgICAgS29uemVwdGU6ICBoZWlsdW5nLCBlbnR0YW5rZW4sIGZvb2QKKworOS4gQXVndXN0IDIwMTUgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL2RyaW5rX3NvZnQgYi9kb2MvbGZ1bi9kcmlua19zb2Z0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYjZlMDcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9kcmlua19zb2Z0CkBAIC0wLDAgKzEsODMgQEAKK0ZVTktUSU9OOgorICAgIHB1YmxpYyB2YXJhcmdzIGludCBkcmlua19zb2Z0KGludCBzdHJlbmd0aCwgaW50IHRlc3Rvbmx5LCBzdHJpbmcgbXl0ZXh0KQorCitERUZJTklFUlQgSU46CisgICAgL3N0ZC9saXZpbmcvbGlmZS5jCisKK0FSR1VNRU5URToKKyAgICBzdHJlbmd0aDogV2lyZCB6dSBkZW0gYXVnZW5ibGlja2xpY2hlbiBTYWV0dGlndW5nc2dyYWQgKFBfRFJJTkspIGFkZGllcnQuCisgICAgdGVzdG9ubHk6IElzdCBkYXMgRmxhZyBnZXNldHp0LCB3aXJkIGRlbSBTcGllbGVyIGtlaW4gRFJJTksgenVnZWZ1ZWhydC4KKyAgICAgICAgICAgICAgRGFyZiBudXIgenVtIFRlc3RlbiBkZXIgSGVpbHN0ZWxsZSB2ZXJ3ZW5kZXQgd2VyZGVuIHVuZCBtdXNzCisgICAgICAgICAgICAgIGltIG5vcm1hbGVuIEJldHJpZWIgYXVmICcwJyBzdGVoZW4hCisgICAgbXl0ZXh0OiBXZXIgc2VsYmVyIGVpbmVuIFRleHQgYmVpIE1pc3NlcmZvbGcgYXVzZ2ViZW4gbGFzc2VuIG1vZWNodGUsCisgICAgICAgICAgICBkYXJmIHNpY2ggaGllciB3YXMgbmV0dGVzIGF1c2Rlbmtlbi4KKyAgICAgICAgICAgIEFjaHR1bmc6IERhcyB1bnRlcmRydWVja3QgbmljaHQgZGllICJEdXJzdCItTWVsZHVuZywgZGllIGJlaQorICAgICAgICAgICAgbmVnYXRpdmVtIHN0cmVuZ3RoIGF1ZnRyaXR0LCB3ZW5uIFBfRFJJTksgd2llZGVyIDAgaXN0LgorCitCRVNDSFJFSUJVTkc6CisgICAgRXMgd2lyZCBnZXBydWVmdCwgb2IgZGVtIFNwaWVsZXIgZGVyIGFuZ2ViZW5lIFdlcnQgInN0cmVuZ3RoIiBhdWYKKyAgICBha3R1ZWxsZSBQX0RSSU5LIGFkZGllcnQgd2VyZGVuIGthbm4gb2RlciBuaWNodC4gSXN0IGRpZXMgbW9lZ2xpY2gsCisgICAgd2lyZCBlcyBnZW1hY2h0LCBlcyBzZWkgZGVubiBkYXMgdGVzdG9ubHkgIT0gMC4KKworICAgIFNvbGxlbiBuZWJlbiBQX0RSSU5LIG5vY2ggd2VpdGVyZSBQcm9wcyBtYW5pcHVsaWVydCB3ZXJkZW4gLSBic3B3LiB6dXIKKyAgICBIZWlsdW5nIGVpbmVzIExlYmV3ZXNlbnMgLSBiaWV0ZXQgc2ljaCBkaWUgRnVua3Rpb24gY29uc3VtZSgpIGFuLgorCitSVUVDS0dBQkVXRVJUOgorICAgICAwLCB3ZW5uIHN0cmVuZ3RoICsgUF9EUklOSyA+IFBfTUFYX0RSSU5LCisgICAgPjAsIHdlbm4gRXJmb2xnCisKK0JFTUVSS1VORzoKKyAgICBkcmlua19zb2Z0KCkgYml0dGUgYW5zdGF0dCBlaWdlbmVyIE1hbmlwdWxhdGlvbmVuIHZvbiBQX0RSSU5LIHVuZAorICAgIFBfTUFYX0RSSU5LIHZlcndlbmRlbi4KKworICAgIEFjaHR1bmc6IEltbWVyIGVyc3QgVk9SIGVpbmVyIEhlaWx1bmcgYXVzZnVlaHJlbiB1bmQgYmVpIEVyZm9sZyBoZWlsZW4uCisKKyAgICBCZWkgSGVpbHN0ZWxsZW4gc29sbHRlIGVpbmUgZXZ0bC4gSGVpbHVuZyBkZXMgU3BpZWxlcnMgbWl0IGRlciBlaWdlbnMKKyAgICBkYWZ1ZXIgZWluZ2VyaWNodGV0ZW4gRnVua3Rpb24gY2hlY2tfYW5kX3VwZGF0ZV90aW1lZF9rZXkgcmVhbGlzaWVydAorICAgIHdlcmRlbi4KKworQkVJU1BJRUw6CisgICAgaW50IGhlaWxzdGVsbGUoKSB7CisgICAgICBpZih0aGlzX3BsYXllcigpLT5kcmlua19zb2Z0KDEwLCAwLCAiRHUgYmx1YmJlcnN0IG5pY2h0IHVlYmVyemV1Z3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gZGVyIExpbW9uYWRlLiBEYXMgaXN0IHp1IHZpZWwuXG4iKSkgeworICAgICAgICAvLyBQbGF0eiBmdWVyIDEwICJUcmlua2VuIiB3YXIgbm9jaCwgZGllc2Ugc2luZCBqZXR6dCBiZXJlaXRzIGFkZGllcnQKKyAgICAgICAgLy8gTmFjaHJpY2h0IGFuIGRlbiBTcGllbGVyOgorICAgICAgICB0ZWxsX29iamVjdCh0aGlzX3BsYXllcigpLCBicmVha19zdHJpbmcoIkR1IG5pbW1zdCBlaW5lbiBncm9zc2VuICIKKyAgICAgICAgICAgICAgICAgICAgIlNjaGx1Y2sgenVja2Vyc3Vlc3NlIExpbW9uYWRlLiIsIDc4KSk7CisKKyAgICAgICAgLy8gYWxsZSBhbmRlcmVuIGltIFJhdW0gYmVrb21tZW4gZXMgZ2dmIGF1Y2ggbWl0OgorICAgICAgICAvLyAxKSBmaWx0ZXIoLi4uLCAjJ2xpdmluZykgZXJnaWJ0IGRpZSBMZWJld2VzZW4gaW0gUmF1bQorICAgICAgICAvLyAyKSBmaWx0ZXJfb2JqZWN0cyguLi4sICJSZWNlaXZlTXNnIikgcnVmdCBSZWNlaXZlTXNnIGFuIGplZGVtCisgICAgICAgIC8vIDMpIFJlY2VpdmVNc2coLi4uKSBiZWtvbW10IGRpZSBGb2xnZXBhcmFtZXRlcgorICAgICAgICBmaWx0ZXJfb2JqZWN0cyhmaWx0ZXIoYWxsX2ludmVudG9yeShlbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjJ2xpdmluZykgLSAoe3RoaXNfcGxheWVyKCl9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIlJlY2VpdmVNc2ciLAorICAgICAgICAgICAgICAgICAgICAgICB0aGlzX3BsYXllcigpLT5OYW1lKCkrCisgICAgICAgICAgICAgICAgICAgICAgICAgIiB0cmlua3QgZWluZW4gU2NobHVjayBMaW1vbmFkZS4iLAorICAgICAgICAgICAgICAgICAgICAgICBNVF9MT09LfE1UX0xJU1RFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgTUFfRFJJTkspOworCisgICAgICAgIC8vIFJhc3NlbmFiaGFlbmdpZ2UgSGVpbHVuZzogU29mb3J0IG9kZXIgaW4gU2Nocml0dGVuCisgICAgICAgIC8vIFRyYWdiYXJlIEhlaWx1bmdlbiBzb2xsdGVuIGF1Y2ggZWhlciBidWZmZXJfaHAvX3NwIGJlbnV0emVuLgorICAgICAgICBpZih0aGlzX3BsYXllcigpLT5RdWVyeVByb3AoUF9SRUFMX1JBQ0UpPT0iU2F1ZnppZWdlIikKKyAgICAgICAgICB0aGlzX3BsYXllcigpLT5oZWFsX3NlbGYoMzApOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICB0aGlzX3BsYXllcigpLT5idWZmZXJfaHAoMzAsNSk7CisgICAgICAgICAgdGhpc19wbGF5ZXIoKS0+YnVmZmVyX3NwKDMwLDUpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiAxOworICAgICB9CisKK1NJRUhFIEFVQ0g6CisgICAgIEFlaG5saWNoOiAgY29uc3VtZSwgZHJpbmtfYWxjb2hvbCwgZWF0X2Zvb2QKKyAgICAgSGVpbHVuZzogICBoZWFsX3NlbGYsIHJlc3RvcmVfc3BlbGxfcG9pbnRzLCByZXN0b3JlX2hpdF9wb2ludHMsIAorICAgICAgICAgICAgICAgIGJ1ZmZlcl9ocCwgYnVmZmVyX3NwCisgICAgIFRpbWluZzogICAgY2hlY2tfYW5kX3VwZGF0ZV90aW1lZF9rZXkKKyAgICAgRW50dGFua2VuOiBkZWZ1ZWxfZHJpbmssIGRlZnVlbF9mb29kCisgICAgIFByb3BzOiAgICAgUF9EUklOSywgUF9GT09ELCBQX0FMQ09IT0wsIFBfU1AsIFBfSFAsCisgICAgICAgICAgICAgICAgUF9ERUZVRUxfVElNRV9EUklOSworICAgICBLb256ZXB0ZTogIGhlaWx1bmcsIGVudHRhbmtlbiwgZm9vZAorCis5LiBBdWd1c3QgMjAxNSBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vZHJvcCBiL2RvYy9sZnVuL2Ryb3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI4ZGQxOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL2Ryb3AKQEAgLTAsMCArMSw0NSBAQAorZHJvcCgpCisKK0ZVTktUSU9OOgorICAgIHB1YmxpYyB2YXJhcmdzIGludCBkcm9wKG9iamVjdCBvLCBtaXhlZCBtc2cpOworCitERUZJTklFUlQgSU46CisgICAgL3N0ZC9saXZpbmcvcHV0X2FuZF9nZXQuYworCitBUkdVTUVOVEU6CisgICAgb2JqZWN0IG8KKyAgICAgICAgRGFzIE9iamVrdCwgZGFzIGZhbGxlbmdlbGFzc2VuIHdlcmRlbiBzb2xsLgorICAgIG1peGVkIG1zZworICAgICAgICBFaW5lIG9wdGlvbmFsZSBNZWxkdW5nLCBkaWUgYW5zdGVsbGUgdm9uIFBfRFJPUF9NU0cgb2RlciBkZXIKKyAgICAgICAgU3RhbmRhcmRtZWxkdW5nIHZlcndlbmRldCB3aXJkLCBvZGVyIC0xLCB1bSBkaWUgTWVsZHVuZyB6dQorICAgICAgICB1bnRlcmRydWVja2VuLgorCitCRVNDSFJFSUJVTkc6CisgICAgRGVyIFNwaWVsZXIgb2RlciBOUEMgbGFlc3N0IGRhcyBPYmpla3QgZmFsbGVuLiBHaWJ0IG8tPm1vdmUoKSBrZWluZW4KKyAgICBwb3NpdGl2ZW4gV2VydCB6dXJ1ZWNrLCBiZWlzcGllbHN3ZWlzZSB3ZWlsIGRhcyBPYmpla3QgdmVyZmx1Y2h0IGlzdCwKKyAgICBiZWtvbW10IGVyIGVpbmUgZW50c3ByZWNoZW5kZSBGZWhsZXJtZWxkdW5nLgorCitSVUVDS0dBQkVXRVJUOgorICAgIFdlbm4gZGFzIEZhbGxlbmxhc3NlbiBnZWtsYXBwdCBoYXQsIDEsIGFuc29uc3RlbiAwLgorCitCRU1FUktVTkc6CisgICAgRGllc2UgRnVua3Rpb24gaXN0IGRhbm4gc2lubnZvbGwsIHdlbm4gbWFuIGRlbiBTcGllbGVyIGVpbiBPYmpla3QKKyAgICBmYWxsZW5sYXNzZW4gbGFzc2VuIHVuZCBzaWNoIG5pY2h0IHNlbGJzdCB1bSBkaWUgRmVobGVyYmVoYW5kbHVuZyBrdWVtbWVybgorICAgIG1vZWNodGUgLSB1bmQgZGEgdW56YWVobGlnZSB2ZXJzY2hpZWRlbmUgRGluZ2Ugc2NoaWVmZ2VoZW4ga29lbm5lbiB1bmQKKyAgICBtYW5jaGUgT2JqZWt0ZSBlaWdlbmUgRmVobGVybWVsZHVuZ2VuIGRlZmluaWVyZW4sIGVpZ2VudGxpY2ggaW1tZXIuCisKKyAgICBEaWUgRnVua3Rpb24gcHJ1ZWZ0IG5pY2h0LCBvYiBkZXIgU3BpZWxlci9OUEMgZGFzIE9iamVrdCB1ZWJlcmhhdXB0IGhhdCwKKyAgICBkYXMgbXVzcyBtYW4gZ2dmLiBzZWxic3QgZXJtaXR0ZWxuLgorCitCRUlTUElFTDoKKyAgICBpZiAodGhpc19wbGF5ZXIoKS0+ZHJvcChvYmosICh7CisgICAgICAgICAgICAiRHUgd2lyZnN0IEBXRU4yIGluIGRlbiBTYWV1cmV0ZWljaC5cbiIsCisgICAgICAgICAgICAiQFdFUjEgd2lyZnQgQFdFTlUyIGluIGRlbiBTYWV1cmV0ZWljaC5cbiIgfSkpKQorICAgICAgICBvYmotPnJlbW92ZSgpOworCitTSUVIRSBBVUNIOgorICAgIG1vdmUoTCksIFBfRFJPUF9NU0csIGRyb3Bfb2JqZWN0cyhMKSwgUF9OT0lOU0VSVF9NU0csIFBfTk9MRUFWRV9NU0csCisgICAgUF9UT09fTUFOWV9NU0csIFBfVE9PX0hFQVZZX01TRywgUF9FTlZfVE9PX0hFQVZZX01TRywgUF9OT0RST1AKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogVGh1IEF1ZyAyOCAyMjoyMDozNyAyMDA4IGJ5IEFteW50aG9yCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9kcm9wX29iaiBiL2RvYy9sZnVuL2Ryb3Bfb2JqCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMjVlMGYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9kcm9wX29iagpAQCAtMCwwICsxLDI4IEBACitkcm9wX29iaigpCisKK0ZVTktUSU9OCisgICAgaW50IGRyb3Bfb2JqKG9iamVjdCBvYik7CisKK0RFRklOSUVSVCBJTjoKKworICAgIC9zdGQvbGl2aW5nL3B1dF9hbmRfZ2V0LmMKKworQVJHVU1FTlRFOgorCisgICAgb2IgIERhcyBPYmpla3QsIGRhcyB2b24gZGVtIExlYmV3ZXNlbiwgaW4gZGVtIGRpZXNlIEZ1bmt0aW9uIGF1ZmdlcnVmZW4KKyAgICAgICAgd2lyZCwgZmFsbGVuZ2VsYXNzZW4gd2VyZGVuIHNvbGwuCisKK0JFU0NIUkVJQlVORzoKKworICAgIERhcyBMZWJld2VzZW4sIGluIGRlbSBkaWVzZSBGdW5rdGlvbiBhdWZnZXJ1ZmVuIHdlcmRlbiBzb2xsLCBsYWVzc3QKKyAgICBkZW4gYW5nZWdlYmVuZW4gR2VnZW5zdGFuZCBmYWxsZW4sIHdlbm4gZGllcyBtb2VnbGljaCBpc3QuCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgMSwgd2VubiBkYXMgT2JqZWt0IGZhbGxlbiBnZWxhc3NlbiB3dXJkZSBvZGVyIGRpZXMgbmljaHQgbW9lZ2xpY2ggd2FyLgorICAgIChpbiBkaWVzZW0gRmFsbCB3aXJkIGF1Y2ggZGlyZWt0IGVpbmUgVGV4dGF1c2dhYmUgYXVzZ2VnZWJlbikKKyAgICAwIHNvbnN0LCBpbiBkaWVzZW0gRmFsbCB3aXJkIGluIG5vdGlmeV9mYWlsIGVpbmUgcGFzc2VuZGUgQXVzZ2FiZQorICAgIHBsYXppZXJ0LgorCitTSUVIRSBBVUNIOgorCisgICAgZmluZF9vYnMoKSwgZ2l2ZV9vYmooKSwgcGlja19vYmooKSwgcHV0X29iaigpLCAvc3RkL2xpdmluZy9wdXRfYW5kX2dldC5jCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9kcm9wX29iamVjdHMgYi9kb2MvbGZ1bi9kcm9wX29iamVjdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEwNDVmNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL2Ryb3Bfb2JqZWN0cwpAQCAtMCwwICsxLDQ4IEBACitkcm9wX29iamVjdHMoKQorCitGVU5LVElPTjoKKyAgICBwdWJsaWMgdmFyYXJncyBpbnQgZHJvcF9vYmplY3RzKHN0cmluZyBzdHIsIG1peGVkIG1zZyk7CisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3RkL2xpdmluZy9wdXRfYW5kX2dldC5jCisKK0FSR1VNRU5URToKKyAgICBzdHJpbmcgc3RyCisgICAgICAgIFdhcyBmYWxsZW5nZWxhc3NlbiB3ZXJkZW4gc29sbC4KKyAgICBtaXhlZCBtc2cKKyAgICAgICAgRWluZSBvcHRpb25hbGUgTWVsZHVuZywgZGllIGFuc3RlbGxlIHZvbiBQX0RST1BfTVNHIG9kZXIgZGVyCisgICAgICAgIFN0YW5kYXJkbWVsZHVuZyB2ZXJ3ZW5kZXQgd2lyZCwgb2RlciAtMSwgdW0gZGllIE1lbGR1bmcgenUKKyAgICAgICAgdW50ZXJkcnVlY2tlbi4KKworQkVTQ0hSRUlCVU5HOgorICAgIERlciBTcGllbGVyIG9kZXIgTlBDIGxhZXNzdCBkaWUgaW4gPHN0cj4gYmVuYW5udGVuIFNhY2hlbiBmYWxsZW4uCisgICAgS2FubiBlciBlaW4gT2JqZWt0IG5pY2h0IGZhbGxlbmxhc3NlbiwgYmVrb21tdCBlciBlaW5lIGVudHNwcmVjaGVuZGUKKyAgICBGZWhsZXJtZWxkdW5nLiBXZW5uIGtlaW5lIE9iamVrdGUgYXVmIDxzdHI+IHBhc3Nlbiwgd2lyZCBwZXIKKyAgICBfbm90aWZ5X2ZhaWwoKSBlaW5lIE1lbGR1bmcgZ2VzZXR6dCwgYWJlciBub2NoIG5pY2h0IGF1c2dlZ2ViZW4uCisKK1JVRUNLR0FCRVdFUlQ6CisgICAgV2VubiA8c3RyPiBpcmdlbmR3ZWxjaGUgdm9yaGFuZGVuZW4gU2FjaGVuIHNpbmQsIDEsIHNvbnN0IDAuCisKK0JFTUVSS1VORzoKKyAgICBXZW5uIGRpZSBGdW5rdGlvbiAxIHp1cnVlY2tnaWJ0LCBoZWlzc3QgZGFzIG5vY2ggbmljaHQsIGRhc3MgZGVyIFNwaWVsZXIKKyAgICBldHdhcyBmYWxsZW5nZWxhc3NlbiBoYXQhIEVyIGhhdCBlcyBudXIgdmVyc3VjaHQsIGQuaC4gYXVmIGplZGVuIEZhbGwgZWluZQorICAgIE1lbGR1bmcgYmVrb21tZW4uIEdpYnQgZGllIEZ1bmt0aW9uIDAgenVydWVjaywgaGF0IGVyIG5vY2gga2VpbmUgYmVrb21tZW4uCisKK0JFSVNQSUVMOgorICAgIHByaXZhdGUgaW50IGNtZF9vcGZlcm4oc3RyaW5nIHN0cikKKyAgICB7CisgICAgICAgIG5vdGlmeV9mYWlsKCJXQVMgbW9lY2h0ZXN0IER1IG9wZmVybj9cbiIpOworCisgICAgICAgIGlmICghdGhpc19wbGF5ZXIoKS0+ZHJvcF9vYmplY3RzKHN0ciwgKHsgIkR1IG9wZmVyc3QgQFdFTjIuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQFdFUjEgb3BmZXJ0IEBXRU5VMi5cbiIgfSkpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgZmlsdGVyX29iamVjdHModGhpc19wbGF5ZXIoKS0+bW92ZWRfb2JqZWN0cygpLCAicmVtb3ZlIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworU0lFSEUgQVVDSDoKKyAgICBtb3ZlKEwpLCBkcm9wKEwpLCBQX0RST1BfTVNHLCBmaW5kX29iamVjdHMoTCksIG1vdmVkX29iamVjdHMoTCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogRnJpIEp1bCAyNSAxMDo1OTozNyAyMDA4IGJ5IEFteW50aG9yCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9lYXRfZm9vZCBiL2RvYy9sZnVuL2VhdF9mb29kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMDEwMmQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9lYXRfZm9vZApAQCAtMCwwICsxLDg2IEBACitGVU5LVElPTjoKKyAgICBwdWJsaWMgdmFyYXJncyBpbnQgZWF0X2Zvb2QoaW50IGZvb2QsIGludCB0ZXN0b25seSwgc3RyaW5nIG15dGV4dCkKKworREVGSU5JRVJUIElOOgorICAgIC9zdGQvbGl2aW5nL2xpZmUuYworCitBUkdVTUVOVEU6CisgICAgZm9vZDogV2lyZCB6dSBkZW0gYXVnZW5ibGlja2xpY2hlbiBTYWV0dGlndW5nc2dyYWQgKFBfRk9PRCkgYWRkaWVydC4KKyAgICB0ZXN0b25seTogSXN0IGRhcyBGbGFnIGdlc2V0enQsIHdpcmQgZGVtIFNwaWVsZXIga2VpbiBGT09EIHp1Z2VmdWVocnQuCisgICAgICAgICAgICAgIERhcmYgbnVyIHp1bSBUZXN0ZW4gZGVyIEhlaWxzdGVsbGUgdmVyd2VuZGV0IHdlcmRlbiB1bmQgbXVzcworICAgICAgICAgICAgICBpbSBub3JtYWxlbiBCZXRyaWViIGF1ZiAnMCcgc3RlaGVuIQorICAgIG15dGV4dDogV2VyIHNlbGJlciBlaW5lbiBUZXh0IGJlaSBNaXNzZXJmb2xnIGF1c2dlYmVuIGxhc3NlbiBtb2VjaHRlLAorICAgICAgICAgICAgZGFyZiBzaWNoIGhpZXIgd2FzIG5ldHRlcyBhdXNkZW5rZW4uCisgICAgICAgICAgICBBY2h0dW5nOiBEYXMgdW50ZXJkcnVlY2t0IG5pY2h0IGRpZSAiSHVuZ2VyIi1NZWxkdW5nLCBkaWUgYmVpCisgICAgICAgICAgICBuZWdhdGl2ZW0gZm9vZCBhdWZ0cmV0ZW4ga2Fubiwgd2VubiBQX0ZPT0Qgd2llZGVyIDAgaXN0LgorCitCRVNDSFJFSUJVTkc6CisgICAgRXMgd2lyZCBnZXBydWVmdCwgb2IgZGVtIFNwaWVsZXIgZGVyIGFuZ2ViZW5lIFdlcnQgInN0cmVuZ3RoIiBhdWYgc2VpbmUKKyAgICBha3R1ZWxsZSBQX0ZPT0QgYWRkaWVydCB3ZXJkZW4ga2FubiBvZGVyIG5pY2h0LiBJc3QgZGllcyBtb2VnbGljaCwgd2lyZAorICAgIHdpcmQgZXMgZ2VtYWNodCwgZXMgc2VpIGRlbm4gZGFzIHRlc3Rvbmx5ICE9IDAuCisKKyAgICBTb2xsZW4gbmViZW4gUF9GT09EIG5vY2ggd2VpdGVyZSBQcm9wcyBtYW5pcHVsaWVydCB3ZXJkZW4gLSBic3B3LiB6dXIKKyAgICBIZWlsdW5nIGVpbmVzIExlYmV3ZXNlbnMgLSBiaWV0ZXQgc2ljaCBkaWUgRnVua3Rpb24gY29uc3VtZSgpIGFuLgorCitSVUVDS0dBQkVXRVJUOgorICAgICAwLCB3ZW5uIHN0cmVuZ3RoICsgUF9GT09EID4gUF9NQVhfRk9PRC4KKyAgICA+MCwgd2VubiBFcmZvbGcuCisKK0JFTUVSS1VORzoKKyAgICBlYXRfZm9vZCgpIGJpdHRlIGFuc3RhdHQgZWlnZW5lciBNYW5pcHVsYXRpb25lbiB2b24gUF9GT09EIHVuZAorICAgIFBfTUFYX0ZPT0QgdmVyd2VuZGVuLgorCisgICAgQWNodHVuZzogSW1tZXIgZXJzdCBWT1IgZWluZXIgSGVpbHVuZyBhdXNmdWVocmVuIHVuZCBiZWkgRXJmb2xnIGhlaWxlbi4KKworICAgIEJlaSBIZWlsc3RlbGxlbiBzb2xsdGUgZWluZSBldnRsLiBIZWlsdW5nIGRlcyBTcGllbGVycyBtaXQgZGVyIGVpZ2VucworICAgIGRhZnVlciBlaW5nZXJpY2h0ZXRlbiBGdW5rdGlvbiBjaGVja19hbmRfdXBkYXRlX3RpbWVkX2tleSByZWFsaXNpZXJ0CisgICAgd2VyZGVuLgorCitCRUlTUElFTDoKKyAgICBpbnQgaGVpbHN0ZWxsZSgpIHsKKyAgICAgIC8vIFdlbm4gYXVmIGRhcyBQX0ZPT0QgZGVzIFNwaWVsZXJzIGRpZSBhbmdlZ2ViZW5lbiAxMCBuaWNodCBtZWhyIGFkZGllcnQKKyAgICAgIC8vIGFkZGllcnQgd2VyZGVuIGtvZW5uZW4gKHdlaWwgc29uc3QgUF9NQVhfRk9PRCB1ZWJlcnNjaHJpdHRlbiB3aXJkKSwKKyAgICAgIC8vIHdpcmQgZGllIEZlaGxlcm1lbGR1bmcgYXVzZ2VnZWJlbiwgZGFzcyBkZXIgU3BpZWxlciBuaWNodHMgbWVocgorICAgICAgLy8gZXNzZW4vdHJpbmtlbiBrYW5uLgorICAgICAgLy8gQmVpIGdlc2V0enRlbSAnbXl0ZXh0JyB3aXJkICdteXRleHQnIGFuIGRlbiBTcGllbGVyIGF1c2dlZ2ViZW4uCisgICAgICAvLyBBbnNvbnN0ZW4gd2lyZCBkaWUgU3RhbmRhcmRtZWxkdW5nIGF1c2dlZ2ViZW4uCisgICAgICBpZiAoIXRoaXNfcGxheWVyKCktPmVhdF9mb29kKDEwLCAwLCAiRGVyIEtla3MgaXN0IGVpbmZhY2ggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInp1dmllbCBmdWVyIERpY2guXG4iKSApCisgICAgICAgIHJldHVybiAxOworCisgICAgICAvLyBTcGllbGVyIGhhdHRlIG5vY2ggYXVzcmVpY2hlbmQgU3BpZWxyYXVtIGJlaSBQX0ZPT0QuIERpZSAxMCBzaW5kIAorICAgICAgLy8gc2Nob24gYWRkaWVydCB3b3JkZW4uIEpldHp0IE5hY2hyaWNodCBhdXNnZWJlbjoKKyAgICAgIHRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksIGJyZWFrX3N0cmluZygiRHUga25hYmJlcnN0IGVpbiBiaXNzY2hlbiBhbiAiCisgICAgICAgICAgICAgICAgICAiZGVtIEtla3MgaGVydW0gdW5kIGZ1ZWhsc3QgRGljaCBnbGVpY2ggdmllbCBiZXNzZXIuIiwgNzgpKTsKKworICAgICAgLy8gYWxsZSBMZWJld2VzZW4gaW0gUmF1bSBiZWtvbW1lbiBkYXMgYXVjaCBtaXQKKyAgICAgIGZvcmVhY2gob2JqZWN0IG9iOgorICAgICAgICAgICAgICAoZmlsdGVyKGFsbF9pbnZlbnRvcnkoZW52aXJvbm1lbnQodGhpc19wbGF5ZXIoKSkpLCAjJ2xpdmluZykgLQorICAgICAgICAgICAgICAgKHt0aGlzX3BsYXllcigpfSkpKQorICAgICAgICBvYi0+UmVjZWl2ZU1zZyh0aGlzX3BsYXllcigpLT5OYW1lKCkrIiBrbnVzcGVydCBlaW5lbiBLZWtzIHdlZy4iLAorICAgICAgICAgICAgICAgICAgICAgICBNVF9MT09LfE1UX0xJU1RFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgTUFfRUFUKTsKKworICAgICAgLy8gUmFzc2VuYWJoYWVuZ2lnZSBIZWlsdW5nOiBTb2ZvcnQgb2RlciBpbiBTY2hyaXR0ZW4KKyAgICAgIC8vIFRyYWdiYXJlIEhlaWx1bmdlbiBzb2xsdGVuIGF1Y2ggZWhlciBidWZmZXJfaHAvX3NwIGJlbnV0emVuLgorICAgICAgaWYodGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKFBfUkVBTF9SQUNFKT09IktydWVtZWxtb25zdGVyIikKKyAgICAgICAgdGhpc19wbGF5ZXIoKS0+aGVhbF9zZWxmKDMwKTsKKyAgICAgIGVsc2UgeworICAgICAgICB0aGlzX3BsYXllcigpLT5idWZmZXJfaHAoMzAsNSk7CisgICAgICAgIHRoaXNfcGxheWVyKCktPmJ1ZmZlcl9zcCgzMCw1KTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIDE7CisgICAgfQorCitTSUVIRSBBVUNIOgorICAgICBBZWhubGljaDogIGNvbnN1bWUsIGRyaW5rX2FsY29ob2wsIGRyaW5rX3NvZnQKKyAgICAgSGVpbHVuZzogICBoZWFsX3NlbGYsIHJlc3RvcmVfc3BlbGxfcG9pbnRzLCByZXN0b3JlX2hpdF9wb2ludHMsIAorICAgICAgICAgICAgICAgIGJ1ZmZlcl9ocCwgYnVmZmVyX3NwCisgICAgIFRpbWluZzogICAgY2hlY2tfYW5kX3VwZGF0ZV90aW1lZF9rZXkKKyAgICAgRW50dGFua2VuOiBkZWZ1ZWxfZHJpbmssIGRlZnVlbF9mb29kCisgICAgIFByb3BzOiAgICAgUF9EUklOSywgUF9GT09ELCBQX0FMQ09IT0wsIFBfU1AsIFBfSFAsCisgICAgICAgICAgICAgICAgUF9ERUZVRUxfVElNRV9EUklOSworICAgICBLb256ZXB0ZTogIGhlaWx1bmcsIGVudHRhbmtlbiwgZm9vZAorCis5LiBBdWd1c3QgMjAxNSBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vZXhlY3V0ZV9hbnl0aGluZyBiL2RvYy9sZnVuL2V4ZWN1dGVfYW55dGhpbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM4ODlmMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL2V4ZWN1dGVfYW55dGhpbmcKQEAgLTAsMCArMSw0MiBAQAorZXhlY3V0ZV9hbnl0aGluZygpCitGVU5LVElPTjoKKyAgICBwcm90ZWN0ZWQgbWl4ZWQgZXhlY3V0ZV9hbnl0aGluZyhtaXhlZCBmdW4sIG1peGVkIGFyZ3MsIC4uLikKKworREVGSU5JRVJUIElOOgorICAgIC9zdGQvdXRpbC9leGVjdXRlci5jCisKK0FSR1VNRU5URToKKyAgICBtaXhlZCBmdW4gICAgICAgIGF1c3p1ZnVlaHJlbmRlIEZ1bmt0aW9uL0FycmF5L0Nsb3N1cmUgLi4uIGFueXRoaW5nCisgICAgbWl4ZWQgYXJncyAgICAgICB3ZWl0ZXJlIEFyZ3VtZW50ZSwgd2VyZGVuIHdlaXRlciB1ZWJlcmdlYmVuCisKK0JFU0NIUkVJQlVORzoKKyAgICBGdWVocnQgImFsbGVzIiBhdXM6CisgICAgCisgICAgJ2Z1bicga2FubiBzZWluOgorICAgIC0gZWluZSBDbG9zdXJlCisgICAgICBbZnVuY2FsbChmdW4sIGFyZ3MsIC4uLildCisgICAgLSBlaW5lbiBTdHJpbmcgYWxzIEZ1bmt0aW9uIGltIE9iamVrdAorICAgICAgW2NhbGxfb3RoZXIodGhpc19vYmplY3QoKSwgZnVuLCBhcmdzLCAuLi4pXQorICAgIC0gZWluIEFycmF5IG1pdCBPYmpla3QvT2JqZWt0bmFtZW4gKyBGdW5rdGlvbiBhbHMgQXVmcnVmIGRlciBGdW5rdGlvbiBhbQorICAgICAgT2JqZWt0L09iamVrdG5hbWVuOgorICAgICAgW2NhbGxfb3RoZXIoYXJyYXlbMF0sIGFycmF5WzFdLCBhcmdzLi4uKV0KKworICAgIFdpcmQgZXhlY3V0ZV9hbnl0aGluZygpIGF1cyBkZW0gcmVzdHJpY3Rpb25fY2hlY2tlciBnZXJ1ZmVuLCB3aXJkIGFscworICAgIGVyc3RlciBQYXJhbWV0ZXIgaW1tZXIgZGFzIGdlcHJ1ZWZ0ZSBMaXZpbmcgdWViZXJnZWJlbi4KKworQkVNRVJLVU5HRU46CisgICAgRXMga2FubiBzaWNoIGFuYmlldGVuLCBkaWUgZ2VydWZlbmUgRnVua3Rpb24gbWl0IHZhcmFyZ3MtQXJndW1lbnRlbiB6dQorICAgIGdlc3RhbHRlbiwgZGFtaXQgaWhyIG1laHIgQXJndW1lbnRlIHVlYmVyZ2ViZW4gd2VyZGVuIGtvZW5uZW4gYWxzIGluIGRlcgorICAgIEZ1bmt0aW9uc2RlZmluaXRpb24gYW5nZWdlYmVuIHNpbmQuIAorCisgICAgRGVyIFJlc3RyaWt0aW9uc3BydWVmZXIgKC9zdGQvcmVzdHJpY3Rpb25fY2hlY2tlcikgdmVyc3RlaHQgaW0gRmFsbGUgZWluZXMKKyAgICBBcnJheXMgbWl0IE9iamVrdC9PYmpla3RuYW1lbiArIEZ1bmt0aW9uIGF1Y2ggZWluIEFycmF5IG1pdCBtZWhyIGFscyAyCisgICAgRWxlbWVudGVuLiBEaWUgd2VpdGVyZW4gRWxlbWVudGUgd2VyZGVuIGRhbm4genUgd2VpdGVyZW4gQXJndW1lbnRlbiBkZXIKKyAgICBnZXJ1ZmVuZW4gRnVua3Rpb24uIEhpZXJiZWkgd2lyZCA8cGw+IGdnZi4gYWJlciBhbHMgZXJzdGVzIEFyZ3VtZW50IHZvcgorICAgIGFsbGUgYW5kZXJlbiBlaW5nZWZ1ZWd0LgorCitTSUVIRSBBVUNIOgorICAgIGNoZWNrX3Jlc3RyaWN0aW9ucywgdmFyYXJncworCiszMS4xMi4yMDEzLCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL2V4aXQgYi9kb2MvbGZ1bi9leGl0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MGRiOTEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9leGl0CkBAIC0wLDAgKzEsMzMgQEAKK2V4aXQoKQorCitGVU5LVElPTjoKKyAgdmFyYXJncyB2b2lkIGV4aXQob2JqZWN0IGxpdiwgb2JqZWN0IGRlc3QpOworCitERUZJTklFUlQgSU46CisgIC9zdGQvcm9vbS9kZXNjcmlwdGlvbi5jCisKK0FSR1VNRU5URToKKyAgbGl2IC0gKG9iamVjdCkgRGFzIGJld2VndGUgTGViZXdlc2VuLgorICBkZXN0IC0gKG9iamVjdCkgRGFzIEVudmlyb25tZW50LCBpbiB3ZWxjaGVzIGJld2VndCB3aXJkLgorCitCRVNDSFJFSUJVTkc6CisgIERpZXNlIEZ1bmt0aW9uIHdpcmQgaW1tZXIgZGFubiBhdWZnZXJ1ZmVuLCB3ZW5uIGVpbiBMZWJld2VzZW4gZGVuCisgIFJhdW0gdmVybGFlc3N0LiBTdGFuZGFyZG1hZXNzaWcgd2VyZGVuIGhpZXIgZ2dmLiBkaWUgUmF1bW1lbGR1bmdlbgorICBhYmdlc3RlbGx0LCBtYW4ga2FubiBhYmVyIGF1Y2ggZWlnZW5lIENoZWNrcyBlaW5oYWVuZ2VuLiBJbiBkZW0gRmFsbCBNVVNTCisgIG1hbiBhYmVyIGRhcyBnZWVyYnRlIGV4aXQoKSBhdWYgamVkZW4gRmFsbCBhdWZydWZlbi4KKworUlVlQ0tHQUJFV0VSVDoKKyAga2VpbmVyCisKK0JFTUVSS1VORzoKKyAgTWFuIGJlYWNodGUsIGRhc3MgdGhpc19wbGF5ZXIoKSAwIHNlaW4ga2Fubiwgd2VubiB6LkIuIGVpbiBuZXR6dG90ZXIgU3BpZWxlcgorICBTcGllbGVyIGRlbiBSYXVtIHZlcmxhZXNzdC4KKyAgTWFuIGJlYWNodGUgYXVzc2VyZGVtLCBkYXNzIHRoaXNfcGxheWVyKCkgbmljaHQgdW5iZWRpbmd0IGRhcyBiZXdlZ3RlIExpdmluZworICBzZWluIG11c3MuIFdlbm4gei5CLiBqZW1hbmQgZWluIExlYmV3ZXNlbiBiZXdlZ3QsIGlzdCBUUCBkZXIsIGRlciBkaWUKKyAgQmV3ZWd1bmcgZHVyY2hmdWVocnQsIG5pY2h0IGRhcyBMZWJld2VzZW4uCisKK1NJRUhFIEFVQ0g6CisgIGluaXQoKSwgdGhpc19wbGF5ZXIoKSwgcHJldmlvdXNfb2JqZWN0KCksIGNhbGxlcl9zdGFjaygpLAorICBOb3RmaXlMZWF2ZSgpLCBOb3RpZnlSZW1vdmUoKSwgTm90aWZ5RGVzdHJ1Y3QoKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogMjUuMDIuMjAwOSwgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vZmluZF9vYnMgYi9kb2MvbGZ1bi9maW5kX29icwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjQ0Mzg0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vZmluZF9vYnMKQEAgLTAsMCArMSwzOCBAQAorZmluZF9vYnMoKQorCitGVU5LVElPTgorICAgIG9iamVjdCogZmluZF9vYnMoc3RyaW5nIHN0ciwgaW50IG1ldGgpCisKK0RFRklOSUVSVCBJTjoKKworICAgIC9zdGQvbGl2aW5nL3B1dF9hbmRfZ2V0LmMKKworQVJHVU1FTlRFOgorCisgICAgc3RyICAgICBEZXIgU3RyaW5nIGRlciBnZXBhcnNlZCB3ZXJkZW4gc29sbC4KKyAgICBtZXRoICAgIE1pdCBIaWxmZSBkaWVzZXMgUGFyYW1ldGVycyBrb2VubmVuIGJlc3RpbW10ZSBCZXJlaWNocy0KKyAgICAgICAgICAgIGVpbmdyZW56dW5nZW4gdm9yZ2Vub21tZW4gd2VyZGVuIChkZWZpbmllcnQgaW4gbW92aW5nLmgpOgorCisgICAgICAgICAgICBQVVRfR0VUX05PTkUgLSBrZWluZXJsZWkgQmVyZWljaHNlaW5ncmVuenVuZy4KKyAgICAgICAgICAgIFBVVF9HRVRfVEFLRSAtIGVzIGhhbmRlbHQgc2ljaCB1bSBlaW4gTmVobWVuIHZvbiBHZWdlbnN0YWVuZGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHNvIHdpcmQgZGFzIGludmVudG9yeSBhdXNnZW5vbW1lbi4KKyAgICAgICAgICAgIFBVVF9HRVRfRFJPUCAtIGVzIGhhbmRlbHQgc2ljaCB1bSBkYXMgRW50ZmVybmVuIHZvbiBHZWdlbnN0YWVuZGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHNvIHdpcmQgZGFzIGVudmlyb25tZW50IGF1c2dlbm9tbWVuLiAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitCRVNDSFJFSUJVTkc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgRGVyIFN0cmluZyAoc3RyKSBtdXNzIGZvbGdlbmRlcyBGb3JtYXQgaGFiZW4gZGFtaXQgT2JqZWt0ZSBnZWZ1bmRlbgorICAgIHdlcmRlbi4KKworICAgIDxnZWdlbnN0YW5kPiBbYXVzIGNvbnRhaW5lcl0gW2luIG1pcnxpbSByYXVtXQorCisgICAgPGdlZ2Vuc3RhbmQ+IGthbm4gaGllcmJlaSBzb3dvaGwgZWluZSBPYmpla3QtSUQgYWxzIGF1Y2ggZWluCisgICAgR3J1cHBlbmJlemVpY2huZXIgd2llIHouYi4gImFsbGVzIiBzZWluLgorCitSVWVDS0dBQkVXRVJUOgorCisgICAgRWluIEFycmF5IG1pdCBhbGxlbiBPYmpla3RlbiBkaWUgc2ljaCBhbmdlc3Byb2NoZW4gZnVlaGxlbiwgb2RlciBhYmVyIDAuCisKK1NJRUhFIEFVQ0g6CisKKyAgICBkcm9wX29iaigpLCBnaXZlX29iaigpLCBwaWNrX29iaigpLCBwdXRfb2JqKCksIC9zdGQvbGl2aW5nL3B1dF9hbmRfZ2V0LmMKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL2dldF9raWxsaW5nX3BsYXllciBiL2RvYy9sZnVuL2dldF9raWxsaW5nX3BsYXllcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjY4NWI5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vZ2V0X2tpbGxpbmdfcGxheWVyCkBAIC0wLDAgKzEsMzkgQEAKK2dldF9raWxsaW5nX3BsYXllcigpCisKK0ZVTktUSU9OOgorICAgICBwcm90ZWN0ZWQgb2JqZWN0IGdldF9raWxsaW5nX3BsYXllcigpCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC9saXZpbmcvbGlmZS5jCisKK0FSR1VNRU5URToKKyAgICAga2VpbmUKKworQkVTQ0hSRUlCVU5HOgorICAgICBMaWVmZXJ0IGltIFRvZCAobmFjaCBkZW0gdG9ldGVuZGVuIGRvX2RhbWFnZSgpKSBkYXMgU3BpZWxlcm9iamVrdCwgd2FzCisgICAgIGRlbiBUb2Qgd29obCB6dSB2ZXJhbnR3b3J0ZW4gaGF0LCBmYWxscyBlcyBlcm1pdHRlbHQgd2VyZGVuIGthbm4uIEVzCisgICAgIHdlcmRlbiByZWdpc3RyaWVydGUgSGVsZmVyLU5QQyB1bmQgZWluaWdlIHNjaGFkZW52ZXJ1cnNhY2hlbmRlIE9iamVrdGUKKyAgICAgYmVydWVja3NpY2h0aWd0LiBIaWVyYmVpIHdpcmQgUXVlcnlVc2VyKCkgaW4gZGVuIE9iamVrdGVuIGFiZ2VmcmFndC4KKworICAgICBFcyBiZW5vZXRpZ3QgZWluIGd1ZWx0aWdlcyBQX0tJTExFUiwgZC5oLiBmYWxscyBkYXMgTGViZXdlc2VuIHZlcmdpZnRldAorICAgICB3dXJkZSBvZGVyIGRhcyB0b2V0ZW5kZSBPYmpla3QgYXVzIHNvbnN0aWdlbiBHcnVlbmRlbiBuaWNodCBpbiBQX0tJTExFUgorICAgICBzdGVodCwgZnVua3Rpb25pZXJ0IGVzIG5pY2h0LgorICAgICBBdWNoIGdpYnQgZXMgYmVzdGltbXQgT2JqZWt0ZSwgZGllIGZ1ZXIgU3BpZWxlciB0b2V0ZW4ga29lbm5lbiwgZGllIGRpZQorICAgICBkaWVzZSBGdW5rdGlvbiBuaWNodCBrZW5udC4KKyAgICAgKERpZXMgZ2lsdCBiZWlkZXMgZWJlbnNvIGZ1ZXIgL3Avc2VydmljZS9tdXBmZWwvZ2V0a2lsbC5jLCBpc3QgYWxzbyBrZWluCisgICAgICBHcnVuZCwgamVuZXMgc3RhdHQgZGllc2VyIEZ1bmt0aW9uIHp1IG51dHplbi4pCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIERhcyBPYmpla3QgZGVzIFNwaWVsZXJzLCBmYWxscyBlcyBlcm1pdHRlbHQgd2VyZGVuIGtvbm50ZSwgc29uc3QgMC4KKworQkVNRVJLVU5HRU46CisgICAgRGVyIE5hbWUgZGVzIFNwaWVsZXIgaXN0IG1pdHRlbCBOYW1lKCkgZXJtaXR0ZWxiYXIuIFdpbGwgbWFuIGRpZSBJbmZvLCAKKyAgICB3b21pdCBlaW4gU3BpZWxlciBkZW4gS2lsbCBnZ2YuIGdlbWFjaHQgaGF0LCBrYW5uIG1hbiBQX0tJTExFUgorICAgIGF1c3dlcnRlbi9udXR6ZW4uCisKK1NJRUhFIEFVQ0g6CisgICAgIFF1ZXJ5VXNlcgorICAgICBQX0tJTExFUgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMTEuMTEuMjAxMywgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9naWxkZS9BZGRTa2lsbCBiL2RvYy9sZnVuL2dpbGRlL0FkZFNraWxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZGI1MDQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9naWxkZS9BZGRTa2lsbApAQCAtMCwwICsxLDMzIEBACitBZGRTa2lsbCgpCitGVU5LVElPTjoKKyAgICB2YXJhcmdzIGludCBBZGRTa2lsbChzdHJpbmcgc25hbWUsIG1hcHBpbmcgc2tpKQorCitERUZJTklFUlQgSU46CisgICAgL3N0ZC9naWxkZW5fb2IuYworCitBUkdVTUVOVEU6CisgICAgc3RyaW5nIHNuYW1lICAgICAgIE5hbWUgZGVzIFNraWxscworICAgIG1hcHBpbmcgc2tpICAgICAgICBTa2lsbC1NYXBwaW5nCisKK0JFU0NIUkVJQlVORzoKKyAgICBGdWVndCBkZW4gU2tpbGwgenVyIExpc3RlIGRlciBpbiBkaWVzZXIgR2lsZGUgbGVybmJhcmVuIFNraWxscworICAgIGhpbnp1LiBEYXMgTWFwcGluZyBlbnRoYWVsdCBJbmZvcm1hdGlvbmVuLCBkaWUgZGVyIEdpbGRlbnJhdW0KKyAgICBiencuIGRhcyBHaWxkZW5vYmpla3QgenVtIFNraWxsIGhlcmF1c2dlYmVuIHVuZCBkaWUgZGFzIExlcm5lbgorICAgIGRlcyBTa2lsbHMgYmVlaW5mbHVzc2VuLgorCitSVUVDS0dBQldFUlQ6CisgICAgMSBmdWVyIEVyZm9sZworCitCRUlTUElFTDoKKyAgICBBZGRTa2lsbCggRklHSFQoV1RfQ0xVQiksIChbIE9GRlNFVChTSV9TS0lMTExFQVJOKSA6IDEgXSkgKTsKKworU0lFSEUgQVVDSDoKKyAgICBHT2JqIExlcm5lbjogICAgTGVhcm5Ta2lsbCwgTGVhcm5TcGVsbCwgSW5pdGlhbFNraWxsQWJpbGl0eQorICAgICogQW56ZWlnZW46ICAgICBTa2lsbExpc3RlCisgICAgKiBWZXJ3YWx0ZW46ICAgIEFkZFNwZWxsIChnaWxkZSksIFF1ZXJ5U3BlbGwsIFF1ZXJ5U2tpbGwKKyAgICAqIE51dHplbjogICAgICAgVXNlU3BlbGwgKGdpbGRlKQorICAgICogUHJvcGVydGllczogICBQX0dVSUxEX1NLSUxMUywgUF9HTE9CQUxfU0tJTExQUk9QUworICAgIEdpbGRlbmZrdC46ICAgICBHdWlsZFJhdGluZworICAgICogRWluL0F1c3RyaXR0OiBiZWl0cmV0ZW4sIGJlaV9vZGVyX2F1c190cmV0ZW4sIGF1c3RyZXRlbgorCiszLiBPa3QgMjAxMSBHbG9pbnNvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL2dpbGRlL0FkZFNwZWxsIGIvZG9jL2xmdW4vZ2lsZGUvQWRkU3BlbGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBjYTkzNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL2dpbGRlL0FkZFNwZWxsCkBAIC0wLDAgKzEsNDcgQEAKK0FkZFNwZWxsKCkKK0ZVTktUSU9OOgorICAgIHZhcmFyZ3MgaW50IEFkZFNwZWxsKHN0cmluZyB2ZXJiLCBtYXBwaW5nIHNraSkKKworREVGSU5JRVJUIElOOgorICAgIC9zdGQvZ2lsZGVuX29iLmMKKworQVJHVU1FTlRFOgorICAgIHN0cmluZyB2ZXJiICAgICAgICBOYW1lIGRlcyBTcGVsbHMKKyAgICBtYXBwaW5nIHNraSAgICAgICAgU2tpbGwtTWFwcGluZworCitCRVNDSFJFSUJVTkc6CisgICAgRnVlZ3QgZGVuIFNwZWxsIHp1ciBMaXN0ZSBkZXIgaW4gZGllc2VyIEdpbGRlIGxlcm5iYXJlbiBTcGVsbHMKKyAgICBoaW56dS4gRGFzIE1hcHBpbmcgZW50aGFlbHQgSW5mb3JtYXRpb25lbiwgZGllIGRlciBHaWxkZW5yYXVtCisgICAgYnp3LiBkYXMgR2lsZGVub2JqZWt0IHp1bSBTcGVsbCBoZXJhdXNnZWJlbiB1bmQgZGllIGRhcyBMZXJuZW4KKyAgICBkZXMgU3BlbGxzIGJlZWluZmx1c3Nlbi4KKworUlVFQ0tHQUJXRVJUOgorICAgIDEgZnVlciBFcmZvbGcKKworQkVNRVJLVU5HRU46CisgICAgU2llaGUgZGFzIFZlcmhhbHRlbiB2b24gUXVlcnlTcGVsbCAoZ2lsZGUpIHp1bSBadXNhbW1lbmZ1ZWdlbgorICAgIGRlciBBZGRTcGVsbC1JbmZvcm1hdGlvbmVuIGF1cyBHaWxkZSB1bmQgU3BlbGxib29rLiBSZWxldmFudAorICAgIHpCIGZ1ZXIgTGVybnJlc3RyaWt0aW9uZW4uCisKK0JFSVNQSUVMOgorICAgIEFkZFNwZWxsKCJlbnRmbHVjaGUiLAorICAgICAgKFtTSV9TS0lMTFJFU1RSX0xFQVJOIDoKKyAgICAgICAgKFtQX0dVSUxEX0xFVkVMOiBMVkxfV0FOREVSLAorICAgICAgICAgIFNSX0ZVTjogICAgICAgICMnZ2xhdWJlbnNUZXN0XSksCisgICAgICAgIFNJX0RJRkZJQ1VMVFk6IDEwMCwKKyAgICAgICAgU0lfU0tJTExJTkZPOiAgIldhbmRlcnByZWRpZ2VyIGFiIFN0dWZlIDciLAorICAgICAgICBTSV9TS0lMTElORk9fTE9ORzogYnJlYWtfc3RyaW5nKAorICAgICAgICAgICJVbSBqZW1hbmRlbiB2b24gZWluZW0gbGFlc3RpZ2VuIFNwcmFjaGZsdWNoIHp1IGJlZnJlaWVuLCAiCisgICAgICAgICAgInNvbGx0ZSBtYW4gZGllc2UgQW5ydWZ1bmcgYmVudXR6ZW4gWy4uLl0iLCA3OCksCisgICAgICAgIFNJX0dPRDogICAgICAgIExFTUJPTERdKSk7CisKK1NJRUhFIEFVQ0g6CisgICAgR09iaiBMZXJuZW46ICAgIExlYXJuU2tpbGwsIExlYXJuU3BlbGwsIEluaXRpYWxTa2lsbEFiaWxpdHkKKyAgICAqIEFuemVpZ2VuOiAgICAgU2tpbGxMaXN0ZQorICAgICogVmVyd2FsdGVuOiAgICBBZGRTa2lsbCwgUXVlcnlTcGVsbCwgUXVlcnlTa2lsbCwgUXVlcnlTa2lsbAorICAgICogTnV0emVuOiAgICAgICBVc2VTcGVsbCAoZ2lsZGUpCisgICAgKiBQcm9wZXJ0aWVzOiAgIFBfR1VJTERfU0tJTExTLCBQX0dMT0JBTF9TS0lMTFBST1BTCisgICAgR2lsZGVuZmt0LjogICAgIEd1aWxkUmF0aW5nCisgICAgKiBFaW4vQXVzdHJpdHQ6IGJlaXRyZXRlbiwgYmVpX29kZXJfYXVzX3RyZXRlbiwgYXVzdHJldGVuCisKKzMuIE9rdCAyMDExIEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9naWxkZS9HdWlsZFJhdGluZyBiL2RvYy9sZnVuL2dpbGRlL0d1aWxkUmF0aW5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZmI2YjIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9naWxkZS9HdWlsZFJhdGluZwpAQCAtMCwwICsxLDI3IEBACitHdWlsZFJhdGluZygpCitGVU5LVElPTjoKKyAgICBpbnQgR3VpbGRSYXRpbmcob2JqZWN0IHBsKQorCitERUZJTklFUlQgSU46CisgICAgL3N0ZC9naWxkZW5fb2IuYworCitBUkdVTUVOVEU6CisgICAgb2JqZWN0IHBsICAgICAgICAgIFNwaWVsZXIsIGRlciBnZXJhdGV0IHdlcmRlbiBzb2xsCisKK0JFU0NIUkVJQlVORzoKKyAgICBHaWJ0IGRhcyBHdWlsZC1SYXRpbmcgZGVzIFNwaWVsZXJzIGltIEJlcmVpY2ggMC1NQVhfQUJJTElUWSB6dXJ1ZWNrCisgICAgdW5kIHNjaHJlaWJ0IHNpZSBpbiBQX0dVSUxEX1JBVElORy4gV2ljaHRpZyBmdWVyIExldmVsYmVzdGltbXVuZyEKKyAgICAKKyAgICBOb3JtYWxlcndlaXNlIGlzdCBkYXMgZGVyIE1pdHRlbHdlcnQgZGVyIFNraWxsLUFiaWxpdGllcyBhbGxlciBTa2lsbHMKKyAgICB1bmQgU3BlbGxzLCBkYXMgVmVyaGFsdGVuIGthbm4gYWJlciB1ZWJlcnNjaHJpZWJlbiB3ZXJkZW4uCisKK1NJRUhFIEFVQ0g6CisgICAgR09iaiBMZXJuZW46ICAgIExlYXJuU2tpbGwsIExlYXJuU3BlbGwsIEluaXRpYWxTa2lsbEFiaWxpdHkKKyAgICAqIEFuemVpZ2VuOiAgICAgU2tpbGxMaXN0ZQorICAgICogVmVyd2FsdGVuOiAgICBBZGRTcGVsbCAoZ2lsZGUpLCBBZGRTa2lsbCwgUXVlcnlTcGVsbCwgUXVlcnlTa2lsbAorICAgICogTnV0emVuOiAgICAgICBVc2VTcGVsbCAoZ2lsZGUpCisgICAgKiBQcm9wZXJ0aWVzOiAgIFBfR1VJTERfU0tJTExTLCBQX0dMT0JBTF9TS0lMTFBST1BTLCBQX0dVSUxEX1JBVElORworICAgIEdpbGRlbmZrdC46CisgICAgKiBFaW4vQXVzdHJpdHQ6IGJlaXRyZXRlbiwgYmVpX29kZXJfYXVzX3RyZXRlbiwgYXVzdHJldGVuCisKKzEwLiBPa3QgMjAxMSBHbG9pbnNvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL2dpbGRlL0luaXRpYWxTa2lsbEFiaWxpdHkgYi9kb2MvbGZ1bi9naWxkZS9Jbml0aWFsU2tpbGxBYmlsaXR5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YTI2ODkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9naWxkZS9Jbml0aWFsU2tpbGxBYmlsaXR5CkBAIC0wLDAgKzEsMzEgQEAKK0luaXRpYWxTa2lsbEFiaWxpdHkoKQorRlVOS1RJT046CisgICAgc3RhdGljIGludCBJbml0aWFsU2tpbGxBYmlsaXR5KG1hcHBpbmcgc2tpLCBvYmplY3QgcGwpCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3RkL2dpbGRlbl9vYi5jCisKK0FSR1VNRU5URToKKyAgICBtYXBwaW5nIHNraSAgICAgRGVyIHp1IGxlcm5lbmRlIFNraWxsCisgICAgb2JqZWN0ICBwbCAgICAgIFNwaWVsZXIKKworQkVTQ0hSRUlCVU5HOgorICAgIEdpYnQgZGVuIGluaXRpYWxlbiBBYmlsaXR5LVdlcnQgZnVlciBlaW5lbiBuZXUgenUgbGVybmVuZGVuIFNraWxsIChTcGVsbCkKKyAgICB6dXJ1ZWNrLiBEaWUgU3RhbmRhcmRmb3JtZWwgYmVudXR6dCBudXIgSW50ZWxsaWdlbnogdW5kIFNJX1NLSUxMTEVBUk4gdW5kCisgICAga2FubiBpbiBkZXIgR2lsZGUgdWViZXJzY2hyaWViZW4gd2VyZGVuLgorCitCRU1FUktVTkdFTjoKKyAgICBEZXIgenVydWVja2dlZ2ViZW5lIFdlcnQgd2lyZCBub2NoIGluIGRhcyBTcGllbGVyLVNraWxsc3lzdGVtIGVpbmdlZ2ViZW4KKyAgICB1bmQgZGFoZXIga2FubiBkZXIgcmVhbCBnZWxlcm50ZSBXZXJ0IGFid2VpY2hlbgorCitTSUVIRSBBVUNIOgorICAgIFNraWxsczogICAgICAgICBMaW1pdEFiaWxpdHksIE1vZGlmeVNraWxsCisgICAgR09iaiBMZXJuZW46ICAgIExlYXJuU2tpbGwsIExlYXJuU3BlbGwKKyAgICAqIEFuemVpZ2VuOiAgICAgU2tpbGxMaXN0ZQorICAgICogVmVyd2FsdGVuOiAgICBBZGRTcGVsbCAoZ2lsZGUpLCBBZGRTa2lsbCwgUXVlcnlTcGVsbCwgUXVlcnlTa2lsbAorICAgICogTnV0emVuOiAgICAgICBVc2VTcGVsbCAoZ2lsZGUpCisgICAgKiBQcm9wZXJ0aWVzOiAgIFBfR1VJTERfU0tJTExTLCBQX0dMT0JBTF9TS0lMTFBST1BTCisgICAgR2lsZGVuZmt0LjogICAgIEd1aWxkUmF0aW5nCisgICAgKiBFaW4vQXVzdHJpdHQ6IGJlaXRyZXRlbiwgYmVpX29kZXJfYXVzX3RyZXRlbiwgYXVzdHJldGVuCisKKzMuIE9rdCAyMDExIEdsb2luc29uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vZ2lsZGUvTGVhcm5Ta2lsbCBiL2RvYy9sZnVuL2dpbGRlL0xlYXJuU2tpbGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM4MTk1OQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL2dpbGRlL0xlYXJuU2tpbGwKQEAgLTAsMCArMSwzNSBAQAorTGVhcm5Ta2lsbCgpCitGVU5LVElPTjoKKyAgICBpbnQgTGVhcm5Ta2lsbChzdHJpbmcgc2tpbGwpCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3RkL2dpbGRlbl9vYi5jCisKK0FSR1VNRU5URToKKyAgICBzdHJpbmcgc2tpbGwgICAgIERlciB6dSBsZXJuZW5kZSBTa2lsbAorCitCRVNDSFJFSUJVTkc6CisgICAgRGllc2UgRnVua3Rpb24gdWViZXJwcnVlZnQgZGVuIFNwaWVsZXIgYXVmIEdpbGRlbnp1Z2Vob2VyaWdrZWl0CisgICAgdW5kIHJ1ZnQsIGZhbGxzIGtlaW4gJ3NraWxsJyBhbmdlZ2ViZW4gaXN0IGRpZSBTa2lsbExpc3RlKCkKKyAgICBmdWVyIFNraWxscyBhdWYuCisKKyAgICBGYWxscyBlaW4gQXJndW1lbnQgYW5nZWdlYmVuIHdpcmQsIHdpcmQgYmVpIGRlbSBTcGllbGVyIGRpZXNlciBTa2lsbAorICAgIGluaXRpYWxpc2llcnQsIHNvZmVybiBlciBkaWUgbm90d2VuZGlnZW4gQW5mb3JkZXJ1bmdlbiBlcmZ1ZWxsdCBoYXQuCisKK1JVRUNLR0FCRVdFUlQ6CisgICAgMCBiZWkgRmVobGVyLCAxIGJlaSBFcmZvbGcuCisKK0JFTUVSS1VOR0VOOgorICAgIEZ1ZXIgZGllIExlYmV3ZXNlbi1Ta2lsbHMgZ2lidCBlcyBlaW5lIGdsZWljaG5hbWlnZSBGdW5rdGlvbi4KKyAgICBTaWVoZSBkYWZ1ZXIgTGVhcm5Ta2lsbC4KKworU0lFSEUgQVVDSDoKKyAgICBHT2JqIExlcm5lbjogICAgTGVhcm5TcGVsbCwgSW5pdGlhbFNraWxsQWJpbGl0eQorICAgICogQW56ZWlnZW46ICAgICBTa2lsbExpc3RlCisgICAgKiBWZXJ3YWx0ZW46ICAgIEFkZFNwZWxsIChnaWxkZSksIEFkZFNraWxsLCBRdWVyeVNwZWxsLCBRdWVyeVNraWxsCisgICAgKiBOdXR6ZW46ICAgICAgIFVzZVNwZWxsIChnaWxkZSkKKyAgICAqIFByb3BlcnRpZXM6ICAgUF9HVUlMRF9TS0lMTFMsIFBfR0xPQkFMX1NLSUxMUFJPUFMKKyAgICBHaWxkZW5ma3QuOiAgICAgR3VpbGRSYXRpbmcKKyAgICAqIEVpbi9BdXN0cml0dDogYmVpdHJldGVuLCBiZWlfb2Rlcl9hdXNfdHJldGVuLCBhdXN0cmV0ZW4KKworMy4gT2t0IDIwMTEgR2xvaW5zb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9naWxkZS9MZWFyblNwZWxsIGIvZG9jL2xmdW4vZ2lsZGUvTGVhcm5TcGVsbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWM1ODQwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vZ2lsZGUvTGVhcm5TcGVsbApAQCAtMCwwICsxLDMyIEBACitMZWFyblNwZWxsKCkKK0ZVTktUSU9OOgorICAgIHZhcmFyZ3MgaW50IExlYXJuU3BlbGwoc3RyaW5nIHNwZWxsLCBvYmplY3QgcGwpCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3RkL2dpbGRlbl9vYi5jCisKK0FSR1VNRU5URToKKyAgICBzdHJpbmcgc3BlbGwgICAgIERlciB6dSBsZXJuZW5kZSBTcGVsbAorICAgIG9iamVjdCBwbCAgICAgICAgbGVybmVuZGVyIFNwaWVsZXIsIHdlbm4gMCwgd2lyZCB0aGlzX3BsYXllcigpIGdlbm9tbWVuCisKK0JFU0NIUkVJQlVORzoKKyAgICBEaWVzZSBGdW5rdGlvbiB1ZWJlcnBydWVmdCBkZW4gU3BpZWxlciBhdWYgR2lsZGVuenVnZWhvZXJpZ2tlaXQKKyAgICB1bmQgcnVmdCwgZmFsbHMga2VpbiAnc3BlbGwnIGFuZ2VnZWJlbiBpc3QgZGllIFNraWxsTGlzdGUoKQorICAgIGZ1ZXIgU3BlbGxzIGF1Zi4KKworICAgIEZhbGxzIGVpbiBBcmd1bWVudCBhbmdlZ2ViZW4gd2lyZCwgd2lyZCBiZWkgZGVtIFNwaWVsZXIgZGllc2VyIFNwZWxsCisgICAgaW5pdGlhbGlzaWVydCwgc29mZXJuIGVyIGRpZSBub3R3ZW5kaWdlbiBBbmZvcmRlcnVuZ2VuIGVyZnVlbGx0IGhhdC4KKworUlVFQ0tHQUJFV0VSVDoKKyAgICAwIGJlaSBGZWhsZXIsIDEgYmVpIEVyZm9sZy4KKworU0lFSEUgQVVDSDoKKyAgICBHT2JqIExlcm5lbjogICAgTGVhcm5Ta2lsbCwgSW5pdGlhbFNraWxsQWJpbGl0eQorICAgICogQW56ZWlnZW46ICAgICBTa2lsbExpc3RlCisgICAgKiBWZXJ3YWx0ZW46ICAgIEFkZFNwZWxsIChnaWxkZSksIEFkZFNraWxsLCBRdWVyeVNwZWxsLCBRdWVyeVNraWxsCisgICAgKiBOdXR6ZW46ICAgICAgIFVzZVNwZWxsIChnaWxkZSkKKyAgICAqIFByb3BlcnRpZXM6ICAgUF9HVUlMRF9TS0lMTFMsIFBfR0xPQkFMX1NLSUxMUFJPUFMKKyAgICBHaWxkZW5ma3QuOiAgICAgR3VpbGRSYXRpbmcKKyAgICAqIEVpbi9BdXN0cml0dDogYmVpdHJldGVuLCBiZWlfb2Rlcl9hdXNfdHJldGVuLCBhdXN0cmV0ZW4KKworMy4gT2t0IDIwMTEgR2xvaW5zb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9naWxkZS9RdWVyeVNraWxsIGIvZG9jL2xmdW4vZ2lsZGUvUXVlcnlTa2lsbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWRjZTEyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vZ2lsZGUvUXVlcnlTa2lsbApAQCAtMCwwICsxLDMzIEBACitRdWVyeVNraWxsKCkKK0ZVTktUSU9OOgorICAgIG1hcHBpbmcgUXVlcnlTa2lsbChzdHJpbmcgc2tpbGwpCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3RkL2dpbGRlbl9vYi5jCisKK0FSR1VNRU5URToKKyAgICBzdHJpbmcgc2tpbGwgICAgICAgTmFtZSBkZXMgU2tpbGxzCisKK0JFU0NIUkVJQlVORzoKKyAgICBMaWVmZXJ0IGZ1ZXIgZGllc2VuIFNraWxsIGRpZSBHaWxkZW5pbmZvcm1hdGlvbmVuIGluIGVpbmVtCisgICAgTWFwcGluZyB6dXJ1ZWNrLgorCitCRUlTUElFTDoKKyAgICAvLyAvZ2lsZGVuL2tsZXJ1cy0+UXVlcnlTa2lsbChGSUdIVChXVF9DTFVCKSkgZ2lidCB6QiB6dXJ1ZWNrOgorICAgIChbU0lfRlVOOiAgICAgICAgICAgICAgICAiRmlnaHRfY2x1YiIsCisgICAgICBPRkZTRVQoU0lfU0tJTExMRUFSTik6IDEKKyAgICAgIFNJX1NLSUxMUkVTVFJfVVNFOiAgICAgKFtTUl9GVU46IydnaWxkZW4va2xlcnVzLT5zcGVsbFRlc3QoKV0pLAorICAgICAgT0ZGU0VUKFNJX1NLSUxMTEVBUk4pOiAjJ2dpbGRlbi9rbGVydXMtPmxlYXJuT2Zmc2V0LAorICAgICAgT0ZGU0VUKFNJX1NQRUxMQ09TVCk6ICAjJ2dpbGRlbi9rbGVydXMtPmNvc3RPZmZzZXQsCisgICAgICBGQUNUT1IoU0lfU1BFTExDT1NUKTogICMnZ2lsZGVuL2tsZXJ1cy0+Y29zdEZhY3Rvcl0pCisKK1NJRUhFIEFVQ0g6CisgICAgR09iaiBMZXJuZW46ICAgIExlYXJuU2tpbGwsIExlYXJuU3BlbGwsIEluaXRpYWxTa2lsbEFiaWxpdHkKKyAgICAqIEFuemVpZ2VuOiAgICAgU2tpbGxMaXN0ZQorICAgICogVmVyd2FsdGVuOiAgICBBZGRTa2lsbCwgQWRkU3BlbGwsIFF1ZXJ5U3BlbGwKKyAgICAqIE51dHplbjogICAgICAgVXNlU3BlbGwgKGdpbGRlKQorICAgICogUHJvcGVydGllczogICBQX0dVSUxEX1NLSUxMUywgUF9HTE9CQUxfU0tJTExQUk9QUworICAgIEdpbGRlbmZrdC46ICAgICBHdWlsZFJhdGluZworICAgICogRWluL0F1c3RyaXR0OiBiZWl0cmV0ZW4sIGJlaV9vZGVyX2F1c190cmV0ZW4sIGF1c3RyZXRlbgorCiszLiBPa3QgMjAxMSBHbG9pbnNvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL2dpbGRlL1F1ZXJ5U3BlbGwgYi9kb2MvbGZ1bi9naWxkZS9RdWVyeVNwZWxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZjE5NjUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9naWxkZS9RdWVyeVNwZWxsCkBAIC0wLDAgKzEsNTQgQEAKK1F1ZXJ5U3BlbGwoKQorRlVOS1RJT046CisgICAgbWFwcGluZyBRdWVyeVNwZWxsKHN0cmluZyBzcGVsbCkKKworREVGSU5JRVJUIElOOgorICAgIC9zdGQvZ2lsZGVuX29iLmMKKworQVJHVU1FTlRFOgorICAgIHN0cmluZyBzcGVsbCAgICAgICBOYW1lIGRlcyBTcGVsbHMKKworQkVTQ0hSRUlCVU5HOgorICAgIExpZWZlcnQgZnVlciBkaWVzZW4gU3BlbGwgZGllIEdpbGRlbi0gdW5kIFNwZWxsYm9va2luZm9ybWF0aW9uZW4KKyAgICB6dXNhbW1lbmdlZmFzc3QgaW4gZWluIE1hcHBpbmcgenVydWVjay4KKyAgICBEaWUgR2lsZGVuaW5mb3JtYXRpb25lbiBoYWJlbiBkYWJlaSBWb3JyYW5nIChkLmguIGVpbmUgTGVybnJlc3RyaWt0aW9uCisgICAgaW0gU3BlbGxib29rIHdpcmQgYmVudXR6dCwgYmVpIHVudGVyc2NoaWVkbGljaGVuIFdlcnRlbiBmdWVyIGRhcyBnbGVpY2hlCisgICAgQXR0cmlidXQgZ2VodCBkZXIgV2VydCBpbiBkZXIgR2lsZGUgdm9yKS4KKworQkVJU1BJRUw6CisgICAgLy8gL2dpbGRlbi9rbGVydXMtPlF1ZXJ5U3BlbGwoImVudGZsdWNoZSIpIGdpYnQgekIgenVydWVjazoKKyAgICAoW1NJX1NQRUxMRkFUSUdVRTogMiwKKyAgICAgIFNJX1NQX0xPV19NU0c6ICAgIkRlaW5lIEtvbnplbnRyYXRpb24gcmVpY2h0IG5pY2h0IGF1cywgZGFzIEludGVyZXNzZSAiCisgICAgICAgICAgICAgICAgICAgICAgICJkZXIgR29ldHRlciB6dSAid2Vja2VuLlxuIiwKKyAgICAgIFNJX1RJTUVfTVNHOiAgICAgIlNvIHNjaG5lbGwga29lbm5lbiBzaWNoIGRpZSBHb2V0dGVyIG5pY2h0IHdpZWRlciB1bSAiCisgICAgICAgICAgICAgICAgICAgICAgICJEaWNoIGt1ZW1tZXJuIVxuIiwKKyAgICAgIFNJX1NLSUxMTEVBUk46ICAgNSwKKyAgICAgIE9GRlNFVChTSV9TS0lMTExFQVJOKToxNQorICAgICAgU0lfU0tJTExSRVNUUl9MRUFSTjoKKyAgICAgIChbUF9MRVZFTDogICAgICAgNywKKyAgICAgICAgUF9HVUlMRF9MRVZFTDogTFZMX1dBTkRFUiwKKyAgICAgICAgU1JfRlVOOiAgICAgICAgIydnaWxkZW4va2xlcnVzLT5nbGF1YmVuc1Rlc3RdKSwKKyAgICAgIFNJX0RJRkZJQ1VMVFk6ICAgMTAwLAorICAgICAgU0lfU0tJTExJTkZPOiAgICAiV2FuZGVycHJlZGlnZXIgYWIgU3R1ZmUgNyIsCisgICAgICBTSV9TS0lMTElORk9fTE9ORzoKKyAgICAgICAgIlVtIGplbWFuZGVuIHZvbiBlaW5lbSBsYWVzdGlnZW4gU3ByYWNoZmx1Y2ggenUgYmVmcmVpZW4sICIKKyAgICAgICAgInNvbGx0ZSBtYW4gZGllc2UgQW5ydWZ1bmcgYmVudXR6ZW4gWy4uLl0iLAorICAgICAgU1BfTkFNRTogICAgICAgICAiZW50Zmx1Y2hlIiwKKyAgICAgIFNJX1NLSUxMUkVTVFJfVVNFOiAoWyBTUl9GUkVFX0hBTkRTIDogMCBdKSwKKyAgICAgIFNJX01BR0lDX1RZUEU6ICAgKHtNVF9TQUtSQUx9KQorICAgICAgU0lfR09EOiAgICAgICAgICBMRU1CT0xELAorICAgICAgU0lfU0tJTExSRVNUUl9VU0U6ICAgICAoW1NSX0ZVTjojJ2dpbGRlbi9rbGVydXMtPnNwZWxsVGVzdCgpXSksCisgICAgICBPRkZTRVQoU0lfU0tJTExMRUFSTik6ICMnZ2lsZGVuL2tsZXJ1cy0+bGVhcm5PZmZzZXQsCisgICAgICBPRkZTRVQoU0lfU1BFTExDT1NUKTogICMnZ2lsZGVuL2tsZXJ1cy0+Y29zdE9mZnNldCwKKyAgICAgIEZBQ1RPUihTSV9TUEVMTENPU1QpOiAgIydnaWxkZW4va2xlcnVzLT5jb3N0RmFjdG9yXSkKKworU0lFSEUgQVVDSDoKKyAgICBHT2JqIExlcm5lbjogICAgTGVhcm5Ta2lsbCwgTGVhcm5TcGVsbCwgSW5pdGlhbFNraWxsQWJpbGl0eQorICAgICogQW56ZWlnZW46ICAgICBTa2lsbExpc3RlCisgICAgKiBWZXJ3YWx0ZW46ICAgIEFkZFNraWxsLCBBZGRTcGVsbCwgUXVlcnlTa2lsbAorICAgICogTnV0emVuOiAgICAgICBVc2VTcGVsbCAoZ2lsZGUpCisgICAgKiBQcm9wZXJ0aWVzOiAgIFBfR1VJTERfU0tJTExTLCBQX0dMT0JBTF9TS0lMTFBST1BTCisgICAgR2lsZGVuZmt0LjogICAgIEd1aWxkUmF0aW5nCisgICAgKiBFaW4vQXVzdHJpdHQ6IGJlaXRyZXRlbiwgYmVpX29kZXJfYXVzX3RyZXRlbiwgYXVzdHJldGVuCisKKzMuIE9rdCAyMDExIEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9naWxkZS9Ta2lsbExpc3RlIGIvZG9jL2xmdW4vZ2lsZGUvU2tpbGxMaXN0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2MyYjM5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vZ2lsZGUvU2tpbGxMaXN0ZQpAQCAtMCwwICsxLDI3IEBACitTa2lsbExpc3RlKCkKK0ZVTktUSU9OOgorICAgIGludCBTa2lsbExpc3RlKGludCB3aGF0KQorCitERUZJTklFUlQgSU46CisgICAgL3N0ZC9naWxkZW5fb2IuYworCitBUkdVTUVOVEU6CisgICAgaW50IHdoYXQgICAgICAgIFJ1ZWNrZ2FiZW9wdGlvbjoKKworQkVTQ0hSRUlCVU5HOgorICAgIEdpYnQgZWluZSBUZXh0IG1pdCBMaXN0ZSBtaXQgbGVybmJhcmVuIFNraWxscy9TcGVsbHMgenVydWVjazoKKyAgICAKKyAgICBGdWVyICd3aGF0JzogMCAtIGFsbGU7IDEgLSBTcGVsbHM7IDIgLSBTa2lsbHMuCisgICAgCisgICAgWmVpZ3QgRWludHJhZWdlIGF1cyBTSV9TS0lMTElORk8uCisKK1NJRUhFIEFVQ0g6CisgICAgR09iaiBMZXJuZW46ICAgIExlYXJuU2tpbGwsIExlYXJuU3BlbGwsIEluaXRpYWxTa2lsbEFiaWxpdHkKKyAgICAqIFZlcndhbHRlbjogICAgQWRkU3BlbGwgKGdpbGRlKSwgQWRkU2tpbGwsIFF1ZXJ5U3BlbGwsIFF1ZXJ5U2tpbGwKKyAgICAqIE51dHplbjogICAgICAgVXNlU3BlbGwgKGdpbGRlKQorICAgICogUHJvcGVydGllczogICBQX0dVSUxEX1NLSUxMUywgUF9HTE9CQUxfU0tJTExQUk9QUworICAgIEdpbGRlbmZrdC46ICAgICBHdWlsZFJhdGluZworICAgICogRWluL0F1c3RyaXR0OiBiZWl0cmV0ZW4sIGJlaV9vZGVyX2F1c190cmV0ZW4sIGF1c3RyZXRlbgorICAgIFNraWxsczogICAgICAgICBza2lsbF9pbmZvX2xpc3RlCisKKzMuIE9rdCAyMDExIEdsb2luc29uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vZ2lsZGUvVXNlU3BlbGwgYi9kb2MvbGZ1bi9naWxkZS9Vc2VTcGVsbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjgyM2NjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vZ2lsZGUvVXNlU3BlbGwKQEAgLTAsMCArMSwzMiBAQAorVXNlU3BlbGwoKQorRlVOS1RJT046CisgICAgdmFyYXJncyBpbnQgVXNlU3BlbGwob2JqZWN0IGNhc3Rlciwgc3RyaW5nIHNwZWxsLCBtYXBwaW5nIHNpbmZvKQorCitERUZJTklFUlQgSU46CisgICAgL3N0ZC9naWxkZW5fb2IuYworCitBUkdVTUVOVEU6CisgICAgb2JqZWN0IGNhc3RlciAgICAgIFNwaWVsZXIsIGRlciBTcGVsbCBudXR6dAorICAgIHN0cmluZyBzcGVsbCAgICAgICBTcGVsbC1OYW1lCisgICAgbWFwcGluZyBzaW5mbyAgICAgIFNwZWxsLUluZm9ybWF0aW9uZW4KKworQkVTQ0hSRUlCVU5HOgorICAgIFBydWVmdCwgb2IgZGVyIFNwZWxsIGluIGRlciBHaWxkZSBkZWZpbmllcnQgaXN0IHVuZCBydWZ0IGlobiBkYW5uCisgICAgZ2dmIGluIGF1cyBkZW0gU3BlbGwtTWFwcGluZyBnZWxlc2VuZW4gR2lsZGVuLVNJX1NQRUxMQk9PSyBhdWYuCisKKyAgICBXaXJkIHZvbiBsaXZpbmcvc2tpbGxzOjpVc2VTcGVsbCBnZXJ1ZmVuLCB3ZW5uIGRpZXNlcyBkaWUgU0lfQ0xPU1VSRSwKKyAgICBhbHNvIGRpZSBGdW5rdGlvbiBlaW5lcyBTcGVsbHMgc3VjaHQsIGZ1ZXIgZGVuIGtlaW4gU0lfU1BFTExCT09LCisgICAgZXhwbGl6aXQgYW5nZWdlYmVuIHd1cmRlLgorCitSVUVDS0dBQldFUlQ6CisgICAgUnVlY2tnYWJld2VydCBkZXMgU3BlbGxzIGF1cyBkZW0gU3BlbGxib29rIG9kZXIgMC4KKworU0lFSEUgQVVDSDoKKyAgICBHT2JqIExlcm5lbjogICAgTGVhcm5Ta2lsbCwgTGVhcm5TcGVsbCwgSW5pdGlhbFNraWxsQWJpbGl0eQorICAgICogQW56ZWlnZW46ICAgICBTa2lsbExpc3RlCisgICAgKiBWZXJ3YWx0ZW46ICAgIEFkZFNwZWxsIChnaWxkZSksIEFkZFNraWxsLCBRdWVyeVNwZWxsLCBRdWVyeVNraWxsCisgICAgKiBQcm9wZXJ0aWVzOiAgIFBfR1VJTERfU0tJTExTLCBQX0dMT0JBTF9TS0lMTFBST1BTCisgICAgR2lsZGVuZmt0LjogICAgIEd1aWxkUmF0aW5nCisgICAgKiBFaW4vQXVzdHJpdHQ6IGJlaXRyZXRlbiwgYmVpX29kZXJfYXVzX3RyZXRlbiwgYXVzdHJldGVuCisKKzMuIE9rdCAyMDExIEdsb2luc29uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vZ2lsZGUvYXVzdHJldGVuIGIvZG9jL2xmdW4vZ2lsZGUvYXVzdHJldGVuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NzBiZWYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9naWxkZS9hdXN0cmV0ZW4KQEAgLTAsMCArMSwzNCBAQAorYXVzdHJldGVuKCkKK0ZVTktUSU9OOgorICAgIHZhcmFyZ3MgaW50IGF1c3RyZXRlbihpbnQgbG9zcykKKworQVJHVU1FTlRFOgorICAgIGludCBsb3NzICAgICAgIFByb3plbnRzYXR6LCB1bSBkZW4gc2ljaCBkaWUgR2lsZGVuc2tpbGxzIHZlcnNjaGxlY2h0ZXJuCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3RkL2dpbGRlbl9vYi5jCisKK0JFU0NIUkVJQlVORzoKKyAgICBBdXN0cml0dHNmdW5rdGlvbiBkZXIgR2lsZGUuIFBydWVmdCBkaWUgUmVzdHJpa3Rpb25lbiBkZXIgR2lsZGUgdW5kCisgICAgbGFlc3N0IHRoaXNfcGxheWVyKCkgZ2dmIGF1c3RyZXRlbi4gRGFzIEF1c3RyZXRlbiBhdXMgZGVyIFN0YW5kYXJkLQorICAgIGdpbGRlIGlzdCBkYWJlaSBuaWNodCBtb2VnbGljaC4KKworICAgIERlciBHaWxkZW5tYXN0ZXIgbG9lc3QgZ2dmIGVpbiBFVlRfR1VJTERfQ0hBTkdFIGF1cy4gRGFiZWkgd2VyZGVuCisgICAgRV9PQkpFQ1QsIEVfR1VJTEROQU1FLCBFX0xBU1RfR1VJTEROQU1FIGVudHNwcmVjaGVuZCBnZXNldHp0LgorCisgICAgRGVyIEdpbGRlbm1hc3RlciBzZW5rdCBhdWNoIGRpZSBTa2lsbC9TcGVsbC1GYWVoaWdrZWl0ZW4gdW0gJ2xvc3MnIGJ6dy4KKyAgICBub3JtYWxlcndlaXNlIG1pbmRlc3RlbnMgMjAlLgorCisgICAgRHVyY2ggVWViZXJzY2hyZWliZW4ga29lbm5lbiBoaWVyIHpCIEFic2NoaWVkc21lbGR1bmdlbiBnZXNlbmRldCB3ZXJkZW4uCisKK1NJRUhFIEFVQ0g6CisgICAgR09iaiBMZXJuZW46ICAgIExlYXJuU2tpbGwsIExlYXJuU3BlbGwsIEluaXRpYWxTa2lsbEFiaWxpdHkKKyAgICAqIEFuemVpZ2VuOiAgICAgU2tpbGxMaXN0ZQorICAgICogVmVyd2FsdGVuOiAgICBBZGRTcGVsbCAoZ2lsZGUpLCBBZGRTa2lsbCwgUXVlcnlTcGVsbCwgUXVlcnlTa2lsbAorICAgICogTnV0emVuOiAgICAgICBVc2VTcGVsbCAoZ2lsZGUpCisgICAgKiBQcm9wZXJ0aWVzOiAgIFBfR1VJTERfU0tJTExTLCBQX0dMT0JBTF9TS0lMTFBST1BTCisgICAgR2lsZGVuZmt0LjoKKyAgICAqIEVpbi9BdXN0cml0dDogYmVpdHJldGVuLCBiZWlfb2Rlcl9hdXNfdHJldGVuCisgICAgKiBQcm9wcyBkYWZ1ZXI6IFBfR1VJTERfUkVTVFJJQ1RJT05TCisKKzMuIE9rdCAyMDExIEdsb2luc29uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vZ2lsZGUvYmVpX29kZXJfYXVzX3RyZXRlbiBiL2RvYy9sZnVuL2dpbGRlL2JlaV9vZGVyX2F1c190cmV0ZW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE1ZGU3OAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL2dpbGRlL2JlaV9vZGVyX2F1c190cmV0ZW4KQEAgLTAsMCArMSwyNSBAQAorYmVpX29kZXJfYXVzX3RyZXRlbigpCitGVU5LVElPTjoKKyAgICBpbnQgYmVpX29kZXJfYXVzX3RyZXRlbihzdHJpbmcgc3RyKQorCitBUkdVTUVOVEU6CisgICAgc3RyaW5nIHN0ciAgICAgICBTcGllbGVycGFyYW1ldGVyCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3RkL2dpbGRlbl9vYi5jCisKK0JFU0NIUkVJQlVORzoKKyAgICBBdXMtIG9kZXIgRWludHJpdHRzZnVua3Rpb24sIHJ1ZnQgYmVpdHJldGVuKCkgYnp3LiBhdXN0cmV0ZW4oKSBhdWYuCisgICAgV2lyZCBpbSBTdGQtR2lsZGVucmF1bSBwZXIgQWRkQ21kIHp1ciBWZXJmdWVndW5nIGdlc3RlbGx0LgorCitTSUVIRSBBVUNIOgorICAgIEdPYmogTGVybmVuOiAgICBMZWFyblNraWxsLCBMZWFyblNwZWxsLCBJbml0aWFsU2tpbGxBYmlsaXR5CisgICAgKiBBbnplaWdlbjogICAgIFNraWxsTGlzdGUKKyAgICAqIFZlcndhbHRlbjogICAgQWRkU3BlbGwgKGdpbGRlKSwgQWRkU2tpbGwsIFF1ZXJ5U3BlbGwsIFF1ZXJ5U2tpbGwKKyAgICAqIE51dHplbjogICAgICAgVXNlU3BlbGwgKGdpbGRlKQorICAgICogUHJvcGVydGllczogICBQX0dVSUxEX1NLSUxMUywgUF9HTE9CQUxfU0tJTExQUk9QUworICAgIEdpbGRlbmZrdC46CisgICAgKiBFaW4vQXVzdHJpdHQ6IGJlaXRyZXRlbiwgYXVzdHJldGVuCisgICAgKiBQcm9wcyBkYWZ1ZXI6IFBfR1VJTERfUkVTVFJJQ1RJT05TCisKKzMuIE9rdCAyMDExIEdsb2luc29uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vZ2lsZGUvYmVpdHJldGVuIGIvZG9jL2xmdW4vZ2lsZGUvYmVpdHJldGVuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MzhmN2IKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9naWxkZS9iZWl0cmV0ZW4KQEAgLTAsMCArMSwyOCBAQAorYmVpdHJldGVuKCkKK0ZVTktUSU9OOgorICAgIGludCBiZWl0cmV0ZW4oKQorCitERUZJTklFUlQgSU46CisgICAgL3N0ZC9naWxkZW5fb2IuYworCitCRVNDSFJFSUJVTkc6CisgICAgQmVpdHJpdHRzZnVua3Rpb24gZGVyIEdpbGRlLiBQcnVlZnQgZGllIEdpbGRlIHNlbGJzdCBpbSBHaWxkZW5tYXN0ZXIsCisgICAgZGFubiBkaWUgUmVzdHJpa3Rpb25lbiBkZXIgR2lsZGUgdW5kIGxhZXNzdCB0aGlzX3BsYXllcigpIGdnZiBlaW50cmV0ZW4uCisKKyAgICBEZXIgR2lsZGVubWFzdGVyIGxvZXN0IGdnZiBlaW4gRVZUX0dVSUxEX0NIQU5HRSBhdXMuIERhYmVpIHdlcmRlbgorICAgIEVfT0JKRUNULCBFX0dVSUxETkFNRSwgRV9MQVNUX0dVSUxETkFNRSBlbnRzcHJlY2hlbmQgZ2VzZXR6dC4KKworICAgIER1cmNoIFVlYmVyc2NocmVpYmVuIGtvZW5uZW4gaGllciB6QiBTdGFuZGFyZC1Ta2lsbHMgdW5kIFNwZWxscyBkZW4KKyAgICBTcGllbGVyIGJlaSBFaW50cml0dCBnZWxlaHJ0IHdlcmRlbi4KKworU0lFSEUgQVVDSDoKKyAgICBHT2JqIExlcm5lbjogICAgTGVhcm5Ta2lsbCwgTGVhcm5TcGVsbCwgSW5pdGlhbFNraWxsQWJpbGl0eQorICAgICogQW56ZWlnZW46ICAgICBTa2lsbExpc3RlCisgICAgKiBWZXJ3YWx0ZW46ICAgIEFkZFNwZWxsIChnaWxkZSksIEFkZFNraWxsLCBRdWVyeVNwZWxsCisgICAgKiBOdXR6ZW46ICAgICAgIFVzZVNwZWxsIChnaWxkZSkKKyAgICAqIFByb3BlcnRpZXM6ICAgUF9HVUlMRF9TS0lMTFMsIFBfR0xPQkFMX1NLSUxMUFJPUFMKKyAgICBHaWxkZW5ma3QuOgorICAgICogRWluL0F1c3RyaXR0OiBiZWlfb2Rlcl9hdXNfdHJldGVuLCBhdXN0cmV0ZW4KKyAgICAqIFByb3BzIGRhZnVlcjogUF9HVUlMRF9SRVNUUklDVElPTlMKKworMy4gT2t0IDIwMTEgR2xvaW5zb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9naXZlIGIvZG9jL2xmdW4vZ2l2ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWEyNjI0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vZ2l2ZQpAQCAtMCwwICsxLDQzIEBACitnaXZlKCkKKworRlVOS1RJT046CisgICAgcHVibGljIHZhcmFyZ3MgaW50IGdpdmUob2JqZWN0IG8sIG9iamVjdCBkZXN0LCBtaXhlZCBtc2cpOworCitERUZJTklFUlQgSU46CisgICAgL3N0ZC9saXZpbmcvcHV0X2FuZF9nZXQuYworCitBUkdVTUVOVEU6CisgICAgb2JqZWN0IG8KKyAgICAgICAgRGFzIE9iamVrdCwgZGFzIHVlYmVyZ2ViZW4gd2VyZGVuIHNvbGwuCisgICAgb2JqZWN0IGRlc3QKKyAgICAgICAgRGVyIFNwaWVsZXIgb2RlciBOUEMsIGRlciBkYXMgT2JqZWt0IGJla29tbWVuIHNvbGwuCisgICAgbWl4ZWQgbXNnCisgICAgICAgIEVpbmUgb3B0aW9uYWxlIE1lbGR1bmcsIGRpZSBhbnN0ZWxsZSB2b24gUF9HSVZFX01TRyBvZGVyIGRlcgorICAgICAgICBTdGFuZGFyZG1lbGR1bmcgdmVyd2VuZGV0IHdpcmQsIG9kZXIgLTEsIHVtIGRpZSBNZWxkdW5nIHp1CisgICAgICAgIHVudGVyZHJ1ZWNrZW4uCisKK0JFU0NIUkVJQlVORzoKKyAgICBEZXIgU3BpZWxlciBvZGVyIE5QQyB1ZWJlcmdpYnQgZGVtIEVtcGZhZW5nZXIgZGFzIE9iamVrdC4gR2lidCBvLT5tb3ZlKCkKKyAgICBrZWluZW4gcG9zaXRpdmVuIFdlcnQgenVydWVjaywgYmVpc3BpZWxzd2Vpc2Ugd2VpbCBkYXMgT2JqZWt0IHZlcmZsdWNodAorICAgIGlzdCBvZGVyIGRlciBFbXBmYWVuZ2VyIGVzIG5pY2h0IG1laHIgdHJhZ2VuIGthbm4sIGJla29tbXQgZXIgZWluZQorICAgIGVudHNwcmVjaGVuZGUgRmVobGVybWVsZHVuZy4KKworUlVFQ0tHQUJFV0VSVDoKKyAgICBXZW5uIGRpZSBVZWJlcmdhYmUgZ2VrbGFwcHQgaGF0LCAxLCBhbnNvbnN0ZW4gMC4KKworQkVNRVJLVU5HOgorICAgIERpZXNlIEZ1bmt0aW9uIGlzdCBkYW5uIHNpbm52b2xsLCB3ZW5uIG1hbiBkZW4gU3BpZWxlciBlaW4gT2JqZWt0CisgICAgd2VpdGVyZ2ViZW4gbGFzc2VuIHVuZCBzaWNoIG5pY2h0IHNlbGJzdCB1bSBkaWUgRmVobGVyYmVoYW5kbHVuZyBrdWVtbWVybgorICAgIG1vZWNodGUgLSB1bmQgZGEgdW56YWVobGlnZSB2ZXJzY2hpZWRlbmUgRGluZ2Ugc2NoaWVmZ2VoZW4ga29lbm5lbiB1bmQKKyAgICBtYW5jaGUgT2JqZWt0ZSBlaWdlbmUgRmVobGVybWVsZHVuZ2VuIGRlZmluaWVyZW4sIGVpZ2VudGxpY2ggaW1tZXIuCisKKyAgICBEaWUgRnVua3Rpb24gcHJ1ZWZ0IG5pY2h0LCBvYiBkZXIgU3BpZWxlci9OUEMgZGVyIE9iamVrdCB1ZWJlcmhhdXB0IGhhdCwKKyAgICBkYXMgbXVzcyBtYW4gZ2dmLiBzZWxic3QgZXJtaXR0ZWxuLgorCitTSUVIRSBBVUNIOgorICAgIG1vdmUoTCksIFBfR0lWRV9NU0csIGdpdmVfb2JqZWN0cyhMKSwgZ2l2ZV9ub3RpZnkoTCksCisgICAgUF9OT0lOU0VSVF9NU0csIFBfTk9MRUFWRV9NU0csIFBfVE9PX01BTllfTVNHLAorICAgIFBfVE9PX0hFQVZZX01TRywgUF9FTlZfVE9PX0hFQVZZX01TRywgUF9OT0RST1AKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogVGh1IEF1ZyAyOCAyMjoyMToxOSAyMDA4IGJ5IEFteW50aG9yCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9naXZlX25vdGlmeSBiL2RvYy9sZnVuL2dpdmVfbm90aWZ5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMGQ2OGUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9naXZlX25vdGlmeQpAQCAtMCwwICsxLDU5IEBACitnaXZlX25vdGlmeSgpCitGVU5LVElPTjoKKyAgICAgdm9pZCBnaXZlX25vdGlmeShvYmplY3Qgb2JqKTsKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL25wYy9wdXRfYW5kX2dldC5jCisKK0FSR1VNRU5URToKKyAgICAgb2JqCisgICAgICAgYW4gZGVuIE5QQyB1ZWJlcmdlYmVuZXMgT2JqZWt0CitSVWVDS0dBQkVXRVJUOgorICAgICBrZWluZXIKKworQkVTQ0hSRUlCVU5HOgorICAgICBEaWVzZSBGdW5rdGlvbiB3aXJkIGF1dG9tYXRpc2NoIGltbWVyIGRhbm4gYXVmZ2VydWZlbiwgd2VubiBlaW4KKyAgICAgTGViZXdlc2VuICh3ZWxjaGVzIGtlaW4gU3BpZWxlcmNoYXJha3RlciBpc3QpIGVpbiBPYmpla3QgdWViZXJnZWJlbgorICAgICBiZWtvbW10LiBEaWVzIG11c3MgamVkb2NoIHVlYmVyIGRpZSBGdW5rdGlvbmFsaXRhZXQgdm9uCisgICAgIHB1dF9hbmRfZ2V0LmMgZ2VzY2hlaGVuIHNlaW4sIGlubmVyaGFsYiB2b24gbW92ZSgpIHdpcmQgZGllIEZ1bmt0aW9uCisgICAgIG5pY2h0IGF1ZmdlcnVmZW4hCisKK0JFSVNQSUVMOgorICAgICBPZnRtYWxzIHdpbGwgbWFuIGluIFF1ZXN0cyBlcnJlaWNoZW4sIGRhc3MgZWluZW0gTlBDIGVpbiBiZXN0aW1tdGVzCisgICAgIEl0ZW0gYWxzIEJld2VpcyBkZXIgRXJmdWVsbHVuZyBlaW5lciBiZXN0aW1tdGVuIEF1ZmdhYmUgdWViZXJicmFjaHQKKyAgICAgd2lyZC4gRm9sZ2VuZGVybWFzc2Uga2FubiBkaWVzIHJlYWxpc2llcnQgd2VyZGVuOgorICAgICB2b2lkIGNyZWF0ZSgpIHsKKyAgICAgICA6OmNyZWF0ZSgpOworICAgICAgIC4uLgorICAgICAgIFNldFByb3AoUF9SRUpFQ1QsKHtSRUpFQ1RfR0lWRSwKKyAgICAgICAgIE5hbWUoV0VSKSsiIHNhZ3Q6IERhcyBicmF1Y2hlIGljaCBuaWNodCFcbiJ9KSk7CisgICAgICAgLi4uCisgICAgIH0KKworICAgICB2b2lkIHF1ZXN0X29rKG9iamVjdCBvYmopIHsgLi4uCisgICAgICAgLy8gVmVybmljaHR1bmcgZGVzIFF1ZXN0b2JqZWt0ZXMgdW5kIFF1ZXN0dGV4dGUKKyAgICAgICAvLyBRdWVzdGJlbG9obnVuZyB1bmQgUXVlc3RhbmVya2VubnVuZworICAgICB9CisKKyAgICAgdm9pZCBnaXZlX25vdGlmeShvYmplY3Qgb2JqKSB7CisgICAgICAgaWYob2JqLT5pZCgiXG5xdWVzdGl0ZW0iKSkgLy8gUXVlc3RpdGVtIGJla29tbWVuPworICAgICAgICAgcXVlc3Rfb2sob2JqKTsKKyAgICAgICBlbHNlCisgICAgICAgICA6OmdpdmVfbm90aWZ5KG9iaik7ICAvLyBQX1JFSkVDVCBzb2xsIHNvbnN0IGdyZWlmZW4KKyAgICAgfQorICAgICBEZXIgQXVmcnVmIHZvbiA6OmdpdmVfbm90aWZ5KCkgc3RlbGx0IHNpY2hlciwgZGFzcyBlaW4gT2JqZWt0CisgICAgIHp1cnVlY2tnZWdlYmVuIHdpcmQsIHNvZmVybiBlcyBuaWNodCBkYXMgZ2VzdWNodGUgaXN0LiBFcnJlaWNodCB3aXJkCisgICAgIGRpZXMgdWViZXIgUF9SRUpFQ1QgKHNpZWhlIEJlbWVya3VuZ2VuKS4KKworQkVNRVJLVU5HRU46CisgICAgIFNwZXppZWxsIGluIE5QQ3MgaXN0IGRpZXNlIEZ1bmt0aW9uIG5vcm1hbGVyd2Vpc2UgZGFmdWVyCisgICAgIHZlcmFudHdvcnRsaWNoLCBkYXNzIG1pdHRlbHMgZGVyIFByb3BlcnR5IFBfUkVKRUNUIGRpZSBBbm5haG1lIHZvbgorICAgICBPYmpla3RlbiB2ZXJ3ZWlnZXJ0IHdlcmRlbiBrYW5uLiBVZWJlcnNjaHJlaWJ0IG1hbiBzaWUsIHNvIHNvbGx0ZQorICAgICBtYW4gZ2VnZWJlbmVuZmFsbHMgZGFyYXVmIGFjaHRlbiwgZGFzcyBkaWVzZSBTdGFuZGFyZGZ1bmt0aW9uCisgICAgIGViZW5mYWxscyBhdWZnZXJ1ZmVuIHdpcmQuCisKK1NJRUhFIEFVQ0g6CisgICAgIFBfUkVKRUNULCBzaG93X25vdGlmeSgpLCAKKyAgICAgL3N0ZC9ucGMvcHV0X2FuZF9nZXQuYywgL3N0ZC9saXZpbmcvcHV0X2FuZF9nZXQuYworCisyMi4gT2t0b2JlciAyMDEzLCBBcmF0aG9ybi4KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL2dpdmVfb2JqIGIvZG9jL2xmdW4vZ2l2ZV9vYmoKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlmOGM5OQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL2dpdmVfb2JqCkBAIC0wLDAgKzEsMjcgQEAKK2dpdmVfb2JqKCkKKworRlVOS1RJT04KKyAgICBpbnQgZ2l2ZV9vYmoob2JqZWN0IG9iLCBvYmplY3Qgd2hlcmUpCisKK0RFRklOSUVSVCBJTjoKKworICAgIC9zdGQvbGl2aW5nL3B1dF9hbmRfZ2V0LmMKKworQVJHVU1FTlRFOgorCisgICAgb2IgICAgICBEYXMgT2JqZWt0LCBkYXMgYWJnZWdlYmVuIHdlcmRlbiBzb2xsLgorICAgIHdoZXJlICAgRGFzIExlYmV3ZXNlbiwgZGFzcyBkYXMgT2JqZWt0IGVyaGFlbHQuCisKK0JFU0NIUkVJQlVORzoKKworICAgIERhcyBMZWJld2VzZW4sIGluIGRlbSBkaWVzZSBGdW5rdGlvbiBhdWZnZXJ1ZmVuIHdlcmRlbiBzb2xsLCBnaWJ0CisgICAgZGVuIGFuZ2VnZWJlbmVuIEdlZ2Vuc3RhbmQgKG9iKSBhbiBkYXMgYW5nZWdlYmVuZSBMZWJld2VzZW4gKHdoZXJlKS4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICAxLCB3ZW5uIGRhcyBPYmpla3QgdWViZXJnZWJlbiB3dXJkZSBvZGVyIGRpZSBVZWJlcmdhYmUgbmljaHQgbW9lZ2xpY2ggd2FyLgorICAgIChpbiBkaWVzZW0gRmFsbCB3aXJkIGF1Y2ggZGlyZWt0IGVpbmUgVGV4dGF1c2dhYmUgYXVzZ2VnZWJlbikKKyAgICAwIHNvbnN0LCBpbiBkaWVzZW0gRmFsbCB3aXJkIGluIG5vdGlmeV9mYWlsIGVpbmUgcGFzc2VuZGUgQXVzZ2FiZSBwbGF6aWVydC4KKworU0lFSEUgQVVDSDoKKworICAgIHBpY2tfb2JqKCksIGRyb3Bfb2JqKCksIHB1dF9vYmooKSwgZmluZF9vYnMoKSwgL3N0ZC9saXZpbmcvcHV0X2FuZF9nZXQuYwpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vaGVhbF9zZWxmIGIvZG9jL2xmdW4vaGVhbF9zZWxmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNjA1NDcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9oZWFsX3NlbGYKQEAgLTAsMCArMSw0OSBAQAoraGVhbF9zZWxmKCkKKworRlVOS1RJT046CisgICAgdm9pZCBoZWFsX3NlbGYoaW50IHBvaW50cyk7CisKK0FSR1VNRU5URToKKyAgICBwb2ludHM6IERpZSBkZW0gTGViZXdlc2VuIHp1a29tbWVuZGUgSGVpbHVuZy4KKworQkVTQ0hSRUlCVU5HOgorICAgIERlbSBMZWJld2VzZW4gd2VyZGVuIHBvaW50cyBMZWJlbnMtIHVuZCBLb256ZW50cmF0aW9uc3B1bmt0ZSAKKyAgICBndXRnZXNjaHJpZWJlbiB1bmQgYXVmIGRpZSBha3R1ZWxsZW4gYWRkaWVydC4gRXMgd2VyZGVuIGFiZXIgbmljaHQKKyAgICBkaWUgbWF4aW1hbGVuIFdlcnRlIHVlYmVyc2Nocml0dGVuLgorCitSVUVDS0dBQkVXRVJUOgorICAgIEtlaW5lcgorCitCRUlTUElFTEU6CisgICAgCisgICAgQWRkQ21kKCJwZmx1ZWNrJmJlZXJlIiwicGZsdWVja2VfY21kIiwiV2FzIG1vZWNodGVzdCBEdSBwZmx1ZWNrZW4/Iik7CisKKyAgICBpbnQgcGZsdWVja2VfY21kKHN0cmluZyBzdHIpeworICAgICAgICB3cml0ZSgiRHUgcGZsdWVja3N0IGVpbmUgQmVlcmUsIGlzc3Qgc2llIHVuZCBmdWVobHN0IERpY2ggZ2xlaWNoICIKKyAgICAgICAgICAgICArInZpZWwgYmVzc2VyLlxuIik7CisgICAgICAgIHRoaXNfcGxheWVyKCktPmhlYWxfc2VsZigzMCk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIERlciBTcGllbGVyIGJla29tbXQgaGllciBwcm8gQmVlcmUgZGllIGVyIHBmbHVlY2t0IHVuZCBpc3N0IGplIDMwIExQL0tQCisgICAgenUgc2VpbmVuIG1vbWVudGFuZW4uCisKK0JFTUVSS1VOR0VOOiAKKyAgICBoZWFsX3NlbGYgd2lyZCBnZXJuZSBmdWVyIEhlaWxzdGVsbGVuIGluIEdlYmlldGVuIGdlbm9tbWVuLCBpbiBkZW5lbiBlaW4KKyAgICBTcGllbGVyIGRpZXNlIEhlaWx1bmcgYXVjaCB3aXJrbGljaCBicmF1Y2h0LiBEZW5ub2NoIGlzdCBkZXIgRWluc2F0eiB1bi0KKyAgICBiZWRpbmd0IG1pdCBkZXIgSGVpbHVuZ3NiYWxhbmNlIGFienVzcHJlY2hlbiB1bmQgZGFyYXVmIHp1IGFjaHRlbiwgZGFzcworICAgIHBybyByZXNldCgpIG51ciBlaW5lIGJlc3RpbW10ZSBBbnphaGwgYW4gSGVpbHVuZ2VuIGF1c2dlZ2ViZW4gd2VyZGVuLgorCisgICAgQmVpIEhlaWxzdGVsbGVuIHNvbGx0ZSBlaW5lIGV2dGwuIEhlaWx1bmcgZGVzIFNwaWVsZXJzIG1pdCBkZXIgZWlnZW5zCisgICAgZGFmdWVyIGVpbmdlcmljaHRldGVuIEZ1bmt0aW9uIGNoZWNrX2FuZF91cGRhdGVfdGltZWRfa2V5IHJlYWxpc2llcnQKKyAgICB3ZXJkZW4uCisKK1NJRUhFIEFVQ0g6CisgICAgVmVyd2FuZHQ6ICAgcmVzdG9yZV9zcGVsbF9wb2ludHMsIHJlc3RvcmVfaGl0X3BvaW50cywgYnVmZmVyX2hwCisJCWJ1ZmZlcl9zcCwgY2hlY2tfYW5kX3VwZGF0ZV90aW1lZF9rZXkKKyAgICBHZWdlbnBhcnRzOiBkb19kYW1hZ2UsIHJlZHVjZV9oaXRfcG9pbnRzLCByZWR1Y2Vfc3BlbGxfcG9pbnRzCisgICAgUHJvcHM6ICAgICAgUF9IUCwgUF9TUAorICAgIEtvbnplcHQ6ICAgIGhlaWx1bmcKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogMjcuMDUuMjAwNyBieSBFbm5veApkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vaGVhcnRfYmVhdCBiL2RvYy9sZnVuL2hlYXJ0X2JlYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEzMTRiZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL2hlYXJ0X2JlYXQKQEAgLTAsMCArMSw0MiBAQAoraGVhcnRfYmVhdCgpCisKK0ZVTktUSU9OOgorICAgICBwcm90ZWN0ZWQgdm9pZCBoZWFydF9iZWF0KCk7CisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC9saXZpbmcvbGlmZS5jCisgICAgIC9zdGQvbGl2aW5nL2NvbWJhdC5jCisgICAgIHVuZCBhbmRlcmVuLi4uCisgICAgIGthbm4gYXVjaCBpbiBiZWxpZWJpZ2VuIE9iamVrdGVuIHNlbGJzdCBkZWZpbmllcnQgd2VyZGVuLgorCitCRVNDSFJFSUJVTkc6CisgICAgIERpZXNlIEZ1bmt0aW9uIHdpcmQgYWxsZSB6d2VpIFNla3VuZGVuIHZvbSBHYW1lRHJpdmVyIGF1ZmdlcnVmZW4uIFNpZQorICAgICByZWdlbHQgaW4gZGVyIE1HLU11ZExpYiBkYXMgSGVpbGVuIHZvbiBTcGllbGVybiB1bmQgTW9uc3Rlcm4sIGRlbgorICAgICBBYmxhdWYgdm9uIEthbXBmcnVuZGVuLCBkaWUgVmVyZGF1dW5nIGV0Yy4KKworICAgICBEYSBoZWFydF9iZWF0KCkgemllbWxpY2ggdmllbGUgUmVzc291cmNlbiBkZXMgR2FtZURyaXZlcnMgdmVyYnJhZXQsCisgICAgIHNvbGx0ZSBtYW4gT2JqZWt0ZSBtaXQgaGVhcnRfYmVhdCgpIG51ciBzbyBzZWx0ZW4gd2llIG1vZWdsaWNoCisgICAgIGJlbnV0emVuISBVbmQgc2VsYnN0IGRhbm4gc29sbHRlIGRlciBoZWFydF9iZWF0KCkgbmljaHQgZGllIGdhbnplIFplaXQKKyAgICAgdWViZXIgbGF1ZmVuLCBzb25kZXJuIHNpY2ggc28gYmFsZCB3aWUgbW9lZ2xpY2ggYWJzY2hhbHRlbi4KKworICAgICBEYXMgRWluLSB1bmQgQXVzc2NoYWx0ZW4gZGVzIGhlYXJ0X2JlYXQoKXMgZXJmb2xndCBtaXQKKyAgICAgc2V0X2hlYXJ0X2JlYXQoKS4KKworQkVNRVJLVU5HRU46CisgICAgIDEuIFRldWVyLCB0ZXVlciwgdGV1ZXIhCisgICAgIDIuIFNvbGwgZXVlciBWaWVjaCBwcm8gImVjaHRlbSIgSGVhcnRiZWF0IG1laHJlcmUgS2FtcGZydW5kZW4gaGFiZW4sCisgICAgICAgIGJlbnV0enQgZGFmdWVyIFNBX1NQRUVEIHVuZCBydWZ0IGF1ZiBnYXIga2VpbmVuIEZhbGwgbWVocmZhY2ggCisgICAgICAgIDo6aGVhcnRfYmVhdCgpIGF1Zi4gQWxzbyBfTklDSFRfCisgICAgICAgIHZvaWQgaGVhcnRfYmVhdCgpIHsKKyAgICAgICAgICAgIDo6aGVhcnRfYmVhdCgpOworICAgICAgICAgICAgOjpoZWFydF9iZWF0KCk7IH0KKyAgICAgICAgc29uZGVybjoKKyAgICAgICAgU2V0UHJvcChQX1NLSUxMX0FUVFJJQlVURV9PRkZTRVRTLCAoW1NBX1NQRUVEOiAyMDBdKSApOworCitTSUVIRSBBVUNIOgorICAgICBFZnVuczogICAgIHNldF9oZWFydF9iZWF0KCksIGFic29sdXRlX2hiX2NvdW50KCksIHNldF9uZXh0X3Jlc2V0KCkKKyAgICAgRmVobGVyOiAgICBtYWtlX2ltbW9ydGFsKEwpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzIyLjMuMjAwOCwgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9pZCBiL2RvYy9sZnVuL2lkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZjVhZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9pZApAQCAtMCwwICsxLDc2IEBACitpZCgpCisKK0ZVTktUSU9OOgorICAgICB2YXJhcmdzIGludCBpZChzdHJpbmcgc3RyLCBpbnQgbHZsKTsKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL3RoaW5nL2Rlc2NyaXB0aW9uLmMKKyAgICAgL3N0ZC9wbGF5ZXIvYmFzZS5jCisKK0FSR1VNRU5URToKKyAgICAgc3RyaW5nIHN0cgorICAgICAgICAgIFN0cmluZywgYXVmIGRlbiBnZXRlc3RldCB3ZXJkZW4gc29sbC4KKyAgICAgaW50IGx2bAorICAgICAgICAgIEluIC9zdGQvcGxheWVyL2Jhc2UuYyBiZW51dHp0LiBXZW5uIGRlciBTcGllbGVyIHVuc2ljaHRiYXIgaXN0CisgICAgICAgICAgdW5kIGx2bCBrbGVpbmVyIGlzdCBhbHMgc2VpbiBMZXZlbCwgd2lyZCAwIHp1cnVlY2tnZWdlYmVuLgorCitCRVNDSFJFSUJVTkc6CisgICAgIEVzIHdpcmQgZ2VwcnVlZnQsIG9iIHNpY2ggZGFzIE9iamVrdCBtaXQgc3RyIGFuc3ByZWNoZW4gbGFlc3N0LiBEYXp1CisgICAgIHdpcmQgc3RyIG1pdCBkZW0gSW5oYWx0IGRlciBQcm9wZXJ0eSBQX0lEUyB2ZXJnbGljaGVuLiBGYWxscworICAgICBQX0FESkVDVElWRVMgZ2VzZXR6dCBpc3QsIHdlcmRlbiBhdWNoIGFsbGUgQWRqZWt0aXZrb21iaW5hdGlvbmVuIG1pdAorICAgICBkZW4gQmV6ZWljaG5lcm4gZ2VwcnVlZnQuCisKKyAgICAgQmVzb25kZXJlIEJlZGV1dHVuZyBoYXQgZGllc2UgRnVua3Rpb24gYmVpIE1lbmdlbm9iamVrdGVuOiBBbmhhbmQgdm9uCisgICAgIHN0ciB3aXJkIHZlcm1lcmt0LCB3ZWxjaGUgTWVuZ2UgZGVzIE9iamVrdGVzIGFuZ2VzcHJvY2hlbiB3aXJkLiBFcworICAgICB3ZXJkZW4gZGFiZWkgbWVocmVyZSBGYWVsbGUgdW50ZXJzY2hpZWRlbjoKKyAgICAgbyBzdHIgaXN0IGVpbmVyIGRlciBtaXQgQWRkSWQoKSBhbmdlZ2ViZW5lciBCZXplaWNobmVyLiBJbiBkaWVzZW0KKyAgICAgICBGYWxsIGlzdCBkaWUgYW5nZXNwcm9jaGVuZSBNZW5nZSBkaWUgR2VzYW10bWVuZ2UuCisgICAgIG8gc3RyIGlzdCBlaW5lciBkZXIgbWl0IEFkZFNpbmd1bGFySWQoKSBhbmdlZ2ViZW5lbiBCZXplaWNobmVyLiBEaWUKKyAgICAgICBhbmdlc3Byb2NoZW5lIE1lbmdlIGlzdCBpbiBkaWVzZW0gRmFsbCAxLgorICAgICBvIHN0ciBpc3QgZWluZXIgZGVyIG1pdCBBZGRQbHVyYWxJZCgpIGFuZ2VnZWJlbmVuIEJlemVpY2huZXIuIERpZQorICAgICAgIGFuZ2VzcHJvY2hlbmUgTWVuZ2UgaXN0IGluIGRpZXNlbSBGYWxsIC4gZGllIEdlc2FtdG1lbmdlLgorICAgICBvIEhhdCBzdHIgZGllIEZvcm0gIjxuPiA8aWQ+Iiwgd29iZWkgPG4+PTEgdW5kIDxpZD4gZWluZSBTaW5ndWxhcklkCisgICAgICAgb2RlciAxIDwgPG4+IDw9IGRlciBHZXNhbXRtZW5nZSB1bmQgPGlkPiBlaW5lIFBsdXJhbElkLCBzbyBpc3QgZGllCisgICAgICAgYW5nZXNwcm9jaGVuZSBNZW5nZSA9IDxuPi4KKyAgICAgV2llIGdlc2FndCwgZ2lsdCBkaWVzIGVpbnppZyB1bmQgYWxsZWluIGJlaSBNZW5nZW5vYmpla3RlbiEKKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgMSwgd2VubiBzaWNoIGRhcyBPYmpla3Qgdm9uIHN0ciBhbmdlc3Byb2NoZW4gZnVlaGx0LCBhbnNvbnN0ZW4gMC4KKworQkVJU1BJRUxFOgorICAgICBBbmdlbm9tbWVuLCBlaW4gT2JqZWt0IGhhYmUgZm9sZ2VuZGUgQmV6ZWljaG5lcjoKKworICAgICBBZGRJZCggIm11cm1lbCIgKTsKKyAgICAgQWRkQWRqZWN0aXZlKCAicnVuZGUiICk7CisKKyAgICAgRGFubiBsaWVmZXJuIGRpZSBhbmdlZ2ViZW5lbiBpZCgpLUF1ZnJ1ZmUgZm9sZ2VuZGUgRXJnZWJuaXNzZToKKworICAgICBpZCggIm11cm1lbCIgKTsgICAgICAgICA9PiAxCisgICAgIGlkKCAicnVuZGUgbXVybWVsIiApOyAgID0+IDEKKyAgICAgaWQoICJrbGVpbmUgbXVybWVsIiApOyAgPT4gMAorICAgICBpZCggInJ1bmRlciBiYWxsIiApOyAgICA9PiAwCisgICAgIGlkKCAicnVuZGUgbXVybWVsIDIiICk7ID0+IDEsIHdlbm4gZGllcyBkaWUgendlaXRlIE11cm1lbCBpbiBkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xlaWNoZW4gVW1nZWJ1bmcgaXN0LCBhbnNvbnN0ZW4gMAorCisgICAgIEJlaSBlaW5lbSBIYXVmZW4gdm9uIDEwMCBNdWVuemVuIGhhZXR0ZSBtYW4gekIuOgorCisgICAgIEFkZElkKCAiZ2VsZCIgKTsKKyAgICAgQWRkU2luZ3VsYXJJZCggIm11ZW56ZSIgKTsKKyAgICAgQWRkUGx1cmFsSWQoICJtdWVuemVuIiApOworCisgICAgIE5hY2ggZnVlaGxlbiBzaWNoIG5hY2ggZGVuIGZvbGdlbmRlbiBpZCgpLUF1ZnJ1ZmVuIGZvbGdlbmRlIEFuemFobGVuCisgICAgIGFuZ2VzcHJvY2hlbjoKKworICAgICBpZCggImdlbGQiICk7ICAgICAgID0+IDEwMCBNdWVuemVuCisgICAgIGlkKCAibXVlbnplIiApOyAgICAgPT4gMSBNdWVuemUKKyAgICAgaWQoICJtdWVuemVuIiApOyAgICA9PiAxMDAgTXVlbnplbgorICAgICBpZCggIjEgbXVlbnplIiApOyAgID0+IDEgTXVlbnplCisgICAgIGlkKCAiNDIgbXVlbnplbiIgKTsgPT4gNDIgTXVlbnplbgorCisgICAgIGlkKCkgbGllZmVydCBpbiBhbGwgZGllc2VuIEZhZWxsZW4gMSB6dXJ1ZWNrLgorCitTSUVIRSBBVUNIOgorICAgICBBZGRJZCgpLCBBZGRBZGplY3RpdmUoKSwgQWRkU2luZ3VsYXJJZCgpLCBBZGRQbHVyYWxJZCgpLCBwcmVzZW50KCksCisgICAgIG1hdGNoX2lkcygpLCAvc3RkL3RoaW5nL2Rlc2NyaXB0aW9uLmMsIC9zdGQvdW5pdC5jCisKKzYuIFNlcCAyMDEyIEdsb2luc29uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vaW5pdCBiL2RvYy9sZnVuL2luaXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlkMGNhZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL2luaXQKQEAgLTAsMCArMSw2NSBAQAoraW5pdCgpCisKK0ZVTktUSU9OOgorCXZvaWQgaW5pdCgpOworCitERUZJTklFUlQgSU46CisJL3N0ZC9yb29tL2Rlc2NyaXB0aW9uLmMKKworQVJHVU1FTlRFOgorCWtlaW5lCisKK0JFU0NIUkVJQlVORzoKKwlpbml0KCkgd2lyZCBpbW1lciBkYW5uIGF1ZmdlcnVmZW4sIHdlbm4gZWluIGxlYmVuZGVzIE9iamVrdCBpbiBkaWUKKwlOYWVoZSBhbmRlcmVyIE9iamVrdGUgYmV3ZWd0IHdpcmQgb2RlciBlaW4gbmljaHQgbGViZW5kaWdlcyBPYmpla3QKKwlpbiBkaWUgTmFlaGUgdm9uIExlYmV3ZXNlbiBnZWxhbmd0LiBpbml0KCkgd2lyZCBkYWJlaSBpbiBhbGxlbgorCU9iamVrdGVuIGF1ZmdlcnVmZW4sIGJlaSBkZW5lbiBlcyBub3R3ZW5kaWcgaXN0LgorCisJRGVyIEhhdXB0endlY2sgZGllc2VyIEZ1bmt0aW9uIGJlc3RlaHQgZGFyaW4sIGRlbiBPYmpla3RlbgorCXVudGVyZWluYW5kZXIgaWhyZSBqZXdlaWxpZ2VuIEJlZmVobGUgenVnYWVuZ2xpY2ggenUgbWFjaGVuLgorCVdhZWhyZW5kIGRpZXMgaW4gYW5kZXJlbiBNdWRMaWJzIGR1cmNoIGVpbmUgUmVpaGUgdm9uCisJYWRkX2FjdGlvbigpLUF1ZnJ1ZmVuIGltIFJ1bXBmIHZvbiBpbml0KCkgZ2VzY2hhaCwgZ2VzY2hpZWh0IGRpZXMgaW4KKwlkZXIgTUctTXVkTGliIGJlaSBPYmpla3RlbiwgZGllIC9zdGQvdGhpbmcvY29tbWFuZHMuYyBlcmJlbgorCSAoZGFzIHNpbmQgekIuIGFsbGUgU3RhbmRhcmRvYmpla3RlKSBxdWFzaSBhdXRvbWF0aXNjaAorCSAoZG9ydCB3ZXJkZW4gZGllIEJlZmVobGUgZGFubiBwZXIgQWRkQ21kKCkgaW0gY3JlYXRlKCkgYW5nZW1lbGRldCwKKwkgIG1hbiBzcGFydCBzaWNoIGRpZSBJbXBsZW1lbnRpZXJ1bmcgdm9uIGluaXQoKSB1bmQgZGVtIE11ZCBzb21pdAorCSAgU3BlaWNoZXIpLiBEZXIgYW5kZXJlIFdlZyBpc3QgYWJlciBuYXR1ZXJsaWNoIGltbWVyIG5vY2ggbW9lZ2xpY2guCisKK1JVZUNLR0FCRVdFUlQ6CisJa2VpbmVyCisKK0JFTUVSS1VOR0VOOgorCURlciBBYmxhdWYgZGVyIGluaXQoKS1LZXR0ZSBpc3Qgd2llIGZvbGd0OgorCW8gSXN0IGRhcyBPYmpla3QgWCwgd2VsY2hlcyBpbnMgWmllbG9iamVrdCBEIGJld2VndCB3dXJkZSwgZWluCisJICBMZWJld2VzZW4sIHNvIHdpcmQgaW4gRCBpbml0KCkgYXVmZ2VydWZlbiwgd29iZWkgdGhpc19wbGF5ZXIoKSBhdWYKKwkgIFggZ2VzZXR6dCBpc3QuCisJbyBEYW5uIHdpcmQgZnVlciBqZWRlcyBPYmpla3QgQyBpbiBEIGZvbGdlbmRlcyBhdXNnZWZ1ZWhydDoKKwkgICsgSXN0IEMgZWluIExlYmV3ZXNlbiwgZGFubiB3aXJkIGluaXQoKSBpbiBYIGF1ZmdlcnVmZW4sIHdvYmVpCisJICAgIHRoaXNfcGxheWVyKCkgYXVmIEMgZ2VzZXR6dCBpc3QuCisJICArIElzdCBYIGVpbiBMZWJld2VzZW4sIGRhbm4gd2lyZCBpbml0KCkgaW4gQyBhdWZnZXJ1ZmVuLCB3b2JlaQorCSAgdGhpc19wbGF5ZXIoKSBhdWYgWCBnZXNldHp0IGlzdC4KKwlvIFNjaGxpZXNzbGljaCB3aXJkIGluIGRlbSBGYWxsLCBkYXNzIEQgbGViZW5kaWcgaXN0LCBpbiBYIGluaXQoKQorCSAgYXVmZ2VydWZlbiwgd29iZWkgdGhpc19wbGF5ZXIoKSBhdWYgRCBnZXNldHp0IGlzdC4KKworQkVJU1BJRUxFOgorCUQgc2VpIGVpbiBSYXVtLCBpbiBkZW0gc2ljaCBkYXMgTGViZXdlc2VuIEwxIHNvd2llIGRpZSBHZWdlbnN0YWVuZGUKKwlOMSB1bmQgTjIgYmVmaW5kZW4uCisJQmV0cml0dCBlaW4gU3BpZWxlciBYIGRpZXNlbiBSYXVtLCBzbyB3ZXJkZW4gZm9sZ2VuZGUgaW5pdCgpcworCWF1ZmdlcnVmZW46CisKKwkgIEQtPmluaXQoKTsgIC8vIHRoaXNfcGxheWVyKCkgPT0gWAorCSAgWC0+aW5pdCgpOyAgLy8gdGhpc19wbGF5ZXIoKSA9PSBMMQorCSAgTDEtPmluaXQoKTsgLy8gdGhpc19wbGF5ZXIoKSA9PSBYCisJICBOMS0+aW5pdCgpOyAvLyB0aGlzX3BsYXllcigpID09IFgKKwkgIE4yLT5pbml0KCk7IC8vIHRoaXNfcGxheWVyKCkgPT0gWAorCisJR2VsYW5ndCBkYWdlZ2VuIGVpbiBuaWNodGxlYmVuZGlnZXMgT2JqZWt0IG5hY2ggRCwgc28gc2llaHQgZGFzIEdhbnplCisJd2llIGZvbGd0IGF1czoKKworCSAgWC0+aW5pdCgpOyAgICAvLyB0aGlzX3BsYXllcigpID09IEwxCisKK1NJRUhFIEFVQ0g6CisJZXhpdCgpLCBBZGRDbWQoKSwgYWRkX2FjdGlvbigpLAorICBOb3RpZnlJbnNlcnQoKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogMDQuMDguMjAwNywgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vaW5zZXJ0X3NlbnNpdGl2ZV9pbnYgYi9kb2MvbGZ1bi9pbnNlcnRfc2Vuc2l0aXZlX2ludgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjU0ZGY0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vaW5zZXJ0X3NlbnNpdGl2ZV9pbnYKQEAgLTAsMCArMSwyMSBAQAoraW5zZXJ0X3NlbnNpdGl2ZV9pbnYKK0ZVTktUSU9OOgorICAgICB2b2lkIGluc2VydF9zZW5zaXRpdmVfaW52KG9iamVjdCBvYiwgc3RyaW5nIGtleSwKKwkJCSAgICAgICBpbnQgdGhyZXNob2xkLCBtaXhlZCAqb3B0KQorCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvY29udGFpbmVyL2ludmVudG9yeS5jCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGllc2UgRnVua3Rpb24gc3VjaHQsIG9iIGJlaW0gSGluenVmdWVnZW4gZWluZXMgc2Vuc2l0aXZlbiBPYmpla3RzCisgICAgIHNjaG9uIGVpbiBPYmpla3QgZGEgaXN0LCBkYXNzIGRpZXNlcyBhdXNsb2VzdC4KKworU0lFSEUgQVVDSDoKKyAgICAgUF9TRU5TSVRJVkUKKyAgICAgSW5zZXJ0U2Vuc2l0aXZlT2JqZWN0LCBSZW1vdmVTZW5zaXRpdmVPYmplY3QKKyAgICAgaW5zZXJ0X3NlbnNpdGl2ZV9pbnZfdHJpZ2dlcgorICAgICBQX1NFTlNJVElWRV9BVFRBQ0ssIFBfU0VOU0lUSVZFX0lOVkVOVE9SWSwKKyAgICAgUF9TRU5TSVRJVkVfSU5WRU5UT1JZX1RSSUdHRVIKKyAgICAgQ2hlY2tTZW5zaXRpdmVBdHRhY2sKKworMjguSmFuLjIwMDEsIEdsb2luc29uQE1HCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9pbnNlcnRfc2Vuc2l0aXZlX2ludl90cmlnZ2VyIGIvZG9jL2xmdW4vaW5zZXJ0X3NlbnNpdGl2ZV9pbnZfdHJpZ2dlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjZmMGY1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vaW5zZXJ0X3NlbnNpdGl2ZV9pbnZfdHJpZ2dlcgpAQCAtMCwwICsxLDIxIEBACitpbnNlcnRfc2Vuc2l0aXZlX2ludl90cmlnZ2VyCitGVU5LVElPTjoKKyAgICAgdm9pZCBpbnNlcnRfc2Vuc2l0aXZlX2ludl90cmlnZ2VyKG9iamVjdCBvYiwgc3RyaW5nIGtleSwKKwkJCQkgICAgICAgaW50IHRocmVzaG9sZCwgbWl4ZWQgKm9wdCkKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL2NvbnRhaW5lci9pbnZlbnRvcnkuYworCitCRVNDSFJFSUJVTkc6CisgICAgIERpZXNlIEZ1bmt0aW9uIHN1Y2h0LCBvYiBlaW4gc2Vuc2l0aXZlcyBPYmpla3QgaW0gSW52ZW50b3J5IGlzdCwKKyAgICAgZGFzIGR1cmNoIGRpZXNlcyAoc29lYmVuIGVpbmdlZnVlZ3RlKSBPYmpla3QgYXVzZ2Vsb2VzdCB3aXJkLgorCitTSUVIRSBBVUNIOgorICAgICBQX1NFTlNJVElWRQorICAgICBJbnNlcnRTZW5zaXRpdmVPYmplY3QsIFJlbW92ZVNlbnNpdGl2ZU9iamVjdAorICAgICBpbnNlcnRfc2Vuc2l0aXZlX2ludgorICAgICBQX1NFTlNJVElWRV9BVFRBQ0ssIFBfU0VOU0lUSVZFX0lOVkVOVE9SWSwKKyAgICAgUF9TRU5TSVRJVkVfSU5WRU5UT1JZX1RSSUdHRVIKKyAgICAgQ2hlY2tTZW5zaXRpdmVBdHRhY2sKKworMjguSmFuLjIwMDEsIEdsb2luc29uQE1HCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9pbnRfbG9uZyBiL2RvYy9sZnVuL2ludF9sb25nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MTNlODcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9pbnRfbG9uZwpAQCAtMCwwICsxLDY0IEBACitpbnRfbG9uZygpCitGVU5LVElPTjoKKyAgICAgdmFyYXJncyBzdHJpbmcgaW50X2xvbmcobWl4ZWQgdmlld2VyLCBtaXhlZCB2aWV3cG9pbnQsIGludCBmbGFncykKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL3Jvb20vZGVzY3JpcHRpb24uYworCitBUkdVTUVOVEU6CisgICAgIG1peGVkIHZpZXdlcgktIGRlciBCZXRyYWNodGVyIGRlcyBSYXVtZXMKKyAgICAgbWl4ZWQgdmlld3BvaW50CS0gMC9PYmpla3QvQXJyYXkgZGVyL2RpZSBBdXNnYW5nc3B1bmt0KGUpIGRlcworCQkJICBCZXRyYWNodGVucyAodW5kIGRhbWl0IG5pY2h0IHNpY2h0YmFyISkKKyAgICAgaW50IGZsYWdzCQktIE1vZGlmaWthdG9yZW4gZnVlciBkaWUgQW56ZWlnZQorCQkJICAoc2llaGUgIm1hbiBtYWtlX2ludmxpc3QiLCB3aXJkIG1pdCAzIHZlclVORGV0ISkKKworQkVTQ0hSRUlCVU5HOgorICAgICBFcyB3aXJkIGRpZSBCZXNjaHJlaWJ1bmcgZGVzIFJhdW1pbm5lcmVuIGVyc3RlbGx0LiBEYWJlaSB3aXJkIGRpZQorICAgICBMYW5nYmVzY2hyZWlidW5nIGRlcyBSYXVtZXMsIGRpZSBlbnRoYWx0ZW5lbiBPYmpla3RlIChleGtsdXNpdmUKKyAgICAgYWxsZXIgdmlld3BvaW50cyAobm9ybWFsZXJ3ZWlzZSBudXIgZGVyIEJldHJhY2h0ZXIpKSB1bmQgQXVzZ2FlbmdlLAorICAgICB3ZW5uIHZvbSBWaWV3ZXIgZWluZ2VzY2hhbHRldCBkYXJnZXN0ZWxsdC4KKyAgICAgRmFsbHMgZGVyIFJhdW0gaW5uZXJoYWxiIGVpbmVzIGFuZGVyZW4gUmF1bWVzIGxpZWd0IHVuZCBzZWxic3QKKyAgICAgdHJhbnNwYXJlbnQgaXN0LCB3aWUgenVzYWV0emxpY2ggZGllIEt1cnpiZXNjaHJlaWJ1bmcgZGVzIEF1c3Nlbi0KKyAgICAgcmF1bWVzIGFuZ2V6ZWlndC4KKworICAgICBJc3QgVmlld2VyIGVpbiBNYWdpZXIgbWl0IGVpbmdlc2NoYWx0ZXRlbSBNYWdpZXJtb2R1cywgc28gd2lyZCBkZXIKKyAgICAgQmVzY2hyZWlidW5nIGRlciBEYXRlaW5hbWUgZGVzIFJhdW1lcyB2b3Jhbmdlc3RlbGx0LgorCitSVWVDS0dBQkVXRVJUOgorICAgICBEaWUgTGFuZ2Jlc2NocmVpYnVuZyBkZXMgUmF1bWVzIHZvbiBpbm5lbi4KKworQkVNRVJLVU5HRU46CisgICAgIERpZSBUcmVubnVuZyB2b24gdmlld2VyIHVuZCB2aWV3cG9pbnQgaGF0IGR1cmNoYXVzIGlocmVuIFNpbm4uIFNvIGlzdAorICAgICBlcyB6dW0gQmVpc3BpZWwgbW9lZ2xpY2gsIGVpbmVuIFJhdW0gIm1pdCBkZW4gQXVnZW4gZWluZXMgQW5kZXJlbiIgenUKKyAgICAgYmV0cmFjaHRlbi4gRGFiZWkgc2FlaGUgbWFuIHNpY2ggc2VsYnN0LCB3ZW5uIG1hbiBpbSBSYXVtIHdhZXJlLgorCitCRUlTUElFTEU6CisgICAgIC8vIGluIGRpZXNlbSBSYXVtIHNpZWh0IG1hbiBrZWluZSBNaXRzcGllbGVyIGltICJzY2hhdSIgb2RlciBiZWltCisgICAgIC8vIEJldHJldGVuICh2aWVsbGVpY2h0IGlzdCBlcyB6dSBuZWJsaWcpCisgICAgIC8vIGRhenUgd2VyZGVuIGVpbmZhY2ggYWxsZSBJbnRlcmFjdGl2ZXMgenUgZGVuIHZpZXdwb2ludHMgYWRkaWVydAorICAgICBzdHJpbmcgaW50X2xvbmcob2JqZWN0IHZpZXdlciwgbWl4ZWQgdmlld3BvaW50cywgaW50IGZsYWdzKSB7CisgICAgICBpZighcG9pbnRlcnAodmlld3BvaW50cykpIHZpZXdwb2ludHM9KHt2aWV3cG9pbnRzfSk7CisgICAgICByZXR1cm4gOjppbnRfbG9uZygmdmlld2VyLAorCQkJdmlld3BvaW50cysKKwkJCWZpbHRlcihhbGxfaW52ZW50b3J5KHRoaXNfb2JqZWN0KCkpLAorCQkJCSAgICAgIydpbnRlcmFjdGl2ZSksCisJCQkmZmxhZ3MpOworICAgICB9CisKKyAgICAgc3RyaW5nIGludF9zaG9ydChvYmplY3Qgdmlld2VyLCBtaXhlZCB2aWV3cG9pbnRzKSB7CisgICAgICBpZighcG9pbnRlcnAodmlld3BvaW50cykpIHZpZXdwb2ludHM9KHt2aWV3cG9pbnRzfSk7CisgICAgICByZXR1cm4gOjppbnRfc2hvcnQoJnZpZXdlciwKKwkJCSB2aWV3cG9pbnRzKworCQkJIGZpbHRlcihhbGxfaW52ZW50b3J5KHRoaXNfb2JqZWN0KCkpLAorCQkJCSAgICAgICMnaW50ZXJhY3RpdmUpKTsKKyAgICAgfQorCitTSUVIRSBBVUNIOgorICAgICBBZWhubGljaGVzOglpbnRfc2hvcnQoKQorICAgICBQcm9wZXJ0aWVzOglQX0lOVF9MT05HLCBQX1NIT1JUCisJCQlQX0hJREVfRVhJVFMsIFBfU0hPV19FWElUUworCQkJUF9UUkFOU1BBUkVOVAorICAgICBLb21tYW5kb2tldHRlOgltYWtlX2ludmxpc3QoKSwgc2hvcnQoKQorICAgICBTb25zdGlnZXM6CQlQX1JFRkVSRU5DRV9PQkpFQ1QsIFBfV0FOVFNfVE9fTEVBUk4KKworMTEuIE1haSAyMDA0IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9pbnRfc2hvcnQgYi9kb2MvbGZ1bi9pbnRfc2hvcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRhOGQzYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL2ludF9zaG9ydApAQCAtMCwwICsxLDU4IEBACitpbnRfc2hvcnQoKQorRlVOS1RJT046CisgICAgIHN0cmluZyBpbnRfc2hvcnQobWl4ZWQgdmlld2VyLCBtaXhlZCB2aWV3cG9pbnQpOworCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvcm9vbS9kZXNjcmlwdGlvbi5jCisKK0FSR1VNRU5URToKKyAgICAgbWl4ZWQgdmlld2VyCS0gZGVyIEJldHJhY2h0ZXIgZGVzIFJhdW1lcworICAgICBtaXhlZCB2aWV3cG9pbnQJLSAwL09iamVrdC9BcnJheSBkZXIvZGllIEF1c2dhbmdzcHVua3QoZSkgZGVzCisJCQkgIEJldHJhY2h0ZW5zICh1bmQgZGFtaXQgbmljaHQgc2ljaHRiYXIhKQorCitCRVNDSFJFSUJVTkc6CisgICAgIEVzIHdpcmQgZWluZSBrdXJ6ZSAgQmVzY2hyZWlidW5nIGRlcyBSYXVtaW5uZXJlbiBlcnN0ZWxsdC4gRGFiZWkgd2lyZAorICAgICBkaWUgS3VyemJlc2NocmVpYnVuZyBkZXMgUmF1bWVzLCBkaWUgZW50aGFsdGVuZW4gT2JqZWt0ZSAoZXhrbHVzaXZlCisgICAgIGFsbGVyIHZpZXdwb2ludHMgKG5vcm1hbGVyd2Vpc2UgbnVyIGRlciBCZXRyYWNodGVyKSkgdW5kIEF1c2dhZW5nZSwKKyAgICAgd2VubiB2b20gVmlld2VyIGVpbmdlc2NoYWx0ZXQgZGFyZ2VzdGVsbHQuCisKKyAgICAgSXN0IFZpZXdlciBlaW4gTWFnaWVyIG1pdCBlaW5nZXNjaGFsdGV0ZW0gTWFnaWVybW9kdXMsIHNvIHdpcmQgZGVyCisgICAgIEJlc2NocmVpYnVuZyBkZXIgRGF0ZWluYW1lIGRlcyBSYXVtZXMgdm9yYW5nZXN0ZWxsdC4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgRGllIEt1cnpiZXNjaHJlaWJ1bmcgZGVzIFJhdW1lcyB2b24gaW5uZW4uCisKK0JFTUVSS1VOR0VOOgorICAgICBEaWUgVHJlbm51bmcgdm9uIHZpZXdlciB1bmQgdmlld3BvaW50IGhhdCBkdXJjaGF1cyBpaHJlbiBTaW5uLiBTbyBpc3QKKyAgICAgZXMgenVtIEJlaXNwaWVsIG1vZWdsaWNoLCBlaW5lbiBSYXVtICJtaXQgZGVuIEF1Z2VuIGVpbmVzIEFuZGVyZW4iIHp1CisgICAgIGJldHJhY2h0ZW4uIERhYmVpIHNhZWhlIG1hbiBzaWNoIHNlbGJzdCwgd2VubiBtYW4gaW0gUmF1bSB3YWVyZS4KKworQkVJU1BJRUxFOgorICAgICAvLyBpbiBkaWVzZW0gUmF1bSBzaWVodCBtYW4ga2VpbmUgTWl0c3BpZWxlciBpbSAic2NoYXUiIG9kZXIgYmVpbQorICAgICAvLyBCZXRyZXRlbiAodmllbGxlaWNodCBpc3QgZXMgenUgbmVibGlnKQorICAgICAvLyBkYXp1IHdlcmRlbiBlaW5mYWNoIGFsbGUgSW50ZXJhY3RpdmVzIHp1IGRlbiB2aWV3cG9pbnRzIGFkZGllcnQKKyAgICAgc3RyaW5nIGludF9sb25nKG9iamVjdCB2aWV3ZXIsIG1peGVkIHZpZXdwb2ludHMsIGludCBmbGFncykgeworICAgICAgaWYoIXBvaW50ZXJwKHZpZXdwb2ludHMpKSB2aWV3cG9pbnRzPSh7dmlld3BvaW50c30pOworICAgICAgcmV0dXJuIDo6aW50X2xvbmcoJnZpZXdlciwKKwkJCXZpZXdwb2ludHMrCisJCQlmaWx0ZXIoYWxsX2ludmVudG9yeSh0aGlzX29iamVjdCgpKSwKKwkJCQkgICAgICMnaW50ZXJhY3RpdmUpLAorCQkJJmZsYWdzKTsKKyAgICAgfQorCisgICAgIHN0cmluZyBpbnRfc2hvcnQob2JqZWN0IHZpZXdlciwgbWl4ZWQgdmlld3BvaW50cykgeworICAgICAgaWYoIXBvaW50ZXJwKHZpZXdwb2ludHMpKSB2aWV3cG9pbnRzPSh7dmlld3BvaW50c30pOworICAgICAgcmV0dXJuIDo6aW50X3Nob3J0KCZ2aWV3ZXIsCisJCQkgdmlld3BvaW50cysKKwkJCSBmaWx0ZXIoYWxsX2ludmVudG9yeSh0aGlzX29iamVjdCgpKSwKKwkJCQkgICAgICAjJ2ludGVyYWN0aXZlKSk7CisgICAgIH0KKworU0lFSEUgQVVDSDoKKyAgICAgQWVobmxpY2hlczoJaW50X2xvbmcoKQorICAgICBQcm9wZXJ0aWVzOglQX0lOVF9TSE9SVCwgUF9TSE9SVAorCQkJUF9ISURFX0VYSVRTLCBQX1NIT1dfRVhJVFMKKyAgICAgS29tbWFuZG9rZXR0ZToJbWFrZV9pbnZsaXN0KCksIHNob3J0KCkKKyAgICAgU29uc3RpZ2VzOgkJUF9SRUZFUkVOQ0VfT0JKRUNULCBQX1dBTlRTX1RPX0xFQVJOCisKKzExLiBNYWkgMjAwNCBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vaXNfY2xhc3NfbWVtYmVyIGIvZG9jL2xmdW4vaXNfY2xhc3NfbWVtYmVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMTk0NDcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9pc19jbGFzc19tZW1iZXIKQEAgLTAsMCArMSwxNTUgQEAKK2lzX2NsYXNzX21lbWJlcigpCitGVU5LVElPTjoKKyAgICAgaW50IGlzX2NsYXNzX21lbWJlcihzdHJpbmd8c3RyaW5nKiBjbGFzcyk7CisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC90aGluZy9kZXNjcmlwdGlvbi5jCisKK0FSR1VNRU5URToKKyAgICAgc3RyaW5nL3N0cmluZyogY2xhc3MJLSBTdHJpbmcgb2RlciBTdHJpbmdhcnJheSBkZXIgS2xhc3NlKG4pCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRXMgd2lyZCBnZXRlc3RldCwgb2IgZGFzIE9iamVrdCBpbiBlaW5lIGRlciBpbiBjbGFzcyBhbmdlZ2ViZW5lbgorICAgICBLbGFzc2VuIGZhZWxsdC4gSW4gZGllc2VuIFRlc3Qgd2VyZGVuIGRpZSBmb2xnZW5kZW4gRWlnZW5zY2hhZnRlbiBkZXMKKyAgICAgT2JqZWt0ZXMgZWluYmV6b2dlbjoKKworICAgICAgIDEuIERpZSBSYXNzZSBkZXMgT2JqZWt0ZXMgKGJlaSBMZWJld2VzZW4pLAorICAgICAgIDIuIGRpZSBJRHMgZGVzIE9iamVrdGVzIHVuZAorICAgICAgIDMuIGRpZSBleHBsaXppdCBhbmdlZ2ViZW5lbiBLbGFzc2VuIGRlcyBPYmpla3Rlcy4KKyAgICAgICA0LiBlaW5pZ2VuIGltcGxpeml0ZW4gS2xhc3NlbiwgZGllIHNpY2ggYXVzIGRlbiBLbGFzc2VuIGluIDMgZXJnZWJlbi4KKworICAgICBEaWUgbW9lZ2xpY2hlbiBLbGFzc2VuIHNpbmQgaW4gL3N5cy9jbGFzcy5oIGRlZmluaWVydC4gTW9tZW50YW4gc3RlaGVuCisgICAgIGZvbGdlbmRlIEtsYXNzZW4genVyIFZlcmZ1ZWd1bmc6CisKKyAgICAgQ0xfQU1NVU5JVElPTgorICAgICAgICAgIERhcyBPYmpla3QgZWlnbmV0IHNpY2ggYWxzIE11bml0aW9uLgorICAgICBDTF9BTklNQUwKKyAgICAgICAgICBEYXMgT2JqZWt0IGlzdCBlaW4gVGllci4KKyAgICAgQ0xfQVJBQ0hOSUQKKyAgICAgICAgICBEYXMgT2JqZWt0IGluIGVpbiBTcGlubmVud2VzZW4uCisgICAgIENMX0JJR0JBTkcKKyAgICAgICAgICBEaWVzZXMgT2JqZWt0IGthbm4gbWVocmVyZW4gTGViZXdlc2VuIGF1ZiBlaW5tYWwgU2NoYWRlbiB6dWZ1ZWdlbi4KKyAgICAgQ0xfQklSRAorICAgICAgICAgIEVpbiBWb2dlbC4KKyAgICAgQ0xfQ1JBV0xJTkcKKyAgICAgICAgICBEaWVzZXMgV2VzZW4gYmV3ZWd0IHNpY2gga3JpZWNoZW5kLgorICAgICBDTF9DVVJTRQorICAgICAgICAgIERhcyBPYmpla3QgaXN0IGVpbiBGbHVjaCAoekIuIGVpbiBTcHJhY2hmbHVjaCkuCisgICAgIENMX0RFTU9OCisgICAgICAgICAgQmVpIGRlbSBPYmpla3QgaGFuZGVsdCBlcyBzaWNoIHVtIGVpbmVuIERhZW1vbi4KKyAgICAgQ0xfRElTRUFTRQorICAgICAgICAgIEVpbmUgS3JhbmtoZWl0LgorICAgICBDTF9EUkFHT04KKyAgICAgICAgICBFaW4gRHJhY2hlLgorICAgICBDTF9EV0FSRgorICAgICAgICAgIEZ1ZXIgdW5zZXJlIGtsZWluZW4gR2Flc3RlLi4uCisgICAgIENMX0VMRgorICAgICAgICAgIEVsZmVuIGFsbGVyIEFydC4KKyAgICAgQ0xfRUxFTUVOVEFMCisgICAgICAgICAgRWluIEVsZW1lbnRhciBpcmdlbmRlaW5lciBBcnQuIE1hdGVyaWFsIHNldHplbiB3YWVyZSBhbmdlYnJhY2h0LgorICAgICBDTF9FWFBMT1NJVkUKKyAgICAgICAgICBCZWkgZGVtIE9iamVrdCBoYW5kZWx0IGVzIHNpY2ggdW0gZWluZW4gU3ByZW5nc3RvZmYuCisgICAgIENMX0ZFTElORQorICAgICAgICAgIEZlbGluZW4gdW5kIGFuZGVyZSBrYXR6ZW5hcnRpZ2VuIExlYmV3ZXNlbi4KKyAgICAgQ0xfRklTSAorICAgICAgICAgIEZpc2NoZSAtIGtlaW5lIE1lZXJlc3NhZXVnZXIhCisgICAgIENMX0ZMWUlORworICAgICAgICAgIERpZXNlcyBXZXNlbiBiZXdlZ3Qgc2ljaCBmbGllZ2VuZC4KKyAgICAgQ0xfRlJPRworICAgICAgICAgIEZyb2VzY2hlIC0gYXVjaCBnZWZyb3NjaHRlIFNwaWVsZXIuCisgICAgIENMX0dIT1NUCisgICAgICAgICAgR2Vpc3RlciB1bmQgZ2Vpc3RlcmhhZnRlIFdlc2VuLgorICAgICBDTF9HSE9VTAorICAgICAgICAgIEVpbiBHaG91bC4gRXIgZmFlbGx0IGF1dG9tYXRpc2NoIGluIGRpZSBLbGFzc2UgQ0xfVU5ERUFELgorICAgICBDTF9HSUFOVAorICAgICAgICAgIEVpbiByaWVzaWdlcyBMZWJld2VzZW4uCisgICAgIENMX0dOT01FCisgICAgICAgICAgRWluIEdub20uCisgICAgIENMX0dPQkxJTgorICAgICAgICAgIEVpbiBHb2JsaW4uCisgICAgIENMX0hPQkJJVAorICAgICAgICAgIEVpbiBIb2JiaXQuCisgICAgIENMX0hPQkdPQkxJTgorICAgICAgICAgIEVpbiBIb2Jnb2JsaW4uIEVyIGZhZWxsdCBhdXRvbWF0aXNjaCBhdWNoIGluIGRpZSBLbGFzc2UgQ0xfR09CTElOLgorICAgICBDTF9IVU1BTgorICAgICAgICAgIEVpbiBNZW5zY2guCisgICAgIENMX0lOT1JHQU5JQworICAgICAgICAgIEFub3JnYW5pc2NoZSBMZWJld2VzZW4gd2llIE1ldGFsbG1vbnN0ZXIKKyAgICAgQ0xfSU5TRUNUCisgICAgICAgICAgSW5zZWt0ZW4gKE5pY2h0IG1pdCBTcGlubmVuIHZlcndlY2hzZWxuKQorICAgICBDTF9MSVZJTkcKKyAgICAgICAgICBMZWJld2VzZW4gaW0gYWxsZ2VtZWluZW4uCisgICAgIENMX01BTU1BTAorICAgICAgICAgIFNhZXVnZXRpZXJlLgorICAgICBDTF9NQU1NQUxfTEFORAorICAgICAgICAgIExhbmRzYWV1Z2V0aWVyZQorICAgICBDTF9NQU1NQUxfV0FURVIKKyAgICAgICAgICBNZWVyZXNzYWV1Z2VyLgorICAgICBDTF9PUkMKKyAgICAgICAgICBFaW4gT3JrLgorICAgICBDTF9QTEFOVAorICAgICAgICAgIFBmbGFuemVuIHVuZCBwZmxhbnplbmFydGlnZSBNb25zdGVyLgorICAgICBDTF9QT0lTT04KKyAgICAgICAgICBEYXMgT2JqZWt0IGlzdCBzZWxic3QgZWluIEdpZnQKKyAgICAgQ0xfUE9JU09OT1VTCisgICAgICAgICAgRGFzIE9iamVrdCBrYW5uIGVpbmVuIFNwaWVsZXIvTlBDIHZlcmdpZnRlbi4KKyAgICAgQ0xfUkVQVElMRQorICAgICAgICAgIFJlcHRpbGllbi4KKyAgICAgQ0xfU0hBRE9XCisgICAgICAgICAgU2NoYXR0ZW53ZXNlbi4KKyAgICAgQ0xfU0tFTEVUT04KKyAgICAgICAgICBFaW4gU2tlbGV0dC4gRXMgZmFlbGx0IGF1dG9tYXRpc2NoIGluIGRpZSBLbGFzc2UgQ0xfVU5ERUFELgorICAgICBDTF9TTElNRQorICAgICAgICAgIEZ1ZXIgRWluemVsbGVyIHVuZCBhZWhubGljaGVzIFNjaGxlaW1nZXRpZXIKKyAgICAgQ0xfU05BS0UKKyAgICAgICAgICBTY2hsYW5nZW4uCisgICAgIENMX1NXSU1NSU5HCisgICAgICAgICAgRGllc2VzIFdlc2VuIGJld2VndCBzaWNoIHNjaHdpbW1lbmQuCisgICAgIENMX1RST0xMCisgICAgICAgICAgRWluIFRyb2xsLgorICAgICBDTF9VTkRFQUQKKyAgICAgICAgICBFaW4gdW50b3RlcyBMZWJld2VzZW4uCisgICAgIENMX1dBTEtJTkcKKyAgICAgICAgICBEaWVzZXMgV2VzZW4gYmV3ZWd0IHNpY2ggZ2VoZW5kLgorICAgICBDTF9WQU1QSVJFCisgICAgICAgICAgRWluIFZhbXBpci4gRXIgZmFlbGx0IGF1dG9tYXRpc2NoIGluIGRpZSBLbGFzc2UgQ0xfVU5ERUFELgorICAgICBDTF9aT01CSUUKKyAgICAgICAgICBFaW4gWm9tYmllLiBFciBmYWVsbHQgYXV0b21hdGlzY2ggaW4gZGllIEtsYXNzZSBDTF9VTkRFQUQuCisKKyAgICAgSW1wbGl6aXRlIEtsYXNzZW46CisgICAgIEJlaSBlaW5pZ2VuIEtsYXNzZW4gd2lyZCBpbSBBZGRDbGFzcygpIGF1dG9tYXRpc2NoIGVpbmUgb2RlciBtZWhyZXJlCisgICAgIHdlaXRlcmVyIEtsYXNzZW4gaGluenVnZWZ1ZWd0IHVuZCBpbSBSZW1vdmVDbGFzcygpIGRpZSBlbnRzcHJlY2hlbmRlbgorICAgICBpbXBsaXppdGVuIEtsYXNzZW4gYXVjaCBhdXRvbWF0aXNjaCBlbnRmZXJudC4KKyAgICAgV3VlbnNjaHQgbWFuIGRpZXNlIGltcGxpeml0ZW4gS2xhc3NlbiBuaWNodCwgbXVzcyBtYW4gbmFjaCBkZW0gQWRkQ2xhc3MoKQorICAgICBkaWVzZSBtaXR0ZWxzIGVpbmVzIGVudHNwcmVjaGVuZGVuIFJlbW92ZUNsYXNzKCkgZW50ZmVybmVuLgorICAgICBEaWUgaW1wbGl6aXRlbiBLbGFzc2VuIGVpbmVyIEtsYXNzZSBsYXNzZW4gc2ljaCBtaXQgSGlsZmUgZGVyIEZ1bmt0aW9uCisgICAgIFF1ZXJ5SW1wbGljaXRDbGFzc2VzKCkgaW4gQ0xBU1NEQiBoZXJhdXNmaW5kZW46CisgICAgICAgQ0xBU1NEQi0+UXVlcnlJbXBsaWNpdENsYXNzZXMoLi4uKQorICAgICBNb21lbnRhbiBzaW5kIGRpZXM6CisgICAgIENMX1pPTUJJRTogICAgICAgQ0xfVU5ERUFECisgICAgIENMX1NLRUxFVE9OOiAgICAgQ0xfVU5ERUFECisgICAgIENMX0dIT1VMOiAgICAgICAgQ0xfVU5ERUFECisgICAgIENMX1ZBTVBJUkU6ICAgICAgQ0xfVU5ERUFECisgICAgIENMX0hPQkdPQkxJTjogICAgQ0xfR09CTElOCisgICAgIENMX01BTU1BTF9MQU5EOiAgQ0xfTUFNTUFMLCBDTF9BTklNQUwKKyAgICAgQ0xfTUFNTUFMX1dBVEVSOiBDTF9NQU1NQUwsIENMX0FOSU1BTAorICAgICBDTF9TTkFLRTogICAgICAgIENMX1JFUFRJTEUKKyAgICAgQ0xfQVJBQ0hOSUQ6ICAgICBDTF9BTklNQUwKKyAgICAgQ0xfQklSRDogICAgICAgICBDTF9BTklNQUwKKyAgICAgQ0xfRklTSDogICAgICAgICBDTF9BTklNQUwKKyAgICAgQ0xfRlJPRzogICAgICAgICBDTF9BTklNQUwKKyAgICAgQ0xfSU5TRUNUOiAgICAgICBDTF9BTklNQUwKKyAgICAgQ0xfTUFNTUFMOiAgICAgICBDTF9BTklNQUwKKyAgICAgQ0xfUkVQVElMRTogICAgICBDTF9BTklNQUwKKyAgICAgQ0xfU05BS0U6ICAgICAgICBDTF9BTklNQUwKKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgMSwgd2VubiBkYXMgT2JqZWt0IGluIGVpbmUgZGVyIGFuZ2VnZWJlbmVuIEtsYXNzZW4gZmFlbGx0LCBhbnNvbnN0ZW4gMC4KKworU0lFSEUgQVVDSDoKKyAgICAgQWRkQ2xhc3MoKSwgUmVtb3ZlQ2xhc3MoKSwgL3N0ZC90aGluZy9kZXNjcmlwdGlvbi5jCisgICAgIFBfQ0xBU1MKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMjAuMDEuMjAxNSwgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9sZnVuIGIvZG9jL2xmdW4vbGZ1bgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWRkNDVhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vbGZ1bgpAQCAtMCwwICsxLDEyIEBACitOQU1FOgorCWxmdW4oKQorCitERVNDUklQVElPTjoKKwlUaGlzIGRpcmVjdG9yeSBjb250YWlucyBkZXNjcmlwdGlvbnMgZm9yIHRoZSBsZnVucyB1c2VkIGJ5CisJQW15bGFhcidzIHZlcnNpb24gb2YgdGhlIExQQyBwYXJzZXIuCisKKwlUaGVzZSBhcmUgZnVuY3Rpb25zIHRoYXQgYXJlIGFwcGxpZWQgYnkgdGhlIHBhcnNlciB0byB0aGUgTFBDCisJb2JqZWN0cyBvbiB2YXJpb3VzIG9jY2FzaW9ucy4KKworU0VFIEFMU086CisJZWZ1bihFKSwgbWFzdGVyKE0pLCBjb25jZXB0cyhDKSwgbHBjKExQQyksIGRyaXZlcihEKQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vbG9jYXRlX29iamVjdHMgYi9kb2MvbGZ1bi9sb2NhdGVfb2JqZWN0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDU2ZTlhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vbG9jYXRlX29iamVjdHMKQEAgLTAsMCArMSw1NCBAQAorbG9jYXRlX29iamVjdHMoKQorCitGVU5LVElPTjoKKyAgICAgb2JqZWN0ICpsb2NhdGVfb2JqZWN0cyhzdHJpbmcgZGVzYywgaW50IGluZm8pOworCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvY29udGFpbmVyL3Jlc3RyaWN0aW9ucy5jCisKK0FSR1VNRU5URToKKyAgICAgZGVzYworICAgICAgICAgIERpZSBVbXNjaHJlaWJ1bmcgZGVzIGdlc3VjaHRlbiBPYmpla3Rlcy4KKworICAgICBpbmZvCisgICAgICAgICAgSXN0IHVuZ2xlaWNoIDAsIHdlbm4gZGllc2UgRnVua3Rpb24gdm9uIC9zdGQvbGl2aW5nL3B1dF9hbmRfZ2V0LmMKKyAgICAgICAgICBhdXMgYXVmZ2VydWZlbiB3dXJkZS4KKworQkVTQ0hSRUlCVU5HOgorICAgICBEaWVzZSBGdW5rdGlvbiBlcndlaXRlcnQgZGllIEZ1bmt0aW9uYWxpdGFldCB2b24gcHJlc2VudF9vYmplY3RzKCkKKyAgICAgaW5zb2Zlcm4sIGFscyBkYXNzIGVzIG1vZWdsaWNoIGlzdCwgYXVjaCBub2NoIEJlaGFlbHRlciBpbm5lcmhhbGIgZGVzCisgICAgIEJlaGFlbHRlcnMgenUgZHVyY2hzdWNoZW4uIERhcyBnZW5hdWUgVmVyaGFsdGVuIGhhZW5ndCB2b24gZGVzYyBhYjoKKworICAgICBJc3QgZGVzYyB2b24gZGVyIEZvcm0gIjxpZD4iLCBzbyB3aXJkIGRhcyBFcmdlYm5pcyB2b24KKyAgICAgcHJlc2VudF9vYmplY3RzKGRlc2MpIHp1cnVlY2tnZWdlYmVuLgorCisgICAgIElzdCBkZXNjIHZvbiBkZXIgRm9ybSAiPGdlc3VjaHQ+IGluIDxpZD4iLCBzbyB3aXJkIGluIGFsbGVuIE9iamVrdGVuLAorICAgICBkaWUgdm9uIHByZXNlbnRfb2JqZWN0cygiPGlkPiIpIGVyZmFzc3Qgd3VyZGVuLAorICAgICBsb2NhdGVfb2JqZWN0cygiPGRlc2M+IikgYXVmZ2VydWZlbi4gWnVydWVja2dlZ2ViZW4gd2VyZGVuIGFsbGUgYXVmCisgICAgIGRpZXNlIFdlaXNlIGdlZnVuZGVuZW4gT2JqZWt0ZS4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgQXJyYXkgdm9uIE9iamVrdGVuLCBkaWUgYXVmIGRpZSBvYmVuIGdlc2NoaWxkZXJ0ZSBBcnQgdW5kIFdlaXNlCisgICAgIGVybWl0dGVsdCB3dXJkZW4uIEtvbm50ZSBrZWluIE9iamVrdCBlcm1pdHRlbHQgd2VyZGVuLCB3aXJkIGVpbiBsZWVyZXMKKyAgICAgQXJyYXkgenVydWVja2dlZ2ViZW4uCisKK0JFTUVSS1VOR0VOOgorICAgICBUaGVvcmV0aXNjaCBzb2xsdGUgZXMgbW9lZ2xpY2ggc2VpbiwgdWViZXIgZGVzYyByZWt1cnNpdiBtZWhyZXJlCisgICAgIEJlaGFlbHRlcmViZW5lbiBlcmZhc3NlbiB6dSBrb2VubmVuIChldHdhIG1pdCAic2Nod2VydCBpbiBiZXV0ZWwgaW4KKyAgICAgYmV1dGVsIGluIHdhcmdvbiIpLiBJbiBkZXIgYWt0dWVsbGVuIEltcGxlbWVudGllcnVuZyBrbGFwcHQgZGFzIGplZG9jaAorICAgICBuaWNodDsgbmFjaCBkZW0gZXJzdGVuICJpbiIgaXN0IFNjaGx1c3MhCisKK0JFSVNQSUVMRToKKyAgICAgV2FzIHN0ZWNrdCBhbGxlcyBkZW0gQmV1dGVsLCBkZW4gZGVyIFNwaWVsZXIgYmVpIHNpY2ggdHJhZWd0PworCisgICAgIG9iamVjdCAqb2JzOworICAgICBvYnMgPSB0aGlzX3BsYXllcigpLT5sb2NhdGVfb2JqZWN0cygiYWxsZXMgaW4gYmV1dGVsIik7CisKKyAgICAgVHJhZWd0IGRlciBTcGllbGVyIGtlaW5lbiBCZXV0ZWwgYmVpIHNpY2ggb2RlciBpc3QgZGllc2VyIGxlZXIsIHNvIHdpcmQKKyAgICAgZWluIGxlZXJlcyBBcnJheSB6dXJ1ZWNrZ2VnZWJlbi4KKworU0lFSEUgQVVDSDoKKyAgICAgcHJlc2VudF9vYmplY3RzKCksIC9zdGQvY29udGFpbmVyL3Jlc3RyaWN0aW9ucy5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFdlZCBNYXkgOCAxMDoyMDozNiAxOTk2IGJ5IFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vbG9nb24gYi9kb2MvbGZ1bi9sb2dvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDBmMWUwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vbG9nb24KQEAgLTAsMCArMSwxNSBAQAorbG9nb24oKQorCitTWU5PUFNJUzoKKwlpbnQgbG9nb24odm9pZCkKKworREVTQ1JJUFRJT046CisJV2hlbiB0aGUgcGFyc2VyIGFjY2VwdHMgYSBuZXcgY29ubmVjdGlvbiwgaXQgZmlyc3QgY2FsbHMKKwljb25uZWN0KCkgaW4gdGhlIG1hc3RlciBvYmplY3QgYW5kIHRoZW4gYXBwbGllcyBsb2dvbigpIHRvCisJdGhlIG9iamVjdCB0aGF0IGlzIHJldHVybmVkIGJ5IHRoZSBtYXN0ZXIuIFRoYXQgd2lsbCB1c3VhbGx5IGJlCisJYSBzcGVjaWFsIGxvZ2luIG9iamVjdCwgdGhhdCBpcyBleHBlY3RlZCB0byBjbG9uZSBhbmQgZ2V0IGdvaW5nCisJYSB1c2VyIHNoZWxsIG9yIHBsYXllciBvYmplY3QuCisJU2hvdWxkIHJldHVybiAwIG9uIGZhaWx1cmUsIGV2ZXJ5dGhpbmcgZWxzZSBtZWFucyBzdWNjZXNzLgorCitTRUUgQUxTTzoKKwljb25uZWN0KE0pCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9sb25nIGIvZG9jL2xmdW4vbG9uZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGFjNGY5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vbG9uZwpAQCAtMCwwICsxLDMxIEBACitsb25nKCkKK0ZVTktUSU9OOgorICAgICB2YXJhcmdzIHN0cmluZyBsb25nKGludCBtb2RlKTsKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL3RoaW5nL2Rlc2NyaXB0aW9uLmMKKworQVJHVU1FTlRFOgorICAgICBpbnQgbW9kZQkJLSBNb2RpZmlrYXRvcmVuIGZ1ZXIgZGllIEFuemVpZ2UsIGZhbGxzIHRoaXNfb2JqZWN0KCkKKwkJCSAgZWluIENvbnRhaW5lciBpc3QKKwkJCSAgKHNpZWhlICJtYW4gbWFrZV9pbnZsaXN0IikKKworQkVTQ0hSRUlCVU5HOgorICAgICBEZXIgSW5oYWx0IGRlciBQcm9wZXJ0eSBQX0xPTkcgd2lyZCBhdXNnZXdlcnRldCB1bmQgenVydWVja2dlZ2ViZW4uCisgICAgIEZhbGxzIGRhcyBPYmpla3QgZWluIENvbnRhaW5lciB1bmQgdHJhbnNwYXJlbnQgKG9mZmVuKSBpc3QsIHdpcmQKKyAgICAgenVkZW0gbWFrZV9pbnZsaXN0KCkgYXVmIGRlbiBJbmhhbHQgenVydWVja2dlZ2ViZW4uCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIERpZSBMYW5nYmVzY2hyZWlidW5nIGRlcyBPYmpla3Rlcy4KKworQkVNRVJLVU5HRU46CisgICAgIER1cmNoIFVlYmVybGFkZW4gdm9uIGxvbmcoKSBsYXNzZW4gc2ljaCBub2NoIHdlaXRlcmUgRWlnZW5zY2hhZnRlbiBkZXMKKyAgICAgT2JqZWt0ZXMgYW56ZWlnZW4uIEJlaGFlbHRlciBrb2VubmVuIHp1bSBCZWlzcGllbCBub2NoIGlocmVuIEluaGFsdAorICAgICBhbnplaWdlbiwgTGViZXdlc2VuIGlocmVuIEdlc3VuZGhlaXRzenVzdGFuZCwgby5hZS4KKworU0lFSEUgQVVDSDoKKyAgICAgQWVobmxpY2hlczoJc2hvcnQoKQorICAgICBQcm9wZXJ0aWVzOglQX0xPTkcsIFBfSU5WSVMsIFBfVFJBTlNQQVJFTlQKKyAgICAgU29uc3RpZ2VzOgkJbWFrZV9pbnZsaXN0KCkKKworMTEuIE1haSAyMDA0IEdsb2luc29uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vbWFrZV9pbW1vcnRhbCBiL2RvYy9sZnVuL21ha2VfaW1tb3J0YWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZmNDkwMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL21ha2VfaW1tb3J0YWwKQEAgLTAsMCArMSwyNyBAQAorbWFrZV9pbW1vcnRhbCgpDQorDQorRlVOS1RJT046DQorICAgICB2b2lkIG1ha2VfaW1tb3J0YWwoKTsNCisNCitERUZJTklFUlQgSU46DQorICAgICAvc3RkL25wYy9jb21iYXQuYw0KKw0KK0JFU0NIUkVJQlVORzoNCisgICAgIE1hY2h0IGRlbiBOUEMgZvxyIDUgTWludXRlbiB1bmFuZ3JlaWZiYXIgdW5kIGhlaWx0IGlobi4NCisNCisgICAgIFdpcmQgYmVpIEZlaGxlcm4gaW0gSGVyenNjaGxhZyBkZXMgTlBDcyBnZXJ1ZmVuIHVtIEJ1Z251dHp1bmcNCisgICAgIHp1IHVudGVyYmluZGVuLg0KKw0KKyAgICAgQXVzc2NocmlmdDoNCisgICAgICIuLi4gdmVyc3RlY2t0IHNpY2ggaGludGVyIGVpbmVtIEZlaGxlciBpbSBSYXVtLVplaXQtR2VmdWVnZSB1bmQNCisgICAgICBlbnRnZWh0IHNvIHZvcnVlYmVyZ2VoZW5kIGFsbGVuIEFuZ3JpZmZlbi4iDQorDQorQkVNRVJLVU5HRU46DQorICAgICBOaWNodCBtaXNzYnJhdWNoZW4uDQorDQorU0lFSEUgQVVDSDoNCisgICAgIE1ldGhvZGVuOiAgICAgICBoZWFydF9iZWF0KCksIHN0YXRpYyBfY2hlY2tfaW1tb3J0YWxpdHkoKQ0KKyAgICAgTWFzdGVyOiAgICAgICAgIGhlYXJ0X2JlYXRfZXJyb3IoKQ0KKyAgICAgUHJvcGVydGllczogICAgICJ0aW1lX3RvX21vcnRhbGl0eSINCisNCisxLkp1bmkgMjAwNyBHbG9pbnNvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL21ha2VfaW52bGlzdCBiL2RvYy9sZnVuL21ha2VfaW52bGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmZiY2NhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vbWFrZV9pbnZsaXN0CkBAIC0wLDAgKzEsMzggQEAKK21ha2VfaW52bGlzdCgpCitGVU5LVElPTjoKKyAgICAgdmFyYXJncyBtaXhlZCBtYWtlX2ludmxpc3Qob2JqZWN0IHZpZXdlciwgbWl4ZWQgaW52LCBpbnQgZmxhZ3MpCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC9jb250YWluZXIvZGVzY3JpcHRpb24uYworCitBUkdVTUVOVEU6CisgICAgIG9iamVjdCB2aWV3ZXIJLSBkYXMgT2JqZWt0LCB3ZWxjaGVzIHNpY2ggZGVuIEluaGFsdCBhbnNpZWh0IChpbgorCQkJICBkZXIgUmVnZWwgdGhpc19wbGF5ZXIoKSkKKyAgICAgbWl4ZWQgaW52CQktIGVpbiBBcnJheSB2b24gT2JqZWt0ZW4sIGRpZSBpbiBkaWUgTGlzdGUKKwkJCSAgYXVmZ2Vub21tZW4gd2VyZGVuIHNvbGxlbgorICAgICBpbnQgZmxhZ3MJCS0gRm9sZ2VuZGUgV2VydGUga29lbm5lbiB2ZXJPREVSdCB3ZXJkZW46CisJCQkgIDE6IGRhcyBJbnYgbmljaHQgYWxzIFN0cmluZywgc29uZGVybiBhbHMgZWluCisJCQkgICAgIEFycmF5IHp1cnVlY2tnZWJlbgorCQkJICAyOiBnbGVpY2hlIE9iamVrdGUgbmljaHQgenVzYW1tZW5nZWZhc3NlbgorCQkJICA0OiB1bnRlcmRydWVja3QgZGllIEF1c2dhYmUgZGVzIERhdGVpbmFtZW5zIGhpbnRlcgorCQkJICAgICBqZWRlbSB0cm90eiBlaW5nZXNjaGFsdGV0ZW0gTWFnaWVybW9kdXMKKworQkVTQ0hSRUlCVU5HOgorICAgICBEaWUgS3VyemJlc2NocmVpYnVuZ2VuIGRlciBPYmpla3RlIGluIGludiB3ZXJkZW4genUgZWluZXIgTGlzdGUKKyAgICAgenVzYW1tZW5nZWZhc3N0IChlaW5lIFplaWxlIHBybyBPYmpla3QpLiBVbnNpY2h0YmFyZSBPYmpla3RlIHRhdWNoZW4gaW4KKyAgICAgZGllc2VyIExpc3RlIG5pY2h0IGF1Zi4KKworICAgICBJc3Qgdmlld2VyIGVpbiBNYWdpZXIgbWl0IGVpbmdlc2NoYWx0ZXRlbSBNYWdpZXJtb2R1cywgc28gd2lyZCBoaW50ZXIKKyAgICAgZGllIEt1cnpiZXNjaHJlaWJ1bmdlbiBub2NoIGRlciBEYXRlaW5hbWUgZGVzIGpld2VpbGlnZW4gT2JqZWt0ZXMgaW4KKyAgICAgZWNraWdlbiBLbGFtbWVybiBhbmdlZ2ViZW4uIFVuc2ljaHRiYXJlIE9iamVrdGUgZXJzY2hlaW5lbiBpbiBkaWVzZW0KKyAgICAgRmFsbCBhbHMgRmlsZW5hbWVuLgorCitSVWVDS0dBQkVXRVJUOgorICAgICBFaW4gU3RyaW5nIG9kZXIgZWluIEFycmF5LCBkaWUgZGFzIGludiBiZXNjaHJlaWJlbi4KKworU0lFSEUgQVVDSDoKKyAgICAgS29tbWFuZG9rZXR0ZToJc2hvcnQoKQorICAgICBQcm9wZXJ0aWVzOglQX1NIT1JULCBQX0lOVklTLCBQX1dBTlRTX1RPX0xFQVJOCisgICAgIFNvbnN0aWdlczoJCVBfUkVGRVJFTkNFX09CSkVDVAorCitMYXN0IG1vZGlmaWVkOiBUdWUgT2N0IDE1IDEwOjEwOjAwIDIwMDIgYnkgUmlrdXMKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL21hc3Rlci9BZGRXaXphcmRGb3JVSUQgYi9kb2MvbGZ1bi9tYXN0ZXIvQWRkV2l6YXJkRm9yVUlECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ODQ2M2IKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9tYXN0ZXIvQWRkV2l6YXJkRm9yVUlECkBAIC0wLDAgKzEsNDcgQEAKK0FkZFdpemFyZEZvclVJRCgpCisKK0ZVTktUSU9OOgorICAgIHN0cmluZyogQWRkV2l6YXJkRm9yVUlEKHN0cmluZyB1aWQsIHN0cmluZyB3aXphcmQpOworCitERUZJTklFUlQgSU46CisgICAgL3NlY3VyZS9tYXN0ZXIvdXNlcmluZm8uYworCitBUkdVTUVOVEU6CisgICAgdWlkCisgICAgICBEaWUgVUlELCBmdWVyIGRpZSBtYW4gZWluZW4gKHdlaXRlcmVuKSB2ZXJhbnR3b3J0bGljaGVuIE1hZ2llcgorICAgICAgZXhwbGl6aXQgZWludHJhZ2VuIG1vZWNodGUuCisgICAgd2l6YXJkCisgICAgICBEZXIgTWFnaWVyLCBkZW4gbWFuIGVpbnRyYWdlbiBtb2VjaHRlLgorCitCRVNDSFJFSUJVTkc6CisgICAgRGllIEZ1bmt0aW9uIHRyYWVndCBlaW5lbiBNYWdpZXIgJ3dpemFyZCcgZXhwbGl6aXQgYWxzIHZlcmFudHdvcnRsaWNoZW4KKyAgICBNYWdpZXIgZnVlciBkaWUgVUlEICd1aWQnIGVpbi4gSGllcmJlaSBrYW5uICd1aWQnIHNvZ2FyIGRlciBOYW1lIGVpbmVzCisJCWFuZGVyZW4gTWFnaWVycyBzZWluLCBkZXNzZW4gVUlEcyAnd2l6YXJkJyBzb3p1c2FnZW4gImFkb3B0aWVydCIuCisKKwkJQmVyZWNodGlndCB6dW0gRWludHJhZ2VuIHZvbiBNYWdpZXJuIGZ1ZXIgYmVzdGltbXRlIFVJRHMgc2luZCBhbGxlIE1hZ2llciwKKyAgICBkaWUgKGltcGxpeml0IG9kZXIgZXhwbGl6aXQpIHZlcmFudHdvcnRsaWNoIGZ1ZXIgZGllIGpld2VpbGlnZSBVSUQgc2luZC4KKyAgICBaLkIuIGthbm4gWmVzc3RyYSBvaG5lIHdlaXRlcmVzIGplbWFuZCB3ZWl0ZXJlbiBhbHMgdmVyYW50d29ydGxpY2ggZnVlcgorICAgIGQuaW5zZWxuLnplc3N0cmEgZWludHJhZ2VuLgorCitSVWVDS0dBQkVXRVJUOgorICAgIFp1cnVlY2tnZWxpZWZlcnQgd2lyZCBlaW4gQXJyYXkgdm9uIFN0cmluZ3MsIGplZGVzIEVsZW1lbnQgaXN0IGVpbmUgVUlELAorICAgIGZ1ZXIgZGllIGRpZXIgTWFnaWVyIGpldHp0IGV4cGxpeml0IGVpbmdldHJhZ2VuIGlzdC4KKworQkVNRVJLVU5HRU46CisgICAgRXMgaXN0IG5pY2h0IG5vZXRpZywgei5CLiBaZXNzdHJhIGFscyB2ZXJhbnR3b3J0bGljaCBmdWVyIGQuaW5zZWxuLnplc3N0cmEKKyAgICBlaW56dXRyYWdlbiwgZGEgc2llIG9obmVoaW4gc2Nob24gaW1wbGl6aXQgZGFmdWVyIHp1c3RhZW5kaWcgaXN0LiBBdWNoCisgICAgZnVlciBSTXMgYnp3LiBHTXMgbXVzcyBpaHJlIFJlZ2lvbiBiencuIEdpbGRlIG5pY2h0IGV4cGxpeml0IGVpbmdldHJhZ2VuIAorICAgIHdlcmRlbi4KKworQkVJU1BJRUxFOgorICAgIG1hc3RlcigpLT5BZGRXaXphcmRGb3JVSUQoInAud2F0ZXJsdWgiLCJ6b29rIik7CisJCQorCQlzdHJpbmcgKnVpZHMgPSBtYXN0ZXIoKS0+QWRkV2l6YXJkRm9yVUlEKCJqb2YiLCJ6b29rIik7CisgICAgcHJpbnRmKCJab29rIGlzdCBudW4gZXhwbGl6aXQgenVzdGFlbmRpZyBmdWVyOiAlc1xuIixDb3VudFVwKHVpZHMpKTsKKworU0lFSEUgQVVDSDoKKyAgICBRdWVyeVdpemFyZHNGb3JVSUQoKSwgUXVlcnlVSURzRm9yV2l6YXJkLAorCQlSZW1vdmVXaXphcmRGcm9tVUlEKCkKKworMjAuMDIuMjAwNywgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9tYXN0ZXIvUXVlcnlVSURBbGlhcyBiL2RvYy9sZnVuL21hc3Rlci9RdWVyeVVJREFsaWFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYTg0NGMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9tYXN0ZXIvUXVlcnlVSURBbGlhcwpAQCAtMCwwICsxLDQzIEBACitRdWVyeVVJREFsaWFzKCkKKworRlVOS1RJT046CisgICAgdmFyYXJncyBzdHJpbmcqIFF1ZXJ5VUlEc0ZvcldpemFyZChzdHJpbmcgdWlkYWxpYXMsIGludCByZWN1cnNpdmUpOworCitERUZJTklFUlQgSU46CisgICAgL3NlY3VyZS9tYXN0ZXIvdXNlcmluZm8uYworCitBUkdVTUVOVEU6CisgICAgdWlkYWxpYXMKKyAgICAgIFVJRCwgZGllIGV4cGFuZGllcnQgd2VyZGVuIHNvbGwuCisgICAgcmVjdXJzaXZlIChvcHRpb25hbCkKKyAgICAgIEdpYnQgYW4sIG9iIFF1ZXJ5VUlEQWxpYXMoKSAoaW5kaXJla3QpIHJla3Vyc2l2IGF1ZmdlcnVmZW4gd3VyZGUuCisgICAgICBTb2xsdGUgbm9ybWFsZXJ3ZWlzZSBuaWNodCBwZXIgSGFuZCBnZXNldHp0IHdlcmRlbi4KKworQkVTQ0hSRUlCVU5HOgorICAgIERpZSBGdW5rdGlvbiBlcm1pdHRlbHQgYXVzIGVpbmVyICJBbGlhcy1VSUQiIGRpZSBVSUQsIGZ1ZXIgZGllIHNpZSBzdGVodC4KKyAgICBIaWVyYmVpIHdlcmRlbiBmb2xnZW5kZSBVSUQtQWxpYXNlIGJlcnVlY2tzaWNodGlndDoKKyAgICAicmVnaW9uIjogICAgZC5yZWdpb24uKiArIHJlZ2lvbiArIGQucmVnaW9uCisgICAgImdpbGRlIjogICAgIEdVSUxELmdpbGRlLCBHVUlMRC5naWxkZW5zcGVsbGJvb2ssIHAuZ2lsZGUKKyAgICAicCI6ICAgICAgICAgcC4qIChvaG5lIHAuc2VydmljZSkKKyAgICAicC5zZXJ2aWNlIjogcC5zZXJ2aWNlLioKKyAgICAibWFnaWVyaWQiOiAgUXVlcnlVSURzRm9yV2l6YXJkKCkKKworICAgIERhcyBFcmdlYm5pcyBkaWVzZXIgRnVua3Rpb24gd2lyZCBsYWVuZ2VyZSBaZWl0IGdlY2FjaGV0IChiaXMgenUgMjRoKS4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICBadXJ1ZWNrZ2VsaWVmZXJ0IHdpcmQgZWluIEFycmF5IHZvbiBTdHJpbmdzLCBqZWRlcyBFbGVtZW50IGlzdCBlaW5lIFVJRC4KKyAgICBTb2xsdGUgdWlkYWxpYXNlIGtlaW5lcyBkZXIgby5nLiBzZWluLCB3aXJkIGVpbiAoe3VpZGFsaWFzfSkgZ2VsaWVmZXJ0LgorCitCRUlTUElFTEU6CisgICAgc3RyaW5nICp1aWRzID0gbWFzdGVyKCktPlF1ZXJ5VUlEQWxpYXMoInNjaGF0dGVud2VsdCIpOworICAgIC8vIHVpZHMgZW50aGFlbHQgbnVuOgorICAgIC8vICh7ImQuYW5mYWVuZ2VyIiwiYW5mYWVuZ2VyIiwiZC5hbmZhZW5nZXIuYXJrIiwiZC5hbmZhZW5nZXIuZW5ub3giLAorICAgIC8vICAgImQuYW5mYWVuZ2VyLmh1bW5pIiwiZC5hbmZhZW5nZXIua2lyaWEiLCJkLmFuZmFlbmdlci5rb256ZXB0ZSIsCisgICAgLy8gICAiZC5hbmZhZW5nZXIubWlyaWwifSkKKworU0lFSEUgQVVDSDoKKyAgICBRdWVyeVdpemFyZHNGb3JVSUQoKSwgCisJCUFkZFdpemFyZEZvclVJRCgpLCBSZW1vdmVXaXphcmRGcm9tVUlEKCkKKworMTYuMTIuMjAwNywgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9tYXN0ZXIvUXVlcnlVSURzRm9yV2l6YXJkIGIvZG9jL2xmdW4vbWFzdGVyL1F1ZXJ5VUlEc0ZvcldpemFyZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDAyOGMxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vbWFzdGVyL1F1ZXJ5VUlEc0ZvcldpemFyZApAQCAtMCwwICsxLDQyIEBACitRdWVyeVVJRHNGb3JXaXphcmQoKQorCitGVU5LVElPTjoKKyAgICB2YXJhcmdzIHN0cmluZyogUXVlcnlVSURzRm9yV2l6YXJkKHN0cmluZyB3aXpuYW1lLCBpbnQgcmVjdXJzaXZlKTsKKworREVGSU5JRVJUIElOOgorICAgIC9zZWN1cmUvbWFzdGVyL3VzZXJpbmZvLmMKKworQVJHVU1FTlRFOgorICAgIHdpem5hbWUKKyAgICAgIERlciBNYWdpZXIsIGZ1ZXIgZGVuIG1hbiBkaWUgVUlEcyBlcm1pdHRlbG4gd2lsbCwgZnVlciBkaWUgZXIKKyAgICAgIHp1c3RhZW5kaWcgaXN0LgorICAgIHJlY3Vyc2l2ZSAob3B0aW9uYWwpCisgICAgICBHaWJ0IGFuLCBvYiBRdWVyeVVJRHNGb3JXaXphcmQoKSAoaW5kaXJla3QpIHJla3Vyc2l2IGF1ZmdlcnVmZW4gd3VyZGUuCisgICAgICBTb2xsdGUgbm9ybWFsZXJ3ZWlzZSBuaWNodCBwZXIgSGFuZCBnZXNldHp0IHdlcmRlbi4KKworQkVTQ0hSRUlCVU5HOgorICAgIERpZSBGdW5rdGlvbiBlcm1pdHRlbHQgZGllIFVJRHMsIGZ1ZXIgZGllIGRpZXNlciBNYWdpZXIgenVzdGFlbmRpZyBpc3QuCisgICAgRGFiZWkgd2lyZCBpbXBsaXppZXJ0IGJlcnVlY2tzaWNodGlndCwgd2VubiBkZXIgTWFnaWVyIFJNIGVpbmVyIFJlZ2lvbgorICAgIG9kZXIgR2lsZGVubWFnaWVyIGVpbmVyIEdpbGRlIGlzdCwgZWJlbnNvIHdpZSBWZXJ6ZWljaG5pc3NlIGluIGRlbgorICAgIFJlZ2lvbmVuIG9kZXIgaW4gL3Avc2VydmljZS4KKyAgICBBdXNzZXJkZW0gd2lyZCBuYWNoZ2VzY2hhdXQsIGZ1ZXIgd2VsY2hlIFVJRHMgZGllc2VyIE1hZ2llciBleHBsaXppdAorICAgIGVpbmdldHJhZ2VuIHdvcmRlbiBpc3QuCisgICAgV2VubiB6LkIuIE1hZ2llciBBIGF1Y2ggZnVlciBhbGxlIFVJRHMgdm9uIE1hZ2llciBCIHp1c3RhZW5kaWcgc2VpbgorICAgIHNvbGx0ZSwgbGllZmVydCBkaWUgRnVua3Rpb24gYXVjaCBkaWUgVUlEcyB2b24gQiB6dXJ1ZWNrLgorCitSVWVDS0dBQkVXRVJUOgorICAgIFp1cnVlY2tnZWxpZWZlcnQgd2lyZCBlaW4gQXJyYXkgdm9uIFN0cmluZ3MsIGplZGVzIEVsZW1lbnQgaXN0IGVpbmUgVUlELgorICAgIFNvbGx0ZSBmdWVyIGVpbmVuIE5hbWVuIGtlaW5lIFVJRCBlcm1pdHRlbGJhciBzZWluLCBpc3QgZGFzIEFycmF5cyBsZWVyLgorCitCRUlTUElFTEU6CisgICAgc3RyaW5nICp1aWRzID0gbWFzdGVyKCktPlF1ZXJ5VUlEc0ZvcldpemFyZCgiZW5ub3giKTsKKyAgICAvLyB1aWRzIGVudGhhZWx0IG51bjoKKyAgICAvLyAoeyJlbm5veCIsImQuYW5mYWVuZ2VyLmVubm94IiwiZC5zY2hhdHRlbndlbHQuZW5ub3giLAorICAgIC8vICAgInAuc2VydmljZS5lbm5veCIsIkdVSUxELmNoYW9zIiwicC5jaGFvcyJ9KQorCitTSUVIRSBBVUNIOgorICAgIFF1ZXJ5V2l6YXJkc0ZvclVJRCgpLCAKKwkJQWRkV2l6YXJkRm9yVUlEKCksIFJlbW92ZVdpemFyZEZyb21VSUQoKQorCisxNi4xMi4yMDA3LCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL21hc3Rlci9RdWVyeVdpemFyZHNGb3JVSUQgYi9kb2MvbGZ1bi9tYXN0ZXIvUXVlcnlXaXphcmRzRm9yVUlECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMDk1YjYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9tYXN0ZXIvUXVlcnlXaXphcmRzRm9yVUlECkBAIC0wLDAgKzEsNDYgQEAKK1F1ZXJ5V2l6YXJkc0ZvclVJRCgpCisKK0ZVTktUSU9OOgorICAgIHZhcmFyZ3Mgc3RyaW5nKiBRdWVyeVdpemFyZHNGb3JVSUQoc3RyaW5nIHVpZCwgaW50IHJlY3Vyc2l2ZSk7CisKK0RFRklOSUVSVCBJTjoKKyAgICAvc2VjdXJlL21hc3Rlci91c2VyaW5mby5jCisKK0FSR1VNRU5URToKKyAgICB1aWQKKyAgICAgIERpZSBVSUQsIGZ1ZXIgZGllIG1hbiBkaWUgTWFnaWVyIGVybWl0dGVsbiB3aWxsLCBkaWUgZnVlciBzaWUKKyAgICAgIHp1c3RhZW5kaWcgc2luZC4KKyAgICByZWN1cnNpdmUgKG9wdGlvbmFsKQorICAgICAgZ2lidCBhbiwgb2IgZGFzIFF1ZXJ5V2l6YXJkc0ZvclVJRCgpIChpbmRpcmVrdCkgYXVzIGVpbmVtIAorICAgICAgUXVlcnlXaXphcmRzRm9yVUlEKCkgaGVyYXVzIGdlcnVmZW4gd3VyZGUuIFNvbGx0ZSBuaWNodCBtYW51ZWxsIGdlc2V0enQKKyAgICAgIHdlcmRlbi4KKworQkVTQ0hSRUlCVU5HOgorICAgIERpZSBGdW5rdGlvbiBlcm1pdHRlbHQgZGllIE1hZ2llciwgZGllIGZ1ZXIgZGllc2UgVUlEIHp1c3RhZW5kaWcgc2luZC4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICBadXJ1ZWNrZ2VsaWVmZXJ0IHdpcmQgZWluIEFycmF5IHZvbiBTdHJpbmdzLCBqZWRlcyBFbGVtZW50IGlzdCBlaW4gTWFnaWVyLgorICAgIFNvbGx0ZSBmdWVyIGVpbmUgVUlEIGtlaW4gTWFnaWVyIGVybWl0dGVsYmFyIHNlaW4sIGlzdCBkYXMgQXJyYXkgbGVlci4KKyAgICBXZW5uIHouQi4gZnVlciBkaWUgVUlEIGRlciBNYWdpZXIgIkF0YW11ciIgZ2VmdW5kZW4gd2lyZCwgYWJlciBmdWVyIGFsbGUgCisgICAgVUlEcyB2b24gIkF0YW11ciIgYXVjaCBkZXIgTWFnaWVyICJSdW1hdGEiIHp1c3RhZW5kaWcgc2VpbiBzb2xsdGUsIHdpcmQgCisgICAgIlJ1bWF0YSIgdWViZXIgZWluZSByZWt1cnNpdmUgU3VjaGUgZ2VmdW5kZW4uCisKK0JFTUVSS1VOR0VOOgorICAgIFdlbm4gZGllIFVJRCBkZW4gTWFnaWVyIG5pY2h0IGltcGxpeml0IGVudGhhZWx0ICh6LkIuIEdVSUxELmdpbGRlLCBpbSAKKyAgICBHZWdlbnNhdHogenUgZC5yZWdpb24ubWFnaWVyKSwgZmluZGV0IGRpZXNlIEZ1bmt0aW9uIG51ciBNYWdpZXIsIGZ1ZXIgZGllIAorICAgIHNlaXQgTGFkZW4gZGVzIE1hc3RlciBiZXJlaXRzIGVpbm1hbCBnZXRfdXNlcmluZm8oKSBvZGVyIAorICAgIFF1ZXJ5VUlEc0ZvcldpemFyZCgpIGltIE1hc3RlciBnZXJ1ZmVuIHd1cmRlLCB3YXMgei5CLiBFaW5sb2dnZW4gcGFzc2llcnQuCisgICAgTWFnaWVyLCBkaWUgbGFuZyBuaWNodCBlaW5sb2dndGVuLCB3ZXJkZW4gYWxzbyBtYW5jaG1hbCBuaWNodCBnZWZ1bmRlbiwKKyAgICB3YXMgaW4gZGVyIFJlZ2VsIG5pY2h0IHNjaGxpbW0gc2VpbiBzb2xsdGUsIGRhIHNpZSBqYSBvaG5laGluIGRlbgorICAgIGVudHNwcmVjaGVuZGVuIENvZGUgZ2VyYWRlIG5pY2h0IHdhcnRlbi4uLgorCitCRUlTUElFTEU6CisgICAgc3RyaW5nICp3aXogPSBtYXN0ZXIoKS0+UXVlcnlXaXphcmRzKCJHVUlMRC5rbGVydXMiKTsKKyAgICAvLyB3aXogZW50aGFlbHQgbnVuOiAoeyJtb3Jnb3RoIiwibWFnZGFsZW5hIn0pCisKK1NJRUhFIEFVQ0g6CisgICAgUXVlcnlVSURzRm9yV2l6YXJkKCksIAorCQlBZGRXaXphcmRGb3JVSUQoKSwgUmVtb3ZlV2l6YXJkRnJvbVVJRCgpCisKKzE2LjEyLjIwMDcsIFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vbWFzdGVyL1JlbW92ZVdpemFyZEZyb21VSUQgYi9kb2MvbGZ1bi9tYXN0ZXIvUmVtb3ZlV2l6YXJkRnJvbVVJRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTk3MTMyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vbWFzdGVyL1JlbW92ZVdpemFyZEZyb21VSUQKQEAgLTAsMCArMSwzOCBAQAorUmVtb3ZlV2l6YXJkRnJvbVVJRCgpCisKK0ZVTktUSU9OOgorICAgIHN0cmluZyogUmVtb3ZlV2l6YXJkRnJvbVVJRChzdHJpbmcgdWlkLCBzdHJpbmcgd2l6YXJkKTsKKworREVGSU5JRVJUIElOOgorICAgIC9zZWN1cmUvbWFzdGVyL3VzZXJpbmZvLmMKKworQVJHVU1FTlRFOgorICAgIHVpZAorICAgICAgRGllIFVJRCwgZnVlciBkaWUgbWFuIGVpbmVuIHp1c3RhZW5kaWdlbiBNYWdpZXIgYXVzdHJhZ2VuIHdpbGwuCisgICAgd2l6YXJkCisgICAgICBEZXIgTWFnaWVyLCBkZW4gbWFuIGF1c3RyYWdlbiBtb2VjaHRlLgorCitCRVNDSFJFSUJVTkc6CisgICAgRGllIEZ1bmt0aW9uIGxvZXNjaHQgZGllIFVJRCAndWlkJyBhdXMgZGVyIExpc3RlIGRlciBVSURzLCBmdWVyIGRpZQorICAgICd3aXphcmQnIGV4cGxpeml0IHp1c3RhZW5kaWcgaXN0LgorCisgICAgQmVyZWNodGlndCB6dW0gQXVzdHJhZ2VuIHZvbiBNYWdpZXJuIGZ1ZXIgYmVzdGltbXRlIFVJRHMgc2luZCBhbGxlIE1hZ2llciwKKyAgICBkaWUgKGltcGxpeml0IG9kZXIgZXhwbGl6aXQpIHZlcmFudHdvcnRsaWNoIGZ1ZXIgZGllIGpld2VpbGlnZSBVSUQgc2luZC4KKyAgICBNYW4ga2FubiBzaWNoIGF1Y2ggc2VsYmVyIGF1c3RyYWdlbi4gOy0pCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgWnVydWVja2dlbGllZmVydCB3aXJkIGVpbiBBcnJheSB2b24gU3RyaW5ncywgamVkZXMgRWxlbWVudCBpc3QgZWluZSBVSUQsCisgICAgZnVlciBkaWUgZGllciBNYWdpZXIgamV0enQgZXhwbGl6aXQgZWluZ2V0cmFnZW4gaXN0LgorCitCRUlTUElFTEU6CisgICAgbWFzdGVyKCktPlJlbW92ZVdpemFyZEZyb21VSUQoInAud2F0ZXJsdWgiLCJ6b29rIik7CisJCQorICAgIHN0cmluZyAqdWlkcyA9IG1hc3RlcigpLT5SZW1vdmVXaXphcmRGcm9tVUlEKCJqb2YiLCJ6b29rIik7CisgICAgcHJpbnRmKCJab29rIGlzdCBudW4gZXhwbGl6aXQgenVzdGFlbmRpZyBmdWVyOiAlc1xuIixDb3VudFVwKHVpZHMpKTsKKworU0lFSEUgQVVDSDoKKyAgICBRdWVyeVdpemFyZHNGb3JVSUQoKSwgUXVlcnlVSURzRm9yV2l6YXJkKCkKKwkJQWRkV2l6YXJkRm9yVUlEKCkKKworMjAuMDIuMjAwNywgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9tYXRjaF9pZHMgYi9kb2MvbGZ1bi9tYXRjaF9pZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJjOTg1YgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL21hdGNoX2lkcwpAQCAtMCwwICsxLDQ3IEBACittYXRjaF9pZHMoKQorCitGVU5LVElPTjoKKyAgICAgaW50IG1hdGNoX2lkcyhzdHJpbmcgKmxpc3QpOworCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvdGhpbmcvZGVzY3JpcHRpb24uYworCitBUkdVTUVOVEU6CisgICAgICpsaXN0CVN0cmluZy1BcnJheSBtaXQgenUgdGVzdGVuZGVuIElEcworCitCRVNDSFJFSUJVTkc6CisgICAgIERpZSBMaXN0ZSBkZXIgdWViZXJnZWJlbmVuIElEcyB3aXJkIG1pdCBkZW4gSURzIGRlcyBPYmpla3RlcworICAgICBVTkQtVmVya251ZXBmdC4gRGllIEdyb2Vzc2UgZGVzIHJlc3VsdGllcmVuZGVuIEFycmF5cyB3aXJkCisgICAgIHp1cnVlY2tnZWdlYmVuLgorICAgICBEaWVzZSBGdW5rdGlvbiBlcmxhdWJ0IGFsc28gZGFzIGdsZWljaHplaXRpZ2UgUHJ1ZWZlbiBhdWYKKyAgICAgbWVocmVyZSBJRHMuIEFsbGVyZGluZ3Mgd2VyZGVuIC0gaW0gR2VnZW5zYXR6IHp1IGlkKCkgLQorICAgICBBZGpla3RpdmUgdW5kIEF1c2RydWVja2UgZGVyIEFydCAiPElEPiA8bnVtbWVyPiIgbmljaHQKKyAgICAgYmVydWVja3NpY2h0aWd0LgorICAgICBFYmVuc28gd2VyZGVuIFNwZXppYWxpdGFldGVuIHdpZSBVbml0b2JqZWt0ZSB1bmQgT2JqZWt0ZSBtaXQKKyAgICAgdWViZXJzY2hyaWViZW5lbSBpZCgpIG5pY2h0IGJlcnVlY2tzaWNodGlndCEgSW0gWndlaWZlbHNmYWxsIGlzdCBkYWhlcgorICAgICBkb2NoIGRpZSBOdXR6dW5nIHZvbiBpZCgpIHp1IGVtcGZlaGxlbi4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgQW56YWhsIGRlciB6dXRyZWZmZW5kZW4gSURzLgorCitCRUlTUElFTEU6CisgICAgIEFuZ2Vub21tZW4sIGVpbiBPYmpla3QgaGFiZSBmb2xnZW5kZSBCZXplaWNobmVyOgorCisgICAgIEFkZElkKCAoeyJtdXJtZWwiLCJrdWdlbCIsImdsYXNtdXJtZWwiLCJnbGFza3VnZWwifSkgKTsKKyAgICAgQWRkQWRqZWN0aXZlKCAicnVuZCIgKTsKKworICAgICBEYW5uIGxpZWZlcm4gZGllIGFuZ2VnZWJlbmVuIG1hdGNoX2lkcygpLUF1ZnJ1ZmUgZm9sZ2VuZGUgRXJnZWJuaXNzZToKKworICAgICBtYXRjaF9pZHMoICh7Im11cm1lbCIsInN0ZWluIn0pICk7ICAgICAgICAgPT4gMQorICAgICBtYXRjaF9pZHMoICh7Im11cm1lbCIsImt1Z2VsIn0pICk7ICAgICAgICAgPT4gMgorICAgICBtYXRjaF9pZHMoICh7InJ1bmRlIG11cm1lbCJ9KSApOyAgICAgICAgICAgPT4gMAorICAgICBtYXRjaF9pZHMoICh7Im11cm1lbCAyIn0pICk7ICAgICAgICAgICAgICAgPT4gMCwgYXVjaCB3ZW5uIGRpZXMgZGllIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6d2VpdGUgTXVybWVsIGluIGRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbGVpY2hlbiBVbWdlYnVuZyBpc3QKKworU0lFSEUgQVVDSDoKKyAgICAgQWRkSWQoKSwgQWRkQWRqZWN0aXZlKCksIEFkZFNpbmd1bGFySWQoKSwgQWRkUGx1cmFsSWQoKSwgcHJlc2VudCgpLAorICAgICBpZCgpLCAvc3RkL3RoaW5nL2Rlc2NyaXB0aW9uLmMsIC9zdGQvdW5pdC5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFNhdCBNYXIgMTUgMjE6NDA6MDAgMjAwMCBieSBQYXJhY2Vsc3VzCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9tb3ZlIGIvZG9jL2xmdW4vbW92ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzIzYzM0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vbW92ZQpAQCAtMCwwICsxLDIxMiBAQAorbW92ZSgpCisKK0ZVTktUSU9OOiAKKyAgICAgRnVlciB1bmJlbGVidGUgR2VnZW5zdGFlbmRlICgvc3RkL3RoaW5nKToKKyAgICAgICB2YXJhcmdzIGludCBtb3ZlKG9iamVjdHxzdHJpbmcgZGVzdCwgaW50IG1ldGhvZCk7CisKKyAgICAgRnVlciBMZWJld2VzZW4gKC9zdGQvbGl2aW5nLCAvc3RkL25wYywgdXN3Lik6CisgICAgICAgdmFyYXJncyBpbnQgbW92ZShvYmplY3R8c3RyaW5nIGRlc3QsIGludCBtZXRob2QsIHN0cmluZyBkaXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRleHRvdXQsIHN0cmluZyB0ZXh0aW4pOworCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvdGhpbmcvbW92aW5nLmMKKyAgICAgL3N0ZC9saXZpbmcvbW92aW5nLmMKKworQVJHVU1FTlRFOgorICAgICBkZXN0CisgICAgICAgICAgRGFzIFppZWxvYmpla3QgKGVudHdlZGVyIGRlciBEYXRlaW5hbWUgb2RlciBkYXMgT2JqZWt0IHNlbGJzdCkuCisKKyAgICAgbWV0aG9kCisgICAgICAgICAgRGllIEFydCBkZXIgQmV3ZWd1bmcgKGVpbmUgZGVyIHVudGVuIGF1ZmdlZnVlaHJ0ZW4gQXJ0ZW47IGVzCisgICAgICAgICAga29lbm5lbiBhdWNoIG1laHJlcmUgenVzYW1tZW5nZS1PREVSLXQgd2VyZGVuKS4KKworICAgICBkaXIKKyAgICAgICAgICBEaWUgUmljaHR1bmcsIGluIGRpZSBlaW4gTGViZXdlc2VuIGdlaHQuIE5vcm1hbGVyd2Vpc2UgaXN0IGRhcyBkaWUKKyAgICAgICAgICBlaW5nZXNjaGxhZ2VuZSBMYXVmcmljaHR1bmcgKHpCLiAibmFjaCBOb3JkZW4iKS4KKworICAgICB0ZXh0b3V0CisgICAgICAgICAgVmVybGFlc3N0IGVpbiBMZWJld2VzZW4gZWluZW4gUmF1bSwgc28gd2lyZCBkaWVzZSBNZWxkdW5nIGluIGRlbgorICAgICAgICAgIFJhdW0gZ2VzY2hpY2t0LiBJc3QgYmVpIGRpciBlaW4gU3RyaW5nIGFuZ2VnZWJlbiwgc28gd2lyZCBkaWVzZXIKKyAgICAgICAgICBub2NoIGFuIHRleHRvdXQgYW5nZWhhZW5ndC4gRGVyIE5hbWUgZGVzIExlYmV3ZXNlbnMgd2lyZCBkZXIKKyAgICAgICAgICBNZWxkdW5nIGluIGplZGVtIEZhbGwgdm9yYW5nZXN0ZWxsdC4KKworICAgICB0ZXh0aW4KKyAgICAgICAgICBEaWVzZXIgVGV4dCB3aXJkIGltIFppZWxyYXVtIGF1c2dlZ2ViZW4sIHdlbm4gZWluIExlYmV3ZXNlbiBpaG4KKyAgICAgICAgICBiZXRyaXR0LiBCZWkgbm9ybWFsZXIgRm9ydGJld2VndW5nIGlzdCBkYXMgImtvbW10IGFuIi4gRGVtIFRleHQKKyAgICAgICAgICB3aXJkIG5vY2ggZGVyIE5hbWUgZGVzIFNwaWVsZXJzIHZvcmFuZ2VzdGVsbHQuCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRXMgd2lyZCB2ZXJzdWNodCwgZGFzIE9iamVrdCBpbiBkYXMgWmllbG9iamVrdCBkZXN0IHp1IGJld2VnZW4uCisgICAgIEFiaGFlbmdpZyB2b20gbW9tZW50YW5lbiBBdWZlbnRoYWx0c29ydCB1bmQgZGVtIFppZWxvYmpla3QgaXN0IGRpZQorICAgICBCZXdlZ3VuZ3NtZXRob2RlIG1ldGhvZCB6dSB3YWVobGVuLgorCisgICAgIEluIDxtb3ZpbmcuaD4gc2luZCBmb2xnZW5kZSBLb25zdGFudGVuIGZ1ZXIgZGllIEFydCBkZXIgQmV3ZWd1bmcKKyAgICAgZGVmaW5pZXJ0OgorICAgICBNX05PQ0hFQ0sKKyAgICAgICAgICBFcyB3ZXJkZW4ga2VpbmUgQWJmcmFnZW4gZHVyY2hnZWZ1ZWhydCwgb2IgZGFzIE9iamVrdCB1ZWJlcmhhdXB0CisgICAgICAgICAgaW4gZGFzIFppZWxvYmpla3QgaGluZWlucGFzc3QgKHdhcyB6Qi4gYXVzIEdld2ljaHRzZ3J1ZW5kZW4gZGVyCisgICAgICAgICAgRmFsbCBzZWluIGtvZW5udGUpLgorCisgICAgIE1fR08KKyAgICAgICAgICBFaW4gTGViZXdlc2VuIGJld2VndCBzaWNoIGdlaGVuZCB2b24gZWluZW0gUmF1bSBpbiBkZW4gbmFlY2hzdGVuLgorICAgICAgICAgIEJlaSBub3JtYWxlbSBHZWhlbiB3aXJkIGRpZXNlIE1ldGhvZGUgYmVudXR6dDsgbWFuIHNvbGx0ZSBzaWUgYXVjaAorICAgICAgICAgIGJlbnV0emVuLCB3ZW5uIG1hbiBTcGllbGVyIHVlYmVyIGVpbmVuIFNwZWNpYWxFeGl0IGluIGVpbmVuCisgICAgICAgICAgYmVuYWNoYmFydGVuIFJhdW0gYmV3ZWd0LgorCisgICAgIE1fVFBPUlQKKyAgICAgICAgICBFaW4gTGViZXdlc2VuIHdpcmQgdm9uIGVpbmVtIFJhdW0gaW4gZWluZW4gYW5kZXJlbiB0ZWxlcG9ydGllcnQuCisgICAgICAgICAgSW0gR2VnZW5zYXR6IHp1IE1fR08ga2FubiBlaW4gUmF1bSB2ZXJoaW5kZXJuLCBkYXNzIG1hbiBpaG4KKyAgICAgICAgICBtaXR0ZWxzIE1fVFBPUlQgdmVybGFlc3N0IG9kZXIgYmV0cml0dC4KKworICAgICBNX05PX1NIT1cKKyAgICAgICAgICBCZWltIEJld2VnZW4gdm9uIExlYmV3ZXNlbiBiZWtvbW1lbiBkaWVzZSBkaWUgQmVzY2hyZWlidW5nIGRlcworICAgICAgICAgIFppZWxyYXVtZXMgbmljaHQgYXVzZ2VnZWJlbi4KKworICAgICBNX05PX0FUVEFDSworICAgICAgICAgIEJlaW0gQmV3ZWdlbiB2b24gTGViZXdlc2VuIGJla29tbWVuIGRpZXNlIGtlaW5lbgorICAgICAgICAgIEJlZ3J1ZXNzdW5nc3NjaGxhZywgd2VubiBlaW4gRmVpbmQgaW0gWmllbHJhdW0gc3RlaHQuCisKKyAgICAgTV9TSUxFTlQKKyAgICAgICAgICBFcyB3ZXJkZW4gYmVpbSBCZXdlZ2VuIGtlaW5lIE1lbGR1bmdlbiBhdXNnZWdlYmVuLiBEaWVzZXIKKyAgICAgICAgICBQYXJhbWV0ZXIgd2lya3Qgc2ljaCBudXIgYXVmIGRhcyBCZXdlZ2VuIHZvbiBMZWJlbndlc2VuIGF1cy4KKworICAgICBNX0dFVAorICAgICAgICAgIERhcyBPYmpla3Qgd2lyZCB2b24gZWluZW0gdW5iZWxlYnRlbiBPYmpla3QgKHpCLiBlaW5lbSBSYXVtLCBlaW5lcgorICAgICAgICAgIExlaWNoZSwgZWluZW0gQmV1dGVsKSBpbiBlaW4gbGViZW5kZXMgT2JqZWt0IChTcGllbGVyIG9kZXIgTlBDKQorICAgICAgICAgIGJld2VndC4KKworICAgICBNX1BVVAorICAgICAgICAgIERhcyBPYmpla3Qgd2lyZCB2b24gZWluZW0gbGViZW5kZW4gT2JqZWt0IGluIGVpbiB1bmJlbGVidGVzIE9iamVrdAorICAgICAgICAgIGJld2VndC4KKworICAgICBNX0dJVkUKKyAgICAgICAgICBEYXMgT2JqZWt0IHdpcmQgdm9uIGVpbmVtIExlYmV3ZXNlbiBhbiBlaW4gYW5kZXJlcyBMZWJld2VzZW4KKyAgICAgICAgICB3ZWl0ZXJnZXJlaWNodC4KKworICAgICBNX01PVkVfQUxMIChOdXIgZnVlciBPYmpla3RlLCBkaWUgL3N0ZC91bml0LmMgZXJiZW4pCisgICAgICAgICAgRXMgd2lyZCBkaWUgZ2VzYW10ZSBNZW5nZSBiZXdlZ3QsIG5pY2h0IG51ciBlaW4gVGVpbC4KKworICAgICBTb2xsIGRhcyBPYmpla3QgYXVmIGplZGVuIEZhbGwgdW5kIG9obmUgamVkZSBBYmZyYWdlIGJld2VndCB3ZXJkZW4sIHNvCisgICAgIHJlaWNodCBlcywgYWxzIG1ldGhvZCBNX05PQ0hFQ0sgenUgdWViZXJnZWJlbi4KKworICAgICBXYWZmZW4gdW5kIFJ1ZXN0dW5nZW4gd2VyZGVuLCBzb3dlaXQgc2llIGdlenVlY2t0IGJ6dy4gYW5nZXpvZ2VuIHNpbmQsCisgICAgIGJlaW0gQmV3ZWdlbiBhdWYgamVkZW4gRmFsbCB3ZWdnZXN0ZWNrdCBiencuIGF1c2dlem9nZW4uIElzdCBpbiBtZXRob2QKKyAgICAgTV9TSUxFTlQgZW50aGFsdGVuLCBzbyBnZXNjaGllaHQgZGllcyBvaG5lIE1lbGR1bmdlbi4KKworICAgICBEaWUgZXJzdGUgQXJ0IGRlcyBGdW5rdGlvbnNhdWZydWZzIGlzdCBzb3dvaGwgYmVpbSBCZXdlZ2VuIHZvbgorICAgICBMZWJld2VzZW4gYWxzIGF1Y2ggdm9uIHVuYmVsZWJ0ZW4gT2JqZWt0ZW4gbW9lZ2xpY2guIERpZSB6d2VpdGUgQXJ0CisgICAgIGxhZXNzdCBzaWNoIG51ciBiZWkgTGViZXdlc2VuIGFud2VuZGVuLgorCitBTk1FUktVTkc6CisgICAgIERpZXNlIEZ1bmt0aW9uIHNvbGx0ZSBuaWNodCAobWVocikgdWViZXJzY2hyaWViZW4gd2VyZGVuLiBTdGF0dGRlc3NlbgorICAgICBncmVpZnQgYml0dGUgYXVmIFByZXZlbnRNb3ZlKCkgdW5kIE5vdGlmeU1vdmUoKSB6dXJ1ZWNrLiBSTXMgc2luZAorICAgICBhdWZnZXJ1ZmVuLCBPYmpla3QgbWl0IHVlYmVyc2NocmllYmVuZW4gbW92ZSgpIG51ciBub2NoIGRhbm4KKyAgICAgYW56dXNjaGxpZXNzZW4sIHdlbm4gZGVyIFp3ZWNrIHNvbnN0IG5pY2h0IGVycmVpY2h0IHdlcmRlbiBrYW5uLiBTb2xsdGV0CisgICAgIGlociBtb3ZlKCkgdWViZXJzY2hyZWliZW46IFNlaWQgZXVjaCBzZWhyIGdlbmF1IGltIGtsYXJlbiwgd2FzIG1vdmUoKQorICAgICBnZW5hdSBtYWNodC4gOy0pCisgICAgIAorICAgICBXZW5uIExpdmluZ3MgYmV3ZWd0IHdlcmRlbiwgc29yZ3QgbW92ZSgpIGF1dG9tYXRpc2NoIGluIEFiaGFlbmdpZ2tlaXQKKyAgICAgdm9uIFBfUEFSQSBkYWZ1ZXIsIGRhc3MgZGFzIExlYmV3ZXNlbiBpbiBkZXIga29ycmVrdGVuIChQYXJhbGxlbC0pV2VsdAorICAgICBsYW5kZXQuCisKKyAgICAgQmVpIEdlZ2Vuc3RhZW5kZW4gd2lyZCBlYmVuZmFsbHMgdmVyc3VjaHQsIGRpZSByaWNodGlnZSBaaWVsd2VsdAorICAgICBhdXN6dXdhZWhsZW4gKGRhbWl0IHouQi4gaW4gZGVyIFBhcmFsbGVsd2VsdCBnZXdvcmZlbmUgQnVtZXJhbmdzIGF1Y2ggbnVyCisgICAgIGlubmVyaGFsYiBkZXIgUGFyYWxsZWx3ZWx0IGZsaWVnZW4pLiBVbSBSZWNoZW56ZWl0IHp1IHNwYXJlbiwgd2lyZCBkYXMKKyAgICAgYWxsZXJkaW5ncyBudXIgdmVyc3VjaHQsIHdlbm4gJ2Rlc3QnIGVpbiBGaWxlbmFtZSBpc3QgdW5kIGtlaW4gT2JqZWt0LgorCisgICAgIEdydW5kOiBiZWkgWmllbG9iamVrdGVuIGhhbmRlbHQgZXMgc2ljaCBtZWlzdCB1bSBCZXdlZ3VuZ2VuIGluIGRhcyBJbnYKKyAgICAgb2RlciBFbnYgZWluZXMgU3BpZWxlcnMgLSB1bmQgZGllIHNpbmQgdW5pbnRlcmVzc2FudC4gUmF1bXdlY2hzZWwgZGFnZWdlbgorICAgICBlcmZvbGdlbiBmYXN0IGltbWVyIHVudGVyIEFuZ2FiZSBlaW5lcyBGaWxlbmFtZW5zIGFuc3RhdHQgZWluZXMgT2JqZWt0ZXMuCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIEFsbGUgUnVlY2tnYWJld2VydGUgc2luZCBhbHMgc3ltYm9saXNjaGUgS29uc3RhbnRlbiBpbiA8bW92aW5nLmg+CisgICAgIGRlZmluaWVydC4gKE1PVkVfT0sgaXN0IDEsIGFsbGUgYW5kZXJlbiBzaW5kIDwwIHVuZCBzeW1ib2xpc2llcmVuIEZlaGxlci4KKyAgICAgVHJhZGl0aW9uZWxsIGVyZm9sZ3QgZGllIFBydWVmdW5nIGF1ZiBlcmZvbGdyZWljaGVzIE1vdmUgbWl0ID09IDEsIGluCisgICAgIFp1a3VuZnQgd2lyZCA9PSBNT1ZFX09LIGVtcGZvaGxlbi4pCisgICAgIAorICAgICBNT1ZFX09LCisgICAgICAgICAgRGllIEJld2VndW5nIHd1cmRlIGVyZm9sZ3JlaWNoIGFiZ2VzY2hsb3NzZW4uCisKKyAgICAgTUVfUExBWUVSCisgICAgICAgICAgTGViZXdlc2VuIGxhc3NlbiBzaWNoIG5pY2h0IG9obmUgd2VpdGVyZXMgYmV3ZWdlbi4gRXMgbXVzcworICAgICAgICAgIG1pbmRlc3RlbnMgZWluZSBkZXIgTWV0aG9kZW4gTV9OT0NIRUNLLCBNX0dPIG9kZXIgTV9UUE9SVAorICAgICAgICAgIGFuZ2VnZWJlbiB3ZXJkZW4uCisKKyAgICAgTUVfVE9PX0hFQVZZCisgICAgICAgICAgRGFzIFppZWxvYmpla3Qga2FubiBkaWVzZXMgT2JqZWt0IGF1cyBHZXdpY2h0c2dydWVuZGVuIG5pY2h0IG1laHIKKyAgICAgICAgICBhdWZuZWhtZW4uCisKKyAgICAgTUVfQ0FOVF9UUE9SVF9JTgorICAgICAgICAgIERhcyBaaWVsb2JqZWt0IHZlcmJpZXRldCBkYXMgVGVsZXBvcnRpZXJlbiBpbiBzaWNoIGhpbmVpbiAobnVyIGJlaQorICAgICAgICAgIE1fVFBPUlQgb2huZSBNX05PQ0hFQ0spLgorCisgICAgIE1FX0NBTlRfVFBPUlRfT1VUCisgICAgICAgICAgRGVyIFJhdW0sIGluIGRlbSBzaWNoIGRhcyBMZWJld2VzZW4gYmVmaW5kZXQsIHZlcmJpZXRldCBkYXMKKyAgICAgICAgICBUZWxlcG9ydGllcmVuIGF1cyBzaWNoIGhpbmF1cyAobnVyIGJlaSBNX1RQT1JUIG9obmUgTV9OT0NIRUNLKS4KKworICAgICBNRV9DQU5UX0JFX0RST1BQRUQKKyAgICAgICAgICBEYXMgT2JqZWt0IGthbm4gbmljaHQgZmFsbGVuIGdlbGFzc2VuIHdlcmRlbiAoekIuIHdlaWwgUF9OT0RST1AKKyAgICAgICAgICBnZXNldHp0IGlzdCkuCisKKyAgICAgTUVfQ0FOVF9CRV9UQUtFTgorICAgICAgICAgIERhcyBPYmpla3Qga2FubiBuaWNodCBnZW5vbW1lbiB3ZXJkZW4gKHpCLiB3ZWlsIFBfTk9HRVQgZ2VzZXR6dAorICAgICAgICAgIGlzdCkuCisKKyAgICAgTUVfQ0FOVF9CRV9JTlNFUlRFRAorICAgICAgICAgIERhcyBaaWVsb2JqZWt0IHZlcmhpbmRlcnQgZGFzIEVpbmZ1ZWdlbiBhdXMgYmVzdGltbXRlbiBHcnVlbmRlbi4KKworICAgICBNRV9DQU5UX0xFQVZFX0VOVgorICAgICAgICAgIERlciBDb250YWluZXIgdmVyaGluZGVydCBlaW4gdmVybGFzc2VuIGRlcyBPYmpla3RlcworCisgICAgIE1FX1RPT19IRUFWWV9GT1JfRU5WCisgICAgICAgICAgRWluIE9iamVrdCBrYW5uIGVpbmVuIEJlaGFlbHRlciBuaWNodCB2ZXJsYXNzZW4sIGRhIGVzIGRlbSAKKyAgICAgICAgICBMZWJld2VzZW4gc29uc3QgenUgc2Nod2VyIHd1ZXJkZS4KKworICAgICBUT09fTUFOWV9PQkpFQ1RTCisgICAgICAgICAgRGFzIFppZWxvYmpla3Qga2FubiBzb3ZpZWxlIE9iamVrdGUgbmljaHQgbWVociBhdWZuZWhtZW4uCisKKyAgICAgTUVfTk9UX0FMTE9XRUQKKyAgICAgICAgICBSYWV1bWUgbWl0IGdlc2V0enRlciBQcm9wZXJ0eSBQX05PX1BMQVlFUlMga29lbm5lbiBudXIgdm9uCisgICAgICAgICAgVGVzdHNwaWVsZXJuIHVuZCBNYWdpZXJuIGJldHJldGVuIHdlcmRlbi4gQmVpIFNwaWVsZXJuIG9kZXIKKyAgICAgICAgICBHaWxkZW50ZXN0aWVzIGdpYnQgZXMgZGllc2UgRmVobGVybWVsZHVuZy4KKyAgICAgTUVfV0FTX0RFU1RSVUNURUQKKyAgICAgICAgICBEYXMgT2JqZWt0IGhhdCBzaWNoIGVudHdlZGVyIGltIFZlcmxhdWZlIGRlciBCZXdlZ3VuZyBzZWxic3QKKyAgICAgICAgICB6ZXJzdG9lcnQgb2RlciB3dXJkZSB6ZXJzdG9lcnQsIHNvZGFzcyBtb3ZlKCkgbmljaHQgZXJmb2xncmVpY2gKKyAgICAgICAgICBiZWVuZGV0IHdlcmRlbiBrb25udGUuIChCc3A6IHNlbnNpdGl2ZSBPYmpla3RlKQorCisgICAgIE1FX0RPTlRfV0FOVF9UT19CRV9NT1ZFRAorICAgICAgICAgIERhcyBPYmpla3QgbW9lY2h0ZSBuaWNodCBiZXdlZ3Qgd2VyZGVuLgorCitCRUlTUElFTEU6CisgICAgICAgIG8gRWluIE9iamVrdCAiZ2lidCBzaWNoIiBkZW0gU3BpZWxlcjoKKworICAgICAgICAgIG1vdmUodGhpc19wbGF5ZXIoKSwgTV9HRVQpOworCisgICAgICAgIG8gRWluIExlYmV3ZXNlbiB3aXJkIGluIGRpZSBBYmVudGV1cmVyZ2lsZGUgdGVsZXBvcnRpZXJ0OgorCisgICAgICAgICAgbHYtPm1vdmUoIi9naWxkZW4vYWJlbnRldXJlciIsIE1fVFBPUlQpOworCisgICAgICAgIG8gRWluIFNwaWVsZXIgIndpcmQgaW4gZGllIEdpbGRlIGdlZ2FuZ2VuIjoKKworICAgICAgICAgIHRoaXNfcGxheWVyKCktPm1vdmUoIi9naWxkZW4vYWJlbnRldXJlciIsIE1fR08sICJpbiBkaWUgR2lsZGUiKTsKKworICAgICAgICAgIFNwaWVsZXIsIGRpZSBtaXQgaWhtIGltIGdsZWljaGVuIFJhdW0gc3RlaGVuLCBzZWhlbiBmb2xnZW5kZQorICAgICAgICAgIE1lbGR1bmc6CisgICAgICAgICAgIjxuYW1lPiBnZWh0IGluIGRpZSBHaWxkZS4iCisKKyAgICAgICAgbyBFaW4gU3BpZWxlciBzY2h3aW1tdCBkdXJjaHMgTWVlcjoKKworICAgICAgICAgIHRoaXNfcGxheWVyKCktPm1vdmUoIm1lZXJfeHkiLCBNX0dPLCAibmFjaCBOb3JkZW4iLCAic2Nod2ltbXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNjaHdpbW10IGhlcmVpbiIpOworCisgICAgICAgICAgU3BpZWxlciBpbiBzZWluZW0gU3RhcnRyYXVtIHNlaGVuICI8bmFtZT4gc2Nod2ltbXQgbmFjaCBOb3JkZW4uIiwKKyAgICAgICAgICBTcGllbGVyIGluIHNlaW5lbSBaaWVscmF1bSBzZWhlbiAiPG5hbWU+IHNjaHdpbW10IGhlcmVpbi4iCisKK1NJRUhFIEFVQ0g6CisgICAgIG1vdmVfb2JqZWN0KCksIHJlbW92ZSgpLCBzZXRtaW4sIHNldG1taW4sIHNldG1vdXQsIHNldG1tb3V0LCByZXZpZXcsCisgICAgIFByZXZlbnRJbnNlcnQoKSwgUHJldmVudExlYXZlKCksIFByZXZlbnRJbnNlcnRMaXZpbmcoKSwKKyAgICAgUHJldmVudExlYXZlTGl2aW5nKCksIFByZXZlbnRNb3ZlKCksIE5vdGlmeUluc2VydCgpLCBOb3RpZnlMZWF2ZSgpLAorICAgICBOb3RpZnlNb3ZlKCksIE5vdGlmeVJlbW92ZSgpLCBpbml0KCksIGV4aXQoKSwKKyAgICAgUF9OT19QTEFZRVJTLCBQX1BBUkEsIC9zdGQvdGhpbmcvbW92aW5nLmMsIC9zdGQvbGl2aW5nL21vdmluZy5jCisgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisyMDE1LUphbi0xOSwgQXJhdGhvcm4KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL21vdmVkX29iamVjdHMgYi9kb2MvbGZ1bi9tb3ZlZF9vYmplY3RzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkY2JkNmUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9tb3ZlZF9vYmplY3RzCkBAIC0wLDAgKzEsMzAgQEAKK21vdmVkX29iamVjdHMoKQorCitGVU5LVElPTjoKKyAgICBwdWJsaWMgb2JqZWN0ICptb3ZlZF9vYmplY3RzKHZvaWQpOworCitERUZJTklFUlQgSU46CisgICAgL3N0ZC9saXZpbmcvcHV0X2FuZF9nZXQuYworCitBUkdVTUVOVEU6CisgICAga2VpbmUKKworQkVTQ0hSRUlCVU5HOgorICAgIE1pdCBkaWVzZXIgRnVua3Rpb24gbGFzc2VuIHNpY2ggZGllIE9iamVrdGUgZXJtaXR0ZWxuLCBkaWUgZGFzIExlYmV3ZXNlbgorICAgIGJlaW0gbGV0enRlbiBBdWZydWYgdm9uIGRyb3Bfb2JqZWN0cyhMKSBvZGVyIGVpbmVyIGFlaG5saWNoZW4gRnVua3Rpb24KKyAgICBiZXdlZ3QgaGF0LgorCitSVUVDS0dBQkVXRVJUOgorICAgIEFycmF5IG1pdCBkZW4genVsZXR6dCBiZXdlZ3RlbiBPYmpla3Rlbiwgb2RlciBlaW4gbGVlcmVzIEFycmF5LCBmYWxscworICAgIGtlaW5lIE9iamVrdGUgYXVmIGRpZSBCZXNjaHJlaWJ1bmcgZGVzIGxldHp0ZW4gZHJvcF9vYmplY3RzKCkgLyAKKyAgICBwaWNrX29iamVjdHMoKSAvIHB1dF9vYmplY3RzKCkgLyBnaXZlX29iamVjdHMoKSBwYXNzdGVuLgorCitCRUlTUElFTEU6CisgICAgc2llaGUgZHJvcF9vYmplY3RzKCkgdW5kIGdpdmVfb2JqZWN0cygpCisKK1NJRUhFIEFVQ0g6CisgICAgZHJvcF9vYmplY3RzKEwpLCBnaXZlX29iamVjdHMoTCksIHBpY2tfb2JqZWN0cyhMKSwgcHV0X29iamVjdHMoTCksCisgICAgc2hvd19vYmplY3RzKEwpLCBOb3RpZnlNb3ZlKEwpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFRodSBBdWcgMjggMjI6MTk6MjYgMjAwOCBieSBBbXludGhvcgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vbW92ZWRfd2hlcmUgYi9kb2MvbGZ1bi9tb3ZlZF93aGVyZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmI3ZTljCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vbW92ZWRfd2hlcmUKQEAgLTAsMCArMSwyOCBAQAorbW92ZWRfd2hlcmUoKQorCitGVU5LVElPTjoKKyAgICBwdWJsaWMgb2JqZWN0IG1vdmVkX3doZXJlKHZvaWQpOworCitERUZJTklFUlQgSU46CisgICAgL3N0ZC9saXZpbmcvcHV0X2FuZF9nZXQuYworCitBUkdVTUVOVEU6CisgICAga2VpbmUKKworQkVTQ0hSRUlCVU5HOgorICAgIE1pdCBkaWVzZXIgRnVua3Rpb24gbGFlc3N0IHNpY2ggZXJtaXR0ZWxuLCB3b2hpbiBkYXMgTGViZXdlc2VuIHp1bGV0enQKKyAgICBtaXR0ZWxzIHB1dF9vYmplY3RzKEwpIG9kZXIgZ2l2ZV9vYmplY3RzKEwpIGV0d2FzIGJld2VndCBvZGVyIHdlbSBlcyBtaXQKKyAgICBzaG93X29iamVjdHMoTCkgZXR3YXMgZ2V6ZWlndCBoYXQuCisKK1JVRUNLR0FCRVdFUlQ6CisgICAgRGVyIENvbnRhaW5lciBvZGVyIGRhcyBMZWJld2VzZW4sIHdvaGluIGRpZSBHZWdlbnN0YWVuZGUgYmV3ZWd0IHd1cmRlbi4KKworQkVJU1BJRUw6CisgICAgc2llaGUgZ2l2ZV9vYmplY3RzKCkKKworU0lFSEUgQVVDSDoKKyAgICBwdXRfb2JqZWN0cyhMKSwgZ2l2ZV9vYmplY3RzKEwpLCBzaG93X29iamVjdHMoTCksIE5vdGlmeUluc2VydChMKSwKKyAgICBQX0xBU1RfQ09OVEVOVF9DSEFOR0UKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogVGh1IEF1ZyAyOCAyMjoxNjoxNSAyMDA4IGJ5IEFteW50aG9yCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9tdXN0ZXIgYi9kb2MvbGZ1bi9tdXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUxOWY2OQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL211c3RlcgpAQCAtMCwwICsxLDE2IEBACittdXN0ZXIoKQorCitGVU5LVElPTjoKKwl0eXBlIG11c3RlciguLi4pCisJCitBUkdVTUVOVEU6CisJCitCRVNDSFJFSUJVTkc6CisKK1JVRUNLR0FCRVdFUlQ6CisJCitCRU1FUktVTkc6CisJCitCRUlTUElFTDoKKworU0lFSEUgQVVDSDoKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL25hbWUgYi9kb2MvbGZ1bi9uYW1lCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZTUwZmEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9uYW1lCkBAIC0wLDAgKzEsNTAgQEAKK25hbWUoKQorCitGVU5LVElPTjoKKyAgICAgdmFyYXJncyBzdHJpbmcgbmFtZShpbnQgY2FzdXMsIGludCBkZW1vbik7CisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC90aGluZy9kZXNjcmlwdGlvbi5jCisKK0FSR1VNRU5URToKKyAgICAgY2FzdXMKKyAgICAgICAgICBEZXIgRmFsbCwgaW4gZGVtIGRlciBOYW1lIGRla2xpbmllcnQgd2VyZGVuIHNvbGwuCisgICAgIGRlbW9uCisgICAgICAgICAgR2lidCBhbiwgb2IgZGVyIE5hbWUgbWl0IGJlc3RpbW10ZW0gb2RlciB1bmJlc3RpbW10ZW0gQXJ0aWtlbAorICAgICAgICAgIHZlcnNlaGVuIHdlcmRlbiBzb2xsOgorICAgICAgICAgICAgICsgZGVtb24gPSAwOiBVbmJlc3RpbW10ZXIgQXJ0aWtlbC4KKyAgICAgICAgICAgICArIGRlbW9uID0gMTogQmVzdGltbXRlciBBcnRpa2VsLgorICAgICAgICAgICAgICsgZGVtb24gPSAyOiBGaW5kZSBzZWxic3QgaGVyYXVzLCBvYiBlaW4gYmVzdGltbXRlciBvZGVyIGVpbgorICAgICAgICAgICAgICAgdW5iZXN0aW1tdGVyIEFydGlrZWwgdmVyd2VuZGV0IHdlcmRlbiBzb2xsLgorCitCRVNDSFJFSUJVTkc6CisgICAgIERpZXNlIEZ1bmt0aW9uIGVybWl0dGVsdCBkZW4gTmFtZW4gZGVzIE9iamVrdGVzIGltIGdld3VlbnNjaHRlbiBGYWxsCisgICAgIHVuZCBtaXQgZGVtIGFuZ2VnZWJlbmVuIEFydGlrZWwuIE1vZWdsaWNoZSBXZXJ0ZSBmdWVyIGNhc3VzIHNpbmQgaW4KKyAgICAgPHRoaW5nL2xhbmd1YWdlLmg+IGRlZmluaWVydC4gV2VpdGVyaGluIHdlcmRlbiBhdWNoIChmYWxscyBhbmdlZ2ViZW4pCisgICAgIGRpZSBOYW1lbnNhZGpla3RpdmUgZGVrbGluaWVydCB1bmQgaW4gZGVuIE5hbWVuIGVpbmdlYmF1dC4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgU3RyaW5nIG1pdCBkZW0gTmFtZW4gZGVzIE9iamVrdGVzLgorCitCRU1FUktVTkdFTjoKKyAgICAgRmFsbHMgUF9BUlRJQ0xFIGdlc2V0enQgaXN0LCB3ZXJkZW4gd2VkZXIgQXJ0aWtlbCBub2NoIE5hbWVuc2FkamVrdGl2ZQorICAgICBpbiBkZW4gTmFtZW4gZWluZ2ViYXV0LgorCisgICAgIFdlbm4gbWFuIGFscyBjYXN1cyBSQVcgYW5naWJ0LCB3aXJkIGRlciBOYW1lIGltIE5vbWluYXRpdiBvaG5lIEFydGlrZWwKKyAgICAgdW5kIE5hbWVuc2FkamVrdGl2ZSB6dXJ1ZWNrZ2VnZWJlbi4KKworQkVJU1BJRUxFOgorICAgICBXZW5uIGRhcyBPYmpla3QgZWluIEJhbGwgbWl0IFBfTkFNRT0iQmFsbCIgdW5kIFBfTkFNRV9BREo9ImtsZWluIiBpc3QsCisgICAgIHNvIGxpZWZlcm4gZGllIGZvbGdlbmRlbiBBdWZydWZlIGRpZSBhbmdlZ2ViZW5lbiBFcmdlYm5pc3NlOgorCisgICAgIG5hbWUoV0VSLDApOyAgICA9PiAiZWluIGtsZWluZXIgQmFsbCIKKyAgICAgbmFtZShXRVNTRU4sMSk7ID0+ICJkZXMga2xlaW5lbiBCYWxscyIKKyAgICAgbmFtZShSQVcpOyAgICAgID0+ICJCYWxsIgorICAgICBuYW1lKFdFTSwyKTsgICAgPT4gImVpbmVtIGtsZWluZW4gQmFsbCIgb2RlciAiZGVtIGtsZWluZW4gQmFsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICBhYmhhZW5naWcgZGF2b24sIHdpZXZpZWxlIEJhZWxsZSBnZXJhZGUgZGEgc2luZC4KKworU0lFSEUgQVVDSDoKKyAgICAgL3N0ZC90aGluZy9kZXNjcmlwdGlvbi5jLCBOYW1lKCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogU2F0IEF1ZyAgMyAxMToyODo1NSAyMDAyIGJ5IFZhbmlvbgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vbm90aWZ5X3BsYXllcl9jaGFuZ2UgYi9kb2MvbGZ1bi9ub3RpZnlfcGxheWVyX2NoYW5nZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzY1YWY2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vbm90aWZ5X3BsYXllcl9jaGFuZ2UKQEAgLTAsMCArMSw1NiBAQAordm9pZCBub3RpZnlfcGxheWVyX2NoYW5nZShzdHJpbmcvb2JqZWN0IHdobywgaW50IHJlaW4gWywgaW50IGludmlzXSkKKworRlVOS1RJT046CisgICAgdm9pZCAvbm90aWZ5X3BsYXllcl9jaGFuZ2Uob2JqZWN0IHdobywgaW50IHJlaW4pCisgICAgdm9pZCAvc3RkL3BsYXllci9iYXNlOjpub3RpZnlfcGxheWVyX2NoYW5nZShzdHJpbmcgd2hvLCBpbnQgcmVpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnZpcykKKyAgCitHRVJVRkVOIFZPTjoKKyAgICAvc3RkL3BsYXllci9iYXNlLmMgKGQuaC4gYWxsZSBTcGllbGVyc2hlbGxzLy1PYmpla3RlKQorCitBUkdVTUVOVEU6CisgICAgc3RyaW5nIHdobworICAgICAgZ2V0dWlkKCkgZWluZXMgU3BpZWxlcnMKKyAgICBvYmplY3Qgd2hvCisgICAgICBTcGllbGVyLU9iamVrdAorICAgIGludCByZWluCisgICAgICAwIGZ1ZXIgZGFzIE1VRCB2ZXJsYXNzZW5kZSwgMSBmdWVyIGhlcmVpbmtvbW1lbmRlIFNwaWVsZXIKKyAgICBpbnQgaW52aXMKKyAgICAgIDEgZnVlciB1bnNpY2h0YmFyZSBTcGllbGVyIChNYWdpZXIpCisKK0JFU0NIUkVJQlVORzoKKyAgICBEaWVzZSBGdW5rdGlvbiB3aXJkIHZvbiBMZWJld2VzZW4gZnVlciBoZXJlaW5rb21tZW5kZSB1bmQgZGFzIFNwaWVsCisgICAgdmVybGFzc2VuZGUgU3BpZWxlciBhbiB2ZXJzY2hpZWRlbmVuIFN0ZWxsZW4gYXVmZ2VydWZlbjoKKyAgICAKKyAgICAqIGluIGFuZGVyZW4gU3BpZWxlcm4gbWl0IG5vdGlmeV9wbGF5ZXJfY2hhbmdlKCkgbWl0IGRyZWkgUGFyYW1ldGVybgorICAgICAgLSBkaWVzIGRpZW50IGZ1ZXIgZGllICJlcndhcnRlIi1GdW5rdGlvbmFsaXRhZXQKKyAgICAqIGluIGRlciBHaWxkZSBkZXMgU3BpZWxlcm4gbWl0IHp3ZWkgUGFyYW1ldGVyCisgICAgICAtIGRhbWl0IGtvZW5uZW4gR2lsZGVuIG5vdHdlbmRpZ2UgQW5wYXNzdW5nZW4gdm9ybmVobWVuCisKKyAgICBEaWVzZSBGdW5rdGlvbmVuIHdlcmRlbiBhdWNoIGdlcnVmZW4sIHdlbm4gTWFnaWVyICJpbnZpcyAtZSIgYnp3LgorICAgICJ2aXMgZSIgYmVudXR6ZW4uCisKK0JFSVNQSUVMRToKKyAgICAvLyBpbiBlaW5lciBHaWxkZToKKyAgICB2b2lkIG5vdGlmeV9wbGF5ZXJfY2hhbmdlKG9iamVjdCBwbCwgaW50IHJlaW4pIHsKKyAgICAgIGlmIChyZWluICYmIG9iamVjdHAocGwpKSB7CisgICAgICAgIC8vIENoZWNrcywgb2IgU3BpZWxlcnNraWxscyBpbiBPcmRudW5nIHNpbmQKKyAgICAgICAgbWFwcGluZyBiZXRlID0gcGwtPlF1ZXJ5U2tpbGwoImJldGUiKTsKKyAgICAgICAgCisgICAgICAgIGlmICghbWFwcGluZ3AoYmV0ZSkpIHsKKyAgICAgICAgICBpZiAoSVNfTEVBUk5FUihwbCkgfHwgcGwtPlF1ZXJ5UHJvcChQX1RFU1RQTEFZRVIpKSB7CisgICAgICAgICAgICB0ZWxsX29iamVjdChwbCwgYnJlYWtfc3RyaW5nKAorICAgICAgICAgICAgICAiRHUgYmlzdCBlaW4ga2FwdXR0ZXIgVGVzdC1LbGVyaWtlciAuLi4iLCA3OCwKKyAgICAgICAgICAgICAgIkFya3NoYXQgdGVpbHQgZGlyIG1pdDogIikpOworICAgICAgICAgICAgLy8gbm90ZHVlcmZ0aWdlIFJlcGFyYXR1cmVuCisgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICByYWlzZV9lcnJvcigiS2xlcnVzOiBLYXB1dHRlciBvZGVyIGdlc2V0emVyIEtsZXJpa2VyIVxuIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKK1NJRUhFIEFVQ0g6CisgICAgUmVnaXN0ZXJFdmVudCBtaXQgKEVWVF9MSUJfTE9HSU4sIEVWVF9MSUJfTE9HT1VUKQorICAgIGVyd2FydGUKKworMS4gU2VwIDIwMTEgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL29ic29sZXRlL0FkZEhwSG9vayBiL2RvYy9sZnVuL29ic29sZXRlL0FkZEhwSG9vawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjI3OTUxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vb2Jzb2xldGUvQWRkSHBIb29rCkBAIC0wLDAgKzEsMjkgQEAKKyoqKioqKioqKioqKioqKioqKioqKiBPQlNPTEVURSBMRlVOICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIERpZXNlIEVmdW4gYml0dGUgbmljaHQgbWVociBiZW51dHplbiwgc29uZGVybiBzdGF0dGRlc3NlbiBkaWUgICAgICAgKgorKiBIb29rcyAocy4gL2RvYy9zdGQvaG9va3MpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitBZGRIcEhvb2soKQorRlVOS1RJT046CisgICAgIGludCBBZGRIcEhvb2sob2JqZWN0IG9iKQorCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvcGxheWVyL2xpZmUuYworCitBUkdVTUVOVEU6CisgICAgIG9iIC0gZGFzIE9iamVrdCwgZGFzIHNpY2ggZWludHJhZ2VuIG1vZWNodGUuCisKK0JFU0NIUkVJQlVORzoKKyAgICAgVHJhZWd0IGVpbiBPYmpla3QgaW4gUF9IUF9IT09LUyBlaW4sIHdlbm4gZXMgbmljaHQgc2Nob24gZGFyaW4gc3RlaHQuCisKKyAgICAgQWVuZGVybiBzaWNoIGJlaW0gU3BpZWxlciBkYW5uIEhQIG9kZXIgS1AgKG5pY2h0IGR1cmNoIFNldCgpKSwgd2lyZAorICAgICBhbiBhbGxlbiBlaW5nZXRyYWdlbmVuIE9iamVrdGVuIE5vdGlmeUhwQ2hhbmdlKCkgZ2VydWZlbi4KKworUlVFQ0tHQUJFV0VSVDoKKyAgICAgMSwgd2VubiBFcmZvbGcsIDAgc29uc3QKKworU0lFSEUgQVVDSDoKKyAgICAgR2VnZW5wYXJ0OglSZW1vdmVIcEhvb2soKQorICAgICBQcm9wczoJUF9IUF9IT09LUywgUF9IUAorICAgICBWZXJ3YW5kdDoJcmVkdWNlX2hpdF9wb2ludHMoKSwgZG9fZGFtYWdlKCksIGJ1ZmZlcl9ocCgpCisKKzIzLkZlYi4yMDA0IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9vYnNvbGV0ZS9BZGRJbnNlcnRIb29rIGIvZG9jL2xmdW4vb2Jzb2xldGUvQWRkSW5zZXJ0SG9vawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTgwMjcyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vb2Jzb2xldGUvQWRkSW5zZXJ0SG9vawpAQCAtMCwwICsxLDU5IEBACisqKioqKioqKioqKioqKioqKioqKiogT0JTT0xFVEUgTEZVTiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBEaWVzZSBFZnVuIGJpdHRlIG5pY2h0IG1laHIgYmVudXR6ZW4sIHNvbmRlcm4gc3RhdHRkZXNzZW4gZGllICAgICAgICoKKyogSG9va3MgKHMuIC9kb2Mvc3RkL2hvb2tzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQWRkSW5zZXJ0SG9vaygpCisKK0ZVTktUSU9OOgorICAgICB2b2lkIEFkZEluc2VydEhvb2sob2JqZWN0IG9iKTsKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL3BsYXllci9yZXN0cmljdGlvbnMuYworCitBUkdVTUVOVEU6CisgICAgIG9iIC0gRGFzIE9iamVrdCwgZGFzIGluZm9ybWllcnQgd2VyZGVuIHNvbGwsIHdlbm4gZWluIE9iamVrdCBkZW0KKyAgICAgICAgICBTcGllbGVyaW52ZW50YXIgaGluenVnZWZ1ZWd0IHd1cmRlLgorCitCRVNDSFJFSUJVTkc6CisgICAgIChEaWVzZSBGdW5rdGlvbmFsaXRhZXQgd3VyZGUgZXJzZXR6dCBkdXJjaCBkZW4gYWxsZ2VtZWluZW4gSG9vaworICAgICAgSF9IT09LX0lOU0VSVCB1bmQgaXN0IG51ciBub2NoIGF1cyBHcnVlbmRlbiBkZXIgS29tcGF0aWJpbGl0YWV0CisgICAgICB2b3JoYW5kZW4uKQorCisgICAgIERpZXNlIEZ1bmt0aW9uIHdpcmQgaW0gU3BpZWxlcm9iamVrdCBhdWZnZXJ1ZmVuLCB1bSBkYXMgT2JqZWt0IG9iIGFscworICAgICBIb29rLUxpc3RlbmVyIGFuenVtZWxkZW4uIEF1ZiBkaWVzZSBXZWlzZSBlaW5nZXRyYWdlbmUgTGlzdGVuZXIKKyAgICAgd2VyZGVuIGluZm9ybWllcnQsIHdlbm4gZWluIE9iamVrdCBpbnMgU3BpZWxlcmludmVudGFyIGJld2VndCB3dXJkZS4KKyAgICAgVGVjaG5pc2NoIHdpcmQgZGllIEJld2VndW5nIHVlYmVyIE5vdGlmeUluc2VydCgpIGltIFNwaWVsZXJvYmpla3QKKyAgICAgZGV0ZWt0aWVydCwgdW5kIGltIExpc3RlbmVyLU9iamVrdCB3aXJkIGRpZSBGdW5rdGlvbiBJbnNlcnROb3RpZnkoKQorICAgICBnZXJ1ZmVuLCBkaWUgYWxzIFBhcmFtZXRlciBkYXMgbmV1IGlucyBTcGllbGVyaW52ZW50YXIgYmV3ZWd0ZSBPYmpla3QKKyAgICAgdWViZXJnZWJlbiBiZWtvbW10LgorCitSVWVDS0dBQkVXRVJUOgorICAgICBrZWluZXIKKworQkVNRVJLVU5HRU46CisgICAgIERhcyBMaXN0ZW5lci1PYmpla3QgbXVzcyBzaWNoIGViZW5mYWxscyBpbSBTcGllbGVyaW52ZW50YXIgYmVmaW5kZW4sCisgICAgIGFuc29uc3RlbiB3aXJkIGRlciBlaW5nZXRyYWdlbmUgSG9vayB3aWVkZXIgZ2Vsb2VzY2h0LgorCitCRUlTUElFTDoKKyAgICAgCisgICAgIGEpIE9iamVrdCAib2IiIHdpcmQgaW0gU3BpZWxlciBhbHMgTGlzdGVuZXIgYW5nZW1lbGRldDoKKyAgICAgICAgdGhpc19wbGF5ZXIoKS0+QWRkSW5zZXJ0SG9vayhvYik7CisKKyAgICAgYikgT2JqZWt0ICJuZXciIHdpcmQgaW5zIFNwaWVsZXJpbnZlbnRhciBiZXdlZ3QsIGRhcyBTcGllbGVyb2JqZWt0CisgICAgICAgIGluZm9ybWllcnQgIm9iIiBkYXJ1ZWJlcjoKKyAgICAgICAgb2ItPkluc2VydE5vdGlmeShuZXcpOworCisgICAgIGMpIERhcyBMaXN0ZW5lci1PYmpla3QgIm9iIiByZWFnaWVydCBkYXJhdWYsIHouQi4gaW5kZW0gZXMgZGllIEZhY2tlbAorICAgICAgICBsb2VzY2h0LCBzb2Zlcm4gc2llIHZvcmhlciBicmFubnRlOgorICAgICAgICB2b2lkIEluc2VydE5vdGlmeShvYmplY3QgbmV3KSB7CisgICAgICAgICAgaWYgKCBvYmplY3RwKG5ldykgJiYgbmV3LT5pZCgiXG5mYWNrZWwiKSAmJiAKKyAgICAgICAgICAgICAgIG5ldy0+UXVlcnlQcm9wKFBfTElHSFRFRCkgKQorICAgICAgICAgICAgbmV3LT51bmxpZ2h0KCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKK1NJRUhFIEFVQ0g6CisgICAgTm90aWZ5SW5zZXJ0KCksIFJlbW92ZUluc2VydEhvb2soKSwgUXVlcnlJbnNlcnRIb29rcygpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IDE0LjA0LjIwMTAsIEFyYXRob3JuCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9vYnNvbGV0ZS9Nb2RpZnlTa2lsbEF0dHJpYnV0ZU9sZCBiL2RvYy9sZnVuL29ic29sZXRlL01vZGlmeVNraWxsQXR0cmlidXRlT2xkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZDlhZmMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9vYnNvbGV0ZS9Nb2RpZnlTa2lsbEF0dHJpYnV0ZU9sZApAQCAtMCwwICsxLDkwIEBACitNb2RpZnlTa2lsbEF0dHJpYnV0ZU9sZCgpCisKK0ZVTktUSU9OOgorICAgIHZhcmFyZ3MgaW50IE1vZGlmeVNraWxsQXR0cmlidXRlT2xkKG9iamVjdCBjYXN0ZXIsIHN0cmluZyBhdHJuYW1lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWUsIGludCBkdXJhdGlvbiwgbWl4ZWQgZnVuKQorCitERUZJTklFUlQgSU46CisgICAgL3N0ZC9saXZpbmcvc2tpbGxfYXR0cmlidXRlcy5jCisKK0FSR1VNRU5URToKKyAgICA8Y2FzdGVyPiAgICBJR05PUklFUlQKKyAgICAgICAgICAgICAgICBmcnVlaGVyIE9iamVrdCwgZGFzIGRpZSBNb2RpZmlrYXRpb24gdm9ybmltbXQsIGhldXRlIGlzdAorICAgICAgICAgICAgICAgIGRpZXNlcyBBcmd1bWVudCBvaG5lIEJlZGV1dHVuZyB1bmQgd2lyZCBpZ25vcmllcnQuCisKKyAgICA8YXRybmFtZT4gICBTVFJJTkcKKyAgICAgICAgICAgICAgICBOYW1lIGRlcyB6dSB2ZXJhZW5kZXJuZGVuIEF0dHJpYnV0ZXMKKyAgICAgICAgICAgICAgICAoRGVmaW5pZXJ0IGluIC9zeXMvbGl2aW5nL3NraWxsX2F0dHJpYnV0ZXMuaCkKKworICAgIDx2YWx1ZT4gICAgIElOVAorICAgICAgICAgICAgICAgIE5ldWVyIFdlcnQgZGVzIEF0dHJpYnV0cyAoU3RhbmRhcmQ6IDEwMCkKKworICAgIDxkdXJhdGlvbj4gIElOVAorICAgICAgICAgICAgICAgIERhdWVyIGluIFNla3VuZGVuCisKKyAgICA8ZnVuPiAgICAgICBOSUNIVCBNRUhSIFVOVEVSU1RVRVRaVCAtIE1vZGlmeVNraWxsQXR0cmlidXRlKCkgbnV0emVuISEKKworQkVTQ0hSRUlCVU5HOgorICAgIERpZXNlIEZ1bmt0aW9uIGV4aXN0aWVydCBudXIgYXVzIEtvbXBhdGliaWxpdGFldHNncnVlbmRlbi4gQml0dGUgaW4gbmV1ZW4KKyAgICBPYmpla3RlbiBOSUNIVCBtZWhyIHZlcndlbmRlbiB1bmQgaW4gYWx0ZW4gbmFjaCBNb2VnbGljaGtlaXQgYXVzYmF1ZW4hCisKKyAgICBBZW5kZXJ0IGVpbiBTa2lsbC1BdHRyaWJ1dCBlaW5lcyBMaXZpbmcuCisgICAgCisgICAgRnVlciA8dmFsdWU+IGlzdCBmb2xnZW5kZXMgenUgYmVhY2h0ZW46CisgICAgRnJ1ZWhlciBoYW5kZWx0ZSBlcyBzaWNoIHVtIGVpbmVuIG11bHRpcGxpa2F0aXZlbiBGYWt0b3IuIDEwMCBoYXR0ZSBkaWUKKyAgICBCZWRldXR1bmcgdm9uIDEgdW5kIHZlcmFlbmRlcnRlIG5pY2h0cy4gSGV1dGUgc2luZCBkaWUgTW9kaWZpa2F0b3JlbgorICAgIGFkZGl0aXYuIERpZXNlIEZ1bmt0aW9uIG1hY2h0IGVpbmUgZWluZmFjaGUgVW1yZWNobnVuZywgaW5kZW0gc2llIHZvbSBoaWVyCisgICAgdWViZXJnZWJlbiBXZXJ0IDEwMCBhYnppZWh0LiAoSW4gZGVyIEFubmFobWUsIGRhc3MgZnJ1ZWhlciBtZWlzdCBlaCBudXIgCisgICAgZWluIE1vZGlmaWthdG9yIHp1ciBnbGVpY2hlbiBaZWl0IGFrdGl2IHdhci4pCisgICAgR2lidCBtYW4gaGllciBhbHNvIGhpZXIgZWluZSAxMDAgYW4sIHdpcmQgZWluIE1vZGlmaWthdG9yIHZvbiAwIGVpbmdlLQorICAgIHRyYWdlbiwgZGVyIG5pY2h0cyBhZW5kZXJ0LCBiZWkgMjAwIHdpcmQgZWluIE1vZGlmaWthdG9yIHZvbiAxMDAgZWluZ2UtCisgICAgdHJhZ2VuLCBiZWkgNTAgZWluZXIgdm9uIC01MCwgd2VsY2hlciBkYXMgU2tpbGxhdHRyaWJ1dGUgZm9sZ2xpY2ggCisgICAgcmVkdXppZXJ0LgorCisgICAgRXMgc2luZCBtb21lbnRhbiBtYXguIDUgZ2xlaWNoemVpdGlnZSBTa2lsbGF0dHJpYnV0ZS1Nb2RpZmlrYXRvcmVuIHBybyBTQQorICAgIHp1bGFlc3NpZy4KKworUlVFQ0tHQUJFV0VSVDoKKyAgICAgMCAgd2VubiBkZXIgV2VydCB1bmd1ZWx0aWcgaXN0IG9kZXIgYXVzIHNvbnN0aWdlbSBHcnVuZGUgbmljaHQgZ2VzZXR6dAorICAgICAgICB3ZXJkZW4ga29ubnRlIChmdWVyIGJlc3NlcmUgRGlhZ25vc3RpayAtPiBNb2RpZnlTa2lsbEF0dHJpYnV0ZSgpKS4KKyAgICA+MCAgd2VubiBhbGxlcyBva2F5IHdhcgorCitCRU1FUktVTkdFTjoKKyAgICBGcnVlaGVyIG11c3N0ZSBlaW4gc2V0emVuZGVzIE9iamVrdCBlaW4gZ3JvZXNzZXJlcyBQX0xFVkVMIGhhYmVuIGFscyBkYXMKKyAgICBPYmpla3QsIHdlbGNoZXMgZWluZW4gdm9yaGVyaWdlbiBNb2RpZmlrYXRvciBnZXNldHp0IGhhdCwgdW0gZGllc2VuIHp1CisgICAgdWViZXJzY2hyZWliZW4uIERpZXMgaXN0IGluendpc2NoZW4gb2huZSBCZWRldXR1bmcuCisKK0JFSVNQSUVMRToKKyAgICBFaW4gTlBDOgorCisgICAgdm9pZAorICAgIGNyZWF0ZSgpIHsKKyAgICAuCisgICAgLgorICAgIC4KKyAgICBBZGRTcGVsbCgxLCAxLAorICAgICAgIkRlciBmdWVyY2h0ZXJsaWNoZSBOUEMgaGF1dCBEaXIgYXVmIGRlbiBLb3BmLlxuIiwKKyAgICAgICJEZXIgZnVlcmNodGVybGljaGUgTlBDIGhhdXQgQFdFTiBhdWYgZGVuIEtvcGYuXG4iLAorICAgICAgRFRfTUFHSUMsICJzY2h3YWVjaGVuIik7CisgICAgLgorICAgIC4KKyAgICB9CisKKyAgICBzY2h3YWVjaGVuKG9iamVjdCBlbmVteSwgaW50IGRhbWFnZSwgbWl4ZWQgKmRhbV90eXBlKSB7CisgICAgICBpbnQgZXJnZWJuaXM7CisgICAgICBlcmdlYm5pcyA9IGVuZW15LT5Nb2RpZnlTa2lsbEF0dHJpYnV0ZU9sZCh0aGlzX29iamVjdCgpLCBTQV9RVUFMSVRZLCA1MCwgNSk7CisgICAgICBpZiAoZXJnZWJuaXMgPiAwKQorICAgICAgICAgIHRlbGxfb2JqZWN0KGVuZW5teSwgIkR1IGZ1ZWhsc3QgRGljaCBnYW56IHNjaHdhY2guXG4iKTsKKyAgICB9CisgICAgCisgICAgRGVyIE5QQyBzY2h3YWVjaHQgc2VpbmVuIEdlZ25lciBlcmhlYmxpY2ghIEFsbGVzIHdpcmQgZnVlciA1IFNla3VuZGVuIHVtCisgICAgNTAsIGQuaC4gMC41IFNraWxsYXR0cmlidXRlIHJlZHV6aWVydCAoNTAgLSAxMDAgPT4gLTUwIGFscyBNb2RpZmlrYXRvcikuCisKK1NJRUhFIEFVQ0g6CisgICAgUF9TS0lMTF9BVFRSSUJVVEVTLCBQX1NLSUxMX0FUVFJJQlVURV9PRkZTRVRTLAorICAgIE1vZGlmeVNraWxsQXR0cmlidXRlLCBRdWVyeVNraWxsQXR0cmlidXRlKCksCisgICAgUmVtb3ZlU2tpbGxBdHRyaWJ1dGVNb2RpZmVyKCksIFF1ZXJ5U2tpbGxBdHRyaWJ1dGVNb2RpZmllcigpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiswNy4wOC4yMDA4IFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vb2Jzb2xldGUvTm90aWZ5R2l2ZVF1ZXN0IGIvZG9jL2xmdW4vb2Jzb2xldGUvTm90aWZ5R2l2ZVF1ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMjk3OTgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9vYnNvbGV0ZS9Ob3RpZnlHaXZlUXVlc3QKQEAgLTAsMCArMSwzNyBAQAorKioqKioqKioqKioqKioqKioqKioqIE9CU09MRVRFIExGVU4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogRGllc2UgRWZ1biBiaXR0ZSBuaWNodCBtZWhyIGJlbnV0emVuLCBzb25kZXJuIHN0YXR0ZGVzc2VuIGRpZSAgICAgICAqCisqIEV2ZW50cyAoc2llaGUgIm1hbiBldmVudHMiKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworTm90aWZ5R2l2ZVF1ZXN0KCkKKworRlVOS1RJT046CisgICAgIHZvaWQgTm90aWZ5R2l2ZVF1ZXN0KG9iamVjdCBwbCwgc3RyaW5nIGtleSk7CisgICAgIAorREVGSU5JRVJUIElOOgorICAgICAvc3RkL2dpbGRlbl9vYi5jCisgICAgIAorQVJHVU1FTlRFOgorICAgICBwbCAgICAgRGVyIFNwaWVsZXIsIGRlciBlaW5lIFF1ZXN0IGdlbG9lc3QgaGF0LgorICAgICBrZXkgICAgTmFtZSBkZXIgZ2Vsb2VzdGVuIFF1ZXN0LgorICAgICAKK0JFU0NIUkVJQlVORzoKKyAgICAgRGllIEZ1bmt0aW9uIHdpcmQgaW4gZGVyIEdpbGRlIGRlcyBTcGllbGVycyBhdWZnZXJ1ZmVuLCB3ZW5uIGRlciAKKyAgICAgU3BpZWxlciBlaW5lIGd1ZWx0aWdlIFF1ZXN0IGJlc3RlaHQgLSB1bmQgendhciB1bmFiaGFlbmdpZyBkYXZvbiwKKyAgICAgb2IgZXIgc2llIGJlcmVpdHMgZ2Vsb2VzdCBoYXQsIG9kZXIgbmljaHQuCisgICAgIAorUlVFQ0tHQUJFV0VSVDoKKyAgICAga2VpbmVyCisgICAgIAorQkVNRVJLVU5HRU46CisgICAgIERpZSBGdW5rdGlvbiBpc3QgZGFmdWVyIGdlZGFjaHQsIHZvbiBHaWxkZW5wcm9ncmFtbWllcmVybiB1ZWJlcnNjaHJpZWJlbgorICAgICB6dSB3ZXJkZW4sIHdlbm4gYmVpc3BpZWxzd2Vpc2UgYmVzdGltbXRlIFF1ZXN0cyBhbHMgQXVmc3RpZWdzYmVkaW5ndW5nCisgICAgIHZlcmxhbmd0IHdlcmRlbiwgZGllc2UgYWJlciBpbiBkZXIgZW50c3ByZWNoZW5kZW4gR2lsZGUgZ2Vsb2VzdCBzZWluCisgICAgIG11ZXNzZW4gKHouQi4gT2JlcmdsYWRpYXRvciBhbHMgTGV2ZWwtNS1aYXViZXJlcikuCisgICAgIAorU0lFSEUgQVVDSDoKKyAgICAgL3N0ZC9naWxkZW5fb2IuYworICAgICAvc3RkL3BsYXllci9xdWVzdHMuYworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBGcmkgT2N0IDQgMTA6MTc6MDAgMTk5NiBieSBTaWx2YW5hCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9vYnNvbGV0ZS9Ob3RpZnlIcENoYW5nZSBiL2RvYy9sZnVuL29ic29sZXRlL05vdGlmeUhwQ2hhbmdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmODJiMDMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9vYnNvbGV0ZS9Ob3RpZnlIcENoYW5nZQpAQCAtMCwwICsxLDQ3IEBACisqKioqKioqKioqKioqKioqKioqKiogT0JTT0xFVEUgTEZVTiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBEaWVzZSBFZnVuIGJpdHRlIG5pY2h0IG1laHIgYmVudXR6ZW4sIHNvbmRlcm4gc3RhdHRkZXNzZW4gZGllICAgICAgICoKKyogSG9va3MgKHMuIC9kb2Mvc3RkL2hvb2tzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTm90aWZ5SHBDaGFuZ2UoKQorCitGVU5LVElPTjoKKwl2b2lkIE5vdGlmeUhwQ2hhbmdlKCk7CisKK0RFRklOSUVSVCBJTjoKKwkvc3RkL3BsYXllci9saWZlLmMKKworQVJHVU1FTlRFOgorCWtlaW5lCisKK0JFU0NIUkVJQlVORzoKKwlXZW5uIHNpY2ggZGllIExlYmVuc3B1bmt0ZSBlaW5lcyBTcGllbGVycyBhZW5kZXJuLCBzbyB3ZXJkZW4gZGF2b24KKwlhdWNoIGFuZGVyZSBPYmpla3RlIHVudGVycmljaHRldCwgc29mZXJuIGRpZXNlIG1pdHRlbHMgZGVyIEZ1bmt0aW9uCisJQWRkSHBIb29rKCkgYmVpIGViZW4gZGllc2VtIFNwaWVsZXIgYW5nZW1lbGRldCB3dXJkZW4uCisJRm9ydGFuIHdpcmQgZGFubiBkaWUgRnVua3Rpb24gTm90aWZ5SHBDaGFuZ2UoKSBpbiBkaWVzZW4KKwlhbmdlbWVsZGV0ZW4gT2JqZWt0ZW4gYXVmZ2VydWZlbiwgd2VubiBzaWNoIGRpZSBQcm9wZXJ0eSBQX0hQIGRlcworCVNwaWVsZXJzIGFlbmRlcnQuIEVzIHdlcmRlbiBoaWVyYmVpIGtlaW5lIEFyZ3VtZW50ZSBhbgorCU5vdGlmeUhwQ2hhbmdlKCkgdWViZXJnZWJlbiwgZGllIGFrdHVlbGxlbiBMZWJlbnNwdW5rdGUga2FubiBtYW4gamEKKwlhdWNoIG9obmUgd2VpdGVyZXMgdWViZXIgZGllIFByb3BlcnR5IFBfSFAgaW4gRXJmYWhydW5nIGJyaW5nZW4gdW5kCisJYWVsdGVyZSBXZXJ0ZSBtdXNzIG1hbiBzaWNoIGdlc29uZGVydCBtZXJrZW4uIFp1IGJlYWNodGVuIGlzdCwgZGFzcworCWRpZSBQcm9wZXJ0eSBQX0hQIGJlaSBBdWZydWYgZGVyIEZ1bmt0aW9uIE5vdGlmeUhwQ2hhbmdlKCkgYmVyZWl0cworCWRlbiBuZXVlbiBXZXJ0IGVudGhhZWx0LgorCUJlaSBkZW0gU3BpZWxlciBhbmdlbWVsZGV0ZSBPYmpla3RlLCBkaWUgdm9uIExlYmVuc3B1bmt0ZWFlbmRlcnVuZ2VuCisJaW5mb3JtaWVydCB3ZXJkZW4gc29sbGVuLCB3ZXJkZW4gYXV0b21hdGlzY2ggYXVzIGRlciBMaXN0ZSBlbnRmZXJudCwKKwl3ZW5uIHNpZSB6ZXJzdG9lcnQgd3VyZGVuLiBEaWVzZSBMaXN0ZSBpc3QgaW4gZGVyIFByb3BlcnR5CisJUF9IUF9IT09LUyB6dSBmaW5kZW4uIFBlciBIYW5kIGthbm4gbWFuIHNpZSBhdWNoIGV4cGxpeml0IG1pdHRlbHMKKwlkZXIgRnVua3Rpb24gUmVtb3ZlSHBIb29rKCkgZW50ZmVybmVuLgorCVN0aXJidCBlaW4gU3BpZWxlciwgc28gd2lyZCBkaWUgRnVua3Rpb24gTm90aWZ5UGxheWVyRGVhdGgoKQorCWF1ZmdlcnVmZW4gdW5kIG5pY2h0IE5vdGlmeUhwQ2hhbmdlKCkhCisKK1JVZUNLR0FCRVdFUlQ6CisJa2VpbmVyCisKK0JFSVNQSUVMRToKKwlpc3QgaW4gQXJiZWl0CisKK1NJRUhFIEFVQ0g6CisJUF9IUCwgUF9IUF9IT09LUywgQWRkSHBIb29rKCksIFJlbW92ZUhwSG9vaygpLAorCURlZmVuZCgpLCBkb19kYW1hZ2UoKSwgTm90aWZ5UGxheWVyRGVhdGgoKQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBUaHUgTm92IDE5IDEzOjU0OjMzIDE5OTggYnkgUGF0cnluCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9vYnNvbGV0ZS9RdWVyeUVuZW15IGIvZG9jL2xmdW4vb2Jzb2xldGUvUXVlcnlFbmVteQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjBiNTgzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vb2Jzb2xldGUvUXVlcnlFbmVteQpAQCAtMCwwICsxLDI0IEBACisqKioqKioqKioqKioqKioqKioqKiogT0JTT0xFVEUgTEZVTiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRlVOS1RJT046CisJb2JqZWN0IFF1ZXJ5RW5lbXkoKTsKKworREVGSU5JRVJUIElOOgorCS9zdGQvbGl2aW5nL2NvbWJhdC5jCisKK0FSR1VNRU5URToKKwlrZWluZQorCitSVWVDS0dBQkVXRVJUOgorCWdlZnVuZGVuZXIgR2VnbmVyCisKK0JFU0NIUkVJQlVORzoKKwlEaWVzZSBGdW5rdGlvbiBsaWVmZXJ0IHp1ZmFlbGxpZyBlaW5lbiBkZXIgYW53ZXNlbmRlbiBHZWduZXIKKwl6dXJ1ZWNrLCBzb2Zlcm4ga2VpbmUgR2VnbmVyIGJldm9yenVndCBhdXNnZXdhZWhsdCB3ZXJkZW4uCisKK0JFTUVSS1VOR0VOOgorICBEaWVzZSBMZnVuIGV4aXN0aWVydCBuaWNodCBtZWhyLiBCaXR0ZSBTZWxlY3RFbmVteSgpIGJlbnV0emVuLgorCitTSUVIRSBBVUNIOgorCVNlbGVjdEVuZW15KCksIFF1ZXJ5UHJlZmVyZWRFbmVteSgpLCBQX1BSRUZFUkVEX0VORU1ZCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiswNy4wMi4yMDA5LCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9vYnNvbGV0ZS9RdWVyeUluc2VydEhvb2tzIGIvZG9jL2xmdW4vb2Jzb2xldGUvUXVlcnlJbnNlcnRIb29rcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDNkMDM2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vb2Jzb2xldGUvUXVlcnlJbnNlcnRIb29rcwpAQCAtMCwwICsxLDMxIEBACisqKioqKioqKioqKioqKioqKioqKiogT0JTT0xFVEUgTEZVTiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBEaWVzZSBFZnVuIGJpdHRlIG5pY2h0IG1laHIgYmVudXR6ZW4sIHNvbmRlcm4gc3RhdHRkZXNzZW4gZGllICAgICAgICoKKyogSG9va3MgKHMuIC9kb2Mvc3RkL2hvb2tzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUXVlcnlJbnNlcnRIb29rcygpCisKK0ZVTktUSU9OOgorICAgICBvYmplY3QgKlF1ZXJ5SW5zZXJ0SG9va3MoKTsKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL3BsYXllci9yZXN0cmljdGlvbnMuYworCitBUkdVTUVOVEU6CisgICAgIGtlaW5lCisKK0JFU0NIUkVJQlVORzoKKyAgICAgKERpZXNlIEZ1bmt0aW9uYWxpdGFldCB3dXJkZSBlcnNldHp0IGR1cmNoIGRlbiBhbGxnZW1laW5lbiBIb29rCisgICAgICBIX0hPT0tfSU5TRVJUIHVuZCBpc3QgbnVyIG5vY2ggYXVzIEdydWVuZGVuIGRlciBLb21wYXRpYmlsaXRhZXQKKyAgICAgIHZvcmhhbmRlbi4pCisKKyAgICAgRGllc2UgRnVua3Rpb24gZ2lidCBkaWUgYWt0dWVsbCBiZWltIFNwaWVsZXJvYmpla3QgYW5nZW1lbGRldGVuCisgICAgIExpc3RlbmVyLU9iamVrdGUgenVydWVjay4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgQXJyYXkgYXVzIE9iamVrdHBvaW50ZXJuIG9kZXIgbGVlcmVzIEFycmF5CisKK1NJRUhFIEFVQ0g6CisgICAgTm90aWZ5SW5zZXJ0KCksIEFkZEluc2VydEhvb2soKSwgUmVtb3ZlSW5zZXJ0SG9vaygpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IDE0LjA0LjIwMTAsIEFyYXRob3JuCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9vYnNvbGV0ZS9RdWVyeU9wdFFQIGIvZG9jL2xmdW4vb2Jzb2xldGUvUXVlcnlPcHRRUApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmY3MmM1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vb2Jzb2xldGUvUXVlcnlPcHRRUApAQCAtMCwwICsxLDI1IEBACitRdWVyeU9wdFFQKCkKKworRlVOS1RJT046CisgICAgaW50IFF1ZXJ5T3B0UVAoKQorCitERUZJTklFUlQgSU46CisgICAgL3NlY3VyZS9xdWVzdG1hc3Rlci5jCisKK0FSR1VNRU5URToKKyAgICBrZWluZQorCitSVUVDS0dBQkVXRVJUOgorICAgIEFiZW50ZXVlcnB1bmt0ZSBkZXIgb3B0aW9uYWxlbiBRdWVzdHMKKworQkVTQ0hSRUlCVU5HOgorICAgIERpZXNlIEZ1bmt0aW9uIGxpZWZlcnQgZGllIEFiZW50ZXVlcnB1bmt0ZSBkZXIgb3B0aW9uYWxlbgorICAgIEFiZW50ZXVlciB6dXJ1ZWNrLiAKKworU0lFSEUgQVVDSDoKKyAgICBHaXZlUXVlc3QsIFF1ZXJ5UXVlc3QsIC9zZWN1cmUvcXVlc3RtYXN0ZXIuaCwgUXVlcnlHcm91cGVkS2V5cywKKyAgICBRdWVyeU1heFFQLCBRdWVyeVRvdGFsUVAKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorWnVsZXR6dCBnZWFlbmRlcnQ6IFNhbSwgMjUuIE5vdiAyMDAwLCAxNDowNDoyOCB2b24gWm9vay4KKwpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vb2Jzb2xldGUvUmVtb3ZlSHBIb29rIGIvZG9jL2xmdW4vb2Jzb2xldGUvUmVtb3ZlSHBIb29rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMTc3ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9vYnNvbGV0ZS9SZW1vdmVIcEhvb2sKQEAgLTAsMCArMSwyNSBAQAorKioqKioqKioqKioqKioqKioqKioqIE9CU09MRVRFIExGVU4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogRGllc2UgRWZ1biBiaXR0ZSBuaWNodCBtZWhyIGJlbnV0emVuLCBzb25kZXJuIHN0YXR0ZGVzc2VuIGRpZSAgICAgICAqCisqIEhvb2tzIChzLiAvZG9jL3N0ZC9ob29rcykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JlbW92ZUhwSG9vaygpCitGVU5LVElPTjoKKyAgICAgaW50IFJlbW92ZUhwSG9vayhvYmplY3Qgb2IpCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC9wbGF5ZXIvbGlmZS5jCisKK0FSR1VNRU5URToKKyAgICAgb2IgLSBkYXMgT2JqZWt0LCBkYXMgc2ljaCBhdXN0cmFnZW4gbW9lY2h0ZS4KKworQkVTQ0hSRUlCVU5HOgorICAgICBFbnRmZXJudCBkZW4gRWludHJhZyBmdWVyIGRpZXNlcyBPYmpla3QgaW4gUF9IUF9IT09LUy4KKworUlVFQ0tHQUJFV0VSVDoKKyAgICAgMSwgd2VubiBFcmZvbGcsIDAgc29uc3QKKworU0lFSEUgQVVDSDoKKyAgICAgR2VnZW5wYXJ0OglBZGRIcEhvb2soKQorICAgICBQcm9wczoJUF9IUF9IT09LUywgUF9IUAorCisyMy5GZWIuMjAwNCBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vb2Jzb2xldGUvUmVtb3ZlSW5zZXJ0SG9vayBiL2RvYy9sZnVuL29ic29sZXRlL1JlbW92ZUluc2VydEhvb2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIzMmVlZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL29ic29sZXRlL1JlbW92ZUluc2VydEhvb2sKQEAgLTAsMCArMSwzMSBAQAorKioqKioqKioqKioqKioqKioqKioqIE9CU09MRVRFIExGVU4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogRGllc2UgRWZ1biBiaXR0ZSBuaWNodCBtZWhyIGJlbnV0emVuLCBzb25kZXJuIHN0YXR0ZGVzc2VuIGRpZSAgICAgICAqCisqIEhvb2tzIChzLiAvZG9jL3N0ZC9ob29rcykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JlbW92ZUluc2VydEhvb2soKQorCitGVU5LVElPTjoKKyAgICAgdm9pZCBSZW1vdmVJbnNlcnRIb29rKG9iamVjdCBvYik7CisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC9wbGF5ZXIvcmVzdHJpY3Rpb25zLmMKKworQVJHVU1FTlRFOgorICAgICBvYiAtIERhcyBPYmpla3QsIGRhcyBhbHMgTGlzdGVuZXIgYXVzIGRlciBMaXN0ZSBhdXNnZXRyYWdlbiB3ZXJkZW4gc29sbAorCitCRVNDSFJFSUJVTkc6CisgICAgIChEaWVzZSBGdW5rdGlvbmFsaXRhZXQgd3VyZGUgZXJzZXR6dCBkdXJjaCBkZW4gYWxsZ2VtZWluZW4gSG9vaworICAgICAgSF9IT09LX0lOU0VSVCB1bmQgaXN0IG51ciBub2NoIGF1cyBHcnVlbmRlbiBkZXIgS29tcGF0aWJpbGl0YWV0CisgICAgICB2b3JoYW5kZW4uKQorCisgICAgIERpZXNlIEZ1bmt0aW9uIHdpcmQgaW0gU3BpZWxlcm9iamVrdCBhdWZnZXJ1ZmVuLCB1bSBlaW4gYWxzIExpc3RlbmVyCisgICAgIGVpbmdldHJhZ2VuZXMgSG9vay1PYmpla3Qgb2Igd2llZGVyIGF1c3p1dHJhZ2VuLgorCitSVWVDS0dBQkVXRVJUOgorICAgICBrZWluZXIKKworU0lFSEUgQVVDSDoKKyAgICBOb3RpZnlJbnNlcnQoKSwgQWRkSW5zZXJ0SG9vaygpLCBRdWVyeUluc2VydEhvb2tzKCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogMTQuMDQuMjAxMCwgQXJhdGhvcm4KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL29ic29sZXRlL1Rlc3RBdHRyaWJ1dGVMb2NrIGIvZG9jL2xmdW4vb2Jzb2xldGUvVGVzdEF0dHJpYnV0ZUxvY2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI2ZTkzMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL29ic29sZXRlL1Rlc3RBdHRyaWJ1dGVMb2NrCkBAIC0wLDAgKzEsMjUgQEAKKyoqKioqKioqKioqKioqKioqKioqKiBPQlNPTEVURSBMRlVOICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitUZXN0QXR0cmlidXRlTG9jaygpCitGVU5LVElPTjoKKyAgICAgc3RyaW5nIFRlc3RBdHRyaWJ1dGVMb2NrKG1hcHBpbmcgY2hlY2spCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC9saXZpbmcvYXR0cmlidXRlcy5jCisNCitQQVJBTUVURVI6DQorICAgICBjaGVjawktIE1hcHBpbmcgbWl0IEF0dHJpYnV0ZW46IChbPGF0dHI+Ojx3ZXJ0Pl0pDQorCitCRVNDSFJFSUJVTkc6CisgICAgIFBydWVmdCwgb2IgZWluZXMgZGVyIGltIE1hcHBpbmcgZW50aGFsdGVuZW4gQXR0cmlidXRlIGJsb2NraWVydA0KKyAgICAgaXN0IChiZXJlaXRzIGR1cmNoIGVpbmVuIGFuZGVyZW4gTW9kaWZpZXIgYmVsZWd0IHd1cmRlKS4KKyAgICAgCisgICAgIERhIE1vZGlmaWVyIG5pY2h0IG1laHIgZGlyZWt0IGJsb2NraWVyZW4gaXN0IGRpZXNlIEZ1bmt0aW9uIG9ic29sZXQKKyAgICAgdW5kIGluIExpdmluZ3MgaW56d2lzY2hlbiBuaWNodCBtZWhyIGV4aXN0ZW50LgorCitTSUVIRSBBVUNIOgorICAgICBRdWVyeUF0dHJpYnV0ZSgpLCBRdWVyeVJlYWxBdHRyaWJ1dGUoKSwgUXVlcnlBdHRyaWJ1dGVPZmZzZXQoKSwNCisgICAgIFNldEF0dHIoKSwgU2V0QXR0cmlidXRlKCksIFNldFJlYWxBdHRyaWJ1dGUoKSwgVXBkYXRlQXR0cmlidXRlcygpLA0KKyAgICAgUF9BVFRSSUJVVEVTLCBQX0FUVFJJQlVURVNfT0ZGU0VUUywgUF9BVFRSSUJVVEVTX01PRElGSUVSLA0KKyAgICAgUF9YX0FUVFJfTU9ELCBQX01fQVRUUl9NT0QsIC9zdGQvbGl2aW5nL2F0dHJpYnV0ZXMuYw0KKworMTEuMDUuMjAwNywgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vb2Jzb2xldGUvZXh0cmFfbG9vayBiL2RvYy9sZnVuL29ic29sZXRlL2V4dHJhX2xvb2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUzYThlZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL29ic29sZXRlL2V4dHJhX2xvb2sKQEAgLTAsMCArMSwxOSBAQAorKioqKioqKioqKioqKioqKioqKioqIFZFUkFMVEVURSBMRlVOICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBEaWVzZSBMRlVOIGlzdCB2ZXJhbHRldC4gQml0dGUgYmVudXR6dCBzaWUgTklDSFQgbWVociwgc29uZGVybiAgKgorKiBzdGF0dGRlc3NkZW4gQWRkRXh0cmFMb29rKCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitleHRyYV9sb29rKCkKKworRlVOS1RJT046CisgICAgc3RyaW5nIGV4dHJhX2xvb2soKTsKKworQkVTQ0hSRUlCVU5HOgorICAgIEthbm4gaW4gT2JqZWt0IGRlZmluaWVydCBzZWluLiBXZW5uIGVpbiBMaXZpbmcgKHN0ZC9saXZpbmcvZGVzY3JpcHRpb24pCisgICAgZGFzIE9iamVrdCBlbnRoYWVsdCwgd2lyZCB6dSBkZXNzZW4gbG9uZygpIGRlciB6dXJ1ZWNrZ2VnZWJlbmUgU3RyaW5nCisgICAgaGluenVnZWZ1ZWd0LgorCitTSUVIRSBBVUNIOgorICAgIEFkZEV4dHJhTG9vaygpCisKKzI1LkphbiAyMDE1IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9vYnNvbGV0ZS9wYXJhbW92ZSBiL2RvYy9sZnVuL29ic29sZXRlL3BhcmFtb3ZlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2Njg2YTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9vYnNvbGV0ZS9wYXJhbW92ZQpAQCAtMCwwICsxLDQ1IEBACisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqIFZFUkFMVEVURSBMRlVOICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqIERPIE5PVCBVU0UhICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitwYXJhbW92ZSgpCisKK0ZVTktUSU9OOgorICAgICBpbnQgcGFyYW1vdmUoKTsKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL3Jvb20vcGFyYS5jCisKK0FSR1VNRU5URToKKyAgICAga2VpbmUKKworQkVTQ0hSRUlCVU5HOgorICAgICBCZXdlZ3QgZGVuIFNwaWVsZXIgZ2dmLiBpbiBlaW5lIFBhcmFsbGVsZGltZW5zaW9uLgorCitSVWVDS0dBQkVXRVJUOgorICAgICAxLCB3ZW5uIGRlciBTcGllbGVyIGRpZSBEaW1lbnNpb24gZ2V3ZWNoc2VsdCBoYXQuCisKK0JFSVNQSUVMOgorICAgICBpbml0KCl7CisgICAgICAgaWYoIXBhcmFtb3ZlKCkpIDo6aW5pdCgpOworICAgICAgfQorCitCRU1FUktVTkdFTjoKKyAgICAgRElFU0UgRlVOS1RJT04gTklDSFQgTUVIUiBCRU5VVFpFTiEKKworICAgICBEaWVzZSBGdW5rdGlvbiBzb2xsdGUgbnVyIGF1cyBlaW5lbSBpbml0KCkgYXVmZ2VydWZlbiB3ZXJkZW4hCisKKyAgICAgRnVlciBkaWUgRW50c2NoZWlkdW5nLCBpbiB3ZWxjaGVtIFJhdW0gZWluIFNwaWVsZXIgaW4gQWJoYWVuZ2lna2VpdCAKKyAgICAgdm9uIFBfUEFSQSBsYW5kZXQsIGlzdCBkaWUgRnVua3Rpb24gbW92ZSgpIHp1c3RhZW5kaWcuIEFscyBNYWdpZXIgCisgICAgIG11c3MgbWFuIHNpY2ggZGFydW0gbmljaHQgZ2Vzb25kZXJ0IGt1ZW1tZXJuLiBEYXMgaGVpc3N0IGFiZXIgYXVjaCwgCisgICAgIGRhc3MgYmVpbSBBbnNjaGx1c3MgZWluZXMgTm9ybWFsd2VsdHJhdW1lcyBhdXRvbWF0aXNjaCBhbGxlIGluIGRlbSAKKyAgICAgVmVyemVpY2huaXMgbWl0IGdsZWljaGVtIE5hbWVuIHZvcmhhbmRlbmVuIFBhcmFsbGVsd2VsdHJhZXVtZSBtaXQgCisgICAgIGFuZ2VzY2hsb3NzZW4gd2VyZGVuLgorCisgICAgIERlc3dlZ2VuIGlzdCBwYXJhbW92ZSgpIHZlcmFsdGV0IHVuZCBzb2xsdGUgbmljaHQgbWVociBnZW51dHp0IHdlcmRlbi4KKworU0lFSEUgQVVDSDoKKyAgICAgL3N0ZC9yb29tL3BhcmEuYywgUF9QQVJBLCBQX05PX1BMQVlFUlMsIG1vdmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogMDUuMDguMjAwNywgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vcGljayBiL2RvYy9sZnVuL3BpY2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTliZjUxZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL3BpY2sKQEAgLTAsMCArMSw0OCBAQAorcGljaygpCisKK0ZVTktUSU9OOgorICAgIHB1YmxpYyB2YXJhcmdzIGludCBwaWNrKG9iamVjdCBvLCBtaXhlZCBtc2cpOworCitERUZJTklFUlQgSU46CisgICAgL3N0ZC9saXZpbmcvcHV0X2FuZF9nZXQuYworCitBUkdVTUVOVEU6CisgICAgb2JqZWN0IG8KKyAgICAgICAgRGFzIE9iamVrdCwgZGFzIGF1ZmdlaG9iZW4gd2VyZGVuIHNvbGwuCisgICAgbWl4ZWQgbXNnCisgICAgICAgIEVpbmUgb3B0aW9uYWxlIE1lbGR1bmcsIGRpZSBhbnN0ZWxsZSB2b24gUF9QSUNLX01TRyBvZGVyIGRlcgorICAgICAgICBTdGFuZGFyZG1lbGR1bmcgdmVyd2VuZGV0IHdpcmQsIG9kZXIgLTEsIHVtIGRpZSBNZWxkdW5nIHp1CisgICAgICAgIHVudGVyZHJ1ZWNrZW4uCisKK0JFU0NIUkVJQlVORzoKKyAgICBEZXIgU3BpZWxlciBvZGVyIE5QQyBuaW1tdCBkYXMgT2JqZWt0IGF1Zi4gR2lidCBvLT5tb3ZlKCkga2VpbmVuIHBvc2l0aXZlbgorICAgIFdlcnQgenVydWVjaywgYmVpc3BpZWxzd2Vpc2Ugd2VpbCBkYXMgT2JqZWt0IHp1IHNjaHdlciBpc3Qgb2RlciBuaWNodAorICAgIGdlbm9tbWVuIHdlcmRlbiBkYXJmLCBiZWtvbW10IGVyIGVpbmUgZW50c3ByZWNoZW5kZSBGZWhsZXJtZWxkdW5nLgorCitSVUVDS0dBQkVXRVJUOgorICAgIFdlbm4gZGFzIEF1Zm5laG1lbiBnZWtsYXBwdCBoYXQsIDEsIGFuc29uc3RlbiAwLgorCitCRU1FUktVTkc6CisgICAgRGllc2UgRnVua3Rpb24gaXN0IGRhbm4gc2lubnZvbGwsIHdlbm4gbWFuIGRlbiBTcGllbGVyIGVpbiBPYmpla3QKKyAgICBhdWZuZWhtZW4gbGFzc2VuIHVuZCBzaWNoIG5pY2h0IHNlbGJzdCB1bSBkaWUgRmVobGVyYmVoYW5kbHVuZyBrdWVtbWVybgorICAgIG1vZWNodGUgLSB1bmQgZGEgdW56YWVobGlnZSB2ZXJzY2hpZWRlbmUgRGluZ2Ugc2NoaWVmZ2VoZW4ga29lbm5lbiB1bmQKKyAgICBtYW5jaGUgT2JqZWt0ZSBlaWdlbmUgRmVobGVybWVsZHVuZ2VuIGRlZmluaWVyZW4sIGVpZ2VudGxpY2ggaW1tZXIuCisKKyAgICBEaWUgRnVua3Rpb24gcHJ1ZWZ0IG5pY2h0LCBvYiBzaWNoIGRhcyBPYmpla3QgdWViZXJoYXVwdCBpbiBkZXIgUmVpY2h3ZWl0ZQorICAgIGRlcyBTcGllbGVycy9OUEMgYmVmaW5kZXQsIGRhcyBtdXNzIG1hbiBnZ2YuIHNlbGJzdCBlcm1pdHRlbG4uCisKK0JFSVNQSUVMOgorICAgIG9iID0gY2xvbmVfb2JqZWN0KFdFSU5HVU1NSSk7CisKKyAgICBpZiAodGhpc19wbGF5ZXIoKS0+cGljayhvYiwgKHsgIkR1IG5pbW1zdCBAV0VOVTIgYXVzIGRlbSBSZWdhbC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQFdFUjEgbmltbXQgQFdFTlUyIGF1cyBkZW0gUmVnYWwuIiB9KSkpCisgICAgICAgIHdlaW5ndW1taS0tOworICAgIGVsc2UKKyAgICAgICAgb2ItPnJlbW92ZSgpOworCitTSUVIRSBBVUNIOgorICAgIG1vdmUoTCksIFBfUElDS19NU0csIHBpY2tfb2JqZWN0cyhMKSwgUF9OT0lOU0VSVF9NU0csIFBfTk9MRUFWRV9NU0csCisgICAgUF9UT09fTUFOWV9NU0csIFBfVE9PX0hFQVZZX01TRywgUF9FTlZfVE9PX0hFQVZZX01TRywgUF9OT0dFVAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBUaHUgQXVnIDI4IDIyOjIxOjQxIDIwMDggYnkgQW15bnRob3IKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL3BpY2tfb2JqIGIvZG9jL2xmdW4vcGlja19vYmoKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRjN2MxNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL3BpY2tfb2JqCkBAIC0wLDAgKzEsMjcgQEAKK3BpY2tfb2JqKCkKKworRlVOS1RJT04KKyAgICBpbnQgcGlja19vYmoob2JqZWN0IG9iKQorCitERUZJTklFUlQgSU46CisKKyAgICAvc3RkL2xpdmluZy9wdXRfYW5kX2dldC5jCisKK0FSR1VNRU5URToKKworICAgIG9iICAgICAgRGFzIE9iamVrdCwgZGFzIGdlbm9tbWVuIHdlcmRlbiBzb2xsLgorCitCRVNDSFJFSUJVTkc6CisKKyAgICBEYXMgTGViZXdlc2VuLCBpbiBkZW0gZGllc2UgRnVua3Rpb24gYXVmZ2VydWZlbiB3ZXJkZW4gc29sbCwgaGVidAorICAgIGRlbiBhbmdlZ2ViZW5lbiBHZWdlbnN0YW5kIChvYikgYXVmLCBmYWxscyBlcyBpaG0gbW9lZ2xpY2ggaXN0LgorCitSVWVDS0dBQkVXRVJUOgorICAgIDEsIHdlbm4gZGFzIE9iamVrdCBnZW5vbW1lbiB3dXJkZSBvZGVyIGRpZXMgbmljaHQgbW9lZ2xpY2ggd2FyLiAoaW4gZGllc2VtCisgICAgRmFsbCB3aXJkIGF1Y2ggZGlyZWt0IGVpbmUgVGV4dGF1c2dhYmUgYXVzZ2VnZWJlbikKKyAgICAwIHNvbnN0LCBpbiBkaWVzZW0gRmFsbCB3aXJkIGluIG5vdGlmeV9mYWlsIGVpbmUgcGFzc2VuZGUgQXVzZ2FiZQorICAgIHBsYXppZXJ0CisKK1NJRUhFIEFVQ0g6CisKKyAgICBkcm9wX29iaigpLCBmaW5kX29icygpLCBnaXZlX29iaigpLCBwdXRfb2JqKCksIC9zdGQvbGl2aW5nL3B1dF9hbmRfZ2V0LmMKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL3BpY2tfb2JqZWN0cyBiL2RvYy9sZnVuL3BpY2tfb2JqZWN0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmMwODNkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vcGlja19vYmplY3RzCkBAIC0wLDAgKzEsMzkgQEAKK3BpY2tfb2JqZWN0cygpCisKK0ZVTktUSU9OOgorICAgIHB1YmxpYyB2YXJhcmdzIGludCBwaWNrX29iamVjdHMoc3RyaW5nIHN0ciwgaW50IGZsYWcsIG1peGVkIG1zZyk7CisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3RkL2xpdmluZy9wdXRfYW5kX2dldC5jCisKK0FSR1VNRU5URToKKyAgICBzdHJpbmcgc3RyCisgICAgICAgIFdhcyBhdWZnZWhvYmVuIHdlcmRlbiBzb2xsLgorICAgIGludCBmbGFnCisgICAgICAgIE11c3MgZGFzIE9iamVrdCBpcmdlbmR3byBkcmluc3RlY2tlbiAoZmxhZyA9IDEpLCBvZGVyIGRhcmYgZXMgZWluZmFjaAorICAgICAgICBzbyBoZXJ1bWxpZWdlbiAoZmxhZyA9IDApPyBEaWVzZXMgQXJndW1lbnQgaXN0IGhhdXB0c2FlY2hsaWNoIGZ1ZXIgZGFzCisgICAgICAgIEtvbW1hbmRvICJob2xlIiBnZWRhY2h0LCBpbiBkZXIgUmVnZWwgYnJhdWNodCBtYW4gZXMgbmljaHQgYW56dWdlYmVuLgorICAgIG1peGVkIG1zZworICAgICAgICBFaW5lIG9wdGlvbmFsZSBNZWxkdW5nLCBkaWUgYW5zdGVsbGUgdm9uIFBfUElDS19NU0cgb2RlciBkZXIKKyAgICAgICAgU3RhbmRhcmRtZWxkdW5nIHZlcndlbmRldCB3aXJkLCBvZGVyIC0xLCB1bSBkaWUgTWVsZHVuZyB6dQorICAgICAgICB1bnRlcmRydWVja2VuLgorCitCRVNDSFJFSUJVTkc6CisgICAgRGVyIFNwaWVsZXIgb2RlciBOUEMgbmltbXQgZGllIGluIDxzdHI+IGJlbmFubnRlbiBTYWNoZW4uIEthbm4gZXIgZWluCisgICAgT2JqZWt0IG5pY2h0IG5laG1lbiwgYmVrb21tdCBlciBlaW5lIGVudHNwcmVjaGVuZGUgRmVobGVybWVsZHVuZy4gV2VubgorICAgIGtlaW5lIE9iamVrdGUgYXVmIDxzdHI+IHBhc3Nlbiwgd2lyZCBwZXIgX25vdGlmeV9mYWlsKCkgZWluZSBNZWxkdW5nCisgICAgZ2VzZXR6dCwgYWJlciBub2NoIG5pY2h0IGF1c2dlZ2ViZW4uCisKK1JVRUNLR0FCRVdFUlQ6CisgICAgV2VubiA8c3RyPiBpcmdlbmR3ZWxjaGUgdm9yaGFuZGVuZW4gU2FjaGVuIHNpbmQsIDEsIHNvbnN0IDAuCisKK0JFTUVSS1VORzoKKyAgICBXZW5uIGRpZSBGdW5rdGlvbiAxIHp1cnVlY2tnaWJ0LCBoZWlzc3QgZGFzIG5vY2ggbmljaHQsIGRhc3MgZGVyIFNwaWVsZXIKKyAgICBldHdhcyBnZW5vbW1lbiBoYXQhIEVyIGhhdCBlcyBudXIgdmVyc3VjaHQsIGQuaC4gYXVmIGplZGVuIEZhbGwgZWluZQorICAgIE1lbGR1bmcgYmVrb21tZW4uIEdpYnQgZGllIEZ1bmt0aW9uIDAgenVydWVjaywgaGF0IGVyIG5vY2gga2VpbmUgYmVrb21tZW4uCisKK1NJRUhFIEFVQ0g6CisgICAgbW92ZShMKSwgcGljayhMKSwgUF9QSUNLX01TRywgZmluZF9vYmplY3RzKEwpLCBtb3ZlZF9vYmplY3RzKEwpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IEZyaSBKdWwgMjUgMTA6NTg6NDMgMjAwOCBieSBBbXludGhvcgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vcHJlc2VudF9vYmplY3RzIGIvZG9jL2xmdW4vcHJlc2VudF9vYmplY3RzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1Y2Y0YmUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9wcmVzZW50X29iamVjdHMKQEAgLTAsMCArMSwzMiBAQAorcHJlc2VudF9vYmplY3RzKCkKKworRlVOS1RJT046CisgICAgIG9iamVjdCAqcHJlc2VudF9vYmplY3RzKHN0cmluZyBkZXNjKTsKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL2NvbnRhaW5lci9yZXN0cmljdGlvbnMuYworCitBUkdVTUVOVEU6CisgICAgIGRlc2MKKyAgICAgICAgICBVbXNjaHJlaWJ1bmcgZGVzIGdlc3VjaHRlbiBPYmpla3RlcyBvZGVyICJhbGxlcyIgb2RlciAiYWxsZSIuCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGllc2UgRnVua3Rpb24gZ2lidCBkaWUgT2JqZWt0ZSBpbSBJbm5lcmVuIGRlcyBCZWhhZWx0ZXJzIHp1cnVlY2ssIGRpZQorICAgICBzaWNoIG1pdCBkZXNjIGFuc3ByZWNoZW4gbGFzc2VuLiBJbiBkZW0gRmFsbCwgZGFzcyAiYWxsZShzKSIKKyAgICAgYW5nZWZvcmRlcnQgd2lyZCwgc2luZCBkYXMgYWxsZSBzaWNodGJhcmVuIE9iamVrdGUsIGFuc29uc3RlbiBkYXMgZXJzdGUKKyAgICAgT2JqZWt0LCBkYXMgc2ljaCBtaXQgZGVzYyBhbnNwcmVjaGVuIGxhZXNzdC4KKyAgICAgT2JqZWt0ZSwgZGllIFBfSU5WSVMgZ2VzZXR6dCBoYWJlbiwgemFlaGxlbiBhbHMgbmljaHQgYW5zcHJlY2hiYXIsIGltCisgICAgIEdlZ2Vuc2F0eiB6dSBzb2xjaGVuIE9iamVrdGVuLCBkaWUga2VpbmUgUF9TSE9SVCBoYWJlbi4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgRWluIEFycmF5IHZvbiBPYmpla3RlbiBtaXQgZGVuIGdlZm9yZGVydGVuIEVpZ2Vuc2NoYWZ0ZW4uCisKKyAgICAgQmVmaW5kZXQgc2ljaCBrZWluIE9iamVrdCBpbSBCZWhhZWx0ZXIsIGRhcyBzaWNoIGR1cmNoIGRlc2MgYW5zcHJlY2hlbgorICAgICBsYWVzc3QsIHNvIHdpcmQgZWluIGxlZXJlcyBBcnJheSB6dXJ1ZWNrZ2VnZWJlbi4KKworU0lFSEUgQVVDSDoKKyAgICAgbG9jYXRlX29iamVjdHMoKSwgL3N0ZC9jb250YWluZXIvcmVzdHJpY3Rpb25zLmMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMDMuMDMuMjAxMywgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9wdXQgYi9kb2MvbGZ1bi9wdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNlN2VhZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL3B1dApAQCAtMCwwICsxLDQzIEBACitwdXQoKQorCitGVU5LVElPTjoKKyAgICBwdWJsaWMgdmFyYXJncyBpbnQgcHV0KG9iamVjdCBvLCBvYmplY3QgZGVzdCwgbWl4ZWQgbXNnKTsKKworREVGSU5JRVJUIElOOgorICAgIC9zdGQvbGl2aW5nL3B1dF9hbmRfZ2V0LmMKKworQVJHVU1FTlRFOgorICAgIG9iamVjdCBvCisgICAgICAgIERhcyBPYmpla3QsIGRhcyBpcmdlbmR3byBoaW5nZXN0ZWNrdCB3ZXJkZW4gc29sbC4KKyAgICBvYmplY3QgZGVzdAorICAgICAgICBEZXIgQmVoYWVsdGVyLCBpbiBkZW4gZGFzIE9iamVrdCBnZXN0ZWNrdCB3ZXJkZW4gc29sbC4KKyAgICBtaXhlZCBtc2cKKyAgICAgICAgRWluZSBvcHRpb25hbGUgTWVsZHVuZywgZGllIGFuc3RlbGxlIHZvbiBQX1BVVF9NU0cgb2RlciBkZXIKKyAgICAgICAgU3RhbmRhcmRtZWxkdW5nIHZlcndlbmRldCB3aXJkLCBvZGVyIC0xLCB1bSBkaWUgTWVsZHVuZyB6dQorICAgICAgICB1bnRlcmRydWVja2VuLgorCitCRVNDSFJFSUJVTkc6CisgICAgRGVyIFNwaWVsZXIgb2RlciBOUEMgc3RlY2t0IGRhcyBPYmpla3QgaW4gZWluZW4gQmVoYWVsdGVyLiBHaWJ0IG8tPm1vdmUoKQorICAgIGtlaW5lbiBwb3NpdGl2ZW4gV2VydCB6dXJ1ZWNrLCBiZWlzcGllbHN3ZWlzZSB3ZWlsIGVyIGRhcyBPYmpla3QgbmljaHQKKyAgICB3ZWdnZWJlbiBkYXJmIG9kZXIgZGVyIEJlaGFlbHRlciBzY2hvbiB2b2xsIGlzdCwgYmVrb21tdCBlciBlaW5lCisgICAgZW50c3ByZWNoZW5kZSBGZWhsZXJtZWxkdW5nLgorCitSVUVDS0dBQkVXRVJUOgorICAgIFdlbm4gZGFzIEJld2VnZW4gZ2VrbGFwcHQgaGF0LCAxLCBhbnNvbnN0ZW4gMC4KKworQkVNRVJLVU5HOgorICAgIERpZXNlIEZ1bmt0aW9uIGlzdCBkYW5uIHNpbm52b2xsLCB3ZW5uIG1hbiBkZW4gU3BpZWxlciBlaW4gT2JqZWt0IGlyZ2VuZHdvCisgICAgaGluc3RlY2tlbiBsYXNzZW4gdW5kIHNpY2ggbmljaHQgc2VsYnN0IHVtIGRpZSBGZWhsZXJiZWhhbmRsdW5nIGt1ZW1tZXJuCisgICAgbW9lY2h0ZSAtIHVuZCBkYSB1bnphZWhsaWdlIHZlcnNjaGllZGVuZSBEaW5nZSBzY2hpZWZnZWhlbiBrb2VubmVuIHVuZAorICAgIG1hbmNoZSBPYmpla3RlIGVpZ2VuZSBGZWhsZXJtZWxkdW5nZW4gZGVmaW5pZXJlbiwgZWlnZW50bGljaCBpbW1lci4KKworICAgIERpZSBGdW5rdGlvbiBwcnVlZnQgbmljaHQsIG9iIHNpY2ggZGFzIE9iamVrdCB1bmQgZGVyIEJlaGFlbHRlciB1ZWJlcmhhdXB0CisgICAgaW4gZGVyIFJlaWNod2VpdGUgZGVzIFNwaWVsZXJzL05QQyBiZWZpbmRlbiwgZGFzIG11c3MgbWFuIGdnZi4gc2VsYnN0CisgICAgZXJtaXR0ZWxuLgorCitTSUVIRSBBVUNIOgorICAgIG1vdmUoTCksIFBfUFVUX01TRywgcHV0X29iamVjdHMoTCksIFBfTk9JTlNFUlRfTVNHLCBQX05PTEVBVkVfTVNHLAorICAgIFBfVE9PX01BTllfTVNHLCBQX1RPT19IRUFWWV9NU0csIFBfRU5WX1RPT19IRUFWWV9NU0csIFBfTk9HRVQsIFBfTk9EUk9QCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFRodSBBdWcgMjggMjI6MjE6NTggMjAwOCBieSBBbXludGhvcgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vcHV0X29iaiBiL2RvYy9sZnVuL3B1dF9vYmoKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYxYjI5OQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL3B1dF9vYmoKQEAgLTAsMCArMSwzMCBAQAorcHV0X29iaigpCisKK0ZVTktUSU9OCisgICAgaW50IHB1dF9vYmoob2JqZWN0IG9iLCBvYmplY3Qgd2hlcmUpCisKK0RFRklOSUVSVCBJTjoKKworICAgIC9zdGQvbGl2aW5nL3B1dF9hbmRfZ2V0LmMKKworQVJHVU1FTlRFOgorCisgICAgb2IgICAgICBEYXMgT2JqZWt0LCBkYXMgaXJnZW5kd28gaGluZWluZ2VsZWd0IHdlcmRlbiBzb2xsLgorICAgIHdoZXJlICAgRGFzICh0b3RlKSBPYmpla3QsIGluIGRhcyBldHdhcyBoaW5laW5nZWxlZ3Qgd2VyZGVuIHNvbGwuCisKK0JFU0NIUkVJQlVORzoKKworICAgIERhcyBMZWJld2VzZW4sIGluIGRlbSBkaWVzZSBGdW5rdGlvbiBhdWZnZXJ1ZmVuIHdlcmRlbiBzb2xsLCBsZWd0CisgICAgZGVuIGFuZ2VnZWJlbmVuIEdlZ2Vuc3RhbmQgKG9iKSBpbiBkYXMgYW5nZWdlYmVuZSBaaWVsb2JqZWt0ICh3aGVyZSkuCisgICAgRGFiZWkgc29sbHRlIGVzIHNpY2ggYmVpIHdoZXJlIHVtIGVpbmVuIENvbnRhaW5lci9SYXVtIGhhbmRlbG4uCisgICAgSXN0IHdoZXJlIGVpbiBMZWJld2VzZW4sIHZlcndlbmRldCBtYW4gYmVzc2VyIGdpdmVfb2JqKCkuCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgMSwgd2VubiBkYXMgT2JqZWt0IHdlZ2dlbGVndCB3dXJkZSBvZGVyIGRpZXMgbmljaHQgbW9lZ2xpY2ggd2FyLiAoaW4gZGllc2VtCisgICAgRmFsbCB3aXJkIGF1Y2ggZGlyZWt0IGVpbmUgVGV4dGF1c2dhYmUgYXVzZ2VnZWJlbikKKyAgICAwIHNvbnN0LCBpbiBkaWVzZW0gRmFsbCB3aXJkIGluIG5vdGlmeV9mYWlsIGVpbmUgcGFzc2VuZGUgQXVzZ2FiZQorICAgIHBsYXppZXJ0CisKK1NJRUhFIEFVQ0g6CisKKyAgICBkcm9wX29iaigpLCBmaW5kX29icygpLCBnaXZlX29iaigpLCBwaWNrX29iaigpLCAvc3RkL2xpdmluZy9wdXRfYW5kX2dldC5jCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9xdWVyeV9wcmV2ZW50X3NoYWRvdyBiL2RvYy9sZnVuL3F1ZXJ5X3ByZXZlbnRfc2hhZG93Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYjBjN2QKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9xdWVyeV9wcmV2ZW50X3NoYWRvdwpAQCAtMCwwICsxLDM0IEBACitxdWVyeV9wcmV2ZW50X3NoYWRvdyhMKQorRlVOS1RJT046CisgICAgIHZhcmFyZ3MgaW50IHF1ZXJ5X3ByZXZlbnRfc2hhZG93KG9iamVjdCBzaGFkb3dlcikKKworUEFSQU1FVEVSOgorICAgICBvYmplY3Qgc2hhZG93ZXIJLSBkYSBPYmpla3QsIGRhcyBlaW5lIEJlc2NoYXR0dW5nIGJlYW50cmFndAorCitCRVNDSFJFSUJVTkc6CisgICAgIERpZXNlIE1ldGhvZGUga2FubiBpbiBPYmpla3RlbiBkZWZpbmllcnQgd2VyZGVuLCBkaWUgbmljaHQgYmVzY2hhdHRldAorICAgICB3ZXJkZW4gd29sbGVuIG9kZXIgYW5oYW5kIGRlcyBPYmpla3RlcyBzaGFkb3dlciBlbnRzY2hlaWRlbiB3b2xsZW4gb2IKKyAgICAgc2llIGJlc2NoYXR0ZXQgd2VyZGVuIHdvbGxlbi4KKworICAgICBHaWJ0IGRpZSBGdW5rdGlvbiAwIHp1cnVlY2ssIHdpcmQgZWluIFNoYWRvdyBhdWYgZGFzIE9iamVrdCBlcmxhdWJ0LAorICAgICBzb25zdCBzY2hsYWVndCBlcyBmZWhsLgorCitCRUlTUElFTDoKKyAgICAgLy8gZ2VuZXJlbGwga2VpbmUgQmVzY2hhdHR1bmcKKyAgICAgaW50IHF1ZXJ5X3ByZXZlbnRfc2hhZG93KG9iamVjdCB3aG8pIHsKKyAgICAgIHJldHVybiAxOworICAgICB9CisKKyAgICAgLy8gQmVzY2hhdHR1bmcgZHVyY2ggb2ZmaXppZWxsZSBPYmpla3RlIGVybGF1YnQKKyAgICAgaW50IHF1ZXJ5X3ByZXZlbnRfc2hhZG93KG9iamVjdCB3aG8pIHsKKyAgICAgIGlmKHdobyAmJiAhc3Ryc3RyKG9iamVjdF9uYW1lKHdobyksIi9zdGQvcGxheWVyIikpCisgICAgICAgcmV0dXJuIDA7CisgICAgICByZXR1cm4gMTsKKyAgICAgfQorCitTSUVIRSBBVUNIOgorICAgICBSZWNodGU6CSAgICAgcXVlcnlfYWxsb3dfc2hhZG93KE0pCisgICAgIEdlbmVyZWxsOgkgICAgIHNoYWRvdyhFKSwgdW5zaGFkb3coRSkKKyAgICAgSW5mb3JtYXRpb25lbjogIHF1ZXJ5X3NoYWRvd2luZyhFKQorCisyMC4gTWFpIDIwMDQgR2xvaW5zb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9xdWVyeV9yZWFsX25hbWUgYi9kb2MvbGZ1bi9xdWVyeV9yZWFsX25hbWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc2MzNkZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL3F1ZXJ5X3JlYWxfbmFtZQpAQCAtMCwwICsxLDE1IEBACitxdWVyeV9yZWFsX25hbWUoKQorCitTWU5PUFNJUzoKKwlzdHJpbmcgcXVlcnlfcmVhbF9uYW1lKHZvaWQpCisKK0RFU0NSSVBUSU9OOgorCVRoZSByZXN1bHQgb2YgdGhpc19wbGF5ZXIoKS0+cXVlcnlfcmVhbF9uYW1lKCkgaXMgdXNlZCBhcworCWRlZmF1bHQgYXJndW1lbnQgZm9yIHRoZSBlZnVuIHdpemxpc3QoKS4KKworCUlmIExPR19TSE9VVCB3YXMgI2RlZmluZWQgaW4gdGhlIHBhcnNlciBhdCBjb21waWxlIHRpbWUsIHRoZQorCWVmdW4gc2hvdXQgd2lsbCB1c2UgcXVlcnlfcmVhbF9uYW1lKCkgdG8gbG9nIHRoZSBzaG91dGVyJ3MKKwluYW1lLgorCitTRUUgQUxTTzoKKwlzaG91dChFKSwgd2l6bGlzdChFKQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vcXVlcnlfd2VpZ2h0X2NvbnRlbnRzIGIvZG9jL2xmdW4vcXVlcnlfd2VpZ2h0X2NvbnRlbnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzOTgwZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9xdWVyeV93ZWlnaHRfY29udGVudHMKQEAgLTAsMCArMSwyMCBAQAorcXVlcnlfd2VpZ2h0X2NvbnRlbnRzKCkKKworRlVOS1RJT046CisgICAgIGludCBxdWVyeV93ZWlnaHRfY29udGVudHMoKQorCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvY29udGFpbmVyL3Jlc3RyaWN0aW9ucy5jCisKK0FSR1VNRU5URToKKyAgICAga2VpbmUKKworQkVTQ0hSRUlCVU5HOgorICAgICBHaWJ0IGRhcyBHZXdpY2h0IGRlcyBJbmhhbHRlcyBkZXMgQmVoYWVsdGVycyB6dXJ1ZWNrIChvaG5lCisgICAgIEJlcnVlY2tzaWNodGlndW5nIHZvbiBQX1dFSUdIVF9QRVJDRU5UISkKKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgRGFzIEdld2ljaHQgZGVzIEJlaGFlbHRlcmluaGFsdGVzLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBXZWQgTWF5IDggMTA6MjM6MzIgMTk5NiBieSBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9sZnVuL3JlZHVjZV9oaXRfcG9pbnRzIGIvZG9jL2xmdW4vcmVkdWNlX2hpdF9wb2ludHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzliMzM2OAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL3JlZHVjZV9oaXRfcG9pbnRzCkBAIC0wLDAgKzEsNDMgQEAKK3JlZHVjZV9oaXRfcG9pbnRzKCkKK0ZVTktUSU9OOgorICAgIGludCByZWR1Y2VfaGl0X3BvaW50cyhpbnQgZGFtYWdlKQorCitERUZJTklFUlQgSU46CisgICAgL3N0ZC9saXZpbmcvbGlmZS5jCisKK0FSR1VNRU5URToKKyAgICBpbnQgZGFtYWdlCS0gZGVyIHp1Z2VmdWVndGUgU2NoYWRlbgorCitCRVNDSFJFSUJVTkc6CisgICAgRGVtIExlYmV3ZXNlbiB3ZXJkZW4gZGFtYWdlIExlYmVuc3B1bmt0ZSBhYmdlem9nZW4sIGFiZXIgZGVyCisgICAgV2VydCB3aXJkIGhpbnRlcmhlciBuaWNodCBrbGVpbmVyIGFscyAxIHNlaW4gdW5kIGRhcyBMZWJld2VzZW4KKyAgICB3aXJkIGRhZHVyY2ggbmljaHQgc3RlcmJlbi4KKworUlVFQ0tHQUJFV0VSVDoKKyAgICBEaWUgdmVyYmxlaWJlbmRlbiBMZWJlbnNwdW5rdGUuCisKK0JFSVNQSUVMRToKKyAgICB3cml0ZSgiUGxvZXR6bGljaCBzY2hpZXNzdCBlaW5lIHNjaGV1c3NsaWNoZSBLcmVhdHVyIGF1cyBkZXIgUGZ1ZXR6ZSAiKworICAgICAgICAgICJoZXJhdXMgdW5kXG5iZWlzc3QgRGljaCBpbnMgQmVpbiwgc2llIHZlcnNjaHdpbmRldCBzbyBzY2huZWxsLCAiKworICAgICAgICAgICJ3aWUgc2llIGdla29tbWVuIGlzdC5cbiIpOworICAgIHRoaXNfcGxheWVyKCktPnJlZHVjZV9oaXRfcG9pbnRzKDUwKTsKKyAgICAoQXVzenVnIGF1cyAvcGxheWVycy9ib2luZy9mcmllZGhvZi9yb29tL2NhdDF4OSkKKworQkVNRVJLVU5HRU46CisgICAgZGFtYWdlIGthbm4gYXVjaCBlaW4gbmVnYXRpdmVyIFdlcnQgc2VpbiwgZGFubiB3ZXJkZW4gZGVtIExlYmV3ZXNlbgorICAgIGRpZXNlIExlYmVuc3B1bmt0ZSBndXRnZXNjaHJpZWJlbiB1bmQgYXVmIGRpZSBha3R1ZWxsZW4gTGViZW5zcHVua3RlCisgICAgYWRkaWVydC4gRGEgZGllcyBlaW5lIEZvcm0gZGVyIEhlaWx1bmcgaXN0LCBudXIgbmFjaCBSdWVja3NwcmFjaGUgbWl0CisgICAgZGVtIFJlZ2lvbnNtYWdpZXIgdmVyd2VuZGVuLgorCisgICAgQmVpIEhlaWxzdGVsbGVuIHNvbGx0ZSBlaW5lIGV2dGwuIEhlaWx1bmcgZGVzIFNwaWVsZXJzIG1pdCBkZXIgZWlnZW5zCisgICAgZGFmdWVyIGVpbmdlcmljaHRldGVuIEZ1bmt0aW9uIGNoZWNrX2FuZF91cGRhdGVfdGltZWRfa2V5IHJlYWxpc2llcnQKKyAgICB3ZXJkZW4uCisKK1NJRUhFIEFVQ0g6CisgICAgR2VnZW5wYXJ0OglyZXN0b3JlX2hpdF9wb2ludHMoKQorICAgIFZlcndhbmR0Oglkb19kYW1hZ2UoKSwgRGVmZW5kKCksIHJlZHVjZV9zcGVsbF9wb2ludHMoKQorICAgIFByb3BzOglQX0hQCisgICAgS29uemVwdDoJaGVpbHVuZworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBTYXQgRGVjIDEzIDAxOjAwOjQ3IDE5OTkgYnkgVGlsbHkKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL3JlZHVjZV9zcGVsbF9wb2ludHMgYi9kb2MvbGZ1bi9yZWR1Y2Vfc3BlbGxfcG9pbnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYzA2MzAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9yZWR1Y2Vfc3BlbGxfcG9pbnRzCkBAIC0wLDAgKzEsMjcgQEAKK3JlZHVjZV9zcGVsbF9wb2ludHMoKQorRlVOS1RJT046CisgICAgdm9pZCByZWR1Y2Vfc3BlbGxfcG9pbnRzKGludCBwb2ludHMpCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3RkL2xpdmluZy9saWZlLmMKKworQVJHVU1FTlRFOgorICAgIHBvaW50czogQW56YWhsIGRlciBLb256ZW50cmF0aW9uc3B1bmt0ZSBkaWUgYWJnZXpvZ2VuIHdlcmRlbiBzb2xsZW4uCisKK0JFU0NIUkVJQlVORzoKKyAgICBEZW0gTGViZXdlc2VuIHdlcmRlbiBwb2ludHMgS29uemVudHJhdGlvbnNwdW5rdGUgYWJnZXpvZ2VuLiBGYWxscworICAgIGRhcyBMZWJld2VzZW4gd2VuaWdlciBLb256ZW50cmF0aW9uc3B1bmt0ZSBoYXQsIGFscyBhYmdlem9nZW4gd2VyZGVuCisgICAgc29sbGVuLCB3ZXJkZW4gc2llIGF1ZiAwIGdlc2V0enQuCisKK0JFSVNQSUVMRToKKyAgICB3cml0ZSgiRGFzIGJvZXNlIGJvZXNlIE1vbnN0ZXIgc2NoYXV0IERpY2ggZ3JpbW1pZyBhbiB1bmQgbGFidCBzaWNoIGFuICIKKyAgICAgICAgICsiRGVpbmVyIEtvbnplbnRyYXRpb24uXG4iKTsKKyAgICB0aGlzX3BsYXllcigpLT5yZWR1Y2Vfc3BlbGxfcG9pbnRzKDUwKTsKKworU0lFSEUgQVVDSDoKKyAgICBHZWdlbnBhcnQ6CXJlc3RvcmVfc3BlbGxfcG9pbnRzKEwpCisgICAgVmVyd2FuZHQ6CXJlZHVjZV9oaXRfcG9pbnRzKEwpLCBidWZmZXJfc3AoTCkKKyAgICBQcm9wczoJUF9TUAorICAgIEtvbnplcHQ6CWhlaWx1bmcKKworMjMuRmViLjIwMDQgR2xvaW5zb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9yZWdpc3Rlcl9tb2RpZmllciBiL2RvYy9sZnVuL3JlZ2lzdGVyX21vZGlmaWVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1OWEwNTAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9yZWdpc3Rlcl9tb2RpZmllcgpAQCAtMCwwICsxLDI0IEBACityZWdpc3Rlcl9tb2RpZmllcigpCitGVU5LVElPTjoKKyAgICAgdm9pZCByZWdpc3Rlcl9tb2RpZmllcihvYmplY3QgbW9kaWZpZXIpCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N0ZC9saXZpbmcvYXR0cmlidXRlcy5jCisNCitQQVJBTUVURVI6DQorICAgICBtb2RpZmllcgktIE9iamVrdCBtaXQgUF9YX0FUVFJfTU9EIG9kZXIgUF9NX0FUVFJfTU9EDQorCitCRVNDSFJFSUJVTkc6CisgICAgIFJlZ2lzdHJpZXJ0IGVpbmVuIE1vZGlmaWVyIGltIFNwaWVsZXIuIFdpcmQgZHVyY2ggSW5zZXJ0U2Vuc2l0aXZlT2JqZWN0CisgICAgIGJlemllaHVuZ3N3ZWlzZSBiZWltIEFuemllaGVuIG9kZXIgWnVlY2tlbiBnZXJ1ZmVuLgorICAgICBNdXNzIG5pY2h0IGRpcmVrdCBnZXJ1ZmVuIHdlcmRlbi4gQmVpIFZlcmFlbmRlcnVuZ2VuIHZvbiBNb2RpZmlrYXRvcmVuCisgICAgIHNvbGx0ZSBzdGF0dGRlc3NlbiBVcGRhdGVBdHRyaWJ1dGVzIGdlcnVmZW4gd2VyZGVuLiAgICAgCisKK1NJRUhFIEFVQ0g6CisgICAgIFF1ZXJ5QXR0cmlidXRlKCksIFF1ZXJ5UmVhbEF0dHJpYnV0ZSgpLCBRdWVyeUF0dHJpYnV0ZU9mZnNldCgpLA0KKyAgICAgU2V0QXR0cigpLCBTZXRBdHRyaWJ1dGUoKSwgU2V0UmVhbEF0dHJpYnV0ZSgpLCBVcGRhdGVBdHRyaWJ1dGVzKCksDQorICAgICBkZXJlZ2lzdGVyX21vZGlmaWVyKCksIFBfQVRUUklCVVRFUywgUF9BVFRSSUJVVEVTX09GRlNFVFMsIAorICAgICBQX0FUVFJJQlVURVNfTU9ESUZJRVIsUF9YX0FUVFJfTU9ELCBQX01fQVRUUl9NT0QsIAorICAgICAvc3RkL2xpdmluZy9hdHRyaWJ1dGVzLmMNCisKKzEzLkp1bi4yMDA0LCBNdWFkaWIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9yZW1vdmUgYi9kb2MvbGZ1bi9yZW1vdmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFmYzU5YQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL3JlbW92ZQpAQCAtMCwwICsxLDM0IEBACityZW1vdmUoKQorCitGVU5LVElPTjoKKyAgICAgdmFyYXJncyBpbnQgcmVtb3ZlKGludCBzaWxlbnQpOworCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvdGhpbmcvbW92aW5nLmMKKyAgICAgL3N0ZC9saXZpbmcvbW92aW5nLmMKKyAgICAgL3N0ZC9yb29tL21vdmluZy5jCisKK0FSR1VNRU5URToKKyAgICAgc2lsZW50CisgICAgICAgICAgRmFsbHMgdW5nbGVpY2ggMCwgc28gd2VyZGVuIGJlaW0gWmVyc3RvZXJlbiBrZWluZSBNZWxkdW5nZW4KKyAgICAgICAgICBhdXNnZWdlYmVuLgorCitCRVNDSFJFSUJVTkc6CisgICAgIEJlaW0gQXVmcnVmIGRpZXNlciBGdW5rdGlvbiBlbnRmZXJudCBzaWNoIGRhcyBPYmpla3Qgc2VsYnN0LiBEdXJjaAorICAgICBVZWJlcmxhZGVuIGRpZXNlciBGdW5rdGlvbiBrYW5uIG1hbiBkaWVzZW4gVm9yZ2FuZyBub2NoIGR1cmNoIGRpZQorICAgICBBdXNnYWJlIHZvbiBNZWxkdW5nZW4ga29tbWVudGllcmVuLCBvZGVyIGlyZ2VuZHdlbGNoZSBEYXRlbgorICAgICBhYnNwZWljaGVybiwgb2RlciBkYXMgWmVyc3RvZXJlbiBnYW56IHZlcmhpbmRlcm4gKGF1ZiBkaWVzZW0gV2VnLi4uIE1pdAorICAgICBkZXN0cnVjdCgpIGthbm4gZGFzIE9iamVrdCBpbW1lciBub2NoIGRpcmVrdCB6ZXJzdG9lcnQgd2VyZGVuISkKKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgMSwgd2VubiBzaWNoIGRhcyBPYmpla3QgZXJmb2xncmVpY2ggc2VsYnN0IHplcnN0b2VydCBoYXQsIHNvbnN0IDAuCisKK0JFTUVSS1VOR0VOOgorICAgICBOYWNoIGVpbmVtIGVyZm9sZ3JlaWNoZW4gOjpyZW1vdmUoKSBnZWx0ZW4gZGllIHNlbGJlbiBFaW5zY2hyYWVua3VuZ2VuCisgICAgIHdpZSBuYWNoIGVpbmVtIGRlc3RydWN0KCkhCisKK1NJRUhFIEFVQ0g6CisgICAgIGRlc3RydWN0KCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogV2VkIE1heSA4IDEwOjIzOjQwIDE5OTYgYnkgV2FyZ29uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9yZW1vdmVfbXVsdGlwbGUgYi9kb2MvbGZ1bi9yZW1vdmVfbXVsdGlwbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM0MGZkMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL3JlbW92ZV9tdWx0aXBsZQpAQCAtMCwwICsxLDU4IEBACityZW1vdmVfbXVsdGlwbGUoKQorRlVOS1RJT046CisgICAgIHB1YmxpYyB2YXJhcmdzIGludCByZW1vdmVfbXVsdGlwbGUoaW50IGxpbWl0LCBtaXhlZCBmdW4pOworCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvY29udGFpbmVyL2l0ZW1zLmMKKworQVJHVU1FTlRFOgorICAgICBsaW1pdDogQW56YWhsIGdsZWljaGVyIE9iamVrdGUsIGRpZSB2ZXJibGVpYmVuIHNvbGxlbi4KKyAgICAgZnVuOiAgIEZ1bmt0aW9uc25hbWUgKHN0cmluZykgb2RlciBDbG9zdXJlLgorCitCRVNDSFJFSUJVTkc6CisgICAgIFdpcmQgZGllc2UgRnVua3Rpb24gYXVmZ2VydWZlbiwgd2VyZGVuIGFsbGUgZ2xlaWNoZW4gT2JqZWt0ZQorICAgICAoc3RhbmRhcmRtYWVzc2lnIGRlZmluaWVydCBhbHMgZ2xlaWNoZXIgTGFkZW5hbWUsIGdsZWljaGUKKyAgICAgIEt1cnpiZXNjaHJlaWJ1bmcgdW5kIGdsZWljaGUgTGFuZ2Jlc2NocmVpYnVuZyksIGRlcmVuIEFuemFobCA8bGltaXQ+CisgICAgIHVlYmVyc2NocmVpdGV0LCBlbnRmZXJudC4KKyAgICAgCisgICAgIEF1c25haG1lbjogTGViZXdlc2VuIHVuZCBwZXIgQWRkSXRlbSgpIGhpbnp1Z2VmdWVndGUgT2JqZWt0ZS4KKworICAgICBNaXQgZGVtIEFyZ3VtZW50IDxmdW4+IGxhc3NlbiBzaWNoIGRpZSBLcml0ZXJpZW4gZnVlciBkaWUgIkdsZWljaGhlaXQiCisgICAgIGFlbmRlcm4uCisgICAgIElzdCA8ZnVuPiBlaW4gRnVua3Rpb25zbmFtZSwgd2lyZCBkaWVzZSBGdW5rdGlvbiBhbiBhbGxlbiBpbiBGcmFnZQorICAgICBrb21tZW5lbmRlbiBPYmpla3RlbiBpbSBDb250YWluZXIgZ2VydWZlbi4KKyAgICAgSXN0IDxmdW4+IGVpbmUgQ2xvc3VyZSwgd2VyZGVuIHNpZSBmdWVyIGplZGVzIGluIEZyYWdlIGtvbW1lbmRlIE9iamVrdAorICAgICBlaW5tYWwgZ2VydWZlbiB1bmQgaWhyIGRhcyBPYmpla3QgdWViZXJnZWJlbi4KKyAgICAgQWxzICdnbGVpY2gnIHdlcmRlbiBhbGxlIE9iamVrdGUgYmV0cmFjaHRldCwgZnVlciBkaWUgPGZ1bj4gZGVuIGdsZWljaGVuCisgICAgIFdlcnQgenVydWVja2xpZWZlcnQuCisgICAgIE9iamVrdGUsIGZ1ZXIgZGllIDxmdW4+IDAgenVydWVja2xpZWZlcnQsIHdlcmRlbiBpZ25vcmllcnQuCisKK0JFTUVSS1VOR0VOOgorICAgICAxKSBSYWV1bWUgcnVmZW4gcmVtb3ZlX211bHRpcGxlKDMpIHN0YW5kYXJkbWFlc3NpZyBpbSByZXNldCgpLCBqZWRvY2gKKyAgICAgICAgbnVyLCB3ZW5uIGtlaW4gU3BpZWxlciBhbndlc2VuZCBpc3QgdW5kIG1laHIgYWxzIDEwIE9iamVrdGUgaW0gUmF1bQorICAgICAgICBzaW5kLgorICAgICAyKSByZW1vdmVfbXVsdGlwZSgwKSBlbnRmZXJudCBhbGxlIGVudGZlcm5iYXJlbiBPYmpla3RlIChzLiBBdXNuYWhtZW4pLgorCitCRUlTUElFTEU6CisgICAgIEVpbiBDb250YWluZXIgZW50aGFlbHQgNSBGYWNrZWxuLiBJbSByZXNldCgpIHJ1ZnQgbWFuIG51bgorICAgICByZW1vdmVfbXVsdGlwbGUoMykgYXVmLiBBbnNjaGxpZXNzZW5kIHNpbmQgbm9jaCAzIEZhY2tlbG4gdWVicmlnLgorICAgICAKKyAgICAgQWxsZSB2ZXJibGVpYmVuZGVuIE9iamVrdGUgaW0gQ29udGFpbmVyIHNvbGxlbiB1bnRlcnNjaGllZGxpY2hlIE5hbWVuCisgICAgIGhhYmVuOgorICAgICByZW1vdmVfbXVsdGlwbGUoMSwgIm5hbWUiKTsKKworICAgICBFaW4gQ29udGFpbmVyIHNvbGwgbnVyIGVpbiBPYmpla3QgYmVoYWx0ZW4sIHdlbGNoZXMgZ3JvZXNzZXIgYWxzIDcwIGNtCisgICAgIGlzdDoKKyAgICAgaW50IGdyb2Vzc2VuX2ZpbHRlcihvYmplY3Qgb2IpIHsKKyAgICAgICBpZiAob2ItPlF1ZXJ5UHJvcChQX1NJWkUgPiA3MCkpIHJldHVybiAxOworICAgICAgIHJldHVybiAwOyAvLyBkYW1pdCBkYXMgT2JqZWt0IGlnbm9yaWVydCB3aXJkLgorICAgICAgIC8vIEFsdGVybmF0aXYga29lbm50ZSBtYW4gc3RhdHQgMCBhdWNoIG9iamVjdF9uYW1lKG9iKSB6dXJ1ZWNrbGllZmVybiwKKyAgICAgICAvLyBkYW5uIHNpbmQgZGllc2UgT2JqZWt0ZSBhbGxlIHVudGVyc2NoaWVkbGljaC4KKyAgICAgfQorICAgICAuLi4KKyAgICAgcmVtb3ZlX211bHRpcGxlKDEsICMnZ3JvZXNzZW5fZmlsdGVyKTsKKworU0lFSEUgQVVDSDoKKyAgICAgcmVzZXQoKQorCiszMS4wMS4yMDA5LCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9yZXNldCBiL2RvYy9sZnVuL3Jlc2V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YTIyZWUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9yZXNldApAQCAtMCwwICsxLDg4IEBACityZXNldCgpCitGVU5LVElPTjoKKyAgICAgdm9pZCByZXNldCgpOworICAgICBwcm90ZWN0ZWQgdm9pZCByZXNldCgpOworCitCRVNDSFJFSUJVTkc6CisgICAgIHJlc2V0KCkgd2lyZCB2b20gR2FtZURyaXZlciBpbiBqZWRlbSBPYmpla3QgYXVmZ2VydWZlbiwgdW0gZGVtIE9iamVrdAorICAgICBkaWUgR2VsZWdlbmhlaXQgenUgZ2ViZW4sIHNpY2ggd2llZGVyIGluIGVpbmVuIGRlZmluaWVydGVuIFp1c3RhbmQgenUKKyAgICAgdmVyc2V0emVuOiBSYWV1bWUgdW5kIE1vbnN0ZXIgZXJ6ZXVnZW4gcGVyIEFkZEl0ZW0oKSBlaW5nZWZ1ZWd0ZSB1bmQKKyAgICAgendpc2NoZW56ZWl0bGljaCBlbnRmZXJudGUgT2JqZWt0ZSBuZXUsIFR1ZXJlbiBzY2hsaWVzc2VuIHNpY2ggLi4uCisKKyAgICAgU29sYW5nZSBkYXMgT2JqZWt0ICJiZW51dHp0IiB3aXJkLCB3aXJkIHJlc2V0KCkgcmVnZWxtYWVzc2lnIGFsbGUKKyAgICAgNDUgTWludXRlbiAoKy8tMTUgTWludXRlbikgbWl0IGVpbmVyIEF1ZmxvZXN1bmcgdm9uIDJzIGF1ZmdlcnVmZW4KKyAgICAgKGQuaC4gZGVyIERyaXZlciBwcnVlZnQgdW5kIHJ1ZnQgbnVyIGFsbGUgMiBTZWt1bmRlbiByZXNldCgpIGF1ZgorICAgICBhbGxlbiBPYmpla3RlbikuCisKKyAgICAgV2lyZCBlaW5lIE9iamVrdCBuaWNodCBtZWhyICJiZW51dHp0IiwgZC5oLiB3aXJkIGFuIGVpbmVtIE9iamVrdCBuaWNodAorICAgICB2b24gYXVzc2VuIChkdXJjaCBjYWxsX290aGVyIGV0Yy4pIF9uYWNoXyBlaW5lbSByZXNldCgpIGVpbmUgTWV0aG9kZQorICAgICBiencuIExGdW4gZ2VydWZlbiwgc28gYmVrb21tdCBkaWVzZXMgT2JqZWt0IGtlaW5lbiB3ZWl0ZXJlbiByZXNldCgpLgorCisgICAgIEVpbiBGdW5rdGlvbnNhdWZydWYgYW0gT2JqZWt0IHNjaGFsdGV0IGRlbiByZXNldCgpIHdpZWRlciBlaW4uCisgICAgIEJlaSBlaW5lbSBPYmpla3QgaW4gZWluZW0gQ29udGFpbmVyIHdhZXJlIGRhcyB6QiBkYXMgQmVudXR6ZW4gZGVzCisgICAgIENvbnRhaW5lcnMgKEhpbmVpbmxlZ2VuL0hlcmF1c25laG1lbi9IaW5laW5zZWhlbikuIERhcyBrYW5uCisgICAgIHNlaHIgbGFuZ2UgZGF1ZXJuLgorCisgICAgIERpZSBBYnNjaGFsdHVuZyBrYW5uIG1hbiB2ZXJoaW5kZXJuLCBpbmRlbSBtYW4gaW0gcmVzZXQoKSBwZXIgY2FsbF9vdXQoKQorICAgICBlaW5lIEZ1bmt0aW9uIGltIE9iamVrdCBydWZ0LiBEaWVzIGFiZXIgYml0dGUgX251cl8gbWFjaGVuLCB3ZW5uIGRhcworICAgICBPYmpla3QgX3VuYmVkaW5ndF8gYXVmIGVpbmVuIHN0YWVuZGlnZW4gUmVzZXQgYW5nZXdpZXNlbiBpc3QsIGF1Y2ggd2VubgorICAgICBlcyBuaWNodCAiYmVudXR6dCIgd2lyZC4KKworICAgICBBZW5kZXJuIGxhZXNzdCBzaWNoIGRpZSBaZWl0IHp3aXNjaGVuIGRlbiBBdWZydWZlbiB2b24gcmVzZXQoKSBtaXQKKyAgICAgc2V0X25leHRfcmVzZXQoKS4gRGllIEF1ZmxvZXN1bmcgdm9uIDJzIGthbm4gbWFuIG5pY2h0IGFlbmRlcm4uCisKK0JFTUVSS1VOR0VOOgorICAgICAtIG1hbiBrYW5uIHJlc2V0KCkgbnV0emVuLCB1bSBFcmVpZ25pc3NlIGF1c3p1bG9lc2VuOgorICAgICAgIC0gZXMgaXN0IGJpbGxpZ2VyIGFscyBsYW5nZSBjYWxsX291dCgpCisgICAgICAgLSBzaWVoZSBXYXJudW5nIGJlenVlZ2xpY2ggQWJzY2hhbHRlbiBkZXMgcmVzZXQKKyAgICAgLSBtYW4ga2FubiByZXNldCgpIGFscyBwcm90ZWN0ZWQgb2RlciBzdGF0aWMgZGVmaW5pZXJlbiwgd2VubiBtYW4gbmljaHQKKyAgICAgICBtb2VjaHRlLCBkYXNzIGRpZSBGdW5rdGlvbiB2b24gYXVzc2VuIGdlcnVmZW4gd2VyZGVuIGthbm4uIERpZXMKKyAgICAgICB2ZXJoaW5kZXJ0IEVpbmZsdXNzbmFobWUgdm9uIGF1c3Nlbiwga2FubiBhYmVyIGF1Y2ggRGVidWdtYXNzbmFobWVuCisgICAgICAgZXJzY2h3ZXJlbi4gRXMgaXN0IGFiZXIgZGVubm9jaCBmdWVyIGVpbmlnZSBPYmpla3RlIHNpbm52b2xsLgorICAgICAtIGRlciBEcml2ZXIgcnVmdCByZXNldCgpIHVuYWJoYWVuZ2lnIHZvbiB6dXNhZXR6bGljaGVuLCAibWFudWVsbGVuIgorICAgICAgIFJ1ZmVuIHZvbiByZXNldCgpCisgICAgICAgLSBrZWluZSBSdWZlIHZvbiByZXNldCgpIG1pdCBjYWxsX291dCgpIGF1cyByZXNldCgpIChDYWxsb3V0LUtldHRlbi0KKyAgICAgICAgIGJpbGR1bmcgZHJvaHQpLCBmdWVyIHNvbGNoZSBGYWVsbGUgaXN0IHNldF9uZXh0X3Jlc2V0KEUpIGRhIQorICAgICAtIGJlaSBCbHVlcHJpbnRzIHNvbGx0ZSBkZXIgcmVzZXQoKSBpbiBkZXIgUmVnZWwgYWJnZXNjaGFsdGV0IHdlcmRlbiwKKyAgICAgICBzb2Zlcm4gZXIgbmljaHQgYXVmIHdpY2h0aWdlIEF1ZmdhYmVuIGluIGRlciBCUCB6dSB0dW4gaGF0OgorICAgICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZSgpIHsKKyAgICAgICAgIGlmKCFjbG9uZXAoTUUpKSB7CisgICAgICAgICAgICAgc2V0X25leHRfcmVzZXQoLTEpOworICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgIH0KKyAgICAgICAgIDo6Y3JlYXRlKCk7CisgICAgICAgICAuLi4KKyAgICAgICB9CisKK0JFSVNQSUVMRToKKyAgICAgLy8gZWluIE5QQywgZGVyIGJlaSBqZWRlbSByZXNldCgpIHNjaGF1dCwgb2IgdW0gaWhuIGhlcnVtIGJlc3NlcmUKKyAgICAgLy8gQXVzcnVlc3R1bmcgbGllZ3QgYWxzIGRpZSwgZGllIGVyIHNlbGJzdCBnZXJhZGUgdHJhZWd0OgorCisgICAgIC4uLgorICAgICB2b2lkIHJlc2V0KCkgeworICAgICAgIDo6cmVzZXQoKTsKKworICAgICAgIGlmKGNsb25lcCh0aGlzX29iamVjdCgpKSAmJiBlbnZpcm9ubWVudCgpKSB7CisgICAgICAgICBvYmplY3QgbzsKKyAgICAgICAgIG89Zmlyc3RfaW52ZW50b3J5KGVudmlyb25tZW50KCkpOworICAgICAgICAgd2hpbGUobykgeworICAgICAgICAgICAgIGxvb2tfZm9yX2dvb2Rfd2VhcG9uc19hbmRfdXNlX3RoZW1faWZfYmV0dGVyKG8pOworICAgICAgICAgICAgIG89bmV4dF9pbnZlbnRvcnkobyk7CisgICAgICAgICB9CisgICAgICAgfQorICAgICB9CisKKyAgICAgLy8gZWluIHJlc2V0IGZ1ZXIgZWluZW4gR2VnZW5zdGFuZCwgZGVyIHZpZWxsZWljaHQgaW4KKyAgICAgLy8gaW4gZWluZW0gQ29udGFpbmVyIGxhbmRldCB1bmQgZGFubiB3ZWl0ZXIgZWluZW4gcmVzZXQKKyAgICAgLy8gYmVrb21tZW4gbXVzcy9zb2xsCisKKyAgICAgdm9pZCByZXNldCgpIHsKKyAgICAgICAvLyBpcmdlbmQgZWluIENvZGUgaGllcgorICAgICAgIGNhbGxfb3RoZXIodGhpc19vYmplY3QoKSwgIj8/PyIpOyAvLyBlaW5mYWNoIG51ciB3YXMgYXVmcnVmZW4KKyAgICAgfQorCitTSUVIRSBBVUNIOgorICAgICBjbGVhbl91cCgpLCBzZXRfbmV4dF9yZXNldChFKSwgcXVlcnlfbmV4dF9yZXNldChFKQorICAgICBtZW1vcnkKKworbGV0enRlIEFlbmRlcnVuZzogMjAwOS0wMS0xNCBSdW1hdGEKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL3Jlc3RvcmVfaGl0X3BvaW50cyBiL2RvYy9sZnVuL3Jlc3RvcmVfaGl0X3BvaW50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWUzNDU3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vcmVzdG9yZV9oaXRfcG9pbnRzCkBAIC0wLDAgKzEsMzMgQEAKK3Jlc3RvcmVfaGl0X3BvaW50cygpCitGVU5LVElPTjoKKyAgICBpbnQgcmVzdG9yZV9oaXRfcG9pbnRzKGludCBoZWFsKQorCitBUkdVTUVOVEU6CisgICAgaW50IGhlYWwJLSBkZXIgenUgaGVpbGVuZGUgQmV0cmFnCisKK0JFU0NIUkVJQlVORzoKKyAgICBEZW0gTGViZXdlc2VuIHdlcmRlbiBoZWFsIExlYmVuc3B1bmt0ZSBhdWZnZXNjaGxhZ2VuLiBEaWUgSFAKKyAgICBzdGVpZ2VuIG5pY2h0IHVlYmVyIFBfTUFYX0hQLgorCitSVUVDS0dBQkVXRVJUOgorICAgIERpZSB2ZXJibGVpYmVuZGVuIExlYmVuc3B1bmt0ZS4KKworQkVJU1BJRUxFOgorICAgIHdyaXRlKCJQbG9ldHpsaWNoIHNjaGllc3N0IGVpbmUgc2NoZXVzc2xpY2hlIEtyZWF0dXIgYXVzIGRlciBQZnVldHplICIrCisgICAgICAgICAgImhlcmF1cyB1bmRcbnNjaGxlaW10IGRpY2ggaGVpbGVuZCB2b2xsLCBzaWUgdmVyc2Nod2luZGV0IHNvLCAiKworICAgICAgICAgICJ3aWUgc2llIGdla29tbWVuIGlzdC5cbiIpOworICAgIHRoaXNfcGxheWVyKCktPnJlc3RvcmVfaGl0X3BvaW50cyg1MCk7CisKK0JFTUVSS1VOR0VOOgorICAgIEJlaSBIZWlsc3RlbGxlbiBzb2xsdGUgZWluZSBldnRsLiBIZWlsdW5nIGRlcyBTcGllbGVycyBtaXQgZGVyIGVpZ2VucworICAgIGRhZnVlciBlaW5nZXJpY2h0ZXRlbiBGdW5rdGlvbiBjaGVja19hbmRfdXBkYXRlX3RpbWVkX2tleSByZWFsaXNpZXJ0CisgICAgd2VyZGVuLgorICAgIEFuc29uc3RlbiBiaXR0ZSBidWZmZXJfaHAoKSBiZW51dHplbiB1bmQgZGllIEtvbnplcHRzZWl0ZSBsZXNlbiEKKworU0lFSEUgQVVDSDoKKyAgICBHZWdlbnBhcnQ6CXJlZHVjZV9oaXRfcG9pbnRzKCkKKyAgICBWZXJ3YW5kdDoJYnVmZmVyX2hwKCksIGhlYWxfc2VsZigpLCByZXN0b3JlX3NwZWxsX3BvaW50cygpCisgICAgUHJvcHM6CVBfSFAKKyAgICBLb256ZXB0OgloZWlsdW5nCisKKzIzLkZlYi4yMDA0IEdsb2luc29uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vcmVzdG9yZV9zcGVsbF9wb2ludHMgYi9kb2MvbGZ1bi9yZXN0b3JlX3NwZWxsX3BvaW50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2MyYTZjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vcmVzdG9yZV9zcGVsbF9wb2ludHMKQEAgLTAsMCArMSwzNyBAQAorcmVzdG9yZV9zcGVsbF9wb2ludHMoKQorRlVOS1RJT046CisgICAgdm9pZCByZXN0b3JlX3NwZWxsX3BvaW50cyhpbnQgcG9pbnRzKQorCitBUkdVTUVOVEU6CisgICAgcG9pbnRzOiBBbnphaGwgZGVyIEtvbnplbnRyYXRpb25zcHVua3RlIGRpZSBndXRnZXNjaHJpZWJlbiB3ZXJkZW4gc29sbGVuLgorCitCRVNDSFJFSUJVTkc6CisgICAgRGVtIExlYmV3ZXNlbiB3ZXJkZW4gcG9pbnRzIEtvbnplbnRyYXRpb25zcHVua3RlIGd1dGdlc2NocmllYmVuLiBGYWxscworICAgIFB1bmt0ZSBhYmdlem9nZW4gd2VyZGVuIHNvbGxlbiB1bmQgZGFzIExlYmV3ZXNlbiBuaWNodCB1ZWJlciA8cG9pbnRzPgorICAgIEtvbnplbnRyYXRpb25zcHVua3RlIHZlcmZ1ZWd0LCB3ZXJkZW4gc2llIGF1ZiAwIGdlc2V0enQuCisKK1JVRUNLR0FCRVdFUlQ6CisgICAgS2VpbmVyCisKK0JFSVNQSUVMRToKKyAgICB3cml0ZSgiRGFzIGJvZXNlIGJvZXNlIE1vbnN0ZXIgc2NoYXV0IERpY2ggc3Vlc3MgYW4gdW5kIGdpYnQgZGlyIG1laHIgIgorICAgICAgICAgKyJLb256ZW50cmF0aW9uLlxuIik7CisgICAgdGhpc19wbGF5ZXIoKS0+cmVzdG9yZV9zcGVsbF9wb2ludHMoNTApOworCitCRU1FUktVTkdFTjoKKyAgICBEYSBkYXMgQmVudXR6ZW4gZGVyIEZ1bmt0aW9uIGVpbmUgSGVpbHVuZyBiZWRldXRldCwgc29sbHRlIG1hbiBiZWkKKyAgICBWZXJ3ZW5kdW5nIGF1ZiBqZWRlbiBGYWxsIFJ1ZWNrc3ByYWNoZSBtaXQgc2VpbmVtIFJNIG5laG1lbiwgYnp3CisgICAgZGllIEhlaWxzdGVsbGUgYmVpIGRlciBIZWlsdW5nc2JhbGFuY2UgZ2VuZWhtaWdlbiBsYXNzZW4uCisKKyAgICBCZWkgSGVpbHN0ZWxsZW4gc29sbHRlIGVpbmUgZXZ0bC4gSGVpbHVuZyBkZXMgU3BpZWxlcnMgbWl0IGRlciBlaWdlbnMKKyAgICBkYWZ1ZXIgZWluZ2VyaWNodGV0ZW4gRnVua3Rpb24gY2hlY2tfYW5kX3VwZGF0ZV90aW1lZF9rZXkgcmVhbGlzaWVydAorICAgIHdlcmRlbi4KKyAgICBBbnNvbnN0ZW4gYml0dGUgYnVmZmVyX3NwKCkgYmVudXR6ZW4gdW5kIGRpZSBLb256ZXB0c2VpdGUgbGVzZW4hCisKK1NJRUhFIEFVQ0g6CisgICAgR2VnZW5wYXJ0OglyZWR1Y2Vfc3BlbGxfcG9pbnRzKEwpCisgICAgVmVyd2FuZHQ6CWJ1ZmZlcl9zcChMKSwgcmVzdG9yZV9oaXRfcG9pbnRzKEwpCisgICAgUHJvcHM6CVBfU1AKKyAgICBLb256ZXB0OgloZWlsdW5nCisKKzIzLkZlYi4yMDA0IEdsb2luc29uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vc2F2ZV9tZSBiL2RvYy9sZnVuL3NhdmVfbWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdmOWUwYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL3NhdmVfbWUKQEAgLTAsMCArMSwyMSBAQAorc2F2ZV9tZShMKQorRlVOS1RJT046CisgICAgdm9pZCBzYXZlX21lKG1peGVkIHZhbHVlX2l0ZW1zKQorCitERUZJTklFUlQgSU46CisgICAgL3N0ZC9wbGF5ZXIvYmFzZS5jCisKK0FSR1VNRU5URToKKyAgICB2YWx1ZV9pdGVtcworICAgICAgIFVuZ2xlaWNoIDAsIHdlbm4gV2VydCBkZXIgR2VnZW5zdGFlbmRlIGJlcmVjaG5ldCB3ZXJkZW4gc29sbC4KKworQkVTQ0hSRUlCVU5HOgorICAgIFNwZWljaGVydCBlaW5lbiBTcGllbGVyLCBzZWluZSBBdXRvbG9hZGVyLCBiZXN0aW1tdCBzZWluIEd1aWxkUmF0aW5nCisgICAgdW5kIGJlcmVjaG5ldC9zcGVpY2hlcnQgYXVmIEFuZm9yZGVydW5nIGRlbiBXZXJ0IGRlciBnZXRyYWdlbmVuCisgICAgR2VnZW5zdGFlbmRlLgorCitTSUVIRSBBVUNIOgorICAgIFByb3BzOiAgICAgICBQX0NBUlJJRURfVkFMVUUsIFBfQVVUT0xPQURPQkosIFBfTEFTVF9MT0dPVVQKKyAgICBLb21tYW5kb3M6ICAgc2F2ZSwgZW5kZQorCisxLlNlcHRlbWJlciAyMDA4IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9zZWNvbmRfbGlmZSBiL2RvYy9sZnVuL3NlY29uZF9saWZlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YWJmZDUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9zZWNvbmRfbGlmZQpAQCAtMCwwICsxLDMwIEBACitzZWNvbmRfbGlmZSgpCisKK0ZVTktUSU9OOgorCXZhcmFyZ3MgaW50IHNlY29uZF9saWZlKG9iamVjdCBvYmopOworCitERUZJTklFUlQgSU46CisJL3N0ZC9wbGF5ZXIvbGlmZS5jCisKK0FSR1VNRU5URToKKwlvYmoKKwkgIExlaWNoZSBkZXMgTGViZXdlc2Vucy4KKworQkVTQ0hSRUlCVU5HOgorICAgICAgICBEaWVzZSBGdW5rdGlvbiB3aXJkIGltIGRpZSgpIGRlcyBMZWJld2VzZW5zIGF1ZmdlcnVmZW4sIHdlbm4gc2ljaGVyCisgICAgICAgIGlzdCwgZGFzcyBlcyBzdGlyYnQuIFVlYmxpY2hlcndlaXNlIGlzdCBkaWVzZSBGdW5rdGlvbiBudXIgaW0gU3BpZWxlcgorICAgICAgICBkZWZpbmllcnQgdW5kIHJlZ2VsdCBFUC1WZXJsdXN0IHVuZCBkZXJnbGVpY2hlbi4gRWluIFNoYWRvdyB3dWVyZGUKKyAgICAgICAgZGllc2UgRnVua3Rpb24gdWViZXJsYWdlcm4sIHVtIHp1IHZlcmhpbmRlcm4sIGRhc3MgZWluIFNwaWVsZXIgc3RpcmJ0LgorCitSVWVDS0dBQkVXRVJUOgorICAgICAgICAxLCB3ZW5uIGRhcyBMZWJld2VzZW4gbmljaHQgc3RpcmJ0LCBzb25zdCAwCisKK0JFTUVSS1VORzoKKyAgICAgICAgQmVpIE5QQ3Mgc29sbHRlIG1hbiBkaXJla3QgZGllKCkgdWViZXJzY2hyZWliZW4sIHdlbm4gbWFuIG5pY2h0CisgICAgICAgIG1vZWNodGUsIGRhc3Mgc2llIHN0ZXJiZW4uCisKK1NJRUhFIEFVQ0g6CisgICAgICAgIGRpZSgpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IDIwMTUtSmFuLTE5LCBBcmF0aG9ybiAKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL3NlbGxfb2JqIGIvZG9jL2xmdW4vc2VsbF9vYmoKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMzNjJmMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL3NlbGxfb2JqCkBAIC0wLDAgKzEsNTIgQEAKK3NlbGxfb2JqKCkNCisNCitGdW5rdGlvbjoNCisgICAgc3RhdGljIHN0cmluZyBzZWxsX29iaihvYmplY3Qgb2IsIGludCBzaG9ydCkNCisNCitEZWZpbmllcnQgaW46DQorICAgIC9zdGQvcm9vbS9zaG9wDQorDQorQXJndW1lbnRlOg0KKyAgICBvYjoNCisgICAgICBEYXMgYW56dWthdWZlbmRlIE9iamVrdA0KKyAgICBzaG9ydDoNCisgICAgICBHaWJ0IGFuLCBvYiBkZXIgVmVya2FldWZlciBudXIgZWluIE9iamVrdCAoMCkgb2RlciBtZWhyZXJlICgxKSANCisgICAgICB2ZXJrYXVmdC4gKFZlcmthdWZlIGFsbGVzIGV0Yy4pDQorDQorQmVzY2hyZWlidW5nOg0KKyAgICBFcm1pdHRlbHQgb2IgZGVyIExhZGVuIGJlcmVpdCBpc3QsIDxvYj4gYW56dWthdWZlbi4NCisNCitSdWVja2dhYmV3ZXJ0Og0KKyAgICBNZWxkdW5nIGRpZSBhdXNnZWdlYmVuIHdpcmQsIHdlbm4gZWluIE9iamVrdCBhYmdlbGVobnQgd2lyZCBvZGVyIDAuDQorDQorQmVtZXJrdW5nOg0KKyAgICBNYW4gc29sbHRlIGltIG5vcm1hbGZhbGwgX25pZW1hbHNfIGVpbmZhY2ggMCB6dXJ1ZWNrZ2ViZW4sIHNvbmRlcm4gZGFzIA0KKyAgICBnZWVyYnRlIHNlbGxfb2JqKCkgYXVzIC9zdGQvcm9vbS9zaG9wLCBkYW1pdCBiZWlzcGllbHN3ZWlzZSBQX05PQlVZIA0KKyAgICBiZWFjaHRldCB3aXJkLg0KKw0KK0JlaXNwaWVsOg0KKyAgICBFaW4gU2NobWllZCwgZGVyIG51ciBXYWZmZW4gYW5rYXVmdDoNCisgICAgDQorICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZSgpDQorICAgIHsNCisgICAgICAuLi4NCisgICAgfQ0KKyAgICANCisgICAgc3RhdGljIHN0cmluZyBzZWxsX29iaihvYmplY3Qgb2IsIGludCBzaG9ydCkNCisgICAgew0KKyAgICAgIGlmKCFvYi0+UXVlcnlQcm9wKFBfV0VBUE9OX1RZUEUpKQ0KKyAgICAgIHsNCisgICAgICAgIHJldHVybiAiSWNoIGJpbiBudXIgYW4gV2FmZmVuIGludGVyZXNzaWVydC4iOw0KKyAgICAgIH0NCisgICAgICByZXR1cm4gOjpzZWxsX29iaihvYixzaG9ydCk7DQorICAgIH0NCisNCitTaWVoZSBhdWNoOg0KKyAgICBGdW5rdGlvbmVuOg0KKyAgICAgIEFkZEZpeGVkT2JqZWN0KCksIFJlbW92ZUZpeGVkT2JqZWN0KCksIFNldFN0b3JhZ2VSb29tKCksIA0KKyAgICAgIFF1ZXJ5U3RvcmFnZVJvb20oKSwgUXVlcnlCdXlWYWx1ZSgpLCBRdWVyeUJ1eUZhY3QoKSwgYnV5X29iaigpDQorICAgIFByb3BlcnRpZXM6DQorICAgICAgUF9LRUVQRVIsIFBfTUlOX1NUT0NLLCBQX1NUT1JFX0NPTlNVTUUNCisNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitMZXR6dGUgQWVuZGVydW5nOiAyMS4wNS4yMDE0LCBCdWdmaXgNCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9zZXRfb2JqZWN0X25leHRfcmVzZXQgYi9kb2MvbGZ1bi9zZXRfb2JqZWN0X25leHRfcmVzZXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhkZmEyZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL3NldF9vYmplY3RfbmV4dF9yZXNldApAQCAtMCwwICsxLDI1IEBACitzZXRfb2JqZWN0X25leHRfcmVzZXQoKQorCitGVU5LVElPTjoKKwlpbnQgc2V0X29iamVjdF9uZXh0X3Jlc2V0KG9iamVjdCBvYiwgaW50IHplaXQgKTsKKworREVGSU5JRVJUIElOOiAvc2VjdXJlL2RlYnVnLmMKKworQVJHVU1FTlRFOgorCW9iOiBEYXMgT2JqZWt0LCBkZXNzIFJlc2V0IGdlc2V0enQgd2VyZGVuIHNvbGwuCisgIHplaXQ6IFplaXQgYmlzIHp1bSBuYWVjaHN0ZW4gUmVzZXQgdm9uIG9iLgorCitGVU5LVElPTjoKKyAgRGllIEZ1bmt0aW9uIHJ1ZnQgbGV0enRlbmRsaWNoIHNldF9uZXh0X3Jlc2V0KCkgaW4gPG9iPiBhdWYgdW5kIHNldHp0IGRhaGVyCisgIGRlc3NlbiBSZXNldHplaXQgYXVmIGVpbmVuIG5ldWVuIFdlcnQuIERpZXMgaXN0IHp1IERlYnVnendlY2tlbiBnZWRhY2h0LgorCisgIERpZSBCZW51dHp1bmcgaXN0IG51ciBmdWVyIEVNKyBtb2VnbGljaC4KKworUlVFQ0tHQUJFV0VSVDoKKwlHaWJ0IGRlbiBSdWVja2dhYmV3ZXJ0IGRlcyBzZXRfbmV4dF9yZXNldCgpLUF1ZnJ1ZnMgaW4gPG9iPiB6dXJ1ZWNrLgorCitTSUVIRSBBVUNIOgorCXNldF9uZXh0X3Jlc2V0KEUpCisKKzEwLjEwLjIwMDcsIFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vc2hvb3RfZGFtIGIvZG9jL2xmdW4vc2hvb3RfZGFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkODJkMDIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9zaG9vdF9kYW0KQEAgLTAsMCArMSw0MCBAQAorc2hvb3RfZGFtKCkKKworRlVOS1RJT046CisgICAgc3RhdGljIGludCBzaG9vdF9kYW0obWFwcGluZyBzaG9vdCkKKworREVGSU5JRVJUIElOOgorICAgIC9zdGQvcmFuZ2VkX3dlYXBvbi5jCisKK0FSR1VNRU5URToKKyAgICBtYXBwaW5nIHNob290IC0gU2NodXNzZGF0ZW4KKworQkVTQ0hSRUlCVU5HOgorICAgIEVyaGFlbHQgdm9uIC9zdGQvcmFuZ2VkX3dlYXBvbjo6Y21kX3Nob290KCkgZGllIFNjaHVzc2RhdGVuIHVuZCBiZXJlY2huZXQKKyAgICBkZW4gU2NoYWRlbiBkZXIgV2FmZmUsIGJhc2llcmVuZCBhdWYgZGVuIFBfU0hPT1RJTkdfV0Mgdm9uIFdhZmZlIHVuZAorICAgIE11bml0aW9uIHNvd2llIGRlciBHZXNjaGlja2xpY2hrZWl0IGRlcyBTY2h1ZXR6ZW4uIEhpdEZ1bmNzIGRlciBNdW5pdGlvbgorICAgIHVuZCBTa2lsbHMgd2VyZGVuIGhpZXIgZWJlbmZhbGxzIGJlcnVlY2tzaWNodGlndC4KKworUlVFQ0tHQUJFV0VSVDoKKyAgICBTY2hhZGVuLiBFYmVuZmFsbHMgaW4gJ3Nob290JyB1bnRlciBTSV9TS0lMTERBTUFHRSBha3R1YWxpc2llcnQuCisKK0JFTUVSS1VOR0VOOgorICAgICdzaG9vdCcgZW50aGFlbHQgbm9ybWFsZXJ3ZWlzZSBmb2xnZW5kZSBFaW50cmFlZ2U6CisgICAgKiBLZXkgUF9XRUFQT046ICAgICAgIGRpZSBTY2h1c3N3YWZmZQorICAgICogS2V5IFBfV0VBUE9OX1RZUEU6ICBQX0FNTVVOSVRJT04sIGFsc28gZGllIE11bml0aW9ucy1JRAorICAgICogS2V5IFBfU1RSRVRDSF9USU1FOiBQX1NUUkVUQ0hfVElNRSBkZXIgV2FmZmUKKyAgICAqIEtleSBQX1dDOiAgICAgICAgICAgUF9TSE9PVElOR19XQyBkZXIgV2FmZmUKKyAgICAqIEtleSBQX1NIT09USU5HX1dDOiAgUF9TSE9PVElOR19XQyBkZXIgTXVuaXRpb24KKyAgICAqIEtleSBQX0FNTVVOSVRJT046ICAgTXVuaXRpb25zb2JqZWt0IChldmVudHVlbGwgVW5pdCkKKyAgICAqIEtleSBTSV9FTkVNWTogICAgICAgZ3VlbHRpZ2VuIEdlZ25lcgorICAgICogS2V5IFNJX1NLSUxMREFNQUdFX1RZUEU6ICBTY2hhZGVuIChhdXMgUF9EQU1fVFlQRSBkZXIgTXVuaXRpb24pCisgICAgKiBLZXkgU0lfU0tJTExEQU1BR0VfTVNHLzI6IE11bml0aW9uc25hbWUKKworU0lFSEUgQVVDSDoKKyAgICBHZW5lcmVsbDogIFBfQU1NVU5JVElPTiwgUF9TSE9PVElOR19XQywgUF9TVFJFVENIX1RJTUUKKyAgICBNZXRob2RlbjogIEZpbmRSYW5nZWRUYXJnZXQoTCksIGNtZF9zaG9vdChMKQorICAgIFNraWxsczogICAgVXNlU2tpbGwoTCksIFNraWxsUmVzVHJhbnNmZXIoTCkKKyAgICBBdHRyaWJ1dGU6IFF1ZXJ5QXR0cmlidXRlCisgICAgU29uc3RpZ2VzOiBmZXJud2FmZmVuLCBIaXRGdW5jCisKKzI4Lkp1bCAyMDE0IEdsb2luc29uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vc2hvcnQgYi9kb2MvbGZ1bi9zaG9ydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTczNGMyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vc2hvcnQKQEAgLTAsMCArMSwzMSBAQAorc2hvcnQoKQorRlVOS1RJT046CisgICAgIHB1YmxpYyB2YXJhcmdzIHN0cmluZyBzaG9ydCgpOworCitERUZJTklFUlQgSU46CisgICAgIC9zdGQvdGhpbmcvZGVzY3JpcHRpb24uYworCitBUkdVTUVOVEU6CisgICAgIGtlaW5lCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGVyIEluaGFsdCBkZXIgUHJvcGVydHkgUF9TSE9SVCB3aXJkIGF1c2dld2VydGV0LCBtaXQgIi5cbiIKKyAgICAgYWJnZXNjaGxvc3NlbiB1bmQgenVydWVja2dlZ2ViZW4uCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIERpZSBLdXJ6YmVzY2hyZWlidW5nIGFscyBTdHJpbmcgb2RlciAwLCBmYWxscyBkYXMgT2JqZWt0IHVuc2ljaHRiYXIKKyAgICAgaXN0LgorCitCRU1FUktVTkdFTjoKKyAgICAgRHVyY2ggVWViZXJsYWRlbiB2b24gc2hvcnQoKSBsYXNzZW4gc2ljaCBub2NoIHdlaXRlcmUgRWlnZW5zY2hhZnRlbiBkZXMKKyAgICAgT2JqZWt0ZXMgemVpZ2VuLiBGYWNrZWxuIHplaWdlbiB6dW0gQmVpc3BpZWwgYW4sIG9iIHNpZSBicmVubmVuLAorICAgICBSdWVzdHVuZ2VuLCBvYiBzaWUgYW5nZXpvZ2VuIHNpbmQgdW5kIFdhZmZlbiwgb2Igc2llIGdlenVlY2t0IHNpbmQuCisKK1NJRUhFIEFVQ0g6CisgICAgIEFlaG5saWNoZXM6CWxvbmcoKQorICAgICBQcm9wZXJ0aWVzOglQX1NIT1JULCBQX0lOVklTCisgICAgIFNvbnN0aWdlczoJCW1ha2VfaW52bGlzdCgpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzIwLjAxLjIwMTUsIFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vc2hvd19ub3RpZnkgYi9kb2MvbGZ1bi9zaG93X25vdGlmeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTA5YWRjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vc2hvd19ub3RpZnkKQEAgLTAsMCArMSw0NCBAQAorZ2l2ZV9ub3RpZnkoKQorRlVOS1RJT046CisgICAgIHZvaWQgc2hvd19ub3RpZnkob2JqZWN0IG9iaikKKworREVGSU5JRVJUIElOOgorICAgICAvc3RkL2xpdmluZy9wdXRfYW5kX2dldC5jCisKK0FSR1VNRU5URToKKyAgICAgb2JqIC0gZGVtIExlYmV3ZXNlbiBnZXplaWd0ZXMgT2JqZWt0CisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIGtlaW5lcgorCitCRVNDSFJFSUJVTkc6CisgICAgIERpZXNlIEZ1bmt0aW9uIHdpcmQgYXV0b21hdGlzY2ggaW1tZXIgZGFubiBhdWZnZXJ1ZmVuLCB3ZW5uIGVpbmVtCisgICAgIExlYmV3ZXNlbiAod2VsY2hlcyBrZWluIFNwaWVsZXJjaGFyYWt0ZXIgaXN0KSBlaW4gT2JqZWt0IGdlemVpZ3Qgd2lyZC4KKyAgICAgRGllcyBmdW5rdGlvbmllcnQgbnVyIGRhbm4sIHdlbm4gZGVyIFN0YW5kYXJkYmVmZWhsIGRlciBTcGllbGVyc2hlbGwKKyAgICAgdmVyd2VuZGV0IHdpcmQgKCJ6ZWlnZSA8bmFtZT4gPGdlZ2Vuc3RhbmQ+IikuIFNlbGJzdGdlYmF1dGVzICJ6ZWlnZSIKKyAgICAgZnVua3Rpb25pZXJ0IG5pY2h0LgorCitCRUlTUElFTDoKKyAgICAgT2Z0bWFscyB3aWxsIG1hbiBpbiBRdWVzdHMgZXJyZWljaGVuLCBkYXNzIGVpbmVtIE5QQyBlaW4gYmVzdGltbXRlcworICAgICBJdGVtIGFscyBCZXdlaXMgZGVyIEVyZnVlbGx1bmcgZWluZXIgYmVzdGltbXRlbiBBdWZnYWJlIHZvcmdlemVpZ3QKKyAgICAgd2lyZC4gRm9sZ2VuZGVybWFzc2VuIGthbm4gZGllcyByZWFsaXNpZXJ0IHdlcmRlbjoKKworICAgICB2b2lkIHF1ZXN0X29rKG9iamVjdCBvYmopIHsgLi4uCisgICAgICAgLy8gei5CLiBWZXJuaWNodHVuZyBkZXMgUXVlc3RvYmpla3RlcyB1bmQgUXVlc3R0ZXh0ZQorICAgICAgIC8vIFF1ZXN0YmVsb2hudW5nIHVuZCBRdWVzdGFuZXJrZW5udW5nLCBldGMuCisgICAgIH0KKworICAgICB2b2lkIHNob3dfbm90aWZ5KG9iamVjdCBvYmopIHsKKyAgICAgICBpZihvYmotPmlkKCJcbnF1ZXN0aXRlbSIpKSAvLyBJc3QgZGFzIGRhcyBnZWZvcmRlcnRlIFF1ZXN0b2JqZWt0PworICAgICAgICAgcXVlc3Rfb2sob2JqKTsKKyAgICAgfQorCitCRU1FUktVTkdFTjoKKyAgICAgRGEgZXMgbnVyIHVtIGRhcyBWb3J6ZWlnZW4gdm9uIEdlZ2Vuc3RhZW5kZW4gZ2VodCwgZGllIG5pY2h0IGRlbiAKKyAgICAgQmVzaXR6ZXIgd2VjaHNlbG4sIHNpbmQgTWVjaGFuaXNtZW4gd2llIFBfUkVKRUNUIGluIGRpZXNlbSBGYWxsIAorICAgICBuaWNodCBlcmZvcmRlcmxpY2guCisKK1NJRUhFIEFVQ0g6CisgICAgIGdpdmVfbm90aWZ5KCksIC9zdGQvbnBjL3B1dF9hbmRfZ2V0LmMsIC9zdGQvbGl2aW5nL3B1dF9hbmRfZ2V0LmMKKworMjIuIE9rdG9iZXIgMjAxMyBBcmF0aG9ybgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vc3BlbGxib29rL0FkZFNwZWxsIGIvZG9jL2xmdW4vc3BlbGxib29rL0FkZFNwZWxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4Njg2ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9zcGVsbGJvb2svQWRkU3BlbGwKQEAgLTAsMCArMSw1NCBAQAorQWRkU3BlbGwoKQorRlVOS1RJT046CisgICAgdmFyYXJncyBpbnQgQWRkU3BlbGwoc3RyaW5nIHZlcmIsIGludCBrb3N0ZW4sIG1peGVkIHNraSkgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3RkL3NwZWxsYm9vay5jCisKK0FSR1VNRU5URToKKyAgICBzdHJpbmcgdmVyYiAgICAgTmFtZSBkZXMgU3BlbGxzCisgICAgaW50IGtvc3RlbiAgICAgIG5vcm1hbGUgS29zdGVuIChHcnVuZGtvc3RlbikKKyAgICBtaXhlZCBza2kgICAgICAgU2tpbGxtYXBwaW5nIG1pdCBhbGxlbiBFaW50cmFlZ2VuIHp1bSBTcGVsbAorCitCRVNDSFJFSUJVTkc6CisgICAgQWRkaWVydCBlaW5lbiBFaW50cmFnIGZ1ZXIgZGVuIFNwZWxsIGltIFNwZWxsYm9vay4gV2VubiBkaWVzZXIKKyAgICBTcGVsbCBkaXJla3Qgdm9tIFNwaWVsZXIgKFNJX1NQRUxMQk9PSykgb2RlciAobm9ybWFsZXJ3ZWlzZSkKKyAgICB1ZWJlciBlaW4gR2lsZGVub2JqZWt0IGF1ZmdlcnVmZW4gd2lyZCwgd2lyZCBkYXMgTWFwcGluZyBhdWYKKyAgICBkaWUgU2tpbGxpbmZvcm1hdGlvbmVuIGF1cyBTcGllbGVyIHVuZCBHaWxkZSBhZGRpZXJ0IHVuZAorICAgIGJlZWluZmx1c3N0IGRhbWl0IGRlbiBBdWZydWYgZGVyIGxldHp0bGljaGVuIFNwZWxsZnVua3Rpb24uCisKK0JFTUVSS1VOR0VOOgorICAgIFNpZWhlIGRhcyBWZXJoYWx0ZW4gdm9uIFF1ZXJ5U3BlbGwgKGdpbGRlKSB6dW0gWnVzYW1tZW5mdWVnZW4KKyAgICBkZXIgQWRkU3BlbGwtSW5mb3JtYXRpb25lbiBhdXMgR2lsZGUgdW5kIFNwZWxsYm9vay4gUmVsZXZhbnQKKyAgICB6QiBmdWVyIExlcm5yZXN0cmlrdGlvbmVuLgorCitCRUlTUElFTDoKKyAgICBBZGRTcGVsbCgia2FtcGZzY2hyZWkiLCAzMCwKKyAgICAgICAgIChbU0lfU0tJTExSRVNUUl9MRUFSTjooW1BfTEVWRUw6MTNdKSwKKyAgICAgICAgICAgU0lfTUFHSUNfVFlQRTogKHtNVF9QU1lDSE99KSwKKyAgICAgICAgICAgU0lfU1BFTEw6ICAgICAgKFsKKyAgICAgICAgICAgICBTUF9OQU1FOiAiS2FtcGZzY2hyZWkiLAorICAgICAgICAgICAgIFNQX1NIT1dfREFNQUdFOgorICAgICAgICAgICAgICAgKHsoeyAtMSwgIkRpciBnZXNjaGllaHQgamVkb2NoIG5pY2h0cy4iLAorICAgICAgICAgICAgICAgICAgICJAV0VNMSBnZXNjaGllaHQgamVkb2NoIG5pY2h0cy4iLAorICAgICAgICAgICAgICAgICAgICJAV0VNMSBnZXNjaGllaHQgamVkb2NoIG5pY2h0cy4iIH0pLAorICAgICAgICAgICAgICAgICAoeyAgMCwgIkR1IGthbm5zdCBkYXJ1ZWJlciBhYmVyIG51ciBsYWNoZW4uIiwKKyAgICAgICAgICAgICAgICAgICAiQFdFUjEga2FubiBkYXJ1ZWJlciBhYmVyIG51ciBsYWNoZW4uIiwKKyAgICAgICAgICAgICAgICAgICAiQFdFUjEga2FubiBkYXJ1ZWJlciBhYmVyIG51ciBsYWNoZW4uIiB9KSwKKyAgICAgICAgICAgICAgICAgKHsgMTAsICJEaXIgZHJvZWhuZW4gZGllIE9ocmVuLiIsCisgICAgICAgICAgICAgICAgICAgIkBXRU0xIGRyb2VobmVuIGRpZSBPaHJlbi4iLAorICAgICAgICAgICAgICAgICAgICJAV0VNMSBkcm9laG5lbiBkaWUgT2hyZW4uIiB9KQorICAgICAgICAgICAgICAgfSldKQorICAgICAgICAgXSkpOworCitTSUVIRSBBVUNIOgorICAgIFNwZWxsYm9vayBMZXJuZW46IExlYXJuLCBTcGVsbFN1Y2Nlc3MsIEVyZm9sZywgTWlzc2VyZm9sZworICAgICogVmVyd2FsdGVuOiAgICAgIFF1ZXJ5U3BlbGwKKyAgICAqIEFuZ3JpZmY6ICAgICAgICBUcnlBdHRhY2tTcGVsbCwgVHJ5RGVmYXVsdEF0dGFja1NwZWxsLAorICAgICAgICAgICAgICAgICAgICAgIFRyeUdsb2JhbEF0dGFja1NwZWxsCisgICAgKiBQcm9wZXJ0aWVzOiAgICAgUF9HTE9CQUxfU0tJTExQUk9QUywgUF9TQl9TUEVMTFMKKyAgICBTa2lsbHMgTGVybmVuOiAgICBMZWFyblNraWxsLCBNb2RpZnlTa2lsbCwgTGltaXRBYmlsaXR5CisgICAgKiBOdXR6dW5nOiAgICAgICAgVXNlU3BlbGwsIFVzZVNraWxsCisgICAgKiBzb25zdGlnOiAgICAgICAgc3BydWNoZXJtdWVkdW5nLCBza2lsbF9pbmZvX2xpc3RlCisKKzUuIE9rdCAyMDExIEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9zcGVsbGJvb2svRXJmb2xnIGIvZG9jL2xmdW4vc3BlbGxib29rL0VyZm9sZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjViZjRmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vc3BlbGxib29rL0VyZm9sZwpAQCAtMCwwICsxLDI4IEBACitFcmZvbGcoKQorRlVOS1RJT046CisgICAgdm9pZCBFcmZvbGcob2JqZWN0IGNhc3Rlciwgc3RyaW5nIHNwZWxsLCBtYXBwaW5nIHNpbmZvKQorCitERUZJTklFUlQgSU46CisgICAgL3N0ZC9zcGVsbGJvb2suYworCitBUkdVTUVOVEU6CisgICAgb2JqZWN0IGNhc3RlciAgICBTcGVsbCBzcHJlY2hlbmRlciBTcGllbGVyCisgICAgc3RyaW5nIHNwZWxsICAgICBTcGVsbG5hbWUKKyAgICBtYXBwaW5nIHNpbmZvICAgIFNwZWxsLUluZm8tTWFwcGluZyBtaXQgYWxsZW4gSW5mb3JtYXRpb25lbgorCitCRVNDSFJFSUJVTkc6CisgICAgV2lyZCBiZWkgRXJmb2xnIGVpbmVzIFNwZWxscyBnZXJ1ZmVuLiBSdWZ0IFNwZWxsSW5mb3JtKCkgYW0KKyAgICBFbnZpcm9ubWVudC4KKworU0lFSEUgQVVDSDoKKyAgICBTb25zdGlnZXM6ICAgICAgICBTcGVsbEluZm9ybQorICAgIFNwZWxsYm9vayBMZXJuZW46IExlYXJuLCBTcGVsbFN1Y2Nlc3MsIE1pc3NlcmZvbGcKKyAgICAqIFZlcndhbHRlbjogICAgICBBZGRTcGVsbCwgUXVlcnlTcGVsbAorICAgICogQW5ncmlmZjogICAgICAgIFRyeUF0dGFja1NwZWxsLCBUcnlEZWZhdWx0QXR0YWNrU3BlbGwsCisgICAgICAgICAgICAgICAgICAgICAgVHJ5R2xvYmFsQXR0YWNrU3BlbGwKKyAgICAqIFByb3BlcnRpZXM6ICAgICBQX0dMT0JBTF9TS0lMTFBST1BTLCBQX1NCX1NQRUxMUworICAgIFNraWxscyBMZXJuZW46ICAgIExlYXJuU2tpbGwsIE1vZGlmeVNraWxsLCBMaW1pdEFiaWxpdHkKKyAgICAqIE51dHp1bmc6ICAgICAgICBVc2VTcGVsbCwgVXNlU2tpbGwKKyAgICAqIHNvbnN0aWc6ICAgICAgICBzcHJ1Y2hlcm11ZWR1bmcsIHNraWxsX2luZm9fbGlzdGUKKworNS4gT2t0IDIwMTEgR2xvaW5zb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9zcGVsbGJvb2svTGVhcm4gYi9kb2MvbGZ1bi9zcGVsbGJvb2svTGVhcm4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUyNDMxYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL3NwZWxsYm9vay9MZWFybgpAQCAtMCwwICsxLDMzIEBACitMZWFybigpCitGVU5LVElPTjoKKyAgICB2b2lkIExlYXJuKG9iamVjdCBjYXN0ZXIsIHN0cmluZyBzcGVsbCwgbWFwcGluZyBzaW5mbykKKworREVGSU5JRVJUIElOOgorICAgIC9zdGQvc3BlbGxib29rLmMKKworQVJHVU1FTlRFOgorICAgIG9iamVjdCBjYXN0ZXIgICBEZXJqZW5pZ2UsIGRlciBkZW4gU3BydWNoIHNwcmljaHQuCisgICAgc3RyaW5nIHNwZWxsICAgIERlciBnZXNwcm9jaGVuZSBTcGVsbAorICAgIG1hcHBpbmcgc2luZm8gICBNYXBwaW5nIG1pdCBhbGxlbiBtb2VnbGljaGVuIEluZm9ybWF0aW9uZW4genVtIFNwZWxsCisKK0JFU0NIUkVJQlVORzoKKyAgICBEaWVzZSBGdW5rdGlvbiB3aXJkIHZvbiBkZXIgRnVua3Rpb24gIk1pc3NlcmZvbGciIGF1cyBkZW0gCisgICAgU3BlbGxib29rIGF1ZmdlcnVmZW4uIEhpZXIgbGVybnQgZGVyIFNwaWVsZXIgZGVuIFNwcnVjaCwgZGVyIAorICAgIG5pY2h0IGdlZ2x1ZWNrdCBpc3QuCisKK0JFTUVSS1VOR0VOOgorICAgIEthbm4gYXVjaCB1ZWJlcnNjaHJpZWJlbiB3ZXJkZW4sIHdlbm4gbWFuIGtvbXBsZXhlIExlcm4tQWVuZGVydW5nZW4KKyAgICB2b3JuZWhtZW4gd2lsbC4gQW5kZXJlIEF0dHJpYnV0ZSBzaW5kIHVlYmVyIFNJX0xFQVJOX0FUVFJJQlVURQorICAgIHNldHpiYXIuCisKK1NJRUhFIEFVQ0g6CisgICAgU3BlbGxib29rIExlcm5lbjogU3BlbGxTdWNjZXNzLCBFcmZvbGcsIE1pc3NlcmZvbGcKKyAgICAqIFZlcndhbHRlbjogICAgICBBZGRTcGVsbCwgUXVlcnlTcGVsbAorICAgICogQW5ncmlmZjogICAgICAgIFRyeUF0dGFja1NwZWxsLCBUcnlEZWZhdWx0QXR0YWNrU3BlbGwsCisgICAgICAgICAgICAgICAgICAgICAgVHJ5R2xvYmFsQXR0YWNrU3BlbGwKKyAgICAqIFByb3BlcnRpZXM6ICAgICBQX0dMT0JBTF9TS0lMTFBST1BTLCBQX1NCX1NQRUxMUworICAgIFNraWxscyBMZXJuZW46ICAgIExlYXJuU2tpbGwsIE1vZGlmeVNraWxsLCBMaW1pdEFiaWxpdHkKKyAgICAqIE51dHp1bmc6ICAgICAgICBVc2VTcGVsbCwgVXNlU2tpbGwKKyAgICAqIHNvbnN0aWc6ICAgICAgICBzcHJ1Y2hlcm11ZWR1bmcsIHNraWxsX2luZm9fbGlzdGUKKworNS4gT2t0IDIwMTEgR2xvaW5zb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9zcGVsbGJvb2svTWlzc2VyZm9sZyBiL2RvYy9sZnVuL3NwZWxsYm9vay9NaXNzZXJmb2xnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZDUzMGIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9zcGVsbGJvb2svTWlzc2VyZm9sZwpAQCAtMCwwICsxLDUzIEBACitNaXNzZXJmb2xnKCkKK0ZVTktUSU9OOgorICAgIHZvaWQgTWlzc2VyZm9sZyhvYmplY3QgY2FzdGVyLCBzdHJpbmcgc3BlbGwsIG1hcHBpbmcgc2luZm8pIAorCitERUZJTklFUlQgSU46CisgICAgL3N0ZC9zcGVsbGJvb2suYworCitBUkdVTUVOVEU6CisgICAgb2JqZWN0IGNhc3RlciAgICBTcGVsbCBzcHJlY2hlbmRlciBTcGllbGVyCisgICAgc3RyaW5nIHNwZWxsICAgICBTcGVsbG5hbWUKKyAgICBtYXBwaW5nIHNpbmZvICAgIFNwZWxsLUluZm8tTWFwcGluZyBtaXQgYWxsZW4gSW5mb3JtYXRpb25lbgorCitCRVNDSFJFSUJVTkc6CisgICAgV2lyZCBiZWkgTWlzc2VyZm9sZyBlaW5lcyBTcGVsbHMgaW0gU3BlbGxib29rIGF1ZmdlcnVmZW4gdW5kCisgICAgcnVmdCBkaWUgTGVybmZ1bmt0aW9uIExlYXJuKCkgbmFjaCBlaW5lciBGZWhsZXJtZWxkdW5nLgorICAgIAorICAgIEthbm4gdWViZXJzY2hyaWViZW4gd2VyZGVuLCB1bSBkaWUgTWVsZHVuZ2VuIGFuenVwYXNzZW4uCisKK0JFSVNQSUVMOgorICAgIC8vIE1pc3NlcmZvbGdlIGltIEtsZXJ1cyBtaXQgYW5nZXBhc3N0ZW4gTWVsZHVuZ2VuCisgICAgdm9pZCBNaXNzZXJmb2xnKG9iamVjdCBjYXN0ZXIsIHN0cmluZyBzcGVsbCwgbWFwcGluZyBzaW5mbykgeworICAgICAgc3dpdGNoKHNwZWxsKSB7CisgICAgICAgIGNhc2UgImJlZ3JhYmUiOgorICAgICAgICAgIHRlbGxfb2JqZWN0KGNhc3RlciwgQlMoCisgICAgICAgICAgICAiRHUgYmVncmFlYnN0IERlaW5lIEhvZmZudW5nZW4sIGRhc3MgRHUgZGllc2UgQW5ydWZ1bmcgamVtYWxzICIKKyAgICAgICAgICAgICJwZXJmZWt0IGJlaGVycnNjaGVuIHdpcnN0LiIpKTsKKyAgICAgICAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoY2FzdGVyKSwKKyAgICAgICAgICAgIGNhc3Rlci0+TmFtZShXRVIpKyIgdHJpdHQgZGllIExlaWNoZSBsdXN0bG9zLlxuIiwgKHtjYXN0ZXJ9KSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgImJsaXR6IjoKKyAgICAgICAgWy4uLl0KKyAgICAgIH0KKyAgICAgICAgCisgICAgICBpbnQgb2xkX2FiaWwgPSBzaW5mb1tTSV9TS0lMTEFCSUxJVFldOworICAgICAgTGVhcm4oY2FzdGVyLCBzcGVsbCwgc2luZm8pOworICAgICAgaW50IG5ld19hYmlsID0gY2FzdGVyLT5RdWVyeVNraWxsQWJpbGl0eShzcGVsbCk7CisgICAgICBpZiAob2xkX2FiaWwgPCBuZXdfYWJpbCkKKyAgICAgICAgdGVsbF9vYmplY3QoY2FzdGVyLCAiRGllIEdvZXR0ZXIgc2NoZW5rZW4gRGlyIGVpbmUgRXJsZXVjaHR1bmcuXG4iKTsKKyAgICAgIGVsc2UKKyAgICAgICAgdGVsbF9vYmplY3QoY2FzdGVyLCAiTGVpZGVyIGxlcm5zdCBEdSBuaWNodCBhdXMgRGVpbmVtIEZlaGxlci5cbiIpOyAKKyAgICB9CisKK1NJRUhFIEFVQ0g6CisgICAgU3BlbGxib29rIExlcm5lbjogTGVhcm4sIFNwZWxsU3VjY2VzcywgRXJmb2xnCisgICAgKiBWZXJ3YWx0ZW46ICAgICAgQWRkU3BlbGwsIFF1ZXJ5U3BlbGwKKyAgICAqIEFuZ3JpZmY6ICAgICAgICBUcnlBdHRhY2tTcGVsbCwgVHJ5RGVmYXVsdEF0dGFja1NwZWxsLAorICAgICAgICAgICAgICAgICAgICAgIFRyeUdsb2JhbEF0dGFja1NwZWxsCisgICAgKiBQcm9wZXJ0aWVzOiAgICAgUF9HTE9CQUxfU0tJTExQUk9QUywgUF9TQl9TUEVMTFMKKyAgICBTa2lsbHMgTGVybmVuOiAgICBMZWFyblNraWxsLCBNb2RpZnlTa2lsbCwgTGltaXRBYmlsaXR5CisgICAgKiBOdXR6dW5nOiAgICAgICAgVXNlU3BlbGwsIFVzZVNraWxsCisgICAgKiBzb25zdGlnOiAgICAgICAgc3BydWNoZXJtdWVkdW5nLCBza2lsbF9pbmZvX2xpc3RlCisKKzUuIE9rdCAyMDExIEdsb2luc29uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vc3BlbGxib29rL1F1ZXJ5U3BlbGwgYi9kb2MvbGZ1bi9zcGVsbGJvb2svUXVlcnlTcGVsbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2FkZWMyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vc3BlbGxib29rL1F1ZXJ5U3BlbGwKQEAgLTAsMCArMSwyNiBAQAorUXVlcnlTcGVsbCgpCitGVU5LVElPTjoKKyAgICBtYXBwaW5nIFF1ZXJ5U3BlbGwoc3RyaW5nIHNwZWxsKQorCitERUZJTklFUlQgSU46CisgICAgL3N0ZC9zcGVsbGJvb2suYworCitBUkdVTUVOVEU6CisgICAgc3RyaW5nIHNwZWxsICAgIE5hbWUgZGVzIFNwZWxscworCitCRVNDSFJFSUJVTkc6CisgICAgR2lidCBkYXMgU3BlbGxtYXBwaW5nIGF1cyBQX1NCX1NQRUxMUyBmdWVyIGRpZXNlbiBTcGVsbCB6dXJ1ZWNrLgorICAgIAorICAgIEhpZXIgZW50aGFlbHQgUXVlcnlTcGVsbCBudXIgZGllIFNwZWxsYm9vay1JbmZvcm1hdGlvbmVuLgorCitTSUVIRSBBVUNIOgorICAgIFNwZWxsYm9vayBMZXJuZW46IExlYXJuLCBTcGVsbFN1Y2Nlc3MsIEVyZm9sZywgTWlzc2VyZm9sZworICAgICogVmVyd2FsdGVuOiAgICAgIEFkZFNwZWxsCisgICAgKiBBbmdyaWZmOiAgICAgICAgVHJ5QXR0YWNrU3BlbGwsIFRyeURlZmF1bHRBdHRhY2tTcGVsbCwKKyAgICAgICAgICAgICAgICAgICAgICBUcnlHbG9iYWxBdHRhY2tTcGVsbAorICAgICogUHJvcGVydGllczogICAgIFBfR0xPQkFMX1NLSUxMUFJPUFMsIFBfU0JfU1BFTExTCisgICAgU2tpbGxzIExlcm5lbjogICAgTGVhcm5Ta2lsbCwgTW9kaWZ5U2tpbGwsIExpbWl0QWJpbGl0eQorICAgICogTnV0enVuZzogICAgICAgIFVzZVNwZWxsLCBVc2VTa2lsbAorICAgICogc29uc3RpZzogICAgICAgIHNwcnVjaGVybXVlZHVuZywgc2tpbGxfaW5mb19saXN0ZQorCis1LiBPa3QgMjAxMSBHbG9pbnNvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9sZnVuL3NwZWxsYm9vay9TcGVsbFN1Y2Nlc3MgYi9kb2MvbGZ1bi9zcGVsbGJvb2svU3BlbGxTdWNjZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNDQ4ODQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGZ1bi9zcGVsbGJvb2svU3BlbGxTdWNjZXNzCkBAIC0wLDAgKzEsMzEgQEAKK1NwZWxsU3VjY2VzcygpCitGVU5LVElPTjoKKyAgICBpbnQgU3BlbGxTdWNjZXNzKG9iamVjdCBjYXN0ZXIsIG1hcHBpbmcgc2luZm8pCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3RkL3NwZWxsYm9vay5jCisKK0FSR1VNRU5URToKKyAgICBvYmplY3QgY2FzdGVyICAgIFNwZWxsIHNwcmVjaGVuZGVyIFNwaWVsZXIKKyAgICBtYXBwaW5nIHNpbmZvICAgIFNwZWxsLUluZm8tTWFwcGluZyBtaXQgYWxsZW4gSW5mb3JtYXRpb25lbgorCitCRVNDSFJFSUJVTkc6CisgICAgQmVyZWNobmV0IGRlbiBFcmZvbGcgZGVyIEFud2VuZHVuZyBlaW5lcyBTcGVsbHMgYXVzIHNlaW5lcgorICAgIFNJX1NLSUxMQUJJTElUWSB1bmQgZGVtIFNraWxsIFNLX0NBU1RJTkcgaW0gU3BpZWxlci4gTGFlc3N0CisgICAgZGVuIFNwaWVsZXIgYmVpIGJlc29uZGVycyBndXRlbSBHZWxpbmdlbiBTS19DQVNUSU5HIGxlcm5lbi4KKworQkVNRVJLVU5HRU46CisgICAgU0tfQ0FTVElORyBtdXNzIGZ1ZXIgZGllIFNLX0NBU1RJTkctQm9uaSBiZWhlcnJzY2h0IHdlcmRlbi4KKyAgICBEYXMgaXN0IHpCIGltIEtsZXJ1cyBhYiBiZXN0aW1tdGVtIExldmVsIGRlciBGYWxsLgorCitTSUVIRSBBVUNIOgorICAgIFNwZWxsYm9vayBMZXJuZW46IExlYXJuLCBFcmZvbGcsIE1pc3NlcmZvbGcKKyAgICAqIFZlcndhbHRlbjogICAgICBBZGRTcGVsbCwgUXVlcnlTcGVsbAorICAgICogQW5ncmlmZjogICAgICAgIFRyeUF0dGFja1NwZWxsLCBUcnlEZWZhdWx0QXR0YWNrU3BlbGwsCisgICAgICAgICAgICAgICAgICAgICAgVHJ5R2xvYmFsQXR0YWNrU3BlbGwKKyAgICAqIFByb3BlcnRpZXM6ICAgICBQX0dMT0JBTF9TS0lMTFBST1BTLCBQX1NCX1NQRUxMUworICAgIFNraWxscyBMZXJuZW46ICAgIExlYXJuU2tpbGwsIE1vZGlmeVNraWxsLCBMaW1pdEFiaWxpdHkKKyAgICAqIE51dHp1bmc6ICAgICAgICBVc2VTcGVsbCwgVXNlU2tpbGwKKyAgICAqIHNvbnN0aWc6ICAgICAgICBzcHJ1Y2hlcm11ZWR1bmcsIHNraWxsX2luZm9fbGlzdGUKKworNS4gT2t0IDIwMTEgR2xvaW5zb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi9zcGVsbGJvb2svVHJ5QXR0YWNrU3BlbGwgYi9kb2MvbGZ1bi9zcGVsbGJvb2svVHJ5QXR0YWNrU3BlbGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZkNzViOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL3NwZWxsYm9vay9UcnlBdHRhY2tTcGVsbApAQCAtMCwwICsxLDQ4IEBACisqKiBnaWxkZW4tZG9rdQorIG8gVHJ5QXR0YWNrU3BlbGwob3BmZXIsc2NoYWRlbix0eXBlbixpc19zcGVsbCxjYXN0ZXIsaW5mbykKKyAgIFZlcnN1Y2h0IGRlbiBBbmdyaWZmcy1TcHJ1Y2ggYXVmIGRlbiBHZWduZXIgYW56dXdlbmRlbi4gRGllCisgICBtaXR0bGVyZW4gNCBXZXJ0ZSBzaW5kIGRpZSwgZGllIGF1Y2ggYmVpIERlZmVuZCB1ZWJlcmdlYmVuIHdlcmRlbi4KKyAgIERhYmVpIHdpcmQgZGllIEFid2VocmZhZWhpZ2tlaXQgZGVzIEdlZ25lcnMgZ2VnZW4gTWFnaWUgdW5kIGRhcworICAgU2tpbGwtQXR0cmlidXQgU0FfREFNQUdFIGF1dG9tYXRpc2NoIGJlcnVlY2tzaWNodGlndC4gCisKK0ZVTktUSU9OOgorCitpbnQgVHJ5QXR0YWNrU3BlbGwob2JqZWN0IHZpY3RpbSwgaW50IGRhbWFnZSwgbWl4ZWQgZHR5cGVzLAorICAgICAgICAgICAgICAgICAgIG1peGVkIGlzX3NwZWxsLCBvYmplY3QgY2FzdGVyLCBtYXBwaW5nIHNpbmZvKQorCisKK0FSR1VNRU5URToKKworICAgICAgICB2aWN0aW0gICA6IERhcyBhcm1lIE9wZmVyLgorICAgICAgICBkYW1hZ2UgICA6IERlciBTY2hhZGVuLgorICAgICAgICBkdHlwZXMgICA6IERpZSBTY2hhZGVuc2FydGVuLgorCSAgICAgIGlzX3NwZWxsIDogSXN0IGVzIGVpbiBTcGVsbD8gV2VyZGVuIG5vY2ggU3BlemllbGxlIFBhcmFtZXRlciAKKwkgICAgICAgICAgIHVlYmVyZ2ViZW4gKGFscyBtYXBwaW5nKSA/CisgICAgICAgIGNhc3RlciAgIDogRGVyamVuaWdlLCBkZXIgZGVuIFNwcnVjaCBzcHJpY2h0LgorICAgICAgICBzaW5mbyAgICA6IE1hcHBpbmcgbWl0IGFsbGVuIG1vZWdsaWNoZW4gSW5mb3JtYXRpb25lbiB6dW0gU3BlbGwKKworCitCRVNDSFJFSUJVTkc6CisKKwlEaWVzZSBGdW5rdGlvbiB3aXJkIHZvbSBTcGVsbGJvb2sgYXVmZ2VydWZlbiwgd2VubiBkZXIgU3BpZWxlcgorCWVpbmVuIEFuZ3JpZmZzc3BlbGwgZ2VtYWNodCBoYXQgdW5kIGRhbWl0IFNjaGFkZW4gYW5yaWNodGVuIHdpbGwuCisKKworUlVFQ0tHQUJFV0VSVDoKKworCURlciBXZXJ0LCBkZXIgdm9tIERlZmVuZCgpIGRlcyBHZWduZXJzIHp1cnVlY2tnZWxpZWZlcnQgd2lyZC4KKworCitCRU1FUktVTkdFTjoKKworCVp1IGVyc3Qgd2lyZCB1ZWJlcnBydWVmdCwgb2IgZGFzIFppZWwgdWViZXJoYXVwdCBhbmdyZWlmYmFyIGlzdC4gRGllcworCXZlcmhpbmRlcnQgZGFzIHVlYmVuIHZvbiBTcGVsbHMgYW4gdW5hbmdyZWlmYmFyZW4gTlBDcy4KKwlBbHMgbmFlY2hzdGVzIHdpcmQgZGllIEZhZWhpZ2tlaXQsIFNwZWxscyBhYnp1d2VocmVuIHVlYmVycHJ1ZWZ0LgorCUZhbGxzIGJlaWRlIEFiZnJhZ2VuIG9rIHNpbmQsIHdpcmQgRGVmZW5kIGF1ZmdlcnVmZW4uCisKKworU2llaGUgYXVjaDoKKworVHJ5RGVmYXVsdEF0dGFja1NwZWxsICh0byBiZSB3cml0dGVuKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiswNy4xMC4yMDA3LCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi90cmlnZ2VyX3NlbnNpdGl2ZV9hdHRhY2sgYi9kb2MvbGZ1bi90cmlnZ2VyX3NlbnNpdGl2ZV9hdHRhY2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI5YjM4YwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL3RyaWdnZXJfc2Vuc2l0aXZlX2F0dGFjawpAQCAtMCwwICsxLDc1IEBACit0cmlnZ2VyX3NlbnNpdGl2ZV9hdHRhY2soKQorCitGVU5LVElPTjoKKyAgICAgdmFyYXJncyB2b2lkIHRyaWdnZXJfc2Vuc2l0aXZlX2F0dGFjayhvYmplY3QgZW5lbXksIHN0cmluZyBrZXksIGludAorICAgICBkYW0sIG1peGVkIHNwZWxsLCBtaXhlZCAqb3B0aW9ucyk7CisKK0RFRklOSUVSVCBJTjoKKyAgICAgZWlnZW5lbiBzZW5zaXRpdmVuIE9iamVrdGVuLCB3aXJkIGF1ZmdlcnVmZW4gdm9uCisgICAgIC9zdGQvbGl2aW5nL2ludmVudG9yeS5jCisKK0FSR1VNRU5URToKKyAgICAgZW5lbXkKKyAgICAgICAgICBEZXIgR2VnbmVyLCBkZXIgZGllIEFrdGlvbiBhdXNnZWxvZXN0IGhhdC4KKyAgICAga2V5CisgICAgICAgICAgRGVyIGF1c2xvZXNlbmRlIFNjaGFkZW5zdHlwLgorICAgICBkYW0KKyAgICAgICAgICBEZXIgYW5nZXJpY2h0ZXRlIFNjaGFkZW4uCisgICAgIHNwZWxsCisgICAgICAgICAgV2llIGJlaSBEZWZlbmQoKS4KKyAgICAgb3B0aW9ucworICAgICAgICAgIEFycmF5IG1pdCBkZW4gaW4gUF9TRU5TSVRJVkUgYW5nZWdlYmVuZW4gT3B0aW9uZW4gZnVlciBkaWVzZQorICAgICAgICAgIEFrdGlvbi4KKworQkVTQ0hSRUlCVU5HOgorICAgICBXZW5uIGRlciBiZWkgZWluZW0gQW5ncmlmZiB6dWdlZnVlZ3RlIFNjaGFkZW4gZGVuIGluIFBfU0VOU0lUSVZFCisgICAgIGFuZ2VnZWJlbmVuIEdyZW56d2VydCB1ZWJlcnN0ZWlndCBzb3dpZSBkZXIgYWxzIFNjaGx1ZXNzZWwgYW5nZWdlYmVuZQorICAgICBTY2hhZGVuc3R5cCBpbiBkZW4gU2NoYWVkZW5zdHlwZW4gZGVzIEFuZ3JpZmZlcyB2b3Jrb21tdCwgd2lyZCBkaWVzZQorICAgICBGdW5rdGlvbiBhdWZnZXJ1ZmVuIHVuZCBrYW5uIGVudHNwcmVjaGVuZCByZWFnaWVyZW4uCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIGtlaW5lcgorCitCRUlTUElFTEU6CisgICAgIEVpbmUgRmFja2VsLCBkaWUgc2ljaCBiZWkgRmV1ZXJhdHRhY2tlbiBzZWxic3QgZW50enVlbmRldCB1bmQgYmVpCisgICAgIFdhc3NlcmF0dGFja2VuIHZlcmxvZXNjaHQsIGtvZW5udGUgbWFuIHdpZSBmb2xndCBpbXBsZW1lbnRpZXJlbjoKKworICAgICBpbmhlcml0ICIvc3RkL2xpZ2h0c291cmNlLmMiCisKKyAgICAgI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyAgICAgI2luY2x1ZGUgPHNlbnNpdGl2ZS5oPgorICAgICAjaW5jbHVkZSA8Y29tYmF0Lmg+CisKKyAgICAgY3JlYXRlKCkKKyAgICAgeworICAgICAgIDo6Y3JlYXRlKCk7CisKKyAgICAgICBTZXRQcm9wKC4uLik7IC8vIGRpZSB1ZWJsaWNoZW4gRWlnZW5zY2hhZnRlbiBkZWZpbmllcmVuCisKKyAgICAgICBTZXRQcm9wKFBfU0VOU0lUSVZFLAorICAgICAgICAgICAvLyAgRXJlaWduaXMgICAgICAgICAgS2V5ICAgICAgIEdyZW56ZSAoa2VpbmUgT3B0aW9uZW4pCisgICAgICAgICAoeyAoeyBTRU5TSVRJVkVfQVRUQUNLLCBEVF9GSVJFLCAgMTAwIH0pLAorICAgICAgICAgICAgKHsgU0VOU0lUSVZFX0FUVEFDSywgRFRfV0FURVIsIDEwMCB9KSB9KSApOworICAgICB9CisKKyAgICAgdmFyYXJncyB2b2lkCisgICAgIHRyaWdnZXJfc2Vuc2l0aXZlX2F0dGFjayhvYmplY3QgZW5lbXksIHN0cmluZyBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGFtLCBtaXhlZCBzcGVsbCkKKyAgICAgeworICAgICAgIC8vIEVzIHNvbGwgbmljaHQgdmVyc2Nod2llZ2VuIHdlcmRlbiwgZGFzcyBkYXMgRW50enVlbmRlbiB1bmQKKyAgICAgICAvLyBMb2VzY2hlbiBlaW5lciBMaWNodHF1ZWxsZSBzbyBsZWlkZXIgbmljaHQgZnVua3Rpb25pZXJ0Li4uCisgICAgICAgaWYgKGtleSA9PSBEVF9GSVJFICYmICFRdWVyeVByb3AoUF9MSUdIVEVEKSkgeworICAgICAgICAgU2V0UHJvcChQX0xJR0hURUQsIDEpOworICAgICAgICAgdGVsbF9vYmplY3QoZW52aXJvbm1lbnQoKSwgIkRpZSBGYWNrZWwgZmFlbmd0IEZldWVyLlxuIik7CisgICAgICAgfQorICAgICAgIGVsc2UgaWYgKGtleSA9PSBEVF9XQVRFUiAmJiBRdWVyeVByb3AoUF9MSUdIVEVEKSkgeworICAgICAgICAgU2V0UHJvcChQX0xJR0hURUQsIDApOworICAgICAgICAgdGVsbF9vYmplY3QoZW52aXJvbm1lbnQoKSwgIkRpZSBGYWNrZWwgdmVybGlzY2h0LlxuIik7CisgICAgICAgfQorICAgICB9CisKK1NJRUhFIEFVQ0g6CisgICAgIHRyaWdnZXJfc2Vuc2l0aXZlX2ludigpLCBzZW5zaXRpdmUgT2JqZWt0ZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBTdW4gTWF5IDE5IDE1OjU2OjI1IDE5OTYgYnkgV2FyZ29uCmRpZmYgLS1naXQgYS9kb2MvbGZ1bi90cmlnZ2VyX3NlbnNpdGl2ZV9pbnYgYi9kb2MvbGZ1bi90cmlnZ2VyX3NlbnNpdGl2ZV9pbnYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQxN2ViZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sZnVuL3RyaWdnZXJfc2Vuc2l0aXZlX2ludgpAQCAtMCwwICsxLDQwIEBACit0cmlnZ2VyX3NlbnNpdGl2ZV9pbnYoKQorCitGVU5LVElPTjoKKyAgICAgdmFyYXJncyB2b2lkIHRyaWdnZXJfc2Vuc2l0aXZlX2ludihvYmplY3Qgb2IsIHN0cmluZyBrZXksIGludCB3ZXJ0LAorICAgICBtaXhlZCAqb3B0aW9uZW4xLCBtaXhlZCAqb3B0aW9uZW4yKTsKKworREVGSU5JRVJUIElOOgorICAgICBlaWdlbmVuIE9iamVrdGVuLCB3aXJkIGF1ZmdlcnVmZW4gdm9uIC9zdGQvY29udGFpbmVyL2ludmVudG9yeS5jCisKK0FSR1VNRU5URToKKyAgICAgb2IKKyAgICAgICAgICBEYXMgYXVzbG9lc2VuZGUgT2JqZWt0CisgICAgIGtleQorICAgICAgICAgIERlciBTY2hsdWVzc2VsLCBkZXIgZGllIEFrdGlvbiBhdXNsb2VzdGUuCisgICAgIHdlcnQKKyAgICAgICAgICBEZXIgR3Jlbnp3ZXJ0IGRlcyBhdXNsb2VzZW5kZW4gT2JqZWt0ZXMuCisgICAgIG9wdGlvbmVuMQorICAgICAgICAgIERpZSBPcHRpb25lbiBkZXMgYXVzbG9lc2VuZGVuIE9iamVrdGVzLgorICAgICBvcHRpb25lbjIKKyAgICAgICAgICBEaWUgT3B0aW9uZW4gZGVzIHJlYWdpZXJlbmRlbiBPYmpla3Rlcy4KKworQkVTQ0hSRUlCVU5HOgorICAgICBEaWVzZSBGdW5rdGlvbiB3aXJkIGluIE9iamVrdGVuIGRlcyBzZW5zaXRpdmVuIFR5cHMgU0VOU0lUSVZFX0lOVkVOVE9SWQorICAgICBhdWZnZXJ1ZmVuLCB3ZW5uIHNpZSBpbiBLb250YWt0IG1pdCBPYmpla3RlbiBkZXMgVHlwcworICAgICBTRU5TSVRJVkVfSU5WRU5UT1JZX1RSSUdHRVIgdHJldGVuLCBkaWUgZGVuIGdsZWljaGVuIFNjaGx1ZXNzZWwKKyAgICAgYXVmd2Vpc2VuIHVuZCBlaW5lbiBob2VoZXJlbiBHcmVuendlcnQgaGFiZW4uCisKKyAgICAgQW5oYW5kIGRlciBQYXJhbWV0ZXIga29lbm5lbiBkYW5uIGRpZSBub2V0aWdlbiBBa3Rpb25lbiBhdXNnZWxvZXN0CisgICAgIHdlcmRlbi4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICAga2VpbmVyCisKK0JFSVNQSUVMRToKKworU0lFSEUgQVVDSDoKKyAgICAgdHJpZ2dlcl9zZW5zaXRpdmVfYXR0YWNrKCksIHNlbnNpdGl2ZSBPYmpla3RlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFdlZCBNYXkgOCAxMDoyNjoxMCAxOTk2IGJ5IFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL2xmdW4vd2llbGRfbWUgYi9kb2MvbGZ1bi93aWVsZF9tZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mjc1MDRlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xmdW4vd2llbGRfbWUKQEAgLTAsMCArMSwxMCBAQAord2llbGRfbWUoKQorCitCRU1FUktVTkdFTjoKKyAgICAgd2llbGRfbWUgd3VyZGUgZHVyY2ggRG9XaWVsZCBlcnNldHp0LgorCitTSUVIRSBBVUNIOgorICAgICBEb1dpZWxkRnVuYygpLCAvc3RkL3dlYXBvbi5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFdlZCBBcHIgMDggMTA6MjU6MDAgMjAwNCBieSBNdWFkaWIKZGlmZiAtLWdpdCBhL2RvYy9saWJob29rcy9IX0hPT0tfRVhJVF9VU0UgYi9kb2MvbGliaG9va3MvSF9IT09LX0VYSVRfVVNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZTRlNTMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGliaG9va3MvSF9IT09LX0VYSVRfVVNFCkBAIC0wLDAgKzEsMzAgQEAKK0hPT0s6IAorICAgSF9IT09LX0VYSVRfVVNFCisKK0RFRklOSUVSVCBJTjoKKyAgIC9zeXMvaG9vay5oCisKK0dFUlVGRU4gVk9OOgorICAgL3N0ZC9yb29tL2V4aXRzLmMKKworQkVTQ0hSRUlCVU5HOgorICAgV2lyZCBhdXNnZWxvZXN0LCB3ZW5uIGVpbiBMZWJld2VzZW4gZWluZW4gUmF1bWF1c2dhbmcgYmVudXR6dC4KKworRVZFTlQtREFURU46CisgICBFcyB3aXJkIGVpbiBBcnJheSB1ZWJlcmdlYmVuOgorICAgKHsgPHZlcmI+LCA8ZGVzdHJvb20+LCA8bWVzc2FnZT4gfSkKKyAgICAgIDx2ZXJiPiAgICAgOiBlaW5nZWdlYmVuZXMgS29tbWFuZG92ZXJiCisgICAgICA8ZGVzdHJvb20+IDogWmllbHJhdW0gKHN0cmluZykgb2RlciBjbG9zdXJlCisgICAgICA8bWVzc2FnZT4gIDogQmV3ZWd1bmdzbWVsZHVuZyAoZ2dmLiAwKQorCitSVWVDS0dBQkVXRVJURToKKyAgICh7IDxzdGF0dXM+LCA8ZGF0ZW4+IH0pCisgICAgICA8c3RhdHVzPiAgOiBIX05PX01PRCwgSF9DQU5DRUxMRUQsIEhfQUxURVJFRAorICAgICAgPGRhdGVuPiAgIDogd2llIHVlYmVyZ2ViZW5lcyBEYXRlbmFycmF5CisKK1NJRUhFIEFVQ0g6CisgICBIUmVnaXN0ZXJUb0hvb2soKSwgSFVucmVnaXN0ZXJGcm9tSG9vaygpLCBIb29rRmxvdygpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis3LjIuMjAxNiwgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2MvbGliaG9va3MvSF9IT09LX0hQIGIvZG9jL2xpYmhvb2tzL0hfSE9PS19IUApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODA3OTFmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xpYmhvb2tzL0hfSE9PS19IUApAQCAtMCwwICsxLDI4IEBACitIT09LOgorICAgSF9IT09LX0hQCisKK0RFRklOSUVSVCBJTjoKKyAgIC9zeXMvaG9vay5oCisKK0FVU0dFTE9lU1QgVk9OOgorICAgL3N0ZC9saXZpbmcvbGlmZS5jCisKK0JFU0NIUkVJQlVORzoKKyAgIFdpcmQgYXVzZ2Vsb2VzdCwgd2VubiBzaWNoIGRpZSBQX0hQIGVpbmVzIFNwaWVsZXJzIGFlbmRlcm4uCisgICBEaWVzZXIgSG9vayBsYWV1ZnQgbmFjaCBkZXIgQWVuZGVydW5nIGRlciBMZWJlbnNwdW5rdGUuIEVzIGlzdCBuaWNodAorICAgbW9lZ2xpY2gsIGRpZXNlbiBIb29rIGFienVicmVjaGVuIG9kZXIgZGllIExlYmVuc3B1bmt0ZSB6dSBhZW5kZXJuLgorCitFVkVOVC1EQVRFTjoKKyAgIEVzIHdlcmRlbiBkaWUgbmV1ZW4gTGViZW5zcHVua3RlIGRlcyBTcGllbGVycyB1ZWJlcmdlYmUuCisKK1JVZUNLR0FCRVdFUlRFOgorICAgKHsgPHN0YXR1cz4sIDxkYXRlbj4gfSkKKyAgICAgIDxzdGF0dXM+ICA6IEhfTk9fTU9ECisgICAgICA8ZGF0ZW4+ICAgOiBMZWJlbnNwdW5rdGUKKworU0lFSEUgQVVDSDoKKyAgIEhSZWdpc3RlclRvSG9vaygpLCBIVW5yZWdpc3RlckZyb21Ib29rKCksIEhvb2tGbG93KCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzcuMi4yMDE2LCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9saWJob29rcy9IX0hPT0tfU1AgYi9kb2MvbGliaG9va3MvSF9IT09LX1NQCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NGY5OGUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbGliaG9va3MvSF9IT09LX1NQCkBAIC0wLDAgKzEsMjcgQEAKK0hPT0s6CisgICBIX0hPT0tfU1AKKworREVGSU5JRVJUIElOOgorICAgL3N5cy9ob29rLmgKKworQVVTR0VMT2VTVCBWT046CisgICAvc3RkL2xpdmluZy9saWZlLmMKKworQkVTQ0hSRUlCVU5HOgorICAgV2lyZCBhdXNnZWxvZXN0LCB3ZW5uIHNpY2ggZGllIFBfU1AgZWluZXMgU3BpZWxlcnMgYWVuZGVybi4KKyAgIERpZXNlciBIb29rIGxhZXVmdCBuYWNoIGRlciBBZW5kZXJ1bmcgZGVyIEtvbnplbnRyYXRpb25zcHVua3RlLiBFcyBpc3QKKyAgIG5pY2h0IG1vZWdsaWNoLCBkaWVzZW4gSG9vayBhYnp1YnJlY2hlbiBvZGVyIGRpZSBMZWJlbnNwdW5rdGUgenUgYWVuZGVybi4KKworRVZFTlQtREFURU46CisgICBFcyB3ZXJkZW4gZGllIG5ldWVuIEtvbnplbnRyYXRpb25zcHVua3RlIGRlcyBTcGllbGVycyB1ZWJlcmdlYmVuLgorCitSVWVDS0dBQkVXRVJURToKKyAgICh7IDxzdGF0dXM+LCA8ZGF0ZW4+IH0pCisgICAgICA8c3RhdHVzPiAgOiBIX05PX01PRAorICAgICAgPGRhdGVuPiAgIDogS29uemVudHJhdGlvbnNwdW5rdGUKKworU0lFSEUgQVVDSDoKKyAgIEhSZWdpc3RlclRvSG9vaygpLCBIVW5yZWdpc3RlckZyb21Ib29rKCksIEhvb2tGbG93KCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzcuMi4yMDE2LCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvbWFzdGVyL2NvbXBpbGVfb2JqZWN0IGIvZG9jL21hc3Rlci9jb21waWxlX29iamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjU1NjU4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hc3Rlci9jb21waWxlX29iamVjdApAQCAtMCwwICsxLDExIEBACitTWU5PUFNJUworCW9iamVjdCBjb21waWxlX29iamVjdChzdHJpbmcgZmlsZW5hbWUpCisKK0RFU0NSSVBUSU9OCisJVGhpcyBmdW5jdGlvbiBpcyBjYWxlZCBpZiB0aGUgaW50ZXJwcmV0ZXIgY2Fubm90IGZpbmQgdGhlCisJZmlsZSBmb3IgYW4gb2JqZWN0IHRvIGJlIGxvYWRlZC4gVGhlIG1hc3RlciBvYmplY3QgaGFzIG5vdworCXRoZSBvcHBvcnR1bml0eSB0byByZXR1cm4gYW4gb2JqZWN0IHRoYXQgd2lsbCB0aGVuIHNlcnZlIGFzIGlmCisJY29tcGlsZWQgZnJvbSB0aGUgZ2l2ZW4gZmlsZW5hbWUuCisKKwlJZiAwIGlzIHJldHVybmVkLCB0aGUgdXN1YWwgYGBDb3VsZCBub3QgbG9hZCBkZXNjciBmb3InJyBlcnJvcgorCXdpbGwgb2NjdXIuCmRpZmYgLS1naXQgYS9kb2MvbWFzdGVyL2Nvbm5lY3QgYi9kb2MvbWFzdGVyL2Nvbm5lY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFjNzMxNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXN0ZXIvY29ubmVjdApAQCAtMCwwICsxLDEzIEBACitTWU5PUFNJUworCW9iamVjdCBjb25uZWN0KHZvaWQpCisKK0RFU0NSSVBUSU9OCisJUmV0dXJuIGEgbG9naW4gb2JqZWN0IHRoYXQgdGhlIHJlcXVlc3RlZCBjb25uZWN0aW9uIHNob3VsZCBiZQorCWJvdW5kIHRvLiBOb3RlIHRoYXQgdGhlIGNvbm5lY3Rpb24gaXMgbm90IGJvdW5kIHlldC4KKworCVRoZSBsZnVuIGxvZ29uKCkgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBsb2dpbiBvYmplY3QgYWZ0ZXIKKwliaW5kaW5nIHRoZSBjb25uZWN0aW9uIHRvIGl0LiBUaGF0IGxmdW4gaGFzIHRvIHJldHVybiAhPSAwIHRvCisJaW5kaWNhdGUgc3VjY2Vzcy4KKworU0VFIEFMU08KKwlsb2dvbihBKSwgZGlzY29ubmVjdChNKSwgaW50ZXJhY3RpdmUoRSksIGV4ZWMoRSkKZGlmZiAtLWdpdCBhL2RvYy9tYXN0ZXIvZGFuZ2xpbmdfbGZ1bl9jbG9zdXJlIGIvZG9jL21hc3Rlci9kYW5nbGluZ19sZnVuX2Nsb3N1cmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJmYWViNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXN0ZXIvZGFuZ2xpbmdfbGZ1bl9jbG9zdXJlCkBAIC0wLDAgKzEsMjYgQEAKK1NZTk9QU0lTCisJdm9pZCBkYW5nbGluZ19sZnVuX2Nsb3N1cmUoKQorCitERVNDUklQVElPTgorCUhhbmRsZSBhIGRhbmdsaW5nIGxmdW4tY2xvc3VyZS4KKworCVRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIGdhbWVkcml2ZXIgZXhlY3V0ZXMgYSBjbG9zdXJlIHVzaW5nIGEKKwl2YW5pc2hlZCBsZnVuLiBBIHByb3BlciBoYW5kbGluZyBpcyB0byByYWlzZSBhIHJ1bnRpbWUgZXJyb3IuCisKKwlUZWNobmljYWw6CisJICBVcG9uIHJlcGxhY2luZyBwcm9ncmFtcyAoc2VlIGVmdW4gcmVwbGFjZV9wcm9ncmFtKCkpLCBhbnkKKwkgIGV4aXN0aW5nIGxhbWJkYSBjbG9zdXJlcyBvZiB0aGUgb2JqZWN0IGFyZSBhZGp1c3RlZCB0byB0aGUKKwkgIG5ldyBlbnZpcm9ubWVudC4gSWYgYSBjbG9zdXJlIHVzZXMgYSBsZnVuIHdoaWNoIHZhbmlzaGVkIGluCisJICB0aGUgcmVwbGFjZW1lbnQgcHJvY2VzcywgdGhlIHJlZmVyZW5jZSB0byB0aGlzIGxmdW4gaXMKKwkgIHJlcGxhY2VkIGJ5IGEgcmVmZXJlbmNlIHRvIHRoaXMgZnVuY3Rpb24uIFRoZSBlcnJvciB3aWxsCisJICB0aGVuIG9jY3VyIHdoZW4gdGhlIGV4ZWN1dGlvbiBvZiB0aGUgYWRqdXN0ZWQgbGFtYmRhIHJlYWNoZXMKKwkgIHRoZSBwb2ludCBvZiB0aGUgbGZ1biByZWZlcmVuY2UuIFRoZXJlIGFyZSB0d28gcmVhc29ucyBmb3IKKwkgIHRoZSBkZWxheWVkIGhhbmRsaW5nLiBGaXJzdCBpcyB0aGF0IHRoZSBwcm9ncmFtIHJlcGxhY2VtZW50CisJICBhbmQgd2l0aCBpdCB0aGUgY2xvc3VyZSBhZGp1c3RtZW50IGhhcHBlbnMgYXQgdGhlIGVuZCBvZiBhCisJICBiYWNrZW5kIGN5Y2xlLCBvdXRzaWRlIG9mIGFueSBleGVjdXRpb24gdGhyZWFkOiBub29uZSB3b3VsZAorCSAgc2VlIHRoZSBlcnJvciBhdCB0aGlzIHRpbWUuICBTZWNvbmQsIHNtYXJ0IGNsb3N1cmVzIG1pZ2h0CisJICBrbm93L3JlY29nbml6ZSB0aGUgcHJvZ3JhbSByZXBsYWNlbWVudCAgYW5kIHNraXAgdGhlIGNhbGwgdG8KKwkgIHRoZSB2YW5pc2hlZCBsZnVuLgorCitTRUUgQUxTTworCWNsb3N1cmVzKExQQykKZGlmZiAtLWdpdCBhL2RvYy9tYXN0ZXIvZGlzY29ubmVjdCBiL2RvYy9tYXN0ZXIvZGlzY29ubmVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2E5ZjNkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hc3Rlci9kaXNjb25uZWN0CkBAIC0wLDAgKzEsMTMgQEAKK1NZTk9QU0lTCisJdm9pZCBkaXNjb25uZWN0KG9iamVjdCBvYikKKworREVTQ1JJUFRJT04KKwlIYW5kbGUgdGhlIGxvc3Mgb2YgdGhlIElQIGNvbm5lY3Rpb24gZm9yIHRoZSAoZm9ybWVybHkpCisJaW50ZXJhY3RpdmUgb2JqZWN0IG9iLiBUaGUgY29ubmVjdGlvbiBjYW4gYmUgbG9zdCBiZWNhdXNlIHRoZQorCXRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBjb25uZWN0aW9uIHdhcyBsb3N0IChgYG5ldGRlYWQnJyksIG9yCisJYmVjYXVzZSBvZiBhIGNhbGwgdG8gZXhlYygpIG9yIHJlbW92ZV9pbnRlcmFjdGl2ZSgpLiBUaGUKKwljb25uZWN0aW9uIHdpbGwgYmUgdW5ib3VuZCB1cG9uIHJldHVybiBmcm9tIHRoaXMgY2FsbC4KKworU0VFIEFMU08KKwljb25uZWN0KE0pLCByZW1vdmVfcGxheWVyKE0pLCByZW1vdmVfaW50ZXJhY3RpdmUoRSksIGV4ZWMoRSksCisJaW50ZXJhY3RpdmUoRSkKZGlmZiAtLWdpdCBhL2RvYy9tYXN0ZXIvZXBpbG9nIGIvZG9jL21hc3Rlci9lcGlsb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI1MWQ3NQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXN0ZXIvZXBpbG9nCkBAIC0wLDAgKzEsMjQgQEAKK1NZTk9QU0lTCisJdm9pZCBlcGlsb2codm9pZCkJCS8qIGNvbXBhdCBpbiAzLjIgKi8KKwlzdHJpbmcgKmVwaWxvZyhpbnQgZWZsYWcpCS8qICFjb21wYXQgb3IgMy4yLjEgKi8KKworREVTQ1JJUFRJT04KKwlQZXJmb3JtIGZpbmFsIGFjdGlvbnMgYmVmb3JlIG9wZW5pbmcgdGhlIHN5c3RlbSB0byB1c2Vycy4KKwlUaGUgc2VtYW50aWNzIG9mIHRoaXMgZnVuY3Rpb24gZGlmZmVyIGZvciBjb21wYXQgYW5kICFjb21wYXQKKwltb2RlLCBhbmQgYmV0d2VlbiAzLjIgYW5kIDMuMi4xLgorCisJQ29tcGF0IGluIDMuMjogdGhlIG9iamVjdHMgZnJvbSB0aGUgSU5JVF9GSUxFICgjZGVmaW5lZCB0bworCSJyb29tL2luaXRfZmlsZSIgYXQgY29tcGlsZSB0aW1lIGluIHRoZSBwYXJzZXIpIGFyZSBhbHJlYWR5CisJbG9hZGVkIGF0IHRoaXMgdGltZS4gTm9ybWFsbHkgdGhlcmUgaXMgbm90aGluZyBsZWZ0IHRvIGRvIGZvcgorCXRoaXMgZnVuY3Rpb24uCisKKwkhQ29tcGF0IGFuZCAzLjIuMTogdGhlIGFyZ3VtZW50IGlzIHRoZSBudW1iZXIgb2YgLWUgb3B0aW9ucyB0aGF0IHdlcmUKKwlnaXZlbiB0byB0aGUgcGFyc2VyIG9uIHRoZSBjb21tYW5kbGluZS4gTm9ybWFsbHkgaXQgaXMganVzdCAwCisJb3IgMS4gVGhlIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYW4gYXJyYXkgb2Ygc3RyaW5ncywgd2hpY2gKKwl0cmFkaXRpb25hbGx5IGRlbm90ZSB0aGUgb2JqZWN0cyB0byBiZSBwcmVsb2FkZWQgd2l0aAorCW1hc3Rlci0+cHJlbG9hZCgpLiBBbnkgb3RoZXIgcmV0dXJuIHZhbHVlIGlzIGludGVycHJldGVkIGFzCisJYGBubyBvYmplY3QgdG8gcHJlbG9hZCcnLiBUaGUgcmVzdWx0aW5nIHN0cmluZ3Mgd2lsbCBiZSBwYXNzZWQKKwlvbmUgYXQgYSB0aW1lIGFzIGFyZ3VtZW50cyB0byBwcmVsb2FkKCkuCisKK1NFRSBBTFNPCQorCXByZWxvYWQoTSksIG1hc3RlcihNKQpkaWZmIC0tZ2l0IGEvZG9jL21hc3Rlci9leHRlcm5hbF9tYXN0ZXJfcmVsb2FkIGIvZG9jL21hc3Rlci9leHRlcm5hbF9tYXN0ZXJfcmVsb2FkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3OTEzZjAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWFzdGVyL2V4dGVybmFsX21hc3Rlcl9yZWxvYWQKQEAgLTAsMCArMSwxMCBAQAorU1lOT1BTSVMKKwl2b2lkIGV4dGVybmFsX21hc3Rlcl9yZWxvYWQoKQorCitERVNDUklQVElPTgorCU1hc3RlciB3YXMgcmVsb2FkZWQgb24gZXh0ZXJuYWwgcmVxdWVzdCBieSBTSUdVU1IxLgorCUl0IHdpbGwgYmUgY2FsbGVkIGFmdGVyIGluYXVndXJhdGVfbWFzdGVyKCkgb2YgY291cnNlLgorCUlmIHlvdSBwbGFuIHRvIGRvIGFkZGl0aW9uYWwgbWFnaWMgaGVyZSwgeW91J3JlIHdlbGNvbWUuCisKK1NFRSBBTFNPCisJaW5hdWd1cmF0ZV9tYXN0ZXIoTSkKZGlmZiAtLWdpdCBhL2RvYy9tYXN0ZXIvZmxhZyBiL2RvYy9tYXN0ZXIvZmxhZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDRlOTFkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hc3Rlci9mbGFnCkBAIC0wLDAgKzEsNDEgQEAKK1NZTk9QU0lTCisJdm9pZCBmbGFnKHN0cmluZyBhcmcpCisKK0RFU0NSSVBUSU9OCisJRXZhbHVhdGUgYW4gYXJndW1lbnQgZ2l2ZW4gYXMgb3B0aW9uICctZicgdG8gdGhlIGRyaXZlci4KKwlJZiBzZXZlcmFsICctZicgb3B0aW9ucyBhcmUgZ2l2ZW4sIHRoaXMgZnVuY3Rpb24gd2lsbCBiZQorCWNhbGxlZCBzZXF1ZW50aWFsbHkgd2l0aCBhbGwgZ2l2ZW4gYXJndW1lbnRzLgorCVRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcGFzcyB0aGUgbWFzdGVyIGNvbW1hbmRzIHZpYQorCWFyZ3VtZW50cyB0byB0aGUgZHJpdmVyLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGJ1aWxkaW5nIGEgbmV3CisJbXVkbGliIGZyb20gc2NyYXRjaC4gSXQgaXMgY2FsbGVkIG9ubHkgd2hlbiB0aGUgc3lzdGVtIGlzCisJc3RhcnRlZC4KKworRVhBTVBMRQorCS8vIFRoZSBjb2RlIGdpdmVuIGltcGxlbWVudHMgdGhlc2UgY29tbWFuZHM6CisJLy8gICctZmNhbGwgPG9iPiA8ZnVuPiA8YXJnPic6IGNhbGwgZnVuY3Rpb24gPGZ1bj4gaW4gb2JqZWN0IDxvYj4gd2l0aAorCS8vCQkJCWFyZ3VtZW50IDxhcmc+LgorCS8vICAnLWZzaHV0ZG93bic6IHNodXRkb3duIHRoZSBzeXN0ZW0gaW1tZWRpYXRlbHkuCisJLy8gVGh1cywgc3RhcnRpbmcgdGhlIGRyaXZlciBhcworCS8vCSAncGFyc2UgIi1mY2FsbCBmb28gYmFyIFlvdyEiIC1mc2h1dGRvd24nIHdvdWxkCisJLy8gZmlyc3QgZG8gZm9vLT5iYXIoIllvdyEiKSBhbmQgdGhlbiBzaHV0IGRvd24gdGhlIHN5c3RlbS4KKworCXsKKwkgIHN0cmluZyBvYmosIGZ1biwgcmVzdDsKKworCSAgaWYgKGFyZyA9PSAic2h1dGRvd24iKQorCSAgeworCSAgICBzaHV0ZG93bigpOworCSAgICByZXR1cm47CisJICB9CisJICBpZiAoc3NjYW5mKGFyZywgImNhbGwgJXMgJXMgJXMiLCBvYmosIGZ1biwgcmVzdCkgPj0gMikKKwkgIHsKKwkgICAgd3JpdGUob2JqKyItPiIrZnVuKyIoXCIiK3Jlc3QrIlwiKSA9ICIpOworCSAgICB3cml0ZShjYWxsX290aGVyKG9iaiwgZnVuLCByZXN0KSk7CisJICAgIHdyaXRlKCJcbiIpOworCSAgICByZXR1cm47CisJICB9CisJICB3cml0ZSgibWFzdGVyOiBVbmtub3duIGZsYWcgIithcmcrIlxuIik7CisJfQorCitTRUUgQUxTTworCW1hc3RlcihNKQpkaWZmIC0tZ2l0IGEvZG9jL21hc3Rlci9nZXRfYmJfdWlkIGIvZG9jL21hc3Rlci9nZXRfYmJfdWlkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNGRjOGIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWFzdGVyL2dldF9iYl91aWQKQEAgLTAsMCArMSwxOCBAQAorU1lOT1BTSVMKKwlzdHJpbmcgZ2V0X2JiX3VpZCh2b2lkKQorCitERVNDUklQVElPTgorCUlzIGNhbGxlZCB0byBnZXQgdGhlIGBgYmFja2JvbmUgaWQnJy4gT2JqZWN0cyB3aG9zZSBjcmVhdG9yIGlzCisJdGhlIGJhY2tib25lIGlkIGFyZSBgYHRydXN0ZWQnJywgYW5kIHdpbGwgYXV0b21hZ2ljYWxseSBnZXQKKwl0aGUgdWlkIGFuZCBldWlkIG9mIHRoZSBvYmplY3QgdGhhdCBjYXVzZWQgdG8gbG9hZCBvciBjbG9uZQorCXRoZW0uCisKKwlUaGUgYmFja2JvbmUgaWQgaXMgYWxzbyB0ZW1wb3JhcnkgZ2l2ZW4gdG8gb2JqZWN0cyB3aGlsZSBiZWluZworCWNhbGxlZCB2aWEgcHJvY2Vzc19zdHJpbmcoKS4KKworSElTVE9SWQorCVNpbmNlIDMuMi4xLCBnZXRfYmJfdWlkKCkgaXMgbmVlZGVkIGp1c3QgZm9yIHByb2Nlc3Nfc3RyaW5nKCkKKwlpZiBubyB0aGlzX29iamVjdCgpIGlzIHByZXNlbnQuCisKK1NFRSBBTFNPCisJdWlkcyhDKSwgY3JlYXRvcl9maWxlKE0pLCBjcmVhdG9yKEUpLCBnZXRfcm9vdF9pZChNKQpkaWZmIC0tZ2l0IGEvZG9jL21hc3Rlci9nZXRfZWRfYnVmZmVyX3NhdmVfZmlsZV9uYW1lIGIvZG9jL21hc3Rlci9nZXRfZWRfYnVmZmVyX3NhdmVfZmlsZV9uYW1lCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYTIzYzMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWFzdGVyL2dldF9lZF9idWZmZXJfc2F2ZV9maWxlX25hbWUKQEAgLTAsMCArMSwyMiBAQAorU1lOT1BTSVMKKwlzdHJpbmcgZ2V0X2VkX2J1ZmZlcl9zYXZlX29iamVjdF9uYW1lKHN0cmluZyBlZGl0ZWRfZmlsZSkKKworREVTQ1JJUFRJT04KKwlUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGFuIGludGVyYWN0aXZlIHVzZXIgb2JqZWN0IGlzCisJZGVzdHJ1Y3RlZCBvciBsb29zZXMgY29ubmVjdGlvbiB0aHJvdWdoIHJlbW92ZV9pbnRlcmFjdGl2ZSgpCisJd2hpbGUgZWRpdGluZyB3aXRoIGVkKCkgdGhlIGZpbGUgZWRpdGVfZmlsZSAoZW1lcmdlbmN5IHNhdmUpLgorCXRoaXNfcGxheWVyKCkgaXMgc2V0IHRvIHRoZSBvYmplY3QgdGhhdCBsb29zaW5nIGNvbm5lY3Rpb24uCisJVGhlIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYSBmaWxlIG5hbWUgZm9yIHRoZSBlbWVyZ2VuY3kgc2F2ZQorCWZpbGUuCisKK0VYQU1QTEUKKwlzdHJpbmcgZ2V0X2VkX2J1ZmZlcl9zYXZlX29iamVjdF9uYW1lKHN0cmluZyBmaWxlKSB7CisJICByZXR1cm4gIi9wbGF5ZXJzLyIrZ2V0dWlkKHRoaXNfcGxheWVyKCkpKyIvLmRlYWRfZWRfZmlsZXMvIgorCQkgKyBleHBsb2RlKGZpbGUsICIvIilbPDFdOworCX0KKworCVRoaXMgYnJlYWtzIHVwIGZpbGUgaW50byBpdHMgY29tcG9uZW50cyBhbmQgc3RvcmVzIGl0IGluIHRoZQorCXVzZXIncyBlbWVyZ2VuY3kgc2F2ZSBkaXJlY3RvcnkgdW5kZXIgdGhlIGZpbGUncyBiYXNlbmFtZS4KKworU0VFIEFMU08KKwllZChFKSwgZGVzdHJ1Y3QoRSksIHJlbW92ZV9pbnRlcmFjdGl2ZShFKSwgdmFsaWRfd3JpdGUoTSkKZGlmZiAtLWdpdCBhL2RvYy9tYXN0ZXIvZ2V0X21hc3Rlcl91aWQgYi9kb2MvbWFzdGVyL2dldF9tYXN0ZXJfdWlkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYzY3MzcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWFzdGVyL2dldF9tYXN0ZXJfdWlkCkBAIC0wLDAgKzEsMTIgQEAKK1NZTk9QU0lTCisJc3RyaW5nIGdldF9tYXN0ZXJfdWlkKHZvaWQpCisKK0RFU0NSSVBUSU9OCisJUmV0dXJuIHRoZSBzdHJpbmcgdG8gYmUgdXNlZCBhcyByb290LXVpZC4KKwlVbmRlciAhbmF0aXZlLCB0aGUgZnVuY3Rpb24gaXMgZXhwZW5kYWJsZS4KKworSElTVE9SWQorCUludHJvZHVjZWQgaW4gMy4yLjFANDAgcmVwbGFjaW5nIGdldF9yb290X3VpZCgpLgorCitTRUUgQUxTTworCWdldF9iYl91aWQoTSksIGdldF9tYXN0ZXJfdWlkKE0pLCB1aWRzKEMpLCBjcmVhdG9yX2ZpbGUoTSksIGNyZWF0b3IoRSkKZGlmZiAtLWdpdCBhL2RvYy9tYXN0ZXIvZ2V0X3NpbXVsX2VmdW4gYi9kb2MvbWFzdGVyL2dldF9zaW11bF9lZnVuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YWRiYTAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWFzdGVyL2dldF9zaW11bF9lZnVuCkBAIC0wLDAgKzEsMjQgQEAKK1NZTk9QU0lTCisJbWl4ZWQgZ2V0XyAgICAgc2ltdWxfZWZ1bih2b2lkKSAgICAgIC8vIDMuMgorCXN0cmluZ3xzdHJpbmcqIGdldF9zaW11bF9lZnVuKHZvaWQpICAvLyAzLjIuMQorCitERVNDUklQVElPTgorCUxvYWQgdGhlIHNpbXVsX2VmdW4gb2JqZWN0KHMpIGFuZCByZXR1cm4gb25lIG9yIG1vcmUgcGF0aHMgb2YgaXQuCisvLyBOb3RlIHRoYXQgdGhlIG9iamVjdChzKSBtdXN0IGJlIGxvYWRlZCBieSB0aGlzIGZ1bmN0aW9uIQorLy8KKy8vIFdoZW4geW91IHJldHVybiBhbiBhcnJheSBvZiBzdHJpbmdzLCB0aGUgZmlyc3Qgc3RyaW5nIGlzIHRha2VuIGFzIHBhdGgKKy8vIHRvIHRoZSBzaW11bF9lZnVuIG9iamVjdCwgYW5kIGFsbCBvdGhlciBwYXRocyBhcmUgdXNlZCBmb3IgYmFja3VwCisvLyBzaW11bF9lZnVuIG9iamVjdHMgdG8gY2FsbCBzaW11bF9lZnVucyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUKKy8vIG1haW4gc2ltdWxfZWZ1biBvYmplY3QuIFRoaXMgYWxsb3dzIHRvIHJlbW92ZSBzaW11bF9lZnVucyBhdCBydW50aW1lIAorLy8gd2l0aG91dCBnZXR0aW5nIGVycm9ycyBmcm9tIG9sZCBjb21waWxlZCBwcm9ncmFtcyB0aGF0IHN0aWxsIHVzZSB0aGUgCisvLyBvYnNvbGV0ZSBzaW11bF9lZnVucy4gQSBzaWRlIHVzZSBvZiB0aGlzIG1lY2hhbmlzbSBpcyB0byBwcm92aWRlIAorLy8gYSAnc3BhcmUnIHNpbXVsX2VmdW4gb2JqZWN0IGluIGNhc2UgdGhlIG5vcm1hbCBvbmUgZmFpbHMgdG8gbG9hZC4KKy8vCisJU2hvdWxkIHJldHVybiBlaXRoZXIgdGhlIG9iamVjdF9uYW1lIG9mIHRoZSBzaW11bF9lZnVuIG9iamVjdCBhcworCWEgc3RyaW5nLCBvciBhbiBhcnJheSBjb250YWluaW5nIGFzIGZpcnN0IGVsZW1lbnQgYSBzdHJpbmcKKwl3aXRoIHRoZSBmaWxlIG5hbWUgb2YgdGhlIHNpbXVsX2VmdW4gb2JqZWN0IGFuZCB0aGUgZm9sbG93aW5nCisJZWxlbWVudHMgc3RyaW5ncyB3aXRoIGZpbGUgbmFtZXMgb2YgYWx0ZXJuYXRlIHNpbXVsX2VmdW4KKwlvYmplY3RzIHRoYXQgd2lsbCBiZSB1c2VkIGlmIHRoZSBmaXJzdCBvbmUgY2Fubm90IGJlIGxvYWRlZC4KKworU0VFIEFMU08KKwlzaW11bF9lZnVuKEMpCmRpZmYgLS1naXQgYS9kb2MvbWFzdGVyL2dldF93aXpfbmFtZSBiL2RvYy9tYXN0ZXIvZ2V0X3dpel9uYW1lCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNTY5NjUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWFzdGVyL2dldF93aXpfbmFtZQpAQCAtMCwwICsxLDEzIEBACitTWU5PUFNJUworCXN0cmluZyBnZXRfd2l6X25hbWUoc3RyaW5nIGZpbGUpCisKK0RFU0NSSVBUSU9OCisJQXJndW1lbnQgaXMgYSBmaWxlIG5hbWUsIHdoaWNoIHdlIHdhbnQgdG8gZ2V0IHRoZSBvd25lciBvZi4KKwlUaGlzIHVzZWQgZm9yIHRoZSB3aXpsaXN0LCB0byBkZXRlcm1pbmUgd2hvIGdldHMgdGhlIHNjb3JlIGZvcgorCXRoZSBmaWxlIGJlaW5nIHVzZWQuCisKKwlGb3IgMy4yLjEsIGl0IGlzIHVzZWQgb25seSB0byBzY29yZSBlcnJvcnMgdG8gdGhlIHJpZ2h0IHdpemFyZC4KKworU0VFIEFMU08KKwl3aXpsaXN0KEUpLCBnZXRfd2l6X2luZm8oRSksIHF1ZXJ5X3JlYWxfbmFtZShBKSwKKwlxdWVyeV9jcmVhdG9yKE0pLCBnZXR1aWQoRSkKZGlmZiAtLWdpdCBhL2RvYy9tYXN0ZXIvaGFuZGxlX2V4dGVybmFsX3NpZ25hbCBiL2RvYy9tYXN0ZXIvaGFuZGxlX2V4dGVybmFsX3NpZ25hbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmU4MWVmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hc3Rlci9oYW5kbGVfZXh0ZXJuYWxfc2lnbmFsCkBAIC0wLDAgKzEsMjYgQEAKK1NZTk9QU0lTCisgICAgICAgICNpbmNsdWRlIDxzaWduYWxzLmg+CisKKyAgICAgICAgaW50IGhhbmRsZV9leHRlcm5hbF9zaWduYWwoaW50IHNpZ25hbCkKKworREVTQ1JJUFRJT04KKyAgICAgICAgSWYgdGhlIGRyaXZlciByZWNlaXZlcyBhIHNpZ25hbCBmcm9tIHRoZSBPUyBpdCBmb3J3YXJkcyBpdCB0byB0aGUKKyAgICAgICAgbXVkbGliIG1hc3RlciBieSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uIFRoZSBzaWduYWwgcmVjZWl2ZWQgYnkgdGhlCisgICAgICAgIGRyaXZlciBpcyBnaXZlbiBpbiA8c2lnbmFsPiBhbmQgbWF5IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorICAgICAgICBTSUdIVVAsIFNJR0lOVCwgU0lHVEVSTSwgU0lHVVNSMSwgU0lHVVNSMi4KKworICAgICAgICBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgIT0gMCwgdGhlIGRyaXZlciB3aWxsIGFzc3VtZSB0aGUgc2lnbmFsIGhhcworICAgICAgICBiZWVuIGRlYWx0IHdpdGggYW5kIHRha2UgTk8gZnVydGhlciBhY3Rpb24uCisgICAgICAgIFRoZSBleGNlcHRpb24gaXMgU0lHVEVSTSwgd2hpY2ggY2FuJ3QgYmUgaGFuZGxlZC4gVGhlIGRyaXZlciB3aWxsCisgICAgICAgIHBlcmZvcm0gYSBncmFjZWZ1bCBzaHV0ZG93biBvZiB0aGUgZ2FtZSBhZnRlciB0aGlzIGZ1bmN0aW9uIHJldHVybnMuCisKKyAgICAgICAgSWYgdGhlIG1hc3RlciBkb2VzIG5vdCBoYW5kbGUgdGhlIHNpZ25hbCAocmV0dXJucyAwIG9yIHRoaXMgZnVuY3Rpb24KKyAgICAgICAgZG9lIG5vdCBleGl0KSwgdGhlIGRyaXZlciB3aWxsIHBlcmZvcm0gdGhlIGZvbGxvd2luZyBkZWZhdWx0IGFjdGlvbnM6CisKKyAgICAgICAgU0lHSFVQOiAgYmVnaW4gYSBncmFjZWZ1bCBzaHV0ZG93bgorICAgICAgICBTSUdJTlQ6ICBzZW5kIGl0c2VsZiBhbiB1bmhhbmRsZWQgU0lHSU5ULiBUaGlzIHVzdWFsbHkgY2F1c2VzIGFuCisgICAgICAgICAgICAgICAgIGltbWVkaWF0ZSBhbmQgbm9uLWdyYWNlZnVsIHNodXRkb3duLgorICAgICAgICBTSUdVU1IxOiB0aGUgZHJpdmVyIHdpbGwgcmVsb2FkIHRoZSBtYXN0ZXIgb2JqZWN0CisgICAgICAgIFNJR1VTUjI6IHRoZSBkcml2ZXIgd2lsbCByZS1vcGVuIGl0cyBkZWJ1ZyBsb2cgZmlsZQorICAgICAgICAgICAgICAgICAodGhpcyB3aWxsIGhhcHBlbiB0aGUgbmV4dCB0aW1lIHRoZSBkcml2ZXIgd3JpdGVzIHRvIGl0KQorCmRpZmYgLS1naXQgYS9kb2MvbWFzdGVyL2hlYXJ0X2JlYXRfZXJyb3IgYi9kb2MvbWFzdGVyL2hlYXJ0X2JlYXRfZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRkMTVmMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXN0ZXIvaGVhcnRfYmVhdF9lcnJvcgpAQCAtMCwwICsxLDI0IEBACitTWU5PUFNJUworCW1peGVkIGhlYXJ0X2JlYXRfZXJyb3Iob2JqZWN0IGN1bHByaXQsIHN0cmluZyBlcnIsIHN0cmluZyBwcmcsCisJCQkgICAgICAgc3RyaW5nIGN1cm9iaiwgaW50IGxpbmUpCisKK0RFU0NSSVBUSU9OCisJVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIHJ1bnRpbWUgZXJyb3Igb2NjdXJzIHdoaWxlCisJZXhlY3V0aW5nIHRoZSBoZWFydF9iZWF0KCkgZnVuY3Rpb24gb2YgdGhlIG9iamVjdCBjdWxwcml0LiBwcmcKKwlpcyBwcm9ncmFtIHdoZXJlIHRoZSBhY3R1YWwgZXJyb3IgaGFwcGVuZWQsIGluIG9iamVjdCBjdXJvYmoKKwlhdCB0aGUgZ2l2ZW4gbGluZS4KKworCUF0IHRpbWUgb2YgY2FsbCwgdGhlIGhlYXJ0X2JlYXQgaGFzIGJlZW4gdHVybmVkIG9mZi4KKwlSZXR1cm4gYW55dGhpbmcgIT0gMCB0byByZXN0YXJ0IHRoZSBoZWFydF9iZWF0IGluIGN1bHByaXQuCisKKwlJZiBjdWxwcml0IGlzIGEgdXNlciwgaXQgc2hvdWxkIGF0IGxlYXN0IGdldCB0aGUgbWVzc2FnZSBgYFlvdQorCWhhdmUgbm8gaGVhcnRiZWF0JycuIEEgbW9yZSBhZHZhbmNlZCBoYW5kbGluZyB3b3VsZCBkZXN0cnVjdAorCXRoZSBvZmZlbmRpbmcgb2JqZWN0IGN1cm9iaiBhbmQgYW5kIGFsbG93IHRoZSBoZWFydGJlYXQgdG8KKwlyZXN0YXJ0LgorCisJTm90ZSB0aGF0IHByZyBkZW5vdGVzIHRoZSBwcm9ncmFtIGFjdHVhbGx5IGV4ZWN1dGVkICh3aGljaAorCW1pZ2h0IGJlIGFuIGluaGVyaXRlZCBvbmUpIHdoZXJlYXMgY3Vyb2JqIGlzIGp1c3QgdGhlCisJb2ZmZW5kaW5nIG9iamVjdC4KKworU0VFIEFMU08KKwlzZXRfaGVhcnRfYmVhdChFKSwgaGVhcnRfYmVhdChBKSwgcnVudGltZV9lcnJvcihNKQpkaWZmIC0tZ2l0IGEvZG9jL21hc3Rlci9pbmF1Z3VyYXRlX21hc3RlciBiL2RvYy9tYXN0ZXIvaW5hdWd1cmF0ZV9tYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVjOTUyNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXN0ZXIvaW5hdWd1cmF0ZV9tYXN0ZXIKQEAgLTAsMCArMSwzMCBAQAorU1lOT1BTSVMKKwl2b2lkIGluYXVndXJhdGVfbWFzdGVyKGludCBhcmcpCisKK0RFU0NSSVBUSU9OCisJVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gdGhlIG1hc3RlciBvYmplY3QgYWZ0ZXIgaXQgaGFzIGJlZW4KKwljcmVhdGVkIGFuZCBpcyBmdWxseSBmdW5jdGlvbmFsLiBOb3RlIHRoYXQgdGhlIGNyZWF0ZSgpCisJZnVuY3Rpb24gaXMgb2YgbGl0dGxlIHVzZSBpbiB0aGUgbWFzdGVyIG9iamVjdCwgYmVjYXVzZSBhdCB0aGUKKwl0aW1lIGl0IGlzIGNhbGxlZCB0aGVyZSBpcyBubyBzaW11bF9lZnVuIG9iamVjdCB5ZXQsIGFuZCB0aGUKKwlpbnRlcnByZXRlciBkb2VzIG5vdCBrbm93IGFueXRoaW5nIGFib3V0IHRoZSB1c2VyLWlkcyBhbmQKKwlhY2Nlc3MgcGVybWlzc2lvbnMuCisKKwlUaGUgYXJndW1lbnQgPGFyZz4gZGVub3RlcyB3aHkgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQ6CisJICBhcmcgPSAwOiB0aGUgbXVkIGp1c3Qgc3RhcnRlZCwgdGhpcyBpcyB0aGUgZmlyc3QgbWFzdGVyIG9mIGFsbC4KKwkgICAgICA9IDE6IHRoZSBtYXN0ZXIgd2FzIGRlc3RydWN0ZWQgYW5kIHRoZW4gcmVhY3RpdmF0ZWQKKwkgICAgICAgICAgIChiZWNhdXNlIGEgbmV3IG9uZSBjb3VsZG4ndCBiZSBsb2FkZWQpLgorCSAgICAgID0gMjogdGhlIG1hc3RlciB3YXMgZGVzdHJ1Y3RlZCBhbmQgdGhlbiByZWFjdGl2YXRlZCwgYnV0CisJICAgICAgICAgICBhZGRpdGlvbmFsbHkgbG9zdCBhbGwgdmFyaWFibGUgY29udGVudHMuCisJICAgICAgPSAzOiB0aGlzIGlzIGEgcmVsb2FkZWQgbWFzdGVyLgorCisJVGhpcyBmdW5jdGlvbiBoYXMgYXQgbGVhc3QgdG8gc2V0IHVwIHRoZSBkcml2ZXJob29rcyB0byB1c2UKKwkoaW4gMy4yLjEpLiBBbHNvLCBhbnkgbXVkd2hvIG9yIHdpemxpc3QgaGFuZGxpbmcgaGFzIHRvIGJlCisJaW5pdGlhbGl6ZWQgaGVyZS4KKworCUJlc2lkZXMgdGhhdCwgZG8gd2hhdGV2ZXIgeW91IGZlZWwgeW91IG5lZWQgdG8gZG8sIAorCWUuZy4gc2V0X2F1dG9faW5jbHVkZV9zdHJpbmcoKSwgb3IgZ2l2ZSB0aGUgbWFzdGVyIGEgZGVjZW50IGV1aWQuCisKK1NFRSBBTFNPCisJaW5pdGlhbGlzYXRpb24oTSksIGNyZWF0ZShNKSwgc2ltdWxfZWZ1bihDKSwgZ2V0X2JiX2lkKE0pLAorCWdldF9yb290X2lkKE0pLCBnZXRfbWFzdGVyX3VpZChNKSwgZmxhZyhNKSwKKwlyZWFjdGl2YXRlX2Rlc3RydWN0ZWRfbWFzdGVyKE0pCmRpZmYgLS1naXQgYS9kb2MvbWFzdGVyL2luY2x1ZGVfZmlsZSBiL2RvYy9tYXN0ZXIvaW5jbHVkZV9maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NTY4ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWFzdGVyL2luY2x1ZGVfZmlsZQpAQCAtMCwwICsxLDMyIEBACitTWU5PUFNJUworICAgICAgICBtaXhlZCBpbmNsdWRlX2ZpbGUgKHN0cmluZyBmaWxlLCBzdHJpbmcgY29tcGlsZWRfZmlsZSwgaW50IHN5c19pbmNsdWRlKQorCitERVNDUklQVElPTgorICAgICAgICBHZW5lcmF0ZSB0aGUgcGF0aG5hbWUgb2YgYW4gaW5jbHVkZWQgZmlsZS4KKworICAgICAgICBBcmd1bWVudHM6CisgICAgICAgICAgcHJldmlvdXNfb2JqZWN0KCk6IFRoZSBvYmplY3QgY2F1c2luZyB0aGUgY29tcGlsZS4KKyAgICAgICAgICBmaWxlICAgICAgICAgICAgIDogVGhlIG5hbWUgZ2l2ZW4gaW4gdGhlICNpbmNsdWRlIGRpcmVjdGl2ZS4KKyAgICAgICAgICBjb21waWxlZF9maWxlICAgIDogVGhlIG9iamVjdCBmaWxlIHdoaWNoIGlzIGp1c3QgY29tcGlsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb21wYXQ6IG5hbWUgZ2l2ZW4gd2l0aG91dCBsZWFkaW5nICIvIikKKyAgICAgICAgICBzeXNfaW5jbHVkZSAgICAgIDogVFJVRSBmb3IgI2luY2x1ZGUgPD4gZGlyZWN0aXZlcy4KKworICAgICAgICBSZXN1bHQ6CisgICAgICAgICAgMDogdXNlIHRoZSBub3JtYWwgaW5jbHVkZSBmaWxlbmFtZSBnZW5lcmF0aW9uICgiIi1pbmNsdWRlcyBhcmUKKyAgICAgICAgICAgICB1c2VkIGFzIHRoZXkgYXJlLCA8Pi1pbmNsdWRlcyBhcmUgaGFuZGxlZCBhY2NvcmRpbmcgdG8KKyAgICAgICAgICAgICBIX0lOQ0xVREVfRElSUykuCisKKyAgICAgICAgICA8cGF0aD46IHRoZSBmdWxsIGFic29sdXRlIHBhdGhuYW1lIG9mIHRoZSBmaWxlIHRvIGluY2x1ZGUsCisgICAgICAgICAgICAgICAgICB3aXRob3V0IHBhcmVudGRpciBwYXJ0cyAoIi8uLi8iKS4gTGVhZGluZyBzbGFzaGVzICgiLyIpCisgICAgICAgICAgICAgICAgICBtYXkgYmUgb21pdHRlZC4KKworICAgICAgICAgIGVsc2U6IFRoZSBpbmNsdWRlIGRpcmVjdGl2ZSBpcyBub3QgbGVnYWwuCisKKyAgICAgICAgSWYgdGhlIGZ1bmN0aW9uIGRvZXMgbm90IGdlbmVyYXRlIGEgdmFsaWQgcGF0aG5hbWUsIHRoZSBkcml2ZXIKKyAgICAgICAgd2lsbCBuZXh0IHRyeSB0byByZXNvbHZlIHRoZSBpbmNsdWRlIHVzaW5nIHRoZSBIX0lOQ0xVREVfRElSUyBob29rLgorCitISVNUT1JZCisgICAgICAgIEludHJvZHVjZWQgaW4gTERNdWQgMy4yLjguCisKK1NFRSBBTFNPCisgICAgICAgIGhvb2tzKEMpLCBpbmhlcml0X2ZpbGUoTSksIGluY2x1ZGVfZGlycyhIKQpkaWZmIC0tZ2l0IGEvZG9jL21hc3Rlci9pbmhlcml0X2ZpbGUgYi9kb2MvbWFzdGVyL2luaGVyaXRfZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTE0ZmFjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hc3Rlci9pbmhlcml0X2ZpbGUKQEAgLTAsMCArMSwyNiBAQAorU1lOT1BTSVMKKyAgICAgICAgbWl4ZWQgaW5oZXJpdF9maWxlIChzdHJpbmcgZmlsZSwgc3RyaW5nIGNvbXBpbGVkX2ZpbGUpCisKK0RFU0NSSVBUSU9OCisgICAgICAgIEdlbmVyYXRlIHRoZSBwYXRobmFtZSBvZiBhbiBpbmhlcml0ZWQgb2JqZWN0LgorCisgICAgICAgIEFyZ3VtZW50czoKKyAgICAgICAgICBwcmV2aW91c19vYmplY3QoKTogVGhlIG9iamVjdCBjYXVzaW5nIHRoZSBjb21waWxlLgorICAgICAgICAgIGZpbGUgICAgICAgICAgICAgOiBUaGUgbmFtZSBnaXZlbiBpbiB0aGUgaW5oZXJpdCBkaXJlY3RpdmUuCisgICAgICAgICAgY29tcGlsZWRfZmlsZSAgICA6IFRoZSBvYmplY3QgZmlsZSB3aGljaCBpcyBqdXN0IGNvbXBpbGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29tcGF0OiBuYW1lIGdpdmVuIHdpdGhvdXQgbGVhZGluZyAiLyIpCisKKyAgICAgICAgUmVzdWx0OgorICAgICAgICAgIDA6IHVzZSB0aGUgZ2l2ZW4gZmlsZW5hbWUgYXMgaXQgaXMuCisKKyAgICAgICAgICA8cGF0aD46IHRoZSBmdWxsIGFic29sdXRlIHBhdGhuYW1lIG9mIHRoZSBmaWxlIHRvIGluaGVyaXQsCisgICAgICAgICAgICAgICAgICB3aXRob3V0IHBhcmVudGRpciBwYXJ0cyAoIi8uLi8iKS4gTGVhZGluZyBzbGFzaGVzICgiLyIpCisgICAgICAgICAgICAgICAgICBhcmUgaWdub3JlZC4KKworICAgICAgICAgIGVsc2U6IFRoZSBpbmhlcml0IGRpcmVjdGl2ZSBpcyBub3QgbGVnYWwuCisKK0hJU1RPUlkKKyAgICAgICAgSW50cm9kdWNlZCBpbiBMRE11ZCAzLjIuOC4KKworU0VFIEFMU08KKyAgICAgICAgaG9va3MoQyksIGluY2x1ZGVfZmlsZShNKQpkaWZmIC0tZ2l0IGEvZG9jL21hc3Rlci9pbml0aWFsaXNhdGlvbiBiL2RvYy9tYXN0ZXIvaW5pdGlhbGlzYXRpb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA4ZDM0YQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXN0ZXIvaW5pdGlhbGlzYXRpb24KQEAgLTAsMCArMSwxNiBAQAorU1lOT1BTSVMKKwlJbml0aWFsaXphdGlvbiBvZiB0aGUgbWFzdGVyIG9iamVjdCAoc2luY2UgMy4yLjEpLgorCisJQXMgc2luY2UgMy4yLjEgdGhlIGxmdW5zIHdoaWNoIGFyZSBjYWxsZWQgdG8gaW5pdGlhbGl6ZQorCW9iamVjdHMgYWZ0ZXIgYSBsb2FkIGFyZSBkZWZpbmVkIHRocm91Z2ggZHJpdmVyIGhvb2tzLCBhbmQKKwl0aGVzZSBob29rcyBhcmUgY2xlYXJlZCBwcmlvciB0byBhIG1hc3RlciAocmUpbG9hZCwgdGhlIGZpcnN0CisJZnVuY3Rpb24gY2FsbGVkIGlzIGluYXVndXJhdGVfbWFzdGVyKCkuIEFueXdheSBpdCdzIG5vdCB2ZXJ5CisJc2Vuc2libGUgdG8gZG8gYW55dGhpbmcgZWFybGllciBhcyB0aGUgbWFzdGVyIGlzIG5vdAorCXJlY29nbml6ZWQgYXMgc3VjaCBhdCB0aGF0IHRpbWUsIGFuZCBzbyBhIG51bWJlciBvZgorCShpbXBvcnRhbnQpIHRoaW5ncyB3b3VsZCBub3Qgd29yay4KKwlXaGljaCBsZnVuIGlzIGNhbGxlZCBkdXJpbmcgcnVudGltZSB0byByZXNldCB0aGUgbWFzdGVyIGlzIGFsc28KKwlkZXBlbmRpbmcgb24gdGhlIGRyaXZlcmhvb2sgc2V0dGluZ3MuIEFyYml0cmFyeSBhY3Rpb25zIG1heSBiZSBkb25lCisJb24gYSByZXNldC4KKworU0VFIEFMU08KKwlpbmF1Z3VyYXRlX21hc3RlcihNKQpkaWZmIC0tZ2l0IGEvZG9jL21hc3Rlci9sb2dfZXJyb3IgYi9kb2MvbWFzdGVyL2xvZ19lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmMzMzg1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hc3Rlci9sb2dfZXJyb3IKQEAgLTAsMCArMSwxMSBAQAorU1lOT1BTSVMKKwl2b2lkIGxvZ19lcnJvcihzdHJpbmcgZmlsZSwgc3RyaW5nIGVycikKKworREVTQ1JJUFRJT04KKwlBbm5vdW5jZSBhIGNvbXBpbGVyLXRpbWUgZXJyb3IgaW4gdGhlIG5hbWVkIGZpbGUuIFdoZW5ldmVyIHRoZQorCUxQQyBjb21waWxlciBkZXRlY3RzIGFuIGVycm9yLCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4gSXQKKwlzaG91bGQgYXQgbGVhc3QgbG9nIHRoZSBlcnJvciBpbiBhIGZpbGUsIGFuZCBhbHNvIGFubm91bmNlIGl0CisJdG8gdGhlIGFjdGl2ZSB1c2VyLgorCitTRUUgQUxTTworCXJ1bnRpbWVfZXJyb3IoTSkKZGlmZiAtLWdpdCBhL2RvYy9tYXN0ZXIvbWFrZV9wYXRoX2Fic29sdXRlIGIvZG9jL21hc3Rlci9tYWtlX3BhdGhfYWJzb2x1dGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBhMDAxOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXN0ZXIvbWFrZV9wYXRoX2Fic29sdXRlCkBAIC0wLDAgKzEsMTAgQEAKK1NZTk9QU0lTCisJc3RyaW5nIG1ha2VfcGF0aF9hYnNvbHV0ZShzdHJpbmcgc3RyKQorCitERVNDUklQVElPTgorCUFic29sdXRpemUgYSByZWxhdGl2ZSBmaWxlbmFtZSBzdHIgZ2l2ZW4gdG8gdGhlIGVkaXRvci4gU2hvdWxkCisJcmV0dXJuIHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBmaWxlIHRvIHVzZS4gQW55IG5vbi1zdHJpbmcKKwlyZXN1bHQgd2lsbCBhY3QgYXMgYGBiYWQgZmlsZSBuYW1lJycuCisKK1NFRSBBTFNPCisJZWQoRSksIHZhbGlkX3dyaXRlKE0pCmRpZmYgLS1naXQgYS9kb2MvbWFzdGVyL21hc3RlciBiL2RvYy9tYXN0ZXIvbWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkODg4NTUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWFzdGVyL21hc3RlcgpAQCAtMCwwICsxLDMwIEBACitOQU1FCisJbWFzdGVyCisKK0RFU0NSSVBUSU9OCisJVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgZGVzY3JpcHRpb25zIGZvciB0aGUgZnVuY3Rpb25zIHRoYXQKKwlBbXlsYWFyJ3MgdmVyc2lvbiBvZiB0aGUgTFBDIHBhcnNlciwgZXhwZWN0cyB0byBmaW5kIGluIHRoZQorCW1hc3RlciBvYmplY3QgKHNpbWlsYXIgdG8gbGZ1bnMsIGJ1dCBmb3IgdGhlIG1hc3RlciBvYmplY3QKKwlvbmx5KS4gVGhlIG5hbWUgb2YgdGhlIG1hc3RlciBvYmplY3QgaXMgaGFyZGNvZGVkIGluIHRoZQorCXBhcnNlciAodG8gInNlY3VyZS9tYXN0ZXIiKS4KKworCVRoZSBtYXN0ZXIgaXMgdGhlIGdhdGV3YXkgYmV0d2VlbiB0aGUgaW50ZXJwcmV0ZXIgYW5kIHRoZQorCW11ZGxpYiB0byBwZXJmb3JtIGFjdGlvbnMgd2l0aCBtdWRsaWIgc3BlY2lmaWMgZWZmZWN0cy4gQ2FsbHMKKwl0byB0aGUgbWFzdGVyIGJ5IHRoZSBpbnRlcnByZXRlciBoYXZlIGFuIGF1dG9tYXRpYyBjYXRjaCgpIGluCisJZWZmZWN0LgorCisJTm90ZSB0aGF0IHRoZSBtYXN0ZXIgaXMgbG9hZGVkIGZpcnN0IG9mIGFsbCBvYmplY3RzLiBUaHVzIHlvdQorCXNob3VsZG4ndCBpbmhlcml0IGFuIG90aGVyIG9iamVjdCwgbm9yIGlzIHRoZSBjb21waWxlciBhYmxlIHRvCisJc2VhcmNoIGluY2x1ZGUgZmlsZXMgKHJlYWQ6IHRoZXkgbXVzdCBiZSBzcGVjaWZpZWQgd2l0aCBmdWxsCisJcGF0aCkuCisKKwlBbXlsYWFyIHNheXM6IGFjdHVhbGx5LCB5b3UgY2FuIGluaGVyaXQsIGJ1dCB0aGUgZmlsZSB3aWxsIGJlCisJbG9hZGVkIHRoZW4gYmVmb3JlIHRoZSBtYXN0ZXIsIHdoaWNoIGlzbid0IGdvb2QgZm9yIG1vc3QKKwlmaWxlcy4KKworCVJlZmVyIHRvICdtYXN0ZXItMy4yJyBhbmQgJ21hc3Rlci0zLjIuMScgZm9yIHRoZSBzdXJ2ZXlzIG9mCisJdGhlIG1hc3RlcnMgaW50ZXJuYWxzLiAKKworU0VFIEFMU08KKwltYXN0ZXItMy4yKE0pLCBtYXN0ZXItMy4yLjEoTSkKKwllZnVuKEUpLCBhcHBsaWVkKEEpLCBjb25jZXB0cyhDKSwgZHJpdmVyKEQpLCBscGMoTFBDKQpkaWZmIC0tZ2l0IGEvZG9jL21hc3Rlci9tYXN0ZXItMy4yIGIvZG9jL21hc3Rlci9tYXN0ZXItMy4yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NWE5MzEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWFzdGVyL21hc3Rlci0zLjIKQEAgLTAsMCArMSwyNDggQEAKK05BTUUKKwltYXN0ZXIgZm9yIExQTXVkIDMuMgorCitERVNDUklQVElPTgorCVRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIGRlc2NyaXB0aW9ucyBmb3IgdGhlIGZ1bmN0aW9ucyB0aGF0CisJQW15bGFhcidzIHZlcnNpb24gb2YgdGhlIExQQyBwYXJzZXIsIGV4cGVjdHMgdG8gZmluZCBpbiB0aGUKKwltYXN0ZXIgb2JqZWN0IChzaW1pbGFyIHRvIGxmdW5zLCBidXQgZm9yIHRoZSBtYXN0ZXIgb2JqZWN0CisJb25seSkuIFRoZSBuYW1lIG9mIHRoZSBtYXN0ZXIgb2JqZWN0IGlzIGhhcmRjb2RlZCBpbiB0aGUKKwlwYXJzZXIgKHRvICJzZWN1cmUvbWFzdGVyIikuCisKKwlUaGUgbWFzdGVyIGlzIHRoZSBnYXRld2F5IGJldHdlZW4gdGhlIGludGVycHJldGVyIGFuZCB0aGUKKwltdWRsaWIgdG8gcGVyZm9ybSBhY3Rpb25zIHdpdGggbXVkbGliIHNwZWNpZmljIGVmZmVjdHMuIENhbGxzCisJdG8gdGhlIG1hc3RlciBieSB0aGUgaW50ZXJwcmV0ZXIgaGF2ZSBhbiBhdXRvbWF0aWMgY2F0Y2goKSBpbgorCWVmZmVjdC4KKworCU5vdGUgdGhhdCB0aGUgbWFzdGVyIGlzIGxvYWRlZCBmaXJzdCBvZiBhbGwgb2JqZWN0cy4gVGh1cyB5b3UKKwlzaG91bGRuJ3QgaW5oZXJpdCBhbiBvdGhlciBvYmplY3QsIG5vciBpcyB0aGUgY29tcGlsZXIgYWJsZSB0bworCXNlYXJjaCBpbmNsdWRlIGZpbGVzIChyZWFkOiB0aGV5IG11c3QgYmUgc3BlY2lmaWVkIHdpdGggZnVsbAorCXBhdGgpLgorCisJQW15bGFhciBzYXlzOiBhY3R1YWxseSwgeW91IGNhbiBpbmhlcml0LCBidXQgdGhlIGZpbGUgd2lsbCBiZQorCWxvYWRlZCB0aGVuIGJlZm9yZSB0aGUgbWFzdGVyLCB3aGljaCBpc24ndCBnb29kIGZvciBtb3N0CisJZmlsZXMuCisKKwlBIHNob3J0IHN1cnZleSBvZiB0aGUgdGhpbmdzIHRoYXQgaGFwcGVuIGF0IHN5c3RlbSBzdGFydHVwCisJdGltZToKKworCVRoZSBJbml0aWFsaXNhdGlvbiBmdW5jdGlvbnMgYXJlIGNhbGxlZCBhZnRlciAocmUpbG9hZGluZyB0aGUKKwltYXN0ZXIgdG8gZXN0YWJsaXNoIHRoZSBtb3N0IGJhc2ljIG9wZXJhdGlvbiBwYXJhbWV0ZXJzLgorCisJVGhlIGluaXRpYWxpc2F0aW9uIG9mIExQTXVkIG9uIHN0YXJ0dXAgZm9sbG93cyB0aGlzIHNjaGVkdWxlOgorCSAgLSBUaGUgaW50ZXJwcmV0ZXIgZXZhbHVhdGVzIHRoZSBjb21tYW5kbGluZSBvcHRpb25zIGFuZAorCSAgICBpbml0aWFsaXplcyBpdHNlbGYuCisJICAtIFRoZSBtYXN0ZXIgaXMgbG9hZGVkLCBhbmQgdGh1cyBpdCdzIGNyZWF0ZSgpICghY29tcGF0IG9ubHkpIGFuZAorCSAgICBpdHMgcmVzZXQoKSBpcyBjYWxsZWQsIHRob3VnaCBpdCdzIG5vdCBtdWNoIHVzZSwgc2luY2UKKwkgICAgbW9zdCBvZiB0aGUgaW1wb3J0YW50IHRoaW5ncyB3b24ndCB3b3JrIGFscmVhZHkuCisJICAtIGdldF9yb290X3VpZCgpIGlzIGNhbGxlZC4gSWYgdGhlIHJlc3VsdCBpcyB2YWxpZCwgaXQKKwkgICAgYmVjb21lcyB0aGUgbWFzdGVycyB1aWQgYW5kIGV1aWQuCisJICAtIGdldF9iYl91aWQoKSBpcyBjYWxsZWQuCisJICAtIGluYXVndXJhdGVfbWFzdGVyKCkgaXMgY2FsbGVkLgorCSAgLSBmbGFnKCkgaXMgY2FsbGVkIGZvciBlYWNoIGdpdmVuICctZicgY29tbWFuZGxpbmUgb3B0aW9uLgorCSAgLSBnZXRfc2ltdWxfZWZ1bigpIGlzIGNhbGxlZC4KKwkgIC0gZGVmaW5lX2luY2x1ZGVfZGlycygpIGlzIGNhbGxlZC4KKwkgIC0gUHJlbG9hZGluZyBpcyBkb25lOgorCSAgICAgIGNvbXBhdCA6IFRoZSBmaWxlbmFtZXMgb2YgdGhlIG9iamVjdHMgYXJlIHJlYWQgZnJvbQorCQkgICAgICAgSU5JVF9GSUxFIGFuZCB0aGUgb2JqZWN0cyBhcmUgbG9hZGVkLiBUaGVuCisJCSAgICAgICBlcGlsb2coKSBpcyBjYWxsZWQuCisJICAgICAgIWNvbXBhdDogZXBpbG9nKCkgaXMgY2FsbGVkLiBJZiBpdCByZXR1cm5zIGFuIGFycmF5IG9mCisJCSAgICAgICBzdHJpbmdzLCBpdCBpcyBjb25zaWRlcmVkIGhvbGRpbmcgdGhlIGZpbGVuYW1lcworCQkgICAgICAgb2YgdGhlIG9iamVjdHMgdG8gcHJlbG9hZC4gVGhleSBhcmUgdGhlbiBnaXZlbgorCQkgICAgICAgb25lIGF0IGEgdGltZSBhcyBhcmd1bWVudCB0byBwcmVsb2FkKCkgd2hpY2gKKwkJICAgICAgIGRvZXMgdGhlIGFjdHVhbCBwcmVsb2FkaW5nLgorCSAgLSBUaGUgaW50ZXJwcmV0ZXIgc2V0cyB1cCB0aGUgSVAgY29tbXVuaWNhdGlvbiBhbmQgZW50ZXJzCisJICAgIHRoZSBiYWNrZW5kIGxvb3AuCisKKwlJZiB0aGUgbWFzdGVyIGlzIHJlbG9hZGVkIGR1cmluZyBzeXN0ZW0gb3BlcmF0aW9uLCB0aGlzCisJYWN0aW9ucyBhcmUgdGFrZW46CisJICAtIFRoZSBtYXN0ZXIgaXMgbG9hZGVkLCBhbmQgdGh1cyBpdCdzIGNyZWF0ZSgpICghY29tcGF0IG9ubHkpIGFuZAorCSAgICBpdHMgcmVzZXQoKSBpcyBjYWxsZWQuCisJICAtIEFueSBhdXRvLWluY2x1ZGUgc3RyaW5nIGlzIGNsZWFyZWQuCisJICAtIGdldF9yb290X3VpZCgpIGlzIGNhbGxlZC4gSWYgdGhlIHJlc3VsdCBpcyB2YWxpZCwgaXQgYmVjb21lcyB0aGUKKwkgICAgbWFzdGVycyB1aWQgYW5kIGV1aWQuCisJICAtIGluYXVndXJhdGVfbWFzdGVyKCkgaXMgY2FsbGVkLgorCisJSWYgdGhlIG1hc3RlciB3YXMgZGVzdHJ1Y3RlZCwgYnV0IGNvdWxkbid0IGJlIHJlbG9hZGVkLCB0aGUgb2xkCisJbWFzdGVyIG9iamVjdCBjb3VsZCBiZSByZWFjdGl2YXRlZC4gSW4gdGhhdCBjYXNlOgorCSAgLSByZWFjdGl2YXRlX2Rlc3RydWN0ZWRfbWFzdGVyKCkgaXMgY2FsbGVkLgorCSAgLSBpbmF1Z3VyYXRlX21hc3RlcigpIGlzIGNhbGxlZC4KKworCisJU2VjdXJpdHkgaGludDogbW9zdCBvZiB0aGlzIGZ1bmN0aW9ucyBhcmUgbm90IHVzZWZ1bCB0byBiZQorCWNhbGxlZCBkaXJlY3RseSBmcm9tIG90aGVyIG9iamVjdHMgYW5kIGNhbiBiZSBtYWRlIHByaXZhdGUgb3IKKwlzdGF0aWMuIFVubGlrZSBjcmVhdGUoKSwgdGhlc2UgZnVuY3Rpb25zIHRoYXQgYXJlIGFwcGxpZWQgdG8KKwl0aGUgbWFzdGVyIG9iamVjdCBhcmUgZm91bmQgYnkgdGhlIGludGVycHJldGVyIGV2ZW4gaWYgbm90CisJcHVibGljbHkgYWNjZXNzaWJsZS4KKworCisKKwlBIHNob3J0IHJlZmVyZW5jZSB0byBhbGwgZXhwZWN0ZWQgbWFzdGVyIGZ1bmN0aW9ucy4uLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgICAgSW5pdGlhbGlzYXRpb24KKworCXZvaWQgY3JlYXRlICgpCS8vICFjb21wYXQKKwkgIEluaXRpYWxpemUgdGhlIG9iamVjdC4gTm90IHZlcnkgdXNlZnVsLCB0aG91Z2guCisKKwl2b2lkIHJlc2V0IChpbnQgZmxhZykgIC8vICFuYXRpdmUKKwl2b2lkIHJlc2V0ICgpCSAgICAgICAvLyBuYXRpdmUKKwkgIEluaXRpYWxpemUgKGNvbXBhdCBvbmx5KSBvciByZXNldCB0aGUgb2JqZWN0LgorCisJdm9pZCBpbmF1Z3VyYXRlX21hc3RlciAoKQorCSAgUGVyZm9ybSBtdWRsaWIgc3BlY2lmaWMgc2V0dXAgb2YgdGhlIG1hc3Rlci4KKworCXZvaWQgZmxhZyAoc3RyaW5nIGFyZykKKwkgIEV2YWx1YXRlIGFuIGFyZ3VtZW50IGdpdmVuIGFzIG9wdGlvbiAnLWYnIHRvIHRoZSBkcml2ZXIuCisKKwlzdHJpbmcgKmRlZmluZV9pbmNsdWRlX2RpcnMgKCkKKwkgIERlZmluZSB3aGVyZSB0aGUgaW5jbHVkZSBmaWxlcyBhcmUgc2VhcmNoZWQuCisKKwl2b2lkCWVwaWxvZyAoKQkgICAgLy8gY29tcGF0CisJc3RyaW5nICplcGlsb2cgKGludCBlZmxhZykgIC8vICFjb21wYXQKKwkgIFBlcmZvcm0gZmluYWwgYWN0aW9ucyBiZWZvcmUgb3BlbmluZyB0aGUgc3lzdGVtIHRvIHVzZXJzLgorCSAgVGhlIHNlbWFudGljcyBvZiB0aGlzIGZ1bmN0aW9uIGRpZmZlciBmb3IgY29tcGF0IGFuZCAhY29tcGF0IG1vZGUuCisKKwl2b2lkIHByZWxvYWQgKHN0cmluZyBmaWxlKSAgLy8gIWNvbXBhdAorCSAgUHJlbG9hZCBhIGdpdmVuIG9iamVjdC4KKworCXZvaWQgZXh0ZXJuYWxfbWFzdGVyX3JlbG9hZCAoKQorCSAgQ2FsbGVkIGFmdGVyIGEgcmVsb2FkIG9mIHRoZSBtYXN0ZXIgb24gZXh0ZXJuYWwgcmVxdWVzdC4KKworCXZvaWQgcmVhY3RpdmF0ZV9kZXN0cnVjdGVkX21hc3RlciAoaW50IHJlbW92ZWQpCisJICBSZWFjdGl2YXRlIGEgZm9ybWVybHkgZGVzdHJ1Y3RlZCBtYXN0ZXIuCisKKwlzdHJpbmd8c3RyaW5nICogZ2V0X3NpbXVsX2VmdW4gKCkKKwkgIExvYWQgdGhlIHNpbXVsX2VmdW4gb2JqZWN0IGFuZCByZXR1cm4gb25lIG9yIG1vcmUgcGF0aHMgb2YgaXQuCisKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICAgIEhhbmRsaW5nIG9mIHVzZXIgY29ubmVjdGlvbnMKKworCW9iamVjdCBjb25uZWN0ICgpCisJICBIYW5kbGUgdGhlIHJlcXVlc3QgZm9yIGEgbmV3IGNvbm5lY3Rpb24uCisKKwl2b2lkIGRpc2Nvbm5lY3QgKG9iamVjdCBvYmopCisJICBIYW5kbGUgdGhlIGxvc3Mgb2YgYW4gSVAgY29ubmVjdGlvbi4KKworCXZvaWQgcmVtb3ZlX3BsYXllciAob2JqZWN0IHVzZXIpCisJICBSZW1vdmUgYSB1c2VyIG9iamVjdCBmcm9tIHRoZSBzeXN0ZW0uCisKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAgICBSdW50aW1lIFN1cHBvcnQKKworCW9iamVjdCBjb21waWxlX29iamVjdCAoc3RyaW5nIGZpbGVuYW1lKQorCSAgQ29tcGlsZSBhbiB2aXJ0dWFsIG9iamVjdC4KKworCXN0cmluZyBnZXRfd2l6X25hbWUgKHN0cmluZyBmaWxlKQorCSAgUmV0dXJuIHRoZSBhdXRob3Igb2YgYSBmaWxlLgorCisJc3RyaW5nIG9iamVjdF9uYW1lIChvYmplY3Qgb2JqKQorCSAgUmV0dXJuIGEgcHJpbnRhYmxlIG5hbWUgZm9yIGFuIG9iamVjdC4KKworCW1peGVkIHByZXBhcmVfZGVzdHJ1Y3QgKG9iamVjdCBvYmopCisJICBQcmVwYXJlIHRoZSBkZXN0cnVjdGlvbiBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgorCisJdm9pZCBxdW90YV9kZW1vbiAodm9pZCkKKwkgIEhhbmRsZSBxdW90YXMgaW4gdGltZXMgb2YgbWVtb3J5IHNob3J0YWdlLgorCisJdm9pZCByZWNlaXZlX3VkcCAoc3RyaW5nIGhvc3QsIHN0cmluZyBtc2cpCisJICBIYW5kbGUgYSByZWNlaXZlZCBJTVAgbWVzc2FnZS4KKworCXZvaWQgc2xvd19zaHV0X2Rvd24gKGludCBtaW51dGVzKQorCSAgU2NoZWR1bGUgYSBzaHV0ZG93biBmb3IgdGhlIG5lYXIgZnV0dXJlLgorCisJdm9pZCBub3RpZnlfc2h1dGRvd24gKCkKKwkgIE5vdGlmeSB0aGUgbWFzdGVyIGFib3V0IGFuIGltbWVkaWF0ZSBzaHV0ZG93bi4KKworCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICAgIEVycm9yIEhhbmRsaW5nCisKKwl2b2lkIGRhbmdsaW5nX2xmdW5fY2xvc3VyZSAoKQorCSAgSGFuZGxlIGEgZGFuZ2xpbmcgbGZ1bi1jbG9zdXJlLgorCisJdm9pZCBsb2dfZXJyb3IgKHN0cmluZyBmaWxlLCBzdHJpbmcgZXJyKQorCSAgQW5ub3VuY2UgYSBjb21waWxlci10aW1lIGVycm9yLgorCisJbWl4ZWQgaGVhcnRfYmVhdF9lcnJvciAob2JqZWN0IGN1bHByaXQsIHN0cmluZyBlcnIsCisJCQkJc3RyaW5nIHByZywgc3RyaW5nIGN1cm9iaiwgaW50IGxpbmUpCisJICBBbm5vdW5jZSBhbiBlcnJvciBpbiB0aGUgaGVhcnRfYmVhdCgpIGZ1bmN0aW9uLgorCisJdm9pZCBydW50aW1lX2Vycm9yIChzdHJpbmcgZXJyLCBzdHJpbmcgcHJnLCBzdHJpbmcgY3Vyb2JqLCBpbnQgbGluZSkKKwkgIEFubm91bmNlIGEgcnVudGltZSBlcnJvci4KKworCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICAgIFNlY3VyaXR5IGFuZCBQZXJtaXNzaW9ucworCisJaW50IHByaXZpbGVnZV92aW9sYXRpb24gKHN0cmluZyBvcCwgbWl4ZWQgd2hvLCBtaXhlZCBhcmczLCBtaXhlZCBhcmc0KQorCSAgVmFsaWRhdGUgdGhlIGV4ZWN1dGlvbiBvZiBhIHByaXZpbGVnZWQgb3BlcmF0aW9uLgorCisJaW50IHF1ZXJ5X2FsbG93X3NoYWRvdyAob2JqZWN0IHZpY3RpbSkKKwkgIFZhbGlkYXRlIGEgc2hhZG93aW5nLgorCisJaW50IHF1ZXJ5X3BsYXllcl9sZXZlbCAoc3RyaW5nIHdoYXQpCisJICBDaGVjayBpZiB0aGUgdXNlciBpcyBvZiBoaWdoIGVub3VnaCBsZXZlbCBmb3Igc2V2ZXJhbCB0aGluZ3MuCisKKwlpbnQgdmFsaWRfZXhlYyAoc3RyaW5nIG5hbWUpCisJICBWYWxpZGF0ZSB0aGUgcmViaW5kaW5nIG9mIGFuIElQIGNvbm5lY3Rpb24gYnkgdXNhZ2Ugb2YgZWZ1bgorCSAgZXhlYygpLgorCisJaW50IHZhbGlkX3F1ZXJ5X3Nub29wIChvYmplY3Qgb2JqKQorCSAgVmFsaWRhdGUgaWYgdGhlIHNub29wZXJzIG9mIGFuIG9iamVjdCBtYXkgYmUgcmV2ZWFsZWQgYnkKKwkgIHVzYWdlIG9mIHRoZSBlZnVuIHF1ZXJ5X3Nub29wKCkuCisKKwlpbnQgdmFsaWRfc25vb3AgKG9iamVjdCBzbm9vcGVlLCBvYmplY3Qgc25vb3BlcikKKwkgIFZhbGlkYXRlIHRoZSBzdGFydC9zdG9wIG9mIGEgc25vb3AuCisKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgICAgVXNlcmlkcyBhbmQgZGVwZW5kaW5nIFNlY3VyaXR5CisKKwlzdHJpbmcgY3JlYXRvcl9maWxlIChtaXhlZCBvYmopCisJICBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNyZWF0b3Igb2YgYW4gb2JqZWN0LgorCSAgVGhpcyBpcyBjYWxsZWQgaW4gZXZlcnkgbW9kZSEKKworCXN0cmluZyBnZXRfcm9vdF91aWQgKCkJLy8gIWNvbXBhdAorCSAgUmV0dXJuIHRoZSBzdHJpbmcgdG8gYmUgdXNlZCBhcyByb290LXVpZC4KKworCXN0cmluZyBnZXRfYmJfdWlkKCkgIC8vICFjb21wYXQKKwkgIFJldHVybiB0aGUgc3RyaW5nIHRvIGJlIHVzZWQgYXMgcm9vdC11aWQuCisKKwlpbnQgdmFsaWRfc2V0ZXVpZCAob2JqZWN0IG9iaiwgc3RyaW5nIG5ld2V1aWQpCS8vICFjb21wYXQKKwkgIFZhbGlkYXRlIHRoZSBjaGFuZ2Ugb2YgYW4gb2JqZWN0cyBldWlkIGJ5IGVmdW4gc2V0ZXVpZCgpLgorCisJaW50fHN0cmluZyB2YWxpZF9yZWFkIChzdHJpbmcgcGF0aCwgc3RyaW5nIGV1aWQsIHN0cmluZyBmdW4sIG9iamVjdCBjYWxsZXIpCisJaW50fHN0cmluZyB2YWxpZF93cml0ZSAoc3RyaW5nIHBhdGgsIHN0cmluZyBldWlkLCBzdHJpbmcgZnVuLCBvYmplY3QgY2FsbGVyKQorCSAgVmFsaWRhdGUgYSByZWFkaW5nL3dyaXRpbmcgZmlsZSBvcGVyYXRpb24uCisKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAgICBlZCgpIFN1cHBvcnQKKworCXN0cmluZyBtYWtlX3BhdGhfYWJzb2x1dGUgKHN0cmluZyBzdHIpCisJICBBYnNvbHV0aXplIGEgcmVsYXRpdmUgZmlsZW5hbWUgZ2l2ZW4gdG8gdGhlIGVkaXRvci4KKworCWludCBzYXZlX2VkX3NldHVwIChvYmplY3Qgd2hvLCBpbnQgY29kZSkKKwkgIFNhdmUgaW5kaXZpZHVhbCBzZXR0aW5ncyBvZiBlZCBmb3IgYSB3aXphcmQuCisKKwlpbnQgcmV0cmlldmVfZWRfc2V0dXAgKG9iamVjdCB3aG8pCisJICBSZXRyaWV2ZSBpbmRpdmlkdWFsIHNldHRpbmdzIG9mIGVkIGZvciBhIHdpemFyZC4KKworCXN0cmluZyBnZXRfZWRfYnVmZmVyX3NhdmVfb2JqZWN0X25hbWUgKHN0cmluZyBmaWxlKQorCSAgUmV0dXJuIGEgZmlsZW5hbWUgZm9yIHRoZSBlZCBidWZmZXIgdG8gYmUgc2F2ZWQgaW50by4KKworCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgICAgcGFyc2VfY29tbWFuZCgpIFN1cHBvcnQgICghY29tcGF0KQorCisJc3RyaW5nICpwYXJzZV9jb21tYW5kX2lkX2xpc3QgKCkKKwkgIFJldHVybiBnZW5lcmljIHNpbmd1bGFyIGlkcy4KKworCXN0cmluZyAqcGFyc2VfY29tbWFuZF9wbHVyYWxfaWRfbGlzdCAoKQorCSAgUmV0dXJuIGdlbmVyaWMgcGx1cmFsIGlkcy4KKworCXN0cmluZyAqcGFyc2VfY29tbWFuZF9hZGplY3Rpdl9pZF9saXN0ICgpCisJICBSZXR1cm4gZ2VuZXJpYyBhZGplY3RpdmUgaWRzLgorCisJc3RyaW5nICpwYXJzZV9jb21tYW5kX3ByZXBvc19saXN0ICgpCisJICBSZXR1cm4gY29tbW9uIHByZXBvc2l0aW9ucy4KKworCXN0cmluZyBwYXJzZV9jb21tYW5kX2FsbF93b3JkKCkKKwkgIFJldHVybiB0aGUgb25lKCEpICdhbGwnIHdvcmQuCisKK1NFRSBBTFNPCisJbWFzdGVyKE0pLCBlZnVuKEUpLCBhcHBsaWVkKEEpLCBjb25jZXB0cyhDKSwgZHJpdmVyKEQpLCBscGMoTFBDKQpkaWZmIC0tZ2l0IGEvZG9jL21hc3Rlci9tYXN0ZXItMy4yLjEgYi9kb2MvbWFzdGVyL21hc3Rlci0zLjIuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2U0MzM5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hc3Rlci9tYXN0ZXItMy4yLjEKQEAgLTAsMCArMSwyMzEgQEAKK05BTUUKKwltYXN0ZXIgZm9yIExQTXVkIDMuMi4xCisKK0RFU0NSSVBUSU9OCisJVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgZGVzY3JpcHRpb25zIGZvciB0aGUgZnVuY3Rpb25zIHRoYXQKKwlBbXlsYWFyJ3MgdmVyc2lvbiBvZiB0aGUgTFBDIHBhcnNlciwgZXhwZWN0cyB0byBmaW5kIGluIHRoZQorCW1hc3RlciBvYmplY3QgKHNpbWlsYXIgdG8gbGZ1bnMsIGJ1dCBmb3IgdGhlIG1hc3RlciBvYmplY3QKKwlvbmx5KS4gVGhlIG5hbWUgb2YgdGhlIG1hc3RlciBvYmplY3QgaXMgaGFyZGNvZGVkIGluIHRoZQorCXBhcnNlciAodG8gInNlY3VyZS9tYXN0ZXIiKS4KKworCVRoZSBtYXN0ZXIgaXMgdGhlIGdhdGV3YXkgYmV0d2VlbiB0aGUgaW50ZXJwcmV0ZXIgYW5kIHRoZQorCW11ZGxpYiB0byBwZXJmb3JtIGFjdGlvbnMgd2l0aCBtdWRsaWIgc3BlY2lmaWMgZWZmZWN0cy4gQ2FsbHMKKwl0byB0aGUgbWFzdGVyIGJ5IHRoZSBpbnRlcnByZXRlciBoYXZlIGFuIGF1dG9tYXRpYyBjYXRjaCgpIGluCisJZWZmZWN0LgorCisJTm90ZSB0aGF0IHRoZSBtYXN0ZXIgaXMgbG9hZGVkIGZpcnN0IG9mIGFsbCBvYmplY3RzLiBUaHVzIHlvdQorCXNob3VsZG4ndCBpbmhlcml0IGFuIG90aGVyIG9iamVjdCwgbm9yIGlzIHRoZSBjb21waWxlciBhYmxlIHRvCisJc2VhcmNoIGluY2x1ZGUgZmlsZXMgKHJlYWQ6IHRoZXkgbXVzdCBiZSBzcGVjaWZpZWQgd2l0aCBmdWxsCisJcGF0aCkuCisKKwlBbXlsYWFyIHNheXM6IGFjdHVhbGx5LCB5b3UgY2FuIGluaGVyaXQsIGJ1dCB0aGUgZmlsZSB3aWxsIGJlCisJbG9hZGVkIHRoZW4gYmVmb3JlIHRoZSBtYXN0ZXIsIHdoaWNoIGlzbid0IGdvb2QgZm9yIG1vc3QKKwlmaWxlcy4KKworCUEgc2hvcnQgc3VydmV5IG9mIHRoZSB0aGluZ3MgdGhhdCBoYXBwZW4gYXQgc3lzdGVtIHN0YXJ0dXAKKwl0aW1lOgorCisJVGhlIEluaXRpYWxpc2F0aW9uIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIGFmdGVyIChyZSlsb2FkaW5nIHRoZQorCW1hc3RlciB0byBlc3RhYmxpc2ggdGhlIG1vc3QgYmFzaWMgb3BlcmF0aW9uIHBhcmFtZXRlcnMuCisKKwlUaGUgaW5pdGlhbGlzYXRpb24gb2YgTFBNdWQgb24gc3RhcnR1cCBmb2xsb3dzIHRoaXMgc2NoZWR1bGU6CisJICAtIFRoZSBpbnRlcnByZXRlciBldmFsdWF0ZXMgdGhlIGNvbW1hbmRsaW5lIG9wdGlvbnMgYW5kCisJICAgIGluaXRpYWxpemVzIGl0c2VsZi4KKwkgIC0gVGhlIG1hc3RlciBpcyBsb2FkZWQsIGJ1dCBzaW5jZSB0aGUgZHJpdmVyaG9va3MgYXJlIG5vdCBzZXQgeWV0LAorCSAgICBubyBzdGFuZGFyZCBpbml0aWFsaXNhdGlvbiBsZnVuIGlzIGNhbGxlZC4KKwkgIC0gZ2V0X21hc3Rlcl91aWQoKSBpcyBjYWxsZWQuIElmIHRoZSByZXN1bHQgaXMgdmFsaWQsIGl0IGJlY29tZXMgdGhlCisJICAtIGluYXVndXJhdGVfbWFzdGVyKCkgaXMgY2FsbGVkLgorCSAgLSBmbGFnKCkgaXMgY2FsbGVkIGZvciBlYWNoIGdpdmVuICctZicgY29tbWFuZGxpbmUgb3B0aW9uLgorCSAgLSBnZXRfc2ltdWxfZWZ1bigpIGlzIGNhbGxlZC4KKwkgIC0gdGhlIFdJWkxJU1QgaXMgcmVhZCBpbi4KKwkgIC0gZXBpbG9nKCkgaXMgY2FsbGVkLiBJZiBpdCByZXR1cm5zIGFuIGFycmF5IG9mIHN0cmluZ3MsCisJICAgIHRoZXkgYXJlIGdpdmVuIG9uZSBhdCBhIHRpbWUgYXMgYXJndW1lbnQgdG8gcHJlbG9hZCgpLgorCSAgICBUcmFkaXRpb25hbGx5LCB0aGVzZSBzdHJpbmdzIGFyZSB0aGUgZmlsZW5hbWVzIG9mIHRoZSBvYmplY3RzIHRvCisJICAgIHByZWxvYWQsIHdoaWNoIHByZWxvYWQoKSB0aGVuIGRvZXMuCisJICAtIFRoZSBpbnRlcnByZXRlciBzZXRzIHVwIHRoZSBJUCBjb21tdW5pY2F0aW9uIGFuZCBlbnRlcnMKKwkgICAgdGhlIGJhY2tlbmQgbG9vcC4KKworCUlmIHRoZSBtYXN0ZXIgaXMgcmVsb2FkZWQgZHVyaW5nIHN5c3RlbSBvcGVyYXRpb24sIHRoaXMKKwlhY3Rpb25zIGFyZSB0YWtlbjoKKwkgIC0gVGhlIG1hc3RlciBpcyBsb2FkZWQsIGFuZCBpdHMgaW5pdGlhbGlzYXRpb24gbGZ1biBpcworCSAgICBjYWxsZWQgYWNjb3JkaW5nIHRvIHRoZSBzZXR0aW5ncyBvZiB0aGUgZHJpdmVyaG9va3MgKGlmIHNldCkuCisJICAtIEFueSBhdXRvLWluY2x1ZGUgc3RyaW5nIGFuZCBhbGwgZHJpdmVyaG9va3MgYXJlIGNsZWFyZWQuCisJICAtIGdldF9tYXN0ZXJfdWlkKCkgaXMgY2FsbGVkLiBJZiB0aGUgcmVzdWx0IGlzIHZhbGlkLCBpdCBiZWNvbWVzIHRoZQorCSAgICBtYXN0ZXJzIHVpZCBhbmQgZXVpZC4KKwkgIC0gaW5hdWd1cmF0ZV9tYXN0ZXIoKSBpcyBjYWxsZWQuCisKKwlJZiB0aGUgbWFzdGVyIHdhcyBkZXN0cnVjdGVkLCBidXQgY291bGRuJ3QgYmUgcmVsb2FkZWQsIHRoZSBvbGQKKwltYXN0ZXIgb2JqZWN0IGNvdWxkIGJlIHJlYWN0aXZhdGVkLiBJbiB0aGF0IGNhc2U6CisJICAtIHJlYWN0aXZhdGVfZGVzdHJ1Y3RlZF9tYXN0ZXIoKSBpcyBjYWxsZWQuCisJICAtIGluYXVndXJhdGVfbWFzdGVyKCkgaXMgY2FsbGVkLgorCisKKwlTZWN1cml0eSBoaW50OiBtb3N0IG9mIHRoaXMgZnVuY3Rpb25zIGFyZSBub3QgdXNlZnVsIHRvIGJlCisJY2FsbGVkIGRpcmVjdGx5IGZyb20gb3RoZXIgb2JqZWN0cyBhbmQgY2FuIGJlIG1hZGUgcHJpdmF0ZSBvcgorCXN0YXRpYy4gVW5saWtlIGNyZWF0ZSgpLCB0aGVzZSBmdW5jdGlvbnMgdGhhdCBhcmUgYXBwbGllZCB0bworCXRoZSBtYXN0ZXIgb2JqZWN0IGFyZSBmb3VuZCBieSB0aGUgaW50ZXJwcmV0ZXIgZXZlbiBpZiBub3QKKwlwdWJsaWNseSBhY2Nlc3NpYmxlLgorCisKKworCUEgc2hvcnQgcmVmZXJlbmNlIHRvIGFsbCBleHBlY3RlZCBtYXN0ZXIgZnVuY3Rpb25zLi4uCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAgICBJbml0aWFsaXNhdGlvbgorCisJdm9pZCBpbmF1Z3VyYXRlX21hc3RlciAoKQorCSAgUGVyZm9ybSBtdWRsaWIgc3BlY2lmaWMgc2V0dXAgb2YgdGhlIG1hc3Rlci4KKworCXN0cmluZyBnZXRfbWFzdGVyX3VpZCAoKQorCSAgUmV0dXJuIHRoZSBzdHJpbmcgdG8gYmUgdXNlZCBhcyB1aWQgKGFuZCAtZXVpZCkgb2YgYQorCSAgKHJlKWxvYWRlZCBtYXN0ZXIuIAorCisJdm9pZCBmbGFnIChzdHJpbmcgYXJnKQorCSAgRXZhbHVhdGUgYW4gYXJndW1lbnQgZ2l2ZW4gYXMgb3B0aW9uICctZicgdG8gdGhlIGRyaXZlci4KKworCXN0cmluZyAqZGVmaW5lX2luY2x1ZGVfZGlycyAoKQorCSAgRGVmaW5lIHdoZXJlIHRoZSBpbmNsdWRlIGZpbGVzIGFyZSBzZWFyY2hlZC4KKworCXN0cmluZyAqZXBpbG9nIChpbnQgZWZsYWcpCisJICBQZXJmb3JtIGZpbmFsIGFjdGlvbnMgYmVmb3JlIG9wZW5pbmcgdGhlIHN5c3RlbSB0byB1c2Vycy4KKworCXZvaWQgcHJlbG9hZCAoc3RyaW5nIGZpbGUpCisJICBQcmVsb2FkIGEgZ2l2ZW4gb2JqZWN0LgorCisJdm9pZCBleHRlcm5hbF9tYXN0ZXJfcmVsb2FkICgpCisJICBDYWxsZWQgYWZ0ZXIgYSByZWxvYWQgb2YgdGhlIG1hc3RlciBvbiBleHRlcm5hbCByZXF1ZXN0LgorCisJdm9pZCByZWFjdGl2YXRlX2Rlc3RydWN0ZWRfbWFzdGVyIChpbnQgcmVtb3ZlZCkKKwkgIFJlYWN0aXZhdGUgYSBmb3JtZXJseSBkZXN0cnVjdGVkIG1hc3Rlci4KKworCXN0cmluZ3xzdHJpbmcgKiBnZXRfc2ltdWxfZWZ1biAoKQorCSAgTG9hZCB0aGUgc2ltdWxfZWZ1biBvYmplY3QgYW5kIHJldHVybiBvbmUgb3IgbW9yZSBwYXRocyBvZiBpdC4KKworCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgICAgSGFuZGxpbmcgb2YgdXNlciBjb25uZWN0aW9ucworCisJb2JqZWN0IGNvbm5lY3QgKCkKKwkgIEhhbmRsZSB0aGUgcmVxdWVzdCBmb3IgYSBuZXcgY29ubmVjdGlvbi4KKworCXZvaWQgZGlzY29ubmVjdCAob2JqZWN0IG9iaikKKwkgIEhhbmRsZSB0aGUgbG9zcyBvZiBhbiBJUCBjb25uZWN0aW9uLgorCisJdm9pZCByZW1vdmVfcGxheWVyIChvYmplY3QgdXNlcikKKwkgIFJlbW92ZSBhIHVzZXIgb2JqZWN0IGZyb20gdGhlIHN5c3RlbS4KKworCXZvaWQgc3RhbGVfZXJxIChjbG9zdXJlIGNhbGxiYWNrKQorCSAgTm90aWZ5IHRoZSBsb3NzIG9mIHRoZSBlcnEgZGVtb24uCisKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAgICBSdW50aW1lIFN1cHBvcnQKKworCW9iamVjdCBjb21waWxlX29iamVjdCAoc3RyaW5nIGZpbGVuYW1lKQorCSAgQ29tcGlsZSBhbiB2aXJ0dWFsIG9iamVjdC4KKworCXN0cmluZyBnZXRfd2l6X25hbWUgKHN0cmluZyBmaWxlKQorCSAgUmV0dXJuIHRoZSBhdXRob3Igb2YgYSBmaWxlLgorCisJc3RyaW5nIG9iamVjdF9uYW1lIChvYmplY3Qgb2JqKQorCSAgUmV0dXJuIGEgcHJpbnRhYmxlIG5hbWUgZm9yIGFuIG9iamVjdC4KKworCW1peGVkIHByZXBhcmVfZGVzdHJ1Y3QgKG9iamVjdCBvYmopCisJICBQcmVwYXJlIHRoZSBkZXN0cnVjdGlvbiBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgorCisJdm9pZCBxdW90YV9kZW1vbiAodm9pZCkKKwkgIEhhbmRsZSBxdW90YXMgaW4gdGltZXMgb2YgbWVtb3J5IHNob3J0YWdlLgorCisJdm9pZCByZWNlaXZlX3VkcCAoc3RyaW5nIGhvc3QsIHN0cmluZyBtc2csIGludCBwb3J0KQorCSAgSGFuZGxlIGEgcmVjZWl2ZWQgSU1QIG1lc3NhZ2UuCisKKwl2b2lkIHNsb3dfc2h1dF9kb3duIChpbnQgbWludXRlcykKKwkgIFNjaGVkdWxlIGEgc2h1dGRvd24gZm9yIHRoZSBuZWFyIGZ1dHVyZS4KKworCXZvaWQgbm90aWZ5X3NodXRkb3duICgpCisJICBOb3RpZnkgdGhlIG1hc3RlciBhYm91dCBhbiBpbW1lZGlhdGUgc2h1dGRvd24uCisKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAgICBFcnJvciBIYW5kbGluZworCisJdm9pZCBkYW5nbGluZ19sZnVuX2Nsb3N1cmUgKCkKKwkgIEhhbmRsZSBhIGRhbmdsaW5nIGxmdW4tY2xvc3VyZS4KKworCXZvaWQgbG9nX2Vycm9yIChzdHJpbmcgZmlsZSwgc3RyaW5nIGVycikKKwkgIEFubm91bmNlIGEgY29tcGlsZXItdGltZSBlcnJvci4KKworCW1peGVkIGhlYXJ0X2JlYXRfZXJyb3IgKG9iamVjdCBjdWxwcml0LCBzdHJpbmcgZXJyLAorCQkJCXN0cmluZyBwcmcsIHN0cmluZyBjdXJvYmosIGludCBsaW5lKQorCSAgQW5ub3VuY2UgYW4gZXJyb3IgaW4gdGhlIGhlYXJ0X2JlYXQoKSBmdW5jdGlvbi4KKworCXZvaWQgcnVudGltZV9lcnJvciAoc3RyaW5nIGVyciwgc3RyaW5nIHByZywgc3RyaW5nIGN1cm9iaiwgaW50IGxpbmUpCisJICBBbm5vdW5jZSBhIHJ1bnRpbWUgZXJyb3IuCisKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAgICBTZWN1cml0eSBhbmQgUGVybWlzc2lvbnMKKworCWludCBwcml2aWxlZ2VfdmlvbGF0aW9uIChzdHJpbmcgb3AsIG1peGVkIHdobywgbWl4ZWQgYXJnMywgbWl4ZWQgYXJnNCkKKwkgIFZhbGlkYXRlIHRoZSBleGVjdXRpb24gb2YgYSBwcml2aWxlZ2VkIG9wZXJhdGlvbi4KKworCWludCBxdWVyeV9hbGxvd19zaGFkb3cgKG9iamVjdCB2aWN0aW0pCisJICBWYWxpZGF0ZSBhIHNoYWRvd2luZy4KKworCWludCBxdWVyeV9wbGF5ZXJfbGV2ZWwgKHN0cmluZyB3aGF0KQorCSAgQ2hlY2sgaWYgdGhlIHVzZXIgaXMgb2YgaGlnaCBlbm91Z2ggbGV2ZWwgZm9yIHNldmVyYWwgdGhpbmdzLgorCisJaW50IHZhbGlkX2V4ZWMgKHN0cmluZyBuYW1lKQorCSAgVmFsaWRhdGUgdGhlIHJlYmluZGluZyBvZiBhbiBJUCBjb25uZWN0aW9uIGJ5IHVzYWdlIG9mIGVmdW4KKwkgIGV4ZWMoKS4KKworCWludCB2YWxpZF9xdWVyeV9zbm9vcCAob2JqZWN0IG9iaikKKwkgIFZhbGlkYXRlIGlmIHRoZSBzbm9vcGVycyBvZiBhbiBvYmplY3QgbWF5IGJlIHJldmVhbGVkIGJ5CisJICB1c2FnZSBvZiB0aGUgZWZ1biBxdWVyeV9zbm9vcCgpLgorCisJaW50IHZhbGlkX3Nub29wIChvYmplY3Qgc25vb3BlZSwgb2JqZWN0IHNub29wZXIpCisJICBWYWxpZGF0ZSB0aGUgc3RhcnQvc3RvcCBvZiBhIHNub29wLgorCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICAgIFVzZXJpZHMgYW5kIGRlcGVuZGluZyBTZWN1cml0eQorCisJc3RyaW5nIGdldF9iYl91aWQoKSAgLy8gZXVpZHMKKwkgIFJldHVybiB0aGUgc3RyaW5nIHRvIGJlIHVzZWQgYXMgcm9vdC11aWQuCisKKwlpbnQgdmFsaWRfc2V0ZXVpZCAob2JqZWN0IG9iaiwgc3RyaW5nIG5ld2V1aWQpCS8vIGV1aWRzCisJICBWYWxpZGF0ZSB0aGUgY2hhbmdlIG9mIGFuIG9iamVjdHMgZXVpZCBieSBlZnVuIHNldGV1aWQoKS4KKworCWludHxzdHJpbmcgdmFsaWRfcmVhZCAoc3RyaW5nIHBhdGgsIHN0cmluZyBldWlkLCBzdHJpbmcgZnVuLCBvYmplY3QgY2FsbGVyKQorCWludHxzdHJpbmcgdmFsaWRfd3JpdGUgKHN0cmluZyBwYXRoLCBzdHJpbmcgZXVpZCwgc3RyaW5nIGZ1biwgb2JqZWN0IGNhbGxlcikKKwkgIFZhbGlkYXRlIGEgcmVhZGluZy93cml0aW5nIGZpbGUgb3BlcmF0aW9uLgorCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgICAgZWQoKSBTdXBwb3J0CisKKwlzdHJpbmcgbWFrZV9wYXRoX2Fic29sdXRlIChzdHJpbmcgc3RyKQorCSAgQWJzb2x1dGl6ZSBhIHJlbGF0aXZlIGZpbGVuYW1lIGdpdmVuIHRvIHRoZSBlZGl0b3IuCisKKwlpbnQgc2F2ZV9lZF9zZXR1cCAob2JqZWN0IHdobywgaW50IGNvZGUpCisJICBTYXZlIGluZGl2aWR1YWwgc2V0dGluZ3Mgb2YgZWQgZm9yIGEgd2l6YXJkLgorCisJaW50IHJldHJpZXZlX2VkX3NldHVwIChvYmplY3Qgd2hvKQorCSAgUmV0cmlldmUgaW5kaXZpZHVhbCBzZXR0aW5ncyBvZiBlZCBmb3IgYSB3aXphcmQuCisKKwlzdHJpbmcgZ2V0X2VkX2J1ZmZlcl9zYXZlX29iamVjdF9uYW1lIChzdHJpbmcgZmlsZSkKKwkgIFJldHVybiBhIGZpbGVuYW1lIGZvciB0aGUgZWQgYnVmZmVyIHRvIGJlIHNhdmVkIGludG8uCisKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICAgIHBhcnNlX2NvbW1hbmQoKSBTdXBwb3J0ICAoIWNvbXBhdCwgU1VQUExZX1BBUlNFX0NPTU1BTkQgZGVmaW5lZCkKKworCXN0cmluZyAqcGFyc2VfY29tbWFuZF9pZF9saXN0ICgpCisJICBSZXR1cm4gZ2VuZXJpYyBzaW5ndWxhciBpZHMuCisKKwlzdHJpbmcgKnBhcnNlX2NvbW1hbmRfcGx1cmFsX2lkX2xpc3QgKCkKKwkgIFJldHVybiBnZW5lcmljIHBsdXJhbCBpZHMuCisKKwlzdHJpbmcgKnBhcnNlX2NvbW1hbmRfYWRqZWN0aXZfaWRfbGlzdCAoKQorCSAgUmV0dXJuIGdlbmVyaWMgYWRqZWN0aXZlIGlkcy4KKworCXN0cmluZyAqcGFyc2VfY29tbWFuZF9wcmVwb3NfbGlzdCAoKQorCSAgUmV0dXJuIGNvbW1vbiBwcmVwb3NpdGlvbnMuCisKKwlzdHJpbmcgcGFyc2VfY29tbWFuZF9hbGxfd29yZCgpCisJICBSZXR1cm4gdGhlIG9uZSghKSAnYWxsJyB3b3JkLgorCitTRUUgQUxTTworCW1hc3RlcihNKSwgZWZ1bihFKSwgYXBwbGllZChBKSwgY29uY2VwdHMoQyksIGRyaXZlcihEKSwgbHBjKExQQykKZGlmZiAtLWdpdCBhL2RvYy9tYXN0ZXIvbm90aWZ5X3NodXRkb3duIGIvZG9jL21hc3Rlci9ub3RpZnlfc2h1dGRvd24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIzY2Q5OAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXN0ZXIvbm90aWZ5X3NodXRkb3duCkBAIC0wLDAgKzEsMjkgQEAKK1NZTk9QU0lTCisgICAgICAgIHZhcmFyZ3Mgdm9pZCBub3RpZnlfc2h1dGRvd24gKHN0cmluZyBjcmFzaF9yZWFzb24pCisKK0RFU0NSSVBUSU9OCisgICAgICAgIE5vdGlmeSB0aGUgbWFzdGVyIGFib3V0IGFuIGltbWVkaWF0ZSBzaHV0ZG93bi4gSWYgPGNyYXNoX3JlYXNvbj4gaXMgMCwKKyAgICAgICAgaXQgaXMgYSBub3JtYWwgc2h1dGRvd24sIG90aGVyd2lzZSBpdCBpcyBhIGNyYXNoIGFuZCA8Y3Jhc2hfcmVhc29uPgorICAgICAgICBnaXZlcyBhIGhpbnQgYXQgdGhlIHJlYXNvbi4KKworICAgICAgICBUaGUgZnVuY3Rpb24gaGFzIHRoZSBvcHBvcnR1bml0eSB0byBwZXJmb3JtIGFueSBjbGVhbnVwIG9wZXJhdGlvbiwKKyAgICAgICAgbGlrZSBpbmZvcm1pbmcgdGhlIG11ZHdobyBzZXJ2ZXIgdGhhdCB0aGUgbXVkIGlzIGRvd24uIFRoaXMgY2FuIG5vdCBiZQorICAgICAgICBkb25lIHdoZW4gcmVtb3ZlX3BsYXllcigpIGlzIGNhbGxlZCBiZWNhdXNlIHRoZSB1ZHAgY29ubmVjdGl2aXR5IGlzCisgICAgICAgIGFscmVhZHkgZ29uZSB0aGVuLgorCisgICAgICAgIElmIHRoZSBnYW1lZHJpdmVyIHNodXRzIGRvd24gbm9ybWFsbHkgLCB0aGlzIGlzIHRoZSBsYXN0IGZ1bmN0aW9uCisgICAgICAgIGNhbGxlZCBiZWZvcmUgdGhlIG11ZCBzaHV0cyBkb3duIHRoZSB1ZHAgY29ubmVjdGlvbnMgYW5kIHRoZSBhY2NlcHRpbmcKKyAgICAgICAgc29ja2V0IGZvciBuZXcgcGxheWVycy4KKworICAgICAgICBJZiB0aGUgZ2FtZWRyaXZlciBjcmFzaGVzLCB0aGlzIGlzIHRoZSBsYXN0IGZ1bmN0aW9uIGNhbGxlZCBiZWZvcmUgdGhlCisgICAgICAgIG11ZCBhdHRlbXB0cyB0byBkdW1wIGNvcmUgYW5kIGV4aXQuIFdBUk5JTkc6IFNpbmNlIHRoZSBkcml2ZXIgaXMgaW4gYW4KKyAgICAgICAgdW5zdGFibGUgc3RhdGUsIHRoaXMgZnVuY3Rpb24gbWF5IG5vdCBiZSBhYmxlIHRvIHJ1biB0byBjb21wbGV0aW9uIQorICAgICAgICBUaGUgZm9sbG93aW5nIGNyYXNoIHJlYXNvbnMgYXJlIGRlZmluZWQ6CisgICAgICAgICAgIkZhdGFsIEVycm9yIjogYW4gaW50ZXJuYWwgc2FuaXR5IGNoZWNrIGZhaWxlZC4KKworSElTVE9SWQorICAgICAgICBMRE11ZCAzLjIuOSBhZGRlZCB0aGUgPGNyYXNoX3JlYXNvbj4gYXJndW1lbnQgYW5kIHRoYXQgdGhlIGZ1bmN0aW9uCisgICAgICAgIGlzIGNhbGxlZCBmb3IgYSBjcmFzaCBhdCBhbGwuCisKK1NFRSBBTFNPCisgICAgICAgIHNsb3dfc2h1dF9kb3duKE0pLCByZW1vdmVfcGxheWVyKE0pLApkaWZmIC0tZ2l0IGEvZG9jL21hc3Rlci9vYmplY3RfbmFtZSBiL2RvYy9tYXN0ZXIvb2JqZWN0X25hbWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk5MGI2ZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXN0ZXIvb2JqZWN0X25hbWUKQEAgLTAsMCArMSwxMCBAQAorU1lOT1BTSVMKKwlzdHJpbmcgb2JqZWN0X25hbWUob2JqZWN0IG9iKQorCitERVNDUklQVElPTgorCVJldHVybiBhIHByaW50YWJsZSBuYW1lIGZvciBhbiBvYmplY3QuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkCisJYnkgc3ByaW50ZigpIHRvIHByaW50IGEgbWVhbmluZ2Z1bCBuYW1lIGluIGFkZGl0aW9uIHRvIHRoZQorCW5vcm1hbCBvYmplY3RfbmFtZSgpLgorCitTRUUgQUxTTworCXNwcmludGYoRSksIG9iamVjdF9uYW1lKEUpCmRpZmYgLS1naXQgYS9kb2MvbWFzdGVyL3BhcnNlX2NvbW1hbmRfYWxsX3dvcmQgYi9kb2MvbWFzdGVyL3BhcnNlX2NvbW1hbmRfYWxsX3dvcmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU3YWIwNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXN0ZXIvcGFyc2VfY29tbWFuZF9hbGxfd29yZApAQCAtMCwwICsxLDkgQEAKK1NZTk9QU0lTCisJc3RyaW5nICpwYXJzZV9jb21tYW5kX2FsbF93b3JkKHZvaWQpCisKK0RFU0NSSVBUSU9OCisJVXNlZCBieSBwYXJzZV9jb21tYW5kKCkuIFJldHVybiB0aGUgd29yZCBmb3IgYGBhbGwnJyBpbiB0aGUKKwlpbnN0YWxsYXRpb25zIG5hdGl2ZSBsYW5ndWFnZS4KKworU0VFIEFMU08KKwlwYXJzZV9jb21tYW5kKEUpCmRpZmYgLS1naXQgYS9kb2MvbWFzdGVyL3BhcnNlX2NvbW1hbmRfcHJlcG9zX2xpc3QgYi9kb2MvbWFzdGVyL3BhcnNlX2NvbW1hbmRfcHJlcG9zX2xpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ3MDZjZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXN0ZXIvcGFyc2VfY29tbWFuZF9wcmVwb3NfbGlzdApAQCAtMCwwICsxLDkgQEAKK1NZTk9QU0lTCisJc3RyaW5nICpwYXJzZV9jb21tYW5kX3ByZXBvc19saXN0KHZvaWQpCisKK0RFU0NSSVBUSU9OCisJVXNlZCBieSBwYXJzZV9jb21tYW5kKCkuIFJldHVybiBhbiBhcnJheSBvZiBjb21tb24KKwlwcmVwb3NpdGlvbnMgaW4gdGhlIGluc3RhbGxhdGlvbnMgbmF0aXZlIGxhbmd1YWdlLgorCitTRUUgQUxTTworCXBhcnNlX2NvbW1hbmQoRSkKZGlmZiAtLWdpdCBhL2RvYy9tYXN0ZXIvcHJlbG9hZCBiL2RvYy9tYXN0ZXIvcHJlbG9hZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWYyN2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hc3Rlci9wcmVsb2FkCkBAIC0wLDAgKzEsMTggQEAKK1NZTk9QU0lTCisJdm9pZCBwcmVsb2FkKHN0cmluZyBmaWxlKQorCitERVNDUklQVElPTgorCUxvYWQgdGhlIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBmaWxlIG5hbWUsIHRoYXQgd2FzIHJldHVybmVkIGJ5CisJZXBpbG9nKCkuIEl0IGlzIHRhc2sgb2YgdGhlIGVwaWxvZygpL3ByZWxvYWQoKSBwYWlyIHRvIGVuc3VyZQorCXRoZSB2YWxpZGl0eSBvZiB0aGUgZ2l2ZW4gc3RyaW5ncyAoZS5nLiBmaWx0ZXJpbmcgb3V0IGNvbW1lbnRzCisJYW5kIGJsYW5rIGxpbmVzKS4gRm9yIHByZWxvYWQgaXRzZWxmIGEgY2FsbF9vdGhlcihmaWxlLCAiPz8/IikKKwlzIHN1ZmZpY2llbnQsIGJ1dCBpdCBzaG91bGQgYmUgZ3VhcmRlZCBieSBhIGNhdGNoKCkgdG8gYXZvaWQKKwlwcmVtYXR1cmUgYmxvY2tpbmdzLiBBbHNvIGl0IGlzIHdpc2UgdG8gY2hhbmdlIHRoZSBtYXN0ZXIncworCWV1aWQgZnJvbSByb290X3VpZCB0byBzb21ldGhpbmcgbGVzcyBwcml2aWxlZ2VkIGZvciB0aGUgdGltZQorCW9mIHRoZSBwcmVsb2FkLgorCisJWW91IGNhbiBvZiBjb3Vyc2UgZG8gYW55dGhpbmcgZWxzZSB3aXRoIHRoZSBwYXNzZWQgc3RyaW5ncyAtCisJcHJlbG9hZGluZyBpcyBqdXN0IHRoZSB0cmFkaXRpb25hbCB0YXNrLgorCitTRUUgQUxTTworCWVwaWxvZyhNKSwgbWFzdGVyKE0pCmRpZmYgLS1naXQgYS9kb2MvbWFzdGVyL3ByZXBhcmVfZGVzdHJ1Y3QgYi9kb2MvbWFzdGVyL3ByZXBhcmVfZGVzdHJ1Y3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEyMWI4OAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXN0ZXIvcHJlcGFyZV9kZXN0cnVjdApAQCAtMCwwICsxLDIyIEBACitTWU5PUFNJUworCW1peGVkIHByZXBhcmVfZGVzdHJ1Y3Qob2JqZWN0IG9iaikKKworREVTQ1JJUFRJT04KKwlQcmVwYXJlIHRoZSBkZXN0cnVjdGlvbiBvZiB0aGUgb2JqZWN0IG9iai4gUmV0dXJuIDAgaWYgdGhlCisJb2JqZWN0IGlzIHJlYWR5IGZvciBkZXN0cnVjdGlvbiwgYW55IG90aGVyIHZhbHVlIHdpbGwgYWJvcnQKKwl0aGUgYXR0ZW1wdC4gSWYgYSBzdHJpbmcgaXMgcmV0dXJuZWQsIGFuIGVycm9yIHdpdGggdGhlIHN0cmluZworCWFzIG1lc3NhZ2Ugd2lsbCBiZSBpc3N1ZWQuCisKKwlUaGUgaW50ZXJwcmV0ZXIgY2FsbHMgdGhpcyBmdW5jdGlvbiB3aGVuZXZlciBhbiBvYmplY3Qgc2hhbGwKKwliZSBkZXN0cnVjdGVkLiBJdCBleHBlY3RzLCB0aGF0IHRoaXMgZnVuY3Rpb24gY2xlYW5zIHRoZQorCWludmVudG9yeSBvZiB0aGUgb2JqZWN0LCBvciB0aGUgZGVzdHJ1Y3Qgd2lsbCBmYWlsLgorCUZ1cnRoZXJtb3JlLCB0aGUgZnVuY3Rpb24gY291bGQgbm90aWZ5IHRoZSBmb3JtZXIgaW52ZW50b3J5CisJb2JqZWN0cyB0aGF0IHRoZWlyIGhvbGRlciBpcyB1bmRlciBkZXN0cnVjdGlvbiAodXNlZnVsIHRvIG1vdmUKKwl1c2VycyBvdXQgb2Ygcm9vbXMgd2hpY2ggcmUgdXBkYXRlZCk7IGFuZCBpdCBjb3VsZCBhbm5vdW5jZQorCXN5c3RlbXdpZGUgdGhlIGRlc3RydWN0aW9uKHF1aXR0aW5nKSBvZiB1c2Vycy4KKworCVN0cmFuZ2UgdGhpbmdzIHdpbGwgaGFwcGVuIGlmIHRoZSBtYXN0b3Igb2JqZWN0IGRvZXMgbm90CisJcHJvdmlkZSB0aGlzIGZ1bmN0aW9uLgorCitTRUUgQUxTTworCXJlbW92ZV9wbGF5ZXIoTSksIGRlc3RydWN0KEUpCmRpZmYgLS1naXQgYS9kb2MvbWFzdGVyL3ByaXZpbGVnZV92aW9sYXRpb24gYi9kb2MvbWFzdGVyL3ByaXZpbGVnZV92aW9sYXRpb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU3YTRiOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXN0ZXIvcHJpdmlsZWdlX3Zpb2xhdGlvbgpAQCAtMCwwICsxLDYzIEBACitTWU5PUFNJUworCWludCBwcml2aWxlZ2VfdmlvbGF0aW9uKHN0cmluZyBvcCwgbWl4ZWQgd2hvLCBtaXhlZCBhcmczLCBtaXhlZCBhcmc0KQorCitERVNDUklQVElPTgorCVZhbGlkYXRlIHRoZSBleGVjdXRpb24gb2YgYSBwcml2aWxlZ2VkIG9wZXJhdGlvbi4KKwlvcCBkZW5vdGVzIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uLCB3aG8gaXMgdGhlIG9iamVjdAorCXJlcXVlc3RpbmcgdGhlIG9wZXJhdGlvbiAob2JqZWN0X25hbWUgb3Igb2JqZWN0IHBvaW50ZXIpLCBhcmczCisJYW5kIGFyZzQgYXJlIGFkZGl0aW9uYWwgYXJndW1lbnRzLCBkZXBlbmRpbmcgb24gdGhlIG9wZXJhdGlvbi4KKworCVRoZSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuID4wIHRvIGdyYW50IHRoZSBwcml2aWxlZ2UsIDAgdG8KKwlpbmRpY2F0ZSB0aGF0IHRoZSBjYWxsZXIgd2FzIHByb2JhYmx5IG1pc2xlYWRlZCBhbmQgdGhlIGVycm9yCisJbWlnaHQgYmUgZml4ZWQsIGFuZCBhbnl0aGluZyBlbHNlIHRvIGluZGljYXRlIGEgcmVhbAorCXZpb2xhdGlvbiwgdGhhdCB3aWxsIGJlIGhhbmRsZWQgYXMgcnVuIHRpbWUgZXJyb3IuCisKKwlUaGUgcHJpdmlsZWdlZCBvcGVyYXRpb25zIGFyZToKKwlhdHRhY2hfZXJxX2RlbW9uICBBdHRhY2ggdGhlIGVycSBkZW1vbiB0byBvYmplY3QgPGFyZz4gd2l0aAorCSAgICAgICAgICAgICAgICAgIGZsYWcgPGFyZ3M+LiAKKwliaW5kX2xhbWJkYQkgIEJpbmQgYSBsYW1iZGEtY2xvc3VyZSB0byBvYmplY3QgYXJnMy4KKwljYWxsX291dF9pbmZvCSAgUmV0dXJuIGFuIGFycmF5IHdpdGggYWxsIGNhbGxfb3V0CisJCQkgIGluZm9ybWF0aW9ucy4KKwlub21hc2sgc2ltdWxfZWZ1biBBdHRlbXB0IHRvIGdldCBhbiBlZnVuIDxhcmc+IHZpYSBlZnVuOjogd2hlbgorCSAgICAgICAgICAgICAgICAgIGl0IGlzIHNoYWRvd2VkIGJ5IGEgbm9tYXNrIHR5cGUgc2ltdWxfZWZ1bi4KKwlyZW5hbWVfb2JqZWN0CSAgVGhlIG9iamVjdCB3aG8gdHJpZXMgdG8gcmVuYW1lIHRoZSBvYmplY3QKKwkJCSAgYXJnMyB0byB0aGUgbmFtZSBhcmc0LgorCXNlbmRfdWRwCSAgU2VuZCBVRFAtZGF0YSB0byBob3N0IGFyZzMuCisJc2V0X2F1dG9faW5jbHVkZV9zdHJpbmcgU2V0IHRoZSBzdHJpbmcgYXV0b21hdGljYWxseSBpbmNsdWRlZAorCQkJICBieSB0aGUgY29tcGlsZXIgaW50byBldmVyeSBvYmplY3QuCisJZ2V0X2V4dHJhX3dpemluZm8gR2V0IHRoZSBhZGRpdGlvbmFsIHdpei1saXN0IGluZm8gZm9yIHVzZXIKKwkJCSAgYXJnMy4KKwlzZXRfZXh0cmFfd2l6aW5mbyBTZXQgdGhlIGFkZGl0aW9uYWwgd2l6LWxpc3QgaW5mbyBmb3IgdXNlcgorCQkJICBhcmczLgorCXNldF9leHRyYV93aXppbmZvX3NpemUgU2V0IHRoZSBzaXplIG9mIHRoZSBhZGRpdGlvbmFsIHVzZXIKKwkJCSAgaW5mbyBpbiB0aGUgd2l6LWxpc3QgdG8gYXJnMy4KKwlzZXRfZHJpdmVyX2hvb2sgICA6IFNldCBob29rIDxhcmc+IHRvIDxhcmcyPi4KKwlzZXRfdGhpc19vYmplY3QJICBTZXQgdGhpc19vYmplY3QoKSB0byBhcmczLgorCXNoYWRvd19hZGRfYWN0aW9uIEFkZCBhbiBhY3Rpb24gdG8gZnVuY3Rpb24gYXJnNCB0aGF0IGlzCisJCQkgIHNoYWRvd2VkIGJ5IHRoZSBvYmplY3QgYXJnMy4KKwlzeW1ib2xfdmFyaWFibGUJICBBdHRlbXB0IHRvIG1ha2UgYSBzeW1ib2wgZnJvbSBhIGhpZGRlbgorCQkJICBpbmhlcml0ZWQgdmFyaWFibGUuIGFyZzMgaXMgdGhlIG9iamVjdCBpbgorCQkJICBxdWVzdGlvbiwgYXJnNCB0aGUgbnVtYmVyIG9mIHRoZSB2YXJpYWJsZSBpbgorCQkJICB0aGUgdmFyaWFibGUgdGFibGUuCisJd2l6bGlzdF9pbmZvCSAgUmV0dXJuIGFuIGFycmF5IHdpdGggYWxsIHdpei1saXN0CisJCQkgIGluZm9ybWF0aW9uLgorCisJY2FsbF9vdXRfaW5mbygpIGNhbiByZXR1cm4gdGhlIGFyZ3VtZW50cyB0byBmdW5jdGlvbnMgYW5kCisJbGFtYmRhIGNsb3N1cmVzIHRvIGJlIGNhbGxlZCBieSBjYWxsX291dCgpOyB5b3Ugc2hvdWxkCisJY29uc2lkZXIgdGhhdCByZWFkIGFjY2VzcyB0byBjbG9zdXJlcywgbWFwcGluZ3MgYW5kIGFycmF5cworCW1lYW5zIHdyaXRlIGFjY2VzcyBhbmQvb3Igb3RoZXIgcHJpdmlsZWdlcy4gCisJd2l6bGlzdF9pbmZvKCkgd2lsbCByZXR1cm4gYW4gYXJyYXkgd2hpY2ggaG9sZHMsIGFtb25nIG90aGVycywKKwl0aGUgZXh0cmEgd2l6bGlzdCBmaWVsZC4gV2hpbGUgYSB0b3BsZXZlbCBhcnJheSwgaWYgZm91bmQsCisJd2lsbCBiZSBjb3BpZWQsIHRoaXMgZG9lcyBub3QgYXBwbHkgdG8gbmVzdGVkIGFycmF5cyBvciB0byBhbnkKKwltYXBwaW5ncy4gWW91IG1pZ2h0IGFsc28gaGF2ZSBzb21lIHNlbnNpdGl2ZSBjbG9zdXJlcyB0aGVyZS4KKwlzZW5kX3VkcCgpIHNob3VsZCBiZSB3YXRjaGVkIGFzIGl0IGNvdWxkIGJlIGFidXNlZCB0byBtZXNzIHVwCisJdGhlIElNUC4KKwlUaGUgeHh4X2V4dHJhX3dpemluZm8gb3BlcmF0aW9ucyBhcmUgbmVjZXNzYXJ5IGZvciBhIHByb3BlcgorCXdpemxpc3QgYW5kIHNob3VsZCB0aGVyZWZvcmUgYmUgcmVzdHJpY3RlZCB0byBhZG1pbnMuCisJQWxsIG90aGVyIG9wZXJhdGlvbnMgYXJlIHBvdGVudGlhbCBzb3VyY2VzIGZvciBkaXJlY3Qgc2VjdXJpdHkKKwlicmVhY2hlcyAtIGFueSB1c2Ugb2YgdGhlbSBzaG91bGQgYmUgc2NydXRpbml6ZWQgY2xvc2VseS4KKworU0VFIEFMU08JCisJc2ltdWxfZWZ1bihDKSwgY2FsbF9vdXRfaW5mbyhFKSwgc2hhZG93KEUpLCBhZGRfYWN0aW9uKEUpLAorCXdpemxpc3QoRSksIHNldF90aGlzX29iamVjdChFKSwgcmVuYW1lX29iamVjdChFKSwKKwliaW5kX2xhbWJkYShFKSwgc2VuZF91ZHAoRSksIHNldF9hdXRvX2luY2x1ZGVfc3RyaW5nKEUpCmRpZmYgLS1naXQgYS9kb2MvbWFzdGVyL3F1ZXJ5X2FsbG93X3NoYWRvdyBiL2RvYy9tYXN0ZXIvcXVlcnlfYWxsb3dfc2hhZG93Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZDJlOTUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWFzdGVyL3F1ZXJ5X2FsbG93X3NoYWRvdwpAQCAtMCwwICsxLDIzIEBACitxdWVyeV9hbGxvd19zaGFkb3coTSkKK0ZVTktUSU9OOgorICAgICBpbnQgcXVlcnlfYWxsb3dfc2hhZG93KG9iamVjdCB2aWN0aW0pCisKK0RFRklOSVRJT046CisgICAgIC9zZWN1cmUvbWFzdGVyLmMKKworQkVTQ0hSRUlCVU5HOgorICAgICBHaWJ0IDEgenVydWVjaywgd2VubiBkYXMgT2JqZWt0IHZpY3RpbSB2b24gcHJldmlvdXNfb2JqZWN0KCkgYmVzY2hhdHRldCAKKyAgICAgd2VyZGVuIGRhcmYsIDAgc29uc3QuCisKKyAgICAgRGllIEZ1bmt0aW9uIHBydWVmdCwgb2IgZGFzIE9iamVrdCB2aWN0aW0gZWluIFJvb3QtT2JqZWt0IGlzdCwgb2RlcgorICAgICBvYiBlcyBiZWltIEF1ZnJ1ZiB2b24gcXVlcnlfcHJldmVudF9zaGFkb3coKSAxIHp1cnVlY2tnaWJ0LgorCitCRU1FUktVTkdFTjoKKyAgICAgV2lyZCBhdXRvbWF0aXNjaCBiZWkgc2hhZG93KCkgYXVzZ2VmdWVocnQuCisKK1NJRUhFIEFVQ0g6CisgICAgIFJlY2h0ZToJICAgICBxdWVyeV9wcmV2ZW50X3NoYWRvdyhMKQorICAgICBHZW5lcmVsbDoJICAgICBzaGFkb3coRSksIHVuc2hhZG93KEUpCisgICAgIEluZm9ybWF0aW9uZW46ICBxdWVyeV9zaGFkb3dpbmcoRSkKKworMjAuIE1haSAyMDA0IEdsb2luc29uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL21hc3Rlci9xdWVyeV9wbGF5ZXJfbGV2ZWwgYi9kb2MvbWFzdGVyL3F1ZXJ5X3BsYXllcl9sZXZlbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODRlMThlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hc3Rlci9xdWVyeV9wbGF5ZXJfbGV2ZWwKQEAgLTAsMCArMSwxNSBAQAorU1lOT1BTSVMKKwlpbnQgcXVlcnlfcGxheWVyX2xldmVsKHN0cmluZyB3aGF0KQorCitERVNDUklQVElPTgorCUNoZWNrIGlmIHRoZSB1c2VyIGlzIG9mIGhpZ2ggZW5vdWdoIGxldmVsIGZvciBzZXZlcmFsIHRoaW5ncy4KKworCVRoZSBhcmd1bWVudCBkZW5vdGVzIHRoZSBhY3Rpb24gZm9yIHdoaWNoIHBlcm1pc3Npb24gaXMgdG8gYmUKKwljaGVja2VkOgorCisJInRyYWNlIgkJSXMgdGhlIHVzZXIgYWxsb3dlZCB0byB1c2UgdHJhY2luZz8KKwkiaW5zcGVjdCBtZW1vcnkiIElzIHRoZSB1c2VyIGFsbG93ZWQgdG8gaXNzdWUgdGhlCisJCQlzcGVjaWFsIGNvbW1hbmQgInNob3dzbWFsbG5ld21hbGxvY2VkIj8gCisKK1NFRSBBTFNPCisJdHJhY2UoRSksIHNob3dzbWFsbG5ld21hbGxvY2VkKEQpLCBtYWxsb2MoRCksIHN0YXR1cyhEKSwgbWVtb3J5KEMpCmRpZmYgLS1naXQgYS9kb2MvbWFzdGVyL3F1b3RhX2RlbW9uIGIvZG9jL21hc3Rlci9xdW90YV9kZW1vbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2Y4ZDk1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hc3Rlci9xdW90YV9kZW1vbgpAQCAtMCwwICsxLDE4IEBACitTWU5PUFNJUworCXZvaWQgcXVvdGFfZGVtb24odm9pZCkKKworREVTQ1JJUFRJT04KKwlIYW5kbGUgcXVvdGFzIGluIHRpbWVzIG9mIG1lbW9yeSBzaG9ydGFnZS4KKworCVRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGR1cmluZyB0aGUgZmluYWwgcGhhc2Ugb2YgYSBnYXJiYWdlCisJY29sbGVjdGlvbiBpZiB0aGUgcmVzZXJ2ZWQgdXNlciBhcmVhIGNvdWxkbid0IGJlIHJlYWxsb2NhdGVkLgorCVRoaXMgZnVuY3Rpb24gKG9yIGEgY2FsbGVkIGRlbW9uKSBoYXMgbm93IHRoZSBvcHBvcnR1bml0eSB0bworCXJlbW92ZSBzb21lIChzdGlsbCBhY3RpdmUpIG9iamVjdHMgZnJvbSB0aGUgc3lzdGVtLiBJZiB0aGlzIGRvZXMKKwlub3QgZnJlZSBlbm91Z2ggbWVtb3J5IHRvIHJlYWxsb2NhdGUgdGhlIHVzZXIgcmVzZXJ2ZSwKKwlzbG93X3NodXRfZG93bigpIHdpbGwgYmUgY2FsbGVkIHRvIHN0YXJ0IEFybWFnZWRkb24uCisKKwlVcCB0byBub3csIHRoZSB3aXpsaXN0IGxhY2tzIHZhcmlvdXMgaW5mb3JtYXRpb25zIG5lZWRlZCB0bworCWRldGVjdCB0aGUgbWVtb3J5LWh1bmdyaWVzdCB1c2Vycy4KKworU0VFIEFMU08KKwlzbG93X3NodXRfZG93bihNKSwgd2l6bGlzdChFKQpkaWZmIC0tZ2l0IGEvZG9jL21hc3Rlci9yZWFjdGl2YXRlX2Rlc3RydWN0ZWRfbWFzdGVyIGIvZG9jL21hc3Rlci9yZWFjdGl2YXRlX2Rlc3RydWN0ZWRfbWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MGQyYTEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWFzdGVyL3JlYWN0aXZhdGVfZGVzdHJ1Y3RlZF9tYXN0ZXIKQEAgLTAsMCArMSwxNSBAQAorU1lOT1BTSVMKKwl2b2lkIHJlYWN0aXZhdGVfZGVzdHJ1Y3RlZF9tYXN0ZXIoaW50IGZsYWcpCisKK0RFU0NSSVBUSU9OCisJVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gYW4gYWxyZWFkeSBkZXN0cnVjdGVkIG1hc3RlciBvYmplY3QKKwlpZiBubyBuZXcgbWFzdGVyIG9iamVjdCBjb3VsZCBiZSBsb2FkZWQuIGZsYWcgd2lsbCBiZSAxIGlmIHRoZQorCW9sZCBtYXN0ZXIgb2JqZWN0IGNvdWxkIGJlIHJlY2xhaW1lZCBmb3JtIHRoZSBsaXN0IG9mIG9iamVjdHMKKwl0aGF0IHdlcmUgbWFya2VkIGZvciBkZXN0cnVjdGlvbiBidXQgbm90IHlldCB0ZXJtaW5hdGVkLiBJZgorCWZsYWcgaXMgMCwgYWxsIHZhcmlhYmxlcyBvZiB0aGUgb2JqZWN0IGhhdmUgYmVlbiBzZXQgdG8gMCBhbmQKKwltdXN0IGJlIHJlLWluaXRpYWxpemVkLgorCisJQWZ0ZXIgdGhpcyBmdW5jdGlvbiwgaW5hdWd1cmF0ZV9tYXN0ZXIoKSB3aWxsIGJlIGFwcGxpZWQgYWdhaW4uCisKK1NFRSBBTFNPCisJZGVzdHJ1Y3QoRSksIGluYXVndXJhdGVfbWFzdGVyKE0pLCBtYXN0ZXIoTSkKZGlmZiAtLWdpdCBhL2RvYy9tYXN0ZXIvcmVjZWl2ZV91ZHAgYi9kb2MvbWFzdGVyL3JlY2VpdmVfdWRwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExYjU4YzUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWFzdGVyL3JlY2VpdmVfdWRwCkBAIC0wLDAgKzEsMTcgQEAKK1NZTk9QU0lTCisJdm9pZCByZWNlaXZlX3VkcChzdHJpbmcgaG9zdCwgc3RyaW5nIG1zZywgaW50IGhvc3Rwb3J0KQorCitERVNDUklQVElPTgorCUhhbmRsZSBhIHJlY2VpdmVkIElNUCBtZXNzYWdlLgorCisJVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGV2ZXJ5IG1lc3NhZ2UgcmVjZWl2ZWQgb24gdGhlIElNUAorCXBvcnQuIFVzdWFsbHkgaXQgaXMgcGFzc2VkIG9uIHRvIHNvbWUgb2JqZWN0IHRoYXQgaGFuZGxlcworCWludGVyIG11ZCBjb21tdW5pY2F0aW9ucy4KKworSElTVE9SWQorCVRoZSAnaG9zdHBvcnQnIGFyZ3VtZW50IHdhcyBhZGRlZCBpbiAzLjIuMS4KKworU0VFIEFMU08KKwlzZW5kX3VkcChFKSwgcXVlcnlfdWRwX3BvcnQoRSkKKworMjkuMTAuMjAwNiBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvbWFzdGVyL3JlbW92ZV9wbGF5ZXIgYi9kb2MvbWFzdGVyL3JlbW92ZV9wbGF5ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcwYTFmYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXN0ZXIvcmVtb3ZlX3BsYXllcgpAQCAtMCwwICsxLDE0IEBACitTWU5PUFNJUworCXZvaWQgcmVtb3ZlX3BsYXllcihvYmplY3Qgb2IpCisKK0RFU0NSSVBUSU9OCisJUmVtb3ZlIGFuIGludGVyYWN0aXZlIHVzZXIgb2JqZWN0IG9iIGZyb20gdGhlIHN5c3RlbS4gVGhpcworCWZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgaW50ZXJwcmV0ZXIgdG8gZXhwZWxsIHJlbWFpbmluZworCXVzZXJzIGZyb20gdGhlIHN5c3RlbSBvbiBzaHV0ZG93biBpbiBhIHBvbGl0ZSB3YXkuIElmIHRoaXMKKwlmdW5jdGlvbnMgZmFpbHMgdG8gcXVpdC9kZXN0cnVjdCB0aGUgdXNlciwgaGUgd2lsbCBiZQorCWRlc3RydWN0ZWQgdGhlIGhhcmQgd2F5IGJ5IHRoZSBpbnRlcnByZXRlci4KKworCVRoaXMgZnVuY3Rpb24gbXVzdCBub3QgY2F1c2UgcnVudGltZSBlcnJvcnMuCisKK1NFRSBBTFNPCisJcmVtb3ZlX2ludGVyYWN0aXZlKEUpLCBzbG93X3NodXRfZG93bihNKQpkaWZmIC0tZ2l0IGEvZG9jL21hc3Rlci9yZXRyaWV2ZV9lZF9zZXR1cCBiL2RvYy9tYXN0ZXIvcmV0cmlldmVfZWRfc2V0dXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ5MmVmMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXN0ZXIvcmV0cmlldmVfZWRfc2V0dXAKQEAgLTAsMCArMSw5IEBACitTWU5PUFNJUworCWludCByZXRyaWV2ZV9lZF9zZXR1cChvYmplY3QgY29tbWFuZF9naXZlcikKKworREVTQ1JJUFRJT04KKwlTaG91bGQgcmV0dXJuIGFuIGludGVnZXIgdGhhdCBnaXZlcyB0aGUgZWQgc2V0dXAgZmxhZ3MgZm9yIHRoZQorCXVzZXIgdGhhdCBpcyBkZW5vdGVkIGJ5IGNvbW1hbmRfZ2l2ZXIuCisKK1NFRSBBTFNPCisJc2F2ZV9lZF9zZXR1cChNKQpkaWZmIC0tZ2l0IGEvZG9jL21hc3Rlci9ydW50aW1lX2Vycm9yIGIvZG9jL21hc3Rlci9ydW50aW1lX2Vycm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMDlkZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWFzdGVyL3J1bnRpbWVfZXJyb3IKQEAgLTAsMCArMSwxNiBAQAorU1lOT1BTSVMKKwl2b2lkIHJ1bnRpbWVfZXJyb3Ioc3RyaW5nIGVyciwgc3RyaW5nIHByZywgc3RyaW5nIGN1cm9iaiwgaW50IGxpbmUpCisKK0RFU0NSSVBUSU9OCisJVGhpcyBmdW5jdGlvbiBoYXMgdG8gYW5ub3VuY2UgYSBydW50aW1lIGVycm9yIHRvIHRoZSBhY3RpdmUKKwl1c2VyLiBJZiB0aGUgdXNlciBoYXMgZW5vdWdoIHByaXZpbGVnZXMsIGl0IG1pZ2h0IGdpdmUgaGltIHRoZQorCWZ1bGwgZXJyb3IgbWVzc2FnZSB0b2dldGhlciB3aXRoIHRoZSBzb3VyY2UgbGluZS4gRWxzZSBpdAorCXNob3VsZCBpc3N1ZSBhIGRlY2VudCBtZXNzYWdlICgiWW91ciBzZW5zaXRpdmUgbWluZCBub3RpY2VzIGEKKwl3cm9uZ25lc3MgaW4gdGhlIGZhYnJpYyBvZiBzcGFjZSIpLgorCisJTm90ZSB0aGF0IHByZyBkZW5vdGVzIHRoZSBwcm9ncmFtIGFjdHVhbGx5IGV4ZWN1dGVkICh3aGljaAorCW1pZ2h0IGJlIGFuIGluaGVyaXRlZCBvbmUpIHdoZXJlYXMgY3Vyb2JqIGlzIGp1c3QgdGhlCisJb2ZmZW5kaW5nIG9iamVjdC4KKworU0VFIEFMU08KKwlsb2dfZXJyb3IoTSksIGhlYXJ0X2JlYXRfZXJyb3IoTSksIHJhaXNlX2Vycm9yKEUpCmRpZmYgLS1naXQgYS9kb2MvbWFzdGVyL3J1bnRpbWVfd2FybmluZyBiL2RvYy9tYXN0ZXIvcnVudGltZV93YXJuaW5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwODY0YWIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWFzdGVyL3J1bnRpbWVfd2FybmluZwpAQCAtMCwwICsxLDI3IEBACitTWU5PUFNJUworICAgICAgICB2b2lkIHJ1bnRpbWVfd2FybmluZyggc3RyaW5nIG1zZywgc3RyaW5nIGN1cm9iaiwgc3RyaW5nIHByb2csIGludCBsaW5lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBpbnQgaW5zaWRlX2NhdGNoKQorCitERVNDUklQVElPTgorICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBsZXQgdGhlIG11ZGxpYiBoYW5kbGUgYSBydW50aW1lIHdhcm5pbmcsCisgICAgICAgIGUuZy4gYnkgbG9nZ2luZyBpdCBpbnRvIGEgZGF0YWJhc2UuCisKKyAgICAgICAgPG1zZz4gaXMgdGhlIHdhcm5pbmcgbWVzc2FnZS4KKyAgICAgICAgPGN1cm9iaj4gaXMgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgb2JqZWN0IHdoaWNoIGNhdXNlZCB0aGUgbWVzc2FnZQorICAgICAgICAgICAgICAodGhlIG9iamVjdCBpdHNlbGYgbWlnaHQgYWxyZWFkeSBiZSBkZXN0cnVjdGVkKSwgb3IgMCBpZiB0aGVyZQorICAgICAgICAgICAgICBpcyBub25lLgorICAgICAgICA8cHJvZz4sIDxsaW5lPiBkZXRlcm1pbmUgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gYW5kIHRoZSBsaW5lIHdoZXJlCisgICAgICAgICAgICAgIHRoZSBlcnJvciBvY2N1cmVkIGlmIHRoZSBjdXJyZW50IG9iamVjdCBleGlzdHMsIG90aGVyd2lzZQorICAgICAgICAgICAgICB0aGV5IGFyZSAwLgorICAgICAgICA8aW5zaWRlX2NhdGNoPiA6ICE9IDAgaWYgdGhlIHdhcm5pbmcgb2NjdXJzIGluc2lkZSBhIGNhdGNoKCkuCisKKyAgICAgICAgVGhlIGRyaXZlciBpcyBsaW1pdGVkIHRvIHRocmVlIG5lc3RlZCB3YXJuaW5ncywgdG8gcHJldmVudAorICAgICAgICBhbiBlbmRsZXNzIHJlY3Vyc2lvbiBpbiBjYXNlIHJ1bnRpbWVfd2FybmluZygpIGl0c2VsZiBjYXVzZXMKKyAgICAgICAgd2FybmluZ3MuCisKK0hJU1RPUlkKKyAgICAgICAgSW50cm9kdWNlZCBpbiBMRE11ZCAzLjMuNTUxLgorICAgICAgICBMRE11ZCAzLjMuNzA1IGFkZGVkIHRoZSA8aW5zaWRlX2NhdGNoPiBhcmd1bWVudC4KKworU0VFIEFMU08KKyAgICAgICAgcnVudGltZV9lcnJvcihNKQpkaWZmIC0tZ2l0IGEvZG9jL21hc3Rlci9zYXZlX2VkX3NldHVwIGIvZG9jL21hc3Rlci9zYXZlX2VkX3NldHVwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYWFmNzEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWFzdGVyL3NhdmVfZWRfc2V0dXAKQEAgLTAsMCArMSwzMyBAQAorU1lOT1BTSVMKKwlpbnQgc2F2ZV9lZF9zZXR1cChvYmplY3Qgd2hvLCBpbnQgY29kZSkKKworREVTQ1JJUFRJT04KKwlTYXZlIGluZGl2aWR1YWwgb3B0aW9uIHNldHRpbmdzIG9mIHRoZSBidWlsdGluIGVkLCBlbmNvZGVkCisJaW50byBjb2RlLCBmb3IgdGhlIHVzZXIgZGVub3RlZCBieSB3aG8uIFRoZXNlIGZ1bmN0aW9ucyBhcmUKKwlsb2NhdGVkIGluIHRoZSBtYXN0ZXIgb2JqZWN0IHNvIHRoYXQgdGhlIGxvY2FsIGdvZHMgY2FuIGRlY2lkZQorCXdoYXQgc3RyYXRlZ3kgdGhleSB3YW50IHRvIHVzZS4gc3VnZ2VzdGlvbnM6CisJQSBzZXR1cCBmaWxlIGZvciBldmVyeSB1c2VyLgorCQlhZHZhbnRhZ2VzOgl0cmFuc3BhcmVudCB0byB0aGUgdXNlcgorCQkJCWluZGVwZW5kZW50IG9mIHVzZXIgY291bnQKKwkJZGlzYWR2YW50YWdlOglleHRyYSBmaWxlIGFjY2VzcyBhdCBlZCBpbnZvY2F0aW9uCisJQW4gYXJyYXkgaW4gdGhlIG1hc3RlciBvYmplY3QsIHVzZXJzIGFyZSBzZWFyY2hlZCBieSBtZW1iZXJfYXJyYXkKKwkJYWR2YW50YWdlOgllYXN5IHRvIGltcGxlbWVudAorCQlkaXNhZHZhbnRhZ2U6CXBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uIHdpdGggaGlnaCB1c2VyIGNvdW50cworCUFuIEFWTC10cmVlIHRvIGFjY2VzcyB1c2VycyBieSBuYW1lCisJCWFkdmFudGFnZToJY2FuIGZpdCBhbnkgbmVlZAorCQlkaXNhZHZhbnRhZ2U6CWhhcmQgdG8gaW1wbGVtZW50LCB3aWxsIG5lZWQgbW9yZQorCQkJCW92ZXJoZWFkIG9uIHNtYWxsIGFuZCBtZWRpdW0KKwkJCQlpbnN0YWxsYXRpb25zIHRoYW4gaXQgY2FuIGV2ZXIgbWFrZQorCQkJCWdvb2QgYnkgbGcodXNlcmNvdW50KSBjb21wbGV4aXR5CisJRGVkaWNhdGVkIGZsYWdzIGluIGV2ZXJ5IHVzZXIgb2JqZWN0LgorCQlhZHZhbnRhZ2VzOgllYXN5IHRvIGltcGxlbWVudAorCQkJCWluZGVwZW5kZW50IG9mIHVzZXIgY291bnQKKwkJCQlXaWxsIGFsc28gd29yayBmb3IgbnVzZXJzIHcvbyBmaWxlCisJCQkJYWNjZXNzIHByaXZpbGVnZXMuCisJCWRpc2FkdmFudGFnZToJY2FyZSBoYXMgdG8gYmUgdGFrZW4gdG8gYXZvaWQKKwkJCQljb2xsaXNpb24gd2l0aCBvdGhlciB1c2VzIG9mIHRoZSBmbGFncworCQkJCWluIHRoZSB1c2VyIG9iamVjdAorCitTRUUgQUxTTworCWVkKEUpLCByZXRyaWV2ZV9lZF9zZXR1cChNKSwgdmFsaWRfd3JpdGUoTSksCisJZ2V0X2VkX2J1ZmZlcl9zYXZlX29iamVjdF9uYW1lKE0pCmRpZmYgLS1naXQgYS9kb2MvbWFzdGVyL3Nsb3dfc2h1dF9kb3duIGIvZG9jL21hc3Rlci9zbG93X3NodXRfZG93bgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTdmZThkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hc3Rlci9zbG93X3NodXRfZG93bgpAQCAtMCwwICsxLDQwIEBACitTWU5PUFNJUworCXZvaWQgc2xvd19zaHV0X2Rvd24oaW50IG1pbnV0ZXMpCisKK0RFU0NSSVBUSU9OCisJU2NoZWR1bGUgYSBzaHV0ZG93biBmb3IgdGhlIG5lYXIgZnV0dXJlLiBtaW51dGVzIGlzIHRoZQorCWRlc2lyZWQgdGltZSBpbiBtaW51dGVzIHRpbGwgdGhlIHNodXRkb3duOgorCSBzaXgsIGlmIGp1c3QgdGhlIHVzZXIgcmVzZXJ2ZSBoYXMgYmVlbiBwdXQgaW50byB1c2UuCisJIG9uZSwgaWYgdGhlIChzbWFsbGVyKSBtYXN0ZXIgcmVzZXJ2ZSBoYXMgYmVlbiBwdXQgaW50byB1c2UgYXMKKwkgICAgICB3ZWxsLgorCisJVGhlIGludGVycHJldGVyIGNhbGxzIHRoaXMgZnVuY3Rpb24gd2hlbiBpdCBydW5zIGxvdyBvbgorCW1lbW9yeS4gQXQgdGhpcyB0aW1lLCBpdCBoYXMgZnJlZWQgaXRzIHJlc2VydmUsIGJ1dCBzaW5jZSBpdAorCXdvbid0IGxhc3QgbG9uZywgdGhlIGludGVycHJldGVyIG5lZWRzIHRvIGJlIHNodXQgZG93bi4gVGhlCisJZGVsYXkgaXMgdG8gZ2l2ZSB0aGUgdXNlcnMgdGhlIG9wcG9ydHVuaXR5IHRvIGZpbmlzaCB0aGVpcgorCWN1cnJlbnQgdGFza3MsIGJ1dCBkb24ndCB0YWtlIHRoZSAnbWludXRlcycgZm9yIGdyYW50ZWQsIGp1c3QKKwlkZWR1Y2UgdGhlIHVyZ2VuY3kgZnJvbSBpdC4gCisJSXQgaXMgcG9zc2libGUgdGhhdCB0aGUgZHJpdmVyIG1heSByZWFsbG9jYXRlIHNvbWUgbWVtb3J5CisJYWZ0ZXIgdGhlIGZ1bmN0aW9uIGhhcyBiZWVuIGNhbGxlZCwgYW5kIHRoZW4gcnVuIGFnYWluIGludG8gYQorCWxvdyBtZW1vcnkgc2l0dWF0aW9uLCBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gYWdhaW4uCisJVGhpcyBmdW5jdGlvbiBtaWdodCBsb2FkIGFuICdBcm1hZ2VkZG9uJyBvYmplY3QgYW5kIHRlbGwgaXQKKwl3aGF0IHRvIGRvLiBJdCBpcyB0aGUgQXJtYWdlZGRvbiBvYmplY3QgdGhlbiB3aGljaCBwZXJmb3JtcworCXRoZSBzaHV0ZG93bi4KKworCVRlY2huaWNhbDogVGhlIG1lbW9yeSBoYW5kbGluZyBvZiB0aGUgaW50ZXJwcmV0ZXIgaW5jbHVkZXMKKwl0aHJlZSByZXNlcnZlZCBhcmVhczogdXNlciwgc3lzdGVtIGFuZCBtYXN0ZXIuIEFsbCB0aHJlZSBhcmUKKwl0aGVyZSB0byBpbnN1cmUgdGhhdCB0aGUgc3lzdGVtIHNodXRzIGRvd24gZ3JhY2VmdWxseSB3aGVuIHRoZQorCW1lbW9yeSBydW5zIG91dDogdGhlIHVzZXIgYXJlYSB0byBnaXZlIHRoZSB1c2VycyB0aW1lIHRvCisJcXVpdCBub3JtYWxseSwgdGhlIG90aGVycyB0byBlbmFibGUgZW1lcmdlbmN5LWxvZ291dHMgd2hlbiB0aGUKKwl1c2VyIHJlc2VydmUgaXMgdXNlZCB1cCBhcyB3ZWxsLgorCVRoZSBhcmVhcyBhcmUgYWxsb2NhdGVkIGF0IHN0YXJ0IG9mIHRoZSBpbnRlcnByZXRlciwgYW5kCisJcmVsZWFzZWQgd2hlbiBubyBtb3JlIG1lbW9yeSBjb3VsZCBiZSBvYnRhaW5lZCBmcm9tIHRoZSBob3N0LgorCUluIHN1Y2ggYSBjYXNlLCBvbmUgb2YgdGhlIHJlbWFpbmluZyBhcmVhcyBpcyBmcmVlZCAoc28gdGhlCisJb3BlcmF0aW9uIGNhbiBjb250aW51ZSBhIHNob3J0IHdoaWxlKSBhbmQgYSBnYXJiYWdlIGNvbGxlY3Rpb24KKwlpcyBpbml0aWF0ZWQuIElmIHRoZSBnYXJiYWdlIGNvbGxlY3Rpb24gcmVjeWNsZXMgZW5vdWdoIG1lbW9yeQorCShlaXRoZXIgdHJ1ZSBnYXJiYWdlIG9yIGJ5IHRoZSBhaWQgb2YgdGhlIHF1b3RhX2RlbW9uKSB0bworCXJlYWxsb2NhdGUgdGhlIGFyZWFzLCBhbGwgaXMgZmluZSwgZWxzZSB0aGUgc3lzdGVtIHNodXQgZG93bgorCWlzIGludm9rZWQgYnkgYSBjYWxsIHRvIHRoaXMgZnVuY3Rpb24uIAorCitTRUUgQUxTTworCXF1b3RhX2RlbW9uKE0pLCBub3RpZnlfc2h1dGRvd24oTSksIHNodXRkb3duKEUpLCBtYWxsb2MoRCksIG1lbW9yeShDKQpkaWZmIC0tZ2l0IGEvZG9jL21hc3Rlci9zdGFsZV9lcnEgYi9kb2MvbWFzdGVyL3N0YWxlX2VycQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDVjYTMxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hc3Rlci9zdGFsZV9lcnEKQEAgLTAsMCArMSwxNyBAQAorU1lOT1BTSVMKKwl2b2lkIHN0YWxlX2VycSAoY2xvc3VyZSBjYWxsYmFjaykKKworREVTQ1JJUFRJT04KKwlOb3RpZnkgdGhlIGxvc3Mgb2YgdGhlIGVycSBkZW1vbi4KKwlBcmd1bWVudCBpcyB0aGUgY2FsbGJhY2sgY2xvc3VyZSBzZXQgZm9yIGFuIGVycSByZXF1ZXN0LgorCisJSWYgdGhlIGVycSBjb25uZWN0aW9uIGRpZXMgcHJlbWF0dXJlbHksIHRoZSBkcml2ZXIgd2lsbCBjYWxsCisJdGhpcyBsZnVuIGZvciBldmVyeSBwZW5kaW5nIHJlcXVlc3Qgd2l0aCBzZXQgY2FsbGJhY2suIFRoaXMKKwlmdW5jdGlvbiBzaG91bGQgbm90aWZ5IHRoZSBvcmlnaW5hdGluZyBvYmplY3QgdGhhdCB0aGUgYW5zd2VyCisJd2lsbCBuZXZlciBhcnJpdmUuIAorCitISVNUT1JZCisJSW50cm9kdWNlZCBpbiAzLjIuMUA2MS4KKworU0VFIEFMU08KKwllcnEoQykKZGlmZiAtLWdpdCBhL2RvYy9tYXN0ZXIvdmFsaWRfZXhlYyBiL2RvYy9tYXN0ZXIvdmFsaWRfZXhlYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzBiNjdiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hc3Rlci92YWxpZF9leGVjCkBAIC0wLDAgKzEsMTUgQEAKK1NZTk9QU0lTCisJaW50IHZhbGlkX2V4ZWMoc3RyaW5nIG5hbWUsIG9iamVjdCBvYiwgb2JqZWN0IG9iZnJvbSkKKworREVTQ1JJUFRJT04KKwlWYWxpZGF0ZSB0aGUgcmViaW5kaW5nIG9mIGFuIElQIGNvbm5lY3Rpb24gYnkgdXNhZ2Ugb2YgZWZ1bgorCWV4ZWMoKS4gQXJndW1lbnRzIGFyZSB0aGUgPG5hbWU+IG9mIHRoZSBfcHJvZ3JhbV8gYXR0ZW1wdGluZworCXRvIHJlYmluZCB0aGUgY29ubmVjdGlvbiwgdGhlIG9iamVjdCA8b2I+IHRvIHJlY2VpdmUgdGhlCisJY29ubmVjdGlvbiwgYW5kIHRoZSBvYmplY3QgPG9iZnJvbT4gZ2l2aW5nIHRoZSBjb25uZWN0aW9uLgorCU5vdGUgdGhhdCB0aGUgcHJvZ3JhbSBuYW1lIGlzIG5vdCB0aGUgb2JqZWN0X25hbWUoKSBvZiB0aGUKKwlvYmplY3QsIGFuZCBoYXMgbm8gbGVhZGluZyBzbGFzaC4KKworCVJldHVybiAwIHRvIGRpc2FsbG93IHRoZSBhY3Rpb24sIGFueSBvdGhlciB2YWx1ZSB0byBhbGxvdyBpdC4KKworU0VFIEFMU08KKwlleGVjKEUpCmRpZmYgLS1naXQgYS9kb2MvbWFzdGVyL3ZhbGlkX3F1ZXJ5X3Nub29wIGIvZG9jL21hc3Rlci92YWxpZF9xdWVyeV9zbm9vcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTIzNzhhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hc3Rlci92YWxpZF9xdWVyeV9zbm9vcApAQCAtMCwwICsxLDEyIEBACitTWU5PUFNJUworCXZhbGlkX3F1ZXJ5X3Nub29wKG9iamVjdCBvYikKKworREVTQ1JJUFRJT04KKwlTaG91bGQgcmV0dXJuIDEgaWYgcHJldmlvdXNfb2JqZWN0KCkgKHRoZSBvbmUgdGhhdCBjYWxsZWQgdGhlCisJZWZ1biBxdWVyeV9zbm9vcCgpKSBpcyBhbGxvd2VkIHRvIHF1ZXJ5IHdldGhlciBvYiBpcyBiZWluZworCXNub29wZWQsIDAgaWYgbm90LgorCisJVGhlIG1hc3RlciBvYmplY3QgaXMgYWx3YXlzIGFsbG93ZWQgdG8gdXNlIHF1ZXJ5X3Nub29wKCkuCisKK1NFRSBBTFNPCisJdmFsaWRfc25vb3AoTSksIHF1ZXJ5X3Nub29wKEUpLCBzbm9vcChFKQpkaWZmIC0tZ2l0IGEvZG9jL21hc3Rlci92YWxpZF9yZWFkIGIvZG9jL21hc3Rlci92YWxpZF9yZWFkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYWZiYWUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWFzdGVyL3ZhbGlkX3JlYWQKQEAgLTAsMCArMSwzMiBAQAorU1lOT1BTSVMKKwlzdHJpbmcgdmFsaWRfcmVhZChzdHJpbmcgcGF0aCwgc3RyaW5nIHVpZCwgc3RyaW5nIGZ1bmMsIG9iamVjdCBvYikKKworREVTQ1JJUFRJT04KKwlUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBjaGVjayBpZiB0aGUgb2JqZWN0IG9iIHdpdGggdGhlCisJdXNlci1pZCB1aWQgaGFzIHJlYWQgcGVybWlzc2lvbnMgZm9yIHRoZSBmaWxlIGdpdmVuIGJ5IHBhdGgKKwlmb3IgdGhlIG9wZXJhdGlvbiBuYW1lZCBieSBmdW5jLiBJdCBzaG91bGQgcmV0dXJuIDAgaWYKKwlwZXJtaXNzaW9uIGlzIGRlbmllZCwgb3IgdGhlIG5vcm1hbGl6ZWQgcGF0aCBpZiBwZXJtaXNzaW9uIGlzCisJZ3JhbnRlZC4gWW91IGNhbiBhbHNvIHJldHVybiAxIHRvIGluZGljYXRlIHRoYXQgdGhlIHBhdGggY2FuCisJYmUgdXNlZCB1bmNoYW5nZWQuCisKKwlUaGUgcmV0dXJuZWQgcGF0aG5hbWUgbXVzdCBub3QgY29udGFpbiBgYC4uJycsIGEgbGVhZGluZyAvCisJd2lsbCBiZSBzdHJpcHBlZCBieSB0aGUgaW50ZXJwcmV0ZXIuCisKKwlGdW5jIGRlbm90ZXMgdGhlIGVmdW4gY2FsbCBvciBvdGhlciBvcGVyYXRpb24gdGhhdCBjYXVzZWQKKwl2YWxpZF9yZWFkKCkgdG8gYmUgY2FsbGVkOgorCWVkX3N0YXJ0IChjaGVjayBpZiB0aGUgZmlsZSB0byBiZSBlZGl0ZWQgaXMgcmVhZGFibGUpLAorCWZpbGVfc2l6ZSwKKwlnZXRfZGlyLAorCXByaW50X2ZpbGUgKGVmdW4gY2F0KCkpLAorCXJlYWRfYnl0ZXMsCisJcmVhZF9maWxlLAorCXJlc3RvcmVfb2JqZWN0LAorCXRhaWwuCisKKwlOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gY29tcGF0IG1vZGUgYXMgd2VsbC4gSWYKKwl5b3UgbmVlZCB0byBiZSBjb21wYXRpYmxlIHdpdGggdGhlIG9sZCAyLjQuNS1tdWRsaWIsIHJlZGlyZWN0CisJdGhlc2UgY2FsbHMgdG8gdGhlIHZhbGlkX3JlYWQvdmFsaWRfd3JpdGUgaW4gdGhlIHVzZXIKKwlvYmplY3QuCisKK1NFRSBBTFNPCisJdmFsaWRfd3JpdGUoTSksIG1ha2VfcGF0aF9hYnNvbHV0ZShNKQpkaWZmIC0tZ2l0IGEvZG9jL21hc3Rlci92YWxpZF9zZXRldWlkIGIvZG9jL21hc3Rlci92YWxpZF9zZXRldWlkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZmMwZDIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWFzdGVyL3ZhbGlkX3NldGV1aWQKQEAgLTAsMCArMSw5IEBACitTWU5PUFNJUworCWludCB2YWxpZF9zZXRldWlkKG9iamVjdCBvYiwgc3RyaW5nIG5ld2lkKQorCitERVNDUklQVElPTgorCVNob3VsZCByZXR1cm4gMSBpZiBvYiBpcyBhbGxvd2VkIHRvIHNldCBpdHMgZXVpZCB0byBuZXdpZC4KKwlPYmplY3RzIGFyZSBhbHdheXMgYWxsb3dlZCB0byBzZXQgdGhlaXIgZXVpZCB0byAwLgorCitTRUUgQUxTTworCXNldGV1aWQoRSksIHVpZHMoQykKZGlmZiAtLWdpdCBhL2RvYy9tYXN0ZXIvdmFsaWRfc25vb3AgYi9kb2MvbWFzdGVyL3ZhbGlkX3Nub29wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZmY5ODcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWFzdGVyL3ZhbGlkX3Nub29wCkBAIC0wLDAgKzEsOCBAQAorU1lOT1BTSVMKKwlpbnQgdmFsaWRfc25vb3Aob2JqZWN0IG1lLCBvYmplY3QgeW91KQorCitERVNDUklQVElPTgorCVNob3VsZCByZXR1cm4gMSBpZiBtZSBpcyBhbGxvd2VkIHRvIHNub29wIHlvdSwgMCBpZiBub3QuCisKK1NFRSBBTFNPCisJc25vb3AoRSksIHF1ZXJ5X3Nub29wKEUpLCB2YWxpZF9xdWVyeV9zbm9vcChNKQpkaWZmIC0tZ2l0IGEvZG9jL21hc3Rlci92YWxpZF93cml0ZSBiL2RvYy9tYXN0ZXIvdmFsaWRfd3JpdGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFmZTQzYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXN0ZXIvdmFsaWRfd3JpdGUKQEAgLTAsMCArMSwzMyBAQAorU1lOT1BTSVMKKwlzdHJpbmcgdmFsaWRfd3JpdGUoc3RyaW5nIHBhdGgsIHN0cmluZyB1aWQsIHN0cmluZyBmdW5jLCBvYmplY3Qgb2IpCisKK0RFU0NSSVBUSU9OCisJVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gY2hlY2sgaWYgdGhlIG9iamVjdCBvYiB3aXRoIHRoZQorCXVzZXItaWQgdWlkIGhhcyB3cml0ZSBwZXJtaXNzaW9ucyB0byB0aGUgZmlsZSBnaXZlbiBieSBwYXRoCisJZm9yIHRoZSBvcGVyYXRpb24gbmFtZWQgYnkgZnVuYy4gSXQgc2hvdWxkIHJldHVybiAwIGlmCisJcGVybWlzc2lvbiBpcyBkZW5pZWQsIG9yIHRoZSBub3JtYWxpemVkIHBhdGggaWYgcGVybWlzc2lvbiBpcworCWdyYW50ZWQuIFlvdSBjYW4gYWxzbyByZXR1cm4gMSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBwYXRoIGNhbgorCWJlIHVzZWQgdW5jaGFuZ2VkLgorCisJVGhlIHJldHVybmVkIHBhdGhuYW1lIG11c3Qgbm90IGNvbnRhaW4gYGAuLicnLCBhIGxlYWRpbmcgLworCXdpbGwgYmUgc3RyaXBwZWQgYnkgdGhlIGludGVycHJldGVyLgorCisJRnVuYyBkZW5vdGVzIHRoZSBlZnVuIGNhbGwgb3Igb3RoZXIgb3BlcmF0aW9uIHRoYXQgY2F1c2VkCisJdmFsaWRfd3JpdGUoKSB0byBiZSBjYWxsZWQ6CisJY2luZGVudCwKKwlkb19yZW5hbWUgKGVmdW4gcmVuYW1lKCksIGZvciB0aGUgb2xkIGFuZCB0aGVuIGZvciB0aGUgbmV3IG5hbWUpLAorCWVkX3N0YXJ0ICh3aGVuZXZlciB0aGUgYnVpbHRpbiBlZCB0cmllcyB0byB3cml0ZSB0byBhIGZpbGUpLAorCW1rZGlyLAorCXJlbW92ZV9maWxlIChlZnVuIHJtKCkpLAorCXJtZGlyLAorCXNhdmVfb2JqZWN0LAorCXdyaXRlX2J5dGVzLAorCXdyaXRlX2ZpbGUuCisKKwlOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gY29tcGF0IG1vZGUgYXMgd2VsbC4gSWYKKwl5b3UgbmVlZCB0byBiZSBjb21wYXRpYmxlIHdpdGggdGhlIG9sZCAyLjQuNS1tdWRsaWIsIHJlZGlyZWN0CisJdGhlc2UgY2FsbHMgdG8gdGhlIHZhbGlkX3JlYWQvdmFsaWRfd3JpdGUgaW4gdGhlIHVzZXIKKwlvYmplY3QuCisKK1NFRSBBTFNPCisJdmFsaWRfcmVhZChNKSwgbWFrZV9wYXRoX2Fic29sdXRlKE0pCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL01hdERCIGIvZG9jL21hdGVyaWFscy9NYXREQgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTM2NTg1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9NYXREQgpAQCAtMCwwICsxLDQyIEBACitEZXIgTWFzdGVyIGhhdCAoZXJzdG1hbCkga2VpbiBBZGRNYXRlcmlhbCBtZWhyLiBOZXVlIE1hdGVyaWFsaWVuIHdlcmRlbiBqZXR6dAorZ2FueiBlaW5mYWNoIGR1cmNoIGVpbmUgbmV1ZSBEYXRlaSBpbSBWZXJ6ZWljaG5pcyBtaXQgZGVuIE1hdGVyaWFsaWVuIHVuZCBkZW4KK0F1ZnJ1ZiBkZXIgVXBkYXRlKCktRnVua3Rpb24gaW4gZGVyIERhdGVuYmFuayBlcnpldWd0LiBEYXMgZ2xlaWNoZSBnaWx0IGZ1ZXIKK25ldWUgTWF0ZXJpYWxncnVwcGVuLgorTmFjaCBlaW5lbSBVcGRhdGUgc29sbHRlIG1hbiBkZW4gTWF0ZXJpYWxoZWFkZXIgdW5kIGRpZSBEb2t1IG5ldSBnZW5lcmllcmVuCit1bmQgZWluc3BpZWxlbiwgZGFtaXQgYWxsZXMgc2Nob2VuIGtvbnNpc3RlbnQgYmxlaWJ0IChhbmRlcnMgYWxzIGJpc2hlcikuCitEYXMgRm9ybWF0IGRlciBNYXRlcmlhbGRhdGVpZW4gc2NoYXV0IG1hbiBzaWNoIGFtIGJlc3RlbiBhbSBCZWlzcGllbCBhbi4KKworRGllIGFsdGVuIEZ1bmt0aW9uZW4gZGVzIE1hc3RlcnMgZXhpc3RpZXJlbiB3ZWl0ZXJoaW4uIEVzIGdpYnQgZWluIHBhYXIgbmV1ZSwKK3VtIGFiaGFlbmdpZ2UgRmlsZXMgenUgZXJ6ZXVnZW4gdW5kIGRpZSBEYXRlbmJhbmsgbmV1IGF1Znp1YmF1ZW46CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBVcGRhdGUoKQorCitFcm5ldXRlcyBFaW5sZXNlbiBkZXIgTWF0ZXJpYWxkYXRlbi4gRGFzIEVpbmxlc2VuIHBhc3NpZXJ0IGFzeW5jaHJvbiwgZmFsbHMgZXMKK3p1IGxhbmdlIGRhdWVydC4gTmFjaCBBYnNjaGx1c3MgZGVzIEVpbmxlc2VucyB3ZXJkZW4gZGllIG5ldWVuIERhdGVuIGFrdGl2LgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZhcmdhcmdzIHZvaWQgR2VuTWF0TGlzdChzdHJpbmcgZmlsZW5hbWUpCisKK0dlbmVyaWVydCBEYXRlaSBtaXQgcmVnaXN0cmllcnRlbiBNYXRlcmlhbGllbiBmdWVyIGRpZSBEb2t1bWVudGF0aW9uLiBGYWxscwora2VpbiBEYXRlaW5hbWUgYW5nZWdlYmVuIHdpcmQsIHdpcmQgIm1hdGVyaWFsbGlzdGUiIHZlcndlbmRldC4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2YXJnYXJncyB2b2lkIEdlbk1hdEdyb3VwTGlzdChzdHJpbmcgZmlsZW5hbWUpCisKK0dlbmVyaWVydCBEYXRlaSBtaXQgcmVnaXN0cmllcnRlbiBNYXRlcmlhbGdydXBwZW4gZnVlciBkaWUKK0Rva3VtZW50YXRpb24uIEZhbGxzIGtlaW4gRGF0ZWluYW1lIGFuZ2VnZWJlbiB3aXJkLCB3aXJkICJtYXRlcmlhbGdydXBwZW4iCit2ZXJ3ZW5kZXQuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordmFyZ2FyZ3Mgdm9pZCBHZW5IZWFkZXJGaWxlKHN0cmluZyBmaWxlbmFtZSkKKworR2VuZXJpZXJ0IERhdGVpIG1pdCBEZWZpbml0aW9uZW4gZGVyIG1vZWdsaWNoZW4gTWF0ZXJpYWxpZW4gdW5kIEdydXBwZW4uIERlcgorSW5oYWx0IGVudHNwcmljaHQgZGVyIGJpc2hlcmlnZW4gL3N5cy90aGluZy9tYXRlcmlhbC5oLiAgV2VubiBrZWluIERhdGVpbmFtZQorYW5nZWdlYmVuIHdpcmQsIHdpcmQgIm1hdGVyaWFsLmgiIHZlcndlbmRldC4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX0FDSURJQyBiL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX0FDSURJQwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2ZiOGU3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9ncm91cHMvTUFUR1JPVVBfQUNJRElDCkBAIC0wLDAgKzEsNSBAQAorR3J1cHBlbmlkOgorTUFUR1JPVVBfQUNJRElDCisKK05hbWU6CitTYWV1cmVuCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL2dyb3Vwcy9NQVRHUk9VUF9CQVNJQyBiL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX0JBU0lDCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNWIyMDgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL2dyb3Vwcy9NQVRHUk9VUF9CQVNJQwpAQCAtMCwwICsxLDUgQEAKK0dydXBwZW5pZDoKK01BVEdST1VQX0JBU0lDCisKK05hbWU6CitMYXVnZW4KZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX0JJTyBiL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX0JJTwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGZmODk5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9ncm91cHMvTUFUR1JPVVBfQklPCkBAIC0wLDAgKzEsNSBAQAorR3J1cHBlbmlkOgorTUFUR1JPVVBfQklPCisKK05hbWU6CitiaW9sb2dpc2NoZSBNYXRlcmlhbGllbgpkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9ncm91cHMvTUFUR1JPVVBfQ0xPVEggYi9kb2MvbWF0ZXJpYWxzL2dyb3Vwcy9NQVRHUk9VUF9DTE9USApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTRlZDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9ncm91cHMvTUFUR1JPVVBfQ0xPVEgKQEAgLTAsMCArMSw1IEBACitHcnVwcGVuaWQ6CitNQVRHUk9VUF9DTE9USAorCitOYW1lOgorU3RvZmZlCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL2dyb3Vwcy9NQVRHUk9VUF9DT05JRkVSX1dPT0QgYi9kb2MvbWF0ZXJpYWxzL2dyb3Vwcy9NQVRHUk9VUF9DT05JRkVSX1dPT0QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVmZjViMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX0NPTklGRVJfV09PRApAQCAtMCwwICsxLDUgQEAKK0dydXBwZW5pZDoKK01BVEdST1VQX0NPTklGRVJfV09PRAorCitOYW1lOgorTmFkZWxob2VsemVyCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL2dyb3Vwcy9NQVRHUk9VUF9ERUFEIGIvZG9jL21hdGVyaWFscy9ncm91cHMvTUFUR1JPVVBfREVBRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWUzM2E3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9ncm91cHMvTUFUR1JPVVBfREVBRApAQCAtMCwwICsxLDUgQEAKK0dydXBwZW5pZDoKK01BVEdST1VQX0RFQUQKKworTmFtZToKK1VlYmVycmVzdGUgdm9uIExlYmV3ZXNlbgpkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9ncm91cHMvTUFUR1JPVVBfREVDSURVT1VTX1dPT0QgYi9kb2MvbWF0ZXJpYWxzL2dyb3Vwcy9NQVRHUk9VUF9ERUNJRFVPVVNfV09PRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzljNGRjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9ncm91cHMvTUFUR1JPVVBfREVDSURVT1VTX1dPT0QKQEAgLTAsMCArMSw1IEBACitHcnVwcGVuaWQ6CitNQVRHUk9VUF9ERUNJRFVPVVNfV09PRAorCitOYW1lOgorTGF1YmhvZWx6ZXIKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX0RSVUcgYi9kb2MvbWF0ZXJpYWxzL2dyb3Vwcy9NQVRHUk9VUF9EUlVHCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1OWIyMzIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL2dyb3Vwcy9NQVRHUk9VUF9EUlVHCkBAIC0wLDAgKzEsNSBAQAorR3J1cHBlbmlkOgorTUFUR1JPVVBfRFJVRworCitOYW1lOgorRHJvZ2VuIHVuZCBIZWlsdHJhZW5rZQpkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9ncm91cHMvTUFUR1JPVVBfRUFUQUJMRSBiL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX0VBVEFCTEUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU0ZWRkNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX0VBVEFCTEUKQEAgLTAsMCArMSw1IEBACitHcnVwcGVuaWQ6CitNQVRHUk9VUF9FQVRBQkxFCisKK05hbWU6CitFc3NiYXJlcwpkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9ncm91cHMvTUFUR1JPVVBfRUxFQ1RSSUNBTCBiL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX0VMRUNUUklDQUwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRkM2JiNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX0VMRUNUUklDQUwKQEAgLTAsMCArMSw1IEBACitHcnVwcGVuaWQ6CitNQVRHUk9VUF9FTEVDVFJJQ0FMCisKK05hbWU6CitnZWxhZGVuZSBNYXRlcmlhbGllbgpkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9ncm91cHMvTUFUR1JPVVBfRUxFTUVOVEFMIGIvZG9jL21hdGVyaWFscy9ncm91cHMvTUFUR1JPVVBfRUxFTUVOVEFMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MjM0MzcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL2dyb3Vwcy9NQVRHUk9VUF9FTEVNRU5UQUwKQEAgLTAsMCArMSw1IEBACitHcnVwcGVuaWQ6CitNQVRHUk9VUF9FTEVNRU5UQUwKKworTmFtZToKKyhhbHRlcnR1ZW1saWNoZSkgRWxlbWVudGUKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX0VYUExPU0lWRSBiL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX0VYUExPU0lWRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjRkMjA4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9ncm91cHMvTUFUR1JPVVBfRVhQTE9TSVZFCkBAIC0wLDAgKzEsNSBAQAorR3J1cHBlbmlkOgorTUFUR1JPVVBfRVhQTE9TSVZFCisKK05hbWU6CitTcHJlbmdzdG9mZmUKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX0ZMRVhJQkxFIGIvZG9jL21hdGVyaWFscy9ncm91cHMvTUFUR1JPVVBfRkxFWElCTEUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkxMTQzZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX0ZMRVhJQkxFCkBAIC0wLDAgKzEsNSBAQAorR3J1cHBlbmlkOgorTUFUR1JPVVBfRkxFWElCTEUKKworTmFtZToKK2JpZWdzYW1lIE1hdGVyaWFsaWVuCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL2dyb3Vwcy9NQVRHUk9VUF9GTFVJRCBiL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX0ZMVUlECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZjc0ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL2dyb3Vwcy9NQVRHUk9VUF9GTFVJRApAQCAtMCwwICsxLDUgQEAKK0dydXBwZW5pZDoKK01BVEdST1VQX0ZMVUlECisKK05hbWU6CitGbHVlc3NpZ2tlaXRlbgpkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9ncm91cHMvTUFUR1JPVVBfR0FTIGIvZG9jL21hdGVyaWFscy9ncm91cHMvTUFUR1JPVVBfR0FTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZDI0MzYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL2dyb3Vwcy9NQVRHUk9VUF9HQVMKQEAgLTAsMCArMSw1IEBACitHcnVwcGVuaWQ6CitNQVRHUk9VUF9HQVMKKworTmFtZToKK0dhc2UKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX0hFUkJBTCBiL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX0hFUkJBTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDdiNDA4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9ncm91cHMvTUFUR1JPVVBfSEVSQkFMCkBAIC0wLDAgKzEsNSBAQAorR3J1cHBlbmlkOgorTUFUR1JPVVBfSEVSQkFMCisKK05hbWU6CitwZmxhbnpsaWNoZSBNYXRlcmlhbGllbgpkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9ncm91cHMvTUFUR1JPVVBfSE9MWSBiL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX0hPTFkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYwOWMyYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX0hPTFkKQEAgLTAsMCArMSw1IEBACitHcnVwcGVuaWQ6CitNQVRHUk9VUF9IT0xZCisKK05hbWU6CitoZWlsaWdlIE1hdGVyaWFsaWVuCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL2dyb3Vwcy9NQVRHUk9VUF9JTkZMQU1NQUJMRSBiL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX0lORkxBTU1BQkxFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlODc1MzcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL2dyb3Vwcy9NQVRHUk9VUF9JTkZMQU1NQUJMRQpAQCAtMCwwICsxLDUgQEAKK0dydXBwZW5pZDoKK01BVEdST1VQX0lORkxBTU1BQkxFCisKK05hbWU6CitlbnRmbGFtbWJhcmUgTWF0ZXJpYWxpZW4KZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX0lOVklTIGIvZG9jL21hdGVyaWFscy9ncm91cHMvTUFUR1JPVVBfSU5WSVMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQxYmFlZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX0lOVklTCkBAIC0wLDAgKzEsNSBAQAorR3J1cHBlbmlkOgorTUFUR1JPVVBfSU5WSVMKKworTmFtZToKK3Vuc2ljaHRiYXJlIE1hdGVyaWFsaWVuCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL2dyb3Vwcy9NQVRHUk9VUF9KRVdFTCBiL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX0pFV0VMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYWIzOTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL2dyb3Vwcy9NQVRHUk9VUF9KRVdFTApAQCAtMCwwICsxLDUgQEAKK0dydXBwZW5pZDoKK01BVEdST1VQX0pFV0VMCisKK05hbWU6CitFZGVsc3RlaW5lCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL2dyb3Vwcy9NQVRHUk9VUF9MSVZJTkcgYi9kb2MvbWF0ZXJpYWxzL2dyb3Vwcy9NQVRHUk9VUF9MSVZJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMwMjQ2MgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX0xJVklORwpAQCAtMCwwICsxLDUgQEAKK0dydXBwZW5pZDoKK01BVEdST1VQX0xJVklORworCitOYW1lOgorTGViZXdlc2VuCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL2dyb3Vwcy9NQVRHUk9VUF9NQUdJQyBiL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX01BR0lDCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYjgyODcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL2dyb3Vwcy9NQVRHUk9VUF9NQUdJQwpAQCAtMCwwICsxLDUgQEAKK0dydXBwZW5pZDoKK01BVEdST1VQX01BR0lDCisKK05hbWU6CitNYWdpc2NoZXMKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX01BR05FVElDIGIvZG9jL21hdGVyaWFscy9ncm91cHMvTUFUR1JPVVBfTUFHTkVUSUMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQzYzNiMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX01BR05FVElDCkBAIC0wLDAgKzEsNSBAQAorR3J1cHBlbmlkOgorTUFUR1JPVVBfTUFHTkVUSUMKKworTmFtZToKK2FuemllaGVuZGUgTWF0ZXJpYWxpZW4KZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX01FVEFMIGIvZG9jL21hdGVyaWFscy9ncm91cHMvTUFUR1JPVVBfTUVUQUwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM5NzlhZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX01FVEFMCkBAIC0wLDAgKzEsNSBAQAorR3J1cHBlbmlkOgorTUFUR1JPVVBfTUVUQUwKKworTmFtZToKK01ldGFsbGUKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX01JTkVSQUwgYi9kb2MvbWF0ZXJpYWxzL2dyb3Vwcy9NQVRHUk9VUF9NSU5FUkFMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZWRhNGMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL2dyb3Vwcy9NQVRHUk9VUF9NSU5FUkFMCkBAIC0wLDAgKzEsNSBAQAorR3J1cHBlbmlkOgorTUFUR1JPVVBfTUlORVJBTAorCitOYW1lOgorTWluZXJhbGllbgpkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9ncm91cHMvTUFUR1JPVVBfTUlTQyBiL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX01JU0MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE5YzdkOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX01JU0MKQEAgLTAsMCArMSw1IEBACitHcnVwcGVuaWQ6CitNQVRHUk9VUF9NSVNDCisKK05hbWU6Cit2ZXJzY2hpZWRlbmUgTWF0ZXJpYWxpZW4sIGRpZSBuaWNodCBuYWVoZXIgenVnZW9yZG5ldCBzaW5kIChhbHMgZmVzdCwgZmx1ZXNzaWcsIGdhc2ZvZXJtaWcpCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL2dyb3Vwcy9NQVRHUk9VUF9QQVBFUiBiL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX1BBUEVSCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZWQ1MDcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL2dyb3Vwcy9NQVRHUk9VUF9QQVBFUgpAQCAtMCwwICsxLDUgQEAKK0dydXBwZW5pZDoKK01BVEdST1VQX1BBUEVSCisKK05hbWU6CitQYXBpZXJhZWhsaWNoZXMKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX1BPSVNPTk9VUyBiL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX1BPSVNPTk9VUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjJlMjZjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9ncm91cHMvTUFUR1JPVVBfUE9JU09OT1VTCkBAIC0wLDAgKzEsNSBAQAorR3J1cHBlbmlkOgorTUFUR1JPVVBfUE9JU09OT1VTCisKK05hbWU6CitHaWZ0ZQpkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9ncm91cHMvTUFUR1JPVVBfUFJFQ0lPVVNfTUVUQUwgYi9kb2MvbWF0ZXJpYWxzL2dyb3Vwcy9NQVRHUk9VUF9QUkVDSU9VU19NRVRBTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDBmYjFhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9ncm91cHMvTUFUR1JPVVBfUFJFQ0lPVVNfTUVUQUwKQEAgLTAsMCArMSw1IEBACitHcnVwcGVuaWQ6CitNQVRHUk9VUF9QUkVDSU9VU19NRVRBTAorCitOYW1lOgorRWRlbG1ldGFsbGUKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX1JBRElPQUNUSVZFIGIvZG9jL21hdGVyaWFscy9ncm91cHMvTUFUR1JPVVBfUkFESU9BQ1RJVkUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYyYmUxOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX1JBRElPQUNUSVZFCkBAIC0wLDAgKzEsNSBAQAorR3J1cHBlbmlkOgorTUFUR1JPVVBfUkFESU9BQ1RJVkUKKworTmFtZToKK1VuYmVzY2hyZWlibGljaGVzCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL2dyb3Vwcy9NQVRHUk9VUF9TT0xJRCBiL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX1NPTElECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMDFkZGIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL2dyb3Vwcy9NQVRHUk9VUF9TT0xJRApAQCAtMCwwICsxLDUgQEAKK0dydXBwZW5pZDoKK01BVEdST1VQX1NPTElECisKK05hbWU6CitmZXN0ZSBNYXRlcmlhbGllbgpkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9ncm91cHMvTUFUR1JPVVBfU1RPTkUgYi9kb2MvbWF0ZXJpYWxzL2dyb3Vwcy9NQVRHUk9VUF9TVE9ORQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTc2ZTVjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9ncm91cHMvTUFUR1JPVVBfU1RPTkUKQEAgLTAsMCArMSw1IEBACitHcnVwcGVuaWQ6CitNQVRHUk9VUF9TVE9ORQorCitOYW1lOgorU3RlaW5lCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL2dyb3Vwcy9NQVRHUk9VUF9UUk9QSUNBTF9XT09EIGIvZG9jL21hdGVyaWFscy9ncm91cHMvTUFUR1JPVVBfVFJPUElDQUxfV09PRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmZhMDcyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9ncm91cHMvTUFUR1JPVVBfVFJPUElDQUxfV09PRApAQCAtMCwwICsxLDUgQEAKK0dydXBwZW5pZDoKK01BVEdST1VQX1RST1BJQ0FMX1dPT0QKKworTmFtZToKK1Ryb3BlbmhvZWx6ZXIKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX1VOSE9MWSBiL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX1VOSE9MWQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGQ5NjFiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9ncm91cHMvTUFUR1JPVVBfVU5IT0xZCkBAIC0wLDAgKzEsNSBAQAorR3J1cHBlbmlkOgorTUFUR1JPVVBfVU5IT0xZCisKK05hbWU6CitkYWVtb25pc2NoZSBNYXRlcmlhbGllbgpkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9ncm91cHMvTUFUR1JPVVBfV09PRCBiL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX1dPT0QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ2NmQxZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvZ3JvdXBzL01BVEdST1VQX1dPT0QKQEAgLTAsMCArMSw1IEBACitHcnVwcGVuaWQ6CitNQVRHUk9VUF9XT09ECisKK05hbWU6CitIb2VsemVyCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQURBTUFOVCBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9BREFNQU5UCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYjQzNWMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQURBTUFOVApAQCAtMCwwICsxLDIwIEBACitNYXRlcmlhbGlkOgorTUFUX0FEQU1BTlQgICAgICAgICAgICAgICJhZGFtYW50IgorCitOYW1lOgorIkFkYW1hbnQiICJBZGFtYW50cyIgIkFkYW1hbnQiICJBZGFtYW50IgorCitHZXNjaGxlY2h0OgorTgorCitCZXNjaHJlaWJ1bmc6CitoYXJ0ZXMgRWxmZW5tZXRhbGwKKworRXJrZW5uYmFya2VpdDoKK01BVF9NSVNDX01FVEFMOjEwCitNQVRfQURBTUFOVAorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9NRVRBTDoxMDAKK01BVEdST1VQX1BSRUNJT1VTX01FVEFMOjEwMAorTUFUR1JPVVBfU09MSUQ6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQUdBVEUgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQUdBVEUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU0NTZjNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9BR0FURQpAQCAtMCwwICsxLDIxIEBACitNYXRlcmlhbGlkOgorTUFUX0FHQVRFICAgICAgICAgICAgICAgICJhZ2F0ZSIKKworTmFtZToKKyJBY2hhdCIgIkFjaGF0cyIgIkFjaGF0IiAiQWNoYXQiCisKK0dlc2NobGVjaHQ6CitNCisKK0Jlc2NocmVpYnVuZzoKK0ZhcmJzcGllbAorCitFcmtlbm5iYXJrZWl0OgorTUFUX01JU0NfTUlORVJBTDowCitNQVRfUVVBUlRaOjIwCitNQVRfQUdBVEUKKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfTUlORVJBTDoxMDAKK01BVEdST1VQX1NUT05FOjEwMAorTUFUR1JPVVBfU09MSUQ6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQUlSIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0FJUgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWQ0YTgwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0FJUgpAQCAtMCwwICsxLDE5IEBACitNYXRlcmlhbGlkOgorTUFUX0FJUiAgICAgICAgICAgICAgICAgICJhaXIiCisKK05hbWU6CisiTHVmdCIgIkx1ZnQiICJMdWZ0IiAiTHVmdCIKKworR2VzY2hsZWNodDoKK0YKKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX0dBUzoxMDAKK01BVEdST1VQX0lOVklTOjEwMAorTUFUR1JPVVBfRUxFTUVOVEFMOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0FMQ09IT0wgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQUxDT0hPTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWY4MGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0FMQ09IT0wKQEAgLTAsMCArMSwxOCBAQAorTWF0ZXJpYWxpZDoKK01BVF9BTENPSE9MICAgICAgICAgICAgICAiYWxjb2hvbCIKKworTmFtZToKKyJBbGtvaG9sIiAiQWxrb2hvbHMiICJBbGtvaG9sIiAiQWxrb2hvbCIKKworR2VzY2hsZWNodDoKK00KKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX0lORkxBTU1BQkxFOjEwMAorTUFUR1JPVVBfRkxVSUQ6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQUxVTUlOSVVNIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0FMVU1JTklVTQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2IyODJkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0FMVU1JTklVTQpAQCAtMCwwICsxLDIwIEBACitNYXRlcmlhbGlkOgorTUFUX0FMVU1JTklVTSAgICAgICAgICAgICJBbCIKKworTmFtZToKKyJBbHVtaW5pdW0iICJBbHVtaW5pdW1zIiAiQWx1bWluaXVtIiAiQWx1bWluaXVtIgorCitHZXNjaGxlY2h0OgorTgorCitCZXNjaHJlaWJ1bmc6Cit3ZWljaCBiZWhhbmRlbHQgaGFydAorCitFcmtlbm5iYXJrZWl0OgorTUFUX01JU0NfTUVUQUw6MAorTUFUX1NJTFZFUjoxNQorTUFUX0FMVU1JTklVTQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9NRVRBTDoxMDAKK01BVEdST1VQX1NPTElEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0FNQkVSIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0FNQkVSCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYTllZTAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQU1CRVIKQEAgLTAsMCArMSwyMiBAQAorTWF0ZXJpYWxpZDoKK01BVF9BTUJFUiAgICAgICAgICAgICAgICAiYW1iZXIiCisKK05hbWU6CisiQmVybnN0ZWluIiAiQmVybnN0ZWlucyIgIkJlcm5zdGVpbiIgIkJlcm5zdGVpbiIKKworR2VzY2hsZWNodDoKK00KKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX01JTkVSQUw6MTAwCitNQVRHUk9VUF9KRVdFTDoxMDAKK01BVEdST1VQX0JJTzoxMDAKK01BVEdST1VQX1NUT05FOjEwMAorTUFUR1JPVVBfU09MSUQ6MTAwCitNQVRHUk9VUF9ERUFEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0FNRVRIWVNUIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0FNRVRIWVNUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2Y2RkNTMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQU1FVEhZU1QKQEAgLTAsMCArMSwyMSBAQAorTWF0ZXJpYWxpZDoKK01BVF9BTUVUSFlTVCAgICAgICAgICAgICAiYW1ldGh5c3QiCisKK05hbWU6CisiQW1ldGh5c3QiICJBbWV0aHlzdHMiICJBbWV0aHlzdCIgIkFtZXRoeXN0IgorCitHZXNjaGxlY2h0OgorTQorCitCZXNjaHJlaWJ1bmc6Cit2aW9sZXR0IChRdWFyeikKKworRXJrZW5uYmFya2VpdDoKK01BVF9NSVNDX0pFV0VMOjI1CitNQVRfQU1FVEhZU1QKKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfTUlORVJBTDoxMDAKK01BVEdST1VQX0pFV0VMOjEwMAorTUFUR1JPVVBfU1RPTkU6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9BTlRJTU9OIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0FOVElNT04KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIzMTFmNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9BTlRJTU9OCkBAIC0wLDAgKzEsMjAgQEAKK01hdGVyaWFsaWQ6CitNQVRfQU5USU1PTiAgICAgICAgICAgICAgImFudGltb24iCisKK05hbWU6CisiQW50aW1vbiIgIkFudGltb25zIiAiQW50aW1vbiIgIkFudGltb24iCisKK0dlc2NobGVjaHQ6CitOCisKK0Jlc2NocmVpYnVuZzoKK3dlaWNoLCBzcHJvZWRlLCBzaWxiZXJ3ZWlzcworCitFcmtlbm5iYXJrZWl0OgorTUFUX01JU0NfTUVUQUw6MAorTUFUX1NJTFZFUjoxNQorTUFUX0FOVElNT04KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfTUVUQUw6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9BUVVBTUFSSU5FIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0FRVUFNQVJJTkUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQwMTQxMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9BUVVBTUFSSU5FCkBAIC0wLDAgKzEsMjEgQEAKK01hdGVyaWFsaWQ6CitNQVRfQVFVQU1BUklORSAgICAgICAgICAgImFxdWFtYXJpbmUiCisKK05hbWU6CisiQXF1YW1hcmluIiAiQXF1YW1hcmlucyIgIkFxdWFtYXJpbiIgIkFxdWFtYXJpbiIKKworR2VzY2hsZWNodDoKK00KKworQmVzY2hyZWlidW5nOgorYmxhdQorCitFcmtlbm5iYXJrZWl0OgorTUFUX01JU0NfSkVXRUw6MjUKK01BVF9BUVVBTUFSSU5FCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX01JTkVSQUw6MTAwCitNQVRHUk9VUF9KRVdFTDoxMDAKK01BVEdST1VQX1NUT05FOjEwMAorTUFUR1JPVVBfU09MSUQ6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQVJTRU5JQyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9BUlNFTklDCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMTJlYjcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQVJTRU5JQwpAQCAtMCwwICsxLDIxIEBACitNYXRlcmlhbGlkOgorTUFUX0FSU0VOSUMgICAgICAgICAgICAgICJhcnNlbmljIgorCitOYW1lOgorIkFyc2VuIiAiQXJzZW5zIiAiQXJzZW4iICJBcnNlbiIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorZ2lmdGlnZXMgSGFsYm1ldGFsbAorCitFcmtlbm5iYXJrZWl0OgorTUFUX1NBTFQ6NTAKK01BVF9NSVNDX01FVEFMOjY2CitNQVRfQVJTRU5JQworCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9QT0lTT05PVVM6MTAwCitNQVRHUk9VUF9NRVRBTDoxMDAKK01BVEdST1VQX1NPTElEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0FTQkVTVE9TIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0FTQkVTVE9TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNWI1NDYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQVNCRVNUT1MKQEAgLTAsMCArMSwyMCBAQAorTWF0ZXJpYWxpZDoKK01BVF9BU0JFU1RPUyAgICAgICAgICAgICAiYXNiZXN0b3MiCisKK05hbWU6CisiQXNiZXN0IiAiQXNiZXN0cyIgIkFzYmVzdCIgIkFzYmVzdCIKKworR2VzY2hsZWNodDoKK00KKworQmVzY2hyZWlidW5nOgorZ3JhdXdlaXNzCisKK0Vya2VubmJhcmtlaXQ6CistIGtlaW5lIEVpbnNjaHJhZW5rdW5nIC0KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfUE9JU09OT1VTOjEwMAorTUFUR1JPVVBfTUlORVJBTDoxMDAKK01BVEdST1VQX1NUT05FOjEwMAorTUFUR1JPVVBfU09MSUQ6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQVNIX1dPT0QgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQVNIX1dPT0QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMxYzFkZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9BU0hfV09PRApAQCAtMCwwICsxLDI2IEBACitNYXRlcmlhbGlkOgorTUFUX0FTSF9XT09EICAgICAgICAgICAgICJhc2hfd29vZCIKKworTmFtZToKKyJFc2NoZW5ob2x6IiAiRXNjaGVuaG9semVzIiAiRXNjaGVuaG9seiIgIkVzY2hlbmhvbHoiCisKK0dlc2NobGVjaHQ6CitOCisKK0Jlc2NocmVpYnVuZzoKK2ZsZXhpYmVsLCBtYWdpc2NoCisKK0Vya2VubmJhcmtlaXQ6CitNQVRfTUlTQ19ERUNJRFVPVVNfV09PRDoxNQorTUFUX0FTSF9XT09ECisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX0lORkxBTU1BQkxFOjEwMAorTUFUR1JPVVBfTUFHSUM6MTAwCitNQVRHUk9VUF9CSU86MTAwCitNQVRHUk9VUF9IRVJCQUw6MTAwCitNQVRHUk9VUF9GTEVYSUJMRToxMDAKK01BVEdST1VQX0RFQ0lEVU9VU19XT09EOjEwMAorTUFUR1JPVVBfU09MSUQ6MTAwCitNQVRHUk9VUF9XT09EOjEwMAorTUFUR1JPVVBfREVBRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9BU1BIQUxUIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0FTUEhBTFQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIwM2U0ZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9BU1BIQUxUCkBAIC0wLDAgKzEsMTggQEAKK01hdGVyaWFsaWQ6CitNQVRfQVNQSEFMVCAgICAgICAgICAgICAgImFzcGhhbHQiCisKK05hbWU6CisiQXNwaGFsdCIgIkFzcGhhbHRzIiAiQXNwaGFsdCIgIkFzcGhhbHQiCisKK0dlc2NobGVjaHQ6CitNCisKK0Jlc2NocmVpYnVuZzoKKy0gbmljaHQgdm9yaGFuZGVuIC0KKworRXJrZW5uYmFya2VpdDoKKy0ga2VpbmUgRWluc2NocmFlbmt1bmcgLQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9TVE9ORToxMDAKK01BVEdST1VQX1NPTElEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0FTUElSSU4gYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQVNQSVJJTgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTdhNmNjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0FTUElSSU4KQEAgLTAsMCArMSwxOSBAQAorTWF0ZXJpYWxpZDoKK01BVF9BU1BJUklOICAgICAgICAgICAgICAiYXNwaXJpbiIKKworTmFtZToKKyJBc3BpcmluIiAiQXNwaXJpbnMiICJBc3BpcmluIiAiQXNwaXJpbiIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorTUFUX1NBTFQ6NTAKK01BVF9BU1BJUklOCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX1NPTElEOjEwMAorTUFUR1JPVVBfRFJVRzoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9CQUxTQSBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9CQUxTQQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjNhZjRhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0JBTFNBCkBAIC0wLDAgKzEsMjMgQEAKK01hdGVyaWFsaWQ6CitNQVRfQkFMU0EgICAgICAgICAgICAgICAgImJhbHNhIgorCitOYW1lOgorIkJhbHNhaG9seiIgIkJhbHNhaG9semVzIiAiQmFsc2Fob2x6IiAiQmFsc2Fob2x6IgorCitHZXNjaGxlY2h0OgorTgorCitCZXNjaHJlaWJ1bmc6Cit3ZWljaGVyL2xlaWNodGVyIGFscyBLb3JrCisKK0Vya2VubmJhcmtlaXQ6CistIGtlaW5lIEVpbnNjaHJhZW5rdW5nIC0KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfSU5GTEFNTUFCTEU6MTAwCitNQVRHUk9VUF9CSU86MTAwCitNQVRHUk9VUF9IRVJCQUw6MTAwCitNQVRHUk9VUF9UUk9QSUNBTF9XT09EOjEwMAorTUFUR1JPVVBfU09MSUQ6MTAwCitNQVRHUk9VUF9XT09EOjEwMAorTUFUR1JPVVBfREVBRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9CQVJZVCBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9CQVJZVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTZmZmEyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0JBUllUCkBAIC0wLDAgKzEsMjEgQEAKK01hdGVyaWFsaWQ6CitNQVRfQkFSWVQgICAgICAgICAgICAgICAgImJhcnl0IgorCitOYW1lOgorIlNjaHdlcnNwYXQiICJTY2h3ZXJzcGF0ZXMiICJTY2h3ZXJzcGF0IiAiU2Nod2Vyc3BhdCIKKworR2VzY2hsZWNodDoKK00KKworQmVzY2hyZWlidW5nOgord2Vpc3MsIGhvaGUgRGljaHRlCisKK0Vya2VubmJhcmtlaXQ6CitNQVRfTUlTQ19NSU5FUkFMOjMzCitNQVRfT1JUSE9LTEFTOjUwCitNQVRfQkFSWVQKKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfTUlORVJBTDoxMDAKK01BVEdST1VQX1NUT05FOjEwMAorTUFUR1JPVVBfU09MSUQ6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQkFTQUxUIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0JBU0FMVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODU4ODMwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0JBU0FMVApAQCAtMCwwICsxLDE4IEBACitNYXRlcmlhbGlkOgorTUFUX0JBU0FMVCAgICAgICAgICAgICAgICJiYXNhbHQiCisKK05hbWU6CisiQmFzYWx0IiAiQmFzYWx0cyIgIkJhc2FsdCIgIkJhc2FsdCIKKworR2VzY2hsZWNodDoKK00KKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX1NUT05FOjEwMAorTUFUR1JPVVBfU09MSUQ6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQkVFQ0ggYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQkVFQ0gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVhZjgxNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9CRUVDSApAQCAtMCwwICsxLDI0IEBACitNYXRlcmlhbGlkOgorTUFUX0JFRUNIICAgICAgICAgICAgICAgICJiZWVjaCIKKworTmFtZToKKyJCdWNoZW5ob2x6IiAiQnVjaGVuaG9semVzIiAiQnVjaGVuaG9seiIgIkJ1Y2hlbmhvbHoiCisKK0dlc2NobGVjaHQ6CitOCisKK0Jlc2NocmVpYnVuZzoKK2hhcnQsIHJvZXRsaWNoCisKK0Vya2VubmJhcmtlaXQ6CitNQVRfTUlTQ19ERUNJRFVPVVNfV09PRDo1CitNQVRfQkVFQ0gKKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfSU5GTEFNTUFCTEU6MTAwCitNQVRHUk9VUF9CSU86MTAwCitNQVRHUk9VUF9IRVJCQUw6MTAwCitNQVRHUk9VUF9ERUNJRFVPVVNfV09PRDoxMDAKK01BVEdST1VQX1NPTElEOjEwMAorTUFUR1JPVVBfV09PRDoxMDAKK01BVEdST1VQX0RFQUQ6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQklSQ0ggYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQklSQ0gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I5NTBjNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9CSVJDSApAQCAtMCwwICsxLDI0IEBACitNYXRlcmlhbGlkOgorTUFUX0JJUkNIICAgICAgICAgICAgICAgICJiaXJjaCIKKworTmFtZToKKyJCaXJrZW5ob2x6IiAiQmlya2VuaG9semVzIiAiQmlya2VuaG9seiIgIkJpcmtlbmhvbHoiCisKK0dlc2NobGVjaHQ6CitOCisKK0Jlc2NocmVpYnVuZzoKK21hZ2lzY2gsIHphZWgsIHN1ZXNzCisKK0Vya2VubmJhcmtlaXQ6CitNQVRfTUlTQ19ERUNJRFVPVVNfV09PRDo1CitNQVRfQklSQ0gKKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfSU5GTEFNTUFCTEU6MTAwCitNQVRHUk9VUF9CSU86MTAwCitNQVRHUk9VUF9IRVJCQUw6MTAwCitNQVRHUk9VUF9ERUNJRFVPVVNfV09PRDoxMDAKK01BVEdST1VQX1NPTElEOjEwMAorTUFUR1JPVVBfV09PRDoxMDAKK01BVEdST1VQX0RFQUQ6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQkxPT0QgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQkxPT0QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y0YjJiMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9CTE9PRApAQCAtMCwwICsxLDE5IEBACitNYXRlcmlhbGlkOgorTUFUX0JMT09EICAgICAgICAgICAgICAgICJibG9vZCIKKworTmFtZToKKyJCbHV0IiAiQmx1dHMiICJCbHV0IiAiQmx1dCIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX0JJTzoxMDAKK01BVEdST1VQX0ZMVUlEOjEwMAorTUFUR1JPVVBfREVBRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9CT05FIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0JPTkUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgwMDgyMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9CT05FCkBAIC0wLDAgKzEsMTkgQEAKK01hdGVyaWFsaWQ6CitNQVRfQk9ORSAgICAgICAgICAgICAgICAgImJvbmUiCisKK05hbWU6CisiS25vY2hlbiIgIktub2NoZW5zIiAiS25vY2hlbiIgIktub2NoZW4iCisKK0dlc2NobGVjaHQ6CitNCisKK0Jlc2NocmVpYnVuZzoKKy0gbmljaHQgdm9yaGFuZGVuIC0KKworRXJrZW5uYmFya2VpdDoKKy0ga2VpbmUgRWluc2NocmFlbmt1bmcgLQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9CSU86MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKK01BVEdST1VQX0RFQUQ6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQlJBU1MgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQlJBU1MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUyZjRkNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9CUkFTUwpAQCAtMCwwICsxLDIwIEBACitNYXRlcmlhbGlkOgorTUFUX0JSQVNTICAgICAgICAgICAgICAgICJicmFzcyIKKworTmFtZToKKyJNZXNzaW5nIiAiTWVzc2luZ3MiICJNZXNzaW5nIiAiTWVzc2luZyIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorYmlzIDgwJSBLdXBmZXIsIFJlc3QgWmluaworCitFcmtlbm5iYXJrZWl0OgorTUFUX01JU0NfTUVUQUw6MAorTUFUX0dPTEQ6MTUKK01BVF9CUkFTUworCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9NRVRBTDoxMDAKK01BVEdST1VQX1NPTElEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0JST05DRSBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9CUk9OQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU3ZDI0ZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9CUk9OQ0UKQEAgLTAsMCArMSwxOCBAQAorTWF0ZXJpYWxpZDoKK01BVF9CUk9OQ0UgICAgICAgICAgICAgICAiYnJvbmNlIgorCitOYW1lOgorIkJyb256ZSIgIkJyb256ZSIgIkJyb256ZSIgIkJyb256ZSIKKworR2VzY2hsZWNodDoKK0YKKworQmVzY2hyZWlidW5nOgorS3VwZmVybGVnaWVydW5nIChtaXQgWmlubikKKworRXJrZW5uYmFya2VpdDoKKy0ga2VpbmUgRWluc2NocmFlbmt1bmcgLQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9NRVRBTDoxMDAKK01BVEdST1VQX1NPTElEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0JSVVlFUkUgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQlJVWUVSRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Nzk1MDBhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0JSVVlFUkUKQEAgLTAsMCArMSwyNCBAQAorTWF0ZXJpYWxpZDoKK01BVF9CUlVZRVJFICAgICAgICAgICAgICAiYnJ1eWVyZSIKKworTmFtZToKKyJCcnV5ZXJlaG9seiIgIkJydXllcmVob2x6ZXMiICJCcnV5ZXJlaG9seiIgIkJydXllcmVob2x6IgorCitHZXNjaGxlY2h0OgorTgorCitCZXNjaHJlaWJ1bmc6CitzZWhyIGhhcnQgdW5kIHphZWgsIGZ1ZXIgUGZlaWZlbgorCitFcmtlbm5iYXJrZWl0OgorTUFUX01JU0NfREVDSURVT1VTX1dPT0Q6NQorTUFUX0JSVVlFUkUKKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfSU5GTEFNTUFCTEU6MTAwCitNQVRHUk9VUF9CSU86MTAwCitNQVRHUk9VUF9IRVJCQUw6MTAwCitNQVRHUk9VUF9ERUNJRFVPVVNfV09PRDoxMDAKK01BVEdST1VQX1NPTElEOjEwMAorTUFUR1JPVVBfV09PRDoxMDAKK01BVEdST1VQX0RFQUQ6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQ0FOTkFCSVMgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQ0FOTkFCSVMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgxY2QzOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9DQU5OQUJJUwpAQCAtMCwwICsxLDIxIEBACitNYXRlcmlhbGlkOgorTUFUX0NBTk5BQklTICAgICAgICAgICAgICJjYW5uYWJpcyIKKworTmFtZToKKyJIYW5mIiAiSGFuZnMiICJIYW5mIiAiSGFuZiIKKworR2VzY2hsZWNodDoKK00KKworQmVzY2hyZWlidW5nOgorYXVjaCBUSEMKKworRXJrZW5uYmFya2VpdDoKK01BVF9NSVNDX0hFUkJBTDozMworTUFUX0NBTk5BQklTCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX0hFUkJBTDoxMDAKK01BVEdST1VQX0ZMRVhJQkxFOjEwMAorTUFUR1JPVVBfU09MSUQ6MTAwCitNQVRHUk9VUF9EUlVHOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0NBUkJPTiBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9DQVJCT04KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVhMDVhMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9DQVJCT04KQEAgLTAsMCArMSwxOCBAQAorTWF0ZXJpYWxpZDoKK01BVF9DQVJCT04gICAgICAgICAgICAgICAiQyIKKworTmFtZToKKyJLb2hsZW5zdG9mZiIgIktvaGxlbnN0b2ZmcyIgIktvaGxlbnN0b2ZmIiAiS29obGVuc3RvZmYiCisKK0dlc2NobGVjaHQ6CitNCisKK0Jlc2NocmVpYnVuZzoKKy0gbmljaHQgdm9yaGFuZGVuIC0KKworRXJrZW5uYmFya2VpdDoKKy0ga2VpbmUgRWluc2NocmFlbmt1bmcgLQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9JTkZMQU1NQUJMRToxMDAKK01BVEdST1VQX1NPTElEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0NBUlRPTiBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9DQVJUT04KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhjODM2YwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9DQVJUT04KQEAgLTAsMCArMSwyMCBAQAorTWF0ZXJpYWxpZDoKK01BVF9DQVJUT04gICAgICAgICAgICAgICAiY2FydG9uIgorCitOYW1lOgorIlBhcHBlIiAiUGFwcGUiICJQYXBwZSIgIlBhcHBlIgorCitHZXNjaGxlY2h0OgorRgorCitCZXNjaHJlaWJ1bmc6CistIG5pY2h0IHZvcmhhbmRlbiAtCisKK0Vya2VubmJhcmtlaXQ6CistIGtlaW5lIEVpbnNjaHJhZW5rdW5nIC0KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfSU5GTEFNTUFCTEU6MTAwCitNQVRHUk9VUF9CSU86MTAwCitNQVRHUk9VUF9QQVBFUjoxMDAKK01BVEdST1VQX1NPTElEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0NFREFSIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0NFREFSCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNmVlOTMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQ0VEQVIKQEAgLTAsMCArMSwyNSBAQAorTWF0ZXJpYWxpZDoKK01BVF9DRURBUiAgICAgICAgICAgICAgICAiY2VkYXIiCisKK05hbWU6CisiWmVkZXJuaG9seiIgIlplZGVybmhvbHplcyIgIlplZGVybmhvbHoiICJaZWRlcm5ob2x6IgorCitHZXNjaGxlY2h0OgorTgorCitCZXNjaHJlaWJ1bmc6CittYWdpc2NoIHVuZCB3ZWljaAorCitFcmtlbm5iYXJrZWl0OgorTUFUX01JU0NfQ09OSUZFUl9XT09EOjUKK01BVF9DRURBUgorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9JTkZMQU1NQUJMRToxMDAKK01BVEdST1VQX01BR0lDOjEwMAorTUFUR1JPVVBfQklPOjEwMAorTUFUR1JPVVBfSEVSQkFMOjEwMAorTUFUR1JPVVBfU09MSUQ6MTAwCitNQVRHUk9VUF9XT09EOjEwMAorTUFUR1JPVVBfREVBRDoxMDAKK01BVEdST1VQX0NPTklGRVJfV09PRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9DRVJBTUlDIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0NFUkFNSUMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY3MWIxYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9DRVJBTUlDCkBAIC0wLDAgKzEsMTcgQEAKK01hdGVyaWFsaWQ6CitNQVRfQ0VSQU1JQyAgICAgICAgICAgICAgImNlcmFtaWMiCisKK05hbWU6CisiS2VyYW1payIgIktlcmFtaWsiICJLZXJhbWlrIiAiS2VyYW1payIKKworR2VzY2hsZWNodDoKK0YKKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX1NPTElEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0NIQUxLIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0NIQUxLCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NzVlOTEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQ0hBTEsKQEAgLTAsMCArMSwxNyBAQAorTWF0ZXJpYWxpZDoKK01BVF9DSEFMSyAgICAgICAgICAgICAgICAiY2hhbGsiCisKK05hbWU6CisiS3JlaWRlIiAiS3JlaWRlIiAiS3JlaWRlIiAiS3JlaWRlIgorCitHZXNjaGxlY2h0OgorRgorCitCZXNjaHJlaWJ1bmc6CistIG5pY2h0IHZvcmhhbmRlbiAtCisKK0Vya2VubmJhcmtlaXQ6CistIGtlaW5lIEVpbnNjaHJhZW5rdW5nIC0KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfU09MSUQ6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQ0hFRVNFIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0NIRUVTRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDNkNTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0NIRUVTRQpAQCAtMCwwICsxLDIxIEBACitNYXRlcmlhbGlkOgorTUFUX0NIRUVTRSAgICAgICAgICAgICAiY2hlZXNlIgorCitOYW1lOgorIkthZXNlIiAiS2Flc2VzIiAiS2Flc2UiICJLYWVzZSIKKworR2VzY2hsZWNodDoKK00KKworQmVzY2hyZWlidW5nOgord2VpY2gsIGVzc2JhcgorCitFcmtlbm5iYXJrZWl0OgorTUFUR1JPVVBfRUFUQUJMRTowCitNQVRHUk9VUF9CSU86MAorTUFUX0NIRUVTRQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9FQVRBQkxFOjEwMAorTUFUR1JPVVBfU09MSUQ6MTAwCitNQVRHUk9VUF9CSU86MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQ0hJRkZPTiBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9DSElGRk9OCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5OTVhNGEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQ0hJRkZPTgpAQCAtMCwwICsxLDIxIEBACitNYXRlcmlhbGlkOgorTUFUX0NISUZGT04gICAgICAgICAgICAgICJjaGlmZm9uIgorCitOYW1lOgorIkNoaWZmb24iICJDaGlmZm9ucyIgIkNoaWZmb24iICJDaGlmZm9uIgorCitHZXNjaGxlY2h0OgorTQorCitCZXNjaHJlaWJ1bmc6CistIG5pY2h0IHZvcmhhbmRlbiAtCisKK0Vya2VubmJhcmtlaXQ6CistIGtlaW5lIEVpbnNjaHJhZW5rdW5nIC0KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfSU5GTEFNTUFCTEU6MTAwCitNQVRHUk9VUF9CSU86MTAwCitNQVRHUk9VUF9GTEVYSUJMRToxMDAKK01BVEdST1VQX1NPTElEOjEwMAorTUFUR1JPVVBfQ0xPVEg6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQ0hJVElOIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0NISVRJTgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODFlNjVkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0NISVRJTgpAQCAtMCwwICsxLDE5IEBACitNYXRlcmlhbGlkOgorTUFUX0NISVRJTiAgICAgICAgICAgICAgICJjaGl0aW4iCisKK05hbWU6CisiQ2hpdGluIiAiQ2hpdGlucyIgIkNoaXRpbiIgIkNoaXRpbiIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX0JJTzoxMDAKK01BVEdST1VQX1NPTElEOjEwMAorTUFUR1JPVVBfREVBRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9DSExPUiBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9DSExPUgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzJlYTg4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0NITE9SCkBAIC0wLDAgKzEsMjAgQEAKK01hdGVyaWFsaWQ6CitNQVRfQ0hMT1IgICAgICAgICAgICAgICAgImNobG9yIgorCitOYW1lOgorIkNobG9yZ2FzIiAiQ2hsb3JnYXNlcyIgIkNobG9yZ2FzIiAiQ2hsb3JnYXMiCisKK0dlc2NobGVjaHQ6CitOCisKK0Jlc2NocmVpYnVuZzoKKy0gbmljaHQgdm9yaGFuZGVuIC0KKworRXJrZW5uYmFya2VpdDoKK01BVF9NSVNDX0dBUzoyMAorTUFUX0NITE9SCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX1BPSVNPTk9VUzoxMDAKK01BVEdST1VQX0dBUzoxMDAKK01BVEdST1VQX0lOVklTOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0NIUk9NSVVNIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0NIUk9NSVVNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMWQxNWYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQ0hST01JVU0KQEAgLTAsMCArMSwyMCBAQAorTWF0ZXJpYWxpZDoKK01BVF9DSFJPTUlVTSAgICAgICAgICAgICAiY2hyb21pdW0iCisKK05hbWU6CisiQ2hyb20iICJDaHJvbXMiICJDaHJvbSIgIkNocm9tIgorCitHZXNjaGxlY2h0OgorTgorCitCZXNjaHJlaWJ1bmc6CitzaWxiZXJ3ZWlzcywgd2VpY2gsIHphZWgKKworRXJrZW5uYmFya2VpdDoKK01BVF9NSVNDX01FVEFMOjAKK01BVF9TSUxWRVI6MTUKK01BVF9DSFJPTUlVTQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9NRVRBTDoxMDAKK01BVEdST1VQX1NPTElEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0NJTk5BQkFSIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0NJTk5BQkFSCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNTE5ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQ0lOTkFCQVIKQEAgLTAsMCArMSwyMCBAQAorTWF0ZXJpYWxpZDoKK01BVF9DSU5OQUJBUiAgICAgICAgICAgICAiY2lubmFiYXIiCisKK05hbWU6CisiWmlubm9iZXIiICJaaW5ub2JlcnMiICJaaW5ub2JlciIgIlppbm5vYmVyIgorCitHZXNjaGxlY2h0OgorTgorCitCZXNjaHJlaWJ1bmc6CitibGVpZ3JhdSBiaXMgc2NoYXJsYWNocm90CisKK0Vya2VubmJhcmtlaXQ6CitNQVRfTUlTQ19NSU5FUkFMOjIwCitNQVRfQ0lOTkFCQVIKKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfTUlORVJBTDoxMDAKK01BVEdST1VQX1NPTElEOjEwMAorTUFUR1JPVVBfU1RPTkU6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQ0xBWSBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9DTEFZCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhOTc5NWQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQ0xBWQpAQCAtMCwwICsxLDE3IEBACitNYXRlcmlhbGlkOgorTUFUX0NMQVkgICAgICAgICAgICAgICAgICJjbGF5IgorCitOYW1lOgorIlRvbiIgIlRvbnMiICJUb24iICJUb24iCisKK0dlc2NobGVjaHQ6CitNCisKK0Jlc2NocmVpYnVuZzoKKy0gbmljaHQgdm9yaGFuZGVuIC0KKworRXJrZW5uYmFya2VpdDoKKy0ga2VpbmUgRWluc2NocmFlbmt1bmcgLQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9TT0xJRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9DTE9USCBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9DTE9USApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2E0ZDE1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0NMT1RICkBAIC0wLDAgKzEsMjEgQEAKK01hdGVyaWFsaWQ6CitNQVRfQ0xPVEggICAgICAgICAgICAgICAgImNsb3RoIgorCitOYW1lOgorIlN0b2ZmIiAiU3RvZmZlcyIgIlN0b2ZmIiAiU3RvZmYiCisKK0dlc2NobGVjaHQ6CitNCisKK0Jlc2NocmVpYnVuZzoKKy0gbmljaHQgdm9yaGFuZGVuIC0KKworRXJrZW5uYmFya2VpdDoKKy0ga2VpbmUgRWluc2NocmFlbmt1bmcgLQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9JTkZMQU1NQUJMRToxMDAKK01BVEdST1VQX0NMT1RIOjEwMAorTUFUR1JPVVBfQklPOjEwMAorTUFUR1JPVVBfRkxFWElCTEU6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9DT0JBTFQgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQ09CQUxUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxM2IzMmEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQ09CQUxUCkBAIC0wLDAgKzEsMjAgQEAKK01hdGVyaWFsaWQ6CitNQVRfQ09CQUxUICAgICAgICAgICAgICAgIkNvIgorCitOYW1lOgorIkNvYmFsdCIgIkNvYmFsdHMiICJDb2JhbHQiICJDb2JhbHQiCisKK0dlc2NobGVjaHQ6CitOCisKK0Jlc2NocmVpYnVuZzoKK2hhcnRlcywgc3Byb2VkZXMgTGVnaWVydW5nbWV0LgorCitFcmtlbm5iYXJrZWl0OgorTUFUX01JU0NfTUVUQUw6MjUKK01BVF9DT0JBTFQKKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfTUVUQUw6MTAwCitNQVRHUk9VUF9NQUdORVRJQzoxMDAKK01BVEdST1VQX1NPTElEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0NPQ0FJTkUgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQ09DQUlORQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjlkNDEzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0NPQ0FJTkUKQEAgLTAsMCArMSwxOSBAQAorTWF0ZXJpYWxpZDoKK01BVF9DT0NBSU5FICAgICAgICAgICAgICAiY29jYWluZSIKKworTmFtZToKKyJLb2thaW4iICJLb2thaW5zIiAiS29rYWluIiAiS29rYWluIgorCitHZXNjaGxlY2h0OgorTgorCitCZXNjaHJlaWJ1bmc6CistIG5pY2h0IHZvcmhhbmRlbiAtCisKK0Vya2VubmJhcmtlaXQ6CitNQVRfQ0hBTEs6NTAKK01BVF9DT0NBSU5FCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX0RSVUc6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9DT05DUkVURSBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9DT05DUkVURQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjcxMWNjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0NPTkNSRVRFCkBAIC0wLDAgKzEsMTggQEAKK01hdGVyaWFsaWQ6CitNQVRfQ09OQ1JFVEUgICAgICAgICAgICAgImNvbmNyZXRlIgorCitOYW1lOgorIkJldG9uIiAiQmV0b25zIiAiQmV0b24iICJCZXRvbiIKKworR2VzY2hsZWNodDoKK00KKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX1NUT05FOjEwMAorTUFUR1JPVVBfU09MSUQ6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQ09QUEVSIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0NPUFBFUgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzM1MWE2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0NPUFBFUgpAQCAtMCwwICsxLDE5IEBACitNYXRlcmlhbGlkOgorTUFUX0NPUFBFUiAgICAgICAgICAgICAgICJDdSIKKworTmFtZToKKyJLdXBmZXIiICJLdXBmZXJzIiAiS3VwZmVyIiAiS3VwZmVyIgorCitHZXNjaGxlY2h0OgorTgorCitCZXNjaHJlaWJ1bmc6Cit3ZWljaCwgcm90CisKK0Vya2VubmJhcmtlaXQ6CitNQVRfTUlTQ19NRVRBTDo1CitNQVRfQ09QUEVSCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX01FVEFMOjEwMAorTUFUR1JPVVBfU09MSUQ6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQ09SSyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9DT1JLCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZmMzYzYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQ09SSwpAQCAtMCwwICsxLDIyIEBACitNYXRlcmlhbGlkOgorTUFUX0NPUksgICAgICAgICAgICAgICAgICJjb3JrIgorCitOYW1lOgorIktvcmsiICJLb3JrcyIgIktvcmsiICJLb3JrIgorCitHZXNjaGxlY2h0OgorTQorCitCZXNjaHJlaWJ1bmc6Cit3ZWljaAorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX0RFQUQ6MTAwCitNQVRHUk9VUF9IRVJCQUw6MTAwCitNQVRHUk9VUF9CSU86MTAwCitNQVRHUk9VUF9JTkZMQU1NQUJMRToxMDAKK01BVEdST1VQX1NPTElEOjEwMAorTUFUR1JPVVBfV09PRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9DT1RUT04gYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQ09UVE9OCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZDk0Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfQ09UVE9OCkBAIC0wLDAgKzEsMjEgQEAKK01hdGVyaWFsaWQ6CitNQVRfQ09UVE9OICAgICAgICAgICAgICAgImNvdHRvbiIKKworTmFtZToKKyJCYXVtd29sbGUiICJCYXVtd29sbGUiICJCYXVtd29sbGUiICJCYXVtd29sbGUiCisKK0dlc2NobGVjaHQ6CitGCisKK0Jlc2NocmVpYnVuZzoKKy0gbmljaHQgdm9yaGFuZGVuIC0KKworRXJrZW5uYmFya2VpdDoKKy0ga2VpbmUgRWluc2NocmFlbmt1bmcgLQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9JTkZMQU1NQUJMRToxMDAKK01BVEdST1VQX0NMT1RIOjEwMAorTUFUR1JPVVBfQklPOjEwMAorTUFUR1JPVVBfRkxFWElCTEU6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9DUllTVEFMIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0NSWVNUQUwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFiMmViNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9DUllTVEFMCkBAIC0wLDAgKzEsMTkgQEAKK01hdGVyaWFsaWQ6CitNQVRfQ1JZU1RBTCAgICAgICAgICAgICAgImNyeXN0YWwiCisKK05hbWU6CisiS3Jpc3RhbGwiICJLcmlzdGFsbHMiICJLcmlzdGFsbCIgIktyaXN0YWxsIgorCitHZXNjaGxlY2h0OgorTQorCitCZXNjaHJlaWJ1bmc6CitrbGFyIGJpcyB3ZWlzcworCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX01JTkVSQUw6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKK01BVEdST1VQX1NUT05FOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0RFVE9OQVRJTkdfR0FTIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0RFVE9OQVRJTkdfR0FTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYTg4ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfREVUT05BVElOR19HQVMKQEAgLTAsMCArMSwyMSBAQAorTWF0ZXJpYWxpZDoKK01BVF9ERVRPTkFUSU5HX0dBUyAgICAgICAib3h5aHlkcm9nZW4iCisKK05hbWU6CisiS25hbGxnYXMiICJLbmFsbGdhc2VzIiAiS25hbGxnYXMiICJLbmFsbGdhcyIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorTUFUX01JU0NfR0FTOjIwCitNQVRfREVUT05BVElOR19HQVMKKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfSU5GTEFNTUFCTEU6MTAwCitNQVRHUk9VUF9HQVM6MTAwCitNQVRHUk9VUF9FWFBMT1NJVkU6MTAwCitNQVRHUk9VUF9JTlZJUzoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9ESUFNT05EIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0RJQU1PTkQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlmOWZjMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9ESUFNT05ECkBAIC0wLDAgKzEsMjIgQEAKK01hdGVyaWFsaWQ6CitNQVRfRElBTU9ORCAgICAgICAgICAgICAgImRpYW1vbmQiCisKK05hbWU6CisiRGlhbWFudCIgIkRpYW1hbnRzIiAiRGlhbWFudCIgIkRpYW1hbnQiCisKK0dlc2NobGVjaHQ6CitNCisKK0Jlc2NocmVpYnVuZzoKKy0gbmljaHQgdm9yaGFuZGVuIC0KKworRXJrZW5uYmFya2VpdDoKK01BVF9NSVNDX0pFV0VMOjAKK01BVF9DUllTVEFMOjI1CitNQVRfRElBTU9ORAorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9NSU5FUkFMOjEwMAorTUFUR1JPVVBfU09MSUQ6MTAwCitNQVRHUk9VUF9KRVdFTDoxMDAKK01BVEdST1VQX1NUT05FOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0RVU1QgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfRFVTVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWE1YzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0RVU1QKQEAgLTAsMCArMSwxNyBAQAorTWF0ZXJpYWxpZDoKK01BVF9EVVNUICAgICAgICAgICAgICAgICAiZHVzdCIKKworTmFtZToKKyJTdGF1YiIgIlN0YXVicyIgIlN0YXViIiAiU3RhdWIiCisKK0dlc2NobGVjaHQ6CitNCisKK0Jlc2NocmVpYnVuZzoKKy0gbmljaHQgdm9yaGFuZGVuIC0KKworRXJrZW5uYmFya2VpdDoKKy0ga2VpbmUgRWluc2NocmFlbmt1bmcgLQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9TT0xJRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9FQVJUSCBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9FQVJUSApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmYyOGUwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0VBUlRICkBAIC0wLDAgKzEsMTggQEAKK01hdGVyaWFsaWQ6CitNQVRfRUFSVEggICAgICAgICAgICAgICAgImVhcnRoIgorCitOYW1lOgorIkVyZGUiICJFcmRlIiAiRXJkZSIgIkVyZGUiCisKK0dlc2NobGVjaHQ6CitGCisKK0Jlc2NocmVpYnVuZzoKKy0gbmljaHQgdm9yaGFuZGVuIC0KKworRXJrZW5uYmFya2VpdDoKKy0ga2VpbmUgRWluc2NocmFlbmt1bmcgLQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9FTEVNRU5UQUw6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9FQk9OWSBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9FQk9OWQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzNjZTY2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0VCT05ZCkBAIC0wLDAgKzEsMjQgQEAKK01hdGVyaWFsaWQ6CitNQVRfRUJPTlkgICAgICAgICAgICAgICAgImVib255IgorCitOYW1lOgorIkViZW5ob2x6IiAiRWJlbmhvbHplcyIgIkViZW5ob2x6IiAiRWJlbmhvbHoiCisKK0dlc2NobGVjaHQ6CitOCisKK0Jlc2NocmVpYnVuZzoKK3NjaHdhcnoKKworRXJrZW5uYmFya2VpdDoKK01BVF9NSVNDX0RFQ0lEVU9VU19XT09EOjE1CitNQVRfRUJPTlkKKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfREVBRDoxMDAKK01BVEdST1VQX0hFUkJBTDoxMDAKK01BVEdST1VQX0RFQ0lEVU9VU19XT09EOjEwMAorTUFUR1JPVVBfQklPOjEwMAorTUFUR1JPVVBfSU5GTEFNTUFCTEU6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKK01BVEdST1VQX1dPT0Q6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfRUxFS1RST04gYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfRUxFS1RST04KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFkNjRmOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9FTEVLVFJPTgpAQCAtMCwwICsxLDIwIEBACitNYXRlcmlhbGlkOgorTUFUX0VMRUtUUk9OICAgICAgICAgICAgICJlbGVrdHJvbiIKKworTmFtZToKKyJFbGVrdHJvbiIgIkVsZWt0cm9ucyIgIkVsZWt0cm9uIiAiRWxla3Ryb24iCisKK0dlc2NobGVjaHQ6CitOCisKK0Jlc2NocmVpYnVuZzoKK2JpcyA3NSUgR29sZCwgUmVzdCBTaWxiZXIKKworRXJrZW5uYmFya2VpdDoKK01BVF9NSVNDX01FVEFMOjAKK01BVF9HT0xEOjY2CitNQVRfRUxFS1RST04KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfTUVUQUw6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9FTUVSQUxEIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0VNRVJBTEQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFhZDJjMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9FTUVSQUxECkBAIC0wLDAgKzEsMjEgQEAKK01hdGVyaWFsaWQ6CitNQVRfRU1FUkFMRCAgICAgICAgICAgICAgImVtZXJhbGQiCisKK05hbWU6CisiU21hcmFnZCIgIlNtYXJhZ2RzIiAiU21hcmFnZCIgIlNtYXJhZ2QiCisKK0dlc2NobGVjaHQ6CitNCisKK0Jlc2NocmVpYnVuZzoKK2dydWVuCisKK0Vya2VubmJhcmtlaXQ6CitNQVRfTUlTQ19KRVdFTDoyNQorTUFUX0VNRVJBTEQKKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfTUlORVJBTDoxMDAKK01BVEdST1VQX1NPTElEOjEwMAorTUFUR1JPVVBfSkVXRUw6MTAwCitNQVRHUk9VUF9TVE9ORToxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9GQVQgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfRkFUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZTJhMDMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfRkFUCkBAIC0wLDAgKzEsMjIgQEAKK01hdGVyaWFsaWQ6CitNQVRfRkFUICAgICAgICAgICAgICAgICAgImZhdCIKKworTmFtZToKKyJGZXR0IiAiRmV0dHMiICJGZXR0IiAiRmV0dCIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorTUFUX01JU0NfRk9PRDotNTAKK01BVF9GQVQKKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfREVBRDoxMDAKK01BVEdST1VQX0VBVEFCTEU6MTAwCitNQVRHUk9VUF9CSU86MTAwCitNQVRHUk9VUF9JTkZMQU1NQUJMRToxMDAKK01BVEdST1VQX1NPTElEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0ZFQVRIRVIgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfRkVBVEhFUgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjUxZWNjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0ZFQVRIRVIKQEAgLTAsMCArMSwyMSBAQAorTWF0ZXJpYWxpZDoKK01BVF9GRUFUSEVSICAgICAgICAgICAgICAiZmVhdGhlciIKKworTmFtZToKKyJGZWRlcm4iICJGZWRlcm4iICJGZWRlcm4iICJGZWRlcm4iCisKK0dlc2NobGVjaHQ6CitGCisKK0Jlc2NocmVpYnVuZzoKKy0gbmljaHQgdm9yaGFuZGVuIC0KKworRXJrZW5uYmFya2VpdDoKKy0ga2VpbmUgRWluc2NocmFlbmt1bmcgLQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9ERUFEOjEwMAorTUFUR1JPVVBfSU5GTEFNTUFCTEU6MTAwCitNQVRHUk9VUF9CSU86MTAwCitNQVRHUk9VUF9GTEVYSUJMRToxMDAKK01BVEdST1VQX1NPTElEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0ZFTFQgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfRkVMVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWQ3ZDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0ZFTFQKQEAgLTAsMCArMSwyMSBAQAorTWF0ZXJpYWxpZDoKK01BVF9GRUxUICAgICAgICAgICAgICAgICAiZmVsdCIKKworTmFtZToKKyJGaWx6IiAiRmlsemVzIiAiRmlseiIgIkZpbHoiCisKK0dlc2NobGVjaHQ6CitNCisKK0Jlc2NocmVpYnVuZzoKKy0gbmljaHQgdm9yaGFuZGVuIC0KKworRXJrZW5uYmFya2VpdDoKKy0ga2VpbmUgRWluc2NocmFlbmt1bmcgLQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9JTkZMQU1NQUJMRToxMDAKK01BVEdST1VQX0NMT1RIOjEwMAorTUFUR1JPVVBfQklPOjEwMAorTUFUR1JPVVBfRkxFWElCTEU6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9GSVIgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfRklSCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZDAxN2UKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfRklSCkBAIC0wLDAgKzEsMjQgQEAKK01hdGVyaWFsaWQ6CitNQVRfRklSICAgICAgICAgICAgICAgICAgImZpciIKKworTmFtZToKKyJUYW5uZW5ob2x6IiAiVGFubmVuaG9semVzIiAiVGFubmVuaG9seiIgIlRhbm5lbmhvbHoiCisKK0dlc2NobGVjaHQ6CitOCisKK0Jlc2NocmVpYnVuZzoKK3Ryb2NrZW4gKERvdWdsYXNpZSkKKworRXJrZW5uYmFya2VpdDoKK01BVF9NSVNDX0NPTklGRVJfV09PRDoxNQorTUFUX0ZJUgorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9ERUFEOjEwMAorTUFUR1JPVVBfSEVSQkFMOjEwMAorTUFUR1JPVVBfQ09OSUZFUl9XT09EOjEwMAorTUFUR1JPVVBfSU5GTEFNTUFCTEU6MTAwCitNQVRHUk9VUF9CSU86MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKK01BVEdST1VQX1dPT0Q6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfRklSRSBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9GSVJFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYjk0YWEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfRklSRQpAQCAtMCwwICsxLDE5IEBACitNYXRlcmlhbGlkOgorTUFUX0ZJUkUgICAgICAgICAgICAgICAgICJmaXJlIgorCitOYW1lOgorIkZldWVyIiAiRmV1ZXJzIiAiRmV1ZXIiICJGZXVlciIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX0dBUzoxMDAKK01BVEdST1VQX0lOVklTOjEwMAorTUFUR1JPVVBfRUxFTUVOVEFMOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0ZMRVNIIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0ZMRVNICm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNjFlNTYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfRkxFU0gKQEAgLTAsMCArMSwyMSBAQAorTWF0ZXJpYWxpZDoKK01BVF9GTEVTSCAgICAgICAgICAgICAgICAiZmxlc2giCisKK05hbWU6CisiRmxlaXNjaCIgIkZsZWlzY2hlcyIgIkZsZWlzY2giICJGbGVpc2NoIgorCitHZXNjaGxlY2h0OgorTgorCitCZXNjaHJlaWJ1bmc6CistIG5pY2h0IHZvcmhhbmRlbiAtCisKK0Vya2VubmJhcmtlaXQ6CitNQVRfTUlTQ19GT09EOi01MAorTUFUX0ZMRVNICisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX0RFQUQ6MTAwCitNQVRHUk9VUF9CSU86MTAwCitNQVRHUk9VUF9FQVRBQkxFOjEwMAorTUFUR1JPVVBfU09MSUQ6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfRkxJTlQgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfRkxJTlQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVhNWNhOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9GTElOVApAQCAtMCwwICsxLDE4IEBACitNYXRlcmlhbGlkOgorTUFUX0ZMSU5UICAgICAgICAgICAgICAgICJmbGludCIKKworTmFtZToKKyJGZXVlcnN0ZWluIiAiRmV1ZXJzdGVpbnMiICJGZXVlcnN0ZWluIiAiRmV1ZXJzdGVpbiIKKworR2VzY2hsZWNodDoKK00KKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX1NUT05FOjEwMAorTUFUR1JPVVBfU09MSUQ6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfRkxVT1JJVEUgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfRkxVT1JJVEUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA1MmFkNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9GTFVPUklURQpAQCAtMCwwICsxLDIxIEBACitNYXRlcmlhbGlkOgorTUFUX0ZMVU9SSVRFICAgICAgICAgICAgICJmbHVvcml0ZSIKKworTmFtZToKKyJGbHVzc3NwYXQiICJGbHVzc3NwYXRlcyIgIkZsdXNzc3BhdCIgIkZsdXNzc3BhdCIKKworR2VzY2hsZWNodDoKK00KKworQmVzY2hyZWlidW5nOgorb2Z0IGZsdW9yZXN6aWVyZW5kCisKK0Vya2VubmJhcmtlaXQ6CitNQVRfTUlTQ19NSU5FUkFMOjMzCitNQVRfT1JUSE9LTEFTOjUwCitNQVRfRkxVT1JJVEUKKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfTUlORVJBTDoxMDAKK01BVEdST1VQX1NPTElEOjEwMAorTUFUR1JPVVBfU1RPTkU6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfRlVOR1VTIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0ZVTkdVUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjg0NWEzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0ZVTkdVUwpAQCAtMCwwICsxLDE5IEBACitNYXRlcmlhbGlkOgorTUFUX0ZVTkdVUyAgICAgICAgICAgICAgICJmdW5ndXMiCisKK05hbWU6CisiUGlseiIgIlBpbHpzIiAiUGlseiIgIlBpbHoiCisKK0dlc2NobGVjaHQ6CitNCisKK0Jlc2NocmVpYnVuZzoKKy0gbmljaHQgdm9yaGFuZGVuIC0KKworRXJrZW5uYmFya2VpdDoKKy0ga2VpbmUgRWluc2NocmFlbmt1bmcgLQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9CSU86MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKK01BVEdST1VQX0xJVklORzoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9HQVJORVQgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfR0FSTkVUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YTRmODMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfR0FSTkVUCkBAIC0wLDAgKzEsMjAgQEAKK01hdGVyaWFsaWQ6CitNQVRfR0FSTkVUICAgICAgICAgICAgICAgImdhcm5ldCIKKworTmFtZToKKyJHcmFuYXQiICJHcmFuYXRzIiAiR3JhbmF0IiAiR3JhbmF0IgorCitHZXNjaGxlY2h0OgorTQorCitCZXNjaHJlaWJ1bmc6Cityb3QsIEVkZWxzdGVpbjogS2FyZnVua2VsCisKK0Vya2VubmJhcmtlaXQ6CistIGtlaW5lIEVpbnNjaHJhZW5rdW5nIC0KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfTUlORVJBTDoxMDAKK01BVEdST1VQX1NPTElEOjEwMAorTUFUR1JPVVBfU1RPTkU6MTAwCitNQVRHUk9VUF9KRVdFTDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9HSE9TVCBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9HSE9TVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmRkOGZjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0dIT1NUCkBAIC0wLDAgKzEsMjAgQEAKK01hdGVyaWFsaWQ6CitNQVRfR0hPU1QgICAgICAgICAgICAgICAgImdob3N0IgorCitOYW1lOgorIkdlaXN0IiAiR2Vpc3RzIiAiR2Vpc3QiICJHZWlzdCIKKworR2VzY2hsZWNodDoKK00KKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX0JJTzoxMDAKK01BVEdST1VQX0dBUzoxMDAKK01BVEdST1VQX0RFQUQ6MTAwCitNQVRHUk9VUF9JTlZJUzoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9HTEFTUyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9HTEFTUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGE3ZTEzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0dMQVNTCkBAIC0wLDAgKzEsMTcgQEAKK01hdGVyaWFsaWQ6CitNQVRfR0xBU1MgICAgICAgICAgICAgICAgImdsYXNzIgorCitOYW1lOgorIkdsYXMiICJHbGFzc2VzIiAiR2xhcyIgIkdsYXMiCisKK0dlc2NobGVjaHQ6CitOCisKK0Jlc2NocmVpYnVuZzoKKy0gbmljaHQgdm9yaGFuZGVuIC0KKworRXJrZW5uYmFya2VpdDoKKy0ga2VpbmUgRWluc2NocmFlbmt1bmcgLQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9TT0xJRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9HTkVJU1MgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfR05FSVNTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwM2VlZWEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfR05FSVNTCkBAIC0wLDAgKzEsMTkgQEAKK01hdGVyaWFsaWQ6CitNQVRfR05FSVNTICAgICAgICAgICAgICAgImduZWlzcyIKKworTmFtZToKKyJHbmVpc3MiICJHbmVpc3NzIiAiR25laXNzIiAiR25laXNzIgorCitHZXNjaGxlY2h0OgorTQorCitCZXNjaHJlaWJ1bmc6CistIG5pY2h0IHZvcmhhbmRlbiAtCisKK0Vya2VubmJhcmtlaXQ6CitNQVRfTUlTQ19TVE9ORTozNQorTUFUX0dORUlTUworCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9TVE9ORToxMDAKK01BVEdST1VQX1NPTElEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0dPTEQgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfR09MRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGMwNTFiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0dPTEQKQEAgLTAsMCArMSwxOSBAQAorTWF0ZXJpYWxpZDoKK01BVF9HT0xEICAgICAgICAgICAgICAgICAiQXUiCisKK05hbWU6CisiR29sZCIgIkdvbGRlcyIgIkdvbGQiICJHb2xkIgorCitHZXNjaGxlY2h0OgorTgorCitCZXNjaHJlaWJ1bmc6Cit3ZWlzcyBiaXMgZ2VsYi9yb3QKKworRXJrZW5uYmFya2VpdDoKKy0ga2VpbmUgRWluc2NocmFlbmt1bmcgLQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9NRVRBTDoxMDAKK01BVEdST1VQX1NPTElEOjEwMAorTUFUR1JPVVBfUFJFQ0lPVVNfTUVUQUw6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfR1JBTklURSBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9HUkFOSVRFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNGRhN2EKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfR1JBTklURQpAQCAtMCwwICsxLDE4IEBACitNYXRlcmlhbGlkOgorTUFUX0dSQU5JVEUgICAgICAgICAgICAgICJncmFuaXRlIgorCitOYW1lOgorIkdyYW5pdCIgIkdyYW5pdHMiICJHcmFuaXQiICJHcmFuaXQiCisKK0dlc2NobGVjaHQ6CitNCisKK0Jlc2NocmVpYnVuZzoKKy0gbmljaHQgdm9yaGFuZGVuIC0KKworRXJrZW5uYmFya2VpdDoKKy0ga2VpbmUgRWluc2NocmFlbmt1bmcgLQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9TVE9ORToxMDAKK01BVEdST1VQX1NPTElEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0dSQVBISVRFIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0dSQVBISVRFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZDdmNDQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfR1JBUEhJVEUKQEAgLTAsMCArMSwyMyBAQAorTWF0ZXJpYWxpZDoKK01BVF9HUkFQSElURSAgICAgICAgICAgICAiZ3JhcGhpdGUiCisKK05hbWU6CisiR3JhcGhpdCIgIkdyYXBoaXRzIiAiR3JhcGhpdCIgIkdyYXBoaXQiCisKK0dlc2NobGVjaHQ6CitOCisKK0Jlc2NocmVpYnVuZzoKK21ldGFsbGlzY2ggZ3JhdQorCitFcmtlbm5iYXJrZWl0OgorTUFUX01JU0NfTUlORVJBTDoyMAorTUFUX0xFQUQ6NDAKK01BVF9DQVJCT046NjAKK01BVF9HUkFQSElURQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9JTkZMQU1NQUJMRToxMDAKK01BVEdST1VQX01JTkVSQUw6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKK01BVEdST1VQX1NUT05FOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0dVTlBPV0RFUiBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9HVU5QT1dERVIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VlYzY3NQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9HVU5QT1dERVIKQEAgLTAsMCArMSwxOSBAQAorTWF0ZXJpYWxpZDoKK01BVF9HVU5QT1dERVIgICAgICAgICAgICAiZ3VucG93ZGVyIgorCitOYW1lOgorIlNjaHdhcnpwdWx2ZXIiICJTY2h3YXJ6cHVsdmVycyIgIlNjaHdhcnpwdWx2ZXIiICJTY2h3YXJ6cHVsdmVyIgorCitHZXNjaGxlY2h0OgorTgorCitCZXNjaHJlaWJ1bmc6CistIG5pY2h0IHZvcmhhbmRlbiAtCisKK0Vya2VubmJhcmtlaXQ6CistIGtlaW5lIEVpbnNjaHJhZW5rdW5nIC0KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfSU5GTEFNTUFCTEU6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKK01BVEdST1VQX0VYUExPU0lWRToxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9IQUlSIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0hBSVIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZmZDVjMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9IQUlSCkBAIC0wLDAgKzEsMjEgQEAKK01hdGVyaWFsaWQ6CitNQVRfSEFJUiAgICAgICAgICAgICAgICAgImhhaXIiCisKK05hbWU6CisiSGFhcmUiICJIYWFyZSIgIkhhYXJlbiIgIkhhYXJlbiIKKworR2VzY2hsZWNodDoKK0YKKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX0RFQUQ6MTAwCitNQVRHUk9VUF9JTkZMQU1NQUJMRToxMDAKK01BVEdST1VQX0JJTzoxMDAKK01BVEdST1VQX0ZMRVhJQkxFOjEwMAorTUFUR1JPVVBfU09MSUQ6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfSEVMSVVNIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0hFTElVTQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDUwNGMwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0hFTElVTQpAQCAtMCwwICsxLDE5IEBACitNYXRlcmlhbGlkOgorTUFUX0hFTElVTSAgICAgICAgICAgICAgICJIZSIKKworTmFtZToKKyJIZWxpdW0iICJIZWxpdW1zIiAiSGVsaXVtIiAiSGVsaXVtIgorCitHZXNjaGxlY2h0OgorTgorCitCZXNjaHJlaWJ1bmc6CistIG5pY2h0IHZvcmhhbmRlbiAtCisKK0Vya2VubmJhcmtlaXQ6CitNQVRfTUlTQ19HQVM6MjAKK01BVF9IRUxJVU0KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfR0FTOjEwMAorTUFUR1JPVVBfSU5WSVM6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfSE9STiBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9IT1JOCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZDIzNTkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfSE9STgpAQCAtMCwwICsxLDE5IEBACitNYXRlcmlhbGlkOgorTUFUX0hPUk4gICAgICAgICAgICAgICAgICJob3JuIgorCitOYW1lOgorIkhvcm4iICJIb3JucyIgIkhvcm4iICJIb3JuIgorCitHZXNjaGxlY2h0OgorTgorCitCZXNjaHJlaWJ1bmc6CistIG5pY2h0IHZvcmhhbmRlbiAtCisKK0Vya2VubmJhcmtlaXQ6CistIGtlaW5lIEVpbnNjaHJhZW5rdW5nIC0KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfREVBRDoxMDAKK01BVEdST1VQX0JJTzoxMDAKK01BVEdST1VQX1NPTElEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0hPV0FMR08gYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfSE9XQUxHTwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWVhYjczCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0hPV0FMR08KQEAgLTAsMCArMSwyMiBAQAorTWF0ZXJpYWxpZDoKK01BVF9IT1dBTEdPICAgICAgICAgICAgICAiaG93YWxnbyIKKworTmFtZToKKyJIb3dhbGdvZXJ6IiAiSG93YWxnb2VyemVzIiAiSG93YWxnb2VyeiIgIkhvd2FsZ29lcnoiCisKK0dlc2NobGVjaHQ6CitOCisKK0Jlc2NocmVpYnVuZzoKK1p3ZXJnZW53YWZmZW5zdGFobAorCitFcmtlbm5iYXJrZWl0OgorTUFUX01JU0NfTUVUQUw6MTAKK01BVF9TVEVFTDo2NQorTUFUX0hPV0FMR08KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfTUFHTkVUSUM6MTAwCitNQVRHUk9VUF9NRVRBTDoxMDAKK01BVEdST1VQX1NPTElEOjEwMAorTUFUR1JPVVBfUFJFQ0lPVVNfTUVUQUw6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfSUNFIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0lDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGIwNGQzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0lDRQpAQCAtMCwwICsxLDE3IEBACitNYXRlcmlhbGlkOgorTUFUX0lDRSAgICAgICAgICAgICAgICAgICJpY2UiCisKK05hbWU6CisiRWlzIiAiRWlzZXMiICJFaXMiICJFaXMiCisKK0dlc2NobGVjaHQ6CitOCisKK0Jlc2NocmVpYnVuZzoKKy0gbmljaHQgdm9yaGFuZGVuIC0KKworRXJrZW5uYmFya2VpdDoKKy0ga2VpbmUgRWluc2NocmFlbmt1bmcgLQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9TT0xJRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9JTksgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfSU5LCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNDNkNWUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfSU5LCkBAIC0wLDAgKzEsMTcgQEAKK01hdGVyaWFsaWQ6CitNQVRfSU5LICAgICAgICAgICAgICAgICAgImluayIKKworTmFtZToKKyJUaW50ZSIgIlRpbnRlIiAiVGludGUiICJUaW50ZSIKKworR2VzY2hsZWNodDoKK0YKKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX0ZMVUlEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0lSSURJVU0gYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfSVJJRElVTQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTIyNTg4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0lSSURJVU0KQEAgLTAsMCArMSwyMyBAQAorTWF0ZXJpYWxpZDoKK01BVF9JUklESVVNICAgICAgICAgICAgICAiSXIiCisKK05hbWU6CisiSXJpZGl1bSIgIklyaWRpdW1zIiAiSXJpZGl1bSIgIklyaWRpdW0iCisKK0dlc2NobGVjaHQ6CitOCisKK0Jlc2NocmVpYnVuZzoKK3NjaHdlciwgZ2lmdGlnCisKK0Vya2VubmJhcmtlaXQ6CitNQVRfTUlTQ19NRVRBTDowCitNQVRfU0lMVkVSOjUKK01BVF9QTEFUSU5VTToyNQorTUFUX0lSSURJVU0KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfTUVUQUw6MTAwCitNQVRHUk9VUF9QT0lTT05PVVM6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKK01BVEdST1VQX1BSRUNJT1VTX01FVEFMOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0lST04gYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfSVJPTgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDE1Y2IwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0lST04KQEAgLTAsMCArMSwxOSBAQAorTWF0ZXJpYWxpZDoKK01BVF9JUk9OICAgICAgICAgICAgICAgICAiRmUiCisKK05hbWU6CisiRWlzZW4iICJFaXNlbnMiICJFaXNlbiIgIkVpc2VuIgorCitHZXNjaGxlY2h0OgorTgorCitCZXNjaHJlaWJ1bmc6Cit3ZWljaAorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX01FVEFMOjEwMAorTUFUR1JPVVBfTUFHTkVUSUM6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9JUk9OX1dPT0QgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfSVJPTl9XT09ECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ODkwZjYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfSVJPTl9XT09ECkBAIC0wLDAgKzEsMjQgQEAKK01hdGVyaWFsaWQ6CitNQVRfSVJPTl9XT09EICAgICAgICAgICAgImlyb25fd29vZCIKKworTmFtZToKKyJFaXNlbmhvbHoiICJFaXNlbmhvbHplcyIgIkVpc2VuaG9seiIgIkVpc2VuaG9seiIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorZXh0cmVtIGhhcnQgKHRyb3Bpc2NoKQorCitFcmtlbm5iYXJrZWl0OgorTUFUX09BSzoyNQorTUFUX0lST05fV09PRAorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9ERUFEOjEwMAorTUFUR1JPVVBfSEVSQkFMOjEwMAorTUFUR1JPVVBfVFJPUElDQUxfV09PRDoxMDAKK01BVEdST1VQX0JJTzoxMDAKK01BVEdST1VQX0lORkxBTU1BQkxFOjEwMAorTUFUR1JPVVBfU09MSUQ6MTAwCitNQVRHUk9VUF9XT09EOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0lWT1JZIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0lWT1JZCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2YWQ4NTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfSVZPUlkKQEAgLTAsMCArMSwxOSBAQAorTWF0ZXJpYWxpZDoKK01BVF9JVk9SWSAgICAgICAgICAgICAgICAiaXZvcnkiCisKK05hbWU6CisiRWxmZW5iZWluIiAiRWxmZW5iZWlucyIgIkVsZmVuYmVpbiIgIkVsZmVuYmVpbiIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX0RFQUQ6MTAwCitNQVRHUk9VUF9CSU86MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9KQURFIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0pBREUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBkMTk1MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9KQURFCkBAIC0wLDAgKzEsMjAgQEAKK01hdGVyaWFsaWQ6CitNQVRfSkFERSAgICAgICAgICAgICAgICAgImphZGUiCisKK05hbWU6CisiSmFkZSIgIkphZGUiICJKYWRlIiAiSmFkZSIKKworR2VzY2hsZWNodDoKK0YKKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX01JTkVSQUw6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKK01BVEdST1VQX0pFV0VMOjEwMAorTUFUR1JPVVBfU1RPTkU6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfSk9GSVVNIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0pPRklVTQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzJjYmMxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0pPRklVTQpAQCAtMCwwICsxLDE5IEBACitNYXRlcmlhbGlkOgorTUFUX0pPRklVTSAgICAgICAgICAgICAgICJqb2ZpdW0iCisKK05hbWU6CisiSm9maXVtIiAiSm9maXVtcyIgIkpvZml1bSIgIkpvZml1bSIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX01FVEFMOjEwMAorTUFUR1JPVVBfU09MSUQ6MTAwCitNQVRHUk9VUF9QUkVDSU9VU19NRVRBTDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9MQUNFIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0xBQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZkYjQ1ZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9MQUNFCkBAIC0wLDAgKzEsMjEgQEAKK01hdGVyaWFsaWQ6CitNQVRfTEFDRSAgICAgICAgICAgICAgICAgImxhY2UiCisKK05hbWU6CisiU3BpdHplIiAiU3BpdHplIiAiU3BpdHplIiAiU3BpdHplIgorCitHZXNjaGxlY2h0OgorRgorCitCZXNjaHJlaWJ1bmc6CistIG5pY2h0IHZvcmhhbmRlbiAtCisKK0Vya2VubmJhcmtlaXQ6CistIGtlaW5lIEVpbnNjaHJhZW5rdW5nIC0KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfSU5GTEFNTUFCTEU6MTAwCitNQVRHUk9VUF9DTE9USDoxMDAKK01BVEdST1VQX0JJTzoxMDAKK01BVEdST1VQX0ZMRVhJQkxFOjEwMAorTUFUR1JPVVBfU09MSUQ6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTEFSSVggYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTEFSSVgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVkYTRjZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9MQVJJWApAQCAtMCwwICsxLDI1IEBACitNYXRlcmlhbGlkOgorTUFUX0xBUklYICAgICAgICAgICAgICAgICJsYXJpeCIKKworTmFtZToKKyJMYWVyY2hlbmhvbHoiICJMYWVyY2hlbmhvbHplcyIgIkxhZXJjaGVuaG9seiIgIkxhZXJjaGVuaG9seiIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorc2VociBoYXJ6aWcsIGJpZWdzYW0KKworRXJrZW5uYmFya2VpdDoKK01BVF9NSVNDX0NPTklGRVJfV09PRDo1CitNQVRfTEFSSVgKKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfREVBRDoxMDAKK01BVEdST1VQX0hFUkJBTDoxMDAKK01BVEdST1VQX0NPTklGRVJfV09PRDoxMDAKK01BVEdST1VQX0ZMRVhJQkxFOjEwMAorTUFUR1JPVVBfQklPOjEwMAorTUFUR1JPVVBfSU5GTEFNTUFCTEU6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKK01BVEdST1VQX1dPT0Q6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTEFURVggYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTEFURVgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg4NzZhMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9MQVRFWApAQCAtMCwwICsxLDE5IEBACitNYXRlcmlhbGlkOgorTUFUX0xBVEVYICAgICAgICAgICAgICAgICJsYXRleCIKKworTmFtZToKKyJHdW1taSIgIkd1bW1pcyIgIkd1bW1pIiAiR3VtbWkiCisKK0dlc2NobGVjaHQ6CitOCisKK0Jlc2NocmVpYnVuZzoKKy0gbmljaHQgdm9yaGFuZGVuIC0KKworRXJrZW5uYmFya2VpdDoKKy0ga2VpbmUgRWluc2NocmFlbmt1bmcgLQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9GTEVYSUJMRToxMDAKK01BVEdST1VQX0JJTzoxMDAKK01BVEdST1VQX1NPTElEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0xBVUdISU5HX0dBUyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9MQVVHSElOR19HQVMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFkYTZlMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9MQVVHSElOR19HQVMKQEAgLTAsMCArMSwyMCBAQAorTWF0ZXJpYWxpZDoKK01BVF9MQVVHSElOR19HQVMgICAgICAgICAibGF1Z2hpbmdfZ2FzIgorCitOYW1lOgorIkxhY2hnYXMiICJMYWNoZ2FzZXMiICJMYWNoZ2FzIiAiTGFjaGdhcyIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX0lORkxBTU1BQkxFOjEwMAorTUFUR1JPVVBfR0FTOjEwMAorTUFUR1JPVVBfRVhQTE9TSVZFOjEwMAorTUFUR1JPVVBfSU5WSVM6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTEFaVVJJVEUgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTEFaVVJJVEUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVkMzU4YQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9MQVpVUklURQpAQCAtMCwwICsxLDIxIEBACitNYXRlcmlhbGlkOgorTUFUX0xBWlVSSVRFICAgICAgICAgICAgICJsYXp1cml0ZSIKKworTmFtZToKKyJMYXBpc2xhenVsaSIgIkxhcGlzbGF6dWxpcyIgIkxhcGlzbGF6dWxpIiAiTGFwaXNsYXp1bGkiCisKK0dlc2NobGVjaHQ6CitNCisKK0Jlc2NocmVpYnVuZzoKK3RpZWZibGF1ICh1bHRyYW1hcmluKQorCitFcmtlbm5iYXJrZWl0OgorTUFUX01JU0NfTUlORVJBTDoyMAorTUFUX0xBWlVSSVRFCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX01JTkVSQUw6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKK01BVEdST1VQX1NUT05FOjEwMAorTUFUR1JPVVBfSkVXRUw6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTEVBRCBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9MRUFECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZmFmYzkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTEVBRApAQCAtMCwwICsxLDIwIEBACitNYXRlcmlhbGlkOgorTUFUX0xFQUQgICAgICAgICAgICAgICAgICJQYiIKKworTmFtZToKKyJCbGVpIiAiQmxlaXMiICJCbGVpIiAiQmxlaSIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX0ZMRVhJQkxFOjEwMAorTUFUR1JPVVBfTUVUQUw6MTAwCitNQVRHUk9VUF9QT0lTT05PVVM6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9MRUFUSEVSIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0xFQVRIRVIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRjOGU3NQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9MRUFUSEVSCkBAIC0wLDAgKzEsMjEgQEAKK01hdGVyaWFsaWQ6CitNQVRfTEVBVEhFUiAgICAgICAgICAgICAgImxlYXRoZXIiCisKK05hbWU6CisiTGVkZXIiICJMZWRlcnMiICJMZWRlciIgIkxlZGVyIgorCitHZXNjaGxlY2h0OgorTgorCitCZXNjaHJlaWJ1bmc6CistIG5pY2h0IHZvcmhhbmRlbiAtCisKK0Vya2VubmJhcmtlaXQ6CistIGtlaW5lIEVpbnNjaHJhZW5rdW5nIC0KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfREVBRDoxMDAKK01BVEdST1VQX0NMT1RIOjEwMAorTUFUR1JPVVBfQklPOjEwMAorTUFUR1JPVVBfRkxFWElCTEU6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9MSUdIVE5JTkcgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTElHSFROSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZDU1Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTElHSFROSU5HCkBAIC0wLDAgKzEsMTkgQEAKK01hdGVyaWFsaWQ6CitNQVRfTElHSFROSU5HICAgICAgICAgICAgImxpZ2h0bmluZyIKKworTmFtZToKKyJCbGl0eiIgIkJsaXR6ZXMiICJCbGl0eiIgIkJsaXR6IgorCitHZXNjaGxlY2h0OgorTQorCitCZXNjaHJlaWJ1bmc6CistIG5pY2h0IHZvcmhhbmRlbiAtCisKK0Vya2VubmJhcmtlaXQ6CistIGtlaW5lIEVpbnNjaHJhZW5rdW5nIC0KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfRUxFQ1RSSUNBTDoxMDAKK01BVEdST1VQX0dBUzoxMDAKK01BVEdST1VQX0lOVklTOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0xJTUUgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTElNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDYxZGVhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0xJTUUKQEAgLTAsMCArMSwyNCBAQAorTWF0ZXJpYWxpZDoKK01BVF9MSU1FICAgICAgICAgICAgICAgICAibGltZSIKKworTmFtZToKKyJMaW5kZW5ob2x6IiAiTGluZGVuaG9semVzIiAiTGluZGVuaG9seiIgIkxpbmRlbmhvbHoiCisKK0dlc2NobGVjaHQ6CitOCisKK0Jlc2NocmVpYnVuZzoKK3dlaWNoCisKK0Vya2VubmJhcmtlaXQ6CitNQVRfTUlTQ19ERUNJRFVPVVNfV09PRDoxNQorTUFUX0xJTUUKKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfREVBRDoxMDAKK01BVEdST1VQX0hFUkJBTDoxMDAKK01BVEdST1VQX0RFQ0lEVU9VU19XT09EOjEwMAorTUFUR1JPVVBfQklPOjEwMAorTUFUR1JPVVBfSU5GTEFNTUFCTEU6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKK01BVEdST1VQX1dPT0Q6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTElNRVNUT05FIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0xJTUVTVE9ORQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWVhOTBhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX0xJTUVTVE9ORQpAQCAtMCwwICsxLDE4IEBACitNYXRlcmlhbGlkOgorTUFUX0xJTUVTVE9ORSAgICAgICAgICAgICJsaW1lc3RvbmUiCisKK05hbWU6CisiS2Fsa3N0ZWluIiAiS2Fsa3N0ZWlucyIgIkthbGtzdGVpbiIgIkthbGtzdGVpbiIKKworR2VzY2hsZWNodDoKK00KKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX1NUT05FOjEwMAorTUFUR1JPVVBfU09MSUQ6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTElORU4gYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTElORU4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE0ZGViMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9MSU5FTgpAQCAtMCwwICsxLDIxIEBACitNYXRlcmlhbGlkOgorTUFUX0xJTkVOICAgICAgICAgICAgICAgICJsaW5lbiIKKworTmFtZToKKyJMZWluZW4iICJMZWluZW4iICJMZWluZW4iICJMZWluZW4iCisKK0dlc2NobGVjaHQ6CitOCisKK0Jlc2NocmVpYnVuZzoKKy0gbmljaHQgdm9yaGFuZGVuIC0KKworRXJrZW5uYmFya2VpdDoKKy0ga2VpbmUgRWluc2NocmFlbmt1bmcgLQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9JTkZMQU1NQUJMRToxMDAKK01BVEdST1VQX0NMT1RIOjEwMAorTUFUR1JPVVBfQklPOjEwMAorTUFUR1JPVVBfRkxFWElCTEU6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NQUdORVNJVU0gYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTUFHTkVTSVVNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNWNiYmIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTUFHTkVTSVVNCkBAIC0wLDAgKzEsMjEgQEAKK01hdGVyaWFsaWQ6CitNQVRfTUFHTkVTSVVNICAgICAgICAgICAgIk1nIgorCitOYW1lOgorIk1hZ25lc2l1bSIgIk1hZ25lc2l1bXMiICJNYWduZXNpdW0iICJNYWduZXNpdW0iCisKK0dlc2NobGVjaHQ6CitOCisKK0Jlc2NocmVpYnVuZzoKK2JyZW5uYmFyCisKK0Vya2VubmJhcmtlaXQ6CitNQVRfTUlTQ19NRVRBTDowCitNQVRfQUxVTUlOSVVNOjMwCitNQVRfTUFHTkVTSVVNCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX01FVEFMOjEwMAorTUFUR1JPVVBfSU5GTEFNTUFCTEU6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NQUhBR09OSSBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NQUhBR09OSQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDg5MjljCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX01BSEFHT05JCkBAIC0wLDAgKzEsMjQgQEAKK01hdGVyaWFsaWQ6CitNQVRfTUFIQUdPTkkgICAgICAgICAgICAgIm1haGFnb25pIgorCitOYW1lOgorIk1haGFnb25pIiAiTWFoYWdvbmlzIiAiTWFoYWdvbmkiICJNYWhhZ29uaSIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorcm90IGJpcyBkdW5rZWxyb3QKKworRXJrZW5uYmFya2VpdDoKK01BVF9NSVNDX1RST1BJQ0FMX1dPT0Q6LTUKK01BVF9NQUhBR09OSQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9ERUFEOjEwMAorTUFUR1JPVVBfSEVSQkFMOjEwMAorTUFUR1JPVVBfVFJPUElDQUxfV09PRDoxMDAKK01BVEdST1VQX0JJTzoxMDAKK01BVEdST1VQX0lORkxBTU1BQkxFOjEwMAorTUFUR1JPVVBfU09MSUQ6MTAwCitNQVRHUk9VUF9XT09EOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX01BTEFDSElURSBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NQUxBQ0hJVEUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc3MTAxMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NQUxBQ0hJVEUKQEAgLTAsMCArMSwyMCBAQAorTWF0ZXJpYWxpZDoKK01BVF9NQUxBQ0hJVEUgICAgICAgICAgICAibWFsYWNoaXRlIgorCitOYW1lOgorIk1hbGFjaGl0IiAiTWFsYWNoaXRzIiAiTWFsYWNoaXQiICJNYWxhY2hpdCIKKworR2VzY2hsZWNodDoKK00KKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorTUFUX01JU0NfTUlORVJBTDoyMAorTUFUX01BTEFDSElURQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9NSU5FUkFMOjEwMAorTUFUR1JPVVBfU09MSUQ6MTAwCitNQVRHUk9VUF9TVE9ORToxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NQVBMRSBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NQVBMRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWJiZDk4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX01BUExFCkBAIC0wLDAgKzEsMjQgQEAKK01hdGVyaWFsaWQ6CitNQVRfTUFQTEUgICAgICAgICAgICAgICAgIm1hcGxlIgorCitOYW1lOgorIkFob3JuaG9seiIgIkFob3JuaG9semVzIiAiQWhvcm5ob2x6IiAiQWhvcm5ob2x6IgorCitHZXNjaGxlY2h0OgorTgorCitCZXNjaHJlaWJ1bmc6CistIG5pY2h0IHZvcmhhbmRlbiAtCisKK0Vya2VubmJhcmtlaXQ6CitNQVRfTUlTQ19ERUNJRFVPVVNfV09PRDoyNQorTUFUX01BUExFCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX0RFQUQ6MTAwCitNQVRHUk9VUF9IRVJCQUw6MTAwCitNQVRHUk9VUF9ERUNJRFVPVVNfV09PRDoxMDAKK01BVEdST1VQX0JJTzoxMDAKK01BVEdST1VQX0lORkxBTU1BQkxFOjEwMAorTUFUR1JPVVBfU09MSUQ6MTAwCitNQVRHUk9VUF9XT09EOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX01BUkJMRSBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NQVJCTEUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ4OTQyZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NQVJCTEUKQEAgLTAsMCArMSwxOCBAQAorTWF0ZXJpYWxpZDoKK01BVF9NQVJCTEUgICAgICAgICAgICAgICAibWFyYmxlIgorCitOYW1lOgorIk1hcm1vciIgIk1hcm1vcnMiICJNYXJtb3IiICJNYXJtb3IiCisKK0dlc2NobGVjaHQ6CitNCisKK0Jlc2NocmVpYnVuZzoKKy0gbmljaHQgdm9yaGFuZGVuIC0KKworRXJrZW5uYmFya2VpdDoKKy0ga2VpbmUgRWluc2NocmFlbmt1bmcgLQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9TVE9ORToxMDAKK01BVEdST1VQX1NPTElEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX01FUkNVUlkgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTUVSQ1VSWQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjNmZDg4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX01FUkNVUlkKQEAgLTAsMCArMSwxOSBAQAorTWF0ZXJpYWxpZDoKK01BVF9NRVJDVVJZICAgICAgICAgICAgICAiSGciCisKK05hbWU6CisiUXVlY2tzaWxiZXIiICJRdWVja3NpbGJlcnMiICJRdWVja3NpbGJlciIgIlF1ZWNrc2lsYmVyIgorCitHZXNjaGxlY2h0OgorTgorCitCZXNjaHJlaWJ1bmc6CistIG5pY2h0IHZvcmhhbmRlbiAtCisKK0Vya2VubmJhcmtlaXQ6CistIGtlaW5lIEVpbnNjaHJhZW5rdW5nIC0KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfTUVUQUw6MTAwCitNQVRHUk9VUF9QT0lTT05PVVM6MTAwCitNQVRHUk9VUF9GTFVJRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NRVRIQU5FIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX01FVEhBTkUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkzYzU3NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NRVRIQU5FCkBAIC0wLDAgKzEsMjEgQEAKK01hdGVyaWFsaWQ6CitNQVRfTUVUSEFORSAgICAgICAgICAgICAgIm1ldGhhbmUiCisKK05hbWU6CisiTWV0aGFuIiAiTWV0aGFucyIgIk1ldGhhbiIgIk1ldGhhbiIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorTUFUX01JU0NfR0FTOjIwCitNQVRfTUVUSEFORQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9JTkZMQU1NQUJMRToxMDAKK01BVEdST1VQX0dBUzoxMDAKK01BVEdST1VQX0VYUExPU0lWRToxMDAKK01BVEdST1VQX0lOVklTOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX01JTEsgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTUlMSwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWVhMDQwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX01JTEsKQEAgLTAsMCArMSwxNyBAQAorTWF0ZXJpYWxpZDoKK01BVF9NSUxLICAgICAgICAgICAgICAgICAibWlsayIKKworTmFtZToKKyJNaWxjaCIgIk1pbGNoIiAiTWlsY2giICJNaWxjaCIKKworR2VzY2hsZWNodDoKK0YKKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX0ZMVUlEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX01JU0MgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTUlTQwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWFhNTU0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX01JU0MKQEAgLTAsMCArMSwxNyBAQAorTWF0ZXJpYWxpZDoKK01BVF9NSVNDICAgICAgICAgICAgICAgICAibWlzYyIKKworTmFtZToKKyJ2ZXJzY2hpZWRlbmVzIE1hdGVyaWFsIiAidmVyc2NoaWVkZW5lbiBNYXRlcmlhbHMiICJ2ZXJzY2hpZWRlbmVtIE1hdGVyaWFsIiAidmVyc2NoaWVkZW5lbiBNYXRlcmlhbCIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorYWxsZy4gTWF0ZXJpYWwgKGRlZmF1bHQpCisKK0Vya2VubmJhcmtlaXQ6CistIGtlaW5lIEVpbnNjaHJhZW5rdW5nIC0KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfTUlTQzoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NSVNDX0FDSUQgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTUlTQ19BQ0lECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjOGQxNWYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTUlTQ19BQ0lECkBAIC0wLDAgKzEsMTkgQEAKK01hdGVyaWFsaWQ6CitNQVRfTUlTQ19BQ0lEICAgICAgICAgICAgIm1pc2NfYWNpZCIKKworTmFtZToKKyJTYWV1cmUiICJTYWV1cmUiICJTYWV1cmUiICJTYWV1cmUiCisKK0dlc2NobGVjaHQ6CitGCisKK0Jlc2NocmVpYnVuZzoKKy0gbmljaHQgdm9yaGFuZGVuIC0KKworRXJrZW5uYmFya2VpdDoKKy0ga2VpbmUgRWluc2NocmFlbmt1bmcgLQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9BQ0lESUM6MTAwCitNQVRHUk9VUF9GTFVJRDoxMDAKK01BVEdST1VQX1BPSVNPTk9VUzoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NSVNDX0JBU0UgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTUlTQ19CQVNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMmNmZDEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTUlTQ19CQVNFCkBAIC0wLDAgKzEsMTkgQEAKK01hdGVyaWFsaWQ6CitNQVRfTUlTQ19CQVNFICAgICAgICAgICAgIm1pc2NfYmFzZSIKKworTmFtZToKKyJMYXVnZSIgIkxhdWdlIiAiTGF1Z2UiICJMYXVnZSIKKworR2VzY2hsZWNodDoKK0YKKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX0ZMVUlEOjEwMAorTUFUR1JPVVBfQkFTSUM6MTAwCitNQVRHUk9VUF9QT0lTT05PVVM6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTUlTQ19DT05JRkVSX1dPT0QgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTUlTQ19DT05JRkVSX1dPT0QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA4OTUzOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NSVNDX0NPTklGRVJfV09PRApAQCAtMCwwICsxLDIzIEBACitNYXRlcmlhbGlkOgorTUFUX01JU0NfQ09OSUZFUl9XT09EICAgICJtaXNjX2NvbmlmZXJfd29vZCIKKworTmFtZToKKyJOYWRlbGhvbHoiICJOYWRlbGhvbHplcyIgIk5hZGVsaG9seiIgIk5hZGVsaG9seiIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX0RFQUQ6MTAwCitNQVRHUk9VUF9IRVJCQUw6MTAwCitNQVRHUk9VUF9DT05JRkVSX1dPT0Q6MTAwCitNQVRHUk9VUF9JTkZMQU1NQUJMRToxMDAKK01BVEdST1VQX0JJTzoxMDAKK01BVEdST1VQX1NPTElEOjEwMAorTUFUR1JPVVBfV09PRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NSVNDX0RFQUQgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTUlTQ19ERUFECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNDQzN2EKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTUlTQ19ERUFECkBAIC0wLDAgKzEsMTkgQEAKK01hdGVyaWFsaWQ6CitNQVRfTUlTQ19ERUFEICAgICAgICAgICAgIm1pc2NfZGVhZCIKKworTmFtZToKKyJzdGVyYmxpY2hlIFVlYmVycmVzdGUiICJzdGVyYmxpY2hlIFVlYmVycmVzdGVzIiAic3RlcmJsaWNoZSBVZWJlcnJlc3RlIiAic3RlcmJsaWNoZSBVZWJlcnJlc3RlIgorCitHZXNjaGxlY2h0OgorTQorCitCZXNjaHJlaWJ1bmc6CithbGxnLiB0b3RlcyBNYXRlcmlhbAorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX0RFQUQ6MTAwCitNQVRHUk9VUF9CSU86MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NSVNDX0RFQ0lEVU9VU19XT09EIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX01JU0NfREVDSURVT1VTX1dPT0QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMzNDU2ZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NSVNDX0RFQ0lEVU9VU19XT09ECkBAIC0wLDAgKzEsMjMgQEAKK01hdGVyaWFsaWQ6CitNQVRfTUlTQ19ERUNJRFVPVVNfV09PRCAgIm1pc2NfZGVjaWR1b3VzX3dvb2QiCisKK05hbWU6CisiTGF1YmhvbHoiICJMYXViaG9semVzIiAiTGF1YmhvbHoiICJMYXViaG9seiIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX0RFQUQ6MTAwCitNQVRHUk9VUF9IRVJCQUw6MTAwCitNQVRHUk9VUF9ERUNJRFVPVVNfV09PRDoxMDAKK01BVEdST1VQX0JJTzoxMDAKK01BVEdST1VQX0lORkxBTU1BQkxFOjEwMAorTUFUR1JPVVBfU09MSUQ6MTAwCitNQVRHUk9VUF9XT09EOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX01JU0NfRFJVRyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NSVNDX0RSVUcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU1OTE5NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NSVNDX0RSVUcKQEAgLTAsMCArMSwxOCBAQAorTWF0ZXJpYWxpZDoKK01BVF9NSVNDX0RSVUcgICAgICAgICAgICAibWlzY19kcnVnIgorCitOYW1lOgorIkRyb2dlIiAiRHJvZ2UiICJEcm9nZSIgIkRyb2dlIgorCitHZXNjaGxlY2h0OgorRgorCitCZXNjaHJlaWJ1bmc6CithbGxnLiBEcm9nZW4KKworRXJrZW5uYmFya2VpdDoKKy0ga2VpbmUgRWluc2NocmFlbmt1bmcgLQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9EUlVHOjEwMAorTUFUR1JPVVBfU09MSUQ6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTUlTQ19FWFBMT1NJVkUgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTUlTQ19FWFBMT1NJVkUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ0Njg3OAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NSVNDX0VYUExPU0lWRQpAQCAtMCwwICsxLDE5IEBACitNYXRlcmlhbGlkOgorTUFUX01JU0NfRVhQTE9TSVZFICAgICAgICJtaXNjX2V4cGxvc2l2ZSIKKworTmFtZToKKyJleHBsb3NpdmVzIE1hdGVyaWFsIiAiZXhwbG9zaXZlbiBNYXRlcmlhbHMiICJleHBsb3NpdmVtIE1hdGVyaWFsIiAiZXhwbG9zaXZlbiBNYXRlcmlhbCIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorYWxsZy4gU3ByZW5nc3RvZmZlCisKK0Vya2VubmJhcmtlaXQ6CistIGtlaW5lIEVpbnNjaHJhZW5rdW5nIC0KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfTUlTQzoxMDAKK01BVEdST1VQX0lORkxBTU1BQkxFOjEwMAorTUFUR1JPVVBfRVhQTE9TSVZFOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX01JU0NfRkxFWElCTEUgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTUlTQ19GTEVYSUJMRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzhkMzdjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX01JU0NfRkxFWElCTEUKQEAgLTAsMCArMSwxOCBAQAorTWF0ZXJpYWxpZDoKK01BVF9NSVNDX0ZMRVhJQkxFICAgICAgICAibWlzY19mbGV4aWJsZSIKKworTmFtZToKKyJiaWVnc2FtZXMgTWF0ZXJpYWwiICJiaWVnc2FtZW4gTWF0ZXJpYWxzIiAiYmllZ3NhbWVtIE1hdGVyaWFsIiAiYmllZ3NhbWVuIE1hdGVyaWFsIgorCitHZXNjaGxlY2h0OgorTgorCitCZXNjaHJlaWJ1bmc6CistIG5pY2h0IHZvcmhhbmRlbiAtCisKK0Vya2VubmJhcmtlaXQ6CistIGtlaW5lIEVpbnNjaHJhZW5rdW5nIC0KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfRkxFWElCTEU6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NSVNDX0ZMVUlEIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX01JU0NfRkxVSUQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNhOTI2ZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NSVNDX0ZMVUlECkBAIC0wLDAgKzEsMTcgQEAKK01hdGVyaWFsaWQ6CitNQVRfTUlTQ19GTFVJRCAgICAgICAgICAgIm1pc2NfZmx1aWQiCisKK05hbWU6CisiRmx1ZXNzaWdrZWl0IiAiRmx1ZXNzaWdrZWl0cyIgIkZsdWVzc2lna2VpdCIgIkZsdWVzc2lna2VpdCIKKworR2VzY2hsZWNodDoKK0YKKworQmVzY2hyZWlidW5nOgorYWxsZy4gRmx1ZXNzaWdrZWl0CisKK0Vya2VubmJhcmtlaXQ6CistIGtlaW5lIEVpbnNjaHJhZW5rdW5nIC0KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfRkxVSUQ6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTUlTQ19GT09EIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX01JU0NfRk9PRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDRjNDQwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX01JU0NfRk9PRApAQCAtMCwwICsxLDE4IEBACitNYXRlcmlhbGlkOgorTUFUX01JU0NfRk9PRCAgICAgICAgICAgICJtaXNjX2Zvb2QiCisKK05hbWU6CisiRXNzZW4iICJFc3NlbnMiICJFc3NlbiIgIkVzc2VuIgorCitHZXNjaGxlY2h0OgorTgorCitCZXNjaHJlaWJ1bmc6CistIG5pY2h0IHZvcmhhbmRlbiAtCisKK0Vya2VubmJhcmtlaXQ6CistIGtlaW5lIEVpbnNjaHJhZW5rdW5nIC0KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfRUFUQUJMRToxMDAKK01BVEdST1VQX1NPTElEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX01JU0NfR0FTIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX01JU0NfR0FTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZjkwYmIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTUlTQ19HQVMKQEAgLTAsMCArMSwxOCBAQAorTWF0ZXJpYWxpZDoKK01BVF9NSVNDX0dBUyAgICAgICAgICAgICAibWlzY19nYXMiCisKK05hbWU6CisiR2FzIiAiR2FzZXMiICJHYXMiICJHYXMiCisKK0dlc2NobGVjaHQ6CitOCisKK0Jlc2NocmVpYnVuZzoKK2FsbGcuIEdhcworCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX0dBUzoxMDAKK01BVEdST1VQX0lOVklTOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX01JU0NfSEVSQkFMIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX01JU0NfSEVSQkFMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NWM4ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTUlTQ19IRVJCQUwKQEAgLTAsMCArMSwyMSBAQAorTWF0ZXJpYWxpZDoKK01BVF9NSVNDX0hFUkJBTCAgICAgICAgICAibWlzY19oZXJiYWwiCisKK05hbWU6CisiS3JhZXV0ZXIiICJLcmFldXRlciIgIktyYWV1dGVyIiAiS3JhZXV0ZXIiCisKK0dlc2NobGVjaHQ6CitGCisKK0Jlc2NocmVpYnVuZzoKK2FsbGcuIEtyYWV1dGVyCisKK0Vya2VubmJhcmtlaXQ6CitNQVRfTUlTQ19QTEFOVDoxNQorTUFUX01JU0NfSEVSQkFMCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX0hFUkJBTDoxMDAKK01BVEdST1VQX0JJTzoxMDAKK01BVEdST1VQX0xJVklORzoxMDAKK01BVEdST1VQX1NPTElEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX01JU0NfSE9MWSBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NSVNDX0hPTFkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQyNjVhYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NSVNDX0hPTFkKQEAgLTAsMCArMSwxOCBAQAorTWF0ZXJpYWxpZDoKK01BVF9NSVNDX0hPTFkgICAgICAgICAgICAibWlzY19ob2x5IgorCitOYW1lOgorImhlaWxpZ2VzIE1hdGVyaWFsIiAiaGVpbGlnZW4gTWF0ZXJpYWxzIiAiaGVpbGlnZW0gTWF0ZXJpYWwiICJoZWlsaWdlbiBNYXRlcmlhbCIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX0hPTFk6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NSVNDX0lOVklTIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX01JU0NfSU5WSVMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE3ZmZkZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NSVNDX0lOVklTCkBAIC0wLDAgKzEsMTggQEAKK01hdGVyaWFsaWQ6CitNQVRfTUlTQ19JTlZJUyAgICAgICAgICAgIm1pc2NfaW52aXMiCisKK05hbWU6CisiIiAiIiAiIiAiIgorCitHZXNjaGxlY2h0OgorRgorCitCZXNjaHJlaWJ1bmc6CithbGxnLiB1bnNpY2h0YmFyZXMgTWF0ZXJpYWwKKworRXJrZW5uYmFya2VpdDoKKy0ga2VpbmUgRWluc2NocmFlbmt1bmcgLQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9NSVNDOjEwMAorTUFUR1JPVVBfSU5WSVM6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTUlTQ19KRVdFTCBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NSVNDX0pFV0VMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMTMyN2YKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTUlTQ19KRVdFTApAQCAtMCwwICsxLDIwIEBACitNYXRlcmlhbGlkOgorTUFUX01JU0NfSkVXRUwgICAgICAgICAgICJtaXNjX2pld2VsIgorCitOYW1lOgorIkVkZWxzdGVpbiIgIkVkZWxzdGVpbnMiICJFZGVsc3RlaW4iICJFZGVsc3RlaW4iCisKK0dlc2NobGVjaHQ6CitNCisKK0Jlc2NocmVpYnVuZzoKKy0gbmljaHQgdm9yaGFuZGVuIC0KKworRXJrZW5uYmFya2VpdDoKKy0ga2VpbmUgRWluc2NocmFlbmt1bmcgLQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9NSU5FUkFMOjEwMAorTUFUR1JPVVBfU09MSUQ6MTAwCitNQVRHUk9VUF9KRVdFTDoxMDAKK01BVEdST1VQX1NUT05FOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX01JU0NfTElWSU5HIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX01JU0NfTElWSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MWEwMWYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTUlTQ19MSVZJTkcKQEAgLTAsMCArMSwxOSBAQAorTWF0ZXJpYWxpZDoKK01BVF9NSVNDX0xJVklORyAgICAgICAgICAibWlzY19saXZpbmciCisKK05hbWU6CisiTGViZXdlc2VuIiAiTGViZXdlc2VucyIgIkxlYmV3ZXNlbiIgIkxlYmV3ZXNlbiIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorYWxsZy4gbGViZW5kZXMgTWF0ZXJpYWwKKworRXJrZW5uYmFya2VpdDoKKy0ga2VpbmUgRWluc2NocmFlbmt1bmcgLQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9CSU86MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKK01BVEdST1VQX0xJVklORzoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NSVNDX01BR0lDIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX01JU0NfTUFHSUMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg4NmI1OQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NSVNDX01BR0lDCkBAIC0wLDAgKzEsMTggQEAKK01hdGVyaWFsaWQ6CitNQVRfTUlTQ19NQUdJQyAgICAgICAgICAgIm1pc2NfbWFnaWMiCisKK05hbWU6CisiTWFnaWUiICJNYWdpZSIgIk1hZ2llIiAiTWFnaWUiCisKK0dlc2NobGVjaHQ6CitGCisKK0Jlc2NocmVpYnVuZzoKK2FsbGcuIG1hZ2lzY2hlcyBNYXRlcmlhbCwgZGFzIHNpY2ggbmljaHQgbmFlaGVyIGJlc3RpbW1lbiBsYWVzc3QgKHdpZSBPa3RhcmluLCBCaXJuYmF1bWhvbHopCisKK0Vya2VubmJhcmtlaXQ6CistIGtlaW5lIEVpbnNjaHJhZW5rdW5nIC0KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfTUlTQzoxMDAKK01BVEdST1VQX01BR0lDOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX01JU0NfTUFHTkVUSUMgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTUlTQ19NQUdORVRJQwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDQ4NTM5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX01JU0NfTUFHTkVUSUMKQEAgLTAsMCArMSwxOCBAQAorTWF0ZXJpYWxpZDoKK01BVF9NSVNDX01BR05FVElDICAgICAgICAibWlzY19tYWduZXRpYyIKKworTmFtZToKKyJtYWduZXRpc2NoZXMgTWF0ZXJpYWwiICJtYWduZXRpc2NoZW4gTWF0ZXJpYWxzIiAibWFnbmV0aXNjaGVtIE1hdGVyaWFsIiAibWFnbmV0aXNjaGVuIE1hdGVyaWFsIgorCitHZXNjaGxlY2h0OgorTgorCitCZXNjaHJlaWJ1bmc6CistIG5pY2h0IHZvcmhhbmRlbiAtCisKK0Vya2VubmJhcmtlaXQ6CistIGtlaW5lIEVpbnNjaHJhZW5rdW5nIC0KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfTUFHTkVUSUM6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NSVNDX01FVEFMIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX01JU0NfTUVUQUwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFiODcxYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NSVNDX01FVEFMCkBAIC0wLDAgKzEsMTggQEAKK01hdGVyaWFsaWQ6CitNQVRfTUlTQ19NRVRBTCAgICAgICAgICAgIm1pc2NfbWV0YWwiCisKK05hbWU6CisiTWV0YWxsIiAiTWV0YWxscyIgIk1ldGFsbCIgIk1ldGFsbCIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorYWxsZy4gTWV0YWxsCisKK0Vya2VubmJhcmtlaXQ6CistIGtlaW5lIEVpbnNjaHJhZW5rdW5nIC0KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfTUVUQUw6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NSVNDX01JTkVSQUwgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTUlTQ19NSU5FUkFMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZGE5OGQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTUlTQ19NSU5FUkFMCkBAIC0wLDAgKzEsMTkgQEAKK01hdGVyaWFsaWQ6CitNQVRfTUlTQ19NSU5FUkFMICAgICAgICAgIm1pc2NfbWluZXJhbCIKKworTmFtZToKKyJNaW5lcmFsIiAiTWluZXJhbHMiICJNaW5lcmFsIiAiTWluZXJhbCIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorYWxsZy4gTWluZXJhbGllbgorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX01JTkVSQUw6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKK01BVEdST1VQX1NUT05FOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX01JU0NfUExBTlQgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTUlTQ19QTEFOVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjgwNWJjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX01JU0NfUExBTlQKQEAgLTAsMCArMSwyMCBAQAorTWF0ZXJpYWxpZDoKK01BVF9NSVNDX1BMQU5UICAgICAgICAgICAibWlzY19wbGFudCIKKworTmFtZToKKyJwZmxhbnpsaWNoZXMgTWF0ZXJpYWwiICJwZmxhbnpsaWNoZW4gTWF0ZXJpYWxzIiAicGZsYW56bGljaGVtIE1hdGVyaWFsIiAicGZsYW56bGljaGVuIE1hdGVyaWFsIgorCitHZXNjaGxlY2h0OgorTgorCitCZXNjaHJlaWJ1bmc6CithbGxnLiBwbGFuemxpY2hlcyBNYXRlcmlhbCBvaG5lIEhvbHphbnRlaWwKKworRXJrZW5uYmFya2VpdDoKKy0ga2VpbmUgRWluc2NocmFlbmt1bmcgLQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9IRVJCQUw6MTAwCitNQVRHUk9VUF9CSU86MTAwCitNQVRHUk9VUF9MSVZJTkc6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NSVNDX1BPSVNPTiBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NSVNDX1BPSVNPTgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mjc1NGYxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX01JU0NfUE9JU09OCkBAIC0wLDAgKzEsMTggQEAKK01hdGVyaWFsaWQ6CitNQVRfTUlTQ19QT0lTT04gICAgICAgICAgIm1pc2NfcG9pc29uIgorCitOYW1lOgorImdpZnRpZ2VzIE1hdGVyaWFsIiAiZ2lmdGlnZW4gTWF0ZXJpYWxzIiAiZ2lmdGlnZW0gTWF0ZXJpYWwiICJnaWZ0aWdlbiBNYXRlcmlhbCIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX01JU0M6MTAwCitNQVRHUk9VUF9QT0lTT05PVVM6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTUlTQ19TT0xJRCBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NSVNDX1NPTElECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNzVjZTgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTUlTQ19TT0xJRApAQCAtMCwwICsxLDE3IEBACitNYXRlcmlhbGlkOgorTUFUX01JU0NfU09MSUQgICAgICAgICAgICJtaXNjX3NvbGlkIgorCitOYW1lOgorInZlcnNjaGllZGVuZXMgTWF0ZXJpYWwiICJ2ZXJzY2hpZWRlbmVuIE1hdGVyaWFscyIgInZlcnNjaGllZGVuZW0gTWF0ZXJpYWwiICJ2ZXJzY2hpZWRlbmVuIE1hdGVyaWFsIgorCitHZXNjaGxlY2h0OgorTgorCitCZXNjaHJlaWJ1bmc6CithbGxnLiBGZXN0c3RvZmZlCisKK0Vya2VubmJhcmtlaXQ6CistIGtlaW5lIEVpbnNjaHJhZW5rdW5nIC0KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfU09MSUQ6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTUlTQ19TVE9ORSBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NSVNDX1NUT05FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNzViZTcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTUlTQ19TVE9ORQpAQCAtMCwwICsxLDE4IEBACitNYXRlcmlhbGlkOgorTUFUX01JU0NfU1RPTkUgICAgICAgICAgICJtaXNjX3N0b25lIgorCitOYW1lOgorIlN0ZWluIiAiU3RlaW5lcyIgIlN0ZWluIiAiU3RlaW4iCisKK0dlc2NobGVjaHQ6CitNCisKK0Jlc2NocmVpYnVuZzoKK2FsbGcuIEdlc3RlaW4KKworRXJrZW5uYmFya2VpdDoKKy0ga2VpbmUgRWluc2NocmFlbmt1bmcgLQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9TVE9ORToxMDAKK01BVEdST1VQX1NPTElEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX01JU0NfVFJPUElDQUxfV09PRCBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NSVNDX1RST1BJQ0FMX1dPT0QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM3NmM1YgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NSVNDX1RST1BJQ0FMX1dPT0QKQEAgLTAsMCArMSwyMyBAQAorTWF0ZXJpYWxpZDoKK01BVF9NSVNDX1RST1BJQ0FMX1dPT0QgICAibWlzY190cm9waWNhbF93b29kIgorCitOYW1lOgorIlRyb3BlbmhvbHoiICJUcm9wZW5ob2x6ZXMiICJUcm9wZW5ob2x6IiAiVHJvcGVuaG9seiIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX0RFQUQ6MTAwCitNQVRHUk9VUF9IRVJCQUw6MTAwCitNQVRHUk9VUF9UUk9QSUNBTF9XT09EOjEwMAorTUFUR1JPVVBfQklPOjEwMAorTUFUR1JPVVBfSU5GTEFNTUFCTEU6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKK01BVEdST1VQX1dPT0Q6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTUlTQ19VTkhPTFkgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTUlTQ19VTkhPTFkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY0MjA2YQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NSVNDX1VOSE9MWQpAQCAtMCwwICsxLDE4IEBACitNYXRlcmlhbGlkOgorTUFUX01JU0NfVU5IT0xZICAgICAgICAgICJtaXNjX3VuaG9seSIKKworTmFtZToKKyJ1bmhlaWxpZ2VzIE1hdGVyaWFsIiAidW5oZWlsaWdlbiBNYXRlcmlhbHMiICJ1bmhlaWxpZ2VtIE1hdGVyaWFsIiAidW5oZWlsaWdlbiBNYXRlcmlhbCIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX1VOSE9MWToxMDAKK01BVEdST1VQX1NPTElEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX01JU0NfV09PRCBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NSVNDX1dPT0QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkzN2U5MQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NSVNDX1dPT0QKQEAgLTAsMCArMSwyMiBAQAorTWF0ZXJpYWxpZDoKK01BVF9NSVNDX1dPT0QgICAgICAgICAgICAibWlzY193b29kIgorCitOYW1lOgorIkhvbHoiICJIb2x6ZXMiICJIb2x6IiAiSG9seiIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX0RFQUQ6MTAwCitNQVRHUk9VUF9IRVJCQUw6MTAwCitNQVRHUk9VUF9CSU86MTAwCitNQVRHUk9VUF9JTkZMQU1NQUJMRToxMDAKK01BVEdST1VQX1NPTElEOjEwMAorTUFUR1JPVVBfV09PRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NSVRIUklMIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX01JVEhSSUwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBmZTcxMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NSVRIUklMCkBAIC0wLDAgKzEsMTkgQEAKK01hdGVyaWFsaWQ6CitNQVRfTUlUSFJJTCAgICAgICAgICAgICAgIm1pdGhyaWwiCisKK05hbWU6CisiTWl0aHJpbCIgIk1pdGhyaWxzIiAiTWl0aHJpbCIgIk1pdGhyaWwiCisKK0dlc2NobGVjaHQ6CitOCisKK0Jlc2NocmVpYnVuZzoKK1p3ZXJnZW5ydWVzdHVuZ3NtZXRhbGwKKworRXJrZW5uYmFya2VpdDoKKy0ga2VpbmUgRWluc2NocmFlbmt1bmcgLQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9NRVRBTDoxMDAKK01BVEdST1VQX1NPTElEOjEwMAorTUFUR1JPVVBfUFJFQ0lPVVNfTUVUQUw6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTU9PTlNUT05FIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX01PT05TVE9ORQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODNiZWRhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX01PT05TVE9ORQpAQCAtMCwwICsxLDIwIEBACitNYXRlcmlhbGlkOgorTUFUX01PT05TVE9ORSAgICAgICAgICAgICJtb29uc3RvbmUiCisKK05hbWU6CisiTW9uZHN0ZWluIiAiTW9uZHN0ZWluZXMiICJNb25kc3RlaW4iICJNb25kc3RlaW4iCisKK0dlc2NobGVjaHQ6CitNCisKK0Jlc2NocmVpYnVuZzoKK2dlbGIsIGJsYWV1bGljaCwgZmFobAorCitFcmtlbm5iYXJrZWl0OgorTUFUX01JU0NfTUlORVJBTDoyNQorTUFUX01PT05TVE9ORQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9NSU5FUkFMOjEwMAorTUFUR1JPVVBfU09MSUQ6MTAwCitNQVRHUk9VUF9TVE9ORToxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NT1JQSElVTSBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9NT1JQSElVTQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2QzODNhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX01PUlBISVVNCkBAIC0wLDAgKzEsMjAgQEAKK01hdGVyaWFsaWQ6CitNQVRfTU9SUEhJVU0gICAgICAgICAgICAgIm1vcnBoaXVtIgorCitOYW1lOgorIk1vcnBoaXVtIiAiTW9ycGhpdW1zIiAiTW9ycGhpdW0iICJNb3JwaGl1bSIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorTUFUX1NBTFQ6NTAKK01BVF9NT1JQSElVTQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9IRVJCQUw6MTAwCitNQVRHUk9VUF9EUlVHOjEwMAorTUFUR1JPVVBfU09MSUQ6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTkVVVFJPTklVTSBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9ORVVUUk9OSVVNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NGMyODkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTkVVVFJPTklVTQpAQCAtMCwwICsxLDE5IEBACitNYXRlcmlhbGlkOgorTUFUX05FVVRST05JVU0gICAgICAgICAgICJOZXV0ciIKKworTmFtZToKKyJOZXV0cm9uaXVtIiAiTmV1dHJvbml1bXMiICJOZXV0cm9uaXVtIiAiTmV1dHJvbml1bSIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgordWx0cmFzY2h3ZXIsIHVuemVyc3RvZXJiYXIKKworRXJrZW5uYmFya2VpdDoKK01BVF9NSVNDX01FVEFMOi0yNQorTUFUX05FVVRST05JVU0KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfTUVUQUw6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9OSUNLRUwgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTklDS0VMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZjA5MzUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTklDS0VMCkBAIC0wLDAgKzEsMjAgQEAKK01hdGVyaWFsaWQ6CitNQVRfTklDS0VMICAgICAgICAgICAgICAgIm5pY2tlbCIKKworTmFtZToKKyJOaWNrZWwiICJOaWNrZWxzIiAiTmlja2VsIiAiTmlja2VsIgorCitHZXNjaGxlY2h0OgorTgorCitCZXNjaHJlaWJ1bmc6Cit6YWVoLCBmZXN0LCBzaWxiZXJ3ZWlzcworCitFcmtlbm5iYXJrZWl0OgorTUFUX01JU0NfTUVUQUw6MAorTUFUX1NJTFZFUjoxNQorTUFUX05JQ0tFTAorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9NRVRBTDoxMDAKK01BVEdST1VQX1NPTElEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX05JVFJPR0xZQ0VSSU5FIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX05JVFJPR0xZQ0VSSU5FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZmEwNmUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTklUUk9HTFlDRVJJTkUKQEAgLTAsMCArMSwyMSBAQAorTWF0ZXJpYWxpZDoKK01BVF9OSVRST0dMWUNFUklORSAgICAgICAibml0cm9nbHljZXJpbmUiCisKK05hbWU6CisiTml0cm9nbHljZXJpbiIgIk5pdHJvZ2x5Y2VyaW5zIiAiTml0cm9nbHljZXJpbiIgIk5pdHJvZ2x5Y2VyaW4iCisKK0dlc2NobGVjaHQ6CitOCisKK0Jlc2NocmVpYnVuZzoKKy0gbmljaHQgdm9yaGFuZGVuIC0KKworRXJrZW5uYmFya2VpdDoKK01BVF9PSUw6MjUKK01BVF9NSVNDX0VYUExPU0lWRTo1MAorTUFUX05JVFJPR0xZQ0VSSU5FCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX0lORkxBTU1BQkxFOjEwMAorTUFUR1JPVVBfRVhQTE9TSVZFOjEwMAorTUFUR1JPVVBfRkxVSUQ6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTlVUVFJFRSBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9OVVRUUkVFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZDg4ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfTlVUVFJFRQpAQCAtMCwwICsxLDI0IEBACitNYXRlcmlhbGlkOgorTUFUX05VVFRSRUUgICAgICAgICAgICAgICJudXR0cmVlIgorCitOYW1lOgorIk51c3NiYXVtaG9seiIgIk51c3NiYXVtaG9semVzIiAiTnVzc2JhdW1ob2x6IiAiTnVzc2JhdW1ob2x6IgorCitHZXNjaGxlY2h0OgorTgorCitCZXNjaHJlaWJ1bmc6CitoZWxsLCBwb2xpZXJmYWVoaWcKKworRXJrZW5uYmFya2VpdDoKK01BVF9NSVNDX0RFQ0lEVU9VU19XT09EOjE1CitNQVRfTlVUVFJFRQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9ERUFEOjEwMAorTUFUR1JPVVBfSEVSQkFMOjEwMAorTUFUR1JPVVBfREVDSURVT1VTX1dPT0Q6MTAwCitNQVRHUk9VUF9CSU86MTAwCitNQVRHUk9VUF9JTkZMQU1NQUJMRToxMDAKK01BVEdST1VQX1NPTElEOjEwMAorTUFUR1JPVVBfV09PRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9PQUsgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfT0FLCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMjU2ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfT0FLCkBAIC0wLDAgKzEsMjQgQEAKK01hdGVyaWFsaWQ6CitNQVRfT0FLICAgICAgICAgICAgICAgICAgIm9hayIKKworTmFtZToKKyJFaWNoZW5ob2x6IiAiRWljaGVuaG9semVzIiAiRWljaGVuaG9seiIgIkVpY2hlbmhvbHoiCisKK0dlc2NobGVjaHQ6CitOCisKK0Jlc2NocmVpYnVuZzoKK2hhcnQKKworRXJrZW5uYmFya2VpdDoKK01BVF9NSVNDX0RFQ0lEVU9VU19XT09EOjUKK01BVF9PQUsKKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfREVBRDoxMDAKK01BVEdST1VQX0hFUkJBTDoxMDAKK01BVEdST1VQX0RFQ0lEVU9VU19XT09EOjEwMAorTUFUR1JPVVBfQklPOjEwMAorTUFUR1JPVVBfSU5GTEFNTUFCTEU6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKK01BVEdST1VQX1dPT0Q6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfT0JTSURJQU4gYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfT0JTSURJQU4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY1MjAzYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9PQlNJRElBTgpAQCAtMCwwICsxLDIwIEBACitNYXRlcmlhbGlkOgorTUFUX09CU0lESUFOICAgICAgICAgICAgICJvYnNpZGlhbiIKKworTmFtZToKKyJPYnNpZGlhbiIgIk9ic2lkaWFucyIgIk9ic2lkaWFuIiAiT2JzaWRpYW4iCisKK0dlc2NobGVjaHQ6CitOCisKK0Jlc2NocmVpYnVuZzoKK3NjaHdhcnoKKworRXJrZW5uYmFya2VpdDoKK01BVF9NSVNDX01JTkVSQUw6MTAKK01BVF9PQlNJRElBTgorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9NSU5FUkFMOjEwMAorTUFUR1JPVVBfU09MSUQ6MTAwCitNQVRHUk9VUF9TVE9ORToxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9PQ1RBUklORSBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9PQ1RBUklORQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWYwZDI5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX09DVEFSSU5FCkBAIC0wLDAgKzEsMjEgQEAKK01hdGVyaWFsaWQ6CitNQVRfT0NUQVJJTkUgICAgICAgICAgICAgIm9jdGFyaW5lIgorCitOYW1lOgorIk9rdGFyaW4iICJPa3RhcmlucyIgIk9rdGFyaW4iICJPa3RhcmluIgorCitHZXNjaGxlY2h0OgorTQorCitCZXNjaHJlaWJ1bmc6CittYWdpc2NoZXIgTXVlbGwgOikKKworRXJrZW5uYmFya2VpdDoKKy0ga2VpbmUgRWluc2NocmFlbmt1bmcgLQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9NQUdJQzoxMDAKK01BVEdST1VQX1NUT05FOjEwMAorTUFUR1JPVVBfSkVXRUw6MTAwCitNQVRHUk9VUF9NSU5FUkFMOjEwMAorTUFUR1JPVVBfU09MSUQ6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfT0lMIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX09JTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGU1MTAyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX09JTApAQCAtMCwwICsxLDE4IEBACitNYXRlcmlhbGlkOgorTUFUX09JTCAgICAgICAgICAgICAgICAgICJvaWwiCisKK05hbWU6CisiT2VsIiAiT2VscyIgIk9lbCIgIk9lbCIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX0lORkxBTU1BQkxFOjEwMAorTUFUR1JPVVBfRkxVSUQ6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfT0xJVklOIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX09MSVZJTgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWExZTNiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX09MSVZJTgpAQCAtMCwwICsxLDIwIEBACitNYXRlcmlhbGlkOgorTUFUX09MSVZJTiAgICAgICAgICAgICAgICJvbGl2aW4iCisKK05hbWU6CisiT2xpdmluIiAiT2xpdmlucyIgIk9saXZpbiIgIk9saXZpbiIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorZ3J1ZW4gYmlzIGJyYXVuCisKK0Vya2VubmJhcmtlaXQ6CitNQVRfTUlTQ19NSU5FUkFMOjIwCitNQVRfT0xJVklOCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX01JTkVSQUw6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKK01BVEdST1VQX1NUT05FOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX09OWVggYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfT05ZWApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjUzNjNhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX09OWVgKQEAgLTAsMCArMSwyMiBAQAorTWF0ZXJpYWxpZDoKK01BVF9PTllYICAgICAgICAgICAgICAgICAib255eCIKKworTmFtZToKKyJPbnl4IiAiT255eGVzIiAiT255eCIgIk9ueXgiCisKK0dlc2NobGVjaHQ6CitNCisKK0Jlc2NocmVpYnVuZzoKK1VudGVyYXJ0IEFjaGF0LCBzY2h3YXJ6CisKK0Vya2VubmJhcmtlaXQ6CitNQVRfTUlTQ19NSU5FUkFMOjAKK01BVF9RVUFSVFo6MjAKK01BVF9BR0FURTo3NQorTUFUX09OWVgKKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfTUlORVJBTDoxMDAKK01BVEdST1VQX1NPTElEOjEwMAorTUFUR1JPVVBfU1RPTkU6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfT1BBTCBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9PUEFMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZTk3MDcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfT1BBTApAQCAtMCwwICsxLDIxIEBACitNYXRlcmlhbGlkOgorTUFUX09QQUwgICAgICAgICAgICAgICAgICJvcGFsIgorCitOYW1lOgorIk9wYWwiICJPcGFscyIgIk9wYWwiICJPcGFsIgorCitHZXNjaGxlY2h0OgorTQorCitCZXNjaHJlaWJ1bmc6Cit3ZWlzcywgcm90LCBibGF1LCBidW50CisKK0Vya2VubmJhcmtlaXQ6CitNQVRfTUlTQ19KRVdFTDoyNQorTUFUX09QQUwKKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfTUlORVJBTDoxMDAKK01BVEdST1VQX1NPTElEOjEwMAorTUFUR1JPVVBfSkVXRUw6MTAwCitNQVRHUk9VUF9TVE9ORToxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9PUElVTSBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9PUElVTQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjgwODI5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX09QSVVNCkBAIC0wLDAgKzEsMjAgQEAKK01hdGVyaWFsaWQ6CitNQVRfT1BJVU0gICAgICAgICAgICAgICAgIm9waXVtIgorCitOYW1lOgorIk9waXVtIiAiT3BpdW1zIiAiT3BpdW0iICJPcGl1bSIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorTUFUX01JU0NfSEVSQkFMOjUwCitNQVRfT1BJVU0KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfSEVSQkFMOjEwMAorTUFUR1JPVVBfRFJVRzoxMDAKK01BVEdST1VQX1NPTElEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX09SVEhPS0xBUyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9PUlRIT0tMQVMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUxMDBiNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9PUlRIT0tMQVMKQEAgLTAsMCArMSwyMCBAQAorTWF0ZXJpYWxpZDoKK01BVF9PUlRIT0tMQVMgICAgICAgICAgICAib3J0aG9rbGFzIgorCitOYW1lOgorIkZlbGRzcGF0IiAiRmVsZHNwYXRlcyIgIkZlbGRzcGF0IiAiRmVsZHNwYXQiCisKK0dlc2NobGVjaHQ6CitNCisKK0Jlc2NocmVpYnVuZzoKK3dlaXNzIGJpcyBncmF1LCBncnVlbmxpY2gKKworRXJrZW5uYmFya2VpdDoKK01BVF9NSVNDX01JTkVSQUw6MzMKK01BVF9PUlRIT0tMQVMKKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfTUlORVJBTDoxMDAKK01BVEdST1VQX1NPTElEOjEwMAorTUFUR1JPVVBfU1RPTkU6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfT1NNSVVNIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX09TTUlVTQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWIyMWEwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX09TTUlVTQpAQCAtMCwwICsxLDIyIEBACitNYXRlcmlhbGlkOgorTUFUX09TTUlVTSAgICAgICAgICAgICAgICJPcyIKKworTmFtZToKKyJPc21pdW0iICJPc21pdW1zIiAiT3NtaXVtIiAiT3NtaXVtIgorCitHZXNjaGxlY2h0OgorTgorCitCZXNjaHJlaWJ1bmc6CitzY2h3ZXJzdGVzIE1ldGFsbAorCitFcmtlbm5iYXJrZWl0OgorTUFUX01JU0NfTUVUQUw6MAorTUFUX1NJTFZFUjo1CitNQVRfUExBVElOVU06MjUKK01BVF9PU01JVU0KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfTUVUQUw6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKK01BVEdST1VQX1BSRUNJT1VTX01FVEFMOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1BBUEVSIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1BBUEVSCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNzgyMGQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfUEFQRVIKQEAgLTAsMCArMSwyMSBAQAorTWF0ZXJpYWxpZDoKK01BVF9QQVBFUiAgICAgICAgICAgICAgICAicGFwZXIiCisKK05hbWU6CisiUGFwaWVyIiAiUGFwaWVycyIgIlBhcGllciIgIlBhcGllciIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX1BBUEVSOjEwMAorTUFUR1JPVVBfSU5GTEFNTUFCTEU6MTAwCitNQVRHUk9VUF9CSU86MTAwCitNQVRHUk9VUF9GTEVYSUJMRToxMDAKK01BVEdST1VQX1NPTElEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1BBUFlSVVMgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfUEFQWVJVUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWVlOGMxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1BBUFlSVVMKQEAgLTAsMCArMSwyMSBAQAorTWF0ZXJpYWxpZDoKK01BVF9QQVBZUlVTICAgICAgICAgICAgICAicGFweXJ1cyIKKworTmFtZToKKyJQYXB5cnVzIiAiUGFweXJ1c3MiICJQYXB5cnVzIiAiUGFweXJ1cyIKKworR2VzY2hsZWNodDoKK00KKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX1BBUEVSOjEwMAorTUFUR1JPVVBfSU5GTEFNTUFCTEU6MTAwCitNQVRHUk9VUF9CSU86MTAwCitNQVRHUk9VUF9GTEVYSUJMRToxMDAKK01BVEdST1VQX1NPTElEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1BBUkZVTSBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9QQVJGVU0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcwNGZkOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9QQVJGVU0KQEAgLTAsMCArMSwxNyBAQAorTWF0ZXJpYWxpZDoKK01BVF9QQVJGVU0gICAgICAgICAgICAgICAicGFyZnVtIgorCitOYW1lOgorIlBhcmZ1ZW0iICJQYXJmdWVtcyIgIlBhcmZ1ZW0iICJQYXJmdWVtIgorCitHZXNjaGxlY2h0OgorTgorCitCZXNjaHJlaWJ1bmc6CistIG5pY2h0IHZvcmhhbmRlbiAtCisKK0Vya2VubmJhcmtlaXQ6CistIGtlaW5lIEVpbnNjaHJhZW5rdW5nIC0KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfRkxVSUQ6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfUEFURU5UX0xFQVRIRVIgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfUEFURU5UX0xFQVRIRVIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRmYzE3NwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9QQVRFTlRfTEVBVEhFUgpAQCAtMCwwICsxLDIwIEBACitNYXRlcmlhbGlkOgorTUFUX1BBVEVOVF9MRUFUSEVSICAgICAgICJwYXRlbnRfbGVhdGhlciIKKworTmFtZToKKyJMYWNrbGVkZXIiICJMYWNrbGVkZXJzIiAiTGFja2xlZGVyIiAiTGFja2xlZGVyIgorCitHZXNjaGxlY2h0OgorTgorCitCZXNjaHJlaWJ1bmc6CitLdW5zdGxlZGVyCisKK0Vya2VubmJhcmtlaXQ6CistIGtlaW5lIEVpbnNjaHJhZW5rdW5nIC0KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfRkxFWElCTEU6MTAwCitNQVRHUk9VUF9CSU86MTAwCitNQVRHUk9VUF9DTE9USDoxMDAKK01BVEdST1VQX1NPTElEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1BFQVJMIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1BFQVJMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNTZmMTAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfUEVBUkwKQEAgLTAsMCArMSwyMCBAQAorTWF0ZXJpYWxpZDoKK01BVF9QRUFSTCAgICAgICAgICAgICAgICAicGVhcmwiCisKK05hbWU6CisiUGVybGUiICJQZXJsZSIgIlBlcmxlIiAiUGVybGUiCisKK0dlc2NobGVjaHQ6CitOCisKK0Jlc2NocmVpYnVuZzoKKy0gbmljaHQgdm9yaGFuZGVuIC0KKworRXJrZW5uYmFya2VpdDoKKy0ga2VpbmUgRWluc2NocmFlbmt1bmcgLQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9CSU86MTAwCitNQVRHUk9VUF9ERUFEOjEwMAorTUFUR1JPVVBfU09MSUQ6MTAwCitNQVRHUk9VUF9KRVdFTDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9QRUFSTE1PVEhFUiBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9QRUFSTE1PVEhFUgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDU4ZGJjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1BFQVJMTU9USEVSCkBAIC0wLDAgKzEsMTkgQEAKK01hdGVyaWFsaWQ6CitNQVRfUEVBUkxNT1RIRVIgICAgICAgICAgInBlYXJsbW90aGVyIgorCitOYW1lOgorIlBlcmxtdXR0IiAiUGVybG11dHRzIiAiUGVybG11dHQiICJQZXJsbXV0dCIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX0RFQUQ6MTAwCitNQVRHUk9VUF9CSU86MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9QRUFSX1dPT0QgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfUEVBUl9XT09ECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMWZmYjUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfUEVBUl9XT09ECkBAIC0wLDAgKzEsMjUgQEAKK01hdGVyaWFsaWQ6CitNQVRfUEVBUl9XT09EICAgICAgICAgICAgInBlYXJfd29vZCIKKworTmFtZToKKyJCaXJuYmF1bWhvbHoiICJCaXJuYmF1bWhvbHplcyIgIkJpcm5iYXVtaG9seiIgIkJpcm5iYXVtaG9seiIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgoremFlaCwgdHJvY2tlbiwgbWFnaXNjaAorCitFcmtlbm5iYXJrZWl0OgorTUFUX01JU0NfREVDSURVT1VTX1dPT0Q6MzUKK01BVF9QRUFSX1dPT0QKKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfREVBRDoxMDAKK01BVEdST1VQX01BR0lDOjEwMAorTUFUR1JPVVBfSEVSQkFMOjEwMAorTUFUR1JPVVBfREVDSURVT1VTX1dPT0Q6MTAwCitNQVRHUk9VUF9CSU86MTAwCitNQVRHUk9VUF9JTkZMQU1NQUJMRToxMDAKK01BVEdST1VQX1NPTElEOjEwMAorTUFUR1JPVVBfV09PRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9QRUxUIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1BFTFQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE1NTY2ZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9QRUxUCkBAIC0wLDAgKzEsMjEgQEAKK01hdGVyaWFsaWQ6CitNQVRfUEVMVCAgICAgICAgICAgICAgICAgInBlbHQiCisKK05hbWU6CisiRmVsbCIgIkZlbGxlcyIgIkZlbGwiICJGZWxsIgorCitHZXNjaGxlY2h0OgorTQorCitCZXNjaHJlaWJ1bmc6CistIG5pY2h0IHZvcmhhbmRlbiAtCisKK0Vya2VubmJhcmtlaXQ6CistIGtlaW5lIEVpbnNjaHJhZW5rdW5nIC0KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfREVBRDoxMDAKK01BVEdST1VQX0NMT1RIOjEwMAorTUFUR1JPVVBfQklPOjEwMAorTUFUR1JPVVBfRkxFWElCTEU6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9QRU5JQ0lMTElOIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1BFTklDSUxMSU4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q3OTM0NAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9QRU5JQ0lMTElOCkBAIC0wLDAgKzEsMjEgQEAKK01hdGVyaWFsaWQ6CitNQVRfUEVOSUNJTExJTiAgICAgICAgICAgInBlbmljaWxsaW4iCisKK05hbWU6CisiUGVuaWNpbGxpbiIgIlBlbmljaWxsaW5zIiAiUGVuaWNpbGxpbiIgIlBlbmljaWxsaW4iCisKK0dlc2NobGVjaHQ6CitOCisKK0Jlc2NocmVpYnVuZzoKKy0gbmljaHQgdm9yaGFuZGVuIC0KKworRXJrZW5uYmFya2VpdDoKK01BVF9DSEFMSzo1MAorTUFUX1BFTklDSUxMSU4KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfQklPOjEwMAorTUFUR1JPVVBfREVBRDoxMDAKK01BVEdST1VQX0RSVUc6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9QRVJHQU1FTlQgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfUEVSR0FNRU5UCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NDExNzgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfUEVSR0FNRU5UCkBAIC0wLDAgKzEsMjIgQEAKK01hdGVyaWFsaWQ6CitNQVRfUEVSR0FNRU5UICAgICAgICAgICAgInBlcmdhbWVudCIKKworTmFtZToKKyJQZXJnYW1lbnQiICJQZXJnYW1lbnRzIiAiUGVyZ2FtZW50IiAiUGVyZ2FtZW50IgorCitHZXNjaGxlY2h0OgorTgorCitCZXNjaHJlaWJ1bmc6CistIG5pY2h0IHZvcmhhbmRlbiAtCisKK0Vya2VubmJhcmtlaXQ6CistIGtlaW5lIEVpbnNjaHJhZW5rdW5nIC0KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfREVBRDoxMDAKK01BVEdST1VQX1BBUEVSOjEwMAorTUFUR1JPVVBfRkxFWElCTEU6MTAwCitNQVRHUk9VUF9CSU86MTAwCitNQVRHUk9VUF9JTkZMQU1NQUJMRToxMDAKK01BVEdST1VQX1NPTElEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1BIT1NQSE9SVVMgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfUEhPU1BIT1JVUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWEwZmJiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1BIT1NQSE9SVVMKQEAgLTAsMCArMSwxOCBAQAorTWF0ZXJpYWxpZDoKK01BVF9QSE9TUEhPUlVTICAgICAgICAgICAiUCIKKworTmFtZToKKyJQaG9zcGhvciIgIlBob3NwaG9ycyIgIlBob3NwaG9yIiAiUGhvc3Bob3IiCisKK0dlc2NobGVjaHQ6CitNCisKK0Jlc2NocmVpYnVuZzoKKy0gbmljaHQgdm9yaGFuZGVuIC0KKworRXJrZW5uYmFya2VpdDoKKy0ga2VpbmUgRWluc2NocmFlbmt1bmcgLQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9QT0lTT05PVVM6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9QSU5FIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1BJTkUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRlMWNkYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9QSU5FCkBAIC0wLDAgKzEsMjQgQEAKK01hdGVyaWFsaWQ6CitNQVRfUElORSAgICAgICAgICAgICAgICAgInBpbmUiCisKK05hbWU6CisiS2llZmVyaG9seiIgIktpZWZlcm5ob2x6ZXMiICJLaWVmZXJob2x6IiAiS2llZmVyaG9seiIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgoraGFyemlnIChQaW5pZSwgS2llbnNwYW4pCisKK0Vya2VubmJhcmtlaXQ6CitNQVRfTUlTQ19DT05JRkVSX1dPT0Q6MTUKK01BVF9QSU5FCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX0RFQUQ6MTAwCitNQVRHUk9VUF9IRVJCQUw6MTAwCitNQVRHUk9VUF9DT05JRkVSX1dPT0Q6MTAwCitNQVRHUk9VUF9JTkZMQU1NQUJMRToxMDAKK01BVEdST1VQX0JJTzoxMDAKK01BVEdST1VQX1NPTElEOjEwMAorTUFUR1JPVVBfV09PRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9QTEFTVElDIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1BMQVNUSUMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM1NTMyNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9QTEFTVElDCkBAIC0wLDAgKzEsMTggQEAKK01hdGVyaWFsaWQ6CitNQVRfUExBU1RJQyAgICAgICAgICAgICAgInBsYXN0aWMiCisKK05hbWU6Cisia3VlbnN0bGljaGVzIE1hdGVyaWFsIiAia3VlbnN0bGljaGVuIE1hdGVyaWFscyIgImt1ZW5zdGxpY2hlbSBNYXRlcmlhbCIgImt1ZW5zdGxpY2hlbiBNYXRlcmlhbCIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorS3Vuc3RzdG9mZgorCitFcmtlbm5iYXJrZWl0OgorTUFUX01JU0NfU09MSUQ6MzUKK01BVF9QTEFTVElDCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX1NPTElEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1BMQVRJTlVNIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1BMQVRJTlVNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNjcxYjUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfUExBVElOVU0KQEAgLTAsMCArMSwyMSBAQAorTWF0ZXJpYWxpZDoKK01BVF9QTEFUSU5VTSAgICAgICAgICAgICAiUHQiCisKK05hbWU6CisiUGxhdGluIiAiUGxhdGlucyIgIlBsYXRpbiIgIlBsYXRpbiIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorZ3JhdXdlaXNzCisKK0Vya2VubmJhcmtlaXQ6CitNQVRfTUlTQ19NRVRBTDowCitNQVRfU0lMVkVSOjUKK01BVF9QTEFUSU5VTQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9NRVRBTDoxMDAKK01BVEdST1VQX1NPTElEOjEwMAorTUFUR1JPVVBfUFJFQ0lPVVNfTUVUQUw6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfUExVVE9OSVVNIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1BMVVRPTklVTQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWEyODU3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1BMVVRPTklVTQpAQCAtMCwwICsxLDIwIEBACitNYXRlcmlhbGlkOgorTUFUX1BMVVRPTklVTSAgICAgICAgICAgICJQdSIKKworTmFtZToKKyJQbHV0b25pdW0iICJQbHV0b25pdW1zIiAiUGx1dG9uaXVtIiAiUGx1dG9uaXVtIgorCitHZXNjaGxlY2h0OgorTgorCitCZXNjaHJlaWJ1bmc6CistIG5pY2h0IHZvcmhhbmRlbiAtCisKK0Vya2VubmJhcmtlaXQ6CitNQVRfRFVTVDo2NQorTUFUX1BMVVRPTklVTQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9SQURJT0FDVElWRToxMDAKK01BVEdST1VQX1BPSVNPTk9VUzoxMDAKK01BVEdST1VQX1NPTElEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1BPUExBUiBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9QT1BMQVIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNmNmVlZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9QT1BMQVIKQEAgLTAsMCArMSwyNCBAQAorTWF0ZXJpYWxpZDoKK01BVF9QT1BMQVIgICAgICAgICAgICAgICAicG9wbGFyIgorCitOYW1lOgorIlBhcHBlbGhvbHoiICJQYXBwZWxob2x6ZXMiICJQYXBwZWxob2x6IiAiUGFwcGVsaG9seiIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorc2VociB3ZWljaCwgZmFzZXJpZworCitFcmtlbm5iYXJrZWl0OgorTUFUX01JU0NfREVDSURVT1VTX1dPT0Q6MjUKK01BVF9QT1BMQVIKKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfREVBRDoxMDAKK01BVEdST1VQX0hFUkJBTDoxMDAKK01BVEdST1VQX0RFQ0lEVU9VU19XT09EOjEwMAorTUFUR1JPVVBfQklPOjEwMAorTUFUR1JPVVBfSU5GTEFNTUFCTEU6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKK01BVEdST1VQX1dPT0Q6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfUVVBUlRaIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1FVQVJUWgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTc4Nzg2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1FVQVJUWgpAQCAtMCwwICsxLDE5IEBACitNYXRlcmlhbGlkOgorTUFUX1FVQVJUWiAgICAgICAgICAgICAgICJxdWFydHoiCisKK05hbWU6CisiUXVhcnoiICJRdWFyemVzIiAiUXVhcnoiICJRdWFyeiIKKworR2VzY2hsZWNodDoKK00KKworQmVzY2hyZWlidW5nOgora2xhciBiaXMgZ3JhdSwgYXVjaCBnZWxiCisKK0Vya2VubmJhcmtlaXQ6CistIGtlaW5lIEVpbnNjaHJhZW5rdW5nIC0KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfTUlORVJBTDoxMDAKK01BVEdST1VQX1NPTElEOjEwMAorTUFUR1JPVVBfU1RPTkU6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfUk9CSU5JQSBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9ST0JJTklBCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMTY5YTcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfUk9CSU5JQQpAQCAtMCwwICsxLDI0IEBACitNYXRlcmlhbGlkOgorTUFUX1JPQklOSUEgICAgICAgICAgICAgICJyb2JpbmlhIgorCitOYW1lOgorIlJvYmluaWVuaG9seiIgIlJvYmluaWVuaG9semVzIiAiUm9iaW5pZW5ob2x6IiAiUm9iaW5pZW5ob2x6IgorCitHZXNjaGxlY2h0OgorTgorCitCZXNjaHJlaWJ1bmc6CitzZWhyIGhhcnQKKworRXJrZW5uYmFya2VpdDoKK01BVF9NSVNDX0RFQ0lEVU9VU19XT09EOjUKK01BVF9ST0JJTklBCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX0RFQUQ6MTAwCitNQVRHUk9VUF9IRVJCQUw6MTAwCitNQVRHUk9VUF9ERUNJRFVPVVNfV09PRDoxMDAKK01BVEdST1VQX0JJTzoxMDAKK01BVEdST1VQX0lORkxBTU1BQkxFOjEwMAorTUFUR1JPVVBfU09MSUQ6MTAwCitNQVRHUk9VUF9XT09EOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1JPU0VXT09EIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1JPU0VXT09ECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZmYzNjIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfUk9TRVdPT0QKQEAgLTAsMCArMSwyNCBAQAorTWF0ZXJpYWxpZDoKK01BVF9ST1NFV09PRCAgICAgICAgICAgICAicm9zZXdvb2QiCisKK05hbWU6CisiUGFsaXNhbmRlciIgIlBhbGlzYW5kZXJzIiAiUGFsaXNhbmRlciIgIlBhbGlzYW5kZXIiCisKK0dlc2NobGVjaHQ6CitNCisKK0Jlc2NocmVpYnVuZzoKK3NjaG9rb2xhZGVuYnJhdW4KKworRXJrZW5uYmFya2VpdDoKK01BVF9NSVNDX1RST1BJQ0FMX1dPT0Q6LTUKK01BVF9ST1NFV09PRAorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9ERUFEOjEwMAorTUFUR1JPVVBfSEVSQkFMOjEwMAorTUFUR1JPVVBfVFJPUElDQUxfV09PRDoxMDAKK01BVEdST1VQX0JJTzoxMDAKK01BVEdST1VQX0lORkxBTU1BQkxFOjEwMAorTUFUR1JPVVBfU09MSUQ6MTAwCitNQVRHUk9VUF9XT09EOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1JVQlkgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfUlVCWQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjAzYzc1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1JVQlkKQEAgLTAsMCArMSwyMSBAQAorTWF0ZXJpYWxpZDoKK01BVF9SVUJZICAgICAgICAgICAgICAgICAicnVieSIKKworTmFtZToKKyJSdWJpbiIgIlJ1YmlucyIgIlJ1YmluIiAiUnViaW4iCisKK0dlc2NobGVjaHQ6CitNCisKK0Jlc2NocmVpYnVuZzoKK3JvdAorCitFcmtlbm5iYXJrZWl0OgorTUFUX01JU0NfSkVXRUw6MjUKK01BVF9SVUJZCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX01JTkVSQUw6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKK01BVEdST1VQX0pFV0VMOjEwMAorTUFUR1JPVVBfU1RPTkU6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfU0FMUEVURVIgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfU0FMUEVURVIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFjYTFiZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9TQUxQRVRFUgpAQCAtMCwwICsxLDE3IEBACitNYXRlcmlhbGlkOgorTUFUX1NBTFBFVEVSICAgICAgICAgICAgICJzYWxwZXRlciIKKworTmFtZToKKyJTYWxwZXRlciIgIlNhbHBldGVycyIgIlNhbHBldGVyIiAiU2FscGV0ZXIiCisKK0dlc2NobGVjaHQ6CitNCisKK0Jlc2NocmVpYnVuZzoKKy0gbmljaHQgdm9yaGFuZGVuIC0KKworRXJrZW5uYmFya2VpdDoKKy0ga2VpbmUgRWluc2NocmFlbmt1bmcgLQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9TT0xJRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9TQUxUIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1NBTFQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ1NGE5ZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9TQUxUCkBAIC0wLDAgKzEsMTggQEAKK01hdGVyaWFsaWQ6CitNQVRfU0FMVCAgICAgICAgICAgICAgICAgIm5hdHJpdW1jaGxvcmlkZSIKKworTmFtZToKKyJTYWx6IiAiU2FsemVzIiAiU2FseiIgIlNhbHoiCisKK0dlc2NobGVjaHQ6CitOCisKK0Jlc2NocmVpYnVuZzoKK0tvY2hzYWx6CisKK0Vya2VubmJhcmtlaXQ6CistIGtlaW5lIEVpbnNjaHJhZW5rdW5nIC0KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfRUFUQUJMRToxMDAKK01BVEdST1VQX1NPTElEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1NBTkQgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfU0FORApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjMzNTUyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1NBTkQKQEAgLTAsMCArMSwxNyBAQAorTWF0ZXJpYWxpZDoKK01BVF9TQU5EICAgICAgICAgICAgICAgICAic2FuZCIKKworTmFtZToKKyJTYW5kIiAiU2FuZHMiICJTYW5kIiAiU2FuZCIKKworR2VzY2hsZWNodDoKK00KKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX1NPTElEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1NBTkRBTCBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9TQU5EQUwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc2NTkwZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9TQU5EQUwKQEAgLTAsMCArMSwyNCBAQAorTWF0ZXJpYWxpZDoKK01BVF9TQU5EQUwgICAgICAgICAgICAgICAic2FuZGFsIgorCitOYW1lOgorIlNhbmRlbGhvbHoiICJTYW5kZWxob2x6ZXMiICJTYW5kZWxob2x6IiAiU2FuZGVsaG9seiIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorZ3V0IHJpZWNoZW5kLCBrb3N0YmFyLCBoYXJ0CisKK0Vya2VubmJhcmtlaXQ6CitNQVRfTUlTQ19UUk9QSUNBTF9XT09EOi01CitNQVRfU0FOREFMCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX0RFQUQ6MTAwCitNQVRHUk9VUF9IRVJCQUw6MTAwCitNQVRHUk9VUF9UUk9QSUNBTF9XT09EOjEwMAorTUFUR1JPVVBfQklPOjEwMAorTUFUR1JPVVBfSU5GTEFNTUFCTEU6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKK01BVEdST1VQX1dPT0Q6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfU0FQUEhJUkUgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfU0FQUEhJUkUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM2ODAwYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9TQVBQSElSRQpAQCAtMCwwICsxLDIxIEBACitNYXRlcmlhbGlkOgorTUFUX1NBUFBISVJFICAgICAgICAgICAgICJzYXBwaGlyZSIKKworTmFtZToKKyJTYXBoaXIiICJTYXBoaXJzIiAiU2FwaGlyIiAiU2FwaGlyIgorCitHZXNjaGxlY2h0OgorTQorCitCZXNjaHJlaWJ1bmc6CitibGF1CisKK0Vya2VubmJhcmtlaXQ6CitNQVRfTUlTQ19KRVdFTDoyNQorTUFUX1NBUFBISVJFCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX01JTkVSQUw6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKK01BVEdST1VQX0pFV0VMOjEwMAorTUFUR1JPVVBfU1RPTkU6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfU0FUSU4gYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfU0FUSU4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJhNmUzYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9TQVRJTgpAQCAtMCwwICsxLDIxIEBACitNYXRlcmlhbGlkOgorTUFUX1NBVElOICAgICAgICAgICAgICAgICJzYXRpbiIKKworTmFtZToKKyJTYXRpbiIgIlNhdGlucyIgIlNhdGluIiAiU2F0aW4iCisKK0dlc2NobGVjaHQ6CitOCisKK0Jlc2NocmVpYnVuZzoKKy0gbmljaHQgdm9yaGFuZGVuIC0KKworRXJrZW5uYmFya2VpdDoKKy0ga2VpbmUgRWluc2NocmFlbmt1bmcgLQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9JTkZMQU1NQUJMRToxMDAKK01BVEdST1VQX0NMT1RIOjEwMAorTUFUR1JPVVBfQklPOjEwMAorTUFUR1JPVVBfRkxFWElCTEU6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9TSEFET1cgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfU0hBRE9XCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZTQ1OWIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfU0hBRE9XCkBAIC0wLDAgKzEsMTcgQEAKK01hdGVyaWFsaWQ6CitNQVRfU0hBRE9XICAgICAgICAgICAgICAgInNoYWRvdyIKKworTmFtZToKKyJTY2hhdHRlbiIgIlNjaGF0dGVucyIgIlNjaGF0dGVuIiAiU2NoYXR0ZW4iCisKK0dlc2NobGVjaHQ6CitNCisKK0Jlc2NocmVpYnVuZzoKKy0gbmljaHQgdm9yaGFuZGVuIC0KKworRXJrZW5uYmFya2VpdDoKKy0ga2VpbmUgRWluc2NocmFlbmt1bmcgLQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9NSVNDOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1NISVQgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfU0hJVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmQwNWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1NISVQKQEAgLTAsMCArMSwxNyBAQAorTWF0ZXJpYWxpZDoKK01BVF9TSElUICAgICAgICAgICAgICAgICAic2hpdCIKKworTmFtZToKKyJTY2hlaXNzZSIgIlNjaGVpc3NlIiAiU2NoZWlzc2UiICJTY2hlaXNzZSIKKworR2VzY2hsZWNodDoKK0YKKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX1NPTElEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1NJTEsgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfU0lMSwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWJkZWM4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1NJTEsKQEAgLTAsMCArMSwyMiBAQAorTWF0ZXJpYWxpZDoKK01BVF9TSUxLICAgICAgICAgICAgICAgICAic2lsayIKKworTmFtZToKKyJTZWlkZSIgIlNlaWRlIiAiU2VpZGUiICJTZWlkZSIKKworR2VzY2hsZWNodDoKK0YKKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX0RFQUQ6MTAwCitNQVRHUk9VUF9GTEVYSUJMRToxMDAKK01BVEdST1VQX0NMT1RIOjEwMAorTUFUR1JPVVBfQklPOjEwMAorTUFUR1JPVVBfSU5GTEFNTUFCTEU6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9TSUxWRVIgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfU0lMVkVSCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NDQ3ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfU0lMVkVSCkBAIC0wLDAgKzEsMTkgQEAKK01hdGVyaWFsaWQ6CitNQVRfU0lMVkVSICAgICAgICAgICAgICAgIkFnIgorCitOYW1lOgorIlNpbGJlciIgIlNpbGJlcnMiICJTaWxiZXIiICJTaWxiZXIiCisKK0dlc2NobGVjaHQ6CitOCisKK0Jlc2NocmVpYnVuZzoKK3dlaXNzCisKK0Vya2VubmJhcmtlaXQ6CistIGtlaW5lIEVpbnNjaHJhZW5rdW5nIC0KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfTUVUQUw6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKK01BVEdST1VQX1BSRUNJT1VTX01FVEFMOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1NLSU4gYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfU0tJTgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzFjOGYwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1NLSU4KQEAgLTAsMCArMSwyMCBAQAorTWF0ZXJpYWxpZDoKK01BVF9TS0lOICAgICAgICAgICAgICAgICAic2tpbiIKKworTmFtZToKKyJIYXV0IiAiSGF1dCIgIkhhdXQiICJIYXV0IgorCitHZXNjaGxlY2h0OgorRgorCitCZXNjaHJlaWJ1bmc6CistIG5pY2h0IHZvcmhhbmRlbiAtCisKK0Vya2VubmJhcmtlaXQ6CistIGtlaW5lIEVpbnNjaHJhZW5rdW5nIC0KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfRkxFWElCTEU6MTAwCitNQVRHUk9VUF9ERUFEOjEwMAorTUFUR1JPVVBfQklPOjEwMAorTUFUR1JPVVBfU09MSUQ6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfU0xBVEUgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfU0xBVEUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdmZDQwYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9TTEFURQpAQCAtMCwwICsxLDE4IEBACitNYXRlcmlhbGlkOgorTUFUX1NMQVRFICAgICAgICAgICAgICAgICJzbGF0ZSIKKworTmFtZToKKyJTY2hpZWZlciIgIlNjaGllZmVycyIgIlNjaGllZmVyIiAiU2NoaWVmZXIiCisKK0dlc2NobGVjaHQ6CitNCisKK0Jlc2NocmVpYnVuZzoKKy0gbmljaHQgdm9yaGFuZGVuIC0KKworRXJrZW5uYmFya2VpdDoKKy0ga2VpbmUgRWluc2NocmFlbmt1bmcgLQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9TVE9ORToxMDAKK01BVEdST1VQX1NPTElEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1NMSU1FIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1NMSU1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5YzA4YTkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfU0xJTUUKQEAgLTAsMCArMSwxNyBAQAorTWF0ZXJpYWxpZDoKK01BVF9TTElNRSAgICAgICAgICAgICAgICAic2xpbWUiCisKK05hbWU6CisiU2NobGVpbSIgIlNjaGxlaW1zIiAiU2NobGVpbSIgIlNjaGxlaW0iCisKK0dlc2NobGVjaHQ6CitNCisKK0Jlc2NocmVpYnVuZzoKKy0gbmljaHQgdm9yaGFuZGVuIC0KKworRXJrZW5uYmFya2VpdDoKKy0ga2VpbmUgRWluc2NocmFlbmt1bmcgLQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9GTFVJRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9TT0FQIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1NPQVAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc5MWRhOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9TT0FQCkBAIC0wLDAgKzEsMTggQEAKK01hdGVyaWFsaWQ6CitNQVRfU09BUCAgICAgICAgICAgICAgICAgInNvYXAiCisKK05hbWU6CisiU2VpZmUiICJTZWlmZXMiICJTZWlmZSIgIlNlaWZlIgorCitHZXNjaGxlY2h0OgorRgorCitCZXNjaHJlaWJ1bmc6CistIG5pY2h0IHZvcmhhbmRlbiAtCisKK0Vya2VubmJhcmtlaXQ6CistIGtlaW5lIEVpbnNjaHJhZW5rdW5nIC0KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfRkxVSUQ6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9TT0RJVU0gYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfU09ESVVNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYzhkYjQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfU09ESVVNCkBAIC0wLDAgKzEsMjEgQEAKK01hdGVyaWFsaWQ6CitNQVRfU09ESVVNICAgICAgICAgICAgICAgIk5hIgorCitOYW1lOgorIk5hdHJpdW0iICJOYXRyaXVtcyIgIk5hdHJpdW0iICJOYXRyaXVtIgorCitHZXNjaGxlY2h0OgorTgorCitCZXNjaHJlaWJ1bmc6CitXYXNzZXItVm9yc2ljaHQKKworRXJrZW5uYmFya2VpdDoKK01BVF9NSVNDX01FVEFMOjAKK01BVF9BTFVNSU5JVU06MzAKK01BVF9TT0RJVU0KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfTUVUQUw6MTAwCitNQVRHUk9VUF9JTkZMQU1NQUJMRToxMDAKK01BVEdST1VQX1NPTElEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1NQUlVDRSBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9TUFJVQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk5ZjRmOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9TUFJVQ0UKQEAgLTAsMCArMSwyNCBAQAorTWF0ZXJpYWxpZDoKK01BVF9TUFJVQ0UgICAgICAgICAgICAgICAic3BydWNlIgorCitOYW1lOgorIkZpY2h0ZW5ob2x6IiAiRmljaHRlbmhvbHplcyIgIkZpY2h0ZW5ob2x6IiAiRmljaHRlbmhvbHoiCisKK0dlc2NobGVjaHQ6CitOCisKK0Jlc2NocmVpYnVuZzoKK3Ryb2NrZW4sIGJydWVjaGlnCisKK0Vya2VubmJhcmtlaXQ6CitNQVRfTUlTQ19DT05JRkVSX1dPT0Q6MTUKK01BVF9TUFJVQ0UKKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfREVBRDoxMDAKK01BVEdST1VQX0hFUkJBTDoxMDAKK01BVEdST1VQX0NPTklGRVJfV09PRDoxMDAKK01BVEdST1VQX0lORkxBTU1BQkxFOjEwMAorTUFUR1JPVVBfQklPOjEwMAorTUFUR1JPVVBfU09MSUQ6MTAwCitNQVRHUk9VUF9XT09EOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1NURUVMIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1NURUVMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYzZjYWQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfU1RFRUwKQEAgLTAsMCArMSwxOSBAQAorTWF0ZXJpYWxpZDoKK01BVF9TVEVFTCAgICAgICAgICAgICAgICAic3RlZWwiCisKK05hbWU6CisiU3RhaGwiICJTdGFobHMiICJTdGFobCIgIlN0YWhsIgorCitHZXNjaGxlY2h0OgorTgorCitCZXNjaHJlaWJ1bmc6CitoYXJ0LCBmbGV4aWJlbAorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX01FVEFMOjEwMAorTUFUR1JPVVBfTUFHTkVUSUM6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9TVFJBVyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9TVFJBVwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODgyYzBjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1NUUkFXCkBAIC0wLDAgKzEsMjAgQEAKK01hdGVyaWFsaWQ6CitNQVRfU1RSQVcgICAgICAgICAgICAgICAgInN0cmF3IgorCitOYW1lOgorIlN0cm9oIiAiU3Ryb2hzIiAiU3Ryb2giICJTdHJvaCIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX0lORkxBTU1BQkxFOjEwMAorTUFUR1JPVVBfRkxFWElCTEU6MTAwCitNQVRHUk9VUF9IRVJCQUw6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9TVUxGVVIgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfU1VMRlVSCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZjhhNWIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfU1VMRlVSCkBAIC0wLDAgKzEsMjAgQEAKK01hdGVyaWFsaWQ6CitNQVRfU1VMRlVSICAgICAgICAgICAgICAgIlMiCisKK05hbWU6CisiU2Nod2VmZWwiICJTY2h3ZWZlbHMiICJTY2h3ZWZlbCIgIlNjaHdlZmVsIgorCitHZXNjaGxlY2h0OgorTQorCitCZXNjaHJlaWJ1bmc6CitnZWxiCisKK0Vya2VubmJhcmtlaXQ6CistIGtlaW5lIEVpbnNjaHJhZW5rdW5nIC0KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfSU5GTEFNTUFCTEU6MTAwCitNQVRHUk9VUF9NSU5FUkFMOjEwMAorTUFUR1JPVVBfU09MSUQ6MTAwCitNQVRHUk9VUF9TVE9ORToxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9UQUxMT1cgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfVEFMTE9XCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZWJmMGIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfVEFMTE9XCkBAIC0wLDAgKzEsMjAgQEAKK01hdGVyaWFsaWQ6CitNQVRfVEFMTE9XICAgICAgICAgICAgICAgInRhbGxvdyIKKworTmFtZToKKyJUYWxnIiAiVGFsZ3MiICJUYWxnIiAiVGFsZyIKKworR2VzY2hsZWNodDoKK00KKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX0lORkxBTU1BQkxFOjEwMAorTUFUR1JPVVBfREVBRDoxMDAKK01BVEdST1VQX0JJTzoxMDAKK01BVEdST1VQX1NPTElEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1RBUiBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9UQVIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRhZDNjYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9UQVIKQEAgLTAsMCArMSwxNyBAQAorTWF0ZXJpYWxpZDoKK01BVF9UQVIgICAgICAgICAgICAgICAgICAidGFyIgorCitOYW1lOgorIlRlZXIiICJUZWVycyIgIlRlZXIiICJUZWVyIgorCitHZXNjaGxlY2h0OgorTQorCitCZXNjaHJlaWJ1bmc6CistIG5pY2h0IHZvcmhhbmRlbiAtCisKK0Vya2VubmJhcmtlaXQ6CistIGtlaW5lIEVpbnNjaHJhZW5rdW5nIC0KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfU09MSUQ6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfVEVBSyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9URUFLCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMmQ3NjcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfVEVBSwpAQCAtMCwwICsxLDI0IEBACitNYXRlcmlhbGlkOgorTUFUX1RFQUsgICAgICAgICAgICAgICAgICJ0ZWFrIgorCitOYW1lOgorIlRlYWtob2x6IiAiVGVha2hvbHplcyIgIlRlYWtob2x6IiAiVGVha2hvbHoiCisKK0dlc2NobGVjaHQ6CitOCisKK0Jlc2NocmVpYnVuZzoKKy0gbmljaHQgdm9yaGFuZGVuIC0KKworRXJrZW5uYmFya2VpdDoKK01BVF9NSVNDX1RST1BJQ0FMX1dPT0Q6MjUKK01BVF9URUFLCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX0RFQUQ6MTAwCitNQVRHUk9VUF9IRVJCQUw6MTAwCitNQVRHUk9VUF9UUk9QSUNBTF9XT09EOjEwMAorTUFUR1JPVVBfQklPOjEwMAorTUFUR1JPVVBfSU5GTEFNTUFCTEU6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKK01BVEdST1VQX1dPT0Q6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfVEhBTExJVU0gYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfVEhBTExJVU0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVjZTA5MQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9USEFMTElVTQpAQCAtMCwwICsxLDIyIEBACitNYXRlcmlhbGlkOgorTUFUX1RIQUxMSVVNICAgICAgICAgICAgICJ0aGFsbGl1bSIKKworTmFtZToKKyJUaGFsbGl1bSIgIlRoYWxsaXVtcyIgIlRoYWxsaXVtIiAiVGhhbGxpdW0iCisKK0dlc2NobGVjaHQ6CitOCisKK0Jlc2NocmVpYnVuZzoKK2dpZnRpZywgc2Nod2VyLCB3ZWljaAorCitFcmtlbm5iYXJrZWl0OgorTUFUX01JU0NfTUVUQUw6MAorTUFUX0xFQUQ6NTAKK01BVF9USEFMTElVTQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9GTEVYSUJMRToxMDAKK01BVEdST1VQX01FVEFMOjEwMAorTUFUR1JPVVBfUE9JU09OT1VTOjEwMAorTUFUR1JPVVBfU09MSUQ6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfVElOIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1RJTgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjI5NDU0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1RJTgpAQCAtMCwwICsxLDIyIEBACitNYXRlcmlhbGlkOgorTUFUX1RJTiAgICAgICAgICAgICAgICAgICJTbiIKKworTmFtZToKKyJaaW5uIiAiWmlubnMiICJaaW5uIiAiWmlubiIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorc2VociB3ZWljaCwgd2Vpc3MKKworRXJrZW5uYmFya2VpdDoKK01BVF9NSVNDX01FVEFMOjAKK01BVF9TSUxWRVI6MTUKK01BVF9MRUFEOjMwCitNQVRfVElOCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX01FVEFMOjEwMAorTUFUR1JPVVBfRkxFWElCTEU6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9USVRBTklVTSBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9USVRBTklVTQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzU0Mzc0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1RJVEFOSVVNCkBAIC0wLDAgKzEsMjAgQEAKK01hdGVyaWFsaWQ6CitNQVRfVElUQU5JVU0gICAgICAgICAgICAgIlRpIgorCitOYW1lOgorIlRpdGFuIiAiVGl0YW5zIiAiVGl0YW4iICJUaXRhbiIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorYWV1c3NlcnN0IGhhcnQKKworRXJrZW5uYmFya2VpdDoKK01BVF9NSVNDX01FVEFMOjEwCitNQVRfU1RFRUw6MjAKK01BVF9USVRBTklVTQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9NRVRBTDoxMDAKK01BVEdST1VQX1NPTElEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1ROVCBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9UTlQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlhZjNlYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9UTlQKQEAgLTAsMCArMSwxOSBAQAorTWF0ZXJpYWxpZDoKK01BVF9UTlQgICAgICAgICAgICAgICAgICAidG50IgorCitOYW1lOgorIlROVCIgIlROVCIgIlROVCIgIlROVCIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX0lORkxBTU1BQkxFOjEwMAorTUFUR1JPVVBfU09MSUQ6MTAwCitNQVRHUk9VUF9FWFBMT1NJVkU6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfVE9PVEggYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfVE9PVEgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ1ODhhNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9UT09USApAQCAtMCwwICsxLDIwIEBACitNYXRlcmlhbGlkOgorTUFUX1RPT1RIICAgICAgICAgICAgICAgICJ0b290aCIKKworTmFtZToKKyJaYWhuIiAiWmFobnMiICJaYWhuIiAiWmFobiIKKworR2VzY2hsZWNodDoKK00KKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX0JJTzoxMDAKK01BVEdST1VQX0RFQUQ6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKK01BVEdST1VQX1NUT05FOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1RPUEFaIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1RPUEFaCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzOWQ1ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfVE9QQVoKQEAgLTAsMCArMSwyMSBAQAorTWF0ZXJpYWxpZDoKK01BVF9UT1BBWiAgICAgICAgICAgICAgICAidG9wYXoiCisKK05hbWU6CisiVG9wYXMiICJUb3BhcyIgIlRvcGFzIiAiVG9wYXMiCisKK0dlc2NobGVjaHQ6CitNCisKK0Jlc2NocmVpYnVuZzoKK2dlbGIKKworRXJrZW5uYmFya2VpdDoKK01BVF9NSVNDX0pFV0VMOjI1CitNQVRfVE9QQVoKKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfTUlORVJBTDoxMDAKK01BVEdST1VQX1NPTElEOjEwMAorTUFUR1JPVVBfSkVXRUw6MTAwCitNQVRHUk9VUF9TVE9ORToxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9UVU5HU1RFTiBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9UVU5HU1RFTgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTdjNjQzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1RVTkdTVEVOCkBAIC0wLDAgKzEsMTkgQEAKK01hdGVyaWFsaWQ6CitNQVRfVFVOR1NURU4gICAgICAgICAgICAgIlciCisKK05hbWU6CisiV29sZnJhbSIgIldvbGZyYW1zIiAiV29sZnJhbSIgIldvbGZyYW0iCisKK0dlc2NobGVjaHQ6CitOCisKK0Jlc2NocmVpYnVuZzoKK3NlaHIgaGFydCwgaGl0emViZXN0YWVuZGlnCisKK0Vya2VubmJhcmtlaXQ6CitNQVRfTUlTQ19NRVRBTDoyNQorTUFUX1RVTkdTVEVOCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX01FVEFMOjEwMAorTUFUR1JPVVBfU09MSUQ6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfVFVSUVVPSVNFIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1RVUlFVT0lTRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmUzMGY5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1RVUlFVT0lTRQpAQCAtMCwwICsxLDIxIEBACitNYXRlcmlhbGlkOgorTUFUX1RVUlFVT0lTRSAgICAgICAgICAgICJ0dXJxdW9pc2UiCisKK05hbWU6CisiVHVlcmtpcyIgIlR1ZXJraXMiICJUdWVya2lzIiAiVHVlcmtpcyIKKworR2VzY2hsZWNodDoKK00KKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorTUFUX01JU0NfSkVXRUw6MjUKK01BVF9UVVJRVU9JU0UKKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfTUlORVJBTDoxMDAKK01BVEdST1VQX1NPTElEOjEwMAorTUFUR1JPVVBfSkVXRUw6MTAwCitNQVRHUk9VUF9TVE9ORToxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9WRUxWRVQgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfVkVMVkVUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYTU2MzQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfVkVMVkVUCkBAIC0wLDAgKzEsMjEgQEAKK01hdGVyaWFsaWQ6CitNQVRfVkVMVkVUICAgICAgICAgICAgICAgInZlbHZldCIKKworTmFtZToKKyJTYW10IiAiU2FtdHMiICJTYW10IiAiU2FtdCIKKworR2VzY2hsZWNodDoKK00KKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX0lORkxBTU1BQkxFOjEwMAorTUFUR1JPVVBfQ0xPVEg6MTAwCitNQVRHUk9VUF9CSU86MTAwCitNQVRHUk9VUF9GTEVYSUJMRToxMDAKK01BVEdST1VQX1NPTElEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1dBVEVSIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1dBVEVSCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMDQ5OGYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfV0FURVIKQEAgLTAsMCArMSwxOCBAQAorTWF0ZXJpYWxpZDoKK01BVF9XQVRFUiAgICAgICAgICAgICAgICAid2F0ZXIiCisKK05hbWU6CisiV2Fzc2VyIiAiV2Fzc2VycyIgIldhc3NlciIgIldhc3NlciIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgorLSBuaWNodCB2b3JoYW5kZW4gLQorCitFcmtlbm5iYXJrZWl0OgorLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX0VMRU1FTlRBTDoxMDAKK01BVEdST1VQX0ZMVUlEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1dBWCBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9XQVgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFhMTYzYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9XQVgKQEAgLTAsMCArMSwxNyBAQAorTWF0ZXJpYWxpZDoKK01BVF9XQVggICAgICAgICAgICAgICAgICAid2F4IgorCitOYW1lOgorIldhY2hzIiAiV2FjaHNlcyIgIldhY2hzIiAiV2FjaHMiCisKK0dlc2NobGVjaHQ6CitOCisKK0Jlc2NocmVpYnVuZzoKKy0gbmljaHQgdm9yaGFuZGVuIC0KKworRXJrZW5uYmFya2VpdDoKKy0ga2VpbmUgRWluc2NocmFlbmt1bmcgLQorCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9TT0xJRDoxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9XRUNLQU1JTiBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9XRUNLQU1JTgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjJiZWNiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1dFQ0tBTUlOCkBAIC0wLDAgKzEsMTggQEAKK01hdGVyaWFsaWQ6CitNQVRfV0VDS0FNSU4gICAgICAgICAgICAgIndlY2thbWluZSIKKworTmFtZToKKyJBdWZwdXRzY2htaXR0ZWwiICJBdWZwdXRzY2htaXR0ZWxzIiAiQXVmcHV0c2NobWl0dGVsIiAiQXVmcHV0c2NobWl0dGVsIgorCitHZXNjaGxlY2h0OgorTgorCitCZXNjaHJlaWJ1bmc6CistIG5pY2h0IHZvcmhhbmRlbiAtCisKK0Vya2VubmJhcmtlaXQ6CistIGtlaW5lIEVpbnNjaHJhZW5rdW5nIC0KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfRFJVRzoxMDAKK01BVEdST1VQX1NPTElEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1dJTExPVyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9XSUxMT1cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU1ZjBlZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9XSUxMT1cKQEAgLTAsMCArMSwyNSBAQAorTWF0ZXJpYWxpZDoKK01BVF9XSUxMT1cgICAgICAgICAgICAgICAid2lsbG93IgorCitOYW1lOgorIldlaWRlbmhvbHoiICJXZWlkZW5ob2x6ZXMiICJXZWlkZW5ob2x6IiAiV2VpZGVuaG9seiIKKworR2VzY2hsZWNodDoKK04KKworQmVzY2hyZWlidW5nOgord2VpY2ggdW5kIGZsZXhpYmVsCisKK0Vya2VubmJhcmtlaXQ6CitNQVRfTUlTQ19ERUNJRFVPVVNfV09PRDo1CitNQVRfV0lMTE9XCisKK0dydXBwZW56dWdlaG9lcmlna2VpdDoKK01BVEdST1VQX0RFQUQ6MTAwCitNQVRHUk9VUF9IRVJCQUw6MTAwCitNQVRHUk9VUF9ERUNJRFVPVVNfV09PRDoxMDAKK01BVEdST1VQX0ZMRVhJQkxFOjEwMAorTUFUR1JPVVBfQklPOjEwMAorTUFUR1JPVVBfSU5GTEFNTUFCTEU6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKK01BVEdST1VQX1dPT0Q6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfV09PREVOX1BMQU5UIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1dPT0RFTl9QTEFOVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzljNzk1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1dPT0RFTl9QTEFOVApAQCAtMCwwICsxLDIyIEBACitNYXRlcmlhbGlkOgorTUFUX1dPT0RFTl9QTEFOVCAgICAgICAgICJ3b29kZW5fcGxhbnQiCisKK05hbWU6CisiQmF1bSIgIkJhdW1lcyIgIkJhdW0iICJCYXVtIgorCitHZXNjaGxlY2h0OgorTQorCitCZXNjaHJlaWJ1bmc6CitQZmxhbnplbiBtaXQgSG9semFudGVpbCAoQmFldW1lLCBHZWJ1ZXNjaGUpCisKK0Vya2VubmJhcmtlaXQ6CistIGtlaW5lIEVpbnNjaHJhZW5rdW5nIC0KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfSEVSQkFMOjEwMAorTUFUR1JPVVBfQklPOjEwMAorTUFUR1JPVVBfSU5GTEFNTUFCTEU6MTAwCitNQVRHUk9VUF9TT0xJRDoxMDAKK01BVEdST1VQX1dPT0Q6MTAwCitNQVRHUk9VUF9MSVZJTkc6MTAwCmRpZmYgLS1naXQgYS9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfV09PTCBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9XT09MCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMmFlMDcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWF0ZXJpYWxzL21hdGVyaWFscy9NQVRfV09PTApAQCAtMCwwICsxLDIyIEBACitNYXRlcmlhbGlkOgorTUFUX1dPT0wgICAgICAgICAgICAgICAgICJ3b29sIgorCitOYW1lOgorIldvbGxlIiAiV29sbGUiICJXb2xsZSIgIldvbGxlIgorCitHZXNjaGxlY2h0OgorRgorCitCZXNjaHJlaWJ1bmc6CistIG5pY2h0IHZvcmhhbmRlbiAtCisKK0Vya2VubmJhcmtlaXQ6CistIGtlaW5lIEVpbnNjaHJhZW5rdW5nIC0KKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfREVBRDoxMDAKK01BVEdST1VQX0ZMRVhJQkxFOjEwMAorTUFUR1JPVVBfSU5GTEFNTUFCTEU6MTAwCitNQVRHUk9VUF9CSU86MTAwCitNQVRHUk9VUF9DTE9USDoxMDAKK01BVEdST1VQX1NPTElEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1lFVyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9ZRVcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VmOGY2NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9ZRVcKQEAgLTAsMCArMSwyNiBAQAorTWF0ZXJpYWxpZDoKK01BVF9ZRVcgICAgICAgICAgICAgICAgICAieWV3IgorCitOYW1lOgorIkVpYmVuaG9seiIgIkVpYmVuaG9semVzIiAiRWliZW5ob2x6IiAiRWliZW5ob2x6IgorCitHZXNjaGxlY2h0OgorTgorCitCZXNjaHJlaWJ1bmc6Cit6YWVoLCBiaWVnc2FtCisKK0Vya2VubmJhcmtlaXQ6CitNQVRfTUlTQ19DT05JRkVSX1dPT0Q6NQorTUFUX1lFVworCitHcnVwcGVuenVnZWhvZXJpZ2tlaXQ6CitNQVRHUk9VUF9JTkZMQU1NQUJMRToxMDAKK01BVEdST1VQX0JJTzoxMDAKK01BVEdST1VQX1NPTElEOjEwMAorTUFUR1JPVVBfUE9JU09OT1VTOjEwMAorTUFUR1JPVVBfV09PRDoxMDAKK01BVEdST1VQX0hFUkJBTDoxMDAKK01BVEdST1VQX0NPTklGRVJfV09PRDoxMDAKK01BVEdST1VQX0RFQUQ6MTAwCitNQVRHUk9VUF9GTEVYSUJMRToxMDAKZGlmZiAtLWdpdCBhL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9aSU5DIGIvZG9jL21hdGVyaWFscy9tYXRlcmlhbHMvTUFUX1pJTkMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk3MGUxNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYXRlcmlhbHMvbWF0ZXJpYWxzL01BVF9aSU5DCkBAIC0wLDAgKzEsMjIgQEAKK01hdGVyaWFsaWQ6CitNQVRfWklOQyAgICAgICAgICAgICAgICAgInppbmMiCisKK05hbWU6CisiWmluayIgIlppbmtzIiAiWmluayIgIlppbmsiCisKK0dlc2NobGVjaHQ6CitOCisKK0Jlc2NocmVpYnVuZzoKK3dlaWNoLCBiZXN0YWVuZGlnCisKK0Vya2VubmJhcmtlaXQ6CitNQVRfTUlTQ19NRVRBTDowCitNQVRfU0lMVkVSOjE1CitNQVRfTEVBRDozMAorTUFUX1pJTkMKKworR3J1cHBlbnp1Z2Vob2VyaWdrZWl0OgorTUFUR1JPVVBfTUVUQUw6MTAwCitNQVRHUk9VUF9GTEVYSUJMRToxMDAKK01BVEdST1VQX1NPTElEOjEwMApkaWZmIC0tZ2l0IGEvZG9jL21jbWQvLnJlYWRtZSBiL2RvYy9tY21kLy5yZWFkbWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE3ZGI5OAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tY21kLy5yZWFkbWUKQEAgLTAsMCArMSwzIEBACitIaWVyIGZpbmRlc3QgRHUgSGlsZmVzZWl0ZW4genUgZGVuIEJlZmVobGVuLCBkaWUgZGllIE1hZ2llcnNoZWxsIHp1cgorVmVyZnVlZ3VuZyBzdGVsbHQuCisKZGlmZiAtLWdpdCBhL2RvYy9tY21kLy5zeW5vbnltIGIvZG9jL21jbWQvLnN5bm9ueW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY2MTM4YQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tY21kLy5zeW5vbnltCkBAIC0wLDAgKzEsMyBAQAoraGVhbCBoZWlsZQorcGVhY2UgZnJpZWRlbgorKyBnb3RvCmRpZmYgLS1naXQgYS9kb2MvbWNtZC9hZGRndWlsZG1hc3RlciBiL2RvYy9tY21kL2FkZGd1aWxkbWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYWI2ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWNtZC9hZGRndWlsZG1hc3RlcgpAQCAtMCwwICsxLDI1IEBACisKK2FkZGd1aWxkbWFzdGVyCistLS0tLS0tLS0tLS0tLQorCisgRVJaTUFHSUVSS09NTUFORE86CisgICAgYWRkZ3VpbGRtYXN0ZXIgPG5hbWU+IDxnaWxkZT4KKworIEFSR1VNRU5URToKKworICAgICA8bmFtZT4KKyAgICAgICAgTmFtZSBkZXMgTWFnaWVycworICAgICA8Z2lsZGU+CisgICAgICAgIE5hbWUgZWluZXIgR2lsZGUKKworIEJFU0NIUkVJQlVORzoKKyAgICBEZXIgTWFnaWVyIDxuYW1lPiB3aXJkIHp1bSBHaWxkZW5tYWdpZXIgZnVlciBkaWUgR2lsZGUgPGdpbGRlPiAKKyAgICBlcm5hbm50LgorCisgICAgRGllc2VyIEJlZmVobCBzdGVodCBudXIgR29ldHRlcm4genVyIFZlcmZ1ZWd1bmcuCisKKyBTSUVIRSBBVUNIOgorICAgIHJlbW92ZWd1aWxkbWFzdGVyLCBnaWxkZW4KKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgMjAwMy0xMi0xMCwgWm9vawpkaWZmIC0tZ2l0IGEvZG9jL21jbWQvYWRkbWFzdGVyIGIvZG9jL21jbWQvYWRkbWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNjg5ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWNtZC9hZGRtYXN0ZXIKQEAgLTAsMCArMSwyNCBAQAorCithZGRtYXN0ZXIKKy0tLS0tLS0tLQorCisgRVJaTUFHSUVSS09NTUFORE86CisgICAgYWRkbWFzdGVyIDxuYW1lPiA8cmVnaW9uPgorCisgQVJHVU1FTlRFOgorCisgICAgIDxuYW1lPgorICAgICAgICBOYW1lIGRlcyBNYWdpZXJzCisgICAgIDxyZWdpb24+CisgICAgICAgIEVpbmUgUmVnaW9uCisKKyBCRVNDSFJFSUJVTkc6CisgICAgRGVyIE1hZ2llciA8bmFtZT4gd2lyZCBpbiBkZXIgUmVnaW9uIDxyZWdpb24+IHp1bSBSZWdpb25zbWFnaWVyIGVybmFubnQuCisKKyAgICBEaWVzZXIgQmVmZWhsIHN0ZWh0IG51ciBFcnptYWdpZXJuIHVuZCBHb2V0dGVybiB6dXIgVmVyZnVlZ3VuZy4KKworIFNJRUhFIEFVQ0g6CisgICAgcmVtb3ZlbWFzdGVyLCByZWdpb25lbgorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBUaHUsIDI0LjA3LjE5OTcsIDA5OjAwOjAwIHZvbiBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9tY21kL2F0IGIvZG9jL21jbWQvYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMxNWI3MwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tY21kL2F0CkBAIC0wLDAgKzEsMzMgQEAKKworYXQKKy0tCisKKyBNQUdJRVJLT01NQU5ETzoKKyAgICBhdCA8bmFtZT4gPGtvbW1hbmRvPgorCisgQVJHVU1FTlRFOgorCisgICAgIDxyYXVtPgorICAgICAgICBOYW1lIGVpbmVzIExlYmV3ZXNlbnMKKyAgICAgPGtvbW1hbmRvPgorICAgICAgICBkYXMgYXV6dWZ1ZWhyZW5kZSBLb21tYW5kbworCisgQkVTQ0hSRUlCVU5HOgorICAgIER1IHdpcnN0LCB1bnNpY2h0YmFyIGZ1ZXIgZGllIEFud2VzZW5kZW4sIGluIGRlbiBSYXVtIHRyYW5zcG9ydGllcnQsIGluCisgICAgZGVtIHNpY2ggZGFzIExlYmV3ZXNlbiA8bmFtZT4gYmVmaW5kZXQuIERvcnQgZnVlaHJzdCBEdSBkYXMgS29tbWFuZG8KKyAgICA8a29tbWFuZG8+IGF1cyB1bmQgZ2VsYW5nc3QgYXV0b21hdGlzY2ggd2llZGVyIGluIGRlbiBSYXVtIHp1cnVlY2ssIGluIGRlbQorICAgIER1IHZvcmhlciB3YXJzdC4KKworIEJFSVNQSUVMRToKKyAgICBDYXR3ZWF6bGUgbWFjaHQgbWFsIHdpZWRlciBGYXhlbj8KKworICAgID4gYXQgY2F0d2VhemxlIHd1ZXJnZSBjYXR3ZWF6bGUKKworICAgIERpZSBVbXN0ZWhlbmRlbiBzZWhlbiBkYW5uIHp3YXIgZGllIE1lbGR1bmdlbiBkZXMgS29tbWFuZG9zLCBhYmVyIG1hbgorICAgIHNlbGJzdCBiZWZpbmRldCBzaWNoIHNvZm9ydCB3aWVkZXIgaW4gU2ljaGVyaGVpdCA6KQorCisgU0lFSEUgQVVDSDoKKyAgICBpbiwgZ290bworCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBUaHUsIDI0LjA3LjE5OTcsIDA5OjAwOjAwIHZvbiBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9tY21kL2JhbmlzaCBiL2RvYy9tY21kL2JhbmlzaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzEwNGVmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21jbWQvYmFuaXNoCkBAIC0wLDAgKzEsMzggQEAKKworYmFuaXNoCistLS0tLS0KKworIE1BR0lFUktPTU1BTkRPOgorICAgIGJhbmlzaCBbLWZdIDxuYW1lPiBbPGdydW5kPl0KKworIEFSR1VNRU5URToKKworICAgIC1mIChvcHRpb25hbCkKKyAgICAgICAgU3BlcnJ1bmcgZXJ6d2luZ2VuCisgICAgIDxuYW1lPgorICAgICAgICBEZXIgenUgc3BlcnJlbmRlIE5hbWUKKyAgICAgPGdydW5kPiAob3B0aW9uYWwpCisgICAgICAgIERlciBHcnVuZCBkZXIgU3BlcnJlCisKKyBCRVNDSFJFSUJVTkc6CisgICAgTWl0IGRpZXNlbSBCZWZlaGwga2FubiBtYW4gYmVzdGltbXRlIE5hbWVuIHNwZXJyZW4sIHNvIGRhc3Mgc2ljaCBrZWluZQorICAgIFNwaWVsZXIgbWl0IGdsZWljaGVtIE5hbWVuIGVpbmxvZ2dlbiBrb2VubmVuLiBTaW5udm9sbCBpc3QgZGllcyB6LkIuIGJlaQorICAgIE5hbWVuIHZvbiBOUENzIG9kZXIgT2VydGxpY2hrZWl0ZW4sIHdvIGVzIGdnZi4genUgVmVyd2lycnVuZ2VuIGtvbW1lbgorICAgIGtvZW5udGUuCisKKyAgICBBbHMgZ3V0ZSBQcmF4aXMgc29sbHRlIG1hbiBpbiBkZW4gR3J1bmQgYXVjaCBhbmdlYmVuLCBmdWVyIHdlbGNoZW4gCisgICAgTWFnaWVyIGRlciBOYW1lIGdlc3BlcnJ0IHd1cmRlLiAKKworICAgIE1pdCBkZXIgT3B0aW9uIC1mIGthbm4gbWFuIGF1Y2ggTmFtZW4gdm9uIGV4aXN0ZW50ZW4gU3BpZWxlcm4gYmFuaXNoZW4uCisgICAgRGllc2Uga29lbm5lbiBzaWNoIHdlaXRlcmhpbiBub2NoIGVpbmxvZ2dlbiwgYWJlciBzb2JhbGQgZGVyIFNwaWVsZXIgc2ljaAorICAgIGxvZXNjaHQsIGlzdCBkZXIgTmFtZSBnZXNwZXJydC4KKworICAgIE1pdCBkZW0gR3J1bmQgJ2xvZXNjaGVuJyBrb2VubmVuIGdlc3BlcnJ0ZSBOYW1lbiB3aWVkZXIgZnJlaWdlZ2ViZW4gd2VyZGVuLgorCisgICAgRGllc2VyIEJlZmVobCBrYW5uIG51ciB2b24gUmVnaW9ucy0gdW5kIGhvZWhlcmVuIE1hZ2llcm4gYXVzZ2VmdWVocnQgd2VyZGVuLgorCisgU0lFSEUgQVVDSDoKKyAgICBtYmFuaXNoLCB0YmFuaXNoLCBzYmFuaXNoCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIERvbiwgIDIuIE1haSAyMDEzLCAxMTo0NTowOCB2b24gWm9vawpkaWZmIC0tZ2l0IGEvZG9jL21jbWQvY2F0IGIvZG9jL21jbWQvY2F0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YWIwMmIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWNtZC9jYXQKQEAgLTAsMCArMSwyMyBAQAorCitjYXQKKy0tLQorCisgTUFHSUVSS09NTUFORE86CisgICAgY2F0IDxkYXRlaT4KKworIEFSR1VNRU5URToKKworICAgICA8ZGF0ZWk+CisgICAgICAgIERpZSBhdXN6dWdlYmVuZGUgRGF0ZWkKKworIEJFU0NIUkVJQlVORzoKKyAgICBCaXMgenUgNDAgWmVpbGVuIGRlciBEYXRlaSA8ZGF0ZWk+IHdlcmRlbiBhdXNnZWdlYmVuLiBCZWltIEFiYnJ1Y2gKKyAgICBlcnNjaGVpbnQgZGllIE1lbGR1bmcKKworICAgICoqKioqVFJVTkNBVEVEKioqKgorCisgU0lFSEUgQVVDSDoKKyAgICBoZWFkLCB0YWlsLCBtb3JlCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFRodSwgMjQuMDcuMTk5NywgMDk6MDA6MDAgdm9uIFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL21jbWQvY2QgYi9kb2MvbWNtZC9jZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDc3NGI2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21jbWQvY2QKQEAgLTAsMCArMSwzNyBAQAorCitjZAorLS0KKworIE1BR0lFUktPTU1BTkRPOgorICAgIGNkIFsgLSBdIFsgLWwgXSBbIC1zIF0gWyA8VmVyemVpY2huaXM+IF0KKworIEFSR1VNRU5URToKKworICAgICA8VmVyemVpY2huaXM+ICBuZXVlciBQZmFkLCBkZXIgZ2VzZXR6dCB3ZXJkZW4gc29sbAorCisgQkVTQ0hSRUlCVU5HOgorICAgIERhcyBha3R1ZWxsZSBWZXJ6ZWljaG5pcyB3aXJkIGF1ZiA8VmVyemVpY2huaXM+IGdlc2V0enQuCisKKyAgICBMYWVzc3QgbWFuIDxWZXJ6ZWljaG5pcz4gd2VnLCB3aXJkIGRhcyBha3R1ZWxsZSBWZXJ6ZWljaG5pcyBhdWYgZGFzCisgICAgSGVpbWF0dmVyemVpY2huaXMgZ2VzZXR6dC4gQmVpIGVpbmVtIE1hZ2llciBtaXQgTWFnaWVybGV2ZWwgMTUgaXN0IGRpZXMKKyAgICBkYXMgVmVyemVpY2huaXMgYC9kb2MnLCBhYiBNYWdpZXJsZXZlbCAyMCBkYXMgVmVyemVpY2huaXMKKyAgICBgL3BsYXllcnMvPE1hZ2llcm5hbWU+Jy4KKworICAgIEJlaSBFaW5kZXV0aWdrZWl0IGtvZW5uZW4gUGxhdHpoYWx0ZXIgdmVyd2VuZGV0IHdlcmRlbi4gRGllIEJlZmVobGUgCisgICAgY2QgL3N0ZC9wbGF5ZXIvc2hhZG93cyB1bmQgY2QgLyovcGwqL3NoKiBiZXdpcmtlbiBkYXNzZWxiZS4KKworICAgIE1pdCBkZXIgT3B0aW9uIC0gd2lyZCBkaXJla3QgaW5zIGxldHp0ZSBWZXJ6ZWljaG5pcyBnZXdlY2hzZWx0LgorCisgICAgTWl0IGRlbiBPcHRpb25lbiAtbCB1bmQgLXMga2FubiBtYW4gZGllIEJlaGFuZGx1bmcgdm9uIGAucmVhZG1lJy1EYXRlaWVuCisgICAgaW0gWmllbHZlcnplaWNobmlzIGVpbnN0ZWxsZW4uIE1pdCBkZXIgT3B0aW9uIC1zIHdpcmQgZGllIEF1c2dhYmUgZGVyCisgICAgYC5yZWFkbWUnLURhdGVpZW4gdmVyaGluZGVydCwgbWl0IC1sIGRhZ2VnZW4gZXJsYXVidC4KKworICAgIFVlYmVyIGRpZSBWYXJpYWJsZSAnQ0RfU0hPUlQnIGthbm4gZWluZ2VzdGVsbHQgd2VyZGVuLCBvYiBgLnJlYWRtZSctCisgICAgRGF0ZWllbiBncnVuZHNhZXR6bGljaCB1bnRlcmRydWVja3Qgd2VyZGVuIHNvbGxlbi4gRGF6dSBlaW5mYWNoIAorICAgICdzZXQgQ0RfU0hPUlQgMScgZWluZ2ViZW4KKworIFNJRUhFIEFVQ0g6CisgICAgcHJvbXB0LCBwd2QsIGxzLCBzZXQKKworIExFVFpURSBBRU5ERVJVTkc6CisgICAgMDMuMDYuMjAxNSwgQnVnZml4CmRpZmYgLS1naXQgYS9kb2MvbWNtZC9jbG9uZSBiL2RvYy9tY21kL2Nsb25lCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZjQ2MjcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWNtZC9jbG9uZQpAQCAtMCwwICsxLDM2IEBACisKK2Nsb25lCistLS0tLQorCisgTUFHSUVSS09NTUFORE86CisgICAgY2xvbmUgWy1mXSA8b2JqZWt0bmFtZT4KKworIEFSR1VNRU5URToKKworICAgICA8b2JqZWt0bmFtZT4gRGF0ZWluYW1lIGRlcyBPYmpla3RlcywgZGFzIGVyemV1Z3Qgd2VyZGVuIHNvbGwKKworIE9QVElPTkVOOgorCisgICAgIC1mOiAgRXJ6d2luZ3QgZGVuIFZlcnN1Y2ggZGVzIENsb25lbnMgb2huZSBVZWJlcnBydWVmdW5nLCBvYiBlaW5lCisgICAgICAgICAgRGF0ZWkgZXhpc3RpZXJ0LiBEaWVzZSBPcHRpb24gc29sbHRlIG51ciBpbiBBdXNuYWhtZWZhZWxsZW4KKyAgICAgICAgICB2ZXJ3ZW5kZXQgd2VyZGVuLCBkYSBGZWhsc2NobGFlZ2Ugc29mb3J0IGFscyBGZWhsZXJtZWxkdW5nIGltCisgICAgICAgICAgRHJpdmVybG9nIGF1ZnRhdWNoZW4uCisKKyBCRVNDSFJFSUJVTkc6CisgICAgRWluZSBLb3BpZSB2b24gZWluZW0gT2JqZWt0LCBkYXMgaW0gRmlsZSA8b2JqZWt0bmFtZT4gYmVzY2hyaWViZW4gaXN0LAorICAgIHdpcmQgZXJ6ZXVndC4gRGFzIE9iamVrdCBiZWZpbmRldCBzaWNoIGRhbmFjaCBpbSBJbnZlbnRhciBkZXMgTWFnaWVycworICAgIG9kZXIgKHdlbm4gaW4gZGVtIE9iamVrdCBQX05PR0VUIGdlc2V0enQgaXN0KSBpbSBnbGVpY2hlbiBSYXVtIHdpZSBkZXIKKyAgICBNYWdpZXIuCisKKyAgICBEaWUgQmx1ZXByaW50IHdpcmQgenUgbmljaHRzIGFuZGVyZW0gZ2VicmF1Y2h0LCBhbHMgS29waWVuIHp1IGVyemV1Z2VuLgorCisgICAgV2VubiBlaW4gT2JqZWt0IG5vY2ggbmljaHQgZ2VsYWRlbiBpc3QsIHdpcmQgZXMgbmV1IGdlbGFkZW4uCisKKyAgICBSYWV1bWUgc29sbHRlbiBuaWVtYWxzIGdlY2xvbnQgd2VyZGVuLCBkYSBzaWUgaW1tZXIgbnVyIGVpbm1hbCBleGlzdGllcmVuCisgICAgc29sbHRlbiB1bmQgbmljaHQgaW4gbWVocmVybiBLb3BpZW4uCisKKyBTSUVIRSBBVUNIOgorICAgIGxvYWQsIGRlc3RydWN0LCB1cGQsIHNldGNtc2cKKworIExFVFpURSBBRU5ERVJVTkc6CisgICAgTWl0LCAwNS4wNi4yMDAzLCAxODowMDowMCB2b24gTWFuZHJhZ29uCmRpZmYgLS1naXQgYS9kb2MvbWNtZC9jcCBiL2RvYy9tY21kL2NwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1Y2Y1YjUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWNtZC9jcApAQCAtMCwwICsxLDQ1IEBACisKK2NwCistLQorCisgTUFHSUVSS09NTUFORE86CisgICAgY3AgWyAtaXJmdiBdIDx2b24+IDxuYWNoPgorICAgIGNwIFsgLWlyZnYgXSA8dm9uXzE+IFsgLi4uIDx2b25fbj4gXSA8dmVyej4KKyAgICBjcCBbIC1pcmZ2bSBdIDx2b25fMT4gWyAuLi4gPHZvbl9uPiBdIDx2ZXJ6PiA8bWFza2U+CisgCisgQVJHVU1FTlRFOgorCisgICAgIDx2b24+ICAgTmFtZSBkZXIgUXVlbGxkYXRlaQorICAgICA8dm9uX3g+IE5hbWUgdm9uIFF1ZWxsZGF0ZWllbiBvZGVyIC12ZXJ6ZWljaG5pc3NlbgorICAgICA8bmFjaD4gIE5hbWUgZGVyIFppZWxkYXRlaQorICAgICA8dmVyej4gIE5hbWUgZGVzIFppZWx2ZXJ6ZWljaG5pc3NlcworICAgICA8bWFza2U+IERhdGVpbWFza2UKKworIEJFU0NIUkVJQlVORzoKKyAgICBEaWUgRGF0ZWkgPHZvbj4gd2lyZCBuYWNoIERhdGVpIDxuYWNoPiBrb3BpZXJ0LCBiencuIGRpZSBEYXRlaShlbikgPHZvbl8xPgorICAgICgtIDx2b25fbj4pIGluIGRhcyBWZXJ6ZWljaG5pcyA8dmVyej4uCisKKyAgICBEaWUgRGF0ZWluYW1lbiBrb2VubmVuIGF1Y2ggTXVzdGVyIHdpZSAqIG9kZXIgPyBlbnRoYWx0ZW4uCisKKyAgICBadXNhZXR6bGljaCBrb2VubmVuIGZvbGdlbmRlIEZsYWdzIGFuZ2VnZWJlbiB3ZXJkZW46CisKKyAgICAgLWkgIFZvciBqZWRlbSBrb3BpZXJlbiB3aXJkIGdlZnJhZ3QsIG9iIGtvcGllcnQgd2VyZGVuIHNvbGwKKyAgICAgLXIgIFVudGVydmVyemVpY2huaXNzZSB3ZXJkZW4gcmVrdXJzaXYga29waWVydAorICAgICAtZiAgVm9yIGRlbSBVZWJlcnNjaHJlaWJlbiBlaW5lciBleGlzdGllcmVuZGVuIERhdGVpIHdpcmQgbmljaHQgZ2VmcmFndAorICAgICAtdiAgRXMgd2lyZCBqZWRlciBBcmJlaXRzc2Nocml0dCBhdWYgZGVtIEJpbGRzY2hpcm0gYXVzZ2VnZWJlbgorICAgICAtbSAgRXMgd2VyZGVuIG51ciBEYXRlaWVuIGtvcGllcnQsIGRpZSBkZXIgTWFza2UgPG1hc2tlPiBlbnRzcHJlY2hlbi4KKyAgICAgICAgIExldHplcmUgd2lyZCBpbSBnbG9iLUZvcm1hdCBhbmdlZ2ViZW4uICh6LkIuICouYywgc2F2ZSoubykKKyAgICAKKyBCRUlTUElFTEU6CisKKyAgICA+IGNwIGRhdGVpMSBkYXRlaTIKKyAgICA+IGNwICouYyB0ZW1wCisgICAgPiBjcCAvZG9jL3MqIC4KKyAgICA+IGNwIC1pcm0gL2RvYyB+L0tVUlMgKi5jIAorICAgID4gY3AgLXJmIH5tYW5kcmFnb24vbWVsb3JhbiAvZC9pbnNlbG4vbWFuZHJhZ29uCisKKyBTSUVIRSBBVUNIOgorICAgIG12LCBybSwgbWtkaXIsIHJtZGlyCisKKyBMRVRaVEUgQUVOREVSVU5HOgorICAgIE1pdCwgMDIuMTAuMjAwMiwgMDI6MDA6MDAgdm9uIE1hbmRyYWdvbgpkaWZmIC0tZ2l0IGEvZG9jL21jbWQvZGVzdHJ1Y3QgYi9kb2MvbWNtZC9kZXN0cnVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODVlZDRjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21jbWQvZGVzdHJ1Y3QKQEAgLTAsMCArMSwzMCBAQAorCitkZXN0cnVjdAorLS0tLS0tLS0KKworIE1BR0lFUktPTU1BTkRPOgorICAgIGRlc3RydWN0IDxvYmpla3Q+CisKKyBBUkdVTUVOVEU6CisKKyAgICAgPG9iamVrdD4gICBJRCBlaW5lcyBPYmpla3RlcworCisgQkVTQ0hSRUlCVU5HOgorICAgIFdlbm4gZXMgZWluIE9iamVrdCBpbiBkZXIgVW1nZWJ1bmcgKEludmVudG9yeSwgUmF1bSkgZ2lidCwgZGFzIGF1ZgorICAgIDxvYmpla3Q+IGFuc3ByaWNodCwgd2lyZCBkaWVzZXMgT2JqZWt0IHplcnN0b2VydC4KKworICAgIEluIGRlbSBPYmpla3Qgd2lyZCByZW1vdmUoKSBhdWZnZXJ1ZmVuLCB1bSBlcyB6dSB6ZXJzdG9lcmVuLiBGYWxscyBkaWVzCisgICAgbmljaHQgenVyIFplcnN0b2VydW5nIGRlcyBPYmpla3RlcyBmdWVocnQgKHdlaWwgZGFzIE9iamVrdCBnYXIga2VpbgorICAgIHJlbW92ZSgpIGRlZmluaWVydCBvZGVyIGRpZSByZW1vdmUoKS1GdW5rdGlvbiBkYXMgWmVyc3RvZXJlbiB2ZXJoaW5kZXJ0KSwKKyAgICBibGVpYnQgZGFzIE9iamVrdCBlcmhhbHRlbi4KKworIEJFTUVSS1VOR0VOOgorICAgIFNwaWVsZXIgZHVlcmZlbiBuaWVtYWxzIHplcnN0b2VydCB3ZXJkZW4hCisKKyBTSUVIRSBBVUNIOgorICAgIGxvYWQsIGNsb25lLCB1cGQsIHNldGRtc2csCisgICAgcmVtb3ZlKEwpLCBkZXN0cnVjdChFKQorCisgTEVUWlRFIEFFTkRFUlVORzoKKyAgICAxMS4wNi4yMDE0LCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9tY21kL2RvIGIvZG9jL21jbWQvZG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgwZjQ1MwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tY21kL2RvCkBAIC0wLDAgKzEsMzAgQEAKKworZG8KKy0tCisKKyBNQUdJRVJLT01NQU5ETzoKKyAgICBkbyA8Y21kcz4KKworIEFSR1VNRU5URToKKworICAgICA8Y21kcz4KKyAgICAgICAgTGlzdGUgdm9uIEJlZmVobGVuIChtaXQgYDsnIGdldHJlbm50KQorCisgQkVTQ0hSRUlCVU5HOgorICAgIE1pdCBkaWVzZW0gQmVmZWhsIGthbm4gbWFuIG1laHJlcmUgYW5kZXJlIEJlZmVobGUgbmFjaGVpbmFuZGVyIGF1c2Z1ZWhyZW4uCisgICAgRGllcyBsYWVzc3Qgc2ljaCB6dW0gQmVpc3BpZWwgaW0gWnVzYW1tZW5oYW5nIG1pdCBBbGlhc2VuIGF1c251dHplbi4KKworICAgIERpZSBlaW56ZWxuZW4gQmVmZWhsZSB3ZXJkZW4gZHVyY2ggU2VtaWtvbG9ucyAoYDsnKSBnZXRyZW5udDsgaW4gZGVuCisgICAgQmVmZWhsZW4gc2VsYnN0IGR1ZXJmZW4ga2VpbmUgU2VtaWtvbG9ucyB2b3Jrb21tZW4uCisKKyBCRUlTUElFTEU6CisgICAgV2VubiBtYW4gc2VpbiBFcnNjaGVpbmVuIGluIGRlciBBYmVudGV1cmVyZ2lsZGUgbWl0IGVpbmVtIGZyZXVuZGxpY2hlbgorICAgIEdydXNzIHZlcmJpbmRlbiBtb2VjaHRlLCBrb2VubnRlIG1hbiBmb2xnZW5kZXJtYXNzZW4gdm9yZ2VoZW46CisKKyAgICA+IGRvIGdvdG8gL2dpbGRlbi9hYmVudGV1cmVyOyBzYWcgSGFsbG8hCisKKyBTSUVIRSBBVUNIOgorICAgIGFsaWFzCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFRodSwgMjQuMDcuMTk5NywgMDk6MDA6MDAgdm9uIFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL21jbWQvZWNob2FsbCBiL2RvYy9tY21kL2VjaG9hbGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FiZWZkMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tY21kL2VjaG9hbGwKQEAgLTAsMCArMSwyNCBAQAorCitlY2hvYWxsCistLS0tLS0tCisKKyBNQUdJRVJLT01NQU5ETzoKKyAgICBlY2hvYWxsIDx0ZXh0PgorCisgQVJHVU1FTlRFOgorCisgICAgIDx0ZXh0PgorICAgICAgICBlaW4gYmVsaWViaWdlciBUZXh0CisKKyBCRVNDSFJFSUJVTkc6CisgICAgRGVyIFRleHQgPHRleHQ+IHdpcmQgYW4gYWxsZSBTcGllbGVyIGltIE1VRCBnZXNjaGlja3QuCisKKyAgICBEZXIgQmVmZWhsIHNvbGx0ZSBtaXQgZ3JvZXNzdGVyIFNvcmdmYWx0IGJlaGFuZGVsdCB3ZXJkZW4uIEluIGRpZXNlbQorICAgIFp1c2FtbWVuaGFuZyBzZWkgYXVjaCBub2NobWFsIGRhcmF1ZiBoaW5nZXdpZXNlbiwgZGFzcyBFY2hvcyBpbiBmcmVtZGVtCisgICAgTmFtZW4gbmljaHQgZXJsYXVidCBzaW5kLgorCisgU0lFSEUgQVVDSDoKKyAgICB2ZXJ0cmFnLCBlbW90ZSwgZWNobywgZWNob3RvLCBtZWNobywgdGVpbGUgKG1pdCkKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgVHVlLCAwMi4wOS4xOTk3LCAxNjo1NDoxOCB2b24gV2FyZ29uCmRpZmYgLS1naXQgYS9kb2MvbWNtZC9lY2hvdG8gYi9kb2MvbWNtZC9lY2hvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUyODMxMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tY21kL2VjaG90bwpAQCAtMCwwICsxLDI2IEBACisKK2VjaG90bworLS0tLS0tCisKKyBNQUdJRVJLT01NQU5ETzoKKyAgICBlY2hvdG8gPG5hbWU+IDx0ZXh0PgorCisgQVJHVU1FTlRFOgorCisgICAgIDxuYW1lPgorICAgICAgICBOYW1lIGVpbmVzIChlaW5nZWxvZ2d0ZW4pIFNwaWVsZXJzIG9kZXIgTlBDcworICAgICA8dGV4dD4KKyAgICAgICAgZWluIGJlbGllYmlnZXIgVGV4dAorCisgQkVTQ0hSRUlCVU5HOgorICAgIERlciBUZXh0IDx0ZXh0PiB3aXJkIGFuIGRhcyBMZWJld2VzZW4gPG5hbWU+IGdlc2NoaWNrdC4KKworICAgIERlciBCZWZlaGwgc29sbHRlIG1pdCBTb3JnZmFsdCBiZWhhbmRlbHQgd2VyZGVuLiBJbiBkaWVzZW0gWnVzYW1tZW5oYW5nCisgICAgc2VpIGF1Y2ggbm9jaG1hbCBkYXJhdWYgaGluZ2V3aWVzZW4sIGRhc3MgRWNob3MgaW4gZnJlbWRlbSBOYW1lbiBuaWNodAorICAgIGVybGF1YnQgc2luZC4KKworIFNJRUhFIEFVQ0g6CisgICAgdmVydHJhZywgZW1vdGUsIGVjaG8sIGVjaG9hbGwsIG1lY2hvLCB0ZWlsZSAobWl0KQorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBUdWUsIDAyLjA5LjE5OTcsIDE2OjU0OjM4IHZvbiBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9tY21kL2VkIGIvZG9jL21jbWQvZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZjNWJlMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tY21kL2VkCkBAIC0wLDAgKzEsNDcgQEAKKworZWQKKy0tCisKKyBNQUdJRVJLT01NQU5ETzoKKyAgICBlZCA8ZGF0ZWk+IFsuLi5dCisKKyBBUkdVTUVOVEU6CisKKyAgICAgPGRhdGVpPiBbLi4uXQorICAgICAgICBOYW1lKG4pIGRlciB6dSBiZWFyYmVpdGVuZGVuIERhdGVpKGVuKQorCisgQkVTQ0hSRUlCVU5HOgorICAgIFN0YXJ0ZXQgZGVuIEVkaXRvciBuYWNoZWluYW5kZXIgbWl0IGplZGVyIGFuZ2VnZWJlbmVuIERhdGVpLgorCisgICAgRGllIERhdGVpbmFtZW4ga29lbm5lbiBhdWNoIE11c3RlciB3aWUgKiBvZGVyID8gZW50aGFsdGVuLgorCisgICAgRGVyIEVkaXRvciBpc3QgaW0gZ3Jvc3NlbiB1bmQgZ2FuemVuIGtvbXBhdGliZWwgenVtIFVOSVggRWRpdG9yIGVkLiBFciBpc3QKKyAgICB6ZWlsZW5vcmllbnRpZXJ0IHVuZCBmdW5rdGlvbmllcnQgbmFjaCBlaW5lbSBlaW5mYWNoZW4gUHJpbnppcC4KKworICAgIEVzIGdpYnQgendlaSBNb2RpOiBLb21tYW5kb21vZHVzIHVuZCBFaW5nYWJlbW9kdXMKKworICAgICBLb21tYW5kb21vZHVzOgorCisgICAgICAgICAqIEhhdCBkYXMgUHJvbXB0IGA6JworICAgICAgICAgKiBBa3plcHRpZXJ0IEJlZmVobGUgZGVyIEFydCBbPGFkZHJlc3NlPl08YmVmZWhsPgorICAgICAgICAgICBIaWVyYmVpIGJlc3RlaHQgPGFkcmVzc2U+IGF1cyBlaW5lciBaZWlsZW5udW1tZXIgb2RlciBhdXMgZWluZXIKKyAgICAgICAgICAgQW5nYWJlIGRpZSBtZWhyZXJlIFplaWxlbiBhZHJlc3NpZXJ0OiB6ZWlsZTEsemVpbGUyCisgICAgICAgICAgIERpZSBCZWZlaGxlIGtvZW5uZW4gbWl0IGRlbSBCZWZlaGwgYGgnIGFiZ2VydWZlbiB3ZXJkZW4uCisKKyAgICAgRWluZ2FiZW1vZHVzOgorCisgICAgICAgICAqIEhhdCBrZWluZW4gUHJvbXB0LgorICAgICAgICAgKiBBa3plcHRpZXJ0IEVpbmdhYmVuLCBiaXMgYXVmIGVpbmVyIGVpbnplbG5lbiBaZWlsZSBlaW4gYC4nCisgICAgICAgICAgIGVpbmdlZ2ViZW4gd2lyZCwgZGFzIHdlY2hzZWx0IHdpZWRlciBpbiBkZW4gS29tbWFuZG9tb2R1cy4KKworIEJFSVNQSUVMRToKKworICAgID4gZWQgdGVzdC5jCisgICAgPiBlZCAqLmMKKworIFNJRUhFIEFVQ0g6CisgICAgbW9yZSwgaGVhZCwgdGFpbCwgbG9hZCwgY2xvbmUKKyAgICBlZDAoTFBDKSwgZWQxKExQQyksIGVkMihMUEMpLCBlZDMoTFBDKSwgZWQ0KExQQyksIGVkNShMUEMpCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFRodSwgMjQuMDcuMTk5NywgMDk6MDA6MDAgdm9uIFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL21jbWQvZXhlYyBiL2RvYy9tY21kL2V4ZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM5MGYwZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tY21kL2V4ZWMKQEAgLTAsMCArMSwyOSBAQAorCitleGVjCistLS0tCisKKyBNQUdJRVJLT01NQU5ETzoKKyAgICBleGVjIDxkYXRlaT4KKworIEFSR1VNRU5URToKKworICAgICA8ZGF0ZWk+CisgICAgICAgIERhdGVpbmFtZSBkZXMgWmllbG9iamVrdGVzCisKKyBCRVNDSFJFSUJVTkc6CisgICAgRXMgd2lyZCB2ZXJzdWNodCwgZWluZW4gQ2xvbmUgdm9uIDxkYXRlaT4genUgZXJzY2hhZmZlbiB1bmQgRGVpbmUKKyAgICBWZXJiaW5kdW5nIHp1bSBNVUQgYW4gZGllc2VuIENsb25lIHdlaXRlcnp1Z2ViZW4uIERhcyBPYmpla3Qgc29sbHRlIGRhenUKKyAgICBtb2VnbGljaHN0IGVpbmUgUmFzc2Vuc2hlbGwsIHp1bWluZGVzdCBhYmVyIGAvc3RkL3BsYXllci9iYXNlLmMnIGdlZXJidAorICAgIGhhYmVuLgorCisgICAgRGFzIE9iamVrdCBtdXNzIGRpZSBnbGVpY2hlIFVJRCBiZXNpdHplbiB3aWUgRHUgKHNwcmljaDogZXMgbXVzcyBzaWNoIGluCisgICAgZWluZW0gRGVpbmVyIFZlcnplaWNobmlzc2UgYmVmaW5kZW4pLgorCisgICAgRGllc2VyIEJlZmVobCBrYW5uIG51ciB2b24gUmVnaW9ucy0gdW5kIGhvZWhlcmVuIE1hZ2llcm4gYXVzZ2VmdWVocnQKKyAgICB3ZXJkZW4uCisKKyBTSUVIRSBBVUNIOgorICAgIGV4ZWMoRSkKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgVGh1LCAyNC4wNy4xOTk3LCAwOTowMDowMCB2b24gV2FyZ29uCmRpZmYgLS1naXQgYS9kb2MvbWNtZC9mcmllZGVuIGIvZG9jL21jbWQvZnJpZWRlbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjhmMTBmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21jbWQvZnJpZWRlbgpAQCAtMCwwICsxLDI0IEBACisKK2ZyaWVkZW4KKy0tLS0tLS0KKworIE1BR0lFUktPTU1BTkRPOgorICAgIGZyaWVkZW4gWzxuYW1lPl0KKworIEFSR1VNRU5URToKKworICAgICA8bmFtZT4gKG9wdGlvbmFsKQorICAgICAgICBOYW1lIGVpbmVzIExlYmV3ZXNlbnMKKworIEJFU0NIUkVJQlVORzoKKyAgICBPaG5lIEFyZ3VtZW50IHdlcmRlbiBhbGxlIEthZW1wZmUgaW4gZGVtIFJhdW0sIGluIGRlbSBEdSBEaWNoIGdlcmFkZQorICAgIGJlZmluZGVzdCBhYmdlYnJvY2hlbi4KKworICAgIE1pdCBBcmd1bWVudCBicmljaHQgZGFzIExlYmV3ZXNlbiA8bmFtZT4gZGVuIEthbXBmIGFiIChkLmguIGVzIHNlbGJzdAorICAgIHNjaGxhZWd0IG5pY2h0IG1laHIgenUsIHVuZCBhdWNoIHNlaW5lIEZlaW5kZSBncmVpZmVuIGVzIG5pY2h0IG1laHIgYW4pLgorCisgU0lFSEUgQVVDSDoKKyAgICBzdG9wCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFRodSwgMjQuMDcuMTk5NywgMDk6MDA6MDAgdm9uIFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL21jbWQvZ290byBiL2RvYy9tY21kL2dvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg3ZGRhMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tY21kL2dvdG8KQEAgLTAsMCArMSw1MiBAQAorCitnb3RvCistLS0tCisKKyBNQUdJRVJLT01NQU5ETzoKKyAgICBnb3RvIDx6aWVsPgorICAgICs8bWFnaWVyPgorCisgQVJHVU1FTlRFOgorCisgICAgIDx6aWVsPgorICAgICAgICBQZmFkbmFtZSBvZGVyIE5hbWUgZWluZXMgTGViZXdlc2VucworICAgICA8bWFnaWVyPgorICAgICAgICBOYW1lIGVpbmVzIE1hZ2llcnMgKG1pbmRlc3RlbnMgTWFnaWVybGV2ZWwgMjApCisKKyBCRVNDSFJFSUJVTkc6CisgICAgTWl0IGRpZXNlbiBCZWZlaGxlbiBnZWxhbmdzdCBEdSBhbiBkaWUgZ2V3dWVuc2NodGVuIE9ydGUgaW0gTW9yZ2VuR3JhdWVuLgorCisgICAgSXN0IDx6aWVsPiBlaW4gUGZhZG5hbWUsIHNvIGdlbGFuZ3N0IER1IGRpcmVrdCBpbiBkZW4gYW5nZWdlYmVuZW4gUmF1bS4KKworICAgIElzdCA8emllbD4gZGFnZWdlbiBkZXIgTmFtZSBlaW5lcyAoZWluZ2Vsb2dndGVuKSBTcGllbGVycyBvZGVyIGVpbmVzIE5QQ3MsCisgICAgc28gd2lyc3QgRHUgaW4gZGVuIFJhdW0gdGVsZXBvcnRpZXJ0LCBpbiBkZW0gc2ljaCBkYXMgZW50c3ByZWNoZW5kZQorICAgIExlYmV3ZXNlbiBhdWZoYWVsdC4KKyAgICAKKyAgICBXZW5uIG1laGVyZSBOUENzIGRlcyBOYW1lbnMgZXhpc3RpZXJlbiwga2FubiBtYW4gbWl0ICdnb3RvIG5hbWUgbnInIGRlbgorICAgIGdld3VlbnNjaHRlbiBhdXN3YWVobGVuLgorCisgICAgRWluZSBzY2huZWxsZSBBcnQsIGluIGRlbiBBcmJlaXRzcmF1bSBkZXMgTWFnaWVycyA8bWFnaWVyPiB6dSBnZWxhbmdlbiwKKyAgICBpc3QgZGFzIEtvbW1hbmRvICs8bWFnaWVyPi4KKworICAgIFdlbm4gRHUgRGljaCBpbSBWZXJmb2xnZW1vZHVzIGJlZmluZGV0LCB3aXJkIGRpZXNlciBkdXJjaCBkZW4gQmVmZWhsCisgICAgYWJnZXNjaGFsdGV0LgorCisgQkVJU1BJRUxFOgorICAgIEluIFdhcmdvbnMgQXJiZWl0c3JhdW0gc3RlaHQgaW1tZXIgZWluIE5QQyBuYW1lbnMgRXJyb2wuIERlc2hhbGIga2FubiBtYW4KKyAgICBhdWYgZm9sZ2VuZGUgZHJlaSBBcnRlbiBpbiBXYXJnb25zIEFyYmVpdHNyYXVtIGdlbGFuZ2VuOgorCisgICAgPiBnb3RvIH53YXJnb24vd29ya3Jvb20KKyAgICA+IGdvdG8gZXJyb2wKKyAgICA+ICt3YXJnb24KKyAgICAKKyAgICBFcyBnaWJ0IGltIE1vcmdlbmdyYXVlbiB6YWhscmVpY2hlIFJlaGUuIFp1IGRlbiBlaW56ZWxuZW4gZ2VsYW5ndCBtYW4gbWl0CisgICAgPiBnb3RvIHJlaCAxCisgICAgPiBnb3RvIHJlaCAyCisgICAgPiBnb3RvIHJlaCAzCisgICAgPiAuLi4KKworIFNJRUhFIEFVQ0g6CisgICAgdHJhbnMsIGluLCBhdCwgc2V0bW1pbiwgc2V0bW1vdXQKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgU2F0LCAyOS4wNy4yMDAwLCAxODowMDowMCB2b24gU2lsdmFuYQpkaWZmIC0tZ2l0IGEvZG9jL21jbWQvZ3JlcCBiL2RvYy9tY21kL2dyZXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI1YTcyZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tY21kL2dyZXAKQEAgLTAsMCArMSw1NSBAQAorCitncmVwCistLS0tCisKKyBNQUdJRVJLT01NQU5ETzoKKyAgICBncmVwIFsgLWNoaWxudnJmIF0gPHJlZ2V4cD4gPG5hbWU+IFsuLi5dCisgICAgZ3JlcCBbIC1jaGlsbnZybWYgXSA8cmVnZXhwPiA8bmFtZT4gWy4uLl0gWzxtYXNrZT5dCisKKyBBUkdVTUVOVEU6CisKKyAgICAgPHJlZ2V4cD4gICAgICAgcmVndWxhZXJlciBTdWNoYXVzZHJ1Y2sKKyAgICAgPG5hbWU+IFsuLi5dICAgRGllIHp1IGR1cmNoc3VjaGVuZGUobikgRGF0ZWkoZW4pIChvZGVyIFZlcnplaWNobmlzc2UpCisgICAgIDxtYXNrZT4gICAgICAgIE1hc2tlLCBkZXIgZWluZSBEYXRlaSBlbnRzcHJlY2hlbiBtdXNzIChnbG9iKQorCisgQkVTQ0hSRUlCVU5HOgorICAgIEluIGRlbiBhbmdlZ2ViZW5lbiBEYXRlaWVuIHdpcmQgbmFjaCBkZW0gcmVndWxhZXJlbiBBdXNkcnVjayA8cmVnZXhwPgorICAgIGdlc3VjaHQuCisKKyAgICBEaWUgRGF0ZWluYW1lbiBrb2VubmVuIGF1Y2ggTXVzdGVyIHdpZSAqIG9kZXIgPyBlbnRoYWx0ZW4uCisKKyAgICBadXNhZXR6bGljaCBrb2VubmVuIGZvbGdlbmRlIEZsYWdzIGFuZ2VnZWJlbiB3ZXJkZW46CisKKyAgICAgLWMgIEVzIHdpcmQgbnVyIGRpZSBaYWhsIGRlciBnZWZ1bmRlbmVuIFplaWxlbiBwcm8gRGF0ZWkgYXVzZ2VnZWJlbi4KKyAgICAgLWggIERpZSBEYXRlaW5hbWVuIHdlcmRlbiBuaWNodCBtaXQgYXVzZ2VnZWJlbi4KKyAgICAgLWkgIEdyb3NzLSB1bmQgS2xlaW5zY2hyZWlidW5nIHdlcmRlbiBpZ25vcmllcnQuCisgICAgIC1sICBEaWUgRGF0ZWluYW1lbiB3ZXJkZW4gaW1tZXIgbWl0IGF1c2dlZ2ViZW4uCisgICAgIC1uICBEaWUgWmVpbGVubnVtbWVybiBkZXIgZ2VmdW5kZW5lbiBaZWlsZW4gd2VyZGVuIGF1c2dlZ2ViZW4uCisgICAgIC12ICBFcyB3ZXJkZW4gZGllIFplaWxlbiBhdXNnZWdlYmVuLCBpbiBkZW5lbiA8cmVnZXhwPiAqbmljaHQqIGdlZnVuZGVuCisgICAgICAgICB3dXJkZS4KKyAgICAgLXIgIEhhbmRlbHQgZXMgc2ljaCBiZWkgPG5hbWU+IHVtIGVpbiBWZXJ6ZWljaG5pcywgd2VyZGVuIHJla3Vyc2l2CisgICAgICAgICBhbGxlIGRhcmluIGJlZmluZGxpY2hlbiBEYXRlaWVuIGR1cmNoc3VjaHQuCisgICAgIC1tICBFcyB3ZXJkZW4gbnVyIERhdGVpZW4gZHVyY2hzdWNodCwgZGllIGF1ZiBkaWUgRGF0ZWltYXNrZSA8bWFza2U+CisgICAgICAgICBwYXNzZW4uIExldHp0ZXJlIHdpcmQgaW4gZ2xvYi1Gb3JtIGFuZ2VnZWJlbi4KKyAgICAgLWYgIEFsbGUgQXVzZ2FiZW4gdm9uIGdyZXAgd2VyZGVuIGluIGRpZSBEYXRlaSBncmVwLm91dCBpbSBWZXJ6ZWljaG5pcworICAgICAgICAgZGVzIE1hZ2llcnMgKC9wbGF5ZXJzL21hZ2llcm5hbWUpIGF1c2dlZ2ViZW4uCisKKyBCRU1FUktVTkdFTjoKKyAgICBEYXMgRHVyY2hzdWNoZW4gc2VociBsYW5nZXIgRGF0ZWllbiBvZGVyIHZvbiBWZXJ6ZWljaG5pc3NlbiBtaXQgc2VocgorICAgIHZpZWxlbiBEYXRlaWVuIHNvbGx0ZSBtYW4gbW9lZ2xpY2hzdCB2ZXJtZWlkZW4sIGRhIGRpZXMgc2VociBsYWdpbnRlbnNpdgorICAgIGlzdC4KKworIEJFSVNQSUVMRToKKworICAgID4gZ3JlcCBQX04gL3N5cy8qLmgKKyAgICA+IGdyZXAgLW4gIi4qW2FiXSoiIGRhdGVpLmMKKyAgICA+IGdyZXAgLXJtICJQX0JMQUJMVUJCIiAvc3RkICouYyAtPiBzdWNodCBhbGxlIERhdGVpZW4gaW4gL3N0ZCwgZGllCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVmIC5jIGVuZGVuIHVuZCBQX0JMQUJMVUJCCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aGFsdGVuIAorCisgU0lFSEUgQVVDSDoKKyAgICByZWdleHAoRSksIG1vcmUsIGNhdCwgaGVhZCwgdGFpbAorCisgTEVUWlRFIEFFTkRFUlVORzoKKyAgICBNaXQsIDAyLjEwLjIwMDIsIDAyOjAwOjAwIHZvbiBNYW5kcmFnb24KKyAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvbWNtZC9oZWFkIGIvZG9jL21jbWQvaGVhZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTZhZDViCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21jbWQvaGVhZApAQCAtMCwwICsxLDIwIEBACisKK2hlYWQKKy0tLS0KKworIE1BR0lFUktPTU1BTkRPOgorICAgIGhlYWQgPGRhdGVpPgorCisgQVJHVU1FTlRFOgorCisgICAgIDxkYXRlaT4KKyAgICAgICAgRGllIGF1c3p1Z2ViZW5kZSBEYXRlaQorCisgQkVTQ0hSRUlCVU5HOgorICAgIERpZSBlcnN0ZW4gemVobiBaZWlsZW4gZGVyIERhdGVpIDxkYXRlaT4gd2VyZGVuIGF1c2dlZ2ViZW4uCisKKyBTSUVIRSBBVUNIOgorICAgIGNhdCwgdGFpbCwgbW9yZQorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBUaHUsIDI0LjA3LjE5OTcsIDA5OjAwOjAwIHZvbiBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9tY21kL2hlaWxlIGIvZG9jL21jbWQvaGVpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI2OTgyZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tY21kL2hlaWxlCkBAIC0wLDAgKzEsMjcgQEAKKworaGVpbGUKKy0tLS0tCisKKyBNQUdJRVJLT01NQU5ETzoKKyAgICBoZWlsZSA8emllbD4KKworIEFSR1VNRU5URToKKworICAgICA8emllbD4KKyAgICAgICAgRGFzIHp1IGhlaWxlbmRlIExlYmV3ZXNlbgorCisgQkVTQ0hSRUlCVU5HOgorICAgIERhcyBhbmdlZ2ViZW5lIExlYmV3ZXNlbiB3aXJkIHZvbGxzdGFlbmRpZyBnZWhlaWx0LgorCisgICAgRGVyIEJlZmVobCBkYXJmIG51ciBmdWVyIFRlc3RzIGJlbnV0enQgd2VyZGVuLiBNYW4gc29sbHRlIGRhcmF1ZiBhY2h0ZW4sCisgICAgZGFzcyBtYW4ga2VpbmUgU3BpZWxlciBkYW1pdCBiZWVpbmZsdXNzdCwgdW5kIHp3YXIgd2VkZXIgaW0gR3V0ZW4gKGluZGVtCisgICAgbWFuIGRlbiBTcGllbGVyIGhlaWx0KSBub2NoIGltIEJvZXNlbiAoaW5kZW0gbWFuIGRhcyBNb25zdGVyIGhlaWx0LCBnZWdlbgorICAgIGRhcyBkZXIgU3BpZWxlciBnZXJhZGUga2FlbXBmdCkuCisKKyAgICBNYWdpZXItTGVocmxpbmdlbiBzdGVodCBkaWVzZXIgQmVmZWhsIG5vY2ggbmljaHQgenVyIFZlcmZ1ZWd1bmcuCisKKyBTSUVIRSBBVUNIOgorICAgIHZlcnRyYWcKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgVHVlLCAwMi4wOS4xOTk3LCAxNjo1NDo0NSB2b24gV2FyZ29uCmRpZmYgLS1naXQgYS9kb2MvbWNtZC9ob21lIGIvZG9jL21jbWQvaG9tZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGZjOTA3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21jbWQvaG9tZQpAQCAtMCwwICsxLDIzIEBACisKK2hvbWUKKy0tLS0KKworIE1BR0lFUktPTU1BTkRPOgorICAgIGhvbWUKKworIEFSR1VNRU5URToKKyAgICBrZWluZQorCisgQkVTQ0hSRUlCVU5HOgorICAgIER1IHdpcnN0IGluIERlaW5lbiBXb3Jrcm9vbSB0cmFuc3BvcnRpZXJ0LgorCisgICAgTWFnaWVyLUxlaHJsaW5nZW4gc3RlaHQgZGllc2VyIEJlZmVobCBub2NoIG5pY2h0IHp1ciBWZXJmdWVndW5nLCBkYSBzaWUKKyAgICBhdWNoIG5vY2gga2VpbmVuIFdvcmtyb29tIGhhYmVuLgorICAgIFdlbm4gRHUgRGljaCBpbSBWZXJmb2xnZW1vZHVzIGJlZmluZGV0LCB3aXJkIGRpZXNlciBkdXJjaCBkZW4gQmVmZWhsCisgICAgYWJnZXNjaGFsdGV0LgorCisgU0lFSEUgQVVDSDoKKyAgICBnb3RvCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFNhdCwgMjkuMDcuMjAwMCwgMTg6MDA6MDAgdm9uIFNpbHZhbmEKZGlmZiAtLWdpdCBhL2RvYy9tY21kL2lnbm9yaWVyZSBiL2RvYy9tY21kL2lnbm9yaWVyZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2FhYmY0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21jbWQvaWdub3JpZXJlCkBAIC0wLDAgKzEsMzAgQEAKKworaWdub3JpZXJlCistLS0tLS0tLS0KKworIE1BR0lFUktPTU1BTkRPOgorICAgIGlnbm9yaWVyZSA8bWFnaWVyPi5kZWJ1ZworCisgQVJHVU1FTlRFOgorCisgICAgIDxtYWdpZXI+CisgICAgICAgIE5hbWUgZGVzIE1hZ2llcnMsIGRlc3NlbiBCdWdtZWxkdW5nZW4gaWdub3JpZXJ0IHdlcmRlbiBzb2xsZW4uCisKKyBCRVNDSFJFSUJVTkc6CisgICAgTWl0IEhpbGZlIGRpZXNlcyBCZWZlaGxzIGthbm4gbWFuIGdlemllbHQgZGllIEJ1Z3MgZWluZXMgYmVzdGltbXRlbiAKKyAgICBNYWdpZXJzIGlnbm9yaWVyZW4uCisgICAgCisgICAgRXMgd2VyZGVuIGRpZSBCdWctTWVsZHVuZ2VuIGF1ZiBkZW4gS2FuYWVsZW4gJ2RlYnVnJyB1bmQgYXVmIAorICAgICdlbnR3aWNrbHVuZycgaWdub3JpZXJ0LiAKKworICAgIEJlaW0gRHVyY2hzZWhlbiBkZXIgS2FuYWwtSGlzdG9yeSAoLWRlYioyMCkgd2VyZGVuIGRpZSBCdWdzIGFsbGVyZGluZ3MgCisgICAgbmljaHQgaWdub3JpZXJ0LgorCisgICAgJy1kZWIgYmFja3RyYWNlJyBsaWVmZXJ0IGVpbiBCYWNrdHJhY2UgenUgZGVtIGxldHp0ZW4gYXVmZ2V0cmV0ZW5lbiBCdWcsCisgICAgdm9lbGxpZyB1bmFiaGFlbmdpZywgb2IgZGVyIEF1ZnJ1ZmVuZGUgZGVuIEJ1ZyBpZ25vcmllcnQuCisKKyBTSUVIRSBBVUNIOgorICAgIGlnbm9yaWVyZSAoU3BpZWxlcmtvbW1hbmRvKQorCisgTEVUWlRFIEFFTkRFUlVORzoKKyAgICBEb24sIDAxLjA4LjIwMDIsIDE3OjE1OjAwIHZvbiBWYW5pb24KZGlmZiAtLWdpdCBhL2RvYy9tY21kL2luIGIvZG9jL21jbWQvaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI5NjA5ZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tY21kL2luCkBAIC0wLDAgKzEsMjkgQEAKKworaW4KKy0tCisKKyBNQUdJRVJLT01NQU5ETzoKKyAgICBpbiA8cmF1bT4gPGtvbW1hbmRvPgorCisgQVJHVU1FTlRFOgorCisgICAgIDxyYXVtPgorICAgICAgICBEYXRlaW5hbWUgZWluZXMgUmF1bWVzCisgICAgIDxrb21tYW5kbz4KKyAgICAgICAgZGFzIGF1enVmdWVocmVuZGUgS29tbWFuZG8KKworIEJFU0NIUkVJQlVORzoKKyAgICBEdSB3aXJzdCwgdW5zaWNodGJhciBmdWVyIGRpZSBBbndlc2VuZGVuLCBpbiBkZW4gUmF1bSA8cmF1bT4KKyAgICB0cmFuc3BvcnRpZXJ0LCBmdWVocnN0IGRhcyBLb21tYW5kbyA8a29tbWFuZG8+IGF1cyB1bmQgZ2VsYW5nc3QKKyAgICBhdXRvbWF0aXNjaCB3aWVkZXIgaW4gZGVuIFJhdW0genVydWVjaywgaW4gZGVtIER1IHZvcmhlciB3YXJzdC4KKworIEJFSVNQSUVMRToKKyAgICBFaW4gQmxpY2sgYXVmIGRpZSBha3R1ZWxsZSBMaXN0ZSBkZXIgQWJlbnRldWVyOgorCisgICAgPiBpbiAvZ2lsZGVuL2FiZW50ZXVyZXIgbGlzdGUKKworIFNJRUhFIEFVQ0g6CisgICAgYXQsIGdvdG8KKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgVGh1LCAyNC4wNy4xOTk3LCAwOTowMDowMCB2b24gV2FyZ29uCmRpZmYgLS1naXQgYS9kb2MvbWNtZC9pbnZpcyBiL2RvYy9tY21kL2ludmlzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhY2UxYTAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWNtZC9pbnZpcwpAQCAtMCwwICsxLDI2IEBACisKK2ludmlzCistLS0tLQorCisgTUFHSUVSS09NTUFORE86CisgICAgaW52aXMgW2VdCisKKyBBUkdVTUVOVEU6CisgICAgV2lyZCBkZXIgUGFyYW1hdGVyILRlYCBhbmdlZ2ViZW4sIGVyaGFsdGVuIGRpZSBNaXRzcGllbGVyIGRpZQorICAgIEVyd2FydGVtZWxkdW5nZW4gd2llIGJlaW0gQXVzbG9nZ2VuLgorCisgQkVTQ0hSRUlCVU5HOgorICAgIER1IHdpcnN0IHVuc2ljaHRiYXIuIEtlaW4gU3BpZWxlciBrYW5uIERpY2ggamV0enQgbWVociBzZWhlbi4KKworICAgIEplZGVyIE1hZ2llciBzb2xsdGUgc2ljaCB1ZWJlcmxlZ2VuLCB3YW5uIGVzIHNpbm52b2xsIGlzdCwgdW5zaWNodGJhciB6dQorICAgIHNlaW4sIHVuZCB3YW5uIGVyIGJlc3NlciBzaWNodGJhciBpc3QuCisKKyAgICBFcyBiZXN0ZWh0IGF1c3NlcmRlbSBkaWUgTW9lZ2xpY2hrZWl0LCBzaWNoIGRpcmVrdCB1bnNpY2h0YmFyIGVpbnp1bG9nZ2VuCisgICAgKGF1Y2ggd2VubiBtYW4gYmVpbSBsZXR6dGVuIEF1c2xvZ2dlbiBzaWNodGJhciB3YXIpLiBEYXp1IG11c3MgbWFuIGJlaSBkZXIKKyAgICBQYXNzd29ydGFiZnJhZ2UgYWxzIGVyc3RlbiBCdWNoc3RhYmVuIGVpbiAtIGVpbmdlYmVuLgorCisgU0lFSEUgQVVDSDoKKyAgICB2aXMKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgVGh1LCAyNC4wNy4xOTk3LCAwOTowMDowMCB2b24gV2FyZ29uCmRpZmYgLS1naXQgYS9kb2MvbWNtZC9sb2FkIGIvZG9jL21jbWQvbG9hZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmY0ZGI0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21jbWQvbG9hZApAQCAtMCwwICsxLDIzIEBACisKK2xvYWQKKy0tLS0KKworIE1BR0lFUktPTU1BTkRPOgorICAgIGxvYWQgPGRhdGVpPiBbLi4uXQorCisgQVJHVU1FTlRFOgorCisgICAgIDxkYXRlaT4gWy4uLl0gIEVpbiBvZGVyIG1laHJlcmUgRGF0ZWluYW1lbgorCisgQkVTQ0hSRUlCVU5HOgorICAgIERhcyBPYmpla3QsIHdlbGNoZXMgaW4gPGRhdGVpPiBkZWZpbmllcnQgaXN0LCB3aXJkIGdlbGFkZW4uIFdlbm4gZXMgYmVyZWl0cworICAgIGdlbGFkZW4gaXN0LCBwYXNzaWVydCBuaWNodHMuCisKKyAgICBSYWV1bWUga29lbm5lbiBhdWNoIGdlbGFkZW4gd2VyZGVuLCBpbmRlbSBtYW4gc2llIGJldHJpdHQuIERpZSBCbHVlcHJpbnQKKyAgICBlaW5lcyBPYmpla3RlcyBrYW5uIGF1Y2ggZHVyY2ggQ2xvbmVuIGRlcyBPYmpla3RlcyBnZWxhZGVuIHdlcmRlbi4KKworIFNJRUhFIEFVQ0g6CisgICAgY2xvbmUsIGRlc3RydWN0LCB1cGQKKworIExFVFpURSBBRU5ERVJVTkc6CisgICAgTWl0LCAwMi4xMC4yMDAyLCAwMjowMDowMCB2b24gTWFuZHJhZ29uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL21jbWQvbG9jYWxjbWQgYi9kb2MvbWNtZC9sb2NhbGNtZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTdjYjNkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21jbWQvbG9jYWxjbWQKQEAgLTAsMCArMSwyNyBAQAorCitsb2NhbGNtZAorLS0tLS0tLS0KKworIE1BR0lFUktPTU1BTkRPOgorICAgIGxvY2FsY21kCisKKyBBUkdVTUVOVEU6CisgICAga2VpbmUKKworIEJFU0NIUkVJQlVORzoKKyAgICBFaWdlbnRsaWNoIHNvbGx0ZSBkaWVzZXMgS29tbWFuZG8gYWxsZSBCZWZlaGxlIGFuemVpZ2VuLCBkaWUgRHUgYXVmZ3J1bmQKKyAgICBkZXMgUmF1bWVzLCBpbiBkZW0gRHUgZ2VyYWRlIHN0ZWhzdCwgYXVmZ3J1bmQgZGVyIGRlciBEaW5nZSBpbiBkZW0gUmF1bQorICAgIHVuZCBpbiBEZWluZW0gSW52ZW50YXIgc293aWUgYXVmZ3J1bmQgRGVpbmVyIGVpZ2VuZW4gU3RlbGx1bmcgYXVzZnVlaHJlbgorICAgIGthbm5zdC4KKworICAgIEF1cyB0ZWNobmlzY2hlbiBHcnVlbmRlbiB3ZXJkZW4gYWxsZXJkaW5ncyBudXIgZGllIEJlZmVobGUgYW5nZXplaWd0LCBkaWUKKyAgICB1ZWJlciBhZGRfYWN0aW9uKCkgaW4gZGllIEJlZmVobHNsaXN0ZSBlaW5nZWZ1ZWd0IHdlcmRlbjsgZGFzIE1vcmdlbkdyYXVlbgorICAgIHZlcmZ1ZWd0IGplZG9jaCB1ZWJlciBlaW5lbiBhbmRlcmVuIE1lY2hhbmlzbXVzLCB1bSBpbiBPYmpla3RlbiBLb21tYW5kb3MKKyAgICB6dSBkZWZpbmllcmVuLgorCisgU0lFSEUgQVVDSDoKKyAgICBtYW4sIGhpbGZlLAorICAgIEFkZENtZChMKSwgYWRkX2FjdGlvbihFKQorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBUaHUsIDI0LjA3LjE5OTcsIDA5OjAwOjAwIHZvbiBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9tY21kL2xzIGIvZG9jL21jbWQvbHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ2OTk0MQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tY21kL2xzCkBAIC0wLDAgKzEsOTAgQEAKKworbHMKKy0tCisKKyBNQUdJRVJLT01NQU5ETzoKKyAgICBscyBbIC1hbHJ0c3VnIF0gWyA8bmFtZT4gLi4uIF0KKworIEFSR1VNRU5URToKKworICAgICA8bmFtZT4gIERhdGVpLSBvZGVyIFZlcnplaWNobmlzbmFtZSAoZXMga29lbm5lbiBhdWNoIG1laHJlcmUgc2VpbikKKworIEJFU0NIUkVJQlVORzoKKyAgICBEaWUgYW5nZWdlYmVuIERhdGVpZW4gdW5kIFZlcnplaWNobmlzc2Ugd2VyZGVuIGF1ZmdlbGlzdGV0LiBMYWVzc3QgbWFuCisgICAgPG5hbWU+IHdlZywgd2lyZCBkZXIgSW5oYWx0IGRlcyBha3R1ZWxsZW4gVmVyemVpY2huaXNzZXMgYXVmZ2VsaXN0ZXQuCisKKyAgICBEaWUgRmxhZ3MgaGFiZW4gZm9sZ2VuZGUgQmVkZXV0dW5nOgorCisgICAgIC1hICBBdWNoIHVuc2ljaHRiYXJlIERhdGVpZW4gKGRlcmVuIE5hbWVuIG1pdCAuIGJlZ2lubmVuKSB3ZXJkZW4KKyAgICAgICAgIGFuZ2V6ZWlndC4KKyAgICAgLWwgIEVpbmUgYXVzZnVlaHJsaWNoZSBMaXN0ZSwgaW4gZGVyIGF1Y2ggTGFlbmdlIHVuZCBEYXR1bSBkZXIgRGF0ZWkKKyAgICAgICAgIGFuZ2VnZWJlbiB3ZXJkZW4uCisgICAgIC11ICBJbiBWZXJiaW5kdW5nIG1pdCAtbCB3aXJkIGF1Y2ggZGllIFVJRCBkZXIgRGF0ZWllbiBhdXNnZWdlYmVuLgorICAgICAtZyAgSW4gVmVyYmluZHVuZyBtaXQgLWwgd2lyZCBhdWNoIGRpZSBHSUQgZGVyIERhdGVpZW4gYXVzZ2VnZWJlbi4KKyAgICAgLXIgIERpZSBTb3J0aWVycmVpaGVuZm9sZ2Ugd2lyZCB1bWdla2VocnQuCisgICAgIC10ICBEaWUgTGlzdGUgd2lyZCBuYWNoIGRlbSBFcnN0ZWxsdW5nc2RhdHVtIHNvcnRpZXJ0LgorICAgICAtcyAgRGllIExpc3RlIHdpcmQgbmFjaCBkZXIgR3JvZXNzZSBkZXIgRGF0ZWllbiBnZW9yZG5ldC4KKworIEVJTlNURUxMVU5HRU46CisgICAgVmVyemVpY2huaXNzZSB1bmQgZ2VsYWRlbmUgT2JqZWt0ZSB3ZXJkZW4sIGFiaGFlbmdpZyB2b24gZGVyIGFrdHVlbGxlbgorICAgIEVpbnN0ZWxsdW5nIGRlcyBUZXJtaW5hbHR5cHMsIGJlc29uZGVycyBhbmdlemVpZ3QuCisKKyAgICBEaWVzZSBFaW5zdGVsbHVuZ2VuIGxhc3NlbiBzaWNoIHVlYmVyIHp3ZWkgVW1nZWJ1bmdzdmFyaWFibGVuIGFlbmRlcm4sCisgICAgd2VubiBtYW4gYWxzIFRlcm1pbmFsdHlwIGB2dDEwMCcgb2RlciBgYW5zaScgZWluZ2VzdGVsbHQgaGF0LiBCZWkgZGVyCisgICAgRWluc3RlbGx1bmcgYGR1bWInIHdpcmQgYmVpIFZlcnplaWNobmlzc2VuIGVpbiAvIGFuZ2VoYWVuZ3QgdW5kIGJlaQorICAgIGdlbGFkZW5lbiBPYmpla3RlbiBlaW4gKi4KKworICAgICBMU19ESVIgIEhpZXIga2FubiBtYW4gZGllIERhcnN0ZWxsdW5nIHZvbiBWZXJ6ZWljaG5pc3NlbiBrb25maWd1cmllcmVuLgorICAgICAgICAgICAgIERlciBEZWZhdWx0IGlzdCBiZWkgYHZ0MTAwJy1UZXJtaW5hbHMgRmV0dHNjaHJpZnQgdW5kIGJlaQorICAgICAgICAgICAgIGBhbnNpJy1UZXJtaW5hbHMgYmxhdWUgRmV0dHNjaHJpZnQuCisgICAgIExTX09CSiAgRGllc2UgVmFyaWFibGUgYmVpbmhhbHRldCBkaWUgRWluc3RlbGx1bmcgZnVlciBnZWxhZGVuZSBPYmpla3RlLgorICAgICAgICAgICAgIERlciBEZWZhdWx0IGlzdCBiZWkgYHZ0MTAwJy1UZXJtaW5hbHMgaW52ZXJzZSBEYXJzdGVsbHVuZyB1bmQgYmVpCisgICAgICAgICAgICAgYGFuc2knLVRlcm1pbmFscyByb3RlIFNjaHJpZnQuCisgICAgIExTX1ZDICAgRGllc2UgVmFyaWFibGUgYmVpbmhhbHRldCBkaWUgRWluc3RlbGx1bmcgZnVlciBPYmpla3RlLCBkaWUgdm9uCisgICAgICAgICAgICAgZWluZW0gVmlydHVhbCBDb21waWxlciBlcnpldWd0IHd1cmRlbi4gRGVmYXVsdCBpc3Qgd2llIGJlaSBMU19PQkouCisKKyAgICBEaWUgVmFyaWFibGVuIGtvZW5uZW4gZGllIG5hY2hmb2xnZW5kIGF1ZmdlZnVlaHJ0ZW4gV2VydGUgYW5uZWhtZW4uIFVtCisgICAgbWVocmVyZSBFZmZla3RlIHp1IGtvbWJpbmllcmVuLCBtdXNzIG1hbiBzaWUgbWl0IGVpbmVtICsgdHJlbm5lbi4KKworICAgIGB2dDEwMCcgdW5kIGBhbnNpJzoKKworICAgICBub25lICAgIEtlaW5lIEhlcnZvcmhlYnVuZ2VuCisgICAgIGJvbGQgICAgRmV0dHNjaHJpZnQKKyAgICAgYmxpbmsgICBibGlua2VuZGUgU2NocmlmdAorICAgICBpbnZlcnMgIFNjaHJpZnQtIHVuZCBIaW50ZXJncnVuZGZhcmJlIHdlcmRlbiB2ZXJ0YXVzY2h0CisKKyAgICBOdXIgYGFuc2knOgorCisgICAgIGJsYWNrICAgICBUZXh0ZmFyYmUgc2Nod2FyegorICAgICByZWQgICAgICAgVGV4dGZhcmJlIHJvdAorICAgICBncmVlbiAgICAgVGV4dGZhcmJlIGdydWVuCisgICAgIHllbGxvdyAgICBUZXh0ZmFyYmUgZ2VsYgorICAgICBibHVlICAgICAgVGV4dGZhcmJlIGJsYXUKKyAgICAgcHVycGxlICAgIFRleHRmYXJiZSBwdXJwdXIKKyAgICAgY3lhbiAgICAgIFRleHRmYXJiZSBjeWFuCisgICAgIHdoaXRlICAgICBUZXh0ZmFyYmUgd2Vpc3MKKyAgICAgYmJsYWNrICAgIEhpbnRlcmdydW5kZmFyYmUgc2Nod2FyegorICAgICBicmVkICAgICAgSGludGVyZ3J1bmRmYXJiZSByb3QKKyAgICAgYmdyZWVuICAgIEhpbnRlcmdydW5kZmFyYmUgZ3J1ZW4KKyAgICAgYnllbGxvdyAgIEhpbnRlcmdydW5kZmFyYmUgZ2VsYgorICAgICBiYmx1ZSAgICAgSGludGVyZ3J1bmRmYXJiZSBibGF1CisgICAgIGJwdXJwbGUgICBIaW50ZXJncnVuZGZhcmJlIHB1cnB1cgorICAgICBiY3lhbiAgICAgSGludGVyZ3J1bmRmYXJiZSBjeWFuCisgICAgIGJ3aGl0ZSAgICBIaW50ZXJncnVuZGZhcmJlIHdlaXNzCisKKyBCRUlTUElFTEU6CisKKyAgICA+IGxzIC1sCisgICAgPiBscyAtYSAvZG9jCisKKyAgICBWZXJ6ZWljaG5pc3NlIGluIEZldHRzY2hyaWZ0IGFuemVpZ2VuLCBnZWxhZGVuZSBEYXRlaWVuIHJvdCBhdWYgZ2VsYmVtCisgICAgSGludGVyZ3J1bmQ6CisKKyAgICA+IHNldCBMU19ESVIgYm9sZAorICAgID4gc2V0IExTX09CSiByZWQrYnllbGxvdworCisgU0lFSEUgQVVDSDoKKyAgICBjZCwgcHdkLCBzZXQsIHN0dHkKKworIExFVFpURSBBRU5ERVJVTkc6CisgICAgTWl0LCAwMi4xMC4yMDAyLCAwMjowMDowMCB2b24gTWFuZHJhZ29uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL21jbWQvbWFuIGIvZG9jL21jbWQvbWFuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMzBhZDUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWNtZC9tYW4KQEAgLTAsMCArMSw2MSBAQAorCittYW4KKy0tLQorCisgTUFHSUVSS09NTUFORE86CisgICAgbWFuIFstaV0gPG5hbWUvbnVtbWVyPgorICAgIG1hbiBbLWldIDxuYW1lPiBbbnVtbWVyXQorICAgIG1hbiBbLW1pXSA8bWFza2U+CisgICAgbWFuIFstcmldIDxtYXNrZT4KKworIEFSR1VNRU5URToKKworICAgICA8bmFtZT4gWy4uLl0gICBOYW1lIGRlciBnZXd1ZW5zY2h0ZW4gSGlsZmVzZWl0ZQorICAgICA8bWFza2U+ICAgICAgICBXb3J0dGVpbCBlaW5lciBIaWxmZXNlaXRlIChrYW5uICogdW5kID8gZW50aGFsdGVuKQorICAgICA8W251bW1lcl0+CSAgICBOdW1tZXIgZWluZXIgdm9uIG1laHJlcmVuIEhpbGZzc2VpdGVuCisKKyBCRVNDSFJFSUJVTkc6CisgICAgSW0gSGlsZmV2ZXJ6ZWljaG5pcyAoYC9kb2MnKSB3aXJkIG5hY2ggZGVyIGVudHNwcmVjaGVuZGVuIEhpbGZlc2VpdGUKKyAgICBnZXN1Y2h0IHVuZCBkaWVzZSBkYW5uIGFuZ2V6ZWlndC4KKworICAgIFdlbm4gZGVyIFBhcmFtZXRlciAtbSB2ZXJ3ZW5kZXQgd3VyZGUsIGRhbm4gd2VyZGVuIGFsbGUgSGlsZmVzZWl0ZW4KKyAgICBhdWZnZWxpc3RldCwgZGVyZW4gTmFtZSBkaWUgTWFza2UgZW50aGFlbHQuCisKKyAgICBEZXIgUGFyYW1ldGVyIC1yIGVybW9lZ2xpY2h0IGVzLCBlaW5lbiBBdXNkcnVjayBpbSBSZWdleHAtRm9ybWF0CisgICAgYW56dWdlYmVuLgorCisgICAgTWl0IEhpbGZlIGRlciBOdW1tZXIga2FubiBtYW4gc2ljaCBkYXMgZ2VuYXVlIEF1c3NjaHJlaWJlbiBlaW5lcgorICAgIGJlc3RpbW10ZW4gSGlsZnNzZWl0ZSBiZWkgZGVyIEFuemVpZ2UgbWVocmVyZSBzcGFyZW4uCisKKyAgICBEaWUgT3B0aW9uIC1pIChpbnRlcmFrdGl2ZXIgSFRNTC1Nb2R1cykgaXN0IHp1ciBaZWl0IG5pY2h0IGFrdGl2aWVydC4KKworIEFDSFRVTkc6CisKKyAgICBOYWNoIGRlbSBFaW5zcGllbGVuIHZvbiBuZXVlbiBNQU4tU2VpdGVuIG11c3MgZGVyIGJldHJlZmZlbmRlIE1hZ2llcgorICAgIHBlciAneGNhbGwgL3AvZGFlbW9uL21hbmQtPnVwZGF0ZV9jYWNoZSgpJyBkZW4gQ2FjaGUgYWt0dWFsaXNpZXJlbi4KKyAgICBEaWVzZXIgd2lyZCBhdXRvbWF0aXNjaCBudXIgd29lY2hlbnRsaWNoIGFrdHVhbGlzaWVydC4KKworIEJFSVNQSUVMRToKKyAgICBFaW5lIGVpbmZhY2hlIEhpbGZlc2VpdGUgKG5hZW1saWNoIGRpZXNlKToKKworICAgID4gbWFuIG1hbgorCisgICAgV2VsY2hlIEhpbGZlc2VpdGVuIGhhYmVuIGV0d2FzIG1pdCBIYWVuZGVuIHp1IHR1bj8KKworICAgID4gbWFuIC1tICpoYW5kcyoKKworICAgIFdlbGNoZSBIaWxmZXNzZWl0ZW4gc2FnZW4gdW5zIGV0d2FzIHVlYmVyIFdhZmZlbj8KKworICAgID4gbWFuIHdhZmZlbgorICAgICAgRXMgd3VyZGVuIGZvbGdlbmRlIHBvdGVudGllbGwgcGFzc2VuZGVuIFNlaXRlbiBnZWZ1bmRlbjoKKyAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAxOiBoZWxwL3dhZmZlbmZlcnRpZ2tlaXRlbiAyOiBzdGQvd2VhcG9uIDM6IHdpei93YWZmZW4KKyAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgPiBtYW4gMyBPREVSCT4gbWFuIHdpei93YWZmZW4gT0RFUgk+IG1hbiB3YWZmZW4gMworICAgICAgW0FuemVpZ2Ugdm9uIC93aXovd2FmZmVuXQorCisgU0lFSEUgQVVDSDoKKyAgICBoaWxmZSBybWFuCisKKyBMRVRaVEUgQUVOREVSVU5HOgorICAgIDIwLiBNYWVyeiAyMDA0IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvbWNtZC9tYmFuaXNoIGIvZG9jL21jbWQvbWJhbmlzaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWY1NzU0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21jbWQvbWJhbmlzaApAQCAtMCwwICsxLDMxIEBACisKK21iYW5pc2gKKy0tLS0tLS0KKworIEVSWk1BR0lFUktPTU1BTkRPOgorICAgIG1iYW5pc2ggPG5hbWU+IFs8Z3J1bmQ+XQorCisgQVJHVU1FTlRFOgorCisgICAgIDxuYW1lPgorICAgICAgICBOYW1lIGRlcyBPcGZlcnMKKyAgICAgPGdydW5kPiAob3B0aW9uYWwpCisgICAgICAgIERlciBHcnVuZCBkZXIgU3BlcnJlCisKKyBCRVNDSFJFSUJVTkc6CisgICAgTWl0IGRpZXNlbSBCZWZlaGwgbGFlc3N0IHNpY2ggdmVyaGluZGVybiwgZGFzcyBkZXIgU3BpZWxlciA8bmFtZT4gdm9uCisgICAgYmVsaWViaWdlbiBNYWdpZXJuIGdlc3BvbnNvcnQgKGQuaC4genVtIE1hZ2llciBnZW1hY2h0KSB3ZXJkZW4ga2FubiAoYXVzCisgICAgd2VsY2hlbSA8Z3J1bmQ+IGF1Y2ggaW1tZXIpLgorCisgICAgTnVyIGVpbiBFcnptYWdpZXIgb2RlciBHb3R0IGthbm4gaW4gZGllc2VtIEZhbGwgZWluIFNwb25zb3Jpbmcgdm9ybmVobWVuLgorCisgICAgTWl0IGRlbSBHcnVuZCAnbG9lc2NoZW4nIGtvZW5uZW4gZ2VzcGVycnRlIE5hbWVuIHdpZWRlciBmcmVpZ2VnZWJlbiB3ZXJkZW4uCisgICAgT2huZSBQYXJhbWV0ZXIgd2lyZCBkaWUgTGlzdGUgYWxsZXIgZ2VzcGVycnRlbiBOYW1lbiBhdXNnZWdlYmVuLgorCisgICAgRGllc2VyIEJlZmVobCBrYW5uIG51ciB2b24gRXJ6bWFnaWVybiB1bmQgR29ldHRlcm4gYXVzZ2VmdWVocnQgd2VyZGVuLgorCisgU0lFSEUgQVVDSDoKKyAgICBiYW5pc2gsIHRiYW5pc2gsIHNiYW5pc2gKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgTW9uLCAyMC4xMi4xOTk5LCAyMzozMDowMCB2b24gVGlhbWFrCmRpZmYgLS1naXQgYS9kb2MvbWNtZC9tZWNobyBiL2RvYy9tY21kL21lY2hvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2OWQ3ODAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWNtZC9tZWNobwpAQCAtMCwwICsxLDIyIEBACisKK21lY2hvCistLS0tLQorCisgTUFHSUVSS09NTUFORE86CisgICAgbWVjaG8gPHRleHQ+CisKKyBBUkdVTUVOVEU6CisKKyAgICAgPHRleHQ+CisgICAgICAgIGVpbiBiZWxpZWJpZ2VyIFRleHQKKworIEJFU0NIUkVJQlVORzoKKyAgICBEZXIgVGV4dCA8dGV4dD4gd2lyZCBhbiBhbGxlIE1hZ2llciBpbSBNVUQgZ2VzY2hpY2t0LgorCisgICAgRGVyIEJlZmVobCBzb2xsdGUgbWl0IGdyb2Vzc3RlciBTb3JnZmFsdCBiZWhhbmRlbHQgd2VyZGVuLgorCisgU0lFSEUgQVVDSDoKKyAgICB2ZXJ0cmFnLCBlbW90ZSwgZWNobywgZWNob2FsbCwgZWNob3RvLCB0ZWlsZSAobWl0KQorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBUdWUsIDAyLjA5LjE5OTcsIDE2OjU0OjU3IHZvbiBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9tY21kL21rZGlyIGIvZG9jL21jbWQvbWtkaXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA2MTVkYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tY21kL21rZGlyCkBAIC0wLDAgKzEsNDMgQEAKKworbWtkaXIKKy0tLS0tCisKKyBNQUdJRVJLT01NQU5ETzoKKyAgICBta2RpciBbLXZyXSA8dmVyej4gWy4uLl0KKworIEFSR1VNRU5URToKKworICAgICA8dmVyej4gWy4uLl0KKyAgICAgICAgTmFtZSBkZXMgbmV1ZW4gVmVyemVpY2huaXNzZXMgKGVzIGtvZW5uZW4gYXVjaCBtZWhyZXJlIHNlaW4pCisKKyBCRVNDSFJFSUJVTkc6CisgICAgRGllIGFuZ2VnZWJlbmVuIFZlcnplaWNobmlzc2Ugd2VyZGVuIG5ldSBhbmdlbGVndC4KKworICAgIERpZSBGbGFncyBoYWJlbiBmb2xnZW5kZSBCZWRldXR1bmc6CisKKyAgICAtdiAgR2VuYXUgYXVzZ2ViZW4sIHdhcyBnZW1hY2h0IHdpcmQKKyAgICAtciAgUmVrdXJzaXYgZGllIE9CRVJ2ZXJ6ZWljaG5pc3NlIHZvbiA8dmVyej4gbWl0YW5sZWdlbiwgd2VubiBzaWUgbmljaHQKKyAgICAgICAgc2Nob24gZXhpc3RpZXJlbi4KKyAgICAtcCAgRGFzIGdsZWljaGUgd2llIC1yIChhbGlhcyBlaW5nZWZ1ZWhydCwgd2VpbCAtcCBlaW5mYWNoIHZpZWwKKyAgICAgICAgdmVyYnJlaXRldGVyIGlzdCkuCisgCisgQkVJU1BJRUxFOgorCisgICAgPiBta2RpciBuZXcKKworICAgIFNvbGwgamV0enQgaW4gYG5ldy8nIG5vY2ggZGFzIFZlcnplaWNobmlzIGBmb28vYmFyLycgYW5nZWxlZ3Qgd2VyZGVuLCBzbworICAgIGRhcmYgbWFuIG5pY2h0IGZvbGdlbmRlbiBBdWZydWYgdmVyd2VuZGVuCisKKyAgICA+IG1rZGlyIG5ldy9mb28vYmFyICAgICAgOyBTbyBuaWNodCEKKworICAgIHNvbmRlcm4ga29lbm50ZSB6LkIgZm9sZ2VuZGVybWFzc2VuIHZvcmdlaGVuOgorCisgICAgPiBta2RpciBuZXcvZm9vIG5ldy9mb28vYmFyICAgICAgICAgICBvZGVyCisgICAgPiBta2RpciAtciAvbmV3L2Zvby9iYXIKKworIFNJRUhFIEFVQ0g6CisgICAgcm1kaXIKKworIExFVFpURSBBRU5ERVJVTkc6CisgICAgMjYuMDEuMjAxMywgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2MvbWNtZC9tb3JlIGIvZG9jL21jbWQvbW9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWM2NzViCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21jbWQvbW9yZQpAQCAtMCwwICsxLDQyIEBACisKK21vcmUKKy0tLS0KKworIE1BR0lFUktPTU1BTkRPOgorICAgIG1vcmUgPGRhdGVpPiBbLi4uXQorCisgQVJHVU1FTlRFOgorCisgICAgIDxkYXRlaT4gWy4uLl0KKyAgICAgICAgRGF0ZWluYW1lKG4pCisKKyBCRVNDSFJFSUJVTkc6CisgICAgRGllIERhdGVpKGVuKSA8ZGF0ZWk+IHdpcmQvd2VyZGVuIHN0dWVja2NoZW53ZWlzZSBhbmdlemVpZ3QuIE5hY2ggamVkZXIKKyAgICBhdXNnZWdlYmVuZW4gU2VpdGUgd2lyZCBnZXN0b3BwdCB1bmQgZXMga29lbm5lbiB2ZXJzY2hpZWRlbmUgQWt0aW9uZW4KKyAgICBkdXJjaGdlZnVlaHJ0IHdlcmRlbjoKKworICAgICA8UkVUVVJOPiwgZiwgRgorICAgICAgICAgICAgICAgRWluZSBTZWl0ZSB2b3J3YWVydHMKKyAgICAgZCwgRCAgICAgIEVpbmUgaGFsYmUgU2VpdGUgdm9yd2FlcnRzCisgICAgIHUsIFUgICAgICBFaW5lIGhhbGJlIFNlaXRlIHp1cnVlY2sKKyAgICAgYiwgQiAgICAgIEVpbmUgU2VpdGUgenVydWVjaworICAgICA8emVpbGU+ICAgU3ByaW5nZSB6dSBaZWlsZSA8emVpbGU+CisgICAgID8gICAgICAgICBIaWxmZXRleHQgYXVzZ2ViZW4KKyAgICAgcSwgeCAgICAgIEFuemVpZ2UgZGVyIGFrdHVlbGxlbiBEYXRlaSBhYmJyZWNoZW4KKyAgICAgLzxyZWdleHA+CisgICAgICAgICAgICAgICByZWd1bGFlcmVuIEF1c2RydWNrIDxyZWdleHA+IHN1Y2hlbgorCisgICAgRGllIERhdGVpbmFtZW4ga29lbm5lbiBhdWNoIE11c3RlciB3aWUgKiBvZGVyID8gZW50aGFsdGVuLgorCisgICAgRGllIExhZW5nZSBlaW5lciBTZWl0ZSBrYW5uIG1hbiBtaXQgZGVtIEJlZmVobCBgemVpbGVuJyBlaW5zdGVsbGVuLgorCisgQkVJU1BJRUxFOgorCisgICAgPiBtb3JlIC9zdGQvbnBjLmMKKyAgICA+IG1vcmUgKi5oCisKKyBTSUVIRSBBVUNIOgorICAgIGNhdCwgaGVhZCwgdGFpbCwgemVpbGVuCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFRodSwgMjQuMDcuMTk5NywgMDk6MDA6MDAgdm9uIFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL21jbWQvbXNjaGF1IGIvZG9jL21jbWQvbXNjaGF1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZDI2YTEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWNtZC9tc2NoYXUKQEAgLTAsMCArMSw0MCBAQAorCittc2NoYXUKKy0tLS0tLQorCisgTUFHSUVSS09NTUFORE86CisgICAgbXNjaGF1IDxzY2hhbHRlcj4KKworIEFSR1VNRU5URToKKworICAgICA8c2NoYWx0ZXI+CisgICAgICAgICdhbicsICdlaW4nIG9kZXIgJ2phJyBzY2hhbHRldCBkZW4gTWFnaWVybW9kdXMgZWluCisgICAgICAgICdhdXMnIG9kZXIgJ25laW4nIHNjaGFsdGV0IGRlbiBNYWdpZXJtb2R1cyBhdXMKKyAgICAgICAgJytkZWJ1Zycgc2NoYWx0ZXQgRGVidWdtZWxkdW5nZW4gZWluCisgICAgICAgICctZGVidWcnIHNjaGFsdGV0IERlYnVnbWVsZHVuZ2VuIGF1cworCisgQkVTQ0hSRUlCVU5HOgorICAgIE1hbmNobWFsIG1vZWNodGUgbWFuIGV0d2FzIGF1c3Byb2JpZXJlbiwgd2FzIG51ciBTcGllbGVybiBtb2VnbGljaCBpc3QsCisgICAgenVtIEJlaXNwaWVsIGJlaW0gVGVzdGVuIHZvbiBBYmVudGV1ZXJuIG8uYWUuIERhenUgZGllbnQgZGllc2VyIEJlZmVobCwKKyAgICBtaXQgZGVtIG1hbiBkaWUgbWVpc3RlbiBGYWVoaWdrZWl0ZW4gZWluZXMgTWFnaWVycyBkZWFrdGl2aWVyZW4ga2Fubi4KKworICAgIE5hY2ggZWluZW0gYG1zY2hhdSBhdXMnIHNpZWh0IG1hbiBrZWluZSBEYXRlaW5hbWVuIG1laHIgdm9uIFJhZXVtZW4gdW5kCisgICAgT2JqZWt0ZW4uIERpZSBtZWlzdGVuIE1hZ2llcmJlZmVobGUgc2luZCBhYmdlc2NoYWx0ZXQgdW5kIG1hbiBrYW5uIGF1Y2gKKyAgICB3aWVkZXIgc3RlcmJlbiB3aWUgZWluIG5vcm1hbGVyIFNwaWVsZXIuCisKKyAgICBNaXQgYG1zY2hhdSBhbicga2VocnQgbWFuIHdpZWRlciBpbiBkZW4gTWFnaWVybW9kdXMgenVydWVjay4KKworICAgIFp1c2FldHpsaWNoIGthbm4gZGllc2VzIEtvbW1hbmRvIG5vY2ggdW1zY2hhbHRlbiwgb2IgTWFnaWVyIERlYnVnbWVsZHVuZ2VuCisgICAgKGRhcyBzaW5kIE1lbGR1bmdlbiwgZGllIG1pdCBkZW0gVHlwIE1UX0RFQlVHIGFuIFJlY2VpdmVNc2coKSB1ZWJlcmdlYmVuCisgICAgIHdlcmRlbikgd2Focm5laG1lbiBtb2VjaHRlbiBvZGVyIG5pY2h0LgorCisgQkVNRVJLVU5HRU46CisgICAgQXVjaCBtaXQgYXVzZ2VzY2hhbHRldGVtIE1hZ2llcm1vZHVzIHVudGVybGllZ3QgbWFuIG5vY2ggZGVuIEJlZGluZ3VuZ2VuCisgICAgZGVzIE1hZ2llcnZlcnRyYWdzIQorCisgU0lFSEUgQVVDSDoKKyAgICB2ZXJ0cmFnLCBzY2hhdSAoYW4pLCBpICg9aW52ZW50dXIpCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIDEuNS4yMDE0LCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9tY21kL212IGIvZG9jL21jbWQvbXYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJjNTM2OAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tY21kL212CkBAIC0wLDAgKzEsNTEgQEAKKworbXYKKy0tCisKKyBNQUdJRVJLT01NQU5ETzoKKyAgICBtdiBbIC1pcmZ2IF0gIDxhbHQ+IDxuZXU+CisgICAgbXYgWyAtaXJmdiBdICA8dm9uXzE+IFsgLi4uIDx2b25fbj4gXSA8bmFjaD4KKyAgICBtdiBbIC1pcmZ2bSBdIDx2b25fMT4gWyAuLi4gPHZvbl9uPiBdIDxuYWNoPiA8bWFza2U+CisKKyBBUkdVTUVOVEU6CisKKyAgICAgPGFsdD4gICAgQWx0ZXIgRGF0ZWktIG9kZXIgVmVyemVpY2huaXNuYW1lCisgICAgIDxuZXU+ICAgIE5ldWVyIERhdGVpLSBvZGVyIFZlcnplaWNobmlzbmFtZQorICAgICA8dm9uXzE+CisgICAgIDx2b25fbj4gIE5hbWUgZGVyIFF1ZWxsZGF0ZWllbiB1bmQgLXZlcnplaWNobmlzc2UKKyAgICAgPG5hY2g+ICAgRGFzIFppZWx2ZXJ6ZWljaG5pcworICAgICA8bWFza2U+ICBEYXRlaW1hc2tlIGZ1ZXIgRGF0ZWktIG9kZXIgVmVyemVpY2huaXNuYW1lbgorCisgQkVTQ0hSRUlCVU5HOgorICAgIE1pdCBkZW0gZXJzdGVuIEF1ZnJ1ZiB3aXJkIGRpZSBEYXRlaSBiencuIGRhcyBWZXJ6ZWljaG5pcyA8YWx0PiBpbiA8bmV1PgorICAgIHVtYmVuYW5udC4KKworICAgIE1pdCBkZW0gendlaXRlbiBBdWZydWYgd2VyZGVuIGRpZSBRdWVsbGRhdGVpZW4gPHZvbl8xPiBiaXMgPHZvbl9uPiBpbiBkYXMKKyAgICBaaWVsdmVyemVpY2huaXMgPHZlcno+IHZlcnNjaG9iZW4uCisKKyAgICBJbiBkZXIgendlaXRlbiBWYXJpYW50ZSBrb2VubmVuIGRpZSBEYXRlaW5hbWVuIGF1Y2ggTXVzdGVyIHdpZSAqIG9kZXIgPworICAgIGVudGhhbHRlbi4KKworICAgIERpZSBPcHRpb25lbiBoYWJlbiBmb2xnZW5kZSBCZWRldXR1bmc6CisKKyAgICAgLWkgIFZvciBkZW0gVWViZXJzY2hyZWliZW4gZWluZXIgZXhpc3RpZXJlbmRlbiBEYXRlaSB3aXJkIGVpbmUKKyAgICAgICAgIFNpY2hlcmhlaXRzYWJmcmFnZSBkdXJjaGdlZnVlaHJ0LgorICAgICAtciAgRXMgd2VyZGVuIHJla3Vyc2l2IFVudGVydmVyemVpY2huaXNzZSB2ZXJzY2hvYmVuLCBmYWxscyBkYXMKKyAgICAgICAgIFppZWx2ZXJ6ZWljaG5pcyBzY2hvbiBleGlzdGllcnQKKyAgICAgLWYgIEV2dGwuIGF1ZnRyZXRlbmRlIFByb2JsZW1lLCBkaWUgc29uc3QgZWluZW4gQWJicnVjaCBiZXdpcmtlbiB3dWVyZGVuLAorICAgICAgICAgd2VyZGVuIGlnbm9yaWVydC4gQXVjaCBgLWknIHdpcmQgYXVzc2VyIEtyYWZ0IGdlc2V0enQuCisgICAgIC12ICBFcyB3aXJkIGRldGFpbGxpZXJ0IGF1c2dlZ2ViZW4sIHdhcyBnZW1hY2h0IHdpcmQKKyAgICAgLW0gIEVzIHdlcmRlbiBudXIgRGF0ZWllbiB2ZXJzY2hvYmVuLCBkaWUgZGVtIE11c3RlciA8bWFza2U+IGVudHNwcmVjaGVuCisKKyBCRUlTUElFTEU6CisKKyAgICA+IG12IGRhdGVpMSBkYXRlaTIKKyAgICA+IG12ICogdGVtcAorICAgID4gbXYgL3BsYXllcnMvaGF0ZS8qLmMgLi4vdGVzdAorICAgID4gbXYgLWlmcm0gfm1hbmRyYWdvbi9tZWxvcmFuIC9kL2luc2Vsbi9tYW5kcmFnb24vbWVsb3JhbiAqLmMKKworIFNJRUhFIEFVQ0g6CisgICAgY3AsIHJtCisKKyBMRVRaVEUgQUVOREVSVU5HOgorICAgIERvbiwgMDMuMTAuMjAwMiwgMTg6MDA6MDAgdm9uIE1hbmRyYWdvbgpkaWZmIC0tZ2l0IGEvZG9jL21jbWQvb3JvcGF4IGIvZG9jL21jbWQvb3JvcGF4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YmMxYjIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWNtZC9vcm9wYXgKQEAgLTAsMCArMSwzMCBAQAorCitvcm9wYXgKKy0tLS0tLQorCisgTUFHSUVSS09NTUFORE86CisgICAgb3JvcGF4IFs8c3R1ZmU+XQorCisgQVJHVU1FTlRFOgorCisgICAgIDxzdHVmZT4gKG9wdGlvbmFsKQorICAgICAgICBNYWdpZXJsZXZlbCwgYWIgZGVtIFJ1ZmUgZHVyY2hnZWxhc3NlbiB3ZXJkZW4KKworIEJFU0NIUkVJQlVORzoKKyAgICBEdSBzdGVja3N0IERpciBPcm9wYXggaW4gZGllIE9ocmVuLiBOdW4ga2FubnN0IER1IG5pY2h0cyBtZWhyIGhvZXJlbiwgd2FzCisgICAgZ2VydWZlbiwgZ2VzYWd0IG9kZXIgRGlyIG1pdGdldGVpbHQgd2lyZC4gRGFzIGdpbHQgYWxsZXJkaW5ncyBudXIgZnVlcgorICAgIExldXRlIG1pdCBlaW5lbSBNYWdpZXJsZXZlbCwgZGVyIGtsZWluZXIgaXN0IGFscyA8c3R1ZmU+LgorCisgICAgRGllIGhvZWNoc3Rtb2VnbGljaGUgU3R1ZmUgaXN0IERlaW4gZWlnZW5lciBNYWdpZXJsZXZlbC4KKworICAgIFJ1ZnN0IER1IGRlbiBCZWZlaGwgb2huZSBBcmd1bWVudCBhdWYsIHdpcmQgZGFzIE9yb3BheCB3aWVkZXIgZW50ZmVybnQuCisKKyAgICBBdWYgZGllIEtvbW11bmlrYXRpb24gdWViZXIgZGllIEViZW5lbiB3aXJrdCBkYXMgT3JvcGF4IG5pY2h0LCBkYSBkaWVzZQorICAgIEFydCBkZXIgS29tbXVuaWthdGlvbiBhdWYgZ2Vpc3RpZ2VyIEViZW5lIHZlcmxhZXVmdCB1bmQgbmljaHQgdWViZXIgZGVuCisgICAgR2Vob2VyZ2FuZy4KKworIFNJRUhFIEFVQ0g6CisgICAgaWdub3JpZXJlCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFRodSwgMjQuMDcuMTk5NywgMDk6MDA6MDAgdm9uIFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL21jbWQvcGVvcGxlIGIvZG9jL21jbWQvcGVvcGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YWRlZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWNtZC9wZW9wbGUKQEAgLTAsMCArMSwzMCBAQAorCitwZW9wbGUKKy0tLS0tLQorCisgTUFHSUVSS09NTUFORE86CisgICAgcGVvcGxlCisKKyBBUkdVTUVOVEU6CisgICAga2VpbmUKKworIEJFU0NIUkVJQlVORzoKKyAgICBEaWVzZXMgS29tbWFuZG8gbGlzdGV0IEluZm9ybWF0aW9uZW4gdWViZXIgYWxsZSBlaW5nZWxvZ2d0ZW4gU3BpZWxlciB1bmQKKyAgICBNYWdpZXIgYXVmOgorCisgICAgICogdm9uIHdlbGNoZXIgSW50ZXJuZXRudW1tZXIgc2llIGtvbW1lbgorICAgICAqIGRlbiBha3R1ZWxsZW4gTmFtZW4uCisgICAgICogZGVuIE1hZ2llcmxldmVsCisgICAgICogZGFzIEFsdGVyCisgICAgICogSWRsZSBmbGFnIGBJJywgd2VubiBkZXIgU3BpZWxlciBsYWVuZ2VyIGFscyA1IE1pbnV0ZW4gbmljaHRzIG1laHIKKyAgICAgICBnZW1hY2h0IGhhdAorICAgICAqIHdvIGVyIGlzdAorCisgICAgQXVzc2VyZGVtIHdpcmQgZGllIEFuemFobCBkZXIgYWt0aXZlbiBTcGllbGVyLCBkaWUgQW56YWhsIGRlciBLb21tYW5kb3MKKyAgICBwcm8gU2VrdW5kZSB1bmQgZGllIEFuemFobCBkZXIga29tcGlsaWVydGVuIFplaWxlbiBwcm8gU2VrdW5kZSBhbmdlemVpZ3QuCisKKyBTSUVIRSBBVUNIOgorICAgIHdlciwgcHdobworCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBUaHUsIDI0LjA3LjE5OTcsIDA5OjAwOjAwIHZvbiBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9tY21kL3BpbmcgYi9kb2MvbWNtZC9waW5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYWY3YjMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWNtZC9waW5nCkBAIC0wLDAgKzEsMTkgQEAKKworcGluZworLS0tLQorCisgTUFHSUVSS09NTUFORE86CisgICAgcGluZyA8c3BpZWxlcj4KKworIEFSR1VNRU5URToKKworICAgICA8c3BpZWxlcj4KKyAgICAgICAgZWluIChlaW5nZWxvZ2d0ZXIpIFNwaWVsZXIKKworIEJFU0NIUkVJQlVORzoKKyAgICBEZXIgU3BpZWxlciA8c3BpZWxlcj4gd2lyZCBhbmdlcGllcHQuIERhYmVpIHdpcmQgYmVpIGRlbSBTcGllbGVyIGVpbmUKKyAgICBNZWxkdW5nIHVuZCwgZmFsbHMgc2VpbiBSZWNobmVyIGRpZXMgdW50ZXJzdHVldHp0LCBlaW4gU2lnbmFsdG9uCisgICAgYXVzZ2VnZWJlbi4KKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgVGh1LCAyNC4wNy4xOTk3LCAwOTowMDowMCB2b24gV2FyZ29uCmRpZmYgLS1naXQgYS9kb2MvbWNtZC9wcm9tcHQgYi9kb2MvbWNtZC9wcm9tcHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI5YjBkZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tY21kL3Byb21wdApAQCAtMCwwICsxLDQzIEBACisKK3Byb21wdAorLS0tLS0tCisKKyBNQUdJRVJLT01NQU5ETzoKKyAgICBwcm9tcHQgWzx0ZXh0Pl0KKworIEFSR1VNRU5URToKKworICAgICA8dGV4dD4gKG9wdGlvbmFsKQorICAgICAgICBlaW4gYmVsaWViaWdlciBUZXh0CisKKyBCRVNDSFJFSUJVTkc6CisgICAgRGllIEVpbmdhYmVhdWZmb3JkZXJ1bmcgKCJwcm9tcHQiKSB3aXJkIGF1ZiBkaWUgYW5nZWdlYmVuZSBNZWxkdW5nIDx0ZXh0PgorICAgIGdlc2V0enQuCisKKyAgICBPaG5lIEFyZ3VtZW50ZSB3aXJkIGRhcyBEZWZhdWx0cHJvbXB0IChgPiAnKSBlaW5nZXN0ZWxsdC4KKworICAgIFVtIExlZXJ6ZWljaGVuIGFuIEFuZmFuZyB1bmQgRW5kZSBkZXMgUHJvbXB0cyB6dSBlcm1vZWdsaWNoZW4sIGthbm4gPHRleHQ+CisgICAgaW4gQW5mdWVocnVuZ3N6ZWljaGVuIGdlc2V0enQgd2VyZGVuLiBBdXNzZXJkZW0gZ2lidCBlcyBub2NoIGZvbGdlbmRlCisgICAgYmVzb25kZXJlIFplaWNoZW5mb2xnZW46CisKKyAgICAgXGggIHdpcmQgZHVyY2ggZGVuIE5hbWVuIGRlcyBNdWRzIGVyc2V0enQKKyAgICAgXHUgIHdpcmQgZHVyY2ggRGVpbmVuIE5hbWVuIGVyc2V0enQKKyAgICAgXHcgIHdpcmQgZHVyY2ggZGFzIGFrdHVlbGxlIFZlcnplaWNobmlzIGVyc2V0enQKKyAgICAgXHQgIHdpcmQgZHVyY2ggZGllIGFrdHVlbGxlIFplaXQgZXJzZXR6dAorICAgICBcbiAgYW4gZGllc2VyIFN0ZWxsZSB3aXJkIGVpbiBaZWlsZW51bWJydWNoIGVpbmdlZnVlZ3QKKworIEJFSVNQSUVMRToKKworICAgID4gcHJvbXB0ICJcaDpcdTpcdz4gIgorCisgICAgZXJnaWJ0IGJlaSBXYXJnb24sIHdlbm4gZXIgc2ljaCBpbiBzZWluZW0gSG9tZXZlcnplaWNobnMgYmVmaW5kZXQ6CisKKyAgICBNb3JnZW5HcmF1ZW46V2FyZ29uOi9wbGF5ZXJzL3dhcmdvbj4gXworCisgICAgKGRlciBVbnRlcnN0cmljaCBzb2xsIGRlbiBDdXJzb3IgYW56ZWlnZW4pCisKKyBTSUVIRSBBVUNIOgorICAgIHB3ZAorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBNb24sIDA4LjAyLjE5OTksIDIyOjE1OjAwIHZvbiBUaWFtYWsKZGlmZiAtLWdpdCBhL2RvYy9tY21kL3Byb3RlY3QgYi9kb2MvbWNtZC9wcm90ZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5Mjg3NmEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWNtZC9wcm90ZWN0CkBAIC0wLDAgKzEsMzIgQEAKKworcHJvdGVjdAorLS0tLS0tLQorCisgTUFHSUVSS09NTUFORE86CisgICAgcHJvdGVjdCA8cHJvcD4KKworIEFSR1VNRU5URToKKworICAgICA8cHJvcD4KKyAgICAgICAgTmFtZSBkZXIgenUgc2NodWV0emVuZGVuIFByb3BlcnR5CisKKyBCRVNDSFJFSUJVTkc6CisgICAgRGFzIFp1c3RhbmQgZGVzIFBST1RFQ1RFRC1GbGFncyBkZXIgUHJvcGVydHkgPHByb3A+IHdpcmQgdW1nZXNjaGFsdGV0LgorCisgICAgTWFuIG11c3MgZGFiZWkgYWxsZXJkaW5ncyBiZWFjaHRlbiwgZGFzcyBtYW4gbmljaHQgZGVuIE5hbWVuIGRlciBQcm9wZXJ0eQorICAgIGF1cyBgL3N5cy9wcm9wZXJ0aWVzLmgnIHZlcndlbmRlbiBkYXJmLCBzb25kZXJuIGRlbiBTdHJpbmcgbmVobWVuIG11c3MsCisgICAgZGVyIHNpY2ggaGludGVyIGRlbSBQX1hZWiB2ZXJiaXJndC4KKworICAgIE1hZ2llci1MZWhybGluZ2VuIHN0ZWh0IGRpZXNlciBCZWZlaGwgbm9jaCBuaWNodCB6dXIgVmVyZnVlZ3VuZy4KKworIEJFSVNQSUVMRToKKyAgICBXZW5uIER1IHZlcmhpbmRlcm4gd2lsbHN0LCBkYXNzIGplbWFuZCBhbmRlcmVzIERlaW5lbiBUaXRlbCAoUF9USVRMRSA9CisgICAgInRpdGxlIikgYWVuZGVybiBrYW5uOgorCisgICAgPiBwcm90ZWN0IHRpdGxlCisKKyBTSUVIRSBBVUNIOgorICAgIGAvc3RkL3RoaW5nL3Byb3BlcnRpZXMuYycKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgVGh1LCAyNC4wNy4xOTk3LCAwOTowMDowMCB2b24gV2FyZ29uCmRpZmYgLS1naXQgYS9kb2MvbWNtZC9wd2QgYi9kb2MvbWNtZC9wd2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhkNWY0MgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tY21kL3B3ZApAQCAtMCwwICsxLDE4IEBACisKK3B3ZAorLS0tCisKKyBNQUdJRVJLT01NQU5ETzoKKyAgICBwd2QKKworIEFSR1VNRU5URToKKyAgICBrZWluZQorCisgQkVTQ0hSRUlCVU5HOgorICAgIERlciBha3R1ZWxsZSBQZmFkIHdpcmQgYW5nZXplaWd0LgorCisgU0lFSEUgQVVDSDoKKyAgICBjZCwgcHJvbXB0LCBscworCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBUaHUsIDI0LjA3LjE5OTcsIDA5OjAwOjAwIHZvbiBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9tY21kL3B3aG8gYi9kb2MvbWNtZC9wd2hvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5Y2QzODIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWNtZC9wd2hvCkBAIC0wLDAgKzEsMzUgQEAKKworcHdobworLS0tLQorCisgTUFHSUVSS09NTUFORE86CisgICAgcHdobworCisgQVJHVU1FTlRFOgorICAgIGtlaW5lCisKKyBCRVNDSFJFSUJVTkc6CisgICAgRGllc2VzIEtvbW1hbmRvIGdpYnQgZGllIHdpY2h0aWdzdGVuIENoYXJha3RlcndlcnRlIGFsbGVyIGVpbmdlbG9nZ3RlbgorICAgIFNwaWVsZXIgdW5kIFNlaGVyIGF1cy4KKworICAgIEFscyBJbmZvbWF0aW9uIGVyaGFlbHQgbWFuCisKKyAgICAgKiBkZW4gTGV2ZWwKKyAgICAgKiBkZW4gTmFtZW4KKyAgICAgKiBkaWUgRXJmYWhydW5nc3B1bmt0ZQorICAgICAqIGRpZSBBYmVudGV1ZXJwdW5rdGUKKyAgICAgKiBJbnRlbGxpZ2VuegorICAgICAqIEtyYWZ0CisgICAgICogR2VzY2hpY2tsaWNoa2VpdAorICAgICAqIEF1c2RhdWVyCisgICAgICogQW5ncmlmZnNzdGFlcmtlCisgICAgICogQWJ3ZWhyc3RhZXJrZQorICAgICAqIEFuZ3JpZmZzc3RhZXJrZSBtaXQgYmxvc3NlbiBIYWVuZGVuCisgICAgICogbW9tZW50YW5lIExlYmVuc3B1bmt0ZQorICAgICAqIG1heGltYWxlIExlYmVuc3B1bmt0ZQorCisgU0lFSEUgQVVDSDoKKyAgICB3ZXIsIHBlb3BsZQorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBUaHUsIDI0LjA3LjE5OTcsIDA5OjAwOjAwIHZvbiBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9tY21kL3JlbW92ZWd1aWxkbWFzdGVyIGIvZG9jL21jbWQvcmVtb3ZlZ3VpbGRtYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRjZTMwMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tY21kL3JlbW92ZWd1aWxkbWFzdGVyCkBAIC0wLDAgKzEsMjQgQEAKKworcmVtb3ZlZ3VpbGRtYXN0ZXIKKy0tLS0tLS0tLS0tLS0tLS0tCisKKyBFUlpNQUdJRVJLT01NQU5ETzoKKyAgICByZW1vdmVndWlsZG1hc3RlciA8bmFtZT4gPGdpbGRlPgorCisgQVJHVU1FTlRFOgorCisgICAgIDxuYW1lPgorICAgICAgICBOYW1lIGRlcyBNYWdpZXJzCisgICAgIDxnaWxkZT4KKyAgICAgICAgTmFtZSBkZXIgR2lsZGUKKworIEJFU0NIUkVJQlVORzoKKyAgICBEZXIgTWFnaWVyIDxuYW1lPiBpc3QgZm9ydGFuIG5pY2h0IG1laHIgR2lsZGVubWFnaWVyIGRlciBHaWxkZSA8Z2lsZGU+LgorCisgICAgRGllc2VyIEJlZmVobCBzdGVodCBudXIgR29ldHRlcm4genVyIFZlcmZ1ZWd1bmcuCisKKyBTSUVIRSBBVUNIOgorICAgIGFkZGd1aWxkbWFzdGVyLCBnaWxkZW4KKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgMjAwMy0xMi0xMCwgWm9vay4KZGlmZiAtLWdpdCBhL2RvYy9tY21kL3JlbW92ZW1hc3RlciBiL2RvYy9tY21kL3JlbW92ZW1hc3RlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2Y1ZDIzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21jbWQvcmVtb3ZlbWFzdGVyCkBAIC0wLDAgKzEsMjUgQEAKKworcmVtb3ZlbWFzdGVyCistLS0tLS0tLS0tLS0KKworIEVSWk1BR0lFUktPTU1BTkRPOgorICAgIHJlbW92ZW1hc3RlciA8bmFtZT4gPHJlZ2lvbj4KKworIEFSR1VNRU5URToKKworICAgICA8bmFtZT4KKyAgICAgICAgTmFtZSBkZXMgTWFnaWVycworICAgICA8cmVnaW9uPgorICAgICAgICBFaW5lIFJlZ2lvbgorCisgQkVTQ0hSRUlCVU5HOgorICAgIERlciBNYWdpZXIgPG5hbWU+IHdpcmQgdm9uIGRlciBMaXN0ZSBkZXIgUmVnaW9uc21hZ2llciBkZXIgUmVnaW9uIDxyZWdpb24+CisgICAgZ2VzdHJpY2hlbi4KKworICAgIERpZXNlciBCZWZlaGwgc3RlaHQgbnVyIEVyem1hZ2llcm4gdW5kIEdvZXR0ZXJuIHp1ciBWZXJmdWVndW5nLgorCisgU0lFSEUgQVVDSDoKKyAgICBhZGRtYXN0ZXIsIHJlZ2lvbmVuCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFRodSwgMjQuMDcuMTk5NywgMDk6MDA6MDAgdm9uIFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL21jbWQvcm0gYi9kb2MvbWNtZC9ybQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mzc4YTAyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21jbWQvcm0KQEAgLTAsMCArMSwzNSBAQAorCitybQorLS0KKworIE1BR0lFUktPTU1BTkRPOgorICAgIHJtIFsgLWlydiBdIDxkYXRlaW5hbWU+IFsuLi5dCisgICAgcm0gWyAtaXJtdiBdIDxkYXRlaW5hbWU+IFsuLi5dIFs8bWFza2U+XQorCisgQVJHVU1FTlRFOgorCisgICAgIDxkYXRlaW5hbWU+IE5hbWUgZWluZXIgRGF0ZWkgb2RlciBlaW5lcyBWZXJ6ZWljaG5pc3NlcworICAgICAgICAgICAgICAgICAoZXMga29lbm5lbiBhdWNoIG1laHJlcmUgc2VpbikKKworIEJFU0NIUkVJQlVORzoKKyAgICBEaWUgYW5nZWdlYmVuZW4gRGF0ZWllbiBvZGVyIFZlcnplaWNobmlzc2Ugd2VyZGVuIGdlbG9lc2NodC4KKyAgICBEaWUgRGF0ZWluYW1lbiBrb2VubmVuIGF1Y2ggTXVzdGVyIHdpZSAqIG9kZXIgPyBlbnRoYWx0ZW4uCisKKyAgICBEaWUgT3B0aW9uZW4gaGFiZW4gZm9sZ2VuZGUgQmVkZXV0dW5nOgorCisgICAgIC1yICBVbnRlcnZlcnplaWNobmlzc2Ugd2VyZGVuIHJla3Vyc2l2IGdlbG9lc2NodC4KKyAgICAgLWkgIEJlaSBqZWRlciBEYXRlaSB3aXJkIG5hY2hnZWZyYWd0LCBvYiBzaWUgZ2Vsb2VzY2h0IHdlcmRlbiBzb2xsLgorICAgICAtbSAgRXMgc2luZCBudXIgRGF0ZWllbiBiZXRyb2ZmZW4sIGRpZSBkZXIgTWFza2UgPG1hc2tlPiBlbnRzcHJlY2hlbgorICAgICAtdiAgRXMgd2lyZCBqZWRlciBBcmJlaXRzc2Nocml0dCBhdXNnZWdlYmVuCisKKyBCRUlTUElFTEU6CisKKyAgICA+IHJtIHRlc3QxLmMKKyAgICA+IHJtICouYmFrCisgICAgPiBybSAtcm0gLyAqfiAgICAgCisKKyBTSUVIRSBBVUNIOgorICAgIGNwLCBtdgorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBUaHUsIDE3LjEwLjIwMDIsIDE2OjMwOjAwIHZvbiBNYW5kcmFnb24KZGlmZiAtLWdpdCBhL2RvYy9tY21kL3JtYW4gYi9kb2MvbWNtZC9ybWFuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZjRkNWEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWNtZC9ybWFuCkBAIC0wLDAgKzEsMjggQEAKKworcm1hbgorLS0tCisKKyBNQUdJRVJLT01NQU5ETzoKKyAgICBybWFuIDxoaWxmc3NlaXRlPiA8bXVkbmFtZT4KKworIEFSR1VNRU5URToKKworICAgICA8aGlsZnNzZWl0ZT4gICBOYW1lIGRlciBnZXd1ZW5zY2h0ZW4gSGlsZmVzZWl0ZQorICAgICA8bXVkbmFtZT4gICAgICBOYW1lIGVpbmVzIGJla2FubnRlbiBNdWRzCisKKyBCRVNDSFJFSUJVTkc6CisgICAgQW4gZGFzIE11ZCA8bXVkbmFtZT4gd2lyZCBlaW5lIEFuZnJhZ2UgZ2VzY2hpY2t0LCBvYiBlcyBlaW5lIEhpbGZlLQorICAgIFNlaXRlIHp1bSBUaGVtYSA8aGlsZnNzZWl0ZT4gYmVyZWl0c3RlbGxlbiBrYW5uLiBEaWUgQW50d29ydCBpc3QKKyAgICB2b20gTXVkIGFiaGFlbmdpZy4KKworIEJFSVNQSUVMRToKKyAgIAorICAgIEltIFBrLU11ZCBkaWUgSGlsZmVzZWl0ZSB6dSBQS3MgYW5mb3JkZXJuOgorCisgICAgPiBybWFuIHBrIHBrLW11ZAorCisgU0lFSEUgQVVDSDoKKyAgICBoaWxmZSBtYW4gdWRwcQorCisgTEVUWlRFIEFFTkRFUlVORzoKKyAgICBEaWUsIDA2LjA2LjIwMDMsIDE4OjAwOjAwIHZvbiBNYW5kcmFnb24KZGlmZiAtLWdpdCBhL2RvYy9tY21kL3JtZGlyIGIvZG9jL21jbWQvcm1kaXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJiNDE4MgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tY21kL3JtZGlyCkBAIC0wLDAgKzEsMjQgQEAKKworcm1kaXIKKy0tLS0tCisKKyBNQUdJRVJLT01NQU5ETzoKKyAgICBybWRpciBbLXZdIDx2ZXJ6PiBbLi4uXQorCisgQVJHVU1FTlRFOgorCisgICAgIDx2ZXJ6PiAgRGFzIHp1IGxvZXNjaGVuZGUgVmVyemVpY2huaXMgKGVzIGtvZW5uZW4gYXVjaCBtZWhyZXJlIHNlaW4pCisKKyBCRVNDSFJFSUJVTkc6CisgICAgRGllIGFuZ2VnZWJlbmVuIFZlcnplaWNobmlzc2Ugd2VyZGVuIGdlbG9lc2NodC4gRGllIFZlcnplaWNobmlzc2UgbXVlc3NlbgorICAgIGRhenUgbGVlciBzZWluLgorCisgICAgRGFzIEZsYWcgLXYgc29yZ3QgZGFmdWVyLCBkYXMgZGV0YWlsbGllcnRlIEluZm9ybWF0aW9uZW4gdWViZXIgZGVuIEZvcnQtCisgICAgc2Nocml0dCBhdXNnZWdlYmVuIHdlcmRlbi4KKworCisgU0lFSEUgQVVDSDoKKyAgICBta2Rpciwgcm0KKworIExFVFpURSBBRU5ERVJVTkc6CisgICAgTWl0LCAwMi4xMC4yMDAyLCAwMjowMDowMCB2b24gTWFuZHJhZ29uCmRpZmYgLS1naXQgYS9kb2MvbWNtZC9zYWxsb3cgYi9kb2MvbWNtZC9zYWxsb3cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg3NTBkMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tY21kL3NhbGxvdwpAQCAtMCwwICsxLDIzIEBACisKK3NhbGxvdworLS0tLS0tCisKKyBNQUdJRVJLT01NQU5ETzoKKyAgICBzYWxsb3cgPG5hbWU+CisKKyBBUkdVTUVOVEU6CisKKyAgICAgPG5hbWU+CisgICAgICAgIE5hbWUgZWluZXMgTWFnaWVycworCisgQkVTQ0hSRUlCVU5HOgorICAgIER1IGVybGF1YnN0IGRlbSBNYWdpZXIgPG5hbWU+IERpY2ggenUgc25vb3Blbi4KKworICAgIERpZXMgaXN0IG51ciBub2V0aWcsIHdlbm4gZWluIE1hZ2llciB2b24gZ2xlaWNoZW0gb2RlciBnZXJpbmdlcmVtIExldmVsCisgICAgRGljaCBzbm9vcGVuIHNvbGwuCisKKyBTSUVIRSBBVUNIOgorICAgIHNub29wCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFRodSwgMjQuMDcuMTk5NywgMDk6MDA6MDAgdm9uIFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL21jbWQvc2JhbmlzaCBiL2RvYy9tY21kL3NiYW5pc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdjODQ3ZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tY21kL3NiYW5pc2gKQEAgLTAsMCArMSw1NSBAQAorCitzYmFuaXNoCistLS0tLS0tCisKKyBNQUdJRVJLT01NQU5ETzoKKyAgICBzYmFuaXNoIDxhZHJlc3NlPiA8dGFnZT4KKworIEFSR1VNRU5URToKKworICAgICA8YWRyZXNzZT4KKyAgICAgICAgSVAtQWRyZXNzZSBkZXMgT3BmZXJzCisgICAgIDx0YWdlPgorICAgICAgICBEaWUgRGF1ZXIgZGVyIFNwZXJydW5nCisKKyBCRVNDSFJFSUJVTkc6CisgICAgTWl0IGRpZXNlbSBCZWZlaGwga2FubiBtYW4gdmVyaGluZGVybiwgZGFzcyBzaWNoIHZvbiBiZXN0aW1tdGVuIEFkcmVzc2VuCisgICAgYXVzIEdhZXN0ZSBlaW5sb2dnZW4gb2RlciBuZXVlIFNwaWVsZXIgYW5nZWxlZ3Qgd2VyZGVuLi4KKyAgICAKKyAgICBEaWUgRGF1ZXIgd2lyZCBpbiBUYWdlbiBhbmdlZ2ViZW4uIEVpbmUgQW5nYWJlIHZvbiAtMSBzZXR6dCBlaW5lIAorICAgIHVuYmVmcmlzdGV0ZSBTcGVycmU7IG1pdCBlaW5lciBEYXVlciB2b24gMCBUYWdlbiBsb2VzY2h0IG1hbiBlaW5lIGdlc2V0enRlIAorICAgIFNwZXJyZS4KKworICAgIERpZSBBbmdhYmUgdm9uICdzYmFuaXNoJyBvaG5lIFBhcmFtZXRlciBnaWJ0IGVpbmUgTGlzdGUgYWxsZXIgZ2VzcGVycnRlbgorICAgIEFkcmVzc2VuIGF1cy4KKworICAgIERpZSB6dSBzcGVycmVuZGUgSVAtQWRyZXNzZSBrYW5uIGluIGRlbiBmb2xnZW5kZW4gRm9ybWVuIGFuZ2VnZWJlbiB3ZXJkZW46CisgICAgICAtICduLm4ubi5uJzogZWluemVsbmUgQWRyZXNzZQorICAgICAgLSAnbi5uLm4ubi94JzogU3VibmV0endlcmsgaW4gQ0lEUi1Ob3RhdGlvbiBtaXQgU3VibmV0em1hc2tlIHguCisgICAgICAgICAgICAgICAgICAgICAyXigzMi14KSBBZHJlc3NlbgorICAgICAgLSAnbi5uLm4ubi9tLm0ubS5tJzogU3VibmV0endlcmsgaW4gQ0lEUi1Ob3RhdGlvbiBtaXQgU3VibmV0em1hc2tlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5tLm0ubQorICAgICAgLSAnbi5uLm4nOiBDbGFzcy1DLU5ldHogbi5uLm4gKDI1NSBBZHJlc3NlbikKKyAgICAgIC0gJ24ubic6IENsYXNzLUItTmV0eiBuLm4gKDY1NTM2IEFkcmVzc2VuKQorCisgICAgRGllc2VyIEJlZmVobCBzdGVodCBlaW5nZXNjaHJhZW5rdCBhYiBMZXZlbCAyNiB6dXIgVmVyZnVlZ3VuZzoKKworICAgICAgLSBhYiBMZXZlbCAyNiBrYW5uIG1hbiBiaXMgenUgemVobiBlaW56ZWxuZSBJUHMgZnVlciBlaW5lbiBUYWcgc3BlcnJlbgorICAgICAgICB1bmQgZWlnZW5lIFNwZXJydW5nZW4gd2llZGVyIGF1ZmhlYmVuCisgICAgICAtIGFiIExldmVsIDQwIGthbm4gbWFuIGJpcyB6dSB6ZWhuIElQcyB1bmQvb2RlciBTdWJuZXR6ZSBtaXQgYmlzIHp1IDI1NQorICAgICAgICBBZHJlc3NlbiBmdWVyIGVpbmVuIFRhZyBzcGVycmVuIHVuZCBlaWdlbmUgU3BlcnJ1bmdlbiB3aWVkZXIgYXVmaGViZW4KKyAgICAgIC0gSGlsZnNzaGVyaWZmcyB1bmQgRXJ6bWFnaWVyIGtvZW5uZW4gYmVsaWViaWcgdmllbGUgSVBzIGJ6dy4gU3VibmV0emUKKyAgICAgICAgYmVsaWViaWdlciBHcm9lc3NlIGZ1ZXIgYmVsaWViaWdlIFplaXRyYWV1bWUgc3BlcnJlbiBzb3dpZSBmcmVtZGUKKyAgICAgICAgU3BlcnJ1bmdlbiB3aWVkZXIgYXVmaGViZW4KKworIEJFTUVSS1VOR0VOOgorICAgIEVpbiBzYmFuaXNoIGZ1ZWhydCBhdXNkcnVlY2tsaWNoIF9uaWNodF8gZGF6dSwgZGFzcyBzaWNoIHZvbiBkZW4KKyAgICBlbnRzcHJlY2hlbmRlbiBBZHJlc3NlbiBrZWluZSBiZXN0ZWhlbmRlbiBTcGllbGVyIG1laHIgZWlubG9nZ2VuCisgICAga29lbm5lbi4KKworIFNJRUhFIEFVQ0g6CisgICAgYmFuaXNoLCBtYmFuaXNoLCB0YmFuaXNoCisKKyBMRVRaVEUgQWVOREVSVU5HOgorIDIwLjAxLjIwMTMsIFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL21jbWQvc2V0IGIvZG9jL21jbWQvc2V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNzNmZGEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWNtZC9zZXQKQEAgLTAsMCArMSw0OSBAQAorCitzZXQKKy0tLQorCisgTUFHSUVSS09NTUFORE86CisgICAgc2V0IFs8dmFyPiBbPHdlcnQ+XV0KKworIEFSR1VNRU5URToKKworICAgICA8dmFyPgorICAgICAgICBlaW5lIGJlbGllYmlnZSBaZWljaGVua2V0dGUKKyAgICAgPHdlcnQ+CisgICAgICAgIGRlciBkYXp1Z2Vob2VyaWdlIFdlcnQKKworIEJFU0NIUkVJQlVORzoKKyAgICBEaWUgVmFyaWFibGUgPHZhcj4gd2lyZCBhdWYgZGVuIFdlcnQgPHdlcnQ+IGdlc3RlenQuCisKKyAgICBMYWVzc3QgbWFuIDx3ZXJ0PiB3ZWcsIHdpcmQgZGllIFZhcmlhYmxlIDx2YXI+IGdlbG9lc2NodC4KKworICAgIEdhbnogb2huZSBBcmd1bWVudGUgd2VyZGVuIGRpZSBtb21lbnRhbiBkZWZpbmllcnRlbiBWYXJpYWJsZW4gYXVzZ2VnZWJlbi4KKworICAgIERpZSBWYXJpYWJsZW4gd2lya2VuIHNpY2ggYmVpIGRlbiBtZWlzdGVuIERhdGVpa29tbWFuZG9zIGF1cy4gTWFuIGthbm4gc2llCisgICAgdmVyd2VuZGVuLCB1bSBzaWNoIEFia3Vlcnp1bmdlbiB6dSBvZnQgYmVudXR6dGVuIERhdGVpZW4gb2RlcgorICAgIFZlcnplaWNobmlzc2VuIHp1IGxlZ2VuLgorCisgQkVTT05ERVJFIFZBUklBQkxFTgorICAgIEVpbmlnZSBVbWdlYnVuZ3N2YXJpYWJsZW4gaGFiZW4gZWluZSBmZXN0ZSBCZWRldXR1bmc6CisKKyAgICAgTFNfT0JKICAgRGllc2UgVmFyaWFibGVuIHNpbmQgaW0gWnVzYW1tZW5oYW5nIG1pdCBkZW0gbHMtQmVmZWhsIHZvbgorICAgICBMU19ESVIgICBCZWRldXR1bmcgdW5kIHN0ZXVlcm4gZGllIGZhcmJsaWNoZSBEYXJzdGVsbHVuZyBkZXIgQXVzZ2FiZSAKKyAgICAgTFNfVkMgICAgCisKKyAgICAgQ0RfU0hPUlQgV2VubiBhdWYgMSBnZXNldHp0LCB3aXJkIGJlaSAnY2QnIGVpbmUgLnJlYWRtZS1EYXRlaSBuaWNodCBtaXQKKyAgICAgICAgICAgICAgYXVzZ2VnZWJlbi4KKworIEJFSVNQSUVMRToKKyAgICBFaW5lIEFia3Vlcnp1bmcgZnVlciBlaW5lbiBQZmFkOgorCisgICAgPiBzZXQgbHMgL2QvaW5zZWxuL3dhcmdvbi9sdWZ0c2NobG9zcworCisgICAgTnVuIGthbm4gbWFuIG1pdCBlaW5lbSBlaW5mYWNoZW4gYGNkICRscycgaW4gZGFzIFZlcnplaWNobmlzIGdlbGFuZ2VuLgorICAgIEVpbiBjZCAkbHMvbW9uIGZ1ZWhydCBuYWNoIC9kL2luc2Vsbi93YXJnb24vbHVmdHNjaGxvc3MvbW9uLgorCisgU0lFSEUgQVVDSDoKKyAgICBjZCwgbHMsIHJtLCBtdiwgY2F0LCBoZWFkLCB0YWlsLCBtb3JlCisKKyBMRVRaVEUgQUVOREVSVU5HOgorICAgIE1pdCwgMDIuMTAuMjAwMiwgMDI6MDA6MDAgdm9uIE1hbmRyYWdvbgorIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9tY21kL3NldGNtc2cgYi9kb2MvbWNtZC9zZXRjbXNnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NDQ5MzcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWNtZC9zZXRjbXNnCkBAIC0wLDAgKzEsMzMgQEAKKworc2V0Y21zZworLS0tLS0tLQorCisgTUFHSUVSS09NTUFORE86CisgICAgc2V0Y21zZyBbPHRleHQ+XQorCisgQVJHVU1FTlRFOgorCisgICAgIDx0ZXh0PiAob3B0aW9uYWwpCisgICAgICAgIERpZSBuZXVlIE1lbGR1bmcKKworIEJFU0NIUkVJQlVORzoKKyAgICBNaXQgZGllc2VtIEJlZmVobCBrYW5uc3QgRHUgZGllIE1lbGR1bmcgZmVzdGxlZ2VuLCBkaWUgYW5kZXJlIExldXRlIGltCisgICAgZ2xlaWNoZW4gUmF1bSBzZWhlbiwgd2VubiBEdSBlaW5lbiBHZWdlbnN0YW5kIGNsb25zdC4gVm9yIGRlbiBUZXh0IHdpcmQKKyAgICBub2NoIERlaW4gTmFtZSBnZXN0ZWxsdC4KKworICAgIE9obmUgQXJndW1lbnQgd2lyZCBkaWUgRGVmYXVsdG1lbGR1bmcgZWluZ2VzdGVsbHQuCisKKyBCRUlTUElFTEU6CisgICAgQW5nZW5vbW1lbiwgV2FyZ29uIHN0ZWxsdCBmb2xnZW5kZSBDbG9uZS1NZWxkdW5nIGVpbjoKKworICAgID4gc2V0Y21zZyBob2x0IGV0d2FzIGF1cyBkZW4gdGllZmVuIFRhc2NoZW4gc2VpbmVzIE1hbnRlbHMKKworICAgIENsb250IFdhcmdvbiBudW4gaXJnZW5kIGV0d2FzLCBzZWhlbiBkaWUgU3BpZWxlciBpbSBnbGVpY2hlbiBSYXVtOgorCisgICAgV2FyZ29uIGhvbHQgZXR3YXMgYXVzIGRlbiB0aWVmZW4gVGFzY2hlbiBzZWluZXMgTWFudGVscy4KKworIFNJRUhFIEFVQ0g6CisgICAgc2V0ZG1zZywgcmV2aWV3LCBjbG9uZQorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBUaHUsIDI0LjA3LjE5OTcsIDA5OjAwOjAwIHZvbiBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9tY21kL3NldGRtc2cgYi9kb2MvbWNtZC9zZXRkbXNnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMWM3ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWNtZC9zZXRkbXNnCkBAIC0wLDAgKzEsMzMgQEAKKworc2V0ZG1zZworLS0tLS0tLQorCisgTUFHSUVSS09NTUFORE86CisgICAgc2V0ZG1zZyBbPHRleHQ+XQorCisgQVJHVU1FTlRFOgorCisgICAgIDx0ZXh0PiAob3B0aW9uYWwpCisgICAgICAgIERpZSBuZXVlIE1lbGR1bmcKKworIEJFU0NIUkVJQlVORzoKKyAgICBNaXQgZGllc2VtIEJlZmVobCBrYW5uc3QgRHUgZGllIE1lbGR1bmcgZmVzdGxlZ2VuLCBkaWUgYW5kZXJlIExldXRlIGltCisgICAgZ2xlaWNoZW4gUmF1bSBzZWhlbiwgd2VubiBEdSBlaW5lbiBHZWdlbnN0YW5kIHplcnN0b2Vyc3QuIFZvciBkZW4gVGV4dAorICAgIHdpcmQgbm9jaCBkZXIgTmFtZSBkZXMgR2VnZW5zdGFuZGVzIGdlc3RlbGx0LgorCisgICAgT2huZSBBcmd1bWVudCB3aXJkIGRpZSBEZWZhdWx0bWVsZHVuZyBlaW5nZXN0ZWxsdC4KKworIEJFSVNQSUVMRToKKyAgICBBbmdlbm9tbWVuLCBXYXJnb24gc3RlbGx0IGZvbGdlbmRlIERlc3RydWN0LU1lbGR1bmcgZWluOgorCisgICAgPiBzZXRkbXNnIHdpcmQgdm9uIFdhcmdvbiBhbm5paGlsaWVydAorCisgICAgWmVyc3RvZXJ0IFdhcmdvbiBudW4gei5CLiBlaW5lIEZhY2tlbCwgc2VoZW4gZGllIFNwaWVsZXIgaW0gZ2xlaWNoZW4gUmF1bToKKworICAgIEVpbmUgRmFja2VsIHdpcmQgdm9uIFdhcmdvbiBhbm5paGlsaWVydC4KKworIFNJRUhFIEFVQ0g6CisgICAgc2V0Y21zZywgcmV2aWV3LCBkZXN0cnVjdAorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBUaHUsIDI0LjA3LjE5OTcsIDA5OjAwOjAwIHZvbiBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9tY21kL3NoZWxsIGIvZG9jL21jbWQvc2hlbGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZjZDNjYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tY21kL3NoZWxsCkBAIC0wLDAgKzEsNDcgQEAKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLU1BR0lFUl9ISUxGU19TRUlURS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBbHMgTWFnaWVyIGhhdCBtYW4gbmViZW4gZGVuIFNwaWVsZXItIHVuZCBTZWhlcmJlZmVobGVuIGVpbmlnZSB3ZWl0ZXJlCitCZWZlaGxlIHp1ciBWZXJmdWVndW5nLiBFaW5lIEVybGFldXRlcnVuZyB6dSBkZW4gZm9sZ2VuZGVuIFRoZW1lbiB1bmQKK0tvbW1hbmRvcyBrYW5uIG1hbiBtaXQgImhpbGZlIDxrb21tYW5kbz4iIGVyaGFsdGVuLiBXb2JlaSBoaWVyIG5pY2h0Cit6d2lzY2hlbiBkZW4gU3R1ZmVuIGRlciBNYWdpZXIgdW50ZXJzY2hpZWRlbiB3aXJkLiBEaWVzIHdpcmQgYWJlciBqZXdlaWxzCitiZWkgZGVyIEVybGFldXRlcnVuZyBlcndhZWhudC4KKworQUxMR0VNRUlORSBUSEVNRU46CisgICAgYmFsYW5jZSwgZm9yc2NoZXJwdW5rdGUsIHRlc3RzcGllbGVyLCB6d2VpdHNwaWVsZXIKKworS09NTVVOSUtBVElPTjoKKyAgICBlY2hvYWxsLCBlY2hvdG8sIGVjaG8sIG1lY2hvLCBtcnVmZSwgb3JvcGF4LCByZW1vdGUKKworQkVXRUdVTkc6CisgICAgZ290bywgdHJhbnMsIGhvbWUsIHZlcmZvbGdlLCBzZXRtaW4sIHNldG1vdXQsIHNldG1taW4sIHNldG1tb3V0LAorICAgIGF0LCBpbiwgKworCitLQU1QRjoKKyAgICB6YXAsIGZyaWVkZW4sIHNldGhhbmRzCisKK0RBVEVJU1lTVEVNOgorICAgIGNkLCBwd2QsIGxzLCBjYXQsIGhlYWQsIHRhaWwsIG1vcmUsIGdyZXAsIGNwLCBtdiwgcm0sIG1rZGlyLAorICAgIHJtZGlyLCBzZXQsIHByb21wdCwgZWQKKworT0JKRUtURToKKyAgICBjbG9uZSwgZGVzdHJ1Y3QsIHVwZChhdGUpLCBsb2FkLCBzZXRjbXNnLCBzZXRkbXNnCisKK0lORk86CisgICAgbXNjaGF1LCBwZW9wbGUsIHB3aG8sIGxvY2FsY21kLCBtYW4sIHNub29wLCBzYWxsb3csIHNwaWVsZXIsIHJtYW4KKworQU5ERVJFUzoKKyAgICBoZWlsZSwgendpbmdlLCB0aXRsZSwgZXh0cmFsb29rLCB0cmFlbmtlLCBpbnZpcywgdmlzLCBwcm90ZWN0LCBkbywKKyAgICBzaG93cHJlc2F5LCBwaW5nLCB0b2RvCisKK1JFR0lPTlNNQUdJRVJCRUZFSExFIFVORCAtVEhFTUVOOgorICAgIHJlZ2lvbnNtYWdpZXIgYmFuaXNoLCBleGVjCisKK0VSWk1BR0lFUkJFRkVITEU6CisgICAgYWRkbWFzdGVyLCByZW1vdmVtYXN0ZXIsIG1iYW5pc2gsIHNodXRkb3duCisKK0luIGRlbiBWZXJ6ZWljaG5pc3NlbiB1bnRlciAvZG9jLyogZmluZGVzdCBEdSB2aWVsZSB3ZWl0ZXJlIERva3VtZW50YXRpb25lbi4KK1VudGVyIGFuZGVyZW0gZmluZGVzdCBEdSBlaW5lbiBQcm9ncmFtbWllcmt1cnMgaW4gTFBDL01vcmdlbkdyYXVlbiB1bnRlcgorICAvZG9jL0tVUlMvKgorQXVzc2VyZGVtIHNvbGx0ZW4gdW5iZWRpbmd0IGRpZSBEb2t1bWVudGF0aW9uZW4gdW50ZXIgL2RvYy9NRy8qIGJlYWNodGV0IHdlcmRlbi4KKwpkaWZmIC0tZ2l0IGEvZG9jL21jbWQvc2hvd3ByZXNheSBiL2RvYy9tY21kL3Nob3dwcmVzYXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIzZTc4NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tY21kL3Nob3dwcmVzYXkKQEAgLTAsMCArMSwyMyBAQAorCitzaG93cHJlc2F5CistLS0tLS0tLS0tCisKKyBNQUdJRVJLT01NQU5ETzoKKyAgICBzaG93cHJlc2F5IFtlaW58YW58YXVzXQorCisgQVJHVU1FTlRFOgorICAgIGtlaW5lCisKKyBCRVNDSFJFSUJVTkc6CisgICAgTm9ybWFsZXJ3ZWlzZSB3aXJkIGRhcyBQcmVzYXkgYmVpIGRlbiBLb21tdW5pa2F0aW9uc2JlZmVobGVuIG5pY2h0IG1pdAorICAgIGF1c2dlZ2ViZW4uIE1vZWNodGUgbWFuIGRhcyBkZW5ub2NoLCBzbyBrYW5uIGRpZSBBdXNnYWJlIG1pdCBkaWVzZW0gQmVmZWhsCisgICAgYWt0aXZpZXJ0IHVuZCBkZWFrdGl2aWVydCB3ZXJkZW4uCisKKyAgICBNYW4gc29sbHRlIGRhcyBQcmVzYXkgbnVyIG1pdCBhdXNnZWJlbiBsYXNzZW4sIHdlbm4gZXMga3VyeiBpc3QgKG5pY2h0CisgICAgbGFlbmdlciBhbHMgMTAgWmVpY2hlbikuCisKKyBTSUVIRSBBVUNIOgorICAgIHByZXNheQorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBUdWUsIDE3LjEyLjIwMDIsIDEyOjAwOjAwIHZvbiBNYW5kcmFnb24KZGlmZiAtLWdpdCBhL2RvYy9tY21kL3NodXRkb3duIGIvZG9jL21jbWQvc2h1dGRvd24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZjZTJiYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tY21kL3NodXRkb3duCkBAIC0wLDAgKzEsMjYgQEAKKworc2h1dGRvd24KKy0tLS0tLS0tCisKKyBFUlpNQUdJRVJLT01NQU5ETzoKKyAgICBzaHV0ZG93biA8Z3J1bmQ+CisKKyBBUkdVTUVOVEU6CisKKyAgICAgPGdydW5kPgorICAgICAgICBEZXIgR3J1bmQgZnVlciBkZW4gTmV1c3RhcnQKKworIEJFU0NIUkVJQlVORzoKKyAgICBNaXQgZGllc2VtIEJlZmVobCB3aXJkIGRhcyBTcGllbCBTT0ZPUlQgaGVydW50ZXJnZWZhaHJlbi4gTWFuIHNvbGx0ZQorICAgIGRpZXNlbiBCZWZlaGwgbnVyIGJlbnV0emVuLCB3ZW5uIGVzIHdpcmtsaWNoIGRyaW5nZW5kIG5vdHdlbmRpZyBpc3Q7IGZ1ZXIKKyAgICBlaW5lbiBOZXVzdGFydCBtaXQgVmVyem9lZ2VydW5nIHN0ZWh0IEFybWFnZWRkb24gaW1tZXIgZ2VybiB6dXIKKyAgICBWZXJmdWVndW5nLiBFciBzb2xsdGUgZWlnZW50bGljaCBpbW1lciBnZXdhZWhsdCB3ZXJkZW4sIGRhIGRpZSBTcGllbGVyCisgICAgZGFubiBhdWNoIFplaXQgaGFiZW4sIHNpY2ggYXVmIGRlbiBOZXVzdGFydCBlaW56dXN0ZWxsZW4uCisKKyAgICBEaWVzZXIgQmVmZWhsIHN0ZWh0IG51ciBFcnptYWdpZXJuIHVuZCBHb2V0dGVybiB6dXIgVmVyZnVlZ3VuZy4KKworIFNJRUhFIEFVQ0g6CisgICAgYC9vYmovc2h1dCcgKEFybWFnZWRkb24pCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFRodSwgMjQuMDcuMTk5NywgMDk6MDA6MDAgdm9uIFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL21jbWQvc25vb3AgYi9kb2MvbWNtZC9zbm9vcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGQ4ZGRjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21jbWQvc25vb3AKQEAgLTAsMCArMSw0NSBAQAorCitzbm9vcAorLS0tLS0KKworIE1BR0lFUktPTU1BTkRPOgorICAgIHNub29wIDxuYW1lPiBbPGZsYWdzPl0KKyAgICBzbm9vcAorCisgQVJHVU1FTlRFOgorCisgICAgIDxuYW1lPgorICAgICAgICBOYW1lIGVpbmVzIFNwaWVsZXJzCisgICAgIDxmbGFncz4gKG9wdGlvbmFsKQorICAgICAgICAnbCcgdW5kL29kZXIgJ2YnCisKKyBCRVNDSFJFSUJVTkc6CisgICAgRHUgc2llaHN0IHVuZCBob2Vyc3QgYWxsZXMgYXVzIGRlciBTaWNodCBkZXMgU3BpZWxlcnMgPG5hbWU+LiBEYXMga2FubgorICAgIGF1Y2ggZWluIE1hZ2llciBzZWluLCB3ZW5uIGVyIGVpbmVuIGtsZWluZXJlbiBMZXZlbCBoYXQgYWxzIER1LgorCisgICAgRGllIEZsYWdzIGhhYmVuIGZvbGdlbmRlIEJlZGV1dHVuZzoKKworICAgICBmIChmb3JjZSkKKyAgICAgICAgRmFsbHMgZGVyIFNwaWVsZXIgc2Nob24gdm9uIGVpbmVtIE1hZ2llciBtaXQgbmllZHJpZ2VyZW0gTGV2ZWwKKyAgICAgICAgZ2Vzbm9vcGVkIHdpcmQsIHdpcmQgZGllc2VtIGRlciBTbm9vcCB3ZWdnZW5vbW1lbiAoZWluIFNwaWVsZXIga2FubgorICAgICAgICBpbW1lciBudXIgdm9uICplaW5lbSogTWFnaWVyIGdsZWljaHplaXRpZyBnZXNub29wZWQgd2VyZGVuKS4KKworICAgICAgICBPaG5lIGRhcyBGbGFnIHdpcmQgbnVyIGVpbmUgTWl0dGVpbHVuZyBhdXNnZWdlYmVuLCBkYXNzIGRlciBTcGllbGVyCisgICAgICAgIHNjaG9uIGdlc25vb3BlZCB3aXJkLgorCisgICAgIGwgKGxvY2tlZCkKKyAgICAgICAgR2lidCBtYW4gZGllc2VzIEZsYWcgYW4sIHNvIGtvZW5uZW4gTWFnaWVyIG1pdCBrbGVpbmVyZW0gTGV2ZWwgZGVuCisgICAgICAgIFNwaWVsZXIgbmljaHQgc25vb3Blbiwgd2FlaHJlbmQgbWFuIHNlbGJzdCBlcyBnZXJhZGUgdHV0LgorCisgICAgICAgIExhZXNzdCBtYW4gZGFzIEZsYWcgd2VnLCB1bmQgZWluIE1hZ2llciBtaXQga2xlaW5lcmVtIExldmVsIHdpbGwgZGVuCisgICAgICAgIGdsZWljaGVuIFNwaWVsZXIgc25vb3Blbiwgc28gd2lyZCBlciBnZXdpc3Nlcm1hc3NlbiBkYXp3aXNjaGVuCisgICAgICAgIGdla2xpbmt0OiBEZXIgU3BpZWxlciB3aXJkIG51biB2b24gZGllc2VtIE1hZ2llciBnZXNub29wZWQsIHVuZCBkZXIKKyAgICAgICAgTWFnaWVyIHdpZWRlcnVtIHZvbiBEaXIuCisKKyAgICBNaXQgZGVyIHp3ZWl0ZW4gRm9ybSAob2huZSBBcmd1bWVudGUpIHdpcmQgZGFzIFNub29wZW4gd2llZGVyIGJlZW5kZXQuCisKKyBTSUVIRSBBVUNIOgorICAgIHNhbGxvdywgdmVydHJhZywgc25vb3AoKQorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBUdWUsIDAyLjA5LjE5OTcsIDE2OjU1OjA0IHZvbiBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9tY21kL3NwaWVsZXIgYi9kb2MvbWNtZC9zcGllbGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YTVjMjIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWNtZC9zcGllbGVyCkBAIC0wLDAgKzEsMjYgQEAKKworc3BpZWxlcgorLS0tLS0tLQorCisgTUFHSUVSS09NTUFORE86CisgICAgc3BpZWxlciBhdXMgaXAgPGlwLWFkcmVzc2U+CisgICAgc3BpZWxlciBhdXMgaXAgdm9uIDxzcGllbGVyLW5hbWU+CisKKyBBUkdVTUVOVEU6CisgICAgIDxpcC1hZHJlc3NlPiAgIElQLUFkcmVzc2UgaW0gRm9ybWF0IHgueC54LngKKyAgICAgPHNwaWVsZXItbmFtZT4gTmFtZSBlaW5lcyBlaW5nZWxvZ2d0ZW4gU3BpZWxlcnMKKworIEJFU0NIUkVJQlVORzoKKyAgICBEaWVzZXIgQmVmZWhsIHplaWd0IGFsbGUgU3BpZWxlciBhbiwgZGllIHVlYmVyIGRpZSBJUC1BZHJlc3NlCisgICAgPGlwLWFkcmVzc2U+IG9kZXIgZGllc2VsYmUgSVAtQWRyZXNzZSBlaW5nZWxvZ2d0IHNpbmQgd2llIGRlcgorICAgIFNwaWVsZXIgPHNwaWVsZXItbmFtZT4uCisgCisgICAgRXMgd2VyZGVuIHp1ZGVtIEluZm9ybWF0aW9uZW4gd2llIEVpbmxvZ2RhdHVtLCBJZGxlemVpdCB1bmQKKyAgICBad2VpdGllZWlnZW5zY2hhZnQgYW5nZXplaWd0LgkKKworIFNJRUhFIEFVQ0g6CisgICAgcGVvcGxlLCBwd2hvLCBxdWVyeV9pcF9udW1iZXIoRSkKKworCisgTEVUWlRFIEFFTkRFUlVORzoKKyAgICBGcmUsIDA0LjEwLjIwMDIsIDEzOjAwOjAwIHZvbiBNYW5kcmFnb24KZGlmZiAtLWdpdCBhL2RvYy9tY21kL3N1ZW5kZXIgYi9kb2MvbWNtZC9zdWVuZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MzhiNjIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWNtZC9zdWVuZGVyCkBAIC0wLDAgKzEsNTcgQEAKKworc3VlbmRlcgorLS0tLS0tLQorCisgRVJaTUFHSUVSLSBVTkQgREVQVVRZLUtPTU1BTkRPOgorCisgICAgc3VlbmRlciA/ICAgICAgICAgICAgICAgICAgICBHaWJ0IGVpbmUgTGlzdGUgYWxsZXIgZWluZ2V0cmFnZW5lbiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdWVuZGVyIiBhdXMuCisKKyAgICBzdWVuZGVyIDxuYW1lPiAgICAgICAgICAgICAgIExpc3RldCBkaWUgIlN1ZW5kZW4iIGRlcyBTcGllbGVycy9NYWdpZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT4gYXVmLgorCisgICAgc3VlbmRlciArPG5hbWU+IDx0ZXh0PiAgICAgICBGdWVndCBlaW5lbiAiU3VlbmRlbmVpbnRyYWciIGZ1ZXIgZGVuCisgICAgc3VlbmRlciArPG5hbWU+IC1mIDx0ZXh0PiAgICBTcGllbGVyL01hZ2llciA8bmFtZT4gaGluenUuIER1cmNoIEFuZ2FiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVyIE9wdGlvbiAtZiBrb2VubmVuIEVpbnRyYWVnZSBmdWVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXJlaXRzIGdlbG9lc2NodGUgU3BpZWxlci9NYWdpZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hY2hnZXRyYWdlbiB3ZXJkZW4uCisKKyAgICBzdWVuZGVyIC08bmFtZT4gPG5yPiAgICAgICAgIExvZXNjaHQgZGVuICJTdWVuZGVuZWludHJhZyIgPG5yPiBkZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwaWVsZXJzL01hZ2llcnMgPG5hbWU+LiBEaWVzZXMgS29tbWFuZG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzdCBFcnptYWdpZXJuIHZvcmJlaGFsdGVuLgorCisgICAgc3VlbmRlciAhICAgICAgICAgICAgICAgICAgICBFcnpldWd0IGVpbiBEdW1wLUZpbGUgbWl0IGFsbGVuIEVpbnRyYWVnZW4KKworICAgIHN1ZW5kZXIgKiAgICAgICAgICAgICAgICAgICAgWmVpZ3QgQUxMRSBFaW50cmFlZ2UgYW4gKHBlciBNb3JlKCkgOykKKworIEFSR1VNRU5URToKKworICAgICA8bmFtZT4KKyAgICAgICAgTmFtZSBkZXMgU3BpZWxlcnMvTWFnaWVycworCisgICAgIDx0ZXh0PgorICAgICAgICBJbmZvdGV4dC4gU29sbHRlIGVudGhhbHRlbjogCisgICAgICAgICAgYSkgb2IgZXMgZWluZSBWZXJ3YXJudW5nLCBlaW5lIEJlc3RyYWZ1bmcgb2RlciBMb2VzY2h1bmcgaXN0CisgICAgICAgICAgYikgZGVuIEdydW5kLgorICAgICAgICAgIGMpIEJlaSBOYWNodHJhZWdsaWNoZW4gRWludHJhZWdlbiBlaW5lbiBlbnRzcHIuIEhpbndlaXMuCisgICAgICAgIERlciBUZXh0IHdpcmQgYXV0b21hdGlzY2ggdW0gZGFzIERhdHVtIHVuZCBkZW4gTmFtZW4gZGVzCisgICAgICAgIEVpbnRyYWdlbmRlbiBlcmdhZW56dC4gCisKKyAgICAgPG5yPgorICAgICAgICBEaWUgTnVtbWVyIGRlcyBFaW50cmFncy4gTmFjaCBqZWRlciBMb2VzY2h1bmcgd2VyZGVuIGRpZSBFaW50cmFlZ2UKKyAgICAgICAgbmV1IGR1cmNobnVtbWVyaWVydCEKKworIEJFU0NIUkVJQlVORzoKKworICAgIFZlcndhbHR1bmcgZGVyIHZvbSBTaGVyaWZmIHVuZCBzZWluZW0gRGVwdXR5IGR1cmNoZ2VmdWVocnRlbiBNYXNzbmFobWVuLAorICAgIGRhbWl0IGFuZGVyZSBFcnptYWdpZXIvR29ldHRlciBzY2huZWxsZXIgbmFjaHNjaGxhZ2VuIGtvZW5uZW4sIG9iIHNpZQorICAgIHouQi4gZWluZSBTdHJhZmUgYXVmaGViZW4gZHVlcmZlbi4KKworICAgIERpZXNlciBCZWZlaGwgc3RlaHQgbnVyIEVyem1hZ2llcm4gdW5kIERlcHV0aWVzIHp1ciBWZXJmdWVndW5nLgorCisgU0lFSEUgQVVDSDoKKworICAgIHNoZXJpZmYKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgRGllLCAxNS4wOC4yMDAwLCAxMTowMDowMCB2b24gUGFyYWNlbHN1cwpkaWZmIC0tZ2l0IGEvZG9jL21jbWQvdGFpbCBiL2RvYy9tY21kL3RhaWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRhZGI1OQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tY21kL3RhaWwKQEAgLTAsMCArMSwyMSBAQAorCit0YWlsCistLS0tCisKKyBNQUdJRVJLT01NQU5ETzoKKyAgICB0YWlsIDxkYXRlaT4KKworIEFSR1VNRU5URToKKworICAgICA8ZGF0ZWk+CisgICAgICAgIERpZSBhdXN6dWdlYmVuZGUgRGF0ZWkKKworIEJFU0NIUkVJQlVORzoKKyAgICBEaWUgbGV0enRlbiBaZWlsZW4gZGVyIERhdGVpIDxkYXRlaT4gd2VyZGVuIGF1c2dlZ2ViZW4uIERhYmVpIHdpcmQgZWluCisgICAgTWF4aW11bSB2b24gMTAwMCBCeXRlIG5pY2h0IHVlYmVyc2Nocml0dGVuLgorCisgU0lFSEUgQVVDSDoKKyAgICBjYXQsIGhlYWQsIG1vcmUKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgVGh1LCAyNC4wNy4xOTk3LCAwOTowMDowMCB2b24gV2FyZ29uCmRpZmYgLS1naXQgYS9kb2MvbWNtZC90YmFuaXNoIGIvZG9jL21jbWQvdGJhbmlzaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjdhMjI4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21jbWQvdGJhbmlzaApAQCAtMCwwICsxLDI2IEBACisKK3RiYW5pc2gKKy0tLS0tLS0KKworIEVSWk1BR0lFUktPTU1BTkRPOgorICAgIHRiYW5pc2ggPG5hbWU+IDx0YWdlPgorCisgQVJHVU1FTlRFOgorCisgICAgIDxuYW1lPgorICAgICAgICBOYW1lIGRlcyBPcGZlcnMKKyAgICAgPHRhZ2U+CisgICAgICAgIERpZSBEYXVlciBkZXIgU3BpZWxwYXVzZQorCisgQkVTQ0hSRUlCVU5HOgorICAgIE1pdCBkaWVzZW0gQmVmZWhsIGthbm4gbWFuIFNwaWVsZXJuIGVpbmUgU3BpZWxwYXVzZSBhdWZlcmxlZ2VuLiBEaWUgRGF1ZXIKKyAgICB3aXJkIGluIFRhZ2VuIGFuZ2VnZWJlbi4gRWluZSBBbmdhYmUgdm9uIC0xIHNldHp0IGVpbmUgdW5iZWZyaXN0ZXRlCisgICAgU3BpZWxwYXVzZTsgbWl0IGVpbmVyIERhdWVyIHZvbiAwIFRhZ2VuIGxvZXNjaHQgbWFuIGVpbmUgZ2VzZXR6dGUgU3BlcnJlLgorCisgICAgRGllc2VyIEJlZmVobCBrYW5uIG51ciB2b24gRXJ6bWFnaWVybiB1bmQgR29ldHRlcm4gYXVzZ2VmdWVocnQgd2VyZGVuLgorCisgU0lFSEUgQVVDSDoKKyAgICBiYW5pc2gsIG1iYW5pc2gsIHNiYW5pc2gKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgTW9uLCAyMC4xMi4xOTk5LCAyMzozMDowMCB2b24gVGlhbWFrCmRpZmYgLS1naXQgYS9kb2MvbWNtZC90b2RvIGIvZG9jL21jbWQvdG9kbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzczYjE0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21jbWQvdG9kbwpAQCAtMCwwICsxLDM1IEBACisKK3RvZG8KKy0tLS0KKworIE1BR0lFUktPTU1BTkRPOgorICAgIHRvZG8gbmV1CisgICAgdG9kbyBhbnplaWdlbiBbPG51bW1lcjE+XSBbYmlzIDxudW1tZXIyPl0KKyAgICB0b2RvIGxvZXNjaGVuIDxudW1tZXIxPgorICAgIHRvZG8gdmVyc2NoaWViZW4gWzxudW1tZXIxPl0gW25hY2ggPHppZWw+XQorCisgQVJHVU1FTlRFOgorCisgICAgIDxudW1tZXIxPgorICAgICA8bnVtbWVyMj4gTnVtbWVyIGVpbmVzIEVpbnRyYWdzIGluIGRlciBUb2RvLUxpc3RlCisgICAgIDx6aWVsPiAgICBOdW1tZXIgZWluZXMgRWludHJhZ3MgaW4gZGVyIFRvZG8tTGlzdGUgb2RlciAnb2Jlbicgb2RlciAndW50ZW4nCisKKyBCRVNDSFJFSUJVTkc6CisgICAgTWl0IGRlbSBCZWZlaGwgJ3RvZG8nIGthbm4gZWluIE1hZ2llciBzZWluZSBUb2RvLUxpc3RlIHZlcndhbHRlbi4gVmllcgorICAgIGdydW5kc2FldHpsaWNoZSBPcHRpb25lbiBzdGVoZW4gaGllciB6dXIgVmVyZnVlZ3VuZzoKKworICAgICd0b2RvIG5ldScgbGVndCBlaW5lbiBuZXVlbiBFaW50cmFnIGFuLgorICAgICd0b2RvIGxvZXNjaGVuJyBsb2VzY2h0IGRlbiBFaW50cmFnIDxudW1tZXIxPgorICAgICd0b2RvIGFuemVpZ2VuJyB6ZWlndCBlbnR3ZWRlciBhbGxlIEVpbnRyYWVnZSBhbiwgZWluZW4gZWluemVsbmVuIEVpbnRyYWcKKyAgICAgICAgICAgICAgICAgICAgb2RlciBlaW5lbiBBdXNzY2huaXR0IGF1cyBkZXIgVG9kby1MaXN0ZS4gRmFsbHMgPG51bW1lcjI+CisgICAgICAgICAgICAgICAgICAgIGtsZWluZXIgaXN0LCBhbHMgPG51bW1lcjE+IGVyZm9sZ3QgZGllIEF1c2dhYmUgcnVlY2t3YWVydHMuCisgICAgJ3RvZG8gdmVyc2NoaWViZW4nIHZlcnNjaGllYnQgZWluZW4gRWludHJhZyBhbiBlaW5lIGJlc3RpbW10ZSBTdGVsbGUgb2RlcgorICAgICAgICAgICAgICAgICAgICBlaW5lbiBTY2hyaXR0IG5hY2ggb2JlbiBvZGVyIHVudGVuLgorCisgICAgTmVnYXRpdmUgTnVtbWVybiBiZWkgJ3RvZG8gYW56ZWlnZW4nIHdlcmRlbiB2b20gRW5kZSBkZXIgVG9kby1MaXN0ZSBhdXMKKyAgICBnZXphZWhsdC4KKworIFNJRUhFIEFVQ0g6CisKKyBMRVRaVEUgQUVOREVSVU5HOgorICAgIE1pdCwgMDIuMTAuMjAwMiwgMDI6MDA6MDAgdm9uIE1hbmRyYWdvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9tY21kL3RyYWVua2UgYi9kb2MvbWNtZC90cmFlbmtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNGQzMDUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWNtZC90cmFlbmtlCkBAIC0wLDAgKzEsMjggQEAKKwordHJhZW5rZQorLS0tLS0tLQorCisgTUFHSUVSS09NTUFORE86CisgICAgdHJhZW5rZQorCisgQVJHVU1FTlRFOgorICAgIGtlaW5lCisKKyBCRVNDSFJFSUJVTkc6CisgICAgTWl0IGRpZXNlbSBLb21tYW5kbyBrYW5uIG1hbiBiZXN0aW1tZW4sIG9iIG1hbiB1ZWJlcmFsbCwgd28gZWluCisgICAgWmF1YmVydHJhbmsgdmVyc3RlY2t0IGlzdCwgYXVjaCBlaW5lbiBUcmFuayBmaW5kZW4ga2Fubi4KKworICAgIEFuc29uc3RlbiBmaW5kZXQgbWFuIG51ciBkaWUgVHJhZW5rZSwgZGllIG1hbiBpbiBzZWluZXIgTGlzdGUgc3RlaGVuIGhhdC4KKworICAgIERlciBCZWZlaGwgd2lya3QgYWxzIFVtc2NoYWx0ZXI6IEthbm4gbWFuIFRyYWVua2UgZmluZGVuLCBzbyB3aXJkIGRhcworICAgIFZlcmhhbHRlbiBudW4gYXVzZ2VzY2hhbHRldCwgdW5kIHVtZ2VrZWhydC4KKworIEhJTldFSVM6CisgICAgV2VubiBtYW4gbWl0IGVpbmdlc2NoYWx0ZXRlbSAidHJhZW5rZSIgWmF1YmVydHJhZW5rZSBmaW5kZXQsIHdlcmRlbgorICAgIGRpZXNlIE5JQ0hUIGF1cyBkZXIgWlQtTGlzdGUgYXVzZ2V0cmFnZW4uCisKKyBTSUVIRSBBVUNIOgorICAgIGF0dHJpYnV0ZSwgemF1YmVydHJhZW5rZQorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgIDEzLjA4LjIwMTUsIEFyYXRob3JuIApkaWZmIC0tZ2l0IGEvZG9jL21jbWQvdHJhbnMgYi9kb2MvbWNtZC90cmFucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzU3YmU0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21jbWQvdHJhbnMKQEAgLTAsMCArMSwyNCBAQAorCit0cmFucworLS0tLS0KKworIE1BR0lFUktPTU1BTkRPOgorICAgIHRyYW5zIDxuYW1lPgorCisgQVJHVU1FTlRFOgorCisgICAgIDxuYW1lPgorICAgICAgICBOYW1lIGVpbmVzIExlYmV3ZXNlbnMKKworIEJFU0NIUkVJQlVORzoKKyAgICBEYXMgTGViZXdlc2VuIDxuYW1lPiB3aXJkIHp1IERpciB0cmFuc3BvcnRpZXJ0LgorCisgICAgU3BpZWxlciBkdWVyZmVuIGRhZHVyY2ggbmljaHQgaW0gU3BpZWwgYmVlaW5mbHVzc3Qgd2VyZGVuIQorCisgICAgTWFnaWVyLUxlaHJsaW5nZW4gc3RlaHQgZGllc2VyIEJlZmVobCBub2NoIG5pY2h0IHp1ciBWZXJmdWVndW5nLgorCisgU0lFSEUgQVVDSDoKKyAgICB2ZXJ0cmFnLCBnb3RvCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFR1ZSwgMDIuMDkuMTk5NywgMTY6NTU6MTQgdm9uIFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL21jbWQvdWRwcSBiL2RvYy9tY21kL3VkcHEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZmZjcxZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tY21kL3VkcHEKQEAgLTAsMCArMSw0NyBAQAorCit1ZHBxCistLS0tCisKKyBNQUdJRVJLT01NQU5ETzoKKyAgICB1ZHBxIDxtdWQ+IDx0eXBlPgorCisgQVJHVU1FTlRFOgorCisgICAgIDxtdWQ+CisgICAgICAgIGVpbiBNVUQgYXVzIGRlciBgbXVkcyctTGlzdGUKKyAgICAgPHR5cGU+CisgICAgICAgIEFydCBkZXIgZ2V3dWVuc2NodGVuIEluZm9ybWF0aW9uCisKKyBCRVNDSFJFSUJVTkc6CisgICAgTWl0IGRpZXNlbSBLb21tYW5kbyBrYW5uIG1hbiBJbmZvcm1hdGlvbmVuIHVlYmVyIGRlbiBVRFAtU2VydmljZSB1bmQgZGVuCisgICAgSU5FVEQgdm9uIGFuZGVyZW4gTVVEcyBhdXMgZGVyIGBtdWRzJy1MaXN0ZSBhYmZyYWdlbi4KKworICAgIEZvbGdlbmRlIEluZm9ybWF0aW9uZW4gKDx0eXBlPikga29lbm5lbiBhYmdlZnJhZ3Qgd2VyZGVuOgorCisgICAgIGNvbW1hbmRzCisgICAgICAgIFVEUC1Lb21tYW5kb3MsIGRpZSBkYXMgTVVEIHZlcnN0ZWh0CisgICAgIGVtYWlsCisgICAgICAgIEVNYWlsLUFkcmVzc2UsIG1pdCBkZXIgZGFzIE1VRCBiencuIHNlaW5lIEFkbWluaXN0cmF0b3JlbiB6dSBlcnJlaWNoZW4KKyAgICAgICAgc2luZAorICAgICBob3N0cworICAgICAgICBEaWUgTGlzdGUgZGVyIEhvc3RzLCBtaXQgZGVuZW4gZGFzIE1VRCBpbiBWZXJiaW5kdW5nIHN0ZWh0IChpbSBzZWxiZW4KKyAgICAgICAgRm9ybWF0IHdpZSBgL2V0Yy9JTkVURF9IT1NUUycKKyAgICAgaW5ldGQKKyAgICAgICAgRGllIFZlcnNpb25zbnVtbWVyIGRlcyB2ZXJ3ZW5kZXRlbiBJTkVURAorICAgICBsaXN0CisgICAgICAgIERpZSBMaXN0ZSBkZXIgSW5mb3JtYXRpb25lbiwgZGllIG1hbiBtaXQgZGVtIGB1ZHBxJy1CZWZlaGwgdm9uIGRlbSBNVUQKKyAgICAgICAgZXJoYWx0ZW4ga2FubiAoZGFzIGtvZW5uZW4gbWVociBvZGVyIHdlbmlnZXIgUHVua3RlIHNlaW4sIGFscyBpbgorICAgICAgICBkaWVzZXIgTGlzdGUgaGllciB2b3JoYW5kZW4gc2luZCwgamUgbmFjaCBWZXJzaW9uIGRlcyBJTkVURCBhdWYgZGVyCisgICAgICAgIGFuZGVyZW4gU2VpdGUpCisgICAgIG11ZF9wb3J0CisgICAgICAgIERlciBQb3J0LCB1bnRlciBkZW0gZGFzIE1VRCBsYWV1ZnQKKyAgICAgdGltZQorICAgICAgICBEaWUgU3lzdGVtemVpdCBkZXMgTVVEcworICAgICB2ZXJzaW9uCisgICAgICAgIERpZSBWZXJzaW9uc251bW1lciBkZXMgdmVyd2VuZGV0ZW4gR2FtZURyaXZlcnMKKworIFNJRUhFIEFVQ0g6CisgICAgbXVkcworCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBUaHUsIDI0LjA3LjE5OTcsIDA5OjAwOjAwIHZvbiBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9tY21kL3VwZCBiL2RvYy9tY21kL3VwZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjYyMzZhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21jbWQvdXBkCkBAIC0wLDAgKzEsNzkgQEAKKwordXBkCistLS0KKworIE1BR0lFUktPTU1BTkRPOgorICAgIHVwZCBbIC1hYmNkaGZpbG1ydiBdIDxkYXRlaT4gWy4uLl0KKworIEFSR1VNRU5URToKKworICAgICA8ZGF0ZWk+IFsuLi5dCisgICAgICAgIGRpZSB6dSBiZWFyYmVpdGVuZGUobikgRGF0ZWkoZW4pCisKKyBCRVNDSFJFSUJVTkc6CisgICAgRGllc2VzIHNwZXppZWxsZSBLb21tYW5kbyBzdGVsbHQgZWluIGRhdGVpYmFzaWVydGVzIFVwZGF0ZSBkYXIuIEVzCisgICAgemVyc3RvZXJ0IHVuZC9vZGVyIGxhZWR0IGdlbGFkZW5lIE9iamVrdGUgKEJsdWVwcmludHMpLgorCisgICAgRGllIERhdGVpbmFtZW4ga29lbm5lbiBhdWNoIE11c3RlciB3aWUgKiBvZGVyID8gZW50aGFsdGVuLgorCisgICAgV2lyZCBlaW4gT2JqZWt0IG5pY2h0IG51ciB6ZXJzdG9lcnQsIHNvbmRlcm4gYXVjaCBuZXUgZXJ6ZXVndCwgc28gd2lyZAorICAgIENvbmZpZ3VyZSgpIGJlbnV0enQsIHNvZmVybiBlcyBlaW5lcyBoYXQsIGQuaC4gZGllIE9iamVrdGRhdGVuIHdlcmRlbgorICAgIHZvciBkZXIgWmVyc3RvZXJ1bmcgbWl0dGVscyBDb25maWd1cmUoKSBhYmdlcnVmZW4gdW5kIGltIG5ldWVuIE9iamVrdCBtaXQKKyAgICBDb25maWd1cmUoKSB3aWVkZXIgZ2VzZXR6dC4KKworICAgIFp1c2FldHpsaWNoIGtvZW5uZW4gZm9sZ2VuZGUgRmxhZ3MgYW5nZWdlYmVuIHdlcmRlbjoKKworICAgICAtYSAgQWxsZSBJbnN0YW56ZW4gKENsb25lcykgZGVyIERhdGVpIHdlcmRlbiB6ZXJzdG9lcnQuIERhIGRhenUgZGllCisgICAgICAgICBnZXNhbXRlIE9iamVrdGxpc3RlIGR1cmNoc3VjaHQgd2VyZGVuIG11c3MgdW5kIGRpZXNlIEZ1bmt0aW9uCisgICAgICAgICBlbnRzcHJlY2hlbmQgemVpdGF1ZndlbmRpZyBpc3QsIHNvbGx0ZSBtYW4gZGllc2VzIG51ciBtaXQgQmVkYWNodAorICAgICAgICAgYmVudXR6ZW4uCisgICAgIC1iICBGYWxscyBlcyBiZWltIFVwZGF0ZSBlaW5lbiBGZWhsZXIgZ2FiLCB3aXJkIHZlcnN1Y2h0LCBlaW4gQmFja3RyYWNlCisgICAgICAgICBhdXMgYC88cmVjaG5lcj4uZGVidWcubG9nJyB6dSBsZXNlbi4KKyAgICAgLUMgIERpZSBOdXR6dW5nIHZvbiBDb25maWd1cmUoKSB3aXJkIGVyend1bmdlbiwgZC5oLiBPYmpla3RlLCBkaWUga2VpbgorICAgICAgICAgb2VmZmVudGxpY2hlcyBDb25maWd1cmUoKSBoYWJlbiwgd2VyZGVuIG5pY2h0IHplcnN0b2VydC9lcnNldHp0LgorICAgICAgICAgKGltIFp1c2FtbWVuc3BpZWwgbWl0IC1sIG9kZXIgLXIsIGlua29tcGF0aWJlbCBtaXQgLWMpCisgICAgIC1jICBEaWUgUHJvcGVydGllcyBkZXMgT3JpZ2luYWxvYmpla3RlcyB3ZXJkZW4ga29waWVydC4gSW4gZGllc2VtIEZhbGwKKyAgICAgICAgIHdpcmQgQ29uZmlndXJlKCkgX25pY2h0XyBiZW51dHp0IChpbSBadXNhbW1lbnNwaWVsIG1pdCAtbCB1bmQgLXIsCisgICAgICAgICBpbmtvbXBhdGliZWwgbWl0IC1DKQorICAgICAtZCAgQmVpbSBaZXJzdG9lcmVuIGRlciBJbnN0YW56ZW4gd2VyZGVuIGF1Y2ggZXZ0bC4gaW4gaWhuZW4gdm9yaGFuZGVuZQorICAgICAgICAgT2JqZWt0ZSB6ZXJzdG9lcnQuIE51ZXR6bGljaCwgdW0gei5CLiBOUENzIHNhbXQgaWhyZXIgQXVzcnVlc3R1bmcgenUKKyAgICAgICAgIGVudHNvcmdlbi4KKyAgICAgLWYgIEFsbGUgSW5zdGFuemVuIChDbG9uZXMpIGRlciBEYXRlaSB3ZXJkZW4gZ2VzdWNodC4KKyAgICAgLWggIEVzIHdpcmQga2VpbiByZW1vdmUgdmVyc3VjaHQsIHNvbmRlcm4gc29mb3J0IGRlc3RydWN0IHZlcndlbmRldC4KKyAgICAgICAgIEJpdHRlIG51ciBpbiBBdXNuYWhtZWZhZWxsZW4gdmVyd2VuZGVuLgorICAgICAtaSAgTmljaHQgbnVyIGRpZSBEYXRlaSBzZWxic3Qgd2lyZCB6ZXJzdG9lcnQsIHNvbmRlcm4gYXVjaCBhbGxlIGdlZXJidGVuCisgICAgICAgICBLbGFzc2VuIChzb3dlaXQgc2llIGdlbGFkZW4gc2luZCkuCisgICAgIC1sICBEaWUgRGF0ZWkgd2lyZCBnZWxhZGVuIChhZWhubGljaCB3aWUgYmVpbSBCZWZlaGwgbG9hZCwgYWxsZXJkaW5ncworICAgICAgICAgd2lyZCBkYXMgYWx0ZSBPYmpla3QgemVyc3RvZXJ0LCBmYWxscyBlcyBzY2hvbiBnZWxhZGVuIGlzdCkuCisgICAgIC1tICBNQUtFIC0gd2llIC1pLCBhYmVyIGVzIHdlcmRlbiBudXIgT2JqZWt0ZSB6ZXJzdG9lcnQsIGRpZSBhZWx0ZXIgc2luZAorICAgICAgICAgYWxzIGRpZSBEYXRlaQorICAgICAtciAgV2VubiBlaW4gT2JqZWt0IHplcnN0b2VydCB3dXJkZSwgd2lyZCB2ZXJzdWNodCwgZXMgbmV1IHp1IGxhZGVuLgorICAgICAtcyAgQWxsZSBFcmZvbGdzbWVsZHVuZ2VuIHVudGVyZ2VvcmRuZXRlciBQcm96ZXNzZSB1bnRlcmRydWVja2VuLgorICAgICAtdiAgRGVyIHZvbGxlIEFiaGFlbmdpZ2tlaXRzYmF1bSB3aXJkIGF1c2dlZ2ViZW4gKGltIFp1c2FtbWVuc3BpZWwgbWl0CisgICAgICAgICAtbSkKKworICAgIEVzIGtvZW5uZW4gYXVjaCBPYmpla3RlIGFuZ2VnZWJlbiB3ZXJkZW4sIGRpZSBuaWNodCBhbHMgRGF0ZWkgZXhpc3RpZXJlbiwKKyAgICBkLmguIG1hbiBrYW5uIGF1Y2ggSW5zdGFuemVuIG1pdCBkZW0gIyBpbSBOYW1lbiB6ZXJzdG9lcmVuLiBBdXNzZXJkZW0KKyAgICBrb2VubmVuIG51ciBPYmpla3RlLCBkaWUgbWFuIHNlbGJzdCBzY2hyZWliZW4gZGFyZiwgemVyc3RvZXJ0L2dlbGFkZW4KKyAgICB3ZXJkZW4uCisKKyAgICBgdXBkJyBtZXJrdCBzaWNoIGRhcyB6dWxldHp0IGdlbGFkZW5lIG9kZXIgZ2VjbG9udGUgT2JqZWt0ISBEaWVzIHdpcmt0CisgICAgc2ljaCB2b3IgYWxsZW0gZGFubiBhdXMsIHdlbm4gbWFuIGVpbiBPYmpla3QgenVtIHRlc3RlbiBpbW1lciB3aWVkZXIKKyAgICB6ZXJzdG9lcmVuLCB1cGRhdGVuLCBsYWRlbiB1bmQgY2xvbmVuIG11c3MuIERpZXNlIFJlaWhlIHZvbiBLb21tYW5kb3Mgd2lyZAorICAgIGR1cmNoIGB1cGQgLW1yJyBvaG5lIEFyZ3VtZW50IGF1ZiBkYXMgenVsZXR6dCBnZWxhZGVuZSBvZGVyIGdlbG9udGUgT2JqZWt0CisgICAgdm9sbHpvZ2VuLgorCisgQkVJU1BJRUxFOgorCisgICAgPiB1cGQgKi5jCisgICAgPiB1cGQgLXIgKgorICAgID4gdXBkIC1tdiB0ZXN0LmMKKyAgICA+IHVwZCAtciB0ZXN0IzEyMzQ1CisgICAgPiB1cGQgLWFyIC9kL2luc2Vsbi9tYW5kcmFnb24vbWVsb3Jhbi9vYmovYWxsZS9tZWxvcmFuX29iagorCisgU0lFSEUgQVVDSDoKKyAgICBkZXN0cnVjdCwgbG9hZAorICAgIENvbmZpZ3VyZSgpCisKKyBMRVRaVEUgQUVOREVSVU5HOgorICAgIFR1ZSwgT2N0IDEwIDE4OjUwOjAwIDIwMDAgdm9uIE1hbmRyYWdvbgpkaWZmIC0tZ2l0IGEvZG9jL21jbWQvdmVyZm9sZ2UgYi9kb2MvbWNtZC92ZXJmb2xnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2ZmNDhjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21jbWQvdmVyZm9sZ2UKQEAgLTAsMCArMSw0MCBAQAorCit2ZXJmb2xnZQorLS0tLS0tLS0KKworIE1BR0lFUktPTU1BTkRPOgorICAgIHZlcmZvbGdlIFs8bmFtZT5dCisKKyBBUkdVTUVOVEU6CisKKyAgICA8bmFtZT4gKG9wdGlvbmFsKQorICAgICAgIE5hbWUgZWluZXMgZWluZ2Vsb2dndGVuIFNwaWVsZXJzIG9kZXIgZWluZXMgTlBDcy4gRGVyIGFuZ2VnZWJlbmUKKyAgICAgICBOYW1lIG11c3MgZWluZGV1dGlnIHNlaW4sIGplZG9jaCByZWljaGVuIGRpZSBBbmZhbmdzYnVjaHN0YWJlbiBhdXMuCisgICAgICAgV2VubiBkYXMgZGVyIEZhbGwgaXN0LCB3aXJkIHp1ZXJzdCBuYWNoIGVpbmVtIFNwaWVsZXIgZGllc2VzIE5hbWVucworICAgICAgIGdlc3VjaHQsIGRhbmFjaCBuYWNoIGVpbmVtIE5QQyBpbSBzZWxiZW4gUmF1bSB3aWUgZGVyIE1hZ2llciwgCisgICAgICAgYW5zY2hsaWVzc2VuZCBuYWNoIGVpbmVtIE5QQyBpcmdlbmR3byBzb25zdCBpbSBNdWQuIEZhbGxzIHNpY2ggZGFzIAorICAgICAgIFppZWxvYmpla3QgbmljaHQgaW0gc2VsYmVuIFJhdW0gd2llIGRlciBNYWdpZXIgYmVmaW5kZXQsIHdpcmQgZXIKKyAgICAgICBoaW5iZXdlZ3QuCisKKyAgICAgICBEZXIgTWFnaWVyIGthbm4gc2ljaCBuaWNodCBzZWxic3QgdmVyZm9sZ2VuLgorCisgICAgICAgRXMgd2VyZGVuIG51ciBMZWJld2VzZW4gZ2VmdW5kZW4sIGRpZSBlaW4gRW52aXJvbm1lbnQgaGFiZW4sIGRlbm4KKyAgICAgICBudXIgZGllc2Uga29lbm5lbiBzaW5udm9sbCB2ZXJmb2xndCB3ZXJkZW4uCisKKyBCRVNDSFJFSUJVTkc6CisgICAgRHUgdmVyZm9sZ3N0IGRlbiBTcGllbGVyIG9kZXIgZGVuIE5QQyA8bmFtZT4gZHVyY2ggZGFzIGdhbnplIE1VRC4KKworICAgICd2ZXJmb2xnZScgb2huZSBQYXJhbWV0ZXIgYnJpY2h0IGVpbmUgYWt0aXZlIFZlcmZvbGd1bmcgYWIuCisKKyBCRUlTUElFTDoKKyAgICAndmVyZm9sZ2UgaHVtJyBiZWdpbm50IGRpZSBWZXJmb2xndW5nIGVpbmVyIEh1bW1lbC4gV2VubiBqZWRvY2ggSHVtbmkKKyAgICBlaW5nZWxvZ2d0IHNlaW4gc29sbHRlLCBpc3QgZGllIEVpbmdhYmUgbmljaHQgZWluZGV1dGlnIHVuZCBlcyB3aXJkCisgICAgZWluZSBGZWhsZXJtZWxkdW5nIGF1c2dlZ2ViZW4uIEluIGRpZXNlbSBGYWxsIGtvZW5udGUgbWFuIGRpZSBBbmdhYmUgCisgICAgZHVyY2ggSGluenVmdWVnZW4gZWluZXMgWmVpY2hlbnMgcHJhZXppc2llcmVuLCBiZWlzcGllbHN3ZWlzZSAKKyAgICAndmVyZm9sZ2UgaHVtbScuCisKKyBTSUVIRSBBVUNIOgorICAgIGdvdG8sIHNub29wCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFRodSwgMjEuMDQuMjAxNiB2b24gQXJhdGhvcm4KZGlmZiAtLWdpdCBhL2RvYy9tY21kL3ZpcyBiL2RvYy9tY21kL3ZpcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWYzYjkyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21jbWQvdmlzCkBAIC0wLDAgKzEsMTkgQEAKKwordmlzCistLS0KKworIE1BR0lFUktPTU1BTkRPOgorICAgIHZpcyBbZV0KKworIEFSR1VNRU5URToKKyAgICBXaXJkIGRlciBQYXJhbWF0ZXIgtGVgIGFuZ2VnZWJlbiwgZXJoYWx0ZW4gZGllIE1pdHNwaWVsZXIgZGllCisgICAgRXJ3YXJ0ZW1lbGR1bmdlbiB3aWUgYmVpbSBFaW5sb2dnZW4uCisKKyBCRVNDSFJFSUJVTkc6CisgICAgRmFsbHMgRHUgdW5zaWNodGJhciB3YXJzdCwgd2lyc3QgRHUgbnVuIHdpZWRlciBzaWNodGJhci4KKworIFNJRUhFIEFVQ0g6CisgICAgaW52aXMKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgVGh1LCAyNC4wNy4xOTk3LCAwOTowMDowMCB2b24gV2FyZ29uCmRpZmYgLS1naXQgYS9kb2MvbWNtZC96YXAgYi9kb2MvbWNtZC96YXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBiZjUxNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tY21kL3phcApAQCAtMCwwICsxLDI1IEBACisKK3phcAorLS0tCisKKyBNQUdJRVJLT01NQU5ETzoKKyAgICB6YXAgPG5hbWU+CisKKyBBUkdVTUVOVEU6CisKKyAgICAgPG5hbWU+CisgICAgICAgIE5hbWUgZWluZXMgTGViZXdlc2VucworCisgQkVTQ0hSRUlCVU5HOgorICAgIERhcyBMZWJld2VzZW4gPG5hbWU+IHdpcmQgbWl0IGVpbmVtIFNjaGxhZyBnZXRvZXRldC4gRGFiZWkgd2VyZGVuIGRpZQorICAgIE1lbGR1bmdlbiBhdXMgZGVyIFByb3BlcnR5IFBfWkFQX01TRyBhdXNnZWdlYmVuLgorCisgICAgU3BpZWxlciBkdWVyZmVuIG1pdCBkaWVzZW0gQmVmZWhsIG5pY2h0IGJlZWluZmx1c3N0IHdlcmRlbiEKKworICAgIE1hZ2llci1MZWhybGluZ2VuIHN0ZWh0IGRpZXNlciBCZWZlaGwgbm9jaCBuaWNodCB6dXIgVmVyZnVlZ3VuZy4KKworIFNJRUhFIEFVQ0g6CisgICAgdmVydHJhZywgdG9ldGUKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgVHVlLCAwMi4wOS4xOTk3LCAxNjo1NToyMCB2b24gV2FyZ29uCmRpZmYgLS1naXQgYS9kb2MvbWNtZC96d2luZ2UgYi9kb2MvbWNtZC96d2luZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY1N2Y3MwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tY21kL3p3aW5nZQpAQCAtMCwwICsxLDI3IEBACisKK3p3aW5nZQorLS0tLS0tCisKKyBNQUdJRVJLT01NQU5ETzoKKyAgICB6d2luZ2UgPG5hbWU+IFt6dV0gPGtvbW1hbmRvPgorCisgQVJHVU1FTlRFOgorCisgICAgIDxuYW1lPgorICAgICAgICBOYW1lIGVpbmVzIExlYmV3ZXNlbnMKKyAgICAgPGtvbW1hbmRvPgorICAgICAgICBEaWUgYXV6dWZ1ZWhyZW5kZSBBa3Rpb24KKworIEJFU0NIUkVJQlVORzoKKyAgICBEYXMgYW5nZWdlYmVuZSBMZWJld2VzZW4gd2lyZCBkYXp1IGdlend1bmdlbiwgZGllIGFuZ2VnZWJlbmUgQWt0aW9uCisgICAgYXVzenVmdWVocmVuLiBBbGxlcmRpbmdzIGJlaGVycnNjaGVuIGluc2Jlc29uZGVyZSBOUENzIG5pY2h0IGFsbGUgQmVmZWhsZS4KKworICAgIFNwaWVsZXIgZHVlcmZlbiBtaXQgZGllc2VtIEJlZmVobCBuaWNodCBiZWVpbmZsdXNzdCB3ZXJkZW4hCisKKyAgICBNYWdpZXItTGVocmxpbmdlbiBzdGVodCBkaWVzZXIgQmVmZWhsIG5vY2ggbmljaHQgenVyIFZlcmZ1ZWd1bmcuCisKKyBTSUVIRSBBVUNIOgorICAgIHZlcnRyYWcKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgVHVlLCAwMi4wOS4xOTk3LCAxNjo1NToyNCB2b24gV2FyZ29uCmRpZmYgLS1naXQgYS9kb2MvbWlzc2luZyBiL2RvYy9taXNzaW5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNjVhOTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWlzc2luZwpAQCAtMCwwICsxLDggQEAKK0ZlaGxlbmRlIE1hbnBhZ2VzLCBkaWUgbWFsIGdlc2NocmllYmVuIHdlcmRlbiBtdWVzc3RlbjoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisqIFBfTUFHSUNfUkVTSVNUQU5DRV9PRkZTRVQKKyogUF9ERUZVRUxfTElNSVRfRk9PRCwgUF9ERUZVRUxfTElNSVRfRFJJTksKKyogUF9ERUZVRUxfVElNRV9GT09ELCBQX0RFRlVFTF9USU1FX0RSSU5LCisqIFBfREVGVUVMX0FNT1VOVF9GT09ELCBQX0RFRlVFTF9BTU9VTlRfRFJJTksKKyogCmRpZmYgLS1naXQgYS9kb2Mvb2JqL2Rvb3JtYXN0ZXIgYi9kb2Mvb2JqL2Rvb3JtYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNkZjk3YgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9vYmovZG9vcm1hc3RlcgpAQCAtMCwwICsxLDI2IEBACitEZXIgZG9vcm1hc3Rlci5jIGRpZW50IGFscyB6ZW50cmFsZSBWZXJ3YWx0dW5nc3N0ZWxsZSBmdWVyIGRpZSBUdWVyZW4gaW0KK01vcmdlbkdyYXVlbi4gSW4gZGVyIFJlZ2VsIGtvbW10IG1hbiBtaXQgZGllc2VtIE9iamVrdCBuaWNodCBpbiBCZXJ1ZWhydW5nLAorZGEgZGllIEtvbW11bmlrYXRpb24gdWViZXIgL3N0ZC9yb29tL2Rvb3JzLmMgbGFldWZ0LgorCitGb2xnZW5kZSBGdW5rdGlvbmVuIHN0ZWhlbiB6dXIgRXJ6ZXVndW5nLCBBYmZyYWdlIHVuZCBNYW5pcHVsYXRpb24gdm9uIFR1ZXJlbgorYmVyZWl0OgorCisgKiBOZXdEb29yKCkKKyAgICAgVHVlciBlaW5iYXVlbi4gV2lyZCBpbSB1ZWJsaWNoZXJ3ZWlzZSBpbSBjcmVhdGUoKSBlaW5lcyBSYXVtcyBiZW51dHp0LgorCisgKiBRdWVyeURvb3JTdGF0dXMoKQorICAgICBTdGF0dXMgZWluZXIgVHVlciBhYmZyYWdlbi4KKworICogU2V0RG9vclN0YXR1cygpCisgICAgIFN0YXR1cyBlaW5lciBUdWVyIHNldHplbi4KKworICogUXVlcnlBbGxEb29ycygpCisgICAgIEdpYnQgZWluIE1hcHBpbmcgbWl0IGFsbGVuIFR1ZXJlbiBpbSBNRyB1bmQgZGVyZW4gWnVzdGFlbmRlbiB6dXJ1ZWNrLgorCisKK1NJRUhFIEFVQ0g6CisgICAgTmV3RG9vcigpLCBRdWVyeURvb3JLZXkoKSwgUXVlcnlEb29yU3RhdHVzKCksIFNldERvb3JTdGF0dXMoKSwKKyAgICAvc3RkL3Jvb20vZG9vcnMuYywgR2V0UGhpb2xlbkluZm9zKCksIFF1ZXJ5QWxsRG9vcnMoKSwgUF9ET09SX0lORk9TCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMZXR6dGUgQWVuZGVydW5nOiBEb24sIDA4LjA1LjIwMTQsIEdhYnlsb24KZGlmZiAtLWdpdCBhL2RvYy9vYnNvbGV0ZS9hZGRfdmVyYiBiL2RvYy9vYnNvbGV0ZS9hZGRfdmVyYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTcxOTMzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL29ic29sZXRlL2FkZF92ZXJiCkBAIC0wLDAgKzEsMjcgQEAKKworICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICogIEFDSFRVTkc6IEVGVU4gRVhJU1RJRVJUIE5JQ0hUIE1FSFIhIE5JQ0hUIFZFUldFTkRFTiEgICoKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitTWU5PUFNJUzoKKyAgICAgICAgdm9pZCBhZGRfdmVyYihzdHJpbmcgc3RyKQorCitERVNDUklQVElPTjoKKyAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjb25uZWN0ZWQgdG8gdGhlIGFkZF9hY3Rpb24oKSBmdW5jdGlvbi4gSXQKKyAgICAgICAgd2lsbCBzZXQgdXAgdGhlIGNvbW1hbmQgc3RyIHRvIHRyaWdnZXIgYSBjYWxsIHRvIHRoZSBmdW5jdGlvbgorCXNldCB1cCBieSB0aGUgcHJldmlvdXMgY2FsbCB0byBhZGRfYWN0aW9uKCkuCisgICAgICAgIAorICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdyBvYnNvbGV0ZSBhcyB0aGUgdmVyYiBjYW4gYmUgZ2l2ZW4gZGlyZWN0bHkKKwl3aXRoIGFkZF9hY3Rpb24oKS4gYWRkX3ZlcmIoKSByZW1haW5zIGZvciBjb21wYXRpYmlsaXR5LgorCisJW21hcmlvbiBTdW4gSmFuIDE5IDE5OTIgRG9uJ3QgdXNlIGl0LiBUaGlzIGZpbGUgaXMgcmV0YWluZWQKKwliZWNhdXNlIG9mIHNvbWV3aGF0IG5vc3RhbGdpYyByZWFzb25zLl0KKworSElTVE9SWQorICBSZW1vdmVkIGluIExETXVkIDMuMyBhbmQgTFAgIjAzLjAyLjFAMTUwIiwKKyAgb2Jzb2xldGVkIGJ5IGFkZF9hY3Rpb24oKS4KKworU0VFIEFMU086CisgICAgICAgIGFkZF9hY3Rpb24oRSksIHF1ZXJ5X3ZlcmIoRSksIGFkZF94dmVyYihFKSwgcmVtb3ZlX2FjdGlvbihFKQorCisyOS4xMC4yMDA2IFplc3N0cmEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2Mvb2Jzb2xldGUvYWRkX3h2ZXJiIGIvZG9jL29ic29sZXRlL2FkZF94dmVyYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzgxZGJiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL29ic29sZXRlL2FkZF94dmVyYgpAQCAtMCwwICsxLDI4IEBACisKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqICBBQ0hUVU5HOiBFRlVOIEVYSVNUSUVSVCBOSUNIVCBNRUhSISBOSUNIVCBWRVJXRU5ERU4hICAqCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworU1lOT1BTSVMKKwl2b2lkIGFkZF94dmVyYihzdHJpbmcgc3RyKQorCitERVNDUklQVElPTgorCVRoaXMgZnVuY3Rpb24gaXMgY29ubmVjdGVkIHRvIHRoZSBhZGRfYWN0aW9uKCkgZnVuY3Rpb24uIEl0CisJd2lsbCBzZXQgdXAgdGhlIGNvbW1hbmQgc3RyIHRvIHRyaWdnZXIgYSBjYWxsIHRvIHRoZSBmdW5jdGlvbgorCXNldCB1cCBieSB0aGUgcHJldmlvdXMgY2FsbCB0byBhZGRfYWN0aW9uKCkuCisJCisJYWRkX3h2ZXJiKCkgZGlmZmVycyBmcm9tIGFkZF92ZXJiKCkgaW4gdGhhdCBvbmx5IGxlYWRpbmcKKwljaGFyYWN0ZXJzIG9mIHRoZSBpbnB1dCBsaW5lIG11c3QgbWF0Y2ggd2l0aCBzdHIuIEl0IGJhc2ljYWxseQorCWlzIHRoZSBzYW1lIGFzIHNldHRpbmcgZmxhZyBpbiBhZGRfYWN0aW9uKCkuCisKKwlbbWFyaW9uIFN1biBKYW4gMTkgMTk5MiBEb24ndCB1c2UgaXQuIFRoaXMgZmlsZSBpcyByZXRhaW5lZAorCWJlY2F1c2Ugb2Ygc29tZXdoYXQgbm9zdGFsZ2ljIHJlYXNvbnMuXQorCitISVNUT1JZCisgIFJlbW92ZWQgaW4gTERNdWQgMy4zIGFuZCBMUCAiMDMuMDIuMUAxNTAiLAorICBvYnNvbGV0ZWQgYnkgYWRkX2FjdGlvbigpLgorCitTRUUgQUxTTworCWFkZF9hY3Rpb24oRSksIHF1ZXJ5X3ZlcmIoRSksIGFkZF92ZXJiKEUpCisKKzI5LjEwLjIwMDYgWmVzc3RyYQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9vYnNvbGV0ZS9hbGxvY2F0ZV9tYXBwaW5nIGIvZG9jL29ic29sZXRlL2FsbG9jYXRlX21hcHBpbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJlMTI1MgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9vYnNvbGV0ZS9hbGxvY2F0ZV9tYXBwaW5nCkBAIC0wLDAgKzEsMzMgQEAKKworICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICogIEFDSFRVTkc6IEVGVU4gRVhJU1RJRVJUIE5JQ0hUIE1FSFIhIE5JQ0hUIFZFUldFTkRFTiEgICoKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitTWU5PUFNJUzoKKwltYXBwaW5nIG1fYWxsb2NhdGUoaW50IHNpemUsIGludCB3aWR0aCkKKworREVTQ1JJUFRJT046CisJUmVzZXJ2ZSBtZW1vcnkgZm9yIGEgbWFwcGluZy4KKworCXNpemUgaXMgdGhlIG51bWJlciBvZiBlbnRyaWVzIChpLmUuIGtleXMpIHRvIHJlc2VydmUsIHdpZHRoIGlzCisJdGhlIG51bWJlciBvZiBkYXRhIGl0ZW1zIHBlciBlbnRyeS4gSWYgdGhlIG9wdGlvbmFsIHdpZHRoIGlzCisJb21pdHRlZCwgMSBpcyB1c2VkIGFzIGRlZmF1bHQuCisKKwlUaGlzIGlzIHVzZWZ1bCBvbmx5IHdoZW4geW91IGFyZSBnb2luZyB0byBjb25zdHJ1Y3QgYSBtYXBwaW5nCisJd2hvc2UgYXBwcm94aW1hdGUgc2l6ZSB5b3Uga25vdyBiZWZvcmVoYW5kLCB0byBzYXZlIG9uIG1hbGxvYworCW92ZXJoZWFkLiBJZiB5b3UgZG9uJ3QgZmlsbCBpbiBkYXRhIGZvciBhbGwgdGhlIGFsbG9jYXRlZAorCWVsZW1lbnRzLCBhbnkgbGVmdG92ZXJzIHdpbGwgYmUgZnJlZWQgYWZ0ZXIgdGhlIGN1cnJlbnQKKwlmdW5jdGlvbiBleGVjdXRpb24gZW5kZWQuIEl0IGlzIGFsc28gdXNlZnVsIGlmIHlvdSB3YW50IHRoZQorCW1hcHBpbmcgdG8gaGF2ZSBhIGNlcnRhaW4gd2lkdGggZXZlbiBpZiB5b3UgZG9uJ3QgcHJvdmlkZQorCWFsbCB0aGUgZGF0YSBpdGVtcyBmb3IgdGhlIGtleXMgeWV0LgorCitISVNUT1JZCisgIFJlbmFtZWQgdG8gJ21fYWxsb2NhdGUoKScgaW4gTERNdWQgMy4yLjYgYW5kIExQICIwMy4wMi4xQDE1MCIuCisgIFNpbmNlIExETXVkIDMuMi45LCBub3QgYXZhaWxhYmxlIGlmIGRyaXZlciBpcyBjb21waWxlZCB3aXRob3V0CisgICAgVVNFX0RFUFJFQ0FURUQuCisgIFJlbW92ZWQgaW4gTERNdWQgMy4zIGFuZCBMUCAiMDMuMDIuMUAxNTAiCisKK1NFRSBBTFNPOgorCW1hcHBpbmdzKExQQyksIHdhbGtfbWFwcGluZyhFKSwgZ2V0X3R5cGVfaW5mbyhFKQorCisyOS4xMC4yMDA2IFplc3N0cmEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2Mvb2Jzb2xldGUvYXNzb2MgYi9kb2Mvb2Jzb2xldGUvYXNzb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ1YTk0NQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9vYnNvbGV0ZS9hc3NvYwpAQCAtMCwwICsxLDMxIEBACitPUFRJT05BTCwgVkVSQUxURVQKK1NZTk9QU0lTCisgICAgICAgIGludCAgIGFzc29jKG1peGVkIGtleSwgbWl4ZWQgKmtleXMpOworICAgICAgICBtaXhlZCBhc3NvYyhtaXhlZCBrZXksIG1peGVkICphbGlzdCBbLCBtaXhlZCBmYWlsXSk7CisgICAgICAgIG1peGVkIGFzc29jKG1peGVkIGtleSwgbWl4ZWQgKmtleXMsIG1peGVkICpkYXRhIFssIG1peGVkIGZhaWxdKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIEFsbGUgZHJlaSBBdWZydWZlIHN1Y2hlbiBuYWNoIGVpbmVtIDxrZXk+IGluIGVpbmVtIDxhbGlzdD4gKGVpbmVtCisgICAgICAgIEFycmF5IHZvbiB6d2VpIEFycmF5cyBnbGVpY2hlciBHcm9lc3NlKSBvZGVyIGluIGVpbmVtIGdlb3JkbmV0ZW4KKyAgICAgICAgQXJyYXkgPGtleXM+LiBEZXIgVmVyc3VjaCwgaW4gZWluZW0gYW5kZXJlbiBLb25zdHJ1a3QgenUgc3VjaGVuLAorICAgICAgICBmdWVocnQgenUgZWluZW0gdW52b3JoZXJzZWhiYXJlbiBFcmdlYm5pcy4KKworICAgICAgICBLb21wbGV4aXRhZXQ6IE8oIGxnKG4pICksIHdvYmVpIDxuPiBkaWUgQW56YWhsIEtleXMgaXN0LgorCisgICAgICAgIDEuICBGb3JtOiBLZXktU3VjaGUKKyAgICAgICAgICAgIDxrZXk+IHdpcmQgaW0gQXJyYXkgPGtleXM+IGdlc3VjaHQuIERhcyBSZXN1bHRhdCBpc3QgZGVyIEluZGV4LAorICAgICAgICAgICAgaW4gZGVtIDxrZXk+IGdlZnVuZGVuIHd1cmRlLiBXaXJkIDxrZXk+IG5pY2h0IGdlZnVuZGVuLCBsaWVmZXJ0CisgICAgICAgICAgICBhc3NvYygpIC0xLgorCisgICAgICAgIDIuICBGb3JtOiBTdWNoZSBpbiBBbGlzdC4KKyAgICAgICAgICAgIDxrZXk+IHdpcmQgaW4gZGVyIDxhbGlzdD4gZ2VzdWNodCwgZGFzIFJlc3VsdGF0IHNpbmQgZGllIFdlcnRlLAorICAgICAgICAgICAgZGllIHp1IDxrZXk+IGdlaG9lcmVuLCB3ZW5uIDxrZXk+IGdlZnVuZGVuIHdpcmQuIFdlbm4gPGtleT4gbmljaHQKKyAgICAgICAgICAgIGdlZnVuZGVuIHdpcmQsIHdpcmQgMCB6dXJ1ZWNrIGdlbGllZmVydCBvZGVyIDxmYWlsPiwgZmFsbHMKKyAgICAgICAgICAgIGFuZ2VnZWJlbi4KKworICAgICAgICBEYW1pdCBkYXMgU2lubiBtYWNodCwgbXVzcyA8ZGF0YT4gc28gZ2VvcmRuZXQgc2VpbiwgZGFzcyBlcyB6dSA8a2V5PgorICAgICAgICBwYXNzdC4gRGllc2UgRm9ybSBkZXIgU3VjaGUgaXN0IGRlc2hhbGIgdm9yd2llZ2VuZCBmdWVyCisgICAgICAgIG11bHRpZGltZW5zaW9uYWxlIEFsaXN0cyBnZWVpZ25ldC4KKworU0lFSEUgQVVDSAorICAgICAgICBhbGlzdHMoTFBDKSwgaW5zZXJ0X2FsaXN0KEUpLCBvcmRlcl9hbGlzdChFKQpkaWZmIC0tZ2l0IGEvZG9jL29ic29sZXRlL2NvcHlfbWFwcGluZyBiL2RvYy9vYnNvbGV0ZS9jb3B5X21hcHBpbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEyNWVhYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9vYnNvbGV0ZS9jb3B5X21hcHBpbmcKQEAgLTAsMCArMSwzNiBAQAorCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiAgQUNIVFVORzogRUZVTiBFWElTVElFUlQgTklDSFQgTUVIUiEgTklDSFQgVkVSV0VOREVOISAgKgorICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK1NZTk9QU0lTOgorCW1hcHBpbmcgY29weShtYXBwaW5nKQorCitERVNDUklQVElPTjoKKyAgICAgICAgQ3JlYXRlIGEgc2hhbGxvdyBjb3B5IG9mIDxhcmc+IGFuZCByZXR1cm4gaXQuIEZvciBhcnJheXMgYW5kIG1hcHBpbmdzCisgICAgICAgIHRoaXMgbWVhbnMgdGhhdCBhIG5ldyBhcnJheSBvciBtYXBwaW5nIGlzIGNyZWF0ZWQgd2l0aCBjb3BpZXMgb2YgdGhlCisgICAgICAgIG9yaWdpbmFsIGNvbnRlbnQuIEVtYmVkZGVkIGFycmF5cyBhbmQgbWFwcGluZ3MgYXJlIGNvcGllZCBieSByZWZlcmVuY2UhCisKK0VYQU1QTEUKKyAgICAgICAgbWl4ZWQgKmEsICpiOworCisgICAgICAgIGEgPSAoeyAxLCAoeyAyMSwgMjIgfSkgfSk7CisgICAgICAgIGIgPSBjb3B5KGEpOworICAgICAgICBhWzBdID0gLTE7IGFbMV1bMF0gPSAtMjE7CisgICAgICAgICAtLT4gYSBpcyBub3cgKHsgLTEsICh7IC0yMSwgMjIgfSkgfSkKKyAgICAgICAgICAgICBiIGlzIG5vdyAoeyAgMSwgKHsgLTIxLCAyMiB9KSB9KQorCitXQVJOSU5HCisJS2VlcCBpbiBtaW5kLCB0aGF0IGEgY29weSBvZiBhIG1hcHBpbmcsIHRoYXQgY29udGFpbnMgYXJyYXlzL21hcHBpbmdzLAorCWNvbnRhaW5zIHJlZmVyZW5jZXMgdG8gdGhlc2UgTWFwcGluZ3MvQXJyYXlzLCBub3QgcmVhbCBjb3BpZXMuIElmIHlvdQorCWRvbid0IHRha2UgY2FyZSwgeW91IGNhbiBhKSBjaGFuZ2UgdGhlIG9yaWdpbmFsIG1hcHBpbmdzIHdoaWxlIHdvcmtpbmcKKwlvbiB0aGUgY29weSBhbmQgYikgY3JlYXRlIHJlY3Vyc2l2ZSBtYXBwaW5ncywgdGhhdCBsZWFrIG1lbW9yeS4KKworSElTVE9SWQorICBTdXBlcnNlZWRlZCBieSB0aGUgY29weSgpIGVmdW4uCisgIFJlbW92ZWQgaW4gTERNdWQgMy4zIGFuZCBMUCAiMDMuMDIuMUAxNTAiLgorCitTRUUgQUxTTzoKKwltYXBwaW5ncyhMUEMpCisKKzI2LiBTZXB0ZW1iZXIgMjAwNiwgWmVzc3RyYQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9vYnNvbGV0ZS9jcmVhdG9yIGIvZG9jL29ic29sZXRlL2NyZWF0b3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRjMzIwZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9vYnNvbGV0ZS9jcmVhdG9yCkBAIC0wLDAgKzEsMjIgQEAKKworICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICogIEFDSFRVTkc6IEVGVU4gRVhJU1RJRVJUIE5JQ0hUIE1FSFIhIE5JQ0hUIFZFUldFTkRFTiEgICoKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitTWU5PUFNJUworICAgICAgICBzdHJpbmcgY3JlYXRvcihvYmplY3Qgb2IpCisKK0RFU0NSSVBUSU9OCisgICAgICAgIFRoaXMgZnVuY3Rpb25zIGlzIG5vdCBhdmFpbGFibGUgaW4gbmF0aXZlIG1vZGUsIHdoaWNoIHVzZXMKKyAgICAgICAgdXNlci1pZHMgaW5zdGVhZC4KKyAgICAgICAgUmV0dXJucyB0aGUgY3JlYXRvciAoaS5lLiB0aGUgbmFtZSBvZiB0aGUgd2l6YXJkIG9yIGRvbWFpbikgb2YKKyAgICAgICAgdGhlIG9iamVjdC4gRGVmYXVsdCBmb3Igb2IgaXMgdGhpc19vYmplY3QoKS4KKworSElTVE9SWQorICAgICAgICBTaW5jZSAzLjIuMUA0NywgdGhpcyBlZnVuIGlzIGFuIGFsaWFzIGZvciBnZXR1aWQoKS4KKworU0VFIEFMU08KKyAgICAgICAgZ2V0dWlkKEUpLCBuYXRpdmUoQyksIHVpZHMoQykKKworWmVzc3RyYSwgMDQuMDIuMjAwNworCmRpZmYgLS1naXQgYS9kb2Mvb2Jzb2xldGUvY3JlYXRvcl9maWxlIGIvZG9jL29ic29sZXRlL2NyZWF0b3JfZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGZlNmVmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL29ic29sZXRlL2NyZWF0b3JfZmlsZQpAQCAtMCwwICsxLDMyIEBACisKKyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqIEFDSFRVTkc6IFdJUkQgVk9NIERSSVZFUiBOSUNIVCBNRUhSIEdFUlVGRU4hIE5JQ0hUIFZFUldFTkRFTiEgKgorICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworU1lOT1BTSVMKKwlzdHJpbmcgY3JlYXRvcl9maWxlKG1peGVkIG9iKQorCitERVNDUklQVElPTgorCVJldHVybiB0aGUgbmFtZSBvZiB0aGUgY3JlYXRvciBvZiBhIG5ld2x5IGNyZWF0ZWQgb2JqZWN0LCBpLmUuCisJdGhlIG5hbWUgb2YgdGhlIHVzZXIgdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgdGhlIExQQyBzb3VyY2UKKwlmaWxlIHRoZSBvYmplY3Qgd2FzIGxvYWRlZCBmcm9tLiBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyAwLAorCXRoZSBvYmplY3QgY2FuJ3QgYmUgbG9hZGVkIGFuZCBpcyBkZXN0cnVjdGVkIGFnYWluCisJaW1tZWRpYXRlbHkuCisKKwlJbiAhY29tcGF0IG1vZGUsIHRoZSByZXR1cm5lZCBzdHJpbmcgc2VydmVzIGFzIHRoZSBpbml0aWFsIHVpZAorCShgYGN1aWQnJykgb2YgdGhlIG9iamVjdC4gT2JqZWN0cyB3aG9zZSBjdWlkIGlzIHRoZQorCWJhY2tib25lLWlkIHdpbGwgdGhlbiBnZXQgdGhlIHVpZCBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSB1c2VyCisJYXMgdGhlaXIgdXNlcmlkIGluc3RlYWQuCisKKwlVbmRlciBjb21wYXQgbW9kZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhcyB3ZWxsLgorCisJSWYgdGhpcyBmdW5jdGlvbiBpcyBub3QgcHJvdmlkZWQgYnkgdGhlIG1hc3RlciBvYmplY3QsIG5vCisJb3RoZXIgb2JqZWN0IGNhbiBiZSBsb2FkZWQuCisKK0hJU1RPUlkKKwlEcm9wcGVkIGluIDMuMi4xLCByZXBsYWNlZCBieSB0aGUgX1VJRCBkcml2ZXIgaG9va3MuCisKK1NFRSBBTFNPCisJdWlkcyhDKSwgY3JlYXRvcihFKQorCisyOS4xMC4yMDA2IFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9vYnNvbGV0ZS9kZWZpbmVfaW5jbHVkZV9kaXJzIGIvZG9jL29ic29sZXRlL2RlZmluZV9pbmNsdWRlX2RpcnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQzNjMwOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9vYnNvbGV0ZS9kZWZpbmVfaW5jbHVkZV9kaXJzCkBAIC0wLDAgKzEsMjQgQEAKKworICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICogQUNIVFVORzogV0lSRCBWT00gRFJJVkVSIE5JQ0hUIE1FSFIgR0VSVUZFTiEgTklDSFQgVkVSV0VOREVOISAqCisgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitTWU5PUFNJUworCXN0cmluZyAqZGVmaW5lX2luY2x1ZGVfZGlycyh2b2lkKQorCitERVNDUklQVElPTgorCVJldHVybiBhbiBhcnJheSBvZiBzdHJpbmcgcGF0dGVybnMgZ2l2aW5nIHRoZSBhYnNvbHV0IHBhdGhzCisJd2hlcmUgdG8gc2VhcmNoIGFuIGluY2x1ZGUgZmlsZS4gVGhlIHBhdHRlcm5zIGhhdmUgdG8gaGF2ZSBhCisJJXMgYXQgdGhlIHBsYWNlIHdoZXJlIHRoZSBuYW1lIGdpdmVuIGluIHRoZSAjaW5jbHVkZSBzdGF0ZW1lbnQKKwloYXMgdG8gYmUgaW5zZXJ0ZWQuCisKK0VYQU1QTEUKKwlkZWZpbmVfaW5jbHVkZV9kaXJzKCkgeyByZXR1cm4gKHsgInN5cy8lcyIsICJsaWIvJXMiIH0pOyB9CisKK0hJU1RPUlkKKwlEcm9wcGVkIGluIDMuMi4xLCByZXBsYWNlZCBieSBIX0lOQ0xVREVfRElSUyBob29rLgorCitTRUUgQUxTTworCW1hc3RlcihNKQorCisyOS4xMC4yMDA2IFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9vYnNvbGV0ZS9lZnVuMzA4IGIvZG9jL29ic29sZXRlL2VmdW4zMDgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWViYjQyZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9vYnNvbGV0ZS9lZnVuMzA4CkBAIC0wLDAgKzEsMjcgQEAKKworICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICogIEFDSFRVTkc6IEVGVU4gRVhJU1RJRVJUIE5JQ0hUIE1FSFIhIE5JQ0hUIFZFUldFTkRFTiEgICoKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitTWU5PUFNJUworCXZvaWQgZWZ1bjMwOChvYmplY3QgaXRlbSwgb2JqZWN0IGVudikKKworREVTQ1JJUFRJT04KKwlUaGUgaXRlbSBpcyBtb3ZlZCBpbnRvIGl0cyBuZXcgZW52aXJvbm1lbnQgZW52LCB3aGljaCBtYXkgYmUgMC4KKwlUaGlzIGVmdW4gaXMgdG8gYmUgdXNlZCBpbiB0aGUgbW92ZV9vYmplY3QoKSBob29rLCBhcyBpdCBkb2VzCisJbm90aGluZyBlbHNlIHRoYW4gbW92aW5nIHRoZSBpdGVtIC0gbm8gY2FsbHMgdG8gaW5pdCgpIG9yIHN1Y2guCisKKwlEb24ndCB1c2UgaXQgaW4geW91ciBvd24gb2JqZWN0cyEKKworSElTVE9SWQorCUludHJvZHVjZWQgaW4gMy4yLjFAMQorICByZW5hbWVkIHRvICdzZXRfZW52aXJvbm1lbnQoKScgaW4gTERNdWQgMy4yLjYgYW5kIExQICIwMy4wMi4xQDE1MCIuCisgIFNpbmNlIExETXVkIDMuMi45LCBub3QgYXZhaWxhYmxlIGlmIGRyaXZlciBpcyBjb21waWxlZCB3aXRob3V0CisgICAgVVNFX0RFUFJFQ0FURUQuCisgIFJlbW92ZWQgaW4gTERNdWQgMy4zIGFuZCBMUCAiMDMuMDIuMUAxNTAiLgorCitTRUUgQUxTTworCXJlbW92ZShBKSwgaW5pdChBKSwgbW92ZV9vYmplY3QoRSksIHRyYW5zZmVyKEUpLCBob29rcyhDKSwKKwluYXRpdmUoQykKKworMjkuMTAuMjAwNiBaZXNzdHJhClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL29ic29sZXRlL2V4Y2x1ZGVfYXJyYXkgYi9kb2Mvb2Jzb2xldGUvZXhjbHVkZV9hcnJheQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDU3ZTAzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL29ic29sZXRlL2V4Y2x1ZGVfYXJyYXkKQEAgLTAsMCArMSwyNyBAQAorCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiAgQUNIVFVORzogRUZVTiBFWElTVElFUlQgTklDSFQgTUVIUiEgTklDSFQgVkVSV0VOREVOISAgKgorICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK1NZTk9QU0lTOgorCW1peGVkICpleGNsdWRlX2FycmF5KG1peGVkICphcnIsIGludCBmcm9tLCBpbnQgdG8pCisKK0RFU0NSSVBUSU9OOgorICBEZWxldGVzIGFuIHNlY3Rpb24gZnJvbSBhbiBhcnJheS4KKworICBQbGVhc2UgdXNlIHRoZSBzbGljaW5nIG9wZXJhdG9yOgorICBhcnIgPSBhcnJbMC4uZnJvbS0xXSthcnJbdG8rMS4uPDFdCisgIG9yIGV2ZW4gYmV0dGVyOgorICBhcnJbZnJvbS4udG9dID0gKHt9KTsKKworICBUaGlzIGVmdW4gaXMgdGVtcG9yYXJpbHkgYSBzaW11bGF0ZWQgZWZ1biB1bnRpbCBpcyBmaW5hbGx5CisgIGRyb3BwcGVkLgorCitISVNUT1JZCisgICAgICAgIFJlbW92ZWQgaW4gTERNdWQgMy4zLgorCitTRUUgQUxTTworICAgICAgICBbXShFKQorCisxNi4xMi4yMDA4IFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL29ic29sZXRlL2V4dHJhY3QgYi9kb2Mvb2Jzb2xldGUvZXh0cmFjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTQwZTAwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL29ic29sZXRlL2V4dHJhY3QKQEAgLTAsMCArMSwyNiBAQAorCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiAgQUNIVFVORzogRUZVTiBFWElTVElFUlQgTklDSFQgTUVIUiEgTklDSFQgVkVSV0VOREVOISAgKgorICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK1NZTk9QU0lTCisgICAgICAgIHN0cmluZyBleHRyYWN0KHN0cmluZyBzdHIsIGludCBmcm9tLCBpbnQgdG8pCisgICAgICAgIHN0cmluZyBleHRyYWN0KHN0cmluZyBzdHIsIGludCBmcm9tKQorCitERVNDUklQVElPTgorCURPIE5PVCBVU0UgVEhJUyBFRlVOIEFOWU1PUkUhIElUIEhBUyBCRUVOIFJFTU9WRUQgRlJPTSBUSEUgRFJJVkVSLgorCisgICAgICAgIEV4dHJhY3QgYSBzdWJzdHJpbmcgZnJvbSBhIHN0cmluZy4KKyAgICAgICAgVGhpcyBpcyB0aGUgb2xkIG5vdGF0aW9uIGZvciBzdHJbZnJvbS4udG9dIGFuZCBzdXBwb3J0ZWQKKyAgICAgICAgb25seSBmb3IgaHlzdGVyaWNhbCByYWlzaW5zLgorICAgICAgICAKKyAgICAgICAgSW4gTERNdWQgdGhpcyBlZnVuIGlzIHRlbXBvcmFyaWx5IGEgc2ltdWxhdGVkIGVmdW4gdW50aWwgaXMgZmluYWxseQorICAgICAgICBkcm9wcHBlZC4KKworSElTVE9SWQorICAgICAgICBSZW1vdmVkIGluIExETXVkIDMuMy4KKworU0VFIEFMU08KKyAgICAgICAgW10oRSkKKworMTEuMTEuMjAwNiBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2Mvb2Jzb2xldGUvZmlsZV9uYW1lIGIvZG9jL29ic29sZXRlL2ZpbGVfbmFtZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWY0MmRjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL29ic29sZXRlL2ZpbGVfbmFtZQpAQCAtMCwwICsxLDM2IEBACisKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqICBBQ0hUVU5HOiBFRlVOIEVYSVNUSUVSVCBOSUNIVCBNRUhSISBOSUNIVCBWRVJXRU5ERU4hICAqCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworU1lOT1BTSVM6CisgIHN0cmluZyBvYmplY3RfbmFtZSgpCisgIHN0cmluZyBvYmplY3RfbmFtZShvYmplY3Qgb2IpCisKK0RFU0NSSVBUSU9OOgorICBHZXQgdGhlIGZpbGUgbmFtZSBvZiBhbiBvYmplY3Qgb3IgaWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4gb2YgdGhlIGN1cnJlbnQKKyAgb2JqZWN0LiBJZiB0aGUgb2JqZWN0IGlzIGEgY2xvbmVkIG9iamVjdCwgdGhlbiBpdCB3aWxsIG5vdCBoYXZlIGEKKyAgY29ycmVzcG9uZGluZyBmaWxlIG5hbWUsIGJ1dCByYXRoZXIgYSBuZXcgbmFtZSBiYXNlZCBvbiB0aGUgb3JpZ2luYWwKKyAgZmlsZSBuYW1lLgorICBUaGUgcmV0dXJuZWQgbmFtZSBhbHdheXMgYmVnaW5zIHdpdGggJy8nIChhYnNvbHV0ZSBwYXRoKSwKKwlleGNlcHQgd2hlbiB0aGUgcGFyc2VyIHJ1bnMgaW4gQ09NUEFUICgtbykgbW9kZS4KKworRVhBTVBMRVM6CisgIGZpbmRfb2JqZWN0KG9iamVjdF9uYW1lKG9iKSkgPT0gb2IKKyAgVGhpcyBpcyBndWFyYW50ZWVkIHRvIGJlIHRydWUgZm9yIGFsbCBvYmplY3RzIG9iIHRoYXQgYXJlIG5vdAorICBkZXN0cnVjdGVkLgorICAKKyAgc2l6ZW9mKGV4cGxvZGUob2JqZWN0X25hbWUob2IpLCAiIyIpKSA9PSAxCisgIFRoaXMgaXMgYWx3YXlzIHRydWUgaWYgb2IgaXMgYSBibHVlIHByaW50LgorCitISVNUT1JZCisgIEluIExETXVkIDMuMi42IHJlbmFtZWQgdG8gb2JqZWN0X25hbWUoKSwgdGhpcyBvbGQgbmFtZSBpcworICBhdmFpbGFibGUgYXMgYWxpYXMuCisgIFNpbmNlIExETXVkIDMuMi45LCBub3QgYXZhaWxhYmxlIGlmIGRyaXZlciBpcyBjb21waWxlZCB3aXRob3V0CisgIFVTRV9ERVBSRUNBVEVELgorICBSZW1vdmVkIGluIExETXVkIDMuMyBhbmQgTFAgIjAzLjAyLjFAMTUwIi4KKworU0VFIEFMU086CisgICBmaW5kX29iamVjdChFKQorCisyOS4xMC4yMDA2IFplc3N0cmEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2Mvb2Jzb2xldGUvZmlsdGVyX2FycmF5IGIvZG9jL29ic29sZXRlL2ZpbHRlcl9hcnJheQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzJjYjAzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL29ic29sZXRlL2ZpbHRlcl9hcnJheQpAQCAtMCwwICsxLDE1MSBAQAorCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiAgQUNIVFVORzogRUZVTiBFWElTVElFUlQgTklDSFQgTUVIUiEgTklDSFQgVkVSV0VOREVOISAgKgorICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK2ZpbHRlcl9hcnJheShFKQorCitGVU5LVElPTjoKKyAgICAgbWl4ZWQgKmZpbHRlcl9hcnJheShtaXhlZCAqYXJyLCBzdHJpbmcgZnVuLCBzdHJpbmd8b2JqZWN0IG9iCisgICAgICAgICAgICAgICAgICAgICAgICAgWywgbWl4ZWQgZXh0cmEsIC4uLl0pCisgICAgIG1peGVkICpmaWx0ZXJfYXJyYXkobWl4ZWQgKmFyciwgY2xvc3VyZSBjbCBbLCBtaXhlZCBleHRyYSwgLi4uXSkKKyAgICAgbWl4ZWQgKmZpbHRlcl9hcnJheShtaXhlZCAqYXJyLCBtYXBwaW5nIG1hcCkKKworUEFSQU1FVEVSOgorICAgICBhcnIJLSB6dSBmaWx0ZXJuZGVzIEFycmF5CisgICAgIGZ1bi9jbAktIHp1IHJ1ZmVuZGUgTWV0aG9kZS9DbG9zdXJlCisgICAgIG1hcAktIGZpbHRlcm5kZXMgTWFwcGluZworICAgICBvYgkJLSBPYmpla3QvRGF0ZWluYW1lLCBhbiBkZW0gTWV0aG9kZSBnZXJ1ZmVuIHdlcmRlbiBzb2xsCisgICAgIGV4dHJhCS0gd2VpdGVyZSBQYXJhbWV0ZXIgZnVlciBNZXRob2RlL0Nsb3N1cmUKKworQkVTQ0hSRUlCVU5HOgorICAgICBGaWx0ZXJ0IGRpZSBFbGVtZW50ZSBhdXMgJ2FycicgZHVyY2ggZGllIE1ldGhvZGUgJ2Z1bicsIGRpZSBDbG9zdXJlICdjbCcKKyAgICAgb2RlciBkYXMgTWFwcGluZyAnbWFwJyBpbiBlaW4gbmV1ZXMgQXJyYXkuCisgICAgIEZ1ZXIgamVkZXMgRWxlbWVudCBhdXMgJ2Fycicgd2lyZCAnZnVuJyBvZGVyICdjbCcgbWl0IGRlbSBFbGVtZW50IGFscworICAgICBlcnN0ZW0gUGFyYW1ldGVyIFt1bmQgZm9sZ2VuZCBkZW4gb3B0aW9uYWxlbiBFeHRyYS1QYXJhbWV0ZXJuXSBnZXJ1ZmVuCisgICAgIGJ6dy4gJ21hcCcgbWl0IGRlbSBFbGVtZW50IGluZGl6aWVydC4KKworICAgICBXZW5uIGRlciBBdWZydWYKKwlvYi0+ZnVuKGVsZW1lbnQgWywgZXh0cmExLCBleHRyYTIsIC4uLl0pIGJ6dy4KKwlmdW5jYWxsKGNsLCBlbGVtZW50IFssIGV4dHJhMSwgZXh0cmEyLCAuLi5dKQorICAgICBhbHMgUnVlY2tnYWJld2VydCAhPTAgenVydWVja2dpYnQgb2RlciBkYXMgRWxlbWVudCBhbHMgU2NobHVlc3NlbCBpbQorICAgICBNYXBwaW5nIGVudGhhbHRlbiBpc3Q6CisJbWVtYmVyKG1hcCwgZWxlbWVudCkgPT0gMQorICAgICBkYW5uIHdpcmQgZGFzIEVsZW1lbnQgaW4gZGFzIG5ldWUgQXJyYXkgYXVmZ2Vub21tZW4sIHNvbnN0IG5pY2h0LgorCisKKyAgICAgVmVyd2VuZHVuZyB2b24gTWV0aG9kZW46CisJV2VubiBiZWkgZGVyIEFuZ2FiZSB2b24gJ2Z1bicga2VpbiBPYmpla3QgJ29iJyBpbiBGb3JtIGVpbmVzIFN0cmluZ3MKKwlvZGVyIE9iamVrdHMgYW5nZWdlYmVuIHdpcmQsIHdpcmQgdGhpc19vYmplY3QoKSBhbmdlbm9tbWVuLgorCisgICAgIFZlcndlbmR1bmcgdm9uIENsb3N1cmVzOgorCUVzIGtvZW5uZW4gc293b2hsIExmdW4tQ2xvc3VyZXMgYWxzIGF1Y2ggTGFtYmRhLUNsb3N1cmVzIHZlcndlbmRldAorCXdlcmRlbi4gTGZ1bi1DbG9zdXJlcyBrb2VubmVuLCB3ZW5uIGltIHNlbGJlbiBPYmpla3Qgdm9yaGFuZGVuIGF1Y2gKKwkncHJpdmF0ZScgb2Rlci91bmQgJ3N0YXRpYycgZGVrbGFyaWVydCBzZWluLCBtdWVzc2VuIGFiZXIgenUgZGVtCisJWmVpdHB1bmt0IGRlciBWZXJ3ZW5kdW5nIGJla2FubnQgc2VpbiAoRnVua3Rpb25zcHJvdG90eXBlbiBiZW51dHplbikuCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIEdlZmlsdGVydGVzIEFycmF5IG1pdCBGaWx0ZXJiZWRpbmd1bmcgZXJmdWVsbGVuZGVuIEVsZW1lbnRlbi4KKworQkVNRVJLVU5HRU46CisgICAgICgxKSBBY2h0dW5nLCBkaWUgRWxlbWVudGUgaW4gJ2Fycicgd2VyZGVuIG5pY2h0IHRpZWYga29waWVydCwgc2luZCBzaWUKKyAgICAgYWxzbyBzZWxic3QgQXJyYXlzIG9kZXIgTWFwcGluZ3MsIHNvIGZ1ZWhydCBlaW5lIHNwYWV0ZXJlIEFlbmRlcnVuZyBpbQorICAgICBSdWVja2dhYmUtQXJyYXlzIHp1ciBBZW5kZXJ1bmcgaW0gVXJzcHJ1bmdzYXJyYXk6CisKKyAgICAgaW50ICppLCAqajsKKyAgICAgaT0oeyh7MSwyLDN9KSwoezQsNSw2fSl9KTsKKyAgICAgaj1maWx0ZXJfYXJyYXkoaSwgIydzaXplb2YpOwkvLyBmaWx0ZXJ0IGxlZXJlIEFycmF5cyBoZXJhdXMKKyAgICAgalswXVswXT04OworCisgICAgIGZ1ZWhydCB6dTogaT09aj09KHsoezgsMiwzfSksKHs0LDUsNn0pfSk7CisKKyAgICAgKDIpIERhcyBLb3BpZXJlbiBpbiBkYXMgUnVlY2tnYWJlbWFwcGluZyBlcmZvbGd0IGZ1ZXIgamVkZXMgRWxlbWVudCBuYWNoCisgICAgIEF1c2Z1ZWhydW5nIGRlciBGaWx0ZXJtZXRob2RlLiBBZW5kZXJ1bmdlbiBkZXIgV2VydGUgaW0gQXJyYXkgaW4gZGllc2VyCisgICAgIE1ldGhvZGUgKGdsb2JhbGUgVmFyaWFibGUvVWViZXJnYWJlIGFscyBSZWZlcmVueiBhbiBmaWx0ZXJfYXJyYXkpCisgICAgIHNjaGxhZ2VuIHNpY2ggYWxzbyBpbSBSdWVja2dhYmVhcnJheSBuaWVkZXIuCisKK0JFSVNQSUVMOgorICAgICAjIyMgRmlsdGVyZSBhbGxlIExlYmV3ZXNlbiBpbiBlaW5lbSBSYXVtIGluIGVpbiBBcnJheSAjIyMKKyAgICAgZmlsdGVyX2FycmF5KGFsbF9pbnZlbnRvcnkodGhpc19vYmplY3QoKSksIydsaXZpbmcpOworCisKKyAgICAgIyMjIEZpbHRlcmUgYWxsZSB0YXViZW4gU3BpZWxlciBpbSBSYXVtIGluIGVpbiBBcnJheSAjIyMKKyAgICAgc3RhdGljIGludCBmaWx0ZXJfaXNkZWFmKG9iamVjdCB3aG8pIHsKKyAgICAgICByZXR1cm4obGl2aW5nKHdobykgJiYgd2hvLT5RdWVyeVByb3AoUF9ERUFGKSk7CisgICAgIH0KKyAgICAgLi4uCisgICAgIGZpbHRlcl9hcnJheShhbGxfaW52ZW50b3J5KHRoaXNfb2JqZWN0KCkpLCAjJ2ZpbHRlcl9pc2RlYWYpOworCisKKyAgICAgIyMjIEZpbHRlcm4gdm9uIElkbGVybiAoPj0xIFNla3VuZGUgaWRsZSkgIyMjCisgICAgIC8vIEZvbGdlbmQgaWRlbnRpc2NoZSBSZXN1bHRhdGUsIGFiZXIgYW5kZXJlIEFuc2FldHplOgorCisgICAgICMxOiBudXR6dCBkaWUgRWZ1biBxdWVyeV9pZGxlKCkgYWxzIExmdW4tQ2xvc3VyZSAoaWRlYWwgaGllcikKKyAgICAgaWRsZV91c3IgPSBmaWx0ZXJfYXJyYXkodXNlcnMoKSwgIydxdWVyeV9pZGxlICk7CisKKyAgICAgIzIsMzogbWl0IEZpbHRlcm1ldGhvZGUKKyAgICAgaW50IGNoZWNrX2lmX2lkbGUob2JqZWN0IHVzZXIpIHsKKyAgICAgIHJldHVybiBxdWVyeV9pZGxlKHVzZXIpOworICAgICB9CisgICAgICAjMjogZmlsdGVydCBtaXR0ZWxzIGRlciBMZnVuIGltIHNlbGJlbiBPYmpla3QgZGllIElkbGVyIGluIGRhcworICAgICAgICAgIFJ1ZWNrZ2FiZWFycmF5cworICAgICAgaWRsZV91c3IgPSBmaWx0ZXJfYXJyYXkodXNlcnMoKSwgImNoZWNrX2lmX2lkbGUiKTsKKyAgICAgIGlkbGVfdXNyID0gZmlsdGVyX2FycmF5KHVzZXJzKCksICJjaGVja19pZl9pZGxlIiwgdGhpc19vYmplY3QoKSk7CisKKyAgICAgICMzOiBydWZ0IGRpZSBMZnVuIGNoZWNrX2lmX2lkbGUoKSBhbHMgTGZ1bi1DbG9zdXJlIChGdW5rdGlvbnNwb2ludGVyKQorICAgICAgaWRsZV91c3IgPSBmaWx0ZXJfYXJyYXkodXNlcnMoKSwgIydjaGVja19pZl9pZGxlICk7CisKKyAgICAgIzQ6IG51dHp0IGVpbmUgTGFtYmRhLUNsb3N1cmUgKGxhbmdzYW1lciwgbmljaHQgZnVlciBhbGxlIGxlc2VybGljaCkKKyAgICAgaWRsZV91c3IgPSBmaWx0ZXJfYXJyYXkodXNlcnMoKSwgbGFtYmRhKCh7J3V9KSwgKHsjJ3F1ZXJ5X2lkbGUsICd1fSkpKTsKKworCisgICAgICMjIyBGaWx0ZXJuIHZvbiBJZGxlcm4gKD49MjAgU2VrdW5kZW4gaWRsZSkgbWl0IEV4dHJhcGFyYW1ldGVyICMjIworICAgICAvLyBGb2xnZW5kIGlkZW50aXNjaGUgUmVzdWx0YXRlLCBhYmVyIGFuZGVyZSBBbnNhZXR6ZToKKworICAgICAjMTogZGllIEVmdW4ga29lbm5lbiB3aXIgbmljaHQgbWVociBkaXJla3QgbnV0emVuLCB3ZWlsIHNpZQorICAgICAgICAgZGllc2VuIFBhcmFtZXRlciBuaWNodCB1bnRlcnN0dWV0enQKKyAgICAgLy8gaWRsZV91c3IgPSBmaWx0ZXJfYXJyYXkodXNlcnMoKSwgIydxdWVyeV9pZGxlICk7CisKKyAgICAgIzIsMzogbWl0IEZpbHRlcm1ldGhvZGUgLi4uIG1pdCBuZXVlbSBQYXJhbWV0ZXIKKyAgICAgaW50IGNoZWNrX2lmX2lkbGUob2JqZWN0IHVzZXIsIGludCBsZW5ndGgpIHsKKyAgICAgIHJldHVybiBxdWVyeV9pZGxlKHVzZXIpPmxlbmd0aDsKKyAgICAgfQorICAgICAgIzI6IGZpbHRlcnQgbWl0dGVscyBkZXIgTGZ1biBpbSBzZWxiZW4gT2JqZWt0IGRpZSBJZGxlciBpbiBkYXMKKyAgICAgICAgICBSdWVja2dhYmVhcnJheXMgLi4uIG1pdCBkcml0dGVtIFBhcmFtZXRlciEKKyAgICAgIGlkbGVfdXNyID0gZmlsdGVyX2FycmF5KHVzZXJzKCksICJjaGVja19pZl9pZGxlIiwgdGhpc19vYmplY3QoKSwgMjApOworCisgICAgICAjMzogcnVmdCBkaWUgTGZ1biBjaGVja19pZl9pZGxlKCkgYWxzIExmdW4tQ2xvc3VyZSAoRnVua3Rpb25zcG9pbnRlcikKKyAgICAgIGlkbGVfdXNyID0gZmlsdGVyX2FycmF5KHVzZXJzKCksICMnY2hlY2tfaWZfaWRsZSwgMjApOworCisgICAgICM0OiBudXR6dCBlaW5lIExhbWJkYS1DbG9zdXJlIChsYW5nc2FtZXIsIG5pY2h0IGZ1ZXIgYWxsZSBsZXNlcmxpY2gpCisgICAgIGlkbGVfdXNyID0KKyAgICAgICBmaWx0ZXJfYXJyYXkodXNlcnMoKSwKKyAgICAgICAgIGxhbWJkYSgoeyd1LCAnbH0pLCAoeyMnPiwoeyMncXVlcnlfaWRsZSwgJ3V9KSwnbH0pKSwKKyAgICAgICAgIDIwKTsKKworQWVRVUlWQUxFTlpDT0RFIChuaWNodCBlbXBmb2hsZW4sIG51ciB6dW0gVmVyc3RhZW5kbmlzISk6CisgICAgIGludCBpOworICAgICBtaXhlZCAqcmV0OyBtaXhlZCAqaW5wdXQ7CisKKyAgICAgcmV0PWFsbG9jYXRlKDApOworICAgICBpPXNpemVvZihpbnB1dCk7CisgICAgIHdoaWxlKGktLSkKKyAgICAgICBpZihvYi0+ZnVuKGlucHV0W2ldIFssIGV4dHJhMSwgZXh0cmEyLCAuLi5dKSkKKyAgICAgICAvLyBpZihmdW5jYWxsKGNsLCBpbnB1dFtpXSBbLCBleHRyYTEsIGV4dHJhMiwgLi4uXSkpCisgICAgICAgLy8gaWYobWVtYmVyKG1hcCwgaW5wdXRbaV0pKQorICAgICAgICAgcmV0Kz0oe2lucHV0W2ldfSk7CitISVNUT1JZCisgICAgU2luY2UgTERNdWQgMy4yLjYgb2Jzb2xldGVkIGJ5IGVmdW4gZmlsdGVyKCkuCisgICAgU2luY2UgTERNdWQgMy4yLjksIG5vdCBhdmFpbGFibGUgaWYgZHJpdmVyIGlzIGNvbXBpbGVkIHdpdGhvdXQKKyAgICAgIFVTRV9ERVBSRUNBVEVELgorICAgIFJlbW92ZWQgaW4gTERNdWQgMy4zIGFuZCBMUCAiMDMuMDIuMUAxNTAiLgorCitTSUVIRSBBVUNIOgorICAgICBBcnJheXM6CQlmbWFwX2FycmF5KEUpCisgICAgIE9iamVrdGFycmF5czoJZmlsdGVyX29iamVjdHMoRSksIG1hcF9vYmplY3RzKEUpCisgICAgIE1hcHBpbmdzOgkJZmlsdGVyKEUpLCBtYXAoRSkKKworICAgICBTb25zdGlnZXM6CQlzb3J0X2FycmF5KEUpLCB1bmlxdWVfYXJyYXkoKQorCQkJYWxpc3QsIHRyYW5zcG9zZV9hcnJheShFKQorCisyOS4xMC4yMDA2IFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9vYnNvbGV0ZS9maWx0ZXJfYXJyYXkuZW5nIGIvZG9jL29ic29sZXRlL2ZpbHRlcl9hcnJheS5lbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjczNzkyOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9vYnNvbGV0ZS9maWx0ZXJfYXJyYXkuZW5nCkBAIC0wLDAgKzEsNjAgQEAKKworICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICogIEFDSFRVTkc6IEVGVU4gRVhJU1RJRVJUIE5JQ0hUIE1FSFIhIE5JQ0hUIFZFUldFTkRFTiEgICoKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitmaWx0ZXJfYXJyYXkoRSkKK1NZTk9QU0lTCisgICAgIG1peGVkICpmaWx0ZXJfYXJyYXkobWl4ZWQgKmFyciwgc3RyaW5nIGZ1biwgc3RyaW5nfG9iamVjdCBvYgorICAgICAgICAgICAgICAgICAgICAgICAgIFssIG1peGVkIGV4dHJhLCAuLi5dKQorICAgICBtaXhlZCAqZmlsdGVyX2FycmF5KG1peGVkICphcnIsIGNsb3N1cmUgY2wgWywgbWl4ZWQgZXh0cmEsIC4uLl0pCisgICAgIG1peGVkICpmaWx0ZXJfYXJyYXkobWl4ZWQgKmFyciwgbWFwcGluZyBtYXAgWywgbWl4ZWQgZXh0cmEsIC4uLl0pCisKK0RFU0NSSVBUSU9OCisgICAgICAgIFJldHVybnMgYW4gYXJyYXkgaG9sZGluZyB0aGUgaXRlbXMgb2YgYXJyIGZpbHRlcmVkIHRocm91Z2gKKyAgICAgICAgb2ItPmZ1bihlbGVtZW50LCBleHRyYSwgLi4uKSwgdGhlIGNsb3N1cmUgY2wsIG9yIHRoZSBtYXBwaW5nIG1hcC4KKyAgICAgICAgVGhlIGZ1bmN0aW9uICdmdW4nIGluICdvYicgcmVzcC4gdGhlIGNsb3N1cmUgJ2NsJyBpcyBjYWxsZWQKKyAgICAgICAgZm9yIGVhY2ggZWxlbWVudCBpbiBhcnIgd2l0aCB0aGF0IGVsZW1lbnQgYXMgcGFyYW1ldGVyLiBUaGUKKyAgICAgICAgZXh0cmEgYW5kIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSBpbiBlYWNoIGNhbGwgaWYgZ2l2ZW4uCisgICAgICAgIFRoZSBtYXBwaW5nICdtYXAnIGlzIGxpa2V3aXNlIGluZGV4ZWQgYnkgZWFjaCBlbGVtZW50LgorICAgICAgICBJZiBvYi0+ZnVuKGFycltpbmRleF0sIGV4dHJhKSByZXR1cm5zICE9IDAgcmVzcC4KKyAgICAgICAgbWFwW2FycltpbmRleF1dIGV4aXN0cywgdGhlIGVsZW1lbnQgaXMgaW5jbHVkZWQgaW4gdGhlCisgICAgICAgIHJldHVybmVkIGFycmF5LgorCisgICAgICAgIElmIGFyciBpcyBub3QgYW4gYXJyYXksIGFuIGVycm9yIG9jY3Vycy4KKworICAgICAgICBUaGUgZXh0cmEgYXJndW1lbnQocykgYXJlIG9wdGlvbmFsIGFuZCBtdXN0IG5vdCBiZSBwcm90ZWN0ZWQKKyAgICAgICAgcmVmZXJlbmNlcyBsaWtlICYoaVswXSkuCisgICAgICAgIElmIDxvYj4gaXMgb21pdHRlZCwgb3IgbmVpdGhlciBhIHN0cmluZyBub3IgYW4gb2JqZWN0LCBpdAorICAgICAgICBkZWZhdWx0cyB0byB0aGlzX29iamVjdCgpLgorCisgICAgICAgIFNpbmNlIDMuMi4xQDM2LCB0aGUgc2Vjb25kIGFyZyBjYW4gYWxzbyBiZSBhIG1hcHBpbmcuIFRoZW4KKyAgICAgICAgb25seSB0aGUgZWxlbWVudHMgb2YgdGhlIGFycmF5IHdoaWNoIGJlbG9uZyB0byB0aGUgbWFwIChhcworICAgICAgICBrZXlzKSB3aWxsIGJlIHJldHVybmVkIChpLmUuIG1hcFthcnJbaW5kZXhdXSAhPSAwKS4KKworRVhBTVBMRQorICAgICAgICBpbnQgY2hlY2tfaWZfaWRsZShvYmplY3QgdXNlcikgeyByZXR1cm4gcXVlcnlfaWRsZSh1c2VyKTsgfQorCisgICAgICAgIC4uLgorCisgICAgICAgIG9iamVjdCAqaWRsZV91c2VyczsKKworICAgICAgICBpZGxlX3VzZXJzID0gZmlsdGVyX2FycmF5KHVzZXJzKCksICJjaGVja19pZl9pZGxlIik7CisgICAgICAgIC8qIGVxdWl2YWxlbnQgYnV0IHNtYWxsZXIgYW5kIGZhc3RlciAqLworICAgICAgICBpZGxlX3VzZXJzID0gZmlsdGVyX2FycmF5KHVzZXJzKCksICMncXVlcnlfaWRsZSApOworCisgICAgICAgIE5vdyBpZGxlX3VzZXJzIGNvbnRhaW5zIGFsbCB1c2VycyB0aGF0IGhhdmUgYmVlbiBpZGxlIGZvciBtb3JlCisgICAgICAgIHRoYW4gMSBzZWNvbmQuCisKK0hJU1RPUlkKKyAgICBTaW5jZSBMRE11ZCAzLjIuNiBvYnNvbGV0ZWQgYnkgZWZ1biBmaWx0ZXIoKS4KKyAgICBTaW5jZSBMRE11ZCAzLjIuOSwgbm90IGF2YWlsYWJsZSBpZiBkcml2ZXIgaXMgY29tcGlsZWQgd2l0aG91dAorICAgICAgVVNFX0RFUFJFQ0FURUQuCisgICAgUmVtb3ZlZCBpbiBMRE11ZCAzLjMgYW5kIExQICIwMy4wMi4xQDE1MCIuCisKK1NFRSBBTFNPOgorICAgICAgICBTaW1pbGFyIGZpbHRlcjoJZmlsdGVyX2FycmF5KEUpLCBmaWx0ZXJfb2JqZWN0KEUpLCBmaWx0ZXIoRSkKKyAgICAgICAgTWFwcGluZzoJbWFwKEUpLCBtYXBfb2JqZWN0cyhFKSwgbWFwKEUpCisgICAgICAgIFJlbGF0ZWQ6CXNvcnRfYXJheShFKSwgdW5pcXVlX2FycmF5KEUpCisKKzI5LjEwLjIwMDYgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL29ic29sZXRlL2ZpbHRlcl9tYXBwaW5nIGIvZG9jL29ic29sZXRlL2ZpbHRlcl9tYXBwaW5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MGM3MjQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvb2Jzb2xldGUvZmlsdGVyX21hcHBpbmcKQEAgLTAsMCArMSwxMjYgQEAKKworICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICogIEFDSFRVTkc6IEVGVU4gRVhJU1RJRVJUIE5JQ0hUIE1FSFIhIE5JQ0hUIFZFUldFTkRFTiEgICoKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitmaWx0ZXJfbWFwcGluZyhFKQorCitGVU5LVElPTjoKKyAgICAgbWFwcGluZyBmaWx0ZXIobWFwcGluZyBtYXAsIHN0cmluZyBmdW4sIHN0cmluZ3xvYmplY3Qgb2IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbLCBtaXhlZCBleHRyYSwgLi4uXSkKKyAgICAgbWFwcGluZyBmaWx0ZXIobWFwcGluZyBtYXAsIGNsb3N1cmUgY2wgWywgbWl4ZWQgZXh0cmEsIC4uLl0pCisKK1BBUkFNRVRFUjoKKyAgICAgbWFwCS0genUgZmlsdGVybmRlcyBNYXBwaW5nCisgICAgIGZ1bi9jbAktIHp1IHJ1ZmVuZGUgTWV0aG9kZS9DbG9zdXJlCisgICAgIG9iCQktIE9iamVrdC9EYXRlaW5hbWUsIGFuIGRlbSBNZXRob2RlIGdlcnVmZW4gd2VyZGVuIHNvbGwKKyAgICAgZXh0cmEJLSB3ZWl0ZXJlIFBhcmFtZXRlciBmdWVyIE1ldGhvZGUvQ2xvc3VyZQorCitCRVNDSFJFSUJVTkc6CisgICAgIEZpbHRlcnQgZGllIEVsZW1lbnRlIChqZXdlaWxzIFNjaGx1ZXNzZWwpIGF1cyAnbWFwJyBkdXJjaCBkaWUKKyAgICAgTWV0aG9kZSAnZnVuJyBvZGVyIGRpZSBDbG9zdXJlICdjbCcgaW4gZWluIG5ldWVzIE1hcHBpbmcuCisgICAgIEZ1ZXIgamVkZXMgRWxlbWVudCBhdXMgJ21hcCcgd2lyZCAnZnVuJyBvZGVyICdjbCcgbWl0IGRlbSBTY2hsdWVzc2VsIGFscworICAgICBlcnN0ZW0gUGFyYW1ldGVyIFt1bmQgZm9sZ2VuZCBkZW4gb3B0aW9uYWxlbiBFeHRyYS1QYXJhbWV0ZXJuXSBnZXJ1ZmVuLgorCisgICAgIFdlbm4gZGVyIEF1ZnJ1ZgorCW9iLT5mdW4oZWxlbWVudCBbLCBleHRyYTEsIGV4dHJhMiwgLi4uXSkgYnp3LgorCWZ1bmNhbGwoY2wsIGVsZW1lbnQgWywgZXh0cmExLCBleHRyYTIsIC4uLl0pCisgICAgIGFscyBSdWVja2dhYmV3ZXJ0ICE9MCB6dXJ1ZWNrZ2lidCBkYW5uIHdpcmQgZGVyIFNjaGx1ZXNzZWwrV2VydGUgaW4gZGFzCisgICAgIG5ldWUgQXJyYXkgYXVmZ2Vub21tZW4sIHNvbnN0IG5pY2h0LgorCisgICAgIFdlbm4gYXVmIGRpZSBXZXJ0ZSB6dWdlZ3JpZmZlbiB3ZXJkZW4gbXVzcywga2FubiBkYXMgTWFwcGluZyAnbWFwJworICAgICB6dXNhZXR6bGljaCBhbHMgJ2V4dHJhJy1QYXJhbWV0ZXIgdWViZXJnZWJlbiB3ZXJkZW4uIEFsdGVybmF0aXYga2FubiBtYW4KKyAgICAgd2Fsa19tYXBwaW5nKCkgYmVudXR6ZW4gdW5kIGRhcyBSdWVja2dhYmVtYXBwaW5nIHNlbGJzdCBlcnN0ZWxsZW4uCisKKworICAgICBWZXJ3ZW5kdW5nIHZvbiBNZXRob2RlbjoKKwlXZW5uIGJlaSBkZXIgQW5nYWJlIHZvbiAnZnVuJyBrZWluIE9iamVrdCAnb2InIGluIEZvcm0gZWluZXMgU3RyaW5ncworCW9kZXIgT2JqZWt0cyBhbmdlZ2ViZW4gd2lyZCwgd2lyZCB0aGlzX29iamVjdCgpIGFuZ2Vub21tZW4uCisKKyAgICAgVmVyd2VuZHVuZyB2b24gQ2xvc3VyZXM6CisJRXMga29lbm5lbiBzb3dvaGwgTGZ1bi1DbG9zdXJlcyBhbHMgYXVjaCBMYW1iZGEtQ2xvc3VyZXMgdmVyd2VuZGV0CisJd2VyZGVuLiBMZnVuLUNsb3N1cmVzIGtvZW5uZW4sIHdlbm4gaW0gc2VsYmVuIE9iamVrdCB2b3JoYW5kZW4gYXVjaAorCSdwcml2YXRlJyBvZGVyL3VuZCAnc3RhdGljJyBkZWtsYXJpZXJ0IHNlaW4sIG11ZXNzZW4gYWJlciB6dSBkZW0KKwlaZWl0cHVua3QgZGVyIFZlcndlbmR1bmcgYmVrYW5udCBzZWluIChGdW5rdGlvbnNwcm90b3R5cGVuIGJlbnV0emVuKS4KKworUlVlQ0tHQUJFV0VSVDoKKyAgICAgR2VmaWx0ZXJ0ZXMgTWFwcGluZyBtaXQgRmlsdGVyYmVkaW5ndW5nIGVyZnVlbGxlbmRlbiBFbGVtZW50ZW4uCisKK0JFTUVSS1VOR0VOOgorICAgICAoMSkgQWNodHVuZywgZGllIEVsZW1lbnRlIGluICdtYXAnIHdlcmRlbiBuaWNodCB0aWVmIGtvcGllcnQsIHNpbmQgc2llCisgICAgIGFsc28gc2VsYnN0IEFycmF5cyBvZGVyIE1hcHBpbmdzLCBzbyBmdWVocnQgZWluZSBzcGFldGVyZSBBZW5kZXJ1bmcgaW0KKyAgICAgUnVlY2tnYWJlLU1hcHBpbmcgenVyIEFlbmRlcnVuZyBpbSBVcnNwcnVuZ3NtYXBwaW5nOgorCisgICAgIG1hcHBpbmcgbSxuOworICAgICBtPShbMTooezEsMn0pLDA6KHsyLDMsNH0pXSk7CisgICAgIG49ZmlsdGVyKG0sICMnISk7CQkvLyBmaWx0ZXJ0IGFsbGUgS2V5cyAhPTAgaGVyYXVzCisgICAgIG5bMF1bMF09ODsKKworICAgICBmdWVocnQgenU6IG49KFswOih7OCwzLDR9KV0pCisJCW09KFswOih7OCwzLDR9KSwxOih7MSwyfSldKQorCisgICAgICgyKSBEYXMgS29waWVyZW4gaW4gZGFzIFJ1ZWNrZ2FiZW1hcHBpbmcgZXJmb2xndCBmdWVyIGplZGVzIEVsZW1lbnQgbmFjaAorICAgICBBdXNmdWVocnVuZyBkZXIgRmlsdGVybWV0aG9kZS4gQWVuZGVydW5nZW4gZGVyIFdlcnRlIGltIE1hcHBpbmcgaW4gZGllc2VyCisgICAgIE1ldGhvZGUgKGdsb2JhbGUgVmFyaWFibGUvVWViZXJnYWJlIGFscyBSZWZlcmVueiBhbiBmaWx0ZXIpCisgICAgIHNjaGxhZ2VuIHNpY2ggYWxzbyBpbSBSdWVja2dhYmVtYXBwaW5nIG5pZWRlci4KKworQkVJU1BJRUxFOgorICAgICAjIyMgZXJmdW5kZW5lIExpc3RlIG1pdCBTcGllbGVybiBzYWV1YmVybiAuLi4gIyMjCisgICAgIG1hcHBpbmcgeD0oWyBbL2h1bWFuOmxpYWZhcl06ICAyMCwKKwkJICBbL2R3YXJmOm1lc2lyaWldOiA1MCwKKwkJICBbL2VsZjp6YXJuaXlhXTogICA0MCwKKwkJICBbL2ZlbGluZTp0dXJib106ICAzMF0pOworCisgICAgIGludCBpc19iYWRndXkob2JqZWN0IHdobykgeworICAgICAgaWYod2hvLT5JbkZpZ2h0KCkpIHJldHVybiAxOworICAgICAgcmV0dXJuIDA7CisgICAgIH0KKworICAgICBtYXBwaW5nIHJlc3VsdD1maWx0ZXIoeCwgIydpc19iYWRndXkpOworICAgICAvLyAncmVzdWx0JyBlbnRoYWVsdCBudXIgbm9jaCBrYWVtcGZlbmRlIFNwaWVsZXIKKworICAgICAjIyMgZXJmdW5kZW5lIExpc3RlIHVlYmVyIGlocmUgV2VydGUgc2FldWJlcm4gIyMjCisgICAgIGludCBpc19iYWRndXkob2JqZWN0IHdobywgbWFwcGluZyBtKSB7CisgICAgICBpZihtW3hdPDMwKSByZXR1cm4gMTsKKyAgICAgIHJldHVybiAwOworICAgICB9CisKKyAgICAgbWFwcGluZyByZXN1bHQ9ZmlsdGVyKHgsICMnaXNfYmFkZ3V5LCAmeCk7IC8vIFJlZmVyZW56CisgICAgIC8vICdyZXN1bHQnIGVudGhhZWx0IG51ciBTcGllbGVyIG1pdCBXZXJ0ZW4gPj0gMzAKKworQWVRVUlWQUxFTlpDT0RFIChuaWNodCBlbXBmb2hsZW4sIG51ciB6dW0gVmVyc3RhZW5kbmlzISk6CisgICAgIGludCBpLCB3aWR0aDsKKyAgICAgbWFwcGluZyByZXQ7IG1hcHBpbmcgaW5wdXQ7CisgICAgIG1peGVkICppbmRleDsKKworICAgICB3aWR0aD1nZXRfdHlwZV9pbmZvKGlucHV0KVsxXTsKKyAgICAgcmV0PW1fYWxsb2NhdGUoMCwgd2lkdGgpOworICAgICBpbmRleD1tX2luZGljZXMoaW5wdXQpOworICAgICBpPXNpemVvZihpbmRleCk7CisgICAgIHdoaWxlKGktLSkKKyAgICAgICBpZihvYi0+ZnVuKGluZGV4W2ldIFssIGV4dHJhMSwgZXh0cmEyLCAuLi5dKSkKKyAgICAgICAvLyBpZihmdW5jYWxsKGNsLCBpbmRleFtpXSBbLCBleHRyYTEsIGV4dHJhMiwgLi4uXSkpCisgICAgICAgeworICAgICAgICAgaW50IGo7CisgICAgICAgICBqPXdpZHRoOworCisgICAgICAgICB3aGlsZShqLS0pCisgICAgICAgICAgIHJldFtpbmRleFtpXSxqXT1pbnB1dFtpbmRleFtpXSxqXTsKKyAgICAgICB9CisKK0hJU1RPUlkKKyAgICBTaW5jZSBMRE11ZCAzLjIuNiBvYnNvbGV0ZWQgYnkgZWZ1biBmaWx0ZXJfaW5kaWNlcygpLgorICAgIFNpbmNlIExETXVkIDMuMi45LCBub3QgYXZhaWxhYmxlIGlmIGRyaXZlciBpcyBjb21waWxlZCB3aXRob3V0CisgICAgICBVU0VfREVQUkVDQVRFRC4KKyAgICBSZW1vdmVkIGluIExETXVkIDMuMyBhbmQgTFAgIjAzLjAyLjFAMTUwIi4KKworU0lFSEUgQVVDSDoKKyAgICAgQXJyYXlzOgkJZmlsdGVyX2FycmF5KEUpLCBtYXAoRSkKKyAgICAgT2JqZWt0YXJyYXlzOglmaWx0ZXJfb2JqZWN0cyhFKSwgbWFwX29iamVjdHMoRSkKKyAgICAgTWFwcGluZ3M6CQltYXAoRSkKKworICAgICBTb25zdGlnZXM6CQl3YWxrX21hcHBpbmcoRSksIG1fY29udGFpbnMoRSkKKwkJCW1lbWJlcigpCisJCQltX2luZGljZXMoRSksIG1fdmFsdWVzKEUpCisKKzI5LjEwLjIwMDYgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL29ic29sZXRlL2dldF9yb290X3VpZCBiL2RvYy9vYnNvbGV0ZS9nZXRfcm9vdF91aWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFkZTMyNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9vYnNvbGV0ZS9nZXRfcm9vdF91aWQKQEAgLTAsMCArMSwyMCBAQAorCisgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQUNIVFVORzogV0lSRCBWT00gRFJJVkVSIE5JQ0hUIE1FSFIgR0VSVUZFTiEgTklDSFQgVkVSV0VOREVOISAqCisgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK1NZTk9QU0lTCisJc3RyaW5nIGdldF9yb290X3VpZCh2b2lkKQorCitERVNDUklQVElPTgorCVJldHVybiB0aGUgc3RyaW5nIHRvIGJlIHVzZWQgYXMgcm9vdC11aWQuCisJVW5kZXIgIW5hdGl2ZSwgdGhlIGZ1bmN0aW9uIGlzIGV4cGVuZGFibGUuCisKK0hJU1RPUlkKKwlJbiAzLjIuMUA0MCwgZ2V0X3Jvb3RfdWlkKCkgd2FzIHJlbmFtZWQgdG8gZ2V0X21hc3Rlcl91aWQoKQorCWFuZCBnb3QgYSBuZXcgc2VtYW50aWMuCisKK1NFRSBBTFNPCisJZ2V0X2JiX3VpZChNKSwgZ2V0X21hc3Rlcl91aWQoTSksIHVpZHMoQyksIGNyZWF0b3JfZmlsZShNKSwgY3JlYXRvcihFKQorCisyOS4xMC4yMDA2IFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9vYnNvbGV0ZS9pbml0aWFsaXNhdGlvbiBiL2RvYy9vYnNvbGV0ZS9pbml0aWFsaXNhdGlvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjcwMzc2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL29ic29sZXRlL2luaXRpYWxpc2F0aW9uCkBAIC0wLDAgKzEsNDggQEAKK09CU09MRVRFCitDT05DRVBUCisJaW5pdGlhbGlzYXRpb24KKworREVTQ1JJUFRJT04KKwlUaGVyZSBhcmUgdHdvIGRpZmZlcmVudCBmbGF2b3VycyBvZiBpbml0aWFsaXNhdGlvbnMsCisJc2VsZWN0YWJsZSBpbiBjb25maWcuaCBhdCBkcml2ZXIgY29tcGlsZSB0aW1lOgorCisJaSkgICN1bmRlZiBJTklUSUFMSVpBVElPTl9CWV9fX0lOSVQKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCUluaXRpYWxpc2F0aW9uIGlzIGRvbmUgYXQgY29tcGlsZSB0aW1lLiBUaGlzIGlzIGZhc3QgYW5kIGNvc3RzCisJbm8gZXh0cmEgY29kZSBpbiB0aGUgcHJvZ3JhbS4gIEFsbG93ZWQgZXhwcmVzc2lvbnMgY3VycmVudGx5CisJaW5jbHVkZSBpbnRlZ2VyIGxpdGVyYWxzLCBzdHJpbmcgbGl0ZXJhbHMsIGludGVnZXIgb3BlcmF0b3JzLAorCXN0cmluZyBhZGRpdGlvbiwgYnJhY2tldGluZywgYXJyYXkgY29uc3RydWN0b3JzLCB0aGUgZW1wdHkKKwltYXBwaW5nIGFuZCBvcmRlcl9hbGlzdCgpIC4KKwlXaGVuIGFuIG9iamVjdCB3aXRoIGluaXRpYWxpc2VkIHZhcmlhYmxlcyBpcyBjbG9uZWQgb3IKKwlpbmhlcml0ZWQsIGFsbCBpbml0aWFsaXNlZCB2YXJpYWJsZXMgYXJlIGNvcGllZCBmcm9tIHRoZQorCWJsdWVwcmludC4gIEEgc3BlY2lhbCBhcHBsaWNhdGlvbiBvZiB0aGlzIGZlYXR1cmUgaXMgdG8gaGF2ZQorCWFuIGluaXRpYWxpc2VkIG5vbi1lbXB0eSBhcnJheSBvciBhIG1hcHBpbmc7IGl0IHdpbGwgYmUgc2hhcmVkCisJYnkgYWxsIGNsb25lcyBvciBpbmhlcml0aW5nIG9iamVjdHMgdW5sZXNzIGFuIGFzc2lnbm1lbnQgdG8KKwl0aGUgdmFyaWFibGUgLSBhcyBvcHBvc2VkIHRvIGFuIGFzc2lnbm1lbnQgdG8gYW4gZWxlbWVudCBvZgorCXRoZSBhcnJheS9tYXBwaW5nIC0gaXMgZG9uZSBpbiBhbGwgY2xvbmVzIGV0Yy4gIFRvIHByZXZlbnQKKwl1bmF1dGhvcmlzZWQgY2hlbmdlcyBpbiBpbml0aWFsaXNlZCBhcnJheXMvbWFwcGluZ3MsIHlvdSBjYW4KKwlkZWNsYXJlIHRoZSB2YXJpYWJsZXMgYXMgYGBwcml2YXRlIHN0YXRpYycnIG9yIHVzZSBhIG5vbWFzaworCXJlc2V0L2NyZWF0ZSB0aGF0IGNoZWNrcyBmb3IgdW5kZXNpcmVkIGluaGVyaXRhbmNlLgorCisJaWkpICNkZWZpbmUgSU5JVElBTElaQVRJT05fQllfX19JTklUCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJQ3JlYXRlcyBhIGZ1bmN0aW9uIG5hbWVkIF9fSU5JVCgpIGZvciBhbGwgdmFyaWFibGUKKwlpbml0aWFsaXNhdGlvbnMgYW5kIGZvciBjYWxscyB0byBfX0lOSVQoKSBpbiBhbGwgaW5oZXJpdGVkCisJb2JqZWN0cywgYW5kIHJ1bnMgdGhpcyBmdW5jdGlvbiBhdCBvYmplY3QgY3JlYXRpb24gdGltZS4KKwlBbnkgZWZ1biBjYW4gYmUgdXNlZCBpbiB0aGUgZXhwcmVzc2lvbnMgZm9yIHZhcmlhYmxlCisJaW5pdGlhbGlzYXRpb25zLCBldmVuIG9uZXMgd2l0aCBzZXZlcmUgc2lkZSBlZmZlY3RzLCBsaWtlCisJZGVzdHJ1Y3QoKSBvciBzaHV0ZG93bigpIC4gVGhlIGNvZGUgY3JlYXRlZCBmb3IgX19JTklUKCkgaXMgYQorCWxpdHRsZSB3b3JzZSB0aGFuIGEgbWVkaXVtLXNraWxsZWQgbHBjLXByb2dyYW1tZXIgd291bGQKKwlnZW5lcmF0ZSwgYmVjYXVzZSBpdCBpcyBzY2F0dGVyZWQgYWxsIG92ZXIgdGhlIHByb2dyYW0uCisJSXQgaXMgcG9zc2libGUgKHRob3VnaCBkaXNjb3VyYWdlZCkgdG8gb3ZlcmxvYWQgX19JTklUKCkgd2l0aAorCXNlbGZ3cml0dGVuIGZ1bmN0aW9ucy4KKworSElTVE9SWQorICBTaW5jZSBMRE11ZCAzLjMsIG9yZGVyX2FsaXN0KCkgaXMgbm8gbG9uZ2VyIGFjY2VwdGVkIHdpdGhvdXQKKyAgICBJTklUSUFMSVpBVElPTl9CWV9fX0lOSVQuCisgIExETXVkIDMuMy4zNzggcmVwbGFjZWQgdGhpcyBzdGF0aWMgY2hvaWNlIG9mIGluaXRpYWxpc2F0aW9uCisgICAgbWV0aG9kcyBieSBjb21waWxlLXRpbWUgcHJhZ21hcy4KKworMjkuMTAuMjAwNiBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2Mvb2Jzb2xldGUvaW50ZXJzZWN0X2FsaXN0IGIvZG9jL29ic29sZXRlL2ludGVyc2VjdF9hbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmJiY2NiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL29ic29sZXRlL2ludGVyc2VjdF9hbGlzdApAQCAtMCwwICsxLDE0IEBACitPUFRJT05BTAorU1lOT1BTSVMKKyAgICAgICAgbWl4ZWQgKiBpbnRlcnNlY3RfYWxpc3QgKG1peGVkICogbGlzdDEsIG1peGVkICogbGlzdDIpCisKK0RFU0NSSVBUSU9OCisgICAgICAgIERvZXMgYSBmYXN0IHNldCBpbnRlcnNlY3Rpb24gb24gYWxpc3Qga2V5IHZlY3RvcnMgKE5PVCBvbiBmdWxsIGFsaXN0cyEpLgorICAgICAgICBUaGUgb3BlcmF0b3IgJyYnIGRvZXMgc2V0IGludGVyc2VjdGlvbiBvbiBhcnJheXMgaW4gZ2VuZXJhbC4KKworRVhBTVBMRQorICAgICAgICBuZXdfbGlzdCA9IGludGVyc2VjdF9hbGlzdChsaXN0MSwgbGlzdDIpOworCitTRUUgQUxTTworICAgICAgICBmaWx0ZXIoRSksIGFzc29jKEUpLCBpbnNlcnRfYWxpc3QoRSksIG1hcChFKSwKKyAgICAgICAgbWVtYmVyX2FycmF5KEUpLCBvcmRlcl9hbGlzdChFKSwgc29ydF9hcnJheShFKSwgdW5pcXVlX2FycmF5KEUpCmRpZmYgLS1naXQgYS9kb2Mvb2Jzb2xldGUvaXNfY2xvbmUgYi9kb2Mvb2Jzb2xldGUvaXNfY2xvbmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI1YjlkNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9vYnNvbGV0ZS9pc19jbG9uZQpAQCAtMCwwICsxLDQxIEBACisKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqICBBQ0hUVU5HOiBFRlVOIEVYSVNUSUVSVCBOSUNIVCBNRUhSISBOSUNIVCBWRVJXRU5ERU4hICAqCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworRlVOS1RJT046CisJaXNfY2xvbmUobWl4ZWQgb2IpCisKK0FSR1VNRU5URToKKwlvYiAtIERhcyB6dSBwcnVlZmVuZGUgT2JqZWt0CisKK0JFU0NIUkVJQlVORzoKKwlpc19jbG9uZSBzdGVsbHQgZmVzdCwgb2Igb2IgZWluIGdlY2xvbnRlcyBPYmpla3QgaXN0IG9kZXIgbmljaHQuCisKK1JVRUNLR0FCRVdFUlQ6CisJMSwgd2VubiBvYiBlaW4gZ2VjbG9udGVzIE9iamVrdCBpc3QsIGFuc29uc3RlbiAwLgorCitISU5XRUlTOgorICBEaWVzIGlzdCBlaW5lIFNpbXVsIEVmdW4sIGRpZSBpbnp3aXNjaGVuIHVlYmVyZmx1c3NpZyBpc3QgdW5kIG51ciBhdXMKKyAgS29tcGF0aWJpbGl0YWV0c2dydWVuZGVuIG5vY2ggZXhpc3RpZXJ0LiBCaXR0ZSBkaWUgRWZ1biAnY2xvbmVwJyB2ZXJ3ZW5kZW4hCisKK0JFSVNQSUVMRToKKwlpbmhlcml0ICJzdGQvdGhpbmciOworCisJI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKworCWNyZWF0ZSgpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIWlzX2Nsb25lKHRoaXNfb2JqZWN0KCkpKSB7CisgICAgICAgICAgICAgIHNldF9uZXh0X3Jlc2V0KC0xKTsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKworICAgICAgICAgIDo6IGNyZWF0ZSgpOworICAgICAgICAgIC4uLgorICAgICAgICB9CisKK3NpZWhlIGF1Y2g6IGNsb25lcAorCitaZXNzdHJhLCAwNC4wMi4yMDA3CisKZGlmZiAtLWdpdCBhL2RvYy9vYnNvbGV0ZS9tX3NpemVvZiBiL2RvYy9vYnNvbGV0ZS9tX3NpemVvZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzI2YjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL29ic29sZXRlL21fc2l6ZW9mCkBAIC0wLDAgKzEsMjEgQEAKKworICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICogIEFDSFRVTkc6IEVGVU4gRVhJU1RJRVJUIE5JQ0hUIE1FSFIhIE5JQ0hUIFZFUldFTkRFTiEgICoKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitTWU5PUFNJUzoKKwlpbnQgc2l6ZW9mKG1hcHBpbmcgbWFwKQorCitERVNDUklQVElPTjoKKwlSZXR1cm4gdGhlIG51bWJlciBvZiBpbmRpY2VzIGluIG1hcHBpbmcgJ21hcCcuCisKK0hJU1RPUlkKKyAgU2luY2UgTERNdWQgMy4yLjksIG5vdCBhdmFpbGFibGUgaWYgZHJpdmVyIGlzIGNvbXBpbGVkIHdpdGhvdXQKKyAgICBVU0VfREVQUkVDQVRFRC4KKyAgUmVtb3ZlZCBpbiBMRE11ZCAzLjMgYW5kIExQICIwMy4wMi4xQDE1MCIuCisKK1NFRSBBTFNPOgorCW1hcHBpbmdwKEUpLCBta21hcHBpbmcoRSksIG1faW5kaWNlcywoRSkgbV92YWx1ZXMoRSksCisJbV9kZWxldGUoRSksIHdpZHRob2YoRSkKKworMjkuMTAuMjAwNiBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2Mvb2Jzb2xldGUvbV93aWR0aCBiL2RvYy9vYnNvbGV0ZS9tX3dpZHRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZmM3YTYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvb2Jzb2xldGUvbV93aWR0aApAQCAtMCwwICsxLDE1IEBACisKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqICBBQ0hUVU5HOiBFRlVOIEVYSVNUSUVSVCBOSUNIVCBNRUhSISBOSUNIVCBWRVJXRU5ERU4hICAqCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworU1lOT1BTSVM6CisJaW50IHdpZHRob2YobWFwcGluZyBtYXApCisKK0RFU0NSSVBUSU9OOgorCVJldHVybiB0aGUgbnVtYmVyIG9mIHZhbHVlcyBwZXIgaW5kZXggaW4gbWFwcGluZyAnbWFwJy4gSXQgbWVhbnMKKwl0aGUgd2lkdGggb2YgdGhlIG1hcHBpbmcgJ21hcCcuCisKK1NFRSBBTFNPOgorCW1hcHBpbmdwKEUpLCBta21hcHBpbmcoRSksIG1faW5kaWNlcywoRSkgbV92YWx1ZXMoRSksCisJbV9kZWxldGUoRSksIHNpemVvZihFKQpkaWZmIC0tZ2l0IGEvZG9jL29ic29sZXRlL21hcF9hcnJheSBiL2RvYy9vYnNvbGV0ZS9tYXBfYXJyYXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEzMjlkYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9vYnNvbGV0ZS9tYXBfYXJyYXkKQEAgLTAsMCArMSw5MCBAQAorCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiAgQUNIVFVORzogRUZVTiBFWElTVElFUlQgTklDSFQgTUVIUiEgTklDSFQgVkVSV0VOREVOISAgKgorICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK21hcF9hcnJheShFKQorCitGVU5LVElPTjoKKyAgICAgbWl4ZWQgKm1hcChtaXhlZCAqYXJyLCBzdHJpbmcgZnVuLCBvYmplY3Qgb2IgWywgbWl4ZWQgZXh0cmFdKQorICAgICBtaXhlZCAqbWFwKG1peGVkICphcnIsIGNsb3N1cmUgY2wgWywgbWl4ZWQgZXh0cmFdKQorCitQQVJBTUVURVI6CisgICAgIGFycgktIHp1IG1hcHBlbmRlcyBBcnJheQorICAgICBmdW4vY2wJLSB6dSBydWZlbmRlIE1ldGhvZGUvQ2xvc3VyZQorICAgICBvYgkJLSBPYmpla3QvRGF0ZWluYW1lLCBhbiBkZW0gTWV0aG9kZSBnZXJ1ZmVuIHdlcmRlbiBzb2xsCisgICAgIGV4dHJhCS0gd2VpdGVyZSBQYXJhbWV0ZXIgZnVlciBNZXRob2RlL0Nsb3N1cmUKKworQkVTQ0hSRUlCVU5HOgorICAgICBNYXBwZWQgZGllIEVsZW1lbnRlIGF1cyAnYXJyJyBkdXJjaCBkaWUgTWV0aG9kZSAnZnVuJyBvZGVyIGRpZSBDbG9zdXJlICdjbCcKKyAgICAgaW4gZWluIG5ldWVzIEFycmF5LgorICAgICBGdWVyIGplZGVzIEVsZW1lbnQgYXVzICdhcnInIHdpcmQgJ2Z1bicgb2RlciAnY2wnIG1pdCBkZW0gRWxlbWVudCBhbHMKKyAgICAgZXJzdGVtIFBhcmFtZXRlciBbdW5kIGZvbGdlbmQgZGVuIG9wdGlvbmFsZW4gRXh0cmEtUGFyYW1ldGVybl0gZ2VydWZlbgorICAgICBiencuICdtYXAnIG1pdCBkZW0gRWxlbWVudCBpbmRpemllcnQuCisKKyAgICAgRGVyIFJ1ZWNrZ2FiZXdlcnQgZGVyIE1ldGhvZGUvQ2xvc3VyZSB3aXJkIGluIGFuIGRlciBJbmRleHBvc2l0aW9uIGRlcworICAgICBFbGVtZW50ZXMgaW4gZGFzIG5ldWUgQXJyYXkgZWluZ2V0cmFnZW4uCisKKyAgICAgVmVyd2VuZHVuZyB2b24gTWV0aG9kZW46CisJV2VubiBiZWkgZGVyIEFuZ2FiZSB2b24gJ2Z1bicga2VpbiBPYmpla3QgJ29iJyBpbiBGb3JtIGVpbmVzIFN0cmluZ3MKKwlvZGVyIE9iamVrdHMgYW5nZWdlYmVuIHdpcmQsIHdpcmQgdGhpc19vYmplY3QoKSBhbmdlbm9tbWVuLgorCisgICAgIFZlcndlbmR1bmcgdm9uIENsb3N1cmVzOgorCUVzIGtvZW5uZW4gc293b2hsIExmdW4tQ2xvc3VyZXMgYWxzIGF1Y2ggTGFtYmRhLUNsb3N1cmVzIHZlcndlbmRldAorCXdlcmRlbi4gTGZ1bi1DbG9zdXJlcyBrb2VubmVuLCB3ZW5uIGltIHNlbGJlbiBPYmpla3Qgdm9yaGFuZGVuIGF1Y2gKKwkncHJpdmF0ZScgb2Rlci91bmQgJ3N0YXRpYycgZGVrbGFyaWVydCBzZWluLCBtdWVzc2VuIGFiZXIgenUgZGVtCisJWmVpdHB1bmt0IGRlciBWZXJ3ZW5kdW5nIGJla2FubnQgc2VpbiAoRnVua3Rpb25zcHJvdG90eXBlbiBiZW51dHplbikuCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIEFycmF5IG1pdCBSdWVja2dhYmV3ZXJ0ZW4gZGVyIE1ldGhvZGUvQ2xvc3VyZS4KKworQkVJU1BJRUxFOgorICAgICAjIyMgZXJzZXR6ZSBTdHJpbmdzIGR1cmNoIGlocmUgR3Jvc3NjaHJlaWJ1bmcgIyMjCisgICAgIG1hcCgoeyJhYmMiLCJjZGUifSksICMnY2FwaXRhbGl6ZSk7ID09ICh7IkFiYyIsIkNkZSJ9KQorCisKKyAgICAgIyMjIGVyc2V0emUgaW4gZWluZW0gU3BpZWxlcm9iamVrdGFycmF5IGRpZSBPYmpla3RlIGR1cmNoIGlocmUgVUlEICMjIworICAgICAvLyBGb2xnZW5kIGlkZW50aXNjaGUgUmVzdWx0YXRlLCBhYmVyIGFuZGVyZSBBbnNhZXR6ZToKKworICAgICAjMTogbWl0IGRlciBFZnVuIGV0dWlkIGRpcmVrdCAoaWRlYWwgaGllcikKKyAgICAgbWFwKHVzZXJzKCksICMnZ2V0dWlkKTsKKworICAgICAjMiwzOiBtaXQgTWFwbWV0aG9kZQorICAgICBzdHJpbmcgbWFrZV91aWQob2JqZWN0IG8pIHsKKyAgICAgIHJldHVybiBnZXR1aWQobyk7CisgICAgIH0KKyAgICAgICMyOiBhbHMgTEZ1bi1BdWZydWYgZGVyIE1hcG1ldGhvZGUKKyAgICAgIG1hcCh1c2VycygpLCAibWFrZV91aWQiKTsKKyAgICAgIG1hcCh1c2VycygpLCAibWFrZV91aWQiLCB0aGlzX29iamVjdCgpKTsKKworICAgICAgIzM6IGFscyBMZnVuLUNsb3N1cmUtQXVmcnVmIGRlciBNYXBtZXRob2RlCisgICAgICBtYXAodXNlcnMoKSwgIydtYWtlX3VpZCk7CisKKyAgICAgIzQ6IG1pdCBMYW1iZGEtQ2xvc3VyZSAobGFuZ3NhbWVyLCBuaWNodCBmdWVyIGFsbGUgbGVzZXJsaWNoKQorICAgICBtYXAodXNlcnMoKSwgbGFtYmRhKCh7J3h9KSwgKHsjJ2dldHVpZCwgJ3h9KSkpOworCitBZVFVSVZBTEVOWkNPREUgKG5pY2h0IGVtcGZvaGxlbiwgbnVyIHp1bSBWZXJzdGFlbmRuaXMhKToKKyAgICAgaW50IGk7CisgICAgIG1peGVkICpyZXQ7IG1peGVkICppbnB1dDsKKworICAgICBpPXNpemVvZihpbnB1dCk7CisgICAgIHJldD1hbGxvY2F0ZShpKTsKKyAgICAgd2hpbGUoaS0tKQorICAgICAgIHJldFtpXT1vYi0+ZnVuKGlucHV0W2ldIFssIGV4dHJhMSwgZXh0cmEyLCAuLi5dKSk7CisgICAgICAgLy8gcmV0W2ldPWZ1bmNhbGwoY2wsIGlucHV0W2ldIFssIGV4dHJhMSwgZXh0cmEyLCAuLi5dKTsKKworSElTVE9SWQorICAgIFNpbmNlIExETXVkIDMuMi42IG9ic29sZXRlZCBieSBtYXAoKS4KKyAgICBTaW5jZSBMRE11ZCAzLjIuOSwgbm90IGF2YWlsYWJsZSBpZiBkcml2ZXIgaXMgY29tcGlsZWQgd2l0aG91dAorICAgICAgVVNFX0RFUFJFQ0FURUQuCisgICAgUmVtb3ZlZCBpbiBMRE11ZCAzLjMgYW5kIExQICIwMy4wMi4xQDE1MCIuCisKK1NJRUhFIEFVQ0g6CisgICAgIEFycmF5czoJCWZpbHRlcl9hcnJheShFKQorICAgICBPYmpla3RhcnJheXM6CWZpbHRlcl9vYmplY3RzKEUpLCBtYXBfb2JqZWN0cyhFKQorICAgICBNYXBwaW5nczoJCWZpbHRlcihFKSwgbWFwKEUpCisKKyAgICAgU29uc3RpZ2VzOgkJc29ydF9hcnJheShFKSwgdW5pcXVlX2FycmF5KCkKKwkJCWFsaXN0LCB0cmFuc3Bvc2VfYXJyYXkoRSkKKworMjkuMTAuMjAwNiBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2Mvb2Jzb2xldGUvbWFwX21hcHBpbmcgYi9kb2Mvb2Jzb2xldGUvbWFwX21hcHBpbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJjODRjMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9vYnNvbGV0ZS9tYXBfbWFwcGluZwpAQCAtMCwwICsxLDg2IEBACisKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqICBBQ0hUVU5HOiBFRlVOIEVYSVNUSUVSVCBOSUNIVCBNRUhSISBOSUNIVCBWRVJXRU5ERU4hICAqCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworbWFwX21hcHBpbmcoRSkKKworRlVOS1RJT046CisgICAgIG1hcHBpbmcgbWFwKG1hcHBpbmcgbSwgc3RyaW5nIGZ1biwgb2JqZWN0IG9iIFssIG1peGVkIGV4dHJhXSkKKyAgICAgbWFwcGluZyBtYXAobWFwcGluZyBtLCBjbG9zdXJlIGNsIFssIG1peGVkIGV4dHJhXSkKKworUEFSQU1FVEVSOgorICAgICBhcnIJLSB6dSBtYXBwZW5kZXMgQXJyYXkKKyAgICAgZnVuL2NsCS0genUgcnVmZW5kZSBNZXRob2RlL0Nsb3N1cmUKKyAgICAgb2IJCS0gT2JqZWt0L0RhdGVpbmFtZSwgYW4gZGVtIE1ldGhvZGUgZ2VydWZlbiB3ZXJkZW4gc29sbAorICAgICBleHRyYQktIHdlaXRlcmUgUGFyYW1ldGVyIGZ1ZXIgTWV0aG9kZS9DbG9zdXJlCisKK0JFU0NIUkVJQlVORzoKKyAgICAgTWFwcGVkIGRpZSBFbGVtZW50ZSAoamV3ZWlscyBTY2hsdWVzc2VsKSBhdXMgJ21hcCcgZHVyY2ggZGllIE1ldGhvZGUKKyAgICAgJ2Z1bicgb2RlciBkaWUgQ2xvc3VyZSAnY2wnIGluIGVpbiBuZXVlcyBNYXBwaW5nLgorICAgICBGdWVyIGplZGVzIEVsZW1lbnQgYXVzICdtYXAnIHdpcmQgJ2Z1bicgb2RlciAnY2wnIG1pdCBkZW0gU2NobHVlc3NlbCBhbHMKKyAgICAgZXJzdGVtIFBhcmFtZXRlciBbdW5kIGZvbGdlbmQgZGVuIG9wdGlvbmFsZW4gRXh0cmEtUGFyYW1ldGVybl0gZ2VydWZlbi4KKworICAgICBEZXIgUnVlY2tnYWJld2VydCBkZXIgTWV0aG9kZS9DbG9zdXJlIHdpcmQgaW4gZnVlciBkZW4gU2NobHVlc3NlbCBhbHMKKyAgICAgRGF0ZW53ZXJ0IGluIGRhcyBuZXVlIE1hcHBpbmcgZWluZ2V0cmFnZW4uCisKKyAgICAgQUNIVFVORzogQWxsZSBhbmRlcmVuIERhdGVuIGJlaSBNYXBwaW5nIG1pdCBCcmVpdGU+MSB2ZXJmYWxsZW4hCisKKyAgICAgVmVyd2VuZHVuZyB2b24gTWV0aG9kZW46CisJV2VubiBiZWkgZGVyIEFuZ2FiZSB2b24gJ2Z1bicga2VpbiBPYmpla3QgJ29iJyBpbiBGb3JtIGVpbmVzIFN0cmluZ3MKKwlvZGVyIE9iamVrdHMgYW5nZWdlYmVuIHdpcmQsIHdpcmQgdGhpc19vYmplY3QoKSBhbmdlbm9tbWVuLgorCisgICAgIFZlcndlbmR1bmcgdm9uIENsb3N1cmVzOgorCUVzIGtvZW5uZW4gc293b2hsIExmdW4tQ2xvc3VyZXMgYWxzIGF1Y2ggTGFtYmRhLUNsb3N1cmVzIHZlcndlbmRldAorCXdlcmRlbi4gTGZ1bi1DbG9zdXJlcyBrb2VubmVuLCB3ZW5uIGltIHNlbGJlbiBPYmpla3Qgdm9yaGFuZGVuIGF1Y2gKKwkncHJpdmF0ZScgb2Rlci91bmQgJ3N0YXRpYycgZGVrbGFyaWVydCBzZWluLCBtdWVzc2VuIGFiZXIgenUgZGVtCisJWmVpdHB1bmt0IGRlciBWZXJ3ZW5kdW5nIGJla2FubnQgc2VpbiAoRnVua3Rpb25zcHJvdG90eXBlbiBiZW51dHplbikuCisKK1JVZUNLR0FCRVdFUlQ6CisgICAgIE1hcHBpbmcgbWl0IFNjaGx1ZXNzZWw6UnVlY2tnYWJld2VydGVuIGRlciBNZXRob2RlL0Nsb3N1cmUuCisKK0JFSVNQSUVMRToKKyAgICAgLy8gZXJzZXR6ZSBpbiBlaW5lbSBNYXBwaW5nIGRpZSBEYXRlbndlcnRlIGR1cmNoIGRhcyBEb3BwZWx0ZSwKKyAgICAgLy8gbnV0emUgZGFiZWkgZGllIERhdGVud2VydGUgZGVzIEFsdG1hcHBpbmdzIGR1cmNoIFVlYmVyZ2FiZSBhbHMKKyAgICAgLy8gZXh0cmEtUGFyYW1ldGVyCisKKyAgICAgLy8gQW5tZXJrdW5nOiBEYXMgZ2VodCBtaXQgd2Fsa19tYXBwaW5nKCkgZWxlZ2FudGVyIQorCisgICAgIGludCBkb19kb3VibGUoc3RyaW5nIGtleSwgbWFwcGluZyBtLCBpbnQgbXVsdCkgeworICAgICAgcmV0dXJuIG1ba2V5XSptdWx0OworICAgICB9CisKKyAgICAgbWFwcGluZyB4LCB5OworICAgICB4PShbImEiOjIsICJiIjozXSk7CisgICAgIHk9bWFwKChbImEiOjIsICJiIjozXSksICMnZG9fZG91YmxlLCAmeCwgMyk7CisKKyAgICAgeSA9PSAoWyJhIjo2LCJiIjo5XSkKKworQWVRVUlWQUxFTlpDT0RFIChuaWNodCBlbXBmb2hsZW4sIG51ciB6dW0gVmVyc3RhZW5kbmlzISk6CisgICAgIGludCBpOworICAgICBtYXBwaW5nIHJldDsgbWFwcGluZyBpbnB1dDsKKyAgICAgbWl4ZWQgKmluZGV4OworCisgICAgIHJldD1tX2FsbG9jYXRlKDAsIDEpOworICAgICBpbmRleD1tX2luZGljZXMoaW5wdXQpOworICAgICBpPXNpemVvZihpbmRleCk7CisgICAgIHdoaWxlKGktLSkKKyAgICAgICByZXRbaW5kZXhbaV1dPW9iLT5mdW4oaW5kZXhbaV0gWywgZXh0cmExLCBleHRyYTIsIC4uLl0pKQorICAgICAgIC8vIHJldFtpbmRleFtpXV09ZnVuY2FsbChjbCwgaW5kZXhbaV0gWywgZXh0cmExLCBleHRyYTIsIC4uLl0pOworCitISVNUT1JZCisgICAgU2luY2UgTERNdWQgMy4yLjYgb2Jzb2xldGVkIGJ5IG1hcF9pbmRpY2VzKCkuCisgICAgU2luY2UgTERNdWQgMy4yLjksIG5vdCBhdmFpbGFibGUgaWYgZHJpdmVyIGlzIGNvbXBpbGVkIHdpdGhvdXQKKyAgICAgIFVTRV9ERVBSRUNBVEVELgorICAgIFJlbW92ZWQgaW4gTERNdWQgMy4zIGFuZCBMUCAiMDMuMDIuMUAxNTAiLgorCitTSUVIRSBBVUNIOgorICAgICBBcnJheXM6CQlmaWx0ZXJfYXJyYXkoRSksIG1hcChFKQorICAgICBPYmpla3RhcnJheXM6CWZpbHRlcl9vYmplY3RzKEUpLCBtYXBfb2JqZWN0cyhFKQorICAgICBNYXBwaW5nczoJCWZpbHRlcihFKQorCisgICAgIFNvbnN0aWdlczoJCXdhbGtfbWFwcGluZyhFKSwgbV9jb250YWlucyhFKQorCQkJbWVtYmVyKCkKKwkJCW1faW5kaWNlcyhFKSwgbV92YWx1ZXMoRSkKKworMjkuMTAuMjAwNiBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2Mvb2Jzb2xldGUvbWFwcGluZ19jb250YWlucyBiL2RvYy9vYnNvbGV0ZS9tYXBwaW5nX2NvbnRhaW5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZGY4OTcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvb2Jzb2xldGUvbWFwcGluZ19jb250YWlucwpAQCAtMCwwICsxLDI0IEBACisKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqICBBQ0hUVU5HOiBFRlVOIEVYSVNUSUVSVCBOSUNIVCBNRUhSISBOSUNIVCBWRVJXRU5ERU4hICAqCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworU1lOT1BTSVM6CisJaW50IG1fY29udGFpbnMobWl4ZWQgJmRhdGExLCAuLi4sICZkYXRhTiwgbWFwLCBrZXkpCisKK0RFU0NSSVBUSU9OOgorCUlmIHRoZSBtYXBwaW5nIGNvbnRhaW5zIHRoZSBrZXkgbWFwLCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXMKKwlhcmUgYXNzaWduZWQgdG8gdGhlIGRhdGEgYXJndW1lbnRzLCB3aGljaCBtYXNzZWQgYmUgcGFzc2VkIGJ5CisJcmVmZXJlbmNlLCBhbmQgMSBpcyByZXR1cm5lZC4gSWYga2V5IGlzIG5vdCBpbiBtYXAsIDAgaXMKKwlyZXR1cm5lZCBhbmQgdGhlIGRhdGEgYXJncyBhcmUgbGVmdCB1bmNoYW5nZWQuCisKK0hJU1RPUlkKKyAgUmVuYW1lZCB0byAnbV9jb250YWlucygpJyBpbiBMRE11ZCAzLjIuNi4KKyAgU2luY2UgTERNdWQgMy4yLjksIG5vdCBhdmFpbGFibGUgaWYgZHJpdmVyIGlzIGNvbXBpbGVkIHdpdGhvdXQKKyAgICBVU0VfREVQUkVDQVRFRC4KKyAgUmVtb3ZlZCBpbiBMRE11ZCAzLjMgYW5kIExQICIwMy4wMi4xQDE1MCIuCisKK1NFRSBBTFNPOgorCW1hcHBpbmdzKExQQyksIG1lbWJlcihFKQorCisyOS4xMC4yMDA2IFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9vYnNvbGV0ZS9tZW1iZXJfYXJyYXkgYi9kb2Mvb2Jzb2xldGUvbWVtYmVyX2FycmF5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiOTQ4ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvb2Jzb2xldGUvbWVtYmVyX2FycmF5CkBAIC0wLDAgKzEsMzAgQEAKKworICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICogIEFDSFRVTkc6IEVGVU4gRVhJU1RJRVJUIE5JQ0hUIE1FSFIhIE5JQ0hUIFZFUldFTkRFTiEgICoKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitTWU5PUFNJUzoKKyAgICBpbnQgbWVtYmVyX2FycmF5KG1peGVkIGl0ZW0sIG1peGVkICphcnIpCisgICAgaW50IG1lbWJlcl9hcnJheShtaXhlZCBpdGVtLCBzdHJpbmcgYXJyKQorCitERVNDUklQVElPTjoKKyAgICBETyBOT1QgVVNFIFRISVMgRUZVTiAtIElUIEhBUyBCRUVOIFJFTU9WRUQgRlJPTSBUSEUgRFJJVkVSIQorICAgIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cmVuY2Ugb2YgaXRlbSBpbiBhcnJheSBhcnIsCisgIAlvciBvY2N1cmVuY2Ugb2YgYSBjaGFyYWN0ZXIgaW4gYSBzdHJpbmcuIElmIG5vdCBmb3VuZCwgdGhlbiAtMQorICAJaXMgcmV0dXJuZWQuCisgICAgICAgIAorICAgIElmIHlvdSB3YW50IHRvIHNlYXJjaCB0aHJvdWdoIGFuIGFsaXN0LCB1c2UgYXNzb2MoKSBiZWNhdXNlCisgICAgbWVtYmVyX2FycmF5KCkgaXMgZ29vZCBmb3IgdW5zb3J0ZWQgYnV0IGFzc29jKCkgaXMgZmFzdGVyIGZvcgorICAgIHNvcnRlZCBhcnJheXMuCisgICAgICAgIAorICAgIEluIExETXVkIHRoaXMgZWZ1biBpcyB0ZW1wb3JhcmlseSBhIHNpbXVsYXRlZCBlZnVuIHVudGlsIGlzIGZpbmFsbHkKKyAgICBkcm9wcHBlZC4KKworSElTVE9SWQorICAgIFN1cGVyc2VlZGVkIGJ5IG1lbWJlcigpLgorICAgIFJlbW92ZWQgaW4gTERNdWQgMy4zLgorCitTRUUgQUxTTzoKKyAgICAgICAgYWxpc3RzKExQQyksIG1hcHBpbmdzKExQQyksIGFzc29jKEUpLCBzbGljZV9hcnJheShFKQorCisxMS4xMS4yMDA2IFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9vYnNvbGV0ZS9vYnNvbGV0ZSBiL2RvYy9vYnNvbGV0ZS9vYnNvbGV0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmU4MDVlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL29ic29sZXRlL29ic29sZXRlCkBAIC0wLDAgKzEsMTIgQEAKK05BTUUKKyAgICBvYnNvbGV0ZQorCitERVNDUklQVElPTgorICAgIFRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIGRlc2NyaXB0aW9ucyBmb3IgZmVhdHVyZXMgcmVtb3ZlZCBmcm9tCisgICAgdGhlIGdhbWUgZHJpdmVyLCBzaW5jZSB0aGV5IGNhbiBjb21lIGluIGhhbmR5IHdoZW4gcmV3b3JraW5nCisgICAgb2xkIExQQyBjb2RlLgorCitTRUUgQUxTTworICAgIGFwcGxpZWQoQSksIGVmdW4oRSksIG1hc3RlcihNKSwgY29uY2VwdHMoQyksIGxwYyhMUEMpLCBkcml2ZXIoRCkKKworMjkuMTAuMjAwNiBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2Mvb2Jzb2xldGUvb3JkZXJfYWxpc3QgYi9kb2Mvb2Jzb2xldGUvb3JkZXJfYWxpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJiMWMyMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9vYnNvbGV0ZS9vcmRlcl9hbGlzdApAQCAtMCwwICsxLDM2IEBACitWRVJBTFRFVAorU1lOT1BTSVMKKyAgICAgICAgbWl4ZWQgKm9yZGVyX2FsaXN0KG1peGVkICprZXlzLCBtaXhlZCAqZGF0YSwgLi4uKTsKKyAgICAgICAgbWl4ZWQgKm9yZGVyX2FsaXN0KG1peGVkICpsaXN0KTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIERpZXNlIEZ1bmt0aW9uIGVyemV1Z3QgZWluZSBBbGlzdC4KKworICAgICAgICBHaWJ0IG1hbiB6d2VpIG9kZXIgbWVociBBcmd1bWVudGUgYW4sIG11c3MgZGFzIGVyc3RlIEFyZ3VtZW50CisgICAgICAgIGVpbiBBcnJheSB2b24gS2V5cyBlbnRoYWx0ZW4sIGRpZSBuYWNoZm9sZ2VuZGVuIEFyZ3VtZW50ZQorICAgICAgICBzaW5kIEFycmF5cyB2b24gRGF0ZW5lbGVtZW50ZW4uIEFsbGUgPGRhdGE+IEFyZ3VtZW50ZSBtdWVzc2VuCisgICAgICAgIGRpZSBnbGVpY2hlIEdyb2Vzc2UgKGFsc28gZGllIGdsZWljaGUgQW56YWhsIEVsZW1lbnRlKSB3aWUgPGtleXM+CisgICAgICAgIGhhYmVuLgorCisgICAgICAgIEdpYnQgbWFuIG51ciBlaW4gQXJndW1lbnQgPGxpc3Q+IGFuLCBzbyBtdXNzIGVzIHNpY2ggZGFiZWkgdW0gZWluCisgICAgICAgIEFycmF5IGhhbmRlbG4sIGRhcyBhbHMgZXJzdGUgRWxlbWVudCBlaW4gQXJyYXkgdm9uIEtleXMgdW5kIGFscworICAgICAgICB3ZWl0ZXJlIEVsZW1lbnRlIEFycmF5cyBtaXQgRGF0ZW5lbGVtZW50ZW4gZW50aGFlbHQuIEFsbGUgRWxlbWVudGUKKyAgICAgICAgdm9uIDxsaXN0PiBtdWVzc2VuIGRpZSBnbGVpY2hlIEdyb2Vzc2UgaGFiZW4uCisKKyAgICAgICAgb3JkZXJfYWxpc3QoKSBsaWVmZXJ0IGVpbiBBcnJheSB6dXJ1ZWNrLCBkYXMgZGFzIHNvcnRpZXJ0ZSA8a2V5cz4KKyAgICAgICAgQXJyYXkgdW5kIGRpZSBnbGVpY2ggc29ydGllcnRlbiA8ZGF0YT4gQXJyYXlzIGVudGhhZWx0LiBBdWYgZGllCisgICAgICAgIDxkYXRhPiBBcnJheXMgd2lyZCBkaWUgZ2xlaWNoZSBQZXJtdXRhdGlvbiB3aWUgYXVmIGRhcyA8a2V5PiBBcnJheQorICAgICAgICBhbmdld2VuZGV0LgorCisgICAgICAgIERpZSBLb21wbGV4aXRhZXQgaXN0IE8obipsZyhuKStuKm0pLCB3b2JlaSBuIGRpZSBBbnphaGwgRWxlbWVudGUgaW0KKyAgICAgICAgPGtleXM+IEFycmF5IGRhcnN0ZWxsdCwgbSBkaWUgQW56YWhsIDxkYXRhPiBBcnJheXMgKyAxLgorCisgICAgICAgIERpZSBEaW1lbnNpb25lbiBkZXIgQXJyYXlzIHdlcmRlbiBnZWdlbnVlYmVyIExJU1AgZ2VuYXUgdW1nZWtlaHJ0CisgICAgICAgIHZlcndlbmRldCwgdW0gZWluIHNjaG5lbGxlcmVzIFN1Y2hlbiB6dSBlcm1vZWdsaWNoZW4uCisKKyAgICAgICAgS2V5cyBtdWVzc2VuIHZvbSBUeXAgSW50ZWdlciwgU3RyaW5nIG9kZXIgT2JqZWN0IHNlaW4uIERpZSBUeXBlbgorICAgICAgICBrb2VubmVuIGF1Y2ggZ2VtaXNjaHQgc2Vpbi4KKworU0lFSEUgQVVDSAorICAgICAgICBhbGlzdHMoTFBDKSwgbWFwcGluZ3MoTFBDKSwgaW5zZXJ0X2FsaXN0KEUpLCBhc3NvYyhFKSwKKyAgICAgICAgdHJhbnNwb3NlX2FycmF5KEUpCmRpZmYgLS1naXQgYS9kb2Mvb2Jzb2xldGUvcGFyc2VfY29tbWFuZCBiL2RvYy9vYnNvbGV0ZS9wYXJzZV9jb21tYW5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMzkxNjEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvb2Jzb2xldGUvcGFyc2VfY29tbWFuZApAQCAtMCwwICsxLDcyIEBACitpbnQgcGFyc2VfY29tbWFuZChzdHJpbmcgc3RyLCBtaXhlZCBzb3VyY2UsIHN0cmluZyBwYXR0ZXJuLCB2YXIxLCB2YXIyIC4uLik7CisKK1BhcnNlcyBjb21tYW5kcyBnaXZlbiBpbiAic3RyIiBhZ2FpbnN0IHRoZSBwYXR0ZXJuIGluICJwYXR0ZXJuIiBhbmQKK3JldHVybnMgMSBpZiBpdCBtYXRjaGVzLiAic291cmNlIiBpcyBlaXRoZXIgYW4gb2JqZWN0IG9yIGFuIGFycmF5IG9mIG9iamVjdHMuCitUaGlzIGlzIGVzc2VudGlhbGx5IGEgJ2hvdHRlZCcgc3NjYW5mIGFuZCBpdCBoYXMgYSBzaW1pbGFyIHN5bnRheCwgYWx0aG91Z2gKK3BhcnNlX2NvbW1hbmQgd29ya3Mgb24gd29yZCBiYXNpcyB3aGVyZSBzc2NhbmYgd29ya3Mgb24gY2hhcmFjdGVyIGJhc2lzLgorCisuaXAgc3RyCitHaXZlbiBjb21tYW5kCisuaXAgc291cmNlCitFaXRoZXIgYW4gYXJyYXkgaG9sZGluZyB0aGUgYWNjZXNzaWJsZSBvYmplY3RzLCBvcgorYW4gb2JqZWN0IGZyb20gd2hpY2ggdG8gcmVjdXJzZSBhbmQgY3JlYXRlCit0aGUgbGlzdCBvZiBhY2Nlc3NpYmxlIG9iamVjdHMsIG5vcm1hbGx5CitvYiA9IGVudmlyb25tZW50KHRoaXNfcGxheWVyKCkpIC4KKworLmlwIHBhdHRlcm4KK1BhcnNlIHBhdHRlcm4gYXMgbGlzdCBvZiB3b3JkcyBhbmQgZm9ybWF0czoKKy5uZgorCQlTeW50YXg6CisJCQknd29yZCcgCQlvYmxpZ2F0b3J5IHRleHQgKE9uZSB3b3JkKQorCQkJW3dvcmRdCQlvcHRpb25hbCB0ZXh0IChPbmUgd29yZCkKKwkJCS8JCUFsdGVybmF0aXZlIG1hcmtlcgorCQkJJW8JCVNpbmdsZSBpdGVtLCBvYmplY3QKKwkJCSVsCQlTaW5nbGUgbGl2aW5nIG9iamVjdAorCQkJJXMJCUFueSB0ZXh0IChtdWx0aXBsZSB3b3JkcykKKwkJCSV3ICAgICAgICAgICAgICBBbnkgd29yZAorCQkJJXAJCVByZXBvc2l0aW9uCisJCQklaQkJQW55IGl0ZW1zCisJCQklZCAgICAgICAgICAgICAgTnVtYmVyIDAtIG9yIHR4KDAtOTkpCisuZmkKK0V4YW1wbGUgc3RyaW5nOiAiICdnZXQnIC8gJ3Rha2UnICVpICIgLgorSXRlbXMgYXMgaW4gJW8gYW5kICVpIGNhbiBvbiBtYW55IGZvcm1zLCBzb21lIGV4YW1wbGVzOgorLm5mCisJCQlhcHBsZSwgdHdvIGFwcGxlcywgdHdlbnR5Zmlyc3QgYXBwbGUKKwkJCWFwcGxlcywgYWxsIGFwcGxlcywgYWxsIGdyZWVuIGFwcGxlcywgYWxsIGdyZWVuIG9uZXMKKy5maQorCisuaXAgdmFyTgorVGhpcyBpcyB0aGUgbGlzdCBvZiByZXN1bHQgdmFyaWFibGVzIGFzIGluIHNzY2FuZi4KK09uZSB2YXJpYWJsZSBpcyBuZWVkZWQgZm9yIGVhY2ggJV8uCitUaGUgcmV0dXJuIHR5cGVzIG9mIGRpZmZlcmVudCAlXyBpczoKKy5uZgorCSVvCVJldHVybnMgYW4gb2JqZWN0CisJJWwJUmV0dXJucyBhbiBvYmplY3QKKwklcwlSZXR1cm5zIGEgc3RyaW5nIG9mIHdvcmRzCisJJXcgICAgICBSZXR1cm5zIGEgc3RyaW5nIG9mIG9uZSB3b3JkCisJJXAJQ2FuIG9uIGVudHJ5IGhvbGQgYSBsaXN0IG9mIHdvcmQgaW4gYXJyYXkKKwkJb3IgYW4gZW1wdHkgdmFyaWFibGUKKwkJUmV0dXJuczoKKwkJICAgaWYgZW1wdHkgdmFyaWFibGU6IGEgc3RyaW5nCisJCSAgIGlmIGFycmF5OiBhcnJheVswXT1tYXRjaGVkIHdvcmQKKwklaQlSZXR1cm5zIGEgc3BlY2lhbCBhcnJheSBvbiB0aGUgZm9ybToKKwkJWzBdID0gKGludCkgZ2l2ZW4gbnVtZXJpYyBwcmVmaXgKKwkJICAgICAgID0wOiBhbGwgb3IgYSBwbHVyYWxmb3JtIGdpdmVuCisJCSAgICAgICA+MDogbnVtZXJhbCBnaXZlbjogdHdvLCB0aHJlZSwgZm91ci4uLgorCQkgICAgICAgPDA6IG9yZGVyIGdpdmVuOiBzZWNvbmQsIHRoaXJkIC4uLgorCQlbMS4ubl0gKG9iamVjdCkgT2JqZWN0cG9pbnRlcnMKKwkJICAgICAgIEEgbGlzdCBvZiB0aGUgUE9TU0lCTEUgb2JqZWN0cyB0aGF0IGNhbiBtYXRjaAorCQkgICAgICAgdGhlIGdpdmVuICVpLiBObyBjaG9vc2luZyBvZiB0aGlyZCBvciBzdWNoLgorCSVkICAgICAgUmV0dXJucyBhIG51bWJlcgorLmZpCisubHAKK0V4YW1wbGU6CisKK2E9cGFyc2VfY29tbWFuZCgidGFrZSBhcHBsZSIsZW52aXJvbm1lbnQodGhpc19wbGF5ZXIoKSksCisJICIgJ2dldCcgLyAndGFrZScgJWkgIixpdGVtcyk7CisKK0hJU1RPUlkKKyAgTERNdWQgMy4zLjI1OCBhbmQgTFAgIjAzLjAyLjFAMTUwIiByZW1vdmVkIHRoZSBjb21wYXQtbW9kZSAKKyAgcGFyc2VfY29tbWFuZCgpLgorCisyOS4xMC4yMDA2IFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9vYnNvbGV0ZS9xdWVyeV9pbXBfcG9ydCBiL2RvYy9vYnNvbGV0ZS9xdWVyeV9pbXBfcG9ydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmE3YzNkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL29ic29sZXRlL3F1ZXJ5X2ltcF9wb3J0CkBAIC0wLDAgKzEsMjEgQEAKKworICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICogIEFDSFRVTkc6IEVGVU4gRVhJU1RJRVJUIE5JQ0hUIE1FSFIhIE5JQ0hUIFZFUldFTkRFTiEgICoKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitTWU5PUFNJUzoKKwlpbnQgcXVlcnlfdWRwX3BvcnQodm9pZCkKKworREVTQ1JJUFRJT046CisJUmV0dXJucyB0aGUgcG9ydCBudW1iZXIgdGhhdCBpcyB1c2VkIGZvciB0aGUgaW50ZXIgbXVkCisJcHJvdG9jb2wuCisKK0hJU1RPUlkKKyAgTERNdWQgMy4yLjkgcmVuYW1lZCB0aGlzIGVmdW4gdG8gcXVlcnlfdWRwX3BvcnQoKS4gVGhpcyB2ZXJzaW9uCisgIGlzIGF2YWlsYWJsZSBpZiB0aGUgZHJpdmVyIGlzIGNvbXBpbGVkIHdpdGggVVNFX0RFUFJFQ0FURUQuCisgIFJlbW92ZWQgaW4gTERNdWQgMy4zIGFuZCBMUCAiMDMuMDIuMUAxNTAiLgorCitTRUUgQUxTTzoKKwlzZW5kX3VkcChFKSwgcmVjZWl2ZV91ZHAoTSkKKworMjkuMTAuMjAwNiBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2Mvb2Jzb2xldGUvcmVjZWl2ZV9pbXAgYi9kb2Mvb2Jzb2xldGUvcmVjZWl2ZV9pbXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQyZTc4ZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9vYnNvbGV0ZS9yZWNlaXZlX2ltcApAQCAtMCwwICsxLDI1IEBACisKKyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBBQ0hUVU5HOiBXSVJEIFZPTSBEUklWRVIgTklDSFQgTUVIUiBHRVJVRkVOISBOSUNIVCBWRVJXRU5ERU4hICoKKyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworU1lOT1BTSVMKKwl2b2lkIHJlY2VpdmVfdWRwKHN0cmluZyBob3N0LCBzdHJpbmcgbXNnLCBpbnQgaG9zdHBvcnQpCisKK0RFU0NSSVBUSU9OCisJSGFuZGxlIGEgcmVjZWl2ZWQgSU1QIG1lc3NhZ2UuCisKKwlUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZXZlcnkgbWVzc2FnZSByZWNlaXZlZCBvbiB0aGUgSU1QCisJcG9ydC4gVXN1YWxseSBpdCBpcyBwYXNzZWQgb24gdG8gc29tZSBvYmplY3QgdGhhdCBoYW5kbGVzCisJaW50ZXIgbXVkIGNvbW11bmljYXRpb25zLgorCitISVNUT1JZCisJVGhlICdob3N0cG9ydCcgYXJndW1lbnQgd2FzIGFkZGVkIGluIDMuMi4xLgorICBMRE11ZCAzLjIuOSByZW5hbWVkIHRoaXMgbWV0aG9kIHRvIHJlY2VpdmVfdWRwKCk7IHRoaXMgb2xkIHZlcnNpb24KKyAgaXMgc3VwcG9ydGVkIGlmIHRoZSBkcml2ZXIgaXMgY29tcGlsZWQgd2l0aCBVU0VfREVQUkVDQVRFRC4KKyAgUmVtb3ZlZCBpbiBMRE11ZCAzLjMgYW5kIExQICIwMy4wMi4xQDE1MCIuCisKK1NFRSBBTFNPCisJc2VuZF91ZHAoRSksIHF1ZXJ5X3VkcF9wb3J0KEUpCisKKzI5LjEwLjIwMDYgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL29ic29sZXRlL3NlbmRfaW1wIGIvZG9jL29ic29sZXRlL3NlbmRfaW1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZjhlNDAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvb2Jzb2xldGUvc2VuZF9pbXAKQEAgLTAsMCArMSwyMyBAQAorCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiAgQUNIVFVORzogRUZVTiBFWElTVElFUlQgTklDSFQgTUVIUiEgTklDSFQgVkVSV0VOREVOISAgKgorICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK1NZTk9QU0lTOgorCWludCBzZW5kX3VkcChzdHJpbmcgaG9zdCwgaW50IHBvcnQsIHN0cmluZyBtZXNzYWdlKQorCitERVNDUklQVElPTjoKKwlTZW5kcyBUaGUgbWVzc2FnZSBpbiBhbiBVRFAgcGFja2V0IHRvIHRoZSBnaXZlbiBob3N0IGFuZCBwb3J0CisJbnVtYmVyLiBDYXVzZXMgYSBwcml2aWxlZ2UgdmlvbGF0aW9uLgorCVJldHVybnMgMSBvbiBzdWNjZXNzLCAwIG9uIGZhaWx1cmUuCisKK0hJU1RPUlkKKyAgTERNdWQgMy4yLjkgcmVuYW1lZCB0aGlzIGVmdW4gdG8gc2VuZF91ZHAoKSwgYW5kIGFsc28gY2hhbmdlZCB0aGUKKyAgcHJpdmlsZWdlIHZpb2xhdGlvbiBzdHJpbmcgYW5kIHRoZSBhcHBseSBuYW1lcy4gVGhpcyBvbGQgdmVyc2lvbgorICBpcyBhdmFpbGFibGUgaWYgdGhlIGRyaXZlciBpcyBjb21waWxlZCB3aXRoIFVTRV9ERVBSRUNBVEVELgorICBSZW1vdmVkIGluIExETXVkIDMuMyBhbmQgTFAgIjAzLjAyLjFAMTUwIi4KKworU0VFIEFMU086CisJcmVjZWl2ZV91ZHAoTSkKKworMjkuMTAuMjAwNiBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2Mvb2Jzb2xldGUvc2V0X2F1dG9faW5jbHVkZV9zdHJpbmcgYi9kb2Mvb2Jzb2xldGUvc2V0X2F1dG9faW5jbHVkZV9zdHJpbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWEzODIzZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9vYnNvbGV0ZS9zZXRfYXV0b19pbmNsdWRlX3N0cmluZwpAQCAtMCwwICsxLDI4IEBACisKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqICBBQ0hUVU5HOiBFRlVOIEVYSVNUSUVSVCBOSUNIVCBNRUhSISBOSUNIVCBWRVJXRU5ERU4hICAqCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworU1lOT1BTSVMKKyAgICAgICAgdm9pZCBzZXRfYXV0b19pbmNsdWRlX3N0cmluZyAoc3RyaW5nIGFyZykKKworREVTQ1JJUFRJT04KKworICAgICAgICBUaGUgYXJnIHdpbGwgYmUgYXV0b21hdGljYWxseSBpbmNsdWRlZCBpbnRvIGV2ZXJ5IGNvbXBpbGVkIExQQworICAgICAgICBvYmplY3QuIFRoaXMgaXMgdXNlZnVsIHRvIGVuZm9yY2UgZ2xvYmFsIGRlZmluaXRpb25zLCBlLmcuCisgICAgICAgIGBgI3ByYWdtYSBjb21iaW5lX3N0cmluZ3MnJyBvciBgYCNwcmFnbWEgc3RyaWN0X3R5cGVzJycuICBUaGUKKyAgICAgICAgY2FsbGluZyBvYmplY3QgbmVlZHMgdG8gYmUgcHJpdmlsZWdlZCBieSB0aGUgbWFzdGVyIG9iamVjdC4KKworICAgICAgICBOb3RlIHRoYXQgdGhlIGF1dG8taW5jbHVkZS1zdHJpbmcgaXMgY2xlYXJlZCB3aGVuIHRoZSBtYXN0ZXIKKyAgICAgICAgb2JqZWN0IGlzIHJlbG9hZGVkLgorCitISVNUT1JZCisgICAgICAgIExETXVkIDMuMi45IHJlcGxhY2VkIHRoaXMgZWZ1biB3aXRoIGRyaXZlciBob29rIEhfQVVUT19JTkNMVURFLgorICAgICAgICAgIFRoaXMgb2xkIHZlcnNpb24gaXMgYXZhaWxhYmxlIGlmIHRoZSBkcml2ZXIgaXMgY29tcGlsZWQKKyAgICAgICAgICB3aXRoIFVTRV9ERVBSRUNBVEVELgorICAgICAgICBSZW1vdmVkIGluIExETXVkIDMuMy4KKworU0VFIEFMU08KKyAgICAgICAgc2V0X2RyaXZlcl9ob29rKEUpLCBwcml2aWxlZ2VfdmlvbGF0aW9uKE0pLCBwcmFnbWEoTFBDKSwgbWFzdGVyKE0pCisKKzI5LjEwLjIwMDYgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL29ic29sZXRlL3NsaWNlX2FycmF5IGIvZG9jL29ic29sZXRlL3NsaWNlX2FycmF5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMGJkYzkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvb2Jzb2xldGUvc2xpY2VfYXJyYXkKQEAgLTAsMCArMSwyNyBAQAorCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiAgQUNIVFVORzogRUZVTiBFWElTVElFUlQgTklDSFQgTUVIUiEgTklDSFQgVkVSV0VOREVOISAgKgorICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK1NZTk9QU0lTCisgICAgICAgIG1peGVkICpzbGljZV9hcnJheShtaXhlZCAqYXJyYXksIGludCBmcm9tLCBpbnQgdG8pCisKK0RFU0NSSVBUSU9OCisJRE8gTk9UIFVTRSBUSElTIEVGVU4gQU5ZTU9SRS4gSVQgSEFTIEJFRU4gUkVNT1ZFRCBGUk9NIFRIRSBEUklWRVIuCisKKyAgICAgICAgUmV0dXJucyBhbiBhcnJheSB0aGF0IGlzIGEgc2xpY2Ugb2YgdGhlIGFycmF5IDxhcnI+IGZyb20gdGhlCisgICAgICAgIGluZGV4IDxmcm9tPiB0byB0aGUgaW5kZXggPHRvPi4KKworICAgICAgICBUaGlzIGlzIHRoZSBvbGQgbm90YXRpb24gZm9yIGFycltmcm9tLi50b10gYW5kIHN1cHBvcnRlZAorICAgICAgICBvbmx5IGZvciBoeXN0ZXJpY2FsIHJhaXNpbnMuCisKKyAgICAgICAgSW4gTERNdWQgdGhpcyBlZnVuIGlzIHRlbXBvcmFyaWx5IGEgc2ltdWxhdGVkIGVmdW4gdW50aWwgaXMgZmluYWxseQorICAgICAgICBkcm9wcHBlZC4KKworSElTVE9SWQorICAgICAgICBSZW1vdmVkIGluIExETXVkIDMuMy4KKworU0VFIEFMU08KKyAgICAgICAgW10oRSkKKworMTEuMTEuMjAwNiBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvcGNtZC8ucmVhZG1lIGIvZG9jL3BjbWQvLnJlYWRtZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODkxMzI3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BjbWQvLnJlYWRtZQpAQCAtMCwwICsxLDQgQEAKK0hpZXIgbGllZ2VuIEhpbGZlbiB6dSBkZW4gQmVmZWhsZW4sIHVlYmVyIGRpZSBtYW4gc2Nob24gYWxzIG5vcm1hbGVyCitTcGllbGVyIHZlcmZ1ZWd0LgorU2VoZXItIHVuZCBNYWdpZXJiZWZlaGxlIHNpbmQgYW5kZXJub3J0cyBkb2t1bWVudGllcnQuCisKZGlmZiAtLWdpdCBhL2RvYy9wY21kLy5zeW5vbnltIGIvZG9jL3BjbWQvLnN5bm9ueW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQyNTAyNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wY21kLy5zeW5vbnltCkBAIC0wLDAgKzEsNjcgQEAKK2FsaSBhbGlhcworYW5zaSBzdHR5CithdXMgYXVzZ2FlbmdlCithdXNnYW5nIGF1c2dhZW5nZQorYmV0cmFjaHRlIHNjaGF1CitiZXRyIHNjaGF1CitibGluZCBncmFmaWsKK2JsaW5kaGVpdCBncmFmaWsKK2Rpc2Nvbm5lY3Qgc2NobGFmZQorZHVyY2hzdWNoZSBzdWNoZQorZWJlbmUgZWJlbmVuCistIGViZW5lbgorOyBlbW90ZQorOiBlbW90ZQorZXJ6YWVobGUgdGVpbGUKK2VyemFlaGwgdGVpbGUKK2ZhcmJlbiBzdHR5CitmYXJiZSBzdHR5CitmbHVlc3RlciBmbHVlc3RlcmUKK2ZyYWcgZnJhZ2UKK2dlbW90ZSBlbW90ZQoraGlzdCBoaXN0b3J5CitoaXN0bGVuIGhpc3RvcnkKK2hpc3RtaW4gaGlzdG9yeQorXiBoaXN0b3J5CismIGhpc3RvcnkKK2lnbm9yaWVyIGlnbm9yaWVyZQoraSBpbnZlbnR1cgoraW52IGludmVudHVyCitrYW5hZWxlIGViZW5lbgora2FuYWwgZWJlbmVuCitrZWVwYWxpdmUgdGVsbmV0Citra3dobyBra3dlcgora2xldHRlciBrbGV0dGVyZQora3dobyBrd2VyCitsYXNzIHdpcmYKK2xlc2UgbGllcworbWQgZGV0YWlsCittcnVmIG1ydWZlCitwYXNzd2QgcGFzc3dvcnQKK3Bhc3N3b3JkIHBhc3N3b3J0CitwdW5rdGUgaW5mbworcXVpdCBlbmRlCityZmx1ZXN0ZXIgcmZsdWVzdGVyZQorcmllY2ggcmllY2hlCitya251ZGRlbCBya251ZGRsZQorcnVmIHJ1ZmUKK3J3aW5rIHJ3aW5rZQorc2FnIHNhZ2UKK3NhdmUgc3BlaWNoZXJuCitzY2hsYWYgc2NobGFmZQorc2NobnVwcGVyZSByaWVjaGUKK3NjaG51cHBlciByaWVjaGUKK3Njb3JlIGluZm8KK3N0ZWNrIHN0ZWNrZQorc3VjaCBzdWNoZQordGVybWluYWwgc3R0eQordG0gdGVpbGUKK3VuYWxpIHVuYWxpYXMKK3VudGVyc3VjaGUgc2NoYXUKK3VudCBzY2hhdQordnQxMDAgc3R0eQord2VyZmUgd2lyZgord2VyZiB3aXJmCit3aG8gd2VyCit6aWVoIHppZWhlCit6dWVjayB6dWVja2UKZGlmZiAtLWdpdCBhL2RvYy9wY21kL2FkdmVyYiBiL2RvYy9wY21kL2FkdmVyYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGIzMDA4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BjbWQvYWR2ZXJiCkBAIC0wLDAgKzEsNjQgQEAKKworYWR2ZXJiCistLS0tLS0KKworIEtPTU1BTkRPOgorICAgIGFkdmVyYiA8YWJrPiA8dGV4dD4KKyAgICBhZHZlcmIgWyAjIHwgJCBdCisgICAgYWR2ZXJiID8gPGFiaz4KKyAgICBhZHZlcmIgPGFiaz4KKworIEFSR1VNRU5URToKKworICAgICA8YWJrPgorICAgICAgICBFaW5lIEFia3Vlcnp1bmcgZnVlciBlaW4gQWR2ZXJiCisgICAgIDx0ZXh0PgorICAgICAgICBEZXIgVGV4dCBkZXMgQWR2ZXJicworCisgQkVTQ0hSRUlCVU5HOgorCisgICAgTWl0IEFkdmVyYmllbiBrb2VubmVuIGVpbmlnZSBWZXJiZW4gZ2VuYXVlciBiZXNjaHJpZWJlbiB3ZXJkZW4uIFNvCisgICAga2FubiBtYW4gZWluZmFjaCBudXIgbGFlY2hlbG4gKGxhZWNoZWwpLCBnbHVlY2tsaWNoIGxhZWNoZWxuIChsYWVjaGVsIAorICAgIGdsdWUpIG9kZXIgc2Nyb2xsZW4gKGxhZWNoZWwgc3RyYSB1bmQgZ2x1ZSB1bmQgc3RvbCB1bmQgdmVycykuIE1pdAorICAgIGVpbmVtIC8ga2FubiBtYW4gYW4gZGFzIFZlcmIgbm9jaCBldHdhcyBlaWdlbmVzIGVpbmZ1ZWdlbiAoamFtbWVyZSAKKyAgICBsYXV0IHVuZCAvd2llIGVzIG51ciBaYXViZXJlciBrb2VubmVuKS4KKworICAgIE1pdCBkZW0gS29tbWFuZG8gYWR2ZXJiIGthbm4gbWFuIGRpZSBkZWZpbmllcnRlbiBBZHZlcmJpZW4gYW56ZWlnZW4KKyAgICBsYXNzZW4gb2RlciBhdWNoIGVpZ2VuZSBBZHZlcmJpZW4gZGVmaW5pZXJlbi4gRGllIGVpbnplbG5lbiBBdWZydWZlCisgICAgaGFiZW4gZm9sZ2VuZGUgRnVua3Rpb246CisKKyAgICAxLiBFcyB3aXJkIGVpbiBuZXVlcyBBZHZlcmIgbWl0IGRlciBBYmt1ZXJ6dW5nIDxhYms+IHp1IGRlbSBUZXh0IDx0ZXh0PgorICAgICAgIGRlZmluaWVydC4gRGllIEFia3Vlcnp1bmcga2FubiBlaW5lbiBiaXMgc2VjaHMgQnVjaHN0YWJlbiBsYW5nIHNlaW4uCisKKyAgICAyLiBPaG5lIHdlaXRlcmUgUGFyYW1ldGVyIHdpcmQgZGllIGtvbXBsZXR0ZSBBZHZlcmJpZW5saXN0ZSBhbmdlemVpZ3QuCisgICAgICAgYGFkdmVyYiAjJyB6ZWlndCBudXIgZGllIHNlbGJzdGRlZmluaWVydGVuIEFkdmVyYmllbiBhbiwgd2FlaHJlbmQKKyAgICAgICBgYWR2ZXJiICQnIG51ciBkaWUgU3RhbmRhcmRhZHZlcmJpZW4gYW56ZWlndC4KKworICAgIDMuIEVzIHdpcmQgZ2VwcnVlZnQsIG9iIGVzIHNjaG9uIGVpbiBBZHZlcmIgenUgZGVyIEFia3Vlcnp1bmcgPGFiaz4gZ2lidC4KKworICAgIDQuIERhcyBBZHZlcmIgbWl0IGRlciBBYmt1ZXJ6dW5nIDxhYms+IHdpcmQgYXVzIGRlciBMaXN0ZSBnZWxvZXNjaHQuIERpZXMKKyAgICAgICBnZWh0IGplZG9jaCBudXIgbWl0IHNlbGJzdGRlZmlpbmllcnRlbiBBZHZlcmJpZW4sIG5pY2h0IG1pdCBkZW4KKyAgICAgICBTdGFuZGFyZGFkdmVyYmllbiEKKworIEJFSVNQSUVMRToKKyAgICBFaW4gQWR2ZXJiIGByYXRsb3MnIG1pdCBkZXIgQWJrdWVyenVuZyBgcmF0JyB3aXJkIGdlc2NoYWZmZW46CisKKyAgICA+IGFkdmVyYiByYXQgcmF0bG9zCisgICAgT0ssIG5ldWVzIEFkdmVyYiAicmF0bG9zIiBtaXQgZGVyIEFia3Vlcnp1bmcgInJhdCIuCisKKyAgICBXaXIgc2VoZW4gbmFjaCwgd2llIGByYXQnIGRlZmluaWVydCBpc3Q6CisKKyAgICA+IGFkdmVyYiA/IHJhdAorICAgIERpZSBBYmt1ZXJ6dW5nIHJhdCBnZWhvZXJ0IHp1bSBBZHZlcmI6CisgICAgcmF0bG9zCisKKyAgICBXaXIgbG9lc2NoZW4gZXMgd2llZGVyOgorCisgICAgPiBhZHZlcmIgcmF0CisgICAgT0ssIEFkdmVyYiAicmF0bG9zIiBnZWxvZXNjaHQuCisKKyBTSUVIRSBBVUNIOgorICAgIHZlcmJlbiwgYWR2ZXJiaWVuCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFRodSwgMjkuMDMuMjAwOCwgMTI6MDA6MDAgdm9uIFZhbmlvbgpkaWZmIC0tZ2l0IGEvZG9jL3BjbWQvYWxpYXMgYi9kb2MvcGNtZC9hbGlhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDI2ZjVjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BjbWQvYWxpYXMKQEAgLTAsMCArMSwxMDAgQEAKKworYWxpYXMKKy0tLS0tCisKKyBLT01NQU5ETzoKKyAgICBhbGlhcyA8YWxpYXM+IDxiZWZlaGw+CisgICAgYWxpYXMgWyAtYSBdIFsgPGFsaWFzPiB8IDxhYms+KiBdCisKKyBBUkdVTUVOVEU6CisKKyAgICAgPGFsaWFzPgorICAgICAgICBEZXIgTmFtZSBkZXMgQWxpYXMKKyAgICAgPGJlZmVobD4KKyAgICAgICAgRGVyIFRleHQsIGR1cmNoIGRlbiBkYXMgQWxpYXMgZXJzZXR6dCB3aXJkCisgICAgIDxhYms+CisgICAgICAgIERpZSBBYmt1ZXJ6dW5nIGVpbmVzIEFsaWFzCisgICAgIC1hCisgICAgICAgIE9wdGlvbiwgdW0gQWxpYXNlIHNvIGF1c3p1Z2ViZW4sIHdpZSBtYW4gc2llIGRlZmluaWVydAorCisgQkVTQ0hSRUlCVU5HOgorICAgIChTdGF0dCBgYWxpYXMnIGthbm4gbWFuIGF1Y2ggYGFsaScgdmVyd2VuZGVuISkKKworICAgIE1pdCBkaWVzZW0gS29tbWFuZG8ga2FubiBtYW4gc2ljaCBBYmt1ZXJ6dW5nZW4gZnVlciBvZnQgYmVudXR6dGUgQmVmZWhsZQorICAgIGVyc3RlbGxlbiBzb3dpZSBkaWUgc2Nob24gZGVmaW5pZXJ0ZW4gQWxpYXNlIGFuc2VoZW4uCisKKyAgICBEZWZpbmllcnQgd2lyZCBlaW4gQWxpYXMgbWl0IGRlbSBlcnN0ZW4gZGVyIG9iaWdlbiBLb21tYW5kb3MuIDxhbGlhcz4gZGFyZgorICAgIGRhYmVpIG51ciBlaW4gV29ydCB1bWZhc3Nlbiwgd2FlaHJlbmQgPGJlZmVobD4gYmVsaWViaWcgbGFuZyBzZWluIGRhcmYuCisKKyAgICBXZW5uIER1IHZvbiBudW4gYW4gZGFzIEFsaWFzIGVpbmdpYnN0LCBzbyBmdWVocnN0IER1IGRlbiBhdXNnZXNjaHJpZWJlbmVuCisgICAgQmVmZWhsIHdvcnR3b2VydGxpY2ggYXVzLiBEaWUgZm9sZ2VuZGVuIFdvcnRlIGltIGF1c2dlc2NocmllYmVuZW4gQmVmZWhsCisgICAgaGFiZW4gamVkb2NoIGVpbmUgYmVzb25kZXJlIEJlZGV1dHVuZzoKKworICAgICAkKiAgICAgIFN0ZWh0IGZ1ZXIgYWxsZXMsIHdhcyBhdWYgZGFzIEFsaWFzIGZvbGd0LgorICAgICAkPG4+ICAgIFN0ZWh0IGZ1ZXIgZGFzIDxuPnRlIFdvcnQgbmFjaCBkZW0gQWxpYXMuCisgICAgICQ8bj4qICAgU3RlaHQgZnVlciBhbGxlIFdvcnRlIGFiIGRlbSA8bj50ZW4gKGVpbnNjaGxpZXNzbGljaCkuCisKKyAgICBNaXQgZGVtIHp3ZWl0ZW4gZGVyIG9iaWdlbiBLb21tYW5kb3Mga2FubnN0IER1IERpciBkaWUgQWxpYXNlIGFuemVpZ2VuCisgICAgbGFzc2VuLiBPaG5lIFBhcmFtZXRlciB3ZXJkZW4gZGFiZWkgc2FlbXRsaWNoZSBBbGlhc2UgYW5nZXplaWd0LCBtaXQKKyAgICBgYWxpYXMgPGFsaWFzPicgd2lyZCBkaWUgRGVmaW5pdGlvbiB2b24gPGFsaWFzPiBhbmdlemVpZ3QsIHVuZCBtaXQgYGFsaWFzCisgICAgPGFiaz4qJyB3ZXJkZW4gYWxsZSBBbGlhc2UgZ2V6ZWlndCwgZGllIG1pdCA8YWJrPiBiZWdpbm5lbi4KKworICAgIE5pbW10IG1hbiBkaWUgT3B0aW9uIC1hIGhpbnp1IChudXIgc2lubnZvbGwsIHdlbm4gbWFuIHNpY2ggQWxpYXNlIGFuemVpZ2VuCisgICAgbGFlc3N0KSwgc28gd2VyZGVuIGRpZSBBbGlhc2Ugc28gYW5nZXplaWd0LCBkYXNzIGRlciBUZXh0IGN1dC1hbmQtcGFzdGUtCisgICAgZmFlaGlnIGlzdCwgZC5oLiBtYW4ga2FubiBkZW4gVGV4dCBzbyBhbHMgQmVmZWhsIGVpbmdlYmVuLCB3aWUgZXIgYXVzLQorICAgIGdlZ2ViZW4gd2lyZCAoei5CLiB1bSBlaW5lbSBad2VpdGNoYXJha3RlciBhbGlhc2VzIGRlcyBFcnN0Y2hhcmFrdGVycyB6dQorICAgIGdlYmVuKS4KKworICAgIFNvbGwgZGFzIFplaWNoZW4gIiQiIG9kZXIgZGFzIFplaWNoZW4gIiYiIGltIEFsaWFzIHZvcmtvbW1lbiAoIiYiIGlzdCBhdXMKKyAgICBoaXN0b3Jpc2NoZW4gR3J1ZW5kZW4gZ2VuYXUgd2llICIkIiBiZW51dHpiYXIpLCBzbyBtdXNzIGVzIG1pdCBlaW5lbSBcCisgICAgImdlcXVvdGVkIiB3ZXJkZW4uIFNvbGwgZWluIFwgdm9ya29tbWVuLCBtdXNzIGF1Y2ggZGllc2VyIGdlcXVvdGVkIHdlcmRlbgorICAgIChcXCkuCisKKyAgICBCZWdpbm50IGVpbmUgQmVmZWhsc3plaWxlIG1pdCBlaW5lbSAiXCIsIHNvIHdlcmRlbiBkaWUgQWxpYXNlIG5pY2h0CisgICAgZXJzZXR6dC4gV2VubiBtYW4gYWxzIEFsaWFzbmFtZW4gZWluZW4gYXVjaCBzb25zdCBndWVsdGlnZW4gQmVmZWhsCisgICAgdmVyd2VuZGV0LCBrYW5uIG1hbiBhdWYgZGllc2UgV2Vpc2UgYXVmIGRlbiBlaWdlbnRsaWNoZW4gQmVmZWhsIHp1Z3JlaWZlbi4KKworIEJFSVNQSUVMRToKKyAgICBFcnN0IG1hbCBlaW4gcGFhciAobWVociBvZGVyIHdlbmlnZXIgbnVldHpsaWNoZSkgQWxpYXNlIGFubGVnZW46CisKKyAgICA+IGFsaWFzIHVsIHVudGVyc3VjaGUgbGVpY2hlCisgICAgPiBhbGlhcyB0bWggdGVpbGUgaGlnaGxhbmRlciBtaXQgJCoKKyAgICA+IGFsaWFzIHRteiB0ZWlsZSB6b29rIG1pdCAkKgorICAgID4gYWxpYXMgd2VnIHRlaWxlICQxIG1pdCBJY2ggYmluIGpldHp0IHdlZywgXCQgdmVyZGllbmVuIQorCisgICAgV2VubiBtYW4gc2ljaCBkaWUgQWxpYXNlIGFuc2VoZW4gd2lsbDoKKworICAgID4gYWxpYXMKKyAgICAgdG1oICAgID0gdGVpbGUgaGlnaGxhbmRlciBtaXQgJCoKKyAgICAgdWwgICAgID0gdW50ZXJzdWNoZSBsZWljaGUKKyAgICAgd2VnICAgID0gdGVpbGUgJDEgbWl0IEljaCBiaW4gamV0enQgd2VnLCBcJCB2ZXJkaWVuZW4hCisKKyAgICA+IGFsaWFzIHdlZworICAgICB3ZWcgICAgPSB0ZWlsZSAkMSBtaXQgSWNoIGJpbiBqZXR6dCB3ZWcsIFwkIHZlcmRpZW5lbiEKKworICAgID4gYWxpYXMgdG0qCisgICAgIHRtaCAgICA9IHRlaWxlIGhpZ2hsYW5kZXIgbWl0ICQqCisgICAgIHRteiAgICA9IHRlaWxlIHpvb2sgbWl0ICQqCisKKyAgICBVbmQgZm9sZ2VuZGVybWFzc2VuIGxhc3NlbiBzaWNoIGRpZSBBbGlhc2UgYmVudXR6ZW46CisKKyAgICA+IHRtaCBIaSBTaGVyaWZmIQorICAgIER1IHRlaWxzdCBIaWdobGFuZGVyIG1pdDogSGkgU2hlcmlmZiEKKworICAgID4gdG16IE9oIG1laW4gR290dCEgOi0pCisgICAgRHUgdGVpbHN0IFpvb2sgbWl0OiBPaCBtZWluIEdvdHQhCisKKyAgICA+IHdlZyBib2luZworICAgIER1IHRlaWxzdCBCb2luZyBtaXQ6IEljaCBiaW4gamV0enQgd2VnLCAkIHZlcmRpZW5lbiEKKworICAgID4gXHdlZyBBcmJlaXRlbi4uLgorICAgIER1IGJpc3QgamV0enQgYWxzIGFid2VzZW5kIGdla2VubnplaWNobmV0LgorCisgICAgRGFzIGxldHp0ZSBCZWlzcGllbCB6ZWlndCwgd2llIG1hbiBhbiBlaW5lbiBCZWZlaGwga29tbXQsIGRlciB2b24gZWluZW0KKyAgICBBbGlhcyAidWViZXJsYWRlbiIgd3VyZGUuCisKKyBTSUVIRSBBVUNIOgorICAgIHVuYWxpYXMsIGVyc2V0enVuZ3NhbnplaWdlCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFRodSwgMTEuMDMuMTk5OSwgMTU6MzA6MDAgdm9uIEhpZ2hsYW5kZXIKZGlmZiAtLWdpdCBhL2RvYy9wY21kL2FuZ3JpZmZzbWVsZHVuZyBiL2RvYy9wY21kL2FuZ3JpZmZzbWVsZHVuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjdjYTU0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BjbWQvYW5ncmlmZnNtZWxkdW5nCkBAIC0wLDAgKzEsNTQgQEAKKworYW5ncmlmZnNtZWxkdW5nCistLS0tLS0tLS0tLS0tLS0KKworIEtPTU1BTkRPOgorICAgIGFuZ3JpZmZzbWVsZHVuZyBhbi9laW4gfCBhdXMKKworIEJFU0NIUkVJQlVORzoKKyAgICBTY2hhbHRldCBkaWUgQW56ZWlnZSBkZXIgQW5ncmlmZnNtZWxkdW5nOgorICAgID4gRHUgZ3JlaWZzdCBYWVogbWl0IEFCQyBhbi4KKyAgICBmdWVyIGplZGUgS2FtcGZydW5kZSBlaW4gb2RlciBhdXMuCisgICAgCisgICAgSXN0ICJhbmdyaWZmc21lbGR1bmciIGF1c2dlc2NoYWx0ZXQsIGJla29tbXQgbWFuIG51ciBuZXVlCisgICAgQW5ncmlmZnNtZWxkdW5nZW4gKHpCIGJlaSBXYWZmZW53ZWNoc2Vsbikgdm9uIHNpY2ggYW5nZXplaWd0LgorCisgICAgSXN0IHNpZSBlaW5nZXNjaGFsdGV0LCBiZWtvbW10IG1hbiBpbiBqZWRlciBLYW1wZnJ1bmRlIGF1Y2gKKyAgICBkaWUgZWlnZW5lIEFuZ3JpZmZzbWVsZHVuZyBhbmdlemVpZ3QuCisKKyBCRUlTUElFTDoKKyAgICA+IGFuZ3JpZmZzbWVsZHVuZyBhbgorICAgIER1IHNpZWhzdCBzYWVtdGxpY2hlIEFuZ3JpZmZzbWVsZHVuZ2VuIHZvbiBEaXIuCisgICAgPiB0b2V0ZSBncmlsbGUKKyAgICBPay4KKyAgICBEdSBncmVpZnN0IGRpZSBHcmlsbGUgbWl0IGJsb3NzZW4gSGFlbmRlbiBhbi4gICA8LS0KKyAgICBEdSB0cmlmZnN0IGVpbmUgR3JpbGxlIGhhcnQuCisgICAgRGllIEdyaWxsZSBncmVpZnQgRGljaCBhbi4KKyAgICBFaW5lIEdyaWxsZSBraXR6ZWx0IERpY2ggYW0gQmF1Y2guCisgICAgRHUgZ3JlaWZzdCBkaWUgR3JpbGxlIG1pdCBibG9zc2VuIEhhZW5kZW4gYW4uICAgPC0tCisgICAgRHUgdHJpZmZzdCBlaW5lIEdyaWxsZSBoYXJ0LgorICAgIERpZSBHcmlsbGUgZ3JlaWZ0IERpY2ggYW4uCisgICAgRWluZSBHcmlsbGUgdmVyZmVobHQgRGljaC4KKyAgICBEdSBncmVpZnN0IGRpZSBHcmlsbGUgbWl0IGJsb3NzZW4gSGFlbmRlbiBhbi4gICA8LS0KKyAgICBEdSB0cmlmZnN0IGVpbmUgR3JpbGxlIHNlaHIgaGFydC4KKworICAgID4gYW5ncmlmZnNtZWxkdW5nIGF1cworICAgIER1IHNpZWhzdCBudXIgbmV1ZSBBbmdyaWZmc21lbGR1bmdlbiB2b24gRGlyLgorICAgID4gdG9ldGUgZ3JpbGxlCisgICAgT2suCisgICAgRHUgZ3JlaWZzdCBkaWUgR3JpbGxlIG1pdCBibG9zc2VuIEhhZW5kZW4gYW4uICAgPC0tCisgICAgRHUgdHJpZmZzdCBlaW5lIEdyaWxsZSBoYXJ0LgorICAgIERpZSBHcmlsbGUgZ3JlaWZ0IERpY2ggYW4uCisgICAgRWluZSBHcmlsbGUgdmVyZmVobHQgRGljaC4KKyAgICBEdSB0cmlmZnN0IGVpbmUgR3JpbGxlIGhhcnQuCisgICAgRWluZSBHcmlsbGUgdmVyZmVobHQgRGljaC4KKyAgICBEdSB0cmlmZnN0IGVpbmUgR3JpbGxlIGhhcnQuCisgICAgRWluZSBHcmlsbGUgdmVyZmVobHQgRGljaC4KKyAgICBEdSB0cmlmZnN0IGVpbmUgR3JpbGxlIGhhcnQuCisgICAgPiB6dWVjayBkb2xjaAorICAgIER1IHp1ZWNrc3QgZGVuIFRyb2xsZG9sY2guCisgICAgRHUgZ3JlaWZzdCBkaWUgR3JpbGxlIG1pdCBkZW0gVHJvbGxkb2xjaCBhbi4gICAgPC0tCisgICAgRHUga3JhdHp0IGVpbmUgR3JpbGxlLgorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICAxLlNlcHRlbWJlciAyMDA4IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvcGNtZC9hbnR3b3J0ZSBiL2RvYy9wY21kL2FudHdvcnRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwOGRjMTUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcGNtZC9hbnR3b3J0ZQpAQCAtMCwwICsxLDIyIEBACisKK2FudHdvcnRlCistLS0tLS0tLQorCisgS09NTUFORE86CisgICAgYW50d29ydGUgWzx3ZW0+XSA8d2FzPgorCisgQVJHVU1FTlRFOgorCisgICAgIDx3ZW0+IChvcHRpb25hbCkKKyAgICAgICAgRGFzIExlYmV3ZXNlbiwgZGVtIER1IGFudHdvcnRlbiB3aWxsc3QKKyAgICAgPHdhcz4KKyAgICAgICAgRGllIEFudHdvcnQKKworIEJFU0NIUkVJQlVORzoKKyAgICBNYW4gYmVhbnR3b3J0ZXQgZWluZSBGcmFnZS4KKworIFNJRUhFIEFVQ0g6CisgICAgZnJhZ2UsIHNhZ2UsIGdlc3ByYWVjaAorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBUaHUsIDI0LjA3LjE5OTcsIDA5OjAwOjAwIHZvbiBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9wY21kL2F1c2dhZW5nZSBiL2RvYy9wY21kL2F1c2dhZW5nZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDU1NzM0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BjbWQvYXVzZ2FlbmdlCkBAIC0wLDAgKzEsMjggQEAKKworYXVzZ2FlbmdlCistLS0tLS0tLS0KKworIEtPTU1BTkRPOgorICAgIGF1c2dhZW5nZSBbYXV0b10KKyAgICBhdXNnYW5nIFthdXRvXQorICAgIGF1cyBbYXV0b10KKworIEFSR1VNRU5URToKKworICAgICBhdXRvIChvcHRpb25hbCkKKyAgICAgICAgU2NoYWx0ZXQgYXV0b21hdGlzY2hlIEF1c2dhbmdzYW56ZWlnZSBhdXMvZWluCisKKyBCRVNDSFJFSUJVTkc6CisgICAgTWl0IGBhdXNnYWVuZ2UnIHdlcmRlbiBhbGxlIHVubWl0dGVsYmFyIHNpY2h0YmFyZW4gQXVzZ2FlbmdlIGF1cyBkZW0gUmF1bSwKKyAgICBpbiBkZW0gbWFuIHNpY2ggZ2VyYWRlIGJlZmluZGV0LCBhdXNnZWdlYmVuLiBEaWVzZXIgQmVmZWhsIGlzdCB2b24gTnV0emVuLAorICAgIHdlbm4gbWFuIHNpY2ggZGllIFJhdW1iZXNjaHJlaWJ1bmcgbmljaHQgZHVyY2hsZXNlbiB3aWxsLiBNaXQgYGF1c2dhbmcKKyAgICBhdXRvJyB3ZXJkZW4gZGllIHVubWl0dGVsYmFyIHNpY2h0YmFyZW4gQXVzZ2FlbmdlIGF1dG9tYXRpc2NoIGF1c2dlZ2ViZW4sCisgICAgZWluIHdlaXRlcmVzIGBhdXNnYW5nIGF1dG8nIHNjaGFsdGV0IGRpZSBhdXRvbWF0aXNjaGUgQW56ZWlnZSB3aWVkZXIgYWIuCisKKyAgICAqQWJlcio6IEVzIGdpYnQgUmFldW1lLCBkaWUgdmVyc3RlY2t0ZSBBdXNnYWVuZ2UgaGFiZW4hCisKKyBTSUVIRSBBVUNIOgorICAgIHNjaGF1IChhbiksIGt1cnosIGJld2VndW5nCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFRodSwgMjQuMDcuMTk5NywgMDk6MDA6MDAgdm9uIFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL3BjbWQvYXVzcnVlc3R1bmcgYi9kb2MvcGNtZC9hdXNydWVzdHVuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzYyMGQyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BjbWQvYXVzcnVlc3R1bmcKQEAgLTAsMCArMSwyMyBAQAorCithdXNydWVzdHVuZworLS0tLS0tLS0KKworIEtPTU1BTkRPOgorICAgIGF1c3J1ZXN0dW5nIFsta10gW2ZhcmJlbl0KKworIEFSR1VNRU5URToKKyAgICBmYXJiZW4gIC0gIHN0YXJ0ZXQgZGllIEZhcmJrb25maWd1cmF0aW9uLgorICAgIC1rICAgICAgLSAgZ2lidCBlaW5lIEt1cnp2YXJpYW50ZSBvaG5lIEFTQ0lJLUdyYWZpayBhdXMuCisKKyBCRVNDSFJFSUJVTkc6CisgICAgWmVpZ3QgZWluZSBncmFwaGlzY2hlIEF1c2dhYmUgZGVyIGdldHJhZ2VuZW4gQXVzcnVlc3R1bmcgYW4uCisgICAgTWl0dGVscyBkZXMgQXJndW1lbnRzIC1rIHdpcmQgdW5hYmhhZW5naWcgdm9uICdncmFmaWsgZWluL2F1cycgZWluZQorICAgIGt1ZXJ6ZXJlIFZlcnNpb24gb2huZSBBU0NJSS1HcmFmaWsgYW5nZXplaWd0LgorICAgIERpZSBGYXJia29uZmlndXJhdGlvbiBlcmxhdWJ0LCBkaWUgRGFyc3RlbGx1bmcgZnVlciB1bmdld29laG5saWNoCisgICAgZWluZ2VzdGVsbHRlIHRlcm1pbmFscyBhbnp1cGFzc2VuLgorICAgIAorIFNJRUhFIEFVQ0g6CisgICAgYmVoYWx0ZSwgaW52ZW50dXIKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgMTQuMDguMjAwOSwgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL3BjbWQvYXZhdGFyIGIvZG9jL3BjbWQvYXZhdGFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5YjBkMWYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcGNtZC9hdmF0YXIKQEAgLTAsMCArMSw0NSBAQAorCithdmF0YXIKKy0tLS0tLS0tLQorCisgS09NTUFORE86CisgICAgYXZhdGFyIFs8dXJpPl0KKworIEFSR1VNRU5URToKKworICAgICA8dXJpPiAob3B0aW9uYWwpCisgICAgICAgIERpZSBuZXVlIFVSSSB6dW0gQXZhdGFyCisKKyBCRVNDSFJFSUJVTkc6CisgICAgU3BpZWxlciBrb2VubmVuIHNpY2ggbWl0IGRpZXNlbSBLb21tYW5kbyBlaW5lbiBncmFwaGlzY2hlbiBBdmF0YXIgKGQuaC4KKyAgICBlaW4gQmlsZCkgZ2ViZW4sIHdlbGNoZW4gbWFuY2hlIENsaWVudHMgYW56ZWlnZW4ga29lbm5lbi4KKyAgICBIaWVyenUgc2V0enQgZGVyIFNwaWVsZXIgaGllciBlaW5lIFVSSSwgd2VsY2hlIGF1ZiBlaW4gQmlsZCBpbSBOZXR6CisgICAgdmVyd2Vpc3QsIHdlbGNoZXMgZ2dmLiB2b20gQ2xpZW50IGFuZGVyZXIgU3BpZWxlciBoZXJ1bnRlcmdlbGFkZW4gd2lyZC4KKyAgICBTcGllbGVyIGtvZW5uZW4gZGllc2UgQXZhdGFyLVVSSSBtaXQgZGVtIEJlZmVobCAnYXZhdGFyJyBhbnplaWdlbiwKKyAgICBhZW5kZXJuIHVuZCBsb2VzY2hlbi4KKyAgICBJc3QgZGFzIEFyZ3VtZW50IGRpZXNlcyBCZWZlaGxzICdrZWluZScsIHNvIHdpcmQgZGllIEF2YXRhci1VUkkKKyAgICBnZWxvZXNjaHQuCisKKyAgICBBdmF0YXItVVJJcyBhbmRlcmVyIFNwaWVsZXIgbGFzc2VuIHNpY2ggbWl0ICdmaW5nZXIgLWEnIGF1c2dlYmVuLgorCisgICAgV2lyZCBlaW4gQ2hhcmFrdGVyIGF1ZiBkZXIgTUctSG9tZXBhZ2UgZ2VmaW5nZXJ0LCB3aXJkIGRhcyBCaWxkY2hlbiBnZ2YuCisgICAgZWJlbmZhbGxzIG1pdCBhbmdlemVpZ3QuIEhpZXJ6dSBtdXNzIGFsbGVyZGluZ3MgZWluZSBVUkwgYW5nZWdlYmVuIHdlcmRlbiwKKyAgICB3ZWxjaGUgbWl0IGh0dHA6Ly8gb2RlciBodHRwczovLyBiZWdpbm50LgorIAorIEJFTUVSS1VOR0VOOgorICAgIEF1ZiBkZXIgTUctSG9tZXBhZ2Ugd2VyZGVuIGRpZSBCaWxkZXIgaW1tZXIgYXVmIGVpbmUgSG9laGUgdm9uIDE1MCBQaXhlbG4KKyAgICBza2FsaWVydCAoQnJlaXRlIGVudHNwcmVjaGVuZCBwcm9wb3J0aW9uYWwpLgorICAgIFVtIGFuZGVyZW4gU3BpZWxlcm4gbmljaHQgdW5ub2V0aWdlIFdhcnRlemVpdGVuIHp1IGJlc2Nod2VyZW4sIHNvbGx0ZSBkaWUKKyAgICBHcm9lc3NlIGRlcyBCaWxkZXMgbmljaHQgenUgcmllc2lnIHNlaW4uIEJpbGRlciBpbSBCZXJlaWNoIHZvbiAyMC0yMDBrQgorICAgIHNvbGx0ZW4gdm9lbGxpZyBhdXNyZWljaGVuLgorCisgQkVJU1BJRUxFOgorICAgIGF2YXRhciBodHRwOi8vbWcubXVkLmRlL2F2YXRhcnMvemVzc3RyYS5wbmcKKyAgICBhdmF0YXIga2VpbmUKKworIFNJRUhFIEFVQ0g6CisgICAgUGVyc29lbmxpY2hlIERldGFpbHM6IGVtYWlsLCB1cmwsIGljcSwgb3J0CisgICAgU29uc3RpZ2VzOiAgICAgICAgICAgIGZpbmdlcgorCisgTEVUWlRFIEFFTkRFUlVORzoKKyAgICAyNS4wOC4yMDExLCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvcGNtZC9iZWhhbHRlIGIvZG9jL3BjbWQvYmVoYWx0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjY0YzE5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BjbWQvYmVoYWx0ZQpAQCAtMCwwICsxLDI5IEBACisKK2JlaGFsdGUKKy0tLS0tLS0KKworIEtPTU1BTkRPOgorICAgIGJlaGFsdGUgW1s8b2JqZWt0Pl0gW2FsbGVzXSBbbmljaHRzXV0KKworIEFSR1VNRU5URToKKworICAgICA8b2JqZWt0PgorICAgICAgICBlaW4gT2JqZWt0IGluIERlaW5lbSBJbnZlbnRhcgorCisgICAgIGFsbGVzL25pY2h0cworICAgICAgICB3aWUgZXMgZGVyIFBhcmFtZXRlciBzY2hvbiBzYWd0CisKKyBCRVNDSFJFSUJVTkc6CisgICAgTWFuIGthbm4gbWl0IGRpZXNlbSBCZWZlaGwgR2VnZW5zdGFlbmRlIG1hcmtpZXJlbiwgc28gZGFzcyBzaWUgYmVpCisgICAgYHZlcmthdWZlIGFsbGVzJyBuaWNodCBtZWhyIGF1dG9tYXRpc2NoIHZlcmthdWZ0IHdlcmRlbi4gSXN0IGRlcgorICAgIGJldHJlZmZlbmRlIEdlZ2Vuc3RhbmQgYmVyZWl0cyBtYXJraWVydCwgd2lyZCBkaWUgTWFya2llcnVuZyBhdWZnZWhvYmVuLgorICAgIFNhZW10bGljaGUgU2FjaGVuIGxhc3NlbiBzaWNoIG1pdCBgYmVoYWx0ZSBhbGxlcycgbWFya2llcmVuLCBtaXQKKyAgICBgYmVoYWx0ZSBuaWNodHMnIGthbm4gbWFuIHNhZW10bGljaGUgTWFya2llcnVuZ2VuIGF1ZmhlYmVuLgorCisgICAgT2huZSBBcmd1bWVudCBhdWZnZXJ1ZmVuIHplaWd0IGRlciBCZWZlaGwgYWxsZSBtYXJraWVydGVuIEdlZ2Vuc3RhZW5kZSBhbi4KKworICAgIEFuZ2V6b2dlbmUgUnVlc3R1bmdlbiB1bmQgZ2V6dWVja3RlIFdhZmZlbiB3ZXJkZW4gdWVicmlnZW5zIGF1dG9tYXRpc2NoCisgICAgYmVoYWx0ZW4uCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFR1ZSwgMjcuMTAuMTk5OCwgMTY6MDA6MDAgdm9uIFJpa3VzCmRpZmYgLS1naXQgYS9kb2MvcGNtZC9idWcgYi9kb2MvcGNtZC9idWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ0MGE5MQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wY21kL2J1ZwpAQCAtMCwwICsxLDYxIEBACisKK2ZlaGxlcgorLS0tLS0tCisKK0tPTU1BTkRPOgorICAgIGJ1ZyA8dGV4dD4KKyAgICBidWcgPG9iamVrdD46PHRleHQ+CisgICAKK0FSR1VNRU5URToKKworICAgIDx0ZXh0PgorICAgICAgICBFaW5lIE1pdHRlaWx1bmcKKyAgICA8b2JqZWt0PgorICAgICAgICBFaW4gUmVmZXJlbnpvYmpla3QsIGRhcyBuZWJlbiBEaXIgbGllZ3Qgb2RlciBpbiBEZWluZW0gSW52ZW50YXIgaXN0CisKK0JFU0NIUkVJQlVORzoKKyAgICBOb2JvZHkncyBwZXJmZWN0LiBEaWVzIGdpbHQgYmVzb25kZXJzIGZ1ZXIgdW5zZXJlIE1hZ2llciA6KQorCisgICAgV2VyIHZpZWwgcHJvZ3JhbW1pZXJ0LCBrYW5uIGF1Y2ggdmllbGUgRmVobGVyIG1hY2hlbi4gRGllIG1laXN0ZW4gRmVobGVyCisgICAgd2VyZGVuIHp3YXIgc2Nob24gaW4gZGVyIFRlc3RwaGFzZSBnZWZ1bmRlbiB1bmQgYXVzZ2VtZXJ6dCwgYWJlciBlaW5pZ2UKKyAgICBGZWhsZXIgYmxlaWJlbiBiaXMgenVtIEFuc2NobHVzcyBlaW5lcyBuZXVlbiBHZWJpZXRlcyBvZGVyIE9iamVrdHMKKyAgICB1bmVudGRlY2t0LgorCisgICAgV2VubiBEdSBlaW5lbiBzb2xjaGVuIEZlaGxlciBnZWZ1bmRlbiBoYXN0LCBzZWkgZXMsIHdlaWwgZWluICdGZWhsZXIgaW0KKyAgICBSYXVtLVplaXQtR2VmdWVnZScgYXVmZ2V0cmV0ZW4gaXN0LCBzZWkgZXMsIHdlaWwgaXJnZW5kd2VsY2hlIHNlbHRzYW1lbgorICAgIFplaWNoZW4gaW4gZGVyIEJlc2NocmVpYnVuZyBlaW5lcyBPYmpla3RlcyBhdWZ0YXVjaGVuLCBzbyBrYW5uc3QgRHUgZGVuCisgICAgVmVyYW50d29ydGxpY2hlbiBtaXQgZGllc2VtIEJlZmVobCBkYXZvbiB1bnRlcnJpY2h0ZW4uCisgICAgKEFubWVya3VuZzogRmlSWkcgd2VyZGVuIGF1Y2ggYXV0b21hdGlzY2ggcHJvdG9rb2xsaWVydCB1bmQgenVzdGFlbmRpZ2VuCisgICAgIE1hZ2llcm4genVyIFZlcmZ1ZWd1bmcgZ2VzdGVsbHQuKQorCisgICAgTmljaHQgem9lZ2Vybiwgd2VubiBEdSBlaW5lbiBGZWhsZXIgZmluZGVzdCwgRmVobGVybWl0dGVpbHVuZ2VuIHNpbmQKKyAgICAqc2Vociogd2lsbGtvbW1lbiEKKyAgICBTb2xsdGVzdCBEdSBEaXIgZWlubWFsIG5pY2h0IHNpY2hlciBzZWluLCBvYiBlcyBzaWNoIGJlaSBlaW5lbSBiZXN0aW1tdGVuCisgICAgVmVyaGFsdGVuIHVtIGVpbmVuIEZlaGxlciBoYW5kZWx0IG9kZXIgbmljaHQsIHpvZWdlcmUgbmljaHQsIGJlaSBkZW0KKyAgICB6dXN0YWVkaWdlbiBNYWdpZXIgb2RlciBhdWNoIGJlaSBTcGllbGVybiB1bmQgYW5kZXJlbiBlaW5nZWxvZ2d0ZW4gTWFnaWVybgorICAgIHp1IGZyYWdlbi4KKworICAgIFdlbm4gRHUgZWluZW4gVHlwbyBhbiBlaW5lbSBiZXN0aW1tdGVuIE9iamVrdCBvZGVyIE5QQyBlbnRkZWNrc3QsIGthbm5zdAorICAgIER1IGRpZXNlcy9kaWVzZW4gaGludGVyIGVpbmVtIERvcHBlbHB1bmt0IGFuZ2ViZW4sIGRhbWl0IGRlciBmdWVyIGRhcworICAgIE9iamVrdCB2ZXJhbnR3b3J0bGljaGUgTWFnaWVyIGRpZSBNZWxkdW5nIGJla29tbXQuCisgICAgV2VubiBkYXMgT2JqZWt0IG5pY2h0IHp1IGZpbmRlbiBpc3QsIHdpcmQgZGllIGdhbnplIEVpbmdhYmUgYWxzCisgICAgTWVsZHVuZyBhdWZnZWZhc3N0LgorCisgICAgRWluIEhpbndlaXMgYXVmIGRpZSBSZWdlbG4gaGllciBub2NoOiBEYXMgVmVyc2Nod2VpZ2VuIHVuZCBBdXNudXR6ZW4gdm9uCisgICAgRmVobGVybiBpc3QgYW5kZXJlbiBTcGllbGVybiBnZWdlbnVlYmVyIHVuZmFpci4gQml0dGUgdW50ZXJsYXNzdCBkYXMsCisgICAgc29uZGVybiBiZXJpY2h0ZXQgZGllIEZlaGxlci4gQnVnYXVzbnV0enVuZyB6dSBlaWdlbmVtIFZvcnRlaWwgb2RlcgorICAgIGFuZGVyZXIgTmFjaHRlaWwgaXN0IGFuc29uc3RlbiBkdXJjaGF1cyBlaW4gRmFsbCBmdWVyIFNoZXJpZmYuIDstKQorCitCRU1FUktVTkc6CisgICAgRGVyIEJlZmVobCAnYnVnJyBiZXppZWh0IHNpY2ggYmVpIE5pY2h0YW5nYWJlIGVpbmVzIEJlenVnc29iamVrdGVzCisgICAgYXVmIGRhcyBsZXR6dGUgYmV0cmFjaHRldGUgT2JqZWt0LiBIYXN0IER1IGFsc28gZWluIE9iamVrdCB1bnRlcnN1Y2h0LAorICAgIGRhbm4gd2lyZCBkaWUgTWVsZHVuZyBmdWVyIGRpZXNlIE9iamVrdCBhYmdlZ2ViZW4uIEhhc3QgRHUgYWJlciBkZW4KKyAgICBSYXVtIHVudGVyc3VjaHQgb2RlciAnc2NoYXUnIGVpbmdlZ2ViZW4sIHdpcmQgZGllIE1lbGR1bmcgZnVlciBEZWluZW4KKyAgICBtb21lbnRhbmVuIFJhdW0gYWJnZXNldHp0LgorCitTSUVIRSBBVUNIOgorICAgIHR5cG8sIGlkZWUsIGRldGFpbCwgcmVnZWxuLCBiZXp1Z3NvYmpla3QKKworTEVUWlRFIEFlTkRFUlVORzoKKyAgICAxMi4gT2t0IDIwMTEgR2xvaW5zb24KKwpkaWZmIC0tZ2l0IGEvZG9jL3BjbWQvY2ljZXJvbmUgYi9kb2MvcGNtZC9jaWNlcm9uZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjJlYmRmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BjbWQvY2ljZXJvbmUKQEAgLTAsMCArMSw0OSBAQAorCitjaWNlcm9uZQorLS0tLS0tLS0KKworIEtPTU1BTkRPOgorICAgIGNpY2Vyb25lIFs8enVzdGFuZD5dCisKKworIEFSR1VNRU5URToKKworICAgIDx6dXN0YW5kPgorICAgICAgJ2VpbicsICdhdXMnLCAnc3RhdHVzJyBvZGVyICd6YWhsJworCisgQkVTQ0hSRUlCVU5HOgorICAgIE1pdCBkaWVzZW0gQmVmZWhsIGthbm5zdCBEdSBEaWNoIHNlbGJzdCB6dSBlaW5lbSBDaWNlcm9uZSwgZWluZW0KKyAgICBQZmFkZmluZGVyLCBGcmVtZGVuZnVlaHJlciBvZGVyIE5ldWxpbmdzZ2VoaWxmZW4gZXJuZW5uZW4gb2RlcgorICAgIERpY2ggd2llZGVyIGFscyBzb2xjaGVyIGFibWVsZGVuLiBEdSB3ZWlzdCBkYW1pdCBkYW5uIGV4cGxpeml0CisgICAgZGFyYXVmIGhpbiwgZGFzcyBEdSBiZXJlaXQgYmlzdCwgTmV1bGluZ2VuIGhpZXIgaW0gTUcgenUgaGVsZmVuLgorCisgICAgJ3phaGwnIG1hY2h0IERpY2ggenVtIENpY2Vyb25lLCBhbGxlcmRpbmdzIHdpcnN0IER1IG5ldWVuIFNwaWVsZXJuIHVuZCBiZWkKKyAgICAia3dlciBjaWNlcm9uZSIgbnVyIGRhbm4gYW5nZXplaWd0LCB3ZW5uIER1IHdlbmlnZXIgYWxzICd6YWhsJyBNaW51dGVuCisgICAgaWRsZSBiaXN0LiBTbyBtdXNzIG1hbiBuaWNodCBkcmFuIGRlbmtlbiwgZGVuIENpY2Vyb25lc3RhdHVzCisgICAgZXhwbGl6aXQgYXVzenVzY2hhbHRlbiwgd2VubiBtYW4gb2VmdGVyIGxhZW5nZXJlcmUgWmVpdCBpZGxlIGlzdC4KKyAgICAnemFobCcgbXVzcyBtaW4uIDEgdW5kIG1heC4gMTQ0MCAoMSBUYWcpIHNlaW4uCisKKyAgICAnY2ljZXJvbmUnIG9obmUgUGFyYW1ldGVyIG9kZXIgbWl0IGRlbSBQYXJhbWV0ZXIgJ3N0YXR1cycgemVpZ3QKKyAgICBEaXIgZGllIGFrdHVlbGxlIEVpbnN0ZWxsdW5nIGFuLgorCisgICAgQmV2b3IgRHUgRGljaCBhbGxlcmRpbmdzIGRhcmF1ZiBlaW5sYWVzc3Qgc29sbHRlc3QgRHUgZGllCisgICAgSGlsZmVzZWl0ZSB6dSBjaWNlcm9uZXMgbGVzZW4sIGRvcnQgd2VyZGVuIGRpZSBBdWZnYWJlbiBkZXIKKyAgICBDaWNlcm9uZXMgbmFlaGVyIHNwZXppZml6aWVydC4KKworICAgIENpY2Vyb25lIGthbm5zdCBEdSBhYiBlaW5lbSBTcGllbGVybGV2ZWwgdm9uIDIwIHdlcmRlbi4KKworQkVJU1BJRUxFOgorICAgIGNpY2Vyb25lIGVpbiAtPiBEdSBiaXN0IHBlcm1hbmVudCBDaWNlcm9uZSAoYmlzIEVuZGUvUmVib290KQorICAgIGNpY2Vyb25lIGF1cyAtPiBEdSBiaXN0IGtlaW4gQ2ljZXJvbmUKKyAgICBjaWNlcm9uZSA1ICAgLT4gRHUgYmlzdCBDaWNlcm9uZSB1bmQgd2lyc3QgbnVyIGFuZ2V6ZWlndCwgd2VubiBEdSB3ZW5pZ2VyCisgICAgICAgICAgICAgICAgICAgIGFscyA1bWluIGlkbGUgYmlzdC4KKworQkVNRVJLVU5HRU46CisgICAgQml0dGUgYmVudXR6dCBkaWUgWmVpdGFuZ2FiZSwgd2VubiBpaHIgYmVpbSBJZGxlbiBkb2NoIGVoZXIgbmljaHQgYXVmIGRlbgorICAgIE1vbml0b3Igc2NoYXV0L2VycmVpY2hiYXIgc2VpZC4gSWRsZSBDaWNlcm9uZXMgc2luZCB3ZW5pZyBoaWxmcmVpY2guCisKK1NJRUhFIEFVQ0g6CisgICAgZWluZnVlaHJ1bmcsIGNpY2Vyb25lcworCitMRVRaVEUgQWVOREVSVU5HOgorICAgIDExLiBTZXAgMjAxMyBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL3BjbWQvZGV0YWlsIGIvZG9jL3BjbWQvZGV0YWlsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ODRkMGIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcGNtZC9kZXRhaWwKQEAgLTAsMCArMSw1MiBAQAorZGV0YWlsCistLS0tLS0KKworS09NTUFORE86CisgICAgZGV0YWlsIDx0ZXh0PgorICAgIGRldGFpbCA8b2JqZWt0Pjo8dGV4dD4KKyAgICBtZCA8dGV4dD4KKyAgICBtZCA8b2JqZWt0Pjo8dGV4dD4KKyAgIAorQVJHVU1FTlRFOgorCisgICAgPHRleHQ+CisgICAgICAgIEVpbmUgTWl0dGVpbHVuZworICAgIDxvYmpla3Q+CisgICAgICAgIEVpbiBSZWZlcmVuem9iamVrdCwgZGFzIG5lYmVuIERpciBsaWVndCBvZGVyIGluIERlaW5lbSBJbnZlbnRhciBpc3QKKworQkVTQ0hSRUlCVU5HOgorICAgIEVzIHNvbGwgdGF0c2FlY2hsaWNoIGltbWVyIG5vY2ggcGFzc2llcmVuLCBkYXMgZGVyIGVpbiBvZGVyIGFuZGVyZQorICAgIGdld2lzc2VuaGFmdGUgRm9yc2NoZXIsIGVpbmVuIFJhdW0gb2RlciBlaW4gT2JqZWt0LCBldGMgdW50ZXJzdWNodAorICAgIHVuZCBkYWJlaSBzbyBncnVlbmRsaWNoIHZvcmdlaHQsIGRhcyBpaG0gZG9jaCB3aXJrbGljaCBlaW4gRGV0YWlsCisgICAgaW5zIEF1Z2Ugc3ByaW5ndCwgd2VsY2hlcyBOSUNIVCBiZXNjaHJpZWJlbiBpc3QuCisKKyAgICBEaWUgWmVpdGVuLCBkYXMgTWFnaWVyIG1pdCBzbyBlaW5lciBvZmZlbmt1bmRpZ2VuIFZlcmdlc3NsaWNoa2VpdCAKKyAgICB1bmQgTmFjaGxhZXNzaWdrZWl0IHVuZ2VzY2hvcmVuIGRhdm9ua29tbWVuLCBzaW5kIGFiZXIgZW50Z3VlbHRpZyAKKyAgICB2b3JiZWkhIERlbm4gRElSIGlzdCBlaW4gSW5zdHJ1bWVudCBpbiBkaWUgSGFuZCBnZWxlZ3QsIG1pdCBkZW0gRHUKKyAgICBkaWVzZSBNYWdpZXIgJ2VyaW5uZXJuJyBrYW5uc3QuCisKKyAgICA8ZGV0YWlsIHRleHQ+IHNldHp0IGVpbmUgTWVsZHVuZyB1ZWJlciBlaW4gZmVobGVuZGVzIERldGFpbCBpbiAKKyAgICBkYXMgZW50c3ByZWNoZW5kZSBMb2ctRmlsZSBkZXMgenVzdGFlbmRpZ2VuIE1hZ2llcnMuCisKKyAgICBCZWkgPHRleHQ+IHNvbGx0ZSBlcyBzaWNoIHVtIGVpbmVuIGt1cnplbiwga25hcHBlbiBIaW53ZWlzIGhhbmRlbG4sCisgICAgZGVyIGVzIGRlbSBNYWdpZXIgZXJtb2VnbGljaHQsIHVlYmVyIGRpZSBOb3R3ZW5kaWdrZWl0LCBkYXMgZmVobGVuZGUKKyAgICBEZXRhaWwgenUgZXJnYWVuemVuIHNjaG5lbGwgZW50c2NoZWlkZW4genUga29lbm5lbi4KKworICAgIFdlbm4gRHUgZWluIERldGFpbCBhbiBiZXN0aW1tdGVuIE9iamVrdCBvZGVyIE5QQyB2ZXJtaXNzdCwga2FubnN0IER1CisgICAgZGllc2VzL2RpZXNlbiBoaW50ZXIgZWluZW0gRG9wcGVscHVua3QgYW5nZWJlbiwgZGFtaXQgZGVyIGZ1ZXIgZGFzCisgICAgT2JqZWt0IHZlcmFudHdvcnRsaWNoZSBNYWdpZXIgZGllIE1lbGR1bmcgYmVrb21tdC4KKyAgICBXZW5uIGRhcyBPYmpla3QgbmljaHQgenUgZmluZGVuIGlzdCwgd2lyZCBkaWUgZ2FuemUgRWluZ2FiZSBhbHMKKyAgICBNZWxkdW5nIGF1ZmdlZmFzc3QuCisKK0JFTUVSS1VORzoKKyAgICBEZXIgQmVmZWhsICdkZXRhaWwnIGJlemllaHQgc2ljaCBiZWkgTmljaHRhbmdhYmUgZWluZXMgQmV6dWdzb2JqZWt0ZXMKKyAgICBhdWYgZGFzIGxldHp0ZSBiZXRyYWNodGV0ZSBPYmpla3QuIEhhc3QgRHUgYWxzbyBlaW4gT2JqZWt0IHVudGVyc3VjaHQsCisgICAgZGFubiB3aXJkIGRpZSBNZWxkdW5nIGZ1ZXIgZGllc2UgT2JqZWt0IGFiZ2VnZWJlbi4gSGFzdCBEdSBhYmVyIGRlbgorICAgIFJhdW0gdW50ZXJzdWNodCBvZGVyICdzY2hhdScgZWluZ2VnZWJlbiwgd2lyZCBkaWUgTWVsZHVuZyBmdWVyIERlaW5lbgorICAgIG1vbWVudGFuZW4gUmF1bSBhYmdlc2V0enQuCisKK1NJRUhFIEFVQ0g6CisgICAgdHlwbywgaWRlZSwgYnVnLCBiZXp1Z3NvYmpla3QKKworTEVUWlRFIEFlTkRFUlVORzoKKyAgICAxMi4gT2t0IDIwMTEgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9wY21kL2ViZW5lbiBiL2RvYy9wY21kL2ViZW5lbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzdmOTY2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BjbWQvZWJlbmVuCkBAIC0wLDAgKzEsODEgQEAKKworRGllIEViZW5lbgorPT09PT09PT09PQorICAgIERpZSBFYmVuZW4gc2luZCBlaW5lIEtvbW11bmlrYXRpb25zZm9ybSwgd2VsY2hlIGVzIGVpbmVtIGVybW9lZ2xpY2h0LAorICAgIGVpbmUgVW50ZXJoYWx0dW5nIHVlYmVyIHdlaXRlIFN0cmVja2VuIGhpbndlZyBtaXQgbWVocmVyZW4gUGVyc29uZW4genUKKyAgICBmdWVocmVuLiBEaWVzZSBGb3JtIGRlciBVbnRlcmhhbHR1bmcgaXN0IGRlbSBSdWZlbiB2b3J6dXppZWhlbiwgZGEgZXMKKyAgICBmdWVyIFBlcnNvbmVuLCB3ZWxjaGUgc2ljaCBuaWNodCBhdWYgZGVyIEViZW5lIGJlZmluZGVuLCBnZXJhZXVzY2hsb3MKKyAgICBpc3QuCisKKyAgICBCZXRyZXRlbiB1bmQgVmVybGFzc2VuOgorICAgICAtPG5hbWU+KworICAgICAgICBFYmVuZSA8bmFtZT4gZWluc2NoYWx0ZW4uCisgICAgIC08bmFtZT4tCisgICAgICAgIEViZW5lIDxuYW1lPiBhdXNzY2hhbHRlbi4KKyAgICAgZWJlbmVuIG5ldSA8TmFtZT4gPFRleHQ+CisgICAgICAgIEVyemV1Z3QgZWluZSBuZXVlIEViZW5lIDxOYW1lPiBtaXQgZGVyIEJlemVpY2h1bmcgPFRleHQ+LiBEaWVzZXMKKyAgICAgICAgS29tbWFuZG8gaXN0IGVyc3QgYWIgU3R1ZmUgNSBtb2VnbGljaCEKKyAgICAgZWJlbmVuIGFuCisgICAgICAgIFNjaGFsdGV0IGRpZSB2b3JoZXIgYXVzZ2VzY2hhbHRldGVuIEViZW5lbiBhbi4KKyAgICAgICAgSXN0IHZvcmhlciBrZWluIGBlYmVuZSBhdXMnIGVyZm9sZ3QsIHNvIHdlcmRlbiBhbGxlIG5pY2h0CisgICAgICAgIGVpbmdlc2NoYWx0ZXRlbiBFYmVuZW4gZWluZ2VzY2hhbHRldC4KKyAgICAgZWJlbmVuIGF1cworICAgICAgICBTY2hhbHRldCBkaWUgRWJlbmVuIGF1cy4KKworICAgIFJlZGVuIGF1ZiBlaW5lciBFYmVuZToKKyAgICAgLTxuYW1lPic8VGV4dD4KKyAgICAgLTxuYW1lPiA8VGV4dD4KKyAgICAgICAgU2VuZGV0IGRpZSBNZWxkdW5nIDxUZXh0PiBhdWYgZGllIEViZW5lCisgICAgIC08bmFtZT46PFRleHQ+CisgICAgICAgIFNlbmRldCBkYXMgYGVtb3RlJyA8VGV4dD4gYXVmIGRpZSBFYmVuZQorICAgICAtPG5hbWU+OzxUZXh0PgorICAgICAgICBFcnpldWd0IGVpbiBHZW5pdGl2LWBlbW90ZScKKworICAgIEViZW5lbm5hbWVuOgorICAgICBNYW4ga2FubiBlaW5lIEViZW5lIG1pdCBkZW0gdm9sbGVuIE5hbWVuIGFuc3ByZWNoZW46CisgICAgICAgICItYW5mYWVuZ2VyIEhhbGxvISIgICBvZGVyICAgIi1hYmVudGV1ZXIgSGlsZmUhIgorICAgICBlcyByZWljaHQgYWJlciBhdWNoIHNjaG9uIGVpbiBlaW5kZXV0aWcgdm9uIGFuZGVyZW4gRWJlbmVuIGFiZ3JlbnplbmRlcgorICAgICBUZWlsIGRlcyBOYW1lbnM6CisgICAgICAgICItYW4gSGFsbG8hIiAgICAgICAgICBvZGVyICAgIi1hYiBIaWxmZSEiCisKKyAgICAgR3VlbHRpZ2UgTmFtZW4gc2V0emVuIHNpY2ggenVzYW1tZW4gYXVzIGRlbiBCdWNoc3RhYmVuIGEteiwgQS1aIHNvd2llCisgICAgICMkJSZAPD4tLiBEYXMgIyBoYXQgZGFiZWkgZWluZSBTb25kZXJhdWZnYWJlOiBEYW1pdCB3aXJkIGRlcgorICAgICBnbGVpY2huYW1pZ2UgSVJDLUNoYW5uZWwgZXJ6ZXVndCBiencuIGJldHJldGVuLgorCisgICAgSW5mb3JtYXRpb25lbiB1bmQgRWJlbmVuZ2VzY2hpY2h0ZToKKyAgICAgLTxuYW1lPj8KKyAgICAgICAgQWxsZSBUZWlsbmVobWVyIGRlciBFYmVuZSA8bmFtZT4gYW56ZWlnZW4uCisgICAgIC08bmFtZT4qPExhZW5nZT4KKyAgICAgICAgRGllIGxldHp0ZW4gPExhZW5nZT4gTWVsZHVuZ2VuIGRlciBFYmVuZSA8bmFtZT4gYW56ZWlnZW4uIFdpcmQgZGllCisgICAgICAgIExhZW5nZSB3ZWdnZWxhc3NlbiwgaXN0IFN0YW5kYXJkIHVuZCBNYXhpbXVtIDIwMC4KKyAgICAgLT8KKyAgICAgICAgQWxsZSB2ZXJmdWVnYmFyZW4gRWJlbmVuIGFuemVpZ2VuLgorICAgICAtIQorICAgICAgICBBbGxlIGVpbmdlc2NoYWx0ZXRlbiBFYmVuZW4gYW56ZWlnZW4uCisgICAgIGViZW5lbiBiZXNjaHJlaWJ1bmcgPG5hbWU+IDxUZXh0PgorICAgICAgICBWZXJhZW5kZXJ0IGRpZSBCZXNjaHJlaWJ1bmcgZGVyIEViZW5lIDxuYW1lPi4gRGllcyBmdW5rdGlvbmllcnQgbnVyLAorICAgICAgICB3ZW5uIG1hbiBkZXIgTWVpc3RlciBkZXIgRWJlbmUgaXN0LgorCisgICAgQWJrdWVyenVuZ2VuL0FsaWFzIGZ1ZXIgRWJlbmVubmFtZW46CisgICAgIEVzIGdpYnQgZWluaWdlIHZvcmRlZmluaWVydGUgQWxpYXNlIGZ1ZXIgRWJlbmVuICh3aWUgLWEgZnVlciAtYWxsZ2VtZWluCisgICAgIG9kZXIgLWIgZnVlciAtYWJlbnRldWVyKS4gV2VpdGVyZSBrYW5uIG1hbiBzaWNoIHNlbGJzdCBkZWZpbmllcmVuLCB3ZW5uCisgICAgIEViZW5lbm5hbWVuIHp1IGxhbmcgb2RlciBtaXQgU29uZGVyemVpY2hlbiB2ZXJzZWhlbiBzaW5kOgorCisgICAgIGViZW5lbiBhW2JrdWVyenVuZ10KKyAgICAgICAgWmVpZ3QgYWxsZSBlaW5nZXN0ZWxsdGVuIEFia3Vlcnp1bmdlbiBhbi4KKyAgICAgZWJlbmVuIGFbYmt1ZXJ6dW5nXSBzW3RhbmRhcmRdCisgICAgICAgIFN0ZWxsdCBkaWUgU3RhbmRhcmRhYmt1ZXJ6dW5nZW4gZWluIHVuZCB6ZWlndCBkaWVzZSBhbi4KKyAgICAgZWJlbmVuIDx4eD49PE5hbWU+CisgICAgICAgIFN0ZWxsdCBkaWUgQWJrdWVyenVuZyA8eHg+IGZ1ZXIgZGllIEViZW5lIDxOYW1lPiBlaW4uIExlZXJ6ZWljaGVuCisJc2luZCAqbmljaHQqIHp1bGFlc3NpZyB2b3Igb2RlciBoaW50ZXIgZGVtIEdsZWljaGhlaXRzemVpY2hlbiAnPSchCisgICAgIGViZW5lbiA8eHg+PQorICAgICAgICBMb2VzY2h0IGRpZSBBYmt1ZXJ6dW5nIDx4eD4KKyAgICAgZWJlbmVuIHN0YW5kYXJkIDxOYW1lPgorICAgICAgICBTZXR6dCBkaWUgRWJlbmUgPE5hbWU+IGFscyBTdGFuZGFyZC4KKwlEYW1pdCB3aXJkIGF1dG9tYXRpc2NoIGJlaSAiLSA8VGV4dD4iIGF1ZiBkaWVzZXIgRWJlbmUgZ2VyZWRldC4KKworIFNJRUhFIEFVQ0g6CisgICAgaXJjLCBzZW5kZXJ3aWVkZXJob2x1bmcKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgMS4gSnVsaSAyMDA2IEVubm94CmRpZmYgLS1naXQgYS9kb2MvcGNtZC9lbWFpbCBiL2RvYy9wY21kL2VtYWlsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlY2IxZDkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcGNtZC9lbWFpbApAQCAtMCwwICsxLDI4IEBACisKK2VtYWlsCistLS0tLQorCisgS09NTUFORE86CisgICAgZW1haWwgWzxhZHJlc3NlPl0KKworIEFSR1VNRU5URToKKworICAgICA8YWRyZXNzZT4gKG9wdGlvbmFsKQorICAgICAgICBEaWUgbmV1ZSBBZHJlc3NlCisKKyBCRVNDSFJFSUJVTkc6CisgICAgT2huZSBBcmd1bWVudGUgZ2lidCBgZW1haWwnIGRpZSBha3R1ZWxsZSBFTWFpbC1BZHJlc3NlIGF1cy4gTWl0IEFyZ3VtZW50CisgICAgd2lyZCBzaWUgYXVmIGRpZSBuZXVlIEFkcmVzc2UgZ2VzZXR6dC4KKworICAgIEhpbndlaXM6IGVpbmUgZ3VlbHRpZ2UgRU1haWwtQWRyZXNzZSBlcmxlaWNodGVydCBlcyBfZXJoZWJsaWNoXyBpbQorICAgIEJlZGFyZnNmYWxsIGVpbiBuZXVlcyBQYXNzd29ydCBmdWVyIGRlbiBDaGFyYWt0ZXIgenUgc2V0emVuLiBJbiB2aWVsZW4KKyAgICBGYWVsbGVuIGlzdCBkaWVzIG9obmUgRU1haWwtQWRyZXNzZSBuaWNodCBtb2VnbGljaC4KKworU0lFSEUgQVVDSDoKKyAgICBFaW5zdGVsbHVuZ2VuOiAgICAgICAgZW1haWxhbnplaWdlCisgICAgUGVyc29lbmxpY2hlIERldGFpbHM6IGVtYWlsLCB1cmwsIGljcSwgbWVzc2VuZ2VyLCBvcnQKKyAgICBTb25zdGlnZXM6ICAgICAgICAgICAgZmluZ2VyLCB3ZXIsIGt3ZXIKKworTEVUWlRFIEFlTkRFUlVORzoKKyAgICAxMi4wOS4yMDExLCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9wY21kL2VtYWlsYW56ZWlnZSBiL2RvYy9wY21kL2VtYWlsYW56ZWlnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmY1MmIyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BjbWQvZW1haWxhbnplaWdlCkBAIC0wLDAgKzEsMjIgQEAKK0tPTU1BTkRPOgorCWVtYWlsYW56ZWlnZSBbUGVyc29uZW5rcmVpc10KKworQVJHVU1FTlRFOgorCVtQZXJzb25lbmtyZWlzXQorCSAgRGllIFBlcnNvbmVuLCBkaWUgYmVpbSBmaW5nZXItQmVmZWhsIERlaW5lIEVtYWlsIGFuZ2V6ZWlndAorCSAgYmVrb21tZW4uCisKK0JFU0NIUkVJQlVORzoKKwlNaXQgZGllc2VtIEJlZmVobCBrYW5uIG1hbiBmZXN0bGVnZW4sIHdlbGNoZSBQZXJzb25lbiBiZWltCisJZmluZ2VyLUJlZmVobCBkaWUgRU1haWwtQWRyZXNzZSBhbmdlemVpZ3QgYmVrb21tZW4sIGRpZSBEdSBtaXQKKwlkZW4gQmVmZWhsICJlbWFpbCIgb2RlciBiZWltIGVyc3RlbiBMb2dpbiBhbmdlZ2ViZW4gaGFzdC4KKwlBbHMgT3B0aW9uZW4gc3RlaGVuIHp1ciBWZXJmdWVndW5nOiBhbGxlLCBmcmV1bmRlLCBuaWVtYW5kLgorCUFjaHR1bmc6IE1hZ2llciBiZWtvbW1lbiBkaWUgRW1haWwtQWRyZXNzZSBpbW1lciBhbmdlemVpZ3QsCisJYXVjaCBkYW5uLCB3ZW5uIG1hbiAiZW1haWxhbnplaWdlIG5pZW1hbmQiIGVpbmdpYnQuCisKK1NJRUhFIEFVQ0g6CisgICAgICAgIFBlcnNvZW5saWNoZSBEZXRhaWxzOiBlbWFpbCwgdXJsLCBpY3EsIG1lc3Nlbmdlciwgb3J0CisgICAgICAgIFNvbnN0aWdlczogICAgICAgICAgICBmaW5nZXIKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogTW9uIE9rdCAxNiAyMDozMjo0NCAyMDAwIGJ5IFNpbHZhbmEKZGlmZiAtLWdpdCBhL2RvYy9wY21kL2Vtb3RlIGIvZG9jL3BjbWQvZW1vdGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFkZjRlZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wY21kL2Vtb3RlCkBAIC0wLDAgKzEsNjQgQEAKKworZW1vdGUKKy0tLS0tCisKKyBLT01NQU5ETzoKKyAgICBlbW90ZSA8dGV4dDE+WyM8bmFtZT4jPHRleHQyPlsjPHRleHQzPl1dCisgICAgOjx0ZXh0MT5bIzxuYW1lPiM8dGV4dDI+WyM8dGV4dDM+XV0KKyAgICA7PHRleHQxPlsjPG5hbWU+Izx0ZXh0Mj5bIzx0ZXh0Mz5dXQorCisgQVJHVU1FTlRFOgorCisgICAgIDx0ZXh0MT4sIDx0ZXh0Mj4sIDx0ZXh0Mz4KKyAgICAgICAgWmVpY2hlbmtldHRlbgorICAgICA8bmFtZT4KKyAgICAgICAgTmFtZSBlaW5lcyBMZWJld2VzZW5zIGltIGdsZWljaGVuIFJhdW0gd2llIER1CisKKyBCRVNDSFJFSUJVTkc6CisgICAgR2lidCBkZW4gVGV4dCA8dGV4dDE+IGFuIGFsbGUgaW0gUmF1bSBhdXMuIERlaW4gTmFtZSB3aXJkIGRlbSBUZXh0CisgICAgdm9yYW5nZXN0ZWxsdC4gVmVyd2VuZGV0IG1hbiBkaWUgYDsnLUZvcm0sIHdpcmQgRGVpbiBOYW1lIGltIEdlbml0aXYKKyAgICBnZXdhZWhsdC4KKworICAgIFdlcmRlbiBlaW4gTmFtZSB1bmQgd2VpdGVyZXJlIFRleHRlIGFuZ2VnZWJlbiwgc28gd2lyZCBhbiA8bmFtZT4gc3RhdHQgZGVzCisgICAgZXJzdGVuIFRleHRlcyA8dGV4dDI+IGF1c2dlZ2ViZW4gKGViZW5mYWxscyBtaXQgRGVpbmVtIE5hbWVuCisgICAgdm9yYW5nZXN0ZWxsdCkgdW5kIGFuIERpY2ggPHRleHQzPiAob2huZSBOYW1lbikuCisKKyAgICBEYXMgYGVtb3RlJy1Lb21tYW5kbyBiZWhlcnJzY2h0IG1hbiB1ZWJyaWdlbnMgZXJzdCwgbmFjaGRlbSBtYW4gZGllCisgICAgQW1hcnlsbGlzLVF1ZXN0IGdlbG9lc3QgaGF0LgorCisgICAgSXN0IG1hbiBudXIgZWluZmFjaGVyIFNwaWVsZXIgKGFsc28gd2VkZXIgU2VoZXIgbm9jaCBNYWdpZXIpLCBzbyB3aXJkIGF1Y2gKKyAgICBub2NoIGVpbiBgPiAnIHZvciBOYW1lbiB1bmQgVGV4dCBnZXNldHp0LgorCisgQkVJU1BJRUxFOgorICAgIEFuZ2Vub21tZW4sIFdhcmdvbiB1bmQgU2FwaGlzIHN0ZWhlbiBtaXQgZWluaWdlbiBhbmRlcmVuIExldXRlbiB6dXNhbW1lbgorICAgIGluIGVpbmVtIFJhdW0uCisKKyAgICBIaWVyIGVpbiBwYWFyIEVpbmdhYmVuIHZvbiBXYXJnb24gbWl0IGRlbiBlbnRzcHJlY2hlbmRlbiBBdXNnYWJlbiBiZWkgZGVuCisgICAgQW53ZXNlbmRlbjoKKworICAgID4gOm5pZXN0LgorCisgICAgfFdhcmdvbjp8IFdhcmdvbiBuaWVzdC4KKyAgICB8U2FwaGlzOnwgV2FyZ29uIG5pZXN0LgorICAgIHxhbmRlcmU6fCBXYXJnb24gbmllc3QuCisKKyAgICA+IDphZXJnZXJ0IFNhcGhpcy4jc2FwaGlzI2FlcmdlcnQgRGljaC4KKworICAgIHxXYXJnb246fCBXYXJnb24gYWVyZ2VydCBTYXBoaXMuCisgICAgfFNhcGhpczp8IFdhcmdvbiBhZXJnZXJ0IERpY2guCisgICAgfGFuZGVyZTp8IFdhcmdvbiBhZXJnZXJ0IFNhcGhpcy4KKworICAgID4gOmFlcmdlcnQgU2FwaGlzLiNzYXBoaXMjYWVyZ2VydCBEaWNoLiNEdSBhZXJnZXJzdCBTYXBoaXMuCisKKyAgICB8V2FyZ29uOnwgRHUgYWVyZ2Vyc3QgU2FwaGlzLgorICAgIHxTYXBoaXM6fCBXYXJnb24gYWVyZ2VydCBEaWNoLgorICAgIHxhbmRlcmU6fCBXYXJnb24gYWVyZ2VydCBTYXBoaXMuCisKKyAgICBXaWUgbWFuIHNpZWh0LCBsYXNzZW4gc2ljaCBtaXQgZGVyIGxldHp0ZW4gRm9ybSB1bmQgZGVtIGFsaWFzLUJlZmVobAorICAgIGVpZ2VuZSBCZWZlaGxlIGhlcnN0ZWxsZW4gKGFsbGVyZGluZ3MgbXVzcyBtYW4gYXVmIEFkdmVyYmllbiB2ZXJ6aWNodGVuKS4KKworIFNJRUhFIEFVQ0g6CisgICAgdmVyYmVuLCAoYWIgaGllciBudXIgZnVlciBTZWhlcikgcmVtb3RlLCBlY2hvCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFRodSwgMjQuMDcuMTk5NywgMDk6MDA6MDAgdm9uIFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL3BjbWQvZW5kZSBiL2RvYy9wY21kL2VuZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNkY2M5OQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wY21kL2VuZGUKQEAgLTAsMCArMSwyOCBAQAorCitlbmRlCistLS0tCisKKyBLT01NQU5ETzoKKyAgICBlbmRlCisKKyBBUkdVTUVOVEU6CisgICAga2VpbmUKKworIEJFU0NIUkVJQlVORzoKKyAgICBNYW4gdmVybGFlc3N0IGRhcyBTcGllbCBzb2ZvcnQgdW5kIGF1ZiBkZXIgU3RlbGxlIChzaWVoZSBhYmVyIGF1Y2ggdW50ZXIKKyAgICBCRU1FUktVTkdFTikuIEFsbGUgR2VnZW5zdGFlbmRlIHdlcmRlbiBmYWxsZW4gZ2VsYXNzZW4sIG51ciBhdXRvbGFkZW5lCisgICAgR2VnZW5zdGFlbmRlICh6LkIuIEdlbGQpIGJlaGFlbHRzdCBEdSB1ZWJlciBkYXMgU3BpZWxlbmRlIGhpbmF1cy4gV2VubiBEdQorICAgIERpY2ggd2llZGVyIGVpbmxvZ2dzdCwgc3RhcnRlc3QgRHUgYW4gRGVpbmVtIGxva2FsZW4gU3RhcnRwdW5rdC4KKworICAgIERlciBha3R1ZWxsZSBTcGllbHN0YW5kIHdpcmQgdm9yIGRlbSBWZXJsYXNzZW4gYXV0b21hdGlzY2ggYWJnZXNwZWljaGVydC4KKworIEJFTUVSS1VOR0VOOgorICAgIERhIGVpbmlnZSBMZXV0ZSBkaWVzZW4gQmVmZWhsIGdlYnJhdWNodGVuLCB1bSBzaWNoIGltIEthbXBmIFZvcnRlaWxlIHp1CisgICAgdmVyc2NoYWZmZW4sIGZ1bmt0aW9uaWVydCBkZXIgYGVuZGUnLUJlZmVobCBlcnN0IHp3ZWkgTWludXRlbiBuYWNoIGRlcgorICAgIGxldHp0ZW4gS2FtcGZoYW5kbHVuZy4KKworIFNJRUhFIEFVQ0g6CisgICAgc3BlaWNoZXJuLCBzY2hsYWZlIChlaW4pCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFR1ZSwgMDIuMDkuMTk5NywgMTU6MDU6MDAgdm9uIFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL3BjbWQvZW50Z2lmdGUgYi9kb2MvcGNtZC9lbnRnaWZ0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2VkZjY1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BjbWQvZW50Z2lmdGUKQEAgLTAsMCArMSwyNSBAQAorCitlbnRnaWZ0ZQorLS0tLS0tLS0KKworIEtPTU1BTkRPOgorICAgIGVudGdpZnRlIFs8emllbD5dCisKKyBBUkdVTUVOVEU6CisKKyAgICAgPHppZWw+IChvcHRpb25hbCkKKyAgICAgICAgRGFzIHp1IGVudGdpZnRlbmRlIExlYmV3ZXNlbi4KKworIEJFU0NIUkVJQlVORzoKKyAgICBFaWdlbnRsaWNoIGlzdCBkaWVzIGVpbmUgQW5ydWZ1bmcgZGVzIEhlaWxpZ2VuIE9yZGVucy4gQWxsZXJkaW5ncyBrb2VubmVuCisgICAgYXVjaCBBbmdlaG9lcmlnZSBhbmRlcmVyIEdpbGRlbiBkaWVzZSBBbnJ1ZnVuZyBsZXJuZW4sIG5hY2hkZW0gc2llIGRhcworICAgIEFiZW50ZXVlciAiVmVyaGFlbmduaXMgZGVzIER1ZXN0ZXJ3YWxkcyIgZ2Vsb2VzdCBoYWJlbi4KKworICAgIEZhbGxzIGRhcyA8emllbD4gdmVyZ2lmdGV0IGlzdCwgc28gd2lyZCBzZWluZSBWZXJnaWZ0dW5nIGdlbGluZGVydCBvZGVyCisgICAgZ2FyIGdlaGVpbHQgKGplIG5hY2ggR3VldGUgZGVyIEFucnVmdW5nKS4gT2huZSBBbmdhYmUgdm9uIDx6aWVsPiB3aXJkCisgICAgZGllIGVpZ2VuZSBWZXJnaWZ0dW5nIGdlbGluZGVydCBvZGVyIGdlaGVpbHQuCisKKyAgICBEaWUgQW53ZW5kdW5nIGRlciBBbnJ1ZnVuZyBrb3N0ZXQgMzAgTWFnaWVwdW5rdGUuCisKKyBMRVRaVEUgQUVOREVSVU5HOgorICAgIEZyZSwgMjYuMTEuMTk5OSwgMTU6MTY6MDAgdm9uIFRpbGx5CmRpZmYgLS1naXQgYS9kb2MvcGNtZC9lcnNldHp1bmdzYW56ZWlnZSBiL2RvYy9wY21kL2Vyc2V0enVuZ3NhbnplaWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMTMxZTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcGNtZC9lcnNldHp1bmdzYW56ZWlnZQpAQCAtMCwwICsxLDMwIEBACisKK2Vyc2V0enVuZ3NhbnplaWdlCistLS0tLS0tLS0tLS0tLS0tLQorCisgS09NTUFORE86CisgICAgZXJzZXR6dW5nc2FuemVpZ2UgPHN0dWZlPgorCisgQVJHVU1FTlRFOgorCisgICAgIDxzdHVmZT4KKyAgICAgICAgMCwgMSBvZGVyIDIKKworIEJFU0NIUkVJQlVORzoKKyAgICBNaXQgZGllc2VtIEJlZmVobCBrYW5uIG1hbiBzaWNoIGRpZSBFcnNldHp1bmdlbiBiZWkgZGVyIEJlbnV0enVuZyB2b24KKyAgICBCZWZlaGxzZ2VzY2hpY2h0ZSB1bmQgQWxpYXNlbiBhbnplaWdlbiBsYXNzZW4uCisKKyAgICBgZXJzZXR6dW5nc2FuemVpZ2UgMScgemVpZ3QgZGFiZWkgZGllIEVyc2V0enVuZ2VuIGRlciBIaXN0b3J5IGFuIHVuZAorICAgIGBlcnNldHp1bmdzYW56ZWlnZSAyJyBkaWUgRXJzZXR6dW5nZW4gdm9uIEhpc3RvcnkgdW5kIEFsaWFzZW4uCisKKyAgICBNaXQgYGVyc2V0enVuZ3NhbnplaWdlIDAnIHNjaGFsdGV0IG1hbiBkaWUgQW56ZWlnZSB3aWVkZXIgYWIuCisKKyAgICBEaWVzZXIgQmVmZWhsIGlzdCBoYXVwdHNhZWNobGljaCBkYW5uIG51ZXR6bGljaCwgd2VubiBtYW4gc2ljaCBkYXZvbgorICAgIHVlYmVyemV1Z2VuIHdpbGwsIG9iIGVpbmUgYW5zY2hlaW5lbmQgcmljaHRpZ2UgU3ludGF4IHouQi4gdm9uIGVpbmVtCisgICAgbGFlbmdzdCB2ZXJnZXNzZW5lbiBBbGlhcyB2ZXJodW56dCB3aXJkLgorCisgU0lFSEUgQVVDSDoKKyAgICBhbGlhcywgaGlzdG9yeQorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBUaHUsIDI0LjA3LjE5OTcsIDA5OjAwOjAwIHZvbiBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9wY21kL2Vyd2FydGUgYi9kb2MvcGNtZC9lcndhcnRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNjViOTYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcGNtZC9lcndhcnRlCkBAIC0wLDAgKzEsNTIgQEAKK0tPTU1BTkRPOgorICAgICBlcndhcnRlIFstdXw8U3BpZWxlcj5dCisgICAgIGVyd2FydGUgWzxTcGllbGVyPl0gd2VnZW4gWzxHcnVuZD5dCisgICAgIGVyd2FydGUgW2FufGVpbnxhdXNdCisKK0FSR1VNRU5URToKKyAgICAgPFNwaWVsZXI+CisgICAgICAgSGllciB3aXJkIGFuZ2VnZWJlbiwgd2VsY2hlbiBTcGllbGVyIG1hbiBlcndhcnRldC4KKyAgICAgPEdydW5kPgorICAgICAgICgxKSBUZXh0bWVsZHVuZywgd2VsY2hlIGJlaW0gRWlubG9nZ2VuIGRlcyBlcndhcnRldGVuIFNwaWVsZXJzIGtvbW10LgorICAgICAgICgyKSBCZWkgQW5nYWJlIHZvbiAnbmljaHRzJyBvZGVyICdsb2VzY2hlbicgd2lyZCA8R3J1bmQ+IGdlbG9lc2NodC4KKyAgICAgLXUKKyAgICAgICBVbnRlciBWZXJ3ZW5kdW5nIGRpZXNlciBPcHRpb24gd2VyZGVuIGRpZSBlcndhcnRldGVuIFNwaWVsZXJuYW1lbgorICAgICAgIGluIGRlciBjaHJvbm9sb2dpc2NoZW4gUmVpaGVuZm9sZ2UgaWhyZXMgRWludHJhZ3MgaW4gZGVyCisgICAgICAgRXJ3YXJ0ZS1MaXN0ZSBhdXNnZWdlYmVuLiBPaG5lIGRpZXNlIE9wdGlvbiB3aXJkIGRpZSBMaXN0ZQorICAgICAgIGFscGhhYmV0aXNjaCBnZW9yZG5ldCBwcmFlc2VudGllcnQuCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGllIEFua3VuZnQgdW5kIGRhcyBXZWdnZWhlbiBkZXIgU3BpZWxlciwgZGllIG1pdCBgRXJ3YXJ0ZSA8TmFtZT4nCisgICAgIG1hcmtpZXJ0IHd1cmRlbiwgd2VyZGVuIG1pdCBlaW5lciBNZWxkdW5nIHVuZCBlaW5lbSBQaWVwdG9uCisgICAgIGJlc3RhZXRpZ3QuCisgICAgIGBlcndhcnRlJyBvaG5lIEFyZ3VtZW50IHplaWd0IGRpZSBMaXN0ZSBkZXIgenVyIFplaXQgZXJ3YXJ0ZXRlbgorICAgICBTcGllbGVyIGluIGFscGhhYmV0aXNjaGVyIFJlaWhlbmZvbGdlIGFuLiBEaWUgT3B0aW9uICctdScga2FubiBkaWUKKyAgICAgTGlzdGUgYXVjaCBpbiBkZXIgY2hyb25vbG9naXNjaGVuIFJlaWhlbmZvbGdlIGlocmVyIEVpbnRyYWVnZQorICAgICBhbnplaWdlbi4KKyAgICAgRWluIGVybmV1dGVyIEF1ZnJ1ZiB2b24gYGVyd2FydGUgPFNwaWVsZXI+JyBlbnRmZXJudCA8U3BpZWxlcj4KKyAgICAgd2llZGVyIGF1cyBkZXIgTGlzdGUuCisKKyAgICAgRXJ3YXJ0ZXQgbWFuIGVpbmVuIFNwaWVsZXIgYXVzIGVpbmVtIGdhbnogYmVzdGltbXRlbiBHcnVuZCwgdW5kCisgICAgIG1vZWNodGUgbWFuIGJlaSBkZXNzZW4gRWlubG9nZ2VuIGF1Y2ggZGFyYW4gZXJpbm5lcnQgd2VyZGVuLCB3YXMgbWFuCisgICAgIHZvbiBpaG0gd29sbHRlLCBzbyBpc3QgYGVyd2FydGUgPFNwaWVsZXI+IHdlZ2VuIDxHcnVuZD4nIG51ZXR6bGljaC4KKyAgICAgQmVpbSBFaW5sb2dnZW4gZGVzIFNwaWVsZXJzIDxOYW1lPiBlcnNjaGVpbnQgZWluZSBUZXh0bWVsZHVuZyBtaXQKKyAgICAgSW5oYWx0IDxHcnVuZD4uCisgICAgIE1pdCBgZXJ3YXJ0ZSB3ZWdlbicgaXN0IGRpZXNlIHNwZXppZWxsZSBFcndhcnRlbGlzdGUgYWJmcmFnYmFyIHVuZAorICAgICBtaXQgYGVyd2FydGUgPFNwaWVsZXI+IHdlZ2VuJywgb2IgdW5kIGF1cyB3ZWxjaGVuIEdydW5kIG1hbiBTcGllbGVyCisgICAgIDxTcGllbGVyPiBlcndhcnRldC4gV2lyZCBhbHMgPEdydW5kPiBgbmljaHRzJyBvZGVyIGBsb2VzY2hlbicKKyAgICAgYW5nZWdlYmVuLCBlbnRmZXJudCBtYW4gZGVuIEVpbnRyYWcgd2llZGVyLgorICAgICBTcGllbGVyIGtvZW5uZW4gMTAgVGV4dG1lbGR1bmdlbiBzZXR6ZW4sIFNlaGVyIDIwLCBNYWdpZXIgNDAgdW5kCisgICAgIEVyem1hZ2llciA4MC4KKyAgICAgTWl0ICdlcndhcnRlIGF1cycga2FubiBtYW4gRXJ3YXJ0ZS1NZWxkdW5nZW4gdm9ydWViZXJnZWhlbmQKKyAgICAgZGVha3RpdmllcmVuLiAnZXJ3YXJ0ZSBlaW4nIGJ6dy4gJ2Vyd2FydGUgYW4nIGFrdGl2aWVydCBlcyBkYW5uCisgICAgIHdpZWRlciwgb2huZSBkYXNzIGRpZSBMaXN0ZSBkZXIgRXJ3YXJ0ZXRlbiB2ZXJsb3JlbiBnZWh0LgorCitCRU1FUktVTkdFTjoKKyAgICAgRGVyIHZvbiAnZXJ3YXJ0ZScgZXJ6ZXVndGUgUGllcHRvbiBrYW5uIHNpY2ggaW4gZ2V3aXNzZW4KKyAgICAgUkwtVW1nZWJ1bmdlbiByZWNodCBzdG9lcmVuZCBhdXN3aXJrZW4uIERhZ2VnZW4ga2FubiBtYW4gc2ljaCBqZWRvY2gKKyAgICAgbWl0dGVscyBkZXMgS29tbWFuZG9zICd0b24gQVVTJyB3ZWhyZW4uCisKK1NJRUhFIEFVQ0g6CisgICAgIHRvbiwgaW5mb3JtCisKKzYuRmViIDIwMTYgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9wY21kL2Vyd2lkZXJlIGIvZG9jL3BjbWQvZXJ3aWRlcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRjYWUzNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wY21kL2Vyd2lkZXJlCkBAIC0wLDAgKzEsMjggQEAKKworZXJ3aWRlcmUKKy0tLS0tLS0tCisKKyBLT01NQU5ETzoKKyAgICBlcndpZGVyZSA8dGV4dD4KKworIEFSR1VNRU5URToKKworICAgICA8dGV4dD4KKyAgICAgICAgRGVyIHp1IGVyd2lkZXJuZGUgVGV4dAorCisgQkVTQ0hSRUlCVU5HOgorICAgIFdlbm4gRGlyIGplbWFuZCBldHdhcyBtaXR0ZWlsdCwga2FubnN0IER1IG1pdCBkaWVzZW0gS29tbWFuZG8gZGlyZWt0CisgICAgZGFyYXVmIGFudHdvcnRlbiwgb2huZSBkZW4gTmFtZW4gZGVzIEFic2VuZGVycyBlaW5nZWJlbiB6dSBtdWVzc2VuLgorCisgICAgQWJlciBhdWZnZXBhc3N0OiBEdSBlcndpZGVyc3Qgd2lya2xpY2ggbnVyIGRpZSAqbGV0enRlKiBNaXR0ZWlsdW5nISBXZW5uCisgICAgRHUgYWxzbyBkZW4genUgZXJ3aWRlcm5kZW4gVGV4dCBzY2hyZWlic3QsIHVuZCBqZW1hbmQgYW5kZXJlcyB0ZWlsdCBEaXIgaW4KKyAgICBkZXIgWndpc2NoZW56ZWl0IGF1Y2ggbm9jaCBldHdhcyBtaXQsIHNvIGJla29tbXQgKmVyKiBkaWUgQW50d29ydAorICAgIHp1Z2VzY2hpY2t0IQorICAgIAorICAgIERlciBnbGVpY2hlIEVmZmVrdCBrYW5uIG1pdCAidGVpbGUgLCBtaXQgPHRleHQ+IiBlcnppZWx0IHdlcmRlbi4KKworIFNJRUhFIEFVQ0g6CisgICAgdGVpbGUgKG1pdCkKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgVGh1LCAwOC4wMi4yMDA3LCAxODoyMzowMCB2b24gTXVhZGliCmRpZmYgLS1naXQgYS9kb2MvcGNtZC9mZWhsZXIgYi9kb2MvcGNtZC9mZWhsZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThhNjY3NQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wY21kL2ZlaGxlcgpAQCAtMCwwICsxLDMwIEBACitmZWhsZXIKKy0tLS0tLQorCitLT01NQU5ETzoKKyAgICBmZWhsZXIKKworQkVTQ0hSRUlCVU5HOgorICAgIFdlciB2aWVsIHByb2dyYW1taWVydCwga2FubiBhdWNoIHZpZWxlIEZlaGxlciBtYWNoZW4uIERpZSBtZWlzdGVuCisgICAgUHJvYmxlbWUgd2VyZGVuIHp3YXIgc2Nob24gdm9yIGRlbSBBbnNjaGx1c3MgZGVzIG5ldWVuIEdlYmlldGVzIG9kZXIKKyAgICBPYmpla3RlcyBlbnRkZWNrdCwgYWJlciBlaW5pZ2VzIGJsZWlidCBiaXMgenVtIEFuc2NobHVzcyB1bmVudGRlY2t0LgorICAgIE1hbmNoZSBJZGVlIGlzdCBkZW0gTWFnaWVyIGF1Y2ggbmljaHQgc28ga2xhciwgd2llIGRlbSBTcGllbGVyLCBkZXIKKyAgICBzcGFldGVyIGVpbm1hbCBkdXJjaGxhZXVmdC4KKworICAgIFp1bSBNZWxkZW4gZGllc2VyIEZlaGxlciBnaWJ0IGVzIHZpZXIgS29tbWFuZG9zLCBkaWUgZHVyY2ggZGFzIEtvbW1hbmRvCisgICAgJ2ZlaGxlcicgZ2VsaXN0ZXQgd2VyZGVuOgorICAgICogJ2J1ZycgICAgLSBNZWxkdW5nIGVpbmVzIEZlaGxlcnMgLyBlaW5lciBGZWhsZnVua3Rpb24KKyAgICAqICd0eXBvJyAgIC0gTWVsZHVuZyBlaW5lcyBUaXBwZmVobGVyCisgICAgKiAnZGV0YWlsJyAtIFZvcnNjaGxhZWdlLCBlaW4gZmVobGVuZGVzIERldGFpbCB6dSBlcmdhZW56ZW4KKyAgICAqICdpZGVlJyAgIC0gVm9yc2NobGFlZ2UgbWl0IElkZWVuIHp1ciBFcndlaXRlcnVuZworCitCRU1FUktVTkc6CisgICAgRnJ1ZWhlciBoYXR0ZSBkaWVzZXMgS29tbWFuZG8gZGllIGdsZWljaGUgRnVua3Rpb25hbGl0YWV0IHdpZSAnYnVnJywKKyAgICB6dSB2aWVsZSBTcGllbGVyIGhhYmVuIGFiZXIgYWxsIGRpZSB2ZXJzY2hpZWRlbmVuIEZlaGxlcmFydGVuIG51ciBhbHMKKyAgICAnZmVobGVyJyBhYmdlc2V0enQsIGRhaGVyIHd1cmRlIGRhcyBnZWFlbmRlcnQuCisKK1NJRUhFIEFVQ0g6CisgICAgYnVnLCB0eXBvLCBpZGVlLCBkZXRhaWwKKworTEVUWlRFIEFlTkRFUlVORzoKKyAgICAxMi4gT2t0IDIwMTEgR2xvaW5zb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvcGNtZC9maW5nZXIgYi9kb2MvcGNtZC9maW5nZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVjZTkzNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wY21kL2ZpbmdlcgpAQCAtMCwwICsxLDU1IEBACisKK2ZpbmdlcgorLS0tLS0tCisKKyBLT01NQU5ETzoKKyAgICBmaW5nZXIgWy1uXSBbLXBdIFstc10gWy12XSBbLWFdIDxuYW1lPiB8IDxuYW1lPkA8bXVkPgorCisgQVJHVU1FTlRFOgorCisgICAgIDxuYW1lPgorICAgICAgICBOYW1lIGVpbmVzIFNwaWVsZXJzCisgICAgIDxtdWQ+CisgICAgICAgIE5hbWUgZWluZXMgTVVEcyBhdXMgZGVyIGBtdWRzJy1MaXN0ZQorCisgQkVTQ0hSRUlCVU5HOgorICAgIEdpYnQgZWluIHBhYXIgenVzYWV0emxpY2hlIEluZm9ybWF0aW9uZW4gdWViZXIgZGVuIFNwaWVsZXIgPG5hbWU+IGF1cy4KKyAgICBIaWVyYmVpIGlzdCBlaW5lcmxlaSwgb2IgZGVyIFNwaWVsZXIgZWluZ2Vsb2dndCwgbmV0enRvdCBvZGVyIGF1c2dlbG9nZ3QKKyAgICBpc3QuCisKKyAgICBTZWhlciB1bmQgTWFnaWVyIGtvZW5uZW4gc2ljaCBlaW5lIC5wbGFuLURhdGVpIGFubGVnZW4sIGRlcmVuIEluaGFsdCB1bnRlcgorICAgIGRlbiBTcGllbGVyaW5mb3JtYXRpb25lbiBhdXNnZWdlYmVuIHdpcmQuIE1hbmNobWFsIG1vZWNodGUgbWFuIGRpZXNlCisgICAgamVkb2NoIGdhciBuaWNodCBzZWhlbi4gSW4gZGllc2VtIEZhbGwga2FubiBtYW4gZGllIEF1c2dhYmUgZGVzIC5wbGFuIG1pdAorICAgIGAtbicgdW50ZXJkcnVlY2tlbi4KKworICAgIE1vZWNodGUgbWFuIGRpZSAucGxhbi1EYXRlaSBkZWZhdWx0bWFlc3NpZyB1bnRlcmRydWVja2VuLCBrYW5uIG1hbiBzaWNoCisgICAgZWluIEFsaWFzIGRlciBGb3JtCisKKyAgICAnYWxpYXMgZmluZ2VyIGZpbmdlciAtbiAkKicKKworICAgIGVyc3RlbGxlbi4KKworICAgIE1vZWNodGUgbWFuIGRhbm4gdHJvdHpkZW0gZWlubWFsIGVpbmVuIC5wbGFuIHNlaGVuLCBrYW5uIG1hbiBkaWVzIG1pdCBkZXIKKyAgICBPcHRpb24gYC1wJyBiZXdlcmtzdGVsbGlnZW4uCisKKyAgICBNaXQgZGVtIFNjaGFsdGVyICctYScga2FubiBtYW4gc2ljaCB6dXNhZXR6bGljaCB6dSBkZW4gYW5kZXJlbiBBbmdhYmVuCisgICAgYXVjaCBkaWUgQXZhdGFyLVVSSSBkZXMgU3BpZWxlcnMgYW56ZWlnZW4gbGFzc2VuIChuYXR1ZXJsaWNoIG51ciwgc29mZXJuCisgICAgZXIgYXVjaCBlaW5lIGdlc2V0enQgaGF0KS4KKworICAgIEdpYnQgbWFuIGRlbiBTY2hhbHRlciBgLXMnIGFuLCBzbyB3aXJkIGRhcyBWZXJ3YW5kdHNjaGFmdHN2ZXJoYWVsdG5pcyBkZXMKKyAgICBNYWdpZXJzIGF1c2dlZ2ViZW4uCisKKyAgICBJbSBHZWdlbnNhdHogenUgU3BpZWxlcm4gc2VoZW4gTWFnaWVyIGF1Y2gsIHdlbm4gZWluIE1hZ2llciB6dWxldHp0CisgICAgdW5zaWNodGJhciBhbndlc2VuZCB3YXIuIFVtIGRpZXNlcyBWZXJoYWx0ZW4genUgdW50ZXJkcnVlY2tlbiwgaXN0IGRpZQorICAgIE9wdGlvbiBgLXYnIHZvcmhhbmRlbi4KKworICAgIElzdCBkZXIgU3BpZWxlciBhbHMgYWJ3ZXNlbmQgZ2VrZW5uemVpY2huZXQsIHplaWd0ICdmaW5nZXInIGRpZQorICAgIFdlZ21lbGR1bmcgZGVzIFNwaWVsZXJzIGFuLgorICAgIFdpbGwgbWFuIG51ciB3aXNzZW4sIG9iIGVpbiBTcGllbGVyIGFscyBhYndlc2VuZCBnZWtlbm56ZWljaG5ldCBpc3QsIAorICAgIGthbm4gbWFuIGRlbiBCZWZlaGwgJ3dlZ21lbGR1bmcnIGJlbnV0emVuLgorCisgU0lFSEUgQVVDSDoKKyAgICBhdmF0YXIsIGVtYWlsLCB1cmwsIG1lc3NlbmdlciwgaWNxLCBvcnQsIHdlZywgKHdlZ21lbGR1bmcpCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIDI3LjA1LjIwMTUsIEJvaW5nCmRpZmYgLS1naXQgYS9kb2MvcGNtZC9mbHVlc3RlcmUgYi9kb2MvcGNtZC9mbHVlc3RlcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U3M2U0YQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wY21kL2ZsdWVzdGVyZQpAQCAtMCwwICsxLDI1IEBACisKK2ZsdWVzdGVyZQorLS0tLS0tLS0tCisKKyBLT01NQU5ETzoKKyAgICBmbHVlc3RlcmUgPHdlbT4genUgPHRleHQ+CisKKyBBUkdVTUVOVEU6CisKKyAgICAgPHdlbT4KKyAgICAgICAgRGFzIExlYndlc2VuLCBkZW0gRHUgZXR3YXMgenVmbHVlc3Rlcm4gd2lsbHN0CisgICAgIDx0ZXh0PgorICAgICAgICBEZXIgenUgZmx1ZXN0ZXJuZGUgVGV4dAorCisgQkVTQ0hSRUlCVU5HOgorICAgIEdpYnQgZWluZSBNaXR0ZWlsdW5nIGFuIGRhcyBhbmdlZ2ViZW5lIExlYmV3ZXNlbiAobWVpc3RlbnMgZWluIFNwaWVsZXIpLAorICAgIGRpZSBuaWVtYW5kIGFuZGVyZXMgaG9lcmVuIGthbm4uIERhcyBMZWJld2VzZW4gbXVzcyBzaWNoIGltIHNlbGJlbiBSYXVtCisgICAgYmVmaW5kZW4uCisKKyBTSUVIRSBBVUNIOgorICAgIHNhZ2UsIGZyYWdlLCBhbnR3b3J0ZSwgdGVpbGUgKG1pdCksIGdlc3ByYWVjaCwgcnVmZSwgZWJlbmVuLCB3ZWcsCisgICAgaWdub3JpZXJlLCBrb2JvbGQKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgVGh1LCAyNC4wNy4xOTk3LCAwOTowMDowMCB2b24gV2FyZ29uCmRpZmYgLS1naXQgYS9kb2MvcGNtZC9mcmFnZSBiL2RvYy9wY21kL2ZyYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhOTY4MWIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcGNtZC9mcmFnZQpAQCAtMCwwICsxLDMxIEBACisKK2ZyYWdlCistLS0tLQorCisgS09NTUFORE86CisgICAgZnJhZ2UgPG5wYz4gbmFjaCA8d2FzPgorICAgIGZyYWdlIDxzcGllbGVyPiA8d2FzPgorCisgQVJHVU1FTlRFOgorCisgICAgIDxucGM+CisgICAgICAgIEVpbiBOUEMsIHZvbiBkZW0gbWFuIGV0d2FzIHdpc3NlbiB3aWxsCisgICAgIDxzcGllbGVyPgorICAgICAgICBFaW4gU3BpZWxlciwgdm9uIGRlbSBtYW4gZXR3YXMgd2lzc2VuIHdpbGwKKyAgICAgPHdhcz4KKyAgICAgICAgRGllIEZyYWdlIGFuIHNpY2gKKworIEJFU0NIUkVJQlVORzoKKyAgICBNYW4gYmVmcmFndCBlaW4gTW9uc3RlciBvZGVyIGVpbmVuIFNwaWVsZXIgdWViZXIgaXJnZW5kZXR3YXMuIE5pY2h0IGFsbGUKKyAgICBNb25zdGVyIGhhYmVuIGF1Y2ggQW50d29ydGVuIGVpbnByb2dyYW1taWVydCB1bmQgYmVpIFNwaWVsZXJuIGthbm4gbWFuCisgICAgZXJzdCByZWNodCBuaWNodCB3aXNzZW4sIG9iIHNpZSBhbnR3b3J0ZW4uCisKKyAgICBXZW5uIGVpbiBOUEMgYXVmIGVpbmUgRGVpbmVyIE1laW51bmcgbmFjaCBzaW5udm9sbGUgRnJhZ2Uga2VpbmUgc2lubnZvbGxlCisgICAgQW50d29ydCB3ZWlzcywga2FubnN0IER1IHNlaW5lbSBQcm9ncmFtbWllcmVyIG1pdCBkZW0gaWRlZS1CZWZlaGwgZWluZW4KKyAgICBrbGVpbmVuIERlbmthbnN0b3NzIGdlYmVuLgorCisgU0lFSEUgQVVDSDoKKyAgICBhbnR3b3J0ZQorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBUaHUsIDI0LjA3LjE5OTcsIDA5OjAwOjAwIHZvbiBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9wY21kL2dlc3ByYWVjaCBiL2RvYy9wY21kL2dlc3ByYWVjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzg3N2M4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BjbWQvZ2VzcHJhZWNoCkBAIC0wLDAgKzEsMjUgQEAKKworZ2VzcHJhZWNoCistLS0tLS0tLS0KKworIEtPTU1BTkRPOgorICAgIGdlc3ByYWVjaCAKKworIEFSR1VNRU5URToKKyAgICA8LXM+IChvcHRpb25hbCwgYXVjaDogLXN0aWxsLCAtc2lsZW50IGdlaHQpCisKKyBCRVNDSFJFSUJVTkc6CisgICAgQWxsZSB3ZWl0ZXJlbiBFaW5nYWJlbiB3ZXJkZW4gZ2VuYXVzbyB1bm1pdHRlbGJhciBhbiBhbGxlIFNwaWVsZXIgaW0KKyAgICBzZWxiZW4gUmF1bSB3ZWl0ZXJnZWdlYmVuLCBhbHMgd2VubiBtYW4gZGVuIHNhZ2UtQmVmZWhsIGJlbnV0enQgaGFldHRlLgorCisgICAgV2lyZCBhbHMgQXJndW1lbnQgJy1zJyAoZnVlciBzdGlsbC9zaWxlbnQpIGFuZ2VnZWJlbiwgd2VyZGVuIERlaW5lIEVpbmdhYmVuCisgICAgbmljaHQgaW4gRm9ybSB2b24gIkR1IHNhZ3N0OiAuLi4iIERpciBzZWxiZXIgYW5nZXplaWd0LgorCisgICAgTmFjaCBFaW5nYWJlIHZvbiAiKioiIGtvZW5uZW4gd2llZGVyIGJlbGllYmlnZSBCZWZlaGxlIGVpbmdlZ2ViZW4gd2VyZGVuLgorCisgU0lFSEUgQVVDSDoKKyAgICBzYWdlLCBmcmFnZSwgYW50d29ydGUsIGZsdWVzdGVyZSwgdGVpbGUgKG1pdCksIHJ1ZmUsIGViZW5lbiwgd2VnLAorICAgIGlnbm9yaWVyZSwga29ib2xkCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIDEwLjA4LjIwMDksIFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9wY21kL2dpYiBiL2RvYy9wY21kL2dpYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjhlM2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BjbWQvZ2liCkBAIC0wLDAgKzEsMjMgQEAKK2dpYgorLS0tCisKKyBLT01NQU5ETzoKKyAgICBnaWIgPHppZWw+IDxvYmpla3Q+CisKKyBBUkdVTUVOVEU6CisKKyAgICA8b2JqZWt0PgorICAgICAgICBEZXIgd2VnenVnZWJlbmRlIEdlZ2Vuc3RhbmQKKyAgICA8emllbD4KKyAgICAgICAgRWluIFNwaWVsZXIgb2RlciBOUEMgaW0gZ2xlaWNoZW4gUmF1bQorCisgQkVTQ0hSRUlCVU5HOgorICAgIER1IGdpYnN0IGRlbiBHZWdlbnN0YW5kIDxvYmpla3Q+IGFuIGRlbiBTcGllbGVyIG9kZXIgTlBDIDx6aWVsPi4gTWFuCisgICAgc29sbHRlIHNpY2ggZ2VuYXUgdWViZXJsZWdlbiwgd2VtIG1hbiB3YXMgZ2lidCwgZ2VyYWRlIE5QQ3MgZ2ViZW4gdW5nZXJuCisgICAgU2FjaGVuIGVpbmZhY2ggenVydWVjay4KKworIFNJRUhFIEFVQ0g6CisgICAgbmltbSBbYXVzXSwgaG9sZSAoYXVzKQorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICAxNC4gT2t0IDIwMTEgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9wY21kL2dyYWZpayBiL2RvYy9wY21kL2dyYWZpawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDU4NjBkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BjbWQvZ3JhZmlrCkBAIC0wLDAgKzEsMjQgQEAKKworZ3JhZmlrCistLS0tLS0KKworIEtPTU1BTkRPOgorICAgICBncmFmaWsgW2VpbnxhdXNdCisKKyBCRVNDSFJFSUJVTkc6CisgICAgIE1pdCAiZ3JhZmlrIGF1cyIga2FubnN0IGR1IGRpZSBBbnplaWdlIHZvbiBBU0NJSS1HcmFmaWtlbiBmdWVyCisgICAgIERpY2ggdW50ZXJkcnVlY2tlbi4gTmFjaCBkZW0gQmVmZWhsICJncmFmaWsgZWluIiB3ZXJkZW4gRGlyIHNvbGNoZQorICAgICBHcmFmaWtlbiB3aWVkZXIgYW5nZXplaWd0LgorICAgICBSdWZzdCBEdSBkZW4gQmVmZWhsIG9obmUgUGFyYW1ldGVyIGF1ZiwgZGFubiB3aXJkIERpciBhbmdlemVpZ3QsCisgICAgIG9iIER1IEdyYWZpa2VuIHNlaGVuIG1vZWNodGVzdCBvZGVyIG5pY2h0LgorCisgICAgICoqKiBBQ0hUVU5HICoqKgorICAgICBEaWVzZXIgQmVmZWhsIHd1cmRlIGFtIDE4LiBPa3RvYmVyIDIwMDUgZWluZ2VmdWVocnQuIERhaGVyCisgICAgIGlzdCBkYXZvbiBhdXN6dWdlaGVuLCBkYXNzIGRpZSBFaW5zdGVsbHVuZyBlcnN0IG5hY2ggdW5kIG5hY2gKKyAgICAgYW4gZGVuIGpld2VpbGlnZW4gU3RlbGxlbiBpbSBNb3JnZW5HcmF1ZW4gYmVydWVja3NpY2h0aWd0IHdpcmQuCisgICAgIFdlbm4gRGlyIGVpbmUgc29sY2hlIFN0ZWxsZSBhdWZmYWVsbHQsIHdvIGVzIG5vY2ggbmljaHQgCisgICAgIGJlcnVlY2tzaWNodGlndCB3aXJkLCBkYW5uIHNjaHJlaWJlIGRvY2ggYml0dGUgZWluZSBFLU1haWwgYW4KKyAgICAgWm9vaywgRW5ub3ggb2RlciBCdWdmaXgKKyAgICAgCisgTEVUWkUgQUVOREVSVU5HOgorICAgICAyMDA5LTA5LTEwIHZvbiBab29rCmRpZmYgLS1naXQgYS9kb2MvcGNtZC9oaWxmZSBiL2RvYy9wY21kL2hpbGZlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZmJmZmIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcGNtZC9oaWxmZQpAQCAtMCwwICsxLDc5IEBACisKK2hpbGZlCistLS0tLQorCisgS09NTUFORE86CisgICAgaGlsZmUgW1tnaWxkZSA8Z2lsZGVubmFtZT5dIDx0aGVtYT5dCisKKyBBUkdVTUVOVEU6CisKKyAgICAgPHRoZW1hPgorICAgICAgICBEYXMgVGhlbWEgb2RlciBLb21tYW5kbywgenUgZGVtIER1IGVpbmUgSGlsZmUgaGFiZW4gbW9lY2h0ZXN0CisgICAgIDxnaWxkZW5uYW1lPgorICAgICAgICBOYW1lIGVpbmVyIEdpbGRlIChmdWVyIGdpbGRlbnNwZXppZmlzY2hlIFNlaXRlbikKKworIEJFU0NIUkVJQlVORzoKKyAgICBHaWJ0IEhpbGZzc2VpdGVuIHVlYmVyIGRpZSBCZWZlaGxlIHVuZCBlaW5pZ2UgYWxsZ2VtZWluZSBUaGVtZW4gYXVzLiBPaG5lCisgICAgPHRoZW1hPiB3aXJkIGVpbmUgU2VpdGUgbWl0IGRlbiBUaGVtZW4gZ2V6ZWlndCwgenUgZGVuZW4gZXMgSGlsZnNzZWl0ZW4KKyAgICBnaWJ0LgorCisgICAgQmVpIEhpbGZlbiB6dSBaYXViZXJzcHJ1ZWNoZW4gZ2lidCBlcyBlaW5lIEJlc29uZGVyaGVpdCB6dSBiZWFjaHRlbjoKKyAgICBFaW5pZ2UgR2lsZGVuIGhhYmVuIFphdWJlcnNwcnVlY2hlIG1pdCBnbGVpY2hlbiBOYW1lbiwgYWJlciBldHdhcworICAgIHVudGVyc2NoaWVkbGljaGVyIFdpcmt1bmcsIHVudGVyc2NoaWVkbGljaGVuIEtvc3RlbiBvZGVyIExlcm5iZWRpbmd1bmdlbi4KKyAgICBEZXNoYWxiIGthbm4gbWFuIG5vY2ggYW5nZWJlbiwgdm9uIHdlbGNoZXIgR2lsZGUgbWFuIGRpZSBlbnRzcHJlY2hlbmRlCisgICAgSGlsZmVzZWl0ZSBoYWJlbiBtb2VjaHRlLiBTdGFuZGFyZG1hZXNzaWcgbGFzc2VuIHNpY2ggbnVyIGRpZSBTZWl0ZW4gZGVyCisgICAgR2lsZGUgZXJyZWljaGVuLCBpbiBkZXIgbWFuIGdlcmFkZSBNaXRnbGllZCBpc3QuCisKKyAgICBFcyBnaWJ0IChub2NoPykgbmljaHQgdm9uIGFsbGVuIEdpbGRlbiBIaWxmZXNlaXRlbiB6dSBkZW4gZWluemVsbmVuCisgICAgU3BydWVjaGVuIHVuZCBGYWVoaWdrZWl0ZW4uIE1vbWVudGFuIHNpbmQgZGllcyBudXIgZGllIEFiZW50ZXVyZXIsCisgICAgQmllcnNjaHVldHRsZXIsIEthcmF0ZWthIHVuZCBLbGVyaWtlci4gRXMgd2lyZCBqZWRvY2ggYXVjaCBhdWYgZGVuCisgICAgamV3ZWlsaWdlbiBHaWxkZW5oaWxmZXNlaXRlbiBub2NoIGRhcmF1ZiBoaW5nZXdpZXNlbi4KKworIFNDSFJFSUJXRUlTRU46CisgICAgVmllbGUgS29tbWFuZG9zIHZlcnN0ZWhlbiBtZWhyZXJlIHVudGVyc2NoaWVkbGljaGUgQXVmcnVmZS4gQXVzc2VyZGVtIHNpbmQKKyAgICBtYW5jaGUgQmVzdGFuZHRlaWxlIGRlciBFaW5nYWJlemVpbGUgZmVzdCB2b3JnZWdlYmVuLCBhbmRlcmUgZGFnZWdlbgorICAgIHZhcmlhYmVsLiBVbSBuaWNodCBqZWRlbiBtb2VnbGljaGVuIEF1ZnJ1ZiBpbiBlaW5lIGVpZ2VuZSBaZWlsZSBwYWNrZW4genUKKyAgICBtdWVzc2VuLCBnaWJ0IGVzIGZvbGdlbmRlIEtvbnZlbnRpb25lbiBpbiBkZXIgU2NocmVpYndlaXNlIGRlcgorICAgIEtPTU1BTkRPLVplaWxlOgorCisgICAgIGZlc3QKKyAgICAgICAgRmVzdGUgQmVzdGFuZHRlaWxlLCBkaWUgYXVjaCBnZW5hdSBzbyBlaW5nZWdlYmVuIHdlcmRlbi4KKyAgICAgPHZhcmlhYmVsPgorICAgICAgICBWYXJpYWJsZSBCZXN0YW5kdGVpbGUuIFNpZSBnZWJlbiBhbiwgd2FzIGdlbmF1IGRlciBCZWZlaGwgYmV3aXJrZW4KKyAgICAgICAgc29sbC4KKyAgICAgWyBPcHRpb25lbiBdCisgICAgICAgIFRlaWxlIGluIGVja2lnZW4gS2xhbW1lcm4gc2luZCBvcHRpb25hbC4KKyAgICAgQWx0ZXIgfCBOYXRpdmVuCisgICAgICAgIEFsdGVybmF0aXZlIEZvcm11bGllcnVuZ2VuIHdlcmRlbiBkdXJjaCBlaW5lbiBzZW5rcmVjaHRlbiBTdHJpY2gKKyAgICAgICAgdm9uZWluYW5kZXIgZ2V0cmVubnQuCisKKyAgICBBbHMgQmVpc3BpZWwgbWFnIGRpZSBLb21tYW5kb3plaWxlIGRlciBgaGlsZmUnLUJlZmVobHMgc2VsYnN0IGhlcmhhbHRlbjoKKyAgICBoaWxmZSBbW2dpbGRlIDxnaWxkZW5uYW1lPl0gPHRoZW1hPl0KKworICAgIEF1ZmdlZHJvZXNlbHQgd3VlcmRlIGRhcyBzbyBhdXNzZWhlbjoKKworICAgICBoaWxmZQorICAgICBoaWxmZSA8dGhlbWE+CisgICAgIGhpbGZlIGdpbGRlIDxnaWxkZW5uYW1lPiA8dGhlbWE+CisKKyAgICBEaWUgYWV1c3NlcmVuIGVja2lnZW4gS2xhbW1lcm4gemVpZ2VuIGFuLCBkYXNzIHNhZW10bGljaGUgUGFyYW1ldGVyCisgICAgb3B0aW9uYWwgc2luZCB1bmQgd2VnZ2VsYXNzZW4gd2VyZGVuIGtvZW5uZW4uIERpZXMgZW50c3ByaWNodCBkZW0gb2JlcmVuCisgICAgQXVmcnVmLgorCisgICAgRGllIGlubmVyZW4gZWNraWdlbiBLbGFtbWVybiB6ZWlnZW4gYW4sIGRhc3MgYXVjaCBkZXIgR2lsZGVudGVpbAorICAgIHdlZ2dlbGFzc2VuIHdlcmRlbiBrYW5uLiBNYW4gZXJoYWVsdCBkYW5uIGVpbmUgSGlsZmUgenUgYWxsZ2VtZWluZW4gVGhlbWVuCisgICAgKGRlciBtaXR0bGVyZSBBdWZydWYpLiBEYXMgPHRoZW1hPiBzZWxic3QgaXN0IGRhYmVpIHZhcmlhYmVsLgorCisgICAgRGllIGRyaXR0ZSBaZWlsZSBzY2hsaWVzc2xpY2ggYmVzdGVodCBhdXMgZGVtIGZlc3RlbiBCZXN0YW5kdGVpbCAiZ2lsZGUiCisgICAgc293aWUgZGVuIFZhcmlhYmxlbiA8Z2lsZGVubmFtZT4gdW5kIDx0aGVtYT4uCisKKyAgICBBbnN0ZWxsZSBkZXIgZG9wcGVsdGVuIGVja2lnZW4gS2xhbW1lcm4gaGFldHRlIG1hbiBkYXMgR2FuemUgYXVjaCBhbHMKKyAgICBBbHRlcm5hdGl2ZSBmb3JtdWxpZXJlbiBrb2VubmVuOgorCisgICAgaGlsZmUgWzx0aGVtYT4gfCBnaWxkZSA8Z2lsZGVubmFtZT4gPHRoZW1hPl0KKworIFNJRUhFIEFVQ0g6CisgICAgZ2lsZGVuCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFRodSwgMjQuMDcuMTk5NywgMDk6MDA6MDAgdm9uIFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL3BjbWQvaGlzdG9yeSBiL2RvYy9wY21kL2hpc3RvcnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU3NDM2MwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wY21kL2hpc3RvcnkKQEAgLTAsMCArMSw3NSBAQAorCitoaXN0b3J5CistLS0tLS0tCisKKyBLT01NQU5ETzoKKyAgICBoaXN0b3J5IChvZGVyOiBoaXN0KQorICAgICY8bnI+CisgICAgJjx0ZXh0PgorICAgIGhpc3RsZW4gPG4+CisgICAgaGlzdG1pbiA8bj4KKyAgICBePGZhbHNjaD5ePHJpY2h0aWc+XgorCisgQVJHVU1FTlRFOgorCisgICAgIDxucj4KKyAgICAgICAgRGllIE51bW1lciBlaW5lcyBCZWZlaGxzIGluIGRlciBIaXN0b3J5CisgICAgIDx0ZXh0PgorICAgICAgICBEZXIgQW5mYW5nIGVpbmVzIEJlZmVobHMgaW4gZGVyIEhpc3RvcnkKKyAgICAgPG4+CisgICAgICAgIEVpbmUgWmFobAorICAgICA8ZmFsc2NoPgorICAgICAgICBGZWhsZXJoYWZ0ZXIgVGV4dAorICAgICA8cmljaHRpZz4KKyAgICAgICAgS29ycmlnaWVydGVyIFRleHQKKworIEJFU0NIUkVJQlVORzoKKyAgICBEaWUgbGV0enRlbiBCZWZlaGxlLCBkaWUgRHUgZWluZ2VnZWJlbiBoYXN0LCB3ZXJkZW4gZ2VzcGVpY2hlcnQuIEF1ZiBkaWVzZQorICAgIGdlc3BlaWNoZXJ0ZW4gQmVmZWhsZSBrYW5uc3QgRHUgenVncmVpZmVuLCBvaG5lIHNpZSBrb21wbGV0dCBuZXUgZWluZ2ViZW4KKyAgICB6dSBtdWVzc2VuOgorCisgICAgYCY8bnI+JyBmdWVocnQgZGVuIEJlZmVobCBtaXQgTnVtbWVyIDxucj4gYXVzLCBzb3dlaXQgZXIgc2ljaCBub2NoIGluIGRlcgorICAgIEJlZmVobHNnZXNjaGljaHRlIGJlZmluZGV0LiBNYW4ga2FubiBqZWRvY2ggYXVjaCBuZWdhdGl2ZSBOdW1tZXJuCisgICAgdmVyd2VuZGVuOiBgJi0wJyBmdWVocnQgZGVuIGxldHp0ZW4gQmVmZWhsIG5vY2htYWwgYXVzLCBgJi0xJyBkZW4KKyAgICB2b3JsZXR6dGVuLCB1bmQgc28gd2VpdGVyLgorCisgICAgYCY8dGV4dD4nIGZ1ZWhydCBkZW4gbGV0enRlbiBCZWZlaGwgYXVzLCBkZXIgbWl0IDx0ZXh0PiBhbmZhZW5ndCAoc29mZXJuCisgICAgdm9yaGFuZGVuKS4KKworICAgIFdpcmQgZWluZSBpZGVudGlzY2hlIEJlZmVobHN6ZWlsZSBtZWhyZmFjaCBoaW50ZXJlaW5hbmRlciBhbmdlZ2ViZW4sIHNvCisgICAgZXJzY2hlaW50IHNpZSBudXIgbnVyIGVpbiBlaW56aWdlcyBNYWwgaW4gZGVyIEJlZmVobHNnZXNjaGljaHRlIChhdWNoLAorICAgIHdlbm4gZGllIFdpZWRlcmhvbHVuZ2VuIHVlYmVyIGAmLTAnIGVyZm9sZ3RlbikuCisKKyAgICBEaWUga29tcGxldHRlIEJlZmVobHNnZXNjaGljaHRlIGthbm5zdCBEdSBEaXIgbWl0IGBoaXN0b3J5JyAob2RlcgorICAgIGFiZ2VrdWVyenQgYGhpc3QnKSBhbnplaWdlbiBsYXNzZW4uIERlciBgaGlzdG9yeSctQmVmZWhsIHNlbGJzdCBlcnNjaGVpbnQKKyAgICBqZWRvY2ggbmljaHQgaW4gZGVyIEdlc2NoaWNodGUuCisKKyAgICBEaWUgTGFlbmdlIGRlciBCZWZlaGxzZ2VzY2hpY2h0ZSBiZXRyYWVndCBzdGFuZGFyZG1hZXNzaWcgNDAgQmVmZWhsZSwgZGllcworICAgIGthbm4gbWFuIGFiZXIgbWl0IGRlbSBCZWZlaGwgYGhpc3RsZW4gPG4+JyBhZW5kZXJuLiBEaWUgdm9yZWluZ2VzdGVsbHRlbgorICAgIDQwIEJlZmVobGUgYmlsZGVuIGFsbGVyZGluZ3MgZGFzIE1heGltdW0sIHdlbGNoZXMgbmljaHQgdWViZXJzY2hyaXR0ZW4KKyAgICB3ZXJkZW4ga2Fubi4KKworICAgIE5vcm1hbGVyd2Vpc2UgbGFuZGV0ICpqZWRlciogQmVmZWhsIGluIGRlciBCZWZlaGxzZ2VzY2hpY2h0ZS4gV2lsbCBtYW4KKyAgICBhYmVyIHouQi4gZGllIEJld2VndW5nc2JlZmVobGUgbmljaHQgaW4gZGVyIEhpc3RvcnkgaGFiZW4sIHNvIGthbm4gbWFuIG1pdAorICAgIGBoaXN0bWluIDxuPicgZmVzdGxlZ2VuLCBhYiB3ZWxjaGVyIExhZW5nZSBkaWUgQmVmZWhsZSBhdWZnZW5vbW1lbiB3ZXJkZW4uCisgICAgTWl0IGBoaXN0bWluIDQnIHdlcmRlbiBhbHNvIG51ciBCZWZlaGxzemVpbGVuIG1pdCBtaW5kZXN0ZW5zIHZpZXIKKyAgICBCdWNoc3RhYmVuIExhZW5nZSBhdWZnZW5vbW1lbi4gRGllcyBzdGVsbHQgdWVicmlnZW5zIGVpbmUgc2lubnZvbGxlCisgICAgR3JvZXNzZSBkYXIsIGRhIGJlaSBrdWVyemVyZW4gWmVpbGVuIGRpZSBFaW5nYWJlIGRlcyAmLUtvbW1hbmRvcyBtZWhyCisgICAgQXVmd2FuZCBkYXJzdGVsbHQgYWxzIGRpZSBOZXVlaW5nYWJlIGRlcyBCZWZlaGxzLgorCisgICAgVGlwcGZlaGxlciBpbSBsZXR6dGVuIGVpbmdlZ2ViZW5lbiBCZWZlaGwgbGFzc2VuIHNpY2ggd2llIGZvbGd0CisgICAga29ycmlnaWVyZW46IGBePGZhbHNjaD5ePHJpY2h0aWc+XicuIERhcyBsZXR6dGUgXiBrYW5uIG1hbiBhdWNoIHdlZ2xhc3Nlbi4KKyAgICBadW0gQmVpc3BpZWw6CisKKyAgICA+IHRtIGpwZiBIaSEKKyAgICBLZWluIHNvbGNoZXIgU3BpZWxlciEKKyAgICA+IF5qcGZeam9mCisgICAgRHUgdGVpbHN0IEpvZiBtaXQ6IEhpIQorCisgICAgSGllciBoYWV0dGUgdWVicmlnZW5zIGF1Y2ggYF5wXm8nIGdlbnVlZ3QuCisKKyBTSUVIRSBBVUNIOgorICAgIGVyc2V0enVuZ3NhbnplaWdlLCBhbGlhcworCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBUaHUsIDI0LjA3LjE5OTcsIDA5OjAwOjAwIHZvbiBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9wY21kL2hvbGUgYi9kb2MvcGNtZC9ob2xlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNTVlNWQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcGNtZC9ob2xlCkBAIC0wLDAgKzEsMjMgQEAKKworaG9sZSAoYXVzKQorLS0tLS0tLS0tLQorCisgS09NTUFORE86CisgICAgaG9sZSA8b2JqZWt0PiBhdXMgPGJlaGFlbHRlcj4KKworIEFSR1VNRU5URToKKworICAgICA8b2JqZWt0PgorICAgICAgICBEZXIgZ2V3dWVuc2NodGUgR2VnZW5zdGFuZAorICAgICA8YmVoYWVsdGVyPgorICAgICAgICBFaW4gQmVoYWVsdGVyCisKKyBCRVNDSFJFSUJVTkc6CisgICAgTWl0IGRpZXNlbSBLb21tYW5kbyBrYW5uc3QgRHUgR2VnZW5zdGFlbmRlIGF1cyBCZWhhZWx0ZXJuIG5laG1lbi4KKyAgICBBbGxlcmRpbmdzIG11c3MgZGVyIEJlaGFlbHRlciBkYXp1IGdlb2VmZm5ldCBzZWluLgorCisgU0lFSEUgQVVDSDoKKyAgICBzdGVja2UsIG5pbW0gW2F1c10KKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgVGh1LCAyNC4wNy4xOTk3LCAwOTowMDowMCB2b24gV2FyZ29uCmRpZmYgLS1naXQgYS9kb2MvcGNtZC9pY3EgYi9kb2MvcGNtZC9pY3EKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI4YjBlNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wY21kL2ljcQpAQCAtMCwwICsxLDIxIEBACisKK2ljcQorLS0tCisKKyBLT01NQU5ETzoKKyAgICBpY3EgWzxudW1tZXI+XQorCisgQVJHVU1FTlRFOgorCisgICAgIDxudW1tZXI+IChvcHRpb25hbCkKKyAgICAgICAgRGllIG5ldWUgTnVtbWVyCisKKyBCRVNDSFJFSUJVTkc6CisgICAgV2VubiBEdSBlaW5lIElDUS1OdW1tZXIgaGFzdCBrYW5uc3QgRHUgc2llIG1pdCBkaWVzZW0KKyAgICBLb21tYW5kbyBlaW50cmFnZW4uCisgICAgT2huZSA8bnVtbWVyPiB3aXJkIGRpZSBha3R1ZWxsZSBOdW1tZXIgYW5nZXplaWd0LCBpc3Qgc2llICdrZWluZScsCisgICAgc28gd2lyZCBkaWUgTnVtbWVyIGdlbG9lc2NodC4KKworIFNJRUhFIEFVQ0g6CisgICAgUGVyc29lbmxpY2hlIERldGFpbHM6IGVtYWlsLCB1cmwsIG1lc3Nlbmdlciwgb3J0CisgICAgU29uc3RpZ2VzOiAgICAgICAgICAgIGZpbmdlcgpkaWZmIC0tZ2l0IGEvZG9jL3BjbWQvaWRlZSBiL2RvYy9wY21kL2lkZWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEzNDJjNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wY21kL2lkZWUKQEAgLTAsMCArMSw0NSBAQAoraWRlZQorLS0tLQorCitLT01NQU5ETzoKKyAgICBpZGVlIDx0ZXh0PgorICAgIGlkZWUgPG9iamVrdD46PHRleHQ+CisKK0FSR1VNRU5URToKKworICAgIDx0ZXh0PgorICAgICAgICBFaW5lIE1pdHRlaWx1bmcKKyAgICA8b2JqZWt0PgorICAgICAgICBFaW4gUmVmZXJlbnpvYmpla3QsIGRhcyBuZWJlbiBEaXIgbGllZ3Qgb2RlciBpbiBEZWluZW0gSW52ZW50YXIgaXN0CisKK0JFU0NIUkVJQlVORzoKKyAgICBTcGVpY2hlcnQgZWluZSBNaXR0ZWlsdW5nIHVlYmVyIGVpbmUgSWRlZSwgd2llIG1hbiBkYXMgU3BpZWwgdmVyYmVzc2VybgorICAgIG9kZXIgdmVyc2Nob2VuZXJuIGthbm4uIEJlaXNwaWVsZSB3YWVyZW4gd2VpdGVyZSBEZXRhaWxzIGluIFJhZXVtZW4gb2RlcgorICAgIGFuIE9iamVrdGVuOyBWb3JzY2hsYWVnZSB6dXIgVmVyYmVzc2VydW5nIGRlciBTeW50YXggYW4gYmVzdGltbXRlbgorICAgIFN0ZWxsZW47IElkZWVuLCB3aWUgbWFuIGRhcyBBbWJpZW50ZSBlaW5lcyBSYXVtZXMgbm9jaCB2ZXJiZXNzZXJuIGthbm4uCisgICAgRGllIE1hZ2llciB3ZXJkZW4gdmVyc3VjaGVuLCBhbGxlIE1pdHRlaWx1bmdlbiBpbiBkaWUgVGF0IHVtenVzZXR6ZW4sCisgICAgc293ZWl0IHNpZSBpaG5lbiBzaW5udm9sbCBlcnNjaGVpbmVuIDopCisKKyAgICBXZW5uIER1IGVpbmVuIFRpcHBmZWhsZXIgZ2VmdW5kZW4gaGFzdCwgc28ga2FubnN0IER1IGRlbiBWZXJhbnR3b3J0bGljaGVuCisgICAgbWl0IGRpZXNlbSBCZWZlaGwgZGF2b24gdW50ZXJyaWNodGVuLgorICAgIEFsbGUgVm9yc2NobGFlZ2Ugc2luZCAqaGVyemxpY2ggd2lsbGtvbW1lbio7IHpvZWdlcmUgYWxzbyBuaWNodCwgd2VubiBEdQorICAgIGVpbmUgZ3V0ZSBJZGVlIGhhc3QhCisKKyAgICBXZW5uIER1IGVpbmUgSWRlZSBmdWVyIGVpbiBiZXN0aW1tdGVuIE9iamVrdCBvZGVyIE5QQyBoYXN0LCBrYW5uc3QgRHUKKyAgICBkaWVzZXMvZGllc2VuIGhpbnRlciBlaW5lbSBEb3BwZWxwdW5rdCBhbmdlYmVuLCBkYW1pdCBkZXIgZnVlciBkYXMgT2JqZWt0CisgICAgdmVyYW50d29ydGxpY2hlIE1hZ2llciBkaWUgTWVsZHVuZyBiZWtvbW10LgorICAgIFdlbm4gZGFzIE9iamVrdCBuaWNodCB6dSBmaW5kZW4gaXN0LCB3aXJkIGRpZSBnYW56ZSBFaW5nYWJlIGFscworICAgIE1lbGR1bmcgYXVmZ2VmYXNzdC4KKworQkVNRVJLVU5HOgorICAgIERlciBCZWZlaGwgJ2lkZWUnIGJlemllaHQgc2ljaCBiZWkgTmljaHRhbmdhYmUgZWluZXMgQmV6dWdzb2JqZWt0ZXMKKyAgICBhdWYgZGFzIGxldHp0ZSBiZXRyYWNodGV0ZSBPYmpla3QuIEhhc3QgRHUgYWxzbyBlaW4gT2JqZWt0IHVudGVyc3VjaHQsCisgICAgZGFubiB3aXJkIGRpZSBNZWxkdW5nIGZ1ZXIgZGllc2UgT2JqZWt0IGFiZ2VnZWJlbi4gSGFzdCBEdSBhYmVyIGRlbgorICAgIFJhdW0gdW50ZXJzdWNodCBvZGVyICdzY2hhdScgZWluZ2VnZWJlbiwgd2lyZCBkaWUgTWVsZHVuZyBmdWVyIERlaW5lbgorICAgIG1vbWVudGFuZW4gUmF1bSBhYmdlc2V0enQuCisKK1NJRUhFIEFVQ0g6CisgICAgYnVnLCB0eXBvLCBkZXRhaWwsIGJlenVnc29iamVrdAorCitMRVRaVEUgQWVOREVSVU5HOgorICAgIDEyLiBPa3QgMjAxMSBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL3BjbWQvaWRsZXplaXQgYi9kb2MvcGNtZC9pZGxlemVpdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTQ1OWVjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BjbWQvaWRsZXplaXQKQEAgLTAsMCArMSwxOSBAQAorCitpZGxlemVpdAorLS0tLS0tLS0KKworIEtPTU1BTkRPOgorICAgIGlkbGV6ZWl0IDxuYW1lPgorCisgQVJHVU1FTlRFOgorCisgICAgIDxuYW1lPgorICAgICAgICBOYW1lIGVpbmVzIFNwaWVsZXJzCisKKyBCRVNDSFJFSUJVTkc6CisgICAgRGllc2VyIEJlZmVobCBnaWJ0IGRpZSBaZWl0IGF1cywgZGllIGVpbiBTcGllbGVyIHBhc3NpdiBpc3QuCisgICAgRGFubiBtdXNzIG1hbiBuaWNodCBqZWRlcyBtYWwgZGVuIFNwaWVsZXIgZmluZ2Vybiwgd2VubiBtYW4gd2lzc2VuCisgICAgd2lsbCwgb2IgZXIgZ2VyYWRlIGFuc3ByZWNoYmFyIGlzdCBvZGVyIG5pY2h0LgorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBNaXQsIDI1LiBGZWIgMjAwNCwgMTI6NDY6MDAgdm9uIFJpa3VzCmRpZmYgLS1naXQgYS9kb2MvcGNtZC9pZ25vcmllcmUgYi9kb2MvcGNtZC9pZ25vcmllcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdlOWIyNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wY21kL2lnbm9yaWVyZQpAQCAtMCwwICsxLDEzNCBAQAorCitpZ25vcmllcmUKKy0tLS0tLS0tLQorCisgS09NTUFORE86CisgICAgaWdub3JpZXJlIDxzcGllbGVyPiB8IDxzcGllbGVyPi48YWt0aW9uPiB8IC48YWt0aW9uPgorICAgIGlnbm9yaWVyZSA8c3BpZWxlcj5APG11ZD4gfCA8c3BpZWxlcj5AIHwgQDxtdWQ+CisgICAgaWdub3JpZXJlIDxzcGllbGVyPi48YWt0aW9uPi48ZWluc2NocmFlbmt1bmc+CisgICAgaWdub3JpZXJlCisKKyBBUkdVTUVOVEU6CisKKyAgICAgPGFrdGlvbj4KKyAgICAgICAgRGllIHp1IGlnbm9yaWVyZW5kZSBBa3Rpb24gKEtvbW1hbmRvKQorICAgICA8c3BpZWxlcj4KKyAgICAgICAgTmFtZSBkZXMgenUgaWdub3JpZXJlbmRlbiBTcGllbGVycworICAgICA8bXVkPgorICAgICAgICBOYW1lIGVpbmVzIE1VRHMKKyAgICAgPGVpbnNjaHJhZW5rdW5nPgorICAgICAgICBEaWVzIGthbm4gZGllIGlnbm9yaWVydGUgQWt0aW9uIG5vY2htYWwgZWluc2NocmFlbmtlbiAocy51LikKKworIEJFU0NIUkVJQlVORzoKKyAgICBXZW5uIERpciBqZW1hbmQgbWFlY2h0aWcgYXVmIGRpZSBOZXJ2ZW4gZ2VodCBvZGVyIERpciBlaW5pZ2UgQWt0aW9uZW4KKyAgICBuaWNodCBpbiBkZW4gS3JhbSBwYXNzZW4sIGthbm5zdCBEdSBEaWNoIG1pdCBkaWVzZW0gS29tbWFuZG8gdm9yIGRlbgorICAgIEF1c3dpcmt1bmdlbiBzY2h1ZXR6ZW4uCisKKyAgICBGb2xnZW5kZSBNb2VnbGljaGtlaXRlbiBiZXN0ZWhlbjoKKworICAgICAnaWdub3JpZXJlIDxzcGllbGVyPicKKyAgICAgICAgU2FlbXRsaWNoZSBNZWxkdW5nZW4sIGRpZSBkZXIgU3BpZWxlciA8c3BpZWxlcj4gZXJ6ZXVndCwgd2VyZGVuCisgICAgICAgIHVudGVyZHJ1ZWNrdC4gRGllcyBpc3QgZWluZSBzZWhyIGRyYXN0aXNjaGUgTWFzc25haG1lIQorCisgICAgICdpZ25vcmllcmUgLjxha3Rpb24+JworICAgICAgICBBbGxlIE1lbGR1bmdlbiwgZGllIDxha3Rpb24+IGVyemV1Z3QsIHdlcmRlbiB1bnRlcmRydWVja3QuIEVzIHdpcmQKKyAgICAgICAgbWVpc3RlbnMgamVkb2NoIGF1ZiBkaWUgZ2VuYXVlIFNjaHJlaWJ3ZWlzZSBnZWFjaHRldCAoQXVzbmFobWVuIHMudS4pOworICAgICAgICB3ZW5uIG1hbiBhbHNvIG5pZW1hbHMgZ2V3ZWNrdCB3ZXJkZW4gd2lsbCwgbXVzcyBtYW4gc293b2hsIGAud2Vja2UnCisgICAgICAgIGFscyBhdWNoIGAud2VjaycgaWdub3JpZXJlbiEKKworICAgICAnaWdub3JpZXJlIDxzcGllbGVyPi48YWt0aW9uPicKKyAgICAgICAgRWluZSBLb21iaW5hdGlvbiBkZXIgb2JpZ2VuIE1vZWdsaWNoa2VpdGVuOiBEaWUgQWt0aW9uIDxha3Rpb24+CisgICAgICAgIHdpcmQgbnVyIGRhbm4gaWdub3JpZXJ0LCB3ZW5uIHNpZSB2b20gU3BpZWxlciA8c3BpZWxlcj4ga29tbXQuIEFuZGVyZQorICAgICAgICBNZWxkdW5nZW4gdm9uIDxzcGllbGVyPiB3ZXJkZW4gamVkb2NoIHdlaXRlcmhpbiBha3plcHRpZXJ0LgorCisgICAgICdpZ25vcmllcmUgPHNwaWVsZXI+LmViZW5lbi48ZWJlbmU+JworICAgICAnaWdub3JpZXJlIDxzcGllbGVyPi5lYmVuZW4nCisgICAgICAgIFNvIGthbm4gbWFuIGRpZSBBZXVzc2VydW5nZW4gZWluZXMgU3BpZWxlcnMgYXVmIGVpbmVyIGJlc3RpbW10ZW4gRWJlbmUKKyAgICAgICAgb2RlciBhdWYgYWxsZW4gRWJlbmVuIGlnbm9yaWVyZW4sIG9obmUgaWhuIGdsZWljaCBrb21wbGV0dCB6dQorICAgICAgICBpZ25vcmllcmVuLgorICAgICAgICBFaW4gQmVpc3BpZWwgd2FlcmUgJ2lnbm9yaWVyZSB0aWxseS5lYmVuZW4uYWxsZ2VtZWluJy4gRGFtaXQgYmVrb21tdAorICAgICAgICBtYW4gbnVyIGRpZSBBZXVzc2VydW5nZW4gYXVmIGRlciBFYmVuZSA8QWxsZ2VtZWluPiBuaWNodCBtaXQsIGFsbGUKKyAgICAgICAgYW5kZXJlbiBzY2hvbi4KKyAgICAgICAgQlRXOiBkYXMgZnVua3Rpb25pZXJ0IHp1ciBaZWl0IG5pY2h0IGZ1ZXIgU3BpZWxlciBhdXMgYW5kZXJlbiBNdWRzLgorICAgICAKKyAgICAgJ2lnbm9yaWVyZSA8c3BpZWxlcj4ubWFpbCcKKyAgICAgICAgSWdub3JpZXJ0IFBvc3QgKG11ZGludGVybmUgTWFpbCksIGRpZSB2b24gPHNwaWVsZXI+IGFiZ2VzYW5kdCB3dXJkZS4KKworICAgICAnaWdub3JpZXJlIDxzcGllbGVyPi5uZXdzJworICAgICAgICBJZ25vcmllcnQgTVBBLUFydGlrZWwgdm9uIDxzcGllbGVyPiBiZWkgbm4uIChOaWNodCBiZWkgZ2V6aWVsdGVtIExlc2VuCisgICAgICAgIHZvbiBBcnRpa2Vsbi4pCisKKyAgICAgJ2lnbm9yaWVyZSA8c3BpZWxlcj5APG11ZD4nCisgICAgICAgIEFsbGUgTWl0dGVpbHVuZ2VuIGRlcyBTcGllbGVycyA8c3BpZWxlcj4gYXVzIGRlbSBNdWQgPG11ZD4gd2VyZGVuCisgICAgICAgIGFiZ2VibG9ja3QuCisKKyAgICAgJ2lnbm9yaWVyZSA8c3BpZWxlcj5AJworICAgICAgICBEaWUgTWl0dGVpbHVuZ2VuIHZvbiBhbGxlbiBTcGllbGVybiBuYW1lbnMgPHNwaWVsZXI+IGluIGFuZGVyZW4gTXVkcworICAgICAgICB3ZXJkZW4gYWJnZWJsb2NrdC4gRGllcyBpc3QgZWluZSBzZWhyIGRyYXN0aXNjaGUgTWFzc25haG1lLCBkaWUgbWFuCisgICAgICAgIHNpY2ggZ3V0IHVlYmVybGVnZW4gc29sbHRlLiBTY2hsaWVzc2xpY2gga29lbm5lbiBzaWNoIGhpbnRlciBkZW0KKyAgICAgICAgZ2xlaWNoZW4gTmFtZW4gaW4gdW50ZXJzY2hpZWRsaWNoZW4gTXVkcyBhdWNoIHVudGVyc2NoaWVkbGljaGUgTGV1dGUKKyAgICAgICAgdmVyYmVyZ2VuIQorCisgICAgICdpZ25vcmllcmUgQDxtdWQ+JworICAgICAgICBFcyB3ZXJkZW4gc2FlbXRsaWNoZSBNaXR0ZWlsdW5nZW4gYXVzIGRlbSBNdWQgPG11ZD4gaWdub3JpZXJ0LiBBdWNoCisgICAgICAgIGRpZXMgaXN0IGVpbmUgcmVjaHQgZHJhc3Rpc2NoZSBNYXNzbmFobWUhCisKKyAgICAgJ2lnbm9yaWVyZScKKyAgICAgICAgRGllIExpc3RlIGRlciBpZ25vcmllcnRlbiBBa3Rpb25lbiB1bmQgU3BpZWxlciB3aXJkIGFuZ2V6ZWlndC4KKworICAgIEZvbGdlbmRlIEFrdGlvbmVuIGdpYnQgZXMsIHdlbGNoZSBhdWNoIGFuZGVyZSBTY2hyZWlid2Vpc2VuIHVtZmFzc2VuOgorICAgICAgc2FnZSAoc2FnZSwgc2FnLCAnKSwgZW1vdGUgKGVtb3RlcywgcmVtb3RlcyksIHJ1ZmUgKHJ1ZmUsIHJ1ZiksCisgICAgICB0ZWlsZW1pdCAodGVpbGUtbWl0cyksIC4uLiAoTGlzdGUgbm9jaCB1bnZvbGxzdGFlbmRpZykKKworICAgIFdpbGwgbWFuIGVpbmVuIEVpbnRyYWcgd2llZGVyIGVudGZlcm5lbiwgbXVzcyBtYW4gZWluZmFjaCBub2NoIGVpbm1hbCBkYXMKKyAgICBlbnRzcHJlY2hlbmRlIGBpZ25vcmllcmUnLUtvbW1hbmRvIGVpbmdlYmVuLgorCisgICAgTmViZW4gS29tbXVuaWthdGlvbnNrb21tYW5kb3Mgdm9uIFNwaWVsZXIgenUgU3BpZWxlciBsYXNzZW4gc2ljaCBhdWNoIG5vY2gKKyAgICBmb2xnZW5kZSBEaW5nZSBhYndlaHJlbiAoYWxsZW4gZGllc2VuIEZhZWxsZW4gbGFlc3N0IHNpY2ggZWluIFNwaWVsZXJuYW1lCisgICAgdm9yYW5zdGVsbGVuLCB3ZW5uIG1hbiBkYXMgbnVyIGJlaSBlaW5lbSBiZXN0aW1tdGVuIFNwaWVsZXIgaWdub3JpZXJlbgorICAgIHdpbGwpOgorCisgICAgIFNwZW5kaWVyZW4gaW4gZGVyIEtuZWlwZQorCisgICAgICAgICAqIC5zcGVuZGllcmUKKyAgICAgICAgICogLnNwZW5kaWVyZS5nZXRyYWVua2UKKyAgICAgICAgICogLnNwZW5kaWVyZS5hbGtvaG9sCisgICAgICAgICAqIC5zcGVuZGllcmUuZXNzZW4KKworICAgICBHZWZ1bmRlbiB3ZXJkZW4gZHVyY2ggYW5kZXJlIFNwaWVsZXIKKyAgICAgCisgICAgICAgICBIaWVybWl0IHdpcmQgdmVyaGluZGVydCwgZGFzcyBmcmVtZGUgU3BpZWxlciBkZW4gZWlnZW5lbgorICAgICAgICAgQXVmZW50aGFsdHNvcnQgZXJtaXR0ZWxuIGtvZW5uZW4gKG5vY2ggbmljaHQgdm9sbHN0YWVuZGlnCisgICAgICAgICBpbXBsZW1lbnRpZXJ0KS4KKyAgICAgICAgICogLmZpbmRlIChzY2hsaWVzc3QgYWxsZSBuYWNoZm9sZ2VuZGVuIGVpbikKKyAgICAgICAgICogLmZpbmRlLmdsYXN3dWVyZmVsCisgICAgICAgICAqIC5maW5kZS5mZWxkc3RlY2hlcgorCisgICAgIFZlcnNjaGllZGVuZXMKKworICAgICAgICAgKiAuc2hvdXQKKyAgICAgICAgICAgRGllIEFrdGlvbiAnc2hvdXQnIGlzdCBuaWNodCBkYXMgZ2xlaWNoZSB3aWUgJ3J1ZmUnLCBzb25kZXJuCisgICAgICAgICAgIHVtZmFzc3QgTWVsZHVuZ2VuIGF1cyBkZW4gUmVnaW9uZW4sIHdpZSBkaWUgQW5rdW5mdCBkZXIgSHlkcmEgb2RlcgorICAgICAgICAgICBkYXMgTG9lc2VuIGJlc3RpbW10ZXIgUXVlc3RzLgorICAgICAgICAgKiAubWF1cy48dmVyYj4KKyAgICAgICAgICogLmtudWRkZWxtYXVzLjx2ZXJiPgorICAgICAgICAgICBEaWVzZSBiZWlkZW4gaWdub3JpZXJlbiBkaWUgRGlkZGxtYXVzLgorCisgICAgIE1lbGR1bmdlbiBhdXMgZGVuIEFyZW5lbgorCisgICAgICAgICAqIC5hcmVuYSAoYWxsZSB1LmcuKQorICAgICAgICAgKiAuYXJlbmEuc2VoZXJ3ZXR0YmV3ZXJiIChTZWhlcndldHRiZXdlcmIgV3Vlc3RlbmFyZW5hKQorICAgICAgICAgKiAuYXJlbmEuZ2xhZGlhdG9yIChIZXJhdXNmb3JkZXJ1bmcgR2xhZGlhdG9yZW4pCisgICAgICAgICAqIC5hcmVuYS5kdWVsbCAoRHVlbGxhdWZmb3JkZXJ1bmdlbiBkZXIgV3Vlc3RlbmFyZW5hKQorICAgICAgICAgKiAuYXJlbmEuZmVnZWZldWVyIChEdWVsbGFua3VlbmRpZ3VuZ2VuIEZlZ2VmZXVlcikKKyAgICAgICAgICogLmFyZW5hLmZlZ2VmZXVlcnNjcm9sbCAoS2FtcGZzY3JvbGwgRmVmZWZldWVyKQorICAgICAgICAgKiAuYXJlbmEuZmVnZWZldWVyZHVlbGwgKER1ZWxsYXVmZm9yZGVydW5nZW4gRmVnZWZldWVyKQorICAgICAgICAgKiAuYXJlbmEuc2NobGFjaHRmZWxkIChTY2hsYWNodGZlbGQgaW0gdmVybC4gTGFuZCkKKworIFNJRUhFIEFVQ0g6CisgICAgc2FnZSwgZnJhZ2UsIGFudHdvcnRlLCBmbHVlc3RlcmUsIHRlaWxlIChtaXQpLCBnZXNwcmFlY2gsIHJ1ZmUsIGViZW5lbiwKKyAgICB3ZWcsIGtvYm9sZAorCisgTEVUWlRFIEFFTkRFUlVORzoKKyAgICAwMi4xMC4yMDEzLCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9wY21kL2luZm8gYi9kb2MvcGNtZC9pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NWFjNmIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcGNtZC9pbmZvCkBAIC0wLDAgKzEsMzMgQEAKKworaW5mbworLS0tLQorCisgS09NTUFORE86CisgICAgaW5mbworICAgIHB1bmt0ZQorCisgQkVTQ0hSRUlCVU5HOgorICAgIERpZXNlIEtvbW1hbmRvcyBnZWJlbiBkaWUgd2ljaHRpZ3N0ZW4gRGF0ZW4gdWViZXIgRGVpbmVuIENoYXJha3RlciBhdXMuCisgICAgRGF6dSBnZWhvZXJlbjoKKworICAgICAqIERlaW4gdm9sbGVyIE5hbWUgbWl0IFByZXNheSB1bmQgVGl0ZWwsCisgICAgICogRGVpbmUgUmFzc2UsCisgICAgICogRGVpbmUgQ2hhcmFrdGVyZWluc3RlbGx1bmcsCisgICAgICoga29lcnBlcmxpY2hlIEF0dHJpYnV0ZSB3aWUgR2VzY2hsZWNodCwgR3JvZXNzZSB1bmQgR2V3aWNodCwKKyAgICAgKiBEZWluZSBTcGllbGVyc3R1ZmUsCisgICAgICogZGllIEdpbGRlLCBkZXIgRHUgYW5nZWhvZXJzdCwgdW5kIGRpZSBTdHVmZSBkb3J0LAorICAgICAqIEVyZmFocnVuZ3MtIHVuZCBBYmVudGV1ZXJwdW5rdGUsCisgICAgICogRGVpbmUgQXR0cmlidXRlLAorICAgICAqIERlaW5lIGtvZXJwZXJsaWNoZSB1bmQgZ2Vpc3RpZ2UgVmVyZmFzc3VuZywKKyAgICAgKiBnZ2YuIFZvcnNpY2h0c21vZHVzIHVuZCBGbHVjaHRyaWNodHVuZywKKyAgICAgKiBkZXIgR3JhZCBEZWluZXIgS2VubnRuaXMgZGVzIE1vcmdlbkdyYXVlbiwKKyAgICAgKiBnZ2YuIFZlcmdpZnR1bmdzZ3JhZCwgQWJ3ZXNlbmhlaXQgdW5kIEZlaW5kZSBzb3dpZQorICAgICAqIERlaW4gQWx0ZXIuCisKKyAgICBgaW5mbycgemVpZ3QgYWxsZSBkaWVzZSBEYXRlbiBhbiwgd2FlaHJlbmQgYHB1bmt0ZScgbnVyIGRpZSB3aWNodGlnc3RlbgorICAgIERhdGVuIGFuemVpZ3QuCisKKyBTSUVIRSBBVUNIOgorICAgIGt1cnppbmZvCisKKzEyLiBNYXIgMjAwNiBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL3BjbWQvaW5mb3JtIGIvZG9jL3BjbWQvaW5mb3JtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YzA4ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcGNtZC9pbmZvcm0KQEAgLTAsMCArMSwyOSBAQAorCitpbmZvcm0KKy0tLS0tLQorCisgS09NTUFORE86CisgICAgaW5mb3JtIFs8enVzdGFuZD5dCisKKyBBUkdVTUVOVEU6CisKKyAgICAgPHp1c3RhbmQ+CisgICAgICAgIGBlaW4nIG9kZXIgYGF1cycKKworIEJFU0NIUkVJQlVORzoKKyAgICBNaXQgZGllc2VtIEJlZmVobCBrYW5uc3QgRHUgZGVuIEluZm9ybWF0aW9uc21vZHVzIGVpbi0gb2RlciBhdXNzY2hhbHRlbi4KKyAgICBIYXN0IER1IGRlbiBJbmZvcm1hdGlvbnNtb2R1cyBlaW5nZXNjaGFsdGV0LCBzbyB3aXJzdCBEdSBpbW1lciB1ZWJlciBkYXMKKyAgICBFaW4tIHVuZCBBdXNsb2dnZW4gdm9uIFNwaWVsZXJuIGluZm9ybWllcnQuCisKKyAgICBgaW5mb3JtJyBvaG5lIFBhcmFtZXRlciB6ZWlndCBEaXIgZGVuIGFrdHVlbGxlbiBadXN0YW5kIGRlcworICAgIEluZm9ybWF0aW9uc21vZHVzIGFuLgorCisgQkVNRVJLVU5HRU46CisgICAgV2VubiBEdSBudXIgdWViZXIgZGFzIEVpbi0gdW5kIEF1c2xvZ2dlbiBiZXN0aW1tdGVyIFNwaWVsZXIgaW5mb3JtaWVydAorICAgIHdlcmRlbiB3aWxsc3QsIHNvbGx0ZXN0IER1IGRlbiBgZXJ3YXJ0ZSctQmVmZWhsIGJlbnV0emVuLgorCisgU0lFSEUgQVVDSDoKKyAgICBlcndhcnRlCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFRodSwgMjQuMDcuMTk5NywgMDk6MDA6MDAgdm9uIFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL3BjbWQvaW52ZW50dXIgYi9kb2MvcGNtZC9pbnZlbnR1cgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTExMzhkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BjbWQvaW52ZW50dXIKQEAgLTAsMCArMSw0OSBAQAorCitpbnZlbnR1cgorLS0tLS0tLS0KKworIEtPTU1BTkRPOgorICAgIGkgWzxmbGFncz5dCisgICAgaW52IFs8ZmxhZ3M+XQorICAgIGludmVudHVyIFs8ZmxhZ3M+XQorCisgQVJHVU1FTlRFOgorCisgICAgIDxmbGFncz4KKyAgICAgICAgRmxhZ3MsIHVtIGRpZSBBbnplaWdlIHp1IGtvbmZpZ3VyaWVyZW4KKworIEJFU0NIUkVJQlVORzoKKyAgICBFcyB3aXJkIGVpbmUga3VyemUgQmVzY2hyZWlidW5nIGFsbGVyIE9iamVrdGUgYXVzZ2VnZWJlbiwgZGllIER1IGJlaSBEaXIKKyAgICB0cmFlZ3N0LiBOb3JtYWxlcndlaXNlIHdlcmRlbiBhbGxlIE9iamVrdGUgYW5nZXplaWd0IHVuZCBuYWNoIFdhZmZlbiwKKyAgICBSdWVzdHVuZ2VuIHVuZCBWZXJzY2hpZWRlbmVzIHNvcnRpZXJ0LiBEaWVzIGthbm4gbWFuIGFsbGVyZGluZ3MgbWl0IGRlbgorICAgIDxmbGFncz4gYWVuZGVybjoKKworICAgICAtMSAgRWluc3BhbHRpZ2UgQXVzZ2FiZQorICAgICArYSAgTnVyIEF1dG9sb2FkZXIgYW56ZWlnZW4KKyAgICAgLWEgIEtlaW5lIEF1dG9sb2FkZXIgYW56ZWlnZW4KKyAgICAgK2IgIE51ciBPYmpla3RlIHplaWdlbiwgZGllIG1hbiBiZWkgInZlcmthdWZlIGFsbGVzIiBiZWhhZWx0CisgICAgIC1iICBLZWluIE9iamVrdCB6ZWlnZW4sIGRhcyBtYW4gYmVpICJ2ZXJrYXVmZSBhbGxlcyIgYmVoYWVsdAorICAgICAtZiAgSW52ZW50YXIgbmljaHQgdW50ZXJ0ZWlsZW4gb2RlciBnbGVpY2hlIE9iamVrdGUgenVzYW1tZW5mYXNzZW4KKyAgICAgK3IgIE51ciBSdWVzdHVuZ2VuIGFuemVpZ2VuCisgICAgIC1yICBLZWluZSBSdWVzdHVuZ2VuIGFuemVpZ2VuCisgICAgIC1zICBBdXNnYWJlIGFscGhhYmV0aXNjaCBzb3J0aWVyZW4KKyAgICAgK3YgIEFsbGVzIHplaWdlbiwgd2FzIG5pY2h0IFJ1ZXN0dW5nIG9kZXIgV2FmZmUgaXN0CisgICAgIC12ICBBbGxlcyB6ZWlnZW4sIHdhcyBSdWVzdHVuZyBvZGVyIFdhZmZlIGlzdAorICAgICArdyAgTnVyIFdhZmZlbiBhbnplaWdlbgorICAgICAtdyAgS2VpbmUgV2FmZmVuIGFuemVpZ2VuCisKKyAgICBEaWUgQXJndW1lbnRlIHNpbmQgYXVjaCBrb21iaW5pZXJiYXIuCisKKyAgICBCZWkgZGVuIEZsYWdzICsvLWEgdW5kICsvLWIgaXN0IGZvbGdlbmRlcyB6dSBiZWFjaHRlbjogS29tYmluaWVydCBtYW4gc2llCisgICAgbWl0IGRlbiBhbmRlcmVuIEZsYWdzLCBzbyBmaW5kZXQgZWluZSBsb2dpc2NoZSBVTkQtVmVya3VlcGZ1bmcgc3RhdHQuIE1pdAorCisgICAgaW52ICtyICthCisKKyAgICB3ZXJkZW4gYWxzbyBuaWNodCBhbGxlIFJ1ZXN0dW5nZW4gc293aWUgYWxsZSBBdXRvbG9hZGVyIGFuZ2V6ZWlndCwgc29uZGVybgorICAgIG51ciBhbGxlIEF1dG9sb2FkLVJ1ZXN0dW5nZW4uCisKKyBTSUVIRSBBVUNIOgorICAgIGJlaGFsdGUsIGF1c3J1ZXN0dW5nCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFR1ZSwgMjcuMDIuMjAwMSwgMTc6MjU6MDAgdm9uIFRpYW1hawpkaWZmIC0tZ2l0IGEvZG9jL3BjbWQva2t3ZXIgYi9kb2MvcGNtZC9ra3dlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2JiZDcwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BjbWQva2t3ZXIKQEAgLTAsMCArMSwxOSBAQAorCitra3dlcgorLS0tLS0KKworIEtPTU1BTkRPOgorICAgIGtrd2VyCisKKyBBUkdVTUVOVEU6CisgICAga2VpbmUKKworIEJFU0NIUkVJQlVORzoKKyAgICBFcyB3aXJkIGVpbmUgYWxwaGFiZXRpc2NoIHNvcnRpZXJ0ZSBMaXN0ZSBtaXQgZGVuIE5hbWVuIGFsbGVyIG1vbWVudGFuIGltCisgICAgTW9yZ2VuR3JhdWVuIGVpbmdlbG9nZ3RlbiBTcGllbGVyIGF1c2dlZ2ViZW4uCisKKyBTSUVIRSBBVUNIOgorICAgIHdlciwga3dlcgorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBUaHUsIDI0LjA3LjE5OTcsIDA5OjAwOjAwIHZvbiBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9wY21kL2tsZXR0ZXJlIGIvZG9jL3BjbWQva2xldHRlcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdkMDZhNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wY21kL2tsZXR0ZXJlCkBAIC0wLDAgKzEsMjkgQEAKKwora2xldHRlcmUKKy0tLS0tLS0tCisKKyBLT01NQU5ETzoKKyAgICBrbGV0dGVyZSBob2NoIHwgcnVudGVyCisgICAga2xldHRlcmUgYXVzIHwgYXVmIHwgdWViZXIgfCBpbiB8IGF1cyA8b2JqZWt0PgorCisgQVJHVU1FTlRFOgorCisgICAgIDxvYmpla3Q+CisgICAgICAgIEVpbiBHZWdlbnN0YW5kCisKKyBCRVNDSFJFSUJVTkc6CisgICAgRGFzIGlzdCBkZXIgU3RhbmRhcmRiZWZlaGwsIHVtIGVpbiBIaW5kZXJuaXMgenUgdWViZXJ3aW5kZW4uIE1hbmNobWFsCisgICAgcmVpY2hlbiBhYmVyIGF1Y2ggZGllIG5vcm1hbGVuIFJpY2h0dW5nc2JlZmVobGUgYXVzLiBNYW5jaGUgSGluZGVybmlzc2UKKyAgICBzdGVsbGVuIGVpbiBSYWV0c2VsIGRhciwgZGFzIG1pdCByYWZmaW5pZXJ0ZXJlbiBNZXRob2RlbiB1ZWJlcnd1bmRlbgorICAgIHdlcmRlbiB3aWxsLgorCisgQkVNRVJLVU5HOgorICAgIFdlbm4gaXJnZW5kd28gbm9jaCBkZXIgQmVmZWhsIGBrbGV0dGVyZScgaW4gYW5kZXJlciBTeW50YXggYmVub2V0aWd0IHdpcmQsCisgICAgYml0dGUgZWluZSBgZmVobGVyJy1NZWxkdW5nIGhpbnRlcmxhc3NlbiwgZGFtaXQgZGllIE1hZ2llciBlcyBldHdhcworICAgIGxlaWNodGVyIGhhYmVuLCBkaWUgQmVmZWhsZSB6dSB2ZXJlaW5oZWl0bGljaGVuLgorCisgU0lFSEUgQVVDSDoKKyAgICBiZXdlZ3VuZywgZmVobGVyCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFRodSwgMjQuMDcuMTk5NywgMDk6MDA6MDAgdm9uIFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL3BjbWQva2xpbmdlbHRvbiBiL2RvYy9wY21kL2tsaW5nZWx0b24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg1NWQyZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wY21kL2tsaW5nZWx0b24KQEAgLTAsMCArMSwyMyBAQAorS09NTUFORE86CisJa2xpbmdlbHRvbiBhdXMKKyAgICAgICAga2xpbmdlbHRvbiAxLi4zNjAwIAorCitBUkdVTUVOVEU6CisgICAgICAgICAgICAgICAgICA6IGFrdHVlbGxlbiBTdGF0dXMgYW56ZWlnZW4gIAorCSAgMS4uMzYwMCA6IEtsaW5nZWx0b24gbWF4aW1hbCBhbGxlciBuIFNla3VuZGVuIAorCSAgQVVTICAgICA6IEtsaW5nZWx0b24gYXVzc2NoYWx0ZW4uCisKK0JFU0NIUkVJQlVORzoKKyAgICAgICAgVW0gTWl0dGVpbHVuZ2VuIGltIFNjcm9sbCBuaWNodCB6dSB2ZXJwYXNzZW4sIHdpcmQgYmVpIGVpbmdlc2NoYWx0ZXRlbQorICAgICAgICBLbGluZ2VsdG9uIGluIGRlbiB2b3JlaW5nZXN0ZWxsdGVuIFplaXRpbnRlcnZhbGxlbiBlaW4gVG9uc2lnbmFsIHZvbQorICAgICAgICBNdWQgZXJ6ZXVndC4gRGFzIGlzdCBiZXNvbmRlcnMgZnVlciBibGluZGUgU3BpZWxlciB2b24gVm9ydGVpbCwgZGVuZW4KKyAgICAgICAgc29uc3QgTWl0dGVpbHVuZ2VuIHNjaG5lbGwgbWFsIHZlcmxvcmVuIGdlaGVuLgorICAgICAgICBEZXIgVG9uIHdpcmQgbnVyIHByb2R1emllcnQsIHdlbm4gbWFuIG1pdCAndG9uIGVpbicgZGllIFRvbmF1c2dhYmUKKyAgICAgICAgZGVzIE11ZHMgYWt0aXZpZXJ0IGhhdC4KKyAgICAgICAgTWl0dGVpbHVuZ2VuIHNpbmQgaW4gZGllc2VtIFp1c2FtbWVuaGFuZyAnc2FnJyB1bmQgJ3RlaWxlIG1pdCcuCisgCitTSUVIRSBBVUNIOgorCXRlaWxlIG1pdCwgc2FnLCBrbGluZ2VsdG9uLCBncmFmaWsgYXVzLCB0b24sIGtlZXBhbGl2ZQorCitMRVRaVEUgQUVOREVSVU5HOgorICAgMTYuIE1haSAyMDA3ICBFbm5veApkaWZmIC0tZ2l0IGEvZG9jL3BjbWQva29ib2xkIGIvZG9jL3BjbWQva29ib2xkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NzE2NTgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcGNtZC9rb2JvbGQKQEAgLTAsMCArMSw1MSBAQAorCitrb2JvbGQKKy0tLS0tLQorCisgS09NTUFORE86CisgICAga29ib2xkIFs8c2NoYWx0ZXI+XQorCisgQVJHVU1FTlRFOgorCisgICAgIDxzY2hhbHRlcj4gKG9wdGlvbmFsKQorICAgICAgICBgZWluJyBvZGVyIGBhdXMnCisKKyBCRVNDSFJFSUJVTkc6CisgICAgRGVyIEtvYm9sZCBoYXQgbWVocmVyZSBGdW5rdGlvbmVuLCBkaWUgbWl0IGRlbSBTcGVpY2hlcm4gdm9uIE1pdHRlaWx1bmdlbgorICAgIGJlaW0gQmVhcmJlaXRlbiBvZGVyIExlc2VuIGVpbmVzIFRleHRlcyBvZGVyIGFuZGVyZXJlIEFrdGlvbmVuIGluCisgICAgWnVzYW1tZW5oYW5nIHN0ZWhlbi4KKworICAgIE1pdCBga29ib2xkIGVpbicgc2NoYWx0ZXQgbWFuIGRlbiBLb2JvbGQgc28gZWluLCBkYXNzIGVyIHNpY2ggamVkZQorICAgIE1pdHRlaWx1bmcgbWVya3QsIGRpZSB3YWVocmVuZCBlaW5lciBkZXIgb2JlbiBnZW5hbm50ZW4gQWt0aW9uZW4gYW4gZWluZW4KKyAgICBnZXNlbmRldCB3dXJkZS4gV2VubiBtYW4gZGFtaXQgZmVydGlnIGlzdCwga2FubiBkYW5uIG1pdHRlbHMgYGtvYm9sZCcsCisgICAgb2huZSBBcmd1bWVudGUsIGFiZ2VydWZlbiB3ZXJkZW4sIHdhcyBlciBzaWNoIGdlbWVya3QgaGF0LiBEYXMgc29sbHRlIGFiZXIKKyAgICBpbSBOb3JtYWxmYWxsIG5pY2h0IG5vZXRpZyBzZWluLCBkYSBzaWNoIGRlciBLb2JvbGQgYXV0b21hdGlzY2ggbWVsZGV0LgorCisgICAgSmVkZXIgZ2VzcGVpY2hlcnRlbiBNZWxkdW5nIGlzdCBkaWUgVWhyemVpdCBkZXMgRW1wZmFuZ3MgYW5nZWhhZW5ndC4KKworICAgIFd1ZW5zY2h0IG1hbiBrZWluZSBzb2xjaGUgUnVoZW1hc3NuYWhtZSwga2FubiBtYW4gZGVuIEtvYm9sZCBtaXQgYGtvYm9sZAorICAgIGF1cycgd2llZGVyIGFic2NoYWx0ZW4gdW5kIGplZGUgTWl0dGVpbHVuZywgUnVmZSB1bmQgYW5kZXJlIE1lbGR1bmdlbgorICAgIHdlcmRlbiBpbW1lciBzb2ZvcnQgd2VpdGVyZ2VsZWl0ZXQuCisKKyAgICBTdGFuZGFyZG1hZXNzaWcgaXN0IGRlciBLb2JvbGQgYXVzZ2VzY2hhbHRldC4KKworICAgIERlciBLb2JvbGQga2FubiBzaWNoIG1heC4gMjU1IE1pdHRlaWx1bmdlbiBtZXJrZW4sIHNpbmQgZGllc2UKKyAgICB1ZWJlcnNjaHJpdHRlbiwgZ2VoZW4gbmV1ZXJlIE1pdHRlaWx1bmdlbiB2ZXJsb3JlbiEKKworICAgIEFiZ2VibG9ja3Qgd2VyZGVuIGZvbGdlbmRlIE1lbGR1bmdlbjoKKyAgICBtcnVmZSwgRWJlbmVuLCBNaXR0ZWlsdW5nZW4gKGVyemFlaGxlLCB0ZWlsZSBtaXQpCisKKyAgICBOaWNodCBhYmdlYmxvY2t0IHdlcmRlbiBmb2xnZW5kZSBNZWxkdW5nZW46CisgICAgc2FnZSwgamVnbGljaGUgbG9rYWxlbiBFbW90aW9uZW4gc293aWUgc29uc3RpZ2UgbG9rYWxlIChhbHNvIGltIHNlbGJlbgorICAgIFJhdW0pIGVyemV1Z3RlIE1lbGR1bmdlbiwgcnVmZSwgLi4uCisKKyAgICAqTWVya2UqOiBEZXIgS29ib2xkIGZ1bmt0aW9uaWVydCBudXIsIHdlbm4gbWFuIGVpbmVuIFRleHQgbGllc3QgdW5kIG1vcmUKKyAgICBiZW51dHp0IHdpcmQgb2RlciB3ZW5uIG1hbiBlaW5lbiBUZXh0IGVkaXRpZXJ0ICh6LkIuIGJlaW0gUG9zdHNjaHJlaWJlbiwKKyAgICBBcnRpa2Vsc2NocmVpYmVuKS4KKworIFNJRUhFIEFVQ0g6CisgICAgcnVmZSwgdGVpbGUgKG1pdCksIHdlZywgZWJlbmVuCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIDA1LjEwLjIwMTMsIFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL3BjbWQva3VyeiBiL2RvYy9wY21kL2t1cnoKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUxZDkwNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wY21kL2t1cnoKQEAgLTAsMCArMSwyMCBAQAorCitrdXJ6CistLS0tCisKKyBLT01NQU5ETzoKKyAgICBrdXJ6CisKKyBBUkdVTUVOVEU6CisgICAga2VpbmUKKworIEJFU0NIUkVJQlVORzoKKyAgICBTY2hhbHRldCBhdWYgZGVuICJLdXJ6Ii1Nb2R1cyB1bS4gV2VubiBEdSBEaWNoIGltIEt1cnptb2R1cyBiZWZpbmRlc3QsCisgICAgc2llaHN0IER1IG51ciBlaW5lIGt1cnplIEJlc2NocmVpYnVuZyBhbGxlciBSYWV1bWUuIEZ1ZXIgZWluZSBsYWVuZ2VyZQorICAgIEJlc2NocmVpYnVuZyBrYW5uc3QgRHUgZGFzIEtvbW1hbmRvIGBzY2hhdScgYmVudXR6ZW4uCisKKyBTSUVIRSBBVUNIOgorICAgIGxhbmcsIHVsdHJha3Vyeiwgc2NoYXUsIGF1c2dhZW5nZQorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBUaHUsIDI0LjA3LjE5OTcsIDA5OjAwOjAwIHZvbiBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9wY21kL2t1cnppbmZvIGIvZG9jL3BjbWQva3VyemluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYxZmU2OAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wY21kL2t1cnppbmZvCkBAIC0wLDAgKzEsMTcgQEAKKwora3VyemluZm8KKy0tLS0tLS0tCisKKyBLT01NQU5ETzoKKyAgICBrdXJ6aW5mbworICAgIGt1cnppbmZvIC1rCisKKyBCRVNDSFJFSUJVTkc6CisgICAgRGllc2VzIEtvbW1hbmRvIGdpYnQgRGVpbmUgYWt0dWVsbGVuIExlYmVucy0gdW5kIEtvbnplbnRyYXRpb25zcHVua3RlIGF1cy4KKyAgICAna3VyemluZm8gLWsnIGdpYnQgZWluZSB2ZXJrdWVyenRlIEFuZ2FiZSBvaG5lIEFTQ0lJLUdyYXBoaWsgYXVzLCBnZW5hdXNvIAorICAgIGFscyBoYWV0dGVzdCBEdSBkZXJlbiBBdXNnYWJlIG1pdCAnZ3JhZmlrIGF1cycgYWJnZXNjaGFsdGV0LgorCisgU0lFSEUgQVVDSDoKKyAgICBpbmZvIAkJCisKKyAwOS4wOC4yMDA5LCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvcGNtZC9rd2VyIGIvZG9jL3BjbWQva3dlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWY5ZTBiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BjbWQva3dlcgpAQCAtMCwwICsxLDkwIEBACisKK2t3ZXIKKy0tLS0KKworIEtPTU1BTkRPOgorICAgIGt3ZXIgW1thbGxlXSBbaW4gPHN0YWR0Pl0gW3JlZ2lvbiA8cmVnaW9uPl0gW2JlaSA8c3BpZWxlcj5dIFtzcGllbGVyXQorICAgICAgICAgW3NlaGVyXSBbbWFnaWVyXSBbZXJ6bWFnaWVyXSBbZ29ldHRlcl0gW21lbnNjaF0gW3p3ZXJnXSBbZWxmXQorICAgICAgICAgW2ZlbGluZV0gW2hvYmJpdF0gW3JlZ2lvbnNtaXRhcmJlaXRlcnxtaXRhcmJlaXRlciA8cmVnaW9uPl0KKyAgICAgICAgIFtyZWdpb25zbWFnaWVyIDxyZWdpb24+XSBbdGVzdGllc10gW3p3ZWl0aWVzXSBbbWFnaWVyendlaXRpZXNdCisgICAgICAgICBbZXJ3YXJ0ZXRlXSBbZ2lsZGUgPGdpbGRlPl0gW2dpbGRlbm1hZ2llciA8Z2lsZGU+XQorCSBbZnJvc2NoXSBbaWRsZV0gW2lkbGV6ZWl0IDxtaW4+XSBbaWNxXSBbY2ljZXJvbmVdCisgICAgICAgICBbd3d3fHVybF0gW3NzbHxzdHVubmVsXSBbdW5kfG9kZXJ8YXVzc2VyXSAuLi5dCisKKyBBUkdVTUVOVEU6CisKKyAgICAgPHN0YWR0PgorICAgICAgICBOYW1lIGRlciBnZXd1ZW5zY2h0ZW4gU3RhZHQgKEhlcmt1bmZ0IGRlcyBMb2dpbikKKyAgICAgPHJlZ2lvbj4KKyAgICAgICAgTmFtZSBkZXIgZ2V3dWVuc2NodGVuIFJlZ2lvbiAoaW4gTW9yZ2VuZ3JhdWVuKQorICAgICA8c3BpZWxlcj4KKyAgICAgICAgTmFtZSBlaW5lcyBTcGllbGVycworICAgICA8Z2lsZGU+CisgICAgICAgIE5hbWUgZWluZXIgR2lsZGUKKworIEJFU0NIUkVJQlVORzoKKyAgICBFcyB3aXJkIGVpbmUga3VyemUgTGlzdGUgYWxsZXIgaW4gTW9yZ2VuR3JhdWVuIGFud2VzZW5kZW4gU3BpZWxlcgorICAgIGF1c2dlZ2ViZW4sIGRhYmVpIHdlcmRlbiBlcndhcnRldGUgU3BpZWxlciBtaXQgZWluZW0gdm9yZ2VzdGVsbHRlbgorICAgICIqIiBtYXJraWVydC4KKyAgICBCZWkgYWt0aXZpZXJ0ZW0gQU5TSSBzaW5kIE1hZ2llciB1bnRlcnN0cmljaGVuLCBlcndhcnRldGUgU3BpZWxlcgorICAgIGluIHJvdCB1bmQgRnJvZXNjaGUgaW4gZ3J1ZW4gYW5nZXplaWd0LgorICAgIAorCisgICAgRGllIEJ1Y2hzdGFiZW4gYW0gRW5kZSBiZWRldXRlbjoKKworICAgICBbc10gICBTcGllbGVyCisgICAgIFtTXSAgIFNlaGVyCisKKyAgICAgW3pdICAgWndlaXRzcGllbGVyCisgICAgIFtaXSAgIFp3ZWl0c3BpZWxlciBtaXQgU2VoZXJsZXZlbAorICAgICBbbl0gICB1bnNpY2h0YmFyIG1hcmtpZXJ0ZXIgWndlaXRzcGllbGVyCisgICAgIFtOXSAgIHVuc2ljaHRiYXIgbWFya2llcnRlciBad2VpdHNwaWVsZXIgbWl0IFNlaGVybGV2ZWwKKworICAgICBbdF0gICBUZXN0c3BpZWxlcgorICAgICBbVF0gICBUZXN0c3BpZWxlciBtaXQgU2VoZXJsZXZlbAorCisgICAgIFtMXSAgIE1hZ2llcmxlaHJsaW5nCisgICAgIFttXSAgIFZvbGxtYWdpZXIsIG9obmUgUmVnaW9uCisgICAgIFtNXSAgIFZvbGxtYWdpZXIsIG1pdCBSZWdpb24KKyAgICAgW0hdICAgSGlsZnNtYWdpZXIKKyAgICAgW1JdICAgUmVnaW9uc2NoZWYKKyAgICAgW1ddICAgV2Vpc2VyCisgICAgIFtFXSAgIEVyem1hZ2llcgorICAgICBbR10gICBHb3R0CisKKyAgICBEaWUgSW5mb3JtYXRpb25lbiBbbl0gdW5kIFtOXSBzb3dpZSBkaWUgTGlzdGUgZGVyIFNTTC1OdXR6ZXIgYmVrb21tZW4gCisgICAgbnVyIE1hZ2llci4gRGllIGRpcmVrdGUgQWJmcmFnZSBkZXIgTWFnaWVyendlaXRpZXMgc3RlaHQgbnVyIAorICAgIEVyem1hZ2llcm4genVyIFZlcmZ1ZWd1bmcuCisKKyAgICBEaWUgSWRsZS1aZWl0IGlzdCBhbiBlaW5lbSBCdWNoc3RhYmVuIHZvciBkZW0gTGV2ZWwgenUgZXJrZW5uZW46CisgICAKKyAgICAgW2ldICAgPiAyIE1pbnV0ZW4KKyAgICAgW0ldICAgPiAxMCBNaW51dGVuCisgICAgIFtqXSAgID4gMzAgTWludXRlbgorICAgICBbSl0gICA+IDEyMCBNaW51dGVuCisgICAKKyAgICAiSWRsZSIgYmVkZXV0ZXQsIGxhZW5nZXIga2VpbmUgVGFzdGUgenUgYmV0YWV0aWdlbi4KKworICAgICBbd10gICBEZXIgU3BpZWxlciBoYXQgZWluZSBXRUctTWVsZHVuZyBnZXNldHp0LgorCisgICAgRGlyZWt0IHZvciBkZXIgSWRsZXplaXQgaXN0IHp1IGVya2VubmVuLCBvYiBkZXIgU3BpZWxlciBkZW4KKyAgICBIYXJkY29yZW1vZHVzIHNwaWVsdDoKKyAgICAgW2NdICAgRGVyIFNwaWVsZXIgc3BpZWx0IEhhcmRjb3JlIHVuZCBpc3Qgbm9jaCBhbSBMZWJlbi4KKyAgICAgWytdICAgRGVyIFNwaWVsZXIgc3BpZWx0IEhhcmRjb3JlIHVuZCBpc3QgYmVyZWl0cyB2ZXJzdG9yYmVuLgorCisgICAgTWFuIGthbm4gZGllIEF1c2dhYmUgYXVmIGdld2lzc2UgR3J1cHBlbiBlaW5zY2hyYWVua2VuLCBkaWVzZSBHcnVwcGVuCisgICAga29lbm5lbiBtaXQgYHVuZCcsIGBvZGVyJyB1bmQgYGF1c3NlcicgdmVya251ZXBmdCB3ZXJkZW4uIERpZXMgZ2VzY2hpZWh0CisgICAgbWl0IExpbmtza2xhbW1lcnVuZyAoYWxzbyBgYSBvZGVyIGIgdW5kIGMnIHdpcmQgYWxzIGAoYSBvZGVyIGIpIHVuZCBjJworICAgIGludGVycHJldGllcnQpLgorCisgQkVJU1BJRUxFOgorCisgICAgPiBrd2VyIGFsbGUgYXVzc2VyIGdvZXR0ZXIKKyAgICA+IGt3ZXIgaW4gbXVlbnN0ZXIgb2RlciBpbiBrb2VsbiB1bmQgc2VoZXIKKworIFNJRUhFIEFVQ0g6CisgICAgd2VyLCBra3dlciwgb3J0CisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIDIwMTUtMTItMDIsIEFyYXRob3JuCisKZGlmZiAtLWdpdCBhL2RvYy9wY21kL2xhbmcgYi9kb2MvcGNtZC9sYW5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NWRlYmEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcGNtZC9sYW5nCkBAIC0wLDAgKzEsMTkgQEAKKworbGFuZworLS0tLQorCisgS09NTUFORE86CisgICAgbGFuZworCisgQVJHVU1FTlRFOgorICAgIGtlaW5lCisKKyBCRVNDSFJFSUJVTkc6CisgICAgU2NoYWx0ZXQgYXVmIGRlbiAiTGFuZyItTW9kdXMgdW0uIEltIExhbmdtb2R1cyBzaWVoc3QgRHUgZGllIGtvbXBsZXR0ZQorICAgIEJlc2NocmVpYnVuZyBkZXIgUmFldW1lLCBkaWUgRHUgYmV0cml0dHN0LgorCisgU0lFSEUgQVVDSDoKKyAgICBrdXJ6LCB1bHRyYWt1cnosIHNjaGF1LCBhdXNnYWVuZ2UKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgVGh1LCAyNC4wNy4xOTk3LCAwOTowMDowMCB2b24gV2FyZ29uCmRpZmYgLS1naXQgYS9kb2MvcGNtZC9sYXVzY2hlIGIvZG9jL3BjbWQvbGF1c2NoZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2RlNzVlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BjbWQvbGF1c2NoZQpAQCAtMCwwICsxLDMyIEBACisKK2xhdXNjaChlKSAoYW4pCistLS0tLS0tLS0tLS0tLQorCitLT01NQU5ETworCWxhdXNjaChlKQorCWxhdXNjaChlKSA8d2FzPiBbYW4gPG9iamVrdD4gfCBhbSA8b2JqZWt0Pl0gW2luIG1pciB8IGltIHJhdW1dCisKK0FSR1VNRU5URQorCTxvYmpla3Q+CisJICBFaW4gR2VnZW5zdGFuZCBiencuIExlYmV3ZXNlbiwgYW4gZGVtIGxhdXNjaGVuIHdpbGwuCisKK0JFU0NIUkVJQlVORworCWBsYXVzY2gnIGJ6dy4gYGxhdXNjaGUnIGlzdCBkYXMgYWxsZ2VtZWluZSBLb21tYW5kbywgdW0gR2VyYWV1c2NoZQorCWFuIEdlZ2Vuc3RhZW5kZW4sIExlYmV3ZXNlbiBvZGVyIGluIFJhZXVtZW4gd2Focnp1bmVobWVuLiBIaWVyYmVpCisJbGFlc3N0IGBsYXVzY2goZSknIG9obmUgQXJndW1lbnRlIGRlbiBTcGllbGVyIGRpZSBIYXVwdGdlcmFldXNjaGUgaW4KKwlkZW0gUmF1bSB3YWhybmVobWVuLCBpbiBkZW0gZXIgc2ljaCBkZXJ6ZWl0IGJlZmluZGV0LiBBbiBhbGxlbgorCWFuZGVyZW4gR2VnZW5zdGFlbmRlbiBiencuIExlYmV3ZXNlbiBpbSBzZWxiZW4gUmF1bSBvZGVyIGltIGVpZ2VuZW4KKwlJbnZlbnRhciBrYW5uIG1hbiBtaXQgYGxhdXNjaChlKSAoYW4pJyBlYmVuZmFsbHMgR2VyYWV1c2NoZQorCXdhaHJuZWhtZW4uIE5pY2h0IGltbWVyIGthbm4gbWFuIGplZG9jaCBldHdhcyBCZXNvbmRlcmVzIGhvZXJlbi4KKworCURhIGJlaSBPYmpla3RlbiBtaXQgZ2xlaWNoZW4gR2VyYWV1c2NoYXJ0ZW4genVlcnN0IGFuIGltIFJhdW0KKwlsaWVnZW5kZW4gT2JqZWt0IGdlbGF1c2NodCB3aXJkLCBrYW5uIG1hbiBhbiBTYWNoZW4sIGRpZSBtYW4gYmVpCisJc2ljaCB0cmFlZ3QsIGF1ZiBhbGxlIEZhZWxsZSBtaXQgZGVtIFp1c2F0eiBgaW4gbWlyJyBsYXVzY2hlbi4KKworU0lFSEUgQVVDSDoKKyAgYmV6dWdzcHVua3QKKyAgc2NoYXUsIHJpZWNoZSwgdGFzdGUsIGxpZXMKKworTEVUWlRFIEFFTkRFUlVOR0VOOgorICAxOC4wMS4yMDEzLCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9wY21kL2xpZXMgYi9kb2MvcGNtZC9saWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNDViZWIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcGNtZC9saWVzCkBAIC0wLDAgKzEsNTEgQEAKKworbGllcworLS0tLQorCitLT01NQU5ETworCWxpZXMgPHdhcz4gW2FuIDxvYmpla3Q+IHwgYW0gPG9iamVrdD5dIFtpbiBtaXIgfCBpbSByYXVtXQorCitBUkdVTUVOVEUKKyAgPHdhcz4KKyAgICBOYW1lIGVpbmVzIEdlZ2Vuc3RhbmRlcywgTGViZXdlc2VucyBvZGVyIERldGFpbCwgd2VsY2hlcyBtYW4gbGVzZW4gd2lsbC4KKwk8b2JqZWt0PgorCSAgRWluIEdlZ2Vuc3RhbmQgb2RlciBlaW4gTGViZXdlc2VuLCBhbiBkZW0gbWFuIGxlc2VuIHdpbGwuCisKK0JFU0NIUkVJQlVORworICAnbGllcycgaXN0IGRhcyBhbGxnZW1laW5lIEtvbW1hbmRvLCB1bSBsZXNiYXJlIERldGFpbHMgYW4gR2VnZW5zdGFlbmRlbiwKKyAgTGViZXdlc2VuIG9kZXIgaW4gUmFldW1lbiAoei5CLiBlaW4gU2NoaWxkIGFuIGVpbmVtIFJ1Y2tzYWNrKSBvZGVyIGFuIHNpY2gKKyAgbGVzYmFyZSBHZWdlbnN0YWVuZGUgKHouQi4gZWluZSBTY2hyaWZ0cm9sbGUpIHdhaHJ6dW5laG1lbi4KKworICBEYSBiZWkgT2JqZWt0ZW4gbWl0IGdsZWljaGVuIGxlc2JhcmVuIERldGFpbHMgenVlcnN0IGRpZSBpbSBSYXVtIGxpZWdlbmRlbgorICBPYmpla3RlIGdlbGVzZW4gd2VyZGVuLCBrYW5uIG1hbiBhbiBTYWNoZW4sIGRpZSBtYW4gYmVpIHNpY2ggdHJhZWd0LCBhdWYKKyAgYWxsZSBGYWVsbGUgbWl0IGRlbSBadXNhdHogYGluIG1pcicgcmllY2hlbi4KKworICBEYXMgS29tbWFuZG8gYmVudXR6dCBnZ2YuIGRhcyBhdXMgZGVtIEtvbW1hbmRvICdzY2hhdScgYnp3LiAndW50ZXJzdWNoZScKKyAgYmVrYW5udGUgQmV6dWdzb2JqZWt0LgorCitCRUlTUElFTEU6CisgID4gbGllcyB0YWZlbAorCisgID4gbGllcyB0YWZlbCBpbiByYXVtCisKKyAgPiBsaWVzIHdpZG11bmcgYW4gYnVjaHN0dWV0emVuIGluIG1pcgorICAKKyAgPiBsaWVzIHNjaGlsZCBhbiBiaWVuZSBpbiByYXVtCisKKyAgPiBsaWVzIGJ1Y2ggaW4gcGFrZXQKKworICA+IHVudCBwYWtldAorICA+IGxpZXMgaW5kZXggYW4gYnVjaAorICAoTGllZ3QgZWluIEJ1Y2ggbWl0IGxlc2JhcmVtIERldGFpbCAiaW5kZXgiIGltIFBha2V0LCBsaWVzdCBtYW4gZGllc2VuIG1pdAorICAgZGVtIHp3ZWl0ZW4gS29tbWFuZG8uKQorCisgID4gbGllcyBpbmRleCBhbiBidWNoIGluIHBha2V0IGluIHJhdW0KKyAgKExpZXN0IGRlbiBJbmRleCBlaW5lcyBCdWNoZXMgaW4gZWluZW0gUGFrZXQgaW0gUmF1bS4pCisKK1NJRUhFIEFVQ0g6CisgIGJlenVnc3B1bmt0CisgIHNjaGF1LCByaWVjaGUsIGxhdXNjaGUsIHRhc3RlCisKK0xFVFpURSBBRU5ERVJVTkdFTjoKKyAgMTguMDEuMjAxMywgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2MvcGNtZC9tZXNzZW5nZXIgYi9kb2MvcGNtZC9tZXNzZW5nZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkxMzhlZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wY21kL21lc3NlbmdlcgpAQCAtMCwwICsxLDM3IEBACisKK21lc3NlbmdlcgorLS0tLS0tLS0tCisKKyBLT01NQU5ETzoKKyAgICBtZXNzZW5nZXIgWzxpZD5dCisKKyBBUkdVTUVOVEU6CisKKyAgICAgPGlkPiAob3B0aW9uYWwpCisgICAgICAgIERpZSBuZXVlIE1lc3Nlbmdlci1JRAorCisgQkVTQ0hSRUlCVU5HOgorICAgIFdlbm4gRHUgZWluZW4gTWVzc2VuZ2VyLURpZW5zdCBiZW51dHp0LCBzbyBrYW5uc3QgRHUgZG9ydAorICAgIERlaW5lIElEIGVpbnRyYWdlbi4gRXMgd2lyZCBlaW5mYWNoIGRlciBUZXh0IGdlc3BlaWNoZXJ0LCBkZW4KKyAgICBEdSB1ZWJlcmdpYnN0IHVuZCBkYW5uIGJlaW0gZmluZ2VyLUJlZmVobCBhbmdlemVpZ3QuIER1IHNvbGx0ZXN0CisgICAgYWxzbyBtaXQgaGluenVzY2hyZWliZW4sIHVtIHdlbGNoZW4gRGllbnN0IGVzIHNpY2ggaGFuZGVsdC4gCisKKyAgICBXaXJkIGtlaW4gUGFyYW1ldGVyIHVlYmVyZ2ViZW4sIHNvIHdpcmQgZGVyIGFrdHVlbGxlIEVpbnRyYWcKKyAgICBhbmdlemVpZ3QuIEdpYnN0IER1ICJrZWluZSIgb2RlciAibG9lc2NoZW4iIGFuLCB3aXJkIGRlcgorICAgIEVpbnRyYWcgZ2Vsb2VzY2h0LgorCisgICAgSGlud2VpcyB6dW0gWnVzYW1tZW5zcGllbCBtaXQgZGVtIEJlZmVobCBJQ1EuIEhhc3QgRHUgenVnbGVpY2gKKyAgICBhdWNoIGVpbmUgSUNRLU51bW1lciBnZXNldHp0LCBzbyB3aXJkIGRpZXNlIGF1dG9tYXRpc2NoIGltCisgICAgRmluZ2VyLUJlZmVobCBtaXQgYW5nZWdlYmVuLiAKKworIEJFSVNQSUVMRToKKworICAgIG1lc3NlbmdlciBJQ1E6IDEyMzQgICAKKyAgICBtZXNzZW5nZXIgTVNOOiBmb29AYmFyLmNvbQorCisgU0lFSEUgQVVDSDoKKyAgICBQZXJzb2VubGljaGUgRGV0YWlsczogZW1haWwsIHVybCwgaWNxLCBvcnQKKyAgICBTb25zdGlnZXM6ICAgICAgICAgICAgZmluZ2VyCisKKyBMRVRaVEUgQUVOREVSVU5HOgorICAgIDIwMDYtMDEtMDUgdm9uIFpvb2suCmRpZmYgLS1naXQgYS9kb2MvcGNtZC9tcnVmZSBiL2RvYy9wY21kL21ydWZlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMTY0Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcGNtZC9tcnVmZQpAQCAtMCwwICsxLDM3IEBACisKK21ydWZlCistLS0tLQorCisgS09NTUFORE86CisgICAgbXJ1ZmUgPHRleHQ+CisKKyBBUkdVTUVOVEU6CisKKyAgICAgPHRleHQ+CisgICAgICAgIERlciBUZXh0LCBkZXIgYW4gZGllIE1hZ2llciBnZXJ1ZmVuIHdpcmQKKworIEJFU0NIUkVJQlVORzoKKyAgICBEaWUgTWVsZHVuZyA8dGV4dD4gd2lyZCBhbiBhbGxlIGVpbmdlbG9nZ3RlbiBNYWdpZXIgYXVzZ2VnZWJlbi4KKworICAgIERpZXNlciBCZWZlaGwgZGFyZiBudXIgaW4gTk9URkFFTExFTiB2ZXJ3ZW5kZXQgd2VyZGVuISEhCisKKyAgICBOb3RmYWVsbGUgc2luZCB6LkIuIGZlaGxlcmhhZnRlIFJhZXVtZSwgYXVzIGRlbmVuIG1hbiBuaWNodCBtZWhyCisgICAgaGVyYXVza29tbXQsIG8uYWUuICgqYWJlcio6IG5pY2h0IGplZGVyIFJhdW0gb2huZSBzaWNodGJhcmUgQXVzZ2FlbmdlIGlzdAorICAgIGZlaGxlcmhhZnQhKSBNYW4gc29sbHRlIHNpY2ggZXJzdCB2ZXJnZXdpc3Nlcm4sIG9iIG1hbiB3aXJrbGljaAorICAgIGZlc3RzdGVja3QuCisKKyAgICBLZWluIE5vdGZhbGwgaXN0IHouQi4gZWluIG1ydWZlLCB3ZW5uIG1hbiBlaW5lbiBCcmllZiBhbiBlaW5lbiBNYWdpZXIKKyAgICB6dXN0ZWxsZW4gd2lsbC4KKyAgICBNaXNzYnJhZXVjaGxpY2hlIEJlbnV0enVuZyBkaWVzZXMgQmVmZWhscyBzb3JndCBkYWZ1ZXIsIGRhc3Mgc2ljaCBkaWUKKyAgICBNYWdpZXIgYXVjaCBpbiB3aXJrbGljaGVuIE5vdGxhZ2VuIG5pY2h0IG1laHIgdW0gZGFzIGdlYG1ydWZlJyBrdWVtbWVybiwKKyAgICBzb25kZXJuIHNpY2gga29lc3RsaWNoIHVlYmVyIGRpZSBTcGllbGVyIGFtdWVzaWVyZW4uIEVzIGxpZWd0IGFsc28gYmVpCisgICAgZXVjaCwgd2llIGVybnN0IGlociBnZW5vbW1lbiB3ZXJkZW4gbW9lY2h0ZXQuCisKKyAgICBNYWdpZXIgc29sbHRlbiBsaWViZXIgZGllIE1hZ2llcmViZW5lIHZlcndlbmRlbiAoLU1hZ2llcispLgorCisgU0lFSEUgQVVDSDoKKyAgICB0ZWlsZSAobWl0KSwgZWJlbmVuCisKKyBMRVRaVEUgQWVOREVSVU5HOgorIDE2LjA5LjIwMDgsIFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL3BjbWQvbXVkcyBiL2RvYy9wY21kL211ZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlhYTY3ZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wY21kL211ZHMKQEAgLTAsMCArMSwyMCBAQAorCittdWRzCistLS0tCisKKyBLT01NQU5ETzoKKyAgICBtdWRzCisKKyBBUkdVTUVOVEU6CisgICAga2VpbmUKKworIEJFU0NIUkVJQlVORzoKKyAgICBHaWJ0IGVpbmUgTGlzdGUgZGVyIE1VRHMgYXVzLCBtaXQgZGVuZW4gRHUgdm9uIGhpZXIgYXVzIEtvbnRha3QgYXVmbmVobWVuCisgICAga2FubnN0LiBEYXp1IGdlaG9lcmVuIHouQi4gZGllIEFiZnJhZ2UgZGVyIEFud2VzZW5oZWl0c2xpc3RlLCBkYXMKKyAgICBWZXJzZW5kZW4gdm9uIE1pdHRlaWx1bmdlbiBvZGVyIGRpZSBJbmZvcm1hdGlvbiB1ZWJlciBTcGllbGVyLgorCisgU0lFSEUgQVVDSDoKKyAgICB3ZXIsIHRlaWxlIChtaXQpLCBmaW5nZXIKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgVGh1LCAyNC4wNy4xOTk3LCAwOTowMDowMCB2b24gV2FyZ29uCmRpZmYgLS1naXQgYS9kb2MvcGNtZC9uaW1tIGIvZG9jL3BjbWQvbmltbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzlmMGE1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BjbWQvbmltbQpAQCAtMCwwICsxLDM0IEBACisKK25pbW0gW2F1c10KKy0tLS0tLS0tLS0KKworIEtPTU1BTkRPOgorICAgIG5pbW0gPG9iamVrdD4gW2F1cyA8YmVoYWVsdGVyPl0KKyAgICBuaW1tIGFsbGVzIFthdXMgPGJlaGFlbHRlcj5dCisKKyBBUkdVTUVOVEU6CisKKyAgICAgPG9iamVrdD4KKyAgICAgICAgRGVyIHp1IG5laG1lbmRlIEdlZ2Vuc3RhbmQKKyAgICAgPGJlaGFlbHRlcj4gKG9wdGlvbmFsKQorICAgICAgICBEZXIgQmVoYWVsdGVyLCBpbiBkZW0gc2ljaCBkYXMgT2JqZWt0IGRlciBCZWdpZXJkZSBiZWZpbmRldAorCisgQkVTQ0hSRUlCVU5HOgorICAgIE1hbiBuaW1tdCBkZW4gR2VnZW5zdGFuZCA8b2JqZWt0PiB2b20gQm9kZW4gYXVmIG9kZXIgYXVzIGVpbmVtIDxiZWhhZWx0ZXI+CisgICAgaGVyYXVzLgorCisgICAgV2FlaGx0IG1hbiBhbHMgPG9iamVrdD4gYGFsbGVzJywgc28gbmltbXQgbWFuIGFsbGVzLCB3YXMgc2ljaCBuZWhtZW4KKyAgICBsYWVzc3QgKHNvd2VpdCBtYW4gZXMgbm9jaCB0cmFnZW4ga2FubikuCisKKyAgICBNaXQgJ25pbW0gYmVoYWx0ZW5lcycga2FubiBtYW4gYWxsZSBHZWdlbnN0YWVuZGUsIGRpZSBtYW4gZnJ1ZWhlcgorICAgIGVpbm1hbCAiYmVoYWx0ZW4iIChzLiAnYmVoYWx0ZScpIGhhdCwgYXVzIGRlbSBha3R1ZWxsZW4gUmF1bSBhdWZuZWhtZW4uCisgICAgU3RlaHQgbWFuIGluIGVpbmVtIFJhdW0sIHdvIG1hbiBnZXN0b3JiZW4gaXN0IHVuZCBsaWVndCBkb3J0IGRlciBlaWdlbmUKKyAgICBLcmFtIGluIEZvcm0gZWluZXMgIkhhdWZlbiBLcmVtcGVscyIsIGthbm4gbWFuIG1pdHRlbHMgJ25pbW0gZWlnZW5lcycKKyAgICBhbGxlcyBhdXMgZGllc2VtICh1bmQgbnVyIGRpZXNlbSkgSGF1ZmVuIGF1Zm5laG1lbi4gRGllc2VzIHNjaGxpZXNzdAorICAgIHVlYnJpZ2VucyAnbmltbSBiZWhhbHRlbmVzJyBlaW4uCisKKyBTSUVIRSBBVUNIOgorICAgIHN0ZWNrZSAoaW4pLCBob2xlIChhdXMpLCB3aXJmICh3ZWcpLCBiZWhhbHRlCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIDI0LjA1LjIwMDcsIFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9wY21kL29ydCBiL2RvYy9wY21kL29ydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzIwMDNiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BjbWQvb3J0CkBAIC0wLDAgKzEsMjcgQEAKKworb3J0CistLS0KKworIEtPTU1BTkRPOgorICAgIG9ydCBbPG5hbWU+fGxvZXNjaGVuXQorCisgQVJHVU1FTlRFOgorCisgICAgIDxuYW1lPiAob3B0aW9uYWwpCisgICAgICAgIERlciBuZXVlIE9ydHNuYW1lCisgICAgIGxvZXNjaGVuIChvcHRpb25hbCkKKyAgICAgICAgTG9lc2NodCBkZW4gZ2VzZXR6dGVuIE9ydHNuYW1lbiB3aWVkZXIKKworIEJFU0NIUkVJQlVORzoKKyAgICAgV2VubiBEdSBhdXMgZWluZW0gT3J0IGtvbW1zdCwgZGVyIG5pY2h0IGF1dG9tYXRpc2NoIGVya2FubnQKKyAgICAgd2VyZGVuIGthbm4sIGthbm5zdCBEdSBtaXQgZGllc2VtIEJlZmVobCBlaW50cmFnZW4sIHZvbgorICAgICB3b2hlciBEdSBXSVJLTElDSCBrb21tc3QuCisgICAgIERpZSBBbmdhYmUgd2lyZCBsZWRpZ2xpY2ggYWxzIHp1c2FldHpsaWNoZSBJbmZvcm1hdGlvbiBiZWltCisgICAgICJmaW5nZXIiLUJlZmVobCBhbmdlemVpZ3Qgc293aWUgd2FobHdlaXNlIGJlaSAid2VyIi4KKyAgICAgRmFsbHMgRHUgei5CLiBhdXMgRnJhbmtmdXJ0IGVpbmdlbG9nZ3QgYmlzdCB1bmQgYWxzIE9ydCBNdWVuY2hlbgorICAgICBhbmdpYnN0LCB3aXJzdCBEdSBzb3dvaGwgYmVpICJrd2VyIGluIGZyYW5rZnVydCIgYWxzIGF1Y2ggYmVpCisgICAgICJrd2VyIGluIG11ZW5jaGVuIiBnZWZ1bmRlbi4KKyAgICAgCisgU0lFSEUgQVVDSDoKKyAgICBQZXJzb2VubGljaGUgRGV0YWlsczogZW1haWwsIHVybCwgaWNxLCBtZXNzZW5nZXIKKyAgICBTb25zdGlnZXM6ICAgICAgICAgICAgZmluZ2VyLCB3ZXIsIGt3ZXIKZGlmZiAtLWdpdCBhL2RvYy9wY21kL3Bhc3N3b3J0IGIvZG9jL3BjbWQvcGFzc3dvcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkxYjViMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wY21kL3Bhc3N3b3J0CkBAIC0wLDAgKzEsMjAgQEAKKworcGFzc3dvcnQKKy0tLS0tLS0tCisKKyBLT01NQU5ETzoKKyAgICBwYXNzd29ydAorICAgIHBhc3N3b3JkCisgICAgcGFzc3dkCisKKyBBUkdVTUVOVEU6CisgICAga2VpbmUKKworIEJFU0NIUkVJQlVORzoKKyAgICBBZW5kZXJ0IGRhcyBQYXNzd29ydC4gWnVyIFNpY2hlcmhlaXQgbXVzcyB6dWVyc3QgZGFzIGFsdGUgUGFzc3dvcnQKKyAgICBlaW5nZWdlYmVuIHdlcmRlbi4gRGFyYXVmaGluIHdpcmQgZGFzIG5ldWUgUGFzc3dvcnQgendlaW1hbCBlcmZyYWd0LiBEYXMKKyAgICBQYXNzd29ydCB3aXJkIG51ciBkYW5uIGdlYWVuZGVydCwgd2VubiBkaWUgYmVpZGVuIEVpbmdhYmVuIGRlcyBuZXVlcworICAgIFBhc3N3b3J0ZXMgdWViZXJlaW5zdGltbWVuLgorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBUaHUsIDI0LjA3LjE5OTcsIDA5OjAwOjAwIHZvbiBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9wY21kL3JlaXNlIGIvZG9jL3BjbWQvcmVpc2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU0NjFhMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wY21kL3JlaXNlCkBAIC0wLDAgKzEsMTAzIEBACitLT01NQU5ETzoKKyAgICAgICAgcmVpc2UKKyAgICAgICAgcmVpc2Ugcm91dGUKKyAgICAgICAgcmVpc2UgW21pdCB0cmFuc3BvcnRtaXR0ZWxdIG5hY2h8enV8enVtfHp1cnxpbnN8YW5zICh6aWVsb3J0KQorICAgICAgICByZWlzZSBhdXN8bmljaHQKKworQVJHVU1FTlRFOgorICAgICAgICA8dHJhbnNwb3J0bWl0dGVsPiAgICAgICBFaW4gVHJhbnNwb3J0bWl0dGVsIERlaW5lciBXYWhsCisgICAgICAgIDx6aWVsb3J0PiAgICAgICAgICAgICAgIERlaW4gUmVpc2V6aWVsCisKK0ZVTktUSU9OOgorICAgICAgIFdlbm4gRHUgRGVpbiBSZWlzZXppZWwgKG9kZXIgZGFzIFZlcmtlaHJzbWl0dGVsKSBiZXJlaXRzCisgICAgICAga2VubnN0LCBrYW5uc3QgRHUgbWl0IGRpZXNlbSBCZWZlaGwgRGVpbmUgUmVpc2UgZWluZmFjaGVyCisgICAgICAgZ2VzdGFsdGVuLgorICAgICAgIAorICAgICAgIEJlbnV0enQgRHUgZGVuIHJlaXNlLUJlZmVobCwgc28gd2lyc3QgRHUgYXV0b21hdGlzY2ggZWluCisgICAgICAgVHJhbnNwb3J0bWl0dGVsIGJldHJldGVuIChmYWxscyBkaWVzIG1vZWdsaWNoIGlzdCkgdW5kIGVzCisgICAgICAgYW0gWmllbG9ydCAoZmFsbHMgYW5nZWdlYmVuKSBhdWNoIHdpZWRlciB2ZXJsYXNzZW4uCisKKyAgICAgICBGb2xnZW5kZSBBcmd1bWVudGUgLyBGdW5rdGlvbmVuIHdlcmRlbiB1bnRlcnN0dWV0enQ6CisKK3JlaXNlIAorICAgICAgIERlaW5lIGFrdHVlbGxlIFJlaXNlcm91dGUgd2lyZCBhdXNnZWdlYmVuLiBEdSBrYW5uc3Qgc2llIG1pdAorICAgICAgIG8uZy4gQXJndW1lbnRlbiBpbW1lciB3aWVkZXIgYWVuZGVybi4KKworcmVpc2Ugcm91dGU6CisgICAgICAgRGFtaXQga2FubnN0IER1IGZlc3RzdGVsbGVuLCB3ZWxjaGUgVmVya2VocnNtaXR0ZWwgdmVya2VocmVuIAorICAgICAgIHVuZCB3ZWxjaGUgUm91dGVuIHNpZSBhbmJpZXRlbi4KKworcmVpc2UgbWl0IDx4eHg+IG5hY2h8enV8enVtfHp1cnxpbnN8YW5zIDx6eno+OgorICAgICAgIERpZSB3b2hsIGdlbmF1ZXN0ZSBNb2VnbGljaGtlaXQsIGVpbmUgUmVpc2Vyb3V0ZSBmZXN0enVsZWdlbi4KKworICAgICAgIHh4eCBzdGVodCBoaWVyIGZ1ZXIgZWluZSBlaW5kZXV0aWdlIEtlbm56ZWljaG51bmcgZGVzIFRyYW5zcG9ydC0KKyAgICAgICBtaXR0ZWxzICh6LkIuICdwaXJhdGVuc2NoaWZmJyBzdGF0dCAnc2NoaWZmJykuCisKKyAgICAgICB6enogYmVuZW5udCBkZW4gZ2VuYXVlbiBaaWVsb3J0ICh6LkIuICdzb25uZW5pbnNlbCcgc3RhdHQgJ2luc2VsJykuCisKKyAgICAgICBQYXNzZW4gbWVocmVyZSBUcmFuc3BvcnRlciAob2RlciBaaWVsb3J0ZSkgYXVmIGRpZSB2b24gRGlyIAorICAgICAgIGFuZ2ViZW5lbiBOYW1lbiwgc28gd2lyZCBkZXIgbmFlY2hzdG1vZWdsaWNoZSBUcmFuc3BvcnRlciB1bmQKKyAgICAgICBkYXMgbmFlY2hzdGdlbGVnZW5lIFppZWwgYXVzZ2V3YWVobHQuCisKKyAgICAgICBEaWUgQmV6ZWljaG51bmcgZnVlciA8enp6PiByZWFnaWVydCB0ZWlsd2Vpc2UgbmljaHQgYXVmIHVudGVyLQorICAgICAgIHNjaGllZGxpY2hlIFNjaHJlaWJ3ZWlzZW4uIEFtIGJlc3RlbiwgRHUgbmltbXN0IGltbWVyIGRpZSwgZGllIAorICAgICAgIGF1Y2ggYmVpICdyZWlzZSByb3V0ZScgYW5nZWdlYmVuIHdpcmQuCisKK3JlaXNlIG1pdCA8eHh4PjoKKyAgICAgICBIaWVyIGxlZ3N0IER1IG51ciBmZXN0LCBXT01JVCBEdSBmYWhyZW4gd2lsbHN0LiBEdSBmYWVocnN0IHNvbGFuZ2UKKyAgICAgICBtaXQgeHh4LCBiaXMgRHUgZGVuIFRyYW5zcG9ydGVyIGVpZ2VuaGFlbmRpZyB2ZXJsYWVzc3QsIG9kZXIgZWluZW4gCisgICAgICAgWmllbG9ydCBtaXR0ZWxzICdyZWlzZSBuYWNoIHp6eicgYW5naWJzdC4KKworcmVpc2UgbmFjaCA8enp6PjoKKyAgICAgICBIaWVyIGxlZ3N0IER1IG51ciBmZXN0LCBXT0hJTiBEdSBmYWhyZW4gd2lsbHN0LiBEYXMgVHJhbnNwb3J0bWl0dGVsCisgICAgICAgd2lyZCBhdXRvbWF0aXNjaCBlcm1pdHRlbHQsIHdvYmVpIGFud2VzZW5kZSBUcmFuc3BvcnRlciBuYXR1ZXJsaWNoCisgICAgICAgYmV2b3J6dWd0IHdlcmRlbi4KKworICAgICAgIERhIDx6eno+IG5pY2h0IGltbWVyIGF1ZiB1bnRlcnNjaGllZGxpY2hlIFNjaHJlaWJ3ZWlzZW4gcmVhZ2llcnQsIAorICAgICAgIG5pbW1zdCBEdSBhbSBiZXN0ZW4gZGllIEJlemVpY2hudW5nLCBkaWUgYXVjaCBiZWkgJ3JlaXNlIHJvdXRlJworICAgICAgIGFuZ2VnZWJlbiB3aXJkLgorCityZWlzZSBhdXN8bmljaHQ6CisgICAgICAgTWl0IGRpZXNlbSBCZWZlaGwgbG9lc2Noc3QgRHUgRGVpbmUgUmVpc2Vyb3V0ZS4gRHUgbXVzc3QgZGFzCisgICAgICAgZ2V3dWVuc2NodGUgVHJhbnNwb3J0bWl0dGVsIGRhbm4gd2llZGVyIHBlciBIYW5kIGJldHJldGVuIHVuZCAKKyAgICAgICB2ZXJsYXNzZW4uCisKK0JFTUVSS1VOR0VOOgorICAgICAgIEVpbmUgZmVzdGdlbGVndGUgUmVpc2Vyb3V0ZSBpc3QgbnVyIGRvcnQgd2lya3NhbSwgd28gRHUgc2llIAorICAgICAgIGZlc3RnZWxlZ3QgaGFzdC4gTmFjaCBlcmZvbGdyZWljaGVyIFJlaXNlIHdpcmQgc2llIGF1dG9tYXRpc2NoIAorICAgICAgIGdlbG9lc2NodCwgYW5zb25zdGVuIGJsZWlidCBzaWUgYmlzIHp1bSBleHBsaXppdGVuIExvZXNjaGVuIAorICAgICAgIGJlc3RlaGVuLgorCisgICAgICAgTmljaHQgamVkZXMgVHJhbnNwb3J0bWl0dGVsIC8gWmllbCBrYW5uIG1pdHRlbHMgJ3JlaXNlJyBhdXNnZS0KKyAgICAgICB3YWVobHQgd2VyZGVuLiBFcyBiZXN0ZWh0IGtlaW5lcmxlaSBBbnNwcnVjaCBkYXJhdWYsIGRhcyAncmVpc2UnCisgICAgICAgdWViZXJhbGwgenUgZnVua3Rpb25pZXJlbiBoYXQuCisKK0JFSVNQSUVMRToKKyAgICAgICByZWlzZSBpbnMgdmVybG9yZW5lIGxhbmQKKyAgICAgICAKKyAgICAgICByZWlzZSBhbnMgZW5kZSBkZXIgd2VsdAorICAgICAgIHJlaXNlIHp1bSBlbmRlIGRlciB3ZWx0CisgICAgICAgCisgICAgICAgcmVpc2UgbmFjaCBwb3J0IHZhaW4KKyAgCisgICAgICAgRWluaWdlIFppZWxvcnRlIHNpbmQgYXVjaCBwZXIgS3VlcnplbCB6dSBlcnJlaWNoZW46CisgICAgICAgLSBWZXJsb3JlbmVzIExhbmQ6IHZsYW5kCisgICAgICAgLSBXZXJ3b2xmaW5zZWw6IHd3aQorICAgICAgIC0gUG9ydCBWYWluOiBwdgorICAgICAgIC0gQWtoYXIgTnRoJ3RhcjogdGkKKyAgICAgICAtIEluc2VsIGFtIEVuZGUgZGVyIFdlbHQ6IGVkdywgaWFlZHcsIHdlbHRlbmRlCisgICAgICAgLSBGZXVlcmluc2VsOiBmaQorICAgICAgIC0gTWFnaWVpbnNlbDogbWluc2VsCisgICAgICAgLSBJbnNlbCBkZXIgVG90ZW46IGlkdCwgdG90ZW5pbnNlbAorCisgICAgICAgR2VuZXJlbGwgc29sbHRlbiBkaWUgTmFtZW4gYWxzIFJlaXNlemllbGUgdmVyd2VuZGV0IHdlcmRlbiwgZGllCisgICAgICAgYXVjaCBiZWkgJ3JlaXNlIHJvdXRlJyBhbmdlemVpZ3Qgd2VyZGVuLiBHbGVpY2hlcyBnaWx0IG5hdHVlcmxpY2gKKyAgICAgICBhdWNoIGZ1ZXIgZGllIE5hbWVuIGRlciBUcmFuc3BvcnRlci4gU28gaXN0IGVpbmUgemllbGdlbmF1ZSB1bmQgCisgICAgICAgcGVyZmVrdGUgUmVpc2Ugc2Nob24gdm9ycHJvZ3JhbW1pZXJ0LgorCisgICAgICAgTWl0IGVpbiBiaXNzY2hlbiBHZWR1bGQgdW5kIFRlc3RlbiB3aXJzdCBEdSBzaWNoZXIgc2NobmVsbCByYXVzLQorICAgICAgIGJla29tbWVuLCB3aWUgRHUgd2VsY2hlbSBCZWZlaGwgZWluc2V0emVuIG11c3N0IHVtIGFuIERlaW4gWmllbCAKKyAgICAgICB6dSBnZWxhbmdlbi4KKyAgICAgCitMRVRaVEUgQUVOREVSVU5HOgorICAgICAgIDIwMTUtSmFuLTE4LCBBcmF0aG9ybiAKZGlmZiAtLWdpdCBhL2RvYy9wY21kL3JlcG9ydCBiL2RvYy9wY21kL3JlcG9ydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDBkZGMwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BjbWQvcmVwb3J0CkBAIC0wLDAgKzEsNzcgQEAKK0tPTU1BTkRPOgorICAgICAgICByZXBvcnQgW2VpbnxhdXN8dm9yc2ljaHRdCisKK0FSR1VNRU5URToKKyAgICAgICAgKG5pY2h0cykgICAgICA6IGFrdHVlbGxlIEVpbnN0ZWxsdW5nIGFuemVpZ2VuCisgICAgICAgIGF1cyAgICAgICAgICAgOiBhbGxlIGVpbmdlc2NoYWx0ZXRlbiBSZXBvcnQtTW9kaSBhdXNzY2hhbHRlbgorICAgICAgICBlaW4gICAgICAgICAgIDogUmVwb3J0IHZvbiBMUC9LUC9HaWZ0IGVpbnNjaGFsdGVuCisgICAgICAgIHZvcnNpY2h0ICAgICAgOiBWb3JzaWNodC1SZXBvcnQgenVzYWV0emxpY2ggZWluc2NoYWx0ZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIChudXIgU2VoZXI6IEZsdWNodHJpY2h0dW5nIHdpcmQgYXVjaCBnZW1lbGRldCkKKyAgICAgICAgc2VuZGVuICAgICAgICA6IFJlcG9ydCBqZXR6dCBzb2ZvcnQgbWl0IGFrdHVlbGxlbiBFaW5zdGVsbHVuZ2VuCisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZW4KKworQkVTQ0hSRUlCVU5HOgorICAgICAgICBXZW5uIGRlciBSZXBvcnQgZWluZ2VzY2hhbHRldCB3aXJkLCB3aXJkIGJlaSBBZW5kZXJ1bmdlbiBhbiBkZW4gTFAKKyAgICAgICAgZGVzIFNwaWVsZXJzIGVpbmUgTWVsZHVuZyBhbiBkaWVzZW4gYXVzZ2VnZWJlbiwgZGllIGRlbiBuZXVlbiBMUC1XZXJ0CisgICAgICAgIGJlaW5oYWx0ZXQuIEZhbGxzIGZyZWlnZXNjaGFsdGV0IChzLnUuKSwgZ2lsdCBkYXMgZ2xlaWNoZSBmdWVyIAorICAgICAgICBBZW5kZXJ1bmdlbiBhbiBkZW4gS1AgdW5kIGFtIEdpZnRzdGF0dXMuIEplZGUgQWVuZGVydW5nIGFuIGVpbmVtIAorICAgICAgICBkaWVzZXIgV2VydGUgbG9lc3QgZGllIEF1c2dhYmUgYWxsZXIgZHJlaSBXZXJ0ZSBnZW1laW5zYW0gYXVzLgorICAgICAgICBBdXNzY2hhbHRlbiBsYWVzc3Qgc2ljaCBkZXIgUmVwb3J0IG51ciBrb21wbGV0dCBtaXQgInJlcG9ydCBhdXMiLgorCisgICAgICAgIFdlbm4gZGVyIFZvcnNpY2h0LVJlcG9ydCBlaW5nZXNjaGFsdGV0IGlzdCwgd2lyZCBpbiBlaW5lciBzZXBhcmF0ZW4KKyAgICAgICAgWmVpbGUgenVzYWV0emxpY2ggZGllIFZvcnNpY2h0IHNvd2llIGJlaSBTZWhlcm4gZGllIEZsdWNodHJpY2h0dW5nCisgICAgICAgIGdlbWVsZGV0LiBEaWUgQXVzZ2FiZSBpc3QgdW5hYmhhZW5naWcgdm9uIGRlbSBMUC9LUC9HaWZ0LVJlcG9ydAorICAgICAgICB1bmQgZmluZGV0IHdpZSBiZWkgZGllc2VtIG51ciBkYW5uIHN0YXR0LCB3ZW5uIGVpbmUgQWVuZGVydW5nIGFuCisgICAgICAgIFZvcnNpY2h0IG9kZXIgRmx1Y2h0cmljaHR1bmcgZWluZ2V0cmV0ZW4gaXN0LCBkYW5uIGFiZXIgd2VyZGVuIGJlaWRlCisgICAgICAgIFdlcnRlIGdlbWVpbnNhbSBhdXNnZWdlYmVuLgorCisgICAgICAgICJyZXBvcnQgc2VuZGVuIiBrYW5uIHp1bSBUZXN0ZW4gdmVyd2VuZGV0IHdlcmRlbiBvZGVyIHdlbm4gZGVyCisgICAgICAgIENsaWVudCBuYWNoIGRlbSBWZXJiaW5kZW4gYWxsZSBEYXRlbiBlaW5tYWwgYnJhdWNodC4gKE51dHp0IG1hbgorICAgICAgICBHTUNQLCB3ZXJkZW4gZGllIERhdGVuIHBlciBHTUNQIGdlc2VuZGV0LikgCisKK0hJTldFSVNFOgorICAgICAgICAtIERpZSBBbnplaWdlIGRlciBMUCBpc3Qgc29mb3J0IG5hY2ggQ2hhcmFrdGVyZXJzdGVsbHVuZyB2ZXJmdWVnYmFyLgorICAgICAgICAtIERpZSBBbnplaWdlIGRlciBLUCBpc3QgZXJzdCBuYWNoIEFic2NobHVzcyBkZXIgUXVlc3QgIkhpbGYgZGVuIAorICAgICAgICAgIEduYXJmZW4iIHZlcmZ1ZWdiYXIuIFNvbGFuZ2UgZGllcyBuaWNodCBkZXIgRmFsbCBpc3QsIHdlcmRlbgorICAgICAgICAgIG5pY2h0IGRpZSBLUCwgc29uZGVybiBkaWUgWmVpY2hlbiAjIyMgYW5nZXplaWd0LgorICAgICAgICAtIERpZSBBbnplaWdlIGRlcyBHaWZ0c3RhdHVzIGlzdCBlcnN0IG5hY2ggQWJzY2hsdXNzIGRlciBRdWVzdAorICAgICAgICAgICJLYXR6ZW5qYW1tZXIiIHZlcmZ1ZWdiYXIuIFNvbGFuZ2UgZGllcyBuaWNodCBkZXIgRmFsbCBpc3QsCisgICAgICAgICAgd2lyZCBkZXIgR2lmdHN0YXR1cyBhbHMgIihuaWNodCB2ZXJmdWVnYmFyKSIgZ2VtZWxkZXQuCisgICAgICAgIC0gRGllIEFuemVpZ2UgZGVyIFZvcnNpY2h0IGlzdCBlcnN0IG5hY2ggQWJzY2hsdXNzIGRlciBRdWVzdCAKKyAgICAgICAgICAiU2NocmF0IGthbm4gbmljaHQgZWluc2NobGFmZW4iIHZlcmZ1ZWdiYXIuIE1pdCBFcnJlaWNoZW4gZGVzCisgICAgICAgICAgU2VoZXItU3RhdHVzIHplaWd0IGRpZXNlIE9wdGlvbiB6dXNhZXR6bGljaCBkaWUgZWluZ2VzdGVsbHRlCisgICAgICAgICAgRmx1Y2h0cmljaHR1bmcgYW4uIFNlaGVybiwgZGllIGRpZXNlIFF1ZXN0IG5pY2h0IGFiZ2VzY2hsb3NzZW4KKyAgICAgICAgICBoYWJlbiwgc3RlaHQga2VpbmVzIHZvbiBiZWlkZW4genVyIFZlcmZ1ZWd1bmcuIFNwaWVsZXJjaGFyYWt0ZXJlbgorICAgICAgICAgIHdpcmQgZGllIEZsdWNodHJpY2h0dW5nIGJpcyB6dW0gRXJyZWljaGVuIGRlcyBTZWhlcnN0YXR1cyBhbHMKKyAgICAgICAgICAiKG5pY2h0IHZlcmZ1ZWdiYXIpIiBnZW1lbGRldC4KKyAgICAgICAgLSBOYWNoIGRlbSBCZXN0ZWhlbiBlaW5lciBkZXIgZ2VuYW5udGVuIFF1ZXN0cyBtdXNzIGVpbiBiZXJlaXRzCisgICAgICAgICAgZWluZ2VzY2hhbHRldGVyIFJlcG9ydCBlaW5tYWwgYXVzLSB1bmQgd2llZGVyIGVpbmdlc2NoYWx0ZXQKKyAgICAgICAgICB3ZXJkZW4sIHVtIGRpZSBBZW5kZXJ1bmcgenUgYWt0aXZpZXJlbi4KKyAgICAgICAgLSBEZXIgVm9yc2ljaHQtUmVwb3J0IGxhZXNzdCBzaWNoIGF1Y2ggYWxsZWluZSBiZW51dHplbiwgamVkb2NoIAorICAgICAgICAgIG11ZXNzZW4genV2b3IgYWxsZSBSZXBvcnRmdW5rdGlvbmVuIG1pdCAicmVwb3J0IGF1cyIgYWJnZXNjaGFsdGV0CisgICAgICAgICAgd2VyZGVuLCB1bSBkYW5hY2ggZGVuIFZvcnNpY2h0LVJlcG9ydCBzZXBhcmF0IGVpbnp1c2NoYWx0ZW4uCisKK0JFSVNQSUVMRToKKyAgICAgICAgQW5nZW5vbW1lbiwgZWluIFNwaWVsZXIsIGRlciB6dW5hZWNoc3QgbWl0ICJyZXBvcnQgZWluIiBkZW4gTFAtL0tQLQorICAgICAgICB1bmQgR2lmdC1SZXBvcnQgZWluZ2VzY2hhbHRldCBoYXQgdW5kIGdlcmFkZSBnZWdlbiBlaW5lIGdlZmFlaHJsaWNoZQorICAgICAgICBTcGlubmUga2FlbXBmdCwgaGFiZSBiZXJlaXRzIGVpbmlnZSBUcmVmZmVyIGVybGl0dGVuIHVuZCBhdWNoIGVpbmlnZQorICAgICAgICBLUCBmdWVyIFphdWJlcnNwcnVlY2hlIGF1c2dlZ2ViZW4gdW5kIGRhaGVyIGFrdHVlbGwgbnVyIG5vY2gKKyAgICAgICAgMTU0IExQLCAxODcgS1AgdW5kIHNlaSBuaWNodCB2ZXJnaWZ0ZXQuIFdpcmQgZXIgbnVuIHZvbiBkZXIgU3Bpbm5lCisgICAgICAgIGdlYmlzc2VuIHVuZCB2ZXJnaWZ0ZXQsIHdpcmQgZGllc2UgUmVwb3J0bWVsZHVuZyBhdXNnZWdlYmVuOgorICAgICAgICAgICAgTFA6IDE1NCwgS1A6IDE4NywgR2lmdDogbGVpY2h0LgorICAgICAgICBXZW5uIGRpZSBTcGlubmUgYmVpIGRpZXNlbSBCaXNzIGFiZXIgZ2xlaWNoIGF1Y2ggU2NoYWRlbiB2ZXJ1cnNhY2h0LAorICAgICAgICB1bmQgZGVyIFNwaWVsZXIgNiBMUCB2ZXJsaWVydCwgd3VlcmRlIHNvZm9ydCBlaW4gd2VpdGVyZXIgUmVwb3J0CisgICAgICAgIGF1c2dlbG9lc3Q6CisgICAgICAgICAgICBMUDogMTQ4LCBLUDogMTg3LCBHaWZ0OiBsZWljaHQuCisgICAgICAgIFdlbm4gZGVyIFNwaWVsZXIgamVkb2NoIG5pY2h0IGdlcm5lIHF1ZXN0ZXQgdW5kIGlobSBkYWhlciBudXIgZGVyCisgICAgICAgIExQLVJlcG9ydCB6dXIgVmVyZnVlZ3VuZyBzdGVodCwgd3VlcmRlIG51ciBlaW5lIGRlciBiZWlkZW4gQWVuZGVydW5nZW4KKyAgICAgICAgZ2VtZWxkZXQsIG5hZW1saWNoIGRpZSBMUC1BZW5kZXJ1bmcsIHVuZCBzb21pdCBmb2xnZW5kZXIgUmVwb3J0CisgICAgICAgIGF1c2dlZ2ViZW46CisgICAgICAgICAgICBMUDogMTQ4LCBLUDogIyMjLCBHaWZ0OiAobmljaHQgdmVyZnVlZ2JhcikuCisKK1NJRUhFIEFVQ0g6CisgICAgICAgIHZvcnNpY2h0LCBmbHVjaHRyaWNodHVuZywgbGViZW4sIGhlaWx1bmcsIGthbXBmCisKK0xFVFpURSBBRU5ERVJVTkc6CisgICAwOS4wMS4yMDE1LCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9wY21kL3JmbHVlc3RlcmUgYi9kb2MvcGNtZC9yZmx1ZXN0ZXJlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MjQ3YTgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcGNtZC9yZmx1ZXN0ZXJlCkBAIC0wLDAgKzEsMjcgQEAKKworcmZsdWVzdGVyZQorLS0tLS0tLS0tCisKKyBLT01NQU5ETzoKKyAgICByZmx1ZXN0ZXJlIDx3ZW0+IHp1IDx0ZXh0PgorCisgQVJHVU1FTlRFOgorCisgICAgIDx3ZW0+CisgICAgICAgIERhcyBMZWJ3ZXNlbiwgZGVtIER1IGF1cyBkZXIgRmVybmUgZXR3YXMgenVmbHVlc3Rlcm4gd2lsbHN0CisgICAgIDx0ZXh0PgorICAgICAgICBEZXIgenUgZmx1ZXN0ZXJuZGUgVGV4dAorCisgQkVTQ0hSRUlCVU5HOgorICAgIEdpYnQgZWluZSBNaXR0ZWlsdW5nIGFuIGRhcyBhbmdlZ2ViZW5lIExlYmV3ZXNlbiBhdXMsIGRpZSBuaWVtYW5kIGFuZGVyZXMKKyAgICBob2VyZW4ga2Fubi4gRGFzIExlYmV3ZXNlbiBtdXNzIHNpY2ggaW4gZWluZW0gYW5kZXJlbiBSYXVtIGJlZmluZGVuLgorICAgIERpZXNlciBCZWZlaGwgaXN0IGZhc3QgYWVobmxpY2ggenVtICd0ZWlsZSAobWl0KSctQmVmZWhsLCBhbGxlcmRpbmdzIGthbm4KKyAgICBsZXR6dGVyZXIgaW4gZWluZXIgVE0tSGlzdG9yeSBiZWltIFNlbmRlciB1bmQvb2RlciBFbXBmYWVuZ2VyIGdlc3BlaWNoZXJ0CisgICAgd2VyZGVuLCB3YWVocmVuZCBkaWVzIGJlaSAncmZsdWVzdGVyZScgbmljaHQgcGFzc2llcmVuIGthbm4uCisKKyBTSUVIRSBBVUNIOgorICAgIHNhZ2UsIGZyYWdlLCBhbnR3b3J0ZSwgdGVpbGUgKG1pdCksIGdlc3ByYWVjaCwgcnVmZSwgZWJlbmVuLCB3ZWcsCisgICAgaWdub3JpZXJlLCBrb2JvbGQsIHRtaGlzdAorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICAxMC4wOC4yMDA4LCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvcGNtZC9yaWVjaGUgYi9kb2MvcGNtZC9yaWVjaGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBjNGE4MgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wY21kL3JpZWNoZQpAQCAtMCwwICsxLDMyIEBACisKK3JpZWNoKGUpIChhbikKKy0tLS0tLS0tLS0tLS0tCisKK0tPTU1BTkRPCisJcmllY2goZSkKKwlyaWVjaChlKSA8d2FzPiBbYW4gPG9iamVrdD4gfCBhbSA8b2JqZWt0Pl0gW2luIG1pciB8IGltIHJhdW1dCisKK0FSR1VNRU5URQorCTxvYmpla3Q+CisJICBFaW4gR2VnZW5zdGFuZCBiencuIExlYmV3ZXNlbiwgYW4gZGVtIHJpZWNoZW4gd2lsbC4KKworQkVTQ0hSRUlCVU5HCisJYHJpZWNoJyBiencuIGByaWVjaGUnIGlzdCBkYXMgYWxsZ2VtZWluZSBLb21tYW5kbywgdW0gR2VydWVjaGUKKwlhbiBHZWdlbnN0YWVuZGVuLCBMZWJld2VzZW4gb2RlciBpbiBSYWV1bWVuIHdhaHJ6dW5laG1lbi4gSGllcmJlaQorCWxhZXNzdCBgcmllY2goZSknIG9obmUgQXJndW1lbnRlIGRlbiBTcGllbGVyIGRpZSBIYXVwdGdlcnVlY2hlIGluCisJZGVtIFJhdW0gd2Focm5laG1lbiwgaW4gZGVtIGVyIHNpY2ggZGVyemVpdCBiZWZpbmRldC4gQW4gYWxsZW4KKwlhbmRlcmVuIEdlZ2Vuc3RhZW5kZW4gYnp3LiBMZWJld2VzZW4gaW0gc2VsYmVuIFJhdW0gb2RlciBpbSBlaWdlbmVuCisJSW52ZW50YXIga2FubiBtYW4gbWl0IGByaWVjaChlKSAoYW4pJyBlYmVuZmFsbHMgR2VydWVjaGUKKwl3YWhybmVobWVuLiBOaWNodCBpbW1lciBrYW5uIG1hbiBqZWRvY2ggZXR3YXMgQmVzb25kZXJlcyByaWVjaGVuLgorCisJRGEgYmVpIE9iamVrdGVuIG1pdCBnbGVpY2hlbiBHZXJ1Y2hzYXJ0ZW4genVlcnN0IGFuIGltIFJhdW0KKwlsaWVnZW5kZW4gT2JqZWt0IGdlcm9jaGVuIHdpcmQsIGthbm4gbWFuIGFuIFNhY2hlbiwgZGllIG1hbiBiZWkKKwlzaWNoIHRyYWVndCwgYXVmIGFsbGUgRmFlbGxlIG1pdCBkZW0gWnVzYXR6IGBpbiBtaXInIHJpZWNoZW4uCisKK1NJRUhFIEFVQ0g6CisgIGJlenVnc3B1bmt0CisgIHNjaGF1LCBsYXVzY2hlLCB0YXN0ZSwgbGllcworCitMRVRaVEUgQUVOREVSVU5HRU46CisgIDE4LjAxLjIwMTMsIFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL3BjbWQvcmtudWRkbGUgYi9kb2MvcGNtZC9ya251ZGRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDZhZWU4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BjbWQvcmtudWRkbGUKQEAgLTAsMCArMSwyMSBAQAorCitya251ZGRsZQorLS0tLS0tLS0KKworIEtPTU1BTkRPOgorICAgIHJrbnVkZGxlIDxuYW1lPgorCisgQVJHVU1FTlRFOgorCisgICAgIDxuYW1lPgorICAgICAgICBFaW4gU3BpZWxlciwgZGVyIG5pY2h0IGltIGdsZWljaGVuIFJhdW0gaXN0CisKKyBCRVNDSFJFSUJVTkc6CisgICAgRHUga251ZGRlbHN0IGVpbmVuIFtiZXN0aW1tdGVuXSBTcGllbGVyLCBkZXIgc2ljaCBuaWNodCBpbSBnbGVpY2hlbiBSYXVtCisgICAgYmVmaW5kZXQsIGluIGRlbSBEdSBEaWNoIGF1ZmhhZWx0c3QuCisKKyBTSUVIRSBBVUNIOgorICAgIHZlcmJlbiwgcndpbmtlCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFRodSwgMjQuMDcuMTk5NywgMDk6MDA6MDAgdm9uIFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL3BjbWQvcnVmZSBiL2RvYy9wY21kL3J1ZmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVjMTIxNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wY21kL3J1ZmUKQEAgLTAsMCArMSwyNyBAQAorCitydWZlCistLS0tCisKKyBLT01NQU5ETzoKKyAgICBydWZlIDx0ZXh0PgorCisgQVJHVU1FTlRFOgorCisgICAgIDx0ZXh0PgorICAgICAgICBEZXIgenUgcnVmZW5kZSBUZXh0CisKKyBCRVNDSFJFSUJVTkc6CisgICAgRHUgcnVmc3Qgc28gbGF1dCA8dGV4dD4sIGRhc3MgbWFuIERpY2ggaW0gZ2FuemVuIE1vcmdlbkdyYXVlbiBob2VyZW4ga2Fubi4KKyAgICBEYSBkYXMgTW9yZ2VuR3JhdWVuIGFsbGVyZGluZ3MgemllbWxpY2ggZ3Jvc3MgaXN0LCB2ZXJicmF1Y2h0IGVpbiBSdWYgZWluCisgICAgZ2V3aXNzZXMgTWFzcyBhbiBnZWlzdGlnZXIgRW5lcmdpZSAoc3ByaWNoOiBNYWdpZXB1bmt0ZW4pLgorCisgICAgUnVmZSB3ZXJkZW4gaW0gYWxsZ2VtZWluZW4gYWxzIHN0b2VyZW5kIGVtcGZ1bmRlbjsgbWFuIHNvbGx0ZSBsaWViZXIgZGllCisgICAgRWJlbmVuIGJlbnV0emVuLiBEaWVzZSBzaW5kIG5hY2ggVGhlbWVuIGVpbmdldGVpbHQsIHVuZCBpaHJlIE51dHp1bmcgaXN0CisgICAga29zdGVubG9zLgorCisgU0lFSEUgQVVDSDoKKyAgICBzYWdlLCBmcmFnZSwgYW50d29ydGUsIGZsdWVzdGVyZSwgdGVpbGUgKG1pdCksIGdlc3ByYWVjaCwgZWJlbmVuLCBtcnVmZSwKKyAgICB3ZWcsIGlnbm9yaWVyZSwga29ib2xkCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFRodSwgMjQuMDcuMTk5NywgMDk6MDA6MDAgdm9uIFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL3BjbWQvcndpbmtlIGIvZG9jL3BjbWQvcndpbmtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhOWJmMzMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcGNtZC9yd2lua2UKQEAgLTAsMCArMSwyMSBAQAorCityd2lua2UKKy0tLS0tLQorCisgS09NTUFORE86CisgICAgcndpbmtlIDxuYW1lPgorCisgQVJHVU1FTlRFOgorCisgICAgIDxuYW1lPgorICAgICAgICBFaW4gU3BpZWxlciwgZGVyIG5pY2h0IGltIGdsZWljaGVuIFJhdW0gaXN0CisKKyBCRVNDSFJFSUJVTkc6CisgICAgRHUgd2lua3N0IGVpbmVtIFtiZXN0aW1tdGVuXSBTcGllbGVyIHp1LCBkZXIgc2ljaCBuaWNodCBpbSBnbGVpY2hlbiBSYXVtCisgICAgYmVmaW5kZXQsIGluIGRlbSBEdSBEaWNoIGF1ZmhhZWx0c3QuCisKKyBTSUVIRSBBVUNIOgorICAgIHZlcmJlbiwgcmtudWRkbGUKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgVGh1LCAyNC4wNy4xOTk3LCAwOTowMDowMCB2b24gV2FyZ29uCmRpZmYgLS1naXQgYS9kb2MvcGNtZC9zYWdlIGIvZG9jL3BjbWQvc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODE3NzllCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BjbWQvc2FnZQpAQCAtMCwwICsxLDIzIEBACisKK3NhZ2UKKy0tLS0KKworIEtPTU1BTkRPOgorICAgIHNhZ2UgPHRleHQ+CisKKyBBUkdVTUVOVEU6CisKKyAgICAgPHRleHQ+CisgICAgICAgIFdhcyBtYW4gc28genUgc2FnZW4gaGF0CisKKyBCRVNDSFJFSUJVTkc6CisgICAgRGVyIFRleHQgPHRleHQ+IHdpcmQgYW4gYWxsZSBTcGllbGVyIGltIHNlbGJlbiBSYXVtIGF1c2dlZ2ViZW4uIFVlYmVybGFuZ2UKKyAgICBaZWlsZW4gd2VyZGVuIHVtZ2Vicm9jaGVuLCB1bmQgdm9yIGplZGUgWmVpbGUgd2lyZCBub2NoCisgICAgYDxEZWluX05hbWU+IHNhZ3Q6ICcgZ2VzZXR6dC4KKworIFNJRUhFIEFVQ0g6CisgICAgZnJhZ2UsIGFudHdvcnRlLCBmbHVlc3RlcmUsIHRlaWxlIChtaXQpLCBnZXNwcmFlY2gsIHJ1ZmUsIGViZW5lbiwgd2VnLAorICAgIGlnbm9yaWVyZSwga29ib2xkLCBrbGluZ2VsdG9uLCBzZW5kZXJ3aWVkZXJob2x1bmcKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgMDEuMDcuMjAwNyB2b24gRW5ub3gKZGlmZiAtLWdpdCBhL2RvYy9wY21kL3NjaGF1IGIvZG9jL3BjbWQvc2NoYXUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdhNmY2ZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wY21kL3NjaGF1CkBAIC0wLDAgKzEsNzIgQEAKKworc2NoYXUgKGFuKQorLS0tLS0tLS0tLQorCisgS09NTUFORE86CisgICAgc2NoYXUKKyAgICBzY2hhdSAtZiB8IGdlbmF1CisgICAgc2NoYXUgLWsgfCBrdXJ6CisgICAgc2NoYXUgWy1mfGdlbmF1XSA8d2FzPiBbYW4gPG9iamVrdD4gfCBhbSA8b2JqZWt0Pl0gW2luIG1pciB8IGltIHJhdW1dIGFuCisgICAgdW50ZXJzdWNoZSA8d2FzPiBbYW4gPG9iamVrdD4gfCBhbSA8b2JqZWt0Pl0gW2luIG1pciB8IGltIHJhdW1dCisKKyBBUkdVTUVOVEU6CisKKyAgICAgPHdhcz4KKyAgICAgICAgRWluIEdlZ2Vuc3RhbmQgb2RlciBEZXRhaWwKKyAgICAgPG9iamVrdD4KKyAgICAgICAgRWluIHdlaXRlcmVyIEdlZ2Vuc3RhbmQgKGtlaW4gRGV0YWlsKQorCisgQkVTQ0hSRUlCVU5HOgorICAgIChTdGF0dCBgdW50ZXJzdWNoZScga2FubiBtYW4gYXVjaCBgdW50JywgYGJldHJhY2h0ZScgb2RlciBgYmV0cicKKyAgICB2ZXJ3ZW5kZW4uKQorCisgICAgYHNjaGF1JyBpc3QgZGFzIGFsbGdlbWVpbmUgS29tbWFuZG8sIHVtIEdlZ2Vuc3RhZW5kZSB1bmQgUmFldW1lIHp1CisgICAgdW50ZXJzdWNoZW4uIGBzY2hhdScgb2huZSBBcmd1bWVudGUgZ2lidCBlaW5lIEJlc2NocmVpYnVuZyBkZXMgUmF1bWVzLCBpbgorICAgIGRlbSBkZXIgU3BpZWxlciBzaWNoIGJlZmluZGV0LiBBbGxlIGFuZGVyZW4gR2VnZW5zdGFlbmRlLCBNb25zdGVyIHVuZAorICAgIFNwaWVsZXIgaW0gc2VsYmVuIFJhdW0gb2RlciBpbSBlaWdlbmVuIEludmVudGFyIGtvZW5uZW4gbWl0IGBzY2hhdSAoYW4pJworICAgIHVudGVyc3VjaHQgd2VyZGVuLgorCisgICAgYHNjaGF1JyBtdXNzIGFiZXIgbmljaHQgdW5iZWRpbmd0IGFsbGUgR2VoZWltbmlzc2UgZGVzIEdlZ2Vuc3RhbmRlcworICAgIHZlcnJhdGVuLgorCisgICAgYHVudFtlcnN1Y2hlXScgYnp3LiBgYmV0clthY2h0ZV0nIG1hY2h0IGdlbmF1IGRhc3NlbGJlLCBpc3QgYWJlciBtYW5jaGVuCisgICAgdmllbGxlaWNodCBsaWViZXIuCisKKyAgICBEYSBiZWkgT2JqZWt0ZW4gbWl0IGdsZWljaGVyIEJlbmVubnVuZyB6dWVyc3QgZGFzIGltIFJhdW0gTGllZ2VuZGUKKyAgICB1bnRlcnN1Y2h0IHdpcmQsIGthbm4gbWFuIFNhY2hlbiwgZGllIG1hbiBiZWkgc2ljaCB0cmFlZ3QsIGF1ZiBhbGxlIEZhZWxsZQorICAgIG1pdCBkZW0gWnVzYXR6IGBpbiBtaXInIHVudGVyc3VjaGVuLgorCisgICAgQmV0cmFjaHRldCBtYW4gZWluIDxvYmpla3Q+IGltIFJhdW0sIHNvIHdpcmQgZXMgYWxzIG5ldWVyIEJlenVnc3B1bmt0IGZ1ZXIKKyAgICB3ZWl0ZXJlIEJldHJhY2h0dW5nZW4gZ2Vub21tZW4uIEQuaC4gbWFuIGthbm4gYWxzIG5hZWNoc3RlcyBlaW4gRGV0YWlsIGFuCisgICAgZGVtIE9iamVrdCBiZXRyYWNodGVuLCBvaG5lIGVpbmdlYmVuIHp1IG11ZXNzZW4gYHVudCA8ZGV0YWlsPiBhbgorICAgIDxvYmpla3Q+Jywgc29uZGVybiBlcyByZWljaHQgZGFubiBgdW50IDxkZXRhaWw+Jy4gV2lyZCBkYXMgRGV0YWlsIGFuIGRlbQorICAgIGViZW4gYmV0cmFjaHRldGVuIE9iamVrdCBuaWNodCBnZWZ1bmRlbiwgc28gd2lyZCBkZXIgQmV6dWdzcHVua3Qgd2llZGVyCisgICAgYXVmIGRpZSBVbWdlYnVuZyB1bmQgZGllIE9iamVrdGUgaW0gU3BpZWxlciBnZXNldHp0LgorICAgIAorICAgIERpZSBPcHRpb24gJy1mJyBiencuICdnZW5hdScgc29yZ3QgZGFmdWVyLCBkYXNzIGdsZWljaGFydGlnZSBPYmpla3RlCisgICAgYmVpIGRlciBMYW5nYmVzY2hyZWlidW5nIGRlcyBSYXVtZXMgb2RlciBkZXIgQmV0cmFjaHR1bmcgZWluZXMgQmVoYWVsdGVycworICAgIG5pY2h0IHp1c2FtbWVuZ2VmYXNzdCB3ZXJkZW4uIAorICAgIERhcyBrYW5uIG51ZXR6bGljaCBzZWluLCB3ZW5uIHZlcnNjaGllZGVuZSBPYmpla3RlIG1pdCBnbGVpY2hlcgorICAgIEJlemVpY2hudW5nIChiZWlzcGllbHN3ZWlzZSB2ZXJzY2hpZWRlbmUgU2Nod2VydGVyKSBpbSBSYXVtIGxpZWdlbgorICAgIHVuZCBtYW4gd2lzc2VuIHdpbGwsIHdlbGNoZXMgZGF2b24gbWFuIG1pdCAnbmltbSBzY2h3ZXJ0IDInIG51bgorICAgIHdpcmtsaWNoIG5pbW10LgorICAgIAorICAgICdzY2hhdSAtaycgb2RlciAnc2NoYXUga3VyeicgZ2ViZW4gZGllIEt1cnpiZXNjaHJlaWJ1bmcgZGVyIGFrdHVlbGxlbgorICAgIFVtZ2VidW5nIGF1cywgd2llIHNpZSBhdWNoIGJlaSBCZXdlZ3VuZ2VuIGltIEt1cnotTW9kdXMgZXJzY2hlaW50LgorCisgICAgJ3NjaGF1JyBvaG5lIGVpbiBBcmd1bWVudCBsb2VzY2h0IGRhcyBzb2cuIEJlenVnc29iamVrdC4KKworIEFDSFRVTkc6CisgICAgTWFuY2hlIFJhZXVtZSBkZWZpbmllcmVuIGlociBlaWdlbmVzIFZlcmI6IGB1bnRlcnN1Y2hlJy4gSGllciBrb2VubmVuCisgICAgYHVudCcgdW5kIGB1bnRlcnN1Y2hlJyB6dSAqdmVyc2NoaWVkZW5lbiogRXJnZWJuaXNzZW4gZnVlaHJlbi4gU29sbHRlIGV1Y2gKKyAgICBkYXMgYXVmZmFsbGVuLCBzZXR6dCBiaXR0ZSBtaXQgImZlaGxlciIgZWluZW4gRmVobGVyIGluIGRpZXNlbSBSYXVtIC8gYW4KKyAgICBkZW0gT2JqZWt0IGFiLgorCisgU0lFSEUgQVVDSDoKKyAgICBiZXp1Z3NwdW5rdAorICAgIHJpZWNoZSwgbGF1c2NoZSwgdGFzdGUsIGxpZXMKKyAgICBrdXJ6LCBhdXNnYWVuZ2UKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAyMC4wMi4yMDEzLCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9wY21kL3NjaGxhZmUgYi9kb2MvcGNtZC9zY2hsYWZlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NWM2M2MKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcGNtZC9zY2hsYWZlCkBAIC0wLDAgKzEsMzcgQEAKKworc2NobGFmZSBlaW4KKy0tLS0tLS0tLS0tCisKKyBLT01NQU5ETzoKKyAgICBzY2hsYWZlIGVpbgorCisgQVJHVU1FTlRFOgorICAgIGtlaW5lCisKKyBCRVNDSFJFSUJVTkc6CisgICAgVW50ZXJicmljaHQgZGllIFZlcmJpbmR1bmcgenVtIFNwaWVsLiBBbGxlIEdlZ2Vuc3RhZW5kZSwgZGllIG1hbiBiZWkgZGVyCisgICAgRWluZ2FiZSBkZXMgS29tbWFuZG9zIGJlaSBzaWNoIGhhdCwgYmVoYWVsdCBtYW4uIEJlaW0gTmV1LUVpbmxvZ2dlbiBrb21tdAorICAgIG1hbiBub3JtYWxlcndlaXNlIGFuIGRlciBnbGVpY2hlbiBTdGVsbGUgaGVyYXVzLCBhbiBkZXIgbWFuIGRhcyBTcGllbAorICAgIHZlcmxhc3NlbiBoYXQuIFZvbiBkaWVzZXIgUmVnZWwga2FubiBlcyBhYmVyIGF1Y2ggQXVzbmFobWVuIGdlYmVuLCB2b24KKyAgICBkZW5lbiBkaWUgd2ljaHRpZ3N0ZSBkaWUgU2VoZXJoYWV1c2VyIHNpbmQ6IHNjaGxhZWZ0IG1hbiBpbiBlaW5lbQorICAgIFNlaGVyaGF1cyBlaW4sIHdhY2h0IG1hbiB2b3IgZGVtIEhhdXMgd2llZGVyIGF1ZiAoQXVzbmFobWUgdm9uIGRlcgorICAgIEF1c25haG1lOiBkZXIgSGF1c2Jlc2l0emVyIHNlbGJzdCBpc3QgZGF2b24gbmljaHQgYmV0cm9mZmVuKS4KKyAgICBHcnVuZCBmdWVyIGRpZXNlIE1hc3NuYWhtZSBpc3QsIGRhc3MgU3BpZWxlciBzbyBuaWNodCBiZWFic2ljaHRpZ3QKKyAgICBvZGVyIHVuYmVhYnNpY2h0aWd0IGltIFNlaGVyaGF1cyBlaW5nZXNjaGxvc3NlbiB3ZXJkZW4ga29lbm5lbi4KKworICAgIEFDSFRVTkc6IEZhbGxzIGRhcyBTcGllbCBhYnN0dWVyenQgb2RlciBuZXUgZ2VzdGFydGV0IHdpcmQsIHZlcmxpZXJ0IG1hbgorICAgIGFsbGUgc2VpbmUgR2VnZW5zdGFlbmRlIHVuZCBzdGFydGV0IGJlaW0gRWlubG9nZ2VuIHdpZWRlciBhbiBzZWluZW0KKyAgICBsb2thbGVuIFN0YXJ0cHVua3QhCisgICAgKEluIGRlciBSZWdlbCBnaWJ0IGVzIGRhbm4gYWJlciBlaW5lIChrbGVpbmUpIEVudHNjaGFlZGlndW5nIGZ1ZXIgZGllCisgICAgdmVybG9yZW5lbiBHZWdlbnN0YWVuZGUgKG9obmUgR2V3YWVocikuICkKKworICAgIEFDSFRVTkc6IEFiZW50ZXVlciBrb2VubmVuIHVudGVyIFVtc3RhZW5kZW4gbmFjaCBkZW0gV2llZGVyYXVmd2FjaGVuIG5pY2h0CisgICAgbWVociB3ZWl0ZXJnZXNwaWVsdCB3ZXJkZW4uCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFTlVUWlVORyBBVUYgRUlHRU5FIEdFRkFIUiEKKworIFNJRUhFIEFVQ0g6CisgICAgc3BlaWNoZXJuLCBlbmRlLCBrZWVwYWxpdmUKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgU2F0LCAwNC4wMS4yMDAzLCAxNDo0NTowMCB2b24gV2FyZ29uCmRpZmYgLS1naXQgYS9kb2MvcGNtZC9zZWxic3Rsb2VzY2h1bmcgYi9kb2MvcGNtZC9zZWxic3Rsb2VzY2h1bmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgzMjAyMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wY21kL3NlbGJzdGxvZXNjaHVuZwpAQCAtMCwwICsxLDI1IEBACitLT01NQU5ETzoKKwlTZWxic3Rsb2VzY2h1bmcKKworQVJHVU1FTlRFOgorCWtlaW5lCisKK0JFU0NIUkVJQlVORzoKKwlEZXIgQ2hhcmFrdGVyIHdpcmQgdW53aWRlcnJ1ZmxpY2ggYXVzIGRlbSBTcGllbCBlbnRmZXJudC4gQXVjaCBldnRsLgorCW5vY2ggdm9yaGFuZGVuZSBCcmllZmUgd2VyZGVuIGVudGZlcm50LgorCVdlbm4gbWFuIFNlaGVyIG9kZXIgTWFnaWVyIGlzdCwgd2lyZCBkZXIgTmFtZSBkZXMgQ2hhcmFrdGVycworCXp1c2FldHpsaWNoIGdlYmFuaXNodCwgZGFtaXQgc2ljaCBuaWNodCBhdXMgVmVyc2VoZW4gZWluIE5ldWxpbmcgbWl0CisJZWluZW0gYmVydWVobXRlbiBvZGVyIGFiZXIgYXVjaCBiZXJ1ZWNodGlndGVuIE5hbWVuIGVpbmxvZ2d0LCB3YXMKKwlzaWNoZXIgenUgZWluaWdlciBWZXJ3aXJydW5nIGZ1ZWhyZW4gd3VlcmRlLgorCVdpbGwgbWFuIG51ciBhdWYgYWJzZWhiYXJlIChvZGVyIGF1Y2ggdW5hYnNlaGJhcmUpIFplaXQgbmljaHQgbWVociAKKwlzcGllbGVuLCBzbyBzb2xsdGUgbWFuIGJlc3NlciBkZW4gQmVmZWhsICdTcGllbHBhdXNlJyBiZW51dHplbi4KKworCUFscyBsZXR6dGVuIFZvcnNjaGxhZzogV2VubiBEdSBEaWNoIHp1IGRpZXNlbSBTY2hyaXR0IGVudHNjaGxvc3NlbiBoYXN0LAorCXVlYmVybGVnZSBEaXIsIG9iIER1IGRlbiBNaXRzcGllbGVybiwgZGllIER1IGtlbm5zdCwgbmljaHQgbm9jaCBlaW5lCisJTWl0dGVpbHVuZyBzY2hpY2tlbiBtYWdzdCwgc2llIGtvZW5udGVuIHNpY2ggc29uc3QgU29yZ2VuIG1hY2hlbi4gCisKK1NJRUhFIEFVQ0g6CisJc3BpZWxkYXVlciwgc3BpZWxwYXVzZSwgbG9lc2Noc2tyaXB0CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xldHp0ZSBBZW5kZXJ1bmc6IDE0LjAyLjIwMDcgdm9uIFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9wY21kL3NlbmRlcndpZWRlcmhvbHVuZyBiL2RvYy9wY21kL3NlbmRlcndpZWRlcmhvbHVuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWRkZmE5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BjbWQvc2VuZGVyd2llZGVyaG9sdW5nCkBAIC0wLDAgKzEsMzIgQEAKK0tPTU1BTkRPOgorCXNlbmRlcndpZWRlcmhvbHVuZyBbPFN0YXR1cz5dCisKK0FSR1VNRU5URToKKwk8U3RhdHVzPgorICAgICAgICAgICAgIDogYWt0dWVsbGVuIFN0YXR1cyBhbnplaWdlbiAgCisJICBFSU46IFNlbmRlcndpZWRlcmhvbHVuZyBlaW5zY2hhbHRlbi4KKwkgIEFVUzogU2VuZGVyd2llZGVyaG9sdW5nIGF1c3NjaGFsdGVuLgorCitCRVNDSFJFSUJVTkc6CisgICAgICAgIEJlaSBkZXIgS29tbXVuaWthdGlvbiBwZXIgdGVpbGUgbWl0IHVuZCBzYWcgd2lyZCBkZXIgU2VuZGVyIHZvciBkZW0KKyAgICAgICAgbWl0Z2V0ZWlsdGVuIFRleHQgZGFyZ2VzdGVsbHQuIEJpc2hlciBlcmZvbGd0ZSBkYXMgdm9yIGplZGVyIFplaWxlLgorICAgICAgICBNaXQgJ3NlbmRlcndpZWRlcmhvbHVuZyBhdXMnIHdpcmQgZGVyIFNlbmRlciBudXIgbm9jaCBlaW5tYWwgZGFyZ2UtCisgICAgICAgIHN0ZWxsdC4gRW50d2VkZXIgYW0gQW5mYW5nIGRlciBaZWlsZSwgd2VubiBlcyBudXIgZWluZSBaZWlsZSBpbnMtCisgICAgICAgIGdlc2FtdCBpc3QuIE9kZXIgdm9yIGRlbSBUZXh0LCB3ZW5uIGVzIG1laHJlcmUgWmVpbGVuIHNpbmQuCisKK0JFSVNQSUVMOgorICAgICAgICAgJ3NlbmRlcndpZWRlcmhvbHVuZyBlaW4nIChzdGFuZGFyZCkKKyAgICAgICAgIEVubm94IHRlaWx0IERpciBtaXQ6IGRhcyBpc3QgZWluCisgICAgICAgICBFbm5veCB0ZWlsdCBEaXIgbWl0OiBsYWVuZ2VyZXIgQmVpc3BpZWx0ZXh0CisgICAgICAgICBFbm5veCB0ZWlsdCBEaXIgbWl0OiBmdWVyICdzZW5kZXJ3aWVkZXJob2x1bmcnCisKKyAgICAgICAgICdzZW5kZXJ3aWVkZXJob2x1bmcgYXVzJworICAgICAgICAgRW5ub3ggdGVpbHQgRGlyIG1pdDogCisgICAgICAgICAgZGFzIGlzdCBlaW4gbGFlbmdlcmVyIEJlaXNwaWVsdGV4dCAKKyAgICAgICAgICBmdWVyICdzZW5kZXJ3aWVkZXJob2x1bmcnCisKK1NJRUhFIEFVQ0g6CisJdGVpbGUgbWl0LCBzYWdlLCBrbGluZ2VsdG9uLCBncmFmaWsgYXVzLCBlYmVuZW4KKworTEVUWlRFIEFFTkRFUlVORzoKKyAgIDE2LiBNYWkgMjAwNyAgRW5ub3gKZGlmZiAtLWdpdCBhL2RvYy9wY21kL3Nvbm5lbmZlaGxlciBiL2RvYy9wY21kL3Nvbm5lbmZlaGxlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGQ0Y2JhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BjbWQvc29ubmVuZmVobGVyCkBAIC0wLDAgKzEsMjUgQEAKK3Nvbm5lbmZlaGxlcgorLS0tLS0tLS0tLS0tCisKK0tPTU1BTkRPOgorICAgICBzb25uZW5mZWhsZXIgPHRleHQ+CisgICAKK0FSR1VNRU5URToKKyAgICAgPHRleHQ+CisgICAgICAgIEVpbmUgTWl0dGVpbHVuZworCitCRVNDSFJFSUJVTkc6CisgICAgIFdlbm4gZHUgYWxzIER1bmtlbGVsZiBtZWluc3QsIGRhc3MgZGllIFNvbm5lIGluIGRlbSAoSW5uZW4pcmF1bSwKKyAgICAgaW4gZGVtIGR1IGRpY2ggZ2VyYWRlIGJlZmluZGVzdCBuaWNodCBhbmdlYnJhY2h0IGlzdCwgZGFubiBzZXR6CisgICAgIGRvY2ggYml0dGUgZWluZSBrdXJ6ZSBNZWxkdW5nIGFiLgorCisgICAgIERpZXNlIEZlaGxlciB3ZXJkZW4gYXVzc2VyaGFsYiBkZXIgUmVnaW9uIGdlc2FtbWVsdCB1bmQgYmVhcmJlaXRldCwKKyAgICAgZWluZSBzZWhyIGxhbmdlIEFid2VzZW5oZWl0IGRlcyBSTXMgc29sbHRlIGRpY2ggYWxzbyBuaWNodCBoaW5kZXJuCisgICAgIGRlbiBGZWhsZXIgenUgbWVsZGVuLgorCitTSUVIRSBBVUNIOgorICAgICB0eXBvLCBpZGVlLCBkZXRhaWwsIGZlaGxlcgorCitMRVRaVEUgQWVOREVSVU5HOgorICAgICAyNi4gU2VwIDIwMTAsIEdsb2luc29uCisKZGlmZiAtLWdpdCBhL2RvYy9wY21kL3NwZWljaGVybiBiL2RvYy9wY21kL3NwZWljaGVybgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTMxYmZlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BjbWQvc3BlaWNoZXJuCkBAIC0wLDAgKzEsMjMgQEAKKworc3BlaWNoZXJuCistLS0tLS0tLS0KKworIEtPTU1BTkRPOgorICAgIHNwZWljaGVybgorCisgQVJHVU1FTlRFOgorICAgIGtlaW5lCisKKyBCRVNDSFJFSUJVTkc6CisgICAgU2ljaGVyZSBhbGxlIERhdGVuLCBkaWUgRGVpbmVuIENoYXJha3RlciBiZXRyZWZmZW4uIERpZXNlcyBLb21tYW5kbyB3aXJkCisgICAgYmVpbSBBdXNsb2dnZW4gdW5kIHJlZ2VsbWFlc3NpZyBhdXRvbWF0aXNjaCBkdXJjaGdlZnVlaHJ0LiBFaWdlbnRsaWNoIGlzdAorICAgIGRpZXNlcyBLb21tYW5kbyBudXIgZnVlciBiZXNvbmRlcnMgYWVuZ3N0bGljaGUgU3BpZWxlciwgYWxsZXJkaW5ncyBrYW5uIGVzCisgICAgYmVpIGVpbmVtIEFic3R1cnogZGVzIFNwaWVscyBhdWNoIHNlaHIgc2lubnZvbGwgc2Vpbi4KKworICAgIEVpbmUgUmVzdGF1cmllcnVuZyBmaW5kZXQgbnVyIHN0YXR0LCB3ZW5uIER1IERpY2ggaW5zIFNwaWVsIGVpbmxvZ2dzdC4KKworIFNJRUhFIEFVQ0g6CisgICAgZW5kZSwgc2NobGFmZSAoZWluKQorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBUaHUsIDI0LjA3LjE5OTcsIDA5OjAwOjAwIHZvbiBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9wY21kL3NwaWVsZGF1ZXIgYi9kb2MvcGNtZC9zcGllbGRhdWVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNjg3NWIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcGNtZC9zcGllbGRhdWVyCkBAIC0wLDAgKzEsMzIgQEAKK0tPTU1BTkRPOgorCVNwaWVsZGF1ZXIgPERhdWVyPiBNaW51dGVbbl0gZnVlciA8QW56YWhsPiBUYWdbZV0KKwlTcGllbGRhdWVyIDxEYXVlcj4gU3R1bmRlW25dIGZ1ZXIgPEFuemFobD4gVGFnW2VdCisKK0FSR1VNRU5URToKKwk8RGF1ZXI+CisJICBEYXVlciBkZXIgU3BpZWx6ZWl0IHBybyBUYWcgaW4gTWludXRlbiBvZGVyIFN0dW5kZW4KKwk8QW56YWhsPgorCSAgRGF1ZXIgZGVyIFNwaWVsemVpdGJlc2NocmFlbmt1bmcgaW4gVGFnZW4KKworQkVTQ0hSRUlCVU5HOgorCVdlbm4gbWFuIHVuYmVkaW5ndCBlaW5tYWwgZWluZSBNdWRwYXVzZSBlaW5sZWdlbiBtdWVzc3RlLCB3ZWlsIG1hbgorCXNpY2ggdW0gUkwtRGluZ2Ugd2llIEtsYXVzdXJlbiwgRGlwbG9tYXJiZWl0ZW4gdW5kIGFlaG5saWNoZQorCU5lYmVuc2FlY2hsaWNoa2VpdGVuIHp1IGt1ZW1tZXJuIGhhdCwgdW5kIHdlbm4gbWFuIGdlbmF1IHdlaXNzLCBkYXNzCisJbWFuIHNpY2ggYXVzIGVpZ2VuZW0gV2lsbGVuIG5pY2h0IHZvbSBFaW5sb2dnZW4gZmVybmhhbHRlbiBrYW5uLCBzbworCWthbm4gbWFuIHNpY2ggbWl0ICdTcGllbHBhdXNlJyBlaW5lIFp3YW5nc3BhdXNlIGdlbmVobWlnZW4uCisJV2VuaWdlciBkcmFzdGlzY2ggd2lya3QgZGVyIEJlZmVobCAnc3BpZWxkYXVlcicuIEhpZXJtaXQgc2NocmFlbmt0CisJbWFuIGRpZSBwcm8gVGFnIHp1ciBWZXJmdWVndW5nIHN0ZWhlbmRlIFplaXQgaW0gTVVEIGVpbi4gU29taXQga2FubgorCW1hbiBqZWRlbiBUYWcgbm9jaCBzY2huZWxsIHNlaW5lIE1haWxzIGxlc2VuIG9kZXIga3VyeiBGcmV1bmRlCisJYmVncnVlc3Nlbi4gSXN0IGRpZSBhbmdlZ2ViZW5lIFplaXQgdW0sIHNvIHdpcmQgbWFuIGF1dG9tYXRpc2NoIGF1cworCWRlbSBNVUQgZ2V3b3JmZW4gdW5kIGthbm4gc2ljaCBlcnN0IGFtIG5hZWNoc3RlbiBUYWcgd2llZGVyCisJZWlubG9nZ2VuLiBHaWJ0IG1hbiBhbHMgQW56YWhsIGRlciBUYWdlIDAgZWluLCBzbyB3aXJkIGRpZQorCUJlc2NocmFlbmt1bmcgYWJnZXNjaGFsdGV0LiBEYSBtYW4gZGFtaXQgZGllIEJlc2NocmFlbmt1bmcgamVkZXJ6ZWl0CisJd2llZGVyIGF1ZmhlYmVuIGthbm4sIGdlaG9lcnQgYWxzbyB0cm90emRlbSB2aWVsIERpc3ppcGxpbiBkYXp1LAorCWRpZXNlIGVpbnp1aGFsdGVuLiBEZXIgYW5mYW5ncyBlcndhZWhudGUgQmVmZWhsICdTcGllbHBhdXNlJyBpc3QKKwlhbHNvIGRldXRsaWNoIHdpcmt1bmdzdm9sbGVyLgorCitTSUVIRSBBVUNIOgorCVNwaWVscGF1c2UsIFNlbGJzdGxvZXNjaHVuZworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisxNS4xMS4yMDE1LCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvcGNtZC9zcGllbHBhdXNlIGIvZG9jL3BjbWQvc3BpZWxwYXVzZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTNmMWFhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BjbWQvc3BpZWxwYXVzZQpAQCAtMCwwICsxLDM0IEBACitLT01NQU5ETzoKKwlTcGllbHBhdXNlIDxBbnphaGw+IFRhZ1tlXQorCVNwaWVscGF1c2UgYmlzIDxEYXR1bT4KKworQVJHVU1FTlRFOgorCTxBbnphaGw+CisJICBEYXVlciBkZXIgU3BpZWxwYXVzZSBpbiBUYWdlbgorCTxEYXR1bT4KKwkgIERhdHVtLCBiaXMgenUgZGVtIGRpZSBTcGllbHBhdXNlIGdlbHRlbiBzb2xsLgorCSAgSW0gRm9ybWF0IHR0Lm1tLltqal0KKworQkVTQ0hSRUlCVU5HOgorCVdlbm4gbWFuIHVuYmVkaW5ndCBlaW5tYWwgZWluZSBNdWRwYXVzZSBlaW5sZWdlbiBtdWVzc3RlLCB3ZWlsIG1hbgorCXNpY2ggdW0gUkwtRGluZ2Ugd2llIEtsYXVzdXJlbiwgRGlwbG9tYXJiZWl0ZW4gdW5kIGFlaG5saWNoZQorCU5lYmVuc2FlY2hsaWNoa2VpdGVuIHp1IGt1ZW1tZXJuIGhhdCwgdW5kIHdlbm4gbWFuIGdlbmF1IHdlaXNzLCBkYXNzCisJbWFuIHNpY2ggYXVzIGVpZ2VuZW0gV2lsbGVuIG5pY2h0IHZvbSBFaW5sb2dnZW4gZmVybmhhbHRlbiBrYW5uLCBzbworCWthbm4gbWFuIHNpY2ggbWl0IGRpZXNlbSBCZWZlaGwgZWluZSBad2FuZ3NwYXVzZSBnZW5laG1pZ2VuLgorCURlciBUYWcsIGFuIGRlbSBtYW4gc2ljaCB6dXIgU3BpZWxwYXVzZSBlbnRzY2hsaWVzc3QsIHdpcmQgaW4gZGllCisJTGFlbmdlIGRlciBQYXVzZSBtaXQgZWluZ2VzY2hsb3NzZW4uIE1pdCBgU3BpZWxwYXVzZSAxIFRhZycga2FubiBtYW4KKwlzaWNoIGFsc28gYW0gbmFlY2hzdGVuIFRhZyB3aWVkZXIgZWlubG9nZ2VuLgorCVdlbm4gbWFuIG5pY2h0IHdlaXNzLCB3aWUgbGFuZyBkaWUgU3BpZWxwYXVzZSBzZWluIHNvbGwsIGthbm4gbWFuCisJYWxzIEFuemFobCAtMSBhbmdlYmVuLiBVbSBzaWNoIHdpZWRlciBlaW5sb2dnZW4genUga29lbm5lbiwgbXVzcyBtYW4KKwlkYW5uIGFsbGVyZGluZ3MgZWluZW0gR290dCBvZGVyIEVyem1hZ2llciBCZXNjaGVpZCBzYWdlbiAobWl0IEhpbGZlCisJZWluZXMgR2FzdGVzLiA7KQorCURpZSBTcGllbHBhdXNlIHRyaXR0IG1pdCBkZW0gbmFlY2hzdGVuIEF1c2xvZ2dlbiBpbiBLcmFmdC4gRGFiZWkgaXN0CisJZXMgZWdhbCwgb2IgbWFuIHNpY2ggbWl0ICdFbmRlJyBvZGVyICdTY2hsYWZlIGVpbicgYXVzbG9nZ3QuCisJRW50c2NoZWlkZXQgbWFuIHNpY2gsIGRvY2gga2VpbmUgUGF1c2UgYW50cmV0ZW4genUgd29sbGVuLCBzbyBrYW5uCisJbWFuIGRpZSBBa3Rpb24gbWl0ICdTcGllbHBhdXNlIDAgVGFnZScgd2llZGVyIHJ1ZWNrZ2FlbmdpZyBtYWNoZW4uCisKK1NJRUhFIEFVQ0g6CisJc3BpZWxkYXVlciwgc2VsYnN0bG9lc2NodW5nLCBsb2VzY2hza3JpcHQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogTW9uIE9rdCAxNiAyMDozMjo0NCAyMDAwIGJ5IFNpbHZhbmEKZGlmZiAtLWdpdCBhL2RvYy9wY21kL3Nwb3R0ZSBiL2RvYy9wY21kL3Nwb3R0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzBhMWNkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BjbWQvc3BvdHRlCkBAIC0wLDAgKzEsMjAgQEAKK3Nwb3R0ZQorLS0tLS0tCisKKyBLT01NQU5ETzoKKyAgICBzcG90dGUgPHRleHQ+CisgICAgc3BvdHRlIDo8ZW1vdGU+CisKKyBBUkdVTUVOVEU6CisgICAgPHRleHQ+CisgICAgICAgIFdhcyBtYW4gc28gdWViZXIgc2VpbmUgT3BmZXIgbGFlc3Rlcm4gbW9lY2h0ZS4KKworIEJFU0NIUkVJQlVORzoKKyAgICBNaXQgZGVtIEtvbW1hbmRvICJzcG90dGUiIGthbm4gbWFuIGF1ZiBkZW0gTW9lcmRlci1LYW5hbCBzZWluZSBHZWZ1ZWhsZQorICAgIHp1bSBnZXJhZGUgZXJsZWd0ZW4gTW9uc3RlciBhdXNkcnVlY2tlbi4gRGFzIGtsYXBwdCBuYXR1ZXJsaWNoIG51ciBiZWkKKyAgICBzZWxic3QgZXJsZWd0ZW4gTW9uc3Rlcm4gdW5kIGF1Y2ggbnVyIGFscyBkaXJla3RlIEFudHdvcnQgYXVmIGRpZSBsZXR6dGVuCisgICAgV29ydGUgZGVzIE5QQ3MuCisKKyBTSUVIRSBBVUNIOgorICAgIGViZW5lbiwgdG9ldGUKKwpkaWZmIC0tZ2l0IGEvZG9jL3BjbWQvc3BydWNoZXJtdWVkdW5nIGIvZG9jL3BjbWQvc3BydWNoZXJtdWVkdW5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNGRlZjMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcGNtZC9zcHJ1Y2hlcm11ZWR1bmcKQEAgLTAsMCArMSw0NCBAQAorCitzcHJ1Y2hlcm11ZWR1bmcKKy0tLS0tLS0tCisKK0tPTU1BTkRPOgorICAgIHNwcnVjaGVybXVlZHVuZyA8YWx0IHwgbmV1IHwgbm9ybWFsPgorCitBUkdVTUVOVDoKKyAgICBhbHQ6ICAgIHNjaGFsdGV0IGRpZSB1bmdlbmF1ZXJlIGFsdGUgU3BydWNoZXJtdWVkdW5nIGVpbgorCisgICAgbmV1OgorICAgIG5vcm1hbDogc2NoYWx0ZXQgZGllIG5ldWUgKG5vcm1hbGUpIFNwcnVjaGVybXVlZHVuZyBlaW4KKworQkVTQ0hSRUlCVU5HOgorICAgIFphdWJlcnNwcnVlY2hlIChpbSB3ZWl0ZXN0ZW4gU2lubmUsIGFsc28gYXVjaCB6LkIuIHd1bmRlciBiZWkgS2xlcmlrZXJuCisgICAgdW5kIFNvbmRlcmFuZ3JpZmZlIGJlaSBLYWVtcGZlcm4gZXJ6d2luZ2VuIGluIGRlciBSZWdlbCBlaW5lIGt1cnplCisgICAgKEVybXVlZHVuZ3MtKVBhdXNlLCBiaXMgbWFuIGRlbiBuYWVjaHN0ZW4gU3BydWNoIHNwcmVjaGVuIGthbm4uCisgICAgRGllc2UgUGF1c2VuIHdhcmVuIGF1Y2ggdGVjaG5pc2NoZW4gR3J1ZW5kZW4gZnJ1ZWhlciBpbW1lciBWaWVsZmFjaGUgdm9uCisgICAgMnMgdW5kIGt1ZXJ6ZXJlIFBhdXNlbiBnYWIgZXMgbmljaHQuIEF1c3NlcmRlbSBiZWdhbm5lbiBkaWVzZSBQYXVzZW4gaW1tZXIKKyAgICB6dW0gQmVnaW5uIGVpbmVyIEthbXBmcnVuZGUuCisgICAgU2VpdCBlaW5pZ2VyIFplaXQgc2luZCBkaWVzZSBQYXVzZW4gZ3J1bmRzYWV0emxpY2ggc2VrdW5kZW5nZW5hdS4gRWluaWdlCisgICAgU3BpZWxlciBmaW5kZW4gZGllcyBqZWRvY2ggenUgdW5nZXdvaG50LiBEaWVzZSBrb2VubmVuIG1pdCBkaWVzZW0gQmVmZWhsCisgICAgZWluZW4gYWx0ZXJuYXRpdmVuIE1vZHVzIGZ1ZXIgZGllIFNwcnVjaGVybXVlZHVuZyBlaW5zY2hhbHRlbiwgd2VsY2hlciBkYXMKKyAgICBhbHRlIFZlcmhhbHRlbiB3ZWl0Z2VoZW5kIHdpZWRlcmhlcnN0ZWxsdC4KKworICAgIEFiZXI6IGJlbnV0enQgbWFuIGRpZSBhbHRlIFNwcnVjaGVybXVlZHVuZywgd2VyZGVuIGFsbGUgRXJtdWVkdW5nc3BhdXNlbgorICAgICAgICAgIGF1ZiBWaWVsZmFjaGUgdm9uIDJzIGF1ZmdlcnVuZGV0LCBkLmguIHNpZSB3ZXJkZW4gZ2dmLiBsYWVuZ2VyLiBEaWVzCisgICAgICAgICAgZ2lsdCBhdWNoIGZ1ZXIgZXR3YWlnZSBNYWxpICh6LkIuIHdpcmQgYXVzIGVpbmVtIE1hbHVzIHZvbiAxcyB1LlUuCisgICAgICAgICAgZWluIE1hbHVzIHZvbiAycykgdW5kIGV0d2FpZ2UgQm9uaSBzaW5kIG9mdCB1bndpcmtzYW0sIHdlaWwgc2llIGF1ZgorICAgICAgICAgIFZpZWxmYWNoZSB2b24gMnMgYWJnZXJ1bmRldCB3ZXJkZW4gKHouQi4gLTFzIGF1ZiAwKS4KKyAgICAgICAgICBBdXNzZXJkZW0gc2luZCBTcHJ1ZWNoZSBhdWYgR3J1bmRsYWdlIGRlciBzZWt1bmRlbmdlbmF1ZW4KKyAgICAgICAgICBFcm11ZWR1bmdzcGF1c2VuIGJlcmVjaG5ldC9iYWxhbmNpZXJ0LgorCitCRU1FUktVTkdFTjoKKyAgICBLYW5uIG5pY2h0IGltIEthbXBmIG9kZXIgdm9yIEFibGF1ZiB2b24gM21pbiBuYWNoIGVpbmVtIEthbXBmIGdlYWVuZGVydAorICAgIHdlcmRlbi4KKworQkVJU1BJRUxFOgorICAgIHNwcnVjaGVybXVlZHVuZyBhbHQgLT4gRXJtdWVkdW5nc3BhdXNlbiB3ZXJkZW4gMnMgYXVmZ2VydW5kZXQKKyAgICBzcHJ1Y2hlcm11ZWR1bmcgbmV1IC0+IHNla3VuZGVuZ2VuYXVlIEVybXVlZHVuZ3NwYXVzZW4KKworTEVUWlRFIEFlTkRFUlVORzoKKzIwMTAtMDMtMDIsIFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL3BjbWQvc3RlY2tlIGIvZG9jL3BjbWQvc3RlY2tlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyYTBjYTEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcGNtZC9zdGVja2UKQEAgLTAsMCArMSwzMSBAQAorCitzdGVja2UKKy0tLS0tLQorCisgS09NTUFORE86CisgICAgc3RlY2tlIDxvYmpla3Q+IGluIDxiZWhhZWx0ZXI+CisgICAgc3RlY2tlIDx3YWZmZT4gd2VnL3p1cnVlY2sKKworIEFSR1VNRU5URToKKworICAgICA8b2JqZWt0PgorICAgICAgICBFaW4gYmVsaWViaWdlcyBPYmpla3QgaW4gRGVpbmVyIFJlaWNod2VpdGUKKyAgICAgPGJlaGFlbHRlcj4KKyAgICAgICAgRWluIEJlaGFlbHRlcgorICAgICA8d2FmZmU+CisgICAgICAgIERpZSBXYWZmZSwgZGllIER1IGdlenVlY2t0IGhhc3QKKworIEJFU0NIUkVJQlVORzoKKyAgICBgc3RlY2tlIChpbiknIGlzdCBkYXMgYWxsZ2VtZWluZSBLb21tYW5kbywgdW0gR2VnZW5zdGFlbmRlIGluIGVpbmVtCisgICAgQmVoYWVsdGVyIHp1IGRlcG9uaWVyZW4uIEJlaGFlbHRlciBrb2VubmVuIG5pY2h0IGFsbGVzIGF1Zm5laG1lbiwgYWJlcgorICAgIG1laXN0IGlzdCBlcyBsZWljaHRlciwgc2Nod2VyZSBHZWdlbnN0YWVuZGUgaW4gZWluZW0gQmVoYWVsdGVyIHp1CisgICAgdHJhbnNwb3J0aWVyZW4uCisKKyAgICBgc3RlY2tlICh3ZWcpJyBpc3QgZGFzIGFsbGdlbWVpbmUgS29tbWFuZG8sIHVtIHp1bSBLYW1wZiBnZXp1ZWNrdGUgV2FmZmVuCisgICAgd2llZGVyIGFienVsZWdlbi4KKworIFNJRUhFIEFVQ0g6CisgICAgbmltbSwgenVlY2tlCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFRodSwgMjQuMDcuMTk5NywgMDk6MDA6MDAgdm9uIFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL3BjbWQvc3RvcCBiL2RvYy9wY21kL3N0b3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODliNjhjZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wY21kL3N0b3AKQEAgLTAsMCArMSwyMiBAQAorCitzdG9wCistLS0tCisKKyBLT01NQU5ETzoKKyAgICBzdG9wIFs8Z2VnbmVyPl0KKworIEFSR1VNRU5URToKKworICAgICA8Z2VnbmVyPiAob3B0aW9uYWwpCisgICAgICAgIEVpbmVyIERlaW5lciBHZWduZXIKKworIEJFU0NIUkVJQlVORzoKKyAgICBEdSBob2Vyc3QgYXVmLCBEZWluZSBHZWduZXIgKG9kZXIgbnVyIGRlbiBHZWduZXIgPGdlZ25lcj4pIHp1IHZlcmZvbGdlbi4KKyAgICBBbGxlcmRpbmdzIGthbm4gbWFuIG5pY2h0IGF1ZmhvZXJlbiwgdmVyZm9sZ3QgenUgd2VyZGVuLgorCisgU0lFSEUgQVVDSDoKKyAgICAgVmVyd2FuZHQ6IHRvZXRlCisgICAgIEFuZGVyZXM6ICBrYWVtcGZlbiwgaGVpbHVuZywgbGViZW4sIHRvZCAKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgVGh1LCAyNC4wNy4xOTk3LCAwOTowMDowMCB2b24gV2FyZ29uCmRpZmYgLS1naXQgYS9kb2MvcGNtZC9zdHR5IGIvZG9jL3BjbWQvc3R0eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDVkMGM0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BjbWQvc3R0eQpAQCAtMCwwICsxLDQ0IEBACisKK3N0dHkKKy0tLS0KKworIEtPTU1BTkRPOgorICAgIHN0dHkgWzx0eXA+XQorICAgIHN0dHkgcmVzZXQKKworIEFSR1VNRU5URToKKworICAgICA8dHlwPgorICAgICAgICBUZXJtaW5hbHR5cDogYGR1bWInLCBgdnQxMDAnIG9kZXIgYGFuc2knCisKKyBCRVNDSFJFSUJVTkc6CisgICAgTWl0IGRpZXNlbSBLb21tYW5kbyBrYW5uc3QgRHUgZWluc3RlbGxlbiwgYW4gd2FzIGZ1ZXIgZWluZW0gVGVybWluYWwgRHUKKyAgICBzaXR6dC4gRm9sZ2VuZGUgVHlwZW4gd2VyZGVuIG1vbWVudGFuIHVudGVyc3R1ZXR6dDoKKworICAgICBgYW5zaScgICAgZGFzIFRlcm1pbmFsIHZlcnN0ZWh0IEZhcmJjb2RlcyB1bmQgSGVydm9yaGVidW5nZW4gd2llCisgICAgICAgICAgICAgICBGZXR0c2NocmlmdAorICAgICBgdnQxMDAnICAgZGFzIFRlcm1pbmFsIGlzdCBlaW5mYXJiaWcsIGtlbm50IGFiZXIgRmV0dHNjaHJpZnQgdS5hZS4KKyAgICAgYGR1bWInICAgIGRhcyBUZXJtaW5hbCB2ZXJzdGVodCBrZWluZSBIZXJ2b3JoZWJ1bmdlbgorCisgICAgRGVyIFRlcm1pbmFsdHlwIHdpcmQgdS5hLiBiZWkgS29tbWFuZG9zIHdpZSAid2VyIiBiZW51dHp0IHVtIGJlc3RpbW10ZQorICAgIFdvZXJ0ZXIgb2RlciBQaHJhc2VuIGhlcnZvcnp1aGViZW4uCisKKyAgICBOYWNoIGRlbSBFaW5zdGVsbGVuIGRlcyBUZXJtaW5hbHR5cCBzb2xsdGUgYmVpIGB2dDEwMCcgdW5kIGBhbnNpJyBlaW5lCisgICAgQXVzZ2FiZSBlcmZvbGdlbiwgd2VsY2hlIGRpZSBtb2VnbGljaGVuIFRleHRhdHRyaWJ1dGUgb2RlciBGYXJiZW4KKyAgICBkYXJzdGVsbHQuIEJlaSBBTlNJIHdpcmQgZGFzIEdhbnplIHZvbiBlaW5lbSBsZXNiYXJlbiBUZXh0IGdlZm9sZ3QuIFNvbGx0ZQorICAgIGFsc28gZGVyIGZvbGdlbmRlIFNhdHoKKworICAgIFNvbGx0ZSBkaWVzZXIgVGV4dCBoaWVyIG5pY2h0IHJpY2h0aWcgbGVzYmFyIHNlaW4sIGJlbnV0emUKKyAgICBkYXMgS29tbWFuZG8gc3R0eSByZXNldCEKKworICAgIG5pY2h0IGVyc2NoZWluZW4gb2RlciBudXIgc2Nod2VyIGxlc2JhciBzZWluLCBzb2xsdGUgbWFuIG1pdCBzdHR5IHJlc2V0CisgICAgZGllIEZhcmJlbiB3aWVkZXJoZXJzdGVsbGVuIG9kZXIgZWluIGFuZGVyZXMgVGVybWluYWwgZWluc3RlbGxlbi4KKworIEFDSFRVTkc6CisgICAgTWFuY2hlIFRlcm1pbmFscyBzaW5kIHUuVS4gbmljaHQgZ2FueiBBTlNJIGtvbXBhdGliZWwsIHdhcyBkYXp1IGZ1ZWhydCwKKyAgICBkYXNzIGRpZSBGYXJiZSBuaWNodCBhdXNnZXNjaGFsdGV0IHdpcmQuIFNvbGx0ZSBzb2V0d2FzIHBhc3NpZXJlbiBiaXR0ZQorICAgIGRhcyBLb21tYW5kbyBzdHR5IHJlc2V0IGJlbnV0emVuLCB3ZWxjaGVzIGVpbmVuIHdlaXNzZW4gSGludGVyZ3J1bmQgdW5kCisgICAgc2Nod2FyemVuIFZvcmRlcmdydW5kIGVpbnN0ZWxsdC4KKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgVGh1LCAyNC4wNy4xOTk3LCAwOTowMDowMCB2b24gV2FyZ29uCmRpZmYgLS1naXQgYS9kb2MvcGNtZC9zdWNoZSBiL2RvYy9wY21kL3N1Y2hlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MzZjNDQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcGNtZC9zdWNoZQpAQCAtMCwwICsxLDQzIEBACisKK3N1Y2hlCistLS0tLS0tLS0tCisKKyBLT01NQU5ETzoKKyAgICBzdWNoZSA8d2FzPgorICAgIHN1Y2ggIDx3YXM+CisgICAgZHVyY2hzdWNoZSA8d2FzPgorCisgQVJHVU1FTlRFOgorCisgICAgIDx3YXM+CisgICAgICAgIEVpbiBHZWdlbnN0YW5kIG9kZXIgRGV0YWlsCisKKyBCRVNDSFJFSUJVTkc6CisgICAgTmljaHQgYWxsZSBHZWhlaW1uaXNzZSBkaWVzZXIgV2VsdCBvZmZlbmJhcmVuIHNpY2ggYXVmIGRlbiBlcnN0ZW4gQmxpY2suCisgICAgQmVpIGVpbmlnZW4gbXVzcyBtZWluIGVpbiB6d2VpdGVzIG1hbCBoaW5zY2hhdWVuLiBNYW5jaGUgRGluZ2UgdmVyYmVyZ2VuIAorICAgIHNpY2ggYWJlciBhdWNoIGRpZXNlbSBnZW5hdWVyZW4gQmxpY2suIEdlbmF1IERhbm4gaXN0IGRpZXNlciBCZWZlaGwgCisgICAgc2lubnZvbGwuCisKKyAgICBTaWNoZXIgYmlzdCBEdSBzY2hvbm1hbCBhdWYgZWluZW0gV2VnIG9kZXIgaW4gZWluZW0gV2FsZCB1ZWJlciBlaW5lbiAKKyAgICBMYXViaGF1ZmVuIGdlc3RvbHBlcnQgdW5kIGhhc3QgRGljaCBnZWZyYWd0LCB3ZWxjaGUgU2NoYWV0emUgZXIgd29obCAKKyAgICBiaXJndC4gRWluIGdlemllbHRlcyAnc3VjaGUgbGF1Yicgb2RlciAnZHVyY2hzdWNoZSBsYXViJyBicmluZ3QgZGEgc28KKyAgICBtYW5jaCBudWV0emxpY2hlcyB6dW0gVm9yc2NoZWluLgorCisgQUNIVFVORzoKKyAgICBMZWlkZXIgaXN0IGRhcyBWZXJoYWx0ZW4gdm9uICdzdWNoJywgJ3N1Y2hlJyB1bmQgJ3VudGVyc3VjaGUnIGpld2VpcyAKKyAgICBhYmhhZW5naWcgdm9uIGRlciBLcmVhdGl2aXRhZXQgZGVzIHByb2dyYW1taWVyZW5kZW4gTWFnaWVycy4gQXVjaCB3ZW5uIAorICAgIGRpZSBkcmVpIEJlZmVobGUgYWVobmxpY2gga2xpbmdlbiwgaGVpc3N0IGRhcyBuaWNodCwgZGFzcyBzaWUgYXVjaCBkYXMgCisgICAgZ2xlaWNoZSBtYWNoZW4uIAorCisgICAgTWFuY2htYWwgZmluZGV0IG1hbiBldHdhcywgd2VubiBtYW4gJ2R1cmNoc3VjaGUgbGF1YicgbWFjaHQsIHdhZWhyZW5kIAorICAgICdzdWNoZSBsYXViJyBudXIgZWluIGxhaG1lcyAnRHUgc3VjaHN0LCBmaW5kZXN0IGFiZXIgbmljaHRzLicgenVtIAorICAgIFZvcnNjaGVpbiBicmluZ3QuCisKKyAgICBPZnQgZmluZGV0IG1hbiBhYmVyIGluIGRlciBSYXVtYmVzY2hyZWlidW5nIEhpbndlaXNlLCB3ZWxjaGVyIEJlZ3JpZmYgCisgICAgaGllciBwYXNzZW5kIGlzdC4KKworIFNJRUhFIEFVQ0g6CisgICAgcmllY2hlLCBsYXVzY2hlLCBzY2hhdSwgdW50ZXJzdWNoZQorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBNb24sIDAxLjA4LjIwMDIsIDE0OjAwOjAwIHZvbiBWYW5pb24KZGlmZiAtLWdpdCBhL2RvYy9wY21kL3N5bnRheHNhbW1sdW5nIGIvZG9jL3BjbWQvc3ludGF4c2FtbWx1bmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ1YmQ5NwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wY21kL3N5bnRheHNhbW1sdW5nCkBAIC0wLDAgKzEsNDUgQEAKKworc3ludGF4c2FtbWx1bmcKKy0tLS0tLS0tLS0tLS0KKworIEtPTU1BTkRPOgorICAgIHN5bnRheHNhbW1sdW5nIFtqYSB8IG5laW5dCisKKyBBUkdVTUVOVEU6CisgICAgbmljaHRzLCBqYSBvZGVyIG5laW4KKworIEJFU0NIUkVJQlVORzoKKyAgICBVbSBCZWZlaGxlIGltIE1HIGZsZXhpYmxlciB6dSBtYWNoZW4gdW5kIFNwaWVsZXIgdW5kIE1hZ2llciB6dSBlbnRsYXN0ZW4sCisgICAgaW5kZW0gZGFzIFNwaWVsIGJlc3NlciBkaWUgQWJzaWNodCBkZXMgU3BpZWxlcnMgYmVpIGVpbmVtIEJlZmVobCBlcmtlbm50LAorICAgIHNhbW1lbG4gd2lyIChhbm9ueW1lKSBTdGF0aXN0aWtlbiB1ZWJlciBCZWZlaGxlLCB3ZWxjaGUgdm9uIFNwaWVsZXJuCisgICAgYmVudXR6dCB3ZXJkZW4sIHNvZmVybiBTcGllbGVyIGRhbWl0IGVpbnZlcnN0YW5kZW4gc2luZC4KKyAgICBNaXQgZGllc2VtIEJlZmVobCBrYW5uc3QgRHUgYWxzbyBtaXRoZWxmZW4sIFN5bnRheGVuIGltIE1HIHp1IHZlcmJlc3Nlcm4uCisKKyAgICBXZW5uIER1IGVpbnZlcnN0YW5kZW4gYmlzdCwgc3BlaWNoZXJuIHdpciBhbm9ueW0gKGQuaC4gb2huZSBEZWluZW4KKyAgICBDaGFybmFtZW4pLCB3ZWxjaGUgRGVpbmVyIEJlZmVobGUgZXJmb2xncmVpY2ggdW5kIG5pY2h0IGVyZm9sZ3JlaWNoIHdhcmVuLgorICAgIFVlYmxpY2hlIEtvbW11bmlrYXRpb25zYmVmZWhsZSAoei5CLiBzYWdlLCB0ZWlsZS1taXQsIHJmbHVlc3RlciwgZWJlbmVuLAorICAgIHRlYW1ydWZlLCBtcnVmZSwgcnVmZSkgd2VyZGVuIGRhYmVpIG5pY2h0IGdlc3BlaWNoZXJ0LgorICAgIAorICAgIE1pdCAnc3ludGF4c2FtbWx1bmcgamEnIGthbm5zdCBEdSBkaWUgU3BlaWNoZXJ1bmcgZWluc2NoYWx0ZW4sIG1pdAorICAgICdzeW50YXhzYW1tbHVuZyBuZWluJyBrYW5uc3QgRHUgc2llIGF1c3NjaGFsdGVuLgorCisgICAgRGllIGdlc2FtbWVsdGVuIERhdGVuIGtvZW5uZW4gbnVyIHZvbiBFcnptYWdpZXJuIG9kZXIgR29ldHRlcm4gZWluZ2VzZWhlbgorICAgIHdlcmRlbi4gQWxsZXJkaW5ncyBrYW5uIGVzIHNlaW4sIGRhc3MgZGllc2UgYW5kZXJlbiBNYWdpZXJuIEJlaXNwaWVsZSBhdXMKKyAgICBkZXIgU2FtbWx1bmcgemVpZ2VuLCBzb2Zlcm4gZGFzIEJlaXNwaWVsIGtlaW5lbiBSdWVja3NjaGx1c3MgYXVmIGVpbmVuCisgICAgU3BpZWxlciB6dWxhZXNzdC4KKworICAgIFVlYnJpZ2VucyBzaW5kIHZvciBhbGxlbSBLb21tYW5kb3MgYmVpbSBGb3JzY2hlbiBpbnRlcmVzc2FudCwgd2VuaWdlcgorICAgIGJlaW0gTWV0emVsbiwgSWRlbG4sIENoYXR0ZW4gZXRjLiAoS29tbXVuaWthdGlvbiBzLm8uKQorICAgIERhaGVyIHdlcmRlbiB6dXIgWmVpdCBudXIgQmVmZWhsZSBlcmZhc3N0LCB3ZWxjaGUgbWVociBhbHMgMiBXb2VydGVyCisgICAgZW50aGFsdGVuLgorCisgICAgRWluIEJlaXNwaWVsLCB3YXMgZ2VzcGVpY2hlcnQgd2lyZDoKKyAgICBCZWZlaGwgICAgICAgICAgICAgICAgICAgfEdlZ2VuZHxFcmZvbGd8QW56YWhsfEZQCisgICAgdW50IGplZGVuIHp3ZWl0ZW4gdm9yaGFuZ3xlYmVuZSB8MCAgICAgfDEgICAgIHwwCisKKyAgICBFcmZvbGcgaXN0IGFsbGVzLCB3YXMga2VpbiBOb3RpZnlmYWlsIGF1c2xvZXN0LCBBbnphaGwsIHdpZSBvZnQgZGllc2UgU3ludGF4CisgICAgc2Nob25tYWwgYmVudXR6dCB3dXJkZSB1bmQgRlAsIG9iIGRpZXNlIFN5bnRheCAoaXJnZW5kd28pIGVpbmVuIEZQIGdlZ2ViZW4KKyAgICBoYXQuCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIDE4LjA2LjIwMTYsIFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9wY21kL3Rhc3RlIGIvZG9jL3BjbWQvdGFzdGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQxNzNmOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wY21kL3Rhc3RlCkBAIC0wLDAgKzEsNDcgQEAKKwordGFzdGUgKGFiKQorYmVydWVocmUKKy0tLS0tLS0tLS0tLS0tCisKK0tPTU1BTkRPCisgICAgdGFzdGUKKyAgICB0YXN0ZSA8d2FzPiBbYW4gPG9iamVrdD4gfCBhbSA8b2JqZWt0Pl0gW2luIG1pciB8IGltIHJhdW1dIFthYl0KKyAgICBiZXJ1ZWhyZSA8d2FzPiBbYW4gPG9iamVrdD4gfCBhbSA8b2JqZWt0Pl0gW2luIG1pciB8IGltIHJhdW1dCisKK0FSR1VNRU5URQorICAgIDxvYmpla3Q+CisgICAgICBFaW4gR2VnZW5zdGFuZCBiencuIExlYmV3ZXNlbiwgZGFzIG1hbiBhYnRhc3RlbiB3aWxsLgorCitCRVNDSFJFSUJVTkcKKyAgICAidGFzdGUiIGlzdCBkYXMgYWxsZ2VtZWluZSBLb21tYW5kbywgdW0gKGFiKXRhc3RiYXJlIERldGFpbHMgYW4KKyAgICBHZWdlbnN0YWVuZGVuLCBMZWJld2VzZW4gb2RlciBpbiBSYWV1bWVuIHdhaHJ6dW5laG1lbi4gSGllcmJlaQorICAgIGxhZXNzdCAidGFzdGUiIG9obmUgQXJndW1lbnRlIGRlbiBTcGllbGVyIHVuZ2V6aWVsdCBpbSBSYXVtIHJ1bXRhc3RlbiwgaW4KKyAgICBkZW0gZXIgc2ljaCBkZXJ6ZWl0IGJlZmluZGV0cy4gT2IgbWFuIGhpZXJiZWkgdWViZXJoYXVwdCBpcmdlbmR3YXMKKyAgICB3YWhybmltbXQsIGhhZW5ndCB2b20gTWFnaWVyIGRlcyBSYXVtZXMgYWIuCisgICAgQW4gYWxsZW4gYW5kZXJlbiBHZWdlbnN0YWVuZGVuIGJ6dy4gTGViZXdlc2VuIGltIHNlbGJlbiBSYXVtIG9kZXIgaW0KKyAgICBlaWdlbmVuIEludmVudGFyIGthbm4gbWFuIG1pdCAidGFzdGUgKGFuKSIgZWJlbmZhbGxzIHRhc3Rlbi4gTmljaHQgaW1tZXIKKyAgICBrYW5uIG1hbiBqZWRvY2ggZXR3YXMgKGVyKXRhc3Rlbi4KKworICAgIERhIGJlaSBPYmpla3RlbiBtaXQgZ2xlaWNoZW4gdGFzdGJhcmVuL2Z1ZWhsYmFyZW4gRGV0YWlscyB6dWVyc3QgYW4gaW0KKyAgICBSYXVtIGxpZWdlbmRlIE9iamVrdGUgYWJnZXRhc3RldCB3ZXJkZW4sIGthbm4gbWFuIGFuIFNhY2hlbiwgZGllIG1hbiBiZWkKKyAgICBzaWNoIHRyYWVndCwgYXVmIGFsbGUgRmFlbGxlIG1pdCBkZW0gWnVzYXR6ICJpbiBtaXIiIGFidGFzdGVuLgorCisgICAgRXJ0YXN0YmFyZSBEZXRhaWxzIHd1cmRlbiBpbSBNb3JnZW5ncmF1ZW4gZXJzdCAyMDEwIHN0YW5kYXJkaXNpZXJ0LgorICAgIEVyd2FydGV0IG5pY2h0LCBkYXNzIGVzIGluIGFsbGVuIFJhZXVtZW4gLyBhbiBhbGxlbiBHZWdlbnN0YWVuZGVuIHRhc3RiYXJlCisgICAgRGV0YWlscyBnaWJ0IC0gc2llIHNpbmQgZWhlciBzZWx0ZW4uCisKK0JFSVNQSUVMRQorICAgIHRhc3RlIGJvZGVuIGFiCisgICAgdGFzdGUgYm9kZW4gKGlkZW50aXNjaCB6dSAidGFzdGUgYm9kZW4gYWIiKQorCisgICAgdGFzdGUgcnVja3NhY2sgaW4gbWlyIGFiCisgICAgdGFzdGUgYmF1bXN0dW1wZiBpbSByYXVtIGFiCisgICAgdGFzdGUgc2NobmFsbGUgYW4gcnVja3NhY2sgaW4gbWlyIGFiCisKK1NJRUhFIEFVQ0g6CisgICAgYmV6dWdzcHVua3QKKyAgICBzY2hhdSwgcmllY2hlLCBsYXVzY2hlLCBsaWVzCisKK0xFVFpURSBBRU5ERVJVTkdFTjoKKyAgICAxMy4wMy4yMDE2LCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9wY21kL3RlaWxlIGIvZG9jL3BjbWQvdGVpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVhMGMzNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wY21kL3RlaWxlCkBAIC0wLDAgKzEsNTcgQEAKKwordGVpbGUgKG1pdCkKKy0tLS0tLS0tLS0tCisKKyBLT01NQU5ETzoKKyAgICB0ZWlsZSA8d2VtPiBtaXQgPHRleHQ+CisgICAgdGVpbGUgLls8bnI+XSBtaXQgPHRleHQ+CisgICAgdGVpbGUgPHdlbT5APG11ZD4gbWl0IDx0ZXh0PgorICAgIChBYmt1ZXJ6dW5nOiB0bSA8d2VtPiA8dGV4dD4pCisgICAgCisgICAgZXJ6YWVobGUgPHdlbT4gPHRleHQ+CisgICAgZXJ6YWVobGUgLls8bnI+XSA8dGV4dD4KKyAgICBlcnphZWhsZSA8d2VtPkA8bXVkPiA8dGV4dD4KKworIEFSR1VNRU5URToKKworICAgICA8d2VtPgorICAgICAgICBOYW1lIGRlcyBTcGllbGVycywgZGVtIER1IGV0d2FzIGVyemFlaGxlbiB3aWxsc3QKKyAgICAgPG5yPgorICAgICAgICBFaW5lIE51bW1lciBpbiBkZXIgTWl0dGVpbHVuZ3NnZXNjaGljaHRlCisgICAgIDxtdWQ+CisgICAgICAgIE5hbWUgZWluZXMgTVVEcyBhdXMgZGVyIGBtdWRzJy1MaXN0ZQorICAgICA8dGV4dD4KKyAgICAgICAgRGllIE1pdHRlaWx1bmcgc2VsYnN0CisKKyBCRVNDSFJFSUJVTkc6CisgICAgU2VuZGV0IGRlbSBhbmdlZ2ViZW5lbiBTcGllbGVyIGVpbmUgTmFjaHJpY2h0LiBFcyBzcGllbHQga2VpbmUgUm9sbGUsIHdvCisgICAgZXIgc2ljaCBpbSBTcGllbCBiZWZpbmRldC4gTWl0dGVpbGVuIHZlcmJyYXVjaHQgKmtlaW5lKiBNYWdpZXB1bmt0ZS4KKworICAgIE1pdCBgdGVpbGUgPHdlbT5APG11ZD4gbWl0IDx0ZXh0Picga2FubiBtYW4gYXVjaCBTcGllbGVybiBpbiBhbmRlcmVuIE1VRHMKKyAgICBldHdhcyBtaXR0ZWlsZW4uIDxtdWQ+IG11c3MgbmljaHQgZGVyIGtvbXBsZXR0ZSBNdWRuYW1lIHNlaW47IGVzIGdlbnVlZ3QKKyAgICBhdWNoIGVpbmUgZWluZGV1dGlnZSBBYmt1ZXJ6dW5nLgorCisgICAgRGFzIEtvbW1hbmRvIG1lcmt0IHNpY2gsIHdlbSBEdSBhbGxlcyBldHdhcyBtaXR0ZWlsc3QuIE1pdCBgdG1oaXN0JyBrYW5uc3QKKyAgICBEdSBEaXIgYW5zZWhlbiwgd2VtIER1IHNjaG9uIGFsbGVzIGV0d2FzIG1pdGdldGVpbHQgaGFzdC4gRnVlciB3ZWl0ZXJlCisgICAgTWl0dGVpbHVuZ2VuIGthbm5zdCBEdSBhbnN0ZWxsZSBkZXMgTmFtZW5zIGF1Y2ggZGllIE51bW1lciBhbmdlYmVuLCAqYWJlcgorICAgIEFjaHR1bmchKiBEaWUgTGlzdGUgd2lyZCBkYW5hY2ggd2llZGVyIG5ldSBzb3J0aWVydCEKKworICAgIEJlYXJiZWl0ZXQgZGVyIFNwaWVsZXIgZWluZW4gVGV4dCBvZGVyIGxpZXN0IGVyIGlyZ2VuZGV0d2FzLCBzbyB3ZXJkZW4KKyAgICBNaXR0ZWlsdW5nZW4gdS5VLiBnZXNwZWljaGVydCAoZGllcyB3aXJkIG1pdGdldGVpbHQpLiBEaWUgZ2VzcGVpY2hlcnRlbgorICAgIE1pdHRlaWx1bmdlbiBlcmZhZWhydCBkZXIgYW5kZXJlIFNwaWVsZXIsIHdlbm4gZXIgbWl0IGRlbSBMZXNlbiBvZGVyCisgICAgQmVhcmJlaXRlbiBmZXJ0aWcgaXN0LgorCisgICAgU29mZXJuIER1IERlaW5lIFRlaWxlLW1pdC1IaXN0b3J5IChzLiB0bWhpc3QpIGVpbmdlc2NoYWx0ZXQgaGFzdCwgd2VyZGVuCisgICAgYXVzLSB1bmQgZWluZ2VoZW5kZSBUTXMgZ2VzcGVpY2hlcnQuIEhhdCBEZWluIEdlc3ByYWVjaHNwYXJ0bmVyIHNlaW5lCisgICAgSGlzdG9yeSBlaW5nZXNjaGFsdGV0LCB3aXJkIGVpbiBUTSwgd2FzIER1IGlobSBzY2hpY2tzdCwgYmVpIGlobQorICAgIGdlc3BlaWNoZXJ0LiBNb2VjaHRlc3QgRHUgZGllcyBuaWNodCwga2FubnN0IER1IGRlbiBCZWZlaGwgJ3JmbHVlc3RlcicKKyAgICB2ZXJ3ZW5kZW4sIGJlaSB3ZWxjaGVtIGluIGtlaW5lbSBGYWxsIGRlciBJbmhhbHQgZWluZXMgR2VzcHJhZWNocworICAgIGdlc3BlaWNoZXJ0IHdpcmQuCisKKyBTSUVIRSBBVUNIOgorICAgIGVyd2lkZXJlLCBzYWdlLCBmcmFnZSwgYW50d29ydGUsIGZsdWVzdGVyZSwgZ2VzcHJhZWNoLCBydWZlLCBlYmVuZW4sIHdlZywKKyAgICBpZ25vcmllcmUsIGtvYm9sZCwgbXVkcywgc2VuZGVyd2llZGVyaG9sdW5nLCBrbGluZ2VsdG9uLCB0bWhpc3QsCisgICAgcmZsdWVzdGVyZQorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICAwOS4wOC4yMDA4LCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvcGNtZC90ZWxuZWdzIGIvZG9jL3BjbWQvdGVsbmVncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGZjYzU3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BjbWQvdGVsbmVncwpAQCAtMCwwICsxLDIyIEBACitLT01NQU5ETzoKKyAgICAgICAgdGVsbmVncyBbZWluc3RlbGx1bmddCisKK0FSR1VNRU5URToKKyAgICAgICAgZWluc3RlbGx1bmcKKyAgICAgICAgICAqIGVpbiAtIFNjaGFsdGV0IGRpZSBBbnplaWdlIGVpbgorICAgICAgICAgICogYXVzIC0gU2NoYWx0ZXQgZGllIEFuemVpZ2UgYXVzCisKKyAgICAgICAgICBXaXJkIGtlaW4gQXJndW1lbnQgYW5nZWdlYmVuLCB3aXJkIGRpZSBha3R1ZWxsZSBFaW5zdGVsbHVuZworICAgICAgICAgIGFuZ2V6ZWlndC4KKyAgICAKK0JFU0NIUkVJQlVORzoKKyAgICAgICAgICBNYW4ga2FubiBmZXN0bGVnZW4sIG9iIG1hbiBBZW5kZXJ1bmdlbiBkZXIgRmVuc3Rlcmdyb2Vzc2UKKyAgICAgICAgICBhbmdlemVpZ3QgYmVrb21tZW4gd2lsbCBvZGVyIG5pY2h0LiBEaWVzIHNldHp0IHZvcmF1cywgZGFzcworICAgICAgICAgIG1hbiBlaW4gVGVsbmV0IGJlbnV0enQsIGRhcyBUZWxuZXRuZWdvdGlhdGlvbnMgdW50ZXJzdHVldHp0LgorCisKK1NJRUhFIEFVQ0g6CisgICAgICAgIHplaWxlbiwgdGVsbmV0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBTdW4gTm92ICA3IDIzOjAwOjAwIDE5OTkgYnkgVGlhbWFrCisKZGlmZiAtLWdpdCBhL2RvYy9wY21kL3RlbG5ldCBiL2RvYy9wY21kL3RlbG5ldApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTExYTJhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BjbWQvdGVsbmV0CkBAIC0wLDAgKzEsMzQgQEAKKwordGVsbmV0CistLS0tLS0KKworIEtPTU1BTkRPOgorICAgIHRlbG5ldCA8a29tbWFuZG8+IDxhcmd1bWVudGU+CisKKyBBUkdVTUVOVEU6CisKKyAgICAgPGtvbW1hbmRvPgorICAgICAgICBFaW5lcyB2b24gZGVuIHVudGVuIGFuZ2ViZW5lbiBLb21tYW5kb3MsIHVtIGJlc3RpbW10ZSBBc3Bla3RlIGRlcgorICAgICAgICBLb21tdW5pa2F0aW9uIGRlcyBNdWRzIG1pdCBkZW0gQ2xpZW50IGVpbnp1c3RlbGxlbi4KKworICAgICA8YXJndW1lbnRzPgorICAgICAgICBBcmd1bWVudGUgZnVlciBkYXMgamV3ZWlsaWdlIHRlbG5ldCBLb21tYW5kbworCisgQkVTQ0hSRUlCVU5HOgorICAgIERpZXMgaXN0IGVpbiBTYW1tZWxrb21tYW5kbywgdW0gRWluZmx1c3MgYXVmIGRpZSBFaWdlbnNjaGFmdGVuIGRlcgorICAgIEtvbW11bmlrYXRpb24gdm9tIE11ZCBtaXQgZGVtIENsaWVudCBuZWhtZW4genUga29lbm5lbiBvZGVyIHNpY2ggZGllc2UKKyAgICBhbnplaWdlbiB6dSBsYXNzZW4uCisgICAgTW9lZ2xpY2hlIEtvbW1hbmRvcyBzaW5kOgorICAgICoga2VlcGFsaXZlCisgICAgICBTdGVsbHQgZWluLCBkYXNzIHJlZ2VsbWFlc3NpZyBEYXRlbiB2b20gTUcgenVtIENsaWVudCBnZXNjaGlja3Qgd2VyZGVuLAorICAgICAgZGFtaXQgZGllIFZlcmJpbmR1bmcgYXVmcmVjaHRlcmhhbHRlbiB3aXJkLgorICAgICAgRnVlciBEZXRhaWxzIHMuIEhpbGZlc2VpdGUgdGVsbmV0X2tlZXBhbGl2ZQorICAgICogcnR0aW1lCisgICAgICBBdXNnYWJlIGRlciBsZXR6dGVuIGdlbWVzc2VuZW4gInJvdW5kLXRyaXAgdGltZSIgdm9tIE1HIHp1bSBDbGllbnQKKyAgICAgIGluIE1pa3Jvc2VrdW5kZW4gKDFzID09IDEwMDAwMDAgTWlrcm9zZWt1bmRlbikKKworIFNJRUhFIEFVQ0g6CisgICAgdGVsbmVncywgdGVsbmV0IGtlZXBhbGl2ZSwgdGVsbmV0IGdtY3AKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgMDMuMDIuMjAxMywgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL3BjbWQvdGVsbmV0X2tlZXBhbGl2ZSBiL2RvYy9wY21kL3RlbG5ldF9rZWVwYWxpdmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVjYmZkNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wY21kL3RlbG5ldF9rZWVwYWxpdmUKQEAgLTAsMCArMSw0MiBAQAorCit0ZWxuZXQga2VlcGFsaXZlCistLS0tLS0tLS0tLS0tLS0tCisKKyBLT01NQU5ETzoKKyAgICB0ZWxuZXQga2VlcGFsaXZlIDxlaW58YXVzPgorCisgQVJHVU1FTlRFOgorCisgICAgIDxlaW4+CisgICAgICAgIFNjaGFsdGV0IGRhcyBUZWxuZXQtS2VlcC1BbGl2ZSBlaW4uCisgICAgIDxhdXM+CisgICAgICAgIFNjaGFsdGV0IGRhcyBUZWxuZXQtS2VlcC1BbGl2ZSBhdXMuCisKKyBCRVNDSFJFSUJVTkc6CisgICAgRWluaWdlIFNwaWVsZXIgdW5kIE1hZ2llciBoYWJlbiBpbW1lciBtYWwgd2llZGVyIFByb2JsZW1lLCBkYXNzIHNpZSBiZWkKKyAgICBsYWVuZ2VyZXIgSW5ha3Rpdml0YWV0IHJhdXNmbGllZ2VuLCB3ZWlsIGlyZ2VuZGVpbiBSb3V0ZXIgaW0gTmV0endlcmsgZGllCisgICAgaW5ha3RpdmUgVmVyYmluZHVuZyBhYmJyaWNodCBvZGVyIHdlaWwgYXVzIGFlaG5saWNoZW4gR3J1ZW5kZW4gZGllIFNTTAorICAgIFZlcmJpbmR1bmcgdGVybWluaWVydCB3aXJkLiBEYWhlciBiZXNpdHplbiBkaWUgU3BpZWxlcnNoZWxscyBlaW4KKyAgICBlaW5zY2hhbHRiYXJlcyAnVGVsbmV0LUtlZXAtQWxpdmUnLgorCisgICAgRGllc2UgRnVua3Rpb24gc2NoaWNrdCBhbGxlIDQgbWluIERhdGVuIGFuIGV1cmUgQ2xpZW50cywgZGllIGRpZXNlCisgICAgbmljaHQgYW56ZWlnZW4sIGFiZXIgaWhyZXJzZWl0cyBiZWFudHdvcnRlbi9iZXN0YWV0aWdlbiAoc29mZXJuIGRlciBDbGllbnQKKyAgICBkaWVzIHVudGVyc3R1ZXR6dCkuIFNvIGdpYnQgZXMgaW4gZGVyIFZlcmJpbmR1bmcgenVtIE11ZCBtaW4uIGFsbGUgNCBtaW4KKyAgICBEYXRlbnZlcmtlaHIuIERhcyBzb2xsdGUgVmVyYmluZHVuZ3NhYmJydWVjaGVuIGR1cmNoIEluYWt0aXZpdGFldAorICAgIHZvcmJldWdlbi4KKworICAgIEJpdHRlIHNjaGFsdGV0IGRpZXNlIEZ1bmt0aW9uIGFiZXIgbnVyIGVpbiwgd2VubiBpaHIgc2llIGJyYXVjaHQsIGQuaC4KKyAgICBvaG5lIHNpZSBQcm9ibGVtZSBtaXQgVmVyYmluZHVuZ3NhYmJydWVjaGVuIGJlaW0gSWRlbG4gaGFidC4KKyAgICBIYWJ0IGlociBWZXJiaW5kdW5nc2FiYnJ1ZWNoZSwgb2huZSBJZGxlIHp1IHNlaW4sIHdpcmQgZXVjaCBkaWVzZXMKKyAgICBLZWVwLUFsaXZlIG5pY2h0cyBoZWxmZW4uCisKKyAgICBPaG5lIEFyZ3VtZW50ZSB3aXJkIGRlciBha3R1ZWxsZSBadXN0YW5kIGFuZ2V6ZWlndC4KKworICAgIEhpbndlaXMgZnVlciBNYWdpZXI6IE1hZ2llciBpbSBNYWdpZXJtb2R1cyAobXNjaGF1IGVpbikga29tbWVuIGxlaWRlcgorICAgIG5pY2h0IGluIGRlbiBHZW51c3MgZGllc2VzIEZlYXR1cmVzLCB3ZWlsIHNpZSBrZWluZW4gSGVhcnRiZWF0IGhhYmVuLgorCisgU0lFSEUgQVVDSDoKKyAgICB0ZWxuZWdzLCB0ZWxuZXQgZ21jcAorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICAwOC4xMi4yMDE1LCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvcGNtZC90aXRlbCBiL2RvYy9wY21kL3RpdGVsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MjEyMDIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcGNtZC90aXRlbApAQCAtMCwwICsxLDMyIEBACisKK3RpdGVsCistLS0tLQorCisgS09NTUFORE86CisgICAgdGl0ZWwgPHRleHQ+CisgICAgdGl0ZWwgMAorCisgQVJHVU1FTlRFOgorCisgICAgIDx0ZXh0PgorICAgICAgICBEZXIgVGl0ZWx0ZXh0LgorCisgQkVTQ0hSRUlCVU5HOgorICAgIERlciBUZXh0IHdpcmQgYWxzIG5ldWVyIFRpdGVsIGdlc2V0enQuIERhYmVpIHNvbGx0ZSBkZXIgVGl0ZWwgbmljaHQgbWl0CisgICAgZWluZW0gU3BpZWxlcnRpdGVsIGlkZW50aXNjaCBvZGVyIGVpbmVtIHNvbGNoZW4gc2VociBhZWhubGljaCBzZWluLiBEZXIKKyAgICB1ZWJlcmdlYmVuZSBUZXh0IGRhcmYgZWluIEJhY2tzcGFjZSAoXGIpIGFtIEFuZmFuZyBlbmhhbHRlbiwgd2VubgorICAgIGRhcmF1ZiBlaW4gS29tbWEgKCwpIG9kZXIgZWluIEhvY2hrb21tYSAoJykgZm9sZ3QuCisKKyAgICBXaXJkIGtlaW4gQXJndW1lbnQgdWViZXJnZWJlbiwgc28gd2lyZCBkZXIgYWt0dWVsbGUgVGl0ZWwgZ2Vsb2VzY2h0LgorCisgICAgV2lyZCAwIGFscyBBcmd1bWVudCB1ZWJlcmdlYmVuLCBzbyB3aXJkIGRlciBUaXRlbCBkdXJjaCBkZW4gYWt0dWVsbGVuCisgICAgR2lsZGVudGl0ZWwgZXJzZXR6dC4KKyAgICAKKyAgICBEYXMgS29tbWFuZG8gc3RlaHQgU3BpZWxlcm4gYWIgTGV2ZWwgMjEgenVyIFZlcmZ1ZWd1bmcsIHNvZmVybiBzaWUgc2ljaAorICAgIGluIGRlciBGcmF0ZXJuaXRhcyBEb25vIEFyY2htYWdvcnVtIGRpZXNlIEZhZWhpZ2tlaXQgYmVpYnJpbmdlbiBsYXNzZW4uCisKKyBTSUVIRSBBVUNIOgorICAgIHN0dWZlbiwgcHJlc2F5IChTZWhlcmtvbW1hbmRvKQorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBGcmksIDI1LjA1LjIwMDcsIDE5OjU3OjAwIC0gTWlyaWwKZGlmZiAtLWdpdCBhL2RvYy9wY21kL3RtaGlzdCBiL2RvYy9wY21kL3RtaGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWY2Y2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BjbWQvdG1oaXN0CkBAIC0wLDAgKzEsMzggQEAKKwordG1oaXN0CistLS0tLS0tLS0tLQorCisgS09NTUFORE86CisgICAgdG1oaXN0CisgICAgdG1oaXN0IGF1cworICAgIHRtaGlzdCBuYW1lbgorICAgIHRtaGlzdCBlaW4KKyAgICB0bWhpc3QgPHNwaWVsZXJuYW1lPgorICAgIHRtaGlzdCA8bnI+CisKKyBCRVNDSFJFSUJVTkc6CisgICAgT2huZSBBcmd1bWVudCB3aXJkIGRpZSBha3R1ZWxsZSBUZWlsZS1taXQtSGlzdG9yeSBhdXNnZWdlYmVuLgorICAgICd0bWhpc3QgYXVzJyBzY2hhbHRldCBkaWUgU3BlaWNoZXJ1bmcga29tcGxldHQgYXVzLAorICAgICd0bWhpc3QgbmFtZW4nIHNwZWljaGVydCBudXIgZGllIE5hbWVuIGRlciBHZXNwcmFlY2hzcGFydG5lciB1bmQgZWluaWdlCisgICAgc3RhdGlzdGlzY2hlIERhdGVuLgorICAgICd0bWhpc3QgZWluJyBzcGVpY2hlcnQgTmFtZW4gZGVyIEdlc3ByYWVjaHNwYXJ0bmVyIHNvd2llIGRpZSBJbmhhbHRlIGRlcgorICAgIEdlc3ByYWVjaGUuCisgICAgJ3RtaGlzdCA8bmFtZT4nIGdpYnQgZGFzIEdlc3ByYWVjaCBtaXQgZGVtIGFuZ2VnZWJlbmVuIFNwaWVsZXIgd2llZGVyLAorICAgIHNvZmVybiBzbyBlaW4gR2VzcHJhZWNoIGV4aXN0aWVydCB1bmQgZGVyIEluaGFsdCBnZXNwZWljaGVydCB3dXJkZS4KKyAgICAndG1oaXN0IDxucj4nIGdpYnQgZGFzIEdlc3ByYWVjaCBtaXQgZGVyIE51bW1lciA8bnI+IGluIGRlciBIaXN0b3J5CisgICAgd2llZGVyLgorCisgICAgRGllIEdlc3ByYWVjaHNpbmhhbHRlIHdlcmRlbiBiZWltIEF1c2xvZ2dlbiBtaXR0ZWxzICdzY2hsYWZlIGVpbicKKyAgICBpbm5lcmhhbGIgdm9uIGNhLiA0cyBnZWxvZXNjaHQsIGJlaSAnZW5kZScgc29mb3J0LiBCcmljaHQgZGllIFZlcmJpbmR1bmcKKyAgICB6dW0gTW9yZ2VuR3JhdWVuIGFiLCB3ZXJkZW4gZGllIEdlc3ByYWVjaHNpbmhhbHRlIG5hY2ggMTVtaW4gZ2Vsb2VzY2h0LgorICAgIEVzIHdlcmRlbiBtYXguIDIwIEdlc3ByYWVjaGUgbWl0IGpld2VpbHMgbWF4LiA1MCBOYWNocmljaHRlbiBnZXNwZWljaGVydC4KKworICAgIEFsbGUgbWl0IGRlbSBCZWZlaGwgJ3JmbHVlc3RlcicgbWl0Z2V0ZWlsdGVuIE1pdHRlaWx1bmdlbiB3ZXJkZW4gbmljaHQKKyAgICBnZXNwZWljaGVydC4KKworIFNJRUhFIEFVQ0g6CisgICAgZXJ3aWRlcmUsIHNhZ2UsIGZyYWdlLCBhbnR3b3J0ZSwgZmx1ZXN0ZXJlLCBnZXNwcmFlY2gsIHJ1ZmUsIGViZW5lbiwgd2VnLAorICAgIGlnbm9yaWVyZSwga29ib2xkLCBtdWRzLCBzZW5kZXJ3aWVkZXJob2x1bmcsIGtsaW5nZWx0b24sIHRlaWxlLCByZmx1ZXN0ZXJlCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFNhLCAwOS4wOC4yMDA4LCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvcGNtZC90b2V0ZSBiL2RvYy9wY21kL3RvZXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4OTNhYzYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcGNtZC90b2V0ZQpAQCAtMCwwICsxLDMyIEBACisKK3RvZXRlCistLS0tLQorCisgS09NTUFORE86CisgICAgdG9ldGUgPG1vbnN0ZXI+CisgICAgdG9ldGUgYWxsZQorCisgQVJHVU1FTlRFOgorCisgICAgIDxtb25zdGVyPgorICAgICAgICBEZXIgenUgdG9ldGVuZGUgR2VnbmVyCisKKyBCRVNDSFJFSUJVTkc6CisgICAgU3RhcnRldCBlaW5lIEF0dGFja2UgYXVmIGRhcyBhbmdlZ2ViZW5lIE1vbnN0ZXIuIEVzIG11c3Mgc2ljaCBpbSBzZWxiZW4KKyAgICBSYXVtIGJlZmluZGVuLiBFcyBpc3QgbW9lZ2xpY2gsIGF1cyBlaW5lbSBsYXVmZW5kZW4gS2FtcGYgaGVyYXVzIHp1CisgICAgZmxpZWhlbi4gV2VubiBtYW4gZGFzIGZsaWVoZW5kZSBNb25zdGVyIGZhZW5ndCwgZGFyZiBtYW4gZGVuIGVyc3RlbiBTY2hsYWcKKyAgICBhdXNmdWVocmVuICh1bWdla2VocnQgZ2lsdCBkYXMgYWxsZXJkaW5ncyBhdWNoISkuCisKKyAgICBFcyBpc3QgendhciBhdWNoIG1vZWdsaWNoLCBhbmRlcmUgU3BpZWxlciB6dSB0b2V0ZW4uIERpZXMgaXN0IGplZG9jaCB1bnRlcgorICAgIFN0cmFmZSBnZXN0ZWxsdCwgZXMgc2VpIGRlbm4sIGRlciBLYW1wZiBmaW5kZXQgaW4gZXh0cmEgZGFmdWVyCisgICAgdm9yZ2VzZWhlbmVuIEdlYmlldGVuIHN0YXR0LgorCisgICAgTWl0ICd0b2V0ZSBhbGxlJyBncmVpZnQgbWFuIEFMTEUgcG90ZW50aWVsbGVuIEdlZ25lciBpbSBSYXVtIGFuLCBtYW4KKyAgICBzb2xsdGUgc2ljaCBhbHNvIGd1dCB1ZWJlcmxlZ2VuLCB3byBtYW4gZGllc2VzIEtvbW1hbmRvIGVpbnNldHp0LgorCisgU0lFSEUgQVVDSDoKKyAgICAgVmVyd2FuZHQ6IHN0b3AsIGFuZ3JpZmZzbWVsZHVuZworICAgICBBbmRlcmVzOiAga2FlbXBmZW4sIGhlaWx1bmcsIGxlYmVuLCB0b2QgCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIE1vbiwgMjUuMDguMjAwMywgMTU6MzA6MDAgdm9uIEJvaW5nCmRpZmYgLS1naXQgYS9kb2MvcGNtZC90b24gYi9kb2MvcGNtZC90b24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYxMTg5ZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wY21kL3RvbgpAQCAtMCwwICsxLDI2IEBACitLT01NQU5ETzoKKwl0b24gWzxTdGF0dXM+XQorCitBUkdVTUVOVEU6CisJPFN0YXR1cz4KKwkgIEVJTjogVG9uIGVpbnNjaGFsdGVuLgorCSAgQVVTOiBUb24gYXVzc2NoYWx0ZW4uCisKK0JFU0NIUkVJQlVORzoKKwlEaWUgbWVpc3RlbiBUZXJtaW5hbHMga29lbm5lbiBlaW5mYWNoZSBQaWVwdG9lbmUgZXJrbGluZ2VuIGxhc3NlbiwKKwl3YXMgYXVjaCBhbiBlaW5pZ2VuIFN0ZWxsZW4gaGllciBpbSBNVUQgenVtIEVpbnNhdHoga29tbXQuCisJR2VuYW5udCBzZWllbiBoaWVyYmVpIHZvcnJhbmdpZyAnZXJ3YXJ0ZScgdW5kICd3ZWNrZScsIHdlbGNoZSBlaW5lbgorCUdyb3NzdGVpbCBkZXIgendlaWZlbGhhZnRlbiBHZXJhZXVzY2hrdWxpc3NlIGF1c21hY2hlbi4gTnVuIGlzdCBlcworCW5pY2h0IGltbWVyIGd1ZW5zdGlnLCBkaWUgc2Nod2VyIGFyYmVpdGVuZGVuIE1lbnNjaGVuIGluIGVpbmVtCisJUmVjaGVuemVudHJ1bSBtaXQgb2ZmZW5zaWNodGxpY2ggbmljaHQgc3R1ZGllbmJlem9nZW5lbiBUb2VuZW4genUKKwlzdG9lcmVuLiBXZXIgbmljaHQgZGllIE1vZWdsaWNoa2VpdCBoYXQsIGRpZXNlIHN0b2VyZW5kZW4gTGF1dGUgYW0KKwlDb21wdXRlciBkaXJla3QgYWJ6dXNjaGFsdGVuLCBkZW0gc2VpIG1pdCBkaWVzZW0gQmVmZWhsIGdlaG9sZmVuOgorCSAgJ3RvbiBFSU4nIC0gRXMgd2VyZGVuIFRvZW5lIHZvbSBNVUQgZXJ6ZXVndCAoU3RhbmRhcmQpLgorCSAgJ3RvbiBBVVMnIC0gRXMgd2VyZGVuIGtlaW5lIFRvZW5lIHZvbSBNVUQgZXJ6ZXVndC4KKwkndG9uJyBvaG5lIFBhcmFtZXRlciB6ZWlndCBkZW4gYWt0dWVsbGVuIFN0YXR1cy4KKworU0lFSEUgQVVDSDoKKwllcndhcnRlLCB3ZWNrZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisxMS4xMS4yMDA2IFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9wY21kL3RyYWdlIGIvZG9jL3BjbWQvdHJhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJiMTcwNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wY21kL3RyYWdlCkBAIC0wLDAgKzEsMjQgQEAKKwordHJhZ2UKKy0tLS0tCisKKyBLT01NQU5ETzoKKyAgICB0cmFnZSA8a2xlaWR1bmc+CisKKyBBUkdVTUVOVEU6CisKKyAgICAgPGtsZWlkdW5nPgorICAgICAgICBEYXMgYW56dWxlZ2VuZGUgS2xlaWR1bmdzc3R1ZWNrCisKKyBCRVNDSFJFSUJVTkc6CisgICAgYHRyYWdlJyBpc3QgZWluIEtvbW1hbmRvIHVtIEtsZWlkdW5nIGFuenVsZWdlbi4gUm9idXN0ZSBLbGVpZHVuZyBiaWV0ZXQKKyAgICBudXIgZGFubiBTY2h1dHogZ2VnZW4gQW5ncmlmZmUsIHdlbm4gc2llIGFuZ2V6b2dlbiB3dXJkZS4KKworICAgIE1hbiBrYW5uIG5vcm1hbGVyd2Vpc2Ugdm9uIGplZGVyIEFydCBLbGVpZHVuZyBudXIgZWluIFN0dWVjayBnbGVpY2h6ZWl0aWcKKyAgICB0cmFnZW4gKHp3ZWkgSHVldGUgdWViZXJlaW5hbmRlciBzYWVoZW4gamEgYXVjaCBldHdhcyBsYWVjaGVybGljaCBhdXMuLi4pLgorCisgU0lFSEUgQVVDSDoKKyAgICB6dWVja2UsIHppZWhlIChhbi9hdXMpCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFRodSwgMjQuMDcuMTk5NywgMDk6MDA6MDAgdm9uIFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL3BjbWQvdHV0b3JpYWwgYi9kb2MvcGNtZC90dXRvcmlhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTg3Zjk2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BjbWQvdHV0b3JpYWwKQEAgLTAsMCArMSwyOCBAQAorCit0dXRvcmlhbAorLS0tLS0tLS0KKworIEJFU0NIUkVJQlVORzoKKworICAgSW0gU3RhcnRyYXVtIGplZGVyIFJhc3NlIGthbm4gbWFuIG1pdCBkZW0gQmVmZWhsICd0dXRvcmlhbCcgZGFzCisgICBOZXVzcGllbGVydHV0b3JpYWwgYmVnaW5uZW4uIEltIFR1dG9yaWFsIGJla29tbXQgbWFuIHZvbiBlaW5lbQorICAgYWx0ZW4gU3RlaW5iZWlzc2VyIGRpZSB3aWNodGlnc3RlbiBGYWVoaWdrZWl0ZW4gZnVlciBkYXMgVWViZXJsZWJlbgorICAgaW0gTW9yZ2VuR3JhdWVuIGJlaWdlYnJhY2h0LgorCisgICBFcyB3ZXJkZW46IEJld2VndW5nLCBVbnRlcnN1Y2hlbiwgS29tbXVuaWthdGlvbiwgQWt0aW9uZW4sIFF1ZXN0cywKKyAgIEJlbnV0enVuZyB2b24gQ29udGFpbmVybiwgTGljaHRxdWVsbGVuLCBIYW5kZWwgdW5kIEthbXBmIGJlaGFuZGVsdC4KKworICAgRGFzIFR1dG9yaWFsIGthbm4gcGVyICd1ZWJlcnNwcmluZ2UgdHV0b3JpYWwnIHZlcmxhc3NlbiB3ZXJkZW4sIHNvYmFsZAorICAgRHUgZGFzIGVyc3RlIE1hbCBkZW0gU3RlaW5iZWlzc2VyIGJlZ2VnbmV0IGJpc3QuIER1IGhhc3QgamVkZXJ6ZWl0IGRpZSAKKyAgIE1vZWdsaWNoa2VpdCwgZXMgd2llZGVyIHp1IGJlZ2lubmVuLCBpbmRlbSBEdSBkZW4gQmVmZWhsICd0dXRvcmlhbCcgaW4KKyAgIERlaW5lbSBTdGFydHJhdW0gZWluZ2lic3QuCisKKyAgIERpZSBHZXNjaHdpbmRpZ2tlaXQgZGVyIEluZm9ybWF0aW9uZW4gaW5uZXJoYWxiIGRlcyBUdXRvcmlhbHMgaXN0CisgICBtaXR0ZWxzICdzY2huZWxsZXInLCAnbGFuZ3NhbWVyJywgJ3BhdXNlJywgJ3dlaXRlcicsICdhYmJydWNoJyB1bmQKKyAgICduZXVzdGFydCcgc3RldWVyYmFyLiAgCisKK1NJRUhFIEFVQ0g6IGVpbmZ1ZWhydW5nLCBjaWNlcm9uZXMsIGhpbGZlCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgMDcuMDUuMjAxNiwgQXJhdGhvcm4KKwpkaWZmIC0tZ2l0IGEvZG9jL3BjbWQvdHlwbyBiL2RvYy9wY21kL3R5cG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ3MDQ4OQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wY21kL3R5cG8KQEAgLTAsMCArMSw0OCBAQAordHlwbworLS0tLQorCitLT01NQU5ETzoKKyAgICB0eXBvIDx0ZXh0PgorICAgIHR5cG8gPG9iamVrdD46PHRleHQ+CisKK0FSR1VNRU5URToKKworICAgIDx0ZXh0PgorICAgICAgICBFaW5lIE1pdHRlaWx1bmcKKyAgICA8b2JqZWt0PgorICAgICAgICBFaW4gUmVmZXJlbnpvYmpla3QsIGRhcyBuZWJlbiBEaXIgbGllZ3Qgb2RlciBpbiBEZWluZW0gSW52ZW50YXIgaXN0CisKK0JFU0NIUkVJQlVORzoKKyAgICBJbiBkZW4gQmVzY2hyZWlidW5nZW4gdm9uIFJhZXVtZW4gdW5kIE9iamVrdGVuIGtvbW10IGVzIGltbWVyIHdpZWRlciBtYWwKKyAgICB6dSBUaXBwZmVobGVybiwgZGllIGF1Y2ggZGllIFRlc3RwaGFzZSBkZXMgT2JqZWt0ZXMvR2ViaWV0ZXMgdW5lcmthbm50CisgICAgdWViZXJzdGFuZGVuIGhhYmVuLgorCisgICAgV2VubiBEdSBlaW5lbiBUaXBwZmVobGVyIGdlZnVuZGVuIGhhc3QsIHNvIGthbm5zdCBEdSBkZW4gVmVyYW50d29ydGxpY2hlbgorICAgIG1pdCBkaWVzZW0gQmVmZWhsIGRhdm9uIHVudGVycmljaHRlbi4KKworICAgIEZ1ZXIgZGVuIE1hZ2llciBpc3QgZXMgc2VociBoaWxmcmVpY2gsIHdlbm4gRHUgYmVpIGluIE1lbGR1bmcgYW5naWJzdCwKKyAgICB3byBnZW5hdSBkZXIgVGlwcGZlaGxlciB6dSBmaW5kZW4gaXN0IChhbHNvIHouQiwgd2VsY2hlcyBEZXRhaWwgZGVuCisgICAgRmVobGVyIGVudGhhZWx0KS4KKworICAgIFpvZWdlcmUgbmljaHQsIHdlbm4gRHUgZWluZW4gVGlwcGZlaGxlciBmaW5kZXN0OyBGZWhsZXJtaXR0ZWlsdW5nZW4gc2luZAorICAgICpzZWhyKiB3aWxsa29tbWVuIQorCisgICAgV2VubiBEdSBlaW5lbiBUeXBvIGFuIGVpbmVtIGJlc3RpbW10ZW4gT2JqZWt0IG9kZXIgTlBDIGVudGRlY2tzdCwga2FubnN0CisgICAgRHUgZGllc2VzL2RpZXNlbiBoaW50ZXIgZWluZW0gRG9wcGVscHVua3QgYW5nZWJlbiwgZGFtaXQgZGVyIGZ1ZXIgZGFzCisgICAgT2JqZWt0IHZlcmFudHdvcnRsaWNoZSBNYWdpZXIgZGllIE1lbGR1bmcgYmVrb21tdC4KKyAgICBXZW5uIGRhcyBPYmpla3QgbmljaHQgenUgZmluZGVuIGlzdCwgd2lyZCBkaWUgZ2FuemUgRWluZ2FiZSBhbHMKKyAgICBNZWxkdW5nIGF1ZmdlZmFzc3QuCisKK0JFTUVSS1VORzoKKyAgICBEZXIgQmVmZWhsICd0eXBvJyBiZXppZWh0IHNpY2ggYmVpIE5pY2h0YW5nYWJlIGVpbmVzIEJlenVnc29iamVrdHMKKyAgICBhdWYgZGFzIGxldHp0ZSBiZXRyYWNodGV0ZSBPYmpla3QuIEhhc3QgRHUgYWxzbyBlaW4gT2JqZWt0IHVudGVyc3VjaHQsCisgICAgZGFubiB3aXJkIGRpZSBNZWxkdW5nIGZ1ZXIgZGllc2UgT2JqZWt0IGFiZ2VnZWJlbi4gSGFzdCBEdSBhYmVyIGRlbgorICAgIFJhdW0gdW50ZXJzdWNodCBvZGVyICdzY2hhdScgZWluZ2VnZWJlbiwgd2lyZCBkaWUgTWVsZHVuZyBmdWVyIERlaW5lbgorICAgIG1vbWVudGFuZW4gUmF1bSBhYmdlc2V0enQuCisKK1NJRUhFIEFVQ0g6CisgICAgYnVnLCBpZGVlLCBkZXRhaWwsIGJlenVnc29iamVrdAorCitMRVRaVEUgQWVOREVSVU5HOgorICAgIDAzLjA2LjIwMTMsIFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL3BjbWQvdWhybWVsZHVuZyBiL2RvYy9wY21kL3Vocm1lbGR1bmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjViNGRjZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wY21kL3Vocm1lbGR1bmcKQEAgLTAsMCArMSwzMyBAQAorCit1aHJtZWxkdW5nCistLS0tLS0tLS0tCisKKyBLT01NQU5ETzoKKyAgICB1aHJtZWxkdW5nIFs8bWVsZHVuZz5dCisKKyBBUkdVTUVOVEU6CisKKyAgICAgPG1lbGR1bmc+CisgICAgICAgIERlaW5lIGdhbnogcGVyc29lbmxpY2hlIFVocm1lbGR1bmcKKworIEJFU0NIUkVJQlVORzoKKyAgICBPaG5lIEFyZ3VtZW50ZSB3aXJkIERlaW5lIGFrdHVlbGxlIFVocm1lbGR1bmcgYW5nZXplaWd0LgorCisgICAgTWl0IGRlbSBBcmd1bWVudCA8bWVsZHVuZz4ga2FubiBtYW4gc2ljaCBlaW5lIGVpZ2VuZSBVaHJtZWxkdW5nIHNldHplbi4KKyAgICBEZXIgUGxhdHpoYWx0ZXIgZnVlciBkaWUgVWhyemVpdCBpbiBkZXIgTWVsZHVuZyBpc3QgYCVkJy4KKworICAgIEVzIGRhcmYgbnVyICplaW4qIGAlZCcgaW4gZGVyIE1lbGR1bmcgdm9ya29tbWVuIQorCisgICAgTWl0IGRlbSBCZWZlaGwgInVocm1lbGR1bmcgMCIga2FubnN0IER1IERlaW5lIFVocm1lbGR1bmcgYXVmIGRpZQorICAgIFN0YW5kYXJkbWVsZHVuZyB6dXJ1ZWNrc2V0emVuLgorCisgQkVJU1BJRUxFOgorCisgICAgPiB1aHJtZWxkdW5nIFNjaG9uICVkIFVociwgdW5kIGltbWVyIG5vY2ggaW0gTVVELgorCisgICAgRGFzIGdpYnQgZGFubiB6Qi4gYWJlbmRzIHVtIHplaG46CisKKyAgICBTY2hvbiAyMiBVaHIsIHVuZCBpbW1lciBub2NoIGltIE1VRC4KKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgU2FtLCAwOC4wMy4yMDA4LCAxMzowODowMCB2b24gQXJhdGhvcm4KZGlmZiAtLWdpdCBhL2RvYy9wY21kL3VsdHJha3VyeiBiL2RvYy9wY21kL3VsdHJha3VyegpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOThiZGE3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BjbWQvdWx0cmFrdXJ6CkBAIC0wLDAgKzEsMjEgQEAKKwordWx0cmFrdXJ6CistLS0tLS0tLS0KKworIEtPTU1BTkRPOgorICAgIHVsdHJha3VyegorCisgQVJHVU1FTlRFOgorICAgIGtlaW5lCisKKyBCRVNDSFJFSUJVTkc6CisgICAgU2NoYWx0ZXQgYXVmIGRlbiAiVWx0cmFrdXJ6Ii1Nb2R1cyB1bS4gV2VubiBEdSBEaWNoIGluIGRpZXNlbSBNb2R1cworICAgIGJlZmluZGVzdCwgc2llaHN0IER1ICprZWluZSogUmF1bWJlc2NocmVpYnVuZyAtIG51ZXR6bGljaCwgd2VubiBtYW4KKyAgICBhbHRiZWthbm50ZSBQZmFkZSBhYmxhZXVmdC4gTWl0IGRlbiBLb21tYW5kb3MgYGxhbmcnIHVuZCBga3Vyeicga2FubnN0IER1CisgICAgZGllc2VuIE1vZHVzIHdpZWRlciBiZWVuZGVuLgorCisgU0lFSEUgQVVDSDoKKyAgICBsYW5nLCBrdXJ6LCBzY2hhdSwgYXVzZ2FlbmdlCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFRodSwgMjQuMDcuMTk5NywgMDk6MDA6MDAgdm9uIFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL3BjbWQvdW5hbGlhcyBiL2RvYy9wY21kL3VuYWxpYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYyMWMxMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wY21kL3VuYWxpYXMKQEAgLTAsMCArMSw0NiBAQAorCit1bmFsaWFzCistLS0tLS0tCisKKyBLT01NQU5ETzoKKyAgICB1bmFsaWFzIDxhbGlhcz4KKyAgICB1bmFsaWFzIDxtdXN0ZXI+CisKKyBBUkdVTUVOVEU6CisKKyAgICAgPGFsaWFzPgorICAgICAgICBEYXMgenUgZW50ZmVybmVuZGUgQWxpYXMKKyAgICAgPG11c3Rlcj4KKyAgICAgICAgTXVzdGVyLCBkYXMgZGllIHp1IGVudGZlcm5lbmRlbiBBbGlhc2UgYmVzY2hyZWlidAorICAgICAgICAoRGFzIE11c3RlciBtdXNzIGVpbiBzb2cuICdyZWd1bGFyIGV4cHJlc3Npb24nIHNlaW4uKQorCisgQkVTQ0hSRUlCVU5HOgorICAgIChTdGF0dCBgdW5hbGlhcycga2FubiBtYW4gYXVjaCBgdW5hbGknIHZlcndlbmRlbiEpCisKKyAgICBFcyB3ZXJkZW4gZWluIG9kZXIgbWVocmVyZSBBbGlhc2UgZ2Vsb2VzY2h0LgorCisgICAgKkFjaHR1bmchKiBFcyBlcmZvbGd0IGtlaW5lIFNpY2hlcmhlaXRzYWJmcmFnZSEKKworIEJFSVNQSUVMRToKKyAgICBFaW4gZWluemVsbmVzIEFsaWFzIGxvZXNjaGVuOgorCisgICAgPiB1bmFsaWFzIHdlZworCisgICAgQWxsZSAidG0iLUFsaWFzZSBsb2VzY2hlbiAobWFuIGJlYWNodGUgZGVuIC4gdm9yIGRlbSAqKToKKworICAgID4gdW5hbGlhcyB0bS4qCisKKyAgICBBbGxlIEFsaWFzZSBsb2VzY2hlbiwgZGllIGF1ZiBaaWZmZXJuIGxpZWdlbjoKKworICAgID4gdW5hbGlhcyBbMC05XQorCisgICAgQWxsZSBBbGlhc2UgbG9lc2NoZW46CisKKyAgICA+IHVuYWxpYXMgLioKKworIFNJRUhFIEFVQ0g6CisgICAgYWxpYXMKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAwMi4xMC4yMDEyLCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9wY21kL3VybCBiL2RvYy9wY21kL3VybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmNhZDQyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BjbWQvdXJsCkBAIC0wLDAgKzEsMzQgQEAKKwordXJsCistLS0KKworIEtPTU1BTkRPOgorICAgIHVybCBbPGFkcmVzc2U+XQorCisgQVJHVU1FTlRFOgorCisgICAgIDxhZHJlc3NlPiAob3B0aW9uYWwpCisgICAgICAgIERpZSBuZXVlIEFkcmVzc2UKKworIEJFU0NIUkVJQlVORzoKKyAgICBXZW5uIER1IGVpbmUgZWlnZW5lIEhvbWVQYWdlIGltIEludGVybmV0IGhhc3QgdW5kIHNpZSBmdWVyIERlaW5lCisgICAgTWl0c3BpZWxlciBlcnJlaWNoYmFyIG1hY2hlbiB3aWxsc3QsIHNvIGthbm5zdCBEdSBkYXMgbWl0IGRpZXNlbQorICAgIEtvbW1hbmRvIHR1bi4KKworICAgIE9obmUgPGFkcmVzc2U+IHdpcmQgZGllIGFrdHVlbGxlIEFkcmVzc2UgYW5nZXplaWd0LCBpc3Qgc2llICdrZWluZScsCisgICAgc28gd2lyZCBkaWUgQWRyZXNzZSBnZWxvZXNjaHQuCisKKyAgICBBdXMgPGFkcmVzc2U+IHdlcmRlbiBzYWVtdGxpY2hlIEhUTUwtVGFncyBlbnRmZXJudCEKKworICAgIFp1IGZpbmRlbiBzaW5kIGRpZXNlIEluZm9ybWF0aW9uZW46CisKKyAgICAgaHR0cDovL21nLm11ZC5kZS8KKyAgICAgLT4gSW5mb3JtYXRpb24KKyAgICAgICAgLT4gT25saW5lCisKKyBTSUVIRSBBVUNIOgorICAgIFBlcnNvZW5saWNoZSBEZXRhaWxzOiBlbWFpbCwgaWNxLCBtZXNzZW5nZXIsIG9ydAorICAgIFNvbnN0aWdlczogICAgICAgICAgICBmaW5nZXIKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgU3VuLCAwNS4wNy4xOTk3LCAxNzowMDowMCB2b24gUmlrdXMKZGlmZiAtLWdpdCBhL2RvYy9wY21kL3ZlcmJlbiBiL2RvYy9wY21kL3ZlcmJlbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2NkYTU4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BjbWQvdmVyYmVuCkBAIC0wLDAgKzEsMjkgQEAKKwordmVyYmVuCistLS0tLS0KKworIEtPTU1BTkRPOgorICAgIHZlcmJlbgorCisgQVJHVU1FTlRFOgorICAgIGtlaW5lCisKKyBCRVNDSFJFSUJVTkc6CisgICAgTWl0IGRpZXNlbSBCZWZlaGwgd2VyZGVuIGFsbGUgbW9lZ2xpY2hlbiBWZXJiZW4gZGVyIFNlZWxlIGFuZ2V6ZWlndC4gRGllc2UKKyAgICBWZXJiZW4gaGFiZW4gaW4gZGVyIFJlZ2VsIGtlaW5lbiB0aWVmZW4gU2lubiwgc29uZGVybiBkaWVuZW4gZGF6dSwgZWluZQorICAgIGdld2lzc2UgU3RpbW11bmcgenUgdmVyYnJlaXRlbi4KKworICAgIERhIGRpZXMgZWluZSBnYW56ZSBNZW5nZSBhbiBWZXJiZW4gc2luZCwgZGVyZW4gRnVua3Rpb24gbWVpc3QgZWggYXVmIGRlcgorICAgIEhhbmQgbGllZ3QsIGV4aXN0aWVyZW4gZnVlciBzaWUga2VpbmUgc2VwYXJhdGVuIEhpbGZlc2VpdGVuLgorCisgICAgRWluZSBrdXJ6ZSBIaWxmZSB6dSBqZWRlbSBWZXJiIGthbm5zdCBEdSBqZWRvY2ggamVkZXJ6ZWl0IG1pdCBgPHZlcmI+IC1oJworICAgIGVyaGFsdGVuLgorCisgICAgT2Z0IGdlbnV0enRlIFZlcmJlbiBzaW5kOiBgbGFjaGUnLCBgbGFlY2hlbCBbYW5dJywgYGRhbmtlJywgYGFyZ2wnLAorICAgIGBncmluc2UnLCBgdW1hcm1lJywgYHd1c2NoZWwnLCAuLi4KKworIFNJRUhFIEFVQ0g6CisgICAgYWR2ZXJiCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFRodSwgMjQuMDcuMTk5NywgMDk6MDA6MDAgdm9uIFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL3BjbWQvdm9yc2ljaHQgYi9kb2MvcGNtZC92b3JzaWNodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzQ4NGFjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BjbWQvdm9yc2ljaHQKQEAgLTAsMCArMSwzNSBAQAorCit2b3JzaWNodAorLS0tLS0tLS0KKworIEtPTU1BTkRPOgorICAgIHZvcnNpY2h0IDxscD4KKworIEFSR1VNRU5URToKKworICAgICA8bHA+CisgICAgICAgIFphaGwgendpc2NoZW4gMCB1bmQgZGVyIG1heC4gWmFobCBEZWluZXIgTGViZW5zcHVua3RlCisKKyBCRVNDSFJFSUJVTkc6CisgICAgU2NoYWx0ZXQgZGVuIGBWb3JzaWNodHNtb2R1cycgZWluLiBXZW5uIER1IERpY2ggaW0gVm9yc2ljaHRzbW9kdXMKKyAgICBiZWZpbmRlc3QsIHJlbm5lbiBEZWluZSBCZWluZSBtaXQgRGlyIGZvcnQsIHNvYmFsZCBEZWluZSBMZWJlbnNwdW5rdGUKKyAgICB1bnRlciBkZW4gYW5nZWdlYmVuZW4gV2VydCBnZXN1bmtlbiBzaW5kLCB1bmQgRHUgbWl0IGRlbSBuYWVjaHN0ZW4gU2NobGFnCisgICAgaW4gZGVyIG5hZWNoc3RlbiBLYW1wZnJ1bmRlIGFuIGRlciBSZWloZSBiaXN0LgorCisgICAgRGllIEJlZ3J1ZXNzdW5nc3NjaGxhZWdlLCBkaWUgbWFuIGV2ZW50dWVsbCBhdXN0ZWlsdCBvZGVyIGVpbnN0ZWNrdCwKKyAgICBmYWxsZW4gKm5pY2h0KiBpbiBlaW5lIEthbXBmcnVuZGUuIEVudHNwcmVjaGVuZCB3aXJkIGRlciBWb3JzaWNodHNtb2R1cworICAgIGhpZXIgYXVjaCAqbmljaHQqIGFrdGl2IQorCisgICAgRGVyIERlZmF1bHRtb2R1cyBpc3QgZGVyIFByaW56LUVpc2VuaGVyei1Nb2R1cyBgdm9yc2ljaHQgMCcuCisKKyAgICBEZXIgVm9yc2ljaHRzbW9kdXMgZnVua3Rpb25pZXJ0IG5pY2h0IGltbWVyLiBFciBrYW5uIERpY2ggendhciByZXR0ZW4sCisgICAgd2VubiBEdSBlaW5lIGxhbmdzYW1lIFZlcmJpbmR1bmcgb2RlciBtdWVkZSBGaW5nZXIgYmVzaXR6dCwgYWJlciBlcyBrYW5uCisgICAgaW1tZXIgcGFzc2llcmVuLCBkYXNzIGVpbiBNb25zdGVyIERpciBtZWhyIExlYmVuc3B1bmt0ZSBuaW1tdCBhbHMgRHUgbm9jaAorICAgIGhhc3QuIE1hbmNobWFsIGZpbmRlbiBEZWluZSBCZWluZSBhdWNoIGtlaW5lbiBGbHVjaHR3ZWcuCisKKyBTSUVIRSBBVUNIOgorICAgIHRvZXRlLCByZXBvcnQKKyAgICAobnVyIFNlaGVyKTogZmx1Y2h0cmljaHR1bmcKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgVGh1LCAyNC4wNy4xOTk3LCAwOTowMDowMCB2b24gV2FyZ29uCmRpZmYgLS1naXQgYS9kb2MvcGNtZC93ZWNrZSBiL2RvYy9wY21kL3dlY2tlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwY2E0ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcGNtZC93ZWNrZQpAQCAtMCwwICsxLDI0IEBACitLT01NQU5ETzoKKwl3ZWNrZSA8TGViZXdlc2VuPgorCitBUkdVTUVOVEU6CisJPExlYmV3ZXNlbj4KKwkgIEhpZXIgZ2lidCBtYW4gZGFzIExlYmV3ZXNlbiBhbiwgYmVpIHdlbGNoZW0gbWFuIHNpY2ggYmVtZXJrYmFyCisJICBtYWNoZW4gbW9lY2h0ZS4KKworQkVTQ0hSRUlCVU5HOgorCVdpbGwgbWFuIHNpY2ggYmVpIGluc2Jlc29uZGVyZSBoZXJ1bWx1bmdlcm5kZW4gKGF1Y2ggaWRlbG4gZ2VuYW5udCkKKwlTcGllbGVybiBiZW1lcmtiYXIgbWFjaGVuLCBzbyBrYW5uIGVpbmVtIGRpZXNlcyBLb21tYW5kbworCXdlaXRlcmhlbGZlbi4gRXMgZXJ6ZXVndCBiZWltIHp1IFdlY2tlbmRlbiBuZWJzdCBlaW5lbSBrbGVpbmVuIFRleHQsCisJd2VyIHZlcnp3ZWlmZWx0IHVtIEF1Zm1lcmtzYW1rZWl0IHJpbmd0LCBhdWNoIGVpbmVuIGt1cnplbiBQaWVwdG9uLgorCitCRU1FUktVTkdFTjoKKwlEaWVzZXIgVG9uIGthbm4gc2ljaCBpbiBnZXdpc3NlbiBSTC1VbWdlYnVuZ2VuIHJlY2h0IHN0b2VyZW5kCisJYXVzd2lya2VuLiBEZXIgenUgV2Vja2VuZGUga2FubiBzaWNoIGplZG9jaCBkYWdlZ2VuIG1pdCBkZW0gS29tbWFuZG8KKwkndG9uIEFVUycgd2VocmVuLgorCitTSUVIRSBBVUNIOgorCXRvbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisxMS4xMS4yMDA2IFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9wY21kL3dlZyBiL2RvYy9wY21kL3dlZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDIwZmJhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BjbWQvd2VnCkBAIC0wLDAgKzEsMzAgQEAKKword2VnCistLS0KKworIEtPTU1BTkRPOgorICAgIHdlZyBbPHRleHQ+XQorCisgQVJHVU1FTlRFOgorCisgICAgIDx0ZXh0PgorICAgICAgICBFcmtsYWVydCBkaWUgQWJ3ZXNlbmhlaXQKKworIEJFU0NIUkVJQlVORzoKKyAgICBJc3QgbWFuIGVpbm1hbCBmdWVyIGxhZW5nZXJlIFplaXQgbmljaHQgYW53ZXNlbmQgdW5kIGthbm4gbmljaHQgYXVmCisgICAgTWl0dGVpbHVuZ2VuIHJlYWdpZXJlbiwgc28ga2FubiBtYW4gZGVuIEdydW5kIG1pdCBkaWVzZW0gS29tbWFuZG8ga3VuZCB1bmQKKyAgICB6dSB3aXNzZW4gdHVuLgorCisgICAgV2VubiBEaXIgbnVuIGplbWFuZCBldHdhcyBtaXR0ZWlsdCwgZXJoYWVsdCBlciBkaWUgTWVsZHVuZworCisgICAgPG5hbWU+IGlzdCBnZXJhZGUgbmljaHQgZGE6IDx0ZXh0PgorCisgICAgdW5kIGJyYXVjaHQgc2ljaCBuaWNodCB6dSB3dW5kZXJuLCB3aWVzbyBrZWluZSBBbnR3b3J0IGtvbW10LgorCisgICAgT2huZSBBcmd1bWVudCB3aXJkIGRpZSBLZW5uemVpY2hudW5nIHdpZWRlciBhdWZnZWhvYmVuLgorCisgU0lFSEUgQVVDSDoKKyAgICB0ZWlsZSAobWl0KSwgZXJ6YWVobGUsIHdlZ21lbGR1bmcKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgMjUuIEFwciAyMDExIEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvcGNtZC93ZWdtZWxkdW5nIGIvZG9jL3BjbWQvd2VnbWVsZHVuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDYxZTY5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BjbWQvd2VnbWVsZHVuZwpAQCAtMCwwICsxLDE5IEBACisKK3dlZ21lbGR1bmcKKy0tLS0tLQorCisgS09NTUFORE86CisgICAgd2VnbWVsZHVuZyA8bmFtZT4KKworIEFSR1VNRU5URToKKworICAgICA8bmFtZT4KKyAgICAgICAgTmFtZSBlaW5lcyBTcGllbGVycworCisgQkVTQ0hSRUlCVU5HOgorICAgIERpZXNlciBCZWZlaGwgZ2lidCBkaWUgV2VnLU1lbGR1bmcgZWluZXMgU3BpZWxlciBhdXMsIHdlbm4gZGllc2VyIGVpbmUgCisgICAgaGF0LiBEYW5uIG11c3MgbWFuIG5pY2h0IGplZGVzIG1hbCBkZW4gU3BpZWxlciBmaW5nZXJuLCB3ZW5uIG1hbiB3aXNzZW4KKyAgICB3aWxsLCBvYiBkZXIgZ3JhZCB3ZWcgaXN0IG9kZXIgbmljaHQuCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFNvbiwgMTEuIEF1ZyAyMDAyLCAxOTowNzowMCB2b24gVmFuaW9uCmRpZmYgLS1naXQgYS9kb2MvcGNtZC93ZXIgYi9kb2MvcGNtZC93ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcyNTBjZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wY21kL3dlcgpAQCAtMCwwICsxLDUxIEBACisKK3dlcgorLS0tCisKKyBLT01NQU5ETzoKKyAgICB3ZXIgWzxtdWQ+fDxvcHRpb24+XQorCisgQVJHVU1FTlRFOgorCisgICAgIDxtdWQ+IChvcHRpb25hbCkKKyAgICAgICAgRWluIE1VRC1OYW1lIGF1cyBkZXIgYG11ZHMnLUxpc3RlCisKKyAgICA8b3B0aW9uZW4+IChvcHRpb25hbCkKKyAgICAgICAgLXMgIHplaWd0IHN0YXR0IGRlciBHaWxkZSBkaWUgSGVya3VuZnQgZGVzIE11ZGRlcnMgYW4KKyAgICAgICAgLWsgIEt1cnpmb3JtIGRlciBMaXN0ZTsgc3RhdHQgUHJlc2F5K1RpdGVsIG51ciBOYW1lLCBkYWZ1ZXIgYWJlcgorICAgICAgICAgICAgR2lsZGUgdW5kIEhlcmt1bmZ0CisKKyBCRVNDSFJFSUJVTkc6CisgICAgRXMgd2lyZCBhbmdlemVpZ3QsIHdlciBzaWNoIGdlcmFkZSBpbSBNb3JnZW5HcmF1ZW4gKG9kZXIgYWx0ZXJuYXRpdiBpbSBNVUQKKyAgICA8bXVkPikgYmVmaW5kZXQuIERhcyBGb3JtYXQgZGVyIExpc3RlIGZyZW1kZXIgTVVEcyBoYWVuZ3QgaW1tZXIgdm9uIGRlbQorICAgIGpld2VpbGlnZW4gTVVEIGFiOyBpbiBkZXIgTGlzdGUgZGVzIE1vcmdlbkdyYXVlbiB3aXJkIGplZGVyIEFud2VzZW5kZSB3aWUKKyAgICBmb2xndCBhdWZnZWZ1ZWhydDoKKworICAgIFtYXSBQcmVzYXkgTmFtZSBUaXRlbCAtIFJhc3NlL0dpbGRlCisKKyAgICBEaWUgQnVjaHN0YWJlbiBpbiBlY2tpZ2VuIEtsYW1tZXJuIGFtIEFuZmFuZyBiZWRldXRlbjoKKworICAgICBbc10gICBTcGllbGVyCisgICAgIFtTXSAgIFNlaGVyCisgICAgIFt6XSAgIFp3ZWl0c3BpZWxlcgorCisgICAgIFt0XSAgIFRlc3RzcGllbGVyCisgICAgIFtUXSAgIFRlc3RzcGllbGVyIG1pdCBTZWhlcmxldmVsCisKKyAgICAgW0xdICAgTWFnaWVybGVocmxpbmcKKyAgICAgW21dICAgVm9sbG1hZ2llciwgb2huZSBSZWdpb24KKyAgICAgW01dICAgVm9sbG1hZ2llciwgbWl0IFJlZ2lvbgorICAgICBbSF0gICBIaWxmc21hZ2llcgorICAgICBbUl0gICBSZWdpb25zY2hlZgorICAgICBbV10gICBXZWlzZXIKKyAgICAgW0VdICAgRXJ6bWFnaWVyCisgICAgIFtHXSAgIEdvdHQKKworICAgIERpZSBMaXN0ZSB3aXJkIGluIGRyZWkgU2Nocml0dGVuIHNvcnRpZXJ0ICh2b24gZ3JvYiBuYWNoIGZlaW4pOgorICAgIE1hZ2llcmxldmVsIC0+IFNwaWVsZXJsZXZlbCAtPiBhbHBoYWJldGlzY2guCisKKyBTSUVIRSBBVUNIOgorICAgIGt3ZXIsIGtrd2VyLCBtdWRzCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFdlZCwgMDUuMDQuMjAwMCwgMDE6MDA6MDAgdm9uIFRpYW1hawpkaWZmIC0tZ2l0IGEvZG9jL3BjbWQvd2lyZiBiL2RvYy9wY21kL3dpcmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFlNTU1ZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wY21kL3dpcmYKQEAgLTAsMCArMSwyNSBAQAorCit3aXJmICh3ZWcpCistLS0tLS0tLS0tCisKKyBLT01NQU5ETzoKKyAgICB3aXJmIDxvYmpla3Q+IHdlZworICAgIHdpcmYgYWxsZXMgd2VnCisgICAgbGFzcyA8b2JqZWt0PiBmYWxsZW4KKyAgICBsYXNzIGFsbGVzIGZhbGxlbgorCisgQVJHVU1FTlRFOgorCisgICAgIDxvYmpla3Q+CisgICAgICAgIERhcyB3ZWd6dXdlcmZlbmRlIE9iamVrdAorCisgQkVTQ0hSRUlCVU5HOgorICAgIE1pdCBkaWVzZW0gS29tbWFuZG8ga2FubnN0IER1IEdlZ2Vuc3RhZW5kZSBhdXMgRGVpbmVtIEJlc2l0eiB3aWVkZXIKKyAgICBsb3N3ZXJkZW4uIEFsbGVyZGluZ3MgbGFzc2VuIHNpY2ggbWFuY2hlIEdlZ2Vuc3RhZW5kZSBuaWNodCBzbyBvaG5lCisgICAgd2VpdGVyZXMgd2VnbGVnZW4hCisKKyBTSUVIRSBBVUNIOgorICAgIHN0ZWNrZSAoaW4pLCBuaW1tIFthdXNdCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFRodSwgMjQuMDcuMTk5NywgMDk6MDA6MDAgdm9uIFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL3BjbWQvemVpbGVuIGIvZG9jL3BjbWQvemVpbGVuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNTU5NDEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcGNtZC96ZWlsZW4KQEAgLTAsMCArMSw0MSBAQAorCit6ZWlsZW4KKy0tLS0tLQorCisgS09NTUFORE86CisgICAgemVpbGVuIFs8emFobD5dCisgICAgemVpbGVuIGF1dG9bIC08emFobD5dCisgICAgemVpbGVuIGFic1tvbHV0XSB8IHJlbFthdGl2XQorCisgQVJHVU1FTlRFOgorCisgICAgIDx6YWhsPgorICAgICAgICBFaW5lIGdhbnplIFphaGwgendpc2NoZW4gMCB1bmQgMTAwCisKKyBCRVNDSFJFSUJVTkc6CisgICAgSGllcm1pdCBrYW5uIG1hbiBkaWUgQW56YWhsIGRlciBaZWlsZW4gZWluc3RlbGxlbiwgbmFjaCBkZXIgZWluIGBtb3JlJworICAgICh6LkIuIGluIGRlciBUb3BsaXN0ZSkgYW5oYWVsdC4KKworICAgIEJlaSAwIGhhZWx0IGRhcyBgbW9yZScgbmljaHQgYW4uCisKKyAgICBNaXQgZGVyIEVpbnN0ZWxsdW5nIGBhdXRvJyB3aXJkIGRpZSBaZWlsZW56YWhsIGF1dG9tYXRpc2NoIGVybWl0dGVsdCwKKyAgICBzb2Zlcm4gRGVpbiBUZWxuZXQgZGllcyB1bnRlcnN0dWV0enQgKHNpZWhlIGF1Y2ggYGhpbGZlIHRlbG5lZ3MnKS4KKyAgICBVbSBuYWNoIGRlbSBgbW9yZScgbm9jaCBldHdhcyBQbGF0eiB6dSBoYWJlbiwga2FubiBtYW4gei5CLiBtaXQKKyAgICBgemVpbGVuIGF1dG8gLTMnIGRpZSBaZWlsZW56YWhsIGJlaSBhdXRvbWF0aXNjaGVyIEVpbnN0ZWxsdW5nIHZlcmtsZWluZXJuLgorCisgICAgTWl0IGB6ZWlsZW4nIHdpcmQgZGVyIGRlcnplaXRpZyBlaW5nZXN0ZWxsdGUgV2VydCBhbmdlemVpZ3QuCisgICAgRGVmYXVsdG1hZXNzaWcgaXN0IDx6YWhsPiBhdWYgMjAgZ2VzZXR6dC4KKworICAgIE5vcm1hbGVyd2Vpc2Ugd2lyZCBpbiBkZXIgUHJvbXB0emVpbGUgZGVzIGBtb3JlJyBlaW5lIHJlbGF0aXZlIEFuZ2FiZQorICAgIGdlbWFjaHQsIHdpZXZpZWwgUHJvemVudCBkZXMgVGV4dGVzIG1hbiBzY2hvbiBnZXNlaGVuIGhhdC4gTWl0CisgICAgYHplaWxlbiBhYnNvbHV0JyAoYXVjaCBhbHMgYHplaWxlbiBhYnMnIGFia3VlcnpiYXIpIGthbm4gbWFuIGF1ZiBlaW5lCisgICAgYWx0ZXJuYXRpdmUgRGFyc3RlbGx1bmcgdW1zY2hhbHRlbi4gRGFiZWkgd2VyZGVuIGRpZSBOdW1tZXIgZGVyIHVudGVyc3RlbgorICAgIGFuZ2V6ZWlndGVuIFplaWxlIHNvd2llIGRpZSBHZXNhbXR6ZWlsZW56YWhsIGRlcyBUZXh0ZXMgYW5nZXplaWd0LgorCisgICAgTWl0IGB6ZWlsZW4gcmVsJyBrYW5uIG1hbiB3aWVkZXIgYXVmIGRpZSByZWxhdGl2ZSBBbnplaWdlIHp1cnVlY2tzY2hhbHRlbi4KKworIFNJRUhFIEFVQ0g6CisgICAgdGVsbmVncworCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBTdW4sIDA3LjExLjE5OTksIDIzOjMwOjAwIHZvbiBUaWFtYWsKZGlmZiAtLWdpdCBhL2RvYy9wY21kL3plaXQgYi9kb2MvcGNtZC96ZWl0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxOWM4ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcGNtZC96ZWl0CkBAIC0wLDAgKzEsMTcgQEAKKworemVpdAorLS0tLQorCisgS09NTUFORE86CisgICAgemVpdAorCisgQVJHVU1FTlRFOgorICAgIGtlaW5lCisKKyBCRVNDSFJFSUJVTkc6CisgICAgRGllIGFrdHVlbGxlIFVocnplaXQgc2FtdCBEYXR1bSB3aXJkIGF1c2dlZ2ViZW4uCisKKyBRVUVSVkVSV0VJU0U6IHVocm1lbGR1bmcsIHplaXR6b25lCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFNhdCBKdWwgIDYgMTQ6MDQ6NDIgMjAwMiB2b24gQmFtYmkuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL3BjbWQvemVpdHpvbmUgYi9kb2MvcGNtZC96ZWl0em9uZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzE2OTRiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BjbWQvemVpdHpvbmUKQEAgLTAsMCArMSw0NSBAQAorCit6ZWl0em9uZQorLS0tLS0tLS0tLQorCisgS09NTUFORE86CisgICAgemVpdHpvbmUgWzx6ZWl0ZGlmZmVyZW56Pl0KKworIEFSR1VNRU5URToKKworICAgICA8emVpdGRpZmZlcmVuej4KKyAgICAgICAgRW50d2VkZXI6IEVpbiBnYW56emFobGlnZXIgV2VydCwgZGVyIGRlbiBaZWl0dW50ZXJzY2hpZWQgendpc2NoZW4KKyAgICAgICAgICAgICAgICAgIERlaW5lciBaZWl0em9uZSB1bmQgQmVybGluIGluIFN0dW5kZW4gYW5naWJ0LgorICAgICAgICBPZGVyOiBVVEMgKy8taSAgIERlaW5lIFplaXR6b25lIGltIEJlenVnIGF1ZiBkaWUga29vcmRpbmllcnRlCisgICAgICAgICAgICAgICAgICAgICAgICAgV2VsdHplaXQgVVRDLgorCisgQkVTQ0hSRUlCVU5HOgorICAgIE9obmUgQXJndW1lbnRlIHdpcmQgRGVpbmUgYWt0dWVsbGUgWmVpdHpvbmUgYW5nZXplaWd0LgorCisgICAgTWl0IGRlbSBBcmd1bWVudCA8emVpdGRpZmZlcmVuej4ga2FubiBtYW4gZGllIGVpZ2VuZSBaZWl0em9uZQorICAgIGVpbnN0ZWxsZW4uIERpZXNlIFplaXRkaWZmZXJlbnogd2lyZCBiZWkgZGVyIHN0dWVuZGxpY2hlbiBVaHJtZWxkdW5nCisgICAgdW5kIGJlaW0gQmVmZWhsICh1aHIpemVpdCBiZXJ1ZWNrc2ljaHRpZ3QuCisKKyBCRUlTUElFTEU6CisKKyAgICA+IHplaXR6b25lIFVUQyAwCisgICAgCisgICAgU29sbHRlIG1hbiBhbmdlYmVuLCB3ZW5uIG1hbiBpbiBMb25kb24gd29obnQuCisgICAgCisgICAgPiB6ZWl0em9uZSBVVEMgLTEwCisgICAgCisgICAgU29sbHRlIG1hbiBhbmdlYmVuLCB3ZW5uIG1hbiBhdWYgSGF3YWlpIHdvaG50LgorICAgIAorICAgID4gemVpdHpvbmUgMAorICAgIAorICAgIElzdCBkaWUgU3RhbmRhcmQtRWluc3RlbGx1bmcgdW5kIGVudHNwcmljaHQgZGVyIGdsZWljaGVuIFplaXR6b25lCisgICAgd2llIEJlcmxpbi4KKyAKKyBBTk1FUktVTkdFTjoKKyAgICBEaWUgbWl0ICJ6ZWl0em9uZSIgYW5nZWdlYmVuZW4gWmVpdHpvbmVuIGJlcnVlY2tzaWNodGlnZW4ga2VpbmUgbG9rYWxlbgorICAgIFNvbW1lcnplaXRlbiAtIHVudGVyIGFuZGVyZW0sIHdlaWwgZGllIHNlaHIgbGFlbmRlcnNwZXppZmlzY2ggc2luZC4gWnVkZW0KKyAgICBzaW5kIGtlaW5lIGhhbGJlbiBTdHVuZGVuIFplaXR1bnRlcnNjaGllZGUgYmVydWVja3NpY2h0aWd0LCB3aWUgc2llIGluCisgICAgZWluaWdlbiBhdXN0cmFsaXNjaGVuIFRlcnJpdG9yaWVuIHVlYmxpY2ggc2luZC4KKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgU2F0LCAzMC4wOS4yMDAwLCAyMTowMDowMCB2b24gU2lsdmFuYQpkaWZmIC0tZ2l0IGEvZG9jL3BjbWQvemllaGUgYi9kb2MvcGNtZC96aWVoZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDc2NmUxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BjbWQvemllaGUKQEAgLTAsMCArMSwyOSBAQAorCit6aWVoZQorLS0tLS0KKworIEtPTU1BTkRPOgorICAgIHppZWhlIDxrbGVpZHVuZz4gYW4gfCBhdXMKKyAgICB6aWVoZSA8d2FmZmU+IGhlcnZvcgorCisgQVJHVU1FTlRFOgorCisgICAgIDxrbGVpZHVuZz4KKyAgICAgICAgRWluIEtsZWlkdW5nc3N0dWVjaworICAgICA8d2FmZmU+CisgICAgICAgIEVpbmUgV2FmZmUKKworIEJFU0NIUkVJQlVORzoKKyAgICBgemllaGUgKGFuL2F1cyknIGlzdCBkYXMgYWxsZ2VtZWluZSBLb21tYW5kbywgdW0gS2xlaWR1bmcgYW4tIHVuZAorICAgIGFienVsZWdlbi4gUm9idXN0ZSBLbGVpZHVuZyBiaWV0ZXQgbnVyIGRhbm4gU2NodXR6IGdlZ2VuIEFuZ3JpZmZlLCB3ZW5uCisgICAgc2llIGFuZ2V6b2dlbiB3dXJkZS4KKworICAgIGB6aWVoZSAoaGVydm9yKScgaXN0IGRhcyBhbGxnZW1laW5lIEtvbW1hbmRvLCB1bSBlaW5lIFdhZmZlIHp1bSBLYW1wZiBpbgorICAgIGRpZSBIYW5kIHp1IG5laG1lbjsgbnVyIHdlbm4gZGllIFdhZmZlIGhlcnZvcmdlem9nZW4gd3VyZGUsIHdpcmQgc2llIGltCisgICAgS2FtcGYgenVtIEFuZ3JpZmYgZWluZ2VzZXR6dC4KKworIFNJRUhFIEFVQ0g6CisgICAgdHJhZ2UsIHp1ZWNrZSwgc3RlY2tlICh3ZWcpCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFRodSwgMjQuMDcuMTk5NywgMDk6MDA6MDAgdm9uIFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL3BjbWQvenVlY2tlIGIvZG9jL3BjbWQvenVlY2tlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMTQwZTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcGNtZC96dWVja2UKQEAgLTAsMCArMSwyMyBAQAorCit6dWVja2UKKy0tLS0tLQorCisgS09NTUFORE86CisgICAgenVlY2tlIDx3YWZmZT4KKworIEFSR1VNRU5URToKKworICAgICA8d2FmZmU+CisgICAgICAgIEVpbmUgV2FmZmUKKworIEJFU0NIUkVJQlVORzoKKyAgICBgenVlY2tlJyBpc3QgZGFzIGFsbGdlbWVpbmUgS29tbWFuZG8sIHVtIGVpbmUgV2FmZmUgenVtIEthbXBmIGluIGRpZSBIYW5kCisgICAgenUgbmVobWVuOyBudXIgd2VubiBkaWUgV2FmZmUgZ2V6dWVja3Qgd3VyZGUsIHdpcmQgc2llIGltIEthbXBmIHp1bQorICAgIEFuZ3JpZmYgZWluZ2VzZXR6dC4gRXMga2FubiBpbW1lciBudXIgZWluZSBXYWZmZSBpbSBLYW1wZiBlaW5nZXNldHp0CisgICAgd2VyZGVuLiBTY2h3ZXJlIFdhZmZlbiBrb2VubmVuIGF1Y2ggYmVoaW5kZXJuLgorCisgU0lFSEUgQVVDSDoKKyAgICB6aWVoZSAoYW4vYXVzKSwgc3RlY2tlICh3ZWcvenVydWVjaykKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgVGh1LCAyNC4wNy4xOTk3LCAwOTowMDowMCB2b24gV2FyZ29uCmRpZmYgLS1naXQgYS9kb2MvcGNtZC96d2VpdGllbWFya2llcnVuZyBiL2RvYy9wY21kL3p3ZWl0aWVtYXJraWVydW5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhOTA2ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcGNtZC96d2VpdGllbWFya2llcnVuZwpAQCAtMCwwICsxLDMwIEBACitLT01NQU5ETzoKKyAgICAgICAgWndlaXRpZW1hcmtpZXJ1bmcgW1N0YXR1c10KKworQVJHVU1FTlRFOgorICAgICAgICBTdGF0dXMKKyAgICAgICAgICBIaWVyIGdpYnQgbWFuIGFuLCBvYiB1bmQgd2llIFNwaWVsZXIgamVtYW5kZW4gYWxzIFp3ZWl0aWUKKyAgICAgICAgICBlcmtlbm5lbjoKKyAgICAgICAgICAqIHVuc2ljaHRiYXIgLSBrZWluIFNwaWVsZXIgc2llaHQsIG9iIG1hbiBad2VpdGllIGlzdAorICAgICAgICAgICogc2ljaHRiYXIgICAtIFNwaWVsZXIgc2llaHQsIGRhc3MgbWFuIFp3ZWl0aWUgaXN0LCBhYmVyIG5pY2h0CisgICAgICAgICAgICAgICAgICAgICAgICAgIHdlc3NlbiBad2VpdGllIG1hbiBpc3QKKyAgICAgICAgICAqIE5hbWUgICAgICAgLSBhbGxlIFNwaWVsZXIgc2VoZW4sIHdlc3NlbiBad2VpdGllIG1hbiBpc3QKKworQkVTQ0hSRUlCVU5HOgorICAgICAgICBKZWRlciBTcGllbGVyIGltIE1VRCBpc3QgdmVycGZsaWNodGV0LCBzZWluZSBad2VpdGllcyB6dSBtYXJraWVyZW4sCisgICAgICAgIHVtIGRhbWl0IFZlcmFudHdvcnRsaWNoa2VpdGVuIGJlc3NlciB6dW9yZG5lbiB6dSBrb2VubmVuLgorICAgICAgICBFcyBpc3QgamVkb2NoIG5pY2h0IG5vZXRpZywgZGFzcyBhbmRlcmUgU3BpZWxlciBkaWVzZSBJbmZvcm1hdGlvbgorICAgICAgICBlcmhhbHRlbiwgZGEgZGllcyBudXIgZnVlciBNYWdpZXIgaW50ZXJlc3NhbnQgaXN0LiBEaWVzZXIgQmVmZWhsCisgICAgICAgIGVybW9lZ2xpY2h0IGVzIG51biwgZGllc2UgSW5mb3JtYXRpb24gdm9yIGFuZGVyZW4gU3BpZWxlcm4gZ2FueiBvZGVyCisgICAgICAgIGF1Y2ggbnVyIHRlaWx3ZWlzZSB6dSB2ZXJiZXJnZW4uCisgICAgICAgIE1hbiBrYW5uIGFuZ2ViZW4sIG9iIG1hbiBhbHMgWndlaXRpZSBlcmthbm50IHdpcmQgdW5kIG9iIHNvZ2FyCisgICAgICAgIGVya2FubnQgd2lyZCwgd2Vzc2VuIFp3ZWl0aWUgbWFuIGlzdC4KKyAgICAgICAgRGllIFN0YW5kYXJkZWluc3RlbGx1bmcgaXN0IGhpZXJiZWksIGRhc3MgYW5kZXJlIFNwaWVsZXIgZXJrZW5uZW4sCisgICAgICAgIG9iIG1hbiBad2VpdGllIGlzdCwgbmljaHQgamVkb2NoLCB3ZXNzZW4gWndlaXRpZSBtYW4gaXN0LgorCitTSUVIRSBBVUNIOgorICAgICAgICByZWdlbG4sIFp3ZWl0c3BpZWxlciwgVGVzdHNwaWVsZXIsIE1hZ2llcgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBTb24sIDI3LiBPa3QgMjAwMiwgMTA6MDA6MDAsIFZhbmlvbgorCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvLnN2bi1jb21taXQudG1wLnN3cCBiL2RvYy9wcm9wcy8uc3ZuLWNvbW1pdC50bXAuc3dwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MzFlN2QKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvLnN2bi1jb21taXQudG1wLnN3cApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvLnN5bm9ueW0gYi9kb2MvcHJvcHMvLnN5bm9ueW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMzYjczYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy8uc3lub255bQpAQCAtMCwwICsxLDU0IEBACithdXRvYXR0YWNrIFBfQUdHUkVTU0lWRQorUF9BVVRPQVRUQUNLIFBfQUdHUkVTU0lWRQoraG9jaHplaXQgUF9NQVJSSUVECitTSV9TS0lMTEZVTkMgc2tpbGxfaW5mb19saXN0ZQorU0lfQ0xPU1VSRSBza2lsbF9pbmZvX2xpc3RlCitTSV9TS0lMTEFCSUxJVFkgc2tpbGxfaW5mb19saXN0ZQorU0lfU0tJTExEQU1BR0VfVFlQRSBza2lsbF9pbmZvX2xpc3RlCitTSV9TS0lMTERBTUFHRV9NU0cgc2tpbGxfaW5mb19saXN0ZQorU0lfU0tJTExEQU1BR0VfTVNHMiBza2lsbF9pbmZvX2xpc3RlCitTSV9JTkhFUklUIHNraWxsX2luZm9fbGlzdGUKK1NJX0RJRkZJQ1VMVFkgc2tpbGxfaW5mb19saXN0ZQorU0lfTEFTVExJR0hUIHNraWxsX2luZm9fbGlzdGUKK1NJX1RFU1RGTEFHIHNraWxsX2luZm9fbGlzdGUKK1NJX0dVSUxEIHNraWxsX2luZm9fbGlzdGUKK1NJX0VORU1ZIHNraWxsX2luZm9fbGlzdGUKK1NJX0ZSSUVORCBza2lsbF9pbmZvX2xpc3RlCitTSV9NQUdJQ19UWVBFIHNraWxsX2luZm9fbGlzdGUKK1NJX0xBU1RfVVNFIHNraWxsX2luZm9fbGlzdGUKK1NJX0xFQVJOX1BST0Igc2tpbGxfaW5mb19saXN0ZQorU0lfU0tJTExEVVJBVElPTiBza2lsbF9pbmZvX2xpc3RlCitTSV9TUEVMTEJPT0sgc2tpbGxfaW5mb19saXN0ZQorU01fUkFDRSBza2lsbF9pbmZvX2xpc3RlCitTSV9TUEVMTENPU1Qgc2tpbGxfaW5mb19saXN0ZQorU0lfVElNRV9NU0cgc2tpbGxfaW5mb19saXN0ZQorU0lfU1BfTE9XX01TRyBza2lsbF9pbmZvX2xpc3RlCitTSV9QUkVQQVJFX01TRyBza2lsbF9pbmZvX2xpc3RlCitTSV9QUkVQQVJFX0JVU1lfTVNHIHNraWxsX2luZm9fbGlzdGUKK1NJX1BSRVBBUkVfQUJPUlRfTVNHIHNraWxsX2luZm9fbGlzdGUKK1NJX05PTUFHSUMgc2tpbGxfaW5mb19saXN0ZQorU0lfTk9NQUdJQ19NU0cgc2tpbGxfaW5mb19saXN0ZQorU0lfU1BFTExGQVRJR1VFIHNraWxsX2luZm9fbGlzdGUKK1NJX1hfU1BFTExGQVRJR1VFIHNraWxsX2luZm9fbGlzdGUKK1NJX1NLSUxMTEVBUk4gc2tpbGxfaW5mb19saXN0ZQorU0lfTEVBUk5fQVRUUklCVVRFIHNraWxsX2luZm9fbGlzdGUKK1NJX1NLSUxMQVJHIHNraWxsX2luZm9fbGlzdGUKK1NJX1NLSUxMUkVTVFJfVVNFIHNraWxsX2luZm9fbGlzdGUKK1NJX1NLSUxMUkVTVFJfTEVBUk4gc2tpbGxfaW5mb19saXN0ZQorU0lfU0tJTExJTkZPIHNraWxsX2luZm9fbGlzdGUKK1NJX1NLSUxMSU5GT19MT05HIHNraWxsX2luZm9fbGlzdGUKK1NJX1NLSUxMREFNQUdFIHNraWxsX2luZm9fbGlzdGUKK1NJX1NLSUxMREFNQUdFX0JZX1JPVyBza2lsbF9pbmZvX2xpc3RlCitTSV9TUEVMTCBza2lsbF9pbmZvX2xpc3RlCitTSV9DT0xMQVRFUkFMX0RBTUFHRSBza2lsbF9pbmZvX2xpc3RlCitTSV9OVU1CRVJfRU5FTUlFUyBza2lsbF9pbmZvX2xpc3RlCitTSV9OVU1CRVJfRlJJRU5EUyBza2lsbF9pbmZvX2xpc3RlCitTSV9ESVNUQU5DRSBza2lsbF9pbmZvX2xpc3RlCitTSV9XSURUSCBza2lsbF9pbmZvX2xpc3RlCitTSV9ERVBUSCBza2lsbF9pbmZvX2xpc3RlCitTSV9TS0lMTEhFQUwgc2tpbGxfaW5mb19saXN0ZQorU0lfVVNSIHNraWxsX2luZm9fbGlzdGUKK1NJX1BSRVBBUkVfVElNRSBza2lsbF9pbmZvX2xpc3RlCitTSV9BVFRBQ0tfQlVTWV9NU0cgc2tpbGxfaW5mb19saXN0ZQorU0lfTk9fQVRUQUNLX0JVU1kgc2tpbGxfaW5mb19saXN0ZQorU0lfQVRUQUNLX0JVU1lfQU1PVU5UIHNraWxsX2luZm9fbGlzdGUKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0FCSUxJVElFUyBiL2RvYy9wcm9wcy9QX0FCSUxJVElFUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODJhMGY2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfQUJJTElUSUVTCkBAIC0wLDAgKzEsOSBAQAorTkFNRToKKyAgICBQX0FCSUxJVElFUyAgICAgICAgICAgICAgICAgICAiYWJpbGl0aWVzIiAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvbGl2aW5nL2F0dHJpYnV0ZXMuaAorCitCRVNDSFJFSUJVTkc6CisgICAgICoqKiBPQlNPTEVUISAqKioKKyAgICAgU2llaGUgUF9ORVdTS0lMTFMuCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9BQyBiL2RvYy9wcm9wcy9QX0FDCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MmQ3ODYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9BQwpAQCAtMCwwICsxLDI4IEBACitQX0FDCisKK05BTUU6CisgICAgIFBfQUMgImFjIgorCitERUZJTklFUlQgSU46CisgICAgIDxhcm1vdXIuaD4KKworQkVTQ0hSRUlCVU5HOgorICAgICBEaWVzZSBQcm9wZXJ0eSBiZXNjaHJlaWJ0IGRpZSBSdWVzdHVuZ3NrbGFzc2UgKGVuZ2w6IGFybW91ciBjbGFzcyksCisgICAgIGFsc28gZGVuIFNjaHV0eiwgZGVuIGRpZSBSdWVzdHVuZyBkZW0gVHJhZWdlciB2ZXJsZWlodC4gSmUgaG9laGVyIGRlcgorICAgICBXZXJ0IChhbHMgWmFobCksIHVtIHNvIGJlc3NlciBpc3QgZGllIFJ1ZXN0dW5nLiBOZWdhdGl2ZSBXZXJ0ZSBiZXdpcmtlbgorICAgICBuZWdhdGl2ZW4gU2NodXR6LCBkLmguIGRlciBTY2hhZGVuIHdpcmQgdmVyZ3JvZXNzZXJ0IHN0YXR0IHZlcnJpbmdlcnQuCisKK0JFTUVSS1VOR0VOOgorICAgICBRdWVyeS0gdW5kIFNldG1ldGhvZGVuIGF1ZiBQX0FDIHNvbGx0ZW4gdW5iZWRpbmd0IHZlcm1pZWRlbiB3ZXJkZW4uIFNpZQorICAgICBmdWVocmVuIGluIGRlciBSZWdlbCB6dSBtYXNzaXZlbiBJbmtvbnNpc3RlbnplbiBpbSBNZWNoYW5pc211cyBkZXIKKyAgICAgUnVlc3R1bmdzYmVzY2hhZWRpZ3VuZyB1bmQgLXJlcGFyYXR1ci4KKyAgICAgRnVlciBqZWRlbiBSdWVzdHVuZ3N0eXAgaXN0IGluIDxjb21iYXQuaD4gZWluZSBPYmVyZ3JlbnplIGRlZmluaWVydCwKKyAgICAgZGllIG1hbiBuaWNodCB1ZWJlcnNjaHJlaXRlbiBkYXJmLgorICAgICBSdWVzdHVuZ2VuIHZvbSBUeXAgQVRfTUlTQyBoYWJlbiBpbW1lciBBQyAwIHVuZCB3ZXJkZW4gbWl0IGtlaW5lbiAKKyAgICAgaG9laGVyZW4gV2VydGVuIGdlbmVtaWd0LgorCitTSUVIRSBBVUNIOgorICAgICAvc3RkL2FybW91ci5jLCBQX0RBTUFHRUQsIERhbWFnZSgpIFBfVE9UQUxfQUMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMDIuMTAuMjAwNywgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfQUNDRVBUX1BFQUNFIGIvZG9jL3Byb3BzL1BfQUNDRVBUX1BFQUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YjYzYTAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9BQ0NFUFRfUEVBQ0UKQEAgLTAsMCArMSwxOCBAQAorUFJPUEVSVFkKKyAgICAgUF9BQ0NFUFRfUEVBQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWNjZXB0X3BlYWNlIgorCitERUZJTklFUlQgSU4gCisJL3N5cy9jb21iYXQuaAorCitCRVNDSFJFSUJVTkcKKwlNaXR0ZWxzIHNldHplbiBEaWVzZXIgUHJvcCBsYXNzZW4gc2ljaCBsZWljaHQgTlBDcyBiYXVlbiwKKwlkaWUgdm9uIGplZGVtIHp1IGJlZnJpZWRlbiBzaW5kLiBXZW5uIGRpZSBQcm9wZXJ0eSA9PSAxIGlzdCwKKwlpc3QgZGVyIE5QQyBpbW1lciB3aWVkZXIgYmVmcmllZGJhciwgc29uc3QgZnVlaHJ0IGRlciBOUEMgZGFzCisJdWVibGljaGUgVmVyaGFsdGVuIGF1cy4KKworU0lFSEUgQVVDSAorICBRdWVyeVBhY2lmeSgpLAorICBQX1BFQUNFX0hJU1RPUlkKKworTEVUWlRFIEFFTkRFUlVORworMDEuMDUuMjAwOCwgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfQUNIQVRTIGIvZG9jL3Byb3BzL1BfQUNIQVRTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwOTc2MjAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9BQ0hBVFMKQEAgLTAsMCArMSw4IEBACitOQU1FOgorICAgIFBfQUNIQVRTICAgICAgICAgICAgICAgICAgICAgICJhY2hhdHMiICAgICAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9wcm9wZXJ0aWVzLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBDaGF0cywgZGllIGRhcyBNb25zdGVyIGltIEthbXBmIGF1c2dpYnQuCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9BQ0hBVF9DSEFOQ0UgYi9kb2MvcHJvcHMvUF9BQ0hBVF9DSEFOQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNjZGYxNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0FDSEFUX0NIQU5DRQpAQCAtMCwwICsxLDggQEAKK05BTUU6CisgICAgUF9BQ0hBVF9DSEFOQ0UgICAgICAgICAgICAgICAgImFjaGF0X2NoYW5jZSIgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3Byb3BlcnRpZXMuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIFdhaHJzY2hlaW5saWNoa2VpdCBmdWVyIGRpZSBBdHRhY2stQ2hhdC1BdXNnYWJlLgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfQUNUVUFMX05PVElGWV9GQUlMIGIvZG9jL3Byb3BzL1BfQUNUVUFMX05PVElGWV9GQUlMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNWE2NDYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9BQ1RVQUxfTk9USUZZX0ZBSUwKQEAgLTAsMCArMSwyNyBAQAorKioqKioqKioqKioqKioqKioqKioqKiBWRVJBTFRFVEUgUFJPUEVSVFkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitOQU1FOgorICAgICBQX0FDVFVBTF9OT1RJRllfRkFJTCAgICAgICAgICAiYWN0dWFsX25vdGlmeV9mYWlsIiAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgICAvc3lzL3BsYXllci5oCisKK0FDSFRVTkc6CisgICAgIERpZXNlIFByb3Agd2lyZCBuaWNodCBtZWhyIGdlc2V0enQgKHVuZCBhdWNoIG5pY2h0IG1laHIgYWJnZWZyYWd0KSwgZGEgTEQKKyAgICAgZWluZSBlZnVuIGhhdCwgdW0gZGFzIE9iamVrdCB6dSBlcm1pdHRlbG4sIHdhcyBhbHMgbGV0enRlcyBlaW4KKyAgICAgbm90aWZ5X2ZhaWwoKSBnZXNldHp0IGhhdCwgZWluIFNwZWljaGVybiBpbSBTcGllbGVyIGFsc28gdm9lbGxpZworICAgICB1ZWJlcmZsdWVzc2lnIGlzdC4KKworQkVTQ0hSRUlCVU5HOgorICAgICBJc3QgaW0gU3BpZWxlcm9iamVrdCAgZ2VzZXR6dCB1bmQgZW50aGFlbHQgZGFzIE9iamVrdCwgd2VsY2hlcyB6dWxldHp0CisgICAgIGVpbmUgRmVobGVybWVsZHVuZyBtaXQgbm90aWZ5X2ZhaWwoKS9fbm90aWZ5X2ZhaWwoKSBlcmZvbGdyZWljaAorICAgICB3YWVocmVuZCBkZXMgYWt0dWVsbGVuIEtvbW1hbmRvcyBhYmdlc3BlaWNoZXJ0IGhhdC4KKworQkVNRVJLVU5HRU46CisgICAgIERpZW50IGRhenUsIGJlaSBfbm90aWZ5X2ZhaWwoKSB6dSB1ZWJlcnBydWVmZW4sIG9iIHNjaG9uIHZvcmhlciBlaW5lCisgICAgIEZlaGxlcm1lbGR1bmcgZ2VzZXR6dCB3dXJkZS4KKworU0lFSEUgQVVDSDoKKyAgICAgQWRkQ21kKCksIGFkZF9hY3Rpb24oKQorICAgICBub3RpZnlfZmFpbCgpLCBfbm90aWZ5X2ZhaWwoKQorCisxMC4wMy4yMDA3LCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9BREpFQ1RJVkVTIGIvZG9jL3Byb3BzL1BfQURKRUNUSVZFUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjQ0YTRmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfQURKRUNUSVZFUwpAQCAtMCwwICsxLDIyIEBACitQX0FESkVDVElWRVMKKworTkFNRToKKyAgICAgUF9BREpFQ1RJVkVTICJhZGplY3RpdmVzIgorCitERUZJTklFUlQgSU46CisgICAgIDx0aGluZy9kZXNjcmlwdGlvbi5oPgorCitCRVNDSFJFSUJVTkc6CisgICAgIEhpZXIgc3RlaHQgZWluIEFycmF5IHZvbiBTdHJpbmdzLCB3ZWxjaGUgZGllIElkZW50aWZpemllcnVuZyBkZXMKKyAgICAgT2JqZWt0ZXMgZXJnYWVuemVuLiBEaWUgVmVyd2FsdHVuZyBlcmZvbGd0IHVlYmVyIGRpZSBGdW5rdGlvbmVuCisgICAgIEFkZEFkamVjdGl2ZSgpIHVuZCBSZW1vdmVBZGplY3RpdmUoKS4KKworQkVNRVJLVU5HRU46CisgICAgIE1hbiBzb2xsdGUgYW4gZGllc2VyIFByb3BlcnR5IG5pY2h0ICJ2b24gSGFuZCIgaGVydW1mdW1tZWxuLCBzb25kZXJuCisgICAgIGltbWVyIGRpZSB6dWdlaG9lcmlnZW4gRnVua3Rpb25lbiBiZW51dHplbiEKKworU0lFSEUgQVVDSDoKKyAgICAgL3N0ZC90aGluZy9kZXNjcmlwdGlvbi5jLCBBZGRBZGplY3RpdmUoKSwgUmVtb3ZlQWRqZWN0aXZlKCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogU3VuIE1heSAxOSAyMDoyMjoyNCAxOTk2IGJ5IFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfQUVSSUFMX0hFTFBFUlMgYi9kb2MvcHJvcHMvUF9BRVJJQUxfSEVMUEVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjA2ODg0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfQUVSSUFMX0hFTFBFUlMKQEAgLTAsMCArMSw0NSBAQAorUF9BRVJJQUxfSEVMUEVSUworCitOQU1FOgorICAgICBQX0FFUklBTF9IRUxQRVJTICJsaWJfcF9hZXJpYWxfaGVscGVycyIKKworREVGSU5JRVJUIElOOgorICAgICA8bGl2aW5nL2hlbHBlcnMuaD4KKworQkVTQ0hSRUlCVU5HOgorICAgICBEaWVzZSBQcm9wZXJ0eSBrYW5uIGluIGFsbGVuIExlYmV3ZXNlbiBhYmdlZnJhZ3Qgd2VyZGVuLCB1bSBkaWUgT2JqZWt0ZQorICAgICB6dSBlcm1pdHRlbG4sIGRpZSBmdWVyIGRpZSBVbnRlcnN0dWV0enVuZyBiZWltIEZsaWVnZW4vU2VnZWxuIGJlaSBkaWVzZW0gCisgICAgIExlYmV3ZXNlbiByZWdpc3RyaWVydCBoYWJlbi4gRGllIERhdGVuIHdlcmRlbiBhbHMgTWFwcGluZyBkZXIgZm9sZ2VuZGVuCisgICAgIEZvcm0genVydWVja2dlbGllZmVydDoKKyAgICAgKFsgT2JqZWt0IDogUnVlY2tnYWJld2VydCB2b24gZGVzc2VuIENhbGxiYWNrLU1ldGhvZGUgXSkKKyAgICAgRWluZSBFcmxhZXV0ZXJ1bmcgZGF6dSBmaW5kZXQgc2ljaCBpbiBkZXIgRG9rdW1lbnRhdGlvbiB6dSAKKyAgICAgUmVnaXN0ZXJIZWxwZXJPYmplY3QoKS4KKworQkVNRVJLVU5HRU46CisgICAgIERpZXNlIFByb3BlcnR5IGthbm4gbnVyIGFiZ2VmcmFndCB3ZXJkZW4uCisgICAgIEVzIGlzdCBlcnd1ZW5zY2h0LCBkYXNzIGVudHNwcmVjaGVuZGUsIG5ldSBnZXNjaGFmZmVuZSBTdGVsbGVuIGplZ2xpY2hlIAorICAgICBIZWxmZXIgYWt6ZXB0aWVyZW4sIGRlcmVuIENhbGxiYWNrLU1ldGhvZGUgPjAgenVydWVja2dpYnQuCisKK0JFSVNQSUVMOgorICAgICBVbSB6dSBlcm1pdHRlbG4sIG9iIGRlciBTcGllbGVyIG1pbmRlc3RlbnMgZWluIE9iamVrdCBiZWkgc2ljaCBoYXQsIGRhcyAKKyAgICAgYmVpbSBGbGllZ2VuIGhpbGZ0LCBzdWNodCBtYW4gYWxsZSBPYmpla3RlIGF1cyBkZW0gTWFwcGluZyBoZXJhdXMsIGRpZQorICAgICBlaW5lbiBXZXJ0ID4wIGVpbmdldHJhZ2VuIGhhYmVuIHVuZCBwcnVlZnQgZGVyZW4gQW56YWhsOgorCisgICAgIG1hcHBpbmcgYWVyaWFsID0gdGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKFBfQUVSSUFMX0hFTFBFUlMpOworICAgICBvYmplY3QqIGhlbHBlcnMgPSBmaWx0ZXIoIGFlcmlhbCwgZnVuY3Rpb24gaW50IChvYmplY3QgaCkgeworICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoYWVyaWFsW2hdPjApOyB9KTsKKyAgICAgaWYgKCBzaXplb2YoaGVscGVycykgKSB7CisgICAgICAgdGVsbF9vYmplY3QodGhpc19wbGF5ZXIoKSwgIkR1IGVyaGVic3QgRGljaCBtaXQgSGlsZmUgIisKKyAgICAgICAgIGhlbHBlcnNbMF0tPm5hbWUoV0VTU0VOLDEpKyIgZWxlZ2FudCBpbiBkaWUgTHVlZnRlLlxuIik7CisgICAgIH0KKyAgICAgZWxzZSB7CisgICAgICAgdGVsbF9vYmplY3QodGhpc19wbGF5ZXIoKSwgIkR1IGhhc3QgbmljaHRzIHp1bSBGbGllZ2VuIGJlaSBEaXIuXG4iKTsKKyAgICAgfQorCitTSUVIRSBBVUNIOgorICAgICBNZXRob2RlbjogICAgUmVnaXN0ZXJIZWxwZXJPYmplY3QoTCksIFVucmVnaXN0ZXJIZWxwZXJPYmplY3QoTCkKKyAgICAgUHJvcGVydGllczogIFBfSEVMUEVSX09CSkVDVFMsIFBfQVFVQVRJQ19IRUxQRVJTCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzEyLjAzLjIwMTYsIEFyYXRob3JuCisKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0FHRSBiL2RvYy9wcm9wcy9QX0FHRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDYzODhhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfQUdFCkBAIC0wLDAgKzEsOCBAQAorTkFNRToKKyAgICBQX0FHRSAgICAgICAgICAgICAgICAgICAgICAgICAiYWdlIiAgICAgICAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvbGl2aW5nL2xpZmUuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIEFsdGVyIGRlcyBTcGllbGVycyBpbiBIZWFydC1CZWF0cyAoMSBIQiA9PSAyIFNla3VuZGVuKQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfQUdHUkVTU0lWRSBiL2RvYy9wcm9wcy9QX0FHR1JFU1NJVkUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEwZDk3ZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0FHR1JFU1NJVkUKQEAgLTAsMCArMSwzOSBAQAorTkFNRToKKyAgICBQX0FHR1JFU1NJVkUgICAgICAgICAgICAgICAgICAiYWdncmVzc2l2ZSIgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcHJvcGVydGllcy5oCisKK0JFU0NIUkVJQlVORzoKKwlHZXNldHp0LCB3ZW5uIGRhcyBXZXNlbiB2b24gc2ljaCBhdXMgQW5ncmlmZmUgc3RhcnRldC4KKworCVVlYmxpY2hlcndlaXNlIG5pbW10IG1hbiBhbHMgV2VydCAxLCBtYW4ga2FubiBqZWRvY2ggYXVjaAorCWVpbmVuIGtsZWluZXJlbiBXZXJ0IG5laG1lbiB3ZW5uIGVzIG51ciBtaXQgZWluZXIgYmVzdGltbXRlbgorCVdhaHJzY2hlaW5saWNoa2VpdCBhdXRvbWF0aXNjaCBhbmdyZWlmZW4gc29sbC4KKworCURlciBXZXJ0IHZvbiBTcGllbGVyIHVuZCBNb25zdGVyIHdpcmQgYWRkaWVydCwgdW0genUgZW50c2NoZWlkZW4sCisJb2IgZWluIFNwaWVsZXIgYW5nZWdyaWZmZW4gd2VyZGVuIHNvbGwsCW1hbiBrYW5uIFBfQUdHUkVTU0lWRQorCWFsc28gYXVjaCBiZWkgU3BpZWxlcm4gc2V0emVuLCBzbyBkYXNzIHNpZSB2b24gYWxsZW4gTW9uc3Rlcm4KKwlhbmdlZ3JpZmZlbiB3ZXJkZW4uCisKKwlCZWkgTW9uc3Rlcm4gKHVuZCBOVVIgYmVpIGRpZXNlbikga2FubiBtYW4gaGllciBhdWNoIGVpbiBNYXBwaW5nCisJYW5nZWJlbiwgZGFzIGFscyBLZXlzIE5hbWVuIHZvbiBQcm9wZXJ0aWVzIGRlcyBTcGllbGVycyBlbnRoYWVsdAorCXVuZCBhbHMgVmFsdWVzIE1hcHBpbmdzLCBpbiBkZW5lbiBzdGVodCB3ZWxjaGVyIFdlcnQgYmVpIHdlbGNoZW4KKwlXZXJ0IGZ1ZXIgZGllIFByb3BlcnR5IGdlbm9tbWVuIHdlcmRlbiBzb2xsIChCZWlzcGllbGUgZm9sZ2VuKS4KKwlNaXQgS2V5IDAga2FubiBtYW4gZWluZW4gRGVmYXVsdC1XZXJ0IChzb3dvaGwgaW4gaW5uZXJlbiBNYXBwaW5ncworCXdpZSBhdWNoIGltIGFldXNzZXJlbiBNYXBwaW5nKSBmZXN0bGVnZW4uIERlZmF1bHQtV2VydGUgd2VyZGVuCisJZ2Vub21tZW4sIGZhbGxzIGtlaW5lIGFuZGVyZW4gZ2VzZXR6dCBzaW5kLCBhbHNvIFZvcnNpY2h0IG1pdAorCTAtRWludHJhZWdlbiAoVGlwOiAwLjAgaXN0IGluIExQQyB1bmdsZWljaCAwKS4KKwlCZWkgbWVocmVyZW4gUHJvcGVydGllcyB3ZXJkZW4gYWxsZSBnZXNldHp0ZW4gV2VydGUgZ2VtaXR0ZWx0LgorCitCRUlTUElFTEU6CisJU2V0UHJvcChQX0FHR1JFU1NJVkUsKFtQX1JBQ0U6KFsiWndlcmciOjEsICJFbGYiOjAuMCwgMDowLjVdKV0pKQorCVp3ZXJnZSB3ZXJkZW4gaW1tZXIgYXV0b21hdGlzY2ggYW5nZWdyaWZmZW4sIEVsZmVuIG5pZSB1bmQKKwlhbGxlIGFuZGVyZW4gbWl0IDUwJSBXYWhyc2NoZWlubGljaGtlaXQuCisJTWFuIGJlYWNodGUsIGRhc3MgaGllciAwLjAgZ2Vub21tZW4gd2VyZGVuIG11c3N0ZSBhbnN0ZWxsZSB2b24gMCwKKwl3ZWlsIHNvbnN0IEVsZmVuIGF1Y2ggNTAlIFdhaHJzY2hlaW5saWNoa2VpdCBiZWtvbW1lbiBoYWV0dGVuLgorCisJU2V0UHJvcChQX0FHR1JFU1NJVkUsKFtQX1JBQ0U6KFsiWndlcmciOjAuM10pLAorCSAgICAgICAgICAgICAgICAgICAgICAgUF9HVUlMRDooWyJDaGFvcyI6MC43XSldKSkKKwlad2VyZ2Ugd2VyZGVuIG1pdCAzMCUgV2FocnNjaGVpbmxpY2hrZWl0IGFuZ2VncmlmZmVuLAorCUNoYW90ZW4gbWl0IDcwJSB1bmQgWndlcmctQ2hhb3RlbiBtaXQgNTAlLgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfQUxDT0hPTCBiL2RvYy9wcm9wcy9QX0FMQ09IT0wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMwMDViNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0FMQ09IT0wKQEAgLTAsMCArMSwyMiBAQAorTkFNRToKKyAgICAgUF9BTENPSE9MCQkJImFsY29ob2wiCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N5cy9saXZpbmcvbGlmZS5oCisKK0JFU0NIUkVJQlVORzoKKworICAgICAtIExlYmV3ZXNlbgorICAgICAgIE51bWVyaXNjaGVyIFdlcnQgZnVlciBkZW4gR3JhZCBkZXIgQmV0cnVua2VuaGVpdCBlaW5lcyBMZWJld2VzZW5zLgorICAgICAgIERlciBtYXhpbWFsZSBXZXJ0IHN0ZWh0IGluIFBfTUFYX0FMQ09IT0wuCisKKyAgICAgLSBTcGVpc2VuL0tuZWlwZW4KKyAgICAgICBOdW1lcmlzY2hlciBXZXJ0IGZ1ZXIgZGVuIEdyYWQsIGRlbiBlaW5lIFBvcnRpb24gZGVyIFNwZWlzZSBkZW4KKyAgICAgICBLb25zdW1lbnRlbiBiZXRydW5rZW4gbWFjaHQKKworU0lFSEUgQVVDSDoKKwlQX01BWF9BTENPSE9MLCBQX0FMQ09IT0xfREVMQVksIGNvbnN1bWUsCisJUF9GT09ELCBQX0RSSU5LLCB3aXovZm9vZCwgCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogVGh1IE9jdCAyOCAxMjoxNTowMCAyMDEwIGJ5IENhbGRyYQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0FMQ09IT0xfREVMQVkgYi9kb2MvcHJvcHMvUF9BTENPSE9MX0RFTEFZCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNmQyYzEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9BTENPSE9MX0RFTEFZCkBAIC0wLDAgKzEsMTAgQEAKK05BTUU6CisgICAgUF9BTENPSE9MX0RFTEFZICAgICAgICAgICAgICAgICAiYWxjb2hvbF9kZWxheSIgICAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvbGl2aW5nL2xpZmUuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIEFuemFobCBkZXIgaGVhcnRfYmVhdHMsIGJpcyBQX0FMQ09IT0wgdW0gZWluZW4gUHVua3Qgc2lua3QuCisgICAgIEFlbmRlcnVuZ2VuIGRpZXNlciBQcm9wZXJ0eSBpbiBTcGllbGVybiBiZWR1ZXJmZW4gZGVyIAorICAgICBHZW5laG1pZ3VuZyBkZXMgRU0gZnVlciBCYWxhbmNlLgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfQUxDX0ZVTExfTVNHIGIvZG9jL3Byb3BzL1BfQUxDX0ZVTExfTVNHCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkODRhODYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9BTENfRlVMTF9NU0cKQEAgLTAsMCArMSwyNCBAQAorTkFNRToKKyAgICAgUF9BTENfRlVMTF9NU0cgICAgICAgICAgICAgICAgInN0ZF9mb29kX2FsY19mdWxsX21zZyIKKworREVGSU5JRVJUIElOOgorICAgICA8c3lzL2Zvb2QuaD4KKworQkVTQ0hSRUlCVU5HOgorICAgICBNZWxkdW5nIGFuIGRlbiBLb25zdW1lbnRlbiwgd2VubiBBbGtvaG9sIGtvbnN1bWllcnQgd2VyZGVuIHNvbGwsCisgICAgIG9id29obCBkaWVzZXIgbmljaHQgbWVociBBbGtvaG9sIHZlcnRyYWVndC4KKyAgICAgCitCRU1FUktVTkdFTjoKKyAgICAgRGllc2UgTWVsZHVuZyB3aXJkIHZvbiByZXBsYWNlX3BlcnNvbmFsIG1pdCBkZW4gQXJndW1lbnRlbjoKKyAgICAgMS4gU3BlaXNlCisgICAgIDIuIEtvbnN1bWVudAorICAgICB2ZXJhcmJlaXRldCwga2FubiBhbHMgZW50c3ByZWNoZW5kZSBQbGF0emhhbHRlciBlbnRoYWx0ZW4KKyAgICAgCitERUZBVUxUOgorICAgICAiU292aWVsIEFsa29ob2wgdmVydHJhZWdzdCBEdSBuaWNodCBtZWhyLiIKKworU0lFSEUgQVVDSDoKKyAgICAgUF9BTENPSE9MLCBQX01BWF9BTENPSE9MLCB3aXovZm9vZCwgcmVwbGFjZV9wZXJzb25hbAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFRodSBPY3QgMjggMTI6MTU6MDAgMjAxMCBieSBDYWxkcmEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9BTElHTiBiL2RvYy9wcm9wcy9QX0FMSUdOCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZDM0NjUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9BTElHTgpAQCAtMCwwICsxLDE3IEBACitOQU1FOgorICAgIFBfQUxJR04gICAgICAgICAgICAgICAgICAgICAgICJhbGlnbiIgICAgICAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9saXZpbmcvbGlmZS5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgTnVtZXJpc2NoZXIgV2VydCBmdWVyIEd1dC0gb2RlciBCb2VzaGVpdCBkZXMgV2VzZW5zLgorCisgICAgIEthbm4gV2VydGUgdm9uIC0xMDAwIChCb2VzZSB3aWUgZGVyIFRldWZlbCBob2VjaHN0cGVyc29lbmxpY2gpCisgICAgIGJpcyArMTAwMCAoSmVzdXMsIGJpc3QgRHUncyA/KSBhbm5laG1lbi4KKworICAgICBXZXJ0ZSBhdXNzZXJoYWxiIGRpZXNlciBTa2FsYSB3ZXJkZW4gendhciB0ZWlsd2Vpc2UgdmVyd2VuZGV0LAorICAgICBkYXMgU2V0emVuIGRlcnNlbGJlbiBzb2xsdGUgamVkb2NoIFVOQkVESU5HVCB1bnRlcmJsZWliZW4uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFNhdCBKdWwgMTIgMTc6MDA6MDAgYnkgTWFuZHJhZ29uCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9BTExPV0VEX1NIQURPVyBiL2RvYy9wcm9wcy9QX0FMTE9XRURfU0hBRE9XCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NDgyZmQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9BTExPV0VEX1NIQURPVwpAQCAtMCwwICsxLDI0IEBACitOQU1FOgorICAgIFBfQUxMT1dFRF9TSEFET1cgICAgICAgICAgICAgICJhbGxvd2VkX3NoYWRvdyIKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcGxheWVyL2Jhc2UuaAorCitCRVNDSFJFSUJVTkc6CisKKyAgICAgTm9ybWFsZXJ3ZWlzZSBrb2VubmVuIG51ciBTaGFkb3dzIGFuIFNwaWVsZXIgZ2VidW5kZW4gd2VyZGVuLCBkaWUgaW4gCisgICAgIC9zdGQvcGxheWVyL3NoYWRvd3MvIGxpZWdlbi4gCisgICAgIAorICAgICBadSBUZXN0endlY2tlbiBrYW5uIGluIGRpZXNlciBQcm9wZXJ0eSBkZXIgUGZhZCBlaW5lcyBTaGFkb3dzIGVpbmdldHJhZ2VuCisgICAgIHdlcmRlbi4gRGFtaXQgd2lyZCBkaWUgb2JlbiBiZXNjaHJpZWJlbmUgUmVnZWwgZnVlciBkaWVzZW4gU3BpZWxlciB1bmQgCisgICAgIGRpZXNlbiBTaGFkb3cgYXVzc2VyIEtyYWZ0IGdlc2V0enQuCisKK0JFTUVSS1VORzogCisKKyAgICAgRGVyIFNwaWVsZXIgbXVzcyBlaW4gVGVzdHNwaWVsZXIgc2Vpbi4gQW5zb25zdGVuIHdpcmQgZGllc2UgUHJvcGVydHkKKyAgICAgaWdub3JpZXJ0LgorCisgICAgIERpZSBQcm9wZXJ0eSBpc3Qgc2VjdXJlZCBnZXNldHp0LiBEYXMgaGVpc3N0LCBudXIgRU0rIGtvZW5uZW4KKyAgICAgZGllc2UgUHJvcGVydHkgc2V0emVuIHVuZCBsb2VzY2hlbi4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogU3VuIE1hciAyMSAwMDoyNzo0NiAyMDA0IGJ5IFZhbmlvbgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfQU1NVU5JVElPTiBiL2RvYy9wcm9wcy9QX0FNTVVOSVRJT04KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg5MDNhZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0FNTVVOSVRJT04KQEAgLTAsMCArMSw0MiBAQAorUF9BTU1VTklUSU9OCisKK05BTUU6CisgICAgUF9BTU1VTklUSU9OICAgICAibXVuaXRpb24iCisKK0RFRklOSUVSVCBJTjoKKyAgICA8Y29tYmF0Lmg+CisKK0JFU0NIUkVJQlVORzoKKyAgICBFbnRoYWVsdCBkaWUgZnVlciBlaW5lIFdhZmZlIGd1ZWx0aWdlIE11bml0aW9uIGFscyBTdHJpbmcuIERpZQorICAgIE11bml0aW9uIG11c3MgZGllc2VuIFN0cmluZyBhbHMgSUQgYmVzaXR6ZW4uCisKKyAgICBGdWVyIGRpZSBNdW5pdGlvbnNvYmpla3RlIGdpbHQ6CisgICAgKiBlcyBrYW5uIGVpbiBTa2lsbCBhbSBTcGllbGVyIGRlZmluaWVydCB3ZXJkZW4sIGRpZXNlciB3aXJrdCBkYW5uCisgICAgICB6dXNhZXR6bGljaCB6dW0gZ2VuZXJlbGxlbiBTS19TSE9PVC1Ta2lsbC4KKyAgICAqIHNpZSBrb2VubmVuIGVpbmUgSGl0RnVuYyBiZXNpdHp0ZW4sIGRpZSBiZWltIFNjaHVzcyBhYmdlZnJhZ3Qgd2lyZAorCitCRU1FUktVTkdFTjoKKyAgICBCaXR0ZSBkYXMgI2RlZmluZSBNVU5fTUlTQyh4KSBiZW51dHplbi4gTXVuaXRpb24gc29sbHRlIGF1Y2ggaW1tZXIKKyAgICBpbiBEZXV0c2NoIHVuZCBQbHVyYWwgYW5nZWdlYmVuIHdlcmRlbiwgZGEgUF9BTU1VTklUSU9OIGRpcmVrdAorICAgIGZ1ZXIgQXVzZ2FiZW4gYW4gZGVuIFNwaWVsZXIgYXVzZ2V3ZXJ0ZXQgd2lyZC4KKworICAgIE1vbWVudGFuIHNpbmQgdmllciBNdW5pdGlvbnNhcnRlbiBpbiBkZXIgY29tYmF0Lmggdm9yZGVmaW5pZXJ0OgorICAgIE1VTl9BUlJPVywgTVVOX1NUT05FLCBNVU5fQk9MVCwgTVVOX01JU0MKKworQkVJU1BJRUxFOgorICAgIC8vIGZ1ZXIgZWluIGtsZWluZXMgQmxhc3JvaHIgaW0gQmxhc3JvaHIKKyAgICBTZXRQcm9wKFBfQU1NVU5JVElPTiwgTVVOX01JU0MoIkVyYnNlbiIpKTsKKworICAgIC8vIEVudHNwcmVjaGVuZCBpbiBkZXIgTXVuaXRpb246CisgICAgQWRkSWQoTVVOX01JU0MoIkVyYnNlbiIpKTsKKworU0lFSEUgQVVDSDoKKyAgICBHZW5lcmVsbDogIFBfU0hPT1RJTkdfV0MsIFBfU1RSRVRDSF9USU1FCisgICAgTWV0aG9kZW46ICBGaW5kUmFuZ2VkVGFyZ2V0KEwpLCBzaG9vdF9kYW0oTCksIGNtZF9zaG9vdChMKQorICAgIEdlYmlldDogICAgUF9SQU5HRSwgUF9TSE9PVElOR19BUkVBLCBQX1RBUkdFVF9BUkVBCisgICAgV2FmZmVuOiAgICBQX1dFQVBPTl9UWVBFLCBQX1dDLCBQX0VRVUlQX1RJTUUsIFBfTlJfSEFORFMKKyAgICBLYW1wZjogICAgIEF0dGFjayhMKSwgRGVmZW5kKEwpLCBQX0RJU0FCTEVfQVRUQUNLLCBQX0FUVEFDS19CVVNZCisgICAgVGVhbTogICAgICBQcmVzZW50UG9zaXRpb24oTCkKKyAgICBTb25zdGlnZXM6IGZlcm53YWZmZW4KKworMjkuSnVsIDIwMTQgR2xvaW5zb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9BTU9VTlQgYi9kb2MvcHJvcHMvUF9BTU9VTlQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ0ZTQ1YQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0FNT1VOVApAQCAtMCwwICsxLDggQEAKK05BTUU6CisgICAgUF9BTU9VTlQgICAgICAgICAgICAgICAgICAgICAgImFtb3VudCIgICAgICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3Byb3BlcnRpZXMuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIEFuemFobCBkZXIgT2JqZWt0ZSwgZnVlciBkaWUgZGFzIE9iamVrdCBzdGVodC4KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0FRVUFUSUNfSEVMUEVSUyBiL2RvYy9wcm9wcy9QX0FRVUFUSUNfSEVMUEVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2EwN2FiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfQVFVQVRJQ19IRUxQRVJTCkBAIC0wLDAgKzEsNDYgQEAKK1BfQVFVQVRJQ19IRUxQRVJTCisKK05BTUU6CisgICAgIFBfQVFVQVRJQ19IRUxQRVJTICJsaWJfcF9hcXVhdGljX2hlbHBlcnMiCisKK0RFRklOSUVSVCBJTjoKKyAgICAgPGxpdmluZy9oZWxwZXJzLmg+CisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGllc2UgUHJvcGVydHkga2FubiBpbiBhbGxlbiBMZWJld2VzZW4gYWJnZWZyYWd0IHdlcmRlbiwgdW0gZGllIE9iamVrdGUKKyAgICAgenUgZXJtaXR0ZWxuLCBkaWUgZnVlciBkaWUgVW50ZXJzdHVldHp1bmcgYmVpbSBUYXVjaGVuIGJlaSBkaWVzZW0gCisgICAgIExlYmV3ZXNlbiByZWdpc3RyaWVydCBoYWJlbi4gRGllIERhdGVuIHdlcmRlbiBhbHMgTWFwcGluZyBkZXIgZm9sZ2VuZGVuCisgICAgIEZvcm0genVydWVja2dlbGllZmVydDoKKyAgICAgKFsgT2JqZWt0IDogUnVlY2tnYWJld2VydCB2b24gZGVzc2VuIENhbGxiYWNrLU1ldGhvZGUgXSkKKyAgICAgRWluZSBFcmxhZXV0ZXJ1bmcgZGF6dSBmaW5kZXQgc2ljaCBpbiBkZXIgRG9rdW1lbnRhdGlvbiB6dSAKKyAgICAgUmVnaXN0ZXJIZWxwZXJPYmplY3QoKS4KKworQkVNRVJLVU5HRU46CisgICAgIERpZXNlIFByb3BlcnR5IGthbm4gbnVyIGFiZ2VmcmFndCB3ZXJkZW4uCisgICAgIEVzIGlzdCBlcnd1ZW5zY2h0LCBkYXNzIGVudHNwcmVjaGVuZGUsIG5ldSBnZXNjaGFmZmVuZSBTdGVsbGVuIGplZ2xpY2hlIAorICAgICBIZWxmZXIgYWt6ZXB0aWVyZW4sIGRlcmVuIENhbGxiYWNrLU1ldGhvZGUgPjAgenVydWVja2dpYnQuCisKK0JFSVNQSUVMOgorICAgICBVbSB6dSBlcm1pdHRlbG4sIG9iIGRlciBTcGllbGVyIG1pbmRlc3RlbnMgZWluIE9iamVrdCBiZWkgc2ljaCBoYXQsIGRhcyAKKyAgICAgYmVpbSBUYXVjaGVuIGhpbGZ0LCBzdWNodCBtYW4gYWxsZSBPYmpla3RlIGF1cyBkZW0gTWFwcGluZyBoZXJhdXMsIGRpZQorICAgICBlaW5lbiBXZXJ0ID4wIGVpbmdldHJhZ2VuIGhhYmVuIHVuZCBwcnVlZnQgZGVyZW4gQW56YWhsOgorCisgICAgIG1hcHBpbmcgYXF1YXRpYyA9IHRoaXNfcGxheWVyKCktPlF1ZXJ5UHJvcChQX0FRVUFUSUNfSEVMUEVSUyk7CisgICAgIG9iamVjdCogaGVscGVycyA9IGZpbHRlciggYXF1YXRpYywgZnVuY3Rpb24gaW50IChvYmplY3QgaCkgeworICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoYXF1YXRpY1toXT4wKTsgfSk7CisgICAgIGlmICggc2l6ZW9mKGhlbHBlcnMpICkgeworICAgICAgIHRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksICJEdSBzdHVlcnp0IERpY2ggaW4gZGllIEZsdXRlbiB1bmQgIgorICAgICAgICAgInN0ZWxsc3QgdWViZXJyYXNjaHQgZmVzdCwgZGFzcyBEdSBtaXQgSGlsZmUgIisKKyAgICAgICAgIGhlbHBlcnNbMF0tPm5hbWUoV0VTU0VOLDEpKyIgc29nYXIgdW50ZXIgV2Fzc2VyIGF0bWVuIGthbm5zdCFcbiIpOworICAgICB9CisgICAgIGVsc2UgeworICAgICAgIHRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksICJEdSBoYXN0IG5pY2h0cyB6dW0gVGF1Y2hlbiBiZWkgRGlyLlxuIik7CisgICAgIH0KKworU0lFSEUgQVVDSDoKKyAgICAgTWV0aG9kZW46ICAgIFJlZ2lzdGVySGVscGVyT2JqZWN0KEwpLCBVbnJlZ2lzdGVySGVscGVyT2JqZWN0KEwpCisgICAgIFByb3BlcnRpZXM6ICBQX0hFTFBFUl9PQkpFQ1RTLCBQX0FFUklBTF9IRUxQRVJTCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzA2LjA0LjIwMTYsIEFyYXRob3JuCisKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0FSTU9VUlMgYi9kb2MvcHJvcHMvUF9BUk1PVVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNTZiZjYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9BUk1PVVJTCkBAIC0wLDAgKzEsMjUgQEAKK1BfQVJNT1VSUworCitOQU1FOgorICAgICBQX0FSTU9VUlMgICAgICAgICAgICAgICAgICAgICAiYXJtb3VycyIKKworREVGSU5JRVJUIElOOgorICAgICA8bGl2aW5nL2NvbWJhdC5oPgorCitCRVNDSFJFSUJVTkc6CisgICAgIEFycmF5IG1pdCBkZW4gZ2V0cmFnZW5lbiBTY2h1dHpiZWtsZWlkdW5nZW4gZGVzIExlYmV3ZXNlbi4KKworICAgICBCaXR0ZSBuYWNoIE1vZWdsaWNoa2VpdCBkYXZvbiBhYnNlaGVuLCBkaWVzZSBQcm9wZXJ0eSB6dSBiZXNjaHJlaWJlbiwgZGEKKyAgICAgZXMgaGllcmJlaSB6dSBJbmtvbnNpc3RlbnplbiBrb21tZW4ga2Fubi4KKyAgICAgCisgICAgIEZhbGxzIGlociBkaWUgUnVlc3R1bmdlbiBkZXMgTGViZXdlc2VucywgZ2dmLiBtaXQgYmVzdGltdGVuIEtyaXRlcmllbiwKKyAgICAgZXJtaXR0ZWxuIHdvbGx0LCBiZW51dHp0IGhpZXJmdWVyIGJpdHRlIGRpZSBGdW5rdGlvbiBGaWx0ZXJBcm1vdXJzKCkKKyAgICAgc3RhdHQgc2VsYmVyIHVlYmVyIGRpZXNlcyBBcnJheSB6dSBsYXVmZW4uCisKK1NJRUhFIEFVQ0g6CisgICAgIFZlcndhbmR0OgkJUXVlcnlBcm1vdXJCeVR5cGUoTCksIFBfV0VBUE9OLCBGaWx0ZXJDbG90aGluZygpLCAKKyAgICAgICAgICAgICAgICAgIEZpbHRlckFybW91cnMoKQorICAgICBSdWVzdHVuZ2VuOglQX0FDLCBQX0FSTU9VUl9UWVBFLCBQX05SX0hBTkRTCisgICAgIFNvbnN0aWdlczoJCVBfRVFVSVBfVElNRSwgUF9MQVNUX1VTRQorCisxNC4wMy4yMDA5LCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9BUk1PVVJfVFlQRSBiL2RvYy9wcm9wcy9QX0FSTU9VUl9UWVBFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1OTc4ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9BUk1PVVJfVFlQRQpAQCAtMCwwICsxLDQ2IEBACitQX0FSTU9VUl9UWVBFCisKK05BTUU6CisgICAgIFBfQVJNT1VSX1RZUEUgImFybW91cl90eXBlIgorCitERUZJTklFUlQgSU46CisgICAgIDxhcm1vdXIuaD4KKworQkVTQ0hSRUlCVU5HOgorICAgICBJbiBkaWVzZXIgUHJvcGVydHkgd2lyZCBkZXIgVHlwIGVpbmVyIFJ1ZXN0dW5nIGZlc3RnZWhhbHRlbi4gTWFuIHNvbGx0ZQorICAgICBoaWVyIG51ciBkaWUgaW4gPGNvbWJhdC5oPiBkZWZpbmllcnRlbiBLb25zdGFudGVuIHZlcndlbmRlbjoKKworICAgICAgICBBVF9BTVVMRVQgICAgIEFtdWxldHQKKyAgICAgICAgQVRfQVJNT1VSICAgICBSdWVzdHVuZworICAgICAgICBBVF9CRUxUICAgICAgIEd1ZXJ0ZWwKKyAgICAgICAgQVRfQk9PVCAgICAgICBTY2h1aGUKKyAgICAgICAgQVRfQ0xPQUsgICAgICBVbWhhbmcKKyAgICAgICAgQVRfR0xPVkUgICAgICBIYW5kc2NodWhlCisgICAgICAgIEFUX0hFTE1FVCAgICAgSGVsbQorICAgICAgICBBVF9RVUlWRVIgICAgIEtvZWNoZXIKKyAgICAgICAgQVRfUklORyAgICAgICBSaW5nCisgICAgICAgIEFUX1NISUVMRCAgICAgU2NoaWxkCisgICAgICAgIEFUX1RST1VTRVJTICAgSG9zZW4KKyAgICAgICAgQVRfTUlTQyAgICAgICBTb25zdGlnZXMKKworICAgICBEZXIgUnVlc3R1bmdzdHlwIEFUX01JU0MgaXN0IHNjaG5vZWRlbSBUYW5kIHVuZCBhbmRlcmVtIG51dHpsb3NlbgorICAgICBLcmFtIHZvcmJlaGFsdGVuLiBBdWYga2VpbmVuIEZhbGwgZGFyZiBlaW5lIEFUX01JU0MtUnVlc3R1bmcgdWViZXIKKyAgICAgZWluZSBBQyA+IDAgdmVyZnVlZ2VuIG5vY2ggaXJnZW5kd2llIGthbXBmcmVsZXZhbnRlIEJlZGV1dHVuZyBiZS0KKyAgICAgc2l0emVuLiBSdWVzdHVuZ2VuIGRlcyBUeXBzIEFUX01JU0MsIGRpZSBLRUlORSBEZWZlbmRGdW5jIGJlbm9ldGlnZW4sCisgICAgIG11ZXNzZW4gbWl0dGVscyAvc3RkL2Nsb3RoaW5nIGFscyBlaW5mYWNoZXMgS2xlaWR1bmdzc3R1ZWNrIHJlYWxpc2llcnQKKyAgICAgd2VyZGVuLgorCitCRU1FUktVTkdFTjoKKyAgICAgRGllIFBfQUMgd2lyZCBiZWkgQVRfTUlTQy1SdWVzdHVuZ2VuIGdhciBuaWNodCBlcnN0IGF1c2dld2VydGV0LgorICAgICBEZWZlbmRGdW5jcyB3ZXJkZW4gendhciBhdXNnZXdlcnRldCwgYWJlciBiaXR0ZSB1ZWJlcmxlZ3QgZXVjaCBndXQsIG9iCisgICAgIGlociBzaWUgYnJhdWNodCAoUmVjaGVuemVpdCBpbSBLYW1wZiBpc3Qga3JpdGlzY2ghKSB1bmQgb2Igc2llIHNlaXRlbnMgCisgICAgIGRlciBCYWxhbmNlIGluIGV1cmVtIEZhbGwgZXJsYXVidCBzaW5kLgorCitTSUVIRSBBVUNIOgorICAgICBWZXJ3YW5kdDogICAgICAgICAgUXVlcnlBcm1vdXJCeVR5cGUoTCksIFBfV0VBUE9OCisgICAgIFJ1ZXN0dW5nZW46ICAgICAgICBQX0FDLCBQX05SX0hBTkRTIChTY2hpbGRlKQorICAgICBTb25zdGlnZXM6ICAgICAgICAgUF9FUVVJUF9USU1FLCBQX0xBU1RfVVNFCisgICAgIENvZGU6ICAgICAgICAgICAgICAvc3RkL2FybW91ci5jLCAvc3RkL2Nsb3RoaW5nLmMKKyAgICAgR2lsZGVuZXJnYWVuenVuZzogIFBfR0xPVkVfRklOR0VSTEVTUworCisyNy4gTWFpIDIwMTUsIEFyYXRob3JuCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9BUlJJVkVNU0cgYi9kb2MvcHJvcHMvUF9BUlJJVkVNU0cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJkNTc1OQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0FSUklWRU1TRwpAQCAtMCwwICsxLDggQEAKK05BTUU6CisgICAgUF9BUlJJVkVNU0cgICAgICAgICAgICAgICAgICAgImFycml2ZW1zZyIgICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3RyYW5zcG9ydC5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgTWVsZHVuZywgd2VubiBkZXIgVHJhbnNwb3J0ZXIgYW5sZWd0LgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfQVJUSUNMRSBiL2RvYy9wcm9wcy9QX0FSVElDTEUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUxNzg2NQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0FSVElDTEUKQEAgLTAsMCArMSwxNSBAQAorTkFNRToKKyAgICBQX0FSVElDTEUgICAgICAgICAgICAgICAgICAgICAiYXJ0aWNsZSIgICAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvdGhpbmcvbGFuZ3VhZ2UuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIEdpYnQgYW4sIG9iIGluIGRlciBCZXNjaHJlaWJ1bmcgZWluIEFydGlrZWwgYXVzZ2VnZWJlbiB3ZXJkZW4gc29sbAorICAgICBvZGVyIG5pY2h0LgorCisgICAgIFdlbm4gZWluIEFydGlrZWwgYW5nZWdlYmVuIHdlcmRlbiBzb2xsLCBzbyB3aXJkIDEgZ2VzZXR6dCwgc29uc3QgMC4KKyAgICAgRGllc2UgUHJvcGVydHkgaXN0IGF1cyBoaXN0b3Jpc2NoZW4gR3J1ZW5kZW4gYXVmIDEgdm9yZWluZ2VzdGVsbHQKKyAgICAgdW5kIGludGVybiBpbnZlcnRpZXJ0LiAoZC5oLiwgYmVpbSBBdXNsZXNlbiBwZXIgUXVlcnkga29tbXQgYWxzIAorICAgICBFcmdlYm5pcyBnZW5hdSBkYXMgZmFsc2NoZSBoZXJhdXMpLiBCaXR0ZSBiZWFjaHRldCBkYXMgYmVpIFNldC0gYnp3LgorICAgICBRdWVyeS1GdW5rdGlvbmVuLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0FUVEFDS19CVVNZIGIvZG9jL3Byb3BzL1BfQVRUQUNLX0JVU1kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU1ZGM1YgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0FUVEFDS19CVVNZCkBAIC0wLDAgKzEsNDQgQEAKK05BTUU6CisgICAgUF9BVFRBQ0tfQlVTWSAgICAgICAgICAgICAgICAgImF0dGFja19idXN5IiAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL2xpdmluZy9jb21iYXQuaAorCitCRVNDSFJFSUJVTkc6CisgICAgVWViZXIgZGllc2UgUHJvcGVydHkga2FubiBmZXN0Z2VzdGVsbHQgd2VyZGVuLCBvYiBlaW4gU3BpZWxlciBub2NoIAorICAgIFNwZXppYWx3YWZmZW4gKHpCIEZsYW1tZW5rdWdlbCkgZWluc2V0emVuIGthbm4uCisgICAgCisgICAgSXN0IGRlciBXZXJ0IGJlaSBBYmZyYWdlIHVuZ2xlaWNoIDAsIGRhbm4gZGFyZiBkZXIgU3BpZWxlciBpbiBkaWVzZXIKKyAgICBSdW5kZSBrZWluZSBBa3Rpb24gbWVociBkdXJjaGZ1ZWhyZW4uIE1pdCBTZXRQcm9wKFBfQVRUQUNLX0JVU1ksIDEpCisgICAgd2lyZCBlaW5lIEFrdGlvbiB2ZXJicmF1Y2h0LgorCisgICAgSW50ZXJuIHdpcmQgcmVsYXRpdiBmZWluIGdlcmVjaG5ldCwgZWluIFNldFByb3AoUF9BVFRBQ0tfQlVTWSwgeCkKKyAgICB3aXJkIGluIGRhcyBBYnppZWhlbiB2b24geCoxMDAgUHVua3RlbiB1bWdlcmVjaG5ldC4gRGVyIFdlcnQgZnJlaWVyCisgICAgQWt0aW9uZW4gcHJvIFJ1bmRlIGJlcmVjaG5ldCBzaWNoIHdpZSBmb2xndDoKKyAgICAKKyAgICBTcGllbGVyOiAxMDAgKyBRdWVyeVNraWxsQXR0cmlidXRlKFNBX1NQRUVEKQorICAgIFNlaGVyOiAgIFNwaWVsZXIgKyAyMDAgKyBRdWVyeVByb3AoUF9MRVZFTCkKKworICAgIERhcyBNYXhpbXVtIGxpZWd0IGJlaSA1MDAuCisgICAgRGFtaXQgYmV0cmFlZ3QgZGllIEFuemFobCBkZXIgbW9lZ2xpY2hlbiBBa3Rpb25lbiBwcm8gUnVuZGU6IFdlcnQvMTAwLAorICAgIGFsc28gbWF4aW1hbCA1IEFrdGlvbmVuIHBybyBSdW5kZS4KKworICAgIFphdWJlcnNwcnVlY2hlIHphZWhsZW4gaW0gTm9ybWFsZmFsbCBhdWNoIGFscyBlaW5lIEFrdGlvbi4KKworQkVNRVJLVU5HRU46CisgICAgQmVudXR6dCBtYW4gUF9BVFRBQ0tfQlVTWSBmdWVyIGVpbmUgc2ljaCBuaWNodCBzb2ZvcnQgdmVyYnJhdWNoZW5kZQorICAgIFNhY2hlLCBrYW5uIGVpbiBTZWhlciBkaWVzZXMgT2JqZWt0IGltIE5vcm1hbGZhbGwgZHJlaW1hbCBwcm8gUnVuZGUKKyAgICBiZW51dHplbi4gV2VubiB1bmdld29sbHQsIG11c3MgZGFzIHVlYmVyIGVpbmVuIFplaXRtYXJrZXIgc2VsYnN0CisgICAgdmVyaGluZGVydCB3ZXJkZW4uCisgICAgCitCRUlTUElFTEU6CisgICAgKENvZGUgZWluZXMgT2JqZWt0ZXMgaXN0IGluCisgICAgIC9kb2MvYmVpc3BpZWxlL3Rlc3RvYmpla3RlL2F0dGFja19idXN5X3NlbnNpdGl2ZV90ZXN0b2JqLmMpCisgICAgLy8gZWluZmFjaGVyIFRlc3QgYXVmIEFUVEFDS19CVVNZIHVuZCBhbnNjaGxpZXNzZW5kZXMgU2V0emVuCisgICAgaWYgKHRoaXNfcGxheWVyKCktPlF1ZXJ5UHJvcChQX0FUVEFDS19CVVNZKSkgeworICAgICAgd3JpdGUoIkR1IGhhc3QgZGFmdWVyIG1vbWVudGFuIGVpbmZhY2ggbmljaHQgbWVociBkaWUgUHVzdGUuXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICB0aGlzX3BsYXllcigpLT5TZXRQcm9wKFBfQVRUQUNLX0JVU1ksIDEpOworCis3LiBNYXIgMjAxMSBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfQVRUUklCVVRFUyBiL2RvYy9wcm9wcy9QX0FUVFJJQlVURVMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlkYTkxMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0FUVFJJQlVURVMKQEAgLTAsMCArMSw1OCBAQAorTkFNRToKKwlQX0FUVFJJQlVURVMJCQkiYXR0cmlidXRlcyIKKworREVGSU5JRVJUIElOOgorCS9zeXMvbGl2aW5nL2F0dHJpYnV0ZXMuaAorCitCRVNDSFJFSUJVTkc6CisJRGllc2UgUHJvcGVydHkgZW50aGFlbHQgZWluIE1hcHBpbmcgbWl0IGRlbiBBdHRyaWJ1dGVuIGRlcworCUxlYmV3ZXNlbnMuIERpZSBTY2hsdWVzc2VsIGtlbm56ZWljaG5lbiBoaWVyYmVpIGRhcyBqZXdlaWxpZ2UKKwlBdHRyaWJ1dC4gRGllIHZlcnNjaGllZGVuZW4gU3RhbmRhcmRhdHRyaWJ1dGUgZmluZGV0IG1hbiBpbgorCS9zeXMvbGl2aW5nL2F0dHJpYnV0ZXMuaCwgd2VsY2hlIGRlcnplaXQgZm9sZ2VuZGUgTW9lZ2xpY2hrZWl0ZW4KKwliaWV0ZW46CS0gQV9TVFIgKEtyYWZ0KQorCQktIEFfSU5UIChJbnRlbGxpZ2VueikKKwkJLSBBX0RFWCAoR2VzY2hpY2spCisJCS0gQV9DT04gKEtvbnN0aXR1dGlvbikKKwlTaWUgd2VyZGVuIGF1dG9tYXRpc2NoIGFuIHZlcnNjaGllZGVuZW4gU3RlbGxlbiBpbiBkZXIgTVVETGliCisJYXVzZ2V3ZXJ0ZXQsIHp1bSBCZWlzcGllbCBiZXN0aW1tdCBBX0lOVCBkaWUgbWF4aW1hbCBtb2VnbGljaGVuCisJS29uemVudHJhdGlvbnNwdW5rdGUgdW5kIEFfQ09OIGRpZSBtYXhpbWFsIG1vZWdsaWNoZW4gTGViZW5zcHVua3RlLgorCitCRU1FUktVTkdFTjoKKyAgICAgICAgS2VpbmUgZWNodGUgUHJvcGVydHksIF9xdWVyeV9hdHRyaWJ1dGVzKCkgdW5kIF9zZXRfYXR0cmlidXRlcygpIHNpbmQgDQorICAgICAgICBpbiAvc3RkL2xpdmluZy9hdHRyaWJ1dGVzLmMgaW1wbGVtZW50aWVydC4KKworCUVzIGJpZXRldCBzaWNoIGFuLCB6dW0gRXJmcmFnZW4gZGVyIEF0dHJpYnV0d2VydGUgZGllIEZ1bmt0aW9uCisJUXVlcnlBdHRyaWJ1dGUoKSB6dSBudXR6ZW4sIGRhIGVzIGF1Y2ggbW9lZ2xpY2hlIE9mZnNldHMgZ2lidCwKKwlzbyBiZWlzcGllbHN3ZWlzZSB1ZWJlciBkaWUgUHJvcGVydGllcyBQX0FUVFJJQlVURVNfT0ZGU0VUUyBiencuCisJUF9BVFRSSUJVVEVTX01PRElGSUVSIGltIExlYmV3ZXNlbiBzZWxic3QsIG9kZXIgYXVjaCB1ZWJlcgorCVBfWF9BVFRSX01PRCBiencuIFBfTV9BVFRSX01PRCBpbiBPYmpla3RlbiBpbSBMZWJld2VzZW4uCisJS3VyemZyaXN0aWdlIHplaXQtIG9kZXIgb2JqZWt0Z2VidW5kZW5lIEF0dHJpYnV0dmVyYWVuZGVydW5nZW4KKwlrb2VubmVuIHVlYmVyIGRpZSBQcm9wZXJ0eSBQX1RJTUVEX0FUVFJfTU9EIHJlYWxpc2llcnQgd2VyZGVuLgorCisJRXMgZ2lidCBhdWNoIHphaGxyZWljaGUgYW5kZXJlIERpZW5zdGZ1bmt0aW9uZW4gZnVlciBkaWVzZW4gc2VocgorCWJhbGFuY2Vrcml0aXNjaGVuIEJlcmVpY2gsIHNpZWhlIHVudGVuLgorCitCRUlTUElFTDoKKwlFaW4gbW9lZ2xpY2hlcyBFcmdlYm5pcyBmdWVyIGVpbmVuIGZyaXNjaGVuIExldmVsIDEgU3BpZWxlciB3YWVyZToKKwkgIFF1ZXJ5UHJvcChQX0FUVFJJQlVURVMpOworCSAgRXJnZWJuaXM6IChbImludCI6MSwiY29uIjoxLCJzdHIiOjEsImRleCI6MV0pCisJSGluenUga29tbWVuIGV2ZW50dWVsbCBtb2VnbGljaGUgUmFzc2VuYm9uaSwgZGllIG1pdHRlbHMKKwlQX0FUVFJJQlVURV9PRkZTRVRTIHJlYWxpc2llcnQgd2VyZGVuLCBad2VyZ2Ugc2luZCBiZWlzcGllbHN3ZWlzZQorCXJlY2h0IHN0YXJrOgorCSAgUXVlcnlQcm9wKFBfQVRUUklCVVRFU19PRkZTRVRTKTsKKwkgIEVyZ2VibmlzOiAoWyJpbnQiOjEsImNvbiI6MSwic3RyIjoxLCJkZXgiOjNdKQorCUpldHp0IGJla2FlbWUgbWFuIChzb2Zlcm4ga2VpbmUgd2VpdGVyZW4gT2Zmc2V0cyByZWFsaXNpZXJ0IHNpbmQpCisJbWl0dGVscyBRdWVyeUF0dHJpYnV0ZSgpIGluc2dlc2FtdDoKKwkgIFF1ZXJ5QXR0cmlidXRlKEFfREVYKTsKKwkgIEVyZ2VibmlzOiA0CisKK1NJRUhFIEFVQ0g6CisJUXVlcnlBdHRyaWJ1dGUoKSwgUXVlcnlSZWFsQXR0cmlidXRlKCksIFF1ZXJ5QXR0cmlidXRlT2Zmc2V0KCksCisJU2V0QXR0cmlidXRlKCksIFNldFJlYWxBdHRyaWJ1dGUoKSwgVXBkYXRlQXR0cmlidXRlcygpLAorCVNldFRpbWVkQXR0ck1vZGlmaWVyKCksIFF1ZXJ5VGltZWRBdHRyTW9kaWZpZXIoKSwKKwlEZWxldGVUaW1lZEF0dHJNb2RpZmllcigpLAorCVBfQVRUUklCVVRFU19PRkZTRVRTLCBQX0FUVFJJQlVURVNfTU9ESUZJRVIsUF9USU1FRF9BVFRSX01PRCwKKwlQX1hfQVRUUl9NT0QsIFBfTV9BVFRSX01PRCwgL3N0ZC9saXZpbmcvYXR0cmlidXRlcy5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFR1ZSBKdWwgMjcgMjA6MDA6MjAgMjAwNCBieSBNdWFkaWIKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0FUVFJJQlVURVNfTU9ESUZJRVIgYi9kb2MvcHJvcHMvUF9BVFRSSUJVVEVTX01PRElGSUVSCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YmE1MTMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9BVFRSSUJVVEVTX01PRElGSUVSCkBAIC0wLDAgKzEsNTYgQEAKK05BTUU6CisgICAgUF9BVFRSSUJVVEVTX01PRElGSUVSICAgICAgICAgImF0dHJpYnV0ZXNfbW9kaWZpZXIiCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL2xpdmluZy9hdHRyaWJ1dGVzLmgKKworQkVTQ0hSRUlCVU5HOgorICAgIEluIGRpZXNlciBQcm9wZXJ0eSB3ZXJkZW4gQXR0cmlidXQtTW9kaWZpa2F0b3JlbiBnZXNwZWljaGVydCwgZGllCisgICAgbGFlbmdlcmUgWmVpdCB3aXJrc2FtIHNlaW4gc29sbGVuLCB0bHcuIGF1Y2ggdWViZXIgZWluZW4gUmVib290CisgICAgaGlud2VnLgorICAgIEludGVybiB3ZXJkZW4gZGllIE1vZGlmaWthdG9yZW4gaW4gZWluZW0gTWFwcGluZyBkZXIgRm9ybQorCisgICAgICAgIChbIFNldHplci1LZXkgOiAoWyBBX3h5IDogV2VydCwgLi4uIF0pICwgLi4uIF0pCisKKyAgICBnZXNwZWljaGVydC4gRGFzIFNldHplbiBmb2xnIGhpbmdlZ2VuIGluIGRlciBGb3JtCisKKyAgICAgICAgc3BpZWxlci0+U2V0UHJvcChQX0FUVFJJQlVURVNfTU9ESUZJRVIsIChbIEFfeHkgOiBXZXJ0LCAuLi4gXSkpOworICAgIG9kZXIKKyAgICAgICAgc3BpZWxlci0+U2V0UHJvcChQX0FUVFJJQlVURVNfTU9ESUZJRVIsICh7IFNldHplci1LZXksIChbIC4uLiBdKSB9KSk7CisKKyAgICBCZWkgZGVyIGVyc3RlbiBWYXJpYW50ZSB3aXJkIGhpZXJiZWkgZGVyIEZpbGVuYW1lIGRlcyBzZXR6ZW5kZW4gT2JqZWt0ZXMKKyAgICBhbHMgU2V0emVyLUtleSBnZW5vbW1lbi4KKyAgICBFcyBrb2VubmVuIGFsc28gZHVyY2hhdXMgdm9uIG1laHJlcmVuIE9iamVrdGVuIE1vZGlmaWVyIGdlc2V0enQgd2VyZGVuLgorICAgIEJla2FubnRlIE1vZGlmaWVyIHNpbmQ6CisKKyAgICAgICAgI2RlYXRoICAgICAgQXR0cmlidXQtQWJ6dWcgZHVyY2ggVG9kZXNmb2xnZW4gICAgICAoTXVkbGliKQorICAgICAgICAjZHJhaW4gICAgICBTdGF0YWJ6dWcgZHVyY2ggTlBDcyAgICAgICAgICAgICAgICAgIChQYXJhY2Vsc3VzKQorICAgICAgICAjZnJvc2NoICAgICBTdGFlcmtlbi1BYnp1ZyBiZWkgRnJvZXNjaGVuICAgICAgICAgIChNdWRsaWIpCisKK0JFTUVSS1VOR0VOOgorICAgIEtlaW5lIGVjaHRlIFByb3BlcnR5LCBfcXVlcnlfYXR0cmlidXRlc19tb2RpZmllcigpIHVuZAorICAgIF9zZXRfYXR0cmlidXRlc19tb2RpZmllcigpIHNpbmQgaW4gL3N0ZC9saXZpbmcvYXR0cmlidXRlcy5jCisgICAgaW1wbGVtZW50aWVydAorICAgIC0gU2V0UHJvcC9RdWVyeVByb3AgbnV0emVuIQorICAgIC0gV2VubiBlaW4gTW9kaWZpZXIgbmljaHQgbWVociBnZWJyYWNodCB3aXJkLCBuaWNodCBkaWUgQXR0cmlidXRzd2VydGUgYXVmCisgICAgICAwIHNldHplbiwgc29uZGVybiBkZW4gZ2FuemVuIEVpbnRyYWchIGFsc286CisgICAgICBTZXRQcm9wKFBfQVRUUklCVVRFU19NT0RJRklFUiwgKFtdKSApOworICAgICAgb2RlcjogU2V0UHJvcChQX0FUVFJJQlVURVNfTU9ESUZJRVIsIDAgKTsgCisgICAgICBhYmVyIG5pY2h0OiBTZXRQcm9wKFBfQVRUUklCVVRFU19NT0RJRklFUiwgKFtBX1NUUjowXSkpOworCitCRUlTUElFTEU6CisgICAgLy8gZWluIEJvbnVzIC4uLiAnZW5kZSctZmVzdCAobXVzcyBhbHNvIHBlciB1aWQgZ2VzaWNoZXJ0IHdlcmRlbikKKyAgICBwbGF5ZXItPlNldFByb3AoUF9BVFRSSUJVVEVTX01PRElGSUVSLAorICAgICAgICAgICAgICAgICAgICAoeyJnX2tsZXJ1c19zZWdlbiIsIChbQV9DT046NSwgQV9JTlQ6NV0pfSkpOworICAgIC4uLgorICAgIHBsYXllci0+U2V0UHJvcChQX0FUVFJJQlVURVNfTU9ESUZJRVIsICh7Imdfa2xlcnVzX3NlZ2VuIiwgMH0pKTsKKworU0lFSEUgQVVDSDoKKwlRdWVyeUF0dHJpYnV0ZSgpLCBRdWVyeVJlYWxBdHRyaWJ1dGUoKSwgUXVlcnlBdHRyaWJ1dGVPZmZzZXQoKSwKKwlTZXRBdHRyaWJ1dGUoKSwgU2V0UmVhbEF0dHJpYnV0ZSgpLCBVcGRhdGVBdHRyaWJ1dGVzKCksCisJU2V0VGltZWRBdHRyTW9kaWZpZXIoKSwgUXVlcnlUaW1lZEF0dHJNb2RpZmllcigpLAorCURlbGV0ZVRpbWVkQXR0ck1vZGlmaWVyKCksCisJUF9BVFRSSUJVVEVTLCBQX0FUVFJJQlVURVNfT0ZGU0VUUywgUF9USU1FRF9BVFRSX01PRCwKKwlQX1hfQVRUUl9NT0QsIFBfTV9BVFRSX01PRCwgL3N0ZC9saXZpbmcvYXR0cmlidXRlcy5jCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBUdWUgSnVsIDI3IDIwOjAwOjIwIDIwMDQgYnkgTXVhZGliCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9BVFRSSUJVVEVTX09GRlNFVFMgYi9kb2MvcHJvcHMvUF9BVFRSSUJVVEVTX09GRlNFVFMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ViZTJiNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0FUVFJJQlVURVNfT0ZGU0VUUwpAQCAtMCwwICsxLDI3IEBACitOQU1FOgorCVBfQVRUUklCVVRFU19PRkZTRVRTCQkiYXR0cmlidXRlc19vZmZzZXRzIgorCitERUZJTklFUlQgSU46CisJL3N5cy9saXZpbmcvYXR0cmlidXRlcy5oCisKK0JFU0NIUkVJQlVORzoKKwlEaWVzZSBQcm9wZXJ0eSBlbnRoYWVsdCBlaW4gTWFwcGluZyBtaXQgT2Zmc2V0cywgZGllIHp1IGRlbgorCUF0dHJpYnV0ZW4gZWluZSBMZWJld2VzZW5zIGFkZGllcnQgd2VyZGVuLiBEaWVzZSBrb2VubmVuIGF1Y2gKKwluZWdhdGl2IHNlaW4hIFJlYWxpc2llcnQgd2VyZGVuIGRhbWl0IGJlaXNwaWVsc3dlaXNlIFJhc3NlbmJvbmkuCisJRXMgZ2lidCBub2NoIHdlaXRlcmUgTW9lZ2xpY2hrZWl0ZW4sIEF0dHJpYnV0b2Zmc2V0cyBhbnp1Z2ViZW4uCisJRnVlciB3ZWl0ZXJlcyBzaWVoZSBQX0FUVFJJQlVURVMuCisKK0JFTUtFUlVOR0VOOgorICAgICAgICBLZWluZSBlY2h0ZSBQcm9wZXJ0eSwgX3F1ZXJ5X2F0dHJpYnV0ZXNfb2Zmc2V0cygpIHVuZCANCisgICAgICAgIF9zZXRfYXR0cmlidXRlc19vZmZzZXRzKCkgc2luZCBpbiAvc3RkL2xpdmluZy9hdHRyaWJ1dGVzLmMgDQorICAgICAgICBpbXBsZW1lbnRpZXJ0LgorCitTSUVIRSBBVUNIOgorCVF1ZXJ5QXR0cmlidXRlKCksIFF1ZXJ5UmVhbEF0dHJpYnV0ZSgpLCBRdWVyeUF0dHJpYnV0ZU9mZnNldCgpLAorCVNldEF0dHJpYnV0ZSgpLCBTZXRSZWFsQXR0cmlidXRlKCksIFVwZGF0ZUF0dHJpYnV0ZXMoKSwKKwlTZXRUaW1lZEF0dHJNb2RpZmllcigpLCBRdWVyeVRpbWVkQXR0ck1vZGlmaWVyKCksCisJRGVsZXRlVGltZWRBdHRyTW9kaWZpZXIoKSwKKwlQX0FUVFJJQlVURVMsIFBfQVRUUklCVVRFU19PRkZTRVRTLCBQX1RJTUVEX0FUVFJfTU9ELAorCVBfWF9BVFRSX01PRCwgUF9NX0FUVFJfTU9ELCAvc3RkL2xpdmluZy9hdHRyaWJ1dGVzLmMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFR1ZSBKdWwgMjcgMjA6MDA6MjAgMjAwNCBieSBNdWFkaWIKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0FVVEhfSU5GTyBiL2RvYy9wcm9wcy9QX0FVVEhfSU5GTwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2E2NWM1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfQVVUSF9JTkZPCkBAIC0wLDAgKzEsOCBAQAorTkFNRToKKyAgICBQX0FVVEhfSU5GTyAgICAgICAgICAgICAgICAgICAiYXV0aF9pbmZvIiAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcGxheWVyLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBVc2VybmFtZSBkZXMgU3BpZWxlcnMsIHdlbm4gYmVpIGlobSBlaW4gQVVUSEQgbGFldWZ0CmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9BVVRPTE9BRCBiL2RvYy9wcm9wcy9QX0FVVE9MT0FECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYTY5YzkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9BVVRPTE9BRApAQCAtMCwwICsxLDE1IEBACitOQU1FOgorICAgIFBfQVVUT0xPQUQgICAgICAgICAgICAgICAgICAgICJhdXRvbG9hZCIgICAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9wbGF5ZXIvYmFzZS5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgTWFwcGluZyBtaXQgZGVyIE1lbmdlIGRlciBBdXRvbG9hZG9iamVrdGUgdW5kIGRlbiB6dWdlaC4KKyAgICAgUHJvcGVydGllcy4KKworQkVNRVJLVU5HRU46CisgICAgIEZ1bmt0aW9uaWVydCBtb21lbnRhbiBuaWNodC4gRGllIE1ldGhvZGUgd3VyZGUgZW50ZmVybnQuIERva3UgYmxlaWJ0CisgICAgIGhpZXIgYmlzIGRlciBGYWxsIGdla2xhZXJ0IGlzdC4gKFN0YW5kIDI3LkF1ZyAyMDA2KQorCisyNy5BdWcgMjAwNiBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfQVVUT0xPQURPQkogYi9kb2MvcHJvcHMvUF9BVVRPTE9BRE9CSgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmI0MzNkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfQVVUT0xPQURPQkoKQEAgLTAsMCArMSwxMTkgQEAKK05BTUU6CisgICAgUF9BVVRPTE9BRE9CSiAgICAgICAgICAgICAgICAgImF1dG9sb2Fkb2JqIgorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9wbGF5ZXIvYmFzZS5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgSGllcm1pdCBrYW5uIHByaW56aXBpZWxsIGFuZ2VnZWJlbiB3ZXJkZW4gb2IgZWluIE9iamVrdCB1ZWJlciBkYXMKKyAgICAgQXVzbG9nZ2VuIGVpbmVzIFNwaWVsZXJzIChSZWJvb3QvZW5kZSkgYmVoYWx0ZW4gd2VyZGVuIHNvbGwuCisKKyAgICAgQWxzIEluaGFsdCBkZXIgUHJvcGVydHkga29lbm5lbiBwZXJtYW5lbnRlIEVpZ2Vuc2NoYWZ0ZW4gZGVzIE9iamVrdGVzCisgICAgIGFuZ2VnZWJlbiB3ZXJkZW4uCisgICAgIEJlaW0gRWlubG9nZ2VuIHdpcmQgZGFzIE9iamVrdCBuZXUgZXJ6ZXVndCB1bmQgUF9BVVRPTE9BRE9CSiBhdWYgZGllCisgICAgIGdlc3BlaWNoZXJ0ZW4gV2VydGUgZ2VzZXR6dC4gRGllIFdlcnRlIG11ZXNzZW4gYWxsZXJkaW5ncyBzZWxic3QKKyAgICAgdmVyd2FsdGV0IHdlcmRlbi4KKworICAgICBCaXR0ZSBnZWh0IG5pY2h0IGRhdm9uIGF1cywgZGFzcyBlcyB3YWVocmVuZCBkZXMgU2V0emVucy9BYmZyYWdlbnMgZGllc2VyCisgICAgIFByb3AgZWluZW4gdGhpc19wbGF5ZXIoKSBvZGVyIGVpbiB0aGlzX2ludGVyYWN0aXZlKCkgZ2ViZW4gbXVzcy4KKyAgICAgU3BlemllbGwgaXN0IHRoaXNfaW50ZXJhY3RpdmUoKSBuaWNodCA9PSAvc2VjdXJlL2xvZ2luIQorICAgICBFYmVuZmFsbHMgbXVzcyBkYXMgT2JqZWt0IGJlaW0gU2V0emVuL0FiZnJhZ2VuIG5pY2h0IGluIGVpbmVtIFNwaWVsZXIKKyAgICAgc2Vpbi4KKworQkVNRVJLVU5HRU46CisgICAgIEF1dG9sb2Fkb2JqZWt0ZSB3ZXJkZW4gYmVpbSBBdXNsb2dnZW4gbmljaHQgZmFsbGVuZ2VsYXNzZW4hCisKK0JFSVNQSUVMRToKKyAgICAgIyMgVmFyaWFudGUgMTogc2ltcGxlcyBPYmpla3QsIGJsZWlidCBlaW5mYWNoIG51ciBlcmhhbHRlbiwKKyAgICAgIyMgICAgICAgICAgICAgVmFyaWFibGVuIHdlcmRlbiBuaWNodCBnZXNpY2hlcnQgIyMKKyAgICAgdm9pZCBjcmVhdGUoKSB7CisgICAgICAuLi4KKyAgICAgIFNldFByb3AoUF9BVVRPTE9BRE9CSiwxKTsKKyAgICAgIC4uLgorICAgICB9CisKKworICAgICAjIyBWYXJpYW50ZSAyOiBTcGVpY2hlcnVuZyBtZWhyZXJlciBWYXJpYWJsZW4gdWViZXIKKyAgICAgIyMgICAgICAgICAgICAgUF9BVVRPTE9BRE9CSiAoZWxlZ2FudGUgVmVyd2FsdHVuZykKKworICAgICAvLyBlaW4gcGFhciAjZGVmaW5lcyBmdWVyIGRpZSBQbGFldHplIGluIGRlciBTcGVpY2hlcnZhcmlhYmxlbgorICAgICAjZGVmaW5lIE1ZX0FMX1NIT1JUICAgIDAKKyAgICAgI2RlZmluZSBNWV9BTF9BVFRSTSAgICAxCisgICAgICNkZWZpbmUgTVlfQUxfT1dORVIgICAgMgorICAgICAjZGVmaW5lIE1ZX0FMX0RFU1RSVUNUIDMKKworICAgICAvLyBkaWUgVmFyaWFibGVuLCBkaWUgZXJoYWx0ZW4gYmxlaWJlbiBzb2xsZW4KKyAgICAgc3RhdGljIG9iamVjdCBvd25lcjsKKyAgICAgc3RhdGljIGludCBkZXN0cnVjdF90aW1lOworCisgICAgIC8vIGRpZXNlIGhpZXIgd2lyZCBnZXJ1ZmVuLCB3ZW5uIGRlciBTcGllbGVyIGdlc3BlaWNoZXJ0IHdpcmQsCisgICAgIC8vIHdpciBwYWNrZW4gYWxzbyBhbGxlIGFrdHVlbGxlbiBWYXJpYWJsZW4gaW4gZWluZSB1bmQgZ2ViZW4gZGllCisgICAgIC8vIHp1bSBTcGVpY2hlcm4gaGVyYXVzIC4uLiB3aXIgbmVobWVuIGhpZXIgZWluIEFycmF5IChzdGF0dAorICAgICAvLyB6QiBlaW5lcyBNYXBwaW5ncyksIHdlaWwgZGFzIGFtIHdlbmlnc3RlbiBQbGF0eiBicmF1Y2h0CisgICAgIHN0YXRpYyBtaXhlZCogX3F1ZXJ5X2F1dG9sb2Fkb2JqKCkgeworICAgICAgbWl4ZWQgKnJldDsKKyAgICAgIHJldD1hbGxvY2F0ZSg0KTsKKyAgICAgIHJldFtNWV9BTF9TSE9SVF0gPSBRdWVyeVByb3AoUF9TSE9SVCk7ICAgICAgLy8gU0hPUlQgbWVya2VuCisgICAgICByZXRbTVlfQUxfQVRUUk1dID0gUXVlcnlQcm9wKFBfTV9BVFRSX01PRCk7IC8vIGVpbmVuIE1vZGlmaWthdG9yIG1lcmtlbgorICAgICAgcmV0W01ZX0FMX09XTkVSXSA9IGdldHVpZChvd25lcik7ICAgICAgICAgICAvLyBhaCwgZWluIEJlc2l0emVyIQorICAgICAgcmV0W01ZX0FMX0RFU1RSVUNUXT1kZXN0cnVjdF90aW1lLXRpbWUoKTsgICAvLyB1bmQgZWluZSBMZWJlbnNkYXVlciEKKworICAgICAgcmV0dXJuIHJldDsKKworICAgICAgLyoKKyAgICAgIC8vIG5vcm1hbGVyd2Vpc2Ugd3VlcmRlIG1hbiBkYXMgZWluZmFjaCBzbyBzY2hyZWliZW46CisgICAgICByZXR1cm4gKCh7UXVlcnlQcm9wKFBfU0hPUlQpLAorICAgICAgICAgICAgICAgIFF1ZXJ5UHJvcChQX01fQVRUUl9NT0QpLAorICAgICAgICAgICAgICAgIGdldHVpZChvd25lciksCisgICAgICAgICAgICAgICAgZGVzdHJ1Y3RfdGltZS10aW1lKCl9KSk7CisgICAgICAqLworICAgICB9CisKKyAgICAgLy8gZGllc2UgaGllciB3aXJkIGdlcnVmZW4sIHdlbm4gZGFzIE9iamVrdCBuZXUgaW0gU3BpZWxlcgorICAgICAvLyBlcnpldWd0IHd1cmRlIChMb2dpbiksIGFsc28gcGFja2VuIHdpciBkYXMgU3BlaWNoZXJhcnJheSB3aWVkZXIKKyAgICAgLy8gYXVzIHVuZCBpbiBhbGxlIGVudHNwcmVjaGVuZGVuIFZhcmlhYmxlbgorICAgICBzdGF0aWMgbWl4ZWQqIF9zZXRfYXV0b2xvYWRvYmoobWl4ZWQgKm5ldykgeworICAgICAgLy8gd2VubiBkYXMgRm9ybWF0IG5pY2h0IG1pdCBkZW0gb2JlbiB1ZWJlcmVpbnN0aW1tdCBpc3Qgd2FzCisgICAgICAvLyBzY2hpZWZnZWxhdWZlbgorICAgICAgaWYocG9pbnRlcnAobmV3KSAmJiAhb3duZXIgJiYgc2l6ZW9mKG5ldyk+NCAmJgorICAgICAgICAgKG93bmVyPWZpbmRfcGxheWVyKG5ld1tNWV9BTF9PV05FUl0pKSkgeworICAgICAgIC8vIGxvcywgenV3ZWlzZW4hCisKKyAgICAgICBTZXRQcm9wKFBfU0hPUlQsICAgICAgbmV3W01ZX0FMX1NIT1JUXSk7CisgICAgICAgU2V0UHJvcChQX01fQVRUUl9NT0QsIG5ld1tNWV9BTF9BVFRSTV0pOworICAgICAgIGRlc3RydWN0X3RpbWU9ICAgICAgICB0aW1lKCkrbmV3W01ZX0FMX0RFU1RSVUNUXTsKKworICAgICAgIGNhbGxfb3V0KCMncmVtb3ZlLG5ld1szXSk7CisgICAgICB9IGVsc2UgY2FsbF9vdXQoIydyZW1vdmUsMCk7CisKKyAgICAgIHJldHVybiBuZXc7CisgICAgIH0KKworCisgICAgICMjIFZhcmlhbnRlIDM6IHVuZCBkYXMgZ2xlaWNoZSBtaXQgU2V0L1F1ZXJ5bWV0aG9kZW4gIyMKKyAgICAgLy8gUHJvdG90eXBlbiBmdWVyIFNldCB1bmQgUXVlcnktTWV0aG9kZW4gLT4gbWFuIFNldAorICAgICBzdGF0aWMgbWl4ZWQgKm15X3F1ZXJ5X2F1dG9sb2Fkb2JqKCk7CisgICAgIHN0YXRpYyBtaXhlZCAqbXlfc2V0X2F1dG9sb2Fkb2JqKG1peGVkICpuZXcpOworCisgICAgIHZvaWQgY3JlYXRlKCkgeworICAgICAgLy8gQmluZGVuIGRlciBNZXRob2RlbgorICAgICAgU2V0KFBfQVVUT0xPQURPQkosICMnbXlfcXVlcnlfYXV0b2xvYWRvYmosIEZfUVVFUllfTUVUSE9EKTsKKyAgICAgIFNldChQX0FVVE9MT0FET0JKLCAjJ215X3NldF9hdXRvbG9hZG9iaiwgRl9TRVRfTUVUSE9EKTsKKworICAgICAgLy8gZGllIHdlcmRlbiBudXIgdm9uIG1pciB2ZXJhZW5kZXJ0IQorICAgICAgU2V0KFBfQVVUT0xPQURPQkosIFBST1RFQ1RFRCwgRl9NT0RFX0FTKTsKKyAgICAgIC4uLgorICAgICB9CisKKyAgICAgc3RhdGljIG1peGVkICpteV9xdWVyeV9hdXRvbG9hZG9iaiAoKSB7CisgICAgICAgLy8gcy5vLgorICAgICB9CisKKyAgICAgc3RhdGljIG1peGVkICpteV9zZXRfYXV0b2xvYWRvYmogKG1peGVkICpuZXcpIHsKKyAgICAgICAvLyBzLm8uCisgICAgIH0KKworU0lFSEUgQVVDSDoKKyAgICAgUF9BVVRPTE9BRCwgU2V0UHJvcAorCisyNC5BdWcuMjAwNiBHbG9pbnNvbkBNRwpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfQVZBVEFSX1VSSSBiL2RvYy9wcm9wcy9QX0FWQVRBUl9VUkkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI3NTM5OQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0FWQVRBUl9VUkkKQEAgLTAsMCArMSwyMiBAQAorTkFNRToKKyAgICBQX0FWQVRBUl9VUkkgICAgICAgICAgICAgICAgICAgICJwX2xpYl9hdmF0YXJ1cmkiCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL2xpdmluZy9kZXNjcmlwdGlvbi5oCisKK0JFU0NIUkVJQlVORzoKKyAgICBMZWJld2VzZW4gc3BlaWNoZXJuIGluIGRlciBQcm9wIFBfQVZBVEFSX1VSSSBlaW5lIFVSSSAoc3RyaW5nKSwgd2VsY2hlIGF1ZgorICAgIGVpbiBCaWxkIGltIE5ldHogdmVyd2Vpc3QsIHdlbGNoZXMgZWluIENsaWVudCBmdWVyIGRpZXNlcyBMZWJld2VzZW4KKyAgICBhbnplaWdlbiBrYW5uLgorICAgIFNwaWVsZXIga29lbm5lbiBkaWVzZSBBdmF0YXItVVJJIG1pdCBkZW0gQmVmZWhsICdhdmF0YXInIGFuemVpZ2VuLAorICAgIGFlbmRlcm4gdW5kIGxvZXNjaGVuLgorICAgIEF2YXRhci1VUklzIGFuZGVyZXIgU3BpZWxlciBsYXNzZW4gc2ljaCBtaXQgJ2ZpbmdlciAtYScgYXVzZ2ViZW4uCisKK0JFTUVSS1VOR0VOOgorICAgIERpZXNlIFByb3BlcnR5IGthbm4gbnVyIHZvbSBTcGllbGVyIG9kZXIgZWluZW0gRU0gbW9kaWZpemllcnQgd2VyZGVuLgorCitTSUVIRSBBVUNIOgorICAgIGF2YXRhcgorCitMRVRaVEVSIEFFTkRFUlVORzoKKyAgICAwMy45LjIwMTEsIFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0FWRVJBR0VfU0laRSBiL2RvYy9wcm9wcy9QX0FWRVJBR0VfU0laRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTYxMjA4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfQVZFUkFHRV9TSVpFCkBAIC0wLDAgKzEsOCBAQAorTkFNRToKKyAgICBQX0FWRVJBR0VfU0laRSAgICAgICAgICAgICAgICAiYXZlcmFnZV9zaXplIiAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcGxheWVyL2Rlc2NyaXB0aW9uLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBEdXJjaHNjaG5pdHRsaWNoZSBHcm9lc3NlIGVpbmVzIFdlc2VucyBkaWVzZXIgUmFzc2UgKGRlcnplaXQgbnVyIFBsYXllcikKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0FWRVJBR0VfV0VJR0hUIGIvZG9jL3Byb3BzL1BfQVZFUkFHRV9XRUlHSFQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg1NTdjYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0FWRVJBR0VfV0VJR0hUCkBAIC0wLDAgKzEsOCBAQAorTkFNRToKKyAgICBQX0FWRVJBR0VfV0VJR0hUICAgICAgICAgICAgICAgICJhdmVyYWdlX3dlaWdodCIKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcGxheWVyL2Rlc2NyaXB0aW9uLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBEdXJjaHNjaG5pdHRsaWNoZSBHZXdpY2h0IGVpbmVzIFdlc2VucyBkaWVzZXIgUmFzc2UgKGRlcnplaXQgbnVyIFBsYXllcikKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0FXQVkgYi9kb2MvcHJvcHMvUF9BV0FZCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMmM5MzgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9BV0FZCkBAIC0wLDAgKzEsOCBAQAorTkFNRToKKyAgICBQX0FXQVkgICAgICAgICAgICAgICAgICAgICAgICAiYXdheSIgICAgICAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcHJvcGVydGllcy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgU3RyaW5nIGRlciBhdXNnZWdlYmVuIHdpcmQsIHdlbm4gbWFuIHdlZyBpc3QgdW5kIGVpbmUgTWl0dGVpbHVuZyBiZWtvbW10LgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfQkFEX01TRyBiL2RvYy9wcm9wcy9QX0JBRF9NU0cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA2N2YyYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0JBRF9NU0cKQEAgLTAsMCArMSwyNyBAQAorTkFNRToKKyAgICAgUF9CQURfTVNHICAgICAgICAgICAgICAgICAgICAgInN0ZF9mb29kX2JhZF9tc2ciCisKK0RFRklOSUVSVCBJTjoKKyAgICAgPHN5cy9mb29kLmg+CisKK0JFU0NIUkVJQlVORzoKKyAgICAgTWVsZHVuZywgd2VubiBlaW5lIFNwZWlzZSBnZXJhZGUgdmVyZGlyYnQuCisgICAgIEJlZmluZGV0IHNpY2ggZGllIFNwZWlzZSBpbiBlaW5lbSBTcGllbGVyLCBnZWh0IGRpZSBNZWxkdW5nIGFuIGdlbmF1CisgICAgIGRpZXNlbiwgbGllZ3QgZGllIFNwZWlzZSBpbSBSYXVtLCBnZWh0IGRpZSBNZWxkdW5nIGFuIGFsbGUgYW53ZXNlbmRlbgorICAgICBTcGllbGVyLgorICAgICAKK0JFTUVSS1VOR0VOOgorICAgICBEaWVzZSBNZWxkdW5nIHdpcmQgdm9uIHJlcGxhY2VfcGVyc29uYWwgbWl0IGRlbiBBcmd1bWVudGVuOgorICAgICAxLiBTcGVpc2UKKyAgICAgMi4gS29uc3VtZW50CisgICAgIHZlcmFyYmVpdGV0LCBrYW5uIGFscyBlbnRzcHJlY2hlbmRlIFBsYXR6aGFsdGVyIGVudGhhbHRlbgorICAgICAKK0RFRkFVTFQ6CisgICAgICJAV0VSMSB2ZXJkaXJidC4iCisKK1NJRUhFIEFVQ0g6CisgICAgIFBfTElGRVRJTUUsIFBfUkVTRVRfTElGRVRJTUUsIFBfTk9fQkFELAorICAgICB3aXovZm9vZCwgcmVwbGFjZV9wZXJzb25hbAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFRodSBPY3QgMjggMTI6MTU6MDAgMjAxMCBieSBDYWxkcmEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9CTElORCBiL2RvYy9wcm9wcy9QX0JMSU5ECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MDgxNGIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9CTElORApAQCAtMCwwICsxLDM1IEBACitOQU1FOgorICAgIFBfQkxJTkQgICAgICAgICAgICAgICAgICAgICAgICJibGluZCIgICAgICAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9wbGF5ZXIvdmlld2NtZC5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAxLCB3ZW5uIGRlciBTcGllbGVyIGJsaW5kIGlzdCB1bmQgbmljaHRzIG1laHIgc2VoZW4ga2Fubi4KKworICAgIFdpcmQgdm9uIENhbm5vdFNlZSgpIGJlaSAnc2NoYXUnIHVuZCBCZXRyZXRlbiB2b24gUmFldW1lbiAKKyAgICB1LmFlLiBhdXNnZXdlcnRldC4KKworICAgIFBfQkxJTkQga2FubiBhdWNoIGF1ZiBlaW5lbiBTdHJpbmcgZ2VzZXR6dCB3ZXJkZW4sIGRlciAKKyAgICBkYW5uIHN0YXR0IGRlcyAnRHUgYmlzdCBibGluZCcgYXVzZ2VnZWJlbiB3aXJkLgorCitCRUlTUElFTEU6CisKKyAgICB0aGlzX3BsYXllcigpLT5TZXRQcm9wKFBfQkxJTkQsMSk7CisKKyAgICB0aGlzX3BsYXllcigpLT5TZXRQcm9wKFBfQkxJTkQsIkR1IGhhc3QgRGlyIHZvcmhpbiBzbyBzY2hvZW4gZGllICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIkF1Z2VuIGF1c2dla3JhdHp0IC4uLiBkZXN3ZWdlbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyJzaWVoc3QgRHUgbnVuIG5pY2h0cyBtZWhyLlxuIik7ICAgIAorQkVNRVJLVU5HRU46CisgICAgVW0gaGVyYXVzenVmaW5kZW4sIG9iIGVpbiBTcGllbGVyIGV0d2FzIHNlaGVuIGthbm4gb2RlciBuaWNodCwKKyAgICBzb2xsdGUgbWFuIGxpZWJlciBpZih0aGlzX3BsYXllcigpLT5DYW5ub3RTZWUoKSAhPSAwKSBwcnVlZmVuCisgICAgc3RhdHQgaWYodGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKFBfQkxJTkQpKS4KKworICAgIERlbm4gQ2Fubm90U2VlKCkgYmVydWVja3NpY2h0aWd0IGF1Y2ggTmFjaHRzaWNodCAoYnp3LiBoaWVyIAorICAgIGVpbmUgbmljaHQgYWt0aXZpZXJ0ZSkgdW5kIGRpZSBMaWNodG1vZGlmaWthdG9yZW4uCisKK1NJRUhFIEFVQ0g6CisgICAgUF9MSUdIVF9NT0RJRklFUiwgUF9QTEFZRVJfTElHSFQsIENhbm5vdFNlZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMZXR6dGUgQWVuZGVydW5nOiBTYSAwMi4xMS4wMiwgMDA6MzA6MDAgVWhyLCB2b24gVGlsbHkKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0JPRFkgYi9kb2MvcHJvcHMvUF9CT0RZCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMDQ1ODEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9CT0RZCkBAIC0wLDAgKzEsOSBAQAorTkFNRToKKyAgICBQX0JPRFkgICAgICAgICAgICAgICAgICAgICAgICAiYm9keSIgICAgICAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcHJvcGVydGllcy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgTnVtZXJpc2NoZXIgV2VydCBmdWVyIGRpZSBBYndlaHJzdGFlcmtlIGRlcyBibGFua2VuIEtvZXJwZXJzCisgICAgIGRlcyBXZXNlbnMuCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9CUklFRiBiL2RvYy9wcm9wcy9QX0JSSUVGCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZWY0ODYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9CUklFRgpAQCAtMCwwICsxLDggQEAKK05BTUU6CisgICAgUF9CUklFRiAgICAgICAgICAgICAgICAgICAgICAgImJyaWVmIiAgICAgICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3BsYXllci92aWV3Y21kLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBJc3QgZ2VzZXR6dCwgd2VubiBkZXIgU3BpZWxlciBudXIgZGllIEt1cnpiZXNjaHJlaWJ1bmcgc2VoZW4gd2lsbC4KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0JVRkZFUiBiL2RvYy9wcm9wcy9QX0JVRkZFUgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjhmNzE5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfQlVGRkVSCkBAIC0wLDAgKzEsOSBAQAorTkFNRToKKyAgICBQX0JVRkZFUiAgICAgICAgICAgICAgICAgICAgICAiYnVmZmVyIiAgICAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcGxheWVyL2NvbW0uaAorCitCRVNDSFJFSUJVTkc6CisgICAgWmVpZ3QgYW4sIG9iIGRlciBLb2JvbGQgZGVzIFNwaWVsZXJzIGFrdGl2IG9kZXIgbmljaHQgYWt0aXYgaXN0LgorCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9CVVlfT05MWV9QTEFOVFMgYi9kb2MvcHJvcHMvUF9CVVlfT05MWV9QTEFOVFMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY3NDdjNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0JVWV9PTkxZX1BMQU5UUwpAQCAtMCwwICsxLDE1IEBACitOQU1FOgorICAgIFBfQlVZX09OTFlfUExBTlRTICAgICAgICAgICAgICAibGliX3BfYnV5X29ubHlfcGxhbnRzIgorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9yb29tL2Rlc2NyaXB0aW9uLmgKKworQkVTQ0hSRUlCVU5HOgorICAgIERpZXNlIFByb3BlcnR5IGthbm4gYXVmIDEgZ2VzZXR6dCB3ZXJkZW4sIHdlbm4gZWluIExhZGVuIG51ciBLcmFldXRlcgorICAgIGFua2F1ZmVuIGRhcmYuIEhpZXJ6dSBtdXNzIC9zdGQvcm9vbS9rcmFldXRlcmxhZGVuLmMgZ2VlcmJ0IHdlcmRlbiwKKyAgICBkYSBudXIgZGllc2VzIE9iamVrdCBkaWUgUHJvcGVydHkgYmVydWVja3NpY2h0aWd0LgorCitTSUVIRSBBVUNIOgorICAgIC9zdGQvcm9vbS9rcmFldXRlcmxhZGVuLmMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IDAyLjA0LjIwMTUgQXJhdGhvcm4gCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9DQUxMRURfRlJPTV9JUCBiL2RvYy9wcm9wcy9QX0NBTExFRF9GUk9NX0lQCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NDI3ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9DQUxMRURfRlJPTV9JUApAQCAtMCwwICsxLDggQEAKK05BTUU6CisgICAgUF9DQUxMRURfRlJPTV9JUCAgICAgICAgICAgICAgImNhbGxlZF9mcm9tX2lwIiAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3Byb3BlcnRpZXMuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIExldHp0ZSBJUC1BZHIsIHZvbiBkZXIgYXVzIHNpY2ggZGVyIFNwaWVsZXIgZWluZ2Vsb2dndCBoYXQuCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9DQU5fRkxBR1MgYi9kb2MvcHJvcHMvUF9DQU5fRkxBR1MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEzZWIyYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0NBTl9GTEFHUwpAQCAtMCwwICsxLDkgQEAKK05BTUU6CisgICAgUF9DQU5fRkxBR1MgICAgICAgICAgICAgICAgICAgImNhbl9mbGFncyIgICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3BsYXllci9jYW4uaAorCitCRVNDSFJFSUJVTkc6CisgICAgRmxhZ3MgZGllIGJlc3RpbW10ZSBCZWZlaGxlIGZyZWlzY2hhbHRlbjoKKyAgICBDQU5fRU1PVEUsIENBTl9FQ0hPLCBDQU5fUkVNT1RFLCBDQU5fUFJFU0FZCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9DQVBfTkFNRSBiL2RvYy9wcm9wcy9QX0NBUF9OQU1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYmU0MDgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9DQVBfTkFNRQpAQCAtMCwwICsxLDkgQEAKK05BTUU6CisgICAgUF9DQVBfTkFNRSAgICAgICAgICAgICAgICAgICAgImNhcF9uYW1lIiAgICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3Byb3BlcnRpZXMuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIE5hbWUgZGVzIFNwaWVsZXJzLCBkZXIgZGVrbGluaWVydCB1bmQgYXVzZ2VnZW4gd2lyZC4KKyAgICAgTk9UIFlFVCBJTVBMRU1FTlRFRC4KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0NBUlJJRURfVkFMVUUgYi9kb2MvcHJvcHMvUF9DQVJSSUVEX1ZBTFVFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZjliNjMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9DQVJSSUVEX1ZBTFVFCkBAIC0wLDAgKzEsOCBAQAorTkFNRToKKyAgICBQX0NBUlJJRURfVkFMVUUgICAgICAgICAgICAgICAiY2FycmllZCIgICAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcGxheWVyL2Jhc2UuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIEVudHNjaGFlZGlndW5nLCBkaWUgZGVyIFNwaWVsZXIgYmVpbSBFaW5sb2dnZW4gZXJoYWVsdC4KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0NIQVRTIGIvZG9jL3Byb3BzL1BfQ0hBVFMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMzY2RlYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0NIQVRTCkBAIC0wLDAgKzEsOCBAQAorTkFNRToKKyAgICBQX0NIQVRTICAgICAgICAgICAgICAgICAgICAgICAiY2hhdHMiICAgICAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcHJvcGVydGllcy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgQWxpc3QgbWl0IFN0cmluZ3MsIGRpZSBkYXMgTW9uc3RlciB6dWZhZWxsaWcgYXVzZ2lidC4KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0NIQVRfQ0hBTkNFIGIvZG9jL3Byb3BzL1BfQ0hBVF9DSEFOQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZhY2YwOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0NIQVRfQ0hBTkNFCkBAIC0wLDAgKzEsOCBAQAorTkFNRToKKyAgICBQX0NIQVRfQ0hBTkNFICAgICAgICAgICAgICAgICAiY2hhdF9jaGFuY2UiICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcHJvcGVydGllcy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgV2FocnNjaGVpbmxpY2hrZWl0LCBtaXQgZGVyIGRpZSBDaGF0cyBhdXNnZWdlYmVuIHdlcmRlbi4KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0NMQVNTIGIvZG9jL3Byb3BzL1BfQ0xBU1MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA3NDM5NAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0NMQVNTCkBAIC0wLDAgKzEsMTkgQEAKK1BfQ0xBU1MKK05BTUU6CisgICAgIFBfQ0xBU1MJCQkJCQkiY2xhc3MiCisKK0RFRklOSUVSVCBJTjoKKyAgICAgPHRoaW5nL2Rlc2NyaXB0aW9uLmg+CisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGllIEtsYXNzaWZpemllcnVuZyBlaW5lcyBPYmpla3Rlcywgc293ZWl0IHNpZSBuaWNodCBzY2hvbiB1ZWJlciBkaWUgCisgICAgIFJhc3NlIG9kZXIgZGllIElEcyBkZXMgT2JqZWt0ZXMgZXJmb2xndCBpc3QuIFp1bSBTZXR6ZW4gZGllc2VyIFByb3BlcnR5IAorICAgICBzb2xsdGUgbWFuIEFkZENsYXNzKCkgYmVudXR6ZW4sIHp1ciBLbGFzc2VuYWJmcmFnZSBzdGVodCAKKyAgICAgaXNfY2xhc3NfbWVtYmVyKCkgenVyIFZlcmZ1ZWd1bmcuCisgICAgIERpZSBtb2VnbGljaGVuIEtsYXNzZW4gZmluZGV0IG1hbiBpbiAvc3lzL2NsYXNzLmgKKworU0lFSEUgQVVDSDoKKyAgICAgQWRkQ2xhc3MoKSwgUmVtb3ZlQ2xhc3MoKSwgaXNfY2xhc3NfbWVtYmVyKCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogU3VuIE1heSAxOSAyMDozMDowOSAxOTk2IGJ5IFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfQ0xPQ0tNU0cgYi9kb2MvcHJvcHMvUF9DTE9DS01TRwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjcyZDY4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfQ0xPQ0tNU0cKQEAgLTAsMCArMSw4IEBACitOQU1FOgorICAgIFBfQ0xPQ0tNU0cgICAgICAgICAgICAgICAgICAgICJjbG9ja21zZyIgICAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9wcm9wZXJ0aWVzLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBEaWUgTWVsZHVuZyB3aXJkIHp1ciB2b2xsZW4gU3R1bmRlIGF1c2dlZ2ViZW4KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0NMT05FUiBiL2RvYy9wcm9wcy9QX0NMT05FUgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTliNjE0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfQ0xPTkVSCkBAIC0wLDAgKzEsMTIgQEAKK05BTUU6CisgICAgUF9DTE9ORVIgICAgICAgICAgICAgICAgICAgICAgImNsb25lciIgICAgICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3Byb3BlcnRpZXMuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIEVudGhhZWx0IGVpbmVuIFN0cmluZyBtaXQgZGVtIE5hbWVuIGRlc2plbmlnZW4sIGRlciBkYXMgT2JqZWt0IGdlY2xvbmVkIAorICAgICBoYXQuCisKK1NJRUhFIEFVQ0g6CisgICAgIFBfQ0xPTkVfVElNRQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfQ0xPTkVfTVNHIGIvZG9jL3Byb3BzL1BfQ0xPTkVfTVNHCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5Yzk2YTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9DTE9ORV9NU0cKQEAgLTAsMCArMSw4IEBACitOQU1FOgorICAgIFBfQ0xPTkVfTVNHICAgICAgICAgICAgICAgICAgICJjbG9uZV9tc2ciICAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9wbGF5ZXIvYmFzZS5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgTWVsZHVuZywgZGllIGJlaW0gQ2xvbmVuIGVpbmVzIE9iaiBhdXNnZWdlZ2VuIHdpcmQgKG51ciBNYWdpZXIpCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9DTE9ORV9USU1FIGIvZG9jL3Byb3BzL1BfQ0xPTkVfVElNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTA0ODQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfQ0xPTkVfVElNRQpAQCAtMCwwICsxLDE0IEBACitOQU1FOgorICAgIFBfQ0xPTkVfVElNRSAgICAgICAgICAgICAgICAgICAiY2xvbmVfdGltZSIgICAgICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3RoaW5nL2Rlc2NyaXB0aW9uLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBFbnRoYWVsdCBkaWUgQ2xvbmUtVGltZSBlaW5lcyBPYmpla3Rlcy4KKyAgICAgSGV1dHp1dGFnZSBvYnNvbGV0LCBiaXR0ZSBzdGF0dGRlc3NlbiBsaWViZXIgZGllIEVmdW4gb2JqZWN0X3RpbWUoKQorICAgICBiZW51dHplbi4KKworU0lFSEUgQVVDSDoKKyAgICAgVmVyd2FuZHQ6IG9iamVjdF90aW1lKEUpCisgICAgIEFlaG5saWNoOiBwcm9ncmFtX3RpbWUoRSkKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0NMT1RISU5HIGIvZG9jL3Byb3BzL1BfQ0xPVEhJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkzZjA5OAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0NMT1RISU5HCkBAIC0wLDAgKzEsMjIgQEAKK1BfQ0xPVEhJTkdTCisKK05BTUU6CisgICAgIFBfQ0xPVEhJTkcgICAgICAgICAgICAgICAgICAgICAic3RkOmNsb3RoaW5nIgorCitERUZJTklFUlQgSU46CisgICAgIDxsaXZpbmcvY2xvdGhpbmcuaD4KKworQkVTQ0hSRUlCVU5HOgorICAgICBBcnJheSBtaXQgZGVyIGdldHJhZ2VuZW4gbmljaHQtc2NodWV0emVuZGVuIEtsZWlkdW5nIGRlcyBMZWJld2VzZW4uCisgICAgIAorICAgICBGYWxscyBpaHIgZGllIEtsZWlkdW5nIGRlcyBMZWJld2VzZW5zLCBnZ2YuIG1pdCBiZXN0aW10ZW4gS3JpdGVyaWVuLAorICAgICBlcm1pdHRlbG4gd29sbHQsIGJlbnV0enQgaGllcmZ1ZXIgYml0dGUgZGllIEZ1bmt0aW9uIEZpbHRlckNsb3RoaW5nKCkKKyAgICAgc3RhdHQgc2VsYmVyIHVlYmVyIGRpZXNlcyBBcnJheSB6dSBsYXVmZW4uCisKKyAgICAgRGllc2UgUHJvcGVydHkga2FubiBudXIgdm9tIExlYmV3ZXNlbiBzZWxiZXIgYmVzY2hyaWViZW4gd2VyZGVuLgorICAgICAKK1NJRUhFIEFVQ0g6CisgICAgIFZlcndhbmR0OgkJUXVlcnlBcm1vdXJCeVR5cGUoTCksIEZpbHRlckNsb3RoaW5nKCksIEZpbHRlckFybW91cnMoKQorICAgICAgICAgICAgICAgICAgV2VhcigpLCBVbndlYXIoKSwgUF9BUk1PVVJTCisKKzE0LjAzLjIwMDksIFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0NNU0cgYi9kb2MvcHJvcHMvUF9DTVNHCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMDE3MjIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9DTVNHCkBAIC0wLDAgKzEsOCBAQAorTkFNRToKKyAgICBQX0NNU0cgICAgICAgICAgICAgICAgICAgICAgICAiY2xvbmVtc2ciICAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcGxheWVyL2Jhc2UuaAorCitCRVNDSFJFSUJVTkc6CisgICAgICoqKiBPQlNPTEVUISAqKiogU2llaGUgUF9DTE9ORV9NU0cKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0NOVF9TVEFUVVMgYi9kb2MvcHJvcHMvUF9DTlRfU1RBVFVTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkOTIzMjQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9DTlRfU1RBVFVTCkBAIC0wLDAgKzEsOSBAQAorTkFNRToKKyAgICBQX0NOVF9TVEFUVVMgICAgICAgICAgICAgICAgICAiY250X3N0YXR1cyIgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvY29udGFpbmVyLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBTdGF0dXMgZGVzIENvbnRhaW5lcnMgKG9mZmVuLCBnZXNjaGxvc3NlbiwgYWJnZXNjaGxvc3NlbikKKyAgICAgc2llaGUgYXVjaCAvc3lzL2NvbnRhaW5lci5oCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9DT01CQVRDTURTIGIvZG9jL3Byb3BzL1BfQ09NQkFUQ01EUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjlhNjVmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfQ09NQkFUQ01EUwpAQCAtMCwwICsxLDMxIEBACitOQU1FOgorICAgIFBfQ09NQkFUQ01EUyAgICAgICAgICAgICAgICAgICJjb21iYXRjbWRzIiAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9wcm9wZXJ0aWVzLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBGdWVyIGRlbiBLYW1wZiBnZWJyYXVjaGJhcmUgQmVmZWhsZSBzcGV6aWVsbGVyIE9iamVrdGUgKGRhbWl0IGF1Y2gKKyAgICAgTW9uc3RlciBzaWUgYXV0b21hdGlzY2ggcmljaHRpZyBhbndlbmRlbiBrb2VubmVuKQorICAgICBEZXIgSW5oYWx0IHZvbiBQX0NPTUJBVENNRFMgaXN0IGVpbiBNYXBwaW5nLCBkZXIgS2V5IGlzdCBkYXMgS29tbWFuZG8sCisgICAgIHVtIGRlbiBHZWdlbnN0YW5kIHp1IGJlbnV0emVuIChhbHNvIHouQi4gIndpcmYgZmxhbW1lbmt1Z2VsIiksIHVuZCBkZXIKKyAgICAgVmFsdWUgZWluIHdlaXRlcmVzIE1hcHBpbmcgbWl0IFp1c2F0emluZm9zIChkZWZpbmllcnQgaW4gL3N5cy9jb21iYXQuaCkuCisgICAgIEZvbGdlbmRlIEtleXMgc2luZCBkZWZpbmllcnQ6CisgICAgIC0gQ19NSU4sIENfQVZHLCBDX01BWDoKKyAgICAgICBtaW5pbWFsZXIsIG1pdHRsZXJlciB1bmQgbWF4aW1hbGVyIFNjaGFkZW4sIGRlbiBkYXMKKyAgICAgICBPYmpla3QgbWFjaHQuIEFsbGUgQW5nYWJlbiBpbiBMRUJFTlNQVU5LVEVOLCBkLmguIERlZmVuZC1FaW5oZWl0ZW4vMTAuCisgICAgICAgQmVpIGVpbmVtIEF1ZnJ1ZiB3aWUgJ2VuZW15LT5EZWZlbmQoMjAwK3JhbmRvbSgyMDApLCAuLi4pJyBpc3QgZGFubgorICAgICAgIENfTUlOPTIwLCBDX0FWRz0zMCwgQ19NQVg9NDAuCisgICAgIC0gQ19EVFlQRVM6CisgICAgICAgQXJyYXkgbWl0IGRlbSBTY2hhZGVuc3R5cCBvZGVyIGRlbiBTY2hhZGVuc3R5cGVuLiBCZWltIEVpc3N0YWIKKyAgICAgICB3dWVyZGUgZGVyIEVpbnRyYWcgZGFubiAnQ19EVFlQRVM6KHtEVF9DT0xEfSknIGxhdXRlbi4KKyAgICAgLSBDX0hFQUw6CisgICAgICAgU29sbHRlIGRhcyBLYW1wZm9iamVrdCB1ZWJlciBkaWUgTW9lZ2xpY2hrZWl0IHZlcmZ1ZWdlbiwgZGVuIEFud2VuZGVyCisgICAgICAgaXJnZW5kd2llIHp1IGhlaWxlbiwgc28gd2lyZCBoaWVyIGRpZSBIZWlsdW5nIGluIExQL01QIGVpbmdldHJhZ2VuLgorICAgICAgIERhcyBmdW5rdGlvbmllcnQgYXVjaCBiZWkgT2JqZWt0ZW4sIGRpZSBudXIgaGVpbGVuLCBhbHNvIHNvbnN0CisgICAgICAgbmljaHRzIG1pdCBLYW1wZiB6dSB0dW4gaGFiZW4uCisgICAgICAgSW0gTHVwaW5lbnRhbCB6LkIuIGdpYnQgZXMgUGZpcnNpY2hlLCBkaWUgYmVpbSBFc3NlbiA1TFAgaGVpbGVuLiBEYQorICAgICAgIGthbm4gbWFuIGRhbm4gJ1NldFByb3AoUF9DT01CQVRDTURTLCAoWyJpc3MgcGZpcnNpY2giOihbQ19IRUFMOjVdKV0pKScKKyAgICAgICBlaW50cmFnZW4uCisgICAgIEVzIHNpbmQgYXVjaCBtZWhyZXJlIEtvbW1hbmRvcyBtb2VnbGljaCwgei5CLiBiZWkgT2JqZWt0ZW4sIGRpZSBzb3dvaGwKKyAgICAgaGVpbGVuIGFscyBhdWNoIEthbXBmd2lya3VuZyBoYWJlbi4KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0NPTU1BTkRTIGIvZG9jL3Byb3BzL1BfQ09NTUFORFMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI3ZDFhMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0NPTU1BTkRTCkBAIC0wLDAgKzEsNDcgQEAKK1BfQ09NTUFORFMKK05BTUU6CisgICAgIFBfQ09NTUFORFMgImNvbW1hbmRzIgorCitERUZJTklFUlQgSU46CisgICAgIDx0aGluZy9jb21tYW5kcy5oPgorCitCRVNDSFJFSUJVTkc6CisgICAgIERpZXNlIFByb3BlcnR5IGVudGhhZWx0IGVpbiBNYXBwaW5nIG1pdCBkZW4gQmVmZWhsZW4sIGRpZSBkZW0gT2JqZWt0CisgICAgIHp1Z2VvcmRuZXQgc2luZC4KKworICAgICBTaWUgc29sbHRlIG5pY2h0IHZvbiBIYW5kIG1hbmlwdWxpZXJ0IHdlcmRlbiwgc29uZGVybiBudXIgdWViZXIgZGllCisgICAgIEZ1bmt0aW9uZW4gQWRkQ21kKCkgdW5kIFJlbW92ZUNtZCgpLgorCisgICAgIERhcyBNYXBwaW5nIGhhdCBmb2xnZW5kZW4gQXVmYmF1OgorCisgICAgIChbIGJlZmVobCA6ICh7ZnVua3Rpb24xLC4uLn0pOworICAgICAgICAgICAgICAgICAoe2ZsYWcxLC4uLn0pOworICAgICAgICAgICAgICAgICAoe3JlZ2VsMSwuLi59KTsKKyAgICAgICAgICAgICAgICAgKHtpZDEsIC4uLn0pLAorICAgICAgICAuLi4gXSkKKworICAgICBEaWUgRWludHJhZWdlIGVudHNwcmVjaGVuIGRlbiBQYXJhbWV0ZXJuIGRlcyBBZGRDbWQoKS1BdWZydWZzLCBzaW5kCisgICAgIGFiZXIgaW4gYW5kZXJlciBGb3JtLiBBbHMgQmVpc3BpZWw6CisKKyAgICAgQWRkQ21kKHZlcmIsZnVuMSwxKTsKKyAgICAgQWRkQ21kKHZlcmIrc3luMWF8c3luMWImc3luMmF8c3luMmJ8c3luMmMsZnVuMiwKKwkgICBlcnJvcjFfbm90aWZ5fGVycm9yMl9ub3RpZnleZXJyb3IyX3dyaXRlKTsKKyAgICAgLS0+CisgICAgIChbdmVyYjooe2Z1bjEsZnVuMn0pOwkJCQkJICAvLyBmdW5zCisJICAgICh7MSwoe2Vycm9yMV9ub3RpZnksIGVycm9yMl93cml0ZV5lcnJvcjJfc2F5LCAxfSl9KTsgIC8vIGZsYWdzCisgICAgICAgICAgICAoezAsKHsoe3N5bjFhLHN5bjFifSksKHtzeW4yYSxzeW4yYixzeW4yY30pfSl9KTsJICAvLyBydWxlcworICAgICAgICAgICAgMF0pCQkJCQkJCSAgLy8gSURzCisKKyAgICAgQXVmZ2VzY2hsdWVzc2VsdCBzZWhlbiBkaWUgZWluemVsbmVuIEFycmF5cyBmb2xnZW5kZXJtYXNzZW4gYXVzOgorCisgICAgIFJ1bGVzOiAoezxSZWdlbHNhdHogZnVlciBmdW4xPiwgKHs8MS4gU3lub255bWdydXBwZT4sCisJCQkJICAgICAgIDwyLiBTeW5vbnltZ3J1cHBlLCAuLi59KSwgLi4ufSkKKyAgICAgRmxhZ3M6ICh7PEZsYWcgZnVlciBmdW4xPiwgKHs8RmVobGVybWVsZHVuZyAxLiBTeW5vbnltZ3J1cHBlPiwgLi4uICwKKwkJCQkgIFssIEluZGV4IGZ1ZXIgd3JpdGUgYW5zdGF0dCBub3RpZnlfZmFpbF19KSwKKwkgICAgICAuLi4gfSkKKyAgICAgSURzOiAgIDAgb2RlciAoezxJRCBmdWVyIGZ1bjE+fSkgb2RlciAoezAsIDxJRCBmdWVyIGZ1bjI+fSkgLi4uCisKK1NJRUhFIEFVQ0g6CisgICAgIC9zdGQvdGhpbmcvY29tbWFuZHMuYywgQWRkQ21kKCksIFJlbW92ZUNtZCgpCisKKzA4LkRlei4yMDAzIEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9DT01QSUxFUl9QQVRIIGIvZG9jL3Byb3BzL1BfQ09NUElMRVJfUEFUSApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2QyNzQzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfQ09NUElMRVJfUEFUSApAQCAtMCwwICsxLDIxIEBACitOQU1FOgorICAgIFBfQ09NUElMRVJfUEFUSCAgICAgICAgICAgICAgICJjb21waWxlcl9wYXRoIiAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy92X2NvbXBpbGVyLmgKKworQkVTQ0hSRUlCVU5HOgorICAgIERpcmVjdG9yeSBpbiBkZW0gZWluIFZpcnR1YWwgQ29tcGlsZXIgT2JqZWt0ZSBlcnpldWd0LgorICAgIE11c3MgaW0gdmlydHVhbF9jb21waWxlci5jIGdlc2V0enQgd2VyZGVuLgorCisgICAgRGVyIFZpcnR1YWxDb21waWxlciBtdXNzIG5pY2h0IHp3aW5nZW5kIGluIGRpZXNlbSBWZXJ6ZWljaG5pcworICAgIGxpZWdlbiwgdW0genUgZnVua3Rpb25pZXJlbiwgc29sbHRlIGVzIGFiZXIsIHVtIGRpZSBadW9yZG51bmcgZGVzIFZDcyB6dQorICAgICJzZWluZW4iIE9iamVrdGVuIHp1IGVybGVpY2hlcm4uCisKK0JFSVNQSUVMOgorICAgIFNldFByb3AoUF9DT01QSUxFUl9QQVRILCIvZC9yZWdpb24vbWFnaWVyL3ZjLyIpOworCitTSUVIRSBBVUNIOgorICAgIFBfU1REX09CSkVDVCwgdmlydHVhbF9jb21waWxlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGV0enRlIEFlbmRlcnVuZzogMjMuMTAuMjAwNywgdm9uIFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0NPTlNVTUVfTVNHIGIvZG9jL3Byb3BzL1BfQ09OU1VNRV9NU0cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI4YTA1YQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0NPTlNVTUVfTVNHCkBAIC0wLDAgKzEsMjQgQEAKK05BTUU6CisgICAgIFBfQ09OU1VNRV9NU0cgICAgICAgICAgICAgICAgICJzdGRfZm9vZF9jb25zdW1lX21zZyIKKworREVGSU5JRVJUIElOOgorICAgICA8c3lzL2Zvb2QuaD4KKworQkVTQ0hSRUlCVU5HOgorICAgICBNZWxkdW5nIGFuIGRlbiBSYXVtIGV4a2x1c2l2ZSBLb25zdW1lbnQsIHdlbm4gZWluZSBTcGVpc2Uga29uc3VtaWVydAorICAgICB3aXJkLgorICAgICAKK0JFTUVSS1VOR0VOOgorICAgICBEaWVzZSBNZWxkdW5nIHdpcmQgdm9uIHJlcGxhY2VfcGVyc29uYWwgbWl0IGRlbiBBcmd1bWVudGVuOgorICAgICAxLiBTcGVpc2UKKyAgICAgMi4gS29uc3VtZW50CisgICAgIHZlcmFyYmVpdGV0LCBrYW5uIGFscyBlbnRzcHJlY2hlbmRlIFBsYXR6aGFsdGVyIGVudGhhbHRlbgorICAgICAKK0RFRkFVTFQ6CisgICAgICJAV0VSMiBrb25zdW1pZXJ0IEBXRU4xLiIKKworU0lFSEUgQVVDSDoKKyAgICAgL3N0ZC9mb29kLmMsIHdpei9mb29kLCByZXBsYWNlX3BlcnNvbmFsCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogVGh1IE9jdCAyOCAxMjoxNTowMCAyMDEwIGJ5IENhbGRyYQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0NPTlRBSU5FUiBiL2RvYy9wcm9wcy9QX0NPTlRBSU5FUgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDE1Y2E1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfQ09OVEFJTkVSCkBAIC0wLDAgKzEsOCBAQAorTkFNRToKKyAgICBQX0NPTlRBSU5FUiAgICAgICAgICAgICAgICAgICAiY29udGFpbmVyIiAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcHJvcGVydGllcy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAqKiogS0VJTkUgQkVTQ0hSRUlCVU5HIFZPUkhBTkRFTiAqKioKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0NPTlRFTlRTIGIvZG9jL3Byb3BzL1BfQ09OVEVOVFMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIxMmRhNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0NPTlRFTlRTCkBAIC0wLDAgKzEsOCBAQAorTkFNRToKKyAgICBQX0NPTlRFTlRTICAgICAgICAgICAgICAgICAgICAiY29udGVudHMiICAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvY29udGFpbmVyLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICAqKiogT0JTT0xFVCEgKioqCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9DT1JQU0UgYi9kb2MvcHJvcHMvUF9DT1JQU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNiMGFiNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0NPUlBTRQpAQCAtMCwwICsxLDI1IEBACitOQU1FOgorICAgIFBfQ09SUFNFCQkiY29ycHNlIgorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9wcm9wZXJ0aWVzLmgKKworQkVTQ0hSRUlCVU5HOgorICAgIEhpZXIga2FubiBtYW4gYW5nZWJlbiwgd2VsY2hlIEFydCB2b24gTGVpY2hlIGJlaW0gVG9kIGRlcyBOUENzCisgICAgaGludGVybGFzc2VuIHdpcmQuIERhbWl0IGRpZSBMZWljaGUgYXVmIGRlbSBNb2VyZGVyLUthbmFsIHNlbmRlbgorICAgIGthbm4sIG11c3MgZGFzIExlaWNoZW4tT2JqZWt0IC9zdGQvY29ycHNlIHNlaW4gb2RlciBlcmJlbi4KKworQkVJU1BJRUxFOgorICAgIERpZSB1ZWJsaWNoZSBTdGFuZGFyZGxlaWNoZSBiZWZpbmRldCBzaWNoIHVudGVyICIvc3RkL2NvcnBzZS5jIiwKKyAgICB3ZWxjaGVzIGF1Y2ggZGllIERlZmF1bHRlaW5zdGVsbHVuZyBmdWVyIGRpZXNlIFByb3BlcnR5IGRhcnN0ZWxsdDoKKyAgICAgIFNldFByb3AoUF9DT1JQU0UsIi9zdGQvY29ycHNlIik7CisgICAgTWFuIGtvZW5udGUgYWJlciBhdWNoIGVpbmVuIFpvbWJpZSBlbnRzdGVoZW4gbGFzc2VuOgorICAgICAgU2V0UHJvcChQX0NPUlBTRSxQQVRIKCJ6b21iaWUiKSk7CisgICAgUEFUSCBrZW5uemVpY2huZXQgaGllcmJlaSBkZW4gUGZhZCwgdW50ZXIgd2VsY2hlbSAiem9tYmllLmMiIHp1CisgICAgZmluZGVuIGlzdC4KKworU0lFSEUgQVVDSDoKKyAgICBQX05PQ09SUFNFLCBQX1pBUF9NU0csIFBfRElFX01TRywgUF9NVVJERVJfTVNHLCBQX0tJTExfTVNHCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IE1vbiBBcHIgMDcgMTE6MDI6MDYgMjAwMyBieSBNYW5kcmFnb24KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0NVUlJFTlRESVIgYi9kb2MvcHJvcHMvUF9DVVJSRU5URElSCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YmJkNWMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9DVVJSRU5URElSCkBAIC0wLDAgKzEsMTUgQEAKK05BTUU6CisgICAgUF9DVVJSRU5URElSICAgICAgICAgICAgICAgICAgImN1cnJlbnRkaXIiCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3NoZWxscy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICBNb21lbnRhbmVzIFZlcnplaWNobmlzIGluIGRlbSBkZXIgTWFnaWVyIGlzdC4KKyAgICAobnVyIGZ1ZXIgTWFnaWVyIHZvbiBCZWxhbmcpCisKK1NpZWhlIGF1Y2g6CisgICAgUF9DVVJSRU5URElSCisKK0xldHp0ZSBBZW5kZXJ1bmc6CisgICAgMDMuMDYuMjAxNSwgQnVnZml4CmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9DVVJTRUQgYi9kb2MvcHJvcHMvUF9DVVJTRUQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk0ODZmZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0NVUlNFRApAQCAtMCwwICsxLDM1IEBACitQX0NVUlNFRAorCitOQU1FOgorICAgICBQX0NVUlNFRCAiY3Vyc2VkIgorCitERUZJTklFUlQgSU46CisgICAgIDxwcm9wZXJ0aWVzLmg+CisKK0JFU0NIUkVJQlVORzoKKyAgICAgUnVlc3R1bmdlbiB1bmQgV2FmZmVuLCBkaWUgc2ljaCwgZWlubWFsIGFuZ2V6b2dlbiBiencuIGdlenVlY2t0LCBuaWNodAorICAgICB3aWVkZXIgZW50ZmVybmVuIGxhc3NlbiBzb2xsZW4sIGthbm4gbWFuIHVlYmVyIGRpZXNlIFByb3BlcnR5CisgICAgIHJlYWxpc2llcmVuLiBEaWUgV2FmZmUgb2RlciBSdWVzdHVuZyBoYXQgZGFubiBpbiBkZXIgUmVnZWwgbmVnYXRpdmUKKyAgICAgQXVzd2lya3VuZ2VuIGF1ZiBkZW4gVHJhZWdlci4uLgorCisgICAgIFNldHp0IG1hbiBkaWVzZSBQcm9wZXJ0eSBhdWYgZWluZSBaYWhsIHVuZ2xlaWNoIDAsIHNvIGJla29tbXQgbWFuIGJlaQorICAgICBkZW0gVmVyc3VjaCwgZGVuIHZlcmZsdWNodGVuIEdlZ2Vuc3RhbmQgYXVzenV6aWVoZW4gYnp3LiB3ZWd6dXN0ZWNrZW4KKyAgICAgZWluZSBEZWZhdWx0bWVsZHVuZy4KKworICAgICBUcmFlZ3QgbWFuIGRhZ2VnZW4gZWluZW4gU3RyaW5nIGVpbiwgc28gd2lyZCBkaWVzZXIgYmVpbSBWZXJzdWNoLCBkZW4KKyAgICAgR2VnZW5zdGFuZCBsb3N6dXdlcmRlbiwgYXVzZ2VnZWJlbi4KKworQkVNRVJLVU5HRU46CisgICAgIERlciAnRmx1Y2gnIHdpcmQgZXJzdCB3aXJrc2FtLCB3ZW5uIGRhcyBPcGZlciBkaWUgV2FmZmUgenVlY2t0IGJ6dy4gZGllCisgICAgIFJ1ZXN0dW5nIGFuemllaHQuIElzdCBkaWVzIGVyc3QgZWlubWFsIGdlc2NoZWhlbiwgaGVsZmVuIG51ciBub2NoCisgICAgIFphdWJlcnNwcnVlY2hlIG9kZXIgZmx1Y2hicmVjaGVuZGUgSW5zdGl0dXRpb25lbi4KKworICAgICBNb2VjaHRlIG1hbiwgZGFzcyBkZXIgR2VnZW5zdGFuZCBlbnRmbHVjaGJhciBpc3QsIGRhbm4gc29sbHRlIGVyIGF1Y2gKKyAgICAgYW5zcHJlY2hiYXIgc2VpbiAoZ3VlbHRpZ2UgSUQsIG5pY2h0IHVuc2ljaHRiYXIpLCBkYSBkYXMgZHVyY2ggZGVyemVpdGlnZQorICAgICBFbnRmbHVjaG1vZWdsaWNoa2VpdGVuIHZvcmF1c2dlc2V0enQgd2lyZC4KKworU0lFSEUgQVVDSDoKKyAgICAgL3N0ZC9hcm1vdXIuYywgL3N0ZC93ZWFwb24uYworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBTdW4gTWF5IDE5IDE0OjQ1OjI4IDE5OTYgYnkgV2FyZ29uCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9EQU1BR0VEIGIvZG9jL3Byb3BzL1BfREFNQUdFRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzFlMGUwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfREFNQUdFRApAQCAtMCwwICsxLDI4IEBACitQX0RBTUFHRUQKKworTkFNRToKKyAgICAgUF9EQU1BR0VEICJpdGVtX2RhbWFnZWQiCisKK0RFRklOSUVSVCBJTjoKKyAgICAgPGNvbWJhdC5oPgorCitCRVNDSFJFSUJVTkc6CisgICAgIFJ1ZXN0dW5nZW4gdW5kIFdhZmZlbiBrb2VubmVuIGltIEVpZmVyIGRlcyBHZWZlY2h0cyBiZXNjaGFlZGlndCB3ZXJkZW4uCisgICAgIERlciBHcmFkIGRlciBCZXNjaGFlZGlndW5nIHNvbGx0ZSBpbiBkaWVzZXIgUHJvcGVydHkgZmVzdGdlaGFsdGVuCisgICAgIHdlcmRlbi4KKworICAgICBCZWkgV2FmZmVuIGVyZ2lidCBzaWNoIGRpZSB1cnNwcnVlbmdsaWNoZSBXYWZmZW5rbGFzc2UgYXVzIGRlciBTdW1tZQorICAgICB2b24gYWt0dWVsbGVyIFdhZmZlbmtsYXNzZSB1bmQgZGVtIFdlcnQgdm9uIFBfREFNQUdFRDoKKyAgICAgYWx0ZXMgUF9XQyA9IGFrdHVlbGxlcyBQX1dDICsgUF9EQU1BR0VELgorCisgICAgIEFuYWxvZ2VzIGdpbHQgZnVlciBkaWUgUnVlc3R1bmdza2xhc3NlIGVpbmVyIGJlc2NoYWVkaWd0ZW4gUnVlc3R1bmc6CisgICAgIGFsdGVzIFBfQUMgPSBha3R1ZWxsZXMgUF9BQyArIFBfREFNQUdFRC4KKworICAgICBQX0RBTUFHRUQgYml0dGUgbmllbWFscyBkaXJla3Qgc2V0emVuLCBzb25kZXJuIGltbWVyIHVlYmVyCisgICAgIGRpZSBGdW5rdGlvbiBEYW1hZ2UoKSBtYW5pcHVsaWVyZW4hCisKK1NJRUhFIEFVQ0g6CisgICAgIC9zdGQvYXJtb3VyLmMsIC9zdGQvd2VhcG9uLmMsIFRha2VGbGF3KCksIFF1ZXJ5RmxhdygpLCBEYW1hZ2UoKQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiswMi4xMC4yMDA3LCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9EQU1BR0VfTVNHIGIvZG9jL3Byb3BzL1BfREFNQUdFX01TRwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTIzYjE5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfREFNQUdFX01TRwpAQCAtMCwwICsxLDQ3IEBACitQX0RBTUFHRV9NU0cKKworTkFNRToKKyAgICAgUF9EQU1BR0VfTVNHICAgICAgInN0ZF9wX2RhbV9tc2ciCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N5cy9saXZpbmcvY29tYmF0LmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBJbiBkaWVzZXIgUHJvcGVydHkgbGFzc2VuIHNpY2ggaW5kaXZpZHVlbGxlIFRyZWZmZXItL1NjaGFkZW5zbWVsZHVuZ2VuCisgICAgIGZ1ZXIgZGllc2VzIExlYmV3ZXNlbiBmZXN0bGVnZW4uIFNpZSB3ZXJkZW4gdmVyd2VuZGV0LCBmYWxscyBiZWkKKyAgICAgZWluZ2VoZW5kZW0gU2NoYWRlbiBkZXIgQXVmcnVmZXIgdm9uIERlZmVuZCgpIFNjaGFkZW5zbWVsZHVuZ2VuIHd1ZW5zY2h0CisgICAgIChkLmguIFNQX1NIT1dfREFNQUdFICE9IDApLCBqZWRvY2gga2VpbmUgZWlnZW5lbiBNZWxkdW5nZW4gdm9yZ2lidC4KKworICAgICBFbnRoYWVsdCBkaWVzZSBQcm9wZXJ0eSBrZWluIEFycmF5LCB3ZXJkZW4gZ2dmLiBkaWUgU3RhbmRhcmRtZWxkdW5nZW4KKyAgICAgYXVzZ2VnZWJlbi4KKworICAgICBEYXRlbnN0cnVrdHVyIGRlciBQcm9wZXJ0eToKKyAgICAgICAoeworICAgICAgICAoeyBpbnQgbHBoaXQxLCBzdHJpbmcgbWVzc19tZSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1lc3NfZW4sCisgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtZXNzX3Jvb20gfSksCisgICAgICAgICh7IGxwaGl0MiwgbWVzc19tZSwgbWVzc19lbiwgbWVzc19yb29tIH0pLAorICAgICAgICAuLi4KKyAgICAgICAgKHsgbHBoaXRuLCBtZXNzX21lLCBtZXNzX2VuLCBtZXNzX3Jvb20gfSksCisgICAgICAgfSkKKyAgICAgICB3b2JlaSBscGhpdDE8bHBoaXQyPC4uLjxscGhpdG4gc2VpbiBtdXNzLCBkLmguIGRhcyBBcnJheS0KKyAgICAgICBBcnJheSBpc3QgYXVmc3RlaWdlbmQgc29ydGllcnQuCisKKyAgICAgSXN0IGVpbiBUcmVmZmVyIHggTFAgaGFydCwgd2VyZGVuIGRpZSBNZWxkdW5nZW4gZGVzIGxwaGl0LQorICAgICBBcnJheXMgYXVzZ2VnZWJlbiwgZGVzc2VuIFdlcnQgYW0gbmFlY2hzdGVuIHVudGVyIGRlbSBTY2hhZGVuCisgICAgIGxpZWd0LgorCisgICAgIEluIGRlbiBNZWxkdW5nZW4gbWVzc19tZSAoYW4gZGVuIEdldHJvZmZlbmVuKSwgbWVzc19lbiAoYW4KKyAgICAgZGVuIEZlaW5kKSwgbWVzc19yb29tIChhbiBkaWUgcmVzdGxpY2hlbiBVbXN0ZWhlbmRlbikga29lbm5lbgorICAgICBFcnNhdHpzdHJpbmdzIHdpZSBmb2xndCB2ZXJ3ZW5kZXQgd2VyZGVuOgorICAgICBAV0VSMS9AV0VTU0VOMS9AV0VNMS9AV0VOMSAtIG5hbWUoY2FzdXMpIGRlcyBHZXRyb2ZmZW5lbiAoVE8pCisgICAgIEBXRVIyL0BXRVNTRU4yL0BXRU0yL0BXRU4yIC0gbmFtZShjYXN1cykgZGVzIEZlaW5kZXMgKGVuZW15KQorCitCRUlTUElFTDoKKyAgICAgCisKK1NJRUhFIEFVQ0g6CisgICAgIERlZmVuZCgpCisgICAgIC9zdGQvbGl2aW5nL2NvbWJhdC5jCisKKzE1LjA5LjIwMTAsIFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0RBTV9ERVNDIGIvZG9jL3Byb3BzL1BfREFNX0RFU0MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk5MzhjNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0RBTV9ERVNDCkBAIC0wLDAgKzEsMzUgQEAKK1BfREFNX0RFU0MKKworTkFNRToKKyAgICAgUF9EQU1fREVTQyAiZGFtX2Rlc2MiCisKK0RFRklOSUVSVCBJTjoKKyAgICAgPHdlYXBvbi9kZXNjcmlwdGlvbi5oPgorCitCRVNDSFJFSUJVTkc6CisgICAgIEluIGRpZXNlciBQcm9wZXJ0eSBiZWZpbmRldCBzaWNoIGVpbiBTdHJpbmcgb2RlciBTdHJpbmctQXJyYXksIGR1cmNoIAorICAgICBkZW4gZGllIExhbmdiZXNjaHJlaWJ1bmcgZWluZXIgUnVlc3R1bmcgb2RlciBXYWZmZSBlcmdhZW56dCB3aXJkLAorICAgICB3ZW5uIGRpZXNlIEJlc2NoYWVkaWd0IGlzdC4KKworQkVNRVJLVU5HRU46CisgICAgIFdpcmQgZWluIFN0cmluZyBnZXNldHp0LCBzbyB3aXJkIGRpZXNlciBhbmdlemVpZ3QsIHdlbm4gZGllIFdhZmZlCisgICAgIG1laHIgYWxzIGRpZSBIYWVsZnRlIGJlc2NoYWVkaWd0IGlzdC4gQmVpIGVpbmVtIEFycmF5IHdpcmQgZGVyCisgICAgIFRleHQgZW50c3ByZWNoZW5kIGRlbSBHcmFkIGRlciBCZXNjaGFlZGlndW5nIGF1c2dld2FlaGx0OyBkYXMgQXJyYXkKKyAgICAgbXVzcyBpbiBkZXIgUmVpaGVuZm9sZ2UgenVuZWhtZW5kZXIgQmVzY2hhZWRpZ3VuZyBzb3J0aWVydCBzZWluLgorICAgICAKKyAgICAgQmVpIFdhZmZlbiBpc3QgUF9EQU1fREVTQyBkZWZhdWx0bWFlc3NpZyBhdWYgREZMVF9EQU1fREVTQyBnZXNldHp0LAorICAgICBiZWkgUnVlc3R1bmdlbiBhdWYgMC4KKworQkVJU1BJRUxFOgorICAgICBTZXRQcm9wKFBfREFNX0RFU0MsImlzdCBiZXNjaGFlZGlndCIpOworICAgICBTZXRQcm9wKFBfREFNX0RFU0MsKHsKKyAgICAgICAgICJpc3QgZXR3YXMgYmVzY2hhZWRpZ3QiLAorICAgICAgICAgImlzdCBiZXNjaGFlZGlndCIsCisgICAgICAgICAiaXN0IGJlc2NoYWVkaWd0IiwKKyAgICAgICAgICJpc3Qgc2VociBiZXNjaGFlZGlndCJ9KSApOworCitTSUVIRSBBVUNIOgorICAgICAvc3RkL3dlYXBvbi9kZXNjcmlwdGlvbi5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IE1vbiBPY3QgMTQgMTU6Mjk6MDAgMTk5NiBieSBQYXJhY2Vsc3VzCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9EQU1fVFlQRSBiL2RvYy9wcm9wcy9QX0RBTV9UWVBFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZmI0YmIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9EQU1fVFlQRQpAQCAtMCwwICsxLDIyIEBACitQX0RBTV9UWVBFCisKK05BTUU6CisgICAgIFBfREFNX1RZUEUgImRhbV90eXBlIgorCitERUZJTklFUlQgSU46CisgICAgIDx3ZWFwb24uaD4KKworQkVTQ0hSRUlCVU5HOgorICAgICBXYXMgZnVlciBlaW5lIEFydCB2b24gU2NoYWRlbiByaWNodGV0IGRpZSBXYWZmZSBhbj8gSGllciBrYW5uIG1hbiBlaW5lbgorICAgICBTdHJpbmcgb2RlciBlaW4gQXJyYXkgdm9uIFN0cmluZ3MgYW5nZWJlbiwgamUgbmFjaGRlbSwgd2VsY2hlIEVmZmVrdGUKKyAgICAgZGllIFdhZmZlIGF1c2xvZXNlbiBrYW5uLiBNYW4gc29sbHRlIGhpZXIgbnVyIGRpZSBpbiA8Y29tYmF0Lmg+CisgICAgIGRlZmluaWVydGVuIFNjaGFkZW5zdHlwZW4gdmVyd2VuZGVuLgorCisgICAgIEZyYWd0IG1hbiBkaWVzZSBQcm9wZXJ0eSBhYiwgYmVrb21tdCBtYW4gdWVicmlnZW5zIGltbWVyIGVpbiBBcnJheSB2b24KKyAgICAgU3RyaW5ncyB6dXJ1ZWNrLgorCitTSUVIRSBBVUNIOgorICAgICAvc3RkL3dlYXBvbi5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFN1biBNYXkgMTkgMTU6MjM6NDMgMTk5NiBieSBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0RFQURTIGIvZG9jL3Byb3BzL1BfREVBRFMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E0NGNkNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0RFQURTCkBAIC0wLDAgKzEsOSBAQAorTkFNRToKKyAgICBQX0RFQURTICAgICAgICAgICAgICAgICAgICAgICAiZGVhZHMiICAgICAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvbGl2aW5nL2xpZmUuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIEFuemFobCBkZXIgVG9kZSBkZXMgU3BpZWxlcnMgc2VpdCBFaW5mdWVocnVuZyBkaWVzZXIgUHJvcGVydHkgKGlyZ2VuZHdhbm4KKyAgICAgaW0gRGV6ZW1iZXIgOTQpCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9ERUFGIGIvZG9jL3Byb3BzL1BfREVBRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzQ1ZGZkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfREVBRgpAQCAtMCwwICsxLDEwIEBACitOQU1FOgorICAgIFBfREVBRiAgICAgICAgICAgICAgICAgICAgICAgICJkZWFmIiAgICAgICAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9wbGF5ZXIvY29tbS5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGVyIFNwaWVsZXIgaXN0IHRhdWIuIEZhbGxzIGhpZXIgZWluIFN0cmluZyBzdGVodCwgd2lyZCBkaWVzZXIgYmVpCisgICAgICJ0ZWlsZSAuLi4gbWl0IiBhbiBkZW4gTWl0dGVpbGVuZGVuIGF1c2dlZ2ViZW4sIGFuc29uc3RlbiBrb21tdCBudXIKKyAgICAgIlNvdW5kc28gaXN0IGxlaWRlciBnZXJhZGUgdGF1Yi5cbiIKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0RFQVRIX01TRyBiL2RvYy9wcm9wcy9QX0RFQVRIX01TRwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTA0NGJmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfREVBVEhfTVNHCkBAIC0wLDAgKzEsNDggQEAKK0RFRklOSUVSVCBJTjoNCisgICAgICAgIC9zeXMvbGl2aW5nL2NvbWJhdC5oDQorDQorQkVTQ0hSRUlCVU5HOg0KKyAgICAgICAgSW4gZGllc2VyIFByb3BlcnR5IGthbm4gbWFuIGVpbiBBcnJheSBhYmxlZ2VuLCBkYXMgYmVpbSBUb2QgZWluZXMNCisgICAgICAgIFNwaWVsZXJzIGF1c2dld2VydGV0IHVuZCBkZXIgZGFyaW4gZW50aGFsdGVuZSBTdHJpbmcNCisgICAgICAgIGFuc2NobGllc3NlbmQgYXVmIGRlbSBUb2Rlc2thbmFsIGdlc2VuZGV0IHdpcmQuDQorICAgICAgICBEZXIgQXJyYXkgbXVzcyBmb2xnZW5kZW4gQXVmYmF1IGhhYmVuOg0KKw0KKyAgICAgICAgICBTZXRQcm9wKCBQX0RFQVRIX01TRywgKHsgVGV4dCwgRmxhZyB9KSApDQorICAgICAgICAgIA0KKyAgICAgICAgVGV4dDogRGVyIFRleHQga2FubiBiZWxpZWJpZyBlaW5nZWdlYmVuIHdlcmRlLiBBbGxlcmRpbmdzIGRhcmYgDQorICAgICAgICAgICAgICBlciBuaWNodCBtaXQgZWluZW0gJ1xuJyBhYmdlc2NobG9zc2VuIHdlcmRlbi4NCisgICAgICAgIA0KKyAgICAgICAgRmxhZzogSGllciBrYW5uIG1hbiBkcmVpIEFydGVuIHZvbiBTZW5kZW1ldGhvZGVuIHdhZWhsZW4uDQorICAgICAgICAgICAgICAxLiBNU0dfU0FZICAgICAgTm9ybWFsZXMgU2VuZGVuDQorICAgICAgICAgICAgICAyLiBNU0dfR0VNT1RFICAgR2VuaXRpdi1FbW90ZQ0KKyAgICAgICAgICAgICAgMy4gTVNHX0VNT1RFICAgIEVtb3RlDQorDQorDQorQkVJU1BJRUw6DQorICAgICAgICBEZXIgU3BpZWxlciBzb2xsIGRpcmVrdCBuYWNoIHNlaW5lbSBUb2QgZWluZSBNZWxkdW5nIGF1ZiBkZW0gDQorICAgICAgICBUb2Rlc2thbmFsIHNlbmRlbi4NCisgICAgICAgIA0KKyAgICAgICAgTmFjaHJpY2h0IGF1ZiBkZW0gVG9kZXMtS2FuYWw6DQorCQ0KKyAgICAgICAgW1RvZDpTcGllbGVyXSBJY2ggd2lsbCBrZWluZSBCZWxlaWRzYmVrdW5kdW5nZW4hDQorICAgICAgICANCisgICAgICAgIHZvaWQgc3BpZWxlcl9zdGlyYnQoKQ0KKwl7DQorICAgICAgICAgdGhpc19wbGF5ZXIoKS0+U2V0UHJvcCggUF9ERUFUSF9NU0csICh7ICJJY2ggd2lsbCBrZWluZSAiDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCZWxlaWRzYmVrdW5kdW5nZW4hIiwgTVNHX1NBWX0pICk7DQorICAgICAgICAgdGhpc19wbGF5ZXIoKS0+ZGllKCk7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIE5hY2hyaWNodCBhdWYgZGVtIFRvZGVzLUthbmFsOg0KKwkNCisgICAgICAgIFtUb2Q6U3BpZWxlciBsaWVidCBlcyB6dSBzdGVyYmVuLl0NCisgICAgICAgIA0KKyAgICAgICAgdm9pZCBzcGllbGVyX3N0aXJidCgpDQorICAgICAgICB7DQorICAgICAgICAgdGhpc19wbGF5ZXIoKS0+U2V0UHJvcCggUF9ERUFUSF9NU0csICh7ICJsaWVidCBlcyB6dSBzdGVyYmVuLiIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1TR19FTU9URSB9KSApOw0KKyAgICAgICAgIHRoaXNfcGxheWVyKCktPmRpZSgpOw0KKyAgICAgICAgfQ0KKw0KK1NJRUhFIEFVQ0g6DQorICAgICAgICBQX01VUkRFUl9NU0csIFBfRk9SQ0VfTVVSREVSX01TRw0KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0RFQVRIX1NQT05TT1JFRF9CWSBiL2RvYy9wcm9wcy9QX0RFQVRIX1NQT05TT1JFRF9CWQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmQ3ZDQyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfREVBVEhfU1BPTlNPUkVEX0JZCkBAIC0wLDAgKzEsMjUgQEAKK05BTUU6CisgICAgUF9ERUFUSF9TUE9OU09SRURfQlkgICAgICAgICAgInJlc3BvbnNpYmxlX3dpemFyZF9mb3JfZGVhdGgiCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL2xpdmluZy9jb21iYXQuaAorCitCRVNDSFJFSUJVTkc6CisgICAgRGllc2UgUHJvcGVydHkgaGF0IGZ1ZXIgZGVuIFNwaWVsdmVybGF1ZiBrZWluZXJsZWkgQmVkZXV0dW5nLgorICAgIERvY2ggZ2lidCBlcyBNYWdpZXIsIGRpZSBpaHJlbiBOYW1lbiBnZXJuIGluIC9sb2cvS0lMTFMgbGVzZW4uCisgICAgV2lyZCBlaW4gU3BpZWxlciBkdXJjaCBlaW5lbiBOcGMgZ2V0b2V0ZXQsIGlzdCBub3JtYWxlcndlaXNlIGRlcgorICAgIE1hZ2llciBmdWVyIGRlbiBUb2QgdmVyYW50d29ydGxpY2gsIGluIGRlc3NlbiBWZXJ6ZWljaG5pcyBzaWNoIAorICAgIGRhcyBNb25zdGVyIGJlZmluZGV0LiAKKyAgICBEb2NoIGdpYnQgZXMgbnVuIGF1Y2ggZGVuIEZhbGwsIGRhc3Mgc2ljaCBkYXMgTW9uc3RlciBpbiBlaW5lbSAKKyAgICBWZXJ6ZWljaG5pcyAvYWxsZS9tb24vIGJlZmluZGV0LCBvZGVyIGRlciBTcGllbGVyIGR1cmNoIGVpbmUKKyAgICBBa3Rpb24gaW0gUmF1bSBvZGVyIGFuIGVpbmVtIE9iamVrdCBzdGlyYnQuCisKKyAgICBJc3QgaW4gZWluZW0gc29sY2hlbiBNb25zdGVyLCBSYXVtIG9kZXIgT2JqZWt0IGRpZXNlIFByb3BlcnR5CisgICAgZ2VzZXR6dCwgd2lyZCBkZXIgZG9ydCBhbmdlYmVuZSBTdHJpbmcgYW4gZGFzIExvZy1GaWxlIHVlYmVyLQorICAgIGdlYmVuLgorCitCRUlTUElFTDoKKyAgICBTZXRQcm9wKFBfREVBVEhfU1BPTlNPUkVEX0JZLCJ0aWxseSIpOworIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogRG9uIEZlYiAxNSAxNDowMTowMCAyMDAxIHZvbiBUaWxseQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfREVGQVVMVF9HVUlMRCBiL2RvYy9wcm9wcy9QX0RFRkFVTFRfR1VJTEQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhjYTRlNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0RFRkFVTFRfR1VJTEQKQEAgLTAsMCArMSwyNSBAQAorTkFNRToKKwlQX0RFRkFVTFRfR1VJTEQJCQkiZGVmYXVsdF9ndWlsZCIKKworREVGSU5JRVJUIElOOgorCS9zeXMvbmV3X3NraWxscy5oCisKK0JFU0NIUkVJQlVORzoKKwlEaWVzZSBQcm9wZXJ0eSBlbnRoYWVsdCBkZW4gTmFtZW4gZGVyIEdpbGRlLCB3ZWxjaGVyIGRlciBTcGllbGVyCisJc3RhbmRhcmRtYWVzc2lnIGFuZ2Vob2VydC4gRGVyIE5hbWUgd2lyZCBoaWVyYmVpIGluIEZvcm0gZWluZXMKKwlrbGVpbmdlc2NocmllYmVuZW4gU3RyaW5ncyBhbmdlZ2ViZW4uIElzdCBQX0dVSUxEIGdsZWljaCBOdWxsLCBzbworCXdpcmQgYmVpIGRlciBBYmZyYWdlIHNlbGJpZ2VyIFByb3BlcnR5IGhpZXJmdWVyIGRlciBFaW50cmFnIHZvbgorCVBfREVGQVVMVF9HVUlMRCBlaW5nZXNldHp0LgorCitCRU1FUktVTkdFTjoKKwlOYWNoIGRlbSBlcnN0ZW4gRWlubG9nZ2VuIGRlcyBTcGllbGVycyB3aXJkIGViZW5mYWxscyBkaWVzZXIgRWludHJhZworCWdlbnV0enQsIHVtIGRpZSBHaWxkZW56dWdlaG9lcmlna2VpdCBmZXN0enVsZWdlbi4gRGllcyBrYW5uIGRhenUKKwlnZW51dHp0IHdlcmRlbiwgdW0gZWluZSByYXNzZW5hYmhhZW5naWdlIEJlc3RpbW11bmcgZGVyCisJU3RhbmRhcmRnaWxkZSB6dSBnZXdhZWhybGVpc3RlbgorCSAoRmVsaW5lbiAtPiBLYXR6ZW5rcmllZ2VyLCBhbmRlcmUgUmFzc2VuIC0+IEFiZW50ZXVyZXIpLgorCitTSUVIRSBBVUNIOgorCVBfR1VJTEQsIFBfVklTSUJMRV9HVUlMRAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBXZWQgSmFuIDE0IDE5OjE3OjA2IDE5OTggYnkgUGF0cnluCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9ERUZBVUxUX05PVElGWV9GQUlMIGIvZG9jL3Byb3BzL1BfREVGQVVMVF9OT1RJRllfRkFJTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTFlOGRmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfREVGQVVMVF9OT1RJRllfRkFJTApAQCAtMCwwICsxLDggQEAKK05BTUU6CisgICAgUF9ERUZBVUxUX05PVElGWV9GQUlMICAgICAgICAgImRlZmF1bHRfbm90aWZ5X2ZhaWwiICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3BsYXllci5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgV2VsY2hlIEZlaGxlcm1lbGR1bmcga29tbXQsIHdlbm4ga2VpbiBPYmpla3QgZWluIG5vdGlmeV9mYWlsIG1hY2h0PwpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfREVGRU5ERVJTIGIvZG9jL3Byb3BzL1BfREVGRU5ERVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NzFkNDUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9ERUZFTkRFUlMKQEAgLTAsMCArMSwzMCBAQAorTkFNRToKKwlQX0RFRkVOREVSUwkJCSJkZWZlbmRlcnMiCisKK0RFRklOSUVSVCBJTjoKKwkvc3lzL25ld19za2lsbHMuaAorCitCRVNDSFJFSUJVTkc6CisJRGllc2UgUHJvcGVydHkgd2lyZCBpbiBMZWJld2VzZW4gZ2VzZXR6dCwgd2VsY2hlIHp1bSBCZWlzcGllbCBkdXJjaAorCWFuZGVyZSBMZWJld2VzZW4gdmVydGVpZGlndCB3ZXJkZW4uIERpZSBWZXJ0ZWlkaWdlciBtdWVzc2VuCisJbmF0dWVybGljaCBiZWthbm50IHNlaW4sIGRhbWl0IHNpZSBwZXIgSW5mb3JtRGVmZW5kKCkgdWViZXIgQW5ncmlmZmUKKwlpbmZvcm1pZXJ0IHdlcmRlbiB1bmQgcGVyIERlZmVuZE90aGVyKCkgaW4gZGVuIGxhdWZlbmRlbiBBbmdyaWZmCisJZWluZ3JlaWZlbiBrb2VubmVuICh6dW0gQmVpc3BpZWwgU2NoYWVkZW4gYWJ3ZWhyZW4gb2RlciB1bXdhbmRlbG4pLgorCUVzIG11ZXNzZW4gamVkb2NoIG5pY2h0IHVuYmVkaW5ndCBMZWJld2VzZW4gb2RlciBlY2h0ZSBWZXJ0ZWlkaWdlcgorCXNlaW4sIGF1Y2ggYmVsaWViaWdlIE9iamVrdGUga29lbm5lbiB1ZWJlciBBbmdyaWZmZSBpbmZvcm1pZXJ0CisJd2VyZGVuIHVuZCBpbiBkaWVzZSBlaW5ncmVpZmVuLiBBbGxlcmRpbmdzIGJlc3RlaHQgZGllCisJRWluc2NocmFlbmt1bmcsIGRhc3MgZGllc2UgT2JqZWt0ZSBpbiBkZXIgZ2xlaWNoZW4gVW1nZWJ1bmcgc2VpbgorCW11ZXNzZW4sIHdpZSBkYXMgenUgdmVydGVpZGlnZW5kZSBMZWJld2VzZW4gb2RlciBpbSB6dSB2ZXJ0ZWlkaWdlbmRlbgorCUxlYmV3ZXNlbiBzZWxic3QuCisJRGllIE9iamVrdGUsIHdlbGNoZSBkaWVzIGJldHJpZmZ0LCBzaW5kIGluIEZvcm0gZWluZXMgQXJyYXlzIGluCisJZGVyIFByb3BlcnR5IFBfREVGRU5ERVJTIGFiZ2VsZWd0LgorCUdlc2V0enQgdW5kIGdlbG9lc2NodCB3ZXJkZW4gc29sbHRlbiBkaWUgRWludHJhZWdlIGRpZXNlcyBBcnJheXMKKwlqZWRvY2ggbnVyIG1pdHRlbHMgZGVyIGRhZnVlciBiZXJlaXRnZXN0ZWxsdGVuIEZ1bmt0aW9uZW4KKwlBZGREZWZlbmRlcigpIHVuZCBSZW1vdmVEZWZlbmRlcigpLgorCitTSUVIRSBBVUNIOgorCUFkZERlZmVuZGVyKCksIFJlbW92ZURlZmVuZGVyKCksIEluZm9ybURlZmVuZCgpLCBEZWZlbmRPdGhlcigpLAorCS9zdGQvbGl2aW5nL2NvbWJhdC5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IDIxLjA5LjIwMDcsIFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0RFRkVORF9GVU5DIGIvZG9jL3Byb3BzL1BfREVGRU5EX0ZVTkMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJmMWU4YwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0RFRkVORF9GVU5DCkBAIC0wLDAgKzEsMzEgQEAKK1BfREVGRU5EX0ZVTkMKKworTkFNRToKKyAgICAgUF9ERUZFTkRfRlVOQyAiZGVmZW5kX2Z1bmMiCisKK0RFRklOSUVSVCBJTjoKKyAgICAgPGFybW91ci5oPgorCitCRVNDSFJFSUJVTkc6CisgICAgIEZhbGxzIGVpbiBPYmpla3QgZWluZSBEZWZlbmRGdW5jKCkgZnVlciBkaWUgUnVlc3R1bmcgZGVmaW5pZXJ0LCBzbyBtdXNzCisgICAgIGRpZXNlcyBPYmpla3QgaW4gZGllc2VyIFByb3BlcnR5IGVpbmdldHJhZ2VuIHNlaW4uCisKKyAgICAgRGllIEF1c3dlcnR1bmcgZGllc2VyIFByb3BlcnR5IGVyZm9sZ3QgaW4gUXVlcnlEZWZlbmQoKS4KKworQkVNRVJLVU5HRU46CisgICAgIDEuIEVzIGZ1bmt0aW9uaWVydCBfbmljaHRfIGhpZXIgZWluZSBDbG9zdXJlIHJlaW56dXNjaHJlaWJlbi4KKyAgICAgMi4gRGllc2UgUHJvcCBsYWVzc3Qgc2ljaCBfbmljaHRfIHNpbm52b2xsIG1pdCBTZXQoKSBzZXR6ZW4sIGFsc28gei5CLgorICAgICAgICBrZWluZSBRdWVyeS1NZXRob2RlbiBoaWVyIHJlaW56dXNjaHJlaWJlbi4KKyAgICAgMy4gRGVmaW5pZXJlbiB2b24gX3NldF9kZWZlbmRfZnVuYygpIG9kZXIgU2V0LU1ldGhvZGVuIHZpYSBTZXQoKQorICAgICAgICBmdW5rdGlvbmllcnQgYXVjaCBuaWNodCwgenVtaW5kZXN0IG5pY2h0IG1pdCBkZW0gZ2V3dWVuc2NodGVuCisgICAgICAgIEVyZ2VibmlzLiA7LSkKKyAgICAgNC4gQmVpIFZlcndlbmR1bmcgYml0dGUgQmFsYW5jZS1SaWNodGxpbmllbiBiZWFjaHRlbiEKKworQkVJU1BJRUxFOgorICAgICBTaWVoZSBkYXMgQmVpc3BpZWwgenUgRGVmZW5kRnVuYygpCisKK1NJRUhFIEFVQ0g6CisgICAgIC9zdGQvYXJtb3VyLmMsIERlZmVuZEZ1bmMoKSwgYmFsYW5jZSwgZ3Jlbnp3ZXJ0ZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBTYXQgTWF5IDE4IDE1OjI2OjE3IDE5OTYgYnkgV2FyZ29uCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9ERUZVRUxfQU1PVU5UX0RSSU5LIGIvZG9jL3Byb3BzL1BfREVGVUVMX0FNT1VOVF9EUklOSwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NThlMjYxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfREVGVUVMX0FNT1VOVF9EUklOSwpAQCAtMCwwICsxLDIwIEBACitOQU1FOgorICAgIFBfREVGVUVMX0FNT1VOVF9EUklOSyAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZnVlbF9hbW91bnRfZHJpbmsiCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL2RlZnVlbC5oCisKK0JFU0NIUkVJQlVORzoKKyAgICBFbnRoYWVsdCBkaWUgcmFzc2VuYWJoYWVuZ2lnZSBFbnR0YW5rdm9yZ2FiZSBmdWVyIFRyaW5rZW4uCisgICAgCitTSUVIRSBBVUNIOgorICAgICBBZWhubGljaDogIFBfREVGVUVMX1RJTUVfRk9PRCwgUF9ERUZVRUxfVElNRV9EUklOSworICAgICAgICAgICAgICAgIFBfREVGVUVMX0xJTUlUX0ZPT0QsIFBfREVGVUVMX0xJTUlUX0RSSU5LLAorICAgICAgICAgICAgICAgIFBfREVGVUVMX0FNT1VOVF9GT09ECisgICAgIE1ldGhvZGVuOiAgZGVmdWVsX2RyaW5rLCBkZWZ1ZWxfZm9vZAorICAgICBUYW5rZW46ICAgIGNvbnN1bWUsIGRyaW5rX2FsY29ob2wsIGRyaW5rX3NvZnQsIGVhdF9mb29kCisgICAgIFdlaXRlcmU6ICAgUF9EUklOSywgUF9GT09ELCBQX0FMQ09IT0wsIFBfU1AsIFBfSFAsCisgICAgICAgICAgICAgICAgUF9ERUZVRUxfVElNRV9GT09ELCBQX0RFRlVFTF9USU1FX0RSSU5LCisgICAgIEtvbnplcHRlOiAgaGVpbHVuZywgZW50dGFua2VuLCBmb29kCisKKzkuIEF1Z3VzdCAyMDE1IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9ERUZVRUxfQU1PVU5UX0ZPT0QgYi9kb2MvcHJvcHMvUF9ERUZVRUxfQU1PVU5UX0ZPT0QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg1NTRiZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0RFRlVFTF9BTU9VTlRfRk9PRApAQCAtMCwwICsxLDIwIEBACitOQU1FOgorICAgIFBfREVGVUVMX0FNT1VOVF9GT09EICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmdWVsX2Ftb3VudF9mb29kIgorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9kZWZ1ZWwuaAorCitCRVNDSFJFSUJVTkc6CisgICAgRW50aGFlbHQgZGllIHJhc3NlbmFiaGFlbmdpZ2UgRW50dGFua3ZvcmdhYmUgZnVlciBFc3Nlbi4KKyAgICAKK1NJRUhFIEFVQ0g6CisgICAgIEFlaG5saWNoOiAgUF9ERUZVRUxfVElNRV9GT09ELCBQX0RFRlVFTF9USU1FX0RSSU5LCisgICAgICAgICAgICAgICAgUF9ERUZVRUxfTElNSVRfRk9PRCwgUF9ERUZVRUxfTElNSVRfRFJJTkssCisgICAgICAgICAgICAgICAgUF9ERUZVRUxfQU1PVU5UX0RSSU5LCisgICAgIE1ldGhvZGVuOiAgZGVmdWVsX2RyaW5rLCBkZWZ1ZWxfZm9vZAorICAgICBUYW5rZW46ICAgIGNvbnN1bWUsIGRyaW5rX2FsY29ob2wsIGRyaW5rX3NvZnQsIGVhdF9mb29kCisgICAgIFdlaXRlcmU6ICAgUF9EUklOSywgUF9GT09ELCBQX0FMQ09IT0wsIFBfU1AsIFBfSFAsCisgICAgICAgICAgICAgICAgUF9ERUZVRUxfVElNRV9GT09ELCBQX0RFRlVFTF9USU1FX0RSSU5LCisgICAgIEtvbnplcHRlOiAgaGVpbHVuZywgZW50dGFua2VuLCBmb29kCisKKzkuIEF1Z3VzdCAyMDE1IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9ERUZVRUxfTElNSVRfRFJJTksgYi9kb2MvcHJvcHMvUF9ERUZVRUxfTElNSVRfRFJJTksKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE1OWRmNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0RFRlVFTF9MSU1JVF9EUklOSwpAQCAtMCwwICsxLDIxIEBACitOQU1FOgorICAgIFBfREVGVUVMX0xJTUlUX0RSSU5LICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmdWVsX2xpbWl0X2RyaW5rIgorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9kZWZ1ZWwuaAorCitCRVNDSFJFSUJVTkc6CisgICAgRW50aGFlbHQgZGllIHJhc3NlbmFiaGFlbmdpZ2UgbWluaW1hbGUgTWVuZ2UgYW4gVHJpbmtlbiwgYWIgZGVtIGVpbgorICAgIEVudHRhbmt2b3JnYW5nIGZ1ZXIgZGVuIFNwaWVsZXIgbW9lZ2xpY2ggaXN0LgorICAgIAorU0lFSEUgQVVDSDoKKyAgICAgQWVobmxpY2g6ICBQX0RFRlVFTF9USU1FX0ZPT0QsIFBfREVGVUVMX1RJTUVfRFJJTksKKyAgICAgICAgICAgICAgICBQX0RFRlVFTF9MSU1JVF9GT09ELAorICAgICAgICAgICAgICAgIFBfREVGVUVMX0FNT1VOVF9GT09ELCBQX0RFRlVFTF9BTU9VTlRfRFJJTksKKyAgICAgTWV0aG9kZW46ICBkZWZ1ZWxfZHJpbmssIGRlZnVlbF9mb29kCisgICAgIFRhbmtlbjogICAgY29uc3VtZSwgZHJpbmtfYWxjb2hvbCwgZHJpbmtfc29mdCwgZWF0X2Zvb2QKKyAgICAgV2VpdGVyZTogICBQX0RSSU5LLCBQX0ZPT0QsIFBfQUxDT0hPTCwgUF9TUCwgUF9IUCwKKyAgICAgICAgICAgICAgICBQX0RFRlVFTF9USU1FX0ZPT0QsIFBfREVGVUVMX1RJTUVfRFJJTksKKyAgICAgS29uemVwdGU6ICBoZWlsdW5nLCBlbnR0YW5rZW4sIGZvb2QKKworOS4gQXVndXN0IDIwMTUgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0RFRlVFTF9MSU1JVF9GT09EIGIvZG9jL3Byb3BzL1BfREVGVUVMX0xJTUlUX0ZPT0QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZlMzNmZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0RFRlVFTF9MSU1JVF9GT09ECkBAIC0wLDAgKzEsMjEgQEAKK05BTUU6CisgICAgUF9ERUZVRUxfTElNSVRfRk9PRCAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZnVlbF9saW1pdF9mb29kIgorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9kZWZ1ZWwuaAorCitCRVNDSFJFSUJVTkc6CisgICAgRW50aGFlbHQgZGllIHJhc3NlbmFiaGFlbmdpZ2UgbWluaW1hbGUgTWVuZ2UgYW4gRXNzZW4sIGFiIGRlbSBlaW4KKyAgICBFbnR0YW5rdm9yZ2FuZyBmdWVyIGRlbiBTcGllbGVyIG1vZWdsaWNoIGlzdC4KKyAgICAKK1NJRUhFIEFVQ0g6CisgICAgIEFlaG5saWNoOiAgUF9ERUZVRUxfVElNRV9GT09ELCBQX0RFRlVFTF9USU1FX0RSSU5LCisgICAgICAgICAgICAgICAgUF9ERUZVRUxfTElNSVRfRFJJTkssCisgICAgICAgICAgICAgICAgUF9ERUZVRUxfQU1PVU5UX0ZPT0QsIFBfREVGVUVMX0FNT1VOVF9EUklOSworICAgICBNZXRob2RlbjogIGRlZnVlbF9kcmluaywgZGVmdWVsX2Zvb2QKKyAgICAgVGFua2VuOiAgICBjb25zdW1lLCBkcmlua19hbGNvaG9sLCBkcmlua19zb2Z0LCBlYXRfZm9vZAorICAgICBXZWl0ZXJlOiAgIFBfRFJJTkssIFBfRk9PRCwgUF9BTENPSE9MLCBQX1NQLCBQX0hQLAorICAgICAgICAgICAgICAgIFBfREVGVUVMX1RJTUVfRk9PRCwgUF9ERUZVRUxfVElNRV9EUklOSworICAgICBLb256ZXB0ZTogIGhlaWx1bmcsIGVudHRhbmtlbiwgZm9vZAorCis5LiBBdWd1c3QgMjAxNSBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfREVGVUVMX1RJTUVfRFJJTksgYi9kb2MvcHJvcHMvUF9ERUZVRUxfVElNRV9EUklOSwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTVlYWYwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfREVGVUVMX1RJTUVfRFJJTksKQEAgLTAsMCArMSwyMSBAQAorTkFNRToKKyAgICBQX0RFRlVFTF9USU1FX0RSSU5LICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmdWVsX3RpbWVfZHJpbmsiCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL2RlZnVlbC5oCisKK0JFU0NIUkVJQlVORzoKKyAgICBFbnRoYWVsdCBkaWUgcmFzc2VuYWJoYWVuZ2lnZSBtaW5pbWFsZSBaZWl0IHp3aXNjaGVuIGVpbnplbG5lbgorICAgIEVudHRhbmt2b3JnYWVuZ2VuIGZ1ZXIgVHJpbmtlbiBlaW5lcyBTcGllbGVycy4KKyAgICAKK1NJRUhFIEFVQ0g6CisgICAgIEFlaG5saWNoOiAgUF9ERUZVRUxfVElNRV9GT09ELAorICAgICAgICAgICAgICAgIFBfREVGVUVMX0xJTUlUX0ZPT0QsIFBfREVGVUVMX0xJTUlUX0RSSU5LLAorICAgICAgICAgICAgICAgIFBfREVGVUVMX0FNT1VOVF9GT09ELCBQX0RFRlVFTF9BTU9VTlRfRFJJTksKKyAgICAgTWV0aG9kZW46ICBkZWZ1ZWxfZHJpbmssIGRlZnVlbF9mb29kCisgICAgIFRhbmtlbjogICAgY29uc3VtZSwgZHJpbmtfYWxjb2hvbCwgZHJpbmtfc29mdCwgZWF0X2Zvb2QKKyAgICAgV2VpdGVyZTogICBQX0RSSU5LLCBQX0ZPT0QsIFBfQUxDT0hPTCwgUF9TUCwgUF9IUCwKKyAgICAgICAgICAgICAgICBQX0RFRlVFTF9USU1FX0ZPT0QsIFBfREVGVUVMX1RJTUVfRFJJTksKKyAgICAgS29uemVwdGU6ICBoZWlsdW5nLCBlbnR0YW5rZW4sIGZvb2QKKworOS4gQXVndXN0IDIwMTUgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0RFRlVFTF9USU1FX0ZPT0QgYi9kb2MvcHJvcHMvUF9ERUZVRUxfVElNRV9GT09ECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YmRkNzkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9ERUZVRUxfVElNRV9GT09ECkBAIC0wLDAgKzEsMjEgQEAKK05BTUU6CisgICAgUF9ERUZVRUxfVElNRV9GT09EICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmdWVsX3RpbWVfZm9vZCIKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvZGVmdWVsLmgKKworQkVTQ0hSRUlCVU5HOgorICAgIEVudGhhZWx0IGRpZSByYXNzZW5hYmhhZW5naWdlIG1pbmltYWxlIFplaXQgendpc2NoZW4gZWluemVsbmVuCisgICAgRW50dGFua3ZvcmdhZW5nZW4gZnVlciBFc3NlbiBlaW5lcyBTcGllbGVycy4KKyAgICAKK1NJRUhFIEFVQ0g6CisgICAgIEFlaG5saWNoOiAgUF9ERUZVRUxfVElNRV9EUklOSywKKyAgICAgICAgICAgICAgICBQX0RFRlVFTF9MSU1JVF9GT09ELCBQX0RFRlVFTF9MSU1JVF9EUklOSywKKyAgICAgICAgICAgICAgICBQX0RFRlVFTF9BTU9VTlRfRk9PRCwgUF9ERUZVRUxfQU1PVU5UX0RSSU5LCisgICAgIE1ldGhvZGVuOiAgZGVmdWVsX2RyaW5rLCBkZWZ1ZWxfZm9vZAorICAgICBUYW5rZW46ICAgIGNvbnN1bWUsIGRyaW5rX2FsY29ob2wsIGRyaW5rX3NvZnQsIGVhdF9mb29kCisgICAgIFdlaXRlcmU6ICAgUF9EUklOSywgUF9GT09ELCBQX0FMQ09IT0wsIFBfU1AsIFBfSFAsCisgICAgICAgICAgICAgICAgUF9ERUZVRUxfVElNRV9GT09ELCBQX0RFRlVFTF9USU1FX0RSSU5LCisgICAgIEtvbnplcHRlOiAgaGVpbHVuZywgZW50dGFua2VuLCBmb29kCisKKzkuIEF1Z3VzdCAyMDE1IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9ERVBBUlRNU0cgYi9kb2MvcHJvcHMvUF9ERVBBUlRNU0cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE1YzhiZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0RFUEFSVE1TRwpAQCAtMCwwICsxLDggQEAKK05BTUU6CisgICAgUF9ERVBBUlRNU0cgICAgICAgICAgICAgICAgICAgImRlcGFydG1zZyIgICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3RyYW5zcG9ydC5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgTWVsZHVuZywgbWl0IGRlciBlaW4gVHJhbnNwb3J0ZXIgYWJsZWd0LgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfREVTQ1JJUFRJT04gYi9kb2MvcHJvcHMvUF9ERVNDUklQVElPTgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjc1Y2M3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfREVTQ1JJUFRJT04KQEAgLTAsMCArMSw4IEBACitOQU1FOgorICAgIFBfREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiIgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9wcm9wZXJ0aWVzLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBCZXNjaHJlaWJ1bmcgZGVzIFNwaWVsZXJzCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9ERVNUUk9ZX0JBRCBiL2RvYy9wcm9wcy9QX0RFU1RST1lfQkFECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NjNhZjkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9ERVNUUk9ZX0JBRApAQCAtMCwwICsxLDI5IEBACitOQU1FOgorICAgICBQX0RFU1RST1lfQkFEICAgICAgICAgICAgICAgICAic3RkX2Zvb2RfZGVzdHJveV9iYWQiCisKK0RFRklOSUVSVCBJTjoKKyAgICAgPHN5cy9mb29kLmg+CisKK0JFU0NIUkVJQlVORzoKKyAgICAgU3BlaWNoZXJ0IGRlbiBXZXJ0IGZ1ZXIgZGFzIFZlcmhhbHRlbiwgd2VubiBlaW5lIFNwZWlzZSB2ZXJkaXJidC4KKyAgICAgRGllc2VzIFZlcmhhbHRlbiB3aXJkIGluIG1ha2VfYmFkKCkgdW1nZXNldHp0LgorICAgICAKKyAgICAgREVTVFJPWV9CQUQgICA6IERpZSBTcGVpc2Ugd2lyZCBiZWltIFZlcmRlcmJlbiB6ZXJzdG9lcnQKKyAgICAgICAgICAgICAgICAgICAgIGJ6dy4gZGVyIEJlaGFlbHRlciB3aXJkIGdlbGVlcnQKKyAgICAgREVTVFJPWV9ORVZFUiA6IERpZSBTcGVpc2Ugd2lyZCBiZWltIFZlcmRlcmJlbiBuaWNodCB6ZXJzdG9lcnQKKyAgICAgcG9zLiBJbnRlZ2VyICA6IEFuemFobCBkZXIgU2VrdW5kZW4sIGRpZSB6d2lzY2hlbiBWZXJkZXJiZW4KKyAgICAgICAgICAgICAgICAgICAgIHVuZCBaZXJzdG9lcmVuIGRlciBTcGVpc2UgbGllZ2VuIHNvbGxlbgorICAgICAKK0JFTUVSS1VOR0VOOgorICAgICBJc3QgZWluIHBvc2l0aXZlciBJbnRlZ2VyLVdlcnQgaW4gZGllc2VyIFByb3BlcnR5IGdlc3BlaWNoZXJ0LCB3aXJkIG5hY2gKKyAgICAgQXVzZnVlaHJlbiBkZXIgTWV0aG9kZSBtYWtlX2JhZCgpIG5hY2ggQWJsYXVmIGRlciBhbmdlZ2ViZW5lbiBTZWt1bmRlbgorICAgICBlaW4gd2VpdGVyZXIgUmVzZXQgYXVzZ2Vsb2VzdCwgZGVyIG1ha2VfZGVzdHJveSgpIGF1ZnJ1ZnQuCisgICAgIAorREVGQVVMVDoKKyAgICAgSW5pdGlhbCBpc3QgZGllc2UgUHJvcGVydHkgYXVmIERFU1RST1lfQkFEIGdlc2V0enQuCisKK1NJRUhFIEFVQ0g6CisgICAgIC9zdGQvZm9vZC5jLCB3aXovZm9vZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFRodSBPY3QgMjggMTI6MTU6MDAgMjAxMCBieSBDYWxkcmEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9ERVNUUlVDVF9NU0cgYi9kb2MvcHJvcHMvUF9ERVNUUlVDVF9NU0cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI3ZTdlOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0RFU1RSVUNUX01TRwpAQCAtMCwwICsxLDggQEAKK05BTUU6CisgICAgUF9ERVNUUlVDVF9NU0cgICAgICAgICAgICAgICAgImRlc3RydWN0X21zZyIgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3BsYXllci9iYXNlLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBNZWxkdW5nLCBkaWUgYmVpbSBEZXN0cnVjdGVuIE9iaiBhdXNnZWdlZ2VuIHdpcmQgKG51ciBNYWdpZXIpCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9ERVRBSUxTIGIvZG9jL3Byb3BzL1BfREVUQUlMUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjM1MTNhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfREVUQUlMUwpAQCAtMCwwICsxLDI1IEBACitOQU1FOgorICAgIFBfREVUQUlMUyAgICAgICAgICAgICJkZXRhaWxzIgorCitERUZJTklFUlQgSU46CisgICAgL3N5cy90aGluZy9kZXNjcmlwdGlvbi5oCisKK0JFU0NIUkVJQlVORzoKKyAgICBEaWVzZSBQcm9wZXJ0eSBlbnRoYWVsdCBlaW4gTWFwcGluZywgaW4gZGVyIERldGFpbHMgaW0gT2JqZWt0CisgICAgZGVmaW5pZXJ0IHdlcmRlbiB1bmQgQmVzY2hyZWlidW5nZW4sIGRpZSBhdXNnZWdlYmVuIHdlcmRlbiwgd2VubiBtYW4KKyAgICBzaWNoIGRpZXNlIERldGFpbHMgYW5zY2hhdXQuCisKK0JFTUVSS1VOR0VOOgorICAgIE1hbiBrYW5uIGRpZXNlIFByb3BlcnR5IG5pY2h0IHBlciBTZXRQcm9wKCkgdmVyYWVuZGVybiwgc29uZGVybiBtdXNzIGRpZQorICAgIGVudHNwcmVjaGVuZGVuIEZ1bmt0aW9uZW4gbnV0emVuLgorICAgIEFkZFNwZWNpYWxEZXRhaWwoKSB1bmQgUmVtb3ZlU3BlY2lhbERldGFpbCgpIHNvbGx0ZW4gbmljaHQgbWVocgorICAgIHZlcndlbmRldCB3ZXJkZW4uCisKK1NJRUhFIEFVQ0g6CisgICAgU2V0emVuOiAgICBBZGREZXRhaWwoKQorICAgIExvZXNjaGVuOiAgUmVtb3ZlRGV0YWlsKCkKKyAgICBBZWhubGljaDogIFBfU1BFQ0lBTF9ERVRBSUxTCisgICAgVmVyYWx0ZXQ6ICBBZGRTcGVjaWFsRGV0YWlsKCksIFJlbW92ZVNwZWNpYWxEZXRhaWwoKQorICAgIFNvbnN0aWdlczogR2V0RGV0YWlsKCksIGJyZWFrX3N0cmluZygpCisKKzI3LiBKYW4gMjAxMyBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfRElFX01TRyBiL2RvYy9wcm9wcy9QX0RJRV9NU0cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlmMWQ3YwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0RJRV9NU0cKQEAgLTAsMCArMSw0MCBAQAorUF9ESUVfTVNHCisKK05BTUU6CisgICAgIFBfRElFX01TRwkJCSJkaWVfbXNnIgorCitERUZJTklFUlQgSU46CisgICAgIC9zeXMvcHJvcGVydGllcy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgSW4gZGllc2VyIFByb3BlcnR5IHVlYmVyZ2lidCBtYW4gZWluZW4gU3RyaW5nLCBkZXIgYXVzZ2VnZWJlbiB3aXJkLCB3ZW5uCisgICAgIGRhcyBMZWJld2VzZW4gc3RpcmJ0LiBJc3QgZGllIFByb3BlcnR5IG5pY2h0IGdlc2V0enQsIHNvIHdpcmQgYWxzIFN0cmluZworICAgICBiZW51dHp0OgorCSIgZmFlbGx0IHRvdCB6dSBCb2Rlbi5cbiIuCisKKyAgICAgRGVyIE5hbWUgZGVzIExlYmV3ZXNlbnMgd2lyZCBkZW0gU3RyaW5nIHZvciBkZXIgQXVzZ2FiZSB2b3Jhbmdlc3RlbGx0LgorICAgICBEZXIgU2F0enVtYnJ1Y2ggYW0gWmVpbGVuZW5kZSB1bmQgZGFzIExlZXJ6ZWljaGVuIG5hY2ggZGVtIE5hbWVuIGRlcworICAgICBMZWJld2VzZW5zIG11c3MgbWFuIHNlbGJzdCBhbmdlZ2ViZW4uIEVzIHNvbGx0ZSBhbGxlcmRpbmdzIGJlYWNodGV0CisgICAgIHdlcmRlbiwgZGFzcyBlaW4gTGViZXdlc2VuLCBkYXMgZHVyY2ggR2lmdCBnZXRvZXRldCB3aXJkLCBlaW5lIHNwZXppZWxsZQorICAgICBuaWNodCB6dSBiZWVpbmZsdXNzZW5kZSBNZWxkdW5nIGVyaGFlbHQuIEVzIHdpcmQgZGFubiBhbHMgU3RyaW5nCisgICAgIGJlbnV0enQ6CisJIiB3aXJkIHZvbiBHaWZ0IGhpbndlZ2dlcmFmZnQgdW5kIGtpcHB0IHVtLlxuIi4KKworQkVJU1BJRUxFOgorICAgICBCZWkgZWluZW0gbWl0a2FlbXBmZW5kZW4gU2NoYXR0ZW4gd2FlcmUgZXMgZWhlciB1bmxvZ2lzY2gsIHdlbm4gbmFjaAorICAgICBkZXNzZW4gJ1RvZCcgZWluZSBMZWljaGUgenVydWVja2JsaWViZS4gRWluZSBsb2dpc2NoZSBLb25zZXF1ZW56IHdhZXJlCisgICAgIGZvbGdlbmRlIE1lbGR1bmc6CisJU2V0UHJvcChQX0RJRV9NU0csIiBsb2VzdCBzaWNoIGF1Zi5cbiIpOworCVNldFByb3AoUF9OT0NPUlBTRSwxKTsKKworICAgICBEYW1pdCBkYW5uIGF1Y2ggd2lya2xpY2gga2VpbmUgTGVpY2hlIHp1cnVlY2tibGVpYnQsIHdpcmQgenVzYWV0emxpY2gKKyAgICAgZGllIFByb3BlcnR5IFBfTk9DT1JQU0UgZ2VzZXR6dC4KKworU0lFSEUgQVVDSDoKKyAgICAgVG9kOgkJZGllKEwpCisgICAgIFRvZGVzbWVsZHVuZ2VuOglQX0tJTExfTkFNRSwgUF9LSUxMX01TRywgUF9NVVJERVJfTVNHCisJCQlQX1pBUF9NU0csIFBfRU5FTVlfREVBVEhfU0VRVUVOQ0UKKyAgICAgU29uc3RpZ2VzOgkJUF9DT1JQU0UsIFBfTk9DT1JQU0UsIC9zdGQvY29ycHNlLmMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogV2VkIEphbiAxNCAxOToxNzowNiAxOTk4IGJ5IFBhdHJ5bgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfRElTQUJMRV9BVFRBQ0sgYi9kb2MvcHJvcHMvUF9ESVNBQkxFX0FUVEFDSwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWUwNTFkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfRElTQUJMRV9BVFRBQ0sKQEAgLTAsMCArMSw0NiBAQAorTkFNRToKKyAgICBQX0RJU0FCTEVfQVRUQUNLICAgICAgICAgICAgICAiZGlzYWJsZV9hdHRhY2siICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcHJvcGVydGllcy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICBEYXMgTGViZXdlc2VuIGthbm4gbmljaHQgYW5ncmVpZmVuLiBCZWltIFNldHplbiBkZXIgUHJvcGVydHkgaXN0IGVzCisgICAgd2ljaHRpZywgU2V0UHJvcCgpIHp1IGJlbnV0emVuIHVuZCBkaWUgQW56YWhsIGRlciBLYW1wZnJ1bmRlbiBhbnp1Z2ViZW4sCisgICAgZGllIGRhcyBMZWJld2VzZW4gcGFyYWx5c2llcnQgc2VpbiBzb2xsLgorCisgICAgRWluIG5lZ2F0aXZlciBXZXJ0IGlzdCBuaWNodCBndWVsdGlnLiBCZWkgbWVociBhbHMgMzAgS2FtcGZydW5kZW4gd2lyZAorICAgIGRpZSBQYXJhbHlzZSBhdWYgMzAgS2FtcGZydW5kZW4gZ2VrYXBwdC4KKworICAgIEZ1ZXIgamVkZSBQYXJhbHlzZSBiZWtvbW10IGVpbiBMaXZpbmcgZWluZSBlYmVuc28gbGFuZ2UgU2NodXR6emVpdCBuYWNoCisgICAgZGVyIFBhcmFseXNlIGdld2FlaHJ0LiBWZXJzdWNodCBtYW4sIHZvciBBYmxhdWYgZGVyIFBhcmFseXNlCisgICAgUF9ESVNBQkxFX0FUVEFDSyBob2VoZXIgenUgc2V0emVuIChvZGVyIHNldHp0IG1hbiBpbm5lcmhhbGIgZGVyIGZvbGdlbmRlbgorICAgIFNjaHV0enplaXQgUF9ESVNBQkxFX0FUVEFDSyBhdWYgPiAwKSwgd2lyZCBESVNBQkxFX1RPT19FQVJMWSB2b24gU2V0UHJvcAorICAgIHp1cnVlY2sgZ2VnZWJlbi4KKyAgICBFaW5lIFJlZHVrdGlvbiB2b24gZWluZW0gUF9ESVNBQkxFX0FUVEFDSyBpc3QgbW9lZ2xpY2gsIGFsbGVyZGluZ3MKKyAgICByZWR1emllcnQgZGllcyBfbmljaHRfIGVpbmUgZWlubWFsIGdlc2V0enRlIFNjaHV0enplaXQuCisKKyAgICBFaW5lbiBHZWduZXIsZGVyIG5pZSBwYXJhbHlzaWVydCB3ZXJkZW4ga29lbm5lbiBzb2xsLCBrYW5uIG1hbiBlaW5mYWNoCisgICAgcGVyIAorCisgICAgU2V0KFBfRElTQUJMRV9BVFRBQ0ssIGZ1bmN0aW9uIGludCAoKSB7cmV0dXJuIDA7fSwgRl9TRVRfTUVUSE9EKTsKKworICAgIGVyc3RlbGxlbiwgZGEgYmVpIGRpZXNlbSBkZXIgV2VydCB2b24gUF9ESVNBQkxFX0FUVEFDSyBuaWNodCBtZWhyIG1pdAorICAgIGVpbmVtIG5vcm1hbGVuIFNldFByb3AoKS1BdWZydWYgZ2VhZW5kZXJ0IHdlcmRlbiBrYW5uLgorCitCRUlTUElFTEU6CisgICAgLy8gR2VnbmVyIDE3IFJ1bmRlbiBsYW5nIHBhcmFseXNpZXJlbiwgb2huZSBSdWVja3NpY2h0IGF1ZiBmcnVlaGVyZSBQLgorICAgIC8vIChpbiBkaWVzZW0gTW9tZW50IGlzdCBkYXMgTGl2aW5nIGJpcyB0aW1lKCkgKyA0ICogMTcgdm9yIGxhZW5nZXJlcgorICAgIC8vICBvZGVyIGVybmV1dGVyIFBhcmFseXNlIGdlc2NodWV0enQpCisgICAgZW4tPlNldFByb3AoUF9ESVNBQkxFX0FUVEFDSywgMTcpOworICAgIC8vIERlciBHZWduZXIga2FubiBqZXR6dCBmdWVyIDM0IEthbXBmcnVuZGVuIG5pY2h0IGVybmV1dCBwYXJhbHlzaWVydAorICAgIC8vIHdlcmRlbi4KKyAgICAvLyBQYXJhbHlzZSByZWR1emllcmVuIGF1ZiAxMCBLYW1wZnJ1bmRlbgorICAgIGVuLT5TZXRQcm9wKFBfRElTQUJMRV9BVFRBQ0ssIDEwKTsKKyAgICAvLyBEaWUgU2NodXR6emVpdCBpc3QgaW1tZXIgbm9jaCBiZWkgMzQgS2FtcGZydW5kZW4sIG5pY2h0IGJlaSAyMC4KKworU0lFSEUgQVVDSDoKKyAgICBQX05FWFRfRElTQUJMRV9BVFRBQ0sKKworMTkuMDguMjAxNCwgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9ESVNBQkxFX0NPTU1BTkRTIGIvZG9jL3Byb3BzL1BfRElTQUJMRV9DT01NQU5EUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDMxOGUwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfRElTQUJMRV9DT01NQU5EUwpAQCAtMCwwICsxLDc0IEBACitQX0RJU0FCTEVfQ09NTUFORFMKKworTkFNRToKKyAgICAgUF9ESVNBQkxFX0NPTU1BTkRTICAgICAgICAgICAgICJwX2xpYl9kaXNhYmxlY29tbWFuZHMiCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N5cy9wbGF5ZXIvY29tbWFuZC5oCisKK0JFU0NIUkVJQlVORzoKKyAgICBNaXQgZGllc2VyIFByb3Aga2FubiBtYW4gdmVyaGluZGVybiwgZGFzcyBLb21tYW5kb3MgZWluZXMgU3BpZWxlcnMKKyAgICB2ZXJhcmJlaXRldCB3ZXJkZW4uIERpZXMgaXN0IHouQi4gaW4gU2VxdWVuemVuIG51ZXR6bGljaCwgd28gZGVyIFNwaWVsZXIKKyAgICByZWluIHBhc3NpdiBrb25zdW1pZXJlbiBzb2xsLgorICAgIEluIGRpZXNlIFByb3BlcnR5IG11c3MgZWluIEFycmF5IG1pdCAyIG9kZXIgMyBFbGVtZW50ZW4gZ2VzY2hyaWViZW4gCisgICAgd2VyZGVuOgorICAgICAgIDEpIEVuZHplaXRwdW5rdCBpbiBTZWt1bmRlbiBzZWl0IDEuMS4xOTcwIChpbnQpCisgICAgICAgMikgTWVsZHVuZyAoU3RyaW5nIG9kZXIgQ2xvc3VyZSkKKyAgICAgICAzKSAob3B0aW9uYWwpIEFycmF5IHZvbiB0cm90emRlbSBlcmxhdWJ0ZW4gVmVyYmVuIChzdHJpbmcqKQorICAgICAgICAgKG51ciBhdXNnZXdlcnRldCwgd2VubiBkaWUgTWVsZHVuZyBlaW4gU3RyaW5nIGlzdCkKKyAgICAKKyAgICBJc3QgZGllIE1lbGR1bmcgZWluIFN0cmluZywgd2lyZCBkaWVzZXIgZWluZmFjaCBiZWkgamVkZW0gS29tbWFuZG8gc28gd2llCisgICAgZXIgaXN0IGFuIGRlbiBTcGllbGVyIGF1c2dlZ2ViZW4gdW5kIGRhcyBLb21tYW5kbyBhYmdlYnJvY2hlbi4KKyAgICBJc3QgZGllIE1lbGR1bmcgZWluZSBDbG9zdXJlIHdpcmQgZGllc2UgYmVpIGplZGVtIEtvbW1hbmRvIGF1ZmdlcnVmZW4gdW5kCisgICAgZGFzIEtvbW1hbmRvIGFiZ2Vicm9jaGVuLCB3ZW5uIHNpZSBlaW5lbiBSdWVja2dhYmV3ZXJ0ICE9IDAgenVydWVja2dpYnQuCisgICAgSW4gZGllc2VtIEZhbGwgaXN0IGRpZSBnZXJ1ZmVuZSBGdW5rdGlvbiBkYWZ1ZXIgdmVyYW50d29ydGxpY2gsIGdlZWlnbmV0ZQorICAgIE1lbGR1bmdlbiBhbiBkZW4gU3BpZWxlciBhdXN6dWdlYmVuIQorICAgIERlciBGdW5rdGlvbiB3aXJkIGRlciB2b20gU3BpZWxlciBlaW5nZWJlbmUgQmVmZWhsIChzdHJpbmcpIGFscyBlcnN0ZXMKKyAgICBBcmd1bWVudCB1ZWJlcmdlYmVuLiBadSBkaWVzZW0gWmVpdHB1bmt0IHd1cmRlIGFsbGUgQWxpYXNlIHNjaG9uCisgICAgYXVzZ2V3ZXJ0ZXQuIERpZSBGdW5rdGlvbiBrYW5uIGRlbiBLb21tYW5kb2dlYmVyIHZpYSB0aGlzX3BsYXllcigpCisgICAgZXJtaXR0ZWxuLgorICAgIEZ1ZXIgd2VpdGVyZSBJbmZvcm1hdGlvbmVuIHN0ZWh0IGF1Y2ggY29tbWFuZF9zdGFjaygpIHp1ciBWZXJmdWVndW5nLAorICAgIGFsbGVyZGluZ3MgaXN0IGRvcnQgZGllIEFsaWFzLUVyc2V0enVuZyBuaWNodCBiZXJ1ZWNrc2ljaHRpZ3QuCisKKyAgICBEaWUgQXVzbmFobWVsaXN0ZSB3aXJkIG51ciBmdWVyIHNpbXBsZSBTdHJpbmdzIGFscyBNZWxkdW5nIGF1c2dld2VydGV0LAorICAgIHdpcmQgZWluZSBDbG9zdXJlIHZlcndlbmRldCwga2FubiBkaWVzZSBiZXNzZXIgc2VsYmVyIGRpZSBBdXNuYWhtZW4KKyAgICBiZXN0aW1tZW4uCisgICAgCisgICAgRnJhZ3QgbWFuIGRpZXNlIFByb3AgYWIsIGVyaGFlbHQgbWFuIGVpbiBBcnJheSBtaXQgNCBFbGVtZW50ZW46IHNldHplbmRlcworICAgIE9iamVrdCAob2JqZWN0KSwgQWJsYXVmemVpdCAoaW50KSwgTWVsZHVuZyAoU3RyaW5nIG9kZXIgQ2xvc3VyZSkgdW5kCisgICAgTGlzdGUgdm9uIEF1c25haG1lbiAoc3RyaW5nKikuCisKK0JFTUVSS1VOR0VOOgorICAgIDEuIERpZSBQcm9wIHdpcmQgZnVlciBNYWdpZXIgbWl0IGVpbmdlc2NoYWx0ZXRlbSBQX1dBTlRTX1RPX0xFQVJOCisgICAgICAgaWdub3JpZXJ0LgorICAgIDIuIFdlbm4gZGFzIE9iamVrdCB6ZXJzdG9lcnQgd2lyZCwgd2FzIGRpZSBQcm9wIGdlc2V0enQgaGF0LCB3aXJkIGRlcgorICAgICAgIEVpbnRyYWcgdW53aXJrc2FtLgorICAgIDMuIFdlbm4gZGllc2UgUHJvcCBnZXNldHp0IHVuZCBuaWNodCBhYmdlbGF1ZmVuIGlzdCwga2FubiBudXIgZGFzIGdsZWljaGUKKyAgICAgICBPYmpla3Qgc2llIG1pdCBuZXVlbiBEYXRlbiB1ZWJlcnNjaHJlaWJlbi4gQWxsZSBhbmRlcmVuIE9iamVrdGUga29lbm5lbgorICAgICAgIGRpZSBQcm9wIG51ciBsb2VzY2hlbi4gRGllcyBzb2xsIHZlcmhpbmRlcm4sIGRhc3MgTWFnaWVyIHVuYWJzaWNodGxpY2gKKyAgICAgICBlaW5mYWNoIGFuZGVyZXIgTGV1dGUgRWludHJhZWdlIHVlYmVyc2NocmVpYmVuLiBEZW1lbnRzcHJlY2hlbmQ6IExhc3N0CisgICAgICAgZGllIEZpbmdlciBkYXZvbiwgd2VubiBkaWUgc2Nob24gZ2VzZXR6dCBpc3QuIDstKQorICAgIDQuIERpZXNlIFByb3AgZGFyZiBfYXVzc2NobGllc3NsaWNoXyBtaXQgU2V0UHJvcCgpIHVuZCBRdWVyeVByb3AoKSBiZW51dHp0CisgICAgICAgd2VyZGVuLCBTZXQoKSB1bmQgUXVlcnkoKSBmdW5rdGlvbmllcmVuIF9uaWNodF8uCisgICAgNS4gRXMgZ2lidCBlaW5pZ2UgVmVyYmVuLCBkaWUgTklFIGJsb2NraWVydCB3ZXJkZW4uIFp1ciBaZWl0IHNpbmQgZGllcworICAgICAgICJtcnVmZSIsICJtc2NoYXUiLCAiYnVnIiwgImlkZWUiLCAidHlwbyIgdW5kICJkZXRhaWwiLgorICAgIDYuIEJpdHRlIG5pY2h0IG1pc3NicmF1Y2hlbiwgc3BlemllbGwgbmljaHQgZGF6dSwgZGllIEtvbW1hbmRvcyB2b24KKyAgICAgICBTcGllbGVyIHp1IHVlYmVyd2FjaGVuL21pdHp1c2NocmVpYmVuLiBEYXMgU2V0emVuIGRpZXNlciBQcm9wIHdpcmQgCisgICAgICAgZ2Vsb2dndC4KKworQkVJU1BJRUw6CisgICBJbiBlaW5lbSBSYXVtIHN0YXJ0ZXQgZWluZSBTZXF1ZW56LCBpbiBkZXIgZGVyIFNwaWVsZXIgbmljaHRzIG1hY2hlbiBzb2xsOgorCisgICBpZiAoIXBsLT5RdWVyeVByb3AoUF9ESVNBQkxFX0NPTU1BTkRTKSkKKyAgICAgIHBsLT5TZXRQcm9wKFBfRElTQUJMRV9DT01NQU5EUywKKyAgICAgICAgICAgICh7IHRpbWUoKSArIDEyMCwgIkR1IGJpc3QgdGllZiBpbiBEZWluZW0gVHJhdW0gZ2VmYW5nZW4hXG4iIH0pICk7CisgICBlbHNlIC8vIC4uLiBGZWhsZXJiZWhhbmRsdW5nLCBmYWxscyBQcm9wIHNjaG9uIGdlc2V0enQgLi4uCisgICAKKyAgIFNvbGwgZGllIFByb3AgYXVzIGlyZ2VuZGVpbmVtIEdydW5kICh2b3J6ZWl0aWcpIGdlbG9lc2NodCB3ZXJkZW46CisgICBwbC0+U2V0UHJvcChQX0RJU0FCTEVfQ09NTUFORFMsIDApOworCitTSUVIRSBBVUNIOgorICAgICBjb21tYW5kKCksIHF1ZXJ5X2NvbW1hbmQoKSwgY29tbWFuZF9zdGFjaygpLCBtb2RpZnlfY29tbWFuZCgpLCAKKyAgICAgdGhpc19wbGF5ZXIoKQorCiswMS4xMi4yMDEyLCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9ESVNUUklCVVRJT04gYi9kb2MvcHJvcHMvUF9ESVNUUklCVVRJT04KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI5YzUzZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0RJU1RSSUJVVElPTgpAQCAtMCwwICsxLDE2IEBACitOQU1FOg0KKyAgICAgUF9ESVNUUklCVVRJT04gICAgICAgICAgICAgICAgInN0ZF9mb29kX2Rpc3RyaWJ1dGlvbiINCisNCitERUZJTklFUlQgSU46DQorICAgICAvc3lzL2Zvb2QuaA0KKw0KK0JFU0NIUkVJQlVORzoNCisgICAgIFZlcnRlaWx1bmcgZGVyIEhlaWx1bmcgdWViZXIgbWVocmVyZSBIZWFydGJlYXRzLg0KKyAgICAgRGllc2VyIFdlcnQgd2lyZCBpbSBlbnRyeV9pbmZvIGFscyBIX0RJU1RSSUJVVElPTiBkZW0gY29uc3VtZSgpIGltDQorICAgICBMaXZpbmcgdWViZXJnZWJlbi4NCisgICAgIA0KK1NJRUhFIEFVQ0g6DQorICAgICBjb25zdW1lDQorDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorTGFzdCBtb2RpZmllZDogVGh1IE9jdCAyOCAxMjoxNTowMCAyMDEwIGJ5IENhbGRyYQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0RNU0cgYi9kb2MvcHJvcHMvUF9ETVNHCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0M2ZiYjQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9ETVNHCkBAIC0wLDAgKzEsOCBAQAorTkFNRToKKyAgICBQX0RNU0cgICAgICAgICAgICAgICAgICAgICAgICAiZGVzdG1zZyIgICAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcGxheWVyL2Jhc2UuaAorCitCRVNDSFJFSUJVTkc6CisgICAgICoqKiBPQlNPTEVUISAqKiogU2llaGUgUF9ERVNUUlVDVF9NU0cKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0RPTUFJTiBiL2RvYy9wcm9wcy9QX0RPTUFJTgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGZkMWY3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfRE9NQUlOCkBAIC0wLDAgKzEsMzEgQEAKK05BTUU6CisgICAgUF9ET01BSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpYl9wX2RvbWFpbiIKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcm9vbS9kZXNjcmlwdGlvbi5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGllc2UgUHJvcGVydHkgZW50aGFlbHQgZGllIFJlZ2lvbiwgaW4gZGVyIGVpbiBSYXVtIGxpZWd0LCBzb2Zlcm4gZXIKKyAgICAgaW4gL2QvIGxpZWd0LgorCisgICAgIEZhbGxzIGVpbiBSYXVtIG5pY2h0IGluIC9kLyBsaWVndCwgYWJlciBlcyBlaWdlbnRsaWNoIGVpbiBHZWJpZXQgaXN0LAorICAgICB3ZWxjaGVzIGVpbmRldXRpZyBpbiBlaW5lciBSZWdpb24genVnZW9yZG5ldCBpc3QsIGthbm4gZGVyIE1hZ2llcgorICAgICBoaWVyIGdlemllbHQgZWluZW4gYW5kZXJlbiBXZXJ0IHNldHplbi4KKyAgICAgCisgICAgIEJpdHRlIGtlaW5lIFJlZ2lvbmVuIGZhZWxzY2hlbiEKKworQkVJU1BJRUw6CisgICAgIEluIC9kL2luc2Vsbi96ZXNzdHJhL3Z1bGthbndlZy9yb29tL3IxIGxpZWZlcnQKKyAgICAgUXVlcnlQcm9wKFBfRE9NQUlOKQorICAgICBlaW4gIkluc2VsbiIgenVydWVjay4KKworICAgICBJbiBlaW5lbSBSYXVtIGRlciBDaGFvc2dpbGRlOgorICAgICBTZXRQcm9wKFBfRE9NQUlOLCAiUG9sYXIiKTsKKyAgICAgZGFtaXQgZGVyIFJhdW0gYWxzIFJhdW0gZGVyIFJlZ2lvbiBQb2xhciBhbmdlemVpZ3Qgd2lyZC4KKworU0lFSEUgQVVDSDoKKyAgICAgZ21jcAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisyMy4wMi4yMDEzLCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0RPT1JfSU5GT1MgYi9kb2MvcHJvcHMvUF9ET09SX0lORk9TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNWY3MWIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9ET09SX0lORk9TCkBAIC0wLDAgKzEsNDQgQEAKK05BTUU6CisgICAgUF9ET09SX0lORk9TICAgICAgICAgICAgICAgICAgImRvb3JfaW5mb3MiCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL2Rvb3Jyb29tLmgKKworQkVTQ0hSRUlCVU5HOgorICAgIE1hcHBpbmcgbWl0IEluZm9ybWF0aW9uZW4gdWViZXIgZWluZSBpbSBSYXVtIHBlciBOZXdEb29yKCkgZGVmaW5pZXJ0ZQorICAgIFR1ZXIuIERpZXNlIEluZm9zIHdlcmRlbiB1ZWJlciAvc3RkL3Jvb20vZG9vcnMuYyBhbiBkZW4gL29iai9kb29ybWFzdGVyLmMKKyAgICB3ZWl0ZXJnZWdlYmVuIHVuZCBkZW0gUmF1bSwgZGVyIGRpZSBUdWVyIGJlc2l0enQsIGFscyBQcm9wZXJ0eSBnZXNldHp0LgorICAgIFdlcmRlbiBtZWhyZXJlIFR1ZXJlbiBpbiBlaW5lbSBSYXVtIGVpbmdlYnVuZGVuLCBlbnRoYWVsdCBkYXMgTWFwcGluZworICAgIGVudHNwcmVjaGVuZCB2aWVsZSBFaW50cmFlZ2UuCisKKyAgICBEaWVzZXMgTWFwcGluZyBkaWVudCB6dXIgaW50ZXJuZW4gVmVyd2FsdHVuZyBkZXIgVHVlcmVuIGltCisgICAgL29iai9kb29ybWFzdGVyLmMgdW5kIHNvbGx0ZSBuaWNodCBwZXIgSGFuZCB2ZXJhZW5kZXJ0IHdlcmRlbiEKKworICAgIERpZSBFaW50cmFlZ2UgaW0gTWFwcGluZyBoYWJlbiBmb2xnZW5kZSBrZXlzIChkZWZpbmllcnQgaW4KKyAgICAvc3lzL2Rvb3Jyb29tLmgpOgorCisgICAgRF9ERVNUIDogWmllbHJhdW0gKHN0cmluZykKKyAgICBEX0NNRFMgOiBCZWZlaGwoZSksIHVtIGR1cmNoIGRpZSBUdWVyIHp1IGdlaGVuIChzdHJpbmcgb2RlciAqc3RyaW5nKQorICAgIERfSURTICA6IElEcyBkZXIgVHVlciAoc3RyaW5nIG9kZXIgKnN0cmluZykKKyAgICBEX0ZMQUdTIDogQmVzb25kZXJlIEVpZ2Vuc2NoYWZ0ZW4gZGVyIFR1ZXIgKFR1ZXIgYnJhdWNodCBTY2hsdWVzc2VsIGV0Yy4pCisgICAgRF9MT05HICA6IExhbmdiZXNjaHJlaWJ1bmcgKHN0cmluZykKKyAgICBEX1NIT1JUIDogS3VyemJlc2NocmVpYnVuZyAoc3RyaW5nKQorICAgIERfTkFNRSAgOiBOYW1lIChzdHJpbmcgb2RlciAqc3RyaW5nKQorICAgIERfR0VOREVSICA6IEdlc2NobGVjaHQKKyAgICBEX0ZVTkMgICAgOiBGdW5rdGlvbiwgZGllIFZPUiBkZW0gRHVyY2hzY2hyZWl0ZW4gZGVyIFR1ZXIgYXVmZ2VydWZlbiB3aXJkCisgICAgRF9NU0dTICAgIDogQmV3ZWd1bmdzbWVsZHVuZ2VuCisgICAgRF9GVU5DMiAgIDogRnVua3Rpb24sIGRpZSBOQUNIIGRlbSBEdXJjaHNjaHJlaXRlbiBkZXIgVHVlciBhdWZnZXJ1ZmVuIHdpcmQKKyAgICBEX1RFU1RGVU5DICA6IEZ1bmt0aW9uIGRpZSBpbSBTYXJ0cmF1bSB0ZXN0ZXQsIG9iIGRpZSBUdWVyIGR1cmNoc2Nocml0dGVuCisgICAgICAgICAgICAgICAgICB3ZXJkZW4gZGFyZgorICAgIERfUkVTRVRfTVNHIDogTWVsZHVuZ2VuIGJlaW0gVHVlci1SZXNldAorICAgIERfT1BFTl9XSVRIX01PVkUgOiBGYWxscyBnZXNldHp0LCB3aXJkIGRpZSBUdWVyIGF1Y2ggbWl0IGRlbQorICAgICAgICAgICAgICAgICAgICAgICBCZXdlZ3VuZ3NiZWZlaGwgZ2VvZWZmbmV0IHVuZCBkdXJjaHNjaHJpdHRlbiwgZmFsbHMKKyAgICAgICAgICAgICAgICAgICAgICAgT2VmZm5lbiBlcmZvbGdyZWljaAorCisKK1NJRUhFIEFVQ0g6CisgICAgTmV3RG9vcigpLCBRdWVyeURvb3JLZXkoKSwgUXVlcnlEb29yU3RhdHVzKCksIFNldERvb3JTdGF0dXMoKSwKKyAgICAvc3RkL3Jvb20vZG9vcnMuYywgL29iai9kb29ybWFzdGVyLmMsIEdldFBoaW9sZW5JbmZvcygpLCBRdWVyeUFsbERvb3JzKCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xldHp0ZSBBZW5kZXJ1bmc6IERvbiwgMDguMDUuMjAxNCwgR2FieWxvbgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfRE9fREVTVFJVQ1QgYi9kb2MvcHJvcHMvUF9ET19ERVNUUlVDVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTlhMjMwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfRE9fREVTVFJVQ1QKQEAgLTAsMCArMSwxNyBAQAorTkFNRToKKyAgICBQX0RPX0RFU1RSVUNUICAgICAgICAgICAgICAgICAiZG9fZGVzdHJ1Y3QiICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcHJvcGVydGllcy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRmxhZywgb2Igc2ljaCBkaWUgTGljaHRxdWVsbGUgYW0gRW5kZSBkZXIgTGV1Y2h0emVpdCBzZWxic3QKKyAgICAgemVyc3RvZXJ0LiAKKworU0lFSEUgQVVDSDoKKyAgICAgQmFzaXNrbGFzc2VuOiAvc3RkL2xpZ2h0c291cmNlLmMKKyAgICAgUHJvcGVydGllczogUF9GVUVMLCBQX0xJR0hUREVTQywgUF9MSUdIVAorICAgICBNZXRob2RlbjogQWRkRnVlbChMKQorCitMRVRaVEUgQUVOREVSVU5HOgorICAgIDIyLiBEZXouIDIwMTUsIEFyYXRob3JuCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9EUklOSyBiL2RvYy9wcm9wcy9QX0RSSU5LCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZmU5ODIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9EUklOSwpAQCAtMCwwICsxLDI1IEBACitOQU1FOgorICAgICBQX0RSSU5LICAgICAgICAgICAgICAgICAgICAgICAiZHJpbmsiCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N5cy9saXZpbmcvbGlmZS5oCisKK0JFU0NIUkVJQlVORzoKKworICAgICAtIExlYmV3ZXNlbgorICAgICAgIE51bWVyaXNjaGVyIFdlcnQgZnVlciBkZW4gU2FldHRpZ3VuZ3NncmFkIGVpbmVzIExlYmV3ZXNlbnMgbWl0CisgICAgICAgR2V0cmFlbmtlbi4gRGVyIG1heGltYWxlIFdlcnQgc3RlaHQgaW4gUF9NQVhfRFJJTksuCisKKyAgICAgLSBTcGVpc2VuL0tuZWlwZW4KKyAgICAgICBOdW1lcmlzY2hlciBXZXJ0IGZ1ZXIgZGVuIFNhZXR0aWd1bmdzZ3JhZCBlaW5lciBQb3J0aW9uIGVpbmVzCisgICAgICAgR2V0cmFlbmtlcy4gSXN0IGRpZXNlIFByb3BlcnR5IG5pY2h0IGdlc2V0enQgb2RlciB6dXNhZXR6bGljaAorICAgICAgIFBfRk9PRCBnZXNldHp0LCBrYW5uIG1hbiBkaWVzZSBTcGVpc2UgbmljaHQgdHJpbmtlbi4gRWluZQorICAgICAgIGZ1bmt0aW9uaWVyZW5kZSBTcGVpc2UgX211c3NfIGVudHdlZGVyIFBfRk9PRCBvZGVyIFBfRFJJTksKKyAgICAgICBncm9lc3NlciAwIGdlc2V0enQgaGFiZW4uCisgICAgIAorU0lFSEUgQVVDSDoKKyAgICAgUF9NQVhfRFJJTkssIFBfRFJJTktfREVMQVksIGNvbnN1bWUKKyAgICAgUF9GT09ELCBQX0FMQ09IT0wsIHdpei9mb29kCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogVGh1IE9jdCAyOCAxMjoxNTowMCAyMDEwIGJ5IENhbGRyYQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0RSSU5LX0RFTEFZIGIvZG9jL3Byb3BzL1BfRFJJTktfREVMQVkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDExODg0MwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0RSSU5LX0RFTEFZCkBAIC0wLDAgKzEsMTAgQEAKK05BTUU6CisgICAgUF9EUklOS19ERUxBWSAgICAgICAgICAgICAgICAgImRyaW5rX2RlbGF5IiAgICAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9saXZpbmcvbGlmZS5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgQW56YWhsIGRlciBoZWFydF9iZWF0cywgYmlzIFBfRFJJTksgdW0gZWluZW4gUHVua3Qgc2lua3QuCisgICAgIEFlbmRlcnVuZ2VuIGRpZXNlciBQcm9wZXJ0eSBpbiBTcGllbGVybiBiZWR1ZXJmZW4gZGVyIAorICAgICBHZW5laG1pZ3VuZyBkZXMgRU0gZnVlciBCYWxhbmNlLgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfRFJJTktfRlVMTF9NU0cgYi9kb2MvcHJvcHMvUF9EUklOS19GVUxMX01TRwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTAzYWYzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfRFJJTktfRlVMTF9NU0cKQEAgLTAsMCArMSwyNCBAQAorTkFNRToKKyAgICAgUF9EUklOS19GVUxMX01TRyAgICAgICAgICAgICAgInN0ZF9mb29kX2RyaW5rX2Z1bGxfbXNnIgorCitERUZJTklFUlQgSU46CisgICAgIDxzeXMvZm9vZC5oPgorCitCRVNDSFJFSUJVTkc6CisgICAgIE1lbGR1bmcgYW4gZGVuIEtvbnN1bWVudGVuLCB3ZW5uIGVpbiBHZXRyYWVuayBnZXRydW5rZW4gd2VyZGVuIHNvbGwsCisgICAgIG9id29obCBkaWVzZXIgbmljaHRzIG1laHIgdHJpbmtlbiBrYW5uLgorICAgICAKK0JFTUVSS1VOR0VOOgorICAgICBEaWVzZSBNZWxkdW5nIHdpcmQgdm9uIHJlcGxhY2VfcGVyc29uYWwgbWl0IGRlbiBBcmd1bWVudGVuOgorICAgICAxLiBTcGVpc2UKKyAgICAgMi4gS29uc3VtZW50CisgICAgIHZlcmFyYmVpdGV0LCBrYW5uIGFscyBlbnRzcHJlY2hlbmRlIFBsYXR6aGFsdGVyIGVudGhhbHRlbgorICAgICAKK0RFRkFVTFQ6CisgICAgICJTbyB2aWVsIGthbm5zdCBEdSBpbSBNb21lbnQgbmljaHQgdHJpbmtlbi4iCisKK1NJRUhFIEFVQ0g6CisgICAgIFBfRFJJTkssIFBfTUFYX0RSSU5LLCB3aXovZm9vZCwgcmVwbGFjZV9wZXJzb25hbAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFRodSBPY3QgMjggMTI6MTU6MDAgMjAxMCBieSBDYWxkcmEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9EUk9QX01TRyBiL2RvYy9wcm9wcy9QX0RST1BfTVNHCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNGM5ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9EUk9QX01TRwpAQCAtMCwwICsxLDYyIEBACitQX0RST1BfTVNHCitOQU1FOgorICAgICBQX0RST1BfTVNHCQkJCSJkcm9wX21lc3NhZ2UiIAorCitERUZJTklFUlQgSU46CisgICAgIC9zeXMvbGl2aW5nL3B1dF9hbmRfZ2V0LmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBNaXQgUF9EUk9QX01TRyBrYW5uIG1hbiBkaWUgTWVsZHVuZywgZGllIG1hbiBiZWltIEFibGVnZW4gZWluZXMKKyAgICAgT2JqZWt0ZXMgYmVrb21tdCwgbW9kaWZpemllcmVuLgorCisgICAgIEZvbGdlbmRlIFdlcnRlIHNpbmQgbW9lZ2xpY2g6CisJCisgICAgIG8gMAorICAgICAgIEVzIHdpcmQgZWluZSBTdGFuZGFyZG1lbGR1bmcgYXVzZ2VnZWJlbi4gRGllcyBpc3QgVm9yZWluc3RlbGx1bmcuIAorCSAgCisgICAgIG8gTk9fUE5HX01TRyAgICAgICA9PSAtMQorICAgICAgIEVzIHdpcmQga2VpbmVybGVpIE1lbGR1bmcgYXVzZ2VnZWJlbgorCSAgCisgICAgIG8gRWluIEFycmF5IGF1cyBTdHJpbmdzIAorICAgICAgIERlciBlcnN0ZSBTdHJpbmcgd2lyZCBhbiBkZW4gU3BpZWxlciBhdXNnZWdlYmVuLCBkZXIgendlaXRlIAorICAgICAgIChvcHRpb25hbGUpIGFuIGRlbiBSYXVtLiAKKwkgIAorICAgICAgIERpZSBTdHJpbmdzIHdlcmRlbiBkdXJjaCBkaWUgRnVua3Rpb24gcmVwbGFjZV9wZXJzb25hbCgpIGdlcGFyc3QuCisJT2JqZWt0MSAtIFNwaWVsZXIKKyAgICAgICAgT2JqZWt0MiAtIGRhcyBPYmpla3QsIGRhcyBmYWxsZW5nZWxhc3NlbiB3aXJkCisJICAKKyAgICAgICBXaXJkIGRlciB6d2VpdGUgU3RyaW5nIG5pY2h0IGFuZ2VnZWJlbiwgZXJmb2xndCBrZWluZSBNZWxkdW5nIGFuCisgICAgICAgZGVuIFJhdW0uCisJCQkJCitCRUlTUElFTDoKKyAgICAgdm9pZCBjcmVhdGUoKSB7CisgICAgICAuLi4KKyAgICAgIFNldFByb3AoIFBfU0hPUlQsICJVZ2FycyBIYW5kYXh0IiApOworICAgICAgU2V0UHJvcCggUF9MT05HLCBicmVha19zdHJpbmcoCisgICAgICAgIkRpZXNlcyBpc3QgZWluZSBLYW1wZmF4dCwgd2llIHNpZSBPcmtzIG5vcm1hbGVyd2Vpc2UgYmVudXR6ZW4uICIKKyAgICAgICAiRGEgRHUgWmVpdCBoYXN0LCBzaWUgRGlyIGFuenVzY2hhdWVuLCBpc3QgZGVyIEJlc2l0emVyIHdvaGwgIgorICAgICAgICJiZXJlaXRzIGJlaSBMYXJzLiIsNzggKSk7CisJICAKKyAgICAgIFNldFByb3AoIFBfTkFNRSwgIkF4dCIgKTsKKyAgICAgIEFkZElkKCAoeyJoYW5kYXh0IiwiYXh0In0pICk7CisgICAgICBTZXRQcm9wKCBQX0dFTkRFUiwgRkVNQUxFICk7CisJICAKKyAgICAgIFNldFByb3AoIFBfRFJPUF9NU0csICh7CisgICAgICAgIkR1IHNjaG1laXNzdCBAV0VOMiBoaW4uIiwKKyAgICAgICAiQFdFUjEgc2NobWVpc3N0IERpciBAV0VOVTIgdm9yIGRpZSBGdWVzc2UuXG4ifSkpOworICAgICAgLi4uCisgICAgIH0KKworICAgICBXaWxsIFVnYXIgc2VpbmUgQXh0IGFibGVnZW4gdW5kIGdpYnQgImxhc3NlIGF4dCBmYWxsZW4iIGVpbiwgd2VyZGVuIAorICAgICBmb2xnZW5kZSBNZWxkdW5nZW4gYXVzZ2VnZWJlbjoKKwkKKyAgICAgVWdhcjogIkR1IHNjaG1laXNzdCBkaWUgQXh0IGhpbi4iCisgICAgIFJhdW06ICJVZ2FyIHNjaG1laXNzdCBEaXIgZWluZSBBeHQgdm9yIGRpZSBGdWVzc2UuIgorCQorU0lFSEUgQVVDSDoKKyAgICAgQWVobmxpY2hlczogUF9QSUNLX01TRywgUF9QVVRfTVNHLCBQX0dJVkVfTVNHLCBQX1dFQVJfTVNHLCBQX1dJRUxEX01TRworICAgICBGZWhsZXI6ICAgICBQX1RPT19IRUFWWV9NU0csIFBfRU5WX1RPT19IRUFWWV9NU0csIFBfVE9PX01BTllfTVNHLAorICAgICAgICAgICAgICAgICBQX05PSU5TRVJUX01TRywgUF9OT0xFQVZFX01TRywgUF9OT0RST1AsIFBfTk9HRVQgCisgICAgIFNvbnN0aWdlczogIHJlcGxhY2VfcGVyc29uYWwoRSksIGRyb3Bfb2JqKEwpLCAvc3RkL2xpdmluZy9wdXRfYW5kX2dldC5jCisKKzE0LiBNYWVyeiAyMDA0IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9FQVJNVUZGUyBiL2RvYy9wcm9wcy9QX0VBUk1VRkZTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZTZiMWMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9FQVJNVUZGUwpAQCAtMCwwICsxLDkgQEAKK05BTUU6CisgICAgUF9FQVJNVUZGUyAgICAgICAgICAgICAgICAgICAgImVhcm11ZmZzIiAgICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3Byb3BlcnRpZXMuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIFNob3V0cyB2b24gU3BpZWxlcm4gdW5kIE1hZ2llcm4gbWl0IE1hZ2llcmxldmVsIDwgZWFybXVmZnMgd2VyZGVuCisgICAgIGFiZ2VibG9ja3QgKE51ciBmdWVyIE1hZ2llcikuCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9FQVRFUl9NU0cgYi9kb2MvcHJvcHMvUF9FQVRFUl9NU0cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlhZTRkMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0VBVEVSX01TRwpAQCAtMCwwICsxLDIzIEBACitOQU1FOgorICAgICBQX0VBVEVSX01TRyAgICAgICAgICAgICAgICAgICAic3RkX2Zvb2RfZWF0ZXJfbXNnIgorCitERUZJTklFUlQgSU46CisgICAgIDxzeXMvZm9vZC5oPgorCitCRVNDSFJFSUJVTkc6CisgICAgIE1lbGR1bmcgYW4gZGVuIEtvbnN1bWVudGVuLCB3ZW5uIGVpbmUgU3BlaXNlIGtvbnN1bWllcnQgd2lyZC4KKyAgICAgCitCRU1FUktVTkdFTjoKKyAgICAgRGllc2UgTWVsZHVuZyB3aXJkIHZvbiByZXBsYWNlX3BlcnNvbmFsIG1pdCBkZW4gQXJndW1lbnRlbjoKKyAgICAgMS4gU3BlaXNlCisgICAgIDIuIEtvbnN1bWVudAorICAgICB2ZXJhcmJlaXRldCwga2FubiBhbHMgZW50c3ByZWNoZW5kZSBQbGF0emhhbHRlciBlbnRoYWx0ZW4KKyAgICAgCitERUZBVUxUOgorICAgICAiRHUga29uc3VtaWVyc3QgQFdFTjEuIgorCitTSUVIRSBBVUNIOgorICAgICAvc3RkL2Zvb2QuYywgd2l6L2Zvb2QsIHJlcGxhY2VfcGVyc29uYWwKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBUaHUgT2N0IDI4IDEyOjE1OjAwIDIwMTAgYnkgQ2FsZHJhClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfRUZGRUNUSVZFX0FDIGIvZG9jL3Byb3BzL1BfRUZGRUNUSVZFX0FDCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmN2RkNTMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9FRkZFQ1RJVkVfQUMKQEAgLTAsMCArMSw4NyBAQAorUF9FRkZFQ1RJVkVfQUMKKworTkFNRToKKyAgICAgUF9FRkZFQ1RJVkVfQUMgICAgICAiZWZmZWN0aXZlX2FjIgorCitERUZJTklFUlQgSU46CisgICAgIDxjb21iYXQuaD4KKworQkVTQ0hSRUlCVU5HOgorICAgICBEaWVzZSBQcm9wZXJ0eSBrb21tdCBzb3dvaGwgaW4gUnVlc3R1bmdlbiBhbHMgYXVjaCBpbiBXYWZmZW4sIGRpZQorICAgICBzY2h1ZXR6ZW4gc29sbGVuLCB6dW0gRWluc2F0ei4KKworICAgICBJbiBSdWVzdHVuZ2VuIGthbm4gaGllciBkZXIgRWZmZWt0aXZ3ZXJ0IGRlciBSdWVzdHVuZ3NrbGFzc2UgdmVybWVya3QKKyAgICAgd2VyZGVuLCB3ZW5uIGRpZXNlIG5vY2ggZHVyY2ggZWluZSBEZWZlbmRGdW5jKCkgbW9kaWZpemllcnQgd2lyZAorICAgICAoc293ZWl0IHNpY2ggZWluIHNvbGNoZXIgRWZmZWt0aXZ3ZXJ0IGFuZ2ViZW4gbGFlc3N0KS4KKworICAgICBJbiBlaW5pZ2VuIEdpbGRlbiBrb2VubmVuIFdhZmZlbiBhdWNoIGFscyBSdWVzdHVuZyBlaW5nZXNldHp0IHdlcmRlbgorICAgICAoei5CLiBiZWltIFBhcmllcmVuIGVpbmVzIEFuZ3JpZmZzKS4gSW4gZGllc2VyIFByb3BlcnR5IGthbm4gbWFuIGRpZQorICAgICBSdWVzdHVuZ3NrbGFzc2UgZWludHJhZ2VuLCBkaWUgZGllIFdhZmZlIGJlaSBzb2xjaGVuIEFrdGlvbmVuIGF1ZndlaXNlbgorICAgICBzb2xsLiBEYWJlaSBpc3QgbWFuIGFuIGRpZSB1ZWJsaWNoZW4gQmVzY2hyYWVua3VuZ2VuIGRlcgorICAgICBSdWVzdHVuZ3NrbGFzc2UgZ2VidW5kZW4hIChzLiAvc3lzL2NvbWJhdC5oKQorCitCRVJNRVJLVU5HRU46CisgICAgIERhcyBLYWVtcGZlcnNwZWxsYm9vayB2ZXJ3ZW5kZXQgZnVlciBQYXJhZGVuIGV0Yy4gUF9FRkZFQ1RJVkVfQUMgYW5zdGF0dAorICAgICBQX0FDLCB3ZW5uIHZlcmZ1ZWdiYXIuCisKK0JFSVNQSUVMRToKKyAgICAgKiBEZWZlbmRGdW5jczogCisgICAgICAgRGVyIGRvcHBlbHRlIE1pdHRlbHdlcnQgZGVyIERlZmVuZEZ1bmMgd2lyZCB6dXIgQmFzaXMtQUMgZGF6dWFkZGllcnQsCisgICAgICAgZGEgc2ljaCBkZXIgJ1NjaHV0endlcnQgPSByYW5kb20oQmFzaXMtQUMpICsgYWJzb2x1dChEZWZlbmRGdW5jLVdlcnQpJworICAgICAgIGJlcmVjaG5ldC4KKworICAgICAvLyAjMSBFaW5lIFJ1ZXN0dW5nIG1pdCBQX0FDIHZvbiAzNSB1bmQgcmFuZG9taXNpZXJ0ZXIgRGVmZW5kRnVuYworICAgICAgICBTZXRQcm9wKFBfQUMsIDM1KTsKKyAgICAgICAgU2V0UHJvcChQX0RFRkVORF9GVU5DLCB0aGlzX29iamVjdCgpKTsKKworICAgICAgICBpbnQgRGVmZW5kRnVuYyguLi4pIHsKKyAgICAgICAgICByZXR1cm4gcmFuZG9tKDIwKTsgICAgICAgICAgICAgICAgICAgICAgIC8vIE1pdHRlbHdlcnQ6IDEwCisgICAgICAgIH0KKyAgICAgICAgLT4gU2V0UHJvcChQX0VGRkVDVElWRV9BQywgNTUpOyAgICAgICAgICAgIC8vIDM1ICsgMioxMCA9IDU1CisKKyAgICAgLy8gIzIgRWluZSBSdWVzdHVuZyBtaXQgUF9BQyB2b24gMzUgdW5kIHRlaWxyYW5kb21pc2llcnRlciBEZWZlbmRGdW5jCisgICAgICAgIFNldFByb3AoUF9BQywgMzUpOworICAgICAgICBTZXRQcm9wKFBfREVGRU5EX0ZVTkMsIHRoaXNfb2JqZWN0KCkpOworCisgICAgICAgIGludCBEZWZlbmRGdW5jKC4uLikgeworICAgICAgICAgIHJldHVybiAyMCArIHJhbmRvbSgxMCk7ICAgICAgICAgICAgICAgICAgLy8gTWl0dGVsd2VydDogMjAgKyA1CisgICAgICAgIH0KKyAgICAgICAgLT4gU2V0UHJvcChQX0VGRkVDVElWRV9BQywgODUpOyAgICAgICAgICAgIC8vIDM1ICsgMiooMjArNSkgPSA4NQorCisgICAgICogU29uZGVyZnVua3Rpb24gaW0gS29udGV4dCBkZXIgS2FlbXBmZXJnaWxkZToKKyAgICAgICBBdWNoIHdlbm4gZGVyIGVpZ2VudGxpY2hlIEFDLVdlcnQgZHVyY2gga2VpbmUgRGVmZW5kRnVuYyBvQWUKKyAgICAgICBtb2RpZml6aWVydCB3aXJkLCBzaW5kIGFid2VpY2hlbmRlIFdlcnRlIGluIFBfRUZGRUNUSVZFX0FDIHpCIGluIGRlcgorICAgICAgIEthZW1wZmVyZ2lsZGUgZnVlciBQYXJhZGVuIG9kZXIgYWVobmxpY2hlcyBzaW5udm9sbC4gTWF4aW1hbHdlcnQgaXN0CisgICAgICAgZGFmdWVyIGRlciBkb3BwZWx0ZSBXZXJ0IGRlcyBCYXNpcy1BQy1XZXJ0ZXMuCisKKyAgICAgLy8gIzMgRWluIHNjaG9uIHNlaHIgZ3V0ZXMgU2NoaWxkLCB3ZWxjaGVzIGJlaSBkZXIgU2NoaWxkcGFyYWRlIGFiZXIKKyAgICAgLy8gICAgbm9jaCBiZXNzZXIgc2NodWV0emVuIHNvbGwuCisgICAgICAgIFNldFByb3AoUF9BUk1PVVJfVFlQRSwgQVRfU0hJRUxEKTsKKyAgICAgICAgU2V0UHJvcChQX0FDLCAzOCk7CisgICAgICAgIFNldFByb3AoUF9FRkZFQ1RJVkVfQUMsIDU1KTsKKworICAgICAvLyAjNCBFaW4gc2VociBsYWJicmlnZXMgU2NoaWxkIHNjaHVldHp0IHp3YXIgZ2VnZW4gbm9ybWFsZSBTY2hsYWVnZSwKKyAgICAgLy8gICAgaXN0IHp1bSBQYXJpZXJlbiBhYmVyIGlyZ2VuZHdpZSB1bmdlZWlnbmV0IHdlaWwgdW5rb250cm9sbGllcmJhci4KKyAgICAgICAgU2V0UHJvcChQX0FSTU9VUl9UWVBFLCBBVF9TSElFTEQpOworICAgICAgICBTZXRQcm9wKFBfQUMsIDM4KTsKKyAgICAgICAgU2V0UHJvcChQX0VGRkVDVElWRV9BQywgMjApOworCisgICAgICogV2FmZmVuOgorICAgICAgIFBfRUZGRUNUSVZFX0FDIHdpcmQgaW0gS2FlbXBmZXJzcGVsbGJvb2sgYWxzIEJvbnVzIGRhenVnZXphZWhsdCEgRGFoZXIKKyAgICAgICBzb2xsdGVuIGd1dGUgUGFyaWVyd2FmZmVuIGF1Y2ggZWluZW4gbmllZHJpZ2VyZW4gUF9XQy1XZXJ0IGhhYmVuLgorICAgICAgIFJlaW5lIFBhcmllcndhZmZlbiBkdWVyZmVuIGRlbiBtYXhpbWFsZW4gQUMtV2VydCB2b24gU2NoaWxkZW4gYWxzCisgICAgICAgTWF4aW11bSBnZXNldHp0IGhhYmVuIC0gZGllIEJhbGFuY2Uga2xhZXJ0IGdnZiwgb2IgZGFzIGF1Y2ggYXVmIGRlbgorICAgICAgIEdpbGRlbnBhcmllcndlcnQgYW53ZW5kYmFyIGlzdC4KKworICAgICAvLyAjNSBFaW5lIG1hZXNzaWdlIEhlbGxlYmFyZGUvQXh0d2FmZmUgbWl0IFBhcmllcmhha2VuLgorICAgICAgICBTZXRQcm9wKFBfV0VBUE9OX1RZUEUsIFdUX0FYRSk7CisgICAgICAgIFNldFByb3AoUF9XQywgMTAwKTsKKyAgICAgICAgU2V0UHJvcChQX0VGRkVDVElWRV9BQywgMjUpOworCitTSUVIRSBBVUNIOgorICAgICBXYWZmZW46ICAgICBQX1dDLCBQX1RPVEFMX1dDLCBQX0VGRkVDVElWRV9XQywgSGl0RnVuYygpCisgICAgIFJ1ZXN0dW5nZW46IFBfQUMsIFBfVE9UQUxfQUMsIERlZmVuZEZ1bmMoKQorICAgICBGaWxlczogICAgICAvc3RkL3dlYXBvbi5jLCAvc3RkL3dlYXBvbi9jb21iYXQuYworICAgICBCYWxhbmNlOiAgICB3YWZmZW4sIHJ1ZXN0dW5nZW4sIHByb3BlcnRpZXMsIGthZW1wZmVyYm9uaQorCis2LiBOb3YgMjAxMSBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfRUZGRUNUSVZFX1dDIGIvZG9jL3Byb3BzL1BfRUZGRUNUSVZFX1dDCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMjg2MjkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9FRkZFQ1RJVkVfV0MKQEAgLTAsMCArMSw4NiBAQAorUF9FRkZFQ1RJVkVfV0MKKworTkFNRToKKyAgICAgUF9FRkZFQ1RJVkVfV0MgICAgICJlZmZlY3RpdmVfd2MiCisKK0RFRklOSUVSVCBJTjoKKyAgICAgPGNvbWJhdC5oPgorCitCRVNDSFJFSUJVTkc6CisgICAgIERpZXNlIFByb3BlcnR5IGtvbW10IHNvd29obCBpbiBXYWZmZW4gYWxzIGF1Y2ggUnVlc3R1bmdlbiwgZGllIFNjaGFkZW4KKyAgICAgbWFjaGVuIHNvbGxlbiwgenVtIEVpbnNhdHouCisKKyAgICAgRmFsbHMgZGllIFN0YWVya2UgZWluZXIgV2FmZmUgbm9jaCBkdXJjaCBlaW5lIEhpdEZ1bmMoKSBtb2RpZml6aWVydAorICAgICB3aXJkLCBzb2xsdGUgaGllciBkZXIgRWZmZWt0aXZ3ZXJ0IGRlciBXYWZmZW5rbGFzc2UgdmVybWVya3Qgd2VyZGVuLAorICAgICBzb3dlaXQgZXIgc2ljaCBhbmdlYmVuIGxhZXNzdC4KKyAgICAgRGllc2UgUHJvcGVydHkgZGllbnQgdm9yIGFsbGVtIGRhenUsIGVpbmUgV2FmZmUgbWl0IEhpdEZ1bmMoKSBrb3JyZWt0CisgICAgIGVpbnp1c2NoYWV0emVuLgorCisgICAgIEluIGVpbmlnZW4gR2lsZGVuIGtvZW5uZW4gUnVlc3R1bmdlbiBhdWNoIGFscyBXYWZmZW4gZWluZ2VzZXR6dCB3ZXJkZW4KKyAgICAgKHouQi4gZWluIFBhYXIgU2NodWhlIHp1bSBUcmV0ZW4pLiBJbiBkaWVzZXIgUHJvcGVydHkga2FubiBtYW4gZGllCisgICAgIFdhZmZlbmtsYXNzZSBlaW50cmFnZW4sIGRpZSBkaWUgUnVlc3R1bmcgYmVpIHNvbGNoZW4gQWt0aW9uZW4gYXVmd2Vpc2VuCisgICAgIHNvbGwuIERhYmVpIGlzdCBtYW4gYW4gZGllIHVlYmxpY2hlbiBCZXNjaHJhZW5rdW5nZW4gZGVyIFdhZmZlbmtsYXNzZQorICAgICBnZWJ1bmRlbiEgKHMuIC9zeXMvY29tYmF0LmgpCisgICAgIERlciBSdWVzdHVuZyBrYW5uIG1hbiBkYW5uIGF1Y2ggZWluZW4gU2NoYWRlbnN0eXAgbWl0IGF1ZiBkZW4gV2VnCisgICAgIGdlYmVuLgorCitCRU1FUktVTkdFTjoKKyAgICAgRGFzIEthZW1wZmVyc3BlbGxib29rIHZlcndlbmRldCBiZWkgUnVlc3R1bmdlbiBQX0FDLCB3ZW5uCisgICAgIFBfRUZGRUNUSVZFX1dDIG5pY2h0IGdlc2V0enQgaXN0LgorCitCRUlTUElFTEU6CisgICAgICogSGl0RnVuY3M6CisgICAgICAgRGVyIGRvcHBlbHRlIE1pdHRlbHdlcnQgZGVyIEhpdEZ1bmMgd2lyZCB6dXIgQmFzaXMtV0MgZGF6dWFkZGllcnQsCisgICAgICAgZGEgc2ljaCBkZXIgJ0FuZ3JpZmZzd2VydCA9IHJhbmRvbShCYXNpcy1XQykgKyBhYnNvbHV0KEhpdEZ1bmMtV2VydCknCisgICAgICAgYmVyZWNobmV0LgorCisgICAgIC8vICMxIFdhZmZlIG1pdCBCYXNpcy1XQyAxMjAgdW5kIHJhbmRvbWlzaWVydGVyIEhpdEZ1bmMKKyAgICAgICAgU2V0UHJvcChQX1dDLCAxMjApOworICAgICAgICBTZXRQcm9wKFBfSElUX0ZVTkMsIHRoaXNfb2JqZWN0KCkpOworICAgICAgIAorICAgICAgICBpbnQgSGl0RnVuYyguLi4pIHsKKyAgICAgICAgICByZXR1cm4gcmFuZG9tKDMwKTsgICAgICAgICAgICAgICAgICAgICAgIC8vIE1pdHRlbHdlcnQ6IDE1CisgICAgICAgIH0KKyAgICAgICAgLT4gU2V0UHJvcChQX0VGRkVDVElWRV9XQywgMTUwKTsgICAgICAgICAgIC8vIDEyMCArIDIqMTUgPSAxNTAKKyAgICAgCisgICAgIC8vICMyIFdhZmZlIG1pdCBCYXNpcy1XQyAxMjAgdW5kIHRlaWx3ZWlzZSBhYnNvbHV0ZXIgSGl0RnVuYworICAgICAgICBTZXRQcm9wKFBfV0MsIDEyMCk7CisgICAgICAgIFNldFByb3AoUF9ISVRfRlVOQywgdGhpc19vYmplY3QoKSk7CisgICAgICAgCisgICAgICAgIGludCBIaXRGdW5jKC4uLikgeworICAgICAgICAgIHJldHVybiAzMCArIHJhbmRvbSgxMCk7ICAgICAgICAgICAgICAgICAgLy8gTWl0dGVsd2VydDogMzAgKyA1CisgICAgICAgIH0KKyAgICAgICAgLT4gU2V0UHJvcChQX0VGRkVDVElWRV9XQywgMTkwKTsgICAgICAgICAgIC8vIDEyMCArIDIqKDMwKzUpID0gMTkwCisKKyAgICAgKiBSdWVzdHVuZ2VuICh6QiBHaWxkZW5udXR6dW5nKToKKyAgICAgICBEZXIgTWF4aW1hbHdlcnQgZnVlciBkaWUgUF9FRkZFQ1RJVkVfV0MgYmVpIEthZW1wZmVybiBpc3QgZGVyIGpld2VpbHMKKyAgICAgICBkb3BwZWx0ZSBtYXhpbWFsZSBQX0FDLVdlcnQuIEFuZ2FiZSBlaW5lcyBTY2hhZGVuc3R5cHMgaXN0IHNpbm52b2xsLgorCisgICAgIC8vICMzIEVpbiBwYWFyIFNjaHVoZSwgbWl0IG1heGltYWxlbSBTY2hsYWctL1NhZXVyZXNjaGFkZW4uCisgICAgICAgIFNldFByb3AoUF9BUk1PVVJfVFlQRSwgQVRfQk9PVCk7CisgICAgICAgIFNldFByb3AoUF9BQywgMik7CisgICAgICAgIFNldFByb3AoUF9EQU1fVFlQRSwgKHtEVF9CTFVER0VPTixEVF9BQ0lEfSkpOworICAgICAgICAtPiBTZXRQcm9wKFBfRUZGRUNUSVZFX1dDLCAxMik7ICAvLyBob2VjaHN0bW9lZ2xpY2hlciBXZXJ0IGJlaQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTY2h1aGVuLCBkYSBkZXJlbiBtYXguIFBfQUMgPSA2CisgICAgIC8vIGFlcXVpdmFsZW50IHVuZCB6dWt1bmZ0c3NpY2hlcjoKKyAgICAgICAgLT4gU2V0UHJvcChQX0VGRkVDVElWRV9XQywgMiAqIFZBTElEX0FSTU9VUl9DTEFTU1tBVF9CT09UXSk7CisKKyAgICAgLy8gIzQgRWluIFNjaGlsZCBtaXQgc3BpdHplbSBEb3JuLiAoU3RpY2hzY2hhZGVuIGJlaW0gU2NoaWxkc3Rvc3MuKQorICAgICAgICBTZXRQcm9wKFBfQVJNT1VSX1RZUEUsIEFUX1NISUVMRCk7CisgICAgICAgIFNldFByb3AoUF9BQywgNSk7CisgICAgICAgIFNldFByb3AoUF9EQU1fVFlQRSwgKHtEVF9QSUVSQ0V9KSk7CisgICAgICAgIFNldFByb3AoUF9FRkZFQ1RJVkVfV0MsIDU1KTsKKworICAgICAvLyAjNSBFaW4gR3VtbWlzY2hpbGQgaXN0IHNjaGxlY2h0IGZ1ZXIgQW5ncmlmZmUuIEJPSU5HIQorICAgICAgICBTZXRQcm9wKFBfQVJNT1VSX1RZUEUsIEFUX1NISUVMRCk7CisgICAgICAgIFNldFByb3AoUF9BQywgMzApOworICAgICAgICBTZXRQcm9wKFBfREFNX1RZUEUsICh7RFRfQkxVREdFT059KSk7CisgICAgICAgIFNldFByb3AoUF9FRkZFQ1RJVkVfV0MsIDEwKTsKKworU0lFSEUgQVVDSDoKKyAgICAgV2FmZmVuOiAgICAgUF9XQywgUF9UT1RBTF9XQywgSGl0RnVuYygpCisgICAgIFJ1ZXN0dW5nZW46IFBfQUMsIFBfVE9UQUxfQUMsIFBfRUZGRUNUSVZFX0FDLCBEZWZlbmRGdW5jKCkKKyAgICAgRmlsZXM6ICAgICAgL3N0ZC93ZWFwb24uYywgL3N0ZC93ZWFwb24vY29tYmF0LmMKKyAgICAgQmFsYW5jZTogICAgd2FmZmVuLCBydWVzdHVuZ2VuLCBwcm9wZXJ0aWVzLCBrYWVtcGZlcmJvbmkKKworNi4gTm92IDIwMTEgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0VNUFRZX01TRyBiL2RvYy9wcm9wcy9QX0VNUFRZX01TRwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjQ4ZDhlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfRU1QVFlfTVNHCkBAIC0wLDAgKzEsMjQgQEAKK05BTUU6CisgICAgIFBfRU1QVFlfTVNHICAgICAgICAgICAgICAgICAgICJzdGRfZm9vZF9lYXRlcl9tc2ciCisKK0RFRklOSUVSVCBJTjoKKyAgICAgPHN5cy9mb29kLmg+CisKK0JFU0NIUkVJQlVORzoKKyAgICAgTWVsZHVuZyBhbiBkZW4gS29uc3VtZW50ZW4sIHdlbm4gdmVyc3VjaHQgd2lyZCwgZWluZSBhdWZnZWJyYXVjaHRlIFNwZWlzZQorICAgICAoYWxzbyBlaW5lbiBsZWVyZW4gQmVoYWVsdGVyKSB6dSBrb25zdW1pZXJlbi4KKyAgICAgCitCRU1FUktVTkdFTjoKKyAgICAgRGllc2UgTWVsZHVuZyB3aXJkIHZvbiByZXBsYWNlX3BlcnNvbmFsIG1pdCBkZW4gQXJndW1lbnRlbjoKKyAgICAgMS4gU3BlaXNlIChhbHNvIGRlbiBsZWVyZW4gQmVoYWVsdGVyKQorICAgICAyLiBLb25zdW1lbnQKKyAgICAgdmVyYXJiZWl0ZXQsIGthbm4gYWxzIGVudHNwcmVjaGVuZGUgUGxhdHpoYWx0ZXIgZW50aGFsdGVuCisgICAgIAorREVGQVVMVDoKKyAgICAgIkBXRVIxIGlzdCBiZXJlaXRzIGxlZXIuIgorCitTSUVIRSBBVUNIOgorICAgICAvc3RkL2Zvb2QuYywgd2l6L2Zvb2QsIHJlcGxhY2VfcGVyc29uYWwKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBUaHUgT2N0IDI4IDEyOjE1OjAwIDIwMTAgYnkgQ2FsZHJhClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfRU1QVFlfUFJPUFMgYi9kb2MvcHJvcHMvUF9FTVBUWV9QUk9QUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODE1NmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfRU1QVFlfUFJPUFMKQEAgLTAsMCArMSwzMyBAQAorTkFNRToKKyAgICAgUF9FTVBUWV9QUk9QUyAgICAgICAgICAgICAgICAgInN0ZF9mb29kX2VtcHR5X3Byb3BzIgorCitERUZJTklFUlQgSU46CisgICAgIDxzeXMvZm9vZC5oPgorCitCRVNDSFJFSUJVTkc6CisgICAgIE1hcHBpbmcgbWl0IFByb3BlcnRpZXMgZnVlciBkZW4gbGVlcmVuIEJlaGFlbHRlciwgZGVyIHVlYnJpZyBibGVpYnQsd2VubgorICAgICBlaW5lIFNwZWlzZSBhdWZnZWJyYXVjaHQgaXN0LiBBbGxlIGVudGhhbHRlbmVuIFByb3BlcnRpZXMgd2VyZGVuIGdlc2V0enQsCisgICAgIHdlbm4ga2VpbmUgUG9ydGlvbmVuIG1laHIgdm9yaGFuZGVuIHNpbmQuCisgICAgIEJlcmVpdHMgaW4gZGllc2VuIFByb3BlcnRpZXMgZWluZ2V0cmFnZW5lIFdlcnRlIHdlcmRlbiB1ZWJlcnNjaHJpZWJlbiEKKyAgICAgV2VubiBkaWVzZSBQcm9wZXJ0eSBuaWNodCBnZXNldHp0IGlzdCwgd2lyZCBkaWUgU3BlaXNlIHplcnN0b2VydCwgd2VubgorICAgICBhbGxlIFBvcnRpb25lbiBhdWZnZWJyYXVjaHQgaXN0IC0gZXMgYmxlaWJ0IGFsc28ga2VpbiBCZWhhZWx0ZXIgenVydWVjay4KKyAgICAgQWNodHVuZzogRXMgd2VyZGVuIGtlaW5lIGNsb3N1cmVzIGluIGRpZXNlbSBNYXBwaW5nIHVudGVyc3R1ZXR6dCEKKyAgICAgCitCRU1FUktVTkdFTjoKKyAgICAgQmVpIGRlciBBYmZyYWdlIHZvbiBQX1ZBTFVFIHVuZCBQX1dFSUdIVCBpbiBkZXIgU3BlaXNlLCB3ZXJkZW4gZGllIGRhenUKKyAgICAgaW4gUF9FTVBUWV9QUk9QUyBnZXNwZWljaGVydGVuIFdlcnRlIHZlcndlbmRldCwgdW0gZGFzIEdld2ljaHQvV2VydCBkZXMKKyAgICAgbGVlcmVuIEJlaGFlbHRlcnMgenVtIEdlc2FtdHdlcnQgZGVyIFNwZWlzZSB6dSBhZGRpZXJlbi4KKyAgICAgTWFuIGthbm4gYWxsZSBQcm9wZXJ0aWVzIGluIGRpZXNlcyBNYXBwaW5nIGVpbnRyYWdlbiwgZGllIHNpY2ggaW4gZGVyCisgICAgIFNwZWlzZSBwZXIgU2V0UHJvcCBzZXR6ZW4gbGFzc2VuLiBadXNhZXR6bGljaCBrYW5uIG1hbiBBcnJheXMgaW4gUF9JRFMKKyAgICAgdW5kIFBfQURKRUNUSVZFUyBzcGVpY2hlcm4sIGRpZSBwZXIgQWRkLU1ldGhvZGUgaW4gZGVyIFNwZWlzZQorICAgICBoaW56dWdlZnVlZ3Qgd2VyZGVuLCBuYWNoZGVtIGRpZSBpbSBjcmVhdGUoKSBkZXIgU3BlaXNlIGhpbnp1Z2VmdWVndGVuCisgICAgIElkcy9BZGplY3RpdmVzIGRvcnQgZW50ZmVybnQgd3VyZGVuLgorICAgICAKK0JFSVNQSUVMRToKKyAgICAgQmVpc3BpZWxlIHp1ciBWZXJ3ZW5kdW5nIGZpbmRldCBtYW4gdW50ZXIgL2RvYy9iZWlzcGllbGUvZm9vZAorCitTSUVIRSBBVUNIOgorICAgICAvc3RkL2Zvb2QuYywgd2l6L2Zvb2QKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBUaHUgT2N0IDI4IDEyOjE1OjAwIDIwMTAgYnkgQ2FsZHJhClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfRU5BQkxFX0lOX0FUVEFDS19PVVQgYi9kb2MvcHJvcHMvUF9FTkFCTEVfSU5fQVRUQUNLX09VVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjBhODA3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfRU5BQkxFX0lOX0FUVEFDS19PVVQKQEAgLTAsMCArMSwzMyBAQAorTkFNRToKKwlQX0VOQUJMRV9JTl9BVFRBQ0tfT1VUCQkiZW5hYmxlX2luX2F0dGFja19vdXQiCisKK0RFRklOSUVSVCBJTjoKKwkvc3lzL2NvbWJhdC5oCisKK0JFU0NIUkVJQlVORzoKKwlOb3JtYWxlcndlaXNlIHdpcmQgZGllIGJla2FubnRlIFRha3RpayBSZWluLUFuZ3JpZmYtUmF1cworCXN0YW5kYXJkbWFlc3NpZyB1bnRlcmJ1bmRlbiwgZGFtaXQgTlBDcyBhdWNoIGVpbmUgQ2hhbmNlIGhhYmVuLCBzaWNoCisJenUgdmVydGVpZGlnZW4uIEhpZXJ6dSB3aXJkIGRlciBTY2hhZGVuIGlubmVyaGFsYiBkb19kYW1hZ2UoKQorCWR1cmNoIGVpbmVuIFdlcnQgZ2V0ZWlsdCwgZGVyIHNpY2ggYXVzIGRlciBWZXJ3ZWlsZGF1ZXIgZGVzCisJQW5ncmVpZmVycyBpbSBSYXVtIGVyZ2lidCAoYmlzIHp1IDMgU2VrdW5kZW4pLgorCURhIG1hbmNoZSBOUENzIHNvIGtvbnplcHRpb25pZXJ0IHd1cmRlbiwgZGFzcyBtYW4gc2llIG51ciBtaXQgZGVyCisJZXJ3YWVobnRlbiBUYWt0aWsgdG9ldGVuIGthbm4sIGthbm4gbWFuIHNpZSBhdWNoIGV4cGxpeml0IGVybGF1YmVuCisJKG1hbmNoZSBOUENzIHZlcndlbmRlbiBhdWNoIGVpZ2VuZSBNZXRob2RlbiwgZGllc2UgVGFrdGlrIHp1CisJIHZlcmJpZXRlbiwgdW5kIHNpZSB3YWVyZSBkYW5uIGRvcHBlbHQgYWJnZWZhbmdlbikuCisJSGllcnp1IHNldHp0IG1hbiBlaW5mYWNoIGRpZSBQcm9wZXJ0eSBQX0VOQUJMRV9JTl9BVFRBQ0tfT1VUIGltIE5QQy4KKworQkVJU1BJRUw6CisJRGFzIGZvbGdlbmRlIEJlaXNwaWVsIGVybGF1YnQgZWluZmFjaCBtYWwgZGllIGFuZ2VzcHJvY2hlbmUgVGFrdGlrOgorCSAgdm9pZCBjcmVhdGUoKQorCSAgeyAuLi4KKwkgICAgU2V0UHJvcChQX0VOQUJMRV9JTl9BVFRBQ0tfT1VULDEpOworCSAgICAuLi4KKwkgIH0KKwlKZXR6dCBrYW5uIG1hbiBkZW4gTlBDIG1pdCBSZWluLUFuZ3JpZmYtUmF1cyBhdWNoIHdpcmt1bmdzdm9sbAorCWJla2FlbXBmZW4uCisKK1NJRUhFIEFVQ0g6CisJZG9fZGFtYWdlKCksIFBfTEFTVF9NT1ZFLCAvc3RkL2xpdmluZy9saWZlLmMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFNhdCBKYW4gMzAgMTI6NTM6MDAgMTk5OSBieSBQYXRyeW4KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0VORU1ZX0RBTUFHRSBiL2RvYy9wcm9wcy9QX0VORU1ZX0RBTUFHRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTYzMzlkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfRU5FTVlfREFNQUdFCkBAIC0wLDAgKzEsMzEgQEAKK1BfRU5FTVlfREFNQUdFCisKK05BTUU6CisgICAgIFBfRU5FTVlfREFNQUdFICJlbmVteV9kYW1hZ2UiCisKK0RFRklOSUVSVCBJTjoKKyAgICAgPGxpdmluZy9saWZlLmg+CisKK0JFU0NIUkVJQlVORzoKKyAgICAgSW4gZGllc2VyIFByb3BlcnR5IGlzdCB2ZXJtZXJrdCwgd2VsY2hlcyBXZXNlbiBkaWVzZW0gV2VzZW4gd2lldmllbAorICAgICBTY2hhZGVuIHp1Z2VmdWVndCBoYXQuCisKKyAgICAgRGllIFByb3BlcnR5IGVudGhhZWx0IGVpbiBNYXBwaW5nLCBkYXMgZGVuIEFuZ3JlaWZlcm4gZGVuCisgICAgIGVycmVjaHRlbiBTY2hhZGVuIHp1b3JkbmV0OgorICAgICAoWyA8b2JuYW1lMT46IDxkYW1hZ2U+OyA8b3duZXI+LCAuLi4gXSkKKworICAgICAgIDxvYm5hbWUxPjogTmFtZSBkZXMgT2JqZWt0cywgZGFzIGRlbiBTY2hhZGVuIHZlcnVyc2FjaHQgaGF0IChzdHJpbmcpLAorICAgICAgICAgICAgICAgICAgei5CLiAiL21hZ2llcjp6ZXNzdHJhIgorICAgICAgIDxkYW1hZ2U+IDogU2NoYWRlbnNtZW5nZSAoaW50KQorICAgICAgIDxvd25lcj4gIDogd2VubiBkYXMgc2NoYWRlbnN2ZXJ1cnNhY2hlbmRlIFdlc2VuIGVpbiBOUEMgd2FyL2lzdCwKKyAgICAgICAgICAgICAgICAgIHdlbGNoZXMgUF9IRUxQRVJfTlBDIGdlc2V0enQgaGF0dGUgdW5kIHNvbWl0IGVpbmVtIFNwaWVsZXIKKyAgICAgICAgICAgICAgICAgIGhpbGZ0LCBzdGVodCBoaWVyIGRhcyBPYmpla3QgZGVzIGpld2VpbGlnZW4gU3BpZWxlcnMKKyAgICAgICAgICAgICAgICAgIChvYmplY3QpCisKK0JFTUVSS1VOR0VOOgorICAgICBEaWVzZSBQcm9wZXJ0eSBsYWVzc3Qgc2ljaCBudXIgYWJmcmFnZW4hCisKK1NJRUhFIEFVQ0g6CisgICAgIFBfSEVMUEVSX05QQworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMjYuMTAuMjAwOSwgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfRU5FTVlfREVBVEhfU0VRVUVOQ0UgYi9kb2MvcHJvcHMvUF9FTkVNWV9ERUFUSF9TRVFVRU5DRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjBkMzI1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfRU5FTVlfREVBVEhfU0VRVUVOQ0UKQEAgLTAsMCArMSw0NCBAQAorUF9FTkVNWV9ERUFUSF9TRVFVRU5DRQorCitOQU1FOgorICAgICBQX0VORU1ZX0RFQVRIX1NFUVVFTkNFICAgICAgICAiZW5lbXlfZGVhdGhfc2VxdWVuY2UiCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N5cy9saXZpbmcvY29tYmF0LmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBVZWJlciBkaWVzZSBQcm9wZXJ0eSBrYW5uIEVpbmZsdXNzIGF1ZiBkaWUgVG9kZXNzZXF1ZW56IGVpbmVzIGdldG9ldGVuCisgICAgIFNwaWVsZXJzIGdlbm9tbWVuIHdlcmRlbi4gU2llIG11c3MgaW0gdG9ldGVuZGVuIE9iamVrdCwgZC5oLiBkZW0KKyAgICAgT2JqZWt0IHdlbGNoZXMgZGllKCkvZG9fZGFtYWdlKCkvRGVmZW5kKCkgaW0gU3BpZWxlciBnZXJ1ZmVuIGhhdCwKKyAgICAgZ2VzZXR6dCBzZWluLgorCisgICAgIEVzIGdpYnQgZm9sZ2VuZGUgZ3VlbHRpZ2UgV2VydGU6CisgICAgIC0gc3RyaW5nOiBQZmFkIHp1IGVpbmVyIGVpZ2VuZW4gVG9kZXNzZXF1ZW56IGltIGd1ZWx0aWdlbiBGb3JtYXQKKyAgICAgLSBtaXhlZCogIEVpbmUgVG9kZXNzZXF1ZW56IGltIEZvcm1hdCBkZXMgVG9kZXNyYXVtZXM6CisgICAgICAgICAgICAgICAoezxpbnQgZ2VzYW10bGFlbmdlPiwKKyAgICAgICAgICAgICAgICAgKFs8aW50IGluZGV4MT46IDxzdHJpbmcgdW1nZWJyb2NoZW5lIE1lbGR1bmcxPiwKKyAgICAgICAgICAgICAgICAgICA8aW50IGluZGV4Mj46IDxzdHJpbmcgdW1nZWJyb2NoZW5lIE1lbGR1bmcyPiwKKyAgICAgICAgICAgICAgICAgICAuLi5dKQorICAgICAgICAgICAgICAgfSkKKyAgICAgLSBtYXBwaW5nIEluIGRpZSBTdGFuZGFyZC1MYXJzLVRvZGVzc2VxdWVueiBlaW56dWZ1ZWdlbmRlIFplaWxlbjoKKyAgICAgICAgICAgICAgIChbPGludCB6ZWl0aW5kZXg+OiA8c3RyaW5nIHVtZ2Vicm9jaGVuZXIgVGV4dD5dKQorCitCRUlTUElFTEU6CisgICAgIC8vIFBmYWQgenUgZWluZXIgZWlnZW5lbiBEU1EKKyAgICAgU2V0UHJvcChQX0VORU1ZX0RFQVRIX1NFUVVFTkNFLCAgIi4uLi9wYXNzZW5kZV9kc3EudHh0Iik7CisKKyAgICAgLy8gZWlnZW5lIERTUSBpbSBUb2Rlc3JhdW1mb3JtYXQ6CisgICAgIFNldFByb3AoUF9FTkVNWV9ERUFUSF9TRVFVRU5DRSwKKyAgICAgICAgICAgICAoeyAyLCAoWzE6ICJEVSBMRVJOU1QgQVVTIERFSU5FTSBGRUhMRVIuXG4iXSl9KSk7CisKKyAgICAgLy8gRWluZnVlZ2VuIGVpbmVyIE1lbGR1bmcgKGRlcyBOUENzKSBpbiBkaWUgU3RhbmRhcmQtVG9kZXNzZXF1ZW56CisgICAgIFNldFByb3AoUF9FTkVNWV9ERUFUSF9TRVFVRU5DRSwKKyAgICAgICAgICAgICAoWzU6ICJEdSBob2Vyc3QgIituYW1lKFdFTikrIiBob2VobmlzY2gga2ljaGVybi5cbiJdKSk7CisKK1NJRUhFIEFVQ0g6CisgICAgIFRvZDogICAgICAgICAgICBkaWUoTCkKKyAgICAgVG9kZXNtZWxkdW5nZW46IFBfS0lMTF9OQU1FLCBQX0tJTExfTVNHLCBQX0RJRV9NU0csIFBfTVVSREVSX01TRworICAgICAgICAgICAgICAgICAgICAgUF9aQVBfTVNHLCBQX05FWFRfREVBVEhfU0VRVUVOQ0UKKyAgICAgU29uc3RpZ2VzOiAgICAgIFBfQ09SUFNFLCBQX05PQ09SUFNFLCAvcm9vbS9kZWF0aC9kZWF0aF9yb29tLmMKKworMTAuIE5vdiAyMDExIEdsb2luc29uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfRU5URVJDTURTIGIvZG9jL3Byb3BzL1BfRU5URVJDTURTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmN2UzZDkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9FTlRFUkNNRFMKQEAgLTAsMCArMSwzMyBAQAorTkFNRToKKyAgICBQX0VOVEVSQ01EUyAgICAgICAgICAgICAgICAgICAibGVhdmVjbWRzIiAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvdHJhbnNwb3J0LmgKKworQkVTQ0hSRUlCVU5HOgorICAgIEVpbiBBcnJheSBtaXQgQmVmZWhsZW4sIGRpZSB6dW0gQmV0cmV0ZW4gZGVzIFRyYW5zcG9ydGVycyBmdWVocmVuLiAKKworQkVJU1BJRUw6CisgICAgU2V0UHJvcChQX0VOVEVSQ01EUywoeyAiYmV0cmV0ZSIsImJldHJpdHQiIH0pICk7CisKKyAgICBHaWJ0IGRlciBTcGllbGVyIG51biAnYmV0cmV0ZSB4eHgnIGVpbiwgc28gc29yZ3QgL3N0ZC90cmFuc3BvcnQuYyAKKyAgICBkYWZ1ZXIsIGRhcyBkZXIgU3BpZWxlciBhdWNoIGF1ZiBvZGVyIGluIGRlbiBUcmFuc3BvcnRlciBiZXdlZ3QgCisgICAgd2lyZC4gVm9yYXVzZ2VzZXR6dCBuYXR1ZXJsaWNoLCBlciBpc3QgYW4gZWluZW0gSGFsdGVwdW5rdCBhbmdlLQorICAgIGxhbmd0IHVuZCBlcyBpc3QgZ2VudWVnZW5kIFBsYXR6IGRvcnQuCisKK0JFTUVSS1VOR0VOOgorICAgIFVtIC9zdGQvdHJhbnNwb3J0LmMgbmljaHQgYXVmenVibGFlaGVuLCB3ZXJkZW4gd2VpdGVyZSBBcmd1bWVudGUgd2llCisgICAgZXR3YSAnYmV0cmV0ZSBkYXN8ZGllfGRlbiB4eHgnIF9uaWNodF8gdW50ZXJzdHVldHp0IQorCisgICAgSGllciBtdXNzIGRlciB2ZXJhbnR3b3J0bGljaGUgTWFnaWVyIHNjaG9uIGVpbmUgZWlnZW5lIExvZXN1bmcgZmluZGVuCisgICAgdW5kIGluIHNlaW5lbiBUcmFuc3BvcnRlciBzY2hyZWliZW4uCisKKyAgICBTb2xsZW4gS29tbWFuZG9zIHp1bSBCZXRyZXRlbiBVTkQgVmVybGFzc2VuIGVpbmVzIFRyYW5zcG9ydGVycyB2ZXItCisgICAgd2VuZGV0IHdlcmRlbiBrb2VubmVuLCBtdWVzc2VuIGRpZXNlIGluIFBfVFJBVkVMX0NNRFMgZ2VzZXR6dCB3ZXJkZW4uCisKK1NJRUhFIEFVQ0g6CisgICAgUF9MRUFWRUZBSUwsIFBfRU5URVJGQUlMLCBQX0xFQVZFQ01EUywgUF9UUkFWRUxfQ01EUywgdHJhbnNwb3J0ZXIsCisKK0xFVFpURSBBRU5ERVJVTkc6CisgICAgRG9uLCAyNC4wMS4yMDAyLCAxMDoxNTowN2ggdm9uIFRpbGx5CisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfRU5URVJGQUlMIGIvZG9jL3Byb3BzL1BfRU5URVJGQUlMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlY2QxZTYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9FTlRFUkZBSUwKQEAgLTAsMCArMSwyNCBAQAorTkFNRToKKyAgICBQX0VOVEVSRkFJTCAgICAgICAgICAgICAgICAgICAiZW50ZXJmYWlsIiAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvdHJhbnNwb3J0LmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBNZWxkdW5nIGFuIGRlbiBTcGllbGVyLCB3ZW5uIGVyIGVpbmVuIHZvbGxlbiBUcmFuc3BvcnRlciBiZXRyZXRlbiAKKyAgICAgd2lsbC4gSXN0IGRpZSBQcm9wZXJ0aWUgZWluIEFycmF5LCBzbyB3aXJkIGRhcyBlcnN0ZSBFbGVtZW50IGFscworICAgICBNZWxkdW5nIGFuIGRlbiBTcGllbGVyLCBkYXMgendlaXRlIGFscyBNZWxkdW5nIGFuIGRpZSBNaXRzcGllbGVyIAorICAgICBpbSBSYXVtIGdlc2NoaWNrdC4KKworQkVJU1BJRUw6CisgICAgIFNldFByb3AoUF9FTlRFUkZBSUwsIkRvcnQgaXN0IHdpcmtsaWNoIGtlaW4gUGxhdHogbWVociBmdWVyIERpY2giKTsKKyAgICAgCisgICAgIFNldFByb3AoUF9FTlRFUkZBSUwsICh7ICJEb3J0IGlzdCB3aXJrbGljaCBrZWluIFBsYXR6IG1laHIgZnVlciBEaWNoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZlcnN1Y2h0LCBhdWYgZGllIEt1dHNjaGUgenUga2xldHRlcm4sIHdpcmQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiYWJlciB3aWVkZXIgaGVydW50ZXJnZXNjaGlja3QiIH0pICk7CisKK1NJRUhFIEFVQ0g6CisgICAgIFBfRU5URVJNU0csIFBfTEVBVkVGQUlMLCBQX0xFQVZFTVNHLCB0cmFuc3BvcnRlcgorCitMRVRaVEUgQUVOREVSVU5HOgorICAgIERvbiwgMjQuMDEuMjAwMiwgMTA6MTU6MDdoIHZvbiBUaWxseQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfRU5URVJNU0cgYi9kb2MvcHJvcHMvUF9FTlRFUk1TRwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTIxMjhlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfRU5URVJNU0cKQEAgLTAsMCArMSwxOCBAQAorTkFNRToKKyAgICBQX0VOVEVSTVNHICAgICAgICAgICAgICAgICAgICAiZW50ZXJtc2ciICAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvdHJhbnNwb3J0LmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBBcnJheSBtaXQgendlaSBNZWxkdW5nZW4sIGVpbmUgZnVlciBkZW4gUmF1bSwgZGVuIGRlciBTcGllbGVyCisgICAgIHZlcmxhZXNzdCwgdW5kIGVpbmUgZnVlciBkZW4gVHJhbnNwb3J0ZXIsIGluIGRlbiBlciBnZWh0LgorCitCRUlTUElFTDoKKyAgICAgU2V0UHJvcChQX0VOVEVSTVNHLCAoeyAia2xldHRlcnQgaW4gZGllIEt1dHNjaGUiLCJrbGV0dGVydCBoZXJlaW4iIH0pICk7CisKK1NJRUhFIEFVQ0g6CisgICAgIFBfRU5URVJGQUlMLCBQX0xFQVZFRkFJTCwgUF9MRUFWRU1TRywgdHJhbnNwb3J0ZXIKKworTEVUWlRFUiBBRU5ERVJVTkc6CisgICAgRG9uLCAyNC4wMS4yMDAyLCAxMDoxNTowN2ggdm9uIFRpbGx5CmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9FTlZfTVNHIGIvZG9jL3Byb3BzL1BfRU5WX01TRwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzllMmMxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfRU5WX01TRwpAQCAtMCwwICsxLDI2IEBACitOQU1FOgorICAgICBQX0VOVl9NU0cgICAgICAgICAgICAgICAgICAgICAic3RkX2Zvb2RfZW52X21zZyIKKworREVGSU5JRVJUIElOOgorICAgICA8c3lzL2Zvb2QuaD4KKworQkVTQ0hSRUlCVU5HOgorICAgICBNZWxkdW5nIGFuIGRlbiBLb25zdW1lbnRlbiwgd2VubiBlaW5lIFNwZWlzZSBrb25zdW1pZXJ0IHdlcmRlbiBzb2xsLAorICAgICBkaWUgbmljaHQgaW0gZWlnZW5lbiBJbnZlbnRvcnkgbGllZ3QuCisgICAgIFdlbm4gZGllc2UgUHJvcGVydHkgbGVlciBpc3QsIGthbm4gbWFuIGRpZSBTcGVpc2UgZGFubiBzb2dhcgorICAgICBrb25zdW1pZXJlbiEKKyAgICAgCitCRU1FUktVTkdFTjoKKyAgICAgRGllc2UgTWVsZHVuZyB3aXJkIHZvbiByZXBsYWNlX3BlcnNvbmFsIG1pdCBkZW4gQXJndW1lbnRlbjoKKyAgICAgMS4gU3BlaXNlCisgICAgIDIuIEtvbnN1bWVudAorICAgICB2ZXJhcmJlaXRldCwga2FubiBhbHMgZW50c3ByZWNoZW5kZSBQbGF0emhhbHRlciBlbnRoYWx0ZW4KKyAgICAgCitERUZBVUxUOgorICAgICAiVmllbGxlaWNodCBzb2xsdGVzdCBEdSBAV0VOMSB2b3JoZXIgbmVobWVuLiIKKworU0lFSEUgQVVDSDoKKyAgICAgd2l6L2Zvb2QsIHJlcGxhY2VfcGVyc29uYWwKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBUaHUgT2N0IDI4IDEyOjE1OjAwIDIwMTAgYnkgQ2FsZHJhClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfRU5WX1RPT19IRUFWWV9NU0cgYi9kb2MvcHJvcHMvUF9FTlZfVE9PX0hFQVZZX01TRwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzczYWMxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfRU5WX1RPT19IRUFWWV9NU0cKQEAgLTAsMCArMSwzMSBAQAorTkFNRToKKyAgICBQX0VOVl9UT09fSEVBVllfTVNHICAgICAgICAgICAgICAgICAgICAgICJlbnZfdG9vX2hlYXZ5X21zZyIgICAgICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3RoaW5nL21vdmluZy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGllc2UgUHJvcGVydHkgZW50aGFlbHQgZWluZSBNZWxkdW5nLCBkaWUgYXVzZ2VnZWJlbiB3aXJkLCB3ZW5uIGplbWFuZAorICAgICB2ZXJzdWNodCwgZWluIE9iamVrdCBpbiBlaW5lbiBCZWhhZWx0ZXIgenUgbGVnZW4sIHVuZCBkaWVzZXIgZGFubiBmdWVyCisgICAgIHNlaW4gRW52aXJvbm1lbnQgenUgc2Nod2VyIHdpcmQuCisgICAgIERpZSBQcm9wZXJ0eSBpc3QgaW0gQmVoYWVsdGVyIHp1IHNldHplbi4KKyAgICAgSXN0IGRpZXNlIFByb3BlcnR5IG5pY2h0IG9kZXIgYXVmIGVpbmVuIG5pY2h0LVN0cmluZy1XZXJ0IGdlc2V0enQsCisgICAgIHNvIHdpcmQgZGllIFN0YW5kYXJkbWVsZHVuZyBhdXNnZWdlYmVuLgorICAgICAoIjxCZWhhZWx0ZXI+IHd1ZXJkZSBkaXIgZGFubiB6dSBzY2h3ZXIgd2VyZGVuLiIpCisgICAgIERlciBTdHJpbmcgaW4gZGVyIFByb3BlcnR5IHdpcmQgbm9jaCBkdXJjaCByZXBsYWNlX3BlcnNvbmFsKCkKKyAgICAgdmVyYXJiZWl0ZXQsIGRhcyB6dSBiZXdlZ2VuZGUgT2JqZWt0IHdpcmQgYWxzIGVyc3RlcywgZGVyIEJlaGFlbHRlciBhbHMKKyAgICAgendlaXRlcyBPYmpla3QgYW5nZWdlYmVuLiBEYW5hY2ggd2lyZCBkZXIgU3RyaW5nIGF1ZiA3OCBaZWljaGVuCisgICAgIHVtZ2Vicm9jaGVuLgorICAgICBEYXMgU2V0emVuIGVpbmVzIGxlZXJlbiBTdHJpbmdzIHVudGVyZHJ1ZWNrdCBkaWUgQXVzZ2FiZSBlaW5lciBNZWxkdW5nCisgICAgIGdhbnouCisKK0JFSVNQSUVMRToKKyAgICAgU2V0UHJvcChQX0VOVl9UT09fSEVBVllfTVNHLCAiTWl0IEBXRU0xIGtvZW5udGVzdCBkdSBkZW4gUnVja3NhY2sgbmljaHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBtZWhyIHRyYWdlbi4iKTsKKworU0lFSEUgQVVDSDoKKyAgICAgQWVobmxpY2hlczogUF9UT09fSEVBVllfTVNHLCBQX1RPT19NQU5ZX01TRywgUF9OT0lOU0VSVF9NU0csCisgICAgICAgICAgICAgICAgIFBfTk9MRUFWRV9NU0csIFBfTk9EUk9QLCBQX05PR0VUIAorICAgICBFcmZvbGc6ICAgICBQX1BJQ0tfTVNHLCBQX0RST1BfTVNHLCBQX0dJVkVfTVNHLCBQX1BVVF9NU0csCisgICAgICAgICAgICAgICAgIFBfV0VBUl9NU0csIFBfV0lFTERfTVNHCisgICAgIFNvbnN0aWdlczogIHJlcGxhY2VfcGVyc29uYWwoRSksIC9zdGQvbGl2aW5nL3B1dF9hbmRfZ2V0LmMKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0VRVUlQX1RJTUUgYi9kb2MvcHJvcHMvUF9FUVVJUF9USU1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYjJmMzUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9FUVVJUF9USU1FCkBAIC0wLDAgKzEsMjYgQEAKK1BfRVFVSVBfVElNRQorCitOQU1FOgorICAgICAgUF9FUVVJUF9USU1FCQkJImVxdWlwX3RpbWUiCisKK0RFRklOSUVSVCBJTjoKKyAgICAgIC9zeXMvY29tYmF0LmgKKworQkVTQ0hSRUlCVU5HOgorICAgICAgSW5uZXJoYWxiIHZvbiBXYWZmZW4gdW5kIFJ1ZXN0dW5nZW4gd2lyZCBpbiBkaWVzZXIgUHJvcGVydHkNCisgICAgICByZWdpc3RyaWVydCwgd2FubiBkaWVzZSB6dWxldHp0IGdlenVlY2t0IGJ6dy4gYW5nZXpvZ2VuIHd1cmRlbi4KKyAgICAgIElubmVyaGFsYiBkZXIgRnVua3Rpb25lbiB3aWVsZF9tZSgpIGluICcvc3RkL3dlYXBvbi9jb21iYXQnIGJ6dy4NCisgICAgICBEb1dlYXIoKSBpbiAnL3N0ZC9hcm1vdXIvY29tYmF0JyB3aXJkIGhpZXJiZWkgamV3ZWlscyBmb2xnZW5kZSBBa3Rpb24NCisgICAgICBhdXNnZWZ1ZWhydDoKKwlTZXRQcm9wKFBfRVFVSVBfVElNRSx0aW1lKCkpOworCitTSUVIRSBBVUNIOgorICAgICAgVmVyd2FuZHQ6CQlQX0xBU1RfVVNFCisgICAgICBXYWZmZW46CQlQX1VOV0lFTERfVElNRQorCQkJRG9XaWVsZCgpCisgICAgICBSdWVzdHVuZ2VuOglEb1dlYXIoKQorICAgICAgU29uc3RpZ2VzOgl0aW1lKCkKKwkJCS9zdGQvd2VhcG9uL2NvbWJhdC5jLCAvc3RkL2FybW91ci9jb21iYXQuYworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBTdW4gSnVsIDI2IDIzOjU5OjEyIDE5OTggYnkgUGF0cnluCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9FVkFMX0ZBQ1RPUlMgYi9kb2MvcHJvcHMvUF9FVkFMX0ZBQ1RPUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRlODgxZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0VWQUxfRkFDVE9SUwpAQCAtMCwwICsxLDggQEAKK05BTUU6CisgICAgUF9FVkFMX0ZBQ1RPUlMgICAgICAgICAgICAgICAgImlucGNfZXZhbF9mYWN0b3JzIiAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL2lucGMvZXZhbC5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAqKiogS0VJTkUgQkVTQ0hSRUlCVU5HIFZPUkhBTkRFTiAqKioKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0VWQUxfT0ZGU0VUUyBiL2RvYy9wcm9wcy9QX0VWQUxfT0ZGU0VUUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODJlZjM5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfRVZBTF9PRkZTRVRTCkBAIC0wLDAgKzEsOCBAQAorTkFNRToKKyAgICBQX0VWQUxfT0ZGU0VUUyAgICAgICAgICAgICAgICAiaW5wY19ldmFsX29mZnNldHMiICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvaW5wYy9ldmFsLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICoqKiBLRUlORSBCRVNDSFJFSUJVTkcgVk9SSEFOREVOICoqKgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfRVhJVFMgYi9kb2MvcHJvcHMvUF9FWElUUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjM4NTZmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfRVhJVFMKQEAgLTAsMCArMSw5IEBACitOQU1FOgorICAgIFBfRVhJVFMgICAgICAgICAgICAgICAgICAgICAgICJleGl0cyIgICAgICAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9wcm9wZXJ0aWVzLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBNYXBwaW5nIGFsbGVyIHVubWl0dGVsYmFyIHNpY2h0YmFyZW4gQXVzZ2FlbmdlIG1pdCB6dWdlaG9lcmlnZW4KKyAgICAgTmFjaGJhcnJhZXVtZW4uIFNvbGx0ZSBudXIgbWl0dGVscyBBZGRFeGl0KCkgYmVudXR6dCB3ZXJkZW4uCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9GQU8gYi9kb2MvcHJvcHMvUF9GQU8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJmMzNlMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0ZBTwpAQCAtMCwwICsxLDE5IEBACitQX0ZBTworCitOQU1FOgorICAgICBQX0ZBTyAgICAgICJmcmF0ZXJuaXRhc2Rvbm9hcmNobWFnb3J1bSIKKworREVGSU5JRVJUIElOOgorICAgICA8cGxheWVyL2Zhby5oPgorCitCRVNDSFJFSUJVTkc6CisgICAgIEZyYXRlcm5pdGFzLXJlbGV2YW50ZSBQcm9wZXJ0eS4KKworICAgICBHZW5hdWUgSW5mb3JtYXRpb25lbiB1bmJla2FubnQuCisgICAgIFNjaHJlaWJlbmRlciBadWdyaWZmIGlzdCBudXIgRU1zIG9kZXIgZGVtIEZBT01BU1RFUiAocy4gSGVhZGVyZmlsZSkKKyAgICAgbW9lZ2xpY2guCisKK1NJRUhFIEFVQ0g6CisgICAgIFBfRkFPX1BPUlRBTFMKKworMS5TZXB0ZW1iZXIgMjAwOCBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfRkFPX1BPUlRBTFMgYi9kb2MvcHJvcHMvUF9GQU9fUE9SVEFMUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjU3NTBhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfRkFPX1BPUlRBTFMKQEAgLTAsMCArMSwyMiBAQAorUF9GQU9fUE9SVEFMUworCitOQU1FOgorICAgICBQX0ZBT19QT1JUQUxTICAgICAgImZyYXRlcm5pdGFzZG9ub2FyY2htYWdvcnVtUE9SVEFMUyIKKworREVGSU5JRVJUIElOOgorICAgICA8cGxheWVyL2Zhby5oPgorCitCRVNDSFJFSUJVTkc6CisgICAgIEZyYXRlcm5pdGFzLXJlbGV2YW50ZSBQcm9wZXJ0eS4KKworICAgICBFbnRoYWVsdCBlaW5lIEFycmF5IG1pdCBlaW5lciBMaXN0ZSBkZXIgdWViZXIgZGllIEZyYXRlcm5pdGFzCisgICAgIGdlZnVuZGVuZW4gdW5kIGJlbnV0emJhcmVuIFNlaGVyLVBvcnRhbGUuCisKKyAgICAgR2VuYXVlIEluZm9ybWF0aW9uZW4gdW5iZWthbm50LgorICAgICBTY2hyZWliZW5kZXIgWnVncmlmZiBpc3QgbnVyIEVNcyBvZGVyIGRlbSBGQU9NQVNURVIgKHMuIEhlYWRlcmZpbGUpIAorICAgICBtb2VnbGljaC4KKworU0lFSEUgQVVDSDoKKyAgICAgUF9GQU9fUE9SVEFMUywgUF9TRUVSRE9PUlMKKyAgICAgCisxLlNlcHRlbWJlciAyMDA4IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9GSVNIIGIvZG9jL3Byb3BzL1BfRklTSApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjk0YzA5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfRklTSApAQCAtMCwwICsxLDc1IEBACitOQU1FOgorICAgIFBfRklTSCAgICAgICAgICAgICAgICAgICAgICAgICJmaXNoIgorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9maXNoaW5nLmgKKworQkVTQ0hSRUlCVU5HOgorICAgIEVudGhhZWx0IEVpbnN0ZWxsdW5nZW4genUgYWxsZW0sIHdhcyBtaXQgRmlzY2hlbiB6dSB0dW4gaGF0LiAKKyAgICBLYW5uIGluIEZpc2NoZW4sIFJhZXVtZW4gdW5kIEtvZWRlcm4gZ2VzZXR6dCB3ZXJkZW4uIERpZSB2ZXJmdWVnYmFyZW4gCisgICAgT3B0aW9uZW4gdW5kIEZ1bmt0aW9uc3dlaXNlbiBzaW5kIGluIGRlbiBuYWNoZm9sZ2VuZGVuIEFic2Nobml0dGVuIAorICAgIGF1ZmdlZnVlaHJ0LgorCisgICAgRmlzY2hlOgorICAgICoqKioqKioKKyAgICBEaWUgUHJvcGVydHkgbGVndCB6dXNhZXR6bGljaGUgRWlnZW5zY2hhZnRlbiBmZXN0OgorCisgICAgICBGX05PUk9UVEVOCisgICAgICAgIEZpc2NoIGZhdWx0IG5pY2h0OyBnZ2YuIHNvbGx0ZSBoaWVyIGF1Y2ggZ2xlaWNoIEZfTk9IRUFMIGdlc2V0enQgCisgICAgICAgIHdlcmRlbiwgd2VpbCBzb25zdCBlaW5lIHVudmVyZGVyYmxpY2hlIHRyYWdiYXJlIFRhbmtlIGVyemV1Z3Qgd3VlcmRlLgorICAgICAgRl9OT1RIVU5HUlkKKyAgICAgICAgRmlzY2ggZnJpc3N0IEtvZWRlciBudXIsIHdlbm4gZXIgYXVjaCB3aXJrbGljaCBuYWNoaGVyIGFuIGRlciBBbmdlbAorICAgICAgICBoYWVuZ3QuIElzdCBlciB6dSBzY2h3ZXIgZnVlciBkaWUgQW5nZWwgdW5kIHJlaXNzdCBhYiwgYmxlaWJ0IGRlcgorICAgICAgICBLb2VkZXIgZXJoYWx0ZW4uCisgICAgICBGX1JFUExBQ0UKKyAgICAgICAgRmlzY2ggc29sbCBzaWNoIGJlaW0gRW50ZmVybmVuIHZvbiBkZXIgQW5nZWwgdmVyd2FuZGVsbi4gSGllcnp1IGlzdAorICAgICAgICBkaWUgRnVua3Rpb24gUmVwbGFjZUZpc2goKSBpbSBGaXNjaCB6dSBkZWZpbmllcmVuLCBkaWUgc2ljaCB1bSBkaWUKKyAgICAgICAgVmVyd2FuZGx1bmcga3VlbW1lcnQgKHouQi4gTW9uc3RlciBjbG9uZW4gdW5kIEZpc2NoIHplcnN0b2VyZW47IGVpbgorICAgICAgICBCZWlzcGllbCBmaW5kZXQgc2ljaCBpbiAvZC9lYmVuZS9mcmFnZ2xlL2FuZ2VsMi9vYmovc2FlZ2VmaXNjaC5jKS4KKyAgICAgIEZfTk9IRUFMCisgICAgICAgIEZpc2NoIGhlaWx0IG5pY2h0IGJlaSBWZXJ6ZWhyCisKKyAgICBSYXVtIChPUFRJT05BTCk6CisgICAgKioqKioqKioqKioqKioqKgorICAgIExlZ3QgZGllIEZpc2NoZGljaHRlIGRlcyBHZXdhZXNzZXJzIGZlc3QuIERlciBlaW5nZXN0ZWxsdGUgV2VydCB3aXJrdCAKKyAgICBzaWNoIGF1ZiBkaWUgV2FydGV6ZWl0IGF1cywgZGllIGRlciBBbmdsZXIgdmVyYnJpbmdlbiBtdXNzLCBiaXMgZWluIAorICAgIEZpc2NoIGFuYmVpc3N0LiBCZXJlY2hudW5nIGltIERldGFpbCAoYWxsZSBaYWhsZW53ZXJ0ZSBpbiBTZWt1bmRlbik6CisgICAgLSBCYXNpcy1XYXJ0ZXplaXQ6IGRlbGF5ID0gODAKKyAgICAtIERpZSBXZXJ0ZSB2b24gUF9GSVNIIHZvbiBSYXVtIHVuZCBLb2VkZXIgd2VyZGVuIGFkZGllcnQ6CisgICAgICBzdW1tZSA9IHJhdW0tPlF1ZXJ5UHJvcChQX0ZJU0gpICsga29lZGVyLT5RdWVyeVByb3AoUF9GSVNIKQorICAgICAgLT4gcG9zaXRpdmUgV2VydGUgKEJvbnVzKSB3ZXJkZW4gYXVmIDYwIGJlZ3Jlbnp0IHVuZCBtaXQgWnVmYWxscy0KKyAgICAgICAgIGtvbXBvbmVudGUgdm9uIDxkZWxheT4gYWJnZXpvZ2VuOgorICAgICAgICAgZGVsYXkgLT0gcmFuZG9tKHN1bW1lKQorICAgICAgLT4gbmVnYXRpdmUgV2VydGUgKE1hbHVzKSB3ZXJkZW4gYXVmIC0zMDAgYmVncmVuenQgdW5kIG1pdCBadWZhbGxzLQorICAgICAgICAga29tcG9uZW50ZSBhdWYgPGRlbGF5PiBhdWZnZXNjaGxhZ2VuOgorICAgICAgICAgZGVsYXkgKz0gcmFuZG9tKC1zdW1tZSkKKworICAgIFp1c2FldHpsaWNoIHdpcmQgZWluIHdlaXRlcmVyIE1hbHVzIGF1ZiBkaWUgV2FydGV6ZWl0IGZhZWxsaWcsIGZhbGxzIAorICAgIFBfV0FURVIgaW4gZGVyIEFuZ2VsIHVuZC9vZGVyIFBfV0FURVIgaW0gS29lZGVyIG5pY2h0IHp1bSBha3R1ZWxsZW4gCisgICAgR2V3YWVzc2VyIHBhc3Nlbi4gRGVyIE1hbHVzIGJldHJhZWd0IGpld2VpbHMgNjArcmFuZG9tKDYwKSBTZWt1bmRlbi4KKyAgICAKKyAgICBEZXIgU3RhbmRhcmR3ZXJ0IGZ1ZXIgUF9GSVNIIGltIFJhdW0gaXN0IDAgdW5kIGJlZGV1dGV0IDEwMCAlIEJlc3RhbmQuCisgICAgUG9zaXRpdmUgV2VydGUgZXJob2VoZW4gZGllIERpY2h0ZSwgbmVnYXRpdmUgc2Vua2VuIHNpZS4gUG9zaXRpdmUgV2VydGUgCisgICAgc29sbHRlbiBuaWNodCA+MTAwIHNlaW4uCisKKyAgICBTb2Zlcm4gc2ljaCBkaWUgV2VydGUgZnVlciBQX0ZJU0ggaW4gZGVuIGVtcGZvaGxlbmVuIEdyZW56ZW4gYmV3ZWdlbiwKKyAgICBrb2VubmVuIEFienVlZ2UgZnVlciBmYWxzY2hlcyBHZXdhZXNzZXIgdWVibGljaGVyd2Vpc2Uga2F1bSBkdXJjaAorICAgIEJvbmkgYXVmIEFuZ2VsIG9kZXIgS29lZGVyIGtvbXBlbnNpZXJ0IHdlcmRlbi4gQXVzc2VyZGVtIGlzdCB6dQorICAgIGJlZGVua2VuLCBkYXNzIGVzIGtlaW5lIEJvbmkgZnVlciByaWNodGlnZSBHZXdhZXNzZXJ3YWhsIGdpYnQuCisgCisKKyAgICBLb2VkZXIgKE9QVElPTkFMKToKKyAgICAqKioqKioqKioqKioqKioqKioKKyAgICBFaW4gS29lZGVyIGthbm4gbWl0dGVscyBQX0ZJU0ggZGllIEZpc2NoZGljaHRlIG1vZGlmaXppZXJlbiwgdW0gaGllcnVlYmVyCisgICAgZWluIGJlc3NlcmVzIEJlaXNzZW4gZGVyIEZpc2NoZSB6dSBzaW11bGllcmVuIChyZWR1emllcnQgZGllIFdhcnRlemVpdAorICAgIGJlaW0gQW5nZWxuLCBzaWVoZSBvYmVuIHVudGVyICJSYXVtIikuIFdlbm4gYWxzbyBkZXIgUmF1bSBlaW5lbiBXZXJ0CisgICAgdm9uIC0xMDAgZ2VzZXR6dCBoYXQgdW5kIGRlciBLb2VkZXIgKzEwMCwgZW50c3ByaWNodCBkaWUgRmlzY2hkaWNodGUgaW0gCisgICAgR2V3YWVzc2VyIHdpZWRlciBkZW0gTm9ybWFsd2VydC4KKworU0lFSEUgQVVDSDoKKworICAgIFByb3BlcnRpZXM6IFBfV0FURVIKKyAgICBNZXRob2RlbjogICBHZXRBcXVhcml1bShMKQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1p1bGV0enQgZ2VhZW5kZXJ0OiAyMDE0LUF1Zy0yMSwgQXJhdGhvcm4KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0ZMQUdTIGIvZG9jL3Byb3BzL1BfRkxBR1MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M1NGFlYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0ZMQUdTCkBAIC0wLDAgKzEsOCBAQAorTkFNRToKKyAgICBQX0ZMQUdTICAgICAgICAgICAgICAgICAgICAgICAiY2FuX2ZsYWdzIiAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcGxheWVyL2Jhc2UuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIEZsYWdzIGRlcyBTcGllbGVycwpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfRk9MTE9XX1NJTEVOVCBiL2RvYy9wcm9wcy9QX0ZPTExPV19TSUxFTlQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY2MmFkMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0ZPTExPV19TSUxFTlQKQEAgLTAsMCArMSw5IEBACitOQU1FOgorICAgIFBfRk9MTE9XX1NJTEVOVCAgICAgICAgICAgICAgICJmb2xsb3dfc2lsZW50IiAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9wbGF5ZXIvYmFzZS5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgV2VubiBkaWVzZSBQcm9wZXJ0eSAxIGlzdCwgd2lyZCBkZXIgTU9WRSB2b20gdmVyZm9sZ2UgU2lsZW50IGF1c2dlLQorICAgICBmdWVocnQuCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9GT09EIGIvZG9jL3Byb3BzL1BfRk9PRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Njk2OTRmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfRk9PRApAQCAtMCwwICsxLDI0IEBACitOQU1FOgorICAgICBQX0ZPT0QgICAgICAgICAgICAgICAgICAgICAgICAiZm9vZCIKKworREVGSU5JRVJUIElOOgorICAgICAvc3lzL2xpdmluZy9saWZlLmgKKworQkVTQ0hSRUlCVU5HOgorCisgICAgIC0gTGViZXdlc2VuCisgICAgICAgTnVtZXJpc2NoZXIgV2VydCBmdWVyIGRlbiBTYWV0dGlndW5nc2dyYWQgZWluZXMgTGViZXdlc2Vucy4KKyAgICAgICBEZXIgbWF4aW1hbGUgV2VydCBzdGVodCBpbiBQX01BWF9GT09ELgorCisgICAgIC0gU3BlaXNlbi9LbmVpcGVuCisgICAgICAgTnVtZXJpc2NoZXIgV2VydCBmdWVyIGRlbiBTYWV0dGlndW5nc2dyYWQgZWluZXIgUG9ydGlvbiBlaW5lcgorICAgICAgIFNwZWlzZS4gSXN0IGRpZXNlIFByb3BlcnR5IG5pY2h0IGdlc2V0enQsIGthbm4gbWFuIGRpZXNlCisgICAgICAgU3BlaXNlIG5pY2h0IGVzc2VuLiBFaW5lIGZ1bmt0aW9uaWVyZW5kZSBTcGVpc2UgX211c3NfIGVudHdlZGVyCisgICAgICAgUF9GT09EIG9kZXIgUF9EUklOSyBncm9lc3NlciAwIGdlc2V0enQgaGFiZW4uCisKK1NJRUhFIEFVQ0g6CisgICAgIFBfTUFYX0ZPT0QsIFBfRk9PRF9ERUxBWSwgY29uc3VtZSwKKyAgICAgUF9EUklOSywgUF9BTENPSE9MLCB3aXovZm9vZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFRodSBPY3QgMjggMTI6MTU6MDAgMjAxMCBieSBDYWxkcmEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9GT09EX0RFTEFZIGIvZG9jL3Byb3BzL1BfRk9PRF9ERUxBWQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWNjZjZlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfRk9PRF9ERUxBWQpAQCAtMCwwICsxLDEwIEBACitOQU1FOgorICAgIFBfRk9PRF9ERUxBWSAgICAgICAgICAgICAgICAgImZvb2RfZGVsYXkiICAgICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL2xpdmluZy9saWZlLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBBbnphaGwgZGVyIGhlYXJ0X2JlYXRzLCBiaXMgUF9GT09EIHVtIGVpbmVuIFB1bmt0IHNpbmt0LgorICAgICBBZW5kZXJ1bmdlbiBkaWVzZXIgUHJvcGVydHkgaW4gU3BpZWxlcm4gYmVkdWVyZmVuIGRlciAKKyAgICAgR2VuZWhtaWd1bmcgZGVzIEVNIGZ1ZXIgQmFsYW5jZS4KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0ZPT0RfRlVMTF9NU0cgYi9kb2MvcHJvcHMvUF9GT09EX0ZVTExfTVNHCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMzFlYzUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9GT09EX0ZVTExfTVNHCkBAIC0wLDAgKzEsMjQgQEAKK05BTUU6CisgICAgIFBfRk9PRF9GVUxMX01TRyAgICAgICAgICAgICAgICJzdGRfZm9vZF9mdWxsX21zZyIKKworREVGSU5JRVJUIElOOgorICAgICA8c3lzL2Zvb2QuaD4KKworQkVTQ0hSRUlCVU5HOgorICAgICBNZWxkdW5nIGFuIGRlbiBLb25zdW1lbnRlbiwgd2VubiBlaW5lIFNwZWlzZSBnZWdlc3NlbiB3ZXJkZW4gc29sbCwKKyAgICAgb2J3b2hsIGRpZXNlciBuaWNodHMgbWVociBlc3NlbiBrYW5uLgorICAgICAKK0JFTUVSS1VOR0VOOgorICAgICBEaWVzZSBNZWxkdW5nIHdpcmQgdm9uIHJlcGxhY2VfcGVyc29uYWwgbWl0IGRlbiBBcmd1bWVudGVuOgorICAgICAxLiBTcGVpc2UKKyAgICAgMi4gS29uc3VtZW50CisgICAgIHZlcmFyYmVpdGV0LCBrYW5uIGFscyBlbnRzcHJlY2hlbmRlIFBsYXR6aGFsdGVyIGVudGhhbHRlbgorICAgICAKK0RFRkFVTFQ6CisgICAgICJEdSBiaXN0IHp1IHNhdHQsIGRhcyBzY2hhZmZzdCBEdSBuaWNodCBtZWhyLiIKKworU0lFSEUgQVVDSDoKKyAgICAgUF9GT09ELCBQX01BWF9GT09ELCB3aXovZm9vZCwgcmVwbGFjZV9wZXJzb25hbAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFRodSBPY3QgMjggMTI6MTU6MDAgMjAxMCBieSBDYWxkcmEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9GT1JDRV9NVVJERVJfTVNHIGIvZG9jL3Byb3BzL1BfRk9SQ0VfTVVSREVSX01TRwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjAxNTdjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfRk9SQ0VfTVVSREVSX01TRwpAQCAtMCwwICsxLDM5IEBACitOQU1FOgorCVBfRk9SQ0VfTVVSREVSX01TRwkJImZvcmNlX211cmRlcl9tc2ciCisKK0RFRklOSUVSVCBJTjoKKwkvc3lzL3Byb3BlcnRpZXMuaAorCitCRVNDSFJFSUJVTkc6CisJT2IgZGVyIFRvZCBlaW5lcyBOUENzIGF1ZiBkZW0gTW9lcmRlci1LYW5hbCBlcnNjaGVpbnQsIGhhZW5ndCBkYXZvbgorCWFiLCB3aWUgb2Z0IHVuZCB3ZWxjaGUgQXJ0IHZvbiBOUENzIGluIGRlciBsZXR6dGVuIFplaXQgZ2V0b2V0ZXQKKwl3dXJkZW4uIFp1bSBCZWlzcGllbCBpc3QgZXMgZWhlciBzZWx0ZW4sIGRhc3MgZWluIHNjaHdhY2hlciBOUEMgYXVmCisJZGVtIEthbmFsIGVyc2NoZWludCwgd2VubiBrdWVyemxpY2ggdmllbGUgc3RhcmtlIE5QQ3MgZ2V0b2V0ZXQKKwl3dXJkZW4uIE1pdHRlbHMgZGVyIFByb3BlcnR5IFBfRk9SQ0VfTVVSREVSX01TRyBrYW5uIG1hbiBhdWYgZGllc2UKKwlSZWdlbHVuZyBFaW5mbHVzcyBuZWhtZW4uCisJRWluIFdlcnQgZ3JvZXNzZXIgTnVsbCBlcnp3aW5ndCBkaWUgTWVsZHVuZyBhdWYgZGVtIE1vZXJkZXItS2FuYWwsCisJZWluIFdlcnQga2xlaW5lciBOdWxsIHVudGVyZHJ1ZWNrdCBzaWUgZ2VuZXJlbGwuIExldHp0ZXJlcyBpc3QKKwlpbnNiZXNvbmRlcmUgZnVlciBhbGx6dW9mdCBnZXRvZXRldGUgTW9uc3RlciBzaW5udm9sbCwgdW0gZGVuCisJTW9lcmRlci1LYW5hbCBuaWNodCB1ZWJlcm1hZXNzaWcgenUgYmVsYXN0ZW4uIE1pdCBkZW0gRXJ6d2luZ2VuIGRlcgorCU1lbGR1bmdlbiBzb2xsdGUgbWFuIHNvbWl0IHZvcnNpY2h0aWcgc2VpbjogV2VuaWdlciBpc3Qgb2Z0bWFscworCWJlc3NlciBhbHMgenUgdmllbCEKKwlEaWUgRGVmYXVsdGVpbnN0ZWxsdW5nIHZvbiBQX0ZPUkNFX01VUkRFUl9NU0cgaXN0IG5hdHVlcmxpY2ggTnVsbAorCXVuZCBmdWVocnQgenVyIGJlcmVpdHMgYmVzY2hyaWViZW5lbiBvcGZlcmFiaGFlbmdpZ2VuIE1lbGR1bmcuCisKK0JFSVNQSUVMRToKKwlFaW4gZ3Jvc3NlciBzdGFya2VyIE5QQywgZGVyIGdldG9ldGV0IHd1cmRlLCBzb2xsdGUgc2Nob24gZWluZSB0b2xsZQorCU1lbGR1bmcgYXVmIGRlbSBNb2VyZGVyLUthbmFsIGVyemV1Z2VuLiBJbiBkZXIgUHJvcGVydHkKKwlQX01VUkRFUl9NU0cga29lbm5lbiBoaWVyenUgYWx0ZXJuYXRpdmUgVGV4dGUgenUgZGVuIG5vcm1hbCBwZXIKKwladWZhbGwgYXVzZ2V3YWVobHRlbiBhbmdlZ2ViZW4gd2VyZGVuOgorCSAgU2V0UHJvcChQX01VUkRFUl9NU0csCisgICAgICAgICAgICAgICAgICAiTmljaHQgc2NobGVjaHQsIGFiZXIgZGFzIHNjaGFmZnQgZWggbnVyIGVpbmVyISIpOworCSAgU2V0UHJvcChQX0ZPUkNFX01VUkRFUl9NU0csMSk7CisJWndhciBpc3QgZXMgYmVpIGdyb3NzZW4gTlBDcyBoaW5yZWljaGVuZCB3YWhyc2NoZWlubGljaCwgZGFzcyBlcworCWluZm9sZ2UgZGVyZXIgU3RhZXJrZSB6dXIgYXV0b21hdGlzY2hlbiBBdXNnYWJlIGVpbmVyIE1vZXJkZXJtZWxkdW5nCisJa29tbXQsIGFiZXIgbWl0IGRlciBsZXR6dGVuIFplaWxlIHd1cmRlIGRpZXMgYWJzb2x1dCBzaWNoZXJnZXN0ZWxsdC4KKworU0lFSEUgQVVDSDoKKwlQX01VUkRFUl9NU0csIFBfWkFQX01TRywgUF9LSUxMX01TRywgUF9ESUVfTVNHLCBQX0NPUlBTRSwgUF9OT0NPUlBTRQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBUdWUgTm92IDEwIDAyOjE1OjI2IDE5OTggYnkgUGF0cnluCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9GUkVFX0hBTkRTIGIvZG9jL3Byb3BzL1BfRlJFRV9IQU5EUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTQzY2FkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfRlJFRV9IQU5EUwpAQCAtMCwwICsxLDIyIEBACitQX0ZSRUVfSEFORFMKK05BTUU6CisgICAgUF9GUkVFX0hBTkRTICAgICAgICAgICAgICAgICAgImZyZWVfaGFuZHMiCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL2xpdmluZy9jb21iYXQuaAorCitCRVNDSFJFSUJVTkc6CisgICAgQW56YWhsIGRlciBmcmVpZW4gSGFlbmRlLgorICAgIEVmZmVrdGl2IG51ciBlaW4gZGllIERpZmZlcmVueiB2b24gUF9NQVhfSEFORFMgdW5kIFBfVVNFRF9IQU5EUy4KKworQkVNRVJLVU5HRU46CisgICAgS2VpbmUgZWNodGUgUHJvcGVydHkuIERpZSBNZXRob2RlIC9zdGQvbGl2aW5nL2NvbWJhdDo6X3F1ZXJ5X2ZyZWVfaGFuZHMKKyAgICBzdGVsbHQgZGllIERhdGVuIHp1c2FtbWVuLiBOaWNodCBzZXR6ZW4hCisKK1NJRUhFIEFVQ0g6CisgICAgUF9IQU5EUywgUF9IQU5EU19VU0VEX0JZCisgICAgUF9NQVhfSEFORFMsIFBfVVNFRF9IQU5EUworICAgIFVzZUhhbmRzLCBGcmVlSGFuZHMKKyAgICAvc3RkL3dlYXBvbi5jLCAvc3RkL3NwZWxsYm9vay5jCisKKzEuIE9rdCAyMDEyLCBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfRlJJRU5EIGIvZG9jL3Byb3BzL1BfRlJJRU5ECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZDA4MGMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9GUklFTkQKQEAgLTAsMCArMSwyNCBAQAorTkFNRToKKwlQX0ZSSUVORAkJCSJmcmllbmQiCisKK0RFRklOSUVSVCBJTjoKKwk8Y29tYmF0Lmg+CisKK0JFU0NIUkVJQlVORzoKKwlTZXR6dCBtYW4gZGllc2UgUHJvcGVydHkgaW4gZWluZW0gTlBDIGF1ZiBlaW5lbiBXZXJ0IHVuZ2xlaWNoIE51bGwsCisJc28gd2lyZCBkZXIgTlBDIGJlaSBaYXViZXJzcHJ1ZWNoZW4sIGRpZSBhdWYgYmVzdGltbXRlIEdydXBwZW4KKwl3aXJrZW4sIGRlciBHcnVwcGUgZGVyIFNwaWVsZXIgdW5kIG5pY2h0IGRlciBHcnVwcGUgZGVyIE5QQ3MKKwl6dWdlb3JkbmV0LiBBdXNzZXJkZW0gd2lyZCBkZXIgTlBDIGJlaSBlaW5lbSAidG9ldGUgYWxsZSIgbmljaHQgbWl0CisJYW5nZWdyaWZmZW4uCisJV3VyZGUgZGVyIE5QQyBlaW5lbSBTcGllbGVyIHBlciBBc3NvY01lbWJlcigpIHp1Z2VvcmRuZXQsIHNvCisJYmVmaW5kZXQgc2ljaCBkZXIgTlBDIGF1dG9tYXRpc2NoIGltIGpld2VpbGlnZW4gVGVhbSBkZXMgU3BpZWxlcnMKKwkgKG1vZWdsaWNoc3QgYXVjaCBpbiBkZXIgc2VsYmVuIEthbXBmcmVpaGUpLCB1bmQgZGllIFByb3BlcnR5IGhhdAorCWRhbm4gYXV0b21hdGlzY2ggZGFzIFNwaWVsZXJvYmpla3QgYWxzIFdlcnQuCisJRGEgZGllc2VyIFdlcnQgaW4gZGllc2VtIEZhbGwgbmF0dWVybGljaCB1bmdsZWljaCBOdWxsIGlzdCwgd2lyZCBkZXIKKwlOUEMgZGFubiBhdWNoIGRlciBHcnVwcGUgZGVyIFNwaWVsZXIgenVnZW9yZG5ldC4KKworU0lFSEUgQVVDSDoKKwlGaW5kR3JvdXAoKSwgQXNzb2NNZW1iZXIoKSwgUF9URUFNX0FTU09DX01FTUJFUlMsIC9zdGQvbGl2aW5nL3RlYW0uYworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBUdWUgRGVjIDI5IDE3OjAyOjU1IDE5OTggYnkgUGF0cnluCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9GUk9HIGIvZG9jL3Byb3BzL1BfRlJPRwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjY0ZWFjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfRlJPRwpAQCAtMCwwICsxLDggQEAKK05BTUU6CisgICAgUF9GUk9HICAgICAgICAgICAgICAgICAgICAgICAgImZyb2ciICAgICAgICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL2xpdmluZy9saWZlLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBHZXNldHp0LCB3ZW5uIGRlciBTcGllbGVyIGVpbiBGcm9zY2ggaXN0LgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfRlVFTCBiL2RvYy9wcm9wcy9QX0ZVRUwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkwY2E2MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0ZVRUwKQEAgLTAsMCArMSwyNiBAQAorTkFNRToKKyAgICBQX0ZVRUwgICAgICAgICAgICAgICAgICAgICAgICAiZnVlbCIgICAgICAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcHJvcGVydGllcy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgTnVtZXJpc2NoZXIgV2VydCBmdWVyIGRpZSBaZWl0ZGF1ZXIsIGRpZSBkaWUgTGljaHRxdWVsbGUgbm9jaAorICAgICBsZXVjaHRlbiBrYW5uLiBTdGFuZGFyZG1hZXNzaWcgaXN0IGRlciBXZXJ0IGF1ZiAyMCBnZXNldHp0LgorCisgICAgIFNldHp0IG1hbiBkaWUgUHJvcGVydHkgYXVmIGVpbmVuIFdlcnQsIGRlciBncm9lc3NlciBpc3QgYWxzIGRlciB2b3JpZ2UKKyAgICAgTWF4aW1hbHdlcnQsIHdpcmQgZGllc2VyIGF1ZiBkZW4gbmV1ZW4gV2VydCBlcmhvZWh0LiBBZW5kZXJ0IG1hbiBkZW4KKyAgICAgQnJlbm5zdG9mZnZvcnJhdCBkZXIgTGljaHRxdWVsbGUgaGluZ2VnZW4gbWl0dGVscyBBZGRGdWVsKCksIHNvIHdpcmQKKyAgICAgZGVyIFdlcnQgdm9uIFBfRlVFTCB1ZWJlciBkZW4gTWF4aW1hbHdlcnQgaGluYXVzIGVyaG9laHQuCisKK0hJTldFSVM6CisgICAgIEZ1ZXIgQWVuZGVydW5nZW4gYW4gZGVyIFByb3BlcnR5IGthbm4gYXVjaCBkaWUgRnVua3Rpb24gQWRkRnVlbCgpCisgICAgIHZlcndlbmRldCB3ZXJkZW4uIAorCitTSUVIRSBBVUNIOgorICAgICBCYXNpc2tsYXNzZW46IC9zdGQvbGlnaHRzb3VyY2UuYworICAgICBQcm9wZXJ0aWVzOiAgIFBfTElHSFRERVNDLCBQX0RPX0RFU1RSVUNULCBQX0xJR0hUCisgICAgIE1ldGhvZGVuOiAgICAgQWRkRnVlbChMKQorCitMRVRaVEUgQUVOREVSVU5HOgorICAgIDIyLiBEZXouIDIwMTUsIEFyYXRob3JuCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9GVU5DX01TRyBiL2RvYy9wcm9wcy9QX0ZVTkNfTVNHCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZjlkMWUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9GVU5DX01TRwpAQCAtMCwwICsxLDIxIEBACitOQU1FOgorICAgIFBfRlVOQ19NU0cgICAgICAgICAgICAgICAgICAgICJmdW5jX21zZyIgICAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9yb29tL2Rlc2NyaXB0aW9uLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBMaXN0ZSBtaXQgRnVua3Rpb25lbiwgZGllIHp1ZmFlbGxpZyBpbSBSYXVtIGF1ZmdlcnVmZW4gd2VyZGVuLgorCisgICAgIEhpZXIgaXN0IG51ciBlaW5lIHp1ciBydWZlbmRlIGxva2FsZSBNZXRob2RlIGFscyBTdHJpbmcgb2RlciBlaW5lCisgICAgIFNhbW1sdW5nIGRhdm9uIGFscyBTdHJpbmdhcnJheSBnZXNwZWljaGVydC4KKworQU5NRVJLVU5HRU46CisgICAgIEJpdHRlIEFkZFJvb21NZXNzYWdlKCkgenVtIEhpbnp1ZnVlZ2VuL1VlYmVyc2NocmVpYmVuIGJlbnV0emVuIQorCitTSUVIRSBBVUNIOgorICAgICBMRnVuczogICAgQWRkUm9vbU1lc3NhZ2UoKQorICAgICBWZXJ3YW5kdDogdGVsbF9yb29tKCksIFJlY2VpdmVNc2coKQorICAgICBQcm9wczogICAgUF9ST09NX01TRywgUF9NU0dfUFJPQgorCisyLkZlYiAyMDE2IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9GV19BTFdBWVNfUkVBREFCTEUgYi9kb2MvcHJvcHMvUF9GV19BTFdBWVNfUkVBREFCTEUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE3MDBlZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0ZXX0FMV0FZU19SRUFEQUJMRQpAQCAtMCwwICsxLDggQEAKK05BTUU6CisgICAgUF9GV19BTFdBWVNfUkVBREFCTEUgICAgICAgICAgImZ3X2Fsd2F5c19yZWFkYWJsZSIgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3Byb3BlcnRpZXMuaAorCitCRVNDSFJFSUJVTkc6CisgICAgKioqIEtFSU5FIEJFU0NIUkVJQlVORyBWT1JIQU5ERU4gKioqCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9GV19VTkRFUlNUQU5EIGIvZG9jL3Byb3BzL1BfRldfVU5ERVJTVEFORApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjhmNmU2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfRldfVU5ERVJTVEFORApAQCAtMCwwICsxLDggQEAKK05BTUU6CisgICAgUF9GV19VTkRFUlNUQU5EICAgICAgICAgICAgICAgImZ3X3VuZGVyc3RhbmQiICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3Byb3BlcnRpZXMuaAorCitCRVNDSFJFSUJVTkc6CisgICAgKioqIEtFSU5FIEJFU0NIUkVJQlVORyBWT1JIQU5ERU4gKioqCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9HRU5ERVIgYi9kb2MvcHJvcHMvUF9HRU5ERVIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNmNzNkYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0dFTkRFUgpAQCAtMCwwICsxLDkgQEAKK05BTUU6CisgICAgUF9HRU5ERVIgICAgICAgICAgICAgICAgICAgICAgImdlbmRlciIgICAgICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3RoaW5nL2xhbmd1YWdlLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBHcmFtbWF0aWthbGlzY2hlcyBHZXNjaGxlY2h0IGRlcyBPYmpla3RlczoKKyAgICAgKERlZmluaWVydCBpbiBsYW5ndWFnZS5oKSBNQUxFLCBGRU1BTEUgb2RlciBORVVURVIKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0dIT1NUIGIvZG9jL3Byb3BzL1BfR0hPU1QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNiZjMwOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0dIT1NUCkBAIC0wLDAgKzEsOCBAQAorTkFNRToKKyAgICBQX0dIT1NUICAgICAgICAgICAgICAgICAgICAgICAiZ2hvc3QiICAgICAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvbGl2aW5nL2xpZmUuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIEdlc2V0enQsIHdlbm4gZGVyIFNwaWVsZXIgdG90IGlzdC4KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0dJVkVfTVNHIGIvZG9jL3Byb3BzL1BfR0lWRV9NU0cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ2YTYyNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0dJVkVfTVNHCkBAIC0wLDAgKzEsNjUgQEAKK1BfR0lWRV9NU0cKK05BTUU6CisgICAgIFBfR0lWRV9NU0cJCQkJImdpdmVfbWVzc2FnZSIKKworREVGSU5JRVJUIElOOgorICAgICAvc3lzL2xpdmluZy9wdXRfYW5kX2dldC5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgTWl0IFBfR0lWRV9NU0cga2FubiBtYW4gZGllIE1lbGR1bmcsIGRpZSBtYW4gYmVpbSBVZWJlcmdlYmVuIGVpbmVzCisgICAgIE9iamVrdGVzIGJla29tbXQsIG1vZGlmaXppZXJlbi4KKworICAgICBGb2xnZW5kZSBXZXJ0ZSBzaW5kIG1vZWdsaWNoOgorCisgICAgIG8gMAorICAgICAgIEVzIHdpcmQgZWluZSBTdGFuZGFyZG1lbGR1bmcgYXVzZ2VnZWJlbi4gRGllcyBpc3QgVm9yZWluc3RlbGx1bmcuCisKKyAgICAgbyBOT19QTkdfTVNHCT09IC0xCisgICAgICAgRXMgd2lyZCBrZWluZXJsZWkgTWVsZHVuZyBhdXNnZWdlYmVuCisKKyAgICAgbyBFaW4gQXJyYXkgYXVzIFN0cmluZ3MKKyAgICAgICBEZXIgZXJzdGUgU3RyaW5nIHdpcmQgYW4gZGVuIFNwaWVsZXIgYXVzZ2VnZWJlbiwgZGVyIHp3ZWl0ZQorICAgICAgIChvcHRpb25hbGUpIGFuIGRlbiBSYXVtLCBkZXIgZHJpdHRlIChlYmVuZmFsbHMgb3B0aW9uYWxlKSBhbiBkZW4KKyAgICAgICBFbXBmYWVuZ2VyLgorCisgICAgICAgRGllIFN0cmluZ3Mgd2VyZGVuIGR1cmNoIGRpZSBGdW5rdGlvbiByZXBsYWNlX3BlcnNvbmFsKCkgZ2VwYXJzdC4KKwlPYmpla3QxIC0gU3BpZWxlcgorICAgICAgICBPYmpla3QyIC0gZGFzIE9iamVrdCwgZGFzIHVlYmVyZ2ViZW4gd2lyZAorCU9iamVrdDMgLSBFbXBmYWVuZ2VyCisKKyAgICAgICBXaXJkIGRlciB6d2VpdGUgU3RyaW5nIG5pY2h0IGFuZ2VnZWJlbiwgZXJmb2xndCBrZWluZSBNZWxkdW5nIGFuIGRlbgorICAgICAgIFJhdW0uIEJlaW0gRmVobGVuIGRlcyBkcml0dGVuIGdpYnQgZXMga2VpbmUgTWVsZHVuZyBhbiBkZW4gRW1wZmFlbmdlci4KKworQkVJU1BJRUw6CisgICAgIHZvaWQgY3JlYXRlKCkgeworICAgICAgLi4uCisgICAgICBTZXRQcm9wKCBQX1NIT1JULCAiRXR3YXMgU2FuZCIgKTsKKyAgICAgIFNldFByb3AoIFBfTE9ORywgYnJlYWtfc3RyaW5nKAorCSJFaW4gd2VuaWcgbWFnaXNjaGVyIFNhbmQuIFNlaHIgZmVpbmtydWVtZWxpZy4iLDc4ICkpOworCisgICAgICBTZXRQcm9wKCBQX05BTUUsICJTYW5kIiApOworICAgICAgQWRkSWQoICh7InNhbmQifSkgKTsKKyAgICAgIFNldFByb3AoIFBfR0VOREVSLCBNQUxFICk7CisKKyAgICAgIFNldFByb3AoIFBfR0lWRV9NU0csICh7CisgICAgICAgIkR1IGxhZXNzdCBAV0VOMiBpbiBAV0VTU0VOMyBIYWVuZGUgcmllc2Vsbi4iLAorICAgICAgICJAV0VSMSBsYWVzc3QgQFdFTlUyIGluIEBXRVNTRU4zIEhhZW5kZSByaWVzZWxuLiIsCisgICAgICAgIkBXRVIxIGxhZXNzdCBAV0VOVTIgaW4gZGVpbmUgSGFlbmRlIHJpZXNlbG4uIn0pKTsKKyAgICAgICAuLi4KKyAgICAgIH0KKworICAgICBEYXMgZ2FuemUgZnVlaHJ0IGJlaSBVZ2FycyAiZ2liIHNhbmQgYW4gcGV0ZXIiIHp1IGZvbGdlbmRlbgorICAgICBNZWxkdW5nZW46CisKKyAgICAgVWdhcjogIkR1IGxhZXNzdCBkZW4gU2FuZCBpbiBQZXRlcnMgSGFlbmRlIHJpZXNlbG4uIgorICAgICBSYXVtOiAiVWdhciBsYWVzc3QgU2FuZCBpbiBQZXRlcnMgSGFlbmRlIHJpZXNlbG4uIgorICAgICBQZXRlcjogIlVnYXIgbGFlc3N0IFNhbmQgaW4gZGVpbmUgSGFlbmRlIHJpZXNlbG4uIgorCitTSUVIRSBBVUNIOgorICAgICBBZWhubGljaGVzOiBQX0RST1BfTVNHLCBQX1BVVF9NU0csIFBfUElDS19NU0csIFBfU0hPV19NU0cKKyAgICAgRmVobGVyOiAgICAgUF9UT09fSEVBVllfTVNHLCBQX0VOVl9UT09fSEVBVllfTVNHLCBQX1RPT19NQU5ZX01TRywKKyAgICAgICAgICAgICAgICAgUF9OT0lOU0VSVF9NU0csIFBfTk9MRUFWRV9NU0csIFBfTk9EUk9QLCBQX05PR0VUIAorICAgICBTb25zdGlnZXM6ICByZXBsYWNlX3BlcnNvbmFsKEUpLCBnaXZlKEwpLCBnaXZlX29iamVjdHMoTCksCisJCSBnaXZlX25vdGlmeShMKSwgL3N0ZC9saXZpbmcvcHV0X2FuZF9nZXQuYworCisxNC4gTWFlcnogMjAwNCBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfR0xPQkFMX1NLSUxMUFJPUFMgYi9kb2MvcHJvcHMvUF9HTE9CQUxfU0tJTExQUk9QUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzEyYzFlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfR0xPQkFMX1NLSUxMUFJPUFMKQEAgLTAsMCArMSwyNyBAQAorTkFNRToKKyAgICBQX0dMT0JBTF9TS0lMTFBST1BTICAgICAgICAic21fZ2xvYmFsIiAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvbmV3X3NraWxscy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICBEaWVzZSBHaWxkZW4tIHVuZCBTcGVsbGJvb2twcm9wZXJ0eSBlbnRoYWVsdCBFaWdlbnNjaGFmdGVuLCBkaWUKKyAgICBhbGxlIFNwZWxscyBlaW5lcyBTcGVsbGJvb2tzIGJ6dy4gYWxsZSBTa2lsbHMgdW5kIFNwZWxscyBlaW5lciBHaWxkZQorICAgIGhhYmVuIHNvbGxlbi4KKworQkVJU1BJRUxFOgorICAgIFNldFByb3AoUF9HTE9CQUxfU0tJTExQUk9QUywKKyAgICAgIChbU0lfU0tJTExSRVNUUl9VU0U6ICAgICAoW1NSX0ZVTjogIydzcGVsbFRlc3RdKSwKKyAgICAgICAgT0ZGU0VUKFNJX1NLSUxMTEVBUk4pOiAjJ2xlYXJuT2Zmc2V0LAorICAgICAgICBPRkZTRVQoU0lfU1BFTExDT1NUKTogICMnY29zdE9mZnNldCwKKyAgICAgICAgRkFDVE9SKFNJX1NQRUxMQ09TVCk6ICAjJ2Nvc3RGYWN0b3JdKSk7CisKK1NJRUhFIEFVQ0g6CisgICAgR09iaiBWZXJ3YWx0ZW46ICAgTGVhcm5Ta2lsbCwgTGVhcm5TcGVsbCwgSW5pdGlhbFNraWxsQWJpbGl0eQorICAgICogUHJvcGVydGllczogICAgIFBfR1VJTERfU0tJTExTCisgICAgU3BlbGxib29rIExlcm5lbjogTGVhcm4sIFNwZWxsU3VjY2VzcywgRXJmb2xnLCBNaXNzZXJmb2xnCisgICAgKiBWZXJ3YWx0ZW46ICAgICAgQWRkU3BlbGwsIFF1ZXJ5U3BlbGwKKyAgICAqIFByb3BlcnRpZXM6ICAgICBQX1NCX1NQRUxMUworICAgIFNraWxsczogICAgICAgICAgIFBfTkVXU0tJTExTLCBzcHJ1Y2hlcm11ZWR1bmcsIHNraWxsX2luZm9fbGlzdGUKKworMy4gT2t0IDIwMTEgR2xvaW5zb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9HVUFSRCBiL2RvYy9wcm9wcy9QX0dVQVJECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZWI5ODkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9HVUFSRApAQCAtMCwwICsxLDUwIEBACitQX0dVQVJECitOQU1FOgorICAgICBQX0dVQVJECQkJCSJndWFyZCIKKworREVGSU5JRVJUIElOOgorICAgICAvc3lzL2d1YXJkLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBEaWVzZSBQcm9wZXJ0eSBnaWJ0IGFuLCBvYiBlaW4gTlBDIGF1cyBlaW5lbSBSYXVtIGVudGZlcm50IHdlcmRlbiBkYXJmCisgICAgIG9kZXIgbmljaHQuIEFiZ2VmcmFndCB3ZXJkZW4gbXVzcyBkaWVzIHZvbiBkZW4gSXRlbXMgb2RlciBTcGVsbHMsIGRpZQorICAgICBkZW4gTlBDIHp1IGVpbmVyIEJld2VndW5nIHp3aW5nZW4gd29sbGVuLiBFcyB3aXJkIG5pY2h0IGF1dG9tYXRpc2NoCisgICAgIGRhcmF1ZiBnZWFjaHRldCEKKworICAgICBFbnRzY2hlaWRlbmQgaGllcmJlaSBpc3QgZWluIGluIGRlciBQcm9wZXJ0eSBlbnRoYWx0ZW5lIChnYW56emFobGlnZXIpCisgICAgIFphaGxlbndlcnQgendpc2NoZW4gMCB1bmQgMTAwLCBkZXIgaGllcmJlaSBkZW4gR3JhZCBkZXIKKyAgICAgJ0Jld2FjaHVuZ3NzdGFlcmtlJyBlaW5lcyBOUENzIGFuZ2lidC4gQmVpIDAgbGFlc3N0IHNpY2ggZGFzIExlYmV3ZXNlbgorICAgICBpbW1lciB6dSBlaW5lciBCZXdlZ3VuZyB1ZWJlcnJlZGVuLCBiZWkgMTAwIHVlYmVyaGF1cHQgbmljaHQuIERhendpc2NoZW4KKyAgICAgZ2lidCBlcyBkaWUgV2FocnNjaGVpbmxpY2hrZWl0IGRhZnVlciBhbi4KKworQkVNRVJLVU5HRU46CisgICAgIC0gYWxsZSB2b24gL3N0ZC9ucGMgYWJnZWxlaXRldGVuIE5QQ3MgaGFiZW4gc3RhbmRhcmRtYWVzc2lnIFBfR1VBUkQKKyAgICAgICBhdWYgMTAwIGdlc2V0enQsIHNpbmQgYWxzbyBuaWNodCBmb3J0ZnVlaHJiYXIKKyAgICAgLSBiZWkgZGVyIEVyemV1Z3VuZyB2b24gTlBDcyBtaXQgUF9HVUFSRCA8IDEwMCBBZGRJdGVtKCkgbWl0IGRlbQorICAgICAgIFBhcmFtZXRlciBSRUZSRVNIX01PVkVfSE9NRSB2ZXJ3ZW5kZW4sIGRhbWl0IHNpZSBiZWkgZWluZW0gUmF1bXJlc2V0CisgICAgICAgZ2VnZWJlbmVuZmFsbHMgYW4gaWhyZW4gQXVzZ2FuZ3NvcnQgenVydWVja2tlaHJlbi4gCisgICAgIC0gZ2lsZGVuc3BlemlmaXNjaGUgd2VpdGVyZSBBYmZyYWdlbiBhdWYgTGV2ZWwgb0FlIGJpdHRlIGJlaSBHaWxkZW4tCisgICAgICAgbWFnaWVybiBlcmZyYWdlbgorCitCRUlTUElFTEU6CisgICAgIC8vIGVpbiBUZXN0CisgICAgIGlmKHJhbmRvbSgxMDApPD1saXYtPlF1ZXJ5UHJvcChQX0dVQVJEKSkKKyAgICAgIGNhbm5vdE1vdmVOUEMoKTsgLy8gTlBDIGRhcmYgbmljaHQgYmV3ZWd0IHdlcmRlbiEKKyAgICAgZWxzZQorICAgICAgbW92ZU5QQygpOyAgICAgICAvLyBOUEMgZGFyZiBiZXdlZ3Qgd2VyZGVuCisKKyAgICAgLy8gZWluIHdlZ2Z1ZWhyYmFyZXIgTlBDCisgICAgIHZvaWQgY3JlYXRlKCkgeworICAgICAgOjpjcmVhdGUoKTsKKyAgICAgIC4uLgorICAgICAgU2V0UHJvcChQX0dVQVJELDUwKTsKKyAgICAgIC4uLgorICAgICB9CisgICAgIC8vIG1pdCA1MCUgV2FocnNjaGVpbmxpY2hrZWl0IChwcm8gVmVyc3VjaCkgbGFlc3N0IHNpY2ggZGVyIE5QQyBudW4KKyAgICAgLy8gZm9ydGZ1ZWhyZW4KKworCitTSUVIRSBBVUNIOgorICAgICBBZGRJdGVtKCkKKworMTMuQXByaWwgMjAwNCBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfR1VJTEQgYi9kb2MvcHJvcHMvUF9HVUlMRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2ZmYjRjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfR1VJTEQKQEAgLTAsMCArMSwyMiBAQAorUF9HVUlMRAorTkFNRToKKyAgICAgUF9HVUlMRAkJCQkiZ3VpbGQiICAgICAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgICAvc3lzL3Byb3BlcnRpZXMuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIERpZXNlIFByb3BlcnR5IGVudGhhZWx0IGRlbiBOYW1lbiBkZXIgR2lsZGUsIHdlbGNoZXIgZGFzIExlYmV3ZXNlbgorICAgICBhbmdlaG9lcnQuIERlciBOYW1lIGRlciBHaWxkZSBpc3QgaGllcmJlaSBrbGVpbmdlc2NocmllYmVuIGFscyBTdHJpbmcKKyAgICAgZGVmaW5pZXJ0LgorCitCRU1FUktVTkdFTjoKKyAgICAgQmVpIFNwaWVsZXJuIGlzdCBkZXIgV2VydCBkaWVzZXIgUHJvcGVydHkgbmllbWFscyBOdWxsLCBkZW5uIHNpZQorICAgICBnZWhvZXJlbiBzdGFuZGFyZG1hZXNzaWcgZGVyIGluIFBfREVGQVVMVF9HVUlMRCBzdGVoZW5kZW4gR2lsZGUgYW4uCisgICAgIFVlYmVyIGRpZSBnZXNldHp0ZSBQX0dVSUxEIHdlcmRlbiBhdWNoIGFrdGl2ZSBTa2lsbHMgZXJtaXR0ZWx0LgorCitTSUVIRSBBVUNIOgorICAgICBQX0RFRkFVTFRfR1VJTEQsIFBfVklTSUJMRV9HVUlMRAorICAgICBQX0dVSUxEX1RJVExFLCBQX1NVQkdVSUxEX1RJVExFCisKKzI2LiBNYWVyeiAyMDA0IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9HVUlMRF9ERUFDVElWQVRFX1NLSUxMUyBiL2RvYy9wcm9wcy9QX0dVSUxEX0RFQUNUSVZBVEVfU0tJTExTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxOWRhMzAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9HVUlMRF9ERUFDVElWQVRFX1NLSUxMUwpAQCAtMCwwICsxLDM4IEBACitQUk9QRVJUWToKKworICBQX0dVSUxEX0RFQUNUSVZBVEVfU0tJTExTICAgICAiZ3VpbGRfZGVhY3RpdmF0ZV9za2lsbHMiCisKK0RFRklOSUVSVCBJTjogCisKKyAgbmV3X3NraWxscy5oCisKK0JFU0NIUkVJQlVORzoKKworICBEaWVzZSBQcm9wZXJ0eSBlcmxhdWJ0IGVzLCBHaWxkZW5taXRnbGllZGVybiBkaWUgYmVudXR6dW5nIHZvbiBBTlktCisgIFNraWxscyB6dSB1bnRlcnNhZ2VuLiBEaWVzIHNpbmQgZWluZXJzZWl0cyBkaWUgYWxsZ2VtZWluZW4gV2FmZmVuc2tpbGxzLAorICBhbmRlcmVyc2VpdHMga29lbm50ZSBkYXMgYXVjaCBkZXIgZW50Z2lmdGUtU3BydWNoIGRlciBEdWVzdGVyd2FsZCAtCisgIFF1ZXN0IHNlaW4uCisKKyAgV2VydCBkaWVzZXIgUHJvcGVydHkgaXN0IGVpbiBNYXBwaW5nLCBkYXMgYWxzIEtleXMgZGllIGVpbnplbG5lbgorICBTa2lsbHMgdW5kIGFscyBXZXJ0IDEgZW50aGFlbHQsIHdlbm4gZWluIFNraWxsIGRlYWt0aXZpZXJ0CisgIHdlcmRlbiBzb2xsIHVuZCAwLCBmYWxscyBuaWNodC4KKworICBEaWVzZSBQcm9wZXJ0eSB3aXJkIG51ciBiZWkgZWluZW0gTmV1ZXJ6ZXVnZW4gZGVzIFNwaWVsZXJzIG5ldSAKKyAgYXVzZ2VsZXNlbiwgZGEgZXMgc29uc3QgenV2aWVsIFJlY2hlbnplaXQga29zdGV0LgorCitCRUlTUElFTDoKKworICBKZWRlIEdpbGRlLCBkaWUga2VpbmUgV2FmZmVuc2tpbGxzIGJlbnV0emVuIHNvbGwgKG9kZXIgc2VsYnN0IHdlbGNoZSBoYXQpCisgIGVudGhhZWx0IGZvbGdlbmRlbiBCZWZlaGw6CisKKyAgICBTZXRQcm9wKFBfR1VJTERfREVBQ1RJVkFURV9TS0lMTFMsCisgICAgKFtGSUdIVChXVF9TV09SRCk6MSwKKyAgICBGSUdIVChXVF9BWEUpOjEsCisgICAgRklHSFQoV1RfQ0xVQik6MSwKKyAgICBGSUdIVChXVF9TUEVBUik6MSwKKyAgICBGSUdIVChXVF9LTklGRSk6MSwKKyAgICBGSUdIVChXVF9XSElQKToxXSkpOworICAgIAorTEVUWlRFIEFFTkRFUlVORzogCisKKzIwMDMtMDEtMzAsIDE0OjE1LCBIdW1uaQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfR1VJTERfREVGQVVMVF9TUEVMTEJPT0sgYi9kb2MvcHJvcHMvUF9HVUlMRF9ERUZBVUxUX1NQRUxMQk9PSwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWQ5MTUwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfR1VJTERfREVGQVVMVF9TUEVMTEJPT0sKQEAgLTAsMCArMSwyMyBAQAorTkFNRToKKwlQX0dVSUxEX0RFRkFVTFRfU1BFTExCT09LCSJndWlsZF9zYiIgICAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisJL3N5cy9uZXdfc2tpbGxzLmgKKworQkVTQ0hSRUlCVU5HOgorCURpZXNlIEdpbGRlbnByb3BlcnR5IGVudGhhZWx0IGRlbiBOYW1lbiBkZXMgU3BlbGxib29rcywgd2VsY2hlcworCXN0YW5kYXJkbWFlc3NpZyB2b24gZGVyIEdpbGRlIHZlcndlbmRldCB3aXJkLgorCitCRU1FUktVTkdFTjoKKwlCZWkgU3BlbGxzIGthbm4gc2llIG1pdCBTSV9TUEVMTEJPT0sgdWViZXJzY2hyaWViZW4gd2VyZGVuLgorCitCRUlTUElFTEU6CisJQmVpIFphdWJlcmVybiB3YWVyZSBmb2xnZW5kZXMgZGVua2JhcjoKKwkgIFNldFByb3AoUF9HVUlMRF9ERUZBVUxUX1NQRUxMQk9PSywibWFnaWVfc3AiKTsKKwlEYXMgU3BlbGxib29rIGlzdCBoaWVyYmVpIHVudGVyICIvc3BlbGxib29rcy9tYWdpZV9zcC5jIiB6dSBmaW5kZW4uCisKK1NJRUhFIEFVQ0g6CisJUF9HVUlMRAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBXZWQgSmFuIDE0IDE5OjE3OjA2IDE5OTggYnkgUGF0cnluCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9HVUlMRF9GRU1BTEVfVElUTEVTIGIvZG9jL3Byb3BzL1BfR1VJTERfRkVNQUxFX1RJVExFUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTUyOGU5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfR1VJTERfRkVNQUxFX1RJVExFUwpAQCAtMCwwICsxLDI0IEBACitOQU1FOgorCVBfR1VJTERfRkVNQUxFX1RJVExFUwkJImd1aWxkX2ZlbWFsZV90aXRsZXMiICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKwkvc3lzL25ld19za2lsbHMuaAorCitCRVNDSFJFSUJVTkc6CisJRGllc2UgR2lsZGVucHJvcGVydHkgZW50aGFlbHQgZGllIFN0dWZlbmJlemVpY2hudW5nZW4gZnVlcgorCXdlaWJsaWNoZSBHaWxkZW5taXRnbGllZGVyLiBBbHMgU2NobHVlc3NlbCBkaWVuZW4gaGllcmJlaSBkaWUKKwlHaWxkZW5zdHVmZW4gdW5kIGRpZSBlbnRzcHJlY2hlbmRlbiBFaW50cmFlZ2Ugc2luZCBkYW5uIGRpZSB6dXIKKwlTdHVmZSBnZWhvZXJpZ2VuIEdpbGRlbnRpdGVsLgorCitCRUlTUElFTEU6CisJRWluZSBQcm9ncmFtbWllcmVyZ2lsZGUga29lbm50ZSBmb2xnZW5kZSBTdHVmZW5iZXplaWNobnVuZ2VuCisJYmVpbmhhbHRlbjoKKwkgIFNldFByb3AoUF9HVUlMRF9GRU1BTEVfVElUTEVTLChbMToiZGllIEFuZmFlbmdlcmluIiwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjoiZGllIEZvcnRnZXNjaHJpdHRlbmUiLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOiJkaWUgUHJvZmVzc2lvbmVsbGUgOykiXSkpOworCitTSUVIRSBBVUNIOgorCVBfR0VOREVSLCBQX0dVSUxEX0xFVkVMLCBQX0dVSUxEX1RJVExFLCBQX0dVSUxEX01BTEVfVElUTEVTCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFdlZCBKYW4gMTQgMTk6MTc6MDYgMTk5OCBieSBQYXRyeW4KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0dVSUxEX0xFVkVMIGIvZG9jL3Byb3BzL1BfR1VJTERfTEVWRUwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkyMDQ0OQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0dVSUxEX0xFVkVMCkBAIC0wLDAgKzEsMjMgQEAKK05BTUU6CisJUF9HVUlMRF9MRVZFTAkJCSJndWlsZF9sZXZlbCIgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisJL3N5cy9uZXdfc2tpbGxzLmgKKworQkVTQ0hSRUlCVU5HOgorCURpZXNlIFByb3BlcnR5IGVudGhhZWx0IGRpZSBHaWxkZW5zdHVmZSBkZXMgTGViZXdlc2Vucywgd2VsY2hlIG5pY2h0CisJdW5iZWRpbmd0IHNlaW5lciBTcGllbGVyc3R1ZmUgZW50c3ByaWNodC4KKworQkVNRVJLVU5HRU46CisJQmVpIG1hbmNoZW4gR2lsZGVuIGVudHNwcmljaHQgZGllIEdpbGRlbnN0dWZlIHN0YW5kYXJkbWFlc3NpZyBkZXIKKwlTcGllbGVyc3R1ZmUgKEFiZW50ZXVyZXIsIEthdHplbmtyaWVnZXIpLiBJbiBkZXIgUHJvcGVydHkgc2VsYnN0CisJd2lyZCBlaWdlbnRsaWNoIGVpbiBNYXBwaW5nIGVpbmdldHJhZ2VuLCB3ZWxjaGVzIGRpZSBHaWxkZW5uYW1lbiBhbHMKKwlTY2hsdWVzc2VsIHVuZCBkaWUgZGF6dWdlaG9lcmlnZSBHaWxkZW5zdHVmZSBhbHMgRWludHJhZyBlbnRoYWVsdC4KKwlCZWkgZGVyIEFiZnJhZ2UgZGVyIFByb3BlcnR5IHdpcmQgamVkb2NoIGRpZSBHaWxkZSBiZXJ1ZWNrc2ljaHRpZ3QKKwl1bmQgZGllIGFrdHVlbGxlIEdpbGRlbnN0dWZlIHp1cnVlY2tnZWxpZWZlcnQuCisKK1NJRUhFIEFVQ0g6CisJUF9HVUlMRCwgUF9HVUlMRF9USVRMRSwgUF9HVUlMRF9NQUxFX1RJVExFUywgUF9HVUlMRF9GRU1BTEVfVElUTEVTCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFdlZCBKYW4gMTQgMTk6MTc6MDYgMTk5OCBieSBQYXRyeW4KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0dVSUxEX0xFVkVMUyBiL2RvYy9wcm9wcy9QX0dVSUxEX0xFVkVMUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGQyMjM3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfR1VJTERfTEVWRUxTCkBAIC0wLDAgKzEsMzUgQEAKK05BTUU6CisJUF9HVUlMRF9MRVZFTFMJCQkiZ3VpbGRfbGV2ZWxzIiAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorCS9zeXMvbmV3X3NraWxscy5oCisKK0JFU0NIUkVJQlVORzoKKwlEaWVzZSBHaWxkZW5wcm9wZXJ0eSBlbnRoYWVsdCBlaW4gTWFwcGluZyBtaXQgZGVuCisJU3R1ZmVuYmVzY2hyYWVua3VuZ2VuIGZ1ZXIgZGllIGpld2VpbGlnZW4gR2lsZGVuc3R1ZmVuLiBBbHMKKwlTY2hsdWVzc2VsIGRpZW50IGRlciBqZXdlaWxpZ2UgR2lsZGVubGV2ZWwgdW5kIGRpZSBlbnRzcHJlY2hlbmRlbgorCUVpbnRyYWVnZSBzaW5kIHdpZWRlcnVtIE1hcHBpbmdzLCBpbiB3ZWxjaGVuIGRpZSBCZXNjaHJhZW5rdW5nZW4KKwlhbmdlZ2ViZW4gc2luZC4KKworQkVNRVJLVU5HRU46CisJRGllIEJlc2NocmFlbmt1bmdlbiBmdWVyIExldmVsIDEgc29sbHRlbiBhdWNoIGZ1ZXIgZGllCisJRWludHJpdHRzYmVzY2hyYWVua3VuZ2VuIGRlciBHaWxkZSBnZWx0ZW4uIExldHp0ZXJlIGthbm4gbWFuIGluIGRlcgorCVByb3BlcnR5IFBfR1VJTERfUkVTVFJJQ1RJT05TIGFuZ2ViZW4uCisKK0JFSVNQSUVMRToKKwlEYXMgZm9sZ2VuZGUgQmVpc3BpZWwgemVpZ3QgZWluIHBhYXIgbW9lZ2xpY2hlIEFiZnJhZ2VuOgorCSAgc3RyaW5nIGNoZWNrKG9iamVjdCBwbCk7CisJICBTZXRQcm9wKFBfR1VJTERfTEVWRUxTLChbMTooW1BfTEVWRUw6MyxQX1FQOjEwMCxTUl9GVU46IydjaGVja10pLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgIDI6KFtBX0lOVDoxMCxQX0xFVkVMOjI1XSksCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgMzooW0FfSU5UOjIwLFBfTEVWRUw6NTBdKV0pKTsKKwkgIHN0cmluZyBjaGVjayhvYmplY3QgcGwpCisJICB7IGlmKHBsLT5RdWVyeVByb3AoUF9NQUxFKSkKKwkgICAgICByZXR1cm4gMDsKKwkgICAgcmV0dXJuICJGdWVyIEZyYXVlbiBpc3QgZGFzIG5pY2h0cyFcbiI7CisJICB9CisKK1NJRUhFIEFVQ0g6CisJUF9HVUlMRF9MRVZFTCwgUF9HVUlMRF9SRVNUUklDVElPTlMsIC9zdGQvcmVzdHJpY3Rpb25fY2hlY2tlci5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFdlZCBKYW4gMTQgMTk6MTc6MDYgMTk5OCBieSBQYXRyeW4KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0dVSUxEX01BTEVfVElUTEVTIGIvZG9jL3Byb3BzL1BfR1VJTERfTUFMRV9USVRMRVMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdlMDVhNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0dVSUxEX01BTEVfVElUTEVTCkBAIC0wLDAgKzEsMjQgQEAKK05BTUU6CisJUF9HVUlMRF9NQUxFX1RJVExFUwkJImd1aWxkX21hbGVfdGl0bGVzIiAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKwkvc3lzL25ld19za2lsbHMuaAorCitCRVNDSFJFSUJVTkc6CisJRGllc2UgR2lsZGVucHJvcGVydHkgZW50aGFlbHQgZGllIFN0dWZlbmJlemVpY2hudW5nZW4gZnVlcgorCW1hZW5ubGljaGUgR2lsZGVubWl0Z2xpZWRlci4gQWxzIFNjaGx1ZXNzZWwgZGllbmVuIGhpZXJiZWkgZGllCisJR2lsZGVuc3R1ZmVuIHVuZCBkaWUgZW50c3ByZWNoZW5kZW4gRWludHJhZWdlIHNpbmQgZGFubiBkaWUgenVyCisJU3R1ZmUgZ2Vob2VyaWdlbiBHaWxkZW50aXRlbC4KKworQkVJU1BJRUxFOgorCUVpbmUgUHJvZ3JhbW1pZXJlcmdpbGRlIGtvZW5udGUgZm9sZ2VuZGUgU3R1ZmVuYmV6ZWljaG51bmdlbgorCWJlaW5oYWx0ZW46CisJICBTZXRQcm9wKFBfR1VJTERfTUFMRV9USVRMRVMsKFsxOiJkZXIgQW5mYWVuZ2VyIiwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI6ImRlciBGb3J0Z2VzY2hyaXR0ZW5lIiwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM6ImRlciBQcm9maSJdKSk7CisKK1NJRUhFIEFVQ0g6CisJUF9HRU5ERVIsIFBfR0lMRF9MRVZFTCwgUF9HVUlMRF9USVRMRSwgUF9HVUlMRF9GRU1BTEVfVElUTEVTCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFdlZCBKYW4gMTQgMTk6MTc6MDYgMTk5OCBieSBQYXRyeW4KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0dVSUxEX1BSRVBBUkVCTE9DSyBiL2RvYy9wcm9wcy9QX0dVSUxEX1BSRVBBUkVCTE9DSwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDI5YTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfR1VJTERfUFJFUEFSRUJMT0NLCkBAIC0wLDAgKzEsMzcgQEAKK1BfR1VJTERfUFJFUEFSRUJMT0NLIChpbnQpCisKK05BTUU6CisgIFBfR1VJTERfUFJFUEFSRUJMT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgImd1aWxkX3ByZXBhcmVibG9jayIgCisKK0RFRklOSUVSVCBJTjoKKyAgL3N5cy9uZXdfc2tpbGxzLmgKKworQkVTQ0hSRUlCVU5HOgorICBEaWVzZSBQcm9wZXJ0eSBlbnRoYWVsdCBkaWUgSW5mb3JtYXRpb24sIG9iIGRhcyBMZWJld2VzZW4gaW4KKyAgZGVyIEtvbnplbnRyYXRpb25zcGhhc2UgZWluZXMgU3BlbGxzIHdlaXRlcmthZW1wZnQgb2RlciBvYgorICBkaWUgQW5ncmlmZmUgZGVyd2VpbCBhdXNnZXNldHp0IHdlcmRlbi4KKworQkVNRVJLVU5HRU46CisgIEluIGRlciBQcm9wZXJ0eSBzZWxic3Qgd2lyZCBlaWdlbnRsaWNoIGVpbiBNYXBwaW5nIGVpbmdldHJhZ2VuLAorICB3ZWxjaGVzIGRpZSBHaWxkZW5uYW1lbiBhbHMgU2NobHVlc3NlbCB1bmQgZGFzIGRhenVnZWhvZXJpZ2UKKyAgQmxvY2stRmxhZyBhbHMgRWludHJhZyBlbnRoYWVsdC4gQmVpIGRlciBBYmZyYWdlIGRlciBQcm9wZXJ0eSB3aXJkCisgIGplZG9jaCBkaWUgR2lsZGUgYmVydWVja3NpY2h0aWd0IHVuZCBkYXMgYWt0dWVsbGUgRmxhZworICB6dXJ1ZWNrZ2VsaWVmZXJ0LgorICBEZW1lbnRzcHJlY2hlbmQgZGFzIGRpZXNlIFByb3AgbmljaHQgbWl0IFNldCgpIG1hbmlwdWxpZXJ0IHdlcmRlbiwgCisgIGJpdHRlIGF1c3NjaGxpZXNzbGljaGUgU2V0UHJvcCgpIHZlcndlbmRlbi4KKworQkVJU1BJRUxFOgorICBEaWUgUHJvcGVydHkgc29sbHRlIG5hdHVlcmxpY2ggbnVyIHZvbiBkZXIgR2lsZGUgZ2VzZXR6dCB3ZXJkZW4KKyAgdW5kIGF1Y2ggbnVyIGJlaSBHaWxkZW5taXRnbGllZGVybgorCisgIGlmICggSXNHdWlsZE1lbWJlcihwbCkgKQorICAgIHBsLT5TZXRQcm9wKFBfR1VJTERfUFJFUEFSRUJMT0NLLDEpOworCisgIFJlc3VsdGF0OiBLZWluIEF1c2Z1ZWhyZW4gdm9uIEF0dGFjaygpLCB3ZW5uIHBsIHNpY2ggYXVmIGVpbmVuCisgIFphdWJlcnNwcnVjaCBrb256ZW50cmllcnQuCisKK1NJRUhFIEFVQ0g6CisgIFBfUFJFUEFSRURfU1BFTEwKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMTguMDMuMjAwOCwgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfR1VJTERfUkFUSU5HIGIvZG9jL3Byb3BzL1BfR1VJTERfUkFUSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNTgwMGEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9HVUlMRF9SQVRJTkcKQEAgLTAsMCArMSwyMiBAQAorTkFNRToKKwlQX0dVSUxEX1JBVElORwkJCSJndWlsZF9yYXRpbmciICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisJL3N5cy9uZXdfc2tpbGxzLmgKKworQkVTQ0hSRUlCVU5HOgorCUluIGRpZXNlciBQcm9wZXJ0eSB3aXJkIGRpZSBFaW5zdHVmdW5nIGRlcyBTcGllbGVycyBpbm5lcmhhbGIKKwlzZWluZXIgR2lsZGUgZmVzdGdlbGVndC4gRGVyIGRhZnVlciB6dSBlcm1pdHRlbG5kZSBXZXJ0IG11c3MgaW4KKwllaW5lbSBCZXJlaWNoIHZvbiAwIGJpcyAxMDAwMCBsaWVnZW4uIFdpZSBzaWNoIGRpZSBFaW5zdHVmdW5nCisJenVzYW1tZW5zZXR6dCwgYmxlaWJ0IGRlciBqZXdlaWxpZ2VuIEdpbGRlIHVlYmVybGFzc2VuLgorCitCRU1FUktVTkdFTjoKKwlEZXIgV2VydCBtdXNzIHZvbiBkZXIgR2lsZGUgZXJtaXR0ZWx0IHdlcmRlbiEgTWVpc3Qgc2V0enQgZXIgc2ljaAorCWF1cyBkZW4gRmFlaGlna2VpdGVuIGRlcyBNaXRnbGllZHMgenVzYW1tZW4gdW5kIG1pdHVudGVyIGZsaWVzc2VuCisJYXVjaCBHaWxkZW5xdWVzdHMgb2RlciBhZWhubGljaGVzIG1pdCBlaW4uCisKK1NJRUhFIEFVQ0g6CisgICAgUF9ORVdTS0lMTFMsIEd1aWxkUmF0aW5nCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFdlZCBKYW4gMTQgMTk6MTc6MDYgMTk5OCBieSBQYXRyeW4KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0dVSUxEX1JFU1RSSUNUSU9OUyBiL2RvYy9wcm9wcy9QX0dVSUxEX1JFU1RSSUNUSU9OUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmJhYmMxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfR1VJTERfUkVTVFJJQ1RJT05TCkBAIC0wLDAgKzEsMzcgQEAKK05BTUU6CisgICAgUF9HVUlMRF9SRVNUUklDVElPTlMgICAgICAgICJndWlsZF9yZXN0IiAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9uZXdfc2tpbGxzLmgKKworQkVTQ0hSRUlCVU5HOgorICAgIERpZXNlIEdpbGRlbnByb3BlcnR5IGVudGhhZWx0IGVpbiBNYXBwaW5nIG1pdCBkZW4KKyAgICBFaW50cml0dHNiZXNjaHJhZW5rdW5nZW4gZnVlciBkaWUgamV3ZWlsaWdlIEdpbGRlLgorCitCRU1FUktVTkdFTjoKKyAgICBJbSBhbGxnZW1laW5lbiBzb2xsdGUgZGFzIE1hcHBpbmcgbWl0IGRlbiBFaW50cml0dHNiZXNjaHJhZW5rdW5nZW4KKyAgICBtaXQgZGVuIEJlc2NocmFlbmt1bmdlbiBmdWVyIExldmVsIDEgaW0gTWFwcGluZyB2b24gUF9HVUlMRF9MRVZFTFMKKyAgICB1ZWJlcmVpbnN0aW1tZW4uCisKK0JFSVNQSUVMRToKKyAgICBFaW4gcGFhciBtb2VnbGljaGUgQWJmcmFnZW4gd2FlcmVuIGZvbGdlbmRlOgorICAgIHN0cmluZyBjaGVjayhvYmplY3QgcGwpOworCisgICAgU2V0UHJvcChQX0dVSUxEX1JFU1RSSUNUSU9OUywKKyAgICAgICAgICAgIChbUF9MRVZFTDozLAorICAgICAgICAgICAgICBQX1FQOjEwMCwKKyAgICAgICAgICAgICAgU1JfRlVOOiMnY2hlY2tdKSk7CisKKyAgICBzdHJpbmcgY2hlY2sob2JqZWN0IHBsKSB7CisgICAgICBpZihwbC0+UXVlcnlQcm9wKFBfTUFMRSkpCisgICAgICAgIHJldHVybiAwOworICAgICAgcmV0dXJuICJGdWVyIEZyYXVlbiBpc3QgZGFzIG5pY2h0cyFcbiI7CisgICAgfQorCitTSUVIRSBBVUNIOgorICAgIEdpbGRlbmZrdC46CisgICAgKiBFaW4vQXVzdHJpdHQ6IGJlaXRyZXRlbiwgYmVpX29kZXJfYXVzX3RyZXRlbiwgYXVzdHJldGVuCisgICAgKiBTb25zdGlnZXM6ICAgIFBfR1VJTERfTEVWRUxTCisgICAgU29uc3RpZ2VzOiAgICAgIC9zdGQvcmVzdHJpY3Rpb25fY2hlY2tlci5jCisKKzMuIE9rdCAyMDExIEdsb2luc29uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfR1VJTERfU0tJTExTIGIvZG9jL3Byb3BzL1BfR1VJTERfU0tJTExTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZTMwYTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9HVUlMRF9TS0lMTFMKQEAgLTAsMCArMSwyNCBAQAorUF9HVUlMRF9TS0lMTFMKK05BTUU6CisgICAgUF9HVUlMRF9TS0lMTFMgICAgICAgICAgICAiZ3VpbGRfc2tpbGxzIiAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvbmV3X3NraWxscy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICBEaWVzZSBHaWxkZW5wcm9wZXJ0eSBlbnRoYWVsdCBlaW4gTWFwcGluZyBtaXQgYWxsZW4gU2tpbGxzIHVuZAorICAgIFNwZWxscyBkZXIgR2lsZGUuCisKK0JFTUVSS1VOR0VOOgorICAgIE1hbiBzb2xsdGUgZGllc2UgUHJvcGVydHkgc29sbHRlIG5pY2h0IHBlciBIYW5kIHZlcmFlbmRlcm4sIHNvbmRlcm4KKyAgICBkaWUgRnVua3Rpb25lbiBBZGRTa2lsbCgpIGJ6dy4gQWRkU3BlbGwoKSBudXR6ZW4uCisKK1NJRUhFIEFVQ0g6CisgICAgR09iaiBWZXJ3YWx0ZW46ICAgTGVhcm5Ta2lsbCwgTGVhcm5TcGVsbCwgSW5pdGlhbFNraWxsQWJpbGl0eQorICAgICogU29uc3RpZ2VzOiAgICAgIEd1aWxkUmF0aW5nCisgICAgU3BlbGxib29rIExlcm5lbjogTGVhcm4sIFNwZWxsU3VjY2VzcywgRXJmb2xnLCBNaXNzZXJmb2xnCisgICAgKiBWZXJ3YWx0ZW46ICAgICAgQWRkU3BlbGwsIFF1ZXJ5U3BlbGwKKyAgICAqIFByb3BlcnRpZXM6ICAgICBQX1NCX1NQRUxMUywgUF9HTE9CQUxfU0tJTExQUk9QUywgUF9HVUlMRF9SQVRJTkcKKyAgICBTa2lsbHM6ICAgICAgICAgICBQX05FV1NLSUxMUywgc3BydWNoZXJtdWVkdW5nLCBza2lsbF9pbmZvX2xpc3RlCisKKzMuIE9rdCAyMDExIEdsb2luc29uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfR1VJTERfVElUTEUgYi9kb2MvcHJvcHMvUF9HVUlMRF9USVRMRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTU0MzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfR1VJTERfVElUTEUKQEAgLTAsMCArMSwzNyBAQAorUF9HVUlMRF9USVRMRQorTkFNRToKKyAgICAgUF9HVUlMRF9USVRMRQkJCSJndWlsZF90aXRsZSIgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgIC9zeXMvbmV3X3NraWxscy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGllc2UgUHJvcGVydHkgZW50aGFlbHQgZGVuIEdpbGRlbnRpdGVsIGRlcyBMZWJld2VzZW5zLCB3ZWxjaGVyIGRlcgorICAgICBHaWxkZW5zdHVmZSBkZXMgTGViZXdlc2VucyBlbnRzcHJpY2h0IHVuZCBqZWRvY2ggbnVyIGFuZ2V6ZWlndCB3aXJkLAorICAgICB3ZW5uIFBfVElUTEUgZGVzIExlYmV3ZXNlbnMgZ2xlaWNoIE51bGwgaXN0LgorCitCRU1FUktVTkdFTjoKKyAgICAgSW4gZGVyIFByb3BlcnR5IHNlbGJzdCB3aXJkIGVpZ2VudGxpY2ggZWluIE1hcHBpbmcgZWluZ2V0cmFnZW4sIHdlbGNoZXMKKyAgICAgZGllIEdpbGRlbm5hbWVuIGFscyBTY2hsdWVzc2VsIHVuZCBkaWUgZGF6dWdlaG9lcmlnZW4gR2lsZGVudGl0ZWwgYWxzCisgICAgIEVpbnRyYWcgZW50aGFlbHQuIEJlaSBkZXIgQWJmcmFnZSBkZXIgUHJvcGVydHkgd2lyZCBqZWRvY2ggZGllIEdpbGRlCisgICAgIGJlcnVlY2tzaWNodGlndCB1bmQgZGVyIGFrdHVlbGxlIEdpbGRlbnRpdGVsIHp1cnVlY2tnZWxpZWZlcnQuCisKK0JFSVNQSUVMRToKKwlGdWVyIGVpbmUgUHJvZ3JhbW1pZXJlcmdpbGRlIHdhZXJlIGZvbGdlbmRlcyBkZW5rYmFyOgorCSAgU2V0UHJvcChQX0dVSUxEX01BTEVfVElUTEVTLChbMToiZGVyIEFuZmFlbmdlciIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOiJkZXIgRm9ydGdlc2Nocml0dGVuZSIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOiJkZXIgUHJvZmkiXSkpOworCSAgU2V0UHJvcChQX0dVSUxEX0ZFTUFMRV9USVRMRVMsKFsxOiJkaWUgQW5mYWVuZ2VyaW4iLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOiJkaWUgRm9ydGdlc2Nocml0dGVuZSIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM6ImRpZSBQcm9mZXNzaW9uZWxsZSJdKSk7CisJRWluIHdlaWJsaWNoZXMgR2lsZGVubWl0Z2xpZWQgbWl0IGRlciBkcml0dGVuIEdpbGRlbnN0dWZlIHVuZCBvaG5lCisJUF9USVRMRSB3dWVyZGUgZGFubiBkZW4gVGl0ZWwgImRpZSBQcm9mZXNzaW9uZWxsZSIgdHJhZ2VuLiBEYXMgaGF0CisJendhciBuaWNodHMgbWl0IFByb2dyYW1taWVyZXJuIHp1IHR1biwgYWJlciB3aWUgaGVpc3N0IGVpZ2VudGxpY2gKKwllaW4gd2VpYmxpY2hlciAiUHJvZmkiPyEgOikKKworU0lFSEUgQVVDSDoKKyAgICAgUF9USVRMRSwgUF9HVUlMRCwgUF9HVUlMRF9MRVZFTCwKKyAgICAgUF9HVUlMRF9NQUxFX1RJVExFUywgUF9HVUlMRF9GRU1BTEVfVElUTEVTLAorICAgICBQX1NVQkdVSUxEX1RJVExFCisKKzI2LiBNYWVyeiAyMDA0IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9IQU5EUyBiL2RvYy9wcm9wcy9QX0hBTkRTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZGE3YzUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9IQU5EUwpAQCAtMCwwICsxLDU3IEBACitQX0hBTkRTCitOQU1FOgorICAgICBQX0hBTkRTICAgICAgICAgICAgICAgICAgICAiaGFuZHMiCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N5cy9saXZpbmcvY29tYmF0LmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBEaWVzZSBQcm9wZXJ0eSBlbnRoYWVsdCBlaW4gZHJlaWVsZW1lbnRpZ2VzIEFycmF5IG1pdAorICAgICBkZW4gZm9sZ2VuZGVuIEVpbnRyYWVnZW46CisgICAgIDEuIEVsZW1lbnQ6IFN0cmluZyBtaXQgZGVyIE1lbGR1bmcsIHdlbm4gb2huZSBXYWZmZW4gYW5nZWdyaWZmZW4KKyAgICAgICAgICAgICAgICAgd2lyZC4KKyAgICAgMi4gRWxlbWVudDogV2FmZmVua2xhc3NlLCB3ZW5uIG9obmUgV2FmZmVuIGFuZ2VncmlmZmVuIHdpcmQuCisgICAgIDMuIEVsZW1lbnQ6IEFycmF5IG1pdCBTY2hhZGVuc2FydGVuIChmcnVlaGVyIGF1Y2g6IFNjaGFkZW5zYXJ0KQorCisgICAgIGVpbSBTZXR6ZW4gZGllc2VyIFByb3BlcnR5IHdpcmQgYXVjaCBQX1RPVEFMX1dDIG1pdCB2ZXJhZW5kZXJ0LAorICAgICB3ZW5uIGRhcyBMZWJld2VzZW4ga2VpbmUgV2FmZmUgZ2V6dWVja3QgaGF0LiBTdGVja3QgZGFzIExlYmV3ZXNlbgorICAgICBlaW5lIGdlenVlY2t0ZSBXYWZmZSB3ZWcsIHNvIHdpcmQgZWJlbmZhbGxzIFBfVE9UQUxfV0MgbWl0IGRlcgorICAgICBXYWZmZW5rbGFzc2UgYXVzIFBfSEFORFMgYWt0dWFsaXNpZXJ0LiBadWVja3QgZGFzIExlYmV3ZXNlbiBlaW5lCisgICAgIFdhZmZlLCBzbyB3aXJkIFBfVE9UQUxfV0MgbWl0IGRlciBXYWZmZW5rbGFzc2UgZGVyIFdhZmZlIChQX1dDKQorICAgICB1ZWJlcnNjaHJpZWJlbi4gRGllIFByb3BlcnR5IFBfVE9UQUxfV0MgZW50aGFlbHQgc29taXQgaW1tZXIgZGllCisgICAgIGFrdHVlbGxlIEFuZ3JpZmZzc3RhZXJrZSBkZXMgTGViZXdlc2VuLgorCitCRU1FUktVTkdFTgorICAgICBJbiBhbHRlbiBPYmpla3RlbiBrYW5uIGVzIHZvcmtvbW1lbiwgZGFzcyBkYXMgZHJpdHRlIEVsZW1lbnQgKEFuZ2FiZSBkZXMKKyAgICAgU2NoYWRlbnN0eXBzKSBmZWhsdC4gRGllcyBpc3QgZWluZSBBbHRsYXN0LCBkaWUgQW5nYWJlIGRlcyBTY2hhZGVuc3R5cGVzCisgICAgIGlzdCBOSUNIVCBvcHRpb25hbC4pCisKK0JFSVNQSUVMOgorICAgICBFaW4gc3RhcmtlciBUYXVzZW5kZnVlc3NsZXIgbWl0IFNjaGxhZ3NjaGFkZW46CisKKyAgICAgICBTZXRQcm9wKFBfSEFORFMsKHsiIG1pdCB0YXVzZW5kIGtsZWluZW4gRnVlc3NjaGVuIiwxMDAwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAoe0RUX0JMVURHRU9OfSkgfSkpOworCisKKyAgICAgRWluIFNhZXVyZWRlZGFlbW9uOgorICAgICAgIFNldFByb3AoUF9IQU5EUywKKyAgICAgICAgICh7CisgICAgICAgICAgICIgbWl0IHNhZXVyZXRyaWVmZW5kZW4gS2xhdWVuIiwKKyAgICAgICAgICAgMjUwLAorICAgICAgICAgICAoe0RUX1JJUCwgRFRfQUNJRH0pCisgICAgICAgICB9KQorICAgICAgICk7CisKKyAgICAgSGllciB3dXJkZW4gZ2xlaWNoIHp3ZWkgU2NoYWRlbnNhcnRlbiBhbmdlZ2ViZW4sIGFsc28gd2lyZAorICAgICBNaXNjaHNjaGFkZW4gdmVydXJzYWNodC4gTWFuIHNvbGx0ZSBlcyBqZWRvY2ggbmljaHQgenUgc2VocgorICAgICB1ZWJlcnRyZWliZW4hIE1laHIgYWxzIHp3ZWkgb2RlciBkcmVpIGdsZWljaHplaXRpZyB2ZXJ3ZW5kZXRlCisgICAgIFNjaGFkZW5zYXJ0ZW4gbGFzc2VuIHNpY2gga2F1bSBtZWhyIGJlZ3J1ZW5kZW4uCisKK1NJRUhFIEFVQ0g6CisgICAgIFBfSEFORFNfVVNFRF9CWQorICAgICBQX01BWF9IQU5EUywgUF9VU0VEX0hBTkRTLCBQX0ZSRUVfSEFORFMKKyAgICAgVXNlSGFuZHMsIEZyZWVIYW5kcworICAgICBQX1RPVEFMX1dDLCBQX1dDCisgICAgIC9zdGQvbGl2aW5nL2NvbWJhdC5jLCAvc3RkL3dlYXBvbi9jb21iYXQuYywgL3N5cy9jb21iYXQuaAorCisyMi4wMi4yMDE0IFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0hBTkRTX1VTRURfQlkgYi9kb2MvcHJvcHMvUF9IQU5EU19VU0VEX0JZCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMGU1ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9IQU5EU19VU0VEX0JZCkBAIC0wLDAgKzEsMjEgQEAKK1BfSEFORFNfVVNFRF9CWQorTkFNRToKKyAgICAgUF9IQU5EU19VU0VEX0JZICAgICAgICAgICAiaGFuZHNfdXNlZF9ieSIKKworREVGSU5JRVJUIElOOgorICAgICAvc3lzL2xpdmluZy9jb21iYXQuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIEVudGhhZWx0IGVpbmUgTGlzdGUgbWl0IGRlbiBPYmpla3RlbiwgZGllIGRlcnplaXQgZGllIEhhZW5kZQorICAgICBkZXMgTGl2aW5ncyBiZWxlZ2VuLiBEYWJlaSBrb2VubmVuIE9iamVrdGUgbWVocm1hbHMgYXVmdGF1Y2hlbiwKKyAgICAgamUgbmFjaGRlbSB3aWUgdmllbGUgSGFlbmRlIHNpZSBiZWxlZ2VuLgorCitCRU1FUktVTkdFTjoKKyAgICAgRGFyZiBudXIgdWViZXIgVXNlSGFuZHMoKSB1bmQgRnJlZUhhbmRzKCkgbWFuaXB1bGllcnQgd2VyZGVuLgorCitTSUVIRSBBVUNIOgorICAgICBQX0hBTkRTCisgICAgIFBfTUFYX0hBTkRTLCBQX1VTRURfSEFORFMsIFBfRlJFRV9IQU5EUworICAgICBVc2VIYW5kcywgRnJlZUhhbmRzCisKKzEuRmViLjIwMDQgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0hBUkJPVVIgYi9kb2MvcHJvcHMvUF9IQVJCT1VSCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZTEwNDgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9IQVJCT1VSCkBAIC0wLDAgKzEsNjYgQEAKK05BTUU6CisgICAgUF9IQVJCT1VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoYXJib3VyX25hbWUiICAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy90cmFuc3BvcnQuaAorCitCRVNDSFJFSUJVTkc6CisgICAgQXJyYXkgbWl0IGVpbmRldXRpZ2VyIEJlemVpY2hudW5nIGRlcyAnSGFmZW5zJworCitCRU1FUktVTkdFTjoKKyAgICBEaWVzZSBQcm9wZXJ0eSB3aXJkIGluIFJhZXVtZW4gZ2VzZXR6dCwgZGllIGFscyBBbmxlZ2VyIGZ1ZXIgVHJhbnNwb3J0ZXIKKyAgICBkaWVuZW4gc29sbGVuLiBTaWUgZW50aGFlbHQgZWluIEFycmF5IGF1cyB6d2VpIEVsZW1lbnRlbiwgZWluZW0gU3RyaW5nCisgICAgdW5kIGVpbmVtIFN0cmluZy1BcnJheSwgenVtIEJlaXNwaWVsOgorCisgICAgKHsgInp1ciBTb25uZW5pbnNlbCIsICh7InNvbm5lbmluc2VsIn0pIH0pIG9kZXIgCisgICAgKHsgIm5hY2ggVGl0aXd1IiwgKHsidGl0aXd1In0pIH0pCisKKyAgICBEYW1pdCBiZWtvbW10IGRlciBTcGllbGVyIGJlaSBlaW5lciBBYmZyYWdlIHNlaW5lciBSZWlzZXJvdXRlIG1pdHRlbHMKKyAgICAicmVpc2Ugcm91dGUiIGVpbmUgQXVzZ2FiZSB3aWUgCisgICAgICAnRHUgcmVpc3QgbWl0IGRlbSBGbG9zcyBuYWNoIFRpdGl3dScgb2RlcgorICAgICAgJ0R1IHJlaXN0IG1pdCBkZW0gV2FsIHp1ciBTb25uZW5pbnNlbCcuCisKKyAgICBEYXMgendlaXRlIEVsZW1lbnQgZGVyIFByb3BlcnR5IGVudGhhZWx0IGVpbmUgTGlzdGUgZGVyIElEcywgbWl0IGRlbmVuCisgICAgc2ljaCBkZXIgSGFmZW4gbWl0IGRlbSBCZWZlaGwgInJlaXNlIG5hY2ggPElEPiIgYW5zcHJlY2hlbiBsYWVzc3QuIEltCisgICAgQmVpc3BpZWwgb2JlbiB3dWVyZGUgYWxzbyAicmVpc2UgbmFjaCBzb25uZW5pbnNlbCIgdW5kIAorICAgICJyZWlzZSBuYWNoIHRpdGl3dSIgYWt6ZXB0aWVydCB3ZXJkZW4uIERlciBlcnN0ZSBFaW50cmFnIGluIGRpZXNlciBJRC0KKyAgICBMaXN0ZSB3aXJkIGluIGRlciBBdXNnYWJlIGRlcyBCZWZlaGxzICJyZWlzZSByb3V0ZSIgdmVyd2VuZGV0LCBzb2xsdGUKKyAgICBhbHNvIGRlbiBBbmxlZ2VvcnQga29ycmVrdCBiZXplaWNobmVuIHVuZCBuaWNodCB6LkIuIGVpbmUgQWJrdWVyenVuZworICAgIGVudGhhbHRlbi4KKyAgICBFcyBiaWV0ZXQgc2ljaCBhbiwgYmVpIGJlc3RpbW10ZW4sIGRla2xpbmllcmJhcmVuIEJlemVpY2hudW5nZW4gYWxsZQorICAgIFZhcmlhbnRlbiBlaW56dXRyYWdlbiwgei5CLiAidmVybG9yZW5lcyBsYW5kIiB1bmQgenVzYWV0emxpY2gKKyAgICAidmVybG9yZW5lIGxhbmQiIHVuZCAidmVybG9yZW5lbiBsYW5kIiwgZGFtaXQgYWxsZSBWYXJpYW50ZW4gdm9uIAorICAgICJyZWlzZSBuYWNoIC4uLiIgZnVua3Rpb25pZXJlbi4KKworICAgIElzdCBpbiBlaW5lbSBIYWZlbiBkaWVzZSBQcm9wZXJ0eSBuaWNodCBnZXNldHp0LCBzbyBiZWtvbW10IGRlciAKKyAgICBTcGllbGVyIGtlaW5lcmxlaSBIaW53ZWlzIGRhcmF1Ziwgd29oaW4gaWhuIGVpbiBiZXN0aW1tdGVyIFRyYW5zLQorICAgIHBvcnRlciBiZWZvZXJkZXJ0LiAKKyAgICBTdGF0dGRlc3NlbiBlcmhhZWx0IGVyIGRpZSBCZXplaWNobnVuZyAndW5iZWthbm50Jy4KKworSElOV0VJU0U6CisgICAgV2lyZCBkZXIgendlaXRlIFBhcmFtZXRlciBpbiBkaWVzZXIgUHJvcGVydHksIGQuaC4gZGllIExpc3RlIGRlciAKKyAgICBBbmxlZ2VyLUlEcywgbmljaHQga29ycmVrdCBnZXNldHp0LCBrYW5uIGRhcyBkYXp1IGZ1ZWhyZW4sIGRhc3MgU3BpZWxlcgorICAgIGRlbiBoaWVyIGFubGVnZW5kZW4gVHJhbnNwb3J0ZXIgbmljaHQgYmVudXR6ZW4ga29lbm5lbiwgd2VpbCBlcworICAgIGtlaW5lIHNpbm52b2xsZSBTeW50YXggZ2lidCwgdW0gZGVuIGdld3VlbnNjaHRlbiBaaWVsaGFmZW4genUgZmluZGVuLgorCisgICAgWnUgYWNodGVuIGlzdCBhdWNoIGRhcmF1ZiwgZGFzIGRlciBlcnN0ZSBFaW50cmFnIHVudmVyYWVuZGVydCBpbiBlaW5lciAKKyAgICBNZWxkdW5nIGFuIGRlbiBTcGllbGVyIGF1c2dlZ2ViZW4gd2lyZCwgZC5oLiBHcm9zcy11bmQgS2xlaW5zY2hyZWlidW5nCisgICAgc29sbHRlIGtvcnJla3Qgc2Vpbi4KKworSElTVE9SSUU6CisgICAgRnJ1ZWhlciB3YXIgZGVyIHp3ZWl0ZSBFaW50cmFnIGluIGRpZXNlciBQcm9wZXJ0eSBlaW4gZWluemVsbmVyIFN0cmluZy4KKyAgICBFcyBleGlzdGllcnQgZWluZSBTZXRNZXRob2RlIGF1ZiBkaWVzZXIgUHJvcGVydHksIGRpZSBzb2xjaGUgRGF0ZW4gaW4KKyAgICBhbHRlbSBDb2RlIGF1ZiBkaWUgbmV1ZSBEYXRlbnN0cnVrdHVyIHVtYmllZ3QuIERpZXMgZnVlaHJ0IGRhenUsIGRhc3MKKyAgICBiZWkgc29sY2hlbiBPYmpla3RlbiBkaWUgaW0gZ2VsYWRlbmVuIFJhdW0gZW50aGFsdGVuZW4gRGF0ZW4gbmljaHQgbWl0CisgICAgZGVuIERhdGVuIGltIEZpbGUgdWViZXJlaW5zdGltbWVuLiBEaWVzIG1vZWdlIGFiZXIgYml0dGUgbmllbWFuZCAKKyAgICB6dW0gQW5sYXNzIG5laG1lbiwgaW4gbmV1ZW0gQ29kZSB2ZXJhbHRldGUgRGF0ZW4gaW4gZGllIFByb3BlcnR5IHp1IAorICAgIHNjaHJlaWJlbiEKKyAgICAKK1NJRUhFIEFVQ0g6CisgIFByb3BlcnRpZXM6ICAgICBQX05PX1RSQVZFTElORywgUF9UUkFWRUxfSU5GTworICBGdW5rdGlvbmVuOiAgICAgQWRkUm91dGUoTCkKKyAgU3BpZWxlcmJlZmVobGU6IHJlaXNlCisgIHdlaXRlcmUgRG9rdTogICAvZC9pbnNlbG4vc2NoaWZmZS9Ib3dUbworCitMRVRaVEUgQUVOREVSVU5HOgorMjAxNS1KYW4tMTgsIEFyYXRob3JuCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9IQVVTX0VSTEFVQlQgYi9kb2MvcHJvcHMvUF9IQVVTX0VSTEFVQlQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFjNjQ5NQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0hBVVNfRVJMQVVCVApAQCAtMCwwICsxLDI5IEBACitOQU1FOgorICAgIFBfSEFVU19FUkxBVUJUICAgICAgICAgICAgICAgICJoYXVzX2VybGF1YnQiICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9yb29tL2Rlc2NyaXB0aW9uLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBIaWVyIGRhcmYgZWluIFNlaGVyaGF1cyBhYmdlc3RlbGx0IHdlcmRlbgorCitCRU1FUktVTkdFTjoKKyAgICAgRGllc2UgUHJvcGVydHkgc29sbHRlIG5pY2h0IHBlciBkZWZhdWx0IGluIFJhZXVtZW4gYXVmIGVpbmVuIFdlcnQgPiAwCisgICAgIGdlc2V0enQgd2VyZGVuIHVtIGVpbmVtIFdpbGR3dWNocyBhbiBTZWhlcmhhdXMoLXJ1aW5lbikgdm9yenViZXVnZW4uCisgICAgIEF1Y2ggc2VpIGRhcmF1ZiBnZWFjaHRldCwgZGFzcyBpbiBSYWV1bWVuIGRpZSBQX0lORE9PUlMgYXVmIGVpbmVuIAorICAgICBXZXJ0ID4gMCBoYWJlbiwgcGVyIGRlZmF1bHQgbmljaHQgZ2ViYXV0IHdlcmRlbiBrYW5uLiAgICAgCisgICAgIEhpZXIgbGllYmVyIGRpZSBQcm9wZXJ0eSBwZXIgSGFuZCBhdWYgMSBzZXR6ZW4gdW5kIG5hY2ggZGVtIEF1ZnN0ZWxsZW4KKyAgICAgZGVzIEhhdXNlcyB3aWVkZXIgbG9lc2NoZW4uCisgICAgICAKKyAgICAgeGNhbGwgJGgtPlNldFByb3AoUF9IQVVTX0VSTEFVQlQsMSk7CisKKyAgICAgQW5nZW1lcmt0IHNlaSBub2NoLCBkYXNzIGRlciBNYWdpZXIgZGVtIGRlciBSYXVtIGdlaG9lcnQgdWViZXIgSGF1c2JhdQorICAgICBlbnRzY2hlaWRldCB1bmQgbmljaHQgZGVyIFJlZ2lvbnNtYWdpZXIuIEluIGplZGVtIEZhbGwgUnVlY2tzcHJhY2hlIAorICAgICBoYWx0ZW4gZmFsbHMgZGVyIGVudHNwcmVjaGVuZGUgTWFnaWVyIHp1bWluZGVzdCBhYiB1bmQgYW4gYW53ZXNlbmQgc2VpbgorICAgICBzb2xsdGUuCisKKyAgICAgVW50ZXIgL2RvYy9iZWlzcGllbGUvbWlzYyBsaWVndCBlaW4gRmlsZSwgaW4gZGVtIGRva3VtZW50aWVydCBpc3QsCisgICAgIHdpZSBuYWNoIEFlbmRlcnVuZ2VuIGFtIFNlaGVyaGF1cyB6dSB2ZXJmYWhyZW4gaXN0LgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBGcmkgTm92IDI2IDE1OjQxOjQ3IDE5OTkgYnkgVGlsbHkKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0hCIGIvZG9jL3Byb3BzL1BfSEIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVlMmRjYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0hCCkBAIC0wLDAgKzEsOSBAQAorTkFNRToKKyAgICBQX0hCICAgICAgICAgICAgICAgICAgICAgICAgICAiaGIiICAgICAgICAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcHJvcGVydGllcy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGllc2UgUHJvcGVydHkgd2lyZCBnZXNldHp0LCB3ZW5uIGRhcyBNb25zdGVyIGltbWVyIGVpbmVuCisgICAgIGhlYXJ0X2JlYXQgaGFiZW4gc29sbC4gKFZPUlNJQ0hULCBudXIgd2VubiBlcyBXSVJLTElDSCBzZWluIG11c3MhKQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfSEVBTCBiL2RvYy9wcm9wcy9QX0hFQUwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQyODAyZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0hFQUwKQEAgLTAsMCArMSwzMiBAQAorTkFNRToKKyAgICAgUF9IRUFMICAgICAgICAgICAgICAgICAgICAgICAgImhlYWwiICAgICAgICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N5cy9wcm9wZXJ0aWVzLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBOdW1lcmlzY2hlciBXZXJ0LCBkZXIgYmVpbSBWZXJ6ZWhyIGVpbmVyIExlaWNoZSB6dSBkZW4gTGViZW5zcHVua3RlbiAKKyAgICAgZGVzamVuaWdlbiBoaW56dWdlemFlaGx0IHdpcmQsIGRlciBkaWUgTGVpY2hlIGlzc3QuIERlciBXZXJ0IGthbm4gYXVjaCAKKyAgICAgbmVnYXRpdiBzZWluLiBGYWxscyBkaWUgTGVpY2hlIGRlbiBtYXhpbWFsZW4gVmVyZmFsbHN6dXN0YW5kIGVycmVpY2h0IAorICAgICBoYXQsIHdpcmQgZGllc2VyIFdlcnQgYXV0b21hdGlzY2ggYXVmIC00IGdlc2V0enQsIHNvZmVybiBuaWNodCBzY2hvbgorICAgICBlaW4gZ2VyaW5nZXJlciBXZXJ0IGVpbmdldHJhZ2VuIGlzdC4KKworICAgICBXZXJ0ZSB1bnRlciAtNCBzaW5kIHNlaHIgc3BhcnNhbSB1bmQgbnVyIGluIGJlZ3J1ZW5kZXRlbiBFaW56ZWxmYWVsbGVuCisgICAgIHp1IHNldHplbi4gRGllIFJlZ2lvbnNtYWdpZXIgd2VyZGVuIGF1ZiBzaW5udm9sbGUgV2VydGViZXJlaWNoZSBpbgorICAgICBpaHJlbSBadXN0YWVuZGlna2VpdHNiZXJlaWNoIGFjaHRlbiB1bmQgZ2dmLiBHcmVuendlcnRlIGZ1ZXIgaWhyZSAKKyAgICAgUmVnaW9uIGZlc3RsZWdlbi4KKworICAgICBEaWUgR2lsZGVuIGtvZW5uZW4gUF9IRUFMIGFiZnJhZ2VuIHVuZCBlaWdlbmUsIGdyb2JlIEluZm9ybWF0aW9uc3RleHRlCisgICAgIGF1c2dlYmVuLCBkaWUgZGVuIFNwaWVsZXIgdWViZXIgZGVuIHp1IGVyd2FydGVuZGVuIEVmZmVrdCBiZWltIEVzc2VuCisgICAgIGVpbmVyIExlaWNoZSBpbmZvcm1pZXJlbi4KKworICAgICBQb3NpdGl2ZSBXZXJ0ZSB2b24gUF9IRUFMIHNpbmQgYmVpIGRlciBIZWlsdW5nc2JhbGFuY2UgYWxzIEhlaWxzdGVsbGUKKyAgICAgenUgYmVhbnRyYWdlbi4KKworICAgICBGdWVyIG5pY2h0IGFsbHp1IGhhcnRlIE5QQ3Mgc29sbHRlIFBfSEVBTCBhdWYgMCBnZXNldHp0IHNlaW4uIERpZXNlcgorICAgICBXZXJ0IGlzdCBnbGVpY2h6ZWl0aWcgZGVyIFN0YW5kYXJkd2VydC4KKworU0lFSEUgQVVDSDoKKyAgICAgL3N0ZC9jb3Jwc2UsIFF1ZXJ5SGVhbEluZm8oKQorICAgICAKKzMxLjAzLjIwMDggQXJhdGhvcm4KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0hFTFBFUl9OUEMgYi9kb2MvcHJvcHMvUF9IRUxQRVJfTlBDCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNzFlNDcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9IRUxQRVJfTlBDCkBAIC0wLDAgKzEsMzAgQEAKK1BfSEVMUEVSX05QQworCitOQU1FOgorICAgICBQX0hFTFBFUl9OUEMgICAgICAgICAgICAgInN0ZDpoZWxwZXJfbnBjCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N5cy9saXZpbmcvY29tYmF0LmgKKworQkVTQ0hSRUlCVU5HOgorICAgIE1pdCBkaWVzZXIgUHJvcCBsYWVzc3Qgc2ljaCBoZXJhdXNmaW5kZW4sIG9iIGVpbiBOUEMgZWluZW0gU3BpZWxlciBoaWxmdAorICAgIGJ6dy4gd2VsY2hlIE5QQyBlaW5lbSBTcGllbGVyIGhlbGZlbi4KKyAgICBXaXJkIGRpZXNlIFByb3AgaW4gZWluZW0gTlBDIGFiZ2VmcmFndCwgZW50aGFlbHQgc2llIGVpbiBBcnJheSAKKyAgICAgICh7IHNwaWVsZXJvYmpla3QsIGZsYWdzIH0pIG9kZXIgMC4KKyAgICBXaXJkIGRpZXNlIFByb3AgaW4gZWluZW0gU3BpZWxlciBhYmdlZnJhZ3QsIGVudGhhZWx0IHNpZSBlaW4gTWFwcGluZworICAgICAgKFtucGNvYmpla3QxOiBmbGFnczEsIG5wYy1vYmpla3QyOiBmbGFnczJdKS4KKworICAgIDxmbGFncz4gaXN0IGVpbiBJbnRlZ2VyLCBkZXIgZWluZSBSZWloZSB2b24gdmVyLW9kZXItdGVuIEtvbnN0YW50ZW4gKHMuCisgICAgUmVnaXN0ZXJIZWxwZXJOUEMpIGVudGhhbHRlbiBrYW5uLgorCitCRU1FUktVTkdFTjoKKyAgICBEaWVzZSBQcm9wIHdpcmQgYXV0b21hdGlzY2ggdm9uIFJlZ2lzdGVySGVscGVyTlBDKCkgdW5kCisgICAgVW5yZWdpc3RlckhlbHBlck5QQygpIHZlcndhbHRldC4gQml0dGUgYWVuZGVydCBzaWUgbmljaHQgcGVyIEhhbmQuCisKK0JFSVNQSUVMOgorICAgIHMuIFJlZ2lzdGVySGVscGVyTlBDKCkuCisKK1NJRUhFIEFVQ0g6CisgICAgIFJlZ2lzdGVySGVscGVyTlBDKCksIFVucmVnaXN0ZXJIZWxwZXJOUEMoKQorCisxMC4wMy4yMDA5LCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9IRUxQRVJfT0JKRUNUUyBiL2RvYy9wcm9wcy9QX0hFTFBFUl9PQkpFQ1RTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkZjAzMWQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9IRUxQRVJfT0JKRUNUUwpAQCAtMCwwICsxLDI1IEBACitQX0hFTFBFUl9PQkpFQ1RTCisKK05BTUU6CisgICAgIFBfSEVMUEVSX09CSkVDVFMgImxpYl9wX2hlbHBlcl9vYmplY3RzIgorCitERUZJTklFUlQgSU46CisgICAgIDxsaXZpbmcvaGVscGVycy5oPgorCitCRVNDSFJFSUJVTkc6CisgICAgIERpZXNlIFByb3BlcnR5IGVudGhhZWx0IGVpbmUgTGlzdGUgdm9uIEhpbGZzb2JqZWt0ZW4sIGRpZSBkYXMgTGViZXdlc2VuLAorICAgICBpbiBkZW0gc2llIGdlc2V0enQgaXN0LCBiZWkgYmVzdGltbXRlbiBBa3Rpdml0YWV0ZW4gd2llIFRhdWNoZW4gb2RlcgorICAgICBGbGllZ2VuL1NlZ2VsbiB1bnRlcnN0dWV0enQuIERpZSBQcm9wZXJ0eSBlbnRoYWVsdCBlaW4gTWFwcGluZyBkZXIgRm9ybQorICAgICAoWyBIRUxQRVJfVFlQRSA6ICh7IENhbGxiYWNrLUNsb3N1cmVzIH0pIF0pLgorCitCRU1FUktVTkdFTjoKKyAgICAgRXh0ZXJuZSBNYW5pcHVsYXRpb25lbiBhbiBkaWVzZXIgUHJvcGVydHkgYml0dGUgdW50ZXJsYXNzZW4sIHp1bSBFaW4tCisgICAgIHVuZCBBdXN0cmFnZW4gdm9uIE9iamVrdGVuIGdpYnQgZXMgZGllIHVudGVuIGF1ZmdlZnVlaHJ0ZW4gTWV0aG9kZW4uCisKK1NJRUhFIEFVQ0g6CisgICAgIE1ldGhvZGVuOiAgICBSZWdpc3RlckhlbHBlck9iamVjdChMKSwgVW5yZWdpc3RlckhlbHBlck9iamVjdChMKQorICAgICBQcm9wZXJ0aWVzOiAgUF9BRVJJQUxfSEVMUEVSUywgUF9BUVVBVElDX0hFTFBFUlMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMTguMDIuMjAxMywgQXJhdGhvcm4KKwpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfSElERV9FWElUUyBiL2RvYy9wcm9wcy9QX0hJREVfRVhJVFMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM5MmE0YQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0hJREVfRVhJVFMKQEAgLTAsMCArMSwzNSBAQAorUF9ISURFX0VYSVRTCitOQU1FOgorICAgICBQX0hJREVfRVhJVFMgICAgICAgICAgICAgICAgICAiaGlkZV9leGl0cyIKKworREVGSU5JRVJUIElOOgorICAgICAvc3lzL3Jvb20vZXhpdHMuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIElzdCBkaWVzZSBQcm9wZXJ0eSBpbiBlaW5lbSBSYXVtIGF1ZiBlaW5lbiBJbnRlZ2Vyd2VydCB1bmdsZWljaCAwCisgICAgIGdlc2V0enQsIHdlcmRlbiBlaW5lbSBTcGllbGVyIGZ1ZXIgZGllc2VuIFJhdW0ga2VpbmUgQXVzZ2FlbmdlIGFuZ2V6ZWlndC4KKyAgICAgQXVjaCBkZXIgVGV4dCAiS2VpbmUgc2ljaHRiYXJlbiBBdXNnYWVuZ2UuIiAob2RlciBzbykga29tbXQgbmljaHQuCisgICAgIEFsdGVybmF0aXYga2FubiBtYW4gYXVjaCBlaW4gYXJyYXkgdm9uIHN0cmluZ3MgdWViZXJnZWJlbi4gSW4gZGllc2VtCisgICAgIEZhbGwgd2VyZGVuIGFsbCBkaWUgQXVzZ2FlbmdlIG5pY2h0IGFuZ2V6ZWlndCwgZGVyZW4gSW5kZXggaW4gUF9FWElUUworICAgICBpbiBkZW0gYXJyYXkgdm9ya29tbXQuCisgICAgIEluIGRpZXNlbSBGYWxsIHdpcmQgZ2dmLiBkZXIgVGV4dCAiS2VpbmUgc2ljaHRiYXJlbiBBdXNnYWVuZ2UuIgorICAgICBhdXNnZWdlYmVuLgorCitCRUlTUElFTDoKKyAgICAgQWRkRXhpdCgicmF1cyIsICIvZ2Fuei93by9hbmRlcnMiKTsKKyAgICAgQWRkRXhpdCgid2VpdGVyIiwgIi9pbi9kZXIvbmFlaGUiKTsKKworICAgICAvLyBLRUlORSBBdXNnYWVuZ2UgYW56ZWlnZW4uIE5vY2ggbmljaHQgbWFsLCBkYXNzIG1hbiBrZWluZSBzaWVodC4KKyAgICAgU2V0UHJvcChQX0hJREVfRVhJVFMsIDEpOworCisgICAgIC8vIERlciBBdXNnYW5nIHdlaXRlciB3aXJkIG5pY2h0IGFuZ2V6ZWlndC4KKyAgICAgU2V0UHJvcChQX0hJREVfRVhJVFMsICh7IndlaXRlciJ9KSApOworCisgICAgIC8vIEtlaW5lbiBBdXNnYW5nIHplaWdlbiwgYWJlciBkZW4gVGV4dCwgZGFzcyBrZWluZXIgc2ljaHRiYXIsIGF1c2dlYmVuLgorICAgICBTZXRQcm9wKFBfSElERV9FWElUUywgKHsid2VpdGVyIiwgInJhdXMifSkgKTsKKworU0lFSEUgQVVDSDoKKyAgICAgQWVobmxpY2hlczoJUF9TSE9XX0VYSVRTCisgICAgIFNvbnN0aWdlczoJCUFkZEV4aXQoKSwgR2V0RXhpdHMoKSwgaW50X2xvbmcoKSwgaW50X3Nob3J0KCkKKworMjUuIEFwciAxOTk2IEhpZ2hsYW5kZXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9ISVNUTUlOIGIvZG9jL3Byb3BzL1BfSElTVE1JTgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODRkOTBjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfSElTVE1JTgpAQCAtMCwwICsxLDggQEAKK05BTUU6CisgICAgUF9ISVNUTUlOICAgICAgICAgICAgICAgICAgICAgImhpc3RtaW4iICAgICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3BsYXllci5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgTWluaW1hbGUgTGFlbmdlLCBkaWUgZWluZSBaZWlsZSBoYWJlbiBtdXNzLCB1bSBpbiBkaWUgSGlzdG9yeSB6dSBrb21tZW4KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0hJVF9GVU5DIGIvZG9jL3Byb3BzL1BfSElUX0ZVTkMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViM2IzMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0hJVF9GVU5DCkBAIC0wLDAgKzEsMjIgQEAKK1BfSElUX0ZVTkMKKworTkFNRToKKyAgICAgUF9ISVRfRlVOQyAiaGl0X2Z1bmMiCisKK0RFRklOSUVSVCBJTjoKKyAgICAgPHdlYXBvbi5oPgorCitCRVNDSFJFSUJVTkc6CisgICAgIEZhbGxzIGVpbiBPYmpla3QgZWluZSBIaXRGdW5jKCkgZnVlciBkaWUgV2FmZmUgZGVmaW5pZXJ0LCBzbyBtdXNzCisgICAgIGRpZXNlcyBPYmpla3QgaW4gZGllc2VyIFByb3BlcnR5IGVpbmdldHJhZ2VuIHdlcmRlbi4KKworICAgICBEaWUgQXVzd2VydHVuZyBkaWVzZXIgUHJvcGVydHkgZXJmb2xndCBpbiBRdWVyeURhbWFnZSgpLgorCitCRUlTUElFTEU6CisgICAgIFNpZWhlIGRhcyBCZWlzcGllbCB6dSBIaXRGdW5jKCkKKworU0lFSEUgQVVDSDoKKyAgICAgL3N0ZC93ZWFwb24uYywgSGl0RnVuYygpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFN1biBNYXkgMTkgMTU6Mzc6MzUgMTk5NiBieSBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0hPTUVQQUdFIGIvZG9jL3Byb3BzL1BfSE9NRVBBR0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q5MDQzOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0hPTUVQQUdFCkBAIC0wLDAgKzEsOCBAQAorTkFNRToKKyAgICBQX0hPTUVQQUdFICAgICAgICAgICAgICAgICAgICAiaG9tZXBhZ2UiICAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcGxheWVyL2Jhc2UuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIERpZSBIb21lcGFnZSBlaW5lcyBTcGllbGVycyAobWl0IGRlbSBCZWZlaGwgJ3VybCcgenUgc2V0emVuKS4KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0hQIGIvZG9jL3Byb3BzL1BfSFAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJhZWE3NAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0hQCkBAIC0wLDAgKzEsMjUgQEAKK05BTUU6CisgICAgUF9IUCAgICAgICAgICAgICAgICAgICAgICAgICAgImhwIgorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9saXZpbmcvbGlmZS5oCisKK0JFU0NIUkVJQlVORzoKKworICAgICAtIExlYmV3ZXNlbgorICAgICAgIEFuemFobCBkZXIgTGViZW5zcHVua3RlIGRlcyBXZXNlbnMuCisKKyAgICAgLSBTcGVpc2VuL0tuZWlwZW4KKyAgICAgICBIZWlsd2lya3VuZyBlaW5lciBQb3J0aW9uIGRlciBTcGVpc2UgYXVmIGRpZSBMZWJlbnNwdW5rdGUKKyAgICAgICBkZXMgS29uc3VtZW50ZW4KKworU0lFSEUgQVVDSDoKKyAgICAgUHJvcHM6CQlQX01BWF9IUAorICAgICBWZXJhZW5kZXJ1bmc6CXJlZHVjZV9oaXRfcG9pbnRzKCksIHJlc3RvcmVfaGl0X3BvaW50cygpCisJCQlkb19kYW1hZ2UoTCksIERlZmVuZChMKQorCQkJYnVmZmVyX2hwKCkKKyAgICAgVWViZXJ3YWNodW5nOglBZGRIcEhvb2soTCkKKyAgICAgU3BlaXNlbi9LbmVpcGVuOiAgIHN0ZC9wdWIsIHdpei9mb29kLCBjb25zdW1lCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogVGh1IE9jdCAyOCAxMjoxNTowMCAyMDEwIGJ5IENhbGRyYQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0hQX0RFTEFZIGIvZG9jL3Byb3BzL1BfSFBfREVMQVkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgwN2FkOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0hQX0RFTEFZCkBAIC0wLDAgKzEsMTAgQEAKK05BTUU6CisgICAgUF9IUF9ERUxBWSAgICAgICAgICAgICAgICAgImhwX2RlbGF5IiAgICAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9saXZpbmcvbGlmZS5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgQW56YWhsIGRlciBoZWFydF9iZWF0cywgYmlzIFBfSFAgdW0gZWluZW4gUHVua3QgcmVnZW5lcmllcnQuCisgICAgIEFlbmRlcnVuZ2VuIGRpZXNlciBQcm9wZXJ0eSBpbiBTcGllbGVybiBiZWR1ZXJmZW4gZGVyIAorICAgICBHZW5laG1pZ3VuZyBkZXMgRU0gZnVlciBCYWxhbmNlLgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfSFBfSE9PS1MgYi9kb2MvcHJvcHMvUF9IUF9IT09LUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGYxYTFlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfSFBfSE9PS1MKQEAgLTAsMCArMSwxOSBAQAorTkFNRToKKyAgICBQX0hQX0hPT0tTICAgICAgICAgICAgICAgICAgICAiaHBfaG9va3MiICAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcHJvcGVydGllcy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgV2VsY2hlIE9iamVrdGUgc29sbGVuIGJlaSBIUC1BZW5kZXJ1bmdlbiBiZW5hY2hyaWNodGlndCB3ZXJkZW4/CisgICAgIERpZXNlIFByb3BlcnR5IGJpdHRlIE5JQ0hUIG1hbmlwdWxpZXJlbiEgWnVtIEVpbi0gdW5kIEF1c3RyYWdlbiBzdGVoZW4KKyAgICAgaGllcmZ1ZXIgQWRkSHBIb29rKCkgdW5kIFJlbW92ZUhwSG9vaygpIGJlcmVpdC4KKworQkVNRVJLVU5HRU46CisgICAgRGFzIG5ldWVyZSBIb29rc3lzdGVtIChzLiBNYW5wYWdlIHN0ZC9ob29rcykgc3RlbGx0IGViZW5mYWxscyBIb29rcyB6dXIKKyAgICBVZWJlcndhY2h1bmcgdm9uIFBfSFAgYmVyZWl0LgorCitTSUVIRSBBVUNIOgorICAgIEFkZEhwSG9vaygpLCBSZW1vdmVIcEhvb2soKSwKKyAgICBOb3RpZnlIcENoYW5nZSgpCisgICAgc3RkL2hvb2tzCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9IVU5UVElNRSBiL2RvYy9wcm9wcy9QX0hVTlRUSU1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3N2FiMTgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9IVU5UVElNRQpAQCAtMCwwICsxLDM1IEBACitQX0hVTlRUSU1FIChpbnQpCisKK05BTUU6CisgICAgIFBfSFVOVFRJTUUJCQkJCSJwX2xpYl9odW50dGltZSIKKworREVGSU5JRVJUIElOOgorICAgICAvc3lzL2xpdmluZy9jb21iYXQuaAorCitCRVNDSFJFSUJVTkc6CisgICAgTWl0IGRpZXNlciBQcm9wZXJ0eSBsYWVzc3Qgc2ljaCBmZXN0bGVnZW4sIHdpZSBsYW5nZSBlaW4gTW9uc3RlciBlaW5lbiAKKyAgICBHZWduZXIgdmVyZm9sZ3QgKGFsc28gYXV0b21hdGlzY2ggYW5ncmVpZnQpLCBuYWNoZGVtIGRpZXNlciBnZWZsb2hlbiBpc3QuCisgICAgRGllIEFuZ2FiZSBlcmZvbGd0IGluIFNla3VuZGVuLgorICAgIERpZSBTdGFuZGFyZHplaXQgaXN0IDYwMHMgKDMwMCBIZWFydGJlYXRzKS4KKworQkVNRVJLVU5HRU46CisgICAgMS4gV2VubiBkZXIgU3RhbmRhcmR3ZXJ0IGFremVwdGFiZWwgaXN0LCBiaXR0ZSBkaWUgUHJvcCBhdWNoIG5pY2h0IHNldHplbi4KKyAgICAyLiBFbnRoYWVsdCBkaWUgUHJvcGVydHkga2VpbmVuIEludGVnZXIgb2RlciBpc3Qgc2llIDw9IDAsIHdpcmQgc2llIAorICAgICAgIGlnbm9yaWVydCB1bmQgZGVyIFN0YW5kYXJkd2VydCB2b24gNjAwcyB2ZXJ3ZW5kZXQuCisgICAgMy4gS2FlbXBmdCBtYW4gbWl0IGVpbmVtIExlYmVud2VzZW4gbWl0IGVpbmVtIGdyb2Vzc2VyZW4gV2VydCBhbHMgbWFuIAorICAgICAgIHNlbGJlciB1bmQgbWFuIHNlbGJlciBoYXQgZGFzIFZlcmZvbGdlbiBlaW5nZXN0ZWxsdCwgZGVyIEdlZ25lciBhYmVyIAorICAgICAgIG5pY2h0LCB3aXJkIGRpZXNlciBiZWltIFJlaW5rb21tZW4gZGVuIEthbXBmIG5ldSBzdGFydGVuICh1bmQgZGVuIAorICAgICAgIGVyc3RlbiBTY2hsYWcgaGFiZW4pLgorCitCRUlTUElFTDoKKyAgICBFaW4gTlBDIHNvbGwgc2ljaCBlcnN0IGVpbmUgU3R1bmRlIG5hY2ggRmx1Y2h0IGRlcyBHZWduZXJzIGJlcnVoaWdlbi4KKyAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSB7CisgICAgICAuLi4KKyAgICAgIFNldFByb3AoUF9IVU5UVElNRSwgMzYwMCk7CisgICAgfQorCitTSUVIRSBBVUNIOgorICAgICBJbnNlcnRTaW5nbGVFbmVteSwgSW5zZXJ0RW5lbXkKKyAgICAgL3N0ZC9saXZpbmcvY29tYmF0LmMKKworMTMuMDMuMjAwOCwgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfSURTIGIvZG9jL3Byb3BzL1BfSURTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMTQwN2IKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9JRFMKQEAgLTAsMCArMSwyNSBAQAorUF9JRFMKKworTkFNRToKKyAgICAgUF9JRFMgImlkcyIKKworREVGSU5JRVJUIElOOgorICAgICA8dGhpbmcvZGVzY3JpcHRpb24uaD4KKworQkVTQ0hSRUlCVU5HOgorICAgICBJbiBkaWVzZXIgUHJvcGVydHkgc3RlaHQgZWluIEFycmF5IHZvbiBkZW4gU3RyaW5ncywgbWl0IGRlbmVuIHNpY2ggZGFzCisgICAgIE9iamVrdCBhbnNwcmVjaGVuIGxhZXNzdC4gRGllIFZlcndhbHR1bmcgZGllc2VyIFByb3BlcnR5IGVyZm9sZ3QgdWViZXIKKyAgICAgZGllIEZ1bmt0aW9uZW4gQWRkSWQoKSB1bmQgUmVtb3ZlSWQoKS4KKworICAgICBEZXIgSW5oYWx0IGRpZXNlciBQcm9wZXJ0eSB3aXJkIHZvbiBkZW4gRnVua3Rpb25lbiBpZCgpIHVuZCAoaW5kaXJla3QpCisgICAgIHByZXNlbnQoKSBhdXNnZXdlcnRldC4KKworQkVNRVJLVU5HRU46CisgICAgIE1hbiBzb2xsdGUgYW4gZGllc2VyIFByb3BlcnR5IG5pY2h0ICJ2b24gSGFuZCIgaGVydW1mdW1tZWxuLCBzb25kZXJuCisgICAgIGltbWVyIGRpZSB6dWdlaG9lcmlnZW4gRnVua3Rpb25lbiBiZW51dHplbiEKKworU0lFSEUgQVVDSDoKKyAgICAgL3N0ZC90aGluZy9kZXNjcmlwdGlvbi5jLCBBZGRJZCgpLCBSZW1vdmVJZCgpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFN1biBNYXkgMTkgMjA6MTc6MzYgMTk5NiBieSBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0lHTk9SRSBiL2RvYy9wcm9wcy9QX0lHTk9SRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTVmZDE0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfSUdOT1JFCkBAIC0wLDAgKzEsMjIgQEAKK05BTUU6CisgICAgUF9JR05PUkUgICAgICAgICAgICAgICAgICAgICAgImlnbm9yZSIKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcGxheWVyL2Jhc2UuaAorCitCRVNDSFJFSUJVTkc6CisgICAgQXJyYXkgbWl0IFNwaWVsZXJuLCBLb21tYW5kb3MsIEFrdGlvbmVuIHUuYWUuIGRpZSBpZ25vcmllcnQgd2VyZGVuLgorICAgIEluIGFsbGVyIFJlZ2VsIHNvbGx0ZSBkaWUgSWdub3JpZXJlcHJ1ZWZ1bmcgZHVyY2ggQXVmcnVmIHZvbiBUZXN0SWdub3JlKCkKKyAgICBpbSBTcGllbGVyIGVyZm9sZ2VuIHVuZCBuaWNodCBzZWxiZXIgUF9JR05PUkUgZHVyY2hzdWNodCB3ZXJkZW4uCisKK0JFTUVSS1VOR0VOOgorICAgIERpZSBEYXRlbiBpbiBkaWVzZXIgUHJvcGVydHkgd2VyZGVuIGludGVybiBhbHMgTWFwcGluZyBnZXNwZWljaGVydCwgbmljaHQKKyAgICBhbHMgQXJyYXkgdm9uIFN0cmluZ3MuIEJpdHRlIG5pY2h0IG1pdCBTZXQvUXVlcnkoKSBhbiBkaWVzZXIgUHJvcGVydHkKKyAgICBoZXJ1bWJhc3RlbG4uCisKK1NJRUhFIEFVQ0g6CisgICAgVGVzdElnbm9yZSwgL3N0ZC9wbGF5ZXIvY29tbS5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IDAyLjEwLjIwMTEsIFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfSU5ET09SUyBiL2RvYy9wcm9wcy9QX0lORE9PUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFhYjA3YQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0lORE9PUlMKQEAgLTAsMCArMSwzMyBAQAorTkFNRToKKyAgICAgUF9JTkRPT1JTICAgICAgICAgICAgICAgICAgICAgImluZG9vcnMiCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N5cy9yb29tL2Rlc2NyaXB0aW9uLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBHZXNldHp0LCB3ZW5uIHZvbiBkZW0gUmF1bSBhdXMgZGVyIEhpbW1lbCBuaWNodCBzaWNodGJhciBpc3QuCisKKyAgICAgT2JqZWt0ZSBvZGVyIEdpbGRlbiB3ZXJ0ZW4gZGllc2UgUHJvcGVydHkgdGVpbHdlaXNlIGF1cywgZnVlcgorICAgICBJbm5lbnJhZXVtZSBzb2xsdGUgc2llIGFsc28gc2lubnZvbGxlcndlaXNlIGdlc2V0enQgd2VyZGVuLgorCisgICAgIExpY2h0IHdpcmQgX25pY2h0XyBkdXJjaCBQX0lORE9PUlMgYmVlaW5mbHVzc3QsIG11c3MgYWxzbworICAgICBzZWxic3QgYW5nZXBhc3N0IHdlcmRlbi4KKworQkVJU1BJRUwKKyAgICAgLy8gRWluIGR1bmtsZXIgSW5uZW5yYXVtOgorICAgICBTZXRQcm9wKFBfSU5ET09SUywgMSk7ICAgICAgICAgICAgLy8gZWluIElubmVucmF1bSBsaWVndCBpbm5lbiA6KQorICAgICBTZXRQcm9wKFBfTElHSFQsIDApOyAgICAgICAgICAgICAgLy8gTGljaHQgYXVmIDAKKworICAgICAvLyBFaW4gcmljaHRpZyBoZWxsZXIgQXVzc2VucmF1bToKKyAgICAgU2V0UHJvcChQX0lORE9PUlMsIDApOworICAgICBTZXRQcm9wKFBfTElHSFQsIDIpOworCisgICAgIC8vIEVpbiBoZWxsZXIgQXVzc2VucmF1bSBtaXQgTW9uZGxpY2h0IChndXQgZnVlciBEZWxmZW4pCisgICAgIFNldFByb3AoUF9JTkRPT1JTLCAwKTsKKyAgICAgU2V0UHJvcChQX0xJR0hULCAxKTsKKyAgICAgU2V0UHJvcChQX0xJR0hUX1RZUEUsIExUX1NUQVJTfExUX01PT04pOworCitTSUVIRSBBVUNICisgICAgIFBfTElHSFQsIFBfTElHSFRfQUJTT1JQVElPTiwgUF9MSUdIVF9UWVBFCisKKzI1LkF1ZyAyMDA4IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9JTkZPIGIvZG9jL3Byb3BzL1BfSU5GTwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmRhYmU2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfSU5GTwpAQCAtMCwwICsxLDE4IEBACitQX0lORk8KK05BTUU6CisgICAgIFBfSU5GTyAgICAgICAgICAgICAgICAgICAgICAgICJpbmZvIiAgICAgICAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgIC9zeXMvcHJvcGVydGllcy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgR2VoZWltZSBJbmZvcm1hdGlvbiwgZGllIGdnZi4gdWViZXIgZWluZW4gWmF1YmVyc3BydWNoCisgICAgIHZvbiBTcGllbGVybiBlcm1pdHRlbHQgd2VyZGVuIGthbm4uCisgICAgIAorQkVJU1BJRUw6CisgICAgIFNldFByb3AoUF9JTkZPLCJEdSBlcmdydWVuZGVzdCBkYXMgR2VoZWltbmlzLlxuIikKKworU0lFSEUgQVVDSDoKKyAgICAgR2V0T3duZXIoTCkKKworMjQuIEFwcmlsIDIwMDYsIFZhbmlvbiAKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0lORk9STU1FIGIvZG9jL3Byb3BzL1BfSU5GT1JNTUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDczNjkzMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0lORk9STU1FCkBAIC0wLDAgKzEsMTQgQEAKK05BTUU6CisgICAgUF9JTkZPUk1NRSAgICAgICAgICAgICAgICAgICAgImluZm9ybW1lIiAgICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3Byb3BlcnRpZXMuaAorCitCRVNDSFJFSUJVTkc6CisgICAgRW50aGFlbHQgZGFzIEZsYWcsIG9iIGRlciBTcGllbGVyIHVlYmVyIGVpbi0vYXVzbG9nZ2VuZGUgU3BpZWxlcgorICAgIGluZm9ybWllcnQgd2VyZGVuIHdpbGwuCisKK1NJRUhFIEFVQ0g6CisgICAgU3BpZWxlcmtvbW1hbmRvOiBpbmZvcm0KKworNi5GZWIgMjAxNiBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfSU5QQ19IT01FIGIvZG9jL3Byb3BzL1BfSU5QQ19IT01FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZmVhMGIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9JTlBDX0hPTUUKQEAgLTAsMCArMSw4IEBACitOQU1FOgorICAgIFBfSU5QQ19IT01FICAgICAgICAgICAgICAgICAgICJpbnBjX2hvbWUiICAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9pbnBjL3dhbGtpbmcuaAorCitCRVNDSFJFSUJVTkc6CisgICAgKioqIEtFSU5FIEJFU0NIUkVJQlVORyBWT1JIQU5ERU4gKioqCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9JTlBDX0xBU1RfRU5WSVJPTk1FTlQgYi9kb2MvcHJvcHMvUF9JTlBDX0xBU1RfRU5WSVJPTk1FTlQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI3NDM3YQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0lOUENfTEFTVF9FTlZJUk9OTUVOVApAQCAtMCwwICsxLDggQEAKK05BTUU6CisgICAgUF9JTlBDX0xBU1RfRU5WSVJPTk1FTlQgICAgICAgImlucGNfbGFzdF9lbnZpcm9ubWVudCIgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL2lucGMvd2Fsa2luZy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAqKiogS0VJTkUgQkVTQ0hSRUlCVU5HIFZPUkhBTkRFTiAqKioKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0lOUENfTEFTVF9QTEFZRVJfQ09OVEFDVCBiL2RvYy9wcm9wcy9QX0lOUENfTEFTVF9QTEFZRVJfQ09OVEFDVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzJjZDAyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfSU5QQ19MQVNUX1BMQVlFUl9DT05UQUNUCkBAIC0wLDAgKzEsOCBAQAorTkFNRToKKyAgICBQX0lOUENfTEFTVF9QTEFZRVJfQ09OVEFDVCAgICAiaW5wY19sYXN0X3BsYXllcl9jb250YWN0IiAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvaW5wYy93YWxraW5nLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICoqKiBLRUlORSBCRVNDSFJFSUJVTkcgVk9SSEFOREVOICoqKgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfSU5QQ19XQUxLX0FSRUEgYi9kb2MvcHJvcHMvUF9JTlBDX1dBTEtfQVJFQQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDdkZmM2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfSU5QQ19XQUxLX0FSRUEKQEAgLTAsMCArMSw4IEBACitOQU1FOgorICAgIFBfSU5QQ19XQUxLX0FSRUEgICAgICAgICAgICAgICJpbnBjX3dhbGtfYXJlYSIgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9pbnBjL3dhbGtpbmcuaAorCitCRVNDSFJFSUJVTkc6CisgICAgKioqIEtFSU5FIEJFU0NIUkVJQlVORyBWT1JIQU5ERU4gKioqCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9JTlBDX1dBTEtfREVMQVlTIGIvZG9jL3Byb3BzL1BfSU5QQ19XQUxLX0RFTEFZUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTEwNzY0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfSU5QQ19XQUxLX0RFTEFZUwpAQCAtMCwwICsxLDggQEAKK05BTUU6CisgICAgUF9JTlBDX1dBTEtfREVMQVlTICAgICAgICAgICAgImlucGNfd2Fsa19kZWxheSIgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL2lucGMvd2Fsa2luZy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAqKiogS0VJTkUgQkVTQ0hSRUlCVU5HIFZPUkhBTkRFTiAqKioKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0lOUENfV0FMS19GTEFHUyBiL2RvYy9wcm9wcy9QX0lOUENfV0FMS19GTEFHUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTg3NDliCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfSU5QQ19XQUxLX0ZMQUdTCkBAIC0wLDAgKzEsOCBAQAorTkFNRToKKyAgICBQX0lOUENfV0FMS19GTEFHUyAgICAgICAgICAgICAiaW5wY193YWxrX2ZsYWdzIiAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvaW5wYy93YWxraW5nLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICoqKiBLRUlORSBCRVNDSFJFSUJVTkcgVk9SSEFOREVOICoqKgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfSU5QQ19XQUxLX01PREUgYi9kb2MvcHJvcHMvUF9JTlBDX1dBTEtfTU9ERQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmRhOTlkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfSU5QQ19XQUxLX01PREUKQEAgLTAsMCArMSw4IEBACitOQU1FOgorICAgIFBfSU5QQ19XQUxLX01PREUgICAgICAgICAgICAgICJpbnBjX3dhbGtfbW9kZSIgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9pbnBjL3dhbGtpbmcuaAorCitCRVNDSFJFSUJVTkc6CisgICAgKioqIEtFSU5FIEJFU0NIUkVJQlVORyBWT1JIQU5ERU4gKioqCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9JTlBDX1dBTEtfUk9VVEUgYi9kb2MvcHJvcHMvUF9JTlBDX1dBTEtfUk9VVEUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQxMWNiMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0lOUENfV0FMS19ST1VURQpAQCAtMCwwICsxLDggQEAKK05BTUU6CisgICAgUF9JTlBDX1dBTEtfUk9VVEUgICAgICAgICAgICAgImlucGNfd2Fsa19yb3V0ZSIgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL2lucGMvd2Fsa2luZy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAqKiogS0VJTkUgQkVTQ0hSRUlCVU5HIFZPUkhBTkRFTiAqKioKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0lOVEVSTVVEIGIvZG9jL3Byb3BzL1BfSU5URVJNVUQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ0YmQ1OQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0lOVEVSTVVECkBAIC0wLDAgKzEsMTMgQEAKK05BTUU6CisgICAgUF9JTlRFUk1VRCAgICAgICAgICAgICAgICAgICAgImludGVybXVkIiAgICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3BsYXllci9jb21tLmgKKworQkVTQ0hSRUlCVU5HOgorICAgRGllIEJlZGV1dHVuZyBkaWVzZXIgUHJvcGVydHkgaXN0IGluIGRlbiBwcmFlaGlzdG9yaXNjaGVuIFVudGllZmVuCisgICBkZXIgTXVkbGliIHZlcmxvcmVuZ2VnYW5nZW4uCisgICBXaXJkIG5pY2h0IG1laHIgYmVudXR6dC4KKyAgIE5pY2h0IGJlbnV0emVuLgorICAgSWdub3JpZXJlbi4KKwpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfSU5URVJOQUxfRVhUUkFfTE9PSyBiL2RvYy9wcm9wcy9QX0lOVEVSTkFMX0VYVFJBX0xPT0sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYwMTI1ZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0lOVEVSTkFMX0VYVFJBX0xPT0sKQEAgLTAsMCArMSwzOSBAQAorTkFNRToKKwlQX0lOVEVSTkFMX0VYVFJBX0xPT0sJCQkiaW50ZXJuYWxfZXh0cmFsb29rIgorCitERUZJTklFUlQgSU46CisJL3N5cy9saXZpbmcvZGVzY3JpcHRpb24uaAorCitCRVNDSFJFSUJVTkc6CisJRGllc2UgUHJvcGVydHkgZW50aGFlbHQgZWluIE1hcHBpbmcsIGluIGRlbSBhbGxlIGVpbnplbG5lbgorICBFeHRyYS1Mb29rLUVpbnRyYWVnZSBkZXMgTGl2aW5ncyBlbnRoYWx0ZW4gc2luZC4gRGFiZWkgd2VkZW4gZGllIERhdGVuIHZvbgorICBBZGRFeHRyYUxvb2soKSB1bmQgUmVtb3ZlRXh0cmFMb29rKCkgdmVyd2FsdGV0LiBGcmFndCBtYW4gZGllc2UgUHJvcCBtaXQKKyAgUXVlcnlQcm9wKCkgYWIsIGVyaGFlbHQgbWFuIGRpZSBBdXNnYWJlIGRlciBndWVsdGlnZW4gRXh0cmFsb29rcyBkZXMKKyAgTGl2aW5ncy4gQmVpIEFiZnJhZ2UgcGVyIFF1ZXJ5KCkgZXJoYWVsdCBtYW4gZWluIE1hcHBpbmcgbWl0IGFsbGVuCisgIEVpbnRyYWVnZW4gdW5kIGRlcmVuIERhdGVuLiBKZWRlciBXZXJ0IGltIE1hcHBpbmcgaXN0IGVybmV1dCBlaW4gTWFwcGluZywgCisgIHdlbGNoZXMgZm9sZ2VuZGUgS2V5cyBlbnRoYWx0ZW4ga2FubjoKKyAgLSAieGxsb29rIjogU3RyaW5nLCBkZXIgaW0gRXh0cmFsb29rIGRlcyBMaXZpbmcgYW5nZXplaWd0IHdpcmQuCisgIC0gInhsZHVyYXRpb24iOiBaZWl0c3RlbXBlbCAoaW50KSwgZGVyIGFuZ2lidCwgd2llIGxhbmcgZGVyIEVpbnRyYWcgZ3VlbHRpZworICAgICAgICAgICAgICAgICAgaXN0LiAwID09ICJVbmVuZGxpY2giLCBuZWdhdGl2ZSBaYWhsZW4gYmVzYWdlbiwgZGFzcyBkZXIKKyAgICAgICAgICAgICAgICAgIEVpbnRyYWcgbnVyIGJpcyBSZWJvb3QvRW5kZSBndWVsdGlnIHNlaW4gdW5kIGFicyh4bGR1cmF0aW9uKQorICAgICAgICAgICAgICAgICAgaXN0IGRlciBaZWl0cHVua3QgZGVzIEVpbnRyYWdlcyBkaWVzZXMgRXh0cmFsb29rcy4KKyAgLSAieGxlbmRlIjogU3RyaW5nLCBkZXIgbmFjaCBBYmxhdWZlbiBhbiBkYXMgTGl2aW5nIGF1c2dlZ2ViZW4gd2lyZC4KKyAgLSAieGxmdW4iOiBGdW5rdGlvbiwgZGllIGdlcnVmZW4gd2lyZCB1bmQgZGVuIFN0cmluZyB6dXJ1ZWNrbGllZmVybiBtdXNzLCAKKyAgICAgICAgICAgICBkZXIgYXVzZ2ViZW4gd2VyZGVuIHNvbGwuCisgIC0gInhsZW5kZWZ1biI6IEZ1bmt0aW9uLCBkaWUgZ2VydWZlbiB3aXJkLCB3ZW5uIGRlciBFaW50cmFnIGFiZ2VsYXVmZW4gaXN0CisgICAgICAgICAgICAgICAgIHVuZCBkZW4gU3RyaW5nIHp1cnVlY2tsaWVmZXJuIG11c3MsIGRlciBkYW5uIGFucyBMaXZpbmcKKyAgICAgICAgICAgICAgICAgYXVzZ2ViZW4gd2lyZC4KKyAgLSAieGxvYmplY3RuYW1lIjogT2JqZWt0LCBpbiBkZW0gZGllIG8uYS4gRnVua3Rpb25lbiBnZXJ1ZmVuIHdlcmRlbi4KKworQkVNRVJLVU5HOgorICBESUVTRSBQUk9QRVJUWSBCSVRURSBOSUVNQUxTIFBFUiBIQU5EIE1JVCBTZXQoKS9TZXRQcm9wKCkgQUVOREVSTiEKKyAgRGllIERhdGVuIGluIGRpZXNlciBQcm9wIHdlcmRlbiB2b20gTGl2aW5nIHNlbGJlciB2ZXJ3YWx0ZXQuIEV4dHJhbG9va3MKKyAga29lbm5lbiBtaXR0ZWwgQWRkRXh0cmFMb29rKCkgZWluZ2V0cmFnZW4gdW5kIG1pdCBSZW1vdmVFeHRyYUxvb2soKSBlbnRmZXJudAorICB3ZXJkZW4uCisKK1NJRUhFIEFVQ0g6CisgIGxvbmcoKSwgL3N0ZC9saXZpbmcvZGVzY3JpcHRpb24uYywgL3N0ZC9wbGF5ZXIvYmFzZS5jCisgIEFkZEV4dHJhTG9vaygpLCBSZW1vdmVFeHRyYUxvb2soKQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisxMy4wNS4yMDA3LCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9JTlRfTElHSFQgYi9kb2MvcHJvcHMvUF9JTlRfTElHSFQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ1MDRhNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0lOVF9MSUdIVApAQCAtMCwwICsxLDIwIEBACitOQU1FOgorICAgIFBfSU5UX0xJR0hUICAgICAgICAgICAgICAgICAgICAgICAiaW50X2xpZ2h0IgorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9wcm9wZXJ0aWVzLmgKKworQkVTQ0hSRUlCVU5HOgorICAgIEdpYnQgZGVuIExpY2h0bGV2ZWwgYW4sIGRlciBfaW5fIGVpbmVtIE9iamVrdCBpc3QuIEVpbiBBYmZyYWdlbiBkaWVzZXIKKyAgICBQcm9wZXJ0eSBrYW5uIHouQi4gaW4gUmFldW1lbiBzaW5udm9sbCBzZWluLCB3ZW5uIGVzIHouQi4gdW0gZGFzCisgICAgYXVmd2FjaGVuIGVpbmVyIEV1bGUgb2RlciBlaW5lciBGbGVkZXJtYXVzIGdlaHQuIFp1bSBBYmZyYWdlbiBvYiBlaW4KKyAgICBTcGllbGVyIGV0d2FzIHNlaGVuIGthbm4sIGJpdHRlIGF1ZiBqZWRlbiBGYWxsIFBfUExBWUVSX0xJR0hUIGJlbnV0emVuIQorCisgICAgQml0dGUgX251cl8gdWViZXIgUXVlcnlQcm9wIGF1ZiBkaWVzZSBQcm9wZXJ0eSB6dWdyZWlmZW4sCisgICAgZGEgZGFzIExpY2h0bGV2ZWwgZ2dmLiBuZXUgYmVyZWNobmV0IHdlcmRlbiBtdXNzIQorCisgICAgRWluIGRpcmVrdGVzIHNldHplbiBkaWVzZXIgUHJvcGVydHkgaXN0IE5JQ0hUIG1vZWdsaWNoLCBoaWVyenUgYml0dGUKKyAgICBQX0xJR0hUIGJlbnV0emVuIQorCitTSUVIRSBBVUNIOgorICAgIFBfTElHSFQsIFBfVE9UQUxfTElHSFQsIFBfUExBWUVSX0xJR0hULCBQX0xJR0hUX01PRElGSUVSLCBDYW5ub3RTZWUoKQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfSU5UX0xPTkcgYi9kb2MvcHJvcHMvUF9JTlRfTE9ORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTU5MjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfSU5UX0xPTkcKQEAgLTAsMCArMSwzMiBAQAorUF9JTlRfTE9ORworTkFNRToKKyAgICAgUF9JTlRfTE9ORyAgICAgICAgICAgICAgICAgICAgImludF9sb25nIgorCitERUZJTklFUlQgSU46CisgICAgIC9zeXMvcm9vbS9kZXNjcmlwdGlvbi5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRW50aGFlbHQgQmVzY2hyZWlidW5nLCBkaWUgbWFuIGJla29tbXQsIHdlbm4gbWFuIHNpY2ggaW4gZGVtCisgICAgIENvbnRhaW5lciAoamVkZXIgUmF1bSBpc3QgZWluZXIpIHVtc2NoYXV0IGFscyBTdHJpbmcuCisKKyAgICAgRGVyIFRleHQgc29sbHRlIGJlcmVpdHMgdW1nZWJyb2NoZW4gc2Vpbi4KKworICAgICBEaWVzZSBQcm9wZXJ0eSBiZXN0aW1tdCBkaWUgQW5zaWNodCBkZXMgQ29udGFpbmVycyB2b24gaW5uZW4uCisgICAgIEZ1ZXIgZGllIEF1c3NlbihsYW5nKWFuc2ljaHQgbXVzcyBQX0xPTkcgYmVudXR6dCB3ZXJkZW4uCisKK0JFTUVSS1VOR0VOOgorICAgICAtIEJlc2NocmVpYnVuZ2VuIGZ1ZXIgZXR3YWlnZSBUdWVyZW4gaW0gUmF1bSB3ZXJkZW4gaW4gaW50X2xvbmcoKQorICAgICAgIGhpbnp1Z2VmdWVndC4gKEZydWVoZXIgd3VyZGUgZGllcyBpbiBlaW5lciBRdWVyeW1ldGhvZGUgYXVmIGRpZXNlIFByb3AKKyAgICAgICBnZW1hY2h0LikKKworQkVJU1BJRUxFOgorICAgICBTZXRQcm9wKFBfSU5UX0xPTkcsIGJyZWFrX3N0cmluZygKKyAgICAgICJEdSBzdGVoc3QgaW4gZWluZW0gdG90YWwgc3Bhbm5lbmRlbiBUZXN0cmF1bS4gU2VpbmUgYWJzb2x1dGUgIgorICAgICAgIk5pY2h0aWdrZWl0IGVyZnVlbGx0IGRpY2ggbWl0IGVocmZ1ZXJjaHRpZ2VtIEdyYXVlbi4iLDc4KSk7CisKK1NJRUhFIEFVQ0g6CisgICAgIEFlaG5saWNoZXM6CVBfSU5UX1NIT1JUCisgICAgIFNvbnN0aWdlczoJCWludF9sb25nKCksIFBfTE9ORworCQkJcHJvY2Vzc19zdHJpbmcoKSwgYnJlYWtfc3RyaW5nKCkKKworMDQuMDYuMjAwOSwgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfSU5UX1NIT1JUIGIvZG9jL3Byb3BzL1BfSU5UX1NIT1JUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNmEwYWYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9JTlRfU0hPUlQKQEAgLTAsMCArMSwzNiBAQAorUF9JTlRfU0hPUlQKK05BTUU6CisgICAgIFBfSU5UX1NIT1JUCQkJImludF9zaG9ydCIKKworREVGSU5JRVJUIElOOgorICAgICAvc3lzL3RoaW5nL2Rlc2NyaXB0aW9uLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBEaWVzZSBQcm9wZXJ0eSBlbnRoYWVsdCBkaWUgSW5uZW4tS3VyemJlc2NocmVpYnVuZyBkZXMgQ29udGFpbmVycworICAgICBhbHMgU3RyaW5nIG9kZXIgQ2xvc3VyZSAobWl0IFN0cmluZy1SdWVja2dhYmV3ZXJ0KS4KKworICAgICBDb250YWluZXIgc2luZCBoaWVyYmVpIHouQi4gUmFldW1lLgorICAgICBBQ0hUVU5HOiBEaWUgS3VyemJlc2NocmVpYnVuZyBzb2xsdGUgZGFiZWkgd2VkZXIgbWl0IGVpbmVtCisJICAgICAgU2F0enplaWNoZW4gbm9jaCBtaXQgZWluZW0gIlxuIiBhYmdlc2NobG9zc2VuIHNlaW4KKwkgICAgICAoZGllcyB3aXJkIHZvbiBkZW4genVzdGFlbmRpZ2VuIEZ1bmt0aW9uZW4gZXJsZWRpZ3QpLgorCisgICAgIE1hbiBzb2xsdGUgZGllIFByb3BlcnR5IG5pY2h0IGF1ZiAwIHNldHplbi4KKworICAgICBEaWVzZSBQcm9wZXJ0eSBiZXN0aW1tdCBkaWUgQW5zaWNodCBkZXMgQ29udGFpbmVycyB2b24gaW5uZW4uCisgICAgIEZ1ZXIgZGllIEF1c3NlbihrdXJ6KWFuc2ljaHQgbXVzcyBQX1NIT1JUIGJlbnV0enQgd2VyZGVuLgorCitCRU1FUktVTkdFTjoKKyAgICAgLSBpbnRfc2hvcnQoKSAoYmVpIEJld2VndW5nKSBmaWx0ZXJ0IFBfSU5UX1NIT1JUIGR1cmNoIHByb2Nlc3Nfc3RyaW5nKCkKKyAgICAgICAtPiBkYWhlciBzaW5kIENsb3N1cmVzIG1vZWdsaWNoCisKK0JFSVNQSUVMRToKKyAgICAgLy8gZWluIEdhbmcgc2llaHQgbmF0dWVybGljaCBzbyBhdXMKKyAgICAgU2V0UHJvcChQX0lOVF9TSE9SVCwgIkVpbiBHYW5nIik7CisKK1NJRUhFIEFVQ0g6CisgICAgIEFlaG5saWNoZXM6CVBfSU5UX0xPTkcKKyAgICAgU29uc3RpZ2VzOgkJaW50X3Nob3J0KCksIFBfU0hPUlQKKwkJCXByb2Nlc3Nfc3RyaW5nKCksIGJyZWFrX3N0cmluZygpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFRodSBNYXkgMzEgMTU6MzQ6MDUgMjAwMSBieSBQYXRyeW4KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0lOVklTIGIvZG9jL3Byb3BzL1BfSU5WSVMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAyMmVhMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0lOVklTCkBAIC0wLDAgKzEsNTAgQEAKK05BTUU6CisgICAgIFBfSU5WSVMgICAgICAgICAgICAgICAgICAgICAgICJpbnZpcyIgICAgICAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgIC9zeXMvcGxheWVyL2Jhc2UuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIERpZSBQcm9wZXJ0eSBQX0lOVklTIGRpZW50IGRhenUsIE9iamVrdGUgYWxzIHVuc2ljaHRiYXIgenUga2VubnplaWNobmVuLgorICAgICBIaWVyYmVpIHZlcnN1Y2h0IFBfSU5WSVMgZGllIG1vZWdsaWNoZW4gSW50ZXJha3Rpb25lbiBtaXQgU3BpZWxlcm4genUKKyAgICAgbWluaW1pZXJlbiAoaW0gR2VnZW5zYXR6IHp1IGVpbmVyIGZlaGxlbmRlbiBQX1NIT1JULCB3ZWxjaGUgZGFzIE9iamVrdAorICAgICBudXIgZWluZmFjaCBuaWNodC1zaWNodGJhciBtYWNodCkuCisgICAgIAorICAgICBNYW4gc29sbHRlIGRyZWkgQXJ0ZW4gdm9uIHVuc2ljaHRiYXJlbiBPYmpla3RlbiB1bnRlcnNjaGVpZGVuOgorCisgICAgIC0gR2VnZW5zdGFlbmRlCisgICAgICAgU2V0enQgbWFuIFBfSU5WSVMgYXVmIGVpbmUgWmFobCB1bmdsZWljaCAwLCB3aXJkIGRlciBHZWdlbnN0YW5kCisgICAgICAgdW5zaWNodGJhciB1bmQgZGVyIE5hbWUgenUgImV0d2FzIi4gWnVzYWV0emxpY2gga29lbm5lbiBTcGllbGVyIGlobgorICAgICAgIG5pY2h0IG1laHIgYW5zcHJlY2hlbiwgZC5oLiBuZWhtZW4sIHdlZ3dlcmZlbiwgd2VpdGVyZ2ViZW4gZXRjLgorICAgICAgIChCZWkgbWFnaWVyLWVpZ2VuZW4gS29tbWFuZG9zIGlzdCBkaWVzIGV2dGwuIG5pY2h0IHVtZ2VzZXR6dC4uLikKKyAgICAgICBTZXR6dCBtYW4gUF9TSE9SVCBhdWYgMCwgd2lyZCBkZXIgR2VnZW5zdGFuZCBudXIgbmljaHQgbWVociBpbgorICAgICAgIGRlciBJbnZlbnRhcmxpc3RlIHZvbiBCZWhhZWx0ZXJuL1JhZXVtZW4gYW5nZXplaWd0LCBlciBiZWhhZWx0IGFiZXIKKyAgICAgICBzZWluZW4gTmFtZW4gdW5kIGlzdCBkdXJjaCBTcGllbGVyIGFuc3ByZWNoYmFyLCB3ZW5uIHNpZSBlaW5lIElECisgICAgICAga2VubmVuLgorCisgICAgIC0gTlBDcworICAgICAgIEJlaSBnZXNldHp0ZW0gUF9JTlZJUyB3aXJkIGRlciBOUEMgdW5zaWNodGJhciB1bmQgc2VpbiBOYW1lIHdpcmQgenUKKyAgICAgICAiSmVtYW5kIi4gWnVzYWV0emxpY2gga29lbm5lbiBTcGllbGVyIGlobiBuaWNodCBtZWhyIGFuc3ByZWNoZW4sIHouQi4KKyAgICAgICB0b2V0ZW4gb2RlciBrbnVkZGVsbi4KKyAgICAgICAoQmVpIG1hZ2llci1laWdlbmVuIEtvbW1hbmRvcyBpc3QgZGllcyBldnRsLiBuaWNodCB1bWdlc2V0enQuLi4pCisgICAgICAgU2V0enQgbWFuIFBfU0hPUlQgYXVmIDAsIHdpcmQgZGVyIE5QQyBudXIgbmljaHQgbWVociBpbiBkZXIKKyAgICAgICBJbnZlbnRhcmxpc3RlIHZvbiBCZWhhZWx0ZXJuL1JhZXVtZW4gYW5nZXplaWd0LCBlciBiZWhhZWx0IGFiZXIgc2VpbmVuCisgICAgICAgTmFtZW4gdW5kIGlzdCBkdXJjaCBTcGllbGVyIGFuc3ByZWNoYmFyLCB3ZW5uIHNpZSBlaW5lIElEIGtlbm5lbi4gQXVjaAorICAgICAgIGFuZ3JlaWZlbiB1bmQga2FlbXBmZW4gaXN0IG1vZWdsaWNoLgorICAgICAKKyAgICAgLSBNYWdpZXIKKyAgICAgICBNYWdpZXIgbWFjaHQgbWFuIHVuc2ljaHRiYXIsIGluZGVtIG1hbiBpaG5lbiBkaWUgUHJvcGVydHkgUF9JTlZJUyBhdWYKKyAgICAgICBlaW5lbiBXZXJ0IDw+IDAgc2V0enQuCisgICAgICAgKiAgU3BpZWxlciBkdWVyZmVuIG5pY2h0IHVuc2ljaHRiYXIgZ2VtYWNodCB3ZXJkZW4hICAgICAgICAgICAgICAgKgorICAgICAgICogIFdpcmQgZWluIE1hZ2llciB1bnNpY2h0YmFyIGdlbWFjaHQsIG11c3MgbWFuIGlobSBkaWUgUHJvcGVydHkJICoKKyAgICAgICAqICBQX0lOVklTIGF1ZiBkZW4gV2VydCBzZXR6ZW4sIGRlbiBkaWUgUHJvcGVydHkgUF9BR0UgenUgZGllc2VtCSAqCisgICAgICAgKiAgWmVpdHB1bmt0IGhhdCAoa2VpbmUgRl9RVUVSWV9NRVRIT0QgISkuCQkJCSAgICAgICAgICAgICAgICAgKgorICAgICAgIFNldHp0IG1hbiBkaWUgUHJvcGVydHkgYXVmIGRlbiBXZXJ0IDEsIHNvIGVyaGFlbHQgZWluIFNwaWVsZXIsCisgICAgICAgd2VubiBlciBkZW4gZW50c3AuIE1hZ2llciBmaW5nZXJ0LCBkaWUgQXVzZ2FiZTogQWx0ZXI6IDAwOjAwOjAyLAorICAgICAgIHdhcyBnZW5hdXNvIHZlcnJhZXRlcmlzY2ggaXN0LCB3aWUgZWluIEFsdGVyLCBkYXNzIGJlaSBlaW5lbQorICAgICAgIHNjaGVpbmJhciBuaWNodCBlaW5nZWxvZ2d0ZW4gTWFnaWVyIGltbWVyIHdlaXRlciBob2NoZ2V6YWVobHQKKyAgICAgICB3aXJkLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisyNy4wNS4yMDE1LCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0lQX05BTUUgYi9kb2MvcHJvcHMvUF9JUF9OQU1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNTAzZWEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9JUF9OQU1FCkBAIC0wLDAgKzEsOCBAQAorTkFNRToKKyAgICBQX0lQX05BTUUgICAgICAgICAgICAgICAgICAgICAiaXBfbmFtZSIgICAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcGxheWVyLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBSZWNobmVybmFtZSBkZXMgSW50ZXJhY3RpdmVzCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9JU19BUlRJTExFUlkgYi9kb2MvcHJvcHMvUF9JU19BUlRJTExFUlkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUxYjIwZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0lTX0FSVElMTEVSWQpAQCAtMCwwICsxLDE1IEBACitOQU1FOgorCVBfSVNfQVJUSUxMRVJZCQkJImFydGlsbGVyeSIKKworREVGSU5JRVJUIElOOgorCS9zeXMvY29tYmF0LmgKKworQkVTQ0hSRUlCVU5HOgorCUlzIGVpbiBPYmpla3QgQXJ0aWxsZXJpZSwgc28gbXVzcyBkaWVzZSBQcm9wZXJ0eQorCWdlc2V0enQgc2Vpbi4gKERlcnplaXQgZWluZmFjaCBhdWYgMSBzZXR6ZW4uKQorCitTSUVIRSBBVUNIOgorCWFydGlsbGVyaWUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogU2FtLCAgNS4gSnVsIDIwMDMsIDIyOjA3OjEyIGJ5IFpvb2suCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9JVEVNUyBiL2RvYy9wcm9wcy9QX0lURU1TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZDQyNTUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9JVEVNUwpAQCAtMCwwICsxLDkgQEAKK05BTUU6CisgICAgUF9JVEVNUyAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIiAgICAgICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3Byb3BlcnRpZXMuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIERlZmluaXRpb24gdm9uIEdlZ2Vuc3RhZW5kZW4sIGRpZSBpbiBkZW0gUmF1bSBsaWVnZW4gc29sbGVuLgorICAgICBFcmtsYWVydW5nIGluIGVpbmVtIEV4dHJhZmlsZS4KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0lfSEFURV9BTENPSE9MIGIvZG9jL3Byb3BzL1BfSV9IQVRFX0FMQ09IT0wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYwYTM4ZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0lfSEFURV9BTENPSE9MCkBAIC0wLDAgKzEsMjMgQEAKK05BTUU6CisgICAgUF9JX0hBVEVfQUxDT0hPTCAgICAgICAgICAgICAgICAgICAgICAgICJpX2hhdGVfYWxjb2hvbCIKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvaW5wYy9ib296aW5nLmgKKworQkVTQ0hSRUlCVU5HOgorICAgIE51bWVyaXNjaGVyIFdlcnQsIGRlciBkaWUgT2JlcmdyZW56ZSBhbiBQX0FMQ09IT0wgaW4gZWluZW0gTW9uc3RlcgorICAgIGRlZmluaWVydCwgd2VsY2hlciBiZWltIGVpZ2Vuc3RhZW5kaWdlbiBUYW5rZW4gYmVydWVja3NpY2h0aWd0IHdpcmQuCisKK0JFTUVSS1VORzoKKyAgICBHZWh0IGRlciBOcGMgKHVuZCBudXIgZnVlciBzb2xjaGUgaXN0IGRpZXNlIFByb3AgZ2VkYWNodCkgZWlnZW4tCisgICAgc3RhZW5kaWcgdGFua2VuLCB3ZXJkZW4gdm9yIGRlbSBCZXN0ZWxsZW4gZGllIEdldHJhZW5rZSB1bmQgU3BlaXNlbgorICAgIGF1ZiBpaHJlbiBBbGtvaG9sZ2VoYWx0IGdlcHJ1ZWZ0IHVuZCBtaXQgZGVtIGFrdHVlbGxlbiBXZXJ0IHZvbgorICAgIFBfQUxDT0hPTCBpbSBWZXJoYWVsdG5pcyB6dSBQX0lfSEFURV9BTENPSE9MIHZlcmdsaWNoZW4uIExhZWdlIGRlcgorICAgIFdlcnQgZnVlciBQX0FMQ09IT0wgZGFubiB1ZWJlciBkZW0gdm9uIFBfSV9IQVRFX0FMQ09IT0wsIHdpcmQgZGllc2VzCisgICAgR2V0cmFlbmsgKGRpZXNlIFNwZWlzZSkgbmljaHQgYmVzdGVsbHQuCisKK1NJRUhFIEFVQ0g6CisgICAgIFBfQUxDT0hPTCwgUF9NQVhfQUxDT0hPTAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBTYW0gQXByIDE0IDEyOjM1OjAwIDIwMDEgYnkgVGlsbHkKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0tFRVBFUiBiL2RvYy9wcm9wcy9QX0tFRVBFUgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDI3NWJhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfS0VFUEVSCkBAIC0wLDAgKzEsMTQgQEAKK05BTUU6CisgICAgUF9LRUVQRVIgICAgICAgICAgICAgICAgICAgICAgICJzaG9wX2tlZXBlciIKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcHJvcGVydGllcy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICBJbiBkaWVzZSBQcm9wZXJ0eSBrYW5uIG1hbiBpbiBLbmVpcGVuIHVuZCBMYWVkZW4gZWluZW4gU3RyaW5nIHNjaHJlaWJlbi4KKyAgICBEYW5uIHdpcmQgdm9yIGRlbiBUcmFuc2FrdGlvbmVuIGdlcHJ1ZWZ0LCBvYiBlaW4gTlBDIGFud2VzZW5kIGlzdCwKKyAgICBkZXIgZGllc2VuIFN0cmluZyBhbHMgSUQgaGF0LgorICAgIElzdCBkZXIgTlBDIG5pY2h0IHZvcmhhbmRlbiwga2FubiBuaWNodHMgZ2UtIG9kZXIgdmVya2F1ZnQgd2VyZGVuLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBNb24gQXVnIDIzIDE0OjI5OjAwIDE5OTkgYnkgUGFyYWNlbHN1cwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0tFRVBfT05fU0VMTCBiL2RvYy9wcm9wcy9QX0tFRVBfT05fU0VMTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTIxNDA3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfS0VFUF9PTl9TRUxMCkBAIC0wLDAgKzEsOCBAQAorTkFNRToKKyAgICBQX0tFRVBfT05fU0VMTCAgICAgICAgICAgICAgICAia2VlcF9vbl9zZWxsIiAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcHJvcGVydGllcy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgQmVpICJ2ZXJrYXVmZSBhbGxlcyIgd2lyZCBkYXMgT2JqZWt0IGJlaGFsdGVuLgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfS0lMTEVSIGIvZG9jL3Byb3BzL1BfS0lMTEVSCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZjZiMTgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9LSUxMRVIKQEAgLTAsMCArMSwyNyBAQAorTkFNRToKKyAgICBQX0tJTExFUiAgICAgICAgICAgICAgICAgICAgICAia2lsbGVyIiAgICAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcHJvcGVydGllcy5oCisKK0JFU0NIUkVJQlVORzoKKyAgIERpZXNlIFByb3BlcnR5IGVudGhhZWx0IGRhcyBPYmpla3QsIHdlbGNoZXMgZGFzIExlYmV3ZXNlbiBhbHMgbGV0enRlcworICAgZ2V0b2V0ZXQgaGF0LiBTaWUgd2lyZCB2b24gZG9fZGFtYWdlKCksIGhlYXJ0X2JlYXQoKSAoVmVyZ2lmdHVuZ2VuKSB1bmQKKyAgIGRpZSgpIChiZWkgZGlyZWt0ZW4gQXVmcnVmZW4pIGF1dG9tYXRpc2NoIGdlc2V0enQuIEVpbiBtYW51ZWxsZXMKKyAgIFNldHplbiB2b3IgQXVmcnVmIHZvbiBkb19kYW1hZ2UoKSBvZGVyIGRpZSgpIGhhdCBrZWluZXJsZWkgV2lya3VuZyEKKyAgIFNpbm52b2xsZXJ3ZWlzZSBsaWVzdCBtYW4gZGllc2UgUHJvcGVydHkgaW0gTm90aWZ5UGxheWVyRGVhdGgoKSBhdXMsCisgICBzcGFldGVyZXMgQXVzbGVzZW4gaXN0IHVuenV2ZXJsYWVzc2lnLCBkYSBkZXIgS2lsbGVyIGluendpc2NoZW4gemVyc3RvZXJ0CisgICBzZWluIGtvZW5udGUuCisgICBEaWVzZSBQcm9wZXJ0eSBzb2xsdGUgX25pY2h0XyBwZXIgSGFuZCBnZXNldHp0IHdlcmRlbiwgc2Nob24gZ2FyIG5pY2h0CisgICB3YWVocmVuZCBlaW5lcyBOb3RpZnlQbGF5ZXJEZWF0aCgpLCB3ZWlsIGVzIGV2dGwuIG5vY2ggYW5kZXJlIE9iamVrdGUgZ2lidCwKKyAgIGRpZSBzaWNoIGRhZnVlciBpbnRlcmVzc2llcmVuIQorCitCRU1FUktVTkdFTjoKKyAgIE5vcm1hbGVyd2Vpc2Ugc3RlaHQgaGllciBlaW4gT2JqZWt0IGRyaW4gKHMuby4pLiBFcyBnaWJ0IGFsbGVyZGluZ3MgZWluZQorICAgQXVzbmFobWU6IFN0aXJidCBlaW4gTGViZXdlc2VuIGFuIEdpZnQsIGVudGhhZWx0IFBfS0lMTEVSIGRlbiBTdHJpbmcKKyAgICJnaWZ0Ii4KKworU0lFSEUgQVVDSDoKKyAgIGRvX2RhbWFnZSgpCisKKzI5LjA4LjIwMDgsIFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0tJTExTIGIvZG9jL3Byb3BzL1BfS0lMTFMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RhZTcyZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0tJTExTCkBAIC0wLDAgKzEsMTAgQEAKK05BTUU6CisgICAgUF9LSUxMUyAgICAgICAgICAgICAgICAgICAgICAgInBsYXllcmtpbGxzIiAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3Byb3BlcnRpZXMuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIEFuemFobCBkZXIgU3BpZWxlciwgZGllIGRpZXNlciBTcGllbGVyIHNjaG9uIGdldG9ldGV0IGhhdC4KKyAgICAgVW5lcmxhdWJ0ZSBNYW5pcHVsYXRpb24gaXN0IGVpbiBTQ0hXRVJFUyBWRVJHRUhFTiBnZWdlbgorICAgICBkaWUgTXVkcmVnbGVuLgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfS0lMTF9NU0cgYi9kb2MvcHJvcHMvUF9LSUxMX01TRwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTllM2JiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfS0lMTF9NU0cKQEAgLTAsMCArMSw4MCBAQAorUF9LSUxMX01TRworCitOQU1FOgorCVBfS0lMTF9NU0cJCQkia2lsbF9tc2ciCisKK0RFRklOSUVSVCBJTjoKKwkvc3lzL3Byb3BlcnRpZXMuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIFdlbm4gZWluIFNwaWVsZXIgZ2V0b2V0ZXQgd2lyZCwgc28gZXJzY2hlaW50IGRhenUgZWluZSBrdXJ6ZSBJbmZvcm1hdGlvbgorICAgICBhdWYgZGVtIFRvZGVza2FuYWwuIFVtIGRlbSB0b2V0ZW5kZW4gT2JqZWt0IHp1c2FldHpsaWNoIGRpZSBNb2VnbGljaGtlaXQKKyAgICAgenUgZ2ViZW4sIG5vY2ggZXR3YXMgbWVociBhdWYgZGllc2VtIEthbmFsIGF1c3p1Z2ViZW4sIGthbm4gbWFuIGluCisgICAgIGRpZXNlciBQcm9wZXJ0eSBlaW5lbiBTdHJpbmcgdWViZXJnZWJlbi4KKyAgICAgTm9ldGlnZSBaZWlsZW51bWJydWVjaGUgd2VyZGVuIGhpZXJiZWkgYXV0b21hdGlzY2ggZ2VuZXJpZXJ0LgorCisgICAgIEVzIGlzdCBhdWNoIG1vZWdsaWNoIGFuenVnZWJlbiwgb2IgRW1vdGVzIHZlcndlbmRldCB3ZXJkZW4gdW5kIG9iIGRhcworICAgICB0b2V0ZW5kZSBPYmpla3QgZWluIFBsdXJhbC1PYmpla3QgaXN0LiBIaWVyenUgdWViZXJnaWJ0IG1hbiBlaW4gQXJyYXkKKyAgICAgZGVyIEdlc3RhbHQ6CisKKwkoe0tpbGxtZXNzYWdlLEVtb3Rlc30pIGJ6dy4gKHtLaWxsbWVzc2FnZSxFbW90ZXMsUExVUkFMfSkKKworICAgICBEZXIgRWludHJhZyA8S2lsbG1lc3NhZ2U+IHN0ZWxsdCBoaWVyYmVpIGRpZSBNZWxkdW5nIHNlbGJzdCBkYXIsIFBMVVJBTAorICAgICBnaWJ0IGFuLCBkYXNzIGVzIHNpY2ggdW0gZWluIFBsdXJhbC1PYmpla3QgaGFuZGVsdCB1bmQgPEVtb3Rlcz4ga2FubgorICAgICBmb2xnZW5kZSBXZXJ0ZSBhbm5laG1lbjoKKworCU1TR19TQVkgICAgLSBNZWxkdW5nIHdpcmQgbm9ybWFsIGF1c2dlZ2ViZW4uCisJTVNHX0VNT1RFICAtIE1lbGR1bmcgZXJzY2hlaW50IGFscyBFbW90ZS4KKwlNU0dfR0VNT1RFIC0gTWVsZHVuZyBlcnNjaGVpbnQgYWxzIEdlbml0aXYtRW1vdGUuCisJTVNHX0VNUFRZICAtIE1lbGR1bmcgZXJzY2hlaW50IG9obmUgenV2b3JpZ2UgQW5nYWJlIGRlcworCSAgICAgICAgICAgICAgIHRvZXRlbmRlbiBPYmpla3Rlcy4KKworICAgICBNb2VjaHRlIG1hbiBkaWUgTWVsZHVuZyBub2NoIGV0d2FzICJwZXJzb2VubGljaGVyIiA7LSkgZ2VzdGFsdGVuLCBzbworICAgICBrYW5uIG1hbiBkZW4gUGxhdHpoYWx0ZXIgJXMgdmVyd2VuZGVuLiBBbiBkZXNzZW4gU3RlbGxlIHdpcmQgZGFubiBkZXIKKyAgICAgTmFtZSBkZXMgVmVyYmxpY2hlbmVuIGVpbmdlc2V0enQuCisKK0JFSVNQSUVMOgorICAgICBFaW4gbmV0dGVzIEJlaXNwaWVsIGlzdCBkYXMgZm9sZ2VuZGU6IFdlbm4gZWluIFNwaWVsZXIgc2ljaCBhbHMKKyAgICAgRHJhY2hlbnRvZXRlciBiZXdlaHJ0IGhhdCwgc28ga2FubiBlciB0cmFkaXRpb25lbGwgaW4gc2VpbmVtIEJsdXQgYmFkZW4uCisgICAgIEhpbiB1bmQgd2llZGVyIGlzdCBqZWRvY2ggYXVjaCBkZXIgRHJhY2hlIGVyZm9sZ3JlaWNoLCBkZW0gbWFuIGVpbmUKKyAgICAgbHVzdGlnZSBadXNhdHptZWxkdW5nIGZ1ZXIgZGVuIFRvZGVza2FuYWwgdWViZXJnZWJlbiBrYW5uOgorCisgICAgIHZvaWQgY3JlYXRlKCkgeworICAgICAgIDo6Y3JlYXRlKCk7CisgICAgICAgLi4uCisgICAgICAgU2V0UHJvcChQX0tJTExfTVNHLCJKZXR6dCBiYWRlIGljaCBtYWwgaW4gREVJTkVNIEJsdXQsICVzISIpOworICAgICAgIC4uLgorICAgICB9CisKKworICAgICBGYWxscyBkZXIgJ0tpbGxlcicgZWluIFBsdXJhbC1PYmpla3Qgb2RlciAtTlBDIHdhciwga29lbm50ZSBlaW5lIE1lbGR1bmcKKyAgICAgYXVjaCBmb2xnZW5kZXJtYXNzZW4gYXVzc2VoZW46CisKKyAgICAgU2V0UHJvcChQX0tJTExfTVNHLCh7ImhhdW4gc2ljaCBqZXR6dCBkaWUgSHVja2Ugdm9sbC4iLAorCQkJICBNU0dfRU1PVEUsCisJCQkgIFBMVVJBTH0pKTsKKworICAgICB3b2JlaSBQX0tJTExfTkFNRSBoaWVyIG5hdHVlcmxpY2ggYXVmICJFaW5lIE1lbmdlIE9ya3MiIG9kZXIKKyAgICAgZGVyZ2xlaWNoZW4gZ2VzZXR6dCBzZWluIHNvbGx0ZS4gQXVmIGRlbSBLYW5hbCB3YWVyZSBkYW5uIGRpZXMgenUKKyAgICAgbGVzZW46CisKKwlbVG9kOkxhcnNdIEVpbmUgTWVuZ2UgT3JrcyBoYWJlbiBnZXJhZGUgT3JrdG9ldGVyIHVtZ2VicmFjaHQuCisJW1RvZDpFaW5lIE1lbmdlIE9ya3MgaGF1biBzaWNoIGpldHp0IGRpZSBIdWNrZSB2b2xsLl0KKworCisgICAgIFdlaXRlcmVzIEJlaXNwaWVsLgorICAgICBNYW4gaGFiZSBlaW5lbiBOUEMsIGRlc3NlbiBLaWxsbmFtZSBhbHMgUGx1cmFsIGF1Znp1ZmFzc2VuIGlzdCwgZGVyIGFiZXIKKyAgICAga2VpbmVuIHp1c2FldGxpY2hlbiBUZXh0IGF1ZiAtVG9kIGJyaW5nZW4gc29sbC4KKworICAgICBTZXRQcm9wKFBfTkFNRSwgIkVpbmUgSG9yZGUgR3VtbWliYWVyZW4iKTsKKyAgICAgU2V0UHJvcChQX0tJTExfTkFNRSwgIlZpZWxlIGtsZWluZSBHdW1taWJhZXJlbiIpOworICAgICBTZXRQcm9wKFBfS0lMTF9NU0csICh7MCwgMCwgMX0pKTsKKworU0lFSEUgQVVDSDoKKyAgICAgVG9kOgkJZGllKEwpCisgICAgIFRvZGVzbWVsZHVuZ2VuOglQX0tJTExfTkFNRSwgUF9ESUVfTVNHLCBQX01VUkRFUl9NU0cKKwkJCVBfWkFQX01TRywgUF9FTkVNWV9ERUFUSF9TRVFVRU5DRQorICAgICBTb25zdGlnZXM6CQlQX0NPUlBTRSwgUF9OT0NPUlBTRSwgL3Jvb20vZGVhdGgvZGVhdGhfcm9vbS5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFdlZCBBdWcgMjEgMTQ6MzY6MDQgMjAwMiBieSBCYW1iaQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfS0lMTF9OQU1FIGIvZG9jL3Byb3BzL1BfS0lMTF9OQU1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMjE0YWIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9LSUxMX05BTUUKQEAgLTAsMCArMSw0MyBAQAorUF9LSUxMX05BTUUKKworTkFNRToKKyAgICAgUF9LSUxMX05BTUUJCQkia2lsbF9uYW1lIgorCitERUZJTklFUlQgSU46CisgICAgIC9zeXMvcHJvcGVydGllcy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgV2VubiBlaW4gU3BpZWxlciBnZXRvZXRldCB3aXJkLCBzbyBlcnNjaGVpbnQgZWluZSBrdXJ6ZSBJbmZvcm1hdGlvbiBhdWYKKyAgICAgZGVtIFRvZGVza2FuYWwuIEltIE5vcm1hbGZhbGwgd2VyZGVuIGRpZSBJbmZvcm1hdGlvbmVuIGF1cyBQX05BTUUsCisgICAgIFBfQVJUSUNMRSB1bmQgUF9HRU5ERVIgZGVzIHRvZXRlbmRlbiBPYmpla3RlcyB2ZXJ3ZW5kZXQsIHVtIGVpbmVuIE5hbWVuCisgICAgIGZ1ZXIgZWJlbiBkaWVzZXMgT2JqZWt0IHp1IGtyZWllcmVuLiBNYW5jaG1hbCBtb2VjaHRlIG1hbiBqZWRvY2ggZWluZW4KKyAgICAgZGF2b24gdW5hYmhhZW5naWdlbiBOYW1lbiBkb3J0IHN0ZWhlbiBoYWJlbi4gRGFubiBrb21tdCBkaWUgUHJvcGVydHkKKyAgICAgUF9LSUxMX05BTUUgenVtIEVpbnNhdHouCisgICAgIE1hbiBzb2xsdGUgYmVhY2h0ZW4sIGRhc3MgZGVyIE5hbWUgZGVzIFRvZXRlbmRlbiBuaWNodCB6dSBsYW5nIHNlaW4KKyAgICAgc29sbHRlLCBkZW5uIG9id29obCBiZWkgZWluZXIgVG9kZXNtZWxkdW5nIGF1dG9tYXRpc2NoIHVtZ2Vicm9jaGVuIHdpcmQsCisgICAgIGthbm4gZXMgZG9jaCB6aWVtbGljaCBzdG9lcmVuLiBXZW5uIGRhcyB0b2V0ZW5kZSBPYmpla3QgZWluIFBsdXJhbC0KKyAgICAgT2JqZWt0IGlzdCwgc28ga2FubiBtYW4gZGllcyB6dXNhZXR6bGljaCBpbiBkZXIgUHJvcGVydHkgUF9LSUxMX01TRworICAgICBhbmdlYmVuLgorCitCRUlTUElFTDoKKyAgICAgRWluZSBXb2xrZSwgZGllIHdhaGx3ZWlzZSB6d2lzY2hlbiB2ZXJzY2hpZWRlbmVuIFp1c3RhZW5kZW4gbXV0aWVydCwKKyAgICAga29lbm50ZSBtYWwgZWluZSBFaXN3b2xrZSwgbWFsIGVpbmUgR2lmdHdvbGtlIG9kZXIgYXVjaCBtYWwgZWluZQorICAgICBGZXVlcndvbGtlIHNlaW4uIEZ1ZXIgZGVuIFRvZGVza2FuYWwgc29sbCBqZWRvY2ggaW1tZXIgZXJzY2hlaW5lbjoKKyAgICAgJ1tUb2Q6XSBFaW5lIG11dGllcmVuZGUgV29sa2UgaGF0IGdlcmFkZSA8U3BpZWxlcj4gdW1nZWJyYWNodC4nCisKKyAgICAgdm9pZCBjcmVhdGUoKQorICAgICB7CisgICAgICAgOjpjcmVhdGUoKTsKKyAgICAgICAuLi4KKyAgICAgICBTZXRQcm9wKFBfS0lMTF9OQU1FLCJFaW5lIG11dGllcmVuZGUgV29sa2UiKTsKKyAgICAgICAuLi4KKyAgICAgfQorCitTSUVIRSBBVUNIOgorICAgICBUb2Q6CQlkaWUoTCkKKyAgICAgVG9kZXNtZWxkdW5nZW46CVBfS0lMTF9NU0csIFBfRElFX01TRywgUF9NVVJERVJfTVNHCisJCQlQX1pBUF9NU0csIFBfRU5FTVlfREVBVEhfU0VRVUVOQ0UKKyAgICAgU29uc3RpZ2VzOgkJUF9DT1JQU0UsIFBfTk9DT1JQU0UsIC9yb29tL2RlYXRoL2RlYXRoX3Jvb20uYworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBXZWQgSmFuIDE0IDE5OjE3OjA2IDE5OTggYnkgUGF0cnluCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9LTk9XTl9QT1RJT05ST09NUyBiL2RvYy9wcm9wcy9QX0tOT1dOX1BPVElPTlJPT01TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YWRiOTcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9LTk9XTl9QT1RJT05ST09NUwpAQCAtMCwwICsxLDE5IEBACitOQU1FOgorICAgIFBfS05PV05fUE9USU9OUk9PTVMgICAgICAgICAgICAgICAgICJrbm93bl9wb3Rpb25yb29tcyIgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9wbGF5ZXIvcG90aW9uLmgKKworQkVTQ0hSRUlCVU5HOgorICAgIEFycmF5IG1pdCBkZW4gTnVtbWVybiBkZXIgUmFldW1lLCBpbiBkZW5lbiBkZXIgU3BpZWxlciBaYXViZXItCisgICAgdHJhZW5rZSBmaW5kZW4ga2Fubi4gRGllIFp1b3JkbnVuZyBkZXIgUmFldW1lIHVuZCBOdW1tZXJuCisgICAgZ2VzY2hpZWh0IGltIFBvdGlvbm1hc3Rlci4KKworICAgIE51ciBsZXNiYXJlIF9xdWVyeSAtIFByb3BlcnR5LgorCitTSUVIRSBBVUNIOgorICAgIFNvbnN0aWdlczogemF1YmVydHJhZW5rZSwgL3NlY3VyZS9wb3Rpb25tYXN0ZXIuYywgL3Jvb20vb3Jha2VsLmMKKyAgICBWZXJ3YW5kdDogIEZpbmRQb3Rpb24oKSwgQWRkS25vd25Qb3Rpb24oKSwgUmVtb3ZlS25vd25Qb3Rpb24oKSwgSW5MaXN0KCkKKyAgICBQcm9wczogICAgIFBfUE9USU9OUk9PTVMKKworNi5GZWIgMjAxNiBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfTEFTVERJUiBiL2RvYy9wcm9wcy9QX0xBU1RESVIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFlOTA3MQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0xBU1RESVIKQEAgLTAsMCArMSwxNSBAQAorTkFNRToKKyAgICBQX0xBU1RESVIgICAgICAgICAgICAgICAgICAicF9saWJfbGFzdGRpciIKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvc2hlbGxzLmgKKworQkVTQ0hSRUlCVU5HOgorICAgIERhcyBqZXdlaWxzIGxldHp0ZSBWZXJ6ZWljaG5pcywgaW4gZGVtIGRlciBNYWdpZXIgd2FyLgorICAgIChOdXIgZnVlciBNYWdpZXIgdm9uIEJlbGFuZykKKworU2llaGUgYXVjaDoKKyAgICBQX0NVUlJFTlRESVIKKworTGV0enRlIEFlbmRlcnVuZzoKKyAgICAwMy4wNS4yMDE2LCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9MQVNUX0NPTUJBVF9USU1FIGIvZG9jL3Byb3BzL1BfTEFTVF9DT01CQVRfVElNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2RmOTZkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfTEFTVF9DT01CQVRfVElNRQpAQCAtMCwwICsxLDIzIEBACitOQU1FOgorCVBfTEFTVF9DT01CQVRfVElNRQkJImxhc3RfY29tYmF0X3RpbWUiCisKK0RFRklOSUVSVCBJTjoKKwkvc3lzL2NvbWJhdC5oCisKK0JFU0NIUkVJQlVORzoKKwlJbiBkaWVzZXIgUHJvcGVydHkgd2lyZCBnZW5hdSBkaWUgWmVpdCBmZXN0Z2VoYWx0ZW4sIHp1IGRlciBlaW4KKwlMZWJld2VzZW4genVsZXR6dCBlaW5lbiBBbmdyaWZmIGFiZ2V3ZWhydCBvZGVyIGVpbmVuIEFuZ3JpZmYKKwlkdXJjaGdlZnVlaHJ0IGhhdC4gRGllIFByb3BlcnR5IGVudGhhZWx0IGRpZXNlIEluZm9ybWF0aW9uIGhpZXJiZWkKKwlpbW1lciBpbiBGb3JtIGVpbmVzIEludGVnZXJ3ZXJ0ZXMuCisJRGllc2VyIFdlcnQga29lbm50ZSB6LkIuIHdpY2h0aWcgc2Vpbiwgd2VubiBtYW4gd2lzc2VuIG1vZWNodGUsIHdhbm4KKwllaW4gTGViZXdlc2VuIHp1bGV0enQgZ2VrYWVtcGZ0IGhhdC4gRXMgaXN0IGJlaXNwaWVsc3dlaXNlIG5pY2h0CisJbW9lZ2xpY2gsIHdhZWhyZW5kIG9kZXIgYXVjaCB1bm1pdHRlbGJhciBuYWNoIGVpbmVtIEthbXBmIGRlbiBCZWZlaGwKKwknRW5kZScgenUgbnV0emVuLCBkYSBkaWVzIHp1ciBGbHVjaHQgbWlzc2JyYXVjaHQgd2VyZGVuIGthbm4uIERhZnVlcgorCXdpcmQgZGVyIFdlcnQgZGVyIFByb3BlcnR5IHp1dm9yIGF1c2dld2VydGV0LgorCitTSUVIRSBBVUNIOgorCVBfTEFTVF9EQU1USU1FLCBQX0xBU1RfREFNQUdFLCBQX0xBU1RfREFNVFlQRVMsIEF0dGFjaygpLCBEZWZlbmQoKSwKKwkvc3RkL2xpdmluZy9jb21iYXQuYywgL3N0ZC9saXZpbmcvbGlmZS5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFdlZCBNYXkgMjYgMTY6NDM6MDAgMTk5OSBieSBQYXRyeW4KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0xBU1RfQ09NTUFORF9FTlYgYi9kb2MvcHJvcHMvUF9MQVNUX0NPTU1BTkRfRU5WCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NmUzNGQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9MQVNUX0NPTU1BTkRfRU5WCkBAIC0wLDAgKzEsMTUgQEAKK1BfTEFTVF9DT01NQU5EX0VOVgorTkFNRToKKyAgICBQX0xBU1RfQ09NTUFORF9FTlYgICAgICAgICAgICAibGFzdF9jb21tYW5kX2VudiIgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcGxheWVyLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBEZXIgUmF1bSwgaW4gZGVtIGRhcyBsZXR6dGUgS29tbWFuZG8gZWluZ2VnZWJlbiB3dXJkZS4KKworQkVNRVJLVU5HRU46CisgICAgIEtlaW5lIGVjaHRlIFByb3BlcnR5LCBfcXVlcnlfbGFzdF9jb21tYW5kX2VudigpIGlzdAorICAgICBpbiAvc3RkL3BsYXllcnMvY29tbWFuZC5jIGltcGxlbWVudGllcnQuCisKKzE0LkZlYi4yMDA0IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9MQVNUX0NPTlRFTlRfQ0hBTkdFIGIvZG9jL3Byb3BzL1BfTEFTVF9DT05URU5UX0NIQU5HRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmE2NGJiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfTEFTVF9DT05URU5UX0NIQU5HRQpAQCAtMCwwICsxLDE2IEBACitOQU1FOgorICAgIFBfTEFTVF9DT05URU5UX0NIQU5HRSAgICAgICAgICJsYXN0X2NvbnRlbnRfY2hhbmdlIiAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9wcm9wZXJ0aWVzLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBXYW5uIHd1cmRlIHp1bSBsZXR6dGVuIE1hbCB3YXMgaW5zIE9iaiBnZXN0b3BmdCBvZGVyIHJhdXNnZW5vbW1lbj8KKyAgICAgV2ljaHRpZyBmdWVyIGRlbiBXZWlnaHQtQ2FjaGUKKworQU5NRVJLVU5HOgorICAgICBEaWUgUHJvcGVydHkga2FubiBudXIgdWViZXIgUXVlcnlQcm9wKCkgdW5kIFNldFByb3AoKSBhdXNnZWxlc2VuIGJ6dy4KKyAgICAgZ2VzZXR6dCB3ZXJkZW4uIFF1ZXJ5KCkgdW5kIFNldCgpIGZ1bmt0aW9uaWVyZW4gKm5pY2h0Ki4KKworICAgICBBdXNzZXJkZW0gZnVlaHJ0IGVpbiBTZXR6ZW4gcGVyIFNldFByb3AoKSB6dSBlaW5lciBFcmhvZWh1bmcgZGVzIAorICAgICBXZXJ0ZXMgdW0gZWlucyAtIHVuYWJoYWVuZ2lnIHZvbSBnZXNldHp0ZW4gV2VydC4KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0xBU1RfREFNQUdFIGIvZG9jL3Byb3BzL1BfTEFTVF9EQU1BR0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ2MThiMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0xBU1RfREFNQUdFCkBAIC0wLDAgKzEsMjIgQEAKK05BTUU6CisJUF9MQVNUX0RBTUFHRQkJCSJsYXN0X2RhbWFnZSIKKworREVGSU5JRVJUIElOOgorCS9zeXMvbGl2aW5nL2NvbWJhdC5oCisKK0JFU0NIUkVJQlVORzoKKwlJbiBkaWVzZXIgUHJvcGVydHkgd2lyZCBnZW5hdSBkaWUgU2NoYWRlbnNzdGFlcmtlIGZlc3RnZWhhbHRlbiwKKwl3ZWxjaGUgZWluIExlYmV3ZXNlbiB6dWxldHp0IGFiYmVrb21tZW4gaGF0LiBEaWUgUHJvcGVydHkgZW50aGFlbHQKKwlkaWVzZSBJbmZvcm1hdGlvbiBoaWVyYmVpIGltbWVyIGluIEZvcm0gZWluZXMgSW50ZWdlcndlcnRlcy4KKwlBdWNoIGRpZSBTdGFlcmtlIGRlcyBHaWZ0c2NoYWRlbnMgZHVyY2ggZGllIFdpcmt1bmcgZWluZXIgVmVyZ2lmdHVuZworCXdpcmQgaGllciBmZXN0Z2VoYWx0ZW4uCisJRGllc2VyIFdlcnQga29lbm50ZSB6LkIuIHdpY2h0aWcgc2Vpbiwgd2VubiBtYW4gd2lzc2VuIG1vZWNodGUsCisJd2VsY2hlIFNjaGFkZW5zc3RhZXJrZSBuYWNoIEVpbndpcmt1bmcgdm9uIERlZmVuZGVybiwgUnVlc3R1bmcsCisJSG9va3MgdW5kIFNraWxscyB1ZWJyaWdnZWJsaWViZW4gaXN0LgorCitTSUVIRSBBVUNIOgorCVBfTEFTVF9EQU1USU1FLCBQX0xBU1RfREFNVFlQRVMsIERlZmVuZCgpLAorCS9zdGQvbGl2aW5nL2NvbWJhdC5jLCAvc3RkL2xpdmluZy9saWZlLmMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogVHVlIEphbiAyNiAxMjozNDoyOSAxOTk5IGJ5IFBhdHJ5bgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfTEFTVF9EQU1USU1FIGIvZG9jL3Byb3BzL1BfTEFTVF9EQU1USU1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZmZiNTEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9MQVNUX0RBTVRJTUUKQEAgLTAsMCArMSwyMiBAQAorTkFNRToKKwlQX0xBU1RfREFNVElNRQkJCSJsYXN0X2RhbXRpbWUiCisKK0RFRklOSUVSVCBJTjoKKwkvc3lzL2xpdmluZy9jb21iYXQuaAorCitCRVNDSFJFSUJVTkc6CisJSW4gZGllc2VyIFByb3BlcnR5IHdpcmQgZ2VuYXUgZGllIFplaXQgZmVzdGdlaGFsdGVuLCB6dSBkZXIgZWluCisJTGViZXdlc2VuIHp1bGV0enQgZWluZW4gU2NoYWRlbiBhYmJla29tbWVuIGhhdC4gRGllIFByb3BlcnR5CisJZW50aGFlbHQgZGllc2UgSW5mb3JtYXRpb24gaGllcmJlaSBpbW1lciBpbiBGb3JtIGVpbmVzCisJSW50ZWdlcndlcnRlcy4KKwlBdWNoIGRlciBaZWl0cHVua3QgZGVyIEVpbndpcmt1bmcgdm9uIEdpZnRzY2hhZGVuIGR1cmNoIGRpZSBXaXJrdW5nCisJZWluZXIgVmVyZ2lmdHVuZyB3aXJkIGhpZXIgZmVzdGdlaGFsdGVuLgorCURpZXNlciBXZXJ0IGtvZW5udGUgei5CLiB3aWNodGlnIHNlaW4sIHdlbm4gbWFuIHdpc3NlbiBtb2VjaHRlLCB3YW5uCisJZWluIExlYmV3ZXNlbiB6dWxldHp0IHZlcmxldHp0IHd1cmRlLgorCitTSUVIRSBBVUNIOgorCVBfTEFTVF9DT01CQVRfVElNRSwgUF9MQVNUX0RBTUFHRSwgUF9MQVNUX0RBTVRZUEVTLCBEZWZlbmQoKSwKKwkvc3RkL2xpdmluZy9jb21iYXQuYywgL3N0ZC9saXZpbmcvbGlmZS5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFdlZCBNYXkgMjYgMTY6NDQ6MzggMTk5OSBieSBQYXRyeW4KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0xBU1RfREFNVFlQRVMgYi9kb2MvcHJvcHMvUF9MQVNUX0RBTVRZUEVTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkN2IwNjAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9MQVNUX0RBTVRZUEVTCkBAIC0wLDAgKzEsMjEgQEAKK05BTUU6CisJUF9MQVNUX0RBTVRZUEVTCQkJImxhc3RfZGFtdHlwZXMiCisKK0RFRklOSUVSVCBJTjoKKwkvc3lzL2xpdmluZy9jb21iYXQuaAorCitCRVNDSFJFSUJVTkc6CisJSW4gZGllc2VyIFByb3BlcnR5IHdlcmRlbiBnZW5hdSBkaWUgU2NoYWRlbnNhcnRlbiBmZXN0Z2VoYWx0ZW4sCisJd2VsY2hlIGVpbiBMZWJld2VzZW4genVsZXR6dCBhYmJla29tbWVuIGhhdC4gRGllIFByb3BlcnR5IGVudGhhZWx0CisJZGllc2UgSW5mb3JtYXRpb24gaGllcmJlaSBpbW1lciBpbiBGb3JtIGVpbmVzIEFycmF5cy4KKwlBdWNoIGRlciBHaWZ0c2NoYWRlbiBkdXJjaCBkaWUgV2lya3VuZyBlaW5lciBWZXJnaWZ0dW5nIHdpcmQgaGllcgorCWZlc3RnZWhhbHRlbi4KKwlEaWVzZXIgV2VydCBrb2VubnRlIHouQi4gd2ljaHRpZyBzZWluLCB3ZW5uIG1hbiBuYWNoIGRlbSBUb2QgZWluZXMKKwlMZWJld2VzZW5zIGZlc3RzdGVsbGVuIG1vZWNodGUsIGR1cmNoIHdhcyBlcyB1bWdla29tbWVuIGlzdC4KKworU0lFSEUgQVVDSDoKKwlQX0xBU1RfREFNQUdFLCBQX0xBU1RfREFNVElNRSwgRGVmZW5kKCksCisJL3N0ZC9saXZpbmcvY29tYmF0LmMsIC9zdGQvbGl2aW5nL2xpZmUuYworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBUdWUgSmFuIDI2IDEyOjM0OjI5IDE5OTkgYnkgUGF0cnluCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9MQVNUX0RFQVRIX1BST1BTIGIvZG9jL3Byb3BzL1BfTEFTVF9ERUFUSF9QUk9QUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTJlMDRlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfTEFTVF9ERUFUSF9QUk9QUwpAQCAtMCwwICsxLDE4IEBACitOQU1FOgorICAgIFBfTEFTVF9ERUFUSF9QUk9QUyAgICAgICAgICAgICAgICAibGFzdF9kZWF0aF9wcm9wcyIKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvbGl2aW5nL2xpZmUuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIERpZXNlIFByb3BlcnR5IGVudGhhZWx0IG5hY2ggZGVtIFRvZCBlaW5lcyBTcGllbGVycyBlaW4gTWFwcGluZyBtaXQgCisgICAgIGRlbiBXZXJ0ZSBhbGxlciBQcm9wZXJ0aWVzLCBkaWUgaW0gZGllKCkgenVydWVja2dlc2V0enQgd2VyZGVuLgorCisgICAgIEF1ZiBkaWVzZSBXZWlzZSBrYW5uIGVpbiBPYmpla3QgYXVjaCBpbSBOb3RpZnlQbGF5ZXJEZWF0aCgpIG5vY2ggCisgICAgIGF1ZiBkaWUgV2VydGUgenVydWVja2dyZWlmZW4sIG9id29obCBzaWUgYmVyZWl0cyBnZWxvZXNjaHQgc2luZC4KKworICAgICBGb2xnZW5kZSBQcm9wZXJ0aWVzIHdlcmRlbiBzbyBnZXNpY2hlcnQ6CisgICAKKyAgICAgUF9QT0lTT04sIFBfRlJPRywgUF9BTENPSE9MLCBQX0RSSU5LLCBQX0ZPT0QgLCBQX0JMSU5ELCBQX0RFQUYsIAorICAgICBQX01BWF9IQU5EUywgUF9QQVJBLCBQX05PX1JFR0VORVJBVElPTiAsIFBfSFAsIFBfU1AsIFBfTEFTVF9ERUFUSF9USU1FCisKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0xBU1RfREVBVEhfVElNRSBiL2RvYy9wcm9wcy9QX0xBU1RfREVBVEhfVElNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWJkNzg3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfTEFTVF9ERUFUSF9USU1FCkBAIC0wLDAgKzEsOCBAQAorTkFNRToKKyAgICBQX0xBU1RfREVBVEhfVElNRSAgICAgICAgICAgICAgICAibGFzdF9kZWF0aF90aW1lIgorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9saXZpbmcvbGlmZS5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGVyIFplaXRwdW5rdCBkZXMgbGV0enRlbiBUb2RlcyBkZXMgU3BpZWxlcnMuCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9MQVNUX0xPR0lOIGIvZG9jL3Byb3BzL1BfTEFTVF9MT0dJTgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mjg3NjU0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfTEFTVF9MT0dJTgpAQCAtMCwwICsxLDE2IEBACitOQU1FOgorICAgIFBfTEFTVF9MT0dJTiAgICAgICAgICAgICAgICAgICJsYXN0X2xvZ2luIiAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9wbGF5ZXIvYmFzZS5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgWmVpdHB1bmt0IGRlcyBsZXR6dGVuIExvZ2lucworCitCRU1FUktVTkdFTjoKKyAgICAgR2VnZW4gYWV1c3NlcmUgQWVuZGVydW5nIHVuZCBTZXQvUXVlcnlNZXRob2RlbiBnZXNjaHVldHp0LgorCitTSUVIRSBBVUNIOgorICAgICBQX0xBU1RfTE9HT1VULCBzYXZlX21lCisKKzI4LiBKYW4gMjAxMyBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfTEFTVF9MT0dPVVQgYi9kb2MvcHJvcHMvUF9MQVNUX0xPR09VVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTZhZTkyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfTEFTVF9MT0dPVVQKQEAgLTAsMCArMSwyMCBAQAorTkFNRToKKyAgICBQX0xBU1RfTE9HT1VUICAgICAgICAgICAgICAgICAibGFzdF9sb2dvdXQiICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcGxheWVyL2Jhc2UuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIFplaXRwdW5rdCBkZXMgbGV0enRlbiBMb2dvdXRzLiBBbmhhbmQgZGllc2VyIFplaXQgd2VyZGVuIGRpZSBGZWluZGVzLQorICAgICBsaXN0ZW4gdW5kIGluIEFid2VzZW5oZWl0IGVpbmdlZnVlZ3RlIEdlZ2Vuc3RhZW5kZSBha3R1YWxpc2llcnQuCisKKyAgICAgRGllc2VzIERhdHVtIHdpcmQgYmVpIE1hZ2llcm4gbmljaHQgYWt0dWFsaXNpZXJ0LCB3ZW5uIHNpZSB1bnNpY2h0YmFyCisgICAgIHNpbmQvc2ljaCB1bnNpY2h0YmFyIGF1c2xvZ2dlbi4KKworQkVNRVJLVU5HRU46CisgICAgIEdlZ2VuIGFldXNzZXJlIEFlbmRlcnVuZyB1bmQgU2V0L1F1ZXJ5TWV0aG9kZW4gZ2VzY2h1ZXR6dC4KKworU0lFSEUgQVVDSDoKKyAgICAgUF9MQVNUX0xPR0lOLCBQX0lOVklTLCBzYXZlX21lLCBpbml0LCBTdG9wSHVudEZvcgorCisyOC4gSmFuIDIwMTMgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0xBU1RfTU9WRSBiL2RvYy9wcm9wcy9QX0xBU1RfTU9WRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjIwMmEyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfTEFTVF9NT1ZFCkBAIC0wLDAgKzEsMjEgQEAKK05BTUU6CisJUF9MQVNUX01PVkUJCQkibGFzdF9tb3ZlIgorCitERUZJTklFUlQgSU46CisJL3N5cy90aGluZy9tb3ZpbmcuaAorCitCRVNDSFJFSUJVTkc6CisJSW4gZGllc2VyIFByb3BlcnR5IHdpcmQgZGllIFplaXQgZGVyIGxldHp0ZW4gQmV3ZWd1bmcgZWluZXMKKwlMZWJld2VzZW5zIGZlc3RnZWhhbHRlbi4gU2VsYnN0ZXJrbGFlcmVuZCBpc3QgYXVjaCBkZXIgZGF6dWdlaG9lcmlnZQorCVF1ZWxsY29kZSBpbm5lcmhhbGIgbW92ZSgpIGluICcvc3RkL2xpdmluZy9tb3ZpbmcuYyc6CisJICBTZXRQcm9wKFBfTEFTVF9NT1ZFLHRpbWUoKSk7CisJV2ljaHRpZyBpc3QgZGllc2UgUHJvcGVydHkgaW5zYmVzb25kZXJlIGZ1ZXIgZGllIFVudGVyYmluZHVuZyB2b24KKwlSZWluLUFuZ3JpZmYtUmF1cy1UYWt0aWtlbi4gRGllc2VyIE1vZHVzIGlzdCBzdGFuZGFyZG1hZXNzaWcgaW4gamVkZW0KKwlOUEMgYWt0aXZpZXJ0IHVuZCBrYW5uIHVlYmVyIGRpZSBQcm9wZXJ0eSBQX0VOQUJMRV9JTl9BVFRBQ0tfT1VUCisJYXVzZ2VzY2hhbHRlbiB3ZXJkZW4uCisKK1NJRUhFIEFVQ0g6CisJbW92ZSgpLCB0aW1lKCksIFBfRU5BQkxFX0lOX0FUVEFDS19PVVQsIC9zdGQvbGl2aW5nL21vdmluZy5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBTYXQgSmFuIDMwIDEyOjUzOjAwIDE5OTkgYnkgUGF0cnluCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9MQVNUX1VTRSBiL2RvYy9wcm9wcy9QX0xBU1RfVVNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYTg3NWQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9MQVNUX1VTRQpAQCAtMCwwICsxLDIwIEBACitQX0xBU1RfVVNFCisKK05BTUU6CisgICAgIFBfTEFTVF9VU0UgImxhc3RfdXNlIgorCitERUZJTklFUlQgSU46CisgICAgIDxwcm9wZXJ0aWVzLmg+CisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGllc2UgUHJvcGVydHkgd2lyZCBpbiBSdWVzdHVuZ2VuIHVuZCBXYWZmZW4gZGF6dSBiZW51dHp0IHVtCisgICAgIGZlc3R6dWhhbHRlbiwgd2FubiBkaWUgUnVlc3R1bmcvV2FmZmUgenVsZXR6dCBpbSBLYW1wZiBiZW51dHp0CisgICAgIHd1cmRlLgorCitTSUVIRSBBVUNIOgorICAgICBSdWVzdHVuZ2VuOglRdWVyeURlZmVuZChMKQorICAgICBXYWZmZW46CQlRdWVyeURhbWFnZShMKQorICAgICBTb25zdGlnZXM6CQlQX0VRVUlQX1RJTUUsIFBfVU5XSUVMRF9USU1FCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IEZyaSBGZWIgMDYgMTA6MTU6MDAgMTk5OCBieSBQYXJhY2Vsc3VzCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9MQVNUX1dFQVJfQUNUSU9OIGIvZG9jL3Byb3BzL1BfTEFTVF9XRUFSX0FDVElPTgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTRkMjI0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfTEFTVF9XRUFSX0FDVElPTgpAQCAtMCwwICsxLDI0IEBACitQUk9QRVJUWToKKworCVBfTEFTVF9XRUFSX0FDVElPTiAgICAibGFzdF93ZWFyX2FjdGlvbiIKKworREVGSU5JRVJUIElOOiAKKworCS9zeXMvYXJtb3VyLmggKHVuZCBkYW1pdCBhdWNoIGluIHByb3BlcnRpZXMuaCkKKworQkVTQ0hSRUlCVU5HOgorCisJRGllc2UgUHJvcCBnaWJ0IGFuLCB3ZWxjaGUgQW4vQXVzemllaC1Ba3Rpb24gZWluIFNwaWVsZXIgenVsZXR6dAorCWR1cmNoZ2VmdWVocnQgaGF0LiBTaWUgaXN0IGVpbiB6d2VpZWxlbWVudGlnZXMgQXJyYXksIHdvYmVpIGRlcgorCWVyc3RlIEVpbnRyYWcgYW5naWJ0LCBvYiBkZXIgU3BpZWxlciBzaWNoIGFuLSBvZGVyIGF1c2dlem9nZW4KKwloYXQgKFdBX1dFQVIsIFdBX1VOV0VBUiwgYXVjaCBpbiBhcm1vdXIuaCBkZWZpbmllcnQpIHVuZCBkZXIKKwl6d2VpdGUgZGVuIFplaXRwdW5rdC4KKworCURpZSBQcm9wZXJ0eSB3aXJkICh1bnRlciBhbmRlcmVtPykgZGFmdWVyIHZlcndlbmRldCBmZXN0enVzdGVsbGVuIG9iCisJZGVyIFNwaWVsZXIgaW4gZGVyIGxldHp0ZW4gUnVuZGUgc2Nob24gZWluZW4gUnVlc3R1bmdzd2VjaHNlbAorCXZvcmdlbm9tbWVuIGhhdCB1bmQgZWluZW4gZW50Z2VnZW5nZXNldHp0ZW4genUgdW50ZXJiaW5kZW4uCisKK0xFVFpURSBBRU5ERVJVTkc6IAorCisyMDAzLTAxLTI5LCAxNzozMCB2b24gSHVtbmkKKwpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfTEFTVF9YUCBiL2RvYy9wcm9wcy9QX0xBU1RfWFAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVlZTA1NQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0xBU1RfWFAKQEAgLTAsMCArMSwyNyBAQAorTkFNRToKKyAgICBQX0xBU1RfWFAgICAgICAgICAgICAgICAgICAgICAgICAibGFzdF94cCIKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvbGl2aW5nL2xpZmUuaAorCitCRVNDSFJFSUJVTkc6CisgICAgRWluIEFycmF5IHZvbSBUeXAgKHsgcGZhZCwgeHAgfSkuCisKKyAgICBEZXIgRWludHJhZyAicGZhZCIgZ2lidCBkYXMgR2ViaWV0IGFuLCBpbiBkZW0gZWluIFNwaWVsZXIgenVsZXR6dCBYUAorICAgIGJla29tbWVuIGhhdC4gRGFiZWkgd2lyZCBhdXMgIi9kL2ViZW5lL21hZ2llci9yb29tL3JhdW0xLmMiIGRhbm4KKyAgICAiL2QvZWJlbmUvbWFnaWVyL3Jvb20iLgorCisgICAgRGVyIFdlcnQgInhwIiB6ZWlndCBhbiwgd2lldmllbGUgWFAgZGVyIFNwaWVsZXIgX2luIGRpZXNlbSBHZWJpZXRfCisgICAgZ2VzYW1tZWx0IGhhdC4gU29iYWxkIGVyIGF1Y2ggbnVyIGVpbmVuIFhQIGluIGVpbmVtIGFuZGVyZW4gR2ViaWV0CisgICAgYmVrb21tdCwgemVpZ3QgUF9MQVNUX1hQIG51ciBub2NoIGRpZXNlbiBuZXUgZXJoYWx0ZW5lbiBYUCBhbi4KKworICAgIERlciBBbndlbmR1bmdzendlY2sgd2FlcmUgei5CLiBlaW5lIEhlaWxzdGVsbGUsIGRpZSBudXIgZGFubiBXaXJrdW5nCisgICAgemVpZ3QsIHdlbm4gZGVyIFNwaWVsZXIgd2lya2xpY2ggaW4gZGVtIGJldHJlZmZlbmRlbiBHZWJpZXQgZ2VtZXR6ZWx0IGhhdAorICAgIHVuZCBuaWNodCBudXIgenVtIFRhbmtlbiBoZXJnZXJhbm50IGlzdCBvZGVyIGVpbmUgVW50ZXJzY2hlaWR1bmcsIG9iCisgICAgamVtYW5kIG1ldHplbHQgb2RlciBudXIgdWVidCAodWViZXIgZGllIFhQKS4KKworU0lFSEUgQVVDSDoKKyAgICAgRnVua3Rpb25lbjogIEFkZEV4cCgpCisgICAgIFZlcndhbmR0OiAgICBQX05PX1hQLCBQX1hQCisKKzE0LkZlYiAyMDA3IEdsb2luc29uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfTEVBVkVDTURTIGIvZG9jL3Byb3BzL1BfTEVBVkVDTURTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMWNmOGEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9MRUFWRUNNRFMKQEAgLTAsMCArMSwzMiBAQAorTkFNRToKKyAgICBQX0xFQVZFQ01EUyAgICAgICAgICAgICAgICAgICAibGVhdmVjbWRzIiAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvdHJhbnNwb3J0LmgKKworQkVTQ0hSRUlCVU5HOgorICAgIEVpbiBBcnJheSBtaXQgQmVmZWhsZW4sIGRpZSB6dW0gVmVybGFzc2VuIGRlcyBUcmFuc3BvcnRlcnMgZnVlaHJlbi4gCisKK0JFSVNQSUVMOgorICAgIFNldFByb3AoUF9MRUFWRUNNRFMsKHsgInZlcmxhc3MiLCJ2ZXJsYXNzZSIgfSkgKTsKKworICAgIEdpYnQgZGVyIFNwaWVsZXIgbnVuICd2ZXJsYXNzZSB4eHgnIGVpbiwgc28gc29yZ3QgL3N0ZC90cmFuc3BvcnQuYyAKKyAgICBkYWZ1ZXIsIGRhcyBkZXIgU3BpZWxlciBhdWNoIHZvbiBvZGVyIGF1cyBkZW0gVHJhbnNwb3J0ZXIgYmV3ZWd0IAorICAgIHdpcmQuIFZvcmF1c2dlc2V0enQgbmF0dWVybGljaCwgZXIgaXN0IGFuIGVpbmVtIEhhbHRlcHVua3QgYW5nZWxhbmd0LgorCitCRU1FUktVTkdFTjoKKyAgICBVbSAvc3RkL3RyYW5zcG9ydC5jIG5pY2h0IGF1Znp1YmxhZWhlbiwgd2VyZGVuIHdlaXRlcmUgQXJndW1lbnRlIHdpZQorICAgIGV0d2EgJ3Zlcmxhc3NlIGRhc3xkaWV8ZGVuIHh4eCcgX25pY2h0XyB1bnRlcnN0dWV0enQhCisKKyAgICBIaWVyIG11c3MgZGVyIHZlcmFudHdvcnRsaWNoZSBNYWdpZXIgc2Nob24gZWluZSBlaWdlbmUgTG9lc3VuZyBmaW5kZW4KKyAgICB1bmQgaW4gc2VpbmVuIFRyYW5zcG9ydGVyIHNjaHJlaWJlbi4KKworICAgIFNvbGxlbiBLb21tYW5kb3MgenVtIEJldHJldGVuIFVORCBWZXJsYXNzZW4gZWluZXMgVHJhbnNwb3J0ZXJzIHZlci0KKyAgICB3ZW5kZXQgd2VyZGVuIGtvZW5uZW4sIG11ZXNzZW4gZGllc2UgaW4gUF9UUkFWRUxfQ01EUyBnZXNldHp0IHdlcmRlbi4KKworU0lFSEUgQVVDSDoKKyAgICBQX0xFQVZFRkFJTCwgUF9FTlRFUkZBSUwsIFBfRU5URVJDTURTLCBQX1RSQVZFTF9DTURTLCB0cmFuc3BvcnRlciwKKworTEVUWlRFIEFFTkRFUlVORzoKKyAgICBEb24sIDI0LjAxLjIwMDIsIDEwOjE1OjA3aCB2b24gVGlsbHkKKyAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9MRUFWRUZBSUwgYi9kb2MvcHJvcHMvUF9MRUFWRUZBSUwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU0YjRhMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0xFQVZFRkFJTApAQCAtMCwwICsxLDI2IEBACitOQU1FOgorICAgIFBfTEVBVkVGQUlMICAgICAgICAgICAgICAgICAgICJsZWF2ZWZhaWwiICAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy90cmFuc3BvcnQuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIE1lbGR1bmcgYW4gZGVuIFNwaWVsZXIsIHdlbm4gZXIgYXVzc2VyaGFsYiBkZXIgQW5sZWdlemVpdGVuIGVpbmVuIAorICAgICBUcmFuc3BvcnRlciB2ZXJsYXNzZW4gd2lsbC4gSXN0IGRpZSBQcm9wZXJ0aWUgZWluIEFycmF5LCBzbyB3aXJkIAorICAgICBkYXMgZXJzdGUgRWxlbWVudCBhbHMgTWVsZHVuZyBhbiBkZW4gU3BpZWxlciwgZGFzIHp3ZWl0ZSBhbHMgCisgICAgIE1lbGR1bmcgYW4gZGllIE1pdHNwaWVsZXIgaW0gVHJhbnNwb3J0ZXIgZ2VzY2hpY2t0LiBJc3QgZGVyIEVpbnRyYWcKKyAgICAgZGFnZWdlbiBlaW4gc2ltcGxlciBTdHJpbmcsIHNvIHdpcmQgZGllIE1lbGR1bmcgbnVyIGFuIGRlbiBTcGllbGVyCisgICAgIGF1c2dlZ2ViZW4uCisKK0JFSVNQSUVMOgorICAgICBTZXRQcm9wKFBfTEVBVkVGQUlMLCAiRGllIFdpbGRnYWVuc2UgZmxpZWdlbiB2aWVsIHp1IGhvY2giICk7CisKKyAgICAgU2V0UHJvcChQX0xFQVZFRkFJTCwgKHsgIkRpZSBXaWxkZ2FlbnNlIGZsaWVnZW4gdmllbCB6dSBob2NoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZlcnN1Y2h0LCB2b20gUnVlY2tlbiBkZXIgV2lsZGdhbnMgenUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsia2xldHRlcm4gdW5kIGJlc2lubnQgc2ljaCBkYW5uIGRvY2giIH0pICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorU0lFSEUgQVVDSDoKKyAgICAgUF9MRUFWRU1TRywgUF9FTlRFUk1TRywgUF9FTlRFUkZBSUwsIHRyYW5zcG9ydGVyCisKK0xFVFpURSBBRU5ERVJVTkc6CisgICAgRG9uLCAyNC4wMS4yMDAyLCAxMDoxNTowN2ggdm9uIFRpbGx5CmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9MRUFWRU1TRyBiL2RvYy9wcm9wcy9QX0xFQVZFTVNHCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MmJiYzQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9MRUFWRU1TRwpAQCAtMCwwICsxLDE5IEBACitOQU1FOgorICAgIFBfTEVBVkVNU0cgICAgICAgICAgICAgICAgICAgICJsZWF2ZW1zZyIgICAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy90cmFuc3BvcnQuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIEFycmF5IG1pdCB6d2VpIE1lbGR1bmdlbi4gRGVyIGVyc3RlIEVpbnRyYWcgd2lyZCBhbiBkZW4gVHJhbnNwb3J0ZXIKKyAgICAgYXVzZ2VnZWJlbiwgZGVyIHp3ZWl0ZSBhbiBkZW4gUmF1bSBpbiBkZW4gZGVyIFNwaWVsZXIga29tbXQuCisKK0JFSVNQSUVMOgorICAgICBTZXRQcm9wKFBfTEVBVkVNU0csICh7ICJrbGV0dGVydCB2b20gUnVlY2tlbiBkZXIgV2lsZGdhbnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrb21tdCB2b20gUnVlY2tlbiBlaW5lciBXaWxkZ2FucyBoZXJ1bnRlciIgfSkgKTsKKworU0lFSEUgQVVDSDogCisgICAgIFBfRU5URVJNU0csIFBfTEVBVkVGQUlMLCBQX0VOVEVSRkFJTCwgdHJhbnNwb3J0ZXIKKworTEVUWlRFIEFFTkRFUlVORzoKKyAgICBEb24sIDI0LjAxLjIwMDIsIDEwOjE1OjA3aCB2b24gVGlsbHkKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0xFUCBiL2RvYy9wcm9wcy9QX0xFUApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjI4YjFjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfTEVQCkBAIC0wLDAgKzEsOSBAQAorTkFNRToKKyAgICBQX0xFUCAgICAgICAgICAgICAgICAgICAgICAgICAibGVwIiAgICAgICAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcGxheWVyLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBMZXZlbHB1bmt0ZSBlaW5lcyBTcGllbGVycworICAgICBOSUNIVCBWT04gSEFORCBTRVRaRU4hISEKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0xFVkVMIGIvZG9jL3Byb3BzL1BfTEVWRUwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBiZTVkMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0xFVkVMCkBAIC0wLDAgKzEsMzMgQEAKK05BTUU6CisgICAgUF9MRVZFTCAgICAgICAgICAgICAgICAgICAgICAgImxldmVsIiAgICAgICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL2xpdmluZy9kZXNjcmlwdGlvbi5oCisKK0JFU0NIUkVJQlVORzoKKworICAgICBTcGllbGVyLUxldmVsICghPSBNYWdpZXJsZXZlbCkKKworICAgICBJbiBLcmFua2hlaXRzLSAoQ0xfRElTRUFTRSkgdW5kIEdpZnRvYmpla3RlbiAoQ0xfUE9JU09OKSBkcnVlY2t0IAorICAgICBQX0xFVkVMIGF1cywgd2llIHNjaHdlciBkaWUgS3JhbmtoZWl0L2RhcyBHaWZ0IGlzdC4gSmUgbmFjaGRlbSwgd2llIAorICAgICBob2NoIG9kZXIgbmllZHJpZyBkZXIgTGV2ZWwgZ2VzZXR6dCB3aXJkLCBtdXNzIHouQi4gZWluIEtsZXJpa2VyIG1laHIgCisgICAgIG9kZXIgd2VuaWdlciBvZnQga3VyaWVyZW4sIHVtICBlaW5lIChnZ2YuIHN0dWZlbndlaXNlKSBIZWlsdW5nIHp1IAorICAgICBiZXdpcmtlbi4KKworICAgICBJbiBGbHVjaG9iamVrdGVuIChDTF9DVVJTRSkgZ2lidCBQX0xFVkVMIGViZW5mYWxscyBkaWUgU2Nod2VyZSBkZXMKKyAgICAgRmx1Y2hlcyBhbiwgamVkb2NoIGlzdCBoaWVyIHp1IGJlYWNodGVuLCBkYXNzIHouQi4gS2xlcmlrZXIgYWt0dWVsbAorICAgICBrZWluZSBzdHVmZW53ZWlzZSBTY2h3YWVjaHVuZyBiZXdpcmtlbiBrb2VubmVuLCBzb25kZXJuIGVudHdlZGVyIGRlbgorICAgICBGbHVjaCBlbnRmZXJuZW4ga29lbm5lbiBvZGVyIGtvbXBsZXR0IHNjaGVpdGVybi4gCisgICAgIERlciBGbHVjaGxldmVsIGlzdCBoaWVyIGdyb2IgYWxzIENoYW5jZSBkZXMgU2NoZWl0ZXJucyBpbiBlaW5lbSAKKyAgICAgV2VydGViZXJlaWNoIHZvbiAxLTEwMCB6dSBzZWhlbiwgd2FzIGJlZGV1dGV0LCBkYXNzIGVpbiBGbHVjaGxldmVsIAorICAgICB2b24gMTAwIGFscyBwZXJtYW5lbnRlciwgbmljaHQgZW50ZmVybmJhcmVyIEZsdWNoIGFuenVzZWhlbiBpc3QuCisKKyAgICAgR2VuYXVlcmVzIGlzdCBpbiBkZXIgS2xlcnVzZ2lsZGUgbmFjaHp1bGVzZW4gb2RlciBiZWltIEdNIEtsZXJ1cyB6dQorICAgICBlcmZyYWdlbi4KKworU0lFSEUgQVVDSDoKKyAgICAgUHJvcGVydGllczogIFBfR1VJTERfTEVWRUwKKyAgICAgQWxsZ2VtZWluZXM6IC9kb2Mvd2l6L2dpZnQsIC9kb2MvaGVscC9naWZ0CisgICAgIEZ1bmt0aW9uZW46ICBBZGRDbGFzcyhMKSwgaXNfY2xhc3NfbWVtYmVyKEwpCisKK0xldHp0ZSBBZW5kZXJ1bmc6IDIwMTUtRmViLTAyLCBBcmF0aG9ybi4KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0xJRkVUSU1FIGIvZG9jL3Byb3BzL1BfTElGRVRJTUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUwYzI4NwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0xJRkVUSU1FCkBAIC0wLDAgKzEsMzAgQEAKK05BTUU6DQorICAgICBQX0xJRkVUSU1FICAgICAgICAgICAgICAgICAgICAic3RkX2Zvb2RfbGlmZXRpbWUiDQorDQorREVGSU5JRVJUIElOOg0KKyAgICAgL3N5cy9mb29kLmgNCisNCitCRVNDSFJFSUJVTkc6DQorICAgICBaZWl0IGluIFNla3VuZGVuLCBkaWUgZGllIFNwZWlzZSBoYWx0YmFyIGlzdC4NCisgICAgIE1pdCBTZXR6ZW4gZGllc2VyIFByb3BlcnR5IHdpcmQgZGVyIFdlcnQgZnVlciBQX1JFU0VUX0xJRkVUSU1FIHVuZA0KKyAgICAgZG9ydCBnZXNwZWljaGVydC4NCisgICAgIE5hY2ggZGllc2VyIFplaXQgd2lyZCBkaWVzZSBTcGVpc2Ugc2NobGVjaHQgdW5kIGplIG5hY2ggS29uZmlndXJhdGlvbg0KKyAgICAgZGVyIFNwZWlzZSBldmVudHVlbGwgemVyc3RvZXJ0LiBTaWNoZXJnZXN0ZWxsdCB3aXJkIGRpZXMgZHVyY2ggZGVuDQorICAgICBBdWZydWYgdm9uIHJlc2V0KCkgbmFjaCBkaWVzZXIgQW56YWhsIFNla3VuZGVuLg0KKyAgICAgTW9lY2h0ZSBtYW4gZWluZSBTcGVpc2UgaGFiZW4sIGRpZSBuaWVtYWxzIHZlcmRpcmJ0DQorICAgICAoZ2VuZWhtaWd1bmdzcGZsaWNodGlnISksIG51dHp0IG1hbiBkaWUgUHJvcGVydHkgUF9OT19CQUQNCisgICAgIA0KK0JFTUVSS1VOR0VOOg0KKyAgICAgU29iYWxkIGRlciBDb3VudGRvd24genVtIFNjaGxlY2h0d2VyZGVuIGRlciBTcGVpc2UgbGFldWZ0LCBhbHNvIGVpbg0KKyAgICAgU3BpZWxlciBkYW1pdCBpbiBCZXJ1ZWhydW5nIGthbSwgemVpZ3QgU2V0UHJvcCBhdWYgZGllc2UgUHJvcGVydHkga2VpbmUNCisgICAgIFdpcmt1bmcgbWVoci4NCisNCitERUZBVUxUOg0KKyAgICAgT2huZSBTZXR6ZW4gdm9uIFBfTElGRVRJTUUgLFBfUkVTRVRfTElGRVRJTUUgdW5kIFBfTk9fQkFEIHZlcmRpcmJ0IGRpZQ0KKyAgICAgU3BlaXNlIG5hY2ggZWluZW0gUmVzZXQsIGFsc28gendpc2NoZW4gMzAgdW5kIDYwIE1pbnV0ZW4NCisNCitTSUVIRSBBVUNIOg0KKyAgICAgd2l6L2Zvb2QsIFBfUkVTRVRfTElGRVRJTUUsIFBfTk9fQkFEDQorDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorTGFzdCBtb2RpZmllZDogVGh1IE9jdCAyOCAxMjoxNTowMCAyMDEwIGJ5IENhbGRyYQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0xJR0hUIGIvZG9jL3Byb3BzL1BfTElHSFQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUxZTkyNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0xJR0hUCkBAIC0wLDAgKzEsNjIgQEAKK05BTUU6CisgICAgUF9MSUdIVCAgICAgICAgICAgICAgICAgICAgICAgImxpZ2h0IgorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9wcm9wZXJ0aWVzLmgKKworQkVTQ0hSRUlCVU5HOgorICAgIEdpYnQgZGVuIExpY2h0bGV2ZWwgZWluZXMgT2JqZWt0ZXMgYW4sIGQuaC4gd2llIGhlbGwgZGFzIE9iamVrdCB2b24gc2ljaAorICAgIGF1cyBsZXVjaHRldC4gTW9lY2h0ZSBtYW4gZGVuIGdlc2FtdGVuIExpY2h0bGV2ZWwgaGFiZW4gZGVyIHZvbiBlaW5lbQorICAgIE9iamVrdCBhdXNnZWh0LCBzbyBzb2xsdGUgbWFuIFBfVE9UQUxfTElHSFQgbmVobWVuLCBkYXMgZGVuIEluaGFsdCBlaW5lcworICAgIENvbnRhaW5lcnMgZGlyZWt0IG1pdCB2ZXJyZWNobmV0LgorCisgICAgQml0dGUgX251cl8gdWViZXIgU2V0UHJvcCBiencuIFF1ZXJ5UHJvcCB6dWdyZWlmZW4sIGRhIGVzIGZ1ZXIgZGllCisgICAgQmVyZWNobnVuZyB3aWNodGlnIGlzdCwgZGFzIGluIGFsbGVuIENvbnRhaW5lcm4gUF9MQVNUX0NPTlRFTlRfQ0hBTkdFCisgICAgZ2VzZXR6dCB3aXJkIHVtIGVpbiBuZXViZXJlY2huZW4gZGVzIExpY2h0bGV2ZWxzIGF1c3p1bG9lc2VuIQorCitBTk1FUktVTkc6CisgICAgVW0gZWluIHVuZ2VmYWVocmVzIEdlZnVlaGwgZGF2b24genUgYmVrb21tZW4gd2FzIGVpbiBMaWNodGxldmVsIGluCisgICAgZXR3YSBiZWRldXRldCBoaWVyIGVpbmlnZSBhbGxnZW1laW5lIEJlaXNwaWVsZSB2b24gR2VnZW5zdGFlbmRlbi4KKyAgICBHcnVuZHNhZXR6bGljaCBzb2xsdGVuIExpY2h0bGV2ZWwgPDAgdW5kID4yIG51ciBpbiBSdWVja3NwcmFjaGUgbWl0IGRlbQorICAgIEJhbGFuY2V0ZWFtIGJlbnV0enQgd2VyZGVuLgorCisgICAgTGljaHRsZXZlbCAtMSwgIHouQi4gZWluIHNjaHdhcnplciBSaW5nLCB2b24gZGVtIGVpbmUga2xlaW5lIGR1bmtsZSBBdXJhCisgICAgICAgICAgICAgICAgICAgIGF1c2dlaHQsIGRpZSBkZW4gU3BpZWxlciB1bWdpYnQuCisgICAgTGljaHRsZXZlbCAgMCwgIGRlciBHZWdlbnN0YW5kIGJlZWluZmx1c3N0IGRhcyBMaWNodCB1ZWJlcmhhdXB0IG5pY2h0CisgICAgTGljaHRsZXZlbCAgMSwgIGRlciBTcGllbGVyIGhhZWx0IGVpbmUga2xlaW5lIExpY2h0cXVlbGxlIGluIEhhZW5kZW4sCisgICAgICAgICAgICAgICAgICAgIGRpZXNlcyBrYW5uIGVpbiBMZXVjaHRwZmlyc2ljaCwgZWluZSBGYWNrZWwgb2RlciBlaW4KKyAgICAgICAgICAgICAgICAgICAgRmV1ZXJzY2h3ZXJ0IG9kZXIgYWVobmxpY2hlcyBzZWluLgorICAgIExpY2h0bGV2ZWwgIDIsICBlaW5lIGV0d2FzIGdyb2Vzc2VyZSBMaWNodHF1ZWxsZSwgZGllIGFiZXIgaW1tZXIgbm9jaAorICAgICAgICAgICAgICAgICAgICBuaWNodCBkZW4gUmF1bSBiZWxldWNodGV0IHNvbmRlcm4gbGVkaWdsaWNoIGRlbSBTcGllbGVyCisgICAgICAgICAgICAgICAgICAgIGVpbmVuIExpY2h0c2NoZWluIGdld2FlaHJ0IG1pdCBkZW0gZXIgc2VoZW4ga2Fubi4KKyAgICBMaWNodGxldmVsID4yLCAgZXh0cmVtIGhlbGxlIExpY2h0cXVlbGxlbiwgZGllIGRlbiBnZXNhbXRlbiBSYXVtCisgICAgICAgICAgICAgICAgICAgIGF1c2xldWNodGVuLCBpbiBkZXIgUmVnZWwgd29obCBlaGVyIG1hZ2lzY2hlciBOYXR1ci4KKyAgICAgICAgICAgICAgICAgICAgU29sY2hlIExpY2h0cXVlbGxlbiBzb2xsdGVuIHNpY2ggbWl0IGRlciBaZWl0CisgICAgICAgICAgICAgICAgICAgIHZlcmJyYXVjaGVuLCBkZW0gU3BpZWxlciBTY2hhZGVuIHp1ZnVlZ2VuIG9kZXIKKyAgICAgICAgICAgICAgICAgICAgYWVobmxpY2hlcywgZGFtaXQgZGllIFNwaWVsZXIgbmljaHQgZGVmYXVsdG1hZXNzaWcgbWl0CisgICAgICAgICAgICAgICAgICAgIGVpbmVyIHNvbGNoZW4gTGljaHRxdWVsbGUgZHVyY2hzIE1HIHppZWhuLgorCisgICAgRGFyYXVzIGVyZ2ViZW4gc2ljaCBkYW5uIGZvbGdlbmRlIEtvbnNlcXVlbnplbiBmdWVyIFJhZXVtZToKKyAgICBMaWNodGxldmVsICA+MTogRGVyIFJhdW0gaXN0IHNlaHIgaGVsbCBlcmxldWNodGV0IHVuZCBrYW5uIHZvbiBTcGllbGVybgorICAgICAgICAgICAgICAgICAgICBuaWNodCBvZGVyIG51ciBzZWhyIHNjaHdlciBhYmdlZHVua2VsdCB3ZXJkZW4uIEVpbiBXZXJ0CisgICAgICAgICAgICAgICAgICAgIHZvbiAyLTMga2FubiBpbnRlcmVzc2FudCBzZWluLCB3ZW5uIGRpZSBOUENzIGltIFJhdW0KKyAgICAgICAgICAgICAgICAgICAgdWViZXIga2VpbmUgTmFjaHRzaWNodCB2ZXJmdWVnZW4uIFVlYmVyIGVpbiBBYmR1bmtlbG4gZGVzCisgICAgICAgICAgICAgICAgICAgIFJhdW1lcyBrYW5uIGRlciBTcGllbGVyIGRhbm4gZG9jaCBkZW4gTmFjaHRrYW1wZiBudXR6ZW4uCisgICAgTGljaHRsZXZlbCAgIDE6IERlciBSYXVtIGlzdCBlcmxldWNodGV0IHVuZCBkaWUgU3BpZWxlciBrb2VubmVuIG9obmUKKyAgICAgICAgICAgICAgICAgICAgd2VpdGVyZSBMaWNodHF1ZWxsZW4gc2VoZW4uLi4KKyAgICBMaWNodGxldmVsICAgMDogRWluIGR1bmtsZXIgUmF1bSBpbiBkZW0gbWFuIG1pdCBqZWRlciBGYWNrZWwgc2VoZW4ga2Fubi4KKyAgICBMaWNodGxldmVsICAtMTogbWFuIGJlbm9ldGlndCB6d2VpIGVpbmZhY2hlIExpY2h0cXVlbGxlbiBvZGVyIE5hY2h0c2ljaHQKKyAgICAgICAgICAgICAgICAgICAgdW0gaW4gZGllc2VtIFJhdW0gZXR3YXMgc2VoZW4genUga29lbm5lbi4KKyAgICBMaWNodGxldmVsICAtMjogTWFuIGJlbm9ldGlndCBzY2hvbiBlaW5lIGJlc29uZGVyZSBMaWNodHF1ZWxsZSB1bSBpbgorICAgICAgICAgICAgICAgICAgICBkaWVzZW0gUmF1bSBub2NoIGV0d2FzIHNlaGVuIHp1IGtvZW5uZW4uIFNvbGNoZQorICAgICAgICAgICAgICAgICAgICBMaWNodHF1ZWxsZW4gc2luZCBuaWNodHMgZnVlciBBbmZhZW5nZXIgb2RlciBtaXR0bGVyZQorICAgICAgICAgICAgICAgICAgICBTcGllbGVyIGRhIHNpZSBzY2h3ZXIgenUgYmVzY2hhZmZlbiB1bmQgaW4gZGVyIFJlZ2VsCisgICAgICAgICAgICAgICAgICAgIGF1Y2ggZWluaWdlIEhhbmRpY2FwcyBoYWJlbi4KKyAgICBMaWNodGxldmVsIDwtMjogRGVyIFJhdW0gaXN0IHdpcmtsaWNoIGFic29sdXQgc3RvY2tkdXN0ZXIgdW5kCisgICAgICAgICAgICAgICAgICAgIExpY2h0cXVlbGxlbiBkaWUgc29sY2ggZWluZW4gUmF1bSBhdXNsZXVjaHRlbiBrb2VubmVuLAorICAgICAgICAgICAgICAgICAgICBzaW5kIGF1c3Nlcm9yZGVudGxpY2ggc2VsdGVuIHVuZCBoYWJlbiBpbW1lciBpaHJlCisgICAgICAgICAgICAgICAgICAgIFR1ZWNrZW4uIERpZXNlIExpY2h0bGV2ZWwgc29sbHRlbiBudXIgbWl0IFZvcnNpY2h0CisgICAgICAgICAgICAgICAgICAgIGdlbm9zc2VuIHdlcmRlbi4KKworU0lFSEUgQVVDSDoKKyAgICBQX1RPVEFMX0xJR0hULCBQX0lOVF9MSUdIVCwgUF9QTEFZRVJfTElHSFQsIFBfTElHSFRfTU9ESUZJRVIsIENhbm5vdFNlZSgpCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9MSUdIVERFU0MgYi9kb2MvcHJvcHMvUF9MSUdIVERFU0MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg5OGRiOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0xJR0hUREVTQwpAQCAtMCwwICsxLDM0IEBACitOQU1FOgorICAgIFBfTElHSFRERVNDICAgICAgICAgICAgICAgICAgICJsaWdodGRlc2MiICAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9wcm9wZXJ0aWVzLmgKKworQkVTQ0hSRUlCVU5HOgorICAgIFN0cmluZyBvZGVyIEFycmF5IHZvbiBTdHJpbmdzIG1pdCBBZGpla3RpdmVuLCBkaWUgZGFzIExldWNodGVuIGRlciAKKyAgICBMaWNodHF1ZWxsZSBiZXNjaHJlaWJlbiAoei5CLiBsZXVjaHRlbmQsIGJyZW5uZW5kLCBnbHVlaGVuZCkuCisgICAgU3RhbmRhcmRtYWVzc2lnIGlzdCBkaWUgUHJvcGVydHkgYXVmICJicmVubmVuZCIgZ2VzZXR6dC4KKworICAgIFdlbm4gZWluIEFycmF5IGFuZ2VnZWJlbiB3aXJkLCB3ZXJkZW4gZGllIEJlc2NocmVpYnVuZ2VuIHBhc3NlbmQgYXVmCisgICAgZGllIEJlbm5kYXVlciBhdWZnZXRlaWx0IHVuZCBkYXMgenVyIGFrdHVlbGwgbm9jaCB2b3JoYW5kZW5lbiBSZXN0LQorICAgIEJyZW5uZGF1ZXIgcGFzc2VuZGUgQWRqZWt0aXYgYXVzZ2VnZWJlbi4gRGFzIEFycmF5IHdpcmQgZGFiZWkgcnVlY2stCisgICAgYWVydHMgZHVyY2hsYXVmZW4sIGQuaC4gZnVlciBlaW5lIGZyaXNjaCBlbnR6dWVuZGV0ZSBMaWNodHF1ZWxsZSB3aXJkCisgICAgZGVyIGxldHp0ZSBFaW50cmFnIGRlcyBBcnJheXMgdmVyd2VuZGV0IChzLiBCZWlzcGllbGUpLgorCitCRUlTUElFTEU6CisgICAgRWluZSBlaW5mYWNoZSBPZWxsYW1wZToKKworICAgIFNldFByb3AoUF9MSUdIVERFU0MsICJhbmdlenVlbmRldCIpOworCisgICAgRWluZSBGYWNrZWwgbWl0IG1laHJlcmVuIEJyZW5uc3RhZGllbiAoYXVzIC9pdGVtcy9mYWNrZWwuYyk6CisKKyAgICBTZXRQcm9wKFBfTElHSFRERVNDLCAoeyJnbGltbWVuZCIsImZsYWNrZXJuZCIsImxlaWNodCBmbGFja2VybmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJicmVubmVuZCIsImhlbGwgbG9kZXJuZCIsImZyaXNjaCBhbmdlenVlbmRldCJ9KSk7CisKK1NJRUhFIEFVQ0g6CisgICAgQmFzaXNrbGFzc2VuOiAvc3RkL2xpZ2h0c291cmNlLmMKKyAgICBQcm9wZXJ0aWVzOiAgIFBfRlVFTCwgUF9ET19ERVNUUlVDVCwgUF9MSUdIVAorICAgIE1ldGhvZGVuOiAgICAgQWRkRnVlbChMKQorCitMRVRaVEUgQUVOREVSVU5HOgorICAgIDIyLiBEZXouIDIwMTUsIEFyYXRob3JuCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9MSUdIVEVEIGIvZG9jL3Byb3BzL1BfTElHSFRFRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDI5YjAyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfTElHSFRFRApAQCAtMCwwICsxLDggQEAKK05BTUU6CisgICAgUF9MSUdIVEVEICAgICAgICAgICAgICAgICAgICAgImxpZ2h0ZWQiICAgICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3Byb3BlcnRpZXMuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIEZsYWcsIG9iIGRpZSBMaWNodHF1ZWxsZSBpbiBCZXRyaWViIGlzdC4KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0xJR0hUX0FCU09SUFRJT04gYi9kb2MvcHJvcHMvUF9MSUdIVF9BQlNPUlBUSU9OCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMzEyMGYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9MSUdIVF9BQlNPUlBUSU9OCkBAIC0wLDAgKzEsMTUgQEAKK05BTUU6CisgICAgUF9MSUdIVF9BQlNPUlBUSU9OICAgICAgICAgICAgICAgICAgImxpZ2h0X2Fic29ycHRpb24iCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3Jvb20vZGVzY3JpcHRpb24uaAorCitCRVNDSFJFSUJVTkc6CisgICAgSW4gUmFldW1lbiB2ZXJ0ZWlsdCBzaWNoIGF1ZmdydW5kIGlocmVyIEdyb2Vzc2UgZGFzIExpY2h0IHVuZCBnZXJhZGUgaW4KKyAgICBncm9lc3NlcmVuIFJhZXVtZW4ga2FubiBlaW5lIGtsZWluZSBGYWNrZWwgdW50ZXIgVW1zdGFlbmRlbiBuaWNodCBtZWhyCisgICAgYXVzcmVpY2hlbiBkZW4gZ2VzYW10ZW4gUmF1bSBhdXN6dWxldWNodGVuLiBJbiBkaWVzZW0gRmFsbCBrYW5uIG1hbgorICAgIHVlYmVyIGRpZXNlIFByb3BlcnR5IGRhcyBWZXJoYWx0ZW4gZGVzIExpY2h0cyBzdGV1ZXJuLgorICAgIEVpbiAibm9ybWFsZXIiIGR1cmNoc2Nobml0dGxpY2hlciBSYXVtIGhhdCBoaWVyIGRlbiBEZWZhdWx0d2VydCAxLgorCitTSUVIRSBBVUNIOgorICAgIFBfVE9UQUxfTElHSFQsIFBfSU5UX0xJR0hULCBQX1BMQVlFUl9MSUdIVCwgUF9MSUdIVF9NT0RJRklFUiwgQ2Fubm90U2VlKCkKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0xJR0hUX01PRElGSUVSIGIvZG9jL3Byb3BzL1BfTElHSFRfTU9ESUZJRVIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQwOWM3OQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0xJR0hUX01PRElGSUVSCkBAIC0wLDAgKzEsNDkgQEAKK05BTUU6CisgICAgUF9MSUdIVF9NT0RJRklFUiAgICAgICAgICAgICAgICAgICAgICJsaWdodF9tb2RpZmllciIKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcHJvcGVydGllcy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICBWZXJhZW5kZXJ0IGRhcyBMaWNodGxldmVsIGRhcyB2b24gZWluZW0gTGViZXdlc2VuIHdhaHJnZW5vbW1lbiB3aXJkLgorICAgIERlciBXZXJ0IGRpZXNlciBQcm9wZXJ0eSB3aXJkIGFkZGl0aXYgaW4gUF9QTEFZRVJfTElHSFQgYmVydWVja3NpY2h0aWd0LgorICAgIEVzIGlzdCBoaWVybWl0IHouQi4gbW9lZ2xpY2ggZWluZSBTb25uZW5icmlsbGUgenUgcHJvZ3JhbW1pZXJlbiwgZGllc2UKKyAgICB2ZXJhZW5kZXJ0IGphIG5pY2h0IGRhcyB0YXRzYWVjaGxpY2hlIExpY2h0bGV2ZWwsIHNvbmRlcm4gdmVyZHVua2VsdCBudXIKKyAgICBkaWUgU2ljaHQuCisKK0FOTUVSS1VORzoKKyAgICBEYW1pdCBOUENzIGluIGRlciBMYWdlIHNpbmQgc29sY2hlIEdlZ2Vuc3RhZW5kZSByaWNodGlnIGVpbnp1c2NoYWV0emVuLAorICAgIHNvbGx0ZSBkaWVzZSBQcm9wZXJ0eSBpbiBqZWRlbSBHZWdlbnN0YW5kIGRlciBlaW5lbiBMaWdodC1Nb2RpZmllciBzZXR6dCwKKyAgICBhdWNoIGdlc2V0enQgc2Vpbi4gRGFzIHZlcmFlbmRlcm4gZGllc2VyIFByb3BlcnR5IGluIFNwaWVsZXJuIGR1cmNoIE5QQ3MKKyAgICBvZGVyIEdlZ2Vuc3RhZW5kZSBpc3Qgc2VsYnN0dmVyc3RhZW5kbGljaCBnZW5laG1pZ3VuZ3NwZmxpY2h0aWcuCisKK0JFSVNQSUVMRToKKyAgICAgICAvLyBFaW4gTlBDIGRlciBhdWNoIGluIHJlbGF0aXYgZHVua2xlbiBSYWV1bWVuIG1pdCBMaWNodGxldmVsIC0yCisgICAgICAgLy8gbm9jaCBzZWhlbiBrYW5uLi4uCisgICAgICAgY3JlYXRlX2RlZmF1bHRfbnBjKDEwKTsKKyAgICAgICBTZXRQcm9wKFBfTElHSFRfTU9ESUZJRVIsIDMpOworCisgICAgICAgLy8gRWluZSBTb25uZW5icmlsbGUsIGRpZSBkYXMgTGljaHRsZXZlbCB1bSBlaW5zIHNlbmt0LgorCisgICAgICAgY3JlYXRlKCkKKyAgICAgICB7CisgICAgICAgICAgOgorICAgICAgICAgIFNldFByb3AoUF9BUk1PVVJfVFlQRSwgQVRfR0xBU1NFUyk7CisgICAgICAgICAgU2V0UHJvcChQX0xJR0hUX01PRElGSUVSLCAtMSk7CisgICAgICAgICAgOgorICAgICAgIH0KKworICAgICAgIC8vIEFjaHR1bmc6IEZhbGxzIHBsIFF1ZXJ5LSBvZGVyIFNldC1NZXRob2RlbiBhdWYgUF9MSUdIVF9NT0RJRklFUiBoYXQsCisgICAgICAgLy8gd2lyZCBkaWVzZSBNZXRob2RlIGhpZXIgZnVyY2h0YmFyIHNjaGllZiBnZWhlbiB1bmQgaW0gYmVzdGVuIEZhbGwKKyAgICAgICAvLyBuaWNodHMgdmVyYWVuZGVybi4gSW4gcmVhbGVuIE9iamVrdGVuIGVtcGZpZWhsdCBzaWNoIHp1bWluZGVzdCBlaW5lCisgICAgICAgLy8gUHJ1ZWZ1bmcgaW0gVm9yZmVsZCwgb2IgZWluZSBRdWVyeS0vU2V0LU1ldGhvZGUgZ2VzZXR6dCBpc3QuCisgICAgICAgcHJvdGVjdGVkIHZvaWQgSW5mb3JtV2VhcihvYmplY3QgcGwsIGludCBzaWxlbnQsIGludCBhbGwpIHsKKyAgICAgICAgICAgcGwtPlNldFByb3AoUF9MSUdIVF9NT0RJRklFUiwgcGwtPlF1ZXJ5UHJvcChQX0xJR0hUX01PRElGSUVSKSAtMSk7CisgICAgICAgfQorCisgICAgICAgcHJvdGVjdGVkIHZvaWQgSW5mb3JtVW53ZWFyKG9iamVjdCBwbCwgaW50IHNpbGVudCwgaW50IGFsbCkgeworICAgICAgICAgICBwbC0+U2V0UHJvcChQX0xJR0hUX01PRElGSUVSLCBwbC0+UXVlcnlQcm9wKFBfTElHSFRfTU9ESUZJRVIpICsxKTsKKyAgICAgICB9CisKK1NJRUhFIEFVQ0g6CisgICAgUF9UT1RBTF9MSUdIVCwgUF9JTlRfTElHSFQsIFBfUExBWUVSX0xJR0hULCBQX0xJR0hUX01PRElGSUVSLCBDYW5ub3RTZWUoKQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfTElHSFRfVFJBTlNQQVJFTkNZIGIvZG9jL3Byb3BzL1BfTElHSFRfVFJBTlNQQVJFTkNZCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZjQ0MTUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9MSUdIVF9UUkFOU1BBUkVOQ1kKQEAgLTAsMCArMSwxNCBAQAorTkFNRToKKyAgICBQX0xJR0hUX1RSQU5TUEFSRU5DWSAgICAgICAgICAgICAibGlnaHRfdHJhbnNwYXJlbmN5IgorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9jb250YWluZXIuaAorCitCRVNDSFJFSUJVTkc6CisgICAgV2lldmllbCBMaWNodCBzY2hsdWNrdCBlaW4gQ29udGFpbmVyLCBkLmguIHdpZXZpZWwgTGljaHQgZHJpbmd0IGF1cworICAgIGVpbmVtIEJlaGFlbHRlciBub2NoIG5hY2ggZHJhdXNzZW4uIEJlaSBDb250YWluZXJuIGRpZSBfbmljaHRfCisgICAgdHJhbnNwYXJlbnQgc2luZCwgbGllZmVydCBlaW5lIF9xdWVyeV9tZXRob2QgaGllciBpbW1lciA5OTkgenVydWVjay4KKyAgICBEZWZhdWx0bWFlc3NpZyBzdGVodCBkaWVzZSBQcm9wZXJ0eSBhdWYgMi4KKworU0lFSEUgQVVDSDoKKyAgICBQX1RPVEFMX0xJR0hULCBQX0lOVF9MSUdIVCwgUF9QTEFZRVJfTElHSFQsIFBfTElHSFRfTU9ESUZJRVIsIENhbm5vdFNlZSgpCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9MSUdIVF9UWVBFIGIvZG9jL3Byb3BzL1BfTElHSFRfVFlQRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzMyMmUwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfTElHSFRfVFlQRQpAQCAtMCwwICsxLDc1IEBACitOQU1FOgorICAgIFBfTElHSFRfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgImxpZ2h0X3R5cGUiCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3RoaW5nL2Rlc2NyaXB0aW9uLmgKKworQkVTQ0hSRUlCVU5HOgorICAgIEdpYnQgYW4sIHdhcyBmdWVyIGVpbiBMaWNodCBpbiBlaW5lbSBPYmpla3Qgdm9yaGVycnNjaHQuIAorICAgIAorICAgIEVzIHNpbmQgdmVyc2NoaWVkZW5lICdhdG9tYXJlJyBMaWNodHR5cGVuLCB2b3JkZWZpbmllcnQ6CisgICAgTFRfTUlTQyAgICAgICAgIFVuYmVzdGltbXQsIGtlaW5lIEFuZ2FiZW4uCisKKyAgICBMVF9TVU4gICAgICAgICAgU29ubmVubGljaHQuCisgICAgTFRfTU9PTiAgICAgICAgIE1vbmRsaWNodCAKKyAgICBMVF9TVEFSUyAgICAgICAgU3Rlcm5lbmxpY2h0LgorICAgIAorICAgIExUX0RJRkZVU0UgICAgICBJbmRpcmVrdGVzIFRhZ2VzbGljaHQuICh6LkIuIGltIFdhbGQpCisKKyAgICBMVF9DQU5ETEUgICAgICAgS2VyemVubGljaHQuCisgICAgTFRfVE9SQ0ggICAgICAgIEZhY2tlbHNjaGVpbi4KKyAgICBMVF9PUEVOX0ZJUkUgICAgU29uc3RpZ2VzIG9mZmVuZXMgRmV1ZXIuIChMYWdlcmZldWVyIGV0Yy4pCisgICAgCisgICAgTFRfTUFHSUMgICAgICAgIElyZ2VuZGVpbmUgbWFnaXNjaGUgTGljaHRxdWVsbGUuCisKKyAgICBMVF9HTE9XSU5HICAgICAgRWluZSBzZWxic3RsZXVjaHRlbmRlIExpY2h0cXVlbGxlLgorCisgICAgTFRfREFSS05FU1MgICAgIEtlaW4gd2lya2xpY2hlcyBMaWNodCwgYWJlciBhdWNoIER1bmtlbGhlaXQgc29sbAorICAgICAgICAgICAgICAgICAgICBleHBsaXppdCBnZXNldHp0IHdlcmRlbiBrb2VubmVuLgorCisgICAgSW4gZWluZW0gT2JqZWt0IGtvZW5uZW4gbWVocmVyZSBMaWNodHR5cGVuIGdlc2V0enQgd2VyZGVuLiBEaWVzCisgICAgZ2VzY2hpZWh0IGR1cmNoIGxvZ2lzY2hlIE9kZXItVmVya251ZXBmdW5nZW4sIHNpZWhlIG1hbiBvcGVyYXRvcnMuCisKKyAgICBXZW5uIGluIGVpbmVtIFJhdW0gbWVociBhbHMgZWluIExpY2h0dHlwIGdlc2V0enQgaXN0LCBiZWRldXRldCBkYXMsIAorICAgIG5vcm1hbGVyd2Vpc2UsIGRhc3MgbWVocmVyZSBMaWNodHF1ZWxsZW4gdmVyc2NoaWVkZW5lbiBUeXBzIGltIFJhdW0gCisgICAgc2luZC4KKworICAgIEVzIGdpYnQgenVkZW0gbm9jaCBMaWNodHR5cGVuLCBkaWUgenVzYW1tZW5nZXNldHp0IHNpbmQ6CisKKyAgICBMVF9EQVlMSUdIVCAgICBUYWdlc2xpY2h0IChTb25uZS9EaWZmdXNlKQorICAgIExUX05BVFVSQUwgICAgIE5hdHVlcmxpY2hlcyBMaWNodCAoRGF5bGlnaHQvU3Rlcm5lL01vbmQpCisgICAgTFRfQVJUSUZJQ0lBTCAgS3VlbnN0bGljaGVzIExpY2h0IChNYWdpZS9GZXVlci9HbHVlaGVuKQorICAgIExUX0ZJUkUgICAgICAgIEZldWVyIChLZXJ6ZW4vRmFja2Vsbi9vZmZlbmVzIEZldWVyKQorCitCRUlTUElFTEU6CisgICAgRWluIE9iamVrdCBzb2xsIGVpbiBnZWhlaW1uaXN2b2xsZXMgR2x1ZWhlbiB2b24gc2ljaCBnZWJlbjoKKyAgICAKKyAgICBvYmpla3QtPlNldFByb3AoIFBfTElHSFRfVFlQRSwgTFRfR0xPV0lORyApCisKKyAgICBTb2xsIGVpbiBSYXVtIGJlc2NocmllYmVuIHdlcmRlbiwgZGVyIGR1cmNoIFN0ZXJuZW5saWNodCBlcmhlbGx0IGlzdCwKKyAgICBpbiBkZW0gYWJlciB6dXNhZXR6bGljaCBub2NoIGVpbiBMYWdlcmZldWVyIGJyZW5udCwgc2llaHQgZGllIFN5bnRheAorICAgIGZvbGdlbmRlcm1hc3NlbiBhdXM6CisgICAgCisgICAgcmF1bS0+U2V0UHJvcCggUF9MSUdIVF9UWVBFLCBMVF9TVEFSU3xMVF9PUEVOX0ZJUkUgKTsKKworICAgIEVpbmVyIGJyZW5uZW5kZW4gSG9zZSBrYW5uIGRlciBMaWNodHR5cCBmdWVyIG9mZmVuZXMgRmV1ZXIgbWl0Z2VnZWJlbiAKKyAgICB3ZXJkZW4uIEVzIG11c3MgamVkb2NoIG5pY2h0IHp3aW5nZW5kIGRlciBMaWNodHR5cCBmdWVyIG1hZ2lzY2hlCisgICAgTGljaHRxdWVsbGVuIGJlbnV0enQgd2VyZGVuLiBFcyBpc3Qga2xhciwgZGFzcyBlcyBpcmdlbmR3YXMgbWl0IE1hZ2llCisgICAgenUgdHVuIGhhdCwgd2VubiBicmVubmVuZGUgU3BpZWxlciBkdXJjaCBkaWUgR2VnZW5kIGxhdWZlbiwgb2huZSB6dSAKKyAgICBzY2hyZWllbi4gUF9MSUdIVF9UWVBFIHNvbGx0ZSBqZWRvY2ggZGFzIGZhc3NiYXJlIExpY2h0IGJlc2NocmVpYmVuLgorICAgIExUX01BR0lDIGlzdCBhbHNvIGVoZXIgZWluZSBOb3Rsb2VzdW5nIGZ1ZXIgTGljaHQsIGRlc3NlbiBVcnNhY2hlIG1hbgorICAgIG5pY2h0IGVya2xhZXJlbiBrYW5uLgorCisKK0FOTUVSS1VORzoKKyAgICBQX0xJR0hUX1RZUEUgZGllbnQgYXVzc2NobGllc3NsaWNoIGRlciBCZXNjaHJlaWJ1bmcgZGVzIExpY2h0ZXMsIGRhcyAKKyAgICB2b3JoZXJyc2NodC4gRXMgaXN0IG5pY2h0IHZlcmJ1bmRlbiBtaXQgZGVtIExpY2h0c3lzdGVtLCB1bmQgc29sbCBlcworICAgIGF1Y2ggbmljaHQgd2VyZGVuLgorCisgICAgRGllIEVtcGZpbmRsaWNoa2VpdCBkZXIgRHVua2VsZWxmZW4gZ2VnZW4gU29ubmVubGljaHQgd2lyZCB1ZWJlciBkaWVzZQorICAgIFByb3BlcnR5IGdlc3RldWVydC4gU29sbCBlaW4gUmF1bSBtaXQgKFBfSU5ET09SUz09MCkgc28gZHVua2VsIHNlaW4sIGRhc3MKKyAgICBzaWUgbmljaHQgaW4gR2VmYWhyIHNpbmQsIHNvbGx0ZW4gbmljaHQgTFRfTUlTQyBvZGVyIExUX1NVTiBnZXNldHp0CisgICAgc2Vpbi4KKworU0lFSEUgQVVDSDoKKyAgICBDaGVja0xpZ2h0VHlwZSwgL3N0ZC90aGluZy9kZXNjcmlwdGlvbi5oLCBvcGVyYXRvcnMKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0xJUVVJRCBiL2RvYy9wcm9wcy9QX0xJUVVJRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjMxYThlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfTElRVUlECkBAIC0wLDAgKzEsOCBAQAorTkFNRToKKyAgICBQX0xJUVVJRCAgICAgICAgICAgICAgICAgICAgICAid19tYXhfd2Fzc2VyZnVlbGxtZW5nZSIgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvZmlzaGluZy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAqKiogS0VJTkUgQkVTQ0hSRUlCVU5HIFZPUkhBTkRFTiAqKioKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX0xPQ0FMQ01EUyBiL2RvYy9wcm9wcy9QX0xPQ0FMQ01EUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTdiNTE1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfTE9DQUxDTURTCkBAIC0wLDAgKzEsMTIgQEAKK05BTUU6CisgICAgUF9MT0NBTENNRFMgICAgICAgICAgICAgICAgICAgImxvY2FsY21kcyIgICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3Byb3BlcnRpZXMuaAorCitCRVNDSFJFSUJVTkc6CisgICAgRWluIEFycmF5IHZvbiBBcnJheXMgYWxsZXIgQmVmZWhsZSBkaWUgaW0gU3BpZWxlciBzZWxic3QgZGVmaW5pZXJ0IHNpbmQuCisgICAgKHsgKHsgImJlZmVobCIsICJmdW5rdGlvbiIsIGZsYWcsIHdpemxldmVsIH0pIH0pCisgICAgV2VubiBmbGFnIGdlc2V0enQgaXN0IHdlcmRlbiBudXIgZGllIGVyc3RlbiBaZWljaGVuIGRpZSBhdWNoIGluIEJlZmVobAorICAgIGFuZ2VnZWJlbiBzaW5kIG1pdCBkZW0gVmVyYiB1ZWJlcnBydWVmdC4gU2llaGUgYXVjaAorICAgIGFkZF9hY3Rpb24oImZ1bmt0aW9uIiwgImJlZmVobCIsIDEpIHVuZCBBZGRDbWQoImJlZmVobCIsICJmdW5rdGlvbiIsIDEpLgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfTE9DQVRJT04gYi9kb2MvcHJvcHMvUF9MT0NBVElPTgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzM0NGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfTE9DQVRJT04KQEAgLTAsMCArMSwxOSBAQAorTkFNRToKKyAgICBQX0xPQ0FUSU9OICAgICAgICAgICAgICAgICAgICJsb2NhdGlvbiIKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcGxheWVyL2Jhc2UuaAorCitCRVNDSFJFSUJVTkc6CisgICAgSGllciBrYW5uIGRlciBTcGllbGVyIG1pdCBkZW0gQmVmZWhsICJvcnQiIGRlbiBPcnQgc2V0emVuLAorICAgIHZvbiBkZW0gZXIga29tbXQgYnp3LiB6dSBrb21tZW4gZ2xhdWJ0IDspCisgICAgVW0gd2llZGVyIGRlbiBhdXRvbWF0aXNjaCBlcm1pdHRlbHRlbiBPcnQgYW56dXplaWdlbiwgaXN0CisgICAgUF9MT0NBVElPTiBhdWYgMCB6dSBzZXR6ZW4uCisgICAgCitTSUVIRSBBVUNIOgorICAgIG9ydAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBTYXQgSnVsIDAxIDIzOjE2OjAwIDIwMDAgYnkgTXVwZmVsCisgICAgCisgICAgCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9MT0dfSU5GTyBiL2RvYy9wcm9wcy9QX0xPR19JTkZPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YmQ4ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9MT0dfSU5GTwpAQCAtMCwwICsxLDMyIEBACitOQU1FOgorICAgIFBfTE9HX0lORk8gICAgICAgICAgICAgICAgICAgICJsb2dfaW5mbyIgICAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9wcm9wZXJ0aWVzLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBXZW5uIGRpZXNlIFByb3BlcnR5IGdlc2V0enQgaXN0IHdpcmQgamVkZSBGcmFnZSwgZGllIGVpbgorICAgICBNb25zdGVyIG5pY2h0IGJlYW50d29ydGVuIGthbm4sIGltIFJlcG9ydC1GaWxlIGRlcworICAgICB6dXN0YWVuZGlnZW4gTWFnaWVycyBnZWxvZ2d0LgorCisgICAgIEVzIGlzdCBqZWRvY2ggYXVjaCBtb2VnbGljaCwgZGlyZWt0IGVpbmVuIEZpbGVuYW1lbiBhbnp1Z2ViZW4uCisgICAgIEJlaSBkaWVzZW4gd2lyZCBkYW5uIGplZG9jaCBhdXRvbWF0aXNjaCBlaW4gL2xvZy8gdm9ybmUgYW5nZWhhZW5ndC4KKworQkVJU1BJRUxFOgorICAgICBTZXRQcm9wKFBfTE9HX0lORk8sMSk7ICAgICAgICAgICAvLyBBbGxlIGZlaGxlbmRlbiBJbmZvcyBkaWVzZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9uc3RlcnMgd2VyZGVuIGluIGRhcyBSZXBvcnQtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgdW50ZXIgL2xvZy9yZXBvcnQvIGdlbG9ndC4KKworICAgICBTZXRQcm9wKFBfTE9HX0lORk8sInRpbGx5L29wYSIpOyAvLyBBbGxlIGZlaGxlbmRlbiBJbmZvcyBkaWVzZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9uc3RlcnMgd2VyZGVuIGluIGRhcyBGaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnN0ZXIgdW50ZXIgL2xvZy90aWxseS8gZ2UtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ3QuCitCRU1FUktVTkdFTjoKKyAgICAgQmVpIG5hY2h0cmFlZ2xpY2ggYW5nZXNjaGxvc3NlbmVuIE1vbnN0ZXJuIGVtcGZpZWhsdCBzaWNoIFZhcmlhbnRlIAorICAgICAyIGRlciBCZWlzcGllbGUuIEVpbiBtdWVoc2FtZXMgU3VjaGVuICh1bmQgTG9lc2NoZW4pIGRlciBmZWhsZW5kZW4gCisgICAgIEluZm9zIGRlcyBNb25zdGVycyBpbSBSZXBvcnQtRmlsZSBlcnVlYnJpZ3Qgc2ljaCBkYW5uIG5hZW1saWNoLgorCitTSUVIRSBBVUNIOgorICAgICBQX0xPR19GSUxFLCB3cml0ZV9maWxlKCksIGxvZ19maWxlKCksIEFkZEluZm8KKworTGV0enRlIEFlbmRlcnVuZzogMTMuMDkuMDQgVGlsbHlATW9yZ2VuR3JhdWVuCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9MT05HIGIvZG9jL3Byb3BzL1BfTE9ORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGEzNjU5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfTE9ORwpAQCAtMCwwICsxLDI5IEBACitQX0xPTkcKK05BTUU6CisgICAgIFBfTE9ORwkJCQkJImxvbmciCisKK0RFRklOSUVSVCBJTjoKKyAgICAgPHRoaW5nL2Rlc2NyaXB0aW9uLmg+CisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGllIExhbmdiZXNjaHJlaWJ1bmcgZGVzIE9iamVrdGVzIGFscyBTdHJpbmcgb2RlciBDbG9zdXJlIChkaWVzZSBtdXNzCisgICAgIGVpbmVuIFN0cmluZyB6dXJ1ZWNrZ2ViZW4pLiBEaWUgTGFuZ2Jlc2NocmVpYnVuZyB3aXJkIGJlaW0gVW50ZXJzdWNoZW4KKyAgICAgZGVzIE9iamVrdGVzIGF1c2dlZ2ViZW4uIFNpZSBzb2xsdGUgdW1nZWJyb2NoZW4gc2Vpbi4KKworICAgICBEaWVzZSBQcm9wZXJ0eSBiZXN0aW1tdCBkaWUgQW5zaWNodCBkZXMgT2JqZWt0ZXMgdm9uIGF1c3Nlbi4gRnVlciBkaWUKKyAgICAgSW5uZW4obGFuZylhbnNpY2h0IHZvbiBSYWV1bWVuIG11c3MgbWFuIFBfSU5UX0xPTkcgYmVudXR6ZW4uCisKK0JFTUVSS1VOR0VOOgorICAgICAtIGxvbmcoKSAoInVudGVyc3VjaGUiKSBmaWx0ZXJ0IFBfTE9ORyBkdXJjaCBwcm9jZXNzX3N0cmluZygpCisgICAgICAgLT4gZGFoZXIgc2luZCBDbG9zdXJlcyBtb2VnbGljaAorCitCRUlTUElFTEU6CisKKyAgICAgU2V0UHJvcChQX0xPTkcsICJEaWVzZSBBeHQgaXN0IGVpbmUgZnVyY2h0YmFyZSBXYWZmZSFcbiIpOworCitTSUVIRSBBVUNIOgorICAgICBBZWhubGljaGVzOglQX1NIT1JULCBsb25nKCkKKyAgICAgU29uc3RpZ2VzOgkJUF9JTlRfTE9ORywgcHJvY2Vzc19zdHJpbmcoKSwgYnJlYWtfc3RyaW5nKCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogU3VuIE1heSAxOSAyMDoxMDoxOCAxOTk2IGJ5IFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfTE9OR19FTVBUWSBiL2RvYy9wcm9wcy9QX0xPTkdfRU1QVFkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE5Y2NlMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX0xPTkdfRU1QVFkKQEAgLTAsMCArMSw4IEBACitOQU1FOgorICAgIFBfTE9OR19FTVBUWSAgICAgICAgICAgICAgICAgICJ3X2xvbmdkZXNjX2VtcHR5IiAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9maXNoaW5nLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICoqKiBLRUlORSBCRVNDSFJFSUJVTkcgVk9SSEFOREVOICoqKgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfTE9OR19GVUxMIGIvZG9jL3Byb3BzL1BfTE9OR19GVUxMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiOTk3ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9MT05HX0ZVTEwKQEAgLTAsMCArMSw4IEBACitOQU1FOgorICAgIFBfTE9OR19GVUxMICAgICAgICAgICAgICAgICAgICJ3X2xvbmdkZXNjX2Z1bGwiICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9maXNoaW5nLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICoqKiBLRUlORSBCRVNDSFJFSUJVTkcgVk9SSEFOREVOICoqKgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfTUFHSUMgYi9kb2MvcHJvcHMvUF9NQUdJQwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2EwYmI3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfTUFHSUMKQEAgLTAsMCArMSw4IEBACitOQU1FOgorICAgIFBfTUFHSUMgICAgICAgICAgICAgICAgICAgICAgICJtYWdpYyIgICAgICAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9wcm9wZXJ0aWVzLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBEaWVzZXMgT2JqZWt0IGlzdCBtYWdpc2NoLgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfTUFHSUNfUkVTSVNUQU5DRV9PRkZTRVQgYi9kb2MvcHJvcHMvUF9NQUdJQ19SRVNJU1RBTkNFX09GRlNFVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjEyMGE4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfTUFHSUNfUkVTSVNUQU5DRV9PRkZTRVQKQEAgLTAsMCArMSwzMyBAQAorTkFNRToKKyAgICAgUF9NQUdJQ19SRVNJU1RBTkNFX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICJtYWdfcmVzX29mZnNldCIgICAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgICAvc3lzL25ld19za2lsbHMuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIE1hcHBpbmcgbWl0IGdhbnp6YWhsaWdlbiBQcm96ZW50d2VydGVuIGluIDAuMDElLVNjaHJpdHRlbgorICAgICAoMC0xMDAwMCkgenVyIFJlc2lzdGVuei9FbXBmaW5kbGljaGtlaXQgZ2VnZW4gYmVzdGltbXRlCisgICAgIE1hZ2lla2xhc3Nlbi4KKworICAgICBEaWUgUHJvcGVydHkgd2lyZCBpbiBkZXIgTWV0aG9kZSBTcGVsbERlZmVuZCgpIGF1c2dld2VydGV0IHVuZAorICAgICBmdWVyIGVpbmVuIGF1ZiBkZW4gTlBDL1NwaWVsZXIgZ2VzcHJvY2hlbmVuIFNwZWxsIHdlcmRlbiBkaWUKKyAgICAgV2VydGUgZnVlciBhbGwgZGVzc2VuIE1hZ2lla2xhc3NlbiBhdWZhZGRpZXJ0LiBEYWhlciBzaW5kIGF1Y2gKKyAgICAgbmVnYXRpdmUgV2VydGUgZnVlciBlaW56ZWxuZSBNYWdpZWtsYXNzZW4gc2lubnZvbGwuCisKKyAgICAgUF9NQUdJQ19SRVNJU1RBTkNFX09GRlNFVCB1bmQgU3BlbGxEZWZlbmQgd2VyZGVuIHZvbiBkZW4gU3BlbGxib29rcworICAgICBhdXNnZXdlcnRldC4gRGVyIEVpbmZsdXNzIGlzdCBkYWhlciBhYmjkbmdpZyB2b20gU3BlbGxib29rLgorCitCRUlTUElFTEU6CisgICAgIC8vIEdvYmxpbnMKKyAgICAgU2V0UHJvcChQX01BR0lDX1JFU0lTVEFOQ0VfT0ZGU0VULAorICAgICAgICAgICAgICAgKFtNVF9BTkdSSUZGOjYwMCwgICAgICAgICAvLyA2JSBSZXNpc3RlbnogZ2VnZW4gQW5ncmlmZgorCSAgICAgICAgIE1UX0lMTFVTSU9OOjUwMCwgICAgICAgIC8vIDYlIFJlc2lzdGVueiBnZWdlbiBJbGx1c2lvbmVuCisgICAgICAgICAgICAgICAgIE1UX1ZFUldBTkRMVU5HOi0zMDAsICAgIC8vIDMlIEVtcGZpbmRsaWNoa2VpdAorCQkgTVRfSEVMTFNJQ0hUOi03NTAsICAgICAgLy8gNy41JSBFbXBmaW5kbGljaGtlaXQKKwkJIE1UX0JFSEVSUlNDSFVORzoyNTBdKSk7IC8vIDIuNSUgUmVzaXN0ZW56CisKK1NJRUhFIEFVQ0g6CisgICAgIFZlcndhbmR0OiAgICAgU3BlbGxEZWZlbmQKKyAgICAgQWVobmxpY2g6ICAgICBQX05PTUFHSUMKKworMjkuRGV6IDIwMDcgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX01BSUxBRERSIGIvZG9jL3Byb3BzL1BfTUFJTEFERFIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFiODQ5ZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX01BSUxBRERSCkBAIC0wLDAgKzEsOCBAQAorTkFNRToKKyAgICBQX01BSUxBRERSICAgICAgICAgICAgICAgICAgICAibWFpbGFkZHIiICAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcGxheWVyL2Jhc2UuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIEVNYWlsYWRyZXNzZSBkZXMgU3BpZWxlcnMuCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9NQVBfUkVTVFJJQ1RJT05TIGIvZG9jL3Byb3BzL1BfTUFQX1JFU1RSSUNUSU9OUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDQyMmMwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfTUFQX1JFU1RSSUNUSU9OUwpAQCAtMCwwICsxLDM5IEBACitOQU1FOgorICAgIFBfTUFQX1JFU1RSSUNUSU9OUyAgICAgICAgICAgICAgICAgICAgICAibGliX3BfbWFwX3Jlc3RyaWN0aW9ucyIKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcm9vbXMuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIE1pdCBkaWVzZXIgUHJvcGVydHkgbGFlc3N0IHNpY2ggYmVlaW5mbHVzc2VuLCB3ZWxjaGUgSW5mb3JtYXRpb25lbiB1ZWJlcgorICAgICBkZW4gUmF1bSBkYXMgTW9yZ2VuZ3JhdWVuIGRlbSBDbGllbnQgenVrb21tZW4gbGFlc3N0ICh6dXIgWmVpdCBudXIgdmlhCisgICAgIEdNQ1AsIGFiZXIgZXMgbWFnIGlyZ2VuZHdhbm4gYXVjaCBhbmRlcmUgV2VnZSBnZWJlbikuCisgICAgIEJlaXNwaWVsc3dlaXNlIHNvbGxlbiB2aWVsbGVpY2h0IGluIGVpbmVtIExhYnlyaW50aCBrZWluZSBlaW5kZXV0aWdlbgorICAgICBSYXVtLUlEcyB1ZWJlcm1pdHRlbHQgd2VyZGVuLgorCisgICAgIEFscyBXZXJ0ZSBkdWVyZmVuIGFsbGUgTVJfLUtvbnN0YW50ZW4gYXVzIDxyb29tcy5oPiB2ZXJ3ZW5kZXQgd2VyZGVuLgorICAgICBEaWVzZSBkdWVyZmVuIGF1Y2ggdmVyLU9ERVItdCB3ZXJkZW4sIHdlbm4gbWVociBhbHMgZWluZSBkYXZvbiBnZWx0ZW4KKyAgICAgc29sbC4KKworICAgICBNb2VnbGljaGUgV2VydGU6CisgICAgICAgTVJfTk9VSUQgLSB2ZXJoaW5kZXJ0LCBkYXNzIGRpZSBlaW5kZXV0aWdlIFJhdW0tSUQgdWViZXJ0cmFnZW4gd2lyZC4KKyAgICAgICBNUl9OT0lORk8gLSB2ZXJoaW5kZXJ0LCBkYXNzIHVlYmVyaGF1cHQgaXJnZW5kZXR3YXMgYW4gZGVuIENsaWVudAorICAgICAgICAgICAgICAgICAgIHVlYmVybWl0dGVsdCB3aXJkLiBEYW1pdCBrcmllZ3QgZXIgZ2dmLiBhdWNoIG5pY2h0IG1pdCwKKyAgICAgICAgICAgICAgICAgICBkYXNzIGVyIFJhdW0gZ2V3ZWNoc2VsdCB3dXJkZS4gSXN0IGZ1ZXIgU2VxdWVuenJhZXVtZQorICAgICAgICAgICAgICAgICAgIGdlZGFjaHQuIEJpdHRlIFNFSFIgc3BhcnNhbSBlaW5zZXR6ZW4uCisKKyAgICAgRGllIFZlcndlbmR1bmcgZGllc2VyIFByb3BlcnR5IHNvbGx0ZSBkZXIgQXVzbmFobWVmYWxsIHNlaW4hCisKK0JFSVNQSUVMOgorICAgICAoaW4gZWluZW0gUmF1bSkKKyAgICAgU2V0UHJvcChQX01BUF9SRVNUUklDVElPTlMsIE1SX05PVUlEKTsKKworICAgICBOdW4gYmVrb21tdCBkZXIgQ2xpZW50IHp3YXIgZGllIEt1cnpiZXNjaHJlaWJ1bmcgZGVzIFJhdW1zLCBkaWUgUmVnaW9uCisgICAgIHVuZCBkaWUgc2ljaHRiYXJlbiBBdXNnYWVuZ2UsIGFiZXIga2VpbmUgVUlEIG1laHIgdWViZXJtaXR0ZWx0LgorCitTSUVIRSBBVUNIOgorICAgICBnbWNwCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzIzLjAyLjIwMTMsIFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfTUFSUklFRCBiL2RvYy9wcm9wcy9QX01BUlJJRUQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY4NDA0ZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX01BUlJJRUQKQEAgLTAsMCArMSwxMiBAQAorTkFNRToKKyAgICBQX01BUlJJRUQgICAgICAgICAgICAgICAgICAgICAibWFycmllZCIgICAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcHJvcGVydGllcy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRW50aGFlbHQgZWluZW4gU3RyaW5nIG1pdCBkZXIgdWlkIGRlcyBQYXJ0bmVycworICAgICAoc29mZXJuIHZvcmhhbmRlbikKKworU0lFSEUgQVVDSDoKKyAgICAgc2NoZWlkdW5nCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9NQVRFUklBTCBiL2RvYy9wcm9wcy9QX01BVEVSSUFMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZTFiZWYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9NQVRFUklBTApAQCAtMCwwICsxLDc5IEBACitQX01BVEVSSUFMCitOQU1FOgorICAgICBQX01BVEVSSUFMCQkJCQkibWF0ZXJpYWwiCisKK0RFRklOSUVSVCBJTjoKKyAgICAgPHRoaW5nL21hdGVyaWFsLmg+CisKK0JFU0NIUkVJQlVORzoKKyAgICAgTWFwcGluZyBtaXQgcHJvemVudHVhbGVuIEFudGVpbGVuIHZvbiBNYXRlcmlhbGllbiwgYXVzIGRlbmVuIGVpbiBPYmpla3QgCisgICAgIGJlc3RlaHQuCisKK0JFTUVSS1VOR0VOOgorICAgICBCZWkgU2V0UHJvcCBrYW5uIG1hbiB6dSBWZXJlaW5mYWNodW5nIGF1Y2ggZWluIGVpbnplbG5lcyBNYXRlcmlhbCBvZGVyIAorICAgICBlaW4gQXJyYXkgYXVzIE1hdGVyaWFsaWVuIGFuZ2ViZW4uIERpZSBBbnRlaWxlIHdlcmRlbiBkYW5uIAorICAgICBnbGVpY2htYWVzc2lnIHZlcnRlaWx0LgorCitCRUlTUElFTEU6CisgICAgIC8vIDEwMCUgRWlzCisgICAgIFNldFByb3AoUF9NQVRFUklBTCwgTUFUX0lDRSk7CisgICAgIC8vIFF1ZXJ5UHJvcChQX01BVEVSSUFMKSAtPiAoW01BVF9JQ0U6MTAwXSkKKworICAgICAvLyA1MCUgRWlzLCA1MCUgTWlzYy1Ib2x6CisgICAgIFNldFByb3AoUF9NQVRFUklBTCwgKHsgTUFUX0lDRSwgTUFUX01JU0NfV09PRCB9KSk7CisgICAgIC8vIFF1ZXJ5UHJvcChQX01BVEVSSUFMKSAtPiAoW01BVF9JQ0U6NTAsIE1BVF9NSVNDX1dPT0Q6IDUwXSkKKworICAgICAvLyA2MCUgRWlzLCA0MCUgTWlzYy1Ib2x6CisgICAgIFNldFByb3AoUF9NQVRFUklBTCwgKFsgTUFUX0lDRTogNjAsIE1BVF9NSVNDX1dPT0Q6IDQwIF0pKTsKKworICAgICAvLyAxMDAlIFBhcGllcgorICAgICBTZXRQcm9wKFBfTUFURVJJQUwsIE1BVF9QQVBFUik7CisgICAgIC8vIFF1ZXJ5UHJvcChQX01BVEVSSUFMKSAtPiAoW01BVF9QQVBFUjoxMDBdKQorCisgICAgIC8vIDUwJSBTaWxiZXIsIDUwJSBHb2xkCisgICAgIFNldFByb3AoUF9NQVRFUklBTCwgKHtNQVRfU0lMVkVSLCBNQVRfR09MRH0pKQorICAgICAvLyBRdWVyeVByb3AoUF9NQVRFUklBTCkgLT4gKFtNQVRfU0lMVkVSOjUwLE1BVF9HT0xEOjUwXSkKKworICAgICAvLyBlaW4gd2Vpc2VyIFNjaG1pZWQsIGRlciB3YXMgZGFyYXVzIG1hY2h0OgorICAgICBpbnQgaTsKKyAgICAgc3RyaW5nICptYXQsIG1uYW1lLCBtZ3JvdXA7CisgICAgIG1hdD1tX2luZGljZXMob2ItPlF1ZXJ5UHJvcChQX01BVEVSSUFMKSk7CisgICAgIGk9c2l6ZW9mKG1hdCk7CisKKyAgICAgd3JpdGUoIkRlciBTY2htaWVkIHNhZ3Q6ICIrb2ItPk5hbWUoV0VSKSsiIGJlc3RlaHQgYXVzIC4uLlxuIik7CisgICAgIHdoaWxlKGktLSkgeworICAgICAgLy8gZGVuIE5hbWVuIGVya2VubmVuL2F1c3NwcmVjaGVuOgorICAgICAgLy8gTWF0ZXJpYWxpZW4gd2VyZGVuIGFsbGdlbWVpbiBnYW56IHNjaGxlY2h0IGVya2FubnQgKHp1IDUlKSwgYWJlcgorICAgICAgLy8gYWxsZXMgYXVzIE1ldGFsbCB3aXJkIHp1ICsxMDAlIGd1dCBlcmthbm50IC4uLgorICAgICAgbW5hbWU9TUFURVJJQUxEQi0+TWF0ZXJpYWxOYW1lKG1hdFtpXSwgV0VSLAorCSAgICAgKHs1LCAoW01BVEVSSUFMX1NZTU1FVFJJQ19SRUNPR05JWkFCSUxJVFk6CisJCQkoe01BVEdST1VQX01FVEFMLCAxMDB9KV0pfSkpOworCisgICAgICAvLyB1bmQgbnVyIE1ldGFsbGUgYW5hbHlzaWVyZW4gLi4uCisgICAgICBpZihNQVRFUklBTERCLT5NYXRlcmlhbEdyb3VwKChbbWF0W2ldOjEwMF0pLE1BVEdST1VQX01FVEFMKT49MTAwKSB7CisgICAgICAgaW50IGo7CisgICAgICAgc3RyaW5nICptZ3I7CisgICAgICAgbWdyPU1BVEVSSUFMREItPkdldE1hdE1lbWJlcnNoaXAobWF0W2ldKTsKKyAgICAgICBqPXNpemVvZihtZ3IpOworICAgICAgIG1ncm91cD0iIGdlaG9lcnQgenUgIjsKKyAgICAgICB3aGlsZShqLS0pIHsKKyAgICAgICAgbWdyb3VwKz1NQVRFUklBTERCLT5Hcm91cE5hbWUobWdyW2pdKTsKKyAgICAgICAgaWYoaj4wKSBtZ3JvdXArPSIsICI7CisgICAgICAgfQorICAgICAgfSBlbHNlIG1ncm91cD0iIGtlbm5lIGljaCBuaWNodCI7CisgICAgICBwcmludGYoIiUtMTIuMTJzOiAlc1xuIixtbmFtZSwgbWdyb3VwKTsKKyAgICAgfQorCisKK1NJRUhFIEFVQ0g6CisgICAgIEtvbnplcHRlOgkgIG1hdGVyaWFsLCBtYXRlcmlhbGVya2VubnVuZworICAgICBHcnVuZGxlZ2VuZDogL3N5cy90aGluZy9tYXRlcmlhbC5oCisgICAgIE1ldGhvZGVuOiAgICBRdWVyeU1hdGVyaWFsKCksIFF1ZXJ5TWF0ZXJpYWxHcm91cCgpLCBNYXRlcmlhbExpc3QoKSwKKyAgICAgTGlzdGVuOgkgIEFsbE1hdGVyaWFscygpLCBBbGxHcm91cHMoKSwgRHVtcCgpCisJCSAgbWF0ZXJpYWxsaXN0ZSwgbWF0ZXJpYWxncnVwcGVuCisgICAgIE1hc3RlcjoJICBBZGRNYXRlcmlhbCgpLCBDb252TWF0ZXJpYWxMaXN0KCksIE1hdGVyaWFsR3JvdXAoKSwKKwkJICBHcm91cE5hbWUoKSwgTWF0ZXJpYWxOYW1lKCksCisJCSAgR2V0R3JvdXBNZW1iZXJzKCksIEdldE1hdE1lbWJlcnNoaXAoKQorICAgICBTb25zdGlnZXM6CSAgUF9NQVRFUklBTF9LTk9XTEVER0UKKworNy4gTWFpIDIwMDQgR2xvaW5zb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9NQVRFUklBTF9LTk9XTEVER0UgYi9kb2MvcHJvcHMvUF9NQVRFUklBTF9LTk9XTEVER0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk1NDA4MwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX01BVEVSSUFMX0tOT1dMRURHRQpAQCAtMCwwICsxLDM5IEBACitQX01BVEVSSUFMX0tOT1dMRURHRQorTkFNRToKKyAgICAgUF9NQVRFUklBTF9LTk9XTEVER0UJCQkJIm1hdGVyaWFsX2tub3dsZWRnZSIKKworREVGSU5JRVJUIElOOgorICAgICA8dGhpbmcvbWF0ZXJpYWwuaD4KKworQkVTQ0hSRUlCVU5HOgorICAgICBNYXBwaW5nLCBDbG9zdXJlIG9kZXIgSW50ZWdlciBtaXQgUmVnZWxuIHp1ciBNYXRlcmlhbGllbmVya2VubnVuZy4gRGllCisgICAgIFJlZ2VsbiBzaW5kIGluICJtYW4gbWF0ZXJpYWxlcmtlbm51bmciIHp1IGxlc2VuLgorCisgICAgIERpZXNlIHdlcmRlbiBiZWkgQW5nYWJlIGVpbmVzIFNwaWVsZXJvYmpla3RlcyBpbiBNYXRlcmlhbExpc3QoKSBvZGVyCisgICAgIE1hdGVyaWFsTmFtZSgpIGFuIGRpZXNlbSBhYmdlZnJhZ3QgdW5kIGhhdCBFaW5mbHVzcyBkYXJhdWYsIG9iIGVpbgorICAgICBNYXRlcmlhbCBnZW5hdSwgZ2VuZXJlbGwgb2RlciBnYXIgbmljaHQgZXJrYW5udCB3aXJkLgorCisgICAgIEluIGRlbiBlaW56ZWxuZW4gUmFzc2Vuc2hlbGxzIHNpbmQgRGVmYXVsdHdlcnRlIGRhZnVlciBhbmdlZ2ViZW4uCisKKworQkVJU1BJRUxFOgorICAgICAvLyBFcmtlbm51bmdzYm9udXMgYXVmIGRpdmVyc2UgTWF0ZXJpYWxncnVwcGVuIHVuZAorICAgICAvLyBFcmtlbm51bmdzYm9udXMvLW1hbHVzIGF1ZiBiaW9sb2dpc2NoZS9uaWNodGJpb2xvZ2lzY2hlIE1hdGVyaWFsaWVuCisgICAgIFNldFByb3AoUF9NQVRFUklBTF9LTk9XTEVER0UsCisJKFtNQVRHUk9VUF9XT09EOjIwLAorCSAgTUFUR1JPVVBfTUVUQUw6MjAsCisJICBNQVRHUk9VUF9FTEVNRU5UQUw6MjAsCisJICBNQVRHUk9VUF9DTE9USDoyMCwKKwkgIE1BVEVSSUFMX1NZTU1FVFJJQ19SRUNPR05JWkFCSUxJVFk6ICh7TUFUR1JPVVBfQklPLDV9KV0pKTsKKworU0lFSEUgQVVDSDoKKyAgICAgS29uemVwdGU6CSAgbWF0ZXJpYWwsIG1hdGVyaWFsZXJrZW5udW5nCisgICAgIEdydW5kbGVnZW5kOiBQX01BVEVSSUFMLCAvc3lzL3RoaW5nL21hdGVyaWFsLmgKKyAgICAgTWV0aG9kZW46ICAgIFF1ZXJ5TWF0ZXJpYWwoKSwgUXVlcnlNYXRlcmlhbEdyb3VwKCksIE1hdGVyaWFsTGlzdCgpLAorICAgICBMaXN0ZW46CSAgQWxsTWF0ZXJpYWxzKCksIEFsbEdyb3VwcygpLCBEdW1wKCkKKwkJICBtYXRlcmlhbGxpc3RlLCBtYXRlcmlhbGdydXBwZW4KKyAgICAgTWFzdGVyOgkgIEFkZE1hdGVyaWFsKCksIENvbnZNYXRlcmlhbExpc3QoKSwgTWF0ZXJpYWxHcm91cCgpLAorCQkgIEdyb3VwTmFtZSgpLCBNYXRlcmlhbE5hbWUoKSwKKwkJICBHZXRHcm91cE1lbWJlcnMoKSwgR2V0TWF0TWVtYmVyc2hpcCgpCisKKzcuIE1haSAyMDA0IEdsb2luc29uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfTUFYX0FMQ09IT0wgYi9kb2MvcHJvcHMvUF9NQVhfQUxDT0hPTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGE2NGMzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfTUFYX0FMQ09IT0wKQEAgLTAsMCArMSwyMSBAQAorTkFNRToKKwlQX01BWF9BTENPSE9MCQkJIm1heF9hbGNvaG9sIgorCitERUZJTklFUlQgSU46CisJL3N5cy9saXZpbmcvbGlmZS5oCisKK0JFU0NIUkVJQlVORzoKKwlOdW1lcmlzY2hlciBXZXJ0IGZ1ZXIgZGVuIG1heGltYWxlbiBHcmFkIGRlciBCZXRydW5rZW5oZWl0IGVpbmVzCisJTGViZXdlc2Vucy4KKworQU5NRVJLVU5HRU46CisJRGVyIFdlcnQgdm9uIFBfTUFYX0FMQ09IT0wgaXN0IGJlaSBkZW4gZWluemVsbmVuIFJhc3NlbiB2ZXJzY2hpZWRlbiwKKwllYmVuc28gd2llIGRlciBmdWVyIFBfQUxDT0hPTF9ERUxBWS4gRGllIGdlbmF1ZW4gV2VydGUgc3RlaGVuIGluIGRlbgorCVJhc3Nlbi1TaGVsbHMgKC9zdGQvc2hlbGxzKS4KKworU0lFSEUgQVVDSDoKKwlQX0FMQ09IT0wsIFBfQUxDT0hPTF9ERUxBWSwgZHJpbmtfYWxjb2hvbCwKKwlQX01BWF9GT09ELCBQX01BWF9EUklOSworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBUdWUgRGVjIDE4IDEyOjE2OjEwIDIwMDEgYnkgUGF0cnluCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9NQVhfRFJJTksgYi9kb2MvcHJvcHMvUF9NQVhfRFJJTksKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQwZWRkYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX01BWF9EUklOSwpAQCAtMCwwICsxLDIxIEBACitOQU1FOgorCVBfTUFYX0RSSU5LCQkJIm1heF9kcmluayIKKworREVGSU5JRVJUIElOOgorCS9zeXMvbGl2aW5nL2xpZmUuaAorCitCRVNDSFJFSUJVTkc6CisJTnVtZXJpc2NoZXIgV2VydCBmdWVyIGRpZSBtYXhpbWFsZSBTYWV0dGlndW5nIGVpbmVzIExlYmV3ZXNlbnMgbWl0CisJR2V0cmFlbmtlbi4KKworQU5NRVJLVU5HRU46CisJRGVyIFdlcnQgdm9uIFBfTUFYX0RSSU5LIGlzdCBiZWkgZGVuIGVpbnplbG5lbiBSYXNzZW4gdmVyc2NoaWVkZW4sCisJZWJlbnNvIHdpZSBkZXIgZnVlciBQX0RSSU5LX0RFTEFZLiBEaWUgZ2VuYXVlbiBXZXJ0ZSBzdGVoZW4gaW4gZGVuCisJUmFzc2VuLVNoZWxscyAoL3N0ZC9zaGVsbHMpLgorCitTSUVIRSBBVUNIOgorCVBfRFJJTkssIFBfRFJJTktfREVMQVksIGRyaW5rX3NvZnQsCisJUF9NQVhfRk9PRCwgUF9NQVhfQUxDT0hPTAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBUdWUgRGVjIDE4IDEyOjE2OjEwIDIwMDEgYnkgUGF0cnluCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9NQVhfRk9PRCBiL2RvYy9wcm9wcy9QX01BWF9GT09ECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNDljZmUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9NQVhfRk9PRApAQCAtMCwwICsxLDIwIEBACitOQU1FOgorCVBfTUFYX0ZPT0QJCQkibWF4X2Zvb2QiCisKK0RFRklOSUVSVCBJTjoKKwkvc3lzL2xpdmluZy9saWZlLmgKKworQkVTQ0hSRUlCVU5HOgorCU51bWVyaXNjaGVyIFdlcnQgZnVlciBkaWUgbWF4aW1hbGUgU2FldHRpZ3VuZyBlaW5lcyBMZWJld2VzZW5zLgorCitBTk1FUktVTkdFTjoKKwlEZXIgV2VydCB2b24gUF9NQVhfRk9PRCBpc3QgYmVpIGRlbiBlaW56ZWxuZW4gUmFzc2VuIHZlcnNjaGllZGVuLCAKKwllYmVuc28gd2llIGRlciBmdWVyIFBfRk9PRF9ERUxBWS4gRGllIGdlbmF1ZW4gV2VydGUgc3RlaGVuIGluIGRlbgorCVJhc3Nlbi1TaGVsbHMgKC9zdGQvc2hlbGxzKS4KKworU0lFSEUgQVVDSDoKKwlQX0ZPT0QsIFBfRk9PRF9ERUxBWSwgZWF0X2Zvb2QsCisJUF9NQVhfRFJJTkssIFBfTUFYX0FMQ09IT0wKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogVHVlIERlYyAxOCAxMjoxNjoxMCAyMDAxIGJ5IFBhdHJ5bgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfTUFYX0hBTkRTIGIvZG9jL3Byb3BzL1BfTUFYX0hBTkRTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YjFhZTgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9NQVhfSEFORFMKQEAgLTAsMCArMSwyNyBAQAorUF9NQVhfSEFORFMKK05BTUU6CisgICAgIFBfTUFYX0hBTkRTICAgICAgICAgICAgICAgICAgICJtYXhfaGFuZHMiCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N5cy9saXZpbmcvY29tYmF0LmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBBbnphaGwgZGVyIEhhZW5kZSwgZGllIGVpbiBXZXNlbiBoYXQuCisKK0JFTUVSS1VOR0VOOgorICAgICBBbiBkaWVzZXIgUHJvcGVydGllIHNvbGx0ZSBiZWkgU3BpZWxlcm4gbnVyIGltIFJhaG1lbiBkZXIKKyAgICAgR2lsZGVuICdnZXNwaWVsdCcgd2VyZGVuLgorCisgICAgIEZ1ZXIgTWFnaWVyLCBkaWUgaW4gaWhyZW4gTnBjIGdlcm5lIGFsbGUgUHJvcGVydGllcyBzZXR6ZW4sCisgICAgIGdpbHQgZm9sZ2VuZGVzOgorCisgICAgICAgICAgICAgICAgICBTZXR6dCBkaWVzZSBQcm9wZXJ0aWUgTklFIGF1ZiAwICEKKworICAgICBPaG5lIEhhZW5kZSB3aXJkIGtlaW4gTnBjIGlyZ2VuZGVpbmVuIFNwaWVsZXIgYW5ncmVpZmVuIGtvZW5uZW4uCisKK1NJRUhFIEFVQ0g6CisgICAgIFBfSEFORFMsIFBfSEFORFNfVVNFRF9CWQorICAgICBQX1VTRURfSEFORFMsIFBfRlJFRV9IQU5EUworICAgICBVc2VIYW5kcywgRnJlZUhhbmRzCisKKzEuRmViLjIwMDQgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX01BWF9IUCBiL2RvYy9wcm9wcy9QX01BWF9IUApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2E4NGM0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfTUFYX0hQCkBAIC0wLDAgKzEsMTQgQEAKK05BTUU6CisgICAgUF9NQVhfSFAgICAgICAgICAgICAgICAgICAgICAgIm1heF9ocCIKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvbGl2aW5nL2xpZmUuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIE1heGltYWxlIEFuemFobCBkZXIgTGViZW5zcHVua3RlLgorCitTSUVIRSBBVUNIOgorICAgICBQcm9wczoJUF9IUAorICAgICBWZXJ3YW5kdDoJVXBkYXRlQXR0cmlidXRlcygpCisKKzIxLkFwcmlsIDIwMDYgR2xvaW5zb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9NQVhfT0JKRUNUUyBiL2RvYy9wcm9wcy9QX01BWF9PQkpFQ1RTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NmYwZDEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9NQVhfT0JKRUNUUwpAQCAtMCwwICsxLDIyIEBACitOQU1FOgorICAgIFBfTUFYX09CSkVDVFMgICAgICAgICAgICAgICAgICAibWF4X29iamVjdHMiICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL2NvbnRhaW5lci5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgTWF4aW1hbGUgQW56YWhsIGFuIE9iamVrdGVuLCBkaWUgaW4gZWluZW4gQ29udGFpbmVyIHBhc3Nlbi4KKyAgICAgUF9NQVhfT0JKRUNUUyBzb2xsdGUgaW0gTm9ybWZhbGwgendpc2NoZW4gMCAtIDEwMCBsaWVnZW4uCisKK0JFTUVSS1VOR0VOOgorICAgICBTb2xsIGVzIHNpY2ggdW0gZWluZW4gaGVyYXVzcmFnZW5kZW4gQ29udGFpbmVyIGhhbmRlbG4sIGRlciB6dW0KKyAgICAgQmVpc3BpZWwgZGFzIEdld2ljaHQgdW0gbWVociBhbHMgNTAlIHJlZHV6aWVydCwgc29sbHRlIFBfTUFYX09CSkVDVFMKKyAgICAgZWluZW4ga2xlaW5lcmVuIFdlcnQgaGFiZW4uIERhcyBWZXJoYWVsdG5pcyB2b24gUF9NQVhfV0VJR0hULAorICAgICBQX1dFSUdIVF9QRVJDRU5UIHVuZCBkaWVzZXIgUHJvcGVydHkgc29sbHRlIHN0aW1tZW4uCisKK0JFSVNQSUVMRToKKyAgICAgQWxzIEJlaXNwaWVsIHNvbGx0ZSBtYW4gc2ljaCBkYXMgUG9zdHBha2V0IGFuc2VoZW4gdW5kIHNpY2ggYW4gZGVzc2VuCisgICAgIFdlcnRlbiBvcmllbnRpZXJlbiAoL3Avc2VydmljZS9sb2NvL29iai9wYXJjZWwpLgorCitTSUVIRSBBVUNIOgorICAgICBQX01BWF9XRUlHSFQsIFBfV0VJR0hUX1BFUkNFTlQsIFBfTElHSFRfVFJBTlNQQVJFTkNZLCBjb250YWluZXIKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX01BWF9QQVNTRU5HRVJTIGIvZG9jL3Byb3BzL1BfTUFYX1BBU1NFTkdFUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBiYzZhNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX01BWF9QQVNTRU5HRVJTCkBAIC0wLDAgKzEsOSBAQAorTkFNRToKKyAgICBQX01BWF9QQVNTRU5HRVJTICAgICAgICAgICAgICAibWF4cGFzcyIgICAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvdHJhbnNwb3J0LmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBOdW1lcmlzY2hlciBXZXJ0IGZ1ZXIgZGllIG1heGltYWxlIEFuemFobCB2b24gV2VzZW4gaW4gZGVtIFRyYW5zcG9ydGVyLgorICAgICAwIGJlZGV1dGV0IHVuYmVzY2hhZW5rdGUgU3BpZWxlcnphaGwuCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9NQVhfUE9JU09OIGIvZG9jL3Byb3BzL1BfTUFYX1BPSVNPTgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWI4ZTliCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfTUFYX1BPSVNPTgpAQCAtMCwwICsxLDggQEAKK05BTUU6CisgICAgUF9NQVhfUE9JU09OICAgICAgICAgICAgICAgICAgIm1heF9wb2lzb24iICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3Byb3BlcnRpZXMuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIE1heGltYWxlIFZlcmdpZnR1bmcKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX01BWF9TUCBiL2RvYy9wcm9wcy9QX01BWF9TUApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDdhYWY1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfTUFYX1NQCkBAIC0wLDAgKzEsMTQgQEAKK05BTUU6CisgICAgUF9NQVhfU1AgICAgICAgICAgICAgICAgICAgICAgIm1heF9zcCIKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvbGl2aW5nL2xpZmUuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIE1heGltYWxlIEFuemFobCBkZXIgTWFnaWVwdW5rdGUuCisKK1NJRUhFIEFVQ0g6CisgICAgIFByb3BzOglQX1NQCisgICAgIFZlcndhbmR0OglVcGRhdGVBdHRyaWJ1dGVzKCkKKworMjEuQXByaWwgMjAwNiBHbG9pbnNvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX01BWF9XRUlHSFQgYi9kb2MvcHJvcHMvUF9NQVhfV0VJR0hUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMmYxNmIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9NQVhfV0VJR0hUCkBAIC0wLDAgKzEsMTkgQEAKK05BTUU6CisgICAgUF9NQVhfV0VJR0hUICAgICAgICAgICAgICAgICAgIm1heF93ZWlnaHQiICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL2NvbnRhaW5lci5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgTWF4aW1hbGVzIEdld2ljaHQgaW4gR3JhbW0sIGRhcyBpbiBkZW0gQ29udGFpbmVyIHZlcnN0YXV0IHdlcmRlbgorICAgICBrYW5uLgorCitCRU1FUktVTkdFTjoKKyAgICAgRGFzIFZlcmhhZWx0bmlzIHZvbiBQX1dFSUdIVF9QRVJDRU5ULCBQX01BWF9PQkpFQ1RTIHVuZCBkaWVzZXIgUHJvcGVydHkKKyAgICAgc29sbHRlIHN0aW1tZW4uIEVpbmUgZmVzdGUgR3JlbnplIGdpYnQgZXMgbmljaHQuIEFscyBCZWlzcGllbCBrYW5uIAorICAgICBkYXMgUG9zdHBha2V0IHZvbiBMb2NvIHVudGVyIC9wL3NlcnZpdmUvbG9jby9vYmogaGVyYW5nZXpvZ2VuIHdlcmRlbi4KKyAgICAgQmVzc2VyZSBXZXJ0ZSBhbHMgaW4gZGllc2VtIHNvbGx0ZSBlcyBuaWNodCwgdW5kIHdlbm4gZG9jaCBudXIgZ3V0IGJlLQorICAgICBncnVlbmRldCwgZ2ViZW4uCisKK1NJRUhFIEFVQ0g6CisgICAgIFBfV0VJR0hUX1BFUkNFTlQsIFBfTUFYX09CSkVDVFMsIFBfTElHSFRfVFJBTlNQQVJFTkNZLCBjb250YWluZXIKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX01FU1NBR0VfQkVFUCBiL2RvYy9wcm9wcy9QX01FU1NBR0VfQkVFUApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTQwZmE1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfTUVTU0FHRV9CRUVQCkBAIC0wLDAgKzEsMTkgQEAKK05BTUU6CisgICAgUF9NRVNTQUdFX0JFRVAgICAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZV9iZWVwIgorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9wbGF5ZXIvY29tbS5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgV2VydGViZXJlaWNoOiBpbnQ9MC4uMzYwMCAoU2VrdW5kZW4pCisgICAgIFdlbm4gZ2VzZXR6dCB3aXJkIGluIGRlciBLb21tdW5pa2F0aW9uIGRlcyBTcGllbGVycyBpbiBkZW4gYW5nZWdlYmVuZW4KKyAgICAgWmVpdHJhZXVtZW4gZWluIFNpZ25hbHRvbiBhdXNnZWdlYmVuLiBXaXJkIGluIHBsYXllci9jb21tLmMgaW4gY29tbV9iZWVwKCkKKyAgICAgdmVyYXJiZWl0ZXQuCisgICAgIEF1c2dhYmUgZXJmb2xndCBudXIsIHdlbm4gUF9WSVNVQUxCRUxMIG5pY2h0IGdlc2V0enQgaXN0LgorICAgICBXaXJkIGltIFNwaWVsZXJvYmpla3QgZ2VzcGVpY2hlcnQhCisKK1NJRUhFIEFVQ0g6CisgICAgIGtsaW5nZWx0b24sIHRvbiwgUF9WSVNVQUxCRUxMLCBQX01FU1NBR0VfTEFTVF9CRUVQCisKK0xFVFpURSBBRU5ERVJVTkc6CisgICAxNi4gTWFpIDIwMDcgIEVubm94CmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9NRVNTQUdFX1BSRVBFTkQgYi9kb2MvcHJvcHMvUF9NRVNTQUdFX1BSRVBFTkQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU0NGRkYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX01FU1NBR0VfUFJFUEVORApAQCAtMCwwICsxLDE4IEBACitOQU1FOgorICAgIFBfTUVTU0FHRV9QUkVQRU5EICAgICAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2VfcHJlcGVuZCIKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcGxheWVyL2NvbW0uaAorCitCRVNDSFJFSUJVTkc6CisgICAgIFdlcnRlYmVyZWljaDogaW50ID0gMCwxCisgICAgIFdlbm4gdm9tIFppZWwgZWluZ2VzY2hhbHRldCwgd2lyZCB2b24gdGVpbGUgbWl0IChfdGVsbCkgdW5kIHNhZyAoX2NvbW11bmljYXRlKSBkYXMgCisgICAgIEJTX1BSRVBFTkRfSU5ERU5UIEZsYWcgZnVlciBicmVha19zdHJpbmcgZ2VudXR6dCwgdW0gZGVuIEluZGVudCAoU2VuZGVyKSBnZ2YuCisgICAgIHZvciBkZW0gVGV4dGJsb2NrIGFuenV6ZWlnZW4uCisgICAgIFdpcmQgaW0gU3BpZWxlcm9iamVrdCBnZXNwZWljaGVydCEKKworU0lFSEUgQVVDSDoKKyAgICAgZ3JhZmlrIGF1cywgYnJlYWtfc3RyaW5nLCBzZW5kZXJ3aWVkZXJob2x1bmcKKworTEVUWlRFIEFFTkRFUlVORzoKKyAgIDE2LiBNYWkgMjAwNyAgRW5ub3gKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX01JTl9TVE9DSyBiL2RvYy9wcm9wcy9QX01JTl9TVE9DSwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODk2ZmIzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfTUlOX1NUT0NLCkBAIC0wLDAgKzEsMzcgQEAKK05BTUU6CisJUF9NSU5fU1RPQ0sJCQkibWluX3N0b2NrIgorCitERUZJTklFUlQgSU46CisJL3N5cy9iYW5rLmgKKworQkVTQ0hSRUlCVU5HOgorCVBfTUlOX1NUT0NLIGVudGhhZWx0IGRpZSBBbnphaGwgYW4gT2JqZWt0ZW4sIGRpZSBlaW4gTGFnZXIgZWluZXMKKwlMYWRlbnMgbWluaW1hbCBiZWhhZWx0LiBTdGFuZGFyZG1hZXNzaWcgZW50c3ByaWNodCBkaWVzIDIwIE9iamVrdGVuCisJdW5kIHNvbGx0ZSBhdWNoIG5pY2h0IHdlc2VudGxpY2ggZXJob2VodCB3ZXJkZW4uIE51ciBmdWVyCisJQW5mYWVuZ2VyZ2ViaWV0ZSB3YWVyZW4gV2VydGUgendpc2NoZW4gMjAgdW5kIDYwIGFremVwdGFiZWwuIEluIGRpZQorCUJlcmVjaG51bmcgZGVyIEFuemFobCB2b24gT2JqZWt0ZW4gZ2VoZW4ga2VpbmUgT2JqZWt0ZSBlaW4sIGRpZSBpbQorCUxhZGVuIG1pdHRlbHMgQWRkRml4ZWRPYmplY3QoKSBzdGFlbmRpZyB2ZXJmdWVnYmFyIGdlbWFjaHQgd29yZGVuCisJc2luZCB1bmQgYXVjaCBrZWluZSBPYmpla3RlLCBkaWUgcGVyIEFkZEl0ZW0oKSBpbSBMYWdlciBoaW56dWdlZnVlZ3QKKwl3dXJkZW4gdW5kIG5hY2ggamVkZW0gUmVzZXQgYXVmZ2VmcmlzY2h0IHdlcmRlbi4KKwlCZWkgamVkZW0gUmVzZXQgd2lyZCBudW4gYXVzIFNwZWljaGVyLSB1bmQgTGFnZ3J1ZW5kZW4gZGFzIExhZ2VyIHVtCisJZWluZSBiZXN0aW1tdGUgUHJvemVudHphaGwgYW4gT2JqZWt0ZW4gZGV6aW1pZXJ0LiBFbnRzY2hlaWRlbmQKKwlkYWZ1ZXIgaXN0IGRlciBXZXJ0IGluIGRlciBQcm9wZXJ0eSBQX1NUT1JFX0NPTlNVTUUuCisJQmVpZGUgaGllciBlcndhZWhudGVuIFByb3BlcnRpZXMgc29sbHRlbiB1ZWJlcmlnZW5zIG51ciBtaXR0ZWxzCisJUXVlcnlQcm9wL1NldFByb3AgYXVzZ2VsZXNlbiBiencuIHZlcmFlbmRlcnQgd2VyZGVuLgorCitCRUlTUElFTDoKKwlJbiAnL3N0ZC9zdG9yZS5jJyBiZWZpbmRldCBzaWNoIGJlcmVpdHMgZWluIGd1dGVzIEJlaXNwaWVsLCBkYSBkb3J0CisJZGVyIFN0YW5kYXJkd2VydCB2b24gMjAgT2JqZWt0ZW4gYmVyZWl0Z2VzdGVsbHQgd2lyZDoKKwkgIGNyZWF0ZSgpCisJICB7IC4uLgorCSAgICBTZXRQcm9wKFBfTUlOX1NUT0NLLDIwKTsKKwkgIH0KKwlEaWVzZW4gV2VydCBrYW5uIG1hbiBpbiBlaW5lbSBkYXZvbiBhYmdlbGVpdGV0ZW4gZWlnZW5lbiBMYWdlcgorCW5hdHVlcmxpY2ggYXVjaCB2ZXJhZW5kZXJuLgorCitTSUVIRSBBVUNIOgorCVBfU1RPUkVfQ09OU1VNRSwgU2V0U3RvcmFnZVJvb20oKSwgL3N0ZC9zdG9yZS5jLCAvc3RkL3Nob3AuYworCUFkZEl0ZW0oKSwgUmVtb3ZlSXRlbSgpLCBBZGRGaXhlZE9iamVjdCgpLCBSZW1vdmVGaXhlZE9iamVjdCgpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IDE5LUp1bi0yMDE1LCBBcmF0aG9ybiAKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX01NU0dJTiBiL2RvYy9wcm9wcy9QX01NU0dJTgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDhlODRlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfTU1TR0lOCkBAIC0wLDAgKzEsOSBAQAorTkFNRToKKyAgICBQX01NU0dJTiAgICAgICAgICAgICAgICAgICAgICAibW1zZ2luIiAgICAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcGxheWVyL21vdmluZy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgU3RyaW5nIG1pdCBkZXIgTWVsZHVuZywgZGllIGJlaW0gVmVybGFzc2VuIGVpbmVzIFJhdW1lcyBtaXQgTV9UUE9SVAorICAgICBhbiBkaWUgdWVicmlnZW4gQW53ZXNlbmRlbiBhdXNnZWdlYmVuIHdpcmQuCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9NTVNHT1VUIGIvZG9jL3Byb3BzL1BfTU1TR09VVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWZkMDlmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfTU1TR09VVApAQCAtMCwwICsxLDkgQEAKK05BTUU6CisgICAgUF9NTVNHT1VUICAgICAgICAgICAgICAgICAgICAgIm1tc2dvdXQiICAgICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3BsYXllci9tb3ZpbmcuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIFN0cmluZyBtaXQgZGVyIE1lbGR1bmcsIGRpZSBiZWltIEJldHJldGVuIGVpbmVzIFJhdW1lcyBtaXQgTV9UUE9SVAorICAgICBhbiBkaWUgdWVicmlnZW4gQW53ZXNlbmRlbiBhdXNnZWdlYmVuIHdpcmQuCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9NU0dJTiBiL2RvYy9wcm9wcy9QX01TR0lOCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMTRhOTEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9NU0dJTgpAQCAtMCwwICsxLDkgQEAKK05BTUU6CisgICAgUF9NU0dJTiAgICAgICAgICAgICAgICAgICAgICAgIm1zZ2luIiAgICAgICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3BsYXllci9tb3ZpbmcuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIFN0cmluZyBtaXQgZGVyIE1lbGR1bmcsIGRpZSBiZWltIEJldHJldGVuIGVpbmVzIFJhdW1lcyBtaXQgTV9HTworICAgICBhbiBkaWUgdWVicmlnZW4gQW53ZXNlbmRlbiBhdXNnZWdlYmVuIHdpcmQuCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9NU0dPVVQgYi9kb2MvcHJvcHMvUF9NU0dPVVQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU4N2FmYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX01TR09VVApAQCAtMCwwICsxLDkgQEAKK05BTUU6CisgICAgUF9NU0dPVVQgICAgICAgICAgICAgICAgICAgICAgIm1zZ291dCIgICAgICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3BsYXllci9tb3ZpbmcuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIFN0cmluZyBtaXQgZGVyIE1lbGR1bmcsIGRpZSBiZWltIFZlcmxhc3NlbiBlaW5lcyBSYXVtZXMgbWl0IE1fR08KKyAgICAgYW4gZGllIHVlYnJpZ2VuIEFud2VzZW5kZW4gYXVzZ2VnZWJlbiB3aXJkLgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfTVNHX1BST0IgYi9kb2MvcHJvcHMvUF9NU0dfUFJPQgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTIwMDY3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfTVNHX1BST0IKQEAgLTAsMCArMSwxOSBAQAorTkFNRToKKyAgICBQX01TR19QUk9CICAgICAgICAgICAgICAgICAgICAibXNnX3Byb2IiICAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcm9vbS9kZXNjcmlwdGlvbi5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgUGFyYW1ldGVyIGZ1ZXIgZGllIFdhcnRlemVpdCBpbiBTZWt1bmRlbiBiaXMgenVyIG5hZWNoc3RlbiBBdXNnYWJlCisgICAgIGVpbmVyIFJhdW1uYWNocmljaHQuCisgICAgIFdpcmQgaW4gQWRkUm9vbU1lc3NhZ2UoKSBleHBsaXppdCBtaXRnZXNldHp0LiBLb2VubnRlIG5hdHVlcmxpY2ggdm9uCisgICAgIGVpbmVyIE5hY2hyaWNodGVubWV0aG9kZSBhdWNoIHJlZ2VsbWFlc3NpZyBnZWFlbmRlcnQgd2VyZGVuLCB1bQorICAgICBtZWhyIFp1ZmFsbCBpbiBkaWUgSW50ZXJ2YWxsZSB6dSBicmluZ2VuLgorCitTSUVIRSBBVUNIOgorICAgICBMRnVuczogICAgQWRkUm9vbU1lc3NhZ2UoKQorICAgICBQcm9wczogICAgUF9ST09NX01TRywgUF9NU0dfUFJPQgorICAgICBWZXJ3YW5kdDogY2FsbF9vdXQoKQorCisyLkZlYiAyMDE2IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9NVURfTkVXQklFIGIvZG9jL3Byb3BzL1BfTVVEX05FV0JJRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWJiNzdmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfTVVEX05FV0JJRQpAQCAtMCwwICsxLDE3IEBACitOQU1FOgorICAgIFBfTVVEX05FV0JJRSAgICAgICAgICAgICAgICAgICAgICAiX2xpYl9tdWRfbmV3YmllIiAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcGxheWVyL2Jhc2UuaAorCitCRVNDSFJFSUJVTkc6CisgICAgRGVyIFNwaWVsZXIgaGF0IGJlaSBFcnN0ZWxsdW5nIGRlcyBDaGFyYWt0ZXJzIGFuZ2VnZWJlbiwgbm9jaCBuaWUgaW4gZWluZW0KKyAgICBNdWQgZ2VzcGllbHQgenUgaGFiZW4uIEluIGRpZXNlbSBGYWxsIGVudGhhZWx0IGRpZSBQcm9wZXJ0eSBkZW4KKyAgICBaZWl0c3RlbXBlbCBkZXIgQ2hhcmFrdGVyZXJzdGVsbHVuZy4KKworICAgIEFDSFRVTkc6IERpZXNlIFByb3Agd2lyZCBuaWNodCBnZXNwZWljaGVydCwgZC5oLiBuYWNoZGVtIGVpbiBzb2xjaGVyCisgICAgU3BpZWxlciAiZW5kZSIgZ2VtYWNodCBoYXQgb2RlciBlaW4gUmVib290IGVyZm9sZ3RlLCBpc3QgZGllc2UgSW5mb3JtYXRpb24KKyAgICB2ZXJsb3Jlbi4KKworU0lFSEUgQVVDSDoKKwpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfTVVSREVSX01TRyBiL2RvYy9wcm9wcy9QX01VUkRFUl9NU0cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODViYmY4MQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX01VUkRFUl9NU0cKQEAgLTAsMCArMSw2MyBAQAorUF9NVVJERVJfTVNHCisKK05BTUU6CisgICAgIFBfTVVSREVSX01TRwkJCSJtdXJkZXJfbXNnIgorCitERUZJTklFUlQgSU46CisgICAgIC9zeXMvcHJvcGVydGllcy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgSW4gZGllc2VyIFByb3BlcnR5IGthbm4gbWFuIGVpbmVuIFN0cmluZyBvZGVyIGVpbmUgQ2xvc3VyZSBhYmxlZ2VuCisgICAgIGRlc3NlbiBXZXJ0IGJ6dy4gZGVyZW4gUmVzdWx0YXQgYmVpbSBUb2QgZGVzIE5QQ3MgYXVmIGRlbQorICAgICBNb2VyZGVyLUthbmFsIGVyc2NoZWludC4KKyAgICAgTm9ybWFsZXJ3ZWlzZSBpc3QgZGllIFByb3BlcnR5IG5pY2h0IGdlc2V0enQsIHdvcmF1ZmhpbiB6dWZhZWxsaWcKKyAgICAgZWluZSBNZWxkdW5nIGdlbmVyaWVydCB3aXJkLgorCisgICAgIE9iIGRlciBUb2QgZWluZXMgTlBDcyBhdWYgZGVtIE1vZXJkZXItS2FuYWwgZXJzY2hlaW50LCBoYWVuZ3QgZGF2b24gYWIsCisgICAgIHdpZSBvZnQgdW5kIHdlbGNoZSBBcnQgdm9uIE5QQ3MgaW4gZGVyIGxldHp0ZW4gWmVpdCBnZXRvZXRldCB3dXJkZW4uIFp1bQorICAgICBCZWlzcGllbCBpc3QgZXMgZWhlciBzZWx0ZW4sIGRhc3MgZWluIHNjaHdhY2hlciBOUEMgYXVmIGRlbSBLYW5hbAorICAgICBlcnNjaGVpbnQsIHdlbm4ga3VlcnpsaWNoIHZpZWxlIHN0YXJrZSBOUENzIGdldG9ldGV0IHd1cmRlbi4gQWxsZXJkaW5ncworICAgICBrYW5uIG1hbiBhdWYgZGllc2UgUmVnZWx1bmcgbWl0dGVscyBkZXIgUHJvcGVydHkgUF9GT1JDRV9NVVJERVJfTVNHCisgICAgIEVpbmZsdXNzIG5laG1lbi4KKworICAgICBXaXJkIGluIGVpbmVuIFN0cmluZyBkZXIgUGxhdHpoYWx0ZXIgJXMgZWluZ2VmdWVndCwgc28gZXJzY2hlaW50IGFuIGRlcgorICAgICBTdGVsbGUgc3BhZXRlciBkZXIgTmFtZSBkZXMgTW9lcmRlcnMuCisKK0JFSVNQSUVMRToKKyAgICAgLy8gWnVtIEJlaXNwaWVsIGtvZW5udGUgbWFuIGphIGJlaSBlaW5lciBSYXR0ZSwgZGllIGdldG9ldGV0IHdpcmQsCisgICAgIC8vIGZvbGdlbmRlcyBhdWYgZGVtIE1vZXJkZXItS2FuYWwgYXVzZ2ViZW4gbGFzc2VuOgorICAgICBTZXRQcm9wKFBfTVVSREVSX01TRywKKyAgICAgICAiUmF0dGVuIGFsbGVyIE1VRHMsIHZlcmVpbmlndCBldWNoIGdlZ2VuICVzISIpOworCisKKyAgICAgLy8gVW0gYXVjaCBtYWwgZWluZSBDbG9zdXJlIHp1IHplaWdlbjogZGllIFJhdHRlIGv2bm50ZSBhdWNoIGlocmUKKyAgICAgLy8gTWVsZHVuZyBlcnN0IGJlaSBpaHJlbSBUb2QgZXJzdGVsbGVuIGxhc3NlbjoKKyAgICAgcHJpdmF0ZSBzdHJpbmcgbW9lcmRlcl9tZWxkdW5nKCkgeworICAgICAgIHJldHVybiAoeyJBY2h3ZWghIiwgIkF1ISIsICJXZWlhISJ9KVtyYW5kb20oMyldOworICAgICB9CisKKyAgICAgU2V0UHJvcChQX01VUkRFUl9NU0csICMnbW9lcmRlcl9tZWxkdW5nKTsKKworQkVNRVJLVU5HRU46CisgICAgIC0gUF9OT0NPUlBTRToKKyAgICAgICBJc3QgaW4gZGVtIE5wYyBkaWUgUHJvcGVydHkgUF9OT0NPUlBTRSBnZXNldHp0LCBzbyB3aXJkIGRpZQorICAgICAgIE1vZXJkZXJtZWxkdW5nIG5pY2h0IGF1ZiBkZW0gS2FuYWwgZ2VzZW5kZXQsIGRhIGRpZXNlIEF1c2dhYmUgdWViZXIKKyAgICAgICAvc3RkL2NvcnBzZSBsYWV1ZnQuCisgICAgICAgV2lsbCBtYW4gZGVubm9jaCBlaW5lIE1lbGR1bmcsIHNvIHNvbGx0ZSBtYW4gL3N0ZC9jb3Jwc2UgaW0gZGllKCkKKyAgICAgICBzZWxic3QgY2xvbmVuLCBkYXJhbiBJZGVudGlmeSh0aGlzX29iamVjdCgpKSBydWZlbiB1bmQgZGFzIGdlY2xvbnRlCisgICAgICAgT2JqZWt0IHdpZWRlciBlbnRzb3JnZW4uCisKKyAgICAgLSBDbG9zdXJlczoKKyAgICAgICBDbG9zdXJlcyBiaWV0ZW4gc2ljaCBhbiwgd2VubiBlaW4gemVudHJhbGVzIE9iamVrdCBm/HIgbWVocmVyZSBOUENzCisgICAgICAgYmVzdGltbXRlIE1vZXJkZXJtZWxkdW5nZW4gZ2VuZXJpZXJlbiBzb2xsLiBEYW5uIG11c3MgbnVyIG5vY2ggYmVpCisgICAgICAgZGVuIE5QQ3MgZGllIENsb3N1cmUsIGRpZSBhdWYgZGllIGVyc3RlbGxlbmRlIE1ldGhvZGUgemVpZ3QgZ2VzZXR6dAorICAgICAgIHdlcmRlbi4KKworU0lFSEUgQVVDSDoKKyAgICAgVG9kOgkJZGllKEwpCisgICAgIFZlcndhbmR0OgkJUF9GT1JDRV9NVVJERVJfTVNHCisgICAgIFRvZGVzbWVsZHVuZ2VuOglQX0tJTExfTkFNRSwgUF9LSUxMX01TRywgUF9ESUVfTVNHCisJCQlQX1pBUF9NU0csIFBfRU5FTVlfREVBVEhfU0VRVUVOQ0UKKyAgICAgU29uc3RpZ2VzOgkJUF9DT1JQU0UsIFBfTk9DT1JQU0UsIC9zdGQvY29ycHNlLmMKKworMzAuIE1haSAyMDA2LCBHbG9pbnNvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX01fQVRUUl9NT0QgYi9kb2MvcHJvcHMvUF9NX0FUVFJfTU9ECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNzk3MTcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9NX0FUVFJfTU9ECkBAIC0wLDAgKzEsNDIgQEAKK05BTUU6CisgICAgUF9NX0FUVFJfTU9EICAgICAgICAgICAgICAgICAgIm1hZ2ljX2F0dHJpYnV0ZXNfbW9kaWZpZXIiCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL2xpdmluZy9hdHRyaWJ1dGVzLmgKKworQkVTQ0hSRUlCVU5HOgorICAgIE1hcHBpbmcsIGRhcyBkaWUgQXR0cmlidXRlIGRlcyBTcGllbGVycyB2ZXJhZW5kZXJ0LCBkZXIgZGllc2UgUnVlc3R1bmcKKyAgICBiencuIFdhZmZlIHRyYWVndCBiencuIGJlbnV0enQuCisKKyAgICBadSBiZWFjaHRlbjoKKyAgICBQX01fQVRUUl9NT0Qga2FubiBwcm9ibGVtbG9zIGR1cmNoIGVpbiBTZXRQcm9wKCkgZ2VzZXR6dCB3ZXJkZW4uIEVzIHdpcmQKKyAgICBudXIgZGFubiBiZXJ1ZWNrc2ljaHRpZ3QsIHdlbm4gZGllIFJ1ZXN0dW5nL1dhZmZlIGdldHJhZ2VuL2JlbnV0enQgd2lyZC4KKyAgICBCZWltIFRyYWdlbi9BdXN6aWVoZW4vWnVlY2tlbi9XZWdzdGVja2VuIHdpcmQgaW0gU3BpZWxlciBhdXRvbWF0aXNjaAorICAgIFVwZGF0ZUF0dHJpYnV0ZXMoKSBhdWZnZXJ1ZmVuLgorCisgICAgRnVlciBLcmFua2hlaXRlbiBldGMuIG9kZXIgT2JqZWt0ZSwgZGVyZW4gKkJlc2l0eiogYWxsZWluIHNjaG9uIGRpZQorICAgIEF0dHJpYnV0ZSB2ZXJhZW5kZXJuIHNvbGxlbiwgdmVyd2VuZGV0IG1hbiBiZXNzZXIgUF9YX0FUVFJfTU9ELgorCisgICAgUF9YX0FUVFJfTU9EIHVuZCBQX01fQVRUUl9NT0QgZHVlcmZlbiBlaW5lbiBnZW1laW5zYW1lbiBrdW11bGllcnRlbgorICAgIHBvc2l0aXZlbiBHcmVuendlcnQgbmljaHQgdWViZXJzY2hyZWl0ZW4uIERpZXNlciBHcmVuendlcnQsCisgICAgQ1VNVUxBVElWRV9BVFRSX0xJTUlULCBpc3QgaW4gL3N5cy9saXZpbmcvYXR0cmlidXRlcy5oIGRlZmluaWVydC4KKworQkVNRVJLVU5HRU46CisgICAgRGllIFdlcnRlIHNvbGx0ZW4gbW9lZ2xpY2hzdCBuaWNodCBkeW5hbWlzY2ggZ2VhZW5kZXJ0IHdlcmRlbi4KKyAgICBXZW5uIGRvY2gsIG11c3MgbWl0IFRlc3RMaW1pdFZpb2xhdGlvbigpIGFtIFNwaWVsZXIgYXVmIFZhbGlkaXRhZXQKKyAgICBnZXBydWVmdCB1bmQgZ2dmLiBtaXQgVXBkYXRlQXR0cmlidXRlcygpIGFuIGlobSB1cGdlZGF0ZXQgd2VyZGVuLgorCitCRUlTUElFTEU6CisgICAgLy8gRGVtIFNwaWVsZXIsIGRlciBkYXMgT2JqZWt0IGJlbnV0enQsIHdpcmQgMiB2b24gQV9JTlQgYWJnZXpvZ2VuIHVuZAorICAgIC8vIGRhZnVlciAxIGF1ZiBBX1NUUiBhdWZhZGRpZXJ0LgorICAgIFNldFByb3AoUF9NX0FUVFJfTU9ELCAoW0FfSU5UOi0yLCBBX1NUUjoxXSkgKTsKKworU0lFSEUgQVVDSDoKKyAgICBRdWVyeUF0dHJpYnV0ZSgpLCBRdWVyeVJlYWxBdHRyaWJ1dGUoKSwgUXVlcnlBdHRyaWJ1dGVPZmZzZXQoKSwKKyAgICBTZXRBdHRyaWJ1dGUoKSwgU2V0UmVhbEF0dHJpYnV0ZSgpLCBVcGRhdGVBdHRyaWJ1dGVzKCksCisgICAgU2V0VGltZWRBdHRyTW9kaWZpZXIoKSwgUXVlcnlUaW1lZEF0dHJNb2RpZmllcigpLAorICAgIERlbGV0ZVRpbWVkQXR0ck1vZGlmaWVyKCksCisgICAgUF9YX0hFQUxUSF9NT0QsIFBfTV9IRUFMVEhfTU9ELCBQX0FUVFJJQlVURVMsIFBfQVRUUklCVVRFU19PRkZTRVRTLAorICAgIFBfVElNRURfQVRUUl9NT0QsIFBfWF9BVFRSX01PRCwgUF9NX0FUVFJfTU9ELCAvc3RkL2xpdmluZy9hdHRyaWJ1dGVzLmMKKworMDIuMDIuMjAxNiwgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX01fSEVBTFRIX01PRCBiL2RvYy9wcm9wcy9QX01fSEVBTFRIX01PRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGM4OWU2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfTV9IRUFMVEhfTU9ECkBAIC0wLDAgKzEsNDAgQEAKK05BTUU6CisgICAgIFBfTV9IRUFMVEhfTU9EICAgICAgICAgICAgICAgICAgIm1hZ2ljX2hlYWx0aF9tb2RpZmllciIKKworREVGSU5JRVJUIElOOgorICAgICAvc3lzL2xpdmluZy9hdHRyaWJ1dGVzLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBNYXBwaW5nLCBtaXQgZGVtIGRpZSBtYXhpbWFsZW4gTGViZW5zcHVua3RlIHVuZCBNYWdpZXB1bmt0ZSBlaW5lcyAKKyAgICAgU3BpZWxlcnMgdmVyYWVuZGVydCB3ZXJkZW4sIGRlciBkaWVzZSBSdWVzdHVuZy9XYWZmZSB0cmFlZ3QvYmVudXR6dC4gSW0gCisgICAgIEdlZ2Vuc2F0eiB6dSBQX01fQVRUUl9NT0QgZXJmb2xndCBoaWVyIGplZG9jaCBrZWluZSBCbG9ja2FkZS4KKworICAgICBadSBiZWFjaHRlbjogUF9NX0hFQUxUSF9NT0Qga2FubiBwcm9ibGVtbG9zIGR1cmNoIGVpbiBTZXRQcm9wKCkgZ2VzZXR6dCAKKyAgICAgd2VyZGVuLCBlcyB3aXJkIG51ciBiZXJ1ZWNrc2ljaHRpZ3QsIHdlbm4gZGllIFJ1ZXN0dW5nL1dhZmZlIAorICAgICBnZXRyYWdlbi9iZW51dHp0IHdpcmQuIEJlaW0gdHJhZ2VuL2F1c3ppZWhlbi96dWVja2VuL3dlZ3N0ZWNrZW4gd2lyZCBpbSAKKyAgICAgU3BpZWxlciBhdXRvbWF0aXNjaCBVcGRhdGVBdHRyaWJ1dGVzKCkgYXVmZ2VydWZlbi4KKworICAgICBGdWVyIEtyYW5raGVpdGVuIGV0Yy4gdmVyd2VuZGV0IG1hbiBiZXNzZXIgZGllIFByb3BlcnR5IFBfWF9IRUFMVEhfTU9ELgorCisgICAgIEJpdHRlIGJlYWNodGVuOiBEaWUgcG9zaXRpdmVuIE1vZGlmaWVyIHdlcmRlbiBuaWNodCBtZWhyIDE6MSBhdWYgZGllCisgICAgIExlYmVucy0gdW5kIE1hZ2llcHVua3RlIGRyYXVmYWRkaWVydC4gU3RhdHRkZXNzZW4gd2lyZCBudXIgbm9jaCBlaW4gCisgICAgIGdld2lzc2VyIFRlaWwgZG9ydCBoaW56dWFkZGllcnQsIGRlciBtaXQgZ3JvZXNzZXJlciBNZW5nZSB2b24gUHVua3RlbgorICAgICB6dW5pbW10LCB1bmQgaW0gdW50ZXJlbiBCZXJlaWNoIGdyb2IgZGVtIFdlcnQgZW50c3ByaWNodC4gRGFzIAorICAgICB0aGVvcmV0aXNjaGUgTWF4aW11bSBpc3QgaW5zZ2VzYW10IDE0OS4KKworQkVNRVJLVU5HRU46CisgICAgIERpZSBXZXJ0ZSBzb2xsdGVuIG1vZWdsaWNoc3QgbmljaHQgZHluYW1pc2NoIGdlYWVuZGVydCB3ZXJkZW4uCisgICAgIFdlbm4gZG9jaCwgbXVzcyBtaXQgVGVzdExpbWl0VmlvbGF0aW9uKCkgYW0gU3BpZWxlciBhdWYgVmFsaWRpdGFldCAKKyAgICAgZ2VwcnVlZnQgd2VyZGVuIHVuZCBtaXQgVXBkYXRlQXR0cmlidXRlcygpIGFuIGlobSBnZ2YuIHVwZ2VkYXRldC4KKworQkVJU1BJRUw6CisgICAgIFNldFByb3AoUF9NX0hFQUxUSF9NT0QsKFtQX0hQOjUsUF9TUDotNV0pKTsKKyAgICAgLy8gRGVtIFNwaWVsZXIsIGRlciBkYXMgT2JqZWt0IGJlbnV0enQsIHdpcmQgUF9NQVhfSFAgdW0gNSBlcmhvZWh0IHVuZAorICAgICAvLyBQX01BWF9TUCB1bSA1IGVybmllZHJpZ3QuCisKK1NJRUhFIEFVQ0g6CisgICAgIFBfWF9IRUFMVEhfTU9ELCBQX1hfQVRUUl9NT0QsIFBfTV9BVFRSX01PRCwgYmFsYW5jZQorCitMRVRaVEUgQWVOREVSVU5HOgorICAgIEZyZSwxMS4wNS4yMDA3LCAwMDoyMCB2b24gSHVtbmkKKwpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfTkFNRSBiL2RvYy9wcm9wcy9QX05BTUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYwOWNlYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX05BTUUKQEAgLTAsMCArMSw2NSBAQAorUF9OQU1FCisKK05BTUU6CisgICAgIFBfTkFNRSAibmFtZSIKKworREVGSU5JRVJUIElOOgorICAgICA8dGhpbmcvZGVzY3JpcHRpb24uaD4KKworQkVTQ0hSRUlCVU5HOgorICAgICBJbiBkaWVzZXIgUHJvcGVydHkgd2lyZCBkZXIgTmFtZSBlaW5lcyBPYmpla3RlcyB2ZXJtZXJrdC4gV2VubiBkZXIgTmFtZQorICAgICByZWdlbG1hZXNzaWcgZGVrbGluaWVydCB3aXJkLCByZWljaHQgZWluIGVpbmZhY2hlciBTdHJpbmcuIFdpcmQgZGVyCisgICAgIE5hbWUgdW5yZWdlbG1hZXNzaWcgZGVrbGluaWVydCwgc28ga2FubiBtYW4gZWluIEFycmF5IHZvbiB2aWVyIFN0cmluZ3MKKyAgICAgbWl0IGRlbSBOYW1lbiBpbSBOb21pbmF0aXYsIEdlbml0aXYsIERhdGl2IHVuZCBBa2t1c2F0aXYgKGluIGRpZXNlcgorICAgICBSZWloZW5mb2xnZSkgYW5nZWJlbi4KKworICAgICBEaWUgRnVua3Rpb24gbmFtZSgpIGJlaGFuZGVsdCByZWNodCB2aWVsZSBTb25kZXJmYWVsbGU7IG1hbiBzb2xsdGUgZGVuCisgICAgIE5hbWVuIGFsc28gZXJzdCBlaW5tYWwgaW4gZGVyIEZvcm0gZWluZXMgZWluemVsbmVuIFN0cmluZ3MgcHJ1ZWZlbi4KKworICAgICBFaW5lIFNvbmRlcnJvbGxlIG5laG1lbiBVbml0LU9iamVrdGUgZWluOiBIaWVyIGthbm4gbWFuIGVpbmVuIE5hbWVuCisgICAgIGZ1ZXIgZGVuIFNpbmd1bGFyIHVuZCBlaW5lbiBOYW1lbiBmdWVyIGRlbiBQbHVyYWwgdmVyZ2ViZW4uCisKKyAgICAgU2V0enQgbWFuIFBfTkFNRSBlaW5lcyBVbml0LU9iamVrdHMgYXVmIGVpbmVuIGVpbmZhY2hlbiBTdHJpbmcsIHNvIHdpcmQKKyAgICAgZGllc2VyIGFscyBOYW1lIHNvd29obCBpbSBTaW5ndWxhciBhbHMgYXVjaCBpbSBQbHVyYWwgdmVyd2VuZGV0LgorCisgICAgIFVlYmVyZ2lidCBtYW4gZWluIEFycmF5IHZvbiBTdHJpbmdzLCBzbyB3aXJkIGRlciBlcnN0ZSBFaW50cmFnIGZ1ZXIgZGVuCisgICAgIFNpbmd1bGFyIHVuZCBkZXIgendlaXRlIEVpbnRyYWcgZnVlciBkZW4gUGx1cmFsIGJlbnV0enQuCisKKyAgICAgQmVpIFVuaXQtT2JqZWt0ZW4gaXN0IGVzIG5pY2h0IG1vZWdsaWNoLCBhdWNoIG5vY2ggendpc2NoZW4gZGVuCisgICAgIHZlcnNjaGllZGVuZW4gRmFlbGxlbiB6dSB1bnRlcnNjaGVpZGVuLgorCitCRU1FUktVTkdFTjoKKyAgICAgRGllc2UgUHJvcGVydHkgc29sbHRlIG51ciBkZW4gcmVpbmVuIE5hbWVuIGVudGhhbHRlbjsgd2lsbCBtYW4gZGVtCisgICAgIE5hbWVuIG5vY2ggQWRqZWt0aXZlIHZvcmFuc3RlbGxlbiwgc28gc29sbHRlIG1hbiBkaWVzIG1pdCBQX05BTUVfQURKCisgICAgIGJld2Vya3N0ZWxsaWdlbiwgYWxzbyBzdGF0dAorCisgICAgIFNldFByb3AoUF9OQU1FLCAoeyAiYWx0ZXIgSHV0IiwgImFsdGVuIEh1dHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgImFsdGVuIEh1dCIsICJhbHRlbiBIdXQiIH0pICk7CisKKyAgICAgYmVzc2VyCisKKyAgICAgU2V0UHJvcChQX05BTUUsICJIdXQiKTsKKyAgICAgU2V0UHJvcChQX05BTUVfQURKLCAiYWx0Iik7CisKKyAgICAgQmVpIExlYmV3ZXNlbiB3aXJkIGxvd2VyX2Nhc2UoUF9OQU1FKSAoYmVpIEFycmF5cyBkYXMgZXJzdGUgRWxlbWVudCAKKyAgICAgZGFyYXVzKSBhdXRvbWF0aXNjaCBhbHMgTGl2aW5nTmFtZSBnZXNldHp0LgorCitCRUlTUElFTEU6CisgICAgIEVpbiByZWdlbG1hZXNzaWcgZGVrbGluaWVyYmFyZXIgTmFtZToKKworICAgICBTZXRQcm9wKFBfTkFNRSwgIkFya3NoYXQiKTsKKworICAgICBIaWVyIGVpbiBCZWlzcGllbCBmdWVyIGVpbmVuIHVucmVnZWxtYWVzc2lnIGRla2xpbmllcmJhcmVuIE5hbWVuOgorCisgICAgIFNldFByb3AoUF9OQU1FLCAoeyAiRHJhY2hlIiwgIkRyYWNoZW4iLCAiRHJhY2hlbiIsICJEcmFjaGVuIiB9KSk7CisKKyAgICAgVW5kIHNjaGxpZXNzbGljaCBkZXIgTmFtZSBlaW5lcyBhbGxzZWl0cyBiZWthbm50ZW4gVW5pdC1PYmpla3RlczoKKworICAgICBTZXRQcm9wKFBfTkFNRSwgKHsgIk11ZW56ZSIsICJNdWVuemVuIiB9KSk7CisKK1NJRUhFIEFVQ0g6CisgICAgIC9zdGQvdGhpbmcvZGVzY3JpcHRpb24uYywgbmFtZSgpLCBQX05BTUVfQURKLCBzZXRfbGl2aW5nX25hbWUoKSwKKyAgICAgZmluZF9saXZpbmcoKSwgZmluZF9saXZpbmdzKCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogMTkuIE9rdC4gMjAxNSwgQXJhdGhvcm4uIApkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfTkFNRV9BREogYi9kb2MvcHJvcHMvUF9OQU1FX0FESgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmYxNWU2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfTkFNRV9BREoKQEAgLTAsMCArMSw1NSBAQAorUF9OQU1FX0FESgorCitOQU1FOgorICAgICBQX05BTUVfQURKICJuYW1lX2FkaiIKKworREVGSU5JRVJUIElOOgorICAgICA8dGhpbmcvZGVzY3JpcHRpb24uaD4KKworQkVTQ0hSRUlCVU5HOgorICAgICBEaWVzZSBQcm9wZXJ0eSBlbnRoYWVsdCBlaW4gb2RlciBtZWhyZXJlIEFkamVrdGl2ZSBpbiBGb3JtIGVpbmVzIEFycmF5cworICAgICB2b24gU3RyaW5ncy4gRXMgaXN0IG51ciBkZXIgV29ydHN0YW1tIGFuenVnZWJlbiEgRGllIEFkamVrdGl2ZSB3ZXJkZW4KKyAgICAgdm9uIGRlciBGdW5rdGlvbiBuYW1lKCkgZGVrbGluaWVydCB1bmQgdm9yIGRlbiBOYW1lbiBnZXNldHp0LCB3aXJrZW4KKyAgICAgYWxzbyBhbHMgQXVmemFlaGx1bmcgdm9uIEFkamVrdGl2ZW4gdm9yIGRlbSBOYW1lbi4KKworICAgICBEaWUgaGllciBhbmdlZ2ViZW5lbiBBZGpla3RpdmUgZGllbmVuIG51ciB6dXIgQXVzZ2FiZSEgU29sbCBzaWNoIGRhcworICAgICBPYmpla3QgYXVjaCB1ZWJlciBBZGpla3RpdmUgYW5zcHJlY2hlbiBsYXNzZW4sIG11c3MgbWFuIGRpZXNlIG1pdAorICAgICBBZGRBZGplY3RpdmUoKSB1ZWJlcmdlYmVuLgorCisgICAgIFNvbGwgZGFzIE9iamVrdCBudXIgZWluIGVpbnplbG5lcyBOYW1lbnNhZGpla3RpdiBiZXNpdHplbiwga2FubiBtYW4gZGVtCisgICAgIFNldFByb3AoKS1BdWZydWYgYXVjaCBlaW5lbiBTdHJpbmcgdWViZXJnZWJlbjsgZ2VzcGVpY2hlcnQgd2lyZCBkaWUKKyAgICAgUHJvcGVydHkgYWJlciBpbiBqZWRlbSBGYWxsIGFscyBBcnJheS4KKworICAgICBXZW5uIGVpbiBBZGpla3RpdiB1bnJlZ2VsbWFlc3NpZyBpc3QsIGthbm4gbWFuIGRpZSB2aWVyIEZhZWxsZSBhdWNoCisgICAgIGFscyBBcnJheSB1ZWJlcmdlYmVuLiBNYW4gbXVzcyBkYW5uIGFiZXIgQXJyYXlzIHNjaGFjaHRlbG4sIGRhbWl0IHZvbiBkZW4KKyAgICAgbWVocmZhY2hlbiBBZGpla3RpdmVuIHVudGVyc2NoaWVkZW4gd2VyZGVuIGthbm4uCisJCitCRUlTUElFTEU6CisgICAgIFNldFByb3AoUF9OQU1FLCAiSHV0Iik7CisgICAgIFNldFByb3AoUF9OQU1FX0FESiwgImFsdCIpOworCisgICAgIG5hbWUoV0VTU0VOLDEpICAgICAgPT4gImRlcyBhbHRlbiBIdXRzIgorCisKKyAgICAgLy8gWndlaSBBZGpla3RpdmUsIGdsZWljaHJhbmdpZyB6dSBTdWJzdGFudGl2CisgICAgIFNldFByb3AoUF9OQU1FX0FESiwgKHsiYWx0IiwgImdhbW1lbGlnIn0pKTsKKworICAgICBuYW1lKFdFU1NFTiwxKSAgICAgID0+ICJkZXMgYWx0ZW4sIGdhbW1lbGlnZW4gSHV0cyIKKworCisgICAgIC8vIFp3ZWkgQWRqZWt0aXZlLCBlcnN0ZXMgaXN0IEF0dHJpYnV0IHp1IHp3ZWl0ZW0KKyAgICAgZmFsc2NoOiAgU2V0UHJvcChQX05BTUVfQURKLCAoeyJncnVlbiIsICJnZXN0cmVpZnQifSkpOworICAgICAgICAgICAgICBuYW1lKFdFU1NFTiwxKSAgICAgID0+ICJkZXMgZ3J1ZW5lbiwgZ2VzdHJlaWZ0ZW4gSHV0cyIKKyAgICAgcmljaHRpZzogU2V0UHJvcChQX05BTUVfQURKLCAoeyJncnVlbiBnZXN0cmVpZnQifSkpOworICAgICAgICAgICAgICBuYW1lKFdFU1NFTiwxKSAgICAgID0+ICJkZXMgZ3J1ZW4gZ2VzdHJlaWZ0ZW4gSHV0cyIKKworICAgICAvLyBVbnJlZ2VsbWFlc3NpZ2VzIEFkamVrdGl2CisgICAgIFNldFByb3AoIFBfTkFNRV9BREosKHsoeyJyb3NhIiwicm9zYSIsInJvc2EiLCJyb3NhIn0pfSk7CisgICAgICAgICAgICAgIG5hbWUoV0VTU0VOLDEpICAgICAgICAgPT4gImRlcyByb3NhIEh1dHMiCisgICAgIC8vIE9obmUgaW5uZXJlcyBBcnJheSBoYWV0dGUgbWFuIDQgbWFsIHJvc2EgYWxzIEFkamVrdGl2CisgICAgIC8vID0+ICJkZXMgcm9zYWVuLCByb3NhZW4sIHJvc2Flbiwgcm9zYWVuIEh1dHMiCisKK1NJRUhFIEFVQ0g6CisgICAgIC9zdGQvdGhpbmcvZGVzY3JpcHRpb24uYywgbmFtZSgpLCBQX05BTUUsIERlY2xBZGooKQorCisyMy5BcHJpbCAyMDA3IFJ1bWF0YQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfTkVFREVEX1FQIGIvZG9jL3Byb3BzL1BfTkVFREVEX1FQCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzOGY5ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9ORUVERURfUVAKQEAgLTAsMCArMSwxNSBAQAorTkFNRToKKyAgICBQX05FRURFRF9RUCAgICAgICAgICAgICAgICAgICAibmVlZGVkX3FwIiAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcGxheWVyL2Jhc2UuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIEFQcywgZGllIG1hbiBmdWVyIGRlbiBTZWhlcnN0YXR1cyBicmF1Y2h0CisKKyAgICAgRGllc2UgUHJvcGVydHkgaXN0IG1pdHRsZXJ3ZWlsZSBvYnNvbGV0LiBEaWUKKyAgICAgYWt0dWVsbCBnZWx0ZW5kZW4gU2VoZXItQW5mb3JkZXJ1bmdlbiBzdGVoZW4gaW4KKyAgICAgL3NlY3VyZS9sZXBtYXN0ZXIuaAorCitMRVRaVEUgQUVOREVSVU5HOgorICAgICAyMDA2LTA5LTMwLCBab29rLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX05FVERFQURfRU5WIGIvZG9jL3Byb3BzL1BfTkVUREVBRF9FTlYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJkNjMxNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX05FVERFQURfRU5WCkBAIC0wLDAgKzEsMjQgQEAKK05BTUU6CisgICAgUF9ORVRERUFEX0VOViAgICAgICAgICAgICAgICAgICJuZXRkZWFkX2VudiIKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcGxheWVyL2Jhc2UuaAorCitCRVNDSFJFSUJVTkc6CisgICAgRGllc2UgUHJvcGVydHkga2FubiBpbiBuZXR6dG90ZW4gU3BpZWxlcm4gYWJnZWZyYWd0IHdlcmRlbiwKKwkJdW0gaGVyYXVzenVmaW5kZW4sIGluIHdlbGNoZW0gUmF1bSBzaWUgbmV0enRvdCBnZXdvcmRlbiBzaW5kLgorCisJCUVzIHdpcmQgZGVyIHNlbGJlIFdlcnQgenVydWVja2dlZ2ViZW4sIGRlbiBkaWUgTXVkbGliIGJlbnV0emVuCisJCXd1ZXJkZSwgdW0gZGllIFNwaWVsZXIgYmVpbSByZWNvbm5lY3Qgd2llZGVyIGFuIGRlbiByaWNodGlnZW4KKwkJb3J0IHp1IGJyaW5nZW4uIERhcyBpc3Qgbm9ybWFsZXJ3ZWlzZSBkYXMgUmF1bW9iamVrdCBvZGVyIGRlcgorCQlEYXRlaW5hbWUgZGVzIFJhdW1zICh6dW0gQmVpc3BpZWwgc28gZGllc2VyIGVpbiBjbG9uZSB3YXIpLgorCisJCUJlaSBuaWNodCBuZXR6dG90ZW4gU3BpZWxlcm4gd2lyZCAwIHp1cnVlY2tnZWdlYmVuLgorCitCRU1FUktVTkdFTjoKKyAgICBEaWVzZSBQcm9wZXJ0eSBpc3QgcmVhZC1vbmx5LgorCitTSUVIRSBBVUNIOgorICAgIFBfTkVUREVBRF9JTkZPCisKKzIwMDktMDgtMDQgUnVtYXRhCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9ORVRERUFEX0lORk8gYi9kb2MvcHJvcHMvUF9ORVRERUFEX0lORk8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNjMzZmZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX05FVERFQURfSU5GTwpAQCAtMCwwICsxLDkxIEBACitOQU1FOgorICAgIFBfTkVUREVBRF9JTkZPICAgICAgICAgICAgICAgICJuZXRkZWFkX2luZm8iICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9wbGF5ZXIuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIFdpcmQgaW0gUmF1bSBYIGdlc2V0enQgdW5kIHdpcmt0IG51ciwgZmFsbHMgZGllc2VyIFJhdW0gZWluICcjJyBpbQorICAgICBvYmplY3RfbmFtZSgpIGhhdCAobm9ybWFsZSBDbG9uZXMsIHpCICIvcm9vbS92b2lkIzEwMTUzMDE4IikuCisgICAgIAorICAgICBCZWkgRWluc2NobGFmZW4gZWluZXMgU3BpZWxlcnMgaW4gZGllc2VtIFJhdW0gd2VyZGVuIGRpZSBXZXJ0ZSBhdXMKKyAgICAgZGVyIFByb3BlcnR5IGltIFNwaWVsZXIgZ2VzcGVpY2hlcnQgKE5ldHp0b3RlbmluZm9ybWF0aW9uZW4pLgorCisgICAgIElzdCBiZWltIEF1ZndhY2hlbiBkZXMgU3BpZWxlcnMgZGFzIFJhdW1vYmpla3QgWCB6ZXJzdG9lcnQgd29yZGVuLCBkYW5uCisgICAgIHdpcmQgYmVpIGRlciBCbHVlcHJpbnQgdm9uIFggcGVyIFNldFByb3AoKSBkaWUgZ2VzcGVpY2hlcnRlIEluZm9ybWF0aW9uCisgICAgIGdlc2V0enQuIERlciBSdWVja2dhYmV3ZXJ0IGRlcyBTZXRQcm9wIHdpcmQgYWxzIFBmYWQgenUgZWluZW0gQXVzd2VpY2gtCisgICAgIEF1ZndhY2gtUmF1bSBpbnRlcnByZXRpZXJ0IHVuZCBkZXIgU3BpZWxlciB3aXJkIGluIGRlbSBGYWxsIGRvcnRoaW4KKyAgICAgYmV3ZWd0LgorCitCRU1FUktVTkdFTjoKKyAgICAgWnVtIENsb25lbiB2b24gUmFldW1lbiBzb2xsdGVuIFZpcnR1YWwgQ29tcGlsZXIgYmVudXR6dCB3ZXJkZW46CisgICAgIFdpcmQgaW4gZGVuIGVyemV1Z3RlbiBPYmpla3RuYW1lbiBLRUlOICcjJyB2ZXJ3ZW5kZXQsIGRhbm4gaXN0IGRpZXNlCisgICAgIFByb3BlcnR5IG5pY2h0IHNpbm52b2xsIHVuZCB3aXJkIG5pY2h0IHZlcndlbmRldC4gRWluIG9yZGVudGxpY2hlcgorICAgICBWQyBrYW5uIEJld2VnZW4gZWluZXMgU3BpZWxlcnMgaW4gZGVzc2VuIGFsdGVuLCBuaWNodCBtZWhyIGV4aXN0aWVyZW5kZW4KKyAgICAgUmF1bSBvZGVyIGVpbmVuIEVyc2F0enJhdW0gYmVpbSBBdWZ3YWNoZW4gc2VsYnN0IGxvZXNlbi4KKworQkVJU1BJRUxFOgorICAgICAvLyAjMTogZ2VjbG9udGVyIFJhdW0gbWl0IEF1c3dlaWNoLUF1ZndhY2hyYXVtOiBLbGVydXMtR2lsZGUKKyAgICAgI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyAgICAgaW5oZXJpdCAiL3N0ZC9yb29tIjsKKyAgICAgCisgICAgIHZvaWQgY3JlYXRlKCkgeworICAgICAgIDo6Y3JlYXRlKCk7CisKKyAgICAgICBTZXRQcm9wKFBfTkVUREVBRF9JTkZPLCAiL2dpbGRlbi9rbGVydXMiKTsKKyAgICAgICBTZXRQcm9wKFBfTElHSFQsIDEpOworICAgICB9CisgICAgIAorICAgICAvLyAjMjoga29tcGxleGVyZXIgQmVpc3BpZWxyYXVtIGZ1ZXIgUF9ORVRERUFEX0lORk8tRnVua3Rpb25hbGl0YWV0CisgICAgIC8vIFNpZWhlIGF1Y2g6IC9kb2MvYmVpc3BpZWxlL3Rlc3RvYmpla3RlL25ldGRlYWRfaW5mb190ZXN0cmF1bS5jCisgICAgICNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisgICAgIGluaGVyaXQgIi9zdGQvcm9vbSI7CisKKyAgICAgdm9pZCBjcmVhdGUoKSB7CisgICAgICAgOjpjcmVhdGUoKTsKKworICAgICAgIGlmIChjbG9uZXAodGhpc19vYmplY3QoKSkpCisgICAgICAgICAvLyBzZXR6ZSBJbmZvcm1hdGlvbmVuLCBkaWUgaW0gTmV0enRvdGVuIGdlc3BlaWNoZXJ0IHdlcmRlbiBzb2xsZW4KKyAgICAgICAgIFNldChQX05FVERFQURfSU5GTywgcmFuZG9tKDUpKTsKKyAgICAgICBlbHNlCisgICAgICAgICAvLyBCbHVlcHJpbnQ6IGhpZXIga2FubiBtYW4genUgZWluZW0gQ2xvbmVyYXVtIGdlaGVuCisgICAgICAgICBBZGRFeGl0KCJjbG9uZXJhdW0iLCAjJ2NyZWF0ZV9yb29tKTsKKworICAgICAgIC8vIFNldC1NZXRob2QsIHVtIGRpZSBJbmZvcm1hdGlvbmVuIGF1cyBQX05FVERFQURfSU5GTyBiZWltIEF1ZndhY2hlbgorICAgICAgIC8vIGluIGRlciBCbHVlcHJpbnQgYXVzd2VydGVuIHp1IGtvZW5uZW4KKyAgICAgICBTZXQoUF9ORVRERUFEX0lORk8sICMnY3JlYXRlX2Rlc3RpbnksIEZfU0VUX01FVEhPRCk7CisgICAgICAgU2V0UHJvcChQX0xJR0hULCAxKTsKKyAgICAgfQorICAgICAKKyAgICAgLy8gUmF1bSBlbnRmZXJuZW4sIG5vcm1hbGVyd2Vpc2Ugc28gS0VJTkUgR1VURSBJREVFIQorICAgICB2b2lkIEJlY29tZXNOZXREZWFkKG9iamVjdCBwbCkgeworICAgICAgIGNhbGxfb3V0KCMncmVtb3ZlLCAzMCk7CisgICAgIH0KKworICAgICAvLyBlcnpldWdlIGVpbmVuIENsb25lcmF1bSB1bmQgYmV3ZWdlIGRlbiBTcGllbGVyIGRhaGluCisgICAgIGludCBjcmVhdGVfcm9vbShzdHJpbmcgZGlyKSB7CisgICAgICAgb2JqZWN0IGRlc3QgPSBjbG9uZV9vYmplY3Qob2JqZWN0X25hbWUodGhpc19vYmplY3QoKSkpOworICAgICAgIHRoaXNfcGxheWVyKCktPm1vdmUoZGVzdCwgTV9OT0NIRUNLKTsKKyAgICAgICByZXR1cm4gMTsKKyAgICAgfQorICAgICAKKyAgICAgLy8gU2V0LU1ldGhvZCBmdWVyIFBfTkVUREVBRF9JTkZPOiBnaWJ0IFBmYWQgenVydWVjaworICAgICAvLyBiZW51dHplIGRpZSBJbmZvcm1hdGlvbmVuIGF1cyBkZW0gamV0enQgYXVmd2FjaGVuZGVuIE5ldHp0b3RlbiwgdW0KKyAgICAgLy8gZWluZW4gYWx0ZXJuYXRpdmVuIEF1ZndhY2hyYXVtIHp1IGVybWl0dGVsbiwgZGEgZGVyIEVpbnNjaGxhZnJhdW0KKyAgICAgLy8gemVyc3RvZXJ0IGlzdAorICAgICBzdHJpbmcgY3JlYXRlX2Rlc3RpbnkobWl4ZWQgdmFsKSB7CisgICAgICAgaWYgKGludHAodmFsKSkgeworICAgICAgICAgc3dpdGNoICh2YWwpIHsKKyAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgIHJldHVybiAiL2QvZWJlbmUvcm9vbS9Qb3J0VmFpbi9wb19oYWYxIjsKKyAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgIHJldHVybiAiL2dpbGRlbi9rbGVydXMiOworICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgcmV0dXJuICIvZ2lsZGVuL2thcmF0ZSI7CisgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICB9CisgICAgICAgICByZXR1cm4gIi9kL2ViZW5lL3Jvb20vd2FsZHdlZzQiOworICAgICAgIH0KKyAgICAgfQorCisyLiBKYW4gMjAxMiBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfTkVWRVJEUk9QIGIvZG9jL3Byb3BzL1BfTkVWRVJEUk9QCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMzY0Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9ORVZFUkRST1AKQEAgLTAsMCArMSwyOSBAQAorTkFNRToKKwlQX05FVkVSRFJPUAkJCSJuZXZlcmRyb3AiCisKK0RFRklOSUVSVCBJTjoKKwkvc3lzL3RoaW5nL21vdmluZy5oCisKK0JFU0NIUkVJQlVORzoKKwlPYmpla3RlLCB3ZWxjaGUgZGllc2UgUHJvcGVydHkgZ2VzZXR6dCBoYWJlbiwgd2VyZGVuIGJlaW0gVG9kIGVpbmVzCisJTGViZXdlc2VucyBuaWNodCBhdXRvbWF0aXNjaCBpbiBkaWUgTGVpY2hlIG9kZXIgaW4gZGVuIHVtZ2ViZW5kZW4KKwlSYXVtICh6LkIuIGJlaSBiZWkgZ2VzZXR6dGVtIFBfTk9DT1JQU0UpIHRyYW5zcG9ydGllcnQuCisKK0JFTUVSS1VOR0VOOgorCVNvbGwgZGFzIE9iamVrdCB2b20gTGViZXdlc2VuIG5pY2h0IHdlZ2dlbGVndCB3ZXJkZW4ga29lbm5lbiwgc28gaXN0CisJZGllIFByb3BlcnR5IFBfTk9EUk9QIHp1IHZlcndlbmRlbi4KKwlCZWlkZSBQcm9wZXJ0aWVzIHp1c2FtbWVuIHN0ZWxsZW4gc2ljaGVyLCBkYXNzIGVpbiBPYmpla3QgbmljaHQKKwl3ZWl0ZXJnZWdlYmVuIHdlcmRlbiBrYW5uLgorCitCRUlTUElFTEU6CisJRWluZSBkYXVlcmhhZnRlIEJlbG9obnVuZywgZGllIGF1Y2ggYmVpbSBUb2QgZGVzIFNwaWVsZXJzIGJlaSBpaG0KKwl2ZXJibGVpYmVuIHNvbGwsIHNldHp0IGRhcyBzbzoKKwkgIFNldFByb3AoUF9ORVZFUkRST1AsMSk7CisJU29sbGVuIGF1Y2ggUmVib290cyB1ZWJlcnN0YW5kZW4gd2VyZGVuLCBpc3QgenVzYWV0emxpY2gKKwlQX0FVVE9MT0FET0JKIHp1IHNldHplbi4KKworU0lFSEUgQVVDSDoKKwlQX05PRFJPUCwgUF9OT0dFVCwgUF9OT0NPUlBTRSwgUF9BVVRPTE9BRE9CSiwgL3N0ZC9saXZpbmcvbGlmZS5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFRodSBKdW4gMTQgMjI6MjY6MjkgMjAwMSBieSBQYXRyeW4KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX05FVkVSX0NMRUFOIGIvZG9jL3Byb3BzL1BfTkVWRVJfQ0xFQU4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE4NDgyMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX05FVkVSX0NMRUFOCkBAIC0wLDAgKzEsMzUgQEAKK05BTUU6CisJUF9ORVZFUl9DTEVBTgkJCSIgbmV2ZXIgY2xlYW4gIiAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorCS9zeXMvcm9vbXMuaAorCitCRVNDSFJFSUJVTkc6CisJTm9ybWFsZXJ3ZWlzZSB3aXJkIGVpbiBSYXVtIG5hY2ggMiBSZXNldHMgemVyc3RvZXJ0LCB3ZW5uIGVyIHdhZXJlbmQKKwlkaWVzZXIgWmVpdCB2b24ga2VpbmVtIExlYmV3ZXNlbiBiZXRyZXRlbiB3dXJkZSB1bmQgd2VubgorCWtlaW5lIFJFRlJFU0hfTk9ORS0gb2RlciBSRUZSRVNIX0RFU1RSVUNULU9iamVrdGUgZXhpc3RpZXJlbiwgZGllCisJbmljaHQgbWVociBpbSBSYXVtIHZvcmhhbmRlbiBzaW5kLgorCU1pdCBkaWVzZXIgUHJvcGVydHkga2FubiBtYW4gZGVuIHNvZ2VuYW5udGVuIENsZWFuLVVwIHVudGVyYmluZGVuLgorCitCRUlTUElFTDoKKwlEZXIgZm9sZ2VuZGUgUmF1bSB3aXJkIG5pY2h0IG1laHIgemVyc3RvZXJ0LCB3ZW5uIGVyIGVpbm1hbCBnZWxhZGVuCisJd3VyZGU6CisJICAjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCSAgLy8gI2luY2x1ZGUgPHJvb21zLmg+IC4uLiB3aXJkIHNjaG9uIHZvbiBwcm9wZXJ0aWVzLmggaW5jbHVkZWQhCisJICBpbmhlcml0ICJzdGQvcm9vbSI7CisJICB2b2lkIGNyZWF0ZSgpCisJICB7IDo6Y3JlYXRlKCk7CisJICAgIFNldFByb3AoUF9TSE9SVCwiRWluIHRvbGxlciBSYXVtIik7CisJICAgIC4uLgorCSAgICBTZXRQcm9wKFBfTkVWRVJfQ0xFQU4sMSk7CisJICAgIC4uLgorCSAgfQorCU1hbiBzb2xsdGUgZGllIEFud2VuZHVuZyBuaWNodCB1ZWJlcnRyZWliZW4hIFdpY2h0aWcgaXN0IGRpZXNlCisJRnVua3Rpb24genVtIEJlaXNwaWVsIGZ1ZXIgUmFldW1lLCBkaWUgZ2xlaWNoemVpdGlnIE1hc3Rlcm9iamVrdGUKKwlkYXJzdGVsbGVuLgorCitTSUVIRSBBVUNIOgorCS9zdGQvcm9vbS5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFdlZCBGZWIgIDMgMDA6NTQ6MzIgMTk5OSBieSBQYXRyeW4KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX05FV1NLSUxMUyBiL2RvYy9wcm9wcy9QX05FV1NLSUxMUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmJhMWZmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfTkVXU0tJTExTCkBAIC0wLDAgKzEsMjAgQEAKK05BTUU6CisJUF9ORVdTS0lMTFMJCQkibmV3c2tpbGxzIiAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorCS9zeXMvbmV3X3NraWxscy5oCisKK0JFU0NIUkVJQlVORzoKKwlJbiBkaWVzZXIgUHJvcGVydHkgc2luZCBzYWVtdGxpY2hlIFNraWxscyB1bmQgU3BlbGxzIHZlcm1lcmt0LCBkaWUKKwlkYXMgTGViZXdlc2VuIGtlbm50LgorCitCRU1FUktVTkdFTjoKKwlNYW4gc29sbHRlIGRpZXNlIFByb3BlcnR5IG5pY2h0IHBlciBIYW5kIHZlcmFlbmRlcm4sIHNvbmRlcm4gZGllCisJRnVua3Rpb25lbiB2b24gIi9zdGQvbGl2aW5nL3NraWxscy5jIiBudXR6ZW4uCisKK1NJRUhFIEFVQ0g6CisJTW9kaWZ5U2tpbGwoKSwgTGVhcm5Ta2lsbCgpLCBVc2VTa2lsbCgpLCAvc3RkL2xpdmluZy9za2lsbHMuYywKKwlQX0dVSUxEX1NLSUxMUywgUF9TQl9TUEVMTFMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogV2VkIEphbiAxNCAxOToxNzowNiAxOTk4IGJ5IFBhdHJ5bgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfTkVYVF9ERUFUSF9TRVFVRU5DRSBiL2RvYy9wcm9wcy9QX05FWFRfREVBVEhfU0VRVUVOQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFlN2U3YQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX05FWFRfREVBVEhfU0VRVUVOQ0UKQEAgLTAsMCArMSw0OCBAQAorUF9ORVhUX0RFQVRIX1NFUVVFTkNFCisKK05BTUU6CisgICAgIFBfTkVYVF9ERUFUSF9TRVFVRU5DRSAgICAgICAgICJwX2xpYl9uZXh0X2RlYXRoX3NlcXVlbmNlIgorCitERUZJTklFUlQgSU46CisgICAgIC9zeXMvbGl2aW5nL2NvbWJhdC5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgSW0gU3BpZWxlciBrYW5uIGRhbWl0IGRlc3NlbiBlaWdlbmUgVG9kZXNzZXF1ZW56IGZ1ZXIgZGVuIG5hZWNoc3RlbgorICAgICBUb2QgZmVzdGdlbGVndCB3ZXJkZW4uIE5hY2ggZWluZW0gVG9kIChlZ2FsIHdlbGNoZSBUb2Rlc3NlcXVlbnoKKyAgICAgZ2V3YWVobHQgd3VyZGUpIHdpcmQgZGllIFByb3BlcnR5IGdlbG9lc2NodCB1bmQgbXVlc3N0ZSBuZXUgZ2VzZXR6dAorICAgICB3ZXJkZW4uCisKKyAgICAgRXMgZ2lidCBmb2xnZW5kZSBndWVsdGlnZSBXZXJ0ZToKKyAgICAgLSBzdHJpbmc6IFBmYWQgenUgZWluZXIgZWlnZW5lbiBUb2Rlc3NlcXVlbnogaW0gZ3VlbHRpZ2VuIEZvcm1hdAorICAgICAtIG1peGVkKiAgRWluZSBUb2Rlc3NlcXVlbnogaW0gRm9ybWF0IGRlcyBUb2Rlc3JhdW1lczoKKyAgICAgICAgICAgICAgICh7PGludCBnZXNhbXRsYWVuZ2U+LAorICAgICAgICAgICAgICAgICAoWzxpbnQgaW5kZXgxPjogPHN0cmluZyB1bWdlYnJvY2hlbmUgTWVsZHVuZzE+LAorICAgICAgICAgICAgICAgICAgIDxpbnQgaW5kZXgyPjogPHN0cmluZyB1bWdlYnJvY2hlbmUgTWVsZHVuZzI+LAorICAgICAgICAgICAgICAgICAgIC4uLl0pCisgICAgICAgICAgICAgICB9KQorICAgICAtIG1hcHBpbmcgSW4gZGllIFN0YW5kYXJkLUxhcnMtVG9kZXNzZXF1ZW56IGVpbnp1ZnVlZ2VuZGUgWmVpbGVuOgorICAgICAgICAgICAgICAgKFs8aW50IHplaXRpbmRleD46IDxzdHJpbmcgdW1nZWJyb2NoZW5lciBUZXh0Pl0pCisKK0JFTUVSS1VOR0VOOgorICAgICBFaW5lIFRvZGVzc2VxdWVueiBlaW5lcyBHZWduZXJzLCBmZXN0Z2VsZWd0IHVlYmVyCisgICAgIFBfRU5FTVlfREVBVEhfU0VRVUVOQ0UgaGF0IFZvcnJhbmcgdm9yIGRpZXNlciBQcm9wZXJ0eS4KKworQkVJU1BJRUxFOgorICAgICAvLyBQZmFkIHp1IGVpbmVyIGVpZ2VuZW4gRFNRCisgICAgIFNldFByb3AoUF9ORVhUX0RFQVRIX1NFUVVFTkNFLCAgIi4uLi9wYXNzZW5kZV9kc3EudHh0Iik7CisKKyAgICAgLy8gZWlnZW5lIERTUSBpbSBUb2Rlc3JhdW1mb3JtYXQ6CisgICAgIFNldFByb3AoUF9ORVhUX0RFQVRIX1NFUVVFTkNFLAorICAgICAgICAgICAgICh7IDIsIChbMTogIkRlciBUb2QgZW50bGFlc3N0IGRpY2ggZWlsaWcuXG4iXSl9KSk7CisKKyAgICAgLy8gRWluZnVlZ2VuIGVpbmVyIE1lbGR1bmcgaW4gZGllIFN0YW5kYXJkLVRvZGVzc2VxdWVuegorICAgICBTZXRQcm9wKFBfTkVYVF9ERUFUSF9TRVFVRU5DRSwKKyAgICAgICAgICAgICAoWzU6ICJEdSBmdWVobHN0IGRpY2ggZXR3YXMgZGFlbWxpY2guXG4iXSkpOworCitTSUVIRSBBVUNIOgorICAgICBUb2Q6ICAgICAgICAgICAgZGllKEwpCisgICAgIFRvZGVzbWVsZHVuZ2VuOiBQX0tJTExfTkFNRSwgUF9LSUxMX01TRywgUF9ESUVfTVNHLCBQX01VUkRFUl9NU0cKKyAgICAgICAgICAgICAgICAgICAgIFBfWkFQX01TRywgUF9FTkVNWV9ERUFUSF9TRVFVRU5DRQorICAgICBTb25zdGlnZXM6ICAgICAgUF9DT1JQU0UsIFBfTk9DT1JQU0UsIC9yb29tL2RlYXRoL2RlYXRoX3Jvb20uYworCisxMC4gTm92IDIwMTEgR2xvaW5zb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9ORVhUX0RJU0FCTEVfQVRUQUNLIGIvZG9jL3Byb3BzL1BfTkVYVF9ESVNBQkxFX0FUVEFDSwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDE5YWM2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfTkVYVF9ESVNBQkxFX0FUVEFDSwpAQCAtMCwwICsxLDMxIEBACitQUk9QRVJUWQorICBQX05FWFRfRElTQUJMRV9BVFRBQ0sgICAgIm5leHRfZGlhYmxlX2F0dGFjayIKKworREVGSU5JRVJUIElOIAorICBjb21iYXQuaAorCitCRVNDSFJFSUJVTkcKKyAgRGllc2UgUHJvcGVydHkgZ2lidCBhbiwgd2FubiBkZXIgTlBDIGRhcyBuYWVjaHN0ZSBNYWwgcGFyYWx5c2llcnQKKyAgd2VyZGVuIGthbm4uIFVlYmxpY2hlcndlaXNlIHdpcmQgc2llIGF1dG9tYXRpc2NoIGJlaW0gU2V0emVuCisgIHZvbiBQX0RJU0FCTEVfQVRUQUNLIGdlc2V0enQuIFNpZSBnaWJ0IGVpbmVuIFplaXRwdW5rdCB3aWUKKyAgZGllIEZ1bmt0aW9uIHRpbWUoKSBhbiwgYW4gZGVtIHp1bSBlcnN0ZW4gTWFsIHdpZWRlciBQYXJhbHlzZQorICBtb2VnbGljaCBpc3QuCisKKyAgV2lsbCBtYW4gZWluZW4gTlBDIHNjaHJlaWJlbiwgZGVyIGltbWVyIHBhcmFseXNpZXJiYXIgaXN0IHVuZCBuaWNodCBlcnN0CisgIG5hY2ggZWluZXIgZ2V3aXNzZW4gV2FydGV6ZWl0IG5hY2ggZGVyIGxldHp0ZW4gUGFyYWx5c2UsIGxhZXNzdCBzaWNoIGRpZXMKKyAgZHVyY2ggZWluZSBTZXQtTWV0aG9kZSBhdWYgUF9ORVhUX0RJU0FCTEVfQVRUQUNLIGVycmVpY2hlbjoKKyAgICAKKyAgU2V0KFBfTkVYVF9ESVNBQkxFX0FUVEFDSywgZnVuY3Rpb24gaW50ICgpIHtyZXR1cm4gMDt9LCBGX1NFVF9NRVRIT0QpOworCisgIERpZXNlIFNldC1NZXRob2RlIHZlcmhpbmRlcnQgZGFzIFNldHplbiB2b24gUF9ORVhUX0RJU0FCTEVfQVRUQUNLIG1pdHRlbHMKKyAgZWluZXMgU2V0UHJvcC1BdWZydWZlcy4KKworQkVNRVJLVU5HRU46CisgIERpZSBaZWl0IHp1bSBTY2h1dHogdm9yIGVybmV1dGVyIFBhcmFseXNlIGV4aXN0aWVydCBhYnNpY2h0bGljaC4gQml0dGUKKyAgd2FlZ3Qgc29yZ2ZhZWx0aWcgYWIsIGJldm9yIGlociBkaWVzZSBQcm9wZXJ0eSBhbiBHZWduZXJuL1NwaWVsZXJuCisgIG1hbmlwdWxpZXJ0LgorCitTSUVIRSBBVUNIOgorICBQX0RJU0FCTEVfQVRUQUNLCisKKzIxLkp1bCAyMDE0IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9OT0JVWSBiL2RvYy9wcm9wcy9QX05PQlVZCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MWJiYmEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9OT0JVWQpAQCAtMCwwICsxLDEwIEBACitOQU1FOgorICAgIFBfTk9CVVkgICAgICAgICAgICAgICAgICAgICAgICJub2J1eSIgICAgICAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9wcm9wZXJ0aWVzLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBXZW5uIGRpZXNlIFByb3BlcnR5IGdlc2V0enQgaXN0LCB3aXJkIGRhcyBPYmpla3QgbmFjaCBlaW5lbQorICAgICBWZXJrYXVmIGltIExhZGVuIHplcnN0b2VydCwgZGFtaXQgZXMgbmljaHQgd2llZGVyIHZvbiBlaW5lbSBTcGllbGVyCisgICAgIGdla2F1ZnQgd2VyZGVuIGthbm4uCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9OT0NPUlBTRSBiL2RvYy9wcm9wcy9QX05PQ09SUFNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5OTM5MWEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9OT0NPUlBTRQpAQCAtMCwwICsxLDMwIEBACitOQU1FOgorCVBfTk9DT1JQU0UJCQkibm9jb3Jwc2UiCisKK0RFRklOSUVSVCBJTjoKKwkvc3lzL3Byb3BlcnRpZXMuaAorCitCRVNDSFJFSUJVTkc6CisJRGllc2UgUHJvcGVydHkgaXN0IGdlc2V0enQsIHdlbm4gaW0gVG9kZXNmYWxsIGtlaW4gTGVpY2huYW0KKwlhdXRvbWF0aXNjaCBlcnpldWd0IHdlcmRlbiBzb2xsLgorCitCRU1FUktVTkdFTjoKKwlJbiBkaWVzZW0gRmFsbCB3aXJkIGRpZSBQcm9wZXJ0eSBQX0NPUlBTRSBpZ25vcmllcnQsIG1pdCBkZXIgbWFuCisJZWluIHNwZXppZWxsZXMgTGVpY2hlbm9iamVrdCBhbmdlYmVuIGthbm4sIHNvZmVybiBuaWNodCBkaWUKKwlTdGFuZGFyZGxlaWNoZSAiL3N0ZC9jb3Jwc2UuYyIgdmVyd2VuZGV0IHdlcmRlbiBzb2xsLgorCURhIGRpZSBNb2VyZGVybWVsZHVuZ2VuIHVlYmVyIGViZW5kaWVzZSBPYmpla3QgbGF1ZmVuLCB3ZXJkZW4KKwloaWVyYmVpIGF1Y2gga2VpbmUgYXVzZ2VnZWJlbi4KKworQkVJU1BJRUxFOgorCURhcyBMZWJld2VzZW4gc29sbCBrZWluZSBMZWljaGUgaGludGVybGFzc2VuLCB3ZWlsIGVzIHp1IFN0YXViCisJemVyZmFlbGx0OgorCSAgU2V0UHJvcChQX0RJRV9NU0csIiB6ZXJmYWVsbHQgenUgU3RhdWIhXG4iKTsKKwkgIFNldFByb3AoUF9OT0NPUlBTRSwxKQorCUVzIHd1cmRlIGF1Y2ggZ2xlaWNoIGRpZSBTdGVyYmVtZWxkdW5nIGRlbWVudHNwcmVjaGVuZCBnZXNldHp0LgorCitTSUVIRSBBVUNIOgorCVBfQ09SUFNFLCBQX1pBUF9NU0csIFBfRElFX01TRywgUF9NVVJERVJfTVNHLCBQX0tJTExfTVNHLAorCVBfTkVWRVJEUk9QLCAvc3RkL2NvcnBzZS5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFRodSBKdW4gMTQgMjI6MjY6MjkgMjAwMSBieSBQYXRyeW4KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX05PRFJJTktfTVNHIGIvZG9jL3Byb3BzL1BfTk9EUklOS19NU0cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y4NDdjNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX05PRFJJTktfTVNHCkBAIC0wLDAgKzEsMjUgQEAKK05BTUU6CisgICAgIFBfTk9EUklOS19NU0cgICAgICAgICAgICAgICAgICJzdGRfZm9vZF9ub2RyaW5rX21zZyIKKworREVGSU5JRVJUIElOOgorICAgICA8c3lzL2Zvb2QuaD4KKworQkVTQ0hSRUlCVU5HOgorICAgICBNZWxkdW5nIGFuIGRlbiBLb25zdW1lbnRlbiwgd2VubiB2ZXJzdWNodCB3aXJkLCBlaW4gTmljaHQtR2V0cmFlbmsKKyAgICAgenUgdHJpbmtlbi4gU29iYWxkIGVpbmUgU3BlaXNlIGVpbmVuIFdlcnQgaW4gUF9GT09EIHNldHp0LCBnaWx0IGVzIGFscworICAgICBOaWNodC1HZXRyYWVuay4KKyAgICAgCitCRU1FUktVTkdFTjoKKyAgICAgRGllc2UgTWVsZHVuZyB3aXJkIHZvbiByZXBsYWNlX3BlcnNvbmFsIG1pdCBkZW4gQXJndW1lbnRlbjoKKyAgICAgMS4gU3BlaXNlCisgICAgIDIuIEtvbnN1bWVudAorICAgICB2ZXJhcmJlaXRldCwga2FubiBhbHMgZW50c3ByZWNoZW5kZSBQbGF0emhhbHRlciBlbnRoYWx0ZW4KKyAgICAgCitERUZBVUxUOgorICAgICAiQFdFTjEga2FubiBtYW4gbmljaHQgdHJpbmtlbiEiCisKK1NJRUhFIEFVQ0g6CisgICAgIFBfRk9PRCwgUF9EUklOSywgd2l6L2Zvb2QsIHJlcGxhY2VfcGVyc29uYWwKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBUaHUgT2N0IDI4IDEyOjE1OjAwIDIwMTAgYnkgQ2FsZHJhClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfTk9EUk9QIGIvZG9jL3Byb3BzL1BfTk9EUk9QCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZWI1YjUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9OT0RST1AKQEAgLTAsMCArMSwzOSBAQAorTkFNRToKKwlQX05PRFJPUAkJCSJub2Ryb3AiICAgICAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisJL3N5cy90aGluZy9tb3ZpbmcuaAorCitCRVNDSFJFSUJVTkc6CisJSXN0IGRpZXNlIFByb3BlcnR5IGluIGVpbmVtIE9iamVrdCBnZXNldHp0LCBzbyBrYW5uIGVpbiBMZWJld2VzZW4KKwlkYXMgT2JqZWt0IG5pY2h0IHdlZ2xlZ2VuLgorCUFscyBTdGFuZGFyZG1lbGR1bmcga29tbXQgaW4gZGllc2VtIEZhbGwgYmVpc3BpZWxzd2Vpc2U6CisJICBEdSBrYW5uc3QgPE9iamVrdG5hbWU+IG5pY2h0IHdlZ3dlcmZlbiEKKwkgIER1IGthbm5zdCA8T2JqZWt0bmFtZT4gbmljaHQgd2VnZ2ViZW4uCisJTWFuIGthbm4gYXVjaCBlaW5lIGFsdGVybmF0aXZlIE1lbGR1bmcgYW5nZWJlbiwgd29iZWkgc2VsYnN0YWVuZGlnCisJYXVmIGVpbmVuIGtvcnJla3RlbiBaZWlsZW51bWJydWNoIHp1IGFjaHRlbiBpc3QuCisKK0JFTUVSS1VOR0VOOgorCVNvbGwgZWluIE9iamVrdCBiZWltIFRvZCBkZXMgTGViZXdlc2VucyBvZGVyIGJlaSBFbmRlIGVpbmVzIFNwaWVsZXJzCisJbmljaHQgaW4gZGVyIExlaWNoZSBiencuIGltIFJhdW0genVydWVja2dlbGFzc2VuIHdlcmRlbiwgc28gaXN0CisJZGllIFByb3BlcnR5IFBfTkVWRVJEUk9QIHp1IG51dHplbi4KKwlCZWlkZSBQcm9wZXJ0aWVzIHp1c2FtbWVuIHN0ZWxsZW4gc2ljaGVyLCBkYXNzIGVpbiBPYmpla3QgbmljaHQKKwl3ZWl0ZXJnZWdlYmVuIHdlcmRlbiBrYW5uLgorCitCRUlTUElFTEU6CisJRWluIHNjaHdlciB6dSBlcmthZW1wZmVuZGVyIERvbGNoIGtvZW5udGUgZm9sZ2VuZGVzIGJlaW5oYWx0ZW4sCisJdW0gbmljaHQgd2VpdGVyZ2VnZWJlbiB3ZXJkZW4genUga29lbm5lbjoKKwkgIFNldFByb3AoUF9OT0RST1AsMSk7CisJSW5mb3JtYXRpdmVyIGplZG9jaCBpc3QgZWluZSBlaWdlbmUgTWVsZHVuZzoKKwkgIFNldFByb3AoUF9OT0RST1AsCisJICJEZW4gRG9sY2ggaGFzdCBEdSBEaXIgaGFydCBlcmthZW1wZnQsIG5pY2h0IHdlZ3dlcmZlbiFcbiIpOworCitTSUVIRSBBVUNIOgorICAgICBBZWhubGljaGVzOiBQX05PR0VULCBQX05FVkVSRFJPUCwgUF9UT09fSEVBVllfTVNHLCBQX0VOVl9UT09fSEVBVllfTVNHLAorICAgICAgICAgICAgICAgICBQX1RPT19NQU5ZX01TRywgUF9OT0lOU0VSVF9NU0csIFBfTk9MRUFWRV9NU0csICAKKyAgICAgRXJmb2xnOiAgICAgUF9QSUNLX01TRywgUF9EUk9QX01TRywgUF9HSVZFX01TRywgUF9QVVRfTVNHLAorICAgICAgICAgICAgICAgICBQX1dFQVJfTVNHLCBQX1dJRUxEX01TRworICAgICBTb25zdGlnZXM6ICByZXBsYWNlX3BlcnNvbmFsKEUpLCAvc3RkL2xpdmluZy9wdXRfYW5kX2dldC5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFRodSBKdW4gMTQgMjI6MjY6MjkgMjAwMSBieSBQYXRyeW4KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX05PRk9PRF9NU0cgYi9kb2MvcHJvcHMvUF9OT0ZPT0RfTVNHCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNjdiN2MKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9OT0ZPT0RfTVNHCkBAIC0wLDAgKzEsMjUgQEAKK05BTUU6CisgICAgIFBfTk9GT09EX01TRyAgICAgICAgICAgICAgICAgICJzdGRfZm9vZF9ub2Zvb2RfbXNnIgorCitERUZJTklFUlQgSU46CisgICAgIDxzeXMvZm9vZC5oPgorCitCRVNDSFJFSUJVTkc6CisgICAgIE1lbGR1bmcgYW4gZGVuIEtvbnN1bWVudGVuLCB3ZW5uIHZlcnN1Y2h0IHdpcmQsIGVpbiBHZXRyYWVuayB6dSBlc3Nlbi4KKyAgICAgU29iYWxkIGVpbmUgU3BlaXNlIGtlaW5lbiBXZXJ0IGluIFBfRk9PRCB1bmQgZWluZW4gV2VydCBpbiBQX0RSSU5LCisgICAgIHNldHp0LCBnaWx0IGVzIGFscyBHZXRyYWVuay4KKyAgICAgCitCRU1FUktVTkdFTjoKKyAgICAgRGllc2UgTWVsZHVuZyB3aXJkIHZvbiByZXBsYWNlX3BlcnNvbmFsIG1pdCBkZW4gQXJndW1lbnRlbjoKKyAgICAgMS4gU3BlaXNlCisgICAgIDIuIEtvbnN1bWVudAorICAgICB2ZXJhcmJlaXRldCwga2FubiBhbHMgZW50c3ByZWNoZW5kZSBQbGF0emhhbHRlciBlbnRoYWx0ZW4KKyAgICAgCitERUZBVUxUOgorICAgICAiQFdFTjEga2FubiBtYW4gbmljaHQgZXNzZW4hIgorCitTSUVIRSBBVUNIOgorICAgICBQX0ZPT0QsIFBfRFJJTkssIHdpei9mb29kLCByZXBsYWNlX3BlcnNvbmFsCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogVGh1IE9jdCAyOCAxMjoxNTowMCAyMDEwIGJ5IENhbGRyYQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX05PR0VUIGIvZG9jL3Byb3BzL1BfTk9HRVQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYzZWQxZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX05PR0VUCkBAIC0wLDAgKzEsMzEgQEAKK05BTUU6CisJUF9OT0dFVAkJCQkibm9nZXQiCisKK0RFRklOSUVSVCBJTjoKKwkvc3lzL3RoaW5nL21vdmluZy5oCisKK0JFU0NIUkVJQlVORzoKKwlJc3QgZGllc2UgUHJvcGVydHkgaW4gZWluZW0gT2JqZWt0IGdlc2V0enQsIHNvIGthbm4gZWluIExlYmV3ZXNlbgorCWRhcyBPYmpla3QgbmljaHQgbmVobWVuLgorCUFscyBTdGFuZGFyZG1lbGR1bmcga29tbXQgaW4gZGllc2VtIEZhbGwgYmVpc3BpZWxzd2Vpc2U6CisJICBEdSBrYW5uc3QgPE9iamVrdG5hbWU+IG5pY2h0IG5laG1lbi4KKwkgIER1IGthbm5zdCA8T2JqZWt0bmFtZT4gc28gbmlyZ2VuZHdvIHJlaW5zdGVja2VuLgorCU1hbiBrYW5uIGF1Y2ggZWluZSBhbHRlcm5hdGl2ZSBNZWxkdW5nIGFuZ2ViZW4sIHdvYmVpIHNlbGJzdGFlbmRpZworCWF1ZiBlaW5lbiBrb3JyZWt0ZW4gWmVpbGVudW1icnVjaCB6dSBhY2h0ZW4gaXN0LgorCitCRUlTUElFTEU6CisJRWluIE9iamVrdCwgd2VsY2hlcyBmZXN0IGltIFJhdW0gdmVyYW5rZXJ0IGlzdCwga2FubiBuYXR1ZXJsaWNoCisJbmljaHQgZW50ZmVybnQgd2VyZGVuLCB6LkIuIGVpbiBhbmdlYnVuZGVuZXMgU2VpbDoKKwkgIFNldFByb3AoUF9OT0dFVCwiRGFzIFNlaWwgaXN0IGZlc3QgYW0gQmF1bSB2ZXJrbm90ZXQhXG4iKTsKKwlJbiBlaW5lbSBLb21tYW5kbyB6dW0gTG9za25vdGVuIGtvZW5udGUgbWFuIGRpZSBQcm9wZXJ0eSBkYW5uCisJbG9lc2NoZW4sIHVtIGVpbiBXZWduZWhtZW4genUgZXJtb2VnbGljaGVuLgorCitTSUVIRSBBVUNIOgorICAgICBBZWhubGljaGVzOiBQX05PRFJPUCwgUF9UT09fSEVBVllfTVNHLCBQX0VOVl9UT09fSEVBVllfTVNHLAorICAgICAgICAgICAgICAgICBQX1RPT19NQU5ZX01TRywgUF9OT0lOU0VSVF9NU0csIFBfTk9MRUFWRV9NU0cgCisgICAgIEVyZm9sZzogICAgIFBfUElDS19NU0csIFBfRFJPUF9NU0csIFBfR0lWRV9NU0csIFBfUFVUX01TRywKKyAgICAgICAgICAgICAgICAgUF9XRUFSX01TRywgUF9XSUVMRF9NU0cKKyAgICAgU29uc3RpZ2VzOiAgcmVwbGFjZV9wZXJzb25hbChFKSwgL3N0ZC9saXZpbmcvcHV0X2FuZF9nZXQuYworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBUaHUgSnVuIDE0IDIyOjI2OjI5IDIwMDEgYnkgUGF0cnluCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9OT0lOU0VSVF9NU0cgYi9kb2MvcHJvcHMvUF9OT0lOU0VSVF9NU0cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc5OTk0ZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX05PSU5TRVJUX01TRwpAQCAtMCwwICsxLDQ2IEBACitOQU1FOgorICAgIFBfTk9JTlNFUlRfTVNHICAgICAgICAgICAgICAgICAgICAgICJub2luc2VydF9tc2ciICAgICAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy90aGluZy9tb3ZpbmcuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIERpZXNlIFByb3BlcnR5IGVudGhhZWx0IGVpbmUgTWVsZHVuZywgZGllIGF1c2dlZ2ViZW4gd2lyZCwgd2VubgorICAgICBqZW1hbmQgdmVyc3VjaHQsIGVpbiBPYmpla3QgaW4gZWluZW4gQmVoYWVsdGVyIHp1IGJld2VnZW4gdW5kIGRlcgorICAgICBCZWhhZWx0ZXIgZGllc2VzIGltIFByZXZlbnRJbnNlcnQoKSB2ZXJoaW5kZXJ0LgorICAgICBEaWUgUHJvcGVydHkgaXN0IGltIFppZWxiZWhhZWx0ZXIgenUgc2V0emVuLgorICAgICBJc3QgZGllc2UgUHJvcGVydHkgbmljaHQgb2RlciBhdWYgZWluZW4gbmljaHQtU3RyaW5nLVdlcnQgZ2VzZXR6dCwKKyAgICAgc28gd2lyZCBkaWUgU3RhbmRhcmRtZWxkdW5nIGF1c2dlZ2ViZW4uCisgICAgICgiPE9iamVrdD4ga2FubnN0IER1IGRvcnQgbmljaHQgaGluZWluc3RlY2tlbi4iKQorICAgICBEZXIgU3RyaW5nIGluIGRlciBQcm9wZXJ0eSB3aXJkIG5vY2ggZHVyY2ggcmVwbGFjZV9wZXJzb25hbCgpCisgICAgIHZlcmFyYmVpdGV0LCBkYXMgenUgYmV3ZWdlbmRlIE9iamVrdCB3aXJkIGFscyBlcnN0ZXMsIGRlciBaaWVsYmVoYWVsdGVyCisgICAgIGFscyB6d2VpdGVzIE9iamVrdCBhbmdlZ2ViZW4uIERhbmFjaCB3aXJkIGRlciBTdHJpbmcgYXVmIDc4IFplaWNoZW4KKyAgICAgdW1nZWJyb2NoZW4uCisgICAgIERhcyBTZXR6ZW4gZWluZXMgbGVlcmVuIFN0cmluZ3MgdW50ZXJkcnVlY2t0IGRpZSBBdXNnYWJlIGVpbmVyIE1lbGR1bmcKKyAgICAgZ2Fuei4KKworQkVJU1BJRUxFOgorICAgICAxLiBFaW4gS29jaHRvcGYgbGFlc3N0IGltIFByZXZlbnRJbnNlcnQgbnVyIGJlc3RpbW10ZSBPYmpla3RlIHp1LCBkaWUgenUKKyAgICAgZWluZXIgU3VwcGUgZ2Vob2VyZW4uIEZ1ZXIgZWluZSBwYXNzZW5kZSBNZWxkdW5nIHdpcmQgaW0gVG9wZiBqZXR6dCBkaWUKKyAgICAgUHJvcGVydHkgZ2VzZXR6dDoKKyAgICAgU2V0UHJvcChQX05PSU5TRVJUX01TRywgIkR1IGthbm5zdCBAV0VOMSBuaWNodCBpbiBkZW4gS29jaHRvcGYgdHVuLCBkYSIKKwkgICAgICAgICAgICAgICAgICAgICAiIGdlaG9lcmVuIGRvY2ggbnVyIFN1cHBlbnp1dGF0ZW4gcmVpbiEiKTsKKyAgICAgV2VubiBqZW1hbmQgamV0enQgdmVyc3VjaHQsIGVpbmUgTXVlbnplIHJlaW56dXN0ZWNrZW4sIGRhbm4gd3VlcmRlCisgICAgIGZvbGdlbmRlIE1lbGR1bmcgZXJzY2hlaW5lbjoKKwlEdSBrYW5uc3QgZGllIE11ZW56ZSBuaWNodCBpbiBkZW4gS29jaHRvcGYgdHVuLCBkYSBnZWhvZXJlbiBkb2NoIG51cgorCVN1cHBlbnp1dGF0ZW4gcmVpbiEKKworICAgICAyLiBFaW4gUnVja3NhY2sgc29sbCBpbiBlaW5lciBiZXN0aW1tdGVuIFJlaWhlbmZvbGdlIGdlcGFja3Qgd2VyZGVuLCBkYXp1CisgICAgIGthbm4gaW0gUHJldmVudEluc2VydCBkaWUgTWVsZHVuZyBqZSBuYWNoIEJlZGFyZiBnZXNldHp0IHdlcmRlbjoKKyAgICAgaWYgKDxvYmpla3Qgbm9jaCBuaWNodCBhbiBkZXIgUmVpaGU+KQorCVNldFByb3AoUF9OT0lOU0VSVF9NU0csICJAV0VOMSBzb2xsdGVzdCBkdSBlcnN0IHNwYWV0ZXIgZWlucGFja2VuLiIpOworICAgICBlbHNlIGlmICg8b2JqZWt0IHNjaG9uIGltIFJ1Y2tzYWNrPikKKwlTZXRQcm9wKFBfTk9JTlNFUlRfTVNHLCAiQWJlciBAV0VSMSBpc3QgZG9jaCBzY2hvbiBlaW5nZXBhY2t0ISIpOworICAgICBlbHNlIC4uLgorCitTSUVIRSBBVUNIOgorICAgICBBZWhubGljaGVzOiBQX1RPT19IRUFWWV9NU0csIFBfRU5WX1RPT19IRUFWWV9NU0csIFBfVE9PX01BTllfTVNHLAorICAgICAgICAgICAgICAgICBQX05PTEVBVkVfTVNHLCBQX05PRFJPUCwgUF9OT0dFVCAKKyAgICAgRXJmb2xnOiAgICAgUF9QSUNLX01TRywgUF9EUk9QX01TRywgUF9HSVZFX01TRywgUF9QVVRfTVNHLAorICAgICAgICAgICAgICAgICBQX1dFQVJfTVNHLCBQX1dJRUxEX01TRworICAgICBTb25zdGlnZXM6ICByZXBsYWNlX3BlcnNvbmFsKEUpLCAvc3RkL2xpdmluZy9wdXRfYW5kX2dldC5jCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9OT0xFQVZFX01TRyBiL2RvYy9wcm9wcy9QX05PTEVBVkVfTVNHCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYWQwZjEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9OT0xFQVZFX01TRwpAQCAtMCwwICsxLDMzIEBACitOQU1FOgorICAgIFBfTk9MRUFWRV9NU0cgICAgICAgICAgICAgICAgICAgICAgIm5vbGVhdmVfbXNnIiAgICAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvdGhpbmcvbW92aW5nLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBEaWVzZSBQcm9wZXJ0eSBlbnRoYWVsdCBlaW5lIE1lbGR1bmcsIGRpZSBhdXNnZWdlYmVuIHdpcmQsIHdlbm4KKyAgICAgamVtYW5kIHZlcnN1Y2h0LCBlaW4gT2JqZWt0IGF1cyBlaW5lbSBCZWhhZWx0ZXIgenUgZW50ZmVybmVuIHVuZCBkZXIKKyAgICAgQmVoYWVsdGVyIGRpZXNlcyBpbSBQcmV2ZW50TGVhdmUoKSB2ZXJoaW5kZXJ0LgorICAgICBEaWUgUHJvcGVydHkgaXN0IGltIHZlcmhpbmRlcm5kZW4gQmVoYWVsdGVyIHp1IHNldHplbi4KKyAgICAgSXN0IGRpZXNlIFByb3BlcnR5IG5pY2h0IG9kZXIgYXVmIGVpbmVuIG5pY2h0LVN0cmluZy1XZXJ0IGdlc2V0enQsCisgICAgIHNvIHdpcmQgZGllIFN0YW5kYXJkbWVsZHVuZyBhdXNnZWdlYmVuLgorICAgICAoIkR1IGthbm5zdCA8T2JqZWt0PiBuaWNodCBuZWhtZW4uIikKKyAgICAgRGVyIFN0cmluZyBpbiBkZXIgUHJvcGVydHkgd2lyZCBub2NoIGR1cmNoIHJlcGxhY2VfcGVyc29uYWwoKQorICAgICB2ZXJhcmJlaXRldCwgZGFzIHp1IGJld2VnZW5kZSBPYmpla3Qgd2lyZCBhbHMgZXJzdGVzLCBkZXIgdmVyaGluZGVybmRlCisgICAgIEJlaGFlbHRlciBhbHMgendlaXRlcyBPYmpla3QgYW5nZWdlYmVuLiBEYW5hY2ggd2lyZCBkZXIgU3RyaW5nIGF1ZiA3OAorICAgICBaZWljaGVuIHVtZ2Vicm9jaGVuLgorICAgICBEYXMgU2V0emVuIGVpbmVzIGxlZXJlbiBTdHJpbmdzIHVudGVyZHJ1ZWNrdCBkaWUgQXVzZ2FiZSBlaW5lciBNZWxkdW5nCisgICAgIGdhbnouCisKK0JFSVNQSUVMRToKKyAgICAgTnVyIEJpZXJzY2j8dHRsZXIgc29sbGVuIGVpbmUgQmllcmZsYXNjaGUgYXVzIGVpbmVtIEthc3RlbiBuZWhtZW4KKyAgICAga29lbm5lbiwgbmViZW4gZWluZXIgZW50c3ByZWNoZW5kZW4gQmVoYW5kbHVuZyBpbSBQcmV2ZW50TGVhdmUgc2V0enQgbWFuCisgICAgIGRhenUgZGllIFByb3BlcnR5OgorICAgICBTZXRQcm9wKFBfTk9MRUFWRV9NU0csICJOdXIgQmllcnNjaHVldHRsZXIgZHVlcmZlbiBkYXMhIik7CisKK1NJRUhFIEFVQ0g6CisgICAgIEFlaG5saWNoZXM6IFBfVE9PX0hFQVZZX01TRywgUF9FTlZfVE9PX0hFQVZZX01TRywgUF9UT09fTUFOWV9NU0csCisgICAgICAgICAgICAgICAgIFBfTk9JTlNFUlRfTVNHLCBQX05PRFJPUCwgUF9OT0dFVCAKKyAgICAgRXJmb2xnOiAgICAgUF9QSUNLX01TRywgUF9EUk9QX01TRywgUF9HSVZFX01TRywgUF9QVVRfTVNHLAorICAgICAgICAgICAgICAgICBQX1dFQVJfTVNHLCBQX1dJRUxEX01TRworICAgICBTb25zdGlnZXM6ICByZXBsYWNlX3BlcnNvbmFsKEUpLCAvc3RkL2xpdmluZy9wdXRfYW5kX2dldC5jCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9OT01BR0lDIGIvZG9jL3Byb3BzL1BfTk9NQUdJQwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGVlN2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfTk9NQUdJQwpAQCAtMCwwICsxLDIxIEBACitOQU1FOgorICAgIFBfTk9NQUdJQyAgICAgICAgICAgICAgICAgICAgICJub21hZ2ljIiAgICAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9wcm9wZXJ0aWVzLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBBbmdhYmUgaW4gUHJvemVudCwgbWl0IHdlbGNoZXIgV2FocnNjaGVpbmxpY2hrZWl0IE1hZ2llIGZlaGxzY2hsYWVndC4KKyAgICAgCisgICAgIEZ1ZXIgZWluZW4gUmF1bSBpc3QgZXMgZWluZSBnZW5lcmVsbGUgQXVzc2FnZSwgd2llIHdhaHJzY2hlaW5saWNoIGVpbgorICAgICBTcGVsbCBpbiBpaG0gZmVobHNjaGxhZWd0LiBCZWkgTlBDIHplaWd0IGVzIGFuLCB3aWUgd2FocnNjaGVpbmxpY2gKKyAgICAgZWluIGF1ZiBpaG4gZ2VzcHJvY2hlbmVyIFNwZWxsIGZlaGxzY2hsYWVndC4KKworQkVJU1BJRUw6CisgICAgIC8vIGluIGVpbmVtIFJhdW0ga2VpbmUgU3BlbGxzIHp1bGFzc2VuCisgICAgIFNldFByb3AoUF9OT01BR0lDLCAxMDApCisKK1NJRUhFIEFVQ0g6CisgICAgIEFlaG5saWNoOiAgICAgUF9NQUdJQ19SRVNJU1RBTkNFX09GRlNFVCwgU3BlbGxEZWZlbmQKKworMjkuRGV6IDIwMDcgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX05PU0VMTCBiL2RvYy9wcm9wcy9QX05PU0VMTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGIwZGRiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfTk9TRUxMCkBAIC0wLDAgKzEsMzMgQEAKK05BTUU6CisgICAgUF9OT1NFTEwgICAgICAgICAgICAgICAgICAgICAgIm5vc2VsbCIKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcHJvcGVydGllcy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgV2VubiBkaWVzZSBQcm9wZXJ0eSBnZXNldHp0IGlzdCwga2FubiBkYXMgT2JqZWt0IG5pY2h0IGluIGVpbmVtCisgICAgIExhZGVuIHZlcmthdWZ0IHdlcmRlbi4KKyAgICAgR2lidCBtYW4gaW4gZGVyIFByb3BlcnR5IGVpbmVuIFN0cmluZyBhbiwgd2lyZCBkaWVzZXIgYXVzZ2VnZWJlbiwKKyAgICAgYW5zb25zdGVuIGVyZm9sZ3QgZWluZSBNZWxkdW5nICJEdSBrYW5uc3QgPE5BTUU+IG5pY2h0IHZlcmthdWZlbiEiCisKKyAgICAgRGllc2UgTWVsZHVuZyBiZWluaGFsdGV0IGF1Y2ggZGVuIE5hbWVuIGRlcyBpbiBQX05BTUUgZWluZ2UtCisgICAgIHRyYWdlbmVuIEJlc2l0emVyIGRlcyBMYWRlbnMuIElzdCBkaWVzIG5pY2h0IGdlc2V0enQsIHdpcmQgcGVyCisgICAgIGRlZmF1bHQgJ0RlciBIYWVuZGxlcicgYXVzZ2VnZWJlbi4KKworQkVJU1BJRUw6CisgICAgIFNldFByb3AoUF9OT1NFTEwsIkRlbiBTY2hyb3R0IGJlaGFlbHRzdCBEdSBsaWViZXIgc2VsYmVyLiIpOworCisgICAgID09PiBBcHUgc2FndDogRGVuIFNjaHJvdHQgYmVoYWVsdHN0IER1IGxpZWJlciBzZWxiZXIuCisgICAgID09PiBEZXIgSGFlbmRsZXIgc2FndDogRGVuIFNjaHJvdHQgYmVoYWVsdHN0IER1IGxpZWJlciBzZWxiZXIuCisKKyAgICAgU2V0UHJvcChQX05PU0VMTCwxKTsKKworICAgICA9PT4gQXB1IHNhZ3Q6IER1IGthbm5zdCA8bmFtZT4gbmljaHQgdmVya2F1ZmVuIQorICAgICA9PT4gRGVyIEhhZW5kbGVyIHNhZ3Q6IER1IGthbm5zdCA8bmFtZT4gbmljaHQgdmVya2F1ZmVuIQorCitTSUVIRSBBVUNIOgorICAgICBQX05PQlVZLCBQX05PRFJPUCwgUF9LRUVQRVIKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMDMuMDkuMjAxMCwgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9OT19BU0NJSV9BUlQgYi9kb2MvcHJvcHMvUF9OT19BU0NJSV9BUlQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI0MGNkZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX05PX0FTQ0lJX0FSVApAQCAtMCwwICsxLDIwIEBACitOQU1FOgorICAgIFBfTk9fQVNDSUlfQVJUICAgICAgICAgICAgICAgICAgICJub19hc2NpaV9hcnQiCisKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcGxheWVyL2Jhc2UuaAorCitCRVNDSFJFSUJVTkc6CisgICAgRGllc2UgUHJvcGVydHkga2FubiBkZXIgU3BpZWxlciBtaXQgZGVtIEJlZmVobCAiZ3JhZmlrIGF1cyIgYXVmCisgICAgMSBzZXR6ZW4uIERhbWl0IHplaWd0IGVyIGFuLCBkYXNzIGVyIGtlaW5lIEFTQ0lJIEFydCBzZWhlbiBtb2VjaHRlLgorCisgICAgV2VyIEFTQ0lJLUFydCBlaW5zZXR6dCwgc29sbHRlIGFuIGRpZXNlbiBTdGVsbGVuIGRpZSBQcm9wZXJ0eSAKKyAgICBhYmZyYWdlbiB1bmQgdGV4dGxpY2hlIFVtc2NocmVpYnVuZ2VuIG9kZXIgQWx0ZXJuYXRpdmxvZXN1bmdlbgorICAgIGVpbmJhdWVuLgorICAgIAorU0lFSEUgQVVDSDoKKyAgICBncmFmaWsKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIExldHp0ZSBBZW5kZXJ1bmc6IDIwMDUtMTAtMTgsIFpvb2suICAgCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9OT19BVFRBQ0sgYi9kb2MvcHJvcHMvUF9OT19BVFRBQ0sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYzOTE4MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX05PX0FUVEFDSwpAQCAtMCwwICsxLDgyIEBACitQX05PX0FUVEFDSworCitOQU1FOgorICAgICBQX05PX0FUVEFDSyAibm9fYXR0YWNrIgorCitERUZJTklFUlQgSU46CisgICAgIDxsaXZpbmcvY29tYmF0Lmg+CisKK0JFU0NIUkVJQlVORzoKKyAgICAgV2VubiBlaW4gTlBDIG5pY2h0IGFuZ3JlaWZiYXIgc2VpbiBzb2xsICh3ZWlsIGVyIHp1bSBCZWlzcGllbCBpbiBlaW5lcgorICAgICBHaWxkZSBvZGVyIGVpbmVyIFF1ZXN0IEluZm9ybWF0aW9uZW4gdmVybWl0dGVsdCBvZGVyIGFlaG5saWNoZW4pLCBzb2xsdGUKKyAgICAgbWFuIGRpZXNlIFByb3BlcnR5IGF1ZiBlaW5lbiBXZXJ0IHVuZ2xlaWNoIE51bGwgc2V0emVuLiBTaWUgd2lyZCBpbW1lcgorICAgICBhYmdlZnJhZ3QsIHdlbm4gZXJtaXR0ZWx0IHdpcmQsIG9iIGVpbiBMZWJld2VzZW4gcHJpbnppcGllbGwgYW5ncmVpZmJhcgorICAgICBpc3QuIEQuaC4gYXVjaCwgZGFzcyBuYWNoIEFiZnJhZ2VuIHZvbiBQX05PX0FUVEFDSyBfbmljaHRfIGltbWVyIGVpbgorICAgICBLYW1wZiBnZXN0YXJ0ZXQgd2lyZCB1bmQgZGFzcyBtYW4gZGFiZWkgX25pY2h0XyBpbSBLYW1wZiBzZWluIG11c3MhCisKKyAgICAgR2lidCBtYW4gaGllciBlaW5lbiBTdHJpbmcgYW4gKG1pdCBlaW5lbSBTYXR6emVpY2hlbiB1bmQgIlxuIiBhYmdlLQorICAgICBzY2hsb3NzZW4pLCB3aXJkIGRpZXNlciBiZWkgZGlyZWt0ZW4gQW5ncmlmZmVuIGF1c2dlZ2ViZW4uIEJlaSBhbmRlcmVuCisgICAgIERhdGVudHlwZW4gd2lyZCBlaW5lIERlZmF1bHRtZWxkdW5nIGF1c2dlZ2ViZW4uIERpZSBEZWZhdWx0bWVsZHVuZworICAgICBsYXV0ZXQ6ICI8TmFtZT4gbGFlc3N0IHNpY2ggbmljaHQgYW5ncmVpZmVuIVxuIgorCisgICAgIE1pdCBkaXJla3RlbiBBbmdyaWZmZW4gc2luZCAndG9ldGUgPG5hbWU+JyB1bmQgQW5ncmlmZnN6YXViZXIgZ2VtZWludAorICAgICAoYnp3LiBhbGxlcywgd2FzIGxpdmluZy9saWZlOjpLaWxsKCksIHNwZWxsYm9vazo6VHJ5QXR0YWNrU3BlbGwoKSwKKyAgICAgc3BlbGxib29rOjpUcnlEZWZhdWx0QXR0YWNrU3BlbGwoKSB1bmQgc3BlbGxib29rOjpGaW5kRW5lbXlWaWN0aW0oKQorICAgICBhdWZydWZ0KS4KKworQUNIVFVORzoKKworICAxKSBadW0gVGhlbWEgUXVlcnlNZXRob2RlbiBhdWYgUF9OT19BVFRBQ0sKKyAgICAgR3J1bmRzYWV0emxpY2ggbGVndCBtYW4gZW50d2VkZXIgZWluZSBRdWVyeS1NZXRob2RlIGF1ZiBQX05PX0FUVEFDSzoKKyAgICAgICAgU2V0KFBfTk9fQVRUQUNLLCAjJ215X25vX2F0dGFjaywgRl9RVUVSWV9NRVRIT0QpOworICAgICBvZGVyIGRlZmluaWVydCBlaW5lIEZ1bmt0aW9uIF9xdWVyeV9ub19hdHRhY2soKSBpbSBOUEMuCisKKyAgICAgV2llIG11c3MgbnVuIGVpbmUgc29sY2hlIEZ1bmt0aW9uIGF1c3NlaGVuPyBaLkIuOgorICAgICAKKyAgICAgaW50fHN0cmluZyBteV9ub19hdHRhY2soKSB7CisgICAgICAgaWYgKCFvYmplY3RwKHRoaXNfcGxheWVyKCkpKSByZXR1cm4gMDsKKyAgICAgICBpZiAob3BmZXI9PWdldHVpZCh0aGlzX3BsYXllcigpKSB8fCB0aGlzX3BsYXllcigpPT10aGlzX29iamVjdCgpKQorICAgICAgICAgcmV0dXJuKDApOworICAgICAgIHJldHVybigxKTsgLy9uaWNodCBhbmdyZWlmYmFyCisgICAgIH0KKworICAgICBEaWVzZSBGdW5rdGlvbiBtYWNodCBkZW4gTlBDIG51biBudXIgZnVlciBkZW4gU3BpZWxlciAnb3BmZXInIGFuZ3JlaWZiYXIuCisgICAgIFN0YXR0ZGVzc2VuIGthbm4gbmF0dWVybGljaCBhdWNoIGplZGUgYW5kZXJlIEJlZGluZ3VuZyBnZW51dHp0IHdlcmRlbi4KKworICAgICBBYmVyIHdhcnVtIGRpZSB6d2VpdGUgQmVkaW5ndW5nLCB0aGlzX3BsYXllcigpPT10aGlzX29iamVjdCgpPworICAgICBXYXJ1bSBzb2xsdGUgZGVyIE5QQyBzaWNoIHNlbGJlciBhbmdyZWlmZW4gZHVlcmZlbj8KKworICAgICBEYXMgbGllZ3QgYW4gZm9sZ2VuZGVuIDIgRGluZ2VuOgorCisgICAgIDEuIEthZW1wZmVyIGtyaWVnZW4gYmVpIGVpbmdlc2NoYWx0ZXRlbSBGb2t1cyBQcm9ibGVtZSwgd2VubiBtYW4gZGFzIAorICAgICBuaWNodCBtYWNodC4gRGFzIGxpZWd0IGFuIGZvbGdlbmRlbTogV2VubiBkZXIgTlBDIGFuZ3JlaWZ0LCBydWZ0IGVyIAorICAgICBuYXR1ZXJsaWNoIERlZmVuZCgpIGltIFNwaWVsZXIgYXVmLiBEaWVzZXMgc2NoYXV0IG5hY2gsIG9iIGRlciBTcGllbGVyIAorICAgICBkZW4gU2tpbGwgU0tfTUFHSUNBTF9ERUZFTlNFIGhhdC4gRGllc2VyIGlzdCBiZWkgS2FlbXBmZXJuIGRhcyBQYXJpZXJlbi4KKyAgICAgRGllc2VzIHNjaGF1dCBuYWNoLCBvYiBkZXIgRm9rdXMgYWt0aXYgaXN0LCB3ZW5uIGphLCB3aXJkIGRlbSAKKyAgICAgZ2UnZm9rdXMndGUgR2VnbmVyIGJlc29uZGVycyBndXQgYXVzZ2V3aWNoZW4uIFp1IGRpZXNlbSBad2VjayB3aXJkIGRpZSAKKyAgICAgTGlzdGUgZGVyIEZlaW5kIGltIFJhdW0gZXJzdGVsbHQgbWl0IFByZXNlbnRFbmVtaWVzKCkgYWJnZXJ1ZmVuLiBEaWVzZXMgCisgICAgIGZyYWd0IGFiZXIgaW4gYWxsZW4gKHBvdGVudGllbGxlbikgR2VnbmVybiBQX05PX0FUVEFDSyBhYiB1bmQgYmVlbmRldCAKKyAgICAgZGVuIEthbXBmIG1pdCBhbGxlbiBHZWduZXJuLCBkaWUgbmljaHQgYW5ncmVpZmJhciBzaW5kLiBCZWkgZGllc2VyIAorICAgICBBYmZyYWdlIGlzdCBqZWRvY2ggVFA9PU5QQywgd2VpbCBkZXIgamEgYW5ncmVpZnQuIFdlbm4gZXIgbnVuIDEgCisgICAgIHp1cnVlY2tnaWJ0LCB3aXJkIGRlciBLYW1wZiBhbiBkZXIgU3RlbGxlIGJlZW5kZXQuIAorCisgICAgIDIuIFdlbm4gZGVyIE5QQyBkZW4gU3BpZWxlciBhbmdyZWlmdCwgd2lyZCBpbSBTcGllbGVyIEluc2VydEVuZW15KE5QQykKKyAgICAgYXVmZ2VydWZlbi4gQXVjaCBkaWVzZW0gRmFsbCBmaW5kZXQgZGllIEFiZnJhZ2Ugdm9uIFBfTk9fQVRUQUNLIHN0YXR0LCAKKyAgICAgZGEgSW5zZXJ0RW5lbXkoKSBqYSBlcnN0bWFsIHJhdXNmaW5kZW4gbXVzcywgb2IgZGVyIEdlZ25lciBhbmdyZWlmYmFyIAorICAgICBpc3QsIGJldm9yIGVyIGluIGRpZSBGZWluZGxpc3RlIGVpbmdldHJhZ2VuIHdpcmQuIERhIGRlciBOUEMgZGVuIAorICAgICBBbmdyaWZmIGJlZ2lubnQsIGlzdCBUUCBkZXIgTlBDLiBXZW5uIGRpZSBRdWVyeS1NZXRob2RlIGF1ZiBQX05PX0FUVEFDSworICAgICBoaWVyIGFiYnJpY2h0LCB3aXJkIGRlciBOUEMgbmljaHQgaW4gZGllIEZlaW5kbGlzdGUgZGVzIFNwaWVsZXJzIAorICAgICBlaW5nZXRyYWdlbi4gRGFubiBiZWthZW1wZnQgZGVyIE5QQyBkZW4gU3BpZWxlciwgYWJlciBkZXIgU3BpZWxlciBuaWNodAorICAgICBkZW4gTlBDLgorCisKKyAgMikgUF9OT19BVFRBQ0sgZGVzIE5QQyB3aXJkIHouQi4gYmVpbSBLYW1wZiBlaW5lcyBLYWVtcGZlcnMgbWl0IGRlbSBOUEMgCisgICAgIHBybyBLYW1wZnJ1bmRlIHVtIGRpZSAxMG1hbCBhYmdlcnVmZW4uIFdlbm4gZGVyIEthZW1wZmVyIG51ciBlaW5lIAorICAgICBBdHRhY2tlIG1hY2h0LiBXZW5uIGVyIG5vY2ggU29uZGVyYXR0YWNrZW4gbWFjaGVuLCBTcGVsbHMgYXVzZnVlaHJ0LCAKKyAgICAgZXRjLiB3aXJkIGRhcyBub2NoIG1laHIuIEQuaC4gd2FzIGF1Y2ggaW1tZXIgaWhyIGluIGRlciBRdWVyeS1NZXRob2RlIAorICAgICBpbSBOUEMgbWFjaHQ6IAorICAgICBFcyBzb2xsdGUgc2NobmVsbCBzZWluLCBqZWRlciBUaWNrIGFuIFJlY2hlbnplaXQgemFlaGx0IGhpZXIgeGZhY2ghCisKKworTEVUWlRFIEFFTkRFUlVORzoKKzA5LjExLjIwMTUsIEFyYXRob3JuCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9OT19CQUQgYi9kb2MvcHJvcHMvUF9OT19CQUQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBkZjFlNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX05PX0JBRApAQCAtMCwwICsxLDIzIEBACitOQU1FOgorICAgICBQX05PX0JBRCAgICAgICAgICAgICAgICAgICAgICAic3RkX2Zvb2Rfbm9fYmFkIgorCitERUZJTklFUlQgSU46CisgICAgIDxzeXMvZm9vZC5oPgorCitCRVNDSFJFSUJVTkc6CisgICAgIEZsYWcsIG9iIGRpZSBTcGVpc2UgZXdpZyBoYWx0YmFyIGlzdC4KKyAgICAgMDogU3BlaXNlIHZlcmRpcmJ0IG5hY2ggZGVyIEFuemFobCBTZWt1bmRlbiwgZGllIGluIFBfTElGRVRJTUUKKyAgICAgICAgYW5nZWdlYmVuIGlzdCBiencuIG5hY2ggZWluZW0gUmVzZXQKKyAgICAgMTogU3BlaXNlIHZlcmRpcmJ0IG5pY2h0CisgICAgIAorICAgICBBQ0hUVU5HOiBEaWVzZSBQcm9wZXJ0eSBkYXJmIG51ciBpbiBBYnNwcmFjaGUgbWl0IGRlciBCYWxhbmNlCisgICAgICAgICAgICAgIGdlYWVuZGVydCB3ZXJkZW4uCisgICAgIAorREVGQVVMVDoKKyAgICAgSW5pdGlhbCBpc3QgZGllc2UgUHJvcGVydHkgYXVmIDAgZ2VzZXR6dC4KKworU0lFSEUgQVVDSDoKKyAgICAgL3N0ZC9mb29kLmMsIHdpei9mb29kCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogVGh1IE9jdCAyOCAxMjoxNTowMCAyMDEwIGJ5IENhbGRyYQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX05PX0dMT0JBTF9BVFRBQ0sgYi9kb2MvcHJvcHMvUF9OT19HTE9CQUxfQVRUQUNLCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZGY0ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9OT19HTE9CQUxfQVRUQUNLCkBAIC0wLDAgKzEsMjAgQEAKK1BfTk9fR0xPQkFMX0FUVEFDSworCitOQU1FOgorICAgICBQX05PX0dMT0JBTF9BVFRBQ0sgIm5vX2dsb2JhbF9hdHRhY2siCisKK0RFRklOSUVSVCBJTjoKKyAgICAgPGNvbWJhdC5oPgorCitCRVNDSFJFSUJVTkc6CisgICAgIFNldHp0IG1hbiBkaWVzZSBQcm9wZXJ0eSBpbiBlaW5lbSBOUEMgYXVmIGVpbmVuIFdlcnQgdW5nbGVpY2ggMCwgc28KKyAgICAgd2lyZCBkZXIgTlBDIGJlaSBlaW5lbSAidG9ldGUgYWxsZSIgbmljaHQgYW5nZWdyaWZmZW4uCisKKyAgICAgRGFtaXQga2FubiBtYW4gekIuIE5QQ3MsIGRpZSBkZW0gZWlnZW5lbiBTY2h1dHogZGllbmVuIChhbHMgRm9sZ2Ugdm9uCisgICAgIFphdWJlcnNwcnVlY2hlbiBvLmFlLikgdm9yIHZlcnNlaGVudGxpY2hlbiBBbmdyaWZmZW4gc2NodWV0emVuLgorCitTSUVIRSBBVUNIOgorICAgICAvc3RkL25wYy5jLCBQX0ZSSUVORAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBTYXQgTWF5IDE4IDE1OjI2OjI4IDE5OTYgYnkgV2FyZ29uCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9OT19QQVJBX1RSQU5TIGIvZG9jL3Byb3BzL1BfTk9fUEFSQV9UUkFOUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzhjMjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfTk9fUEFSQV9UUkFOUwpAQCAtMCwwICsxLDE1IEBACitOQU1FOgorCVBfTk9fUEFSQV9UUkFOUwkJCQkibm9fcGFyYV90cmFucyIKKworREVGSU5JRVJUIElOOgorCS9zeXMvcHJvcGVydGllcy5oCisKK0JFU0NIUkVJQlVORzoKKwlXZW5uIGluIGVpbmVtIFJhdW0gZGllc2UgUHJvcGVydHkgZ2VzZXR6dCBpc3QsIGRhcmYgZG9ydCBrZWluCisJV2VjaHNlbCBpbiBvZGVyIGF1cyBkZXIgUGFyYWxlbGx3ZWx0IGVyZm9sZ2VuLiBPYmpla3RlIGRpZSBzbworCWVpbmVuIFdlY2hzZWwgZXJtb2VnbGljaGVuIHNpbmQgZGFmdWVyIHZlcmFudHdvcnRsaWNoIGRpZXNlCisJUHJvcGVydHkgYWJ6dWZyYWdlbi4KKworU0lFSEUgQVVDSDoKKwlQX05PX1RQT1JUCisKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX05PX1BMQVlFUlMgYi9kb2MvcHJvcHMvUF9OT19QTEFZRVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MmI5MTUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9OT19QTEFZRVJTCkBAIC0wLDAgKzEsMzcgQEAKK05BTUU6CisgICAgUF9OT19QTEFZRVJTICAgICAgICAgICAgICAgICAgICAgIm5vX3BsYXllcnMiICAgICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3Jvb21zLmgKKworQkVTQ0hSRUlCVU5HOgorICAgIFdlbm4gaW4gZWluZW0gUmF1bSBkaWUgUHJvcGVydHkgUF9OT19QTEFZRVJTIGF1ZiBlaW5lbiBXZXJ0ICE9IDAgZ2VzZXR6dAorICAgIGlzdCwga2FubiBkaWVzZXIgdm9uIFNwaWVsZXJuIGF1ZiBub3JtYWxlbSBXZWdlIG5pY2h0IG1laHIgYmV0cmV0ZW4gd2VyZGVuLgorICAgIE1hZ2llciB1bmQgVGVzdHNwaWVsZXIoKikga29lbm5lbiBkZW4gUmF1bSBiZXRyZXRlbjsgU3BpZWxlciBtdWVzc2VuIG1pdAorICAgIE1fTk9DSEVDSyBoaW5laW5iZXdlZ3Qgd2VyZGVuLgorCisgICAgQXVmIGRpZXNlIFdlaXNlIGtvZW5uZW4gR2ViaWV0ZSwgZGllIG5vY2ggbmljaHQgb2ZmaXppZWxsIGFuZ2VzY2hsb3NzZW4KKyAgICBzaW5kLCB2b3IgJ3VuYmVhYnNpY2h0aWd0ZW0nIEJldHJldGVuIGR1cmNoIFNwaWVsZXIgZ2VzY2h1ZXR6dCB3ZXJkZW4uCisKKyAgICBNb2VjaHRlIG1hbiB6dSBlaW5lbSBzY2hvbiBhbmdlc2NobG9zc2VuZW4gR2ViaWV0IG5hY2h0cmFlZ2xpY2ggZWluZQorICAgIFBhcmFsbGVsd2VsdCBlaW5iYXVlbiwgc28gc29sbHRlIFBfTk9fUExBWUVSUyAqZHJpbmdlbmQqIGluIGRlbgorICAgIFBhcmFsbGVsd2VsdHJhZXVtZW4gZ2VzZXR6dCB3ZXJkZW4sIGJpcyBkaWUgUGFyYWxsZWx3ZWx0IGF1c2RydWVja2xpY2gKKyAgICBmdWVyIFNwaWVsZXIgZnJlaWdlZ2ViZW4gd2lyZC4gQW5kZXJuZmFsbHMgc2luZCBhbGxlIFBhcmFsbGVsd2VsdHJhZXVtZSwKKyAgICB6dSBkZW5lbiBhbmdlc2NobG9zc2VuZSBOb3JtYWx3ZWx0cmFldW1lIG1pdCBnbGVpY2hlbSBGaWxlbmFtZW4gZXhpc3RpZXJlbiwKKyAgICBhdXRvbWF0aXNjaCBkdXJjaCBTcGllbGVyIGVycmVpY2hiYXIhCisKKyAgICAoKikgQXVzc2NobGllc3NsaWNoIFRlc3RzcGllbGVyLCBkaWUgYXVmIGRlbiBOYW1lbiBlaW5lcyBleGlzdGllcmVuZGVuCisgICAgTWFnaWVycyBtYXJraWVydCBzaW5kLCBrb2VubmVuICdnZXNjaHVldHp0ZScgUmFldW1lIGJldHJldGVuLgorICAgIEdpbGRlbnRlc3RpZXMgd2VyZGVuIHdpZSBTcGllbGVyIGJlaGFuZGVsdC4KKworQU5NRVJLVU5HOgorICAgIEltIEdlZ2Vuc2F0eiB6dSBCZXdlZ3VuZ2VuIHZvbiBMaXZpbmdzIHdpcmQgYmVpIGRlciBCZXdlZ3VuZyB2b24gR2VnZW4tCisgICAgc3RhZW5kZW4gUF9OT19QTEFZRVJTIG51ciBiZWltIFdlY2hzZWwgZGVyIFdlbHQgYXVzZ2V3ZXJ0ZXQsIHVtIHouQi4genUKKyAgICB2ZXJoaW5kZXJuLCBkYXNzIEJ1bWVyYW5ncyBpbiBub2NoIG5pY2h0IGFuZ2VzY2hsb3NzZW5lIEdlYmlldGUgZmxpZWdlbi4KKworICAgIE1vZWNodGUgbWFuIGluIHNlaW5lbSBlaWdlbmVuIEdlYmlldCBtaXQgQnVtZXJhbmdzIG8uYWUuIHRlc3RlbiwgbXVzcworICAgIGluIGRpZXNlbiBQX1RFU1RQTEFZRVIgZ2VzZXR6dCBzZWluLiBEYXMgaXN0IHp3YXIgZWhlciBlaW4gTWlzc2JyYXVjaAorICAgIGRlciBQcm9wZXJ0eSwgYWJlciBlaW4gVW1rb21waWVyZW4gdm9tIFdlcmZlciB3YXIgYXVmIERhdWVyIHp1IHRldWVyLiA7LSkKKworU0lFSEUgQVVDSDoKKyAgICBQX1BBUkEsIG1vdmUKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX05PX1JFR0VORVJBVElPTiBiL2RvYy9wcm9wcy9QX05PX1JFR0VORVJBVElPTgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGRlYThjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfTk9fUkVHRU5FUkFUSU9OCkBAIC0wLDAgKzEsMzQgQEAKK1BfTk9fUkVHRU5FUkFUSU9OCisKK05BTUU6CisgICAgIFBfTk9fUkVHRU5FUkFUSU9OICAgICJub19yZWdlbmVyYXRpb24iCisKK0RFRklOSUVSVCBJTjoKKyAgICAgPGxpdmluZy9saWZlLmg+IHVuZCA8aGVhbHRoLmg+CisKK0JFU0NIUkVJQlVORzoKKyAgICAgRHVyY2ggZGFzIFNldHplbiBkaWVzZXIgUHJvcGVydHkga2FubiBtYW4gdmVyaGluZGVybiwgZGFzIGVpbiBMZWJld2VzZW4KKyAgICAgc2ljaCByZWdlbmVyaWVydC4KKyAgICAgRXMgZ2lidCBzaWViZW4gbW9lZ2xpY2hlIFdlcnRlLCBkaWUgbWFuIGR1cmNoIHZlcm9kZXJuIGtvbWJpbmllcmVuCisgICAgIGthbm46CisgICAgIE5PX1JFR19IUCAgICAgICAgOiBlcyB3ZXJkZW4ga2VpbmUgSFAgcmVnZW5lcmllcnQKKyAgICAgTk9fUkVHX0JVRkZFUl9IUCA6IGVzIHdlcmRlbiBiZWltICJ0YW5rZW4iIGtlaW5lIEhQIHJlZ2VuZXJpZXJ0CisgICAgIE5PX1JFR19TUCAgICAgICAgOiBlcyB3ZXJkZW4ga2VpbmUgU1AgcmVnZW5lcmllcnQKKyAgICAgTk9fUkVHX0JVRkZFUl9TUCA6IGVzIHdlcmRlbiBiZWltICJ0YW5rZW4iIGtlaW5lIFNQIHJlZ2VuZXJpZXJ0CisgICAgIE5PX1JFR19BTENPSE9MICAgOiBkZXIgQWxrb2hvbHNwaWVnZWwgd2lyZCBuaWNodCBnZXNlbmt0CisgICAgIE5PX1JFR19EUklOSyAgICAgOiBkZXIgRmx1ZXNzaWdrZWl0c3NwaWVnZWwgd2lyZCBuaWNodCBnZXNlbmt0CisgICAgIE5PX1JFR19GT09EICAgICAgOiBkZXIgTmFocnVuZ3NzcGllZ2VsIHdpcmQgbmljaHQgZ2VzZW5rdAorICAgICBzb3dpZSBkaWUgS29uc3RhbnRlIE5PX1JFRywgZGllIGVpbmUgS29tYmluYXRpb24gYWxsZXIgbW9lZ2xpY2hlbgorICAgICBXZXJ0ZSBkYXJzdGVsbHQgKHF1YXNpIGRhcyBncm9lc3N0bW9lZ2xpY2hlIFVlYmVsIDspLgorCitCRUlTUElFTEU6CisgICAgIERpZXNlcyBMZWJld2VzZW4gaGVpbHQgbnVyIGJlaW0gInRhbmtlbiIgaW4gZGVyIEtuZWlwZSwgYW5zb25zdGVuCisgICAgIG5pY2h0OgorICAgICAKKyAgICAgU2V0UHJvcCggUF9OT19SRUdFTkVSQVRJT04sIE5PX1JFR19IUHxOT19SRUdfU1AgKTsKKworU0lFSEUgQVVDSDoKKyAgICAgL3N0ZC9saXZpbmcvbGlmZS5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IDE0LTA1LTIwMDEgYnkgTXVwZmVsCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9OT19TQ09SRSBiL2RvYy9wcm9wcy9QX05PX1NDT1JFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNGEyZDIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9OT19TQ09SRQpAQCAtMCwwICsxLDUxIEBACitOQU1FOgorICAgICBQX05PX1NDT1JFICAgICAgICAgICAgICAgIm5vX3Njb3JlIgorCitERUZJTklFUlQgSU46CisgICAgIC9zZWN1cmUvc2NvcmVtYXN0ZXIuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIERpZSBQcm9wZXJ0eSBzdGVsbHQgZWluIEZsYWcgaW5uZXJoYWxiIHZvbiBMZWJld2VzZW4gZGFyLCB3ZWxjaGVzCisgICAgIHN0YW5kYXJkbWFlc3NpZyBuaWNodCBnZXNldHp0IGlzdC4gSW4gZGllc2VtIEZhbGwgd2VyZGVuCisgICAgIEVyc3RraWxsc3R1ZmVucHVua3RlIGFuIGRlbiBBbmdyZWlmZXIgdmVyZ2ViZW4sIHNvZmVybiBlciBlaW4gT3BmZXIKKyAgICAgdG9ldGV0LgorCisgICAgIElubmVyaGFsYiBlaW5lcyBUZWFtcyBrb2VubmVuIEVyc3RraWxsc3R1ZmVucHVua3RlIGF1Y2ggYW4KKyAgICAgTWl0Z2xpZWRlciB2ZXJnZWJlbiB3ZXJkZW4sIGRpZSBkYXMgTGViZXdlc2VuIG5pY2h0IHNlbGJzdCBnZXRvZXRldAorICAgICBoYWJlbi4gVm9yYXVzc2V0enVuZyBoaWVyZnVlciBpc3QsIGRhc3MgZGVyamVuaWdlLCBkZXIgZGVuIGxldHp0ZW4KKyAgICAgU2NobGFnIGF1c2Z1ZWhydGUsIGRlbiBLaWxsIHNjaG9uIGhhdC4gRGFuYWNoIHdlcmRlbiBNaXRnbGllZGVyIGRlcworICAgICBUZWFtcyBnZXN1Y2h0LCB3ZWxjaGUgZGVuIEtpbGwgbm9jaCBuaWNodCBoYWJlbiB1bmQgaW4gZGVyIEZvcm1hdGlvbgorICAgICBtb2VnbGljaHN0IHdlaXQgdm9ybmUgc3RlaGVuLgorCisgICAgIE1pdCBkZXIgZ2VzZXR6dGVuIFByb3BlcnR5IFBfTk9fU0NPUkUgaW0gT3BmZXIgZXJyZWljaHQgbWFuIG51biwKKyAgICAgZGFzcyBkaWVzZSBHdXRzY2hyaWZ0IGZ1ZXIgZGVuL2RpZSBBbmdyZWlmZXIgdW50ZXJidW5kZW4gd2lyZC4KKworQkVJU1BJRUw6CisgICAgIEZvbGdlbmRlcm1hc3NlbiB1bnRlcmJpbmRldCBtYW4gZGllIFZlcmdhYmUgdm9uCisgICAgIEVyc3RraWxsc3R1ZmVucHVua3RlbiBmdWVyIGRlbiBUb2QgZWluZXMgTlBDJ3M6CisKKyAgICAgICBpbmNsdWRlICIvc2VjdXJlL3Njb3JlbWFzdGVyLmgiCisgICAgICAgaW5oZXJpdCAic3RkL25wYyI7CisgICAgICAgdm9pZCBjcmVhdGUoKSB7CisgICAgICAgICA6OmNyZWF0ZSgpOworICAgICAgICAgLi4uCisgICAgICAgICBTZXRQcm9wKFBfTk9fU0NPUkUsMSk7CisgICAgICAgfQorCisgICAgIERhbWl0IGthbm4gUF9YUCBlaW5lbiBXZXJ0IGhhYmVuLCBkZXIgZWlnZW50bGljaCB6dW0gYXV0b21hdGlzY2hlbgorICAgICBFaW50cmFnZW4gdm9uIEVyc3RraWxsc3R1ZmVucHVua3RlbiBmdWVyIGVpbiBMZWJld2VzZW4gZnVlaHJ0LCB1bmQKKyAgICAgdHJvdHpkZW0gd2lyZCBkaWVzZXIgRWludHJhZyBuaWNodCB2b3JnZW5vbW1lbi4KKyAgICAgU2lubnZvbGwgaXN0IGRpZXMgaW5zYmVzb25kZXJlIGJlaSBMZWJld2VzZW4sIGRpZSBuaWNodCBqZWRlcgorICAgICBTcGllbGVyIGVycmVpY2hlbiBrYW5uIChtYW4gbW9lY2h0ZSBkb2NoIGVpbmUgZ2V3aXNzZQorICAgICBDaGFuY2VuZ2xlaWNoaGVpdCBmdWVyIGRhcyBFcnJlaWNoZW4gdm9uIFN0dWZlbnB1bmt0ZW4gYmlldGVuKS4KKworQkVNRVJLVU5HRU46CisgICAgIEF1Y2ggZGllIFZlcmdhYmUgdm9uIEVyZmFocnVuZ3NwdW5rdGVuIGthbm4gZXhwbGl6aXQgdW50ZXJidW5kZW4KKyAgICAgd2VyZGVuLiBIaWVyZnVlciBnaWJ0IGVzIGRpZSBhZWhubGljaCBnZWFydGV0ZSBQcm9wZXJ0eSBQX05PX1hQLgorCitTSUVIRSBBVUNIOgorICAgICBGdW5rdGlvbmVuOiAgR2l2ZUtpbGxTY29yZSgpLCBkb19kYW1hZ2UoKQorICAgICBWZXJ3YW5kdDogICAgUF9OT19YUAorICAgICBTb25zdGlnZXM6ICAgUF9YUAorCisxNC5GZWIgMjAwNyBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfTk9fU1REX0RSSU5LIGIvZG9jL3Byb3BzL1BfTk9fU1REX0RSSU5LCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MWU5MmQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9OT19TVERfRFJJTksKQEAgLTAsMCArMSwxOSBAQAorTkFNRToKKwlQX05PX1NURF9EUklOSwkJCSJub19zdGRfZHJpbmsiCisKK0RFRklOSUVSVCBJTjoKKwkvc3lzL3B1Yi5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgICAgRHVyY2ggc2V0emVuIGRpZXNlciBQcm9wZXJ0eSBpbiBlaW5lciBLbmVpcGUgc29yZ3QgbWFuIGRhZnVlciwgZGFzcyAKKyAgICAgICAgIlN0YW5kYXJkLURyaW5rcyIgKHouQi4gR2x1ZWh3ZWluIGltIERlemVtYmVyKSBuaWNodCBpbiBkYXMgTWVudWUKKyAgICAgICAgZGVyIEtuZWlwZSBhdWZnZW5vbW1lbiB3ZXJkZW4uCisKK0JFTUVSS1VOR0VOOgorICAgICAgICBLZWluZS4KKworU0lFSEUgQVVDSDoKKwkvc3RkL3Jvb20vcHViLmMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogU2F0IE1hciAwNCAyMjo0MjowMCAyMDAwIGJ5IFBhcmFjZWxzdXMKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX05PX1RQT1JUIGIvZG9jL3Byb3BzL1BfTk9fVFBPUlQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAzNTBlNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX05PX1RQT1JUCkBAIC0wLDAgKzEsMTUgQEAKK05BTUU6CisgICAgUF9OT19UUE9SVCAgICAgICAgICAgICAgICAgICAgInRwb3J0IiAgICAgICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3Byb3BlcnRpZXMuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIEthbm4gZm9sZ2VuZGUgV2VydGUgYW5ubmVobWVuIChkZWZpbmllcnQgaW4gbW92aW5nLmgpOgorICAgICBOT19UUE9SVF9JTgk9IE1hbiBrYW5uIG5pY2h0IGluIGRlbiBSYXVtIGhpbmVpbiB0ZWxlcG9ydGllcmVuLgorICAgICBOT19UUE9SVF9PVVQgPSBNYW4ga2FubiBuaWNodCBhdXMgZGVtIFJhdW0gaGluYXVzIHRlbGVwb3J0aWVyZW4uCisgICAgIE5PX1RQT1JUCT0gV2VkZXIgbm9jaC4KKworU0lFSEUgQVVDSDoKKwlQX05PX1BBUkFfVFJBTlMKKwpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfTk9fVFJBVkVMSU5HIGIvZG9jL3Byb3BzL1BfTk9fVFJBVkVMSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNDI1YmMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9OT19UUkFWRUxJTkcKQEAgLTAsMCArMSwyNSBAQAorTkFNRToKKyAgICBQX05PX1RSQVZFTElORyAgICAgICAgICAgICAgICAgICAibm9fdHJhdmVsaW5nIiAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvdHJhbnNwb3J0LmgKKworQkVTQ0hSRUlCVU5HOgorICAgIEhpZXIgc3RlaHQgZGVyIGFsbGdlbWVpbmUgcmVpc2UtQmVmZWhsIG5pY2h0IHp1ciBWZXJmdWVndW5nLgorCitCRU1FUktVTkdFTjoKKyAgICBQX05PX1RSQVZFTElORyB3aXJkIGluIFRyYW5zcG9ydGVybiBnZXNldHp0IHdlbm4gU3BpZWxlciBpaG4gCisgICAgbmljaHQgbWVociAnYXV0b21hdGlzY2gnIG1pdHRlbHMgZGVzICdyZWlzZSctQmVmZWhscyBiZXRyZXRlbgorICAgIGtvZW5uZW4gc29sbGVuLgorCisgICAgU2llIGJla29tbWVuIGluIGRlbSBUcmFuc3BvcnRlciB1bmQgaW4gZGVuIFppZWxyYWV1bWVuIGF1Y2ggCisgICAga2VpbmVybGVpIEhpbndlaXNlIGRhcmF1Ziwgd29oaW4gc2llIGV2dGwuIHJlaXNlbiBrb2VubnRlbi4KKyAgICAKKyAgICBTdGFuZGFyZG1hZXNzaWcgaXN0IFBfTk9fVFJBVkVMSU5HIG5hdHVlcmxpY2ggMC4KKworU0lFSEUgQVVDSDoKKyAgICByZWlzZQorCitMRVRaVEVSIEFFTkRFUlVORzoKKyAgICBEb24sIDI0LjAxLjIwMDIsIDEwOjE1OjA3aCB2b24gVGlsbHkKKyAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9OT19YUCBiL2RvYy9wcm9wcy9QX05PX1hQCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMmZlOGQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9OT19YUApAQCAtMCwwICsxLDQzIEBACitOQU1FOgorICAgICBQX05PX1hQICAgICAgICAgICAgICAgICAgICAibm9feHAiCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N5cy9saXZpbmcvbGlmZS5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgSW0gTm9ybWFsZmFsbCBiZWtvbW10IG1hbiBpbSBLYW1wZiBnZWdlbiBlaW5lbiBHZWduZXIgZnVlciBUcmVmZmVyCisgICAgIHVuZCBiZWltIFRvZXRlbiBlaW5lIFhQLUd1dHNjaHJpZnQuCisKKyAgICAgSXN0IFBfTk9fWFAgZ2VzZXR6dCwgc28gZXJo5Gx0IG1hbiBrZWluZXJsZWkgWFAtR3V0c2NocmlmdGVuCisgICAgIGb8ciBkZW4gS2FtcGYgb2RlciBkZW4gVG9kIGRlcyBOUENzLgorCitCRUlTUElFTDoKKyAgICAgRm9sZ2VuZGVybWFzc2VuIHVudGVyYmluZGV0IG1hbiBkaWUgVmVyZ2FiZSB2b24gRXJmYWhydW5nc3B1bmt0ZQorICAgICBmdWVyIGRlbiBBbmdyaWZmIGVpbmVzIE5QQydzOgorCisgICAgICAgaW5jbHVkZSAiL3N5cy9saXZpbmcvbGlmZS5oIgorICAgICAgIGluaGVyaXQgInN0ZC9ucGMiOworICAgICAgIHZvaWQgY3JlYXRlKCkgeworICAgICAgICAgOjpjcmVhdGUoKTsKKyAgICAgICAgIC4uLgorICAgICAgICAgU2V0UHJvcChQX05PX1hQLDEpOworICAgICAgIH0KKworICAgICBEYW1pdCBrYW5uIFBfWFAgdHJvdHpkZW0gZWluZW4gV2VydCBpbSBOUEMgaGFiZW4sIGRlcgorICAgICBFcnN0a2lsbHN0dWZlbnB1bmt0ZSBmdWVyIExlYmV3ZXNlbiBhdXRvbWF0aXNjaCBlaW50cmFlZ3QhCisKKyAgICAgQXVjaCBmdWVyIGRhcyBrdXJ6emVpdGlnZSBVbnRlcmJpbmRlbiBkZXIgVmVyZ2FiZSB2b24KKyAgICAgRXJmYWhydW5nc3B1bmt0ZW4gaXN0IGRpZXNlIFByb3BlcnR5IHNpbm52b2xsZXIsIGFscyBQX1hQIGltIE5QQworICAgICBhdWYgMCB6dSBzZXR6ZW4uCisKK0JFTUVSS1VOR0VOOgorICAgICBBdWNoIGRpZSBWZXJnYWJlIHZvbiBFcnN0a2lsbHN0dWZlbnB1bmt0ZW4ga2FubiBleHBsaXppdCB1bnRlcmJ1bmRlbgorICAgICB3ZXJkZW4uIEhpZXJmdWVyIGdpYnQgZXMgZGllIGFlaG5saWNoIGdlYXJ0ZXRlIFByb3BlcnR5IFBfTk9fU0NPUkUuCisKK1NJRUhFIEFVQ0g6CisgICAgIEZ1bmt0aW9uZW46ICBBZGRFeHAoKSwgRGlzdHJpYnV0ZUV4cCgpLCBkb19kYW1hZ2UoKQorICAgICBQcm9wZXJ0aWVzOiAgUF9YUCwgUF9MQVNUX1hQCisgICAgIFZlcndhbmR0OiAgICBQX05PX1NDT1JFCisgICAgIFNvbnN0aWdlczogICBQX1RPVEFMX1dDLCBjcmVhdGVfZGVmYXVsdF9ucGMoKQorCisxNC5GZWIgMjAwNyBHbG9pbnNvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX05QQyBiL2RvYy9wcm9wcy9QX05QQwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWQxMjcwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfTlBDCkBAIC0wLDAgKzEsOCBAQAorTkFNRToKKyAgICBQX05QQyAgICAgICAgICAgICAgICAgICAgICAgICAiaXNfbnBjIiAgICAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcHJvcGVydGllcy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgR2VzZXR6dCBiZWkgTW9uc3Rlcm4uCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9OUENfRkFTVEhFQUwgYi9kb2MvcHJvcHMvUF9OUENfRkFTVEhFQUwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y1ODhiOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX05QQ19GQVNUSEVBTApAQCAtMCwwICsxLDIxIEBACitOQU1FOgorCVBfTlBDX0ZBU1RIRUFMCQkJIm5wY19mYXN0aGVhbCIKKworREVGSU5JRVJUIElOOgorCS9zeXMvcHViLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICAgICBEdXJjaCBzZXR6ZW4gZGllc2VyIFByb3BlcnR5IGluIGVpbmVyIEtuZWlwZSBzb3JndCBtYW4gZGFmdWVyLCBkYXNzIAorICAgICAgICBiZWkgTlBDcywgZGllIGRvcnQgInRhbmtlbiIsIGRpZSBMZWJlbnMtIHVuZCBLb256ZW50cmF0aW9uc3B1bmt0ZQorICAgICAgICBkaXJla3QgZXJob2VodCB3ZXJkZW4gdW5kIG5pY2h0LCB3aWUgYmVpIHVuZ2VzZXR6dGVyIFByb3BlcnR5LCBpbgorICAgICAgICBkaWUgamV3LiBCdWZmZXIgZ2VzY2hyaWViZW4gd2VyZGVuLgorCitCRU1FUktVTkdFTjoKKyAgICAgICAgRGllIEJlbnV0enVuZyBkaWVzZXIgUHJvcGVydHkgc29sbHRlIG5pY2h0IHVuYmVkaW5ndCB6dW0gU3RhbmRhcmQKKyAgICAgICAgd2VyZGVuLgorCitTSUVIRSBBVUNIOgorCS9zdGQvcm9vbS9wdWIuYworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBXZWQgU2VwIDI5IDEzOjU4OjAwIDE5OTkgYnkgUGFyYWNlbHN1cwpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfTlJfSEFORFMgYi9kb2MvcHJvcHMvUF9OUl9IQU5EUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDgyN2E5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfTlJfSEFORFMKQEAgLTAsMCArMSwzMSBAQAorUF9OUl9IQU5EUworTkFNRToKKyAgICAgUF9OUl9IQU5EUyAibnJfaGFuZHMiCisKK0RFRklOSUVSVCBJTjoKKyAgICAgPHdlYXBvbi5oPgorCitCRVNDSFJFSUJVTkc6CisgICAgIFdpZXZpZWxlIEhhZW5kZSBtdXNzIG1hbiBmcmVpIGhhYmVuLCB1bSBkaWUgV2FmZmUgenVlY2tlbiBvZGVyIGRlbgorICAgICBTY2hpbGQgdHJhZ2VuIHp1IGtvZW5uZW4/CisgICAgIERpZXNlciBXZXJ0IG11c3MgbWluZGVzdGVucyAxIGJldHJhZ2VuIQorCisgICAgIFNvbGxlbiBTcGllbGVyIGRpZSBXYWZmZSBiZW51dHplbiBrb2VubmVuLCBzbyBzaW5kIGhpZXIgbnVyIGRpZSBXZXJ0ZSAxCisgICAgIHVuZCAyIG1vZWdsaWNoLiBGYWxscyBkaWUgV2FmZmUgbnVyIHZvbiBNb25zdGVybiBiZW51dHpiYXIgc2VpbiBzb2xsLAorICAgICBrYW5uIG1hbiBoaWVyIGF1Y2ggaG9laGVyZSBXZXJ0ZSBlaW50cmFnZW4gKGRhenUgbXVzcyBtYW4gYmVpbSBNb25zdGVyCisgICAgIFBfTUFYX0hBTkRTIGVudHNwcmVjaGVuZCBob2NoIHNldHplbikuIEFscyBCZWlzcGllbCBzZWkgaGllciBudXIgZGFzCisgICAgIHZpZXJoYWVuZGlnZSBTY2h3ZXJ0IGF1cyBkZW0gRnJpZWRob2YgZ2VuYW5udC4KKworICAgICBEZWZhdWx0bWFlc3NpZyBzaW5kIGFsbGUgV2FmZmVuIFp3ZWloYWVuZGVyLgorCisgICAgIERpZXNlIFByb3BlcnR5IGthbm4gYXVjaCBiZWkgWmF1YmVybiBiZW51dHp0IHdlcmRlbiwgYmVpIGRlbmVuIG1hbiBlaW5lCisgICAgIG9kZXIgbWVocmVyZSBIYWVuZGUgZnJlaSBoYWJlbiBtdXNzLgorCitTSUVIRSBBVUNIOgorICAgICBQX0hBTkRTLCBQX0hBTkRTX1VTRURfQlkKKyAgICAgUF9NQVhfSEFORFMsIFBfVVNFRF9IQU5EUywgUF9GUkVFX0hBTkRTCisgICAgIFVzZUhhbmRzLCBGcmVlSGFuZHMKKyAgICAgL3N0ZC93ZWFwb24uYywgL3N0ZC9zcGVsbGJvb2suYworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBTdW4gTWF5IDE5IDE1OjAwOjAyIDE5OTYgYnkgV2FyZ29uCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9PUkFLRUwgYi9kb2MvcHJvcHMvUF9PUkFLRUwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YzODNkYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX09SQUtFTApAQCAtMCwwICsxLDkgQEAKK05BTUU6CisgICAgUF9PUkFLRUwgICAgICAgICAgICAgICAgICAgICAgIm9yYWtlbCIgICAgICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3Byb3BlcnRpZXMuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIFdlbm4gZGllc2UgUHJvcGVydHkgZ2VzZXR6dCBpc3QsIGthbm4gZGVyIFdhbmRlcmVyIGluIGRpZXNlbgorICAgICBSYXVtIGhpbmVpbi4KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX09SSUdfRklMRV9OQU1FIGIvZG9jL3Byb3BzL1BfT1JJR19GSUxFX05BTUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA2NDM2MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX09SSUdfRklMRV9OQU1FCkBAIC0wLDAgKzEsOCBAQAorTkFNRToKKyAgICBQX09SSUdfRklMRV9OQU1FICAgICAgICAgICAgICAgICJvcmlnaW5hbF9vYmplY3RfbmFtZSIgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcHJvcGVydGllcy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgSW4gZWluZXIgTGVpY2hlIGRlciBGaWxlbmFtZSBkZXMgR2VzdG9yYmVuZW4uCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9PUklHX05BTUUgYi9kb2MvcHJvcHMvUF9PUklHX05BTUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZhNWQ3MwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX09SSUdfTkFNRQpAQCAtMCwwICsxLDggQEAKK05BTUU6CisgICAgUF9PUklHX05BTUUgICAgICAgICAgICAgICAgICAgIm9yaWdpbmFsX25hbWUiICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3Byb3BlcnRpZXMuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIEluIGVpbmVyIExlaWNoZSBkZXIgTmFtZSBkZXMgR2VzdG9yYmVuZW4uIChuYW1lKFJBVykpCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9QQVJBIGIvZG9jL3Byb3BzL1BfUEFSQQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2NjOTJiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfUEFSQQpAQCAtMCwwICsxLDU0IEBACitOQU1FOgorICAgIFBfUEFSQSAgICAgICAgICAgICAgICAgICAgICAgICJwYXJhIiAgICAgICAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9wcm9wZXJ0aWVzLmgKKworQkVTQ0hSRUlCVU5HOgorICAgIE51bW1lciBkZXIgUGFyYWxsZWx3ZWx0LCBpbiBkZXIgc2ljaCBlaW4gU3BpZWxlciBiZWZpbmRldC4KKworICAgIElzdCBkaWUgUHJvcGVydHkgUF9QQVJBIGF1ZiBOdWxsIGdlc2V0enQsIHNvIGJlZmluZGV0IHNpY2ggZGVyIFNwaWVsZXIgaW4KKyAgICBkZXIgJ05vcm1hbHdlbHQnLiBHaWJ0IGVzIGJlaSBlaW5lciBCZXdlZ3VuZyBkaWVzZXMgU3BpZWxlcnMgbWVocmVyZQorICAgIG1vZWdsaWNoZSBaaWVscmFldW1lIG1pdCBpZGVudGlzY2hlbSBOYW1lbiBhYmVyIHVudGVyc2NoaWVkbGljaGVuIEVuZHVuZ2VuCisgICAgJ25hbWUuYycsICduYW1lXjEuYycsICduYW1lXjIuYycgZXRjLiwgc28gd2lyZCBkZXIgU3BpZWxlciBpbiBkZW4gUmF1bQorICAgICduYW1lLmMnIGJld2VndC4gCisKKyAgICBXaXJkIGRpZSBQcm9wZXJ0eSBQX1BBUkEgYXVmIGVpbmVuIFdlcnQgbj4wIGdlc2V0enQsIHNvIGxhbmRldCBkZXIgU3BpZWxlcgorICAgIGJlaSBlaW5lciBCZXdlZ3VuZyBpbSBSYXVtICduYW1lXm4uYycuIElzdCBrZWluIFJhdW0gbWl0IGVudHNwcmVjaGVuZGVyCisgICAgRW5kdW5nIHZvcmhhbmRlbiwgd2lyZCBkZXIgU3BpZWxlciBzdGF0dGRlc3NlbiBpbiBkZW4gTm9ybWFsd2VsdHJhdW0KKyAgICBiZXdlZ3QuCisKKyAgICBEaWVzZSBQcm9wIGthbm4gYXVjaCBpbiBlaW5lbSBWaXJ0dWFsIENvbXBpbGVyIGdlc2V0enQgd2VyZGVuLiBJbiBkaWVzZW0KKyAgICBGYWxsIHNjaHJhZW5rdCBzaWUgZGllIERpbWVuc2lvbmVuIGVpbiwgaW4gZGVuZW4gZGVyIFZDIE9iamVrdGUgZXJ6ZXVndC4KKyAgICBEaWUgUHJvcCBrYW5uIGVpbmUgZWluemVsbmUgWmlmZmVyIChJbnQpIG9kZXIgZWluIEFycmF5IHZvbiBJbnRzIAorICAgIGF1Zm5laG1lbiwgZGFubiBpc3QgZGVyIFZDIGZ1ZXIgYWxsZSBhbmdlZ2ViZW4gRGltZW5zaW9uZW4genVzdGFlbmRpZy4gCisgICAgRWluIGxlZXJlcyBBcnJheSBlcmxhdWJ0IGdhciBrZWluZSBQYXJhLU9iamVrdGUuCisKK0FOTUVSS1VORzoKKyAgICBEaWUgRW5kdW5nICdeMCcga2VubnplaWNobmV0IF9uaWNodF8gZGllIE5vcm1hbHdlbHQuIFNvIGxhbmdlIGtlaW4gQXVzZ2FuZworICAgIGV4cGxpeml0IGF1ZiBkZW4gUmF1bSAnbmFtZV4wLmMnIHZlcndlaXN0LCB3aXJkIGtlaW4gU3BpZWxlciBkZW4gUmF1bQorICAgIGJldHJldGVuIGtvZW5uZW4uIERlc2hhbGIga2FubiBtYW4gZGllIEVuZHVuZyAnXjAnIHouQi4gZGF6dSBiZW51dHplbiwgdW0KKyAgICBlaWdlbmUgU3RhbmRhcmRyYWV1bWUgZnVlciBlaW4gR2ViaWV0IHp1IHNjaHJlaWJlbiwgZGllIGRhbm4gc293b2hsIHZvbgorICAgIGRlbiBOb3JtYWwtIGFscyBhdWNoIHZvbiBkZW4gUGFyYWxsZWx3ZWx0cmFldW1lbiBpbmhlcml0ZXQgd2VyZGVuLgorCisgICAgUmFldW1lIG1pdCBFbmR1bmdlbiAnXm4uYycsIGJlaSBkZW5lbiAnbicga2VpbmUgcG9zaXRpdmUgZ2FuemUgWmFobCBpc3QsCisgICAgd2VyZGVuIG5pY2h0IGJlYWNodGV0LgorCisgICAgRnVlciBkaWUgRW50c2NoZWlkdW5nLCBpbiB3ZWxjaGVtIFJhdW0gZWluIFNwaWVsZXIgaW4gQWJoYWVuZ2lna2VpdCB2b24KKyAgICBQX1BBUkEgbGFuZGV0LCBpc3QgZGllIEZ1bmt0aW9uIG1vdmUoKSB6dXN0YWVuZGlnLiBBbHMgTWFnaWVyIG11c3MgbWFuIHNpY2gKKyAgICBkYXJ1bSBuaWNodCBnZXNvbmRlcnQga3VlbW1lcm4uIERhcyBoZWlzc3QgYWJlciBhdWNoLCBkYXNzIGJlaW0gQW5zY2hsdXNzCisgICAgZWluZXMgTm9ybWFsd2VsdHJhdW1lcyBhdXRvbWF0aXNjaCBhbGxlIGluIGRlbSBWZXJ6ZWljaG5pcyBtaXQgZ2xlaWNoZW0KKyAgICBOYW1lbiB2b3JoYW5kZW5lbiBQYXJhbGxlbHdlbHRyYWV1bWUgbWl0IGFuZ2VzY2hsb3NzZW4gd2VyZGVuLgorCisgICAgU29sbGVuIGVpbnplbG5lIFBhcmFsbGVsd2VsdHJhZXVtZSBub2NoIG5pY2h0IGFuZ2VzY2hsb3NzZW4gd2VyZGVuLCBzbyBtdXNzCisgICAgaW4gaWhuZW4gZGllIFByb3BlcnR5IFBfTk9fUExBWUVSUyBnZXNldHp0IHdlcmRlbi4gRGllc2UgUmFldW1lIHNpbmQgZGFubgorICAgIG51ciBkdXJjaCBNYWdpZXIgdW5kIFRlc3RzcGllbGVyIHp1IGJldHJldGVuICh1bmQgenUgdGVzdGVuKS4KKworICAgIEluIFBhcmF3ZWx0cmFldW1lbiBsaWVmZXJ0IFBfUEFSQSAnbicgenVydWVjay4KKyAgICBNYW4ga2FubiBhbHNvIHouQi4gaW4gTlBDcyBlaW5mYWNoIHVlYmVyIGVudmlyb25tZW50KCktPlF1ZXJ5UHJvcChQX1BBUkEpIAorICAgIGFiZnJhZ2VuLCBpbiB3ZWxjaGVyIFBhcmF3ZWx0IHNpY2ggZGllc2VyIGdlcmFkZSBiZWZpbmRldC4KKworU0lFSEUgQVVDSDoKKyAgICBQX05PX1BMQVlFUlMsIG1vdmUsIHBhcmFyYWV1bWUKKyAgICAKKzI1LkphbiAyMDE1IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9QQVJSWSBiL2RvYy9wcm9wcy9QX1BBUlJZCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNTUwZGYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9QQVJSWQpAQCAtMCwwICsxLDMxIEBACitQX1BBUlJZCisKK05BTUU6CisgICAgIFBfUEFSUlkgInBhcnJ5IgorCitERUZJTklFUlQgSU46CisgICAgIDxjb21iYXQuaD4KKworQkVTQ0hSRUlCVU5HOgorICAgICBEaWVzZSBQcm9wZXJ0eSBsZWd0IGZlc3QsIGlud2llZmVybiBlaW5lIFdhZmZlIGFscyBQYXJpZXJ3YWZmZQorICAgICBnZW51dHp0IHdlcmRlbiBrYW5uLiBNb2VnbGljaGUgV2VydGU6CisKKyAgICAgICAgIFBBUlJZX05PVCAgICAgRWluZSByZWluZSBBbmdyaWZmc3dhZmZlIG9obmUgUGFyaWVyZnVua3Rpb24uCisKKyAgICAgICAgIFBBUlJZX1RPTyAgICAgRWluZSBrb21iaW5pZXJ0ZSBBbmdyaWZmcy0gdW5kIFBhcmllcndhZmZlLgorCisgICAgICAgICBQQVJSWV9PTkxZICAgIEVpbmUgcmVpbmUgUGFyaWVyd2FmZmUuIERpZXNlIGthbm4genVzYWV0emxpY2gKKyAgICAgICAgICAgICAgICAgICAgICAgenUgZWluZXIgbm9ybWFsZW4gV2FmZmUgZ2V6dWVja3Qgd2VyZGVuLgorCisgICAgIE1hbiBzb2xsdGUgbnVyIGRpZSBpbiA8Y29tYmF0Lmg+IGRlZmluaWVydGVuIEtvbnN0YW50ZW4gdmVyd2VuZGVuLgorCitCRU1FUktVTkdFTjoKKyAgICAgRHVyY2ggZGllc2UgUHJvcGVydGllIGxhZXNzdCBzaWNoIF9rZWluXyBQYXJhZGUtQm9udXMgZnVlciBUcnZlcyAKKyAgICAgc2V0emVuISBBbGxlIEdpbGRlbiBoYWJlbiBldHdhcyBkYXZvbi4gVm9yIFZlcndlbmR1bmcgYml0dGUgbWl0CisgICAgIGRlciBPYmpla3QtQmFsYW5jZSBhYnNwcmVjaGVuLgorCitTSUVIRSBBVUNIOgorICAgICAvc3RkL3dlYXBvbi9jb21iYXQuYworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBTYXQgSnVuIDAxIDEzOjI4OjQ1IDIwMDEgYnkgVGlsbHkKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1BBUlJZX1dFQVBPTiBiL2RvYy9wcm9wcy9QX1BBUlJZX1dFQVBPTgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODczYmZiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfUEFSUllfV0VBUE9OCkBAIC0wLDAgKzEsMTcgQEAKK1BfUEFSUllfV0VBUE9OCisKK05BTUU6CisgICAgIFBfUEFSUllfV0VBUE9OICJwYXJyeV93ZWFwb24iCisKK0RFRklOSUVSVCBJTjoKKyAgICAgPGNvbWJhdC5oPgorCitCRVNDSFJFSUJVTkc6CisgICAgIERpZXNlIFByb3BlcnR5IGdpYnQgYW4sIHdlbGNoZSBQYXJpZXJ3YWZmZSBlaW4gU3BpZWxlciBkZXJ6ZWl0CisgICAgIGdlenVlY2t0IGhhdC4KKworU0lFSEUgQVVDSDoKKyAgICAgL3N0ZC93ZWFwb24vY29tYmF0LmMsIC9zdGQvbGl2aW5nL2NvbWJhdC5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFNhdCBKdW4gMjYgMTU6MjM6MDAgMTk5OSBieSBQYXJhY2Vsc3VzCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9QRUFDRV9ISVNUT1JZIGIvZG9jL3Byb3BzL1BfUEVBQ0VfSElTVE9SWQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2NiMmQyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfUEVBQ0VfSElTVE9SWQpAQCAtMCwwICsxLDQyIEBACitQX1BFQUNFX0hJU1RPUlkKKworTkFNRToKKyAgICAgUF9QRUFDRV9ISVNUT1JZICAgICAgIl9wZWFjZV9oaXN0b3J5IgorCitERUZJTklFUlQgSU46CisgICAgIC9zeXMvbGl2aW5nL2NvbWJhdC5oCisKK0JFU0NIUkVJQlVORzoKKyAgICBJbiBkaWVzZXIgUHJvcCB3aXJkIG5hY2ggR2lsZGVuIGdldHJlbm50IGdlc3BlaWNoZXQsIHdpZSBvZnQgZGFzIExlYmV3ZXNlbgorICAgIGluIGxldHp0ZXIgWmVpdCBiZWZyaWVkZXQgd29yZGVuIGlzdC4gRGllc2UgSW5mb3JtYXRpb24gZ2VodCBpbiBkaWUKKyAgICBDaGFuY2UgYXVmIGVpbmUgenVrdWVuZnRpZ2UgQmVmcmllZHVuZyBlaW4uCisgICAgRGllIFphZWhsZXIgd2VyZGVuIGltIER1cmNoc2Nobml0dCBhbGxlIDI3MDBzIHVtIDItMyByZWR1emllcnQuCisgICAgRGllIERhdGVuc3RydWt0dXIgaXN0IGVpbiBBcnJheSwgd2VsY2hlcyBlaW5lbiBaZWl0c3RlbXBlbCBhbHMgZXJzdGVzCisgICAgRWxlbWVudCB1bmQgZWluIE1hcHBpbmcgYWxzIHp3ZWl0ZXMgZW50aGFlbHQuIERhcyBNYXBwaW5nIGVudGhhZWx0IHVudGVyCisgICAgZGVuIEdpbGRlbm5hbWVuIGFscyBLZXlzIGRlbiBnYW56emFobGlnZW4gWmFlaGxlciBlcmZvbGdyZWljaGVyCisgICAgQmVmcmllZHVuZ2VuIHZvbiBTcGllbGVybiBkaWVzZXIgR2lsZGUuCisKK0JFTUVSS1VOR0VOOgorICAgICogRGllc2UgUHJvcGVydHkgc29sbHRlIG5pZW1hbHMgZGlyZWt0IGdlYWVuZGVydCB3ZXJkZW4uIEJpdHRlIGdyZWlmdCBhbHNvCisgICAgICBudXIgbGVzZW5kIGRhcmF1ZiB6dS4gU29sbHRlIGhpZXJtaXQgU2NoaW5kbHVkZXIgZ2V0cmllYmVuIHdlcmRlbiwKKyAgICAgIHdlcmRlbiBkaWUgRGF0ZW4gdm9yIGV4dGVybmVyIEFlbmRlcnVuZyBnZXNjaHVldHp0LgorICAgICogRGllIERhdGVuc3RydWt0dXIgaW4gZGllc2VyIFByb3Aga2FubiBpbiBadWt1bmZ0IHUuVS4gZ2VhZW5kZXJ0IHdlcmRlbi4KKyAgICAgIERhaGVyIGFlbmRlcnQgc2llIGFtIGJlc3RlbiBhdWNoIG5pY2h0IGltIGVpZ2VuZW4gTlBDIG9kZXIgc2VpZCBkYXJhdWYKKyAgICAgIGdlZmFzc3QsIGlyZ2VuZHdhbm4gSGFuZCBhbmxlZ2VuIHp1IG11ZXNzZW4uCisgICAgKiBEaWUgQWt0dWFsaXNpZXJ1bmcgKGF1Y2ggZGllIFJlZHVrdGlvbikgZmluZGV0IGltIFp1Z2UgZWluZXMKKyAgICAgIFF1ZXJ5UGFjaWZ5KCkgc3RhdHQsIG5pY2h0IGltIFJlc2V0IGRlcyBMZWJld2VzZW5zLgorCitCRUlTUElFTDoKKyAgICBJbiBQX1BFQUNFX0hJU1RPUlkgc3RlaHQ6CisgICAgKHsxMjA5NjU0NTk3LCAoWyJ6YXViZXJlciI6IDMsICJrbGVydXMiOiA0XSkgfSkKKyAgICBCZWkgZGVyIEJlcmVjaG51bmcgZGVyIG5hZWNoc3RlbiBCZWZyaWVkZS1DaGFuY2UgZ2VoZW4gYmVpIFphdWJlcmVybiBhbHNvCisgICAgMyBlcmZvbGdyZWljaGUgVmVyc3VjaGUsIGJlaSBLbGVyaWtlcm4gNCBlcmZvbGdyZWljaGUgVmVyc3VjaGUgZWluLgorICAgIERlciBaZWl0d2VydCBhbiBlcnN0ZXIgU3RlbGxlIGRlcyBBcnJheXMgd2lyZCBkZXIgYmVpIGRlciBCZXJlY2hudW5nIGRlcgorICAgIG5hZWNoc3RlbiBSZWR1a3Rpb24gZGVyIFphZWhsZXIgYmVydWVja3NpY2h0aWd0LiAoR2VuYXVlczogcy4gY29tYmF0LmMpCisKK1NJRUhFIEFVQ0g6CisgICAgIFBfUEVBQ0VfQUNDRVBUCisgICAgIFF1ZXJ5UGFjaWZ5KCkKKyAgICAgL3N0ZC9saXZpbmcvY29tYmF0LmMKKworMDEuMDUuMjAwOCwgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfUEVSTV9TVFJJTkcgYi9kb2MvcHJvcHMvUF9QRVJNX1NUUklORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzkwNGI3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfUEVSTV9TVFJJTkcKQEAgLTAsMCArMSwxMSBAQAorTkFNRToKKyAgICBQX1BFUk1fU1RSSU5HICAgICAgICAgICAgICAgICAicGVybV9zdHJpbmciICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcGxheWVyL2NvbW0uaAorCitCRVNDSFJFSUJVTkc6CisgICAgIEZ1ZXIgU3ByYWNoZmx1ZWNoZSwgUHJvcGVydHkgaXN0IGltIFNwaWVsZXItT2JqZWt0IHp1IHNldHplbi4gSW4gZGVtCisgICAgIE9iamVrdCwgZGFzIGluIFBfUEVSTV9TVFJJTkcgZ2VzcGVpY2hlcnQgaXN0LCB3aXJkIGJlaSBTcHJhY2hiZWZlaGxlbgorICAgICBwZXJtdXRhdGVfc3RyaW5nKHN0cikgYXVmZ2VydWZlbiB1bmQgZGVyIHp1cnVlY2tnZWdlYmVuZSBTdHJpbmcgCisgICAgIHN0YXR0ZGVzc2VuIGF1c2dlZ2ViZW4uCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9QSUNLX01TRyBiL2RvYy9wcm9wcy9QX1BJQ0tfTVNHCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3N2Q1MDgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9QSUNLX01TRwpAQCAtMCwwICsxLDYwIEBACitQX1BJQ0tfTVNHCitOQU1FOgorICAgICBQX1BJQ0tfTVNHCQkJCSJwaWNrX21lc3NhZ2UiCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N5cy9saXZpbmcvcHV0X2FuZF9nZXQuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIE1pdCBQX1BJQ0tfTVNHIGthbm4gbWFuIGRpZSBNZWxkdW5nLCBkaWUgbWFuIGJlaW0gQXVmbmVobWVuIGVpbmVzCisgICAgIE9iamVrdGVzIGJla29tbXQsIG1vZGlmaXppZXJlbi4KKworICAgICBGb2xnZW5kZSBXZXJ0ZSBzaW5kIG1vZWdsaWNoOgorCisgICAgIG8gMAorICAgICAgIEVzIHdpcmQgZWluZSBTdGFuZGFyZG1lbGR1bmcgYXVzZ2VnZWJlbi4gRGllcyBpc3QgVm9yZWluc3RlbGx1bmcuCisKKyAgICAgbyBOT19QTkdfTVNHICAgICAgID09IC0xCisgICAgICAgRXMgd2lyZCBrZWluZXJsZWkgTWVsZHVuZyBhdXNnZWdlYmVuCisKKyAgICAgbyBFaW4gQXJyYXkgYXVzIFN0cmluZ3MKKyAgICAgICBEZXIgZXJzdGUgU3RyaW5nIHdpcmQgYW4gZGVuIFNwaWVsZXIgYXVzZ2VnZWJlbiwgZGVyIHp3ZWl0ZQorICAgICAgIChvcHRpb25hbGUpIGFuIGRlbiBSYXVtLgorCisgICAgICAgRGllIFN0cmluZ3Mgd2VyZGVuIGR1cmNoIGRpZSBGdW5rdGlvbiByZXBsYWNlX3BlcnNvbmFsKCkgZ2VwYXJzdC4KKwlPYmpla3QxIC0gU3BpZWxlcgorICAgICAgICBPYmpla3QyIC0gZGFzIE9iamVrdCwgZGFzIGdlbm9tbWVuIHdpcmQKKworICAgICAgIFdpcmQgZGVyIHp3ZWl0ZSBTdHJpbmcgbmljaHQgYW5nZWdlYmVuLCBlcmZvbGd0IGtlaW5lIE1lbGR1bmcgYW4gZGVuCisgICAgICAgUmF1bS4KKworQkVJU1BJRUw6CisgICAgIHZvaWQgY3JlYXRlKCkgeworICAgICAgLi4uCisgICAgICBTZXRQcm9wKCBQX1NIT1JULCAiRXR3YXMgU2FuZCIgKTsKKyAgICAgIFNldFByb3AoIFBfTE9ORywgYnJlYWtfc3RyaW5nKAorICAgICAgICJFaW4gd2VuaWcgbWFnaXNjaGVyIFNhbmQuIFNlaHIgZmVpbmtydWVtZWxpZy4iLDc4ICkpOworCisgICAgICBTZXRQcm9wKCBQX05BTUUsICJTYW5kIiApOworICAgICAgQWRkSWQoICh7InNhbmQifSkgKTsKKyAgICAgIFNldFByb3AoIFBfR0VOREVSLCBNQUxFICk7CisKKyAgICAgIFNldFByb3AoIFBfUElDS19NU0csICh7CisgICAgICAgIkR1IHNjaGF1ZmVsc3QgQFdFTjIgaW4gZGVpbmUgSGFuZC4iLAorICAgICAgICJAV0VSMSBzY2hhdWZlbHQgQFdFTjIgaW4gZWluZSBIYW5kLiJ9KSk7CisgICAgICAuLi4KKyAgICAgfQorCisgICAgIERhcyBnYW56ZSBmdWVocnQgYmVpIFVnYXJzICJuaW1tIHNhbmQiIHp1IGZvbGdlbmRlbgorICAgICBNZWxkdW5nZW46CisKKyAgICAgVWdhcjogIkR1IHNjaGF1ZmVsc3QgZGVuIFNhbmQgaW4gZGVpbmUgSGFuZC4iCisgICAgIFJhdW06ICJVZ2FyIHNjaGF1ZmVsdCBkZW4gU2FuZCBpbiBlaW5lIEhhbmQuIgorCitTSUVIRSBBVUNIOgorICAgICBBZWhubGljaGVzOiBQX0RST1BfTVNHLCBQX1BVVF9NU0csIFBfR0lWRV9NU0csIFBfV0VBUl9NU0csIFBfV0lFTERfTVNHCisgICAgIEZlaGxlcjogICAgIFBfVE9PX0hFQVZZX01TRywgUF9FTlZfVE9PX0hFQVZZX01TRywgUF9UT09fTUFOWV9NU0csCisgICAgICAgICAgICAgICAgIFBfTk9JTlNFUlRfTVNHLCBQX05PTEVBVkVfTVNHLCBQX05PRFJPUCwgUF9OT0dFVCAKKyAgICAgU29uc3RpZ2VzOiAgcmVwbGFjZV9wZXJzb25hbChFKSwgcGlja19vYmooTCksIC9zdGQvbGl2aW5nL3B1dF9hbmRfZ2V0LmMKKworMTQuIE1hZXJ6IDIwMDQgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1BJTEVfTkFNRSBiL2RvYy9wcm9wcy9QX1BJTEVfTkFNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTRkYzcyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfUElMRV9OQU1FCkBAIC0wLDAgKzEsOSBAQAorTkFNRToKKyAgICBQX1BJTEVfTkFNRSAgICAgICAgICAgICAgICAgICAiZmlsZV9uYW1lIiAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9jb250YWluZXIvcHJvcGVydGllcy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgSW4gZWluZXIgTGVpY2hlIGRlciBOYW1lIGRlcyBHZXN0b3JiZW5lbiBpbSBEYXRpdi4gKG5hbWUoV0VNKSkKKyAgICAgV2lyZCB2b20gSGF1ZmVuIGJlbm9ldGlndC4KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1BMQVlFUl9MSUdIVCBiL2RvYy9wcm9wcy9QX1BMQVlFUl9MSUdIVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGQ1OWI1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfUExBWUVSX0xJR0hUCkBAIC0wLDAgKzEsMjggQEAKK05BTUU6CisgICAgUF9QTEFZRVJfTElHSFQgICAgICAgICAgICAgICAgICAgICAgICJwbGF5ZXJfbGlnaHQiCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3Byb3BlcnRpZXMuaAorCitCRVNDSFJFSUJVTkc6CisgICAgR2lidCBkZW4gTGljaHRsZXZlbCBhbiwgbWl0IGRlbSBlaW4gTGViZXdlc2VuIHNpZWh0LCBlaW4gQWJmcmFnZW4gZGllc2VyCisgICAgUHJvcGVydHkga2FubiB6LkIuIHNpbm52b2xsIHNlaW4gd2VubiBtYW4gYWJmcmFnZW4gd2lsbCBvYiBlaW4gU3BpZWxlcgorICAgIGdlbnVnIExpY2h0IGRhYmVpIGhhdCB1bSBlaW4gYmVzdGltbXRlcyBEZXRhaWwgdW50ZXJzdWNoZW4genUga29lbm5lbi4KKworICAgIEJpdHRlIF9udXJfIHVlYmVyIFF1ZXJ5UHJvcCBhdWYgZGllc2UgUHJvcGVydHkgenVncmVpZmVuLAorICAgIGRhIGRhcyBMaWNodGxldmVsIGdnZi4gbmV1IGJlcmVjaG5ldCB3ZXJkZW4gbXVzcyEKKworICAgIEVpbiBkaXJla3RlcyBzZXR6ZW4gZGllc2VyIFByb3BlcnR5IGlzdCBOSUNIVCBtb2VnbGljaC4gRXMgaXN0IGplZG9jaAorICAgIG1vZWdsaWNoIGVudHdlZGVyIGVpbmUgQ2xvc3VyZSB6dSBiZW51dHplbiBvZGVyIGRlbiBXZXJ0IHVlYmVyIGVpbmVuCisgICAgUF9MSUdIVF9NT0RJRklFUiB6dSB2ZXJhZW5kZXJuLgorCisgICAgVW0genUgZXJyZWljaGVuLCBkYXMgZWluIE5QQyBOYWNodHNpY2h0IGJla29tbXQsIGdpYnQgZXMgbnVuIDMgVmFyaWFudGVuLgorICAgIC0gZWluZSBjbG9zdXJlOgorICAgICAgICBTZXQoUF9QTEFZRVJfTElHSFQsIGZ1bmN0aW9uIGludCAoKSB7cmV0dXJuIDE7fSAsIEZfUVVFUllfTUVUSE9EKSAKKyAgICAgIGRpZXNlcyBiZWRldXRldCwgZGFzcyBkZXIgTlBDIGluIGplZGVyIER1bmtlbGhlaXQgcGVyZmVrdCBzZWhlbiBrYW5uLgorICAgIC0gZGFzIHNldHplbiB2b24gZWluZW0gUF9MSUdIVF9NT0RJRklFUgorICAgIC0gZGFzIGJlbnV0emVuIGRlcyBzdGRza2lsbHMuIEhpZXJ6dSBzY2hyZWlidCBtYW4gaW4gZGFzIGNyZWF0ZSgpIGRlcworICAgICAgTlBDcyBlaW5mYWNoIGVpbjogTW9kaWZ5U2tpbGwoU0tfTklHSFRWSVNJT04sIDEwMDAwKTsKKworU0lFSEUgQVVDSDoKKyAgICBQX0xJR0hUX01PRElGSUVSLCBQX0xJR0hULCBQX1RPVEFMX0xJR0hULCBQX0lOVF9MSUdIVCwgQ2Fubm90U2VlKCkKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1BMVVJBTCBiL2RvYy9wcm9wcy9QX1BMVVJBTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTVlM2E1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfUExVUkFMCkBAIC0wLDAgKzEsMzkgQEAKK05BTUU6CisgICAgUF9QTFVSQUwgICAgICAgICAgICAgICAgICAgICAgInBsdXJhbCIKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvdGhpbmcvbGFuZ3VhZ2UuaAorCitCRVNDSFJFSUJVTkc6CisgICAgTWl0IEhpbGZlIHZvbiBQX1BMVVJBTCBrb2VubmVuIGF1Y2ggbmljaHQgVW5pdCBPYmpla3RlIGFscyBQbHVyYWxvYmpla3RlCisgICAgbWFya2llcnQgd2VyZGVuLiBCZWkgZWluZW0gV2VydCA+IDEgd2lyZCBkZXIgV2VydCBhdXNzZXJkZW0gYXVjaCBub2NoIGluCisgICAgZGVuIE5hbWVuIGVpbmdlZnVlZ3QuIFNvbGx0ZSBtYW4gaW4gZWlnZW5lbSBDb2RlIHp1bGFzc2VuIHdvbGxlbiwgZGFzCisgICAgZXR3YXMgbWl0IGJlc3RpbW10ZW4gT2JqZWt0ZW4gZ2VzY2hpZWh0LCBkYW5uIHNvbGx0ZSBtYW4gZGllIFZlcmJlbgorICAgIGVudHNwcmVjaGVuIGtvbmp1Z2llcmVuLgorCitCRU1FUktVTkdFTjoKKyAgICBXaXJrdCBuaWNodCBhdWYgVG9kZXNtZWxkdW5nZW4gLT4gc2llaGUgZGFmdWVyIFBfS0lMTF9NU0cKKworQkVJU1BJRUxFOgorICAgIFNldFByb3AoUF9OQU1FLCAiU3RpZWZlbCIpOyBTZXRQcm9wKFBfUExVUkFMLCAyKTsKKyAgICBuYW1lKFdFUiwgMSkgLT4gImRpZSB6d2VpIFN0aWVmZWwiCisKKyAgICBTZXRQcm9wKFBfTkFNRSwgIlN0aWVmZWwiKTsgU2V0UHJvcChQX1BMVVJBTCwgMSk7CisgICAgbmFtZShXRVIsIDEpIC0+ICJkaWUgU3RpZWZlbCIKKworICAgIC8vIEVpbiBCZWlzcGllbCBmdWVyIGRhcyBrb25qdWdpZXJlbiB2b24gVmVyYmVuCisgICAgc3RhdGljIGludCBjbWRfb3BmZXIoc3RyaW5nIHN0cikKKyAgICB7CisgICAgICAgaW50IGk7CisgICAgICAgb2JqZWN0ICpvYnM7CisgICAgICAgbm90aWZ5X2ZhaWwoIldhcyBtb2VjaHRlc3QgRHUgb3BmZXJuP1xuIik7CisgICAgICAgaWYgKCFzdHIgfHwgIXNpemVvZihvYnM9UEwtPmZpbmRfb2JzKHN0cikpKSByZXR1cm4gMDsKKyAgICAgICBmb3IgKGk9c2l6ZW9mKG9icyktMTsgaT49MDsgaS0tKQorICAgICAgICAgIGlmIChvYnNbaV0tPlF1ZXJ5UHJvcChQX1ZBTFVFKTw9MCkKKyAgICAgICAgICAgIHdyaXRlKG9ic1tpXS0+TmFtZShXRVIpKyIgIgorICAgICAgICAgICAgICAgICArKG9iLT5RdWVyeVByb3AoUF9QTFVSQUwpID8gInNpbmQiIDogImlzdCIpCisgICAgICAgICAgICAgICAgICsiIGRvY2ggZ2FyIG5pY2h0cyB3ZXJ0LlxuIik7CisgICAgICAgICAgZWxzZSBvYnNbaV0tPnJlbW92ZSgpOworICAgIH0KKworMjYuIEp1bmkgMjAwNCBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfUE9JU09OIGIvZG9jL3Byb3BzL1BfUE9JU09OCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiN2VhN2IKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9QT0lTT04KQEAgLTAsMCArMSw4IEBACitOQU1FOgorICAgIFBfUE9JU09OICAgICAgICAgICAgICAgICAgICAgICJwb2lzb24iICAgICAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9wcm9wZXJ0aWVzLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBXaWUgc3Rhcmsgd2lyIHZlcmdpZnRldCBzaW5kICgwLTExKQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfUE9JU09OX0RFTEFZIGIvZG9jL3Byb3BzL1BfUE9JU09OX0RFTEFZCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiYTU3YzYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9QT0lTT05fREVMQVkKQEAgLTAsMCArMSwxMyBAQAorTkFNRToKKyAgICBQX1BPSVNPTl9ERUxBWSAgICAgICAgICAgICAgICAgICAgICJwb2lzb25fZGVsYXkiICAgICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL2xpdmluZy9saWZlLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBBbnphaGwgZGVyIGhlYXJ0X2JlYXRzIG5hY2ggZGVuZW4gc2ljaCBkaWUgR2lmdHdpcmt1bmcgZXJuZXV0IAorICAgICB6ZWlndC4gSmUga2xlaW5lciBkZXIgV2VydCwgZGVzdG8gZW1wZmluZGxpY2hlciBpc3QgZGFzIExlYmV3ZXNlbgorICAgICBnZWdlbiBHaWZ0LgorICAgICBBZW5kZXJ1bmdlbiBkaWVzZXIgUHJvcGVydHkgaW4gU3BpZWxlcm4gYmVkdWVyZmVuIGRlciBHZW5laG1pZ3VuZworICAgICBkZXMgRU1zIGZ1ZXIgQmFsYW5jZS4KKyAgICAgCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9QT1JUSU9OUyBiL2RvYy9wcm9wcy9QX1BPUlRJT05TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMTM0ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9QT1JUSU9OUwpAQCAtMCwwICsxLDIxIEBACitOQU1FOgorICAgICBQX1BPUlRJT05TICAgICAgICAgICAgICAgICAgICAic3RkX2Zvb2RfcG9ydGlvbnMiCisKK0RFRklOSUVSVCBJTjoKKyAgICAgPHN5cy9mb29kLmg+CisKK0JFU0NIUkVJQlVORzoKKyAgICAgSW4gZGllc2VyIFByb3BlcnR5IHN0ZWh0IGRpZSBBbnphaGwgZGVyIFBvcnRpb25lbiBlaW5lciBTcGVpc2UuCisgICAgIEVzIGR1ZXJmZW4gbnVyIFdlcnRlID4gLTEgZ2VzZXR6dCB3ZXJkZW4uIElzdCBkaWVzZSBQcm9wZXJ0eSAwLAorICAgICB3aXJkIGRpZSBTcGVpc2UgYWxzIGxlZXIgYnp3LiB2ZXJicmF1Y2h0IGFuZ2VzZWhlbiB1bmQga2FubiBuaWNodAorICAgICBrb25zdW1pZXJ0IHdlcmRlbi4KKyAgICAgCitERUZBVUxUOgorICAgICBJbml0aWFsIGlzdCBkaWVzZSBQcm9wZXJ0eSBhdWYgMSBnZXNldHp0LCBkaWUgU3BlaXNlIGlzdCBhbHNvIG1pdAorICAgICBlaW5lbSBCaXNzZW4vU2NobHVjayB2ZXJicmF1Y2h0IGJ6dy4gbGVlci4KKworU0lFSEUgQVVDSDoKKyAgICAgL3N0ZC9mb29kLmMsIHdpei9mb29kCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogVGh1IE9jdCAyOCAxMjoxNTowMCAyMDEwIGJ5IENhbGRyYQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1BPU1QgYi9kb2MvcHJvcHMvUF9QT1NUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYTZmNzQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9QT1NUCkBAIC0wLDAgKzEsNjQgQEAKK05BTUU6CisJUF9QT1NUCQkJCSJQb3N0IgorCitERUZJTklFUlQgSU46CisJL21haWwvcG9zdC5oCisKK0JFU0NIUkVJQlVORzoKKwlJbiBkaWVzZXIgUHJvcGVydHkgbGFlc3N0IHNpY2ggZGllIFZlcnNlbmRlZXJsYXVibmlzIHZvbiBQYWtldGVuCisJcmVnZWxuLiBIaWVyYmVpIGdpYnQgZXMgenVtIGVpbmVuIGRpZSBwb3N0bGFnZXJuZGVuIFBha2V0ZSwgZGllIG1hbgorCWluIGVpbmVyIFBvc3QgYWJob2xlbiBtdXNzLCB1bmQgZXMgZ2lidCBkaWUgc29nZW5hbm50ZW4KKwlLdXJpZXJwYWtldGUsIHdlbGNoZSBkaXJla3QgdW5kIHVubWl0dGVsYmFyIHp1Z2VzdGVsbHQgd2VyZGVuLgorCU5pY2h0IGltbWVyIGlzdCBlcyBlcnd1ZW5zY2h0LCBkYXNzIFBha2V0ZSBhdXMgZGVyIEZlcm5lIGluIGVpbmVuCisJUmF1bSBnZXNjaGlja3Qgd2VyZGVuIGR1ZXJmZW4uIERpZXMgZHVlcmZ0ZSBpbnNiZXNvbmRlcmUgaW5uZXJoYWxiCisJdm9uIEdlYmlldGVuIGludGVyZXNzYW50IHNlaW4sIGluIHdlbGNoZSBtYW4gbnVyIGJlc2NocmFlbmt0IHZpZWxlCisJT2JqZWt0ZSBtaXRmdWVocmVuIGthbm4uIE1pdCBkaWVzZXIgUHJvcGVydHkgbnVuIGlzdCBlcyBsZWljaHQKKwltb2VnbGljaCwgZGllcyB6dSB2ZXJiaWV0ZW4uIE1hbiBrYW5uIGF1Y2ggaW4gZGVuIE9iamVrdGVuIHNlbGJzdAorCWFuZ2ViZW4sIG9iIGRpZXNlIHBlciBwb3N0bGFnZXJuZGVtIFBha2V0IGJ6dy4gS3VyaWVycGFrZXQKKwl2ZXJzY2hpY2t0IHdlcmRlbiBkdWVyZmVuLiBEaWVzIGR1ZXJmdGUgenVtIEJlaXNwaWVsIGJlaSBLb21wb25lbnRlbgorCWZ1ZXIgU3BlbGxzIG9kZXIgZnVlciBVbmlxdWUtT2JqZWt0ZSBpbnRlcmVzc2FudCBzZWluLgorCUZvbGdlbmRlIFdlcnRlIHNpbmQgbW9lZ2xpY2gsIHdvYmVpIGluIFJhZXVtZW4gdW5kIE9iamVrdGVuCisJU3RhbmRhcmRtYWVzc2lnIFBQX0RFRkFVTFQgZ2VudXR6dCB3aXJkOgorCisJICBQUF9GT1JCSURERU4JCS0yCS8vIGF1ZiBqZWRlbiBGYWxsIHZlcmJvdGVuCisJICBQUF9OT19FWFBSRVNTCQktMQkvLyBLdXJpZXJwYWtldGUgdmVyYm90ZW4KKwkgIFBQX0RFRkFVTFQJCSAwCS8vIERlZmF1bHQKKwkgIFBQX05PUk1BTF9BTExPV0VECSAxCS8vIHBvc3RsYWdlcm5kZSBQYWtldGUgZXJsYXVidAorCSAgUFBfQUxMT1dFRAkJIDIJLy8gYXVmIGplZGVuIEZhbGwgZXJsYXVidAorCisJUmFldW1lLCBkaWUgdm9uIC9zdGQvcG9zdC5jIGFiZ2VsZWl0ZXQgd3VyZGVuLCBudXR6ZW4gYWxzIFN0YW5kYXJkCisJbmF0dWVybGljaCBQUF9BTExPV0VELgorCitCRUlTUElFTDoKKwlVbSBLdXJpZXJwYWtldGUgZnVlciBlaW5lbiBSYXVtIHp1IHZlcmJpZXRlbiwgbnV0enQgbWFuIGRpZQorCUZ1bmt0aW9uYWxpdGFldCBkaWVzZXIgUHJvcGVydHkgZm9sZ2VuZGVybWFzc2VuOgorCisJICBpbmNsdWRlICIvbWFpbC9wb3N0LmgiCisJICAuLi4KKwkgIHZvaWQgY3JlYXRlKCkKKwkgIHsgOjpjcmVhdGUoKTsKKwkgICAgLi4uCisJICAgIFNldFByb3AoUF9QT1NULFBQX05PX0VYUFJFU1MpOworCSAgICAuLi4KKwkgIH0KKworCU9iamVrdGUgc2VsYnN0IGtvZW5udGUgbWFuIGZvbGdlbmRlcm1hc3NlbiBhdXMgUGFrZXRlbiB2ZXJiYW5uZW4sCisJd2VsY2hlIHZlcnNlbmRldCB3ZXJkZW4gc29sbGVuOgorCisJICBpbmNsdWRlICIvbWFpbC9wb3N0LmgiCisJICAuLi4KKwkgIHZvaWQgY3JlYXRlKCkKKwkgIHsgOjpjcmVhdGUoKTsKKwkgICAgLi4uCisJICAgIFNldFByb3AoUF9QT1NULFBQX0ZPUkJJRERFTik7CisJICAgIC4uLgorCSAgfQorCisJSW4gbGV0enRlcmVtIEZhbGwgZnVua3Rpb25pZXJlbiBpbSBHZWdlbnNhdHogenVtIGVyc3RlbiBCZWlzcGllbAorCWF1Y2gga2VpbmUgcG9zdGxhZ2VybmRlbiBQYWtldGUgbWVoci4KKworU0lFSEUgQVVDSDoKKwkvc3RkL3Bvc3QuYywgL3N0ZC9tYWlsY2FiaW4uYywgL3Avc2VydmljZS9sb2NvL3N0ZC9tYWlsY2FiaW4uYworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBTdW4gU2VwICA2IDE5OjM0OjM3IDE5OTggYnkgUGF0cnluCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9QT1RJT05ST09NUyBiL2RvYy9wcm9wcy9QX1BPVElPTlJPT01TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MjBiZTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9QT1RJT05ST09NUwpAQCAtMCwwICsxLDE5IEBACitOQU1FOgorICAgIFBfUE9USU9OUk9PTVMgICAgICAgICAgICAgICAgICJwb3Rpb25yb29tcyIgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9wbGF5ZXIvcG90aW9uLmgKKworQkVTQ0hSRUlCVU5HOgorICAgIEFycmF5IG1pdCBkZW4gTnVtbWVybiBkZXIgUmFldW1lLCBpbiBkZW5lbiBkZXIgU3BpZWxlciBub2NoIFphdWJlci0KKyAgICB0cmFlbmtlIGhhdC4gRGllIEZyZWlzY2hhbHR1bmcgYWxzIGJla2FubnQgZ2VzY2hpZWh0IGltIE9yYWtlbC4KKyAgICBEaWUgWnVvcmRudW5nIGRlciBSYWV1bWUgdW5kIE51bW1lcm4gZ2VzY2hpZWh0IGltIFBvdGlvbm1hc3Rlci4KKworICAgIE51ciBsZXNiYXJlIF9xdWVyeSAtIFByb3BlcnR5LgorCitTSUVIRSBBVUNIOgorICAgIFNvbnN0aWdlczogemF1YmVydHJhZW5rZSwgL3NlY3VyZS9wb3Rpb25tYXN0ZXIuYywgL3Jvb20vb3Jha2VsLmMKKyAgICBWZXJ3YW5kdDogIEZpbmRQb3Rpb24oKSwgQWRkS25vd25Qb3Rpb24oKSwgUmVtb3ZlS25vd25Qb3Rpb24oKSwgSW5MaXN0KCkKKyAgICBQcm9wczogICAgIFBfS05PV05fUE9USU9OUk9PTVMKKworNi5GZWIgMjAxNiBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfUFJBWV9ST09NIGIvZG9jL3Byb3BzL1BfUFJBWV9ST09NCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjOGY5ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9QUkFZX1JPT00KQEAgLTAsMCArMSwzNiBAQAorTkFNRToKKyAgICBQX1BSQVlfUk9PTSAgICAgICAgICAgICAgICAgICAgICAiX2xpYl9wX3ByYXlfcm9vbSIgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcGxheWVyL2Jhc2UuaAorCitCRVNDSFJFSUJVTkc6CisgICAgRGllcyBpc3QgZGVyIFJhdW0sIGluIGRlbiBkZXIgU3BpZWxlciBuYWNoIGRlbSBFbmRlIGRlciBUb2Rlc3NlcXVlbnoKKyAgICBiZXdlZ3Qgd2lyZCwgZC5oLiBlaW4gUmF1bSwgd28gZXIgYmV0ZW4ga2FubiwgdW0gZWluZW4gbmV1ZW4gS29lcnBlciB6dQorICAgIGVyaGFsdGVuLgorICAgIERlciBSYXVtIG11c3MgYWxzIFN0cmluZyBhbmdlZ2ViZW4gd2VyZGVuIChrZWluIE9iamVrdCkuCisKKyAgICBEaWVzZSBQcm9wZXJ0eSB3aXJkIGltIFNwaWVsZXIgcmVib290ZmVzdCBnZXNwZWljaGVydC4KKworICAgIERlciBqZXdlaWxzIGd1ZWx0aWdlIEJldHJhdW0gd2lyZCBpbSBTcGllbGVyIG1pdHRlbHMgUXVlcnlQcmF5Um9vbSgpCisgICAgZXJtaXR0ZWx0LiBKZWRlIFJhc3NlIGhhdCBlaW5lbiBEZWZhdWx0IGZ1ZXIgZGllc2UgRnVua3Rpb24uIFdpcmQgZGllCisgICAgUHJvcGVydHkgYXVmIDAgZGdlc2V0enQsIHdpcmQgZGllc2VyIERlZmF1bHQgd2llZGVyaGVyZ2VzdGVsbHQuCisKKyAgICBWb24gZWluZXIgVWViZXJsYWdlcnVuZyBtaXR0ZWxzIFF1ZXJ5LSBvZGVyIGdhciBTZXRtZXRob2RlbiB3aXJkCisgICAgYWJnZXJhdGVuLiBFYmVuc28gbGFzc3QgYml0dGUgZGllIE1vZHVzYml0cyB1bnZlcmFlbmRlcnQuCisKKyAgICBWb3IgZWluZXIgQWVuZGVydW5nIGRpZXNlciBQcm9wZXJ0eSBzb2xsdGUgZ2VwcnVlZnQgd2VyZGVuLCBvYiBzaWUgMCBpc3QuCisgICAgV2VubiBuaWNodCwgc29sbHRlIHZvbiBlaW5lbSBTZXR6ZW4gZGVyIFByb3BlcnR5IGFiZ2VzZWhlbiB3ZXJkZW4sIGRhIGRhbm4KKyAgICBzY2hvbiBqZW1hbmQgYW5kZXJzIGRlbiBCZXRyYXVtIGRlcyBTcGllbGVycyBnZWFlbmRlcnQgaGF0LiAoR2xlaWNoZXMgZ2lsdAorICAgIGZ1ZXJzIExvZXNjaGVuLikgQml0dGUgbmllbWFscyBkZW4gSW5oYWx0IGRlciBQcm9wZXJ0eSB3b2FuZGVycyBzcGVpY2hlcm4KKyAgICB1bmQgc3BhZXRlciB6dXJ1ZWNrc2NocmVpYmVuLgorCisgICAgRWluZSBkYXVlcmhhZnRlIEFlbmRlcnVuZyBkZXMgQmV0cmF1bXMgZGVzIFNwaWVsZXJzIG11c3MgbWl0IGRlbSBFTQorICAgIFJhc3NlbiB1bmQgZGVtIEVNIEdpbGRlbiBhYmdlc3RpbW10IHdlcmRlbi4KKworU0lFSEUgQVVDSAorICAgIFF1ZXJ5UHJheVJvb20oKSwgU2V0RGVmYXVsdFByYXlSb29tKCkKKworTEVUWlRFIEFlTkRFUlVORzoKKzIxLjA1LjIwMTMsIFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfUFJFRkVSRURfRU5FTVkgYi9kb2MvcHJvcHMvUF9QUkVGRVJFRF9FTkVNWQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWQ1OGU2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfUFJFRkVSRURfRU5FTVkKQEAgLTAsMCArMSwyNiBAQAorTkFNRToKKwlQX1BSRUZFUkVEX0VORU1ZCQkicHJlZl9lbmVteSIKKworREVGSU5JRVJUIElOOgorCS9zeXMvbGl2aW5nL2NvbWJhdC5oCisKK0JFU0NIUkVJQlVORzoKKwlEaWVzZSBQcm9wZXJ0eSBlbnRoYWVsdCBlaW4gQXJyYXkgbWl0IGZvbGdlbmRlbiBFaW50cmFlZ2VuOgorCSAgRWludHJhZyAxOiAgICAgIEludGVnZXJ3ZXJ0IHp3aXNjaGVuIDAgdW5kIDEwMCwgd2VsY2hlciBkaWUKKwkgICAgICAgICAgICAgICAgICBXYWhyc2NoZWlubGljaGtlaXQgZGFmdWVyIGFuZ2lidCwgZGFzcyBlaW4KKwkgICAgICAgICAgICAgICAgICBMZWJld2VzZW4gYmV2b3J6dWd0IGJlaSBlaW5lbSBBbmdyaWZmIGdld2FlaGx0CisJICAgICAgICAgICAgICAgICAgd2VyZGVuIHNvbGwuCisJICBFaW50cmFlZ2UgYWIgMjogTGViZXdlc2VuLCBhdXMgd2VsY2hlbiBwZXIgWnVmYWxsIGVpbmVzCisJICAgICAgICAgICAgICAgICAgYXVzZ2V3YWVobHQgd2lyZCwgd2VsY2hlcyBiZWltIGFrdHVlbGxlbiBBbmdyaWZmCisJICAgICAgICAgICAgICAgICAgYmV2b3J6dWd0IHdpcmQuCisJRXMgaXN0IHp1IGJlYWNodGVuLCBkYXNzIHNvbGNoIGVpbiBiZXZvcnp1Z3RlcyBPcGZlciBuYXR1ZXJsaWNoIGF1Y2gKKwl3aXJrbGljaCBHZWduZXIgc2VpbiBtdXNzIHVuZCBhdWNoIGltIHNlbGJlbiBSYXVtIHp1IHN0ZWhlbiBoYXQsIHdpZQorCWRlciBBbmdyZWlmZXIuIElzdCBkaWVzIG5pY2h0IGRlciBGYWxsLCB3aXJkIGRhbm4gZG9jaCBpcmdlbmRlaW4KKwlhbmRlcmVyIEdlZ25lciBhdXMgZGllc2VtIFJhdW0gZ2Vub21tZW4uCisKK1NJRUhFIEFVQ0g6CisJUXVlcnlQcmVmZXJlZEVuZW15KCksIElzRW5lbXkoKSwgU2VsZWN0RW5lbXkoKSwgQXR0YWNrKCksCisJL3N0ZC9saXZpbmcvY29tYmF0LmMsIC9zdGQvbGl2aW5nL2xpZmUuYworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBXZWQgTWF5IDI2IDE2OjQ0OjM4IDE5OTkgYnkgUGF0cnluCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9QUkVTQVkgYi9kb2MvcHJvcHMvUF9QUkVTQVkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVlYzJkMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1BSRVNBWQpAQCAtMCwwICsxLDkgQEAKK05BTUU6CisgICAgUF9QUkVTQVkgICAgICAgICAgICAgICAgICAgICAgInByZXNheSIgICAgICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3BsYXllci9kZXNjcmlwdGlvbi5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgUHJlc2F5IGRlcyBTcGllbGVycy4gRXJzY2hlaW50IHZvciBkZW0gTmFtZW4gaW4gS3Vyei9MYW5nYmVzY2hyZWlidW5nLgorICAgICBFcnNjaGVpbnQgYXVjaCBpbiBuYW1lKCksIGFsc28gaW4gc2FnLCBydWYsIHRlaWxlIG1pdCB1c3cuCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9QUkVWRU5UX1BJTEUgYi9kb2MvcHJvcHMvUF9QUkVWRU5UX1BJTEUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlkZGYxNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1BSRVZFTlRfUElMRQpAQCAtMCwwICsxLDIyIEBACitOQU1FOgorICAgIFBfUFJFVkVOVF9QSUxFICAgICAgICAgICAgICAgICAgICJwcmV2ZW50X3BpbGUiCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL2NvbnRhaW5lci9wcm9wZXJ0aWVzLmgKKworQkVTQ0hSRUlCVU5HOgorICAgIFdlbm4gaW4gZWluZW0gUmF1bSBkaWVzZSBQcm9wZXJ0eSBnZXNldHp0IGlzdCwgZW5kZXQgZGFzIFZlcndlc2VuIGVpbmVyCisgICAgTGVpY2hlIGRhbWl0LCBkYXNzIGlociBJbnZlbnRhciBpbiBkZW0gUmF1bSB2ZXJ0ZWlsdCB3aXJkLiBJc3QgZGllc2UKKyAgICBQcm9wZXJ0eSBuaWNodCBnZXNldHp0LCBlbnRzdGVodCBlaW4gIkhhdWZlbiIsIGRlciBkYXMgSW52ZW50YXIKKyAgICBlbnRoYWVsdC4KKworICAgIERpZXNlIFByb3BlcnR5IHNvbGx0ZSBudXIgaW4gQXVzbmFobWVmYWVsbGVuIGJlbnV0enQgd2VyZGVuIQorCisgICAgRGllc2UgUHJvcGVydHkgaXN0IHZvciBhbGxlbSBmdWVyICJTdG9yZS1Sb29tcyIgZ2VkYWNodCwgaW4gZGVuZW4gZGllCisgICAgTWFnaWVyIGRpZSBMZWljaGUgZWluZXMgU3BpZWxlciBhYmxlZ2VuIHVuZCBpbiBkZW5lbiBuYWNoaGVyIGRpZQorICAgIGdlc2FtbWVsdGVuIFNhY2hlbiB2b24gZWluZXIgYW5kZXJlbiBTdGVsbGUgYXVzIGdlc3VjaHQgd2VyZGVuLiBJbgorICAgIGRpZXNlbSBGYWxsIHd1ZXJkZW4gU3BpZWxlciBzb25zdCBkaWUgTW9lZ2xpY2hrZWl0IGhhYmVuLCBlaW5lbiBIYXVmZW4KKyAgICBhbHMgR2FuemVzIHp1IGJla29tbWVuLCBkYXMgc29sbCBhYmVyICpOSUUqIHBhc3NpZXJlbi4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogVHVlIE1heSAxNSAxMzo1NjoxOCBDRVNUIDIwMDcgYnkgUnVtYXRhCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9QUkVfSU5GTyBiL2RvYy9wcm9wcy9QX1BSRV9JTkZPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZjFkOWUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9QUkVfSU5GTwpAQCAtMCwwICsxLDU1IEBACitOQU1FOgorICAgICAgICBQX1BSRV9JTkZPICAgICAgICAgICAgICAgICAgICAgICAgIm5wY19wcmVfaW5mbyIKKworREVGSU5JRVJUIElOOgorICAgICAgICAvc3lzL25wYy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgICAgSXN0IGRpZSBQcm9wZXJ0eSBpbiBlaW5lbSBOUEMgZGVmaW5pZXJ0LCBzbyB3aXJkIGlociBFcmdlYm5pcworICAgICAgICBhdXNnZXdlcnRldCwgYmV2b3IgZWluZSBGcmFnZSBhbiBkYXMgSW5mb3N5c3RlbSB1ZWJlcmdlYmVuIHdpcmQuCisgICAgICAgIAorICAgICAgICBNb2VnbGljaGUgV2VydGU6CisgICAgICAgIC0gbnVtZXJpc2NoZXIgV2VydCB1bmdsZWljaCAwCisgICAgICAgICAgPT4gZGVyIE5QQyBnaWJ0IF9rZWluZXJsZWlfIEFudHdvcnQsIGRpZSBGcmFnZSBmdWVocnQgc296dXNhZ2VuCisgICAgICAgICAgICAgaW5zIExlZXJlCisKKyAgICAgICAgLSBTdHJpbmd3ZXJ0CisgICAgICAgICAgPT4gd2lyZCBhbHMgUnVlY2tnYWJlIGFuIGRlbiBGcmFnZW5kZW4gYXVzZ2VnZWJlbiwgdW1zdGVoZW5kZSAKKyAgICAgICAgICAgICBQZXJzb25lbiBiZWtvbW1lbiBkZW4gVGV4dDoKKyAgICAgICAgICAgICJYWSBpc3QgbmljaHQgZ2V3aWxsdCwgU3BpZWxlciBZWiB6dSBhbnR3b3J0ZW4iLgorICAgICAgICAgICAgRGVyIEZyYWdlbmRlIHNlbGJzdCBiZWtvbW10IGJlaSBhbmdlZ2ViZW5lbSBTdHJpbmd3ZXJ0OgorICAgICAgICAgICAgIlhZICIgKyBTdHJpbmd3ZXJ0LgorCisgICAgICAgIC0gQ2xvc3VyZQorICAgICAgICAgID0+IGRpZSBBbnR3b3J0IGJ6dy4gUmVha3Rpb24gZGVzIE5QQ3Mgb2JsaWVndCBnYW56IGRlciAKKyAgICAgICAgICAgICBhbmdlZ2ViZW5lbiBDbG9zdXJlLiBEaWVzZSBtdXNzIGRhYmVpIGVpbmVuIFN0cmluZyBvZGVyIAorICAgICAgICAgICAgIEdhbnp6YWhsZW4tV2VydCB6dXJ1ZWNrZ2ViZW4KKworQkVJU1BJRUw6CisgICAgICAgIEVpbiBOUEMgZGVyIG1hbmNobWFsIGhlcnVtcmVubnQsIHVtIHouQi4gZWluZSBBdWZnYWJlIHp1IHZlcnJpY2h0ZW4sCisgICAgICAgIGtvZW5udGUgc28gbGFuZ2UgQ2hhdHMgYWJzY2hhbHRlbiwgei5CLgorCisgICAgICAgICAgU2V0UHJvcChQX0NIQVRfQ0hBTkNFLDApOyAvLyBOUEMgbGF0c2NodCBsb3MKKyAgICAgICAgCisgICAgICAgIFVuZCBlaW5lIFdlaWxlIHNwYWV0ZXI6CisgICAgICAgIAorICAgICAgICAgIFNldFByb3AoUF9DSEFUX0NIQU5DRSw1KTsgLy8gTlBDIHJ1aHQgd2llZGVyLCBxdWFzc2VsdCBydW0KKyAgICAgICAgCisgICAgICAgIFdhZWhyZW5kIGRlcyBIZXJ1bWxhdWZlbnMsIGFsc28gd2VubiBlciBuaWNodCBhdXRvbWF0aXNjaCBzY2h3YXR6dCwKKyAgICAgICAgc29sbCBlciBhdWNoIGtlaW5lcmxlaSBGcmFnZW4gYmVhbnR3b3J0ZW46CisgICAgICAgICAgCisgICAgICAgICAgU2V0KFBfUFJFX0lORk8sIGZ1bmN0aW9uIG1peGVkICgpIHsKKyAgICAgICAgICAgIHJldHVybiAoUXVlcnlQcm9wKFBfQ0hBVF9DSEFOQ0UpID8gMCA6IAorICAgICAgICAgICAgICAiaGF0IGdlcmFkZSBrZWluZSBaZWl0IGZ1ZXIgRGljaC4iKTsgCisgICAgICAgICAgICB9LCBGX1FVRVJZX01FVEhPRCk7CisKK0hJTldFSVNFOgorICAgICAgICBCaXR0ZSBiZWFjaHRlbiwgZGFzcyBkZXIgaW50ZXJuZSBOYW1lIGRlciBQcm9wZXJ0eSAibnBjX3ByZV9pbmZvIiAKKyAgICAgICAgaXN0IHVuZCBzb21pdCBudXIgZGFzIFVlYmVyc2NocmVpYmVuIHZvbiBfcXVlcnlfbnBjX3ByZV9pbmZvKCkgCisgICAgICAgIGZ1bmt0aW9uaWVydC4gCisKK1NJRUhFIEFVQ0g6CisgICAgICAgIEFkZEluZm8oKSwgL3N0ZC9ucGMvaW5mby5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IDAxLjAzLjIwMTYgYnkgQXJhdGhvcm4KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1BST01QVCBiL2RvYy9wcm9wcy9QX1BST01QVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzgwMjE1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfUFJPTVBUCkBAIC0wLDAgKzEsOCBAQAorTkFNRToKKyAgICBQX1BST01QVCAgICAgICAgICAgICAgICAgICAgICAicHJvbXB0IiAgICAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcGxheWVyL2Jhc2UuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIERhcyBQcm9tcHQgKE51ciBmdWVyIE1hZ2llcikuCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9QVUJfTk9UX09OX01FTlUgYi9kb2MvcHJvcHMvUF9QVUJfTk9UX09OX01FTlUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDcwMjliMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1BVQl9OT1RfT05fTUVOVQpAQCAtMCwwICsxLDIxIEBACitOQU1FOgorCVBfUFVCX05PVF9PTl9NRU5VCQkJInB1Yl9ub3Rfb25fbWVudSIKKworREVGSU5JRVJUIElOOgorCS9zeXMvcHViLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICAgICBJbiBkaWVzZSBQcm9wZXJ0eSBrYW5uIG1hbiBlaW5lbiBTdHJpbmcgc2NocmVpYmVuLCBkZXIgYXVzZ2VnZWJlbgorICAgICAgICB3aXJkLCB3ZW5uIGRlciBTcGllbGVyIGV0d2FzIGJlc3RlbGx0LCB3YXMgZXMgaW4gZGVyIEtuZWlwZSBuaWNodAorICAgICAgICBnaWJ0LgorCitCRU1FUktVTkdFTjoKKyAgICAgICAgRGllIFN0YW5kYXJkbWVsZHVuZyBpc3Q6CisgICAgICAgICJUdXQgbWlyIGxlaWQsIGRhcyBmdWVocmVuIHdpciBuaWNodCEgV2lyIHNpbmQgZWluIGFuc3RhZW5kaWdlcworICAgICAgICAgTG9rYWwhXG4iCisKK1NJRUhFIEFVQ0g6CisJL3N0ZC9yb29tL3B1Yi5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFNhdCBNYXIgMDQgMjI6NDY6MDAgMjAwMCBieSBQYXJhY2Vsc3VzCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9QVUJfTk9fS0VFUEVSIGIvZG9jL3Byb3BzL1BfUFVCX05PX0tFRVBFUgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjRjMjZlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfUFVCX05PX0tFRVBFUgpAQCAtMCwwICsxLDE5IEBACitOQU1FOgorCVBfUFVCX05PX0tFRVBFUgkJCQkicHViX25vX2tlZXBlciIKKworREVGSU5JRVJUIElOOgorCS9zeXMvcHViLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICAgICBJbiBkaWVzZSBQcm9wZXJ0eSBrYW5uIG1hbiBlaW5lbiBTdHJpbmcgc2NocmVpYmVuLCBkZXIgYXVzZ2VnZWJlbgorICAgICAgICB3aXJkLCB3ZW5uIGRlciBpbiBQX0tFRVBFUiBlaW5nZXRyYWdlbmUgTlBDIG5pY2h0IGFud2VzZW5kIGlzdC4KKworQkVNRVJLVU5HRU46CisgICAgICAgIERpZSBTdGFuZGFyZG1lbGR1bmcgaXN0OgorICAgICAgICAiRXMgaXN0IG5pZW1hbmQgYW53ZXNlbmQsIGRlciBEaWNoIGJlZGllbmVuIGtvZW5udGUuXG4iCisKK1NJRUhFIEFVQ0g6CisJL3N0ZC9yb29tL3B1Yi5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFNvbiBBcHIgMTEgMTk6Mjg6MDAgMjAxMCBieSBDYWxkcmEKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1BVQl9OT19NT05FWSBiL2RvYy9wcm9wcy9QX1BVQl9OT19NT05FWQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmYyOTNhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfUFVCX05PX01PTkVZCkBAIC0wLDAgKzEsMjEgQEAKK05BTUU6CisJUF9QVUJfTk9fTU9ORVkJCQkJInB1Yl9ub19tb25leSIKKworREVGSU5JRVJUIElOOgorCS9zeXMvcHViLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICAgICBJbiBkaWVzZSBQcm9wZXJ0eSBrYW5uIG1hbiBlaW5lbiBTdHJpbmcgc2NocmVpYmVuLCBkZXIgYXVzZ2VnZWJlbgorICAgICAgICB3aXJkLCB3ZW5uIGRlciBTcGllbGVyIG5pY2h0IHVlYmVyIGdlbnVnIEdlbGQgdmVyZnVlZ3QsIHVtIGRhcworICAgICAgICBnZXd1ZW5zY2h0ZSBHZXJpY2h0IHp1IGJlemFobGVuLgorICAgICAgICBGdWVyIGRlbiBQcmVpcyBrYW5uIG1hbiBlaW4gJWQgYWxzIFBsYXR6aGFsdGVyIGVpbmZ1ZWdlbi4KKworQkVNRVJLVU5HRU46CisgICAgICAgIERpZSBTdGFuZGFyZG1lbGR1bmcgaXN0OgorICAgICAgICAiRGFzIGtvc3RldCAlZCBHb2xkc3R1ZWNrZSwgdW5kIER1IGhhc3QgbmljaHQgc28gdmllbCFcbiIKKworU0lFSEUgQVVDSDoKKwkvc3RkL3Jvb20vcHViLmMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogU2F0IE1hciAwNCAyMjo0ODowMCAyMDAwIGJ5IFBhcmFjZWxzdXMKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1BVQl9VTkFWQUlMQUJMRSBiL2RvYy9wcm9wcy9QX1BVQl9VTkFWQUlMQUJMRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2FhYTRmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfUFVCX1VOQVZBSUxBQkxFCkBAIC0wLDAgKzEsMjAgQEAKK05BTUU6CisJUF9QVUJfVU5BVkFJTEFCTEUJCQkicHViX3VuYXZhaWxhYmxlIgorCitERUZJTklFUlQgSU46CisJL3N5cy9wdWIuaAorCitCRVNDSFJFSUJVTkc6CisgICAgICAgIEluIGRpZXNlIFByb3BlcnR5IGthbm4gbWFuIGVpbmVuIFN0cmluZyBzY2hyZWliZW4sIGRlciBhdXNnZWdlYmVuCisgICAgICAgIHdpcmQsIHdlbm4gaW4gZWluZXIgS25laXBlIGVpbiBHZXRyYWVuayBvZGVyIGVpbmUgU3BlaXNlIG5pY2h0IG1laHIKKyAgICAgICAgdm9ycmFldGlnIGlzdC4KKworQkVNRVJLVU5HRU46CisgICAgICAgIERpZSBTdGFuZGFyZG1lbGR1bmcgaXN0OgorICAgICAgICAiRGF2b24gaXN0IGxlaWRlciBuaWNodHMgbWVociBkYS5cbiIKKworU0lFSEUgQVVDSDoKKwkvc3RkL3Jvb20vcHViLmMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogU2F0IE1hciAwNCAyMjo0NDowMCAyMDAwIGJ5IFBhcmFjZWxzdXMKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1BVUlNVRVJTIGIvZG9jL3Byb3BzL1BfUFVSU1VFUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM1YmZlMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1BVUlNVRVJTCkBAIC0wLDAgKzEsMTQgQEAKK05BTUU6CisgICAgUF9QVVJTVUVSUyAgICAgICAgICAgICAgICAgICAgInB1cnN1ZXJzIiAgICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL2xpdmluZy9tb3ZpbmcuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIEVudGhhZWx0IFZlcmZvbGdlciAtIG5pY2h0IHZvbiBIYW5kIG1hbmlwdWxpZXJlbiEKKworU0lFSEUgQVVDSDoKKyAgICAgQWRkUHVyc3VlcihMKSwgUmVtb3ZlUHVyc3VlcihMKQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMTYuMDYuMjAxNiwgQXJhdGhvcm4KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1BVVF9NU0cgYi9kb2MvcHJvcHMvUF9QVVRfTVNHCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNmNhZWYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9QVVRfTVNHCkBAIC0wLDAgKzEsNjIgQEAKK1BfUFVUX01TRworTkFNRToKKyAgICAgUF9QVVRfTVNHCQkJCSJwdXRfbWVzc2FnZSIKKworREVGSU5JRVJUIElOOgorICAgICAvc3lzL2xpdmluZy9wdXRfYW5kX2dldC5oCisKK0JFU0NIUkVJQlVORzoKKworICAgICBNaXQgUF9QVVRfTVNHIGthbm4gbWFuIGRpZSBNZWxkdW5nLCBkaWUgbWFuIGJlaW0gSGluZWluc3RlY2tlbiBlaW5lcworICAgICBPYmpla3RlcyBpbiBlaW5lbiBDb250YWluZXIgYmVrb21tdCwgbW9kaWZpemllcmVuLgorCisgICAgIEZvbGdlbmRlIFdlcnRlIHNpbmQgbW9lZ2xpY2g6CisKKyAgICAgbyAwCisgICAgICAgRXMgd2lyZCBlaW5lIFN0YW5kYXJkbWVsZHVuZyBhdXNnZWdlYmVuLiBEaWVzIGlzdCBWb3JlaW5zdGVsbHVuZy4KKworICAgICBvIE5PX1BOR19NU0cJPT0gLTEKKyAgICAgICBFcyB3aXJkIGtlaW5lcmxlaSBNZWxkdW5nIGF1c2dlZ2ViZW4KKworICAgICBvIEVpbiBBcnJheSBhdXMgU3RyaW5ncworICAgICAgIERlciBlcnN0ZSBTdHJpbmcgd2lyZCBhbiBkZW4gU3BpZWxlciBhdXNnZWdlYmVuLCBkZXIgendlaXRlCisgICAgICAgKG9wdGlvbmFsZSkgYW4gZGVuIFJhdW0uCisKKyAgICAgICBEaWUgU3RyaW5ncyB3ZXJkZW4gZHVyY2ggZGllIEZ1bmt0aW9uIHJlcGxhY2VfcGVyc29uYWwoKSBnZXBhcnN0LgorCU9iamVrdDEgLSBTcGllbGVyCisgICAgICAgIE9iamVrdDIgLSBkYXMgT2JqZWt0LCBkYXMgaXJnZW5kd29oaW4gZ2VzdGVja3Qgd2lyZAorCU9iamVrdDMgLSBkZXIgQ29udGFpbmVyCisKKyAgICAgICBXaXJkIGRlciB6d2VpdGUgU3RyaW5nIG5pY2h0IGFuZ2VnZWJlbiwgZXJmb2xndCBrZWluZSBNZWxkdW5nIGFuIGRlbgorICAgICAgIFJhdW0uCisKK0JFSVNQSUVMOgorICAgICB2b2lkIGNyZWF0ZSgpIHsKKyAgICAgIC4uLgorICAgICAgU2V0UHJvcCggUF9TSE9SVCwgIkV0d2FzIFNhbmQiICk7CisgICAgICBTZXRQcm9wKCBQX0xPTkcsIGJyZWFrX3N0cmluZygKKyAgICAgICAiRWluIHdlbmlnIG1hZ2lzY2hlciBTYW5kLiBTZWhyIGZlaW5rcnVlbWVsaWcuIiw3OCApKTsKKworICAgICAgU2V0UHJvcCggUF9OQU1FLCAiU2FuZCIgKTsKKyAgICAgIEFkZElkKCAoeyJzYW5kIn0pICk7CisgICAgICBTZXRQcm9wKCBQX0dFTkRFUiwgTUFMRSApOworCisgICAgICBTZXRQcm9wKCBQX1BVVF9NU0csICh7CisgICAgICAgIkR1IGxhZXNzdCBAV0VOMiBpbiBAV0VOVTMgcmllc2Vsbi4iLAorICAgICAgICJAV0VSMSBsYWVzc3QgQFdFTjIgaW4gQFdFTlUzIHJpZXNlbG4uIn0pKTsKKyAgICAgIC4uLgorICAgICB9CisKKyAgICAgRGFzIGdhbnplIGZ1ZWhydCBiZWkgVWdhcnMgInN0ZWNrZSBzYW5kIGluIHBha2V0IiB6dSBmb2xnZW5kZW4KKyAgICAgTWVsZHVuZ2VuOgorCisgICAgIFVnYXI6ICJEdSBsYWVzc3QgZGVuIFNhbmQgaW4gZWluIFBha2V0IHJpZXNlbG4uIgorICAgICBSYXVtOiAiVWdhciBsYWVzc3QgZGVuIFNhbmQgaW4gZWluIFBha2V0IHJpZXNlbG4uIgorCitTSUVIRSBBVUNIOgorICAgICBBZWhubGljaGVzOiBQX1BJQ0tfTVNHLCBQX0RST1BfTVNHLCBQX0dJVkVfTVNHLCBQX1dFQVJfTVNHLCBQX1dJRUxEX01TRworICAgICBGZWhsZXI6ICAgICBQX1RPT19IRUFWWV9NU0csIFBfRU5WX1RPT19IRUFWWV9NU0csIFBfVE9PX01BTllfTVNHLAorICAgICAgICAgICAgICAgICBQX05PSU5TRVJUX01TRywgUF9OT0xFQVZFX01TRywgUF9OT0RST1AsIFBfTk9HRVQgCisgICAgIFNvbnN0aWdlczogIHJlcGxhY2VfcGVyc29uYWwoRSksIHB1dF9vYmooTCksIC9zdGQvbGl2aW5nL3B1dF9hbmRfZ2V0LmMKKworMTQuIE1hZXJ6IDIwMDQgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1FQIGIvZG9jL3Byb3BzL1BfUVAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhmYjVhNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1FQCkBAIC0wLDAgKzEsMTMgQEAKK05BTUU6CisgICAgUF9RUCAgICAgICAgICAgICAgICAgICAgICAgICAgInF1ZXN0cG9pbnRzIiAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3BsYXllci9xdWVzdC5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgQW56YWhsIGRlciBRdWVzdHB1bmt0ZSwgZGllIGVpbiBTcGllbGVyIGhhdC4KKworSElOV0VJUzoKKyAgICAgTnVyIEFiZnJhZ2VuIGRlciBQcm9wZXJ0eSBtaXQgUXVlcnlQcm9wKCkgbGllZmVydCBkZW4ga29ycmVrdGVuIFdlcnQsCisgICAgIGRhIGVpbmUgUXVlcm1ldGhvZGUgZnVlciBkaWUgQXVzbGllZmVydW5nIGRlciBEYXRlbiBzb3JndC4gUXVlcnkoKQorICAgICBvZGVyIGdhciBRdWVyeVByb3BlcnRpZXMoKSBlbnRoYWx0ZW4gdS5VLiBlaW5lbiB2ZXJhbHRldGVuIFdlcnQuCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9RVUFMSVRZIGIvZG9jL3Byb3BzL1BfUVVBTElUWQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTQxMThjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfUVVBTElUWQpAQCAtMCwwICsxLDM4IEBACitQX1FVQUxJVFkKKworTkFNRToKKyAgICAgUF9RVUFMSVRZICJxdWFsaXR5IgorCitERUZJTklFUlQgSU46CisgICAgIDxjb21iYXQuaD4KKworQkVTQ0hSRUlCVU5HOgorICAgICBSdWVzdHVuZ2VuIHVuZCBXYWZmZW4ga29lbm5lbiBpbSBFaWZlciBkZXMgR2VmZWNodHMgYmVzY2hhZWRpZ3Qgd2VyZGVuLgorICAgICBTZXR6dCBtYW4gZGllIFByb3BlcnR5IFBfUVVBTElUWSBhdWYgZWluZW4gV2VydCBuIChuPjApLCBzbyB3aXJkCisgICAgIGVpbmUgV2FmZmUgKFJ1ZXN0dW5nKSBiZWkgamVkZW0gbi10ZW4gU2NobGFnIChUcmVmZmVyKSBiZXNjaGFlZGlndCwKKyAgICAgZC5oLiBQX1dDIChQX0FDKSB3aXJkIHVtIDEgZXJuaWVkcmlndCB1bmQgUF9EQU1BR0VEIHVtIDEgZXJob2VodC4KKworQkVJU1BJRUw6CisgICAgIGluaGVyaXQgIi9zdGQvd2VhcG9uIjsKKworICAgICAuLi4KKyAgICAgI2luY2x1ZGUgPGNvbWJhdC5oPgorCisgICAgIGNyZWF0ZSgpCisgICAgIHsKKyAgICAgICAuLi4KKyAgICAgICBTZXRQcm9wKFBfUVVBTElUWSwyMDApOworICAgICAgIC4uLgorICAgICB9CisKKyAgICAgRGllc2UgV2FmZmUgd3VlcmRlIGJlaSBqZWRlbSAyMDAuIFNjaGxhZyBldHdhcyBiZXNjaGFlZGlndC4KKworQkVNRVJLVU5HOgorICAgICBEZWZhdWx0bWFlc3NpZyBpc3QgUF9RVUFMSVRZIGF1ZiAwIGdlc2V0enQsIGQuaC4gZGllIGVudHNwci4KKyAgICAgV2FmZmUvUnVlc3R1bmcgd2lyZCBuaWNodCBiZXNjaGFlZGlndC4KKworU0lFSEUgQVVDSDoKKyAgICAgL3N0ZC9hcm1vdXIuYywgL3N0ZC93ZWFwb24uYywgVGFrZUZsYXcoKSwgUXVlcnlGbGF3KCksIERhbWFnZSgpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFRodSBNYXkgMjIgMTA6NDI6MzkgMTk5NyBieSBQYXJhY2Vsc3VzCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9RVUVTVFMgYi9kb2MvcHJvcHMvUF9RVUVTVFMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ2ZWE5MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1FVRVNUUwpAQCAtMCwwICsxLDggQEAKK05BTUU6CisgICAgUF9RVUVTVFMgICAgICAgICAgICAgICAgICAgICAgInF1ZXN0cyIgICAgICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3BsYXllci9xdWVzdC5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgTGlzdGUgZGVyIGdlbG9lc3RlbiBRdWVzdHMuCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9RVUVTVF9JVEVNIGIvZG9jL3Byb3BzL1BfUVVFU1RfSVRFTQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGVlYmI1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfUVVFU1RfSVRFTQpAQCAtMCwwICsxLDQ2IEBACitOQU1FOgorCVBfUVVFU1RfSVRFTQkJCQkicXVlc3RfaXRlbSIgCisKK0RFRklOSUVSVCBJTjoKKwkvc3lzL3F1ZXN0X2l0ZW1zLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICAgICBEaWVzZSBQcm9wZXJ0eSBnaWJ0IGFuLCBvYiBlcyBzaWNoIGJlaSBkZW0gT2JqZWt0IHVtIGVpbiBRdWVzdC0KKwlyZWxldmFudGVzIE9iamVrdCBoYW5kZWx0LgorCQorQkVJU1BJRUw6CisgICAgICAgIEVpbiBTY2h3ZXJ0IChOb3R1bmcpIGtvZW5udGUgZm9sZ2VuZGVybWFzc2VuIGRlZmluaWVydCBzZWluOgorCisJY3JlYXRlKCkKKwl7CisJICA6OmNyZWF0ZSgpIDsKKwkgIFNldFByb3AoUF9TSE9SVCwgIk5vdHVuZyBkYXMgbmVpZGxpY2hlIFNjaHdlcnQiKSA7CisJICBTZXRQcm9wKFBfTE9ORywgIkRhcyBhdXMgc2VpbmVuIFRydWVtbWVybiBuZXUgZ2VzY2htaWVkZXRlIFNjaHdlcnQgIiAKKwkgICAgICAgICAgICAgICAgICAiTm90dW5nLlxuIik7CisKKwkgIFNldFByb3AoUF9OQU1FLCAiTm90dW5nIik7CisJICBTZXRQcm9wKFBfR0VOREVSLCBORVVURVIpOworCSAgU2V0UHJvcChQX0FSVElDTEUsMCk7CisJICBBZGRJZCgoeyJub3R1bmciLCJzY2h3ZXJ0IiwiTm90dW5nIiwgIlxuTm90dW5nIn0pKTsKKwkKKwkgIFNldFByb3AoUF9XRUFQT05fVFlQRSwgV1RfU1dPUkQpOworCSAgU2V0UHJvcChQX0RBTV9UWVBFLCBEVF9CTFVER0VPTik7CisKKwkgIFNldFByb3AoUF9RVUVTVF9JVEVNLFFJX09CSik7CisJICAuLi4KKwl9CisJICAgIAorCUFuZGVyZSBNYWdpZXIga29lbm5lbiBudW4gYXVmIE5vdHVuZyBSdWVja3NpY2h0IG5laG1lbiwgdW5kIHp1bQorCUJlaXNwaWVsIGRhdm9uIGFic2VoZW4sIGVzIGJlaSBlaW5lbSBOUEMtU3BlbGwgenUgZGVzdHJ1Y3Rlbi4KKworQkVNRVJLVU5HRU46CisgICAgICAgIEFsbGUgcXVlc3RyZWxldmFudGVuIE9iamVrdGUgc29sbHRlbiBhdWYgZGllc2UgV2Vpc2UgbWFya2llcnQgd2VyZGVuLgorCQorCVF1ZXN0cmVsZXZhbnRlIE9iamVrdGUgYW5kZXJlciBNYWdpZXIgc29sbHRlbiBpbW1lciBtaXQgVm9yc2ljaHQgCisJYmVoYW5kZWx0IHdlcmRlbi4KKworU0lFSEUgQVVDSDoKKwkiL3N5cy9xdWVzdF9pdGVtcy5oIgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBUaHUgSnVsIDEwIDA3OjA4OjMyIDIwMDMgYnkgVmFuaW9uCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9SQUNFIGIvZG9jL3Byb3BzL1BfUkFDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWQ3N2NkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfUkFDRQpAQCAtMCwwICsxLDMwIEBACitOQU1FOgorCVBfUkFDRQkJCQkicmFjZSIKKworREVGSU5JRVJUIElOOgorCS9zeXMvbGl2aW5nL2Rlc2NyaXB0aW9uLmgKKworQkVTQ0hSRUlCVU5HOgorCURpZSBSYXNzZSBlaW5lcyBMZWJld2VzZW5zIGthbm4gdWViZXIgZGllc2UgUHJvcGVydHkgZXJtaXR0ZWx0IGJ6dy4KKwlnZXNldHp0IHdlcmRlbi4gRXMgZW1wZmllaGx0IHNpY2ggaGllcmJlaSwgUmFzc2VuIG51ciBpbiBGb3JtIHZvbgorCWdyb3NzZ2VzY2hyaWViZW5lbiBTdHJpbmdzIHp1IHNldHplbi4gTGVpY2hlbiBlcmhhbHRlbiBtaXR0ZWxzCisJZGllc2VyIFByb3BlcnR5IGF1dG9tYXRpc2NoIGRpZSBSYXNzZSBkZXIgTGViZXdlc2VuLCBhdXMgZGVuZW4gc2llCisJaGVydm9yZ2VnYW5nZW4gc2luZC4KKwlEZXIgU2lubiBkZXMgR2FuemVuIGxpZWd0IGRhcmluLCBkYXMgU3BpZWwgZGlmZmVyZW56aWVydGVyIHp1CisJZ2VzdGFsdGVuIHVuZCBhdWYgUmFzc2Vuc3BlemlmaWthIGVpbnp1Z2VoZW4uIFp1bSBCZWlzcGllbCBrb2VubmVuCisJRWxmZW4gd2VuaWdlciBBbGtvaG9sIHZlcnRyYWdlbiBhbHMgWndlcmdlLCB3YXMgaW4gJy9zdGQvcHViJworCWJlcnVlY2tzaWNodGlndCB3dXJkZS4KKworQkVJU1BJRUw6CisJdm9pZCBjcmVhdGUoKQorCXsgOjpjcmVhdGUoKTsKKwkgIC8vIERlZmluaXRpb25lbgorCSAgU2V0UHJvcChQX1JBQ0UsIk9yayIpOworCSAgLy8gd2VpdGVyZSBEZWZpbml0aW9uZW4KKwl9CisKK1NJRUhFIEFVQ0g6CisJL3N0ZC9ucGMuYywgL3N0ZC9wdWIuYworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBNb24gU2VwIDE1IDIxOjE1OjQ5IDIwMDMgYnkgVmFuaW9uCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9SQUNFU1RSSU5HIGIvZG9jL3Byb3BzL1BfUkFDRVNUUklORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzVmNDZiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfUkFDRVNUUklORwpAQCAtMCwwICsxLDkgQEAKK05BTUU6CisgICAgUF9SQUNFU1RSSU5HICAgICAgICAgICAgICAgICAgInJhY2VzdHJpbmciICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3Byb3BlcnRpZXMuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIEdpYnQgZWluZSBkZW0gR2VzY2hsZWNodCBhbmdlcGFzc3RlIEJlc2NocmVpYnVuZyBkZXIgUmFzc2UgenVydWVjaworICAgICAoIlp3ZXJnIiBvZGVyICJad2VyZ2luIiBldGMuKQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfUkFDRV9ERVNDUklQVElPTiBiL2RvYy9wcm9wcy9QX1JBQ0VfREVTQ1JJUFRJT04KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIyZWJmYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1JBQ0VfREVTQ1JJUFRJT04KQEAgLTAsMCArMSw4IEBACitOQU1FOgorICAgIFBfUkFDRV9ERVNDUklQVElPTiAgICAgICAgICAgICJyYWNlZGVzY3IiICAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9wcm9wZXJ0aWVzLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBCZXNjaHJlaWJ1bmcgZGVyIFZvci9OYWNodGVpbGUgZWluZXIgUmFzc2UuCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9SQU5HRSBiL2RvYy9wcm9wcy9QX1JBTkdFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3YTk4YjcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9SQU5HRQpAQCAtMCwwICsxLDI2IEBACitQX1JBTkdFCisKK05BTUU6CisgICAgUF9SQU5HRSAgICAgInJhbmdlIgorCitERUZJTklFUlQgSU46CisgICAgPGNvbWJhdC5oPgorCitCRVNDSFJFSUJVTkc6CisgICAgTGVndCBkaWUgUmVpY2h3ZWl0ZSBlaW5lciBTY2h1c3N3YWZmZSBmZXN0LiBJc3QgZWluIFNjaHVldHplIGluIGVpbmVtCisgICAgUmF1bSBtaXQgZ3VlbHRpZ2VtIFBfVEFSR0VUX0FSRUEgKGFuZGVyZSBSYXVtKSBvZGVyIGVudmlyb25tZW50KCkgdW5kCisgICAgaXN0IGZ1ZXIgZGllc2VuIFJhdW0gUF9TSE9PVElOR19BUkVBIGZlc3RnZWxlZ3QsIGRhbm4ga2FubiBlciBtaXQgc2VpbmVyCisgICAgU2NodXNzd2FmZmUgaW4gZGllc2VuIGFuZGVyZW4gUmF1bSBzY2hpZd9lbiwgd2VubiBkaWUgUF9SQU5HRSBncm9lc3NlcgorICAgIGFscyBQX1NIT09USU5HX0FSRUEgaXN0LgorCitCRUlTUElFTEU6CisgICAgLy8gTGFuZ2JvZ2VuIG1pdCAxMDAgUmVpY2h3ZWl0ZQorICAgIFNldFByb3AoUF9SQU5HRSwgMTAwKTsKKworU0lFSEUgQVVDSDoKKyAgICBHZW5lcmVsbDogIFBfQU1NVU5JVElPTiwgUF9TSE9PVElOR19XQywgUF9TVFJFVENIX1RJTUUKKyAgICBNZXRob2RlbjogIEZpbmRSYW5nZWRUYXJnZXQoTCksIHNob290X2RhbShMKSwgY21kX3Nob290KEwpCisgICAgR2ViaWV0OiAgICBQX1NIT09USU5HX0FSRUEsIFBfVEFSR0VUX0FSRUEKKyAgICBTb25zdGlnZXM6IGZlcm53YWZmZW4KKworMjkuSnVsIDIwMTQgR2xvaW5zb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9SRUFEX0RFVEFJTFMgYi9kb2MvcHJvcHMvUF9SRUFEX0RFVEFJTFMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM1YTJjYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1JFQURfREVUQUlMUwpAQCAtMCwwICsxLDIxIEBACitOQU1FOgorICAgIFBfUkVBRF9ERVRBSUxTICAgICAgICAgICAgICAgICJyZWFkX2RldGFpbHMiICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy90aGluZy9kZXNjcmlwdGlvbi5oCisKK0JFU0NIUkVJQlVORzoKKyAgICBNYXBwaW5nIG1pdCBkZW4gRGF0ZW4gZGVyIERldGFpbHMsIGRpZSBkdXJjaCBMZXNlbiBlcm1pdHRlbHQgd2VyZGVuCisgICAga29lbm5lbi4KKworQkVNRVJLVU5HRU46CisgICAgQml0dGUgbnVyIG1pdCBkZW4gZW50c3ByZWNoZW5kZW4gTWV0aG9kZW4gdmVyYWVuZGVybiEKKworU0lFSEUgQVVDSDoKKyAgICBTZXR6ZW46ICAgIEFkZFJlYWREZXRhaWwoKQorICAgIExvZXNjaGVuOiAgUmVtb3ZlUmVhZERldGFpbCgpCisgICAgQWVobmxpY2g6ICBBZGREZXRhaWwoKSwgUF9ERVRBSUxTCisgICAgVmVyYWx0ZXQ6ICBQX1JFQURfTVNHCisgICAgU29uc3RpZ2VzOiBHZXREZXRhaWwoKSwgYnJlYWtfc3RyaW5nKCkKKworMjcuIEphbiAyMDEzIEdsb2luc29uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfUkVBRF9ORVdTIGIvZG9jL3Byb3BzL1BfUkVBRF9ORVdTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NGEyNTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9SRUFEX05FV1MKQEAgLTAsMCArMSw4IEBACitOQU1FOgorICAgIFBfUkVBRF9ORVdTICAgICAgICAgICAgICAgICAgICJyZWFkX25ld3MiICAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9wbGF5ZXIvYmFzZS5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgV2VsY2hlIEFydGlrZWwgYmVyZWl0cyBnZWxlc2VuIHd1cmRlIChmcnVlaGVyOiBpbiBkZXIgTVBBKQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfUkVBTF9SQUNFIGIvZG9jL3Byb3BzL1BfUkVBTF9SQUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4Mjc5YTYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9SRUFMX1JBQ0UKQEAgLTAsMCArMSw3MiBAQAorTkFNRToKKwlQX1JFQUxfUkFDRQkJCQkicmVhbF9yYWNlIgorCitERUZJTklFUlQgSU46CisJL3N5cy9saXZpbmcvZGVzY3JpcHRpb24uaAorCitCRVNDSFJFSUJVTkc6CisgICAgICAgIERpZXNlIFByb3BlcnR5IGVudGhhZWx0IGRpZSBSYXNzZSBkZXMgTGl2aW5ncy4gU2llIGRhcmYgbmljaHQgZHVyY2ggCisJU2hhZG93cyB1ZWJlcnNjaHJpZWJlbiB3ZXJkZW4uCisJCisJV2lya2xpY2ggaW50ZXJlc3NhbnQgaXN0IHNpZSwgd2VubiBlaW4gU3BpZWxlciBzaWNoIHRhcm50LiBEb3J0IGthbm4KKwltYW4gbWl0IGRpZXNlciBQcm9wZXJ0eSB0cm90eiBUYXJudW5nIGZlc3RzdGVsbGVuLCB3ZWxjaGUgUmFzc2UgZGVyCisJU3BpZWxlciBoYXQuCisKKwlCZWkgTlBDIGVudGhhZWx0IHNpZSBkZW4gZ2xlaWNoZW4gV2VydCB3aWUgUF9SQUNFLiBXZW5uIFBfUkVBTF9SQUNFCisJYWxsZXJkaW5ncyBnZXNldHp0IHdpcmQsIGthbm4gbWFuIGRhbWl0IGVpbmVuIGdldGFybnRlbiBOUEMgc2ltdS0KKwlsaWVyZW4sIGRhIGRhbm4gUF9SQUNFIHVuZCBQX1JFQUxfUkFDRSB2b25laW5hbmRlciBhYndlaWNoZW4uCisJCitCRUlTUElFTDoKKyAgICAgICAgRWluIFp3ZXJnIG1hZyBad2VyZ2VuYnJvdCwgZnVlciBFbGZlbiBpc3QgZXMgZ2lmdGlnLiBTZWxic3Qgd2VubiBkZXIKKwlFbGYgc2ljaCBhbHMgWndlcmcgdGFybnQsIHdpcmQgaWhtIGR1cmNoIGxlbWJhcyBzaWNoZXIgdWViZWwgd2VyZGVuOgorCisgICAgICAgIGludCBmdXR0ZXIoc3RyaW5nIGFyZykKKyAgICAgICAgeworICAgICAgICAgIG5vdGlmeV9mYWlsKCJXYXMgd2lsbHN0IER1IGVzc2VuP1xuIik7CisgICAgICAgICAgaWYoIWFyZyB8fCAhaWQoYXJnKSkgcmV0dXJuIDA7CisKKyAgICAgICAgICBub3RpZnlfZmFpbCgiRHUga2FubnN0IG5pY2h0cyBtZWhyIGVzc2VuLlxuIik7CisgICAgICAgICAgaWYoIXRoaXNfcGxheWVyKCktPmVhdF9mb29kKDU1KSkgcmV0dXJuIDA7CisKKyAgICAgICAgICB3cml0ZSgiRHUgaXNzdCBlaW4gU3R1ZWNrIFp3ZWdlbmJyb3QuIER1IHZlcnN1Y2hzdCBlcyB6dW1pbmRlc3QhXG4iKTsKKyAgICAgICAgICBzYXkoc3ByaW50ZigiJXMgYmVpc3N0IGluIGVpbiBTdHVlY2sgWndlcmdlbmJyb3QuIFphaG5zY2htZXJ6ISEhXG4iLAorICAgICAgICAgICAgICB0aGlzX3BsYXllcigpLT5OYW1lKCkpKTsKKworCisgICAgICAgICAgc3dpdGNoKCB0aGlzX3BsYXllcigpLT5RdWVyeVByb3AoUF9SRUFMX1JBQ0UpICkKKyAgICAgICAgICB7CisgICAgICAgICAgY2FzZSAiWndlcmciOgorCSAgICBpZiAoKHRoaXNfcGxheWVyKCktPlF1ZXJ5UHJvcChQX1JBQ0UpKSE9Ilp3ZXJnIikKKwkgICAgICB3cml0ZSgiWnVyIFRhcm51bmcgc3B1Y2tzdCBEdSBldHdhcyB2b24gZGVtIEJyb3QgYXVzIVxuIik7IAorICAgICAgICAgICAgdGhpc19wbGF5ZXIoKS0+YnVmZmVyX2hwKDEwMCwxMCk7CisgICAgICAgICAgICB0aGlzX3BsYXllcigpLT5idWZmZXJfc3AoMTAwLDEwKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiRWxmIjoKKwkgICAgd3JpdGUoIkRhcyBad2VyZ2VuYnJvdCBicmVubnQgd2llIEZldWVyIGF1ZiBEZWluZXIgWnVuZ2UhIik7CisJICAgIC8vIEdldGFybnQ/CisJICAgIGlmICgodGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKFBfUkFDRSkpIT0iRWxmIikKKwkgICAgICB3cml0ZSgiIERlaW5lIFRhcm51bmcgbnV0enQgRGlyIGRhIHdlbmlnLlxuIgorICAgICAgICAgICAgZWxzZSB3cml0ZSgiXG4iKTsKKyAgICAgICAgICAgIHRoaXNfcGxheWVyKCktPnJlc3RvcmVfc3BlbGxfcG9pbnRzKC0xMDApOworICAgICAgICAgICAgdGhpc19wbGF5ZXIoKS0+ZG9fZGFtYWdlKDEwMCx0aGlzX29iamVjdCgpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGVmYXVsdDoKKwkgICAgd3JpdGUoIkR1IGJla29tbXN0IG51ciB3ZW5pZyBkYXZvbiBoZXJ1bnRlci4uXG4iKTsKKyAgICAgICAgICAgIHRoaXNfcGxheWVyKCktPmJ1ZmZlcl9ocCgxMCwxKTsKKyAgICAgICAgICAgIHRoaXNfcGxheWVyKCktPmJ1ZmZlcl9zcCgxMCwyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgCisgICAgICAgICAgcmVtb3ZlKCk7CisgIAorICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisKKwkKK1NJRUhFIEFVQ0g6CisJL3N0ZC9saXZpbmcvZGVzY3JpcHRpb24uYywgL3N5cy9saXZpbmcvZGVzY3JpcHRpb24uaCwgUF9SQUNFCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IE1vbiBTZXAgMTUgMjE6MTU6NDkgMjAwMyBieSBWYW5pb24KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1JFRkVSRU5DRV9PQkpFQ1QgYi9kb2MvcHJvcHMvUF9SRUZFUkVOQ0VfT0JKRUNUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYTY0MDUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9SRUZFUkVOQ0VfT0JKRUNUCkBAIC0wLDAgKzEsMjcgQEAKK1BfUkVGRVJFTkNFX09CSkVDVAorTkFNRToKKyAgICAgUF9SRUZFUkVOQ0VfT0JKRUNUICAgICAgICAgICAgInJlZmVyZW5jZV9vYmplY3QiCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N5cy9wbGF5ZXIvZGVzY3JpcHRpb24uaAorCitCRVNDSFJFSUJVTkc6CisgICAgIEluIGRpZXNlciBQcm9wZXJ0aWUgd2lyZCBkYXMgYWt0dWVsbGUgQmV6dWdzb2JqZWt0IGVpbmVzIFNwaWVsZXJzIAorICAgICBnZXNwZWljaGVydC4gVW50ZXJzdWNodCBkZXIgU3BpZWxlciBlaW4gTW9uc3Rlciwgc28gaXN0IGRpZXMgZGFzIAorICAgICBNb25zdGVyb2JqZWt0LCB1bnRlcnN1Y2h0IGRlciBTcGllbGVyIHNpY2ggc2VsYmVyLCBpc3QgZXMgZGFzIAorICAgICBTcGllbGVyb2JqZWt0LgorCisgICAgIERlciBJbmhhbHQgZGllc2VyIFByb3BlcnRpZSBiZXN0ZWh0IGFsc28gaW1tZXIgYXVzIGRlbSB6dWxldHp0IAorICAgICBiZXRyYWNodGV0ZW4gT2JqZWt0LiBTZWkgZXMgZWluIFJhdW0sIGVpbmUgUnVlc3R1bmcsIGVpbiBNb25zdGVyIG9kZXIgCisgICAgIHdhcyBhdWNoIGltbWVyLiBCZXdlZ3VuZ3NiZWZlaGxlIHVuZCBhbmRlcmUgS29tbWFuZG9zIHdlcmRlbiBuaWNodCAKKyAgICAgYmVydWVja3NpY2h0aWd0LgorCisgICAgIEVpbnppZyB3ZW5uIGRlciBTcGllbGVyICdzY2hhdScgdGlwcHQsIHdpcmQgZGVyIEluaGFsdCBkZXIgUHJvcGVydGllIAorICAgICBnZWxvZXNjaHQgdW5kIGJldHJhZWd0IDAuCisKK1NJRUhFIEFVQ0g6CisgICAgIFNvbnN0aWdlczoJCVBfSU5UX0xPTkcsIFBfTE9ORywgUF9TSE9SVAorCQkJaW50X2xvbmcoKSwgbG9uZygpLCBzaG9ydCgpLCBtYWtlX2ludmxpc3QoKQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMZXR6dGUgQWVuZGVydW5nOiAyOS4wNi4wMiwgMjM6NTA6MDAgaCwgdm9uIFRpbGx5CmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9SRUpFQ1QgYi9kb2MvcHJvcHMvUF9SRUpFQ1QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFmMDdmMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1JFSkVDVApAQCAtMCwwICsxLDUxIEBACitOQU1FOgorCVBfUkVKRUNUCQkJInJlamVjdCIKKworREVGSU5JRVJUIElOOgorCS9zeXMvcHJvcGVydGllcy5oCisKK0JFU0NIUkVJQlVORzoKKwlEaWVzZSBQcm9wZXJ0eSB6ZWlndCBzdGFuZGFyZG1hZXNzaWcgbnVyIGluIE5QQ3MgZWluZSBXaXJrdW5nLiBNaXQKKwlpaHIgbGFlc3N0IHNpY2ggc2VociBlaW5mYWNoIGVpbnN0ZWxsZW4sIHdpZSBzaWNoIGVpbiBzb2xjaGVyIE5QQworCWdlZ2VudWViZXIgR2VnZW5zdGFlbmRlbiB2ZXJoYWx0ZW4gc29sbCwgd2VsY2hlIGlobSB6dWdlc3RlY2t0CisJd2VyZGVuLiBIaWVyYmVpIGJlc3RlaHQgZGllIFByb3BlcnR5IGF1cyAyIEVsZW1lbnRlbiwgd2VsY2hlCisJYmVzdGltbXQsIHdhcyBkZXIgTlBDIG1pdCBEaW5nZW4gdHVlbiBzb2xsLCBkaWUgaWhtIGdlZ2ViZW4gd2VyZGVuLgorCVN0YW5kYXJkbWFlc3NpZyBiZWhhZWx0IGRlciBOUEMgZGllIFNhY2hlbiBlaW5mYWNoLgorCUZvbGdlbmRlIE1vZWdsaWNoa2VpdGVuIGdpYnQgZXMgYXVzc2VyZGVtOgorCSAgMS4gQXJyYXllbGVtZW50OiBBcnQgZGVyIEhhbmRsdW5nLiAoYXVzICIvc3lzL21vdmluZy5oIikKKwkgICAgUkVKRUNUX0dJVkU6IERlciBOUEMgZ2lidCBkYXMgT2JqZWt0IHp1cnVlY2suCisJICAgIFJFSkVDVF9EUk9QOiBEZXIgTlBDIGxhZXNzdCBkYXMgT2JqZWt0IGZhbGxlbi4KKwkgICAgUkVKRUNUX0tFRVA6IERlciBOUEMgYmVoYWVsdCBkYXMgT2JqZWt0IGRvY2guCisJICAgIFJFSkVDVF9MSUdIVF9NT0RJRklFUjogRGVyIE5QQyBuaW1tdCBrZWluZSBHZWdlbnN0YWVuZGUgYW4sIGRpZQorCSAgICAgIHNlaW4gTGljaHRsZXZlbCB2ZXJhZW5kZXJuIHVuZCBkYW1pdCBFaW5mbHVzcyBhdWYgc2VpbgorCSAgICAgIEthbXBmdmVyaGFsdGVuIGhhYmVuIGtvZW5udGVuLgorCSAgMi4gQXJyYXllbGVtZW50OiBNZWxkdW5nLCBtaXQgd2VsY2hlciBkZXIgTlBDIGRpZSBIYW5kbHVuZworCSAgICAgICAgICAgICAgICAgICBrb21tZW50aWVydC4KKwkgICAgRGVyIE1lbGR1bmcgd2lyZCBuaWNodHMgYXV0b21hdGlzY2ggdm9yYW5nZXN0ZWxsdCB1bmQgZWluCisJICAgIGFic2NobGllc3NlbmRlciBaZWlsZW51bWJydWNoIGlzdCBlYmVuZmFsbHMgc2VsYnN0YWVuZGlnCisJICAgIHZvcnp1bmVobWVuLiBNaXQgZWluZW0gTGVlcnN0cmluZyBpc3Qgc29taXQgYXVjaCBnYXIga2VpbmUKKwkgICAgUnVlY2ttZWxkdW5nIG1vZWdsaWNoLgorCitCRUlTUElFTDoKKwlEZXIgTlBDIHNjaG1laXNzdCBhbGxlIGlobSBnZWdlYmVuZW4gR2VnZW5zdGFlbmRlIGVpbmZhY2ggd2VnOgorCSAgdm9pZCBjcmVhdGUoKQorCSAgeyA6OmNyZWF0ZSgpOworCSAgICAuLi4KKwkgICAgU2V0UHJvcChQX1JFSkVDVCwoe1JFSkVDVF9HSVZFLAorCSAgICBOYW1lKFdFUikrIiBtdXJtZWx0OiBXYXMgc29sbCBpY2ggZGVubiBkYW1pdD8hXG4ifSkpOworCSAgICAuLi4KKwkgIH0KKwlNYW5jaG1hbCBpc3QgZGFzIHJlY2h0IG51ZXR6bGljaCwgei5CLiBrYW5uIG1hbiBzbyBlaWdlbnRsaWNoIHNjaHdlcgorCXp1IHRvZXRlbmRlIE5QQ3MgZGFnZWdlbiBzY2h1ZXR6ZW4sIGRhc3MgbWFuIGlobmVuIGFuZ2V6dWVuZGV0ZXMKKwlEeW5hbWl0IG9kZXIgYWVobmxpY2hlcyB1ZWJlcnJlaWNodC4KKworQkVNRVJLVU5HRU46CisJSW5uZXJoYWxiIHZvbiBOUENzIGlzdCBkaWUgRnVua3Rpb24gZ2l2ZV9ub3RpZnkoKSBmdWVyIGRpZQorCWF1dG9tYXRpc2NoZSBBdXN3ZXJ0dW5nIGRpZXNlciBQcm9wZXJ0eSB2ZXJhbnR3b3J0bGljaDsgZGFzIHNvbGx0ZQorCW1hbiBpbnNiZXNvbmRlcmUgYmVpbSBVZWJlcnNjaHJlaWJlbiBkaWVzZXIgRnVua3Rpb24gYmVhY2h0ZW4hCisKK1NJRUhFIEFVQ0g6CisJZ2l2ZV9ub3RpZnkoKSwgL3N0ZC9ucGMvcHV0X2FuZF9nZXQuYworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogTW9uIEFwciAyMyAxNjo1NDowNyAyMDAxIGJ5IFBhdHJ5bgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfUkVNT1ZFX0ZVTkMgYi9kb2MvcHJvcHMvUF9SRU1PVkVfRlVOQwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDQzMWZhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfUkVNT1ZFX0ZVTkMKQEAgLTAsMCArMSwyNSBAQAorUF9SRU1PVkVfRlVOQworCitOQU1FOgorICAgICBQX1JFTU9WRV9GVU5DICJyZW1vdmVfZnVuYyIKKworREVGSU5JRVJUIElOOgorICAgICA8YXJtb3VyLmg+CisKK0JFU0NIUkVJQlVORzoKKyAgICAgRmFsbHMgZWluIE9iamVrdCBlaW5lIFJlbW92ZUZ1bmMoKSBmdWVyIGRpZSBSdWVzdHVuZyBvZGVyIEtsZWlkdW5nIAorICAgICBkZWZpbmllcnQsIHNvIG11c3MgZGllc2VzIE9iamVrdCBpbiBkaWVzZXIgUHJvcGVydHkgZWluZ2V0cmFnZW4gc2Vpbi4KKworICAgICBEaWUgQXVzd2VydHVuZyBkaWVzZXIgUHJvcGVydHkgZXJmb2xndCBpbSBMYXVmZSBkZXMgRG9VbndlYXIoKSBpbgorICAgICBkZXIgbmljaHQtb2VmZmVudGxpY2hlbiBGdW5rdGlvbmVuIF9jaGVja191bndlYXJfcmVzdHJpY3Rpb25zKCkuCisKK0JFSVNQSUVMRToKKyAgICAgU2llaGUgZGFzIEJlaXNwaWVsIHp1IFJlbW92ZUZ1bmMoKQorCitTSUVIRSBBVUNIOgorICAgICAvc3RkL2FybW91ci5jLCAvc3RkL2Nsb3RoaW5nLmMsIGNsb3RoaW5nLCBhcm1vdXJzCisgICAgIFJlbW92ZUZ1bmMoKQorCisKK0xldHp0ZSBBZW5kZXJ1bmc6CisxNS4wMi4yMDA5LCBaZXNzdHJhClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfUkVNT1ZFX01TRyBiL2RvYy9wcm9wcy9QX1JFTU9WRV9NU0cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWViMWQ4ZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1JFTU9WRV9NU0cKQEAgLTAsMCArMSwyOCBAQAorTkFNRToKKyAgICAgUF9SRU1PVkVfTVNHICAgICAgICAgICAgICAgICAgInN0ZF9mb29kX3JlbW92ZV9tc2ciCisKK0RFRklOSUVSVCBJTjoKKyAgICAgPHN5cy9mb29kLmg+CisKK0JFU0NIUkVJQlVORzoKKyAgICAgTWVsZHVuZywgd2VubiBlaW5lIHZlcmRvcmJlbmUgU3BlaXNlIGdlcmFkZSB2ZXJuaWNodGV0IHdpcmQuCisgICAgIERpZXNlIE1lbGR1bmcgZXJzY2hlaW50IG51ciwgd2VubiBpbiBQX0RFU1RST1lfQkFEIGVpbiBwb3NpdGl2ZXIKKyAgICAgSW50ZWdlci1XZXJ0IGdlc2V0enQgaXN0LgorICAgICBCZWZpbmRldCBzaWNoIGRpZSBTcGVpc2UgaW4gZWluZW0gU3BpZWxlciwgZ2VodCBkaWUgTWVsZHVuZyBhbiBnZW5hdQorICAgICBkaWVzZW4sIGxpZWd0IGRpZSBTcGVpc2UgaW0gUmF1bSwgZ2VodCBkaWUgTWVsZHVuZyBhbiBhbGxlIGFud2VzZW5kZW4KKyAgICAgU3BpZWxlci4KKyAgICAgCitCRU1FUktVTkdFTjoKKyAgICAgRGllc2UgTWVsZHVuZyB3aXJkIHZvbiByZXBsYWNlX3BlcnNvbmFsIG1pdCBkZW4gQXJndW1lbnRlbjoKKyAgICAgMS4gU3BlaXNlCisgICAgIDIuIEtvbnN1bWVudAorICAgICB2ZXJhcmJlaXRldCwga2FubiBhbHMgZW50c3ByZWNoZW5kZSBQbGF0emhhbHRlciBlbnRoYWx0ZW4KKyAgICAgCitERUZBVUxUOgorICAgICAiQFdFUjEgemVyZmFlbGx0IHp1IFN0YXViLiIKKworU0lFSEUgQVVDSDoKKyAgICAgUF9ERVNUUk9ZX0JBRCwgd2l6L2Zvb2QsIHJlcGxhY2VfcGVyc29uYWwKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBUaHUgT2N0IDI4IDEyOjE1OjAwIDIwMTAgYnkgQ2FsZHJhClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfUkVTRVRfTElGRVRJTUUgYi9kb2MvcHJvcHMvUF9SRVNFVF9MSUZFVElNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzhjZjBjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfUkVTRVRfTElGRVRJTUUKQEAgLTAsMCArMSwzMSBAQAorTkFNRToNCisgICAgIFBfUkVTRVRfTElGRVRJTUUgICAgICAgICAgICAgICJzdGRfZm9vZF9saWZldGltZV9yZXNldCINCisNCitERUZJTklFUlQgSU46DQorICAgICAvc3lzL2Zvb2QuaA0KKw0KK0JFU0NIUkVJQlVORzoNCisgICAgIFplaXQgaW4gUmVzZXRzLCBkaWUgZGllIFNwZWlzZSBoYWx0YmFyIGlzdC4NCisgICAgIEplZGVyIGVpbnplbG5lIFJlc2V0IHdpcmQgaW4gc2VpbmVyIExhZW5nZSB6dWZhZWxsaWcgZmVzdGdlbGVndCB1bmQNCisgICAgIHp1IGVpbmVyIEdlc2FtdGFuemFobCB2b24gU2VrdW5kZW4genVzYW1tZW5nZWZhc3N0LiBEaWVzZSBaZWl0IGluDQorICAgICBTZWt1bmRlbiB3aXJkIGRhbm4gaW4gUF9MSUZFVElNRSBnZXNwZWljaGVydC4NCisgICAgIE5hY2ggZGllc2VyIFplaXQgd2lyZCBkaWVzZSBTcGVpc2Ugc2NobGVjaHQgdW5kIGplIG5hY2ggS29uZmlndXJhdGlvbg0KKyAgICAgZGVyIFNwZWlzZSBldmVudHVlbGwgemVyc3RvZXJ0LiBTaWNoZXJnZXN0ZWxsdCB3aXJkIGRpZXMgZHVyY2ggZGVuDQorICAgICBBdWZydWYgdm9uIHJlc2V0KCkgbmFjaCBkaWVzZXIgQW56YWhsICJSZXNldHMiLg0KKyAgICAgTW9lY2h0ZSBtYW4gZWluZSBTcGVpc2UgaGFiZW4sIGRpZSBuaWVtYWxzIHZlcmRpcmJ0DQorICAgICAoZ2VuZWhtaWd1bmdzcGZsaWNodGlnISksIG51dHp0IG1hbiBkaWUgUHJvcGVydHkgUF9OT19CQUQNCisgICAgIA0KK0JFTUVSS1VOR0VOOg0KKyAgICAgU29iYWxkIGRlciBDb3VudGRvd24genVtIFNjaGxlY2h0d2VyZGVuIGRlciBTcGVpc2UgbGFldWZ0LCBhbHNvIGVpbg0KKyAgICAgU3BpZWxlciBkYW1pdCBpbiBCZXJ1ZWhydW5nIGthbSwgemVpZ3QgU2V0UHJvcCBhdWYgZGllc2UgUHJvcGVydHkga2VpbmUNCisgICAgIFdpcmt1bmcgbWVoci4NCisNCitERUZBVUxUOg0KKyAgICAgT2huZSBTZXR6ZW4gdm9uIFBfTElGRVRJTUUgLFBfUkVTRVRfTElGRVRJTUUgdW5kIFBfTk9fQkFEIHZlcmRpcmJ0IGRpZQ0KKyAgICAgU3BlaXNlIG5hY2ggZWluZW0gUmVzZXQsIGFsc28gendpc2NoZW4gMzAgdW5kIDYwIE1pbnV0ZW4NCisNCitTSUVIRSBBVUNIOg0KKyAgICAgd2l6L2Zvb2QsIFBfTElGRVRJTUUsIFBfTk9fQkFEDQorDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorTGFzdCBtb2RpZmllZDogVGh1IE9jdCAyOCAxMjoxNTowMCAyMDEwIGJ5IENhbGRyYQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1JFU0lTVEFOQ0UgYi9kb2MvcHJvcHMvUF9SRVNJU1RBTkNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmM2RlNzQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9SRVNJU1RBTkNFCkBAIC0wLDAgKzEsMzcgQEAKK1BfUkVTSVNUQU5DRQorTkFNRToKKyAgICAgUF9SRVNJU1RBTkNFICAgICAgICAgICAgICAgICAgInJlc2lzdGFuY2UiCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N5cy9saXZpbmcvY29tYmF0LmgKKworV0lDSFRJRzoKKyAgICAgRElFU0UgUFJPUEVSVFkgSVNUIFZFUkFMVEVUISBCSVRURSBQX1JFU0lTVEFOQ0VfU1RSRU5HVEhTCisgICAgIFZFUldFTkRFTiEgQVVDSCBGVU5LVElPTklFUlQgU2V0KCkgTklDSFQgV0lFIEVTIFNPTExURS4KKworQkVTQ0hSRUlCVU5HOgorICAgICBIaWVybWl0IGtvZW5uZW4gZGllIFJlc2lzdGVuemVuIGVpbmVzIExlYmV3ZXNlbnMgc2VociBlaW5mYWNoIGdlc2V0enQKKyAgICAgd2VyZGVuLiBFcyBrYW5uIGVpbiBBcnJheSBtaXQgU2NoYWRlbnNhcnRlbiBnZXNldHp0IHdlcmRlbiwgamVkZXIKKyAgICAgRWludHJhZyBlaW5lcyBTY2hhZGVucyB2ZXJkb3BwZWx0IGRpZSBSZXNpc3RlbnogZ2VnZW4gZGllc2VuLgorCitCRU1FUktVTkdFTjoKKyAgICAgLSBQX1JFU0lTVEFOQ0VfU1RSRU5HVEhTIHNwaWVnZWx0IGRpZXNlIEVpbnRyYWVnZSBoaWVyIHdpZWRlcgorICAgICAtIHVtIGdlbmF1ZXJlIFdlcnRlIGFuenVnZWJlbiBlaW5lbiBBZGRSZXNpc3RhbmNlTW9kaWZpZXIoKSBvZGVyCisgICAgICAgUF9SRVNJU1RBTkNFX1NUUkVOR1RIUyBiZW51dHplbi4KKyAgICAgLSBQX1JFU0lTVEFOQ0Uga2FubiB1bmQgd2lyZCBuaWNodCBhdXMgUF9SRVNJU1RBTkNFX1NUUkVOR1RIUworICAgICAgIHVwZ2VkYXRldAorCitCRUlTUElFTEU6CisgICAgIC8vIGVpbiBOUEMgbWl0IGhhbGJpZXJ0ZXIgRmV1ZXJlbXBmaW5kbGljaGtlaXQgdW5kCisgICAgIC8vIGdldmllcnRlbHRlciBXaW5kZW1wZmluZGxpY2hrZWl0CisgICAgIFNldFByb3AoUF9SRVNJU1RBTkNFLCAoe0RUX0ZJUkUsIERUX0FJUiwgRFRfQUlSfSkpOworCitTSUVIRSBBVUNIOgorICAgICBzaW1wbGUgUmVzaXN0ZW56OglQX1JFU0lTVEFOQ0UKKyAgICAgTW9kaWZpa2F0b3JlbjoJQWRkUmVzaXN0YW5jZU1vZGlmaWVyLCBSZW1vdmVSZXNpc3RhbmNlTW9kaWZpZXIoKSwKKwkJCVBfUkVTSVNUQU5DRV9NT0RJRklFUgorICAgICBIYXVwdG1hcHBpbmc6CVBfUkVTSVNUQU5DRV9TVFJFTkdUSFMKKyAgICAgQmVyZWNobnVuZzoJQ2hlY2tSZXNpc3RhbmNlKCksIFVwZGF0ZVJlc2lzdGFuY2VTdHJlbmd0aHMoKQorICAgICBhbmRlcmVzOgkJYmFsYW5jZSwgL3N0ZC9hcm1vdXIvY29tYmF0LmMsIC9zdGQvbGl2aW5nL2NvbWJhdC5jCisKKzEuRGV6IDIwMDQsIEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9SRVNJU1RBTkNFX01PRElGSUVSIGIvZG9jL3Byb3BzL1BfUkVTSVNUQU5DRV9NT0RJRklFUgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTA1MzhlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfUkVTSVNUQU5DRV9NT0RJRklFUgpAQCAtMCwwICsxLDI2IEBACitOQU1FOgorICAgICBQX1JFU0lTVEFOQ0VfTU9ESUZJRVIgICAgICAgICAgICAgInJzdHI6bW9kIgorCitERUZJTklFUlQgSU46CisgICAgIC9zeXMvbGl2aW5nL2NvbWJhdC5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgSGllciB3ZXJkZW4gZGllIFJlc2lzdGVuem1vZGlmaWthdG9yZW4gaW4gZWluZW0gTWFwcGluZyBhYmdlc3BlaWNoZXJ0LgorCisgICAgIEZvcm1hdDoKKworICAgICAoWyJtZSI6PEF1ZmFkZGl0aW9uIGFsbGVyIFJlc2lzdGVuei9FbXBmaW5kbGljaGtlaXRzbW9kaWZpa2F0aW9uZW4+OzAsCisgICAgICAgIjxPYmpla3RuYW1lPiM8U2NobHVlc3NlbD4iOjxSZXNpc3RlbnptYXBwaW5nPjs8T2JqZWtyZWZlcmVuej4sCisgICAgICAgLi4uXSkKKworQkVNRVJLVU5HRU46CisgICAgIE51ciB1ZWJlciBBZGRSZXNpc3RhbmNlTW9kaWZpZXIoKSwgUmVtb3ZlUmVzaXN0YW5jZU1vZGlmaWVyKCkgYWVuZGVybiEKKworU0lFSEUgQVVDSDoKKyAgICAgTW9kaWZpa2F0b3JlbjoJQWRkUmVzaXN0YW5jZU1vZGlmaWVyLCBSZW1vdmVSZXNpc3RhbmNlTW9kaWZpZXIoKQorICAgICBzaW1wbGUgUmVzaXN0ZW56OglQX1JFU0lTVEFOQ0UsIFBfVlVMTkVSQUJJTElUWQorICAgICBIYXVwdG1hcHBpbmc6CVBfUkVTSVNUQU5DRV9TVFJFTkdUSFMKKyAgICAgQmVyZWNobnVuZzoJQ2hlY2tSZXNpc3RhbmNlKCksIFVwZGF0ZVJlc2lzdGFuY2VTdHJlbmd0aHMoKQorICAgICBhbmRlcmVzOgkJYmFsYW5jZSwgL3N0ZC9hcm1vdXIvY29tYmF0LmMsIC9zdGQvbGl2aW5nL2NvbWJhdC5jCisKKzI5LkFwciAyMDAyLCBHbG9pbnNvbkBNRwpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfUkVTSVNUQU5DRV9TVFJFTkdUSFMgYi9kb2MvcHJvcHMvUF9SRVNJU1RBTkNFX1NUUkVOR1RIUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDI0ZDJkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfUkVTSVNUQU5DRV9TVFJFTkdUSFMKQEAgLTAsMCArMSw5MiBAQAorTkFNRToKKyAgICAgUF9SRVNJU1RBTkNFX1NUUkVOR1RIUyAgICAgInJlc2lzdGFuY2Vfc3RyZW5ndGhzIgorCitERUZJTklFUlQgSU46CisgICAgIC9zeXMvbGl2aW5nL2NvbWJhdC5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgTGViZXdlc2VuOgorCisgICAgIE1hcHBpbmcgbWl0IFNjaGFkZW5zYXJ0ZW4sIGdlZ2VuIGRpZSBkYXMgTGViZXdlc2VuIHJlc2lzdGVudCBvZGVyCisgICAgIGFuZmFlbGxpZyBpc3QuIER1cmNoIGVpbmUgX3F1ZXJ5X21ldGhvZCB3ZXJkZW4gYWxsZSBleGlzdGllcmVuZGVuCisgICAgIFJlc2lzdGVuemVuIGhpZXIgenVzYW1tZW5nZWZhc3N0LgorCisgICAgIERpZSBTdGFlcmtlIGRlciBSZXNpc3Rlbnogb2RlciBBbmZhZWxsaWdrZWl0IHdpcmQgbnVtZXJpc2NoIGF1cy0KKyAgICAgZ2VkcnVlY2t0OgorICAgICAtIFJlc2lzdGVuemVuIGdlaGVuIGJpcyB2b24gMCBiaXMgLTEuMCAoYWJzb2x1dGUgUmVzaXN0ZW56KQorICAgICAgIC0gLTAuNSA9PSBoYWxiaWVydGVyIFNjaGFkZW4sIC0wLjc1ID09IGdldmllcnRlbHRlciBTY2hhZGVuCisgICAgICAgLT4gaW4gJSBkZXMgImF1ZmdlaGFsdGVuZW4iIFNjaGFkZW5zIGludGVycHJldGllcmJhcgorICAgICAtIEVtcGZpbmRsaWNoa2VpdGVuIGdlaGVuIHZvbiAwIGJpcyBNQVhfSU5UCisgICAgICAgLSAgMS4wID09IHZlcmRvcHBlbHRlciBTY2hhZGVuLCAzLjAgPT0gdmVydmllcmZhY2h0ZXIgU2NoYWRlbgorICAgICAgIC0+IGFscyBGYWt0b3IgKHgrMS4wKSBpbnRlcnByZXRpZXJiYXIKKworICAgICBSdWVzdHVuZ2VuOgorCisgICAgIE1hcHBpbmcgbWl0IFByb3plbnR3ZXJ0ZW4gZGVyIE1heGltYWx3ZXJ0ZSBmdWVyIFJ1ZXN0dW5nZW4gZGVzCisgICAgIGVudHNwcmVjaGVuZGVuIFR5cHMuIERhYmVpIHNpbmQgcG9zaXRpdmUgV2VydGUgUmVzaXN0ZW56ZW4gdW5kCisgICAgIG5lZ2F0aXZlIEVtcGZpbmRsaWNoa2VpdGVuLiBEYWJlaSBkdWVyZmVuIGRpZSBQcm96ZW50d2VydGUgbnVyCisgICAgIGltIEJlcmVpY2ggdm9uICsxMDAgYmlzIC04MDAgKC0xMDAwID8hKSBsaWVnZW4uCisKKyAgICAgQmVpIFJ1ZXN0dW5nZW4gaXN0IGVzIGRhbWl0IHVubm9ldGlnLCBSZXNpc3RlbnplbiBtaXR0ZWxzCisgICAgIEFkZFJlc2lzdGFuY2VNb2RpZmllcigpIGltIFRyYWVnZXIgenUgc2V0emVuLCBkYSBkaWVzIGJlcmVpdHMKKyAgICAgaW4gL3N0ZC9hcm1vdXIgYXV0b21hdGlzY2ggZ2VtYWNodCB3aXJkLiBEZXIgU2NobHVlc3NlbCBmdWVyCisgICAgIGRlbiBFaW50cmFnIGlzdCBkYWJlaSBQX0FSTU9VUl9UWVBFLgorCisgICAgIERpZSBNYXhpbWFsd2VydGUgc2luZCBkZXJ6ZWl0OgorICAgICAgQVRfQ0xPQUssIEFUX1JJTkcsIEFUX0FNVUxFVDogbWF4IDEwJSBSZXNpc3RlbnoKKyAgICAgIEFUX1NISUVMRCwgQVRfQVJNT1VSOiAgbWF4IDE1JSBSZXNpc3RlbnoKKyAgICAgIGFsbGUgYW5kZXJlbjogICBtYXggNSUgUmVzaXN0ZW56CisKK0JFTUVSS1VOR0VOOgorICAgICBSdWVzdHVuZ2VuOgorICAgICAqIGRpZSBQcm9wZXJ0eSBtdXNzIF9uYWNoXyBQX0FSTU9VUl9UWVBFIGdlc2V0enQgd2VyZGVuIChfc2V0LU1ldGhvZCkKKworICAgICBMZWJld2VzZW46CisgICAgICogLTEuMCBiZWRldXRldCBiZXJlaXRzIGFic29sdXRlIFJlc2lzdGVueiwgYmVpIGtsZWluZXJlbiBXZXJ0ZW4gd2VyZGVuCisgICAgICAgZGllIGFuZGVyZW4gU2NoYWRlbnNhbnRlaWxlIGltIEthbXBmIHUuVS4gbmljaHQgbWVociB3aWUgZ2V3dWVuc2NodAorICAgICAgIGJpbGFuemllcnQuIEJpdHRlIGRhaGVyIGRyYXVmIHZlcnppY2h0ZW4uIDstKQorICAgICAqIEFlbmRlcnVuZ2VuIGFuIFBfUkVTSVNUQU5DRSB1bmQgUF9WVUxORVJBQklMSVRZIHdlcmRlbiBkaXJla3QgaW4gCisgICAgICAgUF9SRVNJU1RBTkNFX1NUUkVOR1RIUyBnZXNwZWljaGVydDoKKyAgICAgICAtPiBkYWhlciBuaWVtYWxzIGltIE5hY2hoaW5laW4gYmVpIGZyZW1kZW4gTlBDcyBQX1JFU0lTVEFOQ0VfU1RSRU5HVEhTCisgICAgICAgICAgbWFuaXB1bGllcmVuLCBkYWZ1ZXIgZ2lidCBlcyBBZGRSZXNpc3RhbmNlTW9kaWZpZXIKKyAgICAgKiBRdWVyeVByb3AoUF9SRVNJU1RBTkNFX1NUUkVOR1RIUykgZW50aGFlbHQgZGllIGdlc2FtdGVuIFJlc2lzdGVuemVuCisgICAgICAgUF9SRVNJU1RBTkNFLCBQX1ZVTE5FUkFCSUxJVFksIFBfUkVTSVNUQU5DRV9NT0RJRklFUiAoX3F1ZXJ5LU1ldGhvZCkKKworICAgICBEaWUgV2VydGUgaW4gUF9SRVNJU1RBTkNFX1NUUkVOR1RIUyBzb2xsdGVuIG51ciBpbiBBdXNuYWhtZWZhZWxsZW4gb2RlcgorICAgICBndXQgYmVncnVlbmRldCBkZW4gSG9lY2hzdHdlcnQgaGFiZW4uIEVpbiBFaXN3ZXNlbiBrYW5uIHp3YXIgc2VocgorICAgICByZXNpc3RlbnQgZ2VnZW4gS2FlbHRlc2NoYWRlbiBzZWluLCBzb2xsdGUgYWJlciB6dSBnbGVpY2hlbSBUZWlsIGF1Y2gKKyAgICAgYW5mYWVsbGlnIGF1ZiBGZXVlcnNjaGFkZW4gc2Vpbi4KKworICAgICBBdWYgZGllc2VyIFByb3BlcnR5IGxpZWd0IGVpbmUgUXVlcnltZXRob2RlLCB3ZWxjaGUgZWluZSBLb3BpZSBkZXIKKyAgICAgRGF0ZW4genVydWVja2xpZWZlcnQuCisKK0JFSVNQSUVMRToKKyAgICAgLy8gZWluIEVpc3Ryb2xsCisgICAgIFNldFByb3AoUF9SRVNJU1RBTkNFX1NUUkVOR1RIUywoW0RUX0ZJUkU6MC41LERUX0NPTEQ6LTAuNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFRfTUFHSUM6MC4xXSkpOworCisgICAgIEZldWVyYW5ncmlmZmUgd2VyZGVuIG1pdCAxLjUgbXVsdGlwbGl6aWVydCwgbWFnaXNjaGUgbWl0IDEuMSB1bmQKKyAgICAgZGVyIFNjaGFkZW5zd2VydCB2b24gS2FlbHRlYW5ncmlmZmVuIHdpcmQgaGFsYmllcnQuIFp1bSBCZWlzcGllbAorICAgICB3dWVyZGUKKyAgICAgRGVmZW5kKDEwMCwgKHtEVF9GSVJFLERUX01BR0lDfSksIC4uLikKKyAgICAgZWluZW4gU2NoYWRlbiB2b24gMTMwIHN0YXR0IGRlbiBub3JtYWxlbiAxMDAgdmVydXJzYWNoZW4uCisKKworICAgICAvLyBlaW5lIEVpc3J1ZXN0dW5nCisgICAgIFNldFByb3AoUF9SRVNJU1RBTkNFX1NUUkVOR1RIUywgKFtEVF9DT0xEOjUwLCBEVF9GSVJFOi0xMDBdKSk7CisKKyAgICAgRGllc2VzIEtldHRlbmhlbWQgc2NodWV0enQgbnVuIG1pdCA1MCUgZGVzIE1heGltYWx3ZXJ0ZXMgZ2VnZW4KKyAgICAgS2FlbHRlIChhbHNvIDAuNSoxNSU9Nyw1JSBSZXNpc3RlbnopIHVuZCBtYWNodCBtaXQgZGVtIE1heGltYWwtCisgICAgIHdlcnQgYW5mYWVsbGlnIGdlZ2VuIEZldWVyICgxKjE1JT0xNSUgRW1wZmluZGxpY2hrZWl0KS4KKworICAgICAhIGRlciBDb2RlIHNwcmljaHQgenVzYWV0emxpY2ggdm9uCisgICAgICAgRW1wZmluZGxpY2hrZWl0PShFbXBmaW5kbGljaGtlaXQvNCkqNSAtPiAxNS80KjU9MTguNzUlICEKKworU0lFSEUgQVVDSDoKKyAgICAgc2ltcGxlIFJlc2lzdGVuejogUF9SRVNJU1RBTkNFLCBQX1ZVTE5FUkFCSUxJVFkKKyAgICAgTW9kaWZpa2F0b3JlbjogQWRkUmVzaXN0YW5jZU1vZGlmaWVyLCBSZW1vdmVSZXNpc3RhbmNlTW9kaWZpZXIoKSwKKyAgICAgUF9SRVNJU1RBTkNFX01PRElGSUVSCisgICAgIEJlcmVjaG51bmc6IENoZWNrUmVzaXN0YW5jZSgpLCBVcGRhdGVSZXNpc3RhbmNlU3RyZW5ndGhzKCkKKyAgICAgYW5kZXJlczogIGJhbGFuY2UsIC9zdGQvYXJtb3VyL2NvbWJhdC5jLCAvc3RkL2xpdmluZy9jb21iYXQuYworCis2LkZlYiAyMDE2IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9SRVNUUklDVElPTlMgYi9kb2MvcHJvcHMvUF9SRVNUUklDVElPTlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ4OTBmZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1JFU1RSSUNUSU9OUwpAQCAtMCwwICsxLDE0MCBAQAorTkFNRToKKyAgICBQX1JFU1RSSUNUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlc3RyaWN0aW9ucyIKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvY29tYmF0LmgKKyAgICAoRGllIFNSXyotUGFyYW1ldGVyIHNpbmQgaW4gL3N5cy9uZXdfc2tpbGxzLmggZGVmaW5pZXJ0LikKKworQkVTQ0hSRUlCVU5HOgorICAgIEVudGhhZWx0IGVpbiBtYXBwaW5nIG1pdCBkZW4genUgcHJ1ZWZlbmRlbiBFaW5zY2hyYWVua3VuZ2VuLgorCisgICAgSW4gZGllc2VyIFByb3BlcnR5IGxhc3NlbiBzaWNoIFJlc3RyaWt0aW9uZW4gc2V0emVuLCBkaWUgdm9yIGRlbQorICAgIFp1ZWNrZW4gZWluZXIgV2FmZmUgLyBBbnppZWhlbiBlaW5lciBSdWVzdHVuZyBvZGVyIEtsZWlkdW5nIGdlcHJ1ZWZ0CisgICAgd2VyZGVuIHVuZCBkaWVzIGdlZ2ViZW5mYWxscyB2ZXJoaW5kZXJuLCBvaG5lIGdsZWljaCBhdWYgZWluZSBldnRsLgorICAgIHZvcmhhbmRlbmUgV2llbGRGdW5jIC8gV2VhckZ1bmMgenV6dWdyZWlmZW4uCisKKyAgICBEaWUgQXVzd2VydHVuZyBlcmZvbGd0IHVlYmVyIGRlbiBBdWZydWYgdm9uIGNoZWNrX3Jlc3RyaWN0aW9ucygpCisgICAgaW4gL3N0ZC9yZXN0cmljdGlvbl9jaGVja2VyLmMKKworICAgIEZvbGdlbmRlIEtleXMgd2VyZGVuIGluIGRlbSBNYXBwaW5nIGF1c2dld2VydGV0OgorCisgICAgUF9MRVZFTAorICAgICAgTWluZGVzdHN0dWZlLCBkaWUgZGFzIExlYmV3ZXNlbiBiZXNpdHplbiBtdXNzLCB1bSBkaWUgQWt0aW9uCisgICAgICBhdXN6dWZ1ZWhyZW4uCisgICAgUF9HVUlMRF9MRVZFTAorICAgICAgR2lsZGVubGV2ZWwsIGRhcyBkYXMgTGViZXdlc2VuIG1pbmRlc3RlbnMgZXJyZWljaHQgaGFiZW4gbXVzcywgdW0gZGllCisgICAgICBBa3Rpb24gYXVzenVmdWVocmVuLgorICAgIFNSX1NFRVIKKyAgICAgIElzdCBnZXNldHp0LCB3ZW5uIGRhcyBMZWJld2VzZW4gU2VoZXIgc2VpbiBtdXNzLgorICAgICAgQXVzd2VydHVuZyBudXIgZnVlciBJbnRlcmFjdGl2ZXMsIE5TQyBpZ25vcmllcmVuIGRhcyBGbGFnLgorICAgIFBfWFAKKyAgICAgIE1pbmRlc3RtZW5nZSBhbiBFcmZhaHJ1bmdzcHVua3RlbiwgZGllIGVpbiBMZWJld2VzZW4gYmVzaXR6ZW4gbXVzcywKKyAgICAgIHVtIGRpZSBBa3Rpb24gYXVzenVmdWVocmVuLgorICAgIFBfUVAKKyAgICAgIE1pbmRlc3RtZW5nZSBhbiBBYmVudGV1ZXJwdW5rdGVuLCBkaWUgZGFzIExlYmV3ZXNlbiBoYWJlbiBtdXNzLgorICAgIFBfQUxDT0hPTAorICAgICAgTWVuZ2UgYW4gQWxrb2hvbCwgdW50ZXIgZGVyIGRlciBBbGtvaG9sc3BpZWdlbCBkZXMgTGViZXdlc2VuIGxpZWdlbgorICAgICAgbXVzcywgdW0gZGllIEFrdGlvbiBub2NoIGF1c2Z1ZWhyZW4genUga29lbm5lbi4KKyAgICBQX0RSSU5LCisgICAgICBNZW5nZSBhbiBGbHVlc3NpZ2tlaXQsIHVudGVyIGRlciBkZXIgRmx1ZXNzaWdrZWl0c3NwaWVnZWwgZGVzCisgICAgICBMZWJld2VzZW4gbGllZ2VuIG11c3MsIHVtIGRpZSBBa3Rpb24gbm9jaCBhdXNmdWVocmVuIHp1IGtvZW5uZW4uCisgICAgUF9GT09ECisgICAgICBCZWluaGFsdGV0IGRpZSBNZW5nZSBhbiBOYWhydW5nLCB1bnRlciBkZXIgZGVyIE5haHJ1bmdzc3BpZWdlbCBkZXMKKyAgICAgIFNwaWVsZXJzIGxpZWdlbiBtdXNzLCB1bSBkaWUgQWt0aW9uIG5vY2ggYXVzZnVlaHJlbiB6dSBrb2VubmVuLgorICAgIFBfREVBRgorICAgICAgSXN0IGdlc2V0enQsIGZhbGxzIGRlciBTcGllbGVyIG5pY2h0IHRhdWIgc2VpbiBkYXJmLgorICAgIFBfRlJPRworICAgICAgSXN0IGdlc2V0enQsIGZhbGxzIGRlciBTcGllbGVyIGtlaW4gRnJvc2NoIHNlaW4gZGFyZi4KKyAgICBQX0JMSU5ECisgICAgICBJc3QgZ2VzZXR6dCwgZmFsbHMgZGVyIFNwaWVsZXIgbmljaHQgYmxpbmQgc2VpbiBkYXJmLgorICAgICAgQWNodHVuZzogZGFzIGlzdCBuaWNodCBnbGVpY2hiZWRldXRlbmQgbWl0IGRlbSBVbXN0YW5kLCBkYXNzIGVyIGV2dGwuCisgICAgICBuaWNodHMgbWVociBzZWhlbiBrYW5uLiBBdWNoIGFuZGVyZSBHcnVlbmRlICh6dW0gQmVpc3BpZWwgRHVua2VsaGVpdCkKKyAgICAgIGtvZW5uZW4gYmV3aXJrZW4sIGRhc3MgZWluIFNwaWVsZXIgbmljaHRzIG1laHIgc2llaHQuCisgICAgQV9JTlQsIEFfREVYLCBBX0NPTiwgQV9TVFIKKyAgICAgIEpld2VpbGlnZSBNaW5kZXN0aG9laGUgZWluZXMgQXR0cmlidXQsIHVtIGVpbmUgQWt0aW9uIGF1c2Z1ZWhyZW4genUKKyAgICAgIGtvZW5uZW4uCisgICAgU1JfQkFELCBTUl9HT09ECisgICAgICBHaWJ0IGFuLCB3aWUgW21pbmltYWxdIGJvZXNlIGJ6dy4gd2llIFttYXhpbWFsXSBndXQgZWluIENoYXJha3RlciBzZWluCisgICAgICBkYXJmLCB1bSBlaW5lIEFrdGlvbiBhdXNmdWVocmVuIHp1IGtvZW5uZW4uCisgICAgU1JfTUlOX1NJWkUsIFNSX01BWF9TSVpFCisgICAgICBHaWJ0IGRpZSBtaW5pbWFsZSwgYnp3LiBkaWUgbWF4aW1hbGUgR3JvZXNzZSBhbiwgZGllIGVpbiBDaGFyYWt0ZXIKKyAgICAgIG1heGltYWwgaGFiZW4gZGFyZiwgdW0gZWluZSBBa3Rpb24gYXVzZnVlaHJlbiB6dSBrb2VubmVuLgorICAgIFNSX0ZSRUVfSEFORFMKKyAgICAgIEdpYnQgYW4sIHdpZXZpZWxlIGZyZWllIEhhZW5kZSBlaW4gQ2hhcmFrdGVyIGZ1ZXIgZGllc2UgQWt0aW9uCisgICAgICBiZXNpdHplbiBtdXNzLgorICAgIFNSX0VYQ0xVREVfUkFDRQorICAgICAgTWl0Z2xpZWRlciBhbGxlciBpbiBkaWVzZXIgTGlzdGUgYXVmZ2VmdWVocnRlbiBSYXNzZW4ga29lbm5lbgorICAgICAgZGllc2UgQWt0aW9uIG5pY2h0IGF1c2Z1ZWhyZW4uCisgICAgU1JfSU5DTFVERV9SQUNFCisgICAgICBNaXRnbGllZGVyIGFsbGVyIE5JQ0hUIGluIGRpZXNlciBMaXN0ZSBhdWZnZWZ1ZWhydGVuIFJhc3NlbiBrb2VubmVuCisgICAgICBkaWVzZSBBa3Rpb24gbmljaHQgYXVzZnVlaHJlbi4KKyAgICBTTV9SQUNFCisgICAgICBIaWVyIGthbm4gcHJvIFJhc3NlIGVpbiBNYXBwaW5nIG1pdCBiZXNvbmRlcmVuIChudXIpIGZ1ZXIgZGllc2UgUmFzc2UKKyAgICAgIGdlbHRlbmRlbiBFaW5zY2hyYWVua3VuZ2VuIHZvcmdlbm9tbWVuIHdlcmRlbi4gQWxzIEtleXMgc2luZCBkaWUKKyAgICAgIGluIGRpZXNlciBNYW5wYWdlIGJlc2NocmllYmVuZW4gS2V5cyBlcmxhdWJ0LCB3b2JlaSBTTV9SQUNFIG5pY2h0CisgICAgICByZWt1cnNpdiBhdXNnZXdlcnRldCB3aXJkLgorICAgICAgRGVyIFJhc3Nlbm5hbWUgaXN0IGdyb3NzIGdlc2NocmllYmVuIHVuZCAiKiIgc3RlaHQgZnVlciBhbGxlIFJhc3Nlbi4KKyAgICBTUl9FWENMVURFX0dVSUxECisgICAgU1JfSU5DTFVERV9HVUlMRAorICAgICAgRGllc2UgYmVpZGVuIEtleXMgdmVyaGFsdGVuIHNpY2ggd2llIFNSXypfUkFDRSwgbnVyIGRhc3MgaGllciBHaWxkZW4KKyAgICAgIGdlbmFubnQgd2VyZGVuLgorICAgIFNSX0ZVTgorICAgICAgSGllciBrYW5uIGVpbmUgRnVua3Rpb24gaW4gdmVyc2NoaWVkZW5lbiBGb3JtZW4genVtIFBydWVmZW4gZGVyCisgICAgICBSZXN0cmlrdGlvbmVuIGFuZ2VnZWJlbiB3ZXJkZW4sIHNpZWhlIGV4ZWN1dGVfYW55dGhpbmcoKS4KKyAgICAgIERhcyBrYW5uIG51ZXR6bGljaCBzZWluLCB1bSBhbmRlcmUgUmVzdHJpa3Rpb25lbiB6dSBwcnVlZmVuLAorICAgICAgd2llIGRhcyBCZXN0ZWhlbiB2b24gTWluaXF1ZXN0cyBvZGVyIGFuZGVyZSBGYWVoaWdrZWl0ZW4vRmxhZ3MuCisgICAgICBJc3QgZGVyIFRlc3QgbmljaHQgYmVzdGFuZGVuLCBnaWJ0IGRpZSBGdW5rdGlvbiBlaW5lbiBTdHJpbmcgenVydWVjay4KKyAgICBTUl9QUk9QCisgICAgICBIaWVyIGthbm4gZWluIE1hcHBpbmcgbWl0IFByb3BlcnRpZXMgdW5kIHp1Z2Vob2VyaWdlbiBXZXJ0ZW4gYW5nZWdlYmVuCisgICAgICB3ZXJkZW4sIGRpZSBqZXdlaWxzIGF1ZiBJZGVudGl0YWV0IGdlcHJ1ZWZ0IHdlcmRlbi4gWnVzYWV0emxpY2ggc29sbHRlCisgICAgICBlaW5lIE1lbGR1bmcgYW5nZWdlYmVuIHdlcmRlbiwgZGllIGFscyBGZWhsZXJtZWxkdW5nIGF1c2dlZ2ViZW4gd2lyZCwKKyAgICAgIHdlbm4gZGVyIFNwaWVsZXIgZGllIEJlZGluZ3VuZyBuaWNodCBlcmZ1ZWxsdC4gRXMgc29sbHRlIGltbWVyIGVpbmUKKyAgICAgIHBhc3NlbmRlIE1lbGR1bmcgZnVlciBkZW4gU3BpZWxlciBlaW5nZWJhdXQgd2VyZGVuLiBCZWlzcGllbDoKKyAgICAgIChbIFNSX1BST1A6IChbUF9BVVNHQU5HX0VOVERFQ0tUOiAxOyAiRGVpbiBTY2h3ZXJ0IGZsdWVzdGVydCAiCisgICAgICAgICAgInZlcmFlcmdlcnQ6IEljaCB3ZXJkZSBEaXIgZXJzdCBkYW5uIHp1IERpZW5zdGVuIHNlaW4sIHdlbm4gRHUgIgorICAgICAgICAgICJEaWNoIGFscyB3dWVyZGlnIGVyd2llc2VuIGhhc3QhIl0pIF0pCisgICAgICBBdWZncnVuZCBkZXIgTWVsZHVuZyB3aXJkIGVtcGZvaGxlbiwgU1JfUFJPUCBuaWNodCBpbiBSZXN0cmlrdGlvbmVuIAorICAgICAgZWluenVzZXR6ZW4sIGRpZSBtYXNzZW53ZWlzZSBpbiBTYXZlZmlsZXMgbGFuZGVuICh6LkIuIAorICAgICAgU3BpZWxlcnNhdmVmaWxlcykuCisgICAgU1JfUVVFU1QKKyAgICAgIEhpZXIga2FubiBlaW4gU3RyaW5nLUFycmF5IG1pdCBkZW4gTmFtZW4gKEtleXMpIGRlciBRdWVzdChzKSBhbmdlZ2ViZW4KKyAgICAgIHdlcmRlbiwgZGllIGRlciBTcGllbGVyIGJlc3RhbmRlbiBoYWJlbiBtdXNzLCB1bSBkaWUgQWt0aW9uIGF1c2Z1ZWhyZW4KKyAgICAgIHp1IGtvZW5uZW4uCisgICAgU1JfTUlOSVFVRVNUCisgICAgICBIaWVyIGthbm4gZW50d2VkZXIgZWluIFN0cmluZy1BcnJheSBtaXQgZGVuIExhZGVuYW1lbiBkZXIgdmVyZ2ViZW5kZW4KKyAgICAgIE9iamVrdGUgb2RlciBlaW4gSW50LUFycmF5IG1pdCBkZW4gSW5kZXgtTnVtbWVybiAoSURzKSBkZXIKKyAgICAgIE1pbmlxdWVzdChzKSAoZW1wZm9obGVuISkgYW5nZWdlYmVuIHdlcmRlbiwgZGllIGRlciBTcGllbGVyIGJlc3RhbmRlbgorICAgICAgaGFiZW4gbXVzcywgdW0gZGllIEFrdGlvbiBhdXNmdWVocmVuIHp1IGtvZW5uZW4uCisKKworCitCRU1FUktVTkdFTjoKKyAgICBEaWVzZSBQcm9wZXJ0eSBlaWduZXQgc2ljaCBoZXJ2b3JyYWdlbmQgZGFmdWVyLCBlaW5pZ2UgR3J1bmRiZWRpbmd1bmdlbgorICAgIGZ1ZXIgZGFzIE51dHplbiBkZXIgV2FmZmUgLyBSdWVzdHVuZyAvIEtsZWlkdW5nIHp1IHN0ZWxsZW4gb2huZSBnbGVpY2gKKyAgICBlaW5lIFdpZWxkLSBvZGVyIFdlYXJGdW5jIHNldHplbiB1bmQgYXVzd2VydGVuIHp1IG11ZXNzZW4uCisKKyAgICBEZW5rYmFyIHdhZXJlIGRlciBFaW5zYXR6IGJlaSBob2Nod2VydGlnZW4gV2FmZmVuIC8gUnVlc3R1bmdlbiAvIEtsZWlkdW5nLAorICAgIHouQi4gYXVzIGRlciBQYXJhLVdlbHQgb2RlciBzb2xjaGVuLCBkaWUgc2ljaCBuYWggYW0gTGltaXQgZGVyIGdlbHRlbmRlbgorICAgIEdyZW56d2VydGUgZnVlciBQX1dDIC8gUF9BQyBiZXdlZ2VuIG9kZXIgc29nYXIgKG5hY2ggR2VuZWhtaWd1bmcgZHVyY2gKKyAgICBkaWUgQmFsYW5jZSkgZGFydWViZXIuCisKK0JFSVNQSUVMOgorICAgIE1pbmRlc3RzdHVmZSAyNTogU2V0UHJvcChQX1JFU1RSSUNUSU9OUywoW1BfTEVWRUw6MjVdKSk7CisgICAgS2VpbmUgTWVuc2NoZW46ICBTZXRQcm9wKFBfUkVTVFJJQ1RJT05TLChbU1JfRVhDTFVERV9SQUNFOih7Ik1lbnNjaCJ9KV0pKTsKKyAgICBBbGlnbm1lbnQgPjQ5OTogIFNldFByb3AoUF9SRVNUUklDVElPTlMsKFtTUl9HT09EOjUwMF0pKTsKKworICAgIEtvbXBsZXhlcmVzIEJlaXNwaWVsCisKKyAgICBRdWVzdCAiRGlhbW9uZCBDbHViIiBiZXN0YW5kZW4sIG1hZ2llcmVpZ2VuZSBQcm9wZXJ0eSBQX0FVU0dBTkdfR0VGVU5ERU4KKyAgICBtdXNzIGdlc2V0enQgc2VpbiwgU3R1ZmUgMTAsIG5pY2h0IHRhdWIsIG1heC4gNDUgRm9vZDoKKyAgICBTZXRQcm9wKFBfUkVTVFJJQ1RJT05TLCAoWyBQX0xFVkVMOiAxMCwgUF9ERUFGOiAxLCBQX0ZPT0Q6IDQ1LAorICAgICAgU1JfUFJPUDogKFtQX0FVU0dBTkdfR0VGVU5ERU46MV0pLCBTUl9RVUVTVDooeyJEaWFtb25kIENsdWIifSkgXSkpOworCitTSUVIRSBBVUNIOgorICAgIGNoZWNrX3Jlc3RyaWN0aW9ucyhMKQorICAgIFdpZWxkRnVuYyhMKSwgV2VhckZ1bmMoTCksIFJlbW92ZUZ1bmMoTCksIFVud2llbGRGdW5jKEwpLAorICAgIFBfV0lFTERfRlVOQywgUF9XRUFSX0ZVTkMsIFBfUkVNT1ZFX0ZVTkMsIFBfVU5XSUVMRF9GVU5DCisgICAgL3N0ZC9hcm1vdXIvd2Vhci5jLCAvc3RkL3dlYXBvbi9jb21iYXQuYywgY2xvdGhpbmcsIGFybW91cnMsIHdlYXBvbgorCitMRVRaVEUgQWVOREVSVU5HOgorMDMuIEphbnVhciAyMDE0LCBBcmF0aG9ybgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfUk9PTV9NU0cgYi9kb2MvcHJvcHMvUF9ST09NX01TRwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzMyNGYyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfUk9PTV9NU0cKQEAgLTAsMCArMSwyMCBAQAorTkFNRToKKyAgICBQX1JPT01fTVNHICAgICAgICAgICAgICAgICAgICAicm9vbV9tc2ciICAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcm9vbS9kZXNjcmlwdGlvbi5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgTGlzdGUgbWl0IE1lbGR1bmdlbiwgZGllIHp1ZmFlbGxpZyBpbSBSYXVtIGF1c2dlZ2ViZW4gd2VyZGVuLgorCisgICAgIEhpZXIgc2luZCBudXIgZGllIFRleHRtZWxkdW5nZW4gYWxzIFN0cmluZy1BcnJheSBnZXNwZWljaGVydC4KKworQU5NRVJLVU5HRU46CisgICAgIEJpdHRlIEFkZFJvb21NZXNzYWdlKCkgenVtIEhpbnp1ZnVlZ2VuL1VlYmVyc2NocmVpYmVuIGJlbnV0emVuIQorCitTSUVIRSBBVUNIOgorICAgICBMRnVuczogICAgQWRkUm9vbU1lc3NhZ2UoKQorICAgICBWZXJ3YW5kdDogdGVsbF9yb29tKCksIFJlY2VpdmVNc2coKQorICAgICBQcm9wczogICAgUF9GVU5DX01TRywgUF9NU0dfUFJPQgorCisyLkZlYiAyMDE2IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9ST09NX1RZUEUgYi9kb2MvcHJvcHMvUF9ST09NX1RZUEUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDlkZDc0NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1JPT01fVFlQRQpAQCAtMCwwICsxLDIzIEBACitOQU1FOgorICAgIFBfUk9PTV9UWVBFICAgICAgICAgICAgICAgICAgICAgICAicm9vbV90eXBlIiAgICAgICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3Jvb21zLmgKKworQkVTQ0hSRUlCVU5HOgorICAgIEluIFBfUk9PTV9UWVBFIHdpcmQgZGllIEFydCBkZXMgUmF1bWVzIGR1cmNoIGVudHNwcmVjaGVuZGUgRmxhZ3MKKyAgICBiZXNjaHJpZWJlbi4KKworICAgIEJpc2hlciB1bnRlcnN0dWV0enQgd2VyZGVuOgorICAgICAgICAtIFJUX1NIT1AgICAgICAgZnVlciBSYWV1bWUsIGRpZSAvc3RkL3Jvb20vc2hvcCBpbmhlcml0ZW4KKyAgICAgICAgLSBSVF9QVUIgICAgICAgIGZ1ZXIgUmFldW1lLCBkaWUgL3N0ZC9yb29tL3B1YiBpbmhlcml0ZW4KKworQkVJU1BJRUw6CisgICAgV2VubiBlaW4gTlBDIGFiZnJhZ2VuIG1vZWNodGUsIG9iIGVyIHNpY2ggaW4gZWluZXIgS25laXBlIGF1ZmhhZWx0ICh1bQorICAgIHNlbGJzdHN0YWVuZGlnIHRhbmtlbiB6dSBrb2VubmVuKSBrb2VubnRlIGVpbmUgQWJmcmFnZSB6LkIuIHNvIGF1c3NlaGVuOgorCisgICAgICAgIGlmICggZW52aXJvbm1lbnQoKSAmJgorICAgICAgICAgICAgIGVudmlyb25tZW50KCktPlF1ZXJ5UHJvcChQX1JPT01fVFlQRSkgJiBSVF9QVUIgKXsKKworICAgICAgICAgICAgLi4uIHRhbmtlbiAuLi4KKyAgICAgICAgfQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfU0JfU1BFTExTIGIvZG9jL3Byb3BzL1BfU0JfU1BFTExTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0YWE3MjMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9TQl9TUEVMTFMKQEAgLTAsMCArMSwyMyBAQAorTkFNRToKKyAgICBQX1NCX1NQRUxMUyAgICAgICAgICAgICJzYl9zcGVsbHMiICAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9uZXdfc2tpbGxzLmgKKworQkVTQ0hSRUlCVU5HOgorICAgIEluIGRpZXNlciBTcGVsbGJvb2twcm9wZXJ0eSBzaW5kIHNhZW10bGljaGUgU3BydWVjaGUgZGVzIFNwZWxsYm9va3MKKyAgICB2ZXJtZXJrdC4gVmVyYWVuZGVydCB3aXJkIHNpZSBkdXJjaCBBZGRTcGVsbCgpLgorCitCRU1FUktVTkdFTjoKKyAgICBNYW4gc29sbHRlIGRpZXNlIFByb3BlcnR5IG5pY2h0IHBlciBIYW5kIHZlcmFlbmRlcm4sIHNvbmRlcm4gZGllCisgICAgRnVua3Rpb24gQWRkU3BlbGwoKSBudXR6ZW4uCisKK1NJRUhFIEFVQ0g6CisgICAgR09iaiBWZXJ3YWx0ZW46ICAgTGVhcm5Ta2lsbCwgTGVhcm5TcGVsbCwgSW5pdGlhbFNraWxsQWJpbGl0eQorICAgICogUHJvcGVydGllczogICAgIFBfR1VJTERfU0tJTExTCisgICAgU3BlbGxib29rIExlcm5lbjogTGVhcm4sIFNwZWxsU3VjY2VzcywgRXJmb2xnLCBNaXNzZXJmb2xnCisgICAgKiBWZXJ3YWx0ZW46ICAgICAgQWRkU3BlbGwsIFF1ZXJ5U3BlbGwKKyAgICAqIFByb3BlcnRpZXM6ICAgICBQX0dMT0JBTF9TS0lMTFBST1BTCisgICAgU2tpbGxzOiAgICAgICAgICAgUF9ORVdTS0lMTFMsIHNwcnVjaGVybXVlZHVuZywgc2tpbGxfaW5mb19saXN0ZQorCitMYXN0IG1vZGlmaWVkOiBXZWQgSmFuIDE0IDE5OjE3OjA2IDE5OTggYnkgUGF0cnluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfU0NSRUVOU0laRSBiL2RvYy9wcm9wcy9QX1NDUkVFTlNJWkUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM5ZGQxNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1NDUkVFTlNJWkUKQEAgLTAsMCArMSw4IEBACitOQU1FOgorICAgIFBfU0NSRUVOU0laRSAgICAgICAgICAgICAgICAgICJzY3JlZW5zaXplIiAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9wbGF5ZXIvYmFzZS5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgQmlsZHNjaGlybWdyb2Vzc2UgaW4gWmVpbGVuIChmdWVyIE1vcmUpCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9TRUNPTkQgYi9kb2MvcHJvcHMvUF9TRUNPTkQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFhODM1YQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1NFQ09ORApAQCAtMCwwICsxLDIxIEBACitOQU1FOgorICAgIFBfU0VDT05EICAgICAgICAgICAgICAgICAgICAgICJzZWNvbmQiICAgICAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9wbGF5ZXIvYmFzZS5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgV2VubiBkaWVzZSBQcm9wIGdlc2V0enQgaXN0LCBpc3QgZGVyIFNwaWVsZXIgZWluIFp3ZWl0aWUuIEluaGFsdCBkZXIKKyAgICAgUHJvcCBpc3QgZWluIFN0cmluZyBtaXQgZGVtIChsb3dlcmNhc2UpIE5hbWVuIGRlcyBFcnN0aWVzLgorCitCRUlTUElFTDoKKyAgICAgaWYgKHRoaXNfcGxheWVyKCktPlF1ZXJ5UHJvcChQX1NFQ09ORCk9PSJub3RzdHJvbSIpIHsKKyAgICAgICB0ZWxsX29iamVjdCh0aGlzX3BsYXllcigpLCAiTmljaHQgYWxsZXMgYXVmZXNzZW4hXG4iKTsKKyAgICAgfQorCitTSUVIRSBBVUNIOgorICAgICBQcm9wZXJ0aWVzOiBQX1NFQ09ORF9NQVJLCisgICAgIFNvbnN0aWdlczogIC9zZWN1cmUvendlaXRpZXMuYworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiAxOC1KdW4tMjAxNSwgQXJhdGhvcm4uCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9TRUNPTkRfTUFSSyBiL2RvYy9wcm9wcy9QX1NFQ09ORF9NQVJLCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYzBjNDIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9TRUNPTkRfTUFSSwpAQCAtMCwwICsxLDE4IEBACitOQU1FOgorICAgIFBfU0VDT05EX01BUksgICAgICAgICAgICAgICAgICJzZWNvbmRfbWFyayIKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcGxheWVyL2Jhc2UuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIEdpYnQgYW4sIHdpZSBtaXQgZGVyIFp3ZWl0aWUtTWFya2llcnVuZyBlaW5lcyBTcGllbGVycyB1bWdlZ2FuZ2VuIHdpcmQuCisKKyAgICAgLTEgICd1bnNpY2h0YmFyZScgTWFya2llcnVuZzsgaW0gd2VyL2t3ZXIgd2lyZCBiZWkgZGllc2VtIFp3ZWl0aWUgcworICAgICAgICAgb2RlciBTIGFuZ2V6ZWlndC4KKworICAgICAgMCAgJ3NpY2h0YmFyZScgTWFya2llcnVuZzsgaW0gd2VyL2t3ZXIgd2lyZCBiZWkgZGllc2VtIFp3ZWl0aWUgeiBvZGVyCisgICAgICAgICBaIGFuZ2V6ZWlndC4gRGVyIE5hbWUgZGVzIEVyc3RpZXMgaXN0IGJlaW0gRmluZ2VybiBqZWRvY2ggbnVyCisgICAgICAgICBmdWVyIE1hZ2llciBzaWNodGJhci4KKworICAgICAgMSAgTWFya2llcnVuZyAnc2ljaHRiYXIgKyBOYW1lJzsgd2llIDAsIG51ciBkYXNzIGJlaW0gRmluZ2VybiBhbGxlCisgICAgICAgICBTcGllbGVyIGRlbiBOYW1lbiBkZXMgRXJzdGllcyBzZWhlbiBrb2VubmVuLgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfU0VFUkRPT1JTIGIvZG9jL3Byb3BzL1BfU0VFUkRPT1JTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZmI4NTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9TRUVSRE9PUlMKQEAgLTAsMCArMSwyNiBAQAorUF9TRUVSRE9PUlMKKworTkFNRToKKyAgICAgUF9TRUVSRE9PUlMgICAgICAicndfc2VoZXJ0b3JlIgorCitERUZJTklFUlQgSU46CisgICAgIC9kL3NlaGVyL3BvcnRhbGUvc2VoZXJ0b3IuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIFNlaGVydG9yLXJlbGV2YW50ZSBQcm9wZXJ0eS4KKworICAgICBFbnRoYWVsdCBlaW4gTWFwcGluZyBtaXQgZGVuIFdlcnRlcGFhcmVuCisgICAgIChbIFNlaGVyLVBvcnRhbC1OdW1tZXI6IHggXSkKKyAgICAgbWl0IHggIT0gMCBmdWVyIGVudGRlY2t0ZSBUb3JlLgorICAgICAKKyAgICAgMCBoYXQgZWluIFNvbmRlcnZlcmhhbHRlbiBmdWVyIG1vYmlsZSBUb3JlLgorCitCRU1FUktVTkc6CisgICAgIEF1ZiBnYXIga2VpbmVuIEZhbGwgaW4gU3BpZWxlcm4gbWFuaXB1bGllcmVuISBVbmQgYml0dGUgZGFzIGVudGhhbHRlbmUKKyAgICAgTWFwcGluZyBuaWNodCB2b24gZWluZW0gU3BpZWxlciBhYmZyYWdlbiB1bmQgUF9TRUVSRE9PUlMgaW4gZWluZW0KKyAgICAgVGVzdHNwaWVsZXIgenV3ZWlzZW4hCisgICAgIAorU0lFSEUgQVVDSDoKKyAgICAgUF9GQU9fUE9SVEFMUworICAgICAKKzEuU2VwdGVtYmVyIDIwMDggR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1NFRVJET09SX0FMTE9XRUQgYi9kb2MvcHJvcHMvUF9TRUVSRE9PUl9BTExPV0VECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MjI1ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9TRUVSRE9PUl9BTExPV0VECkBAIC0wLDAgKzEsMTUgQEAKK05BTUU6CisgICAgUF9TRUVSRE9PUl9BTExPV0VECQkicndfc2VoZXJ0b3JfZXJsYXVidCIgICAgICAgICAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL2Qvc2VoZXIvcG9ydGFsZS9zZWhlcnRvci5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGllc2UgUHJvcGVydHkgbXVzcyBpbiBlaW5lbSBSYXVtIGdlc2V0enQgc2Vpbiwgc29sbAorICAgICBlaW4gU2VoZXIgZG9ydCBlaW4gbW9iaWxlcyBTZWhlcnRvciBhYnN0ZWxsZW4gZHVlcmZlbi4KKyAgICAgWnVzYWV0emxpY2ggZGFyZiBkZXIgUmF1bSBuaWNodCBpbiBQQVJBIGxpZWdlbiB1bmQgbXVzcworICAgICBhbHMgZWlnZW5lcyBGaWxlIGV4aXN0aWVyZW4uCisgICAgIEVzIGlzdCBkYXJhdWYgenUgYWNodGVuLCBTZWhlcnRvcmUgbmljaHQgaW4gUXVlc3RnZWJpZXRlbiwKKyAgICAgZGlyZWt0IGFuIFRhbmtlbiBvZGVyIGFlaG5saWNoZW4gUGxhZXR6ZW4genUgZXJsYXViZW4uCisgICAgIEVzIGdpbHQgZGllIEVpbnNjaGFldHp1bmcgZGVzIGZ1ZXIgZGVuIFJhdW0gVmVyYW50d29ydGxpY2hlbi4KKwpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfU0VOU0lUSVZFIGIvZG9jL3Byb3BzL1BfU0VOU0lUSVZFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZDFmZWUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9TRU5TSVRJVkUKQEAgLTAsMCArMSwxMjUgQEAKK1BfU0VOU0lUSVZFCitOQU1FOgorICAgICBQX1NFTlNJVElWRSAgICAgICAgICAgICAgICAgICAic2Vuc2l0aXZlIgorCitERUZJTklFUlQgSU46CisgICAgIC9zeXMvdGhpbmcvbW92aW5nLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBEaWVzZSBQcm9wZXJ0eSBrYW5uIGluIE9iamVrdGVuIGdlc2V0enQgd2VyZGVuLCBkaWUgYXVmIGJlc3RpbW10ZQorICAgICBTY2hhZGVuc2FydGVuIGVtcGZpbmRsaWNoIHJlYWdpZXJlbiBzb2xsZW4uIE1vZWdsaWNoZSBBbndlbmR1bmdzZmFlbGxlOgorICAgICAtIERhcyBMZWJld2VzZW4sIGluIGRlc3NlbiBJbnZlbnRhciBzaWNoIGVpbiBPYmpla3QgYmVmaW5kZXQsIGVybGVpZGV0CisgICAgICAgZWluZW4gQW5ncmlmZiBtaXQgZGVyIGZyYWdsaWNoZW4gU2NoYWRlbnNhcnQgKEJlaXNwaWVsOiBlaW5lIAorICAgICAgIFB1c3RlYmx1bWUsIGRpZSBiZWkgQW5ncmlmZiBtaXQgTHVmdHNjaGFkZW4gYXVzZWluYW5kZXJmYWVsbHQpLgorICAgICAtIFp3ZWkgT2JqZWt0ZSB0cmVmZmVuIGltIGdsZWljaGVuIEVudmlyb25tZW50IGF1ZmVpbmFuZGVyLCB3b2JlaQorICAgICAgIGVpbmVzIGVtcGZpbmRsaWNoIGF1ZiBlaW5lIFNjaGFkZW5zYXJ0IHJlYWdpZXJ0LCB1bmQgZGFzIHp3ZWl0ZSBkaWVzZQorICAgICAgIFNjaGFkZW5zYXJ0IG1pdGJyaW5ndCwgZC5oLiBkaWUgRW1wZmluZGxpY2hrZWl0IGF1c2xvZXNlbiBrYW5uLgorICAgICAgIChCZWlzcGllbDogZWluIGZldWVyZW1wZmluZGxpY2hlciBQb3N0c2FjayB3aXJkIGFuZ2VzZW5ndCwgd2VubiBlaW5lCisgICAgICAgIGJyZW5uZW5kZSBGYWNrZWwgaW5zIGdsZWljaGUgSW52ZW50YXIga29tbXQuKQorICAgICAgIERhcyBBdXNsb2VzZW4gZGllc2VyIEVtcGZpbmRsaWNoa2VpdCBpc3QgdW5hYmhhZW5naWcgZGF2b24sIHdlbGNoZXMgCisgICAgICAgT2JqZWt0IHp1ZXJzdCBkYSB3YXIuCisKKyAgICAgRGllIFByb3BlcnR5IGVudGhhZWx0IGVpbiBBcnJheSBhdXMgQXJyYXlzOgorICAgICAgICh7PHNlbnNwcm9wc18xPiwgPHNlbnNwcm9wc18yPiwgLi4uLCA8c2Vuc3Byb3BzX24+fSkKKyAgICAgCisgICAgIHdvYmVpIGplZGVyIEVpbnRyYWcgPHNlbnNwcm9wcz4gamV3ZWlscyBmb2xnZW5kZSBTdHJ1a3R1ciBoYXQ6CisgICAgICAgKHtzdHJpbmcgbGlzdF9rZXksIHN0cmluZyBkYW10eXBlLCBpbnQgdHJlc2hvbGQsIG1peGVkIG9wdGlvbnMgfSkKKyAgICAgCisgICAgIERpZSBFaW50cmFlZ2UgaGFiZW4gZGFiZWkgZm9sZ2VuZGUgQmVkZXV0dW5nOgorICAgICAKKyAgICAgbGlzdF9rZXk6IEthbm4gZWluZW4gdm9uIGZvbGdlbmRlbiBkcmVpIFdlcnRlbiBhbm5laG1lbiAKKyAgICAgICAgICAxKSBTRU5TSVRJVkVfSU5WRU5UT1JZLCBwYXNzaXZlIEVpZ2Vuc2NoYWZ0OyB6ZWlndCBhbiwgZGFzcyBkYXMKKyAgICAgICAgICAgICBPYmpla3QgZW1wZmluZGxpY2ggYXVmIGFrdGl2ZSBPYmpla3RlIHJlYWdpZXJ0LCBkaWUgaW4gZGFzCisgICAgICAgICAgICAgSW52ZW50b3J5IGRlcyBDb250YWluZXJzIGhpbmVpbmJld2VndCB3ZXJkZW4KKyAgICAgICAgICAyKSBTRU5TSVRJVkVfQVRUQUNLLCBwYXNzaXZlIEVpZ2Vuc2NoYWZ0OyB6ZWlndCBhbiwgZGFzcyBkYXMgCisgICAgICAgICAgICAgT2JqZWt0IGVtcGZpbmRsaWNoIGF1ZiBhZXVzc2VyZSBFaW5mbHVlc3NlIGJ6dy4gQW5ncmlmZmUgCisgICAgICAgICAgICAgYXVmIGVpbiBMZWJld2VzZW4gcmVhZ2llcnQsIGluIGRlc3NlbiBJbnZlbnRhciBlcyBzaWNoIGJlZmluZGV0CisgICAgICAgICAgMykgU0VOU0lUSVZFX0lOVkVOVE9SWV9UUklHR0VSLCBha3RpdmUgRWlnZW5zY2hhZnQ7IHplaWd0IGFuLCBkYXNzCisgICAgICAgICAgICAgZGFzIE9iamVrdCBlaW5lIEF1c3N0cmFobHVuZyBhdWYgYW5kZXJlIE9iamVrdGUgaW0gSW52ZW50YXIKKyAgICAgICAgICAgICBoYXQuIFdpcmQgYXVzZ2Vsb2VzdCwgd2VubiBkYXMgT2JqZWt0IGlucyBJbnZlbnRhciBoaW5laW5iZXdlZ3QKKyAgICAgICAgICAgICB3aXJkLgorICAgICBkYW10eXBlOiBlaW5lIFNjaGFkZW5zYXJ0IChEVF9GSVJFLCBEVF9XQVRFUiwgLi4uKQorICAgICB0cmVzaG9sZDogaGF0IHp3ZWkgQmVkZXV0dW5nZW4gYWJoYWVuZ2lnIHZvbiBkZW0gV2VydCBpbiBsaXN0X2tleToKKyAgICAgICAgICAxKSBGdWVyIE9iamVrdGUgbWl0IFNFTlNJVElWRV9JTlZFTlRPUlkgb2RlciBTRU5TSVRJVkVfQVRUQ0sgaXN0CisgICAgICAgICAgICAgZGllcyBkZXIgU2NoYWRlbnN3ZXJ0LCBhYiBkZW0gZGFzIE9iamVrdCBiZW5hY2hyaWNodGlndCB3ZXJkZW4gCisgICAgICAgICAgICAgc29sbC4KKyAgICAgICAgICAgICBIaWVyIHdpcmQgZWluIFdlcnQgaW4gIkRlZmVuZC1FaW5oZWl0ZW4iIGVyd2FydGV0LCBkLmguIGRhcworICAgICAgICAgICAgIFplaG5mYWNoZSBkZXNzZW4sIHdhcyBhbSBFbmRlIGluIExQIGFiZ2V6b2dlbiB3dWVyZGUuCisgICAgICAgICAgMikgRnVlciBPYmpla3RlIG1pdCBTRU5TSVRJVkVfSU5WRU5UT1JZX1RSSUdHRVIgaXN0IGRpZXMgZGVyIAorICAgICAgICAgICAgIFNjaGFkZW5zd2VydCwgbWl0IGRlbSBkYXMgT2JqZWt0IGFuZGVyZSBiZXJlaXRzIGltIEludmVudGFyCisgICAgICAgICAgICAgZGVzIENvbnRhaW5lcnMgYmVmaW5kbGljaGUgT2JqZWt0ZSBiZWVpbmZsdXNzdCwgZGllIGVpbmUgCisgICAgICAgICAgICAgZW50c3ByZWNoZW5kZSBFbXBmaW5kbGljaGtlaXQgZ2VzZXR6dCBoYWJlbgorICAgICBvcHRpb25zOiBPcHRpb25hbGUgRGF0ZW4sIGRpZSBkZXIgcHJvZ3JhbW1pZXJlbmRlIE1hZ2llciBzZWxic3QKKyAgICAgICAgICAgIGRlZmluaWVyZW4ga2Fubi4gV2VyZGVuIGFuIGRpZSBpbiBkZW4gYmV0cm9mZmVuZW4gT2JqZWt0ZW4KKyAgICAgICAgICAgIGF1ZmdlcnVmZW5lbiBGdW5rdGlvbmVuIGR1cmNoZ2VyZWljaHQuCisKKyAgICAgRWluIFNFTlNJVElWRV9BVFRBQ0stT2JqZWt0LCBkZXNzZW4gVHJpZ2dlci1CZWRpbmd1bmdlbiBlcmZ1ZWxsdCBzaW5kLAorICAgICB3aXJkIGR1cmNoIGZvbGdlbmRlbiBGdW5rdGlvbnNhdWZydWYgZGFydWViZXIgaW5mb3JtaWVydDoKKyAgICAgICB0cmlnZ2VyX3NlbnNpdGl2ZV9hdHRhY2sob2JqZWN0IGVuZW15LCBzdHJpbmcgZGFtdHlwZSwgaW50IGRhbWFnZSwKKyAgICAgICAgICAgICAgICAgbWl4ZWQgc3BlbGwsIG1peGVkIG9wdGlvbnMpCisgICAgIAorICAgICBFaW4gU0VOU0lUSVZFX0lOVkVOVE9SWS1PYmpla3QsIGRlc3NlbiBUcmlnZ2VyLUJlZGluZ3VuZ2VuIGVyZnVlbGx0IHNpbmQsCisgICAgIHdpcmQgZHVyY2ggZm9sZ2VuZGVuIEZ1bmt0aW9uc2F1ZnJ1ZiBkYXJ1ZWJlciBpbmZvcm1pZXJ0OgorICAgICAgIHRyaWdnZXJfc2Vuc2l0aXZlX2ludihvYmplY3Qgd2hvZGlkLCBzdHJpbmcgZGFtdHlwZSwgaW50IHRocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgbWl4ZWQgb3B0aW9ucywgbWl4ZWQgb3B0aW9ucykKKworICAgICBEaWUgYmVpZGVuIEZ1bmt0aW9uZW4gbXVlc3NlbiBzZWxic3QgZ2UtL3VlYmVyc2NocmllYmVuIHdlcmRlbi4KKworQkVNRVJLVU5HRU46CisgICAgIDEuIFBfU0VOU0lUSVZFLU9iamVrdGUga29zdGVuIFJlY2hlbnplaXQgYmVpIGplZGVtIEFuZ3JpZmYgb2RlciBqZWRlbQorICAgICAgICBtb3ZlKCkgLSBkYWhlciBiaXR0ZSBzcGFyc2FtIHZlcndlbmRlbgorICAgICAyLiBJc3QgUF9TRU5TSVRJVkUgbmljaHQgc3RhdGlzY2gsIHNvbmRlcm4gd2lyZCBlcyBzaXR1YXRpb25zYWJoYWVuZ2lnIAorICAgICAgICBnZWFlbmRlcnQsIG11c3MgbWFuIGRhcyBlbnZpcm9ubWVudCgpIGpld2VpbHMgc2VsYnN0IHVlYmVyIHNlaW5lIAorICAgICAgICBuZXVlIEVtcGZpbmRsaWNoa2VpdCBiZW5hY2hyaWNodGlnZW4uIERpZXMgZ2VzY2hpZWh0IG1pdCBkZW4gCisgICAgICAgIEZ1bmt0aW9uZW4gUmVtb3ZlU2Vuc2l0aXZlT2JqZWN0KCkgYnp3Lkluc2VydFNlbnNpdGl2ZU9iamVjdCgpLCAKKyAgICAgICAgc2llaGUgZGVyZW4gTWFucGFnZXMuCisKK0JFSVNQSUVMOgorICAgICBCZWlzcGllbCAxOgorICAgICBCZWlzcGllbGNvZGUgZWluZXMgT2JqZWt0ZXMgbWl0IFNFTlNJVElWRV9BVFRBQ0sgdW5kIFNFTlNJVElWRV9JTlZFTlRPUlkKKyAgICAgc2llaGUgaGllcjogL2RvYy9iZWlzcGllbGUvdGVzdG9iamVrdGUvYXR0YWNrX2J1c3lfc2Vuc2l0aXZlX3Rlc3RvYmouYworCisgICAgIEJlaXNwaWVsIDI6CisgICAgIEVpbiBFaXN6YXBmZW4sIGRlciBiZWkgRmV1ZXJhbmdyaWZmZW4gb2RlciBiZWkgaGVpc3NlbiBHZWdlbnN0YWVuZGVuIGltCisgICAgIGdlbWVpbnNhbWVuIEVudmlyb25tZW50IHplcnNjaG1lbHplbiBzb2xsOgorCisgICAgIHZvaWQgY3JlYXRlKCkgeworICAgICAgIFNldFByb3AoIFBfU0VOU0lUSVZFLCAoeyAoe1NFTlNJVElWRV9BVFRBQ0ssICAgICBEVF9GSVJFLCAxMDB9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7U0VOU0lUSVZFX0lOVkVOVE9SWSwgRFRfRklSRSwgMTAwfSkgfSkgKTsKKyAgICAgICBbLi4uXQorICAgICB9CisKKyAgICAgdmFyYXJncyB2b2lkIHRyaWdnZXJfc2Vuc2l0aXZlX2F0dGFjaygpIHsKKyAgICAgICByZW1vdmUoKTsKKyAgICAgfQorCisgICAgIHZhcmFyZ3Mgdm9pZCB0cmlnZ2VyX3NlbnNpdGl2ZV9pbnYoKSB7CisgICAgICAgY2FsbF9vdXQoInJlbW92ZSIsMCk7ICAvLyB2ZXJ6b2VnZXJ0LCB3ZWdlbiBtb3ZlKCkKKyAgICAgfQorCisgICAgIHZhcmFyZ3MgaW50IHJlbW92ZShpbnQgc2lsZW50KSB7CisgICAgICAgaWYoIXNpbGVudCkgeworICAgICAgICAgb2JqZWN0IHJvb20gPSBhbGxfZW52aXJvbm1lbnQodGhpc19vYmplY3QoKSlbPDFdOworICAgICAgICAgdGVsbF9yb29tKHJvb20sIE5hbWUoKSsiIHplcnNjaG1pbHp0LlxuIik7CisgICAgICAgfQorICAgICAgIHJldHVybiA6OnJlbW92ZSgpOworICAgICB9CisKKyAgICAgLSB3aXJkIGVpbmUgRmFja2VsIG1pdAorICAgICAgIFNldFByb3AoUF9TRU5TSVRJVkUsKHsoe1NFTlNJVElWRV9JTlZFTlRPUllfVFJJR0dFUixEVF9GSVJFLDI1MH0pfSkpCisgICAgICAgaW4gZGFzIGdsZWljaGUgZW52aXJvbm1lbnQoKSB3aWUgZGllc2VyIFphcGZlbiBiZXdlZ3Qgd2lyZCwgbG9lc3QKKyAgICAgICBkaWVzZSBpbSBaYXBmZW4gdHJpZ2dlcl9zZW5zaXRpdmVfaW52KCkgYXVzCisgICAgIC0gd2lyZCBlaW4gQW5ncmlmZiBtaXQgRFRfRklSRSB1bmQgaW5pdGlhbGVtIFNjaGFkZW4gPiAxMDAgYXVmIGRhcworICAgICAgIGVudmlyb25tZW50KCkgdmVydWVidCwgbG9lc3QgZGllcyBpbSBaYXBmZW4gdHJpZ2dlcl9zZW5zaXRpdmVfYXR0YWNrKCkKKyAgICAgICBhdXMKKworU0lFSEUgQVVDSDoKKyAgICAgUHJvcGVydGllczogUF9TRU5TSVRJVkVfQVRUQUNLLCBQX1NFTlNJVElWRV9JTlZFTlRPUlksCisgICAgICAgICAgICAgICAgIFBfU0VOU0lUSVZFX0lOVkVOVE9SWV9UUklHR0VSCisgICAgIEZ1bmt0aW9uZW46IEluc2VydFNlbnNpdGl2ZU9iamVjdChMKSwgUmVtb3ZlU2Vuc2l0aXZlT2JqZWN0KEwpLAorICAgICAgICAgICAgICAgICBDaGVja1NlbnNpdGl2ZUF0dGFjayhMKSwgRGVmZW5kKCksIAorICAgICAgICAgICAgICAgICBpbnNlcnRfc2Vuc2l0aXZlX2ludihMKSwgaW5zZXJ0X3NlbnNpdGl2ZV9pbnZfdHJpZ2dlcihMKSwKKyAgICAgICAgICAgICAgICAgdHJpZ2dlcl9zZW5zaXRpdmVfaW52KEwpLCB0cmlnZ2VyX3NlbnNpdGl2ZV9hdHRhY2soTCkKKyAgICAgRGVmaW5lczogICAgL3N5cy9zZW5zaXRpdmUuaAorCitMZXR6dGUgQWVuZGVydW5nOiAxMC4gSmFudWFyIDIwMTUsIEFyYXRob3JuCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9TRU5TSVRJVkVfQVRUQUNLIGIvZG9jL3Byb3BzL1BfU0VOU0lUSVZFX0FUVEFDSwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTU4NmViCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfU0VOU0lUSVZFX0FUVEFDSwpAQCAtMCwwICsxLDI0IEBACitQX1NFTlNJVElWRV9BVFRBQ0sKK05BTUU6CisgICAgUF9TRU5TSVRJVkVfQVRUQUNLICAgICAgICAgICAgInNlbnNpdGl2ZV9hdHRhY2siCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3NlbnNpdGl2ZS5oCisKK0JFU0NIUkVJQlVORzoKKyAgICBIaWVyIHN0ZWh0IGRpZSBMaXN0ZSBkZXIgenUgaW5mb3JtaWVyZW5kZW4gT2JqZWt0ZSwgZGllIHBvdGVudGllbGwKKyAgICBhdWYgZWluZW4gQW5ncmlmZiByZWFnaWVyZW4ga29lbm50ZW4uCisgICAgV2lyZCB2b24gSW5zZXJ0U2Vuc2l0aXZlT2JqZWN0KCkgdW5kIFJlbW92ZVNlbnNpdGl2ZU9iamVjdCgpCisgICAgZ2VzY2hyaWViZW4gdW5kIGluIENoZWNrU2Vuc2l0aXZlQXR0YWNrKCkgYXVzZ2V3ZXJ0ZXQuCisKK0JFTUVSS1VOR0VOOgorICAgIE5pY2h0IHNlbGJzdCB2ZXJhZW5kZXJuIC0gYml0dGUgUF9TRU5TSVRJVkUgZnVlciBFaW50cmFlZ2UgYmVudXR6ZW4uCisKK1NJRUhFIEFVQ0g6CisgICAgIFBfU0VOU0lUSVZFCisgICAgIEluc2VydFNlbnNpdGl2ZU9iamVjdCwgUmVtb3ZlU2Vuc2l0aXZlT2JqZWN0CisgICAgIGluc2VydF9zZW5zaXRpdmVfaW52X3RyaWdnZXIsIGluc2VydF9zZW5zaXRpdmVfaW52CisgICAgIFBfU0VOU0lUSVZFX0lOVkVOVE9SWV9UUklHR0VSLCBQX1NFTlNJVElWRV9JTlZFTlRPUlkKKyAgICAgQ2hlY2tTZW5zaXRpdmVBdHRhY2sKKworMjUuQXByLjIwMDEsIEdsb2luc29uQE1HCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9TRU5TSVRJVkVfSU5WRU5UT1JZIGIvZG9jL3Byb3BzL1BfU0VOU0lUSVZFX0lOVkVOVE9SWQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTc1NDIzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfU0VOU0lUSVZFX0lOVkVOVE9SWQpAQCAtMCwwICsxLDI0IEBACitOQU1FOgorICAgIFBfU0VOU0lUSVZFX0lOVkVOVE9SWSAgICAgICAgICJzZW5zaXRpdmVfaW52IgorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9zZW5zaXRpdmUuaAorCitCRVNDSFJFSUJVTkc6CisgICAgSGllciBzdGVodCBkaWUgTGlzdGUgZGVyIHp1IGluZm9ybWllcmVuZGVuIE9iamVrdGUsIGRpZSBwb3RlbnRpZWxsCisgICAgYXVmIGVpbiBhbmRlcmVzIE9iamVrdCBtaXQgZ2VzZXR6dGVtIFBfU0VOU0lUSVZFX0lOVkVOVE9SWV9UUklHR0VSCisgICAgcmVhZ2llcmVuIGtvZW5udGVuLgorICAgIFdpcmQgdm9uIEluc2VydFNlbnNpdGl2ZU9iamVjdCgpIHVuZCBSZW1vdmVTZW5zaXRpdmVPYmplY3QoKQorICAgIGdlc2NocmllYmVuLgorCitCRU1FUktVTkdFTjoKKyAgICBOaWNodCBzZWxic3QgdmVyYWVuZGVybiAtIGJpdHRlIFBfU0VOU0lUSVZFIGZ1ZXIgRWludHJhZWdlIGJlbnV0emVuLgorCitTSUVIRSBBVUNIOgorICAgICBQX1NFTlNJVElWRQorICAgICBJbnNlcnRTZW5zaXRpdmVPYmplY3QsIFJlbW92ZVNlbnNpdGl2ZU9iamVjdAorICAgICBpbnNlcnRfc2Vuc2l0aXZlX2ludl90cmlnZ2VyLCBpbnNlcnRfc2Vuc2l0aXZlX2ludgorICAgICBQX1NFTlNJVElWRV9JTlZFTlRPUllfVFJJR0dFUiwgUF9TRU5TSVRJVkVfQVRUQUNLCisgICAgIENoZWNrU2Vuc2l0aXZlQXR0YWNrCisKKzI1LkFwci4yMDAxLCBHbG9pbnNvbkBNRwpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfU0VOU0lUSVZFX0lOVkVOVE9SWV9UUklHR0VSIGIvZG9jL3Byb3BzL1BfU0VOU0lUSVZFX0lOVkVOVE9SWV9UUklHR0VSCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNmZlYWUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9TRU5TSVRJVkVfSU5WRU5UT1JZX1RSSUdHRVIKQEAgLTAsMCArMSwyNCBAQAorUF9TRU5TSVRJVkVfSU5WRU5UT1JZX1RSSUdHRVIKK05BTUU6CisgICAgUF9TRU5TSVRJVkVfSU5WRU5UT1JZX1RSSUdHRVIgInNlbnNpdGl2ZV9pbnZfdHJpZ2dlciIKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvc2Vuc2l0aXZlLmgKKworQkVTQ0hSRUlCVU5HOgorICAgIEhpZXIgc3RlaHQgZGllIExpc3RlIGRlciBha3RpdmVuIE9iamVrdGUsIGRpZSBlaW5lIHBvdGVudGllbGxlCisgICAgIkF1c3N0cmFobHVuZyIgYXVmIGFuZGVyZSBPYmpla3RlIGhhYmVuLgorICAgIFdpcmQgdm9uIEluc2VydFNlbnNpdGl2ZU9iamVjdCgpIHVuZCBSZW1vdmVTZW5zaXRpdmVPYmplY3QoKQorICAgIGdlc2NocmllYmVuLgorCitCRU1FUktVTkdFTjoKKyAgICBOaWNodCBzZWxic3QgdmVyYWVuZGVybiAtIGJpdHRlIFBfU0VOU0lUSVZFIGZ1ZXIgRWludHJhZWdlIGJlbnV0emVuLgorCitTSUVIRSBBVUNIOgorICAgICBQX1NFTlNJVElWRQorICAgICBJbnNlcnRTZW5zaXRpdmVPYmplY3QsIFJlbW92ZVNlbnNpdGl2ZU9iamVjdAorICAgICBpbnNlcnRfc2Vuc2l0aXZlX2ludl90cmlnZ2VyLCBpbnNlcnRfc2Vuc2l0aXZlX2ludgorICAgICBQX1NFTlNJVElWRV9BVFRBQ0ssIFBfU0VOU0lUSVZFX0lOVkVOVE9SWQorICAgICBDaGVja1NlbnNpdGl2ZUF0dGFjaworCisyNS5BcHIuMjAwMSwgR2xvaW5zb25ATUcKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1NIT09USU5HX0FSRUEgYi9kb2MvcHJvcHMvUF9TSE9PVElOR19BUkVBCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MDU2NGYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9TSE9PVElOR19BUkVBCkBAIC0wLDAgKzEsMjQgQEAKK1BfU0hPT1RJTkdfQVJFQQorCitOQU1FOgorICAgIFBfU0hPT1RJTkdfQVJFQSAgICAgInNob290aW5nX2FyZWEiCisKK0RFRklOSUVSVCBJTjoKKyAgICA8Y29tYmF0Lmg+CisKK0JFU0NIUkVJQlVORzoKKyAgICBMZWd0IGRpZSAnR3JvZXNzZScgZWluZXMgUmF1bWVzIGZlc3QuIEVpbiBTY2h1ZXR6ZSBrYW5uIG1pdCBzZWluZXIKKyAgICBGZXJua2FtcGZ3YWZmZSBudXIgZGFubiBhdXMgZGllc2VtIFJhdW0gaW4gZWluZW4gYW5kZXJlbiBSYXVtIHNjaGllc3NlbiwKKyAgICB3ZW5uIGRpZSBQX1JBTkdFIHNlaW5lciBXYWZmZSBtaW5kZXN0ZW5zIGdsZWljaCBpc3QuCisKKyAgICBFcnJlaWNoYmFyZSBSYWV1bWUgc2luZCBlbnR3ZWRlciBkYXMgZW52aXJvbm1lbnQoKSBvZGVyIGRlciBpbgorICAgIFBfU0hPT1RJTkdfQVJFQSBmZXN0Z2VsZWd0ZSBSYXVtLgorCitTSUVIRSBBVUNIOgorICAgIEdlbmVyZWxsOiAgUF9BTU1VTklUSU9OLCBQX1NIT09USU5HX1dDLCBQX1NUUkVUQ0hfVElNRQorICAgIE1ldGhvZGVuOiAgRmluZFJhbmdlZFRhcmdldChMKSwgc2hvb3RfZGFtKEwpLCBjbWRfc2hvb3QoTCkKKyAgICBHZWJpZXQ6ICAgIFBfUkFOR0UsIFBfVEFSR0VUX0FSRUEKKyAgICBSYWV1bWU6ICAgIFBfTkVWRVJfQ0xFQU4KKyAgICBTb25zdGlnZXM6IGZlcm53YWZmZW4KKworMjkuSnVsIDIwMTQgR2xvaW5zb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9TSE9PVElOR19XQyBiL2RvYy9wcm9wcy9QX1NIT09USU5HX1dDCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1Y2EyMTUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9TSE9PVElOR19XQwpAQCAtMCwwICsxLDMxIEBACitQX1NIT09USU5HX1dDCisKK05BTUU6CisgICAgUF9TSE9PVElOR19XQyAgICAgInNob290aW5nX3djIgorCitERUZJTklFUlQgSU46CisgICAgPGNvbWJhdC5oPgorCitCRVNDSFJFSUJVTkc6CisgICAgTGVndCBpbiBlaW5lciBGZXJua2FtcGZ3YWZmZSBVTkQgaWhyZXIgTXVuaXRpb24gZGllIFdhZmZlbnN0YWVya2UgZmVzdC4KKyAgICBCZWkgZWluZW0gU2NodXNzIHdpcmQgZGllIFN1bW1lIGtvbWJpbmllcnQgbWl0IGRlciBHZXNjaGlja2xpY2hrZWl0CisgICAgenVyIEJlcmVjaG51bmcgZGVyIEFuZ3JpZmZzdGFlcmtlIGJlbnV0enQuCisKK0JFSVNQSUVMRToKKyAgICBTZXRQcm9wKFBfU0hPT1RJTkdfV0MsIDcwKTsgICAgIC8vIExhbmdib2dlbgorICAgIFNldFByb3AoUF9TSE9PVElOR19XQywgNTApOyAgICAgLy8gS3VyemJvZ2VuCisKKyAgICBTZXRQcm9wKFBfU0hPT1RJTkdfV0MsIDQwKTsgICAgIC8vIEJhbWJ1c3BmZWlsCisgICAgU2V0UHJvcChQX1NIT09USU5HX1dDLCA2MCk7ICAgICAvLyBBbHVtaW5pdW1wZmVpbAorCisgICAgLy8gU28gaGFldHRlbiBMYW5nYm9nZW4gbWl0IEFsdW1pbml1bXBmZWlsIGVpbmUgUF9TSE9PVElOR19XQyB2b24gNzArNjAuCisKK1NJRUhFIEFVQ0g6CisgICAgR2VuZXJlbGw6ICBQX0FNTVVOSVRJT04sIFBfU1RSRVRDSF9USU1FCisgICAgTWV0aG9kZW46ICBGaW5kUmFuZ2VkVGFyZ2V0KEwpLCBzaG9vdF9kYW0oTCksIGNtZF9zaG9vdChMKQorICAgIEdlYmlldDogICAgUF9SQU5HRSwgUF9TSE9PVElOR19BUkVBLCBQX1RBUkdFVF9BUkVBCisgICAgV2FmZmVuOiAgICBQX1dFQVBPTl9UWVBFLCBQX1dDLCBQX0VRVUlQX1RJTUUsIFBfTlJfSEFORFMKKyAgICBLYW1wZjogICAgIEF0dGFjayhMKSwgRGVmZW5kKEwpLCBQX0RJU0FCTEVfQVRUQUNLLCBQX0FUVEFDS19CVVNZCisgICAgU29uc3RpZ2VzOiBmZXJud2FmZmVuCisKKzI5Lkp1bCAyMDE0IEdsb2luc29uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfU0hPUlQgYi9kb2MvcHJvcHMvUF9TSE9SVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjUwMmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfU0hPUlQKQEAgLTAsMCArMSw0MSBAQAorUF9TSE9SVAorTkFNRToKKyAgICAgUF9TSE9SVAkJCQkic2hvcnQiCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N5cy90aGluZy9kZXNjcmlwdGlvbi5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGllc2UgUHJvcGVydHkgZW50aGFlbHQgZGllIEt1cnpiZXNjaHJlaWJ1bmcgZGVzIE9iamVrdGVzIGFscyBTdHJpbmcgCisgICAgIG9kZXIgQ2xvc3VyZSAoZGllc2UgbXVzcyBlaW5lbiBTdHJpbmcgenVydWVja2dlYmVuKS4KKworICAgICBBQ0hUVU5HOiBEaWUgS3VyemJlc2NocmVpYnVuZyBzb2xsdGUgZGFiZWkgd2VkZXIgbWl0IGVpbmVtCisJICAgICAgU2F0enplaWNoZW4gbm9jaCBtaXQgZWluZW0gIlxuIiBhYmdlc2NobG9zc2VuIHNlaW4KKwkgICAgICAoZGllcyB3aXJkIHZvbiBkZW4genVzdGFlbmRpZ2VuIEZ1bmt0aW9uZW4gZXJsZWRpZ3QpLgorCisgICAgIFNldHp0IG1hbiBkaWVzZSBQcm9wZXJ0eSBhdWYgMCwgc28gaXN0IGRhcyBPYmpla3QgdW5zaWNodGJhciwgYWxsZXJkaW5ncworICAgICBhbnNwcmVjaGJhciwgd2VubiBkZXIgU3BpZWxlciBlaW5lIElEIGRlcyBPYmpla3RlcyBrZW5udC4gRC5oLiBPYmpla3RlCisgICAgIGtvZW5uZW4gbWl0Z2Vub21tZW4sIHdlZ2dld29yZmVuIG9kZXIgZ2dmLiBhdWNoIGFuZ2VncmlmZmVuIHdlcmRlbi4gV2lsbAorICAgICBtYW4gZGllcyBuaWNodCwgc29sbHRlIG1hbiBkYXMgT2JqZWt0IG1pdCBQX0lOVklTIHVuc2ljaHRiYXIgbWFjaGVuLgorCisgICAgIERpZXNlIFByb3BlcnR5IGJlc3RpbW10IGRpZSBBbnNpY2h0IGRlcyBPYmpla3RlcyB2b24gYXVzc2VuLiBGdWVyIGRpZQorICAgICBJbm5lbihrdXJ6KWFuc2ljaHQgdm9uIFJhZXVtZW4gbXVzcyBtYW4gUF9JTlRfTE9ORyBiZW51dHplbi4KKworQkVNRVJLVU5HRU46CisgICAgIERpZSBGdW5rdGlvbiwgZGllIGRpZSBLdXJ6YmVzY2hyZWlidW5nIGF1c2dpYnQgKHNob3J0KCkpLCBmaWx0ZXJ0IFBfU0hPUlQKKyAgICAgZHVyY2ggcHJvY2Vzc19zdHJpbmcoKS4gVm9uIGRlciBOdXR6dW5nIGRpZXNlcyBGZWF0dXJlcyB3aXJkIGluIG5ldWVtCisgICAgIENvZGUgYWJnZXJhdGVuLgorICAgICBTb2xsIGVpbmUgZHluLiBLdXJ6YmVzY2hyZWlidW5nIGdlc2NoYWZmZW4gd2VyZGVuLCBiaXR0ZSBlaW5lCisgICAgIEZfUVVFUllfTUVUSE9EIGVpbnNldHplbiBvZGVyIHNob3J0KCkgcGFzc2VuZCB1ZWJlcnNjaHJlaWJlbi4KKworQkVJU1BJRUxFOgorICAgICAvLyBlaW5lIEF4dCBzaWVodCBuYXR1ZXJsaWNoIHNvIGF1czoKKyAgICAgU2V0UHJvcChQX1NIT1JULCAiRWluZSBBeHQiKTsKKworU0lFSEUgQVVDSDoKKyAgICAgQWVobmxpY2hlczoJUF9MT05HLCBzaG9ydCgpCisgICAgIFNvbnN0aWdlczoJCVBfSU5UX1NIT1JULCBwcm9jZXNzX3N0cmluZygpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzI3LjA1LjIwMTUsIFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfU0hPUlRfQ1dEIGIvZG9jL3Byb3BzL1BfU0hPUlRfQ1dECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MzQzYWUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9TSE9SVF9DV0QKQEAgLTAsMCArMSw4IEBACitOQU1FOgorICAgIFBfU0hPUlRfQ1dEICAgICAgICAgICAgICAgICAgICJzaG9ydF9jd2QiICAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9zaGVsbHMuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIC5yZWFkbWUgYmVpIGNkIGF1c2dlYmVuIG9kZXIgbmljaHQKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1NIT1dFTUFJTCBiL2RvYy9wcm9wcy9QX1NIT1dFTUFJTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmQxMzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfU0hPV0VNQUlMCkBAIC0wLDAgKzEsMTAgQEAKK05BTUU6CisgICAgIFBfU0hPV0VNQUlMICAgICAgICAgICAgICAgICAgICAgICAgInNob3dlbWFpbCIKKworREVGSU5JRVJUIElOOgorICAgICAvc3lzL3BsYXllci9iYXNlLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBFaW50cmFnLCB3ZXIgZGllIEUtTWFpbCBpbSAiZmluZ2VyIiB6dSBzZWhlbiBiZWtvbW1lbiBzb2xsOgorICAgICAwLCAiYWxsZSIsICJmcmV1bmRlIgorICAgICBLYW5uIGR1cmNoICJlbWFpbGFuemVpZ2UiICgvc3RkL3BsYXllci9iYXNlLmMpIGdlYWVuZGVydCB3ZXJkZW4uCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9TSE9XX0FMSUFTX1BST0NFU1NJTkcgYi9kb2MvcHJvcHMvUF9TSE9XX0FMSUFTX1BST0NFU1NJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I0OWNmOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1NIT1dfQUxJQVNfUFJPQ0VTU0lORwpAQCAtMCwwICsxLDggQEAKK05BTUU6CisgICAgUF9TSE9XX0FMSUFTX1BST0NFU1NJTkcgICAgICAgInNob3dfYWxpYXNfcHJvY2Vzc2luZyIgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3BsYXllci5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgQXJiZWl0IGRlcyBQYXJzZXJzIGJlb2JhY2h0ZW4gKGRlYnVnZ2luZykKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1NIT1dfRVhJVFMgYi9kb2MvcHJvcHMvUF9TSE9XX0VYSVRTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljOGQ4N2IKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9TSE9XX0VYSVRTCkBAIC0wLDAgKzEsMTUgQEAKK05BTUU6CisgICAgUF9TSE9XX0VYSVRTICAgICAgICAgICAgICAgICAgInNob3dfZXhpdHMiCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3BsYXllci9iYXNlLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBJbSBTcGllbGVyIGdlc2V0enQsIHdlbm4gZGVyIFNwaWVsZXIgZGllIG9mZmVuc2ljaHRsaWNoZW4gQXVzZ2FlbmdlCisgICAgIGltbWVyIGF1dG9tYXRpc2NoIHNlaGVuIHdpbGwuCisKK1NJRUhFIEFVQ0g6CisgICAgIEFlaG5saWNoZXM6CVBfSElERV9FWElUUworICAgICBTb25zdGlnZXM6CQlBZGRFeGl0KCksIEdldEV4aXRzKCksIGludF9sb25nKCksIGludF9zaG9ydCgpCisKKzExLiBNYWkgMjAwNCBHbG9pbnNvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1NIT1dfSU5WIGIvZG9jL3Byb3BzL1BfU0hPV19JTlYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNhMmZmZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1NIT1dfSU5WCkBAIC0wLDAgKzEsMTkgQEAKK1BfU0hPV19JTlYKKworTkFNRToKKyAgICAgUF9TSE9XX0lOViAic2hvd19pbnYiCisKK0RFRklOSUVSVCBJTjoKKyAgICAgPHRoaW5nL2Rlc2NyaXB0aW9uLmg+CisKK0JFU0NIUkVJQlVORzoKKyAgICAgV2VubiBkaWVzZSBQcm9wZXJ0eSBhdWYgZWluZW4gV2VydCB1bmdsZWljaCAwIGdlc2V0enQgaXN0LCB3aXJkIGRhcworICAgICBPYmpla3QsIHNvd2VpdCBlcyBzaWNoIGluIGVpbmVtIFNwaWVsZXIgYmVmaW5kZXQsIGluIGRlc3NlbgorICAgICBMYW5nYmVzY2hyZWlidW5nIGFuZ2V6ZWlndC4gWnVyIEFuemVpZ2Ugd2lyZCBkZXIgTmFtZSBkZXMgT2JqZWt0ZXMKKyAgICAgdmVyd2VuZGV0LgorCitTSUVIRSBBVUNIOgorICAgICAvc3RkL3RoaW5nL2Rlc2NyaXB0aW9uLmMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogU3VuIE1heSAxOSAyMDozNjowNSAxOTk2IGJ5IFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfU0hPV19NU0cgYi9kb2MvcHJvcHMvUF9TSE9XX01TRwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODQxMTU0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfU0hPV19NU0cKQEAgLTAsMCArMSw1MSBAQAorUF9TSE9XX01TRworTkFNRToKKyAgICBQX1NIT1dfTVNHICAgICAgICAgICAgICAgICAgICAgICAgICAic2hvd19tZXNzYWdlIgorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9saXZpbmcvcHV0X2FuZF9nZXQuaAorCitCRVNDSFJFSUJVTkc6CisgICAgTWl0IFBfU0hPV19NU0cga2FubiBtYW4gZGllIE1lbGR1bmdlbiwgZGllIGJlaW0gVm9yemVpZ2VuIGVpbmVzIE9iamVrdGVzCisgICAgYXVzZ2VnZWJlbiB3ZXJkZW4sIG1vZGlmaXppZXJlbi4KKworICAgIEZvbGdlbmRlIFdlcnRlIHNpbmQgbW9lZ2xpY2g6CisKKyAgICBvIDAKKyAgICAgIEVzIHdpcmQgZWluZSBTdGFuZGFyZG1lbGR1bmcgYXVzZ2VnZWJlbi4gRGllcyBpc3QgVm9yZWluc3RlbGx1bmcuCisKKyAgICBvIE5PX1BOR19NU0cgICAgICAgID09IC0xCisgICAgICBFcyB3aXJkIGtlaW5lcmxlaSBNZWxkdW5nIGF1c2dlZ2ViZW4KKworICAgIG8gRWluIEFycmF5IGF1cyBTdHJpbmdzCisgICAgICBEZXIgZXJzdGUgU3RyaW5nIHdpcmQgYW4gZGVuIFNwaWVsZXIgYXVzZ2VnZWJlbiwgZGVyIHp3ZWl0ZQorICAgICAgKG9wdGlvbmFsZSkgYW4gZGVuIFJhdW0sIGRlciBkcml0dGUgKGViZW5mYWxscyBvcHRpb25hbGUpIGFuIGRlbgorICAgICAgRW1wZmFlbmdlci4KKworICAgICAgRGllIFN0cmluZ3Mgd2VyZGVuIGR1cmNoIGRpZSBGdW5rdGlvbiByZXBsYWNlX3BlcnNvbmFsKCkgZ2VwYXJzdC4KKyAgICAgICAgT2JqZWt0MSAtIFNwaWVsZXIKKyAgICAgICAgT2JqZWt0MiAtIGRhcyBPYmpla3QsIGRhcyB1ZWJlcmdlYmVuIHdpcmQKKyAgICAgICAgT2JqZWt0MyAtIEVtcGZhZW5nZXIKKworICAgICAgV2lyZCBkZXIgendlaXRlIFN0cmluZyBuaWNodCBhbmdlZ2ViZW4sIGVyZm9sZ3Qga2VpbmUgTWVsZHVuZyBhbiBkZW4KKyAgICAgIFJhdW0uIEJlaW0gRmVobGVuIGRlcyBkcml0dGVuIGdpYnQgZXMga2VpbmUgTWVsZHVuZyBhbiBkZW4gRW1wZmFlbmdlci4KKworQkVJU1BJRUw6CisgICAgU2V0UHJvcChQX1NIT1dfTVNHLCAoeworICAgICAgIkR1IGhhZWx0c3QgQFdFTTMgQFdFTjIgdW50ZXIgZGllIE5hc2UuIiwKKyAgICAgICJAV0VSMSBoYWVsdCBAV0VNMyBAV0VOVTIgdW50ZXIgZGllIE5hc2UuIiwKKyAgICAgICJAV0VSMSBoYWVsdCBEaXIgQFdFTlUyIHVudGVyIGRpZSBOYXNlLiIKKyAgICB9KSk7CisKKyAgICBEYXMgZnVlaHJ0IGJlaSBVZ2FycyAiemVpZyBwZXRlciBtZWRhaWxsZSIgenUgZm9sZ2VuZGVuIE1lbGR1bmdlbjoKKworICAgIFVnYXI6ICJEdSBoYWVsdHN0IFBldGVyIGRpZSBNZWRhaWxsZSB1bnRlciBkaWUgTmFzZS4iCisgICAgUmF1bTogIlVnYXIgaGFlbHQgUGV0ZXIgZWluZSBNZWRhaWxsZSB1bnRlciBkaWUgTmFzZS4iCisgICAgUGV0ZXI6ICJVZ2FyIGhhZWx0IERpciBlaW5lIE1lZGFpbGxlIHVudGVyIGRpZSBOYXNlLiIKKworU0lFSEUgQVVDSDoKKyAgICAgQWVobmxpY2hlczogUF9EUk9QX01TRywgUF9QVVRfTVNHLCBQX1BJQ0tfTVNHLCBQX0dJVkVfTVNHCisgICAgIFNvbnN0aWdlczogIHJlcGxhY2VfcGVyc29uYWwoRSksIHNob3coTCksIHNob3dfb2JqZWN0cyhMKSwKKyAgICAgICAgICAgICAgICAgc2hvd19ub3RpZnkoTCksIC9zdGQvbGl2aW5nL3B1dF9hbmRfZ2V0LmMKKworMy4gSnVuaSAyMDA4IEFteW50aG9yCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9TSUJMSU5HUyBiL2RvYy9wcm9wcy9QX1NJQkxJTkdTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZDA5NzcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9TSUJMSU5HUwpAQCAtMCwwICsxLDkgQEAKK05BTUU6CisgICAgUF9TSUJMSU5HUyAgICAgICAgICAgICAgICAgICAgICJzaWJsaW5ncyIgICAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcGxheWVyL2Jhc2UuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIEVudGhhZWx0IGVpbmVuIFN0cmluZyBtaXQgZGVuIEJsdXRzYnJ1ZWRlcm4gZWluZXMgU3BpZWxlcnMKKyAgICAgKHNvZmVybiB2b3JoYW5kZW4pLgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfU0laRSBiL2RvYy9wcm9wcy9QX1NJWkUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVmZGI3MgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1NJWkUKQEAgLTAsMCArMSwzMSBAQAorTkFNRToKKyAgICBQX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAic2l6ZSIgICAgICAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcHJvcGVydGllcy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgR3JvZXNzZSBkZXMgTGViZXdlc2VucyBiencuIExhZW5nZSBkZXIgV2FmZmUgKGluIGNtKS4KKworICAgICBXaXJkIGtlaW5lIFdhZmZlbmxhZW5nZSBleHBsaXppdCBhbmdlZ2ViZW4sIHNvIHNpbmQgZGllIERlZmF1bHR3ZXJ0ZQorICAgICBmdWVyIGRpZSBlbnRzcHJlY2hlbmRlbiBXYWZmZW50eXBlbiBmb2xnZW5kZToKKworICAgIAlXVF9TV09SRCAgOiAxMDAKKyAgICAJV1RfQVhFICAgIDogIDgwCisgICAgCVdUX0NMVUIgICA6ICA4MAorICAgIAlXVF9TUEVBUiAgOiAxODAKKyAgICAJV1RfS05JRkUgIDogIDIwCisgICAgCVdUX1dISVAgICA6IDIwMAorICAgIAlXVF9TVEFGRiAgOiAxNTAKKworQkVNRVJLVU5HRU46CisgICAgIDEuIFVlYmVydHJlaWJ0IGVzIGJpdHRlIG1pdCBkZXIgR3JvZXNzZSBuaWNodCwgYXVjaCBzZWhyIGdyb3NzZSBOUENzIAorICAgICAgICBzb2xsdGVuIG5pY2h0IHVlYmVyIDEwMDAwMDAgbGllZ2VuLiBTb25zdCBrcmllZ3QgZGllIEthcmF0ZWdpbGRlIAorICAgICAgICBQcm9ibGVtZS4KKyAgICAgMi4gTmVnYXRpdmUgV2VydGUgZnVlciBQX1NJWkUgc2luZCBuaWNodCBtb2VnbGljaCwgZGEgZGllcyB6dW0gZWluZW4KKyAgICAgICAgdm9lbGxpZyB1bnNpbm5pZyBpc3QgdW5kIHp1bSBhbmRlcmVuIGV2dGwuIHp1IFByb2JsZW1lbiBtaXQgV2FmZmVuCisgICAgICAgIGZ1ZWhydCwgZGllIFNjaGFkZW4gaW4gQWJoYWVuZ2lna2VpdCB2b24gUF9TSVpFIG1hY2hlbiB1bmQgc2ljaAorICAgICAgICBkYXJhdWYgdmVybGFzc2VuLCBkYXNzIG51ciBwb3NpdGl2ZSBXZXJ0ZSB2b3Jrb21tZW4uCisKK0xFVFpURSBBRU5ERVJVTkc6CisgICAgMjAwNi0wOS0yOSwgdm9uIFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1NLSUxMUyBiL2RvYy9wcm9wcy9QX1NLSUxMUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmE3NmM3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfU0tJTExTCkBAIC0wLDAgKzEsMTUgQEAKK05BTUU6CisJUF9TS0lMTFMJCQkic2tpbGxzIiAgICAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorCS9zeXMvcGxheWVyL3NraWxscy5oCisKK0JFU0NIUkVJQlVORzoKKwlEaWVzZSBQcm9wZXJ0eSBzb2xsdGUgbmljaHQgbWVociB2ZXJ3ZW5kZXQgd2VyZGVuLiBTaWUgd3VyZGUKKwl2b2xsc3RhZW5kaWcgZHVyY2ggUF9ORVdTS0lMTFMgZXJzZXR6dC4KKworU0lFSEUgQVVDSDoKKwlQX05FV19TS0lMTFMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogV2VkIEphbiAxNCAxOToxNzowNiAxOTk4IGJ5IFBhdHJ5bgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfU0tJTExfQVRUUklCVVRFUyBiL2RvYy9wcm9wcy9QX1NLSUxMX0FUVFJJQlVURVMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmViNWI5NwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1NLSUxMX0FUVFJJQlVURVMKQEAgLTAsMCArMSw1MCBAQAorTkFNRToKKyAgICBQX1NLSUxMX0FUVFJJQlVURVMgICAgICAgICJza2lsbF9hdHRyIgorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9saXZpbmcvc2tpbGxfYXR0cmlidXRlcy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICBJbiBkaWVzZXIgUHJvcCBzdGVoZW4gYWxsZSBuaWNodC1wZXJtYW5lbnRlbiBNb2RpZmlrYXRvcmVuIGRlcgorICAgIFNraWxsLUF0dHJpYnV0ZS4KKyAgICBEaWUgRGF0ZW5zdHJ1a3R1ciBpc3QgZWluIE1hcHBpbmcgbWl0IGRlbiBTQS1OYW1lbiBhbHMgU2NobHVlc3NlbCB1bmQKKyAgICBqZXdlaWxzIGRyZWkgV2VydGVuIHBybyBTY2hsdWVzc2VsLgorICAgIERlciBlcnN0ZSBXZXJ0IGlzdCBlaW4gQXJyYXkgbWl0IGRyZWkgV2VydGVuOiBkZXIgU3VtbWUgZGVyIHN0YXQuCisgICAgTW9kaWZpZXIsIGRlbSBaZWl0cHVua3QgYW4gZGVtIGRpZXMgU3VtbWUgdW5ndWVsdGlnIHdpcmQgdW5kIGRlcgorICAgIEdlc2FtdHphaGwgYWt0aXZlciBNb2RpZmlrYXRvcmVuLgorICAgIERlciB6d2VpdGUgV2VydCBlbnRoYWVsdCBlaW4gTWFwcGluZyBtaXQgYWxsZW4gc3RhdGlzY2hlbiBNb2RpZmlrYXRvcmVuCisgICAgdW5kIGRlbiBPYmpla3RlbiBkaWVzZXIgTW9kcyBhbHMgU2NobHVlc3NlbC4gRGllIGJlaWRlbiBXZXJ0ZSBkaWVzZXMKKyAgICBNYXBwaW5ncyBzaW5kIGRlciBXZXJ0IGRlcyBNb2RpZmlrYXRvcnMgKGludCkgdW5kIGRpZSBBYmxhdWZ6ZWl0IChpbnQpLgorICAgIERlciBkcml0dGUgV2VydCBlbnRoYWVsdCBlaW4gTWFwcGluZyBtaXQgYWxsZW4gZHluYW1pc2NoZW4KKyAgICBNb2RpZmlrYXRvcmVuIHVuZCBkZW4gT2JqZWt0ZW4gZGllc2VyIE1vZHMgYWxzIFNjaGx1ZXNzZWwuIERpZSBiZWlkZW4KKyAgICBXZXJ0ZSBkaWVzZXMgTWFwcGluZ3Mgc2luZCBkaWUgenUgcnVmZW5kZSBDbG9zdXJlIChjbG9zdXJlKSB1bmQgZGllCisgICAgQWJsYXVmemVpdCBkZXMgTW9kcyAoaW50KS4KKworICAgIChbIFNBX0FUVFI6ICh7U3VtbWVfU3RhdF9Nb2RpZmllciwgWmVpdHB1bmt0LCBBbnphaGxNb2RpZmllciwgfSk7CisgICAgICAgICAgICAgICAgKFsgb2IxOnZhbHVlO2R1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgIG9iMjp2YWx1ZTtkdXJhdGlvbiwgLi4uXSk7ICAvLyBzdGF0LiBNb2RpZmllcgorICAgICAgICAgICAgICAgIChbIG9iMTpjbG9zdXJlO2R1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgIG9iMjpjbG9zdXJlO2R1cmF0aW9uLCAuLi5dKSAgICAgLy8gZHluLiBNb2RpZmllcgorICAgICAgICAgICAgICAgICwKKyAgICAgICBTQV9BVFRSMjogKHsuLi59KTsgKFtdKTsgKFtdKSwKKyAgICAgICBTQV9BVFRSMzogKHsuLi59KTsgKFtdKTsgKFtdKSwKKyAgICBdKQorCitCRU1FUktVTkdFTjoKKyAgICBEaWVzZSBQcm9wZXJ0eSBkYXJmIEFVRiBHQVIgS0VJTkVOIEZBTEwgcGVyIEhhbmQgbWFuaXB1bGllcnQgd2VyZGVuLAorICAgIGRhZnVlciBnaWJ0IGVzIGRpZSBGdW5rdGlvbmVuIE1vZGlmeVNraWxsQXR0cmlidXRlKCkgdW5kCisgICAgUmVtb3ZlU2tpbGxBdHRyaWJ1dGVNb2RpZmllcigpLgorICAgIFp1bSBBdXNsZXNlbiBzdGVoZW4gUXVlcnlTa2lsbEF0dHJpYnV0ZSgpIHVuZAorICAgIFF1ZXJ5U2tpbGxBdHRyaWJ1dGVNb2RpZmllcigpIHp1ciBWZXJmdWVndW5nLgorCitTSUVIRSBBVUNIOgorICAgIFNraWxscyBMZXJuZW46ICBMZWFyblNraWxsLCBNb2RpZnlTa2lsbCwgTGltaXRBYmlsaXR5CisgICAgKiBOdXR6dW5nOiAgICAgIFVzZVNwZWxsLCBVc2VTa2lsbAorICAgICogQWJmcmFnZW46ICAgICBRdWVyeVNraWxsLCBRdWVyeVNraWxsQWJpbGl0eQorICAgICogTW9kaWZpa2F0aW9uOiBNb2RpZnlTa2lsbEF0dHJpYnV0ZSwgUXVlcnlTa2lsbEF0dHJpYnV0ZSwKKyAgICAgICAgICAgICAgICAgICAgUXVlcnlTa2lsbEF0dHJpYnV0ZU1vZGlmaWVyLCBSZW1vdmVTa2lsbEF0dHJpYnV0ZU1vZGlmaWVyCisgICAgICAqIFByb3BlcnRpZXM6IFBfU0tJTExfQVRUUklCVVRFUywgUF9TS0lMTF9BVFRSSUJVVEVfT0ZGU0VUUworICAgICogc29uc3RpZzogICAgICBzcHJ1Y2hlcm11ZWR1bmcsIHNraWxsX2luZm9fbGlzdGUKKyAgICAqIFByb3BlcnRpZXM6ICAgUF9ORVdTS0lMTFMKKworMTMuMDkuMjAwOCwgWmVzc3RyYQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1NLSUxMX0FUVFJJQlVURV9PRkZTRVRTIGIvZG9jL3Byb3BzL1BfU0tJTExfQVRUUklCVVRFX09GRlNFVFMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU2OGY3NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1NLSUxMX0FUVFJJQlVURV9PRkZTRVRTCkBAIC0wLDAgKzEsMzIgQEAKK05BTUU6CisgICAgUF9TS0lMTF9BVFRSSUJVVEVfT0ZGU0VUUyAgICAgICAic2tpbGxfYXR0cl9vZmZzZXRzIiAgICAgICAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9saXZpbmcvc2tpbGxfYXR0cmlidXRlcy5oCisKK0JFU0hSRUlCVU5HOgorCisgICAgRGVyIFdlcnQgZGVyIFByb3BlcnR5IGlzdCBlaW4gTWFwcGluZzogKFtBdHRyaWJ1dG5hbWU6IFdlcnRdKQorICAgIEluIGRpZXNlciBQcm9wZXJ0eSBzdGVoZW4gcGVybWFuZW50ZSBBYndlaWNodW5nZW4gZGVyIFNraWxsYXR0cmlidXRlCisgICAgdm9tIFN0YW5kYXJkd2VydCAxMDAuCisKKyAgICBadSBkZW4gTW9lZ2xpY2hlbiBBdHRyaWJ1dHdlcnRlbiwgc2llaGUgUF9TS0lMTF9BVFRSSUJVVEVTLgorCisgICAgRGllIFdlcnRlIGR1ZXJmZW4gendpc2NoZW4gMTAgdW5kIDEwMDAgbGllZ2VuLgorCitCRU1FUktVTkc6CisgICAgRGllc2UgUHJvcGVydHkgc29sbHRlIEFVRiBHQVIgS0VJTkVOIEZBTEwgaW4gZWluZW0gU3BpZWxlciBnZXNldHp0CisgICAgd2VyZGVuLCBvaG5lIFJ1ZWNrc3ByYWNoZW4gbWl0IGFsbGVyaG9lY2hzdGVuIFN0ZWxsZW4hCisKK1NJRUhFIEFVQ0g6CisgICAgU2tpbGxzIExlcm5lbjogIExlYXJuU2tpbGwsIE1vZGlmeVNraWxsLCBMaW1pdEFiaWxpdHkKKyAgICAqIE51dHp1bmc6ICAgICAgVXNlU3BlbGwsIFVzZVNraWxsCisgICAgKiBBYmZyYWdlbjogICAgIFF1ZXJ5U2tpbGwsIFF1ZXJ5U2tpbGxBYmlsaXR5CisgICAgKiBNb2RpZmlrYXRpb246IE1vZGlmeVNraWxsQXR0cmlidXRlLCBRdWVyeVNraWxsQXR0cmlidXRlLAorICAgICAgICAgICAgICAgICAgICBRdWVyeVNraWxsQXR0cmlidXRlTW9kaWZpZXIsIFJlbW92ZVNraWxsQXR0cmlidXRlTW9kaWZpZXIKKyAgICAgICogUHJvcGVydGllczogUF9TS0lMTF9BVFRSSUJVVEVTLCBQX1NLSUxMX0FUVFJJQlVURV9PRkZTRVRTCisgICAgKiBzb25zdGlnOiAgICAgIHNwcnVjaGVybXVlZHVuZywgc2tpbGxfaW5mb19saXN0ZQorICAgICogUHJvcGVydGllczogICBQX05FV1NLSUxMUworCiszMS4xMi4yMDEzLCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1NNRUxMUyBiL2RvYy9wcm9wcy9QX1NNRUxMUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTEwY2UxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfU01FTExTCkBAIC0wLDAgKzEsMjQgQEAKK05BTUU6CisgICAgUF9TTUVMTFMgICAgICAgICAgICAic21lbGxfZGV0YWlscyIKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvdGhpbmcvZGVzY3JpcHRpb24uaAorCitCRVNDSFJFSUJVTkc6CisgICAgRGllc2UgUHJvcGVydHkgZW50c3ByaWNodCBkZW0gUF9ERVRBSUxTIGZ1ZXIgU3RhbmRhcmRkZXRhaWxzLAorICAgIG51ciB3ZXJkZW4gaGllcmluIEdlcnVlY2hlIGdlc3BlaWNoZXJ0OgorICAgIERpZXNlIFByb3BlcnR5IGVudGhhZWx0IGVpbiBNYXBwaW5nLCBpbiBkZXIgRGV0YWlscyBpbSBPYmpla3QKKyAgICBkZWZpbmllcnQgd2VyZGVuIHVuZCBCZXNjaHJlaWJ1bmdlbiwgZGllIGF1c2dlZ2ViZW4gd2VyZGVuLCB3ZW5uIG1hbgorICAgIHNpY2ggZGllc2UgRGV0YWlscyBhbnNjaGF1dC4KKworQkVNRVJLVU5HRU46CisgICAgTWFuIHNvbGx0ZSBkaWVzZSBQcm9wZXJ0eSBuaWNodCBwZXIgSGFuZCB2ZXJhZW5kZXJuLCBzb25kZXJuIGRpZQorICAgIEZ1bmt0aW9uZW4gbnV0emVuLgorCitTSUVIRSBBVUNIOgorICAgIFNldHplbjogICAgQWRkU21lbGxzKCkKKyAgICBMb2VzY2hlbjogIFJlbW92ZVNtZWxscygpCisgICAgQWVobmxpY2g6ICBBZGREZXRhaWwoKSwgUF9ERVRBSUxTCisgICAgU29uc3RpZ2VzOiBHZXREZXRhaWwoKSwgYnJlYWtfc3RyaW5nKCkKKworMjcuIEphbiAyMDEzIEdsb2luc29uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfU05PT1BGTEFHUyBiL2RvYy9wcm9wcy9QX1NOT09QRkxBR1MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM0N2UzOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1NOT09QRkxBR1MKQEAgLTAsMCArMSw4IEBACitOQU1FOgorICAgIFBfU05PT1BGTEFHUyAgICAgICAgICAgICAgICAgICJzbm9vcGZsYWdzIiAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9zbm9vcGluZy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAqKiogS0VJTkUgQkVTQ0hSRUlCVU5HIFZPUkhBTkRFTiAqKioKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1NPVU5EUyBiL2RvYy9wcm9wcy9QX1NPVU5EUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjlhMzUwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfU09VTkRTCkBAIC0wLDAgKzEsMjQgQEAKK05BTUU6CisgICAgUF9TT1VORFMgICAgICAgICAgICAic291bmRfZGV0YWlscyIKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvdGhpbmcvZGVzY3JpcHRpb24uaAorCitCRVNDSFJFSUJVTkc6CisgICAgRGllc2UgUHJvcGVydHkgZW50c3ByaWNodCBkZW0gUF9ERVRBSUxTIGZ1ZXIgU3RhbmRhcmRkZXRhaWxzLCAgIAorICAgIG51ciB3ZXJkZW4gaGllcmluIEdlcmF1ZXNjaGUgZ2VzcGVpY2hlcnQ6CisgICAgRGllc2UgUHJvcGVydHkgZW50aGFlbHQgZWluIE1hcHBpbmcsIGluIGRlciBEZXRhaWxzIGltIE9iamVrdAorICAgIGRlZmluaWVydCB3ZXJkZW4gdW5kIEJlc2NocmVpYnVuZ2VuLCBkaWUgYXVzZ2VnZWJlbiB3ZXJkZW4sIHdlbm4gbWFuCisgICAgc2ljaCBkaWVzZSBEZXRhaWxzIGFuc2NoYXV0LgorCitCRU1FUktVTkdFTjoKKyAgICBNYW4gc29sbHRlIGRpZXNlIFByb3BlcnR5IG5pY2h0IHBlciBIYW5kIHZlcmFlbmRlcm4sIHNvbmRlcm4gZGllCisgICAgRnVua3Rpb25lbiBudXR6ZW4uCisKK1NJRUhFIEFVQ0g6CisgICAgU2V0emVuOiAgICBBZGRTb3VuZHMoKQorICAgIExvZXNjaGVuOiAgUmVtb3ZlU291bmRzKCkKKyAgICBBZWhubGljaDogIEFkZERldGFpbCgpLCBQX0RFVEFJTFMKKyAgICBTb25zdGlnZXM6IEdldERldGFpbCgpLCBicmVha19zdHJpbmcoKQorCisyNy4gSmFuIDIwMTMgR2xvaW5zb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9TUCBiL2RvYy9wcm9wcy9QX1NQCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYmFiNjUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9TUApAQCAtMCwwICsxLDIzIEBACitOQU1FOgorICAgIFBfU1AgICAgICAgICAgICAgICAgICAgICAgICAgICJzcCIKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvbGl2aW5nL2xpZmUuaAorCitCRVNDSFJFSUJVTkc6CisKKyAgICAgLSBMZWJld2VzZW4KKyAgICAgICBBbnphaGwgZGVyIEtvbnplbnRyYXRpb25zcHVua3RlIGRlcyBXZXNlbnMuCisKKyAgICAgLSBTcGVpc2VuL0tuZWlwZW4KKyAgICAgICBIZWlsd2lya3VuZyBlaW5lciBQb3J0aW9uIGRlciBTcGVpc2UgYXVmIGRpZSBLb256ZW50cmF0aW9uc3B1bmt0ZQorICAgICAgIGRlcyBLb25zdW1lbnRlbgorCitTSUVIRSBBVUNIOgorICAgICBQcm9wczoJCVBfTUFYX1NQCisgICAgIFZlcmFlbmRlcnVuZzoJcmVkdWNlX3NwZWxsX3BvaW50cygpLCByZXN0b3JlX3NwZWxsX3BvaW50cygpCisJCQlidWZmZXJfc3AoKQorICAgICBTcGVpc2VuL0tuZWlwZW46ICAgc3RkL3B1Yiwgd2l6L2Zvb2QsIGNvbnN1bWUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBUaHUgT2N0IDI4IDEyOjE1OjAwIDIwMTAgYnkgQ2FsZHJhClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfU1BFQ0lBTF9ERVRBSUxTIGIvZG9jL3Byb3BzL1BfU1BFQ0lBTF9ERVRBSUxTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYjIxMjMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9TUEVDSUFMX0RFVEFJTFMKQEAgLTAsMCArMSwyMyBAQAorTkFNRToKKyAgICBQX1NQRUNJQUxfREVUQUlMUyAgICAgICAgICAgICAic3BlY2lhbF9kZXRhaWxzIiAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvdGhpbmcvZGVzY3JpcHRpb24uaAorCitCRVNDSFJFSUJVTkc6CisgICAgTWFwcGluZyB2b24gRGV0YWlscywgZGllIGJlaW0gQW5zY2hhdWVuIGVpbmUgRnVua3Rpb24gc3RhcnRlbi4KKworQkVNRVJLVU5HRU46CisgICAgRGllcyBpc3Qga2VpbmUgImVjaHRlIiBQcm9wZXJ0eS4gRGllIERhdGVuIHdlcmRlbiBiZWkgZGVyIEFiZnJhZ2UgaW4gZWluZXIKKyAgICBRdWVyeW1ldGhvZGUgZHluYW1pc2NoIGF1cyBQX0RFVEFJTFMgZXh0cmFoaWVydC4gRGVtZW50c3ByZWNoZW5kCisgICAgZnVua3Rpb25pZXJ0IGVzIGF1Y2ggbmljaHQsIGhpZXIgZWluZSBRdWVyeS0gb2RlciBTZXRtZXRob2RlIHZvbiBhdXNzZW4KKyAgICBkcmF1ZiB6dSBsZWdlbi4KKworU0lFSEUgQVVDSDoKKyAgICBTZXR6ZW46ICAgIEFkZERldGFpbCgpCisgICAgTG9lc2NoZW46ICBSZW1vdmVEZXRhaWwoKQorICAgIERhdGVuOiAgICAgUF9ERVRBSUxTCisgICAgVmVyYWx0ZXQ6ICBBZGRTcGVjaWFsRGV0YWlsKCksIFJlbW92ZVNwZWNpYWxEZXRhaWwoKQorICAgIFNvbnN0aWdlczogR2V0RGV0YWlsKCksIGJyZWFrX3N0cmluZygpCisKKzI3LiBKYW4gMjAxMyBHbG9pbnNvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1NQRUNJQUxfRVhJVFMgYi9kb2MvcHJvcHMvUF9TUEVDSUFMX0VYSVRTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MTQzNjYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9TUEVDSUFMX0VYSVRTCkBAIC0wLDAgKzEsOSBAQAorTkFNRToKKyAgICBQX1NQRUNJQUxfRVhJVFMgICAgICAgICAgICAgICAic3BlY2lhbF9leGl0cyIgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcHJvcGVydGllcy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGl0bywgYWJlciBhbnN0YXR0IGRlcyBOYWNoYmFycmF1bXMgd2lyZCBlaW5lIEZ1bmt0aW9uIChpbSBSYXVtKQorICAgICBhbmdlZ2ViZW0sIGRpZSBiZWkgRWluZ2FiZSBkZXIgUmljaHR1bmcgYXVzZ2VmdWVocnQgd2lyZC4KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1NQRUxMUkFURSBiL2RvYy9wcm9wcy9QX1NQRUxMUkFURQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjcyYTMzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfU1BFTExSQVRFCkBAIC0wLDAgKzEsOCBAQAorTkFNRToKKyAgICBQX1NQRUxMUkFURSAgICAgICAgICAgICAgICAgICAic3BlbGxyYXRlIiAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcHJvcGVydGllcy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgTlBDLVNwZWxscmF0ZSAoaW4gJSkKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1NQRUxMUyBiL2RvYy9wcm9wcy9QX1NQRUxMUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzExMmZiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfU1BFTExTCkBAIC0wLDAgKzEsOCBAQAorTkFNRToKKyAgICBQX1NQRUxMUyAgICAgICAgICAgICAgICAgICAgICAic3BlbGxzIiAgICAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcHJvcGVydGllcy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgTlBDLVNwZWxscwpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfU1BfREVMQVkgYi9kb2MvcHJvcHMvUF9TUF9ERUxBWQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGY2MzcyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfU1BfREVMQVkKQEAgLTAsMCArMSwxMCBAQAorTkFNRToKKyAgICBQX1NQX0RFTEFZICAgICAgICAgICAgICAgICAic3BfZGVsYXkiICAgICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL2xpdmluZy9saWZlLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBBbnphaGwgZGVyIGhlYXJ0X2JlYXRzLCBiaXMgZGllIE1hZ2llcHVua3RlIHVtIGVpbmVuIFB1bmt0IHN0ZWlnZW4uCisgICAgIEFlbmRlcnVuZ2VuIGRpZXNlciBQcm9wZXJ0eSBpbiBTcGllbGVybiBiZWR1ZXJmZW4gZGVyIAorICAgICBHZW5laG1pZ3VuZyBkZXMgRU0gZnVlciBCYWxhbmNlLgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfU1RBUlRfSE9NRSBiL2RvYy9wcm9wcy9QX1NUQVJUX0hPTUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVmZmYyYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1NUQVJUX0hPTUUKQEAgLTAsMCArMSw4IEBACitOQU1FOgorICAgIFBfU1RBUlRfSE9NRSAgICAgICAgICAgICAgICAgICJzdGFydF9ob21lIiAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9wbGF5ZXIvYmFzZS5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgUmF1bSwgaW4gZGVtIGRlciBTcGllbGVyIG5hY2ggZGVtIEVpbmxvZ2dlbiBsYW5kZW4gc29sbApkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfU1REX09CSkVDVCBiL2RvYy9wcm9wcy9QX1NURF9PQkpFQ1QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdlMjFkYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1NURF9PQkpFQ1QKQEAgLTAsMCArMSwzOCBAQAorTkFNRToKKyAgICBQX1NURF9PQkpFQ1QgICAgICAgICAgICAgICAgICAic3RkX29iamVjdCIgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvdl9jb21waWxlci5oCisKK0JFU0NIUkVJQlVORzoKKyAgIEVudGhhZWx0IGRlbiBOYW1lbiBlaW5lcyBGaWxlcyB3ZWxjaGVzIGFscyBTdGFuZGFyZC1PYmpla3QgZnVlciBkZW4gCisgICBWaXJ0dWFsIENvbXBpbGVyIGdlbHRlbiBzb2xsLgorCisgICBJbiBkaWVzZW0gRmlsZSB3ZXJkZW4gZGFzIGdlbmVyZWxsZSBBdXNzZWhlbiwgQXVzZ2FlbmdlLCBGdW5rdGlvbmVuCisgICB1c3cuIGRlciBWQy1nZW5lcmllcnRlbiBSYWV1bWUgLyBPYmpla3RlIGZlc3RnZWxlZ3QuCisKKyAgIERpZXNlcyBGaWxlIGlzdCBlaW4gJ25vcm1hbGVzJyAuYyAtIEZpbGUsIHdlbGNoZXMgZ2VjbG9udCB3aXJkIHVuZAorICAgYW5zY2hsaWVzc2VuZCB1bWJlbmFubnQgd2lyZC4KKyAgIAorICAgR2FueiB3aWNodGlnOiBGYWxscyBldWVyIFN0YW5kYXJkb2JqZWt0IChkaXJla3Qgb2RlciBpbmRpcmVrdCkgdm9uCisgICAvc3RkL3Jvb20uYyBlcmJ0LCBzb2xsdGV0IGlociBkYXJhdWYgYWNodGVuLCBkYXNzIGV1ZXIgT2JqZWt0IGF1c3NlciBkZW0KKyAgIGNyZWF0ZSgpIG5vY2ggZWluZSB3ZWl0ZXJlIChiZWxpZWJpZ2UpIEZ1bmt0aW9uIGhhdC4gIAorICAgQW5zb25zdGVuIHd1ZXJkZSBkYXMgUHJvZ3JhbW0gZXVyZXMgU3RhbmRhcmRvYmpla3RzIGF1dG9tYXRpc2NoIGR1cmNoCisgICAvc3RkL3Jvb20uYyBlcnNldHp0LCB3YXMgaW4gZGVyIFJlZ2VsIHp1IHNjaHdlciB6dSBmaW5kZW5lbiBCdWdzIGZ1ZWhydC4KKworQkVJU1BJRUw6CisgICAoY3JlYXRlIGVpbmVzIFZDcykKKyAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZSgpIHsKKyAgICAgLi4uCisgICAgIFNldFByb3AoUF9TVERfT0JKRUNULCIvZC9yZWdpb24vbWFnaWVyL3ZjL3N0ZF9yYXVtIik7CisgICAgIC4uLgorICAgfQorCisgICBXYXMgaW4gZGllc2VtIHN0ZF9yYXVtLmMgbnVuIHN0ZWh0LCB3aXJkIGluIGplZGVtIFZDLUNsb25lCisgICB2ZXJmdWVnYmFyLiBTZWkgZXMgRGV0YWlscywgR2VydWVjaGUsIGF1Y2ggT2JqZWt0ZSBkaWUgcGVyIAorICAgQWRkSXRlbSBlaW5nZWJ1bmRlbiBzaW5kLCAuLi4KKworU0lFSEUgQVVDSDoKKyAgIFBfQ09NUElMRVJfUEFUSCwgdmlydHVhbF9jb21waWxlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xldHp0ZSBBZW5kZXJ1bmc6IDIyLjEwLjA3IHZvbiBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9TVE9SRV9DT05TVU1FIGIvZG9jL3Byb3BzL1BfU1RPUkVfQ09OU1VNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjY1NjQxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfU1RPUkVfQ09OU1VNRQpAQCAtMCwwICsxLDUxIEBACitOQU1FOgorCVBfU1RPUkVfQ09OU1VNRQkJCSJzdG9yZV9jb25zdW1lIgorCitERUZJTklFUlQgSU46CisJL3N5cy9iYW5rLmgKKworQkVTQ0hSRUlCVU5HOgorCURpZXNlIFByb3BlcnR5IGlzdCBlbnRzY2hlaWRlbmQgZGFmdWVyLCB3aWV2aWVsIFByb3plbnQgYW4gT2JqZWt0ZW4KKwliZWkgamVkZW0gUmVzZXQgaW4gZWluZW0gTGFnZXIgZWluZXMgTGFkZW5zIHZlcm5pY2h0ZXQgd2VyZGVuLiBEaWVzCisJZ2VzY2hpZWh0IGF1cyBTcGVpY2hlci0gdW5kIExhZ2dydWVuZGVuLiBFcyB2ZXJibGVpYnQgZGFiZWkgamVkb2NoCisJZWluZSBHcnVuZG1lbmdlIGFuIE9iamVrdGVuLCBkZXJlbiBBbnphaGwgaW4gZGVyIFByb3BlcnR5CisJUF9NSU5fU1RPQ0sgZmVzdGdlaGFsdGVuIGlzdC4gU3RhbmRhcmR3ZXJ0IGZ1ZXIgUF9TVE9SRV9DT05TVU1FIGlzdAorCWhpZXJiZWkgMzAlLCBhYmVyIGluIG9mdCBiZW51dHp0ZW4gTGFlZGVuIGthbm4gbWFuIGRvcnQgcnVoaWcgZWluZW4KKwlob2VoZXJlbiBXZXJ0IGVpbnRyYWdlbi4gRXJsYXVidCBzaW5kIFdlcnRlIHp3aXNjaGVuIDAlIHVuZCAxMDAlLgorCUF1ZmdlcmFldW10IHdlcmRlbiBqZWRvY2gga2VpbmUgT2JqZWt0ZSwgZGllIG1pdHRlbHMgQWRkSXRlbSgpIGltCisJTGFnZXIgZWluZ2VidW5kZW4gd3VyZGVuLiBNaXR0ZWxzIGRlciBMYWRlbmZ1bmt0aW9uIEFkZEZpeGVkT2JqZWN0KCkKKwlhbHMgc3RhZW5kaWcgdmVyZnVlZ2JhciBtYXJraWVydGUgT2JqZWt0ZSB3ZXJkZW4gbmF0dWVybGljaCBhdWNoCisJbmljaHQgYmVydWVja3NpY2h0aWd0LgorCUJlaWRlIGhpZXIgZXJ3YWVobnRlbiBQcm9wZXJ0aWVzIHNvbGx0ZW4gdWViZXJpZ2VucyBudXIgbWl0dGVscworCVF1ZXJ5UHJvcC9TZXRQcm9wIGF1c2dlbGVzZW4gYnp3LiB2ZXJhZW5kZXJ0IHdlcmRlbi4KKworQkVJU1BJRUw6CisJRWluIGVpZ2VuZXIgaGFldWZpZyBiZW51dHp0ZXIgTGFkZW4ga29lbm50ZSBlaW4gTGFnZXIgaW4gZm9sZ2VuZGVyCisJRm9ybSBlcmhhbHRlbjoKKwkgIC8vIG15U3RvcmUKKwkgICNpbmNsdWRlIDxiYW5rLmg+CisJICBpbmhlcml0ICJzdGQvc3RvcmUiOworCSAgdm9pZCBjcmVhdGUoKQorCSAgeyA6OmNyZWF0ZSgpOworCSAgICBTZXRQcm9wKFBfU1RPUkVfQ09OU1VNRSw5MCk7CisJICAgIC8vIGtlaW5lIHdlaXRlcmVuIEJlc2NocmVpYnVuZ2VuLCBTcGllbGVyIHNvbGxlbiBkYSBkcmluCisJICAgIC8vIHNjaGxpZXNzbGljaCBuaWNodCBydW13dXNlbG4KKwkgIH0KKwlVbSBkYXMgTGFnZXIgZGVtIExhZGVuIHp1enV3ZWlzZW4sIG51dHp0IG1hbiBmb2xnZW5kZXM6CisJICAvLyBteVNob3AKKwkgIGluaGVyaXQgInN0ZC9sYWRlbiI7CisJICB2b2lkIGNyZWF0ZSgpCisJICB7IDo6Y3JlYXRlKCk7CisJICAgIFNldFN0b3JhZ2VSb29tKCJwZmFkL215U3RvcmUiKTsKKwkgICAgLy8gQmVzY2hyZWlidW5nZW4gZm9sZ2VuCisJICAgIC4uLgorCSAgfQorCUVzIHdlcmRlbiBoaWVyYmVpIHdhZWhyZW5kIGplZGVzIExhZ2VyLVJlc2V0cyA5MCUgZGVyIGltIExhZ2VyCisJYmVmaW5kbGljaGVuIE9iamVrdGUgdmVybmljaHRldC4KKworU0lFSEUgQVVDSDoKKwlQX01JTl9TVE9DSywgU2V0U3RvcmFnZVJvb20oKSwgL3N0ZC9zdG9yZS5jLCAvc3RkL3Nob3AuYworCUFkZEl0ZW0oKSwgUmVtb3ZlSXRlbSgpLCBBZGRGaXhlZE9iamVjdCgpLCBSZW1vdmVGaXhlZE9iamVjdCgpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IDE5LUp1bi0yMDE1LCBBcmF0aG9ybiAKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1NUUkVUQ0hfVElNRSBiL2RvYy9wcm9wcy9QX1NUUkVUQ0hfVElNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmVmNGYxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfU1RSRVRDSF9USU1FCkBAIC0wLDAgKzEsMjAgQEAKK1BfU1RSRVRDSF9USU1FCisKK05BTUU6CisgICAgUF9TVFJFVENIX1RJTUUgICAgICJzdHJldGNoX3RpbWUiCisKK0RFRklOSUVSVCBJTjoKKyAgICA8Y29tYmF0Lmg+CisKK0JFU0NIUkVJQlVORzoKKyAgICBFbnRoYWVsdCBkaWUgWmVpdCBpbiBSdW5kZW4gKDJzKSwgZGllIG1hbiBicmF1Y2h0LCB1bSBlaW5lIEZlcm53YWZmZSB6dQorICAgIHNwYW5uZW4vYmVudXR6ZW4uIFphZWhsdCBzZWl0IGRlbSBsZXR6dGVuIFNjaHVzcyBvZGVyIGRlciBaZWl0IGRlcworICAgIFp1ZWNrZW5zIChQX0VRVUlQX1RJTUUpLgorCitTSUVIRSBBVUNIOgorICAgIEdlbmVyZWxsOiAgUF9BTU1VTklUSU9OLCBQX1NIT09USU5HX1dDCisgICAgTWV0aG9kZW46ICBGaW5kUmFuZ2VkVGFyZ2V0KEwpLCBzaG9vdF9kYW0oTCksIGNtZF9zaG9vdChMKQorICAgIEdlYmlldDogICAgUF9SQU5HRSwgUF9TSE9PVElOR19BUkVBLCBQX1RBUkdFVF9BUkVBCisgICAgU29uc3RpZ2VzOiBmZXJud2FmZmVuCisKKzI5Lkp1bCAyMDE0IEdsb2luc29uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfU1VCR1VJTERfVElUTEUgYi9kb2MvcHJvcHMvUF9TVUJHVUlMRF9USVRMRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGE1OWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfU1VCR1VJTERfVElUTEUKQEAgLTAsMCArMSwyMCBAQAorUF9TVUJHVUlMRF9USVRMRQorTkFNRToKKyAgICAgUF9TVUJHVUlMRF9USVRMRQkJInN1Ymd1aWxkX3RpdGxlIiAgICAgICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N5cy9uZXdfc2tpbGxzLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBEaWVzZSBQcm9wZXJ0eSBlbnRoYWVsdCBldmVudHVlbGxlIFp1c2F0enRpdGVsIGVpbmVzIFNwaWVsZXJzLCBkZW4gZXIKKyAgICAgaW5uZXJoYWxiIGVpbmVyIEdpbGRlIHRyYWVndC4gRGFzIGthbm4gei5CLiBlaW4gQ2xhbiBzZWluLCBlaW4gWndlaWcgb2RlcgorICAgICBlaW5mYWNoIG51ciBkZXIgR2lsZGVucmFuZy4KKworQkVNRVJLVU5HRU46CisgICAgIEluaGFsdCBkZXIgUHJvcGVydHkga2FubiAwIHNlaW4gb2RlciBlaW4gU3RyaW5nLiAgRWluIFp1c2F0enRpdGVsIGthbm4KKyAgICAgbWl0dGVscyBQX1ZJU0lCTEVfU1VCR1VJTERfVElUTEUgdm9yZ2V0YWV1c2NodCB3ZXJkZW4uCisKK1NJRUhFIEFVQ0g6CisgICAgIFBfR1VJTERfVElUTEUsIFBfVklTSUJMRV9TVUJHVUlMRF9USVRMRQorCisyNi4gTWFlcnogMjAwNCBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfVEFSR0VUX0FSRUEgYi9kb2MvcHJvcHMvUF9UQVJHRVRfQVJFQQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDJjZWM5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfVEFSR0VUX0FSRUEKQEAgLTAsMCArMSw3NSBAQAorUF9UQVJHRVRfQVJFQQorCitOQU1FOgorICAgIFBfVEFSR0VUX0FSRUEgICAgICJ0YXJnZXRfYXJlYSIKKworREVGSU5JRVJUIElOOgorICAgIDxjb21iYXQuaD4KKworQkVTQ0hSRUlCVU5HOgorICAgIEthbm4gaW4gZWluZW0gUmF1bSBnZXNldHp0IHdlcmRlbiwgdW0gZWluZW4gYW5kZXJlbiwgdm9uIGRvcnQgYXVzIG1pdAorICAgIEZlcm5rYW1wZndhZmZlbiBiZXNjaGllc3NiYXJlbiBSYXVtIGFscyBPYmpla3Qgb2RlciBPYmpla3RuYW1lbiAoenUKKyAgICBlaW5lbSBnZWxhZGVuZW4gT2JqZWt0KSBmZXN0enVsZWdlbi4KKworQkVNRVJLVU5HRU46CisgICAgRWluIFNjaHVldHplIGthbm4gbnVyIGluIGRlbiBhbmRlcmVuIFJhdW0gc2NoaWVzc2VuLCB3ZW5uIGRpZSBQX1JBTkdFCisgICAgc2VpbmVyIFdhZmZlIG1pbmRlc3QgZ2xlaWNoIGRlciBQX1NIT09USU5HX0FSRUEgZGVzIFJhdW1zIChuaWNodCBkZXMKKyAgICBaaWVscmF1bXMpIGlzdC4KKworICAgIElkZWFsZXJ3ZWlzZSBzb2xsdGUgaW4gbWl0IFBfVEFSR0VUX0FSRUEgYW5nZWdlYmVuZW4gUmFldW1lbiBhdWNoCisgICAgUF9ORVZFUl9DTEVBTiBnZXNldHp0IHNlaW4uCisKK0JFSVNQSUVMRToKKyAgICAvLyAjMSBFaW4gQmF1bS1SYXVtICgvc3RkL3Jvb20pCisgICAgdm9pZCBjcmVhdGUoKSB7CisgICAgICA6OmNyZWF0ZSgpOworICAgICAgU2V0UHJvcChQX0lOVF9TSE9SVCwgIkF1ZiBlaW5lbSBCYXVtIik7CisgICAgICBTZXRQcm9wKFBfSU5UX0xPTkcsIGJyZWFrX3N0cmluZygiRHUgaG9ja3N0IGF1ZiBlaW5lbSBCYXVtIHVuZCBrYW5uc3QgIgorICAgICAgICAiYXVmIGRpZSBMaWNodHVuZyB1bnRlciBEaXIgc2VoZW4uXG4iKTsKKworICAgICAgQWRkRXhpdCgidW50ZW4iLCBSQUVVTUUoImxpY2h0dW5nIikpOworCisgICAgICBTZXRQcm9wKFBfVEFSR0VUX0FSRUEsIFJBRVVNRSgibGljaHR1bmciKSk7ICAvLyBMaWNodHVuZyBiZXNjaGllc3NiYXIKKyAgICAgIFNldFByb3AoUF9TSE9PVElOR19BUkVBLCAxNSk7ICAgICAgICAgICAgICAgIC8vIDE1IEVudGZlcm51bmcKKyAgICB9CisKKyAgICAvLyAjMiBFaW4gRWxlZmFudGVuLVRyYW5zcG9ydGVyICgvc3RkL3RyYW5zcG9ydCkKKyAgICAvLyBFciB0cmFtcGVsdCBkdXJjaCBtZWhyZXJlIFJhZXVtZSBkdXJjaCB1bmQgZGVyIFNjaHVldHplIGthbm4gdm9tCisgICAgLy8gUnVlY2tlbiBkZXMgRWxlZmFudGVuIGF1cyBhdWYgR2VnbmVyIGRyYXVzc2VuIHNjaGllc3Nlbi4KKyAgICB2b2lkIGNyZWF0ZSgpIHsKKyAgICAgIDo6Y3JlYXRlKCk7CisgICAgICBTZXRQcm9wKFBfTkFNRSwgIkthbXBmZWxlZmFudCIpOworICAgICAgQWRkSWQoKHsiZWxlZmFudCIsICJrYW1wZmVsZWZhbnQiKX0pOworICAgICAgU2V0UHJvcChQX0dFTkRFUiwgTUFMRSk7CisgICAgICBTZXRQcm9wKFBfU0hPUlQsICJFaW4gS2FtcGZlbGVmYW50Iik7CisgICAgICBTZXRQcm9wKFBfSU5UX1NIT1JULCAiQXVmIGVpbmVtIEthbXBmZWxlZmFudGVuIik7CisgICAgICAvLyBQX0xPTkcsIFBfSU5UX0xPTkcKKworICAgICAgU2V0UHJvcChQX0VOVEVSQ01EUywgKHsia2xldHRlciIsICJlcmtsZXR0ZXIifSkpOworICAgICAgU2V0UHJvcChQX0xFQVZFQ01EUywgKHsidmVybGFzcyIsICJ2ZXJsYXNzZSJ9KSk7CisKKyAgICAgIFNldFByb3AoUF9BUlJJVkVNU0csICh7IkRlciBFbGVmYW50IHRyYW1wZWx0IGluIGVpbmVuIFJhdW0uXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRWluIEthbXBmZWxlZmFudCB0cmFtcGVsdCBoZXJlaW4uXG4ifSkpOworICAgICAgU2V0UHJvcChQX0RFUEFSVE1TRywgKHsiRGVyIEVsZWZhbnQgdHJhbXBlbHQgd2VpdGVyLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlciBLYW1wZmVsZWZhbnQgdHJhbXBlbHQgd2VpdGVyLlxuIn0pKTsKKworICAgICAgU2V0UHJvcChQX1NIT09USU5HX0FSRUEsIDgpOyAvLyB3ZWl0ZXIgYWxzIDggc29sbHRlIG1hbiBzY2hpZXNzZW4KKworICAgICAgQWRkUm91dGUoUkFFVU1FKCJzY2hsYWNodGZlbGQiKSwgMjArcmFuZG9tKDEwKSwgNiwgIlNjaGxhY2h0ZmVsZCIpOworICAgICAgQWRkUm91dGUoUkFFVU1FKCJidXJndG9yIiksIDIwK3JhbmRvbSgxMCksIDYsICJCdXJndG9yIik7CisgICAgICBBZGRSb3V0ZShSQUVVTUUoImJ1cmdob2YiKSwgMjArcmFuZG9tKDEwKSwgNiwgIkJ1cmdob2YiKTsKKyAgICAgIEFkZFJvdXRlKFJBRVVNRSgiaGFsbGUiKSwgMjArcmFuZG9tKDEwKSwgNiwgIkhhbGxlIik7CisgICAgICBBZGRSb3V0ZShSQUVVTUUoImJyZXNjaGUiKSwgMjArcmFuZG9tKDEwKSwgNiwgIkJyZXNjaGUiKTsKKyAgICAgIC8vIC4uLgorCisgICAgICBTdGFydCgpOworICAgIH0KKworU0lFSEUgQVVDSDoKKyAgICBHZW5lcmVsbDogIFBfQU1NVU5JVElPTiwgUF9TSE9PVElOR19XQywgUF9TVFJFVENIX1RJTUUKKyAgICBNZXRob2RlbjogIEZpbmRSYW5nZWRUYXJnZXQoTCksIHNob290X2RhbShMKSwgY21kX3Nob290KEwpCisgICAgR2ViaWV0OiAgICBQX1JBTkdFLCBQX1NIT09USU5HX0FSRUEKKyAgICBSYWV1bWU6ICAgIFBfTkVWRVJfQ0xFQU4KKyAgICBTb25zdGlnZXM6IGZlcm53YWZmZW4KKworMjkuSnVsIDIwMTQgR2xvaW5zb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9URUFNIGIvZG9jL3Byb3BzL1BfVEVBTQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDMxMDlkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfVEVBTQpAQCAtMCwwICsxLDI0IEBACitOQU1FOgorCVBfVEVBTSAgICAgICAgICAgICAgICAgICAgICAgICAidGVhbSIKKworREVGSU5JRVJUIElOOgorCS9zeXMvbGl2aW5nL3RlYW0uaAorCitCRVNDSFJFSUJVTkc6CisJTGllZmVydCBkYXMgVGVhbW9iamVrdCwgZmFsbHMgU3BpZWxlciBpbiBlaW5lbSBUZWFtIGlzdCwgc29uc3QgMC4KKworU0lFSEUgQVVDSDoKKyAgICAgICAgVWViZXJzaWNodDogdGVhbWthbXBmCisgICAgICAgIFByb3BlcnRpZXM6IFBfQVNTT0NfTUVNQkVSUywgUF9URUFNX0FUVEFDS19DTUQsIFBfVEVBTV9BVVRPRk9MTE9XLAorICAgICAgICAgICAgICAgICAgICBQX1RFQU1fQ09MT1JTLCBQX1RFQU1fTEVBREVSLCBQX1RFQU1fTkVXTUVNQkVSLAorICAgICAgICAgICAgICAgICAgICBQX1RFQU1fV0FOVEVEX1JPVywgUF9URUFNX1dJTVBZX1JPVworICAgICAgICBCZXdlZ3VuZzogICBJc1RlYW1Nb3ZlLCBUZWFtRmxlZQorICAgICAgICBNaXRnbGllZGVyOiBJc1RlYW1MZWFkZXIsIFRlYW1NZW1iZXJzCisgICAgICAgIEthbXBmOiAgICAgIERlQXNzb2NNZW1iZXIsIEluc2VydEVuZW15VGVhbSwgU2VsZWN0TmVhckVuZW15LAorICAgICAgICAgICAgICAgICAgICBTZWxlY3RGYXJFbmVteQorICAgICAgICBQb3NpdGlvbmVuOiBQcmVzZW50UG9zaXRpb24sIFByZXNlbnRSb3dzLCBQcmVzZW50RW5lbXlSb3dzLAorICAgICAgICAgICAgICAgICAgICBQcmVzZW50VGVhbVBvc2l0aW9uLCBTd2FwUm93cworICAgICAgICBTb25zdGlnZXM6ICBUZWFtUHJlZml4LCB0ZWFta2FtcGZfaW50ZXJuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IDE2LTA4LTIwMTAsIEdhYnlsb24KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1RFQU1fQVNTT0NfTUVNQkVSUyBiL2RvYy9wcm9wcy9QX1RFQU1fQVNTT0NfTUVNQkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGY5NWI4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfVEVBTV9BU1NPQ19NRU1CRVJTCkBAIC0wLDAgKzEsMzAgQEAKK05BTUU6CisJUF9URUFNX0FTU09DX01FTUJFUlMgICAgICAgICAgICJ0ZWFtX2Fzc29jX21lbWJlcnMiCisKK0RFRklOSUVSVCBJTjoKKwkvc3lzL2xpdmluZy90ZWFtLmgKKworQkVTQ0hSRUlCVU5HOgorCUFycmF5IG1pdCBkZW4genVnZW9yZG5ldGVuIE5QQ3MgZGVzIFNwaWVsZXJzIGJ6dy4gZGVyIFNwaWVsZXIsCisJZGVtIGRpZXNlciBOUEMgenVnZW9yZG5ldCBpc3QuCisJWnVnZW9yZG5ldGUgTlBDcyBzaW5kIGF1dG9tYXRpc2NoIGltIFRlYW0gZGVzIFNwaWVsZXJzLgorCitCRU1FUktVTkc6CisJRGVyIFp1Z3JpZmYgYXVmIGRpZXNlIFByb3BlcnR5IHNvbGx0ZSB1ZWJlciBBc3NvY01lbWJlcigpCisJYnp3LiBEZUFzc29jTWVtYmVyKCkgZXJmb2xnZW4uCisKK1NJRUhFIEFVQ0g6CisgICAgICAgIFVlYmVyc2ljaHQ6IHRlYW1rYW1wZgorICAgICAgICBQcm9wZXJ0aWVzOiBQX1RFQU0sIFBfVEVBTV9BVFRBQ0tfQ01ELCBQX1RFQU1fQVVUT0ZPTExPVywKKyAgICAgICAgICAgICAgICAgICAgUF9URUFNX0NPTE9SUywgUF9URUFNX0xFQURFUiwgUF9URUFNX05FV01FTUJFUiwKKyAgICAgICAgICAgICAgICAgICAgUF9URUFNX1dBTlRFRF9ST1csIFBfVEVBTV9XSU1QWV9ST1cKKyAgICAgICAgQmV3ZWd1bmc6ICAgSXNUZWFtTW92ZSwgVGVhbUZsZWUKKyAgICAgICAgTWl0Z2xpZWRlcjogSXNUZWFtTGVhZGVyLCBUZWFtTWVtYmVycworICAgICAgICBLYW1wZjogICAgICBEZUFzc29jTWVtYmVyLCBJbnNlcnRFbmVteVRlYW0sIFNlbGVjdE5lYXJFbmVteSwKKyAgICAgICAgICAgICAgICAgICAgU2VsZWN0RmFyRW5lbXkKKyAgICAgICAgUG9zaXRpb25lbjogUHJlc2VudFBvc2l0aW9uLCBQcmVzZW50Um93cywgUHJlc2VudEVuZW15Um93cywKKyAgICAgICAgICAgICAgICAgICAgUHJlc2VudFRlYW1Qb3NpdGlvbiwgU3dhcFJvd3MKKyAgICAgICAgU29uc3RpZ2VzOiAgVGVhbVByZWZpeCwgdGVhbWthbXBmX2ludGVybgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiAxNi0wOC0yMDEwLCBHYWJ5bG9uCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9URUFNX0FUVEFDS19DTUQgYi9kb2MvcHJvcHMvUF9URUFNX0FUVEFDS19DTUQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y3NzM0OQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1RFQU1fQVRUQUNLX0NNRApAQCAtMCwwICsxLDI0IEBACitOQU1FOgorCVBfVEVBTV9BVFRBQ0tfQ01EICAgICAgICAgICAgICAidGVhbV9hdHRhY2tfY21kIgorCitERUZJTklFUlQgSU46CisJL3N5cy9saXZpbmcvdGVhbS5oCisKK0JFU0NIUkVJQlVORzoKKwlBbmdyaWZmc2JlZmVobCBkZXMgU3BpZWxlcnMsIG5pY2h0IHNldHpiYXIuCisKK1NJRUhFIEFVQ0g6CisgICAgICAgIFVlYmVyc2ljaHQ6IHRlYW1rYW1wZgorICAgICAgICBQcm9wZXJ0aWVzOiBQX1RFQU0sIFBfQVNTT0NfTUVNQkVSUywgUF9URUFNX0FVVE9GT0xMT1csCisgICAgICAgICAgICAgICAgICAgIFBfVEVBTV9DT0xPUlMsIFBfVEVBTV9MRUFERVIsIFBfVEVBTV9ORVdNRU1CRVIsCisgICAgICAgICAgICAgICAgICAgIFBfVEVBTV9XQU5URURfUk9XLCBQX1RFQU1fV0lNUFlfUk9XCisgICAgICAgIEJld2VndW5nOiAgIElzVGVhbU1vdmUsIFRlYW1GbGVlCisgICAgICAgIE1pdGdsaWVkZXI6IElzVGVhbUxlYWRlciwgVGVhbU1lbWJlcnMKKyAgICAgICAgS2FtcGY6ICAgICAgRGVBc3NvY01lbWJlciwgSW5zZXJ0RW5lbXlUZWFtLCBTZWxlY3ROZWFyRW5lbXksCisgICAgICAgICAgICAgICAgICAgIFNlbGVjdEZhckVuZW15CisgICAgICAgIFBvc2l0aW9uZW46IFByZXNlbnRQb3NpdGlvbiwgUHJlc2VudFJvd3MsIFByZXNlbnRFbmVteVJvd3MsCisgICAgICAgICAgICAgICAgICAgIFByZXNlbnRUZWFtUG9zaXRpb24sIFN3YXBSb3dzCisgICAgICAgIFNvbnN0aWdlczogIFRlYW1QcmVmaXgsIHRlYW1rYW1wZl9pbnRlcm4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogMTYtMDgtMjAxMCwgR2FieWxvbgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfVEVBTV9BVVRPRk9MTE9XIGIvZG9jL3Byb3BzL1BfVEVBTV9BVVRPRk9MTE9XCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YmU1MGYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9URUFNX0FVVE9GT0xMT1cKQEAgLTAsMCArMSwyNCBAQAorTkFNRToKKwlQX1RFQU1fQVVUT0ZPTExPVyAgICAgICAgICAgICAgInRlYW1fYXV0b2ZvbGxvdyIKKworREVGSU5JRVJUIElOOgorCS9zeXMvbGl2aW5nL3RlYW0uaAorCitCRVNDSFJFSUJVTkc6CisJRm9sZ2V3dW5zY2ggZGVzIFNwaWVsZXJzLCBuaWNodCBzZXR6YmFyLgorCitTSUVIRSBBVUNIOgorICAgICAgICBVZWJlcnNpY2h0OiB0ZWFta2FtcGYKKyAgICAgICAgUHJvcGVydGllczogUF9URUFNLCBQX0FTU09DX01FTUJFUlMsIFBfVEVBTV9BVFRBQ0tfQ01ELAorICAgICAgICAgICAgICAgICAgICBQX1RFQU1fQ09MT1JTLCBQX1RFQU1fTEVBREVSLCBQX1RFQU1fTkVXTUVNQkVSLAorICAgICAgICAgICAgICAgICAgICBQX1RFQU1fV0FOVEVEX1JPVywgUF9URUFNX1dJTVBZX1JPVworICAgICAgICBCZXdlZ3VuZzogICBJc1RlYW1Nb3ZlLCBUZWFtRmxlZQorICAgICAgICBNaXRnbGllZGVyOiBJc1RlYW1MZWFkZXIsIFRlYW1NZW1iZXJzCisgICAgICAgIEthbXBmOiAgICAgIERlQXNzb2NNZW1iZXIsIEluc2VydEVuZW15VGVhbSwgU2VsZWN0TmVhckVuZW15LAorICAgICAgICAgICAgICAgICAgICBTZWxlY3RGYXJFbmVteQorICAgICAgICBQb3NpdGlvbmVuOiBQcmVzZW50UG9zaXRpb24sIFByZXNlbnRSb3dzLCBQcmVzZW50RW5lbXlSb3dzLAorICAgICAgICAgICAgICAgICAgICBQcmVzZW50VGVhbVBvc2l0aW9uLCBTd2FwUm93cworICAgICAgICBTb25zdGlnZXM6ICBUZWFtUHJlZml4LCB0ZWFta2FtcGZfaW50ZXJuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IDE2LTA4LTIwMTAsIEdhYnlsb24KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1RFQU1fQ09MT1JTIGIvZG9jL3Byb3BzL1BfVEVBTV9DT0xPUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIzODE1ZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1RFQU1fQ09MT1JTCkBAIC0wLDAgKzEsMjUgQEAKK05BTUU6CisJUF9URUFNX0NPTE9SUyAgICAgICAgICAgICAgICAgICJ0ZWFtX2NvbG9ycyIKKworREVGSU5JRVJUIElOOgorCS9zeXMvbGl2aW5nL3RlYW0uaAorCitCRVNDSFJFSUJVTkc6CisJR3Jlbnp3ZXJ0ZSBmdWVyIGZhcmJpZ2UgQW56ZWlnZSBpbSBUZWFtaW5mby4KKwlBcnJheSBtaXQgNCBXZXJ0ZW46ICh7IGxwX3JvdCwgbHBfZ2VsYiwgc3Bfcm90LCBzcF9nZWxiIH0pCisKK1NJRUhFIEFVQ0g6CisgICAgICAgIFVlYmVyc2ljaHQ6IHRlYW1rYW1wZgorICAgICAgICBQcm9wZXJ0aWVzOiBQX1RFQU0sIFBfQVNTT0NfTUVNQkVSUywgUF9URUFNX0FUVEFDS19DTUQsCisgICAgICAgICAgICAgICAgICAgIFBfVEVBTV9BVVRPRk9MTE9XLCBQX1RFQU1fTEVBREVSLCBQX1RFQU1fTkVXTUVNQkVSLAorICAgICAgICAgICAgICAgICAgICBQX1RFQU1fV0FOVEVEX1JPVywgUF9URUFNX1dJTVBZX1JPVworICAgICAgICBCZXdlZ3VuZzogICBJc1RlYW1Nb3ZlLCBUZWFtRmxlZQorICAgICAgICBNaXRnbGllZGVyOiBJc1RlYW1MZWFkZXIsIFRlYW1NZW1iZXJzCisgICAgICAgIEthbXBmOiAgICAgIERlQXNzb2NNZW1iZXIsIEluc2VydEVuZW15VGVhbSwgU2VsZWN0TmVhckVuZW15LAorICAgICAgICAgICAgICAgICAgICBTZWxlY3RGYXJFbmVteQorICAgICAgICBQb3NpdGlvbmVuOiBQcmVzZW50UG9zaXRpb24sIFByZXNlbnRSb3dzLCBQcmVzZW50RW5lbXlSb3dzLAorICAgICAgICAgICAgICAgICAgICBQcmVzZW50VGVhbVBvc2l0aW9uLCBTd2FwUm93cworICAgICAgICBTb25zdGlnZXM6ICBUZWFtUHJlZml4LCB0ZWFta2FtcGZfaW50ZXJuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IDE2LTA4LTIwMTAsIEdhYnlsb24KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1RFQU1fTEVBREVSIGIvZG9jL3Byb3BzL1BfVEVBTV9MRUFERVIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEyM2MzNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1RFQU1fTEVBREVSCkBAIC0wLDAgKzEsMjQgQEAKK05BTUU6CisJUF9URUFNX0xFQURFUiAgICAgICAgICAgICAgICAgICJ0ZWFtX2xlYWRlciIKKworREVGSU5JRVJUIElOOgorCS9zeXMvbGl2aW5nL3RlYW0uaAorCitCRVNDSFJFSUJVTkc6CisJTGllZmVydCBkYXMgVGVhbW9iamVrdCwgZmFsbHMgU3BpZWxlciBBbmZ1ZWhyZXIgZWluZXMgVGVhbXMgaXN0LgorCitTSUVIRSBBVUNIOgorICAgICAgICBVZWJlcnNpY2h0OiB0ZWFta2FtcGYKKyAgICAgICAgUHJvcGVydGllczogUF9URUFNLCBQX0FTU09DX01FTUJFUlMsIFBfVEVBTV9BVFRBQ0tfQ01ELAorICAgICAgICAgICAgICAgICAgICBQX1RFQU1fQVVUT0ZPTExPVywgUF9URUFNX0NPTE9SUywgUF9URUFNX05FV01FTUJFUiwKKyAgICAgICAgICAgICAgICAgICAgUF9URUFNX1dBTlRFRF9ST1csIFBfVEVBTV9XSU1QWV9ST1cKKyAgICAgICAgQmV3ZWd1bmc6ICAgSXNUZWFtTW92ZSwgVGVhbUZsZWUKKyAgICAgICAgTWl0Z2xpZWRlcjogSXNUZWFtTGVhZGVyLCBUZWFtTWVtYmVycworICAgICAgICBLYW1wZjogICAgICBEZUFzc29jTWVtYmVyLCBJbnNlcnRFbmVteVRlYW0sIFNlbGVjdE5lYXJFbmVteSwKKyAgICAgICAgICAgICAgICAgICAgU2VsZWN0RmFyRW5lbXkKKyAgICAgICAgUG9zaXRpb25lbjogUHJlc2VudFBvc2l0aW9uLCBQcmVzZW50Um93cywgUHJlc2VudEVuZW15Um93cywKKyAgICAgICAgICAgICAgICAgICAgUHJlc2VudFRlYW1Qb3NpdGlvbiwgU3dhcFJvd3MKKyAgICAgICAgU29uc3RpZ2VzOiAgVGVhbVByZWZpeCwgdGVhbWthbXBmX2ludGVybgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiAxNi0wOC0yMDEwLCBHYWJ5bG9uCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9URUFNX05FV01FTUJFUiBiL2RvYy9wcm9wcy9QX1RFQU1fTkVXTUVNQkVSCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MDZjNWIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9URUFNX05FV01FTUJFUgpAQCAtMCwwICsxLDI1IEBACitOQU1FOgorCVBfVEVBTV9ORVdNRU1CRVIgICAgICAgICAgICAgICAicG90ZW50aWFsX3RlYW1fbWVtYmVyIgorCitERUZJTklFUlQgSU46CisJL3N5cy9saXZpbmcvdGVhbS5oCisKK0JFU0NIUkVJQlVORzoKKwlFbnRoYWVsdCBkYXMgT2JqZWt0IGRlcyBUZWFtbGVhZGVycywgc29iYWxkIGVpbiBTcGllbGVyIHVtCisJVGVhbWF1Zm5haG1lIGdlYmV0ZW4gaGF0LCBzb25zdCAwLgorCitTSUVIRSBBVUNIOgorICAgICAgICBVZWJlcnNpY2h0OiB0ZWFta2FtcGYKKyAgICAgICAgUHJvcGVydGllczogUF9URUFNLCBQX0FTU09DX01FTUJFUlMsIFBfVEVBTV9BVFRBQ0tfQ01ELAorICAgICAgICAgICAgICAgICAgICBQX1RFQU1fQVVUT0ZPTExPVywgUF9URUFNX0NPTE9SUywgUF9URUFNX0xFQURFUiwKKyAgICAgICAgICAgICAgICAgICAgUF9URUFNX1dBTlRFRF9ST1csIFBfVEVBTV9XSU1QWV9ST1cKKyAgICAgICAgQmV3ZWd1bmc6ICAgSXNUZWFtTW92ZSwgVGVhbUZsZWUKKyAgICAgICAgTWl0Z2xpZWRlcjogSXNUZWFtTGVhZGVyLCBUZWFtTWVtYmVycworICAgICAgICBLYW1wZjogICAgICBEZUFzc29jTWVtYmVyLCBJbnNlcnRFbmVteVRlYW0sIFNlbGVjdE5lYXJFbmVteSwKKyAgICAgICAgICAgICAgICAgICAgU2VsZWN0RmFyRW5lbXkKKyAgICAgICAgUG9zaXRpb25lbjogUHJlc2VudFBvc2l0aW9uLCBQcmVzZW50Um93cywgUHJlc2VudEVuZW15Um93cywKKyAgICAgICAgICAgICAgICAgICAgUHJlc2VudFRlYW1Qb3NpdGlvbiwgU3dhcFJvd3MKKyAgICAgICAgU29uc3RpZ2VzOiAgVGVhbVByZWZpeCwgdGVhbWthbXBmX2ludGVybgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiAxNi0wOC0yMDEwLCBHYWJ5bG9uCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9URUFNX1dBTlRFRF9ST1cgYi9kb2MvcHJvcHMvUF9URUFNX1dBTlRFRF9ST1cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NkM2MzNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1RFQU1fV0FOVEVEX1JPVwpAQCAtMCwwICsxLDI0IEBACitOQU1FOgorCVBfVEVBTV9XQU5URURfUk9XICAgICAgICAgICAgICAidGVhbV93YW50ZWRfcm93IgorCitERUZJTklFUlQgSU46CisJL3N5cy9saXZpbmcvdGVhbS5oCisKK0JFU0NIUkVJQlVORzoKKwlHZXd1ZW5zY2h0ZSBSZWloZSBkZXMgU3BpZWxlcnMgKHZvbiAxIGJpcyBNQVhfVEVBTVJPV1MpCisKK1NJRUhFIEFVQ0g6CisgICAgICAgIFVlYmVyc2ljaHQ6IHRlYW1rYW1wZgorICAgICAgICBQcm9wZXJ0aWVzOiBQX0FTU09DX01FTUJFUlMsIFBfVEVBTV9BVFRBQ0tfQ01ELCBQX1RFQU1fQVVUT0ZPTExPVywKKyAgICAgICAgICAgICAgICAgICAgUF9URUFNX0NPTE9SUywgUF9URUFNX0xFQURFUiwgUF9URUFNX05FV01FTUJFUiwKKyAgICAgICAgICAgICAgICAgICAgUF9URUFNX1dJTVBZX1JPVworICAgICAgICBCZXdlZ3VuZzogICBJc1RlYW1Nb3ZlLCBUZWFtRmxlZQorICAgICAgICBNaXRnbGllZGVyOiBJc1RlYW1MZWFkZXIsIFRlYW1NZW1iZXJzCisgICAgICAgIEthbXBmOiAgICAgIERlQXNzb2NNZW1iZXIsIEluc2VydEVuZW15VGVhbSwgU2VsZWN0TmVhckVuZW15LAorICAgICAgICAgICAgICAgICAgICBTZWxlY3RGYXJFbmVteQorICAgICAgICBQb3NpdGlvbmVuOiBQcmVzZW50UG9zaXRpb24sIFByZXNlbnRSb3dzLCBQcmVzZW50RW5lbXlSb3dzLAorICAgICAgICAgICAgICAgICAgICBQcmVzZW50VGVhbVBvc2l0aW9uLCBTd2FwUm93cworICAgICAgICBTb25zdGlnZXM6ICBUZWFtUHJlZml4LCB0ZWFta2FtcGZfaW50ZXJuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IDE2LTA4LTIwMTAsIEdhYnlsb24KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1RFQU1fV0lNUFlfUk9XIGIvZG9jL3Byb3BzL1BfVEVBTV9XSU1QWV9ST1cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgzMjI1NQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1RFQU1fV0lNUFlfUk9XCkBAIC0wLDAgKzEsMjggQEAKK05BTUU6CisJUF9URUFNX1dJTVBZX1JPVyAgICAgICAgICAgICAgICJ0ZWFtX3dpbXB5X3JvdyIKKworREVGSU5JRVJUIElOOgorCS9zeXMvbGl2aW5nL3RlYW0uaAorCitCRVNDSFJFSUJVTkc6CisJRmx1Y2h0cmVpaGUgZGVzIFNwaWVsZXJzLCB2b24gMSBiaXMgTUFYX1RFQU1ST1dTLgorCitCRU1FUktVTkc6CisJV2VubiBkaWUgRmx1Y2h0cmVpaGUgPD0xIGlzdCwgaXN0IGRpZSBGbHVjaHQgaW4gZWluZSBoaW50ZXJlIFJlaWhlCisJZGVha3RpdmllcnQuCisKK1NJRUhFIEFVQ0g6CisgICAgICAgIFVlYmVyc2ljaHQ6IHRlYW1rYW1wZgorICAgICAgICBQcm9wZXJ0aWVzOiBQX0FTU09DX01FTUJFUlMsIFBfVEVBTV9BVFRBQ0tfQ01ELCBQX1RFQU1fQVVUT0ZPTExPVywKKyAgICAgICAgICAgICAgICAgICAgUF9URUFNX0NPTE9SUywgUF9URUFNX0xFQURFUiwgUF9URUFNX05FV01FTUJFUiwKKyAgICAgICAgICAgICAgICAgICAgUF9URUFNX1dBTlRFRF9ST1cKKyAgICAgICAgQmV3ZWd1bmc6ICAgSXNUZWFtTW92ZSwgVGVhbUZsZWUKKyAgICAgICAgTWl0Z2xpZWRlcjogSXNUZWFtTGVhZGVyLCBUZWFtTWVtYmVycworICAgICAgICBLYW1wZjogICAgICBEZUFzc29jTWVtYmVyLCBJbnNlcnRFbmVteVRlYW0sIFNlbGVjdE5lYXJFbmVteSwKKyAgICAgICAgICAgICAgICAgICAgU2VsZWN0RmFyRW5lbXkKKyAgICAgICAgUG9zaXRpb25lbjogUHJlc2VudFBvc2l0aW9uLCBQcmVzZW50Um93cywgUHJlc2VudEVuZW15Um93cywKKyAgICAgICAgICAgICAgICAgICAgUHJlc2VudFRlYW1Qb3NpdGlvbiwgU3dhcFJvd3MKKyAgICAgICAgU29uc3RpZ2VzOiAgVGVhbVByZWZpeCwgdGVhbWthbXBmX2ludGVybgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiAxNi0wOC0yMDEwLCBHYWJ5bG9uCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9URUxORVRfUlRUSU1FIGIvZG9jL3Byb3BzL1BfVEVMTkVUX1JUVElNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzMwMDExCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfVEVMTkVUX1JUVElNRQpAQCAtMCwwICsxLDI1IEBACitOQU1FOgorICAgIFBfVEVMTkVUX1JUVElNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicF9saWJfdGVsbmV0X3J0dGltZSIKKworREVGSU5JRVJUIElOOgorICAgIC9zZWN1cmUvdGVsbmV0bmVnLmgKKworQkVTQ0hSRUlCVU5HOgorICAgIEluIGRpZXNlciBQcm9wZXJ0aWVzIHN0ZWh0IGRpZSBsZXR6dGUgZ2VtZXNzZW5lICdyb3VuZC10cmlwJyBaZWl0CisgICAgKGluIE1pa3Jvc2VrdW5kZW4pIGVpbmVyICdUZWxuZXQgdGltaW5nIG1hcmsnIHZvbSBNVUQgenVtIENsaWVudCB1bmQKKyAgICB6dXJ1ZWNrLgorCisgICAgVm9yYXVzc2V0enVuZyBoaWVyZnVlciBpc3QgYWxsZXJkaW5ncywgZGFzcyBkYXMgVGVsbmV0IGRlcyBTcGllbGVycworICAgIFRlbG5ldG5lZ290aWF0aW9ucyB1bnRlcnN0dWV0enQgdW5kICd0ZWxuZXQga2VlcGFsaXZlJyBlaW5nZXNjaGFsdGV0CisgICAgaXN0LCBhbnNvbnN0ZW4gYmxlaWJ0IGRpZXNlIFByb3BlcnR5IDAuCisgICAgRGllIG1laXN0ZW4gVGVsbmV0cy9DbGllbnRzIGFudHdvcnRlbiB6dW1pbmRlc3QgZWluZSBBYmxlaG51bmcgYXVmCisgICAgZGllICd0aW1pbmcgbWFya3MnLCBzbyBkYXNzIHRyb3R6ZGVtIGVpbmUgWmVpdCBiZXN0aW1tdCB3ZXJkZW4ga2Fubi4KKworICAgIERpZSBQcm9wIGthbm4gbmljaHQgZ2VzZXR6dCB3ZXJkZW4gYnp3LiBlcyBoYXQga2VpbmVuIEVmZmVrdC4KKworU0lFSEUgQVVDSDoKKyAgICBQX1RUWV9DT0xTLCBQX1RUWV9ST1dTLCBQX1RUWV9TSE9XLCBQX1RUWSwgUF9UVFlfVFlQRQorCitMRVRaVEUgQWVOREVSVU5HOgorICAgIDAzLjAyLjIwMTMsIFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfVEVTVFBMQVlFUiBiL2RvYy9wcm9wcy9QX1RFU1RQTEFZRVIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY2NGFkZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1RFU1RQTEFZRVIKQEAgLTAsMCArMSwyOSBAQAorTkFNRToKKyAgICBQX1RFU1RQTEFZRVIgICAgICAgICAgICAgICAgICAidGVzdHBsYXllciIgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcGxheWVyL2Jhc2UuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIEdlc2V0enQsIHdlbm4gZGVyIFNwaWVsZXIgZWluIFRlc3RzcGllbGVyIGlzdC4gRW50aGFlbHQgZGllIFVJRCBkZXMKKyAgICAgTWFnaWVycywgZGVtIGRpZXNlciBUZXN0aWUgKG1vbWVudGFuKSBnZWhvZXJ0LgorICAgICAKKyAgICAgQmVpIFRlc3RzcGllbGVybiBkdWVyZmVuIFNraWxscyBnZWFlbmRlcnQgd2VyZGVuLCBzaWUgZHVlcmZlbiBnZXphcHB0CisgICAgIHdlcmRlbiB1bmQgLSBpaHJlIGVpZ2VudGxpY2hlIEF1ZmdhYmUgLSBuaWNodCBhbmdlc2NobG9zc2VuZSBHZWJpZXRlCisgICAgIHRlc3Rlbi4KKworICAgICBBVVNOQUhNRU46IEdpbGRlbnRlc3RpZXMgZHVlcmZlbiBudXIgc2VociBlaW5nZXNjaHJhZW5rdCBtYW5pcHVsaWVydAorICAgICAgICAgICAgICAgIHdlcmRlbiB3ZXJkZW4sIGRhIHNpZSBpbSBnYW56ZW4gTXVkIHJ1bWxhdWZlbiBrb2VubmVuLAorICAgICAgICAgICAgICAgIFNwaWVsZXJrb250YWt0IGhhYmVuIHVuZCBuYWNoIEFic2NobHVzcyBkZXIgVGVzdHMgZ2dmLiBzb2dhcgorICAgICAgICAgICAgICAgIGRpZSBUZXN0aWVtYXJraWVydW5nIGVudGZlcm50IHdlcmRlbiBrYW5uLgorICAgICAgICAgICAgICAgIAorICAgICBGdWVyIFNwaWVsZXJ0ZXN0aWVzLCBkaWUgdm9uIGVpbmVtIFNwaWVsZXIga29udHJvbGxpZXJ0IHdlcmRlbiwgZ2VsdGVuCisgICAgIHRlaWx3ZWlzZSBiZXNvbmRlcmUgUmVnZWxuLCBzLiAnc3BpZWxlcnRlc3RpZXMnLgorCitCRU1FUktVTkdFTjogCisgICAgIFBfVEVTVFBMQVlFUiBrYW5uIG51ciBwZXIgU2V0UHJvcCgpIGdlc2V0enQgd2VyZGVuIHVuZCBkYXMgYXVjaCBudXIgZWluCisgICAgIE1hbCEgR2Vsb2VzY2h0IHdlcmRlbiBrYW5uIGRhcyBGbGFnIG51ciB2b24gRU0rLgorCitaVUxFVFpUIEdFQWVOREVSVDoKKzA1LjAxLjIwMTAsIFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfVElNRURfQVRUUl9NT0QgYi9kb2MvcHJvcHMvUF9USU1FRF9BVFRSX01PRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTc1YzUwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfVElNRURfQVRUUl9NT0QKQEAgLTAsMCArMSw1OSBAQAorTkFNRToKKyAgICBQX1RJTUVEX0FUVFJfTU9EICAgICAgICAgInRpbWVkX2F0dHJfbW9kIgorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9saXZpbmcvYXR0cmlidXRlcy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICBJbiBkaWVzZXIgUHJvcGVydHkgd2VyZGVuIEF0dHJpYnV0LU1vZGlmaWthdG9yZW4gZ2VzcGVpY2hlcnQsIGRpZQorICAgIG5pY2h0IHVlYmVyIGxhZW5nZXJlIFplaXQgd2lya3NhbSBzZWluIHNvbGxlbi4KKyAgICBEaWUgV2lya3NhbWtlaXQgZGVyIE1vZGlmaWthdG9yZW4ga2FubiBhbiBaZWl0IHVuZCBPYmpla3RlCisgICAgZ2VidW5kZW4gd2VyZGVuLgorCisgICAgSW50ZXJuIHdlcmRlbiBkaWUgTW9kaWZpa2F0b3JlbiBpbiBlaW5lciBEYXRlbnN0cnVrdHVyIGRlciBGb3JtCisKKyAgICAoeworICAgICAgICh7IEFibGF1ZnplaXRlbiB9KSwKKyAgICAgICAoWyBLZXkgOiBBYmxhdWZvYmpla3QgXSksCisgICAgICAgKFsgS2V5IDogKFsgTWFwcGluZyBtaXQgZGVuIE1vZGlmaWthdG9yZW4gXSk7CisgICAgICAgICBBYmxhdWZ6ZWl0IDsgQWJsYXVmb2JqZWt0IDsgTmFjaHJpY2h0ZW5lbXBmYWVuZ2VyCisgICAgICAgXSkKKyAgICB9KQorCisgICAgZ2VzcGVpY2hlcnQgbWl0OgorICAgICogQWJsYXVmemVpdGVuOiAgWmVpdCBpbiBTZWt1bmRlbiBzZWl0IDEuIEphbiAxOTcwLCAwLjA6MCBHTVQKKyAgICAqIEFibGF1Zm9iamVrdGU6IE9iamVrdGUsIGFuIGRlcmVuIEV4aXN0ZW56IGRpZSBBdHRyaWJ1dC0KKyAgICAgICAgICAgICAgICAgICAgIHZlcmFlbmRlcnVuZ2VuIGdlYnVuZGVuIHNpbmQKKyAgICAqIE5hY2hyaWNodGVuZW1wZmFlbmdlcjoKKyAgICAgIE9iamVrdGUvS2xhc3Nlbiwgd2VsY2hlIHVlYmVyIGFiZ2VsYXVmZW5lIEF0dHJpYnV0dmVyYWVuZGVydW5nCisgICAgICBkdXJjaCBkZW4gQXVmcnVmIHZvbiAiTm90aWZ5VGltZWRBdHRyTW9kRXhwaXJlZCIgKG1pdCBrZXkgYWxzCisgICAgICBBcmd1bWVudCkgYmVuYWNocmljaHRpZ3Qgd2VyZGVuLgorCisgICAgRGFzIFNldHplbiBkZXIgV2VydGUgZXJmb2xndCBOVVIgdWViZXIgZGllIE1ldGhvZGVuIFNldFRpbWVkQXR0ck1vZGlmaWVyCisgICAgdW5kIERlbGV0ZVRpbWVkQXR0ck1vZGlmaWVyLgorCisgICAgRGllIERhdGVuIHp1IGVpbmVtIEtleSBrb2VubmVuIHVlYmVyIFF1ZXJ5VGltZWRBdHRyTW9kaWZpZXIgYWJnZWZyYWd0CisgICAgd2VyZGVuLiBEaWUgQWJmcmFnZSBtaXR0ZWxzIFF1ZXJ5UHJvcCBsaWVmZXJ0IGVpbmUgS29waWUgZGVyIGd1ZWx0aWdlbgorICAgIERhdGVuc3RydWt0dXIsIGRpZSBwZXIgUXVlcnkgbmljaHQgKHNpZWhlIEJlbWVya3VuZ2VuKS4KKworICAgIERpZSBCZWRpbmd1bmdlbiBmdWVyIGRpZSB1ZWJlciBQX1RJTUVEX0FUVFJfTU9EIGdlc2V0enRlbgorICAgIEF0dHJpYnV0dmVyYWVuZGVydW5nZW4gd2VyZGVuIGltIEhlYXJ0YmVhdCBpbiBkZXIgRnVua3Rpb24KKyAgICBhdHRyaWJ1dGVfaGIgdWViZXJwcnVlZnQuIEVpbmUgdmVybWluZGVydGUgRnVua3Rpb25hbGl0YWV0IGltCisgICAgRmFsbGUgdm9uIE1hZ2llcm4gaXN0IHNvbWl0IGtlaW4gRmVobGVyZmFsbC4KKworQkVNRVJLVU5HRU46CisgICAgS2VpbmUgZWNodGUgUHJvcGVydHkuIERpZSBNZXRob2RlIF9xdWVyeV90aW1lZF9hdHRyX21vZCgpIGluCisgICAgL3N0ZC9saXZpbmcvYXR0cmlidXRlcy5jIHN0ZWxsdCBkaWUgRGF0ZW4genVzYW1tZW4uCisKKyAgICBBQ0hUVU5HOiBCaXR0ZSBudXIgZGllIGJlcmVpdGdlc3RlbGx0ZW4gTWV0aG9kZW4genVyIE1hbmlwdWxhdGlvbgorICAgICAgICAgICAgIGJlbnV0emVuISBTZXR6ZW4gYWxzIFByb3BlcnR5IGhhdCBrZWluZW4gRWZmZWt0LgorCitTSUVIRSBBVUNIOgorICAgIFF1ZXJ5QXR0cmlidXRlKCksIFF1ZXJ5UmVhbEF0dHJpYnV0ZSgpLCBRdWVyeUF0dHJpYnV0ZU9mZnNldCgpLAorICAgIFNldEF0dHJpYnV0ZSgpLCBTZXRSZWFsQXR0cmlidXRlKCksIFVwZGF0ZUF0dHJpYnV0ZXMoKSwKKyAgICBTZXRUaW1lZEF0dHJNb2RpZmllcigpLCBRdWVyeVRpbWVkQXR0ck1vZGlmaWVyKCksCisgICAgRGVsZXRlVGltZWRBdHRyTW9kaWZpZXIoKSwKKyAgICBQX0FUVFJJQlVURVMsIFBfQVRUUklCVVRFU19PRkZTRVRTLCBQX0FUVFJJQlVURVNfTU9ESUZJRVIsCisgICAgUF9YX0FUVFJfTU9ELCBQX01fQVRUUl9NT0QsIC9zdGQvbGl2aW5nL2F0dHJpYnV0ZXMuYworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogVHVlIEp1bCAyNyAyMDowMDoyMCAyMDA0IGJ5IE11YWRpYgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfVElNRVpPTkUgYi9kb2MvcHJvcHMvUF9USU1FWk9ORQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjQzZDA3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfVElNRVpPTkUKQEAgLTAsMCArMSwxMCBAQAorTkFNRToKKyAgICBQX1RJTUVaT05FICAgICAgICAgICAgICAgICAidGltZXpvbmUiCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3BsYXllci9iYXNlLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBFaW4gSW50ZWdlci1XZXJ0LCBkZXIgYmVpIGRlciBVaHJ6ZWl0bWVsZHVuZyB1bmQgYmVpbSBCZWZlaGwKKyAgICAgIih1aHIpemVpdCIgYmVydWVja3NpY2h0aWcgd2lyZC4gR2lidCBkaWUgQW56YWhsIGRlciBTdHVuZGVuCisgICAgIFplaXRhYndlaWNodW5nIHZvbiBCZXJsaW5lciBaZWl0IGFuLgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfVElUTEUgYi9kb2MvcHJvcHMvUF9USVRMRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWFmZDU3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfVElUTEUKQEAgLTAsMCArMSw4IEBACitOQU1FOgorICAgIFBfVElUTEUgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSIgICAgICAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9wbGF5ZXIvZGVzY3JpcHRpb24uaAorCitCRVNDSFJFSUJVTkc6CisgICAgIFRpdGVsIGRlcyBTcGllbGVycy4gRXJzY2hlaW50IGhpbnRlciBkZW0gTmFtZW4gaW4gS3Vyei9MYW5nYmVzY2hyZWlidW5nLgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfVE9PX0hFQVZZX01TRyBiL2RvYy9wcm9wcy9QX1RPT19IRUFWWV9NU0cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdlZjMxNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1RPT19IRUFWWV9NU0cKQEAgLTAsMCArMSwzMSBAQAorTkFNRToKKyAgICBQX1RPT19IRUFWWV9NU0cgICAgICAgICAgICAgICAgICAgICAgInRvb19oZWF2eV9tc2ciICAgICAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy90aGluZy9tb3ZpbmcuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIERpZXNlIFByb3BlcnR5IGVudGhhZWx0IGVpbmUgTWVsZHVuZywgZGllIGF1c2dlZ2ViZW4gd2lyZCwgd2VubiBqZW1hbmQKKyAgICAgdmVyc3VjaHQsIGVpbiBPYmpla3QgaW4gZWluZW4gQmVoYWVsdGVyIHp1IGxlZ2VuLCBmdWVyIGRlbiBkaWVzZXMgT2JqZWt0CisgICAgIHp1IHNjaHdlciBpc3QuCisgICAgIERpZSBQcm9wZXJ0eSBpc3QgaW0gQmVoYWVsdGVyIHp1IHNldHplbi4KKyAgICAgSXN0IGRpZXNlIFByb3BlcnR5IG5pY2h0IG9kZXIgYXVmIGVpbmVuIG5pY2h0LVN0cmluZy1XZXJ0IGdlc2V0enQsCisgICAgIHNvIHdpcmQgZGllIFN0YW5kYXJkbWVsZHVuZyBhdXNnZWdlYmVuLgorICAgICAoIjxPYmpla3Q+IHBhc3N0IGluIDxCZWhhZWx0ZXI+IG5pY2h0IG1laHIgcmVpbi4iKQorICAgICBEZXIgU3RyaW5nIGluIGRlciBQcm9wZXJ0eSB3aXJkIG5vY2ggZHVyY2ggcmVwbGFjZV9wZXJzb25hbCgpCisgICAgIHZlcmFyYmVpdGV0LCBkYXMgenUgYmV3ZWdlbmRlIE9iamVrdCB3aXJkIGFscyBlcnN0ZXMsIGRlciBCZWhhZWx0ZXIgYWxzCisgICAgIHp3ZWl0ZXMgT2JqZWt0IGFuZ2VnZWJlbi4gRGFuYWNoIHdpcmQgZGVyIFN0cmluZyBhdWYgNzggWmVpY2hlbgorICAgICB1bWdlYnJvY2hlbi4KKyAgICAgRGFzIFNldHplbiBlaW5lcyBsZWVyZW4gU3RyaW5ncyB1bnRlcmRydWVja3QgZGllIEF1c2dhYmUgZWluZXIgTWVsZHVuZworICAgICBnYW56LgorCitCRUlTUElFTEU6CisgICAgIFNldFByb3AoUF9UT09fSEVBVllfTVNHLCAiV2VubiBkdSBAV0VOMSBub2NoIGluIGRlbiBCZXV0ZWwgc3RlY2tlbiIKKwkJCSAgICAgICIgd3VlcmRlc3QsIHd1ZXJkZSBlciByZWlzc2VuLiIpOworCitTSUVIRSBBVUNIOgorICAgICBBZWhubGljaGVzOiBQX0VOVl9UT09fSEVBVllfTVNHLCBQX1RPT19NQU5ZX01TRywgUF9OT0lOU0VSVF9NU0csCisgICAgICAgICAgICAgICAgIFBfTk9MRUFWRV9NU0csIFBfTk9EUk9QLCBQX05PR0VUIAorICAgICBFcmZvbGc6ICAgICBQX1BJQ0tfTVNHLCBQX0RST1BfTVNHLCBQX0dJVkVfTVNHLCBQX1BVVF9NU0csCisgICAgICAgICAgICAgICAgIFBfV0VBUl9NU0csIFBfV0lFTERfTVNHCisgICAgIFNvbnN0aWdlczogIHJlcGxhY2VfcGVyc29uYWwoRSksIC9zdGQvbGl2aW5nL3B1dF9hbmRfZ2V0LmMKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1RPT19NQU5ZX01TRyBiL2RvYy9wcm9wcy9QX1RPT19NQU5ZX01TRwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjNjZTMyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfVE9PX01BTllfTVNHCkBAIC0wLDAgKzEsMzEgQEAKK05BTUU6CisgICAgUF9UT09fTUFOWV9NU0cgICAgICAgICAgICAgICAgICAgICAgInRvb19tYW55X21zZyIgICAgICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3RoaW5nL21vdmluZy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGllc2UgUHJvcGVydHkgZW50aGFlbHQgZWluZSBNZWxkdW5nLCBkaWUgYXVzZ2VnZWJlbiB3aXJkLCB3ZW5uIGplbWFuZAorICAgICB2ZXJzdWNodCwgZWluIE9iamVrdCBpbiBlaW5lbiBCZWhhZWx0ZXIgenUgbGVnZW4sIGRlciBzY2hvbiBkaWUgbWF4aW1hbGUKKyAgICAgQW56YWhsIGFuIE9iamVrdGVuIGVudGhhZWx0LgorICAgICBEaWUgUHJvcGVydHkgaXN0IGltIEJlaGFlbHRlciB6dSBzZXR6ZW4uCisgICAgIElzdCBkaWVzZSBQcm9wZXJ0eSBuaWNodCBvZGVyIGF1ZiBlaW5lbiBuaWNodC1TdHJpbmctV2VydCBnZXNldHp0LAorICAgICBzbyB3aXJkIGRpZSBTdGFuZGFyZG1lbGR1bmcgYXVzZ2VnZWJlbi4KKyAgICAgKCJEYWZ1ZXIgaXN0IG5pY2h0IG1laHIgZ2VudWcgUGxhdHogaW4gPEJlaGFlbHRlcj4uIikKKyAgICAgRGVyIFN0cmluZyBpbiBkZXIgUHJvcGVydHkgd2lyZCBub2NoIGR1cmNoIHJlcGxhY2VfcGVyc29uYWwoKQorICAgICB2ZXJhcmJlaXRldCwgZGFzIHp1IGJld2VnZW5kZSBPYmpla3Qgd2lyZCBhbHMgZXJzdGVzLCBkZXIgQmVoYWVsdGVyIGFscworICAgICB6d2VpdGVzIE9iamVrdCBhbmdlZ2ViZW4uIERhbmFjaCB3aXJkIGRlciBTdHJpbmcgYXVmIDc4IFplaWNoZW4KKyAgICAgdW1nZWJyb2NoZW4uCisgICAgIERhcyBTZXR6ZW4gZWluZXMgbGVlcmVuIFN0cmluZ3MgdW50ZXJkcnVlY2t0IGRpZSBBdXNnYWJlIGVpbmVyIE1lbGR1bmcKKyAgICAgZ2Fuei4KKworQkVJU1BJRUxFOgorICAgICBTZXRQcm9wKFBfVE9PX01BTllfTVNHLCAiQWJlciBkZXIgS29yYiBoYXQgZG9jaCBudXIgZHJlaSBGYWVjaGVyLCBkaWUiCisJCQkgICAgICIgc2luZCBhbGxlIHNjaG9uIHZvbGwuIik7CisKK1NJRUhFIEFVQ0g6CisgICAgIEFlaG5saWNoZXM6IFBfVE9PX0hFQVZZX01TRywgUF9FTlZfVE9PX0hFQVZZX01TRywgUF9OT0lOU0VSVF9NU0csCisgICAgICAgICAgICAgICAgIFBfTk9MRUFWRV9NU0csIFBfTk9EUk9QLCBQX05PR0VUIAorICAgICBFcmZvbGc6ICAgICBQX1BJQ0tfTVNHLCBQX0RST1BfTVNHLCBQX0dJVkVfTVNHLCBQX1BVVF9NU0csCisgICAgICAgICAgICAgICAgIFBfV0VBUl9NU0csIFBfV0lFTERfTVNHCisgICAgIFNvbnN0aWdlczogIHJlcGxhY2VfcGVyc29uYWwoRSksIC9zdGQvbGl2aW5nL3B1dF9hbmRfZ2V0LmMKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1RPVEFMX0FDIGIvZG9jL3Byb3BzL1BfVE9UQUxfQUMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIyY2ZmYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1RPVEFMX0FDCkBAIC0wLDAgKzEsMjMgQEAKK05BTUU6CisgICAgUF9UT1RBTF9BQyAgICAgICAgICAgICAgICAgICAgInRvdGFsX2FjIiAgICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL2xpdmluZy9jb21iYXQuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIE51bWVyaXNjaGVyIFdlcnQgZGVyIEFid2VocnN0YWVya2UgZGVzIFdlc2Vucy4KKyAgICAgRGllc2VyIHdpcmQgZHVyY2ggQXVmYWRkaWVyZW4gZGVyIFBfQUMgYWxsZXIgZ2V0cmFnZW5lbiBSdWVzdHVuZ2VuCisgICAgIGJlc3RpbW10LiBBdXMgZGllc2VtIEdydW5kIGlzdCBkYXMgQWJmcmFnZW4gZGllc2VyIFByb3BlcnR5IHppZW1saWNoCisgICAgIHRldWVyLiBGYWxscyBkYXMgRXJnZWJuaXMgbWVocmZhY2gga3VyeiBoaW50ZXJlaW5hbmRlciBnZWJyYXVjaHQgd2lyZCwKKyAgICAgc29sbHRlIGRpZSBQcm9wZXJ0eSBhdWYgamVkZW4gRmFsbCBudXIgZWlubWFsIGFiZ2VmcmFndCB1bmQgZGVyIFdlcnQKKyAgICAgZ2VzcGVpY2hlcnQgd2VyZGVuLgorCitCRU1FUktVTkdFTjoKKyAgICBBdWYgZGllc2UgUHJvcGVydHkgc29sbHRlIG5pY2h0IG1pdHRlbHMgUXVlcnkoKSBvZGVyIFNldCgpIHp1Z2VncmlmZmVuCisgICAgd2VyZGVuLCBkYXMgU2V0emVuIHZvbiBRdWVyeS0gb2RlciBTZXRtZXRob2RlbiBiaXR0ZSBhdWYgamVkZW4gRmFsbAorICAgIHVudGVybGFzc2VuLgorCitTSUVIRSBBVUNIOgorICAgIFBfQUMKKworMDUuMDkuMjAwOCwgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfVE9UQUxfTElHSFQgYi9kb2MvcHJvcHMvUF9UT1RBTF9MSUdIVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTAwNmQyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfVE9UQUxfTElHSFQKQEAgLTAsMCArMSwyMyBAQAorTkFNRToKKyAgICBQX1RPVEFMX0xJR0hUICAgICAgICAgICAgICAgICAidG90YWxfbGlnaHQiCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3Byb3BlcnRpZXMuaAorCitCRVNDSFJFSUJVTkc6CisgICAgR2lidCBkYXMgTGljaHRsZXZlbCBhbiwgZGFzIHZvbiBlaW5lbSBPYmpla3QgYXVzZ2VodC4gSGllcnp1IHdpcmQgZGFzCisgICAgZWlnZW5lIExpY2h0bGV2ZWwgUF9MSUdIVCBtaXQgZGVtIGdlc2FtdGVuIEluaGFsdCBlaW5lcyBDb250YWluZXJzCisgICAgdmVycmVjaG5ldC4KKworICAgIEJpdHRlIF9udXJfIHVlYmVyIFF1ZXJ5UHJvcCBhdWYgZGllc2UgUHJvcGVydHkgenVncmVpZmVuLAorICAgIGRhIGRhcyBMaWNodGxldmVsIGdnZi4gbmV1IGJlcmVjaG5ldCB3ZXJkZW4gbXVzcyEKKworICAgIEVpbiBkaXJla3RlcyBzZXR6ZW4gZGllc2VyIFByb3BlcnR5IGlzdCBOSUNIVCBtb2VnbGljaCwgaGllcnp1IGJpdHRlCisgICAgUF9MSUdIVCBiZW51dHplbiEKKworQkVNRVJLVU5HRU46CisgICAgRGFzIGlzdCBkaWUgVk9OIGVpbmVtIE9iamVrdCBhdXNnZWhlbmRlIExpY2h0c3RhZXJrZS4gRnVlciBkYXMgSU4gZWluZW0KKyAgICBSYXVtIGhlcnJzY2hlbmRlIExpY2h0IGJpdHRlIFBfSU5UX0xJR0hUIGFiZnJhZ2VuIQorCitTSUVIRSBBVUNIOgorICAgIFBfTElHSFQsIFBfSU5UX0xJR0hULCBQX1BMQVlFUl9MSUdIVCwgUF9MSUdIVF9NT0RJRklFUiwgQ2Fubm90U2VlKCkKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1RPVEFMX09CSkVDVFMgYi9kb2MvcHJvcHMvUF9UT1RBTF9PQkpFQ1RTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMDE1NjcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9UT1RBTF9PQkpFQ1RTCkBAIC0wLDAgKzEsMTYgQEAKK05BTUU6CisgICAgUF9UT1RBTF9PQkpFQ1RTICAgICAgICAgICAgICAgICJ0b3RhbF9vYmplY3RzIiAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvY29udGFpbmVyLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBBbnphaGwgZGVyIE9iamVrdGUgaW0gQ29udGFpbmVyLiBEaWVzZSBQcm9wZXJ0eSBrYW5uIG1hbiBudXIgYWJmcmFnZW4hCisgICAgIEVzIHdlcmRlbiBudXIgT2JqZWt0ZSBnZXphZWhsdCwgZGVyZW4gTWV0aG9kZSBzaG9ydCgpIGVpbmVuCisgICAgIFdlcnQgIT0gMCB6dXJ1ZWNrZ2lidC4gSW5zb2Zlcm4ga29lbm5lbiBTcGllbGVybiBiZWxpZWJpZworICAgICB2aWVsZSB1bnNpY2h0YmFyZSBPYmpla3RlIGdlZ2ViZW4gd2VyZGVuIG9obmUgc2llIHp1IGJlaGluZGVybi4KKworU0lFSEUgQVVDSDoKKyAgICAgUF9NQVhfT0JKRUNUUworCisyNi5KYW4gMjAwNSBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfVE9UQUxfV0MgYi9kb2MvcHJvcHMvUF9UT1RBTF9XQwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWVmNGE5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfVE9UQUxfV0MKQEAgLTAsMCArMSwyNyBAQAorTkFNRToKKwlQX1RPVEFMX1dDCQkJInRvdGFsX3djIgorCitERUZJTklFUlQgSU46CisJL3N5cy9wcm9wZXJ0aWVzLmgKKworQkVTQ0hSRUlCVU5HOgorCUluIGRpZXNlciBQcm9wZXJ0eSB3aXJkIGRlciBudW1lcmlzY2hlIFdlcnQgZGVyIEFuZ3JpZmZzc3RhZXJrZQorCWVpbmVzIExlYmV3ZXNlbnMgcmVnaXN0cmllcnQuCisgIEhpZXJ6dSB3ZXJkZW4gZGllIFBfV0Mgdm9uIFBfV0VBUE9OIGJ6dy4gUF9IQU5EUyBzb3dpZSBkaWUgS3JhZnQgZGVzCisgIExlYmV3ZXNlbnMgYmVydWVja3NpY2h0aWd0LgorCU5pY2h0IGVpbmdlcmVjaG5ldCBpbiBkaWUgQW5ncmlmZnNzdGFlcmtlIHNpbmQgbmF0dWVybGljaCBFeHRyYXNwZWxscyB1bmQKKyAgLXNraWxscyBkZXMgQW5ncmVpZmVycy4KKyAgQnJhdWNodCBtYW4gZGVuIFdlcnQgbWVocmZhY2gga3VyeiBoaW50ZXJlaW5hbmRlciwgc29sbHRlIG1hbiBkaWUgUHJvcCBhYmVyCisgIG51ciBlaW5tYWwgYWJmcmFnZW4gdW5kIGRlbiBXZXJ0IHNwZWljaGVybiAoc29mZXJuIHNpY2ggaW4gZGVyIFp3aXNjaGVuemVpdAorICBuaWNodHMgYW4gZGVyIFdhZmZlLCBkZW4gSGFuZHMgb2RlciBkZW4gQXR0cmlidXRlbiBkZXMgTGViZW53ZXNlbnMgYWVuZGVydCkuCisKK0JFTUVSS1VOR0VOOgorICBBdWYgZGllc2UgUHJvcGVydHkgc29sbHRlIG5pY2h0IG1pdHRlbHMgUXVlcnkoKSBvZGVyIFNldCgpIHp1Z2VncmlmZmVuIAorICB3ZXJkZW4sIGRhcyBTZXR6ZW4gdm9uIFF1ZXJ5LSBvZGVyIFNldG1ldGhvZGVuIGJpdHRlIGF1ZiBqZWRlbiBGYWxsIAorICB1bnRlcmxhc3Nlbi4KKworU0lFSEUgQVVDSDoKKwlQX0hBTkRTLCBQX1dDLCBQX1hQCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzA1LjA5LjIwMDgsIFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1RPVEFMX1dFSUdIVCBiL2RvYy9wcm9wcy9QX1RPVEFMX1dFSUdIVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjYyZGIxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfVE9UQUxfV0VJR0hUCkBAIC0wLDAgKzEsOCBAQAorTkFNRToKKyAgICBQX1RPVEFMX1dFSUdIVCAgICAgICAgICAgICAgICAidG90YWxfd2VpZ2h0IiAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvdGhpbmcvcmVzdHJpY3Rpb25zLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBHZXdpY2h0IGluY2wuIEluaGFsdCBpbiBHcmFtbS4gUF9XRUlHSFRfUEVSQ0VOVCB3aXJkIGJlcnVlY2tzaWNodGlndC4KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1RPVUNIX0RFVEFJTFMgYi9kb2MvcHJvcHMvUF9UT1VDSF9ERVRBSUxTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNjcwZjYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9UT1VDSF9ERVRBSUxTCkBAIC0wLDAgKzEsMjQgQEAKK05BTUU6CisgICAgUF9UT1VDSF9ERVRBSUxTICAgICAgICAgICAgInRvdWNoX2RldGFpbHMiCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3RoaW5nL2Rlc2NyaXB0aW9uLmgKKworQkVTQ0hSRUlCVU5HOgorICAgIERpZXNlIFByb3BlcnR5IGVudHNwcmljaHQgZGVtIFBfREVUQUlMUyBmdWVyIFN0YW5kYXJkZGV0YWlscywKKyAgICBudXIgd2VyZGVuIGhpZXJpbiBHZXJ1ZWNoZSBnZXNwZWljaGVydDoKKyAgICBEaWVzZSBQcm9wZXJ0eSBlbnRoYWVsdCBlaW4gTWFwcGluZywgaW4gZGVyIERldGFpbHMgaW0gT2JqZWt0CisgICAgZGVmaW5pZXJ0IHdlcmRlbiB1bmQgQmVzY2hyZWlidW5nZW4sIGRpZSBhdXNnZWdlYmVuIHdlcmRlbiwgd2VubiBtYW4KKyAgICBzaWNoIGRpZXNlIERldGFpbHMgYW5zY2hhdXQuCisKK0JFTUVSS1VOR0VOOgorICAgIE1hbiBzb2xsdGUgZGllc2UgUHJvcGVydHkgbmljaHQgcGVyIEhhbmQgdmVyYWVuZGVybiwgc29uZGVybiBkaWUKKyAgICBGdW5rdGlvbmVuIG51dHplbi4KKworU0lFSEUgQVVDSDoKKyAgICBTZXR6ZW46ICAgIEFkZFRvdWNoRGV0YWlsKCkKKyAgICBMb2VzY2hlbjogIFJlbW92ZVRvdWNoRGV0YWlsKCkKKyAgICBBZWhubGljaDogIEFkZERldGFpbCgpLCBQX0RFVEFJTFMKKyAgICBTb25zdGlnZXM6IEdldERldGFpbCgpLCBicmVha19zdHJpbmcoKQorCisyNy4gSmFuIDIwMTMgR2xvaW5zb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9UUE9SVF9DT1NUX0lOIGIvZG9jL3Byb3BzL1BfVFBPUlRfQ09TVF9JTgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTVlOTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfVFBPUlRfQ09TVF9JTgpAQCAtMCwwICsxLDkgQEAKK05BTUU6CisgICAgUF9UUE9SVF9DT1NUX0lOICAgICAgICAgICAgICAgInRwb3J0X2Nvc3RfaW4iICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3Byb3BlcnRpZXMuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIEluIGVpbmVtIFJhdW0gbWl0IFNlaGVydG9yOiBLb3N0ZW5hbnRlaWwsIHVtIHNpY2ggaW4gZGVuIFJhdW0genUKKyAgICAgdGVsZXBvcnRpZXJlbgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfVFBPUlRfQ09TVF9PVVQgYi9kb2MvcHJvcHMvUF9UUE9SVF9DT1NUX09VVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjlhMzVkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfVFBPUlRfQ09TVF9PVVQKQEAgLTAsMCArMSw5IEBACitOQU1FOgorICAgIFBfVFBPUlRfQ09TVF9PVVQgICAgICAgICAgICAgICJ0cG9ydF9jb3N0X291dCIgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9wcm9wZXJ0aWVzLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBJbiBlaW5lbSBSYXVtIG1pdCBTZWhlcnRvcjogS29zdGVuYW50ZWlsLCBzaWNoIGF1cyBkZW0gUmF1bSBoZXJhdXMKKyAgICAgenUgdGVsZXBvcnRpZXJlbgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfVFJBTktfRklOREVOIGIvZG9jL3Byb3BzL1BfVFJBTktfRklOREVOCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYjIzNjUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9UUkFOS19GSU5ERU4KQEAgLTAsMCArMSw5IEBACitOQU1FOgorICAgIFBfVFJBTktfRklOREVOICAgICAgICAgICAgICAgICJ0cmFua19maW5kZW4iICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9wbGF5ZXIvcG90aW9uLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBXZW5uIGRpZSBQcm9wZXJ0eSBhdWYgMSBzdGVodCBrYW5uIGltbWVyIGVpbiBaYXViZXJ0cmFuayBnZWZ1bmRlbgorICAgICB3ZXJkZW4sIGF1Y2ggd2VubiBlciBuaWNodCBpbiBkZXIgTGlzdGUgZGVzIFNwaWVsZXJzIHN0ZWh0LgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfVFJBTlNQQVJFTlQgYi9kb2MvcHJvcHMvUF9UUkFOU1BBUkVOVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDgxYjAwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfVFJBTlNQQVJFTlQKQEAgLTAsMCArMSwyOSBAQAorUF9UUkFOU1BBUkVOVAorTkFNRToKKyAgICAgUF9UUkFOU1BBUkVOVCAgICAgICAgICAgICAgICAgInRyYW5zcGFyZW50IgorCitERUZJTklFUlQgSU46CisgICAgIC9zeXMvY29udGFpbmVyLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBpc3QgIT0gMCwgd2VubiBpbiBlaW5lbiBDb250YWluZXIgaGluZWluIChvZmZlbikgb2RlciBhdXMgZWluZW0gCisgICAgIGhpbmF1c2dlc2NoYXV0IHdlcmRlbiBrYW5uLgorCisgICAgIFNjaGF1dCBtYW4gYXVzIGVpbmVtIGhpbmF1cywgZXJoYWVsdCBkZXIgU3BpZWxlciBub3JtYWxlcndlaXNlIGRpZSAKKyAgICAgTWVsZHVuZyAnQXVzc2VyaGFsYiBzaWVoc3QgRHU6Jy4gRGllc2Uga2FubiBqZWRvY2ggZHVyY2ggZWluZSBlaWdlbmUsIAorICAgICBzdGltbWlnZXJlICBNZWxkdW5nIGVyc2V0enQgd2VyZGVuLCB3ZW5uIGluIFBfVFJBTlNQQVJFTlQgZWluIFN0cmluZyAKKyAgICAgbWl0IGRpZXNlciBNZWxkdW5nIGFuZ2VnZWJlbiB3aXJkLgorCitCRUlTUElFTDoKKyAgICAgU2V0UHJvcChQX1RSQU5TUEFSRU5ULDEpOyAtPiBub3JtYWxlIE1lbGR1bmcKKworICAgICBTZXRQcm9wKFBfVFJBTlNQQVJFTlQsIlZvbSBSdWVja2VuIGRlcyBQZmVyZGVzIGF1cyBzaWVoc3QgRHU6XG4iKTsKKworICAgICBEaWVzZSBNZWxkdW5nIGlzdCBuYXR1ZXJsaWNoIG51ciBkYW5uIHNpbm52b2xsLCB3ZW5uIGVzIHNpY2gKKyAgICAgYXVjaCB0YXRzYWVjaGxpY2ggdW0gZWluIFBmZXJkIGhhbmRlbHQgOi0pCisKK1NJRUhFIEFVQ0g6CisgICAgIGludF9sb25nKCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogTW9uIEp1bCAxOCAyNDowMDowMCAyMDAxIGJ5IFRpbGx5CmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9UUkFWRUxfQ01EUyBiL2RvYy9wcm9wcy9QX1RSQVZFTF9DTURTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZjZmNjUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9UUkFWRUxfQ01EUwpAQCAtMCwwICsxLDM4IEBACitOQU1FOgorICAgIFBfVFJBVkVMX0NNRFMgICAgICAgICAgICAgICAgICAgInRyYXZlbF9jbWRzIiAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvdHJhbnNwb3J0LmgKKworQkVTQ0hSRUlCVU5HOgorICAgIEVpbiBBcnJheSBtaXQgQmVmZWhsZW4sIGRpZSB6dW0gVmVybGFzc2VuIFVORCBCZXRyZXRlbiBkZXMgVHJhbnMtCisgICAgcG9ydGVycyBmdWVocmVuLiAKKworQkVJU1BJRUw6CisgICAgdm9pZCBjcmVhdGUoKQorICAgIHsKKyAgICAgIDo6Y3JlYXRlKCk7CisKKyAgICAgIFNldFByb3AoUF9UUkFWRUxfQ01EUywoeyAic3RlaWciLCJzdGVpZ2UiIH0pICk7CisKKyAgICB9CisKKyAgICBBbHMgUGFyYW1ldGVyIHdlcmRlbiBoaWVyIGF1c3NjaGxpZXNzbGljaCAnYXVmLGluJyB1bmQgJ3ZvbixhdXMnCisgICAgdmVyYXJiZWl0ZXQuCisKKyAgICBzdGVpZ2UgYXVmfGluICA8eHh4PiAgICBmdWVocnQgYWxzbyB6dW0gQmV0cmV0ZW4gZGVzIFRyYW5zcG9ydGVycywKKyAgICBzdGVpZ2Ugdm9ufGF1cyA8eHh4PiAgICBkYWdlZ2VuIGZ1ZWhydCB6dW0gVmVybGFzc2VuIGRlc3NlbGJlbi4KKworQkVNRVJLVU5HRU46CisgICAgVW0gL3N0ZC90cmFuc3BvcnQuYyBuaWNodCBhdWZ6dWJsYWVoZW4sIHdlcmRlbiB3ZWl0ZXJlIFBhcmFtZXRlciB3aWUKKyAgICBldHdhICdzdGVpZ2UgYXVmfGluIGRhc3xkaWV8ZGVuIHh4eCcgX25pY2h0XyB1bnRlcnN0dWV0enQhCisKKyAgICBIaWVyIG11c3MgZGVyIHZlcmFudHdvcnRsaWNoZSBNYWdpZXIgc2Nob24gZWluZSBlaWdlbmUgTG9lc3VuZyBmaW5kZW4KKyAgICB1bmQgaW4gc2VpbmVuIFRyYW5zcG9ydGVyIHNjaHJlaWJlbi4KKworU0lFSEUgQVVDSDoKKyAgICBQX0xFQVZFRkFJTCwgUF9FTlRFUkZBSUwsIFBfRU5URVJDTURTLCBQX0xFQVZFQ01EUywgdHJhbnNwb3J0ZXIsCisKK0xFVFpURVIgQUVOREVSVU5HOgorICAgIERvbiwgMjQuMDEuMjAwMiwgMTA6MTU6MDdoIHZvbiBUaWxseQorICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1RSQVZFTF9JTkZPIGIvZG9jL3Byb3BzL1BfVFJBVkVMX0lORk8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNhNTAyZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1RSQVZFTF9JTkZPCkBAIC0wLDAgKzEsMzEgQEAKK05BTUU6CisgICAgUF9UUkFWRUxfSU5GTyAgICAgICAgICAgICAgICAgInRyYXZlbF9pbmZvIgorCitERUZJTklFUlQgSU46CisgICAgL3N5cy90cmFuc3BvcnQuaAorCitCRVNDSFJFSUJVTkc6CisgICAgQXJyYXkgbWl0IEluZm9ybWF0aW9uZW4genVyIHZvbSBTcGllbGVyIGdld3VlbnNjaHRlbiBSZWlzZXJvdXRlLgorCisgICAgWzBdICAgICAgICBEZXIgUmF1bSAob2JqZWN0KSwgaW4gZGVtIGRpZSBSZWlzZXJvdXRlIG1vbWVudGFuIAorICAgICAgICAgICAgICAgJ2FrdGl2JyBpc3QuIE51ciBoaWVyIHdpcmQgc2llIGJlcnVlY2tzaWNodGlndC4KKworICAgIFsxXSAgICAgICAgRGFzIGdld3VlbnNjaHRlIFRyYW5zcG9ydG1pdHRlbCAob2JqZWN0KSBmYWxscyAKKyAgICAgICAgICAgICAgIGdld2FlaGx0LiBBbnNvbnN0ZW4gMC4KKworICAgIFsyXSAgICAgICAgRGVyIGdld3VlbnNjaHRlIFppZWxvcnQgKHN0cmluZykgb2RlciAwICh6aWVsbG9zKS4KKworICAgIFszXSAgICAgICAgRGVyIGdld3VlbnNjaHRlIFppZWxvcnQgYWxzIFJpY2h0dW5nIChzdHJpbmcpLCBmYWxscworICAgICAgICAgICAgICAgZ2V3YWVobHQgKHouQi4gJ3p1ciBGZXVlcmluc2VsJykuIFNvbnN0IDAuIFdpcmQgYXVzCisgICAgICAgICAgICAgICBQX0hBUkJPVVIgZGVzIFppZWxyYXVtZXMgYXVzZ2VsZXNlbi4KKworQkVNRVJLVU5HRU46CisgICAgRGllc2UgUHJvcGVydHkgd2lyZCB2b24gL3N0ZC90cmFuc3BvcnQuYyBzb3dpZSBzdGQvcGxheWVyL3RyYXZlbC5jCisgICAgdmVyd2VuZGV0LCB1bmQgc29sbHRlIE5JQ0hUIHZvbiBhbmRlcmVuIE9iamVrdGVuIG9kZXIgcGVyIEhhbmQgCisgICAgdmVyYWVuZGVydCB3ZXJkZW4hCisKK1NJRUhFIEFVQ0g6CisgICAgL3N0ZC90cmFuc3BvcnQuYywgL3N0ZC9wbGF5ZXIvdHJhdmVsLmMsIHJlaXNlCisKK0xFVFpURVIgQUVOREVSVU5HOgorICAgIERvbiwgMjQuMDEuMjAwMiwgMTA6MTU6MDdoIHZvbiBUaWxseQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfVFJBWSBiL2RvYy9wcm9wcy9QX1RSQVkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRjOWQ5MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1RSQVkKQEAgLTAsMCArMSw4IEBACitOQU1FOgorICAgIFBfVFJBWSAgICAgICAgICAgICAgICAgICAgICAgICJ0cmF5IiAgICAgICAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9wcm9wZXJ0aWVzLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICoqKiBLRUlORSBCRVNDSFJFSUJVTkcgVk9SSEFOREVOICoqKgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfVFRZIGIvZG9jL3Byb3BzL1BfVFRZCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNGFkZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9UVFkKQEAgLTAsMCArMSwyOCBAQAorTkFNRToKKyAgICBQX1RUWSAgICAgICAgICAgICAgICAgICAgICAgICAidHR5IgorCitERUZJTklFUlQgSU46CisgICAgL3NlY3VyZS90ZWxuZXRuZWcuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIE5hbWUgZGVyIFRlcm1pbmFsZW11bGF0aW9uLCBkaWUgZGVyIFNwaWVsZXIgbnV0enQuCisgICAgIEVzIGV4aXN0aWVyZW4gYmlzaGVyICJkdW1iIiwgInZ0MTAwIiB1bmQgImFuc2kiLgorCisJCitBTk1FUktVTkc6CisgICAgIEZhcmJlbiBkdWVyZmVuIGF1c3NjaGxpZXNzbGljaCBiZWkgUF9UVFk9PSJhbnNpIiBiZW51dHp0IHdlcmRlbi4KKyAgICAgQmVpIG5pY2h0IGZhcmJmYWVoaWdlbiBUZXJtaW5hbHMga29lbm5lbiBBTlNJLUNvZGVzIGRpZSBnZXNhbXRlCisgICAgIEF1c2dhYmUgemVyc2NoaWVzc2VuIQorCisgICAgIERpZSBBdHRyaWJ1dGUgZmV0dCwgdW50ZXJzdHJpY2hlbiwgYmxpbmtlbmQgdW5kIGludmVycyBrb2VubmVuIGF1Y2gKKyAgICAgc2Nob24gdm9uIHZ0MTAwLVRlcm1pbmFscyBkYXJnZXN0ZWxsdCB3ZXJkZW4uIEFiZXIgbmljaHQgdWViZXJhbGwKKyAgICAgc2luZCBhbGxlIEF0dHJpYnV0ZS9GYXJiZW4gaW1wbGVtZW50aWVydC4KKworICAgICBCZWkgYWxsZW4gQU5TSS1Db2RlcyBzaW5kIGRyZWkgU2FjaGVuIHp1IGJlYWNodGVuOgorICAgICAKKyAgICAgICAgMSkgU3BhcnNhbSBiZW51dHplbiEgQXVmZ2V6d3VuZ2VuZSBIZXJ2b3JoZWJ1bmdlbiBrb2VubmVuCisJICAgU3BpZWxlciBnYW56IHNjaG5lbGwgbmVydmVuLgorCisJMikgTmljaHQgamVkZXIgYmVudXR6dCBkaWVzZWxiZSBIaW50ZXJncnVuZGZhcmJlIQorCisJMykgU3BhcnNhbSBiZW51dHplbiEgQmVzZXIgbm9jaDogbnVyIGltIE5vdGZhbGwhCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9UVFlfQ09MUyBiL2RvYy9wcm9wcy9QX1RUWV9DT0xTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MTZhMzMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9UVFlfQ09MUwpAQCAtMCwwICsxLDIyIEBACitOQU1FOgorICAgIFBfVFRZX0NPTFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR0eV9jb2xzIgorCitERUZJTklFUlQgSU46CisgICAgL3NlY3VyZS90ZWxuZXRuZWcuaAorCitCRVNDSFJFSUJVTkc6CisgICAgSW4gZGllc2VyIFByb3BlcnRpZXMgc3RlaHQgZGllIEFuemFobCBkZXIgU3BhbHRlbiwgZGllIGRhcyAKKyAgICBUZXJtaW5hbGZlbnN0ZXIgZGVzIFNwaWVsZXJzIGRlcnplaXQgaGF0LgorCisgICAgVm9yYXVzc2V0enVuZyBoaWVyZnVlciBpc3QgYWxsZXJkaW5ncywgZGFzcyBkYXMgVGVsbmV0IGRlcyBTcGllbGVycworICAgIFRlbG5ldG5lZ290aWF0aW9ucyB1bnRlcnN0dWV0enQsIGFuc29uc3RlbiBibGVpYnQgZGllc2UgUHJvcGVydHkKKyAgICBsZWVyLgorICAgIERhcyBTZXR6ZW4gZGVyIFByb3BlcnR5IGFlbmRlcnQgZGllIEZlbnN0ZXJncm9lc3NlIGRlcyBTcGllbGVycworICAgIG5hdHVlcmxpY2ggbmljaHQuCisKK1NJRUhFIEFVQ0g6CisgICAgUF9UVFlfUk9XUywgUF9UVFlfVFlQRSwgUF9UVFlfU0hPVworCitMRVRaVEUgQWVOREVSVU5HOgorICAgIFNhdCwgMDYuMDIuMTk5OSwgMTQ6MDA6MDAgdm9uIFBhcmFjZWxzdXMKKwpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfVFRZX1JPV1MgYi9kb2MvcHJvcHMvUF9UVFlfUk9XUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjk0ZDliCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfVFRZX1JPV1MKQEAgLTAsMCArMSwyMiBAQAorTkFNRToKKyAgICBQX1RUWV9ST1dTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0dHlfcm93cyIKKworREVGSU5JRVJUIElOOgorICAgIC9zZWN1cmUvdGVsbmV0bmVnLmgKKworQkVTQ0hSRUlCVU5HOgorICAgIEluIGRpZXNlciBQcm9wZXJ0aWVzIHN0ZWh0IGRpZSBBbnphaGwgZGVyIFplaWxlbiwgZGllIGRhcworICAgIFRlcm1pbmFsZmVuc3RlciBkZXMgU3BpZWxlcnMgZGVyemVpdCBoYXQuCisKKyAgICBWb3JhdXNzZXR6dW5nIGhpZXJmdWVyIGlzdCBhbGxlcmRpbmdzLCBkYXNzIGRhcyBUZWxuZXQgZGVzIFNwaWVsZXJzCisgICAgVGVsbmV0bmVnb3RpYXRpb25zIHVudGVyc3R1ZXR6dCwgYW5zb25zdGVuIGJsZWlidCBkaWVzZSBQcm9wZXJ0eQorICAgIGxlZXIuCisgICAgRGFzIFNldHplbiBkZXIgUHJvcGVydHkgYWVuZGVydCBkaWUgRmVuc3Rlcmdyb2Vzc2UgZGVzIFNwaWVsZXJzCisgICAgbmF0dWVybGljaCBuaWNodC4KKworU0lFSEUgQVVDSDoKKyAgICBQX1RUWV9DT0xTLCBQX1RUWV9UWVBFLCBQX1RUWV9TSE9XCisKK0xFVFpURSBBZU5ERVJVTkc6CisgICAgU2F0LCAwNi4wMi4xOTk5LCAxNDowMDowMCB2b24gUGFyYWNlbHN1cworCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9UVFlfU0hPVyBiL2RvYy9wcm9wcy9QX1RUWV9TSE9XCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3Mjc0MzMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9UVFlfU0hPVwpAQCAtMCwwICsxLDE3IEBACitOQU1FOgorICAgIFBfVFRZX1NIT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR0eV9zaG93IgorCitERUZJTklFUlQgSU46CisgICAgL3NlY3VyZS90ZWxuZXRuZWcuaAorCitCRVNDSFJFSUJVTkc6CisgICAgQmVpIFRlbG5ldHMsIGRpZSBUZWxuZXRuZWdvdGlhdGlvbnMgdW50ZXJzdHVldHplbiwgd2lyZCBlaW5lIEFlbmRlcnVuZworICAgIGRlciBGZW5zdGVyZ3JvZXNzZSBkZW0gU3BpZWxlcm9iamVrdCBtaXRnZXRlaWx0LiBTdGVodCBpbiBQX1RUWV9TSE9XCisgICAgZWluIFdlcnQgdW5nbGVpY2ggTnVsbCwgd2lyZCBkZW0gU3BpZWxlciBkaWVzZSBBZW5kZXJ1bmcgbWl0Z2V0ZWlsdC4KKworU0lFSEUgQVVDSDoKKyAgICBQX1RUWV9ST1dTLCBQX1RUWV9DT0xTLCBQX1RUWV9UWVBFLCB0ZWxuZWdzCisKK0xFVFpURSBBZU5ERVJVTkc6CisgICAgU2F0LCAwNi4wMi4xOTk5LCAxNDowMDowMCB2b24gUGFyYWNlbHN1cworCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9UVFlfVFlQRSBiL2RvYy9wcm9wcy9QX1RUWV9UWVBFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MzViMjMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9UVFlfVFlQRQpAQCAtMCwwICsxLDIzIEBACitOQU1FOgorICAgIFBfVFRZX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR0eV90eXBlIgorCitERUZJTklFUlQgSU46CisgICAgL3NlY3VyZS90ZWxuZXRuZWcuaAorCitCRVNDSFJFSUJVTkc6CisgICAgSW4gZGllc2VyIFByb3BlcnRpZXMgc3RlaHQgZGVyIFRlcm1pbmFsdHlwLCBkZW4gZWluIFNwaWVsZXIgbG9rYWwgYXVmCisgICAgc2VpbmVtIFJlY2huZXIgdmVyd2VuZGV0LgorCisgICAgVm9yYXVzc2V0enVuZyBoaWVyZnVlciBpc3QgYWxsZXJkaW5ncywgZGFzcyBkYXMgVGVsbmV0IGRlcyBTcGllbGVycworICAgIFRlbG5ldG5lZ290aWF0aW9ucyB1bnRlcnN0dWV0enQsIGFuc29uc3RlbiBibGVpYnQgZGllc2UgUHJvcGVydHkKKyAgICBsZWVyLiBEaWUgbWVpc3RlbiBUZWxuZXRzL0NsaWVudHMgZ2ViZW4gaWhyZW4gVGVybWluYWx0eXAgYWxsZXJkaW5ncworICAgIG5pY2h0IHByZWlzLgorICAgIERhcyBTZXR6ZW4gZGVyIFByb3BlcnR5IGFlbmRlcnQgZGVuIFRlcm1pbmFsdHlwIGRlcyBTcGllbGVycworICAgIG5hdHVlcmxpY2ggbmljaHQuCisKK1NJRUhFIEFVQ0g6CisgICAgUF9UVFlfQ09MUywgUF9UVFlfUk9XUywgUF9UVFlfU0hPVworCitMRVRaVEUgQWVOREVSVU5HOgorICAgIFNhdCwgMDYuMDIuMTk5OSwgMTQ6MDA6MDAgdm9uIFBhcmFjZWxzdXMKKwpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfVU5JVF9ERUNBWV9GTEFHUyBiL2RvYy9wcm9wcy9QX1VOSVRfREVDQVlfRkxBR1MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkyNGZmNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1VOSVRfREVDQVlfRkxBR1MKQEAgLTAsMCArMSw3MCBAQAorUF9VTklUX0RFQ0FZX0ZMQUdTCisKK05BTUU6CisgICAgIFBfVU5JVF9ERUNBWV9GTEFHUwkJCQkJInVuaXRfZGVjYXlfZmxhZ3MiCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N5cy91bml0LmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBNaXQgZGllc2VyIFByb3Aga2FubiBkYXMgWmVyZmFsbHN2ZXJoYWx0ZW4gZ2VzdGV1ZXJ0IHdlcmRlbiwgZW50d2VkZXIKKyAgICAgZnVlciBhbGxlIENsb25lcyBkdXJjaCBTZXR6ZW4gaW4gZGVyIEJsdWVwcmludCBvZGVyIGZ1ZXIgZWluemVsbmUgQ2xvbmVzLgorCisgICAgIEluIGRpZXNlciBQcm9wIGtvZW5uZW4gbW9tZW50YW4gNCBGbGFncyBnZXNldHp0IHdlcmRlbjoKKyAgICAgLSBOT19ERUNBWTogCisgICAgICAgICAgWmVyZmFsbCBpc3QgYWJnZXNjaGFsdGV0LgorICAgICAtIE5PX0RFQ0FZX1VOVElMX01PVkU6IAorICAgICAgICAgIERlciBaZXJmYWxsIGlzdCBzb2xhbmdlIGF1c2dlc2V0enQsIGJpcyBkaWVzZXMgT2JqZWt0IGluIGVpbiBhbmRlcmVzCisgICAgICAgICAgRW52IGJld2VndCB3aXJkLiBTZXR6dCBhbHNvIGVpbiBOUEMgYmVpbSBBZGRJdGVtKCkgZGllc2UgUHJvcCwKKyAgICAgICAgICB6ZXJmYWVsbHQgc2VpbmUgVW5pdCBuaWNodCwgYmlzIHNpZSBiZXdlZ3Qgd3VyZGUgKExlaWNoZSwgU3BpZWxlcgorICAgICAgICAgIGV0Yy4pLiBIaWVyYmVpIHphZWhsdCBkYXMgbW92ZSgpIG5pY2h0LCB3ZW5uIGRhcyBPYmpla3Qgbm9jaCBrZWluCisgICAgICAgICAgRW52IGhhdHRlLCBlcyB6YWVobGVuIG51ciBNb3ZlcyB2b24gZWluZW0gRW52IGluIGVpbiBhbmRlcmVzIEVudi4KKyAgICAgICAgICBEaWVzZXMgRmxhZyBzb2xsdGUgbnVyIGluIENsb25lcyBnZXNldHp0IHdlcmRlbi4KKyAgICAgLSBJTkFDQ1VSQVRFX0RFQ0FZCisgICAgICAgICAgU29sbGVuIHouYi4gNDUuMzQgRWluaGVpdGVuIHplcmZhbGxlbiwgd2lyZCBkZXIgUmVzdCB2b24gMC4zNAorICAgICAgICAgIG5vcm1hbGVyd2Vpc2UgYWxzIFdhaHJzY2hlaW5saWNoa2VpdCBhdWZnZWZhc3N0LCBkYXNzIGVpbmUKKyAgICAgICAgICB6dXNhZXR6bGljaGUgRWluaGVpdCB6ZXJmYWVsbHQuIERpZXNlcyBGbGFnIHNvcmd0IGRhZnVlciwgZGFzcworICAgICAgICAgIGRpZXNlciBSZXN0IHdlZ2dld29yZmVuIHdpcmQgdW5kIGVpbmZhY2ggNDUgRWluaGVpdGVuIHplcmZhbGxlbi4KKyAgICAgICAgICBHbGVpY2h6ZWl0aWcgd2lyZCBiZWkgZGllc2VtIEZsYWcgYWJlciBfaW1tZXIgbWluXyAxIEVpbmhlaXQKKyAgICAgICAgICB6ZXJzdG9lcnQhCisgICAgIC0gQUJTT0xVVEVfREVDQVkKKyAgICAgICAgICBQX1VOSVRfREVDQVlfUVVPVEEgd2lyZCBuaWNodCBhbHMgcHJvemVudHVhbGVyIEFudGVpbCBhdWZnZWZhc3N0LAorICAgICAgICAgIHNvbmRlcm4gYWxzIGFic29sdXRlIFphaGwsIGQuaC4gZXMgemVyZmFsbGVuIGltbWVyIGVpbmZhY2gKKyAgICAgICAgICBQX1VOSVRfREVDQVlfUVVPVEEgRWluaGVpdGVuLgorCisgICAgIERpZXNlIEZsYWdzIGtvZW5uZW4gei5CLiBnZW51dHp0IHdlcmRlbiwgZGVuIFplcmZhbGwgZnVlciBlaW56ZWxuZQorICAgICBPYmpla3RlIHRlbXBvcmFlciBvZGVyIGRhdWVyaGFmdCBhYnp1c2NoYWx0ZW4sIGF1Y2ggd2VubiBhbGxlIGFuZGVyZW4KKyAgICAgQ2xvbmVzIHdlaXRlcnplcmZhbGxlbi4KKworICAgICBEaWVzZSBQcm9wIGthbm4gaW4gZGVyIEJsdWVwcmludCBnZXNldHp0IHdlcmRlbi4gSW4gZGllc2VtIEZhbGwgd2lyZAorICAgICBhbGxlcmRpbmdzIE5PX0RFQ0FZX1VOVElMX01PVkUgaWdub3JpZXJ0LCB3ZWlsIGRpZSBCUCBqYSBuaWUgYmV3ZWd0CisgICAgIHd1ZXJkZS4gTk9fREVDQVkgaW4gZGVyIEJQIHNjaGFsdGV0IGRlbiBaZXJmYWxsc3Byb3plc3MgKHRlbXBvcmFlcikgZnVlcgorICAgICBhbGxlIENsb25lcyBhdXMuIElzdCBuaWUgZWluIFplcmZhbGwgZ2V3dWVuc2NodCwgc29sbHRlIGluIGRlciBCbHVlcHJpbnQKKyAgICAgYWJlciBiZXNzZXIgUF9VTklUX0RFQ0FZX0lOVEVSVkFMIGF1ZiAwIGdlc2V0enQgd2VyZGVuIQorCisgICAgIElzdCBkaWUgUHJvcCBpbiBlaW5lbSBlaW56ZWxuZW4gQ2xvbmUgbmljaHQgZXhwbGl6aXQgZ2VzZXR6dCwKKyAgICAgbGllZmVydCBlaW4ga2xvbi0+UXVlcnlQcm9wKFBfVU5JVF9ERUNBWV9GTEFHUykgZGVuIGluIGRlciBCbHVlcHJpbnQKKyAgICAgZWluZ2VzdGVsbHRlbiBXZXJ0IHp1cnVlY2suCisgICAgIAorQkVNRVJLVU5HRU46CisgICAgICogU2V0enQgbWFuIGRpZXNlIFByb3AgaW4gZWluZW0gQ2xvbmUgYXVmIDAsIHdpcmQgZGVyIFdlcnQgYXVzIGRlcgorICAgICAgIEJsdWVwcmludCB6dXJ1ZWNrZ2ViZW4uIEhpZXJiZWkgd2lyZCBhbGxlcmRpbmdzIGVpbiBOT19ERUNBWV9VTlRJTF9NT1ZFCisgICAgICAgYXVzZ2VmaWx0ZXJ0LCBkYSBkaWVzIGRlbiBaZXJmYWxsIGZ1ZXIgYWxsZSBPYmpla3RlIGRhdWVyaGFmdCBzdG9wcGVuCisgICAgICAgd3VlcmRlLCB3ZWlsIEJQcyBuaWNodCBiZXdlZ3Qgd2VyZGVuLgorICAgICAqIERpZSBGbGFncyBrb2VubmVuICJ2ZXJvZGVydCIgd2VyZGVuOgorICAgICAgIFNldFByb3AoUF9VTklUX0RFQ0FZX0ZMQUdTLCBOT19ERUNBWV9VTlRJTF9NT1ZFIHwgQUJTT0xVVEVfREVDQVkpOworCitCRUlTUElFTDoKKyAgICAgLy8gRGllc2VyIE5QQyBoYXQgdG9sbGUgUGZlaWxlLCBkaWUgc29sbGVuIGFiZXIgbmljaHQgemVyZmFsbGVuLCBzb2xhbmdlCisgICAgIC8vIHNpZSBpbSBJbnZlbnRhciBkZXMgTlBDcyBzaW5kOgorICAgICBBZGRJdGVtKCIvZC90b2xsZXJlZ2lvbi90b2xsZXJtYWdpZXIvb2JqL3BmZWlsZSIsIFJFRlJFU0hfTk9ORSwKKyAgICAgICAgIChbIFBfQU1PVU5UOiA1MCtyYW5kb20oNTApLAorICAgICAgICAgICAgUF9VTklUX0RFQ0FZX0ZMQUdTOiBOT19ERUNBWV9VTlRJTF9NT1ZFIF0pICk7CisKK1NJRUhFIEFVQ0g6CisgICAgIHVuaXQKKyAgICAgUF9VTklUX0RFQ0FZX0lOVEVSVkFMLCBQX1VOSVRfREVDQVlfUVVPVEEsIFBfVU5JVF9ERUNBWV9NSU4KKyAgICAgRG9EZWNheSwgRG9EZWNheU1lc3NhZ2UKKyAgICAgL3N0ZC91bml0LmMKKworMTQuMTAuMjAwNywgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfVU5JVF9ERUNBWV9JTlRFUlZBTCBiL2RvYy9wcm9wcy9QX1VOSVRfREVDQVlfSU5URVJWQUwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMxNTRjZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1VOSVRfREVDQVlfSU5URVJWQUwKQEAgLTAsMCArMSwzNyBAQAorUF9VTklUX0RFQ0FZX0lOVEVSVkFMCisKK05BTUU6CisgICAgIFBfVU5JVF9ERUNBWV9JTlRFUlZBTAkJCQkJInVuaXRfZGVjYXlfaW50ZXJ2YWwiCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N5cy91bml0LmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBEaWVzZSBQcm9wIGJlc3RpbW10LCB3aWUgb2Z0IGVpbiBaZXJmYWxsIGRlciBlbnRzcHJlY2hlbmRlbiBVbml0b2JqZWt0ZQorICAgICBkdXJjaGdlZnVlaHJ0IHdpcmQuIERhcyBJbnRlcnZhbGwgaXN0IGluIFNla3VuZGVuIGFuenVnZWJlbiAoaW50KS4KKyAgICAgRGllIFByb3AgbXVzcyBpbiBkZXIgQmx1ZXByaW50IGRlciBlbnRzcHJlY2hlbmRlbiBVbml0b2JqZWt0ZSBnZXNldHp0CisgICAgIHdlcmRlbiwgaW4gQ2xvbmVzIGthbm4gc2llIG5pY2h0IGdlc2V0enQgd2VyZGVuLgorICAgICBEaWUgQmx1ZXByaW50IHJlc2V0dGV0IGRhbm4gaW4gZGllc2VtIEludGVydmFsbCB1bmQgcnVmdCBpbiBhbGxlbiBpaHJlbgorICAgICBDbG9uZXMgKHVuZCBkZW5lbiBhbHRlciBWZXJzaW9uZW4gZGVyIGdsZWljaGVuIEJQISkgRG9EZWNheSgpIGF1ZiwKKyAgICAgd29yYXVmaGluIGRpZSBDbG9uZXMgZGVuIFplcmZhbGwgZHVyY2hmdWVocmVuLgorICAgICBJc3QgZGllIFByb3AgaW4gZGVyIEJsdWVwcmludCBuaWNodCBnZXNldHp0LCBlcmZvbGd0IGtlaW4gWmVyZmFsbC4KKworQkVNRVJLVU5HRU46CisgICAgICogSXN0IGRpZSBCbHVlcHJpbnQgbmljaHQgZ2VsYWRlbiwgZXJmb2xndCBrZWluIFplcmZhbGwgZGVyIENsb25lcy4KKyAgICAgKiBFaW4gU2V0emVuIGRpZXNlciBQcm9wIGJlaW5oYWx0ZXQgaW1tZXIgYXVjaCBlaW5lbiBBdWZydWYgdm9uCisgICAgICAgc2V0X25leHRfcmVzZXQoKSBhdWYgZGFzIGVuc3ByZWNoZW5kZSBJbnRlcnZhbGwuCisgICAgICogRGllIFByb3Aga2FubiBpbiBkZW4gQ2xvbmVzIGFiZ2VmcmFndCB3ZXJkZW4gdW5kIGxpZWZlcnQgZGFzIGluIGRlcgorICAgICAgIEJsdWVwcmludCBlaW5nZXN0ZWxsdGUgSW50ZXJ2YWxsLgorICAgICAqIFZvbiBlaW5lciBNYW5pcHVsYXRpb24gcGVyIFNldCgpIHdpcmQgZHJpbmdlbmQgYWJnZXJhdGVuLgorICAgICAqIERpZSBQcm9wIGthbm4gbnVyIHZvbSBPYmpla3Qgc2VsYmVyLCB2b20gUHJvZ3JhbW1pZXJlciBkZXMgT2JqZWt0cywgdm9tCisgICAgICAgUk0gZGVyIGVudHNwcmVjaGVuZGVuIFJlZ2lvbiwgdm9uIGVpbmVtIFdlaXNlbiBvZGVyIHZvbiBlaW5lbSBPYmpla3QKKyAgICAgICBnZXNldHp0IHdlcmRlbiwgd2VsY2hlcyBkaWUgZ2xlaWNoZSBVSUQgaGF0LgorCitCRUlTUElFTDoKKworU0lFSEUgQVVDSDoKKyAgICAgdW5pdAorICAgICBQX1VOSVRfREVDQVlfUVVPVEEsIFBfVU5JVF9ERUNBWV9GTEFHUywgUF9VTklUX0RFQ0FZX01JTgorICAgICBEb0RlY2F5KCksIERvRGVjYXlNZXNzYWdlKCkKKworMTMuMTAuMjAwNywgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfVU5JVF9ERUNBWV9NSU4gYi9kb2MvcHJvcHMvUF9VTklUX0RFQ0FZX01JTgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWY5YzgwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfVU5JVF9ERUNBWV9NSU4KQEAgLTAsMCArMSw1MSBAQAorUF9VTklUX0RFQ0FZX01JTgorCitOQU1FOgorICAgICBQX1VOSVRfREVDQVlfTUlOCQkJCQkgICAgICAgICAgICAgICAgICAgICJ1bml0X2RlY2F5X21pbiIKKworREVGSU5JRVJUIElOOgorICAgICAvc3lzL3VuaXQuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIERpZXNlIFByb3AgYmVzdGltbXQsIHdpZXZpZWxlIEVpbmhlaXRlbiBkZXIgVW5pdG9iamVrdGVuIG1pbmRlc3RlbnMKKyAgICAgdWVicmlnIGJsZWliZW4gc29sbGVuLiAKKyAgICAgRmFlbGx0IGRpZSBNZW5nZSBlaW5lcyBVbml0b2JqZWt0cyB1bnRlciBkaWVzZW4gV2VydCwgemVyZmFlbGx0IGRpZXNlCisgICAgIFVuaXQgc29sYW5nZSBuaWNodCB3ZWl0ZXIsIGJpcyBkZXIgV2VydCB3aWVkZXIgdWViZXJzY2hyaXR0ZW4gd2lyZC4KKyAgICAgRGllIFByb3Aga2FubiBpbiBkZXIgQmx1ZXByaW50IHVuZCBpbiBkZW4gZWluemVsbmVuIENsb25lcyBnZXNldHp0CisgICAgIHdlcmRlbi4KKyAgICAgSXN0IGRpZSBQcm9wIGluIGVpbmVtIGVpbnplbG5lbiBDbG9uZSBuaWNodCBleHBsaXppdCBnZXNldHp0LAorICAgICBsaWVmZXJ0IGVpbiBRdWVyeVByb3AoUF9VTklUX0RFQ0FZX01JTikgZGVuIGluIGRlciBCbHVlcHJpbnQKKyAgICAgZWluZ2VzdGVsbHRlbiBXZXJ0IHp1cnVlY2sgdW5kIGRpZSBVbml0IHplcmZhZWxsdCBiaXMgenUgZGllc2VyCisgICAgIE1pbmRlc3RtZW5nZS4uCisgICAgIEQuaC4gbWFuIHNvbGx0ZSBkaWVzZSBQcm9wIGluIGRlciBCbHVlcHJpbnQgc2V0emVuIHVuZCBpbiBlaW56ZWxuZW4KKyAgICAgQ2xvbmVzIG51ciBzb3dlaXQgZGllc2UgYWJ3ZWljaGVuZGUgV2VydGUgaGFiZW4gc29sbGVuLgorICAgICBFcyBzaW5kIG51ciBXZXJ0ZSB6d2lzY2hlbiAwIHVuZCAxMDAgenVsYWVzc2lnLiBBdWYgZGllc2UgQXJ0IGxhZXNzdCBzaWNoCisgICAgIGRpZSBtaW5pZGVzdGVucyB1ZWJyaWcgYmxlaWJlbmRlIE1lbmdlIGFsbGVyIENsb25lcyBkdXJjaCBBZW5kZXJuIGVpbmVyCisgICAgIFByb3AgaW4gZGVyIEJsdWVwcmludCBhZW5kZXJuLgorCitCRU1FUktVTkdFTjoKKyAgICAgKiBTZXR6dCBtYW4gZGllc2UgUHJvcCBpbiBlaW5lbSBDbG9uZSBhdWYgMCwgd2lyZCBkZXIgV2VydCBhdXMgZXIKKyAgICAgICBCbHVlcHJpbnQgenVtIFplcmZhbGwgYmVudXR6dC4KKyAgICAgKiBXaWxsIG1hbiBmdWVyIGVpbiBiZXN0aW1tdGVzIFVuaXRvYmpla3Qga2VpbiBNaW5pbXVtIGhhYmVuLCBhbHNvIGRhc3MKKyAgICAgICBkaWVzZXMgT2JqZWt0IHplcmZhZWxsdCwgYmlzIG5pY2h0cyBtZWhyIGRhIGlzdCwgZGllIEJsdWVwcmludCBoYXQgYWJlcgorICAgICAgIGVpbmVuIE1pbmltYWx3ZXJ0IGdlc2V0enQsIHNvbGx0ZSBkaWVzZSBQcm9wIGltIGJldHJlZmZlbmRlbiBPYmpla3QgYXVmCisgICAgICAgLTEgZ2VzZXR6dCB3ZXJkZW4uCisgICAgICogRGllc2UgUHJvcCBzb2xsdGUgdm9yc2ljaHRpZyBhbmdld2FuZHQgd2VyZGVuLCBkYSBTcGllbGVyIHNvIGRlbgorICAgICAgIFplcmZhbGwgdm9uIFVuaXRzIHN0b3BwZW4ga29lbm5lbiwgaW5kZW0gc2llIGRpZSBVbml0cyBlbnRzcHJlY2hlbmQKKyAgICAgICBhdWZ0ZWlsZW4sIHNvIGRhc3MgamVkZXMgRWluemVsb2JqZWt0IHVudGVyIGRlbSBNaW5pbXVtIGxpZWd0LgorCitCRUlTUElFTDoKKyAgICAgLy8gZXMgc29sbCBtaW4uIDEgRWluaGVpdCB1ZWJyaWcgYmxlaWJlbi4KKyAgICAgU2V0UHJvcChQX1VOSVRfREVDQVlfTUlOLCAxKTsKKworICAgICAvLyBkaWUgQmx1ZXByaW50IGhhdCBlaW4gTWluaW11bSB2b24gMTAgZ2VzZXR6dCwgZGllc2VyIENsb25lIHNvbGwKKyAgICAgLy8gYWJlciB6ZXJmYWxsZW4sIGJpcyBuaXggbWVociBkYSBpc3QuCisgICAgIGtsb24tPlNldFByb3AoUF9VTklUX0RFQ0FZX01JTiwgLTEpOworCitTSUVIRSBBVUNIOgorICAgICB1bml0CisgICAgIFBfVU5JVF9ERUNBWV9JTlRFUlZBTCwgUF9VTklUX0RFQ0FZX0ZMQUdTLCBQX1VOSVRfREVDQVlfUVVPVEEKKyAgICAgRG9EZWNheSwgRG9EZWNheU1lc3NhZ2UKKyAgICAgL3N0ZC91bml0LmMKKworMTQuMTAuMjAwNywgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfVU5JVF9ERUNBWV9RVU9UQSBiL2RvYy9wcm9wcy9QX1VOSVRfREVDQVlfUVVPVEEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE0NDU2NAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1VOSVRfREVDQVlfUVVPVEEKQEAgLTAsMCArMSw0NSBAQAorUF9VTklUX0RFQ0FZX1FVT1RBIChpbnQpCisKK05BTUU6CisgICAgIFBfVU5JVF9ERUNBWV9RVU9UQQkJCQkJInVuaXRfZGVjYXlfcXVvdGEiCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N5cy91bml0LmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBEaWVzZSBQcm9wIGJlc3RpbW10LCB3ZWxjaGVyIEFudGVpbCBkZXIgZWluemVsbmVuIFVuaXRvYmpla3RlIHBybyBaZXJmYWxsCisgICAgIHplcnN0b2VydCB3aXJkLiBEaWVzZXIgQW50ZWlsIHdpcmQgYWxzIGdhbnplIFphaGwgendpc2NoZW4gMCB1bmQgMTAwMDAKKyAgICAgYXVzZ2VkcnVlY2t0LiAxIGVudHNwcmljaHQgZWluZW0gWmVyZmFsbCB2b24gMC4wMSUsIDEwMDAwIGVudHNwcmljaHQKKyAgICAgMTAwJS4KKyAgICAgTW9tZW50YW4gc2luZCBrZWluZSBXZXJ0ZSA8IDAgenVsYWVzc2lnLCBkaWUgZWluZW0gWnV3YWNocyBlbnRzcHJlY2hlbmQKKyAgICAgd3VyZGVuLgorCisgICAgIEZhbGxzIGRhcyBGbGFnIEFCU09MVVRFX0RFQ0FZIChzLiBQX1VOSVRfREVDQVlfRkxBR1MpIGdlc2V0enQgaXN0LCBzdGVodAorICAgICBkaWUgWmFobCBpbiBkaWVzZXIgUHJvcCBmdWVyIGRpZSBhYnNvbHV0ZSBBbnphaGwgYW4genUgemVyc3RvZXJlbmRlbgorICAgICBFaW5oZWl0ZW4uCisKKyAgICAgRGllIFByb3Aga2FubiBpbiBkZXIgQmx1ZXByaW50IHVuZCBpbiBkZW4gZWluemVsbmVuIENsb25lcyBnZXNldHp0CisgICAgIHdlcmRlbi4KKyAgICAgSXN0IGRpZSBQcm9wIGluIGVpbmVtIGVpbnplbG5lbiBDbG9uZSBuaWNodCBleHBsaXppdCBnZXNldHp0LAorICAgICBsaWVmZXJ0IGVpbiBRdWVyeVByb3AoUF9VTklUX0RFQ0FZX1FVT1RBKSBkZW4gaW4gZGVyIEJsdWVwcmludAorICAgICBlaW5nZXN0ZWxsdGVuIFdlcnQgenVydWVjayB1bmQgZGllIFVuaXQgemVyZmFlbGx0IHp1IGRpZXNlbSBBbnRlaWwuCisgICAgIEQuaC4gbWFuIHNvbGx0ZSBkaWVzZSBQcm9wIGluIGRlciBCbHVlcHJpbnQgc2V0emVuIHVuZCBpbiBlaW56ZWxuZW4KKyAgICAgQ2xvbmVzIG51ciBzb3dlaXQgZGllc2UgYWJ3ZWljaGVuZGUgWmVyZmFsbHNyYXRlbiBoYWJlbiBzb2xsZW4uCisKK0JFTUVSS1VOR0VOOgorICAgICAqIFNldHp0IG1hbiBkaWVzZSBQcm9wIGluIGVpbmVtIENsb25lIGF1ZiAwLCB3aXJkIGRlciBXZXJ0IGF1cyBlcgorICAgICAgIEJsdWVwcmludCB6dW0gWmVyZmFsbCBiZW51dHp0LgorICAgICAqIFdpbGwgbWFuIGRlbiBaZXJmYWxsIGZ1ZXIgZWluIGJlc3RpbW10ZXMgVW5pdG9iamVrdCBhYnNjaGFsdGVuLCBzb2xsdGUKKyAgICAgICBtYW4gUF9VTklUX0RFQ0FZX0ZMQUdTIGJlbnV0emVuLgorCitCRUlTUElFTDoKKyAgICAgLy8gcHJvIFplcmZhbGxzaW50ZXJ2YWxsIHNvbGxlbiAxMiUgemVyZmFsbGVuLgorICAgICBTZXRQcm9wKFBfVU5JVF9ERUNBWV9RVU9UQSwgMTIwMCk7CisKK1NJRUhFIEFVQ0g6CisgICAgIHVuaXQKKyAgICAgUF9VTklUX0RFQ0FZX0lOVEVSVkFMLCBQX1VOSVRfREVDQVlfRkxBR1MsIFBfVU5JVF9ERUNBWV9NSU4KKyAgICAgRG9EZWNheSwgRG9EZWNheU1lc3NhZ2UKKyAgICAgL3N0ZC91bml0LmMKKworMTQuMDMuMjAwOCwgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfVU5XRUFSX01TRyBiL2RvYy9wcm9wcy9QX1VOV0VBUl9NU0cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVlMGQ4MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1VOV0VBUl9NU0cKQEAgLTAsMCArMSw1NiBAQAorUF9VTldFQVJfTVNHCitOQU1FOgorICAgICBQX1VOV0VBUl9NU0cgICAgICAgICAgICAgICAgICAgICAgICJ1bndlYXJfbXNnIiAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N5cy9hcm1vdXIuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIFp3ZWl0ZWlsaWdlcyBBcnJheSBtaXQgTWVsZHVuZ2VuLCBkaWUgYmVpbSBBdXN6aWVoZW4gZWluZXIgUnVlc3R1bmcgCisgICAgIG9kZXIgS2xlaWR1bmcgYW4gZGVuIFNwaWVsZXIgdW5kIGRpZSBVbWdlYnVuZyBhdXNnZWdlYmVuIHdlcmRlbi4KKyAgICAgRGVyIGVyc3RlIEVpbnRyYWcgZ2VodCBhbiBkZW4gU3BpZWxlciwgZGVyIHp3ZWl0ZSBFaW50cmFnIGFuIGRpZQorICAgICBVbWdlYnVuZy4gWmVpbGVudW1icnVlY2hlIHdlcmRlbiBhdXRvbWF0aXNjaCBnZW1hY2h0LCBleGlzdGllcmVuZGUKKyAgICAgamVkb2NoIGJlcnVlY2tzaWNodGlndC4KKworICAgICBQbGF0emhhbHRlciBmdWVyIFNwaWVsZXIgaXN0IEBXRXh4eDEsIGZ1ZXIgZGllIFdhZmZlIEBXRXh4eDIgKHNpZWhlCisgICAgIG1hbiByZXBsYWNlX3BlcnNvbmFsKCkpLgorCisgICAgIFtXZWdlbiBBYndhZXJ0c2tvbXBhdGliaWxpdGFldCBpc3QgYXVjaCBub2NoIGRlciBQbGF0emhhbHRlciAlcworICAgICAgbW9lZ2xpY2gsIHdvYmVpIGluIGRlciBlaWdlbmVuIE1lbGR1bmcgJXMgZnVlciBkZW4gV2FmZmVubmFtZW4gc3RlaHQsCisgICAgICBpbiBkZXIgYW4gZGVuIFJhdW0gZGFzIGVyc3RlICVzIGZ1ZXIgZGVuIFNwaWVsZXJuYW1lbiwgZGFzIHp3ZWl0ZSBmdWVyCisgICAgICBkZW4gV2FmZmVubmFtZW4uXQorCitCRUlTUElFTEU6CisgICAgU2V0UHJvcChQX05BTUUsICJNYW50ZWwiKTsKKyAgICBTZXRQcm9wKFBfVU5XRUFSX01TRywKKyAgICAgKHsiRHUgcmVpc3N0IERpciBAV0VOMiB2b20gTGVpYi4iLAorICAgICAgICJAV0VSMSByZWlzc3Qgc2ljaCBAV0VOVTIgdm9tIExlaWIuIiB9KSk7CisKKyAgICAtPiBiZWltIEF1c3ppZWhlbiBkdXJjaCBVcms6CisgICAgICAgVXJrIGJla29tbXQ6IER1IHJlaXNzdCBkaXIgZGVuIE1hbnRlbCB2b20gTGVpYi4KKyAgICAgICBEZXIgUmF1bTogICAgVXJrIHJlaXNzdCBzaWNoIGVpbmVuIE1hbnRlbCB2b20gTGVpYi4KKworICAgIFNldFByb3AoUF9VTldFQVJfTVNHLAorICAgICAoeyJEaXIgd2lyZCBmdXJjaHRiYXIgd2FybS4gU28gZWluZSBIaXR6ZSBhYmVyIGF1Y2guIFNjaG5lbGwgIgorICAgICAgICJzY2hsdWVwZnN0IER1IGF1cyBEZWluZXIgZGlja2VuIFJ1ZXN0dW5nLiBBYWFhaCwgd2FzIGZ1ZXIgIgorICAgICAgICJlaW5lIFdvaGx0YXQuIiwKKyAgICAgICAiQFdFTTEgc2NoZWludCBwbG9ldHpsaWNoIHdhcm0genUgd2VyZGVuLiBTY2huZWxsIHNjaGx1ZXBmdCAiCisgICAgICAgIkBXRVJRUDEgYXVzIEBXRU1RUFBGUzEgZGlja2VuIFJ1ZXN0dW5nLiBEdSBob2Zmc3QgaW5zdGFlbmRpZywgIgorICAgICAgICJkYXMgZXMgbm9jaCBldHdhcyB3YWVybWVyIHdpcmQgLi4uICJ9KSk7CisKKyAgICAtPiBiZWltIEF1c3ppZWhlbiBkdXJjaCBVcms6CisgICAgICAgVXJrIGJla29tbXQ6IERpciB3aXJkIGZ1cmNodGJhciB3YXJtLiBTbyBlaW5lIEhpdHplIGFiZXIgYXVjaC4KKwkJICAgIFNjaG5lbGwgc2NobHVlcGZzdCBEdSBhdXMgRGVpbmVyIGRpY2tlbiBSdWVzdHVuZy4KKwkJICAgIEFhYWFoLCB3YXMgZnVlciBlaW5lIFdvaGx0YXQuCisgICAgICAgRGVyIFJhdW06ICAgIFVyayBzY2hlaW50IHBsb2V0emxpY2ggd2FybSB6dSB3ZXJkZW4uIFNjaG5lbGwKKwkJICAgIHNjaGx1ZXBmdCBlciBhdXMgc2VpbmVyIGRpY2tlbiBSdWVzdHVuZy4gRHUgaG9mZnN0CisJCSAgICBpbnN0YWVuZGlnLCBkYXMgZXMgbm9jaCBldHdhcyB3YWVybWVyIHdpcmQgLi4uCitTSUVIRSBBVUNIOgorICAgICBBZWhubGljaGVzOiBQX1dFQVJfTVNHLCBQX1dJRUxEX01TRywgUF9VTldJRUxEX01TRworICAgICAgICAgICAgICAgICBQX0RST1BfTVNHLCBQX1BVVF9NU0csIFBfR0lWRV9NU0csIFBfUElDS19NU0cKKyAgICAgRnVua3Rpb25lbjogV2VhckZ1bmMsIFVud2VhckZ1bmMKKyAgICAgU29uc3RpZ2VzOiAgcmVwbGFjZV9wZXJzb25hbChFKSwgL3N0ZC9hcm1vdXIvd2Vhci5jLCBhcm1vdXJzCisgICAgICAgICAgICAgICAgIGNsb3RoaW5nLCAvc3RkL2Nsb3RoaW5nLndlYXIuYworCitMRVRaVEUgQWVOREVSVU5HOgorMTUuMDIuMjAwOSwgWmVzc3RyYQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1VOV0lFTERfRlVOQyBiL2RvYy9wcm9wcy9QX1VOV0lFTERfRlVOQwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTBmYTdjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfVU5XSUVMRF9GVU5DCkBAIC0wLDAgKzEsMTkgQEAKK1BfVU5XSUVMRF9GVU5DCisKK05BTUU6CisgICAgIFBfVU5XSUVMRF9GVU5DICJ1bndpZWxkX2Z1bmMiCisKK0RFRklOSUVSVCBJTjoKKyAgICAgPHdlYXBvbi5oPgorCitCRVNDSFJFSUJVTkc6CisgICAgIEZhbGxzIGVpbiBPYmpla3QgZWluZSBVbndpZWxkRnVuYygpIGZ1ZXIgZGllIFdhZmZlIGRlZmluaWVydCwgc28gbXVzcworICAgICBkaWVzZXMgT2JqZWt0IGluIGRpZXNlciBQcm9wZXJ0eSBlaW5nZXRyYWdlbiB3ZXJkZW4uCisKKyAgICAgRGllIEF1c3dlcnR1bmcgZGllc2VyIFByb3BlcnR5IGVyZm9sZ3QgaW4gRG9VbndpZWxkKCkuCisKK1NJRUhFIEFVQ0g6CisgICAgIC9zdGQvd2VhcG9uLmMsIFVud2llbGRGdW5jKCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogU3VuIE1heSAxOSAxNTo0NDowOCAxOTk2IGJ5IFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfVU5XSUVMRF9NU0cgYi9kb2MvcHJvcHMvUF9VTldJRUxEX01TRwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWE2NDY2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfVU5XSUVMRF9NU0cKQEAgLTAsMCArMSw1OSBAQAorUF9VTldJRUxEX01TRworTkFNRToKKyAgICAgUF9VTldJRUxEX01TRyAgICAgICAgICAgICAgICAgICAgICAgInVud2llbGRfbXNnIiAgICAgICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N5cy93ZWFwb24uaAorCitCRVNDSFJFSUJVTkc6CisgICAgIFp3ZWl0ZWlsaWdlcyBBcnJheSBtaXQgTWVsZHVuZ2VuLCBkaWUgYmVpbSBXZWdzdGVja2VuIGVpbmVyIAorICAgICBXYWZmZSBhbiBkZW4gU3BpZWxlciB1bmQgZGllIFVtZ2VidW5nIGF1c2dlZ2ViZW4gd2VyZGVuLgorCisgICAgIERlciBlcnN0ZSBFaW50cmFnIGdlaHQgYW4gZGVuIFNwaWVsZXIsIGRlciB6d2VpdGUgRWludHJhZyBhbiBkaWUKKyAgICAgVW1nZWJ1bmcuICBaZWlsZW51bWJydWVjaGUgd2VyZGVuIGF1dG9tYXRpc2NoIGdlbWFjaHQsIGV4aXN0aWVyZW5kZQorICAgICBqZWRvY2ggYmVydWVja3NpY2h0aWd0LgorCisgICAgIFBsYXR6aGFsdGVyIGZ1ZXIgU3BpZWxlciBpc3QgQFdFeHh4MSwgZnVlciBkaWUgV2FmZmUgQFdFeHh4MiAoc2llaGUKKyAgICAgbWFuIHJlcGxhY2VfcGVyc29uYWwoKSkuCisKKyAgICAgW1dlZ2VuIEFid2FlcnRza29tcGF0aWJpbGl0YWV0IGlzdCBhdWNoIG5vY2ggZGVyIFBsYXR6aGFsdGVyICVzCisgICAgICBtb2VnbGljaCwgd29iZWkgaW4gZGVyIGVpZ2VuZW4gTWVsZHVuZyAlcyBmdWVyIGRlbiBXYWZmZW5uYW1lbiBzdGVodCwKKyAgICAgIGluIGRlciBhbiBkZW4gUmF1bSBkYXMgZXJzdGUgJXMgZnVlciBkZW4gU3BpZWxlcm5hbWVuLCBkYXMgendlaXRlIGZ1ZXIKKyAgICAgIGRlbiBXYWZmZW5uYW1lbi5dCisKK0JFSVNQSUVMRToKKyAgICBTZXRQcm9wKFBfTkFNRSwgIlN0cmVpdGtvbGJlbiIpOworICAgIFNldFByb3AoUF9VTldJRUxEX01TRywKKyAgICAgKHsgIkR1IHN0ZWNrc3QgQFdFTjIgenVydWVjayB1bmQgYXRtZXN0IGVyc3RtYWwgdGllZiBkdXJjaC4iLCAKKyAgICAgICAgIkBXRVIxIHN0ZWNrdCBAV0VOVTIgenVydWVjayB1bmQgYXRtZXQgZXJzdG1hbCB0aWVmIGR1cmNoLiIgfSkpOworCisgICAgLT4gYmVpbSBXZWdzdGVja2VuIGR1cmNoIFVyazoKKyAgICAgICBVcmsgYmVrb21tdDogRHUgc3RlY2tzdCBkZW4gU3RyZWl0a29sYmVuIHp1cnVlY2sgdW5kIGF0bWVzdCBlcnN0bWFsCisJCSAgICB0aWVmIGR1cmNoLgorICAgICAgIERlciBSYXVtOiAgICBVcmsgc3RlY2t0IGVpbmVuIFN0cmVpdGtvbGJlbiB6dXJ1ZWNrIHVuZCBhdG1ldCBlcnN0bWFsCisJCSAgICB0aWVmIGR1cmNoLgorCisgICAgU2V0UHJvcChQX1VOV0lFTERfTVNHLAorICAgICAoeyJEdSBzdGVja3N0IGRpZSBzY2h3ZXJlIEtldWxlIHp1cnVlY2suIFp1ZmFlbGxpZyBsYW5kZXQgc2llICIKKyAgICAgICAiZGFiZWkgYXVmIERlaW5lbSBGdXNzLiBMYXV0IHNjaHJlaWVuZCBodW1wZWxzdCBEdSBpbiBkZXIgIgorICAgICAgICJHZWdlbmQgaGVydW0uIiwKKyAgICAgICAiQFdFUjEgc3RlY2t0IGVpbmUgc2Nod2VyZSBLZXVsZSB6dXJ1ZWNrLiBEdW1tZXJ3ZWlzZSBsYW5kZXQgZGllc2UgIgorICAgICAgICJkaXJla3QgYXVmIGRlbSBlaWdlbmVuIEZ1c3MuIEF1YSwgZGFzIHRhdCBzaWNoZXIgd2VoIC4uLiBuaWNodCAiCisgICAgICAgInVtc29uc3QgaHVtcGVsdCBAV0VSUVAxIGpldHp0IHNjaHJlaWVuZCBkdXJjaCBkaWUgR2VnZW5kLiJ9KSk7CisKKyAgICAtPiBiZWltIFdlZ3N0ZWNrZW4gZHVyY2ggVXJrOgorICAgICAgIFVyayBiZWtvbW10OiBEdSBzdGVja3N0IGRpZSBzY2h3ZXJlIEtldWxlIHp1cnVlY2suIFp1ZmFlbGxpZyBsYW5kZXQKKwkJICAgIHNpZSBkYWJlaSBhdWYgRGVpbmVtIEZ1c3MuIExhdXQgc2NocmVpZW5kIGh1bXBlbHN0IER1IGluCisJCSAgICBkZXIgR2VnZW5kIGhlcnVtLgorICAgICAgIERlciBSYXVtOiAgICBVcmsgc3RlY2t0IGVpbmUgc2Nod2VyZSBLZXVsZSB6dXJ1ZWNrLiBEdW1tZXJ3ZWlzZQorCQkgICAgbGFuZGV0IGRpZXNlIGRpcmVrdCBhdWYgZGVtIGVpZ2VuZW4gRnVzcy4gQXVhLCBkYXMgdGF0CisgICAgICAgICAgICAgICAgICAgIHNpY2hlciB3ZWggLi4uIG5pY2h0IHVtc29uc3QgaHVtcGVsdCBlciBqZXR6dCBzY2hyZWllbmQKKyAgICAgICAgICAgICAgICAgICAgZHVyY2ggZGllIEdlZ2VuZC4KKworU0lFSEUgQVVDSDoKKyAgICAgQWVobmxpY2hlczogUF9XSUVMRF9NU0csIFBfV0VBUl9NU0csIFBfVU5XRUFSX01TRworICAgICAgICAgICAgICAgICBQX0RST1BfTVNHLCBQX1BVVF9NU0csIFBfR0lWRV9NU0csIFBfUElDS19NU0cKKyAgICAgRnVua3Rpb25lbjogVW53aWVsZEZ1bmMsIFdpZWxkRnVuYworICAgICBTb25zdGlnZXM6ICByZXBsYWNlX3BlcnNvbmFsKEUpLCAvc3RkL3dlYXBvbi9jb21iYXQuYworCisyOS4gTWFlcnogMjAwNCBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfVU5XSUVMRF9USU1FIGIvZG9jL3Byb3BzL1BfVU5XSUVMRF9USU1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMTI4ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9VTldJRUxEX1RJTUUKQEAgLTAsMCArMSwxOSBAQAorUF9VTldJRUxEX1RJTUUKKworTkFNRToKKyAgICAgIFBfVU5XSUVMRF9USU1FCQkJInVud2llbGRfdGltZSIKKworREVGSU5JRVJUIElOOgorICAgICAgL3N5cy93ZWFwb24uaA0KKworQkVTQ0hSRUlCVU5HOgorICAgICAgRW50aGFlbHQgZGVuIFplaXRwdW5rdCB6dSBkZW0gZWluIExpdmluZyBlaW5lIFdhZmZlIHdlZ2dlc3RlY2t0IGhhdCB1bmQNCisgICAgICBpc3QgaW0gTGl2aW5nIGdlc2V0enQuDQorCitTSUVIRSBBVUNIOg0KKyAgICAgIFZlcndhbmR0OgkJUF9XRUFQT04sIFBfV0lFTERFRCwgRG9VbndpZWxkKCkNCisJCQlQX0xBU1RfVVNFCisgICAgICBTb25zdGlnZXM6CVBfRVFVSVBfVElNRQ0KKwkJCXRpbWUoKQorCisxMC5GZWIgMjAwNSBHbG9pbnNvbg0KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1VTRURfSEFORFMgYi9kb2MvcHJvcHMvUF9VU0VEX0hBTkRTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NmQzMmMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9VU0VEX0hBTkRTCkBAIC0wLDAgKzEsMjEgQEAKK1BfVVNFRF9IQU5EUworTkFNRToKKyAgICBQX1VTRURfSEFORFMgICAgICAgICAgICAgICAgICAidXNlZF9oYW5kcyIKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvbGl2aW5nL2NvbWJhdC5oCisKK0JFU0NIUkVJQlVORzoKKyAgICBBbnphaGwgZGVyIEhhZW5kZSBpbiBCZW51dHp1bmcuCisgICAgRWZmZWt0aXYgbnVyIGVpbiBzaXplb2YoUF9IQU5EU19VU0VEX0JZKS4KKworQkVNRVJLVU5HRU46CisgICAgS2VpbmUgZWNodGUgUHJvcGVydHkuIERpZSBNZXRob2RlIC9zdGQvbGl2aW5nL2NvbWJhdDo6X3F1ZXJ5X3VzZWRfaGFuZHMKKyAgICBzdGVsbHQgZGllIERhdGVuIHp1c2FtbWVuLiBOaWNodCBzZXR6ZW4hCisKK1NJRUhFIEFVQ0g6CisgICAgUF9IQU5EUywgUF9IQU5EU19VU0VEX0JZCisgICAgUF9NQVhfSEFORFMsIFBfRlJFRV9IQU5EUworICAgIFVzZUhhbmRzLCBGcmVlSGFuZHMKKworMS4gT2t0IDIwMTIsIEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9WQUxJRF9HVUlMRFMgYi9kb2MvcHJvcHMvUF9WQUxJRF9HVUlMRFMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjczNGFkOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1ZBTElEX0dVSUxEUwpAQCAtMCwwICsxLDIzIEBACitOQU1FOgorCVBfVkFMSURfR1VJTERTCQkJInZhbGlkX2d1aWxkcyIgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKwkvc3lzL25ld19za2lsbHMuaAorCitCRVNDSFJFSUJVTkc6CisJRGllc2UgUHJvcGVydHkgZW50aGFlbHQgZGllIHp1Z2VsYXNzZW5lbiBHaWxkZW4gaW4gRm9ybSB2b24KKwlrbGVpbmdlc2NocmllYmVuZW4gR2lsZGVubmFtZW4sIHdlbGNoZSBpbiBlaW5lbSBBcnJheQorCXp1c2FtbWVuZ2VmYXNzdCBzaW5kLiBTaWUgaXN0IG51ciBmdWVyIGRlbiBHaWxkZW5tYXN0ZXIgc2VsYnN0IHZvbgorCUJlZGV1dHVuZy4KKworQkVJU1BJRUxFOgorCUFiZnJhZ2UgZGVyIHp1Z2VsYXNzZW5lbiBHaWxkZW46CisJICBmaW5kX29iamVjdCgiL29iai9naWxkZW5tYXN0ZXIiKS0+UXVlcnlQcm9wKFBfVkFMSURfR1VJTERTKQorCURhcyBlcmdpYnQgenVtIEJlaXNwaWVsOgorICAgICAgICAgICh7ImFiZW50ZXVyZXIiLCJ6YXViZXJlciIsImtsZXJ1cyIsImthZW1wZmVyIn0pCisKK1NJRUhFIEFVQ0g6CisJUF9HVUlMRCwgL29iai9naWxkZW5tYXN0ZXIuYworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBXZWQgSmFuIDE0IDE5OjE3OjA2IDE5OTggYnkgUGF0cnluCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9WQUxVRSBiL2RvYy9wcm9wcy9QX1ZBTFVFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YjU5NjEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9WQUxVRQpAQCAtMCwwICsxLDI2IEBACitOQU1FOgorICAgIFBfVkFMVUUgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSIgICAgICAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9wcm9wZXJ0aWVzLmgKKworQkVTQ0hSRUlCVU5HOgorCisgICAgIC0gT2JqZWt0ZQorICAgICAgIFdlcnQgZGVzIE9iamVrdGVzIGluIEdvbGRtdWVuemVuLiBEaWVzZW4gV2VydCBlcmhhZWx0IG1hbiBiZWltCisgICAgICAgVmVya2F1Zi4gS2F1ZmVuIGtvc3RldCBlaW4gVmllbGZhY2hlcyBoaWVydm9uLgorCisgICAgIC0gU3BlaXNlbi9LbmVpcGVuCisgICAgICAgV2VydCBlaW5lciBQb3J0aW9uIGRlciBTcGVpc2UuCisgICAgICAgCitCRU1FUktVTkdFTjoKKyAgICAgSW4gdHJhZ2JhcmVuIFNwZWlzZW4gKGVyYmVuIHZvbiAvc3RkL2Zvb2QpIHNldHp0IG1hbiBtaXQgU2V0UHJvcAorICAgICBkZW4gV2VydCBfZWluZXJfIFBvcnRpb24uIFBlciBRdWVyeVByb3AgZXJoYWVsdCBtYW4gYWJlciBkZW4gR2VzYW10LQorICAgICB3ZXJ0IGRlciBTcGVpc2UgaW5jbHVzaXZlIGRlcyBldmVudHVlbGwgdm9yaGFuZGVuZW4gQmVoYWVsdGVycy4gRGVyCisgICAgIFdlcnQgZGVzIEJlaGFlbHRlcnMgd2lyZCBkYWJlaSBhdXMgUF9FTVBUWV9QUk9QU1tQX1ZBTFVFXSBnZWxlc2VuLgorICAgICAKK1NJRUhFIEFVQ0g6CisgICAgIFNwZWlzZW46IHN0ZC9wdWIsIHdpei9mb29kLCBQX0VNUFRZX1BST1BTCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogVGh1IE9jdCAyOCAxMjoxNTowMCAyMDEwIGJ5IENhbGRyYQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1ZBTFVFX1BFUl9VTklUIGIvZG9jL3Byb3BzL1BfVkFMVUVfUEVSX1VOSVQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE3NzljNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1ZBTFVFX1BFUl9VTklUCkBAIC0wLDAgKzEsMTQgQEAKK05BTUU6CisgICAgUF9WQUxVRV9QRVJfVU5JVCAgICAgICAgICAgICAgInZhbHVlX3Blcl91bml0IiAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3Byb3BlcnRpZXMuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIFdlcnQgaW4gR29sZHN0dWVja2VuIHBybyBVbnRlcmVpbmhlaXQuCisKK0JFTUVSS1VOR0VOOgorICAgICBEZXByZWNhdGVkLiBCaXR0ZSBTZXRDb2luc1BlclVuaXRzKCkgKFVfQ1BVKSBiZW51dHplbi4KKworMjUuQXVnIDIwMTUgR2xvaW5zb24KKwpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfVkFSSUFCTEVTIGIvZG9jL3Byb3BzL1BfVkFSSUFCTEVTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlN2ZiNWMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9WQVJJQUJMRVMKQEAgLTAsMCArMSwxNiBAQAorCitOQU1FOgorICAgIFBfVkFSSUFCTEVTICJ2YXJpYWJsZXMiICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvbWFnaWVyLmgKKworQkVTQ0hSRUlCVU5HOgorCQorICAgICBJbnRlcm5lIFZhcmlhYmxlIGRlciBNYWdpZXJzaGVsbCBpbiBkZW0gZGllIG1pdCBkZW0gJ1NldCctQmVmZWhsCisgICAgIGdlc2V0enRlbiBWYXJpYWJsZW4gZ2VzcGVpY2hlcnQgd2VyZGVuLgorICAgICAKKyAgICAgTklDSFQgVk9OIEhBTkQgVkVSQUVOREVSTiEgSU1NRVIgJ1NFVCcgVkVSV0VOREVOIQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMZXR6dGUgQWVuZGVydW5nOiAxMy4wMi4yMDAzIDIyOjAwOjAwIHZvbiBNYW5kcmFnb24KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1ZJU0lCTEVfR1VJTEQgYi9kb2MvcHJvcHMvUF9WSVNJQkxFX0dVSUxECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMjY3YjUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9WSVNJQkxFX0dVSUxECkBAIC0wLDAgKzEsMjUgQEAKK1BfVklTSUJMRV9HVUlMRAorTkFNRToKKyAgICAgUF9WSVNJQkxFX0dVSUxECQkJInZpc2libGVfZ3VpbGQiICAgICAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgICAvc3lzL3Byb3BlcnRpZXMuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIERpZXNlIFByb3BlcnR5IGVudGhhZWx0IGRpZSBzaWNodGJhcmUgR2lsZGUgZGVzIExlYmV3ZXNlbnMgaW4gRm9ybSBlaW5lcworICAgICBrbGVpbmdlc2NocmllYmVuZW4gU3RyaW5ncywgYWxzbyBkaWUgR2lsZGUsIGRpZSBiZWkgU3BpZWxlcm4genVtCisgICAgIEJlaXNwaWVsIGJlaSAna3dlcicgb2RlciAnZmluZ2VyJyBhbmdlemVpZ3Qgd2lyZC4gU28ga2FubiBtYW4gZnJlbWRlCisgICAgIEdpbGRlbiB0ZXN0ZW4gdW5kIHRyb3R6ZGVtIG5hY2ggYXVzc2VuIGhpbiBpbiBkZXIgZ2xlaWNoZW4gR2lsZGUgd2llCisgICAgIHp1dm9yIGJsZWliZW4uCisKK0JFSVNQSUVMOgorICAgICBXZW5uIG1hbiBnZXJuZSBuYWNoIGF1c3NlbiBoaW4gWmF1YmVyZXIgYmxlaWJlbiBtb2VjaHRlOgorCSAgcGwtPlNldFByb3AoUF9WSVNJQkxFX0dVSUxELCJ6YXViZXJlciIpOworICAgICBOYWNoIGF1c3NlbiBoaW4gYmxlaWJ0IG1hbiBqZXR6dCBhdWNoIFphdWJlcmVyLCB3ZW5uIFBfR1VJTEQgZWluZQorICAgICBhbmRlcmUgR2lsZGUgYW5naWJ0LgorCitTSUVIRSBBVUNIOgorICAgICBQX0dVSUxELCBQX0RFRkFVTFRfR1VJTEQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogV2VkIEphbiAxNCAxOToxNzowNiAxOTk4IGJ5IFBhdHJ5bgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfVklTSUJMRV9TVUJHVUlMRF9USVRMRSBiL2RvYy9wcm9wcy9QX1ZJU0lCTEVfU1VCR1VJTERfVElUTEUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM5OGYwMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1ZJU0lCTEVfU1VCR1VJTERfVElUTEUKQEAgLTAsMCArMSwyMSBAQAorUF9WSVNJQkxFX1NVQkdVSUxEX1RJVExFCitOQU1FOgorICAgICBQX1ZJU0lCTEVfU1VCR1VJTERfVElUTEUJCSJ2aXNpYmxlX3N1Ymd1aWxkX3RpdGxlIiAgICAgICAgICAgICAgICAgICAgICAgCitERUZJTklFUlQgSU46CisgICAgIC9zeXMvbmV3X3NraWxscy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGllc2UgUHJvcGVydHkgZGllbnQgZGF6dSwgYWxzIE1hZ2llciBlaW5lbiBadXNhdHp0aXRlbCBpbm5lcmhhbGIgZWluZXIKKyAgICAgR2lsZGUgdm9yenV0YWV1c2NoZW4sIG9obmUgZGVuIHRhdHNhZWNobGljaGVuIFBfU1VCR1VJTERfVElUTEUgenUKKyAgICAgYWVuZGVybi4KKworQkVNRVJLVU5HRU46CisgICAgIEluaGFsdCBkZXIgUHJvcGVydHkga2FubiAwIHNlaW4gb2RlciBlaW4gU3RyaW5nLgorICAgICBXZW5uIGRlciBJbmhhbHQgMCBpc3QsIHdpcmQgYmVpIFF1ZXJ5UHJvcCBkZXIgUF9TVUJHVUlMRF9USVRMRQorICAgICBkdXJjaGdlcmVpY2h0LgorCitTSUVIRSBBVUNIOgorICAgICBQX0dVSUxEX1RJVExFLCBQX1NVQkdVSUxEX1RJVExFCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IE1vbiBBdWcgMTMgMjE6MjA6MDAgMjAwMSBieSBOYWNodHdpbmQKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1ZJU1VBTEJFTEwgYi9kb2MvcHJvcHMvUF9WSVNVQUxCRUxMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ZTg1MTkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9WSVNVQUxCRUxMCkBAIC0wLDAgKzEsMzcgQEAKK05BTUU6CisJUF9WSVNVQUxCRUxMCQkJInZpc3VhbGJlbGwiCisKK0RFRklOSUVSVCBJTjoKKwkvc3lzL3Byb3BlcnRpZXMuaAorCitCRVNDSFJFSUJVTkc6CisJRGllIFByb3BlcnR5IHN0ZWxsdCBlaW4gRmxhZyBpbm5lcmhhbGIgdm9uIFNwaWVsZXJuIGRhciwgd2VsY2hlcworCXN0YW5kYXJkbWFlc3NpZyBuaWNodCBnZXNldHp0IGlzdC4gSW4gZGllc2VtIEZhbGwgd2VyZGVuIFRvZW5lLAorCXdlbGNoZSBpbm5lcmhhbGIgZWluaWdlciBGdW5rdGlvbmVuIGVyemV1Z3Qgd2VyZGVuLCBhdWNoIHdpcmtsaWNoIGFuCisJZGVuIFNwaWVsZXIgZ2VzY2hpY2t0LgorCVNldHp0IG1hbiBkaWUgUHJvcGVydHksIHNvIGVyaGFlbHQgZGVyIFNwaWVsZXIga2VpbmUgVG9lbmUgbWVoci4KKworQkVJU1BJRUw6CisJUGllcHRvZW5lIHdlcmRlbiBkdXJjaCBkZW4gQVNDSUktQ29kZSAweDcgcHJhZXNlbnRpZXJ0LiBBdXNnZWJlbgorCWthbm4gbWFuIGRpZXNlbiBmb2xnZW5kZXJtYXNzZW46CisJICBpZighSVNfV0laQVJEKGNhc3RlcikmJiF2aWN0aW0tPlF1ZXJ5UHJvcChQX1ZJU1VBTEJFTEwpKQorCSAgICB0ZWxsX29iamVjdCh2aWN0aW0sc3ByaW50ZigiJWMiLDcpKTsKKwlEYXMgd2FlcmUgYmVpc3BpZWxzd2Vpc2UgZWluIENvZGVzdHVlY2sgYXVzIGVpbmVtIFBpZXBzcGVsbC4gOikKKwlEYXMgT3BmZXIgYmVrb21tdCBkZW4gUGllcHRvbiBoaWVyYmVpIG51ciBhYiwgd2VubiBkZXIgQ2FzdGVyIGVpbgorCU1hZ2llciBpc3Qgb2RlciBkYXMgU3BpZWxlcm9wZmVyIGRpZSBQcm9wZXJ0eSBQX1ZJU1VBTEJFTEwgZ2VzZXR6dAorCWhhdCAoa2FubiBtaXQgS29tbWFuZG8gJ3Rvbicgdm9tIFNwaWVsZXIgYmVlaW5mbHVzc3Qgd2VyZGVuKS4KKworQkVNRVJLVU5HRU46CisgIEFjaHR1bmc6IFBfVklTVUFMQkVMTCBzdGVodCBhdWYgMSwgd2VubiBkZXIgU3BpZWxlciBfa2VpbmVfIFBpZXBzdG9lbmUKKwlob2VyZW4gd2lsbCEKKwlEaWUgRnVua3Rpb25hbGl0YWV0IGRpZXNlciBQcm9wZXJ0eSB3aXJrdCBudXIgc293ZWl0LCB3aWUgc2llIGF1Y2gKKwl2b24gdG9uZXJ6ZXVnZW5kZW4gQmVmZWhsZW4gc2VsYnN0IHVudGVyc3R1ZXR6dCB3aXJkLiBFcyBpc3QgZGFyYXVmCisJenUgYWNodGVuLCBkYXNzIFBfVklTVUFMQkVMTCB6dSBkaWVzZW0gWndlY2sgZ3J1bmRzYWV0emxpY2gKKwlhdXNnZXdlcnRldCB3aXJkISBFaW5lIEF1c25haG1lIHNlaSBoaWVyYmVpIHp1Z2VsYXNzZW46IE1hZ2llcgorCWtvZW5uZW4gU3BpZWxlcm4gZ3J1bmRzYWV0emxpY2ggVG9lbmUgenVzZW5kZW4uCisKK1NJRUhFIEFVQ0g6CisJdG9uLCB3ZWNrZSwgZXJ3YXJ0ZSwgUF9XQUlURk9SLCAvc3RkL3BsYXllci9iYXNlLmMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogMDcuMDIuMjAwNyBieSBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9WVUxORVJBQklMSVRZIGIvZG9jL3Byb3BzL1BfVlVMTkVSQUJJTElUWQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTFjNjc2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfVlVMTkVSQUJJTElUWQpAQCAtMCwwICsxLDM3IEBACitOQU1FOgorICAgICBQX1ZVTE5FUkFCSUxJVFkgICAgICAgICAgICAgICAidnVsbmVyYWJpbGl0eSIKKworREVGSU5JRVJUIElOOgorICAgICAvc3lzL2xpdmluZy9jb21iYXQuaAorCitXSUNIVElHOgorICAgICBESUVTRSBQUk9QRVJUWSBJU1QgVkVSQUxURVQhIEJJVFRFIFBfUkVTSVNUQU5DRV9TVFJFTkdUSFMKKyAgICAgVkVSV0VOREVOISBBVUNIIEZVTktUSU9OSUVSVCBTZXQoKSBOSUNIVCBXSUUgRVMgU09MTFRFLgorCitCRVNDSFJFSUJVTkc6CisgICAgIEhpZXJtaXQga29lbm5lbiBkaWUgRW1wZmluZGxpY2hrZWl0ZW4gZWluZXMgTGViZXdlc2VucyBkZWZpbmllcnQKKyAgICAgd2VyZGVuLiBFcyBrYW5uIGVpbiBBcnJheSBtaXQgU2NoYWRlbnNhcnRlbiBnZXNldHp0IHdlcmRlbiwgamVkZXIKKyAgICAgRWludHJhZyBlaW5lcyBTY2hhZGVucyB2ZXJkb3BwZWx0IGRpZSBFbXBmaW5kbGljaGtlaXQgZ2VnZW4KKyAgICAgZGllc2VuLgorCitCRU1FUktVTkdFTjoKKyAgICAgLSBQX1JFU0lTVEFOQ0VfU1RSRU5HVEhTIHNwaWVnZWx0IGRpZSBFaW50cmFlZ2UgaGllciB3aWVkZXIKKyAgICAgLSB1bSBnZW5hdWVyZSBXZXJ0ZSBhbnp1Z2ViZW4gZWluZW4gQWRkUmVzaXN0YW5jZU1vZGlmaWVyKCkgb2RlcgorICAgICAgIFBfUkVTSVNUQU5DRV9TVFJFTkdUSFMgYmVudXR6ZW4uCisgICAgIC0gUF9WVUxORVJBQklMSVRZIGthbm4gdW5kIHdpcmQgbmljaHQgYXVzIFBfUkVTSVNUQU5DRV9TVFJFTkdUSFMKKyAgICAgICB1cGdlZGF0ZXQKKworQkVJU1BJRUxFOgorICAgICAvLyBlaW4gTlBDIG1pdCB2ZXJkb3BwZWx0ZXIgRWlzZW1wZmluZGxpY2hrZWl0IHVuZAorICAgICAvLyB2ZXJ2aWVyZmFjaHRlciBXYXNzZXJlbXBmaW5kbGljaGtlaXQKKyAgICAgU2V0UHJvcChQX1ZVTE5FUkFCSUxJVFksICh7RFRfQ09MRCwgRFRfV0FURVIsIERUX1dBVEVSfSkpOworCitTSUVIRSBBVUNIOgorICAgICBzaW1wbGUgUmVzaXN0ZW56OglQX1JFU0lTVEFOQ0UKKyAgICAgSGF1cHRtYXBwaW5nOglQX1JFU0lTVEFOQ0VfU1RSRU5HVEhTCisgICAgIE1vZGlmaWthdG9yZW46CUFkZFJlc2lzdGFuY2VNb2RpZmllciwgUmVtb3ZlUmVzaXN0YW5jZU1vZGlmaWVyKCksCisJCQlQX1JFU0lTVEFOQ0VfTU9ESUZJRVIKKyAgICAgQmVyZWNobnVuZzoJQ2hlY2tSZXNpc3RhbmNlKCksIFVwZGF0ZVJlc2lzdGFuY2VTdHJlbmd0aHMoKQorICAgICBhbmRlcmVzOgkJYmFsYW5jZSwgL3N0ZC9hcm1vdXIvY29tYmF0LmMsIC9zdGQvbGl2aW5nL2NvbWJhdC5jCisKKzEuRGV6IDIwMDQsIEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9XQUlURk9SIGIvZG9jL3Byb3BzL1BfV0FJVEZPUgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGNmOGVlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfV0FJVEZPUgpAQCAtMCwwICsxLDE0IEBACitOQU1FOgorICAgICBQX1dBSVRGT1IgICAgICAgICAgICAgICAgICAgICAid2FpdGZvciIgICAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgICAvc3lzL3BsYXllci9iYXNlLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBEaWUgRXJ3YXJ0ZS1MaXN0ZS4gRWluIEFycmF5IG1pdCBkZW4gTmFtZW4gZGVyIEVyd2FydGV0ZW4uCisKK1NJRUhFIEFVQ0g6CisgICAgIGVyd2FydGUKKyAgICAgUF9XQUlURk9SX1JFQVNPTiwgUF9XQUlURk9SX0ZMQUdTCisKKzE2LiBGZWIgMjAwOCBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfV0FJVEZPUl9GTEFHUyBiL2RvYy9wcm9wcy9QX1dBSVRGT1JfRkxBR1MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEzN2RkMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1dBSVRGT1JfRkxBR1MKQEAgLTAsMCArMSwxNyBAQAorUF9XQUlURk9SX0ZMQUdTCitOQU1FOgorICAgICBQX1dBSVRGT1JfRkxBR1MgICAgICAgICAgICAgICAgICAid2FpdGZvcl9mbGFncyIgICAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgICAvc3lzL3BsYXllci9iYXNlLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBFaW4gSW50LiBCaXNoZXIgYmVrYW5udGUgRmxhZ3M6CisgICAgIAorICAgICAweDAxIC0gImVyd2FydGUgYXVzIgorCitTSUVIRSBBVUNIOgorICAgICBlcndhcnRlCisgICAgIFBfV0FJVEZPUiwgUF9XQUlURk9SX1JFQVNPTgorCisxNi4gRmViIDIwMDggR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1dBSVRGT1JfUkVBU09OIGIvZG9jL3Byb3BzL1BfV0FJVEZPUl9SRUFTT04KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE5YzgyMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1dBSVRGT1JfUkVBU09OCkBAIC0wLDAgKzEsMTggQEAKK1BfV0FJVEZPUl9SRUFTT04KK05BTUU6CisgICAgIFBfV0FJVEZPUl9SRUFTT04gICAgICAgICAgICAgICAgICAid2FpdGZvcl9yZWFzb24iICAgICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N5cy9wbGF5ZXIvYmFzZS5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRWluIE1hcHBpbmcgbWl0IGRlbiBFcndhcnRldGVuIGFscyBTY2hsdWVzc2VsIHVuZCBlaW5lbSBHcnVuZCBhbHMKKyAgICAgS2V5LCB6QjoKKyAgICAgCisgICAgIChbIlpvb2siOiJtdWggbXVoIl0pCisKK1NJRUhFIEFVQ0g6CisgICAgIGVyd2FydGUgKGVyd2FydGUgPHdlbj4gd2VnZW4gPHdhcz4pCisgICAgIFBfV0FJVEZPUiwgUF9XQUlURk9SX0ZMQUdTCisKKzE2LiBGZWIgMjAwOCBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfV0FOVFNfVE9fTEVBUk4gYi9kb2MvcHJvcHMvUF9XQU5UU19UT19MRUFSTgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTU1M2JkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfV0FOVFNfVE9fTEVBUk4KQEAgLTAsMCArMSwxMiBAQAorTkFNRToKKyAgICBQX1dBTlRTX1RPX0xFQVJOICAgICAgICAgICAgICAid2FudHNfdG9fbGVhcm4iICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcGxheWVyL2Jhc2UuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIEdlc2V0enQsIHdlbm4gZGVyIE1hZ2llciBkaWUgRmlsZW5hbWVuIHNlaGVuIHdpbGwuCisgICAgIChOdXIgZnVlciBNYWdpZXIpLiBXaXJkIGRpZXNlIFByb3BlcnR5IGF1ZiAwIGdlc2V0enQsIGdlaGVuIGF1Y2gKKyAgICAgZWluaWdlIGFuZGVyZSBEaW5nZSBuaWNodCBtZWhyIC0gdmVyZm9sZ2UgekIuIEVpZ2VudGxpY2ggc29sbHRlbgorICAgICBkYW5uIGF1Y2ggZGllIE1hZ2llcmJlZmVobGUgd2llICJnb3RvIiB1c3cgdW50ZXJidW5kZW4gd2VyZGVuIC0KKyAgICAgZGFzIGtvbW10IHZpZWxsZWljaHQgbm9jaC4KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1dBVEVSIGIvZG9jL3Byb3BzL1BfV0FURVIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJlNGZlNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1dBVEVSCkBAIC0wLDAgKzEsMTEwIEBACitOQU1FOgorICAgIFBfV0FURVIgICAgICAgICAgICAgICAgICAgICAgICJ3YXRlciIgICAgICAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9maXNoaW5nLmgKKworQkVTQ0hSRUlCVU5HOgorICAgIEVudGhhZWx0IGRlbiBHZXdhZXNzZXJ0eXAuIEthbm4gaW4gUmFldW1lbiwgQW5nZWxuIHVuZCBXYXNzZXJiZWhhZWx0ZXJuCisgICAgdmVyd2VuZGV0IHdlcmRlbi4gRGllIHZlcmZ1ZWdiYXJlbiBPcHRpb25lbiB1bmQgRnVua3Rpb25zd2Vpc2VuIHNpbmQgaW4gCisgICAgZGVuIG5hY2hmb2xnZW5kZW4gQWJzY2huaXR0ZW4gYXVmZ2VmdWVocnQuCisKKyAgICBSYXVtOgorICAgICoqKioqCisgICAgICBMZWd0IGRlbiBUeXAgZGVzIEdld2Flc3NlcnMgZmVzdCwgZGFzIGVzIGluIGRpZXNlbSBSYXVtIGdpYnQuIFZvbgorICAgICAgZGllc2VtIFR5cCBoYWVuZ3QgYWIsIHdlbGNoZSBBcnRlbiB2b24gRmlzY2hlbiBlcyBoaWVyIHN0YW5kYXJkbWFlc3NpZworICAgICAgZ2lidCB1bmQgd2VsY2hlIEFydGVuIHZvbiBBbmdlbG4gdmVyd2VuZGV0IHdlcmRlbiBrb2VubmVuLiAKKyAgICAgIAorICAgICAgQmVpc3BpZWw6CisKKyAgICAgIFNldFByb3AoUF9XQVRFUiwgV19IQVJCT1IpOworICAgICAgCisgICAgICBGb2xnZW5kZQorICAgICAgVHlwZW4gc3RlaGVuIHp1ciBWZXJmdWVndW5nLCB2b24gZGVuZW4gaW4gUmFldW1lbiBudXIgZWluZXIgZ2VzZXR6dAorICAgICAgd2VyZGVuIGRhcmY6CisKKyAgICAgIFNhbHp3YXNzZXI6CisgICAgICAgIFdfQkVBQ0ggICBTdHJhbmQ6IFNjaG9sbGUsIEZsdW5kZXIsIFJvY2hlbiwgU2VlenVuZ2UsIEthdHplbmhhaQorICAgICAgICBXX0hBUkJPUiAgSGFmZW46IERvcnNjaCwgUm9jaGVuLCBTZWV6dW5nZSwgSGVyaW5nLCBLYXR6ZW5oYWkKKyAgICAgICAgV19PQ0VBTiAgIE96ZWFuL01lZXI6IEhhaSwgVGh1bmZpc2NoLCBLYWJlbGphdSwgU2Nod2VydGZpc2NoLCBTZWVoYXNlLAorICAgICAgICAgICAgICAgICAgU2VldGV1ZmVsLCBTZWV3b2xmCisKKyAgICAgIFN1ZXNzd2Fzc2VyOgorICAgICAgICBXX1JJVkVSICAgRmx1c3M6IFBpcmFuaGEsIExhY2hzLCBGb3JlbGxlLCBCYWNoc2FpYmxpbmcKKyAgICAgICAgV19QT09MICAgIFRlaWNoOiBTdGljaGxpbmcsIEdvbGRmaXNjaCwgU2NobGVpLCBLYXJwZmVuLCBHb2xkb3JmZQorICAgICAgICBXX0xBS0UgICAgU2VlOiBLYXJwZmVuLCBCYXJzY2gsIEhlY2h0LCBTZWVzYWlibGluZworICAgICAgICBXX1JPQ0sgICAgQmVyZ2JhY2g6IExhY2hzLCBGb3JlbGxlLCBCYWNoc2FpYmxpbmcKKyAgICAgICAgV19TVFJFQU0gIEJhY2g6IFN0aWNobGluZywgQmFjaGZvcmVsbGUsIE5ldWF1Z2UsIEJhY2hzYWlibGluZworCisgICAgICBTb25zdGlnZToKKyAgICAgICAgV19VU0VSICAgIHdlbm4gZGllc2VyIEdld2Flc3NlcnR5cCBnZXNldHp0IHdpcmQsIE1VU1MgZGVyIFJhdW0gCisgICAgICAgICAgICAgICAgICB6dXNhZXR6bGljaCBkaWUgRnVua3Rpb24gR2V0QXF1YXJpdW0oKSBkZWZpbmllcmVuLCBkaWUKKyAgICAgICAgICAgICAgICAgIGVpbmUgTGlzdGUgZGVyIGhpZXIgZmFuZ2JhcmVuIEZpc2NoZSB6dXJ1ZWNrZ2ViZW4gbXVzcy4KKyAgICAgICAgICAgICAgICAgIEJlaXNwaWVsOgorCisgICAgICAgICAgICAgICAgICBzdHJpbmcqIEdldEFxdWFyaXVtKCl7IAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHsiL2QvZWJlbmUvZnJhZ2dsZS9hbmdlbC9maXNjaCJ9KTsgCisgICAgICAgICAgICAgICAgICB9CisgICAgICAgIFdfREVBRCAgICBMZWJsb3NlcyBXYXNzZXIuIEVudGhhZWx0IGtlaW5lIEZpc2NoZSwgbWFuIGthbm4KKyAgICAgICAgICAgICAgICAgIGFiZXIgZGllIFN0YW5kYXJkZmxhc2NoZSBmdWVsbGVuLgorCisgICAgICAgIFdfT1RIRVIgICAxMDI0ICAgLy8gRmxhc2NoZSBlbnRoYWVsdCBGbHVlc3NpZ2tlaXQhPVdhc3NlcgorCisKKyAgICBBbmdlbDoKKyAgICAqKioqKioKKyAgICAgIEFuZ2VsbiBzaW5kIHVlYmxpY2hlcndlaXNlIGF1ZiBiZXN0aW1tdGUgQW53ZW5kdW5nc2JlcmVpY2hlIGF1c2dlbGVndC4KKyAgICAgIE9iIGVpbmUgQW5nZWwgaW4gZWluZW0gR2V3YWVzc2VyIGJlbnV0enQgd2VyZGVuIGthbm4sIGhhZW5ndCBkYXZvbiBhYiwKKyAgICAgIG9iIFBfV0FURVIgaW4gZGVyIEFuZ2VsIGRlbiBHZXdhZXNzZXJ0eXAgZGVzIFJhdW1lcyBlbnRoYWVsdC4gVm9uIGRlbgorICAgICAgb2JlbiBnZW5hbm50ZW4gVHlwZW4ga29lbm5lbiBtZWhyZXJlIHZlci1PREVSLXQgZ2VzZXR6dCB3ZXJkZW4uCisgICAgICBWZXJ3ZW5kdW5nIGVpbmVyIGZ1ZXIgZGFzIG9lcnRsaWNoZSBHZXdhZXNzZXIgdW5nZWVpZ25ldGVuIEFuZ2VsIGZ1ZWhydAorICAgICAgenUgZWluZXIgdW0gNjArcmFuZG9tKDYwKSBTZWt1bmRlbiB2ZXJsYWVuZ2VydGVuIFdhcnRlemVpdCBiZWltIEFuZ2Vsbi4KKyAgICAgIAorICAgICAgQmVpc3BpZWw6IFNldHp0IG1hbiBkZW4gR2V3YWVzc2VydHlwIG1pdCAKKworICAgICAgICBTZXRQcm9wKFBfV0FURVIsIFdfSEFSQk9SfFdfT0NFQU4pOworCisgICAgICBzY2hhbHRldCBkYXMgZGllIEFuZ2VsIHNvd29obCBmdWVyIEhhZWZlbiwgYWxzIGF1Y2ggZnVlciBvZmZlbmUgTWVlcmUKKyAgICAgIChPemVhbmUpIGZyZWkuCisKKyAgICAgIEZvbGdlbmRlIGtvbWJpbmllcnRlIEdld2Flc3NlcnR5cGVuIHNpbmQgZnVlciBlaW5mYWNoZSBBbmdlbG4gCisgICAgICB2b3JkZWZpbmllcnQ6CisKKyAgICAgIEt1cnplIFN0YW5kYXJkYW5nZWxuOgorICAgICAgICBXX1NIT1JUIFdfSEFSQk9SfFdfUklWRVJ8V19QT09MfFdfTEFLRXxXX1JPQ0t8V19VU0VSfFdfT0NFQU58V19TVFJFQU0KKyAgICAgIFNwZXppZWxsZSBTdHJhbmRydXRlbjoKKyAgICAgICAgV19MT05HICBXX0JFQUNIfFdfVVNFUgorICAgICAgZnVua3Rpb25pZXJ0IGluIGFsbGVuIFNhbHpnZXdhZXNzZXJuOgorICAgICAgICBXX1NBTFQgIFdfSEFSQk9SfFdfT0NFQU58V19CRUFDSAorICAgICAgZnVua3Rpb25pZXJ0IGluIGFsbGVuIFN1ZXNzZ2V3YWVzc2VybjoKKyAgICAgICAgV19TV0VFVCBXX1JJVkVSfFdfUE9PTHxXX0xBS0V8V19ST0NLfFdfU1RSRUFNCisKKyAgICAgIEhpbndlaXM6IFdfREVBRCBpc3QgaW4gZGllc2VuIEtvbWJpbmF0aW9uZW4gbmljaHQgZW50aGFsdGVuLCBkYSBlcworICAgICAgaW4gc29sY2hlbiBHZXdhZXNzZXJuIG9obmVoaW4ga2VpbmUgRmlzY2hlIGdpYnQuCisgICAgICBEaWUgS29tYmktVHlwZW4gZW50aGFsdGVuIFdfVVNFUiwgdW0gYmVpIGVudHNwcmVjaGVuZGVuIEdld2Flc3Nlcm4KKyAgICAgIHp1IHZlcm1laWRlbiwgZGFzcyBlcyBkb3J0IHN0YW5kYXJkbWFlc3NpZyBlaW5lbiBNYWx1cyBhdWYgZGllIAorICAgICAgV2FydGV6ZWl0IGdpYnQuIFN0YW5kYXJkd2VydCBmdWVyIFBfV0FURVIgaW4gQW5nZWxuIGlzdCBlYmVuZmFsbHMgCisgICAgICBXX1VTRVIuCisKKyAgICBLb2VkZXI6CisgICAgKioqKioqKgorICAgICAgQXVjaCBLb2VkZXIga29lbm5lbiBmdWVyIGRpZSBWZXJ3ZW5kdW5nIGluIGJlc3RpbW10ZW4gR2V3YWVzc2VybiBiZXNzZXIKKyAgICAgIGdlZWlnbmV0IHNlaW4gYWxzIGluIGFuZGVyZW4sIHouQi4gZWluZSBTZWVzY2huZWNrZSBmdWVyIFNhbHp3YXNzZXIsCisgICAgICBlaW4gTWVobHd1cm0gaGluZ2VnZW4gZnVlciBTdWVzc3dhc3Nlci4gR2VzZXR6dCB3aXJkIFBfV0FURVIgaGllcmZ1ZXIKKyAgICAgIGF1ZiBkaWUgb2JlbiBhdWZnZWZ1ZWhydGVuIFdlcnRlLgorICAgICAgVmVyd2VuZHVuZyBlaW5lcyB1bmdlZWlnbmV0ZW4gS29lZGVycyBmdWVocnQgenUgZWluZXIgdW0gNjArcmFuZG9tKDYwKQorICAgICAgU2VrdW5kZW4gbGFlbmdlcmVuIFdhcnRlemVpdCBiZWltIEFuZ2Vsbi4KKworICAgIFdhc3NlcmJlaGFlbHRlcjoKKyAgICAqKioqKioqKioqKioqKioqCisgICAgICBEaWUgUHJvcGVydHkgZ2lidCBhbiwgb2IgZGVyIEJlaGFlbHRlciBXYXNzZXIgZW50aGFlbHQgb2RlciBuaWNodC4KKyAgICAgIERlciBXZXJ0IHNvbGx0ZSBpbW1lciBhdWYgZGVuIFR5cCBqZW5lcyBHZXdhZXNzZXJzIGdlc2V0enQgc2VpbiwgYXVzCisgICAgICBkZW0gZGVyIEJlaGFlbHRlciBhdWZnZWZ1ZWxsdCB3dXJkZS4KKworU0lFSEUgQVVDSDoKKworICAgIFByb3BlcnRpZXM6IFBfRklTSAorICAgIE1ldGhvZGVuOiAgIEdldEFxdWFyaXVtKEwpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorWnVsZXR6dCBnZWFlbmRlcnQ6IDIwMTQtQXVnLTIxLCBBcmF0aG9ybgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfV0MgYi9kb2MvcHJvcHMvUF9XQwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDJkZTNkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfV0MKQEAgLTAsMCArMSwzNyBAQAorTkFNRToKKwlQX1dDCQkJCSJ3YyIKKworREVGSU5JRVJUIElOOgorCS9zeXMvd2VhcG9uLmgKKworQkVTQ0hSRUlCVU5HOgorCURpZSBXYWZmZW5rbGFzc2UgKGVuZ2w6IHdlYXBvbiBjbGFzcyksIGFsc28gZGllIFN0YWVya2UgZGVyIFdhZmZlLAorCXN0ZWxsdCBlaW5lbiBudW1lcmlzY2hlbiBXZXJ0IGRhciwgZGVyIHVtc28gZ3JvZXNzZXIgaXN0LCBkZXN0byBtZWhyCisJU2NoYWRlbiBlaW5lIFdhZmZlIGltIEthbXBmIGFucmljaHRldC4gQmVpbSBadWVja2VuIG9kZXIgV2Vnc3RlY2tlbgorCWVpbmVyIFdhZmZlIGR1cmNoIGVpbiBMZWJld2VzZW4gd2lyZCBpbm5lcmhhbGIgZGVzIExlYmV3ZXNlbnMgYXVjaAorCWRpZSBQcm9wZXJ0eSBQX1RPVEFMX1dDIGFrdHVhbGlzaWVydCwgd2VsY2hlIHNvbWl0IGltbWVyIGRpZQorCWFrdHVlbGxlIEFuZ3JpZmZzc3RhZXJrZSBlbnRoYWVsdC4gQmVpbSBadWVja2VuIGVyaGFlbHQgc2llIGhpZXJiZWkKKwlkaWUgV2FmZmVua2xhc3NlIGRlciBXYWZmZSB1bmQgYmVpbSBXZWdzdGVja2VuIGRpZSBBbmdyaWZmc3N0YWVya2UKKwlhdXMgZGVyIFByb3BlcnR5IFBfSEFORFMgKEthZW1wZmVuIG1pdCBibG9zc2VuIEhhZW5kZW4pLgorCURpZSBXYWZmZW5rbGFzc2Ugdm9uIGVpbmhhZW5kaWdlbiBXYWZmZW4gc29sbHRlIDE1MCBuaWNodAorCXVlYmVyc2NocmVpdGVuLCBkaWUgT2JlcmdyZW56ZSBmdWVyIHp3ZWloYWVuZGlnZSBXYWZmZW4gbGllZ3QgYmVpCisJMjAwLiBBdXNuYWhtZW4gdm9uIGRpZXNlciBSZWdlbCBiZWR1ZXJmZW4gZGVyIEFic3ByYWNoZSBtaXQgZGVtCisJRXJ6bWFnaWVyIGZ1ZXIgUnVlc3R1bmdlbiwgV2FmZmVuIHVuZCBNb25zdGVyIQorCU5lZ2F0aXZlIFdlcnRlIGJld2lya2VuIGtlaW5lbiBTY2hhZGVuLCBhbGxlcmRpbmdzIGF1Y2gga2VpbmUKKwlIZWlsdW5nLgorCitCRU1FUktVTkdFTjoKKwlRdWVyeS0gdW5kIFNldG1ldGhvZGVuIGF1ZiBQX1dDIHNvbGx0ZW4gdW5iZWRpbmd0IHZlcm1pZWRlbiB3ZXJkZW4uIFNpZQorCWZ1ZWhyZW4gaW4gZGVyIFJlZ2VsIHp1IG1hc3NpdmVuIElua29uc2lzdGVuemVuIGltIE1lY2hhbmlzbXVzIGRlciAKKwlSdWVzdHVuZ3NiZXNjaGFlZGlndW5nIHVuZCAtcmVwYXJhdHVyLgorCUF1Y2ggbWl0IGVpbmVyIEhpdEZ1bmMoKSBkdWVyZmVuIGRpZSBPYmVyZ3JlbnplbiBuaWNodCBvaG5lCisJQWJzcHJhY2hlIHVlYmVyc2Nocml0dGVuIHdlcmRlbiEgQXVzc2VyZGVtIGlzdCBlcyByYXRzYW0sIGRpZQorCXp1c2FldHpsaWNoZW4gS2FtcGZlaWdlbnNjaGFmdGVuIGluIFBfRUZGRUNUSVZFX1dDIGdlc29uZGVydAorCWFuenVnZWJlbi4KKworU0lFSEUgQVVDSDoKKwkvc3RkL3dlYXBvbi5jLCAvc3RkL3dlYXBvbi9jb21iYXQuYworCVBfREFNQUdFRCwgUF9FRkZFQ1RJVkVfV0MsIFBfV0VBUE9OX1RZUEUKKwlEYW1hZ2UoKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMDIuMTAuMjAwNywgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfV0VBUE9OIGIvZG9jL3Byb3BzL1BfV0VBUE9OCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMTg1NGMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9XRUFQT04KQEAgLTAsMCArMSwxNyBAQAorUF9XRUFQT04KKworTkFNRToKKyAgICAgUF9XRUFQT04gICAgICAgICAgICAgICAgICAgICAgIndlYXBvbiIKKworREVGSU5JRVJUIElOOgorICAgICAvc3lzL3Byb3BlcnRpZXMuaAorCitCRVNDSFJFSUJVTkc6CisgICAgICBNb21lbnRhbiBnZXp1ZWNrdGUgV2FmZmUuIEltIExpdmluZyBnZXNldHp0LgorCitTSUVIRSBBVUNIOgorICAgICAgVmVyd2FuZHQ6CQlQX0FSTU9VUlMKKyAgICAgIFdhZmZlbjoJCVBfV0MsIFBfV0VBUE9OX1RZUEUsIFBfREFNX1RZUEUsIFBfTlJfSEFORFMsIFBfUEFSUlkKKyAgICAgIFNvbnN0aWdlczoJUF9VTldJRUxEX1RJTUUsIFBfRVFVSVBfVElNRSwgUF9MQVNUX1VTRQorCisxMC5GZWIgMjAwNSBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfV0VBUE9OX1RFQUNIRVIgYi9kb2MvcHJvcHMvUF9XRUFQT05fVEVBQ0hFUgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTNjZmU3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfV0VBUE9OX1RFQUNIRVIKQEAgLTAsMCArMSwyMCBAQAorUF9XRUFQT05fVEVBQ0hFUiAgICJ3ZWFwb25fdGVhY2hlciIKKy0tLS0tLS0tLS0tLS0tLS0KKworREVGSU5JRVJUIElOOgorLS0tLS0tLS0tLS0tLQorCitjb21iYXQuaAorCitCRVNDSFJFSUJVTkcKKy0tLS0tLS0tLS0tLQorCitEaWVzZSBQcm9wZXJ0eSB3aXJkIGluIGVpbmVtIEF6dWJpIGdlc2V0enQgKHp1ciBaZWl0IG51ciBmdWVyIGRpZSAKK0thZW1wZmVyLUdpbGRlKSwgZGVyIHNlbGJzdCB1ZWJlciBkaWUgYWxsZ2VtZWluZW4gV2FmZmVuc2tpbGxzCit2ZXJmdWVndC4KKworSW4gZGllc2UgUHJvcGVydHkgd2lyZCBkZXIgTmFtZSBlaW5lcyBLYWVtcGZlcmdpbGRlbi1BdXNiaWxkZXJzCitlaW5nZXRyYWdlbi4KKworVW50ZXIgQW5sZWl0dW5nIGRlcyBBdXNiaWxkZXJzIGxlcm50IGRlciBBenViaSBkYW5uIGV0d2FzIHNjaG5lbGxlcgorZGllIGFsbGdlbWVpbmVuIFdhZmZlbnNraWxscy4KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1dFQVBPTl9UWVBFIGIvZG9jL3Byb3BzL1BfV0VBUE9OX1RZUEUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZmM2MwYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1dFQVBPTl9UWVBFCkBAIC0wLDAgKzEsMzEgQEAKK1BfV0VBUE9OX1RZUEUKKworTkFNRToKKyAgICAgUF9XRUFQT05fVFlQRSAid2VhcG9uX3R5cGUiCisKK0RFRklOSUVSVCBJTjoKKyAgICAgPHdlYXBvbi5oPgorCitCRVNDSFJFSUJVTkc6CisgICAgIFVtIHdhcyBmdWVyIGVpbmUgV2FmZmUgaGFuZGVsdCBlcyBzaWNoPyBFcyBzdGVoZW4gdmVyc2NoaWVkZW5lCisgICAgIFR5cGVuIHp1ciBBdXN3YWhsLiBNYW4gc29sbHRlIGhpZXIgbnVyIGRpZSBpbiA8Y29tYmF0Lmg+IGRlZmluaWVydGVuCisgICAgIEtvbnN0YW50ZW4gdmVyd2VuZGVuOgorCisgICAgICAgIFdUX0FNTVUgICAgICAgICAgIE11bml0aW9uIGZ1ZXIgRmVybmthbXBmd2FmZmVuCisgICAgICAgIFdUX0FYRSAgICAgICAgICAgIEF4dAorICAgICAgICBXVF9DTFVCICAgICAgICAgICBLZXVsZQorICAgICAgICBXVF9IQU5EUyAgICAgICAgICBibG9zc2UgSGFlbmRlCisgICAgICAgIFdUX0tOSUZFICAgICAgICAgIE1lc3NlciwgRG9sY2gKKyAgICAgICAgV1RfUkFOR0VEX1dFQVBPTiAgRmVybmthbXBmd2FmZmUKKyAgICAgICAgV1RfU1BFQVIgICAgICAgICAgU3BlZXIKKyAgICAgICAgV1RfU1RBRkYgICAgICAgICAgS2FtcGZzdGFiCisgICAgICAgIFdUX1NXT1JEICAgICAgICAgIFNjaHdlcnQKKyAgICAgICAgV1RfV0hJUCAgICAgICAgICAgUGVpdHNjaGUKKyAgICAgICAgV1RfTUlTQyAgICAgICAgICAgU29uc3RpZ2VzCisKKyAgICBEZXIgV2FmZmVudHlwIFdUX01JU0MgaXN0IHNjaG5vZWRlbSBUYW5kIHVuZCBudXR6bG9zZW0gS3JhbSB2b3JiZWhhbHRlbi4KKyAgICBXYWZmZW4gZGllc2VzIFR5cHMgZHVlcmZlbiBrZWluZSBQX1dDID4gMCBiZXNpdHplbiBvZGVyIGthbXBmcmVsZXZhbnRlCisgICAgQmVkZXV0dW5nIGhhYmVuLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMZXR6dGUgQWVuZGVydW5nOiAyNy4gTWFpIDIwMTUsIEFyYXRob3JuLgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfV0VBUl9GVU5DIGIvZG9jL3Byb3BzL1BfV0VBUl9GVU5DCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYzliY2MKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9XRUFSX0ZVTkMKQEAgLTAsMCArMSwyNCBAQAorUF9XRUFSX0ZVTkMKKworTkFNRToKKyAgICAgUF9XRUFSX0ZVTkMgIndlYXJfZnVuYyIKKworREVGSU5JRVJUIElOOgorICAgICA8YXJtb3VyLmg+CisKK0JFU0NIUkVJQlVORzoKKyAgICAgRmFsbHMgZWluIE9iamVrdCBlaW5lIFdlYXJGdW5jKCkgZnVlciBkaWUgUnVlc3R1bmcgLyBLbGVpZHVuZyBkZWZpbmllcnQsIAorICAgICBzbyBtdXNzIGRpZXNlcyBPYmpla3QgaW4gZGllc2VyIFByb3BlcnR5IGVpbmdldHJhZ2VuIHNlaW4uCisKKyAgICAgRGllIEF1c3dlcnR1bmcgZGllc2VyIFByb3BlcnR5IGVyZm9sZ3QgaW4gTGF1ZmUgZWluZXMgRG9XZWFyKCkgaW4gZGVyCisgICAgIG5pY2h0LW9lZmZlbnRsaWNoZW4gRnVua3Rpb24gX2NoZWNrX3dlYXJfcmVzdHJpY3Rpb25zKCkuLgorCitCRUlTUElFTEU6CisgICAgIFNpZWhlIGRhcyBCZWlzcGllbCB6dSBXZWFyRnVuYygpCisKK1NJRUhFIEFVQ0g6CisgICAgIGFybW91cnMsIGNsb3RoaW5nLCAvc3RkL2Nsb3RoaW5nL3dlYXIuYywgL3N0ZC9hcm1vdXIvd2Vhci5jCisgICAgIFdlYXJGdW5jKCksIEluZm9ybVdlYXIoKQorCitMRVRaVEUgQWVOREVSVU5HOgorMTUuMDIuMjAwOSwgWmVzc3RyYQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1dFQVJfTVNHIGIvZG9jL3Byb3BzL1BfV0VBUl9NU0cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE0MDdmYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1dFQVJfTVNHCkBAIC0wLDAgKzEsNjEgQEAKK1BfV0VBUl9NU0cKK05BTUU6CisgICAgUF9XRUFSX01TRyAgICAgICAgICAgICAgICAgICAgICAgIndlYXJfbXNnIiAgICAgICAgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL2FybW91ci5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgWndlaXRlaWxpZ2VzIEFycmF5IG1pdCBNZWxkdW5nZW4sIGRpZSBiZWltIEFuemllaGVuIGVpbmVyIFJ1ZXN0dW5nIG9kZXIKKyAgICAgS2xlaWR1bmcgYW4gZGVuIFNwaWVsZXIgdW5kIGRpZSBVbWdlYnVuZyBhdXNnZWdlYmVuIHdlcmRlbi4KKyAgICAgRGVyIGVyc3RlIEVpbnRyYWcgZ2VodCBhbiBkZW4gU3BpZWxlciwgZGVyIHp3ZWl0ZSBFaW50cmFnIGFuIGRpZQorICAgICBVbWdlYnVuZy4gWmVpbGVudW1icnVlY2hlIHdlcmRlbiBhdXRvbWF0aXNjaCBnZW1hY2h0LCBleGlzdGllcmVuZGUKKyAgICAgamVkb2NoIGJlcnVlY2tzaWNodGlndC4KKworICAgICBQbGF0emhhbHRlciBmdWVyIFNwaWVsZXIgaXN0IEBXRXh4eDEsIGZ1ZXIgZGllIFdhZmZlIEBXRXh4eDIgKHNpZWhlCisgICAgIG1hbiByZXBsYWNlX3BlcnNvbmFsKCkpLgorCisgICAgIFtXZWdlbiBBYndhZXJ0c2tvbXBhdGliaWxpdGFldCBpc3QgYXVjaCBub2NoIGRlciBQbGF0emhhbHRlciAlcworICAgICAgbW9lZ2xpY2gsIHdvYmVpIGluIGRlciBlaWdlbmVuIE1lbGR1bmcgJXMgZnVlciBkZW4gV2FmZmVubmFtZW4gc3RlaHQsCisgICAgICBpbiBkZXIgYW4gZGVuIFJhdW0gZGFzIGVyc3RlICVzIGZ1ZXIgZGVuIFNwaWVsZXJuYW1lbiwgZGFzIHp3ZWl0ZSBmdWVyCisgICAgICBkZW4gV2FmZmVubmFtZW4uXQorCitCRUlTUElFTEU6CisgICAgU2V0UHJvcChQX05BTUUsICJIZWxtIik7CisgICAgU2V0UHJvcChQX1dFQVJfTVNHLAorICAgICAoeyJEdSBzdHVlbHBzdCBkaWUgQFdFTjIgdWViZXIuIiwgCisgICAgICAgIkBXRVIxIHN0dWVscHQgc2ljaCBAV0VOVTIgdWViZXIuIn0pKTsKKworICAgIC0+IGJlaW0gQW56aWVoZSBkdXJjaCBVcms6CisgICAgICAgVXJrIGJla29tbXQ6IER1IHN0dWVscHN0IGRpciBkZW4gSGVsbSB1ZWJlci4KKyAgICAgICBEZXIgUmF1bTogICAgVXJrIHN0dWVscHQgc2ljaCBlaW5lbiBIZWxtIHVlYmVyLgorCisgICAgU2V0UHJvcChQX1dFQVJfTVNHLAorICAgICAoeyJBbHMgRHUgRGlyIGRlbiBsYW5nZW4gTWFudGVsIHVlYmVyemllaHN0LCBzdGVja3N0IER1IGVyc3RtYWwgIgorICAgICAgICJtaXQgRGVpbmVtIGRpY2tlbiBTY2hhZWRlbCBmZXN0LiBEb2NoIG5hY2ggZWluZW0ga3JhZWZ0aWdlbiAiCisgICAgICAgIlJ1Y2sgYmlzdCBEdSBlbmRsaWNoIGR1cmNoIHVuZCBzaWVoc3Qgd2llZGVyIGV0d2FzLiIsCisgICAgICAgIkBXRVIxIHppZWh0IHNpY2ggZWluZW4gbGFuZ2VuIE1hbnRlbCB1ZWJlciB1bmQgYmxlaWJ0ICIKKyAgICAgICAicHJvbXB0IG1pdCBkZW0gZGlja2VuIFNjaGFlZGVsIHN0ZWNrZW4uIERvY2ggbmFjaCBlaW5lbSAiCisgICAgICAgImtyYWVmdGlnZW4gUnVjayBrYW5uIEBXRVJRUDEgd2llZGVyIGV0d2FzIHNlaGVuIHVuZCBncmluc3QgRGljaCAiCisgICAgICAgInZlcmxlZ2VuIGFuLiJ9KSk7CisKKyAgICAtPiBiZWltIEFuemllaGVuIGR1cmNoIFVyazoKKyAgICAgICBVcmsgYmVrb21tdDogQWxzIER1IERpciBkZW4gbGFuZ2VuIE1hbnRlbCB1ZWJlcnppZWhzdCwgc3RlY2tzdCBEdQorCQkgICAgZXJzdG1hbCBtaXQgRGVpbmVtIGRpY2tlbiBTY2hhZWRlbCBmZXN0LiBEb2NoIG5hY2ggZWluZW0KKwkJICAgIGtyYWVmdGlnZW4gUnVjayBiaXN0IER1IGVuZGxpY2ggZHVyY2ggdW5kIHNpZWhzdCB3aWVkZXIKKwkJICAgIGV0d2FzLgorCisgICAgICAgRGVyIFJhdW06ICAgIFVyayB6aWVodCBzaWNoIGVpbmVuIGxhbmdlbiBNYW50ZWwgdWViZXIgdW5kIGJsZWlidAorCQkgICAgcHJvbXB0IG1pdCBkZW0gZGlja2VuIFNjaGFlZGVsIHN0ZWNrZW4uIERvY2ggbmFjaAorCQkgICAgZWluZW0ga3JhZWZ0aWdlbiBSdWNrIGthbm4gZXIgd2llZGVyIGV0d2FzIHNlaGVuIHVuZAorCQkgICAgZ3JpbnN0IERpY2ggdmVybGVnZW4gYW4uCisKK1NJRUhFIEFVQ0g6CisgICAgIEFlaG5saWNoZXM6IFBfVU5XRUFSX01TRywgUF9XSUVMRF9NU0csIFBfVU5XSUVMRF9NU0cKKyAgICAgICAgICAgICAgICAgUF9EUk9QX01TRywgUF9QVVRfTVNHLCBQX0dJVkVfTVNHLCBQX1BJQ0tfTVNHCisgICAgIEZ1bmt0aW9uZW46IFdlYXJGdW5jLCBVbndlYXJGdW5jLCBJbmZvcm1XZWFyKCkKKyAgICAgU29uc3RpZ2VzOiAgcmVwbGFjZV9wZXJzb25hbChFKSwgY2xvdGhpbmcsIC9zdGQvY2xvdGhpbmcvd2Vhci5jCisgICAgICAgICAgICAgICAgIGFybW91ciwgL3N0ZC9hcm1vdXIvd2Vhci5jCisKK0xFVFpURSBBZU5ERVJVTkc6CisxNS4wMi4yMDA5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfV0VJR0hUIGIvZG9jL3Byb3BzL1BfV0VJR0hUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYWY1ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9XRUlHSFQKQEAgLTAsMCArMSwyNiBAQAorTkFNRToKKyAgICBQX1dFSUdIVCAgICAgICAgICAgICAgICAgICAgICAid2VpZ2h0IiAgICAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvdGhpbmcvcmVzdHJpY3Rpb25zLmgKKworQkVTQ0hSRUlCVU5HOgorCisgICAgIC0gT2JqZWt0ZQorICAgICAgIERhcyBHZXdpY2h0IGVpbmVzIE9iamV0ZXMgaW4gR3JhbW0uCisKKyAgICAgLSBTcGVpc2VuCisgICAgICAgR2V3aWNodCBlaW5lciBQb3J0aW9uIGRlciBTcGVpc2UuCisgICAgICAgCitCRU1FUktVTkdFTjoKKyAgICAgSW4gdHJhZ2JhcmVuIFNwZWlzZW4gKGVyYmVuIHZvbiAvc3RkL2Zvb2QpIHNldHp0IG1hbiBtaXQgU2V0UHJvcAorICAgICBkYXMgR2V3aWNodCBfZWluZXJfIFBvcnRpb24uIFBlciBRdWVyeVByb3AgZXJoYWVsdCBtYW4gYWJlciBkYXMKKyAgICAgR2VzYW10Z2V3aWNodCBkZXIgU3BlaXNlIGluY2x1c2l2ZSBkZXMgZXZlbnR1ZWxsIHZvcmhhbmRlbmVuIEJlaGFlbHRlcnMuCisgICAgIERhcyBHZXdpY2h0IGRlcyBCZWhhZWx0ZXJzIHdpcmQgZGFiZWkgYXVzIFBfRU1QVFlfUFJPUFNbUF9XRUlHSFRdCisgICAgIGdlbGVzZW4uCisgICAgIAorU0lFSEUgQVVDSDoKKyAgICAgU3BlaXNlbjogd2l6L2Zvb2QsIFBfRU1QVFlfUFJPUFMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBUaHUgT2N0IDI4IDEyOjE1OjAwIDIwMTAgYnkgQ2FsZHJhClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfV0VJR0hUX1BFUkNFTlQgYi9kb2MvcHJvcHMvUF9XRUlHSFRfUEVSQ0VOVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmIxYWQzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfV0VJR0hUX1BFUkNFTlQKQEAgLTAsMCArMSwyNSBAQAorTkFNRToKKyAgICBQX1dFSUdIVF9QRVJDRU5UICAgICAgICAgICAgICAid2VpZ2h0X3BlcmNlbnQiICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcHJvcGVydGllcy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGllc2UgUHJvcGVydHkgZ2lidCBhbiwgd2lldmllbCBQcm96ZW50IGRlcyBHZXdpY2h0cyBkZXMgSW5oYWx0ZXMKKyAgICAgIm5hY2ggYXVzc2VuIiB3aWVkZXJnZWdlYmVuIHdlcmRlbi4KKworQkVNRVJLVU5HRU46CisgICAgIEFsbGUgV2VydGUgZGllIDwgNTAlIGxpZWdlbiBzb2xsdGVuIHNlaHIgZ3V0IGJlZ3J1ZW5kZXQgdW5kIG1pdCBWb3ItCisgICAgIHNpY2h0IHZlcndlbmRldCB3ZXJkZW4uIEhpZXIga29lbm50ZW4gZGFubiB6dW0gQmVpc3BpZWwgUF9NQVhfT0JKRUNUUworICAgICBhdWYgZWluZW4ga2xlaW5lbiBXZXJ0IGJlZ3Jlbnp0IHdlcmRlbi4KKworICAgICBDb250YWluZXIgZGllIGhpZXIgZWluZW4gV2VydCB1ZWJlciBkZW0gZGVzIFBvc3RwYWtldHMgaGFiZW4sIHNvbGx0ZW4KKyAgICAgYXVjaCBzY2h3ZXIgenUgZXJyZWljaGVuIHNlaW4uIEF1ZiBqZWRlbiBGYWxsIG1pdCBkZW0gUmVnaW9uc21hZ2llcgorICAgICBiZXNwcmVjaGVuIQorCitCRUlTUElFTEU6CisgICAgIFVtIHNpY2ggenUgb3JpZW50aWVyZW4ga2FubiBkYXMgUG9zdHBha2V0IHZvbiBMb2NvIGFscyBCZWlzcGllbCBoaW4tCisgICAgIHp1Z2V6b2dlbiB3ZXJkZW4gKC9wL3NlcnZpY2UvbG9jby9vYmovcGFyY2VsKS4KKworU0lFSEUgQVVDSDoKKyAgICAgUF9NQVhfT0JKRUNUUywgUF9NQVhfV0VJR0hULCBQX0xJR0hUX1RSQU5TUEFSRU5DWSwgY29udGFpbmVyCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9XRUlHSFRfUEVSX1VOSVQgYi9kb2MvcHJvcHMvUF9XRUlHSFRfUEVSX1VOSVQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc5NmI3YgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9QX1dFSUdIVF9QRVJfVU5JVApAQCAtMCwwICsxLDEzIEBACitOQU1FOgorICAgIFBfV0VJR0hUX1BFUl9VTklUICAgICAgICAgICAgICJ3ZWlnaHRfcGVyX3VuaXQiICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9wcm9wZXJ0aWVzLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBHZXdpY2h0IGluIEdyYW1tIHBybyBVbnRlcmVpbmhlaXQuCisKK0JFTUVSS1VOR0VOOgorICAgICBEZXByZWNhdGVkLiBCaXR0ZSBTZXRHcmFtc1BlclVuaXRzKCkgKFVfR1BVKSBiZW51dHplbi4KKworMjUuQXVnIDIwMTUgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1dJRUxERUQgYi9kb2MvcHJvcHMvUF9XSUVMREVECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZTg1ODAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9XSUVMREVECkBAIC0wLDAgKzEsMjEgQEAKK1BfV0lFTERFRAorCitOQU1FOgorICAgICBQX1dJRUxERUQgIndpZWxkZWQiCisKK0RFRklOSUVSVCBJTjoKKyAgICAgPHdlYXBvbi5oPgorCitCRVNDSFJFSUJVTkc6CisgICAgIElzdCBkaWVzZSBQcm9wZXJ0eSBnZXNldHp0LCBkYW5uIGlzdCBkaWUgV2FmZmUgZ2VyYWRlIGdlenVlY2t0LiBEZXIKKyAgICAgVHJhZWdlciBpc3QgaW4gZGVyIFByb3BlcnR5IHZlcm1lcmt0LgorCitCRU1FUktVTkdFTjoKKyAgICAgRGllc2UgUHJvcGVydHkgbGFlc3N0IHNpY2ggbnVyIGFiZnJhZ2VuIQorCitTSUVIRSBBVUNIOgorICAgICAvc3RkL3dlYXBvbi5jCisgICAgIFBfV0VBUE9OCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IDIwMTUtSnVsLTExLCBBcmF0aG9ybiAKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1dJRUxEX0ZVTkMgYi9kb2MvcHJvcHMvUF9XSUVMRF9GVU5DCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYzQ4MWIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9XSUVMRF9GVU5DCkBAIC0wLDAgKzEsMjIgQEAKK1BfV0lFTERfRlVOQworCitOQU1FOgorICAgICBQX1dJRUxEX0ZVTkMgIndpZWxkX2Z1bmMiCisKK0RFRklOSUVSVCBJTjoKKyAgICAgPHdlYXBvbi5oPgorCitCRVNDSFJFSUJVTkc6CisgICAgIEZhbGxzIGVpbiBPYmpla3QgZWluZSBXaWVsZEZ1bmMoKSBmdWVyIGRpZSBXYWZmZSBkZWZpbmllcnQsIHNvIG11c3MKKyAgICAgZGllc2VzIE9iamVrdCBpbiBkaWVzZXIgUHJvcGVydHkgZWluZ2V0cmFnZW4gd2VyZGVuLgorCisgICAgIERpZSBBdXN3ZXJ0dW5nIGRpZXNlciBQcm9wZXJ0eSBlcmZvbGd0IGluIHdpZWxkX21lKCkuCisKK0JFSVNQSUVMRToKKyAgICAgU2llaGUgZGFzIEJlaXNwaWVsIHp1IFdpZWxkRnVuYygpCisKK1NJRUhFIEFVQ0g6CisgICAgIC9zdGQvd2VhcG9uLmMsIFdpZWxkRnVuYygpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFN1biBNYXkgMTkgMTU6NDA6MDIgMTk5NiBieSBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1dJRUxEX01TRyBiL2RvYy9wcm9wcy9QX1dJRUxEX01TRwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTdhMzA0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfV0lFTERfTVNHCkBAIC0wLDAgKzEsNTcgQEAKK1BfV0lFTERfTVNHCitOQU1FOgorICAgICBQX1dJRUxEX01TRyAgICAgICAgICAgICAgICAgICAgICAgIndpZWxkX21zZyIgCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N5cy93ZWFwb24uaAorCitCRVNDSFJFSUJVTkc6CisKKyAgICAgWndlaXRlaWxpZ2VzIEFycmF5IG1pdCBNZWxkdW5nZW4sIGRpZSBiZWltIFp1ZWNrZW4gZWluZXIgV2FmZmUgYW4gZGVuCisgICAgIFNwaWVsZXIgdW5kIGRpZSBVbWdlYnVuZyBhdXNnZWdlYmVuIHdlcmRlbi4KKyAgICAgRGVyIGVyc3RlIEVpbnRyYWcgZ2VodCBhbiBkZW4gU3BpZWxlciwgZGVyIHp3ZWl0ZSBFaW50cmFnIGFuIGRpZQorICAgICBVbWdlYnVuZy4gIFplaWxlbnVtYnJ1ZWNoZSB3ZXJkZW4gYXV0b21hdGlzY2ggZ2VtYWNodCwgZXhpc3RpZXJlbmRlCisgICAgIGplZG9jaCBiZXJ1ZWNrc2ljaHRpZ3QuCisKKyAgICAgUGxhdHpoYWx0ZXIgZnVlciBTcGllbGVyIGlzdCBAV0V4eHgxLCBmdWVyIGRpZSBXYWZmZSBAV0V4eHgyIChzaWVoZQorICAgICBtYW4gcmVwbGFjZV9wZXJzb25hbCgpKS4KKworICAgICBbV2VnZW4gQWJ3YWVydHNrb21wYXRpYmlsaXRhZXQgaXN0IGF1Y2ggbm9jaCBkZXIgUGxhdHpoYWx0ZXIgJXMKKyAgICAgIG1vZWdsaWNoLCB3b2JlaSBpbiBkZXIgZWlnZW5lbiBNZWxkdW5nICVzIGZ1ZXIgZGVuIFdhZmZlbm5hbWVuIHN0ZWh0LAorICAgICAgaW4gZGVyIGFuIGRlbiBSYXVtIGRhcyBlcnN0ZSAlcyBmdWVyIGRlbiBTcGllbGVybmFtZW4sIGRhcyB6d2VpdGUgZnVlcgorICAgICAgZGVuIFdhZmZlbm5hbWVuLl0KKworQkVJU1BJRUxFOgorICAgIFNldFByb3AoUF9OQU1FLCAiU3RyZWl0a29sYmVuIik7CisgICAgU2V0UHJvcChQX1dJRUxEX01TRywKKyAgICAgKHsiRHUgenVlY2tzdCBAV0VOMiB1bmQgc3RvZXNzdCBlaW5lbiBtYXJrZXJzY2h1ZXR0ZXJuZGVuIFNjaHJlaSBhdXMuIiwgCisgICAgICAgIkBXRVIxIHp1ZWNrdCBAV0VOVTIgdW5kIHN0b2Vzc3QgZWluZW4gbWFya2Vyc2NodWV0dGVybmRlbiBTY2hyZWkgIgorICAgICAgICJhdXMuIiB9KSk7CisKKyAgICAtPiBiZWltIFp1ZWNrZW4gZHVyY2ggVXJrOgorICAgICAgIFVyayBiZWtvbW10OiBEdSB6dWVja3N0IGRlbiBTdHJlaXRrb2xiZW4gdW5kIHN0b2Vzc3QgZWluZW4KKwkJICAgIG1hcmtlcnNjaHVldHRlcm5kZW4gU2NocmVpIGF1cy4KKyAgICAgICBEZXIgUmF1bTogICAgVXJrIHp1ZWNrdCBlaW5lbiBTdHJlaXRrb2xiZW4gdW5kIHN0b2Vzc3QgZWluZW4KKwkJICAgIG1hcmtlcnNjaHVldHRlcm5kZW4gU2NocmVpIGF1cy4KKworICAgIFNldFByb3AoUF9XSUVMRF9NU0csCisgICAgICh7IkR1IHp1ZWNrc3QgZGVuIGtsb2JpZ2VuIFN0cmVpdGtvbGJlbiB1bmQgZnVjaHRlbHN0IGRhbWl0ICIKKyAgICAgICAid2lsZCB2b3IgRGVpbmVyIE5hc2UgaGVydW0uIiwKKyAgICAgICAiQFdFUjEgenVlY2t0IGVpbmVuIGtsb2JpZ2VuIFN0cmVpdGtvbGJlbiB1bmQgZnVjaHRlbHQgIgorICAgICAgICJkYW1pdCB3aWxkIHZvciBkZXIgZWlnZW5lbiBOYXNlIGhlcnVtLiBIb2ZmZW50bGljaCB2ZXJsZXR6dCAiCisgICAgICAgIkBXRVJRUDEgc2ljaCBkYWJlaSBuaWNodCAuLi4ifSkpOworCisgICAgLT4gYmVpbSBadWVja2VuIGR1cmNoIFVyazoKKyAgICAgICBVcmsgYmVrb21tdDogRHUgenVlY2tzdCBkZW4ga2xvYmlnZW4gU3RyZWl0a29sYmVuIHVuZCBmdWNodGVsc3QKKyAgICAgICAgICAgICAgICAgICAgZGFtaXQgd2lsZCB2b3IgRGVpbmVyIE5hc2UgaGVydW0uCisgICAgICAgRGVyIFJhdW06ICAgIFVyayB6dWVja3QgZWluZW4ga2xvYmlnZW4gU3RyZWl0a29sYmVuIHVuZCBmdWNodGVsdAorCQkgICAgZGFtaXQgd2lsZCB2b3IgZGVyIGVpZ2VuZW4gTmFzZSBoZXJ1bS4gSG9mZmVudGxpY2gKKyAgICAgICAgICAgICAgICAgICAgdmVybGV0enQgZXIgc2ljaCBkYWJlaSBuaWNodCAuLi4KKworU0lFSEUgQVVDSDoKKyAgICAgQWVobmxpY2hlczogUF9VTldJRUxEX01TRywgUF9XRUFSX01TRywgUF9VTldFQVJfTVNHCisgICAgICAgICAgICAgICAgIFBfRFJPUF9NU0csIFBfUFVUX01TRywgUF9HSVZFX01TRywgUF9QSUNLX01TRworICAgICBGdW5rdGlvbmVuOiBVbndpZWxkRnVuYywgV2llbGRGdW5jCisgICAgIFNvbnN0aWdlczogIHJlcGxhY2VfcGVyc29uYWwoRSksIC9zdGQvd2VhcG9uL2NvbWJhdC5jCisKKzI5LiBNYWVyeiAyMDA0IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9XSU1QWSBiL2RvYy9wcm9wcy9QX1dJTVBZCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NjMzZmEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9XSU1QWQpAQCAtMCwwICsxLDE1IEBACitOQU1FOgorICAgIFBfV0lNUFkgICAgICAgICAgICAgICAgICAgICAgICJ3aW1weSIgICAgICAgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9wcm9wZXJ0aWVzLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBOdW1lcmlzY2hlciBXZXJ0LiBEYXMgTGViZXdlc2VuIGZsaWVodCwgd2VubiBkaWUgTGViZW5zcHVua3RlCisgICAgIHVudGVyIGRpZXNlbiBXZXJ0IHNpbmtlbi4KKworU0lFSEUgQVVDSDoKKyAgICAgUF9XSU1QWV9ESVJFQ1RJT04KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGV0enRlIEFlbmRlcnVuZzogTW9uIEZlYiAxMiAxNzo1MDo0NyAyMDAxIHZvbiBUaWxseQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfV0lNUFlfRElSRUNUSU9OIGIvZG9jL3Byb3BzL1BfV0lNUFlfRElSRUNUSU9OCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZDJmMDEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9XSU1QWV9ESVJFQ1RJT04KQEAgLTAsMCArMSwyMiBAQAorTkFNRToKKyAgICBQX1dJTVBZX0RJUkVDVElPTiAgICAgICAgICAgICAid2ltcHlfZGlyIiAgICAgICAgICAgICAgICAgICAKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcHJvcGVydGllcy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRmx1Y2h0cmljaHR1bmcgZWluZXMgU3BpZWxlcnMgb2RlciBOUENzCisKK0JFTUVSS1VOR0VOOgorICAgICBEaWUgRmx1Y2h0cmljaHR1bmcga2FubiBuaWNodCBudXIgZWluIEF1c2dhbmcgKHN1ZWRlbiwgb3N0ZW4sIC4uLikKKyAgICAgc2Vpbiwgc29uZGVybiBhdWNoIGVpbiBLb21tYW5kbywgd2VsY2hlcyBkZXIgU3BpZWxlciBiZWltIEFuc2NobGFnZW4KKyAgICAgYXVzZnVlaHJ0ICh6LmIuIDxrbGV0dGVyIHNlaWwgaG9jaD4gb2RlciA8cnVmZSBFbGVuZGVyIE1pc3QhPikuCisKKyAgICAgQXVzZ2VmdWVocnQgd2lyZCBkaWUgRmx1Y2h0cmljaHR1bmcgcGVyIGNvbW1hbmQoKSwgd2VubiBkaWUgTFAgZGVzIAorICAgICBMZWJld2VzZW5zIHVudGVyIGRpZSBtaXQgPHZvcnNpY2h0PiBhbmdlZ2ViZSBMUC1HcmVuemUgc2lua3QuCisKK1NJRUhFIEFVQ0g6CisgICAgIFBfV0lNUFkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGV0enRlIEFlbmRlcnVuZzogTW9uIEZlYiAxMiAxNzo0Njo0NyAyMDAxIHZvbiBUaWxseQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL1BfV0laX0RFQlVHIGIvZG9jL3Byb3BzL1BfV0laX0RFQlVHCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmN2FjMjEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9XSVpfREVCVUcKQEAgLTAsMCArMSwyMCBAQAorTkFNRToKKyAgICBQX1dJWl9ERUJVRyAgICAgICAgICAgICAgICAgICAgInN0ZF9wX3dpemRlYnVnIgorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9wbGF5ZXIvY29tbS5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgR2VzZXR6dCwgd2VubiBkZXIgTWFnaWVyIChvZGVyIGVpbiBUZXN0c3BpZWxlcikgRGVidWdtZWxkdW5nZW4gd2Focm5laG1lbgorICAgICBtb2VjaHRlLgorICAgICBEZWJ1Z21lbGR1bmdlbiBzaW5kIE5hY2hyaWNodGVuLCBkaWUgbWl0IGRlbSBUeXAgTVRfREVCVUcgYW4gUmVjZWl2ZU1zZygpCisgICAgIHVlYmVyZ2ViZW4gd2VyZGVuLgorICAgICAKKyAgICAgRGllIFdlcnRlIHZvbiBQX1dJWl9ERUJVRyBzaW5kIHp1ciBaZWl0IDAgb2RlciAxLCBkYXMga2FubiBzaWNoIGFiZXIKKyAgICAgamVkZXJ6ZWl0IGFlbmRlcm4uCisgICAgIE1hZ2llciBhZW5kZXJuIGRpZXNlIFByb3AgYml0dGUgdWViZXIgIm1zY2hhdSIuCisKK1NJRUhFIEFVQ0g6CisgICAgIG1zY2hhdQorICAgICBQX1dBTlRTX1RPX0xFQVJOCisKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1dPUk4gYi9kb2MvcHJvcHMvUF9XT1JOCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZmQwM2UKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9XT1JOCkBAIC0wLDAgKzEsNDAgQEAKK1BfV09STgorCitOQU1FOgorICAgICBQX1dPUk4gIndvcm4iCisKK0RFRklOSUVSVCBJTjoKKyAgICAgPGFybW91ci5oPgorCitCRVNDSFJFSUJVTkc6CisgICAgIE1pdHRlbHMgZGllc2VyIFByb3BlcnR5IGxhZXNzdCBzaWNoIGVybWl0dGVsbiwgb2IgZWluZSBSdWVzdHVuZyBiencuIAorICAgICBLbGVpZHVuZyBkZXJ6ZWl0IGdldHJhZ2VuIHdpcmQgdW5kIHdlbm4gamEsIHZvbiB3ZW0uCisKKyAgICAgRW50d2VkZXIgZW50aGFlbHQgZGllIFByb3BlcnR5IGRlbiBXZXJ0IDAsIG9kZXIgc2llIGVudGhhZWx0IGRlbgorICAgICBUcmFlZ2VyIGRlciBSdWVzdHVuZyAvIEtsZWlkdW5nIChhbHMgT2JqZWt0KS4KKworQkVNRVJLVU5HRU46CisgICAgIERpZXNlIFByb3BlcnR5IGxhZXNzdCBzaWNoIG51ciBhYmZyYWdlbiEKKworQkVJU1BJRUxFOgorICAgICBFaW5lIERlZmVuZEZ1bmMoKSBrb2VubnRlIGRlbSBUcmFlZ2VyIGRlciBSdWVzdHVuZyB3aWUgZm9sZ3QgZXR3YXMKKyAgICAgbWl0dGVpbGVuOgorCisgICAgIC8vIERpZSBSdWVzdHVuZyBnaWJ0IFNjaHV0eiBnZWdlbiBGZXVlcgorICAgICBpbnQgRGVmZW5kRnVuYyhzdHJpbmcgKmR0eXAsIG1peGVkIHNwZWxsLCBvYmplY3QgZW5lbXkpCisgICAgIHsKKyAgICAgICBpZiAobWVtYmVyKGR0eXAsIERUX0ZJUkUpICE9IC0xKSB7CisgICAgICAgICAvLyBQX1dPUk4gaXN0IGF1ZiBqZWRlbiBGYWxsIGdlc2V0enQsIGRhIHNvbnN0IGRpZQorICAgICAgICAgLy8gRGVmZW5kRnVuYyB1ZWJlcmhhdXB0IG5pY2h0IGF1ZmdlcnVmZW4gd3VlcmRlIQorICAgICAgICAgdGVsbF9vYmplY3QoUXVlcnlQcm9wKFBfV09STiksCisgICAgICAgICAgICJEaWUgRmxhbW1lbiB6dWVuZ2VsbiBudXIgbGVpY2h0IHVlYmVyIGRpZSBSdWVzdHVuZy5cbiIpOworICAgICAgICAgcmV0dXJuIDEwOworICAgICAgIH0KKyAgICAgICByZXR1cm4gMDsKKyAgICAgfQorCitTSUVIRSBBVUNIOgorICAgICBjbG90aGluZywgL3N0ZC9jbG90aGluZy5jLCBhcm1vdXIsIC9zdGQvYXJtb3VyLmMKKworTEVUWlRFIEFlTkRFUlVORzoKKzE1LjAyLjIwMDksIFplc3N0cmEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9YUCBiL2RvYy9wcm9wcy9QX1hQCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5N2VjNjUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9YUApAQCAtMCwwICsxLDU5IEBACitOQU1FOgorICAgICBQX1hQICAgICAgICAgICAgICAgICAgICAieHAiCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3N5cy9saXZpbmcvbGlmZS5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGllc2UgUHJvcGVydHkgZW50aGFlbHQgZGllIEFuemFobCBkZXIgRXJmYWhydW5nc3B1bmt0ZSwgZGllIGVpbgorICAgICBMZWJld2VzZW4gZXJyZWljaHQgaGF0LiBEaWVzIGdlc2NoaWVodCBpbnNiZXNvbmRlcmUgZHVyY2gKKyAgICAgS2FtcGZoYW5kbHVuZ2VuLCB3b2JlaSBlcyBzb3dvaGwgZnVlciBFaW56ZWxzY2hsYWVnZSBhbHMgYXVjaCBmdWVyCisgICAgIGRhcyBUb2V0ZW4gZWluZXMgT3BmZXJzIFB1bmt0ZSBnaWJ0LgorCisgICAgIEJlaSBlaW56ZWxuZW4gU2NobGFlZ2VuIGlzdCBkaWUgVmVyZ2FiZSB2b24gRXJmYWhydW5nc3B1bmt0ZW4gZGF2b24KKyAgICAgYWJoYWVuZ2lnLCB3aWUgc3RhcmsgbWFuIGRhcyBPcGZlciBnZXRyb2ZmZW4gaGF0LCB1bmQgd2VsY2hlCisgICAgIEdlc2FtdHdhZmZlbmtsYXNzZSBlcyBoYXQgKGRhbWFnZSpQX1RPVEFMX1dDLzEwKS4KKworICAgICBCZWltIFRvZGVzc2NobGFnIGVyaGFlbHQgbWFuIHp1c2FldHpsaWNoIGRpZSBFcmZhaHJ1bmdzcHVua3RlIGRlcworICAgICBPcGZlcnMgZ2V0ZWlsdCBkdXJjaCAxMDAgKFBfWFAvMTAwKS4gRGllc2VyIFdlcnQgd2lyZCBhbGxlcmRpbmdzCisgICAgIGdlZ2ViZW5lbmZhbGxzIGF1ZiBlaW4gVGVhbSBhdWZnZXRlaWx0LCBzb2Zlcm4gZGVyIEFuZ3JlaWZlciBzaWNoIGluCisgICAgIGVpbmVtIHNvbGNoaWdlbiBiZWZpbmRldC4KKworQkVJU1BJRUw6CisgICAgIE5QQydzIGdpYnQgbWFuIGltIGFsbGdlbWVpbmVuIGVpbmVuIGxldmVsYWJoYWVuZ2lnZW4gU29ja2Vsd2VydCBhbgorICAgICBFcmZhaHJ1bmdzcHVua3RlbiBtaXQsIGRhIHNpZSBuaWNodCBhbGx6dW9mdCBzZWxic3QgR2VnbmVyIHRvZXRlbgorICAgICB1bmQgc29taXQga2F1bSBkaWUgTW9lZ2xpY2hrZWl0IGhhYmVuLCBkaWVzZSBQdW5rdGUgc2VsYnN0CisgICAgIGFuenVzYW1tZWxuLiBUcm90emRlbSBzb2xsZW4gc2llIGphIGRlbSBTcGllbGVyIGVpbmUgZ2V3aXNzZSBBbnphaGwKKyAgICAgYW4gRXJmYWhydW5nc3B1bmt0ZW4gbGllZmVybiwgd2VubiBzaWUgZ2V0b2V0ZXQgd2VyZGVuOgorCisgICAgICAgaW5jbHVkZSAiL3N5cy9saXZpbmcvbGlmZS5oIgorICAgICAgIGluaGVyaXQgInN0ZC9ucGMiOworICAgICAgIHZvaWQgY3JlYXRlKCkgeworICAgICAgICAgLi4uCisgICAgICAgICBTZXRQcm9wKFBfWFAsMjUwMDAwMDApOworICAgICAgIH0KKworICAgICBCZWltIFRvZXRlbiBnaWJ0IGVzIG51biAyNS4wMDAuMDAwLzEwMCA9IDI1MC4wMDAgRXJmYWhydW5nc3B1bmt0ZS4KKyAgICAgRGFtaXQgd2lyZCBkZXIgTlBDIHNvZ2FyIGF1dG9tYXRpc2NoIGZ1ZXIgZGllIFZlcmdhYmUgdm9uCisgICAgIEVyc3RraWxsc3R1ZmVucHVua3RlbiB2b3JnZXNlaGVuLgorCisgICAgIERpZSBGdW5rdGlvbiBjcmVhdGVfZGVmYXVsdF9ucGMoKSBzZXR6dCBQX1hQIHVuZCBhbmRlcmUgRWlnZW5zY2hhZnRlbgorICAgICBhdWYgZ2VlaWduZXRlIFdlcnRlLgorCitCRU1FUktVTkdFTjoKKyAgICAgRGllIFZlcmdhYmUgdm9uIEVyc3RraWxsc3R1ZmVucHVua3RlbiBrYW5uIG1hbiB1ZWJlciBkaWUgUHJvcGVydHkKKyAgICAgUF9OT19TQ09SRSB1bnRlcmJpbmRlbiwgZGllIFZlcmdhYmUgdm9uIEVyZmFocnVuZ3NwdW5rdGVuIHVlYmVyCisgICAgIFBfTk9fWFAuIEF1dG9tYXRpc2NoIHdlcmRlbiBMZWJld2VzZW4gZnVlciBFcnN0a2lsbHN0dWZlbnB1bmt0ZQorICAgICB2b3JnZXNlaGVuLCBzb2Zlcm4gc2llIGVpbmUgZGVyIGZvbGdlbmRlbiBHcmVuemVuIHVlYmVyc2Nocml0dGVuCisgICAgIGhhYmVuOgorICAgICAgIFNDT1JFX0xPV19NQVJLOiAgMjAwMDAwICgxIFN0dWZlbnB1bmt0KQorICAgICAgIFNDT1JFX0hJR0hfTUFSSzogNjAwMDAwICgyIFN0dWZlbnB1bmt0ZSkKKyAgICAgRGVmaW5pZXJ0IHNpbmQgZGllIEtvbnN0YW50ZW4gaW4gIi9zZWN1cmUvc2NvcmVtYXN0ZXIuaCIuCisKK1NJRUhFIEFVQ0g6CisgICAgIEZ1bmt0aW9uZW46ICBBZGRFeHAoKSwgZG9fZGFtYWdlKCkKKyAgICAgVmVyd2FuZHQ6ICAgIFBfTk9fWFAsIFBfTEFTVF9YUAorICAgICBTb25zdGlnZXM6ICAgUF9OT19TQ09SRSwgY3JlYXRlX2RlZmF1bHRfbnBjKCkKKyAgICAgICAgICAgICAgICAgIFBfVE9UQUxfV0MKKworMTQuRmViIDIwMDcgR2xvaW5zb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvUF9YX0FUVFJfTU9EIGIvZG9jL3Byb3BzL1BfWF9BVFRSX01PRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmE4YmRhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfWF9BVFRSX01PRApAQCAtMCwwICsxLDQ2IEBACitOQU1FOgorICAgIFBfWF9BVFRSX01PRCAgICAgICAgICAgICAgICAgICJleHRlcm5fYXR0cmlidXRlc19tb2RpZmllciIKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvbGl2aW5nL2F0dHJpYnV0ZXMuaAorCitCRVNDSFJFSUJVTkc6CisgICAgTWFwcGluZywgZGFzIGRpZSBBdHRyaWJ1dGUgZGVzIFNwaWVsZXJzIHZlcmFlbmRlcnQsIGRlciBkYXMgT2JqZWt0IGJlaQorICAgIHNpY2ggaGF0LgorCisgICAgWnUgYmVhY2h0ZW46CisgICAgRGllc2UgUHJvcGVydHkgYml0dGUgX2F1c3NjaGxpZXNzbGljaF8gbWl0IFNldFByb3AgYWVuZGVybiwgd2VpbCBkYW1pdAorICAgIGdsZWljaHplaXRpZyBVcGRhdGVBdHRyaWJ1dGVzKCkgaW0gTGViZXdlc2VuIGF1ZmdlcnVmZW4gdW5kIGdnZi4gZGFzCisgICAgT2JqZWt0IGFscyBTdGF0bW9kaWZpemllcmVyIHJlZ2lzdHJpZXJ0IHdpcmQuCisKKyAgICBEaWVzZSBQcm9wZXJ0eSBpc3QgZnVlciBLcmFua2hlaXRlbiwgRmx1ZWNoZSBldGMuIGdlZGFjaHQuIEJlaQorICAgIFdhZmZlbi9SdWVzdHVuZ2VuLCBkaWUgZGllIEF0dHJpYnV0ZSBiZWVpbmZsdXNzZW4gc29sbGVuLCB2ZXJ3ZW5kZXQKKyAgICBtYW4gYmVzc2VyIFBfTV9BVFRSX01PRC4KKworICAgIFBfWF9BVFRSX01PRCB1bmQgUF9NX0FUVFJfTU9EIGR1ZXJmZW4gZWluZW4gZ2VtZWluc2FtZW4ga3VtdWxpZXJ0ZW4KKyAgICBwb3NpdGl2ZW4gR3Jlbnp3ZXJ0IG5pY2h0IHVlYmVyc2NocmVpdGVuLiBEaWVzZXIgR3Jlbnp3ZXJ0LAorICAgIENVTVVMQVRJVkVfQVRUUl9MSU1JVCwgaXN0IGluIC9zeXMvbGl2aW5nL2F0dHJpYnV0ZXMuaCBkZWZpbmllcnQuCisKK0JFTUVSS1VOR0VOOgorICAgIERpZSBNZXRob2RlIC9zdGQvdGhpbmcvcmVzdHJpY3Rpb25zOjpfc2V0X2V4dGVybl9hdHRyaWJ1dGVzX21vZGlmaWVyKCkKKyAgICBiZW5hY2hyaWNodGlndCB0cmFnZW5kZSBMaXZpbmdzIHVlYmVyIEFlbmRlcnVuZ2VuLgorICAgIEJpdHRlIGJlaW0gIkxvZXNjaGVuIiBkZXIgUHJvcCBuaWNodCBkZW4gV2VydCBkZXMgamV3LiBBdHRyaWJ1dGVzIGltCisgICAgdWViZXJnZWJlbmVuIE1hcHBpbmcgYWxzIDAgdWViZXJnZWJlbiwgc29uZGVybiBkYXMgS2V5L1dlcnRlLVBhYXIgZ2FuegorICAgIGVudGZlcm5lbiB1bmQgYnp3LiBlaW4gbGVlcmVzIE1hcHBpbmcgb2RlciAwIHVlYmVyZ2ViZW4uCisKK0JFSVNQSUVMOgorICAgIC8vIERlbSBMZWJld2VzZW4sIGRhcyBkYXMgT2JqZWt0IGJlaSBzaWNoIGhhdCwgd2lyZCAyIHZvbiBBX0lOVCBhYmdlem9nZW4KKyAgICBTZXRQcm9wKFBfWF9BVFRSX01PRCwoW0FfSU5UOi0yXSkpOworCisgICAgLy8gU3RhdHMgd2llZGVyaGVyc3RlbGxlbjoKKyAgICBTZXRQcm9wKFBfWF9BVFRSX01PRCwoW10pKTsKKworU0lFSEUgQVVDSDoKKyAgICBRdWVyeUF0dHJpYnV0ZSgpLCBRdWVyeVJlYWxBdHRyaWJ1dGUoKSwgUXVlcnlBdHRyaWJ1dGVPZmZzZXQoKSwKKyAgICBTZXRBdHRyaWJ1dGUoKSwgU2V0UmVhbEF0dHJpYnV0ZSgpLCBVcGRhdGVBdHRyaWJ1dGVzKCksCisgICAgU2V0VGltZWRBdHRyTW9kaWZpZXIoKSwgUXVlcnlUaW1lZEF0dHJNb2RpZmllcigpLAorICAgIERlbGV0ZVRpbWVkQXR0ck1vZGlmaWVyKCksCisgICAgUF9YX0hFQUxUSF9NT0QsIFBfTV9IRUFMVEhfTU9ELCBQX0FUVFJJQlVURVMsIFBfQVRUUklCVVRFU19PRkZTRVRTLAorICAgIFBfVElNRURfQVRUUl9NT0QsIFBfTV9BVFRSX01PRCwgUF9NX0FUVFJfTU9ELCAvc3RkL2xpdmluZy9hdHRyaWJ1dGVzLmMKKworMDIuMDIuMjAxNiwgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1hfSEVBTFRIX01PRCBiL2RvYy9wcm9wcy9QX1hfSEVBTFRIX01PRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzhkMmJmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1BfWF9IRUFMVEhfTU9ECkBAIC0wLDAgKzEsMzYgQEAKK05BTUU6CisgICAgUF9YX0hFQUxUSF9NT0QgICAgICAgICAgICAgICAgICAiZXh0ZXJuX2hlYWx0aF9tb2RpZmllciIKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvbGl2aW5nL2F0dHJpYnV0ZXMuaAorCitCRVNDSFJFSUJVTkc6CisgICAgTWFwcGluZywgbWl0IGRlbSBkaWUgbWF4aW1hbGVuIExlYmVuc3B1bmt0ZSB1bmQgTWFnaWVwdW5rdGUgZWluZXMKKyAgICBTcGllbGVycyB2ZXJhZW5kZXJ0IHdlcmRlbiwgZGVyIGRpZXNlcyBPYmpla3QgYmVpIHNpY2ggdHJhZWd0LgorCisgICAgWnUgYmVhY2h0ZW46IERpZXNlIFByb3BlcnR5IGJpdHRlIF9hdXNzY2hsaWVzc2xpY2hfIG1pdCBTZXRQcm9wCisgICAgYWVuZGVybiwgd2VpbCBkYW1pdCBnbGVpY2h6ZWl0aWcgVXBkYXRlQXR0cmlidXRlcygpIGltCisgICAgTGViZXdlc2VuIGF1ZmdlcnVmZW4gdW5kIGdnZi4gZGFzIE9iamVrdCBhbHMgU3RhdG1vZGlmaXppZXJlciAKKyAgICByZWdpc3RyaWVydCB3aXJkLgorCisgICAgQmVpIFJ1ZXN0dW5nZW4vV2FmZmVuLCBkaWUgZGllc2UgV2lya3VuZyBlbnRmYWx0ZW4gc29sbGVuLCB2ZXJ3ZW5kZXQKKyAgICBtYW4gYmVzc2VyIFBfTV9IRUFMVEhfTU9ELgorCitCRU1FUktVTkdFTjoKKyAgICBCaXR0ZSBiZWkgIkxvZXNjaGVuIiBkZXIgUHJvcCBuaWNodCBkZW4gV2VydCBkZXMgamV3LiBBdHRyaWJ1dGVzIGltIAorICAgIHVlYmVyZ2ViZW5lbiBNYXBwaW5nIGFscyAwIHVlYmVyZ2ViZW4sIHNvbmRlcm4gZGFzIEtleS9XZXJ0ZS1QYWFyIGdhbnogCisgICAgZW50ZmVybmVuIHVuZCBnZ2YuIGVpbiBsZWVyZXMgTWFwcGluZyBvZGVyIDAgdWViZXJnZWJlbi4KKworQkVJU1BJRUw6CisgICAgLy8gRGVtIFNwaWVsZXIsIGRlciBkYXMgT2JqZWt0IGJlaSBzaWNoIHRyYWVndCwgd2lyZCBQX01BWF9IUCB1bSA1CisgICAgLy8gZXJob2VodCB1bmQgUF9NQVhfU1AgdW0gNSBlcm5pZWRyaWd0LgorICAgIFNldFByb3AoUF9YX0hFQUxUSF9NT0QsKFtQX0hQOjUsUF9TUDotNV0pKTsKKyAgICAvLyBTdGF0cyB3aWVkZXJoZXJzdGVsbGVuOgorICAgIFNldFByb3AoUF9YX0hFQUxUSF9NT0QsKFtdKTsKKworU0lFSEUgQVVDSDoKKyAgICBQX01fSEVBTFRIX01PRCwgUF9YX0FUVFJfTU9ELCBQX01fQVRUUl9NT0QsIGJhbGFuY2UKKworTEVUWlRFIEFlTkRFUlVORzoKKyAgICBTYXQsIDA2LjAyLjE5OTksIDE0OjAwOjAwIHZvbiBQYXJhY2Vsc3VzCisKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9QX1pBUF9NU0cgYi9kb2MvcHJvcHMvUF9aQVBfTVNHCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYWJmZjQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvUF9aQVBfTVNHCkBAIC0wLDAgKzEsMjggQEAKK1BfWkFQX01TRworCitOQU1FOgorICAgICAgUF9aQVBfTVNHCQkJInphcF9tc2ciCisKK0RFRklOSUVSVCBJTjoKKyAgICAgIC9zeXMvcHJvcGVydGllcy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgIERpZSBQcm9wZXJ0eSBlbnRoYWVsdCBlaW4gZHJlaWVsZW1lbnRpZ2VzIEFycmF5IG1pdCBkZW4gZm9sZ2VuZGVuDQorICAgICAgRWludHJhZWdlbjoKKwkgIDEuKSBNZWxkdW5nLCBkaWUgZGVyIE1hZ2llciBiZWltIFphcHBlbiBiZWtvbW10LgorCSAgMi4pIE1lbGR1bmcsIGRpZSBkaWUgU3BpZWxlciBpbSBSYXVtIGJlaW0gWmFwcGVuIGJla29tbWVuLgorCSAgMy4pIE1lbGR1bmcsIGRpZSBkYXMgT3BmZXIgYmVpbSBaYXBwZW4gYmVrb21tdC4KKworICAgICAgTWl0IEBAd2VyQEAsIEBAd2Vzc2VuQEAsIC4uLiBrYW5uIGRlciBOYW1lIGRlcyBPcGZlcnMgdW5kIG1pdCBAQGljaEBADQorICAgICAgZGVyIE5hbWUgZGVzIE1hZ2llcnMgaW4gZGllIE1lbGR1bmcgZWluZ2V3b2JlbiB3ZXJkZW4uCisKKyAgICAgIERpZSBQcm9wZXJ0eSBpc3QgaW4gTWFnaWVybiBnZXNldHp0IHVuZCBnaWx0IG51ciBkb3J0LgorCitTSUVIRSBBVUNIOgorICAgICBUb2Q6CQlkaWUoTCkKKyAgICAgVG9kZXNtZWxkdW5nZW46CVBfS0lMTF9OQU1FLCBQX0tJTExfTVNHLCBQX0RJRV9NU0csIFBfTVVSREVSX01TRworCQkJUF9FTkVNWV9ERUFUSF9TRVFVRU5DRQorICAgICBTb25zdGlnZXM6CQlQX0NPUlBTRSwgUF9OT0NPUlBTRSwgL3Jvb20vZGVhdGgvZGVhdGhfcm9vbS5jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFdlZCBKYW4gMTQgMTk6MTc6MDYgMTk5OCBieSBQYXRyeW4KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9VX1JFUSBiL2RvYy9wcm9wcy9VX1JFUQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjM5NWRiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL1VfUkVRCkBAIC0wLDAgKzEsNjMgQEAKK05BTUU6CisgICAgVV9SRVEgICAgICAgICAgICAgICAgICAgICAgICAgInVfcmVxIgorCitERUZJTklFUlQgSU46CisgICAgL3N5cy91bml0LmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBEaWUgUHJvcCBrYW5uIGluIFVuaXRvYmpla3RlbiBnZXNldHp0IHdlcmRlbi4KKyAgICAgU2llIGdpYnQgZGllIEFuemFobCBkZXIgRWluaGVpdGVuIGFuLCBkaWUgYW4gZGVyIFVuaXQgbWFuaXB1bGllcnQgd2VyZGVuCisgICAgIHNvbGxlbiwgZmFsbHMgbWl0IHdlbmlnZXIgYWxzIFBfQU1PVU5UIHVtZ2VnZWdhbmdlbiB3ZXJkZW4gc29sbC4KKyAgICAgCisgICAgIERpZSBQcm9wIHdpcmQgYXV0b21hdGlzY2ggZ2VzZXR6dCwgd2VubiBpZCgpIGFuIGVpbmVtIFVuaXRvYmpla3QgZ2VydWZlbgorICAgICB3aXJkIHVuZCBkaWUgSUQgZ3J1bmRzYWV0emxpY2ggenV0cmVmZmVuZCBpc3QsIGRpZSBhdXMgZGVyIElEIGVybWl0dGVsdGUKKyAgICAgWmFobCBhYmVyIGtsZWluZXIgYWxzIFBfQU1PVU5UIGlzdC4KKyAgICAgU2llIGthbm4gYXVjaCBtYW51ZWxsIG1pdHRlbCBTZXRQcm9wKCkgKGFiZXIgbmljaHQgU2V0KCkpIGdlc2V0enQgd2VyZGVuLgorCisgICAgIFVfUkVRIHdpcmQgYmVpbSBCZXdlZ2VuIHVuZCBaZXJzdG9lcmVuLCBiZWkgRXJtaXR0bHVuZyB2b24gV2VydCB1bmQKKyAgICAgR2V3aWNodCBiZXJ1ZWNrc2ljaHRpZ3QuCisKKyAgICAgVV9SRVEgd2lyZCB2b20gVW5pdG9iamVrdCBhdXRvbWF0aXNjaCB3aWVkZXIgYXVmIFBfQU1PVU5UIGdlc2V0enQsIHdlbm4KKyAgICAgc2ljaCBxdWVyeV92ZXJiKCkgb2RlciBkZWJ1Z19pbmZvKERJTkZPX0VWQUxfTlVNQkVSKSB2ZXJhZW5kZXJ0IGhhYmVuLgorICAgICAoRElORk9fRVZBTF9OVU1CRVIgaXN0IGVpbmUgWmFobCwgZGllIHNpY2ggamVkZXNtYWwgZXJob2VodCwgd2VubiBkZXIKKyAgICAgIERyaXZlciBlaW5lIG5ldWUgQmVyZWNobnVuZy9BdXNmdWVocnVuZyBiZWdpbm50LiBEaWVzZSBOdW1tZXIgd2lyZCBmdWVyCisgICAgICBqZWRlbiB2b20gZHJpdmVyIGluaXRpaWVydGVuIEF1ZnJ1ZiB2b24gTFBDLUNvZGUgZXJob2VodCwgei5CLiBiZWkgamVkZW0KKyAgICAgIEtvbW1hbmRvLCBjYWxsX291dCwgaGVhcnRfYmVhdCBldGMuIERldGFpbHMgcy4gZGVidWdfaW5mbygpLikKKworICAgICBFYmVuc28gd2lyZCBVX1JFUSBiZWkgZGVyIFZlcmVpbmlndW5nIG1pdCBlaW5lbSBhbmRlcmVuIChnbGVpY2hlbikKKyAgICAgT2JqZWt0IGF1ZiBQX0FNT1VOVCBkZXMgdmVyZWluaWd0ZW4gT2JqZWt0ZXMgZ2VzZXR6dC4KKworCitCVUdTCisgICAgVmllbGUuIERpZXMgaXN0IGVpbiB1ZWJsZXIgSGFjay4gR2VodCBhYmVyIG5pY2h0IG9obmUuCisgICAgRGllc2UgUHJvcCB3YXIgZW5kbG9zIGxhbmcgZ2FyIG5pY2h0IGRva3VtZW50aWVydC4gSGllciBiZXNjaHJpZWJlbiBpc3QKKyAgICBkYXMgVmVyaGFsdGVuLCB3YXMgenVyIFplaXQgdm9ybGllZ3QuIERpZXMgbWFnIHVudGVyc2NoaWVkbGljaCB6dSBkZW0KKyAgICBpcmdlbmR3YW5uIGludGVuZGllcnRlbiBzZWluLgorCisKK0JFSVNQSUVMRQorICAgIG9iamVjdCBvID0gY2xvbmVfb2JqZWN0KCJ1bml0b2JqZWt0Iik7CisgICAgby0+U2V0UHJvcChQX0FNT1VOVCwgMTAwKTsgICAvLyBhYiBqZXR6dCBoYXQgbyAxMDAgRWluaGVpdGVuLgorICAgIG8tPm1vdmUobnBjLCBNX0dFVCk7ICAgICAgICAgLy8gb2IgbWl0IDEwMCBFaW5oZWl0ZW4gd2lyZCBiZXdlZ3QKKyAgICBvLT5TZXRQcm9wKFVfUkVRLCA1MCk7CisgICAgby0+bW92ZShhbmRlcmVybnBjLCBNX0dJVkUpOyAvLyA1MCBFaW5oZWl0ZW4gd2VyZGVuIGJld2VndCwgNTAgdmVyYmxlaWJlbgorICAgIChUZWNobmlzY2g6IGRhcyBPYmpla3Qgd2lyZCBhdWYgNTAgRWluaGVpdGVuIGdlYWVuZGVydCwgYmV3ZWd0IHVuZCBpbiBkZXIKKyAgICAgYWx0ZW4gVW1nZWJ1bmcgd2lyZCBlaW4gbmV1ZXMgT2JqZWt0IG1pdCA1MCBFaW5oZWl0ZW4gZXJ6ZXVndC4pCisKKyAgICBvLT5TZXRQcm9wKFVfUkVRLCA0Mik7CisgICAgby0+cmVtb3ZlKDEpOyAgICAgICAgICAgICAgIC8vIDQyIEVpbmhlaXRlbiB2b24gZGVuIDUwIHdlcmRlbiB6ZXJzdG9lcnQuCisgICAgKFRlY2huaXNjaDogUF9BTU9VTlQgd2lyZCBlaW5mYWNoIHVtIFVfUkVRIHJlZHV6aWVydC4pCisKKyAgICAjIGdpYiAxOCBtdWVuemVuIGFuIGJsdXBwCisgICAgSGllcmJlaSB3aXJkIG9iLT5pZCgiMTggbXVlbnplbiIpIGdlcnVmZW4sIHdhcyBVX1JFUSBpbSBHZWxkb2JqZWt0IGF1ZiAxOAorICAgIHNldHp0LiBCZWkgZGVyIEJld2VndW5nIGJla29tbXQgYmx1cHAgZGFoZXIgZGFzIE9iamVrdCBtaXQgUF9BTU9VTlQ9PTE4CisgICAgdW5kIGRlciBSZXN0IHdpcmQgaW0gQWJnZWJlbmRlbiBuZXUgZXJ6ZXVndC4KKyAgICAjIGdpYiBnZWxkIGFuIGZsdWJiZWwKKyAgICBEYXMgVV9SRVEgYXVzIGRlbSB2ZXJoZXJpZ2VuIEtvbW1hbmRvIGlzdCBqZXR6dCBuaWNodCBtZWhyIGd1ZWx0aWcuIFp3YXIKKyAgICBpc3QgZXMgZGFzIGdsZWljaGUgS29tbWFuZG92ZXJiLCBhYmVyIERJTkZPX0VWQUxfTlVNQkVSIGlzdCBqZXR6dAorICAgIGFuZGVycy4KKworCitaVUxFVFpUIEdFQWVOREVSVDoKKzE2LjAxLjIwMTUsIFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL2dpbGRlbnByb3BzLy5zeW5vbnltIGIvZG9jL3Byb3BzL2dpbGRlbnByb3BzLy5zeW5vbnltCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NjA3ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvZ2lsZGVucHJvcHMvLnN5bm9ueW0KQEAgLTAsMCArMSw5IEBACitLX0JSQVdMSU5HX0RUIGthZW1wZmVyYm9uaQorS19CUkFXTElOR19NU0cga2FlbXBmZXJib25pCitLX0JSQVdMSU5HX1dDIGthZW1wZmVyYm9uaQorS19DUklUSUNBTF9ISVQga2FlbXBmZXJib25pCitLX0RJU1RSQUNUSU5HX1dFQVBPTiBrYWVtcGZlcmJvbmkKK0tfS08ga2FlbXBmZXJib25pCitLX05PX0hPTklORyBrYWVtcGZlcmJvbmkKK0tfVEhST1dJTkdfV0VBUE9OIGthZW1wZmVyYm9uaQorS19XRUFQT05fU0hBVFRFUiBrYWVtcGZlcmJvbmkKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9naWxkZW5wcm9wcy9QX0dMT1ZFX0ZJTkdFUkxFU1MgYi9kb2MvcHJvcHMvZ2lsZGVucHJvcHMvUF9HTE9WRV9GSU5HRVJMRVNTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZmFlYzYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvZ2lsZGVucHJvcHMvUF9HTE9WRV9GSU5HRVJMRVNTCkBAIC0wLDAgKzEsMTYgQEAKK1BfR0xPVkVfRklOR0VSTEVTUworCitOQU1FOgorICAgICBQX0dMT1ZFX0ZJTkdFUkxFU1MgICAgICAgICAgICAgICAgICAgICAiZmluZ2VyZnJlaWVfaGFuZHNjaHVoZSIKKworREVGSU5JRVJUIElOOgorICAgICAvcC9rYXR6ZW5rcmllZ2VyL2trcmllZ2VyLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBTbyBnZWtlbm56ZWljaG5ldGUgSGFuZHNjaHVoZSBzaW5kIGZpbmdlcmxvcyB1bmQga29lbm5lbgorICAgICB3YWVocmVuZCAia3JhbGxlbnNjaGxhZyIgZ2V0cmFnZW4gd2VyZGVuLgorCitTSUVIRSBBVUNIOgorICAgICBWZXJ3YW5kdDoJUF9BUk1PVVJfVFlQRSwgQVRfR0xPVkUKKworMTAuT2t0IDIwMDYgR2xvaW5zb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvZ2lsZGVucHJvcHMvUF9aX0FVVE9TSElFTEQgYi9kb2MvcHJvcHMvZ2lsZGVucHJvcHMvUF9aX0FVVE9TSElFTEQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY5YjlhZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9naWxkZW5wcm9wcy9QX1pfQVVUT1NISUVMRApAQCAtMCwwICsxLDI2IEBACitQX1pfQVVUT1NISUVMRAorCitOQU1FOgorICAgICBQX1pfQVVUT1NISUVMRAkJCQkiel9hdXRvc2hpZWxkIgorCitERUZJTklFUlQgSU46CisgICAgIC9wL3phdWJlcmVyL3dpem5wYy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgTWl0IGRpZXNlciBQcm9wZXJ0eSAga2FubiBtYW4gZWluZW4gYXV0b21hdGlzY2hlbiAKKyAgICAgU2NodXR6emF1YmVyIGluIFphdWJlcmVyLU5QQ3MgZWluc3RlbGxlbiwgZGVzc2VuIAorICAgICBWb3JoYW5kZW5zZWluIGRhbm4gaW4gamVkZXIgS2FtcGZydW5kZSB1ZWJlcnBydWVmdAorICAgICB3aXJkLCB6LkIuICJzY2h1dHoiLCJzY2h1dHpodWVsbGUiLCJ6YXViZXJzY2hpbGQiLgorCitCRU1FUktVTkdFTjoKKyAgICAgInphdWJlcnNjaGlsZCIgaXN0IGVpbiBNYWdpc3RlcnNwcnVjaCB1bmQga2FubiBudXIgaW4gCisgICAgIGJlc3RpbW10ZW4gWmVpdGFic3RhZW5kZW4gYmVudXR6dCB3ZXJkZW4uIFdlciBhbHNvIGFscworICAgICBBdXRvc2hpZWxkIG51ciBaYXViZXJzY2hpbGQgYmVudXR6dCwgYmxvY2tpZXJ0IGRhbWl0CisgICAgIGFsbGUgYW5kZXJlbiBTcGVsbHMsIHNvbGFuZ2UgZGVyIE1hZ2lzdGVyc3BydWNoIG5pY2h0CisgICAgIGdlc3Byb2NoZW4gd2VyZGVuIGthbm4uCisgICAgIEFiaGlsZmU6IF9xdWVyeV9uZXh0X21hc3Rlcl9zcGVsbF90aW1lKCkgIHJldHVybiAwOyB9CisKK1NJRUhFIEFVQ0g6CisgICAgIC9wL3phdWJlcmVyL3RleHQvd2l6bnBjLmRva3UKKworMjEuT2t0IDIwMDYgQ2hhZ2FsbApkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL2dpbGRlbnByb3BzL1BfWl9JTkZPIGIvZG9jL3Byb3BzL2dpbGRlbnByb3BzL1BfWl9JTkZPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MmQzOGEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvZ2lsZGVucHJvcHMvUF9aX0lORk8KQEAgLTAsMCArMSw1MyBAQAorUF9aX0lORk8KKworTkFNRToKKyAgICAgUF9aX0lORk8JCQkJCQkiel9pbmZvIgorCitERUZJTklFUlQgSU46CisgICAgIC9wL3phdWJlcmVyL3dpem5wYy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgRGllc2UgUHJvcGVydHkgbXVzcyBnZXNldHp0IHdlcmRlbiwgd2VubiBtYW4gZGVuCisgICAgIFphdWJlcmVyZ2lsZGVuLVN0YW5kYXJkLU5QQyBudXR6dC4gU2llIHNldHp0IGRpZQorICAgICBHcnVuZGVpbnN0ZWxsdW5nZW4gZGVzIE5QQ3MgdW5kIGdlbmVyaWVydCBkYXMgCisgICAgIE5ld3NraWxscy1NYXBwaW5nLiAKKworICAgICBEaWUgUHJvcGVydHkgaXN0IHdpZSBmb2xndCBhdWZnZWJhdXQ6CisKKyAgICAgKiBNSU4gKG1pbmltYWxlIFNraWxsYWJpbGl0eSBpbSBCZXJlaWNoIHZvbiAwIC0gMTAwMDApCisgICAgICogTUFYIChtYXhpbWFsZSBTa2lsbGFiaWxpdHkgaW0gQmVyZWljaCB2b24gMCAtIDEwMDAwKQorICAgICAqIExFViAoR2lsZGVubGV2ZWwpCisgICAgICogWldFSUcgKEdpbGRlbnp3ZWlnKQorCisKK0JFTUVSS1VOR0VOOgorICAgICBGdWVyIGRpZSBBcmd1bWVudGUgTEVWIHVuZCBaV0VJRyBzdGVoZW4gZm9sZ2VuZGUgQXVzd2FobC0KKyAgICAgbW9lZ2xpY2hrZWl0ZW4genVyIFZlcmZ1ZWd1bmcuCisKKyAgICAgTEVWOgorICAgICAgICBaX0FORkFFTkdFUgkwCisJWl9MRUhSTElORwkxCisJWl9NRUlTVEVSCTIKKwlaX0VSWk1FSVNURVIJMworCisgICAgIFpXRUlHOgorICAgICAgICBaWldfQU5HUklGRgkJICAxCisJWlpXX0FCV0VIUgkJICAyCisJWlpXX0lMTFVTSU9OCQkgIDQKKwlaWldfQkVIRVJSU0NIVU5HCSAgOAorCVpaV19IRUxMU0lDSFQJCSAxNgorCVpaV19WRVJXQU5ETFVORwkJIDMyCisJWlpXX1NDSFdBUloJCSA2NAlJTkFLVElWCisJWlpXX1dFSVNTCQkxMjgKKwlaWldfQUxMRQkJNTExCisKK0JFSVNQSUVMOgorICAgICBTZXRQcm9wKFBfWl9JTkZPLCAoezkwMDAsIDk1MDAsIFpfRVJaTUVJU1RFUiwgWlpXX0FOR1JJRkZ8WlpXX0FCV0VIUn0pKTsKKyAgICAgZXJ6ZXVndCBlaW5lbiBFcnptYWdpc3Rlci1QQywgZGVyIGFsbGUgTGVocmxpbmdzLSBzb3dpZSBkaWUgTWFnaXN0ZXIgdW5kCisgICAgIEVyem1hZ2lzdGVyLVNwcnVlY2hlIEFuZ3JpZmYgdW5kIEFid2VociBtaXQgOTAtOTUlIGJlaGVycnNjaHQuCisKKworU0lFSEUgQVVDSDoKKyAgICAgL3AvemF1YmVyZXIvdGV4dC93aXpucGMuZG9rdQorCisyMS5Pa3QgMjAwNiBDaGFnYWxsCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvZ2lsZGVucHJvcHMvUF9aX05PX01BVEVSSUFMIGIvZG9jL3Byb3BzL2dpbGRlbnByb3BzL1BfWl9OT19NQVRFUklBTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjA0MGEwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL2dpbGRlbnByb3BzL1BfWl9OT19NQVRFUklBTApAQCAtMCwwICsxLDE4IEBACitQX1pfTk9fTUFURVJJQUwKKworTkFNRToKKyAgICAgUF9aX05PX01BVEVSSUFMICAgICAgICAgICAgICAgICAgICAgIm5wY19icmF1Y2h0X2tlaW5lX2ttcCIKKworREVGSU5JRVJUIElOOgorICAgICAvcC96YXViZXJlci96YXViZXJlci5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgU2V0enQgbWFuIGRpZXNlIFByb3BlcnR5IGluIGVpbmVtIE5QQywgc28gYmVub2V0aWd0IGVyIGZ1ZXIgZGllCisgICAgIFNwcnVlY2hlIGRlciBaYXViZXJlcmdpbGRlIGtlaW5lIEtvbXBvbmVudGVuLgorCitCRU1FUktVTkdFTjoKKyAgICAgTklFTUFMUyBkaWVzZSBQcm9wZXJ0eSBlaW5mYWNoIHNvIGluIGVpbmVtIFNwaWVsZXIgc2V0emVuLgorCitTSUVIRSBBVUNIOgorCisyMS5Pa3QgMjAwNiBDaGFnYWxsCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvZ2lsZGVucHJvcHMvUF9aX05PX05PQ09OTiBiL2RvYy9wcm9wcy9naWxkZW5wcm9wcy9QX1pfTk9fTk9DT05OCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMmRkMTQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvZ2lsZGVucHJvcHMvUF9aX05PX05PQ09OTgpAQCAtMCwwICsxLDIyIEBACitQX1pfTk9fTk9DT04KKworTkFNRToKKyAgICAgUF9aX05PX05PQ09OCQkJCQkibm9fbm9jb24iCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3AvemF1YmVyZXIvd2l6bnBjLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBEZXIgU3RhbmRhcmR6YXViZXJlcmdpbGRlbm5wYyBzZXR6dCBTSV9OT19DT05TRVFVRU5DRVMsIGRhbWl0CisgICAgIGRpZSBHaWxkZW5wY3MgbmljaHQgZGVuIG5lZ2F0aXZlbiBBdXN3aXJrdW5nZW4gYmVpbSBNaXNzbGluZ2VuCisgICAgIGRlciBTcHJ1ZWNoZSBnZXNjaHVldHp0IHNpbmQuIFNldHp0IG1hbiBkaWVzZSBQcm9wZXJ0eSB2b3IKKyAgICAgUF9aX0lORk8gYXVmIDAsIHdpcmQgZGFzIEZsYWcgbmljaHQgZ2VzZXR6dC4KKworCitCRU1FUktVTkdFTjoKKyAgICAgTXVzcyB2b3IgUF9aX0lORk8gZ2VzZXR6dCB3ZXJkZW4sIGRhbWl0IGVzIHdpcmtzYW0gaXN0LgorCitTSUVIRSBBVUNIOgorICAgICAvcC96YXViZXJlci90ZXh0L3dpem5wYy5kb2t1LCBQX1pfSU5GTworCisyMS5Pa3QgMjAwNiBDaGFnYWxsCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvZ2lsZGVucHJvcHMvUF9aX05PX1NQRUxMX1NVUFBPUlQgYi9kb2MvcHJvcHMvZ2lsZGVucHJvcHMvUF9aX05PX1NQRUxMX1NVUFBPUlQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGExYWIyOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9naWxkZW5wcm9wcy9QX1pfTk9fU1BFTExfU1VQUE9SVApAQCAtMCwwICsxLDI1IEBACitQX1pfTk9fU1BFTExfU1VQUE9SVAorCitOQU1FOgorICAgICBQX1pfTk9fU1BFTExfU1VQUE9SVAkiemF1YmVyZXJfcnVlc3R1bmdfdW50ZXJzdHVldHp0X25vY2hfbmljaHQiCisKK0RFRklOSUVSVCBJTjoKKyAgICAgL3AvemF1YmVyZXIvemF1YmVyZXIuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIE5vcm1hbGVyd2Vpc2UgdW50ZXJzdHVldHp0IGVpbmUgUnVlc3R1bmcgZGVuIFphdWJlcmVyLCBzb2JhbGQgc2llIGltCisgICAgIGVudHNwcmVjaGVuZGVuIFJ1ZXN0dW5nc21hc3RlciBlaW5nZXRyYWdlbiBpc3QuIE1vZWNodGUgbWFuIGFsbGVyZGluZ3MKKyAgICAgZGllIFVudGVyc3R1ZXR6dW5nIGFuIGJlc3RpbW10ZSBCZWRpbmd1bmdlbiBrbnVlcGZlbiwgei5CLiBkYXMgbG9lc2VuCisgICAgIGVpbmVyIE1pbmlxdWVzdCwgc28ga2FubiBtYW4gZGllc2UgUHJvcGVydHkgYXVmIDEgc2V0emVuLiBEaWUgUnVlc3R1bmcKKyAgICAgdW50ZXJzdHVldHp0IGRhbm4gbmljaHQuIFVtIGRpZSBVbnRlcnN0dWV0enVuZyB3aWVkZXIgenUgYWt0aXZpZXJlbiwKKyAgICAgc2V0enQgbWFuIGRpZSBQcm9wZXJ0eSB3aWVkZXIgYXVmIDAuCisKK0JFTUVSS1VOR0VOOgorICAgICBOSUVNQUxTIGRpZXNlIFByb3BlcnR5IGVpbmZhY2ggc28gaW4gZnJlbWRlbiBaYXViZXJlcnJ1ZXN0dW5nZW4gCisgICAgIHNldHplbi4gU29sbHRlIGRlciBHaWxkZW5tYWdpZXIgZXJmYWhyZW4sIGRhc3Mgei5CLiBlaW4gTlBDCisgICAgIGVpbmZhY2ggc28gZGllIFVudGVyc3R1ZXR6dW5nIGRlciBSdWVzdHVuZ2VuIGF1c3NjaGFsdGV0LCB3aXJkCisgICAgIGRpZXNlIFByb3BlcnR5IHdpZWRlciBkZWFrdGl2aWVydC4KKworU0lFSEUgQVVDSDoKKworMjEuT2t0IDIwMDYgQ2hhZ2FsbApkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL2dpbGRlbnByb3BzL2thZW1wZmVyYm9uaSBiL2RvYy9wcm9wcy9naWxkZW5wcm9wcy9rYWVtcGZlcmJvbmkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBlNGJlNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9naWxkZW5wcm9wcy9rYWVtcGZlcmJvbmkKQEAgLTAsMCArMSwyNjQgQEAKKworS2FlbXBmZXJib25pIHVuZCBkZXJlbiBJbXBsZW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitCZWkgZGVuIEthZW1wZmVybiBnaWJ0IGVzIGVpbmlnZSBQcm9wZXJ0aWVzLCBkaWUsIGluIFdhZmZlbiBvZGVyIFJ1ZXN0dW5nZW4KK2dlc2V0enQsIGRlciBLYW1wZnZlcmxhdWYgZWluZXMgU3BpZWxlcnMgZXJoZWJsaWNoIGJlZWluZmx1c3NlbiBrb2VubmVuLgorCitadSBiZWFjaHRlbiBpc3QsIGRhc3MgZGllIEFibmFobWUgdm9uIFdhZmZlbiBvZGVyIFJ1ZXN0dW5nZW4gbWl0IEthZW1wZmVyYm9uaQorYWxsZWluIGRlciBCYWxhbmNlIG9ibGllZ3QuIERlciBHaWxkZW5tYWdpZXIgZGVyIEthZW1wZmVyIHN0ZWh0IGFiZXIgZ2VybmUKK21pdCBSYXQgdW5kIFRhdCB6dXIgU2VpdGUuCisKKworQWJzY2huaXR0IEEKKy0tLS0tLS0tLS0tCisKK0luIFdhZmZlbiBrb2VubmVuIG5hY2hmb2xnZW5kZSwgaW4gL3Ava2FlbXBmZXIva2FlbXBmZXIuaCBkZWZpbmllcnRlbiwKK1Byb3BlcnRpZXMgZ2VzZXR6dCB3ZXJkZW4uIERpZSBtZWlzdGVuIGRhdm9uIGZ1bmdpZXJlbiBhbHMgJ0JvbmknIHVuZCB3ZXJkZW4KK2RlbSBTcGllbGVyIGF1Y2ggbWl0dGVscyAnc2NoYWV0eiA8d2FmZmU+JyBhbmdlemVpZ3Q6CisKKworMSBXYWZmZW5zY2hsYWdib251cyAtIEtfQlJBV0xJTkdfV0MgKElOVCkgLSAia19icmF3bGluZ193YyIKKworICBXZW5uIGRpZSBXYWZmZSBlaW5lIHp1c2FldHpsaWNoIGdlZmFlaHJsaWNoZSBTdGVsbGUgYmVzaXR6dCAtIHouQi4gZWluZW4KKyAgaGFydGVuIERvcm4gYW0gU3RpZWxlbmRlLCBlaW5lIFNwaXR6ZSBhbSBSdWVja2VuIGVpbmVyIEF4dGtsaW5nZSwgWmFja2VuCisgIGFtIERvbGNoZ3JpZmYgLSBrYW5uIG1hbiBkZXIgV2FmZmUgZWluZW4gV2FmZmVuc2NobGFnYm9udXMgZ2ViZW4uCisgIERpZXMgYmVkZXV0ZXQsIGRhc3MgZGVyIFdhZmZlbnNjaGxhZyB1bSBlaW4gcGFhciBQcm96ZW50ZSB2ZXJzdGFlcmt0IHdpcmQsCisgIGRhIGRlciBTcGllbGVyIG5hdHVlcmxpY2ggdmVyc3VjaHQsIGltbWVyIGdlbmF1IG1pdCBkaWVzZW0gJ2ZlYXR1cmUnCisgIGRlbiBXYWZmZW5zY2hsYWcgYXVzenVmdWVocmVuIChkZXIgV2FmZmVuc2NobGFnIGlzdCBrdXJ6IGdlc2FndCBlaW4KKyAgdW5lcndhcnRldGVyIFNjaGxhZywgZGVyIG5pY2h0IG1pdCBkZW0gJ25vcm1hbGVuJyBXYWZmZW5lbmRlIGF1c2dlZnVlaHJ0CisgIHdpcmQsIGRlciBHZWduZXIgd2lyZCBkYWR1cmNoIHVlYmVycmFzY2h0IC0+IG1laHIgU2NoYWRlbikuCisgIERhIHNvbGNoIGVpbiAnZmVhdHVyZScgZG9jaCByZWNodCBhdWZmYWVsbGlnIGlzdCwgc29sbHRlIGVzIGluIGRlcgorICBMYW5nYmVzY2hyZWlidW5nIGRlciBXYWZmZSBhdWYgamVkZW4gRmFsbCBlcndhZWhudCB3ZXJkZW4uCisKKyAgSW50ZXJlc3NhbnQgenUgd2lzc2VuIHdhZXJlIG5vY2gsIGRhc3MgWndlaWhhbmR3YWZmZW4gZWluZW4gZ2VuZXJlbGxlbgorICB6dXNhZXR6bGljaGVuIEJvbnVzIGF1ZiBkZW4gV2FmZmVuc2NobGFnIGJla29tbWVuIHVuZCBkYXNzIGVzIGVpbmUKKyAgQWJzdHVmdW5nIGdpYnQsIG5hY2ggZGVyIGRpZSBXYWZmZW5nYXR0dW5nZW4gZGllIEhvZWhlIGRlcyBCYXNpc3dlcnRlcworICBnZXNldHp0IGJla29tbWVuLCB3b2JlaSBTcGVlcmUgZGVuIGhvZWNoc3RlbiB1bmQgTWVzc2VyIGRlbiBuaWVkcmlnc3RlbgorICBiZXNpdHplbjoKKworICBTcGVlcmUgLSBLYW1wZnN0YWViZSAtIEFleHRlIC0gS2V1bGVuIC0gU2Nod2VydGVyIC0gTWVzc2VyCisKKyAgRGVyIG1heC4gQm9udXMgZnVlciBkaWVzZSBQcm9wZXJ0eSBiZXRyYWVndCAzMCwgd29iZWkgMS0xMCAtPiBnZXJpbmdlcgorICBCb251cywgMTEtMjAgLT4gZ3V0ZXIgQm9udXMsIDIxLTMwIC0+IHNlaHIgZ3V0ZXIgQm9udXMuCisKKyAgQml0dGUgYmVhY2h0ZW46IGVpbiBad2VpaGFuZC1TcGVlciBtaXQgbWF4LiBQX1dDIHVuZCBtYXguIEtfQlJBV0xJTkdfV0MKKyAgaGF1dCBlbnRzcHJlY2hlbmQgZ3V0IHJlaW4gdW5kIHNvbGx0ZSBudXIgc2Nod2VyIHp1IGVyZ2F0dGVybiBzZWluLCBiencuCisgIG5vY2ggYW5kZXJlIEF1ZmxhZ2VuIGhhYmVuIChnZ2YuIHVuaXF1ZSwgcGVyc29uYWxpc2llcnQsIGV0Yy4pCisKKworMiBXYWZmZW5zY2hsYWdzY2hhZGVuIC0gS19CUkFXTElOR19EVCAoU1RSSU5HKSAtICJrX2JyYXdsaW5nX2R0IgorCisgIFdlbm4gZGllIFdhZmZlLCBtaXQgZGVyIGRlciBLYWVtcGZlciBlaW5lbiBXYWZmZW5zY2hsYWcgYXVzZnVlaHJ0LCBlaW4KKyAgJ2ZlYXR1cmUnIGhhdCwgbWl0IGRlbSBlciBkaWVzZW4gU2NobGFnIGF1c2Z1ZWhydCwga2FubiBkaWVzZXMgJ2ZlYXR1cmUnCisgIGVpbmVuIGFuZGVyZW4gV2FmZmVuc2NobGFnc2NoYWRlbiBiZXNpdHplbi4gWi5CLiBrYW5uIGVpbiBTY2h3ZXJ0LCB3ZWxjaGVzCisgIG5vcm1hbGVyd2Vpc2UgRFRfU0xBU0ggbWFjaHQsIGJlc29uZGVycyBsYW5nZSB1bmQgc3BpdHplIFBhcmllcnN0YW5nZW4KKyAgYmVzaXR6ZW4sIGRpZSB2aWVsbGVpY2h0IGF1Y2ggbm9jaCB2ZXJnaWZ0ZXQgc2luZC4gRGFubiBrYW5uIGRlciBNYWdpZXIKKyAgKHtEVF9QSUVSQ0UsRFRfUE9JU09OfSkgc2V0emVuLCBzbyBkYXNzIGJlaW0gV2FmZmVuc2NobGFnIGltbWVyIGVpbgorICBNaXNjaHNjaGFkZW4gYXVzIFN0aWNoZSB1bmQgR2lmdCBlcmZvbGd0LgorCisKKzMgV2FmZmVuc2NobGFnc21lbGR1bmcgLSBLX0JSQVdMSU5HX01TRyAoU1RSSU5HL1NUUklORyopIC0ga19icmF3bGluZ19tc2ciCisKKyAgSW4gZGllc2UgUHJvcGVydHkga2FubiBtYW4gaGluZWluc2NocmVpYmVuLCBtaXQgd2VsY2hlbSBUZWlsIGRlciBXYWZmZQorICBkZXIgV2FmZmVuc2NobGFnIGF1c2dlZnVlaHJ0IHdpcmQuIEFuZ2Vub21tZW4sIGVzIGJpZXRldCBzaWNoIGFuLCBtaXQKKyAgZWluZXIgV2FmZmUgc3RldHMgZGVuIFdhZmZlbnNjaGxhZyBtaXQgZWluZW0gZ3Jvc3NlbiBLbmF1ZiBhbSBHcmlmZgorICBhdXN6dWZ1ZWhyZW4sIHdpcmQgc2NobGljaHQgdW5kIGVpbmZhY2ggIm1pdCBlaW5lbSBncm9zc2VuIEtuYXVmIGFtCisgIEdyaWZmIGRlciBTY2hsYWNodGF4dCIgaW4gZGllIFByb3BlcnR5IGdlc2V0enQuCisgIFNvbGx0ZSBzaWNoIGJlaSBkZXIgUHJvZ3JhbW1pZXJ1bmcgZXJnZWJlbiwgZGFzcyBlcyBzaWNoIGFuYmlldGV0LCBkZXIKKyAgV2FmZmUgbWVociBhbHMgbnVyIGVpbmUgZ3VlbnN0aWdlIFN0ZWxsZSBhbnp1ZGljaHRlbiBtaXQgZGVyIG1hbiBkZW4KKyAgV2FmZmVuc2NobGFnIGF1c2Z1ZWhyZW4ga2Fubiwgc28gc2V0enQgbWFuIGVpbiBBcnJheSwgei5CLiAoeyJtaXQgZWluZW0KKyAgZ3Jvc3NlbiBLbmF1ZiBhbSBHcmlmZiBkZXIgU2NobGFjaHRheHQiLCJtaXQgZGVyIGJyZWl0ZW4gU2VpdGUgZGVyICIKKyAgIlNjaGxhY2h0YXh0a2xpbmdlIn0pLiBJbnNnZXNhbXQgaXN0IGRhcmF1ZiB6dSBhY2h0ZW4sIGRhc3MgZGllIE1lbGR1bmdlbgorICAndm9sbHN0YW5kaWcnIHNpbmQuIERhcyBBcnJheSBrYW5uIGJlbGllYmlnZSBHcm9lc3NlIGFubmVobWVuLCBlcyB3aXJkCisgIGRhbm4genVmYWVsbGlnIGVpbmUgTWVsZHVuZyBiZWltIFNjaGxhZyBhdXNnZXN1Y2h0LgorCisgIEVzIGVtcGZpZWhsdCBzaWNoLCBqZWRlIFdhZmZlIG1pdCBkaWVzZXIgUHJvcGVydHkgenUgc2NobXVlY2tlbiwgZGllCisgIEtfQlJBV0xJTkdfV0MgZ2VzZXR6dCBoYWJlbiwgZGEgZGllIFdhZmZlbnNjaGxhZ21lbGR1bmdlbiBkYW1pdCBpbSBLYW1wZgorICAnaW5kaXZpZHVhbGlzaWVydCcgd2VyZGVuLiBJbiBkZXIgUHJheGlzIHdpcmQgZXMgamVkb2NoIGRhcmFuIHNjaGVpdGVybiwKKyAgZGFzcyBlcyB2aWVsIHp1IHZpZWxlIGFsdGUgV2FmZmVuIGdpYnQsIGRpZSBrZWluZXIgbWVociBhbmZhc3NlbiBtb2VjaHRlLgorICBEYWhlciB3aXJkIGF1ZiBTdGFuZGFyZG1lbGR1bmdlbiB6dXJ1ZWNrZ2VncmlmZmVuLCBzb2xsdGUgZGllc2UgUHJvcGVydHkKKyAgbmljaHQgZ2VzZXR6dCBzZWluLgorCisKKzQgV2FmZmVuYnJ1Y2hib251cyAtIEtfV0VBUE9OX1NIQVRURVIgKElOVCkgLSAia193ZWFwb25fc2hhdHRlciIKKworICBXYWZmZW4sIGRpZSBiZXNvbmRlcnMgZnVlciBkZW4gV2FmZmVuYnJ1Y2gga29uc3RydWllcnQgd3VyZGVuLCBrb2VubmVuCisgIGVpbmVuIEJvbnVzIGVpbmJyaW5nZW4sIGRlciBpbiBkaWVzZXIgUHJvcGVydHkgYW5nZWdlYmVuIHdpcmQuIE5hdHVlcmxpY2gKKyAgZWlnbmVuIHNpY2ggZGllIHZlcnNjaGllZGVuZW4gV2FmZmVudHlwZW4gd2llZGVyIHVudGVyc2NoaWVkbGljaCBndXQgZnVlcgorICBlaW5lbiBXYWZmZW5icnVjaDogS2V1bGVuIChtZWlzdCBhdWZncnVuZCBpaHJlcyBHZXdpY2h0cykgYW0gYmVzdGVuLCBNZXNzZXIKKyAgYW0gc2NobGVjaHRlc3RlbiwgYWxsZSBhbmRlcmVuIGRhendpc2NoZW4gKEF4dCAtIFNjaHdlcnQgLSBTdGFiIC0gU3BlZXIpLgorICBEYWJlaSBrcmllZ2VuIGFsbGUgV2FmZmVuLCBkaWUgdS5hLiBTY2hsYWdzY2hhZGVuIHZlcnVyc2FjaGVuLCBub2NobWFsCisgIGVpbmVuIGtsZWluZW4gQm9udXMgb2JlbmRyYXVmLgorCisgIERlciBtYXguIEJvbnVzIGZ1ZXIgZGllc2UgUHJvcGVydHkgYmV0cmFlZ3QgNTAsIHdvYmVpIDEtMTAgLT4gZ2VyaW5nZXIKKyAgQm9udXMsIDExLTMwIC0+IGd1dGVyIEJvbnVzLCAzMS01MCAtPiBzZWhyIGd1dGVyIEJvbnVzLgorCisgIEJlaSBndXQgZ2VsdW5nZW5lbSBXYWZmZW5icnVjaCB3aXJkIGRpZSBXYWZmZSBkZXMgR2VnbmVycyBiZXNjaGFlZGlndCwgd2VubgorICBkaWUgVGVjaG5payBzZWhyIGd1dCBnZWxpbmd0LCBrYW5uIGVzIGF1Y2ggc2VpbiwgZGFzcyBkZW0gR2VnbmVyIGRpZSBXYWZmZQorICBhdXMgZGVyIEhhbmQgZ2VzY2hsYWdlbiB3aXJkIChkZXIgU3BpZWxlciBrYW5uIHNpZSBhbGxlcmRpbmdzIG5pY2h0CisgIGF1ZmhlYmVuIHVuZCBkZXIgTlBDIHp1ZWNrdCBzaWUgbmFjaCBlaW4gcGFhciBLYW1wZnJ1bmRlbiB3aWVkZXIpLgorCisKKzUgQm9udXMgZnVlciBGaW50ZS9XYWZmZW50cmljayAtIEtfRElTVFJBQ1RJTkdfV0VBUE9OIChJTlQpIC0KKyAgImtfZGlzdHJhY3Rpbmdfd2VhcG9uIgorCisgIFdhZmZlbiwgZGllIGZ1ZXIgZGVuIEdlZ25lciBhdWZncnVuZCBpaHJlciBCYXV3ZWlzZSBiZXNvbmRlcnMgaXJyaXRpZXJlbmQKKyAgc2VpbiBrb2VubmVuLCBrb2VubmVuIGVpbmVuIEJvbnVzIGZ1ZXIgRmludGUgdW5kIFdhZmZlbnRyaWNrIGhhYmVuLiBEYWJlaQorICB3aXJkIGRlciBHZWduZXIgYmVpIGVpbmVyIEZpbnRlIGJ6dy4gZWluZW0gV2FmZmVudHJpY2sgTk9DSCBtZWhyIHZlcndpcnJ0LAorICBhbHMgZXIgZXMgb2huZWhpbiBzY2hvbiBudXIgZHVyY2ggZGllIGFuZ2V3YW5kdGUgVGVjaG5payB3aXJkLgorICBFaW4gZ3V0ZXMgQmVpc3BpZWwgaGllcmZ1ZXIgaXN0IHouQi4gZGVyIEtyaWVnc2hhbXN0ZXI6IGVpbiBIYW1zdGVyLCBkZXIKKyAgYXVmIGVpbmVtIEhvbHpzdGFiIGF1Zmdlc3BpZXNzdCBpc3QsIHNvbGx0ZSBmdWVyIGRlbiBHZWduZXIgc2Nob24gU0VIUgorICBpcnJpdGllcmVuZCBzZWluIDspLgorICBEaWUgV2FmZmVuZ2F0dHVuZyBoYXQgbnVyIHdlbmlnIEVpbmZsdXNzIGF1ZiBGaW50ZS9XYWZmZW50cmljay4KKworICBEZXIgbWF4LiBCb251cyBmdWVyIGRpZXNlIFByb3BlcnR5IGJldHJhZWd0IDUwLCB3b2JlaSAxLTEwIC0+IGdlcmluZ2VyCisgIEJvbnVzLCAxMS0zMCAtPiBndXRlciBCb251cywgMzEtNTAgLT4gc2VociBndXRlciBCb251cy4KKworCis2IFRvZGVzc3Rvc3Nib251cyAtIEtfQ1JJVElDQUxfSElUIChJTlQpIC0gImtfY3JpdGljYWxfaGl0IgorCisgIE1hbiBzdGVsbGUgc2ljaCBlaW5lIFdhZmZlIG1pdCBiZXNvbmRlcnMgc3BpdHplciwgbGFuZ2VyIEtsaW5nZSB2b3Igb2RlcgorICBlaW5lIG1hZ2lzY2hlIFdhZmZlLCBkaWUgZGVtIGdlc2Nod2FlY2h0ZW4gR2VnbmVyIGRpZSBTZWVsZSBlbnRyZWlzc3QuCisgIERpZXNlIEVpZ2Vuc2NoYWZ0ZW4gdmVybGVpaGVuIGRlbSBTcGllbGVyIGJlaW0gVG9kZXNzdG9zcyBlaW5lbgorICBlbnRzcHJlY2hlbmRlbiBCb251cyB2b24gYmlzIHp1IDEwMCUuCisKKyAgRXMgaXN0IG1vZWdsaWNoLCBkYXNzIGVpbiB1bmQgZGFzc2VsYmUgJ2ZlYXR1cmUnIHNvd29obCBkZW0gV2FmZmVuc2NobGFnCisgIGFscyBhdWNoIGRlbSBUb2Rlc3N0b3NzIGRlbiBCb251cyBzdGVsbHQsIHouQi4gendlaSBIaWVia2xpbmdlbiBhdWYgZGVtCisgIEtsaW5nZW5ydWVja2VuIGVpbmVyIGdyb3NzZW4gQXh0LiBBdWNoIGRpZXMgc29sbHRlIG1hbiBkZXV0bGljaCBhdXMgZGVyCisgIExhbmdiZXNjaHJlaWJ1bmcgaGVyYXVzbGVzZW4ga29lbm5lbi4KKworICBEZXIgbWF4LiBCb251cyBmdWVyIGRpZXNlIFByb3BlcnR5IGJldHJhZWd0IDEwMCwgd29iZWkgMTAwIGVpbmUgVmVyZG9wcGx1bmcKKyAgZGVyIFBfV0MgYmVpbSBUb2Rlc3N0b3NzIGJlZGV1dGV0IQorICBBbnNvbnN0ZW4gYmVkZXV0ZXQgMS0yMCAtPiBnZXJpbmdlciBCb251cywgMjEtNjAgLT4gZ3V0ZXIgQm9udXMsCisgIDYxLTEwMCAtPiBzZWhyIGd1dGVyIEJvbnVzLgorCisKKzcgV2FmZmVud3VyZmJvbnVzIC0gS19USFJPV0lOR19XRUFQT04gKElOVCkgLSAia190aHJvd2luZ193ZWFwb24iCisKKyAgV2VubiBlaW5lIFdhZmZlIGJlc29uZGVycyBndXQgenVtIFdlcmZlbiBnZWVpZ25ldCBpc3QsIHouQi4gZWluIFd1cmZkb2xjaCwKKyAgZGFubiBrYW5uIGRpZXNlIFByb3BlcnR5IGdlc2V0enQgd2VyZGVuLiBOYXR1ZXJsaWNoIGlzdCBkZXIgR3J1bmR3ZXJ0IHdpZWRlcgorICB2b24gZGVyIFdhZmZlbmdhdHR1bmcgYWJoYWVuZ2lnLiBFcyBnaWx0LCBkYXNzIG1hbiBNZXNzZXIgdW5kIFNwZWVyZQorICBncnVuZHNhZXR6bGljaCBhbSBiZXN0ZW4gd2VyZmVuIC0gdW5kIGRhYmVpIGd1dCBTY2hhZGVuIG1hY2hlbiAtIGthbm4sIGFtCisgIHNjaGxlY2h0ZXN0ZW4gc2NobmVpZGVuIEtldWxlbiB1bmQgS2FtcGZzdGFlYmUgYWIuCisKKyAgRGVyIG1heC4gQm9udXMgZnVlciBkaWVzZSBQcm9wZXJ0eSBiZXRyYWVndCA1MCwgd29iZWkgMS0yMCAtPiBnZXJpbmdlcgorICBCb251cywgMjEtNDAgLT4gZ3V0ZXIgQm9udXMsIDMxLTUwIC0+IHNlaHIgZ3V0ZXIgQm9udXMuCisKKyAgWnUgYmVhY2h0ZW4gaXN0IGhpZXJiZWksIGRhc3MgZWluIHNlaHIgaG9oZXIgQm9udXMgbnVyIGJlaSBXYWZmZW4gbWl0IGV0d2FzCisgIGdlcmluZ2VyZXIgUF9XQyB2ZXJnZWJlbiB3ZXJkZW4gc29sbHRlLiBFaW4gcmVpbmVzIFd1cmZtZXNzZXIgaXN0IG51bm1hbCBpbQorICBub3JtYWxlbiBLYW1wZiBuaWNodCBkaWUgZ2VmYWVocmxpY2hzdGUgYWxsZXIgV2FmZmVuIChzcGV6aWVsbAorICBhdXNiYWxhbmNpZXJ0LCBrZWluZW4gcmljaHRpZ2VuIEdyaWZmLCBldGMuKS4KKyAgTmF0dWVybGljaCBrYW5uIGVzIGVpbmVuIFd1cmZzcGVlciBtaXQgbWF4LiBQX1dDIHVuZCBzZWhyIGhvaGVtCisgIFdhZmZlbnd1cmZib251cyBnZWJlbiwgYWxsZXJkaW5ncyBtaXQgZGVuIHVlYmxpY2ggaG9oZW4gUmVzdHJpa3Rpb25lbi4KKworCis4IEtPLVNjaGxhZy1Cb251cyAtIEtfS08gKElOVCkgLSAia19rbyIKKworICBXYWZmZW4sIGRpZSBiZXNvbmRlcnMgZnVlciBlaW5lbiBLTy1TY2hsYWcgZ2VlaWduZXQgc2luZCwga29lbm5lbiBlaW5lbgorICBCb251cyBtaXQgZGllc2VyIFByb3BlcnR5IGJla29tbWVuLiBFaW5lIGVudHNwcmVjaGVuZGUgV2FmZmUga29lbm50ZSB6LkIuCisgIGVpbiBsZWRlcnVtd2lja2VsdGVyIFBydWVnZWwgc2VpbiwgZGVubiBtYW4gd2lsbCBkZW4gR2VnbmVyIGphIG51ciBLTworICBzY2hsYWdlbiB1bmQgbmljaHQgZ2xlaWNoIHRvZXRlbi4KKworICBEZXIgbWF4LiBCb251cyBmdWVyIGRpZXNlIFByb3BlcnR5IGJldHJhZWd0IDUwLCB3b2JlaSAxLTIwIC0+IGdlcmluZ2VyCisgIEJvbnVzLCAyMS0zMCAtPiBndXRlciBCb251cywgMzEtNTAgLT4gc2VociBndXRlciBCb251cy4KKworCis5IEtlaW4gV2FmZmVuc2NoYWVyZmVuIC0gS19OT19IT05JTkcgKElOVCkgLSAia19ub19ob25pbmciCisKKyAgV2VubiBlaW5lIFdhZmZlIGF1cyBpcmdlbmRlaW5lbSBHcnVuZCBuaWNodCBnZXNjaGFlcmZ0IHdlcmRlbiBrYW5uIG9kZXIKKyAgZGFyZiwgbXVzcyBtYW4gZGllc2UgUHJvcGVydHkgYXVmIDEgc2V0emVuLgorICBFaW5lIEVya2xhZXJ1bmcgZGFmdWVyIHNvbGx0ZSBpbiBkZXIgUF9MT05HIGJ6dy4gUF9JTkZPIGVyZm9sZ2VuLgorCisKK0Fic2Nobml0dCBCCistLS0tLS0tLS0tLQorCitEaWUgYmVpZGVuIFByb3BlcnRpZXMsIFBfRUZGRUNUSVZFX0FDIHVuZCBQX0VGRkVDVElWRV9XQywgd2VsY2hlIGluCis8Y29tYmF0Lmg+IGRlZmluaWVydCBzaW5kLCBzaW5kIGVpZ2VudGxpY2ggbnVyIGRhenUgZGEsIHVtIFJ1ZXN0dW5nZW4gdW5kCitXYWZmZW4sIGRpZSBlaW5lIERlZmVuZEZ1bmMoKSBiencuIEhpdEZ1bmMoKSBiZXNpdHplbiwga29ycmVrdCB2b20gU3BpZWxlcgorZWluc2NoYWV0emVuIGxhc3NlbiB6dSBrb2Vubm5lbi4KKworRGFzIEthZW1wZmVyc3BlbGxib29rIHZlcndlbmRldCBkaWVzZSBQcm9wZXJ0aWVzIGRhcnVlYmVyaGluYXVzIHdpZSBmb2xndDoKKworCisxIFNjaHV0emJvbmkgaW4gV2FmZmVuIC0gUF9FRkZFQ1RJVkVfQUMgKElOVCkgLSAiZWZmZWN0aXZlX2FjIgorCisgIElzdCBkaWVzZSBQcm9wZXJ0eSBpbiBlaW5lciBXYWZmZSBnZXNldHp0LCBnZWh0IGRhcyBLYWVtcGZlcnNwZWxsYm9vaworICBkYXZvbiBhdXMsIGRhc3MgZGllc2UgV2FmZmUgbWVociBvZGVyIHdlbmlnZXIgZGllIEZhZWhpZ2tlaXQgYmVzaXR6dCwKKyAgYXVjaCB3aWUgZWluZSBSdWVzdHVuZyBzY2h1ZXR6ZW4genUga29lbm5lbi4gRGEgbWFuIGVpbmUgV2FmZmUgYWJlciBuaWNodAorICBhbnppZWhlbiwgc29uZGVybiBudXIgdm9yIHNpY2ggaGVydHJhZ2VuIGthbm4sIGthbm4gYXVjaCBkZXIgbWF4LgorICBSdWVzdHVuZ3NzY2h1dHogZWluZXIgV2FmZmUgbnVyIGdsZWljaCBkZW0gbWF4LiBSdWVzdHVuZ3NzY2h1dHogZWluZXMKKyAgU2NoaWxkZXMgZW50c3ByZWNoZW4uCisgIEVpbmUgZ2VzZXR6dGUgUF9FRkZFQ1RJVkVfQUMgaW4gZWluZXIgV2FmZmUgd2lyZCBkZW0gU3BpZWxlciBhbHMgbWVocgorICBvZGVyIHdlbmlnZXIgZ3V0ZSAnUGFyYWRld2FmZmUnIGltICdzY2hhZXR6JyBhbmdlemVpZ3QgdW5kIGdlaHQgc293b2hsIGJlaQorICBkZXIgV2FmZmVucGFyYWRlIGFscyBhdWNoIGJlaW0gQmxvY2sgYWxzIEJvbnVzIG1pdCBlaW4uCisKKyAgWi5CLiBrb2VubnRlIGVpbiBsZWljaHRlcyBTY2h3ZXJ0LCB3YXMgYXVmZ3J1bmQgc2VpbmVyIEJhdXdlaXNlIG1laHIgZnVlcgorICBkZW4gZGVmZW5zaXZlbiBLYW1wZiBhdXNnZWxlZ3QgaXN0IChleHRyYWxhbmdlIFBhcmllcnN0YW5nZW4sIHZlcnN0YWVya3RlcgorICBIYW5kc2NodXR6IGltIEdyaWZmYmVyZWljaCwgLi4uKSB3aWUgZWluIG1hZXNzaWdlcyBTY2hpbGQgd2lya2VuLiBEaWUKKyAgVm9ydGVpbGUgbGllZ2VuIGF1ZiBkZXIgSGFuZDogZGVyIFNwaWVsZXIgYmVrb21tdCB2ZXJzdGFlcmt0ZW4gU2NodXR6LAorICBrYW5uIGFiZXIgd2VpdGVyaGluIGVpbmUgWndlaWhhbmR3YWZmZSBmdWVocmVuLgorCisgIERlciBtYXguIEJvbnVzIGZ1ZXIgZGllc2UgUHJvcGVydHkgYmV0cmFlZ3QgNDAsIHdvYmVpIDEtMjAgLT4gZ2VyaW5nZXIKKyAgQm9udXMsIDIxLTMwIC0+IGd1dGVyIEJvbnVzLCAzMS00MCAtPiBzZWhyIGd1dGVyIEJvbnVzLgorCisgIFp1IGJlYWNodGVuIGlzdCBoaWVyLCBkYXNzIHNlaHIgZ3V0ZSBQYXJpZXJ3YWZmZW4gbWl0IFBfRUZGRUNUSVZFX0FDID4gMzAKKyAgbW9lZ2xpY2hzdCBkZXV0bGljaCB1bnRlciBkZXIgbWF4LiBXQyBsaWVnZW4gc29sbHRlbi4KKworICBBbm1lcmt1bmdlbjoKKyAgRWluZSBnZXNldHp0ZSBQX0VGRkVDVElWRV9BQyBpbiBlaW5lbSBTY2hpbGQga2FubiBkZW4gQm9udXMgZnVlciBkaWUKKyAgU2NoaWxkcGFyYWRlIG5hY2ggb2JlbiBvZGVyIHVudGVuIGJlZWluZmx1c3Nlbi4gTW9lY2h0ZSBtYW4gZWluIFNjaGlsZAorICBoZXJzdGVsbGVuLCB3ZWxjaGVzIHNwZXppZWxsIGJlaSBkZXIgU2NoaWxkcGFyYWRlIGRlciBLYWVtcGZlciBiZXNzZXIKKyAgYWxzICdub3JtYWwnIHNjaHVldHp0LCBzb2xsdGUgbWFuIGhpZXIgZWluZW4gV2VydCBlaW50cmFnZW4sIGRlciBkZXV0bGljaAorICBncm9lc3NlciBhbHMgZGllIFBfQUMgZGVzIFNjaGlsZGVzIGlzdC4KKworICBFaW5lIGdlc2V0enRlIFBfRUZGRUNUSVZFX0FDIGluIGVpbmVyIGFuZGVyZW4gUnVlc3R1bmcgaGF0IG51ciBkZW4gTnV0emVuLAorICBhdWYgZGVyZW4gZXJob2VodGVuICh1bmQgbmljaHQgc29mb3J0IHNpY2h0YmFyZW4pIFZlcnRlaWRpZ3VuZ3N3ZXJ0CisgIGhpbnp1d2Vpc2VuLCBkZXIgZHVyY2ggZWluZSBEZWZlbmRGdW5jKCkgcmVhbGlzaWVydCB3aXJkLgorCisKKzIgQW5ncmlmZnNib25pIGluIFJ1ZXN0dW5nZW4gLSBQX0VGRkVDVElWRV9XQyAoSU5UKSAtICJlZmZlY3RpdmVfd2MiCisKKyAgRnVlciBkaWUgS2FlbXBmZXIga29lbm5lbiBmb2xnZW5kZSBSdWVzdHVuZ3N0eXBlbiBtb2RpZml6aWVydCB3ZXJkZW46CisgIEFUX1RST1VTRVJTIChIb3NlbiksIEFUX0hFTE1FVCAoS29wZmJlZGVja3VuZyksIEFUX0JPT1QgKEZ1c3NrbGVpZHVuZyksCisgIEFUX0FSTU9VUiAoS29lcnBlcnJ1ZXN0dW5nKSwgQVRfU0hJRUxEIChTY2hpbGRlKS4KKyAgSXN0IGluIGVpbmVyIGRpZXNlciBUeXBlbiBQX0VGRkVDVElWRV9XQyBnZXNldHp0LCBzbyBtYWNodCBkaWVzZSBSdWVzdHVuZworICBiZWkgZWluZW0gQW5ncmlmZiBtaXQgZWluZXIgU3BlemlhbGF0dGFja2UgKEtuaWVzdG9zcywgS29wZnN0b3NzLCBGdXNzdHJpdHQsCisgIEVsbGJvZ2Vuc2NobGFnIHVuZCBTY2hpbGRzdG9zcykgZW50c3ByZWNoZW5kIG1laHIgYnp3LiB3ZW5pZ2VyIFNjaGFkZW4gYWxzCisgIG9obmUgZGllc2UgUHJvcGVydHkuIEVpbmUgZW50c3ByZWNoZW5kZSBCZWdydWVuZHVuZyBmdWVyIGVpbmUgVmVyc3RhZXJrdW5nCisgIG9kZXIgU2Nod2FlY2h1bmcgc29sbHRlIGF1Y2ggaGllciBmdWVyIGRlbiBTcGllbGVyIG9mZmVuc2ljaHRsaWNoIHNlaW4KKyAgKERvcm5lbiBhbSBTY2hpbGQsIHZlcnN0YWVya3RlciBLbmllYmVyZWljaCwgWmFja2VuIGFtIEhlbG0sIGV0Yy4pLgorCisgIFdlbm4gbWFuIGRlciBSdWVzdHVuZyBlaW5lbiBCb251cyBnZWJlbiBtb2VjaHRlLCBtdXNzIG1hbiBkYXJhdWYgYWNodGVuLAorICBkYXNzIFBfRUZGRUNUSVZFX1dDIGhvZWhlciBpc3QgYWxzIGRpZSBQX0FDIGRlciBSdWVzdHVuZyEgU29sbHRlCisgIFBfRUZGRUNUSVZFX1dDIG5pZWRyaWdlciBhbHMgUF9BQyBzZWluLCB3aXJkIGRlbm5vY2ggUF9FRkZFQ1RJVkVfV0MgYWxzCisgIEFuZ3JpZmZzd2VydCBnZW5vbW1lbi4gRGllcyBzdGVsbHQgbmF0dWVybGljaCBlaW5lIFNjaHdhZWNodW5nIGRlcgorICBTcGV6aWFsYXR0YWNrZSBkYXIuIE1vZWdsaWNoZXJ3ZWlzZSBpc3QgYWJlciBnZW5hdSBkYXMgZ2V3b2xsdCwgd2VubiBlaW5lCisgIFJ1ZXN0dW5nLCBkaWUgc2VociBndXQgc2NodWV0enQsIG51ciBnZXJpbmdlbiBLYWVtcGZlcmJvbnVzIGF1ZndlaXNlbiBzb2xsLgorCisgIEJlaXNwaWVsOiBlaW4gU2NoaWxkIGF1cyBIYXJ0Z3VtbWkga2FubiByZWNodCBndXQgU2NobGFlZ2UgYWxsZXIgQXJ0CisgIGFiZmFuZ2VuICgtPiBQX0FDIDM1KS4gV2lsbCBkZXIgS2FlbXBmZXIgamVkb2NoIGVpbmVuIFNjaGlsZHN0b3NzIGRhbWl0CisgIG1hY2hlbiwgZmVobHQgaWhtIGF1ZmdydW5kIGRlciBCZXNjaGFmZmVuaGVpdCBkaWUgV3VjaHQsIGVoZXIgZGFlbXBmdCBlcworICBkZW4gU2NoaWxkc3Rvc3Mgbm9jaCBlaW4gd2VuaWcgKC0+IFBfRUZGRUNUSVZFX1dDIDI1KS4KKworICBEZXIgTWF4aW1hbHdlcnQgZnVlciBkaWUgUF9FRkZFQ1RJVkVfV0MgYmVpIEthZW1wZmVybiBpc3QgZGVyIGpld2VpbHMKKyAgZG9wcGVsdGUgbWF4aW1hbGUgUF9BQy1XZXJ0IChzLiAnbWFuIHJ1ZXN0dW5nZW4nKS4KKworICBEaWUgQW5nYWJlIGVpbmVzIFNjaGFkZW5zdHlwcyAoUF9EQU1fVFlQRSkgaW4gZWluZXIgUnVlc3R1bmcga2FubiBkYW5uCisgIHNpbm52b2xsIHNlaW4sIHdlbm4gYmVpIGRlciBTcGV6aWFsYXR0YWNrZSBlaW4gc3BlemllbGxlciBTY2hhZGVuIGdlbWFjaHQKKyAgd2VyZGVuIHNvbGwuIEJlaXNwaWVsc3dlaXNlIHNvbGx0ZW4gRmxhbW1lbnN0aWVmZWwgbG9naXNjaGVyd2Vpc2UgRFRfRklSRQorICB1bmQgRFRfQkxVREdFT04gb2RlciBEVF9QSUVSQ0UgYmVpIGVpbmVtIEthbXBmdHJpdHQgdmVydXJzYWNoZW4uIEVzIE1VU1MKKyAgKGxvZ2lzY2hlcndlaXNlKSBtaW5kZXN0ZW5zIGVpbiBwaHlzaWthbGlzY2hlciBTY2hhZGVuc3R5cCBlbnRoYWx0ZW4gc2Vpbi4KKyAgV2lyZCBrZWluIFNjaGFkZW5zdHlwIGFuZ2VnZWJlbiwgd2lyZCBhdWYgU3RhbmRhcmR0eXBlbiB6dXJ1ZWNrZ2VncmlmZmVuLgorCisKK1NJRUhFIEFVQ0g6CisgICAgIFdhZmZlbjogICAgIFBfV0MsIFBfVE9UQUxfV0MsIFBfRUZGRUNUSVZFX1dDLCBIaXRGdW5jKCkKKyAgICAgUnVlc3R1bmdlbjogUF9BQywgUF9UT1RBTF9BQywgUF9FRkZFQ1RJVkVfQUMsIERlZmVuZEZ1bmMoKQorICAgICBGaWxlczogICAgICAvc3RkL3dlYXBvbi5jLCAvc3RkL3dlYXBvbi9jb21iYXQuYworICAgICBCYWxhbmNlOiAgICB3YWZmZW4sIHJ1ZXN0dW5nZW4sIHByb3BlcnRpZXMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzI2LjEwLjIwMTIsIEdhYnlsb24KZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9vYnNvbGV0ZS9QX0JBTEFOQ0VEX1dFQVBPTiBiL2RvYy9wcm9wcy9vYnNvbGV0ZS9QX0JBTEFOQ0VEX1dFQVBPTgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzg1ZjJjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL29ic29sZXRlL1BfQkFMQU5DRURfV0VBUE9OCkBAIC0wLDAgKzEsMzUgQEAKKyoqKioqKioqKioqKioqKioqKioqKiBVTkdFTlVUWlRFIFBST1BFUlRZICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIERpZXNlIFByb3BlcnR5IHdpcmQgdm9uIGRlciBNdWRsaWIgTklDSFQgYXVzZ2V3ZXJ0ZXQgdW5kIGthbm4gICAgICAgKgorKiBhbHMgdmVyYWx0ZXQgZ2VsdGVuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogTW9tZW50YW4gaXN0IGF1Y2gga2VpbmUgR2lsZGUgYmVrYW5udCwgZGllIG1laHIgbWFjaHQsIGFscyBzaWUgICAgICAqCisqIGF1c3p1Z2ViZW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK05BTUU6CisgICAgICAgIFBfQkFMQU5DRURfV0VBUE9OICAiYmFsYW5jZWRfd2VhcG9uIgorCitERUZJTklFUlQgSU46CisgICAgICAgIC9zeXMvd2VhcG9uLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICAgICBEaWUgUHJvcGVydHkgZ2lidCBhbiwgb2IgZWluZSBXYWZmZSBhdXNiYWxhbmNpZXJ0IGlzdCBvZGVyIG5pY2h0LgorICAgICAgICBEaWUgYmVpZGVuIG1vZWdsaWNoZW4gV2VydGUgc2luZCBsb2dpc2NoZXJ3ZWlzZToKKworICAgICAgICAgICAgICAgIFdQX0JBTEFOQ0VEICAgICAgIGJhbGFuY2llcnQKKyAgICAgICAgICAgICAgICBXUF9VTkJBTEFOQ0VEICAgICB1bmJhbGFuY2llcnQKKworICAgICAgICBEaWUgV1BfKiBzaW5kIGViZW5mYWxscyBpbiA8d2VhcG9uLmg+IGRlZmluaWVydC4KKworQkVJU1BJRUxFOgorICAgICAgICBhKSBFaW5lIGF1c2JhbGFuY2llcnRlIFdhZmZlIGlzdCB6LkIuIGVpbiBLYW1wZnN0YWIuCisKKyAgICAgICAgICAgIFNldFByb3AoUF9CQUxBTkNFRF9XRUFQT04sV1BfQkFMQU5DRUQpOworCisgICAgICAgIGIpIEVpbmUgbmljaHQgYXVzYmFsYW5jaWVydGUgV2FmZmUgaXN0IHouQi4gZWluZSBLZXVsZS4KKworICAgICAgICAgICAgU2V0UHJvcChQX0JBTEFOQ0VEX1dFQVBPTixXUF9VTkJBTEFOQ0VEKTsKKworU0lFSEUgQVVDSDoKKyAgICAgICAgUF9URUNITklRVUUsIC9zdGQvd2VhcG9uL2NvbWJhdC5jCisKK0xFVFpURSBBZU5ERVJVTkc6CisxNS4wMi4yMDA5LCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvb2Jzb2xldGUvUF9ERUZBVUxUX0lORk8gYi9kb2MvcHJvcHMvb2Jzb2xldGUvUF9ERUZBVUxUX0lORk8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE0OTI4YwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9vYnNvbGV0ZS9QX0RFRkFVTFRfSU5GTwpAQCAtMCwwICsxLDI4IEBACisqKioqKioqKioqKioqKioqKioqKiogVkVSQUxURVRFIFBST1BFUlRZICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBEaWVzZSBQcm9wZXJ0eSBpc3QgdmVyYWx0ZXQuIEJpdHRlIG5pY2h0IG1laHIgaW4gbmV1ZW0gQ29kZSBudXR6ZW4uICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK05BTUU6CisgICAgUF9ERUZBVUxUX0lORk8gICAgICAgICAgICAgICAgImRlZmF1bHRfaW5mbyIKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvcHJvcGVydGllcy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICBEZWZhdWx0LUFudHdvcnQgZWluZXMgTnBjLCB3ZW5uIGVyIGF1ZiBkYXMgU2NobHVlc3NlbHdvcnQgZHVyY2ggZGVuCisgICAgU3BpZWxlciBrZWluIEFkZEluZm8gcGFyYXQgaGF0LgorCitCRU1FUktVTkc6CisgICAgRGllc2UgUHJvcGVydHkgc29sbHRlIG5pY2h0IG1laHIgYmVudXR6dCB3ZXJkZW4uIFN0YXR0ZGVzc2VuIGJpdHRlCisgICAgQWRkSW5mbyhERUZBVUxUX0lORk8sLi4uKSB2ZXJ3ZW5kZW4uCisgICAgRGVtIGluIGRpZXNlciBQcm9wIGFuZ2VnZWJlbiBTdHJpbmcgd2lyZCBpbW1lciBkZXIgTmFtZSBkZXMgTnBjCisgICAgdm9yYXVzZ2VzdGVsbHQuIFdpbGwgbWFuIGRpZXMgdmVyaGluZGVybiwgbXVzcyBtYW4gc2llIHVlYmVyc2NocmVpYmVuLgorCitCRUlTUElFTDoKKyAgICBTZXRQcm9wKFBfREVGQVVMVF9JTkZPLCJib2hydCBnZWxhbmd3ZWlsdCBpbiBkZXIgTmFzZS5cbiIpOworCitTSUVIRSBBVUNIOgorICAgIEFkZEluZm8KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMTcuMDguMjAxMCwgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL29ic29sZXRlL1BfRVhUUkFfTE9PSyBiL2RvYy9wcm9wcy9vYnNvbGV0ZS9QX0VYVFJBX0xPT0sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc3N2EyNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9vYnNvbGV0ZS9QX0VYVFJBX0xPT0sKQEAgLTAsMCArMSwzNSBAQAorKioqKioqKioqKioqKioqKioqKioqIFZFUkFMVEVURSBQUk9QRVJUWSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogRGllc2UgUHJvcGVydHkgaXN0IHZlcmFsdGV0LiBCaXR0ZSBiZW51dHp0IHNpZSBOSUNIVCBtZWhyLCBzb25kZXJuICAqCisqIHN0YXR0ZGVzc2RlbiBBZGRFeHRyYUxvb2soKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworTkFNRToKKwlQX0VYVFJBX0xPT0sJCQkiZXh0cmFsb29rIgorCitERUZJTklFUlQgSU46CisJL3N5cy9saXZpbmcvZGVzY3JpcHRpb24uaAorCitCRVNDSFJFSUJVTkc6CisJRGllc2UgUHJvcGVydHkgZW50aGFlbHQgZWluZW4gU3RyaW5nLiBTaWUgd2lyZCBlbnR3ZWRlciBpbiBMZWJld2VzZW4KKwlkaXJla3Qgb2RlciBpbiBPYmpla3RlbiBnZXNldHp0IHdpcmQsIGRpZSBpbSBCZXNpdHogdm9uIExlYmV3ZXNlbgorCXNlaW4ga29lbm5lbi4KKwlEaWVzZSBTdHJpbmdzIGVyc2NoZWluZW4gZGFubiB6dXNhZXR6bGljaCBpbiBkZXIgTGFuZ2Jlc2NocmVpYnVuZworCWRlcyBMZWJld2VzZW5zIGJ6dy4gZGVzIEJlc2l0emVycyAod2VubiBkYXMgT2JqZWt0IHNpY2ggZGlyZWt0IGltCisJIExlYmV3ZXNlbiBiZWZpbmRldCwgamVkb2NoIG5pY2h0IGluIGVpbmVtIEJlaGFlbHRlciBpbSBMZWJld2VzZW4pLgorCUZ1ZXIgZGVuIFplaWxlbnVtYnJ1Y2ggbXVzcyBtYW4gc2VsYnN0IHNvcmdlbi4KKworQkVJU1BJRUw6CisJRWluIFNwaWVsZXIgaGF0IGVpbmUgUGZlaWZlIGltIE11bmQuIEluIGRpZXNlciBQZmVpZmUgc2V0enQgbWFuIHouQi4KKwlpbiBkZXIgRnVua3Rpb24genVtIFBmZWlmZSBSYXVjaGVuIGZvbGdlbmRlczoKKwkgIFNldFByb3AoUF9FWFRSQV9MT09LLGJyZWFrX3N0cmluZygKKwkgdGhpc19wbGF5ZXIoKS0+TmFtZShXRVIpKyIgaXN0IGdhbnogdW1uZWJlbHQuIiw3OCk7CisKK0JFTUVSS1VORzoKKyAgQklUVEUgTklDSFQgTUVIUiBCRU5VVFpFTiEKKworU0lFSEUgQVVDSDoKKwlsb25nKCksIC9zdGQvbGl2aW5nL2Rlc2NyaXB0aW9uLmMsIC9zdGQvcGxheWVyL2Jhc2UuYworICBBZGRFeHRyYUxvb2soKSwgUmVtb3ZlRXh0cmFMb29rKCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMTMuMDUuMjAwNywgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL29ic29sZXRlL1BfTEFTVF9LSUxMRVIgYi9kb2MvcHJvcHMvb2Jzb2xldGUvUF9MQVNUX0tJTExFUgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2VlYThmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL29ic29sZXRlL1BfTEFTVF9LSUxMRVIKQEAgLTAsMCArMSwyMCBAQAorKioqKioqKioqKioqKioqKioqKioqIFZFUkFMVEVURSBQUk9QRVJUWSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogRGllc2UgUHJvcGVydHkgaXN0IHZlcmFsdGV0IHVuZCB3aXJkIGJhbGQgYXVzIGRlciBNdWRsaWIgZW50ZmVybnQuICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitOQU1FOgorICAgIFBfTEFTVF9LSUxMRVIgICAgICAgICAgICAgICAgICJsYXN0X2tpbGxlciIgICAgICAgICAgICAgICAgIAorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9wbGF5ZXIuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIExldHp0ZXIgTW9lcmRlcyBkZXMgV2VzZW5zLgorICAgICBEaWVzZSBQcm9wZXJ0eSB3dXJkZSBudXIgaW4gU3BpZWxlcm4gZ2VzZXR6dCB1bmQgYXVjaCBkYW5uIG5pY2h0IGltbWVyLgorICAgICBCaXR0ZSBzdGF0dGRlc3NlbiBQX0tJTExFUiBhYmZyYWdlbiwgd2VsY2hlIGluIE5QQyB1bmQgU3BpZWxlcm4gZ2VzZXR6dAorICAgICB3aXJkLgorCitTSUVIRSBBVUNIOgorICAgIFBfS0lMTEVSLCBkaWUoKQorCiswNS4wOS4yMDA4LCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvb2Jzb2xldGUvUF9MQVNUX1BFQUNFX1RJTUUgYi9kb2MvcHJvcHMvb2Jzb2xldGUvUF9MQVNUX1BFQUNFX1RJTUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYyMjMzZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9vYnNvbGV0ZS9QX0xBU1RfUEVBQ0VfVElNRQpAQCAtMCwwICsxLDI3IEBACisqKioqKioqKioqKioqKioqKioqKiogVkVSQUxURVRFIFBST1BFUlRZICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBEaWVzZSBQcm9wZXJ0eSBpc3QgdmVyYWx0ZXQgdW5kIHdpcmQgYmFsZCBhdXMgZGVyIE11ZGxpYiBlbnRmZXJudC4gICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQUk9QRVJUWQorCisJUF9MQVNUX1BFQUNFX1RJTUUJImxhc3RfcGVhY2VfdGltZSIKKworREVGSU5JRVJUIElOCisKKwkvc3RkL2xpdmluZy9jb21iYXQuYworCitCRVNDSFJFSUJVTkcKKworCURpZXNlIFByb3BlcnR5IGdpYnQgYW4sIHdhbm4genVsZXR6dCB2ZXJzdWNodCB3dXJkZSwgZWluZW4gTlBDIHp1CisJYmVmcmllZGVuLiBCaXR0ZSBuYWNoIE1vZWdsaWNoa2VpdCBudXIgbGVzZW5kIHZlcndlbmRlbi4gRGVzIHdlaXRlcmVuCisJd2lyZCBzaWUgbnVyIGltIHVlYmxpY2hlbiBWZXJoYWx0ZW4gdm9uIFF1ZXJ5UGFjaWZ5IGdlc2V0enQsIHVuZCBudXIKKwlkYW5uLCB3ZW5uIFBfQUNDRVBUX1BFQUNFIG5pY2h0IGdlc2V0enQgaXN0LgorCitTSUVIRSBBVUNICisKKwlRdWVyeVBhY2lmeSwgUF9BQ0NFUFRfUEVBQ0UKKworTEVUWlRFIEFFTkRFUlVORworCisJMjAwNC0wMy0xNywgMTQ6MzAgdm9uIEh1bW5pCisJCisKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9vYnNvbGV0ZS9QX0xPR19GSUxFIGIvZG9jL3Byb3BzL29ic29sZXRlL1BfTE9HX0ZJTEUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVhZmU0MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9vYnNvbGV0ZS9QX0xPR19GSUxFCkBAIC0wLDAgKzEsNDUgQEAKKyoqKioqKioqKioqKioqKioqKioqKiBWRVJBTFRFVEUgUFJPUEVSVFkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIERpZXNlIFByb3BlcnR5IHdpcmQgbmljaHQgbWVociBhdXNnZXdlcnRldC4gICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK05BTUU6CisgICAgUF9MT0dfRklMRSAgICAgICAgICAgICAgICAgICAibG9nX2ZpbGUiCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3RoaW5nL3Byb3BlcnRpZXMuaAorCitCRVNDSFJFSUJVTkc6CisgICAgRW50aGFlbHQgZWluZW4gU3RyaW5nIGF1ZiBlaW5lbiBGaWxlbmFtZW4uIAorCisgICAgV2VyZGVuIHp1IGRlbSBPYmpla3QgKFJhdW0sIE1vbnN0ZXIsIC4uLikgRmVobGVybWVsZHVuZ2VuIGFiZ2VzZXR6dCwgCisgICAgd2VyZGVuIGRpZXNlIGluIGRhcyBhbmdlZ2ViZW5lIEZpbGUgdW1nZWxlaXRldC4gRGllIEVpbnRyYWd1bmcgaW4KKyAgICBkaWUgcGVyIERlZmF1bHQgZnVlciBGZWhsZXJtZWxkdW5nZW4gdm9yZ2VzZWhlbmVuIERhdGVpZW4gZXJmb2xndAorICAgIG5pY2h0LgorCitCRU1FUktVTkdFTjoKKyAgICBQX0xPR19GSUxFIHdpcmQgYXVzZ2V3ZXJ0ZXQgd2llIGxvZ19maWxlKCkuCisKKyAgICBEYXMgaGVpc3N0LCBlcyB3aXJkIEFVRiBKRURFTiBGQUxMIG5hY2ggL2xvZyBnZXNjaHJpZWJlbiEKKworICAgIERpcmVrdCBpbiAvbG9nIGthbm4gTklDSFQgZ2VzY2hyaWViZW4gd2VyZGVuLCBlcyBtdXNzIGFsc28gZWluIAorICAgIFVudGVydmVyemVpY2huaXMgbWl0IEV1cmVtIE1hZ2llcm5hbWVuIHZvcmhhbmRlbiBzZWluLgorCitCRUlTUElFTEU6CisgICAgU2V0UHJvcChQX0xPR19GSUxFLCJ0aWxseV9sb2ciKTsgICAgICAgICAgLy8gRkFMU0NILCBlcyB3dWVyZGUgdmVyc3VjaHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhcyBGaWxlIC9sb2cvdGlsbHlfbG9nIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuenVsZWdlbgorICAgIFNldFByb3AoUF9MT0dfRklMRSwiL2xvZy90aWxseV9sb2ciKTsgICAgIC8vIEZBTFNDSCwgZXMgd3VlcmRlIHZlcnN1Y2h0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXMgRmlsZSAvbG9nL2xvZy90aWxseV9sb2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnp1bGVnZW4KKyAgICBTZXRQcm9wKFBfTE9HX0ZJTEUsIi9kL2ViZW5lL3RpbGx5X2xvZyIpOyAvLyBGQUxTQ0gsIHMuby4KKworICAgIFNldFByb3AoUF9MT0dfRklMRSwidGlsbHkvdGlsbHlfbG9nIik7ICAgIC8vIFJJQ0hUSUchCisKKyAgICBJbSBsZXR6dGVuIEJlaXNwaWVsIHdlcmRlbiBhbGxlIEVpbnRyYWVnZSBpbiBkYXMgRmlsZSB0aWxseV9sb2cgZ2UtCisgICAgc2NocmllYmVuLCBkYXMgc2ljaCBpbSBWZXJ6ZWljaG5pcyAvbG9nL3RpbGx5LyBiZWZpbmRldC4KKworICAgIERhcyBVbnRlcnZlcnplaWNobmlzIC90aWxseSBpbiAvbG9nIG11c3MgenV2b3IgYW5nZWxlZ3Qgd2VyZGVuLgorCitTSUVIRSBBVUNIOgorICAgIFBfTE9HX0lORk8sIHdyaXRlX2ZpbGUoKSwgbG9nX2ZpbGUoKSwKKworTGV0enRlIEFlbmRlcnVuZzogMTMuMDkuMDQgVGlsbHlATW9yZ2VuR3JhdWVuCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvb2Jzb2xldGUvUF9ORVhUX1NQRUxMX1RJTUUgYi9kb2MvcHJvcHMvb2Jzb2xldGUvUF9ORVhUX1NQRUxMX1RJTUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc0MjQ1NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9vYnNvbGV0ZS9QX05FWFRfU1BFTExfVElNRQpAQCAtMCwwICsxLDMwIEBACisqKioqKioqKioqKioqKioqKioqKiogVkVSQUxURVRFIFBST1BFUlRZICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBEaWVzZSBQcm9wZXJ0eSBpc3QgdmVyYWx0ZXQuIEJpdHRlIG5pY2h0IG1laHIgaW4gbmV1ZW0gQ29kZSBudXR6ZW4uICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK05BTUU6CisgICAgUF9ORVhUX1NQRUxMX1RJTUUgICAgICAgICAgICAgIm5leHRfc3BlbGwiCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL25ld19za2lsbHMuaAorCitCRVNDSFJFSUJVTkc6CisgICAgV2FubiBrYW5uIGRhcyBuYWVjaHN0ZSBNYWwgZ2V6YXViZXJ0IHdlcmRlbj8KKyAgICBEaWVzIGlzdCBlaW5lIGdsb2JhbGUgU3BydWNoZXJtdWVkdW5nLy1TcGVycmUuCisgICAgRmxleGlibGVyZSBTcGVycmVuIGtvZW5uZW4gbWl0dGVscyBTZXRTcGVsbEZhdGlndWUvQ2hlY2tTcGVsbEZhdGlndWUoKQorICAgIHZlcndhbHRldCB3ZXJkZW4uCisKKyAgICBEaWVzZSBQcm9wZXJ0eSBpc3Qga2VpbmUgZWNodGUgUHJvcGVydHksIHNvbmRlcm4gbGllZmVydCBudXIgZGFzCisgICAgRXJnZWJuaXMgdm9uIHZvbiBDaGVja1NwZWxsRmF0aWd1ZSgpIHp1cnVlY2sgYnp3LiBydWZ0IGJlaW0gU2V0emVuCisgICAgU2V0U3BlbGxGYXRpZ3VlKDxzcHJ1Y2hzcGVycmU+LCAwKSBhdWYuCisgICAgRGllc2UgUHJvcCBzb2xsdGUgX25pY2h0XyBtaXR0ZWxzIFF1ZXJ5LSBvZGVyIFNldG1ldGhvZGVuIG1hbnVwdWxpZXJ0CisgICAgd2VyZGVuLCBkYSBzb25zdCBJbmtvbnNpc3RlbnplbiB6dW0gRXJnZWJuaXMgdm9uIENoZWNrU3BlbGxGYXRpZ3VlKCkKKyAgICBhdWZ0cmV0ZW4uCisKK1NJRUhFIEFVQ0g6CisgICAgU2V0U3BlbGxGYXRpZ3VlKEwpLCBDaGVja1NwZWxsRmF0aWd1ZShMKQorICAgIHNwcnVjaGVybXVlZHVuZworCitaVUxFVFpUIEdFQWVOREVSVDoKKzE0LjAzLjIwMTAsIFplc3N0cmEKKwpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL29ic29sZXRlL1BfUkVBRF9NU0cgYi9kb2MvcHJvcHMvb2Jzb2xldGUvUF9SRUFEX01TRwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Yzc5ZmRjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL29ic29sZXRlL1BfUkVBRF9NU0cKQEAgLTAsMCArMSwzMiBAQAorKioqKioqKioqKioqKioqKioqKioqIFZFUkFMVEVURSBQUk9QRVJUWSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogRGllc2UgUHJvcGVydHkgaXN0IHZlcmFsdGV0LiBCaXR0ZSBuaWNodCBtZWhyIGluIG5ldWVtIENvZGUgbnV0emVuLiAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTkFNRToKKyAgICBQX1JFQURfTVNHICAgICAgICAgICAgICAgICJyZWFkX21zZyIgICAgICAgICAgICAgICAgCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL3Byb3BlcnRpZXMuaAorCitCRVNDSFJFSUJVTkc6CisgICAgRGllc2UgUHJvcGVydHkgaXN0IHZlcmFsdGV0LiBJaHJlIEZ1bmt0aW9uIHdpcmQgdm9uCisgICAgQWRkUmVhZERldGFpbChTRU5TRV9ERUZBVUxULCAuLi4pIHVlYmVybm9tbWVuLgorICAgIAorICAgIEhpZXIga29lbm5lbiBJbmZvcm1hdGlvbmVuIGdlc3BlaWNoZXJ0IHdlcmRlbiwgZGllIGJlaW0gTGVzZW4KKyAgICBkZXMgT2JqZWt0ZXMgYXVzZ2VnZWJlbiB3ZXJkZW4uCisgICAgIAorICAgIEZ1ZXIgZGFzIElkZW50aWZpemllcmVuIGRlcyB6dSBsZXNlbmRlbiBPYmpla3RlcyB3aXJkIGRlciBnbGVpY2hlCisgICAgTWVjaGFuaXNtdXMgYmVudXR6dCB3aWUgZnVlciBsZXNiYXJlIHVuZCBhbmRlcmUgRGV0YWlscy4KKworICAgIERpZSBCZW51dHp1bmcgdm9uIHByb2Nlc3Nfc3RyaW5nKCkgaXN0IGluIGRpZXNlciBQcm9wIG5pY2h0IG1laHIgZXJsYXVidC4KKworQkVJU1BJRUw6CisgICAgQWRkSWQoKHsicm9sbGUiLCAic2NocmlmdHJvbGxlIn0pKTsKKyAgICBTZXRQcm9wKFBfUkVBRF9NU0csCisgICAgICAgIkR1IG9lZmZuZXN0IGRpZSBSb2xsZSB1bmQgbGllc3Q6IExPUkVNIElQU1VNIC4uLlxuIik7CisgICAgIAorU0lFSEUgQVVDSDoKKyAgICBEZXRhaWxzOiAgIEFkZFJlYWREZXRhaWwoKSwgUmVtb3ZlUmVhZERldGFpbCgpLCBQX1JFQURfREVUQUlMUworICAgIFNvbnN0aWdlczogYnJlYWtfc3RyaW5nKCkKKworMDkuMTIuMjAxMiwgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvb2Jzb2xldGUvUF9URUNITklRVUUgYi9kb2MvcHJvcHMvb2Jzb2xldGUvUF9URUNITklRVUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY1NzAyNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9vYnNvbGV0ZS9QX1RFQ0hOSVFVRQpAQCAtMCwwICsxLDQ0IEBACisqKioqKioqKioqKioqKioqKioqKiogVU5HRU5VVFpURSBQUk9QRVJUWSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBEaWVzZSBQcm9wZXJ0eSB3aXJkIHZvbiBkZXIgTXVkbGliIE5JQ0hUIGF1c2dld2VydGV0IHVuZCBrYW5uICAgICAgICoKKyogYWxzIHZlcmFsdGV0IGdlbHRlbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIE1vbWVudGFuIGlzdCBhdWNoIGtlaW5lIEdpbGRlIGJla2FubnQsIGRpZSBtZWhyIG1hY2h0LCBhbHMgc2llICAgICAgKgorKiBhdXN6dWdlYmVuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitOQU1FOgorCVBfVEVDSE5JUVVFCQkJCSJ0ZWNobmlxdWUiCisKK0RFRklOSUVSVCBJTjoKKwkvc3lzL3dlYXBvbi5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgICAgRGllIFRlY2huaWsoZW4pLCBtaXQgZGVuZW4gZWluZSBXYWZmZSBpbSBLYW1wZiBlaW5nZXNldHp0IHdlcmRlbgorICAgICAgICBrYW5uLiBGb2xnZW5kZSBUZWNobmlrZW4gc3RlaGVuIHp1ciBWZXJmdWVndW5nOgorCisgICAgICAgICAgICAgICAgVFFfU1RST0tFICAgICAgIFN0cmVpY2h0ZWNobmlrCisgICAgICAgICAgICAgICAgVFFfVEhSQVNIICAgICAgIFNjaGxhZ3RlY2huaWsKKyAgICAgICAgICAgICAgICBUUV9USFJVU1QgICAgICAgU3Rvc3N0ZWNobmlrCisgICAgICAgICAgICAgICAgVFFfV0hJUCAgICAgICAgIFBlaXRzY2h0ZWNobmlrCisKKyAgICAgICAgRGllIFRlY2huaWtlbiBzaW5kIGViZW5mYWxscyBpbiA8d2VhcG9uLmg+IGRlZmluaWVydCB1bmQgYXVmIGRlcgorICAgICAgICBtYW4tcGFnZSAndGVjaG5pa2VuJyBuYWVoZXIgZXJsYWV1dGVydC4KKworQkVNRVJLVU5HRU46CisgICAgICAgIE1hbiBrYW5uIGVpbmVyIFdhZmZlIGVpbmUgb2RlciBtZWhyZXJlIFRlY2huaWtlbiB6dXdlaXNlbi4KKworQkVJU1BJRUxFOgorICAgICAgICBhKSBFaW5lIFdhZmZlLCBkaWUgbnVyIG1pdCBlaW5lciBQZWl0c2NodGVjaG5payBlaW5nZXNldHp0IHdpcmQsCisgICAgICAgICAgIGFsc28gdHlwaXNjaGVyd2Vpc2UgZWluZSBQZWl0c2NoZSwgYWJlciBhdWNoIGVpbiBNb3JnZW5zdGVybjoKKworICAgICAgICAgICAgU2V0UHJvcChQX1RFQ0hOSVFVRSxUUV9XSElQKTsKKworICAgICAgICBiKSBFaW5lIFdhZmZlLCBkaWUgc293b2hsIG1pdCBkZXIgU2NobGFnLSBhbHMgYXVjaCBkZXIgU3Rvc3N0ZWNobmlrCisgICAgICAgICAgIGVpbmdlc2V0enQgd2lyZCwgYWxzbyB6LkIuIGVpbmUgSGVsbGViYXJkZToKKworICAgICAgICAgICAgU2V0UHJvcChQX1RFQ0hOSVFVRSwoe1RRX1RIUkFTSCxUUV9USFJVU1R9KSk7CisKK1NJRUhFIEFVQ0g6CisgICAgICAgIHRlY2huaWtlbiwgUF9CQUxBTkNFRF9XRUFQT04sIC9zdGQvd2VhcG9uL2NvbWJhdC5jCisKK0xFVFpURSBBZU5ERVJVTkc6CisxNS4wMi4yMDA5LCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9vYnNvbGV0ZS9QX1RNUF9BVFRBQ0tfSE9PSyBiL2RvYy9wcm9wcy9vYnNvbGV0ZS9QX1RNUF9BVFRBQ0tfSE9PSwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGM4MTUyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Byb3BzL29ic29sZXRlL1BfVE1QX0FUVEFDS19IT09LCkBAIC0wLDAgKzEsNzMgQEAKKyoqKioqKioqKioqKioqKioqKioqKiBWRVJBTFRFVEUgUFJPUEVSVFkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIERpZXNlIFByb3BlcnR5IGlzdCB2ZXJhbHRldC4gQml0dGUgbmljaHQgbWVociBpbiBuZXVlbSBDb2RlIG51dHplbi4gKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BfVE1QX0FUVEFDS19IT09LCisKK05BTUU6CisgICAgUF9UTVBfQVRUQUNLX0hPT0sgICAgICAgICAgICAgImF0dGFja19ob29rIgorCitERUZJTklFUlQgSU46CisgICAgL3N5cy9uZXdfc2tpbGxzLmgKKworQkVTQ0hSRUlCVU5HOgorICAgICBNaXR0ZWxzIGRpZXNlciBQcm9wZXJ0eSBrb2VubmVuIGRpZSBBdHRhY2tlbiBlaW5lcyBMaXZpbmdzIGdnZi4KKyAgICAgYWJnZWJyb2NoZW4gd2VyZGVuIG5vY2ggYmV2b3IgV2FmZmVuIG9kZXIgU2tpbGxzIHp1bSBhdXNnZXdlcnRldAorICAgICB3dXJkZW4uCisKKyAgICAgRXMgd2lyZCBhbiBkZW0gTGl2aW5nIGRpZSBQcm9wZXJ0eSBhbHMgbWluZGVzdGVucyAzLWVsZW1lbnRpZ2VzIEFycmF5OgorICAgICAoe3plaXRwdW5rdCwgb2JqZWt0LCBtZXRob2RlLCAuLi59KQorICAgICBnZXNldHp0IHVuZCBkaWUgTWV0aG9kZSAnbWV0aG9kZScgd2lyZCBkYW5uIHdhZWhyZW5kIGRlcyBBdHRhY2soKSBkZXMKKyAgICAgTGViZXdlc2VucyBpbiAnb2JqZWt0JyBhdWZnZXJ1ZmVuLCBzb2xhbmdlIHRpbWUoKTwnemVpdHB1bmt0Jy4KKworICAgICBEZXIgTWV0aG9kZSB3aXJkIGFscyBQYXJhbWV0ZXIgZGVyIEdlZ25lciB1ZWJlcmdlYmVuLgorCisgICAgIEdpYnQgZGllIE1ldGhvZGUgMCBhbHMgUnVlY2tnYWJld2VydCB6dXJ1ZWNrLCB3aXJkIGRpZSBBdHRhY2tlIHNvZm9ydAorICAgICBrb21tZW50YXJsb3MgYWJnZWJyb2NoZW4uCisKK0JFTUVSS1VOR0VOOgorICAgICAtIEJpdHRlIGRhcyBuZXVlcmUgSG9va3N5c3RlbSAocy4gTWFucGFnZSBzdGQvaG9va3MpIGJlbnV0emVuLgorICAgICAtIGZhbGxzIGRpZSBaZWl0IGFiZ2VsYXVmZW4gb2RlciBkYXMgT2JqZWt0IHplcnN0b2VydCBpc3QsIHdpcmQgZGllCisgICAgICAgUHJvcGVydHkgYXVmIDAgZ2VzZXR6dAorICAgICAtIHZvciBkZW0gU2V0emVuIGltbWVyIGF1ZiBkaWUgRXhpc3RlbnogZWluZXMgZ3VlbHRpZ2VuIEhvb2tzCisgICAgICAgcHJ1ZWZlbiwgZWluZmFjaGVzIFVlYmVyc2NocmVpYmVuIGZ1ZWhydCBlaW5lcnNlaXRzIHp1IEZlaGxlcm4KKyAgICAgICBpbSBDb2RlIGFuZGVyZXIgdW5kIGlzdCBhbmRlcmVyc2VpdHMgdW5mYWlyIGdlZ2VudWViZXIgaWhuZW4KKworQkVJU1BJRUxFOgorICAgICAqKiogZGVyIFNwaWVsZXIgZXJoYWVsdCBlaW5lIFZlcnd1bmR1bmcsIGRpZSBpaG4gbWFuY2htYWwgYmVoaW5kZXJ0ICoqKgorICAgICBpZighcG9pbnRlcnAodG1wPVRQLT5RdWVyeVByb3AoUF9UTVBfQVRUQUNLX0hPT0spKSB8fAorICAgICAgICBzaXplb2YodG1wKTwzIHx8IHRtcFswXTw9dGltZSgpKSB7CisgICAgICAgVFAtPlNldFByb3AoUF9UTVBfQVRUQUNLX0hPT0ssCisJCSAgICh7dGltZSgpKzM2MDAsIHRoaXNfb2JqZWN0KCksICJ0ZXN0X2h1cnQifSkpOworICAgICAuLi4KKworICAgICAvLyBkaWUgZW50c3ByZWNoZW5kZSBNZXRob2RlLCBkaWUgYmVpIGplZGVtIEFuZ3JpZmYgdWViZXIgQXR0YWNrKCkKKyAgICAgLy8gZ2VydWZlbiB3aXJkIC4uLgorICAgICBpbnQgdGVzdF9odXJ0KG9iamVjdCBlbmVteSkgeworCisgICAgICAgLy8gbWl0IDEwJSBDaGFuY2UgZ2VuZXJlbGwgdW5kIDIwJSBDaGFuY2UgYmVpIGdyb2Vzc2VyZW4gR2VnbmVybgorICAgICAgIC8vIGJyaWNodCBkZXIgQW5ncmlmZiBhYiAuLi4gcHJldmlvdXNfb2JqZWN0KCkgaXN0IG5hdHVlcmxpY2gKKyAgICAgICAvLyBkZXIgQW5ncmVpZmVyCisgICAgICAgaWYoIXJhbmRvbSgxMCkgfHwKKyAgICAgICAgICAoZW5lbXktPlF1ZXJ5UHJvcChQX1NJWkUpPnByZXZpb3VzX29iamVjdCgpLT5RdWVyeVByb3AoUF9TSVpFKSAmJgorICAgICAgICAgICAhcmFuZG9tKDUpKSB7CisKKyAgICAgICAgICB0ZWxsX29iamVjdChwcmV2aW91c19vYmplY3QoKSwKKyAgICAgICAgICAgICJEZWluZSBXdW5kZSBzY2htZXJ6dCBkaWNoIHp1IHNlaHIgdW0gYW56dWdyZWlmZW4uXG4iKTsKKyAgICAgICAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQocHJldmlvdXNfb2JqZWN0KCkpLAorICAgICAgICAgICAgcHJldmlvdXNfb2JqZWN0KCktPk5hbWUoV0VSLDEpKyIgenVja3Qgdm9yIFNjaG1lcnplbiB6dXNhbW1lbi5cbiIsCisgICAgICAgICAgICAoe3ByZXZpb3VzX29iamVjdCgpfSkpOworICAgICAgICAgIHJldHVybiAwOworICAgICAgIH0KKworICAgICAgIC8vIGFuc29uc3RlbiBnZWh0IGRlciBBbmdyaWZmIHdlaXRlcgorICAgICAgIHJldHVybiAxOworICAgICB9CisKK1NJRUhFIEFVQ0g6CisgICAgIEFuZ3JpZmY6CUF0dGFjayhMKQorICAgICBTY2h1dHo6ICAgIERlZmVuZChMKQorICAgICBWZXJ3YW5kdDogIEludGVybmFsTW9kaWZ5QXR0YWNrKEwpLCBQX1RNUF9BVFRBQ0tfTU9ECQorICAgICBIb29rczoJUF9UTVBfRElFX0hPT0ssIFBfVE1QX01PVkVfSE9PSywgUF9UTVBfREVGRU5EX0hPT0sKKyAgICAgbmV1ZSBIb29rczogc3RkL2hvb2tzCisKKzA4LjEyLjIwMDgsIFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9vYnNvbGV0ZS9QX1RNUF9BVFRBQ0tfTU9EIGIvZG9jL3Byb3BzL29ic29sZXRlL1BfVE1QX0FUVEFDS19NT0QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ5MWMwYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9vYnNvbGV0ZS9QX1RNUF9BVFRBQ0tfTU9ECkBAIC0wLDAgKzEsMTEyIEBACisqKioqKioqKioqKioqKioqKioqKiogVkVSQUxURVRFIFBST1BFUlRZICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBEaWVzZSBQcm9wZXJ0eSBpc3QgdmVyYWx0ZXQuIEJpdHRlIG5pY2h0IG1laHIgaW4gbmV1ZW0gQ29kZSBudXR6ZW4uICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQX1RNUF9BVFRBQ0tfTU9ECisKK05BTUU6CisgICAgIFBfVE1QX0FUVEFDS19NT0QgICAgICAgICAgICAgICJhdHRhY2tfbW9kIgorCitERUZJTklFUlQgSU46CisgICAgIC9zeXMvbmV3X3NraWxscy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgTWl0dGVscyBkaWVzZXIgUHJvcGVydHkga29lbm5lbiBkaWUgQXR0YWNrZW4gZWluZXMgTGl2aW5ncyB0ZW1wb3JhZXIKKyAgICAgdmVyYWVuZGVydCB3ZXJkZW4uCisKKyAgICAgRXMgd2lyZCBhbiBkZW0gTGl2aW5nIGRpZSBQcm9wZXJ0eSBhbHMgbWluZGVzdGVucyAzLWVsZW1lbnRpZ2VzIEFycmF5CisgICAgICh7emVpdHB1bmt0LCBvYmpla3QsIG1ldGhvZGUsIC4uLn0pCisgICAgIGdlc2V0enQgdW5kIGRpZSBNZXRob2RlICdtZXRob2RlJyB3aXJkIGRhbm4gd2FlaHJlbmQgZGVzIEF0dGFjaygpIGRlcworICAgICBMZWJld2VzZW5zIGluICdvYmpla3QnIGF1ZmdlcnVmZW4sIHNvbGFuZ2UgdGltZSgpPCd6ZWl0cHVua3QnLgorCisgICAgIERlciBNZXRob2RlIHdpcmQgYmVpbSBBdWZydWYgZWluIEtvcGllIGRlcyBNYXBwaW5ncyB1ZWJlcmdlYmVuLCBpbiBkZW0KKyAgICAgZGllIGJpc2hlcmlnZW4gV2VydGUgZGVzIEFuZ3JpZmZlcyB2ZXJtZXJrdCBzaW5kLgorICAgICBBdWZiYXUgdm9uIE1hcHBpbmcgJ2FpbmZvJzoKKyAgICAgKFsgU0lfRU5FTVkgOiAgICAgICAgICAgb2JqZWN0IEFuZ3JlaWZlciwJCQkoLT4gRGVmZW5kKQorICAgICAgICBTSV9TUEVMTCA6ICAgICAgICAgICAwLzEvYXJyYXkgU3BlbGxwYXJhbWV0ZXIsCQkoLT4gRGVmZW5kKQorICAgICAgICBQX1dFQVBPTiA6ICAgICAgICAgICAtIG9kZXIgV2FmZmUsCisgICAgICAgIFNJX1NLSUxMREFNQUdFX01TRzogIHN0cmluZyBBbmdyaWZmc21lbGR1bmdzZW5kZSBhbiBSYXVtLAorICAgICAgICBTSV9TS0lMTERBTUFHRV9NU0cyOiBzdHJpbmcgQW5ncmlmZnNtZWxkdW5nc2VuZGUgYW4gS2FlbXBmZW5kZSwKKyAgICAgICAgU0lfU0tJTExEQU1BR0U6ICAgICAgaW50IFNjaGFkZW4gaW4gWmVobnRlbCBIUCAoU2tpbGxzIGJpcyBhdWYgUmFzc2UKKwkJCSAgICAgZHJpbiEpCQkJCSgtPiBEZWZlbmQpLAorICAgICAgICBTSV9TS0lMTERBTUFHRV9UWVBFOiBzdHJpbmcvc3RyaW5nKiBTY2hhZGVuc3R5cGVuLAkoLT4gRGVmZW5kKQorICAgICAgICBQX1dFQVBPTl9UWVBFOiAgICAgICBzdHJpbmcgV2FmZmVudHlwIChjb21iYXQuaCksCisgICAgICAgIFBfV0M6CQkgICAgIC0gb2RlciBpbnQgV0MgZGVyIFdhZmZlL0hhbmQsCisgICAgICAgIFBfTlJfSEFORFM6CSAgICAgLSBvZGVyIGludCBIYW5kcyBkZXIgV2FmZmUvSGFuZCwKKyAgICAgXSk7CisKKyAgICAgR2lidCBkaWUgTWV0aG9kZToKKyAgICAgLSAwIG9kZXIga2VpbiBNYXBwaW5nIHp1cnVlY2ssIGZ1ZWhydCBkYXMgenVtIEFiYnJ1Y2ggZGVyIEF0dGFja2UKKyAgICAgICAtPiBkYSBpbnp3aXNjaGVuIFdhZmZlbiBhYmdlZnJhZ3Qgd3VyZGVuLCBrb2VubmVuIHNjaG9uIE1lbGR1bmdlbgorICAgICAgICAgIHZvbiBkaWVzZW4gYXVzZ2VnZWJlbiB3b3JkZW4gc2VpbgorICAgICAtIGVpbiBsZWVyZXMgTWFwcGluZyAoIChbXSkgKSB6dXJ1ZWNrLCBmdWVocnQgZGFzIHp1IGtlaW5lciBNb2RpZmlrYXRpb24KKyAgICAgLSBlaW4gTWFwcGluZyBtaXQgdmVyYWVuZGVydGVuIFdlcnRlbiB6dXJ1ZWNrLCB3ZXJkZW4gZGllc2UgaW4gZGFzCisgICAgICAgQW5ncmlmZnNtYXBwaW5nIGtvcGllcnQKKyAgICAgICBEaWUgZ2VhZW5kZXJ0ZW4gV2VydGUgd2VyZGVuIHRlaWx3ZWlzZSB2b24gU2tpbGxSZXNUcmFuc2ZlcigpIGluCisgICAgICAgZGVuIGVpZ2VudGxpY2hlbiBBbmdyaWZmIHVlYmVybm9tbWVuLgorCitCRU1FUktVTkdFTjoKKyAgICAgLSBmYWxscyBkaWUgWmVpdCBhYmdlbGF1ZmVuIG9kZXIgZGFzIE9iamVrdCB6ZXJzdG9lcnQgaXN0LCB3aXJkIGRpZQorICAgICAgIFByb3BlcnR5IGF1ZiAwIGdlc2V0enQKKyAgICAgLSB2b3IgZGVtIFNldHplbiBpbW1lciBhdWYgZGllIEV4aXN0ZW56IGVpbmVzIGd1ZWx0aWdlbiBNb2RpZmllcnMKKyAgICAgICBwcnVlZmVuLCBlaW5mYWNoZXMgVWViZXJzY2hyZWliZW4gZnVlaHJ0IGVpbmVyc2VpdHMgenUgRmVobGVybgorICAgICAgIGltIENvZGUgYW5kZXJlciB1bmQgaXN0IGFuZGVyZXJzZWl0cyB1bmZhaXIgZ2VnZW51ZWJlciBpaG5lbgorCitCRUlTUElFTEU6CisgICAgICoqKiBlaW4gYmVzb25kZXIgaGVpc3NlciBTZWdlbiBtb2RpZml6aWVydCBkaWUgQXR0YWNrZW4gZGVzIFNwaWVsZXJzICoqKgorICAgICBpbnQgYWN0aW9uX3NlZ2VuKCkgeworICAgICAgIC4uLgorICAgICAgIG1peGVkICp0bXA7CisKKyAgICAgICAvLyBwcnVlZmVuLCBvYiBuaWNodCBlaW4gYW5kZXJlciBNb2RpZmllciBleGlzdGllcnQKKyAgICAgICBpZighcG9pbnRlcnAodG1wPVRQLT5RdWVyeVByb3AoUF9UTVBfQVRUQUNLX01PRCkpIHx8CisgICAgICAgICAgc2l6ZW9mKHRtcCk8MyB8fCB0bXBbMF08PXRpbWUoKSkgeworCisgICAgICAgICBvYmplY3Qgd2llbGQ7CisgICAgICAgICB3aWVsZD1UUC0+UXVlcnlQcm9wKFBfV0VBUE9OKTsKKworICAgICAgICAgd3JpdGUoYnJlYWtfc3RyaW5nKAorICAgICAgICAgICAiRGVyIFByaWVzdGVyIGRlciBGbGFtbWUgd2VpaHQgIisKKyAgICAgICAgICAgKHdpZWxkP3dpZWxkLT5uYW1lKFdFTiwxKToiZGVpbmUgSGFlbmRlIikrIi4iLCA3OCkpOworCisgICAgICAgICAvLyBzZXR6ZW4gZGVzIE1vZGlmaWVycyAuLiAzMC00MCBTZWt1bmRlbiBndWVsdGlnCisgICAgICAgICBUUC0+U2V0UHJvcChQX1RNUF9BVFRBQ0tfTU9ELAorCSAgICAgICAgICAgICAgKHt0aW1lKCkrMzArcmFuZG9tKDEwKSwgdGhpc19vYmplY3QoKSwgIm1vZGZ1biJ9KSk7CisgICAgICAgIH0gZWxzZSAuLi4KKyAgICAgICAgLi4uCisgICAgICByZXR1cm4gMTsKKyAgICAgfQorCisgICAgIC8vIGRpZSBlaWdlbnRsaWNoIE1ldGhvZGUsIGRpZSB3YWVocmVuZCBkZXMgQW5ncmlmZnMgZ2VydWZlbiB3aXJkCisgICAgIG1hcHBpbmcgbW9kZnVuKG1hcHBpbmcgYWluZm8pIHsKKyAgICAgICBtYXBwaW5nIHJldDsKKworICAgICAgIC8vIFJldHVybndlcnQgaXN0IGltbWVyIGVpbiBNYXBwaW5nLCBkYW1pdCBkaWUgQXR0YWNrZSB3ZWl0ZXJnZWh0CisgICAgICAgcmV0PW1fYWxsb2NhdGUoMCwxKTsKKworICAgICAgIC8vIG1hZ2lzY2hlIFdhZmZlbiBvZGVyIFNwcnVlY2hlIHdlcmRlbiBuaWNodCB2ZXJiZXNzZXJ0CisgICAgICAgaWYoYWluZm9bUF9XRUFQT05fVFlQRV0hPVdUX01BR0lDKSB7CisgICAgICAgICAvLyBzb25zdCBWZXJiZXNzZXJ1bmdlbiAuLi4gRmV1ZXIgYWRkaWVyZW4gLi4uCisgICAgICAgICByZXRbU0lfU0tJTExEQU1BR0VfVFlQRV09KGFpbmZvW1NJX1NLSUxMREFNQUdFX1RZUEVdfHwoe30pKSsKKwkJCQkoe0RUX0ZJUkV9KTsKKwkgLy8gLi4uIHVuZCBiZWkgV2FmZmUgTWVsZHVuZ2VuIGFucGFzc2VuCisgICAgICAgICBpZihhaW5mb1tQX1dFQVBPTl0pIHsKKyAgICAgICAgICAgcmV0W1NJX1NLSUxMREFNQUdFX01TR109CisgICAgICAgICAgICAgIiBtaXQgc2VuZ2VuZGVtICIrYWluZm9bUF9XRUFQT05dLT5uYW1lKFJBVyk7CisgICAgICAgICAgIHJldFtTSV9TS0lMTERBTUFHRV9NU0cyXT0KKyAgICAgICAgICAgICAiIG1pdCBzZW5nZW5kZW0gIithaW5mb1tQX1dFQVBPTl0tPm5hbWUoUkFXKTsKKyAgICAgICAgIH0KKyAgICAgICB9CisKKyAgICAgICByZXR1cm4gcmV0OworICAgICB9CisKK1NJRUhFIEFVQ0g6CisgICAgIEFuZ3JpZmY6CUF0dGFjayhMKQorICAgICBTY2h1dHo6ICAgIERlZmVuZChMKQorICAgICBWZXJ3YW5kdDogIEludGVybmFsTW9kaWZ5QXR0YWNrKEwpCisJCVBfVE1QX0FUVEFDS19IT09LCisJCVBfVE1QX0RFRkVORF9IT09LCisgICAgIFNvbnN0aWdlczogU2tpbGxSZXNUcmFuc2ZlcihMKQorICAgICBIb29rczoJUF9UTVBfRElFX0hPT0ssIFBfVE1QX01PVkVfSE9PSworCisxMC5GZWIgMjAwNSBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3BzL29ic29sZXRlL1BfVE1QX0RFRkVORF9IT09LIGIvZG9jL3Byb3BzL29ic29sZXRlL1BfVE1QX0RFRkVORF9IT09LCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NmU2M2EKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvb2Jzb2xldGUvUF9UTVBfREVGRU5EX0hPT0sKQEAgLTAsMCArMSwxMTAgQEAKKyoqKioqKioqKioqKioqKioqKioqKiBWRVJBTFRFVEUgUFJPUEVSVFkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIERpZXNlIFByb3BlcnR5IGlzdCB2ZXJhbHRldC4gQml0dGUgbmljaHQgbWVociBpbiBuZXVlbSBDb2RlIG51dHplbi4gKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BfVE1QX0RFRkVORF9IT09LCisKK05BTUU6CisgICAgIFBfVE1QX0RFRkVORF9IT09LICAgICAgICAgICAgICJkZWZlbmRfaG9vayIKKworREVGSU5JRVJUIElOOgorICAgICAvc3lzL25ld19za2lsbHMuaAorCitCRVNDSFJFSUJVTkc6CisgICAgIE1pdHRlbHMgZGllc2VyIFByb3BlcnR5IGtvZW5uZW4gZGllIEFid2VocmVuIGVpbmVzIExpdmluZ3MgdGVtcG9yYWVyCisgICAgIHZlcmFlbmRlcnQgd2VyZGVuLgorCisgICAgIEVzIHdpcmQgYW4gZGVtIExpdmluZyBkaWUgUHJvcGVydHkgYWxzIG1pbmRlc3RlbnMgMy1lbGVtZW50aWdlcyBBcnJheQorICAgICAoe3plaXRwdW5rdCwgb2JqZWt0LCBtZXRob2RlLCAuLi59KQorICAgICBnZXNldHp0IHVuZCBkaWUgTWV0aG9kZSAnbWV0aG9kZScgd2lyZCBkYW5uIHdhZWhyZW5kIGRlcyBEZWZlbmQoKSBkZXMKKyAgICAgTGViZXdlc2VucyBpbiAnb2JqZWt0JyBhdWZnZXJ1ZmVuLCBzb2xhbmdlIHRpbWUoKTwnemVpdHB1bmt0Jy4KKworICAgICBEZXIgTWV0aG9kZSB3ZXJkZW4gZGllIFBhcmFtZXRlciBkZXIgRGVmZW5kKCkgdWViZXJnZWJlbjoKKyAgICAgaW50IGRhbSwgbWl4ZWQgZGFtX3R5cGUsIG1peGVkIHNwZWxsLCBvYmplY3QgZW5lbXkKKyAgICAgLSBzcGVsbCBpc3QgZGVmaW5pdGl2IGVpbiBNYXBwaW5nIC0gZWluIGFuIERlZmVuZCgpIHVlYmVyZ2ViZW5lcgorICAgICAgIGludC1XZXJ0IHd1cmRlIGFlcXVpdmFsZW50IHVtZ2VzZXR6dC4KKyAgICAgLSBkYW1fdHlwZSBpc3QgZGVmaW5pdGl2IGVpbiBBcnJheSB2b24gU2NoYWRlbnN3ZXJ0ZW4gb2RlciBlaW5lbSBXZXJ0CisKKyAgICAgWnVkZW0gZmluZGV0IGRlciBBdWZydWYgZGVyIE1ldGhvZGUgbmFjaCBkZW0gQWJhcmJlaXRlbiBkZXIgUF9ERUZFTkRFUlMKKyAgICAgc3RhdHQsIGRpZXNlIGtvZW5uZW4gYWxzbyB3ZWl0ZXJlIE1vZGlmaWthdGlvbmVuIHZvcmdlbm9tbWVuIGhhYmVuLgorCisgICAgIEdpYnQgZGllIEZ1bmt0aW9uOgorICAgICAtIDAgenVydWVjaywgd2lyZCBEZWZlbmQoKSBhYmdlYnJvY2hlbiAodW5kIGRhbWl0IGRlciBTY2hhZGVuIHZvZWxsaWcKKyAgICAgICBhYmdlZmFuZ2VuKSAtIG51ciBub2NoIGRpZSBGbHVjaHQgd2lyZCBnZXBydWVmdAorICAgICAtIGVpbiAzLWVsZW1lbnRpZ2VzIEFycmF5ICh7c2NoYWRlbiwgc2NoYWRlbnN0eXBlbiwgc3BlbGx9KSB6dXJ1ZWNrLAorICAgICAgIHdlcmRlbiBkaWVzZSBXZXJ0ZSBpbiBkZXIgRGVmZW5kKCkgYW4gU3RlbGxlIGRlciB1ZWJlcmdlYmVuZW4gV2VydGUKKyAgICAgICB2ZXJ3ZW5kZXQKKyAgICAgLSB3ZWRlciBub2NoIHp1cnVlY2ssIHdpcmQgZGFzIEVyZ2VibmlzIGlnbm9yaWVydCB1bmQgZGllIERlZmVuZCBsYWV1ZnQKKyAgICAgICByZWd1bGFlciB3ZWl0ZXIKKworQkVNRVJLVU5HRU46CisgICAgIC0gQml0dGUgZGFzIG5ldWVyZSBIb29rc3lzdGVtIChzLiBNYW5wYWdlIHN0ZC9ob29rcykgYmVudXR6ZW4uCisgICAgIC0gZmFsbHMgZGllIFplaXQgYWJnZWxhdWZlbiBvZGVyIGRhcyBPYmpla3QgemVyc3RvZXJ0IGlzdCwgd2lyZCBkaWUKKyAgICAgICBQcm9wZXJ0eSBhdWYgMCBnZXNldHp0CisgICAgIC0gdm9yIGRlbSBTZXR6ZW4gaW1tZXIgYXVmIGRpZSBFeGlzdGVueiBlaW5lcyBndWVsdGlnZW4gSG9va3MKKyAgICAgICBwcnVlZmVuLCBlaW5mYWNoZXMgVWViZXJzY2hyZWliZW4gZnVlaHJ0IGVpbmVyc2VpdHMgenUgRmVobGVybgorICAgICAgIGltIENvZGUgYW5kZXJlciB1bmQgaXN0IGFuZGVyZXJzZWl0cyB1bmZhaXIgZ2VnZW51ZWJlciBpaG5lbgorCitCRUlTUElFTDoKKyAgICAgKioqIGVpbiBncnVlbmVyIFNjaHV0enphdWJlciAqKioKKyAgICAgLy8gU2V0emVuIGRlciBQcm9wCisgICAgIC4uLgorICAgICB0bXA9VFAtPlF1ZXJ5UHJvcChQX1RNUF9ERUZFTkRfSE9PSyk7CisKKyAgICAgLy8gZWluIGV0d2FzIGF1c2Z1ZWhybGljaGVyIENoZWNrLCBvYiB3aXIgdWViZXJzY2hyZWliZW4ga29lbm5lbiwKKyAgICAgLy8gRXhpc3RlbnogJiYgR3VlbHRpZ2tlaXQKKyAgICAgaWYocG9pbnRlcnAodG1wKSAmJiBzaXplb2YodG1wKSAmJiBpbnRwKHRtcFswXSkgJiYgKHRpbWUoKTx0bXBbMF0pKQorICAgICAgd3JpdGUoIkRlciBaYXViZXIga2xhcHB0IG5pY2h0IVxuIik7CisgICAgIGVsc2UgeworICAgICAgLy8gZGVyIFphdWJlciBnaWx0IGVpbmUgU3R1bmRlCisgICAgICBUUC0+U2V0UHJvcChQX1RNUF9ERUZFTkRfSE9PSywoe3RpbWUoKSszNjAwLFRPLCJhYndlaHJmdW4iKTsKKyAgICAgIHdyaXRlKCJFaW4gWmF1YmVyIGxlZ3Qgc2ljaCBhdWYgZGljaC5cbiIpOworICAgICB9CisgICAgIC4uLgorCisgICAgIC8vIGRpZSBnZXJ1ZmVuZSBNZXRob2RlCisgICAgIG1peGVkIGFid2VocmZ1bihpbnQgZGFtLCBzdHJpbmcqIGRhbV90eXBlLCBtYXBwaW5nIHNwZWxsLCBvYmplY3QgZW4pIHsKKyAgICAgIC8vIGtlaW5lIHJla3Vyc2l2ZW4gU2NoYWVkZW4gYWJmYW5nZW4gLi4uIG1pbmRlc3RlbnMgZWluIG1hZ2lzY2hlcgorICAgICAgLy8gbXVzcyBhdWNoIGRhYmVpIHNlaW4KKyAgICAgIGlmKCghbWFwcGluZ3Aoc3BlbGwpIHx8ICFzcGVsbFtTUF9SRUNVUlNJVkVdKSAmJgorICAgICAgICAgc2l6ZW9mKGZpbHRlcihkYW1fdHlwZSxNQUdJQ0FMX0RBTUFHRV9UWVBFUykpKSB7CisKKyAgICAgICAvLyBtaXQgMTAlIFdoa2VpdCBzY2h1ZXR6dCBkZXIgWmF1YmVyIHRvdGFsCisgICAgICAgaWYoIXJhbmRvbSgxMCkpIHsKKyAgICAgICAgdGVsbF9vYmplY3QocHJldmlvdXNfb2JqZWN0KCksCisgICAgICAgICAgIkRlaW4gWmF1YmVyIGdsZWlzc3QgcnVuZCB1bSBkaWNoIGdydWVuIGF1Zi5cbiIpOworICAgICAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQocHJldmlvdXNfb2JqZWN0KCkpLCBicmVha19zdHJpbmcoCisgICAgICAgICAgcHJldmlvdXNfb2JqZWN0KCktPk5hbWUoV0VTU0VOKSsiIEhhdXQgZ2xlaXNzdCBydW5kIHVtICIrCisgICAgICAgICAgcHJldmlvdXNfb2JqZWN0KCktPlF1ZXJ5UHJvbm91bihXRU4pKyIgZ3J1ZW4gYXVmLiIsNzgpLAorICAgICAgICAgICh7cHJldmlvdXNfb2JqZWN0KCl9KSk7CisKKyAgICAgICAgLy8gbWFuY2htYWwgZ2VodCBkZXIgWmF1YmVyIGRhYmVpIGVuZGd1ZWx0aWcga2FwdXR0CisgICAgICAgIGlmKCFyYW5kb20oMTApKSBwcmV2aW91c19vYmplY3QoKS0+U2V0UHJvcChQX1RNUF9ERUZFTkRfSE9PSywgMCk7CisKKyAgICAgICAgcmV0dXJuIDA7CQkJLy8gdm9sbGVzIEFiZmFuZ2VuIGRlcyBBbmdyaWZmcworICAgICAgIH0KKworICAgICAgIC8vIGRlciBaYXViZXIgc2NodWV0enQgYXVmIGplZGVuIEZhbGwgaW1tZXIgZWluIGJpc2NoZW4KKyAgICAgICB0ZWxsX29iamVjdChwcmV2aW91c19vYmplY3QoKSwKKyAgICAgICAgICJEZWluIFphdWJlciBmbGFja2VydCBydW5kIHVtIGRpY2ggZ3J1ZW4gYXVmLlxuIik7CisgICAgICAgdGVsbF9yb29tKGVudmlyb25tZW50KHByZXZpb3VzX29iamVjdCgpKSwgYnJlYWtfc3RyaW5nKAorICAgICAgICAgcHJldmlvdXNfb2JqZWN0KCktPk5hbWUoV0VTU0VOKSsiIEhhdXQgZmxhY2tlcnQgcnVuZCB1bSAiKworICAgICAgICAgcHJldmlvdXNfb2JqZWN0KCktPlF1ZXJ5UHJvbm91bihXRU4pKyIgZ3J1ZW4gYXVmLiIsNzgpLAorICAgICAgICAgKHtwcmV2aW91c19vYmplY3QoKX0pKTsKKyAgICAgICBkYW09KDcrcmFuZG9tKDIpKSpkYW0vMTA7CS8vIFNjaGFkZW4gcmVkdXppZXJlbgorCisgICAgICAgcmV0dXJuKCh7ZGFtLCBkYW1fdHlwZSwgc3BlbGx9KSk7CisgICAgICB9CisKKyAgICAgIC8vIGRlciBaYXViZXIgc2NodWV0enQgZGFubiBnYXIgbmljaHQgLi4uCisgICAgICByZXR1cm4gMTsKKyAgICAgfQorCitTSUVIRSBBVUNIOgorICAgICBBbmdyaWZmOglBdHRhY2soTCkKKyAgICAgU2NodXR6OiAgICBEZWZlbmQoTCkKKyAgICAgVmVyd2FuZHQ6CUludGVybmFsTW9kaWZ5RGVmZW5kKEwpLCBQX1RNUF9BVFRBQ0tfTU9ECisgICAgIEhvb2tzOglQX1RNUF9ESUVfSE9PSywgUF9UTVBfTU9WRV9IT09LLCBQX1RNUF9BVFRBQ0tfSE9PSworICAgICBuZXVlIEhvb2tzOiBzdGQvaG9va3MKKworMDguMTIuMjAwOCwgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvb2Jzb2xldGUvUF9UTVBfRElFX0hPT0sgYi9kb2MvcHJvcHMvb2Jzb2xldGUvUF9UTVBfRElFX0hPT0sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QxODkxNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9vYnNvbGV0ZS9QX1RNUF9ESUVfSE9PSwpAQCAtMCwwICsxLDcwIEBACisqKioqKioqKioqKioqKioqKioqKiogVkVSQUxURVRFIFBST1BFUlRZICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBEaWVzZSBQcm9wZXJ0eSBpc3QgdmVyYWx0ZXQuIEJpdHRlIG5pY2h0IG1laHIgaW4gbmV1ZW0gQ29kZSBudXR6ZW4uICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQX1RNUF9ESUVfSE9PSworCitOQU1FOgorICAgIFBfVE1QX0RJRV9IT09LICAgICAgICAgICAgICAgICJkaWVfaG9vayIKKworREVGSU5JRVJUIElOOgorICAgIC9zeXMvbmV3X3NraWxscy5oCisKK0JFU0NIUkVJQlVORzoKKyAgICAgTWl0dGVscyBkaWVzZXIgUHJvcGVydHkga2FubiBkZXIgVG9kIGVpbmVzIExpdmluZ3MgYWJnZXdlbmRldCB3ZXJkZW4uCisKKyAgICAgRXMgd2lyZCBhbiBkZW0gTGl2aW5nIGRpZSBQcm9wZXJ0eSBhbHMgbWluZGVzdGVucyAzLWVsZW1lbnRpZ2VzIEFycmF5CisgICAgICh7emVpdHB1bmt0LCBvYmpla3QsIG1ldGhvZGUsIC4uLn0pCisgICAgIGdlc2V0enQgdW5kIGRpZSBNZXRob2RlICdtZXRob2RlJyB3aXJkIGRhbm4gd2FlaHJlbmQgZGVzIGRpZSgpIGRlcworICAgICBMZWJld2VzZW5zIGluICdvYmpla3QnIGF1ZmdlcnVmZW4sIHNvbGFuZ2UgdGltZSgpPCd6ZWl0cHVua3QnLgorICAgICBCZWkgR2Vpc3Rlcm4gd2lyZCBkZXIgSG9vayBuaWNodCBnZXJ1ZmVuLgorCisgICAgIERlciBNZXRob2RlIHdpcmQgZWluIGludCB1ZWJlcmdlYmVuLCBvYiBkYXMgTGl2aW5nIE9wZmVyIHZvbiBHaWZ0CisgICAgIChQX1BPSVNPTikgd2FyLgorCisgICAgIEdpYnQgZGllIEZ1bmt0aW9uIGVpbmVuIFdlcnQgIT0gMCB6dXJ1ZWNrLCB3aXJkIGRpZSgpIHNvZm9ydCBhYmdlYnJvY2hlbgorICAgICB1bmQgZGFzIExpdmluZyBzdGlyYnQgbmljaHQuCisKK0JFTUVSS1VOR0VOOgorICAgIC0gQml0dGUgZGFzIG5ldWVyZSBIb29rc3lzdGVtIChzLiBNYW5wYWdlIHN0ZC9ob29rcykgYmVudXR6ZW4uCisgICAgLSBmYWxscyBkaWUgWmVpdCBhYmdlbGF1ZmVuIG9kZXIgZGFzIE9iamVrdCB6ZXJzdG9lcnQgaXN0LCB3aXJkIGRpZQorICAgICAgUHJvcGVydHkgYXVmIDAgZ2VzZXR6dAorICAgIC0gdm9yIGRlbSBTZXR6ZW4gaW1tZXIgYXVmIGRpZSBFeGlzdGVueiBlaW5lcyBndWVsdGlnZW4gSG9va3MKKyAgICAgIHBydWVmZW4sIGVpbmZhY2hlcyBVZWJlcnNjaHJlaWJlbiBmdWVocnQgZWluZXJzZWl0cyB6dSBGZWhsZXJuCisgICAgICBpbSBDb2RlIGFuZGVyZXIgdW5kIGlzdCBhbmRlcmVyc2VpdHMgdW5mYWlyIGdlZ2VudWViZXIgaWhuZW4KKworQkVJU1BJRUxFOgorICAgICAqKiogZWluIGJlc29uZGVyZXIgR2lmdHNjaHV0eiAuLiB3aXJrdCBiZWltIFRvZCAqKioKKyAgICAgLy8gcHJ1ZWZlbiwgb2IgbmljaHQgZWluIGFuZGVyZXIgTW9kaWZpZXIgZXhpc3RpZXJ0CisgICAgIGlmKCFwb2ludGVycCh0bXA9VFAtPlF1ZXJ5UHJvcChQX1RNUF9ESUVfSE9PSykpIHx8CisgICAgICAgIHNpemVvZih0bXApPDMgfHwgdG1wWzBdPD10aW1lKCkpIHsKKyAgICAgICBUUC0+U2V0UHJvcChQX1RNUF9ESUVfSE9PSywKKwkgICAgICAgICAgICh7dGltZSgpKzEyMCtyYW5kb20oMTApLCB0aGlzX29iamVjdCgpLCAicHJldmVudF9kaWUifSkpOworCisgICAgIC8vIGRpZSBnZXJ1ZmVuZSBNZXRob2RlCisgICAgIGludCBwcmV2ZW50X2RpZShpbnQgcG9pc29uKSB7CisgICAgICAgaW50IHJldDsKKworICAgICAgIGlmKHBvaXNvbikgeworICAgICAgICAgdGVsbF9vYmplY3QocHJldmlvdXNfb2JqZWN0KCksCisgICAgICAgICAgICJFaW4gWmF1YmVyIHJlaW5pZ3QgaW0gTW9tZW50IGRlcyBUb2RlcyBkZWluIEJsdXQhXG4iKTsKKyAgICAgICAgIHRlbGxfb2JqZWN0KGVudmlyb25tZW50KHByZXZpb3VzX29iamVjdCgpKSwKKyAgICAgICAgICAgcHJldmlvdXNfb2JqZWN0KCktPk5hbWUoV0VSLDEpKyIgd2lyZCB2b24gTGljaHRlcm4gdW1odWVsbHQuXG4iLAorICAgICAgICAgICAoe3ByZXZpb3VzX29iamVjdCgpfSkpOworCisgICAgICAgICByZXQ9MTsKKyAgICAgICB9CisKKyAgICAgICAvLyB3aXIgaGVsZmVuIG51ciBlaW5tYWwgLi4uIHVuZCBlaW4gVG9kIHZlcm5pY2h0ZXQgZGllIEhpbGZlIGF1Y2gKKyAgICAgICBwcmV2aW91c19vYmplY3QoKS0+U2V0UHJvcChQX1RNUF9ESUVfSE9PSywgMCk7CisKKyAgICAgICByZXR1cm4gcmV0OworICAgICB9CisKK1NJRUhFIEFVQ0g6CisgICAgIFRvZDoJZGllKEwpCisgICAgIFNvbnN0aWdlczogUF9QT0lTT04sIFBfS0lMTFMsIFBfR0hPU1QKKyAgICAgSG9va3M6CVBfVE1QX01PVkVfSE9PSywgUF9UTVBfQVRUQUNLX0hPT0ssIFBfVE1QX0RFRkVORF9IT09LCisgICAgIG5ldWUgSG9va3M6IHN0ZC9ob29rcworCiswOC4xMi4yMDA4LCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9wcm9wcy9vYnNvbGV0ZS9QX1RNUF9NT1ZFX0hPT0sgYi9kb2MvcHJvcHMvb2Jzb2xldGUvUF9UTVBfTU9WRV9IT09LCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyOGEwNjcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvb2Jzb2xldGUvUF9UTVBfTU9WRV9IT09LCkBAIC0wLDAgKzEsNDIgQEAKKyoqKioqKioqKioqKioqKioqKioqKiBWRVJBTFRFVEUgUFJPUEVSVFkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIERpZXNlIFByb3BlcnR5IGlzdCB2ZXJhbHRldC4gQml0dGUgbmljaHQgbWVociBpbiBuZXVlbSBDb2RlIG51dHplbi4gKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK05BTUU6CisgICAgUF9UTVBfTU9WRV9IT09LICAgICAgICAgICAgICJtb3ZlX2hvb2siCisKK0RFRklOSUVSVCBJTjoKKyAgICAvc3lzL25ld19za2lsbHMuaAorCitCRVNDSFJFSUJVTkc6CisgICAgTWluZGVzdGVucyAzLWVsZW1lbnRpZ2VzIEFycmF5ICh7emVpdHB1bmt0LCBvYmpla3QsIGZ1bmt0aW9uLCAuLi59KS4KKyAgICBEaWUgRnVua3Rpb24gd2lyZCBpbSAnb2JqZWt0JyBtaXQgZGVuIGdsZWljaGVuIFBhcmFtZXRlcm4gd2llIG1vdmUoKQorICAgIG5hY2ggZGVyIEFiZnJhZ2UgYXVmIFBfTk9fVFBPUlQgYXVmZ2VydWZlbiwgd2VubiBkZXIgJ3plaXRwdW5rdCcKKyAgICBub2NoIG5pY2h0IHVlYmVyc2Nocml0dGVuIGlzdC4gV2VubiBkaWUgRnVua3Rpb24gZXR3YXMgYW5kZXJlcyBhbHMgZWluCisgICAgNS1lbGVtZW50aWdlcyBBcnJheSAoe2Rlc3QsIG1ldGhvZHMsIGRpcmVjdGlvbiwgdGV4dG91dCwgdGV4dGlufSkKKyAgICBvZGVyIC0xIHp1cnVlY2tnaWJ0LCB3aXJkIG1vdmUoKSBub3JtYWwgYXVzZ2VmdWVocnQsIGFuc29uc3RlbiB3ZXJkZW4gZGllCisgICAgNSBtb3ZlLVBhcmFtZXRlciBkdXJjaCBkaWUgQXJyYXktRWludHJhZWdlIGVyc2V0enQgYnp3LiB3aXJkIGJlaSBlaW5lbQorICAgIFJ1ZWNrZ2FiZXdlcnQgdm9uIC0xIGRhcyBtb3ZlKCkgYWJnZWJyb2NoZW4uIEluIGxldHp0ZXJlbSBGYWxsIGlzdAorICAgIGRpZSBGdW5rdGlvbiBkYWZ1ZXIgdmVyYW50d29ydGxpY2gsIGVpbmUgZW50c3ByLiBNZWxkdW5nIGFuIGRlbgorICAgIFNwaWVsZXIgYXVzenVnZWJlbiEKKworSElOV0VJUzoKKyAgICBGYWxscyBtYW4gZWluZW0gU3BpZWxlciBlaW5lbiBNb3ZlLUhvb2sgc2V0enQsIGlzdCBlcyByYXRzYW0sIGltCisgICAgTW92ZS1Ib29rIHp1IHBydWVmZW4sIG9iIGRhcyBTcGllbGVyb2JqZWt0IG5hY2ggQWJhcmJlaXR1bmcgZGVyIEhvb2stCisgICAgRnVua3Rpb24gbm9jaCBsZWJ0LiBBbnNvbnN0ZW4gd2lyZCBlaW4gZG9wcGVsdGVzIG1vdmUoKSBhdXNnZWZ1ZWhydDoKKyAgICBpbiBkZW4gVG9kZXNyYXVtIHVuZCBkaXJla3Qgd2llZGVyIHp1cnVlY2sgenVyIExlaWNoZS4KKworQkVNRVJLVU5HRU46CisgICAgIC0gQml0dGUgZGFzIG5ldWVyZSBIb29rc3lzdGVtIChzLiBNYW5wYWdlIHN0ZC9ob29rcykgYmVudXR6ZW4uCisgICAgIC0gZmFsbHMgZGllIFplaXQgYWJnZWxhdWZlbiBvZGVyIGRhcyBPYmpla3QgemVyc3RvZXJ0IGlzdCwgd2lyZCBkaWUKKyAgICAgICBQcm9wZXJ0eSBhdWYgMCBnZXNldHp0CisgICAgIC0gdm9yIGRlbSBTZXR6ZW4gaW1tZXIgYXVmIGRpZSBFeGlzdGVueiBlaW5lcyBndWVsdGlnZW4gSG9va3MKKyAgICAgICBwcnVlZmVuLCBlaW5mYWNoZXMgVWViZXJzY2hyZWliZW4gZnVlaHJ0IGVpbmVyc2VpdHMgenUgRmVobGVybgorICAgICAgIGltIENvZGUgYW5kZXJlciB1bmQgaXN0IGFuZGVyZXJzZWl0cyB1bmZhaXIgZ2VnZW51ZWJlciBpaG5lbgorCitTSUVIRSBBVUNIOgorICAgICBCZXdlZ3VuZzoJbW92ZShMKSwgTm90aWZ5TW92ZSgpLCBQcmV2ZW50TW92ZSgpCisgICAgIEhvb2tzOglQX1RNUF9ESUVfSE9PSywgUF9UTVBfREVGRU5EX0hPT0ssIFBfVE1QX0FUVEFDS19IT09LCisgICAgIG5ldWUgSG9va3M6IHN0ZC9ob29rcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiswOC4xMi4yMDA4LCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvc2tpbGxfaW5mb19saXN0ZSBiL2RvYy9wcm9wcy9za2lsbF9pbmZvX2xpc3RlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMWY2MTYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHJvcHMvc2tpbGxfaW5mb19saXN0ZQpAQCAtMCwwICsxLDMxNSBAQAorU0lfKgorREVGSU5JRVJUIElOOgorICAgIC9zeXMvbmV3c2tpbGxzLmgKKworQkVTQ0hSRUlCVU5HOgorICAgIERpZSBmb2xnZW5kZSBMaXN0ZSBkZXIgU0ktVHlwZW4gaXN0IGdyb2IgbmFjaCBHdWVsdGlna2VpdCBmdWVyIFNraWxscworICAgIHVuZCBTcGVsbHMgc29ydGllcnQuCisgICAgCisgICAgQW53ZW5kdW5nc29ydGUgZGVyIFNJXy1XZXJ0ZSBzaW5kOgorICAgIC0gL3N0ZC9saXZpbmcvY29tYmF0IHVuZCB2b24gZG9ydCBnZXJ1ZmVuZSBTa2lsbHMgKEthbXBmKQorICAgIC0gL3N0ZC9naWxkZW5fb2IgdW5kIGluIEdpbGRlbiBsZXJuYmFyZSBTcGVsbHMvU2tpbGxzCisgICAgLSAvc3RkL3NwZWxsYm9vayB1bmQgdm9uIFNwZWxsYm9va3MgYXVzZ2VmdWVocnRlIFNwZWxscworICAgIC0gL3N0ZC9saXZpbmcvbGlmZSB1bmQgdm9uIGRvcnQgZ2VydWZlbmUgU2tpbGxzIChBbGtvaG9sKQorICAgIC0gL3N0ZC9zaGVsbHMvKiB1bmQgZW50c3ByZWNoZW5kZSBSYXNzZW5za2lsbHMKKworICAgIEltIFNraWxsc3lzdGVtIHVudGVyIC9zdGQvbGl2aW5nL3NraWxscyB3aXJkIHZvciBhdWYgSW5mb3JtYXRpb25lbgorICAgIGF1cyBkZW0gVGVpbCAjMSBSdWVja3NpY2h0IGdlbm9tbWVuLiBFaW5pZ2UgZGllc2VyIFdlcnRlCisgICAgd2VyZGVuIGF1Y2ggcGVybWFuZW50IGltIFNwaWVsZXIgZ2VzcGVpY2hlcnQgKHdpZSB6QiBkaWUKKyAgICBTSV9TS0lMTEFCSUxJVFkpLgorCitBS1RVRUxMRSBMSVNURTogKDUuIE9rdG9iZXIgMjAxMSkKKyAjMSBTa2lsbHMgdW5kIFNwZWxsczoKKyAgICBTSV9TS0lMTEZVTkM6IHN0cmluZworICAgICBCZWluaGFsdGV0IGRlbiBOYW1lbiBkZXIgTWV0aG9kZSwgZGllIGRpZSBlaWdlbnRsaWNoZSBGdW5rdGlvbmFsaXRhZXQKKyAgICAgZGVzIFNraWxscy9TcGVsbHMgaW1wbGVtZW50aWVydC4KKyAgICAgRmFsbHMgbmljaHQgYW5nZWdlYmVuLCB3aXJkIGJlaSBTcGVsbHMgZHVyY2ggVXNlU3BlbGwoKSBkYXMgVmVyYiwgZGFzCisgICAgIGRlciBTcGllbGVyIGVpbmdlZ2ViZW4gaGF0LCBhbHMgU3BlbGwtTWV0aG9kZW5uYW1lIGFuZ2Vub21tZW4uCisgICAgIEltIEdpbGRlbm9iamVrdCBrYW5uIGhpZXIgYWJ3ZWljaGVuZCB2b24gU3BlbGwtTmFtZW4gc3RlaGVuLCB3aWUgZGllCisgICAgIFNwZWxsZnVua3Rpb24gaW0gU3BlbGxib29rIGhlaXNzdC4KKworICAgIFNJX0NMT1NVUkU6IGNsb3N1cmUKKyAgICAgT3B0aW1pZXJ0IGRlbiBadWdyaWZmIGZ1ZXIgZGVuIGludGVybmVuIEdlYnJhdWNoLCBpbmRlbSBkaWUgZ2VmdW5kZW5lCisgICAgIFNwZWxsL1NraWxsZnVua3Rpb24gZGFyaW4gZGlyZWt0IGdlc3BlaWNoZXJ0IHdpcmQgdW5kIHNvIGxhbmdlIGd1ZWx0aWcKKyAgICAgaXN0LCBiaXMgZGFzL2RpZSBPYmpla3QoZSkvQ2xvc3VyZShzKSB6ZXJzdG9lcnQgc2luZC4KKyAgICAgS2FubiB0aGVvcmV0aXNjaCBhdWNoIGZ1ZXIgZXh0ZXJuZSBTa2lsbHMgZHVyY2ggKEF1dG9sb2FkLSlPYmpla3RlCisgICAgIGJlbnV0enQgd2VyZGVuLgorCisgICAgU0lfU0tJTExBQklMSVRZOiBpbnQKKyAgICAgRmFlaGlna2VpdCwgZGVuIFNwZWxsL1NraWxsIHp1IGJlbnV0emVuLiBOb3JtYWwgaXN0IHZvbgorICAgICAtTUFYX0FCSUxJVFkgYmlzIE1BWF9BQklMSVRZLgorCisgICAgU0lfU0tJTExEQU1BR0VfVFlQRTogc3RyaW5nKgorICAgICBBcnQgZGVzIFNjaGFkZW5zIGVpbmVzIEFuZ3JpZmZzOiBzaWVoZSBTY2hhZGVuc3R5cGVuIGluIC9zeXMvY29tYmF0LmgKKworICAgIFNJX1NLSUxMREFNQUdFX01TRzogc3RyaW5nCisgICAgIE1lbGR1bmcgYW5zdGF0dCBkZXIgV2FmZmUgb2RlciBIYWVuZGUtTWVsZHVuZy4KKyAgICBTSV9TS0lMTERBTUFHRV9NU0cyOiBzdHJpbmcKKyAgICAgTWVsZHVuZyBhbnN0YXR0IGRlciBXYWZmZSBvZGVyIEhhZW5kZS1NZWxkdW5nIGZ1ZXIgZGVuIFJhdW0uCisKKyAgICBTSV9JTkhFUklUOiBzdHJpbmcKKyAgICAgRW50aGFlbHQgZGVuIE5hbWVuIGRlcyBTa2lsbHMvU3BlbGxzLCB2b24gZGVtIGdlZXJidCB3aXJkLiBEYXMKKyAgICAgYmVkZXV0ZXQgZWluZXJzZWl0cywgZGFzIExlYXJuU2tpbGwoKSBhdWNoIGRpZXNlbiB1ZWJlcmdlb3JkbmV0ZW4KKyAgICAgU2tpbGwgYmVlaW5mbHVzc3QgdW5kIGFuZGVyZXJzZWl0cywgZGFzcyBiZWkgU2tpbGxzIGF1Y2ggZGllc2VyCisgICAgIHVlYmVyZ2VvcmRuZXRlIFNraWxsIGltIFJhaG1lbiBlaW5lciBTa2lsbC1BbndlbmR1bmcgZ2VydWZlbiB3aXJkLgorCisgICAgU0lfRElGRklDVUxUWTogaW50IC8gW1NwZWxsczogbWl4ZWRdCisgICAgIFNjaHdpZXJpZ2tlaXQgZWluZXMgU2tpbGxzL1NwZWxscy4gQmVlaW5mbHVzc3QgZGllIGpld2VpbHMgb2JlcmVuCisgICAgIFNjaHJhbmtlbiBmdWVyIGRhcyBMZXJuZW4gZWluZXMgU2tpbGxzL1NwZWxscyBpbiBBYmhhZW5naWdrZWl0IAorICAgICB2b24gU3BpZWxlcmxldmVsLgorICAgICBXZW5uIGluIGVpbmVtIFNwZWxsLUluZm8tTWFwcGluZyBrZWluIFdlcnQgc3RlaHQgd2lyZCBiZWkgU3BlbGxzCisgICAgIGF1dG9tYXRpc2NoIFNJX1NQRUxMQ09TVCBnZW5vbW1lbiwgZGVyIFdlcnQgaW0gU3BlbGwtSW5mby1NYXBwaW5nCisgICAgIGdlaHQgYmVpbSBMZXJuZW4gYWJlciBpbW1lciB2b3IgUGFyYW1ldGVybi4KKyAgICBGQUNUT1IoU0lfRElGRklDVUxUWSk6IGludCAvIG1peGVkCisgICAgT0ZGU0VUKFNJX0RJRkZJQ1VMVFkpOiBpbnQgLyBtaXhlZAorICAgICBOdXIgZnVlciBTcGVsbGJvb2tzL1NwZWxscy4gRGVyIG1peGVkLVBhcmFtZXRlciBrYW5uIEZ1bmt0aW9uZW4KKyAgICAgZW50aGFsdGVuLiBTaWVoZSB1bnRlbiBiZWkgU0lfU1BFTExDT1NULgorCisgICAgU0lfTEFTVExJR0hUOiBpbnQKKyAgICAgWmVpdHB1bmt0LCBiaXMgd2FubiBkZXIgU3RhbmRhcmRza2lsbHMgU0tfTklHSFRWSVNJT04gZGVuIFNwaWVsZXIKKyAgICAgc2VoZW4gbGFlc3N0LgorCisgICAgU0lfVEVTVEZMQUc6IGludAorICAgICBXZW5uIGdlc2V0enQsIGRhbm4gc29sbCBkZXIgU2tpbGwgbmljaHQgZ2VudXR6dCwgc29uZGVybiBudXIgZ2V0ZXN0ZXQKKyAgICAgd2VyZGVuLCBvYiBlciBlcmZvbGdyZWljaCB3YWVyZS4gRW50c3ByaWNodCBhbHNvIGluIGV0d2EgZGVtIEF1ZnJ1ZgorICAgICB2b24gU3BlbGxTdWNjZXNzKCkgaW4gU3BlbGxib29rcywgd2lyZCBhYmVyIGJlaSBVc2VTa2lsbCgpIGFscworICAgICBTa2lsbC1QYXJhbWV0ZXIgdWViZXJnZWJlbi4KKyAgICAgRGVyIFNraWxsIG11c3MgZW50c3ByZWNoZW5kIGltcGxlbWVudGllcnQgc2VpbiEKKworICAgIFNJX0dVSUxEOiBzdHJpbmcKKyAgICAgQW5nYWJlIGRlciBHaWxkZSwgYXVzIGRlciBkZXIgU2tpbGwgc3RhbW10LiBTaW5udm9sbCwgd2VubiBkZXIgU2tpbGwKKyAgICAgbmljaHQgYXVzIGRlciBha3R1ZWxsZW4gUF9HVUlMRCBzdGFtbXQuIEZ1ZXIgZ2VuZXJlbGxlIFNraWxscy9TcGVsbHMKKyAgICAgekIgd2FlcmUgZGFzICJBTlkiLgorICAgICBHaWx0IG5pY2h0IGZ1ZXIgU3BlbGxzIQorCisgICAgU0lfRU5FTVk6IG9iamVjdAorICAgICBBa3R1ZWxsZXMgRmVpbmRlc29iamVrdCwgd2lyZCBiZWkgU2tpbGwtQW53ZW5kdW5nIGF1cyBkZW0gS2FtcGYgaGVyYXVzCisgICAgIHZvbiBzdGQvbGl2aW5nL2NvbWJhdC5jIGFuIGRlbiBTa2lsbCB1ZWJlcmdlYmVuLgorICAgICBCZWlzcGllbDogU3RhbmRhcmR3YWZmZW5za2lsbHMsIFNLX01BR0lDX0RFRkVOU0UsIFNLX01BR0lDX0FUVEFDSywKKyAgICAgICAgICAgICAgIFNLX1RXT0hBTkRFRCwgU0tfU1BFTExfREVGRU5ELCBTS19JTkZPUk1fREVGRU5EIHVuZAorICAgICAgICAgICAgICAgU0tfREVGRU5EX09USEVSLgorCisgICAgU0lfRlJJRU5EOiBvYmplY3QKKyAgICAgWnUgdmVydGVpZGlnZW5kZXMgRnJldW5kZXNvYmpla3QsIHdpcmQgYmVpIFNraWxsLUFud2VuZHVuZyBhdXMgZGVtCisgICAgIEthbXBmIGhlcmF1cyB2b24gc3RkL2xpdmluZy9jb21iYXQuYyBhbiBkZW4gU2tpbGwgdWViZXJnZWJlbi4KKyAgICAgQmVpc3BpZWxlOiBTS19JTkZPUk1fREVGRU5EIHVuZCBTS19ERUZFTkRfT1RIRVIuCisKKyAgICBTSV9NQUdJQ19UWVBFOiBzdHJpbmcqCisgICAgIEVudGhhZWx0IGVpbiBBcnJheSBkZXIgTWFnaWV0eXBlbiwgZGllIHp1bSBFaW5zYXR6IGtvbW1lbi4gRGllIEFuZ2FiZQorICAgICBnZXNjaGllaHQgekIgaW0gU3BlbGxib29rIHVuZCBiZWVpbmZsdXNzdCBTcGVsbERlZmVuZCgpLgorCisgICAgU0lfTEFTVF9VU0U6IGludCAoZXZlbnR1ZWxsIG9ic29sZXQpCisgICAgIExldHp0ZSBOdXR6dW5nIGRlcyBTa2lsbHMuCisgICAgCisgICAgU0lfTEVBUk5fUFJPQjogaW50IChldmVudHVlbGwgb2Jzb2xldCkKKyAgICAgTGVybndhaHJzY2hlaW5saWNoa2VpdC4KKworICAgIFNJX1NLSUxMRFVSQVRJT046IGludAorICAgICBEYXVlciBkZXMgU2tpbGxzL1NwZWxscy4gTW9tZW50YW4gbmljaHQgYWxsenUgdmVyYnJlaXRldCBpbiBOdXR6dW5nLgorCisgIzIgbnVyIGZ1ZXIgU3BlbGxzOgorICAgIFNJX1NQRUxMQk9PSzogc3RyaW5nCisgICAgIEthbm4gZGlyZWt0IGRhcyBlbnRoYWx0ZW5kZSBTcGVsbGJvb2sgZnVlciBlaW5lbiBTcGVsbCBlbnRoYWx0ZW4uCisKKyAgICBTTV9SQUNFOiBtYXBwaW5nCisgICAgICBNYXBwaW5nLCBkYXMgYWxzIEtleSBkaWUgUmFzc2UgdW5kIGFscyBWYWx1ZSBlaW4gTWFwcGluZyBYCisgICAgICBlbnRoYWVsdC4gRGllc2VzIE1hcHBpbmcgWCB3aXJkIGRpcmVrdCB6dSBzaW5mbyBoaW56dWdlZnVlZ3QgdW5kCisgICAgICB1ZWJlcnNjaHJlaWJ0IGRhbWl0IGJlaSBCZWRhcmYgRGVmYXVsdHdlcnRlIGR1cmNoIHJhc3NlbnNwZXppZmlzY2hlCisgICAgICBXZXJ0ZS4KKworICAgIFNJX1NQRUxMQ09TVDogaW50IC8gbWl4ZWQKKyAgICBGQUNUT1IoU0lfU1BFTExDT1NUKTogaW50IC8gbWl4ZWQKKyAgICBPRkZTRVQoU0lfU1BFTExDT1NUKTogaW50IC8gbWl4ZWQKKyAgICAgQmVpbmhhbHRldCBkaWUgV2VydGUsIGRpZSBmdWVyIGRpZSBCZXJlY2hudW5nIGRlciBTcGVsbGtvc3RlbgorICAgICB6dXN0YWVuZGlnIHNpbmQuCisgICAgIERhYmVpIGdpbHQ6IFJlYWxrb3N0ZW4gPSBPRkZTRVQoQ09TVCkgKyAoQ09TVCAqIEZBQ1RPUihDT1NUKSkvMTAwCisgICAgIERpZSBlaW56ZWxuZW4gRWludHJhZWdlIGtvZW5uZW4gYW5zdGF0dCBlaW5lcyBmaXhlbiBXZXJ0ZXMgYXVjaCBkZW4KKyAgICAgVmVyd2VpcyBhdWNoIGVpbmUgRnVua3Rpb24gaW4gRm9ybSB2b24gQ2xvc3VyZS9NZXRob2Rlbm5hbWUvQXJyYXkgbWl0CisgICAgIE9iamVrdC9PYmpla3RuYW1lIHVuZCBNZXRob2Rlbm5hbWUgZW50aGFsdGVuLiBTaWVoZSBkYXp1IGF1Y2gKKyAgICAgZXhlY3V0ZV9hbnl0aGluZygpLgorCisgICAgU0lfVElNRV9NU0c6IHN0cmluZworICAgICBNZWxkdW5nLCBkaWUgZGVtIFNwaWVsZXIgbWl0dGVpbHQsIGRhc3MgZXIgbm9jaCBuaWNodCB3aWVkZXIgZWluZW4KKyAgICAgU3BlbGwgY2FzdGVuIGthbm4uIEZhbGxzIGRpZXNlciBFaW50cmFnIG5pY2h0IGdlc2V0enQgaXN0LCB3aXJkCisgICAgIGVpbiBTdGFuZGFyZHRleHQgYXVzZ2VnZWJlbi4KKworICAgIFNJX1NQX0xPV19NU0c6IHN0cmluZworICAgICBNZWxkdW5nLCBkaWUgZGVtIFNwaWVsZXIgbWl0dGVpbHQsIGRhc3MgZXIgenUgd2VuaWdlCisgICAgIEtvbnplbnRyYXRpb25zcHVua3RlIGJlc2l0enQsIHVtIGRlbiBTcGVsbCB6dSBjYXN0ZW4uIEZhbGxzIGRpZXNlcgorICAgICBFaW50cmFnIG5pY2h0IGdlc2V0enQgaXN0LCB3aXJkIGVpbiBTdGFuZGFyZHRleHQgYXVzZ2VnZWJlbi4KKworICAgIFNJX1BSRVBBUkVfTVNHOiBzdHJpbmcKKyAgICAgTWVsZHVuZywgZGllIGRlbSBTcGllbGVyIGF1c2dlZ2ViZW4gd2VyZGVuIHNvbGwsIHdlbm4gZXIgZWluZW4gU3BlbGwKKyAgICAgdm9yYmVyZWl0ZXQuIEFuc29uc3RlbiB3aXJkIGVpbiBTdGFuZGFyZHRleHQgYXVzZ2VnZWJlbi4KKworICAgIFNJX1BSRVBBUkVfQlVTWV9NU0c6IHN0cmluZworICAgICBNZWxkdW5nLCBkaWUgZGVtIFNwaWVsZXIgYXVzZ2VnZWJlbiB3ZXJkZW4gc29sbCwgd2VubiBlciBzY2hvbiBkaWVzZW4KKyAgICAgU3BlbGwgdm9yYmVyZWl0ZXQuIEFuc29uc3RlbiB3aXJkIGVpbiBTdGFuZGFyZHRleHQgYXVzZ2VnZWJlbi4KKworICAgIFNJX1BSRVBBUkVfQUJPUlRfTVNHOiBzdHJpbmcKKyAgICAgTWVsZHVuZywgZGllIGRlbSBTcGllbGVyIGF1c2dlZ2ViZW4gd2VyZGVuIHNvbGwsIHdlbm4gZXIgZGllCisgICAgIFZvcmJlcmVpdHVuZyBkaWVzZXMgU3BlbGxzIGR1cmNoIGVpbmVuIGFuZGVyZW4gU3BlbGwgdW50ZXJicmljaHQuCisgICAgIEFuc29uc3RlbiB3aXJkIGVpbiBTdGFuZGFyZHRleHQgYXVzZ2VnZWJlbi4KKworICAgIFNJX05PTUFHSUM6IGludAorICAgICBXZXJ0IHp3aXNjaGVuIDAgdW5kIDEwMCAob2RlciBtZWhyKSwgZGVyIGdlZ2VuIGRpZSBQX05PTUFHSUMtV2lya3VuZworICAgICBlaW5lcyBSYXVtZXMgd2lya3QuCisgICAgIEplIGhvZWhlciBkZXIgV2VydCBpc3QsIGRlc3RvIHVud2FocnNjaGVpbmxpY2hlciBpc3QgZXMsIGRhc3MgZWluCisgICAgIFJhdW0gZGVuIFNwZWxsIGR1cmNoIEFudGltYWdpZSBzdG9lcnQuIEVpbiBSYXVtIHNvbGx0ZSBudXIgV2VydGUKKyAgICAgendpc2NoZW4gMCB1bmQgMTAwIGdlc2V0enQgaGFiZW4uIElzdCBkZXIgV2VydCBkZXMgUmF1bXMgZ3JvZXNzZXIKKyAgICAgYWxzIGRlciBoaWVyIGFuZ2VnZWJlbiwgZGFubiBibG9ja2llcnQgZXIgTWFnaWUgbWl0IGVpbmVyIGdld2lzc2VuCisgICAgIGViZW4gc2VpbmVyIGFuZ2VnZWJlbmVuIFdhaHJzY2hlaW5saWNoa2VpdC4KKworICAgIFNJX05PTUFHSUNfTVNHOiBzdHJpbmcKKyAgICAgTWVsZHVuZywgZGllIGJlaSBGZWhsc2NobGFnIGR1cmNoIFBfTk9NQUdJQyBkZXMgUmF1bWVzIGF1c2dlZ2ViZW4KKyAgICAgd2lyZC4gQW5zb25zdGVuIHdpcmQgZWluIFN0YW5kYXJkdGV4dCBhdXNnZWdlYmVuLgorICAgICAgCisgICAgU0lfU1BFTExGQVRJR1VFOiBpbnQgLyBtaXhlZAorICAgIEZBQ1RPUihTSV9TUEVMTEZBVElHVUUpOiBpbnQgLyBtaXhlZAorICAgIE9GRlNFVChTSV9TUEVMTEZBVElHVUUpOiBpbnQgLyBtaXhlZAorICAgICBXZXJ0ZSwgZGllIGZ1ZXIgZGllIEJlcmVjaG51bmcgZGVyIFdpZWRlci1DYXN0LVplaXQgYmVudXR6dCB3ZXJkZW4uCisgICAgIERpZSBCZXJlY2hudW5nIHVuZCBkaWUgbW9lZ2xpY2hlbiBBbmdhYmVuIChDbG9zdXJlIGV0Yy4pIHNpbmQKKyAgICAgaWRlbnRpc2NoIHp1IFNJX1NQRUxMQ09TVC4KKyAgICAgRGFzIFNwZWxsYm9vayBnaWJ0IGJlaSBOaWNodC1XaWVkZXItQmVyZWl0c2NoYWZ0IFNJX1RJTUVfTVNHIGF1cy4KKworICAgIFNJX1hfU1BFTExGQVRJR1VFOiBtYXBwaW5nIG1pdCAoW3N0cmluZyBrZXk6IGludCB2YWxdKQorICAgICBXZXJ0ZSwgZGllIGZ1ZXIgZGllIEJlcmVjaG51bmcgZGVyIFdpZWRlci1DYXN0LVplaXQgYmVudXR6dCB3ZXJkZW4uCisgICAgIFNwZWxsYm9vay1DYXN0ZW46IE1hcHBpbmcgd2lyZCBkdXJjaCBBdWZydWYgdm9uIENoZWNrU3BlbGxGYXRpZ3VlKDxrZXk+KQorICAgICBhbSBDYXN0ZXIgZ2VmaWx0ZXJ0LiBOdXIgd2VubiBkYXMgcmVzdWx0aWVyZW5kZSBNYXBwaW5nIGxlZXIgaXN0IChrZWluCisgICAgIDxrZXk+IGhhdCBlaW5lbiBndWVsdGlnZW4gRmF0aWd1ZS1FaW50cmFnKSwgaXN0IFNwZWxsIGNhc3RiYXIsIHNvbnN0CisgICAgIEF1c2dhYmUgdm9uIFNJX1RJTUVfTVNHLgorICAgICBOYWNoIFNwZWxsYm9vay1DYXN0ZW46IFNldHplbiBkZXIgRmF0aWd1ZSBmdWVyIGFsbGUgPHZhbD4gPiAwIG1pdCA8a2V5Pi4KKworICAgIFNJX1NLSUxMTEVBUk46IGludCAvIG1peGVkCisgICAgRkFDVE9SKFNJX1NLSUxMTEVBUk4pOiBpbnQgLyBtaXhlZAorICAgIE9GRlNFVChTSV9TS0lMTExFQVJOKTogaW50IC8gbWl4ZWQKKyAgICAgV2VydGUsIGRpZSBmdWVyIGRpZSBCZXJlY2hudW5nIGRlciBMZXJuZ2VzY2h3aW5kaWdrZWl0IGJlbnV0enQKKyAgICAgd2VyZGVuLCBub3JtYWxlcndlaXNlIHBybyBBX0lOVC8yIGplIDAuMDElIChhbHNvIDEgdm9uIE1BWF9BQklMSVRZKS4KKyAgICAgRGllIEJlcmVjaG51bmcgdW5kIGRpZSBtb2VnbGljaGVuIEFuZ2FiZW4gKENsb3N1cmUgZXRjLikgc2luZAorICAgICBpZGVudGlzY2ggenUgU0lfU1BFTExDT1NULgorCisgICAgU0lfTEVBUk5fQVRUUklCVVRFOiBtYXBwaW5nCisgICAgIE1hcHBpbmcsIHdlbGNoZXMgZGllIEF0dHJpYnV0ZSwgbmFjaCBkZW5lbiBnZWxlcm50IHdlcmRlbiBzb2xsCisgICAgIGFscyBLZXlzIGVudGhhZWx0LiBEZXIgVmFsdWUgbGVndCBkaWUgR2V3aWNodHVuZyBmZXN0LCBkZW5uIGJlaQorICAgICBtZWhyZXJlbiBBdHRyaWJ1dGVuIHdpcmQgZWluIE1pdHRlbHdlcnQgZ2ViaWxkZXQuCisgICAgIERlciBOb3JtYWxmYWxsIGVudHNwcmFlY2hlIChbQV9JTlQ6IDFdKSBmdWVyIFNJX0xFQVJOX0FUVFJJQlVURS4KKworICAgIFNJX05PX0xFQVJOCisgICAgIFdlbm4gbWFuICh0ZW1wb3JhZXIhKSBuaWNodCB3aWxsLCBkYXNzIGRpZXNlciBTa2lsbCBnZWxlcm50IHdpcmQuCisgICAgIE11c3Mgdm9uIGRlbiBTcGVsbGJvb2tzIGJlYWNodGV0IHdlcmRlbi4KKyAgICAgU29sbHRlIG5pZW1hbHMgaW0gU3BpZWxlciBhYmdlc3BlaWNoZXJ0IHdlcmRlbi4gT2RlciBwZXJtYW5lbnQgaW4KKyAgICAgR2lsZGUvU3BlbGxib29rIGdlc2V0enQgc2Vpbi4gU29uZGVybiBpbSBMYXVmZSBlaW5lc3IgTnV0enVuZyBpbiBkZXIKKyAgICAgamV3LiBLb3BpZSB2b24gc2luZm8gZ2VzZXR6dCB3ZXJkZW4sIGRpZSBnZXJhZGUgZ2VudXR6dCB3aXJkLgorICAgIAorICAgICBTSV9TS0lMTEFSRzogc3RyaW5nCisgICAgIEJlaW5oYWx0ZXQgZGVuIFRleHQsIGRlbiBkZXIgU3BpZWxlciBuYWNoIGRlbSBTcGVsbGtvbW1hbmRvIGVpbmdlZ2ViZW4KKyAgICAgaGF0LiBaLkIuIHN0dWVuZGUgYmVpICJrcmFsbGVuc2NobGFnIG9yayAyIiBkZXIgVGV4dCAib3JrIDIiIGltCisgICAgIFBhcmFtZXRlci4KKworICAgIFNJX1NLSUxMUkVTVFJfVVNFOiBtaXhlZAorICAgICBFaW5zY2hyYWVua3VuZ2VuIGZ1ZXIgZGFzIE51dHplbiBkZXMgU3BlbGxzLgorICAgICBXaXJkIG5vcm1hbGVyd2Vpc2UgZGlyZWt0IGltIFNwZWxsYm9vayBmdWVyIGRlbiBTcGVsbCBlaW5nZXRyYWdlbi4KKyAgICAgRGllIGVpbnplbG5lbiBNb2VnbGljaGtlaXRlbiB3ZXJkZW4gaW4gZGVyIG1hbnBhZ2UgenUKKyAgICAgImNoZWNrX3Jlc3RyaWN0aW9ucyIgZXJsYWV1dGVydC4KKyAgICAgCisgICAgU0lfU0tJTExSRVNUUl9MRUFSTjogbWl4ZWQKKyAgICAgRWluc2NocmFlbmt1bmdlbiBmdWVyIGRhcyBMZXJuZW4gZGVzIFNwZWxscy4KKyAgICAgV2lyZCBub3JtYWxlcndlaXNlIGRpcmVrdCBpbSBHaWxkZW5vYmpla3QgZnVlciBkZW4gU3BlbGwKKyAgICAgZWluZ2V0cmFnZW4uCisgICAgIERpZSBlaW56ZWxuZW4gTW9lZ2xpY2hrZWl0ZW4gd2VyZGVuIGluIGRlciBtYW5wYWdlIHp1CisgICAgICJjaGVja19yZXN0cmljdGlvbnMiIGVybGFldXRlcnQuCisKKyAgICBTSV9TS0lMTElORk86IHN0cmluZworICAgIFNJX1NLSUxMSU5GT19MT05HOiBzdHJpbmcKKyAgICAgQmVzY2hyZWlidW5nIGRlcyBTcGVsbHMuIFdpcmQgaW0gR2lsZGVub2JqZWt0IGVpbmdldHJhZ2VuIHVuZAorICAgICBTSV9TS0lMTElORk8gd2lyZCB2b24gU2tpbGxMaXN0ZSBhbmdlemVpZ3QuCisKKyAgICBTSV9TS0lMTERBTUFHRTogaW50IC8gbWl4ZWQKKyAgICBGQUNUT1IoU0lfU0tJTExEQU1BR0UpOiBpbnQgLyBtaXhlZAorICAgIE9GRlNFVChTSV9TS0lMTERBTUFHRSk6IGludCAvIG1peGVkCisgICAgIFdlcnRlLCBkaWUgZnVlciBkaWUgU2NoYWRlbnNob2VoZW5iZXJlY2hudW5nIGRlcyBTcGVsbHMgYmVudXR6dAorICAgICB3ZXJkZW4gKHJhbmRvbSB1ZWJlciBkZW4gR2VzYW10d2VydCBub3JtYWxlcndlaXNlKS4KKyAgICAgRGllIEJlcmVjaG51bmcgdW5kIGRpZSBtb2VnbGljaGVuIEFuZ2FiZW4gKENsb3N1cmUgZXRjLikgc2luZAorICAgICBpZGVudGlzY2ggenUgU0lfU1BFTExDT1NULgorCisgICAgU0lfU0tJTExEQU1BR0VfQllfUk9XCisgICAgIEVpbiBNYXBwaW5nIG1pdCBCb25pIGZ1ZXIgZGVuIEFuZ3JpZmYgYXVzIGJlc3RpbW10ZW4gS2FtcGZyZWloZW4uCisgICAgIEZ1bmt0aW9uaWVydCBudXIgYmVpIFZlcndlbmR1bmcgdm9uIFRyeURlZmF1bHRBdHRhY2tTcGVsbC1TcGVsbHMKKyAgICAgYXVzIGRlbSBTcGVsbGJvb2suCisgICAgIERlciBLZXkgc3RlaHQgZnVlciBlaW5lIGJlc3RpbW10ZSBSZWloZSwgc2VpbiBXZXJ0IGZ1ZXIgZGVuCisgICAgIHJhbmRvbWlzaWVydGVuIEJvbnVzIGZ1ZXIgTGViZXdlc2VuLCBkaWUgYXVzIGRpZXNlciBSZWloZSBjYXN0ZW4uCisgICAgT0ZGU0VUKFNJX1NLSUxMREFNQUdFX0JZX1JPVykKKyAgICAgRWluIE1hcHBpbmcgbWl0IGZpeGVtIFdlcnQgZnVlciBSb3ctQm9uaSBpbSBLYW1wZi4KKworICAgICBCZWlzcGllbDogQWRkU3BlbGwoImZldWVyYmFsbCIsIDIwLAorICAgICAgICAgICAgICAgICAgICAgICAgKFtTSV9TS0lMTERBTUFHRTo1MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKFNJX1NLSUxMREFNQUdFKToxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NLSUxMREFNQUdFX0JZX1JPVzooWzI6NDAsMzoyMH0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoU0lfU0tJTExEQU1BR0VfQllfUk9XKTooWzI6MjBdKSwgLi4uCisgICAgIGdpYnQKKyAgICAgIFJlaWhlIDE6IHJhbmRvbSg1MCkrMTAwOworICAgICAgUmVpaGUgMjogcmFuZG9tKDUwKSsxMDArcmFuZG9tKDQwKSsyMAorICAgICAgUmVpaGUgMzogcmFuZG9tKDUwKSsxMDArcmFuZG9tKDIwKQorICAgICBBQ0hUVU5HOiBIaWVyIGdpbHQgbmljaHQgZGllIHNlbGJlIFN0cnVrdHVyIHdpZSBiZWkgU0lfU1BFTExDT1NUIQorCisgICAgU0lfU1BFTEw6IG1hcHBpbmcKKyAgICAgRGllc2VyIEVpbnRyYWcgZW50aGFlbHQgdmVyc2NoaWVkZW5lIFVudGVyd2VydGUsIGRpZSBkZW4gU3BlbGwKKyAgICAgZ2VyYWRlIGZ1ZXIgQW5ncmlmZnMtU3BlbGxzIGdlbmF1ZXIgYmVzY2hyZWliZW4uIFNpZWhlIERlZmVuZCgpCisgICAgIGZ1ZXIgZWluZSBCZXNjaHJlaWJ1bmcgZGVyIHZlcnNjaGllZGVuZW4gRWludHJhZWdlIChkaWUgc28gYXVjaAorICAgICBpbiBkYXMgU3BlbGxib29rIHVlYmVybm9tbWVuIHdlcmRlbiBrb2VubmVuKS4KKworICAgIFNJX0NPTExBVEVSQUxfREFNQUdFOiBpbnQKKyAgICAgSGllcm1pdCBrYW5uIG1hbiBlaW5lbiBQcm96ZW50d2VydCB2b24gU0lfU0tJTExEQU1BR0UgKGlua2x1c2l2ZQorICAgICBPZmZzZXRzIHVuZCBGYWN0b3IpIGZ1ZXIgS29sbGF0ZXJhbHNjaGFkZW4gYW4gRnJldW5kZW4gaW0gZGVmaW5pZXJ0ZW4KKyAgICAgQmVyZWljaCBlaW5lcyBGbGFlY2hlbnNwZWxscyAoVHJ5R2xvYmFsQXR0YWNrU3BlbGwoKSkgYW5nZWJlbi4KKyAgICAgMTAgYmVkZXV0ZXQgYmVpIE9GRlNFVChTSV9TS0lMTERBTUFHRSk9MTAwIHpCIDEwJSB2b24gMTAwID0gMTAgPSAxIExQCisgICAgIGFuIG1pdCByZWR1Y2VfaGl0X3BvaW50cygpIHZlcnVyc2FjaHRlbSBTY2hhZGVuLgorICAgIAorICAgIFNJX05VTUJFUl9FTkVNSUVTLCBTSV9OVU1CRVJfRlJJRU5EUzogaW50CisgICAgIFdpcmQgdm9uIFRyeUdsb2JhbEF0dGFja1NwZWxsKCkgaW0gU3BlbGwgZ2VzZXR6dCB1bmQgZW50aGFlbHQgZGllCisgICAgIEFuemFobCBkZXIgaW0gYW5nZWdlYmVuZW4gQmVyZWljaCBiZWZpbmRsaWNoZW4gRmVpbmRlIHVuZCBGcmV1bmRlLgorICAgICBJc3QgZGVtZW50c3ByZWNoZW5kIHZvbiBpbmZvcm1hdGl2ZW0gTnV0emVuIGZ1ZXIgZGVuIEFuZ2VncmlmZmVuZW4KKyAgICAgdW5kIGRhcyBTcGVsbGJvb2sgTkFDSCBBdWZydWYgdm9uIFRyeUdsb2JhbEF0dGFja1NwZWxsKCkuCisgICAgCisgICAgU0lfRElTVEFOQ0UsIFNJX1dJRFRILCBTSV9ERVBUSDogaW50CisgICAgIExpbWl0aWVydCBkaWUgRW50ZmVybnVuZywgVGllZmVuIHVuZCBCcmVpdGUgZGVyIFdpcmt1bmcgZWluZXMKKyAgICAgVHJ5R2xvYmFsQXR0YWNrU3BlbGwoKQorCisgICAgU0lfU0tJTExIRUFMOiBpbnQKKyAgICAgS29udmVudGlvbiBmdWVyIFNwZWxscyBpbSBTcGVsbGJvb2ssIGRvcnQgZGVuIEhlaWx3ZXJ0IHp1IGhpbnRlcmxlZ2VuLAorICAgICBoYXQga2VpbmUgQXVzd2lya3VuZ2VuIHVudGVyIC9zdGQvLgorCisgICAgU0lfVVNSOiBtaXhlZAorICAgICBGdWVyIHNlbGJzdCBkZWZpbmllcnRlIEluZm9zLCBzcGVsbGJvb2thYmhhZW5naWcuCisKKyAgICBTSV9QUkVQQVJFX1RJTUU6IGludAorICAgICBEYXVlciBkZXIgWmVpdCBmdWVyIHp1IHByYWVwYXJpZXJlbmRlIFNwZWxscy4KKworICAgIFNJX0FUVEFDS19CVVNZX01TRzogc3RyaW5nCisgICAgIE1lbGR1bmcsIGRpZSBkZW0gU3BpZWxlciBtaXR0ZWlsdCwgZGFzcyBlciBzY2hvbiB6dSBiZXNjaGFlZnRpZ3QKKyAgICAgbWl0IGVpbmVtIEFuZ3JpZmYgaXN0LCB1bSBlaW5lbiBTcGVsbCB6dSBjYXN0ZW4uIEZhbGxzIGRpZXNlcgorICAgICBFaW50cmFnIG5pY2h0IGdlc2V0enQgaXN0LCB3aXJkICBlaW4gU3RhbmRhcmR0ZXh0IGF1c2dlZ2ViZW4uCisKKyAgICBTSV9OT19BVFRBQ0tfQlVTWTogaW50CisgICAgIEVudGhhZWx0IGFscyBGbGFnIE5PX0FUVEFDS19CVVNZX1FVRVJZIHdlbm4gZGVyIFNwZWxsIE5JQ0hUIHdpZQorICAgICBlaW5lIFNwZXppYWx3YWZmZSBkaWUgQWt0aW9uZW4gZWluc2NocmFlbmt0LiBTaWVoZSBQX0FUVEFDS19CVVNZLgorCisgICAgU0lfQVRUQUNLX0JVU1lfQU1PVU5UOiBpbnQKKyAgICAgTWVuZ2UgZGVzIFBfQVRUQUNLX0JVU1kgZnVlciBkaWVzZW4gU3BlbGwuIEZhbGxzIGRpZXNlciBXZXJ0IG5pY2h0CisgICAgIGdlc2V0enQgaXN0LCBhYmVyIGF1Y2ggU0lfTk9fQVRUQUNLX0JVU1kgbmljaHQgbWl0CisgICAgIE5PX0FUVEFDS19CVVNZX1FVRVJZIGF1c2dlemVpY2huZXQgaXN0IHdpcmQgMSBhbmdlbm9tbWVuLgorCitTSUVIRSBBVUNIOgorICAgIFNraWxscyBMZXJuZW46ICBMZWFyblNraWxsLCBNb2RpZnlTa2lsbCwgTGltaXRBYmlsaXR5CisgICAgKiBOdXR6dW5nOiAgICAgIFVzZVNwZWxsLCBVc2VTa2lsbAorICAgICogQWJmcmFnZW46ICAgICBRdWVyeVNraWxsLCBRdWVyeVNraWxsQWJpbGl0eQorICAgICogTW9kaWZpa2F0aW9uOiBNb2RpZnlTa2lsbEF0dHJpYnV0ZSwgUXVlcnlTa2lsbEF0dHJpYnV0ZSwKKyAgICAgICAgICAgICAgICAgICAgUXVlcnlTa2lsbEF0dHJpYnV0ZU1vZGlmaWVyLCBSZW1vdmVTa2lsbEF0dHJpYnV0ZU1vZGlmaWVyCisgICAgICAqIFByb3BlcnRpZXM6IFBfU0tJTExfQVRUUklCVVRFUywgUF9TS0lMTF9BVFRSSUJVVEVfT0ZGU0VUUworICAgICogc29uc3RpZzogICAgICBzcHJ1Y2hlcm11ZWR1bmcKKyAgICAqIFByb3BlcnRpZXM6ICAgUF9ORVdTS0lMTFMKKyAgICBTcGVsbGJvb2s6ICAgICAgVXNlU3BlbGwsIExlYXJuLCBTcGVsbFN1Y2Nlc3MKKyAgICBHaWxkZW46ICAgICAgICAgZ2lsZGVuLWRva3UKKyAgICBLYW1wZjogICAgICAgICAgRGVmZW5kCisKKzcuIE5vdiAyMDEyIEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2MvcHJvcHMvc3ZuLWNvbW1pdC50bXAgYi9kb2MvcHJvcHMvc3ZuLWNvbW1pdC50bXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRmZmU3NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wcm9wcy9zdm4tY29tbWl0LnRtcApAQCAtMCwwICsxLDYgQEAKKworLS1UaGlzIGxpbmUsIGFuZCB0aG9zZSBiZWxvdywgd2lsbCBiZSBpZ25vcmVkLS0KKworTSAgICBQX0ZVRUwKK00gICAgUF9MSUdIVERFU0MKK00gICAgUF9ET19ERVNUUlVDVApkaWZmIC0tZ2l0IGEvZG9jL3NjbWQvLnJlYWRtZSBiL2RvYy9zY21kLy5yZWFkbWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRkNjljYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zY21kLy5yZWFkbWUKQEAgLTAsMCArMSw2IEBACitIaWVyIGJlZmluZGVuIHNpY2ggZGllIEhpbGZlc2VpdGVuLCBkaWUgZnVlciBTZWhlciBpbnRlcmVzc2FudCBzaW5kOgorCisgKiBCZXNjaHJlaWJ1bmcgZGVyIG5ldWVuIEJlZmVobGUKKyAqIGFsbGdlbWVpbmUgSW5mb3JtYXRpb25lbiB6dW0gQmF1IGVpbmVzIFNlaGVyaGF1c2VzCisgKiBCZXNjaHJlaWJ1bmcgZGVyIEJlZmVobGUsIGRpZSBkaWUgU2VoZXJoYWV1c2VyIHp1ciBWZXJmdWVndW5nIHN0ZWxsZW4KKwpkaWZmIC0tZ2l0IGEvZG9jL3NjbWQvLnN5bm9ueW0gYi9kb2Mvc2NtZC8uc3lub255bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTZlM2I3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NjbWQvLnN5bm9ueW0KQEAgLTAsMCArMSwzIEBACityOiByZW1vdGUKK3I7IHJlbW90ZQorCmRpZmYgLS1naXQgYS9kb2Mvc2NtZC9hZW5kZXJlIGIvZG9jL3NjbWQvYWVuZGVyZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjQ0N2VmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NjbWQvYWVuZGVyZQpAQCAtMCwwICsxLDUyIEBACisKK2FlbmRlcmUKKy0tLS0tLS0KKworIFNFSEVSSEFVU0tPTU1BTkRPOgorICAgIGFlbmRlcmUgPGhhdXM+IGxhbmcKKyAgICBhZW5kZXJlIGRldGFpbCA8ZGV0PgorICAgIGFlbmRlcmUgbGVzYmFyZXMgZGV0YWlsIDxkZXQ+CisgICAgYWVuZGVyZSBiZWZlaGwgPGJlZj4KKyAgICBhZW5kZXJlIDx0cnVoZT4KKyAgICBhZW5kZXJlIG1lbGR1bmdlbgorCisgQVJHVU1FTlRFOgorCisgICAgIDxoYXVzPgorICAgICAgICBlaW5lIGd1ZWx0aWdlIEJlemVpY2hudW5nIGRlcyBIYXVzZXMuIEd1ZWx0aWdlIEJlemVpY2hudW5nZW4gc2luZAorICAgICAgICBpbm5lcmhhbGIgZGVzIEhhdXNlcyAiaGF1cyIgdW5kICJyYXVtIiwgYXVzc2VyaGFsYiBkZXMgSGF1c2VzIGRpZQorICAgICAgICBCZWdyaWZmZSwgbWl0IGRlbmVuIHNpY2ggZGFzIEhhdXMgYW5zcHJlY2hlbiBsYWVzc3QuCisgICAgIDxkZXQ+CisgICAgICAgIE5hbWUgZGVzIHp1IGFlbmRlcm5kZW4gKGxlc2JhcmVuKSBEZXRhaWxzLiBFcyBrYW5uIGltbWVyIG51ciBlaW4KKyAgICAgICAgKGxlc2JhcmVzKSBEZXRhaWwgZ2xlaWNoemVpdGlnIGdlYWVuZGVydCB3ZXJkZW4hCisgICAgIDxiZWY+CisgICAgICAgIE5hbWUgZGVzIHp1IGFlbmRlcm5kZW4gQmVmZWhscyAoVmVyYiArIFBhcmFtZXRlcikKKyAgICAgPHRydWhlPgorICAgICAgICBlaW5lIGd1ZWx0aWdlIEJlemVpY2hudW5nIGRlciBUcnVoZS4KKworIEJFU0NIUkVJQlVORzoKKyAgICBNaXQgZGllc2VtIEJlZmVobCBpc3QgZXMgbW9lZ2xpY2gsIHNjaG9uIHZvcmhhbmRlbmUgQmVzY2hyZWlidW5nZW4genUKKyAgICBhZW5kZXJuLiBEaWVzIGlzdCB6dW0gQmVpc3BpZWwgbm9ldGlnLCB3ZW5uIG1hbiAob2RlciBlaW4gU3BpZWxlcikgZWluZW4KKyAgICBUaXBwZmVobGVyIGdlZnVuZGVuIGhhdCwgb2RlciB3ZW5uIG1hbiBlaW5lIEJlc2NocmVpYnVuZyBub2NoIGVpbiB3ZW5pZworICAgIGVyd2VpdGVybiBtb2VjaHRlLgorCisgICAgQmVpIHp1IGFlbmRlcm5kZW4gKGxlc2JhcmVuKSBEZXRhaWxzIHVuZCBCZWZlaGxlbiB3ZXJkZW4gYWxsZSBtZWhyZmFjaAorICAgIGF1ZnRyZXRlbmRlbiBUZXh0ZSBnbGVpY2h6ZWl0aWcgZ2VhZW5kZXJ0IChkLmguIHdlbm4gbWFuIGRpZSBEZXRhaWxzCisgICAgIndhbmQiIHVuZCAid2FlbmRlIiBtaXQgZGVuIGdsZWljaGVuIEJlc2NocmVpYnVuZ2VuIHZlcnNlaGVuIGhhdCwgd2lyZCBiZWkKKyAgICBhZW5kZXJlIGRldGFpbCB3YW5kIGF1Y2ggZGVyIFRleHQgdm9uICJ3YWVuZGUiIGdlYWVuZGVydCkuCisKKyAgICBHZWFlbmRlcnQgd2VyZGVuIGtvZW5uZW4gZGllIExhbmdiZXNjaHJlaWJ1bmdlbiBkZXMgSGF1c2VzIChpbm5lbiB1bmQKKyAgICBhdXNzZW4pLCBkaWUgTGFuZ2Jlc2NocmVpYnVuZyBkZXIgVHJ1aGUsIERldGFpbHMsIGxlc2JhcmUgRGV0YWlscywgQmVmZWhsZQorICAgIHNvd2llIGRpZSBMaXN0ZSBkZXIgUnVlY2ttZWxkdW5nZW4gdm9uIFNwaWVsZXJuIChhbHNvIHR5cG8sIGZlaGxlciB1bmQKKyAgICBpZGVlKS4gRGFzIGlzdCByZWNodCBudWV0emxpY2gsIGRhbWl0IG1hbiBkaWUgTWVsZHVuZ2VuLCBkaWUgbWFuIHNjaG9uCisgICAgYWJnZWFyYmVpdGV0IGhhdCwgd2llZGVyIGxvcyB3aXJkLgorCisgICAgRGVyIHp1IGFlbmRlcm5kZSBUZXh0IHdpcmQgaW4gZGVuIEVkaXRvciBnZWxhZGVuIHVuZCBrYW5uIHdpZSBnZXdvaG50CisgICAgYmVhcmJlaXRldCB3ZXJkZW4uIERlciBDdXJzb3IgYmVmaW5kZXQgc2ljaCBkYWJlaSB6dSBCZWdpbm4gZ2FueiBhbSBFbmRlCisgICAgZGVzIFRleHRlcy4KKworIFNJRUhFIEFVQ0g6CisgICAgYmVzY2hyZWliZSwgYmVmZWhsLCBsb2VzY2hlLCBrb3BpZXJlLCBtZWxkdW5nZW4sIHVlYmVyc2ljaHQsIG5vdGl6CisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFRodSwgMjQuMDcuMTk5NywgMDk6MDA6MDAgdm9uIFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL3NjbWQvYXVzZ2FuZyBiL2RvYy9zY21kL2F1c2dhbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI5NTBkNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zY21kL2F1c2dhbmcKQEAgLTAsMCArMSw1MyBAQAorCithdXNnYW5nCistLS0tLS0tCisKKyBTRUhFUkhBVVNLT01NQU5ETzoKKyAgICBhdXNnYW5nIDxyaWNodHVuZz4gPG5yPgorICAgIGF1c2dhbmcgPHJpY2h0dW5nPiA8bmFtZT4gPG5yPgorCisgQVJHVU1FTlRFOgorCisgICAgIDxyaWNodHVuZz4KKyAgICAgICAgUmljaHR1bmcgZGVzIGdld3VlbnNjaHRlbiBBdXNnYW5ncy4gRXMgc2luZCBudXIgZGllIGFjaHQKKyAgICAgICAgSGltbWVsc3JpY2h0dW5nZW4gc293aWUgIm9iZW4iIHVuZCAidW50ZW4iIGVybGF1YnQuIERpZSBSaWNodHVuZyBtdXNzCisgICAgICAgIGF1c2dlc2NocmllYmVuIHdlcmRlbiwgZC5oLiBlcyBtdXNzIGhlaXNzZW4gYXVzZ2FuZyBzdWVkd2VzdGVuIDIgc3RhdHQKKyAgICAgICAgYXVzZ2FuZyBzdyAyIQorICAgICA8bnI+CisgICAgICAgIE51bW1lciBkZXMgWmllbHJhdW1lcywgenUgZGVtIGRlciBBdXNnYW5nIGdlaGVuIHNvbGwuCisgICAgIDxuYW1lPgorICAgICAgICBOYW1lIGRlcyBTZWhlcnMsIHp1IGRlc3NlbiBIYXVzIGRlciBBdXNnYW5nIGZ1ZWhyZW4gc29sbC4gRGllcyBpc3QKKyAgICAgICAgbmljaHQgb2huZSB3ZWl0ZXJlcyBtb2VnbGljaCwgcy51LiEKKworIEJFU0NIUkVJQlVORzoKKyAgICBNaXQgZGllc2VtIEJlZmVobCBrYW5uIG1hbiBkZW0gUmF1bSwgaW4gZGVtIG1hbiBnZXJhZGUgc3RlaHQsIGVpbmVuCisgICAgd2VpdGVyZW4gQXVzZ2FuZyBoaW56dWZ1ZWdlbi4gSW0gWmllbHJhdW0gZW50c3RlaHQgZGFiZWkgYXV0b21hdGlzY2ggZWluCisgICAgQXVzZ2FuZyBpbiBkaWUgUnVlY2tyaWNodHVuZy4KKworICAgIEVzIHNpbmQgZm9sZ2VuZGUgUmVnZWxuIHp1IGJlYWNodGVuOgorCisgICAgICogZXMgZGFyZiBpbiBkaWVzZW0gUmF1bSBub2NoIGtlaW5lbiBBdXNnYW5nIGluIGRpZSBaaWVscmljaHR1bmcgZ2ViZW4hCisgICAgICogZXMgZGFyZiBpbSBaaWVscmF1bSBub2NoIGtlaW5lbiBBdXNnYW5nIGluIGRpZSBSdWVja3JpY2h0dW5nIGdlYmVuIChkaWUKKyAgICAgICBSdWVja3JpY2h0dW5nIGVyaGFlbHQgbWFuLCB3ZW5uIG1hbiBpbiBkZXIgSGlucmljaHR1bmcgIm9zdGVuIiB1bmQKKyAgICAgICAid2VzdGVuIiwgIm5vcmRlbiIgdW5kICJzdWVkZW4iIHNvd2llICJvYmVuIiB1bmQgInVudGVuIiBqZXdlaWxzCisgICAgICAgZ2VnZW5laW5hbmRlciBhdXN0YXVzY2h0KSEKKyAgICAgKiB3ZW5uIGRlciBBdXNnYW5nIGlucyBlaWdlbmUgSGF1cyBnZWh0LCBkYXJmIDxucj4gbmljaHQgZGllIE51bW1lciBkZXMKKyAgICAgICBSYXVtZXMgc2VpbiwgaW4gZGVtIG1hbiBnZXJhZGUgc3RlaHQhCisgICAgICogZXMgbXVzcyBpbiBkZW0gSGF1cyBuYXR1ZXJsaWNoIHNjaG9uIGVpbiBSYXVtIG1pdCBkZXIgTnVtbWVyIDxucj4KKyAgICAgICBleGlzdGllcmVuIQorCisgICAgV2lsbCBtYW4gc2VpbiBIYXVzIG1pdCBlaW5lbSBhbmRlcmVuIEhhdXMgdmVyYmluZGVuLCBzbyBpc3QgenVzYWV0emxpY2gKKyAgICBmb2xnZW5kZXMgenUgYmVhY2h0ZW46CisKKyAgICAgKiBkYXMgWmllbGhhdXMgbXVzcyBzaWNoIGltIGdsZWljaGVuIFJhdW0gYmVmaW5kZW4gd2llIGRhcyBlaWdlbmUgSGF1cyEKKyAgICAgKiBkZXIgQmVzaXR6ZXIgZGVzIFppZWxoYXVzZXMgaGF0IERpciBtaXQgZXJsYXViZSBkZW4gWnVncmlmZiBhdWYgc2VpbgorICAgICAgIEhhdXMgZ2V3YWVocnQhCisKKyAgICBEaWUgTnVtbWVyIGRlcyBSYXVtZXMsIGluIGRlbSBEdSBzdGVoc3QsIHdpcmQgYmVpIGRlbSBLb21tYW5kbyB1ZWJlcnNpY2h0CisgICAgbWl0IGF1c2dlZ2ViZW4gKHdlbm4gRHUgdWViZXIgbWVociBhbHMgZWluZW4gUmF1bSB2ZXJmdWVnc3QpLgorCisgU0lFSEUgQVVDSDoKKyAgICBzcGVycmUsIHVlYmVyc2ljaHQKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgVGh1LCAyNC4wNy4xOTk3LCAwOTowMDowMCB2b24gV2FyZ29uCmRpZmYgLS1naXQgYS9kb2Mvc2NtZC9iZWZlaGwgYi9kb2Mvc2NtZC9iZWZlaGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY5OWIzYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zY21kL2JlZmVobApAQCAtMCwwICsxLDIwNyBAQAorCitiZWZlaGwKKy0tLS0tLQorCisgU0VIRVJIQVVTS09NTUFORE86CisgICAgYmVzY2hyZWliZSBiZWZlaGwgPGJlZj4KKworIEFSR1VNRU5URToKKworICAgICA8YmVmPgorICAgICAgICBMaXN0ZSBkZXIgenUgYmVzY2hyZWliZW5kZW4gQmVmZWhsZS4gQmVpIG1laHJlcmVuIEJlZmVobGVuIG11ZXNzZW4KKyAgICAgICAgZGllc2UgZHVyY2ggS29tbWF0YSB2b25laW5hbmRlciBnZXRyZW5udCBzZWluLiBFcyBkdWVyZmVuIG51ciBWZXJiZW4KKyAgICAgICAgYW5nZWdlYmVuIHdlcmRlbiwgb2huZSBQYXJhbWV0ZXIhCisKKyBCRVNDSFJFSUJVTkc6CisgICAgQmVnaW5udCBtaXQgZGVyIEJlc2NocmVpYnVuZyBkZXMgQmVmZWhsZXMgPGJlZj4gKG9kZXIgbWVocmVyZSwgZmFsbHMgZXMKKyAgICBzaWNoIGJlaSA8YmVmPiB1bSBlaW5lIExpc3RlIHZvbiBWZXJiZW4gaGFuZGVsdCkuCisKKyAgICBEaWUgU3RhbmRhcmQtSGF1c2tvbW1hbmRvcyAoYmVzY2hyZWliZSwgbG9lc2NoZSwgZXRjLikgZHVlcmZlbiBOSUNIVAorICAgIGJlc2NocmllYmVuIHdlcmRlbiEgRWluemlnZSBBdXNuYWhtZW46ICJvZWZmbmUiLCAic2NobGllc3NlIiB1bmQKKyAgICAic2NobGllc3MiLgorCisgICAgQXVzZ2FuZ3NiZWZlaGxlIChIaW1tZWxzcmljaHR1bmdlbiwgIm9iZW4iLCAidW50ZW4iIHVuZCAicmF1cyIpIGtvZW5uZW4KKyAgICBiZXNjaHJpZWJlbiB3ZXJkZW47IGFiZXIgbnVyIGRhbm4sIHdlbm4gZXMgYXVjaCBlaW5lbiBlbnRzcHJlY2hlbmRlbgorICAgIEF1c2dhbmcgZ2lidC4gU3BlcnJ0IG1hbiBoaW50ZXJoZXIgZWluZW4gQXVzZ2FuZywgenUgZGVtIGVzIGVpbmVuIEJlZmVobAorICAgIGdpYnQsIHNvIHdpcmQgZGVyIEJlZmVobCB3aWVkZXIgZ2Vsb2VzY2h0IQorCisgICAgQW5zY2hsaWVzc2VuZCB3aXJkIG1hbiBuYWNoIGRlbiBQYXJhbWV0ZXJuIGZ1ZXIgZGVuIEJlZmVobCBnZWZyYWd0LiBBdWNoCisgICAgaGllciBrb2VubmVuIG1laHJlcmUgUGFyYW1ldGVyIGR1cmNoIEtvbW1hdGEgdm9uZWluYW5kZXIgZ2V0cmVubnQgd2VyZGVuOworICAgIGF1c3NlcmRlbSBrYW5uIG1hbiBoaWVyIG1laHJlcmUgV29lcnRlciBiZW51dHplbiAoc2llaGUgZGF6dSBhdWNoIGRhcworICAgIEJlaXNwaWVsIHVudGVuKS4gTWFuIGthbm4gYWxsZXJkaW5ncyBhdWNoIGdhbnogYXVmIFBhcmFtZXRlciB2ZXJ6aWNodGVuCisgICAgdW5kIGVpbmZhY2ggPFJFVFVSTj4gZHJ1ZWNrZW4uCisKKyAgICBTY2hsaWVzc2xpY2ggd2lyZCBtYW4gbmFjaCBkZW0gVGV4dCBnZWZyYWd0LCBkZXIgYWxzIFJlYWt0aW9uIGF1ZiBkZW4KKyAgICBCZWZlaGwgYXVzZ2VnZWJlbiB3ZXJkZW4gc29sbC4gRGF6dSBzdGVodCB3aWVkZXIgZGVyIEVkaXRvciB6dXIKKyAgICBWZXJmdWVndW5nLiBNYW4gZ2lidCBpbiBlaW5lbSBSdXRzY2ggc293b2hsIGRlbiBUZXh0IGZ1ZXIgZGVuamVuaWdlbiBlaW4sCisgICAgZGVyIGRlbiBCZWZlaGwgYXVzZnVlaHJ0LCBhbHMgYXVjaCBkZW4gVGV4dCBmdWVyIGRpZSBMZXV0ZSwgZGllIHNpY2ggaW0KKyAgICBnbGVpY2hlbiBSYXVtIGJlZmluZGVuLiBEaWUgVGV4dGUgd2VyZGVuIGR1cmNoIGVpbmUgWmVpbGUgbWl0IGVpbmVtIEBACisgICAgdm9uZWluYW5kZXIgZ2V0cmVubnQuCisKKyAgICBJbiBkZW4gVGV4dGVuIHNpbmQgdmVyc2NoaWVkZW5lIFBsYXR6aGFsdGVyIG1vZWdsaWNoLCB1bSBpbiBkZW4gZWluemVsbmVuCisgICAgQmVmZWhsZW4gZGlmZmVyZW56aWVydGVyZSBBa3Rpb25lbiB6dXp1bGFzc2VuOgorCisgICAgICogRGVyIE5hbWUgZGVzL2RlciBBdXNmdWVocmVuZGVuIGxhZXNzdCBzaWNoIG1pdCBAV0VSLCBAV0VTU0VOLCBAV0VNIHVuZAorICAgICAgIEBXRU4gZWluYmF1ZW4gKGpld2VpbHMgaW0gZW50c3ByZWNoZW5kZW4gRmFsbCkuCisgICAgICogUGVyc29uYWxwcm9ub21pbmEgc2luZCBtaXQgQFBXRVIsIC4uLiBtb2VnbGljaC4gRXMgaXN0IGRhYmVpIGplZG9jaCB6dQorICAgICAgIGJlYWNodGVuLCBkYXNzIHNpZSAqa2xlaW5nZXNjaHJpZWJlbiogZWluZ2VmdWVndCB3ZXJkZW4hIE1hbiBzb2xsdGUgc2llCisgICAgICAgYWxzbyBuaWNodCB1bmJlZGluZ3QgYW0gU2F0emFuZmFuZyBiZW51dHplbi4KKyAgICAgKiBQb3NzZXNzaXZwcm9ub21pbmE6IERhcyBpc3QgZXR3YXMga29tcGxpemllcnRlciwgZGVubiBoaWVyIG11ZXNzZW4gbm9jaAorICAgICAgIEdlc2NobGVjaHQgdW5kIEFuemFobCBkZXMgT2JqZWt0ZXMgYW5nZWdlYmVuIHdlcmRlbiwgYXVmIGRhcyBzaWNoIGRhcworICAgICAgIFBvc3Nlc3NpdnByb25vbWVuIGJlemllaHQuIERlciBBdWZiYXUgZGVzIFBsYXR6aGFsdGVyczoKKyAgICAgICBAQiwgZ2Vmb2xndCB2b24gTSwgRiBvZGVyIE4gZnVlciBkYXMgR2VzY2hsZWNodCBkZXMgQmV6dWdzb2JqZWt0ZXMKKyAgICAgICAoTWFza3VsaW51bSwgRmVtaW5pbnVtIG9kZXIgTmV1dHJ1bSksIFMgb2RlciBQIGZ1ZXIgZGllIEFuemFobAorICAgICAgIChTaW5ndWxhciBvZGVyIFBsdXJhbCkgdW5kIHNjaGxpZXNzbGljaCBXRVIsIFdFU1NFTiwgV0VNIG9kZXIgV0VOIGZ1ZXIKKyAgICAgICBkZW4gRmFsbCBkZXMgUHJvbm9tZW5zIGFuIHNpY2guCisgICAgICAgRGFzIGZ1ZWhydCBkYW5uIHp1IEtvbnN0cnVrdGlvbmVuIHdpZSBAQk1TV0VSIG9kZXIgQEJGUFdFTi4gQW0gYmVzdGVuLAorICAgICAgIG1hbiBwcm9iaWVydCBlcyBlaW5mYWNoIG1hbCBhdXMgKHNpZWhlIGFiZXIgYXVjaCBkaWUgQmVpc3BpZWxlKS4KKyAgICAgICBBdWNoIGhpZXIgZ2lsdCB1ZWJyaWdlbnMgd2llZGVyOiBEaWUgUHJvbm9taW5hIHdlcmRlbiBrbGVpbmdlc2NocmllYmVuCisgICAgICAgZWluZ2VmdWVndCEKKworICAgIFdlaXRlcmUgTW9lZ2xpY2hrZWl0ZW4gc2luZCByYXNzZW4tLCBuYW1lbnMtIHVuZCBnZXNjaGxlY2h0c3NwZXppZmlzY2hlCisgICAgQXVzZ2FiZW4uCisgCisgICAgQWxzIFRyZW5uZXIgZGllbmVuIEBHIGZ1ZXIgZ2VzY2hsZWNodHNzcGV6aWZpc2NoZSBBdXNnYWJlbiB1bmQgQFJFIChmdWVyCisgICAgRWxmZW4pLCBAUkggKGZ1ZXIgSG9iYml0cyksIEBSTSAoZnVlciBNZW5zY2hlbiksIEBSWiAoZnVlciBad2VyZ2UpLCAKKyAgICBAUkYgKGZ1ZXIgRmVsaW5lbiksIEBSRCAoZnVlciBEdW5rZWxlbGZlbikgc293aWUgQFJHIChmdWVyIEdvYmxpbnMpIGZ1ZXIgCisgICAgcmFzc2Vuc3BlemlmaXNjaGUgQXVzZ2FiZW4uCisKKyAgICBBbHMgc3BlemllbGxlICJSYXNzZSIgZ2lidCBlcyBkYXJ1ZWJlcmhpbmF1cyBub2NoIEBSQSBmdWVyIEF1c2dhYmVuLCBkaWUKKyAgICBudXIgZGllIFNwaWVsZXIgZ2VoZW4sIGRpZSBpbSBIYXVzIGJlc29uZGVyZSBSZWNodGUgaGFiZW4gKHNpZWhlIGVybGF1YmUpLgorCisgICAgRGFydWViZXJoaW5hdXMga2FubiBtYW4gQXVzZ2FiZW4gZnVlciBiZXN0aW1tdGUgU3BpZWxlciB2b3JzZWhlbi4gRGVyCisgICAgVHJlbm5lciBoaWVyZnVlciBpc3QgQE5BTUU6c3BpZWxlciwgd29iZWkgJ3NwaWVsZXInIGZ1ZXIgZGVuIE5hbWVuIGRlcworICAgIGVudHNwcmVjaGVuZGVuIFNwaWVsZXJzIHN0ZWh0LgorCisgICAgQWVobmxpY2ggd2llIGJlaSBkZXIgVHJlbm51bmcgendpc2NoZW4gZGVtIFRleHQgZnVlciBkZW4gQXVzZnVlaHJlbmRlbiB1bmQKKyAgICBkZW0gVGV4dCBmdWVyIGRpZSBVbXN0ZWhlbmRlbiBtdWVzc2VuIGRpZSBUcmVubmVyIGluIGVpbmVyIEV4dHJhemVpbGUKKyAgICBzdGVoZW4uCisKKyAgICBCZWkgQEcgd2lyZCBkZXIgVGV4dCB1ZWJlciBkZW0gVHJlbm5lciBiZWkgbWFlbm5saWNoZW4gdW5kIGRlciBUZXh0IHVudGVyCisgICAgZGVtIFRyZW5uZXIgYmVpIHdlaWJsaWNoZW4gQmVmZWhsc2F1c2Z1ZWhyZXJuIGF1c2dlZ2ViZW4uCisKKyAgICBCZWkgZGVuIFJhc3Nlbi0gdW5kIE5hbWVuc3RyZW5uZXJuIHdpcmQgZGVyIFRleHQgdW50ZXJoYWxiIGRlcyBUcmVubmVycworICAgIGF1c2dlZ2ViZW4sIGRlciBkZXIgUmFzc2UgYnp3LiBkZW0gTmFtZW4gZGVzIEF1c2Z1ZWhyZW5kZW4gZW50c3ByaWNodC4KKworICAgIFdlbm4gZnVlciBlaW5lIFJhc3NlIGtlaW4gZWlnZW5lciBUZXh0IGFuZ2VnZWJlbiBpc3QsIHdpcmQgZGVyIFRleHQgdm9yCisgICAgZGVtIGVyc3RlbiBSYXNzZW4tIGJ6dy4gTmFtZW5zdHJlbm5lciBhdXNnZWdlYmVuICh1bmQgd2VubiBnYXIga2VpbgorICAgIFJhc3NlbnRyZW5uZXIgYW5nZWdlYmVuIHd1cmRlLCB3aXJkIGRlciBUZXh0IGZ1ZXIgYWxsZSBSYXNzZW4KKyAgICBhdXNnZWdlYmVuIDspCisKKyAgICBJbm5lcmhhbGIgZGVyIHJhc3NlbnNwZXppZmlzY2hlbiBUZXh0ZSBrYW5uIHdpZWRlciBtaXQgQEcKKyAgICBnZXNjaGxlY2h0c3NwZXppZmlzY2ggdW50ZXJzY2hpZWRlbiB3ZXJkZW4uCisKKyAgICBVbSBlaW5lIGV0d2FzIGFuZGVyZSBNZWxkdW5nIGFscyAiV2llIGJpdHRlPyIgenUgYmVrb21tZW4sIHdlbm4gZWluIEJlZmVobAorICAgIG1pdCBlaW5lbSB1bmd1ZWx0aWdlbiBQYXJhbWV0ZXIgZWluZ2VnZWJlbiB3dXJkZSwga2FubiBtYW4gZGVuIHNwZXppZWxsZW4KKyAgICBQYXJhbWV0ZXIgQG5mQCBhbmdlYmVuLiBJbiBkZW4gVGV4dCBrYW5uIGRlciB1bmd1ZWx0aWdlIFBhcmFtZXRlciBtaXQgZGVtCisgICAgUGxhdHpoYWx0ZXIgQFBBUkEgaW50ZWdyaWVydCB3ZXJkZW4uCisKKyAgICBXZW5uIGRpZSBVbXN0ZWhlbmRlbiBrZWluZSBNZWxkdW5nIGJla29tbWVuIHNvbGxlbiwga2FubiBtYW4gZGVuIEBAIHVuZAorICAgIGRlbiB6d2VpdGVuIFRleHQgZWluZmFjaCB3ZWdsYXNzZW4uCisKKyBCRUlTUElFTEU6CisgICAgWnVuYWVjaHN0IGVpbiBnYW56IGVpbmZhY2hlciBUZXh0OgorCisgICAgICBiZXNjaHJlaWJlIGJlZmVobCBkcnVlY2ssIGRydWVja2UKKyAgICAgID0+IEJpdHRlIFBhcmFtZXRlciBlaW5nZWJlbi4KKyAgICAgIF1rbm9wZiwgYXVmIGtub3BmCisgICAgICA9PiBCaXR0ZSBUZXh0IGVpbmdlYmVuLCBkZXIgZnVlciBkaWVzZW4gQmVmZWhsIGF1c2dlZ2ViZW4gd2VyZGVuIHNvbGwuCisgICAgICBdRHUgZHJ1ZWNrc3QgYXVmIGRlbiBLbm9wZiwgYWJlciBuaWNodHMgcGFzc2llcnQuCisgICAgICBdLgorCisgICAgKFdlbm4gamVtYW5kIG51biAiZHJ1ZWNrZSBrbm9wZiIgZWluZ2lidCwgZXJoYWVsdCBlciBkaWUgTWVsZHVuZyAiRHUKKyAgICBkcnVlY2tzdCBhdWYgZGVuIEtub3BmLCBhYmVyIG5pY2h0cyBwYXNzaWVydC4iIEFuZGVyZSBTcGllbGVyLCBkaWUgc2ljaCBpbQorICAgIGdsZWljaGVuIFJhdW0gYXVmaGFsdGVuLCBiZWtvbW1lbiBrZWluZSBNZWxkdW5nKQorCisgICAgSmV0enQgZWluIEJlZmVobCBtaXQgQXVzZ2FiZSBhbiBkaWUgVW1zdGVoZW5kZW46CisKKyAgICAgIGJlc2NocmVpYmUgYmVmZWhsIHppZWgsIHppZWhlCisgICAgICA9PiBCaXR0ZSBQYXJhbWV0ZXIgZWluZ2ViZW4uCisgICAgICBdZmFkZW4sIGFuIGZhZGVuCisgICAgICA9PiBCaXR0ZSBUZXh0IGVpbmdlYmVuLCBkZXIgZnVlciBkaWVzZW4gQmVmZWhsIGF1c2dlZ2ViZW4gd2VyZGVuIHNvbGwuCisgICAgICBdRHUgemllaHN0IGFuIGRlbSBGYWRlbi4gRXMgZ2lidCBlaW5lbiBsYXV0ZW4gS25hbGwsIHVuZCBEdSBzaWVoc3QgbnVyCisgICAgICBdbm9jaCB3aXJiZWxuZGUgUHVua3RlLgorICAgICAgXUBACisgICAgICBdRXMgZ2lidCBlaW5lbiBsYXV0ZW4gS25hbGwsIHVuZCBkaWUgS29uZmV0dGlrYW5vbmUgaHVlbGx0IEBXRU4gaW4KKyAgICAgIF1laW5lIHdpcmJlbG5kZSBLb25mZXR0aXdvbGtlLgorICAgICAgXS4KKworICAgIChXZW5uIFdhcmdvbiBhbiBkZW0gRmFkZW4gemllaHQsIGJla29tbXQgZXIgZGllIG9iZXJlIE1lbGR1bmcsIHVuZCBkaWUKKyAgICBVbXN0ZWhlbmRlbiBiZWtvbW1lbiAiRXMgZ2lidCBlaW5lbiBsYXV0ZW4gS25hbGwsIHVuZCBkaWUgS29uZmV0dGlrYW5vbmUKKyAgICBodWVsbHQgV2FyZ29uIGluIGVpbmUgd2lyYmVsbmRlIEtvbmZldHRpd29sa2UuIikKKworICAgIEhpZXIgamV0enQgZWluIEJlaXNwaWVsIG1pdCBHZXNjaGxlY2h0ZXJ0cmVubnVuZzoKKworICAgICAgYmVzY2hyZWliZSBiZWZlaGwgc2NoYXUKKyAgICAgID0+IEJpdHRlIFBhcmFtZXRlciBlaW5nZWJlbi4KKyAgICAgIF1pbiBzcGllZ2VsCisgICAgICA9PiBCaXR0ZSBUZXh0IGVpbmdlYmVuLi4uCisgICAgICBdSG0sIER1IG11ZXNzdGVzdCBEaWNoIG1hbCB3aWVkZXIgcmFzaWVyZW4uCisgICAgICBdQEcKKyAgICAgIF1EZWluIE1ha2VVcCBpc3QgemllbWxpY2ggdmVyc2NobWllcnQuCisgICAgICBdLgorCisgICAgKFNjaGF1dCBlaW4gU3BpZWxlciBpbiBkZW4gU3BpZWdlbCwgd2lyZCBlciBhdWYgc2VpbmUgUmFzdXIgaGluZ2V3aWVzZW47CisgICAgZWluZSBTcGllbGVyaW4gZGFnZWdlbiBhdWYgaWhyIE1ha2VVcC4pCisKKyAgICBFdHdhcyBrb21wbGV4ZXI6IFJhc3NlbnRyZW5uZXIgdW5kIFBvc3Nlc3NpdnByb25vbWVuOgorCisgICAgICBiZXNjaHJlaWJlIGJlZmVobCBzY2hhdQorICAgICAgPT4gQml0dGUgUGFyYW1ldGVyIGVpbmdlYmVuLgorICAgICAgXWF1ZiB0aXNjaAorICAgICAgPT4gQml0dGUgVGV4dCBlaW5nZWJlbi4uLgorICAgICAgXUR1IHNpZWhzdCBlaW5lbiBIYXVmZW4gUGFwaWVyZSBhdWYgZGVtIFRpc2NoIGxpZWdlbi4KKyAgICAgIF1AUloKKyAgICAgIF1EZXIgVGlzY2ggaXN0IHp1IGhvY2ggZnVlciBEaWNoLgorICAgICAgXUBACisgICAgICBdQFdFUiB1bnRlcnN1Y2h0IGRlbiBUaXNjaC4KKyAgICAgIF1AUloKKyAgICAgIF1AV0VSIHZlcnN1Y2h0IHZlcnp3ZWlmZWx0LCBlaW5lbiBCbGljayBhdWYgZGVuIFRpc2NoIHp1IHdlcmZlbiwKKyAgICAgIF1hYmVyIEBCTVNXRVIga2xlaW5lciBLb2VycGVyYmF1IGxhZXNzdCBkYXMgbmljaHQgenUuCisgICAgICBdLgorCisgICAgKEtlaW5lIENoYW5jZSBmdWVyIFp3ZXJnZSEgOykgQEJNU1dFUiB3aXJkIGJlaSBtYWVubmxpY2hlbiBad2VyZ2VuIGR1cmNoCisgICAgInNlaW4iIHVuZCBiZWkgd2VpYmxpY2hlbiBad2VyZ2VuIGR1cmNoICJpaHIiIGVyc2V0enQuKQorCisgICAgRGFzIGdsZWljaGUgQmVpc3BpZWwgd2llIGdlcmFkZSwgZGllc21hbCBqZWRvY2ggenVzYWV0emxpY2ggbWl0IHNwZXppZWxsZW4KKyAgICBUZXh0ZW4gZnVlciBXYXJnb24gdW5kIFNhcGhpczoKKworICAgICAgYmVzY2hyZWliZSBiZWZlaGwgc2NoYXUKKyAgICAgID0+IEJpdHRlIFBhcmFtZXRlciBlaW5nZWJlbi4KKyAgICAgIF1hdWYgdGlzY2gKKyAgICAgID0+IEJpdHRlIFRleHQgZWluZ2ViZW4uLi4KKyAgICAgIF1EdSBzaWVoc3QgZWluZW4gSGF1ZmVuIFBhcGllcmUgYXVmIGRlbSBUaXNjaCBsaWVnZW4uCisgICAgICBdQE5BTUU6V2FyZ29uCisgICAgICBdRWluIEhhdWZlbiBQYXBpZXIuIFNjaGFmZiBkb2NoIG1hbCB3aWVkZXIgT3JkbnVuZyEKKyAgICAgIF1ATkFNRTpTYXBoaXMKKyAgICAgIF1FaW4gSGF1ZmVuIFBhcGllci4gU2FnIERlaW5lbSBDaGVmIG1hbCwgZXIgc29sbCBoaWVyIHdpZWRlciBPcmRudW5nCisgICAgICBdc2NoYWZmZW4hCisgICAgICBdQFJaCisgICAgICBdRGVyIFRpc2NoIGlzdCB6dSBob2NoIGZ1ZXIgRGljaC4KKyAgICAgIF1AQAorICAgICAgXUBXRVIgdW50ZXJzdWNodCBkZW4gVGlzY2guCisgICAgICBdQE5BTUU6V2FyZ29uCisgICAgICBdV2FyZ29uIHVudGVyc3VjaHQgZGVuIFRpc2NoIHVuZCBzZXVmenQuCisgICAgICBdQFJaCisgICAgICBdQFdFUiB2ZXJzdWNodCB2ZXJ6d2VpZmVsdCwgZWluZW4gQmxpY2sgYXVmIGRlbiBUaXNjaCB6dSB3ZXJmZW4sCisgICAgICBdYWJlciBAQk1TV0VSIGtsZWluZXIgS29lcnBlcmJhdSBsYWVzc3QgZGFzIG5pY2h0IHp1LgorICAgICAgXS4KKworICAgIFVuZCB6dW0gU2NobHVzcyBlaW4gQmVpc3BpZWwgZnVlciBlaW4gZ2VhZW5kZXJ0ZXMgIldpZSBiaXR0ZT8iCisKKyAgICAgIGJlc2NocmVpYmUgYmVmZWhsIGRydWVjayxkcnVlY2tlCisgICAgICA9PiBCaXR0ZSBQYXJhbWV0ZXIgZWluZ2ViZW4uCisgICAgICBdQG5mQAorICAgICAgPT4gQml0dGUgVGV4dCBlaW5nZWJlbi4uLgorICAgICAgXVdpZXNvIHdpbGxzdCBEdSBkZW5uIEBQQVJBIGRydWVja2VuPworICAgICAgXS4KKworICAgIChXZW5uIG1hbiBqZXR6dCB6Qi4gImRydWVja2UgaGFuZCIgZWluZ2lidCwgdW5kIGRpZXNlciBCZWZlaGwgbm9jaCBuaWNodAorICAgIGJlc2NocmllYmVuIHd1cmRlLCBrb21tdCBhbHMgTWVsZHVuZzogIldpZXNvIHdpbGxzdCBEdSBkZW5uIEhhbmQKKyAgICBkcnVlY2tlbj8iKQorCisgU0lFSEUgQVVDSDoKKyAgICBhZW5kZXJlLCBiZXNjaHJlaWJlCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFN1biwgMDMuMTIuMjAwMCwgMTg6MzA6MDAgdm9uIFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL3NjbWQvYmVzY2hyZWliZSBiL2RvYy9zY21kL2Jlc2NocmVpYmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJjZDAwMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zY21kL2Jlc2NocmVpYmUKQEAgLTAsMCArMSwxOTUgQEAKKworYmVzY2hyZWliZQorLS0tLS0tLS0tLQorCisgU0VIRVJIQVVTS09NTUFORE86CisgICAgYmVzY2hyZWliZSA8aGF1cz4gbGFuZworICAgIGJlc2NocmVpYmUgPGhhdXM+IGt1cnoKKyAgICBiZXNjaHJlaWJlIGRldGFpbCA8ZGV0PgorICAgIGJlc2NocmVpYmUgbGVzYmFyZXMgZGV0YWlsIDxkZXQ+CisgICAgYmVzY2hyZWliZSBiZWZlaGwgPGJlZj4gLSBTaWVoZSBiZWZlaGwhCisgICAgYmVzY2hyZWliZSBoYXVzdHVlcgorICAgIGJlc2NocmVpYmUgdHVlcnp1c3RhbmQKKyAgICBiZXNjaHJlaWJlIHRydWhlCisKKyBBUkdVTUVOVEU6CisKKyAgICAgPGhhdXM+CisgICAgICAgIGVpbmUgZ3VlbHRpZ2UgQmV6ZWljaG51bmcgZGVzIEhhdXNlcy4gR3VlbHRpZ2UgQmV6ZWljaG51bmdlbiBzaW5kCisgICAgICAgIGlubmVyaGFsYiBkZXMgSGF1c2VzICJoYXVzIiB1bmQgInJhdW0iLCBhdXNzZXJoYWxiIGRlcyBIYXVzZXMgZGllCisgICAgICAgIEJlZ3JpZmZlLCBtaXQgZGVuZW4gc2ljaCBkYXMgSGF1cyBhbnNwcmVjaGVuIGxhZXNzdC4KKyAgICAgPGRldD4KKyAgICAgICAgTGlzdGUgZGVyIHp1IGJlc2NocmVpYmVuZGVuIChsZXNiYXJlbikgRGV0YWlscy4gQmVpIG1laHJlcmVuIERldGFpbHMKKyAgICAgICAgbXVlc3NlbiBkaWVzZSBkdXJjaCBLb21tYXRhIHZvbmVpbmFuZGVyIGdldHJlbm50IHNlaW4hCisKKyBCRVNDSFJFSUJVTkc6CisgICAgRGllc2VzIEtvbW1hbmRvIGRpZW50IHp1ciBhbGxnZW1laW5lbiBCZXNjaHJlaWJ1bmcgZGVzIEhhdXNlcy4gVm9uIGRlbgorICAgIG1vZWdsaWNoZW4gQW53ZW5kdW5nZW4gaXN0IGJlc2NocmVpYmUgaGF1c3R1ZXIgbnVyIGRyYXVzc2VuIGVybGF1YnQuCisgICAgYmVzY2hyZWliZSA8aGF1cz4gbGFuZyBpc3Qgc293b2hsIGlubmVuIGFscyBhdWNoIGF1c3NlbiBiZW51dHpiYXI7IGFsbGUKKyAgICBhbmRlcmVuIEFud2VuZHVuZ2VuIGdlbHRlbiBudXIgaW5uZXJoYWxiIGRlcyBIYXVzZXMuCisKKyAgICBOYWNoIEVpbmdhYmUgZGVzIEtvbW1hbmRvcyBiZWZpbmRldCBtYW4gc2ljaCBiZWkgZGVuIG1laXN0ZW4gQXJ0ZW4gaW4gZGVtCisgICAgc2VsYmVuIEVkaXRvciwgd2llIG1hbiBpaG4gYXVjaCB2b24gZGVyIFBvc3Qgb2RlciBkZXIgWmVpdHVuZyBnZXdvaG50IGlzdC4KKyAgICBNYW4gaGF0IGFsc28gYXVjaCBoaWVyIGRpZSBNb2VnbGljaGtlaXQsIHNpY2ggbWl0ICJ+aCIgZWluZSBIaWxmZXNlaXRlIGRlcworICAgIEVkaXRvcnMgbWl0IGFsbGVuIG1vZWdsaWNoZW4gS29tbWFuZG9zIGFuemVpZ2VuIHp1IGxhc3Nlbi4KKworICAgIEZhbGxzIGVzIHZvcmtvbW1lbiBzb2xsdGUsIGRhc3Mgd2FlaHJlbmQgZGVyIEJlc2NocmVpYnVuZyBkaWUgVmVyYmluZHVuZworICAgIHp1bSBNVUQgenVzYW1tZW5icmljaHQsIHNwZXJydCBkZXIgRWRpdG9yISBJbiBkaWVzZW0gRmFsbCBrYW5uIG1hbiBtaXQKKyAgICAifnIiIGRpZSB1bnRlcmJyb2NoZW5lIEJlc2NocmVpYnVuZyB3aWVkZXIgYXVmbmVobWVuLiAoRGFzIH5yIG11c3MgYWxzCisgICAgQmVmZWhsIGltIEhhdXMgYW5nZWdlYmVuIHdlcmRlbiEpCisKKyAgICBIaWVyIG51biBkaWUgTW9lZ2xpY2hrZWl0ZW4genVyIEJlc2NocmVpYnVuZzoKKworICAgICBiZXNjaHJlaWJlIDxoYXVzPiBsYW5nCisgICAgICAgIEhpZXJtaXQgd2lyZCBkaWUgTGFuZ2Jlc2NocmVpYnVuZyBkZXMgSGF1c2VzIGJlZ29ubmVuLiBFcyBnaWJ0IHp3ZWkKKyAgICAgICAgRmFlbGxlOiBCZWZpbmRldCBtYW4gc2ljaCBpbm5lcmhhbGIgZGVzIEhhdXNlcywgc28gZ2lidCBtYW4gamV0enQgZGVuCisgICAgICAgIFRleHQgZWluLCBkZW4gbWFuIGJlaW0gQmV0cmV0ZW4gZGVzIEhhdXNlcyAoYmVpIGVpbmdlc2NoYWx0ZXRlbQorICAgICAgICBMYW5nLU1vZHVzKSB1bmQgYmVpIGVpbmVtIHNjaGF1IGltIEhhdXMgYmVrb21tdC4gQmVmaW5kZXQgbWFuIHNpY2gKKyAgICAgICAgYXVzc2VyaGFsYiBkZXMgSGF1c2VzLCBzbyBnaWJ0IG1hbiBqZXR6dCBkZW4gVGV4dCBlaW4sIGRlbiBtYW4gYmVpbQorICAgICAgICBVbnRlcnN1Y2hlbiBkZXMgSGF1c2VzIGJla29tbXQuIEFuIGRlbiBUZXh0IGZ1ZXIgZGllCisgICAgICAgIEF1c3NlbmJlc2NocmVpYnVuZyB3aXJkIGltbWVyIGVpbmUgWmVpbGUgbWl0IGRlbSBha3R1ZWxsZW4gWnVzdGFuZCBkZXIKKyAgICAgICAgSGF1c3R1ZXIgYW5nZWhhZW5ndC4KKworICAgICBiZXNjaHJlaWJlIDxoYXVzPiBrdXJ6CisgICAgICAgIEJlZ2lubnQgZGllIEVpbmdhYmUgZGVyIEt1cnpiZXNjaHJlaWJ1bmcgZGVzIEhhdXNlcy4gRGllcyBpc3QgZGVyCisgICAgICAgIFRleHQsIGRlbiBtYW4gbWl0IGVpbmdlc2NoYWx0ZXRlbSBLdXJ6LU1vZHVzIGJlaW0gQmV0cmV0ZW4gZGVzIEhhdXNlcworICAgICAgICBiZWtvbW10LgorCisgICAgICAgIERpZSBLdXJ6YmVzY2hyZWlidW5nIGthbm4gbnVyIGltIElubmVyZW4gZGVzIEhhdXNlcyBnZWFlbmRlcnQgd2VyZGVuLgorICAgICAgICBTaWUgZGFyZiBuaWNodCBsYWVuZ2VyIHNlaW4gYWxzIGVpbmUgWmVpbGUhCisKKyAgICAgICAgV2VubiBEZWluIEhhdXMgYXVjaCB2b24gYXVzc2VuIGFuZGVycyBhdXNzZWhlbiBzb2xsLCB3ZW5kZSBEaWNoIGJpdHRlCisgICAgICAgIGFuIFdhcmdvbi4KKworICAgICBiZXNjaHJlaWJlIGRldGFpbCA8ZGV0PgorICAgICAgICBCZWdpbm50IGRpZSBCZXNjaHJlaWJ1bmcgZGVzIERldGFpbHMgPGRldD4uIEFscyBEZXRhaWxzIHNvbGx0ZW4KKyAgICAgICAgbW9lZ2xpY2hzdCBhbGxlIFN1YnN0YW50aXZlIGJlc2NocmllYmVuIHdlcmRlbiwgZGllIGluIGRlcgorICAgICAgICBMYW5nYmVzY2hyZWlidW5nIGRlcyBIYXVzaW5uZXJlbiB1bmQgaW4gZGVuIGFuZGVyZW4gRGV0YWlscyB2b3Jrb21tZW4KKyAgICAgICAgKG5hdHVlcmxpY2ggbnVyLCBzb3dlaXQgZGFzIHNpbm52b2xsIGlzdCkuIERlbiBUZXh0IGRlciBEZXRhaWxzCisgICAgICAgIGJla29tbXQgbWFuIGJlaSBkZW0gS29tbWFuZG8gInVudGVyc3VjaGUgPGRldD4iIGF1c2dlZ2ViZW4uCisKKyAgICAgYmVzY2hyZWliZSBsZXNiYXJlcyBkZXRhaWwgPGRldD4KKyAgICAgICAgQmVnaW5udCBkaWUgQmVzY2hyZWlidW5nIGVpbmVzIGxlc2JhcmVuIERldGFpbHMuIERlciBUZXh0IHdpcmQgYmVpIGRlbQorICAgICAgICBLb21tYW5kbyAibGllcyA8ZGV0PiIgYXVzZ2VnZWJlbi4KKworICAgICBiZXNjaHJlaWJlIGJlZmVobCA8YmVmPgorICAgICAgICBEYSBkaWVzIG1pdHRsZXJ3ZWlsZSByZWNodCBrb21wbGV4IGdld29yZGVuIGlzdCwgZ2lidCBlcyBlaW5lCisgICAgICAgIEV4dHJhaGlsZmVzZWl0ZS4gRHUgZXJyZWljaHN0IHNpZSBtaXQgImhpbGZlIGJlZmVobCIuCisKKyAgICAgYmVzY2hyZWliZSBoYXVzdHVlcgorICAgICAgICBFcmxhdWJ0IGRpZSBCZXNjaHJlaWJ1bmcgZGVyIEhhdXN0dWVyLiBIaWVyIGlzdCBudXIgZWluZSBaZWlsZQorICAgICAgICBlcmxhdWJ0LiBEaWVzZSBaZWlsZSB3aXJkIGFuIGRpZSBMYW5nYmVzY2hyZWlidW5nIGRlcyBIYXVzZXMgdm9uCisgICAgICAgIGF1c3NlbiBhbmdlaGFlbmd0LiBXZW5uIGRvcnQga2VpbmUgSGF1c3R1ZXIgZXJzY2hlaW5lbiBzb2xsICh3YXMgekIuCisgICAgICAgIGJlaSBlaW5lbSBTZWUgb2RlciBlaW5lciBIb2VobGUgd2VuaWcgU2lubiBtYWNodCksIGthbm4gbWFuIGhpZXIgbWl0CisgICAgICAgIGVpbmVtIExlZXJzdHJpbmcgKGRpcmVrdCA8UkVUVVJOPiBkcnVlY2tlbikgZGllIFR1ZXIgdW5zaWNodGJhcgorICAgICAgICBtYWNoZW4uCisKKyAgICAgICAgTWl0IGRlbSBQbGF0emhhbHRlciAlcyB3aXJkIGRlciBha3R1ZWxsZSBadXN0YW5kIGRlciBIYXVzdHVlciBpbiBkaWUKKyAgICAgICAgQmVzY2hyZWlidW5nIGVpbmdlYmF1dCAoaW4gZGVyIEZvcm0gImdlb2VmZm5ldCIsICJnZXNjaGxvc3NlbiIgb2RlcgorICAgICAgICAiYWJnZXNjaGxvc3NlbiIpLgorCisgICAgIGJlc2NocmVpYmUgdHVlcnp1c3RhbmQKKyAgICAgICAgQXVjaCBkZW4gWnVzdGFuZCBkZXIgSGF1c3R1ZXIgKGdlb2VmZm5ldCwgZ2VzY2hsb3NzZW4sIGFiZ2VzY2hsb3NzZW4pCisgICAgICAgIGthbm4gbWFuIGluIGVpZ2VuZSBXb3J0ZSBmYXNzZW4uCisKKyAgICAgICAgRGllIFp1c3RhZW5kZSBtdWVzc2VuIGluIGRlciBvYmVuIGFuZ2VnZWJlbmVuIFJlaWhlbmZvbGdlIGVpbmdlZ2ViZW4KKyAgICAgICAgd2VyZGVuLCB1bmQgendhciBpbiBFSU5FUiBaZWlsZSwgZHVyY2ggS29tbWF0YSBnZXRyZW5udCEKKyAgICAgICAgRXMgbXVlc3NlbiBpbW1lciBBTExFIGRyZWkgWnVzdGFlbmRlIGFuZ2VnZWJlbiB3ZXJkZW4hCisgICAgICAgIE1hbiBzb2xsdGUgbmFjaCBNb2VnbGljaGtlaXQgbnVyIGVpbiBXb3J0IHBybyBadXN0YW5kIHZlcndlbmRlbiEKKworICAgICBiZXNjaHJlaWJlIHRydWhlCisgICAgICAgIEJlZ2lubnQgZGllIEJlc2NocmVpYnVuZyBkZXIgVHJ1aGUuIEltIEdlZ2Vuc2F0eiB6dSBkZW4gYW5kZXJlbgorICAgICAgICBCZXNjaHJlaWJ1bmdlbiBlcmZvbGd0IGRpZSBCZXNjaHJlaWJ1bmcgZGVyIFRydWhlIGluIG1laHJlcmVuCisgICAgICAgIFNjaHJpdHRlbi4gV2lsbCBtYW4gZGllIGpld2VpbGlnZW4gVm9yZ2FiZW4gbmljaHQgYWVuZGVybiwgc28gZ2VudWVndAorICAgICAgICBlcywgPFJFVFVSTj4genUgZHJ1ZWNrZW4uCisKKyAgICAgICAgWnVlcnN0IHdpcmQgbWFuIG5hY2ggZGVtIEdlc2NobGVjaHQgZGVyIFRydWhlIGdlZnJhZ3QuIEhpZXIgbXVzcyBtYW4KKyAgICAgICAgZGVuIHBhc3NlbmRlbiBCdWNoc3RhYmVuIGFuZ2ViZW4gKG0gZnVlciBtYWVubmxpY2gsIHcgZnVlciB3ZWlibGljaAorICAgICAgICBvZGVyIHMgZnVlciBzYWVjaGxpY2gpLgorCisgICAgICAgIE51biB3aXJzdCBEdSBuYWNoIGRlbSBOYW1lbiBnZWZyYWd0LCBkZXIgenVtIEJlaXNwaWVsIGJlaW0gT2VmZm5lbgorICAgICAgICBvZGVyIFNjaGxpZXNzZW4gZGVyIFRydWhlIGF1c2dlZ2ViZW4gd2lyZC4gRmFsbHMgZGVyIE5hbWUKKyAgICAgICAgdW5yZWdlbG1hZXNzaWcgZGVrbGluaWVydCB3aXJkLCBtdWVzc2VuIGFsbGUgdmllciBGYWVsbGUgaW4gZGVyCisgICAgICAgIFJlaWhlbmZvbGdlIE5vbWluYXRpdiwgR2VuaXRpdiwgRGF0aXYsIEFra3VzYXRpdiwgZHVyY2ggS29tbWF0YQorICAgICAgICBnZXRyZW5udCwgZWluZ2VnZWJlbiB3ZXJkZW4uCisKKyAgICAgICAgU2NobGllc3NsaWNoIGthbm5zdCBEdSBub2NoIEFkamVrdGl2ZSBhbmdlYmVuLCBkaWUgenVzYW1tZW4gbWl0IGRlbQorICAgICAgICBOYW1lbiBhdXNnZWdlYmVuIHdlcmRlbi4KKworICAgICAgICBBdXMgZGVuIGJpc2hlciBlaW5nZWdlYmVuZW4gRGF0ZW4gd2lyZCBudW4gZGllIEt1cnpiZXNjaHJlaWJ1bmcgZGVyCisgICAgICAgIFRydWhlIGVyc3RlbGx0LiBFbnRzcHJpY2h0IHNpZSBuaWNodCBEZWluZW4gVm9yc3RlbGx1bmdlbiwgZ2VsYW5nc3QgRHUKKyAgICAgICAgd2llZGVyIGluIGRpZSBHZXNjaGxlY2h0c2FiZnJhZ2UuCisKKyAgICAgICAgQW5zb25zdGVuIHdpcmQgbnVuIG5hY2ggZGVuIElEcyBnZWZyYWd0LCBtaXQgZGVuZW4gc2ljaCBkaWUgVHJ1aGUKKyAgICAgICAgYW5zcHJlY2hlbiBsYXNzZW4gc29sbC4gTWVocmVyZSBJRHMgbXVlc3NlbiBtaXQgS29tbWF0YSB2b25laW5hbmRlcgorICAgICAgICBnZXRyZW5udCB3ZXJkZW4uIEVzIGtvZW5uZW4gYXVjaCBJRHMgdmVyd2VuZGV0IHdlcmRlbiwgZGllIGF1cworICAgICAgICBtZWhyZXJlbiBXb3J0ZXJuIGJlc3RlaGVuLiBEaWUgVm9yZ2FiZW4ga29lbm5lbiB3aWVkZXIgbWl0IDxSRVRVUk4+CisgICAgICAgIHVlYmVybm9tbWVuIHdlcmRlbi4KKyAgICAgICAgRGEgZWluaWdlIFNwZXppYWxpc3RlbiBlcyBpbW1lciB3aWVkZXIgc2NoYWZmdGVuLCBoaWVyIHNjaG9uIGRpZQorICAgICAgICBMYW5nYmVzY2hyZWlidW5nIGVpbnp1Z2ViZW4gKHVuZCBzb21pdCBoaW50ZXJoZXIgZGllIFRydWhlIG5pY2h0IG1laHIKKyAgICAgICAgYW5zcHJlY2hlbiBrb25udGVuKSwgbGFlc3N0IHNpY2ggZGllIFRydWhlIGZ1ZXIgZGVuCisgICAgICAgIGBiZXNjaHJlaWJlJy1CZWZlaGwgaW1tZXIgYWxzIGB0cnVoZScgYW5zcHJlY2hlbi4gWnVtIEFuc2VoZW4sIE9lZmZuZW4KKyAgICAgICAgZXRjLiBtdXNzIG1hbiBhbGxlcmRpbmdzIGRpZSBoaWVyIGFuZ2VnZWJlbmVuIElEcyB2ZXJ3ZW5kZW4uCisKKyAgICAgICAgTnVuIGVyZm9sZ3QgZGllIExhbmdiZXNjaHJlaWJ1bmcgZGVyIFRydWhlLiBCZWkgZGllc2VyIHN0ZWh0IHdpZWRlcgorICAgICAgICBkZXIgRWRpdG9yIHp1ciBWZXJmdWVndW5nLiBCZWkgQWJicnVjaCBvZGVyIGVpbmVtIExlZXJzdHJpbmcgd2lyZCBkaWUKKyAgICAgICAgYWx0ZSBMYW5nYmVzY2hyZWlidW5nIG5pY2h0IGdlYWVuZGVydC4KKworICAgICAgICBadW0gZ3V0ZW4gU2NobHVzcyBrYW5uIG1hbiBhdWNoIG5vY2ggZGFzIE1hdGVyaWFsIGRlciBUcnVoZSBhZW5kZXJuLgorICAgICAgICBJbSBIYXVwdG1lbnVlIGthbm4gbWFuIGVpbmUgTWF0ZXJpYWxncnVwcGUgd2FlaGxlbiwgdW5kIGRvcnQgZGFubiBkYXMKKyAgICAgICAgZ2V3dWVuc2NodGUgTWF0ZXJpYWwuCisKKyAgICAgICAgRGllIEJlc2NocmVpYnVuZyBkZXIgVHJ1aGUga2FubiBuYXR1ZXJsaWNoIG51ciBnZWFlbmRlcnQgd2VyZGVuLCB3ZW5uCisgICAgICAgIG1hbiBpbSBnbGVpY2hlbiBSYXVtIHN0ZWh0IHdpZSBkaWUgVHJ1aGUuIDstKQorCisgQkVJU1BJRUxFOgorICAgIEVpbiBsZXNiYXJlcyBEZXRhaWwgd2lyZCBiZXNjaHJpZWJlbjoKKworICAgICAgYmVzY2hyZWliZSBsZXNiYXJlcyBkZXRhaWwgemV0dGVsLCBub3RpegorICAgICAgPT4gQml0dGUgQmVzY2hyZWlidW5nIGZ1ZXIgJ3pldHRlbCwgbm90aXonIGVpbmdlYmVuLgorICAgICAgXUJpbiBnZXJhZGUgbWV0emVsbi4gQmx1dHNhdWdlcnNjaHdlcnRlciBiaXR0ZSBhbiBkZXIgUGZvcnRlCisgICAgICBdYWJnZWJlbi4KKyAgICAgIF0uCisKKyAgICBEaWUgVHJ1aGUgc29sbCBpbiBlaW5lIGtsZWluZSBLaXN0ZSBhdXMgSG9seiB1bWdld2FuZGVsdCB3ZXJkZW46CisKKyAgICAgIGJlc2NocmVpYmUgdHJ1aGUKKyAgICAgID0+IEJlc2NocmVpYnVuZyBkZXIgVHJ1aGUKKyAgICAgID0+IFdlbm4gZGllIFZvcmdhYmVuIG5pY2h0IGdlYWVuZGVydCB3ZXJkZW4gc29sbGVuLCBlaW5mYWNoIHdlaXRlcgorICAgICAgPT4gbWl0IDxSRVRVUk4+LgorCisgICAgICA9Pkdlc2NobGVjaHQgKG0sIHcsIHMpOiBbd10KKyAgICAgIF13CisgICAgICA9PiBEYXMgR2VzY2hsZWNodCBpc3QgamV0enQgd2VpYmxpY2guCisgICAgICA9PiBOdW4gbXVzc3QgRHUgZGVuIE5hbWVuIGVpbmdlYmVuLiAuLi4KKyAgICAgID0+IE5hbWU6IFtUcnVoZV0KKyAgICAgIF1LaXN0ZSwgS2lzdGUsIEtpc3RlLCBLaXN0ZQorICAgICAgPT4gRGVyIE5hbWUgaXN0IGpldHp0ICdLaXN0ZSwgS2lzdGUsIEtpc3RlLCBLaXN0ZScKKyAgICAgID0+IER1IGthbm5zdCBqZXR6dCBub2NoIE5hbWVuc2FkamVrdGl2ZSBhbmdlYmVuLiAuLi4KKyAgICAgID0+IE5hbWVuc2FkamVrdGl2ZTogW10KKyAgICAgIF1rbGVpbgorICAgICAgPT4gTmFtZW5zYWRqZWt0aXZlIGxhdXRlbiBrbGVpbi4KKyAgICAgID0+IERpZSBLdXJ6YmVzY2hyZWlidW5nIGxhdXRldCBkYW1pdDoKKyAgICAgID0+IEVpbmUga2xlaW5lIEtpc3RlIChnZXNjaGxvc3NlbikuCisgICAgICA9PiBGYWxscyBkYXMgRXJnZWJuaXMgbmljaHQgRGVpbmVuIC4uLgorICAgICAgPT4gU3RpbW10IGRpZSBLdXJ6YmVzY2hyZWlidW5nIHNvPyAoai9uKQorICAgICAgXWoKKworICAgICAgPT5JRHMgKGR1cmNoIEtvbW1hdGEgZ2V0cmVubnQpOgorICAgICAgPT5bdHJ1aGUsaG9senRydWhlXQorICAgICAgXWtpc3RlCisgICAgICA9PiBPSywgSURzIGxhdXRlbiAna2lzdGUnCisKKyAgICAgID0+IEJpdHRlIExhbmdiZXNjaHJlaWJ1bmcgYW5nZWJlbi4uLgorICAgICAgXUluIGRpZXNlciBLaXN0ZSBsYWdlcnQgV2FyZ29uIHdpY2h0aWdlIERpbmdlLgorICAgICAgXS4KKworICAgICAgPT4gQml0dGUgZGFzIE1hdGVyaWFsIGRlciBLaXN0ZSBiZXRpbW1lbjoKKyAgICAgIC4uLgorCisgU0lFSEUgQVVDSDoKKyAgICBlZGl0b3IsCisgICAgYWVuZGVyZSwgYmVmZWhsLCBsb2VzY2hlLCBrb3BpZXJlLCBtZWxkdW5nZW4sIHVlYmVyc2ljaHQsIG5vdGl6LCBsaWNodAorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBUaHUsIDI1LjA5LjE5OTcsIDE3OjQwOjMwIHZvbiBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9zY21kL2VjaG8gYi9kb2Mvc2NtZC9lY2hvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYjYyOTQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2NtZC9lY2hvCkBAIC0wLDAgKzEsMzQgQEAKKworZWNobworLS0tLQorCisgU0VIRVJLT01NQU5ETzoKKyAgICBlY2hvIDx0ZXh0PgorCisgQVJHVU1FTlRFOgorCisgICAgIDx0ZXh0PgorICAgICAgICBlaW4gYmVsaWViaWdlciBUZXh0CisKKyBCRVNDSFJFSUJVTkc6CisgICAgRGVyIFRleHQgPHRleHQ+IHdpcmQgYW4gYWxsZSBTcGllbGVyIGltIHNlbGJlbiBSYXVtIGdlc2VuZGV0LgorCisgICAgQmVpIFNlaGVybiB2ZXJicmF1Y2h0IGRpZXNlcyBLb21tYW5kbyA1MCBNYWdpZXB1bmt0ZS4gRnVlciBNYWdpZXIgaXN0IGVzCisgICAga29zdGVubG9zLgorCisgICAgQUNIVFVORzogRGllIEJlbnV0enVuZyBkaWVzZXMgQmVmZWhscyB3aXJkIGdlbG9nZ3QhIEQuaC4gZGFzcyBlciBuaWNodAorICAgIHp1ciBCZW51dHp1bmcgZ2VlaWduZXQgaXN0LCB3ZW5uIG1hbiBuaWNodCBtb2VjaHRlLCBkYXNzIGRlciBnZXNlbmRldGUKKyAgICBUZXh0IHZvbiBNYWdpZXJuIG5hY2hnZWxlc2VuIHdlcmRlbiBrYW5uLiBEaWVzIGlzdCBhdWZncnVuZCB2b24gTWlzc2JyYXVjaAorICAgIGxlaWRlciBub3R3ZW5kaWcuIEluIGRpZXNlbSBadXNhbW1lbmhhbmcgc2VpIGF1Y2ggbm9jaG1hbCBkYXJhdWYgCisgICAgaGluZ2V3aWVzZW4sIGRhc3MgRWNob3MgaW4gZnJlbWRlbSBOYW1lbiBuaWNodCBlcmxhdWJ0IHNpbmQgdW5kIG1pdAorICAgIGRlbSBFbnR6dWcgZGVyIGVjaG8tRmFlaGlna2VpdCAocGx1cyAocillbW90ZSBhbHMgQm9udXMpIGdlYWhuZGV0CisgICAgd2VyZGVuIGtvZW5uZW4uCisKK0JFTUVSS1VOR0VOOgorICAgIERpZSBGYWVoaWdrZWl0IHdpcmQgZXJzdCBuYWNoIGRlciBMb2VzdW5nIGRlcyBRdWVzdCAiSGlsZiBkZW0KKyAgICBBcmNoaXRla3Rlbi4iIGZyZWlnZXNjaGFsdGV0LgorCisgU0lFSEUgQVVDSDoKKyAgICBzYWcsIGVtb3RlCisKKzEuIE1hZXJ6IDIwMTMgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9zY21kL2VybGF1YmUgYi9kb2Mvc2NtZC9lcmxhdWJlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMjkxNmEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2NtZC9lcmxhdWJlCkBAIC0wLDAgKzEsMzEgQEAKKworZXJsYXViZQorLS0tLS0tLQorCisgU0VIRVJIQVVTS09NTUFORE86CisgICAgZXJsYXViZSA8bmFtZT4KKworIEFSR1VNRU5URToKKworICAgICA8bmFtZT4KKyAgICAgICAgRWluIG9kZXIgbWVocmVyZSBOYW1lbiAoZHVyY2ggS29tbWF0YSBnZXRyZW5udCkuCisKKyBCRVNDSFJFSUJVTkc6CisgICAgRGVyIFNwaWVsZXIgPG5hbWU+IGVyaGFlbHQgZGllIEVybGF1Ym5pcywgRGVpbiBIYXVzIGF1Zi0gdW5kIGFic2NobGllc3NlbgorICAgIHp1IGR1ZXJmZW4uIFdlaXRlcmhpbiBkYXJmIGRpZXNlciBTcGllbGVyIGF1Y2ggZGllIFRydWhlIGluIERlaW5lbSBIYXVzCisgICAgb2VmZm5lbi4KKworICAgIEF1Y2ggd2VubiBlaW4gTmFjaGJhciBzZWluIEhhdXMgbWl0IERlaW5lbSB2ZXJiaW5kZW4gd2lsbCwgbXVzcyBpaG0gZGFzCisgICAgbWl0IGRpZXNlbSBLb21tYW5kbyBlcmxhdWJ0IHdlcmRlbi4KKworICAgIERpZXNlciBCZWZlaGwgZnVua3Rpb25pZXJ0IG51ciBpbSBFaW5nYW5nc3JhdW0gZGVzIEhhdXNlcywgdW5kIGRpZSBMaXN0ZQorICAgIGRlciBMZXV0ZSBtaXQgZXJ0ZWlsdGVyIEVybGF1Ym5pcyB3aXJkIGF1Y2ggbnVyIGltIEVpbmdhbmdzcmF1bSBiZWkgZGVtCisgICAgQmVmZWhsIHVlYmVyc2ljaHQgbWl0IGF1c2dlZ2ViZW47IGRpZSBMaXN0ZSBnaWx0IGJlaSBBdXNnYWVuZ2VuIGplZG9jaAorICAgIGZ1ZXIgZGFzIGdlc2FtdGUgSGF1cyAobWFuIGthbm4gYWxzbyBuaWNodCBzZWxla3RpdiBSYWV1bWUgenVyIFZlcmJpbmR1bmcKKyAgICBmcmVpZ2ViZW4pLgorCisgU0lFSEUgQVVDSDoKKyAgICB2ZXJiaWV0ZSwgdWViZXJzaWNodCwgYXVzZ2FuZworCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBUaHUsIDI0LjA3LjE5OTcsIDA5OjAwOjAwIHZvbiBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9zY21kL2V4dHJhbG9vayBiL2RvYy9zY21kL2V4dHJhbG9vawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjBmOGVjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NjbWQvZXh0cmFsb29rCkBAIC0wLDAgKzEsMjkgQEAKKworZXh0cmFsb29rCistLS0tLS0tLS0KKworIFNFSEVSS09NTUFORE86CisgICAgZXh0cmFsb29rIDx0ZXh0PgorCisgQVJHVU1FTlRFOgorCisgICAgIDx0ZXh0PgorICAgICAgICBEaWUgQmVzY2hyZWlidW5nLgorCisgQkVTQ0hSRUlCVU5HOgorICAgIE1pdCBkaWVzZW0gQmVmZWhsIGthbm5zdCBEdSBEZWluZSBCZXNjaHJlaWJ1bmcgdW0genVzYWV0emxpY2hlbiBUZXh0CisgICAgZXJ3ZWl0ZXJuLgorCisgICAgRGVyIFRleHQgZXJzY2hlaW50IG5hY2ggRGVpbmVyIG5vcm1hbGVuIExhbmdiZXNjaHJlaWJ1bmcgdW5kIHZvciBkZXIKKyAgICBBdWZsaXN0dW5nIERlaW5lcyBJbnZlbnRhcnMuCisKKyAgICBHaWJzdCBEdSBhbHMgPHRleHQ+IG51ciBlaW4gJz8nIGFuLCB3aXJkIERpciBlaW4gYWt0dWVsbGVyIEV4dHJhbG9vaworICAgIGF1c2dlZ2ViZW4uCisgICAgTGFlc3N0IER1IDx0ZXh0PiBnYW56IHdlZywgb2VmZm5ldCBzaWNoIGVpbiBFZGl0b3IsIGluIGRlbSBEdSBEZWluZW4gbmV1ZW4KKyAgICBFeHRyYWxvb2sgZWluZ2ViZW4ga2FubnN0LgorCisgU0lFSEUgQVVDSDoKKyAgICB1bnRlcnN1Y2hlCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFRodSwgMjQuMDcuMTk5NywgMDk6MDA6MDAgdm9uIFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL3NjbWQvZmVobGVybWVsZHVuZyBiL2RvYy9zY21kL2ZlaGxlcm1lbGR1bmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc4NWUwZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zY21kL2ZlaGxlcm1lbGR1bmcKQEAgLTAsMCArMSwyMCBAQAorCitmZWhsZXJtZWxkdW5nCistLS0tLS0tLS0tLS0tCisKKyBTRUhFUktPTU1BTkRPOgorICAgIGZlaGxlcm1lbGR1bmcgWzx0ZXh0Pl0KKworIEFSR1VNRU5URToKKworICAgICA8dGV4dD4KKyAgICAgICAgVGV4dCBkZXIgbmV1ZW4gRmVobGVybWVsZHVuZyAob3B0aW9uYWwpCisKKyBCRVNDSFJFSUJVTkc6CisgICAgTWl0IGRpZXNlbSBCZWZlaGwga2FubnN0IER1IERpciBlaW5lIG5ldWUgRmVobGVybWVsZHVuZyBhbnN0ZWxsZSBkZXMKKyAgICB1ZWJsaWNoZW4gIldpZSBiaXR0ZT8iIHNldHplbi4KKworICAgIExhZXNzdCBEdSA8dGV4dD4gd2VnLCB3aXJkIHdpZWRlciBhdWYgIldpZSBiaXR0ZT8iIHp1cnVlY2tnZXNjaGFsdGV0LgorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBUaHUsIDI0LjA3LjE5OTcsIDA5OjAwOjAwIHZvbiBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9zY21kL2ZsdWNodHJpY2h0dW5nIGIvZG9jL3NjbWQvZmx1Y2h0cmljaHR1bmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I5YTU2NQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zY21kL2ZsdWNodHJpY2h0dW5nCkBAIC0wLDAgKzEsNDAgQEAKKworZmx1Y2h0cmljaHR1bmcKKy0tLS0tLS0tLS0tLS0tCisKKyBTRUhFUktPTU1BTkRPOgorICAgIGZsdWNodHJpY2h0dW5nIDxiZWZlaGw+CisKKyBBUkdVTUVOVEU6CisKKyAgICAgPGJlZmVobD4KKyAgICAgICAgRGVyIEJlZmVobCBmdWVyIGRpZSBiZXZvcnp1Z3RlIEZsdWNodHJpY2h0dW5nLgorCisgQkVTQ0hSRUlCVU5HOgorICAgIFNldHp0IGRpZSBiZXZvcnp1Z3RlIEZsdWNodHJpY2h0dW5nIGZ1ZXIgZGVuIFZvcnNpY2h0c21vZHVzLgorCisgICAgRGllc2UgUmljaHR1bmcgd2lyZCBiZWkgZGVyIEZsdWNodCBtaXQgZWluZXIgZ2V3aXNzZW4gV2FocnNjaGVpbmxpY2hrZWl0CisgICAgYWxzIGVyc3RlcyBhdXNwcm9iaWVydCwgZmFsbHMgbW9lZ2xpY2guIERpZSBXYWhyc2NoZWlubGljaGtlaXQgYmV0cmFlZ3QKKyAgICA2MCUgYmVpIFN0dWZlIDMwIHVuZCBuaW1tdCBtaXQgamVkZXIgd2VpdGVyZW4gU3R1ZmUgdW0gY2EuIDEsMyBQcm96ZW50LQorICAgIHB1bmt0ZSB6dS4KKworICAgIEZhbGxzIGRpZSBGbHVjaHQgaW4gZGllc2UgUmljaHR1bmcgbmljaHQgZ2VsaW5ndCwgd2VyZGVuIGRpZSBhbmRlcmVuCisgICAgUmljaHR1bmdlbiB3aWUgYmlzaGVyIGF1c3Byb2JpZXJ0LgorCisgQkVJU1BJRUxFOgorICAgIFdlbm4gbWFuIGJldm9yenVndCBuYWNoIE9zdGVuIGZsaWVoZW4gd2lsbDoKKworICAgID4gZmx1Y2h0cmljaHR1bmcgb3N0ZW4KKyAgICAgICAgb2RlcgorICAgID4gZmx1Y2h0cmljaHR1bmcgbworCisgICAgV2VubiBtYW4gInRyYWRpdGlvbmVsbCIgZmx1ZWNodGVuIHdpbGwsIGRpZXMgYWJlciBrb21tZW50aWVyZW4gbW9lY2h0ZSwKKyAgICBrYW5uIG1hbiBhdWNoIGZvbGdlbmRlcyBuZWhtZW46CisKKyAgICA+IGZsdWNodHJpY2h0dW5nIHNhZyBPaCwgc2hpdCEKKworIFNJRUhFIEFVQ0g6CisgICAgdm9yc2ljaHQsIHJlcG9ydAorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBNaXQsIDA3LjAxLjIwMDQsICB2b24gUmlrdXMKZGlmZiAtLWdpdCBhL2RvYy9zY21kL2hhdXNiYXUgYi9kb2Mvc2NtZC9oYXVzYmF1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZTA0ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2NtZC9oYXVzYmF1CkBAIC0wLDAgKzEsNDAgQEAKKworQWxsZ2VtZWluZXMgenVtIEhhdXNiYXUKKz09PT09PT09PT09PT09PT09PT09PT09CisKKyBBTExHRU1FSU46CisgICAgVW0gZWluIEhhdXMgenUgYmF1ZW4sIG11c3MgbWFuIHNpY2ggaW4gZGllIEZpbGlhbGUgZGVyIE1vcmdlbkdyYXVlbi1CYW5rCisgICAgKERlciBCYW5rIGluIElocmVtIFJ1ZWNrZW4pIGJlZ2ViZW4gdW5kIGFtIEFudHJhZ3NjaGFsdGVyIGVpbmVuCisgICAgQmF1c3BhcnZlcnRyYWcgZXJ3ZXJiZW4uIEhhdCBtYW4gZGllc2VuIHVudGVyemVpY2huZXQgKGViZW5mYWxscyBhbQorICAgIEFudHJhZ3NjaGFsdGVyKSwga2FubiBtYW4gc2ljaCBhbiBkaWUgRmluYW56aWVydW5nIHNlaW5lcyBIYXVzZXMgYmVnZWJlbi4KKyAgICBBbGxlcyB3ZWl0ZXJlIGhpZXJ6dSBpc3QgaW0gVmVydHJhZyBiZXNjaHJpZWJlbi4KKworICAgIFNvbGx0ZXN0IER1IGVzIERpciBkYW5uIGRvY2ggbm9jaCBlaW5tYWwgYW5kZXJzIHVlYmVybGVnZW4sIGthbm5zdCBEdSBkZW4KKyAgICBWZXJ0cmFnIGplZGVyemVpdCB6ZXJyZWlzc2VuLiBTY2hvbiBlaW5nZXphaGx0ZSBSYXRlbiBzaW5kIGFsbGVyZGluZ3MKKyAgICB1bndpZGVycnVmbGljaCB2ZXJsb3JlbiEKKworICAgIEhhc3QgRHUgZGllIEZpbmFuemllcnVuZ3NwaGFzZSBoaW50ZXIgRGljaCBnZWJyYWNodCwga2FubnN0IER1IERpciBhbQorICAgIEF1c2dhYmVzY2hhbHRlciBlaW4gSW5zdGFudGhhdXMgYWJob2xlbi4gRGFubiBrYW5uc3QgRHUgRGljaCBhdWYgZGllIFN1Y2hlCisgICAgbmFjaCBlaW5lbSBnZWVpZ25ldGVuIEJhdXBsYXR6IG1hY2hlbi4gRGFzIHdlaXRlcmUgVm9yZ2VoZW4gaXN0IG1pdCAiaGlsZmUKKyAgICBpbnN0YW50aGF1cyIgZXJmYWhyYmFyLgorCisgICAgU29sbCBkYXMgSGF1cyBzcGFldGVyIHVtIG5ldWUgUmFldW1lIGVyd2VpdGVydCB3ZXJkZW4sIG11c3N0IER1IERpY2gKKyAgICB3aWVkZXIgenVtIEFudHJhZ3NjaGFsdGVyIGJlZ2ViZW4uIE51biBtdXNzdCBEdSBqZWRvY2ggZWluZW4gQXVzYmF1dmVydHJhZworICAgIGJlYW50cmFnZW4uIERhcyBTcGFyZW4gZXJmb2xndCBhdWYgZGllIGdsZWljaGUgV2Vpc2Ugd2llIGJlaW0gSGF1c2JhdSwKKyAgICBhbGxlcmRpbmdzIHdpcmQgZGVyIEF1c2JhdSBuYWNoIEF1ZmJyaW5nZW4gZGVyIFN1bW1lIG9obmUgZWlnZW5lcyBadXR1bgorICAgIHZvcmdlbm9tbWVuIChlcyBnaWJ0IGFsc28ga2VpbmVuIEluc3RhbnRyYXVtKS4KKworICAgIE1hbiBrYW5uIG5ldW4gd2VpdGVyZSBSYWV1bWUgZGF6dWthdWZlbiwgc28gZGFzcyBtYW4gbWF4aW1hbCB1ZWJlciBlaW4KKyAgICAxMC1aaW1tZXItSGF1cyB2ZXJmdWVnZW4ga2Fubi4KKworICAgIEVzIGlzdCBhbGxlcmRpbmdzIGF1Y2ggbW9lZ2xpY2gsIHNlaW4gSGF1cyBtaXQgZWluZW0gTmFjaGJhcmhhdXMgenUKKyAgICB2ZXJiaW5kZW4gKG5hdHVlcmxpY2ggbnVyIGluIGdlZ2Vuc2VpdGlnZW0gRWludmVyc3RhZW5kbmlzKS4gTmFlaGVyZXMKKyAgICBoaWVyenUgZXJmYWVocnQgbWFuIG1pdCAiaGlsZmUgYXVzZ2FuZyIuCisKKyBTSUVIRSBBVUNIOgorICAgIGluc3RhbnRoYXVzLCBzZWhlcmhhdXMsCisgICAgYWVuZGVyZSwgYXVzZ2FuZywgYmVzY2hyZWliZSwgZXJsYXViZSwga29waWVyZSwgbGljaHQsIGxvZXNjaGUsIG1lbGR1bmdlbiwKKyAgICBub3Rpeiwgc2NoaWViZSwgc3BlcnJlLCBzcGlvbiwgdWViZXJzaWNodCwgdmVyYmlldGUsIHdlcmZlCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFRodSwgMjQuMDcuMTk5NywgMDk6MDA6MDAgdm9uIFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL3NjbWQvaW5zdGFudGhhdXMgYi9kb2Mvc2NtZC9pbnN0YW50aGF1cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2QyZjJiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NjbWQvaW5zdGFudGhhdXMKQEAgLTAsMCArMSwzMSBAQAorCitBbGxnZW1laW5lcyB6dW0gSW5zdGFudGhhdXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgQUxMR0VNRUlOOgorICAgIERhcyBJbnN0YW50aGF1cyBpc3QgZGllIEtlaW16ZWxsZSBEZWluZXMgU2VoZXJoYXVzZXMuIFdlbm4gRHUgbWVpbnN0LCBlaW5lCisgICAgZ2VlaWduZXRlIFN0ZWxsZSBnZWZ1bmRlbiB6dSBoYWJlbiwga2FubnN0IER1IGVzIGZhbGxlbmxhc3NlbiB1bmQgZ2llc3NlbiwKKyAgICBkYW1pdCBlcyB6dSBlaW5lbSByaWNodGlnZW4gSGF1cyB3aXJkLgorCisgICAgV2VubiBkaWUgU3RlbGxlIG5pY2h0IGFscyBCYXVwbGF0eiBnZWtlbm56ZWljaG5ldCBpc3QsIGJla29tbXN0IER1IGVpbmUKKyAgICBNZWxkdW5nLCBhbiB3ZWxjaGVuIE1hZ2llciBEdSBEaWNoIHdlbmRlbiBrYW5uc3QuIERpZXNlciBlbnRzY2hlaWRldCBkYW5uLAorICAgIG9iIER1IGRvcnQgYmF1ZW4gZGFyZnN0IG9kZXIgb2IgRHUgRGlyIGJlc3NlciBlaW5lIGFuZGVyZSBTdGVsbGUgc3VjaGVuCisgICAgc29sbHRlc3QuCisKKyBLT01NQU5ET1M6CisgICAgRGFzIEluc3RhbnRoYXVzIHN0ZWxsdCBmb2xnZW5kZSB6d2VpIEJlZmVobGUgenVyIFZlcmZ1ZWd1bmc6CisKKyAgICAgbGFzcyBoYXVzIGZhbGxlbgorICAgICAgICBEdSBsYWVzc3QgZGFzIEhhdXMgZmFsbGVuLiBEYXMgZ2VodCBhbGxlcmRpbmdzIG51ciAiZHJhdXNzZW4iIHVuZCBudXIsCisgICAgICAgIHdlbm4gRGVpbmUgVW1nZWJ1bmcgYWxzIEJhdXBsYXR6IGdla2VubnplaWNobmV0IGlzdC4gRHUga2FubnN0IGVzCisgICAgICAgIHByb2JlaGFsYmVyIGZhbGxlbmxhc3NlbiwgdW0gaGVyYXVzenVmaW5kZW4sIGFuIHdlbiBEdSBEaWNoIGZ1ZXIgZGllCisgICAgICAgIEtlbm56ZWljaG51bmcgd2VuZGVuIG11c3N0LgorICAgICBnaWVzc2UgaGF1cworICAgICAgICBXZW5uIER1IGRhcyBIYXVzIGVyZm9sZ3JlaWNoIGFiZ2VzdGVsbHQgaGFzdCwga2FubnN0IER1IGVzIGR1cmNoIGRhcworICAgICAgICBHaWVzc2VuIHp1IGVpbmVtICJyaWNodGlnZW4iIEhhdXMgZXJ3ZWNrZW4uCisKKyBTSUVIRSBBVUNIOgorICAgIGhhdXNiYXUsIHNlaGVyaGF1cywgcmVnaW9uZW4KKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgVGh1LCAyNC4wNy4xOTk3LCAwOTowMDowMCB2b24gV2FyZ29uCmRpZmYgLS1naXQgYS9kb2Mvc2NtZC9rb3BpZXJlIGIvZG9jL3NjbWQva29waWVyZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTY3NzgwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NjbWQva29waWVyZQpAQCAtMCwwICsxLDcyIEBACisKK2tvcGllcmUKKy0tLS0tLS0KKworIFNFSEVSSEFVU0tPTU1BTkRPOgorICAgIGtvcGllcmUgZGV0YWlsIDxkZXQxPiBuYWNoIDxkZXQyPgorICAgIGtvcGllcmUgbGVzYmFyZXMgZGV0YWlsIDxkZXQxPiBuYWNoIDxkZXQyPgorICAgIGtvcGllcmUgYmVmZWhsIDxiZWYxPiBuYWNoIDxiZWYyPgorICAgIGtvcGllcmUgYmVmZWhsIDxiZWYxPiA8cGFyYTE+IG5hY2ggPGJlZjI+CisgICAga29waWVyZSBiZWZlaGwgPGJlZjE+IDxwYXJhMT4gbmFjaCA8YmVmMj4gPHBhcmEyPgorCisgQVJHVU1FTlRFOgorCisgICAgIDxkZXQxPgorICAgICAgICAobGVzYmFyZXMpIERldGFpbCwgZGVzc2VuIFRleHQga29waWVydCB3ZXJkZW4gc29sbAorICAgICA8ZGV0Mj4KKyAgICAgICAgTGlzdGUgZGVyIHp1IGtvcGllcmVuZGVuIChsZXNiYXJlbikgRGV0YWlscy4gQmVpIG1laHJlcmVuIERldGFpbHMKKyAgICAgICAgbXVlc3NlbiBkaWVzZSBkdXJjaCBLb21tYXRhIHZvbmVpbmFuZGVyIGdldHJlbm50IHNlaW4hCisgICAgIDxiZWYxPgorICAgICAgICBadSBrb3BpZXJlbmRlciBCZWZlaGwuIERpZXMgZGFyZiBudXIgZWluIGVpbnplbG5lcyBWZXJiIHNlaW4hCisgICAgIDxiZWYyPgorICAgICAgICBWZXJiIG9kZXIgTGlzdGUgdm9uIFZlcmJlbiBmdWVyIGRlbiBaaWVsYmVmZWhsLgorICAgICA8cGFyYTE+CisgICAgICAgIFBhcmFtZXRlciwgZGllIGRlbiB6dSBrb3BpZXJlbmRlbiBCZWZlaGwgZ2VuYXVlciBhbmdlYmVuLgorICAgICA8cGFyYTI+CisgICAgICAgIFBhcmFtZXRlciwgZGllIGRlbiBaaWVsYmVmZWhsIGdlbmF1ZXIgYW5nZWJlbi4KKworIEJFU0NIUkVJQlVORzoKKworICAgICBrb3BpZXJlIGRldGFpbCA8ZGV0MT4gbmFjaCA8ZGV0Mj4KKyAgICAga29waWVyZSBsZXNiYXJlcyBkZXRhaWwgPGRldDE+IG5hY2ggPGRldDI+CisgICAgICAgIERpZXNlciBCZWZlaGwgYmVzY2hyZWlidCBkYXMgKGxlc2JhcmUpIERldGFpbCA8ZGV0Mj4gbWl0IGRlbSBUZXh0IHZvbgorICAgICAgICA8ZGV0MT4uIFNlaHIgbnVldHpsaWNoLCB3ZW5uIG1hbiBuYWNodHJhZWdsaWNoIGVpbiBEZXRhaWwgbWl0IGVpbmVtCisgICAgICAgIHdlaXRlcmVuIE5hbWVuIGFuc3ByZWNoYmFyIG1hY2hlbiB3aWxsIHVuZCBrZWluZSBMdXN0IGhhdCwgZGVuIFRleHQKKyAgICAgICAgbm9jaG1hbCB6dSB0aXBwZW4uCisKKyAgICAga29waWVyZSBiZWZlaGwgPGJlZjE+IG5hY2ggPGJlZjI+CisgICAgICAgIEtvcGllcnQgZGVuIEJlZmVobCA8YmVmMT4genUgZGVtIEJlZmVobCA8YmVmMj4gbWl0IGFsbGVuIFBhcmFtZXRlcm4uCisgICAgICAgIFdlbm4gZXMgPGJlZjI+IHNjaG9uIGdhYiwgc28gd2lyZCBkZXNzZW4gUGFyYW1ldGVybGlzdGUgdW0gbmV1ZQorICAgICAgICBQYXJhbWV0ZXIgZXJnYWVuenQuCisKKyAgICAga29waWVyZSBiZWZlaGwgPGJlZjE+IDxwYXJhMT4gbmFjaCA8YmVmMj4KKyAgICAgICAgS29waWVydCBudXIgZGVuIGFuZ2VnZWJlbmVuIFBhcmFtZXRlciB2b24gPGJlZjE+IG5hY2ggPGJlZjI+LgorCisgICAgIGtvcGllcmUgYmVmZWhsIDxiZWYxPiA8cGFyYTE+IG5hY2ggPGJlZjI+IDxwYXJhMj4KKyAgICAgICAgV2llIG9iZW4sIGFsbGVyZGluZ3Mga2FubiBkZXIgUGFyYW1ldGVyIGF1Y2ggZ2VhZW5kZXJ0IHdlcmRlbi4KKworIEJFSVNQSUVMRToKKyAgICBEYXMgRGV0YWlsICJ3YW5kIiBzb2xsIHNpY2ggYXVjaCBhbHMgIndhZW5kZSIgYW5zcHJlY2hlbiBsYXNzZW46CisKKyAgICA+IGtvcGllcmUgZGV0YWlsIHdhbmQgbmFjaCB3YWVuZGUKKworICAgIEFsbGUgImRydWVjayItQmVmZWhsZSBzb2xsZW4gc2ljaCBhdWNoIG1pdCAiZHJ1ZWNrZSIgYW5zcHJlY2hlbiBsYXNzZW46CisKKyAgICA+IGtvcGllcmUgYmVmZWhsIGRydWVjayBuYWNoIGRydWVja2UKKworICAgIFN0YXR0ICJkcnVlY2tlIGhlYmVsIiBzb2xsIG1hbiBqZXR6dCBhdWNoICJ6aWVoZSBoZWJlbCIgdmVyd2VuZGVuIGtvZW5uZW4uCisgICAgImRydWVja2Uga25vcGYiIHNvbGwgamVkb2NoIG5pY2h0IGR1cmNoICJ6aWVoZSBrbm9wZiIgZXJnYWVuenQgd2VyZGVuOgorCisgICAgPiBrb3BpZXJlIGJlZmVobCBkcnVlY2tlIGhlYmVsIG5hY2ggemllaGUKKyAgICAgICAgb2RlcgorICAgID4ga29waWVyZSBiZWZlaGwgZHJ1ZWNrZSBoZWJlbCBuYWNoIHppZWhlIGhlYmVsCisKKyAgICBEZXIgVGV4dCB2b24gImRydWVja2UgaGViZWwiIHdpcmQgamV0enQgYXVjaCBiZWkgInppZWhlIGZhZGVuIiBhdXNnZWdlYmVuOgorCisgICAgPiBrb3BpZXJlIGJlZmVobCBkcnVlY2tlIGhlYmVsIG5hY2ggemllaGUgZmFkZW4KKworIFNJRUhFIEFVQ0g6CisgICAgYWVuZGVyZSwgYmVzY2hyZWliZSwgbG9lc2NoZSwgdWViZXJzaWNodAorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBUaHUsIDI0LjA3LjE5OTcsIDA5OjAwOjAwIHZvbiBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9zY21kL2xpY2h0IGIvZG9jL3NjbWQvbGljaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNjNTc2YgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zY21kL2xpY2h0CkBAIC0wLDAgKzEsMjAgQEAKKworbGljaHQKKy0tLS0tCisKKyBTRUhFUkhBVVNLT01NQU5ETzoKKyAgICBsaWNodCBhbiB8IGF1cworCisgQkVTQ0hSRUlCVU5HOgorICAgICJsaWNodCBhdXMiIHZlcmR1bmtlbHQgZGVuIFJhdW0uIERhYmVpIHdpcmQgZGVyIExpY2h0bGV2ZWwgZGVzIFJhdW1lcyBzbworICAgIGdlc2V0enQsIGRhc3MgZGVyIEdlc2FtdGxpY2h0bGV2ZWwgKGJlcmVjaG5ldCBzaWNoIGF1cyBkZW0gZGVzIFJhdW1lcyB1bmQKKyAgICBkZW0gYWxsZXIgYW53ZXNlbmRlbiBMaWNodHF1ZWxsZW4pIGdlcmFkZSAwIGVyZ2lidC4KKworICAgICJsaWNodCBhbiIgbWFjaHQgZ2VyYWRlIGRhcyBHZWdlbnRlaWw6IGRlciBMaWNodGxldmVsIGRlcyBSYXVtZXMgd2lyZCBzbworICAgIGdlc2V0enQsIGRhc3MgZGVyIFJhdW0gZ2VyYWRlIGVpbmVuIEdlc2FtdGxpY2h0bGV2ZWwgdm9uIDEgaGF0LgorCisgU0lFSEUgQVVDSDoKKyAgICBiZXNjaHJlaWJlCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFRodSwgMjQuMDcuMTk5NywgMDk6MDA6MDAgdm9uIFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL3NjbWQvbG9lc2NoZSBiL2RvYy9zY21kL2xvZXNjaGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcwYjA2MwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zY21kL2xvZXNjaGUKQEAgLTAsMCArMSw2NCBAQAorCitsb2VzY2hlCistLS0tLS0tCisKKyBTRUhFUkhBVVNLT01NQU5ETzoKKyAgICBsb2VzY2hlIGRldGFpbCA8ZGV0PgorICAgIGxvZXNjaGUgbGVzYmFyZXMgZGV0YWlsIDxkZXQ+CisgICAgbG9lc2NoZSBiZWZlaGwgPGJlZj4KKyAgICBsb2VzY2hlIGFsbGVzCisgICAgbG9lc2NoZSBhbGxlIDx3YXM+CisKKyBBUkdVTUVOVEU6CisKKyAgICAgPGRldD4KKyAgICAgICAgTGlzdGUgZGVyIHp1IGxvZXNjaGVuZGVuIChsZXNiYXJlbikgRGV0YWlscy4KKyAgICAgPGJlZj4KKyAgICAgICAgTGlzdGUgZGVyIHp1IGxvZXNjaGVuZGVuIEJlZmVobGUuCisgICAgIDx3YXM+CisgICAgICAgIGBiZWZlaGxlJywgYGRldGFpbHMnIG9kZXIgYGxlc2JhcmUgZGV0YWlscycKKworIEJFU0NIUkVJQlVORzoKKyAgICBEaWVzZXIgQmVmZWhsIGRpZW50IHp1bSBMb2VzY2hlbiB2b24gRGV0YWlscyB1bmQgQmVmZWhsZW4uIERpZSBlaW56ZWxuZW4KKyAgICBBbndlbmR1bmdlbjoKKworICAgICBsb2VzY2hlIGRldGFpbCA8ZGV0PgorICAgICBsb2VzY2hlIGxlc2JhcmVzIGRldGFpbCA8ZGV0PgorICAgICAgICBMb2VzY2h0IGRhcyAobGVzYmFyZSkgRGV0YWlsIDxkZXQ+LiBFcyBrb2VubmVuIGF1Y2ggbWVocmVyZSAobGVzYmFyZSkKKyAgICAgICAgRGV0YWlscyBhdWYgZWlubWFsIGdlbG9lc2NodCB3ZXJkZW47IG1hbiBtdXNzIHNpZSBkYW5uIG1pdCBLb21tYXRhCisgICAgICAgIHZvbmVpbmFuZGVyIHRyZW5uZW4uCisKKyAgICAgbG9lc2NoZSBiZWZlaGwgPGJlZj4KKyAgICAgICAgTG9lc2NodCBkZW4gQmVmZWhsIDxiZWY+LiBXZW5uIGVzIHNpY2ggYmVpIDxiZWY+IHVtIGVpbiBlaW5mYWNoZXMgVmVyYgorICAgICAgICBoYW5kZWx0LCB3ZXJkZW4gYWxsZSBCZWZlaGxlIHp1IGRpZXNlbSBWZXJiIGdlbG9lc2NodC4gSGFuZGVsdCBlcyBzaWNoCisgICAgICAgIHVtIGVpbiBWZXJiIG1pdCBQYXJhbWV0ZXIsIHNvIHdpcmQgbnVyIGRpZXNlciBnYW56IHNwZXppZWxsZSBCZWZlaGwKKyAgICAgICAgZ2Vsb2VzY2h0LgorCisgICAgIGxvZXNjaGUgYWxsZXMKKyAgICAgICAgRXMgd2VyZGVuIEFMTEUgRGV0YWlscywgbGVzYmFyZW4gRGV0YWlscyB1bmQgQmVmZWhsZSBhdWYgZWluZW4gU2NobGFnCisgICAgICAgIGdlbG9lc2NodC4gRGF6dSBtdXNzIG1hbiBub2NoIGRpZSBuYWNoZm9sZ2VuZGUgU2ljaGVyaGVpdHNhYmZyYWdlIG1pdAorICAgICAgICBgamEnIGJlYW50d29ydGVuLgorCisgICAgIGxvZXNjaGUgYWxsZSBbYmVmZWhsZXxkZXRhaWxzfGxlc2JhcmVuIGRldGFpbHNdCisgICAgICAgIEVzIHdlcmRlbiBhbGxlIEJlc2NocmVpYnVuZ2VuIGRlciBqZXdlaWxpZ2VuIFNwYXJ0ZSBnZWxvZXNjaHQuIEF1Y2gKKyAgICAgICAgaGllciBnaWJ0IGVzIGVpbmUgU2ljaGVyaGVpdHNhYmZyYWdlLCBkaWUgbWl0IGBqYScgYmVhbnR3b3J0ZXQgd2VyZGVuCisgICAgICAgIG11c3MuCisKKyBCRUlTUElFTEU6CisgICAgRGllIERldGFpbHMgYHdhbmQnIHVuZCBgd2FlbmRlJyBzb2xsZW4gZ2Vsb2VzY2h0IHdlcmRlbjoKKworICAgID4gbG9lc2NoZSBkZXRhaWwgd2FuZCwgd2FlbmRlCisKKyAgICBBbGxlIGRydWVja2UtQmVmZWhsZSBzb2xsZW4gZ2Vsb2VzY2h0IHdlcmRlbjoKKworICAgID4gbG9lc2NoZSBiZWZlaGwgZHJ1ZWNrZQorCisgICAgTnVyIGRpZSBCZWZlaGxlIGRydWVja2Uga25vcGYgdW5kIGRydWVja2UgcGxhdHRlIHNvbGxlbiBnZWxvZXNjaHQgd2VyZGVuOgorCisgICAgPiBsb2VzY2hlIGJlZmVobCBkcnVlY2tlIGtub3BmLCBkcnVlY2tlIHBsYXR0ZQorCisgU0lFSEUgQVVDSDoKKyAgICBhZW5kZXJlLCBiZXNjaHJlaWJlCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFRodSwgMjQuMDcuMTk5NywgMDk6MDA6MDAgdm9uIFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL3NjbWQvbWVsZHVuZ2VuIGIvZG9jL3NjbWQvbWVsZHVuZ2VuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMmZmNzIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2NtZC9tZWxkdW5nZW4KQEAgLTAsMCArMSwyOCBAQAorCittZWxkdW5nZW4KKy0tLS0tLS0tLQorCisgU0VIRVJIQVVTS09NTUFORE86CisgICAgbWVsZHVuZ2VuCisgICAgbWVsZHVuZ2VuIDxucj4KKyAgICBtZWxkdW5nZW4gaGllcgorCisgQVJHVU1FTlRFOgorCisgICAgIDxucj4KKyAgICAgICAgRWluZSBSYXVtbnVtbWVyIERlaW5lcyBIYXVzZXMKKworIEJFU0NIUkVJQlVORzoKKyAgICAibWVsZHVuZ2VuIiBnaWJ0IGRpZSBlaW5nZWdhbmdlbmVuIFJ1ZWNrbWVsZHVuZ2VuIHZvbiBTcGllbGVybiBpbiBEZWluZW0KKyAgICBIYXVzIGF1cyAoYWxzbyBUeXBvLSwgSWRlZS0gdW5kIEZlaGxlcm1lbGR1bmdlbikuCisKKyAgICAibWVsZHVuZ2VuIDxucj4iIGdpYnQgbnVyIGRpZSBNZWxkdW5nZW4gYXVzIFJhdW0gPG5yPiBhdXMuCisKKyAgICAibWVsZHVuZ2VuIGhpZXIiIGdpYnQgbnVyIGRpZSBNZWxkdW5nZW4gYXVzIGRlbSBSYXVtIGF1cywgaW4gZGVtIER1IGdlcmFkZQorICAgIHN0ZWhzdC4KKworIFNJRUhFIEFVQ0g6CisgICAgYWVuZGVyZSwgYmVzY2hyZWliZQorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBUaHUsIDI0LjA3LjE5OTcsIDA5OjAwOjAwIHZvbiBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9zY21kL25vdGl6IGIvZG9jL3NjbWQvbm90aXoKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMwY2UwZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zY21kL25vdGl6CkBAIC0wLDAgKzEsMzEgQEAKKworbm90aXoKKy0tLS0tCisKKyBTRUhFUkhBVVNLT01NQU5ETzoKKyAgICBub3RpeiA8dGV4dD4KKworIEFSR1VNRU5URToKKworICAgICA8dGV4dD4KKyAgICAgICAgRWluZSBrdXJ6ZSBNaXR0ZWlsdW5nCisKKyBCRVNDSFJFSUJVTkc6CisgICAgTWl0IGRpZXNlbSBCZWZlaGwga2FubnN0IER1IGVpbmUga3VyemUgTm90aXogYW4gZGVyIEhhdXN0dWVyIGFuYnJpbmdlbi4KKyAgICBBdXMgZGllc2VtIEdydW5kIGZ1bmt0aW9uaWVydCBkaWVzZXIgQmVmZWggYXVjaCBudXIgYXVzc2VuIQorCisgICAgT2huZSBQYXJhbWV0ZXIgd2lyZCBkaWUgYWt0dWVsbGUgTm90aXogZ2Vsb2VzY2h0LgorCisgICAgRGllIE5vdGl6IHdpcmQgaW4gZGVyIEZvcm0KKworICAgIEFuIGRlciBUdWVyIGJlZmluZGV0IHNpY2ggZWluZSBOb3RpejogJzx0ZXh0PicuCisKKyAgICBhbiBkaWUgTGFuZ2Jlc2NocmVpYnVuZyBkZXMgSGF1c2VzIGFuZ2VoYWVuZ3QuCisKKyAgICBEaWUgTm90aXogd2lyZCB1ZWJyaWdlbnMgbmljaHQgbWl0IGdlc3BlaWNoZXJ0LgorCisgU0lFSEUgQVVDSDoKKyAgICBiZXNjaHJlaWJlCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFRodSwgMjQuMDcuMTk5NywgMDk6MDA6MDAgdm9uIFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL3NjbWQvcHJlc2F5IGIvZG9jL3NjbWQvcHJlc2F5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MmZmMjEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2NtZC9wcmVzYXkKQEAgLTAsMCArMSwyNiBAQAorCitwcmVzYXkKKy0tLS0tLQorCisgU0VIRVJLT01NQU5ETzoKKyAgICBwcmVzYXkgPHRleHQ+CisKKyBBUkdVTUVOVEU6CisKKyAgICAgPHRleHQ+CisgICAgICAgIERlciBUZXh0IGZ1ZXIgZGFzIFByZXNheS4KKworIEJFU0NIUkVJQlVORzoKKyAgICBEYXMgUHJlc2F5IHdpcmQgaW4gZGVyIEt1cnpiZXNjaHJlaWJ1bmcgZGVzIENoYXJha3RlcnMgdm9yIGRlbiBOYW1lbgorICAgIGdlc2V0enQuCisKKyAgICBgcHJlc2F5JyBvaG5lIDx0ZXh0PiBsb2VzY2h0IGRhcyBtb21lbnRhbiBnZXNldHp0ZSBQcmVzYXkuCisKKyAgICBNYWdpZXIga29lbm5lbiBlcnJlaWNoZW4sIGRhc3MgaWhyIFByZXNheSBhdWNoIGJlaSBkZW4KKyAgICBLb21tdW5pa2F0aW9uc2JlZmVobGVuIG1pdCBhdXNnZWdlYmVuIHdpcmQuCisKKyBTSUVIRSBBVUNIOgorICAgIHRpdGVsLCBzaG93cHJlc2F5IChudXIgTWFnaWVyKQorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBUaHUsIDI0LjA3LjE5OTcsIDA5OjAwOjAwIHZvbiBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9zY21kL3JlbW90ZSBiL2RvYy9zY21kL3JlbW90ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDEzMjhiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NjbWQvcmVtb3RlCkBAIC0wLDAgKzEsNTMgQEAKKworcmVtb3RlCistLS0tLS0KKworIFNFSEVSS09NTUFORE8gKGVyc3QgbmFjaCBCZXN0ZWhlbiBkZXIgS3Jpc3RhbGxrdWdlbHF1ZXN0IHZlcmZ1ZWdiYXIpOgorICAgIHJlbW90ZSA8c3BpZWxlcj4gPHRleHQ+CisgICAgcjogPHNwaWVsZXI+IDx0ZXh0PgorICAgIHI7IDxzcGllbGVyPiA8dGV4dD4KKworIEFSR1VNRU5URToKKworICAgICA8c3BpZWxlcj4KKyAgICAgICAgTmFtZSBkZXMgWmllbHMuCisgICAgIDx0ZXh0PgorICAgICAgICBFaW4gYmVsaWViaWdlciBUZXh0LgorCisgQkVTQ0hSRUlCVU5HOgorICAgIERlciBUZXh0IDx0ZXh0PiB3aXJkIGFuIGRlbiBTcGllbGVyIDxzcGllbGVyPiBhdXNnZWdlYmVuLiBEZW0gVGV4dCB3aXJkCisgICAgZGFiZWkgZGVyIGVpZ2VuZSBOYW1lIHZvcmFuZ2VzdGVsbHQsIHVuZCB6d2FyIGJlaSBgcmVtb3RlJyB1bmQgYHI6JyBpbQorICAgIE5vbWluYXRpdiB1bmQgYmVpIGByOycgaW0gR2VuaXRpdi4KKworICAgIERpZSBBdXNnYWJlIGVyZm9sZ3QgaW4gZm9sZ2VuZGVyIEZvcm06CisKKyAgICA8ZWlnZW5lciBOYW1lPiB0ZXh0IGF1cyBkZXIgRmVybmUuCisKKyAgICBEYXMgImF1cyBkZXIgRmVybmUiIGxhZXNzdCBzaWNoIGR1cmNoIGRlbiBQbGF0emhhbHRlciAjIGF1Y2ggYW4gYmVsaWViaWdlcgorICAgIFN0ZWxsZSBpbiA8dGV4dD4gZWluYmF1ZW4uCisKKyAgICBXZW5uIG1hbiBzdGF0dCBkZXMgImF1cyBkZXIgRmVybmUiIGxpZWJlciBlaW4gImluIGRlciBGZXJuZSIgaGFiZW4gbW9lY2h0ZSwKKyAgICBzbyBrYW5uIG1hbiBkZW4gUGxhdHpoYWx0ZXIgXiB2ZXJ3ZW5kZW4uCisKKyAgICBGYWxscyBtYW4gZGVuIFBsYXR6aGFsdGVyIHNlbGJlciBhdXNnZWJlbiBtb2VjaHRlLCBrYW5uIG1hbiBpaG4gZWluZmFjaAorICAgIHZlcmRvcHBlbG4uIEF1cyAjIyB3aXJkIGRhbm4gIyB1bmQgYXVzIF5eIHdpcmQgXi4KKworIEJFSVNQSUVMRToKKyAgICBXZW5uIFdhcmdvbiBtaXQgc2VpbmVtIFRlc3RlciBTYXBoaXMgdW56dWZyaWVkZW4gaXN0LCBrb21tdCBlcyBhYiB1bmQgYW4KKyAgICB6dSBmb2xnZW5kZW4gdW5zY2hvZW5lbiBTemVuZW46CisKKyAgICBXYXJnb25zIEVpbmdhYmVuOgorICAgID4gcjsgc2FwaGlzIFpvcm4gdHJpZmZ0IERpY2gKKyAgICA+IHI6IHNhcGhpcyBnaWJ0IERpciAjIGVpbmVuIFRyaXR0CisgICAgPiByOiBzYXBoaXMgYWVyZ2VydCBzaWNoIF4gdWViZXIgRGljaAorCisgICAgVW5kIGRpZSBBdXNnYWJlbiBiZWkgU2FwaGlzOgorICAgID4gV2FyZ29ucyBab3JuIHRyaWZmdCBEaWNoIGF1cyBkZXIgRmVybmUuCisgICAgPiBXYXJnb24gZ2lidCBEaXIgYXVzIGRlciBGZXJuZSBlaW5lbiBUcml0dC4KKyAgICA+IFdhcmdvbiBhZXJnZXJ0IHNpY2ggaW4gZGVyIEZlcm5lIHVlYmVyIERpY2guCisKKyBTSUVIRSBBVUNIOgorICAgIGVtb3RlLCBlY2hvLCB2ZXJiZW4KKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgTW9uLCAwMi4wNy4yMDAxLCAxOTowMDowMCB2b24gVGlhbWFrCmRpZmYgLS1naXQgYS9kb2Mvc2NtZC9yZXZpZXcgYi9kb2Mvc2NtZC9yZXZpZXcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEzMTY2NQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zY21kL3JldmlldwpAQCAtMCwwICsxLDI0IEBACisKK3JldmlldworLS0tLS0tCisKKyBTRUhFUktPTU1BTkRPOgorICAgIHJldmlldworCisgQVJHVU1FTlRFOgorICAgIGtlaW5lCisKKyBCRVNDSFJFSUJVTkc6CisgICAgRXMgd2VyZGVuIGRpZSBNZWxkdW5nZW4gYXVzZ2VnZWJlbiwgZGllIEFud2VzZW5kZSBlcmhhbHRlbiwgd2VubiBEdSBlaW5lbgorICAgIFJhdW0gYmV0cml0dHN0IG9kZXIgdmVybGFlc3N0LCBzb3dpZSBkaWUgTWVsZHVuZ2VuLCB3ZW5uIER1IGVpbmVuIEdlZ25lcgorICAgIG1pdCBibG9zc2VuIEhhZW5kZW4gYW5ncmVpZnN0LgorCisgICAgQmVpIE1hZ2llcm4gd2VyZGVuIGF1c3NlcmRlbSBub2NoIGRpZSBNZWxkdW5nZW4gYW5nZXplaWd0LCBkaWUgdm9uIGRlbgorICAgIEJlZmVobGVuIGNsb25lIHVuZCBkZXN0cnVjdCBhdXNnZWdlYmVuIHdlcmRlbi4KKworIFNJRUhFIEFVQ0g6CisgICAgc2V0bWluLCBzZXRtb3V0LCBzZXRtbWluLCBzZXRtbW91dCwgc2V0aGFuZHMKKyAgICBOdXIgTWFnaWVyOiBzZXRjbXNnLCBzZXRkbXNnCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFRodSwgMjQuMDcuMTk5NywgMDk6MDA6MDAgdm9uIFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL3NjbWQvc2NoaWViZSBiL2RvYy9zY21kL3NjaGllYmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM4OTFhYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zY21kL3NjaGllYmUKQEAgLTAsMCArMSwyNyBAQAorCitzY2hpZWJlCistLS0tLS0tCisKKyBTRUhFUkhBVVNLT01NQU5ETzoKKyAgICBzY2hpZWJlIDx0cnVoZT4gbmFjaCA8cmljaHR1bmc+CisKKyBBUkdVTUVOVEU6CisKKyAgICAgPHRydWhlPgorICAgICAgICBFaW4gZ3VlbHRpZ2VyIEJlemVpY2huZXIgZGVyIFRydWhlCisgICAgIDxyaWNodHVuZz4KKyAgICAgICAgRGllIFJpY2h0dW5nLCBpbiBkaWUgZGllIFRydWhlIGdlc2Nob2JlbiB3ZXJkZW4gc29sbC4KKworIEJFU0NIUkVJQlVORzoKKyAgICBNaXQgZGllc2VtIEJlZmVobCBrYW5uIG1hbiBzZWluZSBUcnVoZSBpbm5lcmhhbGIgc2VpbmVzIEhhdXNlcyBmcmVpCisgICAgdmVyc2NoaWViZW4uCisKKyAgICBEZXIgWmllbHJhdW0gbXVzcyB6dW0gZWlnZW5lbiBIYXVzIGdlaG9lcmVuOyBhdWNoIHdlbm4gbWFuIGVpbgorICAgIGJlbmFjaGJhcnRlcyBTZWhlcmhhdXMgbWl0bnV0enQsIGthbm4gZGllIFRydWhlIGRvcnQgbmljaHQgaGluZ2VzY2hvYmVuCisgICAgd2VyZGVuIQorCisgU0lFSEUgQVVDSDoKKyAgICBiZXNjaHJlaWJlCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFRodSwgMjQuMDcuMTk5NywgMDk6MDA6MDAgdm9uIFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL3NjbWQvc2VoZXJoYXVzIGIvZG9jL3NjbWQvc2VoZXJoYXVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MTA2MDcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2NtZC9zZWhlcmhhdXMKQEAgLTAsMCArMSw1OCBAQAorCitBbGxnZW1laW5lcyB6dSBTZWhlcmhhZXVzZXJuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyBBTExHRU1FSU46CisgICAgRGllIGVpZ2VuZW4gdmllciBXYWVuZGUhIFdlciB0cmFldW10IG5pY2h0IGRhdm9uPyBFaW5lIEluc2VsIGRlcgorICAgIFByaXZhdHNwaGFlcmUgaW4gZGVyIGxhZXJtZW5kZW4gT2VmZmVudGxpY2hrZWl0IGRlcyBNb3JnZW5HcmF1ZW4sIGdhbnoKKyAgICBuYWNoIGVpZ2VuZW0gR2VzY2htYWNrIGVpbnJpY2h0LSB1bmQgYXVzYmF1YmFyIQorCisgICAgVW5kIHdlciBoYXQgc2ljaCBuaWNodCBzY2hvbiBpbW1lciBlaW5tYWwgZ2V3dWVuc2NodCwgc2ljaCBtaXQgYGVuZGUnCisgICAgYXVzbG9nZ2VuIHp1IGR1ZXJmZW4sIG9obmUgQW5nc3QgdW0gc2VpbmUgQXVzcnVlc3R1bmcgenUgaGFiZW4/CisKKyAgICBFaW4gd2VpdGVyZXIgVm9ydGVpbDogTmFjaCBkZW0gQXVzbG9nZ2VuIChhbHNvIHBlciBgZW5kZScgb2RlciBuYWNoIGVpbmVtCisgICAgUmVib290KSBiZXRyaXR0IG1hbiBiZWltIG5hZWNoc3RlbiBFaW5sb2dnZW4gZGFzIFNwaWVsIGluIGRlbiBlaWdlbmVuIHZpZXIKKyAgICBXYWVuZGVuIHVuZCBuaWNodCBtZWhyIGFtIFN0YXJ0cHVua3Qgc2VpbmVyIFJhc3NlLgorCisgU1BFWklFTExFUzoKKyAgICBJbSBFaW5nYW5nc3JhdW0gZGVzIEhhdXNlcyBiZWZpbmRldCBzaWNoIGVpbmUgVHJ1aGUsIGluIGRlciBtYW4gd2ljaHRpZ2UKKyAgICBHZWdlbnN0YWVuZGUgYXVmYmV3YWhyZW4ga2Fubiwgb2huZSBiZWZ1ZXJjaHRlbiB6dSBtdWVzc2VuLCBkYXNzIHNpZSB2b24KKyAgICB6dWZhZWxsaWcgdm9yYmVpc2NoYXVlbmRlbiBTcGllbGVybiBlbnR3ZW5kZXQgd2VyZGVuLiBNYW4gc29sbHRlCisgICAgYWxsZXJkaW5ncyBuaWNodCB2ZXJnZXNzZW4sIGRpZSBUcnVoZSBhdWNoIHdpZWRlciB6dSBzY2hsaWVzc2VuLCBuYWNoZGVtCisgICAgbWFuIFNhY2hlbiBoaW5laW5nZWxlZ3QgaGF0Li4uIDteKQorCisgICAgU293b2hsIEdlZ2Vuc3RhZW5kZSBpbiBkZXIgZ2VzY2hsb3NzZW5lbiBUcnVoZSB3aWUgYXVjaCBpbSBhYmdlc2NobG9zc2VuZW4KKyAgICBIYXVzIHNpbmQgendhciB2b3IgZnJlbWRlbSBadWdyaWZmIGdlc2NodWV0enQsIGFiZXIgbmFjaCBlaW5lbSBSZWJvb3Qgd2llCisgICAgdWVibGljaCB2ZXJsb3JlbiAodW5kIHdpZSBtYW4gbGVpY2h0IGVpbnNlaGVuIGthbm4sIGdpYnQgZXMgZGFmdWVyIGF1Y2gKKyAgICBLRUlORSBFbnRzY2hhZWRpZ3VuZyEpLgorCisgICAgRXJ3aXJidCBtYW4gaW0gTGF1ZmUgZGVyIFplaXQgd2VpdGVyZSBSYWV1bWUsIHVtIHNlaW4gSGF1cyBhdXN6dWJhdWVuLCBzbworICAgIHdpcmQgZGllIE51bWVyaWVydW5nIGRlciBSYWV1bWUgd2ljaHRpZzoKKyAgICBEZXIgRWluZ2FuZ3NyYXVtIGhhdCBkaWUgTnVtbWVyIDAsIGRpZSB3ZWl0ZXJlbiBSYWV1bWUgc2luZCBmb3J0bGF1ZmVuZAorICAgIHZvbiAxIGJpcyA5IGR1cmNobnVtZXJpZXJ0LgorICAgIERpZSBOdW1tZXIgZGVzIFJhdW1lcywgaW4gZGVtIG1hbiBzaWNoIGdlcmFkZSBiZWZpbmRldCwgd2lyZCBiZWkgZGVtCisgICAgQmVmZWhsIGB1ZWJlcnNpY2h0JyBhbmdlemVpZ3QuCisKKyAgICBXZW5uIG1hbiBkYXMgSGF1cyBhYmdlc2NobG9zc2VuIGhhdCwga2FubiBlcyBuaWVtYW5kIG1laHIgYmV0cmV0ZW4uIEVzIGlzdAorICAgIGFsbGVyZGluZ3MgTklDSFQgbW9lZ2xpY2gsIGplbWFuZGVuIGltIEhhdXMgZWluenVzcGVycmVuIQorCisgICAgQmVzY2hyZWlidW5nZW4gZXRjLiBzaW5kIG51ciBpbSAqZWlnZW5lbiogSGF1cyBtb2VnbGljaCEgRGllIGVpbnppZ2UKKyAgICBBZW5kZXJ1bmcsIGRpZSBtYW4gYW4gZWluZW0gYW5kZXJlbiBIYXVzIHZvcm5laG1lbiBrYW5uLCBpc3QgZGFzIFNjaGFmZmVuCisgICAgZWluZXIgVmVyYmluZHVuZyAoc2llaGUgZGF6dSBkYXMgYGF1c2dhbmcnLUtvbW1hbmRvKS4KKworICAgIFR5cG8tIHVuZCBJZGVlbWVsZHVuZ2VuLCBkaWUgaW4gRGVpbmVtIEhhdXMgdm9uIGFuZGVyZW4gU3BpZWxlcm4gYWJnZXNldHp0CisgICAgd2VyZGVuLCBsYW5kZW4gaW4gZWluZXIgUmVwb3J0ZGF0ZWksIGRpZSBEdSBtaXQgZGVtIEJlZmVobCBgbWVsZHVuZ2VuJworICAgIGFuc2VoZW4gdW5kIG1pdCBkZW0gYGFlbmRlcmUnLUJlZmVobCBiZWFyYmVpdGVuIGthbm5zdC4KKworICAgIEplZGVyIFJhdW0gZGVzIFNlaGVyaGF1c2VzIGRhcmYgbWF4aW1hbCAxMDAgZWluemVsbmUgT2JqZWt0ZSBiZWluaGFsdGVuLgorICAgIERhYmVpIGdpYnQgZXMgendlaSBVbnRlcnNjaGVpZHVuZ2VuOgorICAgICAgIDM0NSBNdWVuemVuLiAgICAgICAgIC0tPiBEYXMgaXN0IGVpbiBPYmpla3QuCisgICAgICAgRWluIFRpdGFucmluZy4gKDQpICAgLS0+IERhcyBzaW5kIDQgT2JqZWt0ZS4KKworIFNJRUhFIEFVQ0g6CisgICAgYWVuZGVyZSwgYXVzZ2FuZywgYmVzY2hyZWliZSwgZXJsYXViZSwgaGF1c2JhdSwgaW5zdGFudGhhdXMsIGtvcGllcmUsCisgICAgbGljaHQsIGxvZXNjaGUsIG1lbGR1bmdlbiwgbm90aXosIHNjaGllYmUsIHNwZXJyZSwgc3Bpb24sIHVlYmVyc2ljaHQsCisgICAgdmVyYmlldGUsIHdlcmZlCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFRodSwgMjEuMDcuMTk5NywgMjA6MDA6MDAgdm9uIFpvb2suCmRpZmYgLS1naXQgYS9kb2Mvc2NtZC9zZXRoYW5kcyBiL2RvYy9zY21kL3NldGhhbmRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYzYyZmIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2NtZC9zZXRoYW5kcwpAQCAtMCwwICsxLDI1IEBACisKK3NldGhhbmRzCistLS0tLS0tLQorCisgU0VIRVJLT01NQU5ETzoKKyAgICBzZXRoYW5kcyA8dGV4dD4KKworIEFSR1VNRU5URToKKworICAgICA8dGV4dD4KKyAgICAgICAgRGVyIFRleHQsIGRlciBiZWltIEthZW1wZmVuIG1pdCAiZGVuIGJsb3NzZW4gSGFlbmRlbiIgZXJzY2hlaW5lbiBzb2xsLgorCisgQkVTQ0hSRUlCVU5HOgorICAgIE5vcm1hbGVyd2Vpc2UgZXJzY2hlaW50IGJlaW0gS2FlbXBmZW4gb2huZSBXYWZmZW4gZWluZSBNZWxkdW5nOgorCisgICAgPiAgRHUgZ3JlaWZzdCA8R2VnbmVyPiBtaXQgYmxvc3NlbiBIYWVuZGVuIGFuLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgXj09PT09PT09PT09PT09PT09XgorCisgICAgRGllc2VuIFRleHQga2FubiBtYW4gZHVyY2ggPHRleHQ+IGVyc2V0emVuLgorCisgU0lFSEUgQVVDSDoKKyAgICByZXZpZXcKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgVGh1LCAyNC4wNy4xOTk3LCAwOTowMDowMCB2b24gV2FyZ29uCmRpZmYgLS1naXQgYS9kb2Mvc2NtZC9zZXRtaW4gYi9kb2Mvc2NtZC9zZXRtaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlmODdhMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zY21kL3NldG1pbgpAQCAtMCwwICsxLDI0IEBACisKK3NldG1pbgorLS0tLS0tCisKKyBTRUhFUktPTU1BTkRPOgorICAgIHNldG1pbiBbPHRleHQ+XQorCisgQVJHVU1FTlRFOgorCisgICAgIDx0ZXh0PiAob3B0aW9uYWwpCisgICAgICAgIERpZSBuZXVlIEVpbmdhbmdzbWVsZHVuZy4KKworIEJFU0NIUkVJQlVORzoKKyAgICBNaXQgZGllc2VtIEtvbW1hbmRvIGthbm4gZGllIE1lbGR1bmcgZGVmaW5pZXJ0IHdlcmRlbiwgZGllIGFuZGVyZSBTcGllbGVyCisgICAgc2VoZW4sIHdlbm4gbWFuIGluIGRlbiBSYXVtIGhpbmVpbmdlaHQuIERhYmVpIHdpcmQgZGVtIFRleHQgPHRleHQ+IG5vY2gKKyAgICBEZWluIE5hbWUgdm9yYW5nZXN0ZWxsdC4KKworICAgIE9obmUgPHRleHQ+IHdpcmQgd2llZGVyIGRpZSBEZWZhdWx0bWVsZHVuZyBha3Rpdi4KKworIFNJRUhFIEFVQ0g6CisgICAgc2V0bW91dCwgc2V0bW1pbiwgc2V0bW1vdXQsIHJldmlldworCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBUaHUsIDI0LjA3LjE5OTcsIDA5OjAwOjAwIHZvbiBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9zY21kL3NldG1taW4gYi9kb2Mvc2NtZC9zZXRtbWluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwODE0MWMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2NtZC9zZXRtbWluCkBAIC0wLDAgKzEsMjQgQEAKKworc2V0bW1pbgorLS0tLS0tLQorCisgU0VIRVJLT01NQU5ETzoKKyAgICBzZXRtbWluIFs8dGV4dD5dCisKKyBBUkdVTUVOVEU6CisKKyAgICAgPHRleHQ+IChvcHRpb25hbCkKKyAgICAgICAgRGllIG5ldWUgRWluZ2FuZ3NtZWxkdW5nLgorCisgQkVTQ0hSRUlCVU5HOgorICAgIE1pdCBkaWVzZW0gS29tbWFuZG8ga2FubiBkaWUgTWVsZHVuZyBkZWZpbmllcnQgd2VyZGVuLCBkaWUgYW5kZXJlIFNwaWVsZXIKKyAgICBzZWhlbiwgd2VubiBtYW4gaW4gZGVuIFJhdW0gdGVsZXBvcnRpZXJ0IHdpcmQuIERhYmVpIHdpcmQgZGVtIFRleHQgPHRleHQ+CisgICAgbm9jaCBEZWluIE5hbWUgdm9yYW5nZXN0ZWxsdC4KKworICAgIE9obmUgPHRleHQ+IHdpcmQgYXVmIGRpZSBEZWZhdWx0bWVsZHVuZyB6dXJ1ZWNrZ2VzY2hhbHRldC4KKworIFNJRUhFIEFVQ0g6CisgICAgc2V0bWluLCBzZXRtb3V0LCBzZXRtbW91dCwgcmV2aWV3CisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFRodSwgMjQuMDcuMTk5NywgMDk6MDA6MDAgdm9uIFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL3NjbWQvc2V0bW1vdXQgYi9kb2Mvc2NtZC9zZXRtbW91dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmExNTY3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NjbWQvc2V0bW1vdXQKQEAgLTAsMCArMSwyNCBAQAorCitzZXRtbW91dAorLS0tLS0tLS0KKworIFNFSEVSS09NTUFORE86CisgICAgc2V0bW1vdXQgWzx0ZXh0Pl0KKworIEFSR1VNRU5URToKKworICAgICA8dGV4dD4gKG9wdGlvbmFsKQorICAgICAgICBEaWUgbmV1ZSBBdXNnYW5nc21lbGR1bmcuCisKKyBCRVNDSFJFSUJVTkc6CisgICAgTWl0IGRpZXNlbSBLb21tYW5kbyBrYW5uIGRpZSBNZWxkdW5nIGRlZmluaWVydCB3ZXJkZW4sIGRpZSBhbmRlcmUgU3BpZWxlcgorICAgIHNlaGVuLCB3ZW5uIG1hbiBhdXMgZGVtIFJhdW0gdGVsZXBvcnRpZXJ0IHdpcmQuIERhYmVpIHdpcmQgZGVtIFRleHQgPHRleHQ+CisgICAgbm9jaCBEZWluIE5hbWUgdm9yYW5nZXN0ZWxsdC4KKworICAgIExhZXNzdCBtYW4gPHRleHQ+IHdlZywgd2lyZCB3aWVkZXIgZGllIERlZmF1bHRtZWxkdW5nIHZlcndlbmRldC4KKworIFNJRUhFIEFVQ0g6CisgICAgc2V0bW91dCwgc2V0bW1pbiwgc2V0bWluLCByZXZpZXcKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgVGh1LCAyNC4wNy4xOTk3LCAwOTowMDowMCB2b24gV2FyZ29uCmRpZmYgLS1naXQgYS9kb2Mvc2NtZC9zZXRtb3V0IGIvZG9jL3NjbWQvc2V0bW91dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTc2MTRhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NjbWQvc2V0bW91dApAQCAtMCwwICsxLDI3IEBACisKK3NldG1vdXQKKy0tLS0tLS0KKworIFNFSEVSS09NTUFORE86CisgICAgc2V0bW91dCBbPHRleHQ+XQorCisgQVJHVU1FTlRFOgorCisgICAgIDx0ZXh0PiAob3B0aW9uYWwpCisgICAgICAgIERpZSBuZXVlIEF1c2dhbmdzbWVsZHVuZy4KKworIEJFU0NIUkVJQlVORzoKKyAgICBNaXQgZGllc2VtIEtvbW1hbmRvIGthbm4gZGllIE1lbGR1bmcgZGVmaW5pZXJ0IHdlcmRlbiwgZGllIGFuZGVyZSBTcGllbGVyCisgICAgc2VoZW4sIHdlbm4gbWFuIGF1cyBkZW0gUmF1bSBoZXJhdXNnZWh0LiBEYWJlaSB3aXJkIGRlbSBUZXh0IDx0ZXh0PiBub2NoCisgICAgRGVpbiBOYW1lIHZvcmFuZ2VzdGVsbHQuCisKKyAgICBFbnRoYWVsdCA8dGV4dD4gZWluICMsIHNvIHdpcmQgZGllc2VzIFplaWNoZW4gaW4gZGVyIE1lbGR1bmcgZHVyY2ggZGllCisgICAgamV3ZWlsaWdlIFJpY2h0dW5nIGVyc2V0enQuCisKKyAgICBPaG5lIDx0ZXh0PiB3aXJkIHdpZWRlciBkaWUgRGVmYXVsdG1lbGR1bmcgdmVyd2VuZGV0LgorCisgU0lFSEUgQVVDSDoKKyAgICBzZXRtbW91dCwgc2V0bWluLCBzZXRtbWluLCByZXZpZXcKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgVGh1LCAyNC4wNy4xOTk3LCAwOTowMDowMCB2b24gV2FyZ29uCmRpZmYgLS1naXQgYS9kb2Mvc2NtZC9zcGVycmUgYi9kb2Mvc2NtZC9zcGVycmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA0NTEyYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zY21kL3NwZXJyZQpAQCAtMCwwICsxLDIyIEBACisKK3NwZXJyZQorLS0tLS0tCisKKyBTRUhFUkhBVVNLT01NQU5ETzoKKyAgICBzcGVycmUgPHJpY2h0dW5nPgorCisgQVJHVU1FTlRFOgorCisgICAgIDxyaWNodHVuZz4KKyAgICAgICAgRWluZSBkZXIgYWNodCBIaW1tZWxzcmljaHR1bmdlbiwgIm9iZW4iIG9kZXIgInVudGVuIi4KKworIEJFU0NIUkVJQlVORzoKKyAgICBEZXIgQXVzZ2FuZywgZGVyIGluIGRpZSBhbmdlZ2ViZW5lIFJpY2h0dW5nIGZ1ZWhydCwgd2lyZCBlbnRmZXJudC4gRGVyCisgICAgZW50c3ByZWNoZW5kZSBBdXNnYW5nIHZvbSBaaWVscmF1bSB6dXJ1ZWNrIHZlcnNjaHdpbmRldCBkYWJlaSBhdXRvbWF0aXNjaAorICAgIG1pdC4KKworIFNJRUhFIEFVQ0g6CisgICAgYXVzZ2FuZywgdWViZXJzaWNodAorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBUaHUsIDI0LjA3LjE5OTcsIDA5OjAwOjAwIHZvbiBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9zY21kL3NwaW9uIGIvZG9jL3NjbWQvc3Bpb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM5MGU3NwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zY21kL3NwaW9uCkBAIC0wLDAgKzEsMjIgQEAKKworc3Bpb24KKy0tLS0tCisKKyBTRUhFUkhBVVNLT01NQU5ETzoKKyAgICBzcGlvbgorCisgQVJHVU1FTlRFOgorICAgIGtlaW5lCisKKyBCRVNDSFJFSUJVTkc6CisgICAgRGVyIFR1ZXJzcGlvbjogRGllc2VzIEtvbW1hbmRvIHplaWd0LCB3ZXIgb2RlciB3YXMgc2ljaCB2b3IgRGVpbmVyCisgICAgSGF1c3R1ZXIgdHVtbWVsdC4gUmVjaHQgbnVldHpsaWNoLCB3ZW5uIGplbWFuZCBhbmtsb3BmdCB1bmQgbWFuIHNpY2gKKyAgICB2ZXJnZXdpc3Nlcm4gd2lsbCwgb2IgbWFuIGlobiBhdWNoIGVpbmxhc3NlbiB3aWxsLgorCisgICAgRGllc2VzIEtvbW1hbmRvIGlzdCBudXIgaW0gRWluZ2FuZ3NyYXVtIHZlcmZ1ZWdiYXIuCisKKyBTSUVIRSBBVUNIOgorICAgIHNlaGVyaGF1cworCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBUaHUsIDI0LjA3LjE5OTcsIDA5OjAwOjAwIHZvbiBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy9zY21kL3RpdGVsIGIvZG9jL3NjbWQvdGl0ZWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYwMDUxMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zY21kL3RpdGVsCkBAIC0wLDAgKzEsMjkgQEAKKwordGl0ZWwKKy0tLS0tCisKKyBTRUhFUktPTU1BTkRPOgorICAgIHRpdGVsIDx0ZXh0PgorICAgIHRpdGVsIDAKKworIEFSR1VNRU5URToKKworICAgICA8dGV4dD4KKyAgICAgICAgRGVyIFRpdGVsdGV4dC4KKworIEJFU0NIUkVJQlVORzoKKyAgICBEZXIgVGV4dCB3aXJkIGFscyBuZXVlciBUaXRlbCBnZXNldHp0LiBEYWJlaSBzb2xsdGUgZGVyIFRpdGVsIG5pY2h0IG1pdAorICAgIGVpbmVtIFNwaWVsZXJ0aXRlbCBpZGVudGlzY2ggb2RlciBlaW5lbSBzb2xjaGVuIHNlaHIgYWVobmxpY2ggc2Vpbi4gRGVyCisgICAgdWViZXJnZWJlbmUgVGV4dCBkYXJmIGVpbiBCYWNrc3BhY2UgKFxiKSBhbSBBbmZhbmcgZW5oYWx0ZW4sIHdlbm4KKyAgICBkYXJhdWYgZWluIEtvbW1hICgsKSBvZGVyIGVpbiBIb2Noa29tbWEgKCcpIGZvbGd0LgorCisgICAgV2lyZCBrZWluIEFyZ3VtZW50IHVlYmVyZ2ViZW4sIHNvIHdpcmQgZGVyIGFrdHVlbGxlIFRpdGVsIGdlbG9lc2NodC4KKworICAgIFdpcmQgMCBhbHMgQXJndW1lbnQgdWViZXJnZWJlbiwgc28gd2lyZCBkZXIgVGl0ZWwgZHVyY2ggZGVuIGFrdHVlbGxlbgorICAgIEdpbGRlbnRpdGVsIGVyc2V0enQuCisKKyBTSUVIRSBBVUNIOgorICAgIHN0dWZlbiwgcHJlc2F5CisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFNhdCwgMzAuMDkuMjAwMCwgMDE6MzQ6MDAgdm9uIEJpZXJjaGVuCmRpZmYgLS1naXQgYS9kb2Mvc2NtZC91ZWJlcnNpY2h0IGIvZG9jL3NjbWQvdWViZXJzaWNodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTMwMDYzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NjbWQvdWViZXJzaWNodApAQCAtMCwwICsxLDI1IEBACisKK3VlYmVyc2ljaHQKKy0tLS0tLS0tLS0KKworIFNFSEVSSEFVU0tPTU1BTkRPOgorICAgIHVlYmVyc2ljaHQKKworIEFSR1VNRU5URToKKyAgICB1ZWJlcnNpY2h0IFtlcmxhdWJ0XQorCisgQkVTQ0hSRUlCVU5HOgorICAgIERpZXNlcyBLb21tYW5kbyB6ZWlndCwgaW4gd2VsY2hlbSBSYXVtIHNlaW5lcyBIYXVzZXMgbWFuIHNpY2ggZ2VyYWRlCisgICAgYmVmaW5kZXQsIHdlbGNoZSBEZXRhaWxzIHVuZCBsZXNiYXJlbiBEZXRhaWxzIG1hbiBoaWVyIGJlc2NocmllYmVuIGhhdCwKKyAgICB1bmQgd2VsY2hlIEF1c2dhZW5nZSB3b2hpbiBmdWVocmVuLgorCisgICAgU3RlaHQgbWFuIGltIEVpbmdhbmdzcmF1bSBzZWluZXMgSGF1c2VzLCB3aXJkIHp1c2FldHpsaWNoIGRpZSBMaXN0ZQorICAgIGRlcmplbmlnZW4gTGV1dGUgYXVzZ2VnZWJlbiwgZGllIGRhcyBIYXVzIHVuZCBkaWUgVHJ1aGUgb2VmZm5lbiBiencuCisgICAgKGFiKXNjaGxpZXNzZW4gZHVlcmZlbi4gR2lidCBtYW4gaW0gRWluZ2FuZ3NyYXVtIGRlbiBQYXJhbWV0ZXIgImVybGF1YnQiCisgICAgYW4sIHdpcmQgbnVyIGRpZXNlIExpc3RlIGF1c2dlZ2ViZW4uCisKKyBTSUVIRSBBVUNIOgorICAgIGJlc2NocmVpYmUsIGxvZXNjaGUsIGtvcGllcmUsIGF1c2dhbmcsIHNwZXJyZSwgZXJsYXViZSwgdmVyYmlldGUKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgVGh1LCAyNC4wNy4xOTk3LCAwOTowMDowMCB2b24gV2FyZ29uCmRpZmYgLS1naXQgYS9kb2Mvc2NtZC92ZXJiaWV0ZSBiL2RvYy9zY21kL3ZlcmJpZXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZTg4YzQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2NtZC92ZXJiaWV0ZQpAQCAtMCwwICsxLDIzIEBACisKK3ZlcmJpZXRlCistLS0tLS0tLQorCisgU0VIRVJIQVVTS09NTUFORE86CisgICAgdmVyYmlldGUgPG5hbWU+CisKKyBBUkdVTUVOVEU6CisKKyAgICAgPG5hbWU+CisgICAgICAgIEVpbiBvZGVyIG1laHJlcmUgTmFtZShuKSAoZHVyY2ggS29tbWF0YSBnZXRyZW5udCkuCisKKyBCRVNDSFJFSUJVTkc6CisgICAgRGVtIFNwaWVsZXIgPG5hbWU+IHdpcmQgZGllIEVybGF1Ym5pcywgRGVpbiBIYXVzIGF1Zi0gdW5kIGFic2NobGllc3NlbgorICAgIHNvd2llIGRpZSBUcnVoZSBvZWZmbmVuIHp1IGR1ZXJmZW4sIHdpZWRlciBlbnR6b2dlbi4KKworICAgIERpZXNlciBCZWZlaGwgaXN0IG51ciBpbSBFaW5nYW5nc3JhdW0gZGVzIEhhdXNlcyB2ZXJmdWVnYmFyIQorCisgU0lFSEUgQVVDSDoKKyAgICBlcmxhdWJlLCB1ZWJlcnNpY2h0CisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFRodSwgMjQuMDcuMTk5NywgMDk6MDA6MDAgdm9uIFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL3NjbWQvd2VyZmUgYi9kb2Mvc2NtZC93ZXJmZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTQwNDFkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NjbWQvd2VyZmUKQEAgLTAsMCArMSwzMyBAQAorCit3ZXJmZQorLS0tLS0KKworIFNFSEVSSEFVU0tPTU1BTkRPOgorICAgIHdlcmZlIDx3YXM+IHJhdXMKKyAgICB3ZXJmZSBhbGxlIHJhdXMKKyAgICB3ZXJmZSBhbGxlcyByYXVzCisKKyBBUkdVTUVOVEU6CisKKyAgICAgPHdhcz4KKyAgICAgICAgRGFzIGF1cyBkZW0gSGF1cyB6dSB3ZXJmZW5kZSBPYmpla3QuCisKKyBCRVNDSFJFSUJVTkc6CisgICAgV2VubiBEaXIgaW4gRGVpbmVtIEhhdXMgamVtYW5kIGZ1ZXJjaHRlcmxpY2ggYXVmIGRpZSBOZXJ2ZW4gZ2VodCwga2FubnN0CisgICAgRHUgaWhuIG1pdCBkaWVzZW0gS29tbWFuZG8gdm9yIGRpZSBIYXVzdHVlciBrb21wbGltZW50aWVyZW4uCisKKyAgICBGYWxscyBEaXIgYWxsZSBBbndlc2VuZGVuIGF1ZiBkaWUgTmVydmVuIGdlaGVuLCBrYW5uc3QgRHUgc2llIGF1Y2ggYWxsZQorICAgIGF1ZiBlaW5lbiBTY2hsYWcgZW50c29yZ2VuLgorCisgICAgRGllIGRyaXR0ZSBBbHRlcm5hdGl2ZSBkYWdlZ2VuIGRpZW50IGRhenUsIHNhZW10bGljaGUgbGVibG9zZW4KKyAgICBHZWdlbnN0YWVuZGUgYXVzIGRlbSBIYXVzIHp1IHdlcmZlbiAob2J3b2hsIGRhcyBBbmxlZ2VuIHdpbGRlciBNdWVsbGtpcHBlbgorICAgIHZvciBkZW0gSGF1cyBuaWNodCBnZXJhZGUgenVtIGd1dGVuIFRvbiBnZWhvZXJ0IDspCisKKyAgICBEYXMgS29tbWFuZG8gd2lya3QgdWVicmlnZW5zIG51ciBpbiBkZW0gUmF1bSwgaW4gZGVtIGVzIGFuZ2V3ZW5kZXQgd2lyZCwKKyAgICB1bmQgbmljaHQgZXR3YSBpbSBnYW56ZW4gSGF1cy4KKworIFNJRUhFIEFVQ0g6CisgICAgc2VoZXJoYXVzCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFRodSwgMjQuMDcuMTk5NywgMDk6MDA6MDAgdm9uIFdhcmdvbgpkaWZmIC0tZ2l0IGEvZG9jL3NlZnVuL0NvdW50VXAgYi9kb2Mvc2VmdW4vQ291bnRVcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTE1NzgwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NlZnVuL0NvdW50VXAKQEAgLTAsMCArMSwyNSBAQAorRlVOS1RJT046CisJcHVibGljIHZhcmFyZ3Mgc3RyaW5nIENvdW50VXAoIHN0cmluZyAqcywgc3RyaW5nIHNlcCwgc3RyaW5nIGxhc3RzZXAgKTsKKworQVJHVU1FTlRFOgorCSpzCisJICBBcnJheSB2b24gU3RyaW5ncyBtaXQgV29lcnRlcm4uCisgIHNlcAorICAgIFN0cmluZywgZGVyIHp3aXNjaGVuIGRlbiBXb2VydGVuIGluIGRlciBBdWZ6YWVobHVuZyBlaW5nZWZ1ZWd0IHdpcmQuCisgICAgU3RhbmRhcmQ6ICIsICIKKyAgbGFzdHNlcAorICAgIFN0cmluZywgZGVyIHp3aXNjaGVuIGRlbSB2b3JsZXR6dGVuIHVuZCBsZXR6dGVuIEVsZW1lbnQgZWluZ2VmdWVndCB3aXJkLgorICAgIFN0YW5kYXJkOiAiIHVuZCAiCisKK0JFU0NIUkVJQlVORzoKKwlEaWUgV29lcnRlciBXb3J0XzEgYmlzIFdvcnRfbiBhdXMgZGVtIFN0cmluZ2FyYXkgd2VyZGVuIGFscworCUF1ZnphZWhsdW5nIGluIGRlciBGb3JtCisJICBXb3J0XzE8c2VwPldvcnRfMiwgLi4uIFdvcnRfbi0xPGxhc3RzZXA+V29ydF9uCisJenVzYW1tZW5nZXNldHp0LiBNaXQgU3RhbmRhcmR3ZXJ0ZW4gYWxzbzoKKwkgIFdvcnRfMSwgV29ydF8yLCAuLi4gV29ydF9uLTEgdW5kIFdvcnRfbgorCitSVWVDS0dBQkVXRVJUOgorCVN0cmluZyBhbHMgQXVmemFlaGx1bmcgZGVyIGVpbnplbG5lbiBXb2VydGVyLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisxNS4wMy4yMDA4LCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2Mvc2VmdW4vX25vdGlmeV9mYWlsIGIvZG9jL3NlZnVuL19ub3RpZnlfZmFpbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGFhNGRlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NlZnVuL19ub3RpZnlfZmFpbApAQCAtMCwwICsxLDE4IEBACitzaW11bF9lZnVuOjpfbm90aWZ5X2ZhaWwoRSkKK0ZVTktUSU9OOgorICAgICB2b2lkIF9ub3RpZnlfZmFpbChzdHJpbmcgc3RyKQorCitBUkdVTUVOVEU6CisgICAgIHN0cgorCXVtZ2Vicm9jaGVuZXIgRmVobGVybWVsZHVuZ3NzdHJpbmcKKworQkVTQ0hSRUlCVU5HOgorICAgICBJZGVudGlzY2hlcyBWZXJoYWx0ZW4genUgbm90aWZ5X2ZhaWwoRSksIGJpcyBkYXJhdWYsIGRhc3MgYmVpIGJlcmVpdHMKKyAgICAgZ2VzZXR6dGVyIEZlaGxlcm1lbGR1bmcgX2tlaW5lXyBuZXVlIEZlaGxlcm1lbGR1bmcgZ2VzZXR6dCB3aXJkLgorCitTSUVIRSBBVUNIOgorICAgICBub3RpZnlfZmFpbChFKSwgUF9BQ1RVQUxfTk9USUZZX0ZBSUwKKyAgICAgYWRkX2FjdGlvbihFKSwgQWRkQ21kKEwpLCBBZGRBY3Rpb24oTCksCisgICAgIHF1ZXJ5X3ZlcmIoRSkKKworMjQgTWFlcnogMjAwNCBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL3NlZnVuL2JyZWFrX3N0cmluZyBiL2RvYy9zZWZ1bi9icmVha19zdHJpbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJkNGQ3YgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zZWZ1bi9icmVha19zdHJpbmcKQEAgLTAsMCArMSw5MCBAQAorRlVOS1RJT046CisgICAgc3RyaW5nIGJyZWFrX3N0cmluZyhzdHJpbmcgc3RyKQorICAgIHN0cmluZyBicmVha19zdHJpbmcoc3RyaW5nIHN0ciwgaW50IHdpZHRoKQorICAgIHN0cmluZyBicmVha19zdHJpbmcoc3RyaW5nIHN0ciwgaW50IHdpZHRoLCBzdHJpbmcgaW5kZW50KQorICAgIHN0cmluZyBicmVha19zdHJpbmcoc3RyaW5nIHN0ciwgaW50IHdpZHRoLCBpbnQgc3BhY2UpCisgICAgc3RyaW5nIGJyZWFrX3N0cmluZyhzdHJpbmcgc3RyLCBpbnQgd2lkdGgsIHN0cmluZyBpbmRlbnQsIGludCBmbGFncykKKyAgICBzdHJpbmcgYnJlYWtfc3RyaW5nKHN0cmluZyBzdHIsIGludCB3aWR0aCwgaW50IHNwYWNlLCBpbnQgZmxhZ3MpCisKK0FSR1VNRU5URToKKyAgICBzdHIgICAgLSB1bXp1YnJlY2hlbmRlciBTdHJpbmcKKyAgICB3aWR0aCAgLSBvcHRpb25hbDogbWF4aW1hbGUgWmVpbGVubGFlbmdlIChkZWZhdWx0IDc4KQorICAgIGluZGVudCAtIG9wdGlvbmFsOiBTdHJpbmcsIGRlciB2b3IgamVkZXIgdW1nZWJyb2NoZW5lbiBaZWlsZSBlcnNjaGVpbnQKKyAgICBzcGFjZSAgLSBvcHRpb25hbDogQW56YWhsIGRlciBMZWVyemVpY2hlbiB2b3IgamVkZXIgdW1nZWJyb2NoZW5lbiBaZWlsZQorICAgIGZsYWdzICAtIG9wdGlvbmFsOiBoaWVybWl0IGxhZXNzdCBzaWNoIGRhcyBWZXJoYWx0ZW4gdm9uIGJyZWFrX3N0cmluZygpCisgICAgICAgICAgICAgYWVuZGVybjsgbW9lZ2xpY2hlIEZsYWdzIHNpZWhlIFB1bmt0ICdCZXNjaHJlaWJ1bmcnCisKK0JFU0NIUkVJQlVORzoKKyAgICBJbiBkZXIgZXJzdGVuIEZvcm0gd2lyZCBkZXIgU3RyaW5nICdzdHInIGR1cmNoIEVpbmZ1ZWdlbiB2b24gIlxuIiBzbyB1bS0KKyAgICBnZWJyb2NoZW4sIGRhc3MgYmVpIGVpbmVyIGFuc2NobGllc3NlbmRlbiBBdXNnYWJlIGtlaW5lIFplaWxlIGxhZW5nZXIKKyAgICBhbHMgJ3dpZHRoJyBaZWljaGVuIGlzdC4gRXZlbnR1ZWxsIHNjaG9uIGluICdzdHInIHZvcmhhbmRlbmUgIlxuIiB3ZXJkZW4KKyAgICBkYWJlaSB2b3JoZXIgZW50ZmVybnQuCisKKyAgICBHaWJ0IG1hbiB6dXNhZXR6bGljaCBub2NoIGVpbmVuIFN0cmluZyAnaW5kZW50JyBhbiwgc28gd2lyZCBkaWVzZXIgdm9yCisgICAgamVkZSBkZXIgdW1nZWJyb2NoZW5lbiBaZWlsZW4gZ2VzZXR6dC4KKworICAgIEFuYWxvZyB3aXJkIGJlaSBkZXIgQW5nYWJlIGRlciBaYWhsICdzcGFjZScgZWluIFN0cmluZyBtaXQgJ3NwYWNlJyBMZWVyLQorICAgIHplaWNoZW4gdm9yIGplZGUgdW1nZWJyb2NoZW5lIFplaWxlIGdlc2V0enQuCisKKyAgICBadXNhZXR6bGljaCBnaWJ0IGVzIGZvbGdlbmRlIG9wdGlvbmFsZSBGbGFncywgZGllIG1hbiBiZWxpZWJpZyBrb21iaW5pZXJlbgorICAgIGthbm46CisKKyAgICAgICAgQlNfTEVBVkVfTVlfTEZTICAtICBzY2hvbiBpbSBUZXh0IHZvcmhhbmRlbmUgIlxuIiB3ZXJkZW4gYmVpYmVoYWx0ZW4KKyAgICAgICAgQlNfU0lOR0xFX1NQQUNFICAtICBkb3BwZWx0ZSBMZWVyemVpY2hlbiBzb3dpZSBMZWVyemVpY2hlbiBuYWNoIFplaWxlbi0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bWJydWVjaGVuIHdlcmRlbiBlbnRmZXJudAorICAgICAgICBCU19CTE9DSyAgICAgICAgIC0gIGRlciBUZXh0IHdpcmQgaW0gQmxvY2tzYXR6IGZvcm1hdGllcnQKKyAgICAgICAgQlNfTk9fUEFSSU5ERU5UICAtICBiZWkgQmxvY2tzYXR6IG1pdCB2b3JnZWdlYmVuZW4gWmVpbGVudW1icnVlY2hlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCU19CTE9DS3xCU19MRUFWRV9NWV9MRlMpIHdlcmRlbiBaZWlsZW4gbmFjaCAiXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsZXJ3ZWlzZSBtaXQgZWluZW0gTGVlcnplaWNoZW4gYmVnb25uZW4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW0gZGFzIEVpbmZ1ZWdlbiBkZXMgZnVlaHJlbmRlbiBMZWVyemVpY2hlbnMgenUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnRlcmRydWVja2VuLCBtdXNzIEJTX05PX1BBUklOREVOVCBhbmdlZ2ViZW4gd2VyZGVuCisgICAgICAgIEJTX0lOREVOVF9PTkNFICAgLSAgZGllIGVyc3RlIFplaWxlIGRlcyBUZXh0ZXMgd2lyZCBtaXQgdm9yYW5nZXN0ZWxsdGVtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2luZGVudCcgYXVzZ2VnZWJlbjsgYWxsZSBmb2xnZW5kZW4gWmVpbGVuIGJla29tbWVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWluZW4gTGVlcnN0cmluZyB2b3Jhbmdlc3RlbGx0CisgICAgICAgIEJTX1BSRVBFTkRfSU5ERU5UIC0gZGVyIElkZW50IHdpcmQgZGVtIFRleHQgdm9yYW5nZXN0ZWxsdCBzb2Zlcm4gZGVyIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGVudCArIFRleHQgbGFlbmdlciBhbHMgZWluZSBaZWlsZSBpc3QuIERlciBUZXh0CisJCQkgICAgd2lyZCB1bSBlaW4gTGVlcnplaWNoZW4gZWluZ2VydWVja3QsIHdhcyBtaXR0ZWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlNfTk9fUEFSSU5ERU5UIHZlcmhpbmRlcnQgd2VyZGVuIGthbm4uCisKK1JVRUNLR0FCRVdFUlQ6CisgICAgRGVyIHVtZ2Vicm9jaGVuZSBUZXh0LgorCisgICAgTGF1ZnplaXQtRmVobGVyLCB3ZW5uIGRlciBJbmRlbnQgbGFlbmdlciBpc3QgYWxzIGRpZSB2b3JnZWdlYmVuZSBCcmVpdGUuCisKK0JFSVNQSUVMRToKKyAgICB3cml0ZShicmVha19zdHJpbmcoIkRpZXMgaXN0IGVpbiBsYWVuZ2VyZXIgVGV4dC4gTnVyIHNvIGFscyBCZWlzcGllbC4iLDI3KSk7CisKKyAgICAgICAgPT4gRGllcyBpc3QgZWluIGxhZW5nZXJlcgorICAgICAgICAgICBUZXh0LiBOdXIgc28gYWxzIEJlaXNwaWVsLgorCisgICAgd3JpdGUoYnJlYWtfc3RyaW5nKCJNaXQgaW5kZW50IHNpZWh0IGRhcyBzbyBhdXMiLCAzMCwgIldhcmdvbiBzYWd0OiAiKSk7CisKKyAgICAgICAgPT4gV2FyZ29uIHNhZ3Q6IE1pdCBpbmRlbnQgc2llaHQKKyAgICAgICAgICAgV2FyZ29uIHNhZ3Q6IGRhcyBzbyBhdXMKKworICAgIHdyaXRlKGJyZWFrX3N0cmluZygiTWl0IGluZGVudCBzaWVodCBkYXMgc28gYXVzIiwgMzAsICJXYXJnb24gc2FndDogIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJTX0lOREVOVF9PTkNFKSk7CisKKyAgICAgICAgPT4gV2FyZ29uIHNhZ3Q6IE1pdCBpbmRlbnQgc2llaHQKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhcyBzbyBhdXMKKworICAgIHdyaXRlKGJyZWFrX3N0cmluZygiTWl0IExlZXJ6ZWljaGVuIHNpZWh0IGRhcyBzbyBhdXMiLCAzMCwgMikpOworCisgICAgICAgID0+ICAgTWl0IExlZXJ6ZWljaGVuIHNpZWh0IGRhcyBzbworICAgICAgICAgICAgIGF1cy4uLgorCisgICAgd3JpdGUoYnJlYWtfc3RyaW5nKCJJY2ggd2lsbCBlc1xuYWJlciB2b3Jmb3JtYXRpZXJ0ISIsNjAsCisgICAgICAgICAgICAgICAgICAgICAgICAiV2FyZ29uIHNhZ3Q6ICIsIEJTX0xFQVZFX01ZX0xGUykpOworCisgICAgICAgID0+IFdhcmdvbiBzYWd0OiBJY2ggd2lsbCBlcworICAgICAgICAgICBXYXJnb24gc2FndDogYWJlciB2b3Jmb3JtYXRpZXJ0IQorCisgICAgd3JpdGUoYnJlYWtfc3RyaW5nKCJJY2ggd2lsbCBlc1xuYWJlciB2b3Jmb3JtYXRpZXJ0ISIsMzAsCisgICAgICAgICAgICAgICAgICAgICAgICAiV2FyZ29uIHNhZ3Q6ICIsIEJTX1BSRVBFTkRfSU5ERU5UKSk7CisKKyAgICAgICAgPT4gV2FyZ29uIHNhZ3Q6CisgICAgICAgICAgICBJY2ggd2lsbCBlcyBhYmVyIAorICAgICAgICAgICAgdm9yZm9ybWF0aWVydCEKKworU0lFSEUgQVVDSDoKKyAgICBzZW5kZXJ3aWVkZXJob2x1bmcKZGlmZiAtLWdpdCBhL2RvYy9zZWZ1bi9icm9rZW5fY291bnRfYml0cyBiL2RvYy9zZWZ1bi9icm9rZW5fY291bnRfYml0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWU1NmI4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NlZnVuL2Jyb2tlbl9jb3VudF9iaXRzCkBAIC0wLDAgKzEsMjkgQEAKK1NZTk9QU0lTCisgICAgICAgIGludCBjb3VudF9iaXRzIChzdHJpbmcgc3RyKQorCitERVNUUklQVElPTgorICAgICAgICBDb3VudCB0aGUgbnVtYmVyIG9mIHNldCBiaXRzIGluIGJpdHN0cmluZyA8c3RyPiBhbmQgcmV0dXJuIHRoZSBudW1iZXIKKyAgICAgICAgYXMgcmVzdWx0LgorCitOT1RFCisJQml0c3RyaW5ncyBzdG9yZSA2IEJpdHMgcGVyIENoYXJhY3Rlci4gQ29uc2VxdWVudGx5LCB0aGUgZnVuY3Rpb25zIGZvcgorCW1hbmlwdWxhdGluZyBiaXRzdHJpbmdzIChzZWUgYmVsb3cpIGRvIGdlbmVyYWxseSBub3Qgd29yayBvbiBtb3N0CisJc3RyaW5ncy4gQW4gZXhjZXB0aW9uIGlzIHRoaXMgKHMpZWZ1bi4gSXQgYWNjZXB0cyBzdHJpbmdzIHdoaWNoIGFyZQorCW5vdCBjb3JyZWN0IGJpdHN0cmluZ3MgKGxpa2UgZ2V0dWlkKFBMKSksIEJVVDogSXQgZG9lcyBOT1Qgd29yaworCWNvcnJlY3RseSBvbiB0aGVtISBUaGUgcmVzdWx0cyBhcmUgTk9UIHRoZSBjb3JyZWN0IG51bWJlciBvZiBiaXRzIQorCUFkZGl0aW9uYWxseSwgY291bnRfYml0cygpIGluIExETXVkIHJlamVjdHMgc3VjaCBzdHJpbmdzIHdpdGggYW4gZXJyb3IKKwlpbnN0ZWFkIG9mIHJldHVybmluZyBmYWxzZSByZXN1bHRzLCBhcyBhbGwgdGhlIG90aGVyIGZ1bmN0aW9ucyBmb3IKKwliaXRzdHJpbmdzIGRvIGFzIHdlbGwuCisKK0VYQU1QTEVTCisgICAgICAgIHN0cmluZyBzOworCisgICAgICAgIHMgPSBzZXRfYml0KCIiLCAzKTsgcyA9IHNldF9iaXQocywgMTUpOworCisgICAgICAgIGNvdW50X2JpdHMocykgLS0+IHJldHVybnMgMgorCitTRUUgQUxTTworICAgICAgICBjbGVhcl9iaXQoRSksIHNldF9iaXQoRSksIHRlc3RfYml0KEUpLCBuZXh0X2JpdChFKSwgbGFzdF9iaXQoRSksCisgICAgICAgIG9yX2JpdHMoRSksIHhvcl9iaXRzKEUpLCBpbnZlcnRfYml0cyhFKSwgY29weV9iaXRzKEUpCisKKzE5LjEyLjIwMDYsIFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy9zZWZ1bi9jaW5kZW50IGIvZG9jL3NlZnVuL2NpbmRlbnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIxMTliMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zZWZ1bi9jaW5kZW50CkBAIC0wLDAgKzEsOSBAQAorU1lOT1BTSVM6CisgICAgICAgIGludCBjaW5kZW50KHN0cmluZyBmaWxlKQorCitERVNDUklQVElPTjoKKyAgICAgICAgSW5kZW50IGEgZmlsZSB1c2luZyBhbiBMUEMtZW5oYW5jZWQgdmVyc2lvbiBvZiB0aGUgR05VIGluZGVudAorCXByb2dyYW0sIHdoaWNoIGlzIG1vZGVsbGVkIGFmdGVyIHRoZSBCZXJrZWxleSBpbmRlbnQoMSkuCisKK1NFRSBBTFNPOgorCWVkKEUpCmRpZmYgLS1naXQgYS9kb2Mvc2VmdW4vZGVidWdfaW5mbyBiL2RvYy9zZWZ1bi9kZWJ1Z19pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NzQ3YjAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2VmdW4vZGVidWdfaW5mbwpAQCAtMCwwICsxLDQ5MCBAQAorREVQUkVDQVRFRAorU1lOT1BTSVMKKyAgICAgICAgI2luY2x1ZGUgPGRlYnVnX2luZm8uaD4KKworICAgICAgICBtaXhlZCBkZWJ1Z19pbmZvKGludCBmbGFnKQorICAgICAgICBtaXhlZCBkZWJ1Z19pbmZvKGludCBmbGFnLCBtaXhlZCBhcmcpCisgICAgICAgIG1peGVkIGRlYnVnX2luZm8oaW50IGZsYWcsIG1peGVkIGFyZzIsIG1peGVkIGFyZzMpCisKK0JFU0NIUkVJQlVORworICAgICAgICBTYW1tZWx0IGVudHNwcmVjaGVuZCBkZW4gQW5nYWJlbiBpbiA8ZmxhZz4gZ2V3aXNzZSBpbnRlcmUgRGVidWdpbmZvcworICAgICAgICBkZXMgVHJlaWJlcnMuIDxmbGFnPiBrYW5uIGRhYmVpIGZvbGdlbmRlIGluIGRlYnVnX2luZm8uaCBkZWZpbmllcnRlCisgICAgICAgIFdlcnRlIGVudGhhbHRlbjoKKworICAgICAgICBESU5GT19PQkpFQ1QgICAoMCk6IEFuZ2V6ZWlndCB3ZXJkZW4gSW5mb3JtYXRpb25lbiB6dW0gaW4gPGFyZz4KKyAgICAgICAgICAgIHNwZXppZml6aWVydGVuIE9iamVrdCwgenVtIEJlaXNwaWVsIGhlYXJ0X2JlYXQsCisgICAgICAgICAgICBlbmFibGVfY29tbWFuZHMgZXRjLiBEaWUgRnVua3Rpb24gbGllZmVydCAwIHp1cnVlY2suCisKKyAgICAgICAgRElORk9fTUVNT1JZICAgKDEpOiBBbmdlemVpZ3Qgd2VyZGVuIEluZm9ybWF0aW9uZW4genUKKyAgICAgICAgICAgIFNwZWljaGVyYmVsZWd1bmcgdW5kIC1hdXNudXR6dW5nIGRlcyBpbiA8YXJnPiBzcGV6aWZpemllcnRlbgorICAgICAgICAgICAgT2JqZWt0cywgenVtIEJlaXNwaWVsIEFuemFobCBTdHJpbmdzLCBWYXJpYWJsZW4sIGdlZXJidGUgRmlsZXMsCisgICAgICAgICAgICBPYmpla3Rncm9lc3NlIGV0Yy4gRGllIEZ1bmt0aW9uIGxpZWZlcnQgMCB6dXJ1ZWNrLgorCisgICAgICAgIERJTkZPX09CSkxJU1QgICgyKTogZGVidWdfaW5mbygpIGxpZWZlcnQgT2JqZWt0ZSBhdXMgZGVyIGdsb2JhbGVuCisgICAgICAgICAgICBPYmpla3RsaXN0ZS4gV2VubiA8YXJnMj4gbmljaHQgYW5nZWdlYmVuIHdpcmQsIHdpcmQgZGFzIGVyc3RlCisgICAgICAgICAgICBFbGVtZW50IGF1cyBkZXIgT2JqZWt0bGlzdGUgZ2VsaWVyZmVydCwgd2VubiA8YXJnMj4gZWluZSBaYWhsIG4KKyAgICAgICAgICAgIGlzdCwgZGFzIG4tdGUgRWxlbWVudC4gSXN0IDxhcmcyPiBlaW4gT2JqZWt0LCB3ZXJkZW4gZGllCisgICAgICAgICAgICBuYWNoZm9sZ2VuZGVuIE9iamVrdGUgaW4gZGVyIE9iamVrdGxpc3RlIHp1cnVlY2sgZ2VsaWVmZXJ0LgorICAgICAgICAgICAgRGFzIG9wdGlvbmFsZSBBcmd1bWVudCA8YXJnMz4gYmV6ZWljaG5ldCBkaWUgQW56YWhsIHp1cnVlY2sKKyAgICAgICAgICAgIGdlbGllZmVydGVyIE9iamVrdGUuIFdlbm4gPGFyZzM+IDAgaXN0LCB3aXJkIGVpbiBlaW56ZWxuZXMKKyAgICAgICAgICAgIE9iamVrdCB6dXJ1ZWNrIGdlbGllZmVydC4gV2VubiA8YXJnMz4gZWluZSBaYWhsIG0gZW50aGFlbHQsIHdpcmQKKyAgICAgICAgICAgIGVpbiBBcnJheSBtaXQgaG9lY2hzdGVucyBtIEVsZW1lbnRlbiB6dXJ1ZWNrIGdlbGllZmVydC4gQXVmCisgICAgICAgICAgICBkaWVzZSBXZWlzZSBrYW5uIGVpbiBBcnJheSBtaXQgc2FlbXRsaWNoZW4gT2JqZWt0ZW4gaW0gU3BpZWwKKyAgICAgICAgICAgIGVyemV1Z3Qgd2VyZGVuLCB3ZW5uIGZ1ZXIgPGFyZzM+IF9fSU5UX01BWF9fIGdlc2V0enQgd2lyZCAoZWluZQorICAgICAgICAgICAgZW50c3ByZWNoZW5kZSBtYXhpbWFsZSBBcnJheWdyb2Vzc2Ugdm9yYXVzZ2VzZXR6dCkuCisKKyAgICAgICAgRElORk9fTUFMTE9DICAgKDMpOiBFbnRzcHJpY2hlbmQgZGVyIEVpbmdhYmUgZGVzICdtYWxsb2MnLUtvbW1hbmRvcy4KKyAgICAgICAgICAgIEVzIG11ZXNzZW4ga2VpbmUgd2VpdGVyZW4gQXJndW1lbnRlIGFuZ2VnZWJlbiB3ZXJkZW4uCisKKyAgICAgICAgRElORk9fU1RBVFVTICAgKDQpOiBBbmdlemVpZ3Qgd2lyZCBkaWUgU3RhdHVzaW5mb3JtYXRpb24gZGVzIERyaXZlcnMuCisgICAgICAgICAgICBPcHRpb25hbCBrYW5uIGRhcyBBcmd1bWVudCA8YXJnPiBkaWUgV2VydGUgMCwgInRhYmxlcyIsICJzd2FwIiwKKyAgICAgICAgICAgICJtYWxsb2MiIG9kZXIgYW5kZXJlIHZvbSBEcml2ZXIgYWt6ZXB0aWVydGUgQXJndW1lbnRlIGVudGhhbHRlbi4KKyAgICAgICAgICAgIERhcyBSZXN1bHRhdCBpc3QgZWluIGRydWNrYmFyZXIgU3RyaW5nLCBkZXIgZGllIFN0YXR1c2luZm9ybWF0aW9uCisgICAgICAgICAgICBlbnRoYWVsdCwgb2RlciAwLCB3ZW5uIGVpbiB1bmd1ZWx0aWdlcyBBcmd1bWVudCBhbmdlZ2ViZW4gd3VyZGUuCisKKyAgICAgICAgRElORk9fRFVNUCAgICAgKDUpOiBEaWUgZHVyY2ggPGFyZzI+IGFuZ2Vmb3JkZXJ0ZSBJbmZvcm1hdGlvbiB3aXJkCisgICAgICAgICAgICBpbiBlaW4gRmlsZSBnZXNjaHJpZWJlbiwgZGFzIG1hbiBtaXQgPGFyZzM+IGFuZ2ViZW4ga2Fubi4gV2lyZAorICAgICAgICAgICAgPGFyZzM+IG5pY2h0IGFuZ2VnZWJlbiwgd2lyZCBlaW5lIFN0YW5kYXJkZGF0ZWkgdmVyd2VuZGV0LgorICAgICAgICAgICAgZGVidWdfaW5mbygpIHVlYmVycHJ1ZWZ0IG1pdHRlbHMgbWFzdGVyLT52YWxpZF93cml0ZSgpLCBvYiBlcworICAgICAgICAgICAgZGFzIEZpbGUgc2NocmVpYmVuIGthbm4uIEZhbGxzIGJlcmVpdHMgZWluZSBlbnRzcHJlY2hlbmRlIERhdGVpCisgICAgICAgICAgICBleGlzdGllcnQsIHdpcmQgZGllc2UgdWViZXJzY2hyaWViZW4uIERpZSBGdW5rdGlvbiBsaWVmZXJ0IDEKKyAgICAgICAgICAgIGJlaSBFcmZvbGcsIDAgc29uc3QuCisKKyAgICAgICAgICAgIDxhcmcyPiA9PSAib2JqZWN0cyI6IGxpZWZlcnQgSW5mb3JtYXRpb25lbiB1ZWJlciBhbGxlIE9iamVrdGUgaW0KKyAgICAgICAgICAgICAgICBTcGllbCB1bmQgc2NocmVpYnQgZGllc2Ugc3RhbmRhcmRtYWVzc2lnIGluIGRpZSBEYXRlaQorICAgICAgICAgICAgICAgIC9PQkpfRFVNUCwgZGVtIHZhbGlkX3dyaXRlKCkgd2lyZCAnb2JqZHVtcCcgdWViZXJnZWJlbi4KKyAgICAgICAgICAgICAgICBEaWUgRGF0ZWkgZW50aGFlbHQgZnVlciBqZWRlcyBPYmpla3QgZWluZSBaZWlsZSwgaW4gZGVyCisgICAgICAgICAgICAgICAgamV3ZWlscyBmb2xnZW5kZSBJbmZvcm1hdGlvbmVuIGF1ZmdlbGlzdGV0IHNpbmQ6CisgICAgICAgICAgICAgICAgICAtIE5hbWUgZGVzIE9iamVrdHMgKG9iamVjdF9uYW1lKQorICAgICAgICAgICAgICAgICAgLSBHcm9lc3NlIGltIFNwZWljaGVyLCBnZW1laW5zYW1lciBnZW51dHp0ZXIgU3BlaWNoZXIgbnVyCisgICAgICAgICAgICAgICAgICAgIGVpbm1hbCBnZXphZWhsdAorICAgICAgICAgICAgICAgICAgLSBHcm9lc3NlIGltIFNwZWljaGVyLCB3ZW5uIGVzIGtlaW5lIGdlbWVpbnNhbSBnZW51dHp0ZQorICAgICAgICAgICAgICAgICAgICBEYXRlbiBnZWJlbiB3dWVyZGUKKyAgICAgICAgICAgICAgICAgIC0gQW56YWhsIFJlZmVyZW56ZW4KKyAgICAgICAgICAgICAgICAgIC0gJ0hCJywgd2VubiBkYXMgT2JqZWt0IGVpbmVuIGhlYXJ0X2JlYXQgaGF0LCBzb25zdCBuaWNodHMuCisgICAgICAgICAgICAgICAgICAtIGRlciBOYW1lIGRlciBVbWdlYnVuZyBvZGVyICctLScsIHdlbm4gZGFzIE9iamVrdCBrZWluZQorICAgICAgICAgICAgICAgICAgICBVbWdlYnVuZyBoYXQKKyAgICAgICAgICAgICAgICAgIC0gaW4gS2xhbW1lcm4gZGllIEFuemFobCBkZXIgZHVyY2ggZGFzIE9iamVrdCB2ZXJ1cnNhY2h0ZW4KKyAgICAgICAgICAgICAgICAgICAgVmVyYXJiZWl0dW5nc3NjaHJpdHRlbiAoZXhlY3V0aW9uIHRpY2tzKQorICAgICAgICAgICAgICAgICAgLSBkZXIgU3dhcC1TdGF0dXM6CisgICAgICAgICAgICAgICAgICAgICAgPiBuaWNodHMsIHdlbm4gZGFzIE9iamVrdCBuaWNodCBnZXN3YXB0IHd1cmRlCisgICAgICAgICAgICAgICAgICAgICAgPiAnUFJPRyBTV0FQUEVEJywgd2VubiBudXIgZGFzIFByb2dyYW1tIGdlc3dhcHQgd3VyZGUKKyAgICAgICAgICAgICAgICAgICAgICA+ICdWQVIgU1dBUFBFRCcsIHdlbm4gbnVyIGRpZSBWYXJpYWJsZW4gZ2Vzd2FwdCB3dXJkZW4KKyAgICAgICAgICAgICAgICAgICAgICA+ICdTV0FQUEVEJywgd2VubiBiZWlkZSBnZXN3YXB0IHd1cmRlbgorICAgICAgICAgICAgICAgICAgLSBkaWUgWmVpdCwgenUgZGVyIGRhcyBPYmpla3QgZ2VsYWRlbiB3dXJkZS4KKworICAgICAgICAgICAgPGFyZzI+ID09ICJkZXN0cnVjdGVkIjogbGllZmVydCBJbmZvcm1hdGlvbmVuIHVlYmVyIGFsbGUKKyAgICAgICAgICAgICAgICB6ZXJzdG9lcnRlbiBPYmpla3RlIHVuZCBzY2hyZWlidCBkaWVzZSBzdGFuZGFyZG1hZXNzaWcgaW4KKyAgICAgICAgICAgICAgICBkaWUgRGF0ZWkgL0RFU1RfT0JKX0RVTVAsIGRlbSB2YWxpZF93cml0ZSgpIHdpcmQgJ29iamR1bXAnCisgICAgICAgICAgICAgICAgdWViZXJnZWJlbi4gRGllIERhdGVpIGVudGhhZWx0IGZ1ZXIgamVkZXMgT2JqZWt0IGVpbmUgWmVpbGUsCisgICAgICAgICAgICAgICAgaW4gZGVyIGpld2VpbHMgZm9sZ2VuZGUgSW5mb3JtYXRpb25lbiBhdWZnZWxpc3RldCBzaW5kOgorICAgICAgICAgICAgICAgICAgLSBOYW1lIGRlcyBPYmpla3RzIChvYmplY3RfbmFtZSkKKyAgICAgICAgICAgICAgICAgIC0gQW56YWhsIGRlciBSZWZlcmVuemVuCisgICAgICAgICAgICAgICAgICAtICdORVcnLCB3ZW5uIGRhcyBPYmpla3QgaW4gZGllc2VtIFZlcmFyYmVpdHVuZ3N6eWtsdXMKKyAgICAgICAgICAgICAgICAgICAgemVyc3RvZXJ0IHd1cmRlLCBuaWNodHMgd2VubiBlcyBiZXJlaXRzIGZydWVocmUgemVyc3RvZXJ0CisgICAgICAgICAgICAgICAgICAgIHdvcmRlbiB3YXIuCisKKyAgICAgICAgICAgIDxhcmcyPiA9PSAib3Bjb2RlcyI6IGxpZWZlcnQgTnV0enVuZ3NpbmZvcm1hdGlvbmVuIHVlYmVyIGRpZQorICAgICAgICAgICAgICAgIG9wY29kZXMuIFN0YW5kYXJkbWFlc3NpZyB3aXJkIGluIGRpZSBEYXRlaSAvT1BDX0RVTVAKKyAgICAgICAgICAgICAgICBnZXNjaHJpZWJlbi4gdmFsaWRfd3JpdGUoKSB3aXJkICdvcGNkdW1wJyB1ZWJlcmdlYmVuLgorCisgICAgICAgICAgICA8YXJnMj4gPT0gIm1lbW9yeSI6IGxpZWZlcnQgZWluZSBMaXN0ZSBhbGxlciBhbGxva2llcnRlbgorICAgICAgICAgICAgICAgIFNwZWljaGVyYmxvZWNrZS4KKyAgICAgICAgICAgICAgICBTdGFuZGFyZG1hZXNzaWcgd2lyZCBpbiBkaWUgRGF0ZWkgL01FTU9SWV9EVU1QIGdlc2NocmllYmVuOworICAgICAgICAgICAgICAgIHZhbGlkX3dyaXRlKCkgd2lyZCAnbWVtZHVtcCcgdWViZXJnZWJlbi4gIEV4aXN0aWVydCBkaWUKKyAgICAgICAgICAgICAgICBEYXRlaSBiZXJlaXRzLCB3ZXJkZW4gZGllIG5ldWVuIERhdGVuIGFuZ2VoYWVuZ3QuCisgICAgICAgICAgICAgICAgV2VubiBkZXIgQWxsb2thdG9yIGVpbmVuIFNwZWljaGVyYWJ6dWcgbmljaHQgdW50ZXJzdHVldHp0LAorICAgICAgICAgICAgICAgIHdpcmQga2VpbmUgRGF0ZWkgZ2VzY2hyaWViZW4gdW5kIGltbWVyIDAgenVydWVja2dlZ2ViZW4uCisgICAgICAgICAgICAgICAgRGllc2UgRnVua3Rpb24gaXN0IGFtIG51ZXR6bGljaHN0ZW4gd2VubiBkZXIgQWxsb2thdG9yCisgICAgICAgICAgICAgICAgbWl0IE1BTExPQ19UUkFDRSB1bmQgTUFMTE9DX0xQQ19UUkFDRSBrb21waWxpZXJ0CisgICAgICAgICAgICAgICAgd3VyZGUuCisKKworICAgICAgICBESU5GT19EQVRBICAgICg2KTogTGllZmVydCBSb2hkYXRlbiB1ZWJlciBnZXdpc3NlLCBkdXJjaCA8YXJnMj4KKyAgICAgICAgICAgIHNwZXppZml6aWVydGUgQXNwZWt0ZSBkZXMgVHJlaWJlcnMuIERhcyBSZXN1bHRhdCBkZXIgRnVua3Rpb24gaXN0CisgICAgICAgICAgICBlaW4gQXJyYXkgbWl0IGRlciBJbmZvcm1hdGlvbiBvZGVyIDAsIGZhbGxzIDxhcmcyPiBrZWluZW4KKyAgICAgICAgICAgIGd1ZWx0aWdlbiBXZXJ0IGVudGhhbHRlbiBoYXQuCisgICAgICAgICAgICBJc3QgPGFyZzM+IGVpbmUgWmFobCwgZGllIGtsZWluZXIgaXN0IGFscyBkaWUgQW56YWhsIEVsZW1lbnRlIGltCisgICAgICAgICAgICBSZXN1bHRhdC1BcnJheSwgbGllZmVydCBkaWUgRnVua3Rpb24gbnVyIGRhcyBlbnRzcHJlY2hlbmRlCisgICAgICAgICAgICBFbGVtZW50IHp1cnVlY2suCisgICAgICAgICAgICBadWxhZXNzaWdlIFdlcnRlIGZ1ZXIgPGFyZzI+IHNpbmQ6IERJRF9TVEFUVVMsIERJRF9TV0FQIHVuZAorICAgICAgICAgICAgRElEX01BTExPQy4KKworICAgICAgICAgICAgPGFyZzI+ID09IERJRF9TVEFUVVMgKDApOiBMaWVmZXJ0IGRpZSAic3RhdHVzIiB1bmQgInN0YXR1cyB0YWJsZSIKKyAgICAgICAgICAgICAgICBJbmZvcm1hdGlvbi4gRm9sZ2VuZGUgSW5kaXplcyBzaW5kIGRlZmluaWVydDoKKyAgICAgICAgICAgICAgICAgIC0gaW50IERJRF9TVF9CT09UX1RJTUUKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpZSBaZWl0ICh0aW1lKCkpLCB6dSBkZXIgZGFzIE11ZCBnZXN0YXJ0ZXQgd3VyZGUKKyAgICAgICAgICAgICAgICAgIC0gaW50IERJRF9TVF9BQ1RJT05TCisgICAgICAgICAgICAgICAgICAtIGludCBESURfU1RfQUNUSU9OU19TSVpFCisgICAgICAgICAgICAgICAgICAgICAgICBkaWUgQW56YWhsIHVuZCBHcm9lc3NlIGltIFNwZWljaGVyIGRlciBhbGxvemllcnRlbgorICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9ucy4KKyAgICAgICAgICAgICAgICAgIC0gaW50IERJRF9TVF9TSEFET1dTCisgICAgICAgICAgICAgICAgICAtIGludCBESURfU1RfU0hBRE9XU19TSVpFCisgICAgICAgICAgICAgICAgICAgICAgICBBbnphaGwgdW5kIEdyb2Vzc2UgaW0gU3BlaWNoZXIgYWxsZXIgYWxsb3ppZXJ0ZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIFNoYWRvd3MuCisgICAgICAgICAgICAgICAgICAtIGludCBESURfU1RfT0JKRUNUUworICAgICAgICAgICAgICAgICAgLSBpbnQgRElEX1NUX09CSkVDVFNfU0laRQorICAgICAgICAgICAgICAgICAgICAgICAgQW56YWhsIHVuZCBHcm9lc3NlIGltIFNwZWljaGVyIGFsbGVyIE9iamVrdGUuCisgICAgICAgICAgICAgICAgICAtIGludCBESURfU1RfT0JKRUNUU19TV0FQUEVECisgICAgICAgICAgICAgICAgICAtIGludCBESURfU1RfT0JKRUNUU19TV0FQX1NJWkUKKyAgICAgICAgICAgICAgICAgICAgICAgIEFuemFobCB1bmQgR3JvZXNzZSBpbSBTcGVpY2hlciBkZXIgZ2Vzd2FwdGVuCisgICAgICAgICAgICAgICAgICAgICAgICBWYXJpYWJsZW5ibG9lY2tlIGRlciBPYmpla3RlCisgICAgICAgICAgICAgICAgICAtIGludCBESURfU1RfT0JKRUNUU19MSVNUCisgICAgICAgICAgICAgICAgICAgICAgICBBbnphaGwgT2JqZWt0ZSBpbiBkZXIgT2JqZWt0bGlzdGUKKyAgICAgICAgICAgICAgICAgIC0gaW50IERJRF9TVF9PQkpFQ1RTX05FV0xZX0RFU1QKKyAgICAgICAgICAgICAgICAgICAgICAgIEFuemFobCBkZXIgZnJpc2NoIHplcnN0b2VydGVuIE9iamVrdGUgKGQuaC4gT2JqZWt0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpZSBpbiBkaWVzZW0gVmVyYXJiZWl0dW5nc3p5a2x1cyB6ZXJzdG9lcnQgd3VyZGVuKQorICAgICAgICAgICAgICAgICAgLSBpbnQgRElEX1NUX09CSkVDVFNfREVTVFJVQ1RFRAorICAgICAgICAgICAgICAgICAgICAgICAgQW56YWhsIGRlciB6ZXJzdG9lcnRlbiwgYWJlciBub2NoIGltbWVyIHJlZmVyZW56aWVydGVuCisgICAgICAgICAgICAgICAgICAgICAgICBPYmpla3RlLCBvaG5lIGRpZSB1bnRlciBESURfU1RfT0JKRUNUU19ORVdMWV9ERVNUCisgICAgICAgICAgICAgICAgICAgICAgICBiZXJlaXRzIGdlemFlaGx0ZW4uCisgICAgICAgICAgICAgICAgICAtIGludCBESURfU1RfT0JKRUNUU19QUk9DRVNTRUQKKyAgICAgICAgICAgICAgICAgICAgICAgIEFuemFobCBkZXIgZ2VsaXN0ZXRlbiBPYmpla3RlLCBkaWUgaW0gbGV0enRlbgorICAgICAgICAgICAgICAgICAgICAgICAgVmVyYXJiZWl0dW5nc3p5a2x1cyB2ZXJhcmJlaXRldCB3dXJkZW4uCisgICAgICAgICAgICAgICAgICAtIGZsb2F0IERJRF9TVF9PQkpFQ1RTX0FWR19QUk9DCisgICAgICAgICAgICAgICAgICAgICAgICBEdXJjaHNjaG5pdHRsaWNoZXIgQW50ZWlsIGRlciBwcm8gWnlrbHVzIHZlcmFyYmVpdGV0ZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIE9iamVrdGUsIGF1c2dlZHJ1ZWNrdCBpbiBQcm96ZW50ICgwIC4uIDEuMCkKKyAgICAgICAgICAgICAgICAgIC0gaW50IERJRF9TVF9PVEFCTEUKKyAgICAgICAgICAgICAgICAgICAgICAgIEFuemFobCBlaW5nZXRyYWdlbmVyIE9iamVrdGUgaW4gZGVyIE9iamVrdHRhYmVsbGUKKyAgICAgICAgICAgICAgICAgIC0gaW50IERJRF9TVF9PVEFCTEVfU0xPVFMKKyAgICAgICAgICAgICAgICAgICAgICAgIEFuemFobCB2b24gSGFzaHBsYWV0emVuLCBkaWUgdm9uIGplZGVyIE9iamVrdHRhYmVsbGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlcmVpdGdlc3RlbGx0IHdlcmRlbgorICAgICAgICAgICAgICAgICAgLSBpbnQgRElEX1NUX09UQUJMRV9TSVpFCisgICAgICAgICAgICAgICAgICAgICAgICBEdXJjaCBkaWUgT2JqZWt0dGFiZWxsZSBiZWxlZ3RlciBTcGVpY2hlcgorICAgICAgICAgICAgICAgICAgLSBpbnQgRElEX1NUX0hCRUFUX09CSlMKKyAgICAgICAgICAgICAgICAgICAgICAgIEFuemFobCBPYmpla3RlIG1pdCBlaW5lbSBoZWFydF9iZWF0KCkKKyAgICAgICAgICAgICAgICAgIC0gaW50IERJRF9TVF9IQkVBVF9DQUxMUworICAgICAgICAgICAgICAgICAgICAgICAgQW56YWhsIGFrdGl2ZXIgaGVhcnRfYmVhdCgpIFp5a2xlbiBiaXNoZXIgKGQuaC4KKyAgICAgICAgICAgICAgICAgICAgICAgIFp5a2xlbiwgaW4gZGVuZW4gbWluZGVzdGVucyBlaW5lIGhlYXJ0X2JlYXQoKSBGdW5rdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgYXVmZ2VydWZlbiB3dXJkZSkKKyAgICAgICAgICAgICAgICAgIC0gaW50IERJRF9TVF9IQkVBVF9DQUxMU19UT1RBTAorICAgICAgICAgICAgICAgICAgICAgICAgR2VzYW10emFobCB2b24gaGVhcnRfYmVhdCgpIFp5a2xlbiBiaXNoZXIuCisgICAgICAgICAgICAgICAgICAtIGludCBESURfU1RfSEJFQVRfU0xPVFMKKyAgICAgICAgICAgICAgICAgIC0gaW50IERJRF9TVF9IQkVBVF9TSVpFCisgICAgICAgICAgICAgICAgICAgICAgICBBbnphaGwgdW5kIEdyb2Vzc2UgYWxsZXIgYWxsb3ppZXJ0ZW4gRWludHJhZWdlIGluIGRlcgorICAgICAgICAgICAgICAgICAgICAgICAgaGVhcnRfYmVhdCgpIFRhYmVsbGUuCisgICAgICAgICAgICAgICAgICAtIGludCBESURfU1RfSEJFQVRfUFJPQ0VTU0VECisgICAgICAgICAgICAgICAgICAgICAgICBBbnphaGwgaGVhcnRfYmVhdCgpcyBpbSBsZXR6dGVuIFp5a2x1cworICAgICAgICAgICAgICAgICAgLSBmbG9hdCBESURfU1RfSEJFQVRfQVZHX1BST0MKKyAgICAgICAgICAgICAgICAgICAgICAgIER1cmNoc2Nobml0dGxpY2hlciBBbnRlaWwgZGVyIHBybyBaeWtsdXMgYXVmZ2VydWZlbmVuCisgICAgICAgICAgICAgICAgICAgICAgICBoZWFydF9iZWF0KClzLCBhdXNnZWRydWVja3QgaW4gUHJvemVudCAoMCAuLiAxLjApCisgICAgICAgICAgICAgICAgICAtIGludCBESURfU1RfQ0FMTE9VVFMKKyAgICAgICAgICAgICAgICAgICAgICAgIEFuemFobCB1bmQgR3JvZXNzZSBhbGxlciBsYXVmZW5kZW4gY2FsbF9vdXQoKXMKKyAgICAgICAgICAgICAgICAgIC0gaW50IERJRF9TVF9BUlJBWVMKKyAgICAgICAgICAgICAgICAgIC0gaW50IERJRF9TVF9BUlJBWVNfU0laRQorICAgICAgICAgICAgICAgICAgICAgICAgQW56YWhsIHVuZCBHcm9lc3NlIGFsbGVyIEFycmF5cworICAgICAgICAgICAgICAgICAgLSBpbnQgRElEX1NUX01BUFBJTkdTCisgICAgICAgICAgICAgICAgICAtIGludCBESURfU1RfTUFQUElOR1NfU0laRQorICAgICAgICAgICAgICAgICAgICAgICAgQW56YWhsIHVuZCBHcm9lc3NlIGFsbGVyIE1hcHBpbmdzCisgICAgICAgICAgICAgICAgICAtIGludCBESURfU1RfUFJPR1MKKyAgICAgICAgICAgICAgICAgIC0gaW50IERJRF9TVF9QUk9HU19TSVpFCisgICAgICAgICAgICAgICAgICAgICAgICBBbnphaGwgdW5kIEdyb2Vzc2UgYWxsZXIgUHJvZ3JhbW1lCisgICAgICAgICAgICAgICAgICAtIGludCBESURfU1RfUFJPR1NfU1dBUFBFRAorICAgICAgICAgICAgICAgICAgLSBpbnQgRElEX1NUX1BST0dTX1NXQVBfU0laRQorICAgICAgICAgICAgICAgICAgICAgICAgQW56YWhsIHVuZCBHcm9lc3NlIGRlciBnZXN3YXB0ZW4gUHJvZ3JhbW1lCisgICAgICAgICAgICAgICAgICAtIGludCBESURfU1RfVVNFUl9SRVNFUlZFCisgICAgICAgICAgICAgICAgICAtIGludCBESURfU1RfTUFTVEVSX1JFU0VSVkUKKyAgICAgICAgICAgICAgICAgIC0gaW50IERJRF9TVF9TWVNURU1fUkVTRVJWRQorICAgICAgICAgICAgICAgICAgICAgICAgTW9tZW50YW5lIEdyb2Vzc2UgZGVyIGRyZWkgU3BlaWNoZXJyZXNlcnZlbgorICAgICAgICAgICAgICAgICAgLSBpbnQgRElEX1NUX0FERF9NRVNTQUdFCisgICAgICAgICAgICAgICAgICAtIGludCBESURfU1RfUEFDS0VUUworICAgICAgICAgICAgICAgICAgLSBpbnQgRElEX1NUX1BBQ0tFVF9TSVpFCisgICAgICAgICAgICAgICAgICAgICAgICBBbnphaGwgQXVmcnVmZSB2b24gYWRkX21lc3NhZ2UoKSwgQW56YWhsIHVuZCBHcm9lc3NlCisgICAgICAgICAgICAgICAgICAgICAgICBkZXIgdmVyc2VuZGV0ZW4gUGFrZXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgV2VubiBkZXIgRHJpdmVyIG5pY2h0IG1pdCBDT01NX1NUQVQga29tcGlsaWVydCB3dXJkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpZWZlcm4gYWxsZSBkcmVpIFdlcnRlIGltbWVyIC0xIHp1cnVlY2suCisgICAgICAgICAgICAgICAgICAtIGludCBESURfU1RfQVBQTFkKKyAgICAgICAgICAgICAgICAgIC0gaW50IERJRF9TVF9BUFBMWV9ISVRTCisgICAgICAgICAgICAgICAgICAgICAgICBBbnphaGwgQXVmcnVmZW4gdm9uIGFwcGx5X2xvdygpLCB1bmQgd2llIHZpZWxlIGRhdm9uCisgICAgICAgICAgICAgICAgICAgICAgICBDYWNoZS1UcmVmZmVyIHdhcmVuLiBXZW5uIGRlciBEcml2ZXIgbmljaHQgbWl0CisgICAgICAgICAgICAgICAgICAgICAgICBBUFBMWV9DQUNIRV9TVEFUIGtvbXBpbGllcnQgd3VyZGUsIGxpZWZlcm4gYmVpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIFdlcnRlIGltbWVyIC0xLgorICAgICAgICAgICAgICAgICAgLSBpbnQgRElEX1NUX1NUUklOR1MKKyAgICAgICAgICAgICAgICAgIC0gaW50IERJRF9TVF9TVFJJTkdfU0laRQorICAgICAgICAgICAgICAgICAgICAgICAgQW56YWhsIHVudGVyc2NoaWVkbGljaGVyIFN0cmluZ3MgaW4gZGVyIFN0cmluZ3RhYmVsbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBzb3dpZSBpaHJlIEdyb2Vzc2UKKyAgICAgICAgICAgICAgICAgIC0gaW50IERJRF9TVF9TVFJfVEFCTEVfU0laRQorICAgICAgICAgICAgICAgICAgICAgICAgR3JvZXNzZSBkZXIgU3RyaW5nIFRhYmVsbGUKKyAgICAgICAgICAgICAgICAgIC0gaW50IERJRF9TVF9TVFJfUkVRCisgICAgICAgICAgICAgICAgICAtIGludCBESURfU1RfU1RSX1JFUV9TSVpFCisgICAgICAgICAgICAgICAgICAgICAgICBHZXNhbXRlIEFuemFobCB2b24gU3RyaW5nIEFsbG9rYXRpb25lbiwgdW5kIGlocmUKKyAgICAgICAgICAgICAgICAgICAgICAgIEdyb2Vzc2UKKyAgICAgICAgICAgICAgICAgIC0gaW50IERJRF9TVF9TVFJfU0VBUkNIRVMKKyAgICAgICAgICAgICAgICAgIC0gaW50IERJRF9TVF9TVFJfU0VBUkNIX0xFTgorICAgICAgICAgICAgICAgICAgICAgICAgQW56YWhsIFN1Y2h2b3JnYWVuZ2UgaW4gZGVyIFN0cmluZ3RhYmVsbGUgdW5kIGRpZQorICAgICAgICAgICAgICAgICAgICAgICAgR2VzYW10bGFlbmdlIGRlcyBTdWNoc3RyaW5ncworICAgICAgICAgICAgICAgICAgLSBpbnQgRElEX1NUX1NUUl9GT1VORAorICAgICAgICAgICAgICAgICAgICAgICAgQW56YWhsIGVyZm9sZ3JlaWNoZXIgU3VjaHZvcmdhZW5nZQorICAgICAgICAgICAgICAgICAgLSBpbnQgRElEX1NUX1NUUl9FTlRSSUVTCisgICAgICAgICAgICAgICAgICAgICAgICBBbnphaGwgRWludHJhZWdlIChIYXNoIEtldHRlbikgaW4gZGVyIFN0cmluZyBUYWJlbGxlCisgICAgICAgICAgICAgICAgICAtIGludCBESURfU1RfU1RSX0FEREVECisgICAgICAgICAgICAgICAgICAgICAgICBBbnphaGwgenVyIFN0cmluZyBUYWJlbGxlIGJpc2hlciBoaW56dWdlZnVlZ3RlcgorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5ncworICAgICAgICAgICAgICAgICAgLSBpbnQgRElEX1NUX1NUUl9ERUxFVEVECisgICAgICAgICAgICAgICAgICAgICAgICBBbnphaGwgYXVzIGRlciBTdHJpbmcgVGFiZWxsZSBiaXNoZXIgZ2Vsb2VzY2h0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ3MKKyAgICAgICAgICAgICAgICAgIC0gaW50IERJRF9TVF9TVFJfQ09MTElTSU9OUworICAgICAgICAgICAgICAgICAgICAgICAgQW56YWhsIHp1IGVpbmVyIGV4aXN0aWVyZW5kZW4gSGFzaCBLZXR0ZSBoaW56dWdlZnVlZ3RlCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdzCisgICAgICAgICAgICAgICAgICAtIGludCBESURfU1RfUlhfQ0FDSEVECisgICAgICAgICAgICAgICAgICAgICAgICBBbnphaGwgZ2VjYWNoZXRlciByZWd1bGFlcmVyIEF1c2RydWVja2UgKHJlZ3VsYXIKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25zKQorICAgICAgICAgICAgICAgICAgLSBpbnQgRElEX1NUX1JYX1RBQkxFCisgICAgICAgICAgICAgICAgICAtIGludCBESURfU1RfUlhfVEFCTEVfU0laRQorICAgICAgICAgICAgICAgICAgICAgICAgQW56YWhsIFBsYWV0emUgaW4gZGVyIFJlZ2V4cCBDYWNoZSBUYWJlbGxlIHVuZAorICAgICAgICAgICAgICAgICAgICAgICAgU3BlaWNoZXJiZWRhcmYgZGVyIGdlY2FjaGV0ZW4gQXVzZHJ1ZWNrZQorICAgICAgICAgICAgICAgICAgLSBpbnQgRElEX1NUX1JYX1JFUVVFU1RTCisgICAgICAgICAgICAgICAgICAgICAgICBBbnphaGwgQW5mcmFnZW4gZnVlciBuZXVlIHJlZ2V4cHMKKyAgICAgICAgICAgICAgICAgIC0gaW50IERJRF9TVF9SWF9SRVFfRk9VTkQKKyAgICAgICAgICAgICAgICAgICAgICAgIEFuemFobCBnZWZ1bmRlbmVyIHJlZ2V4cHMgaW4gZGVyIHJlZ2V4cCBDYWNoZSBUYWJlbGxlCisgICAgICAgICAgICAgICAgICAtIGludCBESURfU1RfUlhfUkVRX0NPTEwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFuemFobCBhbmdlZnJhZ3RlciByZWdleHBzLCBkaWUgbWl0IGVpbmVyIGJlc3RlaGVuZGVuCisgICAgICAgICAgICAgICAgICAgICAgICByZWdleHAga29sbGlkaWVydGVuCisgICAgICAgICAgICAgICAgICAtIGludCBESURfU1RfTUJfRklMRQorICAgICAgICAgICAgICAgICAgICAgICAgRGllIEdyb2Vzc2UgZGVzICdGaWxlJyBTcGVpY2hlcnB1ZmZlcnMKKyAgICAgICAgICAgICAgICAgIC0gaW50IERJRF9TVF9NQl9TV0FQCisgICAgICAgICAgICAgICAgICAgICAgICBEaWUgR3JvZXNzZSBkZXMgJ1N3YXAnIFNwZWljaGVycHVmZmVycworCisgICAgICAgICAgICA8YXJnMj4gPT0gRElEX1NXQVAgKDEpOiBMaWVmZXJ0ICJzdGF0dXMgc3dhcCItSW5mb3JtYXRpb246CisgICAgICAgICAgICAgICAgICAtIGludCBESURfU1dfUFJPR1MKKyAgICAgICAgICAgICAgICAgIC0gaW50IERJRF9TV19QUk9HX1NJWkUKKyAgICAgICAgICAgICAgICAgICAgICAgIEFuemFobCB1bmQgR3JvZXNzZSBkZXIgZ2Vzd2FwcHRlbiBQcm9ncmFtbWJsb2Vja2UKKyAgICAgICAgICAgICAgICAgIC0gaW50IERJRF9TV19QUk9HX1VOU1dBUFBFRAorICAgICAgICAgICAgICAgICAgLSBpbnQgRElEX1NXX1BST0dfVV9TSVpFCisgICAgICAgICAgICAgICAgICAgICAgICBBbnphaGwgdW5kIEdyb2Vzc2UgZGVyIG5pY2h0IGdlc3dhcHB0ZW4gQmxvZWNrZQorICAgICAgICAgICAgICAgICAgLSBpbnQgRElEX1NXX1ZBUlMKKyAgICAgICAgICAgICAgICAgIC0gaW50IERJRF9TV19WQVJfU0laRQorICAgICAgICAgICAgICAgICAgICAgICAgQW56YWhsIHVuZCBHcm9lc3NlIGRlciBnZXN3YXBwdGVuIFZhcmlhYmxlbmJsb2Vja2UKKyAgICAgICAgICAgICAgICAgIC0gaW50IERJRF9TV19GUkVFCisgICAgICAgICAgICAgICAgICAtIGludCBESURfU1dfRlJFRV9TSVpFCisgICAgICAgICAgICAgICAgICAgICAgICBBbnphaGwgdW5kIEdyb2Vzc2UgZGVyIGZyZWllbiBCbG9lY2tlIGluIGRlcgorICAgICAgICAgICAgICAgICAgICAgICAgQXVzbGFnZXJ1bmdzZGF0ZWkKKyAgICAgICAgICAgICAgICAgIC0gaW50IERJRF9TV19GSUxFX1NJWkUKKyAgICAgICAgICAgICAgICAgICAgICAgIEdyb2Vzc2UgZGVyIEF1c2xhZ2VydW5nc2RhdGVpCisgICAgICAgICAgICAgICAgICAtIGludCBESURfU1dfUkVVU0VECisgICAgICAgICAgICAgICAgICAgICAgICBHZXNhbXRlciB3aWVkZXJ2ZXJ3ZW5kZXRlciBTcGVpY2hlcnBsYXR6IGluIGRlcgorICAgICAgICAgICAgICAgICAgICAgICAgQXVzbGFnZXJ1bmdzZGF0ZWkKKyAgICAgICAgICAgICAgICAgIC0gaW50IERJRF9TV19TRUFSQ0hFUworICAgICAgICAgICAgICAgICAgLSBpbnQgRElEX1NXX1NFQVJDSF9MRU4KKyAgICAgICAgICAgICAgICAgICAgICAgIEFuemFobCB1bmQgR2VzYW10bGFlbmdlIGRlciBTdWNodm9yZ2FlbmdlIG5hY2gKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpZWRlcnZlcndlbmRiYXJlbiBCbG9lY2tlbiBpbiBkZXIgQXVzbGFnZXJ1bmdzZGF0ZWkKKyAgICAgICAgICAgICAgICAgIC0gaW50IERJRF9TV19GX1NFQVJDSEVTCisgICAgICAgICAgICAgICAgICAtIGludCBESURfU1dfRl9TRUFSQ0hfTEVOCisgICAgICAgICAgICAgICAgICAgICAgICBBbnphaGwgdW5kIEdlc2FtdGxhZW5nZSBkZXIgU3VjaHZvcmdhZW5nZSBuYWNoIGVpbmVtCisgICAgICAgICAgICAgICAgICAgICAgICBCbG9jaywgZGVyIGZyZWkgZ2VtYWNodCB3ZXJkZW4ga2Fubi4KKyAgICAgICAgICAgICAgICAgIC0gaW50IERJRF9TV19DT01QQUNUCisgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIHdlbm4gZGVyIFN3YXBwZXIgaW0gQ29tcGFjdC1Nb2R1cyBsYWV1ZnQKKyAgICAgICAgICAgICAgICAgIC0gaW50IERJRF9TV19SRUNZQ0xFX0ZSRUUKKyAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgd2VubiBkZXIgU3dhcHBlciBnZXJhZGUgZWluZW4gZnJlaWVuIEJsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICB3aWVkZXJ2ZXJ3ZW5kZXQKKworICAgICAgICAgICAgPGFyZzI+ID09IERJRF9NRU1PUlkgKDIpOiBMaWVmZXJ0IGRpZSAic3RhdHVzIG1hbGxvYyItSW5mb3JtYXRpb246CisgICAgICAgICAgICAgICAgICAtIHN0cmluZyBESURfTUVNX05BTUUKKyAgICAgICAgICAgICAgICAgICAgICAgIERlciBOYW1lIGRlcyBBbGxva2F0b3JzOiAic3lzbWFsbG9jIiwgInNtYWxsb2MiLAorICAgICAgICAgICAgICAgICAgICAgICAgInNsYWJhbGxvYyIKKyAgICAgICAgICAgICAgICAgIC0gaW50IERJRF9NRU1fU0JSSworICAgICAgICAgICAgICAgICAgLSBpbnQgRElEX01FTV9TQlJLX1NJWkUKKyAgICAgICAgICAgICAgICAgICAgICAgIEFuemFobCB1bmQgR3JvZXNzZSBkZXIgU3BlaWNoZXJibG9lY2tlLCBkaWUgdm9tCisgICAgICAgICAgICAgICAgICAgICAgICBCZXRyaWVic3N5c3RlbSBhbmdlZm9yZGVydCB3dXJkZW4gKHNtYWxsb2MsIHNsYWJhbGxvYykKKyAgICAgICAgICAgICAgICAgIC0gaW50IERJRF9NRU1fTEFSR0UKKyAgICAgICAgICAgICAgICAgIC0gaW50IERJRF9NRU1fTEFSR0VfU0laRQorICAgICAgICAgICAgICAgICAgLSBpbnQgRElEX01FTV9MRlJFRQorICAgICAgICAgICAgICAgICAgLSBpbnQgRElEX01FTV9MRlJFRV9TSVpFCisgICAgICAgICAgICAgICAgICAgICAgICBBbnphaGwgdW5kIEdyb2Vzc2UgZGVyIGdyb3NzZW4gYWxsb3ppZXJ0ZW4gYnp3LgorICAgICAgICAgICAgICAgICAgICAgICAgZnJlaWVuIEJsb2Vja2UgKHNtYWxsb2MsIHNsYWJhbGxvYykKKyAgICAgICAgICAgICAgICAgIC0gaW50IERJRF9NRU1fTFdBU1RFRAorICAgICAgICAgICAgICAgICAgLSBpbnQgRElEX01FTV9MV0FTVEVEX1NJWkUKKyAgICAgICAgICAgICAgICAgICAgICAgIEFuemFobCB1bmQgR3JvZXNzZSBkZXIgdW5icmF1Y2hiYXJlbiBncm9zc2VuCisgICAgICAgICAgICAgICAgICAgICAgICBTcGVpY2hlcmZyYWdtZW50ZSAoc21hbGxvYywgc2xhYmFsbG9jKQorICAgICAgICAgICAgICAgICAgLSBpbnQgRElEX01FTV9DSFVOSworICAgICAgICAgICAgICAgICAgLSBpbnQgRElEX01FTV9DSFVOS19TSVpFCisgICAgICAgICAgICAgICAgICAgICAgICBBbnphaGwgdW5kIEdyb2Vzc2Uga2xlaW5lciBTcGVpY2hlcmJsb2Vja2UgKGNodW5rCisgICAgICAgICAgICAgICAgICAgICAgICBibG9ja3M7IHNtYWxsb2MsIHNsYWJhbGxvYykKKyAgICAgICAgICAgICAgICAgIC0gaW50IERJRF9NRU1fU01BTEwKKyAgICAgICAgICAgICAgICAgIC0gaW50IERJRF9NRU1fU01BTExfU0laRQorICAgICAgICAgICAgICAgICAgLSBpbnQgRElEX01FTV9TRlJFRQorICAgICAgICAgICAgICAgICAgLSBpbnQgRElEX01FTV9TRlJFRV9TSVpFCisgICAgICAgICAgICAgICAgICAgICAgICBBbnphaGwgdW5kIGdyb2Vzc2UgZGVyIGFsbG96aWVydGVuIGJ6dy4gZnJlaWVuCisgICAgICAgICAgICAgICAgICAgICAgICBrbGVpbmVuIFNwZWljaGVyYmxvZWNrZSAoc21hbGxvYywgc2xhYmFsbG9jKQorICAgICAgICAgICAgICAgICAgLSBpbnQgRElEX01FTV9TV0FTVEVECisgICAgICAgICAgICAgICAgICAtIGludCBESURfTUVNX1NXQVNURURfU0laRQorICAgICAgICAgICAgICAgICAgICAgICAgQW56YWhsIHVuZCBHcm9lc3NlIGRlciB1bmJyYXVjaGJhciBrbGVpbmVuCisgICAgICAgICAgICAgICAgICAgICAgICBTcGVpY2hlcmZyYWdtZW50ZSAoc21hbGxvYywgc2xhYmFsbG9jKQorICAgICAgICAgICAgICAgICAgLSBpbnQgRElEX01FTV9NSU5DX0NBTExTCisgICAgICAgICAgICAgICAgICAtIGludCBESURfTUVNX01JTkNfU1VDQ0VTUworICAgICAgICAgICAgICAgICAgLSBpbnQgRElEX01FTV9NSU5DX1NJWkUKKyAgICAgICAgICAgICAgICAgICAgICAgIEFuemFobCBBdWZydWZlIHZvbiBtYWxsb2NfaW5jcmVtZW50KCksIEFuemFobCBkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyZm9sZ3JlaWNoZW4gQXVmcnVmZSB1bmQgZGllIEdyb2Vzc2UgZGVzIGF1ZiBkaWVzZQorICAgICAgICAgICAgICAgICAgICAgICAgQXJ0IGFsbG96aWVydGVuIFNwZWljaGVycyAoc21hbGxvYywgc2xhYmFsbG9jKQorICAgICAgICAgICAgICAgICAgLSBpbnQgRElEX01FTV9QRVJNCisgICAgICAgICAgICAgICAgICAtIGludCBESURfTUVNX1BFUk1fU0laRQorICAgICAgICAgICAgICAgICAgICAgICAgQW56YWhsIHVuZCBHcm9lc3NlIHBlcm1hbmVudGVyIChub24tR0NhYmxlKQorICAgICAgICAgICAgICAgICAgICAgICAgQWxsb2thdGlvbmVuIChzbWFsbG9jLCBzbGFiYWxsb2MpCisgICAgICAgICAgICAgICAgICAtIGludCBESURfTUVNX0NMSUIKKyAgICAgICAgICAgICAgICAgIC0gaW50IERJRF9NRU1fQ0xJQl9TSVpFCisgICAgICAgICAgICAgICAgICAgICAgICBBbnphaGwgdW5kIEdyb2Vzc2UgZGVyIEFsbG9rYXRpb25lbiBkdXJjaCBDbGliCisgICAgICAgICAgICAgICAgICAgICAgICBGdW5rdGlvbmVuIChudXIgc21hbGxvYywgc2xhYmFsbG9jIG1pdCBTQlJLX09LKQorICAgICAgICAgICAgICAgICAgLSBpbnQgRElEX01FTV9PVkVSSEVBRAorICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcmhlYWQgZnVlciBqZWRlIEFsbG9rYXRpb24gKHNtYWxsb2MsIHNsYWJhbGxvYykKKyAgICAgICAgICAgICAgICAgIC0gaW50IERJRF9NRU1fQUxMT0NBVEVECisgICAgICAgICAgICAgICAgICAgICAgICBEZXIgU3BlaWNoZXIsIGRlciBkdXJjaCBkaWUgU3BlaWNoZXJ2ZXJ3YWx0dW5nCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvemllcnQgd3VyZGUsIGlua2x1c2l2ZSBkZW4gT3ZlcmhlYWQgZnVlciBkaWUKKyAgICAgICAgICAgICAgICAgICAgICAgIFNwZWljaGVydmVyd2FsdHVuZyAoc21hbGxvYywgc2xhYmFsbG9jKQorICAgICAgICAgICAgICAgICAgLSBpbnQgRElEX01FTV9VU0VECisgICAgICAgICAgICAgICAgICAgICAgICBEZXIgU3BlaWNoZXIsIGRlciBkdXJjaCBkZW4gRHJpdmVyIGJlbGVndCBpc3QsIG9obmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbiBkdXJjaCBkaWUgU3BlaWNoZXJ2ZXJ3YWx0dW5nIGJlbGVndGVuIFNwZWljaGVyCisgICAgICAgICAgICAgICAgICAgICAgICAoc21hbGxvYywgc2xhYmFsbG9jKQorICAgICAgICAgICAgICAgICAgLSBpbnQgRElEX01FTV9UT1RBTF9VTlVTRUQKKyAgICAgICAgICAgICAgICAgICAgICAgIERlciBTcGVpY2hlciwgZGVyIHZvbSBTeXN0ZW0genVyIFZlcmZ1ZWd1bmcgZ2VzdGVsbHQsCisgICAgICAgICAgICAgICAgICAgICAgICBhYmVyIHZvbSBUcmVpYmVyIG5pY2h0IGJlbm9ldGlndCB3aXJkLgorICAgICAgICAgICAgICAgICAgLSBpbnQgRElEX01FTV9BVkxfTk9ERVMgICAgICAgICAgKHNtYWxsb2MsIHNsYWJhbGxvYykKKyAgICAgICAgICAgICAgICAgICAgICAgIEFuemFobCBkZXIgQVZMLUtub3RlbiwgZGllIHp1ciBWZXJ3YWx0dW5nIGRlcgorICAgICAgICAgICAgICAgICAgICAgICAgZnJlaWVuIGdyb3NzZW4gU3BlaWNoZXJibG9lY2tlIHZlcndlbmRldCB3ZXJkZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIChudXIgc21hbGxvYykuIERpZXNlciBXZXJ0IGthbm4gaW4gWnVrdW5mdAorICAgICAgICAgICAgICAgICAgICAgICAgd2llZGVyIHZlcnNjaHdpbmRlbi4KKyAgICAgICAgICAgICAgICAgIC0gbWl4ZWQgKiBESURfTUVNX0VYVF9TVEFUSVNUSUNTIChzbWFsbG9jLCBzbGFiYWxsb2MpCisgICAgICAgICAgICAgICAgICAgICAgICBEZXRhaWxsaWVydGUgU3RhdGlzdGlrZW4gZGVzIEFsbG9rYXRvcnMgc29mZXJuCisgICAgICAgICAgICAgICAgICAgICAgICBkaWVzZSBha3RpdmllcnQgd3VyZGVuOyAwIGFuZGVyZW5mYWxscy4KKworICAgICAgICAgICAgICAgICAgICAgICAgRGllc2VyIFdlcnQga2FubiBpbiBadWt1bmZ0IHdpZWRlciB2ZXJzY2h3aW5kZW4uCisKKyAgICAgICAgICAgICAgICAgICAgICAgIERhcyBBcnJheSBlbnRoYWVsdCBOVU0rMiBFaW50cmFlZ2UsIHdvYmVpIE5VTQorICAgICAgICAgICAgICAgICAgICAgICAgQW56YWhsIGRlciB2ZXJzY2hpZWRlbmVuICdrbGVpbmVuJworICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tncm9lc3NlbiBpc3QuIEVpbnRyYWcgW05VTV0gYmVzY2hyZWlidAorICAgICAgICAgICAgICAgICAgICAgICAgZGllIHVlYmVyZ3Jvc3NlbiAna2xlaW5lbicgQmxvZWNrZSwgRWludHJhZworICAgICAgICAgICAgICAgICAgICAgICAgW05VTSsxXSBiZXNjaHJlaWJ0IHN1bW1hcmlzY2ggZGllICdncm9zc2VuJworICAgICAgICAgICAgICAgICAgICAgICAgQmxvZWNrZS4gSmVkZXIgRWludHJhZyBpc3QgZWluIEFycmF5IG1pdAorICAgICAgICAgICAgICAgICAgICAgICAgZGllc2VuIEZlbGRlcm46CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBESURfTUVNX0VTX01BWF9BTExPQzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4aW1hbGUgQW56YWhsIGFsbG9raWVydGVyIEJsb2Vja2UgZGllc2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb2Vzc2UuCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBESURfTUVNX0VTX0NVUl9BTExPQzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGVyemVpdGlnZSBBbnphaGwgYWxsb2tpZXJ0ZXIgQmxvZWNrZSBkaWVzZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvZXNzZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVudCBudW1iZXIgb2YgYWxsb2NhdGVkIGJsb2NrcyBvZiB0aGlzIHNpemUuCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBESURfTUVNX0VTX01BWF9GUkVFOgorICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhpbWFsZSBBbnphaGwgZnJlaWVyIEJsb2Vja2UgZGllc2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb2Vzc2UuCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBESURfTUVNX0VTX0NVUl9GUkVFOgorICAgICAgICAgICAgICAgICAgICAgICAgICBEZXJ6ZWl0aWdlIEFuemFobCBmcmVpZXIgQmxvZWNrZSBkaWVzZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvZXNzZS4KKworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgRElEX01FTV9FU19BVkdfWEFMTE9DOgorICAgICAgICAgICAgICAgICAgICAgICAgICBEdXJjaHNjaG5pdHRsaWNoZSBaYWhsIHZvbiBBbGxva2F0aW9uZW4gcHJvCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNla3VuZGUuCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IERJRF9NRU1fRVNfQVZHX1hGUkVFOgorICAgICAgICAgICAgICAgICAgICAgICAgICBEdXJjaHNjaG5pdHRsaWNoZSBaYWhsIHZvbiBEZWFsbG9rYXRpb25lbiBwcm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgU2VrdW5kZS4KKworICAgICAgICAgICAgICAgICAgICAgIERpZSBEdXJjaHNjaG5pdHRzc3RhdGlzdGlrZW4gc2NobGllc3NlbiBpbnRlcm5lCisgICAgICAgICAgICAgICAgICAgICAgVW1zb3J0aWVydW5nZW4gZGVyIEJsb2NrbGlzdGVuIG5pY2h0IGVpbi4KKworCisgICAgICAgIERJTkZPX1RSQUNFICAgICg3KTogTGllZmVydCBkaWUgJ3RyYWNlJyBJbmZvcm1hdGlvbiBhdXMgZGVtCisgICAgICAgICAgICBDYWxsIFN0YWNrIGVudHNwcmVjaGVuZCBkZXIgU3BlemlmaWthdGlvbiBpbiA8YXJnMj4uIERhcyBSZXN1bHRhdAorICAgICAgICAgICAgaXN0IGVudHdlZGVyIGVpbiBBcnJheSAoZGVzc2VuIEZvcm1hdCBuYWNoc3RlaGVuZCBlcmxhZXV0ZXJ0IGlzdCkKKyAgICAgICAgICAgIG9kZXIgZWluIGRydWNrYmFyZXIgU3RyaW5nLiBXaXJkIDxhcmcyPiB3ZWdnZWxhc2VuIGVudHNwcmljaHQKKyAgICAgICAgICAgIGRpZXMgRElUX0NVUlJFTlQuCisKKyAgICAgICAgICAgIDxhcmcyPiA9PSBESVRfQ1VSUkVOVCAoMCk6IE1vbWVudGFuZXIgQ2FsbCBUcmFjZQorICAgICAgICAgICAgICAgICAgID09IERJVF9FUlJPUiAgICgxKTogTGV0enRlciBGZWhsZXIgVHJhY2UgKGNhdWdodCBvZGVyCisgICAgICAgICAgICAgICAgICAgICAgICB1bmNhdWdodCkKKyAgICAgICAgICAgICAgICAgICA9PSBESVRfVU5DQVVHSFRfRVJST1IgKDIpOiBMZXR6ZXIgRmVobGVyIFRyYWNlLCBkZXIgbmljaHQKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlZmFuZ2VuIHdlcmRlbiBrb25udGUgKHVuY2F1Z2h0KQorCisgICAgICAgICAgICBEaWUgSW5mb3JtYXRpb24gd2lyZCBpbiBGb3JtIGVpbmVzIEFycmF5IHVlYmVyZ2ViZW4uCisKKyAgICAgICAgICAgIERpZSBGZWhsZXJ0cmFjZXMgd2VyZGVuIG51ciBnZWFlbmRlcnQsIHdlbm4gZWluIGVudHNwcmVjaGVuZGVyCisgICAgICAgICAgICBGZWhsZXIgYXVmdHJpdHQ7IGF1c3NlcmRlbSB3ZXJkZW4gc2llIGJlaSBlaW5lbSBHQyAoR2FyYmFnZQorICAgICAgICAgICAgQ29sbGVjdGlvbikgZ2Vsb2VzY2h0LiBOYWNoIGVpbmVtIEZlaGxlciwgZGVyIG5pY2h0IGdlZmFuZ2VuCisgICAgICAgICAgICB3ZXJkZW4ga29ubnRlICh1bmNhdWdodCBlcnJvciksIHdlaXNlbiBiZWlkZSBUcmFjZXMgYXVmIGRhcworICAgICAgICAgICAgZ2xlaWNoZSBBcnJheSwgc29kYXNzIGRlciA9PS1PcGVyYXRvciBnaWx0LgorCisgICAgICAgICAgICBXZW5uIGRhcyBBcnJheSBtZWhyIGFscyBlaW4gRWxlbWVudCBlbnRoYWVsdCwgaXN0IGRhcyBlcnN0ZQorICAgICAgICAgICAgRWxlbWVudCAwIG9kZXIgZGVyIE5hbWUgZGVzIE9iamVrdHMsIGRlc3NlbiBoZWFydF9iZWF0KCkgZGVuCisgICAgICAgICAgICBsYXVmZW5kZW4gWnlrbHVzIGJlZ29ubmVuIGhhdDsgYWxsZSBuYWNoZm9sZ2VuZGVuIEVsZW1lbnRlCisgICAgICAgICAgICBiZXplaWNobmVuIGRlbiBDYWxsIFN0YWNrLCBiZWdpbm5lbiBtaXQgZGVyIGhvZWNoc3RlbgorICAgICAgICAgICAgYXVmZ2VydWZlbmVuIEZ1bmt0aW9uLgorCisgICAgICAgICAgICBBbGxlIEVpbnRyYWVnZSBpbSBBcnJheSBzaW5kIHdpZWRlcnVtIEFycmF5cyBtaXQgZm9sZ2VuZGVuCisgICAgICAgICAgICBFbGVtZW50ZW46CisgICAgICAgICAgICAgIC0gaW50W1RSQUNFX1RZUEVdOiBEZXIgVHlwIGRlciBhdWZydWZlbmRlbiBGdW5rdGlvbgorICAgICAgICAgICAgICAgICAgICBUUkFDRV9UWVBFX1NZTUJPTCAoMCk6IGVpbiBGdW5rdGlvbnNzeW1ib2wgKHNvbGx0ZSBuaWNodAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvcmtvbW1lbikKKyAgICAgICAgICAgICAgICAgICAgVFJBQ0VfVFlQRV9TRUZVTiAgKDEpOiBlaW5lIHNpbXVsLWVmdW4KKyAgICAgICAgICAgICAgICAgICAgVFJBQ0VfVFlQRV9FRlVOICAgKDIpOiBlaW5lIEVmdW4gQ2xvc3VyZQorICAgICAgICAgICAgICAgICAgICBUUkFDRV9UWVBFX0xBTUJEQSAoMyk6IGVpbmUgbGFtYmRhIENsb3N1cmUKKyAgICAgICAgICAgICAgICAgICAgVFJBQ0VfVFlQRV9MRlVOICAgKDQpOiBlaW5lIG5vcm1hbGUgTGZ1bgorICAgICAgICAgICAgICAtIGludFtUUkFDRV9OQU1FXQorICAgICAgICAgICAgICAgICAgICBfVFlQRV9FRlVOICAgIDogZW50d2VkZXIgZGVyIE5hbWUgZGVyIEZ1bmt0aW9uIG9kZXIgZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlIGVpbmVyIE9wZXJhdG9yLUNsb3N1cmUKKyAgICAgICAgICAgICAgICAgICAgX1RZUEVfTEFNQkRBICA6IGRpZSBudW1lcmlzY2hlIExhbWJkYS1JRAorICAgICAgICAgICAgICAgICAgICBfVFlQRV9MRlVOICAgIDogZGVyIE5hbWUgZGVyIExmdW4KKyAgICAgICAgICAgICAgLSBzdHJpbmdbVFJBQ0VfUFJPR1JBTV06ICBEZXIgTmFtZSBkZXMgUHJvZ3JhbW1zIG1pdCBkZW0gQ29kZQorICAgICAgICAgICAgICAtIHN0cmluZ1tUUkFDRV9PQkpFQ1RdOiAgIERlciBOYW1lIGRlcyBPYmpla3RzLCBmdWVyIGRhcyBkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlIGF1c2dlZnVlaHJ0IHd1cmRlCisgICAgICAgICAgICAgIC0gaW50W1RSQUNFX0xPQ106CisgICAgICAgICAgICAgICAgICAgIF9UWVBFX0xBTUJEQSAgOiBEZXIgT2Zmc2V0IGRlcyBQcm9ncmFtbXMgc2VpdCBCZWdpbm4gZGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbG9zdXJlLUNvZGVzCisgICAgICAgICAgICAgICAgICAgIF9UWVBFX0xGVU4gICAgOiBEaWUgWmVpbGVubnVtbWVyLgorCisgICAgICAgICAgICA8YXJnMj4gPT0gRElUX1NUUl9DVVJSRU5UICgzKTogTGllZmVydCBJbmZvcm1hdGlvbmVuIHVlYmVyIGRlbgorICAgICAgICAgICAgICAgIG1vbWVudGFuZW4gQ2FsbCBUcmFjZSBhbHMgZHJ1Y2tiYXJlciBTdHJpbmcuCisKKyAgICAgICAgICAgIDxhcmcyPiA9PSBESVRfQ1VSUkVOVF9ERVBUSCAoNCk6IExpZWZlcnQgZGllIFphaGwgZGVyIEZyYW1lcyBhdWYKKyAgICAgICAgICAgICAgICBkZW0gQ29udHJvbCBTdGFjayAoUmVrdXJzaW9uc3RpZWZlKS4KKworICAgICAgICBESU5GT19FVkFMX05VTUJFUiAoOCk6IGdpYnQgZGllIE51bW1lciBkZXIgYWt0dWVsbGVuIEJlcmVjaG51bmcKKyAgICAgICAgICAgIHp1cnVlY2suIERpZXNlIE51bW1lciB3aXJkIGZ1ZXIgamVkZW4gdm9tIGRyaXZlciBpbml0aWllcnRlbgorICAgICAgICAgICAgQXVmcnVmIHZvbiBMUEMtQ29kZSBlcmhvZWh0LCBhbHNvIGJlaSBBdWZydWYgdm9uOgorICAgICAgICAgICAgICAtIEtvbW1hbmRvcyAoZGllIHBlciBhZGRfYWN0aW9uIGhpbnp1Z2VmdWVndCB3dXJkZW4pCisgICAgICAgICAgICAgIC0gaGVhcnRfYmVhdCwgcmVzZXQsIGNsZWFuX3VwCisgICAgICAgICAgICAgIC0gQXVmcnVmZSBkdXJjaCBjYWxsX291dCBvZGVyIGlucHV0X3RvCisgICAgICAgICAgICAgIC0gbWFzdGVyIGFwcGxpZXMsIGRpZSBhdWYgZXh0ZXJuZSBFcmVpZ25pc3NlIHp1cnVlY2tnZWhlbgorICAgICAgICAgICAgICAtIGRyaXZlciBob29rcyBnZW5hdXNvCisgICAgICAgICAgICAgIC0gUnVlY2tydWZlbiB2b24gc2VuZF9lcnEKKyAgICAgICAgICAgICAgLSBsb2dvbiBpbiBpbnRlcmFrdGl2ZW4gT2JqZWt0ZW4KKworICAgICAgICAgICBEaWVzZXIgWmFlaGxlciBrYW5uIHouQi4gYmVudXR6dCB3ZXJkZW4sIHVtIHp1IHZlcmhpbmRlcm4sIGRhc3MKKyAgICAgICAgICAgYmVzdGltbXRlIEFrdGlvbmVuIG1laHJmYWNoIGlubmVyaGFsYiBlaW5lcyBoZWFydF9iZWF0KCkKKyAgICAgICAgICAgYXVzZ2VmdWVocnQgd2VyZGVuLiBFaW5lIGFuZGVyZSBBbndlbmR1bmdzbW9lZ2xpY2hrZWl0IHNpbmQKKyAgICAgICAgICAgWmVpdHN0ZW1wZWwgenVyIFNvcnRpZXJ1bmcgenVyIFNvcnRpZXJ1bmcgdm9uIEVyZWlnbmlzc2VuLgorCisgICAgICAgICAgIEVzIGlzdCB6dSBiZWFjaHRlbiwgZGFzcyBkZXIgWmFlaGxlciB1ZWJlcmxhdWZlbiBrYW5uLCBpbnNiZXNvbmRlcmUKKyAgICAgICAgICAgYXVmIDMyLWJpdC1TeXN0ZW1lbi4gRXIga2FubiBkZW16dWZvbGdlIGF1Y2ggbmVnYXRpdiB3ZXJkZW4uCisKKworR0VTQ0hJQ0hURQorICAgICAgICBTZWl0IDMuMi43IGxpZWZlcnQgRElORk9fU1RBVFVTIGRpZSBJbmZvcm1hdGlvbiB6dXJ1ZWNrLCBhbnN0YXR0IHNpZQorICAgICAgICAgICAgbnVyIGF1c3p1Z2ViZW4uCisgICAgICAgIERJTkZPX0RVTVAgd3VyZGUgaW4gMy4yLjcgZWluZ2VmdWVocnQuCisgICAgICAgIExETXVkIDMuMi44IGZ1ZWd0ZSBkaWUgRGF0ZW5ncm9lc3NlIGRlcyBPYmpla3RzIHp1bSBSZXN1bHRhdCB2b24KKyAgICAgICAgICAgIERJTkZPX01FTU9SWSBoaW56dSwgYXVzc2VyZGVtIGRpZSBESU5GT19EQVRBIEFiZnJhZ2UgdW5kIGRpZQorICAgICAgICAgICAgdmVyc2NoaWVkZW5lbiBESURfTUVNX1dBU1RFRCBTdGF0aXN0aWtlbi4KKyAgICAgICAgTERNdWQgMy4yLjkgZnVlZ3RlIERJTkZPX1RSQUNFLCBkYXMgSW5kaXppZXJ1bmdzLUZlYXR1cmUgdm9uCisgICAgICAgICAgICBESU5GT19EQVRBLCBkZW4gJ2Rlc3RydWN0ZWQnLURJTkZPX0RVTVAsIGRpZSBESURfTUVNX0NMSUIqLAorICAgICAgICAgICAgZGllIERJRF9NRU1fUEVSTSosIGF1c3NlcmRlbSBESURfU1RfT0JKRUNUU19ORVdMWV9ERVNULAorICAgICAgICAgICAgRElEX1NUX09CSkVDVFNfREVTVCwgRElEX01FTV9PVkVSSEVBRCwgRElEX01FTV9BTExPQ0FURUQsCisgICAgICAgICAgICBESURfTUVNX1VTRUQsIERJRF9NRU1fVE9UQUxfVU5VU0VELCBESURfU1RfSEJFQVRfQ0FMTFNfVE9UQUwKKyAgICAgICAgICAgIHVuZCBkaWUgZm91bmQgLyBhZGRlZCAvIGNvbGxpc2lvbiBTdHJpbmdzdGF0aXN0aWtlbi4KKyAgICAgICAgTERNdWQgMy4yLjEwIGZ1ZWd0ZSBkaWUgRXJ6ZXVndW5nc3plaXQgenUgRElORk9fRFVNUDoib2JqZWN0cyIgaGluenUsCisgICAgICAgICAgICBlbnRmZXJudGUgRElEX01FTV9VTlVTRUQgYXVzIERJTkZPX0RBVEE6RElEX01FTU9SWSwgZnVlZ3RlCisgICAgICAgICAgICBESU5GT19EQVRBOkRJRF9TVEFUVVMgRElEX1NUX0JPT1RfVElNRSwgRElEX1NUX01CX0ZJTEUgdW5kCisgICAgICAgICAgICBESURfU1RfTUJfU1dBUCBoaW56dSB1bmQgZW50ZmVybnRlIERJRF9TVF9DQUxMT1VUX1NMT1RTIGRhcmF1cywKKyAgICAgICAgICAgIGZ1ZWd0ZSBkYXMgZHJpdHRlIEFyZ3VtZW50IHp1IERJTkZPX09CSkxJU1QgaGluenUsIHVuZCB2ZXJhZW5kZXJ0ZQorICAgICAgICAgICAgZGllIEJlZGV1dHVuZyB2b24gRElEX1NUX0NBTExPVVRfU0laRSB1bmQgRElEX1NUX0hCRUFUX1NJWkUKKyAgICAgICAgICAgIGJ6dy4gX1NMT1RTLgorICAgICAgICBMRE11ZCAzLjMuNTMzIGZ1ZWd0ZSBESURfTUVNX0FWTF9OT0RFUyB6dSBESU5GT19EQVRBOkRJRF9NRU1PUlkKKyAgICAgICAgICAgIGhpbnp1LgorICAgICAgICBMRE11ZCAzLjMuNjAzIGZ1ZWd0ZSBESURfTUVNX0VYVF9TVEFUSVNUSUNTIHp1IERJTkZPX0RBVEE6RElEX01FTU9SWQorICAgICAgICAgICAgaGluenUuCisgICAgICAgIExETXVkIDMuMy43MTggZnVlZ3RlIERJVF9DVVJSRU5UX0RFUFRIIHRvIERJTkZPX1RSQUNFIGhpbnp1LgorICAgICAgICBMRE11ZCAzLjMuNzE5IGZ1ZWd0ZSBESU5GT19FVkFMX05VTUJFUiBoaW56dS4KKworU0lFSEUgQVVDSAorICAgICAgICB0cmFjZShFKSwgdHJhY2VwcmVmaXgoRSksIG1hbGxvYyhEKSwgc3RhdHVzKEQpLCBkdW1wYWxsb2JqKEQpCmRpZmYgLS1naXQgYS9kb2Mvc2VmdW4vZGVlcF9wcmVzZW50IGIvZG9jL3NlZnVuL2RlZXBfcHJlc2VudApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGMwOTgzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NlZnVuL2RlZXBfcHJlc2VudApAQCAtMCwwICsxLDIxIEBACitGVU5LVElPTjoKKyAgICAgICAgb2JqZWN0IGRlZXBfcHJlc2VudChzdHJpbmcgd2hhdCkKKyAgICAgICAgb2JqZWN0IGRlZXBfcHJlc2VudChvYmplY3Qgd2hhdCkKKyAgICAgICAgb2JqZWN0IGRlZXBfcHJlc2VudChzdHJpbmcgd2hhdCwgb2JqZWN0IG9iKQorICAgICAgICBvYmplY3QgZGVlcF9wcmVzZW50KG9iamVjdCB3aGF0LCBvYmplY3Qgb2IpCisKK0FSR1VNRU5URToKKyAgICAgICAgd2hhdCAtIE9iamVrdCBvZGVyIElEIGRlcyBPYmpla3RlcywgbmFjaCBkZW0gZ2VzdWNodCB3ZXJkZW4gc29sbAorICAgICAgICBvYiAtIE9iamVrdCwgaW4gZGVtIGdlc3VjaHQgd2VyZGVuIHNvbGwKKworQkVTQ0hSRUlCVU5HOgorICAgICAgICBkZWVwX3ByZXNlbnQoKSBzdWNodCBpbiB0aGlzX29iamVjdCgpIChvZGVyIGluIG9iLCBmYWxscyBhbmdlZ2ViZW4pCisgICAgICAgIG5hY2ggZGVtIE9iamVrdCB3aGF0IG9kZXIgZWluZW0gT2JqZWt0LCBkYXMgYXVmIHdoYXQgYW5zcHJpY2h0LgorICAgICAgICBJbSBHZWdlbnNhdHogenUgcHJlc2VudCgpIHdpcmQgYWJlciBkYXMga29tcGxldHRlIEludmVudG9yeSBiZXJ1ZWNrLQorICAgICAgICBzaWNodGlndCAoYWxzbyB6Qi4gYXVjaCBkZXIgSW5oYWx0IHZvbiBCZXV0ZWxuKS4KKworUlVFQ0tHQUJFV0VSVDoKKyAgICAgICAgZGFzIGdlZnVuZGVuZSBPYmpla3Qgb2RlciAwCisKK1NJRUhFIEFVQ0g6CisgICAgICAgIHByZXNlbnQoRSkKZGlmZiAtLWdpdCBhL2RvYy9zZWZ1bi9kdGltZSBiL2RvYy9zZWZ1bi9kdGltZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjI0NjQyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NlZnVuL2R0aW1lCkBAIC0wLDAgKzEsMjQgQEAKK0ZVTktUSU9OOgorCXN0cmluZyBkdGltZShpbnQgdGltZSkKKworQVJHVU1FTlRFOgorCXRpbWUgLSBVbXp1d2FuZGVsbmRlcyBEYXR1bSBpbiBTZWt1bmRlbiBzZWl0IDEuMS4xOTcwLCAwOjA6MGgKKworQkVTQ0hSRUlCVU5HOgorCVdhbmRlbHQgZGFzIERhdHVtIHRpbWUgaW4gZWluZW4gZGV1dHNjaHNwcmFjaGlnZW4gU3RyaW5nIGRlciBGb3JtCisJIjx3dGFnPiwgPHRhZz4uIDxtb24+IDxqYWhyPiwgPHN0ZD46PG1pbj46PHNlaz4iIHVtLgorCitSVUVDS0dBQkVXRVJUOgorCURlciBTdHJpbmcgbWl0IGRlbSB1bWdld2FuZGVsdGVuIERhdHVtLgorCitCRU1FUktVTkdFTjoKKwlBbHMgdGltZSB3aXJkIG1laXN0ZW5zIGRhcyBFcmdlYm5pcyB2b24gdGltZSgpIGJlbnV0enQuCisgIHN0cmZ0aW1lKCkgc3RlbGx0IGVpbmUgd2VzZW50bGljaCBmbGV4aWJsZXJlIE1vZWdsaWNoa2VpdCBkZXIgQXVzZ2FiZSB2b24KKyAgWmVpdGVuIGRhci4KKworQkVJU1BJRUxFOgorCWRhdHVtID0gZHRpbWUodGltZSgpKTsKKyAgICAgICAgPT4gZGF0dW0gPSAiTW9uLCAgNi4gTWFyIDE5OTQsIDE1OjAwOjA4IgorCitTSUVIRSBBVUNIOgorCWN0aW1lKEUpLCBzdHJmdGltZShFKSwgdGltZShFKQpkaWZmIC0tZ2l0IGEvZG9jL3NlZnVuL2R1bXBfbmV0ZGVhZCBiL2RvYy9zZWZ1bi9kdW1wX25ldGRlYWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzczYjJjMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zZWZ1bi9kdW1wX25ldGRlYWQKQEAgLTAsMCArMSwxMyBAQAorRlVOS1RJT046CisgICAgICAgIHN0cmluZyAqZHVtcF9uZXRkZWFkKCkKKworQkVTQ0hSRUlCVU5HOgorICAgICAgICBHaWJ0IGVpbiBBcnJheSBtaXQgZGVuIE5hbWVuIGFsbGVyIHp1ciBaZWl0IG5ldHp0b3RlbiBTcGllbGVyCisgICAgICAgIHp1cnVlY2suCisKK1JVRUNLR0FCRVdFUlQ6CisgICAgICAgIEVpbiBTdHJpbmdhcnJheSBtaXQgZGVuIE5hbWVuIGRlciBuZXR6dG90ZW4gU3BpZWxlci4KKyAgICAgICAgZ2lidC4KKworU0lFSEUgQVVDSDoKKyAgICAgICAgZmluZF9uZXRkZWFkKEUpCmRpZmYgLS1naXQgYS9kb2Mvc2VmdW4vZW5hYmxlX2NvbW1hbmRzIGIvZG9jL3NlZnVuL2VuYWJsZV9jb21tYW5kcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTA4YjVmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NlZnVuL2VuYWJsZV9jb21tYW5kcwpAQCAtMCwwICsxLDI2IEBACitTWU5PUFNJUworICAgICAgICB2b2lkIGVuYWJsZV9jb21tYW5kcygpOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgRXJsYXVidCBkZW0gT2JqZWt0LCBLb21tYW5kb3MgenUgdmVyd2VuZGVuLCBkaWUgbm9ybWFsZXJ3ZWlzZSBVc2VybgorICAgICAgICB6dWdhZW5nbGljaCBzaW5kLiBEZXIgQXVmcnVmIG1hcmtpZXJ0IGRhcyBPYmpla3QgYWxzICJsaXZpbmciLiBEaWVzCisgICAgICAgIHdpcmQgZnVlciBTcGllbGVyIHVuZCBhbGxlIHZvbiAvc3RkL25wYyBhYmdlbGVpdGV0ZW4gT2JqZWt0ZQorICAgICAgICBiZXJlaXRzIHZvbiBkZXIgTXVkbGliIGVybGVkaWd0IHVuZCBzb2xsdGUgbmljaHQgbm9jaG1hbHMgZ2VtYWNodAorICAgICAgICB3ZXJkZW4uCisKKyAgICAgICAgRGllc2UgRnVua3Rpb24gZGFyZiBuaWNodCBhdXNzZXJoYWxiIHZvbiBjcmVhdGUoKSAob2RlciByZXNldCgwKSBpbQorICAgICAgICBDb21wYXQtTW9kdXMpIGF1ZmdlcnVmZW4gd2VyZGVuLCB3ZWlsIGRlciBLb21tYW5kb2dlYmVyIGF1ZiBkaWVzZXMKKyAgICAgICAgT2JqZWt0IGdlc2V0enQgd2lyZC4KKworQkVJU1BJRUwKKyAgICAgICAgdm9pZCBjcmVhdGUoKQorICAgICAgICB7CisgICAgICAgICAgICBlbmFibGVfY29tbWFuZHMoKTsKKyAgICAgICAgICAgIC4uLgorICAgICAgICB9CisKKyAgICAgICAgRGllcyBtYXJraWVydCBkYXMgT2JqZWt0IGFscyAibGl2aW5nIi4KKworU0lFSEUgQVVDSAorICAgICAgICBjb21tYW5kKEUpLCBsaXZpbmcoRSksIGRpc2FibGVfY29tbWFuZHMoRSksIG5hdGl2ZShDKSwgaG9va3MoQykKKyAgICAgICAgc2V0X2xpdmluZ19uYW1lKEUpCmRpZmYgLS1naXQgYS9kb2Mvc2VmdW4vZmlsZV90aW1lIGIvZG9jL3NlZnVuL2ZpbGVfdGltZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzI0YmFhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NlZnVuL2ZpbGVfdGltZQpAQCAtMCwwICsxLDUgQEAKK0ZVTktUSU9OOgorCWludCBmaWxlX3RpbWUoc3RyaW5nIGZpbGVuYW1lKTsKKworTGllZmVydCBkZW4gWmVpdHB1bmt0IGRlciBsZXR6dGVuIE1vZGlmaWthdGlvbiBkZXMgRmlsZXMgaW4gU2VrdW5kZW4gc2VpdAorZGVtIDEuMS4xOTcwLCAwOjAwLiBLYW5uIHBlciBjdGltZSgpIGluIGVpbiBsZXNiYXJlcyBGb3JtYXQgZ2VicmFjaHQgd2VyZGVuLgpkaWZmIC0tZ2l0IGEvZG9jL3NlZnVuL2ZpbmRfbGl2aW5nIGIvZG9jL3NlZnVuL2ZpbmRfbGl2aW5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNmRkNjMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2VmdW4vZmluZF9saXZpbmcKQEAgLTAsMCArMSwyMiBAQAorU1lOT1BTSVM6CisgICAgICAgIG9iamVjdCBmaW5kX2xpdmluZyhzdHJpbmcgc3RyKQorCitCRVNDSFJFSUJVTkc6CisgICAgICAgIEZpbmRldCBkYXMgZXJzdGUgImxlYmVuZGUiIE9iamVrdCwgd2VsY2hlcyBwZXIgc2V0X2xpdmluZ19uYW1lKCkgZGVuCisgICAgICAgIE5hbWVuIDxzdHI+IHNldHp0ZS4KKyAgICAgICAgCisgICAgICAgIERhcyBPYmpla3QgbXVzcyBhdXNzZXJkZW0gcGVyIGVuYWJsZV9jb21tYW5kcygpIGFscyBMZWJld2VzZW4KKyAgICAgICAgbWFya2llcnQgd29yZGVuIHNlaW4uIERpZXMgaXN0IGZ1ZXIgYWxsZSB2b24gL3N0ZC9ucGMgZXJiZW5kZW4gTlBDcworICAgICAgICBfYXV0b21hdGlzY2hfIGRlciBGYWxsIHVuZCBzb2xsdGUgZGFoZXIgbmljaHQgbm9jaG1hbCBleHBsaXppdCBnZW1hY2h0CisgICAgICAgIHdlcmRlbi4KKworQkVJU1BJRUw6CisgICAgICAgIG9iamVjdCBvYjsKKyAgICAgICAgb2IgPSBmaW5kX2xpdmluZygiUHVibGljIEVuZW15Iik7CisKK1NJRUhFIEFVQ0g6CisgICAgICAgIGZpbmRfcGxheWVyKEUpLCBlbmFibGVfY29tbWFuZHMoRSksIHNldF9saXZpbmdfbmFtZShFKQorCitMRVRaVEUgQWVOREVSVU5HOgorMDkuMTAuMjAxMSwgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2Mvc2VmdW4vZmluZF9saXZpbmdzIGIvZG9jL3NlZnVuL2ZpbmRfbGl2aW5ncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzkyMjhmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NlZnVuL2ZpbmRfbGl2aW5ncwpAQCAtMCwwICsxLDI0IEBACitGVU5LVElPTjoKKyAgICAgICAgb2JqZWN0ICpmaW5kX2xpdmluZ3Moc3RyaW5nIG5hbWUpCisKK0FSR1VNRU5URToKKyAgICAgICAgbmFtZSAtIGRlciBsaXZpbmdfbmFtZSBkZXIgZ2VzdWNodGVuIExlYmV3ZXNlbgorCitCRVNDSFJFSUJVTkc6CisgICAgICAgIERpZXNlIEZ1bmt0aW9uIGxpZWZlcnQgZWluIEFycmF5IG1pdCBhbGxlbiBMZWJld2VzZW4sIGRpZSBkZW4gZ2xlaWNoZW4KKyAgICAgICAgbGl2aW5nX25hbWUgaGFiZW4uCisKK1JVRUNLR0FCRVdFUlQ6CisgICAgICAgIEFycmF5IG1pdCBkZW4gTGViZXdlc2VuIG9kZXIgMCwgd2VubiBlcyBrZWluIExlYmV3ZXNlbiBkaWVzZW4gTmFtZW5zCisgICAgICAgIGdpYnQuCisKK0JFSVNQSUVMRToKKyAgICAgICAgb2IgPSBmaW5kX2xpdmluZ3MoImhlcmt1bGVzIik7CisgICAgICAgID0+IG9iID0gKHsgWy9odW1hbjpoZXJrdWxlc10sIAorICAgICAgICAgICAgICAgICAgIFsvZC9pbnNlbG4vd2FyZ29uL2x1ZnRzY2hsb3NzL21vbi9oZXJrdWxlc10gfSkKKworU0lFSEUgQVVDSDoKKyAgICAgICAgZmluZF9saXZpbmcoRSksIHNldF9saXZpbmdfbmFtZShFKSwgZmluZF9wbGF5ZXIoRSksIGZpbmRfbmV0ZGVhZChFKQorCitMRVRaVEUgQUVOREVSVU5HOgorMTkuIE9rdC4gMjAxNSwgQXJhdGhvcm4KZGlmZiAtLWdpdCBhL2RvYy9zZWZ1bi9maW5kX25ldGRlYWQgYi9kb2Mvc2VmdW4vZmluZF9uZXRkZWFkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NGVlOWUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2VmdW4vZmluZF9uZXRkZWFkCkBAIC0wLDAgKzEsMjUgQEAKK0ZVTktUSU9OOgorICAgICAgICBvYmplY3QgZmluZF9uZXRkZWFkKHN0cmluZyBuYW1lKQorCitBUkdVTUVOVEU6CisgICAgICAgIG5hbWUgLSBOYW1lIGRlcyBnZXN1Y2h0ZW4gU3BpZWxlcnMKKworQkVTQ0hSRUlCVU5HOgorICAgICAgICBGYWxscyBkZXIgU3BpZWxlciBuYW1lIG5ldHp0b3QgaXN0LCBsaWVmZXJ0IGRpZXNlIEZ1bmt0aW9uIGRhcyBTcGllbGVyLQorICAgICAgICBvYmpla3QgenVydWVjay4KKworICAgICAgICBBa3plcHRpZXJ0IGF1Y2ggZGllIFVVSUQgc3RhdHQgZWluZXIgVUlELiBJbiBkaWVzZW0gRmFsbCBlcmZvbGd0IGFiZXIKKyAgICAgICAgbnVyIGVpbmUgUHJ1ZWZ1bmcsIG9iIGRpZSBVSUQgZGVzIGdlZnVuZGVuZW4gU3BpZWxlcnMgenVyIGFuZ2VnZWJlbmVuCisgICAgICAgIFVVSUQgcGFzc3QgKGQuaC4gImpvZl8tMSIgd3VlcmRlIGRhbm4gZ2dmLiBhdWNoIGRhcyBTcGllbGVyb2JqZWt0IEpvZgorICAgICAgICB6dXJ1ZWNrbGllZmVybiwgd2VubiBkYXMgZGllIFVVSUQgIkpvZl8xMjM0IiBoYXQpLgorCisKK1JVRUNLR0FCRVdFUlQ6CisgICAgICAgIERlciBuZXR6dG90ZSBTcGllbGVyIG9kZXIgMCwgZmFsbHMgZXMga2VpbmVuIE5ldHp0b3RlbiBkaWVzZW4gTmFtZW5zCisgICAgICAgIGdpYnQuCisKK1NJRUhFIEFVQ0g6CisgICAgICAgIGZpbmRfbGl2aW5nKEUpLCBmaW5kX3BsYXllcihFKQorCitMRVRaVCBBZU5ERVJVTkc6CiswNi4wMS4yMDA5LCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2Mvc2VmdW4vZmluZF9wbGF5ZXIgYi9kb2Mvc2VmdW4vZmluZF9wbGF5ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdjODVmMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zZWZ1bi9maW5kX3BsYXllcgpAQCAtMCwwICsxLDQyIEBACitGVU5LVElPTjoKKyAgICAgICAgb2JqZWN0IGZpbmRfcGxheWVyKHN0cmluZyB1aWQpCisKK0JFU0NIUkVJQlVORzoKKyAgICAgICAgRmluZGV0IGRlbiBTcGllbGVyIG1pdCBkZW0gTmFtZW4gYnp3LiBkZXIgVXNlci1JRCA8dWlkPi4KKyAgICAgICAgCisgICAgICAgIEFremVwdGllcnQgYXVjaCBkaWUgVVVJRCBzdGF0dCBlaW5lciBVSUQuIEluIGRpZXNlbSBGYWxsIGVyZm9sZ3QgYWJlcgorICAgICAgICBudXIgZWluZSBQcnVlZnVuZywgb2IgZGllIFVJRCBkZXMgZ2VmdW5kZW5lbiBTcGllbGVycyB6dXIgYW5nZWdlYmVuZW4KKyAgICAgICAgVVVJRCBwYXNzdCAoZC5oLiAiam9mXy0xIiB3dWVyZGUgZGFubiBnZ2YuIGF1Y2ggZGFzIFNwaWVsZXJvYmpla3QgSm9mCisgICAgICAgIHp1cnVlY2tsaWVmZXJuLCB3ZW5uIGRhcyBkaWUgVVVJRCAiSm9mXzEyMzQiIGhhdCkuCisKKyAgICAgICAgUnVlY2tnYWJld2VydCBpc3QgZGFzIFNwaWVsZXJvYmpla3QgKHdlbm4gU3BpZWxlciBhbndlc2VuZCksCisgICAgICAgIGFuc29uc3RlbiAwLgorCitCRUlTUElFTDoKKworICAgICAgICBvYmplY3Qgb2I7CisgICAgICAgIG9iID0gZmluZF9wbGF5ZXIoImRlZXB0aG91Z2h0Iik7CisKKyAgICAgICAgaWYob2IpCisgICAgICAgICAgdGVsbF9vYmplY3Qob2IsIlRhY2ggRHUhXG4iKTsKKworICAgICAgICBvZGVyIGF1Y2ggCisKKyAgICAgICAgaWYob2IgPSBmaW5kX3BsYXllcigiZGVlcHRob3VnaHQiKSkKKyAgICAgICAgICB0ZWxsX29iamVjdChvYiwiVGFjaCBEdSFcbiIpOworCitBTk1FUktVTkdFTjoKKworICAgICAgICBWaWEgZmluZF9wbGF5ZXIoKSB3ZXJkZW4gYXVjaCB1bnNpY2h0YmFyZSBNYWdpZXIgZ2VmdW5kZW4uIEluIAorICAgICAgICBPYmpla3RlbiwgZGllIGZ1ZXIgU3BpZWxlciBnZWRhY2h0IHNpbmQsIG11c3MgZGllcyBkYW5uIGV4dHJhCisgICAgICAgIHBlciBBYmZyYWdlIGF1ZiBpZihvYi0+UXVlcnlQcm9wKFBfSU5WSVMpKSBnZXRlc3RldCB3ZXJkZW4uCisKKyAgICAgICAgTmV0enRvdGUgU3BpZWxlciB1bmQgTW9uc3RlciB3ZXJkZW4gbmljaHQgZ2VmdW5kZW4gZGEgZmluZF9wbGF5ZXIKKyAgICAgICAgZGVuIE5hbWVuIGF1cyBzZXRfbGl2aW5nX25hbWUoKSB2ZXJ3ZW5kZXQsIGRlciBpbiBwbGF5ZXIuYyBnZS0KKyAgICAgICAgc2V0enQgd2lyZC4KKyAgICAgICAgCitTSUVIRSBBVUNIOgorICAgICAgICBmaW5kX2xpdmluZyhFKSwgc2V0X2xpdmluZ19uYW1lKEUpLCBmaW5kX29iamVjdChFKSwgZmluZF9uZXRkZWFkKEUpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xldHp0ZSBBZW5kZXJ1bmc6IDA2LjAxLjIwMDksIFplc3N0cmEgCmRpZmYgLS1naXQgYS9kb2Mvc2VmdW4vZ2V0dXVpZCBiL2RvYy9zZWZ1bi9nZXR1dWlkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMzQzNDMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2VmdW4vZ2V0dXVpZApAQCAtMCwwICsxLDE3IEBACitTWU5PUFNJUzoKKyAgICBzdHJpbmcgZ2V0dXVpZChvYmplY3Qgb2IpCisKK0RFU0NSSVBUSU9OOgorICAgIExpZWZlcnQgZWluZSBlaW5kZXV0aWdlIChnZXQgdW5pcXVlIHVpZCkgVUlEIGZ1ZXIgZWluZW4gU3BpZWxlci4KKyAgICBXaXJkIHp1c2FtbWVuZ2VzZXR6dCBhdXMgZGVyIFVJRCBkZXMgU3BpZWxlcnMgdW5kIHNlaW5lbQorICAgIEVyc3Rsb2dpbi1EYXR1bS4KKworICAgIE5hY2ggZWluZXIgU2VsYnN0bG9lc2NodW5nIHVuZCBuZXVlbSBMb2dpbiBlcmhhZWx0IGRlciBTcGllbGVyIGVpbmUKKyAgICBuZXVlIFVVSUQsIGJlaSBlaW5lciBSZXN0YXVyaWVydW5nIGJlaGFlbHQgZXIgc2VpbmUgYWx0ZSBVVUlELgorCisgICAgV2VubiBkaWUgRnVua3Rpb24gb2huZSBQYXJhbWV0ZXIgYXVmZ2VydWZlbiB3aXJkLCB3aXJkIHBlciBEZWZhdWx0CisgICAgdGhpc19vYmplY3QoKSBnZW5vbW1lbi4KKyAgICAKKworU0VFIEFMU086CisgICAgICAgIGdldHVpZChFKQpkaWZmIC0tZ2l0IGEvZG9jL3NlZnVuL2lzbzJhc2NpaSBiL2RvYy9zZWZ1bi9pc28yYXNjaWkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU3NzU3YQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zZWZ1bi9pc28yYXNjaWkKQEAgLTAsMCArMSwxNyBAQAorRlVOS1RJT046CisJcHVibGljIHN0cmluZyBpc28yYXNjaWkoIHN0cmluZyBzdHIgKTsKKworQVJHVU1FTlRFOgorCXN0cgorCSAgU3RyaW5nLCBpbiB3ZWxjaGVtIFplaWNoZW4gZXJzZXR6dCB3ZXJkZW4gc29sbGVuLgorCitCRVNDSFJFSUJVTkc6CisJSW4gZGVtIFN0cmluZyB3ZXJkZW4gYWxsZSBOaWNodC1BU0NJSS1aZWljaGVuIGR1cmNoIEFTQ0lJLVplaWNoZW4KKwllcnNldHp0LCB1bmQgendhciBVbWxhdXRlIGluIGRlciBiZWthbm50ZW4gRm9ybSB1bmQgYWxsZSBhbmRlcmVuCisJZHVyY2ggZWluIEZyYWdlemVpY2hlbi4KKworUlVlQ0tHQUJFV0VSVDoKKwlTdHJpbmcgbWl0IEFTQ0lJLVplaWNoZW4uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IEZyaSBKdWwgIDYgMTk6MzY6MDkgMjAwMSBieSBQYXRyeW4KZGlmZiAtLWdpdCBhL2RvYy9zZWZ1bi9sb2dfZmlsZSBiL2RvYy9zZWZ1bi9sb2dfZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjdlMDNiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NlZnVuL2xvZ19maWxlCkBAIC0wLDAgKzEsMzEgQEAKK0ZVTktUSU9OOgorCWludCBsb2dfZmlsZShzdHJpbmcgZmlsZSwgc3RyaW5nIHRleHQpCisgIGludCBsb2dfZmlsZShzdHJpbmcgZmlsZSwgc3RyaW5nIHRleHQsIGludCBzaXplX3RvX2JyZWFrKQorCitBUkdVTUVOVEU6CisJZmlsZSAtIE5hbWUgZGVyIERhdGVpLCBpbiBkaWUgZ2VzY2hyaWViZW4gd2VyZGVuIHNvbGwKKwl0ZXh0IC0gRGVyIFRleHQsIGRlciBnZXNjaHJpZWJlbiB3ZXJkZW4gc29sbAorCXNpemVfdG9fYnJlYWsgLSBHcm9lc3NlLCBhYiBkZXIgZWluIG5ldWVzIEZpbGUgYmVnb25uZW4gd2lyZCAob3B0aW9uYWwpCisKK0JFU0NIUkVJQlVORzoKKwlsb2dfZmlsZSBzY2hyZWlidCBkZW4gVGV4dCB0ZXh0IGluIGRpZSBEYXRlaSAvbG9nL2ZpbGUuCisKK1JVRUNLR0FCRVdFUlQ6CisJMSBiZWkgRXJmb2xnIG9kZXIgMCwgZmFsbHMgZWluIEZlaGxlciBiZWltIFNjaHJlaWJlbiBhdWZ0cmF0LgorCitCRU1FUktVTkdFTjoKKwlXZW5uIGRpZSBHcm9lc3NlIHZvbiBmaWxlIHZvciBkZW0gU2NocmVpYmVuIDUwMDAwIEJ5dGVzIHVlYmVyc2NocmVpdGV0LAorCXdpcmQgc2llIGluIGZpbGUub2xkIHVtYmVuYW5udC4gRWluZSBzY2hvbiB2b3JoYW5kZW5lIERhdGVpIGZpbGUub2xkCisJd2lyZCBkYWJlaSBnZWxvZXNjaHQuIERlciBUZXh0IHdpcmQgbmFjaCBkZW0gVW1iZW5lbm5lbiBnZXNjaHJpZWJlbi4KKwlXaXJkICdzaXplX3RvX2JyZWFrJyBhbmdlZ2ViZW4gdW5kIGlzdCBkaWVzID4gMCwgd2lyZCBkaWVzZXIgV2VydCAoaW4gCisJQnl0ZXMpIHN0YXR0IGRlciA1MDAwMCBCeXRlcyB6dW0gUm90aWVyZW4gZGVzIExvZ2ZpbGVzIGJlbnV0enQuCisKK0JFSVNQSUVMRToKKwlsb2dfZmlsZSggInJlcG9ydC93YXJnb24ucmVwIiwgIlRZUE8gdm9uIGJsYSBpbiBibHViYjpcbnRlc3RcbiIpOworCUluIC9sb2cvcmVwb3J0L3dhcmdvbi5yZXAgZmluZGUgaWNoIG51biBkaWUgbmV1ZXN0ZSBUeXBvbWVsZHVuZy4uLiA7KQorCitTSUVIRSBBVUNIOgorCXdyaXRlX2ZpbGUoRSkKKworMDkuMDYuMjAxNCwgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2Mvc2VmdW4vbG93ZXJjaGFyIGIvZG9jL3NlZnVuL2xvd2VyY2hhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWM2MmJmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NlZnVuL2xvd2VyY2hhcgpAQCAtMCwwICsxLDIwIEBACitGVU5LVElPTjoKKwlpbnQgbG93ZXJjaGFyKGludCBjaGFyKQorCitBUkdVTUVOVEU6CisJY2hhciAtIERhcyB1bXp1d2FuZGVsbmRlIFplaWNoZW4KKworQkVTQ0hSRUlCVU5HOgorCVdlbm4gY2hhciBlaW4gR3Jvc3NidWNoc3RhYmUgaXN0LCBzbyB3aXJkIGVzIGluIGVpbmVuIEtsZWluYnVjaHN0YWJlbgorCXVtZ2V3YW5kZWx0LiBBbmRlcmUgWmVpY2hlbiB3ZXJkZW4gdm9uIGRpZXNlciBGdW5rdGlvbiBuaWNodCBiZWVpbi0KKyAgICAgICAgZmx1c3N0LgorCitSVUVDS0dBQkVXRVJUOgorCURhcyB1bWdld2FuZGVsdGUgWmVpY2hlbi4KKworQkVJU1BJRUxFOgorCXByaW50ZigiJWNcbiIsIGxvd2VyY2hhcignQScpKTsgPT4gYQorCXByaW50ZigiJWNcbiIsIGxvd2VyY2hhcignMScpKTsgPT4gMQorCitTSUVIRSBBVUNIOgorCWxvd2VyX2Nhc2UoRSksIGxvd2Vyc3RyaW5nKEUpLCB1cHBlcnN0cmluZyhFKSwgY2FwaXRhbGl6ZShFKQpkaWZmIC0tZ2l0IGEvZG9jL3NlZnVuL2xvd2Vyc3RyaW5nIGIvZG9jL3NlZnVuL2xvd2Vyc3RyaW5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNzQ4ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2VmdW4vbG93ZXJzdHJpbmcKQEAgLTAsMCArMSwyMCBAQAorRlVOS1RJT046CisJc3RyaW5nIGxvd2Vyc3RyaW5nKHN0cmluZyBzdHIpCisKK0FSR1VNRU5URToKKwlzdHIgLSBEZXIgdW16dXdhbmRlbG5kZSBTdHJpbmcuCisKK0JFU0NIUkVJQlVORzoKKwlBbGxlIEdyb3NzYnVjaHN0YWJlbiBpbiBzdHIgd2VyZGVuIGluIEtsZWluYnVjaHN0YWJlbiB1bWdld2FuZGVsdC4KKworUlVFQ0tHQUJFV0VSVDoKKwlEZXIgdW1nZXdhbmRlbHRlIFN0cmluZy4KKworQkVNRVJLVU5HRU46CisJbG93ZXJzdHJpbmcgaXN0IG1pdCBsb3dlcl9jYXNlIGlkZW50aXNjaCEKKworQkVJU1BJRUxFOgorCXMgPSBsb3dlcnN0cmluZygiU28sIE1jTGF1ZC4uLlxuIik7ID0+IHMgPSAic28sIG1jbGF1ZC4uLlxuIgorCitTSUVIRSBBVUNIOgorCWxvd2VyX2Nhc2UoRSksIGxvd2VyY2hhcihFKSwgdXBwZXJzdHJpbmcoRSksIGNhcGl0YWxpemUoRSkKZGlmZiAtLWdpdCBhL2RvYy9zZWZ1bi9tX2NvcHlfZGVsZXRlIGIvZG9jL3NlZnVuL21fY29weV9kZWxldGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IxYzk3YgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zZWZ1bi9tX2NvcHlfZGVsZXRlCkBAIC0wLDAgKzEsNDMgQEAKK0ZVTktUSU9OOgorCW1hcHBpbmcgbV9jb3B5X2RlbGV0ZShtYXBwaW5nIG1hcCwgbWl4ZWQga2V5KQorCitBUkdVTUVOVEU6CisJbWFwIC0gZGFzIE1hcHBpbmcsIGF1cyBkZW0gZ2Vsb2VzY2h0IHdlcmRlbiBzb2xsLgorCWtleSAtIGRlciB6dSBsb2VzY2hlbmRlIEVpbnRyYWcKKworQkVTQ0hSRUlCVU5HOgorCUF1cyBkZW0gTWFwcGluZyBtYXAgd2lyZCBkZXIgRWludHJhZyBrZXkgZ2Vsb2VzY2h0ICh3ZW5uIGVyIGluIG1hcCB2b3ItCisJaGFuZGVuIGlzdCkuIG1hcCB3aXJkIGRhYmVpIG5pY2h0IHZlcmFlbmRlcnQuCisKK1JVRUNLR0FCRVdFUlQ6CisJRWluZSAoZmxhY2hlICEpIEtvcGllIHZvbiBtYXAgb2huZSBkZW4gRWludHJhZyBrZXksIGQuaC4gZW50aGFsdGVuZQorCU1hcHBpbmdzL0FycmF5cyB3ZXJkZW4gbmljaHQga29waWVydC4KKworQkVNRVJLVU5HRU46CisJRGFzIHVyc3BydWVuZ2xpY2hlIE1hcHBpbmcgd2lyZCBiZWkgZGllc2VyIE9wZXJhdGlvbiBuaWNodCB2ZXJhZW5kZXJ0IQorCVdlbm4gbWFuIG51ciBlaW5lbiBXZXJ0IGF1cyBkZW0gTWFwcGluZyBsb2VzY2hlbiB3aWxsIHVuZCBkaWUgS29waWUgbmljaHQKKwlicmF1Y2h0LCBiaWV0ZXQgc2ljaCBlZnVuOjptX2RlbGV0ZShtYXBwaW5nLGtleSkgc2VociBhbiwgZGEgZGllIEVyc3RlbGx1bmcKKyAgZWluZXIgS29waWUgc2VociBhdWZ3ZW5kaWcgc2VpbiBrYW5uLgorCitCRUlTUElFTEU6CisJbWFwcGluZyBtMSwgbTI7CisKKyAgICAgICAgbTEgPSAoWyAiYSI6MSwgImIiOjIsICJjIjozIF0pOworCisgICAgICAgIG0yID0gbV9jb3B5X2RlbGV0ZShtMSwgImIiKTsKKyAgICAgICAgICAgPT4gbTEgPSAoWyAiYSI6MSwgImIiOjIsICJjIjozIF0pCisJICAgICAgbTIgPSAoWyAiYSI6MSwgImMiOjMgXSkKKworICAgICAgICBtX2NvcHlfZGVsZXRlKG0xLCAiYSIpOworICAgICAgICAgICA9PiAoZXMgaGF0IHNpY2ggbmljaHRzIGdlYWVuZGVydCkKKworICAgICAgICBtMSA9IG1fY29weV9kZWxldGUobTEsICJhIik7CisgICAgICAgICAgID0+IG0xID0gKFsgImIiOjIsICJjIjozIF0pCisKKyAgICAgICAgSW0gbGV0enRlbiBGYWxsIHNvbGx0ZSBhYmVyIGJlc3NlciBlZnVuOjptX2RlbGV0ZShtMSwgImEiKSBiZW51dHp0IAorICAgICAgICB3ZXJkZW4sIGRhIGFuc29uc3RlbiBkYXMgTWFwcGluZyB1bm5vZXRpZyBrb3BpZXJ0IHdpcmQgdW5kIFJlY2hlbi0KKyAgICAgICAgbGVpc3R1bmcgZnJpc3N0LiAKKworU0lFSEUgQVVDSDoKKyAgZWZ1bjo6bV9kZWxldGUoRSksIG1hcHBpbmdwKEUpLCBta21hcHBpbmcoRSksIG1faW5kaWNlcywoRSkgbV92YWx1ZXMoRSksCisgIHNpemVvZihFKSwgd2lkdGhvZihFKQpkaWZmIC0tZ2l0IGEvZG9jL3NlZnVuL21hdGNoX2xpdmluZyBiL2RvYy9zZWZ1bi9tYXRjaF9saXZpbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ4MDFhOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zZWZ1bi9tYXRjaF9saXZpbmcKQEAgLTAsMCArMSwzMCBAQAorbWF0Y2hfbGl2aW5nKHNlZnVuKQorRlVOS1RJT046CisgICAgIHZhcmFyZ3MgbWl4ZWQgbWF0Y2hfbGl2aW5nKCBzdHJpbmcgc3RyLCBpbnQgcGxheWVyc19vbmx5LAorCQkJCSBzdHJpbmcgKmV4Y2x1ZGUpCisKK0FSR1VNRU5URToKKyAgICAgc3RyaW5nIHN0cgkJLSBLdWVyemVsLCBuYWNoIGRlbSBkaWUgbGl2aW5nX25hbWVzIGR1cmNoc3VjaHQKKwkJCSAgd2VyZGVuIHNvbGwKKyAgICAgaW50IHBsYXllcnNfb25seQktIDEsIHVtIG51ciBTcGllbGVyIChJbnRlcmFjdGl2ZXMpIHp1IHN1Y2hlbgorICAgICBzdHJpbmcgKmV4bHVkZQktIHdlbGNoZSBOYW1lbiBzb2xsZW4gaWdub3JpZXJ0IHdlcmRlbgorCisKK0JFU0NIUkVJQlVORzoKKyAgICAgU3VjaHQgYWxsZSBMZWJld2VzZW4sIGRlcmVuIE5hbWVuIG1pdCBzdHIgYmVnaW5uZW4uCisKK1JVRUNLR0FCRVdFUlQ6CisgICAgIEVpbiBTdHJpbmcsIGZhbGxzIGVzIGVpbiBMZWJld2VzZW4gbWl0IGRlbSBOYW1lbiBzdHIgZ2lidCAoZGVyIE5hbWUKKyAgICAgbXVzcyBnZW5hdSBwYXNzZW4pLgorICAgICAtMSwgd2VubiBlcyBtZWhyZXJlIExlYmV3ZXNlbiBnaWJ0LCBkZXJlbiBOYW1lbiBtaXQgc3RyIGJlZ2lubmVuLgorICAgICAtMiwgd2VubiBlcyBrZWluIExlYmV3ZXNlbiBnaWJ0LCBkZXNzZW4gTmFtZSBtaXQgc3RyIGJlZ2lubnQuCisKK0JFSVNQSUVMRToKKyAgICAgbWF0Y2hfbGl2aW5nKCJ3YXJnb24iKTsgPT4gIndhcmdvbiIsIHdlbm4gV2FyZ29uIGVpbmdlbG9nZ3QgaXN0LgorICAgICBtYXRjaF9saXZpbmcoIndhciIpOyAgICA9PiAid2FyZ29uIiwgd2VubiBlcyBrZWluIGFuZGVyZXMgTGViZXdlc2VuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpYnQsIGRlc3NlbiBOYW1lIG1pdCAid2FyIiBiZWdpbm50LgorCitTSUVIRSBBVUNIOgorICAgICBmaW5kX2xpdmluZyhFKSwgZmluZF9wbGF5ZXIoRSksIGZpbmRfbmV0ZGVhZChFKQorCisyNy4gTWFpIDIwMDQgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy9zZWZ1bi9tZDUgYi9kb2Mvc2VmdW4vbWQ1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNjUwOTAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2VmdW4vbWQ1CkBAIC0wLDAgKzEsMzAgQEAKK0RFUFJFQ0FURUQKK1NZTk9QU0lTCisgICAgICAgIHN0cmluZyBtZDUgKHN0cmluZyBhcmcgWyAsIGludCBpdGVyYXRpb25zIF0gKQorICAgICAgICBzdHJpbmcgbWQ1IChpbnQgKiAgYXJnIFsgLCBpbnQgaXRlcmF0aW9ucyBdICkKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIEJlcmVjaG5ldCBkZW4gTUQ1LUhhc2h3ZXJ0IHZvbiA8YXJnPi4KKyAgICAgICAgRGFzIEFyZ3VtZW50IGthbm4gZWluIFN0cmluZywgb2RlciBlaW4gQXJyYXkgdm9uIFphaGxlbiBzZWluICh2b24KKyAgICAgICAgd2VsY2hlbiBudXIgZGFzIHVudGVyc3RlIEJ5dGUgYmV0cmFjaHRlZCB3aXJkKS4KKworICAgICAgICBEYXMgRXJnZWJuaXMgd2lyZCBhbHMgMzItc3RlbGxpZ2VyIEhleGFkZXppbWFsd2VydCBnZWxpZWZlcnQuCisKKyAgICAgICAgSXN0IGRhcyA8aXRlcmF0aW9ucz4gQXJndW1lbnQgZWluZSBaYWhsIGdyb2Vzc2VyIDAsIGJlcmVjaG5ldCBkZXIKKyAgICAgICAgRHJpdmVyIGRlbiBEaWdlc3QgbWl0IGRpZXNlIEFuemFobCBhbiBXaWVkZXJob2x1bmdlbi4gRmVobHQgZGllCisgICAgICAgIEFuZ2FiZSwgZnVlaHJ0IGRlciBEcml2ZXIgZGllIERpZ2VzdC1CZXJlY2hudW5nIGVpbm1hbCBhdXMuCisKK0JFSVNQSUVMCisgICAgICAgIHN0cmluZyBzOworCisgICAgICAgIHMgPSBtZDUoIkhhbGxvIik7CisgICAgICAgIHMgPSBtZDUoICh7ICdIJywgJ2UnLCAnbCcsICdsJywgJ28nIH0pICkKKyAgICAgICAgcyA9IG1kNSggKHsgJ0gnLCAnZScsICdsJywgJ2wnLCAnbycgfSksIDIgKQorCitBRU5ERVJVTkdFTgorICAgICAgICBFaW5nZWZ1ZWhydCBpbiBMRE11ZCAzLjIuOQorICAgICAgICBMRE11ZCAzLjIuMTIgZnVlaHJ0ZSBaYWVobGVuYXJyYXlzIGFscyBBcmd1bWVudCBlaW4sIGFsc28gYXVjaAorICAgICAgICAgIGRpZSBBbnphaGwgZGVyIFdpZWRlcmhvbHVuZ2VuLgorCitTSUVIRSBBVUNICisgICAgICAgIGNyeXB0KEUpLCBtZDVfY3J5cHQoRSksIHNoYTEoRSksIGhhc2goRSksIGhtYWMoRSkKZGlmZiAtLWdpdCBhL2RvYy9zZWZ1bi9ta2RpcnAgYi9kb2Mvc2VmdW4vbWtkaXJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNWQ0ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2VmdW4vbWtkaXJwCkBAIC0wLDAgKzEsMjEgQEAKK0ZVTktUSU9OOgorICAgICAgICBpbnQgbWtkaXJwKHN0cmluZyBkaXIpCisKK0FSR1VNRU5URToKKyAgICAgICAgZGlyIC0gTmFtZSBkZXMgenUgZXJzdGVsbGVuZGVuIFZlcnplaWNobmlzc2VzIChhYnNvbHV0KQorCitCRVNDSFJFSUJVTkc6CisgICAgICAgIEVyemV1Z3QgZGFzIFZlcnplaWNobmlzIDxkaXI+LiBEaWVzIG11c3MgYWxzIGFicy4gUGZhZCBhbmdlZ2ViZW4KKyAgICAgICAgd2VyZGVuLgorICAgICAgICBXZW5uIG5vZXRpZywgd2lyZCBkaWUgZ2FuemUgVmVyemVpY2huaXNoaWVyYXJjaGllIHJla3Vyc2l2IGVyc3RlbGx0LgorICAgICAgICAKK1JVRUNLR0FCRVdFUlQ6CisgICAgICAgIDAgLSBWZXJ6ZWljaG5pcyBrb25udGUgbmljaHQgZXJzdGVsbHQgd2VyZGVuCisgICAgICAgIDEgLSBWZXJ6ZWljaG5pcyB3dXJkZSBlcnN0ZWxsdCBvZGVyIGV4aXN0aWVydGUgYmVyZWl0cworCitTSUVIRSBBVUNIOgorICAgICAgICBta2RpcihFKQorCitMRVRaVCBBZU5ERVJVTkc6CisyNi4wMS4yMDEzLCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9zZWZ1bi9ub3RpZnlfZmFpbCBiL2RvYy9zZWZ1bi9ub3RpZnlfZmFpbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTcwMzY3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NlZnVuL25vdGlmeV9mYWlsCkBAIC0wLDAgKzEsODUgQEAKK0ZVTktUSU9OOgorICAgICAjaW5jbHVkZSA8bm90aWZ5X2ZhaWwuaD4KKworICAgICB2YXJhcmdzIHZvaWQgbm90aWZ5X2ZhaWwoc3RyaW5nIHN0ciwgaW50IHByaW8pCisgICAgIHZhcmFyZ3Mgdm9pZCBub3RpZnlfZmFpbChjbG9zdXJlIGNsLCBpbnQgcHJpbykKKworQVJHVU1FTlRFOgorICAgICBzdHIgICBNZWxkdW5nIGRpZSBhbiBkZW4gU3BpZWxlciBhbnN0YXR0IGRlcyAnV2llIGJpdHRlJyBhdXNnZWdlYmVuCisgICAgICAgICAgIHdlcmRlbiBzb2xsCisgICAgIGNsICAgIENsb3N1cmUsIGRpZSBiZWkgRmVobHNjaGxhZyBhdXNnZWZ1ZWhydCB3ZXJkZW4gc29sbAorICAgICBwcmlvICBQcmlvcml0YWV0IGRpZXNlcyBPYmpla3RzIGJlaSBkaWVzZW0gU2V0emVuIGRlciBNZWxkdW5nCisKK0JFU0NIUkVJQlVORzoKKyAgICAgTWVya3Qgc2ljaCBkZW4gYW5nZWdlYmVuZW4gc3RyIHVuZCBnaWJ0IGlobiBpbSBGYWxsZSBlaW5lciBpbmtvcnJla3RlbgorICAgICBFaW5nYWJlIGRlcyBTcGllbGVycyBhbnN0YXR0IGVpbmVzICdXaWUgYml0dGUnIGF1cy4KKworICAgICBHZWRhY2h0IGlzdCBub3RpZnlfZmFpbCwgdW0gZGVtIFNwaWVsZXIgZWluZSBiZXNzZXJlIEhpbGZlc3RlbGx1bmcKKyAgICAgYmVpIEtvbW1hbmRvcyAvIEVpbmdhYmVuIHp1IGdlYmVuLCB1bSBpaG4gdS5VLiBhdWYgZGllIHJpY2h0aWdlCisgICAgIFN5bnRheCBoaW56dXdlaXNlbi4KKworICAgICBXaXJkIG5vdGlmeV9mYWlsIG1laHJmYWNoIChkdXJjaCB2ZXJzY2hpZWRlbmUgT2JqZWt0ZSBvLmFlLikgYXVmLQorICAgICBnZXJ1ZmVuLCB3aXJkIGRlciBsZXR6dGUgZXJmb2xncmVpY2hlIEF1ZnJ1ZiBnZXdlcnRldC4gRWluZSBNZWxkdW5nIHdpcmQKKyAgICAgZGFubiB0YXRzYWVjaGxpY2ggZ2VzZXR6dCwgd2VubiBkaWUgUHJpb3JpdGFldCBkaWVzZXMgT2JqZWt0cyBnbGVpY2gKKyAgICAgZ3Jvc3Mgb2RlciBncm9lc3NlciBpc3QgYWxzIGRpZSBQcmlvcml0YWV0IGRlcyBPYmpla3RzLCB3YXMgZGFzIGJpc2hlcgorICAgICBndWVsdGlnZSBub3RpZnlfZmFpbCgpIGdlc2V0enQgaGF0LiBGb2xnZW5kZSBQcmlvcml0YWV0ZW4gc2luZAorICAgICB2b3JkZWZpbmllcnQgdW5kIHdlcmRlbiBhdXRvbWF0aXNjaCBlcm1pdHRlbHQ6CisgICAgIE5GX05MX09XTiAgICAxMDAgICAgICAgICAvLyBlaWdlbmVzIE9iamVrdCAoc291bCkgdWViZXJzY2hyZWlidCBrYXVtIHdhcworICAgICBORl9OTF9USElORyAgMTAwMDAwCisgICAgIE5GX05MX1JPT00gICAxMDAwMDAwICAgICAvLyBSYWV1bWUgdWViZXJzY2hyZWliZW4gc29uc3RpZ2VuIEtyYW1zCisgICAgIE5GX05MX0xJVklORyAxMDAwMDAwMCAgICAvLyBMZWJld2VzZW4gdWViZXJzY2hyZWliZW4gYXVjaCBSYWV1bWUKKyAgICAgMiB3ZWl0ZXJlIHZvcmRlZmluaWVydGUga29lbm5lbiB2b24gTWFnaWVyIGFuZ2VnZWJlbiB3ZXJkZW46CisgICAgIE5GX05MX05PTkUgICAtMSAgICAgICAgICAvLyB3aXJkIHZvbiBhbGxlbSB1ZWJlcnNjaHJpZWJlbgorICAgICBORl9OTF9NQVggICAgX19JTlRfTUFYX18gLy8gaG9lY2hzdGUgUHJpb3JpdGFldCwgdWViZXJzY2hyZWlidCBhbGxlcworCisgICAgIFdpcmQgZWluZSBDbG9zdXJlIGFscyBBcmd1bWVudCBnZWdlYmVuLCB3aXJkIHNpZSBpbSBGZWhsZXJmYWxsCisgICAgIChhbHNvIGVyc3Qgd2VubiBlaW4gS29tbWFuZG8gZW5kZ3VlbHRpZyBmZWhsZ2VzY2hsYWdlbiBoYXQpCisgICAgIGF1c2dlZnVlaHJ0IHVuZCBoYXQgZGllIEZlaGxlcm1lbGR1bmcgYWxzIFJlc3VsdGF0CisgICAgIHp1cnVlY2t6dWdlYmVuLiBEaWUgQ2xvc3VyZSBlcmhhZWx0IGFscyBBcmd1bWVudCBkZW4KKyAgICAgb3JpZ2luYWxlbiBCZWZlaGxzZ2ViZXI7IGluIGRlciBSZWdlbCBkaWVzIGlzdCB0aGlzX3BsYXllcigpLAorICAgICB3YXMgYWJlciB2b20gTU9ESUZZX0NNRCBob29rIGdlYWVuZGVydCB3ZXJkZW4ga2Fubi4KKworICAgICBub3RpZnlfZmFpbCgpIGVya2VubnQgdmVyc2NoYWNodGVsdGUgS29tbWFuZG9zIChzaWVoZSBFZnVuCisgICAgIGNvbW1hbmQoKSksIHVuZCBlaW4gbm90aWZ5X2ZhaWwoKSBpbiBlaW5lbSBVbnRlcmtvbW1hbmRvCisgICAgIGhhdCBrZWluZW4gRWluZmx1c3MgYXVmIGRhcyB1ZWJlcmdlb3JkbmV0ZSBLb21tYW5kby4KKworQkVNRVJLVU5HRU46CisgICAgIC0gc29sYW5nZSBtYW4gc2ljaCBuaWNodCBhYnNvbHV0IHNpY2hlciBpc3QsIGRhc3MgZWluIGJlc3RpbW10ZXMgT2JqZWt0CisgICAgICAgbWl0IGRlbSBLb21tYW5kbyBnZW1laW50IGlzdCAoSWRlbnRpZmlrYXRpb24gdWViZXIgaWQoKSksIHNvbGx0ZSBtYW4KKyAgICAgICAtIG5vdGlmeV9mYWlsKHN0cik7IHJldHVybiAwOworICAgICAgIG51dHplbiBhbnN0YXR0IG1pdAorICAgICAgIC0gd3JpdGUoc3RyKSByZXR1cm4gMTsKKyAgICAgICBkaWUgS29tbWFuZG9hdXN3ZXJ0dW5nIGFienVicmVjaGVuICh1bmQgYW5kZXJlbiBPYmpla3RlbiBkaWUgQ2hhbmNlCisgICAgICAgenUgbmVobWVuIGRhcyBLb21tYW5kbyB6dSBlcmZ1ZWxsZW4pCisgICAgIC0gS29tbWFuZG9zIHdlcmRlbiB1ZWJyaWdlbnMgb2Z0IGVyc3Qgdm9tIGJldHJldGVuZW4gUmF1bSwgZGFubiB2b24gZGVuCisgICAgICAgT2JqZWt0ZW4gYWJnZWFyYmVpdGV0IChqZSBuYWNoZGVtIHdhbm4gZGllc2UgZGF6dWthbWVuKQorICAgICAtIGRpZSBQcmlvcml0YWV0IHdpcmQgbW9tZW50YW4gbmljaHQgZ2VzcGVpY2hlcnQsIHNpZSBpc3QgbnVyIGJlaW0gU2V0emVuCisgICAgICAgcmVsZXZhbnQuIFdpbGwgc3BhZXRlciBlaW4gYW5kZXJlcyBPYmpla3QgZWluZSBNZWxkdW5nIHNldHplbiwgd2lyZAorICAgICAgIGZ1ZXIgZGFzIGVpZ2VuZSBPYmpla3QgZGllIFN0YW5kYXJkcHJpb3JpdGFldCBlcm1pdHRlbHQsIGF1Y2ggd2VubiBtYW4KKyAgICAgICBlaW5lIGFuZGVyZSBoaWVyIHVlYmVyZ2ViZW4gaGF0CisgICAgIC0gRGllIE5GX05MXyogc2luZCBpbiAvc3lzL25vdGlmeV9mYWlsLmggZGVmbmllcnQuCisKK0JFSVNQSUVMRToKKyAgICAgRWluIFJhdW0gZXJ3YXJ0ZXQgZGllIGtvcnJla3RlIEVpbmdhYmUgdm9uICdpc3Mgc3VwcGUnOgorCisgICAgIGludCBpc3NfY21kKHN0cmluZyBzdHIpeworICAgICAgIC8vIHp1IEFuZmFuZyBkZXIgRnVua3Rpb24gZGFzIG5vdGlmeV9mYWlsIGRlZmluaWVyZW4KKyAgICAgICBub3RpZnlfZmFpbCgiTW9lY2h0ZXN0IER1IHZpZWxsZWljaHQgdm9uIGRlciBTdXBwZSBlc3Nlbj9cbiIpOworCisgICAgICAgLy8gU3BpZWxlciBoYXQgbnVyICdpc3MnIG9obmUgUGFyYW1ldGVyIGVpbmdlZ2ViZW4gb2RlciBlaW5lbiBhbmRlcmVuCisgICAgICAgLy8gUGFyYW1ldGVyIGFuZ2VnZWJlbiAuLi4gQWJicnVjaCEKKyAgICAgICAvLyBGYWxscyBrZWluIHdlaXRlcmVzIE9iamVrdCBkYXMgS29tbWFuZG8gZXJmdWVsbHQgb2RlciBkYXMKKyAgICAgICAvLyBub3RpZnlfZmFpbCgpIG1pdCBlaW5lciBlaWdlbmVuIE1lbGR1bmcgdWViZXJzY2hyZWlidCwgd2lyZCBvYmlnZQorICAgICAgIC8vIE1lbGR1bmcgYW4gZGVuIFNwaWVsZXIgYXVzZ2VnZWJlbi4KKworICAgICAgIGlmKCFzdHIgfHwgc3RyIT0ic3VwcGUiKSByZXR1cm4gMDsKKyAgICAgICAvLyBhYiBoaWVyIGlzdCBkaWUgRWluZ2FiZSBkYW5uIHdpcmtsaWNoICdzdXBwZScgdW5kIGRpZSBGdW5rdGlvbgorICAgICAgIC8vIGthbm4gYmVsaWViaWcgZm9ydGdlZnVlaHJ0IHdlcmRlbgorICAgICAgIC4uLgorICAgICAgIHJldHVybiAgIDE7CisKK1NJRUhFIEFVQ0g6CisgICAgIGFkZF9hY3Rpb24oRSksIEFkZENtZChMKSwgQWRkQWN0aW9uKEwpLAorICAgICBxdWVyeV92ZXJiKEUpLCBxdWVyeV9ub3RpZnlfZmFpbChFKQorCis4LkF1ZyAyMDA3IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2Mvc2VmdW4vb2JqZWN0X2luZm8gYi9kb2Mvc2VmdW4vb2JqZWN0X2luZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk0NTY1MQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zZWZ1bi9vYmplY3RfaW5mbwpAQCAtMCwwICsxLDEyOSBAQAorREVQUkVDQVRFRAorU1lOT1BTSVMKKyAgICAgICAgI2luY2x1ZGUgPG9iamVjdGluZm8uaD4KKworICAgICAgICBtaXhlZCAqIG9iamVjdF9pbmZvKG9iamVjdCBvYiwgaW50IHdoYXQpCisgICAgICAgIG1peGVkICogb2JqZWN0X2luZm8ob2JqZWN0IG9iLCBpbnQgd2hhdCwgaW50IGluZGV4KQorCitERVNDUklQVElPTgorICAgICAgICBSZXR1cm5zIHNvbWUgaW50ZXJuYWwgaW5mb3JtYXRpb24gYWJvdXQgb2JqZWN0IDxvYj4sIGNvbGxlY3RlZAorICAgICAgICBpbiBhbiBhcnJheS4gQXJndW1lbnQgPHdoYXQ+IGRldGVybWluZXMgd2hpY2ggaW5mb3JtYXRpb24gaXMKKyAgICAgICAgcmV0dXJuZWQuCisKKyAgICAgICAgVGhlIHJlc3VsdCBpcyB1c3VhbGx5IGFuIGFycmF5LiBIb3dldmVyLCBpZiA8aW5kZXg+IGlzIHNwZWNpZmllZCwKKyAgICAgICAgdGhlIHJlc3VsdCBpcyB0aGUgdmFsdWUgZnJvbSBwb3NpdGlvbiA8aW5kZXg+IG9mIHRoZSBhcnJheSB3aGljaAorICAgICAgICB3b3VsZCBoYXZlIGJlZW4gcmV0dXJuZWQgbm9ybWFsbHkuCisKKyAgICAgICAgVGhlIHBvc3NpYmxlIHZhbHVlcyBvZiA8d2hhdD4sIGFuZCB0aGUgaW5kaWNlcyBvZiB0aGUgcmV0dXJuZWQKKyAgICAgICAgYXJyYXlzIGFyZSBkZWZpbmVkIGluIHRoZSBpbmNsdWRlIGZpbGUgPG9iamVjdGluZm8uaD4sIGFuZCBtYXkKKyAgICAgICAgY2hhbmdlIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGUgZHJpdmVyIQorCisKKyAgICAgICAgPHdoYXQ+ID09IE9JTkZPX0JBU0lDOgorCisgICAgICAgICAgVGhpcyBjYWxsIHJldHVybnMgYmFzaWMgaW5mb3JtYXRpb24gYWJvdXQgPG9iPjoKKworICAgICAgICAgIGludCBbT0lCX0hFQVJUX0JFQVRdOiAgICAgICAxIGlmIDxvYj4gaGFzIGEgaGVhcnRfYmVhdCwgMCBlbHNlLgorICAgICAgICAgIGludCBbT0lCX0lTX1dJWkFSRF06ICAgICAgICAxIGlmIDxvYj4gaGFzIHRoZSB3aXphcmQgZmxhZyBzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCBlbHNlLgorICAgICAgICAgICAgVGhpcyBlbnRyeSBpcyBhbHdheXMgMCB3aGVuIHNldF9pc193aXphcmQoKSBpcyBub3QgYXZhaWxhYmxlLgorICAgICAgICAgIGludCBbT0lCX0VOQUJMRV9DT01NQU5EU106ICAxIGlmIDxvYj4gY2FuIGdpdmUgY29tbWFuZHMsIDAgZWxzZS4KKyAgICAgICAgICBpbnQgW09JQl9DTE9ORV06ICAgICAgICAgICAgMSBpZiA8b2I+IGlzIGEgY2xvbmUsIDAgZWxzZS4KKyAgICAgICAgICBpbnQgW09JQl9ERVNUUlVDVEVEXTogICAgICAgMSBpZiA8b2I+IGlzIGRlc3RydWN0ZWQsIDAgZWxzZS4KKyAgICAgICAgICBpbnQgW09JQl9TV0FQUEVEXTogICAgICAgICAgMSBpZiA8b2I+IGlzIHN3YXBwZWQsIDAgZWxzZS4KKyAgICAgICAgICBpbnQgW09JQl9PTkNFX0lOVEVSQUNUSVZFXTogMSBpZiA8b2I+IHdhcyBvbmNlIGludGVyYWN0aXZlLCAwIGVsc2UuCisgICAgICAgICAgaW50IFtPSUJfUkVTRVRfU1RBVEVdOiAgICAgIDEgaWYgPG9iPiBpcyAoc3RpbGwpIHJlc2V0LCAwIGVsc2UuCisgICAgICAgICAgaW50IFtPSUJfV0lMTF9DTEVBTl9VUF06ICAgIDEgaWYgPG9iPiB3aWxsIGNhbGwgY2xlYW5fdXAoKSwgMCBlbHNlLgorICAgICAgICAgIGludCBbT0lCX0xBTUJEQV9SRUZFUkVOQ0VEXTogMSBpZiA8b2I+IGhhcyBsYW1iZGFzLCAwIGVsc2UuCisgICAgICAgICAgaW50IFtPSUJfU0hBRE9XXTogICAgICAgICAgIDEgaWYgPG9iPiBoYXMgYSBzaGFkb3cgc3RydWN0dXJlIHRpZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBpdCwgMCBpZiBub3QuCisgICAgICAgICAgaW50IFtPSUJfUkVQTEFDRURdOiAgICAgICAgIDEgaWYgdGhlIHByb2dyYW0gZm9yIDxvYj4gd2FzIHJlcGxhY2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIGVsc2UuCisgICAgICAgICAgaW50IFtPSUJfTkVYVF9SRVNFVF06ICAgdGltZSBvZiB0aGUgbmV4dCByZXNldAorICAgICAgICAgIGludCBbT0lCX1RJTUVfT0ZfUkVGXTogIHRpbWUgb2YgdGhlIGxhc3QgY2FsbCB0byA8b2I+CisgICAgICAgICAgaW50IFtPSUJfTkVYVF9DTEVBTlVQXTogdGltZSBvZiB0aGUgbmV4dCBkYXRhIGNsZWFudXAKKyAgICAgICAgICBpbnQgW09JQl9SRUZdOiAgICAgICAgICBudW1iZXIgb2YgcmVmZXJlbmNlcyB0byA8b2I+CisgICAgICAgICAgaW50IFtPSUJfR0lHQVRJQ0tTXSBhbmQgW09JQl9USUNLU106IHRvZ2V0aGVyLCB0aGVzZSBudW1iZXJzCisgICAgICAgICAgICBnaXZlIHRoZSBhY2N1bXVsYXRlZCBldmFsdWF0aW9uIGNvc3Qgc3BlbmQgaW4gPG9iPgorICAgICAgICAgIGludCBbT0lCX1NXQVBfTlVNXTogICAgIHRoZSBzd2FwIG51bWJlciBmb3IgPG9iPnMgcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciAtMSBpZiBub3Qgc3dhcHBlZC4KKyAgICAgICAgICBpbnQgW09JQl9QUk9HX1NXQVBQRURdOiAxIGlmIDxvYj4ncyBwcm9ncmFtIGlzIHN3YXBwZWQsIDAgZWxzZS4KKyAgICAgICAgICBpbnQgW09JQl9WQVJfU1dBUFBFRF06ICAxIGlmIDxvYj4ncyB2YXJpYWJsZXMgYXJlIHN3YXBwZWQsIDAgZWxzZS4KKyAgICAgICAgICBpbnQgW09JQl9OQU1FXTogICAgICAgICA8b2I+J3Mgb2JqZWN0IG5hbWUuCisgICAgICAgICAgaW50IFtPSUJfTE9BRF9OQU1FXTogICAgPG9iPidzIGxvYWQgbmFtZS4KKyAgICAgICAgICBvYmplY3QgW09JQl9ORVhUX0FMTF06ICBuZXh0IG9iamVjdCBpbiB0aGUgb2JqZWN0IGxpc3QuCisgICAgICAgICAgb2JqZWN0IFtPSUJfUFJFVl9BTExdOiAgcHJldmlvdXMgb2JqZWN0IGluIHRoZSBvYmplY3QgbGlzdC4KKworCisgICAgICAgIDx3aGF0PiA9PSBPSU5GT19QT1NJVElPTjoKKworICAgICAgICAgIFRoaXMgY2FsbCByZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IDxvYj4ncyBwb3NpdGlvbiBpbiB0aGUKKyAgICAgICAgICBnbG9iYWwgbGlzdCBvZiBvYmplY3RzOgorCisgICAgICAgICAgb2JqZWN0IFtPSVBfTkVYVF06IG5leHQgb2JqZWN0IGluIHRoZSBvYmplY3QgbGlzdC4KKyAgICAgICAgICBvYmplY3QgW09JUF9QUkVWXTogcHJldmlvdXMgb2JqZWN0IGluIHRoZSBvYmplY3QgbGlzdC4KKyAgICAgICAgICBpbnQgICAgW09JUF9QT1NdOiAgcG9zaXRpb24gb2YgPG9iPiBpbiBsaXN0LCBjb3VudGluZyBmcm9tIDAgdXAuCisKKyAgICAgICAgICBUaGlzIGNhbGwgY2FuIGJlIGV4cGVuc2l2ZSBpbiBjb21wdXRpbmcgdGltZS4KKworCisgICAgICAgIDx3aGF0PiA9PSBPSU5GT19NRU1PUlk6CisKKyAgICAgICAgICBUaGlzIGNhbGwgcmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJvZ3JhbSA8b2I+IHVzZXM6CisKKyAgICAgICAgICBpbnQgICAgW09JTV9SRUZdOiAgICAgICAgICAgIG51bWJlciBvZiByZWZlcmVuY2VzIHRvIHRoZSBwcm9ncmFtLgorICAgICAgICAgIHN0cmluZyBbT0lNX05BTUVdOiAgICAgICAgICAgbmFtZSBvZiBwcm9ncmFtLgorICAgICAgICAgIGludCAgICBbT0lNX1BST0dfU0laRV06ICAgICAgc2l6ZSBvZiB0aGUgcHJvZ3JhbS4KKyAgICAgICAgICBpbnQgICAgW09JTV9OVU1fRlVOQ1RJT05TXTogIG51bWJlciBvZiBmdW5jdGlvbnMgaW4gdGhlIHByb2dyYW0uCisgICAgICAgICAgaW50ICAgIFtPSU1fU0laRV9GVU5DVElPTlNdOiBzaXplIG5lZWRlZCBmb3IgdGhlIGZ1bmN0aW9uIHN0cnVjdHMuCisgICAgICAgICAgaW50ICAgIFtPSU1fTlVNX1ZBUklBQkxFU106ICBudW1iZXIgb2YgdmFyaWFibGVzIGluIHRoZSBwcm9ncmFtLgorICAgICAgICAgIGludCAgICBbT0lNX1NJWkVfVkFSSUFCTEVTXTogc2l6ZSBuZWVkZWQgZm9yIHRoZSB2YXJpYWJsZSBzdHJ1Y3RzLgorICAgICAgICAgIGludCAgICBbT0lNX05VTV9TVFJJTkdTXTogICAgbnVtYmVyIG9mIHN0cmluZ3MgaW4gdGhlIHByb2dyYW0uCisgICAgICAgICAgaW50ICAgIFtPSU1fU0laRV9TVFJJTkdTXTogICBzaXplIG5lZWRlZCBmb3IgdGhlIHN0cmluZyBwb2ludGVycy4KKyAgICAgICAgICBpbnQgICAgW09JTV9TSVpFX1NUUklOR1NfREFUQV06IHNpemUgbmVlZGVkIGZvciB0aGUgc3RyaW5nIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZWQgZG93biBhY2NvcmRpbmcgdG8gdGhlIGV4dGVuZCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSBzaGFyaW5nLgorICAgICAgICAgIGludCAgICBbT0lNX1NJWkVfU1RSSU5HU19UT1RBTF06IHVubW9kaWZpZWQgc2l6ZSBuZWVkZWQgZm9yIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGRhdGEuCisgICAgICAgICAgaW50ICAgIFtPSU1fTlVNX0lOQ0xVREVTXTogICBudW1iZXIgb2YgaW5jbHVkZWQgZmlsZXMgaW4gdGhlIHByb2dyYW0uCisgICAgICAgICAgaW50ICAgIFtPSU1fTlVNX0lOSEVSSVRFRF06ICBudW1iZXIgb2YgaW5oZXJpdGVkIHByb2dyYW1zLgorICAgICAgICAgIGludCAgICBbT0lNX1NJWkVfSU5IRVJJVEVEXTogc2l6ZSBuZWVkZWQgZm9yIHRoZSBpbmhlcml0IHN0cnVjdHMuCisgICAgICAgICAgaW50ICAgIFtPSU1fVE9UQUxfU0laRV06ICAgICB0b3RhbCBzaXplIG9mIHRoZSBwcm9ncmFtLgorICAgICAgICAgIGludCAgICBbT0lNX0RBVEFfU0laRV06ICAgICAgdG90YWwgc2l6ZSBvZiB0aGUgdmFsdWVzIGhlbGQgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QncyB2YXJpYWJsZXMsIHNjYWxlZCBkb3duCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NvcmRpbmcgdG8gdGhlIGV4dGVuZCBvZiBkYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyaW5nLgorICAgICAgICAgIGludCAgICBbT0lNX0RBVEFfU0laRV9UT1RBTF06IHVubW9kaWZpZWQgdG90YWwgc2l6ZSBvZiB0aGUgdmFsdWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxkIGluIHRoZSBvYmplY3QncyB2YXJpYWJsZXMKKyAgICAgICAgICBpbnQgICAgW09JTV9OT19JTkhFUklUXTogICAgIDEgaWYgdGhlIHByb2dyYW0gY2FuJ3QgYmUgaW5oZXJpdGVkLgorICAgICAgICAgIGludCAgICBbT0lNX05PX0NMT05FXTogICAgICAgMSBpZiB0aGUgcHJvZ3JhbS9ibHVlcHJpbnQgY2FuJ3QgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb25lZC4KKyAgICAgICAgICBpbnQgICAgW09JTV9OT19TSEFET1ddOiAgICAgIDEgaWYgdGhlIHByb2dyYW0ncyBmdW5jdGlvbnMgY2FuJ3QgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRvd2VkLgorICAgICAgICAgIGludCAgICBbT0lNX1NIQVJFX1ZBUklBQkxFU106ICAxIGlmIGNsb25lcyBvZiB0aGlzIHByb2dyYW0gc2hhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZWlyIGluaXRpYWwgdmFyaWFibGUgdmFsdWVzIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBibHVlcHJpbnQuCisKKyAgICAgICAgICBUaGlzIGNhbGwgc3dhcHMgaW4gdGhlIHByb2dyYW0gaWYgbmVjZXNzYXJ5LgorICAgICAgICAgIE5vdGUgdGhhdCB0aGUgT0lNX1NJWkVfeHh4IGVudHJpZXMgb25seSBnaXZlIHRoZSBzaXplIHNwZW50IG9uCisgICAgICAgICAgdGhlIHN0cnVjdHVyZXMgYW5kIHBvaW50ZXJzLCBub3QgdGhlIHNpemUgb2YgdGhlIHZhcmlhYmxlIGRhdGEsCisgICAgICAgICAgZnVuY3Rpb24gY29kZSwgYW5kIHN0cmluZ3MgdGhlbXNlbHZlcy4KKworSElTVE9SWQorICAgICAgICBJbnRyb2R1Y2VkIGluIExETXVkIDMuMi42LgorICAgICAgICBDaGFuZ2VzIGluIExETXVkIDMuMi43OgorICAgICAgICAgIC0gbmV3IGJhc2ljIHJlc3VsdCBPSUJfUkVQTEFDRUQuCisgICAgICAgICAgLSBiYXNpYyByZXN1bHQgT0lCX0lTX1dJWkFSRCBpcyBhbHdheXMgMCBpZiBzZXRfaXNfd2l6YXJkKCkKKyAgICAgICAgICAgICAgaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgICAgICAtIGJhc2ljIHJlc3VsdCBPSUJfQVBQUk9WRUQgaXMgZ29uZS4KKyAgICAgICAgTERNdWQgMy4yLjggYWRkZWQgT0lNX0RBVEFfU0laRSB0byB0aGUgcmVzdWx0IG9mIE9JTkZPX01FTU9SWS4KKyAgICAgICAgTERNdWQgMy4yLjkgYWRkZWQgdGhlIGluZGV4IG1lY2hhbmlzbSwgT0lNX05VTV9JTkNMVURFUywKKyAgICAgICAgICBPSU1fTk9fSU5IRVJJVCwgT0lNX05PX1NIQURPVywgT0lNX05PX0NMT05FLCBPSU1fU0laRV9TVFJJTkdTX0RBVEEsCisgICAgICAgICAgT0lNX1NJWkVfU1RSSU5HU19UT1RBTCwgYW5kIE9JTV9EQVRBX1NJWkVfVE9UQUwgdG8gdGhlIHJlc3VsdAorICAgICAgICAgIG9mIE9JTkZPX01FTU9SWS4KKyAgICAgICAgTERNdWQgMy4zLjM3OCBhZGRlZCB0aGUgT0lNX1NIQVJFX1ZBUklBQkxFUyB0byB0aGUgcmVzdWx0CisgICAgICAgICAgb2YgT0lORk9fTUVNT1JZLgorICAgICAgICBMRE11ZCAzLjMuNjU0IGFkZGVkIHRoZSBPSUJfTkVYVF9DTEVBTlVQIHRvIHRoZSByZXN1bHQgb2YgT0lORk9fQkFTSUMuCisKK1NFRSBBTFNPCisgICAgICAgIGRlYnVnX2luZm8oRSkKZGlmZiAtLWdpdCBhL2RvYy9zZWZ1bi9vYnNvbGV0ZS9leGNsdWRlX2FsaXN0IGIvZG9jL3NlZnVuL29ic29sZXRlL2V4Y2x1ZGVfYWxpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk2N2ExNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zZWZ1bi9vYnNvbGV0ZS9leGNsdWRlX2FsaXN0CkBAIC0wLDAgKzEsNCBAQAorU1lOT1BTSVM6CisJbWl4ZWQgKmV4Y2x1ZGVfYWxpc3QoaW50IGksIG1peGVkICphbGlzdCkKKworUmVtb3ZlIGVsZW1lbnQgaSBmcm9tIGFsaXN0LgpkaWZmIC0tZ2l0IGEvZG9jL3NlZnVuL29ic29sZXRlL3JlbW92ZV9hbGlzdCBiL2RvYy9zZWZ1bi9vYnNvbGV0ZS9yZW1vdmVfYWxpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y5YmM2MQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zZWZ1bi9vYnNvbGV0ZS9yZW1vdmVfYWxpc3QKQEAgLTAsMCArMSwzIEBACittaXhlZCAqcmVtb3ZlX2FsaXN0KG1peGVkIGtleSwgbWl4ZWQgKmFsaXN0KQorCitSZW1vdmVzIGVsZW1lbnQgYXNzb2NpYXRlZCBieSBrZXkga2V5IGZyb20gYWxpc3QuCmRpZmYgLS1naXQgYS9kb2Mvc2VmdW4vb2xkX2V4cGxvZGUgYi9kb2Mvc2VmdW4vb2xkX2V4cGxvZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIxM2Q4ZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zZWZ1bi9vbGRfZXhwbG9kZQpAQCAtMCwwICsxLDI4IEBACitGVU5LVElPTjoKKwlzdHJpbmcgKm9sZF9leHBsb2RlKHN0cmluZyBzdHIsIHN0cmluZyBkZWwpCisKK0FSR1VNRU5URToKKwlzdHIgLSBEZXIgU3RyaW5nLCBkZXIgYXVmZ2VzcGFsdGV0IHdlcmRlbiBzb2xsLgorCWRlbCAtIERlciBTdHJpbmcsIG5hY2ggZGVtIHN0ciBhdWZnZXNwYWx0ZW4gd2VyZGVuIHNvbGwuCisKK0JFU0NIUkVJQlVORzoKKwlEdXJjaCBBdXNzY2huZWlkZW4gdm9uIGRlbCB3aXJkIGRlciBTdHJpbmcgc3RyIGluIGVpbiBBcnJheSB2b24gU3RyaW5ncworCXplcmxlZ3QuIERpZXNlcyBBcnJheSB3aXJkIGFuc2NobGllc3NlbmQgenVydWNrZ2VnZWJlbi4KKworUlVFQ0tHQUJFV0VSVDoKKwlEYXMgQXJyYXkgbWl0IGRlbiBCZXN0YW5kdGVpbGVuIGRlciBaZXJsZWd1bmcuCisKK0JFTUVSS1VOR0VOOgorCURhcyBWZXJoYWx0ZW4gdm9uIG9sZF9leHBsb2RlKCkgZW50c3ByaWNodCBkZW0gZGVtIGV4cGxvZGUoKS1WZXJoYWx0ZW4sCisJZGFzIGluIC9kb2MvZWZ1bi9leHBsb2RlIGFscyAiYWx0ZXMiIFZlcmhhbHRlbiBiZXplaWNobmV0IHdpcmQsIGQuaC4KKwlMZWVyc3RyaW5ncyBhbiBBbmZhbmcgdW5kIEVuZGUgZGVzIHplcmxlZ3RlbiBTdHJpbmdzIHdlcmRlbiBlbnRmZXJudCEKKworQkVJU1BJRUxFOgorCXN0cnMgPSBleHBsb2RlKCAibmltbSBhbGxlcyIsICIgIik7ID0+IHN0cnMgPSAoeyAibmltbSIsICJhbGxlcyIgfSkKKwlzdHJzID0gZXhwbG9kZSggImFiYyIsICJhYmMiICk7ICAgICA9PiBzdHJzID0gKHsgfSkKKwlzdHJzID0gZXhwbG9kZSggImVpbiB0ZXN0IiwgIiIgKTsgICA9PiBzdHJzID0gKHsgImVpbiB0ZXN0IiB9KQorCXN0cnMgPSBleHBsb2RlKCAiYSBiIiwgImEiKTsgICAgICAgID0+IHN0cnMgPSAoeyAiIGIiIH0pOworCitTSUVIRSBBVUNIOgorCWV4cGxvZGUoRSksIG5ld19leHBsb2RlKEUpLCBlZnVuOjpleHBsb2RlKEUpLCBzc2NhbmYoRSkKKyAgICAgICAgaW1wbG9kZShFKSwgcmVnZXhwbG9kZShFKQpkaWZmIC0tZ2l0IGEvZG9jL3NlZnVuL3Byb2Nlc3NfY2FsbCBiL2RvYy9zZWZ1bi9wcm9jZXNzX2NhbGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAwYTAzOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zZWZ1bi9wcm9jZXNzX2NhbGwKQEAgLTAsMCArMSwyMSBAQAorc2ltdWxfZWZ1bjo6cHJvY2Vzc19jYWxsKEUpCitGVU5LVElPTjoKKyAgICAgaW50IHByb2Nlc3NfY2FsbCgpCisKK0JFU0NIUkVJQlVORzoKKyAgICAgR2lidCB6dXJ1ZWNrLCBvYiBkaWUgQXVzZnVlaHJ1bmcgenVtIGRlcnplaXRpZ2VuIFplaXRwdW5rdCBkdXJjaAorICAgICBwcm9jZXNzX3N0cmluZygpIGF1c2dlcnVmZW4gd3VyZGUuCisKK0JFSVNQSUVMRToKKyAgICAgcHJvY2Vzc19zdHJpbmcoIkBAY3VycmVudF9sb25nQEAiKTsKKyAgICAgLi4uCisgICAgIHN0cmluZyBjdXJyZW50X2xvbmcoKSB7CisgICAgICBpZihwcm9jZXNzX2NhbGwoKSkKKyAgICAgICByZXR1cm4oIkRpZXNlciBTdHJpbmcgd3VyZGUgZHVyY2ggZWluIHByb2Nlc3Nfc3RyaW5nIGVpbmdlZnVlZ3QuIik7CisgICAgICBlbHNlIHJldHVybigiRHUgaGFzdCBkaWUgRnVua3Rpb24gZGlyZWt0IGdlcnVmZW4hIik7CisgICAgIH0KKworU0lFSEUgQVVDSDoKKyAgICAgbm90aWZ5X2ZhaWwoRSksIHByb2Nlc3Nfc3RyaW5nKEUpLCByZXBsYWNlX3BlcnNvbmFsKEUpCisKKzI4LiBNYWVyeiAyMDA0IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2Mvc2VmdW4vcHJvY2Vzc19zdHJpbmcgYi9kb2Mvc2VmdW4vcHJvY2Vzc19zdHJpbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVjOTI5MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zZWZ1bi9wcm9jZXNzX3N0cmluZwpAQCAtMCwwICsxLDU3IEBACitwcm9jZXNzX3N0cmluZyhFKQorRlVOS1RJT046CisgICAgIHN0cmluZyBwcm9jZXNzX3N0cmluZyhzdHJpbmcgc3RyKQorICAgICBzdHJpbmcgcHJvY2Vzc19zdHJpbmcoY2xvc3VyZSBjbCkKKworQkVTQ0hSRUlCVU5HOgorICAgICBEdXJjaHN1Y2h0IGRlbiBTdHJpbmcgc3RyIG5hY2ggVm9ya29tbW5pc3NlbiB2b24gU3Vic3RyaW5ncywgZGllICJXZXJ0CisgICAgIGR1cmNoIEZ1bmt0aW9uc2F1ZnJ1ZiB6dSBlcnNldHplbiIgYW5kZXV0ZW4uIERpZSBGb3JtIGlzdDogQEAsIGdlZm9sZ3QKKyAgICAgZHVyY2ggZWluZW4gaW1wbGl6aXRlbiBGdW5rdGlvbnNhdWZydWYuCisKKyAgICAgRGVyIHp1IGVyc2V0emVuZGVuIFN1YnN0cmluZyBoYXQgZGllIEZvcm06CisgICAgIEBAZnVuY3Rpb25bOmZpbGVuYW1lXVt8YXJndW1lbnQxfGFyZ3VtZW50Ml1AQAorCisgICAgIERpZSBlbnRzcHJlY2hlbmRlIEZ1bmt0aW9uIG11c3MgZWluZW4gU3RyaW5nIHp1cnVlY2tnZWJlbiwgb2RlciBkZXIKKyAgICAgcHJvY2Vzc19zdHJpbmcoKSB1ZWJlcmdlYmVuZSBTdHJpbmcgc3RyIHdpcmQgbmljaHQgbW9kaWZpemllcnQuCisKKyAgICAgcHJvY2Vzc19zdHJpbmcoKSBhcmJlaXRldCBuaWNodCByZWt1cnNpdiwgb2JqZWN0X25hbWUgdW5kIGFyZ3VtZW50IHNpbmQKKyAgICAgb3B0aW9uYWxlIFdlcnRlLgorCisgICAgIEZhbGxzIGVpbmUgQ2xvc3VyZSBhbmdlZ2ViZW4gd3VyZGUsIHdpcmQgZGllc2UgbGVkaWdsaWNoIGdlcnVmZW4KKyAgICAgdW5kIG5pY2h0IGdlZmlsdGVydC4KKworQU5NRVJLVU5HRU46CisgICAgIC0gRGllIEZ1bmt0aW9uLCBkaWUgZ2VydWZlbiB3ZXJkZW4gc29sbCwgX211c3NfIG1pdCBlaW5lbSBCdWNoc3RhYmVuCisJCSAgIGFuZmFuZ2VuLCAnXycgaXN0IG5pY2h0IG1vZWdsaWNoIQorICAgICAtIGZvbGdlbmRlcyBQcm9wZXJ0aWVzIHVuZCBEZXRhaWxzIHdlcmRlbiBiZWkgZGVyIEFiZnJhZ2UgdWViZXIKKyAgICAgICBwcm9jZXNzX3N0cmluZygpIGdlZmlsdGVydDoKKyAgICAgICBQX0xPTkcsIFBfU0hPUlQsIFBfUkVBRF9NU0csIEFkZFJlYWREZXRhaWwoKS1EZXRhaWxzIHVuZCBOUEMtQ2hhdHMKKyAgICAgICBQX0lOVF9MT05HIHVlYmVyIGludF9sb25nKCksIFBfSU5UX1NIT1JUIHVlYmVyIGludF9zaG9ydCgpCisgICAgIC0gZGllIE51dHp1bmcga2FubiB6dSBTaWNoZXJoZWl0c3Byb2JsZW1lbiBmdWVocmVuLCBzaWVoZSBhdWNoCisgICAgICAgcHJvY2Vzc19jYWxsKCkKKworQkVJU1BJRUw6CisgICAgIC8vIGtvbXBsZXR0ZSBFcnNldHp1bmcgLi4uCisgICAgIFNldFByb3AoUF9MT05HLCJAQGN1cnJlbnRfbG9uZ0BAIik7CisgICAgIC4uLgorICAgICBzdHJpbmcgY3VycmVudF9sb25nKCkgeworICAgICAgaWYoeCkgcmV0dXJuKGJyZWFrX3N0cmluZygiRGllIEJlc2NocmVpYnVuZy4iKSk7CisgICAgICBlbHNlIHJldHVybihicmVha19zdHJpbmcoIkRpZSBhbmRlcmUgQmVzY2hyZWlidW5nLiIpKTsKKyAgICAgfQorCisgICAgIC0+IGJlaSBBYmZyYWdlOiAiRGllIEJlc2NocmVpYnVuZy4iIG9kZXIgIkRpZSBhbmRlcmUgQmVzY2hyZWlidW5nLiIKKworCisgICAgIC8vIFRlaWxlcnNldHp1bmcKKyAgICAgU2V0UHJvcChQX1NIT1JULCAiRWluIEBAZmFyYmVuZnVufGh1ZWJzY2hAQCBEaW5nIik7CisgICAgIC4uLgorICAgICBzdHJpbmcgZmFyYmVuZnVuKHN0cmluZyBzdHIpIHsKKyAgICAgIHJldHVybihzdHIrIiAiKyJnZWxiZXMiKTsKKyAgICAgfQorCisgICAgIC0+IGJlaSBBYmZyYWdlOiAiRWluIGh1ZWJzY2ggZ2VsYmVzIERpbmcuIgorCitTSUVIRSBBVUNIOgorICAgICBub3RpZnlfZmFpbChFKSwgcHJvY2Vzc19jYWxsKEUpLCByZXBsYWNlX3BlcnNvbmFsKEUpCisKKzIyLiBOb3YuIDIwMDYgQXJhdGhvcm4KZGlmZiAtLWdpdCBhL2RvYy9zZWZ1bi9xdWVyeV9lZGl0aW5nIGIvZG9jL3NlZnVuL3F1ZXJ5X2VkaXRpbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEwYzk4ZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zZWZ1bi9xdWVyeV9lZGl0aW5nCkBAIC0wLDAgKzEsMTMgQEAKK0RFUFJFQ0FURUQKK1NZTk9QU0lTCisgICAgICAgIG1peGVkIHF1ZXJ5X2VkaXRpbmcob2JqZWN0IG9iKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIExpZWZlcnQgMSwgd2VubiA8b2I+IGludGVyYWt0aXYgaXN0IChkYXMgaGVpc3N0LCBlcyBnaWJ0IGVpbmVuIHJlYWxlbgorICAgICAgICBCZW51dHplciBtaXQgZWluZXIgU29ja2V0dmVyYmluZHVuZyB6dW0gTXVkKSB1bmQgZ2VyYWRlIG1pdCBlZCgpIGVpbmUKKyAgICAgICAgRGF0ZWkgYmVhcmJlaXRldC4gV2VubiBlZCgpIG1pdCBlaW5lbSBGdW5rdGlvbnNuYW1lbiBhbHMgendlaXRlcworICAgICAgICBBcmd1bWVudCBhdWZnZXJ1ZmVuIHdpcmQsIHdpcmQgZGFzIE9iamVrdCwgYXVzIGRlbSBlZCgpIGF1ZmdlcnVmZW4KKyAgICAgICAgd3VyZGUsIGdlbGllZmVydCwgc29uc3QgMC4KKworU0lFSEUgQVVDSAorICAgICAgICBlZChFKQpkaWZmIC0tZ2l0IGEvZG9jL3NlZnVuL3F1ZXJ5X2lkbGUgYi9kb2Mvc2VmdW4vcXVlcnlfaWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzBhMGE1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NlZnVuL3F1ZXJ5X2lkbGUKQEAgLTAsMCArMSw4IEBACitTWU5PUFNJUworICAgICAgICBpbnQgcXVlcnlfaWRsZShvYmplY3Qgb2IpOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgR2lidCBhbiwgc2VpdCB3aWUgdmllbGVuIFNla3VuZGVuIGVpbiBQbGF5ZXIgT2JqZWt0IDxvYj4gaWRsZSBpc3QuCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgaW50ZXJhY3RpdmUoRSkKZGlmZiAtLWdpdCBhL2RvYy9zZWZ1bi9xdWVyeV9pbnB1dF9wZW5kaW5nIGIvZG9jL3NlZnVuL3F1ZXJ5X2lucHV0X3BlbmRpbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAzM2NlYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zZWZ1bi9xdWVyeV9pbnB1dF9wZW5kaW5nCkBAIC0wLDAgKzEsMTEgQEAKK0RFUFJFQ0FURUQKK1NZTk9QU0lTCisgICAgICAgIG9iamVjdCBxdWVyeV9pbnB1dF9wZW5kaW5nKG9iamVjdCBvYik7CisKK0JFU0NIUkVJQlVORworICAgICAgICBXZW5uIDxvYj4gaW50ZXJha3RpdiB1bmQgZWluIGlucHV0X3RvKCkgaGFlbmdpZyBpc3QsIHNvIGxpZWZlcnQgZGllCisgICAgICAgIEVmdW4gZGFzIE9iamVrdCB6dXJ1ZWNrLCB3ZWxjaGVzIGRlbiBpbnB1dF90bygpIGF1ZmdlcmZ1ZW4gaGF0LiBJc3QKKyAgICAgICAga2VpbiBpbnB1dF90bygpIGhhZW5naWcsIGxpZWZlcnQgZGllIEZ1bmt0aW9uIDAuCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgaW5wdXRfdG8oRSksIGZpbmRfaW5wdXRfdG8oRSksIGlucHV0X3RvX2luZm8oRSksIHJlbW92ZV9pbnB1dF90byhFKQpkaWZmIC0tZ2l0IGEvZG9jL3NlZnVuL3F1ZXJ5X2lwX25hbWUgYi9kb2Mvc2VmdW4vcXVlcnlfaXBfbmFtZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTYyOThmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NlZnVuL3F1ZXJ5X2lwX25hbWUKQEAgLTAsMCArMSwxMiBAQAorR0VTQ0hVRVRaVAorU1lOT1BTSVMKKyAgICAgICAgc3RyaW5nIHF1ZXJ5X2lwX25hbWUob2JqZWN0IG9iKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIExpZWZlcnQgZGVuIElQLU5hbWVuIGRlcyBVc2VycyA8b2I+IG9kZXIgZGVzIGFrdHVlbGxlbiBCZW51dHplcnMsIHdlbm4KKyAgICAgICAgPG9iPiBuaWNodCBhbmdlZ2ViZW4gd3VyZGUuIERlciBJUC1OYW1lIHdpcmQgZHVyY2ggZGVuIGFzeW5jaHJvbmVuCisgICAgICAgIFByb3plc3MgaG5hbWUgZXJtaXR0ZWx0LiBXZW5uIGRlciBJUC1OYW1lIG5pY2h0IGVybWl0dGVsdCB3ZXJkZW4ga2FubiwKKyAgICAgICAgbGllZmVydCBxdWVyeV9pcF9uYW1lKCkgZGllIElQLU51bW1lciB6dXJ1ZWNrLgorCitTSUVIRSBBVUNICisgICAgICAgIHF1ZXJ5X2lwX251bWJlcihFKQpkaWZmIC0tZ2l0IGEvZG9jL3NlZnVuL3F1ZXJ5X2lwX251bWJlciBiL2RvYy9zZWZ1bi9xdWVyeV9pcF9udW1iZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ2MmFiYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zZWZ1bi9xdWVyeV9pcF9udW1iZXIKQEAgLTAsMCArMSwyNCBAQAorR0VTQ0hVRVRaVAorU1lOT1BTSVMKKyAgICAgICAgc3RyaW5nIHF1ZXJ5X2lwX251bWJlcihvYmplY3Qgb2IpOworICAgICAgICBzdHJpbmcgcXVlcnlfaXBfbnVtYmVyKG1peGVkICYgb2IpOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgTGllZmVydCBkaWUgSVAtTnVtbWVyIGRlcyBCZW51dHplcnMgPG9iPiBvZGVyIGRlcyBha3R1ZWxsZW4gQmVudXR6ZXJzLAorICAgICAgICB3ZW5uIDxvYj4gbmljaHQgYW5nZWdlYmVuIHd1cmRlLgorCisgICAgICAgIFdlbm4gPG9iPiBhbHMgUmVmZXJlbnogYW5nZWdlYmVuIHdpcmQgKGRhbm4gbXVzcyBlcyBlaW4gZ3VlbHRpZ2VzCisgICAgICAgIE9iamVrdCBzZWluKSwgd2lyZCBkaWVzZXMgYmVpIGRlciBBdXNnYWJlIGF1ZiBkaWUgc3RydWN0IHNvY2thZGRyX2luCisgICAgICAgIGdlc2V0enQuIHN0cnVjdCBzb2NrYWRkcl9pbiBpc3QgZWluIEludGVnZXItQXJyYXksIG1pdCBlaW5lbSBJbnRlZ2VyCisgICAgICAgIHBybyBBZHJlc3NieXRlOgorCisgICAgICAgICAgICBvYlswIC4uIDFdIDogc2luX2ZhbWlseQorICAgICAgICAgICAgb2JbMiAuLiAzXSA6IHNpbl9wb3J0CisgICAgICAgICAgICBvYls0IC4uIDddIDogc2luX2FkZHIKKyAgICAgICAgICAgIG9iWzggLi4xNV0gOiBuaWNodCBkZWZpbmllcnQuCisKK0FFTkRFUlVOR0VOCisgICAgICAgIERpZSBSdWVja2dhYmUgdm9uIHN0cnVjdCBzb2NrYWRkcl9pbiB3dXJkZSBpbiAzLjIuMUA4MSBlaW5nZWZ1ZWhydC4KKworU0lFSEUgQVVDSAorICAgICAgICBxdWVyeV9pcF9uYW1lKEUpCmRpZmYgLS1naXQgYS9kb2Mvc2VmdW4vcXVlcnlfbGltaXRzIGIvZG9jL3NlZnVuL3F1ZXJ5X2xpbWl0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTQ1NzdhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NlZnVuL3F1ZXJ5X2xpbWl0cwpAQCAtMCwwICsxLDU2IEBACitERVBSRUNBVEVECitTWU5PUFNJUworICAgICAgICAjaW5jbHVkZSA8c3lzL3J0bGltaXRzLmg+CisKKyAgICAgICAgaW50ICpxdWVyeV9saW1pdHMoKTsKKyAgICAgICAgaW50ICpxdWVyeV9saW1pdHMoaW50IGRlZmF1bHQpOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgTGllZmVydCBlaW4gQXJyYXkgbWl0IGRlbiBtb21lbnRhbiBndWVsdGlnZW4gTGF1ZnplaXQgTGltaXRlbiBiencuCisgICAgICAgIGRpZSBzdGFuZGFyZG1hZXNzaWdlbiBMYXVmemVpdCBMaW1pdGVuLCB3ZW5uIDxkZWZhdWx0PiB3YWhyIGlzdC4KKyAgICAgICAgRGllIEVpbnRyYWVnZSBpbSBnZWxpZWZlcnRlbiBBcnJheSBiZWRldXRlbjoKKworICAgICAgICBpbnRbTElNSVRfRVZBTF06ICAgICAgICBkaWUgbWF4aW1hbGVuIEV2YWwgS29zdGVuCisgICAgICAgIGludFtMSU1JVF9BUlJBWV06ICAgICAgIGRpZSBtYXhpbWFsZSBBbnphaGwgQXJyYXkgRWludHJhZWdlCisgICAgICAgIGludFtMSU1JVF9NQVBQSU5HXTogICAgIGRpZSBtYXhpbWFsZSBBbnphaGwgTWFwcGluZyBFaW50cmFlZ2UKKyAgICAgICAgaW50W0xJTUlUX0JZVEVdOiAgICAgICAgZGllIG1heGltYWxlIEFuemFobCBCeXRlcywgZGllIG1pdCByZWFkX2J5dGVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL3dyaXRlX2J5dGVzKCkgYmVhcmJlaXRldCB3ZXJkZW4ga29lbm5lbgorICAgICAgICBpbnRbTElNSVRfRklMRV06ICAgICAgICBkaWUgbWF4aW1hbGUgQW56YWhsIEJ5dGVzLCBkaWUgbWl0IHJlYWRfZmlsZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC93cml0ZV9maWxlKCkgYmVhcmJlaXRldCB3ZXJkZW4ga29lbm5lbgorICAgICAgICBpbnRbTElNSVRfQ0FMTE9VVFNdOiAgICBkaWUgbWF4aW1hbGUgQW56YWhsIGdsZWljaHplaXRpZ2VyIGNhbGxfb3V0KClzCisgICAgICAgIGludFtMSU1JVF9DT1NUXTogICAgICAgIHdpZSBkaWUgYWt0dWVsbGVuIEtvc3RlbiBlaW56dXJlY2huZW4gc2luZAorCisgICAgICAgIEF1c3NlciBmdWVyIExJTUlUX0NPU1QgZWluIExpbWl0IHZvbiAnMCcgKGF1Y2ggTElNSVRfVU5MSU1JVEVEKQorICAgICAgICBiZWRldXRldCAna2VpbmUgTGltaXQnLgorCisgICAgICAgIExJTUlUX0NPU1QgaGF0IGRpZXNlIEJlZGV1dHVuZ2VuOgorICAgICAgICAgIAorICAgICAgICAgIHdlcnQgPiAwOiBNYXhpbWFsIDx3ZXJ0PiBmdWVyIGFscyBLb3N0ZW4gZnVlciBkaWUgYWt0dWVsbGUgQXVzZnVlaHJ1bmcKKyAgICAgICAgICAgICAgICAgICAgdmVyd2VuZGV0LCB1bmdlYWNodGV0IHdpZSBsYW5nZSBzaWUgdGF0c2FlY2hsaWNoIGRhdWVydC4KKyAgICAgICAgICAgICAgID0gMDogaXN0IGRpZSBkZXJ6ZWl0ZSBMSU1JVF9FVkFMIGdyb2Vzc2VyIGFscyBkaWUgdm9yaGVyaWdlCisgICAgICAgICAgICAgICAgICAgIExJTUlUX0VWQUwsIGtvc3RldCBkaWUgYWt0dWVsbGUgQXVzZnVlaHJ1bmcgbnVyIDEwCisgICAgICAgICAgICAgICAgICAgIFRpY2tzOyBhbmRlcm5mYWxscyB3ZXJkZW4gZGllIGdlc2FtdGVuIEtvc3RlbiBhbmdlcmVjaG5ldC4KKyAgICAgICAgICAgICAgICA8IDA6ICgtd2VydCklIGRlciBha3R1ZWxsZW4gQXVzZnVlaHJ1bmdza29zdGVuIHdlcmRlbgorICAgICAgICAgICAgICAgICAgICAgYW5nZXJlY2huZXQuCisKK0JFTUVSS1VOR0VOOgorICAgICAgICAiQWt0dWVsbGUgS29zdGVuIiBiZWkgTElNSVRfQ09TVCBoYXQgaW0gRmFsbGUgZGVyIEJlbnV0enVuZyB2b24KKyAgICAgICAgbGltaXRlZCgpIGRpZSBCZWRldXR1bmcgdm9uICJpbSBsaW1pdGVkIHZlcmJyYXVjaHRlIEtvc3RlbiIsIHN0ZXVlcnQKKyAgICAgICAgYWxzbywgd2lldmllbCBkZXIgaW0gRHVyY2hsYXVmZW4gZGVyIEZ1bmt0aW9uIGltIGxpbWl0ZWQoKQorICAgICAgICB2ZXJicmF1Y2h0ZW4gVGlja3MgbWl0IGRlbSBFbmRlIHZvbiBsaW1pdGVkKCkgYW5nZXpvZ2VuIHdpcmQuCisKK0JFSVNQSUVMRQorICAgICAgICBxdWVyeV9saW1pdHMoKQorICAgICAgICAtLT4gbGllZmVydCBkaWUgbW9tZW50YW4gZ3VlbHRpZ2VuIExhdWZ6ZWl0IExpbWl0ZW4uCisgICAgICAgIHF1ZXJ5X2xpbWl0cygxKQorICAgICAgICAtLT4gbGllZmVydCBkaWUgc3RhbmRhcmRtYWVzc2lnZW4gTGF1ZnplaXQgTGltaXRlbi4KKworQUVOREVSVU5HRU4KKyAgICAgICAgRWluZ2VmdWVocnQgaW4gTERNdWQgMy4yLjcuCisgICAgICAgIExJTUlUX0NBTExPVVRTIHd1cmRlIGluIExETXVkIDMuMi45IGVpbmdlZnVlaHJ0LgorCitTSUVIRSBBVUNICisgICAgICAgIGxpbWl0ZWQoRSksIHNldF9saW1pdHMoRSkKKworMTYuMDUuMjAwNywgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2Mvc2VmdW4vcXVlcnlfbXVkX3BvcnQgYi9kb2Mvc2VmdW4vcXVlcnlfbXVkX3BvcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU1YzZkMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zZWZ1bi9xdWVyeV9tdWRfcG9ydApAQCAtMCwwICsxLDIzIEBACitERVBSRUNBVEVECitTWU5PUFNJUworICAgICAgICBpbnQgcXVlcnlfbXVkX3BvcnQodm9pZCkKKyAgICAgICAgaW50IHF1ZXJ5X211ZF9wb3J0KG9iamVjdCB1c2VyKQorICAgICAgICBpbnQgcXVlcnlfbXVkX3BvcnQoaW50IG51bSkKKworREVTQ1JJUFRJT04KKyAgICAgICAgUmV0dXJucyB0aGUgcG9ydCBudW1iZXIgdGhlIHBhcnNlciB1c2VzIGZvciB1c2VyIGNvbm5lY3Rpb25zLgorCisgICAgICAgIElmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLCB0aGUgcG9ydCBmb3IgdGhpc19wbGF5ZXIoKSBpcworICAgICAgICByZXR1cm5lZC4gSWYgdGhpc19wbGF5ZXIoKSBpcyBub3QgZXhpc3Rpbmcgb3Igbm90IGludGVyYWN0aXZlLAorICAgICAgICB0aGUgZmlyc3QgcG9ydCBudW1iZXIgb3BlbiBmb3IgY29ubmVjdGlvbnMgaXMgcmV0dXJuZWQuCisKKyAgICAgICAgSWYgYW4gdXNlciBvYmplY3QgaXMgZ2l2ZW4sIHRoZSBwb3J0IHVzZWQgZm9yIGl0cyBjb25uZWN0aW9uCisgICAgICAgIGlzIHJldHVybmVkLgorICAgICAgICBJZiBhIHBvc2l0aXZlIG51bWJlciBpcyBnaXZlbiwgdGhlIDxudW0+dGggcG9ydCBudW1iZXIgdGhlCisgICAgICAgIHBhcnNlciB1c2VzIGZvciBjb25uZWN0aW9ucyBpcyByZXR1cm5lZCAoZ2l2ZW4gdGhhdCB0aGVyZSBhcmUKKyAgICAgICAgdGhhdCBtYW55IHBvcnRzKS4KKyAgICAgICAgSWYgLTEgaXMgZ2l2ZW4sIHRoZSBudW1iZXIgb2YgcG9ydHMgb3BlbiBmb3IgY29ubmVjdGlvbnMgaXMKKyAgICAgICAgcmV0dXJuZWQuCisKK1NFRSBBTFNPCisgICAgICAgIHF1ZXJ5X3VkcF9wb3J0KEUpCmRpZmYgLS1naXQgYS9kb2Mvc2VmdW4vcXVlcnlfbmV4dF9yZXNldCBiL2RvYy9zZWZ1bi9xdWVyeV9uZXh0X3Jlc2V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYmJkN2UKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2VmdW4vcXVlcnlfbmV4dF9yZXNldApAQCAtMCwwICsxLDI3IEBACitzaW11bF9lZnVuOjpxdWVyeV9uZXh0X3Jlc2V0KEUpCitGVU5LVElPTjoKKyAgICAgdmFyYXJncyBpbnQgcXVlcnlfbmV4dF9yZXNldChvYmplY3Qgb2IpCisKK0FSR1VNRU5URToKKyAgICAgb2IgLSBkYXMgaW50ZXJlc3NpZXJlbmRlIE9iamVrdDsgd2VubiBuaWNodCBhbmdlZ2ViZW4sIHdpcmQgCisgICAgICAgICAgdGhpc19vYmplY3QoKSB2ZXJ3ZW5kZXQKKworQkVTQ0hSRUlCVU5HOgorICAgICBEaWVzZSBzZWZ1biBnaWJ0IGRlbiBaZWl0cHVua3QgZGVzIG5hZWNoc3RlbiBSZXNldHMgZGVzIE9iamVrdGVzIG9iIAorICAgICB6dXJ1ZWNrLiBEaWUgQW5nYWJlIGVyZm9sZ3QgaW4gU2VrdW5kZW4sIGRpZSBzZWl0IGRlbSAwMS4gSmFudWFyIDE5NzAgCisgICAgIDAwOjAwOjAwIEdNVCB2ZXJzdHJpY2hlbiBzaW5kLCBhbmFsb2cgenUgdGltZSgpLgorCisgICAgIEluIGRlciBSZWdlbCBlcmZvbGd0IGRlciBSZXNldCBpbSBuYWVjaHN0ZW4gQmFja2VuZC1aeWtsdXMgbmFjaCBkZW0gCisgICAgIEZhZWxsaWdrZWl0c3plaXRwdW5rdCwgIGQuaC4gbW9tZW50YW4gaW4gZGVuIG5hY2hmb2xnZW5kZW4gMnMuCisgICAgIEFsbGVyZGluZ3Mga2FubiBkaWVzIGF1Y2ggbWFsIG5lbiBaeWtsdXMgbGFlbmdlciBkYXVlcm4gKDRzKSwgd2VubiBkZXIKKyAgICAgRHJpdmVyIHZpZWwgenUgdHVuIGhhdC4KKworQkVNRVJLVU5HRU46CisgICAgIERpZXNlIHNlZnVuIGlzdCBvYmplY3RfaW5mbygpLUFiZnJhZ2VuIHZvcnp1emllaGVuLCBkYSBkaWUgUGFyYW1ldGVyIHVuZAorICAgICBSdWVja2dhYmV3ZXJ0ZSB2b24gb2JqZWN0X2luZm8oKSBiZWkgdmVyc2NoaWVkZW5lbiBHYW1lZHJpdmVydmVyc2lvbmVuCisgICAgIHZhcmlpZXJlbiBrb2VubmVuLgorCitTSUVIRSBBVUNIOgorICAgICBjYWxsX291dChFKSwgb2JqZWN0X2luZm8oRSksIHJlc2V0KEwpLCBzZXRfbmV4dF9yZXNldChFKSwgdGltZShFKQorCisyOC4wNy4yMDE0IEFyYXRob3JuCmRpZmYgLS1naXQgYS9kb2Mvc2VmdW4vcXVlcnlfb25jZV9pbnRlcmFjdGl2ZSBiL2RvYy9zZWZ1bi9xdWVyeV9vbmNlX2ludGVyYWN0aXZlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3OTQyMjMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2VmdW4vcXVlcnlfb25jZV9pbnRlcmFjdGl2ZQpAQCAtMCwwICsxLDggQEAKK1NZTk9QU0lTCisgICAgICAgIGludCBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iamVjdCBvYmopOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgV2Fociwgd2VubiA8b2JqPiBpbnRlcmFrdGl2IGlzdCBvZGVyIGRpZXMgZWlubWFsIHdhci4KKworU0lFSEUgQVVDSAorICAgICAgICByZW1vdmVfaW50ZXJhY3RpdmUoRSkKZGlmZiAtLWdpdCBhL2RvYy9zZWZ1bi9xdWVyeV9zaGFkb3dpbmcgYi9kb2Mvc2VmdW4vcXVlcnlfc2hhZG93aW5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZTVkNmEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2VmdW4vcXVlcnlfc2hhZG93aW5nCkBAIC0wLDAgKzEsMTggQEAKK0RFUFJFQ0FURUQKK3F1ZXJ5X3NoYWRvd2luZyhFKQorRlVOS1RJT046CisgICAgIG9iamVjdCBxdWVyeV9zaGFkb3dpbmcob2JqZWN0IG9iaikKKworQkVTQ0hSRUlCVU5HOgorICAgICBEaWUgRnVua3Rpb24gZ2lidCBkYXMgZGVyemVpdCB2b20gT2JqZWt0IDxvYmo+IGJlc2NoYXR0ZXRlIE9iamVrdAorICAgICB2aWN0aW0gb2RlciAwIHp1cnVlY2suCisKK0JFSVNQSUVMRToKKyAgICAgLy8gQiBiZXNjaGF0dGV0IEEKKyAgICAgcXVlcnlfc2hhZG93aW5nKGZpbmRfb2JqZWN0KEIpKSA9PSBBCisKK1NJRUhFIEFVQ0g6CisgICAgIEdlbmVyZWxsOgkgICAgIHNoYWRvdyhFKSwgdW5zaGFkb3coRSkKKyAgICAgUmVjaHRlOgkgICAgIHF1ZXJ5X2FsbG93X3NoYWRvdyhNKSwgcXVlcnlfcHJldmVudF9zaGFkb3coTCkKKworMjMuMDIuMjAxNiwgWmVzc3RyYQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9zZWZ1bi9xdWVyeV9zbm9vcCBiL2RvYy9zZWZ1bi9xdWVyeV9zbm9vcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGE4ODM4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NlZnVuL3F1ZXJ5X3Nub29wCkBAIC0wLDAgKzEsMTAgQEAKK0RFUFJFQ0FURUQKK1NZTk9QU0lTCisgICAgICAgIG9iamVjdCBxdWVyeV9zbm9vcChvYmplY3QgdmljdGltKQorCitERVNDUklQVElPTgorICAgICAgICBSZXR1cm5zIHRoZSB1c2VyIHdobyBjdXJyZW50bHkgc25vb3BzIHZpY3RpbS4gVGhlIGNhbGxpbmcKKyAgICAgICAgb2JqZWN0IG11c3QgYmUgcHJpdmlsZWdlZCBieSB0aGUgbWFzdGVyIG9iamVjdC4KKworU0VFIEFMU08KKyAgICAgICAgc25vb3AoRSkKZGlmZiAtLWdpdCBhL2RvYy9zZWZ1bi9xdWVyeV93aXpfZ3JwIGIvZG9jL3NlZnVuL3F1ZXJ5X3dpel9ncnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ1Y2ZlMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zZWZ1bi9xdWVyeV93aXpfZ3JwCkBAIC0wLDAgKzEsMTUgQEAKK0ZVTktUSU9OOgorICAgICAgICBxdWVyeV93aXpfZ3JwKHN0cmluZyB3aXopCisgICAgICAgIHF1ZXJ5X3dpel9ncnAob2JqZWN0IHdpeikKKworQVJHVU1FTlRFOgorICAgICAgICB3aXogLSBTcGllbGVyLCBkZXNzZW4gTWFnaWVybGV2ZWxncnVwcGUgZXJtaXR0ZWx0IHdlcmRlbiBzb2xsCisKK0JFU0NIUkVJQlVORzoKKyAgICAgICAgRGllc2UgRnVua3Rpb24gZXJtaXR0ZWx0IGRpZSBNYWdpZXJncnVwcGUsIGRlciBkZXIgU3BpZWxlciB3aXogYW5nZWhvZXJ0LgorCitSVUVDS0dBQkVXRVJUOgorICAgICAgICBEaWUgTWFnaWVybGV2ZWxncnVwcGUgZGVzIFNwaWVsZXJzLgorCitTSUVIRSBBVUNIOgorICAgICAgICAvc2VjdXJlL3dpemxldmVscy5oCmRpZmYgLS1naXQgYS9kb2Mvc2VmdW4vcXVlcnlfd2l6X2xldmVsIGIvZG9jL3NlZnVuL3F1ZXJ5X3dpel9sZXZlbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2U4OWNiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NlZnVuL3F1ZXJ5X3dpel9sZXZlbApAQCAtMCwwICsxLDQzIEBACitGVU5LVElPTjoKKwlpbnQgcXVlcnlfd2l6X2xldmVsKG9iamVjdCBvYikKKwlpbnQgcXVlcnlfd2l6X2xldmVsKHN0cmluZyBvYikKKworQVJHVU1FTlRFOgorCW9iIC0gRGVyIFNwaWVsZXIvZGFzIE9iamVrdCwgZGVzc2VuIE1hZ2llcmxldmVsIGVybWl0dGVsdCB3ZXJkZW4gc29sbC4KKyAgICAgICBFcyBrYW5uIGF1Y2ggZWluZSBVSUQgKHouQi4gInplc3N0cmEiLCAiZC5pbnNlbG4uemVzc3RyYSIpIGFscyBTdHJpbmcKKyAgICAgICB1ZWJlcmdlYmVuIHdlcmRlbi4KKworQkVTQ0hSRUlCVU5HOgorCXF1ZXJ5X3dpel9sZXZlbCgpIGxpZWZlcnQgZGVuIE1hZ2llcmxldmVsIGRlcyBPYmpla3RzIG9iIHp1cnVlY2suCisJTm9ybWFsZSBTcGllbGVyIGhhYmVuIGVpbmVuIE1hZ2llcmxldmVsIHZvbiAwLCBTZWhlciBub3JtYWxlcndlaXNlCisgIGVpbmVuIHZvbiAxIChhdWYgamVkZW4gRmFsbCA8IDEwKS4KKyAgT2JqZWt0ZSBiZWtvbW1lbiBmb2xnZW5kZSBMZXZlbDoKKyAgL2QvICAgICAgICAgICAtIDI1CisgIC9wLyAgICAgICAgICAgLSAyMQorICAvb2JqLyAgICAgICAgIC0gMAorICAvc3RkLyAgICAgICAgIC0gMAorICAvZ2lsZGVuLyAgICAgIC0gMzAKKyAgL3NwZWxsYm9va3MvICAtIDMwCisgIC9wbGF5ZXJzLyAgICAgLSBlbnRzcHJlY2hlbmQgTWFnaWVyLCAyMCAtIDExMQorICAvc2VjdXJlLyAgICAgIC0gMTAwCisKK1JVRUNLR0FCRVdFUlQ6CisJRGVyIE1hZ2llcmxldmVsIGRlcyBTcGllbGVycy9PYmpla3RzLgorCitCRU1FUktVTkdFTjoKKwlXaXJkIGFscyBQYXJhbWV0ZXIgZWluIFN0cmluZyBtaXQgZWluZW0gU3BpZWxlcm5hbWVuIHVlYmVyZ2ViZW4sIHNvIAorCWthbm4gYXVjaCBkZXIgTWFnaWVybGV2ZWwgZWluZXMgbmljaHQgZWluZ2Vsb2dndGVuIFNwaWVsZXJzIGhlcmF1cy0KKwlnZWZ1bmRlbiB3ZXJkZW4uCisKK0JFSVNQSUVMRToKKwlsdiA9IHF1ZXJ5X3dpel9sZXZlbChmaW5kX3BsYXllcigiam9mIikpCisJICAgPT4gbHYgPSAxMTEsIGZhbGxzIEpvZiBlaW5nZWxvZ2d0IGlzdC4KKwlsdiA9IHF1ZXJ5X3dpel9sZXZlbCgiam9mIikKKyAgICAgICAgICAgPT4gbHYgPSAxMTEgaW4gamVkZW0gRmFsbC4KKworU0lFSEUgQVVDSDoKKwkvc2VjdXJlL3dpemxldmVscy5oCisKK0xFVFpURSBBZU5ERVJVTkc6CisxNS4xMC4yMDA3LCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9zZWZ1bi9yZXBsYWNlX3BlcnNvbmFsIGIvZG9jL3NlZnVuL3JlcGxhY2VfcGVyc29uYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmExOGRjNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zZWZ1bi9yZXBsYWNlX3BlcnNvbmFsCkBAIC0wLDAgKzEsODQgQEAKK0ZVTktUSU9OOgorICAgICB2YXJhcmdzIHN0cmluZyByZXBsYWNlX3BlcnNvbmFsKHN0cmluZyBzdHIsIG1peGVkICpvYnMgWywgaW50IGNhcHNdKTsKKworREVGSU5JRVJUIElOOgorICAgICAvc2VjdXJlL3NpbXVsX2VmdW4uYworCitBUkdVTUVOVEU6CisgICAgIHN0ciAgICAtIHp1IGJlYXJiZWl0ZW5kZXIgU3RyaW5nCisgICAgIG9icyAgICAtIExpc3RlIHZvbiBPYmpla3QxLCBPYmpla3QyLCAuLi4sIE9iamVrdDkKKyAgICAgICAgICAgICAgKE9iamVrdGUgb2RlciBTdHJpbmdzKQorICAgICBjYXBzICAgLSAxIGZ1ZXIgR3Jvc3NzY2hyZWlidW5nIGRlcyBFcnNldHp0ZW4gbmFjaCBTYXR6ZW5kZW4gKC4sPywhLCIpCisgICAgICAgICAgICAgIDAgc29uc3QKKworQkVTQ0hSRUlCVU5HOgorICAgICBFcnNldHp0IGluIFN0cmluZ3MKKyAgICAgQFdFUngsIEBXRVNTRU54LCBAV0VNeCwgQFdFTnggZHVyY2gKKyAgICAgICAgT2JqZWN0eC0+bmFtZSg8Y2FzdXM+LCAxKTsKKyAgICAgQFdFUlV4LCBAV0VTU0VOVXgsIEBXRU1VeCwgQFdFTlV4IGR1cmNoCisgICAgICAgIE9iamVjdHgtPm5hbWUoPGNhc3VzPik7CisgICAgIEBXRVJRUHgsIEBXRVNTRU5RUHgsIEBXRU1RUHgsIEBXRU5RUHggZHVyY2gKKyAgICAgICAgT2JqZWN0eC0+UXVlcnlQcm9ub3VuKDxjYXN1cz4pOworICAgICBAV0VSUUF4LCBAV0VTU0VOUUF4LCBAV0VNUUF4LCBAV0VOUUF4IGR1cmNoCisgICAgICAgIE9iamVjdHgtPlF1ZXJ5QXJ0aWNsZSg8Y2FzdXM+LCAxLCAxKTsKKyAgICAgQFdFUlFQUEdOeCwgQFdFU1NFTlFQUEdOeCwgQFdFTVFQUEdOeCwgQFdFTlFQUEdOeCBkdXJjaAorICAgICAgICBPYmplY3R4LT5RdWVyeVBvc3NQcm9ub3VuKDxnZW5kZXI+LCA8Y2FzdXM+LCA8bnVtYmVyPik7CisgICAgIG9kZXIgZGVuIGVudHNwcmVjaGVuZGVuIFN0cmluZyBiZWkgIk9iamVrdHgiLiAgICAgICAgICAgIAorCitCRU1FUktVTkdFTjoKKyAgICAgeCBzdGVodCBmdWVyIGRpZSBQb3NpdGlvbiBkZXMgT2JqZWt0cy9TdHJpbmdzIGluICpvYnMsIGJlZ2lubmVuZCBiZWkgMS4KKyAgICAgCisgICAgIEJlc29uZGVyaGVpdGVuIGJlaW0gUG9zc2Vzc2l2cHJvbm9tZW4gKEBXRVJRUFBHTngpOgorICAgICBHIG11c3MgZHVyY2ggZGFzIEdlc2NobGVjaHQgKE0sIEYgb2RlciBOKSB1bmQgTiBkdXJjaCBkZW4gTnVtZXJ1cyAoUyAKKyAgICAgb2RlciBQKSBlcnNldHp0IHdlcmRlbi4gCisgICAgIEFsbGUgQW5nYWJlbiwgYXVjaCBkZXIgQ0FTVVMsIGJlemllaGVuIHNpY2ggZGFiZWkgYXVmIGRhcyBPYmpla3QsIHdlbGNoZXMKKyAgICAgYmVzZXNzZW4gd2lyZCwgbmljaHQgYXVmIGRlbiBCZXNpdHplciEgRGllc2VyIGlzdCBiZXJlaXRzIGR1cmNoIHggCisgICAgIGJlc3RpbW10LgorICAgICAKK1JVZUNLR0FCRVdFUlQ6CisgICAgIGR1cmNoZXJzZXR6dGVyIFN0cmluZyAKKyAgICAgCitCZWlzcGllbGU6CisKKyAgICAgcmVwbGFjZV9wZXJzb25hbCgiQFdFUjEiLCAoe2ZpbmRfcGxheWVyKCJnbG9pbnNvbiIpfSkpCisgICAgID09ICJHbG9pbnNvbiIKKyAgICAgCisgICAgIHJlcGxhY2VfcGVyc29uYWwoIkBXRU1RUDEiLCAoe2ZpbmRfcGxheWVyKCJnbG9pbnNvbiIpfSkpCisgICAgID09ICJpaG0iICAgICAKKyAgICAgCisgICAgIC8vIHVuYmVzdGltbXRlciB1bmQgYmVzdGltbXRlciBBcnRpa2VsOgorICAgICByZXBsYWNlX3BlcnNvbmFsKCJAV0VSMSB6dWVja3QgQFdFTlUyIHVuZCB2ZXJoYXV0IEBXRU4zLiIsIAorICAgICAgICAgICAgICAgICAgICAgICh7ZmluZF9wbGF5ZXIoImdsb2luc29uIiksCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5kX29iamVjdCgiL29iai9tcGEiKSwgCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5kX29iamVjdCgiL29iai93YW5kZXJlciIpfSkpCisgICAgID09ICJHbG9pbnNvbiB6dWVja3QgZWluZSBaZWl0dW5nIHVuZCB2ZXJoYXV0IGRlbiBXYW5kZXJlci4iCisgICAgIAorICAgICAvLyBCZWltIFBvc3Nlc3NpdnByb25vbWVuIGJlemllaGVuIHNpY2ggV0VOLCBGIHVuZCBQIChBa2t1c2F0aXYsCisgICAgIC8vIEZlbWluaW51bSwgUGx1cmFsKSBhdWYgZGllIFRhc2NoZW4sIG5pY2h0IGF1ZiBLZXNzYToKKyAgICAgcmVwbGFjZV9wZXJzb25hbCgiQFdFUjEgc3RlY2t0IEBXRVNTRU4yIFR1cm5zY2h1aGUgaW4gQFdFTlFQUEZQMSAiCisgICAgICAgICAgICAgICAgICAgICAgIlRhc2NoZW4uIiwgCisgICAgICAgICAgICAgICAgICAgICAgKHtmaW5kX3BsYXllcigia2Vzc2EiKSwgCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5kX3BsYXllcigiZ2xvaW5zb24iKX0pKQorICAgICA9PSAiS2Vzc2Egc3RlY2t0IEdsb2luc29ucyBUdXJuc2NodWhlIGluIGlocmUgVGFzY2hlbi4iCisKKyAgICAgLy8gRWluIEJlaXNwaWVsIG1pdCBsYWVuZ2VyZW0gKm9iczoKKyAgICAgcmVwbGFjZV9wZXJzb25hbCgiQFdFUjEgemllaHQgQFdFTlFQUE1QMSBuZXVlbiBUdXJuc2NodWhlIGFuLiBAV0VSMiBpc3QgIgorICAgICAgICAgICAgICAgICAgICAgICJzbyBiZWVpbmRydWNrdCwgZGFzcyBAV0VSUVAyIEBXRU1RUDEgQFdFTlUzIGF1ZiBkaWUgIgorICAgICAgICAgICAgICAgICAgICAgICJAV0VONCBoYXV0IHVuZCBkaWUgU2NodWhlIGluIEBXRU1RUFBGUzIgVGFzY2hlICIKKyAgICAgICAgICAgICAgICAgICAgICAidmVyc2Nod2luZGVuIGxhZXNzdC4gQFdFUlU1IHNjaGF1dCB6dSB1bmQga2ljaGVydCAiCisgICAgICAgICAgICAgICAgICAgICAgImlycmUuIFdlbm4gZGFzIEBXRVI2IGdlc2VoZW4gaGFldHRlISIsCisgICAgICAgICAgICAgICAgICAgICAgKHtmaW5kX3BsYXllcigiZ2xvaW5zb24iKSwgCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5kX3BsYXllcigia2Vzc2EiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRfb2JqZWN0KCIvb2JqL21wYSIpLCAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgIkJpcm5lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRfb2JqZWN0KCIvb2JqL3dhbmRlcmVyIiksCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5kX25ldGRlYWQoImpvZiIpfSksMSkKKyAgICAgPT0gIkdsb2luc29uIHppZWh0IHNlaW5lIG5ldWVuIFR1cm5zY2h1aGUgYW4uIEtlc3NhIGlzdCBzbyBiZWVpbmRydWNrdCwgIgorICAgICAgICAiZGFzcyBzaWUgaWhtIGVpbmUgWmVpdHVuZyBhdWYgZGllIEJpcm5lIGhhdXQgdW5kIGRpZSBTY2h1aGUgaW4gaWhyZXIgIgorICAgICAgICAiVGFzY2hlIHZlcnNjaHdpbmRlbiBsYWVzc3QuIEVpbiBXYW5kZXJlciBzY2hhdXQgenUgdW5kIGtpY2hlcnQgIgorICAgICAgICAiaXJyZS4gV2VubiBkYXMgSm9mIGdlc2VoZW4gaGFldHRlISIKKworU0lFSEUgQVVDSDoKKyAgICAgQWRkQ21kKEwpCisKKzA1LiBTZXB0ZW1iZXIgMjAxNSwgQXJhdGhvcm4KZGlmZiAtLWdpdCBhL2RvYy9zZWZ1bi9zYXZlX29iamVjdCBiL2RvYy9zZWZ1bi9zYXZlX29iamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTc0M2IxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NlZnVuL3NhdmVfb2JqZWN0CkBAIC0wLDAgKzEsMTkgQEAKK1NZTk9QU0lTCisgICAgICAgIG1peGVkIHNhdmVfb2JqZWN0KHN0cmluZyBuYW1lKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIERpZXNlIFNpbXVsLUVmdW4gdW50ZXJzY2hlaWRldCBzaWNoIGluIGVpbmlnZW4gRGV0YWlscyB2b24gZGVyCisgICAgICAgIERyaXZlci1FZnVuIHNhdmVfb2JqZWN0KCkgKHMuIGF1Y2ggZG9ydCEgV2ljaHRpZyEpLgorICAgICAgICAxLiBkaWVzZSBzZWZ1biBzcGVpY2hlcnQgYXVjaCBkaWUgbWl0IEZfU0FWRSBtYXJraWVydGVuIFByb3BlcnRpZXMKKyAgICAgICAgZWluZXMgT2JqZWt0ZXMgYWIgKHdhcyBkaWUgZWZ1biBkZXMgRHJpdmVyIG5pY2h0IHR1dCEpLgorICAgICAgICAyLiBkYXMgRm9ybWF0LCBpbiBkZW0gZ2VzcGVpY2hlcnQgd2lyZCwga2FubiBiZWkgZGVyIHNlZnVuIG5pY2h0CisgICAgICAgIGF1c2dld2FlaGx0IHdlcmRlbiAoaXN0IGFiZXIgYXVjaCBuaWNodCBub2V0aWchKSwgc29uZGVybiBlaW4KKyAgICAgICAgbXVkbGliLXdlaXRlciBTdGFuZGFyZCB3aXJkIGJlbnV0enQuCisgICAgICAgIDMuIHdpbGwgbWFuIG5pY2h0IGluIGVpbmVtIEZpbGUgc3BlaWNoZXJuLCBzb25kZXJuIGRhcywgd2FzIGltIEZpbGUKKyAgICAgICAgc3RlaGVuIHd1cmRlLCBhbHMgU3RyaW5nIHp1cnVlY2toYWJlbiwgbXVzcyBtYW4gMCBhbHMgJ25hbWUnCisgICAgICAgIHVlYmVyZ2ViZW4uCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgc2F2ZV9vYmplY3QoRSksIHJlc3RvcmVfb2JqZWN0KEUpLCBzYXZlX3ZhbHVlKEUpCiswMy4wOC4yMDA3LCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9zZWZ1bi9zZW5kX3Jvb20gYi9kb2Mvc2VmdW4vc2VuZF9yb29tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YjA1ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2VmdW4vc2VuZF9yb29tCkBAIC0wLDAgKzEsMzAgQEAKK0ZVTktUSU9OOgordmFyYXJncyB2b2lkIHNlbmRfcm9vbShvYmplY3R8c3RyaW5nIHJvb20sIHN0cmluZyBtc2csIGludCBtc2dfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1zZ19hY3Rpb24sIHN0cmluZyBtc2dfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgKmV4Y2x1ZGUsIG9iamVjdCBvcmlnaW4pCisKK0JFU0NIUkVJQlVORzoKKyAgICAgICAgU2VuZGV0IG1zZyBhbiBhbGxlIE9iamVrdGUgaW4gcm9vbSBkdXJjaCBBdWZydWYgdm9uIFJlY2VpdmVNc2coKSBtaXQKKyAgICAgICAgZGVuIHVlYmVyZ2ViZW5lbiBBcmd1bWVudGVuLgorICAgICAgICBadXIgQmVkZXV0dW5nIGRlciBBcmd1bWVudGUgc2llaGUgTWFucGFnZSB2b24gUmVjZWl2ZU1zZygpLgorCisgICAgICAgIFdlbm4gZGFzIFJhdW1vYmpla3QgbWl0IHNlaW5lbSBOYW1lbiBhbmdlZ2ViZW4gaXN0LCB3aXJkIGRhcyBPYmpla3QKKyAgICAgICAgdW50ZXIgZGllc2VtIE5hbWVuIGdlc3VjaHQgdW5kIHVuZCBnZWxhZGVuLCBmYWxscyBub3R3ZW5kaWcuCisKKyAgICAgICAgTWl0IGRlbSBBcnJheSA8KmV4Y2x1ZGU+IGthbm4gbWFuIHZlcmhpbmRlcm4sIGRhc3MgZGllIE5hY2hyaWNodCBhbgorICAgICAgICBkaWUgZGFyaW4gZW50aGFsdGVuZW4gT2JqZWt0ZSBnZXNlbmRldCB3aXJkLgorICAgICAgICBEYXMgaXN0IHNpbm52b2xsLCB3ZW5uIHpCIGVpbiBTcGllbGVyIEF1c2xvZXNlciBlaW5lciBNZWxkdW5nIGlzdAorICAgICAgICB1bmQgZGllc2Ugc2VsYnN0IG5pY2h0IGVyaGFsdGVuIHNvbGwuCisKKyAgICAgICAgb3JpZ2luIGdpYnQgYW4sIHdlbGNoZXMgT2JqZWt0IGRpZSBNZWxkdW5nIGF1c2xvZXN0IChtdXNzIG5pY2h0IGRhcworICAgICAgICBzZW5kZW5kZSBPYmpla3Qgc2VsYmVyKSB1bmQgd2lyZCB2b3IgYWxsZW0gZnVlciBkaWUgSWdub3JpZXJlcHJ1ZWZ1bmcKKyAgICAgICAgdmVyd2VuZGV0LiBEZWZhdWx0IGlzdCBkYXMgc2VuZGVuZGUgT2JqZWt0LgorCisgICAgICAgIExldHp0ZW5kbGljaCBpc3QgZGllIHNlZnVuIHZlcmdsZWljaGJhciB6dSB0ZWxsX3Jvb20oKS4KKworU0lFSEUgQVVDSAorICAgICAgICBSZWNlaXZlTXNnKEwpCisgICAgICAgIHRlbGxfb2JqZWN0KEUpLCB0ZWxsX3Jvb20oRSksIHNheShFKSwgd3JpdGUoRSkKKworMTMuMDMuMjAxNiwgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2Mvc2VmdW4vc2V0X2hlYXJ0X2JlYXQgYi9kb2Mvc2VmdW4vc2V0X2hlYXJ0X2JlYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM3NzU5ZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zZWZ1bi9zZXRfaGVhcnRfYmVhdApAQCAtMCwwICsxLDIzIEBACitTWU5PUFNJUworICAgICAgICBpbnQgc2V0X2hlYXJ0X2JlYXQoaW50IGZsYWcpOworCitCRVNDSFJFSUJVTkcKKyAgICAgICAgU2NoYWx0ZXQgZGVuIEhlYXJ0YmVhdCBlaW4gKDEpIG9kZXIgYXVzICgwKS4gRGVyIFRyZWliZXIgd2VuZGV0IGRpZQorICAgICAgICBMZnVuIGhlYXJ0X2JlYXQoKSBhdWYgZGFzIGFrdHVlbGxlIE9iamVrdCBhbGxlIF9fSEVBUlRCRUFUX0lOVEVSVkFMX18KKyAgICAgICAgU2VrdW5kZW4gYW4sIHdlbm4gZGVyIEhlYXJ0YmVhdCBlaW5nZXNjaGFsdGV0IGlzdC4gRWluIFNoYWRvdworICAgICAgICBhdWYgZGVyIExmdW4gd2lyZCBpZ25vcmllcnQuCisgICAgICAgIAorICAgICAgICBEZXIgSGVhcnRiZWF0IHNvbGx0ZSBpbW1lciBhdXNnZXNjaGFsdGV0IHdlcmRlbiwgd2VubiBlciBuaWNodAorICAgICAgICBnZWJyYXVjaHQgd2lyZC4gRGFzIHJlZHV6aWVydCBkaWUgU3lzdGVtYXVzbGFzdHVuZy4KKworICAgICAgICBMaWVmZXJ0ICcxJyBiZWkgRXJmb2xnLCAnMCcgYmVpIEZlaGxlci4KKworICAgICAgICBEYXMgQWJzY2hhbHRlbiBlaW5lcyBiZXJlaXRzIGFiZ2VzY2hhbHRldGVuIEhlYXJ0YmVhdHMgKHVuZCB1bWdla2VocnQKKyAgICAgICAgZGFzIEVpbnNjaGFsdGVuIGVpbmVzIGJlcmVpdHMgZWluZ2VzY2hhbHRldGVuIEhlYXJ0YmVhdHMpIHphZWhsdAorICAgICAgICBhbHMgRmVobGVyLgorCitCRU1FUktVTkdFTgorICAgICAgICBfX0hFQVJUQkVBVF9JTlRFUlZBTF9fIGlzdCBpbiBNRyA9IDIgU2VrdW5kZW4KKworU0lFSEUgQVVDSAorICAgICAgICBoZWFydF9iZWF0KEEpLCBjYWxsX291dChFKQpkaWZmIC0tZ2l0IGEvZG9jL3NlZnVuL3NldF9saWdodCBiL2RvYy9zZWZ1bi9zZXRfbGlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIzOTBjNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zZWZ1bi9zZXRfbGlnaHQKQEAgLTAsMCArMSwxNyBAQAorU1lOT1BTSVM6CisgICAgICAgIGludCBzZXRfbGlnaHQoaW50IG4pCisKK0RFU0NSSVBUSU9OOgorICAgICAgICBBbiBvYmplY3QgaXMgYnkgZGVmYXVsdCBkYXJrLiBJdCBjYW4gYmUgc2V0IHRvIG5vdCBkYXJrIGJ5CisgICAgICAgIGNhbGxpbmcgc2V0X2xpZ2h0KDEpLiBUaGUgZW52aXJvbm1lbnQgd2lsbCB0aGVuIGFsc28gZ2V0IHRoaXMKKyAgICAgICAgbGlnaHQuIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIGxpZ2h0cyBpbgorICAgICAgICB0aGlzIHJvb20uIFNvIGlmIHlvdSBjYWxsIHNldF9saWdodCgwKSBpdCB3aWxsIHJldHVybiB0aGUKKyAgICAgICAgbGlnaHQgbGV2ZWwgb2YgdGhlIGN1cnJlbnQgb2JqZWN0LgorICAgICAgICAKKyAgICAgICAgTm90ZSB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUgYXJndW1lbnQgaXMgYWRkZWQgdG8gdGhlIGxpZ2h0IG9mCisgICAgICAgIHRoZSBjdXJyZW50IG9iamVjdC4KKworQlVHUzoKKwlUaGlzIGhhbmRsaW5nIG9mIGxpZ2h0IGJ5IHRoZSBwYXJzZXIgaXMgaW5hcHByb3ByaWF0ZSBmb3IgbW9zdAorCXB1cnBvc2VzOiBJZiB5b3UgcHV0IGEgYnVybmluZyBjYW5kbGUgaW50byBhIHNhZmUsIHRoZSBzYWZlCisJd2lsbCBzdGFydCB0byBlbWl0IGxpZ2h0LgpkaWZmIC0tZ2l0IGEvZG9jL3NlZnVuL3NldF9saXZpbmdfbmFtZSBiL2RvYy9zZWZ1bi9zZXRfbGl2aW5nX25hbWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYwYTNjZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zZWZ1bi9zZXRfbGl2aW5nX25hbWUKQEAgLTAsMCArMSwyNSBAQAorU1lOT1BTSVM6CisgICAgICAgIHZvaWQgc2V0X2xpdmluZ19uYW1lKHN0cmluZyBuYW1lKQorCitCRVNDSFJFSUJVTkc6CisgICAgICAgIFNldHp0IGVpbmVuICJMZWJld2VzZW5uYW1lbiIgZnVlciBkYXMgT2JqZWt0LCBpbmRlbSBOYW1lIHVuZCBPYmpla3QgaW4KKyAgICAgICAgZWluZSBUYWJlbGxlIGVpbmdldHJhZ2VuIHdlcmRlbiwgd2VsY2hlIHZvbiBmaW5kX2xpdmluZygpIGR1cmNoc3VjaHQgCisgICAgICAgIHdpcmQuIE5hY2ggU2V0emVuIGRlcyBOYW1lbnMga2FubiBkYXMgT2JqZWt0IHBlciBmaW5kX2xpdmluZygpIAorICAgICAgICBnZWZ1bmRlbiB3ZXJkZW4uCisKKyAgICAgICAgRGFzIE9iamVrdCBtdXNzIGF1c3NlcmRlbSBwZXIgZW5hYmxlX2NvbW1hbmRzKCkgYWxzIExlYmV3ZXNlbgorICAgICAgICBtYXJraWVydCB3b3JkZW4gc2Vpbi4gRGllcyBpc3QgZnVlciBhbGxlIHZvbiAvc3RkL25wYyBlcmJlbmRlbiBOUENzCisgICAgICAgIF9hdXRvbWF0aXNjaF8gZGVyIEZhbGwgdW5kIHNvbGx0ZSBkYWhlciBuaWNodCBub2NobWFsIGV4cGxpeml0IGdlbWFjaHQKKyAgICAgICAgd2VyZGVuLgorCisgICAgICAgIEFsbGUgdm9uIC9zdGQvbnBjIGVyYmVuZGVuIE5QQ3Mgc2V0emVuIGViZW5mYWxscyBhdXRvbWF0aXNjaCBlaW5lbgorICAgICAgICBMaXZpbmdOYW1lLCBkZXIgbG93ZXJfY2FzZShQX05BTUUpIGVudHNwcmljaHQuCisKKyAgICAgICAgRWluIE9iamVrdCBrYW5uIG51ciBlaW5lbiBOYW1lbiBoYWJlbiwgbWl0IGRlbSBlcyBwZXIgZmluZF9saXZpbmcoKQorICAgICAgICBnZXN1Y2h0IHdlcmRlbiBrYW5uLgorCitTSUVIRSBBVUNIOgorICAgICAgICBmaW5kX2xpdmluZyhFKSwgZmluZF9saXZpbmdzKEUpLCBmaW5kX3BsYXllcihFKSwgZW5hYmxlX2NvbW1hbmRzKEUpCisKK0xFVFpURSBBZU5ERVJORzoKKzE5LjEwLjIwMTUsIEFyYXRob3JuCmRpZmYgLS1naXQgYS9kb2Mvc2VmdW4vc2V0X29iamVjdF9oZWFydF9iZWF0IGIvZG9jL3NlZnVuL3NldF9vYmplY3RfaGVhcnRfYmVhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2JhNGVmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NlZnVuL3NldF9vYmplY3RfaGVhcnRfYmVhdApAQCAtMCwwICsxLDE1IEBACitGVU5LVElPTjoKKyAgICAgICAgaW50IHNldF9vYmplY3RfaGVhcnRfYmVhdChvYmplY3Qgb2IsIGludCBvbikKKworQVJHVU1FTlRFOgorICAgICAgICBvYiAtIE9iamVrdCwgZGVzc2VuIGhlYXJ0X2JlYXQgdmVyYWVuZGVydCB3ZXJkZW4gc29sbAorICAgICAgICBvbiAtIFNvbGwgZGVyIGhlYXJ0X2JlYXQgZWluLSBvZGVyIGF1c2dlc2NoYWx0ZXQgd2VyZGVuPworCitCRVNDSFJFSUJVTkc6CisgICAgICAgIERlciBoZWFydF9iZWF0IGRlcyBPYmpla3RlcyB3aXJkIGVpbi0gKG9uPTEpIG9kZXIgYXVzLSAob249MCkgZ2VzY2hhbHRldC4KKworUlVFQ0tHQUJFV0VSVDoKKyAgICAgICAgMSwgd2VubiBkYXMgU2V0emVuIGdla2xhcHB0IGhhdCwgYW5zb25zdGVuIDAuCisKK1NJRUhFIEFVQ0g6CisgICAgICAgIHNldF9oZWFydF9iZWF0KEUpLCBoZWFydF9iZWF0KEwpLCBjYWxsX291dChFKQpkaWZmIC0tZ2l0IGEvZG9jL3NlZnVuL3NoYTEgYi9kb2Mvc2VmdW4vc2hhMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGJiNmNjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NlZnVuL3NoYTEKQEAgLTAsMCArMSwyMiBAQAorREVQUkVDQVRFRAorU1lOT1BTSVMKKyAgICAgICAgc3RyaW5nIHNoYTEgKHN0cmluZyBhcmcpCisgICAgICAgIHN0cmluZyBzaGExIChpbnQgKiAgYXJnKQorCitCRVNDSFJFSUJVTkcKKyAgICAgICAgQmVyZWNobmV0IGRlbiBTSEExLUhhc2h3ZXJ0IHZvbiA8YXJnPi4KKyAgICAgICAgRGFzIEFyZ3VtZW50IGthbm4gZWluIFN0cmluZywgb2RlciBlaW4gQXJyYXkgdm9uIFphaGxlbiBzZWluICh2b24KKyAgICAgICAgd2VsY2hlbiBudXIgZGFzIHVudGVyc3RlIEJ5dGUgYmV0cmFjaHRlZCB3aXJkKS4KKworQkVJU1BJRUwKKyAgICAgICAgc3RyaW5nIHM7CisKKyAgICAgICAgcyA9IHNoYTEoIkhlbGxvIik7CisgICAgICAgIHMgPSBzaGExKCAoeyAnSCcsICdlJywgJ2wnLCAnbCcsICdvJyB9KQorCitISVNUT1JZCisgICAgICAgIEVpbmdlZnVlaHJ0IGluIExETXVkIDMuMy41MjMuCisgICAgICAgIExETXVkIDMuMy43MTIgZnVlaHJ0ZSBaYWVobGVuYXJyYXlzIGFscyBBcmd1bWVudCBlaW4uCisKK1NJRUhFIEFVQ0gKKyAgICAgICAgY3J5cHQoRSksIG1kNShFKQpkaWZmIC0tZ2l0IGEvZG9jL3NlZnVuL3NoYWRvdyBiL2RvYy9zZWZ1bi9zaGFkb3cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMwOWRlYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zZWZ1bi9zaGFkb3cKQEAgLTAsMCArMSwxNDMgQEAKK0ZVTktUSU9OOgorICAgICBvYmplY3Qgc2hhZG93KG9iamVjdCBvYiwgaW50IGZsYWcpCisKK0FSR1VNRU5URToKKyAgICAgb2JqZWN0IG9iCQktIGRhcyB2b20gc2hhZG93IGJldHJvZmZlbmUgT2JqZWt0CisgICAgIGludCBmbGFnCQktIDAgZnVlciBlaW5lIFNoYWRvdy1FeGlzdGVuemFiZnJhZ2UKKyAgICAgICAgICAgICAgICAgICAgICAxIGZ1ZXIgU2hhZG93IGR1cmNoIHByZXZpb3VzX29iamVjdCgpCisKK0JFU0NIUkVJQlVORzoKKyAgICAgV2VubiA8ZmxhZz4gbmljaHQgMCBpc3QsIHdpcmQgZGFzIGFrdHVlbGxlIE9iamVrdCBkZW0gT2JqZWt0IG9iagorICAgICBhbHMgU2hhZG93IHVlYmVyZ2V3b3JmZW4uIEJlaSBFcmZvbGcgd2lyZCBkYXMgZ2VzaGFkb3d0ZSBPYmpla3QKKyAgICAgenVydWVja2dlZ2ViZW4sIHNvbnN0IDAuCisgICAgIFdlbm4gPGZsYWc+IDAgaXN0LCB3aXJkIGVudHdlZGVyIDAgb2RlciBkYXMgZ2VzaGFkb3d0ZSBPYmpla3QKKyAgICAgenVydWVjayBnZWdlYmVuLgorCisgICAgIFdlbm4gZWluIE9iamVrdCBBIGVpbiBPYmpla3QgQiBiZXNjaGF0dGV0LCB3ZXJkZW4gYWxsZSBjYWxsX290aGVyKCkgZnVlcgorICAgICBCIGF1ZiBBIHVtZ2VsZWl0ZXQuIFdlbm4gZGllIGFuIEIgZ2VydWZlbmUgRnVua3Rpb24gaW4gQSBleGlzdGllcnQsIHNvCisgICAgIHdpcmQgc2llIGluIEEgZ2VydWZlbiwgYmVpIE5pY2h0ZXhpc3RlbnogaW4gQi4KKyAgICAgQSBpc3QgZGFzIGVpbnppZ2UgT2JqZWt0LCB3ZWxjaGUgZGllIGJlc2NoYXR0ZXRlbiBGdW5rdGlvbmVuIG1pdCAKKyAgICAgY2FsbF9vdGhlcigpIGluIEIgYXVmcnVmZW4ga2Fubiwgc2VsYnN0IEIga2FubiBuaWNodCBwZXIgY2FsbF9vdGhlcigpIAorICAgICBkaWVzZSBGdW5rdGlvbiBydWZlbi4KKyAgICAgQWxsZSBpbnRlcm4gdmVyd2VuZGV0ZW4gRnVua3Rpb25lbiBhcmJlaXRlbiBqZWRvY2ggd2VpdGVyaGluIG5vcm1hbC4KKworICAgICBEYXMgYXVmcnVmZW5kZSBPYmpla3QgbXVzcyB2b20gTWFzdGVyLU9iamVrdCBkaWUgRXJsYXVibmlzIGhhYmVuLAorICAgICBhbHMgU2hhZG93IHp1IHdpcmtlbi4KKworICAgICBFcyBnaWJ0IGZvbGdlbmRlIEtyaXRlcmllbiBmdWVyIGVpbmUgZXJmb2xncmVpY2hlIEJlc2NoYXR0dW5nOgorICAgICAtIGRhcyB6dSBiZXNjaGF0dGVuZGUgT2JqZWt0IG9iOgorICAgICAgIC0gaXN0IHdlZGVyIGVpbiBhY2Nlc3NfcmlnaHRzLU9iamVrdCBub2NoIGVpbiBST09ULU9iamVrdAorICAgICAgIC0gZ2lidCBiZWltIEF1ZnJ1ZiB2b24gcXVlcnlfcHJldmVudF9zaGFkb3coYmVzY2hhdHRlcikgZWluZSAwCisgICAgICAgICB6dXJ1ZWNrCisgICAgICAgLSBiZXNjaGF0dGV0IHNlbGJzdCBuaWVtYW5kZW4KKyAgICAgICAtIGhhdCBrZWluICcjcHJhZ21hIG5vX3NoYWRvdycgZ2VzZXR6dAorICAgICAtIGRlciBCZXNjaGF0dGVyOgorICAgICAgIC0gd2lyZCBuaWNodCBzZWxic3QgKGRpcmVrdCkgYmVzY2hhdHRldAorICAgICAgIC0gYmVzY2hhdHRldCBub2NoIG5pZW1hbmRlbiAoc29uc3QgZm9sZ3QgZGlyZWt0ZXIgQWJicnVjaCkKKyAgICAgICAtIGhhdCBrZWluIGVudmlyb25tZW50KCkKKyAgICAgICAtIGRlZmluaWVydC9iZXNjaGF0dGV0IGtlaW5lIE1ldGhvZGUsIGRpZSBpbSBiZXNjaGF0dGV0ZW4gT2JqZWt0IG9iIAorICAgICAgICAgYWxzIG5vbWFzayBkZWZpbmllcnQgaXN0CisKKyAgICAgQmVzY2hhdHRldCBtYW4gZWluIE9iamVrdCBBIG1pdCBlaW5lbSBPYmpla3QgQiB1bmQgZGFubiBkYXMgT2JqZWt0IEEKKyAgICAgenVzYWV0emxpY2ggbWl0IGVpbmVtIE9iamVrdCBDLCBzbyB3aXJkIGVpbmUgQmVzY2hhdHR1bmdzaGllcmFyY2hpZQorICAgICBlcnN0ZWxsdDoKKworICAgICBCIG1hY2h0IHNoYWRvdyhBLCAxKQorICAgICBCLT5BCisgICAgIEMgbWFjaHQgc2hhZG93KEEsIDEpCisgICAgIEMtPkItPkEKKworQkVJU1BJRUxFOgorICAgICAvLyB3ZW5uOiBCIGJlc2NoYXR0ZXQgQSwgZGFubgorICAgICBzaGFkb3coZmluZF9vYmplY3QoQSksIDApID09IEIKKworCisgICAgIC8vIDMgT2JqZWt0ZSBiZXNjaGF0dGVuIGluIEhpZXJhcmNoaWUgKGxpZWd0IGF1Y2ggaW0gUGZhZCkKKyAgICAgLS0tIGFhLmMgLS0tCisgICAgIHZvaWQgZnVuKCkgeworICAgICAgICAgcHJpbnRmKCIlTyBbYV0gZnVuKClcbiIsIHRoaXNfb2JqZWN0KCkpOworICAgICB9CisKKyAgICAgdm9pZCBmdW4zKCkgeworICAgICAgICAgcHJpbnRmKCIlTyBbYV0gZnVuMygpXG4iLCB0aGlzX29iamVjdCgpKTsKKyAgICAgfQorCisgICAgIC0tLSBiYi5jIC0tLQorICAgICBpbnQgZnVuKCkgeworICAgICAgICAgcHJpbnRmKCIlTyBbYl0gZnVuKClcbiIsIHRoaXNfb2JqZWN0KCkpOworICAgICAgICAgZmluZF9vYmplY3QoIi9kb2MvYmVpc3BpZWxlL3NoYWRvdy9hYSIpLT5mdW4oKTsKKyAgICAgfQorCisgICAgIHZvaWQgZnVuMigpIHsKKyAgICAgICAgIHByaW50ZigiJU8gW2JdIGZ1bjIoKVxuIiwgdGhpc19vYmplY3QoKSk7CisgICAgICAgICBmaW5kX29iamVjdCgiL2RvYy9iZWlzcGllbGUvc2hhZG93L2FhIiktPmZ1bjMoKTsKKyAgICAgICAgIHRoaXNfb2JqZWN0KCktPmZ1bjMoKTsKKyAgICAgfQorCisgICAgIHZvaWQgZG9fc2hhZG93KG9iamVjdCB0YXJnZXQpIHsgc2hhZG93KHRhcmdldCwgMSk7IH0KKworICAgICAtLS0gY2MuYyAtLS0KKyAgICAgaW50IGZ1bigpIHsKKyAgICAgICAgIHByaW50ZigiJU8gW2NdIGZ1bigpXG4iLCB0aGlzX29iamVjdCgpKTsKKyAgICAgICAgIGZpbmRfb2JqZWN0KCIvZG9jL2JlaXNwaWVsZS9zaGFkb3cvYWEiKS0+ZnVuKCk7CisgICAgIH0KKworICAgICB2b2lkIGZ1bjMoKSB7CisgICAgICAgICBwcmludGYoIiVPIFtjXSBmdW4zKClcbiIsIHRoaXNfb2JqZWN0KCkpOworICAgICB9CisKKyAgICAgdm9pZCBkb19zaGFkb3cob2JqZWN0IHRhcmdldCkgeyBzaGFkb3codGFyZ2V0LCAxKTsgfQorCisgICAgIC8vIGRhcmF1ZiBhcmJlaXRlbmRlciBDb2RlCisKKyAgICAgb2JqZWN0IGEsIGIsIGM7CisKKyAgICAgZGVzdHJ1Y3QoIi9kb2MvYmVpc3BpZWxlL3NoYWRvdy9hYSIpOworICAgICBhID0gbG9hZF9vYmplY3QoIi9kb2MvYmVpc3BpZWxlL3NoYWRvdy9hYSIpOworICAgICBkZXN0cnVjdCgiL2RvYy9iZWlzcGllbGUvc2hhZG93L2JiIik7CisgICAgIGIgPSBsb2FkX29iamVjdCgiL2RvYy9iZWlzcGllbGUvc2hhZG93L2JiIik7CisgICAgIGRlc3RydWN0KCIvZG9jL2JlaXNwaWVsZS9zaGFkb3cvY2MiKTsKKyAgICAgYyA9IGxvYWRfb2JqZWN0KCIvZG9jL2JlaXNwaWVsZS9zaGFkb3cvY2MiKTsKKworICAgICBiLT5kb19zaGFkb3coYSk7CisgICAgIGMtPmRvX3NoYWRvdyhhKTsKKyAgICAgcHJpbnRmKCItLS0gYS0+ZnVuKCkgLS0tXG4iKTsKKyAgICAgYS0+ZnVuKCk7CisgICAgIHByaW50ZigiLS0tIGItPmZ1bigpIC0tLVxuIik7CisgICAgIGItPmZ1bigpOworICAgICBwcmludGYoIi0tLSBjLT5mdW4oKSAtLS1cbiIpOworICAgICBjLT5mdW4oKTsKKyAgICAgcHJpbnRmKCItLS0gYi0+ZnVuMigpIC0tLVxuIik7CisgICAgIGItPmZ1bjIoKTsKKworICAgICAvLyAuLi4gdW5kIHNlaW5lIEF1c2dhYmU6CisKKyAgICAgLS0tIGEtPmZ1bigpIC0tLQorICAgICAvZG9jL2JlaXNwaWVsZS9zaGFkb3cvY2MgW2NdIGZ1bigpCisgICAgIC9kb2MvYmVpc3BpZWxlL3NoYWRvdy9iYiBbYl0gZnVuKCkKKyAgICAgL2RvYy9iZWlzcGllbGUvc2hhZG93L2FhIFthXSBmdW4oKQorICAgICAtLS0gYi0+ZnVuKCkgLS0tCisgICAgIC9kb2MvYmVpc3BpZWxlL3NoYWRvdy9jYyBbY10gZnVuKCkKKyAgICAgL2RvYy9iZWlzcGllbGUvc2hhZG93L2JiIFtiXSBmdW4oKQorICAgICAvZG9jL2JlaXNwaWVsZS9zaGFkb3cvYWEgW2FdIGZ1bigpCisgICAgIC0tLSBjLT5mdW4oKSAtLS0KKyAgICAgL2RvYy9iZWlzcGllbGUvc2hhZG93L2NjIFtjXSBmdW4oKQorICAgICAvZG9jL2JlaXNwaWVsZS9zaGFkb3cvYmIgW2JdIGZ1bigpCisgICAgIC9kb2MvYmVpc3BpZWxlL3NoYWRvdy9hYSBbYV0gZnVuKCkKKyAgICAgLS0tIGItPmZ1bjIoKSAtLS0KKyAgICAgL2RvYy9iZWlzcGllbGUvc2hhZG93L2JiIFtiXSBmdW4yKCkKKyAgICAgL2RvYy9iZWlzcGllbGUvc2hhZG93L2FhIFthXSBmdW4zKCkKKyAgICAgL2RvYy9iZWlzcGllbGUvc2hhZG93L2NjIFtjXSBmdW4zKCkKKworICAgICAvLyBEZXIgZXJzdGUgQXVmcnVmIHZvbiBiOjpmdW4yKCkgaW4gYSBmaW5kZXQgc29mb3J0IGE6OmZ1bjMoKSEgRGVyCisgICAgIC8vIERyaXZlciBuaW1tdCBhbiwgZGFzcyBhbGxlIFNoYWRvd3MgYWIgYyBiZWkgUnVmZW4gdm9uIGIgbmFjaCBhCisgICAgIC8vIHNjaG9uIGlocmUgQ2hhbmNlIGhhdHRlbi4KKyAgICAgLy8gRGVyIHp3ZWl0ZSBBdWZydWYgYWxsZXJkaW5ncyBpc3QgYXVmIGIgdW5kIHdpcmQgYmVpbSBEdXJjaGdlYmVuCisgICAgIC8vIGFuIGEgdm9uIGMgdWViZXJub21tZW4uCisKK1NJRUhFIEFVQ0g6CisgICAgIEdlbmVyZWxsOgkgICAgIHNoYWRvdyhFKQorICAgICBSZWNodGU6CSAgICAgcXVlcnlfYWxsb3dfc2hhZG93KE0pLCBxdWVyeV9wcmV2ZW50X3NoYWRvdyhMKQorICAgICBJbmZvcm1hdGlvbmVuOiAgcXVlcnlfc2hhZG93aW5nKEUpCisKKzguQXVnIDIwMDcgR2xvaW5zb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2Mvc2VmdW4vc2hvdXQgYi9kb2Mvc2VmdW4vc2hvdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFkMjY2ZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zZWZ1bi9zaG91dApAQCAtMCwwICsxLDY5IEBACitGVU5LVElPTjoKKyAgICAgdmFyYXJncyB2b2lkIHNob3V0KCBzdHJpbmcgdGV4dCwgbWl4ZWQgd2hlcmUgKQorCitERUZJTklFUlQgSU46CisgICAgIC9zZWN1cmUvc2ltdWxfZWZ1bi5jCisKK0FSR1VNRU5URToKKyAgICAgdGV4dAorICAgICAgICAgIERlciBUZXh0LCBkZXIgYXVzZ2VnZWJlbiB3ZXJkZW4gc29sbAorCisgICAgIHdoZXJlIFtvcHRpb25hbF0KKyAgICAgICAgICBXbyBzb2xsIG1hbiBkZW4gVGV4dCB1ZWJlcmFsbCBob2VyZW4ga29lbm5lbj8KKworQkVTQ0hSRUlCVU5HOgorICAgICBEZXIgVGV4dCAndGV4dCcgd2lyZCBhbiBhbGxlIFNwaWVsZXIgaW4gZWluZW0gR2ViaWV0IGF1c2dlZ2ViZW4uCisgICAgIFdpcmQgZGVyIFBhcmFtZXRlciAnd2hlcmUnIHdlZ2dlbGFzc2VuIGJ6dy4gaXN0IGVyIG51bGwsIHNvIGdlaHQgZGVyCisgICAgIFRleHQgYW4gYWxsZSBTcGllbGVyIGltIE11ZC4gRGFzIGNhdGNoX3RlbGwoKSB2b24gTlBDcyB3aXJkIG5pY2h0CisgICAgIGF1c2dlbG9lc3QuCisKKyAgICAgSXN0ICd3aGVyZScgZWluZSBaYWhsICE9IDAsIHNvIHdpcmQgZGVyIFRleHQgbnVyIGFuIFNwaWVsZXIgYXVzZ2VnZWJlbiwKKyAgICAgZGllIHNpY2ggaW0gc2VsYmVuIEdlYmlldCBhdWZoYWx0ZW4gd2llIHRoaXNfcGxheWVyKCkuIERhYmVpIHdpcmQgZGllCisgICAgIFp1Z2Vob2VyaWdrZWl0IHp1bSBzZWxiZW4gR2ViaWV0IGFuIGRlbiBlcnN0ZW4gendlaSBFYmVuZW4gZGVzIFBmYWRlcworICAgICBkZXIgUmFldW1lIGZlc3RnZW1hY2h0LiBCZWZpbmRldCBzaWNoIHRoaXNfcGxheWVyKCkgei5CLiBpbgorICAgICAiL2QvZWJlbmUvaXJnZW5kd28iLCBzbyBnZWh0IGRlciBUZXh0IGFuIGFsbGUgU3BpZWxlciwgZGVyZW4gQXVmZW50aGFsdHMtCisgICAgIG9ydGUgaW4gIi9kL2ViZW5lLyoiIGxpZWdlbi4KKworICAgICBGdWVyICd3aGVyZScga2FubiBhdWNoIGRpcmVrdCBlaW4gUGZhZCBhbmdlZ2ViZW4gd2VyZGVuLiBTbyB3dWVyZGUgZWluCisgICAgICdzaG91dCggdHh0LCAiL3BsYXllcnMvIiApJyBhbiBhbGxlIFNwaWVsZXIgZ2VoZW4sIGRpZSBzaWNoIGluCisgICAgIChlaWdlbnRsaWNoIG5pY2h0IGVyd3VlbnNjaHRlbikgUmFldW1lbiBpbiAvcGxheWVycy8qIGJlZmluZGVuLgorCisgICAgIFVtIG1pdCBlaW5lbSBBdWZydWYgZ2xlaWNoIG1laHJlcmUgUGZhZGUgYWJ6dWRlY2tlbiwga2FubiBhdWNoIGVpbiBBcnJheQorICAgICB2b24gU3RyaW5ncyB1ZWJlcmdlYmVuIHdlcmRlbi4gQWxsZSBQZmFkZSB3ZXJkZW4gYWxzICdyZWd1bGFyIGV4cHJlc3Npb24nCisgICAgIGludGVycHJldGllcnQuIERhZHVyY2ggaXN0IGVzIG1vZWdsaWNoLCBkaWUgWmllbHJhZXVtZSBhdWYgZWluZmFjaGUgQXJ0CisgICAgIHNlaHIgZ2VuYXUgZWluenVzY2hyYWVua2VuLgorCisgICAgIEhJTldFSVM6IEJpdHRlIHVlYmVybGVnIHZvciBqZWRlbSBzaG91dCgpIGdlbmF1LCBvYiBlcyB3aXJrbGljaCBub2V0aWcKKyAgICAgaXN0LCBkYXNzIF9qZWRlcl8gZXR3YXMgZGF2b24gbWl0YmVrb21tdCBvZGVyIG9iIGVzIG5pY2h0IHZpZWxsZWljaHQKKyAgICAgc2lubnZvbGxlciBpc3QsIGRhcyBaaWVsZ2ViaWV0IGV0d2FzIGVpbnp1c2NocmFlbmtlbi4gSW0gWndlaWZlbHNmYWxsCisgICAgIHNvbGx0ZSBkZXIgenVzdGFlbmRpZ2UgUk0gYXVmcGFzc2VuLCBkYXNzIGRpZSBTcGllbGVyIG5pY2h0IGR1cmNoIGFsbHp1CisgICAgIHphaGxyZWljaGUgc2hvdXRzIGJlbGFlc3RpZ3Qgd2VyZGVuLgorCitSVWVDS0dBQkVXRVJUOgorICAgICBrZWluZXIKKworQkVJU1BJRUxFOgorICAgICBzaG91dCggIkR1IHNwdWVyc3QsIHdpZSBlaW4gWml0dGVybiBkdXJjaCBkYXMgTW9yZ2VuR3JhdWVuIGdlaHQuXG4iICk7CisgICAgICAgIERlciBhbGxzZWl0cyBiZWthbm50ZSBUZXh0IHdpcmQgYW4gYWxsZSBTcGllbGVyIGltIE1HIGF1c2dlZ2ViZW4uCisKKyAgICAgc2hvdXQoICJEdSBob2Vyc3QgZWluZSBnZXdhbHRpZ2UgRXhwbG9zaW9uLlxuIiwgMSApOworICAgICAgICBWb24gZGVyIEV4cGxvc2lvbiBiZWtvbW1lbiBhbGxlIFNwaWVsZXIgaW4gZGVyc2VsYmVuIEdlZ2VuZCBldHdhcyBtaXQsCisgICAgICAgIGFiZXIgbmljaHQgYW0gYW5kZXJlbiBFbmRlIGRlcyBNdWRzLgorCisgICAgIHNob3V0KCAiSXJnZW5kd28gaXN0IGVpbiBCYXVtIHVtZ2VmYWxsZW4uXG4iLCAiL2QvdmxhbmQvIiApOworICAgICAgICAuLi4gZ2lidCBlaW5lIE1lbGR1bmcgYXVzLCBkaWUga2VpbmVuIHdpcmtsaWNoIGludGVyZXNzaWVydC4gQWJlciBlcworICAgICAgICB0cmlmZnQgZWggbnVyIExldXRlIGluIGVpbmVtIHVud2ljaHRpZ2VuIFRlaWwgZGVzIE1vcmdlbkdyYXVlbi4gOy0pCisKKyAgICAgc2hvdXQoICJBdWZ3YWNoZW4gRHUgSWRsZXIhXG4iLCAiL3BsYXllcnMvLiovd29ya3Jvb20iICk7CisgICAgICAgIE1pdCBIaWxmZSB2b24gcmVndWxhciBleHByZXNzaW9ucyBrYW5uIG1hbiByZWNodCBlaW5mYWNoIHouQi4gYWxsZQorICAgICAgICBXb3Jrcm9vbXMgYXVmIGVpbm1hbCBhZHJlc3NpZXJlbi4KKworICAgICBzaG91dCggIkhhbGxvb29vb28sIEVjaG9vb29vbyFcbiIsICh7ICIvZC9nZWJpcmdlLyIsICIvZC9lYmVuZS8iIH0pICk7CisgICAgICAgIFdlbm4gZGVyIFNwaWVsZXIgaG9jaCBvYmVuIGF1ZiBkZW0gQmVyZyBsYXV0IGdlbnVnIHJ1ZnQsIGhvZXJ0IG1hbgorICAgICAgICBpaG4gYXVjaCBub2NoIHdlaXQgaW4gZGVyIEViZW5lLgorCitTSUVIRSBBVUNIOgorICAgICB3cml0ZSgpLCBzYXkoKSwgdGVsbF9vYmplY3QoKSwgdGVsbF9yb29tKCksIHJlZ2V4cCgpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFN1biBOb3YgMjggMDM6MDA6MDAgMTk5OSBieSBUaWFtYWsKZGlmZiAtLWdpdCBhL2RvYy9zZWZ1bi90aW1lMnN0cmluZyBiL2RvYy9zZWZ1bi90aW1lMnN0cmluZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGFlNzE5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NlZnVuL3RpbWUyc3RyaW5nCkBAIC0wLDAgKzEsNTMgQEAKK0ZVTktUSU9OOgorCXN0cmluZyB0aW1lMnN0cmluZyggc3RyaW5nIGZvcm1hdCwgaW50IHRpbWUgKQorCQorQVJHVU1FTlRFOgorCWZvcm1hdDogU3RyaW5nLCBkZXIgZGFzIEZvcm1hdCBkZXIgWmVpdGF1c2dhYmUgZmVzdGxlZ3QuCisJdGltZTogRWluZSBBbnphaGwgdm9uIFNla3VuZGVuLCBkaWUgYXVzZ2VnZWJlbiB3ZXJkZW4gc29sbC4KKworRVJHRUJOSVM6CisJWmVpdCBpbiBTdHJpbmctRm9ybS4KKworQkVTQ0hSRUlCVU5HOgorCURlciBGb3JtYXRzdHJpbmcgd2lyZCB6dXJ1ZWNrZ2VnZWJlbiwgd29iZWkgYmVzdGltbXRlIEVyc2V0enVuZ3MtCisJc3ltYm9sZSBkdXJjaCBwYXNzZW5kZSBEYXRlbiwgZGllIGF1cyBkZXIgWmVpdCBiZXJlY2huZXQgd2VyZGVuLAorCWVyc2V0enQgd2VyZGVuLiBEaWUgRXJzZXR6dW5nc3N5bWJvbGUgZnVua3Rpb25pZXJlbiBhZWhubGljaAorCWRlbmVuIGF1cyAncHJpbnRmJyBiZWthbm50ZW4gU3ltYm9sZW4uIEluc2Jlc29uZGVyZSBrYW5uIGVpbmUKKwlGZWxkYnJlaXRlIG1pdCBhbmdlZ2ViZW4gd2VyZGVuLgorCisJRm9sZ2VuZGUgRXJzZXR6dW5nc3N5bWJvbGUgc2luZCBlcmxhdWJ0OgorCSUlCXdpcmQgZHVyY2ggZWluIFByb3plbnQgKCUpIGVyc2V0enQuCisJJW4sICV3LCAlZCwgJWgsICVtLCAlcworCQkgIHdlcmRlbiBkdXJjaCBkaWUgQW56YWhsIGRlciBNb25hdGUsIFdvY2hlbiwgVGFnZSwgU3R1bmRlbiwgTWludXRlbiBvZGVyCisgICAgICBTZWt1bmRlbiBlcnNldHp0LiBEaWUgRnVua3Rpb24gZXJrZW5udCwgd2VsY2hlcyBkaWUgZ3JvZXNzdGUgYmVudXR6dGUKKwkJICBaZWl0ZWluaGVpdCBpc3QgdW5kIHJlY2huZXQgZGllIGtlaW5lcmVuIHNvIHVtLCBkYXNzIHNpZSB6d2lzY2hlbiAwIHVuZAorICAgICAgamV3ZWlsaWdlbiBNYXhpbXVtIGRlciBaZWl0ZWluaGVpdCBsaWVnZW4gKDU5LCAyMyBldGMuKSBsaWVnZW4uCisgCSVOCXdpcmQgZHVyY2ggZGllIFdvcnRlICdXb2NoZScgb2RlciAnV29jaGVuJyBlcnNldHp0LAorICAgICAgamUgbmFjaGRlbSB3ZWxjaGVuIFdlcnRkICVuIGhhZXR0ZS4KKyAJJVcJd2lyZCBkdXJjaCBkaWUgV29ydGUgJ1dvY2hlJyBvZGVyICdXb2NoZW4nIGVyc2V0enQsCisJCSAgamUgbmFjaGRlbSB3ZWxjaGVuIFdlcnQgJXcgaGFldHRlLgorCSVECXdpcmQgZHVyY2ggZGllIFdvcnRlICdUYWcnIG9kZXIgJ1RhZ2UnIGVyc2V0enQsCisJCSAgamUgbmFjaGRlbSB3ZWxjaGVuIFdlcnQgJWQgaGFldHRlLgorCSVILCVNLCVTCisJCSAgd2VyZGVuIGR1cmNoIGRpZSBXb3J0ZSAnU3R1bmRlKG4pJywgJ01pbnV0ZShuKScgYnp3LiAnU2VrdW5kZShuKScKKyAgICAgIGVyc2V0enQuCisJJVgJd2lyZCBkdXJjaCBkaWUgZ3JvZXNzdGUgWmVpdGVpbmhlaXQgZXJzZXR6dCwgZGllIG5pY2h0IE51bGwgaXN0LiBXZW5uCisgICAgICBiZWkgJVggZGllIEZlbGRicmVpdGUgMCBhbmdlZ2ViZW4gd2lyZCAoYWxzbyAlMFgpLCBkYW5uIHdpcmQgbmljaHQgZGVyCisgICAgICBhdXNnZXNjaHJpZWJlbmUgTmFtZSwgc29uZGVyIGVpbmUgQWJrdWVyenVuZyBmdWVyIGRpZSBaZWl0ZWluaGVpdAorICAgICAgYXVzZ2VnZWJlbi4gKERhcyBzaW5kIGRhbm4gJ2QnLCdoJywnbScgb2RlciAncycuKQorCSV4CXdpcmQgZHVyY2ggZGVuIG51bWVyaXNjaGVuIFdlcnQgZGllc2VyIFplaXRlaW5oZWl0CisJCSAgZXJzZXR6dC4KKwkJCQorQkVJU1BJRUxFOgorCXRpbWUyc3RyaW5nKCAiJW0gJU0iLCA2MCApIC0+ICIxIE1pbnV0ZSIKKwl0aW1lMnN0cmluZyggIiVtICVNIiwgMTIwICkgLT4gIjIgTWludXRlbiIKKwl0aW1lMnN0cmluZyggIiVzICVTIiwgMTI1ICkgLT4gIjEyNSBTZWt1bmRlbiIKKwl0aW1lMnN0cmluZyggIiVtICVNIHVuZCAlcyAlUyIgKSAtPiAiMiBNaW51dGVuIHVuZCA1IFNla3VuZGVuIgorCXRpbWUyc3RyaW5nKCAiJWQ6JTAyaDolMDJtOiUwMnMiLCAxMDAwMCApIC0+ICIwOjAyOjQ2OjQwIgorCXRpbWUyc3RyaW5nKCAiJXggJVgiLCAzNjAwICkgLT4gIjEgU3R1bmRlIgorCXRpbWUyc3RyaW5nKCAiJXggJTBYIiwgMzYwMCApIC0+ICIxIGgiCisJdGltZTJzdHJpbmcoICIleCAlWCIsIDM2MDAwMCApIC0+ICI0IFRhZ2UiCisJdGltZTJzdHJpbmcoICIleCAlMFgiLCAzNjAwMDAgKSAtPiAiNCBkIgorCitTSUVIRSBBVUNIOgorCXNwcmludGYoRSkKZGlmZiAtLWdpdCBhL2RvYy9zZWZ1bi91cGRhdGVfYWN0aW9ucyBiL2RvYy9zZWZ1bi91cGRhdGVfYWN0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjhjZjlmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NlZnVuL3VwZGF0ZV9hY3Rpb25zCkBAIC0wLDAgKzEsMzggQEAKK0ZVTktUSU9OOgorICAgICAgICB2b2lkIHVwZGF0ZV9hY3Rpb25zKCkKKworQVJHVU1FTlRFOgorICAgICAgICBrZWluZQorCitCRVNDSFJFSUJVTkc6CisgICAgICAgIEZhbGxzIGVpbmUgQWt0aW9uIGVpbiBhZGRfYWN0aW9uKCkgYXVzZ2Vsb2VzdCBoYXQsIHdlcmRlbiBtaXQgZGllc2VyCisgICAgICAgIEZ1bmt0aW9uIGRpZSBuZXVlbiBCZWZlaGxlIGJlaSBhbGxlbiBMZWJld2VzZW4gaW0gYXVmcnVmZW5kZW4gT2JqZWt0CisgICAgICAgIGJ6dy4gaW4gZGVyIFVtZ2VidW5nIGRlcyBhdWZydWZlbmRlbiBPYmpla3RlcyBha3Rpdi4KKworUlVFQ0tHQUJFV0VSVDoKKyAgICAgICAga2VpbmVyCisKK0JFTUVSS1VOR0VOOgorICAgICAgICBEaWVzZSBGdW5rdGlvbiB3aXJkIGVpZ2VudGxpY2ggbnVyIGJlbm9ldGlndCwgd2VubiBtYW4gbWl0IGFkZF9hY3Rpb24oKQorICAgICAgICBhbnN0ZWxsZSB2b24gQWRkQ21kKCkgYXJiZWl0ZXQgKHpCLiBiZWkgT2JqZWt0ZW4sIGRpZSBuaWNodAorICAgICAgICAvc3RkL3RoaW5nL2NvbW1hbmRzIGluaGVyaXRlbikuCisKK0JFSVNQSUVMRToKKyAgICAgICAgLyogTm9ybWFsZXJ3ZWlzZSBzb2xsdGUgbWFuIGVzIFNPIGdlcmFkZSBuaWNodCBtYWNoZW4uIFN0YXR0ZGVzc2VuCisgICAgICAgICAqIHNvbGx0ZSBkaWUgImtsZXR0ZXIiLUZ1bmt0aW9uIHBydWVmZW4sIG9iIGRpZSBMdWtlIGdlb2VmZm5ldCBpc3QsIAorICAgICAgICAgKiB1bmQgc2ljaCBpbSBGZWhsZXJmYWxsIGJlc2Nod2VyZW4uCisgICAgICAgICAqIFNvIGFiZXIgZGllbnQgZXMgYWxzIHNjaG9lbmVzIEJlaXNwaWVsIGZ1ZXIgdXBkYXRlX2FjdGlvbnMoKSA7KQorICAgICAgICAgKi8KKyAgICAgICAgaW50IG9lZmZuZShzdHJpbmcgc3RyKQorICAgICAgICB7CisgICAgICAgICAgaWYoIHN0ciA9PSAibHVrZSIgKSB7CisgICAgICAgICAgICB3cml0ZSggIkR1IG9lZmZuZXN0IGRpZSBMdWtlLiBEdSBrYW5uc3QgamV0enQgbmFjaCB1bnRlbiBrbGV0dGVybi5cbiIpOworICAgICAgICAgICAgYWRkX2FjdGlvbigia2xldHRlciIsICJrbGV0dGVyIiwgMSk7CisgICAgICAgICAgICB1cGRhdGVfYWN0aW9ucygpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKK1NJRUhFIEFVQ0g6CisgIGFkZF9hY3Rpb24oRSksIEFkZENtZChMKSwgUmVtb3ZlQ21kKEwpCmRpZmYgLS1naXQgYS9kb2Mvc2VmdW4vdXBwZXJzdHJpbmcgYi9kb2Mvc2VmdW4vdXBwZXJzdHJpbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY1ZWQxNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zZWZ1bi91cHBlcnN0cmluZwpAQCAtMCwwICsxLDE3IEBACitGVU5LVElPTjoKKwlzdHJpbmcgdXBwZXJzdHJpbmcoc3RyaW5nIHN0cikKKworQVJHVU1FTlRFOgorCXN0ciAtIERlciB1bXp1d2FuZGVsbmRlIFN0cmluZy4KKworQkVTQ0hSRUlCVU5HOgorCUFsbGUgS2xlaW5idWNoc3RhYmVuIGluIHN0ciB3ZXJkZW4gaW4gR3Jvc3NidWNoc3RhYmVuIHVtZ2V3YW5kZWx0LgorCitSVUVDS0dBQkVXRVJUOgorCURlciB1bWdld2FuZGVsdGUgU3RyaW5nLgorCitCRUlTUElFTEU6CisJcyA9IHVwcGVyc3RyaW5nKCAiTmEsIFN0ZXJibGljaGVyIVxuIikgPT4gcyA9ICJOQSwgU1RFUkJMSUNIRVIhXG4iCisKK1NJRUhFIEFVQ0g6CisJbG93ZXJzdHJpbmcoRSksIGxvd2VyX2Nhc2UoRSksIGNhcGl0YWxpemUoRSkKZGlmZiAtLWdpdCBhL2RvYy9zZWZ1bi91cHRpbWUgYi9kb2Mvc2VmdW4vdXB0aW1lCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlN2E1MzYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2VmdW4vdXB0aW1lCkBAIC0wLDAgKzEsMTYgQEAKK0ZVTktUSU9OOgorICAgICAgICBzdHJpbmcgdXB0aW1lKCkKKworQVJHVU1FTlRFOgorICAgICAgICBrZWluZQorCitCRVNDSFJFSUJVTkc6CisgICAgICAgIExpZWZlcnQgZGllIGFrdHVlbGxlIFVwdGltZSBkZXMgTW9yZ2VuR3JhdWVucy4KKworUlVFQ0tHQUJFV0VSVDoKKyAgICAgICAgRGllIFVwdGltZSBhbHMgWmVpdHN0cmluZy4KKworQkVJU1BJRUxFOgorICAgICAgICB1dCA9IHVwdGltZSgpID0+IHV0ID0gIjE0IFRhZ2UsIDkgU3R1bmRlbiwgMyBNaW51dGVuIHVuZCA3IFNla3VuZGVuLiIKKworU0lFSEUgQVVDSDoKZGlmZiAtLWdpdCBhL2RvYy9zZWZ1bi93aXpsaXN0IGIvZG9jL3NlZnVuL3dpemxpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJiYTdiZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zZWZ1bi93aXpsaXN0CkBAIC0wLDAgKzEsNjYgQEAKK1NZTk9QU0lTOgorICB2YXJhcmdzIHZvaWQgd2l6bGlzdChzdHJpbmcgbmFtZSwgaW50IHNvcnRrZXkgKSAJCisKK0RFU0NSSVBUSU9OOgorICB3aXpsaXN0KCkgbGllZmVydCBlaW5lIExpc3RlIG1pdCB2ZXJzY2hpZWRlbmVuIFZlcmJyYXVjaHNkYXRlbiAKKwl6dSBNYWdpZXJuLiBFcyB3ZXJkZW4gZGFiZWkgbm9ybWFsZXJ3ZWlzZSAyMSBFaW50cmFlZ2UgYXVzZ2VnZWJlbjoKKyAgMTAgdm9yIDxuYW1lPiwgPG5hbWU+IHNlbGJzdCB1bmQgMTAgbmFjaCA8bmFtZT4uCisKKyAgRGllIExpc3RlIGlzdCBkYWJlaSBmb2xnZW5kZXJtYXNzZW4gYXVmZ2ViYXV0OgorCisJMS4gV0xfTkFNRQorCSAgIEdlc2FtbWVsdCB3ZXJkZW4gZGllIERhdGVuIHBybyBVSUQuIEhpZXJiZWkgemFlaGx0IGFiZXIgamVkZSBFVUlELCBuaWNodAorICAgICBudXIgZGllIHZvbiBNYWdpZXJuLgorICAgICBEYXMgaGVpc3N0LCBPYmpla3RlIHVudGVyIC9kL3BvbGFyL3Zhbmlvbi9laXNwYWxhc3QKKwkgICB3ZXJkZW4gbmljaHQgdW50ZXIgInZhbmlvbiIgc29uZGVybiB1bnRlciAiZC5wb2xhci52YW5pb24iCisJICAgYWJnZXJlY2huZXQuCisKKwkyLiBXTF9DT01NQU5EUworICAgICBBbnphaGwgZGVyIGRpZXNlbSBPYmpla3QgenVnZW9yZG5ldGVuIGNvbW1hbmRzLgorCisJMy4gV0xfQ09NTUFORFMgKiAxMDAgLyB0b3RhbF9jbWQgCisgICAgIFByb3plbnR1YWxlciBBbnRlaWwgYW4gZGVuIGdlc2FtdCB2ZXJicmF1Y2h0ZW4gY29tbWFuZHMuCisKKwk0LiBXTF9DT1NUIChsaW5rcyBpbiBkZXIgZWNraWdlbiBLbGFtbWVyKQorICAgICBBbnphaGwgZGVyIHZlcmJyYXVjaHRlbiBldmFsIHRpY2tzLiBEaWVzIGlzdCB6ZWl0bGljaCBnZXdpY2h0ZXQsIGQuaC4KKyAgICAgbmltbXQgaW0gTGF1ZiBkZXIgWmVpdCBhYiwgd2VubiBuaWNodHMgbWVociBkYXp1IGtvbW10LgorCisgIDUuIFdMX1RPVEFMX0dJR0FDT1NUIChyZWNodHMgaW4gZGVyIGVja2lnZW4gS2xhbW1lcikKKyAgICAgQW56YWhsIGRlciBpbnNnZXNhbXQgdmVyYnJhdWNodGVuIGV2YWwgdGlja3MgaW4gR2lnYS1UaWNrcy4KKyAgICAgTmljaHQgemVpdGxpY2ggZ2V3aWNodGV0LgorCisJNi4gV0xfSEVBUlRfQkVBVFMKKyAgICAgQW56YWhsIGRlciBhdXNnZWxvZXN0ZW4gaGVhcnQgYmVhdHMuCisgIAorICA3LiBXTF9BUlJBWV9UT1RBTAorCisgIDguIFdMX01BUFBJTkdfVE9UQUwKKworUEFSQU1FVEVSUzogCisgIFdpcmQgbmFtZSBhbmdlZ2ViZW4sIHdpcmQgZXJ6d3VuZ2VuLCBkYXNzIGRpZSBlcndhZWhudGUgRVVJRCBtaXQKKyAgaW4gZGVyIExpc3RlIGRhcmdlc3RlbGx0IHdpcmQuIFdpcmQgbmFtZSBuaWNodCBhbmdlZ2ViZW4sIHdpcmQgZXMKKyAgYXV0b21hdGlzY2ggYXVmIHRoaXNfcGxheWVyKCktPnF1ZXJ5X3JlYWxfbmFtZSgpIGdlc2V0enQuCisKKyAgV2lyZCBhbHMgbmFtZSAiVE9QMTAwIiBhbmdlZ2ViZW4sIHdpcmQgZGllIFRvcC0xMDAtTGlzdGUgYXVzZ2VnZWJlbi4KKworICBXaXJkIGFscyBuYW1lICJBTEwiIGFuZ2VnZWJlbiwgd2lyZCBkaWUgdm9sbHN0YWVuZGlnZSBMaXN0ZSBhdXMtCisgIGdlZ2ViZW4uCisKKyAgRHVyY2ggQW5nYWJlIHZvbiBzb3J0a2V5IGthbm4gZGllIExpc3RlIG5hY2ggZWluZXIgZGVyIFNwYWx0ZW4gCisgIHNvcnRpZXJ0IHdlcmRlbi4gR3VlbHRpZ2UgV2VydGUgc2luZCBkaWUgaW4gL3N5cy93aXpsaXN0LmggYW5nZS0KKyAgZ2ViZW5lbiBEZWZpbmVzLgorCQorRVhBTVBMRTogCisgID4geGV2YWwgd2l6bGlzdCgidmFuaW9uIiwgV0xfSEVBUlRfQkVBVFMpCisgICAgICBFcnp3aW5ndCBWYW5pb25zIEVpbnRyYWcgaW4gZGVyIExpc3RlIHVuZCBzb3J0aWVydCBkaWUgTGlzdGUgYW5oYW5kCisgICAgICBkZXIgZHVyY2ggZGllIEVVSURzIGF1c2dlZnVlaHJ0ZW4gaGVhcnQgYmVhdHMuCisKKyAgPiB4ZXZhbCB3aXpsaXN0KCJBTEwiLCBXTF9FVkFMX0NPU1QpCisgICAgICBaZWlndCBkaWUga29tcGxldHRlIExpc3RlIG5hY2ggZXZhbCB0aWNrcy1WZXJiYXVjaCBzb3J0aWVydCBhbi4KKworU0VFIEFMU086CisgICAgICB3aXpsaXN0X2luZm8oRSkKKworTEFTVCBVUERBVEVEOgorICAwOS4wNS4yMDE1LCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9zZWZ1bi93aXpsaXN0X2luZm8gYi9kb2Mvc2VmdW4vd2l6bGlzdF9pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNWMxMjcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2VmdW4vd2l6bGlzdF9pbmZvCkBAIC0wLDAgKzEsMzkgQEAKK0dFU0NIVUVUWlQKK1NZTk9QU0lTCisgICAgICAgICNpbmNsdWRlIDxzeXMvd2l6bGlzdC5oPgorCisgICAgICAgICptaXhlZCB3aXpsaXN0X2luZm8oKTsKKworQkVTQ0hSRUlCVU5HCisgICAgICAgIExpZWZlcnQgZWluIEFycmF5IG1pdCBFaW50cmFlZ2VuIGF1cyBkZXIgV2l6bGlzdCAoZGVyIGludGVybmVuCisgICAgICAgIE1hZ2llcmxpc3RlKS4gRGllIEJlbnV0enVuZyBtdXNzIGR1cmNoIGRhcyBNYXN0ZXJvYmpla3QgZXJsYXVidAorICAgICAgICB3ZXJkZW4uCisKKyAgICAgICAgRGFzIFJlc3VsdGF0IGlzdCBlaW4gQXJyYXkgbWl0IGVpbmVtIEVpbnRyYWcgZnVlciBqZWRlbiBNYWdpZXIgKHVpZCkuCisgICAgICAgIEplZGVyIEVpbnRyYWcgZW50aGFlbHQgd2llZGVydW0gZWluIEFycmF5IG1pdCBmb2xnZW5kZW4gRWxlbWVudGVuOgorCisgICAgICAgICAgICBzdHJpbmcgIHdbV0xfTkFNRV0gICAgICAgICAgTmFtZSBkZXMgTWFnaWVycworICAgICAgICAgICAgaW50IHdbV0xfQ09NTUFORFNdICAgICAgICAgIEdld2ljaHRldGUgQW56YWhsIEtvbW1hbmRpLCBkaWUgdm9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWt0ZW4gZGllc2VzIEdvdHRlcyBhdXNnZWZ1ZWhydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHd1cmRlbgorICAgICAgICAgICAgaW50IHdbV0xfQ09TVEVdICAgICAgICAgICAgIEdld2ljaHRldGUgU3VtbWUgZGVyIEV2YWwtS29zdGVuCisgICAgICAgICAgICBpbnQgd1tXTF9HSUdBQ09TVF0gICAgICAgICAgR2V3aWNodGV0ZSBTdW1tZSBkZXIgRXZhbC1Lb3N0ZW4KKyAgICAgICAgICAgIGludCBXW1dMX1RPVEFMX0NPU1RdICAgICAgICBUb3RhbGUgU3VtbWUgZGVyIEV2YWwtS29zdGVuCisgICAgICAgICAgICBpbnQgd1tXTF9UT1RBTF9HSUdBQ09TVF0gICAgVG90YWxlIFN1bW1lIGRlciBFdmFsLUtvc3RlbgorICAgICAgICAgICAgaW50IHdbV0xfSEVBUlRfQkVBVF0gICAgICAgIEdld2ljaHRldGUgQW56YWhsIGRlciBoZWF0X2JlYXQoKXMKKyAgICAgICAgICAgIGludCB3W1dMX0NBTExfT1VUXSAgICAgICAgICBSZXNlcnZpZXJ0IGZ1ZXIgY2FsbF9vdXQoKXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmlzaGVyIG5pY2h0IGltcGxlbWVudGllcnQpCisgICAgICAgICAgICBpbnQgd1tXTF9BUlJBWV9UT1RBTF0gICAgICAgVG90YWxlIEdyb2Vzc2UgYWxsZXIgQXJyYXlzIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudGVuCisgICAgICAgICAgICBtaXhlZCB3W1dMX0VYVFJBXSAgICAgICAgICAgRGllIGVpZ2VudGxpY2hlIFdpemxpc3QtSW5mbworCisgICAgICAgIERpZSAiZ2V3aWNodGV0ZW4iIFdlcnRlIHZlcmZhbGxlbiBwcm8gU3R1bmRlIHVtIDEwJS4KKworQUVOREVSVU5HRU4KKyAgICAgICAgTERNdWQgMy4yLjEwIHRyZW5udGUgZGFzIGFsdGUgV0xfRVZBTF9DT1NUIGluIFdMX0NPU1QgdW5kIFdMX0dJR0FDT1NULAorICAgICAgICB1bSBsYWVuZ2VyZW4gVXB0aW1lcyBnZXJlY2h0IHp1IHdlcmRlbi4gQXVzc2VyZGVtIHd1cmRlCisgICAgICAgIFdMX1RPVEFMX0NPU1QgdW5kIFdMX1RPVEFMX0dJR0FDT1NUIGVpbmdlZnVlaHJ0LgorCitTSUVIRSBBVUNICisgICAgICAgIHByaXZpbGVnZV92aW9sYXRpb24oTSksIHNldF9leHRyYV93aXppbmZvX3NpemUoRSksCisgICAgICAgIGdldF9leHRyYV93aXppbmZvKEUpLCBzZXRfZXh0cmFfd2l6aW5mbyhFKQpkaWZmIC0tZ2l0IGEvZG9jL3N0ZC8uc3lub255bSBiL2RvYy9zdGQvLnN5bm9ueW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA4ZWUzMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zdGQvLnN5bm9ueW0KQEAgLTAsMCArMSw5IEBACithcm1vdXJzIGFybW91cgorcnVlc3R1bmcgYXJtb3VyCitydWVzdHVuZ2VuIGFybW91cgord2VhcG9ucyB3ZWFwb24KK3dhZmZlbiB3ZWFwb24KK3dhZmZlIHdlYXBvbgordW5pdHMgdW5pdAordmMgdmlydHVhbF9jb21waWxlcgorcmluZ2J1ZmZlciB1dGlsCmRpZmYgLS1naXQgYS9kb2Mvc3RkL2FybW91ciBiL2RvYy9zdGQvYXJtb3VyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MjFjZmMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc3RkL2FybW91cgpAQCAtMCwwICsxLDg3IEBACisgU1RBTkRBUkRLTEFTU0U6CisJIi9zdGQvYXJtb3VyIgorIAorIEJFTlVUWlVORzoKKyAgICAgICAgaW5oZXJpdCAiL3N0ZC9hcm1vdXIiOworIAorICAgICAgICAjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorICAgICAgICAjaW5jbHVkZSA8Y29tYmF0Lmg+CisKKyBQUk9QRVJUSUVTOgorICAgICBHcnVuZGxlZ2VuZDoKKwlQX0FDCQlzZXR6YmFyOiBSdWVzdHVuZ3NrbGFzc2UgPT0gU2NodXR6CisJUF9BUk1PVVJfVFlQRQlzZXR6YmFyOiBSdWVzdHVuZ3N0eXAKKworICAgICBCZXNvbmRlcmUgQXR0cmlidXRlIHVuZCBBbmZvcmRlcnVuZ2VuIGZ1ZXIgVHJhZWdlcjoKKwlQX1JFU1RSSUNUSU9OUwlzZXR6YmFyOiBBbmZvcmRlcnVuZ2VuIGFuIFRyYWVnZXIKKwlQX01fQVRUUl9NT0QJc2V0emJhcjogQXR0cmlidXRtb2RpZmlrYXRvciBmdWVyIFRyYWVnZXIKKwlQX1JFU0lTVEFOQ0VfU1RSRU5HVEhTCisJCQlzZXR6YmFyOiBSZXNpc3Rlbnptb2RpZmlrYXRvciBmdWVyIFRyYWVnZXIKKwlQX05SX0hBTkRTCXNldHpiYXI6IG5vdHdlbmRpZ2UgSGFuZGFuemFobCAoekIgU2NoaWxkZSkKKwlQX0NVUlNFRAlzZXR6YmFyOiBWZXJmbHVjaHVuZyAobmljaHQgYXVzemllaGJhcikKKworICAgICBNZWxkdW5nZW4gdW5kIFplaXRwdW5rdGU6CisJUF9FUVVJUF9USU1FCWVudGhhZWx0IGRlbiBaZWl0cHVua3QgZGVzIEFuemllaGVucworCVBfTEFTVF9VU0UJZW50aGFlbHQgZGVuIFplaXRwdW5rdCBkZXMgbGV0enRlbiBUcmVmZmVycworCVBfV09STgkJZW50aGFlbHQgZGVuIFRyYWVnZXIKKwlQX1dFQVJfTVNHCXNldHpiYXI6IGVpZ2VuZSBBbnppZWhtZWxkdW5nZW4KKwlQX1VOV0VBUl9NU0cJc2V0emJhcjogZWlnZW5lIEF1c3ppZWhtZWxkdW5nZW4KKworICAgICBEeW5hbWlzY2hlcyBWZXJoYWx0ZW4gaW4gS2FtcGYgdW5kIGJlaW0gQW56aWVoZW46CisJUF9XRUFSX0ZVTkMJc2V0emJhcjogT2JqZWt0IG1pdCBBbnppZWhmdW5rdGlvbiAiV2VhckZ1bmMoKSIKKwlQX1JFTU9WRV9GVU5DCXNldHpiYXI6IE9iamVrdCBtaXQgQXVzemllaGZ1bmt0aW9uICJSZW1vdmVGdW5jKCkiCisJUF9ERUZFTkRfRlVOQwlzZXR6YmFyOiBPYmpla3QgbWl0IERlZmVuc2l2ZnVua3Rpb24gIkRlZmVuZEZ1bmMoKSIKKworICAgICBadXNhZXR6bGljaGUgRWlnZW5zY2hhZnRlbjoKKwlQX0RBTUFHRUQJZW50aGFlbHQgZGVuIEF1c21hc3MgZGVzIFNjaGFkZW5zIGFuIFdhZmZlCisJUF9RVUFMSVRZCXNldHpiYXI6IFF1YWxpdOR0L0hhbHRiYXJrZWl0IGRlciBXYWZmZQorCVBfRUZGRUNUSVZFX0FDCXNldHpiYXI6IGZhbGxzIERlZmVuZEZ1bmMgQUMgbmljaHQgc2ljaGJhciBhZW5kZXJ0CisJUF9EQU1fVFlQRQlzZXR6YmFyOiBpbnRlcmVzc2FudCBiZWkgS2FlbXBmZXJhbmdyaWZmZW4KKworICAgICBadXNhZXR6bGljaCBzaW5kIGFsbGUgUHJvcGVydGllcyBhdXMgL3N0ZC90aGluZyB2ZXJmdWVnYmFyLCBhbHNvCisgICAgIGJpdHRlIGF1Y2ggZm9sZ2VuZGUgc2V0emVuOgorCVBfTUFURVJJQUwJc2V0emJhcjogWnVzYW1tZW5zZXR6dW5nCisJUF9TSVpFCQlzZXR6YmFyOiBHcm9lc3NlCisJUF9XRUlHSFQJc2V0emJhcjogR2V3aWNodAorCisgTUFLUk9TOgorICAgICBHdWVsdGlnZSBSdWVzdHVuZ3N0eXBlbiAoZGVmaW5pZXJ0IGluICIvc3lzL2NvbWJhdC5oIikuCisgCisgRVJMQUVVVEVSVU5HOgorICAgICBCYXNpc2tsYXNzZSBmdWVyIGFsbGUgUnVlc3R1bmdlbiBpbSBTcGllbC4gU2llIGlzdCB2b24gIi9zdGQvY2xvdGhpbmciCisgICAgIGFiZ2VsZWl0ZXQgdW5kIGVudGhhZWx0IGFsbGUgenVzYWV0emxpY2hlIEZ1bmt0aW9uYWxpdGFldAorICAgICBmdWVyIGRlbiBLYW1wZi4KKworICAgICBWb3IgZGVyIFByb2dyYW1taWVydW5nIHZvbiBSdWVzdHVuZ2VuIHNvbGx0ZSAvZG9jL01HL3dhZmZlbl93ZXJ0ZQorICAgICBnZWxlc2VuIHdlcmRlbi4gRGllIFJlZ2VsbiBkYXJpbiBzaW5kIHZlcmJpbmRsaWNoIHVuZCBzb2xsdGVuIG51cgorICAgICBpbiBBdXNuYWhtZWZhZWxsZW4gdW5kIG1pdCBBYnNwcmFjaGUgbWl0IGRlbSBFcnptYWdpZXIgZnVlciAKKyAgICAgV2FmZmVuL1J1ZXN0dW5nZW4vTW9uc3RlciB1ZWJlcnNjaHJpdHRlbiB3ZXJkZW4uCisgICAgIEdlcmFkZSBpbiBEZWZlbmRGdW5jcyBzb2xsdGUgYXVmIGRpZSBrb3JyZWt0ZSBCZWhhbmRsdW5nIGRlcgorICAgICB1ZWJlcmdlYmVuZW4gU3BlbGxmbGFncyBnZWFjaHRldCB3ZXJkZW4gLSBpbnNiZXNvbmRlcmUgU1BfUkVDVVJTSVZFCisgICAgIHVuZCBTUF9OT19BQ1RJVkVfREVGRU5TRS4KKworICAgICBEaWUgTWF4aW1hbHdlcnRlIHVuZCBXZXJ0ZSBmdWVyIFplcnN0b2VydW5nIGJlaSBWZXJrYXVmIHNpbmQKKyAgICAgL3N5cy9jb21iYXQuaCB6dSBlbnRuZWhtZW46IFZBTElEX0FSTU9VUl9DTEFTUy9LRUVQX0FSTU9VUl9DTEFTUy4KKworIFZFUkVSQlVOR1NCQVVNOgorICAgICBbL3N0ZC9hcm1vdXJdCisgICAgIC4uLi4uIFsvc3RkL3RoaW5nL3Byb3BlcnRpZXNdCisgICAgIC4uLi4uIFsvc3RkL3RoaW5nL2xhbmd1YWdlXQorICAgICAuLi4uLiBbL3N0ZC90aGluZy9jb21tYW5kc10KKyAgICAgLi4uLi4gWy9zdGQvdGhpbmcvcmVzdHJpY3Rpb25zXQorICAgICAuLi4uLiBbL3N0ZC90aGluZy9lbnZjaGtdCisgICAgIC4uLi4uIFsvc3RkL2FybW91ci9kZXNjcmlwdGlvbl0KKyAgICAgLi4uLi4uLi4uLiBbL3N0ZC9jbG90aGluZy9kZXNjcmlwdGlvbl0KKyAgICAgLi4uLi4uLi4uLi4uLi4gWy9zdGQvdGhpbmcvZGVzY3JpcHRpb25dCisgICAgIC4uLi4uIFsvc3RkL2FybW91ci93ZWFyXQorICAgICAuLi4uLi4uLi4uIFsvc3RkL2Nsb3RoaW5nL3dlYXJdCisgICAgIC4uLi4uIFsvc3RkL2Nsb3RoaW5nL21vdmluZ10KKyAgICAgLi4uLi4uLi4uLiBbL3N0ZC90aGluZy9tb3ZpbmddCisgICAgIC4uLi4uIFsvc3RkL2FybW91ci9jb21iYXRdCisKKyBTSUVIRSBBVUNIOgorICAgICBQX0FSTU9VUlMsIFBfTEFTVF9XRUFSX0FDVElPTiwgUF9UT1RBTF9BQworICAgICBBdHRhY2soKSwgRGVmZW5kKCksIC9kb2Mvd2l6L3J1ZXN0dW5nZW4sIGJhbGFuY2UKKworMDMuMDguMjAwNywgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2Mvc3RkL2Nsb3RoaW5nIGIvZG9jL3N0ZC9jbG90aGluZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWNjYjU1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3N0ZC9jbG90aGluZwpAQCAtMCwwICsxLDc3IEBACisgU1RBTkRBUkRLTEFTU0U6CisJIi9zdGQvY2xvdGhpbmciCisgCisgQkVOVVRaVU5HOgorICAgICAgICBpbmhlcml0ICIvc3RkL2Nsb3RoaW5nIjsKKyAKKyAgICAgICAgI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyAgICAgICAgI2luY2x1ZGUgPGNsb3RoaW5nLmg+CisKKyBQUk9QRVJUSUVTOgorCisgICAgIEJlc29uZGVyZSBBdHRyaWJ1dGUgdW5kIEFuZm9yZGVydW5nZW4gZnVlciBUcmFlZ2VyOgorCVBfUkVTVFJJQ1RJT05TCXNldHpiYXI6IEFuZm9yZGVydW5nZW4gYW4gVHJhZWdlcgorCVBfQ1VSU0VECXNldHpiYXI6IFZlcmZsdWNodW5nIChuaWNodCBhdXN6aWVoYmFyKQorCisgICAgIE1lbGR1bmdlbiB1bmQgWmVpdHB1bmt0ZToKKwlQX0VRVUlQX1RJTUUJZW50aGFlbHQgZGVuIFplaXRwdW5rdCBkZXMgQW56aWVoZW5zCisJUF9XT1JOCQllbnRoYWVsdCBkZW4gVHJhZWdlcgorCVBfV0VBUl9NU0cJc2V0emJhcjogZWlnZW5lIEFuemllaG1lbGR1bmdlbgorCVBfVU5XRUFSX01TRwlzZXR6YmFyOiBlaWdlbmUgQXVzemllaG1lbGR1bmdlbgorCisgICAgIER5bmFtaXNjaGVzIFZlcmhhbHRlbiBpbiBLYW1wZiB1bmQgYmVpbSBBbnppZWhlbjoKKwlQX1dFQVJfRlVOQwlzZXR6YmFyOiBPYmpla3QgbWl0IEFuemllaGZ1bmt0aW9uICJXZWFyRnVuYygpIgorCVBfUkVNT1ZFX0ZVTkMJc2V0emJhcjogT2JqZWt0IG1pdCBBdXN6aWVoZnVua3Rpb24gIlJlbW92ZUZ1bmMoKSIKKworICAgICBadXNhZXR6bGljaCBzaW5kIGFsbGUgUHJvcGVydGllcyBhdXMgL3N0ZC90aGluZyB2ZXJmdWVnYmFyLCBhbHNvCisgICAgIGJpdHRlIGF1Y2ggZm9sZ2VuZGUgc2V0emVuOgorCVBfTUFURVJJQUwJc2V0emJhcjogWnVzYW1tZW5zZXR6dW5nCisJUF9TSVpFCQlzZXR6YmFyOiBHcm9lc3NlCisJUF9XRUlHSFQJc2V0emJhcjogR2V3aWNodAorCisgCisgRVJMQUVVVEVSVU5HOgorICAgICBCYXNpc2tsYXNzZSBmdWVyIGFsbGUgS2xlaWR1bmdlbiBpbSBTcGllbC4gU2llIGlzdCB2b24gIi9zdGQvdGhpbmciCisgICAgIGFiZ2VsZWl0ZXQuCisgICAgIEtsZWlkdW5nIGJlbGVndCBuaWVtYWxzIGVpbmVuIFJ1ZXN0dW5nc3Nsb3QgdW5kIGlzdCBudXIgZnVlciBLcmFtCisgICAgIGdlZGFjaHQsIGRlciBrZWluZSBrYW1wZnJlbGV2YW50ZSBGdW5rdGlvbmFsaXRhZXQgYmVlaW5oYWx0ZXQuCisgICAgIE1vbWVudGFuIGlzdCBkaWUgQW56YWhsIGFuIEtsZWlkdW5nc3N0dWVja2VuLCBkaWUgZWluIFNwaWVsZXIgYW56aWVoZW4KKyAgICAga2FubiwgbmljaHQgYmVncmVuenQuCisgICAgIEtsZWlkdW5nIHNpbmQgaW0gUHJpbnppcCBSdWVzdHVuZ2VuIG9obmUgYWxsZSBpbiBkZW4gUnVlc3R1bmdlbgorICAgICBlbnRoYWx0ZW5lIGthbXBmcmVsZXZhbnRlIEZ1bmt0aW9uYWxpdGFldC4KKyAgICAgKEJUVzogS2xlaWR1bmdlbiBrb2VubmVuIGFsbGVyZGluZ3MsIHNvZmVybiB1bmJlZGluZ3Qgbm90d2VuZGlnLCBtaXR0ZWxzCisgICAgICBQX1NFTlNJVElWRSwgUF9TRU5TSVRJVkVfQVRUQUNLLCBldGMuIGF1Y2ggaW5kaXJla3QgYW0gS2FtcGYgdGVpbG5laG1lbiwKKyAgICAgIGluIGRlbSBTaW5uZSwgZGFzcyBzaWUgYXVmIGVpbmdlaGVuZGVuIFNjaGFkZW4gcmVhZ2llcmVuLiBIaWVyYmVpIGRhcmYKKyAgICAgIGFsbGVyZGluZ3MgaW4ga2VpbmVtIEZhbGwgaW4gZGVuIEthbXBmdmVybGF1ZiBlaW5nZWdyaWZmZW4gd2VyZGVuLikKKworICAgICBTcGV6aWVsbGUgUHJvcGVydGllczoKKyAgICAgU2V0UHJvcChQX1dFQVJfRlVOQywgb2IpCisJU2V0enQgZGFzIE9iamVrdCwgaW4gZGVtIGRpZSBGdW5rdGlvbiBXZWFyRnVuYygpIGRlZmluaWVydAorCXdpcmQuIFdlYXJGdW5jKCkgd2lyZCBiZWltIFZlcnN1Y2ggZGllIEtsZWlkdW5nIGFuenV6aWVoZW4KKwlhdWZnZXJ1ZmVuLCBnaWJ0IHNpZSAwIHp1cnVlY2sgc28gc2NoZWl0ZXJ0IGRlciBWZXJzdWNoLgorICAgICBTZXRQcm9wKFBfUkVNT1ZFX0ZVTkMsIG9iKQorCVNldHp0IGRhcyBPYmpla3QsIGluIGRlbSBkaWUgRnVua3Rpb24gUmVtb3ZlRnVuYygpIGRlZmluaWVydAorCWlzdC4gRGllIEZ1bmt0aW9uIHdpcmQgYmVpbSBWZXJzdWNoIGRpZSBLbGVpZHVuZyBhdXN6dXppZWhlbgorCWF1ZmdlcnVmZW4sIGdpYnQgc2llIDAgenVydWVjaywgc28gc2NoZWl0ZXJ0IGRlciBWZXJzdWNoLgorCisKKyBWRVJFUkJVTkdTQkFVTToKKyAgICAgWy9zdGQvY2xvdGhpbmddCisgICAgIC4uLi4uIFsvc3RkL3RoaW5nL3Byb3BlcnRpZXNdCisgICAgIC4uLi4uIFsvc3RkL3RoaW5nL2xhbmd1YWdlXQorICAgICAuLi4uLiBbL3N0ZC90aGluZy9jb21tYW5kc10KKyAgICAgLi4uLi4gWy9zdGQvdGhpbmcvcmVzdHJpY3Rpb25zXQorICAgICAuLi4uLiBbL3N0ZC90aGluZy9lbnZjaGtdCisgICAgIC4uLi4uIFsvc3RkL2Nsb3RoaW5nL2Rlc2NyaXB0aW9uXQorICAgICAuLi4uLi4uLi4uIFsvc3RkL3RoaW5nL2Rlc2NyaXB0aW9uXQorICAgICAuLi4uLiBbL3N0ZC9jbG90aGluZy9tb3ZpbmddCisgICAgIC4uLi4uLi4uLi4gWy9zdGQvdGhpbmcvbW92aW5nXQorICAgICAuLi4uLiBbL3N0ZC9jbG90aGluZy93ZWFyXQorCisgU0lFSEUgQVVDSDoKKyAgICAgYXJtb3VycywKKyAgICAgRmlsdGVyQ2xvdGhpbmcsIEZpbHRlckFybW91cnMsIFdlYXIoKSwgVW53ZWFyKCksIFdlYXJBcm1vdXIoKSwKKyAgICAgV2VhckNsb3RoaW5nKCksIFVud2VhckFybW91cigpLCBVbndlYXJDbG90aGluZygpIAorCisxNS4wMi4yMDA5LCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy9zdGQvY29udGFpbmVyIGIvZG9jL3N0ZC9jb250YWluZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY3MDc4YQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zdGQvY29udGFpbmVyCkBAIC0wLDAgKzEsNDkgQEAKK09CSkVDVDoKKwljb250YWluZXIgCisKKworREVTQ1JJUFRJT046CisJQSBjb2ludGFpbmVyIGlzIGEgc3BlY2lhbCBvYmplY3Qgd2hpY2ggY2FuIGNvbnRhaW4gb3RoZXIgb2JqZWN0cy4KKwlJdCBwcm92aWRlcyB0aGUgc2FtZSBmdW5jdGlvbnMgYXMgdGhlIHRoaW5nKFMpIGNsYXNzLCBidXQgYWRkcworCXNvbWUgZnVuY3Rpb25zIGZvciB0aGUgaGFuZGxpbmcgb2YgY29udGVudHMuIEl0IGRlZmluZXMgc29tZQorCXByb3BlcnRpZXMgcmVsYXRlZCB0byB3aGF0IGFuZCBob3cgbXVjaCBpcyBjb250YWluZWQgaW4gaXQuCisKKwlUaGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgcHJvcGVydGllcyBhcmUgZGVmaW5lZCBmb3IgYSBjb250YWluZXI6CisJUF9NQVhfV0VJR0hULCBQX1dFSUdIVF9DT05URU5UUworCisJTm90ZSB0aGF0IHRoZSB3ZWlnaHQgb2YgYSBjb250YWluZXIgaXMgaGFuZGxlZCBlc3BlY2lhbGx5OgorCVNldFByb3AoUF9XRUlHSFQsd2VpZ2h0KSBzZXRzIHRoZSB3ZWlnaHQgb2YgdGhlIGNvbnRhaW5lcgorCXdpdGhvdXQgY29udGVudHMsIHdoaWxlIFF1ZXJ5UHJvcChQX1dFSUdIVCkgcmV0dXJucyB0aGUgdG90YWwKKwl3ZWlnaHQgb2YgdGhlIGNvbnRhaW5lciBwbHVzIGNvbnRlbnRzLgorCisJRm9yIG5vdywgeW91IG1heSB1c2UgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiB0byBhZGQgb3IgcmVtb3ZlCisJd2VpZ2h0IGZyb20gdGhlIGNvbnRhaW5lci4KKworCUFkZFdlaWdodCh3ZWlnaHQpCisJICBBZGRzIDx3ZWlnaHQ+IHRvIHRoZSBjb250YWluZXIuIElmIGl0cyBPSywgMSBpcyByZXR1cm5lZCwKKwkgIG90aGVyd2lzZSAwLiBPbmx5IGlmIHRoZSB3ZWlnaHQgZml0cyBpbnRvIHRoZSBjb250YWluZXIsIHRoZQorCSAgd2VpZ2h0IGlzIGFkanVzdGVkLgorCisJTWF5QWRkV2VpZ2h0KHdlaWdodCkKKwkgIExpa2UgQWRkV2VpZ2h0LCBidXQgaWYgdGhlIHdlaWdodCBmaXRzIGluc2lkZSB0aGUgY29udGFpbmVyLAorCSAgdGhlIHRvdGFsIHdlaWdodCBpcyBOT1QgdXBkYXRlZC4gWW91IG1heSB1c2UgdGhpcyBmdW5jdGlvbiB0bworCSAgdGVzdCBpZiBhbiBvYmplY3QgZml0cyBpbnRvIGEgY29udGFpbmVyLgorCisJTk9URTogQ3VycmVudGx5LCB0aGVzZSBmdW5jdGlvbnMgbWF5IGJlIGNhbGxlZCBmcm9tIG91dHNpZGUuCisJSW4gYSBhbHRlciBzdGFnZSwgbW92ZW1lbnQgb2Ygb2JqZWN0cyB3aWxsIGJlIGRvbmUgYnkgY2FsbGluZworCXRoZSBtb3ZlKCkgZnVuY3Rpb24gaW4gdGhlIG9iamVjdCB0byBiZSBtb3ZlZC4gVGhlIG1vdmUoKQorCWZ1bmN0aW9uIG9mIHRoYXQgb2JqZWN0IHdpbGwgdGhlbiBjYWxsIChNYXkpQWRkV2VpZ2h0KCkgaXRzZWxmCisJdG8gZGV0ZXJtaW5lIGlmIGl0IG1heSBlbnRlciB0aGUgY29udGFpbmVyLgorCisKK0lOSEVSSVRBTkNFIFRSRUU6CisJY29udGFpbmVyCisJICB8LXRoaW5nL21vdmluZworCSAgfC10aGluZy9wcm9wZXJ0aWVzCisJICB8LWNvbnRhaW5lci9kZXNjcmlwdGlvbgorCSAgfCAgIGAtdGhpbmcvZGVzY3JpcHRpb24KKwkgIGAtY29udGFpbmVyL3Jlc3RyaWN0aW9ucworCisKK1NFRSBBTFNPOgorCXRoaW5nKFMpCmRpZmYgLS1naXQgYS9kb2Mvc3RkL2NvcnBzZSBiL2RvYy9zdGQvY29ycHNlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZTJkNDcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc3RkL2NvcnBzZQpAQCAtMCwwICsxLDc2IEBACitPQkpFS1Q6CisgICAgICBjb3Jwc2UKKworCitTWU5PUFNJUzoKKyAgICAgIGluaGVyaXQgInN0ZC9jb3Jwc2UiOworCisKK0JFU0NIUkVJQlVORzoKKyAgICAgIERpZSBTdGFuZGFyZGxlaWNoZSBpc3QgZWluIHNwZXppZWxsZXIgQ29udGFpbmVyLiBFciBiZWluaGFsdGV0IGRpZQorICAgICAgenVydWVja2dlbGFzc2VuZSBBdXNydWVzdHVuZyBnZXN0b3JiZW5lciBOUENzIHVuZCBTcGllbGVyLgorICAgICAgRGllIFN0YW5kYXJkbGVpY2hlIHZlcmZhdWx0IG1pdCBkZXIgWmVpdCB1bmQgc3RlbGx0IGVpbiBwYWFyCisgICAgICBGdW5rdGlvbmFsaXRhZXRlbiB6dXIgVmVyZnVlZ3VuZywgbmFlbWxpY2ggZGFzIEVzc2VuIGRlciBMZWljaGUKKyAgICAgIHVuZCBkYXMgVmVyc3BvdHRlbiBhdWYgZGVtIE1vZXJkZXJrYW5hbC4KKyAgICAgIERpZSBGdW5rdGlvbgorICAgICAgICB2b2lkIElkZW50aWZ5KCBvYmplY3Qgb2IgKTsKKyAgICAgIHdpcmQgaW0gZGllKCkgZWluZXMgTGl2aW5ncyBhdWZnZXJ1ZmVuLCBkYW1pdCBkaWUgTGVpY2hlIEluZm9ybWF0aW9uZW4KKyAgICAgIGF1cyBkZW0gTGl2aW5nIGF1c2xlc2VuIGthbm4sIGVoZSBkaWVzZXIgZW5kZ3VlbHRpZyBzdGlyYnQuIFNjaHJlaWJ0CisgICAgICBtYW4gZWluZSBlaWdlbmUgTGVpY2hlLCBkYW5uIGlzdCBkaWVzIGRpZSBnZWVpZ25ldGUgTW9lZ2xpY2hrZWl0LCBkZXIKKyAgICAgIExlaWNoZSBJbmZvcm1hdGlvbmVuIHp1a29tbWVuIHp1IGxhc3Nlbi4KKworCitCRUlTUElFTEU6CisgICAgICAvLyBFaW5lIGVpZ2VuZSBMZWljaGUuCisgICAgICAjaW5oZXJpdCAic3RkL2NvcnBzZSI7CisKKyAgICAgIHZvaWQgY3JlYXRlKCkKKyAgICAgIHsKKyAgICAgICAgOjpjcmVhdGUoKTsKKyAgICAgICAgLy8gSXJnZW5kd2FzIGVpZ2VuZXMuLi4KKyAgICAgIH0KKworICAgICAgLyoKKyAgICAgICAqIERpZXNlciBGdW5rdGlvbiB3aXJkIGRlciBnZXRvZXRldGUgTGl2aW5nIHVlYmVyZ2ViZW4uCisgICAgICAgKi8KKyAgICAgIHZvaWQgSWRlbnRpZnkob2JqZWN0IG9iKQorICAgICAgeworICAgICAgICA6OklkZW50aWZ5KG9iKTsKKyAgICAgICAgaWYgKG9iKQorICAgICAgICB7CisgICAgICAgICAgb2ItPlF1ZXJ5UHJvcCgibWVpbmVfdG9sbGVfcHJvcGVydHkiKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKgorICAgICAgICogRGFzIGlzdCBkaWUgZvxyICJpc3MgbGVpY2hlIiBhdWZnZXJ1ZmVuZSBGdW5rdGlvbi4KKyAgICAgICAqLworICAgICAgaW50IG1hbXBmKCBzdHJpbmcgc3RyICkKKyAgICAgIHsKKyAgICAgICAgbm90aWZ5X2ZhaWwoIldhcyB3aWxsc3QgRHUgZXNzZW4/XG4iKTsKKyAgICAgICAgaWYgKCFzdHIgfHwgIWlkKHN0cikgKSByZXR1cm4gMDsKKyAgICAgICAgdGVsbF9vYmplY3QodGhpc19wbGF5ZXIoKSwgIkRpZXNlIExlaWNoZSBrYW5uIG1hbiBuaWNodCBlc3Nlbi5cbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKworCisKK0JFTUVSS1VORzoKKyAgICAgIE1hbiBrYW5uIGVpZ2VuZSBMZWljaGVuIHNjaHJlaWJlbiwgZGllIHZvbiBkZXIgU3RhbmRhcmRsZWljaGUgZXJiZW4KKyAgICAgIG9kZXIgYXVjaCBuaWNodC4gTWFuIHNvbGx0ZSBkYW5uIGFiZXIgZGllIGltIGRpZSgpIGF1ZmdlcnVmZW5lbgorICAgICAgRnVua3Rpb25lbiBpbXBsZW1lbnRpZXJlbjoKKyAgICAgICAgY29ycHNlLT5JZGVudGlmeShvYmplY3Qgb2IpOworCWNvcnBzZS0+U2V0UHJvcCgqKiopOyAvLyBGdWVyIFBfSEVBTAorCWNvcnBzZS0+bW92ZSgqKiopOyAvLyBVbSBzaWUgaW5zIGVudmlyb25tZW50KCkgZGVzIFRvdGVuIHp1IGJla29tbWVuLgorICAgICAgRGllIExlaWNoZSBzb2xsdGUsIG11c3MgYWJlciBrZWluIENvbnRhaW5lciBzZWluLCBkYW1pdCBkaWUgQXVzcnVlc3R1bmcKKyAgICAgIGhpbmVpbmJld2VndCB3ZXJkZW4ga2Fubi4KKyAgICAgIFdlbm4gbWFuIG5pY2h0IHZvbiBkZXIgU3RhbmRhcmRsZWljaGUgZXJidCwga29tbXQgc2llIG5pY2h0IGF1ZiAtTW9lcmRlcgorICAgICAgdW5kIG1hbiBrYW5uIHNpZSBuaWNodCB2ZXJzcG90dGVuLiBEYW1pdCBkaWVzIGdlaHQsIG11c3MgKCEpIG1hbiB2b24gZGVyCisgICAgICBTdGFuZGFyZGxlaWNoZSBlcmJlbi4KKworU0lFSEUgQVVDSDoKKyAgICAgIFBfTk9DT1JQU0UsIFBfQ09SUFNFLCBQX0hFQUwsIFF1ZXJ5SGVhbEluZm8oKQorCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xldHp0ZSBBZW5kZXJ1bmc6IDMxLjAzLjIwMDgsIEFyYXRob3JuCmRpZmYgLS1naXQgYS9kb2Mvc3RkL2hvb2tzIGIvZG9jL3N0ZC9ob29rcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTMwOGJkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3N0ZC9ob29rcwpAQCAtMCwwICsxLDI3OCBAQAorRGFzIG5ldWUgSG9va3N5c3RlbQorKEltcGxlbWVudGllcnVuZyB2b24gTXVhZGliLCB1ZWJlcmFyYmVpdGV0IHZvbiBaZXNzdHJhKQorCitFSU5MRUlUVU5HCis9PT09PT09PT09CitEYXMgbmV1ZSBIb29rc3lzdGVtIGJhdXQgbmljaHQgbWVociBhdWYgZGVyIEVpbnRyYWd1bmcgZWluZXMgSG9va3MgaW4gZWluZXIKK1Byb3BlcnR5IGF1Zi4gRGFkdXJjaCB3aXJkIGVzIG1vZWdsaWNoLCBkYXNzIG5pY2h0IG51ciBlaW4gT2JqZWt0IHNpY2ggYWxzCitIb29rIGVpbnRyYWVndC4KKworRXMgZ2lidCB2ZXJzY2hpZWRlbmVuIEFydGVuIHZvbiBIb29rcywgZGllIG1hbiBlaW50cmFnZW4ga2FubjoKKyogTGlzdGVuZXIgKEhfTElTVEVORVIpCisgICAgICAgICAgICBkaWVzZSBIb29rcyB3ZXJkZW4gdWViZXIgZWluIEVyZWlnbmlzIG51ciBpbmZvcm1pZXJ0LAorICAgICAgICAgICAga29lbm5lbiBhYmVyIG5pY2h0IGVpbmdyZWlmZW4gb2RlciBhZW5kZXJuLgorICAgICAgICAgICAgbWF4LiBBbnphaGw6IDUKKyogRGF0YS1Nb2RpZmllciAoSF9EQVRBX01PRElGSUNBVE9SKQorICAgICAgICAgICAgZGllc2UgSG9va3MgZHVlcmZlbiBkaWUgRGF0ZW4gZWluZXMgRXJlaWduaXNzZXMgYWVuZGVybi4KKyAgICAgICAgICAgIG1heC4gQW56YWhsOiAzCisqIEhvb2stTW9kaWZpZXIgKEhfSE9PS19NT0RJRklDQVRPUikKKyAgICAgICAgICAgIGRpZXNlIEhvb2tzIGR1ZXJmZW4gZGllIERhdGVuIGRlcyBFcmVpZ25pc3NlcyBhZW5kZXJuIHVuZAorICAgICAgICAgICAgenVzYWV0emxpY2ggZGFzIEVyZWlnbmlzIGF1Y2ggYWJicmVjaGVuLgorICAgICAgICAgICAgbWF4LiBBbnphaGw6IDIKKyogU3VydmV5b3IgKEhfSE9PS19TVVJWRVlPUikKKyAgICAgICAgICAgIGRpZXNlIEhvb2tzIGR1ZXJmZW4gYWxsZXMgb2JlbiBiZXNjaHJpZWJlbmUuIFp1c2FldHpsaWNoIHdlcmRlbgorICAgICAgICAgICAgc2llIGFiZXIgYXVjaCBnZWZyYWd0LCB3ZW5uIGFuZGVyZSBPYmpla3RlIGVpbmVuIEhvb2sgZWludHJhZ2VuCisgICAgICAgICAgICB3b2xsZW4sIGVpbmVuIEhvb2sgYWJicmVjaGVuIHdvbGxlbiBvZGVyIERhdGVuIGFlbmRlcm4gd29sbGVuLgorICAgICAgICAgICAgT2RlciBhbmRlcnM6IFN1cnZleW9yaG9va3MgZW50c2NoZWlkZW4sIHdhcyBhbmRlcmUgZHVlcmZlbi4KKyAgICAgICAgICAgIEtlaW4gbm9ybWFsZXMgT2JqZWt0ZSBzb2xsdGUgZGllc2UgQXJ0IHZvbiBIb29rIGVpbnRyYWdlbi4gRGVyIFJNCisgICAgICAgICAgICBtdXNzIGRpZSBWZXJ3ZW5kdW5nIGVpbmVzIFN1cnZleW9ycyBnZW5laG1pZ2VuLgorICAgICAgICAgICAgbWF4LiBBbnphaGw6IDEKKworQXVzc2VyZGVtIGxhc3NlbiBzaWNoIEhvb2tzIG5vY2ggbWl0IHVudGVyc2NoaWVkbGljaGVyIFByaW9yaXRhZXQgZWludHJhZ2VuLAord2VsY2hlIGRhbm4gaW4gZGVyIGVudHNwcmVjaGVuZGVuIFJlaWhlbmZvbGdlIGFiZ2VhcmJlaXRldCB3ZXJkZW4uIFdlbm4gZWluCituZXVlciBIb29rIGVpbmdldHJhZ2VuIHdpcmQsIGFiZXIgZWlnZW50bGljaCBkaWUgbWF4LiBBbnphaGwgc2Nob24gZXJyZWljaHQKK3dpcmQsIHdpcmQgZGVyIEtvbnN1bWVudCBtaXQgZGVyIG5pZWRyaWdzdGVuIFByaW9yaXRhZXQgZ2Vsb2VzY2h0LiBJbiBkaWVzZW0KK0ZhbGwgd2lyZCBkaWUgc3VwZXJzZWVkZWRIb29rKCkgaW0gdmVyZHJhZW5ndGVuIEtvbnN1bWVudGVuIGdlcnVmZW4uCisKK1VtIGRhcyBuZXVlIEhvb2stU3lzdGVtIHp1IHJlYWxpc2llcmVuLCBnaWJ0IGVzIHp3ZWkgd2VzZW50bGljaGUgS2xhc3Nlbi4KK0RpZSBPYmpla3RlLCBkaWUgZGllIEVpbnRyYWd1bmcgdm9uIEhvb2tzIGVybGF1YmVuLCBlcmJlbiBoaWVyenUgdm9uCitob29rX3Byb3ZpZGVyLiBPYmpla3RlLCBkaWUgZWluZW4gU3VydmV5b3ItSG9vayBlaW50cmFnZW4gd29sbGVuLCBzb2xsdGVuIHZvbgorZGVyIEtsYXNzZSBob29rX3N1cnZleW9yIGVyYmVuLiBPYmpla3RlIG1pdCBub3JtYWxlbiBIb29rcyBicmF1Y2hlbiBuaWNodHMgenUKK2VyYmVuLgorCisKK1dlbGNoZSBIb29rcyBnaWJ0IGVzIHp1ciBaZWl0IGluIGRlciBCYXNpcy1NdWRsaWI/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqIEhfSE9PS19NT1ZFCisgIEJlaSBCZXdlZ3VuZyBlaW5lcyBPYmpla3RlcyBhdXNnZWxvZXN0LiBLYW5uIEJld2VndW5nIGJlZWluZmx1c3NlbiBvZGVyCisgIGFiYnJlY2hlbi4KKyogSF9IT09LX0RJRQorICBCZWltIFRvZCBlaW5lcyBMZWJld2VzZW5zIGF1c2dlbG9lc3QuIEthbm4gZGVuIFRvZCBhYmJyZWNoZW4gb2RlcgorICA8cG9pc29uZGVhdGg+IGFiYWVuZGVybi4KKyogSF9IT09LX0RFRkVORAorICBJbSBEZWZlbmQoKSBlaW5lcyBMZWJlbndlc2VucyBhdXNnZWxvZXN0LiBLYW5uIGRhcyBEZWZlbmQoKSBhYmJyZWNoZW4gdW5kCisgIERhdGVuIGRlcyBEZWZlbmQoKSBhZW5kZXJuLgorKiBIX0hPT0tfQVRUQUNLCisgIEltIEF0dGFjaygpIGVpbmVzIExlYmVud2VzZW5zIGF1c2dlbG9lc3QuIEthbm4gZGFzIEF0dGFjaygpIGFiYnJlY2hlbi4KKyogSF9IT09LX0hQCisgIEJlaSBWZXJhZW5kZXJ1bmcgZGVyIEhQIChMUCkgZWluZXMgTGViZXdlc2VucyBnZXJ1ZmVuLiAoWnVyIFplaXQga2VpbmUKKyAgRGF0ZW52ZXJhZW5kZXJ1bmcgbW9lZ2xpY2gpCisqIEhfSE9PS19TUAorICBCZWkgVmVyYWVuZGVydW5nIGRlciBTUCAoS1ApIGVpbmVzIExlYmV3ZXNlbnMgZ2VydWZlbi4gKFp1ciBaZWl0IGtlaW5lCisgIERhdGVudmVyYWVuZGVydW5nIG1vZWdsaWNoKQorKiBIX0hPT0tfQVRUQUNLX01PRAorICBXaXJkIGltIEF0dGFjaygpIGF1c2dlbG9lc3QsIG5hY2hkZW0gZGllIGZ1ZXIgZGVuIEFuZ3JpZmYgd2ljaHRpZ2VuIERhdGVuCisgIGVybWl0dGVsdCB1bmQgYmVyZWNobmV0IHd1cmRlbi4gRGllc2Uga29lbm5lbiBkYW5uIHZvbSBIb29rb25zdW1lbnRlbgorICBub2NobWFsIGdlYWVuZGVydCB3ZXJkZW4uIEF1Y2ggZWluIEFiYnJ1Y2ggZGVzIEF0dGFjaygpIGlzdCBoaWVyIG5vY2gKKyAgbW9lZ2xpY2guCisqIEhfSE9PS19BTENPSE9MCisgIEJlaSBWZXJhZW5kZXJ1bmcgdm9uIFBfQUxDT0hPTCBpbSBMZWJld2VzZW5zIGdlcnVmZW4uCisqIEhfSE9PS19GT09ECisgIEJlaSBWZXJhZW5kZXJ1bmcgdm9uIFBfRk9PRCBpbSBMZWJld2VzZW5zIGdlcnVmZW4uCisqIEhfSE9PS19EUklOSworICBCZWkgVmVyYWVuZGVydW5nIHZvbiBQX0RSSU5LIGltIExlYmV3ZXNlbnMgZ2VydWZlbi4KKyogSF9IT09LX1BPSVNPTgorICBCZWkgVmVyYWVuZGVydW5nIHZvbiBQX1BPSVNPTiBpbSBMZWJld2VzZW5zIGdlcnVmZW4uCisqIEhfSE9PS19DT05TVU1FCisgIEJlaW0gS29uc3VtaWVyZW4gdm9uIFNwZWlzZW4gdW5kIEdldHJhZW5rZW4gaW4gS25laXBlbiBpbSBMZWJld2VzZW5zCisgIGdlcnVmZW4uCisqIEhfSE9PS19URUFNUk9XQ0hBTkdFCisgIEJlaSBUZWFtcmVpaGVud2VjaHNlbCB2b20gTGViZXdlc2VuIGF1c2dlbG9lc3QuCisqIEhfSE9PS19JTlNFUlQKKyAgV2lyZCB2b24gU3BpZWxlcm9iamVrdGVuIGF1c2dlbG9lc3QsIHdlbm4gZWluIE9iamVrdCBpbnMgU3BpZWxlcmludmVudGFyCisgIGJld2VndCB3aXJkLiAoS2VpbmUgRGF0ZW52ZXJhZW5kZXJ1bmcgbW9lZ2xpY2gpCisqIEhfSE9PS19FWElUX1VTRQorICBXaXJkIHZvbiBlaW5lbSBSYXVtIGF1c2dlbG9lc3QsIHdlbm4gZWluIExlYmV3ZXNlbiBlaW5lbiBBdXNnYW5nIGJlbnV0enQuCisgIEFiYnJ1Y2ggdW5kIEFlbmRlcnVuZyBkZXIgRGF0ZW4gZGVzIEF1c2dhbmdzIG1vZWdsaWNoLgorCitIT09LLUtPTlNVTUVOVEVOCis9PT09PT09PT09PT09PT09CitEZXIgSG9vay1Qcm92aWRlciBydWZ0IGJlaSBBdXNsb2VzZW4gZGVzIEhvb2tzIGluIGFsbGVuIEtvbnN1bWVudGVuIGVpbmUKK2Jlc3RpbW10ZSBNZXRob2RlIGF1Zi4gV2VubiBiZWkgZGVyIFJlZ2lzdHJpZXJ1bmcgZWluZXMgT2JqZWt0cyBrZWluZSBDbG9zdXJlCithbmdlYmVuIHd1cmRlLCBkaWUgaW4gZGllc2VtIEZhbGwgZ2VydWZlbiB3ZXJkZW4sIHdpcmQgc3RhbmRhcmRtYWVzc2lnIGRpZQorbGZ1biBIb29rQ2FsbGJhY2soKSBnZXJ1ZmVuIChnaWJ0IG1hbiBlaW5lIENsb3N1cmUgYW4sIGJla29tbXQgc2llIGRpZQorZ2xlaWNoZW4gQXJndW1lbnRlIHVuZCBlcyB3ZXJkZW4gZGllIGJlc2NocmllYmVuZW4gUnVlY2tnYWJld2VydGUgZXJ3YXJ0ZXQpOgorICAqIG1peGVkIEhvb2tDYWxsYmFjayhvYmplY3QgaG9va1NvdXJjZSwgaW50IGhvb2tpZCwgbWl4ZWQgaG9va0RhdGEpCisgIERpZXNlIE1ldGhvZGUgd2lyZCBpbiBqZWRlbSBIb29rLUtvbnN1bWVudGVuIGVpbmVzIEhvb2stUHJvdmlkZXJzCisgIGF1ZmdlcnVmZW4sIHNvbGFuZ2UgZGllIFZlcmFyYmVpdHVuZyBuaWNodCB2b3JoZXIgYWJnZWJyb2NoZW4gd3VyZGUuCisgIERpZSBSZWloZW5mb2xnZSBkZXIgQWJhcmJlaXR1bmcgd2lyZCBuYWNoIExpc3RlIChTdXJ2ZXlvciwKKyAgSG9vay1Nb2RpZmlrYXRvciwgRGF0YS1Nb2RpZmlrYXRvciwgTGlzdGVuZXIpIHVuZCBkb3J0IG5hY2ggUHJpb3JpdGFldAorICBkdXJjaGdlZnVlaHJ0LgorICBFaW4gU3VydmV5b3ItSG9vayBrYW5uIHZlcmhpbmRlcm4sIGRhc3MgSG9va3MgYmVzdGltbXRlIEFlbmRlcnVuZ2VuCisgIGR1cmNoZnVlaHJlbi4KKworICBSdWVja2dhYmV3ZXJ0IGlzdCBlaW4gQXJyYXksIGRhcyBkaWUgZm9sZ2VuZGVuIFdlcnRlIGJlaW5oYWx0ZXQuCisKKyAgSF9SRVRDT0RFIEdpYnQgYW4sIHdlbGNoZXIgSG9vay1UeXAgdmVyd2VuZGV0IHd1cmRlLgorICAgICAgSF9OT19NT0QgPT4gTmljaHRzIHd1cmRlIHZlcmFlbmRlcnQuCisgICAgICBIX0FMVEVSRUQgPT4gRGF0ZW4gd3VyZGVuIHZlcmFlbmRlcnQuCisgICAgICBIX0NBTkNFTExFRCA9PiBIb29rLUtldHRlIHNvbGwgYWJnZWJyb2NoZW4gd2VyZGVuLgorICAgICAgICAgICAgICAgICAgPT4gQXVzc2VyZGVtIHNvbGwgZGllIEhvb2stYXVzbG9lc2VuZGUgU3RlbGxlCisgICAgICAgICAgICAgICAgICAgICBhYmdlYnJvY2hlbiB3ZXJkZW4uIFouQi4gd2lyZCBkYXMgRGVmZW5kKCkKKyAgICAgICAgICAgICAgICAgICAgIGFiZ2Vicm9jaGVuLCB3ZW5uIGVpbiBIX0hPT0tfREVGRU5ECisgICAgICAgICAgICAgICAgICAgICBtaXQgY2FuY2VsbGVkIGJlYW50d29ydGV0IHdpcmQuCisgIEhfUkVUREFUQSBHaWJ0IGRpZSAoZXZ0bC4gZ2VhZW5kZXJ0ZW4pIERhdGVuIGFuLgorICAgICAgbWl4ZWQtT2JqZWt0LCBkYXMgd2llIGRlciBQYXJhbWV0ZXIgaG9va0RhdGEgYXVmZ2ViYXV0IGlzdC4KKworRWluIE9iamVrdCBkYXJmIHNpY2ggbWVocmZhY2ggZnVlciBkZW4gZ2xlaWNoZW4gSG9vayByZWdpc3RyaWVyZW4uIEFsbGVyZGluZ3MKK2lzdCBmdWVyIGplZGUgUmVnaXN0cmllcnVuZyBlaW5lIGFuZGVyZSBDbG9zdXJlIG5vZXRpZy4KKworICAqIHZvaWQgc3VwZXJzZWVkZWRIb29rKGludCBob29raWQsIG9iamVjdCBob29rcHJvdmlkZXIpCisgICAgV2lyZCBnZXJ1ZmVuLCB3ZW5uIGRlciBLb25zdW1lbnQgdm9uIGVpbmVtIGFuZGVyZW4gbWl0IGhvZWhlcmVyIFByaW9yaXRhZXQKKyAgICB2ZXJkcmFlbmd0IHd1cmRlLgorCisKK0hPT0stUFJPVklERVIKKz09PT09PT09PT09PT0KKyAgRGVyIEhvb2stUHJvdmlkZXIgYmlldGV0IGVpbmUgTWVuZ2Ugdm9uIE1ldGhvZGVuIGFuLCBkaWUgZWluZSBLb25maWd1cmF0aW9uCisgIGVybW9lZ2xpY2hlbiB1bmQgZGllIEVpbnRyYWd1bmcgdm9uIEhvb2stS29uc3VtZW50ZW4gZXJsYXViZW4uIEltCisgIE5vcm1hbGZhbGwgc29sbHRlIGVyIGdlZXJidCB1bmQgbmljaHQgbW9kaWZpemllcnQgd2VyZGVuIChhdXNzZXIgbmF0dWVybGljaCwKKyAgZGllIHZvbSBPYmpla3RlIGJlcmVpdGdlc3RlbGx0ZW4gSG9va3MgZWluenV0cmFnZW4pLgorCisgICogaW50KiBITGlzdEhvb2tzKCk7CisgIERpZXNlIE1ldGhvZGUgbGllZmVydCBlaW5lIExpc3RlIHZvbiBIb29rdHlwZW4sIGZ1ZXIgZGllIGRhcyBPYmpla3QKKyAgRWludHJhZ3VuZ2VuIGFubmltbXQuIEhpZXIga29lbm50ZSBiZWlzcGllbHN3ZWlzZSBlaW5lIExpc3RlIG1pdCBkZW4KKyAgRWludHJhZWdlbiBmdWVyIEF0dGFjay0sIERlZmVuZC0gdW5kIE1vdmUtSG9va3Mgc3RlaGVuLgorCisKKyAgKiBwcm90ZWN0ZWQgdm9pZCBvZmZlckhvb2soaW50IGhvb2tpZCwgaW50IG9mZmVyc3RhdGUpOworICBEaWVzZSBNZXRob2RlIGRpZW50IGRhenUsIGVpbmVuIGJlc3RpbW10ZW4gSG9vayAoei5CLiBIX0hPT0tfTU9WRSkKKyAgYW56dWJpZXRlbi4gTnVyIEhvb2tzLCBkaWUgaGllcm1pdCBhbmdlYm90ZW4gd3VyZGVuLCBzdGVoZW4genVyCisgIFJlZ2lzdHJpZXJ1bmcgenVyIFZlcmZ1ZWd1bmcuCisgICdvZmZlcnN0YXRlJzogMCAobmljaHQgdmVyZnVlZ2JhciksIDEgKHZlcmZ1ZWdiYXIvYW5nZWJvdGVuKQorCisKKyAgKiBpbnQgSFJlZ2lzdGVyVG9Ib29rKGludCBob29raWQsIG1peGVkIGNvbnN1bWVyLCBpbnQgaG9va3ByaW8sCisgICAgICAgICAgICAgICAgICAgICAgIGludCBjb25zdW1lcnR5cGUsIGludCB0aW1lSW5TZWNvbmRzKTsKKyAgUmVnaXN0cmllcnQgZWluIE9iamVrdCBvZGVyIGVpbmUgQ2xvc3VyZSBhbHMgSG9vay1Lb25zdW1lbnQuCisgIFBhcmFtZXRlcjoKKyAgJ2hvb2tpZCcgICAgICAgIGdpYnQgZGVuIEhvb2stVHlwIGFuLCB6LkIuIGRlbiBEZWZlbmQtSG9vay4KKyAgICAgICAgICAgICAgICAgIE1hbiBrYW5uIHNpY2ggbnVyIGZ1ZXIgSG9va3R5cGVuIGVpbnRyYWdlbiwgZGllIGRpZSBNZXRob2RlCisgICAgICAgICAgICAgICAgICBITGlzdEhvb2tzKCkgYW5nZWJvdGVuIGhhdC4KKyAgJ2NvbnN1bWVyJyAgICAgIFdlbm4gZWluIE9iamVrdCwgd2lyZCBkYXMgT2JqZWt0IGVpbmdldHJhZ2VuIHVuZCBzcGFldGVyCisgICAgICAgICAgICAgICAgICBIb29rQ2FsbGJhY2soKSBnZXJ1ZmVuLgorICAgICAgICAgICAgICAgICAgV2VubiBlaW5lIENsb3N1cmUsIHdpcmQgZGFzIE9iamVrdCBkZXIgQ2xvc3VyZSBlaW5nZXRyYWdlbgorICAgICAgICAgICAgICAgICAgdW5kIHNwYWV0ZXIgZGllc2UgQ2xvc3VyZSBnZXJ1ZmVuLgorICAnaG9va3ByaW8nICAgICAgR2lidCBkaWUgUHJpb3JpdGFldCBhbiwgbWl0IGRlciBkZXIgSG9vayBsYXVmZW4gc29sbC4KKyAgICAgICAgICAgICAgICAgIERpZXNlIEFuZ2FiZSBiZXN0aW1tdCBkaWUgUmVpaGVuZm9sZ2UsIGluIGRlciBkaWUgSG9va3MKKyAgICAgICAgICAgICAgICAgIGluIGRlciBMaXN0ZSBkZXIgSG9va3MgZWluZ2V0cmFnZW4gd2VyZGVuLiBEaWUgUHJpb3JpdGFldAorICAgICAgICAgICAgICAgICAgaXN0IEhfSE9PS19MSUJQUklPKHgpLCBIX0hPT0tfR1VJTERQUklPKHgpIG9kZXIKKyAgICAgICAgICAgICAgICAgIEhfSE9PS19PVEhFUlBSSU8oeCkuIHggZGFyZiAwLCAxIG9kZXIgMiBzZWluIChqZSBuaWVkcmlnZXIsCisgICAgICAgICAgICAgICAgICBkZXN0byBob2VoZXIgZGllIFByaW9yaXRhZXQpLgorICAnY29uc3VtZXJ0eXBlJyAgR2lidCBhbiwgdW0gd2VsY2hlIEFydCB2b24gSG9vayBlcyBzaWNoIGhhbmRlbHQuCisgICAgICAgICAgICAgICAgICBFcyBnaWJ0IHZpZXIgZmVzdGdlbGVndGVuIFR5cGVuLCBkaWUgZnVlciBhbGxlIEhvb2tzCisgICAgICAgICAgICAgICAgICBleGlzdGllcmVuIGtvZW5uZW4uIERpZSBNZXRob2RlIEhDb25zdW1lclR5cGVJc0FsbG93ZWQoKQorICAgICAgICAgICAgICAgICAgZ2lidCBBdWZzY2hsdXNzIGRhcnVlYmVyLCB3ZWxjaGUgSG9vay1UeXBlbiBleGlzdGllcmVuLgorICAgICAgICAgICAgICAgICAgRGllIEhvb2stVHlwZW4gc2luZCBpbiBob29rLmggZGVmaW5pZXJ0LgorICAndGltZUluU2Vjb25kcycgZ2lidCBkaWUgTGF1ZnplaXQgZGVzIEhvb2tzIGFuLiBGYWxscyAwIGVpbmdldHJhZ2VuIHdpcmQsCisgICAgICAgICAgICAgICAgICBsYWV1ZnQgZGVyIEhvb2sgZXdpZy4KKyAgUnVlY2tnYWJld2VydGU6CisgICAgMSAtIFJlZ2lzdHJpZXJ1bmcgZXJmb2xncmVpY2gKKyAgPD0wIC0gUmVnaXN0cmllcnVuZyBmZWhsZ2VzY2hsYWdlbjoKKyAgICAgICAgLTEgOiBIb29rIHVuYmVrYW5udAorICAgICAgICAtMiA6IGNvbnN1bWVyIGlzdCBrZWluZSBjbG9zdXJlIHVuZCBlcyBrb25udGUga2VpbiBDYWxsYmFjayBhdWYKKyAgICAgICAgICAgICBIb29rQ2FsbGJhY2sgaW0gY29uc3VtZXIgZXJzdGVsbHQgd2VyZGVuLgorICAgICAgICAtMyA6IGNvbnN1bWVyIGlzdCBiZXJlaXRzIHJlZ2lzdHJpZXJ0CisgICAgICAgIC00IDogY29uc3VtZXJ0eXAgaXN0IG5pY2h0IGVybGF1YnQKKyAgICAgICAgLTUgOiBob29rcHJpbyBpc3QgbmljaHQgZXJsYXVidAorICAgICAgICAtNiA6IFN1cnZleW9yIGhhdCBSZWdpc3RyaWVydW5nIG5pY2h0IGVybGF1YnQKKyAgICAgICAgLTcgOiB6dXZpZWxlIEhvb2tzIHJlZ2lzdHJpZXJ0IC8ga2VpbiBIb29rZWludHJhZyBmcmVpCisKKyAgKiBpbnQgSFVucmVnaXN0ZXJGcm9tSG9vayhpbnQgaG9va2lkLCBtaXhlZCBjb25zdW1lcik7CisgIEhlYnQgZGllIFJlZ2lzdHJpZXJ1bmcgdm9uIDxjb25zdW1lcj4gZnVlciBlaW5lbiBiZXN0aW1tdGVuIEhvb2stVHlwIHdpZWRlcgorICBhdWYuCisgIFBhcmFtZXRlcjoKKyAgJ2hvb2tpZCcgICAgRGllIEtlbm51bmcgZGVzIEhvb2stVHlwcywgei5CLiBkaWUgS2VubnVuZyBkZXMgQXR0YWNrLUhvb2tzLgorICAnY29uc3VtZXInICBEYXMgT2JqZWt0IG9kZXIgZGllIENsb3N1cmUsIGRpZS9kYXMgbmljaHQgbWVociByZWdpc3RyaWVydCBzZWluCisgICAgICAgICAgICAgIHNvbGwuIEJlaSBlaW5lciBDbG9zdXJlIHdpcmQgZ2VuYXUgZGllc2UgYXVzZ2V0cmFnZW4uIEJlaSBkZXIKKyAgICAgICAgICAgICAgQW5nYWJlIGVpbmVzIE9iamVrdHMgd2lyZCB2ZXJzdWNodCwgZGllIENsb3N1cmUgYXVmCisgICAgICAgICAgICAgIEhvb2tDYWxsYmFjaygpIGluIGRpZXNlbSBPYmpla3QgYXVzenV0cmFnZW4uCisgIFJ1ZWNrZ2FiZXdlcnRlOgorICAwIC0gJ2NvbnN1bWVyJyBuaWNodCBhbHMgS29uc3VtZW50IGdlZnVuZGVuCisgIDEgLSBBdXN0cmFnZW4gZXJmb2xncmVpY2gKKworICAqIGludCBIQ29uc3VtZXJUeXBlSXNBbGxvd2VkKGludCB0eXBlLCBvYmplY3QgY29uc3VtZXIpOworICBEaWVzZSBNZXRob2RlIGxpZWZlcnQgMSB6dXJ1ZWNrLCB3ZW5uIGVpbiBiZXN0aW1tdGVyIEtvbnN1bWVudGVuLVR5cAorICAoZnVlciBkaWVzZW4gS29uc3VtZW50ZW4pIGVybGF1YnQgd2lyZC4KKyAgRGllIFN0YW5kYXJkbWV0aG9kZSBsaWVmZXJ0IGltbWVyIDEgKHRydWUpIHp1cnVlY2suIEVyYmVuZGUgT2JqZWt0ZQorICBrb2VubmVuIGRpZXNlIE1ldGhvZGUgdWViZXJzY2hyZWliZW4sIHdlbm4gc2llIG5pY2h0IGFsbGUgSG9va3R5cGVuCisgIGFuYmlldGVuLgorCisKKyAgKiBpbnQgSFByaW9yaXR5SXNBbGxvd2VkKGludCBwcmlvLCBvYmplY3QgY29uc3VtZXIpOworICBEaWVzZSBNZXRob2RlIGdpYnQgYW4sIG9iIGVpbmUgYmVzdGltbXRlIFByaW9yaXRhZXQgKGZ1ZXIgZGVuIGFuZ2VnZWJlbmVuCisgIEtvbnN1bWVudGVuKSBlcmxhdWJ0IGlzdC4gRGllIFN0YW5kYXJkbWV0aG9kZSBsaWVmZXJ0IGltbWVyIDEgKHRydWUpCisgIHp1cnVlY2suIEVyYmVuZGUgT2JqZWt0ZSBrb2VubmVuIGRpZXNlIE1ldGhvZGUgdWViZXJzY2hyZWliZW4sIHdlbm4KKyAgc2llIGRpZSB2ZXJmdWVnYmFyZW4gSG9vay1Qcmlvcml0YWV0ZW4gZWluc2NocmFlbmtlbiB3b2xsZW4uCisKKworICAqIGludCBISXNIb29rQ29uc3VtZXIoaW50IGhvb2tpZCwgbWl4ZWQgY29uc3VtZXIpOworICBJc3QgPGNvbnN1bWVyPiBlaW4gT2JqZWt0LCBsaWVmZXJ0IGRpZSBNZXRob2RlIGRpZSBBbnphaGwsIHdpZSBvZnQgZGllc2VzCisgIE9iamVrdCAobWl0IHZlcnNjaGllZGVuZW4gQ2xvc3VyZXMpIGZ1ZXIgZGVuIEhvb2sgPGhvb2tpZD4gZWluZ2V0cmFnZW4gaXN0LgorICBJc3QgPGNvbnN1bWVyPiBlaW5lIENsb3N1cmUsIGxpZWZlcnQgZGllc2UgTWV0aG9kZSAxLCB3ZW5uIGRpZXNlCisgIENsb3N1cmUgZnVlciBkZW4gSG9vayA8aG9va2lkPiBlaW5nZXRyYWdlbiBpc3QuCisKKworICAqIHByb3RlY3RlZCBtYXBwaW5nIEhDb3B5SG9va01hcHBpbmcoKTsKKyAgRGllc2UgTWV0aG9kZSBsaWVmZXJ0IGVpbmUgS29waWUgZGVzIEhvb2stTWFwcGluZ3MuCisgIEFDSFRVTkc6IGRpZXNlIERhdGVuIHNvbGx0ZW4gZGFzIE9iamVrdCBOSUVNQUxTIHZlcmxhc3Nlbi4gKEF1c3NlciBmdWVyCisgICAgICAgICAgIERlYnVnendlY2tlKQorCisKKworSE9PSy1TVVJWRVlPUgorPT09PT09PT09PT09PQorICBPYmpla3RlIG1pdCBTdXJ2ZXlvcmhvb2tzIG11ZXNzZW4gZWluZSBNZW5nZSB2b24gTWV0aG9kZW4gZGVmaW5pZXJlbiwgZGllCisgIGRlciBIb29rcHJvdmlkZXIgYXVmcnVmdDoKKworICAqIHN0YXR1cyBIb29rUmVnaXN0cmF0aW9uQ2FsbGJhY2soCisgICAgICAgICAgICAgICAgb2JqZWN0IHJlZ2lzdHJpbmdPYmplY3QsCisgICAgICAgICAgICAgICAgaW50IGhvb2tpZCwKKyAgICAgICAgICAgICAgICBvYmplY3QgaG9va1NvdXJjZSwKKyAgICAgICAgICAgICAgICBpbnQgcmVnaXN0cmluZ09iamVjdHNQcmlvcml0eSwKKyAgICAgICAgICAgICAgICBpbnQgcmVnaXN0cmluZ09iamVjdHNUeXBlKQorICBEaWVzZSBNZXRob2RlIHdpcmQgdm9tIEhvb2stUHJvdmlkZXIgYXVmZ2VydWZlbiwgd2VubiBkZXIgSG9vay1Lb25zdW1lbnQKKyAgYWxzIFN1cnZleW9yIGVpbmdldHJhZ2VuIGlzdCB1bmQgZWluIHdlaXRlcmVyIEhvb2sgZWluZ2V0cmFnZW4gd2VyZGVuIHNvbGwuCisgIEdpYnQgZGllc2UgTWV0aG9kZSAwIHp1cnVlY2ssIGRhbm4gdmVyYmlldGV0IGRlciBLb25zdW1lbnQsIGRhc3MgZGVyCisgIGFuZGVyZSBLb25zdW1lbnQgYWxzIEhvb2sgZWluZ2V0cmFnZW4gd2lyZC4KKworICAqIGludCBIb29rQ2FuY2VsQWxsb3dhbmNlQ2FsbGJhY2soCisgICAgICAgICAgICAgICAgb2JqZWN0IGNhbmNlbGxpbmdPYmplY3QsCisgICAgICAgICAgICAgICAgaW50IGhvb2tpZCwKKyAgICAgICAgICAgICAgICBvYmplY3QgaG9va1NvdXJjZSwKKyAgICAgICAgICAgICAgICBpbnQgY2FuY2VsbGluZ09iamVjdHNQcmlvcml0eSwKKyAgICAgICAgICAgICAgICBtaXhlZCBob29rRGF0YSkKKyAgRGllc2UgTWV0aG9kZSB3aXJkIGF1ZmdlcnVmZW4sIHVtIGhlcmF1c3p1ZmluZGVuLCBvYiBlaW4gYmVzdGltbXRlcgorICBhbmRlcmVyIEhvb2sgZGllIEF1c2Z1ZWhydW5nIGRlciBIb29rLUtldHRlIHVudGVyYnJlY2hlbiBkYXJmLgorICBOdXIgSG9va3MgaW0gQmVyZWljaCBIX0hPT0tfTU9ESUZJQ0FUT1Igd2VyZGVuIGRlciBNZXRob2RlIHVlYmVyZ2ViZW4uCisKKyAgKiBpbnQgSG9va01vZGlmaWNhdGlvbkFsbG93YW5jZUNhbGxiYWNrKAorICAgICAgICAgICAgICAgIG9iamVjdCBtb2RpZnlpbmdPYmplY3QsCisgICAgICAgICAgICAgICAgaW50IGhvb2tpZCwKKyAgICAgICAgICAgICAgICBvYmplY3QgaG9va1NvdXJjZSwKKyAgICAgICAgICAgICAgICBpbnQgbW9kaWZ5aW5nT2JqZWN0c1ByaW9yaXR5LAorICAgICAgICAgICAgICAgIG1peGVkIGhvb2tEYXRhKQorICBEaWVzZSBNZXRob2RlIHdpcmQgYXVmZ2VydWZlbiwgdW0gaGVyYXVzenVmaW5kZW4sIG9iIGVpbiBiZXN0aW1tdGVyCisgIGFuZGVyZXIgSG9vayBkaWUgRGF0ZW4gZGVzIEhvb2tzIHZlcmFlbmRlcm4gZGFyZiBvZGVyIG5pY2h0LgorICBFcyB3ZXJkZW4gZGllIEhvb2tzIGluIGRlbiBCZXJlaWNoZW4gSF9IT09LX01PRElGSUNBVE9SIHVuZAorICBIX0RBVEFfTU9ESUZJQ0FUT1IgKGluIGRpZXNlciBSZWloZW5mb2xnZSkgYXVmZ2VydWZlbi4KKworCitXQVMgS09TVEVUIERBUz8KKyAgRGFzIEF1c2xvZXNlbiBlaW5lcyBIb29rcyBwZXIgSG9va0Zsb3coKSBrb3N0ZXQgMTExIFRpY2tzIHVuZCBjYS4gNyB1cywgd2VubgorICBlcyBnYXIga2VpbmVuIGdpYnQsIGRlciBkcmF1ZiBsYXVzY2h0IChzb3p1c2FnZW4gRml4a29zdGVuKS4KKyAgUHJvIEhfTElTVEVORVIga29tbWVuIGRhbm4gMzEgVGlja3MgdW5kIGNhLiAyIHVzIGRhenUuCisKKyAgR2lidHMgZWluZW4gU3VydmV5b3ItSG9vayAoZGVyIHdpcmQgZGFubiBnZWZyYWd0LCBvYiBhbmRlcmUgT2JqZWt0ZSBkaWUKKyAgRGF0ZW4gZGVzIEhvb2tzIGFlbmRlcm4gb2RlciBkaWUgSG9va3ZlcmFyYmVpdHVuZyBhYmJyZWNoZW4gZHVlcmZlbik6CisgIEZpeGtvc3RlbjogMTU1IFRpY2tzLCAxMSB1cy4KKyAgUGx1cyBwcm8gRGF0YS1Nb2RpZmllcjoKKyAgMTA2IFRpY2tzLCA1LjYgdXMKKyAgUGx1cyBwcm8gSG9vay1Nb2RpZmllciwgZGVyIGFiZXIgbnVyIERhdGVuIGFlbmRlcnQ6CisgIDExMiBUaWNrcywgNi40IHVzCisgIFVuZCBlaW4gSG9vay1Nb2RpZmllciwgZGVyIGRlbiBIb29rIGFiYnJpY2h0OgorICA3NiBUaWNrcywgNCB1cworCisgIChNYWNodCBkZXIgU3VydmV5b3IgbmF0dWVybGljaCBpcmdlbmR3YXMgYW5kZXJlcyBhbHMgJ3JldHVybiAxOycsIHdpcmRzCisgIG5hdHVlcmxpY2ggZW50c3ByZWNoZW5kIHRldXJlci4pCisKZGlmZiAtLWdpdCBhL2RvYy9zdGQvbGl2aW5nIGIvZG9jL3N0ZC9saXZpbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlkNDdiZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zdGQvbGl2aW5nCkBAIC0wLDAgKzEsMTIwIEBACisKK09CSkVDVDoKKwlsaXZpbmcgCisKKworU1lOT1BTSVM6CisJaW5oZXJpdCAic3RkL2xpdmluZyI7CisKKwkjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCSNpbmNsdWRlIDxsaXZpbmcuaD4KKworCitERVNDUklQVElPTjoKKwlUaGlzIGlzIHRoZSBnZW5lcmljIGxpdmluZyBvYmplY3Qgd2hpY2ggJ2xpdmVzJywgY2FuIG1vdmUsCisJY2FuIGZpZ2h0LgorCisJSXQgaGFzIGEgbnVtYmVyIG9mICdzdGF0cycsIGFsc28gY2FsbGVkICdhdHRyaWJ1dGVzJyBpbgorCXRoZSBuZXcgc3lzdGVtLiBUaGVzZSBpbmNsdWRlIHRoZSBmb3JtZXIgc3RhdHMgCisJc3RyZW5ndGgsIGRleHRlcml0eSwgaW50ZWxsaWdlbmNlIGFuZCBjb25zdGl0dXRpb24uCisJVGhlc2UgYXR0cmlidXRlcyBkZXRlcm1pbmUgdGhlIGxpZmUgZnVuY3Rpb25zIGFuZAorCXZhcmlhYmxlcyBsaWtlIGhpdHBvaW50cyBhbmQgc3BlbGxwb2ludHMsIGJ1dCBhbHNvIHRoZQorCWFiaWxpdHkgdG8gcGVyZm9ybSBjZXJ0YWluIGFjdGlvbnMgbGlrZSBzcGVsbGNhc3Rpbmcgb3IKKwlzd29yZGZpZ2h0aW5nLiBBdHRyaWJ1dHMgYXJlIGltcGxlbWVudGVkIGFzIGEgcHJvcGVydHkKKwlQX0FUVFJJQlVURVMuIEF0dHJpYnV0ZXMgY2FuIGJlIHNldCBieSB1c2luZyB0aGUgZnVuY3Rpb25zCisKKwlTZXRBdHRyaWJ1dGUoc3RyaW5nIGF0dHJpYnV0ZSwgaW50IHZhbHVlKQorCSAgU2V0cyA8YXR0cmlidXRlPiB0byA8dmFsdWU+LiBDZXJ0YWluIHJlc3RyaWN0aW9ucyBtaWdodAorCSAgZXhpc3QsIGFuZCB0aGUgcmVxdWVzdGVkIGF0dHJpYnV0ZSBtaWdodCBub3QgYmUgc2V0LgorCSAgQXR0cmlidXRlcyBhcmUgaW50ZWdlciB2YWx1ZXMsIGFuZCBhcmUgaW4gdGhlIHJhbmdlCisJICBvZiAxICh2ZXJ5IGJhZCkgdG8gMjAgKGV4Y2VsbGVudCBhbmQgaGlnaGVzdCBwb3NzaWJsZQorCSAgZm9yIGEgbm9ybWFsIGh1bWFuKS4KKworCWludCBRdWVyeUF0dHJpYnV0ZShzdHJpbmcgYXR0cmlidXRlKQorCSAgUmV0dXJucyB2YWx1ZSBvZiA8YXR0cmlidXRlPgorCisJQWJpbGl0aWVzLiBBIGxpdmluZyBjcmVhdHVyZSBtYXkgaGF2ZSBzcGVjaWFsIGFiaWxpdGllcworCXRvIHBlcmZvcm0gY2VydGFpbiBhY3Rpb25zLiBUaGVzZSBtYXkgYmUgdmVyeSBkaWZmZXJlbnQKKwl0eXBlcyBvZiBhY3Rpb25zLCBsaWtlIGZpZ2h0aW5nIHdpdGggYSBzd29yZCwgY2FzdGluZworCWEgZmlyZWJhbGwgb3IgY2xpbWJpbmcgdXAgYSB0cmVlLiBBYmlsaXRpZXMgYXJlCisJaW1wbGVtZW50ZWQgYXMgdGhlIFBfQUJJTElUSUVTIHByb3BlcnR5LiBBbiBhYmlsaXR5IG1heQorCWJlIGFjY29tcGFuaWVkIGJ5IGFuIG9iamVjdCB3aGljaCBtYXkgZGVmaW5lIHNwZWNpYWwKKwlhY3Rpb25zIGFuZCB3aGljaCB1c2VzIHRoZSB2YWx1ZXMgb2YgUF9BQklMSVRFUywgZm9yIAorCWV4YW1wbGUgYSBzcGVsbGJvb2sgd2lsbCBzdG9yZSBzcGVsbCBsZXZlbHMgdGhlcmUgb3IKKwlhIHdlYXBvbiB1c2VzIGEgd2VhcG9uIGFiaWxpdHkgKHNraWxsKS4gVGhlIGFiaWxpdGllcworCWNhbiBiZSBtYW5pcHVsYXRlZDoKKworCVNldEFiaWxpdHkoc3RyaW5nIGFiaWxpdHksIGludCB2YWx1ZSkKKwkgIFNldHMgPGFiaWxpdHk+IHRvIDx2YWx1ZT4uCisKKwlpbnQgUXVlcnlBYmlsaXR5KHN0cmluZyBhYmlsaXR5KQorCSAgQXNrIHRoZSB2YWx1ZSBvZiA8YWJpbGl0eT4uCisKKwlFcXVpcG1lbnQuIFdlYXBvbmNsYXNzIGFuZCBhcm1vdXJjbGFzcyBhcmUgZGVmaW5lZC4gVW5sZXNzCisJYSB3ZWFwb24gaXMgdXNlZCwgdGhlIHdjIGlzIDAuIFVubGVzcyBhbiBhcm1vdXIgaXMgdXNlZCwKKwl0aGUgYWMgaXMgMC4gKFBfV0MgYW5kIFBfQUMpCisKKwlMaXZlIHZhcmlhYmxlcy4gQSBsaXZpbmcgY3JlYXR1cmUgaGFzIHNldmVyYWwgbmVlZHMganVzdAorCWJlY2F1c2UgaXQgaXMgYWxpdmUuIFRoZSBjb21wbGV4IGxpZmUgZnVuY3Rpb25zIGFyZQorCXJlZHVjY2VkIHRvIHNvbWUgY3J1Y2lhbCBmYWN0b3JzLgorCisJUF9IUAorCSAgVGhlc2UgYXJlIG1haW5seSBkZXRlcm1pbmVkIGJ5IHRoZSBjb25zdGl0dXRpb24gYW5kIGdpdmUKKwkgIHRoZSBhYmlsaXR5IG9mIHRoZSBib2R5IHRvIGFic29yYiBkYW1hZ2UuIElmIHRoZQorCSAgaGl0cG9pbnRzIGdvIGJlbG93IHplcm8sIHRoZSBjcmVhdHVyZSBpcyBkZWFkLgorCisJUF9TUAorCSAgU3BlbGxwb2ludHMgKHNvbWV0aW1lcyBjYWxsZWQgbWFuYSkgZGVzY3JpYmUgdGhlIG1hZ2ljYWwKKwkgIChzcGlyaXR1YWwpIGNhcGFiaWxpdHkgb2YgdGhlIGNyZWF0dXJlLiBJdCBpcyBtYWlubHkKKwkgIGRldGVybWluZWQgYnkgSW50ZWxsaWdlbmNlIGFuZCBXaXNkb20uIEl0IGlzIHVwIHRvIHRoZQorCSAgY3JlYXR1cmUgaG93IGdvb2QgaXQgdXNlcyB0aGUgc3BlbGxwb2ludCByZXNvdXJjZS4KKwkgIFNwZWxscG9pbnRzIHdpbGwgZ28gZG93biB3aGVuIHN1cGVybmF0dXJhbCBhY3Rpb25zIGFyZQorCSAgcGVyZm9ybWVkIGJ5IHRoZSBjcmVhdHVyZS4KKworCVBfTUFYX1NQLCBQX01BWF9IUAorCSAgUmVhZG9ubHkgdmFyaWFibGUgd2hpY2ggYXJlIGNvbXB1dGVkIGZyb20gYXR0cmlidXRlcy4KKworCVBfRk9PRCwgUF9EUklOSywgUF9BTENPSE9MLCAoUF9QT0lTT04pCisJICBUaGVzZSB0aHJlZSB2YXJpYWJsZXMgZGVzY3JpYmUgaHVuZ2VyLCB0aGlyc3QgYW5kCisJICBpbnRveGljYXRpb24gYnkgYWxjb2hvbC4gVGhlIG1heCBpcyBkZXBlbmRlbnQgb24gdGhlCisJICBjb25zdGl0dXRpb24gb2YgdGhlIGxpdmluZywgYW5kIG9mIHRoZSB3ZWlnaHQuCisJICBUaGVzZSB2YXJpYWJsZXMgYXV0b21hdGljYWxseSBkZWNyZWFzZSB3aXRoIHRpbWUuCisJICBXaGVuIGZvb2Qgb3IgZHJpbmsgZ29lcyBiZWxvdyB6ZXJvLCB0aGUgY3JlYXR1cmUKKwkgIHN1ZmZlcnMgaHVuZ2VyIG9yIHRoaXJzdCBhbmQgd2lsbCBsb3NlIGhpdHBvaW50cy4KKworCVBfTUFYX0ZPT0QsIFBfTUFYX0RSSU5LLCBQX01BWF9BTENPSE9MCisJICBSZWFkb25seSB2YXJpYWJsZXMgd2hpY2ggYXJlIGNvbXB1dGVkIGZyb20gYXR0cmlidXRlcy4KKworCVBfV0VJR0hULCBQX1NJWkUKKwkgIFRoZXNlIHZhcmlhYmxlcyBkZXNjcmliZSB0aGUgcGh5c2ljYWwgcHJvcG9ydGlvbnMgb2YKKwkgIHRoZSBjcmVhdHVyZXMgYm9keS4gQm90aCB2YXJpYWJsZXMgYXJlIHN0YW5kYXJkIHByb3BlcnRpZXMKKwkgIGFuZCBhcmUgYWxzbyB1c2VkIGluIG5vcm1hbCBvYmplY3RzLgorCisJUF9NQVhfV0VJR0hUIAorCSAgVGhpcyBpcyBhIHJlYWRvbmx5IHZhcmlhYmxlIHdoaWNoIGRlc2NyaWJlcyBob3cgbXVjaAorCSAgYSBsaXZpbmcgY3JlYXR1cmUgbWF5IGNhcnJ5IGFyb3VuZC4KKworCVBfR0VOREVSCisJICBUaGlzIGlzIG9idmlvdXMuIEdlbmRlciBtYXkgYmUgTUFMRSwgRkVNQUxFIG9yIE5FVVRFUiwKKwkgIGFzIGRlZmluZWQgaW4gPGxpdmluZy5oPi4gUGxheWVyIGdlbmRlciBtYXkgYmUgb25seQorCSAgTUFMRSBvciBGRU1BTEUuCisKKwlQX1JBQ0UKKwkgIEEgc3RyaW5nIHdoaWNoIGRlZmluZXMgdGhlIHJhY2UuCisKKwlQX0FMSUdOTUVOVAorCSAgVGhlIGFsaWdubWVudCBvZiB0aGUgbGl2aW5nLCByYW5naW5nIGZyTworCisJUF9BR0UKKwkgIFRoZSBhZ2Ugb2YgdGhlIGxpdmluZyBjcmVhdHVyZSBpbiBzZWNvbmRzCisJCisKK0lOSEVSSVRBTkNFIFRSRUU6CisJbGl2aW5nCisJICB8LXRoaW5nL21vdmluZworCSAgfC10aGluZy9wcm9wZXJ0aWVzCisJICBgLXRoaW5nL2Rlc2NyaXB0aW9uCisKKworU0VFIEFMU086CisJcHJvcGVydGllcyhDKSwgdW5pdHMoQykKZGlmZiAtLWdpdCBhL2RvYy9zdGQvb2Jzb2xldGUvZG9vciBiL2RvYy9zdGQvb2Jzb2xldGUvZG9vcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWJhZDMwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3N0ZC9vYnNvbGV0ZS9kb29yCkBAIC0wLDAgKzEsMjIgQEAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKiogVkVSQUxURVRFIExGVU4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKiogRE8gTk9UIFVTRSEgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQklUVEUgU1RBVFQgREVSIEZVTktUSU9OIERvb3IoKSBJTU1FUiAgTmV3RG9vcigpIEJFTlVUWkVOLgorCisJQWRkRG9vcihzdHJpbmcgY29tbWFuZCwgc3RyaW5nIHJvb21maWxlLCBzdHJpbmcgZG9vcm5hbWUsCisJCXN0cmluZyBkb29yZGVzYywgc3RyaW5nIGtleW5hbWUsIGludCBzdGF0dXMpCisJICBDcmVhdGVzIGEgZG9vciB3aGljaCBsZWFkcyBpbiBkaXJlY3Rpb24gPGNvbW1hbmQ+IHRvIHRoZQorCSAgcm9vbSA8cm9vbWZpbGU+LiBUaGUgZG9vciBoYXMgdGhlIHNob3J0IGRlc2NyaXB0aW9uCisJICA8ZG9vcm5hbWU+IGFuZCB0aGUgbG9uZyBkZXNjcmlwdGlvbiA8ZG9vcmRlc2M+LCB3aGVuIHlvdQorCSAgbG9vayBhdCBpdC4gSWYgYSBkb29yIHdpdGggdGhlIHNhbWUgPGRvb3JuYW1lPiBleGlzdHMgaW4KKwkgIHRoZSBvdGhlciByb29tLCB0aGUgb3Blbi9jbG9zZS9sb2NrZWQgc3RhdHVzIHdpbGwgYmUKKwkgIHRoZSBzYW1lIGluIGJvdGggcm9vbXMgYXQgYWxsIHRpbWUuIERvb3JzIGFyZSBsb2NrZWQgb24KKwkgIHJlc2V0KCkgaWYga2V5bmFtZSBpcyBub3QgMC4gSWYgPGtleW5hbWU+IGlzIGdpdmVuLCB0aGUKKwkgIGRvb3IgaXMgbG9ja2VkIGFuZCBjYW4gYmUgb3BlbmVkIG9ubHkgd2l0aCBhIGtleSB3aGljaAorCSAgbWF0Y2hlcyA8a2V5bmFtZT4gd2l0aCBpdHMgaWQoKS4gPHN0YXR1cz4gY2FuIGJlIHNldAorCSAgdG8gYW4gaW5pdGlhbCB2YWx1ZSBvZiBET09SX1NUQVRVU19PUEVOLCBET09SX1NUQVRVU19DTE9TRUQKKwkgIG9yIERPT1JfU1RBVFVTX0xPQ0tFRC4gVGhlc2Ugc3RhdHVzIGNvZGVzIGFyZSBkZWZpbmVkIGluCisJICA8ZG9vcnMuaD4uCisKZGlmZiAtLWdpdCBhL2RvYy9zdGQvcHViIGIvZG9jL3N0ZC9wdWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE1NDRhNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zdGQvcHViCkBAIC0wLDAgKzEsOTUgQEAKK1VtIGRpZSBGdW5rdGlvbmFsaXRhZXQgZWluZXIgS25laXBlIG51dHplbiB6dSBrb2VubmVuLCBtdXNzIGRlciBSYXVtIGVpbmUKK2RlciBmb2xnZW5kZW4gRGF0ZWllbiBpbXBvcnRpZXJlbjoKKworJy9zdGQvcHViLmMnICAgICAgICAgLSBkaWUgS29tcGxldHRsb2VzdW5nIGluY2x1c2l2ZSBkZXIgQWJoYWVuZ2lna2VpdCB6dQorICAgICAgICAgICAgICAgICAgICAgICAnL3N0ZC9yb29tJworCisnL3N0ZC9yb29tL3B1Yi5jJyAgICAtIGRpZSBNaW5kZXN0bG9lc3VuZywgYmVpIGRlciBtYW4gc2VsYnN0IGRpZSBBYmhhZW5naWctCisgICAgICAgICAgICAgICAgICAgICAgIGtlaXQgenUgZWluZW0gUmF1bSBkZWZpbmllcmVuIG11c3MKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFaW5lIFp1c2FtbWVuZmFzc3VuZyBkZXIgUHViLVByb3BlcnRpZXMgKGZ1ZXIgZ2VuYXVlcmVzIHNpZWhlIG1hbnBhZ2VzKQorYXVzICcvc3lzL3B1Yi5oJworCitQX05QQ19GQVNUSEVBTCAgICAgICAtIE5QQ3MgdGFua2VuIGhpZXIgYXVmIGRpZSAic2NobmVsbGUiIEFydAorCitQX05PX1NURF9EUklOSyAgICAgICAtIERlciBQdWIgc29sbCBrZWluZSBTdGFuZGFyZC1HZXRyYWVua2UgYW5iaWV0ZW4KKworUF9QVUJfVU5BVkFJTEFCTEUgICAgLSBNZWxkdW5nLCB3ZW5uIGV0d2FzIG5pY2h0IG1laHIgdm9yaGFuZGVuIGlzdAorCitQX1BVQl9OT1RfT05fTUVOVSAgICAtIE1lbGR1bmcsIHdlbm4gZXR3YXMgbmljaHQgaW0gTWVudWUgc3RlaHQKKworUF9QVUJfTk9fTU9ORVkgICAgICAgLSBNZWxkdW5nLCB3ZW5uIFNwaWVsZXIgbmljaHQgZ2VudWcgR2VsZCBoYXQKKworUF9QVUJfTk9fS0VFUEVSICAgICAgLSBNZWxkdW5nLCB3ZW5uIGRlciBQX0tFRVBFUiBuaWNodCBhbndlc2VuZCBpc3QKKworYXVzICcvc3lzL3Jvb20vZGVzY3JpcHRpb24uaCcKKworUF9LRUVQRVIgICAgICAgICAgICAgLSBJZCBkZXMgS25laXBlbmluaGFiZXJzLCBkZXIgYW53ZXNlbmQgc2VpbiBtdXNzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgZGFtaXQgZGllIEtuZWlwZSBnZW51dHp0IHdlcmRlbiBrYW5uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTWV0aG9kZW4genVyIE1hbmlwdWxhdGlvbiBkZXMgTWVudWVzIChmdWVyIGdlbmF1ZXJlcyBzaWVoZSBtYW5wYWdlcykKKworQWRkVG9NZW51ICAgICAgICAgICAgLSBmdWVndCBlaW5lbiBFaW50cmFnIHp1bSBNZW51ZSBoaW56dQorCitSZW1vdmVGcm9tTWVudSAgICAgICAtIGVudGZlcm50IGVpbmVuIEVpbnRyYWcgYXVzIGRlbSBNZW51ZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FibGF1ZiB1bmQgTWFuaXB1bGF0aW9uc21vZWdsaWNoa2VpdGVuIGluIGVpbmVyIEtuZWlwZQorCitXdW5zY2ggd3VyZGUgdWViZXIgJ2thdWZlJywgJ2Jlc3RlbGxlJyBvZGVyICdzcGVuZGllcmUnIGFiZ2VnZWJlbjoKKworc2VhcmNoX3doYXQoKSAgICAgICAgLSBwcnVlZnQsIGRhc3MgbmljaHQgbWVocmVyZSBXdWVuc2NoZSBhdWYgZWlubWFsCisgICAgICAgICAgICAgICAgICAgICAgIGdlYWV1c3NlcnQgd2VyZGVuIHVuZCBydWZ0IGNvbnN1bWVfc29tZXRoaW5nKCkgYXVmCisKK2NvbnN1bWVfc29tZXRoaW5nKCkgIC0gcHJ1ZWZ0IGRpZSBBbndlc2VuaGVpdCBkZXIgYmV0ZWlsaWd0ZW4gUGVyc29uZW4KKyAgICAgICAgICAgICAgICAgICAgIC0gcHJ1ZWZ0IGRpZSBBbndlc2VuaGVpdCBkZXMgS25laXBlbmJlc2l0emVycworICAgICAgICAgICAgICAgICAgICAgLSBwcnVlZnQgZGFzIElnbm9yaWVyZW4gYmVpbSBTcGVuZGllcmVuCisgICAgICAgICAgICAgICAgICAgICAtIHBydWVmdCBkaWUgVmVyZnVlZ2JhcmtlaXQgdm9uIGdlbnVlZ2VuZCBHZWxkIGJlaW0KKyAgICAgICAgICAgICAgICAgICAgICAgQmVzdGVsbGVyICggY2hlY2tfc29sdmVuY3koKSApCisgICAgICAgICAgICAgICAgICAgICAtIHBydWVmdCBkaWUgVmVyZnVlZ2JhcmtlaXQgZGVzIEdld3VlbnNjaHRlbgorICAgICAgICAgICAgICAgICAgICAgICAoIENoZWNrQXZhaWxhYmlsaXR5KCkgKQorICAgICAgICAgICAgICAgICAgICAgLSBwcnVlZnQsIG9iIGRlciBFbXBmYWVuZ2VyIGluIGRlciBMYWdlIGlzdCwgZGFzCisgICAgICAgICAgICAgICAgICAgICAgIEJlc3RlbGx0ZSB6dSBrb25zdW1pZXJlbgorICAgICAgICAgICAgICAgICAgICAgICAoIHVlYmVyIGVtcGZhZW5nZXItPmNvbnN1bWUodGVzdG9ubHkpICkKKworICAgICAgICAgICAgICAgICAgICAgLSBmdWVocnQgZGllIEJlemFobHVuZyBkdXJjaCAoIGRvX3BheSgpICkKKyAgICAgICAgICAgICAgICAgICAgIC0gZnVlaHJ0IGRpZSBWZXJnYWJlIHZvbiBGUHMgZHVyY2ggKCBHaXZlRVAoKSApCisgICAgICAgICAgICAgICAgICAgICAtIGVudG5pbW10IGRhcyBCZXN0ZWxsdGUgYXVzIGRlciBNZW5nZSBkZXMgQW5nZWJvdGVzCisgICAgICAgICAgICAgICAgICAgICAgICggRGVjcmVhc2VBdmFpbGliaWxpdHkoKSApCisgICAgICAgICAgICAgICAgICAgICAtIHBydWVmdCwgb2IgZWluZSBWZXJ6b2VnZXJ1bmcgZGVyIExpZWZlcnVuZyBlcmZvbGdlbgorICAgICAgICAgICAgICAgICAgICAgICBzb2xsIHVuZCB1ZWJlcmdpYnQgaW0gTmVnYXRpdmZhbGwgZ2xlaWNoIGFuCisgICAgICAgICAgICAgICAgICAgICAgIGRvX2RlbGl2ZXIoKQorICAgICAgICAgICAgICAgICAgICAgLSBBdXNnYWJlIGRlciBNZWxkdW5nZW4genVyIEJlc3RlbGx1bmcKKyAgICAgICAgICAgICAgICAgICAgIC0gdmVyem9lZ2VydGVyIEF1ZnJ1ZiB2b24gZG9fZGVsaXZlcigpCisgICAgICAgICAgICAgICAgICAgICAKK2RvX2RlbGl2ZXIoKSAgICAgICAgIC0gcHJ1ZWZ0IG5vY2htYWwgZGllIEFud2VzZW5oZWl0IGRlcyBFbXBmYWVuZ2VycworICAgICAgICAgICAgICAgICAgICAgLSBwcnVlZnQsIG9iIEhlaWx1bmcgZXJsYXVidCBpc3QgKHVlYmVyIFB1Ym1hc3RlcikKKyAgICAgICAgICAgICAgICAgICAgIC0gcHJ1ZWZ0IFBfTlBDX0ZBU1RIRUFMIHVuZCBrb3JyaWdpZXJ0IGRpZSBBbmdhYmVuLCBkaWUKKyAgICAgICAgICAgICAgICAgICAgICAgYXVzIGRlbSBNZW51ZWVpbnRyYWcga29tbWVuCisgICAgICAgICAgICAgICAgICAgICAtIGZ1ZWhydCBkYXMgS29uc3VtaWVyZW4gYmVpbSBFbXBmYWVuZ2VyIGR1cmNoCisgICAgICAgICAgICAgICAgICAgICAgICggZW1wZmFlbmdlci0+Y29uc3VtZSgpICkKKyAgICAgICAgICAgICAgICAgICAgIC0gQXVzZ2FiZSBkZXIgTWVsZHVuZyB6dW0gS29uc3VtaWVyZW4KKworcHViX2luaXQoKSAgICAgICAgICAgLSBNb2VnbGljaGtlaXQgZnVlciBNYWdpZXIsIGRpZSBXZXJ0ZSBkZXIgYW5nZWJvdGVuZW4KKyAgICAgICAgICAgICAgICAgICAgICAgU3BlaXNlbiB1bmQgR2V0cmFlbmtlIHp1IHVlYmVycHJ1ZWZlbgorICAgICAgICAgICAgICAgICAgICAgLSBlcndlaXRlcnRlIE1vZWdsaWNoa2VpdGVuIHp1bSBQcnVlZmVuIHZvbiBrb3JyZWt0ZW4KKyAgICAgICAgICAgICAgICAgICAgICAgTWVudWVlaW50cmFlZ2VuIGJpZXRldCBkYXMgUHViLVRvb2wKKyAgICAgICAgICAgICAgICAgICAgICAgKCAnL29iai90b29scy9wdWJ0b29sLmMnICkKKworSGlud2VpczogVW0gZGllc2UgUHJ1ZWZ1bmdlbiB1bmQgQWt0aW9uZW4gc2ljaGVyIHp1IGdld2FlaHJsZWlzdGVuLCBzb2xsdGUKKyAgICAgICAgIG1hbiBjb25zdW1lX3NvbWV0aGluZyBvZGVyIGRvX2RlbGl2ZXIgTklDSFQgdWViZXJzY2hyZWliZW4hCisgICAgICAgICBEYXMgZnVlaHJ0IGJlaSBBZW5kZXJ1bmdlbiBtaXQgZ3Jvc3NlciBXYWhyc2NoZWlubGljaGtlaXQgenUKKyAgICAgICAgIFByb2JsZW1lbiEKKyAgICAgICAgIFVlYmVyc2NocmVpYnQgYmVzc2VyIGRpZSBNZXRob2RlbiwgZGllIGRpZSBGdW5rdGlvbmFsaXRhZXQKKyAgICAgICAgIGJlaW5oYWx0ZXQsIGRpZSBpaHIgd2lya2xpY2ggYW5wYXNzZW4gd29sbHQuCisgICAgICAgICBGYWxscyBkYXMgbmljaHQgZ2VodCwgc3ByZWNodCBsaWViZXIgbWl0IGVpbmVtIFJNKywgb2IgZWluZSBMb2VzdW5nCisgICAgICAgICBkYWZ1ZXIgZ2VmdW5kZW4gd2VyZGVuIGthbm4uIERlciBTdGFuZGFyZC1QdWIgd3VyZGUgaW4gZGVyCisgICAgICAgICBWZXJnYW5nZW5oZWl0IHNvIGltbWVyIG1vZHVsYXJlciB1bmQgYmVzc2VyLgorCisKK1NJRUhFIEFVQ0g6IEFkZFRvTWVudSwgUmVtb3ZlRnJvbU1lbnUsIGNvbnN1bWUsIFF1ZXJ5TW9uZXksIEFkZE1vbmV5IAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFNvbiBBcHIgMTEgMTk6Mjg6MDAgMjAxMCBieSBDYWxkcmEKZGlmZiAtLWdpdCBhL2RvYy9zdGQvcmFuZG9tIGIvZG9jL3N0ZC9yYW5kb20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg5MjE0ZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zdGQvcmFuZG9tCkBAIC0wLDAgKzEsNzEgQEAKK0VzIGdpYnQgaW0gTUcgendlaSBRdWVsbGVuIHZvbiBQc2V1ZG8tWnVmYWxsc3phaGxlbi4KKworMSkgcmFuZG9tKCkKKyAgRGllc2UgZWZ1biBsaWVmZXJ0IGVpbmUgWnVmYWxsc3phaGwgYXVzIGRlbSBQc2V1ZG8tWnVmYWxsc3phaGxlbmdlbmVyYXRvcgorICAoUFJORykgZGVzIERyaXZlcnMuIChzLiBNYW5wYWdlKS4KKyAgV2VubiBrZWluZSBiZXNvbmRlcmVuIEdydWVuZGVuIHZvcmxpZWdlbiwgc29sbHRlIGltbWVyIGRpZXNlIHZlcndlbmRldAorICB3ZXJkZW4uCisKKworMikgL3N0ZC91dGlsL3JhbmQtZ2xmc3IuYworICBGYWxscyBqZW1hbmQgYXVzIGlyZ2VuZGVpbmVtIEdydW5kIGVpbmUgU2VxdWVueiB2b24gUHNldWRvLVp1ZmFsbHN6YWhsZW4KKyAgYnJhdWNodCwgZGllIHNwYWV0ZXIgcmVwcm9kdXppZXJiYXIgc2VpbiBzb2xsIChkLmguIGRlciBTZWVkIG11c3MKKyAga29uZmlndXJpZXJiYXIgc2VpbiksIGdpYnQgZXMgdW50ZXIgL3N0ZC91dGlsL3JhbmQtZ2xmc3IuYyBlaW5lbiBzaW1wbGVuLAorICBuaWNodCBhbGx6dSBndXRlbiB1bmQgc2VociBpbmVmZml6aWVudGVuIFBzZXVkby1adWZhbGxzemFobGVuZ2VuZXJhdG9yLgorCitJbnRlcmZhY2U6CisqIHB1YmxpYyB2YXJhcmdzIHZvaWQgaW5pdChpbnQgc2VlZCwgaW50IG5ld3ApCisgIFNldHp0IGRhcyBTZWVkICh1bmQgZGFzIEVyemV1Z3VuZ3Nwb2x5bm9tLCB3ZW5uIGdld3VlbnNjaHQsIHdvdm9uIGljaAorICBhYmVyIGFicmF0ZW4gd3VlcmRlKS4gRGVyIFNlZWQgZGFyZiBuaWNodCAwIHNlaW4uCisqIHB1YmxpYyB2b2lkIEluaXRXaXRoVVVJRChzdHJpbmcgdXVpZCkKKyAgQmVyZWNobmV0IGVpbmVuIFNlZWQgYXVzIGRlciB1dWlkIHVuZCBpbml0aWFsaXNpZXJ0IGRlbiBQUk5HIGRhbWl0ICh1bmQgZGVtCisgIERlZmF1bHQtUG9seW5vbSkuCisqIHB1YmxpYyBpbnQgbmV4dGJpdCgpCisgIExpZWZlcnQgZWluIHp1ZmFlbGxpZ2VzIEJpdCAoYWxzbyAwIG9kZXIgMSkuCisqIHB1YmxpYyBpbnQgbmV4dGJpdHMoaW50IGNvdW50KQorICBMaWVmZXJ0IDxjb3VudD4gQml0cyAobWF4IDY0KSBpbiBlaW5lbSBpbnQuCisqIHB1YmxpYyBpbnQgcmFuZG9tKGludCBuKQorICBMaWVmZXJ0IGVpbmUgWnVmYWxsc3phaGwgendpc2NoZW4gMCB1bmQgbi0xLCBpbiB3ZWxjaGVyIDMyIGJpdHMgYW4gCisgIFBzZXVkb3p1ZmFsbCBzdGVja2VuLgorICBEYXMgU2VlZCB2b24gZGVyIEJsdWVwcmludCB3aXJkIHZlcm11dGxpY2ggc3RhZW5kaWcgdmVyYWVuZGVydCAoZC5oLgorICB2ZXJsYXNzdCBldWNoIG5pY2h0IGRyYXVmLCBkYXNzIGVzIGtvbnN0YW50IGJsZWlidCksIHdvbGx0IGlociBlaW5lCisgICdwcml2YXRlJyBJbnN0YW56IG1pdCBldXJlbSBTZWVkLCBjbG9udCBkYXMgT2JqZWt0IChhYmVyIHZlcmxpZXJ0IGRlbiBDbG9uZQorICBuaWNodCkuCisKKyAgVW5kIHVtIGVzIG5vY2htYWwgenUgc2FnZW46CisgIERpZSBJTUhPIGVpbnppZ2Ugc2lubnZvbGxlIEFud2VuZHVuZyBpc3QsIHdlbm4gbWFuIGF1cyBpcmdlbmRlaW5lbSBHcnVuZAorICBkYXMgc2VlZCBzZWxiZXIgd2FlaGxlbiBtdXNzLCBkYW1pdCBtYW4gZGllIFNlcXVlbnogdm9uIFBzZXVkb3p1ZmFsbCBpbW1lcgorICB3aWVkZXIgcmVwcm9kdXppZXJlbiBrYW5uLgorICBJbiBhbGxlbiBhbmRlcmVuIEZhZWxsZW4gbmVobXQgYmVzc2VyIGRhcyByYW5kb20oKSB2b20gRHJpdmVyLgorCitEZXIgUFJORyBiZW51dHp0IGVpbiBMaW5lYXIgRmVlZGJhY2sgU2hpZnQgUmVnaXN0ZXIgKGluIEdhbG9pcy1WYXJpYW50ZSkuIERpZQorUGVyaW9kZW5sYWVuZ2UgZGVzIHBlciBEZWZhdWx0IGJlbnV0enRlbiBFcnpldWduZ3Nwb2x5bm9tcyBpc3QgMl4zMiAtIDEsIGQuaC4KK25hY2ggNDI5NDk2NzI5NSBCaXRzIHdpZWRlcmhvbHQgc2ljaCBkaWUgU2VxdWVuei4KK0RhcyBEZWZhdWx0LVBvbHlub20gaXN0OgoreF4zMiArIHheMzEgKyB4XjI4ICsgeF4yNyArIHheMjQgKyB4XjIzICsgeF4yMCArIHheMTkgKyB4XjE2ICsgeF4xNSArIHheMTIKKyAgICAgKyB4XjExICsgeF44ICsgeF43ICsgeF41ICsgeF4zICsgMQorKFphaGxlbndlcnQ6IDB4MTk5OTk5OWE4KQorCitXZXIgZWluIGFuZGVyZXMgUG9seW5vbSB3aWxsLCBrYW5uIGRhcyBwZXIgaW5pdCgpIGtvbmZpZ3VyaWVyZW4sIHNvbGx0ZSBzaWNoCithYmVyIHNjaGxhdSBtYWNoZW4sIHdlbGNoZSBzaW5udm9sbCBudXR6YmFyIHNpbmQuCisKKworRWluIHBhYXIgc3RhdGlzdGlzY2hlIERhdGVuIGVpbmVzIFN0cm9tcyB2b24gNDA5NjAgQml0czoKK1ZhbHVlIENoYXIgT2NjdXJyZW5jZXMgRnJhY3Rpb24KKyAgMCAgICAgICAgICAgIDIwNDc0ICAgMC40OTk4NTQKKyAgMSAgICAgICAgICAgIDIwNDg2ICAgMC41MDAxNDYKKworVG90YWw6ICAgICAgICAgNDA5NjAgICAxLjAwMDAwMAorCitFbnRyb3B5ID0gMS4wMDAwMDAgYml0cyBwZXIgYml0LgorCitPcHRpbXVtIGNvbXByZXNzaW9uIHdvdWxkIHJlZHVjZSB0aGUgc2l6ZQorb2YgdGhpcyA0MDk2MCBiaXQgZmlsZSBieSAwIHBlcmNlbnQuCisKK0NoaSBzcXVhcmUgZGlzdHJpYnV0aW9uIGZvciA0MDk2MCBzYW1wbGVzIGlzIDAuMDAsIGFuZCByYW5kb21seQord291bGQgZXhjZWVkIHRoaXMgdmFsdWUgOTUuMjcgcGVyY2VudCBvZiB0aGUgdGltZXMuCisKK0FyaXRobWV0aWMgbWVhbiB2YWx1ZSBvZiBkYXRhIGJpdHMgaXMgMC41MDAxICgwLjUgPSByYW5kb20pLgorTW9udGUgQ2FybG8gdmFsdWUgZm9yIFBpIGlzIDMuMTA5MDI2OTY0IChlcnJvciAxLjA0IHBlcmNlbnQpLgorU2VyaWFsIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50IGlzIC0wLjAwODM5OSAodG90YWxseSB1bmNvcnJlbGF0ZWQgPSAwLjApLgorCmRpZmYgLS1naXQgYS9kb2Mvc3RkL3Jvb20gYi9kb2Mvc3RkL3Jvb20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRlNTc1ZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zdGQvcm9vbQpAQCAtMCwwICsxLDE0MyBAQAorU1RBTkRBUkRPQkpFS1QgRlVFUiBSQUVVTUU6CisKK0JFTlVUWlVORzoKKyAgICAgIGluaGVyaXQgIi9zdGQvcm9vbSI7CisgICAgICAKKyAgICAgICNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisgICAgICAjaW5jbHVkZSA8cm9vbXMuaD4gICAgICAgICAgICAvLyBGdWVyIEFkZEl0ZW0oKSB1bmQgTmV3RG9vcigpCisKK0JFU0NIUkVJQlVORzoKKyAgICAgIEVpbiBSYXVtIGlzdCBlaW4gT2JqZWt0LCBkYXMgdm9uIFNwaWVsZXJuIG9kZXIgYW5kZXJlbiBMZWJld2VzZW4KKyAgICAgIGJldHJldGVuIHdlcmRlbiBrYW5uLiBFciBoYXQgTGFuZy0gdW5kIEt1cnpiZXNjaHJlaWJ1bmdlbiB2b24KKyAgICAgIGlubmVuIHVuZCBhdXNzZW4gKHp1bSBCZWlzcGllbCBTY2hpZmZlIG9kZXIgYWVobmxpY2hlIFJhZXVtZSBpbgorICAgICAgUmFldW1lbiksIGRpZSBzaWNoIGRlciBTcGllbGVyIGplIG5hY2ggc2VpbmVuIEJlZHVlcmZuaXNzZW4KKyAgICAgIGFuemVpZ2VuIGxhc3NlbiBrYW5uIChrdXJ6L2xhbmctTW9kdXMpLgorCisgICBQcm9wZXJ0aWVzOgorCisgICAgICBQX0lOVF9TSE9SVAorICAgICAgICAgICAgS3VyemJlc2NocmVpYnVuZyBpbm5lcmhhbGIgZGVzIFJhdW1lcworICAgICAgUF9JTlRfTE9ORworICAgICAgICAgICAgTGFuZ2Jlc2NocmVpYnVuZyBpbm5lcmhhbGIgZGVzIFJhdW1lcworICAgICAgUF9TSE9SVAorICAgICAgICAgICAgS3VyemJlc2NocmVpYnVuZyB2b24gYXVzc2VuIChudXIgbm9ldGlnLCB3ZW5uIG1hbiBkZW4gUmF1bQorICAgICAgICAgICAgYXVjaCB3aXJrbGljaCB2b24gYXVzc2VuIHNlaGVuIGthbm4pCisgICAgICBQX0xPTkcKKyAgICAgICAgICAgIExhbmdiZXNjaHJlaWJ1bmcgdm9uIGF1c3NlbiAoc2llaGUgUF9TSE9SVCkKKyAgICAgIFVtIFNpdHVhdGlvbnNiZXpvZ2VuZSBCZXNjaHJlaWJ1bmdlbiB6dSBiZWtvbW1lbiwga2FubiBtYW4gCisgICAgICBRdWVyeW1ldGhvZGVuIGF1ZiBkaWUgamV3ZWlsaWdlbiBQcm9wZXJ0aWVzIHNldHplbiwgc2llaGUgRG9rdW1lbnRhdGlvbgorICAgICAgenUgU2V0KCkuCisKKyAgICAgIFBfTElHSFQKKyAgICAgICAgICAgIExpY2h0bGV2ZWwgZGVzIFJhdW1zICgwIGR1bmtlbCwgMSBoZWxsKQorICAgICAgUF9MSUdIVF9UWVBFCisgICAgICAgICAgICBMaWNodGFydCwgbWl0IGRlciBkZXIgUmF1bSBiZWxldWNodGV0IGlzdCwgekIgTFRfU1VOTElHSFQKKyAgICAgIFBfSU5ET09SUworICAgICAgICAgICAgV2VubiBlcyBzaWNoIHVtIGVpbmVuIEF1c3NlbnJhdW0gaGFuZGVsdCwgMC4gMSBmdWVyIElubmVucmFldW1lLgorICAgICAgUF9UUkFOU1BBUkVOVAorICAgICAgICAgICAgSXN0IHVuZ2xlaWNoIDAsIHdlbm4gbWFuIGluIGRlbiBSYXVtIHZvbiBhdXNzZW4gcmVpbnNjaGF1ZW4KKyAgICAgICAgICAgIGthbm4sIG9kZXIgdm9uIGlubmVuIG5hY2ggYXVzc2VuCisgICAgICBQX05PX1RQT1JUCisgICAgICAgICAgICBadW0gdmVyaGluZGVybiB2b24gVGVsZXBvcnR2ZXJzdWNoZW4gaW4gb2RlciBhdXMgZGVtIFJhdW0KKyAgICAgIFBfTk9NQUdJQworICAgICAgICAgICAgSW0gUmF1bSBrYW5uIG5pY2h0IGdlemF1YmVydCB3ZXJkZW4uCisgIFBfV0FURVIKKyAgICBJbSBSYXVtIGthbm4gZ2VhbmdlbHQgd2VyZGVuLCB1bmQgbWFuIGthbm4gZ2dmLiBzb2dhciBGaXNjaGUgZmFuZ2VuLgorCisgICBGdW5rdGlvbmVuOgorCisgIEFkZEV4aXQoc3RyaW5nfHN0cmluZyoga21uZCwgc3RyaW5nIHppZWxyYXVtKQorICAgICAgICAgICAgPGttbmQ+IGthbm4gZWluIFN0cmluZyBzZWluIG9kZXIgZWluZSBMaXN0ZSB2b24gU3RyaW5ncworICAgICAgICAgICAgbWl0IGRlbiBLb21tYW5kb3MgbWl0IGRlbmVuIGRlciBTcGllbGVyIGluIDx6aWVscmF1bT4KKyAgICAgICAgICAgIGxhbmRlbiBzb2xsLgorICAgICAgUmVtb3ZlRXhpdChzdHJpbmd8c3RyaW5nKiBrbW5kKQorICAgICAgICAgICAgPGttbmQ+IGlzdCBlaW4gU3RyaW5nIG9kZXIgZWluZSBMaXN0ZSB2b24gU3RyaW5ncywgZGVyZW4KKyAgICAgICAgICAgIEF1c2dhZW5nZSBlbnRmZXJudCB3ZXJkZW4gc29sbGVuLiBEYWJlaSBtdXNzIG1hbiBldHdhcyB2b3ItCisgICAgICAgICAgICBzaWNodGlnIHNlaW4sIGRhIGVpbiBTcGllbGVyLCBkZXIgenVtIFplaXRwdW5rdCBkZXMgQXVmcnVmcworICAgICAgICAgICAgaW0gUmF1bSBpc3QsIGRpZSBBa3Rpb24gZnVlciBzaWNoIG5vY2ggZGVmaW5pZXJ0IGhhdC4KKyAgICAgICAgICAgIEFsc286IE51ciBiZW51dHplbiwgd2VubiBtYW4gd2Vpc3MsIHdhcyBtYW4gdHV0IQorICAgICAgQWRkU3BlY2lhbEV4aXQoc3RyaW5nfHN0cmluZyoga21uZCwgc3RyaW5nIGZ1bmt0aW9uKQorICAgICAgICAgICAgPGZ1bmt0aW9uPiB3aXJkIGF1ZmdlcnVmZW4sIHdlbm4gZGVyIFNwaWVsZXIgZGFzIEtvbW1hbmRvCisgICAgICAgICAgICA8a21uZD4gdGlwcHQgKG9kZXIgZWlucyBkZXIgS29tbWFuZG9zLCB3ZW5uIDxrbW5kPiBlaW5lCisgICAgICAgICAgICBMaXN0ZSBpc3QpLiBOdWV0emxpY2ggenVtIEJlaXNwaWVsIHVtIGVpbmVuIFNwaWVsZXIgbnVyCisgICAgICAgICAgICBkdXJjaHp1bGFzc2VuLCB3ZW5uIGVpbiBXYWVjaHRlciBuaWNodCBkYSBpc3QuCisgICAgICAgICAgICBQX0FFUklBTF9IRUxQRVJTL1BfQVFVQVRJQ19IRUxQRVJTCisgICAgICAgICAgICAgIFNvbGx0ZSBlcyBnZXd1ZW5zY2h0IHNlaW4sIGRhc3MgYmVzdGltbXRlIFJhZXVtZSB6LkIuIG51ciAKKyAgICAgICAgICAgICAgZmxpZWdlbmQgZXJyZWljaHQgd2VyZGVuIGtvZW5uZW4sIG9kZXIgZGFzcyBtYW4gZnVlciBlaW5lbiAKKyAgICAgICAgICAgICAgYmVzdGltbXRlbiBBdXNnYW5nIHRhdWNoZW4ga29lbm5lbiBtdXNzLCBzaW5kIGRpZXNlIAorICAgICAgICAgICAgICBQcm9wZXJ0aWVzIGhpbGZyZWljaCwgZGllIGltIFNwaWVsZXJvYmpla3QgZGVmaW5pZXJ0IHNpbmQgCisgICAgICAgICAgICAgIHVuZCBkaWUgZG9ydCBha3R1ZWxsIHJlZ2lzdHJpZXJ0ZW4gSGlsZnNvYmpla3RlIGZ1ZXJzIAorICAgICAgICAgICAgICBGbGllZ2VuL1NlZ2VsbiB1bmQgVGF1Y2hlbiBlbnRoYWx0ZW4uCisgICAgICBSZW1vdmVTcGVjaWFsRXhpdChzdHJpbmd8c3RyaW5nKiBrbW5kKQorICAgICAgICAgICAgc2llaGUgUmVtb3ZlRXhpdCgpCisgICAgICBOZXdEb29yKCkKKyAgICAgICAgICAgIEZ1ZWd0IGRlbSBSYXVtIGVpbmUgVHVlciBoaW56dSwgZGllIGluIGVpbmVuIHp3ZWl0ZW4gUmF1bSBmdWVocnQsCisgICAgICAgICAgICB1bmQgZGllIGRlciBTcGllbGVyIChnZ2YuIG1pdCBlaW5lbSBTY2hsdWVzc2VsKSBvZWZmbmVuIHVuZCAKKyAgICAgICAgICAgIHNjaGxpZXNzZW4ga2Fubi4KKyAgICAgIAorICAgICAgVW0gUmFldW1lIGludGVyZXNzYW50ZXIgenUgbWFjaGVuLCBrYW5uIG1hbiBpaG5lbiBEZXRhaWxzLCBkaWUgCisgICAgICB2b20gU3BpZWxlciBhbmdlc2NoYXV0IHdlcmRlbiBrb2VubmVuLCBlaW5iYXVlbjoKKworICAgICAgQWRkRGV0YWlsKHN0cmluZ3xzdHJpbmcqIGtleXMsIHN0cmluZyBkZXNjcikKKyAgICAgICAgICAgIEVpbmUgQmVzY2hyZWlidW5nIHZvbiBEZXRhaWxzLCBkaWUgdm9tIFNwaWVsZXIgYW5nZXNjaGF1dAorICAgICAgICAgICAgd2VyZGVuIGtvZW5uZW4gd2lyZCBkZW0gUmF1bSBnZWdlYmVuLiA8a2V5cz4ga2FubiBlaW4KKyAgICAgICAgICAgIFN0cmluZyBzZWluIG9kZXIgZWluZSBMaXN0ZSB2b24gU3RyaW5ncy4gPGRlc2NyPiBpc3QKKyAgICAgICAgICAgIGRpZSBCZXNjaHJlaWJ1bmcsIGRpZSBkZXIgU3BpZWxlciBlcmhhZWx0LgorICAgICAgUmVtb3ZlRGV0YWlsKHN0cmluZ3xzdHJpbmcqIGtleXMpCisgICAgICAgICAgICBFbnRmZXJudCBlaW4gRGV0YWlsIGF1cyBlaW5lbSBSYXVtLiA8a2V5cz4ga2FubiBlaW4gU3RyaW5nCisgICAgICAgICAgICBzZWluIG9kZXIgZWluZSBMaXN0ZSB2b24gU3RyaW5ncy4KKyAgICAgIEFkZFNwZWNpYWxEZXRhaWwoc3RyaW5nfHN0cmluZyoga2V5cywgc3RyaW5nIGZ1bmN0aW9uKQorICAgICAgICAgICAgSW0gUHJpbnppcCB3aWUgQWRkRGV0YWlsKCksIG51ciB3aXJkIGFscyB6d2VpdGVzIEFyZ3VtZW50CisgICAgICAgICAgICBrZWluIGZlc3RlciBTdHJpbmcgYW5nZWdlYmVuLCBzb25kZXJuIGVpbmUgRnVua3Rpb24sIGRpZQorICAgICAgICAgICAgZWluZW4gU3RyaW5nIHp1cnVlY2tnZWJlbiBtdXNzLiBEYW1pdCBrYW5uIG1hbiB2YXJpYWJsZQorICAgICAgICAgICAgRGV0YWlscyBwcm9ncmFtbWllcmVuLgorICAgICAgUmVtb3ZlU3BlY2lhbERldGFpbChzdHJpbmd8c3RyaW5nKiBrZXlzKQorICAgICAgICAgICAgc2llaGUgUmVtb3ZlRGV0YWlsKCkKKyAgICAgIEFkZFJlYWREZXRhaWwoc3RyaW5nfHN0cmluZyoga2V5cywgc3RyaW5nIGRlc2MpCisgICAgICAgICAgICA8ZGVzYz4gd2lyZCBhdXNnZWdlYmVuLCB3ZW5uIGVpbiBTcGllbGVyIGRlbiA8a2V5PiBsaWVzdC4KKyAgICAgICAgICAgIDxrZXlzPiBrYW5uIHdpZWRlciBlaW4gU3RyaW5nIG9kZXIgZWluZSBMaXN0ZSB2b24gU3RyaW5ncworICAgICAgICAgICAgc2Vpbi4KKyAgICAgIFJlbW92ZVJlYWREZXRhaWwoc3RyaW5nfHN0cmluZyoga2V5cykKKyAgICAgICAgICAgIHNpZWhlIFJlbW92ZURldGFpbCgpCisgICAgICBBZGRSb29tTWVzc2FnZShzdHJpbmcqIG1zZywgaW50IHByb2IsIHN0cmluZ3xtaXhlZCAqZnVuYykKKyAgICAgICAgICAgIEFsbGUgPHByb2I+IFNla3VuZGVuIHdpcmQgYXVzIGVpbmVyIExpc3RlIHZvbiBNZWxkdW5nZW4KKyAgICAgICAgICAgICg8bXNnPikgenVmYWVsbGlnIGVpbmUgYXVzZ2VzdWNodCwgZGllIGRhbm4gaW0gUmF1bSBlci0KKyAgICAgICAgICAgIHNjaGVpbnQuIFdlbm4gZGFzIEFyZ3VtZW50IDxmdW5jPiBhbmdlZ2ViZW4gaXN0LCB3aXJkCisgICAgICAgICAgICBlaW5lIEZ1bmt0aW9uIGRpZXNlbiBOYW1lbnMgYXVmZ2VydWZlbiwgZGVyIGRlciBJbmRleAorICAgICAgICAgICAgZGVyIGF1c2dlZ2ViZW5lbiBNZWxkdW5nIGFscyBBcmd1bWVudCB1ZWJlcmdlYmVuIHdpcmQuCisgICAgICAgICAgICBGdW5jIGRhcmYgYXVjaCBlaW5lbiBBcnJheSB2b24gRnVua3Rpb25lbiBlbnRoYWx0ZW4uCisKKyAgICAgIEFkZENtZChzdHJpbmd8c3RyaW5nKiBjbWQsIHN0cmluZyBmdW5jLCBpbnQgZmxhZykKKyAgICAgICAgICAgIEltIFJhdW0gd2lyZCBiZWltIEtvbW1hbmRvIDxjbWQ+IChvZGVyIGVpbmVtIGRlciBLb21tYW5kb3MpCisgICAgICAgICAgICBkaWUgRnVua3Rpb24gPGZ1bmM+IGF1ZmdlcnVmZW4uIDxmdW5jPiBtdXNzIDEgenVydWVjay0KKyAgICAgICAgICAgIGdlYmVuLCB3ZW5uIGRpZSBGdW5rdGlvbiBkaWUgS29tYmluYXRpb24gYXVzIEtvbW1hbmRvCisgICAgICAgICAgICB1bmQgQXJndW1lbnRlbiBha3plcHRpZXJ0LCBhbnNvbnN0ZW4gMC4gQWxsZXMgd2FzIGVpbgorICAgICAgICAgICAgU3BpZWxlciBoaW50ZXIgPGNtZD4gbm9jaCBhbmdpYnQsIHdpcmQgZGVyIEZ1bmt0aW9uIGFscworICAgICAgICAgICAgQXJndW1lbnQgdWViZXJnZWJlbi4gV2VubiA8ZmxhZz4gZ2VzZXR6dCBpc3QsIHdpcmQgamVkZXMKKyAgICAgICAgICAgIEtvbW1hbmRvLCBkYXMgbWl0IDxjbWQ+IGJlZ2lubnQgYWt6ZXB0aWVydC4KKyAgICAgIFJlbW92ZUNtZChzdHJpbmd8c3RyaW5nKiBjbWQpCisgICAgICAgICAgICBFbnRmZXJudCBlaW4gS29tbWFuZG8gYXVzIGRlbSBSYXVtLgorICAgICAgICAgICAgQUNIVFVORzogQmVpIFNwaWVsZXJuLCBkaWUgenVtIFplaXRwdW5rdCBkZXMgRnVua3Rpb25zLQorICAgICAgICAgICAgYXVmcnVmcyBub2NoIGltIFJhdW0gc2luZCwgaXN0IGRhcyBLb21tYW5kbyBub2NoIGRlZmluaWVydC4KKyAgICAgICAgICAgIEFsc286IE51ciBiZW51dHplbiwgd2VubiBtYW4gZ2VuYXUgd2Vpc3MsIHdhcyBtYW4gdHV0LgorCisgICAgICBBZGRJdGVtKHN0cmluZyBmaWxlbmFtZSwgaW50IHJlZnJlc2gpCisgICAgICAgICAgICBFaW4gT2JqZWt0IG1pdCBQZmFkIDxmaWxlbmFtZT4gd2lyZCBlcnpldWd0IHVuZCBpbiBkZW4KKyAgICAgICAgICAgIFJhdW0gYmV3ZWd0LCBkYWJlaSBnaWJ0IGVzIHZpZXIgdmVyc2NoaWVkZW5lIE1vZGksIGRpZQorICAgICAgICAgICAgdWViZXIgZGFzIEFyZ3VtZW50IDxyZWZyZXNoPiBhbmdlZ2ViZW4gd2VyZGVuOgorICAgICAgICAgICAgUkVGUkVTSF9OT05FOiBEYXMgT2JqZWt0IHdpcmQgbnVyIGJlaW0gYWxsZXJlcnN0ZW4gbWFsCisgICAgICAgICAgICAgICAgICBlcnpldWd0LCB1bmQgZGFubiBuaWUgd2llZGVyIChlcnN0IGJlaW0gcmVib290KQorICAgICAgICAgICAgUkVGUkVTSF9ERVNUUlVDVDogRWluIG5ldWVzIE9iamVrdCB3aXJkIGVyc3QgZXJ6ZXVndCwgCisgICAgICAgICAgICAgICAgICB3ZW5uIGRhcyBhbHRlIHplcnN0b2VydCBpc3QuIFNvIGthbm4gbWFuIHNpY2hlcgorICAgICAgICAgICAgICAgICAgZ2VoZW4sIGRhc3MgbnVyIGVpbiBFeGVtcGxhciBpbSBTcGllbCBpc3QuCisgICAgICAgICAgICBSRUZSRVNIX1JFTU9WRTogQmVpbSByZXNldCB3aXJkIGVpbiBuZXVlcyBPYmpla3QgZXJ6ZXVndCwKKyAgICAgICAgICAgICAgICAgIHdlbm4gc2ljaCBkYXMgYWx0ZSBuaWNodCBtZWhyIGltIFJhdW0gYmVmaW5kZXQuCisgICAgICAgICAgICBSRUZSRVNIX0FMV0FZUzogQmVpIGplZGVtIHJlc2V0IHdpcmQgZWluIG5ldWVzIE9iamVrdCAKKyAgICAgICAgICAgICAgICAgIGVyemV1Z3QuIFZPUlNJQ0hUOiBLYW5uIHp1IHJpZXNpZ2VuIE1lbmdlbiB2b24KKyAgICAgICAgICAgICAgICAgIE9iamVrdGVuIGZ1ZWhyZW4sIHdlbm4gZWluIFJhdW0gbGFuZ2UgbmljaHQgYmUtCisgICAgICAgICAgICAgICAgICBzdWNodCB3aXJkLgorICAgICAgICAgICAgRGllIEtvbnN0YW50ZW4gUkVGUkVTSF8qIHNpbmQgaW4gPHJvb21zLmg+IGRlZmluaWVydC4KKworICAgICAgQXVmIGRpZSBQcm9wZXJ0aWVzIFBfRVhJVFMsIFBfU1BFQ0lBTF9FWElUUywgUF9ERVRBSUxTLCAKKyAgICAgIFBfU1BFQ0lBTF9ERVRBSUxTLCBQX1JFQURfREVUQUlMUywgUF9DT01NQU5EUyB1bmQgUF9JVEVNUworICAgICAgc29sbHRlIE5JQ0hUIGRpcmVrdCB6dWdlZ3JpZmZlbiB3ZXJkZW4uCmRpZmYgLS1naXQgYS9kb2Mvc3RkL3Jvb20uZG9rdSBiL2RvYy9zdGQvcm9vbS5kb2t1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNzc0YzYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc3RkL3Jvb20uZG9rdQpAQCAtMCwwICsxLDEzMiBAQAorU1RBTkRBUkRPQkpFS1QgRlVFUiBSQUVVTUU6CisKK0JFTlVUWlVORzoKKwlpbmhlcml0ICJzdGQvcm9vbSI7CisJCisJI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKwkjaW5jbHVkZSA8cm9vbXMuaD4JCS8vIEZ1ZXIgQWRkSXRlbSgpIHVuZCBOZXdEb29yKCkKKworQkVTQ0hSRUlCVU5HOgorCUVpbiBSYXVtIGlzdCBlaW4gT2JqZWt0LCBkYXNzIHZvbiBTcGllbGVybiBvZGVyIGFuZGVyZW4gTGViZXdlc2VuCisJYmV0cmV0ZW4gd2VyZGVuIGthbm4uIEVyIGhhdCBMYW5nLSB1bmQgS3VyemJlc2NocnJlaWJ1bmdlbiB2b24KKwlpbm5lbiB1bmQgYXVzc2VuICh6dW0gQmVpc3BpZWwgU2NoaWZmZSBvZGVyIGFlaG5saWNoZSBSYWV1bWUgaW4KKwlSYWV1bWVuKSwgZGllIHNpY2ggZGVyIFNwaWVsZXIgamUgbmFjaCBzZWluZW4gQmVkdWVyZnRuaXNzZW4KKwlhbnplaWdlbiBsYXNzZW4ga2FubiAoa3Vyei9sYW5nLU1vZHVzKS4KKworICAgUHJvcGVydGllczoKKworCVBfSU5UX1NIT1JUCisJCUt1cnpiZXNjaHJlaWJ1bmcgaW5uZXJoYWxiIGRlcyBSYXVtZXMKKwlQX0lOVF9MT05HCisJCUxhbmdiZXNjaHJlaWJ1bmcgaW5uZXJoYWxiIGRlcyBSYXVtZXMKKwlQX1NIT1JUCisJCUt1cnpiZXNjaHJpZWJ1bmcgdm9uIGF1c3NlbiAobnVyIG5vZXRpZywgd2VubiBtYW4gZGVuIFJhdW0KKwkJYXVjaCB3aXJrbGljaCB2b24gYXVzc2VuIHNlaGVuIGthbm4pCisJUF9MT05HCisJCUxhbmdiZXNjaHJlaWJ1bmcgdm9uIGF1c3NlbiAoc2llaGUgUF9TSE9SVCkKKwlVbSBTaXR1YXRpb25zYmV6b2dlbmUgQmVzY2hyZWlidW5nZW4genUgYmVrb21tZW4sIGthbm4gbWFuIAorCWludF9zaG9ydCgpLCBpbnRfbG9uZygpLCBzaG9ydCgpLCBsb25nKCkgdWViZXJzY2hyZWliZW4sIG9kZXIKKwlkZW4gcHJvY2Vzc19zdHJpbmcgTWVjaGFuaXNtdXMgdmVyd2VuZGVuIChzaWVoZSBlbnRzcHJlY2hlbmRlCisJRG9rdW1lbnRhdGlvbikKKworCVBfTElHSFQKKwkJTGljaHRsZXZlbCBkZXMgUmF1bXMgKDAgZHVua2VsLCAxIGhlbGwpCisJUF9JTkRPT1JTCisJCTEgV2VubiBkZXIgUmF1bSBuaWNodCBpbSBGcmVpZW4gaXN0CisJUF9UUkFOU1BBUkVOVAorCQlJc3QgdW5nbGVpY2ggMCwgd2VubiBtYW4gaW4gZGVuIFJhdW0gdm9uIGF1c3NlbiByZWluc2NoYXVlbgorCQlrYW5uLCBvZGVyIHZvbiBpbm5lbiBuYWNoIGF1c3NlbgorCVBfTk9fVFBPUlQKKwkJWnVtIHZlcmhpbmRlcm4gdm9uIFRlbGVwb3J0dmVyc3VjaGVuIGluIG9kZXIgYXVzIGRlbSBSYXVtCisJCShzaWVoZSBhdWNoIC9kb2MvcHJvcGVydGllcy5oKQorCVBfTk9NQUdJQworCQlJbSBSYXVtIGthbm4gbmljaHQgZ2V6YXViZXJ0IHdlcmRlbi4KKworICAgRnVua3Rpb25lbjoKKwlBZGRFeGl0KHN0cmluZ3xzdHJpbmcqIGttbmQsIHN0cmluZyB6aWVscmF1bSkKKwkJPGttbmQ+IGthbm4gZWluIFN0cmluZyBzZWluIG9kZXIgZWluZSBMaXN0ZSB2b24gU3RyaW5ncworCQltaXQgZGVuIEtvbW1hbmRvcyBtaXQgZGVuZW4gZGVyIFNwaWVsZXIgaW4gPHppZWxyYXVtPgorCQlsYW5kZW4gc29sbC4KKwlSZW1vdmVFeGl0KHN0cmluZ3xzdHJpbmcqIGttbmQpCisJCTxrbW5kPiBpc3QgZWluIFN0cmluZyBvZGVyIGVpbmUgTGlzdGUgdm9uIFN0cmluZ3MsIGRlcmVuCisJCUF1c2dhZW5nZSBlbnRmZXJudCB3ZXJkZW4gc29sbGVuLiBEYWJlaSBtdXNzIG1hbiBldHdhcyB2b3ItCisJCXNpY2h0aWcgc2VpbiwgZGEgZWluIFNwaWVsZXIsIGRlciB6dW0gWmVpdHB1bmt0IGRlcyBBdWZydWZzCisJCWltIFJhdW0gaXN0LCBkaWUgQWt0aW9uIGZ1ZXIgc2ljaCBub2NoIGRlZmluaWVydCBoYXQuCisJCUFsc286IE51ciBiZW51dHplbiwgd2VubiBtYW4gd2Vpc3MsIHdhcyBtYW4gdHV0IQorCUFkZFNwZWNpYWxFeGl0KHN0cmluZ3xzdHJpbmcqIGttbmQsIHN0cmluZyBmdW5rdGlvbikKKwkJPGZ1bmt0aW9uPiB3aXJkIGF1ZmdlcnVmZW4sIHdlbm4gZGVyIFNwaWVsZXIgZGFzIEtvbW1hbmRvCisJCTxrbW5kPiB0aXBwdCAob2RlciBlaW5zIGRlciBLb21tYW5kb3MsIHdlbm4gPGttbmQ+IGVpbmUKKwkJTGlzdGUgaXN0KS4gTnVldHpsaWNoIHp1bSBCZWlzcGllbCB1bSBlaW5lbiBTcGllbGVyIG51cgorCQlkdXJjaHp1bGFzc2VuLCB3ZW5uIGVpbiBXYWVjaHRlciBuaWNodCBkYSBpc3QuCisJUmVtb3ZlU3BlY2lhbEV4aXQoc3RyaW5nfHN0cmluZyoga21uZCkKKwkJc2llaGUgUmVtb3ZlRXhpdCgpCisJTmV3RG9vcigpCisJCXNpZWhlIC9kb2Mvc3RkL2Rvb3IKKwkKKwlVbSBSYWV1bWUgaW50ZXJlc3NhbnRlciB6dSBtYWNoZW4sIGthbm4gbWFuIGlobmVuIERldGFpbHMsIGRpZSAKKwl2b20gU3BpZWxlciBhbmdlc2NoYXV0IHdlcmRlbiBrb2VubmVuLCBlaW5iYXVlbjoKKworCUFkZERldGFpbChzdHJpbmd8c3RyaW5nKiBrZXlzLCBzdHJpbmcgZGVzY3IpCisJCUVpbmUgQmVzY2hyZWlidW5nIHZvbiBEZXRhaWxzLCBkaWUgdm9tIFNwaWVsZXIgYW5nZXNjaGF1dAorCQl3ZXJkZW4ga29lbm5lbiB3aXJkIGRlbSBSYXVtIGdlZ2ViZW4uIDxrZXlzPiBrYW5uIGVpbgorCQlTdHJpbmcgc2VpbiBvZGVyIGVpbmUgTGlzdGUgdm9uIFN0cmluZ3MuIDxkZXNjcj4gaXN0CisJCWRpZSBCZXNjaHJlaWJ1bmcsIGRpZSBkZXIgU3BpZWxlciBlcmhhZWx0LgorCVJlbW92ZURldGFpbChzdHJpbmd8c3RyaW5nKiBrZXlzKQorCQlFbnRmZXJudCBlaW4gRGV0YWlsIGF1cyBlaW5lbSBSYXVtLiA8a2V5cz4ga2FubiBlaW4gU3RyaW5nCisJCXNlaW4gb2RlciBlaW5lIExpc3RlIHZvbiBTdHJpbmdzLgorCUFkZFNwZWNpYWxEZXRhaWwoc3RyaW5nfHN0cmluZyoga2V5cywgc3RyaW5nIGZ1bmN0aW9uKQorCQlJbSBQcmluemlwIHdpZSBBZGREZXRhaWwoKSwgbnVyIHdpcmQgYWxzIHp3ZWl0ZXMgQXJndW1lbnQKKwkJa2VpbiBmZXN0ZXIgU3RyaW5nIGFuZ2VnZWJlbiwgc29uZGVyIGVpbmUgRnVua3Rpb24sIGRpZQorCQllaW5lbiBTdHJpbmcgenVydWVja2dlYmVuIG11c3MuIERhbWl0IGthbm4gbWFuIHZhcmlhYmxlCisJCURldGFpbHMgcHJvZ3JhbW1pZXJlbi4KKwlSZW1vdmVTcGVjaWFsRGV0YWlsKHN0cmluZ3xzdHJpbmcqIGtleXMpCisJCXNpZWhlIFJlbW92ZURldGFpbCgpCisJQWRkUmVhZERldGFpbChzdHJpbmd8c3RyaW5nKiBrZXlzLCBzdHJpbmcgZGVzYykKKwkJPGRlc2M+IHdpcmQgYXVzZ2VnZWJlbiwgd2VubiBlaW4gU3BpZWxlciBkZW4gPGtleT4gbGllc3QuCisJCTxrZXlzPiBrYW5uIHdpZWRlciBlaW4gU3RyaW5nIG9kZXIgZWluZSBMaXN0ZSB2b24gU3RyaW5ncworCQlzZWluLgorCVJlbW92ZVJlYWREZXRhaWwoc3RyaW5nfHN0cmluZyoga2V5cykKKwkJc2llaGUgUmVtb3ZlRGV0YWlsKCkKKwlBZGRSb29tTWVzc2FnZShzdHJpbmcqIG1zZywgaW50IHByb2IsIHN0cmluZ3xzdHJpbmcgKmZ1bmMpCisJCUFsbGUgPHByb2I+IFNla3VuZGVuIHdpcmQgYXVzIGVpbmVyIExpc3RlIHZvbiBNZWxkdW5nZW4KKwkJKDxtc2c+KSB6dWZhZWxsaWcgZWluZSBhdXNnZXN1Y2h0LCBkaWUgZGFubiBpbSBSYXVtIGVyLQorCQlzY2hlaW50LiBXZW5uIGRhcyBBcmd1bWVudCA8ZnVuYz4gYW5nZWdlYmVuIGlzdCwgd2lyZAorCQllaW5lIEZ1bmt0aW9uIGRpZXNlbiBOYW1lbnMgYXVmZ2VydWZlbiwgZGVyIGRlciBJbmRleAorCQlkZXIgYXVzZ2VnZWJlbmVuIE1lbGR1bmcgYWxzIEFyZ3VtZW50IHVlYmVyZ2ViZW4gd2lyZC4KKwkJZnVuYyBkYXJmIGF1Y2ggZWluZW4gQXJyYXkgdm9uIEZ1bmt0aW9uZW4gZW50aGFsdGVuLiBFcyB3aXJkCisJCWRhbm4genVmYWVsbGlnIGVpbmUgYXVzZ2V3YWVobHQuCisKKwlBZGRDbWQoc3RyaW5nfHN0cmluZyogY21kLCBzdHJpbmcgZnVuYywgaW50IGZsYWcpCisJCUltIFJhdW0gd2lyZCBiZWltIEtvbW1hbmRvIDxjbWQ+IChvZGVyIGVpbmVtIGRlciBLb21tYW5kb3MpCisJCWRpZSBGdW5rdGlvbiA8ZnVuYz4gYXVmZ2VydWZlbi4gPGZ1bmM+IG11c3MgMSB6dXJ1ZWNrLQorCQlnZWJlbiwgd2VubiBkaWUgRnVua3Rpb24gZGllIEtvbWJpbmF0aW9uIGF1cyBLb21tYW5kbworCQl1bmQgQXJndW1lbnRlbiBha3plcHRpZXJ0LCBhbnNvbnN0ZW4gMC4gQWxsZXMgd2FzIGVpbgorCQlTcGllbGVyIGhpbnRlciA8Y21kPiBub2NoIGFuZ2lidCwgd2lyZCBkZXIgRnVua3Rpb24gYWxzCisJCUFyZ3VtZW50IHVlYmVyZ2ViZW4uIFdlbm4gPGZsYWc+IGdlc2V0enQgaXN0LCB3aXJkIGplZGVzCisJCUtvbW1hbmRvLCBkYXMgbWl0IDxjbWQ+IGJlZ2lubnQgYWt6ZXB0aWVydC4KKwlSZW1vdmVDbWQoc3RyaW5nfHN0cmluZyogY21kKQorCQlFbnRmZXJudCBlaW4gS29tbWFuZG8gYXVzIGRlbSBSYXVtLgorCQlBQ0hUVU5HOiBCZWkgU3BpZWxlcm4sIGRpZSB6dW0gWmVpdHB1bmt0IGRlcyBGdW5rdGlvbnMtCisJCWF1ZnJ1ZnMgbm9jaCBpbSBSYXVtIHNpbmQsIGlzdCBkYXMgS29tbWFuZG8gbm9jaCBkZWZpbmllcnQuCisJCUFsc286IE51ciBiZW51dHplbiwgd2VubiBtYW4gZ2VuYXUgd2Vpc3MsIHdhcyBtYW4gdHV0LgorCisJQWRkSXRlbShzdHJpbmcgZmlsZW5hbWUsIGludCByZWZyZXNoKQorCQlFaW4gT2JqZWt0IG1pdCBQZmFkIDxmaWxlbmFtZT4gd2lyZCBlcnpldWd0IHVuZCBpbiBkZW4KKwkJUmF1bSBiZXdlZ3QsIGRhYmVpIGdpYnQgZXMgdmllciB2ZXJzY2hpZWRlbmUgTW9kaSwgZGllCisJCXVlYmVyIGRhcyBBcmd1bWVudCA8cmVmcmVzaD4gYW5nZWdlYmVuIHdlcmRlbjoKKwkJUkVGUkVTSF9OT05FOiBEYXMgT2JqZWt0IHdpcmQgbnVyIGJlaW0gYWxsZXJlcnN0ZW4gbWFsCisJCQllcnpldWd0LCB1bmQgZGFubiBuaWUgd2llZGVyIChlcnN0IGJlaW0gcmVib290KQorCQlSRUZSRVNIX0RFU1RSVUNUOiBFaW4gbmV1ZXMgT2JqZWt0IHdpcmQgZXJzdCBlcnpldWd0LCAKKwkJCXdlbm4gZGFzIGFsdGUgemVyc3RvZXJ0IGlzdC4gU28ga2FubiBtYW4gc2ljaGVyCisJCQlnZWhlbiwgZGFzcyBudXIgZWluIEV4ZW1wbGFyIGltIFNwaWVsIGlzdC4KKwkJUkVGUkVTSF9SRU1PVkU6IEJlaW0gcmVzZXQgd2lyZCBlaW4gbmV1ZXMgT2JqZWt0IGVyemV1Z3QsCisJCQl3ZW5uIHNpY2ggZGFzIGFsdGUgbmljaHQgbWVociBpbSBSYXVtIGJlZmluZGV0LgorCQlSRUZSRVNIX0FMV0FZUzogQmVpIGplZGVtIHJlc2V0IHdpcmQgZWluIG5ldWVzIE9iamVrdCAKKwkJCWVyemV1Z3QuIFZPUlNJQ0hUOiBLYW5uIHp1IHJpZXNpZ2VuIE1lbmdlbiB2b24KKwkJCU9iamVrdGVuIGZ1ZWhyZW4sIHdlbm4gZWluIFJhdW0gbGFuZ2UgbmljaHQgYmUtCisJCQlzdWNodCB3aXJkLgorCQlEaWUgS29uc3RhbnRlbiBSRUZSRVNIXyogc2luZCBpbiA8cm9vbXMuaD4gZGVmaW5pZXJ0LgorCisJQXVmIGRpZSBQcm9wZXJ0aWVzIFBfRVhJVFMsIFBfU1BFQ0lBTF9FWElUUywgUF9ERVRBSUxTLCAKKwlQX1NQRUNJQUxfREVUQUlMUywgUF9SRUFEX0RFVEFJTFMsIFBfQ09NTUFORFMgdW5kIFBfSVRFTVMKKwlzb2xsdGUgTklDSFQgZGlyZWt0IHp1Z2VncmlmZmVuIHdlcmRlbi4KZGlmZiAtLWdpdCBhL2RvYy9zdGQvc2NobHVlc3NlbCBiL2RvYy9zdGQvc2NobHVlc3NlbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTIzZGIyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3N0ZC9zY2hsdWVzc2VsCkBAIC0wLDAgKzEsMjQgQEAKK1NUQU5EQVJET0JKRUtUIEZVRVIgU0NITFVFU1NFTDoKKworQkVOVVRaVU5HCisJaW5oZXJpdCAiL2QvdW50ZXJ3ZWx0L3N0ZC9zY2hsdWVzc2VsIgorCitCRVNDSFJFSUJVTkcgICAKKwlEdSBlcnpldWdzdCBlaW5lbiBTY2hsdWVzc2VsIGRlciBudXIgYXVmIGVpbmUgYmVzdGltbXRlIFR1ZXIKKwlwYXNzdC4KKworICAgIEZ1bmt0aW9uZW46CisKKwljcmVhdGUoKToKKwkJc2V0enQgZWluIHBhYXIgRGVmYXVsdHdlcnRlLgorCisJU2V0RG9vcktleSggc3RyaW5nIHN0cik6CisJCWdpYnQgZGVuIFNjaGx1ZXNzZWwgZWluZSBzcGV6aWVsbGUgQmVzY2hyZWlidW5nLCBkaWUgCisJCWF1ZiBkaWUgVHVlciBwYXNzZW4gbXVzcy4KKworCVF1ZXJ5RG9vcktleSgpCisJCWZyYWd0IGRlbiBzdHJpbmcgZGVzIFNjaGx1ZXNzZWxzIGFiLgorCitTSUVIRSBBVUNIOgorCXR1ZXIKKwpkaWZmIC0tZ2l0IGEvZG9jL3N0ZC9zZXF1ZW5jZXIgYi9kb2Mvc3RkL3NlcXVlbmNlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWIxN2EzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3N0ZC9zZXF1ZW5jZXIKQEAgLTAsMCArMSw1OCBAQAorVmVyc2lvbiAyLjAgZGVzIFNlcXVlbmNlcnMgdm9uIERvbiBSdW1hdGEgMi43LjkzCisKK01hbmNobWFsIHNvbGwgZWluIE5QQyAoTW9uc3RlcikgZWluZSBTZXJpZSB2b24gVGFldGlna2VpdGVuCitoaW50ZXJlaW5hbmRlciB3ZWcgYXVzZ2VmdWVyaHQgd2VyZGVuLiBEaWVzZXMga2FubiBtYW4KK21pdCBkaWVzZW0gTXVkdWwgcmVsYXRpdiBlaW5mYWNoIHJlYWxpc2llcmVuLgorCitGb2xnZW5kZSBFcmVpZ25pc3NlIGtvZW5uZW4gZWluZSBTZXF1ZW56IGF1c2xvZXNlbjoKKworCVRlbGxFdmVudDogRXMgd2lyZCBldHdhcyBpbiBkZW0gUmF1bSwgaW4gZGVtIGRlciBucGMgc2ljaAorCQliZWZpbmRldCwgZ2VzYWd0LgorCUdpdmVFdmVudDogRXMgd2lyZCBkZW0gbnBjIGV0d2FzIGdlZ2ViZW4uCisKK1dlaXRlcmUgRXJlaWduaXNzZSBrb2VubmVuIGR1cmNoIGRlbiBCZWZlaGwgTG9hZCgpIHNlbGJlcgorcHJvZ3JhbW1pZXJ0IHdlcmRlbi4KKworV2llIHNpZWh0IGVpbiBQcm9ncmFtbSBhdXM/CisKKwlFaW4gUHJvZ3JhbW0gaXN0IGVpbmUgTGlzdGUgdm9uIEJlZmVobGVuLgorCUplZGVyIEJlZmVobCBpc3QgZWluZSBMaXN0ZSwgYmVzdGVoZW5kIGF1cyBlaW5lbSBLb21tYW5kbworCXVuZCBlaW5lciBaYWhsLgorCURhcyBLb21tZW5kbyB3aXJkIGFlaG5saWNoIGRlciBCZWZlaGxlLCBkaWUgZWluIFNwaWVsZXIgZWluLQorCWdpYnQgYXVzZ2VmdWVocnQuCisJVm9yc2ljaHQ6IE5QQ3Mga29lbm5lbiBudXIgZWluZW4gVGVpbCBkZXIgQmVmZWhsZSwgZGllIGVpbgorCVNwaWVsZXIga2FubiwgZGFmdWVyIGFiZXIgaW1tZXIgJ2VjaG8nIHVuZCAnZW1vdGUnLgorCURpZSBaYWhsIGdpYnQgZGllIEFuemFobCBkZXIgU2VrdW5kZW4gYW4sIGluIGRlciBkZXIgbmFlY2hzdGUKKwlCZWZlaGwgYXVzZ2VmdWVocnQgd2lyZC4KKworRm9sZ2VuZGUgRnVua3Rpb25lbiBzaW5kIGltIE1vZHVsIGltcGxlbWVudGllcnQ6CisKKwlWb3JiZXJlaXRlbiB2b24gRnVua3Rpb25lbiwgZGllIGVpbmUgU2VxdWVueiBhdXNsb2VzZW46CisKKwlSZWdpc3RlclRlbGwoIGZ1bmt0aW9uLCBwcm9ncmFtbSApCisJCVdlbm4gZGVtIG5wYyBldHdhcyBnZXNhZ3Qgd2lyZCwgc28gd2lyZCBkaWUgZ2VzYWd0ZSBNZWxkdW5nCisJCWFuIGRpZSBGdW5rdGlvbiB1ZWJlcmdlYmVuLiBHaWJ0IGRpZSBGdW5rdGlvbmVuIG5pY2h0IDAKKwkJenVydWVjaywgd2lyZCBkYXMgUHJvZ3JhbW0gZ2VzdGFydGV0LgorCQkKKwlSZWdpc3RlckdpdmUoIGZ1bmt0aW9uLCBwcm9ncmFtbSApCisJCVdpcmQgZGVtIG5wYyBldHdhcyBnZWdlYmVuLCBzbyB3aXJkIGRhcyBPYmpla3QgYW4gZGllCisJCUZ1bmt0aW9uIHVlYmVyZ2ViZW4uIEdpYnQgZGllIEZ1bmt0aW9uIG5pY2h0IDAgenVydWVjaywgc28KKwkJd2lyZCBkYXMgUHJvZ3JhbW0gZ2VzdGFydGV0LgorCisJTG9hZCggcHJvZ3JhbW0gKQorCQlTdGFydGUgZGFzIGFuZ2VnZWJlbmUgUHJvZ3JhbW0uCisKK0FuZWRlcnVuZ2VuIGFuIGJlc3RlaGVuZGVuIFN0ZC1GdW5rdGlvbmVuOgorCisJZ2l2ZV9ub3RpZnkoKSBnaWJ0IGVpbmUgMSB6dXJ1ZWNrLCB3ZW5uIGRhcyBPYmpla3QgYWt6ZXB0aWVydAorCQl3dXJkZS4gKEVzIG11c3MgLSBmYWxscyBnZXd1ZW5zY2h0IC0gZGFubiB2b24gSGFuZCB6dXJ1ZWNoLQorCQlnZWdlYmVuIHdlcmRlbi4gKGdpdmVfb2JqKG9iLHRoaXNfcGxheWVyKCkpKSBpbiBkaWVzZXIKKwkJRnVua3Rpb24uCisKKwlNaXR0ZWxzIGFkZF9hY3Rpb24oKSBrYW5uIG1hbiBpbSBjcmVhdGUoKSBkZXMgTlBDcyBlaWdlbmUKKwlWZXJiZW4gZnVlciBkZW4gTlBDIGVpbmZ1ZWhyZW4uCisKK0VzIGthbm4gaW1tZXIgbnVyIGVpbmUgRnVua3Rpb24gKGVnYWwgb2IgdmlhIFRlbGwsIEdpdmUgb2RlciBMb2FkKSBhbmdlbWVsZGV0CitzZWluLiBFcyBrYW5uIGltbWVyIG51ciBlaW4gUHJvZ3JhbW0gZ2xlaWNoemVpdGlnIGxhdWZlbi4KKworSWRlZW4gdW5kIEJ1Z3JlcG9ydHMgYW4gUnVtYXRhCmRpZmYgLS1naXQgYS9kb2Mvc3RkL3RoaW5nIGIvZG9jL3N0ZC90aGluZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDViNDYyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3N0ZC90aGluZwpAQCAtMCwwICsxLDIwNSBAQAorU1RBTkRBUkQgS0xBU1NFOgorCSIvc3RkL3RoaW5nIiAKKworQkVOVVRaVU5HOgorCWluaGVyaXQgIi9zdGQvdGhpbmciOworCisJI2luY2x1ZGUgPHRoaW5nLmg+CisJI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKworUFJPUEVSVElFUzoKKwk8dGhpbmcvY29tbWFuZHM+CisJCVBfQ09NTUFORFMJLS0gQmVmZWhsZSBhc3NvemlpZXJ0IG1pdCBkZW0gT2JqZWt0CisJPHRoaW5nL2Rlc2NyaXB0aW9uPgorCQlQX05BTUUJCS0tIE5hbWUKKwkJUF9OQU1FX0FESgktLSBOYW1lbnNhZGpla3RpdgorCQlQX1NIT1JUCQktLSBLdXJ6YmVzY2hyZWlidW5nCisJCVBfTE9ORwkJLS0gTGFuZ2Jlc2NocmVpYnVuZworCQlQX0lEUwkJLS0gSWRlbnRpZmlrYXRvcmVuIChGZWxkIHZvbiBaZWljaGVua2V0dGVuKQorCQlQX0FESkVDVElWRVMJLS0gQWRqZWt0aXZlIHp1ciBCZXNjaHJlaWJ1bmcKKwk8dGhpbmcvbGFuZ3VhZ2U+CisJCVBfQVJUSUNMRQktLSBBcnRpa2VsIGRlcyBPYmpla3RzCisJCVBfR0VOREVSCS0tIEdlc2NobGVjaHQgZGVzIE9iamVrdHMKKwk8dGhpbmcvbW92aW5nPgorCQlQX05PRFJPUAktLSBLYW5uIG5pY2h0IGZhbGxlbmdlbGFzc2VuIHdlcmRlbgorCQlQX05PR0VUCQktLSBLYW5uIG5pY2h0IGdlbm9tbWVuIHdlcmRlbgorCTx0aGluZy9wcm9wZXJ0aWVzPgorCQlQX1VJRAkJLS0gVXNlciBJRAorCQlQX0VVSUQJCS0tIEVmZmVrdGl2ZSBVc2VyIElECisJPHRoaW5nL3Jlc3RyaWN0aW9ucz4KKwkJUF9XRUlHSFQJLS0gR2V3aWNodCBkZXMgT2JqZWt0cworCQlQX1RPVEFMX1dFSUdIVAktLSBHZXdpY2h0IGlua2x1c2l2ZSBkZXMgSW5oYWx0cworCQorTUFLUk9TOgorCTx0aGluZy9wcm9wZXJ0aWVzPgorCQlGX1ZBTFVFCQktLSBQcm9wZXJ0eXdlcnQKKwkJRl9NT0RFCQktLSBQcm9wZXJ0eW1vZHVzIHVtc2NoYWx0ZW4KKwkJRl9NT0RFX0FTCS0tIFByb3BlcnR5bW9kdXMgc2V0emVuCisJCUZfTU9ERV9BRAktLSBQcm9wZXJ0eW1vZHVzIGxvZXNjaGVuCisJCSAgU0FWRQkJICAtLSBQcm9wZXJ0eSB3aXJkIGdlc3BlaWNoZXJ0CisJCSAgUFJPVEVDVEVECSAgLS0gUHJvcGVydHkgaXMgZ2VzY2h1ZXR6dAorCQkgIFNFQ1VSRUQJICAtLSBQcm9wZXJ0eSBrYW5uIG5pZSBtZWhyIGdlYWVuZGVydCB3ZXJkZW4KKwkJICBOT1NFVE1FVEhPRAkgIC0tIFByb3BlcnR5IGJlc2l0enQga2VpbmUgU2V0emZ1bmt0aW9uCisJCUZfU0VUX01FVEhPRAktLSBGdW5rdGlvbiB6dW0gc2V0emVuIGRlciBQcm9wZXJ0eQorCQlGX1FVRVJZX01FVEhPRAktLSBGdW5rdGlvbiB6dW0gbGVzZW4gZGVyIFByb3BlcnR5CisJPHRoaW5nL2xhbmd1YWdlPgorCQlNQUxFLCBGRU1BTEUsIE5FVVRFUiAJLS0gR2VzY2hsZWNodGVyCisJCVdFUiwgV0VTU0VOLCBXRU0sIFdFTiAJLS0gRmFsbAorCQlSQVcgCQkJLS0gZnVlciBOYW1lbiBvaG5lIEFydGlrZWwKKwkJU0lOR1VMQVIsIFBMVVJBTCAJLS0gWmVpdGVuCisJCitGVU5LVElPTkVOOgorCSIvc3RkL3RoaW5nL2NvbW1hbmRzIjoKKwkJdmFyYXJncyB2b2lkIEFkZENtZChtaXhlZCBjbWQsIG1peGVkIGZ1bmMsIGludCBmbGFnKTsKKwkJdmFyYXJncyB2b2lkIFJlbW92ZUNtZChtaXhlZCBjbWQpOworCSIvc3RkL3RoaW5nL2Rlc2NyaXB0aW9uIjoKKwkJdmFyYXJncyBpbnQgaWQoc3RyaW5nIHN0ciwgaW50IGx2bCk7CisJCXZvaWQgQWRkSWQobWl4ZWQgc3RyKTsKKwkJdm9pZCBBZGRBZGplY3RpdmUobWl4ZWQgc3RyKTsKKwkJc3RyaW5nIG5hbWUoaW50IGNhc3VzLGludCBkZW1vbik7CisJIi9zdGQvdGhpbmcvbGFuZ3VhZ2UiOgorCQl2YXJhcmdzIHN0cmluZyBRdWVyeUFydGljbGUoaW50IGNhc3VzLCBpbnQgZGVtLCBpbnQgZm9yY2UpOworCQl2YXJhcmdzIGludCBTdWdnZXN0QXJ0aWNsZShzdHJpbmcgaWQpOworCQl2YXJhcmdzIHN0cmluZyBRdWVyeVBvc3NQcm9ub3VuKG1peGVkIHdoYXQsIGludCBjYXN1cywgCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcik7CisJCXN0cmluZyBRdWVyeVByb25vdW4oaW50IGNhc3VzKTsKKwkJdmFyYXJncyBzdHJpbmcgUXVlcnlEdShpbnQgY2FzdXMsaW50IGdlbmRlciwgaW50IHphaGwpOworCQlzdHJpbmcgUXVlcnlHZW5kZXJTdHJpbmcoKTsKKwkJdmFyYXJncyBzdHJpbmcgRGVjbEFkaihzdHJpbmcgYWRqLCBpbnQgY2FzdXMsIGludCBkZW1vbik7CisJIi9zdGQvdGhpbmcvcHJvcGVydGllcyI6CisJCXZhcmFyZ3MgbWl4ZWQgU2V0KHN0cmluZyBuYW1lLCBtaXhlZCBWYWx1ZSwgaW50IFR5cGUpOyAKKwkJdmFyYXJncyBtaXhlZCBRdWVyeShzdHJpbmcgbmFtZSwgaW50IFR5cGUpOworCQltaXhlZCBTZXRQcm9wKHN0cmluZyBuYW1lLCBtaXhlZCBWYWx1ZSk7CisJCW1peGVkIFF1ZXJ5UHJvcChzdHJpbmcgbmFtZSk7CisJCXZvaWQgU2V0UHJvcGVydGllcyhtYXBwaW5nIHByb3BzKTsKKwkJbWFwcGluZyBRdWVyeVByb3BlcnRpZXMoKTsKKwkiL3N0ZC90aGluZy9tb3ZpbmciOgorCQlpbnQgbW92ZShtaXhlZCBkZXN0LGludCBtZXRob2QpOworCQl2YXJhcmdzIGludCByZW1vdmUoKTsKKworRVJMQUVVVEVSVU5HOgorCSIvc3RkL3RoaW5nIiBpc3QgZWluZSBnZW5lcmVsbGUgS2xhc3NlIGZ1ZXIgT2JqZWt0ZSBhbGxlciBBcnQuCisJRXMgYmlldGV0IGdlbmVyZWxsZSBGdW5rdGlvbmFsaXRhZXQgenVyIEVyc3RlbGx1bmcgdm9uIG5ldWVuCisJS2xhc3NlbiB1bmQgT2JqZWt0ZW4uIFNpZSBrYW5uIG1pdHRlbHMgZGVyIHp1ciBWZXJmdWVndW5nCisJc3RlaGVuZGVuIEZ1bmt0aW9uZW4ga29uZmlndXJpZXJ0IHdlcmRlbjoKKworCSoqICIvc3RkL3RoaW5nL2NvbW1hbmRzIjoKKwl2YXJhcmdzIHZvaWQgQWRkQ21kKG1peGVkIGNtZCwgbWl4ZWQgZnVuYywgaW50IGZsYWcpOworCSAgVW0gZGVtIE9iamVrdCBkaWUgTW9lZ2xpY2hrZWl0IHp1IGdlYmVuLCBhdWYgQmVmZWhsZSB6dSByZWFnaWVyZW4sCisJICBrYW5uIG1pdCBBZGRDbWQoKSBLb21tYW5kb3MgZGVmaW5pZXJ0IHdlcmRlbiwgZGllIGVpbmUgYmVzdGltbXRlCisJICBGdW5rdGlvbiAoZnVuYykgYXVmcnVmZW4uIGZsYWcgZW50c2NoZWlkZXQgZGFydWViZXIsIG9iIGRhcyBLb21tYW5kbworCSAgKGNtZCkgYWJnZWt1ZXJ6dCB3ZXJkZW4ga2FubiAoZmxhZyA9IDEpIG9kZXIgbmljaHQgKGZsYWcgPSAwKS4KKworCXZhcmFyZ3Mgdm9pZCBSZW1vdmVDbWQobWl4ZWQgY21kKTsKKwkgIE1hbiBrYW5uIGRpZSBLb21tYW5kb3MgamVkZXJ6ZWl0IHdpZWRlciBtaXQgZGVyIEZ1bmt0aW9uIFJlbW92ZUNtZCgpCisJICBlbnRmZXJuZW4uCisKKwkqKiAiL3N0ZC90aGluZy9kZXNjcmlwdGlvbiI6CisJdmFyYXJncyBpbnQgaWQoc3RyaW5nIHN0ciwgaW50IGx2bCk7CisJICBEaWUgRnVua3Rpb24gaWQoKSBiZWhhbmRlbHQgZGllIElkZW50aWZpa2F0b3JlbiBlaW5lcyBPYmpla3RlcywgCisJICB3ZWxjaGUgaW4gZGVyIFByb3BlcnR5IFBfSURTIGdlc3BlaWNoZXJ0IHNpbmQuIEplZGVzbWFsLCB3ZW5uIGVpbgorCSAgT2JqZWt0IGR1cmNoIEtvbW1hbmRvcyB3aWUgIm5pbW0iLCAibGFzcyBmYWxsZW4iIGV0YyByZWZlcmVuemllcnQKKwkgIHdlcmRlbiBzb2xsLCB3aXJkIGlkKCkgbWl0IGRlbSBOYW1lbiBkZXMgT2JqZWt0ZXMgYXVmZ2VydWZlbi4gRGFiZWkKKwkgIHdlcmRlbiBkYW5uIGRpZSBFbGVtZW50ZSB2b24gUF9JRFMgbWl0IHN0ciB2ZXJnbGljaGVuIHVuZCBkYXMgRXJnZWItCisJICBuaXMgKFdBSFIvRkFMU0NIID09IDEvMCkgenVydWVja2dlZ2ViZW4uIGx2bCBpc3QgZnVlciBkaWUgQmVoYW5kbHVuZworCSAgdm9uIExlYmV3ZXNlbiBub3R3ZW5kaWcsIHNpZWhlIGxpdmluZy4KKwkKKwl2b2lkIEFkZElkKG1peGVkIHN0cik7CisJICBNaXR0ZWxzIGRpZXNlciBGdW5rdGlvbiBrYW5uIGVpbiBvZGVyIG1laHJlcmUgbmV1ZSBJZGVudGlmaWthdG9yZW4KKwkgIGRlciBMaXN0ZSBkZXIgYmVzdGVoZW5kZW4sIFN0YW5kYXJkIGlzdCAiZGluZyIsIGhpbnp1Z2VmdWVndCB3ZXJkZW4uCisKKwl2b2lkIEFkZEFkamVjdGl2ZShtaXhlZCBzdHIpOworCSAgVW0gZGVuIE9iamVrdGVuIGRpZSBNb2VnbGljaGtlaXQgenUgZ2ViZW4sIHNpY2ggYmVzc2VyIHp1IGJlc2NocmVpYmVuCisJICBvZGVyIHp1ciBiZXNzZXJlbiBJZGVudGlmaXppZXJ1bmcsIGthbm4gbWFuIG1pdCBBZGRBZGplY3RpdmUoKSBkZW0KKwkgIE9iamVrdCBuYWVoZXIgYmVzY2hyZWliZW5kZSBBZGpla3RpdmUgaGluenVmdWVnZW4uIERpZXNlIHNpbmQgaW4KKwkgIFBfQURKRUNUSVZFUyBnZXNwZWljaGVydC4KKworCXN0cmluZyBuYW1lKGludCBjYXN1cyxpbnQgZGVtb24pOworCSAgRGllc2UgRnVua3Rpb24gbGllZmVydCBkZW4gTmFtZW4gZGVzIE9iamVrdGVzIG1pdCBhbGxlbiB6dXNhZXR6bGljaGVuCisJICBBdHRyaWJ1dGVuIGltIGdld3VlbnNjaHRlbiBGYWxsIChjYXN1cyksIGRlbW9uc3RyYXRpdiAoZGVtb24gPSAxKSAKKwkgIG9kZXIgbmljaHQgZGVtb25zdHJhdGl2IChkZW1vbiA9IDApLgorCisJKiogIi9zdGQvdGhpbmcvbGFuZ3VhZ2UiOgorCXZhcmFyZ3Mgc3RyaW5nIFF1ZXJ5QXJ0aWNsZShpbnQgY2FzdXMsIGludCBkZW0sIGludCBmb3JjZSk7CisJICBBcnRpa2VsIGltIHBhc3NlbmRlbiBGYWxsIHNvd2llIGRlbW9uc3QuIGJ6dyB1bmRlbW9uc3QuIHp1cnVlY2stCisJICBnZWJlbi4gZm9yY2UgdWViZXJzY2hyZWlidCBkYXMgU2V0QXJ0aWNsZS1GbGFnLgorCisJdmFyYXJncyBpbnQgU3VnZ2VzdEFydGljbGUoc3RyaW5nIGlkKTsKKwkgIEVtcGZlaGxlIGVpbmVuIEFydGlrZWwgZnVlciBkYXMgT2JqZWt0LCBnZXRlc3RldCB3aXJkLCBvYiBhdXNzZXIKKwkgIGRpZXNlbSBPYmpla3Qgc2ljaCBlaW4gYW5kZXJlcyBPYmpla3QgbWl0IGRlciBpZCBpbSBzZWxiZW4KKwkgIFJhdW0gYmVmaW5kZXQuCisKKwl2YXJhcmdzIHN0cmluZyBRdWVyeVBvc3NQcm9ub3VuKG1peGVkIHdoYXQsIGludCBjYXN1cywgaW50IG51bWJlcik7CisJICBHaWIgZWluIFByb25vbWVuIHp1cnVlY2ssIGRhcyBhdXNkcnVlY2t0LCBkYXMgZWluIE9iamVrdCBkaWVzZW0KKwkgIE9iamVrdCBnZWhvZXJ0LiBEYWJlaSBpc3Qgd2hhdCBkYXMgR2VzY2hsZWNodCBkZXMgT2JqZWt0ZXMuCisKKwlzdHJpbmcgUXVlcnlQcm9ub3VuKCBjYXN1cyApOworCSAgRXIvU2llL0VzIHUuYWUuIHp1cnVlY2tnZWJlbi4KKworCXZhcmFyZ3Mgc3RyaW5nIFF1ZXJ5RHUoaW50IGNhc3VzLGludCBnZW5kZXIsIGludCB6YWhsKTsKKwkgIER1IGltIHBhc3NlbmRlbiBGYWxsIHp1cnVlY2tnZWJlbiAoc2llaGUgUXVlcnlBcnRpY2xlKCkpLgorCisJc3RyaW5nIFF1ZXJ5R2VuZGVyU3RyaW5nKCk7CisJICBHaWJ0IGRhcyBHZXNjaGxlY2h0IGluIFdvcnRlbiB6dXJ1ZWNrLgorCisJdmFyYXJncyBzdHJpbmcgRGVjbEFkaihzdHJpbmcgYWRqLCBpbnQgY2FzdXMsIGludCBkZW1vbik7IAorCSAgRGVrbGluaWVyZSBBZGpla3RpdmUgYWRqIG1pdCBDYXN1cyBjYXN1cy4KKworCSoqICIvc3RkL3RoaW5nL3Byb3BlcnRpZXMiOgorCXZhcmFyZ3MgbWl4ZWQgU2V0KHN0cmluZyBuYW1lLCBtaXhlZCBWYWx1ZSwgaW50IFR5cGUpOyAKKwkgIFNldHplIGVpbmVuIFdlcnQgZWluZXIgUHJvcGVydHkgZGlyZWt0LCB3b2JlaSBkZXIgVHlwIGRlcyBXZXJ0ZXMKKwkgIChWYWx1ZSkgZHVyY2ggRl9WQUxVRSwgRl9NT0RFLCBGX1NFVF9NRVRIT0QsIEZfUVVFUllfTUVUSE9EIChUeXBlKQorCSAgYW5nZWdlYmVuIHdpcmQuIAorCSAgRl9WQUxVRSAtLSBkYXJmIGVpbiBiZWxpZWJpZ2VyIFdlcnQgc2VpbgorCSAgRl9NT0RFICAtLSBtdXNzIGVpbmUgWmFobCBzZWluIChTQVZFLCBQUk9URUNURUQsIFNFQ1VSRUQsIAorCSAgICAgICAgICAgICBOT1NFVE1FVEhPRCkKKwkgIEZfU0VUX01FVEhPRCwgRl9RVUVSWV9NRVRIT0QgLS0gMCBvZGVyIGVpbmUgQ2xvc3VyZQorCisJdmFyYXJncyBtaXhlZCBRdWVyeShzdHJpbmcgbmFtZSwgaW50IFR5cGUpOworCSAgTGllcyBkZW4gV2VydCBlaW5lciBQcm9wZXJ0eSBhdXMuIERhYmVpIGdpYnQgVHlwZSBhbiwgd2VsY2hlbiBXZXJ0CisJICAoRl9WQUxVRSwgRl9NT0RFLCBGX1NFVF9NRVRIT0QsIEZfUVVFUllfTUVUSE9EKSBtYW4gYXVzbGVzZW4gd2lsbC4KKworCW1peGVkIFNldFByb3Aoc3RyaW5nIG5hbWUsIG1peGVkIFZhbHVlKTsKKwkgIFNldHplIGRlbiBXZXJ0IGVpbmVyIFByb3BlcnR5LiBEYWJlaSB3aXJkLCBmYWxscyB2b3JoYW5kZW4sIGRlciBXZXJ0CisJICBub2NoIGR1cmNoIGRpZSBGX1NFVF9NRVRIT0QgYmVoYW5kZWx0ICh6LkIuIFR5cHVlYmVycHJ1ZWZ1bmcpLgorCSAgRGllcyBzb2xsdGUgZGllIFN0YW5kYXJkbWV0aG9kZSB6dW0gU2V0emVuIGVpbmVyIFByb3BlcnR5IHNlaW4hCisgIAorCW1peGVkIFF1ZXJ5UHJvcChzdHJpbmcgbmFtZSk7CisJICBMaWVzIGRlbiBXZXJ0IGVpbmVyIFByb3BlcnR5LCB3b2JlaSBkZXIgZWlnZW50bGljaGUgV2VydCBkdXJjaCBkaWUsCisJICBmYWxscyB2b3JoYW5kZW4sIEZfUVVFUllfTUVUSE9EIGJlaGFuZGVsdCB3aXJkLiBBbHMgQmVpc3BpZWwgZGllbnQKKwkgIGhpZXIgZGllIEJlaGFuZGx1bmcgZGVzIEdlc2FtdGdld2ljaHRzLCB3ZWxjaGVzIGR1cmNoIEFiZnJhZ2VuIHZvbgorCSAgUF9UT1RBTF9XRUlHSFQgYXVzZ2VsZXNlbiB3ZXJkZW4ga2FubjsgaGllcmJlaSBlcnJlY2huZXQgZGllIAorCSAgRl9RVUVSWV9NRVRIT0Qgdm9uIFArX1RPVEFMX1dFSUdIVCBlcnN0IGRhcyB0b3RhbGUgR2V3aWNodC4KKwkgIERpZXMgc29sbHRlIGRpZSBTdGFuZGFyZG1ldGhvZGUgc2VpbiB1bSBlaW5lIFByb3BlcnR5IGF1c3p1bGVzZW4hCisKKwl2b2lkIFNldFByb3BlcnRpZXMobWFwcGluZyBwcm9wcyk7CisJICBEaWVzZSBGdW5rdGlvbiBrYW5uIGRpZSBpbiBwcm9wcyBnZXNwZWljaGVydGVuIFByb3BlcnRpZXMgaW0gT2JqZWt0CisJICB1bnRlcmJyaW5nZW4uIERhYmVpIHdlcmRlbiBzY2hvbiB2b3JoZXIgYWxzIFBST1RFQ1RFRCBvZGVyIFNFQ1VSRUQKKwkgIGdla2VubnplaWNobmV0ZSBQcm9wZXJ0aWVzIE5JQ0hUIHVlYmVyc2NocmllYmVuLgorCisJbWFwcGluZyBRdWVyeVByb3BlcnRpZXMoKTsKKwkgIExpZWZlcnQgZWluIG1hcHBpbmcsIHdlbGNoZXMgdm9uIFNldFByb3BlcnRpZXMoKSBiZWhhbmRlbHQgd2VyZGVuCisJICBrYW5uLgorCisJKiogIi9zdGQvdGhpbmcvbW92aW5nIjoKKwlpbnQgbW92ZShtaXhlZCBkZXN0LGludCBtZXRob2QpOworCSAgSmVkZXNtYWwsIHdlbm4gZWluIE9iamVrdCBiZXdlZ3Qgd2VyZGVuIHNvbGwsIHdpcmQgZGllIEZ1bmt0aW9uCisJICBtb3ZlKCkgYXVmZ2VydWZlbiwgd2VsY2hlIGRhbm4gZGFzIGVpZ2VudGxpY2hlIEJld2VnZW4gYXVzZnVlaHJ0LgorCSAgRGF6dSBtdXNzIGRlciBGdW5rdGlvbiBlaW4gWmllbCAoZGVzdCkgYWxzIFplaWNoZW5rZXR0ZSBvZGVyIGFscworCSAgT2JqZWt0IHVuZCBlaW5lIE1ldGhvZGUgZGVyIEJld2VndW5nIHVlYmVyZ2ViZW4gd2VyZGVuLgorCQorCXZhcmFyZ3MgaW50IHJlbW92ZSgpOworCSAgV2lyZCBlaW4gT2JqZWt0IHplcnN0b2VydCwgd2lyZCBkaWUgRnVua3Rpb24gcmVtb3ZlKCkgYXVmZ2VydWZlbi4KKwkgIFJ1ZWNrZ2FiZXdlcnQgMSBiZWRldXRldCBFcmZvbGcgdW5kIDAgTWlzc2VyZm9sZyBkZXIgWmVyc3RvZXJ1bmcuCisKK1ZFUkVSQlVOR1NCQVVNOgorCXRoaW5nCisJICB8LXRoaW5nL2NvbW1hbmRzCisJICB8LXRoaW5nL2Rlc2NyaXB0aW9uCisJICB8LXRoaW5nL2xhbmd1YWdlCisJICB8LXRoaW5nL21vdmluZworCSAgfC10aGluZy9wcm9wZXJ0aWVzCisJICBgLXRoaW5nL3Jlc3RyaWN0aW9ucworCitTSUVIRSBBVUNIOgorCXByb3BlcnRpZXMsIGNsb3N1cmVzIApkaWZmIC0tZ2l0IGEvZG9jL3N0ZC90cmFuc3BvcnQgYi9kb2Mvc3RkL3RyYW5zcG9ydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDAwYzk3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3N0ZC90cmFuc3BvcnQKQEAgLTAsMCArMSwyNjQgQEAKKz4gRlVOS1RJT05TV0VJU0UgVk9OIFRSQU5TUE9SVEVSTiA8CitWZXJzaW9uIDEuMCAoMDQuMDUuMTk5Mykgdm9uIFJ1bWF0YQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCitJTkhBTFQ6Cis9PT09PT0KKworCTEuCUFsbGdlbWVpbmVzCisJMi4JUHJvcGVydGllcworCTMuCUhhbHRlc3RlbGxlbgorCTQuCVN0ZXVlcnVuZworCTUuCUJldHJldGVuIHVuZCB2ZXJsYXNzZW4KKwk2LglFeHRyYXMKKwk3LglLb21tYW5kb3MgaW4gVHJuYXNwb3J0ZXJuCisKKworMS4gQUxMR0VNRUlORVMKKz09PT09PT09PT09PT09CisKKwlFaW4gVHJhbnNwb3J0ZXIgaXN0IGVpbiBSYXVtIG1pdCBiZXNvbmRlcmVuIEVpZ2Vuc2NoYWZ0ZW4uCisJV2FlaHJlbmQgbm9ybWFsZSBSYXVtZSBtaXRlaW5uZGVyIHN0YXJyIHZlcmJ1bmRlbiBzaW5kLAorCWthbm4gZGllc2VyIFJhdW0gc2VpbmUgVmVyYmluZHVuZyB6dSBhbmRlcmVuIFJhZXVtZW4gbWl0CisJZGVyIFplaXQgYWVuZGVybi4KKworCUplZGVyIFRyYW5zcG9ydGVyIGJlc2l0enQgZWluZW4gJ0t1cnMnIGRlbiBlciBhYmZhZWhydDsgbmFjaCBkZXIKKwlsZXR6dGVuICdIYWx0ZXN0ZWxsZScgYmVnaW5udCBkZXIgS3VycyB3aWVkZXIgdm9uIFZvcm5lLgorCVdpbGwgbWFuIGVpbmVuIEt1cnMgc2V0emVuLCBkZXIgZW50bGFuZyBlaW5lciBTdHJlY2tlIGhpbi0KKwl1bmQgenVydWVjayBmdWVocnQsIHNvIG11c3MgbWFuIGplZGUgSGFsdGVzdGVsbGUgZWlubWFsIGZ1ZXIKKwlkZW4gSGlud2VnIHVuZCBlaW5tYWwgZnVlciBkZW4gUnVlY2t3ZWcgZWluZnVlZ2VuLgorCisJRWluIEJlaXNwaWVsLCB3aWUgbWFuIGVpbmVuIHNvbGNoZW4gVHJhbnNwb3J0ZXIgcHJvZ3JhbW1pZXJ0LAorCWlzdCBpbiAvZG9jL2JlaXNwaWVsZS93b2xrZS5jIHp1IHNlaGVuICh1bmQgenUgbGFkZW4gOi0pLgorCisyLiBQUk9QRVJUSUVTCis9PT09PT09PT09PT09CisKKwlQX0VOVEVSTVNHCisJCUFycmF5IG1pdCB6d2VpIE1lbGR1bmdlbiBpbiBkZXIgQXJ0IHZvbiBtc2dpbiB1bmQKKwkJbXNnb3V0LiAgRGllIGVyc3RlIE1lbGR1bmcgaXN0IGZ1ZXIgZGVuIFJhdW0sIGRlbiBkZXIKKwkJU3BpZWxlciB2ZXJsYWVzc3QsIHVuZCBkaWUgendlaXRlIGZ1ZXIgZGVuIFRyYW5zcG9ydGVyLAorCQlpbiBkZW4gZXIgZ2VodC4KKworCVBfTEVBVkVNU0cKKwkJQXJyYXkgbWl0IHp3ZWkgTWVsZHVuZ2VuLCBlaW5lIGZ1ZXIgZGVuIFRyYW5zcG9ydGVyLCBkZW4KKwkJZXIgdmVybGFlc3N0LCB1bmQgZWluZSBmdWVyIGRlbiBSYXVtLCBpbiBkZW4gZXIga29tbXQuCisKKwlQX0VOVEVSRkFJTAorCQlNZWxkdW5nIGFuIGVpbiBXZXNlbiwgd2VubiBkZW4gdm9sbGVuIFRyYW5zcG9ydGVyCisJCWJldHJldGVuIHdpbGwuIElzdCBkaWUgUHJvcC4gZWluIEFycmF5LCBzbyB3aXJkIGRhcyBlcnN0ZQorCQlFbGVtZW50IGFscyBNZWxkdW5nIGFuIGRhcyBXZXNlbiwgZGFzIHp3ZWl0ZSBhbHMgTWVsZHVuZworCQlhbiBkaWUgTWl0c3BpZWxlciBpbSBSYXVtIGdlc2NoaWNrdC4gSXN0IGRpZSBQcm9wZXJ0eQorCQllaW5lIENsb3N1cmUsIHdpcmQgZGllc2UgYXVzZ2VmdWVocnQsIHdlbm4gZWluIFNwaWVsZXIKKwkJdmVyZ2VibGljaCB2ZXJzdWNodCwgZGVuIFRyYW5zcG9ydGVyIHp1IGJldHJldGVuLgorCisJUF9MRUFWRUZBSUwKKwkJTWVsZHVuZyBhbiBlaW4gV2VzZW4sIHdlbm4gZXMgYXVzc2VyaGFsYiBkZXIgQW5sZWdlemVpdGVuCisJCWRlbiBUcmFuc3BvcnRlciB2ZXJsYXNzZW4gd2lsbC4gSXN0IGRpZSBQcm9wLiBlaW4gQXJyYXksCisJCXNvIHdpcmQgZGFzIGVyc3RlIEVsZW1lbnQgYWxzIE1lbGR1bmcgYW4gZGFzIFdlc2VuLCBkYXMKKwkJendlaXRlIGFscyBNZWxkdW5nIGFuIGRpZSBNaXRzcGllbGVyIGltIFRyYW5zcG9ydGVyCisJCWdlc2NoaWNrdC4gSXN0IGRpZSBQcm9wZXJ0eSBlaW5lIENsb3N1cmUsIHdpcmQgZGllc2UKKwkJYXVzZ2VmdWVocnQsIHdlbm4gZWluIFNwaWVsZXIgdmVyZ2VibGljaCB2ZXJzdWNodCwgZGVuCisJCVRyYW5zcG9ydGVyIHp1IHZlcmxhc3Nlbi4KKworCVBfQVJSSVZFTVNHCisJCUVpbiBBcnJheSBtaXQgendlaSBNZWxkdW5nZW4uIERhcyBlcnN0ZSBFbGVtZW50IGlzdCBkaWUKKwkJTWVsZHVuZywgZGllIGRpZSBXZXNlbiBpbSBUcmFuc3BvcnRlciBiZWtvbW1lbi4gRGllCisJCXp3ZWl0ZSBNZWxkdW5nIGlzdCBmdWVyIGRpZSBXZXNlbiBpbiBkZW0gUmF1bSwgYW4gZGVtCisJCWRlciBUcmFuc3BvcnRlciBhbmxlZ3QuIAorCisJUF9ERVBBUlRNU0cKKwkJRGl0byBmdWVyIGRhcyBBYmxlZ2VuLgorCisJUF9NQVhfUEFTU0VOR0VSUworCQlOdW1lcmlzY2hlciBXZXJ0IGZ1ZXIgZGllIG1heGltYWxlIEFuemFobCB2b24gV2VzZW4sIGRpZQorCQlzaWNoIGluIGRlbSBUcmFuc3BvcnRlciBhdWZoYWx0ZW4gZHVlcmZlbi4KKwkJMCBiZWRldXRldCB1bmJlc2NoYWVua3RlIFNwaWVsZXJ6YWhsLgorCisKKzMuIEhBTFRFU1RFTExFTgorPT09PT09PT09PT09PT09CisKKwlFcyBnaWJ0IDMgU29ydGVuIHZvbiBIYWx0ZXN0ZWxsZW46CisKKwkxLikgUmFldW1lIGFscyBIYWx0ZXN0ZWxsZW4uCisKKwlGVU5LVElPTjoKKwkKKwkJQWRkUm91dGUoIHJhdW0sIHZlcndlaWwsIG5leHQgKTsKKwkJb2RlcgorCQlBZGRSb3V0ZSggcmF1bSwgdmVyd2VpbCwgbmV4dCwgY29kZSApOworCisJUEFSQU1FVEVSOgorCisJCXJhdW0JLSBSYXVtLCBhbiBkZW0gZGVyIFRyYW5zcG9ydGVyIGhhbHRlbiBzb2xsLgorCQl2ZXJ3ZWlsCS0gWmVpdCBpbiBTZWt1bmRlbiwgZGllIGRlciBUcmFuc3BvcnRlciBpbiBkZW0KKwkJCSAgUmF1bSB2ZXJibGVpYnQsIGJpcyBlciB3ZWl0ZXJmYWVocnQuCisJCW5leHQJLSBaZWl0IGluIFNla3VuZGVuIGJpcyB6dXIgbmFlY2hzdGVuIEhhbHRlLQorCQkJICBzdGVsbGUuCisKKwkJY29kZQktIFRleHQsIGRlciB2b24gZGVyIEZ1bmt0aW9uIFF1ZXJ5QXJyaXZlZAorCQkJICB6dXJ1ZWNrZ2VnZWJlbiB3aXJkLCB3ZW5uIGRlciBUcmFuc3BvcnRlcgorCQkJICBhbiBkaWVzZXIgSGFsdGVzdGVsbGUgYW5nZWxlZ3QgaGF0LgorCQkJICBXaXJkIGRpZXNlciBQYXJhbWV0ZXIgbmljaHQgYW5nZWdlYmVuLCB3aXJkCisJCQkgIGVpbiBsZWVyZXIgU3RyaW5nIGFscyBjb2RlIGdlc2V0enQuCisKKwkyLikgTWVsZHVuZ2VuIGFscyBIYWx0ZXN0ZWxsZW4uCisKKwlGVU5LVElPTjoKKworCSAgICAgIEFkZE1zZyggdGV4dCwgbmV4dCApOworCisJUEFSQU1FVEVSOgorCisJCXRleHQJLSBUZXh0LCBkZXIgTWVsZHVuZywgZGllIGluIGRlbSBUcmFuc3BvcnRlcgorCQkJICBhdXNnZWdlYmVuIHdpcmQuCisJCW5leHQJLSBaZWl0IGluIFNla3VuZGVuIGJpcyB6dXIgbmFlY2hzdGVuIEhhbHRlLQorCQkJICBzdGVsbGUuCisKKwkzLikgRnVua3Rpb25zYXVmcnVmZSBhbHMgSGFsdGVzdGVsbGVuLgorCisJRlVOS1RJT046CisKKwkJQWRkRnVuKCBmdW4sIG5leHQgKTsKKworCVBBUkFNRVRFUjoKKworCQlmdW4JLSBOYW1lIGVpbmVyIEZ1bmt0aW9uLCBkaWUgaW0gVHJhbnNwb3J0ZXIKKwkJCSAgYXVmZ2VydWZlbiB3aXJkLgorCQluZXh0CS0gWmVpdCBpbiBTZWt1bmRlbiBiaXMgenVyIG5hZWNoc3RlbiBIYWx0ZS0KKwkJCSAgc3RlbGxlLgorCis0LiBTVEVVRVJVTkcKKz09PT09PT09PT09PQorCisJRlVOS1RJT04KKworCQlTdGFydCgpOworCQlvZGVyCisJCVN0YXJ0KG51bW1lcik7CisKKwlCRVNDSFJFSUJVTkc6CisKKwkJRGVyIFRyYW5zcG9ydGVyIHNvbGwgc29mb3J0IGFuIGRlciBIYWx0ZXN0ZWxsZSBtaXQKKwkJZGVyIGFuZ2VnZWJlbmVuIE51bW1lciAoa2VpbmUgTnVtbWVyIGhlaXNzdCBhbiBkZXIgZXJzdGVuKQorCQlhbmxlZ2VuIHVuZCB2b24gZGEgYWIgc2VpbmVuIEt1cnMgZmFocmVuLgorCisJRlVOS1RJT046CisKKwkJSGFsdCgpOworCisJQkVTQ0hSRUlCVU5HOgorCisJCUhhbHRlIGRpZSBGYWhydCBhbi4gRGVyIFRyYW5zcG9ydGVyIGJsZWlidCBzdGVoZW4sIHdvCisJCWVyIGlzdC4KKworCis1LiBCRVRSRVRFTiBVTkQgVkVSTEFTU0VOCis9PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlEZXIgVHJhbnNwb3J0ZXIgaGF0IGtlaW5lIFZlcmJlbiBwcm9ncmFtbWllcnQsIG1pdCBkZW5lbiBtYW4KKwlkZW4gVHJhbnNwb3J0ZXIgYmV0cmV0ZW4gb2RlciB2ZXJsYXNzZW4ga2Fubi4KKwlEYWZ1ZXIgbXVlc3NlbiBtaXQgQWRkQ21kKCkgVmVyYmVuIGVpbmdlZnVlaHJ0IHdlcmRlbiwgZGllCisJYXVmIHNlbGJzdGdlc2NocmllYmVuZSBGdW5rdGlvbmVuIHp1Z3JlaWZlbi4KKworCUZVTktUSU9OOgorCisJCUVudGVyKCk7CisKKwlCRVNDSFJFSUJVTkc6CisKKwkJVGVzdGUsIG9iIGZ1ZXIgZHVuIGFrdHVlbGxlbiBTcGllbGVyICh0aGlzX3BsYXllcigpKQorCQlub2NoIFBsYXR6IGltIFRyYW5zcG9ydGVyIGlzdCB1bmQgb2IgZXIgc2ljaCBhdXNzZXJoYWxiCisJCWRlcyBUcmFuc3BvcnRlcnMgYmVmaW5kZXQuIFdlbm4gamEsIGJld2VnZSBpaG4gaW4gZGVuCisJCVRyYW5zcG9ydGVyLiBXZW5uIGRlciBUcmFuc3BvcnRlciBlaW5lIFJlYWt0aW9uIChCZXdlZ2VuIGRlcworCQlTcGllbGVycyBvZGVyIFVlYmVybGF1ZiksIHNvIGdpYiBlaW5lIDEgenVydWVjayBzb25zdCBlaW5lIDAuCisKKwkJV2VubiBkZXIgVHJhbnNwb3J0ZXIgbmljaHQgZGEgKGFsc28gdW5zaWNodGJhcikgaXN0LCB0dWUgZnVlcgorCQlkaWUgU3BpZWxlciBhdXNzZXJoYWxiIGRlcyBUcmFuc3BvcnRlcnMgc28sCisJCWFscyBvYiBkYXMgVmVyYiBuaWNodCBkZWZpbmllcnQgd3VyZGUuCisKKwkJRGllc2VyIFdlcnQga2FubiBpbSBhbGxnZW1laW5lbiBkaXJla3QgYWxzIHJldHVybndlcnQgYmVudXR6dAorCQl3ZXJkZW4uCisKKwlGVU5LVElPTjoKKworCQlMZWF2ZSgpOworCisJQkVTQ0hSRUlCVU5HOgorCisJCVdlbm4gZGVyIE1vbWVudGFuZSBTcGllbGVyIG5pY2h0IGltIFRyYW5zcG9ydGVyIGlzdCwgc28gZ2liCisJCWVpbmUgRmVobGVybWVsZHVuZyBhdXMuIEFuZGVyZW5mYWxscyB0ZXN0ZSwgb2IgZGVyCisJCVRyYW5zcG9ydGVyIGFuIGVpbmVuIFJhdW0gYW5nZWxlZ3QgaGF0LiBXZW5uIG5laW4sIGdlYmUKKwkJZGllIExFQVZFRkFJTCBNZWxkdW5nIGF1czsgdW5kIHdlbm4gYWxsZXMgb2sgaXN0LCBzbworCQliZXdlZ2UgZGVuIFNwaWVsZXIgYXVzIGRlbSBUcmFuc3BvcnRlci4KKworNi4gRVhUUkFTCis9PT09PT09PT0KKworCUZVTktUSU9OOgorCisJCVF1ZXJ5QXJyaXZlZCgpOworCisJQkVTQ0hSRUlCVU5HOgorCisJCUdlYmUgZGVuIENvZGUgZGVzIFJhdW1lcyB6dXJ1ZWNrLCBhbiBkZW0gZGVyIFRyYW5zcG9ydGVyCisJCWdlcmFkZSBhbmxpZWd0LiBIYXQgZGVyIFJhdW0ga2VpbmVuIENvZGUsIGdlYmUgZWluZW4KKwkJTGVlcnN0cmluZyB6dXJ1ZWNrLiBMaWVndCBkZXIgVHJhbnNwb3J0ZXIgYW4ga2VpbmVtIFJhdW0KKwkJYW4sIHNvIGdlYmUgMCB6dXJ1ZWNrLgorCisJCURpZXNlIEZ1bmt0aW9uIGJpZXRldCBzaWNoIGFuIHVtIG1pdHRlbHMgcHJvY2Vzc19zdHJpbmcKKwkJZGllIEFua3VuZnRzLSB1bmQgQWJmYWhydHNtZWxkdW5nZW4gYWJ3ZWNoc2x1bmdzcmVpY2gKKwkJenUgZ2VzdGFsdGVuLgorCisJRlVOS1RJT046CisKKwkJUXVlcnlQYXNzZW5nZXJzKCksCisKKwlCRVNDSFJFSUJVTkc6CisKKwkJR2ViZSBlaW5lIExpc3RlIG1pdCBhbGxlbiBMZWJld2VzZW4sIGRpZSBzaWNoIGF1Zi9pbiBkZW0KKwkJVHJhbnNwb3J0ZXIgYmVmaW5kZW4sIHp1cnVlY2suCisKKwlGVU5LVElPTjoKKworCQlSZW1vdmVSb3V0ZSgpOworCisJQkVTQ0hSRUlCVU5HOgorCisJCUhhbHRlIGRlbiBUcmFuc3BvcnRlciBhbiB1bmQgbG9lc2NoZSBkZXNzZW4gS3Vycy4KKworNy4gS09NTUFORE9TIElOIFRSQU5TUE9SVEVSTgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJRGEgc2ljaCBkZXIgVHJhbnNwb3J0ZXIgaW4gZGVtIFJhdW0gYmVmaW5kZXQsIGluIGRlbSBlciBhbmdlbGVndAorCWhhdCwgc2luZCBhbGxlIEtvbW1hbmRvcyBkZXMgVHJhbnNwb3J0ZXJzIGF1Y2ggZG9ydCB2ZXJmdWVnYmFyLgorCVNlbGJzdCB3ZW5uIGRlciBUcmFuc3BvcnRlciBhYmdlbGVndCBoYXQsIHN0ZWh0IGVyIG5vY2ggaW1tZXIKKwl1bnNpY2h0YmFyIGRvcnQgaGVydW0uCisKKwlEZXNoYWJsIG11c3MgaW4gZGVuIEtvbW1hbmRvcyB2b3Jzb3JnZSBncnRyb2ZmZW4gd2VyZGVuLCBkYXNzIG51cgorCWRpZSByaWNodGlnZW4gU3BpZWxlciAoZGllIGRyaW5uZW4gdW5kIGRpZSBkcmF1c3NlbikgZGllIHJpY2h0aWdlbgorCUtvbW1hbmRvcyBhdXNmdWVocmVuIGtvZW5uZW4uCisKKwlLT01NQU5ET1MgRlVFUiBTUElFTEVSIEFVU1NFUkhBTEI6CisKKwkJRXMgbXVzcyBhYmdldGVzdGV0IHdlcmRlbiwgb2IgZGVyIFNwaWVsZXIgbmljaHQgaW0KKwkJVHJhbnNwb3J0ZXIgaXN0LCB1bmQgb2IgZGVyIFRyYW5zcG9ydGVyIGFuZ2VsZWd0IGhhdC4KKworCQlpZiggZW52aXJvbm1lbnQodGhpc19wbGF5ZXIoKSk9PXRoaXNfb2JqZWN0KCkgCisJCQl8fCAhUXVlcnlBcnJpdmVkKCkgKSByZXR1cm4gMDsKKworCUtPTU1BTkRPUyBGVUVSIFNQSUVMRVIgSU5ORVJIQUxCOgorCisJCUFidGVzdGVuLCBvYiBkZXIgU3BpZWxlciB3aXJrbGljaCBpbSBUcmFuc3BvcnQgaXN0LgorCisJCWlmKCBlbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKSE9dGhpc19vYmplY3QoKSApCisJCQlyZXR1cm4gMDsKKworCQlWb3JzaWNodCBhdWNoIGJlaSBBZGRFeGl0cyBpbm5lcmhhbGIgZGVzIFRyYW5zcG9ydGVycywKKwkJYWJlciBkYXJhbiBhcmJpZXRlIGljaCBub2NoLi4uIDotKQorCisJRGllIEZ1bmt0aW9uZW4gRW50ZXIoKSB1bmQgTGVhdmUoKSBoYWJlbiBkaWVzZSBGdW5rdGlvbmFsaXRhZXQKKwllaW5nZWJhdXQuCisKZGlmZiAtLWdpdCBhL2RvYy9zdGQvdHVlciBiL2RvYy9zdGQvdHVlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODlmZDg0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3N0ZC90dWVyCkBAIC0wLDAgKzEsNDIgQEAKK1NUQU5EQVJET0JKRUtUIEZVRVIgVFVFUkVOOgorCitCRU5UVVpVTkc6CisJaW5oZXJpdCAic3RkL3R1ZXIiOworCisJI2luY2x1ZGUgPHR1ZXIuYz4KKwkKK0JFU0NIUkVJQlVORzoKKwlCYXNpc2tsYXNzZSBmdWVyIGFsbGUgVHVlcmVuIGltIFNwaWVsLiBTaWUgaXN0IHZvbiAvc3RkL3RoaW5nCisJYWJnZWxlaXRldC4KKworICAgIEZ1bmt0aW9uZW46CisKKwlBZGREb29yMiggc3RyaW4gc2hvcnQsCisJCSAgc3RyaW5nIGxvbmcsCisJCSAgbWl4ZWQgaWQsCisJCSAgbWl4ZWQgZGVzdCwKKwkJICBzdHJpbmcgY29tLAorCQkgIGludCBmbGFncywKKwkJICBzdHJpbmcga2V5LAorCQkgIHN0cmluZyBmdW5jLAorCQkgIG9iamVjdCBvYmogKQorCisJCUVyemV1Z3QgZWluZSBuZXVlIFR1ZXIsIHdvYmVpIGRpZSBQYXJhbWV0ZXIgZm9sZ2VuZGVzIGFuZ2ViZW46CisKKwkJc2hvcnQgCT0gS3VyemJlc2NocmVpYnVuZyBkZXIgVHVlcgorCQlsb25nCT0gQXVzZnVlaHJsaWNoZSBCZXNjaHJlaWJ1bmcgZGVyIFR1ZXIKKwkJaWQJPSBOYW1lW25dIGRlciBUdWVyCisJCWRlc3QJPSBLb21tYW5kbyB6dW0gRHVyY2hzY2hyZWl0ZW4gZGVyIFR1ZXIsIHouQi4gJ25vcmRlbicKKworCQlPcHRpb25hbGUgUGFyYW1ldGVyOgorCisJCWZsYWdzCT0gRmxhZ3MgYXVzIHR1ZXIuaAorCQlrZXkJPSBTdHJpbmcsIGRlciBpbSBTY2hsdWVzc2VsIGRlZmluaWVydCBzZWluIG11c3MsIGRhbWl0CisJCQkgIGVyICdwYXNzdCcuCisJCWZ1bmMJPSBGdW5rdGlvbiBkaWUgYmVpbSBEdXJjaHNjaHJlaXRlbiBkZXIgVHVlciBpbiBvYmoKKwkJCSAgYXVmZ2VydWZlbiB3ZXJkZW4gc29sbC4KKwkJb2JqCT0gT2JqZWt0IGluIGRlbSBmdW5jIGF1ZmdlcnVmZW4gd2VyZGVuIHNvbGwuCisKK1NJRUhFIEFVQ0g6CisJc2NobHVlc3NlbAorCmRpZmYgLS1naXQgYS9kb2Mvc3RkL3VuaXQgYi9kb2Mvc3RkL3VuaXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M3NTA1OQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zdGQvdW5pdApAQCAtMCwwICsxLDEwMiBAQAorVW5pdHMKKworREVGSU5JRVJUIElOOiAKKyAgICAgICAgL3N0ZC91bml0LmMKKworQkVTQ0hSRUlCVU5HOgorICAgICAgICBEYXMgVW5pdC1PYmpla3Qga2FubiBkYXp1IHZlcndlbmRldCB3ZXJkZW4sIHVtIGdyb2Vzc2VyZSBNZW5nZW4KKyAgICAgICAgZWluZXMgT2JqZWt0ZXMgLSB3aWUgTXVlbnplbiAtIHp1IGVyemV1Z2VuLgorCisgICAgICAgIERhcyBncnVuZGxlZ2VuZGUgS29uemVwdCBpc3QsIGRhcyBVbml0LU9iamVrdGUgbmljaHQgbWVociBudXIgCisgICAgICAgIHVlYmVyIGlocmUgTmFtZW4sIHNvbmRlcm4gYXVjaCB1ZWJlciBpaHJlIE1lbmdlIGFuZ2VzcHJvY2hlbiAKKyAgICAgICAgd2VyZGVuIGthbm4uCisKKyAgICAgICAgU28gd2lyZCBkYXMgaWQoKSBkZXIgTXVlbnplbiBuaWNodCBudXIgJ211ZW56ZW4nIHNvbmRlcm4gYXVjaCAKKyAgICAgICAgJzMgbXVlbnplbicgdmVyc3RlaGVuIHVuZCBhdXN3ZXJ0ZW4ga29lbm5lbi4KKworICAgICAgICBtb3ZlKCkga2FubiBUZWlsZSBkZXMgZ2FuemVuIFVuaXQtT2JqZWt0cyBiZXdlZ2VuLCBlaW4gbmV1ZXIKKyAgICAgICAgQ2xvbmUgd2lyZCBlcnpldWd0IHVuZCBkaWVzZW0gZGVyIHZlcmJsZWliZW5kZSBSZXN0IGRlciBNZW5nZQorICAgICAgICB6dWdld2llc2VuLiBOYWNoIGVyZm9sZ3JlaWNoZW0gbW92ZSgpIHNjaGF1dCBkYXMgVW5pdC1PYmpla3QgYW0KKyAgICAgICAgWmllbG9ydCwgb2IgZG9ydCBldnRsLiBiZXJlaXRzIFVuaXRzIGRlcyBnbGVpY2hlbiBUeXBzIHZvcmhhbmRlbgorICAgICAgICBzaW5kIHVuZCB2ZXJlaW5pZ3Qgc2ljaCBnZ2YuIG1pdCBpaG5lbiwgaW4gZGVtIGRhcyBhbHRlIFVuaXQtCisgICAgICAgIE9iamVrdCB6ZXJzdG9lcnQgd2lyZC4KKworICAgICAgICBVbml0LU9iamVrdGUgd2VyZGVuIGluIGVpbmlnZW4gRGluZ2VyIGFuZGVycyBwcm9ncmFtbWllcnQsIGRhenUKKyAgICAgICAgZ2Vob2VydCBmb2xnZW5kZXM6CisKKyAgICAgICAgUF9TSE9SVCAgICAgICAgICAgICAgICAgRVMgV0lSRCBLRUlORSBQX1NIT1JUIEdFU0VUWlQhCisKKyAgICAgICAgUF9BTU9VTlQgICAgICAgICAgICAgICAgRGllIE1lbmdlIGRlcyBVbml0LU9iamVrdHMgJ3ZvbiBIYXVzIGF1cycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsc28gYmVpbSBDbG9uZW4gKGRhaGVyIG1laXN0ZW5zIDEpCisKKyAgICAgICAgUF9OQU1FICAgICAgICAgICAgICAgICAgQmVpIFVuaXQtT2JqZWt0ZW4ga2FubiBoaWVyIGVpbiBTdHJpbmctQXJyYXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gZGVyIEZvcm0gKHsgU0lOR1VMQVJfTkFNRSxQTFVSQUxfTkFNRSB9KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmdlZ2ViZW4gd2VyZGVuCisKKyAgICAgICAgU2V0Q29pbnNQZXJVbml0cyAgICAgICAgV2lldmllbCBpc3QgZWluZSBiZXN0aW1tdGUgTWVuZ2Ugd2VydAorICAgICAgICBOSUNIVCBQX1ZBTFVFCisKKyAgICAgICAgU2V0R3JhbXNQZXJVbml0cyAgICAgICAgV2lldmllbCB3aWVndCBlaW5lIGJlc3RpbW10ZSBNZW5nZQorICAgICAgICBOSUNIVCBQX1dFSUdIVAorCisgICAgICAgIEFkZFNpbmd1bGFySWQJCVN0cmluZy1BcnJheSBtaXQgZGVuIFNpbmd1bGFyLUlEcyAKKyAgICAgICAgQWRkUGx1cmFsSWQJCVN0cmluZy1BcnJheSBtaXQgZGVuIFBsdXJhbC1JRHMKKworICAgICAgICB6dXNhZXR6bGljaCBrb2VubmVuIG5hdHVlcmxpY2ggSURzIHBlciBBZGRJZCB2ZXJnZWJlbiB3ZXJkZW4KKworICAgICAgICBXZWl0ZXJoaW4gdmVyZnVlZ2VuIFVuaXQtT2JqZWt0ZSB1ZWJlciBkaWUgTW9lZ2xpY2hrZWl0IGVpbmVzCisgICAgICAgIGF1dG9tYXRpc2NoZW4gWmVyZmFsbHMuIERpZXNlciBpc3Qgc3RldWVyYmFyIHVlYmVyIGRpZSBQcm9wcworICAgICAgICBQX1VOSVRfREVDQVlfSU5URVJWQUwsIFBfVU5JVF9ERUNBWV9RVU9UQSwgUF9VTklUX0RFQ0FZX0ZMQUdTLAorICAgICAgICBQX1VOSVRfREVDQVlfTUlOLiBIaWVyYmVpIHdpcmQgZGVyIFplcmZhbGwgdm9uIGRlciBCbHVlcHJpbnQgZGVzCisgICAgICAgIFVuaXQtT2JqZWt0ZXMgZ2VzdGV1ZXJ0LCB3YXMgYWxzIFplcmZhbGxzbWFzdGVyIGZ1bmdpZXJ0LCB3ZWlsIENsb25lcworICAgICAgICBuaWNodCB1bmJlZGluZ3QgaW1tZXIgbmVuIFJlc2V0IGhhYmVuIG11ZXNzZW4uIERpZSBlbnRzcHJlY2hlbmRlbgorICAgICAgICBQcm9wcyBzb2xsdGVuIGRhaGVyIGluIGRlciBCbHVlcHJpbnQga29uZmlndXJpZXJ0IHdlcmRlbi4gKHMuIE1hbnBhZ2VzIAorICAgICAgICB1bmQgQmVpc3BpZWwpCisKK0JFSVNQSUVMRToKKyAgICAgICAgV2lyIGJhc3RlbG4gdW5zIGVpbiBnYW56IGVpbmZhY2hlcyBVbml0LU9iamVrdDoKKworICAgICAgICBpbmhlcml0ICIvc3RkL3VuaXQiOworCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCisgICAgICAgIHsKKyAgICAgICAgICBpZighY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSB7CisgICAgICAgICAgICAgIHNldF9uZXh0X3Jlc2V0KC0xKTsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAgICAgICAgICA6OmNyZWF0ZSgpOworICAgICAgICAgIFNldFByb3AoUF9MT05HLCJEYXMgaXN0IGRpZSBrbGVpbmUgTGVpY2hlIGVpbmVyIEFtZWlzZS5cbiIpOworICAgICAgICAgIFNldFByb3AoUF9OQU1FLCh7ICJBbWVpc2VubGVpY2hlIiwiQW1laXNlbmxlaWNoZW4iIH0pKTsKKyAgICAgICAgICBTZXRQcm9wKFBfQU1PVU5ULDEpOyAgICAgICAvLyBlcyBoYW5kZWx0IHNpY2ggdW0gMSBlaW56aWdlcyBPYmpla3QKKyAgICAgICAgICBTZXRDb2luc1BlclVuaXRzKDIwLDEwKTsgICAvLyAxMCBPYmpla3RlIHNpbmQgMjAgTXVlbnplbiB3ZXJ0CisgICAgICAgICAgU2V0R3JhbXNQZXJVbml0cygxLDEwKTsgICAgLy8gMTAgT2JqZWt0ZSB3aWVnZW4gMSBHcmFtbQorICAgICAgICAgIAorICAgICAgICAgIEFkZFNpbmd1bGFySWQoICh7ICJsZWljaGUiLCJhbWVpc2VubGVpY2hlIiB9KSApOworICAgICAgICAgIEFkZFBsdXJhbElkKCAoeyAibGVpY2hlbiIsImFtZWlzZW5sZWljaGVuIiB9KSApOworICAgICAgICAgIAorICAgICAgICAgIEFkZElkKCJcbi1NZWluZUFtZWlzZW5sZWljaGUiKTsKKyAgICAgICAgfQorCisgICAgICAgIFdpciBiYXN0ZWxuIG51biBlaW4gVW5pdG9iamVrdCwgd2FzIHplcmZhbGxlbiBzb2xsOgorICAgICAgICBpbmhlcml0ICIvc3RkL3VuaXQiOworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSB7CisgICAgICAgICAgICAvLyBLb25maWcgcy5vLiAuLi4KKyAgICAgICAgICAgIGlmICghY2xvbmVwKCkpIHsKKyAgICAgICAgICAgICAgLy8gWmVyZmFsbCBhbGxlIDNoCisgICAgICAgICAgICAgIFNldFByb3AoUF9VTklUX0RFQ0FZX0lOVEVSVkFMLCAzKjM2MDApOworICAgICAgICAgICAgICAvLyBlcyB6ZXJmYWxsZW4gamV3ZWlscyAxMCUKKyAgICAgICAgICAgICAgU2V0UHJvcChQX1VOSVRfREVDQVlfUVVPVEEsIDEwMDApOworICAgICAgICAgICAgICAvLyBlcyBzb2xsZW4gbWluLiAxMCBFaW5oZWl0ZW4gamV3ZWlscyB1ZWJyaWdibGVpYmVuCisgICAgICAgICAgICAgIFNldFByb3AoUF9VTklUX0RFQ0FZX01JTiwgMTApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKK1NJRUhFIEFVQ0g6CisgICAgICAgIFBfQU1PVU5ULCBQX05BTUUsIFBfVU5JVF9ERUNBWV9JTlRFUlZBTCwgUF9VTklUX0RFQ0FZX1FVT1RBLCAKKyAgICAgICAgUF9VTklUX0RFQ0FZX01JTiwgUF9VTklUX0RFQ0FZX0ZMQUdTCisgICAgICAgIERvRGVjYXkoKSwgZG9EZWNheU1lc3NhZ2UoKSwgU2V0R3JhbXNQZXJVbml0cygpLCBTZXRDb2luc1BlclVuaXRzKCksIAorICAgICAgICBBZGRTaW5ndWxhcklkKCksIEFkZFBsdXJhbElkKCksIFF1ZXJ5Q29pbnNQZXJVbml0cygpLAorICAgICAgICBRdWVyeUdyYW1zUGVyVW5pdHMoKQorICAgICAgICAvc3RkL3VuaXQuYworCisxNC4xMC4yMDA3LCBaZXNzdHJhCmRpZmYgLS1naXQgYS9kb2Mvc3RkL3V0aWwgYi9kb2Mvc3RkL3V0aWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJmMzUyNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zdGQvdXRpbApAQCAtMCwwICsxLDM0IEBACitERUZJTklFUlQgSU46IAorICAgICAvc3RkLyouYworCitCRVNDSFJFSUJVTkc6CisgICAgIERpZXNlIE1hbmdlcGFnZSBiZXNjaHJlaWJ0IGtlaW4gRWluemVsb2JqZWt0LCBzb25kZXJuIGVpbmUgU2FtbWx1bmcgdm9uCisgICAgIFByb2dyYW1tZW4uCisgICAgIEltIFZlcnplaWNobmlzIC9zdGQvdXRpbC8gbGllZ2VuIG1laHJlcmUgSGVsZmVya2xhc3NlbiwgZGllIEZ1bmt0aW9uZW4KKyAgICAgYmVyZWl0c3RlbGxlbiwgZGllIG5pY2h0IG51ciBlaW5lbSBPYmpla3QgdmVyd2VuZGV0IHdlcmRlbi4KKworICAgICBNb21lbnRhbiBzaW5kIGRpZXM6CisgICAgIGV4ZWN1dGVyLmMgICAtIHN0ZWxsdCBlaW5lIEZ1bmt0b24gZXhlY3V0ZV9hbnl0aGluZygpIGJlcmV0LgorICAgICBpbnB1dC5jICAgICAgLSBzdGVsbHQgZWluZSBGdW50aW9uIGludHB1dCgpIGJlcmVpdCwgd2VsY2hlIGlucHR1X3RvKCkKKyAgICAgICAgICAgICAgICAgICAga2Fwc2VsdC4KKyAgICAgcGFnZXIuYyAgICAgIC0gU3RlbGx0IGRpZSBGdW5rdGlvbiBNb3JlKCkgdW5kIGlocmUgSGVsZmVyIGJlcmVpdC4KKyAgICAgcmluZ2J1ZmZlci5jIC0gU3RlbGx0IGVpbmVuIFJpbmdwdWZmZXIgdW5kIGRpZSBub3R3ZW5kaWdlbiBWZXJ3YWx0dW5ncy0KKyAgICAgICAgICAgICAgICAgICAgZnVua3Rpb25lbiBiZXJlaXQuCisKKyAgICAgUmluZ2J1ZmZlci5jOgorICAgICAtLS0tLS0tLS0tLS0KKyAgICAgRGllcyBpc3QgZWluIFB1ZmZlciAoQXJyYXkpIGVpbmVyIGJlc3RpbW10ZW4gR3JvZXNzZS4gU29iYWxkIGVyIHZvbGwgaXN0CisgICAgIHdpcmQgYXV0b21hdGlzY2ggZGllIGpld2VpbHMgYWVsdGVzdGVuIERhdGVuIHVlYmVyc2NocmllYmVuLCBzb2JhbGQgZXR3YXMKKyAgICAgbmV1ZXMgaGluZWluZ2VzY2hyaWViZW4gd2lyZC4gRWluIFJpbmdwdWZmZXIgbWl0IGVpbmVyIEdyb2Vzc2Ugdm9uIDMwCisgICAgIHNwZWljaGVydCBhbHNvIGRpZSBsZXR6dGVuIDMwIGhpbmVpbmdlc2NocmllYmVuZW4gT2JqZWt0ZS4KKyAgICAgKiBDcmVhdGVSaW5nQnVmZmVyKCk6IGVyc3RlbGx0IGVpbmVuIG5ldWVuIFJpbmdwdWZmZXIuCisgICAgICogUmVzaXplUmluZ0J1ZmZlcigpOiBhZW5kZXJ0IGRpZSBHcm9lc3NlIGVpbmVzIFJpbmdwdWZmZXJzLgorICAgICAqIFJpbmdCdWZmZXJQdXQoKTogc2NocmVpYnQgZWluIG5ldWVzIERhdHVtIGluIGRlbiBQdWZmZXIuCisgICAgICogUmluZ0J1ZmZlckdldCgpOiBsaWVmZXJ0IGRpZSBEYXRlbiBkZXMgUmluZ3B1ZmZlcnMgenVydWVjay4KKworU0lFSEUgQVVDSDoKKyAgICAgQ3JlYXRlUmluZ0J1ZmZlciwgUmVzaXplUmluZ0J1ZmZlciwgUmluZ0J1ZmZlclB1dCwgUmluZ0J1ZmZlckdldAorCitMRVRaVEUgQWVOREVSVU5HOgorMjMuMDUuMjAwOCwgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2Mvc3RkL3ZlcmVyYnVuZ3NiYWV1bWUgYi9kb2Mvc3RkL3ZlcmVyYnVuZ3NiYWV1bWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRmMjFjYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zdGQvdmVyZXJidW5nc2JhZXVtZQpAQCAtMCwwICsxLDI5MyBAQAorCisgIFZlcmVyYnVuZ3NiYWV1bWUgZGVyIEJhc2lzLU1VRGxpYgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRWluZmFjaGUgR2VnZW5zdGFlbmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRGllIGVpbmZhY2hzdGVuIE9iamVrdGUgZGVyIEJhc2lzLU11ZExpYi4gRGllIE1vZHVsZSwgZGllIHZvbiB0aGluZy5jCitnZWVyYnQgd2VyZGVuLCBlbnRoYWx0ZW4gZGllIHdpY2h0aWdzdGVuIEZ1bmt0aW9uZW4gdW5kIHRyZXRlbiBhdWNoIGluCitkZW4gYW5kZXJlbiBTdGFuZGFyZG9iamVrdGVuIGltbWVyIHdpZWRlciBhdWYuCisKK0RhIGRpZSBBdXNnYWJlIGRlcyBOYW1lbnMgZWluZXMgT2JqZWt0ZXMgKGRpZXNlciB3aXJkIGluIGRlbgorZGVzY3JpcHRpb24tTW9kdWxlbiBkZWZpbmllcnQpIGltbWVyIG1pdCBlaW5lciBEZWtsaW5hdGlvbiB2ZXJidW5kZW4gaXN0LAorZmluZGV0IG1hbiBpbiBqZWRlbSBPYmpla3QsIHdlbGNoZXMgZWluIGRlc2NyaXB0aW9uLmMgZXJidCwgYXVjaAordGhpbmcvbGFuZ3VhZ2UuCisKK3RoaW5nCisgIHwtIHRoaW5nL3Byb3BlcnRpZXMgICAgfCBWZXJ3YWx0dW5nc2Z1bmt0aW9uZW4gZGVzIFByb3BlcnR5LVN5c3RlbXMKKyAgfC0gdGhpbmcvZGVzY3JpcHRpb24gICB8IEF1c3NlaGVuLCBOYW1lLCBJRHMgZGVzIE9iamVrdGVzCisgIHwtIHRoaW5nL21vdmluZyAgICAgICAgfCBCZXdlZ2VuIHVuZCBaZXJzdG9lcmVuIGRlcyBPYmpla3RlcworICB8LSB0aGluZy9sYW5ndWFnZSAgICAgIHwgRGVrbGluYXRpb24gdm9uIE5hbWVuLCBBZGpla3RpdmVuIGV0Yy47IFByb25vbWluYQorICB8LSB0aGluZy9jb21tYW5kcyAgICAgIHwgdm9tIE9iamVrdCBkZWZpbmllcnRlIEtvbW1hbmRvcworICBgLSB0aGluZy9yZXN0cmljdGlvbnMgIHwgR2V3aWNodDogc3RhbmRhcmRtYWVzc2lnIDFLZworCisKK1J1ZXN0dW5nZW4KKy0tLS0tLS0tLS0KKworQmlzIGF1ZiB0aGluZy9yZXN0cmljdGlvbnMuYyB2ZXJmdWVndCBhcm1vdXIuYyB1ZWJlciBzYWVtdGxpY2hlIEZ1bmt0aW9uYWxpdGFldAorZGllIGF1Y2ggdGhpbmcuYyB6dXIgVmVyZnVlZ3VuZyBzdGVsbHQuIFp1c2FldHpsaWNoIGdpYnQgZXMgbm9jaCBlaW4gTW9kdWwsCit3ZWxjaGVzIGRpZSBSdWVzdHVuZyBlcnN0IHp1ciBSdWVzdHVuZyBtYWNodDogYXJtb3VyL2NvbWJhdC5jCisKK2FybW91ciAgICAgICAgICAgICAgICAgIHwgZXZ0bC4gZWluICIoYW5nZXpvZ2VuIikgYW4gS3VyemJlc2NocmVpYnVuZyBoYWVuZ2VuCisgIHwtIHRoaW5nL3Byb3BlcnRpZXMgICB8IEF1Y2ggUnVlc3R1bmdlbiBoYWJlbiBFaWdlbnNjaGFmdGVuCisgIHwtIHRoaW5nL2Rlc2NyaXB0aW9uICB8IEF1c3NlaGVuLCBOYW1lLCBJRHMgZGVyIFJ1ZXN0dW5nCisgIHwtIHRoaW5nL2NvbW1hbmRzICAgICB8IEtvbW1hbmRvcyBzaW5kIGF1Y2ggbW9lZ2xpY2gKKyAgfC0gYXJtb3VyL21vdmluZyAgICAgIHwgQmVpbSBCZXdlZ2VuL1plcnN0b2VyZW46IFJ1ZXN0dW5nIGF1c3ppZWhlbi4uLgorICB8ICAgIGAtIHRoaW5nL21vdmluZyAgfCAuLi51bmQgZGFubiBlcnN0IEJld2VnZW4vWmVyc3RvZXJlbgorICB8LSBhcm1vdXIvY29tYmF0ICAgICAgfCBSdWVzdHVuZ3NrbGFzc2UvLXR5cCwgS2FtcGZmdW5rdGlvbgorICBgLSB0aGluZy9sYW5ndWFnZSAgICAgfCB1bmQgbm9jaCB3YXMgenVtIGRla2xpbmllcmVuLgorCisKK1dhZmZlbgorLS0tLS0tCisKK1dpZSBSdWVzdHVuZ2VuLCB1bnRlcnNjaGVpZGVuIHNpY2ggV2FmZmVuIHZvbiBlaW5mYWNoZW4gR2VnZW5zdGFlbmRlbiBpbQord2VzZW50bGljaGVuIG51ciBkdXJjaCBkaWUgS2FtcGZmdW5rdGlvbmVuLgorCit3ZWFwb24gICAgICAgICAgICAgICAgICB8IGV2dGwuIGVpbiAiKGdlenVlY2t0KSIgYW4gS3VyemJlc2NocmVpYnVuZyBoYWVuZ2VuCisgIHwtIHdlYXBvbi9tb3ZpbmcgICAgICB8IFdhZmZlIGJlaW0gQmV3ZWdlbi9aZXJzdG9lcmVuIGVyc3Qgd2Vnc3RlY2tlbi4uLgorICB8ICAgIGAtIHRoaW5nL21vdmluZyAgfCAuLi51bmQgZGFubiBlcnN0IGJld2VnZW4vemVyc3RvZXJlbgorICB8LSB0aGluZyAocy5vLikgICAgICAgfCBBbnNvbnN0ZW4gYWxsZSB0aGluZy1FaWdlbnNjaGFmdGVuCisgIGAtIHdlYXBvbi9jb21iYXQgICAgICB8IFdhZmZlbmtsYXNzZS8tYXJ0LCBTY2hhZGVuc3R5cCwgS2FtcGZmdW5rdGlvbgorCisKK0xpY2h0cXVlbGxlbgorLS0tLS0tLS0tLS0tCisKK0xpY2h0cXVlbGxlbiBzaW5kIChpbSBTaW5uZSBkZXIgTXVkTGliKSBub3JtYWxlIEdlZ2Vuc3RhZW5kZSwgZGllIHp1c2FldHpsaWNoCitkaWUgRWlnZW5zY2hhZnQgaGFiZW4sIGRhc3Mgc2llIGxldWNodGVuIGtvZW5uZW4gKHVuZCBhdWNoIHZlcmJyZW5uZW4ga29lbm5lbikuCisKK2xpZ2h0c291cmNlICAgICAgIHwgQWxsZXMsIHdhcyB6dW0gTGV1Y2h0ZW4gbm9ldGlnIGlzdAorICBgLSB0aGluZyAocy5vLikgfCBhbnNvbnN0ZW4gZWluIGdhbnogbm9ybWFsZXIgR2VnZW5zdGFuZAorCisKK3VuaXQtT2JqZWt0ZQorLS0tLS0tLS0tLS0tCisKK3VuaXQtT2JqZWt0ZSBzaW5kIEdlZ2Vuc3RhZW5kZSwgYmVpIGRlbmVuIGVzIHNpbm52b2xsIGlzdCwgZGFzcyBlaW4gZWluemVsbmVzCitPYmpla3QgZWluZSBnZXdpc3NlIEFuemFobCB2b24gZ2xlaWNoYXJ0aWdlbiBPYmpla3RlbiByZXByYWVzZW50aWVydC4gRGFzCitiZXN0ZSBCZWlzcGllbCBoaWVyZnVlciBpc3QgZGFzIGxpZWJlIEdlbGQ6IHN0YXR0IDEwMDAgZWluemVsbmVyIE11ZW56ZW4gaW0KK0ludmVudG9yeSB6dSBoYWJlbiwgaGF0IG1hbiBudXIgZWluIGVpbnppZ2VzIEdlbGRvYmpla3QsIGRhcyBlaW5lciBNZW5nZSB2b24KKzEwMDAgTXVlbnplbiBlbnRzcHJpY2h0IChkaWUgYmVpIEthdWYtL1ZlcmthdWZzYWt0aW9uZW4gdW0gZWluZSBlbnRzcHJlY2hlbmRlCitNZW5nZSBlcm5pZWRyaWd0IG9kZXIgZXJob2VodCB3aXJkKS4KK0hpZXJkdXJjaCB3aXJkIGEpIGRpZSBVZWJlcnNpY2h0bGljaGtlaXQgZXJob2VodCB1bmQgYikgbmF0dWVybGljaCBtYXNzaWcKK1NwZWljaGVyIGdlc3BhcnQuCisKK3VuaXQgICAgICAgICAgICAgICB8IGFsbGUgdW5pdC1FaWdlbnNjaGFmdGVuIChHZXdpY2h0LCBNZW5nZSwgQmV3ZWdlbiwgLi4uKQorICBgLSB0aGluZyAocy5vLikgIHwgYW5zb25zdGVuIHNpbmQgZXMgbm9ybWFsZSBHZWdlbnN0YWVuZGUKKworCitTcGVsbGJvb2tzCistLS0tLS0tLS0tCisKK0Z1ZXIgR2lsZGVucHJvZ3JhbW1pZXJlciBpc3QgZGllcyBkYXMgR3J1bmRvYmpla3QgZnVlciBkYXMgWmF1YmVydmVyemVpY2huaXMKK2RlciBHaWxkZS4KK0FDSFRVTkc6IE9id29obCB0aGluZy5jIGdlZXJidCB3aXJkLCBpc3QgZGFzIFNwZWxsYm9vayBuaWNodCB6dW0gY2xvbmVuIHVuZAorInVudGVyIGRlbiBBcm0ga2xlbW1lbiIgZ2VkYWNodCEgVmllbG1laHIgc3RlbGx0IHRoaW5nLmMgaGllciBpbSB3ZXNlbnRsaWNoZW4gCitudXIgZGFzIFByb3BlcnR5LSB1bmQgZGFzIFNwcmFjaG1vZHVsIHp1ciBWZXJmdWVndW5nIQorCitzcGVsbGJvb2sgICAgICAgICAgICAgICAgfCBBbGxnZW1laW5lIEZ1bmt0aW9uZW4gZnVlciBaYXViZXJzcHJ1ZWNoZQorICB8LSB0aGluZyAocy5vLikgICAgICAgIHwgaGllciBudXIgd2cuIFByb3BlcnRpZXMgdW5kIERla2xpbmF0aW9uZW4KKyAgYC0gcmVzdHJpY3Rpb25fY2hlY2tlciB8IGZ1ZXIgRWluc2NocmFlbmt1bmdlbiBiZWltIFphdWJlcm4KKworCitCZWhhZWx0ZXIKKy0tLS0tLS0tLQorCitEaWUgYmlzaGVyIGJlc2NocmllYmVuZW4gT2JqZWt0ZSBrYW5uIG1hbiB6d2FyIG1pdCBzaWNoIGhlcnVtdHJhZ2VuIChhdXNzZXIKK1NwZWxsYm9va3MpLCBhYmVyIG1hbiBrYW5uIG5pY2h0cyBoaW5laW5zdGVja2VuLiBIaWVyenUgc2luZCBlaW5pZ2Ugd2VpdGVyZQorRnVua3Rpb25lbiBub2V0aWcsIGRpZSBjb250YWluZXIuYyB6dXIgVmVyZnVlZ3VuZyBzdGVsbHQuCitJbSB3ZXNlbnRsaWNoZW4gc2luZCBkYXMgaW4gY29udGFpbmVyL3Jlc3RyaWN0aW9ucy5jIEZ1bmt0aW9uZW4genVtIEF1cy0KK3dhZWhsZW4gdm9uIE9iamVrdGVuIGltIEJlaGFlbHRlciwgenVtIFRlc3Rlbiwgb2IgZGVyIEJlaGFlbHRlciBub2NoIHdlaXRlcmUKK09iamVrdGUgYXVmbmVobWVuIGthbm4gKGdld2ljaHRzYWJoYWVuZ2lnKSB1bmQgenVyIEVybWl0dGx1bmcgZGVzIEdlc2FtdC0KK2dld2ljaHRzIGRlcyBCZWhhZWx0ZXJzLgorSW4gY29udGFpbmVyL2Rlc2NyaXB0aW9uLmMgd2lyZCBkZXIgSW5oYWx0IGRlcyBCZWhhZWx0ZXJzIGluIGVpbmUgQmVzY2hyZWlidW5nCit1bWdld2FuZGVsdC4KKworY29udGFpbmVyCisgIHwtIHRoaW5nL3Byb3BlcnRpZXMgICAgICAgIHwgREFTIHplbnRyYWxlIE1vZHVsLi4uCisgIHwtIHRoaW5nL21vdmluZyAgICAgICAgICAgIHwgQmV3ZWdlbi9aZXJzdG9lcmVuIGRlcyBCZWhhZWx0ZXJzCisgIHwtIHRoaW5nL2NvbW1hbmRzICAgICAgICAgIHwgS29tbWFuZG9zIHNpbmQgbW9lZ2xpY2gKKyAgfC0gY29udGFpbmVyL2Rlc2NyaXB0aW9uICAgfCBCZXNjaHJlaWJ1bmcgZGVzIEluaGFsdHMKKyAgfCAgICBgLSB0aGluZy9kZXNjcmlwdGlvbiAgfCBMYW5nLSB1bmQgS3VyemJlc2NocmVpYnVuZworICB8LSB0aGluZy9sYW5ndWFnZSAgICAgICAgICB8IERla2xpbmF0aW9uc21vZHVsCisgIGAtIGNvbnRhaW5lci9yZXN0cmljdGlvbnMgIHwgR2VzYW10Z2V3aWNodCwgT2JqZWt0YXVzd2FobAorICAgICAgIGAtIHRoaW5nL3Jlc3RyaWN0aW9ucyB8IFN0YW5kYXJkZ2V3aWNodDogMUtnCisKK0xlaWNoZW4KKy0tLS0tLS0KKworTGVpY2hlbiBzaW5kIEJlaGFlbHRlciBtaXQgZGVyIHp1c2FldHpsaWNoZW4gRWlnZW5zY2hhZnQsIGRhc3Mgc2llIG1pdCBkZXIKK1plaXQgemVyZmFsbGVuLiBBdXNzZXJkZW0gZ2ViZW4gc2llIGdnZi4gbm9jaCBlaW5lIE1lbGR1bmcgdWViZXIgZGVuCitNb2VyZGVya2FuYWwgYXVzCisKK2NvcnBzZSAgICAgICAgICAgICAgICB8IFplcmZhbGxlbiwgTW9lcmRlcm1lbGR1bmcKKyAgYC0gY29udGFpbmVyIChzLm8uKSB8IHNvbnN0IG5vcm1hbGVyIEJlaGFlbHRlcgorCisKK1JhZXVtZSB1bmQgaWhyZSBBYmtvZW1tbGluZ2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUmFldW1lIHNpbmQgcHJpbnppcGllbGwgQmVoYWVsdGVyIG1pdCBMYW5nLSB1bmQgS3VyemJlc2NocmVpYnVuZyB2b24gSU5ORU4KK3VuZCB3ZWl0ZXJlbiB1bnRlcnN1Y2hiYXJlbiBEZXRhaWxzIChhdWNoIGxlc2JhcmUgRGV0YWlscykgc293aWUKK0F1c2dhZW5nZW4gdW5kIGRlciBNb2VnbGljaGtlaXQgdm9yZGVmaW5pZXJ0ZSBPYmpla3RlIGltIFJhdW0genUgcGxhemllcmVuLgorCityb29tCisgIHwtIHRoaW5nL3Byb3BlcnRpZXMgICAgIHwgRWlnZW5zY2hhZnRlbiBkZXMgUmF1bWVzCisgIHwtIHRoaW5nL2xhbmd1YWdlICAgICAgIHwgZGFzIG9ibGlnYXRvcmlzY2hlIFNwcmFjaG1vZHVsCisgIHwtIHJvb20vbW92aW5nICAgICAgICAgIHwgbnVyIFplcnN0b2VyZW47IEtFSU4oISkgQmV3ZWdlbgorICB8LSByb29tL3Jlc3RyaWN0aW9ucyAgICB8IFJhZXVtZSB3ZXJkZW4gbmllIHZvbGwKKyAgfCAgICBgLSBjb250YWluZXIvcmVzdHJpY3Rpb25zICB8IHNvbnN0IGRpZSBnbGVpY2hlIEZ1bmt0aW9uYWxpdGFldCB3aWUKKyAgfAkgICAgYC0gdGhpbmcvcmVzdHJpY3Rpb25zIHwgYmVpbSBub3JtYWxlbiBCZWhhZWx0ZXIKKyAgfC0gcm9vbS9kZXNjcmlwdGlvbiAgICAgfCBSYXVtYmVzY2hyZWlidW5nLCBEZXRhaWxzLCBldGMuCisgIHwgICAgYC0gY29udGFpbmVyL2Rlc2NyaXB0aW9uICAgfCBCZXNjaHJlaWJ1bmcgZGVzIEluaGFsdHMKKyAgfAkgICAgYC0gdGhpbmcvZGVzY3JpcHRpb24gIHwgQmVzY2hyZWlidW5nIHZvbiBhdXNzZW4gKHNlbHRlbiBzaWNodGJhcikKKyAgfC0gcm9vbS9leGl0cyAgICAgICAgICAgfCBWZXJ3YWx0dW5nIGRlciBBdXNnYWVuZ2UKKyAgfC0gcm9vbS9jb21tYW5kcyAgICAgICAgfCBub3RpZnlfZmFpbCgpcyBmdWVyICJsaWVzIiwgInN1Y2hlIiwgInN1Y2giCisgIHwgICAgYC0gdGhpbmcvY29tbWFuZHMgIHwgc29uc3Qgbm9ybWFsZSBLb21tYW5kb2JlaGFuZGx1bmcKKyAgfC0gcm9vbS9pdGVtcyAgICAgICAgICAgfCBWZXJ3YWx0dW5nIHZvbiBPYmpla3RlbiwgZGllIGltIFJhdW0gc2VpbiBzb2xsZW4KKyAgYC0gcm9vbS9kb29ycyAgICAgICAgICAgfCBUdWVyZW4gKGJlc29uZGVyZSBBdXNnYWVuZ2UpCisKKworRGllIEtuZWlwZSBlcndlaXRlcnQgZGVuIFN0YW5kYXJkcmF1bSB1bSBGdW5rdGlvbmVuIHp1ciBEZWZpbml0aW9uIGRlcgorU3BlaXNlbiB1bmQgR2V0cmFlbmtlIHNvd2llIHVtIEJlZmVobGUgenVtIEJlc3RlbGxlbiB1bmQgQXVzZ2ViZW4uCisKK3B1YgorICBgLSByb29tIChzLm8uKQorCisKK0F1Y2ggZGVyIExhZGVuIGJhdXQgZGlyZWt0IGF1ZiBkZW0gU3RhbmRhcmRyYXVtIGF1Zi4gSGllciB3ZXJkZW4gbm9jaCBkaWUKK3VlYmxpY2hlbiBFaW4tIHVuZCBWZXJrYXVmc2JlZmVobGUgenVyIFZlcmZ1ZWd1bmcgZ2VzdGVsbHQuCitKZWRlciBMYWRlbiBiZW5vZXRpZ3QgenVzYWV0emxpY2ggZWluZW4gU3BlaWNoZXIsIGluIGRlbSB2ZXJrYXVmdGUgT2JqZWt0ZQorZ2VsYWdlcnQgd2VyZGVuLiBXZW5uIGRlciBMYWRlbiBzY2hvbiBiZWltIGVyc3RlbiBCZXRyZXRlbiB1ZWJlciBlaW4KK2dld2lzc2VzIFdhcmVuc29ydGltZW50IHZlcmZ1ZWdlbiBzb2xsLCBrYW5uIG1hbiBkaWUgbWl0IEFkZEl0ZW0oKS1BdWZydWZlbgoraW0gU3BlaWNoZXIgYmV3ZXJrc3RlbGxpZ2VuLgorCitsYWRlbgorICBgLSByb29tIChzLm8uKQorCitzdG9yZQorICB8LSB0aGluZy9wcm9wZXJ0aWVzICB8IG5vZXRpZyBmdWVyIHJvb20vaXRlbXMuYworICBgLSByb29tL2l0ZW1zICAgICAgICB8IHZvcmRlZmluaWVydGUgT2JqZWt0ZSBpbSBTcGVpY2hlcgorCisKK0RpZSBQb3N0IGlzdCB2b24gZGVyIFByb2dyYW1taWVydW5nIGhlciBnZW5hdSBzbyB6dSBiZWhhbmRlbG4gd2llIGVpbgorbm9ybWFsZXIgUmF1bS4gRGllIFBvc3RrYWJpbmVuIHdlcmRlbiBhdXRvbWF0aXNjaCB6dXIgVmVyZnVlZ3VuZyBnZXN0ZWxsdDsKK21hbiBicmF1Y2h0IHNpY2ggaW4gZGVyIEhpbnNpY2h0IHVtIG5pY2h0cyB6dSBrdWVtbWVybi4KKworcG9zdAorICBgLSAoLi4uKSByb29tCisKKworU2NoaWZmZSB1bmQgYWVobmxpY2hlIFRyYW5zcG9ydGVyIHdlcmRlbiBkdXJjaCAiYmV3ZWdsaWNoZSIgUmFldW1lIHJlYWxpc2llcnQuCitTbyBoYXQgbWFuIGFsbGUgQmVzY2hyZWlidW5nc21vZWdsaWNoa2VpdGVuIGVpbmVzIFJhdW1lcyB6dXIgVmVyZnVlZ3VuZyB1bmQKK2thbm4gKHdpZSBiZWkgZGVyIEpvbGxlIGdlc2NoZWhlbikgQXVzZ2FlbmdlIGluIHdlaXRlcmUgUmF1bWUgZGVzIFRyYW5zcG9ydGVycworbGVnZW4gKGRpZXNlIHNpbmQgbm9ybWFsZSBSYWV1bWUsIEtFSU5FIFRyYW5zcG9ydGVyISkuCitEZXN3ZWl0ZXJlbiBzaW5kIFRyYW5zcG9ydGVyIGRpZSBlaW56aWdlbiAoU3RhbmRhcmQtKVJhdW1lLCBiZWkgZGVuZW4gbWFuCithdWNoIGRpZSBhZXVzc2VyZSBMYW5nLSB1bmQgS3VyemJlc2NocmVpYnVuZyB6dSBzZWhlbiBiZWtvbW10LCB3ZWlsIG1hbgorbmljaHQgbnVyIGluIGVpbmVtIFRyYW5zcG9ydGVyIHNlaW4ga2Fubiwgc29uZGVybiBhdWNoIGRhbmViZW4gc3RlaGVuIGthbm4uCisKK3RyYW5zcG9ydCAgICAgICAgIHwgRnVua3Rpb25lbiB6dXIgRmVzdGxlZ3VuZyBkZXIgUm91dGUsIEFuLSB1bmQgQWJsZWdlbgorICB8LSByb29tIChzLm8uKSAgfCBkaWUgbm9ybWFsZW4gUmF1bWZ1bmt0aW9uZW4KKyAgYC0gdGhpbmcvbW92aW5nIHwgdW5kIGhpZXIgc3RlY2t0IGRpZSBCZXdlZ2xpY2hrZWl0CisKKworR2lsZGVuCistLS0tLS0KKworR2lsZGVuIGdpYnQgZXMgaW4gendlaSBBdXNmdWVocnVuZ2VuOiBlaW5tYWwgYWxzIGVpbmZhY2hlcyBHaWxkZW5vYmpla3QsIGRhbm4KK2FiZXIgYXVjaCBhbHMgR2lsZGVucmF1bSAod2llIHpCLiBkaWUgQWJlbnRldXJlcmdpbGRlKS4KK1dhZWhyZW5kIGRhcyBHaWxkZW5vYmpla3QgKGdpbGRlbl9vYikgRnVua3Rpb25lbiB6dW0gTGVybmVuIHZvbiBGYWVoaWdrZWl0ZW4KK3VuZCBaYXViZXJzcHJ1ZWNoZW4sIGRlbSBHaWxkZW5laW4tIHVuZCAtYXVzdHJpdHQgc293aWUgenVtIGdpbGRlbmludGVybmVuCitBdWZzdGllZyB6dXIgVmVyZnVlZ3VuZyBzdGVsbHQgKHdhcyB6Qi4gYXVjaCB2b24gZWluZW0gTlBDIGF1c2dldWVidCB3ZXJkZW4KK2tvZW5udGUpLCB2ZXJmdWVndCBkZXIgR2lsZGVucmF1bSB6dXNhZXR6bGljaCBub2NoIHVlYmVyIEZ1bmt0aW9uZW4genVtCitub3JtYWxlbiBTdHVmZW5hdWZzdGllZyBhdWZncnVuZCB2b24gQWJlbnRldWVyLSB1bmQgRXJmYWhydW5nc3B1bmt0ZW4sIGRpZQorUXVlc3RsaXN0ZSB1bmQgZGllIEtvc3RlbmFiZnJhZ2UuCisKK2dpbGRlbl9vYiAgICAgICAgICAgICAgICB8IEVpbi0vQXVzdHJpdHQsIExlcm5lbiwgR2lsZGVuYXVmc3RpZWcKKyAgYC0gcmVzdHJpY3Rpb25fY2hlY2tlciB8IEJlc2NocmFlbmt1bmdlbiBiZWkgb2JpZ2VuIEFrdGlvbmVuCisKK2dpbGRlbl9yb29tCisgIHwtIGdpbGRlICAgICAgICAgICAgICAgfCBTdHVmZW5hdWZzdGllZywgUXVlc3RsaXN0ZSwgS29zdGVuCisgIHwgICAgYC0gcm9vbSAocy5vLikgICAgfCBub3JtYWxlIFJhdW1mdW5rdGlvbmVuCisgIGAtIGdpbGRlbl9vYiAocy5vLikgICAgfCBHaWxkZW5hdWZzdGllZyBldGMuCisKK05QQ3MKKy0tLS0KKworRGFzIE9wZmVyLiBadW1pbmRlc3QgbWVpc3RlbnMuLi4KKworbnBjCisgIHwtIHRoaW5nL3Byb3BlcnRpZXMgICAgICAgICAgICB8IEVpZ2Vuc2NoYWZ0ZW4gZGVzIE5QQworICB8LSBsaXZpbmcvZGVzY3JpcHRpb24gICAgICAgICAgfCBBdXNnYWJlIGRlcyBHZXN1bmRoZWl0c3p1c3RhbmRlcy4uLgorICB8ICAgIGAtIGNvbnRhaW5lci9kZXNjcmlwdGlvbiAgfCAuLi56dXNhZXR6bGljaCB6dSBzZWluZW0gSW5oYWx0Li4uCisgIHwJICAgIGAtIHRoaW5nL2Rlc2NyaXB0aW9uIHwgLi4udW5kIHNlaW5lciBCZXNjaHJlaWJ1bmcKKyAgfC0gbGl2aW5nL2xpZmUgICAgICAgICAgICAgICAgIHwgRGllIExlYmVuc2Z1bmt0aW9uZW4sIEVzc2VuLCBUcmlua2VuLCBHaWZ0CisgIHwtIGxpdmluZy9hdHRyaWJ1dGVzICAgICAgICAgICB8IERpZSBWZXJ3YWx0dW5nIGRlciBTdGF0cworICB8LSBsaXZpbmcvbW92aW5nICAgICAgICAgICAgICAgfCBCZXdlZ2VuIHZvbiBMZWJld2VzZW4KKyAgfC0gbGl2aW5nL3NraWxscyAgICAgICAgICAgICAgIHwgRnVua3Rpb25lbiBmdWVyIEZhZWhpZ2tlaXRlbiB1bmQgU3BydWVjaGUKKyAgfCAgICBgLSBsaXZpbmcvc3RkX3NraWxscyAgICAgIHwgdW5kIGVpbmlnZSBTdGFuZGFyZGZhZWhpZ2tlaXRlbgorICB8LSBucGMvY29tYmF0ICAgICAgICAgICAgICAgICAgfCBOUEMtc3BlemlmaXNjaGUgS2FtcGZmdW5rdGlvbmVuCisgIHwgICAgYC0gbGl2aW5nL2NvbWJhdCAgICAgICAgICB8IGRlciBLYW1wZiBhbiBzaWNoCisgIHwtIG5wYy9jaGF0ICAgICAgICAgICAgICAgICAgICB8IFNwcnVlY2hlIGEgbGEgQW5keQorICB8LSBucGMvY29tbSAgICAgICAgICAgICAgICAgICAgfCBCYXNpc2tvbW11bmlrYXRpb246ICJzYWciLCAiZWNobyIsICJlbW90ZSIKKyAgfC0gY29udGFpbmVyL3Jlc3RyaWN0aW9ucyAgICAgIHwgd2llIGJlaSBCZWhhZWx0ZXJuCisgIHwgICAgYC0gdGhpbmcvcmVzdHJpY3Rpb25zCisgIHwtIHRoaW5nL2xhbmd1YWdlICAgICAgICAgICAgICB8IG9ibGlnYXRvcmlzY2guLi4KKyAgfC0gbnBjL2luZm8gICAgICAgICAgICAgICAgICAgIHwgQW50d29ydGVuIGF1ZiBGcmFnZW4KKyAgfC0gbnBjL3B1dF9hbmRfZ2V0ICAgICAgICAgICAgIHwgUmVha3Rpb24gYXVmIGVyaGFsdGVuZSBHZWdlbnN0YWVuZGUKKyAgfCAgICBgLSBsaXZpbmcvcHV0X2FuZF9nZXQgICAgIHwgR2ViZW4gdW5kIE5laG1lbiB2b24gT2JqZWt0ZW4KKyAgYC0gbnBjL2d1YXJkICAgICAgICAgICAgICAgICAgIHwgZnVlciBXYWNoLU5QQ3MKKworRGVyIGludGVsbGlnZW50ZSBOUEMgYmVmaW5kZXQgc2ljaCBub2NoIGluIGRlciBFbnR3aWNrbHVuZy4KKworaW5wYworICB8LSBucGMgKHMuby4pICB8IEVyc3QgbWFsIGVpbiBnYW56IG5vcm1hbGVyIE5QQy4uLgorICB8LSBpbnBjL25vYmFuayB8IC4uLmRlciBnZWdlbiBCYW5rendlaXRpcyB2b3JnZWhlbiBrYW5uLi4uCisgIHwgICAgYC0gcGxheWVyL21vbmV5aGFuZGxlciB8IC4uLnVuZCBzZWxic3QgR2VsZCBtaXRzY2hsZXBwdDsgLi4uCisgIHwtIHNlbGVjdCAgICAgIHwgLi4uZGllIGJlc3RlIEF1c3J1ZXN0dW5nIGVya2VubnQgdW5kIGF1Y2ggYmVudXR6dC4uLgorICBgLSBib296aW5nICAgICB8IC4uLnVuZCBpbiBkZXIgS25laXBlIGRpZSBiZXN0ZSBIZWlsbW9lZ2xpY2hrZWl0IGZpbmRldCEKKworCitTcGllbGVyLSB1bmQgTWFnaWVyc2hlbGwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzaGVsbHMvbWFnaWVyICAgICAgICAgICAgICAgICAgfCBIaWVyIGF1Y2ggbm9jaCBTcGllbGVyc2hlbGxzOgorICB8LSBwbGF5ZXIvYmFzZSAgICAgICAgICAgICAgIHwgRWlubG9nZ2VuLCBHcnVuZGZ1bmt0aW9uZW4KKyAgfCAgICB8LSBwbGF5ZXIvcmVzdHJpY3Rpb25zICB8IE1heGltYWxlIFp1bGFkdW5nIChTdGFlcmtlKSwgSW5zZXJ0SG9va3MKKyAgfCAgICB8ICAgIGAtIGNvbnRhaW5lci9yZXN0cmljdGlvbnMgICB8IE1heGltYWxnZXdpY2h0LCBadWxhZHVuZ3N0ZXN0CisgIHwgICAgfAkgYC0gdGhpbmcvcmVzdHJpY3Rpb25zICB8IERlZmF1bHRnZXdpY2h0CisgIHwgICAgfC0gbGl2aW5nL2F0dHJpYnV0ZXMgICAgfCBTdGF0cworICB8ICAgIHwtIGxpdmluZy9jb21iYXQgICAgICAgIHwgS2FtcGZmdW5rdGlvbmVuCisgIHwgICAgfC0gbGl2aW5nL3B1dF9hbmRfZ2V0ICAgfCBOZWhtZW4gdW5kIEdlYmVuIHZvbiBPYmpla3RlbgorICB8ICAgIHwtIHRoaW5nL3Byb3BlcnRpZXMgICAgIHwgREFTIHplbnRyYWxlIE1vZHVsLi4uCisgIHwgICAgfC0gdGhpbmcvbGFuZ3VhZ2UgICAgICAgfCBEZWtsaW5hdGlvbmVuCisgIHwgICAgfC0gcGxheWVyL2Rlc2NyaXB0aW9uICAgfCBXYWZmZS9SdWVzdHVuZ2VuIGF1c2dlYmVuCisgIHwgICAgfCAgICBgLSBsaXZpbmcvZGVzY3JpcHRpb24gICAgICAgICAgIHwgR2VzdW5kaGVpdHN6dXN0YW5kIGFuemVpZ2VuCisgIHwgICAgfAkgYC0gY29udGFpbmVyL2Rlc2NyaXB0aW9uICAgfCBFcm1pdHRsdW5nIGRlcyBJbmhhbHRzCisgIHwgICAgfAkgICAgICBgLSB0aGluZy9kZXNjcmlwdGlvbiAgfCBLdXJ6LSB1bmQgTGFuZ2Jlc2NocmVpYnVuZzsgSURzCisgIHwgICAgfC0gcGxheWVyL21vdmluZyAgICAgICAgfCBCZXdlZ2VuL1plcnN0b2VyZW46IFp1c2F0emNoZWNrcworICB8ICAgIHwgICAgYC0gbGl2aW5nL21vdmluZyAgIHwgQmV3ZWdlbi9aZXJzdG9lcmVuIHZvbiBMZWJld2VzZW4KKyAgfCAgICB8LSBwbGF5ZXIvbGlmZSAgICAgICAgICB8IFp1c2F0emNoZWNrcyBiZWkgTGViZW5zZnVua3Rpb25lbgorICB8ICAgIHwgICAgYC0gbGl2aW5nL2xpZmUgICAgIHwgYWxsZ2VtZWluZSBMZWJlbnNmdW5rdGlvbmVuCisgIHwgICAgfC0gcGxheWVyL2NvbW0gICAgICAgICAgfCBhbGxnZW1laW5lIEtvbW11bmlrYXRpb24KKyAgfCAgICB8ICAgIGAtIHBsYXllci9jaGFubmVsICB8IEtvbW11bmlrYXRpb24gdWViZXIgZGllIEthbmFlbGUKKyAgfCAgICB8LSBwbGF5ZXIvbW9uZXloYW5kbGVyICB8IEdlbGR2ZXJ3YWx0dW5nIChhdWNoIGZ1ZXIgTlBDcyBnZWVpZ25ldCkKKyAgfCAgICB8LSBwbGF5ZXIvY29tbWFuZCAgICAgICB8IEFsaWFzZSwgSGlzdG9yeSwgUGFyc2VyCisgIHwgICAgfC0gbGl2aW5nL3NraWxscyAgICAgICAgfCBhbGxnLiBGYWVoaWdrZWl0c2Z1bmt0aW9uZW4KKyAgfCAgICB8ICAgIGAtIGxpdmluZy9zdGRfc2tpbGxzIHwgU3RhbmRhcmRmYWVoaWdrZWl0ZW4KKyAgfCAgICB8LSBwbGF5ZXIvcXVlc3RzICAgICAgICB8IFZlcndhbHR1bmcgZ2Vsb2VzdGVyIEFiZW50ZXVlcgorICB8ICAgIHwtIHBsYXllci9wb3Rpb24gICAgICAgIHwgVmVyd2FsdHVuZyBnZWZ1bmRlbmVyIFphdWJlcnRyYWVua2UKKyAgfCAgICB8LSBwbGF5ZXIvc291bCAgICAgICAgICB8IFNlZWxlbmtvbW1hbmRvcyAoaGlsZmUgdmVyYmVuIDspCisgIHwgICAgfC0gcGxheWVyL3ZpZXdjbWQgICAgICAgfCBVbnRlcnN1Y2hlbiBldGMuCisgIHwgICAgfC0gbW9yZSAgICAgICAgICAgICAgICAgfCBNb3JlKCkgZnVlciBsYW5nZSBUZXh0ZQorICB8ICAgIGAtIHVzZXJfZmlsdGVyICAgICAgICAgIHwgSGlsZnNtb2R1bCBmdWVyICJrd2VyIGluIG11ZW5zdGVyIiBldGMuCisgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBYiBoaWVyOiBNYWdpZXJzaGVsbAorICB8LSBzaGVsbHMvZmlsZXN5cy9maWxlc3lzICAgICAgICAgfCBhbGxnZW1laW5lcyBNb2R1bCB6dXIgRGF0ZWliZWhhbmRsdW5nCisgIHwgICAgfC0gc2hlbGxzL2ZpbGVzeXMvbWFudWFsICAgICB8IGRlciAiaGlsZmUiLUJlZmVobCBkZXIgTWFnaWVyCisgIHwgICAgfC0gc2hlbGxzL2ZpbGVzeXMvcHJpbWl0aXZlcyB8IGxvdy1sZXZlbC1Sb3V0aW5lbgorICB8ICAgIHwtIHNoZWxscy9maWxlc3lzL2FzeW5jaHJvbiAgfCB6dXIgVmVybWVpZHVuZyB2b24gTGFncworICB8ICAgIGAtIHNoZWxscy9maWxlc3lzL21ha2UgICAgICAgfCBrb21mb3J0YWJsZXMgdXBkYXRlbiB2b24gT2JqZWt0ZW4KKyAgYC0gcGxheWVyL29iamVjdHMgICAgICAgICAgICAgICAgIHwgT2JqZWt0ZSBjbG9uZW4sIHVwZGF0ZW4sIHplcnN0b2VyZW4KZGlmZiAtLWdpdCBhL2RvYy9zdGQvdmlydHVhbF9jb21waWxlciBiL2RvYy9zdGQvdmlydHVhbF9jb21waWxlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzhlYzNkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3N0ZC92aXJ0dWFsX2NvbXBpbGVyCkBAIC0wLDAgKzEsODIgQEAKK1dhcyBzaW5kICd2aXJ0dWVsbGUgT2JqZWt0ZSc/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorVmlydHVlbGxlIE9iamVrdGUgc2luZCBPYmpla3RlIGZ1ZXIgZGllIGVzIGtlaW5lIGV4cGxpeml0ZSBRdWVsbGRhdGVpIGdpYnQuCitBbnNvbnN0ZW4gc2luZCBkaWUgT2JqZWt0ZSAoZmFzdCkgZ2VuYXVzbyB3aWUgYWxsZSBhbmRlcmVuIGF1Y2guCisKK1dhcyBtYWNodCBlaW4gVmlydHVhbCBDb21waWxlcj8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1dlbm4gZGVyIERyaXZlciBlaW4gT2JqZWt0ICIvcGZhZC9vYmpla3QiIGxhZGVuIHNvbGwsIGd1Y2t0IGVyIGVyc3RtYWwgbmFjaCwKK29iIGVzIHNvIGVpbiBGaWxlICgvcGZhZC9vYmpla3QuYykgYXVmIGRlciBQbGF0dGUgZ2lidC4gV2VubiBqYSwgbGFlZHQgZXIgZXMKK2dhbnogbm9ybWFsLiBXZW5uIG5pY2h0LCBwYXNzaWVydCBmb2xnZW5kZXM6CisKKzEuIERlciBEcml2ZXIgZnJhZ3QgZGVuIE1hc3RlciBkZXIgTXVkbGliIG5hY2ggZGVtIE9iamVrdC4KKzIuIERlciBNYXN0ZXIgZ3Vja3QgaW0gVmVyemVpY2huaXMgIi9wZmFkLyIgbmFjaCwgb2IgZXMgZWluIHZpcnR1YWxfY29tcGlsZXIuYworICAgZG9ydCBnaWJ0LiBXZW5uIGphLCB3aXJkIGRpZXNlcyB2aXJ0dWFsX2NvbXBpbGVyLmMgZ2VmcmFndCwgb2IgZXMgc2ljaCAKKyAgIGRhZnVlciB6dXN0YWVuZGlnIGZ1ZWhsdCwgZWluIE9iamVrdCBtaXQgZGVtIE5hbWVuICIvcGZhZC9vYmpla3QiIHp1IAorICAgZXJ6ZXVnZW4uCiszLiBXZW5uIHNpY2ggZGVyIFZDIGZ1ZXIgenVzdGFlbmRpZyBmdWVobHQsIGNsb250IGVyIGVpbiBPYmpla3QgKHouQi4gc2VpbgorICAgU3RhbmRhcmRvYmpla3QsICJzdGRvYi5jIiksIGtvbmZpZ3VyaWVydCBlcyBldnRsLiBub2NoIGVpbiBiaXNzY2hlbiB1bmQgCisgICBnaWJ0IGVzIGFuIGRlbiBNYXN0ZXIgenVydWVjay4gRGFzIGVyemV1Z3RlIE9iamVrdCBoZWlzc3QgYW4gZGllc2VyIFN0ZWxsZQorICAgei5CLiAiL3BmYWQvc3Rkb2IjNDIiICh3ZWlsIGVzIGVpbiBDbG9uIHZvbiAiL3BmYWQvc3Rkb2IiIGlzdCkuCis0LiBEZXIgTWFzdGVyIGdpYnQgZGllc2VzIGVyemV1Z3RlIE9iamVrdCBhbiBkZW4gRHJpdmVyIHp1cnVlY2suCis1LiBEZXIgRHJpdmVyIGJlbmVubnQgZGFzIHZvbSBNYXN0ZXIgZXJoYWx0ZW5lIE9iamVrdCAiL3BmYWQvc3Rkb2IjNDIiIHVtIGluCisgICBkYXMgZ2V3dWVuc2NodGUgT2JqZWt0ICIvcGZhZC9vYmpla3QiLiBWb24gZGllc2VtIE1vbWVudCBhbiBpc3QgZXMsIGFscyBvYgorICAgZXMgZWluIEZpbGUgIi9wZmFkL29iamVrdC5jIiBnYWViZSwgd2FzIGRpZXNlcyBPYmpla3QgZGVmaW5pZXJ0LgorCitEYXMgaXN0IGdydW5kc2FldHpsaWNoIGRhcywgd2FzIGVpbiBWQyBtYWNodC4KKworV2FzIG1hY2h0IGRlciBWQyBpbiAvc3RkLz8KKz09PT09PT09PT09PT09PT09PT09PT09PT09CitFcnN0bWFsIGRhcyBvYmVuIGJlc2NocmllYmVuZS4gRnVlciB3ZWxjaGVuIFBmYWQgc2ljaCBkaWVzZXIgVkMgenVzdGFlbmRpZworZnVlaGx0IHVuZCB3ZWxjaGVzIE9iamVrdCBlciBqZXdlaWxzIGNsb25lbiBzb2xsLCB3aXJkIHBlciBQX0NPTVBJTEVSX1BBVEggdW5kCitQX1NURF9PQkpFQ1Qga29uZmlndXJpZXJ0LgorWnVzYWV0emxpY2ggZnVlaHJ0IGVyIGJlc2FndGUgTGlzdGUgc2VpbmVyIGVyemV1Z3RlbiBPYmpla3RlLCBkYW1pdCBiZWkgZWluZW0KKydscycgYXVmIGRhcyBWZXJ6ZWljaG5pcyBkaWVzZSBPYmpla3RlIG1pdCBhbmdlemVpZ3Qgd2VyZGVuLgorV2VpdGVyaGluIHplcnN0b2VydCBlciBhbGxlIGRpZXNlIE9iamVrdGUgaW4gc2VpbmVtIGVpZ2VuZW4gUmVtb3ZlLgorQXVzc2VyZGVtIGhhdCBlciAyIEZ1bmt0aW9uZW4sIG1pdCBkZW5lbiBlciBlbnRzY2hlaWRlbiBrYW5uLCBvYiBlciBmdWVyIGVpbgorYmVzdGltbXRlcyBhbmdlZnJhZ3RlcyBPYmpla3QgenVzdGFlbmRpZyBpc3QsIFZhbGlkYXRlKCkgdW5kCitRdWVyeVZhbGlkT2JqZWN0KCkgdW5kIGVpbmUgRnVua3Rpb24gQ3VzdG9taXplT2JqZWN0KCksIGRpZSBlaW5lbSBmcmlzY2gKK2dlY2xvbnRlbiBPYmpla3Qgc2FnZW4ga2Fubiwgd2VsY2hlbiBOYW1lbiBlcyBzcGFldGVyIGVpbm1hbCBoYWJlbiBzb2xsIChzLgoramV3ZWlsaWdlIE1hbmFwYWdlcykuCisKK1dpZSBiYXV0IG1hbiBzaWNoIHNlaW5lbiBlaWdlbmVuIFZDPworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitTYWdlbiB3aXIsIGlociB3b2xsdCBlaW5lbiBWQyBiYXVlbiwgZGVyIGplZGVtIFNwaWVsZXIgc2VpbmVuIGVpZ2VuZW4gUmF1bQorZ2lidCwgZGFtaXQgamVkZXIgU3BpZWxlciBpbiBkaWVzZW0gUmF1bSBlaW4gTW9uc3RlciBhbGxlaW4gZXJsZWdlbiBtdXNzLAorb2huZSBkYXNzIGFuZGVyZSBTcGllbGVyIG1pdCBkcmluIHNpbmQuCitEYW5uIGJyYXVjaHQgaWhyIHp1ZXJzdCBtYWwgZWluZW4gUmF1bSwgZGVyIGRpZSBWb3JsYWdlIGZ1ZXIgYWxsZSBWQy1SYWV1bWUKK3NlaW4gc29sbCwgei5CLiBzdGRfYXJlbmEuYy4gRGllc2VuIGxlZ3QgaWhyIGluIGRhcyBWZXJ6ZWljaG5pcywgd28gZGVyIFZDIGhpbgorc29sbCwgei5CLiAvZC9yZWdpb24vbWFnaWVyL3ZjLy4KK0luIGRpZXNlbSBWZXJ6ZWljaG5pcyBsZWd0IGlociBudW4gZWluIEZpbGUgdmlydHVhbF9jb21waWxlci5jIGFuLCB3ZWxjaGVzCisvc3RkL3ZpcnR1YWwvdl9jb21waWxlciBlcmJ0LgorSW0gY3JlYXRlKCkgc2V0enQgaWhyIG51biBQX0NPTVBJTEVSX1BBVEggYXVmICIvZC9yZWdpb24vbWFnaWVyL3ZjLyIgdW5kCitQX1NURF9PQkpFQ1QgYXVmICIvZC9yZWdpb24vbWFnaWVyL3ZjL3N0ZF9hcmVuYSIuCitTb2xsIGV1ZXIgVkMga2VpbmUgUGFyYS1SYWV1bWUgZXJ6ZXVnZW4sIHNldHp0IGlociBQX1BBUkEgYXVmICh7fSkuCitTb2Rhbm4gbXVlc3N0IGlociBlaW4gVmFsaWRhdGUoKSBmb3JtdWxpZXJlbiAocy4gTWFucGFnZSksIHdlbGNoZXMgcHJ1ZWZ0LCBvYgorZWluIHNwYWV0ZXIgZ2V3dWVuc2NodGVzIE9iamVrdCBkZW4gcmljaHRpZ2VuIE5hbWVuIChvaG5lIFBmYWQpIGhhdCwgei5CLgorJ2FyZW5hfHNwaWVsZXJuYW1lJyB1bmQgaW4gZGllc2VtIEZhbGwgZ2VuYXUgZGllc2VuIE5hbWVuIHp1cnVlY2tsaWVmZXJ0IHVuZAoraW4gYW5kZXJlbiBGYWVsbGVuIDAuCitEYXMgd2Fycy4gWnVtaW5kZXN0IGluIGRpZXNlbSBlaW5mYWNoZW4gRmFsbCBzZWlkIGlociBpbSB3ZXNlbnRsaWNoZW4gZmVydGlnLgorSWhyIGtvZW5udCBlaW5lbiBTcGllbGVyIG51biBtaXQKKyAgcGwtPm1vdmUoIi9kL3JlZ2lvbi9tYWdpZXIvdmMvYXJlbmF8c3BpZWxlcm5hbWUiLE1fR08pCitpbiAnc2VpbmVuJyBwZXJzb2VubGljaGVuIFJhdW0gYmV3ZWdlbi4KKworQml0dGUgYmVhY2h0ZXQgYWxsZXJkaW5ncyBub2NoIGRpZSBIaW53ZWlzZSB1bmQgQmVzY2hyZWlidW5nZW4gaW4gZGVuIE1hbnBhZ2VzCit6dSBkZW4gZWluemVsbmVuIEZ1bmt0aW9uZW4gdW5kIFByb3BlcnRpZXMuCisKKworQmVpc3BpZWxlOgorPT09PT09PT09PQorMS4gL2RvYy9iZWlzcGllbGUvdmlydHVhbC96ZXNzdHJhL3ZpcnR1YWxfY29tcGlsZXIuYworICAgVkMsIGRlciBqZWRlbSBTcGllbGVyIGVpbmVuIGVpZ2VuZW4gUmF1bSBnaWJ0LiBEYSBoaWVyIGRlciBJbmhhbHQgYWxsZXIKKyAgIFJhZXVtZSBnbGVpY2ggaXN0IChhbGxlIFNwaWVsZXIgc29sbGVuIGdsZWljaGUgQmVkaW5ndW5nZW4gaGFiZW4pLCBpc3QKKyAgIGtlaW5lIEtvbmZpZ3VyaWVydW5nIG1pdCBIaWxmZSB2b24gQ3VzdG9taXplT2JqZWN0KCkgbm9ldGlnLgorCisyLiAvZG9jL2JlaXNwaWVsZS92aXJ0dWFsL2hhdGUvdnJfY29tcGlsZXIuYworICAgRGllcyBpc3QgZWluIEJlaXNwaWVsIGZ1ZXIgZWluZW4gc2VociBhbGxnZW1laW5lbiBWQywgZGVyIGVzIAorICAgZXJsYXVidCBhbnp1Z2ViZW4gaW4gd2VsY2hlbSBCZXJlaWNoIHNpY2ggZGllIHggdW5kIHkgS29vcmRpbmF0ZW4gYmVmaW5kZW4KKyAgIHVuZCBkYW5uIFJhZXVtZSBlcnpldWd0LCB3ZWxjaGUgQXVzZ2FlbmdlIGluIGFsbGUgdmllciBIaW1tZWxzcmljaHR1bmdlbiAKKyAgIGhhYmVuLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMjcuMTAuMjAwNywgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL3N0ZC93ZWFwb24gYi9kb2Mvc3RkL3dlYXBvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODk0YzAyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3N0ZC93ZWFwb24KQEAgLTAsMCArMSw3OCBAQAorIFNUQU5EQVJES0xBU1NFOgorCSIvc3RkL3dlYXBvbiIKKworIEJFTlVUWlVORzoKKyAgICAgICAgaW5oZXJpdCAic3RkL3dlYXBvbiI7CisKKwkjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCSNpbmNsdWRlIDxjb21iYXQuaD4KKworIFBST1BFUlRJRVM6CisgICAgIEdydW5kbGVnZW5kOgorICAgICAgICBQX1dDCQlzZXR6YmFyOiBXYWZmZW5rbGFzc2UgPT0gQW5ncmlmZnNzdGFlcmtlCisJUF9XRUFQT05fVFlQRQlzZXR6YmFyOiBXYWZmZW50eXAKKwlQX0RBTV9UWVBFCXNldHpiYXI6IFNjaGFkZW5zdHlwZW4KKwlQX05SX0hBTkRTCXNldHpiYXI6IEFuemFobCBiZW5vZXRpZ3RlciBIYWVuZGUKKworICAgICBCZXNvbmRlcmUgQXR0cmlidXRlIHVuZCBBbmZvcmRlcnVuZ2VuIGZ1ZXIgVHJhZWdlcjoKKwlQX1JFU1RSSUNUSU9OUwlzZXR6YmFyOiBBbmZvcmRlcnVuZ2VuIGFuIFRyYWVnZXIKKwlQX01fQVRUUl9NT0QJc2V0emJhcjogQXR0cmlidXRtb2RpZmlrYXRvciBmdWVyIFRyYWVnZXIKKwlQX0NVUlNFRAlzZXR6YmFyOiBWZXJmbHVjaHVuZyAobmljaHQgd2Vnc3RlY2tiYXIpCisJUF9QQVJSWQkJc2V0emJhcjogUGFyaWVyd2FmZmUgPworCVBfQUMJCXNldHpiYXI6IFNjaHV0emZha3RvciBlaW5lciBQYXJpZXJ3YWZmZQorCisgICAgIE1lbGR1bmdlbiB1bmQgWmVpdHB1bmt0ZToKKwlQX0VRVUlQX1RJTUUJZW50aGFlbHQgZGVuIFplaXRwdW5rdCBkZXMgQW56aWVoZW5zCisJUF9MQVNUX1VTRQllbnRoYWVsdCBkZW4gWmVpdHB1bmt0IGRlcyBsZXR6dGVuIEFuZ3JpZmZzIGRhbWl0CisJUF9XSUVMREVECWVudGhhZWx0IGRlbiBUcmFlZ2VyCisJUF9XSUVMRF9NU0cJc2V0emJhcjogZWlnZW5lIFp1ZWNrbWVsZHVuZworCVBfVU5XSUVMRF9NU0cJc2V0emJhcjogZWlnZW5lIFdlZ3N0ZWNrbWVsZHVuZworCisgICAgIER5bmFtaXNjaGVzIFZlcmhhbHRlbiBpbiBLYW1wZiB1bmQgYmVpbSBBbnppZWhlbjoKKwlQX1dJRUxEX0ZVTkMJc2V0emJhcjogT2JqZWt0IG1pdCBadWVja2Z1bmt0aW9uICJXaWVsZEZ1bmMoKSIKKwlQX1VOV0lFTERfRlVOQwlzZXR6YmFyOiBPYmpla3QgbWl0IFdlZ3N0ZWNrZnVua3Rpb24gIlVud2llbGRGdW5jKCkiCisJUF9ISVRfRlVOQwlzZXR6YmFyOiBPYmpla3QgbWl0IEFuZ3JpZmZzZnVua3Rpb24gIkhpdEZ1bmMoKSIKKworICAgICBadXNhZXR6bGljaGUgRWlnZW5zY2hhZnRlbjoKKwlQX0RBTUFHRUQJZW50aGFlbHQgZGVuIEF1c21hc3MgZGVzIFNjaGFkZW5zIGFuIFdhZmZlCisJUF9RVUFMSVRZCXNldHpiYXI6IFF1YWxpdOR0L0hhbHRiYXJrZWl0IGRlciBXYWZmZQorCVBfRUZGRUNUSVZFX0FDCXNldHpiYXI6IGZhbGxzIEhpdEZ1bmMgV0MgbmljaHQgc2ljaGJhciBhZW5kZXJ0CisJUF9FRkZFQ1RJVkVfV0MJc2V0emJhcjogZmFsbHMgUGFyaWVyZW4gQUMgbmljaHQgc2ljaGJhciBhZW5kZXJ0CisKKyAgICAgWnVzYWV0emxpY2ggc2luZCBhbGxlIFByb3BlcnRpZXMgYXVzIC9zdGQvdGhpbmcgdmVyZnVlZ2JhciwgYWxzbworICAgICBiaXR0ZSBhdWNoIGZvbGdlbmRlIHNldHplbjoKKwlQX01BVEVSSUFMCXNldHpiYXI6IFp1c2FtbWVuc2V0enVuZworCVBfU0laRQkJc2V0emJhcjogR3JvZXNzZQorCVBfV0VJR0hUCXNldHpiYXI6IEdld2ljaHQKKworIE1BS1JPUzoKKyAgICAgR3VlbHRpZ2UgV2FmZmVuLSB1bmQgU2NoYWRlbnN0eXBlbiAoZGVmaW5pZXJ0IGluICIvc3lzL2NvbWJhdC5oIikuCisKKyBCRVNDSFJFSUJVTkc6CisgICAgIEJhc2lza2xhc3NlIGZ1ZXIgYWxsZSBXYWZmZW4gaW0gU3BpZWwuIFNpZSBpc3Qgdm9uIC9zdGQvdGhpbmcKKyAgICAgYWJnZWxlaXRldCB1bmQgZW50aGFlbHQgYWxsZSB6dXNhZXR6bGljaGUgRnVua3Rpb25hbGl0YWV0CisgICAgIGZ1ZXIgZGVuIEthbXBmLgorCisgICAgIFZvciBkZXIgUHJvZ3JhbW1pZXJ1bmcgdm9uIFdhZmZlbiBzb2xsdGUgL2RvYy93aXovd2FmZmVuCisgICAgIGdlbGVzZW4gd2VyZGVuLiBEaWUgUmVnZWxuIGRhcmluIHNpbmQgdmVyYmluZGxpY2ggdW5kIHNvbGx0ZW4gbnVyCisgICAgIGluIEF1c25haG1lZmFlbGxlbiB1bmQgbWl0IEFic3ByYWNoZSBtaXQgZGVtIEVyem1hZ2llciBmdWVyIAorICAgICBXYWZmZW4vUnVlc3R1bmdlbi9Nb25zdGVyIHVlYmVyc2Nocml0dGVuIHdlcmRlbi4KKworIFZFUkVSQlVOR1NCQVVNOgorICAgICBbL3N0ZC93ZWFwb25dCisgICAgIC4uLi4uIFsvc3RkL3RoaW5nL3Byb3BlcnRpZXNdCisgICAgIC4uLi4uIFsvc3RkL3RoaW5nL2xhbmd1YWdlXQorICAgICAuLi4uLiBbL3N0ZC90aGluZy9jb21tYW5kc10KKyAgICAgLi4uLi4gWy9zdGQvdGhpbmcvcmVzdHJpY3Rpb25zXQorICAgICAuLi4uLiBbL3N0ZC93ZWFwb24vbW92aW5nXQorICAgICAuLi4uLi4uLi4uIFsvc3RkL3RoaW5nL21vdmluZ10KKyAgICAgLi4uLi4gWy9zdGQvd2VhcG9uL2Rlc2NyaXB0aW9uXQorICAgICAuLi4uLi4uLi4uIFsvc3RkL3RoaW5nL2Rlc2NyaXB0aW9uXQorICAgICAuLi4uLiBbL3N0ZC93ZWFwb24vY29tYmF0XQorCisKKyBTSUVIRSBBVUNIOgorICAgICBQX1dFQVBPTiwgUF9QQVJSWV9XRUFQT04sIFBfVE9UQUxfV0MsIFBfVE9UQUxfQUMsIFBfVU5XSUVMRF9USU1FCisgICAgIEF0dGFjaygpLCBEZWZlbmQoKSwgL2RvYy93aXovd2FmZmVuCisKKyAyMCBNYWVyeiAyMDA0IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2Mvd2l6Ly5yZWFkbWUgYi9kb2Mvd2l6Ly5yZWFkbWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBkMDQ5YwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93aXovLnJlYWRtZQpAQCAtMCwwICsxLDIgQEAKK0hpZXIgc2luZCBhbGxnZW1laW5lIFRoZW1lbiB1bmQgUmVnZWx1bmdlbiBmdWVyIE1hZ2llciBiZXNjaHJpZWJlbi4KKwpkaWZmIC0tZ2l0IGEvZG9jL3dpei8uc3lub255bSBiL2RvYy93aXovLnN5bm9ueW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM5NTIzZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93aXovLnN5bm9ueW0KQEAgLTAsMCArMSwxNyBAQAorc3BvbnNvciBiZWZvZXJkZXJ1bmdlbgorc3BvbnNvcmluZyBiZWZvZXJkZXJ1bmdlbgorYmVmb2VyZGVydW5nIGJlZm9lcmRlcnVuZ2VuCitucGMgbnBjcworbWF0ZXJpYWxpZW4gbWF0ZXJpYWwKK2ZsdWVjaGUgZ2lmdAorZmx1Y2ggZ2lmdAorZ2lmdGUgZ2lmdAordmVyZ2lmdHVuZyBnaWZ0CitrcmFua2hlaXQgZ2lmdAora3JhbmtoZWl0ZW4gZ2lmdAorYXJtb3VyIHJ1ZXN0dW5nZW4KK2FybW91cnMgcnVlc3R1bmdlbgorcnVlc3R1bmcgcnVlc3R1bmdlbgord2VhcG9uIHdhZmZlbgord2VhcG9ucyB3YWZmZW4KK3dhZmZlIHdhZmZlbgpkaWZmIC0tZ2l0IGEvZG9jL3dpei9hbmZhZW5nZXIgYi9kb2Mvd2l6L2FuZmFlbmdlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjQwOTA5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dpei9hbmZhZW5nZXIKQEAgLTAsMCArMSwxMTYgQEAKK0FuZmFlbmdlcmdlYmlldGUKKworVmllbGxlaWNodCBlcnVlYnJpZ3QgZXMgc2ljaCwgZWluZW4gbGFlbmdsaWNoZW4gTGVpdGZhZGVuIHp1IHNjaHJlaWJlbiwKK3dlaWwgZGllcyBlaWdlbnRsaWNoIEdlYmlldGUgd2llIHZpZWxlIGFuZGVyZSBzZWluIHNvbGx0ZW46CithdXNyZWljaGVuZCBiZXNjaHJpZWJlbiwgbG9naXNjaCBkdXJjaGRhY2h0LCBiYWxhbmNpZXJ0LCB3YXMgTlBDIHVuZAorT2JqZWt0ZSB3aWUgV2FmZmVuIHVuZCBSdWVzdHVuZ2VuIGJldHJpZmZ0LCBrdXJ6dW0sIGVzIG11c3MgU3Bhc3MgZnVlcgorU3BpZWxlciBtYWNoZW4uCisKK0VpbmlnZXMgdW50ZXJzY2hlaWRldCBhYmVyIGVpbiBzb2xjaGVzIEdlYmlldCB2b24gYW5kZXJlbiwgZGVubiB3aWUgZGVyCitOYW1lIHNjaG9uIHNhZ3QsIHNvbGx0ZSBtYW4gZG9ydCBlaGVyIGhhdXB0c2FlY2hsaWNoIEFuZmFlbmdlciAoZWlubWFsCit3aWxsa3VlcmxpY2ggYWxzIFNwaWVsc3R1ZmUgMS01IGJlemVpY2huZXQpIGVyd2FydGVuLgorCisxLiBFcnJlaWNoYmFya2VpdAorVmllbGUgQW5mYWVuZ2VyZ2ViaWV0ZSBiZWZpbmRlbiBzaWNoIG5hdHVlcmxpY2ggaW4gdW5taXR0ZWxiYXJlciBOYWVoZQorZWluZXIgUmFzc2UsIHouQi4gZGllIEhvY2hlYmVuZSBiZWkgZGVuIFp3ZXJnZW4sIGRlciBQYXJrIGRlciBGcmV1bmRlCitiZWkgZGVuIEVsZmVuIG9kZXIgZGVyIGtsZWluZSBEc2NodW5nZWwgaW0gTlcgdm9uIEthdHptYW5kdS4gSGllcmJlaQoraXN0IGRpZSBOYWVoZSBmdWVyIGVpbmUgUmFzc2UgZ2VnZWJlbiwgc28gZGFzcyB6dW1pbmRlc3QgZGllIGtsZWluZW4KK1NwaWVsZXIgZGllc2VyIFJhc3NlIGRhcyBHZWJpZXQgbGVpY2h0IGVycmVpY2hlbiBrb2VubmVuLiBOYXR1ZXJsaWNoCitpc3QgZXMgZnVlciBhbmRlcmUgUmFzc2VuIG5pY2h0IHVuYmVkaW5ndCBlaW5mYWNoLCBlaW5pZ2Ugd2VpdCBlbnRmZXJudAorZ2VsZWdlbmUgQW5mYWVuZ2VyZ2ViaWV0ZSB6dSBlcnJlaWNoZW4sIG9obmUgRHV0emVuZGUgdm9uIFJhZXVtZW4genUKK2R1cmNobGF1ZmVuLgorTWFuIGthbm4gYXVjaCBuaWNodCBzb2ZvcnQgZGF2b24gYXVzZ2VoZW4sIGRhc3Mgc2ljaCBlaW4gQW5mYWVuZ2VyIHZvbgorQW5mYW5nIGFuIGVpbmUgS2FydGUgZnVlciBXZWdlIGFubGVndC4gSW5zb2Zlcm4gaXN0IGVzIHNpbm52b2xsLCB3ZW5uCitlcyBBbmZhZW5nZXJnZWJpZXRlIGluIHVubWl0dGVsYmFyZXIgTmFlaGUgenUgZGVuIFN0YXJ0cHVua3RlbiBkZXIKK1Jhc3NlbiBnaWJ0LiBEaWUga29lbm5lbiBkYW5uIGVudHdlZGVyIHVudGVyIGRlbSBFYmVuZW5wZmFkIG9kZXIgYXVjaAordW50ZXIgL2QvYW5mYWVuZ2VyIHN0ZWhlbi4KK0FsbGdlbWVpbiB6dWdhZW5nbGljaGUgQW5mYWVuZ2VyZ2ViaWV0ZSBzb2xsdGVuIHp1bWluZGVzdCBvaG5lIGdyb3NzZW4KK0F1ZndhbmQgdm9tIFN0YXJ0cHVua3QgZGVyIFJhc3NlbiBhdXMgenUgZXJyZWljaGVuIHNlaW4uIERhcyBrb2VubnRlCitkdXJjaCBzcGV6aWVsbGUgSGlsZnNtaXR0ZWwgZ2VzY2hlaGVuLCBkdXJjaCBOUEMsIGRpZSBlaW5lbiBkZW4gV2VnCitkb3J0aGluIHdlaXNlbiAodmllbGxlaWNodCBkdXJjaCBVZWJlcmFyYmVpdHVuZyB2b24gYmVzdGVoZW5kZW4gRmlsZXMpCitvZGVyIGR1cmNoIHRlbGVwb3J0aWVyZW5kZSBPYmpla3RlLCBkaWUgbnVyIGZ1ZXIgQW5mYWVuZ2VyIGJlbnV0emJhcgorc2luZC4gWmllbCBpc3QgZXMgbmljaHQsIGRlbiBTcGllbGVybiBkYXMgTGF1ZmVuIHVuZCBzZWxic3RzdGFlbmRpZ2UKK0Vya3VuZGVuIGFienVuZWhtZW4sIHNvbmRlcm4gbnVyIGRpZSBHZWZhaHIsIHNpY2ggdWViZXIgbGFlbmdlcmUKK1N0cmVja2VuIGhpbiB6dSAidmVyZnJhbnNlbiIuCisKKzIuIEJla2FubnRoZWl0c2dyYWQKK0RpZXNlbSBQdW5rdCBzb2xsdGUgbWFuIGVpbiB3ZW5pZyBaZWl0IHdpZG1lbi4gQW0gZWluZmFjaHN0ZW4gaXN0IGRpZQorQmVrYW5udGhlaXQgenUgZXJyZWljaGVuLCB3ZW5uIGltIEdlYmlldCBlaW5lIFF1ZXN0IHNwaWVsdCwgZGEgZGFubgorZnJ1ZWhlciBvZGVyIHNwYWV0ZXIgendhbmdzbGFldWZpZyBlaW5lIEZyYWdlIGdlc3RlbGx0IHdpcmQuIElzdCBlcworZWluZSBNaW5pcXVlc3QsIGtvZW5udGUgZWluZSBFcmZvbGdzbWVsZHVuZyB1ZWJlciBkaWUgRWJlbmUgQW5mYWVuZ2VyCitmbGltbWVybiBzdGF0dCB1ZWJlciBkaWUgRWJlbmUgQWJlbnRldWVyLiBXZW5uIGVzIHBhc3N0LCBrb2VubnRlbgorYXVjaCBkaXZlcnNlIE5QQyBtaXQgSW5mb3JtYXRpb25lbiB2ZXJzb3JndCB3ZXJkZW4sIG9kZXIgYW5kZXJlIE9iamVrdGUsCitkaWUgbWFuIGFuIHByb21pbmVudGVyIFN0ZWxsZSBwbGF6aWVydCAoTm90aXplbiwgQnVlY2hlciwgQXVmemVpY2hudW5nZW4KK29kZXIgYWVobmxpY2hlcykuCisKKzMuIE5QQworQXVjaCB3ZW5uIGVzIG51ciAia2xlaW5lIiBOUEMgc2luZCwga2FubiBtYW4gaW4gc2llIG1pbmRlc3RlbnMgc28gdmllbAorRW5lcmdpZSBmdWVyIEluZm9ybWF0aW9uZW4sIFZlcmhhbHRlbiB1bmQgRGV0YWlscyBzdGVja2VuIHdpZSBmdWVyCisiZ3Jvc3NlIi4gU2llIHNvbGx0ZW4ga2VpbmVzZmFsbHMgYWdncmVzc2l2IHNlaW4uIEhvaGVyIEJvZHkgKH4gPjcwKQorb2RlciBob2hlIEhhbmRzICh+ID4xMDApIHNpbmQgenUgdmVybWVpZGVuLCBkYSBtYW4gYWxzIEFuZmFlbmdlciBub2NoCitrZWluIEdlZnVlaGwgZGFmdWVyIGhhdCwgd2FzIGRpZSBTY2hhZGVuc21lbGR1bmdlbiAiaGFydCIsICJrcmFjaGVuZGUKK0tub2NoZW4iIG9kZXIgImtpdHplbHQgRGljaCIgaW4gZXR3YSBhbiBTY2hhZGVuIG1hY2hlbi4gRGVtZW50c3ByZWNoZW5kCit3YWVyZSBlcyBhdWNoIHNpbm52b2xsLCBkaWUgTlBDIHp1IHNjaHJlaWJlbi4gQmVkcm9obGljaCBhdXNzZWhlbmRlCitEcmFjaGVuLCBkaWUgaW1tZXIgdmVyZmVobGVuLCBzaW5kIGVpZ2VudGxpY2ggZWJlbnNvIHdlbmlnIHBsYXVzaWJlbAord2llIGtsZWluZSBBbWVpc2VuLCBkaWUgZWluZW4gbWl0IGRlciBTYWV1cmUgaW1tZXIgc2VociBoYXJ0IHRyZWZmZW4uCitJbSBad2VpZmVsIGVpbmZhY2ggZWluZW4gTHZsIDEgVGVzdHNwaWVsZXIgYW5sZWdlbiB1bmQgYXVzcHJvYmllcmVuLAorbWFsIGdhbnogb2huZSBXYWZmZSAod2llIGtvbW1lIGljaCBhbHMgIm5hY2t0ZXIiIE5ldWxpbmcgYW4gbWVpbmUgZXJzdGUKK1dhZmZlPyksIG1hbCBtaXQgZWluZXIgc2Nod2FjaGVuLCBtYWwgbWl0IGVpbmVyIGV0d2FzIGJlc3NlcmVuIFdhZmZlLgorQWxzIEF1c25haG1lIGRhcmYgaGllciBnZXJuZSBhdWNoIG1hbCBlaW4gZWlnZW50bGljaCBzY2h3YWNoZXIgTlBDCitLaWxsc3R1ZmVucHVua3RlIChLaWxsc3R1cHNlKSB2ZXJnZWJlbi4KKworNC4gQ2xlYW5pbmcgVXAKK0hvZmZlbnRsaWNoIGJlc3VjaGVuIGRhbm4gYXVjaCB2aWVsZSBkYXMgR2ViaWV0LiBFdmVudHVlbGwgZW1wZmllaGx0IGVzCitzaWNoIGRhbm4gKHdpZSBiZWkgdmllbGVuIGFuZGVyZW4gR2ViaWV0ZW4gYWJlciBhdWNoKSB6dSB1ZWJlcmxlZ2VuLAord2FzIHBhc3NpZXJ0LCB3ZW5uIGVpbmUgVW56YWhsIGdlc2NocmllYmVuZXIgT2JqZWt0ZSwgZGllIHZpZWxlIGRhbm4KK2RvY2ggbmljaHQgZ2VicmF1Y2hlbi9taXRuZWhtZW4sIGltIFJhdW0gaGVydW1saWVndC4gQmVpIFJ1ZXN0dW5nZW4gdW5kCitXYWZmZW4gc2luZCBkaWUgQXJndW1lbnRlIENMT05FX1dJRUxEIHVuZCBDTE9ORV9XRUFSIGluIGRlciBGdW5rdGlvbgorQWRkSXRlbSB2b3J0ZWlsaGFmdCwgYmVpIGFuZGVyZW4gT2JqZWt0ZW4ga29lbm50ZSBtYW4gaW4gZGVyZW4gUmVzZXQKK25hY2hzZWhlbiwgb2Igc2llIGxhZW5nZXJlIFplaXQgaW4gZWluZW0gUmF1bSBkZXMgR2ViaWV0cyBvZGVyIGltIEdlYmlldAorc2VsYnN0ICJoZXJ1bWdhbW1lbG4iLiBFcyBibGVpYnQgendhciB6dSBob2ZmZW4sIGRhc3Mgc2llIGlyZ2VuZHdhbm4KK2RlbSBBdXNzd2FwcGVuIGRlcyBSYXVtZXMgYW5oZWltZmFsbGVuLCBhYmVyIGVzIHNpZWh0IGltIGFsbGdlbWVpbmVuCituaWNodCBzY2hvZW4gYXVzLCB3ZW5uIE9iamVrdGUgb2RlciBnYXIgcXVlc3QtL21pbmlxdWVzdHJlbGV2YW50ZSBUZWlsZQorc2ljaCBpbiBlaW5lbSBvZGVyIG1laHJlcmVuIFJhZXVtZW4gc3RhcGVsbi4KKworNS4gWlRzCitTaWUgaGVsZmVuLCBkYXMgR2ViaWV0IGJla2FubnRlciB6dSBtYWNoZW4gKHNpZWhlIFB1bmt0IDIpLCBzb2xsdGVuCithYmVyIGVpbmZhY2ggenUgZmluZGVuIHNlaW4gKERldGFpbCwgZWluZmFjaGVyIEJlZmVobCkgdW5kIG5pY2h0IGdsZWljaAorZWluZSBnYW56ZSBNaW5pcXVlc3QgYmVpbmhhbHRlbi4KKworNi4gVW50ZXJzdHVldHp1bmcgdm9uIHdpY2h0aWdlbiBTdGFuZGFyZGl0ZW1zCitEYXp1IGdlaG9lcmVuIGltbWVyIG5vY2ggU2VpbCwgRmFja2VsIG9kZXIgU2NoYXVmZWwuIEV2ZW50dWVsbCBicmF1Y2h0CittYW4gc2llIGZ1ZXIgZGllIGVpbmUgb2RlciBhbmRlcmUgQXVmZ2FiZSwgaWhyZSBCZW51dHp1bmcgdW5kIGRpZSBkYW1pdAordmVyYnVuZGVuZSBTeW50YXggc29sbHRlIGRlbSBBbmZhZW5nZXIgZGFuYWNoIGdlbGFldWZpZyBzZWluLgorCis3LiBVbnRlcnN0dWV0enVuZyB2b24gd2VpdCB2ZXJicmVpdGV0ZW4gQmVmZWhsZW4KK0RhenUgemFlaGxlbiAib2VmZm5lIiwgIm5pbW0iLCAic3VjaGUvZHVyY2hzdWNoZSIsICJzY2hsaWVzc2UiLCBldGMuLAorYWxzbyBkYXMsIHdhcyBpbiB2aWVsZW4gUXVlc3RzIGF1Y2ggbWl0dW50ZXIgZ2VmcmFndCBpc3QuCisKKzguIFZpZWxmYWx0IGluIGRlbSwgd2FzIG1hbiAidHVuIiBrYW5uLCBlaW5mYWNoZSBVbXNldHp1bmcKK01hbiBrb2VubnRlIGRpZXNlbiBQdW5rdCBhdWNoIHVudGVyICJlaW5mYWNoZXIgQ29kZSBmdWVyIEFuZmFlbmdlciIKK3p1c2FtbWVuZmFzc2VuLCBkYXMgZ2luZ2UgYWJlciBtYW5jaG1hbCB6dSB3ZWl0LiBXaWNodGlnIGluIGRpZXNlbQorWnVzYW1tZW5oYW5nIGlzdCBhdWNoLCBkZW0gQW5mYWVuZ2VyIHNwaWVsZXJpc2NoIGltIFRleHQsIGR1cmNoIERldGFpbHMKK29kZXIgSW5mb3Mgdm9uIE5QQyBkaWUgU3ludGF4ZW4sIHdlbm4gc2llIGRlbm4gZWlubWFsIGFic2VpdHMgZGVyIHNvCit1ZWJsaWNoZW4gS29tbWFuZG9zIHNpbmQsIGVpbiB3ZW5pZyBpbiBkZW4gTXVuZCB6dSBsZWdlbjoKKyhTcGllbGVyIHdlaXNzLCBkYXNzIGluIGRpZXNlbSBSYXVtIGVpbiBaVCBmdWVyIGlobiBpc3QsIGVzIGhhdCB3YXMgbWl0CitkZW0gQmF1bSB6dSB0dW4sIHZvciBkZW0gZXIgc3RlaHQpCisidW50IGJhdW0iIC0+CisiRGVyIEJhdW0gaXN0IHJlY2h0IGJlZWluZHJ1Y2tlbmQgdW5kIGhvY2guIERlbm5vY2gga29lbm50ZXN0IER1IG9obmUKKyB3ZWl0ZXJlcyBhdWYgaWhuIGtsZXR0ZXJuLiIgLT4KKyJrbGV0dGVyIGF1ZiBiYXVtL2JhdW0gaG9jaCIgLT4KK0VyZm9sZworCis5LiBCZWxvaG51bmdlbgorU2llIGR1ZXJmZW4gcnVoaWcgZ3Jvc3N6dWVnaWcgc2VpbjogWlRzIChaYXViZXJ0cmFlbmtlKSwgRlAgKEZvcnNjaGVyLQorcHVua3RlKSwgRUsgKEVyc3RraWxscy9LaWxsc3R1cHNlKSwgQVAgKEFiZW50ZXVlcnB1bmt0ZS9RdWVzdHB1bmt0ZSkKK3VuZCBNUVAgKE1pbmlxdWVzdHB1bmt0ZSkgc2luZCB3b2hsIGRvc2llcnQgdW5kIGFid2VjaHNsdW5nc3JlaWNoIHp1Cit2ZXJ0ZWlsZW4gdW5kIHNvbGxlbiBkZW0gU3BpZWxlciBoZWxmZW4sIGRlbiBhbmZhbmdzIGxhbmdlbiBXZWcgYmlzCit6dW0gbmFlY2hzdGVuIExldmVsIHp1IHZlcmt1ZXJ6ZW4uCisKK1dpZSB1ZWJlcmhhdXB0IGhpbGZ0IGVpbmUgZ3V0ZSBEb2t1bWVudGF0aW9uIGF1Y2ggZWluZW0gQW5mYWVuZ2VyIHVudGVyCitkZW4gTWFnaWVybiwgc2VsYnN0IHNjaG5lbGwgZWluZSBlaWdlbmUgUmVmZXJlbnpzYW1tbHVuZyBmdWVyIGVpbmZhY2hlCitEaW5nZSBpbiBMUEMgenUgZXJzdGVsbGVuLiBNYW4ga29lbm50ZSBhbHNvIHNhZ2VuLCB3aWUgZGVyIFNwaWVsZXIgaW0KK0FuZmFlbmdlcmdlYmlldCB3YWVjaHN0IGF1Y2ggZGVyIE1hZ2llciwgZGVyIGVzIGdlc2NocmllYmVuIGhhdC4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFR1ZSBNYXIgMjEgMDE6NDY6MzUgMjAwNiBieSBBcmsKZGlmZiAtLWdpdCBhL2RvYy93aXovYW5ncmlmZiBiL2RvYy93aXovYW5ncmlmZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWVlN2I4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dpei9hbmdyaWZmCkBAIC0wLDAgKzEsMTggQEAKKy0tLS0tLS0tQW5ncmVpZmVyCitBdHRhY2soKQorCUhvbHQgZGllIFdhZmZlIGRlcyBTcGllbGVycy4KKwlCZXJlY2huZXQgZGVuIEFuZ3JpZmZzdHlwIHVuZCBnaWJ0IGRpZQorCUFuZ3JpZmZzbWVsZHVuZyBhdXMuCisKKwlBdWZydWYgdm9uOgorCistLS0tLS0tLVZlcnRlaWRpZ2VyICAgICAKK0RlZmVuZCggaHAsIHR5cCApCisJR2lidCBkaWUgVmVydGVpZGlndW5nc21lbGR1bmcgYXVzLgorCUJlcmVjaG5ldCBkaWUgQW56YWhsIGRlciBIUCBkaWUgYWJnZXpvZ2VuIHdpcmQuCisKKwlBdWZydWYgdm9uOgorCitkb19kYW1hZ2UoIGhwICkKKworCUJlcmVjaG5lbiBkZXIgSFAuIEdlZ2ViZW5lbmZhbGxzIHN0ZXJiZW4gZXRjLgpkaWZmIC0tZ2l0IGEvZG9jL3dpei9hcnRpbGxlcmllIGIvZG9jL3dpei9hcnRpbGxlcmllCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0OWNlYzQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd2l6L2FydGlsbGVyaWUKQEAgLTAsMCArMSw2MSBAQAorUmVnZWxuIGZ1ZXIgQXJ0aWxsZXJpZS1PYmpla3RlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworMS4gRGVmaW5pdGlvbiB2b24gQXJ0aWxsZXJpZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitVbnRlciBkZW0gQmVncmlmZiAiQXJ0aWxsZXJpZSIgZmFzc3QgbWFuIGFsbGUgT2JqZWt0ZSB6dXNhbW1lbiwgZGllCit6dXNhZXR6bGljaCB6dSBkZW4gdm9yaGFuZGVuZW4gR2lsZGVuZmFlaGlna2VpdGVuIGR1cmNoIGVpbiB2b20KK1NwaWVsZXIgaW5pdGlpZXJ0ZXMgS29tbWFuZG8gZGlyZWt0IFNjaGFkZW4gYW4gZWluZW0gb2RlciBtZWhyZXJlbgorR2VnbmVybiB2ZXJ1cnNhY2hlbi4KKworV2FmZmVuIHVuZCBSdWVzdHVuZ2VuLCB3ZWxjaGUgcGVyIEtvbW1hbmRvIFNjaGFkZW4gdmVydXJzYWNoZW4gKHouIEIuCitFaXNzdGFiLCBSaW5nIHZvbSBTY2hsYW1tZHJhY2hlbiksIGZhbGxlbiB1bnRlciBkaWVzZQorRGVmaW5pdGlvbi4gV2FmZmVuIHVuZCBSdWVzdHVuZ2VuLCBkaWUgInZvbiBzaWNoIGF1cyIgKHVlYmxpY2hlcndlaXNlCitwZXIgSGl0LS9EZWZlbmRGdW5jKSBTY2hhZGVuIHZlcnVyc2FjaGVuICh6LiBCLiBUb2Rlc2RyYWNoZW5wYW56ZXIsCitHb2JsaW5yaW5nKSwgZmFsbGVuIG5pY2h0IHVudGVyIGRpZXNlIERlZmluaXRpb24sIHNpbmQgYWJlciBuYXR1ZXJsaWNoCituYWNoIHdpZSB2b3IgZ2VuZWhtaWd1bmdzcGZsaWNodGlnLgorCisyLiBCYXNpc2FuZm9yZGVydW5nZW4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIAorU29sY2hlIEFydGlsbGVyaWUgbXVzcyBmb2xnZW5kZW4gQW5mb3JkZXJ1bmdlbiBnZW51ZWdlbjoKKworIGEuIEFydGlsbGVyaWUgX211c3NfIFBfQVRUQUNLX0JVU1kgYmVhY2h0ZW4gKHNldHplbi9hYmZyYWdlbikuCisgYi4gQXJ0aWxsZXJpZSBfbXVzc18gYmVpIFZlcndlbmR1bmcgS29uemVudHJhdGlvbnNwdW5rdGUgCisgICAgdmVyYnJhdWNoZW4uCisgYy4gQXJ0aWxsZXJpZSBkYXJmIG5pY2h0IChiencuIG51ciBiZWdyZW56dCkgZ2Vob3J0ZXQgd2VyZGVuCisgICAga29lbm5lbi4KKyBkLiBBcnRpbGxlcmllIGRhcmYgYmVpIFBhcmFseXNlIG5pY2h0IGFuZ2V3ZW5kZXQgd2VyZGVuIGtvZW5uZW4KKyAgICAoUF9ESVNBQkxFX0FUVEFDSykuCisgZS4gQXJ0aWxsZXJpZSBtdXNzIGR1cmNoIFNldHplbiBkZXIgUHJvcGVydHkgUF9JU19BUlRJTExFUlkgCisgICAgZ2VrZW5uemVpY2huZXQgc2Vpbi4gCisgZi4gQXJ0aWxsZXJpZSwgZGllIE11bml0aW9uIGJlbnV0enQgb2RlciBzZWxic3QgTXVuaXRpb24gaXN0ICh3aWUgei5CLgorICAgIFd1cmZzdGVybmUpLCBtdXNzIGRhcyBVbml0b2JqZWt0IHVuZCBkZW4gZG9ydGlnZW4gTWVjaGFuaXNtdXMgenVtCisgICAgWmVyZmFsbCB2b24gT2JqZWt0ZW4gbnV0emVuLiBEYWJlaSBzaW5kIFBfVU5JVF9ERUNBWV9JTlRFUlZBTCB1bmQKKyAgICBQX1VOSVRfREVDQVlfUVVPVEEgc28genUgc2V0emVuLCBkYXNzIGRpZSBNdW5pdGlvbiBlaW5lIEhhbGJ3ZXJ0c3plaXQKKyAgICB6d2lzY2hlbiA1IHVuZCAxMCAgVGFnZW4gaGF0LCBkZXIgaWhyZXIgVmVyZnVlZ2JhcmtlaXQgYW5nZW1lc3NlbgorICAgIGlzdC4gRGllcyBsYWVzc3Qgc2ljaCBkdXJjaCBnZWVpZ25ldGVzIEVpbnN0ZWxsZW4gZGVzCisgICAgUHJvemVudHNhdHplcyB1bmQvb2RlciBkZXIgUmVzZXR6ZWl0IGVycmVpY2hlbi4KKworICAgIEJlaXNwaWVsZToKKyAgICBTZXR6dCBtYW4gcD0xJSBaZXJmYWxsIHBybyBSZXNldCBhbiwgZGFubiBtdXNzIGRlciBSZXNldAorICAgIGZ1ZXIgZWluZSBIYWxid2VydHN6ZWl0IHZvbiA1IFRhZ2VuIGRhbm4gCisgICAgdD1sbigwLjUpL2xuKDAsOTkpKjUqMjQqMzYwMCBzIGRhdWVybiwgZGFzIHNpbmQgNjIyNCBzLgorCisgICAgTW9lY2h0ZSBtYW4gbGllYmVyIGRlbiBub3JtYWxlbiBSZXNldCwgZGVyIGltIE1pdHRlbCA0NSBtaW4sIGQuaC4gMTYwCisgICAgUmVzZXRzIGluIDUgVGFnZW4gYmV0cmFlZ3QsIHNvIGVyaGFlbHQgbWFuIGZvbGdlbmRlbiBQcm96ZW50c2F0ejoKKyAgICBwID0gMS0wLDVeKDEvMTYwKSBkLmguIGNhLiAwLDQzJS4KKworRGV0YWlscyB3ZXJkZW4gZmFsbHdlaXNlIGVudHNjaGllZGVuLgorCisKKzMuIElua3JhZnRyZXRlbgorLS0tLS0tLS0tLS0tLS0tCisKK0RpZXNlIFJlZ2VsbiB0cmV0ZW4gYW0gNS4gQXVndXN0IDIwMDMgaW4gS3JhZnQuCitSZXZpc2lvbiBhbSA1LiBBcHJpbCAyMDA4CitSZXZpc2lvbiBhbSA3LiBBcHJpbCAyMDExCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMZXR6dGUgQWVuZGVydW5nOiBTYW0sICA3LiBBcHJpbCAyMDExIHZvbiBIdW1uaQpkaWZmIC0tZ2l0IGEvZG9jL3dpei9hdXRvbG9hZCBiL2RvYy93aXovYXV0b2xvYWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNjZDQ0NAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93aXovYXV0b2xvYWQKQEAgLTAsMCArMSwzMiBAQAorQVVUT19MT0FESU5HOgorCVJ1bWF0YSAyNi4wOC45MgorCisJREVSIE5FVUUgQVVUT0xPQUQtTUVDSEFOSVNNVVMKKworRlVOS1RJT05FTjoKKwl2b2lkIFNldFByb3AoIFBfQVVUT0xPQURPQkosIG1peGVkIHdlcnQgKTsKKwltaXhlZCBRdWVyeVByb3AoIFBfQVVUT0xPQURPQkogKTsKKworRVJMQUVVVEVSVU5HOgorCUVzIGdpYnQgamV0enQgZWluZSBQcm9wZXJ0eSBQX0FVVE9MT0FET0JKLCBkaWUgamVkZXMgT2JqZWt0CisJc2V0emVuIGthbm4uIElzdCBkZXIgV2VydCBkaWVzZXIgUHJvcGVydHkgbmljaHQgMCwgc28gZ2lsdAorCWRhcyBPYmpla3QgYWxzIEF1dG9sb2FkaW5nLU9iamVrdC4gCisJV0lDSFRJRzogQXVjaCBXZXJ0ZSB3aWUgIiIgb2RlciAoeyB9KSBzaW5kIG5pY2h0IDAuCisKKwlNaXQgZGVyIEZ1bmt0aW9uIFF1ZXJ5UHJvcCggUF9BVVRPTE9BRE9CSiApIGthbm4gZGllc2VyIFdlcnQKKwlhYmdlZnJhZ3Qgd2VyZGVuLgorCitCRU1FUktVTkdFTjoKKwlEaWUgUHJvcGVydHkgUF9BVVRPTE9BRE9CSiBzb2xsdGUgbmljaHQgbWl0IGRlcgorCVByb3BlcnR5IFBfQVVUT19MT0FEIHZlcndlY2hzZWx0IHdlcmRlbi4gRGllc2Ugc3BlaWNoZXJ0CisJZGllIEF1dG9sb2FkLUluZm9ybWF0aW9uZW4gaW0gU3BpZWxlci4KKworCURpZSBQcm9wZXJ0eSBQX0FVVE9MT0FET0JKIGthbm4gc2VsYnN0dmVyc3RhZW5kbGljaCBhdWNoIGFscworCUJ1aWx0LWluLVByb3BlcnR5IGltcGxlbWVudGllcnQgd2VyZGVuLgorCitCRUlTUElFTDoKKwlFaW4gZWluZmFjaGVzIEJlaXNwaWVsIHN0ZWh0IGluICoqKgorCUVpbiBsZWlzdHVuZ3NmYWVoaWdlcyBCZWlzcGllbCBzdGVodCBpbiAvb2JqL3Rvb2xzL211c2NoZWwuYworCitTSUVIRSBBVUNIOgorCSJkb2MvTUcvcHJvcGVydGllcyIKZGlmZiAtLWdpdCBhL2RvYy93aXovYmFsYW5jZSBiL2RvYy93aXovYmFsYW5jZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmVhMDUwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dpei9iYWxhbmNlCkBAIC0wLDAgKzEsNzggQEAKK0JldXJ0ZWlsdW5nIHVuZCBHZW5laG1pZ3VuZyB2b24gV2FmZmVuIHVuZCBSdWVzdHVuZ2VuIGltIE1HCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgCisgICAgV2FzIGJlZGV1dGV0IEJhbGFuY2UgaW0gTW9yZ2VuZ3JhdWVuPyBEaWUgQmFsYW5jZSAoYnp3LiBpaHIgRmVobGVuKQorICAgIHdpcmQgdm9yIGFsbGVtIGRhbm4gd2Focmdlbm9tbWVuLCB3ZW5uIFNwaWVsZXIgc2ljaCBnZWxhbmd3ZWlsdCBkdXJjaAorICAgIEdlYmlldGUgemFwcGVuLCBkaWUgdm9yIHp3ZWkgb2RlciBkcmVpIEphaHJlbiBub2NoIGFscyBhbnNwcnVjaHN2b2xsCisgICAgZ2FsdGVuLCBvZGVyIHdlbm4gZWluIE1hZ2llciBmZXN0c3RlbGxlbiBtdXNzLCBkYXNzIHNlaW4gc2Nob2VuZXMgCisgICAgUmllc2VubW9uc3RlciBuaWNodG1hbCBkYXp1IGtvbW10LCBzZWluZSBhdXNnZWZlaWx0ZW4gWmF1YmVyc3BydWVjaGUKKyAgICBhbnp1d2VuZGVuLCB3ZWlsIGVzIG5hY2ggZHVyY2hzY2huaXR0bGljaCB6d2VpZWluaGFsYiBSdW5kZW4gc2Nob24KKyAgICB0b3QgaXN0LiBGZWhsZW50d2lja2x1bmdlbiBkaWVzZXIgQXJ0IHp1IHZlcmhpbmRlcm4gaXN0IEF1ZmdhYmUgZGVyIAorICAgIEJhbGFuY2UuIFNpZSBzdGVsbHQgdW5pdmVyc2VsbGUgR3Jlbnp3ZXJ0ZSB1bmQgTWFzc3RhZWJlLCBkaWUgYWxzCisgICAgZ2VtZWluc2FtZXIgTmVubmVyIGZ1ZXIgYWxsZSBNYWdpZXIgaW4gZGllc2VtIE11ZCBlaW5lIGdld2lzc2UgCisgICAgQXVzZ2V3b2dlbmhlaXQgZ2FyYW50aWVyZW4uIEFuaGFuZCBkaWVzZXIgV2VydGUga2FubiBqZWRlciBNYWdpZXIgYXVmCisgICAgZGVyIGVpbmVuIFNlaXRlIGVpbnNjaGFldHplbiwgd2llIGJlZ2VocnQgZWluIG5ldWVzIE9iamVrdCBzZWluIHdpcmQsCisgICAgdW5kIGF1ZiBkZXIgYW5kZXJlbiB3ZWlzcyBlciB1bmdlZmFlaHIsIHdhcyBhdWYgc2VpbmUgYXJtZW4gTW9uc3RlcgorICAgIHp1a29tbWVuIHdpcmQsIHdlbm4gU3BpZWxlciBtaXQgZGVuIE9iamVrdGVuIGFuZGVyZXIgTWFnaWVyIGFuZ3JlaWZlbi4KKyAgICAKKyAgICBEaWVzZSBBdWZnYWJlIHp1IGJld2FlbHRpZ2VuIGthbm4gamVkb2NoIGluIGVpbmVtIHNvIHJpZXNpZ2VuIE11ZCBrZWluZSAKKyAgICBJbnN0YW56IGFsbGVpbiBsZWlzdGVuLiBFaW4gZ3Jvc3NlIFZlcmFudHdvcnR1bmcgbGFzdGV0IGF1Y2ggYXVmIGRlbiAKKyAgICBSZWdpb25zbWFnaWVybiwgZGllIGlubmVyaGFsYiBpaHJlcyBWZXJhbnR3b3J0dW5nc2JlcmVpY2hzIGRhZnVlciBTb3JnZQorICAgIHRyYWdlbiBzb2xsdGVuLCBkYXNzIGF1c3Nlcmdld29laG5saWNoZSBPYmpla3RlIGluIEdlYmlldGVuIG5pY2h0IHp1CisgICAgZ2VoYWV1ZnQgYXVmdHJldGVuIHVuZCBuaWNodCB6dSBsZWljaHQgenUgZXJyZWljaGVuIHNpbmQuCisKKyAgICBXaWUgbGFldWZ0IG51biBlaW5lIEdlbmVobWlndW5nIGR1cmNoIGRpZSBCYWxhbmNlIGFiPyAKKyAgICBadWFsbGVyZXJzdCBzb2xsdGUgc2ljaCBlaW4gTWFnaWVyIHVlYmVyIGRlbiBha3R1ZWxsZW4gU3RhbmQgZGVyIEJhbGFuY2UtCisgICAgcmVnZWxuIGluZm9ybWllcmVuLiBadW0gZWluZW4gd2Vpc3MgZXIgZGFubiBzb2ZvcnQsIHdlbGNoZSBJZGVlbiBvaG5laGluCisgICAga2VpbmUgQ2hhbmNlIGF1ZiBHZW5laG1pZ3VuZyBoYWJlbiwgenVtIGFuZGVyZW4gaW5zcGlyaWVyZW4gdmllbGxlaWNodCAKKyAgICBzb2dhciBkaWUgemFobHJlaWNoZW4gSGlud2Vpc2UgdW5kIHRlY2huaXNjaGVuIERldGFpbHMgZGFzIGVpbiBvZGVyIAorICAgIGFuZGVyZSBPYmpla3QuIEFscyBuYWVjaHN0ZXMgc3RlaHQgZWluZSBrcml0aXNjaGUgUHJ1ZWZ1bmcgZGVyIGVpZ2VuZW4KKyAgICBJZGVlbiBhbi4gQnJhdWNodCBkYXMgTXVkIHdpcmtsaWNoIGRlbiAxMzIuIFBhbnplciwgZGVyIGdlZ2VuIEZldWVyCisgICAgc2NodWV0enQ/IEdpYnQgZXMgbmljaHQgaXJnZW5kd28gb2huZWhpbiBzY2hvbiBlaW5lIFdhZmZlIGRpZXNlcyBUeXBzCisgICAgbWl0IGZhc3QgaWRlbnRpc2NoZW4gV2VydGVuPyBBZGRpZXJ0IHNpY2ggZGllIFdpcmt1bmcgZWluZXMgZ2VwbGFudGVuCisgICAgS2FtcGZvYmpla3RzIHZpZWxsZWljaHQgaXJnZW5kd2llIG1pdCB2b3JoYW5kZW5lbiBPYmpla3Rlbj8gRGllc2UgdW5kCisgICAgYWVobmxpY2hlIEZyYWdlbiBmcnVlaCB6dSBrbGFlcmVuIGthbm4gc3BhZXRlciB2aWVsIEZydXN0IHZlcm1laWRlbi4gRGFzCisgICAgQmFsYW5jZXRlYW0ga2FubiBhdWNoIHp1IGRpZXNlbSBaZWl0cHVua3Qgc2Nob24gZWluIEFuc3ByZWNocGFydG5lciBzZWluLAorICAgIGRhIHNlaW5lIE1pdGdsaWVkZXIgZWluZW4gZ3V0ZW4gVWViZXJibGljayB1ZWJlciBkaWUgbWVpc3RlbiBoZXJhdXMtCisgICAgcmFnZW5kZW4gT2JqZWt0ZSBpbSBNdWQgaGFiZW4gdW5kIGdlcm5lIGFscyBCZXJhdGVyIHp1ciBWZXJmdWVndW5nIAorICAgIHN0ZWhlbi4gRGllIE1hZ2llciBkZXMgVGVhbXMga29lbm5lbiBuYXR1ZXJsaWNoIGF1Y2ggenUgcHJvZ3JhbW1pZXItCisgICAgdGVjaG5pc2NoZW4gRnJhZ2VuIGRlbiBlaW5lbiBvZGVyIGFuZGVyZW4gVGlwIGdlYmVuLgorCisgICAgU2luZCBkaWUgT2JqZWt0ZSBkYW5uIHByb2dyYW1taWVydCB1bmQgaXN0IGF1Y2ggZGVyIFJlZ2lvbnNtYWdpZXIgbWl0CisgICAgaWhuZW4gZWludmVyc3RhbmRlbiwgd2lyZCBzY2hsaWVzc2xpY2ggZGVyIEFudHJhZyBnZXN0ZWxsdC4gKFBlcgorICAgICJtYWlsIGJhbGFuY2UiKS4gRGVyIEFudHJhZyBzb2xsdGUgZm9sZ2VuZGVuIEluZm9ybWF0aW9uZW4gZW50aGFsdGVuOgorCisgICAgLSBOYW1lIGRlcyBPYmpla3RzCisgICAgLSBWb2xsc3RhZW5kaWdlciBGaWxlbmFtZQorICAgIC0gQWxsZSByZWxldmFudGVuIFdlcnRlOiBBQyBiencuIFdDLCBQX05SX0hBTkRTLCBHZXdpY2h0LCBXZXJ0LCAuLi4KKyAgICAtIERlZmVuZC9IaXRGdW5jcywgaW4gRm9ybSBlaW5lciBwcmFlemlzZW4gQmVzY2hyZWlidW5nIGRlciAKKyAgICAgIEZ1bmt0aW9uc3dlaXNlIHVuZCBkZXMgV2VydGViZXJlaWNocy4KKyAgICAtIEFsbGUgc29uc3RpZ2VuIEluZm9ybWF0aW9uZW4gdWViZXIgRWlnZW5zY2hhZnRlbiwgZGllIGRlbiBLYW1wZiAKKyAgICAgIGJlZWluZmx1c3NlbiBvZGVyIGRlbSBTcGllbGVyIHZvbiBOdXR6ZW4gc2luZAorICAgIC0gRnVuZG9ydCB1bmQgc3ViamVrdGl2ZSBFaW5zY2hhZXR6dW5nIGRlcyBBdWZ3YW5kcywgdW0gZGllc2VuIAorICAgICAgR2VnZW5zdGFuZCB6dSBlcmVpY2hlbi4KKworICAgIERpZSBHZW5laG1pZ3VuZyBlcmZvbGd0IGRhbm4gcGVyIG1haWwsIGVzIHNlaSBkZW5uIGVzIGdpYnQgYmVncnVlbmRldGUKKyAgICBFaW53YWVuZGUuIEluIGRpZXNlbSBGYWxsIGtvbW10IGRpZSBHZW5laG1pZ3VuZyBtaXQgbGVpY2h0IGdlYWVuZGVydGVuCisgICAgV2VydGVuIG9kZXIgc29nYXIgZWluZSBBYmxlaG51bmcuIEltIGxldHp0ZXJlbiBGYWxsIHN0ZWh0IGVzIGRlbSBNYWdpZXIKKyAgICBuYXR1ZXJsaWNoIGZyZWksIGRhcyBPYmpla3QgenUgdmVyYWVuZGVybiB1bmQgbmV1IHp1IGJlYW50cmFnZW4uCisgICAgTm9ybWFsZXJ3ZWlzZSBlcmdpYnQgc2ljaCBkYW5uIGF1Y2ggc2NobmVsbCBpbSBwZXJzb2VubGljaGVuIEdlc3ByYWVjaAorICAgIG1pdCBNaXRnbGllZGVybiBkZXIgQmFsYW5jZSwgd28gZGFzIFByb2JsZW0gZ2VuYXUgbGllZ3QgdW5kIHdlbGNoZSAKKyAgICBBbHRlcm5hdGl2ZW4gZXMgZ2lidC4gCisKKyAgICBBbnp1bWVya2VuIGJsZWlidCBub2NoLCBkYXNzIE9iamVrdGUsIGRpZSBuYWNoIGRlciBHZW5laG1pZ3VuZyBub2NoIGluCisgICAgaXJnZW5kZWluZXIgV2Vpc2UgcG9zaXRpdiB2ZXJhZW5kZXJ0IHdlcmRlbiwgbmF0dWVybGljaCBuZXUgZ2VuZWhtaWd0CisgICAgd2VyZGVuIG11ZXNzZW4uIEJlaSBrbGVpbmVyZW4gQWVuZGVydW5nZW4gKEdld2ljaHQgby5hZS4pIHJlaWNodAorICAgIHVudGVyIFVtc3RhZW5kZW4gZWluZSBpbmZvcm1lbGxlIEFuZnJhZ2UgYmVpbSBCYWxhbmNldGVhbS4KKworIFNJRUhFIEFVQ0gKKworICAgICBiYWxhbmNlYW50cmFnLCBydWVzdHVuZ2VuLCB3YWZmZW4sIGZlcm53YWZmZW4sIHVuaXF1ZXMsIG5wY3MsIG9iamVjdHMsCisgICAgIGF0dHJpYnV0c3ZlcmFlbmRlcnVuZ2VuLCByZXNpc3Rlbnplbiwga2FtcGZvYmpla3RlLCBncmVuendlcnRlLAorICAgICBuYWNodGVpbGUKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBMRVRaVEUgQUVOREVSVU5HOgorICAgIFNvbiwgMTguMTAuMjAwNSwgMTg6NTQ6MDAgdm9uIE1pcmlsCmRpZmYgLS1naXQgYS9kb2Mvd2l6L2JhbGFuY2VhbnRyYWcgYi9kb2Mvd2l6L2JhbGFuY2VhbnRyYWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEyNDY0MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93aXovYmFsYW5jZWFudHJhZwpAQCAtMCwwICsxLDEzMyBAQAorSGlsZmUgenUgQmFsYW5jZWFudHJhZWdlbgorPT09PT09PT09PT09PT09PT09PT09PT09PQorCitVbSBkaWUgQXJiZWl0IGRlciBCYWxhbmNlIHp1IGVybGVpY2h0ZXJuIHVuZCBkYW1pdCBkaWUgV2FydGV6ZWl0IGZ1ZXIgZGllCitNYWdpZXIgenUgdmVya3VlcnplbiwgZ2lidCBlcyBlaW5pZ2UgRGluZ2UgenUgYmVhY2h0ZW4uIERhcyBHYW56ZSBsaWVzdCBzaWNoCithdWYgZGVuIGVyc3RlbiBCbGljayBzZWhyIGJ1ZXJva3JhdGlzY2gsIGlzdCBlcyBhYmVyIG5pY2h0LiBEaWUgQW5sZWl0dW5nIHNvbGwKK251ciBzbyBhdXNmdWVocmxpY2ggd2llIG1vZWdsaWNoIHNlaW4sIHVtIE1pc3N2ZXJzdGFlbmRuaXNzZW4gdm9yenViZXVnZW4uCitadWVyc3QgZWlubWFsIGdpYnQgZXMgZ3J1bmRzYWV0emxpY2ggendlaSBBcnRlbiB2b24gQW50cmFlZ2VuOgorCisxLiBFaW5lIFZvcmFiYW5mcmFnZQorCitWaWVsZSBNYWdpZXIgc2NoZXVlbiBkaWUgQXJiZWl0LCBlaW4gT2JqZWt0IHp1IHByb2dyYW1taWVyZW4sIGRhcyBhbnNjaGxpZXNzZW5kCituaWNodCB2b24gZGVyIEJhbGFuY2UgZ2VuZWhtaWd0IHdpcmQuIERhcyBpc3QgdmVyc3RhZW5kbGljaCB1bmQgVm9yYWJhbmZyYWdlbgord2VyZGVuIG5pY2h0IG1pbmRlciBiZWFjaHRldCBhbHMga29ua3JldGUgQW50cmFlZ2UuIFRyb3R6ZGVtIHNvbGx0ZSBtYW4gc28gZWluZQorQW5mcmFnZSBzb3JnZmFlbHRpZyBmb3JtdWxpZXJlbi4gU2llIHNvbGx0ZSBkYXMgUHJvYmxlbSBrbGFyIHVtcmVpc3NlbiB1bmQKK21vZWdsaWNoc3QgZWluZGV1dGlnIHNlaW4uIEF1Y2ggZWluIEhpbndlaXMgZGFyYXVmLCB3byBkZXIgTWFnaWVyIFByb2JsZW1lIG1pdAorZGVyIEJhbGFuY2llcnVuZyBlcndhcnRldCB1bmQgaW4gd2VsY2hlbSBXZXJ0ZWJlcmVpY2ggZXZlbnR1ZWxsZSBaYWhsZW4KK2Vyd2FydGV0IHdlcmRlbiwgc29sbHRlIG5pY2h0IHZlcmdlc3NlbiB3ZXJkZW4uCisKK0VpbmUgQW50d29ydCBhdWYgZWluZSBWb3JhYmFuZnJhZ2UgaXN0IGFsbGVyZGluZ3Mga2VpbmUgR2VuZWhtaWd1bmcgZWluZXMKK09iamVrdHMuIEVzIGlzdCBsZWRpZ2xpY2ggYWxzIEluZm9ybWF0aW9uIHp1IHNlaGVuLCBvYiBkaWUgQmFsYW5jZW1pdGdsaWVkZXIgCitzbyBlaW4gT2JqZWt0IHVlYmVyaGF1cHQgZnVlciBnZW5laG1pZ3VuZ2ZhZWhpZyBoYWx0ZW4sIGdlZ2ViZW5lbmZhbGxzIG1pdAorYW5nZXBhc3N0ZW4gV2VydGVuIG9kZXIgbGVpY2h0IHZlcmFlbmRlcnRlbiBFaWdlbnNjaGFmdGVuLiBNaXQgZWluZXIgQW50d29ydAorYXVmIGVpbmUgVm9yYWJhbmZyYWdlIHdvbGxlbiB3aXIgZGVtIFd1bnNjaCBkZXIgTWFnaWVyIGVudHNwcmVjaGVuLCB6dQorZXJmYWhyZW4sIG9iIGVzIHNpY2ggbG9obnQsIEFyYmVpdCBpbiBkYXMgT2JqZWt0IHp1IGludmVzdGllcmVuLCBiaW5kZW5kIGlzdAorc28gZWluZSBBbnR3b3J0IGFsbGVyZGluZ3MgbmljaHQuCisKKzIuIEVpbiBBbnRyYWcKKworSGllciBnZWh0IGVzIHVtIGRpZSBGZXN0c2NocmVpYnVuZyBhbGxlciBrYW1wZnJlbGV2YW50ZW4gRWlnZW5zY2hhZnRlbiwKK3Ryb3R6ZGVtIHNvbGx0ZW4gYWxsZSBFaWdlbnNjaGFmdGVuLCBkaWUgRWluZmx1c3MgYXVmIGRhcyBTcGllbGdlc2NoZWhlbiBoYWJlbiwKK21pdCBhbmdlZ2ViZW4gd2VyZGVuLCBhdWNoIHdlbm4gZGllIE9iamVrdGJhbGFuY2UgbmljaHQgZGlyZWt0IGZ1ZXIgZGllc2UKK0VpZ2Vuc2NoYWZ0IHp1c3RhZW5kaWcgaXN0LiBFaW5lIFdhZmZlLCBkaWUgZGVuIFRyYWVnZXIgYWIgdW5kIHp1IGhlaWx0LAorbXVzcyBhdWNoIGJlaSBkZXIgSGVpbHVuZ3NiYWxhbmNlIGJlYW50cmFndCB3ZXJkZW4sIHRyb3R6ZGVtIGRhcmYgZGllc2UKK0VpZ2Vuc2NoYWZ0IG5pY2h0IHZvciBkZXIgT2JqZWt0YmFsYW5jZSB2ZXJzY2h3aWVnZW4gd2VyZGVuLiBBbGxlIFdlcnRlCitzb2xsdGVuIHRhYmVsbGFyaXNjaCBhdWZnZWZ1ZWhydCB3ZXJkZW4uIEVpbmUgVWViZXJzaWNodCwgdWViZXIgZGllIHZvbiBkZXIKK0JhbGFuY2UgYmVub2V0aWd0ZW4gV2VydGU6CisKK0t1cnpiZXNjaHJlaWJ1bmc6ICAgICAgICBQX1NIT1JUCitQZmFkYW5nYWJlOiAgICAgICAgICAgICAgbW9tZW50YW4gdW5kIG5hY2ggQW5zY2hsdXNzCitUeXAgZGVzIE9iamVrdDogICAgICAgICAgU2Nod2VydCwgSG9zZSwgUmluZy4uLgorV2FmZmVuL1J1ZXN0dW5nc2tsYXNzZTogIFBfV0MsIFBfQUMKK1NjaGFkZW5zYXJ0OiAgICAgICAgICAgICBQX0RBTV9UWVBFCitCZW5vZXRpZ3RlIEhhZW5kZTogICAgICAgUF9OUl9IQU5EUworV2VydDogICAgICAgICAgICAgICAgICAgIFBfVkFMVUUKK0dld2ljaHQ6ICAgICAgICAgICAgICAgICBQX1dFSUdIVAorSGl0RnVuYzogICAgICAgICAgICAgICAgIE1pdCBFcmxhZXV0ZXJ1bmcgZGVyIFVtc3RhZW5kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCZWdydWVuZHVuZyB1bmQgV2VydGUvV2FocnNjaGVpbmxpY2hrZWl0ZW4KK0FuZGVyZSBCb25pOiAgICAgICAgICAgICBLYWVtcGZlciwgWmF1YmVyZXIsIEhlaWx1bmdlbiwgUmVzaXN0ZW56ZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICBldnRsIG1pdCByb2xsZW5zcC4gQmVncnVlbmR1bmcKK1Jlc3RyaWt0aW9uZW46ICAgICAgICAgICBQX1JFU1RSSUNUSU9OUywgUGFyYWx5c2UsIFplaXRiZXNjaHJhZW5rdW5nZW4gCisKK0VpbmUgQmVncnVlbmR1bmcgc29sbHRlIGRpZSBFaWdlbnNjaGFmdCByb2xsZW5zcGllbHRlY2huaXNjaCBlaW5iZXR0ZW4gdW5kCituaWNodCBiZXNjaHJlaWJlbiwgd2FydW0gZGFzIE1HIGRpZXNlIEVpZ2Vuc2NoYWZ0IGluIGVpbmVtIE9iamVrdCB1bmJlZGluZ3QKK25vY2ggYnJhdWNodC4gV2VpdGVyaGluIHNvbGx0ZSBtYW4gZGllIEVycmVpY2hiYXJrZWl0IGt1cnogdW1yZWlzc2VuIHVuZCBkaWUKK0hhZXVmaWdrZWl0LCBtaXQgZGVyIGRhcyBPYmpla3QgYW4gU3BpZWxlciBnZWxhbmd0LiBBdWNoIGhpZXJiZWkgZ2lsdCwgZGFzcworbWFuIGRhcyBPYmpla3QgbW9lZ2xpY2hzdCBrdXJ6LCBhYmVyIGVpbmRldXRpZyBiZXNjaHJlaWJ0LgorCitEaWUgR2VuZWhtaWd1bmcgb2RlciBBYmxlaG51bmcgZWluZXMgQW50cmFncyBkdXJjaCBkaWUgT2JqZWt0YmFsYW5jZSBpc3QKK2JpbmRlbmQuIEVpZ2Vuc2NoYWZ0ZW4sIGRpZSBpbiBkZXIgQW50d29ydCBhdWZnZWZ1ZWhydCBzaW5kLCBzaW5kCitmZXN0Z2VzY2hyaWViZW4gdW5kIGJlZHVlcmZlbiBiZWkgQWVuZGVydW5nIGVpbmVzIE5ldWFudHJhZ2VzIChkYXMgZ2VodCBpbgorZGVyIFJlZ2VsIHJlY2h0IHNjaG5lbGwsIHdlbm4gZGVyIE1hZ2llciBuaWNodCBkYXMgT2JqZWt0IGtvbXBsZXR0IHVta3JlbXBlbHQpLgorU29sbHRlbiBuaWNodCBmZXN0Z2VzY2hyaWViZW5lIEVpZ2Vuc2NoYWZ0ZW4sIGRpZSBkYXMgU3BpZWxnZXNjaGVoZW4KK2JlZWluZmx1c3NlbiAoZGllIGVzIGVpZ2VudGxpY2ggbmljaHQgZ2ViZW4gc29sbHRlKSwgZ2VhZW5kZXJ0IHdlcmRlbiwgbXVzcyBkaWUKK0JhbGFuY2UgaW5mb3JtaWVydCB3ZXJkZW4uIEJlaSBqZWdsaWNoZW0gTWFpbHZlcmtlaHIgenUgZWluZW0gT2JqZWt0LCBzb2xsdGUKK2RpZSBidG9wIE51bW1lciBhbmdlZ2ViZW4gd2VyZGVuLCBkaWUgaW4gZGVyIGVyc3RlbiBNYWlsIHp1IGRlbSBPYmpla3QKK2FuZ2VnZWJlbiBzZWluIHNvbGx0ZS4gSXN0IGRpZXMgbmljaHQgZGVyIEZhbGwsIGVyZnJhZ2UgZGllc2UgTnVtbWVyIGJpdHRlIGJlaQorZWluZW0gZGVyIFRlYW1taXRnbGllZGVyLiBOYWNoIEdlbmVobWlndW5nIGRlcyBPYmpla3Rlcywgc29sbHRlIGRpZXNlIE51bW1lcgorYXVjaCBpbiBkZW4gS29wZiBkZXIgRGF0ZWkoZW4pIGdlc2NocmllYmVuIHdlcmRlbi4KKworQmVpIGVpbmVtIEFudHJhZyBrb21tdCBlcyBpbW1lciB3aWVkZXIgenUgTWlzdmVyc3RhZW5kbmlzc2VuIG9kZXIKK1p3ZWlkZXV0aWdrZWl0ZW4uIERhaGVyIGlzdCBlcyBkaWUgUmVnZWwsIGRhc3Mgbm9jaCBtYWwgbmFjaGdlZnJhZ3Qgd2lyZCwKK3dpZSBkZW5uIGdlbmF1IGV0d2FzIGFibGF1ZmVuIG9kZXIgaW1wbGVtZW50aWVydCB3ZXJkZW4gc29sbC4gRWluZSBzY2huZWxsZQorQmVhbnR3b3J0dW5nIGRpZXNlciBGcmFnZW4gYmVzY2hsZXVuaWd0IG5hdHVlcmxpY2ggYXVjaCBkZW4KK0dlbmVobWlndW5nc3Byb3plc3MuIE1pc3NmYWxsZW4gZGVtIEJhbGFuY2V0ZWFtIGVpbnplbG5lIEVpZ2Vuc2NoYWZ0ZW4sCitJbXBsZW1lbnRpZXJ1bmdlbiBvZGVyIFdlcnRlLCB3ZXJkZW4gaGFldWZpZyBWb3JzY2hsYWVnZSBnZW1hY2h0LCBkaWUgZGllCitBa3plcHRhbnogZWluZXMgT2JqZWt0ZXMgZHVyY2ggZGllIEJhbGFuY2UgZW50c2NoZWlkZW5kIHZlcmJlc3Nlcm4uIERpZQorTWl0Z2xpZWRlciBiZW11ZWhlbiBzaWNoLCBkZW4gR2VuZWhtaWd1bmdzcHJvemVzcyBzbyByZWlidW5nc2xvcyB1bmQKK2tvbmZsaWt0YXJtIHdpZSBtb2VnbGljaCBhYmxhdWZlbiB6dSBsYXNzZW4uIFNvbGNoZSBBZW5kZXJ1bmdzdm9yc2NobGFnZSBzaW5kCit3ZWRlciBCZWxlaHJ1bmdlbiBub2NoIGJvZXNlIGdlbWVpbnQsIHNvbmRlcm4gc29sbGVuIGRhenUgZGllbmVuIGRpZQorQmFsYW5jaWVydW5nIHp1IHZlcmVpbmZhY2hlbiwgenUgYmVzY2hsZXVuaWdlbiB1bmQgQmVkZW5rZW4gdm9uCitCYWxhbmNlbWl0Z2xpZWRlcm4gZW50Z2VnZW56dWtvbW1lbi4KKworWnVtIFNjaGx1c3Mgbm9jaCBlaW4gQW50cmFnLCB3aWUgZXIgYXVzc2llaGVuIGtvZW5udGU6CisKK0FudHJhZyBmdWVyIGVpbiBad2VpaGFuZHNjaHdlcnQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZTogRGVyIFBlcmZvcmF0b3IKK1BmYWQ6IC9kL3JlZ2lvbi9tYWdpZXIvZ2ViaWV0L29iai9wZXJmb3JhdG9yLmMKKyAgICAgIC9kL3JlZ2lvbi9tYWdpZXIvZ2ViaWV0L29iai9sb2NoLmMKK1BfV0VBUE9OX1RZUEU6ICBXVF9TV09SRAorUF9XQzogICAgICAgICAgIDIwMAorUF9OUl9IQU5EUzogICAgIDIKK1BfVkFMVUU6ICAgICAgICAxNTAwMAorUF9XRUlHSFQ6ICAgICAgIDE1MDAKK1BfREFNX1RZUEU6ICAgICAoe0RUX1BJRVJDRSwgRFRfVU5IT0xZfSkKK0hpdEZ1bmM6ICAgICAgICB1bnRlciBVbXN0YWVuZGVuIHJhbmRvbSg1MCkKK0tfQlJBV0xJTkdfV0M6ICAyNQorS19DUklUSUNBTF9ISVQ6IDgwCisKK1BzZXVkby1VbmlxdWU6IEVzIGdpYnQgMTAgU3R1ZWNrLCB3aXJkIGVpbiBFbGZ0ZXMgZ2VicmF1Y2h0LCB3aXJkCitkYXMgbWl0IGRlciBhZWx0ZXN0ZW4gQ2xvbmV6ZWl0IHplcnN0b2VydC4KKworUmVzdHJpa3Rpb25lbjogTWluaVF1ZXN0LCBTZWhlciwgQmV0ZWlsaWd1bmcgYmVpbSBFcm1ldHplbG4KKworQmVzY2hyZWlidW5nOiBEZXIgUGVyZm9yYXRvciBwZXJmb3JpZXJ0IGRlbiBHZWduZXIuIElzdCBub2NoIGtlaW4gTG9jaAoraW4gZGVtIEdlZ25lciwgd2lyZCBlaW5zIHJlaW5nZXBpZWt0IHVuZCBtYWNodCBkYWJlaSB6dXNhZXR6bGljaCByYW5kb20oNTApCitTY2hhZGVuLiBEYW5hY2ggaXN0IGVpbiBMb2NoIGltIEdlZ25lciB1bmQgZXIgdmVybGllcnQgamVkZSBSdW5kZSAxMCArCityYW5kb20oMTApIEhQIGR1cmNoIEJsdXR2ZXJsdXN0IHBlciByZWR1Y2VfaGl0X3BvaW50cygpIGZ1ZXIgMTAgUnVuZGVuLgorSXN0IGRlciBUcmFlZ2VyIGRlcyBTY2h3ZXJ0cyBub2NoIGltIFJhdW0sIGJla29tbXQgZXIgZGllc2VuIFNjaGFkZW4KK2d1dGdlc2NocmllYmVuLCB3ZWlsIGRhcyBTY2h3ZXJ0IGRhcyBCbHV0IHRyaW5rdC4gSXN0IGRhcyBMb2NoIHdlZywgZ2lidCBlcwora2VpbiB3ZWl0ZXJlcy4KKworRGFzIFNjaHdlcnQgaGF0IGVpbiBzY2h3ZXJlcywgbWl0IERvcm5lbiB2ZXJzZWhlbmVzIEhlZnQgKEJSQVdMSU5HX1dDKSB1bmQKK2lzdCByYXNpZXJtZXNzZXJzY2hhcmYsIHNvIGRhc3MgZXMgc2ljaCBmdWVyIGVpbmVuIFRvZGVzc3Rvc3MgZ3V0IGVpZ25ldC4KK0RhcyBTY2h3ZXJ0IGhhdCBlaW5lbiBGbHVjaCwgZGVyIGVzIGJsdXRkdXJzdGlnIG1hY2h0IHVuZCBEVF9VTkhPTFkgZXJrbGFlcnQuCisKK1VtIGRhcyBTY2h3ZXJ0IHp1IGJla29tbWVuLCBicmF1Y2h0IG1hbiBlaW5lIE1pbmlxdWVzdCwgZGllIGNhIDIwIEFQIGdlYmVuCit3dWVyZGUuIEFtIEVuZGUga29tbXQgbWFuIGFuIGVpbmVuIEVuZGdlZ25lciwgZGVuIG1hbiBpbSBUZWFtIGhhdWVuIG11c3MsCithbGxlIE1pdGdsaWVkZXIgbXVlc3NlbiBkaWUgTWluaXF1ZXN0IGdlcmFkZSBtYWNoZW4uIFp1ZWNrZW4ga2FubiBkYXMgU2Nod2VydAorbnVyIGplbWFuZCwgZGVyIGRpZSBNaW5pcXVlc3Qgc2Nob24gaGF0IHVuZCBtaW5kZXN0ZW5zIDIwJSBkZXMgU2NoYWRlbnMgZ2VtYWNodAoraGF0LiBWb24gZGVtIFNjaHdlcnQgZ2lidCBlcyBpbW1lciBudXIgMTAgU3R1ZWNrLCBkYXMgYWVsdGVzdGUgd2lyZCBiZWltCitjbG9uZW4gZGVzIE5QQyB6ZXJzdG9lcnQgdW5kIGVpbiBOZXVlcyBlcnNjaGFmZmVuLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgU0lFSEUgQVVDSAorCisgcnVlc3R1bmdlbiwgd2FmZmVuLCBmZXJud2FmZmVuLCB1bmlxdWVzLCBucGNzLCBvYmplY3RzLCBiYWxhbmNlCisgYXR0cmlidXRzdmVyYWVuZGVydW5nZW4sIHJlc2lzdGVuemVuLCBrYW1wZm9iamVrdGUsIGdyZW56d2VydGUsIG5hY2h0ZWlsZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitsZXR6ZSBBZW5kZXJ1bmc6IDE4LjEwLjIwMDUgMjM6NDEgLSBNaXJpbApkaWZmIC0tZ2l0IGEvZG9jL3dpei9iZWZvZXJkZXJ1bmdlbiBiL2RvYy93aXovYmVmb2VyZGVydW5nZW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY4MGMwOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93aXovYmVmb2VyZGVydW5nZW4KQEAgLTAsMCArMSw2NiBAQAorRWluZSBrbGVpbmUgVWViZXJzaWNodCB1ZWJlciBkaWUgQmVmb2VyZGVydW5nc3BvbGl0aWsgaW0gTUcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyBMZXZlbCAxIC0+IDE1OgorICAgICBXQU5OOgorICAgICAgICBNYW4gbXVzcyBTZWhlciBzZWluLiAocy4gYXVjaCAiaGlsZmUgbWFnaWVyIikKKyAgICAgV0VSOgorICAgICAgICAyNisgKHNpZWhlIGF1Y2ggImhpbGZlIHZlcnRyYWciKQorICAgICBSRUNIVEU6CisgICAgICAgIEVpbmdlc2NocmFlbmt0ZSBMZXNlcmVjaHRlIGF1ZiBkZXIgTGliLgorCisgTGV2ZWwgMTUgLT4gMjA6CisgICAgIFdBTk46CisgICAgICAgIE1pbmRlc3RlbnMgZWluZSBXb2NoZSBzZWl0IGRlbSBBbnN0aWVnIGF1ZiAxNSwgZGFtaXQKKyAgICAgICAgRWluc3BydWVjaGUgZ2VnZW4gZGVuIENoYXJha3RlciBuaWNodCB1ZWJlcmdhbmdlbiB3ZXJkZW4uCisgICAgICAgIEtvbnplcHQgZnVlciBHUworICAgICBXRVI6CisgICAgICAgIFByaW56aXBpZWxsIDY2KworICAgICAgICBOb3JtYWxlcndlaXNlIGFiZXIgRU0gR2VzZWxsZW5zdHVlY2tlIHVuZCBab29rCisgICAgIFJFQ0hURToKKyAgICAgICAgTGVzZXJlY2h0ZSBhdWYgYWxsZ2VtZWluZSBWZXJ6ZWljaG5pc3NlLCBlaWdlbmVzIFZlcnplaWNobmlzLCBDbG9uZW4uCisKKyBfQWx0ZXJuYXRpdl8gZ2lidCBlcyB3ZWl0ZXJlIE1vZWdsaWNoa2VpdDoKKyBMZXZlbCAwIC0+IDIwOgorICAgICBXQU5OOgorICAgICAgICBNYW4gbXVzcyBlaW5lbiBTZWhlciBhbHMgRXJzdGllIHVuZCBlaW4gdm9uIGRlbiBFTXMgZ2VuZWhtaWd0ZXMKKyAgICAgICAgS29uemVwdCBmdWVyIGVpbiBHUyBoYWJlbi4gRGVzd2VpdGVyZW4gdmVycGZsaWNodGV0IG1hbiBzaWNoLCBkYXMKKyAgICAgICAgR1MgaW5uZXJoYWxiIHZvbiA2IE1vbmF0ZW4gZmVydGlnenVzdGVsbGVuLiAocy4gImhpbGZlIG1hZ2llciIpCisgICAgIFdFUjoKKyAgICAgICAgRU1zIChzaWVoZSBhdWNoICJoaWxmZSB2ZXJ0cmFnIikKKyAgICAgUkVDSFRFOgorICAgICAgICBFaW5nZXNjaHJhZW5rdGUgTGVzZXJlY2h0ZSBhdWYgZGVyIExpYi4KKworCisgTGV2ZWwgMjAgLT4gMjE6CisgICAgIFdBTk46CisgICAgICAgIG5hY2ggR1MtQWJuYWhtZQorICAgICBXRVI6CisgICAgICAgIEVNIGZ1ZXIgR2VzZWxsZW5zdHVlY2tlLgorICAgICBSRUNIVEU6CisgICAgICAgIE5vcm1hbGUgTGVzZXJlY2h0ZS4KKworIExldmVsIDIxIC0+IDI1OgorICAgICBXQU5OOgorICAgICAgICBNYWdpZXIgaGF0IGV0d2FzIGZ1ZXIgZWluZSBSZWdpb24gZ2Vwcm9nZ3QsIHdhcyBhbmdlc2NobG9zc2VuCisgICAgICAgIHd1cmRlL3dpcmQuCisgICAgIFdFUjoKKyAgICAgICAgNDUKKyAgICAgUkVDSFRFOgorICAgICAgICBTY2hyZWlicmVjaHRlIGluIGRlciBEb21haW4uIFZlcmdhYmUgZHVyY2ggenVzdGFlbmRpZ2VuIFJNLgorCisgTGV2ZWwgMjUgLT4gMjYrOgorICAgICBXQU5OOgorICAgICAgICBNYWdpZXIgd2lyZCBmdWVyIGZhZWhpZyB1bmQgc2VsYnN0c3RhZW5kaWcgZ2VoYWx0ZW4uCisgICAgIFdFUjoKKyAgICAgICAgNDUKKyAgICAgUkVDSFRFOgorICAgICAgICBLYW5uIG51biBzZWxic3QgU3BpZWxlciBzcG9uc29yZW4uCisgCisgVm9yc2ljaHQ6IGRpZXNlcyBEb2t1bWVudCBpc3QgaW0gc3RldGlnZW4gV2FuZGVsIHVuZCBzdGVsbHQgbnVyIGRpZQorIGFsbGdlbWVpbmUgUG9saXRpayBkYXIgLSBzaWNoIGRyYXVmIGJlcnVmZW4gZ2lsdCBuaWNodC4KKworU0lFSEUgQVVDSDoKKyAgICAgZXJ6bWFnaWVyLCBiYWxhbmNlCisKKzI3LjEwLjIwMDksIFplc3N0cmEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2Mvd2l6L2JlbmVubnVuZyBiL2RvYy93aXovYmVuZW5udW5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlOTRlYmMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd2l6L2JlbmVubnVuZwpAQCAtMCwwICsxLDE1OCBAQAorQVVUT1IgICBNRywgZGVuIDIyLjA4LjkyLCBEb24gUnVtYXRhCisJVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIE1vcmdlbmdyYXVlbi1NdWRsaWIgZnJvbSBKb2YgYW5kIFJ1bWF0YQorCitWRVJTSU9OIDEuMQorCitBS1RVQUxJU0lFUlQ6IE1HLCBkZW4gMTQuMTAuOTMsIENocmlzCitVRUJFUkFSQkVJVEVUOiBhbSAyNC4wOC45NCB2b24gVmlwZXIKKworVEhFTUEgICBCRU5FTk5VTkcgVk9OIE9CSkVLVEVOIElNIE1vcmdlbkdyYXVlbgorCitJTkhBTFQ6CisJSS4gICAgICBFaW5sZWl0dW5nCisJSUkuICAgICBGdW5rdGlvbmVuLCBkaWUgYWxsZSBPYmpla3RlIGJlc2l0emVuIG11ZXNzZW4KKwlJSUkuICAgIFVudGVyc3R1ZXR6dW5nIGRlciBGdW5rdGlvbmVuIGR1cmNoIGRpZSBNR19tdWRsaWIKKwlJVi4gICAgIEJlbmVubnVuZyB2b24gUmFldW1lbgorCVYuICAgICAgQmVuZW5udW5nIHZvbiBNb25zdGVybgorCitJLiAgICAgIEVJTkxFSVRVTkcKKworCUplZGVzIE9iamVrdCBpbiBkZXIgTXVkbGliIG11c3MgYXVmIGZvbGdlbmRlIFdlaXNlbiBpZGVudGlmaXppZXJ0CisJd2VyZGVuIGtvZW5uZW46CisKKwkxLikgICAgIEVzIG11c3MgZWluZW4gTmFtZW4gaGFiZW4sIGRlciBpbm5lcmhhbGIgZWluZXMgU2F0emVzIGRhcworCQlPYmpla3QgYmV6ZWljaG5lbiBrYW5uLgorCisJMi4pICAgICBFcyBtdXNzIGVpbmUgS3VyemJlc2NocmVpYnVuZyBiZXNpdHplbi4KKworCTMuKSAgICAgRXMgbXVzcyBlaW5lIGF1c2Z1ZWhybGljaGUgQmVzY2hyZWlidW5nIGJlc2l0emVuLgorCisJNC4pICAgICBFcyBtdXNzIGVpbmUgTWVuZ2Ugdm9uIFN5bm9ueW1lbiBrZW5uZW4sIG1pdCBkZW5lbiBlaW4KKwkJU3BpZWxlciBkYXMgT2JqZWt0ICJhbnNwcmVjaGVuIiBrYW5uLgorCitJSS4gICAgIEZVTktUSU9ORU4sIERJRSBBTExFIE9CSkVLVEUgQkVTSVRaRU4gTVVFU1NFTgorCisJSmVkZXMgT2JqZWt0IGltIE1vcmdlbkdyYXVlbiBzb2xsdGUgZm9sZ2VuZGUgRnVua3Rpb25lbiAKKwlpbXBsZW1lbnRpZXJ0IGhhYmVuOgorCisJMS4pICAgICBuYW1lKCBmYWxsLCBkZW0gKQorCisJRGllc2UgRnVua3Rpb24gc29sbCBkZW4gTmFtZW4gZGVzIE9iamVrdGVzIGltIGpld2VpbGlnZW4KKwlGYWxsIG1pdCBBcnRpa2VsICh3ZW5uIGVzIGVpbmVuIGJlc2l0enQpIHp1cnVlY2tnZWJlbiwgc28KKwlkYXNzIGRlciBSdWVja2dhYmV3ZXJ0IGluIGVpbmVuIFNhdHogZWluZ2VhcmJlaXRldCB3ZXJkZW4KKwlrYW5uLgorCisJImZhbGwiIGRpZW50IHp1ciBEZWtsaW5hdGlvbiBkZXMgT2JqZWt0bmFtZW5zLgorCisJImRlbSIgYmVzdGltbXQsIHdlbGNoZSBBcnRpa2VsIGJlbnV0enQgd2VyZGVuIHNvbGxlbi4KKwlNb2VnbGljaGUgV2VydGUgZnVlciAiZGVtIjoKKworCTAgICAgICAgQmVudXR6ZSB1bmJlc3RpbW10ZSBBcnRpa2VsLgorCQorCTEgICAgICAgQmVudXR6ZSBiZXN0aW1tdGUgQXJ0aWtlbC4KKwkKKwkyICAgICAgIEJlbnV0emUgYmVzdGltbXRlIEFydGlrZWwsIHdlbm4gc2ljaCBtaXQgZGVtIE9iamVrdAorCQlrZWluIGdsZWljaGFydGlnZXMgT2JqZWt0IGltIHNlbGJlbiBSYXVtIGJlZmluZGV0LAorCQlzb25zdCBiZW51dHplIGVpbmVuIHVuYmVzdGltbXRlbi4KKworCQlTdGF0dCBkZXIgMiBrYW5uIGF1Y2ggZWluIFN0cmluZyB1ZWJlcmdlYmVuIHdlcmRlbi4KKwkJSW4gZGllc2VtIEZhbGwgd2lyZCBnZXRlc3RldCwgb2Igc2ljaCBlaW4gT2JqZWt0IG1pdAorCQlkZW0gU3RyaW5nIGFscyBpZCBpbSBzZWxiZW4gUmF1bSBiZWZpbmRldC4KKworCTIuKSAgICAgc2hvcnQoKQorCisJRGllc2UgRnVua3Rpb24gbGllZmVydCBlaW5lIEJlc2NocmVpYnVuZywgZGllIGF1c2dlZ2ViZW4KKwl3aXJkLCB3ZW5uIGRlciBSYXVtLCBpbiBkZW0gZGFzIE9iamVrdCBzaWNoIGJlZmluZGV0LAorCWJldHJhY2h0ZXQgd2lyZC4KKworCTMuKSAgICAgbG9uZygpCisKKwlEaWVzZSBGdW5rdGlvbiBsaWVmZXJ0IGVpbmUgQmVzY2hyZWlidW5nLCBkaWUgYXVzZ2VnZWJlbgorCXdpcmQsIHdlbm4gZGFzIE9iamVrdCBhbmdlc2NoYXV0IHdpcmQuIEltIFVudGVyc2NoaWVkIHp1cgorCTIuNC41IE11ZGxpYiB3aXJkIGRpZSBCZXNjaHJlaWJ1bmcgamVkb2NoIG5pY2h0IGF1c2dlZ2ViZW4sCisJc29uZGVybiBhbHMgcmV0dXJuLVdlcnQgenVydWVja2dlZ2ViZW4uCisKKwk0LikgICAgIGlkKCBzdHIgKQorCisJRGllc2UgRnVua3Rpb24gc29sbCAxIHp1cnVlY2tnZWJlbiwgd2VubiBzdHIgZWluZSBaZWljaGVuLQorCWZvbGdlIGlzdCwgZGllIGRhcyBPYmpla3QgYmV6ZWljaG5lbiBrb2VubnRlLiBEaWVzZSBaZWljaGVuLQorCWZvbGdlIHdpcmQgaW4ga2xlaW5lbiBCdWNoc3RhYmVuIHVlYmVyZ2ViZW4uCisKKwk1LikgICAgIF9xdWVyeV9pbnZpcygpCisKKwlXZW5uIGVpbiBPYmpla3QgdW5zaWNodGJhciBpc3QsIHNvbGwgZXMgYmVpbSBBdWZydWYgZGllc2VyCisJRnVua3Rpb24gMSB6dXJ1ZWNrZ2ViZW4uIFNpY2h0YmFyZSBPYmpla3RlIGJyYXVjaGVuIGRpZXNlCisJRnVua3Rpb24gbmljaHQgenUgaW1wbGVtZW50aWVyZW4uCisKK0lJSS4gICAgVU5URVJTVFVFVFpVTkcgREVSIEZVTktUSU9ORU4gRFVSQ0ggRElFIE1HX01VRExJQgorCisJV2VubiBlaW4gZWlnZW5lcyBPYmpla3QgYXVzIGRlbiBTdGFuZGFyZG9iamVrdGVuIGFiZ2VsZWl0ZXQKKwl3aXJkLCBzaW5kIGFsbGUgZGllc2UgRnVua3Rpb25lbiBiZXJlaXRzIGZlcnRpZyBkZWZpbmllcnQuCisJRXMgbXVlc3NlbiBiZWltIEVyemV1Z2VuIGRlciBPYmpla3RlIG51ciBub2NoIGRpZSBlbnRzcHJlY2hlbmRlbgorCVdlcnRlIG1pdGdldGVpbHQgd2VyZGVuLiBEaWVzZXMgZ2VzY2hpZWh0IG1pdCBmb2xnZW5kZW4gRnVuay0KKwl0aW9uZW4sIGRpZSBhbSBiZXN0ZW4gaW0gY3JlYXRlKCkgYXVmZ2VydWZlbiB3ZXJkZW4uCisKKwkxLikgICAgIFNldFByb3AoIFBfTkFNRSwgc3RyaW5nICk7CisKKwlJbiBuYW1lKCkgd2lyZCBkZXIgdWViZXJnZWJlbmUgU3RyaW5nIGRla2xpbmllcnQgdW5kIGF1dG9tYXRpc2NoCisJbWl0IEFydGlrZWxuIHZlcnNlaGVuLiAgRGllc2UgRnVua3Rpb24gYmVkZW5rdCBhdWNoIEZhZWxsZSwgYW4gCisJZGllIGlociB3YWhyc2NoZWlubGljaCBuaWUgZ2VkYWNodCBoYWJ0LiBEZXIgR2VuaXRpdiB2b24gZGVyIAorCUxhaG1lIGlzdCB6LkIuIGRlcyBMYWhtZW4hIEF1Y2ggZnVlciBhbmRlcmUgRmFlbGxlIGJpZXRldCBkaWVzZSAKKwlGdW5rdGlvbiBtYWVjaHRpZ2UgVW50ZXJzdHVldHp1bmcuCisKKwlXZW5uIGRlciBTdHJpbmcgbmljaHQgbWl0IEFydGlrZWxuIHZlcnNlaGVuIHdlcmRlbiBzb2xsLCBzbyBrYW5uCisJbWFuIGRhcyBtaXR0ZWxzIGRlciBGdW5rdGlvbiAiU2V0UHJvcChQX0FSVElDTEUsIDAgKSIgZXJyZWljaGVuLgorCisJRGFtaXQgZGllIEZ1bmt0aW9uIG5hbWUoKSB1ZWJlcmhhdXB0IGRlbiByaWNodGlnZW4gQXJ0aWtlbCAKKwlhdXN3YWVobGVuIGthbm4sIG11c3MgbWFuIG1pdCAiU2V0UHJvcCggUF9HRU5ERVIsIGdlbmRlcikiIGRhcworCUdlY2hsZWNodCBkZXMgT2JqZWt0ZXMgYmVrYW5udCBtYWNoZW4uIEFscyBnZW5kZXIga2FubiBtYW4gCisJTUFMRSBvZGVyIDEsIEZFTUFMRSBvZGVyIDIgdW5kIE5FVVRFUiBvZGVyIDAgdmVyd2VuZGVuLgorCisJSXN0IGRhcyBPYmpla3QgdW5zaWNodGJhciwgc28gZGFyZiBzdHJpbmcgdHJvdHpkZW0gbmljaHQgMCBzZWluOworCXN0YXR0ZGVzc2VuIGlzdCAiU2V0UHJvcCggUF9JTlZJUywgMSApIiBhdWZ6dXJ1ZmVuLiAoRGllIFplaWxlCisJIiNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+IiBuaWNodCB2ZXJnZXNzZW4uIDotKSkKKworCURhIGRpZXNlcyBWZXJmYWhyZW4gc2VociBmZWhsZXJhbmZhZWxsaWcgaXN0LCBpc3QgZnVlciBkZW4gTmFtZW4KKwllaW4gQXJyYXkgdm9uIE5hbWVuIHp1Z2VsYXNzZW4sIHNvIGRhc3MgZnVlciBqZWRlbiBGYWxsIGVpbiBXb3J0CisJdWViZXJnZWJlbiB3ZXJkZW4ga2Fubi4gQmVpc3BpZWwuOgorCVNldFByb3AoIFBfTkFNRSwgKHsgIk1lbnNjaCIsICJNZW5zY2hlbiIsICJNZW5zY2hlbiIsICJNZW5zY2hlbiIgfSkgKTsKKworCTIuKSAgICAgU2V0UHJvcCggUF9TSE9SVCwgc3RyaW5nICkKKwkKKwlJbiBzaG9ydCgpIHdpcmQgZGVyIHVlYmVyZ2ViZW5lIFN0cmluZyBhdXNnZWdlYmVuLiBNaXR0ZWxzIGRlcworCXByb2Nlc3Nfc3RyaW5nLU1lY2hhbmlzbXVzIChzaWVoZSAvZG9jL2VmdW4vcHJvY2Vzc19zdHJpbmcpCisJa29lbm5lbiBhdWNoIHZhcmliYWxlIFRlaWxlIGluIGRlbSBTdHJpbmcgdm9ya29tbWVuLgorCXN0cmluZyBicmF1Y2h0IGZ1ZXIgdW5zaWNodGJhcmUgT2JqZWt0ZSBuaWNodCBhdWYgMCBnZXNldHp0CisJd2VyZGVuLgorCisJMy4pICAgICBTZXRQcm9wKCBQX0xPTkcsIHN0cmluZyApCisKKwlEaXRvLgorCisJNC4pICAgICBBZGRJZCggc3RyaW5nICk7CisKKwlOZWhtZSBkZW4gU3RyaW5nIGluIGRpZSBNZW5nZSBkZXIgWmVpY2hlbmtldHRlbiBhdWYsIGF1ZiBkaWUgZGllCisJZWluZ2ViYXV0ZSBpZC1GdW5rdGlvbiBtaXQgMSBhbnR3b3J0ZW4gc29sbC4KKworCTUuKSAgICAgRXMgcmVpY2h0LCBTZXRQcm9wKCBQX0lOVklTLCAxICkgYXVmenVydWZlbiwgd2VubiBkYXMKKwlPYmpla3QgdW5zaWNodGJhciB3aXJkLCB1bmQgU2V0UHJvcCggUF9JTlZJUywgMCApLCB3ZW5uIGVzIHdpZWRlcgorCXNpY2h0YmFyIHdpcmQuCisKK0lWLiAgICAgQkVORU5OVU5HIFZPTiBSQUVVTUVOCisKKwlCZWkgUmFldW1lbiB3aXJkIGRpZSBsb25nKCkgYnp3LiBzaG9ydCgpLUJlc2NocmVpYnVuZyBudXIgZGFubgorCWJlbnV0enQsIHdlbm4gZGVyIFJhdW0gKnZvbiBhdXNzZW4qIGFuZ2VzY2hhdXQgd2lyZC4gRnVlciBlaW5lCisJQmVzY2hyZWlidW5nIGRlcyBSYXVtZW4gdm9uIGlubmVuIHNpbmQgZm9sZ2VuZGUgRnVua3Rpb25lbgorCWJlcmVpdGdlc3RlbGx0OgorCisJMS4pICAgICBTZXRQcm9wKCBQX0lOVF9TSE9SVCwgc3RyaW5nICk7CisKKwlHZWJlIGVpbmUgQmVzY2hyZWlidW5nIGRlcyBSYXVtZXMgZnVlciBkZW4gImt1cnoiLU1vZHVzIGF1cy4KKworCTIuKSAgICAgU2V0UHJvcCggUF9JTlRfTE9ORywgc3RyaW5nICk7CisKKwlHZWJlIGVpbmUgYXVzZnVlaHJsaWNoZSBCZXNjaHJlaWJ1bmcgZGVzIFJhdW1lcyB6dXJ1ZWNrLgorCitWLiAgICAgIEJFTkVOTlVORyBWT04gTU9OU1RFUk4KKworCVNpZWhlIG9iZW4gdW50ZXIgL2RvYy9NRy9CQU5JU0guCmRpZmYgLS1naXQgYS9kb2Mvd2l6L2NhbGxlZF9ieV9wbGF5ZXIgYi9kb2Mvd2l6L2NhbGxlZF9ieV9wbGF5ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk3ZjU0NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93aXovY2FsbGVkX2J5X3BsYXllcgpAQCAtMCwwICsxLDggQEAKK3ZvaWQgQmVjb21lc05ldERlYWQob2JqZWN0IHBsYXllcikgd2lyZCBpbSBSYXVtIGF1ZmdlcnVmZW4sIHdlbm4gZG9ydCBlaW4KKwlTcGllbGVyIG5ldHp0b3Qgd2lyZC4gcGxheWVyIGlzdCBkZXIgU3BpZWxlci4KKwordm9pZCBQbGF5ZXJRdWl0KG9iamVjdCBwbGF5ZXIpIHdpcmQgaW0gUmF1bSBhdWZnZXJ1ZmVuLCB3ZW5uIGRhcmluIGVpbgorCVNwaWVsZXIgcXVpdHRldC4KKwordm9pZCBleGl0KCkgd2lyZCBpbSBSYXVtIGF1ZmdlcnVmZW4sIHdlbm4gZWluIExlYmV3ZXNlbiByYXVzZ2Vtb3ZlZCB3aXJkLgorCURhcyBMZWJld2VzZW4gaXN0IHByZXZpb3VzX29iamVjdCgpCmRpZmYgLS1naXQgYS9kb2Mvd2l6L2VudHRhbmtlbiBiL2RvYy93aXovZW50dGFua2VuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNDdkNDcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd2l6L2VudHRhbmtlbgpAQCAtMCwwICsxLDk5IEBACitFbnR0YW5rZW4KKz09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJlbGxlczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqCisKK0FMTEUgRW50dGFuay1Nb2VnbGljaGtlaXRlbiBNVUVTU0VOIG9ydHNhYmhhZW5pZyBzZWluLgorQXVzbmFobWVuIEtBTk4gZXMgZnVlciBRdWVzdGJlbG9obnVuZ2VuIGdlYmVuLgorCitUb2lsZXR0ZW4KKy0tLS0tLS0tLQorVG9pbGV0dGVuIHJ1ZmVuIGRpZSBNZXRob2RlbiAiZGVmdWVsX2RyaW5rIiBiencuICJkZWZ1ZWxfZm9vZCIgaW0gU3BpZWxlciBhdWYuCitFcyB3ZXJkZW4ga2VpbmUgUGFyYW1ldGVyIHVlYmVyZ2ViZW4uIFJ1ZWNrZ2FiZXdlcnRlIHNpbmQgZW50d2VkZXIgZGllIEZlaGxlcgorTk9fREVGVUVMLCB3ZW5uIG1hbiBuaWNodHMgenUgRW50dGFua2VuIGhhdCwgREVGVUVMX1RPT19MT1csIHdlbm4gbWFuIG5pY2h0CitnZW51ZyBpbSBNYWdlbi9CbGFzZSBoYXQsIERFRlVFTF9UT09fU09PTiwgd2VubiBtYW4gbm9jaCBuaWNodAord2llZGVyIGVudHRhbmtlbiBkYXJmLCBPREVSIGRlciBlbnR0YW5rdGUgV2VydC4KK0JlaXNwaWVsIGhpZXJ6dSBzaWVoZSAibWFuIGRlZnVlbF9mb29kIi4KKworTWFuIGRhcmYgREFOTiBlbnR0YW5rZW4sIHdlbm4gbWFuIG1pbmRlc3RlbnMgZGVuIEZ1ZWxsd2VydCBQX0RFRlVFTF9MSU1JVF9GT09ECitiencuIFBfREVGVUVMX0xJTUlUX0RSSU5LIGhhdCB1bmQgZGFzIGxldHp0ZSBFbnR0YW5rZW4gbWluZGVzdGVucworUF9ERUZVRUxfVElNRV9GT09EIGJ6dy4gUF9ERUZVRUxfVElNRV9EUklOSyBoZXIgaXN0LgorSXN0IGRpZXMgZGVyIEZhbGwsIGthbm4gbWFuIFBfRFJJTksvRk9PRCpQX0RFRlVFTF9BTU9VTlRfRFJJTksvRk9PRCBlbnR0YW5rZW4sCit3b2JlaSBkaWVzIHp1ciBIYWVsZnRlIHVlYmVyIGVpbiBSYW5kb20gZ2VnbGFldHRldCB3aXJkLgorCitXZXIgcmVndWxhZXIgdWViZXIgImRlZnVlbF9kcmluayIgZW50dGFua3QsIGVudHRhbmt0IGF1Y2ggYXV0b21hdGlzY2ggZWluZQorZ2V3aXNzZSBNZW5nZSBhbiBBbGtvaG9sLiBEaWVzZSBNZW5nZSBpc3Qgdm9uIGRlciBlbnR0YW5rdGVuIE1lbmdlLCB2b24gZGVtCitpbSBLb2VycGVyIHNpY2ggYmVmaW5kZW5lbiBBbGtvaG9sIHVuZCB2b20gR2V3aWNodCBkZXMgU3BpZWxlcnMgYWJoYWVuZ2lnLgorCitBbGxlIGdlbmFubnRlbiBQcm9wcyBzaW5kIHJhc3NlbmFiaGFlbmdpZy4KK0RpZSBCZXJlY2hudW5nZW4gc2luZCBnZWthcHNlbHQgaW4gImRlZnVlbF9mb29kL2RyaW5rIi4KKworQW5kZXJlIE9iamVrdGUKKy0tLS0tLS0tLS0tLS0tCisKK0hpZXIgYmlldGV0IHNpY2ggYW4sIGRpZSB6ZWl0bGljaGUgTnV0enVuZyBkZXIgRW50dGFua2Ugc3BpZWxlcmJlem9nZW4gCittaXR0ZWxzIGRlciBNZXRob2RlICBjaGVja19hbmRfdXBkYXRlX3RpbWVkX2tleSB6dSBzdGV1ZXJuLiBEYWJlaSBzb2xsdGUKK2RlciB6ZWl0bGljaGUgQWJzdGFuZCBuaWNodCB6dSBrbmFwcCBzZWluLCBpbiBkZXIgUmVnZWwgaW0gQmVyZWljaCB2b24gCitjYS4gZWluZXIgU3R1bmRlLiBEZXIgZWlnZW50bGljaGUgRW50dGFua3ZvcmdhbmcgaW0gU3BpZWxlciBnZXNjaGllaHQgCittaXR0ZWxzIGVhdF9mb29kLCBkcmlua19zb2Z0IG9kZXIgZHJpbmtfYWxjb2hvbCBkdXJjaCBVZWJlcmdhYmUgbmVnYXRpdmVyIAorV2VydGUuIERlciBCZXRyYWcgZGllc2VzIFdlcnRlcyBzb2xsdGUgZGVyIEVycmVpY2hiYXJrZWl0IGFuZ2VtZXNzZW4gc2VpbiwKK2QuaC4gbGVpY2h0ZXIgZXJyZWljaGJhcmUgRW50dGFua2VuIHNvbGx0ZW4gYXVjaCBuaWNodCB6dSB2aWVsIGVudHRhbmtlbiwKK3dlbm4gc2llIGRlbiBTcGllbGVyIGtvbXBsZXR0IGVudHRhbmtlbiBzb2xsZW4sIG11ZXNzZW4gc2llIGVudHNwcmVjaGVuZAorc2Nod2VyIHp1IGVycmVpY2hlbiBzZWluLgorRGEgZGllIEVudHRhbmtlbiBvcnRzYWJoYWVuZ2lnIHNpbmQgdW5kIGluIGRlciBSZWdlbCBlcnN0IGVyZm9yc2NodCAKK3dlcmRlbiBtdWVzc2VuLCBpc3QgZWluZSB3ZWl0ZXJlIEJlZ3Jlbnp1bmcgbW9tZW50YW4gbmljaHQgdm9yZ2VzZWhlbi4gCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwZXppZmlzY2hlczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSYXNzZW5iZXNjaHJlaWJ1bmdlbiBmdWVyIEJlcmVjaG51bmdlbiBpbiAiZGVmdWVsX2Zvb2QvZHJpbmsiOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitNRU5TQ0hFTgorc2luZCB3aWUgaW1tZXIgbmljaHRzIEJlc29uZGVyZXMgdW5kIGRlZmluaWVyZW4gZGFzIGFic29sdXRlIE1pdHRlbG1hc3MuCisKK1pXRVJHRQora29lbm5lbiBtZWhyIGluIEJsYXNlIHVuZCBNYWdlbiBoYWJlbiB1bmQga29lbm5lbiBhdWNoIHNvIHJpY2h0aWcgYWJsYWRlbi4KK0RhZnVlciBtdWVzc2VuIHNpZSBsYWVuZ2VyIHdhcnRlbiwgYmlzIGVzIHNpY2ggbG9obnQsIHp1IGVudHRhbmtlbi4KKworRUxGRU4KK3NpbmQgaW5rb250aW5lbnQgdW5kIEtsZWlubWVuZ2VuZ2ViZXIuCisKK0RVTktFTEVMRkVOCitzaW5kIHZvbiBkZW4gV2VydGVuIGhlciBpbiBldHdhIHdpZSBFbGZlbi4KKworSE9CQklUUwora29lbm5lbiBlc3NlbiBiaXMgenVtIFVtZmFsbGVuLiBTaWUgbGFkZW4gZGFubiByaWNodGlnIGFiLCBtdWVzc2VuIGFiZXIgYXVjaAorZW50c3ByZWNoZW5kIHdhcnRlbi4KKworRkVMSU5FTgorc2luZCBkZW4gTWVuc2NoZW4gYWVobmxpY2guCisKK09SS1MKK3NpbmQgYXVjaCBuaWNodHMgQmVzb25kZXJlcy4gCisKK1dlciBkaWUgZ2VuYXVlbiBXZXJ0ZSBlaW5zZWhlbiBtb2VjaHRlLCBtb2VnZSBpbiBkZW4gc2hlbGxzIG5hY2hndWNrZW4uCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9naXNjaGVzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioKKworSmVkZSAoISkgTW9lZ2xpY2hrZWl0IHp1ciBFbnR0YW5rdW5nLCBtdXNzIGRlbSB6dXN0YWVuZGlnZW4gTWFnaWVyCitmdWVyIEhlaWx1bmdzLUJhbGFuY2UgZ2VtZWxkZXQgdW5kIHZvbiBkaWVzZW0gZ2VuZWhtaWd0IHdlcmRlbi4gV2VyCitkaWVzZW4gUG9zdGVuIG1vbWVudGFuIGlubmVoYXQsIGthbm4gZGVtIE1haWxBbGlhcyAiaGVpbHVuZ3NfYmFsYW5jZSIKK2VudG5vbW1lbiB3ZXJkZW4uCisKK1NpZWhlIGF1Y2g6CistLS0tLS0tLS0tCisgICAgIFRhbmtlbjogICAgY29uc3VtZSwgZHJpbmtfYWxjb2hvbCwgZWF0X2Zvb2QsIGRyaW5rX3NvZnQKKyAgICAgSGVpbHVuZzogICBoZWFsX3NlbGYsIHJlc3RvcmVfc3BlbGxfcG9pbnRzLCByZXN0b3JlX2hpdF9wb2ludHMsIAorICAgICAgICAgICAgICAgIGJ1ZmZlcl9ocCwgYnVmZmVyX3NwCisgICAgIFRpbWluZzogICAgY2hlY2tfYW5kX3VwZGF0ZV90aW1lZF9rZXkKKyAgICAgRW50dGFua2VuOiBkZWZ1ZWxfZHJpbmssIGRlZnVlbF9mb29kCisgICAgIFByb3BzOiAgICAgUF9EUklOSywgUF9GT09ELCBQX0FMQ09IT0wsIFBfU1AsIFBfSFAsCisgICAgICAgICAgICAgICAgUF9ERUZVRUxfVElNRV9EUklOSworICAgICBLb256ZXB0ZTogIGhlaWx1bmcsIGZvb2QKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogMDIuMTEuMjAwNSAtIE1pcmlsCmRpZmYgLS1naXQgYS9kb2Mvd2l6L2ZhbWlsaWVuIGIvZG9jL3dpei9mYW1pbGllbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWJmODMxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dpei9mYW1pbGllbgpAQCAtMCwwICsxLDI0IEBACitFaW5lIEZhbWlsaWUgdW1mYXNzdCBkZW4gRXJzdGllIHVuZCBhbGxlIFp3ZWl0aWVzLCBzcHJpY2ggYWxsZSBkaWVzZSBoYWJlbiBkZW4KK2dsZWljaGVuICJGYW1pbGllbm5hbWVuIi4gRGllc2VyIE5hbWUgaXN0IGluIGRlciBSZWdlbCBkaWUgVVVJRCBkZXMgRXJzdGllcworZGllc2VyIEZhbWlsaWUuIEZhbGxzIGFiZXIgZGVyIEVyc3RpZSBzaWNoIGFlbmRlcm4gc29sbHRlICh6LkIuIE1hZ2llcndlcmR1bmcKK2VpbmVzIFp3ZWl0aWVzKSB1bmQgc2ljaCBkZXIgRmFtaWxpZW5uYW1lIG5pY2h0IGFlbmRlcm4gc29sbCwgZGFubiBrb2VubmVuCit3aXIgZGVuIE5hbWVuIGRpZXNlciBGYW1pbGllIGJlaWJlaGFsdGVuIChkLmguIGFsdGVyIEVyc3RpZSkuCisKK1dpbGwgbWFuIHdpc3Nlbiwgd2VsY2hlciBGYW1pbGllIGVpbiBDaGFyIGFuZ2Vob2VydCAoZWdhbCwgb2IgRXJzdGllIG9kZXIKK1p3ZWl0aWUpLCBkYW5uIGdlaHQgZGFzIG1pdDoKKyMgeGNhbGwgL3NlY3VyZS96d2VpdGllcy0+UXVlcnlGYW1pbGllKHBsYXllcl9vYmplY3QpCisKK0RlcyBXZWl0ZXJlbiBsaWVmZXJ0IGRpZXNlcyBPYmpla3QgYXVjaCBub2NoIHp1IGplZGVtIFp3ZWl0aWUgZGVuIEVyc3RpZSB1bmQKK3p1IGplZGVtIEVyc3RpZSBkaWUgTGlzdGUgYWxsZXIgYmVrYW5udGVuIFp3ZWl0aWVzOgorIyB4Y2FsbCAvc2VjdXJlL3p3ZWl0aWVzLT5RdWVyeUVyc3RpZU5hbWUocGxheWVyX29iamVjdCkKKyMgeGNhbGwgL3NlY3VyZS96d2VpdGllcy0+UXVlcnlFcnN0aWVVVUlEKHBsYXllcl9vYmplY3QpCisjIHhjYWxsIC9zZWN1cmUvendlaXRpZXMtPlF1ZXJ5WndlaXRpZXMocGxheWVyX29iamVjdCkKKworRGVyIERhdGVuYmVzdGFuZCBpc3QgKG5vY2gpIG5pY2h0IHZvbGxzdGFlbmRpZywgZGFoZXIgZmVobGVuIGRhIG5vY2ggdmllbGUKK0NoYXJzLiBEaWUgd2VyZGVuIGFiZXIgaW4gYWJzZWhiYXJlciBaZWl0IGRvcnQgbmFjaGdldHJhZ2VuLgorCitEaWUgRmFtaWxpZSB3aXJkIGluIFp1a3VuZnQgZ2VudXR6dCwgdW0gRGluZ2UgenUgcGVyc29uYWxpc2llcmVuLCB3ZWxjaGUgZnVlcgorZGVuIFNwaWVsZXIsIGFiZXIgbmljaHQgZnVlciBkZW4gQ2hhciBpbmRpdmlkdWVsbCBzZWluIHNvbGxlbi4gU3ByaWNoOgorcGVyc29uYWxpc2llcnQgbWFuIGlyZ2VuZHdhcyB1ZWJlciBkaWUgRmFtaWxpZSwga29lbm5lbiBhbGxlIENoYXJzIGRpZXNlcgorRmFtaWxpZSBkYXMgaXJnZW5kd2FzIG51dHplbi4KKwpkaWZmIC0tZ2l0IGEvZG9jL3dpei9mZWhsZXJ0ZXVmZWwgYi9kb2Mvd2l6L2ZlaGxlcnRldWZlbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjBiOTE2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dpei9mZWhsZXJ0ZXVmZWwKQEAgLTAsMCArMSwxODEgQEAKK0RlciBGZWhsZXJ0ZXVmZWwKKz09PT09PT09PT09PT09PT0KKworZGllIE11ZGxpYiBzcGVpY2hlcnQgZGllIGF1ZmdldHJldGVuZW4gRmVobGVyIHVuZCBXYXJudW5nZW4uIERhYmVpIHdlcmRlbiAKK2ZvbGdlbmRlIERhdGVuIG1pdGdlc3BlaWNoZXJ0OgorLSBaZWl0IChlcnN0ZXMgTWFsLCB6dWxldHp0KQorLSBJbiB3ZWxjaGVtIE9iamVrdCB1bmQgd2VsY2hlbSBQcm9ncmFtbSBkZXIgRmVobGVyIHdhcgorLSBaZWlsZW5yLgorLSBGZWhsZXJtZWxkdW5nCistIE9iamVrdCwgZGVzc2VuIEhlYXJ0YmVhdCwgZGVuIEZlaGxlciBhdXNsb2VzdGUKKy0gdGhpc19pbnRlcmFjdGl2ZSgpIGJ6dy4gdGhpc19wbGF5ZXIoKQorLSBkZW4gQmVmZWhsLCBkZW4gVEkgZWluZ2VnZWJlbiBoYXQKKy0gZGFzIEVudmlyb25tZW50IHZvbiBUSSBvZGVyIFRQCistIHdpZSBvZnQgZGVyIEZlaGxlciBzY2hvbiBhdWZ0cmF0CistIGRlciBCYWNrdHJhY2UKKy0gb2IgZGVyIEZlaGxlciBpbiBlaW5lbSBjYXRjaCgpIGF1ZnRyYXQKKworWnVzYWV0emxpY2ggd2VyZGVuIHZvbiBTcGllbGVybiBwZXIgImJ1ZyIsICJmZWhsZXIiIG9kZXIgInNvbm5lbmZlaGxlciIKK2dlbWVsZGV0ZSBGZWhsZXIgZ2VzcGVpY2hlcnQuCisKK0RlciBGZWhsZXJ0ZXVmZWwgZGllbnQgbnVuIGRhenUsIHNpY2ggZGllc2UgSW5mb3MgZGFyc3RlbGxlbiB6dSBsYXNzZW4uIE5hY2ggCitkZW0gQ2xvbmVuIHZvbiAvb2JqL3Rvb2xzL2ZlaGxlcnRldWZlbCBoYWJ0IGlociBmb2xnZW5kZSBNb2VnbGljaGtlaXRlbjoKKworLSBmZWhsZXJsaXN0ZSA8YXVzd2FobCBzLiBLb21tYW5kbyBmZWhsZXJtb2R1cz4KKyAgRGllc2VyIEJlZmVobCBzdGVsbHQgZXVjaCBlaW5lIExpc3RlIGFsbGVyIGJla2FubnRlbiBGZWhsZXIgZGFyLCBkaWUgdW50ZXIKKyAgZWluZXIgVUlEIGF1ZnRyYXRlbiwgZnVlciBkaWUgaWhyIHp1c3RhZW5kaWcgc2VpZCAoei5CLiAiemVzc3RyYSIsIAorICAiZC5pbnNlbG4uemVzc3RyYSIsICJHVUlMRC5tYWdpZXJwYWNrIiwgcy4gYXVjaCBRdWVyeVVJRHNGb3JXaXphcmQoKSkuIERpZQorICBMaXN0ZSB1bWZhc3N0IGRpZSBlaW5kZXV0aWdlIEZlaGxlci1JRCwgZGVuIExhZGVuYW1lbiBkZXMgZmVobGVyYXVzbG9lc2VuZGVuCisgIE9iamVrdHMgdW5kIGRpZSBVSUQuCisgIEplIG5hY2ggQXJndW1lbnQgd2VyZGVuIGRpdi4gRmVobGVyIG9kZXIgV2FybnVuZ2VuIGF1c2dlZ2ViZW4uIFdpcmQga2VpbnMgCisgIHZvbiBiZWlkZW4gYW5nZWdlYmVuLCB3aXJkIGplIG5hY2ggRWluc3RlbGx1bmcgdm9uICdmZWhsZXJtb2R1cycgYXVmZ2VsaXN0ZXQuCisKKy0gZmVobGVyYWJmcmFnZSA8aWQ+CisgIEhpZXJtaXQgbGFzc2VuIHNpY2ggZGllIERldGFpbC1JbmZvcm1hdGlvbmVuIHp1IDxpZD4gYW56ZWlnZW4uIDxpZD4gYmVrb21tdAorICBpaHIgZW50d2VkZXIgYXVzICJmZWhsZXJsaXN0ZSIgb2RlciB2b24gLWRlYnVnLy1lbnR3aWNrbHVuZy8td2FybnVuZ2VuLCBkb3J0CisgIHdlcmRlbiBkaWVzZSBJRHMgbWl0IGF1c2dlZ2ViZW4uIE9obmUgQW5nYWJlIGRlciA8aWQ+IHdpcmQgZGVyIGxldHp0ZQorICBiZXRyYWNodGV0ZSBGZWhsZXIgYXVzZ2VnZWJlbi4KKyAgTmViZW4gZGVyIG51bWVyaXNjaGVuIElEIGlzdCBoaWVyYmVpIGF1Y2ggZGllIEhhc2gtSUQgbW9lZ2xpY2guCisgIEVzIGthbm4gYXVjaCBkZXIgTGFkZW5hbWUgZWluZXMgT2JqZWt0cyBhbmdlZ2ViZW4gd2VyZGVuLCBkYW5uIHdlcmRlbiBhbGxlCisgIHp1IGRpZXNlbSBPYmpla3QgZ2Vob2VyZW5kZW4gRWludHJhZWdlIGF1ZiBlaW5tYWwgYW5nZXplaWd0LCB6LkIuCisgICAgZmVobGVyYWJmcmFnZSAvZC91bnRlcndlbHQvcmFldW1lL3dhbGQzCisgIERlciBMYWRlbmFtZSBtdXNzIG1pdCBlaW5lbSAvIGJlZ2lubmVuLgorCistIGZlaGxlcmxvZXNjaGVuIDxpZD4KKyAgRmVobGVyIG1pdCBkZXIgSUQgPGlkPiB6dW0gTG9lc2NoZW4gbWFya2llcmVuICh6LkIuIHdlbm4gZ2VmaXh0KS4gRGllIAorICBlaWdlbnRsaWNoIExvZXNjaHVuZyBmaW5kZXQgaW5uZXJoYWxiIHZvbiAyNGggc3RhdHQuIERpZSBGZWhsZXIgd2VyZGVuIG5hY2ggCisgIGRpZXNlbSBCZWZlaGwgbmljaHQgbWVociBpbiBkZXIgRmVobGVybGlzdGUgYW5nZXplaWd0LiBPaG5lIEFuZ2FiZSBkZXIgPGlkPgorICB3aXJkIGRlciBsZXR6dGUgYmVudXR6dGUgRmVobGVyIGdlbG9lc2NodC4KKyAgV2llZGVyaG9sdCBtYW4gZGVuIEJlZmVobCwgd2lyZCBkaWUgTG9lc2NobWFya2llcnVuZyB3aWVkZXIgZW50ZmVybnQuCisgIEVzIGthbm4gYXVjaCBkZXIgTGFkZW5hbWUgZWluZXMgT2JqZWt0cyBhbmdlZ2ViZW4gd2VyZGVuLCBkYW5uIHdlcmRlbiBhbGxlCisgIHp1IGRpZXNlbSBPYmpla3QgZ2Vob2VyZW5kZW4gRWludHJhZWdlIGF1ZiBlaW5tYWwgZ2Vsb2VzY2h0LCB6LkIuCisgICAgZmVobGVybG9lc2NoZW4gZC91bnRlcndlbHQvcmFldW1lL3dhbGQzCisKKy0gZmVobGVyZWluZ2FiZSA8b2JqZWt0PgorICBIaWVybWl0IGxhZXNzdCBzaWNoIHBlciBIYW5kIGVpbiBFaW50cmFnIGZ1ZXIgZGFzIGFuZ2VnZWJlbmUgT2JqZWt0IGltCisgIEZlaGxlcnRldWZlbCBlcnN0ZWxsZW4uIERhcyBPYmpla3Qga2FubiBtaXQgZWluZXIgc2VpbmVyIElEcyBvZGVyIHNlaW5lbQorICB2b2xsc3RhZW5kaWdlbiBPYmpla3RuYW1lbiBhbmdlZ2ViZW4gd2VyZGVuLiBXaXJkIGtlaW4gT2JqZWt0IGFuZ2VnZWJlbiwKKyAgd2lyZCBkaWUgVW1nZWJ1bmcgZGVzIE1hZ2llcnMgYWxzIE9iamVrdCBnZW51dHp0LiBCc3A6CisgICAgZmVobGVyZWluZ2FiZSBzZWlsCisgICAgZmVobGVyZWluZ2FlYiAvb2JqL3NlaWwjNTYzNQorCistIGZlaGxlcnJlZnJlc2gKKyAgRGVyIEZlaGxlcnRldWZlbCBoYXQgZWluZW4gWndpc2NoZW5zcGVpY2hlciBmdWVyIGRpZSBGZWhsZXJsaXN0ZS4gRGllc2VyIAorICBCZWZlaGwgbG9lc2NodCBkaWVzZW4gWndpc2NoZW5zcGVpY2hlciB1bmQgaG9sdCBkaWUgRmVobGVybGlzdGUgbmV1LgorCistIGZlaGxlcmZpbHRlcgorICBIaWVybWl0IGxhZXNzdCBzaWNoIGVpbiBGaWx0ZXIgZnVlciBVSURzIGVpbnN0ZWxsZW4uIChzLnUuKSBJc3QgZXIgYWt0aXYsIAorICB3ZXJkZW4gcGVyICdmZWhsZXJsaXN0ZScga2VpbmUgRmVobGVyIG1laHIgYW5nZXplaWd0LCBkaWUgaW0gRmlsdGVyCisgIGVpbmdldHJhZ2VuIHd1cmRlbi4KKworLSBmZWhsZXJtb2R1cyA8ZmVobGVyfHdhcm51bmdlbj4KKyAgRWluc3RlbGxlbiwgd2VsY2hlIEFydGVuIHZvbiBFaW50cmFlZ2VuIGltIEZlaGxlcnRldWZlbCB2b20gS29tbWFuZG8KKyAgJ2ZlaGxlcmxpc3RlJyBhdXNnZWdlYmVuIHdlcmRlbiBzb2xsOgorICAgIGxhdWZ6ZWl0ZmVobGVyOiBMYXVmemVpdGZlaGxlciB3ZXJkZW4gYXVzZ2VnZWJlbiAoLWRlYnVnLCAtZW50d2lja2x1bmcpCisgICAgbGF1ZnplaXR3YXJudW5nZW46IExhdWZ6ZWl0d2FybnVuZ2VuIHdlcmRlbiBhdXNnZWdlYmVuICgtd2FybnVuZ2VuKQorICAgIGxhZGV6ZWl0ZmVobGVyOiBGZWhsZXIgYmVpbSBMYWRlbiBlaW5lcyBPYmpla3RzIHdlcmRlbiBhdXNnZWdlYmVuICAKKyAgICBsYWRlemVpdHdhcm51bmdlbjogV2FybnVuZ2VuIGJlaW0gTGFkZW4gZWluZXMgT2JqZWt0cyB3ZXJkZW4gYXVzZ2VnZWJlbgorICAgIGZlaGxlcmhpbndlaXNlOiBGZWhsZXIsIGRpZSBTcGllbGVyL01hZ2llciBhYmdlc2V0enQgaGFiZW4KKyAgICBpZGVlbjogSWRlZW4sIGRpZSBTcGllbGVyL01hZ2llciBhYmdlc2V0enQgaGFiZW4KKyAgICB0eXBvczogVHlwb3MsIGRpZSBTcGllbGVyL01hZ2llciBhYmdlc2V0enQgaGFiZW4KKyAgICBtZDogRmVobGVuZGUgRGV0YWlscywgZGllIFNwaWVsZXIvTWFnaWVyIGFiZ2VzZXR6dCBoYWJlbgorICAgIGZlaGxlcjogYWxsZSBtb2VnbGljaGVuIEZlaGxlciB3ZXJkZW4gYXVzZ2VnZWJlbgorICAgIHdhcm51bmdlbjogYWxsZSBtb2VnbGljaGVuIFdhcm51bmdlbiB3ZXJkZW4gYXVzZ2VnZWJlbgorICAgIGFsbGU6IGFsbGUgRmVobGVyICsgV2FybnVuZ2VuIHdlcmRlbiBhdXNnZWdlYmVuCisgICAgCisgICAgT2huZSBBcmd1bWVudDogYWt0dWVsbGVuIE1vZHVzIGF1c2dlYmVuLgorCistIGZlaGxlcm1vbml0b3IKKyAgSGllcm1pdCBsYXNzZW4gc2ljaCBVSURzIGFuZ2ViZW4sIGRpZSBtYW4genVzYWV0emxpY2ggenUgZGVuIGVpZ2VuZW4KKyAgYXVjaCBub2NoIGJlb2JhY2h0ZW4gd2lsbC4KKyAgSGllcmJlaSBzaW5kIGF1Y2ggZWluaWdlIFVJRC1BbGlhc2UgbW9lZ2xpY2gsIHouQi4gJ21hZ2llcicsICdyZWdpb24nLCAKKyAgJ3Auc2VydmljZScsICdwJyBvZGVyICdnaWxkZScuCisgIEJUVzogbmFjaCBBZW5kZXJ1bmcgZGllc2VyIExpc3RlIHNvbGx0ZSBtYW4gImZlaGxlcnJlZnJlc2giIGF1ZnJ1ZmVuLgorCistIGZsb2NrIDxpZD4gPGJlbWVya3VuZz4KKyAgU28gbWFya2llcnRlIEZlaGxlciB3ZXJkZW4gbmljaHQgbWVociBhdXRvbWF0aXNjaCAobmFjaCAzMSBUYWdlbiBvaG5lCisgIEFlbmRlcnVuZykgZ2Vsb2VzY2h0LiBBQkVSOiBTb2xjaGVyYXJ0IGdlc3BlcnJ0ZSBGZWhsZXIgd2VyZGVuIG1vbWVudGFuCisgIF9uaWVtYWxzXyBhdXRvbWF0aXNjaCBnZWxvZXNjaHQsIGRlc2hhbGIgZGVua3QgYml0dGUgZGFyYW4sIHNpZSBlbnR3ZWRlcgorICBzZWxiZXIgenUgbG9lc2NoZW4gb2RlciBzaWUgd2llZGVyIGZyZWl6dWdlYmVuLCB3ZW5uIGlociBzaWUgbmljaHQgbWVocgorICBicmF1Y2h0LgorCistIGZ1bmxvY2sgPGlkPiA8YmVtZXJrdW5nPgorICBHaWJ0IGRlbiBGZWhsZXIgd2llZGVyIHp1bSBhdXRvbWF0aXNjaGVuIExvZXNjaGVuIGZyZWkuCisKKy0gZmZpeCA8aWQ+IDxiZW1lcmt1bmcgenVtIGZpeD4KKyAgRmVobGVyIHdpcmQgYWxzICJnZWZpeHQiIG1hcmtpZXJ0IHVuZCBlaW5lIE1haWwgYW4gYWxsZSBmdWVyIGRhcyBidWdnZW5kZQorICBPYmpla3RlIHp1c3RhZW5kaWdlbiBNYWdpZXIgZ2VzY2hpY2t0IChzb3dlaXQgYmVrYW5udCkuIEFuc2NobGllc3NlbmQgCisgIHdlcmRlbiBkaWUgRmVobGVyIHZvbSBGZWhsZXJ0ZXVmZWwgbmljaHQgbWVociBhbmdlemVpZ3QuCisgIEltIEZhbGxlIHZvbiBkdXJjaCBTcGllbGVyIGJlcmljaHRldGVuIEZlaGxlcm4gd2lyZCBkZW0gamV3ZWlsaWdlbiBTcGllbGVyCisgIGJlaW0gRml4ZW4gZWJlbmZhbGxzIGVpbmUgTWFpbCBnZXNjaGlja3QuCisgIEFscyBnZWZpeHQgbWFya2llcnRlIEZlaGxlciB3ZXJkZW4gbmFjaCBlaW5pZ2VyIFplaXQgZ2Vsb2VzY2h0LgorICBFcyBlbXBmaWVobHQgc2ljaCBmdWVyIGVpZ2VuZSBGZWhsZXIsIGRpZXNlIG5hY2ggQmVoZWJlbiBlaW5mYWNoIHp1CisgIExvZXNjaGVuLCB3ZW5uIG1hbiBrZWluZSBNYWlsIHVlYmVyIGRlbiBGZWhsZXIgZXJoYWx0ZW4gbW9lY2h0ZS4KKworLSBmdW5maXggPGlkPiA8YmVtZXJrdW5nIHdhcnVtIGRlciBCdWdmaXggc2NoZWlzc2Ugd2FyIDspPgorICBXZW5uIGlociBiaXMgenUgZGVyICJBcmNoaXZpZXJ1bmciIGdlZml4dGVyIEZlaGxlciBmZXN0c3RlbGx0LCBkYXNzIGlociBkZW4gCisgIEZlaGxlciB3b2hsIGRvY2ggbmljaHQgZ2VmaXh0IGhhYnQsIGtvZW5udCBpaHIgZGFzIHdpZWRlciBydWVja2dhZW5naWcgCisgIG1hY2hlbi4KKworLSBmbm90aXogPGlkPiA8YmVtZXJrdW5nPgorICBXZW5uIGV1Y2ggYW4gc28gZWluZW0gRmVobGVyIHdhcyBhdWZmYWVsbHQgb2RlciBpaHIgZWluZSBJZGVlIGhhYnQsIGtvZW5udCBpaHIKKyAgZGFzIHNvIGFsc28gInZlcmV3aWdlbiIuIE5vdGl6ZW4ga2FubiBqZWRlciBNYWdpZXIgYW4gRmVobGVyIGRyYW5oYWVuZ2VuLAorICBkYWZ1ZXIgYnJhdWNodCBtYW4ga2VpbmUgYmVzb25kZXJlbiAoU2NocmVpYilSZWNodGUuIERpZSBOb3RpemVuIHdlcmRlbiB2b20KKyAgRmVobGVydGV1ZmVsIGF1c2dlZ2ViZW4gdW5kIHN0ZWhlbiBhdWNoIGltIENIQU5HRUxPRy4KKyAgQW5tZXJrdW5nOiBFcyBnaWJ0IChhYnNpY2h0bGljaCkga2VpbmUgTW9lZ2xpY2hrZWl0LCBOb3RpemVuIHdpZWRlciB6dQorICBsb2VzY2hlbi4KKworLSBmdWViZXJ0cmFnZSA8aWQ+IDxuZXd1aWQ+IDxiZW1lcmt1bmc+CisgIFdlbm4gaWhyIGVpbmVuIEZlaGxlciBoYWJ0LCBmdWVyIGRlbiBpaHIgbmljaHQgenVzdGFlbmRpZyBzZWlkLCB3ZWlsIGRlcgorICBVcnNwcnVuZyBkZXMgRmVobGVycyBuaWNodCBpbiBlaW5lbSBldXJlciBGaWxlcyBsaWVndCwga29lbm50IGlociBkaWVzZW4KKyAgRmVobGVyIGFuIGVpbmUgYW5kZXJlIFVJRCBtaXQgZWluZXIgQmVtZXJrdW5nIHVlYmVydHJhZ2VuLiBEYW5hY2ggaXN0IGRlcgorICBNYWdpZXIgdm9uIDxuZXd1aWQ+IHp1c3RhZW5kaWcgdW5kIGhhdCBTY2hyZWlicmVjaHRlIGF1ZiBkZW4gRmVobGVyLgorICA8bmV3dWlkPiBrYW5uIHouQi4gc293YXMgd2llICdkLmluc2Vsbi56ZXNzdHJhJyBvZGVyICd6ZXNzdHJhJyBzZWluLiBMaWVndAorICBkZXIgRmVobGVyIGluIGVpbmVtIE9iamVrdCBpbiAvZC8sIHNvbGx0ZXQgaWhyIGF1ZiBqZWRlbiBGYWxsCisgIGQucmVnaW9uLm1hZ2llciBiZW51dHplbiwgZGFtaXQgZ2dmLiBkZXIgUk0gZGVyIFJlZ2lvbiBhdWNoIHp1c3RhZW5kaWcgd2lyZC4KKworVUlELUZpbHRlcjoKKyAgYSkgZmVobGVyZmlsdGVyIGFuCisgICAgIFNjaGFsdGV0IGRlbiBGaWx0ZXIgZWluCisgIGIpIGZlaGxlcmZpbHRlciBhdXMKKyAgICAgc2NoYWx0ZXQgZGVuIEZpbHRlciBhdXMKKyAgYykgZmVobGVyZmlsdGVyIGFsbGUKKyAgICAgc2NoYWx0ZXQgZGVuIEZpbHRlciBlaW4gX3VuZF8gc2NocmVpYnQgYWxsZSBVSURzLCBmdWVyIGRpZSBtYW4genVzdGFlbmRpZworICAgICBpc3QsIGluIGRlbiBGaWx0ZXIsIGVzIHdpcmQgZGFubiBuaWNodHMgbWVociBhbmdlemVpZ3QuCisgIGQpIGZlaGxlcmZpbHRlciBrZWluZQorICAgICBzY2hhbHRldCBkZW4gRmlsdGVyIGVpbiBfdW5kXyBsb2VzY2h0IGRlbiBGaWx0ZXIsIGQuaC4gZXMgd2lyZCB0cm90emRlbQorICAgICBlcnN0bWFsIG5vY2ggbml4IGdlZmlsdGVydC4uCisgIGUpIGZlaGxlcmZpbHRlciAremVzc3RyYSArZC5pbnNlbG4uemVzc3RyYSAtZC5lYmVuZS56ZXNzdHJhCisgICAgIEZ1ZWd0ICJ6ZXNzdHJhIiB1bmQgImQuaW5zZWxuLnplc3N0cmEiIGRlbiBha3R1ZWxsZW4gRmlsdGVyZWluc3RlbGx1bmdlbgorICAgICBoaW56dSB1bmQgbG9lc2NodCAiZC5lYmVuZS56ZXNzdHJhIiBhdXMgZGVtIEZpbHRlci4KKyAgICAgQmVsaWViaWdlIEtvbWJpbmF0aW9uZW4gbW9lZ2xpY2guIE9obmUgLSBvZGVyICsgYW0gQW5mYW5nIHdpcmQgamV3ZWlscworICAgICBpbnZlcnRpZXJ0LCBhbHNvIGhpbnp1Z2VmdWVndCwgd2VubiBub2NoIG5pY2h0IGRyaW4gdW5kIGVudGZlcm50LCB3ZW5uCisgICAgIHNjaG9uIGluIGRlciBMaXN0ZS4KKworRmVobGVyLU1vbml0b3I6CisgIGEpIGZlaGxlcm1vbml0b3Iga2VpbmUKKyAgICAgTG9lc2NodCBhbGxlIGJlb2JhY2h0ZXRlbiBVSURzCisgIGIpIGZlaGxlcm1vbml0b3IgK2F0YW11ciAtZC5wb2xhci5hdGFtdXIKKyAgICAgRnVlZ3QgImF0YW11ciIgZGVyIEJlb2JhY2h0dW5nc2xpc3RlIGhpbnp1IHVuZCBlbnRmZXJudCAiZC5wb2xhci5hdGFtdXIiLgorICAgICBCZWxpZWJpZ2UgS29tYmluYXRpb25lbiBtb2VnbGljaC4gT2huZSAtIG9kZXIgKyBhbSBBbmZhbmcgd2lyZCBqZXdlaWxzCisgICAgIGludmVydGllcnQsIGFsc28gaGluenVnZWZ1ZWd0LCB3ZW5uIG5vY2ggbmljaHQgZHJpbiB1bmQgZW50ZmVybnQsIHdlbm4KKyAgICAgc2Nob24gaW4gZGVyIExpc3RlLgorCitadWdyaWZmc3JlY2h0ZToKKyAgLSBMZXNlbiB1bmQgQW5oYWVuZ2VuIChOb3RpemVuLCBMb2VzY2hzcGVycmVuKSBkYXJmIGplZGVyIE1hZ2llcgorICAtIExvZXNjaGVuLCBGaXhlbiB1bmQgVUlEIG5ldSB6dW9yZG5lbiBkdWVyZmVuIGZ1ZXIgZGllIFVJRCB6dXN0YWVuZGlnZSBNYWdpZXIKKyAgLSBGaXhlcyB6dXJ1ZWNremllaGVuIGRhcmYgamVkZXIgTWFnaWVyIChzb2xhbmdlIGlzc3VlIG5pY2h0IGV4cGlyZWQpCisgIC0gRU0rIGR1ZXJmZW4gYWxsZXMKKworUmFuZGJlbWVya3VuZzoKKyAgTW9lY2h0ZSBtYW4gbmljaHQsIGRhc3Mgdm9tIE1hZ2llciBzZWxic3QgYXVzZ2Vsb2VzdGUgRmVobGVyIGluIC9wbGF5ZXJzLworICBwcm90b2tvbGxpZXJ0IHdlcmRlbiwga2FubiBkZXIgTWFnaWVyIF9pbiBzaWNoXyBkaWUgUHJvcCBQX0RPTlRfTE9HX0VSUk9SUworICAoYXVzIC9zZWN1cmUvZXJyb3JkLmgpIGF1ZiAxIHNldHplbi4KKyAgQUNIVFVORzogZGFzIGJlZGV1dGV0LCBkYXNzIHVlYmVyIEZlaGxlciBrZWluZSBJbmZvcm1hdGlvbmVuIG1laHIKKyAgdm9ybGllZ2VuLCBkaWUgYmVpbSBGaXhlbiBoZWxmZW4ga29lbm5lbi4gQmVkZW5rdCBkYXMgYml0dGUsIHdlbm4gaWhyIGRpZQorICBQcm9wIHNldHp0LgorIAorCitTSUVIRSBBVUNIOgorIFF1ZXJ5VUlEc0ZvcldpemFyZCgpLCBRdWVyeVdpemFyZEZvclVJRCgpCisKZGlmZiAtLWdpdCBhL2RvYy93aXovZmVybmthbXBmd2FmZmVuIGIvZG9jL3dpei9mZXJua2FtcGZ3YWZmZW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhkZDI4NQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93aXovZmVybmthbXBmd2FmZmVuCkBAIC0wLDAgKzEsMTI4IEBACitadXNhbW1lbmZhc3N1bmcgenUgRmVybmthbXBmd2FmZmVuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgU2NodXNzd2FmZmU6CisgID09PT09PT09PT09PQorICAgIFN0YW5kYXJkb2JqZWt0OiAvc3RkL3JhbmdlZF93ZWFwb24uYworCisgICAgUF9XQzogICAgICAgICAgIGdpYnQgZGVuIFNjaGFkZW4gaW0gTmFoa2FtcGYgYW4gKHdlbm4gbWFuIGRhbWl0IGF1ZiBlaW5lbgorICAgICAgICAgICAgICAgICAgICBHZWduZXIgZWlucHJ1ZWdlbHQuIERlZmF1bHQgMzAuCisgICAgUF9RVUFMSVRZOiAgICAgIG51ciBiZWltIE5haGthbXBmIHJlbGV2YW50LiBEZWZhdWx0IDEwMC4KKyAgICBQX05SX0hBTkRTOiAgICAgQm9lZ2VuIHVuZCBBcm1icnVlc3RlIHNpbmQgaW4gamVkZW0gRmFsbCB6d2VpaGFlbmRpZy4KKyAgICBQX1NIT09USU5HX1dDOiAgRGllIEJhc2lzLVdhZmZlbmtsYXNzZSBkZXIgRmVybndhZmZlLgorICAgIFBfUkFOR0U6ICAgICAgICBSZWljaHdlaXRlIGRlciBXYWZmZS4gRGVmYXVsdCA1MC4KKyAgICBQX1NUUkVUQ0hfVElNRTogQW56YWhsIGRlciBSdW5kZW4sIGRpZSB6dW0gTGFkZW4vU3Bhbm5lbiBkZXIgV2FmZmUKKyAgICAgICAgICAgICAgICAgICAgYmVub2V0aWd0IHdlcmRlbi4gRGVmYXVsdCAxLgorICAgIFBfQU1NVU5JVElPTjogICBCZW5vZXRpZ3RlciBNdW5pdGlvbnN0eXAuCisKKyAgICBFaW5lIEhpdEZ1bmMgd2lya3Qgc2ljaCBhdWYgZGllIFBfV0MgYXVzLCBuaWNodCBhdWYgUF9TSE9PVElOR19XQyEKKworICAgIE1ldGhvZGVuOgorICAgIHN0YXRpYyBpbnQgY21kX3Nob290KHN0cmluZyBzdHIpOworICAgICogQmVmZWhsc2F1c3dlcnR1bmcgdW5kIFNjaHVzc3ZvcmJlcmVpdHVuZywgd2lyZCBkdXJjaAorICAgICAgQWRkQ21kKCAoeyJzY2hpZXNzIiwgInNjaGllc3NlIn0pLCAiY21kX3Nob290Iik7CisgICAgICB2ZXJrbnVlcGZ0CisKKyAgICBzdGF0aWMgaW50IHNob290X2RhbShtYXBwaW5nIHNob290KTsKKyAgICAqIFNjaGFkZW5zZXJtaXR0bHVuZworCisgICAgc3RhdGljIHN0cmluZyBGaW5kUmFuZ2VkVGFyZ2V0KHN0cmluZyBzdHIsIG1hcHBpbmcgc2hvb3QpOworICAgICogR2VnbmVyZXJtaXR0bHVuZworCisgIE11bml0aW9uOgorICA9PT09PT09PT0KKyAgICBTdGFuZGFyZG9iamVrdDogTnV0enVuZyB2b24gL3N0ZC91bml0IGlzdCBlbXBmb2hsZW4KKworICAgIFBfU0hPT1RJTkdfV0M6IGxlZ3QgZGllIE11bml0aW9uc3N0YWVya2UgZmVzdAorICAgIFBfREFNX1RZUEU6ICAgIGxlZ3QgZGllIFNjaGFkZW5zYXJ0IGRlcyBTY2h1c3NhbmdyaWZmcyBmZXN0CisKKyAgICBFaW5lIEhpdEZ1bmMgaW4gZGVyIE11bml0aW9uIHdpcmt0IHNpY2ggYXVmIFBfU0hPT1RJTkdfV0MgYXVzIQorCisgIEFsbGdlbWVpbmVzOgorICA9PT09PT09PT09PT0KKyAgICBJbiBkZXIgV2FmZmUgbGVndCBtYW4gdWViZXIgUF9BTU1VTklUSU9OIGZlc3QsIHdlbGNoZSBBcnQgTXVuaXRpb24KKyAgICBkYW1pdCB2ZXJzY2hvc3NlbiB3ZXJkZW4ga2Fubi4gSW4gZGVyIE11bml0aW9uIG11c3MgZGllc2UgTXVuaXRpb24KKyAgICBhdWNoIGFscyBJRCBnZXNldHp0IHdlcmRlbi4KKworICAgIFVlYmVyIFBfU1RSRVRDSF9USU1FIGxlZ3QgbWFuIGZlc3QsIGFsbGUgd2lldmllbCBSdW5kZW4gZGllCisgICAgRmVybmthbXBmd2FmZmUgYWJnZWZldWVydCB3ZXJkZW4ga2FubiAoZGVmYXVsdDogMSkuCisKKyAgICBEZXIgdmVydXJzYWNodGUgU2NoYWRlbiB3aXJkIGF1cyBkZXIgU3RhZXJrZSBkZXIgRmVybmthbXBmd2FmZmUKKyAgICB1bmQgZGVyIFN0YWVya2UgZGVyIE11bml0aW9uIGJlc3RpbW10LiBJbiBiZWlkZW4gd2lyZCBkaWVzZSBpbiBkZXIKKyAgICBQcm9wZXJ0eSBQX1NIT09USU5HX1dDIGFuZ2VnZWJlbi4KKworICAgIFp1c2FldHpsaWNoIGthbm4gbWFuIGluIFBfUkFOR0UgZGllIFJlaWNod2VpdGUgZGVyIEZlcm5rYW1wZndhZmZlCisgICAgZmVzdGxlZ2VuLiBIYXQgbWFuIGVpbmVuIFJhdW0gQSwgZGVyIHNpY2ggaW5uZXJoYWxiIGVpbmVzIGFuZGVyZW4KKyAgICBSYXVtZXMgYmVmaW5kZXQgKHouQi4gVHJhbnNwb3J0ZXIpLCBzbyBrYW5uIG1hbiBtaXR0ZWxzIFBfU0hPT1RJTkdfQVJFQQorICAgIGRlc3NlbiAnR3JvZXNzZScgZmVzdGxlZ2VuLiBNaXQgZWluZXIgV2FmZmUsIGRlcmVuIFBfUkFOR0UgbWluZGVzdGVucworICAgIGdsZWljaCBkaWVzZW0gWmFobGVud2VydCBpc3QsIGthbm4gYXVzIGRpZXNlbSBSYXVtIGhlcmF1cyBnZXNjaG9zc2VuCisgICAgd2VyZGVuLgorICAgIEFsdGVybmF0aXYga2FubiBtYW4gaW4gQSBlaW5lbiBhbmRlcmVuIFJhdW0gQilpbiBkaWUgUHJvcGVydHkKKyAgICBQX1RBUkdFVF9BUkVBIHNjaHJlaWJlbi4KKworQkVJU1BJRUw6CisgICAgLy8gIzEgc2llaGUgYXVjaCAvZG9jL2JlaXNwaWVsZS9mZXJud2FmZmVuIGZ1ZXIgbGFkYmFyZW4gQ29kZQorCisgICAgLy8gIzIgZWluZSBlaW5mYWNoZSwgYWJlciBndXRlIFNjaGxldWRlcgorICAgIGluaGVyaXQgIi9zdGQvcmFuZ2VkX3dlYXBvbiI7CisKKyAgICB2b2lkIGNyZWF0ZSgpIHsKKyAgICAgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgICAgICA6OmNyZWF0ZSgpOworCisgICAgICBTZXRQcm9wKFBfU0hPUlQsICJFaW5lIFNjaGxldWRlciIpOworICAgICAgU2V0UHJvcChQX0lORk8sCisgICAgICAgICJEaWUgU3ludGF4IGxhdXRldDogc2NobGV1ZGVyIDxnZXNjaG9zcz4gYXVmIDx6aWVsPlxuIik7CisgICAgICAvLyBzb25zdGlnZSBPYmpla3Rwcm9wcyAuLi4KKworICAgICAgUmVtb3ZlQ21kKCh7InNjaGllc3MiLCAic2NoaWVzc2UifSkpOyAvLyBlbnRmZXJuZSBEZWZhdWx0LUtvbW1hbmRvCisgICAgICBBZGRDbWQoKHsic2NobGV1ZGVyIiwgInNjaGxldWRlcmUifSksICMnY21kX3Nob290KTsKKworICAgICAgU2V0UHJvcChQX1dDLCAxMCk7ICAgICAgICAgIC8vIGVpbmUgU2NobGV1ZGVyIGlzdCBlcnN0bWFsIGhhcm1sb3MKKyAgICAgIFNldFByb3AoUF9EQU1fVFlQRSwgRFRfV0hJUCk7CisKKyAgICAgIFNldFByb3AoUF9TSE9PVElOR19XQywgOTApOyAvLyB6aWVtbGljaCBndXRlIFNjaGxldWRlcgorICAgICAgU2V0UHJvcChQX05SX0hBTkRTLCAxKTsgICAgIC8vIGVpbmhhZW5kaWcKKyAgICAgIFNldFByb3AoUF9XRUFQT05fVFlQRSwgV1RfUkFOR0VEX1dFQVBPTik7CisgICAgICBTZXRQcm9wKFBfQU1NVU5JVElPTiwgTVVOX1NUT05FKTsKKyAgICAgIFNldFByb3AoUF9TVFJFVENIX1RJTUUsIDEpOworICAgICAgU2V0UHJvcChQX1JBTkdFLCAzMCk7ICAgICAgIC8vIDMwIHdlaXQga2FubiBtYW4gZGFtaXQgbnVyIHNjaGxldWRlcm4KKyAgICB9CisKKyAgICAvLyAjMyBwYXNzZW5kZSBNdW5pdGlvbgorICAgIGluaGVyaXQgIi9zdGQvdW5pdCI7CisKKyAgICB2b2lkIGNyZWF0ZSgpIHsKKyAgICAgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgICAgICA6OmNyZWF0ZSgpOworCisgICAgICBTZXRQcm9wKFBfTkFNRSwgKHsiU2NobGV1ZGVyc3RlaW4iLCAiU2NobGV1ZGVyc3RlaW5lIn0pICk7CisgICAgICBTZXRQcm9wKFBfTE9ORywgYnJlYWtfc3RyaW5nKAorICAgICAgICAiSGVydm9ycmFnZW5kIGdlZm9ybXRlIFNjaGxldWRlcnN0ZWluZSBhdXMgTXVybWVsbml0LiIsIDc4KSk7CisgICAgICBTZXRQcm9wKFBfR0VOREVSLCBNQUxFKTsKKyAgICAgIFNldFByb3AoUF9BTU9VTlQsIDEpOworICAgICAgU2V0UHJvcChQX1NIT09USU5HX1dDLCA1MCk7CisgICAgICBTZXRQcm9wKFBfREFNX1RZUEUsICh7RFRfQkxVREdFT059KSk7CisgICAgICBTZXRQcm9wKFBfV0VBUE9OX1RZUEUsIFdUX0FNTVUpOworICAgICAgU2V0UHJvcChQX01BVEVSSUFMLCBNQVRfU1RPTkUpOworCisgICAgICBTZXRHcmFtc1BlclVuaXRzKDYwLDEpOworICAgICAgU2V0Q29pbnNQZXJVbml0cygyNSwxKTsKKworICAgICAgQWRkSWQoTVVOX1NUT05FKTsKKyAgICAgIEFkZFNpbmd1bGFySWQoKHsic3RlaW4iLCAic2NobGV1ZGVyc3RlaW4ifSkpOworICAgICAgQWRkUGx1cmFsSWQoKHsic3RlaW5lIiwgInNjaGxldWRlcnN0ZWluZSJ9KSk7CisgICAgICBBZGRDbGFzcyhDTF9BTU1VTklUSU9OKTsKKyAgICB9CisKK1NJRUhFIEFVQ0g6CisgICAgR2VuZXJlbGw6ICBQX1NIT09USU5HX1dDLCBQX1NUUkVUQ0hfVElNRSwgUF9BTU1VTklUSU9OCisgICAgTWV0aG9kZW46ICBGaW5kUmFuZ2VkVGFyZ2V0KEwpLCBzaG9vdF9kYW0oTCkKKyAgICBHZWJpZXQ6ICAgIFBfUkFOR0UsIFBfU0hPT1RJTkdfQVJFQSwgUF9UQVJHRVRfQVJFQQorICAgIFdhZmZlbjogICAgUF9XRUFQT05fVFlQRSwgUF9XQywgUF9FUVVJUF9USU1FLCBQX05SX0hBTkRTCisgICAgS2FtcGY6ICAgICBBdHRhY2soTCksIERlZmVuZChMKSwgUF9ESVNBQkxFX0FUVEFDSywgUF9BVFRBQ0tfQlVTWQorICAgIFRlYW06ICAgICAgUHJlc2VudFBvc2l0aW9uKEwpCisgICAgU29uc3RpZ2VzOiBQX05PR0VUCisgICAgQmFsYW5jZTogICBmZXJud2FmZmVuLCB3YWZmZW4sIGJhbGFuY2UKKworMjkuSnVsIDIwMTQgR2xvaW5zb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2Mvd2l6L2Zlcm53YWZmZW4gYi9kb2Mvd2l6L2Zlcm53YWZmZW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ3YzUxNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93aXovZmVybndhZmZlbgpAQCAtMCwwICsxLDExOCBAQAorCisgRkVSTldBRkZFTgorCisgIGEuIEFsbGdlbWVpbmVzCisgICAgIEZlcm53YWZmZW4gc2luZCBlaW5lIHJlbGF0aXYgbmV1ZSBFcmdhZW56dW5nIHp1bSBLYW1wZnN5c3RlbSBkaWVzZXMgTXVkcywgCisgICAgIGRpZSBtaXQgZGVyIEVpbmZ1ZWhydW5nIGRlcyBUZWFta2FtcGZlcyBlcnN0IG1vZWdsaWNoIHd1cmRlLgorICAgICBTY2hvbiBiaXNoZXIgZ2FiIGVzIGVpbnplbG5lIEZlcm53YWZmZW4gKHouQi4gUm9iaW5zIEJvZ2VuKSwgZGllIGFiZXIKKyAgICAgSW5zZWxsb2VzdW5nZW4gdW5kIFNvbmRlcmZhZWxsZSB3YXJlbi4gRGFzIG5ldWUgU3RhbmRhcmRvYmpla3QgZnVlciAKKyAgICAgRmVybndhZmZlbiBpc3QgbnVuIC9zdGQvcmFuZ2VkX3dlYXBvbi5jLCBkYXMgZGllIG5vZXRpZ2UgRnVua3Rpb25hbGl0YWV0IAorICAgICBiaWV0ZXQgdW5kIGxlaWNodCB1ZWJlciBQcm9wZXJ0aWVzIHp1IGtvbmZpZ3VyaWVyZW4gaXN0LiBNaXQgRmVybndhZmZlbiAKKyAgICAgc2luZCB1ZWJyaWdlbnMgYXVzbmFobXNsb3MgV2FmZmVuIGdlbWVpbnQsIGRpZSBNdW5pdGlvbiBiZW5vZXRpZ2VuLCAKKyAgICAgbmljaHQgZXR3YSBTcGVlcmUgb2RlciBkZXJnbGVpY2hlbi4KKworICAqKiBCaXNoZXIgc2luZCBhbGxlIEZlcm53YWZmZW4gYXVzbmFobXNsb3MgZ2VuZWhtaWd1bmdzcGZsaWNodGlnLCBkYXMgICoqCisgICoqIGdpbHQgYXVjaCBmdWVyIGplZ2xpY2hlIE11bml0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioKKyAgICAgCisgIGIuIFByb3BlcnRpZXMKKyAgICAgUF9XQworICAgICAgICBWb3JzaWNodCBtaXQgZGllc2VyIFByb3BlcnR5LiBCZWkgRmVybndhZmZlbiBnaWJ0IHNpZSBfbnVyXyBkZW4KKyAgICAgICAgU2NoYWRlbiBiZWkgWndlY2tlbnRmcmVtZHVuZyBkZXIgV2FmZmUgYWxzIEtudWVwcGVsIGFuLiAKKyAgICAgICAgRGVtZW50c3ByZWNoZW5kIGlzdCBkaWVzZXIgV2VydCBleHRyZW0gbmllZHJpZyB6dSBoYWx0ZW4uCisgICAgICAgIFN0YW5kYXJkd2VydCBpc3QgaGllciAzMCwgZGVyIGF1Y2ggbnVyIGluIEF1c25haG1lZmFlbGxlbiAKKyAgICAgICAgdWViZXJzY2hyaXR0ZW4gd2VyZGVuIHNvbGx0ZS4gS2F1bSBlaW5lIEFybWJydXN0IG9kZXIgZWluIEJvZ2VuIAorICAgICAgICB0YXVndCBudW5tYWwgYWxzIGdyb3NzYXJ0aWdlIE5haGthbXBmd2FmZmUuCisKKyAgICAgUF9RVUFMSVRZCisgICAgICAgIFdpcmQgbnVyIGJlaW0gTmFoa2FtcGYgbWl0IGRlciBXYWZmZSBiZWFjaHRldC4gU3RhbmRhcmRtYWVzc2lnIGF1ZgorICAgICAgICAxMDAgZ2VzZXR6dCwgZGEgQm9lZ2VuIHVuZCBBcm1icnVlc3RlIGxlaWNodCBiZXNjaGFlZGlndCB3ZXJkZW4sCisgICAgICAgIHdlbm4gbWFuIGRhbWl0IGF1ZiBqZW1hbmRlbiBlaW5wcnVlZ2VsdC4KKworICAgICBQX0hJVF9GVU5DIAorICAgICAgICBIaXRGdW5jIGZ1ZXIgZGVuIF9OYWhrYW1wZl8uIEhhdCBiZWltIFNjaHVzcyBtaXQgZGVyIFdhZmZlIGtlaW5lbgorICAgICAgICBFaW5mbHVzcy4gCisgICAgICAgICAgICAgICAgCisgICAgIFBfTlJfSEFORFMKKyAgICAgICAgQm9lZ2VuIHVuZCBBcm1icnVlc3RlIHNpbmQgaW4gamVkZW0gRmFsbCB6d2VpaGFlbmRpZy4gRWluaGFlbmRpZ2UKKyAgICAgICAgRmVybndhZmZlbiBzaW5kIGFiZXIgZGVua2JhciAoU2NobGluZ2VuIHp1bSBTY2hsZXVkZXJuIGtsZWluZXIgCisgICAgICAgIFN0ZWluZSB6LkIuKQorICAgICAgICAKKyAgICAgUF9TSE9PVElOR19XQworICAgICAgICBEaWUgQmFzaXMtV2FmZmVua2xhc3NlIGRlciBGZXJud2FmZmUuIFp1IGlociB3aXJkIGRpZSBXYWZmZW5rbGFzc2UKKyAgICAgICAgZGVyIE11bml0aW9uIGFkZGllcnQsIHVtIGRlbiBlbmRndWVsdGlnZW4gQW5ncmlmZnN3ZXJ0IGJlaW0gU2NodXNzCisgICAgICAgIHp1IGJlcmVjaG5lbi4KKyAgICAgCisgICAgIFBfUkFOR0UgCisgICAgICAgIFJlaWNod2VpdGUgZGVyIFdhZmZlIGluIE1ldGVybi4gV2ljaHRpZywgd2VubiBhdXMgQ29udGFpbmVybiAKKyAgICAgICAgKFdhY2h0dWVybWVuLCBTY2hpZmZlbiwgZXRjLikgbmFjaCBhdXNzZW4gZ2VzY2hvc3NlbiB3aXJkLgorICAgICAgICBEYW1pdCBkYXMgZnVua3Rpb25pZXJ0LCBtdXNzIGRpZXNlciBXZXJ0IGhvZWhlciBzZWluIGFscyBkZXIKKyAgICAgICAgaW0gQ29udGFpbmVyIGRlZmluaWVydGUgKHN0ZWh0IGRvcnQgaW4gZGVyIFBfU0hPT1RJTkdfQVJFQSkuCisgICAgCisgICAgIFBfU1RSRVRDSF9USU1FCisgICAgICAgIEFuemFobCBkZXIgUnVuZGVuLCBkaWUgenVtIExhZGVuL1NwYW5uZW4gZGVyIFdhZmZlIGJlbm9ldGlndAorICAgICAgICB3ZXJkZW4uIDEgaXN0IGhpZXIgZGVyIFN0YW5kYXJkd2VydCwgZGFzIGJlZGV1dGV0LCBlcyBrYW5uIGplZGUKKyAgICAgICAgUnVuZGUgZ2VzY2hvc3NlbiB3ZXJkZW4uCisgICAgIAorICAgICBQX0FNTVVOSVRJT04KKyAgICAgICAgQmVub2V0aWd0ZXIgTXVuaXRpb25zdHlwLiBIaWVyIGlzdCBlaW5lIGRlciBtb2VnbGljaGVuIEtvbnN0YW50ZW4KKyAgICAgICAgKE1VTl8qKSBlaW56dXNldHplbiAoei5CLiBNVU5fQVJST1cgZnVlciBCb2VnZW4pLgorICAgICAKKyAgICAgUF9OT0dFVAorICAgICAgICBIYXQgYmVpIEZlcm53YWZmZW4gZWluZSB6dXNhZXR6bGljaGUgQmVkZXV0dW5nLiBXZW5uIGdlc2V0enQsIG11c3MKKyAgICAgICAgZGllIFdhZmZlbiBuaWNodCBnZXp1ZWNrdCB3ZXJkZW4sIHVtIHNpZSBhYmZldWVybiB6dSBrb2VubmVuLiBEYXMKKyAgICAgICAgaXN0IHouQi4gZnVlciBLYXRhcHVsdGUgZ2VkYWNodCwgZGllIGltIFJhdW0gc3RlaGVuLgorICAgICAgICAKKyAgICAgRnVlciBkaWUgTXVuaXRpb24gZ2lidCBlcyBrZWluIFN0YW5kYXJkb2JqZWt0LiBXaWNodGlnIGlzdCBudXIsIGRhc3MgCisgICAgIGRpZSBlbnRzcHJlY2hlbmRlbiBQcm9wZXJ0aWVzIGdlc2V0enQgc2luZC4gTm9ybWFsZXJ3ZWlzZSBzb2xsdGUgZGllIAorICAgICBNdW5pdGlvbiBuYXR1ZXJsaWNoIGVpbmUgVW5pdCBzZWluLCBhYmVyIGF1Y2ggRWluemVsb2JqZWt0ZSAoZWluCisgICAgIGJlc29uZGVyZXIgUGZlaWwgb2RlciBlaW4gZ3Jvc3NlciBTdGVpbiBmdWVyIGVpbiBLYXRhcHVsdCkgc2luZCAKKyAgICAgbW9lZ2xpY2guCisKKyAgICAgUHJvcGVydGllcyBmdWVyIGRpZSBNdW5pdGlvbiBzaW5kOgorICAgICAKKyAgICAgUF9TSE9PVElOR19XQworICAgICAgICBEaWUgV2FmZmVua2xhc3NlIGRlciBNdW5pdGlvbi4gV2lyZCB6dXIgV0MgZGVyIFdhZmZlIGFkZGllcnQuCisgICAgICAgIAorICAgICBQX0RBTV9UWVBFCisgICAgICAgIFNjaGFkZW5zdHlwIGRlciBNdW5pdGlvbi4gU29sbHRlIG5vcm1hbGVyd2Vpc2UgRFRfUElFUkNFIGZ1ZXIgCisgICAgICAgIFBmZWlsZSBhbGxlciBBcnQgdW5kIERUX0JMVURHRU9OIGZ1ZXIgc3R1bXBmZSBNdW5pdGlvbiB3aWUgU3RlaW5lCisgICAgICAgIHNlaW4uIE1hZ2lzY2hlIFNjaGFkZW5zYXJ0ZW4gc2luZCBhYmVyIG5hdHVlcmxpY2ggbW9lZ2xpY2guCisgICAgICAgIAorICAgICBQX0hJVF9GVU5DCisgICAgICAgIEhpdEZ1bmMsIGRpZSBiZWltIFNjaHVzcyBtaXQgZGVyIE11bml0aW9uIGJlbnV0enQgd2lyZC4KKyAgICAgICAgCisgICAgIEF1c3NlcmRlbSBtdXNzIGluIGRlciBNdW5pdGlvbiBtaXR0ZWxzIEFkZElkKCkgZGVyIGVudHNwcmVjaGVuZGUKKyAgICAgTXVuaXRpb25zdHlwIGdlc2V0enQgd2VyZGVuLCB6LkIuIE1VTl9BUlJPVy4KKworICBjLiBTcGV6aWFsd2FmZmVuL0Zlcm53YWZmZW4gbWl0IFNvbmRlcmZ1bmt0aW9uZW4KKyAgCisgICAgIFNpZWhlIEhpbndlaXNlIHp1IGVudHNwcmVjaGVuZGVuIE5haGthbXBmd2FmZmVuLgorICAgICAKKyAgZC4gR2VuZWhtaWd1bmdzZ3JlbnplbgorICAgICBBbGxlIFdhZmZlbiBkaWVzZXIgQXJ0IHNpbmQgZ3J1bmRzYWV0emxpY2ggZ2VuZWhtaWd1bmdzcGZsaWNodGlnLgorICAgICBGb2xnZW5kZSBXZXJ0ZSBzb2xsdGVuIGFsbGVyZGluZ3MgT2JlcmdyZW56ZW4gZGFyc3RlbGxlbiwgZGllCisgICAgIGltIE5vcm1hbGZhbGwgbmljaHQgenUgVWViZXJzY2hyZWl0ZW4gc2luZDoKKyAgICAgCisgICAgIFdhZmZlIGthbm4gamVkZSBSdW5kZSBhYmdlZmV1ZXJ0IHdlcmRlbjogIFBfU0hPT1RJTkdfV0MgMTAwCisgICAgIFdhZmZlIGJyYXVjaHQgZWluZSBMYWRlemVpdCAgICAgICAgICAgIDogIFBfU0hPT1RJTkdfV0MgMTMwCisgICAgIAorICAgICBEaWUgT2JlcmdyZW56ZSBmdWVyIE11bml0aW9uIGxpZWd0IGJlaSA6ICBQX1NIT09USU5HX1dDIDYwLgorCisgIGUuIE5hY2hiZW1lcmt1bmcKKyAgICAgU2VpZCBiaXR0ZSB2b3JzaWNodGlnIG1pdCBQX1NIT09USU5HX0FSRUEgaW4gUmFldW1lbi9Db250YWluZXJuLiAKKyAgICAgQmlzaGVyIGlzdCBkaWVzZXMgU2NoaWVzc2VuIHZvbiBSYXVtIHp1IFJhdW0gd2VpdGVzdGdlaGVuZCB1bmdldGVzdGV0LAorICAgICB1bmQgZXMgaXN0IG5pY2h0IGtsYXIsIHdlbGNoZSBQcm9ibGVtZSBkYXMgdmVydXJzYWNoZW4ga2Fubi4gV2VubiAKKyAgICAgZXZlbnR1ZWxsZSBaaWVsZSBrZWluZSBNb2VnbGljaGtlaXQgaGFiZW4sIHNpY2ggenUgd2VocmVuIG9kZXIgCisgICAgIHdlZ3p1bGF1ZmVuLCBpc3Qgc2NobmVsbCBqZWdsaWNoZSBCYWxhbmNlIGRhaGluLiBEaWUgUmVnaW9uc21hZ2llcgorICAgICBoYWJlbiBiZWkgQWJuYWhtZSB2b24gR2ViaWV0ZW4gZGFyYXVmIHp1IGFjaHRlbiwgZGFzcyBkaWVzZSBQcm9wZXJ0eQorICAgICBudXIgaW4gd2VuaWdlbiwgZ3V0IGJlZ3J1ZW5kZXRlbiBSYWV1bWVuIGdlc2V0enQgd2lyZC4KKyAgCisgU0lFSEUgQVVDSAorCisgICAgIGJhbGFuY2UsIHJ1ZXN0dW5nZW4sIHdhZmZlbiwgdW5pcXVlcywgbnBjcywgZ3Jlbnp3ZXJ0ZSwKKyAgICAgYXR0cmlidXRzdmVyYWVuZGVydW5nZW4sIHJlc2lzdGVuemVuLCBrYW1wZm9iamVrdGUsCisgICAgIGZlcm5rYW1wZndhZmZlbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIERvbiwgMTAuMDguMjAwMCwgMjI6MzA6MDAgdm9uIFBhcmFjZWxzdXMKZGlmZiAtLWdpdCBhL2RvYy93aXovZm9vZCBiL2RvYy93aXovZm9vZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OThlM2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dpei9mb29kCkBAIC0wLDAgKzEsMjIzIEBACitGT09ELCBEUklOSyAmIEFMQ09IT0wKKz09PT09PT09PT09PT09PT09PT09PQorCisgICAgRXMgd2lyZCBlbXBmb2hsZW4sIGplZGUgdHJhZ2JhcmUgSGVpbHVuZyB1ZWJlciAiL3N0ZC9mb29kIgorICAgIHp1IGltcGxlbWVudGllcmVuLiBIaWVyIGJyYXVjaHQgbWFuIG51ciB3ZW5pZ2UgUHJvcGVydGllcyBzZXR6ZW4sIHVtCisgICAgc2ljaGVyenVnZWhlbiwgZGFzcyBkaWUgSGVpbHVuZyBrb3JyZWt0IHZlcmxhZXVmdC4KKworICAgIEJpdHRlIGJlaSBkZXIgUmVhbGlzaWVydW5nIHZvbiB0cmFnYmFyZW4gVGFua2VuIElNTUVSIG1pdCBkZXIgQmFsYW5jZQorICAgIHNwcmVjaGVuLiBEaWUgSGVpbHVuZyB1bnRlcmxpZWd0IGdlbmF1ZXIgS29udHJvbGxlLiBFd2lnIGhhbHRiYXJlIFNwZWlzZW4KKyAgICBzaW5kIHNvd2llc28gZ2VuZWhtaWd1bmdzcGZsaWNodGlnIHVuZCBudXIgbWl0IGd1dGVyIEJlZ3J1ZW5kdW5nIHVuZAorICAgIHN0cmVuZ2VuIEF1ZmxhZ2VuIGVybGF1YnQuCisKK0ZFQVRVUkVTOgorICAgIFVudGVyc3R1ZXR6dCB3aXJkIGRhcyBLb25zdW1pZXJlbiB2b24gU3BlaXNlbiBwZXIgRXNzZW4gb2RlciBUcmlua2VuIGF1Y2gKKyAgICBpbiBtZWhyZXJlbiBQb3J0aW9uZW4uIERpZSBTcGVpc2VuIHZlcmRlcmJlbiB1bmQgd2VyZGVuIHZlcm5pY2h0ZXQuCisgICAgRXMgc2luZCBMZWJlbnNtaXR0ZWwgbWl0IEJlaGFlbHRlciBtb2VnbGljaCwgc28gZGFzcyBkaWVzZXIgbGVlcgorICAgIHp1cnVlY2tibGVpYnQsIHdlbm4gZGVyIEluaGFsdCBnZWdlc3NlbiBvZGVyIHZlcm5pY2h0ZXQgd3VyZGUuCisgICAgRGllIFdpcmt1bmcgdm9uIFNwZWlzZW4ga2FubiBuZWJlbiBkZXIgWnVmdWVocnVuZyB2b24gTGViZW5zLSB1bmQgS29uemVuLQorICAgIHRyYXRpb25zcHVua3RlbiBlcndlaXRlcnQgd2VyZGVuLiBEaWUgV2lya3VuZyB2ZXJkb3JiZW5lciBTcGVpc2VuIGthbm4gCisgICAgZ2V0cmVubnQgZGVmaW5pZXJ0IHdlcmRlbi4KKyAgICBXZXJ0IHVuZCBHZXdpY2h0IGRlciBTcGVpc2Ugd2VyZGVuIGluIEFiaGFlbmdpZ2tlaXQgZGVyIFJlc3RtZW5nZW4gaW1tZXIKKyAgICBrb3JyZWt0IGJlcmVjaG5ldC4KKworUkVBTElTSUVSVU5HOgorICAgIERpZSBSZWFsaXNpZXJ1bmcgZGVyIFRpbWVyIGxhZXVmdCB1ZWJlciBkaWUgUmVzZXRzIGRlciBTcGVpc2UuIENhbGxvdXRzCisgICAgd2VyZGVuIGxlZGlnbGljaCB2ZXJ3ZW5kZXQsIHVtIGRlbiBBdWZydWYgZGVzIFJlc2V0cyB6dSBnYXJhbnRpZXJlbi4KKyAgICBFcyB3aXJkIGF1Y2ggZ2VwcnVlZnQsIGRhc3MgZGVyIEF1ZnJ1ZiBkZXIgUmVzZXRzIHBlciBIYW5kIG5pY2h0cworICAgIGR1cmNoZWluYW5kZXIgYnJpbmd0LgorCisgICAgRGVzIFdlaXRlcmVuIGlzdCBzaWNoZXJnZXN0ZWxsdCwgZGFzcyBkZXIgU3BpZWxlciBuaWNodCBtaXQgRnV0dGVyIGluCisgICAgQmVydWVocnVuZyBrb21tdCwgZGVzc2VuIFRpbWVyIHp1bSBWZXJkZXJiZW4gaW5pdGlhbGlzaWVydCBpc3QuCisKKyAgICBEYXMgS29uemVwdCBpc3QgZGVtIEhlaWx1bmdza29uemVwdCBkZXIgS25laXBlbiBhbmdlcGFzc3Qgd29yZGVuLgorICAgIERlbSBlbnRzcHJlY2hlbmQgc2luZCBkaWUgUHJvcGVydGllcyBzZWhyIGFlaG5saWNoLgorCitQUk9QRVJUSUVTOgorCisgICAgICBQX1BPUlRJT05TIDogQW56YWhsIGRlciBQb3J0aW9uZW4gKHdpZSBvZnQga2FubiBtYW4gYWJiZWlzc2VuIC8gCisgICAgICAgICAgICAgICAgICAgZWluZW4gU2NobHVjayBuZWhtZW4pCisKKyAgICAgICAgICBQX0ZPT0QgOiBGdWVsbGdyYWQgZGVyIFNwZWlzZSBwcm8gUG9ydGlvbiwgbXVzcyBnZXNldHp0IHNlaW4sIHdlbm4KKyAgICAgICAgICAgICAgICAgICBQX0RSSU5LIG5pY2h0IGdlc2V0enQgaXN0CisgICAgICAgICBQX0RSSU5LIDogRnVlbGxncmFkIGRlciBGbHVlc3NpZ2tlaXQgcHJvIFBvcnRpb24sIG11c3MgZ2VzZXR6dCBzZWluLAorICAgICAgICAgICAgICAgICAgIHdlbm4gUF9GT09EIG5pY2h0IGdlc2V0enQgaXN0CisgICAgICAgUF9BTENPSE9MIDogQWxrb2hvbGxldmVsIHBybyBQb3J0aW9uIAorCisgICAgICAgIFBfV0VJR0hUIDogR2V3aWNodCBwcm8gUG9ydGlvbiAoYmVpIFF1ZXJ5UHJvcChQX1dFSUdIVCkgd2lyZCBkYXMKKyAgICAgICAgICAgICAgICAgICBrb21wbGV0dGUgR2V3aWNodCBhbGxlciBQb3J0aW9uZW4gKyBldmVudHVlbGwgQmVoYWVsdGVyIAorICAgICAgICAgICAgICAgICAgIHp1cnVlY2tnZWdlYmVuKQorICAgICAgICAgUF9WQUxVRSA6IFdlcnQgcHJvIFBvcnRpb24gIChiZWkgUXVlcnlQcm9wKFBfVkFMVUUpIHdpcmQgZGVyCisgICAgICAgICAgICAgICAgICAga29tcGxldHRlIFdlcnQgYWxsZXIgUG9ydGlvbmVuICsgZXZlbnR1ZWxsIEJlaGFlbHRlciAKKyAgICAgICAgICAgICAgICAgICB6dXJ1ZWNrZ2VnZWJlbikKKworICAgICAgICAgICAgUF9IUCA6IEFuemFobCBkZXIgTFAsIGRpZSBwcm9wIFBvcnRpb24gZ2VoZWlsdC9nZXNjaHdhZWNodCB3ZXJkZW4KKyAgICAgICAgICAgIFBfU1AgOiBBbnphaGwgZGVyIEtQLCBkaWUgcHJvcCBQb3J0aW9uIGdlaGVpbHQvZ2VzY2h3YWVjaHQgd2VyZGVuCisgIFBfRElTVFJJQlVUSU9OIDogVmVydGVpbHVuZyBkZXIgSGVpbHVuZyBhdWYgZGllIEhlYXJ0YmVhdHMKKyAgICAgICAgICAgICAgICAgICAoc2llaGUgSGlsZmUgenUgSF9ESVNUUklCVVRJT04gaW4gY29uc3VtZSkKKworICAgICAgUF9MSUZFVElNRSA6IFplaXQgaW4gU2VrdW5kZW4sIGJpcyBkaWUgU3BlaXNlIHZlcmRpcmJ0ICg+MCkKKyAgICAgICAgICAgICAgICAgICBaYWVobHQgYWIgZGVyIGVyc3RlbiBJbmJlc2l0em5haG1lIGR1cmNoIGVpbmVuIFNwaWVsZXIKK1BfUkVTRVRfTElGRVRJTUUgOiBaZWl0IGluIFJlc2V0cywgYmlzIGRpZSBTcGVpc2UgdmVyZGlyYnQgKD4wKQorICAgICAgICAgICAgICAgICAgIERpZSBMYWVuZ2UgZGVyIGVpbnplbG5lbiBSZXNldHMgd2lyZCB3aWUgdWVibGljaCBiZXJlY2huZXQKKyAgICAgICAgICAgICAgICAgICB1bmQgUF9MSUZFVElNRSBlbnRzcHJlY2hlbmQgYXVmIGR1cmNoc2Nobml0dGxpY2gKKyAgICAgICAgICAgICAgICAgICBQX1JFU0VUX0xJRkVUSU1FICogNDUgKiA2MCBnZXNldHp0LgorICAgICAgICAgICAgICAgICAgIChleGlzdGllcnQsIGRhIGJpc2hlciBtZWlzdGVucyBpbiBSZXNldHMgZ2VyZWNobmV0IHd1cmRlKQorICAgICAgICAgICAgICAgICAgIFNvbGx0ZSBzaW5udm9sbGVyd2Vpc2UgbnVyIGFscyBTZXRQcm9wKFBfUkVTRVRfTElGRVRJTUUpCisgICAgICAgICAgICAgICAgICAgdmVyd2VuZGV0IHdlcmRlbiwga2FubiBhYmVyIGF1Y2ggYWJnZWZyYWd0IHdlcmRlbgorCisgICBQX0VNUFRZX1BST1BTIDogTWFwcGluZyBtaXQgV2VydGVuIGRlcyBCZWhhZWx0ZXJzCisgICAgICAgICAgICAgICAgICAgQWxsZSBoaWVyIGFuZ2VnZWJlbmVuIFdlcnRlIChhdXNzZXIgUF9QT1JUSU9OUykgd2VyZGVuCisgICAgICAgICAgICAgICAgICAgaW4gZGVyIFNwZWlzZSBnZXNldHp0LCB3ZW5uIGRpZSBsZXR6dGUgUG9ydGlvbiBrb25zdW1pZXJ0CisgICAgICAgICAgICAgICAgICAgd3VyZGUuIFdlbm4gZGllc2UgUHJvcCBsZWVyIGlzdCwgd2lyZCBkYXMgT2JqZWt0IHplcnN0b2VydCwKKyAgICAgICAgICAgICAgICAgICB3ZW5uIGtlaW5lIFBvcnRpb25lbiBtZWhyIGRhIHNpbmQuCisgICAgICAgICAgICAgICAgICAgQWNodHVuZzogZXMgd2VyZGVuIGtlaW5lIGNsb3N1cmVzIHVudGVyc3R1ZXR6dCEgCisgICAgICAgICAgIFBfSURTIDogICBXZXJ0IGluIFBfRU1QVFlfUFJPUFMKKyAgICAgICAgICAgICAgICAgICAgIExpc3RlIGRlciBJRHMgZGVzIGxlZXJlbiBCZWhhZWx0ZXJzCisgICAgICAgICAgICAgICAgICAgICBBY2h0dW5nOiBlcyB3ZXJkZW4ga2VpbmUgY2xvc3VyZXMgdW50ZXJzdHVldHp0IQorICAgIFBfQURKRUNUSVZFUyA6ICAgV2VydCBpbiBQX0VNUFRZX1BST1BTCisgICAgICAgICAgICAgICAgICAgICBMaXN0ZSBkZXIgQWRqZWt0aXZlIGRlcyBsZWVyZW4gQmVoYWVsdGVycworICAgICAgICAgICAgICAgICAgICAgQWNodHVuZzogZXMgd2VyZGVuIGtlaW5lIGNsb3N1cmVzIHVudGVyc3R1ZXR6dCEKKyAgICAgICAgIFBfVkFMVUUgOiAgIFdlcnQgaW4gUF9FTVBUWV9QUk9QUworICAgICAgICAgICAgICAgICAgICAgV2VydCBkZXMgbGVlcmVuIEJlaGFlbHRlcnMKKyAgICAgICAgUF9XRUlHSFQgOiAgIFdlcnQgaW4gUF9FTVBUWV9QUk9QUworICAgICAgICAgICAgICAgICAgICAgR2V3aWNodCBkZXMgbGVlcmVuIEJlaGFlbHRlcnMKKworICAgICAgICBQX05PX0JBRCA6IEZsYWcsIG9iIGRpZSBTcGVpc2UgdmVyZGVyYmVuIGthbm4KKyAgICAgICAgICAgICAgICAgICBEYXJmIG51ciBpbiBBYnNwcmFjaGUgbWl0IGRlciBCYWxhbmNlIGF1ZiAxIGdlc2V0enQgd2VyZGVuIQorCisgICBQX0RFU1RST1lfQkFEIDogV2VydCwgd2FzIGJlaW0gVmVyZGVyYmVuIG1pdCBkZW0gT2JqZWN0IHBhc3NpZXJ0CisgICAgICAgICAgICAgICAgICAgREVTVFJPWV9CQUQgICA9IERpZSBTcGVpc2Ugd2lyZCBiZWltIFZlcmRlcmJlbiB6ZXJzdG9lcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnp3LiBkZXIgQmVoYWVsdGVyIHdpcmQgZ2VsZWVydCAoZGVmYXVsdCkKKyAgICAgICAgICAgICAgICAgICBERVNUUk9ZX05FVkVSID0gRGllIFNwZWlzZSB3aXJkIGJlaW0gVmVyZGVyYmVuIG5pY2h0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHplcnN0b2VydAorICAgICAgICAgICAgICAgICAgIHBvcy4gaW50ZWdlciAgPSBBbnphaGwgZGVyIFNla3VuZGVuLCBkaWUgendpc2NoZW4gVmVyZGVyYmVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZCBaZXJzdG9lcmVuIGRlciBTcGVpc2UgbGllZ2VuIHNvbGxlbgorCitNRVNTQUdFUzogKGR1cmNobGF1ZmVuIHJlcGxhY2VfcGVyc29uYWwoKSB1bmQga29lbm5lbiBzb21pdCBQbGF0emhhbHRlcgorICAgICAgICAgIGZ1ZXIgU3BlaXNlICgxLiBBcmd1bWVudCkgdW5kIEtvbnN1bWVudCAoMi4gQXJndW1lbnQpIGVudGhhbHRlbikKKworICAgUF9DT05TVU1FX01TRyA6IGZ1ZXIgZGVuIFJhdW0sIHdlbm4ga29uc3VtaWVydCB3aXJkCisgICAgIFBfRUFURVJfTVNHIDogYW4gZGVuIEtvbnN1bWVudGVuCisgICAgIFBfRU1QVFlfTVNHIDogd2VubiBsZWVyZSBCZWhhZWx0ZXIga29uc3VtaWVydCB3ZXJkZW4KKyAgICBQX05PRk9PRF9NU0cgOiB3ZW5uIEdldHJhZW5rZSBnZWdlc3NlbiB3ZXJkZW4KKyAgIFBfTk9EUklOS19NU0cgOiB3ZW5uIEZ1dHRlciBnZXRydW5rZW4gd2lyZAorICAgICAgIFBfQkFEX01TRyA6IHdlbm4gU3BlaXNlbiB2ZXJkZXJiZW4KKyAgICBQX1JFTU9WRV9NU0cgOiB3ZW5uIFNwZWlzZW4gdmVybmljaHRldCB3ZXJkZW4KKyAgICAgICAgICAgICAgICAgICAobnVyIHdlbm4gc2llIG5pY2h0IGJlaW0gVmVyZGVyYmVuIHZlcm5pY2h0ZXQgd2VyZGVuKQorICAgICAgIFBfRU5WX01TRyA6IHdlbm4gaW0gUmF1bSBsaWVnZW5kZSBTcGVpc2VuIGtvbnN1bWllcnQgd2VyZGVuCisgICAgICAgICAgICAgICAgICAgKGlzdCBkaWVzZSBQcm9wIGxlZXIsIGdlaHQgZGFzIHNvZ2FyISkKKyBQX0ZPT0RfRlVMTF9NU0cgOiB3ZW5uIG1hbiBuaXggbWVociBlc3NlbiBrYW5uCitQX0RSSU5LX0ZVTExfTVNHIDogd2VubiBtYW4gbml4IG1laHIgdHJpbmtlbiBrYW5uCisgIFBfQUxDX0ZVTExfTVNHIDogd2VubiBtYW4ga2VpbmVuIEFsa29ob2wgbWVociB2ZXJ0cmFlZ3QKKworTUVUSE9ERU46CisgICAgICAgICAgICAgY29uc3VtZSA6IHdpcmQgYmVpbSBLb25zdW1pZXJlbiBhdWZnZXJ1ZmVuLCB3ZW5uIGtsYXIgaXN0LAorICAgICAgICAgICAgICAgICAgICAgICBkYXNzIHdhcyB6dW0gS29uc3VtaWVyZW4gZGEgaXN0LgorICAgICAgICAgICAgICAgICAgICAgICBnaWJ0IGRhcyBFcmdlYm5pcyB2b24gdHJ5X2NvbnN1bWUoKSB6dXJ1ZWNrCisgICAgICAgICB0cnlfY29uc3VtZSA6IGJlcmVpdGV0IGRpZSBEYXRlbiBhdWYgdW5kIGZ1ZWhydCBsaXZpbmctPmNvbnN1bWUoKSBhdXMKKyAgICAgICAgICAgICAgICAgICAgICAga2FubiB6dXIgUHJ1ZWZ1bmcgbWl0IHRlc3Rvbmx5LUZsYWcgYXVmZ2VydWZlbiB3ZXJkZW4KKyAgICAgICAgICAgICAgICAgICAgICAgZ2lidCBkYXMgRXJnZWJuaXMgdm9uIGxpdmluZy0+Y29uc3VtZSgpIHp1cnVlY2sKKyAgICAgc3VjY2Vzc19jb25zdW1lIDogd2lyZCB2b24gY29uc3VtZSgpIGF1ZmdlcnVmZW4sIHdlbm4gS29uc3VtaWVyZW4ga2xhcHB0CisgICAgICAgICAgICAgICAgICAgICAgIGdpYnQgZGllIE1lbGR1bmdlbiB6dW0gS29uc3VtaWVyZW4gYXVzCisgICAgICBmYWlsZWRfY29uc3VtZSA6IHdpcmQgYXVmZ2VydWZlbiwgd2VubiBLb25zdW1pZXJlbiBuaWNodCBrbGFwcHQKKyAgICAgICAgICAgICAgICAgICAgICAgZ2lidCBkZW4gR3J1bmQgZnVlciBkZW4gRmVobHNjaGxhZyBhdXMKKyAgICAgICAgICAgICAgICAgICAgICAgKGplIG5hY2ggRXJnZWJuaXMgdm9uIGxpdmluZy0+Y29uc3VtZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgIGNvbnN1bWVfYmFkIDogQWVuZGVydCBkaWUgRGF0ZW4gZnVlciBsaXZpbmctPmNvbnN1bWUoKSwgd2VubiBlaW5lCisgICAgICAgICAgICAgICAgICAgICAgIHZlcmRvcmJlbmUgU3BlaXNlIGtvbnN1bWllcnQgd2lyZAorICAgICAgICAgICAgICAgICAgICAgICBTdGFuZGFyZDogSGVpbHVuZyB3aXJrdCBuaWNodCwgVmVyZ2lmdHVuZyArMQorICAgICAgICAgICAgbWFrZV9iYWQgOiB3aXJkIGF1ZmdlcnVmZW4sIHdlbm4gZGllIFNwZWlzZSBnZXJhZGUgdmVyZGlyYnQKKyAgICAgICAgICAgICAgICAgICAgICAgR2lidCBkaWUgTWVsZHVuZ2VuIGJlaW0gVmVyZGVyYmVuIGF1cworICAgICAgICAgICAgICAgICAgICAgICBWZXJuaWNodGV0IGRhcyBPYmpla3QsIHdlbm4gZGFzIGdld29sbHQgaXN0IAorICAgICAgICAgICAgICAgICAgICAgICBEaWUgTWV0aG9kZSB3aXJkIGF1Y2ggYXVmZ2VydWZlbiwgd2VubiBudXIgbm9jaCBkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgQmVoYWVsdGVyIGV4aXN0aWVydCEgQWxzbyBkZW4gVGVzdCBpc19ub3RfZW1wdHkoKSBuaWNodAorICAgICAgICAgICAgICAgICAgICAgICB2ZXJnZXNzZW4hCisgICAgICAgIG1ha2VfZGVzdHJveSA6IHdpcmQgYXVmZ2VydWZlbiwgd2VubiBkaWUgU3BlaXNlIGJlcmVpdHMgdmVyZG9yYmVuIGlzdAorICAgICAgICAgICAgICAgICAgICAgICB1bmQgZGllIFplaXQgYXVzIFBfREVTVFJPWV9CQUQgYWJnZWxhdWZlbiBpc3QuCisgICAgICAgICAgICAgICAgICAgICAgIEdpYnQgZGllIE1lbGR1bmcgenVtIFplcnN0b2VyZW4gYXVzIHVuZCBydWZ0CisgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfZW1wdHkgYXVzLCB1bSBkaWUgU3BlaXNlIGJ6dy4gZGVuIEluaGFsdCBkZXMKKyAgICAgICAgICAgICAgICAgICAgICAgQmVoYWVsdGVycyB6dSB6ZXJzdG9lcmVuLiBBdXNzZXJkZW0gd2lyZCBkZXIgUmVzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgYWJnZXNjaGFsdGV0LgorICAgICAgICAgICAgICAgICAgICAgICBEaWUgTWV0aG9kZSB3aXJkIGF1Y2ggYXVmZ2VydWZlbiwgd2VubiBudXIgbm9jaCBkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgQmVoYWVsdGVyIGV4aXN0aWVydCEgQWxzbyBkZW4gVGVzdCBpc19ub3RfZW1wdHkoKSBuaWNodAorICAgICAgICAgICAgICAgICAgICAgICB2ZXJnZXNzZW4hCisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgIG1ha2VfZW1wdHkgOiB3aXJkIGF1ZmdlcnVmZW4sIHdlbm4gZGllIGxldHp0ZSBQb3J0aW9uIGtvbnN1bWllcnQgd2lyZAorICAgICAgICAgICAgICAgICAgICAgICBNYWNodCBhdXMgZWluZW0gdm9sbGVuIEJlaGFlbHRlciBlaW5lbiBsZWVyZW4gb2RlcgorICAgICAgICAgICAgICAgICAgICAgICB2ZXJuaWNodGV0IGRhcyBPYmpla3QuIERlciBCZWhhZWx0ZXIgdmVyZGlyYnQgYWxzbyBpbQorICAgICAgICAgICAgICAgICAgICAgICBOb3JtYWxmYWxsIG5pY2h0IQorCisgICAgICAgICAgICAgICAgaW5pdCA6IFN0YXJ0ZXQgZGVuIFRpbWVyIHp1bSBWZXJkZXJiZW4gZGVyIFNwZWlzZQorICAgICAgICAgICAgICAgICAgICAgICAoc3RhcnRfbGlmZXRpbWUoKSksIHdlbm4gc2ljaCBkYXMgT2JqZWt0IGluIGVpbmVtCisgICAgICAgICAgICAgICAgICAgICAgIFNwaWVsZXIgYmVmaW5kZXQuCisgICAgICAgICAgICAgICAgICAgICAgIFBydWVmdCwgb2IgTGF1ZnplaXRlbiBmZWhsZXJoYWZ0ZXJ3ZWlzZSBuaWNodCBiZWVuZGV0CisgICAgICAgICAgICAgICAgICAgICAgIHd1cmRlbiB1bmQgaG9sdCBlcyBkYW5uIG5hY2gKKyAgICAgICAgICBOb3RpZnlNb3ZlIDogU3RhcnRldCBkZW4gVGltZXIgenVtIFZlcmRlcmJlbiBkZXIgU3BlaXNlCisgICAgICAgICAgICAgICAgICAgICAgIChzdGFydF9saWZldGltZSgpKSBhdWNoLCB3ZW5uIGRpZSBTcGVpc2UgaW4gZWluZW4KKyAgICAgICAgICAgICAgICAgICAgICAgU3BpZWxlciBiZXdlZ3Qgd2lyZCwgb2huZSBkYXNzIGluaXQoKSBhdWZnZXJ1ZmVuCisgICAgICAgICAgICAgICAgICAgICAgIHd1cmRlLgorICAgICAgICAgICAgICAgcmVzZXQgOiB3aXJkIGZ1ZXIgMyBTaXR1YXRpb25lbiB2ZXJ3ZW5kZXQ6CisgICAgICAgICAgICAgICAgICAgICAgIDE6IERhcyBGdXR0ZXIgd3VyZGUgYmV3ZWd0LCBkZXIgVGltZXIgYWJlciBub2NoIG5pY2h0IAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXNpZXJ0IC0+IGVzIHdpcmQgZ2VwcnVlZnQsIG9iIGRlciBUaW1lcgorICAgICAgICAgICAgICAgICAgICAgICAgICBnZXN0YXJ0ZXQgd2VyZGVuIG11c3MuCisgICAgICAgICAgICAgICAgICAgICAgIDI6IERlciBUaW1lciBpc3QgYWJnZWxhdWZlbiAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICBsYWVzc3QgZGllIFNwZWlzZSB2ZXJkZXJiZW4gdW5kIHZlcm5pY2h0ZXQgc2llCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdlZ2ViZW5lbmZhbGxzCisgICAgICAgICAgICAgICAgICAgICAgIDM6IERlciBUaW1lciBuYWNoIGRlbSBWZXJkZXJiZW4gaXN0IGFiZ2VsYXVmZW4gLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgdmVybmljaHRldCBkaWUgU3BlaXNlCisgICAgICAgICAgICAgICAgICAgICAgIEVzIHdpcmQgaW1tZXIgZ2VwcnVlZnQsIG9iIGRpZSBSZXNldHMgemVpdGdlcmVjaHQKKwkJICAgICAgIGF1ZmdlcnVmZW4gd3VyZGVuIHVuZCBkaWUgQWt0aW9uZW4gbmljaHQgenVyIGZhbHNjaGVuCisJCSAgICAgICBaZWl0IHBhc3NpZXJlbgorCisgICAgICAgIGlzX25vdF9lbXB0eSA6IEZsYWcsIG9iIG5vY2ggUG9ydGlvbmVuIHZvcmhhbmRlbiBzaW5kCisgICAgICAgIGlzX2RyaW5rYWJsZSA6IEZsYWcsIG9iIFNwZWlzZSB0cmlua2JhciBpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgKG51ciB3ZW5uIFBfRFJJTksgZ2VzZXR6dCB1bmQgUF9GT09EIE5JQ0hUIGdlc2V0enQgaXN0KQorICAgICAgICAgIGlzX2VhdGFibGUgOiBGbGFnIG9iIFNwZWlzZSBlc3NiYXIgaXN0CisgICAgICAgICAgICAgICAgICAgICAgICh3ZW5uIFBfRk9PRCBnZXNldHp0IChQX0RSSU5LIGlzdCBlZ2FsKSkKKyAgICAgICAgICAgICAgaXNfYmFkIDogRmxhZywgb2IgU3BlaXNlIHZlcmRvcmJlbiBpc3QKKworZ2V0X2N1cnJlbnRfbGlmZXRpbWUgOiBaZWl0IGluIFNla3VuZGVuLCB3aWUgbGFuZ2UgZGVyIFRpbWVyIHp1bSBWZXJkZXJiZW4KKyAgICAgICAgICAgICAgICAgICAgICAgbGFldWZ0IChpc3QgaW1tZXIgMCwgd2VubiBQX05PX0JBRCBnZXNldHp0IGlzdCkKKyAgICAgIHN0YXJ0X2xpZmV0aW1lIDogc3RhcnRldCBkZW4gVGltZXIgenVtIFZlcmRlcmJlbiBkZXIgU3BlaXNlIGZhbGxzIGtlaW5lCisgICAgICAgICAgICAgICAgICAgICAgIEdydWVuZGUgZGFnZWdlbiBzcHJlY2hlbiwgd2lyZCBpbnRlcm4gYXVmZ2VydWZlbiwga2FubgorICAgICAgICAgICAgICAgICAgICAgICBhYmVyIGluIHNwZXppZWxsZW4gU2l0dWF0aW9uZW4gYXVjaCBtYW51ZWxsIGF1ZmdlcnVmZW4KKyAgICAgICAgICAgICAgICAgICAgICAgd2VyZGVuIChzaWVoZSBvYmVuIHVudGVyIFJFQUxJU0lFUlVORykKKyAgICAgICAgICAgICBtZXNzYWdlIDogZXMgd2VyZGVuIE1lbGR1bmdlbiB6dSBTdGF0dXNhZW5kZXJ1bmdlbiB2ZXJhcmJlaXRldAorICAgICAgICAgICAgICAgICAgICAgICB1bmQga29ycmVrdCBhdXNnZWdlYmVuLiBFcyB3aXJkIGRlciBOYW1lIGRlciBhdXN6dS0KKyAgICAgICAgICAgICAgICAgICAgICAgZ2ViZW5lbiBQcm9wZXJ0eSB1ZWJlcmdlYmVuLgorICAgICAgICAgICAgICAgICAgICAgICBFcyB3ZXJkZW4gYWxsZSBub3R3ZW5kaWdlbiBFcnNldHp1bmdlbiBwZXIKKyAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZV9wZXJzb25hbCBnZW1hY2h0IHVuZCBnZXBydWVmdCwgb2IgZGVtIEJlc2l0emVyCisgICAgICAgICAgICAgICAgICAgICAgIG9kZXIgZGVtIFJhdW0gZGllIE1lbGR1bmcgYXVzZ2VnZWJlbiB3ZXJkZW4gbXVzcy4KKyAgICAgICAgICAgICAgICAgICAgICAgSGllcnVlYmVyIHNvbGx0ZW4gbnVyIE1lbGR1bmdlbiBhdXNnZWdlYmVuIHdlcmRlbiwgZGllCisgICAgICAgICAgICAgICAgICAgICAgIGR1cmNoIEFlbmRlcnVuZ2VuIGFuIGRlciBTcGVpc2UgaW0gUmVzZXQgYXVzZ2Vsb2VzdAorICAgICAgICAgICAgICAgICAgICAgICB3ZXJkZW4sIGFsc28gaW0gcmVzZXQgc2VsYnN0IHVuZCBpbiBkZW4gbWFrZV8qLU1ldGhvZGVuLgorCisKK1NUQU5EQVJEOgorICAgIFdlbm4gbWFuIG5pY2h0cyBpbiBzZWluZW0gRnV0dGVyIHVlYmVyc2NocmVpYnQsIGRhbm4gaGF0IGVzCisgICAgZm9sZ2VuZGVzIFN0YW5kYXJkdmVyaGFsdGVuLgorICAgIEVzIG11c3MgaW1tZXIgUF9GT09EIG9kZXIgUF9EUklOSyBleHBsaXppdCBncm9lc3NlciAwIGdlc2V0enQgd2VyZGVuLAorICAgIHNvbnN0IGxhZXNzdCBzaWNoIGRhcyBMZWJlbnNtaXR0ZWwgbmljaHQga29uc3VtaWVyZW4hCisKKyAgICAtIEhhbHRiYXJrZWl0OiAxIFJlc2V0ICgzMCArIHJhbmRvbSgzMCkgTWludXRlbikKKyAgICAtIGRlciBBYmxhdWYgZGVyIEhhbHRiYXJrZWl0IHN0YXJ0ZXQsIHNvYmFsZCBlaW4gU3BpZWxlciBkaWUgU3BlaXNlIG5pbW10CisgICAgLSBXZW5uIGRpZSBTcGVpc2Ugc2NobGVjaHQgd2lyZCwgd2lyZCBzaWUgemVyc3RvZXJ0CisgICAgLSBEaWUgU3BlaXNlIGhhdCBrZWluZW4gQmVoYWVsdGVyCisgICAgLSBFcyBnaWJ0IG51ciBlaW5lbiBTY2hsdWNrL0Jpc3NlbiwgZGFubiBpc3QgZGllIFNwZWlzZSB3ZWcKKyAgICAtIEdld2ljaHQ6IDUwIEdyYW1tIC8gV2VydDogMTAgTXVlbnplbgorICAgIC0gTWFuIGhlaWx0IHdlZGVyIExQIG5vY2ggS1AKKyAgICAtIE1hbiB3dWVyZGUgYW5zb25zdGVuIDUgTFAvS1AgcHJvIEhlYXJ0YmVhdCBoZWlsZW4KKyAgICAtIE1hbiBrYW5uIGRpZSBTcGVpc2UgbnVyIGtvbnN1bWllcmVuLCB3ZW5uIG1hbiBzaWUgaW4gZGVyIEhhbmQgaGFlbHQKKyAgICAtIFdlbm4gbWFuIGRpZSB2ZXJkb3JiZW5lIFNwZWlzZSBrb25zdW1pZXJlbiBrb2VubnRlLCB3dWVyZGUgbWFuIG5pY2h0CisgICAgICBoZWlsZW4gc29uZGVybiB2ZXJnaWZ0ZXQgd2VyZGVuIChQX1BPSVNPTisxKQorCitCRUlTUElFTEU6CisgICAgQmVpc3BpZWxlIHp1IHRyYWdiYXJlbiBTcGVpc2VuIHVuZCBHZXRyYWVua2VuIGthbm4gbWFuIHVudGVyCisgICAgZG9jL2JlaXNwaWVsZS9mb29kLyBuYWNoc2NoYXVlbgorCitTSUVIRSBBVUNIOgorICAgIGNvbnN1bWUsIHdpei9oZWlsdW5nLCAKKworTEVUWlRFIEFlTkRFUlVORzoKKyAgICAyNS4wOS4yMDEwLCBDYWxkcmEKZGlmZiAtLWdpdCBhL2RvYy93aXovZm9yc2NoZXJwdW5rdGUgYi9kb2Mvd2l6L2ZvcnNjaGVycHVua3RlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3Zjg0ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd2l6L2ZvcnNjaGVycHVua3RlCkBAIC0wLDAgKzEsNjUgQEAKKworRm9yc2NoZXJwdW5rdGUKKz09PT09PT09PT09PT09CisKKyBGT1JTQ0hFUlBVTktURToKKyAgICBEYW1pdCBkaWUgU3BpZWxlciBiZWltIEVya3VuZGVuIG5ldWVyIEdlYmlldGUgYXVjaCBhbiBPcnRza2VubnRuaXMKKyAgICBnZXdpbm5lbiwgbXVlc3NlbiBhbiBiZXN0aW1tdGVuIFN0ZWxsZW4gRm9yc2NoZXJwdW5rdGUgKEZQKSB2ZXJnZWJlbgorICAgIHdlcmRlbi4gRGF6dSBpc3QgaW4gZGVuIG1laXN0ZW4gRmFlbGxlbiBrZWluZSBBZW5kZXJ1bmcgYW4gZGVuIE9iamVrdGVuCisgICAgc2VsYnN0IG5vZXRpZywgZGllIFB1bmt0ZSBtdWVzc2VuIGplZG9jaCB2b24gZWluZW0gRXJ6bWFnaWVyIGluIGRpZQorICAgIEZQLUxpc3RlIGVpbmdldHJhZ2VuIHdlcmRlbi4KKworICAgIERJRSBGT1JTQ0hFUlBVTktURSBNVUVTU0VOIEVJTkdFVFJBR0VOIFdFUkRFTiwgQkVWT1IgREFTIEdFQklFVCBERU4KKyAgICBTUElFTEVSTiBaVUdBRU5HTElDSCBHRU1BQ0hUIFdJUkQhCisKKyAgICBEaWUgVGVzdHBoYXNlIGlzdCBlaW5lIGd1dGUgR2VsZWdlbmhlaXQsIHNpY2ggZGFydWViZXIgR2VkYW5rZW4genUgbWFjaGVuLAorICAgIHdvIHdlbGNoZSBGUCB2ZXJnZWJlbiB3ZXJkZW4ga29lbm50ZW4uCisKKyAgICBGdWVyIGRhcyBFaW50cmFnZW4gZGVyIEZvcnNjaGVycHVua3RlIGlzdCBkZXJ6ZWl0IE1pcmlsIHp1c3RhZW5kaWcuCisKKyBXQVMgRlVlUiBGUCBLQU5OIElDSCBWRVJHRUJFTj8KKyAgICBGb2xnZW5kZSBUeXBlbiB2b24gRm9yc2NoZXJwdW5rdGVuIHN0ZWhlbiB6dXIgVmVyZnVlZ3VuZzoKKworICAgICAqIERldGFpbHMuIERhcnVudGVyIGZhbGxlbiBhdWNoIFNwZWNpYWxEZXRhaWxzLgorICAgICAqIFJlYWREZXRhaWxzLgorICAgICAqIFNvdW5kcyB1bmQgU21lbGxzLgorICAgICAqIEtvbW1hbmRvcywgc293ZWl0IHNpZSBtaXQgQWRkQ21kKCkgYW5nZW1lbGRldCB3ZXJkZW4uCisgICAgICAgS29tbWFuZG9zLCBkaWUgbWl0IGFkZF9hY3Rpb24oKSBhbmdlbWVsZGV0IHdlcmRlbiwga29lbm5lbiBhdXMKKyAgICAgICB0ZWNobmlzY2hlbiBHcnVlbmRlbiBuaWNodCBiZXJ1ZWNrc2ljaHRpZ3Qgd2VyZGVuLgorICAgICAgIEtvbW1hbmRvcywgZGllIGFscyBGUHMgZWluZ2V0cmFnZW4gc2luZCwgZ2ViZW4gZ2VuYXUgZGFubiBkZW4KKyAgICAgICBGUCwgd2VubiAxIHp1cnVlY2tnZWdlYmVuIHdpcmQuCisgICAgICogQXVzZ2FlbmdlIGJlaSBSYWV1bWVuLiBEYXJ1bnRlciBmYWxsZW4gYXVjaCBTcGVjaWFsRXhpdHMuCisgICAgICogSW5mb3MgYmVpIE5QQ3MuIERhcyBEZWZhdWx0aW5mbyBsYWVzc3Qgc2ljaCBhbGxlcmRpbmdzIG5pY2h0IG9obmUKKyAgICAgICB3ZWl0ZXJlcyB2ZXJ3ZW5kZW4uCisgICAgICogR2V0cmFlbmtlIHVuZCBTcGVpc2VuIGluIEtuZWlwZW4uCisgICAgICogQmVzb25kZXJlIEFrdGlvbmVuIHNpbmQgYXVjaCBtb2VnbGljaCwgZGF6dSBtdXNzIGplZG9jaCBub2NoIGV0d2FzIGFtCisgICAgICAgQ29kZSBoaW56dWdlZnVlZ3Qgd2VyZGVuLiBEaWVzZSBBcnQgdm9uIEZvcnNjaGVycHVua3RlbiBzb2xsdGUgbWFuIG5hY2gKKyAgICAgICBNb2VnbGljaGtlaXQgbWVpZGVuLgorCisgICAgUHJvIE9iamVrdCBsYWVzc3Qgc2ljaCBudXIgZWluIEZQIHZlcmdlYmVuLiBEaWUgRlAtRGljaHRlIHNvbGx0ZSBldHdhIGJlaQorICAgIGVpbmVtIEZQIHBybyB6ZWhuIFJhZXVtZSBsaWVnZW4uCisKKyAgICBJbiBRdWVzdGdlYmlldGVuIHNvbGx0ZW4gZGllIEZQIE5JQ0hUIGZ1ZXIgRGV0YWlscyBvZGVyIEFrdGlvbmVuIHZlcmdlYmVuCisgICAgd2VyZGVuLCBkaWUgZWluZW4gZGlyZWt0IGluIGRlciBRdWVzdCB3ZWl0ZXJicmluZ2VuLCBzb25kZXJuIGVoZXIgZnVlcgorICAgIHNvbGNoZSwgZGllIHp1IGRlbiBlbnRzY2hlaWRlbmVuIFN0ZWxsZW4gZnVlaHJlbi4gRGFtaXQgd2VyZGVuIFNwaWVsZXIsCisgICAgZGllIHNpY2ggYWxsZXMgZ2VuYXUgYW5zZWhlbiwgYmVsb2hudCwgd29oaW5nZWdlbiBLb21wbGV0dGxvZXNlciwgZGllIG51cgorICAgIGRhcyBub2V0aWdzdGUgZWluZ2ViZW4sIGxlZXIgYXVzZ2VoZW4uCisKKyBXSUUgU0FHIElDSFMgTUVJTkVNIEVSWk1BR0lFUj8KKyAgICBVbSBkaWUgRlAgZWludHJhZ2VuIHp1IGtvZW5uZW4sIGJyYXVjaGVuIGRpZSBFcnptYWdpZXIgZWluZSBMaXN0ZSBtaXQgZGVuCisgICAgbm9ldGlnZW4gSW5mb3JtYXRpb25lbi4gWnUgZGVuIG5vZXRpZ2VuIEluZm9ybWF0aW9uZW4gZ2Vob2VyZW46CisKKyAgICAgKiBkZXIgRGF0ZWluYW1lIGRlcyBPYmpla3RlcworICAgICAqIGRpZSBBcnQgZGVzIEZQCisgICAgICogZGllIFNjaGx1ZXNzZWx3b2VydGVyLCBtaXQgZGVuZW4gZGVyIEZQIGFuZ2VzcHJvY2hlbiB3ZXJkZW4gc29sbAorCisgICAgRGllIFNjaGx1ZXNzZWx3b2VydGVyIHNpbmQgbm9ybWFsZXJ3ZWlzZSBkaWUgU2NobHVlc3NlbCwgZGllIGJlaSBkZW4KKyAgICBqZXdlaWxpZ2VuIEFkZFhYWCgpLUF1ZnJ1ZmVuIGltIE9iamVrdCBhbmdlZ2ViZW4gd2VyZGVuLgorCisgICAgQmVpc3BpZWw6CisKKyAgICAvcGxheWVycy93YXJnb24vd29ya3Jvb206IGRldGFpbCB3YW5kLCB3YWVuZGUKKyAgICAvcGxheWVycy93YXJnb24vbW9uL2Vycm9sOiBpbmZvIGRyYWNoZW4KKworIExFVFpURSBBZU5ERVJVTkc6CisJVGh1LCAyMDEzLTA0LTA0IHZvbiBIdW1uaQpkaWZmIC0tZ2l0IGEvZG9jL3dpei9mdHAgYi9kb2Mvd2l6L2Z0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2E0YzVhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dpei9mdHAKQEAgLTAsMCArMSw0MSBAQAorRlRQLVp1Z2FuZyBmdWVyIE1hZ2llciAoWmVzc3RyYSwgMTIuIERleiAyMDEwLCAyMzoxNzo1Mik6CitPaywgd2llIGluIGJla2FubnRtYWNodW5nZW4gZ2VzY2hyaWViZW4sIHdhcmVuIHVuc2VyZSAodW5kIGRpZSBhbmRlcmVyIE11ZHMpCitWZXJzdWNoZSBiaXNsYW5nIGVyZm9sZ2xvcywgZGFzIG1vZF9tdWQtTW9kdWwgZnVlciBkZW4gcHJvZnRwZCB3aWVkZXIgYW5zCitMYXVmZW4genUgYnJpbmdlbiB1bmQgaWNoIGhhYmUgYWxzIFp3aXNjaGVubG9lc3VuZyB6dW1pbmRlc3QgZXJzdG1hbCB3YXMKK2FuZGVyZXMgZ2ViYXV0LgorCitBbGxlcmRpbmdzIGthbm4gZGllIGFrdHVlbGxlIExvZXN1bmcgbmljaHQgJ2xpdmUnIGJlaW0gRGF0ZWl6dWdyaWZmIGRhcyBNdWQKK2ZyYWdlbiwgb2IgZGVyIFVzZXIgZGFzIGF1Y2ggZGFyZi4gRGFoZXIgc2luZCBhbGxlIE1hZ2llciBsZWlkZXIgZXJzdG1hbCBhdWYKK2lociBIb21ldmVyemVpY2huaXMgYmVzY2hyYWVua3QgLSBkb3J0IGR1ZXJmZW4gc2llIG5hdHVlcmxpY2ggYWxsZXMgc2NocmVpYmVuCit1bmQgbGVzZW4uIFZvbiBkb3J0L2RvcnRoaW4gbXVzcyBtYW4gZGFubiBpbSBNdWQgbWl0IGNwL212IGFyYmVpdGVuLgorCitXZXIgc2VpbmVuIEZUUC1adWdhbmcgYWt0aXZpZXJlbiB3aWxsLCBtdXNzIC0gYmlzIGljaCBkYXMgaW4gZGllIE1hZ2llcnNoZWxsCitlaW5nZWJhdXQgaGFiZSAtIGZvbGdlbmRlIHp3ZWkgU2Nocml0dGUgZHVyY2hmdWVocmVuOgorMSkgeGV2YWwgbWFzdGVyKCktPnVwZGF0ZV9mdHBfYWNjZXNzKGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpLCAxKQorICAgKERlYWt0aXZpZXJlbiBtaXQgdXBkYXRlX2Z0cF9hY2Nlc3MoZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSksIDApCisyKSBtaXQgcGFzc3dkIGVpbiBuZXVlcyBQVyBzZXR6ZW4KKzMpIGJpcyB6dXIgbmFlY2hzdGVuIHZvbGxlbiBTdHVuZGUgd2FydGVuCisKK1NjaHJpdHQgMikgaXN0IGxlaWRlciB6d2luZ2VuZCBub2V0aWcsIGRhIHdpciBkYXMgUFcgbmljaHQgaW0gS2xhcnRleHQKK3NwZWljaGVybiB1bmQgcHVyZS1mdHBkIHVuc2VyZSB2ZXJzY2hsdWVzc2VsdGVuL2dlaGFzaHRlbiBQYXNzd29lcnRlciBuaWNodAordmVyc3RlaHQuIERlc3dlZ2VuIG11ZXNzZW4gd2lyIGZ1ZXIgRlRQIGRhcyBQVyBhbmRlcnMgc3BlaWNoZXJuLCB3YXMgd2lyIG51cgorYmVpbSBOZXVzZXR6ZW4gZWluZXMgUFdzIGtvZW5uZW4uCisKK0ljaCBtb2VjaHRlIGV1Y2ggbm9jaCB1bSBlaW5zIGJpdHRlbjogV2VubiBpaHIgd2FzIHBlciBGVFAgaGluLSB1bmQKK2hlcnNjaGllYnQsIHdhcyBkYW5uIHdlaXRlciAoei5CLiBuYWNoIC9kKSB2ZXJzY2hvYmVuIHdpcmQgKG9kZXIgdm9uIGRvcnQgaWhyCitldWVyIEhvbWV2ZXJ6ZWljaG5pcyk6IGxvZXNjaHQgYml0dGUgZGVuIEtyYW0gYXVzIGV1cmVtIC9wbGF5ZXJzLzxtYWdpZXI+Cit3aWVkZXIsIGRlbm4gYSkgZ2VodCBkYXMgYWxsZXMgc29uc3QgdWViZXJmbHVlc3NpZyBpbnMgQmFja3VwIHVuZCBiKSB3aXJkIGRpZQorVWViZXJzaWNodCBkZXV0bGljaCBzY2hsZWNodGVyLCB3ZW5uIG1hbiB4IEtvcGllbiBkZXMgZ2xlaWNoZW4gS3JhbXMgaW0gTXVkCit2ZXJ0ZWlsdCBoYXQuCisKK0JUVzogRGllc2VyIEZUUC1adWdhbmcgd2lyZCBkZWFrdGl2aWVydCwgZmFsbHMgc2ljaCBlaW4gTWFnaWVyIGxhZW5nZXIgYWxzIDIKK1dvY2hlbiBuaWNodCBpbSBNdWQgZWlubG9nZ3QsIGRhbm4gbXVlc3N0IGlociBkaWUgUHJvemVkdXIgZGEgb2Jlbgord2llZGVyaG9sZW4uCisKK1NvcnJ5IGZ1ZXIgZGllIFVuYW5uZWhtbGljaGtlaXRlbiwgYWJlciBzbyBpc3RzIGVyc3RtYWwgYmVzc2VyIGFscyBnYXIgbml4LgorRmFsbHMgd2lkZXIgRXJ3YXJ0ZW4gamVtYW5kIGJlaW0gbW9kX211ZCBhdXNoZWxmZW4gbWFnLCBpc3QgZXIgdWVicmlnZW5zCitoZXJ6bGljaCB3aWxsa29tbWVuLgorCitaZXNzdHJhCitTdGFuZDogRmVicnVhciAyMDExCisKZGlmZiAtLWdpdCBhL2RvYy93aXovZ2lmdCBiL2RvYy93aXovZ2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmM0ZDllCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dpei9naWZ0CkBAIC0wLDAgKzEsMTMyIEBACitLcmFua2hlaXRlbiwgR2lmdGUgdW5kIEZsdWVjaGUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgIEVpbm1hbCBhYmdlc2VoZW4gdm9tIGVpbmZhY2hlbiBTZXR6ZW4gdm9uIFBfUE9JU09OIGltIFNwaWVsZXIgbGFzc2VuIA0KKyAgICAgc2ljaCBHaWZ0ZSB1bmQgS3JhbmtoZWl0ZW4gYXVjaCBhbHMgT2JqZWt0ZSBhdXNwcm9ncmFtbWllcmVuLCBkaWUgZGVtIA0KKyAgICAgU3BpZWxlciBpbiBtZWhyIG9kZXIgd2VuaWdlciByZWdlbG1hZXNzaWdlbiBBYnN0YWVuZGVuIExlYmVuc3B1bmt0ZSANCisgICAgIGFiemllaGVuLiBBdWNoIEZsdWVjaGUga29lbm5lbiBuaWNodCBudXIgYWxzIFBfQ1VSU0VEIGluIFdhZmZlbiB1bmQgDQorICAgICBSdWVzdHVuZ2VuLCBzb25kZXJuIGF1Y2ggYWxzIE9iamVrdGUgdm9ybGllZ2VuLCB1bmQgZGVtIFNwaWVsZXIgZGFzIA0KKyAgICAgTGViZW4gc2Nod2VybWFjaGVuCisKKyAgICAgVW0gZWluIE9iamVrdCBhbHMgR2lmdCB6dSBrZW5uemVpY2huZW4sIHdpcmQgZGllIEtsYXNzZSBDTF9QT0lTT04gDQorICAgICBnZXNldHp0LCBmdWVyIGVpbmUgS3JhbmtoZWl0IGlzdCBDTF9ESVNFQVNFIHVuZCBmdWVyIGVpbmVuIEZsdWNoIA0KKyAgICAgQ0xfQ1VSU0UgenUgc2V0emVuIChtaXQgQWRkQ2xhc3MsIHNpZWhlIGRvcnQpLiBadXNhZXR6bGljaCB3aXJkIGRpZSANCisgICAgIFNjaHdlcmUgZGVyIEVya3Jhbmt1bmcgYnp3LiBWZXJnaWZ0dW5nIGluIGRlciBQcm9wZXJ0eSBQX0xFVkVMIA0KKyAgICAgYWJnZWxlZ3QsIHdvYmVpIFBfTEVWRUwgZWluZW4gV2VydCB6d2lzY2hlbiAxIHVuZCAxMDAgaGFiZW4gc29sbHRlLiANCisgICAgIE1pdGdsaWVkZXIgZGVyIEtsZXJpa2VyZ2lsZGUgdW5kIGFuZGVyZSBIZWlsZXIga29lbm5lbiBkYW5uIGplIG5hY2ggDQorICAgICBQX0xFVkVMIGRlbiBiZXRyb2ZmZW5lbiBTcGllbGVyIG1laHIgb2RlciB3ZW5pZ2VyIGd1dCBoZWlsZW4uIChLbGVyaWtlciANCisgICAgIGtvZW5uZW4gQ0xfUE9JU09OLVZlcmdpZnR1bmdlbiBoZWlsZW4sIGVpbmlnZSBIZWlsZXIgamVkb2NoIG5pY2h0LikKKworICAgICBFaW5lIGVpbmRldXRpZ2UgVW50ZXJzY2hlaWR1bmcgendpc2NoZW4gR2lmdGVuLCBLcmFua2hlaXRlbiB1bmQgDQorICAgICBGbHVlY2hlbiB6dSB0cmVmZmVuLCBpc3Qgc2Nod2VyLCBkZW5uIGRpZSBHcmVuemVuIHZlcnNjaHdpbW1lbi4gDQorICAgICBUcm90emRlbSBoaWVyIGVpbmUgZ3JvYmUgS2xhc3NpZml6aWVydW5nOgorCisgICAgIEdpZnRlIDogYnJpbmd0IGRlciBTcGllbGVyIHNpY2ggbWVpc3Qgc2VsYnN0IGJlaSAoaW4gZGVtIGVyIHouQi4KKyAgICAgICAgICAgICBlaW5lbiBnaWZ0aWdlbiBQaWx6IGlzc3QpLiBPZnQgYXVjaCBzaW5kIGRpZSBTdGVsbGVuLCB3bworICAgICAgICAgICAgIGVpbiBTcGllbGVyIHNpY2ggdmVyZ2lmdGVuIGthbm4sIGlyZ2VuZHdpZSBnZWtlbm56ZWljaG5ldCwKKyAgICAgICAgICAgICBzbyBkYXNzIGVpbmUgVmVyZ2lmdHVuZyB1bWdhbmdlbiB3ZXJkZW4ga2Fubi4KKworICAgICAgICAgICAgIEJlaSBHaWZ0ZW4gd2lyZCBkdXJjaCBkYXMgSGVpbGVuIGRlciBMZXZlbCBkZXMgR2lmdG9iamVrdHMKKyAgICAgICAgICAgICBhYmhhZW5naWcgdm9tIEVyZm9sZyBnZXNlbmt0LiBJc3QgZGVyIExldmVsIDw9IDAsIHdpcmQgZGFzCisgICAgICAgICAgICAgT2JqZWt0IHZvbSBLbGVyaWtlci1TcGVsbGJvb2sgZW50ZmVybnQuIEhlaWxlciBzb2xsdGVuIGRhcworICAgICAgICAgICAgIGFlaG5saWNoIG1hY2hlbi4gTG9naXNjaCB3YWVyZSBlcyBkYWhlciwgZGVuIFNjaGFkZW4sIGRlbiBkYXMKKyAgICAgICAgICAgICBPYmpla3QgbWFjaHQsIHZvbSBtb21lbnRhbmVuIExldmVsIGFiaGFlbmdpZyB6dSBtYWNoZW4uCisKKyAgICAgS3JhbmtoZWl0OiB3ZXJkZW4gZGVtIFNwaWVsZXIgZHVyY2ggRnJlbWRlaW53aXJrdW5nIGJlaWdlYnJhY2h0LCBhdWNoCisgICAgICAgICAgICAgZHVyY2ggQW5zdGVja3VuZyBiZWkgZWluZW0gYW5kZXJlbiBTcGllbGVyIG9kZXIgTlBDLgorICAgICAgICAgICAgIEJlaSBhbnN0ZWNrZW5kZW4gS3JhbmtoZWl0ZW4gaXN0IGF1ZiBkaWUgQW5zdGVja3JhdGUgenUgYWNodGVuCisgICAgICAgICAgICAgdW5kIGRhcmF1ZiwgZGFzcyBkaWUgS3JhbmtoZWl0IG1pdCBkZXIgWmVpdCBhdWNoIHdpZWRlcgorICAgICAgICAgICAgIGF1c3N0aXJidC4gQWxzbyBlbnR3ZWRlciBiZWkgamVkZXIgR2VuZXJhdGlvbiBkZXIgS3JhbmtoZWl0CisgICAgICAgICAgICAgZGFzIEFuc3RlY2t1bmdzcmlzaWtvIHNlbmtlbiBvZGVyIGVpbm1hbCBpbmZpemllcnRlIFNwaWVsZXIKKyAgICAgICAgICAgICBpbW11bmlzaWVyZW4uIEVzIHNvbGx0ZW4gc2ljaCAyIGlkZWxuZGUgU3BpZWxlciBuaWNodCBpbW1lcgorICAgICAgICAgICAgIHdpZWRlciBnZWdlbnNlaXRpZyBiaXMgaW4gYWxsZSBld2lnIGFuc3RlY2tlbiBrb2VubmVuLiBBdWNoCisgICAgICAgICAgICAgaXN0IGRhcmF1ZiB6dSBhY2h0ZW4sIGRhc3MgTmV0enRvdGUgbmljaHQgYW5nZXN0ZWNrdCB3ZXJkZW4KKyAgICAgICAgICAgICBrb2VubmVuIGJ6dy4gTmV0enRvdGUgbmllbWFuZGVuIGFuc3RlY2tlbiwgZGEgc2ljaCBzb25zdCBkaWUKKyAgICAgICAgICAgICBLcmFua2hlaXQgaW0gTmV0enRvdGVucmF1bSB2ZXJicmVpdGVuIGthbm4uCisKKyAgICAgICAgICAgICBEYXMgSGVpbGVuIGdlc2NoaWVodCBpbSBLbGVyaWtlci1TcGVsbGJvb2sgd2llIGJlaSBHaWZ0LgorCisgICAgIEZsdWVjaGU6IHdlcmRlbiB3aWUgS3JhbmtoZWl0ZW4gZHVyY2ggRnJlbWRlaW53aXJrdW5nIGJlaWdlYnJhY2h0CisgICAgICAgICAgICAgKGRlciBTcGllbGVyIHdpcmQgaGFsdCB2ZXJmbHVjaHQpLiBBdXNzZXJkZW0gaXN0IGRpZSBXaXJrdW5nIA0KKyAgICAgICAgICAgICB2b24gRmx1ZWNoZW4gb2Z0IG5pY2h0IGF1ZiBlaW5mYWNoZXMgQWJ6aWVoZW4gdm9uIExlYmVuc3B1bmt0ZW4gDQorICAgICAgICAgICAgIGJlc2NocmFlbmt0LCBzb25kZXJuIGRlciBTcGllbGVyIGthbm4gei5CLiBuaWNodCBtZWhyIHJpY2h0aWcgDQorICAgICAgICAgICAgIHNwcmVjaGVuIChTcHJhY2hmbHVjaCB1ZWJlciBQX1BFUk1fU1RSSU5HKSwgaXN0IGluIGRlciBCZXdlZ3VuZyANCisgICAgICAgICAgICAgZWluZ2VzY2hyYWVua3Qgb2RlciBncmVpZnQgd2FobGxvcyBOUENzIGFuLgorCisgICAgICAgICAgICAgSGllciBpc3QgZGFzIEVudGZsdWNoZW4gZHVyY2ggZWluZW4gS2xlcmlrZXIgYW5kZXJzLiBGaW5kZXQKKyAgICAgICAgICAgICBkYXMgU3BlbGxib29rIGVpbiBDTF9DVVJTRS1PYmpla3QgaW0gSW52IGRlcyBTcGllbGVycywgd2lyZAorICAgICAgICAgICAgIGdlZ2VuIGRhcyBMZXZlbCBkZXMgT2JqZWt0IGdld3VlcmZlbHQuIEJlaSBFcmZvbGcgd2lyZCBkYXMKKyAgICAgICAgICAgICBPYmpla3QgZW50ZmVybnQsIGJlaSBNaXNzZXJmb2xnIHBhc3NpZXJ0IG5pY2h0cyEKKworICAgICAgICAgICAgIEFscyBBbmhhbHRzcHVua3RlIGZ1ZXIgZGVuIExldmVsOgorICAgICAgICAgICAgIC0gPCBMZXZlbCAxMCBzaW5kIGVpbmZhY2ggenUgZW50Zmx1Y2hlCisgICAgICAgICAgICAgLSAxMCAtIDIwIHNpbmQgZnVlciBrbGVpbmUgS2xlcmlrZXIgc2Nob24gZW5vcm0gc2Nod2llcmlnCisgICAgICAgICAgICAgICBmdWVyIG1heC4gS2xlcmlrZXIgZ3V0IHp1IGVudGZsdWNoZW4uCisgICAgICAgICAgICAgLSB1ZWJlciAyMCBnZWxpbmd0IGVzIGF1Y2ggZWluZW0gbWF4LiBLbGVyaWtlciBuaWNodCBpbW1lcgorICAgICAgICAgICAgICAgYmVpbSBlcnN0ZW4gbWFsLgorICAgICAgICAgICAgIC0gYWIgMzAgbXVzcyBkZXIgbWF4LiBLbGVyaWtlciBzY2hvbiBtYWwgdGFua2VuIGdlaGVuCisgICAgICAgICAgICAgLSBVZWJlciBMZXZlbCA0MCBsaWVndCBkaWUgQ2hhbmNlIHNjaG9uIGltIFByb21pbGxlYmVyZWljaCEhIQorICAgICAgICAgICAgIC0gTGV2ZWwgMTAwIGxhZXNzdCBzaWNoIHVlYmVyaGF1cHQgbmljaHQgbWVociBlbnRmbHVjaGVuLgorCisgICAgICAgICAgICAgV2lsbCBtYW4gZGVtIFNwaWVsZXIgYWxzbyBlaW5lIHJlZWxsZSAodW5kIG5pY2h0IG51ciANCisgICAgICAgICAgICAgbWF0aGVtYXRpc2NoZSkgQ2hhbmNlIGxhc3Nlbiwgc29sbHRlIGRlciBGbHVjaGxldmVsIHVudGVyIDQwIA0KKyAgICAgICAgICAgICBibGVpYmVuLgorCisgICAgIERhcyBTY2hhZGVuc29iamVrdCBzZWxic3QgaXN0IHVuc2ljaHRiYXIsIG1laXN0IGF1dG9sb2FkIHVuZCBsb2VzdCBkaWUgDQorICAgICBTY2hhZGVuc2Z1bmt0aW9uIHVlYmVyIENhbGxvdXRzIGF1cy4KKworIEJFSVNQSUVMOgorICAgICBIaWVyIGVpbiBCZWlzcGllbCBmdWVyIGVpbmVuIEdpZnRwaWx6IChnZWZ1bmRlbiBiZWkgU2lsdmFuYSwgaW4KKyAgICAgL2QvZHNjaHVuZ2VsL3NpbHZhbmEvd2VnL29iai9waWx6LmMpOgorICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICNwcmFnbWEgc3Ryb25nX3R5cGVzCisgICAgICNpbmNsdWRlICIuLi9wZmFkLmgiCisKKyAgICAgaW5oZXJpdCAiL3N0ZC90aGluZyI7CisKKyAgICAgdm9pZCBjcmVhdGUoKSB7CisgICAgICAgaWYoIWNsb25lcChUTykpIHsKKyAgICAgICAgICAgc2V0X25leHRfcmVzZXQoLTEpOworICAgICAgICAgICByZXR1cm47CisgICAgICAgfQorICAgICAgIDo6Y3JlYXRlKCk7CisKKyAgICAgICBTZXRQcm9wKFBfU0hPUlQsMCk7CisgICAgICAgU2V0UHJvcChQX0lOVklTLDEpOworICAgICAgIFNldFByb3AoUF9MT05HLDApOworICAgICAgIFNldFByb3AoUF9OT0RST1AsMSk7CisgICAgICAgU2V0UHJvcChQX05FVkVSRFJPUCwxKTsKKyAgICAgICBTZXRQcm9wKFBfQVVUT0xPQURPQkosMSk7CisgICAgICAgU2V0UHJvcChQX1dFSUdIVCwwKTsKKyAgICAgICBTZXRQcm9wKFBfTkFNRSwiUGlsenZlcmdpZnR1bmciKTsKKyAgICAgICBTZXRQcm9wKFBfS0lMTF9OQU1FLCJFaW5lIFBpbHp2ZXJnaWZ0dW5nIik7CisgICAgICAgU2V0UHJvcChQX0dFTkRFUixGRU1BTEUpOworICAgICAgIFNldFByb3AoUF9BUlRJQ0xFLDEpOworICAgICAgIFNldFByb3AoUF9MRVZFTCwxMCk7CisgICAgICAgY2FsbF9vdXQoIm5leHRfc3RlcCIsMik7CisgICAgICAgQWRkQ2xhc3MoQ0xfUE9JU09OKTsKKyAgICAgfQorCisgICAgIHZvaWQgbmV4dF9zdGVwKCk7CisKKyAgICAgdm9pZCBuZXh0X3N0ZXAoKSB7CisgICAgICAgb2JqZWN0IHBsOworICAgICAgIGlmKCEocGw9VE9FKSB8fCAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShwbCkgfHwKKyAgICAgICAgICBwbC0+UXVlcnlQcm9wKFBfR0hPU1QpKXsKKyAgICAgICAgIHJlbW92ZSgpOworICAgICAgICAgcmV0dXJuIDsKKyAgICAgICB9CisgICAgICAgY2FsbF9vdXQoIyduZXh0X3N0ZXAgLDUpOworICAgICAgIGlmKCFpbnRlcmFjdGl2ZShwbCkpIHJldHVybjsKKyAgICAgICB0ZWxsX29iamVjdChwbCwKKyAgICAgICAJCSAgICJEZWluIEJhdWNoIHNjaG1lcnp0LiBEdSB3aW5kZXN0IERpY2ggaW4gS3JhZW1wZmVuLlxuIik7CisgICAgICAgaWYoRU5WKHBsKSkgdGVsbF9yb29tKEVOVihwbCksCisgICAgICAgIHBsLT5OYW1lKCkrIiB3aW5kZXQgc2ljaCB2b3IgU2NobWVyemVuIGFtIEJvZGVuLlxuIiwoeyBwbCB9KSk7CisgICAgICAgcGwtPmRvX2RhbWFnZShRdWVyeVByb3AoUF9MRVZFTCkqMiArIHJhbmRvbSgxMCksVE8pOworICAgICB9CisKKyBTSUVIRSBBVUNIOgorICAgIFBfUE9JU09OLCBQX0NVUlNFRCwgUF9QRVJNX1NUUklORworCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgIDExLjA4LjIwMDcsIFplc3N0cmEKZGlmZiAtLWdpdCBhL2RvYy93aXovZ2lsZGVuLWRva3UgYi9kb2Mvd2l6L2dpbGRlbi1kb2t1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZTNhYTcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd2l6L2dpbGRlbi1kb2t1CkBAIC0wLDAgKzEsNDk2IEBACitHaWxkZW4gCisqKioqKioqCisKK0dpbGRlbiBzaW5kIGRhenUgZGEsIFNwaWVsZXJuIGJlc29uZGVyZSBGYWVoaWdrZWl0ZW4genUgdmVybGVpaGVuLiBEaWVzCitrb2VubmVuIFphdWJlcnNwcnVlY2hlIChTcGVsbHMpIHNlaW4sIGVzIGthbm4gYWJlciBhdWNoIGFuZGVyZSBGYWVoaWdrZWl0ZW4KKyhTa2lsbHMpIGdlYmVuLiBBbHMgU3BlbGwgZ2lsdCBqZWRlIEZhZWhpZ2tlaXQsIGRpZSBlaW4gU3BpZWxlciBtaXQgZWluZW0KK0JlZmVobCBkaXJla3QgYXVmcnVmZW4gbXVzcy4gRGFtaXQgYXVjaCBhbmRlcmUgR2lsZGVuIGRpZSBnbGVpY2hlbgorWmF1YmVyc3BydWVjaGUgdmVyd2VuZGVuIGtvZW5uZW4sIG11ZXNzZW4gZGllIFNwcnVlY2hlIGluIGVpZ2VuZW4KK1NwZWxsYm9va3MgYWJnZWxlZ3Qgd2VyZGVuLiBFaW5lIEdpbGRlIGthbm4gU3BydWVjaGUgYXVzIGJlbGllYmlnZW4KK1NwZWxsYm9va3MgdmVyd2VuZGVuIHVuZCBkaWVzZSBnZ2YuIGxlaWNodCBtb2RpZml6aWVyZW4uIAorCitHaWxkZW5vYmpla3QgCis9PT09PT09PT09PT09CisKK0VpbmUgR2lsZGUgbXVzcyBlaW4gT2JqZWt0IGhhYmVuLCBiZWkgZGVtIGRlciBTcGllbGVyIGRlciBHaWxkZSBiZWl0cmV0ZW4KK2J6dy4gYXVzdHJldGVuIHVuZCBkaWUgRmFlaGlna2VpdGVuIGRlciBHaWxkZSBlcndlcmJlbiBrYW5uLiBHZXdvZWhubGljaAoraXN0IGRpZXMgZWluIFJhdW0sIGRlciAiL3N0ZC9naWxkZW5fcm9vbSIgaW5oZXJpdGV0LCBlcyBrYW5uIGFiZXIgYXVjaCBlaW4KK2FuZGVyZXMgT2JqZWt0IHNlaW4sIGZ1ZXIgZGllc2VuIEZhbGwgaXN0ICIvc3RkL2dpbGRlbl9vYiIgdm9yZ2VzZWhlbi4gCisKK0RpZSBCZWl0cml0dHNiZWRpbmd1bmdlbiBmdWVyIGRpZSBHaWxkZSB3ZXJkZW4gaW4gRm9ybSBlaW5lcyAKK1Jlc3RyaWN0aW9uLU1hcHBpbmdzIGluIGRlciBQcm9wZXJ0eSBQX0dJTERFTl9SRVNUUklDVElPTlMKK2FiZ2VsZWd0LiAKKworRGFzIFNwZWxsYm9vaywgaW4gZGVtIGRpZSBTcGVsbHMgZGVyIEdpbGRlIHN0ZWhlbiwgbXVzcyBpbgorUF9HVUlMRF9ERUZBVUxUX1NQRUxMQk9PSyBnZW5hbm50IHNlaW4uIEVzIHdpcmQgYXV0b21hdGlzY2gKKyIvc3BlbGxib29rcy8iIHZvcm5lIGFuIGRlbiBOYW1lbiBhbmdlZnVlZ3QuIERpZSBTcGVsbHMsIGRpZSBhdXMgZGllc2VtCitTcGVsbGJvb2sgdmVyd2VuZGV0IHdlcmRlbiBzb2xsZW4sIGtvZW5uZW4gZGFubiBlaW5mYWNoIG1pdAorQWRkU3BlbGwobmFtZSkgYXVzZ2V3YWVobHQgd2VyZGVuLiBXZW5uIGVpbiBTcHJ1Y2ggbW9kaWZpemllcnQgd2VyZGVuCitzb2xsIHNvIGthbm4gZWluIE1hcHBpbmcgbWl0IHp1c2FldHpsaWNoZW4gSW5mb3JtYXRpb25lbiBhbHMgendlaXRlcworQXJndW1lbnQgYW5nZWdlYmVuIHdlcmRlbi4gSW4gZGllc2VtIGthbm4gbWFuIGRhbm4gYXVjaCBlaW4gYW5kZXJlcworU3BlbGxib29rIGFscyBkYXMgRGVmYXVsdC1TcGVsbGJvb2sgbWl0IChbU0lfU1BFTExCT09LOm5hbWVdKQorYW5nZWJlbi4gSW4gUF9HTE9CQUxfU0tJTExQUk9QUyBrYW5uIGVpbiBNYXBwaW5nIGFuZ2VnZWJlbgord2VyZGVuLCBkYXMgYWxsZSBTcGVsbHMgdW5kIFNraWxscyBtb2RpZml6aWVydC4gUF9HTE9CQUxfU0tJTExQUk9QUwordW5kIFBfR0lMREVOX0RFRkFVTFRfU1BFTExCT09LIG11ZXNzZW4gdWVicmlnZW5zIGdlc2V0enQKK3dlcmRlbiBiZXZvciBtaXQgQWRkU3BlbGwvU2tpbGwgU3BlbGxzIG9kZXIgU2tpbGxzIGhpbnp1Z2VmdWVndCB3ZXJkZW4uIAorCitGdWVyIGFuZGVyZSBGYWVoaWdrZWl0ZW4gc2luZCBBZGRTa2lsbCB1bmQgTGVhcm5Ta2lsbCB2b3JnZXNlaGVuLgorTGVhcm5Ta2lsbCB3aXJkIGltIEdlZ2Vuc2F0eiB6dSBMZWFyblNwZWxsIGplZG9jaCBuaWNodCBhdXRvbWF0aXNjaCB2b20KKy9zdGQvZ2lsZGVuX3Jvb20gbWl0ICJsZXJuZSIgYXVmZ2VydWZlbiwgd2VpbCBpLkEuIGRpZXNlIEZhZWhpZ2tlaXRlbiBhdWYKK2FuZGVyZSBBcnQgZXJ3b3JiZW4gd2VyZGVuLCB6LkIuIGJlaW0gR2lsZGVuZWludHJpdHQgb2RlciBkdXJjaAorVHJhaW5pbmdzc3R1bmRlbi4gTWl0IExlYXJuU2tpbGwga2FubiBtYW4gbnVyIHNvbGNoZSBGYWVoaWdrZWl0ZW4KK2Vyd2VyYmVuLCBkaWUgbWl0IEFkZFNraWxsIGFuZ2VmdWVndCB3dXJkZW4uIAorCitTa2lsbHMgd2VyZGVuIHVlYmxpY2hlcndlaXNlIGR1cmNoIGRlbiBBdWZydWYgdm9uIFVzZVNraWxsIGltIFNwaWVsZXIKK3ZlcndlbmRldC4gV2VubiBkZXIgU3BpZWxlciBpbiBlaW5lciBHaWxkZSBpc3QgdW5kIGVpbmUgRnVua3Rpb24gdW50ZXIKK1NJX1NLSUxMRlVOQyB6dSBmaW5kZW4gaXN0LCBzbyB3aXJkIGRpZXNlIGltIEdpbGRlbm9iamVrdCBhdWZnZXJ1ZmVuLAorc29uc3Qgd2lyZCB2ZXJzdWNodCBTdGRTa2lsbF9OYW1lIGltIFNwaWVsZXIgYXVmenVydWZlbi4gV2VubiBhdWNoIGRhcworZmVobHNjaGxhZWd0IHdpcmQgbnVyIGRlciBXZXJ0IHVudGVyIFNJX0FCSUxJVFkgenVydWVja2dlZ2ViZW4uIAorCitFcyBzdGVoZW4gZm9sZ2VuZGUgRnVua3Rpb25lbiB6dXIgQmVudXR6dW5nIHp1ciBWZXJmdWVndW5nOiAKKworIG8gUXVlcnlTcGVsbChuYW1lKQorICAgTGllZmVydCBkaWUgSW5mb3JtYXRpb25lbiB6dSBkaWVzZW0gU3BlbGwgCisgbyBRdWVyeVNraWxsKG5hbWUpCisgICBMaWVmZXJ0IGRpZSBJbmZvcm1hdGlvbmVuIHp1IGRpZXNlciBGYWVoaWdrZWl0IAorIG8gQWRkU3BlbGwobmFtZSxpbmZvKQorICAgU3BlbGwgd2lyZCBoaW56dWdlZnVlZ3QgCisgbyBBZGRTa2lsbChuYW1lLGluZm8pCisgICBGYWVoaWdrZWl0IHdpcmQgenVnZWZ1ZWd0IAorIG8gTGVhcm5TcGVsbChuYW1lKQorICAgU3BpZWxlciBsZXJudCBkZW4gYW5nZWdlYmVuZW4gU3BlbGwsIGZhbGxzIG1vZWdsaWNoLiBMaXN0ZSBkZXIgU3BlbGxzCisgICB3aXJkIGF1c2dlZ2ViZW4sIGZhbGxzIGtlaW5lciBhbmdlZ2ViZW4gaXN0LiAKKyBvIExlYXJuU2tpbGwobmFtZSkKKyAgIFNwaWVsZXIgZXJ3aXJidCBkaWVzZSBGYWVoaWdrZWl0LCBmYWxscyBtb2VnbGljaC4gTGlzdGUgYWxsZXIKKyAgIEZhZWhpZ2tlaXRlbiB3aXJkIGF1c2dlZ2ViZW4sIGZhbGxzIGtlaW5lIGFuZ2VnZWJlbiBpc3QuIAorIG8gR2lsZGVuTmFtZSgpCisgICBMaWVmZXJ0IGRlbiBOYW1lbiBkaWVzZXIgR2lsZGUuIAorIG8gSW5pdGlhbFNraWxsQWJpbGl0eShpbmZvLHNwaWVsZXIpCisgICBSZWNobmV0IGRlbiBBbmZhbmdzd2VydCBmdWVyIFNJX1NLSUxMQUJJTElUWSBhdXMuIAorIG8gU2tpbGxMaXN0ZSh4KQorICAgRXMgd2lyZCBhbmdlemVpZ3QsIHdlbGNoZSBTcGVsbHMvU2tpbGxzIGRlciBTcGllbGVyIGxlcm5lbiBrYW5uLgorICAgRGFiZWkgYmVkZXV0ZXQgeDogCisgICAgbyAxOiBOdXIgU3BlbGxzIGFuemVpZ2VuIAorICAgIG8gMjogTnVyIFNraWxscyBhbnplaWdlbiAKKyAgICBvIDM6IEJlaWRlcyBhbnplaWdlbiAKKworVm9uIGRpZXNlbiBGdW5rdGlvbmVuIHN0ZWhlbiBpbiAvc3RkL2dpbGRlbl9yb29tIGF1dG9tYXRpc2NoCitiZWlfb2Rlcl9hdXN0cmV0ZW4gdW5kIExlYXJuU3BlbGwgZGVtIFNwaWVsZXIgenVyIFZlcmZ1ZWd1bmcuIAorCitTcGVsbGJvb2sgCis9PT09PT09PT09CisKK1NwZWxsYm9va3Mgc3RlbGxlbiBkaWUgU3BlbGxzIHp1ciBWZXJmdWVndW5nLCBkaWUgU3BpZWxlciBvZGVyIE1vbnN0ZXIKK3ZlcndlbmRlbiBrb2VubmVuLiBBbGxlIFNwZWxsYm9va3Mgc29sbHRlbiAvc3RkL3NwZWxsYm9vayBpbmhlcml0ZW4uIEluIGRlcgorZWluZmFjaHN0ZW4gRm9ybSBrYW5uIGVpbiBTcGVsbCB3aWUgZm9sZ3QgaGluenVnZWZ1ZWd0IHdlcmRlbjogCitBZGRTcGVsbCh2ZXJiLGtvc3RlbixsZXZlbCkKK0RhYmVpIGlzdCAidmVyYiIgc293b2hsIGRlciBOYW1lIGRlcyBWZXJicywgbWl0IGRlbSBkZXIgU3BydWNoCithdWZnZXJ1ZmVuIHdlcmRlbiBzb2xsLCB3aWUgYXVjaCBkZXIgTmFtZSBkZXIgRnVua3Rpb24sIGRpZSBkYWJlaQorYXVmZ2VydWZlbiB3aXJkLiAia29zdGVuIiBzaW5kIGRpZSBNYWdpZXB1bmt0ZSwgZGllIGZ1ZXIgZGVuIFNwcnVjaAorYmVub2V0aWd0IHdlcmRlbiB1bmQgImxldmVsIiBpc3QgZGVyIFNwaWVsZXJsZXZlbCwgZGVyIG5vZXRpZyBpc3QsIHVtIGRpZXNlbgorU3BydWNoIHp1IGxlcm5lbi4gCisKK0luIGRlciBmbGV4aWJsZXJlbiBGb3JtIHdlcmRlbiBTcGVsbHMgbWl0IAorQWRkU3BlbGwodmVyYixrb3N0ZW4saW5mbykKK2hpbnp1Z2VmdWVndC4gRGFiZWkgaXN0ICJpbmZvIiBlaW4gTWFwcGluZywgaW4gZGVtIGFsbGUgYW5kZXJlbiAKK1NwZWxsLUluZm9ybWF0aW9uZW4gc3RlaGVuLiBEYWJlaSBrYW5uIHouQi4gZWluZSBhbmRlcmUgRnVua3Rpb24gYWxzIGRhcworVmVyYiBhbHMgRWludHJhZyAKK1NJX1NLSUxMRlVOQzpuYW1lCithbmdlZ2ViZW4gd2VyZGVuLiBXZW5uIHp1bSBMZXJuZW4gZWluZSBiZXN0aW1tdGUgU3R1ZmUgZXJmb3JkZXJsaWNoIGlzdAorc28gbXVzcyAKK1NJX1NLSUxMUkVTVFJfTEVBUk46KFtQX0xFVkVMOmxldmVsXSkKK2VpbmdldHJhZ2VuIHNlaW4uIEVzIHNvbGx0ZW4gYWxsZSBXZXJ0ZSwgdm9uIGRlbmVuIGVpbiBTcGVsbCBhYmhhZW5ndCwgaW4gZGVtCitNYXBwaW5nIGVpbmdldHJhZ2VuIHNlaW4uIERhZHVyY2ggaGFiZW4gR2lsZGVuIGRpZSBNb2VnbGljaGtlaXQsIFNwZWxscworbWl0IE9mZnNldHMgdW5kIEZha3RvcmVuIHp1IG1vZGlmaXppZXJlbi4gCisKK0luIFBfR0xPQkFMX1NLSUxMUFJPUFMga2FubiBlaW4gTWFwcGluZyBzdGVoZW4sIGRhc3MgYmVpIGplZGVtCitTcGVsbCB6dW0gSW5mbyBhZGRpZXJ0IHdpcmQuIERpZXNlcyBzb2xsdGUgZ2VzZXR6dCB3ZXJkZW4sIGJldm9yIGRpZSBTcGVsbHMKK21pdCBBZGRTcGVsbCBoaW56dWdlZnVlZ3Qgd2VyZGVuLiAKKworRGllIEJlbnV0enVuZyB2b24gU3BlbGxzIGxhZXVmdCB3aWUgZm9sZ3QgYWI6IAorCisgbyBadWVyc3Qgd2lyZCB1ZWJlcnBydWVmdCwgb2IgZGVyIFNwaWVsZXIgZGVuIFNwcnVjaCB2ZXJ3ZW5kZW4gZGFyZi4KKyAgIERhenUgd2lyZCBkaWUgRnVua3Rpb24gQ2FuVHJ5U3BlbGwgYXVmZ2VydWZlbi4gRGllc2UgcHJ1ZWZ0CisgICBub3JtYWxlcndlaXNlLCBvYiBkZXIgU3BpZWxlciBrZWluIEdlaXN0IGlzdCB1bmQgb2IgZXIgZGllCisgICBFaW5zY2hyYWVua3VuZ2VuIGVyZnVlbGx0LCBkaWUgYWxzIFNJX1NLSUxMUkVTVFJfVVNFCisgICBhbmdlZ2ViZW4gc2luZC4gCisgbyBBbHMgbmFlY2hzdGVzIHdpcmQgZ2VwcnVlZnQsIG9iIGRlciBTcGllbGVyIG5vY2ggZ2VudWcgTWFnaWVwdW5rdGUKKyAgIGhhdC4gRGllc2Ugc3RlaGVuIGltIE1hcHBpbmcgdW50ZXIgU0lfU1BFTExDT1NULiAKKyBvIEFscyBsZXR6dGVzIHdpcmQgZ2VwcnVlZnQsIG9iIGRlciBTcGllbGVyIG5vY2ggZXJzY2hvZXBmdCBpc3Qgdm9uCisgICBzZWluZW0gbGV0enRlbiBTcHJ1Y2guIAorIG8gTnVuIHdpcmQgZGllIGVpZ2VudGxpY2hlIEZ1bmt0aW9uIGRlcyBTcGVsbHMgYXVmZ2VydWZlbiwgd2VubiBlcyBkaWUKKyAgIFVtZ2VidW5nIHp1bGFlc3N0LiBEaWUgRnVua3Rpb24gbXVzcyBlaW5lbiBwb3NpdGl2ZW4gV2VydAorICAgenVydWVja2dlYmVuLCB3ZW5uIGRlciBTcHJ1Y2ggZ2VsdW5nZW4gaXN0LCB1bmQgZWluZW4gbmVnYXRpdmVuLAorICAgd2VubiBlciBtaXNzbHVuZ2VuIGlzdC4gRmFsbHMgZGVyIFNwcnVjaCBhdXMgaXJnZW5kIGVpbmVtIEdydW5kCisgICBuaWNodCBhbndlbmRiYXIgaXN0IHNvbGwgMCB6dXJ1ZWNrZ2VnZWJlbiB3ZXJkZW4uIAorIG8gQmVpIEVyZm9sZyBvZGVyIE1pc3NlcmZvbGcgd2VyZGVuIGRpZSBNYWdpZXB1bmt0ZSBhYmdlem9nZW4gdW5kCisgICBkZXIgU3BpZWxlciBpc3QgZnVlciBkaWUgbmFlY2hzdGUgWmVpdCBlcnNjaG9lcGZ0LiBEaWUgWmVpdHNwYW5uZSBpc3QKKyAgIGltIE1hcHBpbmcgdW50ZXIgU0lfU1BFTExGQVRJR1VFIHp1IGZpbmRlbi4gCisgbyBCZWkgRXJmb2xnIHdpcmQgZGllIEZ1bmt0aW9uICJFcmZvbGciIGF1ZmdlcnVmZW4sIGJlaSBNaXNzZXJmb2xnCisgICBkaWUgRnVua3Rpb24gIk1pc3NlcmZvbGciIAorIG8gRGllIEZ1bmt0aW9uICJNaXNzZXJmb2xnIiBydWZ0IG5vcm1hbGVyd2Vpc2UgZGllIEZ1bmt0aW9uICJMZWFybiIKKyAgIGF1ZiwgZGFtaXQgZGVyIFNwaWVsZXIgYXVzIHNlaW5lbiBGZWhsZXJuIGxlcm50LiAKKworRGllIGVpZ2VudGxpY2hlIFNwZWxsZnVua3Rpb24gc29sbHRlLCBmYWxscyBkZXIgU3BlbGwgYW53ZW5kYmFyIGlzdCwgbWl0CitTcGVsbFN1Y2Nlc3MgcHJ1ZWZlbiwgb2IgZXIgZXJmb2xncmVpY2ggaXN0IG9kZXIgbmljaHQuIERhYmVpIGdlbHRlbiBXZXJ0ZQorZ3JvZXNzZXIgTnVsbCBhbHMgRXJmb2xnLiBJbiBkZXIgU3BlbGxmdW5rdGlvbiBzb2xsdGVuLCBmYWxscyBtb2VnbGljaCwgCitTa2lsbEF0dHJpYnV0ZSBkZXMgU3BpZWxlcnMgc293aWUgRmFrdG9yZW4gdW5kIE9mZnNldHMgYmVydWVja3NpY2h0aWd0Cit3ZXJkZW4uIEZ1ZXIgYmVpZGVzIHN0ZWhlbiBlaW5mYWNoIHp1IGhhbmRoYWJlbmRlIEZ1bmt0aW9uZW4genVyCitWZXJmdWVndW5nLiBEaWVzIGlzdCB6d2FyIGV0d2FzIG1laHIgQXJiZWl0LCBkYWZ1ZXIgZ2VzY2hlaGVuIGRhbm4gRGluZ2UKK3dpZSBJbnRlcmFrdGlvbmVuIHp3aXNjaGVuIGRlbiBTcGVsbHMgZmFzdCBhdXRvbWF0aXNjaC4gCisKK0ZvbGdlbmRlIEZ1bmt0aW9uZW4gc3RlbGx0IGRhcyBTdGFuZGFyZC1TcGVsbGJvb2sgenVyIFZlcmZ1ZWd1bmc6IAorCisgbyBRdWVyeVNwZWxsKG5hbWUpCisgICBMaWVmZXJ0IEluZm9ybWF0aW9ucy1NYXBwaW5nIHp1IGRpZXNlbSBTcGVsbC4gCisgbyBBZGRTcGVsbChuYW1lLGtvc3RlbixpbmZvKQorICAgRnVlZ3QgU3BlbGwgbWl0IGFuZ2VnZWJlbmVuIEtvc3RlbiB1bmQgZGVtCisgICBJbmZvcm1hdGlvbnMtTWFwcGluZyBpbnMgU3BlbGxib29rIGVpbi4gCisgbyBUcnlBdHRhY2tTcGVsbChvcGZlcixzY2hhZGVuLHR5cGVuLGlzX3NwZWxsLGNhc3RlcixpbmZvKQorICAgVmVyc3VjaHQgZGVuIEFuZ3JpZmZzLVNwcnVjaCBhdWYgZGVuIEdlZ25lciBhbnp1d2VuZGVuLiBEaWUKKyAgIG1pdHRsZXJlbiA0IFdlcnRlIHNpbmQgZGllLCBkaWUgYXVjaCBiZWkgRGVmZW5kIHVlYmVyZ2ViZW4gd2VyZGVuLgorICAgRGFiZWkgd2lyZCBkaWUgQWJ3ZWhyZmFlaGlna2VpdCBkZXMgR2VnbmVycyBnZWdlbiBNYWdpZSB1bmQgZGFzCisgICBTa2lsbC1BdHRyaWJ1dCBTQV9EQU1BR0UgYXV0b21hdGlzY2ggYmVydWVja3NpY2h0aWd0LiAKKyBvIFRyeURlZmF1bHRBdHRhY2tTcGVsbChvcGZlcixjYXN0ZXIsaW5mbyxpc19zcGVsbCkKKyAgIFdpZSBUcnlBdHRhY2tTcGVsbCwgbnVyIHdlcmRlbiBTY2hhZGVuIHVuZCBTY2hhZGVuc3R5cGVuCisgICBhdXRvbWF0aXNjaCBhdXMgZGVtIEluZm9ybWF0aW9ucy1NYXBwaW5nIGVudG5vbW1lbi4gQmVpIGJlaWRlbgorICAgRnVua3Rpb25lbiBzb2xsdGUgYWxzIGlzX3NwZWxsIHVlYnJpZ2VucyBlaW4gU3RyaW5nIHN0ZWhlbiwgei5CLgorICAgIkZldWVyYmFsbCIsIGRhbWl0IGVzIGxlaWNodGVyIG1vZWdsaWNoIGlzdCwgTW9uc3RlciB6dSBzY2hyZWliZW4sIGRpZQorICAgYXVmIGRpZXNlIHJlYWdpZXJlbi4gCisgbyBTcGVsbFN1Y2Nlc3MoY2FzdGVyLGluZm8pCisgICBFcm1pdHRlbHQsIG9iIGRlciBTcGVsbCBmdW5rdGlvbmllcnQgb2RlciBmZWhsc2NobGFlZ3QuIERhYmVpIHdpcmQKKyAgIGF1Y2ggZWluZSBldnRsLiB2b3JoYW5kZW5lIFNwZWxsY2FzdGluZy1GYWVoaWdrZWl0IChTS19DQVNUSU5HKQorICAgYmVydWVja3NpY2h0aWd0LiBPaG5lIFNwZWxsY2FzdGluZy1GYWVoaWdrZWl0IGxpZWd0IGRhcyBFcmdlYm5pcworICAgendpc2NoZW4gLU1BWF9BQklMSVRZIHVuZCArTUFYX0FCSUxJVFksIG1pdCBkaWVzZXIKKyAgIEZhZWhpZ2tlaXQga29lbm5lbiBkaWUgV2VydGUgendpc2NoZW4gLTIqTUFYX0FCSUxJVFkgdW5kCisgICArMipNQVhfQUJJTElUWSBsaWVnZW4uIFdlcnRlIGtsZWluZXIgb2RlciBnbGVpY2ggTnVsbCBzb2xsZW4KKyAgIGFscyBGZWhsc2NobGFnIGludGVycHJldGllcnQgd2VyZGVuLiAKKyAgIFdlciB3aWxsLCBrYW5uIFdlcnRlIHVlYmVyICtNQVhfQUJJTElUWSBhbHMgYmVzb25kZXJzIGd1dAorICAgZ2VsdW5nZW5lIFNwZWxscyBpbnRlcnByZXRpZXJlbiB1bmQgYmVpIFdlcnRlbiB1bnRlcgorICAgLU1BWF9BQklMSVRZIHVuYW5nZW5laG1lIFdpcmt1bmdlbiBhdXNsb2VzZW4sIHouQi4ga2FubgorICAgc2ljaCBkZXIgU3BlbGwgZGFubiBnZWdlbiBkZW4gU3BpZWxlciByaWNodGVuLi4uIAorICAgV2VubiBlaW4gU3BpZWxlciBkaWUgU3BlbGxjYXN0aW5nLUZhZWhpZ2tlaXQgaGF0IHVuZCBlaW4gU3BydWNoCisgICBiZXNvbmRlcnMgZ3V0IGdlbGluZ3QsIHNvIGZyZXV0IGVyIHNpY2ggdW5kIHZlcmJlc3NlcnQgZGllc2UKKyAgIEZhZWhpZ2tlaXQuIAorIG8gQ2FuVHJ5U3BlbGwoY2FzdGVyLGluZm8pCisgICBFcm1pdHRlbHQsIG9iIGRlciBTcGllbGVyIGRlbiBTcHJ1Y2ggYW53ZW5kZW4gZGFyZi4gTm9ybWFsZXJ3ZWlzZQorICAgaXN0IGRpZXNlIGRlciBGYWxsLCB3ZW5uIGVyIGtlaW4gR2Vpc3QgaXN0IHVuZCBkaWUgQmVkaW5ndW5nZW4KKyAgIGVyZnVlbGx0LCBkaWUgdW50ZXIgU0lfU0tJTExSRVNUUl9VU0UgaW0gTWFwcGluZyBlaW5nZXRyYWdlbgorICAgc2luZC4gCisgbyBMZWFybihjYXN0ZXIsc3BlbGwsaW5mbykKKyAgIERpZXNlIEZ1bmt0aW9uIHdpcmQgbm9ybWFsZXJ3ZWlzZSBiZWkgTWlzc2VyZm9sZyBhdWZnZXJ1ZmVuLAorICAgZGFtaXQgZGVyIFNwaWVsZXIgYXVzIHNlaW5lbiBGZWhsZXJuIGxlcm50LiBEYWJlaSB3aXJkCisgICB1ZWJsaWNoZXJ3ZWlzZSBkaWUgSW50ZWxsaWdlbnogZGVzIFNwaWVsZXJzIGJlcnVlY2tzaWNodGlndC4gRnVlciBqZSAyCisgICBTdHVmZW4gQV9JTlQgYmVrb21tdCBkZXIgU3BpZWxlciBTSV9TS0lMTExFQVJOIGhpbnp1LiAKKworICAgTW9lY2h0ZSBtYW4gZWluIGFuZGVyZXMgQXR0cmlidXQgenVtIGxlcm5lbiB2ZXJ3ZW5kZW4ga2FubiBtYW4gZGllcworICAgaW4gRm9ybSBlaW5lcyBNYXBwaW5ncyBpbiBTSV9MRUFSTl9BVFRSSUJVVEUgdHVuLgorCisgICBTSV9MRUFSTl9BVFRSSUJVVEU6KFtBX1NUUjoxXSkgbWFjaHQgZGFzIExlcm5lbiByZWluIHN0YWVya2VhYmhhZW5naWcsCisgICBTSV9MRUFSTl9BVFRSSUJVVEU6KFtBX1NUUjoxLEFfSU5UOjJdKSBiaWxkZXQgZGVuIGdld2ljaHRldGVuIE1pdHRlbHdlcnQKKyAgIHZvbiBTVFIgdW5kIHp3ZWlmYWNoZXIgSU5ULiAgCisKKyBvIEVyZm9sZyhjYXN0ZXIsc3BlbGwsaW5mbykKKyAgIERpZXNlIEZ1bmt0aW9uIHdpcmQgYmVpIEVyZm9sZyBhdWZnZXJ1ZmVuLiAKKyBvIE1pc3NlcmZvbGcgKGNhc3RlcixzcGVsbCxpbmZvKQorICAgRGllc2UgRnVua3Rpb24gd2lyZCBiZWkgTWlzc2VyZm9sZyBhdWZnZXJ1ZmVuLiAKKyBvIEZpbmRWaWN0aW0od2VuLHNwaWVsZXIsbXNnKQorICAgIndlbiIgd2lyZCBpbiBkZXIgVW1nZWJ1bmcgZGVzIFNwaWVsZXJzIGdlc3VjaHQuIEZhbGxzIGRpZXNlCisgICBWYXJpYWJsZSBOdWxsIGlzdCB3aXJkIHp1ZmFlbGxpZyBlaW4gRmVpbmQgYXVzZ2V3YWVobHQuIEZhbGxzCisgICBuaWVtYW5kIGdlZnVuZGVuIHdpcmQsIHNvIHdpcmQgIm1zZyIgYXVzZ2VnZWJlbi4gCisgbyBGaW5kTGl2aW5nVmljdGltKHdlbixzcGllbGVyLG1zZykKKyAgIFdpZSBGaW5kVmljdGltLCBudXIgd2lyZCB6dXNhZXR6bGljaCB1ZWJlcnBydWVmdCwgb2IgZXMgZWluCisgICBMZWJld2VzZW4gaXN0LiAKKyBvIEZpbmRFbmVteVZpY3RpbSh3ZW4sc3BpZWxlcixtc2cpCisgICBXaWUgRmluZExpdmluZ1ZpY3RpbSwgbnVyIGRlciBTcGllbGVyIHNlbGJzdCB3aXJkIGF1c2dlbm9tbWVuCisgICB1bmQgd2VubiBlcyB2b3JoZXIgbm9jaCBrZWluIEZlaW5kIHdhciwgc28gd2lyZCBLaWxsIGF1ZmdlcnVmZW4KKyAgIGRhbWl0IGVzIGhpbnRlcmhlciBnYXJhbnRpZXJ0IGVpbmVyIGlzdC4gCisgbyBGaW5kR3JvdXAoc3BpZWxlcix3ZW4pCisgICBCZWkgU3BpZWxlcm4gZmluZGV0IGRpZSBGdW5rdGlvbiBhbGxlIE1vbnN0ZXIgaW0gUmF1bSwgd2VubiAid2VuIgorICAgbmVnYXRpdiBpc3QsIGFsbGUgU3BpZWxlciB3ZW5uICJ3ZW4iIHBvc2l0aXYgaXN0IHVuZCBhbGxlIExlYmV3ZXNlbgorICAgd2VubiAid2VuIiBOdWxsIGlzdC4gQmVpIE1vbnN0ZXJuIGlzdCBlcyBnZW5hdSB1bWdla2VocnQuIEVzIHNvbGx0ZQorICAgamVkb2NoIEZpbmRHcm91cFAgbWl0IDEwMCUgdmVyd2VuZGV0IHdlcmRlbi4gCisgbyBGaW5kR3JvdXBOKHNwaWVsZXIsd2VuLG4pCisgICBXaWUgRmluZEdyb3VwLCBqZWRvY2ggbWF4aW1hbCBuIFBlcnNvbmVuLiBEYXMgU2tpbGwtQXR0cmlidXQKKyAgIFNBX0VYVEVOU0lPTiB3aXJkIGF1dG9tYXRpc2NoIGJlcnVlY2tzaWNodGlndC4gCisgbyBGaW5kR3JvdXBQKHNwaWVsZXIsd2VuLHByb3plbnQpCisgICBXaWUgRmluZEdyb3VwLCBqZWRvY2ggamVkZSBQZXJzb24gbWl0IGRlciBhbmdlZ2ViZW5lbgorICAgV2FocnNjaGVpbmxpY2hrZWl0LiBEYXMgU2tpbGwtQXR0cmlidXQgU0FfRVhURU5TSU9OIHdpcmQKKyAgIGF1dG9tYXRpc2NoIGJlcnVlY2tzaWNodGlndC4gCisKK05ldWUgRnVua3Rpb25lbiBpbSBMaXZpbmcgCis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgbyBRdWVyeVNraWxsQXR0cmlidXRlKG5hbWUpCisgICBIaWVybWl0IGthbm4gZGFzIFNraWxsLUF0dHJpYnV0IG1pdCBkZW0gYW5nZWdlYmVuZW4gTmFtZW4KKyAgIGFiZ2VmcmFndCB3ZXJkZW4uIAorIG8gU2V0U2tpbGxBdHRyaWJ1dGUoY2FzdGVyLG5hbWUsd2VydCxkYXVlcixmdW5jKQorICAgSGllcm1pdCBrYW5uIGRhcyBhbmdlZ2ViZW5lIFNraWxsLUF0dHJpYnV0IHZvbSBjYXN0ZXIgZnVlciBkaWUKKyAgIGFuZ2VnZWJlbmUgRGF1ZXIgYXVmIGVpbmVuIFdlcnQgZ2VzZXR6dCB3ZXJkZW4uIEVzIGthbm4gZWluZQorICAgRnVua3Rpb24gYW5nZWdlYmVuIHdlcmRlbiwgZGllIGRlbiBXZXJ0IHN0YXR0IGRlc3NlbiBsaWVmZXJuIHNvbGwuIAorIG8gUXVlcnlTa2lsbChuYW1lKQorICAgRGllcyBsaWVmZXJ0IGRpZSBzcGllbGVyc3BlemlmaXNjaGVuIFNraWxsLUluZm9ybWF0aW9uZW4uIAorIG8gUXVlcnlTa2lsbEFiaWxpdHkobmFtZSkKKyAgIERpZXMgbGllZmVydCB2b24gZGVuIFNraWxsLUluZm9ybWF0aW9uZW4gbnVyIFNJX0FCSUxJVFkuIAorIG8gTW9kaWZ5U2tpbGwobmFtZSxpbmZvLGRpZmYpCisgICBNb2RpZml6aWVydCBkaWUgU2tpbGwtSW5mb3JtYXRpb25lbi4gV2VubiAiaW5mbyIgZWluIE1hcHBpbmcgaXN0LAorICAgc28gd2lyZCBlcyB6dSBkZW0gYWx0ZW4gTWFwcGluZyAiYWRkaWVydCIgKGFsc28gZGllIGFuZ2VnZWJlbmVuCisgICBXZXJ0ZSBnZWFlbmRlcnQpLCB3ZW5uIG51ciBlaW4gV2VydCBhbmdlZ2ViZW4gaXN0LCB3aXJkCisgICBhbmdlbm9tbWVuIGRhc3MgZXMgc2ljaCBkYWJlaSB1bSBTSV9BQklMSVRZIGhhbmRlbHQuIAorIG8gTGVhcm5Ta2lsbChuYW1lLGFkZCxkaWZmKQorICAgQWRkaWVydCBkZW4gYW5nZWdlYmVuZW4gV2VydCB6dSBTSV9BQklMSVRZLiBEYWJlaSBpc3QgImRpZmYiIGRlcgorICAgU2Nod2llcmlna2VpdHNncmFkIHZvbiBkaWVzZW0gU3BlbGwvU2tpbGwuIER1cmNoIGRlbgorICAgU2Nod2llcmlna2VpdHNncmFkIFNJX0FCSUxJVFkgYWJoYWVuZ2lnIHZvbSBMZXZlbCBiZWdyZW56dC4gCisgbyBVc2VTcGVsbChhcmcsc3BlbGwpCisgICBEYXMgTGViZXdlc2VuIGJlbnV0enQgZGVuIFNwZWxsIG1pdCBkZW4gYW5nZWdlYmVuZW4gQXJndW1lbnRlbi4KKyAgIFdlbm4ga2VpbiBTcGVsbCBhbmdlZ2ViZW4gaXN0LCBzbyB3aXJkIHF1ZXJ5X3ZlcmIoKSB2ZXJ3ZW5kZXQuIAorIG8gVXNlU2tpbGwoc2tpbGwsYXJnKQorICAgRGFzIExlYmV3ZXNlbiBiZW51dHp0IGRpZSBGYWVoaWdrZWl0LiAKKworTmV1ZSBQcm9wZXJ0aWVzL0Z1bmt0aW9uZW4gaW4gTGl2aW5nL0NvbWJhdCAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0VpbmlnZSBTcHJ1ZWNoZSBlcmZvcmRlcm4gZXMsIGRhcyBWZXJoYWx0ZW4gYmVpIEF0dGFjayB1bmQgRGVmZW5kIHppZW1saWNoCit3ZWl0cmVpY2hlbmQgenUgYWVuZGVybi4gRGFmdWVyIHd1cmRlbiBmb2xnZW5kZSBQcm9wZXJ0aWVzIHVuZAorRnVua3Rpb25lbiBlaW5nZWJhdXQ6IAorCisgbyBQX1RNUF9BVFRBQ0tfSE9PSworICAgSGllciBrYW5uIGVpbiBBcnJheSBkZXIgRm9ybSAoe0VuZHplaXRwdW5rdCxPYmpla3QsRnVua3Rpb259KQorICAgc3RlaGVuLiBTb2xhbmdlIGRlciBFbmR6ZWl0cHVua3Qgbm9jaCBuaWNodCB1ZWJlcnNjaHJpdHRlbiB3dXJkZQorICAgdW5kIGRhcyBhbmdlZ2ViZW5lIE9iamVrdCBleGlzdGllcnQsIHdpcmQgYW5zdGVsbGUgdm9uIEF0dGFjayBkaWUKKyAgIEZ1bmt0aW9uIGluIGRlbSBPYmpla3QgYXVmZ2VydWZlbi4gV2VubiBkaWUgRnVua3Rpb24gMCBsaWVmZXJ0CisgICB3aXJkIGRlciBSZXN0IHZvbiBBdHRhY2sgbmljaHQgbWVociBhdXNnZWZ1ZWhydC4gCisgbyBQX1RNUF9ERUZFTkRfSE9PSworICAgV2llIFBfQVRUQUNLX0hPT0ssIG51ciBtaXQgRGVmZW5kLiBEYW1pdCBzaW5kIHouQi4KKyAgIFNwcnVlY2hlIG1vZWdsaWNoLCBkaWUgZnVlciBrdXJ6ZSBaZWl0IGVpbmUgbWFnaXNjaGUgU2NodXR6aHVlbGxlCisgICBlcnNjaGFmZmVuLiBXZW5uIGRpZSBGdW5rdGlvbiAwIGxpZWZlcnQgd2lyZCBkZXIgUmVzdCB2b24gRGVmZW5kCisgICBuaWNodCBtZWhyIGF1c2dlZnVlaHJ0LiBXZW5uIGVzIGVpbiBBcnJheSBkZXIgRm9ybQorICAgKHtkYW1hZ2UsZHQsaXNfc3BlbGx9KSBlcmdpYnQgd2lyZCBlcyB3aWUgYmVpIERlZmVuZE90aGVyCisgICBpbnRlcnByZXRpZXJ0LiAKKyBvIFBfREVGRU5ERVJTCisgICBMaXN0ZSB2b24gTGViZXdlc2VuLCBkaWUgbWl0IEluZm9ybURlZmVuZChlbmVteSkgaW5mb3JtaWVydAorICAgd2VyZGVuIHNvbGxlbiwgc29iYWxkIGVpbiBuZXVlciBGZWluZCBoaW56dWtvbW10LiBCZWkgZWluZW0KKyAgIHp1ZmFlbGxpZyBhdXNnZXdhZWhsdGVtIExlYmV3ZXNlbiBhdXMgZGllc2VyIExpc3RlIHdpcmQgYXVzc2VyZGVtCisgICBEZWZlbmRPdGhlciBtaXQgZGVuIEFyZ3VtZW50ZW4gdm9uIERlZmVuZCBhdWZnZXJ1ZmVuLiAKKyBvIEFkZERlZmVuZGVyKGZyaWVuZCkKKyAgIEZ1ZWd0IExlYmV3ZXNlbiBpbiBQX0RFRkVOREVSUyBlaW4sIHdlbm4gZXMgbm9jaCBuaWNodCBpbiBkZXIKKyAgIExpc3RlIGlzdC4gCisgbyBJbmZvcm1EZWZlbmQoZW5lbXkpCisgICBTaWVoZSBvYmVuLiAKKyBvIERlZmVuZE90aGVyKGRhbSxkdCxpc19zcGVsbCxlbmVteSkKKyAgIE1pdCBkaWVzZXIgRnVua3Rpb24ga2FubiBtYW4gTGViZXdlc2VuIGVyc2NoYWZmZW4sIGRpZSBTY2hhZGVuCisgICB2b24gYW5kZXJlbiBhYndlbmRlbiBvZGVyIG1vZGlmaXppZXJlbi4gV2VubiBkaWVzZSBGdW5rdGlvbiBlaW4KKyAgIEFycmF5ICh7ZGFtLGR0LGlzX3NwZWxsfSkgenVydWVja2dpYnQgc28gd2VyZGVuIGJlaSBkZW0genUKKyAgIHZlcnRlaWRpZ2VuZGVuIExlYmV3ZXNlbiBkaWVzZSBXZXJ0ZSBnZW5vbW1lbiBhbnN0ZWxsZSBkZXIgYWx0ZW4uCisgICBNYW4ga2FubiBhbHNvIHouQi4gZWluIE1vbnN0ZXIgZXJzY2hhZmZlbiwgZGFzIGVpbgorICAgZmV1ZXJlbXBmaW5kbGljaGVzIGFuZGVyZXMgTW9uc3RlciB2ZXJ0ZWlkaWd0LCBpbmRlbSBlcyB6LkIuCisgICBGZXVlcmJhZWxsZSBpbiBFaXNoYWdlbCB2ZXJ3YW5kZWx0LiAKKworU3RhbmRhcmQtU2tpbGxzIAorPT09PT09PT09PT09PT09PQorCitGb2xnZW5kZSBGYWVoaWdrZWl0ZW4gd2VyZGVuIHNjaG9uIGJlcnVlY2tzaWNodGlndCB1bmQgc2luZCBhdWNoCit2b3JkZWZpbmllcnQuIFdlbm4gc2llIHVudmVyYWVuZGVydCB1ZWJlcm5vbW1lbiB3ZXJkZW4gc29sbGVuIG11c3MgbnVyCitTSV9BQklMSVRZIGdlc2V0enQgd2VyZGVuLiAKKworIG8gU0tfU1dPUkRGSUdIVElORworICAgU2Nod2VydGthbXBmLiBCaXMgenUgMzMrQV9TVFIrQV9ERVggQXVmc2NobGFnIGJlaQorICAgU2Nod2VydGVybiwgd2VubiBqZW1hbmQgZGllc2UgRmFlaGlna2VpdCB6dSAxMDAlIGhhdC4gCisgbyBTS19XRUFQT05MRVNTCisgICBLYW1wZiBtaXQgYmxvc3NlbiBIYWVuZGVuLiBCaXMgenUgMTAwK0FfU1RSKzMqQV9ERVgKKyAgIEF1ZnNjaGxhZy4gCisgbyBTS19UV09IQU5ERUQKKyAgIEthbXBmIG1pdCB6d2VpaGFlbmRpZ2VuIFdhZmZlbi4gQmlzIHp1IDMzK0FfU1RSIEF1ZnNjaGxhZy4gCisgbyBTS19OSUdIVFZJU0lPTgorICAgV2VyIGRpZXNlIEZhZWhpZ2tlaXQgenUgMTAwJSBoYXQgYnJhdWNodCAyMCBTZWt1bmRlbiBwcm8KKyAgIGZlaGxlbmRlbSBMaWNodGxldmVsIHVtIHNpY2ggYW4gZGllIER1bmtlbGhlaXQgenUgZ2V3b2VobmVuLiAKKyBvIFNLX0JPT1pFCisgICBNaXQgMTAwJSBkaWVzZXIgRmFlaGlna2VpdCB3aXJkIGJlaSBqZWRlbSBhbGtvaG9saXNjaGVuIEdldHJhZW5rCisgICA4MCUgdm9tIEFsa29ob2xnZWhhbHQgYWJnZXpvZ2VuLiAKKworRm9sZ2VuZGUgRmFlaGlna2VpdGVuIHdlcmRlbiBiZXJ1ZWNrc2ljaHRpZ3QsIHNpbmQgYWJlciBuaWNodCB2b3JkZWZpbmllcnQ6IAorCisgbyBTS19NQUdJQ19BVFRBQ0sKKyAgIFdlbm4gZGllc2UgRmFlaGlna2VpdCB2b3JoYW5kZW4gaXN0LCB3aXJkIGRpZSBGdW5rdGlvbiB1bnRlcgorICAgU0lfU0tJTExGVU5DIGltIEdpbGRlbm9iamVrdCBhdWZnZXJ1ZmVuLCBmYWxscyBkZXIgU3BpZWxlciBzb25zdAorICAgbWl0IGJsb3NzZW4gSGFlbmRlbiBhbmdyZWlmZW4gd3VlcmRlLiBXZW5uIGRhYmVpIGVpbiBNYXBwaW5nCisgICB6dXJ1ZWNrZ2VnZWJlbiB3aXJkLCBzbyB3ZXJkZW4gZGllIFdlcnRlIHZvbgorICAgU0lfU0tJTExEQU1BR0UsIFNJX1NLSUxMREFNQUdFX1RZUEUgdW5kCisgICBTSV9TS0lMTERBTUFHRV9NU0cgZ2Vub21tZW4gYW5zdGVsbGUgZGVyIFdlcnRlIGluCisgICBQX0hBTkRTLiAKKyBvIFNLX01BR0lDX0RFRkVOU0UKKyAgIFdlbm4gaGllciB1bnRlciBTSV9TS0lMTEZVTkMgZWluZSBGdW5rdGlvbiBlaW5nZXRyYWdlbiBpc3QsIHNvCisgICB3aXJkIHNpZSBiZWkgRGVmZW5kIGltIEdpbGRlbm9iamVrdCBhdWZnZXJ1ZmVuIHVuZCBiZWtvbW10IGltCisgICBJbmZvcm1hdGlvbnMtTWFwcGluZyBTSV9TS0lMTERBTUFHRSwKKyAgIFNJX1NLSUxMREFNQUdFX1RZUEUgdW5kIFNJX1NQRUxMIHVlYmVyZ2ViZW4uIFdlbm4gc2llCisgICBlaW4gTWFwcGluZyB6dXJ1ZWNrZ2lidCB3ZXJkZW4gaGllcmF1cyBTSV9TS0lMTERBTUFHRSB1bmQKKyAgIFNJX1NLSUxMREFNQUdFX1RZUEUgZW50bm9tbWVuIHVuZCBlcnNldHplbiBkaWUgYWx0ZW4KKyAgIFdlcnRlIHZvbiAiZGFtIiB1bmQgImRhbV90eXBlIi4gCisgbyBGSUdIVChXYWZmZW50eXApCisgICBGYWxscyBkaWVzZSBGYWVoaWdrZWl0IHZvcmhhbmRlbiBpc3Qgd2lyZCBkZXIgZW50c3ByZWNoZW5kZW4KKyAgIEZ1bmt0aW9uIGluIFNJX1NLSUxMREFNQUdFIGRlciBiaXNoZXJpZ2UgU2NoYWRlbiB1ZWJlcmdlYmVuLgorICAgRmFsbHMgc2llIGVpbiBNYXBwaW5nIHp1cnVlY2tsaWVmZXJ0IHdpcmQgYW4gZGllc2VyIFN0ZWxsZSBhdWNoIGRlcgorICAgbmV1ZSBTY2hhZGVuIGVyd2FydGV0LiAKKyBvIFNLX0ZJR0hUCisgICBXaWUgRmlnaHQoV2FmZmVudHlwKSwgbnVyIHdpcmQgZGllc2UgRmFlaGlna2VpdCwgZmFsbHMgdm9yaGFuZGVuLAorICAgYmVpIGplZGVyIFdhZmZlIGJlbnV0enQgdW5kIGthbm4gYXVjaCB6dXNhZXR6bGljaCBhbmRlcmUgV2VydGUgZnVlcgorICAgU0lfU0tJTExEQU1BR0VfVFlQRSBlcmdlYmVuLiBXYWZmZSB1bmQgV2FmZmVudHlwIHdlcmRlbgorICAgdWVicmlnZW5zIGluIFNJX1dFQVBPTiB1bmQgU0lfV0VBUE9OX1RZUEUgdWViZXJnZWJlbi4gCisgbyBTS19DQVNUSU5HCisgICBTcGVsbGNhc3RpbmcuIERpZSBXYWhyc2NoZWlubGljaGtlaXQsIGRhc3MgZGVyIFNwZWxsIGdlbGluZ3QsIHN0ZWlndAorICAgYmVpIDEwMCUgZGllc2VyIEZhZWhpZ2tlaXQgYXVmIGRhcyBEb3BwZWx0ZS4gTnVyIG1pdCBkaWVzZXIKKyAgIEZhZWhpZ2tlaXQgaXN0IGVzIG1vZWdsaWNoLCB1ZWJlciBkaWUgTWF4aW1hbGdyZW56ZW4genUga29tbWVuLAorICAgc28gZGFzcyBkYW5uIGF1Y2ggU3BlbGxzIGJlc29uZGVycyBndXQgZ2VsaW5nZW4ga29lbm5lbi4gCisKK1RlbXBvcmFlcmUgUHJvcGVydHktQWVuZGVydW5nZW4gCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitPZnQgbXVlc3NlbiBTcGVsbHMgaXJnZW5kd28gUHJvcGVydGllcyBmdWVyIGt1cnplIFplaXQgdmVyYWVuZGVybiwgd2llCit6LkIuIFBfTElHSFQgb2RlciBQX05PTUFHSUMgaW4gUmFldW1lbi4gRnVlciBkaWVzZW4gWndlY2sga2FubgorbWFuIGluIC9vYmovdG1wX3Byb3BfbWFzdGVyIGRpZSBGdW5rdGlvbiBTZXRUbXBQcm9wIGF1ZnJ1ZmVuLiBEaWVzZQorRnVua3Rpb24gZXJ3YXJ0ZXQgZGFzIE9iamVrdCwgaW4gZGVtIGRpZSBQcm9wZXJ0eSB6dSBzZXR6ZW4gaXN0LCBkZW4gTmFtZW4KK2RlciBQcm9wZXJ0eSwgZGVuIHplaXR3ZWlsaWdlbiBXZXJ0IHVuZCBkZW4gWmVpdHB1bmt0LCBiaXMgenUgZGVtIGRpZXNlCitBZW5kZXJ1bmcgZ2VsdGVuIHNvbGwuIAorCitTa2lsbCBJbmZvcm1hdGlvbmVuIAorKysrKysrKysrKysrKysrKysrKysKKworSW4gZGVuIEluZm9ybWF0aW9uc21hcHBpbmdzIHp1IGRlbiBTcGVsbHMvU2tpbGxzIHNvbGx0ZW4gYWxsZSAoenVzYWV0emxpY2gpCitub2V0aWdlbiBJbmZvcm1hdGlvbmVuIHN0ZWhlbiwgZGVubiBudXIgd2VubiB6LkIuIGVpbiBGZXVlcmJhbGwgaW4gZWluZW0KK1NwZWxsYm9vayBhbHMgU2NoYWRlbiAzMDAgZWluZ2V0cmFnZW4gaGF0IHVuZCBkaWVzZW4gV2VydCBkZW0gTWFwcGluZworZW50bmltbXQsIGthbm4gZWluZSBhbmRlcmUgR2lsZGUgZGllc2VuIFNwcnVjaCByZWN5Y2xlbiB1bmQgbWl0IFNjaGFkZW4KKzQwMCBhbmJpZXRlbiwgbmF0dWVybGljaCBzb2xsdGUgZXIgZGFubiBhdWNoIGluIGRlciBHaWxkZSBtZWhyIGtvc3Rlbi4gCisKK1NJRUhFIEFVQ0g6IHNraWxsX2luZm9fbGlzdGUKKworRmFrdG9yZW4gdW5kIE9mZnNldHMgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTWFuIGthbm4gaW4gZGVtIEluZm9ybWF0aW9ucy1NYXBwaW5nIHp1IGplZGVtIG51bWVyaXNjaGVuIFdlcnQKKyJOYW1lIiBub2NoIHp3ZWkgenVzYWV0emxpY2hlIFdlcnRlIEZBQ1RPUigiTmFtZSIpIHVuZAorT0ZGU0VUKCJOYW1lIikgZWludHJhZ2VuIHVuZCBkaWVzZSBXZXJ0ZSBhdXRvbWF0aXNjaCB6dXIgZWlnZW50bGljaGVuCitXZXJ0YmVzdGltbXVuZyBiZXJ1ZWNrc2ljaHRpZ2VuLiBNaXQgZm9sZ2VuZGVuIEZ1bmt0aW9uZW4gc29sbHRlIG1hbgoraW0gU3BlbGxib29rIGRlbSBNYXBwaW5nIFdlcnRlIGVudG5laG1lbjogCisKKyBvIEdldFZhbHVlKG5hbWUsbWFwLHNwaWVsZXIpIAorIG8gR2V0T2Zmc2V0KG5hbWUsbWFwLHNwaWVsZXIpCisgICBPRkZTRVQobmFtZSkuIAorIG8gR2V0RmFjdG9yKG5hbWUsbWFwLHNwaWVsZXIpCisgICBFcmdpYnQgRkFDVE9SKG5hbWUpLCBmYWxscyB1bmdsZWljaCBOdWxsLCBzb25zdCAxMDAuIAorIG8gR2V0RlZhbHVlKG5hbWUsbWFwLHNwaWVsZXIpCisgICBFcmdpYnQgKFdlcnQqRmFrdG9yKS8xMDAuIAorIG8gR2V0VmFsdWVPKG5hbWUsbWFwLHNwaWVsZXIpCisgICBFcmdpYnQgV2VydCtPZmZzZXQuIAorIG8gR2V0RlZhbHVlTyhuYW1lLG1hcCxzcGllbGVyKQorICAgRXJnaWJ0IChXZXJ0KkZha3RvcikvMTAwK09mZnNldC4gCisKK05hY2ggTW9lZ2xpY2hrZWl0IHNvbGx0ZSBtYW4gZGF2b24gaW0gU3BlbGxib29rIEdldEZWYWx1ZU8gYmVudXR6ZW4sCit3ZW5uIGVzIGFuZ2VicmFjaHQgaXN0LiBBdWYgamVkZW4gRmFsbCBzb2xsdGVuIHZvbiBkZW4gZHJlaSBXZXJ0ZW4KK21vZWdsaWNodCB2aWVsZSBhdWYgZWluZSBhbmdlbWVzc2VuZSBXZWlzZSBiZXJ1ZWNrc2ljaHRpZ3Qgd2VyZGVuLCBkZW5uCitkYWR1cmNoIGJla29tbXQgZGFzIEdpbGRlbm9iamVrdCBmZWluZXJlIEtvbnRyb2xsbW9lZ2xpY2hrZWl0ZW4sIHdlbm4KK2VpbiBTcHJ1Y2ggbW9kaWZpemllcnQgd2VyZGVuIHNvbGwuIEVzIGlzdCBkYW5uIGZ1ZXIgZGllIEdpbGRlIGFldXNzZXJzdAorZWluZmFjaCBmZXN0enVsZWdlbiwgZGFzcyB6LkIuIFp3ZXJnZSBiZWkgYWxsZW4gQW5ncmlmZnNzcHJ1ZWNoZW4gMjAlCittZWhyIFNjaGFkZW4gdmVydXJzYWNoZW4gdW5kIGJlaW0gRmV1ZXJiYWxsIEVsZmVuIGVpbmVuIGhvZWhlcmVuCitnYXJhbnRpZXJ0ZW4gV2VydCBoaW56dWJla29tbWVuLiAKKworRnVua3Rpb25lbiAKKy0tLS0tLS0tLS0tCisKK1dlbm4gZWluIFNwZWxsYm9vayBlaW5lIGRlciBvYmVuIGFuZ2VzcHJvY2hlbmVuIEZ1bmt0aW9uZW4gYmVudXR6LCB1bQorZWluZW4gbnVtZXJpc2NoZW4gV2VydCB6dSBlcm1pdHRlbG4gdW5kIGFuc3RlbGxlIGRlcyBXZXJ0ZXMgc3RlaHQgZXR3YXMsCitkYXMgYWxzIEZ1bmt0aW9uIGludGVycHJ0aWVydCB3ZXJkZW4ga2Fubiwgc28gd2lyZCBkaWVzZSBGdW5rdGlvbgorYXVzZ2V3ZXJ0ZXQgdW5kIGRhcyBFcmdlYm5pcyBhbHMgV2VydCBnZW5vbW1lbi4gQWxzIEZ1bmt0aW9uCitpbnRlcnByZXRpZXJ0IHdlcmRlbiBrYW5uOiAKKworIG8gRWluZSBDbG9zdXJlIAorIG8gRWluIEFycmF5ICh7b2JqZWt0LGZ1bmt0aW9uc25hbWV9KSBvZGVyICh7b2JqZWt0bmFtZSxmdW5rdGlvbnNuYW1lfSkgCisgbyBFaW4gRnVua3Rpb25zbmFtZS4gSGllcmJlaSBzb2xsdGUgbWFuIHNpY2ggamVkb2NoIGRhcnVlYmVyIGltCisgICBrbGFyZW4gc2VpbiwgaW4gd2VsY2hlbSBPYmpla3QgdmVyc3VjaHQgd2lyZCBkaWUgRnVua3Rpb24KKyAgIGF1Znp1cnVmZW4uIFVlYmxpY2hlcndlaXNlIGdlc2NoaWVodCBkaWVzIGltIFNwZWxsYm9vaywgamVkb2NoCisgICB3ZXJkZW4gU0lfRElGRklDVUxUWSwgU0lfU0tJTExMRUFSTiB1bmQgU0lfU1BFTExDT1NUCisgICBhdWNoIGJlaW0gTGVybmVuIGJlbm9ldGlndCB1bmQgZGllcyBnZXNjaGllaHQgdm9tIEdpbGRlbm9iamVrdAorICAgYXVzLiBXZW5uIGJlaSBkaWVzZW4gMyBFaW50cmFlZ2VuIGVpbmUgRnVua3Rpb24gZGVuIFdlcnQgbGllZmVybgorICAgc29sbCwgc28gbXVzcyBzaWUgaW4gZWluZSBkZXIgZHJlaSBhbmRlcmVuIEZvcm1lbiBlaW5nZXRyYWdlbiB3ZXJkZW4sCisgICBkYW1pdCBkYXMgcmljaHRpZ2UgT2JqZWt0IGVybWl0dGVsdCB3ZXJkZW4ga2Fubi4gCisKK1NJRUhFIEFVQ0g6IGV4ZWN1dGVfYW55dGhpbmcKKyAgIAorRnVlciBuaWNodC1udW1lcmlzY2hlIFdlcnRlIGthbm4gbWFuIEdldERhdGEgdmVyd2VuZGVuLiBEYWJlaSB3ZXJkZW4KK2plZG9jaCBudXIgY2xvc3VyZXMgYXV0b21hdGlzY2ggYXVzZ2V3ZXJ0ZXQuIAorCitTa2lsbCBBdHRyaWJ1dGUgCisrKysrKysrKysrKysrKysrCisKK1NraWxsLUF0dHJpYnV0ZSBzaW5kIEF0dHJpYnV0ZSwgZGllIGFsbGUgYW5kZXJlbiBTa2lsbHMgYmVlaW5mbHVzc2VuIGtvZW5uZW4uCitOb3JtYWxlcndlaXNlIHNpbmQgYWxsZSBTa2lsbC1BdHRyaWJ1dGUgMTAwJSwgc2llIGtvZW5uZW4gamVkb2NoIGZ1ZXIKK2t1cnplIFplaXQgYXVmIGFuZGVyZSBXZXJ0ZSB6d2lzY2hlbiAxMCUgdW5kIDEwMDAlIGdlc2V0enQgd2VyZGVuLiBCZWkKK2RlciBBYmZyYWdlIGRlciBBdHRyaWJ1dGUgd2VyZGVuIDMgV2VydGUgYmVydWVja3NpY2h0aWd0OiAKKworIG8gV2VydCwgZGVyIHZvbSBMZWJld2VzZW4gc2VsYnN0IGdlc2V0enQgd3VyZGUuIAorIG8gV2VydCwgZGVyIHZvbiBlaW5lbSBhbmRlcmVuIHVudGVyIDEwMCUgZ2VzZXR6dCB3dXJkZS4gV2VubgorICAgbWVocmVyZSBhbmRlcmUgTGViZXdlc2VuIGRlbiBXZXJ0IHVudGVyIDEwMCUgZ2VzZXR6dCBoYWJlbiBzbworICAgZ2lsdCBkaWUgQWVuZGVydW5nIHZvbiBkZW0gbWl0IGRlbSBob2VjaHN0ZW4gTGV2ZWwuIEVpbmUgc29sY2hlCisgICBBZW5kZXJ1bmcgd2lyZCB1ZWJsaWNoZXJ3ZWlzZSB2b24gZWluZW0gR2VnbmVyIHZlcmFubGFzc3QuIAorIG8gV2VydCwgZGVyIHZvbiBlaW5lbSBhbmRlcmVuIHVlYmVyIDEwMCUgZ2VzZXR6dCB3dXJkZS4gQXVjaCBoaWVyCisgICBnaWx0IGRpZSBBZW5kZXJ1bmcgdm9uIGRlbSBMZWJld2VzZW4gbWl0IGRlbSBob2VjaHN0ZW4gTGV2ZWwuIAorCitXZW5uIHouQi4gZWluIFNwaWVsZXIgc2VpbmUgR2VzY2h3aW5kaWdrZWl0IGZ1ZXIgendlaSBNaW51dGVuIGF1ZiAyMDAlCit1bmQgZWluIE1vbnN0ZXIgc2llIGZ1ZXIgZWluZSBNaW51dGUgYXVmIDI1JSBzZXR6dCwgc28gaXN0IHNpZSBlaW5lIE1pbnV0ZQorbGFuZyA1MCUgdW5kIGRpZSBuYWVjaHN0ZSBNaW51dGUgMjAwJSBiZXZvciBzaWUgd2llZGVyIGF1ZiAxMDAlIGdlc2V0enQKK3dpcmQuIAorCitTSUVIRSBBVUNIOiBNb2RpZnlTa2lsbEF0dHJpYnV0ZQorCitSZXN0cmljdGlvbiBNYXBwaW5ncyAKKysrKysrKysrKysrKysrKysrKysrKworCitNaXQgUmVzdHJpY3Rpb24gTWFwcGluZ3Mga29lbm5lbiBFaW5zY2hyYWVua3VuZ2VuIGF1ZXNzZXJzdCBlaW5mYWNoCithbmdlZ2ViZW4gd2VyZGVuLiBJbiBkZW0gTWFwcGluZyB3aXJkIGVpbmZhY2ggbnVyIGFuZ2VnZWJlbiwgd2FzIGR1cmNoCit3ZWxjaGVuIFdlcnQgZWluZ2VzY2hyYWVua3Qgd2VyZGVuIHNvbGwuIFdlbm4gei5CLiBtaW5kZXN0ZW5zIExldmVsIDE1Cit1bmQgSW50ZWxsaWdlbnogMTAgdmVybGFuZ3Qgd2lyZCwgc28gaXN0IGRhcyBNYXBwaW5nCisoW1BfTEVWRUw6MTUsQV9JTlQ6MTBdKS4gRm9sZ2VuZGUgRWluc2NocmFlbmt1bmdlbiBrb2VubmVuIHZlcmxhbmd0Cit3ZXJkZW46IAorCitTSUVIRSBBVUNIOiBjaGVja19yZXN0cmljdGlvbnMKKworRWluc2NocmFlbmt1bmdlbiB3ZXJkZW4gbWl0IGNoZWNrX3Jlc3RyaWN0aW9ucyhzcGllbGVyLG1hcHBpbmcpCit1ZWJlcnBydWVmdC4gRGllIEZ1bmt0aW9uIGxpZWZlcnQgMCB6dXJ1ZWNrIHdlbm4gZGVyIFNwaWVsZXIgYWxsZQorRWluc2NocmFlbmt1bmdlbiBlcmZ1ZWxsdCB1bmQgZWluZW4gU3RyaW5nIG1pdCBkZXIgQmVncnVlbmR1bmcsIGZhbGxzIGVpbmUKK0VpbnNjaHJhZW5rdW5nIG5pY2h0IGVyZnVlbGx0IGlzdC4gCisKK1Byb2dyYW1taWVycmljaHRsaW5pZW4gCis9PT09PT09PT09PT09PT09PT09PT09PQorCisgbyBJbiBTcGVsbGJvb2tzIG1vZWdsaWNoc3Qgb2Z0IEZha3RvcmVuIHVuZCBPZmZzZXRzIGJlcnVlY2tzaWNodGlnZW4uIAorIG8gRGllIFNraWxsLUF0dHJpYnV0ZSBiZXJ1ZWNrc2ljaHRpZ2VuLCBmYWxscyBtb2VnbGljaC4gCisgbyBBbGxlcyBTcGVsbHMgbXVlc3NlbiBlaW5lIFZlcnpvZWdlcnVuZ3N6ZWl0IGhhYmVuLCBpbiBkZXIga2VpbgorICAgd2VpdGVyZXIgU3BlbGwgYW53ZW5kYmFyIGlzdC4gSGllcnZvbiBrYW5uIGVzIEF1c25haG1lbiBnZWJlbiwgd2VubgorICAgZGFzIEdpbGRlbmtvbnplcHQgZXMgYW5kZXJzIHZvcnNpZWh0ICh6LkIuIGJlaSBkZW4gS2FlbXBmZXJuKSBvZGVyCisgICBzb25zdCByZWd1bGllcnQuCisgbyBLb3N0ZW5sb3NlIFNwZWxscyBzb2xsdGUgZXMgbmljaHQgZ2ViZW4uIEZhbGxzIGRvY2gsIGRhbm4gbnVyIG1pdCBzZWhyCisgICBob2hlciBWZXJ6b2VnZXJ1bmdzemVpdCwgc29uc3QgbGFzc2VuIGRpZSBMZXV0ZSBudXIgaWhyIEZyb250ZW5kCisgICBzcGllbGVuLiAKKyBvIEplZGVyIFNraWxsIHNvbGx0ZSBlaW5lIGxldmVsYWJoYWVuZ2lnZSBtYXhpbWFsZSBGYWVoaWdrZWl0IGhhYmVuLgorICAgRC5oLiwgd2VubiBTSV9ESUZGSUNVTFRZIGdlc2V0enQgaXN0IHNvbGx0ZSBkZXIgV2VydCBncm9lc3NlciBhbHMKKyAgIC0xMDAgc2Vpbi4gCisgbyBTcGVsbHMgZHVlcmZlbiBuaWNodCBNb25zdGVyIGJlbGllYmlnIGhvaGVyIFN0YWVya2UgZWluZmFjaAorICAgdW1oYXVlbi4gRXMgc29sbHRlIG51ciBiaXMgenUgZWluZXIgTWF4aW1hbHN0YWVya2UgbW9lZ2xpY2ggc2Vpbi4gCisgbyBEZXIgU2NoYWRlbiwgZGVuIGVpbiBTcHJ1Y2ggYmV3aXJrdCwgZGFyZiB2b24gZGVyIFN0YWVya2UgbmljaHQKKyAgIGdyb2Vzc2VyIHNlaW4sIGFscyBkZXIsIGRlbiBlaW5lIFdhZmZlIG1pdCBXQyAyNSpTUCBiZXdpcmtlbgorICAgd3VlcmRlLiBBdWNoIGhpZXIgc29sbHRlIG1hbiBlaW4gd2VuaWcgZ2VzdW5kZW4gTWVuc2NoZW52ZXJzdGFuZAorICAgc3BpZWxlbiBsYXNzZW4gLSBlcyBrb21tdCBhdWNoIGltbWVyIGRyYXVmIGFuLCBvYiBlaW4gQW5ncmlmZgorICAgbWFnaXNjaCBpc3Qgb2RlciBwaHlzaWthbGlzY2guCisgbyBEaWUgSGVpbHVuZyBzb2xsdGUgbmljaHQgZGllIGRhZnVlciBub2V0aWdlbiBTUCB1ZWJlcnNjaHJlaXRlbi4gCisgICBBdXNuYWhtZW4gZnVlciBleHBsaXppdGUgSGVpbGdpbGRlbiAoS2xlcnVzKSBrYW5uIGVzIGdlYmVuLgorCitBdXN3aXJrdW5nIHZvbiBTSV9ESUZGSUNVTFRZIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRm9sZ2VuZGUgTWF4aW1hbHdlcnRlIHNpbmQgZnVlciBTSV9BQklMSVRZIGJlaSBkZW4gYW5nZWdlYmVuZW4gTGV2ZWxuCittb2VnbGljaCwgd2VubiBTSV9ESUZGSUNVTFRZIGF1ZiBkZW4gV2VydCBpbiBkZXIgbGlua2VuIFNwYWx0ZSBnZXNldHp0Citpc3QuIAorCitTSUVIRSBBVUNIOiBMaW1pdEFiaWxpdHkgb2RlciAvc3RkL2xpdmluZy9za2lsbHM6OkxpbWl0QWJpbGl0eQorCis1LiBPa3QgMjAxMSBHbG9pbnNvbgorIApkaWZmIC0tZ2l0IGEvZG9jL3dpei9naXQgYi9kb2Mvd2l6L2dpdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjAwZmYzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dpei9naXQKQEAgLTAsMCArMSwyMyBAQAorTnV0enVuZyB2b24gR2l0IGltIE1vcmdlbkdyYXVlbgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitXYXMgaXN0IEdpdD8KKyAgR2l0IGlzdCBlaW5lIFNvZnR3YXJlIHp1ciAodmVydGVpbHRlbikgVmVyc2lvbnN2ZXJ3YWx0dW5nIHZvbiBEYXRlaWVuLgorICAoaHR0cDovL2dpdC1zY20uY29tLywgaHR0cDovL2RlLndpa2lwZWRpYS5vcmcvd2lraS9HaXQpCisgIEZ1ZXIgV2luZG93cyBnaWJ0IGVzIGVpbiBQYWtldCwgd2VsY2hlcyBhdWNoIGRpZSBJbnRlZ3JhdGlvbiBpbiBkZW4gRXhwbG9yZXIKKyAgYW5iaWV0ZXQ6CisgIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ2l0ZXh0ZW5zaW9ucy8KKworCitTSUVIRSBBVUNICisgIGdpdC1yZXBvc2l0b3JpZXM6IFJlcG9zaXRvcnktVmVyd2FsdHVuZyBpbSBNdWQKKyAgZ2l0LWhvd3RvOiBXaWUgZ2l0IGJlbnV0enQgd2lyZAorICBnaXQtd29ya2Zsb3c6IEVpbiBzaW1wbGVzIEJlaXNwaWVsIGVpbmVzIEFyYmVpdHNmbHVzc2VzIG1pdCBHaXQKKyAgZ2l0LWtvb3BlcmF0aW9uOiBFcndlaXRlcnVuZyBmdWVyIEZvcnRnZXNjaHJpdHRlbmUgenUgZ2l0LXdvcmtmbG93CisgIGdpdC1zeW5jOiBXaWUgZGllIFN5bmNocm9uaXNpZXJ1bmcgencuIGdpdC1SZXBvcyB1bmQgTXVkbGliIGFibGFldWZ0CisgIGdpdC1mYXE6IGhhZXVmaWcgZ2VzdGVsbHRlIEZyYWdlbi9Qcm9ibGVtZQorICBnaXQtbGlua3M6IFZlcndlaXNlIGlucyBXV1cKKworTEVUWlRFIEFlTkRFUlVORzoKKyAgMjUuMDMuMjAxMSwgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2Mvd2l6L2dpdC1leGNsdWRlIGIvZG9jL3dpei9naXQtZXhjbHVkZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzliNWRiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dpei9naXQtZXhjbHVkZQpAQCAtMCwwICsxLDI3IEBACitCZWltIEltcG9ydCB2b24gVmVyemVpY2huaXNzZW4gYXVzIGRlbSBNdWQgaW4gZWluIGdpdCBSZXBvc2l0b3J5IHVuZCBiZWkgZGVyCitTeW5jaHJvbmlzaWVydW5nIHp3aXNjaGVuIFJlcG9zaXRvcmllcyB1bmQgTXVkbGliIHdlcmRlbiBkaWUgZm9sZ2VuZGVuCitWZXJ6ZWljaG5pc3NlIHVuZCBEYXRlaWVuIGtvbXBsZXR0IGlnbm9yaWVydC4KKworIyBmdWVyIGRpdi4gU0NNcyBiZW51dHp0ZSBWZXJ6ZWljaG5pc3NlCistIC5zdm4vCistIC5naXQvCistIC5naXRpZ25vcmUKKy0gQ1ZTLworIyBTYXZlZmlsZXMKKy0gKi5vCisjIGxvZ3MgYW5kIHJlcCBmaWxlcworLSAqLmxvZworLSBsb2cvCistICoucmVwCistICouZXJyCisjIGJhY2t1cHMgb2YgZWRpdG9ycworLSAqfgorLSAqLnN3cAorIyB0aGlzIHNob3VsZCBhbHMgbmV2ZXIgYmUgaW1wb3J0ZWQgLSBtYXJrcyBhIGRpcmVjdG9yeSB0byBiZSBpbXBvcnRlZC4KKy0gZ2l0LW11ZC1pbXBvcnQKKyMga2VpbmUgZ2VwYWNrdGVuIEFyY2hpdmUKKy0gKi5negorLSAqLmJ6MgorLSAqLnppcAorLSAqLnRhcgorCmRpZmYgLS1naXQgYS9kb2Mvd2l6L2dpdC1mYXEgYi9kb2Mvd2l6L2dpdC1mYXEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VkNDgyNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93aXovZ2l0LWZhcQpAQCAtMCwwICsxLDgzIEBACitIYWV1ZmlnIGdlc3RlbGx0ZSBGcmFnZW4genVtIFRoZW1hIEdpdCBpbSBNb3JnZW5ncmF1ZW4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisqIFdhcyBtdXNzIGljaCBtYWNoZW4sIGRhbWl0IG1laW4gR2l0LVJlcG8gYXV0b21hdGlzY2ggbWl0IGRlbSBNRworKiBzeW5jaHJvbmlzaWVydCB3aXJkPworICBFaW5lIFN5bmNocm9uaXNhdGlvbiBmaW5kZXQgYXV0b21hdGlzY2ggc3RhdHQsIHdlbm4gbWFuIGVpbmVuIEltcG9ydCBlaW5lcworICBWZXJ6ZWljaG5pc3NlcyBhdXMgZGVtIE11ZCBkdXJjaGZ1ZWhydC4KKyAgTWFjaHQgbWFuIGRpZXMgbmljaHQsIHNvbmRlcm4gZXJzdGVsbHQgc2ljaCB1bmFiaGFlbmdpZyB2b20gTXVkIGRhcyBSZXBvLAorICBtdXNzIG1hbiBzaWNoIGFuIGVpbmVuIEVyem1hZ2llciBtaXQgU2hlbGx6dWdhbmcgd2VuZGVuLgorCisqIEF1Zm5haG1lIGFscyBSZWdpb25zbWl0YXJiZWl0ZXIvUmVnaW9uc21hZ2llci9XZWlzZXIvRXJ6bWFnaWVyL0dvdHQKKyAgRGllcyBpc3QgenVyemVpdCBudXIgZHVyY2ggZWluZW4gRU0gbW9lZ2xpY2guCisKKyogV2llIGJlbnV0emUgaWNoIEdpdCB1bnRlciBXaW5kb3dzPworICBHaXRIdWIgaGF0IGVpbmUgQW5sZWl0dW5nIGZ1ZXIgbXN5c2dpdCwgd2VsY2hlIGltIHdlc2VudGxpY2hlbiBhdWNoIGZ1ZXJzIE1HCisgIGJyYXVjaGJhciBpc3Q6CisgIGh0dHA6Ly9oZWxwLmdpdGh1Yi5jb20vd2luLXNldC11cC1naXQvCisgIEVpbmUgd2VpdGVyZSBNb2VnbGljaGtlaXQgaXN0IGhpZXIgYW5nZWJlbjoKKyAgaHR0cDovL3JvZ2VyZHVkbGVyLmdpdGh1Yi5pby9naXQtZ3VpZGUvCisgIEVpbmlnZSBpbiBGcmFnZSBrb21tZW5kZSBHaXQtUGFrZXRlIHNpbmQgaGllciBrdXJ6IHZvcmdlc3RlbGx0OgorICBodHRwOi8vd3d3Lm1ha2V1c2VvZi5jb20vdGFnLzUtd2luZG93cy1naXQtY2xpZW50cy1naXQtam9iLworICBFaW5lIEFubGVpdHVuZyBmdWVyIGRpZSBOdXR6dW5nIHZvbiBQdXR0eSBhbHMgU1NILUNsaWVudCB1bnRlciBXaW5kb3dzCisgIGZpbmRldCBzaWNoIGluIGNvbnRyaWIvcHV0dHkubWtkIGF1ZiBodHRwczovL2dpdGh1Yi5jb20vc2l0YXJhbWMvZ2l0b2xpdGUvCisKKyogV2llIGthbm4gaWNoIG1pciBkaWUgR2VzY2hpY2h0ZSBtZWluZXMgUmVwb3MgZ3JhcGhpc2NoIGFuemVpZ2VuIGxhc3Nlbj8KKyAgRGEgZ2lidCBlcyB2ZXJzY2hpZWRlbmUgTG9lc3VuZ2VuLCB2b3IgYWxsZW0gYXVjaCBhYmhhZW5naWcgdm9tCisgIEJldHJpZWJzc3lzdGVtLiBBdWYgYWxsZW4gZ2VodCB2ZXJtdXRsaWNoICdnaXRrJyB1bmQgJ2dpdCBndWknLgorICBBdWYgTWFjT1MgZ2lidCBlcyBhdWNoICdHaXRYJy4KKworKiBLYW5uIG1hbiBBZW5kZXJ1bmdlbi9EaWZmcy8gZmFyYmlnIG1hcmtpZXJ0IGFuemVpZ2VuPworICA+IGdpdCBsb2cgLXAgLS1jb2xvci13b3JkcworICBBbHRlcm5hdGl2IGthbm4gbWFuIC5naXQvY29uZmlnIGZvbGdlbmRlIFBhcmFtZXRlciBzZXR6ZW46CisgIFtjb2xvcl0KKyAgCWNvbG9yLmRpZmY9YXV0bworCWNvbG9yLmdyZXA9YXV0bworCWNvbG9yLnN0YXR1cz1hdXRvCisKKyAgV2VubiBtYW4gZXMgZ2VuZXJlbGwgYnVudCBoYWJlbiB3aWxsLCBzZXR6dCBtYW4gZWluZmFjaAorICBbY29sb3JdCisgIAljb2xvci51aT1hdXRvCisKKyAgaW4gZGllIEtvbmZpZ3VyYXRpb25zZGF0ZWkuCisKKyogV2FydW0gc29sbCBpY2ggZGVubiBkaWUgY29sb3ItRWluc3RlbGx1bmdlbiBhdWYgYXV0byB1bmQgbmljaHQgdHJ1ZSBzZXR6ZW4/CisgIERlciBXZXJ0IGF1dG8gYmV3aXJrdCwgZGFzcyBnaXQgbnVyIGRhbm4gZGllIEF1c2dhYmVuIGVpbmZhZXJidCwgd2VubiBkaWVzZQorICBuYWNoIFNURE9VVCBnZWhlbi4gQW5zb25zdGVuIGJla29tbXQgbWFuIGRlbiBBU0NJSS1rb2RpZXJ0ZW4gRmFyYnN0cmluZyBpbgorICBkaWUgQXVzZ2FiZWRhdGVpIGdlc2NocmllYmVuLgorCisqIFdpZSBrYW5uIGljaCBlaW5lIFJlcG9zaXRvcnkgbG9lc2NoZW4/CisgIFp1ciBaZWl0IGlzdCBkaWVzIG51ciBkdXJjaCBlaW5lbiBFTSBtaXQgU2hlbGx6dWdhbmcgYXVmIGRlbSBNRy1SZWNobmVyCisgIG1vZWdsaWNoLgorCisqIEthbm4gaWNoIGFuIGVpbmVtIEdlYmlldCwgZnVlciBkYXMgaWNoIGtlaW5lbiBTY2hyZWlienVncmlmZiBoYWJlLCBoZWxmZW4KKyogZWluZW4gQnVnIHp1IGZpeGVuPworICBKYSAtIHNvZmVybiBEdSBMZXNlcmVjaHRlIGF1ZiBkYXMgUmVwb3NpdG9yeSBoYXN0LiBEdSBrYW5uc3QgZGFzIFJlcG8gZGFubgorICBmb3JrZW4sIGQuaC4gZWluZSBLb3BpZSBlcnN0ZWxsZW4uIERpZSBiZXN0ZSBNZXRob2RlIGhpZXJmdWVyIGlzdAorICA+IHNzaCBnaXRAbWcubXVkLmRlIGZvcmsgZC9nZWJpcmdlL3pvb2svd2FsZCBwbGF5ZXJzL3plc3N0cmEvcHVibGljL3p3YWxkCisgIEhpZXJiZWkgd2lyZCBlaW4gQ2xvbmUgZGVzIFJlcG9zIGVyc3RlbGx0IHVuZCBzaWNoIGdlbWVya3QsIHdlbGNoZXMgZGFzCisgIE9yaWdpbmFsIHdhci4gSW4gRGVpbmVtIFJlcG8ga2FubnN0IER1IG51biBlaW5lbiBCdWdmaXggbWFjaGVuLiBCaXN0IER1CisgIGZlcnRpZywgc2Fnc3QgRHUgZGVtIEdlYmlldHNtYWdpZXIgKG9kZXIgZWluZW0genVzdGFlbmRpZ2VuIFJNKSBCZXNjaGVpZCB1bmQKKyAgYml0dGVzdCBpaG4sIGRlbiBlbnRzcHJlY2hlbmRlbiBCcmFuY2ggKHouQi4gc3ludGF4X2J1Z2ZpeCkgenUgcHVsbGVuLgorCisqIFdpZSB2ZXJtZWlkZSBpY2ggZWluZW4gJ21lcmdlIGNvbW1pdCcsIHdlbm4gaWNoIGxva2FsZSBBZW5kZXJ1bmdlbiBpbiBlaW5lbQorKiBad2VpZyBoYWJlLCBpbiBkZW4gaWNoIEFlbmRlcnVuZ2VuIGF1cyBkZW0gTUcgcHVsbGVuIG1vZWNodGU/CisgIEVpbmUgTW9lZ2xpY2hrZWl0IGhpZXJmdWVyIGlzdCBkYXMgUHVsbGVuIG1pdCAnZ2l0IHB1bGwgLS1yZWJhc2UnLCB1bSBnaXQKKyAgZWluZW4gaW1wbGl6aXRlcyBSZWJhc2UgYmVpbSBQdWxsIGR1cmNoZnVlaHJlbiB6dSBsYXNzZW4uCisKKworV2FzIGlzdCBnaXQ/CitXbyBrcmllZyBpY2ggZ2l0IGhlcj8KK1dpZSBrYW5uIGljaCBkYXMgUmVwb3NpdG9yeSBjbG9uZW4/CitXaWUga2FubiBpY2ggZWluIENoYW5nZWxvZyBhbnplaWdlbiBsYXNzZW4/CitXaWUga2FubiBpY2ggZWluIENoYW5nZWxvZyBtaXQgRGlmZiBhbnplaWdlbiBsYXNzZW4/CisKK1NJRUhFIEFVQ0g6CisgIGdpdC1yZXBvc2l0b3JpZXM6IFJlcG9zaXRvcnktVmVyd2FsdHVuZyBpbSBNdWQKKyAgZ2l0LWhvd3RvOiBXaWUgZ2l0IGJlbnV0enQgd2lyZAorICBnaXQtd29ya2Zsb3c6IEVpbiBzaW1wbGVzIEJlaXNwaWVsIGVpbmVzIEFyYmVpdHNmbHVzc2VzIG1pdCBHaXQKKyAgZ2l0LXN5bmM6IFdpZSBkaWUgU3luY2hyb25pc2llcnVuZyB6dy4gZ2l0LVJlcG9zIHVuZCBNdWRsaWIgYWJsYWV1ZnQKKyAgZ2l0LWxpbmtzOiBWZXJ3ZWlzZSBpbnMgV1dXCisKKzEwLjAzLjIwMTUgQW1hcnlsbGlzCisKZGlmZiAtLWdpdCBhL2RvYy93aXovZ2l0LWhvd3RvIGIvZG9jL3dpei9naXQtaG93dG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE2YWNkZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93aXovZ2l0LWhvd3RvCkBAIC0wLDAgKzEsMTExIEBACitHaXQtQmVudXR6dW5nIGltIE1vcmdlbkdyYXVlbgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworMC4gRWlubGVpdHVuZworICBIaWVyIHNvbGwga3VyeiBiZXNjaHJpZWJlbiB3ZXJkZW4sIHdpZSBtYW4gbnVuIGFuIGRpZSBSZXBvc2l0b3JpZXMgYXVmIGRlbQorICBNdWRyZWNobmVyIHJhbmtvbW10LgorICBFcyB3aXJkIGFuIGRpZXNlciBTdGVsbGUgdm9yYXVzZ2VzZXR6dCwgZGFzcyBkZXIgTGVzZXIvTWFnaWVyCisgIGdydW5kc2FldHpsaWNoIHdlaXNzLCB3YXMgR2l0IGlzdCB1bmQgd2llIGVzIGJlbnV0enQgd2lyZC4gSGllciBzb2xsZW4KKyAgbGVkaWdsaWNoIEJlc29uZGVyaGVpdGVuIGltIFp1c2FtbWVuaGFuZyBtaXQgZGVtIE1HIGVybGFldXRlcnQgd2VyZGVuLgorICBFYmVuc28gd2lyZCB2b3JhdXNnZXNldHp0LCBkYXNzIGRlciBNYWdpZXIgR2l0IHVuZCBlaW5lbiBTU0gtQ2xpZW50IGF1ZgorICBzZWluZW0gUmVjaG5lciBpbnN0YWxsaWVydCBoYXQuCisKKyAgV2VyIGpldHp0IG5vY2ggbml4IHZvbiBHaXQgd2Vpc3MsIHNlaSBhdWYgZGllIHJlaWNoaGFsdGlnIGltIE5ldHoKKyAgdmVyZnVlZ2JhcmUgRG9rdSB2ZXJ3aWVzZW46IHMuIGEuIGdpdC1saW5rcy4KKworCisxLiBadWdyaWZmc3JlY2h0ZSBhdWYgR2l0LVJlcG9zaXRvcmllcworICBadW5hZWNoc3QgbXVzcyBtYW4gc2ljaCBhbHMgR2l0LU51dHplciBlaW50cmFnZW4gbGFzc2VuLiBIaWVyenUgYnJhdWNodCBtYW4KKyAgZWluIFNTSC1TY2hsdWVzc2VscGFhciwgd2VsY2hlcyBtYW4gei5CLiBtaXR0ZWxzIHNzaC1rZXlnZW4gZXJzdGVsbGVuCisgIGthbm4uIERlbiBfb2VmZmVudGxpY2hlbl8gU2NobHVlc3NlbCAoLnB1YiBhbSBFbmRlKSBsZWd0IG1hbiBkYW5uIGFscworICA8bWFnaWVyPi5wdWIgaW4gc2VpbiBIb21ldmVyemVpY2huaXMgdW5kIHNwcmljaHQgZWluZW4gRU0gKHouQi4gWmVzc3RyYSkKKyAgYW4uCisKKyAgTWl0dGVscyBkZXMgQmVmZWhscworICA+IHNzaCBnaXRAbWcubXVkLmRlIGluZm8KKyAga2FubiBtYW4gc2ljaCBhbnplaWdlbiBsYXNzZW4sIGF1ZiB3ZWxjaGUgZXhpc3RpZXJlbmRlbiBSZXBvc2l0b3JpZXMgbWFuCisgIHdlbGNoZSBadWdyaWZmc3JlY2h0ZSBoYXQgKFI6IGxlc2VuLCBXOiBzY2hyZWliZW4pLiBCZWlzcGllbDoKKyAgICBSICAgVyAgICh6ZXNzdHJhKSBkL2luc2Vsbi96ZXNzdHJhL3Z1bGthbndlZworICBJbiBkaWVzZW0gRmFsbCBoYXQgZGVyIEJlbnV0emVyIExlc2UtIHVuZCBTY2hyZWlicmVjaHRlIGF1ZgorICBkL2luc2Vsbi96ZXNzdHJhL3Z1bGthbndlZy4gRGFzIFJlcG9zaXRvcnkgZ2Vob2VydCB6ZXNzdHJhLgorCisgIFp1c2FldHpsaWNoIHVtZmFzc3QgZGllIEF1c2dhYmUgYXVjaCBkaWUgWnVncmlmZnNyZWNodGUgYWxsZXIgX21vZWdsaWNoZW5fCisgIChhYmVyIG5vY2ggbmljaHQgZXhpc3RpZXJlbmRlbikgUmVwb3MuCisgIFdpY2h0aWcgaXN0IGhpZXIgZGFzIEVyc3RlbGx1bmdzcmVjaHQgKEMpLiBCZWlzcGllbDoKKyAgQyAgUiAgIFcgIGQvdW50ZXJ3ZWx0L3plc3N0cmEvW2EtekEtWl17MX1bYS16QS1aMC05Xy5cLV0qCisgIEhpZXIgaGF0IGRlciBCZW51dHplciBhdWYgYWxsZSBSZXBvcyB1bnRlcmhhbGIgdm9uIGQvdW50ZXJ3ZWx0L3plc3N0cmEvCisgICh3b2JlaSBhbGxlIGRpZXNlIFJlcG9zIG1pdCBlaW5lbSBCdWNoc3RhYmVuIGJlZ2lubmVuIHVuZCBhbnNvbnN0ZW4gbnVyCisgICBCdWNoc3RhYmVuLCBaYWhsZW4sIF8sIC4gdW5kIC0gZW50aGFsdGVuIGR1ZXJmZW4pIExlc2UtLCBTY2hyZWliLSB1bmQKKyAgRXJzdGVsbHVuZ3NyZWNodGUuCisKKzIuIEVpbiBleGlzdGllcmVuZGVzIFJlcG9zaXRvcnkgY2xvbmVuCisgIERpZXMgZXJmb2xndCBnYW56IHNpbXBlbCBtaXQgZGVtIEJlZmVobDoKKyAgPiBnaXQgY2xvbmUgZ2l0QG1nLm11ZC5kZTpwbGF5ZXJzL3plc3N0cmEvdGVzdGdlYmlldCA8emllbHZlcnplaWNobmlzPgorICBEYXMgWmllbHZlcnplaWNobmlzIGlzdCBoaWVyYmVpIGJlbGllYmlnLiBFbXBmZWhsdW5nOiBhbGxlIE1HLVJlcG9zIGluCisgIGVpbmVtIFZlcnplaWNobmlzIHNhbW1lbG4gdW5kIGRvcnQgZGllIFZlcnplaWNobmlzc3RydWt0dXIgYXVzIGRlbSBNdWQKKyAgYmVpYmVoYWx0ZW46CisgID4gZ2l0IGNsb25lIGdpdEBtZy5tdWQuZGU6cGxheWVycy96ZXNzdHJhL3Rlc3RnZWJpZXQKKyAgICBwbGF5ZXJzL3plc3N0cmEvdGVzdGdlYmlldAorICBEYW1pdCBBZW5kZXJ1bmdlbiBzcGFldGVyIGF1Y2ggRXVyZW4gTWFnaWVybmFtZW4gdHJhZ2VuLCBnZWh0IG51biBiaXR0ZSBpbgorICBFdWVyIGdlY2xvbnRlcyBSZXBvIHVuZCBzZXR6dCBOYW1lbiB1bmQgZU1haWwtQWRyZXNzZToKKyAgPiBnaXQgY29uZmlnIHVzZXIubmFtZSAiTWFnaWVyIgorICA+IGdpdCBjb25maWcgdXNlci5lbWFpbCAidXNlckBleGFtcGxlLmNvbSIKKyAgCiszLiBFaW4gbmV1ZXMgUmVwb3NpdG9yeSBlcnN0ZWxsZW4uCisgICAgVm9yYXVzc2V0enVuZzogZGFzIFZlcnplaWNobmlzIGltIE11ZCBleGlzdGllcnQuCisgICAgRGllcyBnZWh0LCB3ZW5uIGlociBTY2hyZWlienVncmlmZiBhdWYgZGFzIFZlcnplaWNobmlzIGltIE11ZCBoYWJ0LiBMZWd0CisgICAgZWluZmFjaCBpbiBkZW0gVmVyemVpY2huaXMgZWluZSBEYXRlaSBuYW1lbnMgImdpdC1tdWQtaW1wb3J0IiBhbiAoSW5oYWx0CisgICAgaXN0IGVnYWwpIHVuZCB3YXJ0ZXQgYmlzIHp1ciBuYWVjaHN0ZW4gdm9sbGVuIFN0dW5kZS4KKyAgICBBQ0hUVU5HOiBkYXMgVmVyemVpY2huaXMgaW0gTXVkIGRhcmYgTklDSFQgbGVlciBzZWluLCBzb25kZXJuIG11c3MgbWluLgorICAgIGVpbmUgRGF0ZWkgKGdnZi4gaW4gZWluZW0gVW50ZXJ2ZXJ6ZWljaG5pcykgZW50aGFsdGVuIQorIAorICBBbm1lcmt1bmdlbjoKKyAgRXhpc3RpZXJ0IGVpbiBSZXBvIGJlcmVpdHMsIGlzdCBlaW4gYXV0b21hdGlzY2hlciBJbXBvcnQgYXVzIGRlbSBNdWQgbmljaHQKKyAgbWVociBtb2VnbGljaC4KKyAgQmVpIGVpbmVtICJnaXQgY2xvbmUiIGF1ZiBlaW4gbm9jaCBuaWNodCBleGlzdGllcmVuZGVzIFJlcG8gd2lyZCBkYXMgCisgIGRhcyBSZXBvIGF1dG9tYXRpc2NoIGFuZ2VsZWd0IC0gZGllc2VzIFJlcG8gd2lyZCBkYW5uIGFiZXIgbmljaHQgbWl0CisgIGRlbSBNdWQgc3luY2hyb25pc2llcnQhCisgIERhaGVyOiBlcnN0IChlcmZvbGdyZWljaCkgaW1wb3J0aWVyZW4sIGRhbm4gY2xvbmVuLiAKKworNC4gQXJiZWl0ZW4gbWl0IGRlbSBSZXBvCisgIEhpZXJ6dSBzZWkgenVlcnN0IGVpbm1hbCBhdWYgZGllIGFsbGdlbWVpbiBpbSBOZXR6IHZlcmZ1ZWdiYXJlIERva3VtZW50YXRpb24KKyAgenUgR2l0IHVuZCBuYXR1ZXJsaWNoIHNlaW5lIE1hbnBhZ2VzIHZlcndpZXNlbi4KKyAgRWluZW4gYmVpc3BpZWxoYWZ0ZW4gQXJiZWl0c2FibGF1ZiBmaW5kZXQgc2ljaCBpbiBkZXIgTWFucGFnZSBnaXQtd29ya2Zsb3cuCisKKzUuIFN5bmNocm9uaXNhdGlvbiBtaXQgZGVtIE11ZAorICBSZXBvcyBrb2VubmVuIGJlaSBlaW5lbSAnZ2l0IHB1c2gnIHZvbiBhdXNzZW4gYXV0b21hdGlzY2ggZGllIEFlbmRlcnVuZ2VuCisgIGRlcyBtYXN0ZXItQnJhbmNoZXMgaW5zIE11ZCB1ZWJlcnRyYWdlbi4gRGVzd2VpdGVyZW4ga29lbm5lbiBBZW5kZXJ1bmdlbgorICBhdXMgZGVtIE11ZCBhdXRvbWF0aXNjaCBpbiBkYXMgUmVwbyBpbXBvcnRpZXJ0IHdlcmRlbi4KKyAgQXVmIGRpZXNlIFdlaXNlIGlzdCBkYXMgVmVyd2VuZGVuIHZvbiBGVFAgZmFzdCB1ZWJlcmZsdWVzc2lnLgorICBEZXRhaWxzIHNpbmQgaW4gZGVyIE1hbnBhZ2UgZ2l0LXN5bmMgYW5nZWdlYmVuLgorCis2LiBMb2VzY2hlbiB2b24gUmVwb3NpdG9yaWVzCisgIEdpdC1SZXBvcywgZGllIHZvbiBldWNoIHNlbGJlciBHRUhPRVJFTiAoU2NocmVpYnJlY2h0ZSBhbGxlaW4gcmVpY2hlbiBuaWNodCkKKyAga29lbm5lbiBnZWxvZXNjaHQgdW5kIC0genVtaW5kZXN0IGVpbmUgV2VpbGUgYXVjaCB3aWVkZXIgcmVzdGF1cmllcnQgd2VyZGVuLgorCis2LjEuIExvZXNjaGVuCisgID4gc3NoIGdpdEBtZy5tdWQuZGUgRCB0cmFzaCBwbGF5ZXJzL2NhbGRyYS9uZWJlbGJlcmdlCisgIHBsYXllcnMvY2FsZHJhL25lYmVsYmVyZ2UgbW92ZWQgdG8gdHJhc2hjYW4uCisKKzYuMi4gTXVlbGxlaW1lciBhbnplaWdlbgorICA+IHNzaCBnaXRAbWcubXVkLmRlIEQgbGlzdC10cmFzaAorICBwbGF5ZXJzL2NhbGRyYS9uZWJlbGJlcmdlLzIwMTEtMTEtMjhfMjI6MzU6NTUKKworNi4zLiBSZXN0YXVyaWVyZW4KKyAgPiBzc2ggZ2l0QG1nLm11ZC5kZSBEIHJlc3RvcmUgcGxheWVycy9jYWxkcmEvbmViZWxiZXJnZS8yMDExLTExLTI4XzIyOjM1OjU1CisgIHBsYXllcnMvY2FsZHJhL25lYmVsYmVyZ2UvMjAxMS0xMS0yOF8yMjozNTo1NSByZXN0b3JlZCB0bworICBwbGF5ZXJzL2NhbGRyYS9uZWJlbGJlcmdlCisKKyAgRXMgdmVyc3RlaHQgc2ljaCB2b24gc2VsYnN0LCBkYXNzIElociBtaXQgZGllc2VtIE1pdHRlbCBzZWhyIHp1cnVlY2toYWx0ZW5kCisgIHVtZ2VoZW4gc29sbHRldC4gQmVpIE1pc3NicmF1Y2ggd2lyZCBnZ2YuIGVpbiBCYWNrdXAgZWluZ2VzcGllbHQgdW5kIGRpZXNlCisgIE1vZWdsaWNoa2VpdCB3aWVkZXIgZ2Vsb2VzY2h0LgorCitTSUVIRSBBVUNIOgorICBnaXQtcmVwb3NpdG9yaWVzOiBSZXBvc2l0b3J5LVZlcndhbHR1bmcgaW0gTXVkCisgIGdpdC13b3JrZmxvdzogRWluIHNpbXBsZXMgQmVpc3BpZWwgZWluZXMgQXJiZWl0c2ZsdXNzZXMgbWl0IEdpdAorICBnaXQtc3luYzogV2llIGRpZSBTeW5jaHJvbmlzaWVydW5nIHp3LiBnaXQtUmVwb3MgdW5kIE11ZGxpYiBhYmxhZXVmdAorICBnaXQtZmFxOiBoYWV1ZmlnIGdlc3RlbGx0ZSBGcmFnZW4vUHJvYmxlbWUKKyAgZ2l0LWxpbmtzOiBWZXJ3ZWlzZSBpbnMgV1dXCisKKzI5LjAxLjIwMTMgR2xvaW5zb24KK0xldHp0ZSBBZW5kZXJ1bmc6IDAyLjA3LjIwMTQgTm90c3Ryb20KZGlmZiAtLWdpdCBhL2RvYy93aXovZ2l0LWtvb3BlcmF0aW9uIGIvZG9jL3dpei9naXQta29vcGVyYXRpb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNiZGE2ZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93aXovZ2l0LWtvb3BlcmF0aW9uCkBAIC0wLDAgKzEsNjggQEAKK0Vyd2VpdGVydW5nIHp1bSBHaXQtV29ya2Zsb3c6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitCZWkgbWFuY2hlbiBQcm9qZWt0ZW4gd2lsbCBtYW4gbWl0IGFuZGVyZW4gTWFnaWVybiBrb29wZXJpZXJlbiwgYWJlcjoKKyogZGllIERhdGVpZW4gaW0gTVVEIGZ1ZXIgZGllIFNwaWVsZXIgdW52ZXJhZW5kZXJ0IGxhc3NlbgorKiBpbiBlaW5lbSBvcmRlbnRsaWNoZW4gWndlaWcgenVzYW1tZW5hcmJlaXRlbgorCitEYXp1IGthbm4gbWFuIFp3ZWlnZSBhdWNoIHJlbW90ZSwgYWxzbyBpbSBNVUQgZXJzdGVsbGVuLiBEYSBudXIgZGVyCisnbWFzdGVyJy1ad2VpZyBpbiBkYXMgTVVEIHNlbGJzdCBzeW5jaHJvbmlzaWVydCB3aXJkLCBrYW5uIG1hbiB1ZWJlcgorZGFzIE1VRCBzbyBkaWUgUmVwb3NpdG9yaWVzIGF1ZiBtZWhyIGFscyBlaW5lbiBDb21wdXRlci9tZWhyIGFscyBlaW5lcgorUGVyc29uIHN5bmNocm9uaXNpZXJlbiwgb2huZSBkaWUgU3BpZWxlciBtaXQgc2VpbmVyIEVudHdpY2tsdW5nc2FyYmVpdAorenUgYmVoZWxsaWdlbjoKKworIyBBbHRlcm5hdGl2ZW4gaW4venUgU2Nocml0dCA0OiBLb29wZXJhdGlvbiBpbiBlaW5lbSByZW1vdGUgWndlaWcuCitGYWxscyBpY2ggbWl0IGFuZGVyZW4gTGV1dGVuIG1laW5lbiBDb2RlIHRlaWxlbiB3aWxsLCBkaWVzZXIgYWJlciBuaWNodCBpbQorTVVEIGltICdtYXN0ZXInLVp3ZWlnIGF1ZnRhdWNoZW4gKGFsc28gYWxzIERhdGVpYWVuZGVydW5nIGZ1ZXIgYWxsZSBTcGllbGVyCitnZWx0ZW4pIHNvbGwsIGthbm4gaWNoIGF1Y2ggbnVyIG1laW5lbiBad2VpZyBzZWxic3QgaW5zIE1VRCBzY2hpY2tlbjoKKz4gZ2l0IGNoZWNrb3V0IG5ldWVfa2FtcGZ0YWt0aWsKKz4gZ2l0IHB1c2ggLXUgZ2l0QG1nLm11ZC5kZTovZGluZ3MvYnVtcyBuZXVlX2thbXBmdGFrdGlrCisKK0FscyBBbnR3b3J0IGR1ZXJmdGUgc293YXMgd2llOgorICogW25ldyBicmFuY2hdICAgICAgbmV1ZV9rYW1wZnRha3RpayAtPiBuZXVlX2thbXBmdGFrdGlrCitkb3J0IHN0ZWhlbi4KKworTWl0Cis+IGdpdCBwdWxsCitrb2VubmVuIHdpciB1bnMgZGllc2UgQWVuZGVydW5nZW4gYW0gTVVELVJlcG9zaXRvcnkgaG9sZW4uIERlciBad2VpZworJ25ldWVfa2FtcGZ0YWt0aWsnIGlzdCBqZXR6dCBlaW4gWndlaWcgYXVjaCBpbSBNVUQgdW5kIGFsbGUgTGV1dGUsCitkaWUgc2ljaCBqZXR6dCBkYXMgUmVwb3NpdG9yeSAvZGluZ3MvYnVtcyBjbG9uZW4sIHN0ZWh0IGdlbmF1IGRpZXNlcgorWndlaWcgbWl0IGFsbCB1bnNlcmVuIEFlbmRlcnVuZ2VuIGpldHp0IGF1Y2ggenVyIFZlcmZ1ZWd1bmcuCisKK1Vuc2VyIGxva2FsZXIgWndlaWcgJ25ldWVfa2FtcGZ0YWt0aWsnIGJla29tbXQgYWJlciBkaWUgQWVuZGVydW5nZW4KK2FuIGRpZXNlbSBad2VpZyBhbmRlcmVyIGV2ZW50dWVsbCBub2NoIG5pY2h0IGdhbnogbWl0LiBNaXQKKz4gZ2l0IGJyYW5jaCAtLXNldC11cHN0cmVhbSBuZXVlX2thbXBmdGFrdGlrIHJlbW90ZXMvb3JpZ2luL25ldWVfa2FtcGZ0YWt0aWsKK3NhZ2VuIHdpciBkZW0gbG9rYWxlbiBad2VpZywgZGFzcyBlciBhYiBqZXR6dCBtaXQgZGVtIHJlbW90ZXMtWndlaWcKKyduZXVlX2thbXBmdGFrdGlrJyB2ZXJidW5kZW4gaXN0LgorCitEYW1pdCBiZWtvbW1lbiB3aXIgZXR3YWlnZSByZW1vdGUtQWVuZGVydW5nZW4gaW4gZGllc2VtIFp3ZWlnIG5hY2ggZWluZW0KKz4gZ2l0IHB1bGwKK2JlaSBlaW5lbSBmb2xnZW5kZW4KKz4gZ2l0IGNoZWNrb3V0IG5ldWVfa2FtcGZ0YWt0aWsKK2RpcmVrdCBtaXRnZXRlaWx0LCBldmVudHVlbGwgaW4gZGVyIEZvcm06CisgIFlvdXIgYnJhbmNoIGlzIGJlaGluZCAnb3JpZ2luL25ldWVfa2FtcGZ0YWt0aWsnIGJ5IDEgY29tbWl0LCBhbmQgY2FuIGJlCisgIGZhc3QtZm9yd2FyZGVkLgorRGFzIGlzdCBzZWhyIGVpbmZhY2ggZHVyY2ggZWluCis+IGdpdCBtZXJnZSBvcmlnaW4vbmV1ZV9rYW1wZnRha3Rpawora29ycmlnaWVyYmFyIHVuZCBzY2hvbiBrb2VubmVuIHdpciBzZWxiZXIgd2llZGVyIGFuIGRlbSBha3R1YWxpc2llcnRlbiBad2VpZworYXJiZWl0ZW4gdW5kIEFlbmRlcnVuZ2VuIHB1c2hlbi4gU2llaGUgU2Nocml0dCA1LgorCitaaWVsIGVpbmVyIHNvbGNoZW4gWnVzYW1tZW5hcmJlaXQgaXN0IG5hdHVlcmxpY2ggaW1tZXIsIGlyZ2VuZHdhbm4gYXVjaAord2llZGVyIGRlbiBhdXMgU2Nocml0dCA0IGJla2FubnRlbiBNZXJnZSBnZWdlbiBkZW4gWndlaWcgJ21hc3RlcicgZHVyY2h6dS0KK2Z1ZWhyZW4sIGRhbWl0IGRpZSBTcGllbGVyIHdhcyBkYXZvbiBoYWJlbi4KK1dlbm4gd2lyIGFsc28gaXJnZW5kd2FubiBkaWVzZW4gTWVyZ2UgZHVyY2hnZWZ1ZWhydCBoYWJlbiB1bmQgZGVyIFp3ZWlnCisnbmV1ZV9rYW1wZnRha3RpaycgdW5ub2V0aWcgZ2V3b3JkZW4gaXN0LCBrb2VubmVuIHdpciBpaG4gYXVmIGRlciBTZWl0ZQorZGVzIE1VRHMgbWl0OgorPiBnaXQgcHVzaCBnaXRAbWcubXVkLmRlOi9kaW5ncy9idW1zIDpuZXVlX2thbXBmdGFrdGlrCithdWZyYWV1bWVuLiBEZXIgZWluemlnZSBVbnRlcnNjaGllZCB6dW0gRXJzdGVsbGVuIGRlcyBad2VpZ2VzIGF1ZiBNVUQtU2VpdGUKK2lzdCB0YXRzYWVjaGxpY2ggZGVyICc6JyB2b3IgZGVtIE5hbWVuIGRlcyBad2VpZ3MuCitBY2h0dW5nOiBkYXMgZ2VodCBtb21lbnRhbiAobm9jaCkgbmljaHQgdW5kIGF1ZiAnbWFzdGVyJyBvaG5laGluIG5pZS4KKworU0lFSEUgQVVDSAorICBnaXQtcmVwb3NpdG9yaWVzOiBSZXBvc2l0b3J5LVZlcndhbHR1bmcgaW0gTXVkCisgIGdpdC1ob3d0bzogV2llIGdpdCBiZW51dHp0IHdpcmQKKyAgZ2l0LXdvcmtmbG93OiBFaW4gc2ltcGxlcyBCZWlzcGllbCBlaW5lcyBBcmJlaXRzZmx1c3NlcyBtaXQgR2l0CisgIGdpdC1zeW5jOiBXaWUgZGllIFN5bmNocm9uaXNpZXJ1bmcgencuIGdpdC1SZXBvcyB1bmQgTXVkbGliIGFibGFldWZ0CisgIGdpdC1mYXE6IGhhZXVmaWcgZ2VzdGVsbHRlIEZyYWdlbi9Qcm9ibGVtZQorCiswMi4gRmViIDIwMTMgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy93aXovZ2l0LWxpbmtzIGIvZG9jL3dpei9naXQtbGlua3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI1OTJhMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93aXovZ2l0LWxpbmtzCkBAIC0wLDAgKzEsMzggQEAKK0xpc3RlIHZvbiBudWV0emxpY2hlbiB1bmQgd2VpdGVyZnVlaHJlbmRlbiBMaW5rcyBpbSBOZXR6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICogRGFzICdvZmZpemllbGxlJyBUdXRvcmlhbAorICAgIGh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvc29mdHdhcmUvc2NtL2dpdC9kb2NzL2dpdHR1dG9yaWFsLmh0bWwKKyAgKiBHaXQgLSBTVk4gQ3Jhc2ggQ291cnNlIChmdWVyIExldXRlLCBkaWUgU1ZOIGtlbm5lbikKKyAgICBodHRwOi8vZ2l0Lm9yLmN6L2NvdXJzZS9zdm4uaHRtbAorICAqIEV2ZXJ5ZGF5IGdpdCB3aXRoIDIwIGNvbW1hbmRzIG9yIHNvCisgICAgaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9zb2Z0d2FyZS9zY20vZ2l0L2RvY3MvZXZlcnlkYXkuaHRtbAorICAgIChzb3J0aWVydCBuYWNoIERldmVsb3BlcnMsIEludGVncmF0b3JzLCBBZG1pbnMpCisgICogRGFzIGdpdCBDb21tdW5pdHkgQm9vayAoc2VociBlbXBmZWhsZW5zd2VydCkKKyAgICBodHRwOi8vYm9vay5naXQtc2NtLmNvbS8KKyAgKiBVbmRlcnN0YW5kaW5nIGdpdCBjb25jZXB0dWFsbHkKKyAgICBodHRwOi8vd3d3LmVlY3MuaGFydmFyZC5lZHUvfmNkdWFuL3RlY2huaWNhbC9naXQvCisgICogR2l0IGNoZWF0IHNoZWV0cworICAgIGh0dHA6Ly9oZWxwLmdpdGh1Yi5jb20vZ2l0LWNoZWF0LXNoZWV0cy8KKyAgICBodHRwOi8vamFuLWtydWVnZXIubmV0L2RldmVsb3BtZW50L2dpdC1jaGVhdC1zaGVldC1leHRlbmRlZC1lZGl0aW9uCisgICAgaHR0cHM6Ly9naXRodWIuY29tL0FsZXhaZWl0bGVyL2dpdGNoZWF0c2hlZXQvYmxvYi9tYXN0ZXIvZ2l0Y2hlYXRzaGVldC5wZGYKKyAgICBodHRwOi8vd3d3LmNoZWF0LXNoZWV0cy5vcmcvc2F2ZWQtY29weS9naXQtY2hlYXQtc2hlZXQucGRmCisgICAgaHR0cDovL2NoZWF0LmVycnRoZWJsb2cuY29tL3MvZ2l0CisgICogR3VpZGVzL0hvd3RvcyB2b24gR2l0SHViCisgICAgaHR0cDovL2hlbHAuZ2l0aHViLmNvbS8KKyAgKiBEaWZmZXJlbmNlIG9mIG1lcmdlIGFuZCBwdWxsCisgICAgaHR0cDovL2xvbmdhaXIubmV0L2Jsb2cvMjAwOS8wNC8xNi9naXQtZmV0Y2gtYW5kLW1lcmdlLworICAqIERpdi4gVGlwcyB1bmQgVHJpY2tzCisgICAgaHR0cDovL2xvbmdhaXIubmV0L2Jsb2cvMjAwOS8wNC8yNS9hLWZldy1naXQtdGlwcy8KKyAgKiBHaXQgZnVlciBXaW5kb3dzCisgICAgaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9naXRleHRlbnNpb25zLworICAgIChNaXQgSW50ZWdyYXRpb24gaW4gZGVuIEV4cGxvcmVyKQorICAqIEdpdC1CZW51dHp1bmcgdW50ZXIgV2luZG93cworICAgIGh0dHA6Ly9yb2dlcmR1ZGxlci5naXRodWIuaW8vZ2l0LWd1aWRlLworICAgIGh0dHA6Ly9oZWxwLmdpdGh1Yi5jb20vd2luLXNldC11cC1naXQvCisgICogR2l0LUludGVybmEgdmVyc3RhZW5kbGljaCBlcmtsYWVydDoKKyAgICBHaXQgRm9yIEFnZXMgNCBBbmQgVXAgCisgICAgaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj0xZmZCSjRzVlViNAorCisxMC4wMy4yMDE1IEFtYXJ5bGxpcworCmRpZmYgLS1naXQgYS9kb2Mvd2l6L2dpdC1yZXBvc2l0b3JpZXMgYi9kb2Mvd2l6L2dpdC1yZXBvc2l0b3JpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVkN2MzMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93aXovZ2l0LXJlcG9zaXRvcmllcwpAQCAtMCwwICsxLDcyIEBACitHaXQtUmVwb3NpdG9yaWVzIGltIE1vcmdlbkdyYXVlbgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRGllIGZvbGdlbmRlbiBSZXBvc2l0b3JpZXMgc3RlaGVuIGZ1ZXIgZGllIEJlbnV0enVuZyBkdXJjaCBNYWdpZXIgYmVyZWl0IGJ6dy4KK2xhc3NlbiBzaWNoIGR1cmNoIE1hZ2llciBiZWkgQmVkYXJmIChsZWVyIG9kZXIgZHVyY2ggSW1wb3J0IHZvbiBWZXJ6ZWljaG5pc3NlbgorYXVzIGRlbSBNdWQpIGFubGVnZW46CisKKyogL2QvcmVnaW9uL21hZ2llci8qCisgIFZlcnplaWNobmlzc2UgdW50ZXJoYWxiIGRlciBNYWdpZXJlYmVuZSBpbiBkZW4gUmVnaW9uZW4gbGFzc2VuIHNpY2ggaW4KKyAgZ2l0LVJlcG9zIGF1Zm5laG1lbi4KKyAgQW5sZWdlbjogUmVnaW9uc21pdGFyYmVpdGVyLCBNYWdpZXIgbWl0IFNjaHJlaWJ6dWdyaWZmIGF1ZiBkZW4gUGZhZAorICBTY2hyZWlienVncmlmZjogRWlnZW50dWVtZXIgKE1hZ2llciksIFJlZ2lvbnNtYWdpZXIgZGllc2VyIFJlZ2lvbiwgV2Vpc2UKKyAgTGVzZXp1Z3JpZmY6IHMuIFNjaHJlaWJ6dWdyaWZmICh3ZWdlbiBzZWN1cmUvKQorCisqIC9wL3NlcnZpY2UvbWFnaWVyLyoKKyAgQW5sZWdlbjogV2Vpc2UsIE1hZ2llciBtaXQgU2NocmVpYnp1Z3JpZmYgYXVmIGRlbiBQZmFkCisgIFNjaHJlaWJ6dWdyaWZmOiBFaWdlbnR1ZW1lciAoTWFnaWVyKSwgV2Vpc2UKKyAgTGVzZXp1Z3JpZmY6IGFsbGUgTWFnaWVyICg+PSAyMCkKKyAgCisqIC9wbGF5ZXJzL21hZ2llci8qCisgIEFubGVnZW46IE1hZ2llciBzZWxiZXIsIE1hZ2llciBtaXQgU2NocmVpYnp1Z3JpZmYgYXVmIGRlbiBQZmFkCisgIFNjaHJlaWJ6dWdyaWZmOiBNYWdpZXIgc2VsYmVyCisgIExlc2V6dWdyaWZmOiBNYWdpZXIgc2VsYmVyCisKKyogL3BsYXllcnMvbWFnaWVyL3B1YmxpYy8qCisgIEFubGVnZW46IE1hZ2llciBzZWxiZXIsIE1hZ2llciBtaXQgU2NocmVpYnp1Z3JpZmYgYXVmIGRlbiBQZmFkCisgIFNjaHJlaWJ6dWdyaWZmOiBNYWdpZXIgc2VsYmVyLCBXZWlzZQorICBMZXNlenVncmlmZjogamVkZXIgTWFnaWVyICg+PSAyMCkKKworKiBwbGF5Z3JvdW5kL21hZ2llci8qCisgIFNwaWVsd2llc2UgenVtIFRlc3RlbiB2b24gTWFnaWVybi4gU29sbCB6dW0gUnVtc3BpZWxlbiB1bmQgVGVzdGVuIHZvbiBHaXQKKyAgZGllbmVuLgorICBEaWVzZSBSZXBvcyB3ZXJkZW4gTklDSFQgbWl0IGRlbSBNdWQgc3luY2hyb25pc2llcnQuCisgIERpZXNlIFJlcG9zIHdlcmRlbiBhdXRvbWF0aXNjaCBnZWxvZXNjaHQsIHdlbm4gc2llIGxhZW5nZXIgYWxzIDE0IFRhZ2UgbmljaHQKKyAgdmVyYWVuZGVydCB3ZXJkZW4uCisgIEFubGVnZW46IGplZGVyIE1hZ2llcgorICBTY2hyZWlienVncmlmZjogTWFnaWVyIHNlbGJlciwgV2Vpc2UKKyAgTGVzZXp1Z3JpZmY6IGplZGVyIExlaHJsaW5nICh1bmQgaG9laGVyKSAoPj0gMTUpCisKK1VlYnJpZ2VucyBnZWh0IGVzIGV4cGxpeml0IE5JQ0hULCBzZWluIGdlc2FtdGVzIH4gaW4gZWluIFJlcG8genUgZmFzc2VuLgorCitXZW5uIG1hbiBzZWluIGtvbXBsZXR0ZW4gUmVnaW9uc3ZlcnplaWNobmlzICgvZC9yZWdpb24vbWFnaWVyKSBpbiBlaW4gUmVwbworaW1wb3J0aWVydCwgc2luZCBhbnNjaGxpZXNzZW5kIGtlaW5lIGVpbnplbG5lbiBSZXBvcyB1bnRlcmhhbGIgZGllc2VzCitWZXJ6ZWljaG5pc3NlcyBtb2VnbGljaCAoYnp3LiBmdWVocmVuIHp1IFByb2JsZW1lbSkhIEViZW5zbyBrYW5uIGRhcyBrb21wbGV0dGUKK01hZ2llcnZlcnplaWNobmlzIG5pY2h0IG1laHIgYWxzIFJlcG8gaW1wb3J0aWVydCB3ZXJkZW4sIHdlbm4gZXMgdW50ZXIgaWhtCitzY2hvbiBSZXBvcyBnaWJ0LgorCitFcnptYWdpZXIgdW5kIEdvZXR0ZXIgaGFiZW4gdWVicmlnZW5zIGF1ZiBfYWxsZV8gUmVwb3NpdG9yaWVzIExlc2UtIHVuZAorU2NocmVpYnp1Z3JpZmYuIFNpZSBzaW5kIGF1Y2ggZGllIGVpbnppZ2VuLCBkaWUgaW4gZGVuIFJlcG9zaXRvcmllcyBlaW5lbiBzb2cuCitSZXdpbmQgZHVyY2hmdWVocmVuIGtvZW5uZW4gLSBkLmguIGRpZSBWZXJzaW9uc2dlc2NoaWNodGUgaW0gTmFjaGhpbmVpbgorYWVuZGVybi4KK0VpbmUgQmVydWVja3NpY2h0aWd1bmcgdm9uIGFjY2Vzc19yaWdodHMuYywgQUNDRVNTX1JJR0hUUyBldGMuIGZpbmRldCBoaWVyYmVpCitkZXJ6ZWl0IE5JQ0hUIHN0YXR0LgorCitadW0gTG9lc2NoZW4gdm9uIFJlcG9zaXRvcmllcyBzaWVoZSBQdW5rdCA2IGluIGdpdC1ob3d0by4KKworRWluIChhdXRvbWF0aXNjaGVyKSBJbXBvcnQgYmVzdGVoZW5kZXIgVmVyemVpY2huaXNzZSBhdXMgZGVtIE11ZCBpc3QKK21vZWdsaWNoLiBJbiBkaWVzZW0gRmFsbCB3ZXJkZW4gZGFzIHNvIGVyc3RlbGx0ZSBSZXBvc2l0b3J5IHVuZCBkaWUgTXVkbGliCithdXRvbWF0aXNjaCBzeW5jaHJvbmlzaWVydCwgd2VubiBqZW1hbmQgdm9uIGF1c3NlbiBpbiBkYXMgUmVwb3NpdG9yeSBwdXNodC4KK0hpZXJiZWkgd2lyZCBfdmVyc3VjaHRfIGV0d2FpZ2UgZ2xlaWNoemVpdGlnZSBBZW5kZXJ1bmcgaW0gR2l0LVJlcG8gdW5kIGluIGRlcgorTXVkbGliIHNpbm52b2xsIHp1ICdtZXJnZW4nIC0gaW0gRmFsbGUgdm9uIEtvbmZsaWt0ZW4gaXN0IGRpZXMgbmljaHQgaW1tZXIKK21vZWdsaWNoLCB3ZXN3ZWdlbiBNYWdpZXIgYXVmIGRhcyBFcmdlYm5pcyBzb2xjaGVyIGF1dG9tYXRpc2llcnRlciBNZXJnZXMgZWluCitBdWdlIHdlcmZlbiBzb2xsdGVuLgorCitTSUVIRSBBVUNIOgorICBnaXQtaG93dG86IFdpZSBnaXQgYmVudXR6dCB3aXJkCisgIGdpdC13b3JrZmxvdzogRWluIHNpbXBsZXMgQmVpc3BpZWwgZWluZXMgQXJiZWl0c2ZsdXNzZXMgbWl0IEdpdAorICBnaXQtc3luYzogV2llIGRpZSBTeW5jaHJvbmlzaWVydW5nIHp3LiBnaXQtUmVwb3MgdW5kIE11ZGxpYiBhYmxhZXVmdAorICBnaXQtZmFxOiBoYWV1ZmlnIGdlc3RlbGx0ZSBGcmFnZW4vUHJvYmxlbWUKKyAgZ2l0LWxpbmtzOiBWZXJ3ZWlzZSBpbnMgV1dXCisKKzI5LjAxLjIwMTMgR2xvaW5zb24uCmRpZmYgLS1naXQgYS9kb2Mvd2l6L2dpdC1zeW5jIGIvZG9jL3dpei9naXQtc3luYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2M1ZDlmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dpei9naXQtc3luYwpAQCAtMCwwICsxLDQ5IEBACitTeW5jaHJvbmlzYXRpb24gendpc2NoZW4gZ2l0LVJlcG9zaXRvcmllcyB1bmQgTXVkCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0kuIFB1c2ggdm9uIGF1c3NlbiBpbnMgTXVkLgorCitBbSBFbmRlIGVzIFB1c2hlcyAoaW0gc29nLiBwb3N0LXVwZGF0ZSBob29rKSB3aXJkIGVpbiBTY3JpcHQgZ2VzdGFydGV0LAord2FzIGZvbGdlbmRlcyBtYWNodDoKKworMSkgV2VubiBmdWVyIGRpZSBTeW5jaHJvbmlzYXRpb24gbWl0IGRlbSBNdWQgYWt0aXYgaXN0LCB3aXJkIG1pdCBkZXIgTXVkbGliCisgICBnZXN5bmN0LiBXZW5uIG5pY2h0OiBFbmRlCisyKSBadW5hZWNoc3Qgd2lyZCBpbiBlaW5lbSBsb2thbGVuIENsb25lIGRlcyBnaXQtUmVwb3NpdG9yaWVzIGVpbiB0ZW1wb3JhZXJlcgorICAgQnJhbmNoIHp1bSBNZXJnZW4gdm9uIEFlbmRlcnVuZ2VuIGF1cyBkZW0gTXVkIGFuZ2VsZWd0IChhdXRvLW11ZC1zeW5jKSwKKyAgIHdlbGNoZXIgYmVpIGRlbSBUYWcgbGFzdC1hdXRvLW11ZC1zeW5jIHN0YXJ0ZXQgdW5kIGRpZXNlciBCcmFuY2gKKyAgIGF1c2dlY2hlY2t0LgorMykgTWl0IEhpbGZlIHZvbiByc3luYyB3ZXJkZW4gYWxsZSBBZW5kZXJ1bmdlbiBhdXMgZGVyIE11ZGxpYiBoZXJlaW5rb3BpZXJ0LgorNCkgV2VubiBBZW5kZXJ1bmdlbiBleGlzdGllcmVuLCB3aXJkIGVpbiBuZXVlciBDb21taXQgYXVmIGRlbSBCcmFuY2ggZ2VtYWNodC4KKzUpIEFuc2NobGllc3NlbmQgd2lyZCBCcmFuY2ggbWFzdGVyIGF1c2dlY2hlY2t0LgorNikgV2VubiBlcyBBZW5kZXJ1bmdlbiBnYWIsIGRpZSBpbiA0KSBjb21taXRldCB3dXJkZW4sIHdpcmQgamV0enQgZGVyIEJyYW5jaAorICAgYXV0by1tdWQtc3luYyBtaXQgZGllc2VtIENvbW1pdCBpbiBtYXN0ZXIgZ2VtZXJndC4KKyAgIEtvbW10IGVzIGhpZXJiZWkgenUgS29uZmxpa3Rlbiwgd2VyZGVuIGRpZSBfYXV0b21hdGlzY2hfIHp1Z3Vuc3RlbiBkZXMKKyAgIFN0YW5kZXMgZGVyIGdpdC1SZXBvc2l0b3JpZXMgYXVmZ2Vsb2VzdCwgZC5oLiBlcyBnZWhlbiBnZ2YuIEFlbmRlcnVuZ2VuIGF1cworICAgZGVtIE11ZCB2ZXJsb3Jlbi4gRXMga2FubiBoaWVyYmVpIGRhaGVyIHBhc3NpZXJlbiwgZGFzcyB2b24gOCBpbSBNdWQKKyAgIGdlYWVuZGVydGVuIFplaWxlbiBudXIgNiB1ZWJlcm5vbW1lbiB3ZXJkZW4sIHdlaWwgMiBaZWlsZW4gaW4gS29uZmxpa3QgbWl0CisgICBkZW4gQWVuZGVydW5nZW4gaW0gZ2l0LVJlcG9zaXRvcnkgc3RlaGVuLiBEYWhlciBpc3QgZXMgd2ljaHRpZywgZGFzCisgICBFcmdlYm5pcyBkaWVzZXMgTWVyZ2VzIGltIE5hY2hoaW5laW4genUgcHJ1ZWZlbiB1bmQgZ2dmLiB6dSBrb3JyaWdpZXJlbiEKKzcpIEZhbGxzIGVzIEFlbmRlcnVuZ2VuIGdhYiwgd2lyZCBqZXR6dCBkZXIgaW4gNykgZXJzdGVsbHRlIE1lcmdlLUNvbW1pdCBpbnMKKyAgIGdpdC1SZXBvc2l0b3J5IGdlcHVzaHQuCis4KSBEZXIgamV0enQgZ2VtZXJndGUgU3RhbmQgd2lyZCBwZXIgcnN5bmMgaW5zIE11ZCBrb3BpZXJ0LgorOSkgRGFzIFRhZyBsYXN0LWF1dG8tbXVkLXN5bmMgd2lyZCBha3R1YWxpc2llcnQuCisKKworSUkuIEF1dG9tYXRpc2NoZXIgcmVnZWxtYWVzc2lnZXIgQ29tbWl0IHZvbSBNdWQKKworSmVkZW4gVGFnIHVtIDA1OjExIHdpcmQgdmlhIGNyb25qb2IgdW5kIGRhcyBTY3JpcHQgfi9zY3JpcHRzL2dpdC1hdXRvY29tbWl0CitmdWVyIGplZGVzIFJlcG8gaW4gfi9naXQtcmVwb3NpdG9yaWVzLyBkYXMgdW50ZXIgSS4gYmVzY2hyaWViZW5lIFNjcmlwdAorfi9zY3JpcHRzL2dpdC1zeW5jMmxpYiBhdXNnZWZ1ZWhydC4KKworCitJSUkuIEltcG9ydCB2b24gVmVyemVpY2huaXNzZW4gYXVzIGRlbSBNdWQKKworWnUgamVkZXIgdm9sbGVuIFN0dW5kZSB3aXJkIGluIGFsbGVuIFZlcnplaWNobmlzc2VuIHVudGVyIC9kLywgL3AvIHVuZAorL3BsYXllcnMvIGRpZSBEYXRlaSAnZ2l0LW11ZC1pbXBvcnQnIGdlc3VjaHQuIEFsbGUgVmVyemVpY2huaXNzZSwgaW4gZGVuZW4KK2RpZXNlIGV4aXN0aWVydCwgd2VyZGVuIGluIGdpdG9saXRlIGltcG9ydGllcnQgdW5kIGdsZWljaHplaXRpZyBhdWNoIGVpbiBDbG9uZQoraW4gfi9naXQtcmVwb3NpdG9yaWVzLyBlcnN0ZWxsdCwgZC5oLiBkYXNzIGRpZSBTeW5jaHJvbmlzYXRpb25zbWFzc25haG1lbgordW50ZXIgSS4gdW5kIElJLiBmdWVyIGRpZXNlcyBuZXVlIGdpdC1SZXBvc2l0b3J5IGFrdGl2IHNpbmQuCisKK0xFVFpURSBBZU5ERVJVTkc6CiswNS4wNC4yMDExLCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy93aXovZ2l0LXdvcmtmbG93IGIvZG9jL3dpei9naXQtd29ya2Zsb3cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU1Yzc2ZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93aXovZ2l0LXdvcmtmbG93CkBAIC0wLDAgKzEsMTUxIEBACitUeXBpc2NoZXIgQXJiZWl0c2FibGF1ZgorPT09PT09PT09PT09PT09PT09PT09PT0KKworKEVzIGdpYnQgYW5kZXJlIEFyYmVpdHN3ZWlzZW4sIGFiZXIgZGllcyBoaWVyIGlzdCBlaW5lLCBkaWUgc2ljaCBiZXdhZWhydAorIGhhdC4pCisKK05laG1lbiB3aXIgYW4sIGljaCBtb2VjaHRlIGV0d2FzIG5ldWVzIGVpbmJhdWVuLCBlaW5lbiBCdWcgZml4ZW4gZXRjLgorQWxsZSBkZXIgZm9sZ2VuZGVuIFNjaHJpdHQgd2VyZGVuIGF1ZiBldXJlbSBlaWdlbmVuIFJlY2huZXIgaW4gZXVyZW0gbG9rYWxlbgorQ2xvbmUgZGVzIGpld2VpbGlnZW4gUmVwb3NpdG9yaWVzIGR1cmNoZ2VmdWVocnQuCisKKyMgU2Nocml0dCAxOiBSZXBvc2l0b3J5IGNsb25lbiB1bmQvb2RlciB1cGRhdGVuCis+IGdpdCBjbG9uZSBnaXRAbWcubXVkLmRlOi9kaW5ncy9idW1zCis+IGdpdCBjaGVja291dCBtYXN0ZXIKKz4gZ2l0IHB1bGwKK1p1ZXJzdCBlaW5tYWwgd2lyZCBlaW4gY2hlY2tvdXQgZGVzIFp3ZWlnZXMgJ21hc3RlcicgZ2VtYWNodC4gVW5kIGluIGRpZXNlbgorWndlaWcgaG9sIGljaCBtaXIgZXJzdG1hbCBkZW4gYWt0dWVsbGVuIFN0YW5kIGF1cyBkZW0gTXVkIChwdWxsKS4KKworSmV0enQgbW9lY2h0ZSBpY2ggYWxsZSBBZW5kZXJ1bmdlbiBlcnN0bWFsIGluIGVpbmVtIHNlcGFyYXRlbiBad2VpZyBtYWNoZW4uCitXYXJ1bT8gV2VpbCBkYW5uIGRlciAnbWFzdGVyJyAoZGFzIGlzdCBkZXIgYWt0aXZlIFp3ZWlnIGltIE11ZCEpIGltbWVyIGluCitlaW5lbSBiZW51dHpiYXJlbiBadXN0YW5kIGlzdC4gRGVzd2VpdGVyZW4ga2FubiBtYW4gZWluZW4gWndlaWcgZWluZmFjaAord2Vnd2VyZmVuLCB3ZW5uIGlyZ2VuZHdhcyBncm9lc3NlcmVzIHNjaGllZmdlbGF1ZmVuIGlzdC4uLgorQXVzc2VyZGVtIGlzdCBlcyBkYW5uIGVpbmZhY2hlciwgendpc2NoZW56ZWl0bGljaGUgQWVuZGVydW5nZW4gYXVzIGRlbSBNdWQgenUKK2ludGVncmllcmVuLgorCisjIFNjaHJpdHQgMjogTmV1ZW4gWndlaWcgZXJzdGVsbGVuCis+IGdpdCBjaGVja291dCAtYiBuZXVlX2thbXBmdGFrdGlrCitIaWVybWl0IHdpcmQgIGVpbiBuZXVlciBad2VpZyBlcnN0ZWxsdCB1bmQgZ2xlaWNoemVpdGlnIGluIGlobiBnZXdlY2hzZWx0LgorCitIaWVyIG1hY2ggaWNoIGpldHp0IGFsbGUgbW9lZ2xpY2hlbiBBcmJlaXRlbiB1bmQgQmFzdGVsZWllbiwgZGllIGljaCBmdWVyIGRpZQorbmV1ZSBLYW1wZnRha3RpayBicmF1Y2hlLiBUaXBwcyBkYXp1OgorKiBWaWVsZSB1bmQgaGFldWZpZ2UgQ29tbWl0cyBtYWNoZW4hIEplIGtsZWluZXIgZWluemVsbmUgQ29tbWl0cyBzaW5kLCBkZXN0bworICBiZXNzZXIga2FubiBtYW4gQWVuZGVydW5nZW4gc3BhZXRlciB2ZXJmb2xnZW4gKHdhcyB6LkIuIHN1cGVyIGlzdCwgd2VubgorICBqZW1hbmQgd2FzIGFibmVobWVuIG11c3MhKSB1bmQgZGVzdG8gYmVzc2VyIGthbm4gbWFuIGVpbnplbG5lIEFlbmRlcnVuZ2VuCisgIHNwYWV0ZXIgYmVpIEJlZGFyZiBhdWNoIHJ1ZWNrZ2FlbmdpZyBtYWNoZW4sIHdlbm4gbWFuIG1lcmt0LCBkYXNzIG1hbgorICBzdGVsbGVud2Vpc2UgVW5zaW5uIGdlYmF1dCBoYXQuIDstKQorKiBUaGVtYXRpc2NoIHVudGVyc2NoaWVkbGljaGUgRGluZ2UgaW4gdmVyc2NoaWVkZW5lIENvbW1pdHMgcGFja2VuLiBBbHNvIHpCCisgIGVyc3QgU3ludGF4ZmVobGVyIGVkaXRpZXJlbiB1bmQgY29tbWl0ZW4sIGRhbm4gZWluZSBuZXVlIE1ldGhvZGUgZnVlcgorICBldHdhcyBnYW56IGFuZGVyZSBzY2hyZWliZW4gdW5kIGNvbW1pdGVuLgorCisjIFNjaHJpdHQgMy4xOiBBZW5kZXJ1bmdlbiBwcnVlZmVuCis+IGdpdCBzdGF0dXMKK0hpZXJtaXQgbGFzc2UgaWNoIG1pciBhbnplaWdlbiwgd2VsY2hlIERhdGVpZW4gbmljaHQtY29tbWl0dGV0ZSBBZW5kZXJ1bmdlbgorZW50aGFsdGVuIChvZGVyIG5ldSBzaW5kL2dlbG9lc2NodCB3dXJkZW4pLgorCis+IGdpdCBkaWZmCitEaWVzIHplaWd0IG1pciBhbGxlIG5pY2h0LWNvbW1pdHRldGVuIEFlbmRlcnVuZ2VuIGFuIC0gemVpbGVud2Vpc2UgdmVyZ2xpY2hlbgorbWl0IGRlbSB2b3JoZXJpZ2VuIFp1c3RhbmQuCisKKyMgU2Nocml0dCAzLjI6IEFlbmRlcnVuZ2VuIGluIGxva2FsZXMgUmVwb3NpdG9yeSBjb21taXRlbgorPiBnaXQgYWRkIDxmaWxlPiAgICAgICAgICAgICAgICAgICAgLy8gZWluemVsbmUgRmlsZXMgYXVzd2FlaGxlbgorT0RFUgorPiBnaXQgYWRkIC1BIC4vICAgICAgICAgICAgICAgICAgICAgLy8gYWxsZSBGaWxlcyBhdXN3YWVobGVuCitIaWVybWl0IG1lcmtlIGFsbGUgZ2VtYWNodGVuIEFlbmRlcnVuZ2VuIGZ1ZXIgZGVuIG5hZWNoc3RlbiBDb21taXQgdm9yLgorSWNoIGtvZW5udGUgaGllciBhYmVyIGF1Y2ggZWluemVsbmUgRGF0ZWllbiBhdXN3YWVobGVuIG9kZXIgc29nYXIgbnVyCitiZXN0aW1tdGUgVGVpbGUgZGVyIEFlbmRlcnVuZ2VuIGluIGVpbmVyIERhdGVpLiAoSGllcnp1IGJpdHRlIGRpZQorR2l0LURva3UgYmVtdWVoZW4uKQorCis+IGdpdCBjb21taXQKK0hpZXJtaXQgZXJzdGVsbGUgaWNoIGVpbmVuIENvbW1pdCwgZGVyIGRpZSBiaXNoZXJpZ2VuIEFlbmRlcnVuZ2VuIHVtZmFzc3QuCitEYWJlaSB3aXJkIGVpbiBFZGl0b3IgZ2VvZWZmbmV0LCBpbiBkZW4gaWNoIGVpbmUgaW5mb3JtYXRpdmUgTmFjaHJpY2h0IHVlYmVyCittZWluZSBBZW5kZXJ1bmdlbiBoaW50ZXJsYXNzZW4ga2Fubi4gRGFzIGlzdCBiZXNvbmRlcnMgd2ljaHRpZywgd2VubiBpY2ggaW4KK2ZyZW1kZW4gR2ViaWV0ZW4gYXJiZWl0ZSwgYWJlciBhdWNoIGZ1ZXIgbWljaCB1bmQgZWluZW4gZXR3YWlnZW4gYWJuZWhtZW5kZW4KK01hZ2llciBzZWhyIHNpbm52b2xsLgorQW5yZWd1bmc6IERpZSBlcnN0ZSBaZWlsZSBpc3QgZGFzIHNvZy4gQmV0cmVmZiBkZXMgQ29tbWl0cyAtIHZlcmdsZWljaGJhciBtaXQKK2RlbSBCZXRyZWZmIGVpbmVyIGVNYWlsLiBBbnNjaGxpZXNzZW5kIHNvbGx0ZSBlaW5lIGxlZXJlIFplaWxlIGZvbGdlbiB1bmQKK2RhbmFjaCBlaW5lIGxhZW5nZXJlIEJlc2NocmVpYnVuZyBlaW5nZWJlbiB3ZXJkZW4sIHNvZmVybiBub2V0aWcvc2lubnZvbGwuCisKK1dlbm4gaWNoIGFuIGRpZXNlbSBQdW5rdCBtaXQgZGVtIEJ1Z2ZpeCBvZGVyIEZlYXR1cmUgbm9jaCBuaWNodCBmZXJ0aWcgYmluOgorZWluZmFjaCBkaWUgbGV0enRlbiA0IEJlZmVobGUgYXVzIFNjaHJpdHQgMyBiZWxpZWJpZyBvZnQgd2llZGVyaG9sZW4sIGQuaC4KK2JlbGllYmlnIHZpZWxlIHdlaXRlcmUgQ29tbWl0cyBtYWNoZW4uCisKKyMgU2Nocml0dCA0OiBBZW5kZXJ1bmdlbiBpbiBsb2thbGVuIE1hc3Rlci1ad2VpZyBtZXJnZW4KK0JpbiBpY2ggZGFubiBzY2hsaWVzc2xpY2ggYWJlciBtYWwgZmVydGlnLCBnZWhlIGljaCBlcnN0bWFsIHp1cnVlY2sgenVtCittYXN0ZXItWndlaWc6CisKKz4gZ2l0IGNoZWNrb3V0IG1hc3RlcgorSHVjaCEgUGxvZXR6bGljaCBzaW5kIGFsbGUgRGF0ZWllbiBhdWYgZGVtIGFsdGVuIFN0YW5kISBLZWluZSBTb3JnZSwKK3Vuc2VyZSBBZW5kZXJ1bmdlbiBzaW5kIGltIFp3ZWlnICduZXVlX2thbXBmdGFrdGlrJyBzaWNoZXIgdmVyd2FocnQuCisKK0FjaHR1bmc6IHdlbm4gaWhyIG1pdCBhbmRlcmVuIHp1c2FtbWVuIGFyYmVpdGV0LCBrb2VubnRlIGplbWFuZAorYW5kZXJlcyBpbSBNVUQgQWVuZGVydW5nZW4gdm9yZ2Vub21tZW4gaGFiZW4uIEVpbiBlaW5mYWNoZXMKKz4gZ2l0IHB1bGwKK3VtIGRpZSBEYXRlaWVuIGltICdtYXN0ZXInLVp3ZWlnIGF1ZiBkZW4gbmV1ZXN0ZW4gU3RhbmQgenUgYnJpbmdlbiwKK3plaWd0IGV1Y2ggYXVjaCBBZW5kZXJ1bmdlbi4gV2VubiBkYSBqZXR6dAorICAnQWxyZWFkeSB1cC10by1kYXRlLicKK3N0ZWh0LCBpc3QgYWxsZXMgaW4gQnV0dGVyLCBhbnNvbnN0ZW4gc2llaGUgdW50ZW4gYmVpIDQuMS5leHRyYS4KKworPiBnaXQgbWVyZ2UgbmV1ZV9rYW1wZnRha3RpaworTWl0IGRpZXNlbSBLb21tYW5kbyBob2xlIGljaCBudW4gYWxsZSBBZW5kZXJ1bmdlbiBhdXMgbWVpbmVtIFp3ZWlnCisnbmV1ZV9rYW1wZnRha3RpaycgaW4gZGVuIFp3ZWlnICdtYXN0ZXInIChtZXJnZSkuCisKKyMgU2Nocml0dCA1OiBBZW5kZXJ1bmdlbiBpbiBkYXMgTVVELVJlcG9zaXRvcnkgdWViZXJ0cmFnZW4KK0pldHp0IGJpbiBpY2ggYmVyZWl0LCBkaWUgQWVuZGVydW5nZW4gaW5zIE11ZCB6dSB1ZWJlcnRyYWdlbjoKKz4gZ2l0IHB1c2ggCitKb2IgZG9uZSEKK0hpZXIga29tbWVuIGpldHp0IGRpdi4gQXVzZ2FiZW4gdm9tIE11ZCwgZGllIGV0d2FzIHVlYmVyIGRlbiBFcmZvbGcgdW5kCitNaXNzZXJmb2xnIGRlcyBQdXNoZXMgc2FnZW4uIDstKQorV2VubiBhbSBFbmRlIHN0ZWh0CisgICdZb3VyIGNoYW5nZXMgd2VyZSBjb3BpZWQgdG8gdGhlIG11ZGxpYi4nCitpc3QgYWxsZXMgZXJmb2xncmVpY2guCisKK1N0ZWh0IGFtIEVuZGUgZWluCisgICdZb3VyIGNoYW5nZXMgd2VyZSBtZXJnZWQgc3VjY2Vzc2Z1bGwgd2l0aCBjaGFuZ2VzIGluIHRoZSBtdWRsaWIgYW5kIHRoZQorICAgbWVyZ2VkIHN0YXRlIHdhcyBjb3BpZWQgdG8gdGhlIG11ZGxpYi4gRG8gbm90IGZvcmdldCB0byBwdWxsIHRoZSBtZXJnZQorICAgY29tbWl0ISIgCitpc3QgYW4gc2ljaCBhdWNoIGFsbGVzIGd1dC4gQWJlciBkYW5uIGdhYiBlcyBpbSBNdWQgZWJlbiBkb2NoIG5vY2gKK0FlbmRlcnVuZ2VuLCBkaWUgZXMgbmljaHQgaW0gR2l0LVJlcG8gZ2FiLCBkaWUgZ2VtZXJnZWQgd3VyZGVuLiBJbiBkaWVzZW0KK0ZhbGwgc29sbHRlIG1hbiBkZW4gYWt0dWVsbGVuIFp1c3RhbmQgc2ljaCBub2NobWFsIGhvbGVuOgorPiBnaXQgcHVsbAorVW5kIGRhbm4gYW5zY2hhdWVuLCBkaWVzZXIgTWVyZ2UgYXVjaCBkYXMgcmljaHRpZ2UgZ2VtYWNodCBoYXQ6Cis+IGdpdCBsb2cgLXAKK0hpZXJtaXQga3JpZWdlIGljaCBlaW5lIHNjaG9lbmUgTGlzdGUgYWxsZXIgQ29tbWl0cyBhbmdlemVpZ3QgdW5kIC1wIHNvcmd0CitkYWZ1ZXIsIGRhc3MgZGFiZWkgYWxsZSBBZW5kZXJ1bmdlbiBhbmdlemVpZ3Qgd2VyZGVuLCBuaWNodCBudXIgZGllCitDb21taXQtTmFjaHJpY2h0LgorCisjIFNvbmRlcmZhZWxsZSB1bmQgZXJ3ZWl0ZXJ0ZSBNb2VnbGljaGtlaXRlbgorIyBTY2hyaXR0IDQuMS5leHRyYTogWndpc2NoZW56ZWl0bGljaGUgQWVuZGVydW5nZW4gaW0gTVVEIGJlcnVlY2tzaWNodGlnZW4KKworRXMga29lbm50ZSBzZWluLCBkYXNzIG1hbiBmdWVyIGRlbiBCcmFuY2ggbmUgZ2FuemUgV2VpbGUgZ2VicmF1Y2h0IGhhdCAtCit1bmQgZGFzcyB3YWVocmVuZCBtZWluZXIgQXJiZWl0IGplbWFuZCBhbmRlcnMgQWVuZGVydW5nZW4gKGltIE11ZCBvZGVyCitSZXBvKSBnZW1hY2h0IGhhdC4KKworRGllc2UgQWVuZGVydW5nZW4gc29sbHRlIG1hbiBzaWNoIHdpZSBnZXNjaHJpZWJlbiBhbHMgZXJzdGVzIG5hY2ggZGVtCitVbXNjaGFsdGVuIHp1bSBtYXN0ZXItWndlaWcgaG9sZW46Cis+IGdpdCBwdWxsCisKK0pldHp0IGdlaCBpY2ggd2llZGVyIGluIG1laW5lbiBad2VpZyAob2huZSAtYikKKz4gZ2l0IGNoZWNrb3V0IG5ldWVfa2FtcGZ0YWt0aWsKK3VuZCBtYWNoZSBlaW4gc29nLiBSZWJhc2UuIERhbWl0IHZlcnNjaGllYmUgaWNoIHNvenVzYWdlbiwgZGVuIFB1bmt0LAorYW4gZGVtIG1laW4gWndlaWcgdm9tICdtYXN0ZXInIGFiendlaWd0IHVuZCB0dWUgc28sIGFscyBvYiBkaWUgZWJlbgorZ2Vob2x0ZW4gQWVuZGVydW5nZW4gc2Nob24gZGEgZ2V3ZXNlbiB3YWVyZW4sIGFscyBpY2ggZGVuIFp3ZWlnIGVyc3RlbGx0ZS4KKyhBbmRlcmUgU2ljaHR3ZWlzZTogaWNoIG5laG1lIG1laW5lIFp3ZWlnIHVuZCBzZXR6IGlobiBhdWYgZGVuIGFrdHVlbGxlbgorICdtYXN0ZXInIGRyYW4uKQorPiBnaXQgcmViYXNlIG1hc3RlcgorCitEZXIgVm9ydGVpbCBpc3Q6IHdlbm4gamV0enQgd2FzIGthcHV0dCBnZWdhbmdlbiBpc3QsIGVzIGFsc28gS29uZmxpa3RlIGdpYnQsCitkYW5uIGdpYnQgZXMgZGllIG51ciBpbiBtZWluZW0gWndlaWcgJ25ldWVfa2FtcGZ0YWt0aWsnIHVuZCBkb3J0IGthbm4gaWNoCitzaWUgaW4gYWxsZXIgUnVoZSByZXBhcmllcmVuLiBTb3dvaGwgZGVyICdtYXN0ZXInIGltIE1VRCBhbHMgYXVjaCBtZWluCitsb2thbGVyICdtYXN0ZXInIHNpbmQgaW50YWt0LgorCitVbmQgamV0enQgZ2VodCBlcyB3aWUgb2JlbiB3ZWl0ZXIuCisKK1NJRUhFIEFVQ0gKKyAgZ2l0LXJlcG9zaXRvcmllczogUmVwb3NpdG9yeS1WZXJ3YWx0dW5nIGltIE11ZAorICBnaXQtaG93dG86IFdpZSBnaXQgYmVudXR6dCB3aXJkCisgIGdpdC1rb29wZXJhdGlvbjogRWluIHVlYmVyIGdpdC13b3JrZmxvdyBoaW5hdXNnZWhlbmRlcyBCZWlzcGllbCB6dXIKKyAgICAgICAgICAgICAgICAgICBTeW5jaHJvbmlzYXRpb24gYnp3IEtvb3BlcmF0aW9uIG1laHJlcmVyIE1hZ2llci9SZWNobmVyCisgIGdpdC1zeW5jOiBXaWUgZGllIFN5bmNocm9uaXNpZXJ1bmcgencuIGdpdC1SZXBvcyB1bmQgTXVkbGliIGFibGFldWZ0CisgIGdpdC1mYXE6IGhhZXVmaWcgZ2VzdGVsbHRlIEZyYWdlbi9Qcm9ibGVtZQorCiswMi4gRmViIDIwMTMgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy93aXovaGF1c2JhdSBiL2RvYy93aXovaGF1c2JhdQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzljMmE1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dpei9oYXVzYmF1CkBAIC0wLDAgKzEsNDAgQEAKK0hpbGZlc2VpdGUgZnVlciBNYWdpZXI6IEhhdXNiYXUgaW0gTW9yZ2VuR3JhdWVuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBbHMgTWFnaWVyIHdpcmQgbWFuIGRlc29lZnRlcmVuIHZvbiBTcGllbGVybiBnZWJldGVuLCBJaG5lbiBiZWltCitIYXVzYmF1IGJlaGlsZmxpY2ggenUgc2Vpbi4gRGllc2UgQml0dGUgZXJmb2xndCBtZWlzdGVucyBhbHMKKworMSkgJ0thbm5zdCBEdSBoaWVyIGluIGRlbSBSYXVtIHdvIGljaCBiaW4sIGVzIG1hbCBzbyBlaW5yaWNodGVuLAorICAgIGRhc3MgaWNoIG1laW4gSGF1cyBhYnN0ZWxsZW4gdW5kIGdpZXNzZW4ga2FubicKKwordW5kIAorCisyKSAnSWNoIG1vZWNodCBoaWVyIGdlcm5lIG1laW4gSGF1cyBhYnN0ZWxsZW4sIGFiZXIgZXMgc29sbCB1bi0KKyAgICBzaWNodGJhciBzZWluLCBlaW5lIGFuZGVyZSBLdXJ6YmVzY2hyZWlidW5nIGhhYmVuIHVuZCBtYW4gCisgICAgc29sbCBlcyBuaWNodCBtaXQgPGJldHJldGU+IGJldHJldGVuIGtvZW5uZW4sIG9kZXIgLi4uLiAnLgorCisKK0Z1ZXIgMSkgaXN0IGVzIHJlbGF0aXYgZWluZmFjaC4gTWFuIGJlZ2ViZSBzaWNoIGFscyBNYWdpZXIgaW4gZGVuIAorUmF1bSwgenVlY2tlIHNlaW4gTUctVG9vbCB1bmQgdGlwcGUgZWluIAorCisgICAgICAgICAgICAgICd4Y2FsbCAkaC0+U2V0UHJvcChQX0hBVVNfRVJMQVVCVCwxKScuCisKK0Rhbm4gZm9yZGVyZSBtYW4gZGVuIFNwaWVsZXIgYXVmLCBzZWluIEhhdXMgYWJ6dXN0ZWxsZW4gdW5kIGdpZXMtCitzZW4gdW5kIHNldHplIGRpZXNlIFByb3BlcnR5IHdpZWRlciBhdWYgMC4KKworQUNIVFVORzogRGFzIEFic3RlbGxlbiBlaW5lcyBIYXVzZXMgbXVzcyB1bmJlZGluZ3Qgdm9yaGVyIG1pdCBkZW0gCistLS0tLS0tICBNYWdpZXIgYWJnZXNwcm9jaGVuIHdlcmRlbiwgZGVtIGRpZXNlciBSYXVtIGdlaG9lcnQhIEJlaSAKKyAgICAgICAgIGluYWt0aXZlbiBNYWdpZXIgaXN0IGRpZXMgZGVyIHp1c3RhZW5kaWdlIFJlZ2lvbnNtYWdpZXIuCisKK0JlaSAyKSB2ZXJmYWVocnQgbWFuLCB3aWUgZnVlciBkZW4gRmFsbCAxKSBnZXNjaGlsZGVydC4gSmVkb2NoIHNpbmQgCitkYXp1IG5vY2ggYW5kZXJlIERpbmdlIG5vdHdlbmRpZy4gRGEgZGllc2UgZGVuIFJhaG1lbiBlaW5lciBIaWxmZS0KK3NlaXRlIHNwcmVuZ2VuLCBsaWVndCB1bnRlciAKKworICAgICAgICAgICAgICAgICAgICAgICAvZG9jL2JlaXNwaWVsZS9taXNjL3NlaGVyaGF1cy5jCisKK2VpbiBGaWxlLCBpbiBkZW0gYWxsZXMgYXVzZnVlaHJsaWNoIGRva3VtZW50aWVydCBpc3QuCisKK1NJRUhFIEFVQ0g6IFBfSEFVU19FUkxBVUJUCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTEVUWlRFIEFlTkRFUlVORzogU2FtLCAxOS4wNS4yMDAxLCAyMzowMDowMCB2b24gVGlsbHkKZGlmZiAtLWdpdCBhL2RvYy93aXovaGVpbHVuZyBiL2RvYy93aXovaGVpbHVuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDFiNmM4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dpei9oZWlsdW5nCkBAIC0wLDAgKzEsMTU2IEBACitIZWlsdW5nIHZvbiBTcGllbGVybiBkdXJjaCBPYmpla3RlLCBSYWV1bWUsIHBvcnRhYmxlIEhlaWx1bmcKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJlbGxlczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqCisKK05lYmVuIGRlbiBiZWthbm50ZW4gSGVpbHN0ZWxsZW4gZnVlciBTcGllbGVyIChkZW4gS25laXBlbiBzb3dpZSBnaWxkZW5pbnRlcm5lCitGYWVoaWdrZWl0ZW4pIGdpYnQgZXMgbm9jaCBkaWUgTW9lZ2xpY2hrZWl0LCBkZW4gU3BpZWxlcm4gSGVpbHVuZyBkdXJjaCBWZXItCit3ZW5kdW5nIGRlciBMRlVOcyAiaGVhbF9zZWxmIiwgInJlc3RvcmVfaGl0X3BvaW50cyIsICJyZXN0b3JlX3NwZWxsX3BvaW50cyIsCisiYnVmZmVyX2hwIiB1bmQgImJ1ZmZlcl9zcCIgSGVpbHVuZyB6dWtvbW1lbiB6dSBsYXNzZW4uCisKK0RpZXMgd2lyZCBtZWlzdCB1ZWJlciBSYWV1bWUgZ2VtYWNodCwgaW4gZGVuZW4gZGVyIFNwaWVsZXIgZWluIGJlc3RpbW10ZXMKK0tvbW1hbmRvIGF1c2Z1ZWhyZW4gbXVzcyBvZGVyIHVlYmVyIE9iamVrdGUsIGRpZSBkZXIgU3BpZWxlciBtaXQgc2ljaCB0cmFnZW4KK2thbm4gKCd0cmFnYmFyZSBUYW5rZW4nKSwgdW0gSGVpbHVuZyB6dSBlcmZhaHJlbi4KKworRVMgV0lSRCBFTVBGT0hMRU4sIGplZGUgbW9iaWxlIEhlaWx1bmcgdWViZXIgIi9zdGQvZm9vZCIgenUgaW1wbGVtZW50aWVyZW4uCitEb3J0IG11ZXNzZW4gbGVkaWdsaWNoIGVpbiBwYWFyIFByb3BlcnRpZXMgZ2VzZXR6dCB3ZXJkZW4sIHVtIHNpY2hlcnp1Z2VoZW4sCitkYXNzIGRpZXNlIEhlaWx1bmdzcmVnZWxuIGVpbmdlaGFsdGVuIHdlcmRlbi4KK0dsZWljaHplaXRpZyB3aXJkIGF1Y2ggc2ljaGVyZ2VzdGVsbHQsIGRhc3Mgei5CLiBQcm9wcyB2b24gQ29udGFpbmVybiwgZGllCitIZWlsdW5nIGVudGhhbHRlbiwgbmFjaCBMZWVydW5nIGtvcnJla3QgZ2VzZXR6dCB3ZXJkZW4uCisKK05lYmVuIGRpZXNlbiBNb2VnbGljaGtlaXRlbiBnaWJ0IGVzIGF1Y2ggbm9jaCBFbnR0YW5rdW5nZW4sIGFsc28gZGllCitNb2VnbGljaGtlaXQsIGltIFNwaWVsZXIgZWluZSBkZXIgUHJvcGVydGllcyBQX0RSSU5LLCBQX0ZPT0Qgb2RlciBQX0FMQ09IT0wKK3VlYmVyIGRpZSBMRlVOcyAiZGVmdWVsX2Zvb2QvZHJpbmsiIG9kZXIgInJlZHVjZV9mb29kL2RyaW5rL2FsY29ob2wiIHp1CittaW5kZXJuLiBEaWVzIGlzdCBlaW5lIEZvcm0gZGVyIEhlaWx1bmcsIGRhIGRlciBTcGllbGVyIGRhbmFjaCB3aWVkZXIKK3JlZ3VsYWVyIGVzc2VuIHVuZCB0cmlua2VuIGthbm4uIFNpZSBtdXNzIGFsbGVyZGluZ3Mgb3J0c2dlYnVuZGVuIHNlaW4uCisKK0dydW5kc2FldHpsaWNoIGthbm4gZWluZSBIZWlsc3RlbGxlIG5hdHVlcmxpY2ggYXVjaCBTY2hhZGVuIGluIGVpbmVtIFNwaWVsZXIKK3ZlcnVyc2FjaGVuLiBEYXMgbWFjaHQgZGFubiBTaW5uLCB3ZW5uIGVyIHouQi4gZGVyIC0gZnVlciBkaWVzZSBIZWlsc3RlbGxlIC0KKydmYWxzY2hlbicgR2lsZGUgb2RlciBSYXNzZSBhbmdlaG9lcnQuIERhYmVpIE1VU1MgZnVlciBkZW4gU3BpZWxlciBhYmVyCit2b3JoZXIgZGV1dGxpY2ggZXJrZW5uYmFyIGdld2VzZW4gc2VpbiwgZGFzcyBkaWVzZSAnSGVpbHN0ZWxsZScgZnVlciBpaG4KK25pY2h0IGdlZWlnbmV0IGlzdC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BlemlmaXNjaGVzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqCisKK0JlaSBqZWRlciBGb3JtIHZvbiBIZWlsdW5nIE1VU1MgImVhdF9mb29kIiAoYmVpIEVzc2VuKSBvZGVyICJkcmlua19zb2Z0IiAoYmVpCitUcmlua2VuKSB1bmQgZ2dmLiAiZHJpbmtfYWxjb2hvbCIgdmVyd2VuZGV0IHdlcmRlbiEgRGllc2UgRnVua3Rpb25lbiBzb3JnZW4KK2Z1ZXIgZWluZW4gdW5rb21wbGl6aWVydGVuIEFibGF1ZiBkZXIgSGVpbHVuZywgZGEgc2llIHBydWVmZW4sIG9iIGRlciBTcGllbGVyCitub2NoIGdlbnVlZ2VuZCBUYW5ra2FwYXppdGFldGVuIGhhdCB1bmQgd2VubiBqYSwgZGllIGVudHNwcmVjaGVuZGVuIFByb3BlcnRpZXMKKyhQX0RSSU5LLCBQX0ZPT0Qgb2RlciBQX0FMQ09IT0wpIGF1dG9tYXRpc2NoIHJhdWZzZXR6ZW4uCisKKyJkcmlua19hbGNvaG9sIiBpc3QgaW4gZGllc2VtIFp1c2FtbWVuaGFuZyBiZXNvbmRlcnMgd2ljaHRpZywgZGEgZXMgYXVmIGVpbmVuCitldnRsLiB2b3JoYW5kZW5lbiBTYXVmc2tpbGwgcHJ1ZWZ0IQorCitEaWUgSGVpbHVuZyBzZWxiZXIgbXVzcyBkYW5uIGFiZXIgbm9jaCB1ZWJlciAiaGVhbF9zZWxmIiwgInJlc3RvcmVfaGl0X3BvaW50cyIsCisicmVzdG9yZV9zcGVsbF9wb2ludHMiLCAiYnVmZmVyX2hwIiBvZGVyICJidWZmZXJfc3AiIGdlc2NoZWhlbiEKKworT3J0c2dlYnVuZGVuZSBIZWlsdW5nOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitLbmVpcGVuOiBIaWVyIGlzdCBrbGFyLCBkYXNzLCBqZSBob2VoZXIgZGllIEhlaWx1bmcgaXN0LCB1bXNvIHRldXJlciBkaWUKKyAgICAgICAgIEhlaWx1bmcgc2VpbiBtdXNzLiBBdXNzZXJkZW0gTVVTUyAiYnVmZmVyX2hwIiB2ZXJ3ZW5kZXQgd2VyZGVuLgorICAgICAgICAgQXVzbmFobWUgaGllcnZvbiBpc3QgZGllIEtuZWlwZSBiZWkgZGVuIEVpc3Ryb2xsZW4gaW0gV2Fyb2suCisgICAgICAgICBNaXQgZGVtIFB1YnRvb2wgKCIvb2JqL3Rvb2xzL3B1YnRvb2wiKSBrYW5uIG1hbiBwcnVlZmVuLCBvYiBkaWUKKyAgICAgICAgIFdlcnRlIGRlciBLbmVpcGUgaW4gT3JkbnVuZyBnZWhlbi4KKworUmFldW1lOiAgRXMgZ2lidCB2aWVsZSBvcnRzZ2VidW5kZW5lIEhlaWx1bmdzc3RlbGxlbiBpbSBNRywgd2VsY2hlIGluIGVyc3RlcgorICAgICAgICAgTGluaWUgZGF6dSBkYSBzaW5kLCBkZW4gU3BpZWxlcm4gKmluIGRpZXNlbSBHZWJpZXQqIGVpbmUgVGFua21vZWctCisgICAgICAgICBsaWNoa2VpdCB6dXIgVmVyZnVlZ3VuZyB6dSBzdGVsbGVuICgtPiBEcmFrb25pZW4pLiBIaWVyZnVlciBzb2xsdGUKKyAgICAgICAgIG1hbiBkaWUgUHJvcGVydHkgUF9MQVNUX1hQIGJlbnV0emVuLCB3YXMgYWJlciBhbGxlcmRpbmdzIGtlaW5lCisgICAgICAgICBQZmxpY2h0IGlzdCwgd2VubiBtYW4gbW9lY2h0ZSwgZGFzcyBhdWNoICJnZWJpZXRzZnJlbWRlIiBTcGllbGVyCisgICAgICAgICBoaWVyIHRhbmtlbiBnZWhlbiBrb2VubmVuICgtPiBTU1ApLiBEYW5uIHdpZWRlcnVtIHNvbGx0ZSBtYW4gYWJlcgorICAgICAgICAgZGFyYXVmIGFjaHRlbiwgZGFzcyBzaWUgbmljaHQgenUgZ3V0IHNpbmQsIHUuVS4gc2Nod2VyIHp1IGVycmVpY2hlbgorICAgICAgICAgc2luZCAoLT4gVCdlbW9uZyksIEJsb2NrbW9uc3RlciBkZW4gV2VnIHZlcnNwZXJyZW4gKC0+IFNTUCkgZXRjLgorCisgICAgICAgICBJbiBqZWRlbSBGYWxsIGFiZXIgTVVTUyBlaW5lIEJlZ3Jlbnp1bmcgZGVyIFRhbmttb2VnbGljaGtlaXQgc2ljaGVyLQorICAgICAgICAgZ2VzdGVsbHQgd2VyZGVuOyBlbnR3ZWRlciBlcmZvbGd0IGRpZSBMaW1pdGllcnVuZyBkdXJjaCBSZXNldCBvZGVyCisgICAgICAgICBkdXJjaCBaZWl0YmVncmVuenVuZyAoLT4gY2hlY2tfYW5kX3VwZGF0ZV90aW1lZF9rZXkpLgorCisgICAgICAgICAiZWF0X2Zvb2QiIGJ6dy4gImRyaW5rX3NvZnQiIE1VU1MgYmVpIGRlbiBUYW5rZW4gZ2VzZXR6dCB3ZXJkZW4sIGRpZQorICAgICAgICAgZGVuIFNwaWVsZXIgZGFyYXVmIHNjaGxpZXNzZW4gbGFzc2VuLCBOYWhydW5nIGF1Zmdlbm9tbWVuIHp1IGhhYmVuCisgICAgICAgICAoLT4gImlzcyBiZWVyZW4iLCAidHJpbmtlIHNjaGxlaW0iLCBldGMuKS4KKyAgICAgICAgIEJlaSBhbGxlbiBhbmRlcmVuICgtPiAicmllY2hlIGJsdW1lIiwgZXRjLikgc29sbHRlbiBRdWFsaXRhZXQgdW5kCisgICAgICAgICBRdWFudGl0YWV0IGltIFJhaG1lbiBibGVpYmVuLgorICAgICAgICAgRGllc2Ugb3J0c2dlYnVuZGVuZW4gSGVpbHVuZ2VuIGR1ZXJmZW4gSW5zdGFudC1UYW5rZW4gc2Vpbi4KKworVHJhZ2JhcmUgSGVpbHVuZzoKKy0tLS0tLS0tLS0tLS0tLS0KK1RyYWdiYXJlIEhlaWx1bmcgc29sbHRlIG5hY2ggbWF4IDUgUmVzZXRzIHZlcmRlcmJlbiwgZGllIFdpcmt1bmcgdmVybWluZGVybgorb2RlciB2ZXJsb3JlbiBnZWhlbi4gU2llIHNvbGx0ZSBuaWNodCBiZWxpZWJpZyBpbSBTcGllbGVyIG9kZXIgYW5kZXJzd28KK2hvcnRiYXIgc2Vpbi4gRWluZSBiZWdyZW56dGUgQW56YWhsIHBybyBSZXNldCBrb21tdCBoaWVyYmVpIGF1Y2ggaW1tZXIgZ3V0CisoZ3V0ZSBCZWlzcGllbGUgaGllcmZ1ZXI6IERyb3BzIHZvbiBUd2luZ2ksIEhlaWxibGFldHRlciB2b24gWm9vaykuCisKK1JpY2h0d2VydGUgZnVlciBBdWZsb2VzdW5nIG9kZXIgV2lya3VuZ3NtaW5kZXJ1bmcgdm9uIHRyYWdiYXJlciBIZWlsdW5nOgorCisgICAgICAgICAgICAgICAgICAgICAgICBIZWlsdW5nICAgICAgICAgUmVzZXQtWmVpdAorICAgICAgICAgICAgICAgICAgICAgICAgICA+IDIwMCAgICA6ICAgICAzMC0gNjAgbWluCisgICAgICAgICAgICAgICAgICAgICAgMTUwIC0gMjAwICAgIDogICAgIDYwLTEyMCBtaW4KKyAgICAgICAgICAgICAgICAgICAgICAxMDAgLSAxNTAgICAgOiAgICAgOTAtMTgwIG1pbgorICAgICAgICAgICAgICAgICAgICAgICA1MCAtIDEwMCAgICA6ICAgIDEyMC0yNDAgbWluCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwgIDUwICAgIDogICAgMTUwLTMwMCBtaW4KKworRGllc2UgUmljaHR3ZXJ0ZSBzaW5kIGd1dGUgQW5oYWx0c3B1bmt0ZSwga29lbm5lbiBhYmVyIGJlaSBCZWRhcmYgbWl0IGRlbQorRXJ6bWFnaWVyIGRlciBIZWlsdW5ncy1CYWxhbmNlIGluZGl2aWR1ZWxsIGFiZ2VzdGltbXQgd2VyZGVuLgorCisnV2lya3VuZ3NtaW5kZXJ1bmcnIGlzdCBoaWVyYmVpIGltIFNpbm5lIHZvbiAqZGV1dGxpY2gqIGdlbWVpbnQuCisKKyoqKiBORVUgLSBORVUgLSBORVUgLSBORVUgLSBORVUgLSBORVUgLSBORVUgLSBORVUgLSBORVUgLSBORVUgLSBORVUgLSBORVUgICoqKgorCisgICBUcmFnYmFyZSBIZWlsdW5nZW4sIGRpZSBpbSB3ZWl0ZXN0ZW4gU2lubmUgYXVzIExlYmVuc21pdHRlbG4gYmVzdGVoZW4sCisgIGR1ZXJmZW4gbmljaHQgbWVociBpbnN0YW50IHNlaW4sIHNvbmRlcm4gTVVFU1NFTiAiYnVmZmVyX2hwL3NwIiB2ZXJ3ZW5kZW4hCisKKyoqKiBORVUgLSBORVUgLSBORVUgLSBORVUgLSBORVUgLSBORVUgLSBORVUgLSBORVUgLSBORVUgLSBORVUgLSBORVUgLSBORVUgICoqKgorCitCZWkgdHJhZ2JhcmVuIEhlaWx1bmdzbW9lZ2xpY2hrZWl0ZW4sIGRpZSB3ZWRlciBhdXMgRXNzYmFyZW0sIG5vY2ggYXVzIFRyaW5rLQorYmFyZW0gYmVzdGVodCAoYmVpIGRlbmVuIGVzIGFsc28gbmljaHQgbG9naXNjaCB3YWVyZSwgImJ1ZmZlcl9ocC9zcCIgenUKK2JlbnV0emVuKSwgTVVTUyAiY2hlY2tfYW5kX3VwZGF0ZV90aW1lZF9rZXkiIHZlcndlbmRldCB3ZXJkZW4sIGRhIHNpZSBzb25zdCB6dQora3JpdGlzY2ggd2VyZGVuLiBEYW5uIGRhcmYgZXMgbmF0dWVybGljaCBhdWNoIHNvd2FzIGdlYmVuLiBCZWlzcGllbHN3ZWlzZSBrYW5uCittYW4gc29sY2hlIE9iamVrdGUgZ3V0IGFscyAoTWluaS0pUXVlc3RiZWxvaG51bmcgaW50ZWdyaWVyZW4uCisKK0hpZXIgZ2lsdDogSmUgaG9laGVyIGRpZSBIZWlsdW5nLCB1bSBzbyBob2VoZXIgZGllIFplaXRkYXVlciwgbmFjaCBkZXIgZGVyCitTcGllbGVyIGRpZXNlIE1vZWdsaWNoa2VpdCB3aWVkZXIgaW4gQW5zcHJ1Y2ggbmVobWVuIGRhcmYuCisoUmljaHR3ZXJ0ZTogaGVhbF9zZWxmKDUwKTogfiAxODAwIHNlYy4sIGhlYWxfc2VsZigxNTApOiB+IDM2MDAgc2VjLikKKworQXVjaCBiZWkgZGllc2VuIE9iamVrdGVuIGlzdCBlcyBlaW4gTVVTUywgZGllIEhlaWx1bmdzbW9lZ2xpY2hrZWl0ZW4gZWlubWFsCitlcnNjaG9lcGZlbiB6dSBsYXNzZW4sIHNpZSBhbHNvIGVudHdlZGVyICd2ZXJkZXJiZW4nIG9kZXIgc2ljaCB2ZXJhYnNjaGllZGVuCisoLT4gRHNjaGlubikgenUgbGFzc2VuIG9kZXIgc2llICdzdGlsbGVnZW4nLCBkYSBzaWUgZGFubiBlaW5mYWNoIGVpbmUgemVpdGxhbmcKK1J1aGUgYnJhdWNoZW4sIHVtIHNpY2ggbmV1ICdhdWZ6dWxhZGVuJy4KKworUXVlc3RiZWxvaG51bmdlbjoKKy0tLS0tLS0tLS0tLS0tLS0KK0RpZXNlIE9iamVrdGUgc3RlbGxlbiBlaW5lIEF1c25haG1lIHVudGVyIGRlbiB0cmFnYmFyZW4gSGVpbHVuZ2VuIGRhci4gSGllcgora2FubiBhdWYgImJ1ZmZlcl9ocC9zcCIgdmVyemljaHRldCB3ZXJkZW47IGRhZnVlciBtdWVzc2VuIGFiZXIgYW5kZXJlIFJlZ2VsbgorYmVhY2h0ZXQgd2VyZGVuOiBkYXMgT2JqZWt0IGRhcmYgcHJvIFJlc2V0IG51ciBiZWdyZW56dCBoZWlsZW4gYnp3LiBuYWNoIGRlcgorQW53ZW5kdW5nIHNpY2ggc2VsYmVyIHplcnN0b2VyZW4gKC0+IGdlbGJlciBTdGVpbikuIE9kZXIgZXMgbXVzcyB2b3JoZXIgZWluZQorZXJoZWJsaWNoZSBNZW5nZSBMUC9LUCBpbnZlc3RpZXJ0IHdlcmRlbiwgdW0gZGFzIE9iamVrdCB6dSBudXR6ZW4KKygtPiBJbmZlcm5vYmxvY2spLgorCitFbnR0YW5rZW46CistLS0tLS0tLS0KK0RpZSBNb2VnbGljaGtlaXQgenVyIEVudHRhbmt1bmcgTVVTUyBhbiBlaW5lbiBmZXN0ZW4gT3J0IGdlYnVuZGVuIHNlaW4uIFNpZQorZGFyZiBhbHNvIG5pY2h0IGR1cmNoIHRyYWdiYXJlIE9iamVrdGUgaGVydm9yZ2VydWZlbiB3ZXJkZW4ga29lbm5lbi4gRWluCitCZWlzcGllbCBoaWVyZnVlciBzaW5kIGRpZSBUb2lsZXR0ZW4gdm9uIFd1cnplbCBpbiBXaWxoZWxtc2J1cmcgb2RlciBkaWUKK0ZsZWlzY2hyZXN0ZSBpbiBkZXIgU1NQLiBXZWl0ZXJlcyBoaWVyenUgc2llaGUgLT4gIm1hbiBlbnR0YW5rZW4iLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2dpc2NoZXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioKKworSmVkZSAoISkgTW9lZ2xpY2hrZWl0IHp1ciBIZWlsdW5nLCBhYmdlc2VoZW4gdm9uIHJlZ3VsYWVyZW4gS25laXBlbiwgbXVzcyBkZW0KK3p1c3RhZW5kaWdlbiBNYWdpZXIgZnVlciBIZWlsdW5ncy1CYWxhbmNlIGdlbWVsZGV0IHVuZCB2b24gZGllc2VtIGdlbmVobWlndAord2VyZGVuLiBXZXIgZGllc2VuIFBvc3RlbiBtb21lbnRhbiBpbm5laGF0LCBrYW5uIGRlbSBNYWlsQWxpYXMKKyJoZWlsdW5nc19iYWxhbmNlIiBlbnRub21tZW4gd2VyZGVuLgorCitTaWVoZSBhdWNoOgorLS0tLS0tLS0tLQorICAgICBUYW5rZW46ICAgIGNvbnN1bWUsIGRyaW5rX2FsY29ob2wsIGVhdF9mb29kLCBkcmlua19zb2Z0CisgICAgIEhlaWx1bmc6ICAgaGVhbF9zZWxmLCByZXN0b3JlX3NwZWxsX3BvaW50cywgcmVzdG9yZV9oaXRfcG9pbnRzLCAKKyAgICAgICAgICAgICAgICBidWZmZXJfaHAsIGJ1ZmZlcl9zcAorICAgICBUaW1pbmc6ICAgIGNoZWNrX2FuZF91cGRhdGVfdGltZWRfa2V5CisgICAgIEVudHRhbmtlbjogZGVmdWVsX2RyaW5rLCBkZWZ1ZWxfZm9vZAorICAgICBQcm9wczogICAgIFBfRFJJTkssIFBfRk9PRCwgUF9BTENPSE9MLCBQX1NQLCBQX0hQLAorICAgICAgICAgICAgICAgIFBfREVGVUVMX1RJTUVfRFJJTksKKyAgICAgS29uemVwdGU6ICBlbnR0YW5rZW4sIGZvb2QKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMTcuMDkuMjAxMCwgWmVzc3RyYQpkaWZmIC0tZ2l0IGEvZG9jL3dpei9rYW1wZm9iamVrdGUgYi9kb2Mvd2l6L2thbXBmb2JqZWt0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWQ2ZTI4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dpei9rYW1wZm9iamVrdGUKQEAgLTAsMCArMSw2MCBAQAorIFNPTlNUSUdFIEtBTVBGT0JKRUtURToKKworICAgIEhpZXJ6dSB6YWVobGVuIGFsbGUgU2FjaGVuLCBkaWUgaXJnZW5kZWluZW4gRWluZmx1c3MgYXVmIGRlbiBLYW1wZiBuZWhtZW4KKyAgICB1bmQgd2VkZXIgYC9zdGQvd2VhcG9uLmMnIG5vY2ggYC9zdGQvYXJtb3VyLmMnIHNpbmQuIEFsc28gZGllIHNvZ2VuYW5udGUKKyAgICBBcnRpbGxlcmllLCBFaXNzdGFiIHVuZCBhcnR2ZXJ3YW5kdGVzLCBXdXJmc3Rlcm5lLCBQYXJhc3RlaW5lLCBCdW1pcy4uLgorICAgIHNvd2llIHNhZW10bGljaGUgdHJhZ2JhcmVuIEhlaWxtb2VnbGljaGtlaXRlbiB1bmQgdW50ZXJzdHVldHplbmRlIE5QQy4KKworICAgIFByaW56aXBpZWxsIHNpbmQgYWxsZSBkaWVzZSBTYWNoZW4gZ2VuZWhtaWd1bmdzcGZsaWNodGlnLgorICAgIEF1dG8tU2VsYnN0ZmFocmVyLCBhbHNvIFNhY2hlbiwgZGllIG9obmUgRWluZ3JpZmYgZGVzIFNwaWVsZXJzIGFnaWVyZW4sCisgICAgc2luZCB1bmVyd3VlbnNjaHQgdW5kIHNvbGx0ZW4gdmVybWllZGVuIHdlcmRlbi4gU29ycnkgZnVlciBkaWUKKyAgICBMYWdnZXBsYWd0ZW4uLi4KKworICAgIEthbXBmb2JqZWt0ZSBzb2xsdGVuIFBfQVRUQUNLX0JVU1kgc2V0emVuIHVuZCBhdWNoIHZvciBkZXIgQW53ZW5kdW5nCisgICAgYWJmcmFnZW4sIGRhbWl0IHNpZSBuaWNodCB1bmJlZ3Jlbnp0IGhpbnRlcmVpbmFuZGVyIGdlbnV0enQgd2VyZGVuCisgICAga29lbm5lbi4gTWFnaXNjaGUgU2FjaGVuIHNvbGx0ZW4gZW50d2VkZXIgYXVmZ2VsYWRlbiB3ZXJkZW4gbXVlc3NlbiBvZGVyCisgICAgaWhyZSBtYWdpc2NoZSBFbmVyZ2llIHZlcmxpZXJlbiwgZGFtaXQgc2llIG5pY2h0IHVuZW5kbGljaCBoYWx0YmFyIHNpbmQuCisgICAgQXVzc2VyZGVtIGhhdCBNYWdpZSBub3JtYWxlcndlaXNlIGF1Y2ggdW5lcnd1ZW5zY2h0ZSBOZWJlbndpcmt1bmdlbi4gRGllCisgICAgU3BpZWxlciBzb2xsZW4gZGllIG1vZWdsaWNoZW4gVm9ydGVpbGUgZ2VnZW4gTmFjaHRlaWxlIG9kZXIgTmViZW53aXJrdW5nZW4KKyAgICBkZXMgR2VnZW5zdGFuZHMgYWJ3YWVnZW4uIEF1Y2ggYmVpIGRpZXNlbiBPYmpla3RlbiAqbXVzcyogUF9JTkZPIGdlc2V0enQKKyAgICB3ZXJkZW4sIHVtIGVpbmUgQmVncnVlbmR1bmcgZnVlciBkaWUgYmVzb25kZXJlIFdpcmt1bmcgdW5kIHouQi4gZWluZW4KKyAgICBIaW53ZWlzIGF1ZiBkaWUgQmVudXR6dW5nIHp1IGxpZWZlcm4uCisgICAgU2llIHNvbGx0ZW4ga2VpbmVzZmFsbHMga2FldWZsaWNoIGVyd29yYmVuIHdlcmRlbiBrb2VubmVuLgorCisgICAgVHJhZ2JhcmUgSGVpbHN0ZWxsZW4gc29sbHRlbiBhZXVzc2Vyc3Qgc3BhZXJsaWNoIHZlcndlbmRldCB3ZXJkZW4uIEhhbmRlbHQKKyAgICBlcyBzaWNoIHVtIGlyZ2VuZGVpbmUgRm9ybSB2b24gRnJlc3NhbGllbiAoQnJvdCwgUGZpcnNpY2gsCisgICAgU2NobmVsbGhhZXJ0ZXIuLi4pIHNvIG11c3MgUF9GT09EIG9kZXIgUF9EUklOSyB1bmQgZXZ0bC4gUF9BTENPSE9MIGdlc2V0enQKKyAgICB3ZXJkZW4uIEFuc29uc3RlbiBzb2xsdGVuIHNvbGNoZSBEaW5nZSB3ZW5pZ3N0ZW5zIGlyZ2VuZHdlbGNoZQorICAgIEF1c3dpcmt1bmdlbiBhdWYgZGVuIFNwaWVsZXIgaGFiZW4gYXVzc2VyIGRlciBIZWlsdW5nLiBFaW4gc29nZW5hbm50ZXMKKyAgICAiUmVzdHJpc2lrbyIgd2FlcmUgbmljaHQgdmVya2VocnQuLi4KKworICAgIFNpZSBzb2xsdGVuIG5pZW1hbHMgdW5iZWdyZW56dCBlcndvcmJlbiB3ZXJkZW4ga29lbm5lbiwgc2Nob24gZ2FyIG5pY2h0CisgICAga2FldWZsaWNoISBBdXNzZXJkZW0gaXN0IGVpbmUgZ2V3aXNzZSBWZXJmYWxsc3plaXQgc2VociBzaW5udm9sbCB1bmQKKyAgICBlcmhvZWh0IGRpZSBDaGFuY2VuIGF1ZiBHZW5laG1pZ3VuZy4gUmljaHR3ZXJ0ZTogZXJob2VodGVzIFJpc2lrbyBuYWNoIDEuCisgICAgUmVzZXQsIHVuYnJhdWNoYmFyIG5hY2ggMi0zIFJlc2V0cy4KKworICAgIE9iamVrdGUsIGRpZSBBdXNrdW5mdCB1ZWJlciBlaW4tIHVuZC9vZGVyIGF1c2dlaGVuZGUgU2NoYWVkZW4gZ2ViZW4sIAorICAgIHNpbmQgZ2VuZWhtaWd1bmdzcGZsaWNodGlnLiBTb2xjaGUgT2JqZWt0ZSBzb2xsdGVuIG5hY2ggTW9lZ2xpY2hrZWl0CisgICAgZWluZSBXYWZmZSBvZGVyIEtsZWlkdW5nc3N0dWVjayAtIGRpZXMgamVkb2NoIG5pY2h0IEFUX01JU0MgLSBzZWluLgorICAgIERhc3Mgc29sY2hlIE9iamVrdGUgYXVjaCB1ZWJlciBMdWVja2VuIGluIGRlciBBbmdhYmUgZGVyIFNjaGFlZGVuIHVuZAorICAgIE5hY2h0ZWlsZSB2ZXJmdWVnZW4gc29sbHRlbiwgaXN0IGVpZ2VudGxpY2gga2xhci4gCisgICAgU29sY2hlIE5hY2h0ZWlsZSBsaWVzc2VuIHNpY2ggdWViZXIgZWluZSBNaW5kZXN0LVNjaGFkZW5zaG9laGUgb2RlcgorICAgIHJhbmRvbSByZWFsaXNpZXJlbi4gSW5mb3JtYXRpb25lbiB1ZWJlciBtZWhyZXJlIFNjaGFkZW5zdHlwZW4gZHVyY2ggCisgICAgZWluIHVuZCBkYXMgc2VsYmUgT2JqZWt0IHNpbmQgbmljaHQgZXJ3dWVuc2NodC4KKworICAgIEViZW5mYWxscyBnZW5laG1pZ3VuZ3NwZmxpY2h0aWcgc2luZCBhbGxlIE9iamVrdGUsIGRpZSBpbiBpcmdlbmQgZWluZXIKKyAgICBXZWlzZSBFaW5mbHVzcyBhdWYgc3BlemlmaXNjaGUgR2lsZGVuZmFlaGlna2VpdGVuIG9kZXIgQmVzb25kZXJoZWl0ZW4KKyAgICBuZWhtZW4uIEhpZXJ6dSBzb2xsdGUgbmViZW4gZGVyIEJhbGFuY2UgYXVjaCBub2NoIGRlciBHaWxkZW5tYWdpZXIKKyAgICBiZWZyYWd0IHdlcmRlbi4gCisgICAgCisgICAgSGluc2ljaHRsaWNoIEtvbXBvbmVudGVuIGRlciBaYXViZXJlciBpc3QgZGVyIEdpbGRlbmNoZWYgZGVyCisgICAgQW5zcHJlY2hwYXJ0bmVyLgorICAgIAorIFNJRUhFIEFVQ0gKKworICAgICBiYWxhbmNlLCBydWVzdHVuZ2VuLCB3YWZmZW4sIGZlcm53YWZmZW4sIHVuaXF1ZXMsIG5wY3MsIG9iamVjdHMsCisgICAgIGF0dHJpYnV0c3ZlcmFlbmRlcnVuZ2VuLCByZXNpc3RlbnplbiwgZ3Jlbnp3ZXJ0ZSwgYXJ0aWxsZXJpZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIFNvLCAyNi4wMS4yMDAzLCAxODo1MDowMCB2b24gSHVtbmkKZGlmZiAtLWdpdCBhL2RvYy93aXova2F0emVua3JpZWdlci50ZXN0c3BpZWxlciBiL2RvYy93aXova2F0emVua3JpZWdlci50ZXN0c3BpZWxlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2MyYWM5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dpei9rYXR6ZW5rcmllZ2VyLnRlc3RzcGllbGVyCkBAIC0wLDAgKzEsMzcgQEAKK01hZ2llci1NYW5wYWdlCisKK0dpbGRlbnRlc3RpZSAiS2F0emVua3JpZWdlciIuCisKKworRXMgZ2lidCBpbiBkZXIgS2F0emVua3JpZWdlcmdpbGRlIGVpbmUgRnVua3Rpb24sIG1pdCBkZXIgbWFuIGVpbmVuCitUZXN0c3BpZWxlciBlcnNjaGFmZmVuIGthbm4sIHdlbGNoZXIgZGVyIEthdHplbmtyaWVnZXJnaWxkZSBhbmdlaG9lcnQuCitEaWUgRnVua3Rpb24gaGVpc3N0ICJtYWtlX3Rlc3RwbGF5ZXIiIHVuZCBlcndhcnRldCBhbHMgZWluemlnZW4gUGFyYW1ldGVyCitlaW4gU3BpZWxlci1PYmpla3QuCisKKworCitEaWUgRnVua3Rpb24gdmVyaGFlbHQgc2ljaCB3aWUgZm9sZ3QuCisKK0RlciBTcGllbGVyIG11c3MgZWluIFRlc3RzcGllbGVyIHNlaW4uCitEZXIgU3BpZWxlciBzb2xsdGUgaW4gZGllIEdpbGRlIGVpbnRyZXRlbiBrb2VubmVuLgorRGVyIFNwaWVsZXIgbGVybnQgYWxsZSBTcGVsbHMgdW5kIFNraWxscyBkZXIgR2lsZGUsIGRpZSBlciBhdWYgc2VpbmVtCitkZXJ6ZWl0aWdlbiBTcGllbGVybGV2ZWwgbGVybmVuIGthbm4uCitEaWUgU3BlbGxzIGhhYmVuIGplIGRlbiBob2VjaHN0bW9lZ2xpY2hlbiBTa2lsbHdlcnQsIGRlbiBkZXIgU3BpZWxlciBhdWYKK3NlaW5lbSBMZXZlbCBlcnJlaWNoZW4ga2FubiwgZXMgc2VpIGRlbm4sIGVyIGthbm50ZSBkZW4gU3BlbGwgenV2b3Igc2Nob24uCitEYW5uIGJsZWlidCBkZXIgU3BlbGwgdW52ZXJhZW5kZXJ0LgorCisKKworVW0gZWluZW4gVGVzdHNwaWVsZXIgenUgZXJzY2hhZmZlbiwgZ2VodCBtYW4gd2llIGZvbGd0IHZvci4KKworTWFuIG5laG1lIGVpbmVuIChlaWdlbmVuISkgVGVzdHNwaWVsZXIsIHouQi4gImJhbWJzIi4KK01hbiBzZXR6ZSBpaG0gZGFzIGdld3VlbnNjaHRlIFNwaWVsZXJsZXZlbCwgei5CLiAxMQorICB4Y2FsbCBiYW1icy0+U2V0UHJvcChQX0xFVkVMLCAxMSk7CitNYW4gZ2VoZSBpbiBkZW4gR2lsZGVucmF1bSBkZXIgS2F0emVua3JpZWdlci4KKyAgZ290byAvZ2lsZGVuL2thdHplbmtyaWVnZXIKK01hbiBydWZlIGRpZSBGdW5rdGlvbiBhdWYsIGRpZSBlaW5lbiBLYXR6ZW5rcmllZ2VyIGF1cyBkZW0gVGVzdHNwaWVsZXIgbWFjaHQuCisgIHhjYWxsICRoLT5tYWtlX3Rlc3RwbGF5ZXIoZmluZF9wbGF5ZXIoImJhbWJzIikpOworRGVyIFRlc3RzcGllbGVyIHNvbGx0ZSBudW4gS2F0emVua3JpZWdlciBzZWluLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0xldHp0ZSBBZW5kZXJ1bmc6IFR1ZSBKYW4gIDcgMjM6MDM6MTYgMjAwMyBkdXJjaCBCYW1iaQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy93aXova25ldGUgYi9kb2Mvd2l6L2tuZXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZDFmM2UKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd2l6L2tuZXRlCkBAIC0wLDAgKzEsODEgQEAKK05BTUU6CisJCSoqKiBLTkVURSAqKioKKworQkVTQ0hSRUlCVU5HOgorCURpZSBLbmV0ZSBpc3QgZWluIGluIExQQyBnZXNjaHJpZWJlbmVyIExpc3AtSW50ZXJwcmV0ZXIuIERpZXNlciBoYXQKKwlkaWUgYmVzb25kZXJlIEVpZ2Vuc2NoYWZ0LCBkaWUgTGlzcC1RdWVsbGVuIGRpcmVrdCBpbiBkZW4gdm9tIAorCUFteWxhYXIgR2FtZURyaXZlciBhbmdlYm90ZW5lbiBjbG9zdXJlcyB6dSB1ZWJlcnNldHplbi4gRGFkdXJjaCBpc3QKKwltaXQgZGVyIEtuZXRlIGFsbGVzIGRhcyBtb2VnbGljaCwgd2FzIGF1Y2ggbWl0IExQQyBtb2VnbGljaCBpc3QuCisJRXMgaXN0IGVpbiBnZW5lcmlzY2hlcywgZnJlaSBwcm9ncmFtbWllcmJhcmVzIEhpbGZzbWl0dGVsLgorCisJRGllIEtuZXRlIGJlZmluZGV0IHNpY2ggdW50ZXI6ICIvb2JqL3Rvb2xzL2xpc3AiCisKK0ZVTktUSU9OU0JFU0NIUkVJQlVORzoKKwlEaWUgS25ldGUga2FubiBpbSBQcmluemlwIGZhc3QgYWxsZXMsIHdhcyBlaW4gZWluZmFjaGVyIExpc3AtCisJSW50ZXJwcmV0ZXIga2Fubi4gQXVzbmFobWVuIHNpbmQgVHVwZWwgKEJzcDogKDEgLiAyKSksIHdlbGNoZSBuaWNodAorCWltcGxlbWVudGllcnQgc2luZC4gRGllIEdydW5kbGVnZW5kZW4gRnVua3Rpb25lbiwgd2llIGRlZmluZSwgc2V0cSwKKwljb25zLCBjZHIsIGNhciBldGMgd2VyZGVuIGJlaW0gTGFkZW4gZGVyIEtuZXRlIGFuZ2V6ZWlndC4gSmUgbmFjaAorCVplaXQsIHdlcmRlbiBldmVudHVlbGxlIGF1Y2ggd2VpdGVyZSBTdGFuZGFyZGZ1bmt0aW9uZW4gaGluenUtCisJa29tbWVuLCB1bSBkaWUgS25ldGUgbW9lZ2xpY2hzdCBjb21tb24tbGlzcCBrb21wYXRpYmVsIHp1IG1hY2hlbi4KKworQkVOVVRaVU5HOgorCVp1IGFsbGVyZXJzdCBzb2xsdGUgbWFuIHdpc3NlbiwgZGFzcyBkaWVzIGhpZXIga2VpbmUgRWluZnVlaHJ1bmcgaW4KKwlMaXNwIGlzdCBvZGVyIHNlaW4gc29sbCEgRGllIHdpY2h0aWdzdGVuIE1lcmttYWwgZGVyIEtuZXRlIHdlcmRlbgorCWF1ZmdlZnVlaHJ0IGFuIGVpbmlnZW4ga2xlaW5lbiBCZWlzcGllbGVuLiBXZXIgTGlzcCBrZW5uZW5sZXJuZW4KKwltb2VjaHRlIGthbm4gZGllcyBtaXQgZGVuIGhhbmRlbHN1ZWJsaWNoZW4gQnVlY2hlcm4gdHVuLgorCisJV2VyIGRlbm5vY2ggYmFzdGVsbiBtb2VjaHRlOiBMaXNwIGlzdCBlaW5lIFNwcmFjaGUgaW4gUHJlZml4bm90YXRpb24sCisJZC5oLiBkZXIgRnVua3Rpb25zbmFtZSBzdGVodCBpbW1lciBhbHMgZXJzdGVzIHVuZCBkYW5uIGtvbW1lbiBkaWUKKwlBcmd1bWVudGUuIEVpbiBBdXNkcnVjayBpc3QgbWl0IGRlbiBpaG4gdW1nZWJlbmRlbiBLbGFtbWVybiBrb21wbGV0dC4KKwkgIEJlaXNwaWVsOiAoKyAxIDEpIDs7OyBlcnJlY2huZXQgZGllIFN1bW1lIGF1cyAxIHVuZCAxCisJU29sY2hlIEtsYW1tZXJhdXNkcnVlY2tlIGtvZW5uZW4gYmVsaWViaWcgZ2VzY2hhY2h0ZWx0IHdlcmRlbi4KKwkgIEJlaXNwaWVsOiAoKyAxICgrICgrIDEgMSkgMSkpCisKKwlFcyBzdGVoZW4gYWxsZSBlZnVucywgc293aWUgZWluaWdlIGxmdW5zIHp1ciBWZXJmdWVndW5nISBadSBkZW4gZWZ1bnMKKwlnZWhvZXJlbiBhdWNoICssLSwqLC8sJSwhLFssWzwsWzwuLiBldGMsIGFsc28gYWxsZSBPcGVyYXRvcmVuIHZvbiBMUEMuCisKKwlEaWUgS25ldGUgaGF0IHp3ZWkgTW9kaToKKwkJYSkgTGFkZW4gdm9uIExpc3AgYXVzIGVpbmVyIERhdGVpCisJCWIpIFZlcmFyYmVpdGVuIHZvbiBFaW5nYWJlbiBhdXMgZGVyIEtvbW1hbmRvemVpbGUKKworCVp1IGEpCisJICBNaXQgZGVyIEZ1bmt0aW9uICJsb2FkIiBrb2VubmVuIERhdGVpZW4gZWluZ2VsZXNlbiB1bmQgaW50ZXJwcmV0aWVydAorCSAgd2VyZGVuLiBEaWUgRnVua3Rpb24gaGF0IG51ciBlaW4gQXJndW1lbnQsIHVuZCBkYXMgaXN0IGRlciBEYXRlaW5hbWUuCisKKwkgIEJlaXNwaWVsOiAobG9hZCAiL3BsYXllcnMvaGF0ZS9saXNwLmwiKQorCQorCVp1IGIpCisJICBXZW5uIGRpZSBLbmV0ZSBnZWNsb25lZCB3dXJkZSwga29lbm5lbiBqZWRlcnplaXQgTGlzcGF1c2RydWVja2UKKwkgIGVpbmdlZ2ViZW4gd2VyZGVuLCB3ZWxjaGUgZGFubiBpbnRlcnByZXRpZXJ0IHdlcmRlbi4gRGFiZWkgc29sbHRlCisJICBiZWFjaHRldCB3ZXJkZW4sIGRhc3MgZGllIGFldXNzZXJzdGUgS2xhbW1lciBuaWNodCBub3R3ZW5kaWcgaXN0IQorCisJICBCZWlzcGllbDogKCsgMSAoKyAxIDEpKSBrb2VubnRlIG1hbiBhdWNoIHNjaHJlaWJlbiBhbHM6CisJICAgICAgICAgICAgKyAxICgrIDEgMSkKKworCSAgRGllcyBpc3Qgdm9yIGFsbGVtIGRhbm4gaW50ZXJlc3NhbnQsIHdlbm4gbWFuIGRpZSBNb2VnbGljaGtlaXRlbgorCSAgZGVyIEtuZXRlIGFscyBhbGlhcy1XZXJremV1ZyBpbiBiZXRyYWNodCB6aWVodC4gU29taXQgaXN0IGVzCisJICBtb2VnbGljaCwgZWluZSBGdW5rdGlvbiB6dSBzY2hyZWliZW4gdW5kIGRpZXNlIGRhbm4gd2llIGVpbiBhbGlhcworCSAgenUgYmVudXR6ZW4uCisKKwkgIEJlaXNwaWVsOiAoZGVmdW4gd2hvICgpICh1c2VycykpIDs7OyBnaWJ0IGRhcyB1c2VycyBhcnJheSBhdXMKKwkgICAgICAgICAgICAgSmV0enQgbXVzcyBudXIgbm9jaCB3aG8gZWluZ2VnZWJlbiB3ZXJkZW4gdW5kIGRhcworCQkgICAgIGFycmF5IHdpcmQgYXVzZ2VnZWJlbi4KKworCSAgRGEgTGlzcCB3ZXNlbnRsaWNoIGtvbXBsZXhlcmUgQXVzZHJ1ZWNrZSBlcm1vZWdsaWNodCwgYWxzIGRlcgorCSAgbm9ybWFsZSBhbGlhcy1JbnRlcnByZXRlciwgbGllZ2VuIGRpZSBWb3J0ZWlsZSBhdWYgZGVyIEhhbmQuCisKK0tPTkZJR1VSQVRJT046CisJRGllIEtuZXRlIGxhZXNzdCBzaWNoIGZ1ZXIgamVkZW4gTnV0emVyIGtvbmZpZ3VyaWVyZW4sIGluZGVtIHNpZSBlaW5lCisJRGF0ZWkgIi9wbGF5ZXJzLzxuYW1lPi9saXNwLmwiIGF1cyBkZXNzZW4gSGVpbWF0dmVyemVpY2huaXMgbGFlZHQuCisKKwlFaW4gQmVpc3BpZWwsIHdhcyBtYW4gZGFtaXQgbWFjaGVuIGthbm4gYmVmaW5kZXQgc2ljaCB1bnRlcjoKKwkgICIvcGxheWVycy9oYXRlL2xpc3AubCIKKwlEaWUgTVVEIFNwZXppZmlzY2hlbiBUZWlsZSB1bmQgQWJmcmFnZW4ga29lbm5lbiBpZ25vZXJpZXJ0IHdlcmRlbi4KKworQlVHUzoKKwlFcyBnaWJ0IG1vbWVudGFuIG5vY2ggZWluIFByb2JsZW0sIHdlbm4gYXVmIGRlciBLb21tYW5kb3plaWxlCisJS2xhbW1lcm4gZmVobGVuLiBEYW5uIGtvbW10IGVpbmUgTWVsZHVuZzogIipNaXNzaW5nIDIgKSIKKwlJbiBkaWVzZW0gRmFsbCBlaW5mYWNoIHp3ZWltYWwgaGludGVyZWluYW5kZXIgKSBhdWYgamV3ZWlscyBlaW5lcgorCWVpbnplbG5lbiBaZWlsZSBlaW5nZWJlbiEgRGllc2VzIFByb2JsZW0gdHJpdHQgdm9yIGFsbGVtIGRhbm4gYXVmLAorCXdlbm4gbWFuIHp1bSBCZWlzcGllbCBlaW4gOiggZWluZ2lidC4KKwpkaWZmIC0tZ2l0IGEvZG9jL3dpei9sYWRlbiBiL2RvYy93aXovbGFkZW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRlMmVhMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93aXovbGFkZW4KQEAgLTAsMCArMSwxNSBAQAorTEFFREVOIElNIE1PUkdFTkdSQVVFTQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMYWVkZW4gaW0gTW9yZ2VuR3JhdWVuIHNvbGx0ZW4gZ3J1bmRzYWV0emxpY2ggL3N0ZC9zaG9wIGVyYmVuLgorCitEZXMgV2VpdGVyZW4gYmVub2V0aWd0IG1hbiBlaW5lbiBTdG9yYWdlUm9vbSwgYWxzbyBlaW5lbiBSYXVtLCBpbiBkZW0gZGVyCitMYWRlbiBzZWluZSBHZWdlbnN0YWVuZGUgdmVyd2FsdGV0LiBEaWVzZXIgd2lyZCBtaXQgIlNldFN0b3JhZ2VSb29tIgorZ2VzZXR6dC4gRGllIEhpbGZlc2VpdGUgenUgZGllc2VtIEJlZmVobCBoYXQgYXVjaCBlaW4gQmVpc3BpZWwuCisKK09iamVrdGUsIGRpZSBkZXIgTGFkZW4gaW1tZXIgdmVya2F1ZmVuIHNvbGwsIGthbm4gbWFuIG1pdCAiQWRkRml4ZWRPYmplY3QiCitzZXR6ZW4uCisKK1NpZWhlIGF1Y2g6IFNldFN0b3JhZ2VSb29tLCBBZGRGaXhlZE9iamVjdCwgUXVlcnlTZWxsVmFsdWUKKworTGV0enRlIEFlbmRlcnVuZzogSHVtbmksIDIwMTUtMDYtMTcKZGlmZiAtLWdpdCBhL2RvYy93aXovbGVpdGZhZGVuIGIvZG9jL3dpei9sZWl0ZmFkZW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q4MDZjMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93aXovbGVpdGZhZGVuCkBAIC0wLDAgKzEsNDg3IEBACisKKworQUNIVFVORzogRElFU0VSIExFSVRGQURFTiBJU1QgRlVSQ0hUQkFSIFZFUkFMVEVUISA6LSgKKworCitERVIgTEVJVEZBREVOICdXSUUgU0NITElFU1NFIElDSCBFUkZPTEdSRUlDSCBNRUlOIEdFQklFVCBBTicuCisoaW4gc2llYmVuIFNjaHJpdHRlbiB6dW0gRXJmb2xnLCB2b24gVHN1bmFtaSB1bmQgRmV1ZXJ3ZWhyKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitEaWVzZXIgTGVpdGZhZGVuIGlzdCBhYnNvbHV0IHVudmVyYmluZGxpY2ggdW5kIGtlaW4gUmVnbGVtZW50LiBEaWUgCitSZWloZW5mb2xnZSBtdXNzIG5pY2h0IGVpbmdlaGFsdGVuIHdlcmRlbiwgdW5kIGF1Y2ggZGllIEFubWVya3VuZ2VuIAorenUgZGVuIGVpbnplbG5lbiBQdW5rdGVuIHNpbmQgbmljaHQgendpbmdlbmQgenUgYmVmb2xnZW4uCisKK0Z1ZXIgU2NobmVsbGxlc2VyOgorCisxKSBSYWV1bWUvT2JqZWt0ZS9OUENzIHByb2dnZW4KKzIpIEFsbGVzIFRlc3RlbiB1bmQgTWFpbCBhbiBkaWUgUmVnaW9uc21hZ2llciAoUk0pIHNjaGlja2VuLgorMykgUk1zIHBydWVmZW4gQ29kZSB1bmQgd2Vpc2VuIGF1ZiBtb2VnbGljaGUgUHJvYmxlbWUgaGluLgorNCkgQW50cmFnIEJhbGFuY2UgdmVyZmFzc2VuICgnZ290byAvcGxheWVycy9wYXJhY2Vsc3VzL29mZmljZScpLgorNSkgRm9yc2NoZXJwdW5rdGUgYmVhbnRyYWdlbiAoaGlsZmUgZXJ6bWFnaWVyKS4KKzYpIE1haWwgYW4gUk1zLCBkYXNzIG51biBhbGxlcyBpLk8uIGlzdC4KKzcpIFJNcyBzY2hsaWVzc2VuIEdlYmlldCBhbi4KKworTnVuIGV0d2FzIGF1c2Z1ZWhybGljaGVyLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitQIEggQSBTIEUgMQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRHUgYmlzdCBudW4gYWxzbyBNYWdpZXIsIHZvbGxlciBJZGVlbiB1bmQgVGF0ZW5kcmFuZy4gQmV2b3IgRHUgd2lsZCBkcmF1ZmxvcworcHJvZ3JhbW1pZXJzdCwgZWluIHBhYXIgVGlwcywgdW0gRGlyIHVuZCBkZW4genVzdGFlbmRpZ2VuIFJNcyBkYXMgTGViZW4genUgCitlcmxlaWNodGVybjoKKworRmVydGlnZSBEaXIgZWluZSBBU0NJSS1LYXJ0ZSBhbiwgdW5kIHNjaHJlaWJlIGVpbmVuIGt1cnplbiBUZXh0LCBkZXIgRGVpbiAKK25ldWVzIEdlYmlldCBiZXNjaHJlaWJ0LiBGcmFnZSBzY2hvbiBtYWwgRGVpbmVuIFJNLCB3byB1bmdlZmFlaHIgZGllc2VzCituZXVlIEdlYmlldCBhbmdlc2NobG9zc2VuIHdlcmRlbiBrb2VubnRlLiBTbyBrYW5uc3QgRHUgRGlyIGVpbiBwYWFyIEdlZGFua2VuCittYWNoZW4sIHdpZSBkaWUgQW5zY2hsdXNzcmFldW1lIGF1c3NjaGF1ZW4ga29lbm50ZW4uCisKK0Vyc3RlbGxlIHNpbm52b2xsZSBVbnRlcnZlcnplaWNobmlzZTogZXMgaGF0IHNpY2ggZm9sZ2VuZGVzIGJld2FlaHJ0OgorRWluIEhhdXB0dmVyemVpY2huaXMgbWl0IGRlbSBOYW1lbiBkZXMgR2ViaWV0ZXMgKGt1cnosIHdlbm5zIGdlaHQpLiBEb3J0Citrb21tZW4gZGFubiBkaWUgVW50ZXJ2ZXJ6ZWljaG5pc2UgcmVpbjogei5CLiAnKy9kb2MgKy9tb24gKy9vYmogKy9yb29tcycuIAorSW4gZGFzICcrL2RvYycga29tbWVuIGRhbm4gRGVpbmUgS2FydGVuIHVuZCBUZXh0ZS4gRmFsbHMgRHUgbWl0IAorJ05vdGlmeVBsYXllckRlYXRoKCknIERlaW5lIEtlcmJlbiBsb2dnZW4gd2lsbHN0LCBvZGVyIGFuZGVyZSB3aWNodGlnZSAKK1NhY2hlbiBsb2dnZW4gbW9lY2h0ZXN0LCBkYW5uIHNjaHJlaWJlIGRpZXNlIEZpbGVzIGluIGRhcyAnL2xvZy88ZGVpbm5hbWU+LycgCitWZXJ6ZWljaG5pcy4gCitJbiBkYXMgJysvbW9uJyBWZXJ6ZWljaG5pcyBrb21tZW4gYWxsZSBOUENzIHVzdy4KKworV2VubiBEdSBlaW4gVGV4dGZpbGUgYXVmcnVmZW4gd2lsbHN0LCBkYXNzIGRlbiBJbmhhbHQgZGVyIFVudGVydmVyemVpY2huaXNlCitiZXNjaHJlaWJ0LCBzbyBsZWdlIGVpbmZhY2ggZWluZSAnLnJlYWRtZScgRGF0ZWkgaW0gZW50c3ByZWNoZW5kZW4gCitWZXJ6ZWljaG5pcyBhbi4gRGllc2VzIEZpbGUgd2lyZCBiZWkgamVkZW0gJ2NkJyBhdWZnZXJ1ZmVuLgorCitCZXZvciBEdSBqZXR6dCBsb3NzY2hsYWVnc3QsIHVlYmVybGVnZSBEaXIgZWluIERlZmluZS1GaWxlLCB3b3JpbiBEdSBkaWUKK2dhbnplbiBQZmFkZSBkZWZpbmllcnN0LiBEZW5uIHdlbm4gRHUgenVlcnN0IGFsbGVzIGluIERlaW5lbSBQbGF5ZXItCitWZXJ6ZWljaG5pcyBwcm9nZ3N0LCB1bmQgdm9yIEFuc2NobHVzcyB3aXJkIGRhcyBHZWJpZXQgaW4gZGFzIFJlZ2lvbnMtCit2ZXJ6ZWljaG5pcyBnZW1vdmVkLCB3aWxsIG5pZW1hbmQgZGllIGdhbnplbiBQZmFkbmFtZW4gYWJhZW5kZXJuLgorRWluIEJlaXNwaWVsOiBpbiBEZWluICdnZWJpZXQuaCcgKGdpYiBpaG0gZWluZW4gcHJha3Rpc2NoZW4gTmFtZW4gZGVyIHp1IAorRGVpbmVtIEdlYmlldCBwYXNzdDogZWlzbWluZS5oLCBob2VobGUuaCBvZGVyIGtlbGxlci5oIHVzdykga2FlbWUgc293YXMgCitpbiBkZXIgQXJ0OgorCisjZGVmaW5lIEVJU01JTkUoeCkgKCIvZC9wb2xhci90c3VuYW1pL2Vpc21pbmUvIit4KQorI2RlZmluZSBST09NKHgpIChFSVNNSU5FKCJyb29tcy8iK3gpKQorI2RlZmluZSBNT04oeCkgKEVJU01JTkUoIm1vbi8iK3gpKQorI2RlZmluZSBPQkooeCkgKEVJU01JTkUoIm9iai8iK3gpKQorCitEZWluIFJhdW0gaW5jbHVkZWQgZGFubiBkYXMgRmlsZTogI2luY2x1ZGUgIi4uL2dlYmlldC5oIgorRGVpbiBBdXNnYW5nIGluIGVpbmVuIGFuZGVyZW4gUmF1bSBtYWNoc3QgRHUgZGFubiBmb2xnZW5kZXJtYXNzZW46CitBZGRFeGl0KCJub3JkZW4iLCBST09NKCJyYXVtMDIiKSk7CisKK0VpbiBOUEMgd3VlcmRlIHNvbWl0IGZvbGdlbmRlcm1hc3NlbiBpbiBkZW4gUmF1bSBnZXN0ZWxsdDoKK0FkZEl0ZW0oTU9OKCJlaXNlbGYiKSwgUkVGUkVTSF9ERVNUUlVDVCk7CisKK1dlbm4gc3BhZXRlciBhdXMgaXJnZW5kIGVpbmVtIEdydW5kIERlaW4gR2ViaWV0IHZlcnNjaG9iZW4gd2VyZGVuIG11c3MsIGRhbm4KK2thbm4gZGVyIFJNIGVpbmZhY2ggZGllIGVyc3RlIFplaWxlIGluICdnZWJpZXQuaCcgYWJhZW5kZXJuLiBEYXMgc3BhcnQgWmVpdAordW5kIE5lcnZlbi4KKworV2VpdGVyIGJpZXRldCBkYXMgRGVmaW5lLUZpbGUgZGllIE1vZWdsaWNoa2VpdCwgbGFlbmdlcmUgQmVmZWhsZSB6dQordmVya3Vlcnplbi4gRWluIEJlaXNwaWVsOiBEdSBtb2VjaHRlc3QgTmFtZW4gZGVzIFNwaWVsZXJzIChncm9zcyBnZXNjaHJpZWJlbikKK2F1c2dlYmVuLiBEZXIgQmVmZWhsIGRhenUgd2FlcmU6IHRoaXNfcGxheWVyKCktPk5hbWUoV0VSKQorRGFzIGlzdCB6aWVtbGljaCBsYW5nLiBEZWZpbmllcmUgaW4gRGVpbmVtIERlZmluZS1GaWxlIGRvY2ggZWluZmFjaDoKKyNkZWZpbmUgVFBOIHRoaXNfcGxheWVyKCktPk5hbWUoV0VSKQordW5kIHNjaG9uIHdpcmQgRGVpbiBDb2RlIGV0d2FzIHVlYmVyc2ljaHRsaWNoZXIuIERpZSBBbndlbmR1bmcgd2FlcmUgei5CLgorc2F5KFRQTisiIHBvcGVsdCBpbiBkZXIgTmFzZS5cbiIpOworCitXZW5uIER1IGF1dG9tYXRpc2NoZSBaZWlsZW51bWJydWVjaGUgbW9lY2h0ZXN0LCBkYW5uIHNjaHJlaWJlIGZvbGdlbmRlcworaW4gRGVpbiBEZWZpbmUgRmlsZToKKyNkZWZpbmUgQlMoeCkgYnJlYWtfc3RyaW5nKHgsIDc4ICwgIiIsIEJTX0xFQVZFX01ZX0xGUykKK0JTX0xFQVZFX01ZX0xGUyBiZXdpcmt0LCBkYXNzIER1IGltbWVyIG5vY2ggc2VsYnN0IFplaWxlbnVtYnJ1ZWNoZSBlaW5iYXVlbgora2FubnN0IG1pdCBcbi4gVW5kIHNvIHdpcmQgQlMgZGFubiBiZW51dHp0OgorQWRkRGV0YWlsKCAoeyJ3YW5kIiwid2FlbmRlIn0pLEJTKAorICAiRGllIFdhZW5kZSBiZXN0ZWhlbiB3aWUgYWxsZXMgaGllciBhdXMgcHVyZW0gU2FwaGlyLiBJbiBkaWUgbm9lcmRsaWNoZSAiKworICAiV2FuZCB3dXJkZSBlaW4gc2NocmVja2xpY2ggZ2V6YWNrdGVzIHVuZCBzY2hhcmZrYW50aWdlcyBMb2NoIGdlc3ByZW5ndC4iKSk7CisKK1VtIGRpZXMgenUgYmVudXR6ZW4gbXVzc3QgRHUgYWxsZXJkaW5ncyBub2NoICNpbmNsdWRlIDxicmVha19zdHJpbmcuaD4gaW4gZGFzIAorSGVhZGVyZmlsZSBzZXR6ZW4gKHZvciBkaWUgI2RlZmluZSBCUyh4KS4uLiktWmVpbGUpLCBzb25zdCBrZW5udCBkZXIgCitQcmVjb21waWxlciBkZW4gQXVzZHJ1Y2sgQlNfTEVBVkVfTVlfTEZTIG5pY2h0LgorCitEdSB3aXJzdCBEZWluIEdlYmlldCBldnRsLiBpbiBEZWluZW0gSG9tZS1WZXJ6ZWljaG5pcyAoL3BsYXllcnMvLi4uKQorc2NocmVpYmVuLCBkYSBEdSBub2NoIG5pY2h0IGRlbiBTcHJ1bmcgenUgTGV2ZWwgMjEgZ2VzY2hhZmZ0IGhhc3QuIER1Citzb2xsdGVzdCBhYmVyIHdpc3NlbiwgZGFzcyBEZWluZSBSZWdpb25zbWFnaWVySW5uZW4gbnVyIEdlYmlldGUgYW5uZWhtZW4KK3dlcmRlbiwgd2VsY2hlIGltIFJlZ2lvbnN2ZXJ6ZWljaG5pcyAvZC8uLi4vZGVpbl9uYW1lLyBnZXNwZWljaGVydCBzaW5kLiBEYXMKK2lzdCB3aWNodGlnLCBkZW5uIGluIERlaW5lbSBIZWltLVZlcnplaWNobmlzIGtvZW5uZW4gc2llIG5pY2h0IHNjaHJlaWJlbiB1bmQKK3NvIGtlaW5lIEZlaGxlciBrb3JyaWdpZXJlbi4gRGVua2UgZGFyYW4hIEJlbnV0emUgdW5iZWRpbmd0IGRpZSBEZWZpbmVzLAorZGVubiB2b3IgZGVtIEFuc2NobHVzcyB3aXJzdCBEdSBkYXMgR2ViaWV0IGluIGRhcyBSZWdpb25zdmVyemVpY2huaXMKK3NjaGllYmVuIG11ZXNzZW4uCisKK1ZpZWxlIFNwaWVsZXIgJ2xvZ2dlbicsIGFsc28gc3BlaWNoZXJuIGdlcm5lIFRvZGUgb2RlciBBa3Rpb25lbiB2b24gU3BpZWxlcm4KK2luIGlocmVuIEhlaW0tVmVyemVpY2huaXNzZW4uIERpZXNlcyBTY2hyZWliZW4gZnVua3Rpb25pZXJ0IG5pY2h0IHZvbgorUmVnaW9uc3ZlcnplaWNobmlzc2VuIGluIEhlaW0tVmVyemVpY2huaXNzZS4gQmVudXR6ZSBhdWNoIGhpZXIgZWluIGRlZmluZSEKKworTnVuIGtvbW1lbiB3aXIgenVtIHByb2dnZW4uIEZhbGxzIER1IG5vY2ggbmllIHByb2dyYW1taWVydCBoYXN0LCBpc3QgZXMKK3Npbm52b2xsLCBzaWNoIEJlaXNwaWVsZmlsZXMgYW56dXNjaGF1ZW4uIFd1ZWhsIERpY2ggZHVyY2ggZGFzICcvZG9jJworVmVyemVpY2huaXMgb2RlciBub2NoIGJlc3NlcjogZnJhZyBEZWluZW4gUGFwaW1hZ2llci9EZWluZSBNYW1pbWFnaWVyaW4gb2RlcgorZGVuIFJNLCBvYiBlciBEaXIgZWluIHBhYXIgc2VpbmVyIEZpbGVzIHp1c2NoaWNrdC4gSGFzdCBEdSBkaWVzZSBIdWVyZGUKK3VlYmVyd3VuZGVuLCBrYW5uIGVzIGxvc2dlaGVuLiBXZW5uIER1IGFuZmFlbmdzdCB6dSBwcm9nZ2VuIHVuZCBuaWNodCB3ZWlzc3QsIAord2llIG1hbiBlaW5lbiBiZXN0aW1tdGVuIEJlZmVobCBiZW51dHp0LCBrYW5uc3QgRHUgZGllICdtYW4gcGFnZScga29uc3VsdGllcmVuIAorKGRhcyBNYW51YWwgPSBPbmxpbmUgSGlsZmUpLiBUaXBwIGVpbmZhY2ggJ21hbiA8YmVmZWhsPicgdW5kIHNjaG9uIGtvbW10IGRpZSAKK2VudHNwcmVjaGVuZGUgSGlsZmVzZWl0ZSwgZmFsbHMgdm9yaGFuZGVuLgorCitFaW4gcGFhciBXb3J0ZSB6dSBkZW4gUmFldW1lbjogRGV0YWlscyBzaW5kIGhpZXIgc2VociB3aWNodGlnLgorTWFjaCB2aWVsZSBEZXRhaWxzIHVuZCBiZXNjaHJlaWJlIHNpZSBuZXR0LiAndW50IGJvZGVuJyAtPiAnRGVyIGlzdCB1bnRlciBEaXIuJworaXN0IG5pY2h0IHNlaHIgaW50ZXJlc3NhbnQuIEVpbiBSYXVtIG1pdCB3ZW5pZ2VyIGFscyAyMCBEZXRhaWxzIHdpcmQKK21pdHRsZXJ3ZWlsZSBhbHMgdW5nZW51ZWdlbmQgYW5nZXNlaGVuLCBhdWNoIHdlbm4gZXMgbm9jaCBlaW4gcGFhciBHZWJpZXRlCitpbSBNRyBnaWJ0LCB3byBkaWUgUmFldW1lIGZhc3Qga2VpbmUgRGV0YWlscyBoYWJlbiAoZGllc2UgWmFobCBzY2h3YW5rdAorbmF0dWVybGljaCB2b24gUmVnaW9uIHp1IFJlZ2lvbiAtLSB0cm90emRlbTogamUgbWVociBEZXRhaWxzLCBkZXN0byBiZXNzZXIpLiAKK0FkZFNtZWxscyB1bmQgQWRkU291bmRzIHNvbGx0ZXN0IER1IGViZW5mYWxscyBuaWNodCB2ZXJnZXNzZW4uIERlciBTcGllbGVyIAordm9uIFdlbHQgd2lsbCBhdWNoIHJpZWNoZW4gdW5kIGhvZXJlbiBrb2VubmVuLiBXZW5uIER1IGVpbmVuIFJhdW0gZXJzdGVsbHN0LCAKK3VlYmVybGVnZSBEaXIgYXVjaCB3aXR6aWdlIHVuZC9vZGVyIHNpbm52b2xsZSBCZWZlaGxlLCBkaWUgbWFuIGluIGRlbSBSYXVtIAorYXVzZnVlaHJlbiBrYW5uLiBCZWkgbGFlbmdlcmVuIFByb3plZHVyZW4gaXN0IGVzIGZ1ZXIgZGVuIFJNIGhpbGZyZWljaCwgd2VubiAKK0R1IGltIGpld2VpbGlnZW4gUmF1bSBlaW5lbiBrdXJ6ZW4gS29tbWVudGFyIGFic2V0enQuCisKK1NjaGF1LCBkYXNzIER1IGVpbiBhdG1vc3BoYWVyaXNjaCBzY2hvZW5lcyBHZWJpZXQgcHJvZ3JhbW1pZXJzdC4gU2NoYXUsCitkYXNzIGVzIHNpY2ggbWl0IHNlaW5lciBVbWdlYnVuZyB2ZXJ0cmFlZ3QuIEJldm9yIER1IGVpbiBhYmdlc3R1ZXJ6dGVzCitSYXVtc2NoaWZmIHZvbiBkZXIgVmVnYSBwcm9ncmFtbWllcnN0LCBmcmFnZSBsaWViZXIgRGVpbmVuIFJNLCBkZW5uCit3YWhyc2NoZWlubGljaCBwYXNzdCBlcyB0aGVtYXRpc2NoIG5pY2h0IGluIHNlaW5lIFJlZ2lvbiAod2VsY2hlIFJlZ2lvbiBhdWNoCitpbW1lciBlcyBpc3QgOi0pKS4KKworQWNodGUgZGFyYXVmLCBkYXNzIGRpZSBUb2VkbGljaGtlaXQgRGVpbmVzIEdlYmlldHMgc2ljaCBtaXQgRGVpbmVyIFVtZ2VidW5nCit2ZXJ0cmFlZ3QuIFVlYmVyLVNjaHdlcmUtTWVnYS1Nb25zdGVyIHNvbGx0ZW4gdm9uIGtsZWluZW4gU3BpZWxlcm4gbmljaHQKK3Byb2JsZW1sb3MgZXJyZWljaHQgd2VyZGVuIGtvZW5uZW4uIEJlbnV0emUgbmljaHQgZ2FueiBzbyB0b2VkbGljaGUKKydCbG9jay1Nb25zdGVyJywgd2VsY2hlIGRlbiBadWdhbmcgdmVyc3BlcnJlbi4gU28gbXVzcyBlaW4gU3BpZWxlciBlcnN0CitzZWluZSBXdWVyZGlna2VpdCBiZXdlaXNlbiwgYmV2b3IgZXIgYW4gZGllIGhhcnRlbiBNb25zdGVyIGtvbW10LiBUaWdvbmVuIGltCitHbG9ja2Vud2FsZCBzaW5kIEtFSU5FIGd1dGUgSWRlZS4KKworVmllbGUgTWFnaWVyIGZpbmRlbiBlcyBsdXN0aWcsIFNwaWVsZXIgaW4gaWhyZW4gR2ViaWV0ZW4gZHVyY2ggRmFsbGVuCitzdGVyYmVuIHp1IGxhc3Nlbi4gRGFzIHNpbmQgei5CLiBLbm9lcGZlLCBkaWUgbWFuIGRydWVja3QsIHVuZCBkaWUgZGFubiBzb2ZvcnQKK3RoaXNfcGxheWVyKCktPmRpZSgpIGF1ZnJ1ZmVuLiBOYWNoZGVtIHZvciBlaW5pZ2VyIFplaXQgZGllIFRvZGVzZm9sZ2VuCit2ZXJzY2hhZXJmdCB3dXJkZW4sIHNpbmQgZGVyYXJ0aWdlIEZhbGxlbiBuaWNodCBtZWhyIGdlcm4gZ2VzZWhlbi4gVmVybWVpZGUKK3NpZSB3ZW5uIG1vZWdsaWNoLiBTcGllbGVyIG1hY2hlbiBqZWRlbiBNdWVsbCwgYWJlciBsYXNzIHNpZSBuaWNodCBkYWZ1ZXIKK3N0ZXJiZW4sIHdlbm4gRHUgZXMgYW5kZXJzIHJlZ2VsbiBrYW5uc3QuIEplZGUgVG9kZXNmYWxsZSBpc3QgZGVtIFJNCithdWZ6dXp1ZWlnZW4uCisKK0RpZSBPYmpla3RlOiBkYXp1IGdlaG9lcmVuIGF1Y2ggV2FmZmVuIHVuZCBSdWVzdHVuZ2VuLCBzb3dpZSBhbGxlIGFuZGVyZW4KK3NjaHJhZW5nZW4gRGluZ2UsIGRpZSBEaXIgbm9jaCBzbyBlaW5mYWxsZW4gd2VyZGVuLiBCZXZvciBEdSBEaXIgRGVpbmUKK2Vyc3RlIE1lZ2EtU3VwZXItQWxsZXMtS2FwdXR0c2NobGFnLUF4dCBvZGVyIGRlbiBBbGxlLVNjaGFlZGVuLUFid2Voci1QYW56ZXIKK3p1c2FtbWVuYmFzdGVsc3QsIHNldHogRGljaCBoaW4sIGF0bWUgcnVoaWcgZHVyY2ggdW5kIHRpcHAgZGFubiAnbWFuIGJhbGFuY2UnLgorRG9ydCBzdGVoZW4gYWxsZSB3aWNodGlnZW4gRWNrZGF0ZW4sIGRpZSBEdSBiZWZvbGdlbiBzb2xsdGVzdC4gVW5kIGRlbmsgZGFyYW4sCituaWNodCB6dXZpZWxlIGV4a2x1c2l2ZW4gV2FmZmVuIHVuZC9vZGVyIFJ1ZXN0dW5nZW4gaW4gZWluZW0gZWluaWdlbiBHZWJpZXQuCitXZW5uIER1IGdyb3NzZSBPYmpla3RlIHNjaHJlaWJzdCwgaXN0IGhpZXIgYXVjaCB3aWVkZXIgZWluIGtsZWluZXIgS29tbWVudGFyCitpbSBGaWxlIHNlaHIgaGlsZnJlaWNoIGZ1ZXIgZGVuIFJNLiBEZW5rIGRhcmFuLCBEdSBiaXN0IHZpZWxsZWljaHQgaXJnZW5kd2FubgorZWlubWFsIG5pY2h0IG1laHIgZXJyZWljaGJhciB1bmQgZGFubiBpc3QgZXMgZ3V0LCB3ZW5uIGltIEZpbGUgZ2VzY2hyaWViZW4KK3N0ZWh0LCB3YXMgZGFzIFByb2dyYW1tIHVuZ2VmYWVociBtYWNodC4KKworSmV0enQga29tbWVuIHdpciB6dSBlaW4gcGFhciBoYWV1ZmlnZW4gUHJvYmxlbWVuOgorRXJ6ZXVnc3QgRHUgZWluIE9iamVrdCwgZGFzIGluIGVpbmVuIFNwaWVsZXIgZ2VzY2hvYmVuIHdpcmQsIG11c3N0IER1IAordW5iZWRpbmd0IGRlbiBSZXR1cm4tV2VydCBhYmZyYWdlbiwgb2IgZGVyIFNwaWVsZXIgZGFzIG5vY2ggdHJhZ2VuIGthbm46CitFaW4gQmVpc3BpZWw6IEVpbmUgZWlnZW5lIEZ1bmt0aW9uICduZWhtZW4nLgorSW4gZGFzIGNyZWF0ZSgpIHZvbSBSYXVtIGtvbW10OgorQWRkQ21kKCh7Im5pbW0iLCJuZWhtIiwibmVobWUifSksIm5laG1lbiIpOworCitEaWUgRnVua3Rpb24gJ25laG1lbicgZXJ6ZXVndCBlaW5lIFppZ2FycmUuIFNpZSBwcnVlZnQsIG9iIGVpbmVuIFppZ2FycmUKK3NjaG9uIGltIFJhdW0gbGllZ3QsIGRhbm4gbmltbXQgZGVyIFNwaWVsZXIgZGllc2UuIEZhbGxzIGtlaW5lIFppZ2FycmUKK3J1bWxpZWd0LCB3aXJkIGVpbmUgbmV1ZSBlcnpldWd0IHVuZCBpbiBkZW4gU3BpZWxlciBnZXNjaG9iZW4uIAorRGFtaXQgZWluIFNwaWVsZXIgbmljaHQgaHVuZGVydGUgWmlnYXJyZW4gZXJ6ZXVnZW4ga2Fubiwgd3VyZGUgZWluZQorZ2xvYmFsZSBWYXJpYWJsZSAnaW50IHphZWhsZXI7IHphZWhsZXI9NTsgb2JlbiBpbSBjcmVhdGUoKSB2b20gUmF1bSBlcnN0ZWxsdC4gCitOYWNoIGVpbmVtIFJhdW1yZXNldCBzdGVodCBkZXIgWmFlaGxlciB3aWVkZXIgYXVmIDUsIHdlbm4gbWFuIGRhcyBpbiBkZXIKK3Jlc2V0KCkgRnVua3Rpb24gKHNpZWhlIHVudGVuKSBkZWZpbmllcnQuCisKK25laG1lbihzdHJpbmcgc3RyKQoreworICBvYmplY3Qgb2I7CisKKyAgIG5vdGlmeV9mYWlsKCJXYXMgbW9lY2h0ZXN0IER1IG5laG1lbj9cbiIpOworICAgaWYoIXN0cikgcmV0dXJuIDA7CisgICBpZihzdHI9PSJ6aWdhcnJlIikgeworICAgaWYocHJlc2VudCgiemlnYXJyZSIsdGhpc19vYmplY3QoKSkpIHJldHVybiAwOyAKKyAgIC8vIHNvIHdpcmQgZGllIFppZ2FycmUgSU0gUmF1bSBnZW5vbW1lbgorCisgICAgIGlmICh6YWVobGVyKSB7ICAgCisgICAgICAgd3JpdGUoQlMoIkR1IG5pbW1zdCBlaW5lIFppZ2FycmUgYXVzIGRlbSBGYWNoLiIpKTsKKyAgICAgICBzYXkoVFBOKyIgbmltbXQgZWluZSBaaWdhcnJlIGF1cyBlaW5lbSBGYWNoLlxuIix0aGlzX3BsYXllcigpKTsKKyAgICAgICAvLyBUUE46IHNpZWhlIG9iZW4sIEFic2Nobml0dCAnRGVmaW5lcycKKyAgICAgICBvYj1jbG9uZV9vYmplY3QoT0JKKCJ6aWdhcnJlIikpOworICAgICAgIGlmIChvYi0+bW92ZSh0aGlzX3BsYXllcigpLE1fR0VUKSAhPTEpIHsKKyAgICAgICAvLyBkaWVzZXMgJyE9MScgZmFlbmd0IE1FX1RPT19IRUFWWSwgTUVfVE9PX01BTllfT0JKRUNUUywgCisgICAgICAgLy8gdW5kIE1FX0NBTlRfQkVfSU5TRVJURUQgYWIKKworICAgICAgICAgICB3cml0ZSgiRHUga2FubnN0IGRpZSBaaWdhcnJlIG5pY2h0IG1laHIgdHJhZ2VuLiBTaWUgZmFlbGx0IHp1ICIrCisgICAgICAgICAgICJCb2Rlbi5cbiIpOworICAgICAgICAgICBvYi0+bW92ZShlbnZpcm9ubWVudChUUCksTV9QVVQpOworICAgICAgICAgICB9CisgICAgICAgICB6YWVobGVyLS07CisgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgIH0KKyAgICAgd3JpdGUoQlMoIlNvIGVpbiBQZWNoLiBKZW1hbmQgaGF0IGRpZSBiZXN0ZW4gU3R1ZWNrZSBiZXJlaXRzIGdlbm9tbWVuLiIpKTsKKyAgICAgcmV0dXJuIDE7CisgICAgIH0KKyAgLy8gdW5kIGRhbWl0IG1hbiBhdWNoIGFuZGVyZSBTYWNoZW4gYWxzIFppZ2FycmVuIGltIFJhdW0gbmVobWVuIGthbm46CisgIHJldHVybiAwOworICAKK30KKworcmVzZXQoKQoreworICAgIDo6cmVzZXQoKTsKKyAgICAvLyBuYWNoIDMwLTQ1IG1pbiBrYW5uIG1hbiB3aWVkZXIgNSBuZXVlIFppZ2FycmVuIG5laG1lbgorICAgIHphZWhsZXI9NTsKK30KKworRGllIE5QQ3MuIEVzIGdpYnQgKG5vY2gpIGtlaW5lIFZvcnNjaHJpZnQsIHdpZSBzdGFyayBtYXhpbWFsIE5QQ3Mgc2VpbiBkdWVyZmVuLAorYWJlciBzY2hhdSBEaXIgdHJvdHpkZW0gJ21hbiBiYWxhbmNlJyB6dSBkaWVzZW0gVGhlbWEgYW4uCitOUENzIHdlcmRlbiBvZnQgc2NobWVyemxpY2ggdm9uIGlocmVuIE1hZ2llcm4gdmVybmFjaGxhZXNzaWd0LiBPZnQKK3N0ZWh0IGRlciBncm9zc2UgRHJhY2hlIGF1ZiBkZW0gU3BlaWNoZXIsIGthbm4gRGljaCBpbiBlaW5lbSBTY2hsYWcgdW1oYXVuLAord2Vpc3MgYWJlciBuaWNodCBlaW5tYWwgc2VpbmVuIE5hbWVuIHVuZCBiZXNpdHp0IG5pY2h0IGVpbiBEZXRhaWwuIEt1ZW1tZXIKK0RpY2ggdW0gRGVpbmUgTlBDcy4gR2liIGlobmVuIGVpbmUgc2Nob2VuZSBCZXNjaHJlaWJ1bmcsIGxhc3Mgc2llIGV0d2FzCit1ZWJlciBzaWNoIGVyemFlaGxlbiwgZ2liIGlobmVuIERldGFpbHMsIGdpYiBpaG5lbiBLbGVpZHVuZy4KKworT2Z0IHdpbGwgbWFuIE5QQ3MgZHVyY2ggR2ViaWV0ZSBsYXVmZW4gbGFzc2VuLCBzbyBkYXNzIHNpZSBtYWwgTGFuZCB1bmQKK0xldXRlIGtlbm5lbmxlcm5lbi4gRGFzIGlzdCBldHdhcyByZWNobmVybGFzdGlnLCB1bmQgYXVjaCB3ZW5uIHdpciBqZXR6dAoramVkZSBNZW5nZSBQb3dlciB1bnRlciBkZXIgSGF1YmUgaGFiZW4sIHNvbGx0ZSBtYW4gZWluaWdlIERpbmdlIGJlYWNodGVuOgorKiBFcyBnaWJ0IGVpbmlnZSBzZWhyIHNjaG9lbmUgU3RhbmRhcmQtTGF1Zi1OUENzLiBFcyBiaWV0ZXQgc2ljaCBhbiwgZGllc2UKKyAgenUgYmVudXR6ZW4uIFNpZSBoYWJlbiBhbGxlIG5vZXRpZ2VuIEVpZ2Vuc2NoYWZ0ZW4sIHVudGVyIGFuZGVyZW0sIGRhc3Mgc2llIAorICBzdGVoZW4gYmxlaWJlbiwgd2VubiBzaWUga2VpbmUgU3BpZWxlciBtZWhyIGFudHJlZmZlbi4gRGFzIHNwYXJ0IAorICBQZXJmb3JtYW5jZS4gQXVzc2VyZGVtIHdlcmRlbiBzaWUgb2Z0IHZvbiBlaW5lbSBNYXN0ZXIgZ2VzdGV1ZXJ0LCB1bmQgZGFzIAorICBzcGFydCBjYWxsX291dHMuCisqIEF1ZndlbmRpZyBpc3QgYmVzb25kZXJzIGRhcyBCZXdlZ2VuIHZvbiBOUENzLiBSZW5uZW5kZSBOUENzIHNpbmQgZG9jaAorICBvZWRlLiBMYXNzIHNpZSBzaWNoIGxhbmdzYW0gYmV3ZWdlbi4gSmVkZXMgc2Nob2VuZSBHZXNwcmFlY2ggbWl0IGVpbmVtIE5QQyAKKyAgZ2VodCBpbiBkaWUgSG9zZSwgd2VubiBkZXIgTlBDIHN0YWVuZGlnIHZvciBlaW5lbSB3ZWdsYWV1ZnQuCisKK0RlbmtlIGdlbmVyZWxsIGRhcmFuLCB1ZWJlcnNpY2h0bGljaCB6dSBwcm9ncmFtbWllcmVuLiBCZW51dHplIG5pY2h0CittZWhyIGFscyA3OCBaZWljaGVuIHBybyBaZWlsZSwgZnVlZ2UgcnVoaWcgTGVlcnplaWxlbiBlaW4sIHVtIGRpZSBTdHJ1a3R1cgorenUgdW50ZXJzdHJlaWNoZW4uIFJ1ZWNrZSBpbiBTY2hsZWlmZW4gZGVuIENvZGUgZWluIHBhYXIgKHouQi4gMykgWmVpY2hlbgorZWluLiBLb21tZW50YXJlIG1hY2hlbiBEZWluZW4gUk0gZ2x1ZWNrbGljaCEgV2VubiBEdSBlaW5zdCB2aWVsbGVpY2h0IG5pY2h0CittZWhyIGRhIGJpc3QsIHdpcmQgaXJnZW5kIGplbWFuZCBEZWluZW4gQ29kZSB3YXJ0ZW4gbXVlc3Nlbi4gRGVuayBhbiBkZW4KK2FybWVuIEtlcmwhIEZ1ZWdlIGJlaSBEZWluZW4gT2JqZWt0ZW4gZWluZW4gSGlud2VpcyBkYXJhdWYgZWluLCB3b3ZvbiB1bmQKK3dvZnVlciBzaWUgYmVudXR6dCB3ZXJkZW4hIFdlbm4gRHUgZGllIFdhaGwgaGFzdCwgQ29kZSBpbiBlaW5lcgorZnVlcmNodGVybGljaCBlZmZpemllbnRlbiwgYWJlciB1bnVlYmVyc2ljaHRsaWNoZW4gV2Vpc2UgenUgc2NocmVpYmVuLCBvZGVyCitldHdhcyB3ZW5pZ2VyIGVmZml6aWVudCwgYWJlciBpbnR1aXRpdiB1bmQgZWlubGV1Y2h0ZW5kLCBuaW1tIGRpZQorZWlubGV1Y2h0ZW5kZSBXZWlzZS4gCisKK1phdWJlcnRyYWVua2UsIEdpbGRlbm9iamVrdGUsIEdpbGRlbnF1ZXN0cworCitaYXViZXJ0cmFlbmtlCisKK1phdWJlcnRyYWVua2Ugc2luZCB3aWNodGlnLCB1bmQgb2J3b2hsIGVzIHNpZSBzY2hvbiBhbiB2aWVsZW4gU3RlbGxlbiBpbSBNRworZ2lidCwgc2luZCBzaWUgaW1tZXIgbm9jaCBnZWZyYWd0LiBNYW4gc29sbHRlIGJlaW0gRWluYmF1ZW4gdm9uIFpUcyBkYXJhbgorZGVua2VuLCBzaWUgbmljaHQgdGllZiBpbiBRdWVzdC1HZWJpZXRlbiB6dSB2ZXJzdGVja2VuLCBzbyBkYXNzIGVpbiBTcGllbGVyCitrZWluZSBRdWVzdCBub2NobWFsIHNwaWVsZW4gbXVzcywgbnVyIHVtIGRlbiBaVCB6dSBiZWtvbW1lbi4gQXVzc2VyZGVtCitzb2xsdGVuIHNpZSBuaWNodCB6dSBzY2h3ZXIgdmVyc3RlY2t0IHdlcmRlbi4gRWluIFphdWJlcnRyYW5rIGluIGVpbmVtIEJ1Y2gKK2Jla29tbXQgbWFuIHouQi4gZHVyY2g6CisKK2NyZWF0ZSgpIHsKKy4uLgorQWRkUmVhZERldGFpbCgiYnVjaCIsIkBAZGV0X2J1Y2hAQCIpOworfQorCitzdHJpbmcgZGV0X2J1Y2goKSAKK3sKKyBpZiAodGhpc19wbGF5ZXIoKS0+RmluZFBvdGlvbigiRHUgZmluZGVzdCBNYWNodCBpbiBkaWVzZW0gQnVjaC4uLlxuIikpIAorICAgcmV0dXJuICIiOworIGVsc2UKKyAgIHJldHVybiAiRHUgZmluZGVzdCBrZWluZSBNYWNodCBpbiBkaWVzZW0gQnVjaC4gV2llIHNjaGFkZS4uLlxuIjsKK30KKworRGVua2UgZGFyYW4sIGF1Y2ggZWluZW4gVmVycyB6dSBzY2hyZWliZW4sIHdlbGNoZXIgaW0gT3Jha2VsIGRlbiBUaXAgZnVlcgorZGllc2VuIFpUIGRhcnN0ZWxsdC4gRHUga2VubnN0IGRpZXNlIFZlcnNlIHNpY2hlciBzY2hvbiB6dXIgR2VudWVnZSA6LSkuCitEdSBtdXNzdCBkZW4gWmF1YmVydHJhbmsgc3BhZXRlciB6dXNhbW1lbiBtaXQgZGVuIEZvcnNjaGVycHVua3RlbiBhbm1lbGRlbi4KKworR2lsZGVuLSB1bmQgTWluaXF1ZXN0cy4KKworR2lsZGVucXVlc3RzIHNpbmQga2xlaW5lIEF1ZmdhYmVuLCBuaWNodCBncm9zcyBnZW51ZyBmdWVyIHJpY2h0aWdlIFF1ZXN0cywKK3dlbGNoZSB2b24gZGVuIE1pdGdsaWVkZXJuIGVpbmVyIEdpbGRlIGdlbG9lc3Qgd2VyZGVuIG11ZXNzZW4sIGJldm9yIHNpZQorYXVmc3RlaWdlbiBrb2VubmVuLiBEaWUgRGluZ2VyIHNpbmQgdm9sbCBpbSBLb21tZW4uIFphdWJlcmVyLSwgS2FlbXBmZXItCitvZGVyIENoYW9zLUdpbGRlbm1hZ2llciBzaW5kIGltbWVyIGhpbnRlciBkZW5lbiBoZXIuIFF1ZXN0cyB3aWUgJ0ZpbmRlIGRhcwordmVyc2Nob2xsZW5lIEJ1Y2gnIG9kZXIgJ0JlZnJlaWUgZGVuIFZlcnVydGVpbHRlbicgbGFzc2VuIHNpY2ggb2Z0IG9obmUKK2dyb3NzZW4gQXVmd2FuZCBpbiBHZWJpZXRlIGVpbmJhdWVuLiBTaWUgZ2FyYW50aWVyZW4gYXVjaCBlaW5lIGdld2lzc2UKK3Blcm1hbmVudGUgQmVzdWNoZXJ6YWhsIGltIEdlYmlldCA6LSkpLiBCZXZvciBtYW4gZGllc2UgUXVlc3RzIGVpbmJhdXQsCitzb2xsdGUgbWFuIGRhcyBwcmluemlwaWVsbGUgT0sgZGVyIEdpbGRlbm1hZ2llciBob2xlbiwgbmFjaGhlciBtdXNzIG1hbgoraWhuZW4gZGllIFF1ZXN0IHZvcnN0ZWxsZW4sIGRhbWl0IHNpZSBzaWUgYmV3ZXJ0ZW4gdW5kIGZyZWlnZWJlbi4KKworV2lsbCBtYW4gZWluZSBrbGVpbmUgQXVmZ2FiZSBuaWNodCBnaWxkZW5hYmhhZW5naWcsIHNvbmRlcm4gZnVlciBhbGxlCitTcGllbGVyIGVpbmJhdWVuIHVuZCBkYWZ1ZXIgU3R1ZmVucHVua3RlIHZlcmdlYmVuLCBkYW5uIGthbm4gbWFuIGRpZSBBdWZnYWJlCithdWNoIGFscyBNaW5pcXVlc3QgZWludHJhZ2VuIGxhc3NlbiwgdW5kIHp3YXIgYmVpbSBnbGVpY2hlbiBFTSwgZGVyIGF1Y2ggZGllCitGUHMgZWludHJhZWd0LiBFcyBmb2xnZW4gQ29kZS1CZWlzcGllbGUgZnVlciBkaWUgVmVyZ2FiZSBkZXIgUXVlc3RzLi4uCisKK2ludCBiZWZyZWllKHN0cmluZyB3ZW4pIAoreworICBub3RpZnlfZmFpbCgiV2VuIG1vZWNodGVzdCBEdSBiZWZyZWllbj9cbiIpOworICBpZiAod2VyICE9ICJnZWZhbmdlbmVyIikgCisgICAgcmV0dXJuIDA7CisgIAorICAvLyBIaWVyIHdlcmRlbiBkaWUgU3R1ZmVucHVua3RlIGZ1ZXIgZGllIE1pbmlxdWVzdCB2ZXJnZWJlbi4uLgorICAvLyBGYWxscyBtYW4ga2VpbmUgTWluaXF1ZXN0IGFuZ2VtZWxkZXQgaGF0LCBsYWVzc3QgbWFuIGRhcyBuYXR1ZXJsaWNoIHdlZworICBTQ09SRU1BU1RFUi0+R2l2ZU1pbmlRdWVzdCh0aGlzX3BsYXllcigpKTsKKworICAvLyBIaWVyIHNpbmQgZGllIEthZW1wZmVyLiBEZXIgQ29kZSBrYW5uIHZhcmlpZXJlbi4uLgorICBjYWxsX290aGVyKCIvcC9rYWVtcGZlci9zdGQva19tYXN0ZXIiLCJTZXR6ZUF1ZmdhYmUiLGdldHVpZCh0aGlzX3BsYXllcigpKSwKKyAgICAiQmVmcmVpZSBkZW4gR2VmYW5nZW5lbiIpOworCisgIC8vIExldHp0ZXMgQmVpc3BpZWw6IEhpZXIgc2luZCBkaWUgWmF1YmVyZXI6CisgIGNhbGxfb3RoZXIoIi9wL3phdWJlcmVyL25wYy90ZXN0IiwiR2l2ZVF1ZXN0Iix0aGlzX3BsYXllcigpLAorICAgICJCZWZyZWllIGRlbiBHZWZhbmdlbmVuIik7CisgIC4uLgorfQorCitHaWxkZW5vYmpla3RlCisKK0dpbGRlbm9iamVrdGUgd2lya2VuIG5vY2ggYmVzc2VyIGFscyBHaWxkZW5xdWVzdGVuLCB1bSBTcGllbGVyIGluIEdlYmlldGUgenUKK2xvY2tlbiA6LSkuIERpZXMgc29sbHRlIGplZG9jaCBrZWluIEFubGFzcyBzZWluLCBlaW4gR2ViaWV0IG1pdCBkZXJhcnRpZ2VuCitEaW5nZW4genUgdWViZXJsYWRlbiBhYmVyIGRhZnVlciBkaWUgRGV0YWlscyB1bmQgZGllIEF0bW9zcGhhZXJlIHp1Cit2ZXJnZXNzZW4uIEdhbnogZ2VuZXJlbGwgZ2lsdDogTWFlc3NpZ2UgRGljaCEgV2VuaWdlciBpc3QgbWVociEKKworR2FueiBnZW5lcmVsbCBzaW5kIEdpbGRlbm9iamVrdGUgei5CLiBVdGVuc2lsaWVuIGRlciBaYXViZXJlciwgV2FmZmVuIG1pdAorS2FlbXBmZXItQm9uaSBmdWVyIEthZW1wZmVyIG9kZXIgS3JlaWRlbiBldGMuIGZ1ZXIgQ2hhb3Rlbi4gRGllc2UgT2JqZWt0ZQorbXVlc3NlbiBuYXR1ZXJsaWNoIHZvbiBkZW4gR2lsZGVubWFnaWVybiBnZW5laG1pZ3Qgd2VyZGVuLCBiZXZvciBkYXMgR2ViaWV0Cithbmdlc2NobG9zc2VuIHdpcmQuIFNwcmVjaHQgZnJ1ZWggZ2VudWcgbWl0IGRlbiBHaWxkZW5tYWdpZXJuLiBTaWUgd2VyZGVuCitldWNoIHNpY2hlciBnZW51ZyBCZWlzcGllbGUgZnVlciBkZXJhcnRpZ2UgT2JqZWt0ZSBnZWJlbiwgd2VzaGFsYiBoaWVyIGF1ZgorZGVyYXJ0aWdlcyB2ZXJ6aWNodGV0IHdpcmQuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1AgSCBBIFMgRSAyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitEdSBoYXN0IG51biBhbGxlIFJhZXVtZS9PYmpla3RlL05QQ3MgZXJzdGVsbHQuIE51biBnZWh0IGVzIGluIGRpZSBUZXN0cGhhc2UuCitFcnpldWdlIERpciBlaW5lbiBUZXN0c3BpZWxlciwgZGFtaXQgRHUgRGVpbmUgUmF1bW1lbGR1bmdlbiB3aWUgei5CLiBtaXR0ZWxzCit0ZWxsX3Jvb20oKSBhdWYgaWhyZSBSaWNodGlna2VpdCB1ZWJlcnBydWVmZW4ga2FubnN0LiBTY2hhdSBEaXIgaW4gUnVoZQorRGVpbmUgU2FjaGVuIGFuIHVuZCB2ZXJzdWNoZSwgZGllIHVuc2lubmlnc3RlbiBTYWNoZW4gZGFyaW4genUgdHVuLiBEYXMgd2VyZGVuCitkaWUgU3BpZWxlciBuYWVtbGljaCBuYWNoaGVyIGF1Y2ggbWFjaGVuLiBJc3QgRGVpbmVyIE1laW51bmcgbmFjaCBhbGxlcyBPSywKK3NjaHJlaWIgZWluZSBFbWFpbCBhbiBEZWluZSB6dXN0YWVuZGlnZW4gUk1zLiBTZWhyIGhpbGZyZWljaCAoZnVlciBkaWUgUk1zKQord2FlcmUgZWluZSB6dXNhZXR6bGljaGUgTGlzdGUgKHNpZWhlIGF1Y2ggUGhhc2UgNCkgbWl0OgorCisxKSBhbGxlbiBOUENzICh3ZWxjaGUgT2JqZWt0ZSB0cmFnZW4gc2llKSB1bmQgYWxsZmFlbGxpZ2UgU29uZGVyZnVua3Rpb25lbgorICAgZ2FueiBrdXJ6IGVybGFldXRlcnQuCisyKSBFaW5lIExpc3RlIGFsbGVyIE9iamVrdGUuIEJlaSBrb21wbGl6aWVydGVuIE9iamVrdGVuIGVpbmUga3VyemUgQmVzY2hyZWlidW5nCiszKSBFaW5lIExpc3RlLCBpbiB3ZWxjaGVtIFJhdW0gbGllZ3Qgd2VsY2hlcyBPYmpla3QvWlQvSGVpbHN0ZWxsZS9OUEMKKworRGllc2UgTGlzdGUga2FubnN0IER1IG5hdHVlcmxpY2ggaW4gRGVpbiAvZG9jIFZlcnplaWNobmlzIGxlZ2VuLCB3YXMgZGFubiBhdWNoCitzcGFldGVyIHNlaHIgaGlsZnJlaWNoIHNlaW4ga2Fubi4KKworRmFsbHMgc2ljaCBEZWluZSBSTXMgbmljaHQgbWVsZGVuLCBzcHJpY2ggc2llIGFuLCBtYWlsIGlobmVuIG5vY2htYWwuCitWaWVsbGVpY2h0IGhhYmVuIHNpZSBEZWluZSBNYWlsIHZlcmdlc3Nlbi4gUk1zIHNpbmQgcHJpbnppcGllbGwgdmVyZ2Vzc2xpY2guCitTaWUgdW50ZXJoYWx0ZW4gc2ljaCBqZWRvY2ggc2ljaGVybGljaCBnZXJuIG1pdCBEaXIuIEtlaW5lIGZhbHNjaGUKK0Jlc2NoZWlkZW5oZWl0LCByYW4gYW4gZGVuIEZlaW5kLgorCistIFRlc3RzcGllbGVyIC0gICBvZGVyICAgLSBad2lzY2hlbiBMZWdhbGl0YWV0IHVuZCBXYWhuc2lubiAtCisKK0thdW0gZWluIE1hZ2llciBrYW5uIGRpZSBtZXJrd3VlcmRpZ2VuLCBvZnQgd2lkZXJzaW5uaWdlbiB1bmQga3JhbmtlbgorR2VkYW5rZW5nYWVuZ2UgZWluZXMgU3BpZWxlcnMgbmFjaHZvbGx6aWVoZW4uIERlc2hhbGIgaXN0IGVzIGVpbmUgZ3V0ZQorU2FjaGUsIHNlaW4gR2ViaWV0IHZvbiBTcGllbGVybiB0ZXN0ZW4genUgbGFzc2VuLiBTaWUga29lbm5lbiBkaWUgU3RhZXJrZQorZGVyIE5QQ3MgZ3V0IGVpbnNjaGFldHplbiB1bmQga29ycmlnaWVyZW4sIGtlbm5lbiBkaWUgZ2VoZWltZW4gS25pZmZlIGRlcgorR2lsZGVuIHVuZCBtYWNoZW4gZ2VuZXJlbGwgZGFzLCB3b3JhbiBtYW4gbmllIGdlZGFjaHQgaGF0LgorCitTcGllbGVydGVzdGllcyBzaW5kIHNvIGVpbmUgU2FjaGUuIEFscyBlcnN0ZXMgbXVzcyBtYW4ga29tcGV0ZW50ZSBTcGllbGVyCitmaW5kZW4sIHdlbGNoZSBiZXJlaXQgc2luZCwgZGFzIEdlYmlldCB6dSB0ZXN0ZW4uIERpZXMgaXN0IG5pY2h0IGVpbmZhY2gsCitkZW5uIGRpZSB3aXJrbGljaCBndXRlbiBUZXN0ZXIgc2luZCBvZnQgaG9mZm51bmdzbG9zIHVlYmVyYmVsZWd0LiBIYXQgbWFuCitlaW5lbiB3aWxsaWdlbiBTcGllbGVyIGdlZnVuZGVuLCBrcmVpZXJ0IG1hbiBzaWNoIGVpbmVuIFRlc3RzcGllbGVyLCBpbmRlbQorbWFuIGVpbmVuIG5ldWVuIFNwaWVsZXIgZWlubG9nZ3QgdW5kIGltIFBfVEVTVFBMQVlFUiBhdWYgZGVuIGVpZ2VuZW4gTmFtZW4KK3NldHp0LiBEYXMga2FubnN0IER1IHouQi4gc28gbWFjaGVuOiAKK3hjYWxsIHRlc3RpLT5TZXRQcm9wKFBfVEVTVFBMQVlFUiwiPE1hZ2llcj4iKSB3b2JlaSA8TWFnaWVyPiBEZWluIE5hbWUgaXN0LgorCitEYW5hY2ggZGFyZiBtYW4gaWhuIHdpbGQgaW4gR2lsZGVuIGVpbnRyZXRlbiBsYXNzZW4sIGlobSBzZWluZSAKK1dlcnRlIHNldHplbiB1bmQgaWhtIEF1c3J1ZXN0dW5nIGNsb25lbi4gRXMgZ2lidCBlaW5pZ2Ugc2Nob2VuZQorVGVzdHNwaWVsZXItVG9vbHMsIG1pdCBkZW5lbiBzaWNoIFRlc3RpZXMgUnVlc3R1bmdlbiBzZXR6ZW4gdW5kIHNpY2ggaGVpbGVuCitrb2VubmVuLgorCitIYXQgbWFuIFNwaWVsZXIgdW5kIFRlc3RzcGllbGVyLCBzbyBrb21tdCBtYW4gYW4gZGllIGxlZ2FsZW4gUHJvYmxlbWUuIEFsbGVzCit3aWNodGlnZSBlcmZhZWhydCBtYW4gZHVyY2ggJ2hpbGZlIHRlc3RzcGllbGVyJy4gRG9ydCBzdGVodCwgZGFzcworVGVzdHNwaWVsZXIgYmVpIEVyem1hZ2llcm4gYW5nZW1lbGRldCB3ZXJkZW4gbXVlc3Nlbiwgd2VsY2hlIHNpZSBkYW5uIGluIGVpbgorVWViZXJ3YWNodW5nc3Rvb2wgZWludHJhZ2VuLCBzbyBkYXNzIHNlaW5lIEhhbmRsdW5nZW4gZ2Vsb2dndCB3ZXJkZW4uIAorVGF0c2FjaGUgaXN0LCBkYXNzIHNpY2ggYWJlciBrYXVtIGVpbmVyIHNlaW5lIFRlc3RzcGllbGVyIGJlaSBlaW5lbQorRXJ6bWFnaWVyIGFubWVsZGV0IHVuZCBkaWUgbWVpc3RlbiBFTXMgZGFzIHNlbGJzdCBuaWNodCB0dW4uIChUZXN0aWVzIG5ldWVyCitHaWxkZW4gbW9lZ2VuIGhpZXIgZWluZSBBdXNuYWhtZSBiaWxkZW4pLgorCitHZW5lcmVsbCBiZWFjaHRlIGZvbGdlbmRlczogTWFjaCBrZWluZSBTcGllbGVyIHp1IFRlc3RzcGllbGVybiwgZGVuZW4gRHUgbmljaHQKK3RyYXVzdCBvZGVyIGRpZSBEdSBuaWNodCBrZW5uc3QuIFdlbm4gZWluIFNwaWVsZXIgbWl0IHNlaW5lbiBUb29scyBkdXJjaHMgTUcKK2xhZXVmdCB1bmQgVW5zaW5uIGFuc3RlbGx0LCBiaXN0IER1IG1pdCBTY2h1bGQsIGVnYWwgb2IgZGVyIFRlc3RpZQorYW5nZW1lbGRldCBpc3Qgb2RlciBuaWNodC4gV2VubiBEdSBlaW5lbiBTcGllbGVyIGR1cmNoIGVpbiBHZWJpZXQgbGF1ZmVuCitsYWVzc3QsIGJldm9yIGRpZSBGUHMgZWluZ2V0cmFnZW4gd3VyZGVuLCBkYW5uIGlzdCBkYXMgbmljaHQgbGVnYWwsIGFiZXIgZXMKK3dpcmQga2VpbmVyIG1lY2tlcm4sIHdlbm4gRHUgaWhuIHVlYmVyd2FjaHN0IHVuZCBzb21pdCBhdWZwYXNzdCwgZGFzcyBlcgora2VpbmVuIFVuc2lubiBhdXNzZXJoYWxiIGRlcyBHZWJpZXRzIGFuc3RlbGx0LiBXZW5uIER1IGVpbmVuIFNwaWVsZXIgZHVyY2gKK2VpbiBHZWJpZXQgbWl0IEZQcyBsYXVmZW4gbGFlc3N0IHVuZCBkZXIgU3BpZWxlciBkaWUgdm9uIGlobSBnZWZ1bmRlbmVuIEZQcworYmVrb21tZW4gd2lsbCwgc28gbXVzc3QgRHUgaWhuIGJlaSBlaW5lbSBFcnptYWdpZXIgYW5tZWxkZW4sIGRlbm4gRlBzIGthbm4KK251ciBlaW4gRXJ6bWFnaWVyIHNldHplbi4KKworT2gsIHVuZCBzY2hyZWliZSBEaXIgZGllIE5hbWVuIHVuZCBQYXNzd29lcnRlciBEZWluZXIgVGVzdHNwaWVsZXIgYXVmLiBGYWxscworbWFuIG1laHJlcmUgaGF0LCB2ZXJnaXNzdCBtYW4gdmVyZmx1Y2h0IHNjaG5lbGwgZGllIE5hbWVuIDotKS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUCBIIEEgUyBFIDMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0RpZSBSTXMgc2NoYXVlbiBhbGxlIEZpbGVzIGFuLCBkaWUgRHUgZXJ6ZXVndCBoYXN0LiBEYW5hY2ggd2VyZGVuIHNpZSBEaXIKK2VpbmUgTGlzdGUgenVydWVja3NjaGlja2VuIG1pdCBhbGxlbiBQcm9ibGVtZmFlbGxlbiwgZGllIHNpZSBnZWZ1bmRlbiBoYWJlbi4KK0plIG5hY2ggVW1mYW5nIERlaW5lcyBHZWJpZXRlcyBrYW5uIGRhcyBuYXR1ZXJsaWNoIGV0d2FzIGRhdWVybi4KK0hhc3QgRHUgZGllIEluZm9ybWF0aW9uZW4genVydWVja2Jla29tbWVuLCBrYW5uc3QgRHUgRGljaCBhbiBkZW4gRmVpbnNjaGxpZmYKK21hY2hlbi4gSW4gZGVyIFp3aXNjaGVuemVpdCBzb2xsdGVzdCBEdSBQaGFzZSA0IHVuZCBQaGFzZSA1IGVybGVkaWdlbi4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUCBIIEEgUyBFIDQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0ZhbGxzIER1IE9iamVrdGUgaGFzdCwgZGllIGdlbmVobWlndW5nc3BmbGljaHRpZyBzaW5kIChtYW4gYmFsYW5jZSksIHNvIG11c3N0CitEdSBlaW5lbiBBbnRyYWcgYW4gZGFzIEJhbGFuY2V0ZWFtIHN0ZWxsZW4uIEluIGRlciBad2lzY2hlbnplaXQgc29sbHRlIERlaW4KK01hZ2llcmxldmVsIHNvIGhvY2ggc2VpbiwgZGFzcyBEdSBkZW4gQmVmZWhsICdnb3RvJyBiZW51dHplbiBrYW5uc3QuIEVzCitnaWJ0IGVpbmVuIEV4dHJhIFJhdW0gZnVlciBkaWUgQmFsYW5jZWFudHJhZWdlOiAKK2dvdG8gL3BsYXllcnMvcGFyYWNlbHN1cy9vZmZpY2UKK0RvcnQgZ2lidCBlcyBkYW5uIGVpbmUgZ3V0ZSBIaWxmZXNlaXRlLgorV2ljaHRpZ2VzIHp1bSBBbnRyYWc6IG1hY2ggYml0dGUgbmljaHQgZnVlciBqZWRlcyBPYmpla3QgZWluZW4gZWlnZW5lbgorQW50cmFnLCBzb25kZXJuIHNjaHJlaWJlIERpciBlaW5lbiBncm9zc2VuIEFudHJhZywgaW4gZGVuIGFsbGUgRGVpbmUKK09iamVrdGUgcmVpbmtvbW1lbiwgZGllIGRlciBCYWxhbmNlIHZvcmdlbGVndCB3ZXJkZW4gbXVlc3NlbiAoc2llaGUgUGhhc2UgMjoKK2F1cyBkZXIgTGlzdGUsIGRpZSBEdSBlcnN0ZWxsdCBoYXN0KS4gRGF6dSBzb2xsdGVzdCBEdSBqZWRlcyBPYmpla3Qga3VyeiAKK2Jlc2NocmVpYmVuLiBEYXp1IGtvbW1lbiBkaWUgd2ljaHRpZ3N0ZW4gV2VydGUsIGJlaSBXYWZmZW4gei5CLiBXYWZmZW5hcnQsIAorUF9XQywgUF9OUl9IQU5EUywgUF9EQU1fVFlQRSwgUF9XRUlHSFQsIHVuZCBlaW5lIGt1cnplIEJlc2NocmVpYnVuZyBkZXIgCitTb25kZXJmdW5rdGlvbmVuLgorRGFzIEJld2lsbGlnZW4gRGVpbmVyIE9iamVrdGUga2FubiBlaW5lIHppZW1saWNoIGxhbmdlIFplaXQgaW4gQW5zcHJ1Y2gKK25laG1lbiAoV29jaGVuKS4gSGllciBuaWNodCB1bmdlZHVsZGlnIHNlaW4uIERhcyBkYXVlcnQgc2VpbmUgWmVpdC4KK1dlbm4gRHUgT2JqZWt0ZSBwcm9nZ3N0LCBkaWUgYmVzdGltbXQgZHVyY2ggZGllIEJhbGFuY2UgbXVlc3NlbiwgZ2liIGRvY2gKK0RlaW5lbSBSTSBmcnVlaHplaXRpZyBCZXNjaGVpZCwgZGFzcyBlciBzaWNoIGRhcyBhbmd1Y2t0LiBEYW5uIGthbm5zdCBEdSAKK2RpZSBTYWNoZW4gYmVyZWl0cyBiZWFudHJhZ2VuLCB1bmQgaW4gZGVyIFplaXQsIGJpcyBkaWUgQW50cmFlZ2UgCitiZXdpbGxpZ3Qgd3VyZGVuLCBkaWUgYW5kZXJlbiBEaW5nZSBwcm9nZ2VuLiBEaWVzZXIgQW5zYXR6IGdpbHQgYWJlciBlaGVyCitmdWVyIE1hZ2llciwgZGllIGJlcmVpdHMgZXR3YXMgYW5nZXNjaGxvc3NlbiBoYWJlbiB1bmQgbmV1ZSBHZWJpZXRlIAorZXJzdGVsbGVuLiBGdWVyIGRlbiBOZXVsaW5nIGlzdCBlcyBlbXBmZWhsZW5zd2VydGVyLCBhbGxlcyBmZXJ0aWd6dW1hY2hlbgordW5kIGRhbm4genUgYmVhbnRyYWdlbi4gR3J1bmQ6IHNpZWhlIG9iZW46IFNvIGthbm5zdCBEdSB2b3J3ZWlzZW4sIGRhc3MgRHUKK0RpciBNdWVoZSBnZWdlYmVuIGhhc3QsIHRvbGxlIFNhY2hlbiBhdWYgZGllIEJlaW5lIHp1IHN0ZWxsZW4sIHVuZCBuaWNodAorZWluZmFjaCBlaW5lbiBOUEMgaW4gZGllIFdlbHQgc3RlbGxlbiB3aWxsc3QsIG1pdCBodW5kZXJ0ZW4gdG9sbGVyIE9iamVrdGUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1AgSCBBIFMgRSA1CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHbGVpY2h6ZWl0aWcgc29sbHRlc3QgRHUgZGllIEZvcnNjaGVycHVua3RlIGJlYW50cmFnZW4uIFdlbGNoZXIgRXJ6bWFnaWVyCitkYWZ1ZXIgenVzdGFlbmRpZyBpc3QsIGZpbmRlc3QgRHUgbWl0ICdtYW4gZXJ6bWFnaWVyJyBoZXJhdXMuIERpZSAKK0ZhdXN0cmVnZWwgbGF1dGV0OiBldHdhIDEgRlAgcHJvIDEwIFJhZXVtZS4gVmVybWVpZGUgRlAgZnVlciBEZXRhaWxzLCBkYW1pdAorZGllICdVbnRlcnN1Y2hlLVNrcmlwdGUnIGtlaW5lIENoYW5jZSBoYWJlbi4gR2VoIGxpZWJlciBzbyB2b3I6IAorRGV0YWlsOiAnZ3JhcycgLT4gJ0R1IHd1ZXJkZXN0IERpY2ggYW0gbGllYnN0ZW4gaW5zIEdyYXMgbGVnZW4uJworV2VubiBkZXIgU3BpZWxlciBkYW5uIGVpbnRpcHB0ICdsaWVnIGlucyBncmFzJyBvZGVyIHNvIGFlaG5saWNoLCBnaWIgZGFmdWVyCitkZW4gRlAsIGFiZXIgbmljaHQgZnVlcnMgVW50ZXJzdWNoZW4gdm9tIEdyYXMuCitXb2Z1ZXIgRHUgYWxsZXMgRm9yc2NoZXJwdW5rdGUgZWludHJhZ2VuIGthbm5zdCwgZXJmYWVocnN0IER1IGR1cmNoCisnaGlsZmUgZm9yc2NoZXJwdW5rdGUnLgorTWFjaGUgZWluIHBhYXIgVm9yc2NobGFlZ2UsIHVuZCBzY2hpY2sgc2llIGRhbm4gZGVtIHp1c3RhZW5kaWdlbiBFcnptYWdpZXIuCitEZXIgd2lyZCBhdXMgRGVpbmVuIFZvcnNjaGxhZWdlbiBlaW4gcGFhciByYXVzcGlja2VuIHVuZCBhbnNjaGxpZXNzZW4uCitBYmVyIGJldm9yIER1IGRhcyB0dXN0LCBtdXNzIERlaW4gR2ViaWV0IHp3aW5nZW5kIHNjaG9uIGltIFJlZ2lvbnN2ZXJ6ZWljaG5pcyAKK2xpZWdlbiwgZGFtaXQga2VpbmUgRlBzIGF1cyAvcGxheWVycyBlaW5nZXRyYWdlbiB3ZXJkZW4uCisKK0dsZWljaHplaXQgbWl0IGRlbiBGUHMgbWVsZGVzdCBEdSBhdWNoIE1pbmlRdWVzdHMgdW5kIFphdWJlcnRyYWVua2UKK2JlaSBkaWVzZW0gRXJ6bWFnaWVyIGFuLiBEdSBtdXNzdCBhbmdlYmVuLCB3aWV2aWVsZSBTdHVmZW5wdW5rdGUgZGllCitNaW5pcXVlc3QgYnJpbmdlbiBzb2xsIHVuZCBpbiB3ZWxjaGUgZGVyIDMgS2F0ZWdvcmllbiBlaW5mYWNoL21pdHRlbC9zY2h3ZXIKK0RlaW5lIFphdWJlcnRyYWVua2UgZmFsbGVuLgorCitEZW5rZSBkYXJhbiwgc3BhZXRlc3RlbnMgamV0enQgZGllIEdpbGRlbnF1ZXN0cyB1bmQgR2lsZGVub2JqZWt0ZSBiZWkgZGVuCitHaWxkZW5tYWdpZXJuIGFuenVtZWxkZW4uIFVuYW5nZW1lbGRldGVzIGRhcmYgbmljaHQgYW5nZXNjaGxvc3NlbiB3ZXJkZW4uCitXZW5kZSBEaWNoIGFsc28gZnJ1ZWggZ2VudWcgYW4gZGllc2UgTGV1dGUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1AgSCBBIFMgRSA2CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitJc3QgYWxsZXMgdm9uIGRlciBCYWxhbmNlIGdlbmVobWlndCB3b3JkZW4sIHVuZCBzaW5kIGRpZSBGUCBhbmdlc2NobG9zc2VuLAorc29sbHRlc3QgRHUgRGVpbmUgUk1zIGluZm9ybWllcmVuLiBGYWxscyBEZWluIEdlYmlldCBpbW1lciBub2NoIGltCitIZWltdmVyemVpY2huaXMgbGllZ3QsIHdpcmQgZXMgbnVuIGluIGRlaW4gUmVnaW9uc3ZlcnplaWNobmlzCit2ZXJzY2hvYmVuLiBEdSBzdGVoc3QgbnVuIGt1cnogdm9yIGRlbSBBbnNjaGxpZXNzZW4uIFVlYmVybGVnIERpciBkb2NoCitzY2hvbiBlaW5lIG5ldHRlIEJvdHNjaGFmdCwgZGllIER1IGRhbm4gaW4gZGVyIE1QQSB2ZXJvZWZmZW50bGljaGVuIHdpcnN0LgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitQIEggQSBTIEUgNworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR1JBVFVMQVRJT04hIER1IGhhc3QgZXMgZ2VzY2hhZmZ0ISBBYmVyIGpldHp0IG5pY2h0IGF1ZiBkZW4gTG9ocmJlZXJlbgorYXVzcnVoZW4uIERpZSBlcnN0ZW4gU3BpZWxlciB3ZXJkZW4gc2ljaCBlaW5maW5kZW4sIHVuZCB2aWVsZSBzaW5kCit3YW5kZWxuZGUgS29udmVyc2F0aW9uc2xleGlrb25zLCBkaWUgYXVjaCBkZW4ga2xlaW5zdGVuIEdyYW1tYXRpa2ZlaGxlciAKK2luIERlaW5lbiBCZXNjaHJlaWJ1bmdlbiBmaW5kZW4uIEFuZGVyZSBTcGllbGVyIHdlcmRlbiBEaXIgbmV1ZSBWb3JzY2hsYWVnZQorZnVlciBjb21tYW5kcyB6dXNlbmRlbiwgZGllIGluIGRpZSBlbnRzcHJlY2hlbmRlbiBSYWV1bWUgcGFzc2VuIHd1ZXJkZW4uCitJbiAvbG9nL3JlcG9ydC88bWFnaWVybmFtZT4ucmVwIHdpcmQgYXV0b21hdGlzY2ggRGVpbiBSZXBvcnQtRmlsZSBlcnpldWd0LAoraW4gZGFzIGRpZSBTcGllbGVyIGRpZSBnZWZ1bmRlbmVuIFR5cG9zLCBCdWdzIHVuZCBzb25zdGlnZSBJZGVlbiByZWluc2NocmVpYmVuLgorU2NoYXUgRGlyIERlaW4gUmVwZmlsZSBhbiwgdW5kIGFyYmVpdGUgZXMgYWIgc28gZ3V0IGVzIGdlaHQuCitOdXIgc28gd2lyZCBkYXMgR2ViaWV0IHp1IGVpbmVtIHdpcmtsaWNoICdnZXBmbGVndGVuJyBHZWJpZXQuCitEZW5rZSBkYXJhbiwgZGFzIHJlcC1GaWxlIG5hY2ggZGVtIEFiYXJiZWl0ZW4genUgbG9lc2NoZW4sIHNvbnN0IHdpcmQKK2VzIHp1IHZvbGwuCisKKworU0lFSEUgQVVDSDoKKyAgICBiYWxhbmNlLCBoaWxmZSBtYWdpZXIsIC9kb2Mvd2l6LworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiAxNjowMCAyMDAzLTAyLTIyIGJ5IEh1bW5pCmRpZmYgLS1naXQgYS9kb2Mvd2l6L2xpY2h0IGIvZG9jL3dpei9saWNodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTk1YTIzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dpei9saWNodApAQCAtMCwwICsxLDM0IEBACitFaW5lIFp1c2FtbWVuZmFzc3VuZyBhbGxlciBMaWNodHByb3BlcnRpZXMgKGZ1ZXIgZ2VuYXVlcmVzIHNpZWhlIG1hbnBhZ2VzKQorCitQX0xJR0hUICAgICAgICAgICAgICAtIGdpYnQgYW4gd2llIHN0YXJrIGVpbmUgTGljaHRxdWVsbGUgc2VsYnN0IGxldWNodGV0LgorCitQX1RPVEFMX0xJR0hUICAgICAgICAtIGdpYnQgZGFzIExpY2h0bGV2ZWwgYW4sIGRhcyB2b24gZWluZW0gT2JqZWt0IGF1c2dlaHQsCisgICAgICAgICAgICAgICAgICAgICAgIGRpZXNlcyBrYW5uICE9IFBfTElHSFQgc2Vpbiwgei5CLiB3ZWlsIGVpbmUgRmFja2VsIGluCisgICAgICAgICAgICAgICAgICAgICAgIGVpbmVtIFBha2V0IGxpZWd0LgorCitQX0lOVF9MSUdIVCAgICAgICAgICAtIExpY2h0bGV2ZWwgaW4gZWluZW0gT2JqZWt0LCB6LkIuIGVpbiBSYXVtCisgICAgICAgICAgICAgICAgICAgICAgIGdpYnQgYW4gd2llIGd1dCBkaWVzZXMgT2JqZWt0IGF1c2dlbGV1Y2h0ZXQgaXN0LgorCitQX1BMQVlFUl9MSUdIVCAgICAgICAtIGdpYnQgYW4gbWl0IHdlbGNoZW0gTGljaHRsZXZlbCBkZXIgU3BpZWxlciBnZXJhZGUgc2llaHQKKworUF9MSUdIVF9NT0RJRklFUiAgICAgLSB2ZXJhZW5kZXJ0IGRlbiBMaWNodGxldmVsIGRlciB2b24gZWluZW0gU3BpZWxlcgorICAgICAgICAgICAgICAgICAgICAgICB3YWhyZ2Vub21tZW4gd2lyZCwgei5CLiBlaW5lIFNvbm5lbmJyaWxsZQorCitQX0xJR0hUX0FCU09SUFRJT04gICAtIFdpZXZpZWwgTGljaHQgd2lyZCB2b20gUmF1bSBnZXNjaGx1Y2t0PyB3aXJrdCBzaWNoCisgICAgICAgICAgICAgICAgICAgICAgIGRpcmVrdCBhdWYgUF9JTlRfTElHSFQgZGVzIFJhdW1lcyBhdXMuIEFuZGVyZSBTcGllbGVyCisgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpdGllcmVuIHZvbiBkZW4gTGljaHRxdWVsbGVuIGlocmVyIE1pdHNwaWVsZXIKKyAgICAgICAgICAgICAgICAgICAgICAgd2VuaWdlciBiZWkgaG9laGVyZW4gV2VydGVuLiBEZWZhdWx0OiAxLgorCitQX0xJR0hUX1RSQU5TUEFSRU5DWSAtIFdpZXZpZWwgTGljaHQgc2NobHVja3QgZWluIENvbnRhaW5lciB1bmQgd2lldmllbAorICAgICAgICAgICAgICAgICAgICAgICBMaWNodCBkcmluZ3QgbmFjaCBhdXNzZW4uIERlZmF1bHR0cmFuc3BhcmVuejogMgorCitIaW53ZWlzOiBBbGxlIE9iamVrdGUgbWl0IExpY2h0bGV2ZWwgPDAgdW5kID4yIHNvd2llIGFsbGUgT2JqZWt0ZSwgZGllCisgICAgICAgICBQX0xJR0hUX01PRElGSUVSIG9kZXIgQ2xvc3VyZXMgc2V0emVuIHNpbmQgZ2VuZWhtaWd1bmdzcGZsaWNodGlnIQorICAgICAgICAgRGFmdWVyIHNpbmQgZGllIFJlZ2lvbnNtYWdpZXIgenVzdGFlbmRpZy4KKworCitTSUVIRSBBVUNIOiBQX0xJR0hUCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIExFVFpURSBBZU5ERVJVTkc6CisgICAgMjAwMi0xMS0yMSwgMTcuMzAgdm9uIFpvb2sKZGlmZiAtLWdpdCBhL2RvYy93aXovbHVwZSBiL2RvYy93aXovbHVwZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGUyM2ZlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dpei9sdXBlCkBAIC0wLDAgKzEsMjA5IEBACitBTExHRU1FSU5FUzoKKwlEaWUgTHVwZSBiZW51dHp0IGVpbmVuIFN0YXBlbCAoU3RhY2spLCB1bSBPYmpla3RlIHp1IGJlYXJiZWl0ZW4uCisJRWluaWdlIEJlZmVobGUgc2NoaWViZW4gT2JqZWt0ZSBhdWYgZGVuIFN0YXBlbCwgYW5kZXJlIHdpZWRlcnVtCisJaG9sZW4gc2llIHdpZWRlciB2b20gU3RhcGVsIGhlcnVudGVyIHVuZCBiZW51dHplbiBzaWUgZnVlciBkaWUKKwl2ZXJzY2hpZWRlbnN0ZW4gWndlY2tlLgorCU1hbiBrYW5uIGluIGVpbmVyIFplaWxlIG1laHJlcmUgS29tbWFuZG9zIGdsZWljaHplaXRpZyBhbmdlYmVuCisJKGR1cmNoIExlZXJ6ZWljaGVuIGdldHJlbm50KS4KKwlFaW5lIFplaWxlIHdpcmQgaW1tZXIgdm9uIGxpbmtzIG5hY2ggcmVjaHRzIGFiZ2VhcmJlaXRldC4KKworU0NIUkVJQldFSVNFTjoKKwk8YXJnPgktIEVpbmUgUmVpaGUgdm9uIFplaWNoZW4sIGRpZSB3ZWRlciBMZWVyemVpY2hlbiBub2NoIFB1bmt0ZQorCQkgICguKSBlbnRoYWVsdC4gRmFsbHMgZG9jaCBMZWVyemVpY2hlbiBvZGVyIFB1bmt0ZSBpbiA8YXJnPgorCQkgIGF1ZnRhdWNoZW4sIG11c3MgbWFuIGRpZSBaZWljaGVua2V0dGUgendpc2NoZW4gIi4uLiIsCisJCSAgJy4uLicgb2RlciB8Li4ufCBlaW5zY2hsaWVzc2VuLgorCTxucj4JLSBFaW5lIChwb3NpdGl2ZSBvZGVyIG5lZ2F0aXZlKSBnYW56ZSBaYWhsLgorCTxmaWxlbmFtZT4gLSBFaW4gRGF0ZWluYW1lLiBGdWVyIGlobiBnaWx0IGRhcyBHbGVpY2hlIHdpZSBmdWVyIDxhcmc+OgorCQkgIFdlbm4gZXIgUHVua3RlIGVudGhhZWx0LCBtdXNzIG1hbiBpaG4gendpc2NoZW4gIi4uLiIsCisJCSAgJy4uLicgb2RlciB8Li4ufCBlaW5zY2hsaWVzc2VuLgorCQkgIEVzIHNpbmQgYWxsZSBWYXJpYXRpb25lbiBtb2VnbGljaCwgZGllIG1hbiBhdWNoIGF1cyBkZXIKKwkJICBNYWdpZXJzaGVsbCBrZW5udDogYWJzb2x1dGUgRGF0ZWluYW1lbiAoYmVnaW5uZW4gbWl0ICIvIiksCisJCSAgRGF0ZWluYW1lbiByZWxhdGl2IHp1bSBlaWdlbmVuIEhvbWV2ZXJ6ZWljaG5pcyAoIn4vIikKKwkJICBvZGVyIHp1bSBIb21ldmVyemVpY2huaXMgZWluZXMgYW5kZXJlbiBNYWdpZXJzICgifm5hbWUvIiksCisJCSAgRGF0ZWluYW1lbiBpbiBlaW5lciBSZWdpb24gKCIrcmVnaW9uLyIpIHVuZCBEYXRlaW5hbWVuCisJCSAgcmVsYXRpdiB6dW0gYWt0dWVsbGVuIFZlcnplaWNobmlzIChhbGxlcyBhbmRlcmUgOykuCisJPGZ1bmM+CS0gTmFtZSBlaW5lciBMUEMtRnVua3Rpb24uCisJVE9TCS0gRGFzIE9iamVrdCBnYW56IG9iZW4gYXVmIGRlbSBTdGFwZWwgKFRvcCBPZiBTdGFjaykuCisKK0RFUiBTVEFQRUw6CisJQmVpIGRlbSBTdGFwZWwgaGFuZGVsdCBlcyBzaWNoIHVtIGVpbmVuIExJRk8tU3RhcGVsIChMYXN0IEluIC0gRmlyc3QKKwlPdXQpLCBkLmguIGRhcyBPYmpla3QsIGRhcyB6dWxldHp0IGF1ZiBkZW4gU3RhcGVsIGdlc2Nob2JlbiB3dXJkZSwKKwl3aXJkIGFscyBlcnN0ZXMgYmVhcmJlaXRldC4KKwlCZWkgZGVyIEJlYXJiZWl0dW5nIHdpcmQgZGVyIFRPUyBpbiBkZXIgUmVnZWwgdm9tIFN0YXBlbCBlbnRmZXJudAorCShBdXNuYWhtZW46ID0sIHN0ayB1bmQgIyksIGRlciBTdGFwZWwgd2lyZCBhbHNvIGltIExhdWZlIGRlciBaZWl0CisJd2llZGVyIGtsZWluZXIuCisJRGVyIFN0YXBlbCBrYW5uIG1heGltYWwgemVobiBFbGVtZW50ZSBhdWZuZWhtZW4uIERpZXNlcyBMaW1pdCB3aXJkCisJbWFuIGJlaSAibm9ybWFsZW0gQmV0cmllYiIgYWxsZXJkaW5ncyBzZWx0ZW4gZXJyZWljaGVuLgorCVNvbGx0ZSBlcyB0cm90emRlbSBlaW5tYWwgZW5nIHdlcmRlbiwgc3RlaGVuIGVpbmVtIG5vY2ggemVobgorCVZhcmlhYmxlbiB6dXIgVmVyZnVlZ3VuZywgaW4gZGVuZW4gbWFuIHp1c2FldHpsaWNoIE9iamVrdGUgKHZvbQorCVN0YXBlbCkgYWJsZWdlbiBrYW5uLgorCitCRUZFSExFOgorCUVzIGdpYnQgZHJlaSB1bnRlcnNjaGllZGxpY2hlIEJlZmVobHNncnVwcGVuOgorCWEpIEJlZmVobGUsIGRpZSBlaW4gT2JqZWt0IGF1ZiBkZW4gU3RhcGVsIHNjaGllYmVuOworCWIpIEJlZmVobGUsIGRpZSBtaXQgT2JqZWt0ZW4gYXVmIGRlbSBTdGFwZWwgYXJiZWl0ZW47CisJYykgQmVmZWhsZSwgZGllIG9obmUgZGVuIFN0YXBlbCBhdXNrb21tZW4uCisJRWluaWdlIEJlZmVobGUgc2V0emVuIHZvcmF1cywgZGFzIGRlciBUT1MgZWluIExlYmV3ZXNlbiBvZGVyIGdhciBlaW4KKwlTcGllbGVyb2JqZWt0IGlzdDsgYW5kZXJlIEJlZmVobGUgc2luZCBlcnN0IGFiIGVpbmVtIGJlc3RpbW10ZW4KKwlNYWdpZXJsZXZlbCB6dWdhZW5nbGljaC4gRGllcyBpc3QgYmVpIGRlbiBlbnRzcHJlY2hlbmRlbiBCZWZlaGxlbgorCWpld2VpbHMgdmVybWVya3QuCisKKyAgICBEaWVzZSBCZWZlaGxlIHNjaGllYmVuIGVpbiBuZXVlcyBPYmpla3QgYXVmIGRlbiBTdGFwZWw6CisJY3JlYXQgPGZpbGVuYW1lPiBNYWNodCBkYXMgR2xlaWNoZSB3aWUgJ25ldycsIGRhcyBPYmpla3Qgd2lyZCBhbGxlci0KKwkJCWRpbmdzIG5pY2h0IGluIERlaW4gSW52ZW50b3J5IGdlc3RlY2t0LgorCWhlcmUJCURhcyBPYmpla3QsIGluIGRlbSBtYW4gZ2VyYWRlIHN0ZWh0LCBhdWYgZGVuIFN0YXBlbAorCQkJc2NoaWViZW4uCisJbHYgPGFyZz4JU2NoaWVidCBkYXMgTGViZXdlc2VuIG1pdCBkZW0gbGl2aW5nX25hbWUgPGFyZz4gYXVmCisJCQlkZW4gU3RhcGVsLiBBQ0hUVU5HISBEYXMgbXVzcyBkYW5uIG5pY2h0IHVuYmVkaW5ndAorCQkJZGFzIExlYmV3ZXNlbiBzZWluLCBkYXMgbWFuIGRvcnQgZWlnZW50bGljaCBoYWJlbgorCQkJd2lsbCEgRXMgd2lyZCBlaW5mYWNoIGRhcyBlcnN0ZSBPYmpla3QgZ2Vub21tZW4sCisJCQlkZXNzZW4gbGl2aW5nX25hbWUgcGFzc3QhIFdlbm4gbWFuIGV0d2FzIG1pdCBlaW5lbQorCQkJTlBDIHZvcmhhdCwgZGVyIGltIGdsZWljaGVuIFJhdW0gc3RlaHQsIHNwcmljaHQgbWFuCisJCQlpaG4gYmVzc2VyIG1pdCBoZXJlLm5hbWUgYW4uCisJbWUJCVNpY2ggc2VsYnN0IGF1ZiBkZW4gU3RhcGVsIHNjaGllYmVuLgorCW5ldyA8ZmlsZW5hbWU+CUNsb25lZCBkYXMgbWl0IDxmaWxlbmFtZT4gYW5nZWdlYmVuZSBPYmpla3QgdW5kCisJCQlzY2hpZWJ0IGVzIGF1ZiBkZW4gU3RhcGVsLiBBbnNjaGxpZXNzZW5kIGJlZmluZGV0IGVzCisJCQlzaWNoIGluIERlaW5lbSBJbnZlbnRvcnkuCisJb2IgPGZpbGVuYW1lPglMYWVkdCBkYXMgT2JqZWt0LCBkYXMgbWl0IDxmaWxlbmFtZT4gYW5nZWdlYmVuIGlzdCwKKwkJCXVuZCBzY2hpZWJ0IGVzIGF1ZiBkZW4gU3RhcGVsLgorCXBsIDxhcmc+CVNjaGllYnQgZGFzIFNwaWVsZXJvYmpla3QgbWl0IGRlbSBOYW1lbiA8YXJnPiBhdWYgZGVuCisJCQlTdGFwZWwuCisJCQlFcyB3ZXJkZW4gYXVjaCBuZXR6dG90ZSBTcGllbGVyIGJlcnVja3NpY2h0aWd0LgorCXB1c2ggPGZpbGVuYW1lPiBTY2hpZWJ0IGRhcyBPYmpla3QsIGRhcyBtaXQgPGZpbGVuYW1lPiBhbmdlZ2ViZW4gaXN0LAorCQkJYXVmIGRlbiBTdGFwZWwuCisJPGZpbGVuYW1lPglNYWNodCBkYXMgZ2xlaWNoZSB3aWUgJ29iJywgZmFsbHMgPGZpbGVuYW1lPiBtaXQgIi8iCisJCQlvZGVyICJ+IiBiZWdpbm50LgorCisgICAgRGllIG5hZWNoc3RlbiBCZWZlaGxlIHNjaGFsdGVuIE9wdGlvbmVuIGRlciBMdXBlIGFuL2F1cy91bToKKwlkZXNjCQlEaWUgenVzYWV0emxpY2hlIEFuZ2FiZSBkZXIgS3VyemJlc2NocmVpYnVuZyBkZXMKKwkJCWFrdHVlbGxlbiBPYmpla3RlcyB3aXJkIHVudGVyZHJ1ZWNrdC4KKwlyZWMJCVNjaGFsdGV0IGluIGRlbiAicmVrdXJzaXYiLU1vZHVzIHVtLiBEaWVzZXIgTW9kdXMKKwkJCXdpcmQgdm9uIGZvbGdlbmRlbiBCZWZlaGxlbiBnZW51dHp0OgorCQkJJ2ludicsICdjbG4nIHVuZCAnY2xub2YnCisJCQlOYWNoIEF1c2Z1ZWhydW5nIGVpbmVzIGRpZXNlciBCZWZlaGxlIHdpcmQgZGVyCisJCQkicmVrdXJzaXYiLU1vZHVzIGF1dG9tYXRpc2NoIHdpZWRlciBhYmdlc3RlbGx0LgorCW5vcmVjCQlTdGVsbHQgZGVuICJyZWt1cnNpdiItTW9kdXMgInZvbiBIYW5kIiBhYi4KKworICAgIERpZXNlIEJlZmVobGUgc2NoaWViZW4gZWJlbmZhbGxzIGVpbiBuZXVlcyBPYmpla3QgYXVmIGRlbiBTdGFwZWwuIFNpZQorICAgIGFyYmVpdGVuIGRhYmVpIGFsbGVyZGluZ3MgcmVsYXRpdiB6dW0gVE9TLiBNYW4gbXVzcyBhbHNvIHNjaG9uIG1pbmRlc3RlbnMKKyAgICBlaW4gT2JqZWt0IGF1ZiBkZW4gU3RhcGVsIGdlc2Nob2JlbiBoYWJlbi4gRGVyIGFsdGUgVE9TIHdpcmQgZGFiZWkgaW4gZGVyCisgICAgUmVnZWwgZW50ZmVybnQuCisJLjxucj4JCVNjaGllYnQgZGFzIDxucj50ZSBPYmpla3QgaW0gSW52ZW50b3J5IGRlcyBUT1MgYXVmIGRlbgorCQkJU3RhcGVsLgorCS48YXJnPgkJU2NoaWVidCBkYXMgT2JqZWt0IG1pdCBkZXIgSUQgPGFyZz4gaW0gSW52ZW50b3J5IGRlcworCQkJVE9TIGF1ZiBkZW4gU3RhcGVsLgorCTw8bnI+CQlTY2hpZWJ0IGRpZSBWYXJpYWJsZSA8bnI+IGF1ZiBkZW4gU3RhcGVsLiBBbHMgPG5yPgorCQkJc2luZCBXZXJ0ZSB6d2lzY2hlbiAwIHVuZCA5IG1vZWdsaWNoLgorCUA8bnI+CQlTY2hpZWJ0IGRhcyA8bnI+dGUgT2JqZWt0IHZvbiBvYmVuIG5vY2ggZWlubWFsIGF1ZiBkZW4KKwkJCVN0YXBlbC4gRGVyIGFsdGUgVE9TIGhhdCBkaWUgTnVtbWVyIDAuIFdlZGVyIGRlciBhbHRlCisJCQlUT1Mgbm9jaCBkYXMgdmVyc2Nob2JlbmUgT2JqZWt0IHdlcmRlbiB2b20gU3RhcGVsIGVudC0KKwkJCWZlcm50LgorCQkJQDEgaXN0IGFuYWxvZyB6dSAnb3ZlcicuCisJY29weQkJTGVndCBlaW5lIEtvcGllIGRlcyBUT1MgYW4gKGlua2wuIGFsbGVyIFByb3BlcnR5d2VydGUpCisJCQl1bmQgc2NoaWVidCBkaWVzZSBLb3BpZSBhdWYgZGVuIFN0YXBlbC4gRGllIEtvcGllCisJCQliZWZpbmRldCBzaWNoIGRhbmFjaCBpbiBEZWluZW0gSW52ZW50b3J5LgorCWR1cAkJU2NoaWVidCBkZW4gVE9TIGRvcHBlbHQgYXVmIGRlbiBTdGFwZWwuCisJZW52CQlTY2hpZWJ0IGRhcyBPYmpla3QsIGluIGRlbSBzaWNoIGRlciBUT1MgYmVmaW5kZXQsIGF1ZgorCQkJZGVuIFN0YXBlbC4KKwlvdmVyCQlTY2hpZWJ0IGRhcyBPYmpla3QsIGRhcyBzaWNoIHVudGVyIGRlbSBUT1MgYmVmaW5kZXQsCisJCQlub2NobWFsIGF1ZiBkZW4gU3RhcGVsLiBEYWJlaSB3ZXJkZW4gd2VkZXIgZGVyIGFsdGUKKwkJCVRPUyBub2NoIGRhcyBPYmpla3QgdW50ZXIgaWhtIGVudGZlcm50LgorCXJlc3VsdAkJV2VubiBpbiBlaW5lbSBPYmpla3QgZWluZSBGdW5rdGlvbiBhdWZnZXJ1ZmVuIHd1cmRlLAorCQkJdW5kIGRpZXNlIEZ1bmt0aW9uIHdpZWRlciBlaW4gT2JqZWt0IHp1cnVlY2tnZWdlYmVuCisJCQloYXQsIHNvIHdpcmQgZGllc2VzIE9iamVrdCBhdWYgZGVuIFN0YXBlbCBnZXNjaG9iZW4uCisJc3dhcAkJVGF1c2NodCBUT1MgdW5kIGRhcyBkYXJ1bnRlciBsaWVnZW5kZSBFbGVtZW50IGdlZ2VuLQorCQkJZWluYW5kZXIgYXVzLgorCisgICAgRGllIG5hZWNoc3RlbiBCZWZlaGxlIGFyYmVpdGVuIG1pdCBkZW4gYXVmIGRlbSBTdGFwZWwgbGllZ2VuZGVuIE9iamVrdGVuLgorICAgIERhYmVpIHdlcmRlbiBkaWUgYmVhcmJlaXRldGVuIE9iamVrdGUgaW4gZGVyIFJlZ2VsIHZvbSBTdGFwZWwgZW50ZmVybnQuCisJPjxucj4JCVNwZWljaGVydCBkZW4gVE9TIGluIGRlciBWYXJpYWJsZW4gPG5yPi4gQWxzIDxucj4KKwkJCXNpbmQgV2VydGUgendpc2NoZW4gMCB1bmQgOSBtb2VnbGljaC4KKwk9CQlaZWlndCBkZW4gVE9TLiBEaWVzZXIgYmxlaWJ0IGRhYmVpIHVudmVyYWVuZGVydC4KKwkjCQlEZXIgU3RhY2sgYmxlaWJ0IHVlYmVyIGRhcyBuYWVjaHN0ZSBLb21tYW5kbyBoaW5hdXMKKwkJCWVyaGFsdGVuLgorCWludgkJWmVpZ3QgZGFzIEludmVudG9yeSBkZXMgVE9TLiBEZXIgVE9TIGJsZWlidCBkYWJlaQorCQkJdW52ZXJhZW5kZXJ0LgorCWNsbgkJRW50ZmVybnQgYWxsZSBPYmpla3RlIGF1cyBkZW0gSW52ZW50b3J5IGRlcyBUT1MuIEVzCisJCQl3ZXJkZW4gYWxsZXJkaW5ncyBrZWluZSBTcGllbGVyIGVudGZlcm50LgorCWNsbm9mIDxhcmc+CUVudGZlcm50IGFsbGUgT2JqZWt0ZSwgZGllIGF1ZiBkaWUgSUQgPGFyZz4gYW5zcHJlLQorCQkJY2hlbiwgYXVzIGRlbSBJbnZlbnRhciBkZXMgVE9TLgorCWNscgkJTG9lc2NodCBkZW4gZ2VzYW10ZW4gU3RhY2suCisJRGVzdAkJRGVyIFRPUyB3aXJkIHplcnN0b2VydC4gRGFzIGdlaHQgYWxsZXJkaW5ncyBOSUNIVCwKKwkJCXdlbm4gZGVyIFRPUyBlaW4gU3BpZWxlcm9iamVrdCBvZGVyIGRpZSBMdXBlIHNlbGJzdAorCQkJaXN0LgorCWRlc3QJCVdpZSBEZXN0LCBhbGxlcmRpbmdzIHdpcmQgenVlcnN0IFRPUy0+cmVtb3ZlKCkgYXVmLQorCQkJZ2VydWZlbiwgdW0gZGVtIFRPUyBkaWUgTW9lZ2xpY2hrZWl0IHp1IGdlYmVuLCBub2NoCisJCQloaW50ZXIgc2ljaCBhdWZ6dXJhZXVtZW4uCisJZGluZm8JCUdpYnQgZWluaWdlIEdhbWVEcml2ZXItaW50ZXJuZSBJbmZvcm1hdGlvbmVuIHdpZSB6Qi4KKwkJCWRpZSBaZWl0IGRlcyBuYWVjaHN0ZW4gcmVzZXQoKS1BdWZydWZzIG9kZXIgZGllIGFuLQorCQkJZ2VzYW1tZWx0ZSBldmFsY29zdCBkZXMgVE9TIGF1cy4KKwlkaXNjbwkJVW50ZXJicmljaHQgZGllIFZlcmJpbmR1ZyBkZXMgVE9TIChtdXNzIGVpbiBha3RpdmVyCisJCQlTcGllbGVyIHNlaW4pIHp1bSBNRyAoZGlzY29ubmVjdCkuCisJaGwJCVplaWd0IGRpZSBIaXN0b3J5bGlzdGUgZGVzIFRPUyBhbiAoaGllcmJlaSBtdXNzIGVzCisJCQlzaWNoIHVtIGVpbmVuIFNwaWVsZXIgaGFuZGVsbikuCisJCQlEaWVzZXIgQmVmZWhsIHN0ZWh0IGFiIEVMREVSX0xWTCAoNTApIHp1ciBWZXJmdWVndW5nLgorCQkJISEhRnVlciBkaWUgQmVudXR6dW5nIGdpbHQgZGFzIEdsZWljaGUgd2llIGZ1ZXIgZGFzCisJCQlTbm9vcGVuISEhCisJaWRsZQkJR2lidCBhbiwgd2llIGxhbmdlIGRlciBUT1Mgc2Nob24gaWRsZXQuIChEZXIgVE9TCisJCQlzb2xsdGUgZGFiZWkgbmF0dWVybGljaCBlaW4gU3BpZWxlciBzZWluKS4KKwlpbmZvCQlHaWJ0IGVpbmlnZSBJbmZvcm1hdGlvbmVuIHVlYmVyIGRlbiBUT1MgYXVzLgorCWluaGVyaXRfbGlzdAlHaWJ0IGRlbiBWZXJlcmJ1bmdzYmF1bSBkZXMgVE9TIGF1cyAoYWxsZXJkaW5ncyBuaWNodAorCQkJc2VociBiYXVtZm9lcm1pZyA7KQorCWludgkJWmVpZ3QgZGFzIEludmVudG9yeSBkZXMgVE9TIGFuLgorCisJbWFrZQkJRnVlaHJ0IGVpbiBVcGRhdGUgZGVzIFRPUyBkdXJjaC4gR2VodCBuaWNodCBiZWkKKwkJCVNwaWVsZXJuISBEYWZ1ZXIgZ2lidCBlcyByZW5ldy4KKwltaW5mbwkJR2lidCBlaW5pZ2UgSW5mb3JtYXRpb25lbiB1ZWJlciBkZW4gU3BlaWNoZXJ2ZXJicmF1Y2gKKwkJCWRlcyBUT1MgYXVzLgorCW1vdmUsIG1vdiwgbW8JRGFzIE9iamVrdCwgZGFzIHVudGVyIGRlbSBUT1Mgc3RlaHQsIHdpcmQgaW4gZGVuIFRPUworCQkJZ2Vtb3ZlZC4gQmVpZGUgT2JqZWt0ZSB3ZXJkZW4gZGFiZWkgdm9tIFN0YXBlbCBlbnQtCisJCQlmZXJudC4KKwlfbW92ZSwgX21vdiwgX21vLCBfbXYKKwkJCURhcyBPYmpla3QsIGRhcyB1bnRlciBkZW0gVE9TIHN0ZWh0LCB3aXJkIGluIGRlbiBUT1MKKwkJCWdlbW92ZWQsIG9obmUgZGFzcyBkb3J0IGluaXQoKSBhdWZnZXJ1ZmVuIHdpcmQuIEJlaWRlCisJCQlPYmpla3RlIHdlcmRlbiBkYWJlaSB2b20gU3RhcGVsIGVudGZlcm50LgorCQkJRGllc2VyIEJlZmVobCBzdGVodCBhYiBBUkNIX0xWTCAoNjApIHp1ciBWZXJmdWVndW5nLgorCXBvcAkJRW50ZmVybnQgZGVuIFRPUy4KKwlyZW5ldwkJQWVobmxpY2ggd2llICdtYWtlJywgZGVyIFRPUyBtdXNzIGFsbGVyZGluZ3MgZWluCisJCQlTcGllbGVyIHNlaW4uIEFDSFRVTkchIE1hbiBzb2xsdGUgbmljaHQgImVpbmZhY2ggc28iCisJCQlTcGllbGVyICdyZW5ldydlbiwgc29uZGVybiBudXIgZGFubiwgd2VubiBlcyB3aXJrbGljaAorCQkJZ2VyZWNodGZlcnRpZ3QgaXN0IQorCXNjYW4sIHNjCUtvbWJpbmllcnQgJ3N0YXQnIHVuZCBmaW5nZXIuIERlciBUT1MgbXVzcyBlaW4gTGViZS0KKwkJCXdlc2VuIHNlaW4uCisJc3RhdAkJR2lidCBJbmZvcm1hdGlvbmVuIHVlYmVyIFp1c3RhbmQsIEF1c3J1ZXN0dW5nLCBnZS0KKwkJCWxvZXN0ZSBRdWVzdHMgZXRjLiBkZXMgVE9TIGF1cy4gRGVyIFRPUyBtdXNzIGRhYmVpCisJCQllaW4gTGViZXdlc2VuIHNlaW4uCisJc3RrCQlaZWlndCBkZW4gZ2VzYW10ZW4gU3RhY2suIERpZXNlciBibGVpYnQgZGFiZWkgdW52ZXItCisJCQlhZW5kZXJ0LgorCVs8ZnVuYz5dCVJ1ZnQgaW0gVE9TIGRpZSBGdW5rdGlvbiA8ZnVuYz4gb2huZSBQYXJhbWV0ZXIgYXVmLgorCQkJRmFsbHMgZGllc2UgRnVua3Rpb24gZWluIE9iamVrdCB6dXJ1ZWNrZ2lidCwga2FubiBtYW4KKwkJCWRpZXNlcyBhbnNjaGxpZXNzZW5kIG1pdCByZXN1bHQgYXVmIGRlbiBTdGFwZWwKKwkJCXNjaGllYmVuLgorCVs8ZnVuYz4gPGFyZzE+IC4uLiA8YXJnbj5dCisJCQlSdWZ0IGltIFRPUyBkaWUgRnVua3Rpb24gPGZ1bmM+IG1pdCBkZW4gUGFyYW1ldGVybgorCQkJPGFyZzE+IGJpcyA8YXJnbj4gYXVmLiBEaWUgUGFyYW1ldGVyIHNpbmQgbWl0IExlZXItCisJCQl6ZWljaGVuIHp1IHRyZW5uZW4uIEVudGhhbHRlbiBkaWUgUGFyYW1ldGVyIHNlbGJzdAorCQkJTGVlcnplaWNoZW4sIHNvIHNpbmQgc2llIGluICIuLi4iLCAnLi4uJyBvZGVyIHwuLi58CisJCQllaW56dXNjaGxpZXNzZW4uCisJCQlNaXR0ZWxzIEA8bnI+IGthbm4gbWFuIGF1Y2ggT2JqZWt0ZSwgZGllIHNpY2ggYXVmIGRlbQorCQkJU3RhcGVsIGJlZmluZGVuLCBhbHMgQXJndW1lbnRlIGFuZ2ViZW4uCisKKyAgICBEaWUgZm9sZ2VuZGVuIEJlZmVobGUga29tbWVuIG9obmUgT2JqZWt0ZSBhdWYgZGVtIFN0YWNrIGF1czoKKwljYWxsX291dAlHaWJ0IGVpbmUgTGlzdGUgYWxsZXIgT2JqZWt0ZSBtaXQgZWluZW0gbGF1ZmVuZGVuCisJCQljYWxsX291dCBhdXMuCisJZHVtcAkJU2NocmVpYnQgZGllIExpc3RlbiBhbGxlciBPYmpla3RlIG1pdCBha3RpdmVtCisJCQloZWFydF9iZWF0IHVuZCBhbGxlciBPYmpla3RlIG1pdCBsYXVmZW5kZW0gY2FsbF9vdXQKKwkJCWluIGRpZSBEYXRhaSBMSVNUUy5MVVBFIGluIERlaW4gSG9tZXZlcnplaWNobmlzLgorCWR1bXBoaXN0cwlTY2hyZWlidCBkaWUgQmVmZWhsc2hpc3RvcnkgYWxsZXIgbW9tZW50YW4gZWluZ2UtCisJCQlsb2dndGVuIFNwaWVsZXIgbmFjaCAvbG9nL0FSQ0gvSEQuCisJCQlEaWVzZXIgQmVmZWhsIHN0ZWh0IGVyc3QgYWIgQVJDSF9MVkwgKDYwKSB6dXIKKwkJCVZlcmZ1ZWd1bmcuCisJaGVhcnRfYmVhdAlHaWJ0IGVpbmUgTGlzdGUgYWxsZXIgT2JqZWt0ZSBtaXQgYWt0aXZlbSBoZWFydF9iZWF0CisJCQlhdXMuCisJcnVzYWdlCQlaZWlndCBlaW5pZ2UgSW5mb3MgdWViZXIgZGVuIFJlc3NvdXJjZW5nZS0vLXZlcmJyYXVjaAorCQkJZGVzIE11ZHMgYW4uCisJc3dobwkJWmVpZ3QgKHNvIGd1dCB3aWUpIGFsbGUgYWt0aXZlbiBTbm9vcHMuCisJdmFycwkJWmVpZ3QgZGllIGJlbGVndGVuIFZhcmlhYmxlbiBhbi4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogV2VkIEp1biAyNiAxNDo0OTowMiAxOTk2IGJ5IFdhcmdvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy93aXovbWF0ZXJpYWwgYi9kb2Mvd2l6L21hdGVyaWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZjgwMjIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd2l6L21hdGVyaWFsCkBAIC0wLDAgKzEsOTggQEAKK01hdGVyaWFsaWVuCis9PT09PT09PT09PQorCisgICAgIE1hdGVyaWFsaWVuIGluIE1vcmdlbmdyYXVlbiBrb2VubmVuIHVlYmVyIGRpZSBQcm9wZXJ0eSBQX01BVEVSSUFMIGplZGVtIAorICAgICBPYmpla3QgaW0gU3BpZWwgenVnZW9yZG5ldCB3ZXJkZW4uIFVlYmVyIGRpZSBNYXRlcmlhbGllbmRhdGVuYmFuayAKKyAgICAgc3RlaGVuIGRhZnVlciBqZWRlIE1lbmdlIE1hdGVyaWFsaWVuIHp1ciBWZXJmdWVndW5nLiBXZW5uIG1vZWdsaWNoLCAKKyAgICAgc29sbHRlbiBkaWVzZSBhdWNoIGJlbnV0enQgd2VyZGVuLCBlcyB3ZXJkZW4gRGVmYXVsdG1hdGVyaWFsaWVuIAorICAgICBnZXNldHp0LCBkaWVzZSBlbnRzcHJlY2hlbiBhYmVyIHNlbHRlbiBldXJlciBSZWFsaXRhZXQuCisKKyAgICAgRGllIE1hdGVyaWFsaWVuZGF0ZW5iYW5rIC9zZWN1cmUvbWF0ZXJpYWxkYi5jIGhhZWx0IHNhZW10bGljaGUgCisgICAgIEluZm9ybWF0aW9uZW4gdWViZXIgZGllIHZlcndlbmRiYXJlbiBNYXRlcmlhbGllbiwgZGllIHVudGVyIAorICAgICAvc3lzL3RoaW5nL21hdGVyaWFsLmggYXVmZ2VmdWVocnQgc2luZC4gRXMgZW1wZmllaGx0IHNpY2ggU0VIUiwgVmVyd2Vpc2UKKyAgICAgYXVmIGRpZSBNYXREQiBudXIgaW4gRm9ybSB2b24gTUFURVJJQUxEQiB6dSBmb3JtdWxpZXJlbi4KKyAgICAgU2llIHZlcndhbHRldCBhdWNoIGRpZSBFaWdlbnNjaGFmdGVuIGVpbnplbG5lciBNYXRlcmlhbGllbi4gRXMgZ2lidCAKKyAgICAgZGl2ZXJzZSBNYXRlcmlhbGllbmdydXBwZW4gd2llICJlbnRmbGFtbWJhciIsICJNZXRhbGwiLCAiYmlvbG9naXNjaGVzIAorICAgICBNYXRlcmlhbCIsIGRlbmVuIGRpZSBNYXRlcmlhbGllbiBlbnRzcHJlY2hlbmQgenVnZW9yZG5ldCBzaW5kLiBEaWVzZSAKKyAgICAgSW5mb3JtYXRpb25lbiBrb2VubmVuIG1pdCBlbnRzcHJlY2hlbmRlbiBNZXRob2RlbiBhYmdlcnVmZW4vYXVzZ2V3ZXJ0ZXQgCisgICAgIHdlcmRlbi4KKyAgICAgRGFydWViZXIgaGluYXVzIHNpbmQgTWF0ZXJpYWxpZW4gYmVpIGRlciBFcmtlbm51bmcgbWl0IGFuZGVyZW4gCisgICAgIE1hdGVyaWFsaWVuIHZlcndlY2hzZWxiYXIuIFdpZSBkYXMgZ2VuYXUgZnVua3Rpb25pZXJ0LCBpc3QgaW4gIm1hbiAKKyAgICAgbWF0ZXJpYWxlcmtlbm51bmciIGF1c2dlZnVlaHJ0LgorCisgICAgIFBfTUFURVJJQUw6CisgICAgICAgRGllIFByb3BlcnR5IFBfTUFURVJJQUwgaXN0IGdydW5kc2FldHpsaWNoIGVpbiBNYXBwaW5nLCBpbiBkZW0genUgCisgICAgICAgamVkZW0gTWF0ZXJpYWwgZGVyIEFudGVpbCBhbiBkZW0gT2JqZWt0IHN0ZWhlbiBzb2xsdGUsIFouQi4ga2FubiAKKyAgICAgICBlaW4gU3BlZXIgenUgODAlIGF1cyBIb2x6IHVuZCB6dSAyMCUgYXVzIE1ldGFsbCAoU3BlZXJzcGl0emUpIAorICAgICAgIGJlc3RlaGVuOgorCisJU2V0UHJvcChQX01BVEVSSUFMLCAoW01BVF9NSVNDX01FVEFMOjIwLE1BVF9NSVNDX1dPT0Q6ODBdKSkKKworICAgICAgIChadXIgVmVyZWluZmFjaHVuZyBpc3QgZXMgZXJsYXVidCwgYmVpIFNldFByb3AgZWluIGVpbnplbG5lcyBNYXRlcmlhbCAKKyAgICAgICAgb2RlciBlaW4gQXJyYXkgYXVzIE1hdGVyaWFsaWVuIGFuenVnZWJlbiwgYmVpZGVzIHdpcmQgYXV0b21hdGlzY2ggCisgICAgICAgIHVtZ2V3YW5kZWx0IGluIGVpbiBNYXBwaW5nIG1pdCBnbGVpY2hlbiBBbnRlaWxlbiBhbGxlciBNYXRlcmlhbGllbi4pCisKKyAgICAgRGVmYXVsdHMgZvxyIFBfTUFURVJJQUw6CisJV2FmZmVuIGdlbmVyZWxsOgkgICAoW01BVF9NSVNDX01FVEFMOjEwMF0pCisJU2Nod2VydGVyOgkJICAgKFtNQVRfTUlTQ19NRVRBTDoxMDBdKQorICAgIAlNZXNzZXI6CQkJICAgKFtNQVRfTUlTQ19NRVRBTDo4MCwgTUFUX01JU0NfV09PRDoyMF0pCisJQWV4dGU6CQkJICAgKFtNQVRfTUlTQ19NRVRBTDo1MCwgTUFUX01JU0NfV09PRDo1MF0pCisJU3BlZXJlOgkJCSAgIChbTUFUX01JU0NfTUVUQUw6MjAsIE1BVF9NSVNDX1dPT0Q6ODBdKQorCUtldWxlbjoJCQkgICAoW01BVF9NSVNDX1dPT0Q6MTAwXSkKKwlSdWVzdHVuZ2VuIGdlbmVyZWxsOgkgICAoW01BVF9MRUFUSEVSOjEwMF0pCisJS29lcnBlcnJ1ZXN0dW5nZW4sIEhlbG1lLAorCVJpbmdlLCBBbXVsZXR0ZSwgU2NoaWxkZTogIChbTUFUX01JU0NfTUVUQUw6MTAwXSkKKwlVbWhhZW5nZSwgSG9zZW46CSAgIChbTUFUX0NMT1RIOjEwMF0pCisJSGFuZHNjaHVoZSwgU2NodWhlOgkgICAoW01BVF9MRUFUSEVSOjEwMF0pCisJYW5kZXJlIERpbmdlOgkJICAgKFtNQVRfTUlTQzoxMDBdKQorCisgICAgICBVZWJlcnNpY2h0IHVlYmVyIGRpZSBNZXRob2RlbiBhbiBPYmpla3RlbiAoL3N0ZC90aGluZy9kZXNjcmlwdGlvbik6CisJaW50IFF1ZXJ5TWF0ZXJpYWwoc3RyaW5nIG1hdCk6CisJLSBnaWJ0ICUgZGVzIE1hdGVyaWFsYW50ZWlscyB2b24gbWF0IGFtIE9iamVrdCB6dXJ1ZWNrCisJaW50IFF1ZXJ5TWF0ZXJpYWxHcm91cChzdHJpbmcgZ3JwKToKKwktIGdpYnQgJSBkZXMgTWF0ZXJpYWxncnVwcGVuYW50ZWlscyB2b24gZ3JwIGFtIE9iamVrdCB6dXJ1ZWNrCisJc3RyaW5nIE1hdGVyaWFsTGlzdChpbnQgY2FzdXMsIG1peGVkIGlkaW5mKToKKwktIGdpYnQgU3RyaW5nIG1pdCBadXNhbW1lbnNldHp1bmcgZGVzIE9iamVrdGVzIHp1cnVlY2sKKworICAgICAgVWViZXJzaWNodCB1ZWJlciBkaWUgTWV0aG9kZW4gYW0gTWFzdGVyIChNQVRFUklBTERCKToKKwlzdHJpbmcgKkdldE1hdE1lbWJlcnNoaXAoc3RyaW5nIG1hdCk6CisJLSBhbGxlIEdydXBwZW4sIGluIGRlbmVuIGRhcyBNYXRlcmlhbCBtYXQgaXN0CisJc3RyaW5nICpHZXRHcm91cE1lbWJlcnMoc3RyaW5nIGdycCk6CisJLSBhbGxlIE1hdGVyaWFsaWVuLCBkaWUgaW4gZGVyIEdydXBwZSBncnAgc2luZAorCXN0cmluZyBNYXRlcmlhbE5hbWUoc3RyaW5nIG1hdCwgaW50IGNhc3VzLCBtaXhlZCBpZGluZik6CisJLSBlcmdpYnQgZGllIHNwaWVsZXJsZXNiYXJlIEFuZ2FiZSBlaW5lcyBNYXRlcmlhbHMgbWF0CisJc3RyaW5nIEdyb3VwTmFtZShzdHJpbmcgZ3JwKToKKwktIGVyZ2lidCBzcGllbGVybGVzYmFyZSBBbmdhYmUgZGVyIEdydXBwZSBncnAKKwlzdHJpbmcgQ29udk1hdGVyaWFsTGlzdChtaXhlZCBtYXRzLCBpbnQgY2FzdXMsIG1peGVkIGlkaW5mKToKKyAgCS0gd2lyZCB2b24gTWF0ZXJpYWxMaXN0KCkgbWl0IGRlbiBNYXRlcmlhbGllbiBkZXMgT2JqZWt0ZXMgZ2VydWZlbgorCXZvaWQgRHVtcCgpOgorICAJLSBzY2hyZWlidCBNYXRlcmlhbGllbiB1bmQgR3J1cHBlbiBpbiAvcC9kYWVtb24vc2F2ZS9NQVRFUklBTFMKKwlzdHJpbmcgKkFsbE1hdGVyaWFscygpOgorCS0gTGlzdGUgYWxsZXIgYWt0dWVsbGVuIE1hdGVyaWFsaWVuCisJc3RyaW5nICpBbGxHcm91cHMoKToKKwktIExpc3RlIGFsbGVyIGFrdHVlbGxlbiBHcnVwcGVuCisKKyAgICAgIEZhbGxzIGV1Y2ggZWluIE1hdGVyaWFsIGZlaGx0OgorCS0gZmFsbHMgZXMga2VpbiBnZW5hdSBwYXNzZW5kZXMgTWF0ZXJpYWwgZ2lidCwgc29sbHRlIG1hbiBkYXMgYW0gCisJICBlaGVzdGVuIHBhc3NlbmRlIE1BVF9NSVNDLU1hdGVyaWFsIHZlcndlbmRlbi4KKwktIGZhbGxzIGVzIHNpY2ggbG9obmVuIHd1ZXJkZSwgZGFzIGJpc2hlciBub2NoIG5pY2h0IGRlZmluaWVydGUgCisJICBNYXRlcmlhbCBlaW56dWJhdWVuICh3ZW5uIGVzIGhhZXVmaWcgZ2VudWcgdmVyd2VuZGV0IHdpcmQpLCBiaXR0ZSAKKwkgIE1haWwgYW4gZWluZW4gRU0gKC0+IG1hbiBBZGRNYXRlcmlhbCgpICkKKwktIHZlcnNjaGllZGVuZSBFaWdlbnNjaGFmdGVuIGxhc3NlbiBzaWNoIGtvbWJpbmllcmVuLiBaLkIuIGJlc3RlaHQgCisJICBlaW4gKHVuYmVrYW5udGVzKSBleHBsb3NpdmVzIEdhcyB6dSAxMDAlIGF1cyBHYXMgdW5kIHp1IDEwMCUgYXVzIAorCSAgZXhwbG9zaXZlbSBNYXRlcmlhbC4gSW5zb2Zlcm4ga2FubiBtYW4gZXMgbWl0CisgICAgICAgICAgU2V0UHJvcChQX01BVEVSSUFMLCAoW01BVF9NSVNDX0dBUzoxMDAsIE1BVF9NSVNDX0VYUExPU0lWRToxMDBdKSkKKyAgICAgICAgICB6dXNhbW1lbnNldHplbi4KKworU0lFSEUgQVVDSDoKKyAgICAgS29uemVwdGU6CSAgbWF0ZXJpYWxlcmtlbm51bmcKKyAgICAgR3J1bmRsZWdlbmQ6IFBfTUFURVJJQUwsIC9zeXMvdGhpbmcvbWF0ZXJpYWwuaAorICAgICBNZXRob2RlbjogICAgUXVlcnlNYXRlcmlhbCgpLCBRdWVyeU1hdGVyaWFsR3JvdXAoKSwgTWF0ZXJpYWxMaXN0KCksCisgICAgIExpc3RlbjoJICBBbGxNYXRlcmlhbHMoKSwgQWxsR3JvdXBzKCksIER1bXAoKQorCQkgIG1hdGVyaWFsbGlzdGUsIG1hdGVyaWFsZ3J1cHBlbgorICAgICBNYXN0ZXI6CSAgQWRkTWF0ZXJpYWwoKSwgQ29udk1hdGVyaWFsTGlzdCgpLCBNYXRlcmlhbEdyb3VwKCksCisJCSAgR3JvdXBOYW1lKCksIE1hdGVyaWFsTmFtZSgpLAorCQkgIEdldEdyb3VwTWVtYmVycygpLCBHZXRNYXRNZW1iZXJzaGlwKCkKKyAgICAgU29uc3RpZ2VzOgkgIFBfTUFURVJJQUxfS05PV0xFREdFCisKKzcuIE1haSAyMDA0IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2Mvd2l6L21hdGVyaWFsZXJrZW5udW5nIGIvZG9jL3dpei9tYXRlcmlhbGVya2VubnVuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzYxMDZmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dpei9tYXRlcmlhbGVya2VubnVuZwpAQCAtMCwwICsxLDc5IEBACitNYXRlcmlhbGVya2VubnVuZworPT09PT09PT09PT09PT09PT0KKworICAgICBCZWkgTWF0ZXJpYWxOYW1lKG1hdCxjYXN1cyxpZGluZikgdW5kIE1hdGVyaWFsTGlzdChjYXN1cyxpZGluZikgaWQgZGVyIAorICAgICBQYXJhbWV0ZXIgPGlkaW5mPiBhbHMgQW5nYWJlIGRhZnVlciBnZWRhY2h0LCB3aWUgZ3V0IE1hdGVyaWFsaWVuIAorICAgICBlcmthbm50IHdlcmRlbiBzb2xsZW4uIEVzIHNpbmQgZm9sZ2VuZGUgQXJ0ZW4gdm9uIEFuZ2FiZW4gbW9lZ2xpY2g6CisKKyAgICAgIC0gRWluIEFycmF5CisJRGllIGVpbnplbG5lbiBBcnJheWVsZW1lbnRlIHdlcmRlbiBuYWNoIHVudGVuc3RlaGVuZGVuIFJlZ2VsbiAKKwliZWhhbmRlbHQgdW5kIGRlcmVuIEVyZ2Vibmlzc2UgYWRkaWVydC4KKyAgICAgIC0gRWluIE9iamVrdAorCUluIGRpZXNlbSBGYWxsIHdpcmQKKwlvYi0+UXVlcnlQcm9wKFBfTUFURVJJQUxfS05PV0xFREdFKQorCW5hY2ggdW50ZW5zdGVoZW5kZW4gUmVnZWxuIGJlaGFuZGVsdC4KKwlEaWVzZSBQcm9wZXJ0eSBpc3QgZnVlciByYXNzZW5hYmhhZW5naWdlIEZhZWhpZ2tlaXRlbiBnZWRhY2h0LgorICAgICAgLSBFaW5lIFphaGwKKwlJbiBkaWVzZW0gRmFsbCB3aXJkIGRlciBXZXJ0IGRpcmVrdCBhbHMgRmFlaGlna2VpdCBhbmdlc2VoZW4sIGRhcyAKKwlNYXRlcmlhbCBlcmtlbm5lbiB6dSBrb2VubmVuLgorICAgICAgLSBFaW5lIENsb3N1cmUKKwlJbiBkaWVzZW0gRmFsbCB3aXJkIGRlciBSZXR1cm53ZXJ0IHZvbgorCWZ1bmNhbGwoY2xvc3VyZSxtYXRlcmlhbCxncnVwcGVuX2luX2RlbmVuX2RpZXNlX21hdGVyaWFsX2lzdCkKKwlnZW5vbW1lbi4KKyAgICAgIC0gRWluIE1hcHBpbmcKKwlJbiBlaW5lbSBNYXBwaW5nIHNpbmQgMyBBcnRlbiB2b24gRWludHJhZWdlbiBtb2VnbGljaDoKKwktIElzdCBpbSBNYXBwaW5nIHVudGVyIDxtYXQ+IGVpbmUgWmFobCBlaW5nZXRyYWdlbiwgd2lyZCBkaWVzZSAKKwkgIGdlbm9tbWVuIHVuZCBkaWUgd2VpdGVyZW4gRWludHJhZWdlIG5pY2h0IHdlaXRlciBhdXNnZXdlcnRldC4KKyAgICAgICAgLSBEaWUgV2VydGUgdm9uIGFsbGVuIEdydXBwZW4gaW0gTWFwcGluZywgenUgZGVuZW4gZGFzIE1hdGVyaWFsCisgICAgICAgICAgZ2Vob2VydCwgd2VyZGVuIGFkZGllcnQuCisgICAgICAgIC0gRmFsbHMgZGFzIE1hcHBpbmcgZWluZW4gRWludHJhZyBNQVRFUklBTF9TWU1NRVRSSUNfUkVDT0dOSVpBQklMSVRZIAorICAgICAgICAgIGhhdCwgZGVyIGVpbiBBcnJheSB2b24gZGVyIAkgIEZvcm0KKwkJKHtncnVwcGUxLCB3ZXJ0MSwgZ3J1cHBlMiwgd2VydDIsIC4uLn0pCisJICBpc3QsIHdpcmQgZnVlciBqZWRlIGRpZXNlciBHcnVwcGVuIGRlciB6dWdlaG9lcmlnZSBXZXJ0IAorCSAgYWRkaWVydCwgZmFsbHMgZGFzIE1hdGVyaWFsIGluIGRlciBHcnVwcGUgaXN0LCB1bmQgc29uc3QgCisJICBhYmdlem9nZW4uCisgICAgICAgICAgSW0gQmVpc3BpZWw6ICh7TUFUR1JPVVBfQklPOiA1fSkgZ2lidCBlaW5lbiBFcmtlbm5ib251cyB2b24gNSUgYXVmIAorICAgICAgICAgIGFsbGUgYmlvbG9naXNjaGVuIE1hdGVyaWFsaWVuLCBhYmVyIGVpbmVuIE1hbHVzIHZvbiAtNSUgYXVmIGFsbGUgCisgICAgICAgICAgbmljaHRiaW9sb2dpc2NoZW4gTWF0ZXJpYWxpZW4uCisKKyAgICAgU2Nod2VyIGVya2VubmJhcmUgTWF0ZXJpYWxpZW4gaGFiZW4gaW4gZGVyIE1hdGVyaWFsZGF0ZW5iYW5rIGVpbmUgCisgICAgIHp1c2FldHpsaWNoZSBBbmdhYmUgZGVyIEZvcm0KKwkoe21hdDEsIHdlcnQyLCBtYXQzLCB3ZXJ0NCwgbWF0NSwgLi4uIHdlcnQobi0xKSwgbWF0KG4pfSkKKyAgICAgd29iZWkgbWF0KG4pIGRhcyBNYXRlcmlhbCBzZWxiZXIgaXN0LgorCisgICAgIERhcyBlcmthbm50ZSBNYXRlcmlhbCBpc3QgZGFzIE1hdGVyaWFsIG1hdChrKSwgYmVpIGRlbSBkaWUKKwl3ZXJ0KGstMSkgPD0gRXJrZW5udW5nc2ZhZWhpZ2tlaXQgPCB3ZXJ0KGsrMSkKKyAgICAgaXN0LiBCZWkgRXJrZW5udW5nc2ZhZWhpZ2tlaXQgMTAwIG9kZXIgbWVociB3aXJkIGRhcyBNYXRlcmlhbCBhdWYgamVkZW4gCisgICAgIEZhbGwgZXJrYW5udC4KKworICAgICBEZXIgV2VydCBmdWVyIER1cmNoc2Nobml0dHNzcGllbGVyIGlzdCAwLgorCitCRUlTUElFTDoKKyAgICAgQW5nZW5vbW1lbiwgYmVpIFBsYXRpbiB3YWVyZSBkaWUgQW5nYWJlIGluIGRlciBEYXRlbmJhbmsKKwkoe01ldGFsbCwgLTIwLCBTaWxiZXIsIDIwLCBQbGF0aW59KQorICAgICBFaW4gU3BpZWxlciBvaG5lIGJlc29uZGVyZSBFcmtlbm51bmdzZmFlaGlna2VpdGVuIChhbHNvIFdlcnQgMCkgd3VlcmRlIAorICAgICBhbHNvIFBsYXRpbiBmdWVyIFNpbGJlciBoYWx0ZW4sIGplbWFuZCwgZGVyIHZvbiBNZXRhbGxlbiBrZWluZSBBaG51bmcgCisgICAgIGhhdCAoYmVpc3BpZWxzd2Vpc2UgbWl0IGRlciBBbmdhYmUgKFtNQVRHUk9VUF9NRVRBTDotMjVdKSBpbiAKKyAgICAgUF9NQVRFUklBTF9LTk9XTEVER0UpIHNpZWh0IG51ciBub2NoLCBkYXNzIGVzIGVpbiBNZXRhbGwgaXN0IHVuZCBqZW1hbmQgCisgICAgIG1pdCB1ZWJlcmR1cmNoc2Nobml0dGxpY2hlciBGYWVoaWdrZWl0IGVya2VubnQgUGxhdGluIGFscyBkYXMsIHdhcyBlcyAKKyAgICAgaXN0LgorCisgICAgIFBfTUFURVJJQUxfS05PV0xFREdFIGtvZW5udGUgei5CLiBmdWVyIFJhc3NlbiB3aWUgZm9sZ3QgZ2VzZXR6dCB3ZXJkZW46CisJRWxmOiAgIChbTUFUR1JPVVBfV09PRDozMF0pCisJWndlcmc6IChbTUFUR1JPVVBfU1RPTkU6MzBdKQorICAgICBvZGVyIGV0d2FzIGtvbXBsZXhlcgorCVp3ZXJnOiAoW01BVEdST1VQX1NUT05FOjMwLAorCQkgTUFURVJJQUxfU1lNTUVUUklDX1JFQ09HTklaQUJJTElUWTogKHtNQVRHUk9VUF9CSU86IC01fSldKQorCitTSUVIRSBBVUNIOgorICAgICBLb256ZXB0ZToJICBtYXRlcmlhbAorICAgICBHcnVuZGxlZ2VuZDogUF9NQVRFUklBTCwgL3N5cy90aGluZy9tYXRlcmlhbC5oCisgICAgIE1ldGhvZGVuOiAgICBRdWVyeU1hdGVyaWFsKCksIFF1ZXJ5TWF0ZXJpYWxHcm91cCgpLCBNYXRlcmlhbExpc3QoKSwKKyAgICAgTGlzdGVuOgkgIEFsbE1hdGVyaWFscygpLCBBbGxHcm91cHMoKSwgRHVtcCgpCisJCSAgbWF0ZXJpYWxsaXN0ZSwgbWF0ZXJpYWxncnVwcGVuCisgICAgIE1hc3RlcjoJICBBZGRNYXRlcmlhbCgpLCBDb252TWF0ZXJpYWxMaXN0KCksIE1hdGVyaWFsR3JvdXAoKSwKKwkJICBHcm91cE5hbWUoKSwgTWF0ZXJpYWxOYW1lKCksCisJCSAgR2V0R3JvdXBNZW1iZXJzKCksIEdldE1hdE1lbWJlcnNoaXAoKQorICAgICBTb25zdGlnZXM6CSAgUF9NQVRFUklBTF9LTk9XTEVER0UKKworNy4gTWFpIDIwMDQgR2xvaW5zb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2Mvd2l6L21hdGVyaWFsZ3J1cHBlbiBiL2RvYy93aXovbWF0ZXJpYWxncnVwcGVuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMDFiYWUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd2l6L21hdGVyaWFsZ3J1cHBlbgpAQCAtMCwwICsxLDUzIEBACitNYXRlcmlhbGdydXBwZW4KKz09PT09PT09PT09PT09PQorCisgIERpZSBlYmVuZmFsbHMga29tbWVudGllcnRlIExpc3RlIHVudGVyIC9zeXMvdGhpbmcvbWF0ZXJpYWwuaCBpc3QgaW1tZXIKKyAgYWt0dWVsbGVyIGFscyBkaWVzZSBoaWVyLgorCisgIE1BVEdST1VQX1NPTElEICAgICAgICAgIGZlc3RlIERpbmdlCisgIE1BVEdST1VQX0ZMVUlEICAgICAgICAgIEZsdWVzc2lna2VpdGVuCisgIE1BVEdST1VQX0dBUyAgICAgICAgICAgIEdhc2UKKworICBNQVRHUk9VUF9XT09EICAgICAgICAgICBIb2VsemVyCisgIE1BVEdST1VQX0RFQ0lEVU9VU19XT09EIExhdWJob2VsemVyCisgIE1BVEdST1VQX0NPTklGRVJfV09PRCAgIE5hZGVsaG9lbHplcgorICBNQVRHUk9VUF9UUk9QSUNBTF9XT09EICBUcm9wZW5ob2VsemVyCisgIE1BVEdST1VQX0pFV0VMICAgICAgICAgIEVkZWxzdGVpbmUKKyAgTUFUR1JPVVBfTUlORVJBTCAgICAgICAgTWluZXJhbGllbgorICBNQVRHUk9VUF9TVE9ORSAgICAgICAgICBTdGVpbmUKKyAgTUFUR1JPVVBfTUVUQUwgICAgICAgICAgTWV0YWxsZQorICBNQVRHUk9VUF9QUkVDSU9VU19NRVRBTCBFZGVsbWV0YWxsZQorICBNQVRHUk9VUF9QQVBFUiAgICAgICAgICBQYXBpZXIgdW5kIEFlaG5saWNoZXMKKyAgTUFUR1JPVVBfQ0xPVEggICAgICAgICAgU3RvZmZlCisKKyAgTUFUR1JPVVBfRUxFTUVOVEFMICAgICAgKGFsdGVydHVlbWxpY2hlKSBFbGVtZW50ZQorICBNQVRHUk9VUF9CSU8gICAgICAgICAgICBBbGxlcywgd2FzIGxlYnQgb2RlciBsZWJ0ZQorICBNQVRHUk9VUF9MSVZJTkcgICAgICAgICBMZWJld2VzZW4KKyAgTUFUR1JPVVBfSEVSQkFMICAgICAgICAgUGZsYW56bGljaGVzCisgIE1BVEdST1VQX0RFQUQgICAgICAgICAgIFVlYmVycmVzdGUgdm9uIExlYmV3ZXNlbgorICBNQVRHUk9VUF9EUlVHICAgICAgICAgICBEcm9nZW4sIEhlaWx0cmFlbmtlCisKKyAgTUFUR1JPVVBfSU5GTEFNTUFCTEUgICAgRW50ZmxhbW1iYXJlcworICBNQVRHUk9VUF9FWFBMT1NJVkUgICAgICBFeHBsb3NpdmVzCisgIE1BVEdST1VQX1BPSVNPTk9VUyAgICAgIEdpZnRpZ2VzCisgIE1BVEdST1VQX01BR0lDICAgICAgICAgIE1hZ2lzY2hlcworICBNQVRHUk9VUF9SQURJT0FDVElWRSAgICBSYWRpb2FrdGl2ZXMKKyAgTUFUR1JPVVBfRUxFQ1RSSUNBTCAgICAgRWxla3RyaXNjaGVzCisgIE1BVEdST1VQX01BR05FVElDICAgICAgIE1hZ25ldGlzY2hlcworICBNQVRHUk9VUF9BQ0lESUMgICAgICAgICBTYXVyZXMKKyAgTUFUR1JPVVBfRUFUQUJMRSAgICAgICAgRXNzYmFyZXMKKyAgTUFUR1JPVVBfRkxFWElCTEUgICAgICAgQmllZ3NhbWVzCisgIE1BVEdST1VQX0lOVklTICAgICAgICAgIFVuc2ljaHRiYXJlcworCitTSUVIRSBBVUNIOgorICAgICBLb256ZXB0ZToJICBtYXRlcmlhbCwgbWF0ZXJpYWxlcmtlbm51bmcKKyAgICAgR3J1bmRsZWdlbmQ6IFBfTUFURVJJQUwsIC9zeXMvdGhpbmcvbWF0ZXJpYWwuaAorICAgICBNZXRob2RlbjogICAgUXVlcnlNYXRlcmlhbCgpLCBRdWVyeU1hdGVyaWFsR3JvdXAoKSwgTWF0ZXJpYWxMaXN0KCksCisgICAgIExpc3RlbjoJICBBbGxNYXRlcmlhbHMoKSwgQWxsR3JvdXBzKCksIER1bXAoKQorCQkgIG1hdGVyaWFsbGlzdGUKKyAgICAgTWFzdGVyOgkgIEFkZE1hdGVyaWFsKCksIENvbnZNYXRlcmlhbExpc3QoKSwgTWF0ZXJpYWxHcm91cCgpLAorCQkgIEdyb3VwTmFtZSgpLCBNYXRlcmlhbE5hbWUoKSwKKwkJICBHZXRHcm91cE1lbWJlcnMoKSwgR2V0TWF0TWVtYmVyc2hpcCgpCisgICAgIFNvbnN0aWdlczoJICBQX01BVEVSSUFMX0tOT1dMRURHRQorCis3LiBNYWkgMjAwNCBHbG9pbnNvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy93aXovbXVkbGliLWNvZGVzdHlsZSBiL2RvYy93aXovbXVkbGliLWNvZGVzdHlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2I0YmFhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dpei9tdWRsaWItY29kZXN0eWxlCkBAIC0wLDAgKzEsMzYgQEAKK1dvbGx0IGlociBDb2RlIGluIGRlciBhbGxnZW1laW5lbiwgb2VmZmVudGxpY2hlbiBNdWRsaWIgYW5zY2hsaWVzc2VuLCBiaXR0ZQorYmVhY2h0ZXQgZGllIGZvbGdlbmRlbiBIaW53ZWlzZSB6dW0gQ29kZXN0eWxlIChuaWNodCBlcnNjaG9lcGZlbmQpOgorCisqIEVpbnJ1ZWNrdW5nZW4gcGVyIExlZXJ6ZWljaGVuLCBuaWNodCBUYWJzCisqIEVpbnJ1ZWNrdW5nIHZvbiAyIExlZXJ6ZWljaGVuIHBybyBFYmVuZQorKiBwcmFlZ25hbnRlIHVuZCB2aWVsZSBLb21tZW50YXJlCisqIGtlaW5lIGxhbWJkYXMKKyogQmVpIGlubGluZS1jbG9zdXJlcyBkaWUgZnVuY3Rpb24tU3ludGF4IHN0YXR0IGRlciAoOiA6KS1TeW50YXggdmVyd2VuZGVuLgorKiBlbHNlLCBlbHNlIGlmIGluIGVpbmUgZWlnZW5lIFplaWxlCisqIHsgYW0gQmVnaW5uIHZvbiBCbG9lY2tlbiBzb2xsIGluIGVpbmUgZWlnZW5lIFplaWxlLgorKiBOYWNoIGlmcywgTG9vcHMgJiBDbzogdW1mYXNzdCBkZXIgZGF2b24ga29udHJvbGxpZXJ0ZSBDb2RlIG1laHIgYWxzIGVpbmUKKyAgcGh5c2lzY2hlIFplaWxlIENvZGUsIGVpbmVuIEJsb2NrIG1pdCB7IH0gZm9ybXVsaWVyZW4uCisqIGtlaW5lIHJldHVybiBmdW4oKSwgMDsKKyogKHR5cGUpIENhc3RzIHNvbGx0ZW4gdmVybWllZGVuIHdlcmRlbiAoQXVzbmFobWU6ICh0eXBlKWNhbGxfb3RoZXIpLgorICAodHlwZSkga29udmVydGllcmVuIG51ciwgd2VubiBkaWUgVHlwZW4genVyIENvbXBpbGV6ZWl0IGJla2FubnQgdW5kCisgIHVudGVyc2NoaWVkbGljaCBzaW5kLiBEYWhlciBiZWkgZ2V3dWVuc2NodGVuIEtvbnZlcnNpb25lbiB0b190eXBlKCkgbmVobWVuLgorKiBQZmFkZSwgZGllIGFic29sdXQgc2luZCwgc29sbGVuIGF1Y2ggbWl0IC8gYmVnaW5uZW4sIHouQi4gCisgIGluaGVyaXQgIi9zdGQvdGhpbmciLCBuaWNodCBpbmhlcml0ICJzdGQvdGhpbmciCisKK0JlbmVubnVuZyB2b24gUHJvcGVydGllczoKKyogZGVyIGludGVybmUgTmFtZSB2b24gUHJvcGVydGllcyBpbiBkZXIgQmFzaXMtTXVkbGliIGJlZ2lubnQgaW1tZXIgbWl0CisgICJwX2xpYl8iLiBOaWVtYW5kIHNvbnN0IHNvbGx0ZSBQcm9wZXJ0aWVzIG1pdCBkaWVzZW0gUHJhZWZpeCBlcnN0ZWxsZW4uCisKK1NvbnN0aWdlczoKKyogSW4gZGVyIE11ZGxpYiB3aXJkIGtlaW5lIG5ldWUgRnVua3Rpb24oYWxpdGFldCkgYW5nZXNjaGxvc3NlbiwgYmV2b3IgZGllCisgIERva3VtZW50YXRpb24gZGFmdWVyIGZlcnRpZyBpc3QuCisgIEFtIGxpZWJzdGVuIGlzdCBtaXIsIGJlaSBkZXIgS29uemVwdGVudHdpY2tsdW5nIHp1ZXJzdCBkaWUgZmVydGlnZQorICBEb2t1bWVudGF0aW9uIChNYW5wYWdlKSBmdWVyIE51dHplci9TcGllbGVyIHp1IGVudHdpY2tlbG4sIGJldm9yIGVpbiBNYWdpZXIKKyAgdWViZXJoYXVwdCBlaW5lIFplaWxlIENvZGUgc2NocmVpYnQuCisqIFBhdGNoZXMgbXVlc3NlbiBlaW5lIFp1c2FtbWVuZmFzc3VuZyBoYWJlbiwgd2VsY2hlIGt1cnogZXJsYWV1dGVydCwKKyAgd2FzIGRpZXNlciBQYXRjaCBmaXhlbi9hZW5kZXJuL3ZlcmJlc3Nlcm4gc29sbCB1bmQgYXVmIHdlbGNoZSBXZWlzZQorICBkaWVzZSB1bWdlc2V0enQgd2lyZC4gKEFuZGVycyBnZXNhZ3Q6IGVpbmUgQ29tbWl0LU1lc3NhZ2UpCisKK0xFVFpURSBBZU5ERVJVTkc6CisgIDE1LjguMjAxNSwgWmVzc3RyYQorCmRpZmYgLS1naXQgYS9kb2Mvd2l6L211c3Rlcl9yYXVtLmMgYi9kb2Mvd2l6L211c3Rlcl9yYXVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRlNGM5OQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93aXovbXVzdGVyX3JhdW0uYwpAQCAtMCwwICsxLDgyIEBACisvKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBFaW4ga2xlaW5lciBCZWlzcGllbHJhdW0uCisgKiBFciBsYWVzc3Qgc2ljaCBhbHMgL29iai9kb2MvbXVzdGVyX3JhdW0gYW5zcHJlY2hlbi4KKyAqCisgKiBEaWVzZXMgRmlsZSBpc3QgVGVpbCBkZXIgTW9yZ2VuR3JhdWVuLU11ZGxpYiB2b24gSm9mIHVuZCBSdW1hdGEKKyAqIExldHp0ZSBBZW5kZXJ1bmc6IDE3LjA4LjkyCisgKiAjaW5jbHVkZSBlaW5nZWZ1ZWd0OiBSdW1hdGEgMTAuMTEuOTgKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjcHJhZ21hIHN0cm9uZ190eXBlcyxydHRfY2hlY2tzCisKK2luaGVyaXQgIi9zdGQvcm9vbSI7CisJLyogRGllc2UgWmVpbGUgZGV1dGV0IGFuLCBkYXNzIGRlciBSYXVtIGF1cyBkZXIgU3RhbmRhcmQgbXVkbGliICovCisJLyogYWJnZWxlaXRldCB3aXJkLiBEaWVzZSBaZWlsZSBzb2xsdGUgaW4gSkVERU0gUmF1bSB2b3Jrb21tZW4uICovCisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisJLyogRGllc2UgWmVpbGUgZGVmaW5pZXJ0IGRpZSBncm9zc2J1Y2hzdGFiaWdlbiBOYW1lbiwgZGllIGluIGRlbiAqLworCS8qIFNldFByb3AtQmVmZWhsZW4gYmVudXR6dCB3ZXJkZW4uIEVzIGdpYnQgbm9jaCB3ZWl0ZXJlICouaCAgICAgKi8KKwkvKiBEYXRlaWVuLCBkaWUgYW5kZXJlIG51ZXR6bGljaGUgRGluZ2UgZGVmaW5pZXJlbi4gICAgICAgICAgICAgICovCisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisJOjpjcmVhdGUoKTsKKwkJLyogRGllc2UgWmVpbGUgaW5pdGlhbGlzaWVydCBkaWUgU3RhbmRhcmQtYXR0cmlidXRlLiAqLworCQkvKiBTaWUgZGFyZiBuaWNodCBmZWhsZW4gISAqLworCisJU2V0UHJvcChQX0lOVF9TSE9SVCwgIk11c3Rlci1yYXVtIiApOworCQkvKiBEaWUgQmVzY2hyZWlidW5nIGRlcyBSYXVtZXMgZnVlciBTcGllbGVyLCBkaWUgZGVuICovCisJCS8qIGt1cnovYnJpZWYtTW9kdXMgZWluZ2VzdGVsbHQgaGFiZW4uICovCisKKwlTZXRQcm9wKFBfSU5UX0xPTkcsICJEaWVzZXMgaXN0IGVpbiBNdXN0ZXJyYXVtLCBkZXIgbnVyIHp1ciBFcmxhZXV0ZXJ1bmdcbiIKKwkJKyAiZGllbnQuIEVpbiB1bmFuZ2VuZWhtZXIgUmF1bSB2b2xsZXIgU3Rlcm5lIHVuZCBzY2hyYWVnZXJcbiIKKwkJKyAiU3RyaWNoZS4gSW0gU3VlZGVuIGthbm5zdCBEdSBpbiB2ZXJ0cmF1dGVyZSBSYWV1bWUgZmxpZWhlbi5cbiIKKwkJKyAiSW0gTm9yZGVuIGlzdCBldHdhcyBzZWx0c2FtZXMuXG4iICk7CisJCS8qIERpZXNlIEJlc2NocmVpYnVuZyBiZWtvbW1lbiBTcGllbGVyLCBkaWUgZGVuIGt1cnotICovCisJCS8qIE1vZHVzIG5pY2h0IGJlbnV0emVuLCBvZGVyIHdlbm4gc2llICJzY2hhdSIgZWluZ2ViZW4uICovCisKKwlTZXRQcm9wKFBfTElHSFQsIDEgKTsKKwkJLyogRGllc2UgWmFobCBpc3QgMSBmdWVyIFJhZXVtZSwgaW4gZGVuZW4gbWFuIG9obmUgKi8KKwkJLyogTGljaHRxdWVsbGUgZXR3YXMgc2VoZW4ga2FubiB1bmQgMCBmdWVyIFJhZXVtZSwgKi8KKwkJLyogaW4gZGVuZW4gbWFuIGVpbmUgU29sY2hlIGJyYXVjaHQuICovCisKKwlBZGRFeGl0KCAic3VlZGVuIiwgInJvb20vYWR2X2d1aWxkIiApOworCQkvKiBCYXVlIGVpbmVuIEF1c2dhbmcgbmFjaCBTdWVkZW4sIGVyIHdpcmQgbWl0dGVscyBkZXMgKi8KKwkJLyogS29tbWFuZG9zICJleGl0cyIgYW5nZXplaWd0LiAqLworCisJQWRkU3BlY2lhbEV4aXQoICJub3JkZW4iLCAiZ29fbm9yZCIgKTsKKwkJLyogV2VubiBkZXIgU3BpZWxlciB2ZXJzdWNodCwgZGllc2VuIEF1c2dhbmcgenUgKi8KKwkJLyogYmVudXR6ZW4sIHNvIHdpcmQgZXIgbmljaHQgaW4gZWluZW4gYW5kZXJlbiBSYXVtICovCisJCS8qIGJld2VndCwgc29uZGVybiBlcyB3aXJkIGltIFJhdW0gZGllIGFuZ2VnZWJlbmUgKi8KKwkJLyogRnVua3Rpb24gYXVmZ2VydWZlbi4gKi8KKworCUFkZENtZCggImhpbGZlIiwgImdpYl9oaWxmZSIgKTsKKwkJLyogRGllc2VzIEtvbW1hbmRvIHJ1ZnQgZGllIEZ1bmt0aW9uICJnaWJfaGlsZmUiIGF1ZiwgKi8KKwkJLyogd2VubiBkZXIgU3BpZWxlciBkYXMgS29tbWFuZG8gImhpbGZlIiBlaW5naWJ0LiAqLworCQkvKiBEYXMgS29tbWFuZG8gdGF1Y2h0IG5pY2h0IGluIGRlciAiZXhpdHMtbGlzdGUiIGF1Zi4gKi8KKworfQorCisvKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTbyBqZXR6dCBpc3QgZGVyIFJhdW0gZmV0aWcuCisgKiBXaXJrbGljaD8gTmVpbiwgZmFzdC4KKyAqIERpZSBvYmVuIGFuZ2VnZWJlbmVuIEZ1bmt0aW9uIGZlaGxlbiBub2NoLCBhYmVyIGRhcyBzaW5kIGJlcmVpdHMKKyAqICJFeHRyYXMiLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworaW50IGdvX25vcmQoKQoreworCXdyaXRlKCAiSG1tIGRhcyB3YXIgd29obCBkb2NoIG51ciBkaWUgV2FuZC5cbiIgKTsKKwlyZXR1cm4gMTsKKwkJLyogRGFzIEtvbW1hbmRvIHdpcmRlIGVyZm9sZ2VpY2ggYmVlbmRldC4gKi8KK30KKworaW50IGdpYl9oaWxmZSgpCit7CisJd3JpdGUoICJHZWhlIG5hY2ggU3VlZGVuLCB1bmQgRHUga29tbXN0IGluIGRpZSBBYmVudGV1cmVyLUdpbGRlLlxuIiApOworCXJldHVybiAxOworfQorCmRpZmYgLS1naXQgYS9kb2Mvd2l6L25hY2h0ZWlsZSBiL2RvYy93aXovbmFjaHRlaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzN2U1NmYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd2l6L25hY2h0ZWlsZQpAQCAtMCwwICsxLDUxIEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitOQUNIVEVJTEUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0JlaSBkZXIgR2VuZWhtaWd1bmcgdm9uIE9iamVrdGVuIGltIEJhbGFuY2V0ZWFtIGtvbW10IGltbWVyIHdpZWRlciBkaWUgRnJhZ2UKK2F1Ziwgd2VsY2hlIE5hY2h0ZWlsZSBkYXMgT2JqZWt0IGRlbm4gaGF0LCB3ZW5uIGVzIHNjaG9uIHNvIHZpZWxlIFZvcnRlaWxlCitiZXNpdHp0LiBHZW5lcmVsbCBnaWx0LCBkYXNzIHN0YXJrZSBPYmpla3RlIG51ciBkYW5uIGdlbmVobWlndCB3ZXJkZW4sIHdlbm4KK3NpZSBhdWNoIHVlYmVyIGVudHNwcmVjaGVuZCBncm9zc2UgTmFjaHRlaWxlIHZlcmZ1ZWdlbi4KKworRGFoZXIgaGllciBtYWwgZWluZSBrbGVpbmUgQXVmbGlzdHVuZyBkZXNzZW4sIHdhcyBhbHMgc29sY2hlciBiZXRyYWNodGV0Cit3aXJkOgorCistIEdld2ljaHQgKG5pY2h0IGJlaSBLZXVsZW4gZnVlciBLbGVyaWtlcikKKworLSBBbmZhZWxsaWdrZWl0ZW4gZ2VnZW4gU2NoYWRlbmFydGVuCisKKy0gTFAtS1AtQWJ6dWcgKE9iZXJncmVuemVuLCBqZWRlIFJ1bmRlLCBqZWRlciBSZXNldCkKKy0gQWJzZW5rZW4gZGVyIE1heHdlcnRlIHZvbiBMUCwgS1AKKy0gQWJzZW5rZW4gdm9uIEF0dHJpYnV0ZW4KKy0gQWJzZW5rZW4gdm9uIFNBX1NQRUVELCBTQV9RVUFMSVRZIHVzdy4KKworLSBTY2hhZGVuL051dHplbiBhYmhhZW5naWcgdm9tIEFsaWdubWVudAorLSBHZW5lcmVsbGUgUmVzdHJpa3Rpb25lbgorCistIE9iamVrdCBtdXNzIGFuIGVpbmVyIGJlc3RpbW10ZW4gU3RlbGxlICh6LkIuIGR1cmNoIGRhcyBUb2V0ZW4gZWluZW4gTlBDKQorICBhdWZnZWxhZGVuIHdlcmRlbgorLSB3aWVkZXJrZWhyZW5kZSBLb3N0ZW4gKGF1c3NlciBMUC9LUCBhdWNoIHNvd2FzIHdpZSBHZWxkL0l0ZW1zL0F1ZmdhYmUpCisKKy0gQmVoaW5kZXJ1bmcgYW5kZXJlciBPYmpla3RlCistIEJlbGVndW5nIHZvbiBTbG90cyAoU2V0KQorCistIFNraWxsb2JqZWt0CisKKy0gQmVncmVuenRlIEhhbHRiYXJrZWl0CistIEFibnV0enVuZyAoei5CLiBQX1FVQUxJVFksIG9kZXIgZWluZmFjaCBkdXJjaCBaZWl0L05pY2h0YmVudXR6dW5nKQorLSBVbXN0YWVuZGUsIGRpZSBkYXMgT2JqZWt0IHplcnN0b2VyZW4KKy0gQmVncmVuenRlIFdpcmt1bmcgKHouQi4gV2FmZmUgd2lya3QgbnVyIGdlZ2VuIGVpbmUgUmFzc2UpCisKKy0gVW5pcXVlCistIFVuaXF1ZSBtaXQgYmVncmVuenRlciBBbnphaGwKKworR2VuZXJlbGwgc29sbHRlbiBQYXJhb2JqZWt0ZSBkaWUgUmVzdHJpa3Rpb24gU2VoZXIgYmVzaXR6ZW4sIGRhIHNpZSBhdWNoIG51cgordm9uIFNlaGVybiBnZWhvbHQgd2VyZGVuIGtvZW5uZW4uIEFlaG5saWNoZSBSZXN0cmlrdGlvbmVuIHNvbGx0ZW4gZnVlciAKK09iamVrdGUgYXVzIEdlYmlldGVuIGdlbHRlbiwgZGllIGVyc3QgYWIgZWluZXIgZ2V3aXNzZW4gU3R1ZmUgYmV0cmV0ZW4gCit3ZXJkZW4ga29lbm5lbi4KKworT2JqZWt0ZSwgZGllIG51ciBpbiBlbmcgYmVncmVuenRlbiBHZWJpZXRlbiB3aXJrZW4gKHouQi4gUXVlc3RpdGVtcyB3aWUgZGVyIAorU3Bpbm5lbnRvZXRlcikgbXVlc3NlbiBiZWkgZGVyIEJhbGFuY2UgbmljaHQgYmVhbnRyYWd0IHdlcmRlbiwgc2VsYnN0IHdlbm4KK3NpZSBXZXJ0ZSBiZXNpdHplbiwgZGllIGRpZSBCYWxhbmNlZ3JlbnplbiB1ZWJlcnNjaHJlaXRlbi4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGV0enRlIEFlbmRlcnVuZzogMTguMTAuMjAwNSAtIE1pcmlsCmRpZmYgLS1naXQgYS9kb2Mvd2l6L25ldHogYi9kb2Mvd2l6L25ldHoKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRkOGNmNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93aXovbmV0egpAQCAtMCwwICsxLDI3IEBACitTdGFuZDogMTcuMDguOTIKK1VlYmVyYXJiZWl0ZXQgYW0gMjQuMDguOTQgdm9uIFZpcGVyCisKK0RpZSBOZXR6cGhpbG9zb3BoaWUgaW0gTW9yZ2VuR3JhdWVuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitEaWUgd2ljaHRpZ2VuIFdlZ2UgdW5kIFZlcmJpbmR1bmdlbiBpbiBNb3JnZW5HcmF1ZW4gc29sbGVuIGVpbmUgQXJ0CitOZXR6c3RydWt0dXIgIGJlc2l0emVuLCBkLmguIGVzIHdpcmQgbmljaHQgYW0gUmFuZCBhbmdlYmF1dCAod2llIGltIAorYWx0ZW4gTkYpLCBzb25kZXJuIG1pdHRlbiBkcmluLgorCitCZWlzcGllbDoKKworTWFuIHN0ZWxsZSBzaWNoIGVpbmUgU3RyYXNzZSBhdXMgNiBSYWV1bWVuIHZvci4gQW0gQW5mYW5nIHZlcmxhZXVmdAorZGllIFN0cmFzc2Ugdm9uIE9zdGVuIG5hY2ggV2VzdGVuIG9obmUgYmVzb25kZXJlIERldGFpbHMgYW0gIFdlZ2VzLQorcmFuZC4gTWl0IGRlciBaZWl0IGJhdWVuIGVpbmlnZSBNYWdpZXIgYXVzIGRpZXNlciBSZWdpb24gIG5vZXJkbGljaAordW5kIHN1ZWRsaWNoIGlocmUgUmFldW1lIHVuZCBRdWVzdHMgYW4uIElyZ2VuZHdhbm4gamVkb2NoIHNpbmQgYWxsZSAKK1JhZXVtZSBhdXNnZXNjaG9lcGZ0LiBEYW5uIGthbm4gIGRlciAgRXJ6bWFnaWVyIGRlciBSZWdpb24gWldJU0NIRU4gCitkaWUgYmVzdGVoZW5kZW4gUmFldW1lIGRlciBTdHJhc3NlIHdlaXRlcmUgU3RyYXNzZW5yYWV1bWUgZWluZnVlZ2VuLiAKK0RvcnQga2FubiBkYW5uIHdpZWRlciBOb2VyZGxpY2ggdW5kIFN1ZWRsaWNoIGFuZ2ViYXV0IHdlcmRlbi4gSW4gZGVuIAorbmV1ZW4gU3RyYXNzZW50ZWlsZW4gIHNvbGx0ZW4gbmF0dWVybGljaCBrZWluZSBNb25zdGVyIG9kZXIgSGluZGVyLQorbmlzc2UgYXVmZ2VzdGVsbHQgd2VyZGVuLCBzbyBkYXNzIGRpZSBTdHJhc3NlIGZ1ZXIgZGllIFNwaWVsZXJJbm5lbiAKK2xlZGlnbGljaCBldHdhcyBsYWVuZ2VyIHdpcmQsIGRvcnQgYWJlciBrZWluZSBuZXVlbiBQcm9ibGVtZSBhdWYgaWhuCisvc2llIHdhcnRlbi4KKworWnVzYWV0emxpY2hlIEhpbmRlcm5pc3NlIHNvbGx0ZW4gbnVyIG5hY2ggQWJzcHJhY2hlIG1pdCBlaW5lbSBFcnotCittYWdpZXIgKGRhcyBzaW5kIGRpZSBNYWdpZXIgYWIgTGV2ZWwgNjApIGluIGJlc3RlaGVuZGUgU3RyYXNzZW4KK2VpbmdlYmF1dCB3ZXJkZW4uCmRpZmYgLS1naXQgYS9kb2Mvd2l6L25wY3MgYi9kb2Mvd2l6L25wY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI0MmU0YwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93aXovbnBjcwpAQCAtMCwwICsxLDEyMSBAQAorIEhJTldFSVNFIFpVIE5QQ1M6CisKKyAgYS4gQWxsZ2VtZWluZXMgLyBIaW53ZWlzZSAvIFRpcHBzCisKKyAgICAgRGllcyBzaW5kIFJpY2h0bGluaWVuLCBrZWluZSBWb3JzY2hyaWZ0ZW4hISEhCisKKyAgICAgTmljaHQgamVkZXIgTlBDIGJyYXVjaHQgZWluZW4gbGl2aW5nX25hbWUuIE51ciBpbiBiZXNvbmRlcmVuIE5QQ3MKKyAgICAgc29sbHRlIG1hbiBlaW5lbiBzb2xjaGVuIHNldHplbi4gQWxsZXMgYW5kZXJlIGlzdCB1bnNpbm5pZyB1bmQgYmVsYXN0ZXQKKyAgICAgbnVyIHVubm9ldGlnIGRlbiBTcGVpY2hlci4KKworICAgICBFaW4gTW9uc3RlciBzb2xsdGUgbmllbWFscyB6dSB2aWVsIFpldWcgbWl0IHNpY2ggaGVydW10cmFnZW4uIEVpbiBiaXMKKyAgICAgendlaSBTYWNoZW4gcmVpY2hlbiBpbSBOb3JtYWxmYWxsLgorCisgICAgIE5pZW1hbHMgc29sbHRlIGVpbiBNb25zdGVyIGFsbGVpbiBtaXQgbWVocmVyZW4gVG9wLVF1YWxpdGFldHMtU2FjaGVuCisgICAgIChzZWhyIGd1dGUgV2FmZmUgcGx1cyBndXRlIFJ1ZXN0dW5nW2VuXSkgYXVzZ2VzdGF0dGV0IHNlaW4uIERhcyB3YWVyZQorICAgICBkb2NoIHp1IGVpbmZhY2guCisKKyAgICAgRGllIEhhZXJ0ZSBkZXIgTW9uc3RlciBpc3QgaW0gUHJpbnppcCBlZ2FsOyBwZmxhc3RlcnQgZGllIEdlYmlldGUgcnVoaWcKKyAgICAgbWl0IEh5ZHJlbi4KKyAgICAgTnVyOiBBbmZhZW5nZXJuIG9kZXIga2xlaW5lcmVuIFNwaWVsZXJuIHp1Z2FlbmdsaWNoZSBHZWJpZXRlIHNvbGx0ZW4KKyAgICAga2VpbmUgQXV0b2F0dGFja21vbnN0ZXIgZW50aGFsdGVuLCBkaWUgZGllICJLbGVpbmVuIiBnbGVpY2ggdW1uaWV0ZW4uCisgICAgIFNvbGNoZSBHZWdlbmRlbiBzb2xsdGVuIGVudHdlZGVyIG1pdCBXYWNoZW4gYmVzdHVlY2t0IG9kZXIgbWl0IGVpbmlnZW4KKyAgICAgenVuZWhtZW5kIGhhZXJ0ZXJlbiBNb25zdGVybiBlaW5lbiAiVm9yZ2VzY2htYWNrIiBiaWV0ZW4sIGRhbWl0IG1hbgorICAgICBuaWNodCB1bmJlZGFyZnQgcmVpbnJlbm50LiBVbmZhZWxsZSB3aXJkJ3MgZGVubm9jaCBnZWJlbi4gV2FzIHNvbGwncywKKyAgICAgUm9jaHVzIGxpZWJ0IHNlaW5lIFN0YXRpc3Rpay4uLiA6KQorCisgICAgIEF1Y2ggYmVpIE5QQ3Mga2FubiBkaWUgUHJvcGVydHkgUF9JTkZPIGdlc2V0enQgd2VyZGVuLCBkaWVzIHNvbGx0ZQorICAgICBpbnNiZXNvbmRlcmUgYmVpIHN0YXJrZW4gdW5kIHNwZXppZWxsZW4gTlBDcyBnZW1hY2h0IHdlcmRlbi4KKworICAgICBCZWkgTlBDcywgZGllIGJlc29uZGVyZSBTcGVsbHMgYmVudXR6ZW4sIHNvbGx0ZW4gZGllIFJNcyBkYXJhdWYgYWNodGVuLAorICAgICBkYXNzIG5pY2h0IHBsb2V0emxpY2ggZGllIGdhbnplIEdlZ2VuZCB2b24gTlBDcyB3aW1tZWx0LCB2b24gZGVuZW4KKyAgICAgamVkZXIgc2VpbmVuIEdlZ25lciBibGluZCBvZGVyIHRhdWIgbWFjaHQgb2RlciB2ZXJnaWZ0ZXQuCisKKyAgICAgTnVyIGFscyBUaXBwOgorICAgICBNb25zdGVyIG1pdCBBdHRhY2stQ2hhdHMgc2luZCBlcmhlYmxpY2gga25pZmZsaWdlciB6dSBraWxsZW4gdW5kIG1hY2hlbgorICAgICBhdWNoIHVtIGlocmVyIFNlbGJzdCB3aWxsZW4gbWVociBTcGFzcyBhbHMgYmxvZWRlIEhhdS1EcmF1Zi1Nb25zdGVyLAorICAgICBkaWUgendhciB1ZWJlciB1bmVuZGxpY2ggSFAgdmVyZnVlZ2VuLCBhYmVyIGltIFByaW56aXAgbnVyIEdlZHVsZAorICAgICBicmF1Y2hlbiwgdW0gc2llIHp1IGJlc2llZ2VuLiBQaGFudGFzaWUgaXN0IGdlZnJhZ3QuCisKKyAgYi4gRWlnZW5zY2hhZnRlbgorICAgICAgRnVlciBlaW5mYWNoZSBNb25zdGVyIGJpdHRlIGNyZWF0ZV9kZWZhdWx0X25wYygpIGJlbnV0emVuIQorCisgICAgICBBbnNvbnN0ZW46CisgICAgICBQX0hBTkRTCisJQmVpIE1vbnN0ZXJuIG9obmUgV2FmZmVuIHNvbGx0ZSBkaWUgUHJvcGVydHkgUF9IQU5EUyBpbiBhbGxlbiBkcmVpCisJV2VydGVuIGRlbSBFcnNjaGVpbnVuZ3NiaWxkIGRlcyBNb25zdGVycyBlbnRzcHJlY2hlbiwgYWxzbyBpbiBUZXh0LAorCVNjaGFkZW5zaG9laGUgdW5kIFNjaGFkZW5zYXJ0LgorCUF1Y2ggYmVpIE1vbnN0ZXJuIG1pdCBlaW5lciBXYWZmZSBzb2xsdGUgUF9IQU5EUyB2ZXJudWVuZnRpZyBnZXNldHp0CisJd2VyZGVuLCBhbHNvIG5pY2h0IHp1IGhvY2guIERhcmF1ZiB6dSBhY2h0ZW4gaXN0IEF1ZmdhYmUgZGVyIFJNcy4KKworICAgICAgUF9CT0RZCisJTW9uc3RlciBzb2xsdGVuIG5pY2h0IHVlYmVyIHVuZHVyY2hkcmluZ2xpY2hlIEJvZGllcyB2ZXJmdWVnZW4sIHdlaWwKKwlzaWUgZGFubiBudXIgbWFnaXNjaCB6dSBzY2hsYWNodGVuIHNpbmQuIEJvZGllcyB1ZWJlciAxNTAgKG9kZXIKKwlQX1RPVEFMX0FDIHVlYmVyIDE1MCBpbmNsLiBSdWVzdHVuZ2VuISkgc2luZCBrYXVtIG5vY2gKKwkiaGVya29lbW1saWNoIiB6dSBraWxsZW4uIE5vcm1hbGUgTW9uc3RlciwgYWxzbyBuaWNodC1tYWdpc2NoZSwgc2luZAorCWVpZ2VudGxpY2ggaW1tZXIgYW5mYWVsbGlnIGdlZ2VuIGRpZSBwaHlzaWthbGlzY2hlbiBTY2hhZGVuc3R5cGVuLgorCUFsc28gYml0dGUgZGEga2VpbmUgUF9SRVNJU1RBTkNFIHNldHplbi4KKworICAgICAgUF9SRVNJU1RBTkNFL1BfVlVMQkVSQUJJTElUWS9QX1JFU0lTVEFOQ0VfU1RSRU5HVEhTCisgICAgICBQX05PTUFHSUMKKwlEaWUgUkVTSVNUQU5DRSBkZXIgTW9uc3RlciBzb2xsdGUgc2ljaCBhdWYgZWluIG9kZXIgendlaQorCVNjaGFkZW5zdHlwZW4gYmVncmVuemVuLCB1bmQgZGllIHNvbGx0ZW4gYXVjaCBiZWdydWVuZGJhciBzZWluLiBFaW4KKwlub3JtYWxlcyBXZXNlbiBnZWdlbiBCTFVER0VPTiwgU0xBU0ggb2RlciBQSUVSQ0UgdW5lbXBmaW5kbGljaCB6dQorCW1hY2hlbiBpc3QgdW5sb2dpc2NoIHVuZCBzb2xsdGUgdmVybWllZGVuIHdlcmRlbi4gR2xlaWNoZXMgZ2lsdCBmdWVyCisJRW1wZmluZGxpY2hrZWl0ZW4uCisJRWJlbnNvIHNvbGx0ZSBlcyBHcnVlbmRlIGdlYmVuLCB3YXJ1bSBlaW4gTW9uc3RlciBlaW5lIE1hZ2llCisJdW53aXJrc2FtIG1hY2h0LgorCisgICAgICBQX1hQCisJRGVyIFRvZXR1bmdzYm9udXMgaW4gWFAsIGRpZSBkZXIgS2lsbGVyIGVyaGFlbHQsIGJldHJhZ2VuIDEvMTAwIGRlcworCVdlcnRlcywgZGVyIGluIFBfWFAgYW5nZWdlYmVuIHdpcmQuIERlciBXZXJ0IHNlbGJzdCBzb2xsdGUgZGVyCisJSGFlcnRlIGRlcyBNb25zdGVycyBhbmdlbWVzc2VuIHNlaW4sIGFscyBGYXVzdHJlZ2VsIGZ1ZXIKKwknZ2V3b2VobmxpY2hlJyBOUENzIGdpbHQ6CisKKwkgIFBfWFAgPSA1ICogV0MgKiBNQVhfSFAKKworCURpZSBSTXMgc29sbHRlbiBkYXJhdWYgYWNodGVuLCBkYXNzIGhpZXIga2VpbmUgdWViZXJob2VodGVuIFdlcnRlCisJZ2VzZXR6dCB3ZXJkZW4uCisKKwlGdWVyIEF0dGFjay1TcGVsbHMgdW5kIGFlaG5saWNoIGZpZXNlcyBrYW5uIGVpbiBCb251cyBnZWdlYmVuCisJd2VyZGVuLiBGdWVyIHF1ZXN0cmVsZXZhbnRlIE5QQ3Mgb2RlciAiSW5mb3JtYXRpb25zLU5QQ3MiLCBkaWUgbmljaHQKKwl1bmJlZGluZ3QgYWxzIE1ldHplbG9iamVrdGUgaGVydW1zdGVoZW4sIGthbm4gbWFuIGF1Y2ggZGllIEVQCisJc2Vua2VuLCB1bSBzaWUgZnVlciBFUC1TYW1tbGVyIHVuaW50ZXJlc3NhbnQgenUgbWFjaGVuLgorCisgICAgICBQX01VUkRFUl9NU0cvUF9LSUxMX01TRworCU5pY2h0IGplZGVyIE5QQyBicmF1Y2h0IHNlaW5lIGVpZ2VuZSBNb2VyZGVyLSBvZGVyIEtpbGxlcm1lbGR1bmcuCisJQmVpIG5vcm1hbGVuIAlOUENzIHNvbGx0ZSBtYW4gYWxzbyBkYXJhdWYgdmVyemljaHRlbi4KKworICAgICAgUF9ESUVfTVNHL1BfTk9DT1JQU0UKKwlXZW5uIGVpbiBOUEMgZWluIHdlbmlnIGFuZGVycyB1bWZhZWxsdCBhbHMgc29uc3QsIHRyYWVndCBkYXMgYXVjaAorCXp1bSBTcGllbCBiZWkuCisKKyAgICAgIFBfR1VBUkQKKwlXZW5uIGRlciBOUEMgbmljaHRzIGJld2FjaHQgdW5kIG5pY2h0IHVlYmVybWFlc3NpZyBzdGFyayBpc3QsIHNvbGx0ZQorCW1hbiBpaG4gYXVjaCBmb3J0bG9ja2VuIGtvZW5uZW4uIFNldHp0IFBfR1VBUkQgZW50c3ByZWNoZW5kIHVuZAorCWxhc3N0IGRlbiBOUEMgbWl0IEFkZEl0ZW0gdW5kIFJFRlJFU0hfTU9WRV9IT01FIGVyemV1Z2VuLgorCisgICAgICBBZGRDbGFzcworCVdlbm4gaWhyIGV1cmVuIE5QQyBpbiBkZW4gZGVmaW5pZXJ0ZW4gS2xhc3NlbiBlaW5vcmRuZW4ga29lbm50LCBkYW5uCisJbWFjaHQgZGFzIGJpdHRlLiBCZXNpdHplciB2b24gU3BlemlhbHdhZmZlbiBvZGVyIFJ1ZXN0dW5nZW4gd2VyZGVuCisJZXMgZXVjaCBkYW5rZW4uCisKKyAgYy4gSGlsZnMtL0JlZ2xlaXQtTlBDcworCisgICAgICBCZWkgc29sY2hlbiBOUEMgd2lyZCBhdWYgQXVzZ2V3b2dlbmhlaXQgV2VydCBnZWxlZ3QsIGRlciBQcm9ncmFtbWllcmVyCisgICAgICBzb2xsdGUgc2ljaCBzY2hvbiB2b3IgQW50cmFnLVN0ZWxsdW5nIGFuIGRpZSBCYWxhbmNlIEdlZGFua2VuIGRhcnVlYmVyCisgICAgICBtYWNoZW4sIHdpZSBzaWNoIGRlciBOUEMgc2VsYmVyIHZlcmhhZWx0LgorICAgICAgQmVpc3BpZWwgd2FlcmUgaGllciBVbnZlcnRyYWVnbGljaGtlaXQgbWl0IGFuZGVyZW4gTlBDcywKKyAgICAgIEFnZ3Jlc3Npdml0YWV0IGdlZ2VudWViZXIgYW5kZXJlbiBOUENzIC8gU3BpZWxlcm4sIFdhbmtlbC0gbXVldGlna2VpdCwKKyAgICAgIFVuenV2ZXJsYWVzc2lna2VpdCwgemVpdGxpY2hlIEJlZ3Jlbnp1bmcsIFNjaHV0eiBvZGVyIFNjaGFkZW4gaW4KKyAgICAgIEFiaGFlbmdpZ2tlaXQgdm9uIEFsaWduLCBHaWxkZSBkZXMgU3BpZWxlcnMsIEFuZ3JpZmYsIHZvbSBPcnQgZGVzCisgICAgICBHZXNjaGVoZW5zIG9kZXIgZGVyIEJlZ2FidW5nIGRlcyBTcGllbGVycyBmdWVyIE1hZ2llIHUuYWUuIERlcgorICAgICAgUGhhbnRhc2llIHNpbmQgaGllciBrZWluZSBHcmVuemVuIGdlc2V0enQuCisKK1NJRUhFIEFVQ0g6CisgICAgIFZlcndhbmR0OiAgICBiYWxhbmNlLCBydWVzdHVuZ2VuLCB3YWZmZW4sIGZlcm53YWZmZW4sIHVuaXF1ZXMsCisgICAgICAgICAgICAgICAgICBncmVuendlcnRlLCBhdHRyaWJ1dHN2ZXJhZW5kZXJ1bmdlbiwgcmVzaXN0ZW56ZW4sCisgICAgICAgICAgICAgICAgICBrYW1wZm9iamVrdGUsIGJlZ2xlaXRucGNzCisgICAgIEZ1bmt0aW9uZW46ICBjcmVhdGVfZGVmYXVsdF9ucGMKKworMTQuRmViIDIwMDcgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy93aXovb2JqX2dlcnVlc3QgYi9kb2Mvd2l6L29ial9nZXJ1ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMWY5NTUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd2l6L29ial9nZXJ1ZXN0CkBAIC0wLDAgKzEsMTM0IEBACisvKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBvYmpfZ2VydWVzdAorICogRGllc2VzIEZpbGUgaXN0IFRlaWwgZGVyIE1vcmdlbmdyYXVlbi1NdWRsaWIuCisgKiBEaWVzZXMgRmlsZSB3aXJkIG9wdGltYWwgZm9ybWF0aWVydCwgd2VubiBUYWJ1bGF0b3JlbiA0IFplaWNoZW4gYnJlaXQKKyAqIHNpbmQuCisgKgorICogQWxsZ2VtZWluZXMgR2VydWVzdCBmdWVyIGVpbiBPYmpla3QuIFdlciBlaWdlbmUgT2JqZWt0ZSBzY2hyZWlidCwKKyAqIHNvbGx0ZSBzaWUgbmljaHQgZ2FueiBzbyBpbnRlbnNpdiBrb21tZW50aWVyZW4gd2llIGRpZXNlcyBoaWVyLCBhYmVyCisgKiBoaWVyIHNvbGxlbiBnbGVpY2h6ZWl0aWcsIGRpZSBncnVuZGxlZ2VuZGVuIE1lY2hhbmlzbWVuIGVybGFldXRlcnQKKyAqIHdlcmRlbi4KKyAqCisgKiAxNi4wOC45MiBSdW1hdGEKKyAqIFVlYmVyYXJiZWl0ZXQgYW0gMjQuMDguOTQgdm9uIFZpcGVyCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworaW5oZXJpdCAic3RkL3RoaW5nIjsgICAgICAgICAgICAvKiBMZWl0ZSBhdXMgZGVuIHN0ZC1PYmpla3RlbiBhYiAqLworCisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4gICAgICAgICAgIC8qIFN0ZWxsZSBOYW1lbiBkZXIgRmFlbGxlIHVuZCBkZXIgR2VzY2hsZWNodGVyICovCisJCQkJCQkJLyogZGVtIE9iamVrdCB6dXIgVmVyZnVlZ3VuZy4gKi8KKworY3JlYXRlKCkKK3sKKwk6OmNyZWF0ZSgpOworCQkvKiBEaWVzZSBaZWlsZSBOSUVNQUxTIHZlcmdlc3NlbiEhISAqLworCisJQWRkSWQoICJiYWxsIiApOyAgICAgICAgCisJQWRkSWQoICJzdHJhbmRiYWxsIiApOworCQkvKiBVbnRlciBkaWVzZW4gQmV6ZWljaG51bmdlbiBmdWVobHQgZGVyIEJhbGwgc2ljaCAiYW5nZXNwcm9jaGVuIiAqLworCQkvKiBNYW5uIHNvbGx0ZSBtaXQgSWRzIG5pY2h0IHNwYXJlbiwgZGFtaXQgZGllIFNwaWVsZXIgbmljaHQgZXdpZyAgKi8KKwkJLyogbnVyIG5hY2ggZGVtIHJpY2h0aWdlbiBOYW1lbiBlaW5lcyBPYmpla3RlcyBzdWNoZW4gbXVlc3Nlbi4gKi8KKworCVNldFByb3AoIFBfTkFNRSwgIkJhbGwiICk7CisJU2V0UHJvcCggUF9HRU5ERVIsIE1BTEUgKTsKKwlTZXRQcm9wKCBQX0FSVElDTEUsIDEgKTsKKwkJLyogRGllc2UgTWVsZHVuZ2VuIGVybW9lZ2xpY2hlbiBlcyBkZXIgTXVkbGliLCBkYXMgT2JqZWt0IHJpY2h0aWcgKi8KKwkJLyogenUgZGVrbGluaWVyZW4uIFNldFByb3AoUF9BUlRJQ0xFLCAxKSBrYW5uIHdlZ2ZhbGxlbiwgZGEgMSBEZWZhdWx0IGlzdC4gKi8KKworCVNldFByb3AoIFBfU0hPUlQsICJFaW4gYnVudGVyIEJhbGwiICk7CisJU2V0UHJvcCggUF9MT05HLCAiV2FzIGZ1ZXIgZWluIGh1ZWJzY2hlciBrbGVpbmVyIFN0cmFuZGJhbGwuXG4iCisJCQkrIldlbSBrb2VubnRlc3QgRHUgZGVuIG1hbCB6dXdlcmZlbj9cbiIgKTsKKwkJLyogQmVzY2hyZWlidW5nZW4genVyIEJldHJhY2h0dW5nIGRlcyBCYWxscy4gKi8KKworCVNldFByb3AoIFBfVkFMVUUsIDEwICk7CisJU2V0UHJvcCggUF9XRUlHSFQsIDI1MCApOworCQkvKiBCZWkgZGllc2VuIFdlcnRlbiBzb2xsdGUgZGllIFZlcmhhZWx0bmlzbWFlc3NpZ2tlaXQgKi8KKwkJLyogbmljaHQgYXVzIGRlbiBBdWdlbiBnZWxhc3NlbiB3ZXJkZW4uICovCit9CisKK2luaXQoKQoreworCTo6aW5pdCgpOworCQkvKiBOSUNIVCBWRVJHRVNTRU4gKi8KKwkJLyogV2VubiBrZWluZSBlaWdlbmVuIEFrdGlvbmVuIGRlZmluaWVydCB3ZXJkZW4gc29sbGVuLCBzbyBrYW5uIGRpZSAqLworCQkvKiBGdW5rdGlvbiBpbml0IGdhbnogd2VnZ2VsYXNzZW4gd2VyZGVuLiBFaW4gaW5pdCwgZGFzIG51ciAqLworCQkvKiA6OmluaXQoKSBhdWZydWZ0IGlzdCB1ZWJlcmZsdWVzc2lnLiAqLworCisJYWRkX2FjdGlvbiggInd1cmYiLCAid2VyZiIsIDEgKTsKKwlhZGRfYWN0aW9uKCAid3VyZiIsICJ3aXJmIiApOworCQkvKiB3ZXJmZSwgd2VyZiBvZGVyIHdpcmYgamVtYW5kZW0gZGVuIEJhbGwgenUuIE1hbiBzb2xsdGUgZGFyYXVmICovCisJCS8qIGFjaHRlbiwgZGFzcyBuYXR1ZXJsaWNoZSBTYWV0emUgYWxzIEVpbmdhYmUgYWt6ZXB0aWVydCB3ZXJkZW4uICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKiogRGllIGdydW5kbGVnZW5kZW4gRnVua3Rpb25lbiBlbmRlbiBoaWVyICoqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKiBFaW5lIEJlaXNwaWVsYWt0aW9uIGZ1ZXIgZGVuIEJhbGwuICovCit3dXJmKCBhcmd1bWVudCApCit7CisJLyogIndlcmYgYmFsbCBydW1hdGEgenUiIHdpcmQgYWxzIEFyZ3VtZW50ICJiYWxsIHJ1bWF0YSB6dSIgYmVrb21tZW4uICovCisJc3RyaW5nIGFyZzEsIGFyZzI7CisJc3RyaW5nIHppZWw7CisJb2JqZWN0IHppZWxPYmo7CisKKwlpZiAoIHNzY2FuZiggYXJndW1lbnQsICIlcyAlcyB6dSIsIGFyZzEsIGFyZzIgKSAhPSAyICkgcmV0dXJuIDA7CisJCS8qIFJ1ZWNrZ2FiZSB2b24gMCBiZWRldXRldCwgZGFzcyBkaWVzZXMgT2JqZWt0IG1pdCBkZXIgRWluZ2FiZSAqLworCQkvKiBuaWNodHMgYW5mYW5nZW4ga29ubnRlLCB1bmQgZGFzcyBkZXIgR2FtZWRyaXZlciBkYXMgbmFlY2hzdGUgKi8KKwkJLyogT2JqZWt0IGJlZnJhZ2VuIHNvbGwuICovCisKKwlpZiAoIGlkKCBhcmcxICkgKQorCQkJLyogV2VsY2hlcyBkZXIgQXJndW1lbnRlIHNwcmljaHQgZGVuIEJhbGwgYW4gPyAqLworCQkJLyogRGFzIGFuZGVyZSBtdXNzIGRhbm4gZGFzIFppZWwgZGVzIEJhbGxzIHNlaW4uICovCisJCXppZWwgPSBhcmcyOworCWVsc2UgaWYgKCBpZCggYXJnMiApICkKKwkJemllbCA9IGFyZzE7CisJZWxzZQorCQlyZXR1cm4gMDsKKwkJCS8qIEtlaW5lcyBkZXIgQXJndW1lbnRlIHdhciBkZXIgQmFsbC4gKi8KKworCXppZWxPYmogPSBwcmVzZW50KCB6aWVsLCBlbnZpcm9ubWVudCgpICk7CisJCS8qIFN1Y2hlIGVpbiBPYmpla3QsIGRhcyBzaWNoIGFscyBaaWVsIGFuZ2VzcHJvY2hlbiBmdWVobHQuICovCisKKwlpZiAoICEgemllbE9iaiApCisJeworCQl3cml0ZSggIkhpZXIgaXN0IGtlaW4gXCIiICsgemllbCArICJcIi5cbiIgKTsKKwkJcmV0dXJuIDE7CisJCQkvKiBIaWVyIHdpcmQgMSB6dXJ1ZWNrZ2VnZWJlbiwgZGEgZGVyIEJhbGwgZGFzIEtvbW1hbmRvIGRlbiAgKi8KKwkJCS8qIEJlZmVobCBiZWFyYmVpdGVuIGtvbm50ZS4gRXIgaGF0IHp3YXIga2VpbiBaaWVsIGdlZnVuZGVuLCAqLworCQkJLyogYWJlciBtYW4ga2FubiBqYSBuaWNodCBhbGxlcyBoYWJlbi4gOi0pICovCisJfQorCQorCWlmKCAhbGl2aW5nKCB6aWVsT2JqICkgKQorCXsKKwkJd3JpdGUoICJVbmQgd2llIHNvbGwgIiArIHppZWxPYmotPm5hbWUoV0VSLDEpICsgIiBkZW4gQmFsbCBmYW5nZW4/XG4iICk7CisJCXJldHVybiAxOworCQkJLyogTnVyIGxlYmVuZGUgV2VzZW4gc29sbGVuIEJhZWxsZSBmYW5nZW4ga29lbm5lbi4gKi8KKwl9CisKKwl3cml0ZSggIkR1IHdpcmZzdCAiICsgemllbE9iai0+bmFtZShXRU4sMSkgKyAiIGRlbiBCYWxsIHp1LlxuIiApOworCQkJLyogTWl0dGVpbHVuZyBhbiBkZW4gV2VyZmVyICovCisJc2F5KCBQTC0+bmFtZShXRVIsMikgKyAiIHdpcmZ0ICIgKyB6aWVsT2JqLT5uYW1lKFdFTSwyKQorCQkrICIgZWluZW4gQmFsbCB6dS5cbiIsIHppZWxPYmogKTsKKwkJCS8qIE1pdHRlaWx1bmcgYW4gYWxsZSBXZXNlbSBpbSBzZWxiZW4gUmF1bS4gKi8KKwl0ZWxsX29iamVjdCggemllbE9iaiwgIkhvcHBsYSwgIiArIFBMLT5uYW1lKFdFUiwyKQorCQkrICIgd2lyZnQgRGlyIGVpbmVuIEJhbGwgenUuXG4iICk7CisJCQkvKiBNaXR0ZWlsdW5nIGFuIGRlbiBCZXdvcmZlbmVuICovCisKKwlpZiAoIG1vdmUoIHppZWxPYmogKSApIHJldHVybiAxOworCQkvKiBFcyBoYXQgZ2VrbGFwcHQuICovCisKKwltb3ZlKCBlbnZpcm9ubWVudCgpICk7CisJCS8qIEltIEZlaGxlcmZhbGwgc29sbCBkZXIgQmFsbCB6dSBCb2RlbiBmYWxsZW4uICovCisKKwl3cml0ZSggIkFiZXIgIiArIHppZWxPYmotPlF1ZXJ5UHJvbm91bihXRVIpCisJCSsgIiBrYW5uIGlobiBuaWNodCBmYW5nZW4uXG5EZXIgQmFsbCBwbHVtcHN0IHp1IEJvZGVuLlxuIiApOworCXNheSggIkFiZXIgIiArIHppZWxPYmotPlF1ZXJ5UHJvbm91bihXRVIpCisJCSsgIiBrYW5uIGlobiBuaWNodCBmYW5nZW4uXG5EZXIgQmFsbCBwbHVtcHN0IHp1IEJvZGVuLlxuIiwgemllbE9iaiApOworCXRlbGxfb2JqZWN0KCB6aWVsT2JqLAorCQkiQWJlciBEdSBrYW5uc3QgaWhuIG5pY2h0IGZhbmdlbi5cbkRlciBCYWxsIHBsdW1wc3QgenUgQm9kZW4uXG4iICk7CisKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2RvYy93aXovcGFyYXJhZXVtZSBiL2RvYy93aXovcGFyYXJhZXVtZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjYzZGE2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dpei9wYXJhcmFldW1lCkBAIC0wLDAgKzEsODQgQEAKK1BhcmEtUmFldW1lCisKKyAgICBHcnVuZHNhZXR6bGljaCB3aXJkIGVpbiBQYXJhLVJhdW0gZGFkdXJjaCBnZWtlbm56ZWljaG5ldCwgZGFzcyBhbiBkZW4gCisgICAgRGF0ZWluYW1lbiBlaW4gXm4gYW5nZWhhZW5ndCB3aXJkLCBuIGdpYnQgZGllIERpbWVuc2lvbiBhbi4gRWluIFJhdW0gaW4gCisgICAgUGFyYSAxIHd1ZXJkZSBhbHNvIHJhdW1eMS5jIGhlaXNzZW4uCisKKyAgICBNYW4gbXVzcyBzaWNoIG5pY2h0IHNlbGJzdCBkYXJ1bSBrdWVtbWVybiwgZGFzcyBTcGllbGVyIGluIGRlbiByaWNodGlnZW4KKyAgICBQYXJhLVJhdW0gYmV3ZWd0IHdlcmRlbiwgZGFzIHBhc3NpZXJ0IGltIG1vdmUoKS4KKworICAgIERhbWl0IG1hbiBiZWkgZ2xlaWNoZW4gUmFldW1lbiwgZGllIHNpY2ggbnVyIGR1cmNoIGJlaXNwaWVsc3dlaXNlIGRpZQorICAgIEFud2VzZW5oZWl0IGVpbmVzIGZpZXNlbiBNb25zdGVycyB1bnRlcnNjaGVpZGVuIG5pY2h0IGFsbGVzIGRvcHBlbHQKKyAgICBiZXNjaHJlaWJlbiBtdXNzLCBzb2xsdGUgbWFuIGRhcyBiZWthbm50ZSBLb256ZXB0IGRlciBWZXJlcmJ1bmcKKyAgICB2ZXJ3ZW5kZW4uIEhpZXJmdWVyIGdpYnQgZXMgendlaSBBbnNhZXR6ZToKKworTE9FU1VORyAxOgorICAgIEhhYmUgaWNoIGVpbmVuIFJhdW0sIGRlciBpbiBQYXJhIGV4YWt0IHNvIGlzdCB3aWUgaW4gTm9ybWFsLCB3byBudXIgZWluZQorICAgIFNhY2hlIGhpbnp1Z2VmdWVndCB3aXJkLCBzY2hyZWliZSBpY2ggbWVpbmVuIFJhdW0gaW4gbm9ybWFsIHNvIHdpZSBpY2ggZXMKKyAgICBpbW1lciB0dW4gd3VlcmRlLCBlcmJlIGRpZXNlbiBpbSBQYXJhLVJhdW0gdW5kIHNldHplIG1laW4gZmllc2VzIE1vbnN0ZXIKKyAgICBoaW5laW4uCisgICAgRWluemlnZXIgVW50ZXJzY2hpZWQgaW0gTm9ybWFsLVJhdW06IERhbWl0IGVyIGltbWVyIGluaXRpYWxpc2llcnQgd2lyZCwKKyAgICBtdXNzIGljaCBjcmVhdGVfc3VwZXIoKSBlcnN0ZWxsZW4gdW5kIGRhcmluIGNyZWF0ZSBhdWZydWZlbi4gU29uc3QgYnVnZ3QKKyAgICBkZXIgTm9ybWFscmF1bSBiZWltIEJldHJldGVuLCBmYWxscyBkZXIgUGFyYXJhdW0genVlcnN0IGJldHJldGVuIHd1cmRlLAorICAgIHdlaWwgZGVyIE5vcm1hbHJhdW0gZGFubiB6d2FyIGdlbGFkZW4gYWJlciBzZWxic3QgbmljaHQgaW5pdGlhbGlzaWVydAorICAgIHd1cmRlLgorCisgICAgQmVpc3BpZWw6CisKKyAgICByYXVtLmM6CisgICAgaW5oZXJpdCAiL3N0ZC9yb29tIjsKKworICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZSgpIHsKKyAgICAgIDo6Y3JlYXRlKCk7CisgICAgICAuLi4KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVfc3VwZXIoKSB7CisgICAgICBjcmVhdGUoKTsKKyAgICB9CisKKyAgICByYXVtXjEuYzoKKyAgICBpbmhlcml0ICJyYXVtIjsKKworICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZSgpIHsKKyAgICAgIDo6Y3JlYXRlKCk7CisgICAgICBBZGRJdGVtKCJmaWVzZXNfbW9uc3RlciIsUkVGUkVTSF9SRU1PVkUpOworICAgIH0KKworTE9FU1VORyAyOgorICAgIEhhYmUgaWNoIGVpbmVuIFJhdW0sIHdvIGF1Y2ggaW4gTm9ybWFsIERpbmdlIGV4aXN0aWVyZW4sIGRpZSBlcyBuaWNodCBpbgorICAgIFBhcmEgZ2ViZW4gc29sbCwga2FubiBpY2ggZWluZW4gUmF1bSBtaXQgZGVyIERpbWVuc2lvbnNudW1tZXIgMCBlcnN0ZWxsZW4uCisgICAgRGllc2VyIHdpcmQgbmllbWFscyBhdXRvbWF0aXNjaCBiZXRyZXRlbiwgYXVzc2VyIGVpbiBBdXNnYW5nIGZ1ZWhydAorICAgIGV4cGxpeml0IGRvcnQgaGluLgorCisgICAgQmVpc3BpZWw6CisKKyAgICByYXVtXjAuYzoKKyAgICBpbmhlcml0ICIvc3RkL3Jvb20iOworCisgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkgeworICAgICAgOjpjcmVhdGUoKTsKKyAgICAgIC4uLgorICAgIH0KKworICAgIHJhdW0uYzoKKyAgICBpbmhlcml0ICJyYXVtXjAiOworCisgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkgeworICAgICAgOjpjcmVhdGUoKTsKKyAgICAgIEFkZEl0ZW0oImhhcm1sb3Nlc19tb25zdGVyIixSRUZSRVNIX1JFTU9WRSk7CisgICAgfQorCisgICAgcmF1bV4xLmM6CisgICAgaW5oZXJpdCAicmF1bV4wIjsKKworICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZSgpIHsKKyAgICAgIDo6Y3JlYXRlKCk7CisgICAgICBBZGRJdGVtKCJmaWVzZXNfbW9uc3RlciIsUkVGUkVTSF9SRU1PVkUpOworICAgIH0KKworCitTSUVIRSBBVUNIOgorICAgIG1vdmUoTCksIGNyZWF0ZV9zdXBlcihMKSwgUF9QQVJBKFApCisKK0xldHp0ZSBBZW5kZXJ1bmc6IDE4LjAxLjIwMTUsIEJ1Z2ZpeApkaWZmIC0tZ2l0IGEvZG9jL3dpei9wYXJpZXJ3YWZmZW4gYi9kb2Mvd2l6L3BhcmllcndhZmZlbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGNiOWJjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dpei9wYXJpZXJ3YWZmZW4KQEAgLTAsMCArMSwxOCBAQAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgIFJlZ2VsbiB6dXIgUHJvZ3JhbW1pZXJ1bmcgdm9uIFBhcmllcndhZmZlbjoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitTdGFuZGFyZG9iamVrdDogL3N0ZC93ZWFwb24uYworCitTaWVoZSBoaWVyenU6IC9kb2Mvd2l6L2JhbGFuY2UgICAob2RlciAnbWFuIGJhbGFuY2UnKQorCitBa3R1ZWxsZSBHcmVuendlcnRlOgorPT09PT09PT09PT09PT09PT09PT0KKworICAgUGFyaWVyLVR5cCAgIEdlbmVobWlndW5nc2dyZW56ZQorICAtLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgUEFSUllfT05MWSAgIFdpZSBSdXN0dW5nZW4gdm9tIFR5cCBBVF9TSElFTEQKKyAgUEFSUllfVE9PICAgIEdlbmVyZWxsZSBHZW5laG1pZ3VuZ3NwZmxpY2h0CisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUGFyYWNlbHN1c0BNb3JnZW5HcmF1ZW4sIDE4LzA4LzE5OTkKZGlmZiAtLWdpdCBhL2RvYy93aXovcG90aW9ubWFzdGVyIGIvZG9jL3dpei9wb3Rpb25tYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI4YmZkMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93aXovcG90aW9ubWFzdGVyCkBAIC0wLDAgKzEsMTk3IEBACitEZXIgUG90aW9ubWFzdGVyICgvc2VjdXJlL3BvdGlvbm1hc3RlcikKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitCRVNDSFJFSUJVTkcKKworICAgIEZ1bmt0aW9uOiBWZXJ3YWx0dW5nIGRlciBaYXViZXJ0cmFlbmtlLCBkaWUgU3BpZWxlciBmaW5kZW4ga29lbm5lbi4KKworICAgIFphdWJlcnRyYWVua2Uga29lbm5lbiB2b24gYmVsaWViaWdlbiBPYmpla3RlbiBpbSBTcGllbCB2ZXJnZWJlbiB3ZXJkZW4uCisgICAgSmVkZXIgU3BydWNoIGlzdCBpbiBlaW5lciBlaWdlbmVuIERhdGVpIGluIC9zZWN1cmUvQVJDSC9aVCBoaW50ZXJsZWd0LAorICAgIHdvYmVpIGRlciBEYXRlaW5hbWUgZGFzIGFsbGdlbWVpbmUgRm9ybWF0IDxucj4uenQgaGFiZW4gbXVzcy4gPG5yPgorICAgIGVudHNwcmljaHQgaGllcmJlaSBkZXIgWlQtTnVtbWVyLgorCisgICAgRGllIFRpcHMgenUgZGVuIFRyYWVua2VuIHdlcmRlbiB2b20gT3Jha2VsIC9yb29tL29yYWtlbCBhdXNnZWdlYmVuLAorICAgIHNvZmVybiBkZXIgU3BpZWxlciBnZW51ZyBTdHVmZW5wdW5rdGUgZnVlciBlaW5lbiBuZXVlbiBTcHJ1Y2ggZXJzcGllbHQKKyAgICBoYXQgKHNpZWhlIGhpZXJ6dSAiaGlsZmUgenQiKS4gRGllIFRpcHMgd2VyZGVuIGRhYmVpIGF1cyBkZW4gby5nLiBEYXRlaWVuCisgICAgZWluZ2VsZXNlbi4gRGVyIFpUIHdpcmQgdm9uIGRlbSB2ZXJnZWJlbmRlbiBPYmpla3QgZHVyY2ggQXVmcnVmIHZvbgorICAgIEZpbmRQb3Rpb24oc3RyaW5nIG1zZykgaW0gU3BpZWxlcm9iamVrdCBndXRnZXNjaHJpZWJlbi4KKworICAgIEluIGRpZXNlciBEYXRlaSBzaW5kIGRpZSBGdW5rdGlvbmVuIGRlcyBQb3Rpb25tYXN0ZXJzIGRva3VtZW50aWVydC4KKyAgICBJbmhhbHQ6CisKKyAgICAxLiBaYXViZXJ0cmFlbmtlIGVpbnRyYWdlbiB1bmQgYWt0aXZpZXJlbi9kZWFrdGl2aWVyZW4KKyAgICAyLiBaYXViZXJ0cmFlbmtlIGluIGVpbmUgTGlzdGUgZWluc29ydGllcmVuCisgICAgMy4gWmF1YmVydHJhZW5rZSB2ZXJsZWdlbgorICAgIDQuIERhdGVuIHp1IFphdWJlcnRyYWVua2VuIGFiZnJhZ2VuCisgICAgNS4gRWluIG5ldWVyIFpUOiBXYXMgdHVuPworICAgIDYuIEZvcm1hdCBkZXIgWmF1YmVydHJhbmstVGlwcworICAgIDcuIFdvIGZpbmRlIGljaCBlaWdlbnRsaWNoPworICAgIDguIFZlcnNjaGllZGVuZXMKKworCitGVU5LVElPTkVOCisKKzEuIFphdWJlcnRyYWVua2UgZWludHJhZ2VuIHVuZCBha3RpdmllcmVuL2RlYWt0aXZpZXJlbgorCisgICBpbnQgQWRkUG90aW9ucm9vbShzdHJpbmcgcm9vbSwgaW50IGxpc3QpCisgICAgICBEZXIgUmF1bSA8cm9vbT4gd2lyZCBhbHMgbmV1ZXIgWlQtRnVuZG9ydCBlaW5nZXRyYWdlbiB1bmQgaW4gZGllIExpc3RlCisgICAgICBtaXQgZGVyIE51bW1lciA8bGlzdD4gZWluZ2VmdWVndC4gcm9vbSBtdXNzIGhpZXJiZWkgZGVyIGxvYWRfbmFtZSgpIAorICAgICAgZGVzIE9iamVrdHMgc2VpbiwgdW50IDxsaXN0PiBkYXJmIFdlcnRlIHZvbiAwIGJpcyA3IGhhYmVuLiBEZXIgWlQKKyAgICAgIHdpcmQgZGFiZWkgYWt0aXZpZXJ0LgorICAgICAgCisgICAgICBSdWVja2dhYmV3ZXJ0ZToKKyAgICAgIDxudW0+IE51bW1lciBkZXMgbmFlY2hzdGVuIG5ldWVuIFpUcywgPG51bS0xPiBpc3QgZGllIE51bW1lciBkZXMKKyAgICAgICAgICAgIG5ldSBlaW5nZXRyYWdlbmVuIFpUcy4KKyAgICAgIC0xICAgIFp1Z3JpZmYgdmVyd2VpZ2VydAorICAgICAgLTIgICAgPHJvb20+IGtlaW4gU3RyaW5nLCA8bGlzdD4gaXN0IG5pY2h0IGltIEJlcmVpY2ggMC03CisgICAgICAtMyAgICA8cm9vbT4gaXN0IG5pY2h0IGxhZGJhcgorICAgICAgLTQgICAgPHJvb20+IHZlcmdpYnQgc2Nob24gZWluZW4gKGFuZGVyZW4pIFpUCisgICAgICAtNiAgICBEYXRlaSBtaXQgWlQtU3BydWNoICgvc2VjdXJlL0FSQ0gvWlQvPG51bT4uenQpIGV4aXN0aWVydCBuaWNodC4KKworICAgaW50IEFjdGl2YXRlUm9vbShzdHJpbmcgcm9vbSkKKyAgICAgIERlciBaVCBpbSBSYXVtIDxyb29tPiB3aXJkIGFrdGl2aWVydCwgZC5oLiBlciBrYW5uIGFrdGl2IHZvbiBkZW0gUmF1bQorICAgICAgdmVyZ2ViZW4gd2VyZGVuLiBUZWNobmlzY2ggd2lyZCBlciBhdXMgZGVyIExpc3RlIGRlciBpbmFrdGl2ZW4gWlRzCisgICAgICBhdXNnZXRyYWdlbi4gPHJvb20+IG11c3MgaGllcmJlaSBkZXIgbG9hZF9uYW1lKCkgZGVzIFJhdW1lcyBzZWluLgorCisgICAgICBSdWVja2dhYmV3ZXJ0ZToKKyAgICAgIDxudW0+ICBOdW1tZXIgZGVzIGFrdGl2aWVydGVuIFpUcworICAgICAgLTEgICAgIFp1Z3JpZmYgdmVyd2VpZ2VydAorICAgICAgLTUgICAgIHVuZ3VlbHRpZ2VyIFpUIChSYXVtIGlzdCBuaWNodCBhbHMgWlQtT2JqZWt0IGVpbmdldHJhZ2VuKQorICAgICAgLTggICAgIDxyb29tPiBpc3QgYmVyZWl0cyBha3RpdmllcnQKKworICAgaW50IERlYWN0aXZhdGVSb29tKHN0cmluZyByb29tKQorICAgICAgRGVyIFpUIGltIE9iamVrdCA8cm9vbT4gd2lyZCBkZWFrdGl2aWVydCwgZC5oLiBlciBrYW5uIG5pY2h0IG1laHIKKyAgICAgIHZvbiBkZW0gT2JqZWt0IHZlcmdlYmVuIHdlcmRlbi4gVGVjaG5pc2NoIHdpcmQgZXIgaW4gZGllIExpc3RlIGRlcgorICAgICAgaW5ha3RpdmVuIFpUcyBlaW5nZXRyYWdlbi4gPHJvb20+IG11c3MgaGllcmJlaSBkZXIgbG9hZF9uYW1lKCkgZGVzCisgICAgICBSYXVtZXMgc2Vpbi4KKworICAgICAgUnVlY2tnYWJld2VydGU6CisgICAgICA8bnVtPiAgTnVtbWVyIGRlcyBnZWFlbmRlcnRlbiBaVHMKKyAgICAgIC0xICAgICBadWdyaWZmIHZlcndlaWdlcnQKKyAgICAgIC01ICAgICB1bmd1ZWx0aWdlciBaVAorICAgICAgLTkgICAgIDxyb29tPiBpc3QgYmVyZWl0cyBpbmFrdGl2CisKKzIuIFphdWJlcnRyYWVua2UgaW4gZWluZSBMaXN0ZSBlaW5zb3J0aWVyZW4KKworICAgaW50IFNldExpc3ROcihzdHJpbmcgcm9vbSwgaW50IGxpc3QpCisgICAgICBUcmFlZ3QgZGVuIFphdWJlcnRyYW5rIGluIFJhdW0gPHJvb20+IGluIGRpZSBMaXN0ZSA8bGlzdD4gZWluLiAKKyAgICAgIDxyb29tPiBtdXNzIGhpZXJiZWkgZGVyIGxvYWRfbmFtZSgpIGRlcyBPYmpla3RzIHNlaW4uCisKKyAgICAgIFJ1ZWNrZ2FiZXdlcnRlOgorICAgICAgPG51bT4gIE51bW1lciBkZXMgZ2VhZW5kZXJ0ZW4gWlRzCisgICAgICAtMSAgICAgWnVncmlmZiB2ZXJ3ZWlnZXJ0CisgICAgICAtNSAgICAgdW5ndWVsdGlnZXIgWlQKKyAgICAgIC03ICAgICA8bGlzdD4gYXVzc2VyaGFsYiBkZXIgenVnZWxhc3NlbmVuIFdlcnRlLCBkLmguIDwwIG9kZXIgPjcKKworMy4gWmF1YmVydHJhZW5rZSB2ZXJsZWdlbgorCisgICBpbnQgQ2hhbmdlUm9vbVBhdGgoc3RyaW5nIG9sZCwgc3RyaW5nIG5ldykKKyAgICAgIERlciBaYXViZXJ0cmFuayBpbiBSYXVtIDxvbGQ+IHdpcmQgaW4gZGVuIFJhdW0gPG5ldz4gdW1nZXRyYWdlbi4KKworICAgICAgUnVlY2tnYWJld2VydGU6CisgICAgICA8bnVtPiBOdW1tZXIgZGVzIGVyZm9sZ3JlaWNoIGdlYWVuZGVydGVuIFphdWJlcnRyYW5rcworICAgICAgLTEgICAgWnVncmlmZiB2ZXJ3ZWlnZXJ0CisgICAgICAtMiAgICA8bmV3PiBvZGVyIDxvbGQ+IG9kZXIgYmVpZGUgc2luZCBrZWluZSBTdHJpbmdzCisgICAgICAtMyAgICA8b2xkPiB2ZXJnaWJ0IGtlaW5lbiBaVCwgZXMgZ2lidCBhbHNvIG5pY2h0cyB6dSB2ZXJsZWdlbiwgb2RlcgorICAgICAgICAgICAgPG5ldz4gaXN0IG5pY2h0IGxhZGJhciwgZG9ydGhpbiBrYW5uIGFsc28gbmljaHQgdmVybGVndCB3ZXJkZW4KKyAgICAgIC00ICAgIDxuZXc+IGhhdCBzY2hvbiBlaW5lbiBaYXViZXJ0cmFuaworCis0LiBEYXRlbiB6dSBaYXViZXJ0cmFlbmtlbiBhYmZyYWdlbgorCisgICBtaXhlZCBRdWVyeVBvdGlvbkRhdGEoaW50IG51bSkKKyAgICAgIEFiZnJhZ2UgZGVyIERhdGVuIHp1IGRlbSBaVCBtaXQgZGVyIE51bW1lciA8bnVtPi4gQXVzZ2VnZWJlbiB3aXJkIGVpbgorICAgICAgTWFwcGluZyBkZXIgRm9ybSAoWyBudW0gOiBSYXVtcGZhZDsgTGlzdGVubnVtbWVyIF0pCisKKyAgIGludCBRdWVyeUluYWN0aXZlUG90aW9ucygpCisgICAgICBMaWVmZXJ0IGVpbiBBcnJheSBtaXQgZGVuIE51bW1lcm4gZGVyIGFrdHVlbGwgZGVha3RpdmllcnRlbiBaVHMgenVydWVjay4KKworICAgaW50IFF1ZXJ5QWN0aXZlKG1peGVkIHBvdGlvbikKKyAgICAgIEdpYnQgenUgZWluZXIgWlQtTnVtbWVyIG9kZXIgZWluZW0gUmF1bXBmYWQgYW4sIG9iIGRlciBiZXRyZWZmZW5kZSBaVAorICAgICAgYWt0aXYgaXN0IG9kZXIgbmljaHQuIFdlbm4gamEsIHdpcmQgZGllIGVudHNwcmVjaGVuZGUgWlQtTnVtbWVyCisgICAgICB6dXJ1ZWNrZ2VnZWJlbi4KKyAgICAgIAorICAgICAgUnVlY2tnYWJld2VydGU6CisgICAgICA8bnVtPiBOdW1tZXIgZGVzIGFiZ2VmcmFndGVuIFpUcworICAgICAgLTEgICAgWnVncmlmZiB2ZXJ3ZWlnZXJ0CisgICAgICAtNSAgICB1bmd1ZWx0aWdlciBaVAorICAgICAgLTExICAgWlQgaXN0IG5pY2h0IGFrdGl2CisgICAKKyAgIHN0cmluZyBHZXRGaWxlbmFtZUJ5TnVtYmVyKGludCBucikKKyAgICAgIEFiZnJhZ2UgZGVzIERhdGVpbmFtZW5zIHp1IFphdWJlcnRyYW5rIE51bW1lciA8bnI+LgorICAgICAgCisgICAgICBSdWVja2dhYmV3ZXJ0ZToKKyAgICAgIDxudW0+IE51bW1lciBkZXMgYWJnZWZyYWd0ZW4gWlRzCisgICAgICAtMSAgICBadWdyaWZmIHZlcndlaWdlcnQKKyAgICAgIC01ICAgIHVuZ3VlbHRpZ2VyIFpUCisKKyAgIGludCBIYXNQb3Rpb24ob2JqZWN0IG9iaikKKyAgICAgIEFiZnJhZ2UgZGVyIFphdWJlcnRyYW5rbnVtbWVyLCBkaWUgdm9uIGRlbSBPYmpla3QgPG9iaj4gdmVyZ2ViZW4gd2lyZC4KKyAgICAgIAorICAgICAgUnVlY2tnYWJld2VydGU6CisgICAgICA8bnVtPiBOdW1tZXIgZGVzIGFiZ2VmcmFndGVuIFpUcworICAgICAgLTEgICAgWnVncmlmZiB2ZXJ3ZWlnZXJ0CisgICAgICAtMyAgICBSYXVtIHZlcmdpYnQga2VpbmVuIFpUCisKKyAgIGludCBHZXRMaXN0QnlOdW1iZXIoaW50IG5yKQorICAgICAgQWJmcmFnZSBkZXIgTGlzdGUgYWt0aXZlciBaVHMsIGluIGRlciBkZXIgWlQgbWl0IGRlciBOdW1tZXIgPG5yPgorICAgICAgZWluZ2V0cmFnZW4gaXN0LgorICAgICAgUnVlY2tnYWJlOiBOdW1tZXIgZGVyIExpc3RlLCBpbiBkZXIgZGVyIFpUIGVudGhhbHRlbiBpc3QsIHNvbnN0IC01LgorCisgICBpbnQgR2V0SW5hY3RMaXN0QnlOdW1iZXIoaW50IG5yKQorICAgICAgQWJmcmFnZSBkZXIgTGlzdGUgaW5ha3RpdmVyIFpUcywgaW4gZGVyIGRlciBaVCBtaXQgZGVyIE51bW1lciA8bnI+CisgICAgICBlaW5nZXRyYWdlbiBpc3QuCisgICAgICBSdWVja2dhYmU6IE51bW1lciBkZXIgTGlzdGUsIGluIGRlciBkZXIgWlQgZW50aGFsdGVuIGlzdCwgc29uc3QgLTEwLgorCis1LiBFaW4gbmV1ZXIgWlQ6IFdhcyB0dW4/CisKKyAgIEFkZFBvdGlvblJvb20obmV3cm9vbSwgbGlzdGUpIGF1ZnJ1ZmVuLiBXZW5uIGVpbiBGZWhsZXIgYXVmdHJpdHQsIG11c3MKKyAgIG5vY2ggZGVyIFpULVRpcCBpbiBkZW0gdW50ZXIgNi4gYmVzY2hyaWViZW5lbiBGb3JtYXQgaGludGVybGVndCB3ZXJkZW4uCisgICBEZXIgenUgdmVyd2VuZGVuZGUgRGF0ZWluYW1lIGlzdCBpbiBkZXIgRmVobGVybWVsZHVuZyBhbmdlZ2ViZW4uCisKKzYuIEZvcm1hdCBkZXIgWmF1YmVydHJhbmstVGlwcworCisgICBFaW4gQmVpc3BpZWwgbWl0IHp3ZWkgVGlwcyBmdWVyIGRlbnNlbGJlbiBaYXViZXJ0cmFuazoKKworICAgRGllIFphdWJlcm1hdXMgd29sbHRzIHdvaGwgdmVyc3RlY2tlbiwKKyAgIEltIEJ1ZWNoZXJ3YWxkIHNvbGxzdCBuaWNodHMgZW50ZGVja2VuLAorICAgRGVubiBUcmlua2dlbnVzcyBpc3QgZG9ydCB2ZXJwb2VudCwKKyAgIFNvIGlzdCBtYW5zIGF1Y2ggUkwgZ2V3b2VobnQuCisgICBYWFhYWAorICAgRGVyIFJhdW0gaXN0IHByYWxsIHVuZCBzdGFyIGdlZnVlbGx0LAorICAgTWl0IHZpZWwgUGFwaWVyLCBkYXMgZ2VybiB2ZXJodWVsbHQKKyAgIEluIFphdWJlcmJ1Y2hmb3JtIG1hbmNoZXMgT2QsCisgICBEYXMgaGlsZnQgRGlyIGRhbm4gYXVzIERlaW5lciBOb3QuCisgICAlJSUlJQorCisgICBEaWUgUHJvemVudHplaWNoZW4gc2luZCBkYXMgRW5kZXplaWNoZW4sIGRhbmFjaCBrb2VubmVuIGV2ZW50dWVsbGUKKyAgIEtvbW1lbnRhcmUgc3RlaGVuLiBYWFhYWCBpc3QgZGFzIFRyZW5uemVpY2hlbiB6d2lzY2hlbiB6d2VpIFRpcHMKKyAgIHp1bSBzZWxiZW4gWlQuIEF1c3dpcmt1bmcgaXN0LCBkYXNzIGRlciBTcGllbGVyIGJlaSBqZWRlbSBBdWZydWYKKyAgIHNlaW5lciBaYXViZXJ0cmFuay1MaXN0ZSB6dWZhZWxsaWcgZWluZW4gU3BydWNoIGF1cyBkZXIgTGlzdGUgCisgICBhbmdlemVpZ3QgYmVrb21tdC4KKworNy4gV28gZmluZGUgaWNoIGVpZ2VudGxpY2g/CisKKyAgIC0gZGllIFphdWJlcnRyYW5rLVRpcHM6ICAgICAgICAgICAvc2VjdXJlL0FSQ0gvWlQvKi56dAorICAgLSBkaWUgR2VzYW10bGlzdGUgZGVyIFpUczogICAgICAgIC9zZWN1cmUvQVJDSC9QT1RJT05TLmR1bXAKKyAgIC0gZGFzIFNhdmVmaWxlIGRlcyBQb3Rpb25tYXN0ZXJzOiAvc2VjdXJlL0FSQ0gvcG90aW9ucy5vCisgICAtIGRhcyBMb2dmaWxlIGZ1ZXIgQWVuZGVydW5nZW46ICAgL2xvZy9BUkNIL1BPVElPTlNfTU9ELmxvZworCis4LiBWZXJzY2hpZWRlbmVzCisKKyAgIG1peGVkIFRpcExlc2VuKGludCBucikKKyAgICAgIERhcyBPcmFrZWwgYXVmIGRlciBIb2NoZWJlbmUgcnVmdCBkaWUgWmF1YmVydHJhbmstVGlwcHMgYWIsIGRpZXNlCisgICAgICB3ZXJkZW4gdm9uIGRlciBQbGF0dGUgZ2VsZXNlbiB1bmQgYWxzIFN0cmluZyBhbiBkYXMgT3Jha2VsIAorICAgICAgenVydWVja2dlbGllZmVydC4KKyAgIGludCBEdW1wTGlzdCgpCisgICAgICBEaWUgS29tcGxldHRsaXN0ZSBkZXIgWlRzIGluIGRhcyBEdW1wZmlsZSAvc2VjdXJlL0FSQ0gvUE9USU9OUy5kdW1wCisgICAgICBzY2hyZWliZW4uCisKK1NJRUhFIEFVQ0g6CisgICBTcGllbGVyYmVmZWhsZTogemF1YmVydHJhZW5rZQorICAgTWFnaWVyYmVmZWhsZTogIHRyYWVua2UKKyAgIFByb3BlcnRpZXM6ICAgICBQX1BPVElPTlJPT01TLCBQX0tOT1dOX1BPVElPTlJPT01TCisgICBBbmxlaXR1bmc6ICAgICAgd2l6L3phdWJlcnRyYWVua2UKKyAgIFpUIGZpbmRlbjogICAgICBGaW5kUG90aW9uKEwpCisKKzIwMTMtTWFpLTMwIEFyYXRob3JuCisKZGlmZiAtLWdpdCBhL2RvYy93aXovcXVlc3RzIGIvZG9jL3dpei9xdWVzdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM0NTAyMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93aXovcXVlc3RzCkBAIC0wLDAgKzEsMTYwIEBACitMZWl0ZmFkZW4gZnVlciBkaWUgUXVlc3RlcnN0ZWxsdW5nLy1hYm5haG1lOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCitRdWVzdHMgaW0gTW9yZ2VuR3JhdWVuOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQmVnaW5uZW4gd2lyIG1pdCBlaW5lbSBaaXRhdDoKKworICBCb2luZyBzYWd0OiAnRGFzIE1vcmdlbkdyYXVlbiBpc3QgZWluIFF1ZXN0bXVkLicKKworRGFzIE1vcmdlbkdyYXVlbiB1bnRlcnNjaGVpZGV0IHNpY2ggdm9uIGVpbmlnZW4gYW5kZXJlbiBNdWRzLCBpbmRlbQorZWJlbiBlaW4gc2VociBncm9zc2VyIFdlcnQgYXVmIFF1ZXN0cyBnZWxlZ3Qgd2lyZC4gTWl0dGxlcndlaWxlIGhhYmVuCit3aXIgamEgYXVjaCBzY2hvbiBlaW5lIG9yZGVudGxpY2hlIEFuemFobCBRdWVzdHMuIFRyb3R6ZGVtIGlzdCBlcword2ljaHRpZyB1bmQgd2lyZCBpbW1lciB3aWVkZXIgZ2VybmUgZ2VzZWhlbiwgd2VubiBuZXVlIFF1ZXN0cyBnZXByb2dndAord2VyZGVuLiBEYXJ1ZWJlcmhpbmF1cyBibGVpYnQgbWFuIGFscyBNYWdpZXIgbmF0dWVybGljaCBhdWNoIGxhZW5nZXIKK2ltIFNwaWVsIGJla2FubnQuIEdlcmFkZSB3ZWlsIFF1ZXN0cyBhdWNoIGVpbmUgd2ljaHRpZ2UgQW5mb3JkZXJ1bmcKK3p1bSBTZWhlcnR1bSBzaW5kLCBtdXNzIGlobmVuIGVpbiBiZXNvbmRlcmVzIEF1Z2VubWVyayBzZWl0ZW5zIGRlcworcHJvZ3JhbW1pZXJlbmRlbiBNYWdpZXJzIGdld2lkbWV0IHdlcmRlbiB1bmQgYmVzb25kZXJzIHNvcmdmYWVsdGlnCitnZWFyYmVpdGV0IHdlcmRlbi4gRGF6dSBnaWJ0IGVzIG51biBpbSBmb2xnZW5kZW4gZWluIHBhYXIgSGlud2Vpc2UsCitkaWUgbWFuIGFscyBRdWVzdHByb2dyYW1taWVyZXIgZWluaGFsdGVuIHNvbGx0ZSwgZGFtaXQgZGllIFF1ZXN0CitnZW5laG1pZ3Qgd2VyZGVuIGthbm4gdW5kIGJlaSBkZW4gU3BpZWxlcm4gZ3V0IGFua29tbXQuCisKK1F1ZXN0aWRlZW46CistLS0tLS0tLS0tLQorCitEaWVzIGlzdCBkZXIgd2ljaHRpZ3N0ZSBCZXN0YW5kdGVpbCBlaW5lciBRdWVzdC4gSGllciBzb2xsdGUgbWFuIHNpY2gKK3NlaHIgdmllbCBNdWVoZSBnZWJlbiwgZGVubiBtaXQgZGVtIEtvbnplcHQgc3RlaHQgdW5kIGZhZWxsdCBlaW5lCitRdWVzdC4gRGFtaXQgU3BpZWxlciBTcGFzcyBhbiBlaW5lciBRdWVzdCBoYWJlbiwgaXN0IGVpbmUgZ3V0ZSBTdG9yeSwKK2VpbiBndXRlcyBLb256ZXB0IHVuYWJkaW5nYmFyLiBFaW4gd2ljaHRpZ2VyIEVyZm9sZ3NmYWt0b3IgaXN0IGFuCitkaWVzZXIgU3RlbGxlIGF1Y2gsIHNpY2ggcmVjaHR6ZWl0aWcgbWl0IGRlbSBiZXRyb2ZmZW5lbiBSZWdpb25zbWFnaWVyCit1bmQgZGVtIFF1ZXN0ZXJ6bWFnaWVyIGFienVzcHJlY2hlbi4gU3BhZXRlciBoYXQgbWFuIGRhIHZpZWxsZWljaHQKK2tlaW5lIEdlbGVnZW5oZWl0IG1laHIgdW5kIGhhdCBzaWNoIHZpZWwgQXJiZWl0IGdlbWFjaHQgdW5kIG11c3MKK3dpZWRlciB2aWVsIGFlbmRlcm4uIERhaGVyOiBWT1JIRVJJR0VSIEFCU1BSQUNIRSBWRVJNRUlERVQKK0FFUkdFUi4gSW5zYmVzb25kZXJlIGJlaSBRdWVzdHMgbWl0IGhvaGVtIE1ldHplbGFudGVpbCBzb2xsdGUKK3VuYmVkaW5ndCBSdWVja3NwcmFjaGUgZ2VoYWx0ZW4gd2VyZGVuLCBkYSBzb2xjaGUgUXVlc3RzIG5pY2h0IHNvCitnZXJuZSBnZXNlaGVuIHNpbmQuIAorCitRdWVzdHVtc2V0enVuZzoKKy0tLS0tLS0tLS0tLS0tLQorCitCZWkgZGVyIFVtc2V0enVuZyBrYW5uIG1hbiBzaWNoIGFuIGRpZSBSZWdlbG4gaGFsdGVuLCBkaWUgYWxsZ2VtZWluCitmdWVyIGRlbiBBbnNjaGx1c3Mgdm9uIEdlYmlldGVuIGdlbHRlbiAoTlBDcywgQmFsYW5jZS4uLikuIEJlc29uZGVyZQorQXVmbWVya3NhbWtlaXQgdmVyZGllbmVuIGRpZSBUZWlsZSwgZGllIHp1ciBMb2VzdW5nIGRlciBRdWVzdAorbm90d2VuZGlnIHNpbmQgKFF1ZXN0aXRlbXMsIFF1ZXN0bWFzdGVyLi4uKSAgRXMgZW1wZmllaGx0IHNpY2ggYXVjaCBpbgorZGllc2VyIFBoYXNlLCBpbW1lciBtYWwgUnVlY2tzcHJhY2hlIG1pdCBkZW0gUmVnaW9uc21hZ2llciBvZGVyCitRdWVzdGVyem1hZ2llciB6dSBoYWx0ZW4uCisKK0VpbmUgUXVlc3RiZWxvaG51bmcgd2lyZCB2b24gU3BpZWxlcm4gaW1tZXIgd2llZGVyIGdlcm5lCitnZW5vbW1lbi4gRGFiZWkgc29sbHRlIG1hbiBhbGxlcmRpbmdzIGVpbiBnZXdpc3NlcyBBdWdlbm1hc3MKK2FubGVnZW4uIE5pY2h0IGZ1ZXIgamVkZSBRdWVzdCBtdXNzIGVzIGVpbmUgc3VwZXIgdG9sbGUKK0F1dG8tTG9hZC1CZWxvaG51bmcgZ2ViZW4uIAorCitGdWVyIGRhcyBrb25rcmV0ZSBVbXNldHplbiBzZWllbiBub2NoIGVpbiBwYWFyIEhpbndlaXNlIGdlZ2ViZW46CisKKyAtIEZ1ZXIgZGllIEF0bW9zcGhhZXJlIHVuZCBkaWUgRGV0YWlscyBzb2xsdGUgbWFuIHNlaHIgdmllbCBNdWVoZQorICAgdmVyd2VuZGVuLCBzbyBkYXNzIHNpY2ggZGVtIFNwaWVsZXIgZGVyIGxvZ2lzY2hlIEF1ZmJhdQorICAgZXJzY2hsaWVzc3QuIEVzIGlzdCBmdWVyIFNwaWVsZXIgYXVzc2Vyb3JkZW50bGljaCBhZXJnZXJsaWNoLCBlaW5lCisgICBRdWVzdCB6dSBzcGllbGVuLCBkZXJlbiBCZXN0YW5kdGVpbGUgaXJnZW5kd2llIGluIGRlciBMdWZ0CisgICBoYWVuZ2VuLiAKKyAtIEVzIHNvbGx0ZSBzaWNoIHNlaHIgZ3V0IHVlYmVybGVndCB3ZXJkZW4sIHdpZSBkaWUgUXVlc3QgcmVhZ2llcnQsIAorICAgd2VubiBtZWhyZXJlIFNwaWVsZXIgZ2xlaWNoemVpdGlnIGRpZSBRdWVzdCBzcGllbGVuIHdvbGxlbiAoZGFzCisgICB3aXJkIGluYmVzb25kZXJlIGRpcmVrdCBuYWNoIGRlbSBBbnNjaGx1c3MgZGVyIEZhbGwgc2VpbikuCisgICBEaWVzIGJlemllaHQgc2ljaCBpbnNiZXNvbmRlcmUgYXVmIFF1ZXN0LU9iamVrdGUsIGRpZSBlaW5lbSBTcGllbGVyCisgICBldnRsLiBuaWNodCB6dXIgVmVyZnVlZ3VuZyBzdGVoZW4sIHdlaWwgc2llIGdlcmFkZSBlaW4gYW5kZXJlCisgICBnZW5vbW1lbiBoYXQsIG9kZXIgUXVlc3QtTlBDcywgZGllIHdpY2h0aWdlIEF1c2t1ZW5mdGUgaGFiZW4sCisgICBhYmVyIGxlaWRlciB1bWdlbmlldGV0IHd1cmRlbi4gV2ljaHRpZ2UgUXVlc3QtTlBDcyBzb2xsdGVuIG5hY2gKKyAgIE1vZWdsaWNoa2VpdCBiZXNzZXIgbmljaHQgYWxzIE1ldHplbG9wZmVyIGtvbnppcGllcnQgd2VyZGVuLgorIC0gTmFjaCBNb2VnbGljaGtlaXQgc29sbHRlIGVzIG5pY2h0IGRhcyBodW5kZXJ0c3RlIExhYnlyaW50aCBnZWJlbi4KKyAtIFdlcmRlbiBmdWVyIGRpZSBRdWVzdCBhbGxnZW1laW5lIE9iamVrdGUgKHdpZSBTY2hhdWZlbG4sIFNlaWxlCisgICBldGMuKSBiZW5vZXRpZ3QsIHNvIHNvbGx0ZW4gYXVjaCBkaWUgYW4gYW5kZXJlciBTdGVsbGUgaW0gTXVkCisgICBlcmhhZWx0bGljaGVuIE9iamVrdGUgZnVua3Rpb25pZXJlbiBvZGVyIGVzIHNvbGx0ZSBmdWVyIGRlbiBTcGllbGVyCisgICBlcmtlbm5iYXIgc2Vpbiwgd2llc28gbnVyIGVpbiBzcGV6aWVsbGVzIE9iamVrdCBkZW4gWndlY2sgZXJmdWVsbHQuCisgLSBRdWVzdG9iamVrdGUgc29sbHRlbiBmdWVyIFNwaWVsZXIgbmljaHQgZXJzdGVsbGJhciBzZWluICgtPgorICAgU2VoZXJiZXV0ZWwpLiAKKyAtIFdpcmQgZGVyIFF1ZXN0Zm9ydHNjaHJpdHQgaW4gZWluZW0gTWFzdGVyIGdlc3BlaWNoZXJ0LCBzbyBlbXBmaWVobHQKKyAgIGVzIHNpY2gsIGRpZSBEYXRlbiB6dSBkZW4gU3BpZWxlcm4gbmFjaCBkZW0gTG9lc2VuIGRlciBRdWVzdCB3aWVkZXIKKyAgIHp1IGxvZXNjaGVuIChlYmVuc28gYmVpIFNwaWVsZXJuLCBkaWUgc2ljaCBnZWxvZXNjaHQgaGFiZW4pLgorIC0gRXMgc29sbHRlbiBzaWNoIGF1Y2ggR2VkYW5rZW4gZ2VtYWNodCB3ZXJkZW4sIHdpZSBkaWUgUXVlc3QgYmVpbQorICAgRWluc2NobGFmZW4sIEJlZW5kZW4gb2RlciBiZWkgZWluZW0gQ3Jhc2ggcmVhZ2llcnQuIEVzIG11c3MgYWxzbworICAgc2ljaGVyZ2VzdGVsbHQgc2VpbiwgZGFzcyBkZXIgU3BpZWxlciBkYW5uIGJlaW0gbmFlY2hzdGVuIAorICAgUXVlc3R2ZXJzdWNoIG5pY2h0IGluIGVpbmVuIGlua29uc2lzdGVudGVuIFp1c3RhbmQgbGFuZGV0LgorIC0gR3V0IGlzdCwgZGVuIFF1ZXN0dmVybGF1ZiBlaW4gd2VuaWcgdmFyaWFibGUgenUgZ2VzdGFsdGVuLCBzbworICAgZGFzcyBkaWUgUXVlc3QgbmljaHQgb2huZSB3ZWl0ZXJlcyBkdXJjaHNrcmlwdGJhciBpc3QuCisgLSBCZWkgUGZsaWNodHF1ZXN0cyBiaXR0ZSBiZWFjaHRlbiwgZGFzcyBOUENzLCBkaWUgendpbmdlbmQgenUgdG9ldGVuCisgICBzaW5kLCBuaWNodCB6dSBzdGFyayBzaW5kLgorIC0gRGFzIE9iamVrdCwgd2VsY2hlcyBkaWUgUXVlc3QgbmFjaCBkZW0gTG9lc2VuIHNldHplbiBzb2xsLCBtdXNzIGVpbmVuIAorICAgQXVmcnVmIHZvbiBHaXZlUXVlc3QgZW50aGFsdGVuLiBEZXN3ZWl0ZXJlbiBpc3QgYmVpbSBlcnN0ZW4gTG9lc2VuIAorICAgaW4gZWluIFF1ZXN0bG9nZmlsZSBpbSBWZXJ6ZWljaG5pcyAvbG9nL3F1ZXN0IGVpbiBFaW50cmFnIHp1IG1hY2hlbiwgCisgICBkYXNzIGRlciBTcGllbGVyIGRpZSBRdWVzdCBiZXN0YW5kZW4gaGF0LiBEaWVzZW4gRWludHJhZyBiaXR0ZSAKKyAgIG1pdCB3cml0ZV9maWxlIHNjaHJlaWJlbi4KKyAgCitRdWVzdHRlc3QgKE1hZ2llcik6CistLS0tLS0tLS0tLS0tLS0tLS0tCisKK051biBrb21tdCBlaW4gZW50c2NoZWlkZW5kZXIgU2Nocml0dCBmdWVyIGRpZSBRdWVzdC4gRGVubiBqZXR6dAorc2NoYXVlbiBhdWNoIGVpbm1hbCBNYWdpZXJrb2xsZWdlbiB1ZWJlciBkaWUgUXVlc3QgdW5kIGtvZW5uZW4gYXVmCitCdWdzLCBsb2dpc2NoZSBGZWhsZXIgdW5kIGtsZWluZXJlIFByb2JsZW1lIGhpbndlaXNlbi4gVW0gbW9lZ2xpY2hzdAordmllbGUgZGVyYXJ0aWdlciBEaW5nZSBhYnp1ZmFuZ2VuLCBzb2xsdGUgbWFuIGF1ZiBkZW4gUXVlc3R0ZXN0IHZpZWwKK1plaXQgdmVyd2VuZGVuIHVuZCBNYWdpZXJrb2xsZWdlbiBiaXR0ZW4sIGRpZSBRdWVzdCBlaW5tYWwgenUgdGVzdGVuLiAKKworUXVlc3R0ZXN0IChTcGllbGVyKToKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1dlbm4gZXMgbW9lZ2xpY2ggaXN0LCBzb2xsdGUgYXVjaCBlaW4gU3BpZWxlciBkaWUgUXVlc3QgZWlubWFsCit0ZXN0ZW4uIEplZG9jaCBzaW5kIGRhenUgZGllIFJlZ2VsbiBmdWVyIFNwaWVsZXJ0ZXN0aWVzICgnbWFuCit0ZXN0aWVzJykgZWluenVoYWx0ZW4uIEVzIGlzdCBpbnNiZXNvbmRlcmUgZGFyYXVmIHp1IGFjaHRlbiwgZGFzcword2VubiBkZW0gVGVzdGllIGV2ZW50dWVsbGUgRm9yc2NoZXJwdW5rdGUgby5hZS4genVnZXNwcm9jaGVuIHdlcmRlbiwKK2RpZSBuZWdhdGl2ZW4gU2VpdGVuIGRlciBRdWVzdCBuaWNodCB3ZWdmYWxsZW4gZHVlcmZlbiAoc293ZWl0IHNpZQorbmljaHQgYXVmIEZlaGxlcm4gYmVydWhlbikuIAorCitBYm5haG1lIGRlciBRdWVzdDoKKy0tLS0tLS0tLS0tLS0tLS0tLQorCitTb2Zlcm4gbm9jaCBuaWNodCBnZXNjaGVoZW4sIG11c3MgbnVuIGRlciBSZWdpb25zbWFnaWVyIGRpZSBRdWVzdAorYWJuZWhtZW4uIChJc3QgZGVyIFByb2dyYW1taWVyZXIgc2VsYnN0IGRlciBSZWdpb25zbWFnaWVyLCBzb2xsdGUgZXIKK2VpbmVuIE1hZ2llcmtvbGxlZ2VuIGJpdHRlbiwgZGllcyB6dSBtYWNoZW4gKGZ1ZXIgZGllIG1laXN0ZW4gUmVnaW9uZW4KK2dpYnQgZXMgamEgbWVociBhbHMgZWluZW4gUk0pLikgV2VubiBkaWVzIGFsbGVzIGdlc2NoZW4gaXN0LCBrYW5uIGRlcgorUXVlc3RlcnptYWdpZXIgZGllIFF1ZXN0IGFibmVobWVuLiAKKworRGllIEJlYXJiZWl0dW5nIGRlciBRdWVzdCBnZWh0IGFtIHNjaG5lbGxzdGVuLCB3ZW5uIGRlbSBRdWVzdC1FTQorZm9sZ2VuZGUgSW5mb3Mgdm9ybGllZ2VuICh6LkIuIGluIGVpbmVyIE1haWwpOgorCisgLSBFaW5lIGt1cnplIEJlc2NocmVpYnVuZyBkZXIgUXVlc3QsIGFsc28gd29ydW0gZ2VodCBlcyB1ZWJlcmhhdXB0PworIC0gRWluZSBMb2VzdW5nc3NraXp6ZSAoYml0dGUgbmljaHQgaW0gSG9tZS1WZXJ6ZWljaG5pcyBydW1saWVnZW4KKyAgIGxhc3NlbikKKyAtIEVpbmUgQmVzY2hyZWlidW5nIGRlciB0ZWNobmlzY2hlbiBMb2VzdW5nLCBhbHNvIHdpZSBpc3QgZGFzIGdhbnplCisgICBwcm9ncmFtbWllcnQ/IAorIC0gSW4gd2VsY2hlbSBPYmpla3Qgd2lyZCBkaWUgUXVlc3QgbWl0dGVscyBHaXZlUXVlc3QgZ2VzZXR6dD8KKyAtIEVpbmUgQXVmc3RlbGx1bmcsIHdlbGNoZSBGaWxlcyB6dSBkZXIgUXVlc3QgZ2Vob2VyZW4gdW5kIHdvIHNpZQorICAgc2ljaCBiZWZpbmRlbi4KKyAtIEVpbmUgTGlzdGUgZGVyIEFiaGFlbmdpZ2tlaXRlbiB6dSBhbmRlcmVuIFRlaWxlbiBpbSBNdWQ/IChHaWxkZW4tTlBDcywKKyAgIE1OUENzLi4pCisgLSBFaW5lIEVpbnNjaGFldHp1bmcgZGVyIFNjaHdpZXJpZ2tlaXQgZGVyIFF1ZXN0LiBXaWUgZ3V0IHNvbGx0ZSBtYW4KKyAgIHNlaW4/IFdlbGNoZW4gTGV2ZWw/IFdhcyBmdWVyIFN0YXRzPy4uLgorIC0gRWluZW4gVm9yc2NobGFnLCB3aWV2aWVsZSBBUHMgZnVlciBkaWUgUXVlc3QgdmVyZ2ViZW4gd2VyZGVuIHNvbGxlbi4KKyAtIEVpbmVuIFZvcnNjaGxhZywgd2VsY2hlbiBTcHJ1Y2ggZGVyIFdhbmRlcmVyIGRlbiBTcGllbGVybiBzYWdlbgorICAgc29sbC4KKyAtIEVpbmUgTGlzdGUgZGVyIE1hZ2llciB1bmQgU3BpZWxlciwgZGllIGRpZSBRdWVzdCBzY2hvbiBnZXRlc3RldCBoYWJlbi4KKworRGFuYWNoIHNjaGF1dCBzaWNoIGRlciBRdWVzdC1FTSBkaWUgUXVlc3QgYW4gdW5kIGxlZ3QgbWl0IGRlbQorUHJvZ3JhbW1pZXJlciB6dXNhbW1lbiBBUHMsIFNjaHdpZXJpZ2tlaXRzZ3JhZCwgZGVuIFNwcnVjaCBmdWVyIGRlbgorV2FuZGVyZXIgZXRjLiBmZXN0LiBEYW5uIHdpcmQgZGllIFF1ZXN0IHZvbSBRdWVzdC1FTSBlaW5nZXRyYWdlbi4KKworUXVlc3RhbnNjaGx1c3M6CistLS0tLS0tLS0tLS0tLS0KKworWnVtIEFuc2NobHVzcyBkZXIgUXVlc3Qgc29sbHRlIG1hbiBuYWNoIE1vZWdsaWNoa2VpdCBlYmVuZmFsbHMgb25saW5lCitzZWluLCB1bSBldmVudHVlbGxlIFByb2JsZW1lLCBCdWdzIHp1IGJlc2VpdGlnZW4uIEF1Y2ggc29sbHRlIG1hbiBuYWNoCitBbnNjaGx1c3MgZGVyIFF1ZXN0IGdld2lzc2VuaGFmdCBzZWluIFJlcGZpbGUgYWJhcmJlaXRlbiB1bSBUeXBvcywKK0lkZWVuIHVuZCBCdWdzIGFienVhcmJlaXRlbi4KKworU2llaGUgYXVjaDoKKy0tLS0tLS0tLS0tCisKKyBRdWVyeVF1ZXN0LCBHaXZlUXVlc3QsIHdyaXRlX2ZpbGUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitadWxldHp0IGdlYWVuZGVydDogTW9uLCAxNy4gSnVsIDIwMDAsIDEyOjE2OjQxIHZvbiBab29rLgorCmRpZmYgLS1naXQgYS9kb2Mvd2l6L3F1ZXN0cy5kb2MgYi9kb2Mvd2l6L3F1ZXN0cy5kb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRjOTFjOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93aXovcXVlc3RzLmRvYwpAQCAtMCwwICsxLDY2IEBACisgRGFzIFF1ZXN0c3lzdGVtIHdpcmQgaW4gTW9yZ2VuR3JhdWVuIHZvbiBlaW5lbSB6ZW50cmFsZW4gUXVlc3RoYW5kbGVyCitnZXN0ZXVlcnQuIERpZXNlciBzdGVsbHQgZGllIGZvbGdlbmRlbiBGdW5rdGlvbmVuIHp1ciBWZXJmdWVndW5nOgorCitBZGRRdWVzdChzdHJpbmcgcXVlc3RuYW1lLCBpbnQgcXVlc3Rwb2ludHMsIGludCBleHBlcmllbmNlLAorICAgICAgICAgc3RyaW5nICphbGxvd2Vkb2JqLCBzdHJpbmcgaGludCwgaW50IGRpZmZpY3VsdHksIGludCBuZWVkZWQpCisgRGllc2UgRnVua3Rpb24gZGVmaW5pZXJ0IGVpbmUgUXVlc3QgdW5kIGdpYnQgc2llIHp1ciBCZW51dHp1bmcgZHVyY2ggZGllCisgU3BpZWxlciBmcmVpLiBTaWUgZGFyZiBudXIgdm9uIEVyem1hZ2llcm4gYXVmZ2VydWZlbiB3ZXJkZW4uCisgQmVkZXV0dW5nIGRlciBQYXJhbWV0ZXI6CisgICBxdWVzdG5hbWUgZ2lidCBkZW4gTmFtZW4gZGVyIHp1IGRlZmluaWVyZW5kZW4gUXVlc3QgYW4uIEVzIGRhcmYgYmVyZWl0cworICAgICAgICAgICAgIGVpbmUgUXVlc3QgZGllc2VzIE5hbWVucyBnZWJlbiwgaWhyZSBQYXJhbWV0ZXIgd2VyZGVuIGRhbm4KKyAgICAgICAgICAgICBnZWFlbmRlcnQuCisgICBxdWVzdHBvaW50cyBnaWJ0IGRpZSBaYWhsIGRlciBRdWVzdHB1bmt0ZSBhbiwgZGllIGRlciBTcGllbGVyIGZ1ZXIgZGllCisgICAgICAgICAgICAgICBMb2VzdW5nIGRpZXNlciBRdWVzdCBhbmdlcmVjaG5ldCBiZWtvbW10LiBNdXNzID4wIHNlaW4uCisgICBleHBlcmllbmNlIGdpYnQgZGllIFphaGwgZGVyIEVyZmFocnVuZ3NwdW5rdGUgYW4sIGRpZSBkZXIgU3BpZWxlciBmdWVyCisgICAgICAgICAgICAgIGVpbmUgUXVlc3QgYmVrb21tZW4ga2Fubi4gRElFU0UgWkFITCBLQU5OIDwwIFNFSU4hCisgICBhbGxvd2Vkb2JqIGlzdCBlaW4gQXJyYXkgbWl0IGRlbiBGaWxlbmFtZW4gZGVyIE9iamVrdGUsIGRpZSBkaWVzZSBRdWVzdCBhbHMKKyAgICAgICAgICAgICAgZHVyY2ggZWluZW4gU3BpZWxlciBnZWxvZXN0IGtlbm56ZWljaG5lbiBkdWVyZmVuLiBEYXJ1ZWJlcmhpbmF1cworICAgICAgICAgICAgICBkdWVyZmVuIEVyem1hZ2llciBkaWVzIGltbWVyIHR1bi4KKyAgIGhpbnQgaXN0IGVpbiBTdHJpbmcsIGRlciBUaXBzIHp1ciBMb2VzdW5nIGRlciBRdWVzdCBlbnRoYWVsdC4gRGllc2VyIFN0cmluZworICAgICAgICB3aXJkIGRlbSBTcGllbGVyIHZvbSBPcmFrZWwgYWxzIEhpbndlaXMgZ2VnZWJlbi4KKyAgIGRpZmZpY3VsdHkgaXN0IGVpbmUgWmFobCB6d2lzY2hlbiAwIHVuZCAyMCwgZGllIGRlbiAiU2Nod2llcmlna2VpdHNncmFkIgorICAgICAgICAgICAgICBkZXIgUXVlc3QgYW5naWJ0LiAwIGhhdCBlaW5lIGJlc29uZGVyZSBCZWRldXR1bmcsIG5hZW1saWNoIGRpZSwKKyAgICAgICAgICAgICAgZGFzIGtlaW5lIEVpbnNjaGFldHp1bmcgdm9ybGllZ3QuCisgICBuZWVkZWQgbGVndCBmZXN0LCBvYiBkaWUgUXVlc3Qgdm9uIGVpbmVtIFNwaWVsZXIgZ2Vsb2VzdCB3ZXJkZW4gbXVzcywgYmUtCisgICAgICAgICAgdm9yIGVyIE1hZ2llciB3ZXJkZW4ga2Fubi4gRmFsbHMgbmVlZGVkICE9MCBpc3QsIE1VU1MgZXIgZGllIFF1ZXN0CisgICAgICAgICAgbG9lc2VuLCB1bmFiaGFlbmdpZyB2b24gZGVyIDkwJS1SZWdlbC4KKworUmVtb3ZlUXVlc3Qoc3RyaW5nIHF1ZXN0bmFtZSk7CisgR2VnZW5zdHVlY2sgenUgQWRkUXVlc3QsIGxvZXNjaHQgZWluZSBRdWVzdC4gS2FubiBuYXR1ZXJsaWNoIGViZW5mYWxscyBudXIKKyB2b24gRXJ6bWFnaWVybiBhdWZnZXJ1ZmVuIHdlcmRlbi4gRElFIFNQSUVMRVIsIERJRSBESUUgUVVFU1QgU0NIT04gR0VMT0VTVAorIEhBQkVOLCBCRUhBTFRFTiBESUUgRU5UU1BSRUNIRU5ERU4gUVVFU1RQVU5LVEUgISEKKworUXVlcnlSZWFkeUZvcldpeihvYmplY3QgcGxheWVyKQorIERpZXNlciBGdW5rdGlvbiBtdXNzIGVpbiBQbGF5ZXJvYmpla3QgdWViZXJnZWJlbiBiZWtvbW1lbiB1bmQgcHJ1ZWZ0LCBvYgorIGRlciBTcGllbGVyIHNlaXRlbnMgZGVyIFF1ZXN0cyBiZXJlaXQgaXN0IHp1ciBBdWZzdHVmdW5nIHp1bSBNYWdpZXIsIGRoCisgb2IgZXIgOTAlIGRlciBRUCBzb3dpZSBhbGxlIHp3aW5nZW5kIHZvcmdlc2NocmllYmVuZW4gUXVlc3RzIChzaWVoZQorIEFkZFF1ZXN0LCBQYXJhbWV0ZXIgbmVlZGVkKSBnZWxvZXN0IGhhdC4gRmFsbHMgZGllcyBkZXIgRmFsbCBpc3QsIGxpZWZlcnQKKyBkaWUgRnVua3Rpb24gZWluZSAxIHp1cnVlY2suIFdlbm4gZXIgZGllIDkwJSBuaWNodCBoYXQsIGVpbmUgLTEuIEZhbGxzCisgaWhtIG5vZXRpZ2UgUXVlc3RzIGZlaGxlbiwgZWluZSBMaXN0ZSBkZXIgbmljaHQgZ2Vsb2VzdGVuLCBub2V0aWdlbiBRdWVzdHMuCisKK1F1ZXJ5UXVlc3QocXVlc3RuYW1lKQorIExpZWZlcnQgZWluZSAtMSwgZmFsbHMga2VpbmUgUXVlc3QgZGllc2VzIE5hbWVzIGVpbmdldHJhZ2VuIGlzdCwgc29uc3QKKyBlaW5lbiBBcnJheSBtaXQgZGVuIERhdGVuIGRlciBRdWVzdCwgaW4gZGVyIFJlaWhlbmZvbGdlLCBpbiBkZXIgc2llIGluCisgQWRkUXVlc3QgZWluZ2VnZWJlbiB3ZXJkZW4uIERhYmVpIGlzdCBxdWVzdHBvaW50cyBkYXMgZXJzdGUgQXJyYXllbGVtZW50LgorCitRdWVyeUFkdmFuY2VFeHAob2JqZWN0IHBsYXllcikKKyBTdGVsbHQgZmVzdCwgb2IgZGVyIFNwaWVsZXIgcGxheWVyIGdlbnVlZ2VuZCBRdWVzdHB1bmt0ZSBoYXQsIHVtIHNlaW5lCisgRXJmYWhydW5nIHp1IGVyaG9laGVuLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFdlaXRlcmhpbiBlbnRoYWVsdCBqZWRlcyBQbGF5ZXJvYmpla3QgZWluIFF1ZXN0LU1vZHVsLCBkYXMgZGllIGZvbGdlbmRlbgorRnVua3Rpb25lbiBvZmZlcmllcnQ6CisKK0dpdmVRdWVzdChzdHJpbmcgcXVlc3RuYW1lKQorIE1hcmtpZXJ0IGVpbmUgUXVlc3QgYmVpIGRlbSBQbGF5ZXIgYWxzIGdlbG9lc3QuIEVzIHdpcmQgZ2V0ZXN0ZXQsIG9iIGRpZQorIEFrdGlvbiB2b24gZWluZW0gImFsbG93ZWRfb2JqZWN0IiB2b3JnZW5vbW1lbiB3aXJkLiBEaWUgUXVlc3RwdW5rdGUgd2VyZGVuCisgZW50c3ByZWNoZW5kIGdldXBkYXRlZC4KKworUXVlcnlRdWVzdHMoKQorIEdpYnQgZWluZSBBbGlzdCBtaXQgZGVuIE5hbWVuIGRlciB2b20gUGxheWVyIGdlbG9lc3RlbiBRdWVzdHMgenVydWVjay4KKworUXVlcnlRUCgpCisgR2lidCBkaWUgQW56YWhsIGRlciB2b20gUGxheWVyIGVycmVpY2h0ZW4gUXVlc3RwdW5rdGUgenVydWVjay4KKworUXVlcnlRdWVzdChzdHJpbmcgcXVlc3RuYW1lKQorIFN0ZWxsdCBmZXN0LCBvYiBlaW4gU3BpZWxlciBkaWUgUXVlc3QgZ2Vsb2VzdCBoYXQgb2RlciBuaWNodC4KZGlmZiAtLWdpdCBhL2RvYy93aXovcmVnaW9uc2xlaXRmYWRlbiBiL2RvYy93aXovcmVnaW9uc2xlaXRmYWRlbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTI4ZDAyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dpei9yZWdpb25zbGVpdGZhZGVuCkBAIC0wLDAgKzEsMjAwIEBACisKK0hhbGxvLCB3aWxsa29tbWVuIGluIGRlbiB1bmVuZGxpY2hlbiBXZWl0ZW4gZGVyIFJlZ2lvbnN2ZXJ6ZWljaG5pc3NlIQorCitEdSBtb2VjaHRlc3QgaW4gZWluZXIgUmVnaW9uIG1pdHByb2dyYW1taWVyZW4/IFByaW1hLCBuZXVlIGtyZWF0aXZlIAorTWl0YXJiZWl0ZXIgc2luZCBqZWRlcnplaXQgd2lsbGtvbW1lbiEgRHUgYmlzdCBoZXJ6bGljaCBlaW5nZWxhZGVuLCBtaXQgCitEZWluZW4gSWRlZW4genVyIEVudHdpY2tsdW5nIGJlaXp1dHJhZ2VuLgorCitVbSBkaWUgUHJvZ3JhbW1pZXJ1bmcgdW5kIGFuc2NobGllc3NlbmRlIEFibmFobWUgZnVlciBhbGxlIEJldGVpbGlndGVuCittb2VnbGljaHN0IHJlaWJ1bmdzbG9zIHp1IGdlc3RhbHRlbiwgc2VpZW4gRGlyIGRpZSBpbiBkaWVzZXIgSGlsZmVzZWl0ZQorZ2VuYW5udGVuIERpbmdlIGFucyBIZXJ6IGdlbGVndC4gRGllc2UgbGFzc2VuIHNpY2ggaW4gZm9sZ2VuZGUgS2F0ZWdvcmllbgorZWludGVpbGVuOgorCisxKSBGb3JtYWxlcyB6dW0gQ29kZXN0aWwKKzIpIEluaGFsdGxpY2hlIEFuZm9yZGVydW5nZW4KKzMpIFdhcyBuaWNodCBha3plcHRpZXJ0IHdpcmQKKzQpIFdhcyBpc3Qgdm9yIGRlbSBBbnNjaGx1c3MgenUgYmVhY2h0ZW4/CisKKworMSkgRm9ybWFsZXMgenVtIENvZGVzdGlsCisKK28gICNwcmFnbWEgc3Ryb25nX3R5cGVzLHNhdmVfdHlwZXMgc29sbCBpbiBhbGxlbiBGaWxlcyB2ZXJ3ZW5kZXQgd2VyZGVuLAorICAgYWIgRHJpdmVyLVZlcnNpb24gTERfMy41Lnggd2lyZCBhdWNoIHJydHRfY2hlY2tzIGRyaW5nZW5kIGVtcGZvaGxlbi4KKworbyAgRGVyIENvZGUgc29sbCBrZWluZSBaZWlsZW4gbWl0IG1laHIgYWxzIDc4IFplaWNoZW4gZW50aGFsdGVuLgorCitvICBEZXIgQ29kZSBzb2xsIHNhdWJlciBlaW5nZXJ1ZWNrdCB1bmQgc29yZ2ZhZWx0aWcgZm9ybWF0aWVydCBzZWluLCBhYmVyCisgICBiaXR0ZSBvaG5lIFRhYnVsYXRvcmVuLgorCitvICBWZXJ3ZW5kZSBrZWluZSBMYW1iZGEtQ2xvc3VyZXMhIFdhcyBhdWNoIGltbWVyIER1IHZvcmhhc3Q6IEVzIGdlaHQKKyAgIG9obmUuIEVzIHNlaSBhdXNkcnVlY2tsaWNoIGF1ZiBkaWUgTW9lZ2xpY2hrZWl0IHZvbiBpbmxpbmUtQ2xvc3VyZXMKKyAgIHZlcndpZXNlbiwgd2VubiBEdSB1bmJlZGluZ3QgdmVybWVpZGVuIHdpbGxzdCwgZWluZSBzZXBhcmF0ZSBGdW5rdGlvbgorICAgenUgc2NocmVpYmVuLgorCitvICBLb21tZW50aWVyZSBEZWluZW4gQ29kZSEgSW5zYmVzb25kZXJlIGRvcnQsIHdvIGtvbXBsZXhlcmUgT2JqZWt0LQorICAgSW50ZXJha3Rpb25lbiBzdGF0dGZpbmRlbiwgb2RlciB3byBpbXBsaXppdCBiZXNvbmRlcmUgRWlnZW5zY2hhZnRlbgorICAgKHouQi4gZGVyIE11ZGxpYiwgb2RlciBtYXRoZW1hdGlzY2hlICJGZWF0dXJlcyIpIGdlbnV0enQgd2VyZGVuLCBkaWUgaW0KKyAgIENvZGUgbmljaHQgYXVmIGRlbiBlcnN0ZW4gQmxpY2sgZXJzaWNodGxpY2ggb2RlciBkdXJjaHNjaGF1YmFyIHNpbmQuCisgICBEYXVtZW5yZWdlbDogIldlbm4gRHUgbGFlbmdlciBhbHMgZWluZSBNaW51dGUgdWViZXIgZWluZSBaZWlsZSBuYWNoZGVua2VuCisgICBtdXNzdGVzdCwga29tbWVudGllcmUgc2llLiIgOy0pIFJlY2huZSBpbW1lciBkYW1pdCwgZGFzcyBqZW1hbmQsIGRlcgorICAgRGVpbmVuIENvZGUgbGllc3QsIGtlaW5lIEFobnVuZyBoYXQsIHdhcyBEdSBkYSBlaWdlbnRsaWNoIHR1c3QuIDotKQorCitvICBXaXJmIGJpdHRlIG5hY2ggQWJzY2hsdXNzIGRlciBBcmJlaXRlbiBQbGF0emhhbHRlci1Db2RlIHJhdXMgKHouQi4gbGVlcmUKKyAgIEFkZERldGFpbCgpLUFud2Vpc3VuZ2VuKSB1bmQgZW50ZmVybmUgbmljaHQgZnVlciBkYXMgR2ViaWV0IGJlbm9ldGlndGUKKyAgIERhdGVpZW4gYXVzIGRlbiBWZXJ6ZWljaG5pc3Nlbi4KKworbyAgU3BlaWNoZXJ1bmcgdm9uIERhdGVuIGluIHNlY3VyZS1WZXJ6ZWljaG5pc3NlbiBzb2xsIGJpdHRlIG51ciBzZWhyCisgICBzcGFyc2FtIGVyZm9sZ2VuIHVuZCBudXIgaW4gQWJzdGltbXVuZyBtaXQgZGVtIFJNLgorCitvICBzYXZlX29iamVjdCgpIGJpdHRlIHNlaHIgc3BhcnNhbSB2ZXJ3ZW5kZW4gKG5pY2h0IGJlaSBqZWRlciBEYXRlbi0KKyAgIGFlbmRlcnVuZywgYmVpIEJlZGFyZiBpbiByZXNldC9yZW1vdmUpLgorCitvICBXZW5uIERlZmluZXMgenVtIEVpbnNhdHoga29tbWVuLCB2ZXJ3ZW5kZSBzaWUgYml0dGUgbW9lZ2xpY2hzdCBzcGFyc2FtCisgICB1bmQgc29yZ2UgZGFmdWVyLCBkYXNzIERlZmluZXMga2xhciBhbHMgc29sY2hlIGVya2VubmJhciBzaW5kLiBBdXNzZXIgaW4KKyAgIEZhZWxsZW4sIHdvIGVzIGdhciBuaWNodCBhbmRlcnMgZ2VodCwgc29sbHRlc3QgRHUga2VpbmUgQ29kZS1EZWZpbmVzCisgICB2ZXJ3ZW5kZW4sIGRpZSBtZWhyIHVtZmFzc2VuIGFscyBlaW5mYWNoZSBGdW5rdGlvbnNhdWZydWZlIHdpZSB6LkIuCisgICAgICAjZGVmaW5lIFRQIHRoaXNfcGxheWVyKCkKKyAgIEZ1ZXIgdWVibGljaGUgU3RhbmRhcmRmYWVsbGUgZXhpc3RpZXJ0IGJlcmVpdHMgZWluZSBIZWFkZXJkYXRlaSBpbiBkZXIgCisgICBNdWRsaWIgdW50ZXIgL3N5cy9kZWZpbmVzLmguIAorCitvICBTb2xsdGVzdCBEdSBiZXN0aW1tdGUgRXJlaWduaXNzZSBpbiBEZWluZW0gR2ViaWV0IGxvZ2dlbiB3b2xsZW4gKHouQi4KKyAgIChNaW5pLSlRdWVzdGFic2NobHVlc3NlIG9kZXIgYmVzb25kZXJlIEtpbGxzKSwgZGFubiBiZW51dHplIGJpdHRlIAorICAgbG9nX2ZpbGUoKSwgc28gZGFzcyBkaWUgTG9nZmlsZXMgbmFjaCAvbG9nLyBnZXNjaHJpZWJlbiB3ZXJkZW4uIFp1c2FldHpsaWNoCisgICB3ZXJkZW4gc28gZXJzdGVsbHRlIExvZ2ZpbGVzIGF1dG9tYXRpc2NoIGJlaSBFcnJlaWNoZW4gZWluZXIgYmVzdGltbXRlbgorICAgRGF0ZWlncm9lc3NlIHJvdGllcnQsIHNvIGRhc3Mgc2ljaCBkZXIgUGxhdHp2ZXJicmF1Y2ggaW4gR3JlbnplbiBoYWVsdC4KKyAgIERhcyBQcm90b2tvbGxpZXJlbiBtaXR0ZWxzIHdyaXRlX2ZpbGUoKSBpbiBSZWdpb25zdmVyemVpY2huaXNzZW4gdW50ZXIgCisgICAvZC8gaXN0IGdydW5kc2FldHpsaWNoIE5JQ0hUIGVyd3VlbnNjaHQuIAorICAgTmFjaCBBYnNwcmFjaGUgS0FOTiBlcyBmdWVyIFNFTFRFTkUgdW5kIFdJQ0hUSUdFIE1lbGR1bmdlbiBlcmxhdWJ0IHdlcmRlbiwKKyAgIG1pdHRlbHMgd3JpdGVfZmlsZSgoKSBuYWNoIC9sb2cvIHp1IHNjaHJlaWJlbi4KKworbyAgV2VubiBEdSBpbiBEZWluZW0gR2ViaWV0IERhdGVuIG9kZXIgQ29kZSBhYmxlZ3N0LCBkZXIgbmljaHQgZnVlciAKKyAgIGplZGVybWFubnMgQXVnZW4gYmVzdGltbXQgaXN0IChRdWVzdGxvZXN1bmdlbiwgR2ViaWV0c2thcnRlbiwgU2F2ZWZpbGVzCisgICB2b24gcXVlc3RyZWxldmFudGVuIChNYXN0ZXItKU9iamVrdGVuKSwgc29sbHRlc3QgRHUgaW4gQWJzdGltbXVuZyBtaXQKKyAgIERlaW5lbSBSZWdpb25zbWFnaWVyIHVlYmVybGVnZW4sIGRpZXNlIGluIGVpbiAuL3NlY3VyZS8tVmVyemVpY2huaXMKKyAgIHp1IHZlcnNjaGllYmVuLCBkYW1pdCBzaWNoZXJnZXN0ZWxsdCBpc3QsIGRhc3MgYXVjaCB0YXRzYWVjaGxpY2ggbnVyCisgICBiZXJlY2h0aWd0ZSBNYWdpZXIgZGFyYXVmIFp1Z3JpZmYgZXJoYWx0ZW4uIERlbm4gYmVkZW5rZSwgZGFzcyBMZXNlLQorICAgdW5kIFNjaHJlaWJyZWNodGUgbnVyIGZ1ZXIgQ29kZWRhdGVpZW4gZ2VwcnVlZnQgd2VyZGVuLCBqZWRvY2ggbmljaHQKKyAgIGZ1ZXIgYmVsaWViaWdlIHNvbnN0aWdlIFRleHRkYXRlaWVuLgorCitvICBFcyBzZWkgYXVzZHJ1ZWNrbGljaCBhdWYgZGllIE1hbnBhZ2VzICJnb29kc3R5bGUiLCAiZWZmaXppZW56IiwgZXRjLgorICAgdmVyd2llc2VuLgorCisKK0RhcyBzb2xsIGpldHp0IG5pY2h0IGhlaXNzZW4sIGRhc3MgZGVyIEFuc2NobHVzcyB2b24gQ29kZSBrYXRlZ29yaXNjaAorYWJnZWxlaG50IHdlcmRlbiB3aXJkLCBkZXIgZGllc2UgRm9ybWFsaWVuIG5pY2h0IGVyZnVlbGx0LiAoQXVzbmFobWU6IExhbWJkYS0KK0Nsb3N1cmVzIHdlcmRlbiBpbiBkZW4gUmVnaW9uZW4gbmljaHQgbWVociBha3plcHRpZXJ0LikgSWNoIG1vZWNodGUgYWJlcgord2lya2xpY2ggbmFjaGRydWVja2xpY2ggZGFydW0gYml0dGVuLCBzaWUgYXVzIGVpbmVtIGVpbmZhY2hlbiBHcnVuZAorZWluenViYXVlbjogRHUgd2lyc3QgbmljaHQgaW1tZXIgZGVyIGVpbnppZ2Ugc2VpbiwgZGVyIERlaW5lbiBDb2RlIGxlc2VuIHVuZAord2FydGVuIG11c3MsIGF1Y2ggaW4gRGVpbmVyIEFid2VzZW5oZWl0IGtvZW5uZW4gQnVncyBhdWZ0cmV0ZW4uIFVuZCBkYW5uIGlzdAorZXMgd2VzZW50bGljaCBlaW5mYWNoZXIsIGVpbmVuIE1pbmltYWxzdGFuZGFyZCB6dSBoYWJlbiwgZGVyIGVzIGFsbGVuCitlcm1vZWdsaWNodCwgZGVuIENvZGUgYXVjaCBpbSBNRyB6dSBsZXNlbiB1bmQgZG9ydCB6dSBmaXhlbi4gRGVubiBuaWNodCBpbW1lcgord2lyZCBlcyBtb2VnbGljaCBzZWluLCBzaWNoIERhdGVpZW4gaGVydW50ZXJ6dWxhZGVuIHVuZCBsb2thbCB6dSBiZWFyYmVpdGVuLgorCitadW0gQnVnZml4aW5nIGFuIGRpZXNlciBTdGVsbGUgYXVzIGFrdHVlbGxlbSBBbmxhc3MgZWluZSBBbm1lcmt1bmc6IEVzIHdpcmQKK3ZvbiBqZWRlbSBha3RpdmVuIFJlZ2lvbnNtaXRhcmJlaXRlciBlcndhcnRldCwgZGFzcyBlciBlaW5lbiBGZWhsZXJ0ZXVmZWwKKygvb2JqL3Rvb2xzL2ZlaGxlcnRldWZlbCkgYmVzaXR6dCB1bmQgZGVzc2VuIEZlaGxlcmxpc3RlIHJlZ2VsbWFlc3NpZworZHVyY2hzaWVodCB1bmQgYXVmZ2V0cmV0ZW5lIEZlaGxlciB1bmQgV2FybnVuZ2VuIGJlaGVidC4gKE9rdC4gMjAwNykKKworCisyKSBJbmhhbHRsaWNoZSBBbmZvcmRlcnVuZ2VuOgorCitvICBXZW5uIER1IGVpbiBrb21wbGV0dCBuZXVlcyBHZWJpZXQgc2NocmVpYmVuIG1vZWNodGVzdCwgZGFzIGluIGVpbmVyIFJlZ2lvbiAKKyAgIHNlaW5lbiBQbGF0eiBmaW5kZW4gc29sbCwgc3ByaWNoIGJpdHRlIGRpZSB0aGVtYXRpc2NoZSBBdXNyaWNodHVuZyBtaXQKKyAgIGRlbSBSTSBhYiwgYmV2b3IgRHUgYW5mYWVuZ3N0LCBDb2RlIHp1IHNjaHJlaWJlbi4gRmFsbHMgdm9uIERlaW5lbiBJZGVlbgorICAgaXJnZW5kZXR3YXMgbmljaHQgaGllcmhlciBwYXNzZW4gc29sbHRlLCBsYWVzc3Qgc2ljaCBkYXMgbWl0IHdlc2VudGxpY2gKKyAgIHdlbmlnZXIgRnJ1c3QgaW0gVm9yZmVsZCBrbGFlcmVuLCBhbHMgd2VubiBoaW50ZXJoZXIgZGFzIGhhbGJlIEdlYmlldAorICAgdW1nZWJhdXQgd2VyZGVuIG11ZXNzdGUuIFNvbGx0ZSBzaWNoIGRpZSBrb256ZXB0aW9uZWxsZSBBdXNyaWNodHVuZyAKKyAgIG9kZXIgZGVyIFVtZmFuZyB3YWVocmVuZCBkZXIgUHJvZ3JhbW1pZXJ1bmcgZ3J1bmRsZWdlbmQgYWVuZGVybiwgYmVzcHJpY2gKKyAgIGRpZXMgYml0dGUga3VyeiBtaXQgZGVtIFJNLgorCitvICBPYiBuZXVlIG9kZXIgYWx0ZSBSZWNodHNjaHJlaWJ1bmcsIGlzdCBpbSB3ZXNlbnRsaWNoZW4gRGlyIHNlbGJzdCB1ZWJlci0KKyAgIGxhc3NlbiwgamVkb2NoIHdhZXJlIGVzIHNjaG9lbiwgd2VubiBEdSBkaWUgU3BpZWxlci1BbnJlZGVuIHdpZSAiZnJ1ZWhlciIKKyAgIHVlYmxpY2ggZ3Jvc3Mgc2NocmVpYmVuIHd1ZXJkZXN0ICgiRHUiLCAiRGljaCIsICJEZWluIikuCisKK28gIEVzIG11ZXNzZW4gaW4gamVkZW0gUmF1bSBnZXdpc3NlIFN0YW5kYXJkZGV0YWlscyB2b3JoYW5kZW4gc2Vpbiwgei5CLgorICAgQm9kZW4sIERlY2tlLCBXYWVuZGUsIEhpbW1lbCAoU29ubmUsIFdvbGtlbiksIGV0Yy4gRGllcyBrYW5uIG1hbiBzZWhyCisgICBiZXF1ZW0gbWl0IGRlbSAiT3Rlc3RlciIgcHJ1ZWZlbi4KKyAgIEVzIHNlaSBhYmVyIGF1c2RydWVja2xpY2ggZGFyYXVmIGhpbmdld2llc2VuLCBkYXNzIGRlciBPdGVzdGVyIGtlaW5lc2ZhbGxzCisgICBiZW51dHp0IHdlcmRlbiBzb2xsdGUsIHVtIHNhZW10bGljaGUgdm9yaGFuZGVuZW4gU3Vic3RhbnRpdmUgYmlzIGlucworICAga2xlaW5zdGUgenUgYmVzY2hyZWliZW4uIEVzIGlzdCBzY2hvZW4sIHdlbm4gT2JqZWt0ZSBtb2VnbGljaHN0IHZvbGwtCisgICBzdGFlbmRpZyBiZXNjaHJpZWJlbiB3ZXJkZW4sIGFiZXIgbWFuIHNvbGx0ZSBlcyBhdWNoIG5pY2h0IHVlYmVydHJlaWJlbi4KKworbyAgV2FzIGJpdHRlIG51ciBpbiBBdXNuYWhtZWZhZWxsZW4gZ2VtYWNodCB3ZXJkZW4gc29sbHRlLCBpc3QsIERldGFpbHMsIAorICAgSW5mb3Mgb2RlciBMYW5nLS9LdXJ6YmVzY2hyZWlidW5nZW4gYXVzIFN0YW5kYXJkcmFldW1lbiB6dSBpbmhlcml0ZW4uCisKK28gIEZhbGxzIER1IEJlc2NocmVpYnVuZ2VuL0F1c2dhYmVuIGluIEFTQ0lJLUdyYWZpayBlaW5iaW5kZW4gbW9lY2h0ZXN0LCBhY2h0ZQorICAgYml0dGUgZGFyYXVmLCBkYXNzIER1IGF1ZiBqZWRlbiBGYWxsIGVpbmVuIGt1cnplbiBBbHRlcm5hdGl2dGV4dCBtaXQtCisgICBsaWVmZXJzdCB1bmQgZGllc2VuIGF1c2dpYnN0LCB3ZW5uIGRlciBTcGllbGVyIFBfTk9fQVNDSUlfQVJUIGdlc2V0enQgaGF0LgorICAgRXMgYmVzdGVodCBpbW1lciBkaWUgTW9lZ2xpY2hrZWl0LCBkYXNzIFNwaWVsZXIgbWl0IFNlaHNjaHdhZWNoZSBvZGVyCisgICBCbGluZGUgRGVpbmUgT2JqZWt0ZSBhbnNjaGF1ZW4sIHVuZCBkaWVzZSBrb21tZW4gbWl0IE9iamVrdGVuIGluIHJlaW5lcgorICAgQVNDSUktR3JhZmlrIG5pY2h0IHp1cmVjaHQuCisgICAoU2llaGUgYXVjaCBkaWUgTWFucGFnZSB6dSBQX05PX0FTQ0lJX0FSVCB1bmQgImhpbGZlIGdyYWZpayIuKQorCitvICBFaW5lIEFubWVya3VuZyB6dSBkZW4gU2NoYWRlbnNhcnRlbiBEVF9IT0xZIHVuZCBEVF9VTkhPTFkgc29sbCBuaWNodAorICAgdW5lcndhZWhudCBibGVpYmVuOiBFcyB3aXJkIHZvbiB2aWVsZW4gU3BpZWxlcm4gdW5kIE1hZ2llcm4gYWxzIGxvZ2lzY2gKKyAgIHVuZCBhdG1vc3BoYWVyaXNjaCBuaWNodCBiZWdydWVuZGJhciBlbXBmdW5kZW4sIHdlbm4gR2VnZW5zdGFlbmRlIG9kZXIKKyAgIE5QQ3MgZGllc2UgYmVpZGVuIFNjaGFkZW5zYXJ0ZW4gZ2xlaWNoZXJtYXNzZW4gZWluc2V0emVuIGJ6dy4gdmVydXJzYWNoZW4KKyAgIGtvZW5uZW4uIFZlcmdsZWljaGJhcmVzIGdpbHQgZnVlciBkaWUgZ2xlaWNoemVpdGlnZSBBYndlaHIgYmVpZGVyIAorICAgU2NoYWRlbnNhcnRlbi4gV2VubmdsZWljaCBiaXNoZXIgZGllc2JlenVlZ2xpY2gga2VpbmUga2xhcmUgRWluaWd1bmcKKyAgIGVyemllbHQgd2VyZGVuIGtvbm50ZSwgc29sbCBhbiBkaWVzZXIgU3RlbGxlIGRlbm5vY2ggZW1wZm9obGVuIHdlcmRlbiwKKyAgIHZvbiBlaW5lciBnbGVpY2h6ZWl0aWdlbiBOdXR6dW5nIHZvbiBEVF9IT0xZIHVuZCBEVF9VTkhPTFkgYWJ6dXNlaGVuLgorICAgRGVyIHp1c3RhZW5kaWdlIFJlZ2lvbnNtYWdpZXIgbXVzcyBhYmVyIGF1ZiBqZWRlbiBGYWxsIGluIEtlbm50bmlzCisgICBnZXNldHp0IHdlcmRlbiB1bmQgZW50c3ByZWNoZW5kZSBPYmpla3RlIHp1ciBQcnVlZnVuZyB2b3JnZWxlZ3QgYmVrb21tZW4sCisgICBmYWxscyBkaWVzZSBOdXR6dW5nIGRlbm5vY2ggZnVlciB1bnVtZ2FlbmdsaWNoIGdlaGFsdGVuIHdpcmQuCisKKworMykgV2FzIGtlaW5lc2ZhbGxzIGFremVwdGllcnQgd2lyZAorCitvICBGaWxlcywgZGllIGluIC9wbGF5ZXJzIGxpZWdlbiwgaW5jbC4gSGVhZGVyZmlsZXMuIERpZXMgZXJzY2h3ZXJ0IGRhcworICAgUmVwYXJpZXJlbiB2b24gQnVncyB1bmdlbWVpbiB1bmQgYnJpbmd0IGVpbmUgZ2V3aXNzZSBVbnVlYmVyc2ljaHRsaWNoa2VpdAorICAgbWl0IHNpY2guIEJpdHRlIGF1Y2ggbmljaHRzIGF1cyAvcGxheWVycyBpbmhlcml0ZW4gKEF1c25haG1lbiBoaWVydm9uIHNpbmQgCisgICBhdWZncnVuZCBlaW5lcyBuZXVlbiBEcml2ZXItRmVhdHVyZXMgbnVyIG5vY2ggbWl0IEhpbGZlIGVpbmVzIEVyem1hZ2llcnMgCisgICBtb2VnbGljaC4gS3VyeiBnZXNhZ3Q6IGVzIGdpYnQgZWluZSBXaGl0ZWxpc3Qgdm9uIE9iamVrdGVuLCBkaWUgZGFzIAorICAgZHVlcmZlbi4gQWxsZSBhbmRlcmVuIGR1ZXJmZW4gZGFzIHBlciBEZWZhdWx0IG5pY2h0LikuCisKKworNCkgV2FzIGlzdCB2b3IgZGVtIEFuc2NobHVzcyB6dSBiZWFjaHRlbj8KKworbyAgQ29kZSBtdXNzIHZvbGxzdGFlbmRpZyBmZXJ0aWcgc2Vpbi4gRGFzIGhlaXNzdCBpbnNiZXNvbmRlcmUsIGRhc3MgCisgICBEZWJ1Zy0gdW5kIG5pY2h0IG1laHIgYmVub2V0aWd0ZXIgQ29kZSBlbnRmZXJudCB3dXJkZSB1bmQgZGFzcyBhbGxlIAorICAgZXJmb3JkZXJsaWNoZW4gS29tbWVudGFyZSB2b3JoYW5kZW4gc2luZC4KKworbyAgQWJuYWhtZSBkdXJjaCBkZW4gUk0gdW5kIGdnZi4gZGVuIGZ1ZXIgR2VzZWxsZW5zdHVlY2tlIHp1c3RhZW5kaWdlbiBFTQorICAgbXVzcyBlcmxlZGlndCBzZWluLiBSZWdpb25zbWFnaWVyIHNpbmQgYW5nZWhhbHRlbiwgZWlnZW5lIEdlYmlldGUsIGRpZSB6dW0KKyAgIEFuc2NobHVzcyBpbiBkZXIgZWlnZW5lbiBSZWdpb24gZ2VwbGFudCBzaW5kLCB2b24gYW5kZXJlbiBNYWdpZXJuIGFibmVobWVuCisgICBsYXNzZW4uCisKK28gIERlciBNYWdpZXIgaXN0IGFuZ2VoYWx0ZW4sIGRhcyBHZWJpZXQgZHVyY2ggVGVzdHNwaWVsZXIgdGVzdGVuIHp1IGxhc3NlbgorICAgKHNpZWhlIGhpZXJ6dSBkaWUgVGVzdHNwaWVsZXItUmVnZWxuKS4gT2IgZWluIFNwaWVsdGVzdCBhbHMgVm9yYXVzc2V0enVuZworICAgZnVlciBkaWUgQWJuYWhtZSBnZWZvcmRlcnQgd2lyZCwgZW50c2NoZWlkZXQgZGVyIHp1c3RhZW5kaWdlIFJNLiBFciBrYW5uCisgICBkZW4gVGVzdCBhdWNoIHNlbGJzdCBkdXJjaGZ1ZWhyZW4gb2RlciBnYW56IGRhcmF1ZiB2ZXJ6aWNodGVuLgorCitvICBRdWVzdHMgdW5kIE1pbmlxdWVzdHMgbXVlc3NlbiB2b20genVzdGFlbmRpZ2VuIFF1ZXN0LUVNIGdldGVzdGV0LAorICAgZWluZ2V0cmFnZW4gdW5kIGFrdGl2aWVydCB3b3JkZW4gc2Vpbi4KKworbyAgRmVlZGJhY2sgZGVyIFRlc3RzcGllbGVyIHVuZCB0ZXN0ZW5kZW4gTWFnaWVyIHNvbGx0ZSB1bWdlc2V0enQgc2Vpbi4KKworbyAgRm9yc2NoZXJwdW5rdGUgbXVlc3NlbiB2b20genVzdGFlbmRpZ2VuIEVNIGVpbmdldHJhZ2VuIHdvcmRlbiBzZWluLgorCitvICBCYWxhbmNlLUdlbmVobWlndW5nZW4gKE9iamVrdGUsIEhlaWx1bmcsIGdnZi4gR2lsZGVuYmFsYW5jZSkgbXVlc3NlbiAKKyAgIHZvcmxpZWdlbjsgZGllIGdlbmVobWlndGVuIEVja3BhcmFtZXRlciBzb2xsZW4gbmFjaHZvbGx6aWVoYmFyIGltIAorICAgR2ViaWV0c3ZlcnplaWNobmlzIGRva3VtZW50aWVydCBzZWluOiBlbnR3ZWRlciBpbSBqZXdlaWxpZ2VuIEZpbGUsIG9kZXIKKyAgIGFscyBUZXh0ZmlsZSB6LkIuIGluIGVpbmVtIERva3UtVmVyemVpY2huaXMuCisKK28gIEtyYWV1dGVyIGZ1ZXIgZGVuIEtyYWV1dGVyc2tpbGwgbXVlc3NlbiBnZW5laG1pZ3QgdW5kIGVpbmdldHJhZ2VuIHdvcmRlbiAKKyAgIHNlaW4gKGRpZXMga2FubiBqZWRlciBFTSBtaXQgZGVtIEtyYWV1dGVydG9vbCBlcmxlZGlnZW4pLgorCitvICBIaW53ZWlzOiBFcnN0a2lsbHMgbXVlc3NlbiBOSUNIVCBaV0lOR0VORCB2b20genVzdGFlbmRpZ2VuIEVNIGVpbmdldHJhZ2VuCisgICB3b3JkZW4gc2Vpbi4gRGllIEVyc3RraWxsLU5QQ3Mgd2VyZGVuIGF1dG9tYXRpc2NoIGluIGVpbmVyIHZvcmxhZXVmaWdlbgorICAgTGlzdGUgZ2VzYW1tZWx0IHVuZCB2b20gRU0gZW50d2VkZXIgZnJlaWdlZ2ViZW4gb2RlciBhYmdlbGVobnQuIEF1Y2gKKyAgIFNvbmRlci1TdHVmZW5wdW5rdGUgZnVlciBFS3MgbXVlc3NlbiBuaWNodCB2b3IgZGVtIEFuc2NobHVzcyBiZWFudHJhZ3QKKyAgIG9kZXIgZ2VuZWhtaWd0IHdvcmRlbiBzZWluLCBhdWNoIGRpZXNlIEVpbnRyYWd1bmcgbGFlc3N0IHNpY2ggZXJsZWRpZ2VuLAorICAgd2VubiBkZXIgYmV0cmVmZmVuZGUgTlBDIGRhcyBlcnN0ZSBNYWwgZ2V0b2V0ZXQgd3VyZGUuCisKK28gIEF1Y2ggZGllIGZ1ZXIgZGVuIFJ1ZXN0dW5nc3NraWxsIHNvIGJlbGllYnRlbiBSdWVzdHVuZ2VuIG11ZXNzZW4gbmljaHQKKyAgIHZvciBkZW0gQW5zY2hsdXNzIGVpbmdldHJhZ2VuIHdlcmRlbi4gTmV1ZSBSdWVzdHVuZ2VuIHdlcmRlbiBhdXRvbWF0aXNjaAorICAgYmVpbSB6dXN0YWVuZGlnZW4gTWFzdGVyb2JqZWt0IGFuZ2VtZWxkZXQsIHNvYmFsZCBzaWUgZGFzIGVyc3RlIE1hbAorICAgcmVwYXJpZXJ0IHdlcmRlbi4KKworVW5kIG51biB2aWVsIFNwYXNzIGJlaSBkZXIgUHJvZ3JhbW1pZXJ1bmchIAorCmRpZmYgLS1naXQgYS9kb2Mvd2l6L3JlZ2lvbnNtYWdpZXIgYi9kb2Mvd2l6L3JlZ2lvbnNtYWdpZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFlNWY5ZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93aXovcmVnaW9uc21hZ2llcgpAQCAtMCwwICsxLDEwOCBAQAorCitSZWdpb25zbWFnaWVyCis9PT09PT09PT09PT09CisKK1ZvcmJlbWVya3VuZzogRGllc2VzIERva3VtZW50IGlzdCBuaWNodCBhdWYgZGVtIGFrdHVlbGxlbiBTdGFuZCwKK0FucmVndW5nZW4gZGF6dSBuZWhtZSBpY2gsIFpvb2ssIGdlcm5lIGVudGdlZ2VuLiBJY2ggd2VyZGUgZGFzCitEb2t1bWVudCBkYW5uIG5hY2ggdW5kIG5hY2ggZXJ3ZWl0ZXJuLCBiZXJpY2h0aWdlbi4KKworICAgIEhpZXIgc2luZCBlaW5pZ2UgVmVyaGFsdGVuc3JlZ2VsbiBmdWVyIFJlZ2lvbnNtYWdpZXIgenVzYW1tZW5nZXRyYWdlbi4gU2llCisgICAgc29sbHRlbiB0dW5saWNoc3QgYmVhY2h0ZXQgd2VyZGVuLCBkYW1pdCBlcyBuaWNodCB6dSBBZXJnZXIgdW5kCisgICAgRW50dGFldXNjaHVuZ2VuIGZ1ZXIgU3BpZWxlciB1bmQgTWFnaWVyIGtvbW10LgorCisgICAgRWluc3RlbGxlbiB2b24gbmV1ZW4gTWl0YXJiZWl0ZXJuOgorCisgICAgICogTWFuIHNvbGx0ZSBkZW0gbmV1ZW4gTWFnaWVyICp2b3JoZXIqIHNhZ2VuLCB3YXMgZnVlciBSaWNodGxpbmllbiBmdWVyCisgICAgICAgZGllIFJlZ2lvbiBnZWx0ZW4uCisgICAgICogRGVyIG5ldWUgTWFnaWVyIHNvbGx0ZSB6dWVyc3Qgc2VpbmUgUGxhZW5lIGVybGFldXRlcm4gdW5kIG1pdCBkZW0gUk0KKyAgICAgICBhYnNwcmVjaGVuLCBvYiBkYXMgaW4gZGllIFJlZ2lvbiBwYXNzdC4KKyAgICAgKiBadW0gQXVmbmVobWVuIGluIGRpZSBSZWdpb24gZWluZmFjaCBlaW4gVmVyemVpY2huaXMgbWl0IGRlbSBNYWdpZXJuYW1lbgorICAgICAgIGFubGVnZW4sIGRhbm4genUgTWVybGluIGdlaGVuIHVuZCBzYWdlbgorCisgICAgICAgbWVybGluIG1hY2ggPHh4eD4genVtIG1hZ2llciAvIG1lcmxpbiBtYWNoIDx4eHg+IHp1ciBtYWdpZXJpbgorCisgICAgWnVtIFRlc3RlbiB2b24gbmV1ZW4gR2ViaWV0ZW46CisKKyAgICAgKiBHZW5lcmVsbCBnaWx0OiBFUlNUIHRlc3RlbiwgZGFubiBhbnNjaGxpZXNzZW4uCisgICAgICogTG9naWsgYmVhY2h0ZW4hCisgICAgICogU3ludGF4IHZvbiBCZWZlaGxlbiBiZWFjaHRlbiwga2FubiBkZXIgU3BpZWxlciBkcmF1ZmtvbW1lbj8KKyAgICAgKiBPYmpla3RlIHBydWVmZW4sIGdlbmF1ZXJlcyBzaWVoZSB1bnRlbiBiZWltIFB1bmt0IEJhbGFuY2UuCisgICAgICogSmVkZXMgTW9uc3RlciBrdXJ6IHVtaGF1ZW4gKG5pY2h0IHphcHBlbiksIGdlaHQgcHJpbWEgbWl0IGVpbmVtCisgICAgICAgZW50c3ByZWNoZW5kIGhvaGVuIFdlcnQgZnVlciBQX0hBTkRTLiBEYW5uIGB0YWlsIC9sb2cvTlBDX1hQJyB1bmQgZGllCisgICAgICAgWFAtVmVyZ2FiZSB1ZWJlcnBydWVmZW4uCisgICAgICogQXVjaCBkZW4gQ29kZSBhbnNjaGF1ZW4sIHVubm9ldGlnZSBvZGVyIHNjaGxlY2h0IHByb2dyYW1taWVydGUgRGluZ2UKKyAgICAgICBiZW1hZW5nZWxuLCBuYXR1ZXJsaWNoIG1pdCBWZXJiZXNzZXJ1bmdzdm9yc2NobGFnLgorICAgICAqIHR5cGlzY2hlciBGZWhsZXI6IGRhcmF1ZiBhY2h0ZW4sIG9iIGJlaW0gQmV3ZWdlbiB2b24gT2JqZWt0ZW4gaW4gZGVuCisgICAgICAgU3BpZWxlciBkZXIgUnVlY2tnYWJld2VydCB2b24gbW92ZSgpIHVlYmVycHJ1ZWZ0IHdpcmQgdW5kIGRpZQorICAgICAgIGVudHNwcmVjaGVuZGVuIE1hc3NuYWhtZW4gZXJncmlmZmVuIHdlcmRlbiwgd2VubiBkZXIgU3BpZWxlciBuaWNodHMKKyAgICAgICBtZWhyIHRyYWdlbiBrYW5uLgorICAgICAqIEJlaSBzaWNoIGJld2VnZW5kZW4gTW9uc3Rlcm4gbWl0IGRlbSBNYWdpZXIgYmVzcHJlY2hlbiwgb2IgZGFzIHdpcmtsaWNoCisgICAgICAgbm9ldGlnIGlzdCwgYnp3LiBvYiBtYW4gZGVuIFRha3QgdmVybGFlbmdlcm4ga2Fubi4gTGF1Zi1OUENzIHNpbmQKKyAgICAgICBDUFUtRnJlc3Nlci4KKyAgICAgKiBWb3IgZGVtIEFuc2NobHVzcyBNVUVTU0VOIEZvcnNjaGVycHVua3RlIGVpbmdldHJhZ2VuIHdlcmRlbi4gRGFzIG1hY2h0CisgICAgICAgZGVyIGVudHNwcmVjaGVuZGUgRXJ6bWFnaWVyLCBtb21lbnRhbiBpc3QgZGFzIFJpa3VzLiBOYWVoZXJlcyBkYXp1CisgICAgICAgc3RlaHQgdW50ZXIgYGhpbGZlIGZvcnNjaGVycHVua3RlJy4KKworICAgIEVpbiBwYWFyIGdyb2JlIFJlZ2VsbiB6dXIgQmFsYW5jZToKKworICAgICAqIERpZXMgc2luZCBSaWNodGxpbmllbiwgZGllIGV2dGwuIG5pY2h0IG1laHIgYWt0dWVsbCBzaW5kLiBEaWUgYWt0dWVsbGVuCisgICAgICAgUmVnZWxuLCBkaWUgdm9uIGRlbiBNYWdpZXJuIGJlZm9sZ3Qgd2VyZGVuIG11ZXNzZW4sIHN0ZWhlbiBpbQorICAgICAgIFZlcnplaWNobmlzIGAvZG9jL1JFR0VMTicgc293aWUgaW5zYmVzb25kZXJlIGluIGAvZG9jL3dpei9iYWxhbmNlJy4KKyAgICAgKiBndXRlIFdhZmZlbiAoV0MgdWViZXIgMTkwKSBzb2xsdGVuIG51ciBzZWx0ZW4gaW5zIFNwaWVsIGtvbW1lbiwgZGFzCisgICAgICAgaGVpc3N0IGVzIHNvbGx0ZSBrZWluZSA1IE5QQ3MgYXVmIGVpbmVtIEhhdWZlbiBtaXQgc29sY2hlbiBXYWZmZW4gZ2ViZW4KKyAgICAgICAoYWxzIEJlaXNwaWVsKS4gQXVzc2VyZGVtIHNvbGx0ZW4gZGllc2UgV2FmZmVuIHNjaHdlciB6dSBlcmxhbmdlbiBzZWluLgorICAgICAqIHNlaHIgZ3V0ZSBXYWZmZW4gKDIwMCBvZGVyIG1laHIpIHNvbGx0ZW4gc2VociBzZWx0ZW4gc2VpbiB1bmQgc2VocgorICAgICAgIHNjaHdpZXJpZyB6dSBiZWtvbW1lbi4gRXh0cmVtIGd1dGUgV2FmZmVuIGtvZW5uZW4gcnVoaWcgZXhpc3RpZXJlbiwKKyAgICAgICBhbGxlcmRpbmdzIHNvbGx0ZW4gc2llIGRhbm4gZWlubWFsaWcgc2VpbiAoQmVpc3BpZWw6IEhhdXJ1Y2spLgorICAgICAqIEFydGlsbGVyaWU6IEdpYnQgZXMgc2Nob24gbWVociBhbHMgZ2VudWcsIHNvbGx0ZSBlaWdlbnRsaWNoIG51ciBub2NoIGluCisgICAgICAgZXh0cmVtZW0gQXVzbmFobWVmYWVsbGVuIG5ldSByZWlua29tbWVuLiBBbHMgQXJ0aWxsZXJpZSBiZXplaWNobmUgaWNoCisgICAgICAgYWxsZXMsIHdhcyBpbSBLYW1wZiB6dXNhZXR6bGljaCBoaWxmdCAoRmxhbW1lbmt1Z2VsbiwgV3VyZnN0ZXJuZSwKKyAgICAgICBFaXNzdGFiKS4KKyAgICAgKiBIZWlsdW5nOiB0cmFnYmFyZSBIZWlsdW5nIGlzdCBnZW5lcmVsbCBuaWNodCBlcmxhdWJ0LCBhbGxlcmRpbmdzIGthbm4KKyAgICAgICBtYW4gQXVzbmFobWVuIG1hY2hlbiBiZWkgZW50c3ByZWNoZW5kZW4gTmFjaHRlaWxlbiwgei5iLiBob2hlCisgICAgICAgU2FldHRpZ3VuZywgZ2xlaWNoemVpdGlnZSBWZXJnaWZ0dW5nLCBBYmhhZW5naWdrZWl0IC4uLiBkZXIgRmFudGFzaWUKKyAgICAgICBzaW5kIGtlaW5lIEdyZW56ZW4gZ2VzZXR6dC4KKyAgICAgKiBBdXNnZWdsaWNoZW5oZWl0OiBEYXJhdWYgYWNodGVuLCBkYXNzIG5pY2h0IG51ciBNZWdhLU1vbnN0ZXIgcnVtbGF1ZmVuLAorICAgICAgIHNvbmRlcm4gZnVlciBqZWRlbiBldHdhcyBkYWJlaSBpc3QuIERhYmVpIHNvbGx0ZW4gaGFydGUgTW9uc3RlciBuaWNodAorICAgICAgIG9obmUgd2VpdGVyZXMgenUgZXJyZWljaGVuIHNlaW47IG1hbiBzb2xsdGUgc3B1ZXJiYXJlbiBXaWRlcnN0YW5kCisgICAgICAgdWViZXJ3aW5kZW4gbXVlc3NlbiwgYmV2b3IgbWFuIHNpZSBlcnJlaWNodC4KKworUHJvZ3JhbW1oaWVyaGlud2Vpc2U6IFtFcmdhZW56dW5nIHZvbSAyMDAzLTAzLTA2LCBab29rXQorCitCaXR0ZSBhY2h0ZXQgZGFyYXVmLCBkYXNzIGJlaW0gUHJvZ3JhbW1pZXJlbiBFdXJlciBSZWdpb25zbWl0YXJiZWl0ZXIKK2dld2lzc2UgU3RhbmRhcmRzIGVpbmdlaGFsdGVuIHdlcmRlbiB1bmQgZGFzcyB0eXBpc2NoZSBGZWhsZXIgdmVybWllZGVuCit3ZXJkZW4uIEltIGZvbGdlbmRlbiBlaW4gcGFhciBIaW53ZWlzZToKKworICogQmVpIExhZWRlbiBiaXR0ZSBkYXJhdWYgYWNodGVuLCBkYXNzIG5pY2h0IHVubm9ldGlnICJ2ZXJrYXVmZSIgbWl0CisgICBlaW5lbSBBZGRDbWQgdWViZXJzY2hyaWViZW4gd2lyZCwgd2VubiBzdGF0dCBkZXNzZW4gYnV5X29iaigpIG9kZXIKKyAgIHNlbGxfb2JqKCkgdmVyd2VuZGV0IHdlcmRlbiBrYW5uLgorICAgVW0gTGFlZGVuIGJlc3NlciBhbnp1cGFzc2VuLCBrYW5uIGRvcnQgYXVjaCBQX0dFTkRFUiwgUF9OQU1FIHVuZAorICAgUF9BUlRJQ0xFIGdlc2V0enQgd2VyZGVuLgorICogQmVpIFdhZmZlbiBrYW5uIHVuZCBzb2xsdGUgZGllIEZ1bmt0aW9uICJpc191bnNhZmUiIHZlcndlbmRldCB3ZXJkZW4sCisgICB3ZW5uIE5QQ3MgZGllIFdhZmZlIG5pY2h0IHp1ZWNrZW4gc29sbHRlbi4gWi5CLiBsaWVmZXJ0IGVpbmVuIAorICAgUnVuZW5zY2h3ZXJ0IGJlaSBFbGZlbi1OUENzIGVpbmUgMSB6dXJ1ZWNrLCBzb25zdCBlaW5lIDAuCisgKiBFcyBnaWJ0IGVpbmUgUHJvcGVydHkgUF9QTFVSQUwuIERpZSBzb2xsdGUgbWFuIGF1Y2ggdmVyd2VuZGVuLiAKKyAgIFNpZWhlIGRhenUgZGllIEhpbGZlc2VpdGUuCisgKiBadW0gSGFudGllcmVuIG1pdCBHZWdlbnN0YWVuZGVuIHN0ZWxsdCBwdXQmZ2V0IGVpbmlnZSBrb21mb3J0YWJsZQorICAgRnVua3Rpb25lbiB6dXIgVmVyZnVlZ3VuZzogcGlja19vYmooKSwgZHJvcF9vYmooKSwgcHV0X29iaigpLCAKKyAgIGdpdmVfb2JqKCkuCisgICBVbSBPYmpla3RlIGF1c3p1d2FlaGxlbiBrYW5uIGZpbmRfb2JzKCkgZ2VudXR6dCB3ZXJkZW4uCisgICBQcnVlZnQgZWluIE9iamVrdCwgb2IgZXMgc2VsYnN0IGdlbWVpbnQgaXN0ICh6LkIuIGluIGVpbmVtIEFkZENtZCkKKyAgIGJpdHRlIHBydWVmZW4sIG9iIGlkKCkgdmVyd2VuZGV0IHdlcmRlbiBzb2xsdGUuCisgICAKKworICAgIFNvbnN0aWdlczoKKworICAgICAqIFdlbm4gbWFuIGVpbiBWZXJ6ZWljaG5pcyB1bnRlciAvZC88cmVnaW9uPiBhbmxlZ3QsIG11c3MgbWFuIGRhcmF1ZgorICAgICAgIGFjaHRlbiwgZGFzcyBkZXIgZW50c3ByZWNoZW5kZSBOYW1lIGdlYmFuaXNodCB3aXJkLCBzb25zdCBpc3QgZWluCisgICAgICAgU3BpZWxlciBkZXIgZGllc2VuIE5hbWVuIGhhdCBhdXRvbWF0aXNjaCBNaXRhcmJlaXRlciBkZXIgUmVnaW9uIChkYXMKKyAgICAgICBiZXRyaWZmdCBWZXJ6ZWljaG5pc3NlLCBkaWUgbmljaHQgZnVlciBSZWdpb25zbWl0Z2xpZWRlciwgc29uZGVybiBmdWVyCisgICAgICAgYW5kZXJlIEF1ZmdhYmVuIGdlZGFjaHQgc2luZCkuCisgICAgICogRWluIE5hbWUgd2lyZCBnZWJhbmlzaHQgaW5kZW0gbWFuIGluIGRpZSBHaWxkZSBnZWh0IHVuZCBkb3J0IGBiYW5pc2gKKyAgICAgICA8bmFtZT4nIGVpbmdpYnQuIEJpdHRlIGtlaW5lIGRpcmVrdGVuIEZ1bmt0aW9uc2F1ZnJ1ZmUgaW0gbWFzdGVyIQorCisgU0lFSEUgQVVDSDoKKyAgICBmb3JzY2hlcnB1bmt0ZSwgYmFsYW5jZSwgYmFuaXNoCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAgIERvbiwgIDYuIEZlYiAyMDAzLCAxMzozMDo1NiB2b24gWm9vay4KZGlmZiAtLWdpdCBhL2RvYy93aXovcmVwdXRhdGlvbiBiL2RvYy93aXovcmVwdXRhdGlvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTFhYzIwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dpei9yZXB1dGF0aW9uCkBAIC0wLDAgKzEsMTY0IEBACitUSEVNQToKKyAgUmVwdXRhdGlvbmVuCisKKworQUxMR0VNRUlORSBCRVNDSFJFSUJVTkc6CisgIE1hbiBrYW5uIGJlaSBlaW5lciBHcnVwcGllcnVuZy9Wb2xrL1BhcnRlaS9ldGMuIFJ1ZiBnZXdpbm5lbiBvZGVyIHZlcmxpZXJlbiAKKyAgdW5kIHNvbWl0IGVudHdlZGVyIGRlcmVuIFJlc3Bla3QgZXJsYW5nZW4gb2RlciBhdWYgaWhyZXIgQWJzY2h1c3NsaXN0ZSAKKyAgbGFuZGVuLgorCisgIEFtIEJlaXNwaWVsIGRlciBHb2JsaW5zIGltIFdhbGRkb3JmIFNrb2dhOiBEb3J0IGdpYnQgZXMgZGFzIEZyZWllIFZvbGssIGRhcyAKKyAgYXVzIHNlaW5lbSBIZWltYXRkb3JmIHZlcnRyaWViZW4gd3VyZGUsIHVuZCBkaWUgR29ibGlucywgd2VsY2hlIGRhcyBEb3JmCisgIGJlc2V0enQgaGFiZW4uIEhpbGZ0IG1hbiBlaW5lciBTZWl0ZSwgYmF1dCBtYW4gUnVmIGF1ZiB1bmQgZXJoYWVsdCAKKyAgYmVpc3BpZWxzd2Vpc2UgWnVnYW5nIHp1IEhlaWxzdGVsbGVuIHVuZCBzcGV6aWVsbGVuIEl0ZW1zLCB3YWVocmVuZCBkaWUgCisgIGFuZGVyZSBTZWl0ZSB6dW5laG1lbmQgbWlzc3RyYXVpc2NoIHJlYWdpZXJ0IHVuZCBlaW5lbiBzY2hsdXNzZW5kbGljaCBvaG5lIAorICB6dSBmcmFnZW4gYXR0YWNraWVydC4KKworICBFcyBtdWVzc2VuIG5pY2h0IGltbWVyIG1laHJlcmUgU2VpdGVuIGludm9sdmllcnQgc2Vpbi4gQXVjaCBlaW5lIGVpbnplbG5lIAorICBQYXJ0ZWkgaXN0IGRlbmtiYXIsIGRlciBtYW4gaGVsZmVuIGthbm4gdW5kIGluIGRlcmVuIExhZWRlbi9LbmVpcGVuIG1hbiBtaXQgCisgIHN0ZWlnZW5kZW0gUnVmIHouQi4gVmVyZ3VlbnN0aWd1bmdlbiwgbWVociBJbmZvcm1hdGlvbmVuLCBCb251c2l0ZW1zIHVuZCAKKyAgQWVobmxpY2hlcyBlcmhhZWx0LgorCisgIERlbmtiYXIgaXN0IGVzIGF1Y2gsIGRhcyBHYW56ZSB6dSB2ZXJuZXR6ZW4uIEJlaXNwaWVsc3dlaXNlIGtvZW5udGUgZWluIAorICBWZXJ3YW5kdGVyIGVpbmVzIE1pdGdsaWVkcyB2b24gb2JlbmdlbmFubnRlbSBGcmVpZW4gVm9sayB2b3IgZGVuIEFuZ3JpZmZlbiAKKyAgaW5zIFBvbGFyZ2ViaWV0IHVtZ2V6b2dlbiBzZWluLCBhYmVyIHZvbiBkZXMgU3BpZWxlcnMgSGVsZGVudGF0ZW4gZ2Vob2VydCAKKyAgaGFiZW4gdW5kIGlobSBzbyBmcmV1bmRsaWNoZXIgZ2Vzb25uZW4gc2Vpbi4KKworCitNRVRIT0RFTiAocy4gYS4gZWluemVsbmUgTWFucGFnZXMpOgorCisgIGludCBDaGFuZ2VSZXB1dGF0aW9uKHN0cmluZyByZXBpZCwgaW50IHZhbHVlLCBpbnQgc2lsZW50KQorICAgICAgRGllIEZ1bmt0aW9uIGlzdCBpbiBqZWRlbSBTcGllbGVyb2JqZWt0IHZvcmRlZmluaWVydC4KKyAgICAgIFZvciBkZXIgQWVuZGVydW5nIHdpcmQgZWluIENoZWNrIGF1ZiBkaWUgVUlEIGRlcyBhdXNmdWVocmVuZGVuIE9iamVrdGVzCisgICAgICBhdXNnZWZ1ZWhydCwgImZyZW1kZSIgUmVwdXRhdGlvbmVuIGRhcmYgbWFuIHNvbWl0IG5pY2h0IHZlcmFlbmRlcm4uCisgICAgICBNYW4ga2FubiBhYmVyIHNlbGJzdHZlcnN0YWVuZGxpY2ggaW4gYmVncnVlbmRldGVuIEZhZWxsZW4gbWl0IGRlbQorICAgICAgenVzdGFlbmRpZ2VuIE1hZ2llci9SZWdpb25zbWFnaWVyIHNwcmVjaGVuLCBvYiBtYW4gZWJlbmZhbGxzIFp1Z3JpZmYKKyAgICAgIGVyaGFlbHQuIEVpbmdldHJhZ2VuIHdpcmQgZGllcyBzY2hsdXNzZW5kbGljaCBkdXJjaCBlaW5lbiBFTS4KKworCisgIGludCBHZXRSZXB1dGF0aW9uKHN0cmluZyByZXBpZCkKKyAgICAgIEViZW5mYWxscyBpbSBTcGllbGVyb2JqZWt0IHZvcmRlZmluaWVydC4gTGllZmVydCBkZW4gYWt0dWVsbGVuIFdlcnQgZGVyCisgICAgICBhbmdlZ2ViZW5lbiBSZXB1dGF0aW9uIHp1cnVlY2suCisKKworICBtYXBwaW5nIEdldFJlcHV0YXRpb25zKCkKKyAgICAgIEViZW5zbyB2b3JkZWZpbmllcnQuIExpZWZlcnQgZWluIE1hcHBpbmcgYWxsZXIgaW0gU3BpZWxlciBnZXNwZWljaGVydGVuCisgICAgICBSZXB1dGF0aW9uZW4gdW5kIGlocmVyIFdlcnRlIHp1cnVlY2suCisKKworQkVJU1BJRUxFOgorCisgIC8vIEVpbmUga2xlaW5lIEF1ZmdhYmUgZnVlciBkYXMgIkZyZWllIFZvbGsiIGJyaW5ndCBkZW0gU3BpZWxlciBldHdhcyAKKyAgLy8gQW5zZWhlbi4KKworICB2b2lkIFF1ZXN0R2Vsb2VzdChvYmplY3QgcGwpIHsKKyAgICAvLyBTaWxlbnQsIHdpciBnZWJlbiBlaW5lIGVpZ2VuZSBNZWxkdW5nIGF1cy4KKyAgICBwbC0+Q2hhbmdlUmVwdXRhdGlvbigiZnJlaWVzdm9sayIsIDI1MCwgMSk7CisKKyAgICB0ZWxsX29iamVjdChwbCwgIkR1IGJlZnJlaXN0IGVpbmVuIEdlZmFuZ2VuZW4uIERhcyBmcmVpZSBWb2xrIHdpcmQgZXMgIgorICAgICAgIkRpciBkYW5rZW4uXG4iKTsKKyAgfQorCisgIC8vIEVpbiBOUEMgZGVzICJTY2hhZWRsc3BhbHRhLUtsYW5zIi4gV2VubiBlciBnZXRvZXRldCB3aXJkLCB2ZXJsaWVyZW4gZGllIAorICAvLyB0b2V0ZW5kZW4gU3BpZWxlciBSdWYgYmVpIGRpZXNlciBGcmFrdGlvbi4KKyAKKyAgI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKworICBpbmhlcml0ICIvc3RkL25wYy5jIjsKKworICB2b2lkIGNyZWF0ZSgpIHsKKyAgICBucGM6OmNyZWF0ZSgpOworICAgIFNldFByb3AoUF9TSE9SVCwgIkVpbiBHb2JsaW4gZGVzIFNjaGFlZGxzcGFsdGEtS2xhbnMiKTsKKyAgICAuLi4KKyAgfQorCisgIHZhcmFyZ3Mgdm9pZCBkaWUoaW50IHBvaXNvbiwgaW50IGV4dCkgeworICAgIG9iamVjdCAqZW5lbWllczsKKyAgICBpbnQgdmFsdWU7CisgICAgLy8gQmVnbGVpdC1OUENzIGJyYXVjaGVuIGtlaW5lIFJlcHV0YXRpb24KKyAgICBlbmVtaWVzID0gZmlsdGVyKFByZXNlbnRFbmVtaWVzKCksICMnaW50ZXJhY3RpdmUpOworICAgIC8vIDUwIFJlcHV0YXRpb25zYWJ6dWcgcHJvIEtpbGwsIGF1ZmdldGVpbHQgYXVmIGFsbGUgR2VnbmVyCisgICAgdmFsdWUgPSAtNTAgLyBzaXplb2YoZW5lbWllcyk7CisgICAgZm9yZWFjaChvYmplY3QgcGwgOiBlbmVtaWVzKSB7CisgICAgICBwbC0+Q2hhbmdlUmVwdXRhdGlvbigic2NoYWVkbHNwYWx0YSIsIHZhbHVlKTsKKyAgICAgIC8vIE9wdGlvbmFsIGtvZW5udGUgaWhyZSAiRmVpbmRmcmFrdGlvbiIgZGFzIGd1dGhlaXNzZW46CisgICAgICAvLyBwbC0+Q2hhbmdlUmVwdXRhdGlvbigiZnJlaWVzdm9sayIsIGFicyh2YWx1ZSkpOworICAgIH0KKyAgICByZXR1cm4gbnBjOjpkaWUocG9pc29uLCBleHQpOworICB9CisKKyAgLy8gSmVkZXIgYmV0ZWlsaWd0ZSBGZWluZCBrcmllZ3QgbnVuIGVpbmUgTWVsZHVuZywgZGllIGluIGV0d2EgbGF1dGVuIAorICAvLyBrb2VubnRlOiAiRGVpbiBBbnNlaGVuIGJlaW0gU2NoYWVkbHNwYWx0YS1LbGFuIGhhdCBzaWNoIGV0d2FzIAorICAvLyB2ZXJzY2hsZWNodGVydC4iIERlciBOUEMga29lbm50ZSBudW4gU3BpZWxlciBhdXRvbWF0aXNjaCBhbmdyZWlmZW4sIAorICAvLyBzb2JhbGQgaWhyIFJ1ZiB6dSB0aWVmIGdlc3Vua2VuIGlzdDoKKyAgCisgICNpbmNsdWRlIDxyZXB1dGF0aW9uLmg+CisKKyAgdm9pZCBpbml0KCkgeworICAgIG5wYzo6aW5pdCgpOworICAgIGlmKG9iamVjdHAodGhpc19wbGF5ZXIoKSkgJiYgIUlzRW5lbXkodGhpc19wbGF5ZXIoKSkgJiYgCisgICAgICAgdGhpc19wbGF5ZXIoKS0+R2V0UmVwdXRhdGlvbigic2NoYWVkbHNwYWx0YSIpIDw9IFJFUF9ESVNMSUtFRCkKKyAgICAgIEluc2VydEVuZW15KHRoaXNfcGxheWVyKCkpOworICB9CisKKyAgLy8gRWluIE5QQyBydWVja3QgYmVzdGltbXRlIEluZm9ybWF0aW9uZW4gZXJzdCByYXVzLCBzb2JhbGQgZGFzIEFuc2VoZW4KKyAgLy8gZGVzIFNwaWVsZXJzIGhvY2ggZ2VudWcgaXN0OgorCisgICNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisgICNpbmNsdWRlIDxyZXB1dGF0aW9uLmg+CisKKyAgaW5oZXJpdCAiL3N0ZC9ucGMuYyI7CisKKyAgc3RyaW5nIEluZm9HZWhlaW1wbGFuKCk7CisKKyAgdm9pZCBjcmVhdGUoKSB7CisgICAgbnBjOjpjcmVhdGUoKTsKKyAgICBTZXRQcm9wKFBfU0hPUlQsICJEZXIgS29tbWFuZGFudCBkZXMgZnJlaWVuIFZvbGtlcyIpOworICAgIC4uLgorICAgIEFkZEluZm8oImdlaGVpbXBsYW4iLCAjJ0luZm9HZWhlaW1wbGFuLCAic2FndDogIik7CisgIH0KKworICBzdHJpbmcgSW5mb0dlaGVpbXBsYW4oKSB7CisgICAgaWYodGhpc19wbGF5ZXIoKS0+R2V0UmVwdXRhdGlvbigiZnJlaWVzdm9sayIpIDwgUkVQX1RSVVNURUQpCisgICAgICByZXR1cm4gIkRhcyBnZWh0IERpY2ggdWViZXJoYXVwdCBuaWNodHMgYW4hIjsKKyAgICByZXR1cm4gIk51biwgaWNoIHZlcnRyYXVlIERpci4gQWxzbywgaGV1dGUgdW0gTWl0dGVybmFjaHQgLi4uIC4uLiAuLi4iOworICB9ICAgCisKKyAgLy8gUHJ1ZWZ1bmcgZGVyICh3aWNodGlnc3RlbikgUnVlY2tnYWJld2VydGU6CisKKyAgI2luY2x1ZGUgPHJlcHV0YXRpb25zLmg+CisgIAorICB2b2lkIFF1ZXN0R2Vsb2VzdChvYmplY3QgcGwpIHsKKyAgICBzdHJpbmcgbXNnOworCisgICAgLy8gU29uc3RpZ2UgTWVsZHVuZ2VuCisgICAgLi4uCisKKyAgICBzd2l0Y2gocGwtPkNoYW5nZVJlcHV0YXRpb24oImZyZWllc3ZvbGsiLCA1MDAsIDEpKSB7CisgICAgICAvLyBSZXB1dGF0aW9uIGJlcmVpdHMgTWF4CisgICAgICBjYXNlIFJFUF9SRVRfQUxSRUFEWU1BWDoKKyAgICAgICAgbXNnID0gIkRlaW4gQW5zZWhlbiBiZWltIGZyZWllbiBWb2xrIGthbm4gc2ljaCBuaWNodCBtZWhyIHdlaXRlciAiCisgICAgICAgICAgICAgICJ2ZXJiZXNzZXJuLiI7CisgICAgICAgIGJyZWFrOworICAgICAgLy8gUmVwdXRhdGlvbiB3YWVyZSBob2VoZXIgYWxzIE1heCBnZXdvcmRlbiwgZGFoZXIgYXVmIE1heCBnZXNldHp0CisgICAgICBjYXNlIFJFUF9SRVRfU1VDQ0VTU0NVVDoKKyAgICAgICAgbXNnID0gIkRlaW4gQW5zZWhlbiBiZWltIGZyZWllbiBWb2xrIGhhdCBzaWNoIGV0d2FzIHZlcmJlc3NlcnQsICIKKyAgICAgICAgICAgICAgImFiZXIgd2VpdGVyIHN0ZWlnZXJuIGthbm5zdCBEdSBlcyBuaWNodCBtZWhyLiI7CisgICAgICAgIGJyZWFrOworICAgICAgLy8gUmVwdXRhdGlvbiBlcmZvbGdyZWljaCBnZWFlbmRlcnQKKyAgICAgIGNhc2UgUkVQX1JFVF9TVUNDRVNTOgorICAgICAgICBtc2cgPSAiRGVpbiBBbnNlaGVuIGJlaW0gZnJlaWVuIFZvbGsgaGF0IHNpY2ggZXR3YXMgdmVyYmVzc2VydC4iOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIC8vIFRlY2huaXNjaGVyIEZlaGxlcgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZihzdHJpbmdwKG1zZykgJiYgc3RybGVuKG1zZykpCisgICAgICB0ZWxsX29iamVjdChwbCwgYnJlYWtfc3RyaW5nKG1zZywgNzgpKTsKKyAgfQorCitTSUVIRSBBVUNIOiAKKworTEVUWlRFIEFFTkRFUlVORzoKKyAgMjAwOS0yMi0wMywgMTI6MzA6MDAgdm9uIE5pYmVsCmRpZmYgLS1naXQgYS9kb2Mvd2l6L3JtLWhvd3RvIGIvZG9jL3dpei9ybS1ob3d0bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWI5YWM3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dpei9ybS1ob3d0bwpAQCAtMCwwICsxLDMzNCBAQAorUk0gLSBIT1dUTworKioqKioqKioqKgorCitWb3JsYWV1ZmlnZXMgSW5oYWx0c3ZlcnplaWNobmlzOgorCisxKSBBbGxnZW1laW5lcworICAgLSBGZWhsZXJ0ZXVmZWwKKyAgIC0gTG9ndG9vbAorICAgLSBLb21tZW50aWVydW5nIHZvbiBBZW5kZXJ1bmdlbgorICAgLSBlaWdlbmUgQW5zY2hsdWVzc2UKKzIpIEFibmFobWUgdm9uIENvZGUvR2ViaWV0ZW4KKyAgIC0gQmFsYW5jZS9HZW5laG1pZ3VuZ2VuCisgICAtIEtvbnplcHRpb25lbGxlIEVpZ251bmcKKyAgIC0gZm9ybWFsZSBQcnVlZnVuZworICAgLSBHZW1laW5zY2hhZnRzYXJiZWl0ZW4KKzMpIFZlcmxlZ3VuZyB2b24gRGF0ZWllbgorNCkgU2VoZXJoYWV1c2VyCisgICAtIFNvbmRlcnd1ZW5zY2hlL1Vuc2ljaHRiYXJrZWl0CisgICAtIGFuZGVyZXIgQmVmZWhsIHp1bSBCZXRyZXRlbgorICAgLSBWZXJ3ZWlzZSBhdWYgQmVpc3BpZWxjb2RlCis1KSBEZWJ1Z2dlbiB2b24gQ29kZQorNikgYmVzb25kZXJlIEZ1bmt0aW9uZW4vRnVua3Rpb25hZWxpdGFldGVuCisgICAtIGNhdGNoX3RlbGwoKSAvIFJlY2VpdmVNc2coKQorICAgLSBtb3ZlKCkKKyAgIC0gQXR0YWNrKCkgLyBEZWZlbmQoKQorICAgLSBjYWxsX291dCgpCisgICAtIHJlbW92ZSgpIC8gZGVzdHJ1Y3QoKQorICAgLSBmb3IoKS1TY2hsZWlmZW4KKyAgIC0gd3JpdGVfZmlsZSgpCisgICAtIFZlcndhbHRlbiB2b24gY2hhcmFrdGVyYmV6b2dlbmVuIERhdGVuCisKKzEpIEFsbGdlbWVpbmVzCis9PT09PT09PT09PT09PQorCitvIFVtIHN0ZXRzIGVpbmVuIFVlYmVyYmxpY2sgdWViZXIgZGllIGluIERlaW5lciBSZWdpb24gKGhvZmZlbnRsaWNoIHNlbHRlbikKKyAgYXVmdHJldGVuZGVuIEJ1Z3MgdW5kIFdhcm51bmdlbiB6dSBiZWhhbHRlbiwgc29sbHRlc3QgRHUgZWluZW4KKyAgRmVobGVydGV1ZmVsICgvb2JqL3Rvb2xzL2ZlaGxlcnRldWZlbC5jKSBiZXNpdHplbiwgYmVkaWVuZW4ga29lbm5lbiB1bmQKKyAgcmVnZWxtYWVzc2lnIGRlc3NlbiBMaXN0ZW4gZHVyY2hzZWhlbi4gRGVpbmVuIFJlZ2lvbnNtaXRhcmJlaXRlcm4gc29sbHRlc3QKKyAgRHUsIGFsbGVpbiBzY2hvbiwgdW0genVzYWV0emxpY2hlIEFyYmVpdCBmdWVyIERpY2ggc2VsYnN0IHp1IHJlZHV6aWVyZW4sCisgIGRpZXNlcyBXZXJremV1ZyBlYmVuZmFsbHMgYW4gZGllIEhhbmQgZ2ViZW4gdW5kIHNpZSBhdWZmb3JkZXJuLCBpaHJlbgorICBLcmFtIG1vZWdsaWNoc3QgdW1mYXNzZW5kIHNlbGJzdCB6dSByZXBhcmllcmVuLgorICBOZXVlbiBNYWdpZXJuIHdpcmQgZGllc2VzIFRvb2wgdWVicmlnZW5zIGF1dG9tYXRpc2NoIHZvbiBNZXJsaW4gaW4gZGllCisgIEhhbmQgZ2VkcnVlY2t0LCBzbyBkYXNzIHNpZSBzaWNoIHZvbSBlcnN0ZW4gVGFnIGFuIGRhcmFuIGdld29laG5lbiBrb2VubmVuLgorCitvIEVzIGlzdCBlbXBmZWhsZW5zd2VydCwgZGFzIExvZ3Rvb2wgenUgYmVzaXR6ZW4gKC9vYmovdG9vbHMvbG9ndG9vbC5jKSB1bmQKKyAgaW4gZGllc2VtIGZ1ZXIgamVkZXMgUmVwZmlsZSBlaW5lcyBSZWdpb25zbWl0YXJiZWl0ZXJzIGVpbmVuIEVpbnRyYWcgdm9yLQorICB6dXNlaGVuLiBXYXJ1bSBkYXM/IEVzIGlzdCBiZXJlaXRzIHZvcmdla29tbWVuLCBkYXNzIFNwaWVsZXIgZXJuc3RoYWZ0CisgIGFyZ3VtZW50aWVydCBoYWJlbiwgc2llIGR1ZXJmdGVuIGVpbmVuIHZvbiBpaG5lbiBlbnRkZWNrdGVuIEJ1ZyBhdXNudXR6ZW4sCisgIHdlaWwgc2llIGlobiBqYSBnZW1lbGRldCBoYWV0dGVuIChpbSBSZXBmaWxlISksIGVyIGFiZXIgbmljaHQgcmVwYXJpZXJ0CisgIHdvcmRlbiBzZWkgKHdhcyBuaWNodCB2ZXJ3dW5kZXJ0LCBkYSBlciBpbSBSZXBmaWxlIGluIGRlciBNZWhyemFobCBkZXIKKyAgRmFlbGxlIHdlaXQgdW50ZXJoYWxiIGRlcyBXYWhybmVobXVuZ3Nob3Jpem9udHMgZGVyIGFsbGVybWVpc3RlbgorICBSZWdpb25zbWFnaWVyIHNjaHdlYnQpLgorCitvIFdlbm4gRHUgaW4gZnJlbWRlbSBDb2RlIEFlbmRlcnVuZ2VuIHZvcm5laG1lbiBtdXNzdCwgZGllIG1laHIgYmVydWVocmVuCisgIGFscyBudXIgZWluIHBhYXIgVGlwcGZlaGxlciBpbiBEZXRhaWxzIG9kZXIgSW5mb3MsIGRhbm4ga29tbWVudGllcmUgZGVuCisgIGRlZmVrdGVuIENvZGUgYXVzIHVuZCBmdWVnZSBkZW4gcmVwYXJpZXJ0ZW4gbWl0IEtvbW1lbnRhciBlaW4uIEVzIHJlaWNodAorICBhbiBkaWVzZXIgU3RlbGxlIGF1cywgRGVpbmVuIE5hbWVuIHVuZCBkYXMgRGF0dW0genUgdmVybWVya2VuLiBJbiBkZW4KKyAgSGVhZGVyIGRlciBEYXRlaSBzb2xsdGVzdCBEdSB1bmJlZGluZ3QgZWluIENoYW5nZWxvZyBlaW5mdWVnZW4sIGluIGRlbQorICBkYXMgRGF0dW0gZGVyIEFlbmRlcnVuZywgZGVyIE5hbWUgZGVzIEF1c2Z1ZWhyZW5kZW4gKERlaW5lcikgc293aWUgZGllCisgIHZvcmdlbm9tbWVuZSBBZW5kZXJ1bmcgbWl0IEJlZ3J1ZW5kdW5nIGJ6dy4gdS5VLiBCdWctSUQgYXVzIGRlbSBGZWhsZXItCisgIHRldWZlbCBlaW56dXRyYWdlbiBpc3QuIFdpciBoYWJlbiBpbSBNRyBsZWlkZXIga2VpbmVuIHdpcmt1bmdzdm9sbGVuCisgIERlYnVnZ2VyIHVuZCBCdWd0cmFja2VyLU1lY2hhbmlzbXVzLCBzbyBkYXNzIHdpciB6dXIgRXJoYWx0dW5nIGVpbmVyCisgIGdld2lzc2VuIENvZGUtSHlnaWVuZSBCdWdmaXhlcyBtaXQgSGlsZmUgc29sY2hlciBFaW50cmFndW5nZW4gZG9rdW1lbnRpZXJlbgorICB1bmQgcnVlY2t2ZXJmb2xnZW4gbXVlc3Nlbi4gSW5zYmVzb25kZXJlIGlzdCBlaW4gc29sY2hlciBFaW50cmFnIHdpY2h0aWcsCisgIHVtIGltIEZhbGxlIHZvbiBGb2xnZS1CdWdzIGRpZSBVcnNhY2hlIHNjaG5lbGxlciB6dSBmaW5kZW4uCisKK28gV2lsbHN0IER1IGluIERlaW5lciBlaWdlbmVuIFJlZ2lvbiBlaW4gR2ViaWV0IGFuc2NobGllc3Nlbiwgc29sbHRlc3QgRHUKKyAgZGllc2VuIHZvciBBbnNjaGx1c3MgZW50d2VkZXIgdm9tIENvLVJNIG9kZXIgdm9uIGVpbmVtIFJNIGVpbmVyIGFuZGVyZW4KKyAgUmVnaW9uIGxlc2VuIGxhc3Nlbi4gQXVjaCB3ZW5uIER1IGVpbiBndXRlciBQcm9ncmFtbWllcmVyIGJpc3QsIGZpbmRldCBlaW4KKyAgendlaXRlcyBQYWFyIEF1Z2VuIG9mdCBEaW5nZSwgYW4gZGllIG1hbiBuaWNodCBnZWRhY2h0IGhhdC4KKworCisyKSBDb2RlIHdpcmQgenVyIEFibmFobWUgdm9yZ2VsZWd0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK28gQmVpIFdhZmZlbiB1bmQgUnVlc3R1bmdlbiB1bmJlZGluZ3QgYXVmIEVpbmhhbHR1bmcgZGVyIEJhbGFuY2UtVm9yZ2FiZW4KKyAgYWNodGVuLgorCitvIFNvZmVybiBlaW4gT2JqZWt0IGVpbmUgQmFsYW5jZS1HZW5laG1pZ3VuZyBiZXNpdHp0LCBtdXNzIGRpZSBCVE9QLU51bW1lciwKKyAgZGllIGRpZSBCYWxhbmNlIGFscyBlaW5kZXV0aWdlIElEIGZ1ZXIgamVkZW4gQW50cmFnIHZlcmdpYnQsIGltIEhlYWRlcgorICBkZXMgYmV0cmVmZmVuZGVuIE9iamVrdGVzIGVya2VubmJhciBlaW5nZXRyYWdlbiBzZWluLgorCitvIFZvciBBbnNjaGx1c3Mgc29sbHRlIG1hbiBSdWVja3NwcmFjaGUgbWl0IHZlcnNjaGllZGVuZW4gSW5zdGFuemVuIGhhbHRlbiwKKyAgdW0gc2ljaGVyenVzdGVsbGVuLCBkYXNzIGRlciBNYWdpZXIgYWxsZSB3ZXNlbnRsaWNoZW4gUHVua3RlCisgIGJlcnVlY2tzaWNodGlndCBoYXQ6CisgIC0gbGllZ2VuIGFsbGUgQmFsYW5jZS1HZW5laG1pZ3VuZ2VuIHZvcj8KKyAgLSBzaW5kIGRpZSBGUCBlaW5nZXRyYWdlbj8KKyAgLSBzaW5kIGRpZSBaVHMgZWluZ2V0cmFnZW4gdW5kIGdldGVzdGV0PworICAtIHNpbmQgU29uZGVyLUVLLVN0dXBzZSBnZW5laG1pZ3QgdW5kIGVpbmdldHJhZ2VuPworCitvIEZ1ZXIgbmV1ZSBHZWJpZXRlIGlzdCBlaW5lIGdydW5kc2FldHpsaWNoZSBQcnVlZnVuZyBkZXMgS29uemVwdHMgYXVmCisgIFJlZ2lvbnN0YXVnbGljaGtlaXQgc2lubnZvbGwsIGRhbWl0IG5pY2h0IGFsdGVpbmdlc2Vzc2VuZSBJbnN0aXR1dGlvbmVuCisgIG9kZXIgT3J0ZSBwbG9ldHpsaWNoIHp1ciB6d2VpdGVuIFdhaGwgYWJnZXdlcnRldCB3ZXJkZW4gLSBiZWlzcGllbHN3ZWlzZQorICBlaW5lbiBncm9zc2VuLCBuZXVlbiBIYXVwdG9ydCBpbiBkZXIgRWJlbmUgYW56dXNjaGxpZXNzZW4sIGRlciBQb3J0IFZhaW4KKyAgdm9yYXVzc2VoYmFyIGRlbiBSYW5nIGFibGF1ZmVuIHd1ZXJkZS4KKworbyBBbGxlIE5QQ3Mgc29sbHRlbiB2b3IgQW5zY2hsdXNzIGVpbm1hbCBnZWtpbGx0IHdlcmRlbiwgdW0gc2llIGF1ZgorICBncnVuZHNhZXR6bGljaGUgS2FtcGYtRnVua3Rpb25zZmFlaGlna2VpdCB6dSBwcnVlZmVuLgorCitvIEhhYmVuIE5QQ3MgTmFtZW4sIHNvbGx0ZSB1ZWJlcmxlZ3Qgd2VyZGVuLCBkaWVzZSBOYW1lbiBnZ2YuIHp1IGJhbmlzaGVuLgorICAoaGlsZmUgYmFuaXNoKS4KKworbyBFcyBleGlzdGllcnQgZWluIFNoZWxsLVNrcmlwdCwgbWl0IGRlc3NlbiBIaWxmZSBtYW4gb2ZmZW5zaWNodGxpY2hlCisgIEZvcm1mZWhsZXIgaW4gZWluZW0ga29tcGxldHRlbiBWZXJ6ZWljaG5pcyBlcm1pdHRlbG4ga2FubiAoVW1sYXV0ZSBpbQorICBDb2RlLCB6dSBsYW5nZSBaZWlsZW4gZXRjLiksIHdvYmVpIGJlenVlZ2xpY2ggZGVyIEZvcm1hbGllbiBhdWNoIGF1ZgorICBkZW4gUmVnaW9uc21pdGFyYmVpdGVyLUxlaXRmYWRlbiBmdWVyIG5ldWUgUHJvamVrdGUgdmVyd2llc2VuIHdlcmRlbgorICBzb2xsLiBEYXMgU2tyaXB0IGhpZXJ6dSBpc3QgYXVmIEFuZnJhZ2UgYmVpIFplc3N0cmEgZXJoYWVsdGxpY2guIERlcgorICBSZWdpb25zbWFnaWVyIGhhdCBoaWVyYmVpIGRpZSBFbnRzY2hlaWR1bmdzZnJlaWhlaXQsIGRpZSBCZXJpY2h0ZSBkaWVzZXMKKyAgU2tyaXB0cyBkZW0gUHJvZ3JhbW1pZXJlciBkZXMgbmV1ZW4gR2ViaWV0cyBhbHMgQW5oYWx0c3B1bmt0ZSB6dXIKKyAgVmVyZnVlZ3VuZyB6dSBzdGVsbGVuLCBvZGVyIGRpZSBBYmFyYmVpdHVuZyBkZXIgZ2VtZWxkZXRlbiBQdW5rdGUgYWxzCisgIFZvcmF1c3NldHp1bmcgdm9yIGRlbSBBbnNjaGx1c3Mgdm9yenVzY2hyZWliZW4sIGFiZXIgYXVjaCBqZWRlIEFic3R1ZnVuZworICBkYXp3aXNjaGVuIGlzdCBPSy4gOi0pCisgIFp1c2FldHpsaWNoZXIgVGlwOiBEYXMgU2tyaXB0IGRpZmZlcmVuemllcnQgendpc2NoZW4gZWlnZW50bGljaCBuaWNodAorICBha3plcHRhYmxlbiBLb25zdHJ1a3RlbiB1bmQgenVtaW5kZXN0IGZyYWd3dWVyZGlnZW4sIGQuaC4gbWFuIGthbm4gZGllc2UKKyAgVW50ZXJzY2hlaWR1bmcgYW4gZGVuIFZlcmFudHdvcnRsaWNoZW4gbWl0IGVudHNwcmVjaGVuZGVuIEZvcmRlcnVuZ2VuCisgIHdlaXRlcmdlYmVuLgorICBEYXMgU2tyaXB0IGlzdCB1bnRlciBmdHA6Ly9tZy5tdWQuZGUvU29mdHdhcmUvc3JjX2NoZWNrLyBlcmhhZWx0bGljaC4KKworbyBTb2xsdGUgZWluIHp1ciBBYm5haG1lIGFuc3RlaGVuZGVzIFByb2pla3QgZWluZSAoZ3J1bmRzYWV0emxpY2gKKyAgc2VsYnN0dmVyc3RhZW5kbGljaCB6dWxhZXNzaWdlKSBHZW1laW5zY2hhZnRzYXJiZWl0IHNlaW4sIHNvbGx0ZSBtYW4KKyAgYWxzIFJlZ2lvbnNtYWdpZXIgZGFyYXVmIGJlc3RlaGVuLCBlaW5lIHNhdWJlciBnZXRyZW5udGUgQ29kZWJhc2lzCisgIGluIHVudGVyc2NoaWVkbGljaGVuIFZlcnplaWNobmlzc2VuIHZvcmdlbGVndCB6dSBiZWtvbW1lbiwgb2RlciBhYmVyCisgIGVpbmUgQXVmbGlzdHVuZywgd2VsY2hlciBCZWl0cmFnIHZvbiB3ZWxjaGVtIE1hZ2llciBzdGFtbXQuCisgIFdlbm4gZGllc2UgQXVmbGlzdHVuZyBzaWNoIGJpcyBhdWYgRnVua3Rpb25zZWJlbmUgZXJzdHJlY2tlbiBzb2xsdGUKKyAgKHouQi4gIkRvV2llbGQoKSBpc3Qgdm9uIFgsIERldGFpbHMgdm9uIFksIERlZmVuZEZ1bmMgdm9uIFoiKSwgaXN0CisgIGRhcyB1bnNjaG9lbiB1bmQgYW4gc2ljaCBhYnp1bGVobmVuLgorCisKKzMpIFZlcmxlZ3VuZyB2b24gRGF0ZWllbgorPT09PT09PT09PT09PT09PT09PT09PT09CisKK28gU29sbHRlIGVpbiBPYmpla3QgYXVzIGVpbmVyIGFuZGVyZW4gUmVnaW9uIGJ6dy4gYWxsZ2VtZWluIGF1cyBlaW5lbQorICBhbmRlcmVuIFZlcnplaWNobmlzICh6LkIuIC9wbGF5ZXJzKSBpbiBEZWluZSBSZWdpb24gdmVybGVndCB3ZXJkZW4KKyAgbXVlc3Nlbiwgc2luZCBWT1IgZGVtIFVtaGFlbmdlbiBmb2xnZW5kZSBQdW5rdGUgenUgYmVhY2h0ZW46CisgIC0tIEZvcnNjaGVycHVua3RlIG11ZXNzZW4gdW1nZXRyYWdlbiB3ZXJkZW4gKEVNIGFuc3ByZWNoZW4pLAorICAtLSBFcnN0a2lsbC1TdHVmZW5wdW5rdGUgbXVlc3NlbiB1bWdldHJhZ2VuIHdlcmRlbiAoRU0gYW5zcHJlY2hlbiksCisgIC0tIFphdWJlcnRyYWVua2UgdW10cmFnZW4gbGFzc2VuIChFTSBhbnNwcmVjaGVuKSwKKyAgLS0gaW4gUGFkcmVpY3MgUnVlc3R1bmdzc2tpbGwgdW10cmFnZW4gbGFzc2VuIChFTSBhbnNwcmVjaGVuKSwKKyAgLS0gZXZ0bC4gaW0gR2ViaWV0ZSB2b3JoYW5kZW5lIFNlaGVyaGFldXNlciB1bXppZWhlbiwKKyAgLS0gZXZ0bC4gaW0gR2ViaWV0IHZvcmhhbmRlbmUgS3JhZXV0ZXJza2lsbC1LcmFldXRlciBiZXJ1ZWNrc2ljaHRpZ2VuLAorICAtLSBldnRsLiBCcmllZmVtcGZhZW5nZXIgZGVyIFBvc3RxdWVzdCBiZXJ1ZWNrc2ljaHRpZ2VuLAorICAtLSB1ZWJlciBkaWUgTXVkbGliIGdyZXBwZW4gbGFzc2VuLCB1bSBldmVudHVlbGwgaW4gYW5kZXJlbiBSZWdpb25lbgorICAgICB2ZXJ3ZW5kZXRlIFJlZmVyZW56ZW4gYXVmIGRpZSBhbHRlbiBQZmFkZSBkZXMgdW16aWVoZW5kZW4gQ29kZXMKKyAgICAgenUgZmluZGVuIHVuZCBkb3J0IHVtenVzdGVsbGVuLiBIaWVyYmVpIHNpbmQgaW4gQXVzbmFobWVmYWVsbGVuIHZvbgorICAgICBmaWVzZW0gQ29kZSBhdWNoIGluIFNwaWVsZXJzYXZlZmlsZXMgZ2VzcGVpY2hlcnRlIFBmYWRlIHp1CisgICAgIGJlcnVlY2tzaWNodGlnZW4gKCpBUkdMKikuCisKKworNCkgU2VoZXJoYWV1c2VyCis9PT09PT09PT09PT09PT0KKworbyBEaWUgRXJsYXVibmlzIHp1bSBCYXUgZWluZXMgU2VoZXJoYXVzZXMgaW4gZWluZW0gR2ViaWV0IGhhZW5ndCBlaW56aWcgdW5kCisgIGFsbGVpbiB2b24gZGVtIHZlcmFudHdvcnRsaWNoZW4gTWFnaWVyIGFiLiBTb2xsdGUgZGllc2VyIGxhZW5nZXIgbmljaHQKKyAgZXJyZWljaGJhciBzZWluIChhdWNoIG5pY2h0IHVlYmVyIGV4dGVybmUgTWFpbCEpLCBsaWVndCBkaWUgRW50c2NoZWlkdW5nCisgIGJlaW0gUmVnaW9uc21hZ2llciwgZGVyIGFiZXIgaW4gamVkZW0gRmFsbCBkaWUgRWlnbnVuZyBkZXMgQmF1cGxhdHplcworICBpbiBkZXIgVW1nZWJ1bmcgYmV3ZXJ0ZW4gbXVzcy4KKworbyBGdWVyIFNvbmRlcnd1ZW5zY2hlIGJlenVlZ2xpY2ggVW5zaWNodGJhcmtlaXQgdm9uIFNlaGVyaGFldXNlcm4gb2RlcgorICBiZXNvbmRlcmVyIEtvbW1hbmRvcyB6dW0gQmV0cmV0ZW4gZGVzIEhhdXNlcyBzZWkgYXVmIGRpZSBEYXRlaQorICAvZG9jL2JlaXNwaWVsZS9taXNjL3NlaGVyaGF1cy5jIHZlcndpZXNlbiwgd28gZGllIFZvcmdlaGVuc3dlaXNlCisgIGVybGFldXRlcnQgd2lyZC4gRWluIEJlaXNwaWVsIGVpbmVyIHNlaHIgdW1mYW5ncmVpY2hlbiBJbXBsZW1lbnRpZXJ1bmcKKyAgZmluZGV0IHNpY2ggaW4gL2QvZWJlbmUvcm9vbS9ocF9zdHI4YS5jLgorCitvIEJlaSBnZWFlbmRlcnRlbiBCZWZlaGxlbiB6dW0gQmV0cmV0ZW4gbXVzcyBiZWFjaHRldCB3ZXJkZW4sIGRhc3MgYmVpIGVpbmVyCisgIFN0YW5kYXJkaW1wbGVtZW50aWVydW5nIGRpZSBFcmxhdWJlLUxpc3RlIHVtZ2FuZ2VuIHdpcmQsIGQuaC4gb2huZQorICBiZXNvbmRlcmUgVm9ya2VocnVuZ2VuIHUuVS4gSkVERVIgZGFzIEhhdXMgdW5nZWhpbmRlcnQgYmV0cmV0ZW4ga2Fubi4KKyAgRXMgaXN0IGhpbmdlZ2VuIG1vZWdsaWNoLCBkaWUgRXJsYXViZS1MaXN0ZSBhYnp1ZnJhZ2VuIHVuZCBlbnRzcHJlY2hlbmQKKyAgenUgYmVoYW5kZWxuLCBlaW4gQmVpc3BpZWwgaGllcmZ1ZXIgaXN0IGluIC9kL2ViZW5lL3Jvb20vaHBfc3RyOGEuYworICBuYWNoenVsZXNlbiAoZGVyemVpdCBqZWRvY2ggYXVmIFNwaWVsZXJ3dW5zY2ggZGVha3RpdmllcnQpLgorCisKKzUpIERlYnVnZ2VuIHZvbiBDb2RlCis9PT09PT09PT09PT09PT09PT09PQorCitvIE5hY2ggZGVtIFJlcGFyaWVyZW4gZWluZXMgT2JqZWt0ZXMgaXN0IGVzIG1laXN0IGVyZm9yZGVybGljaCwgZGFzCisgIGJldHJlZmZlbmRlIE9iamVrdCBuZXUgenUgbGFkZW4uIEZhbGxzIGVzIHNpY2ggZGFiZWkgdW0gT2JqZWt0ZSBoYW5kZWx0LAorICBkaWUgei5CLiBpbiBlaW5lbSBSYXVtIG1pdHRlbHMgQWRkSXRlbSgpIGhpbnp1Z2VmdWVndCB3dXJkZW4gKHdpZSBldHdhCisgIGVpbiBOUEMpLCBkYW5uIGlzdCBlcyBhbSBiZXN0ZW4sIGRpZSBEYXRlaSBtaXQgZGVtIEJlZmVobAorICA8dXBkIC1hZCBkYXRlaS5jPiB6dSBha3R1YWxpc2llcmVuIHVuZCBzb21pdCBzYWVtdGxpY2hlIENsb25lcyB6dQorICB6ZXJzdG9lcmVuLiBXZW5uIG1hbiBtaXR0ZWxzIDx1cGQgLWFyIGRhdGVpLmM+IGRpZSBiZXN0ZWhlbmRlbiBDbG9uZXMKKyAgZXJzZXR6ZW4gd3VlcmRlLCB3dWVyZGVuIGRpZXNlIGF1cyBkZXIgSXRlbS1MaXN0ZSBkZXMgY2xvbmVuZGVuIFJhdW1lcworICBhdXNnZXRyYWdlbiwgc28gZGFzcyBkaWVzZXIgUmF1bSBkYW5uIGltIHJlc2V0KCkgbmV1ZSBJdGVtcyBlcnpldWd0IHVuZAorICBkaWVzZSBpbiBkZXIgRm9sZ2UgZG9wcGVsdCBleGlzdGllcmVuIHd1ZXJkZW4uCisKKworNikgYmVzb25kZXJlIEZ1bmt0aW9uZW4KKz09PT09PT09PT09PT09PT09PT09PT09CisKK0VzIGtvbW10IGhhZXVmaWcgdm9yLCBkYXNzIEZ1bmt0aW9uZW4gdWViZXJzY2hyaWViZW4gd2VyZGVuIG11ZXNzZW4sIHVuZCBkYXMKK2lzdCBhdWNoIG5vcm1hbGVyd2Vpc2Ugdm9sbGtvbW1lbiBub3JtYWwgdW5kIG5pY2h0IGJlYW5zdGFuZGVuc3dlcnQuIEplZG9jaAorc29sbHRlIG1hbiBiZWkgYmVzdGltbXRlbiBGdW5rdGlvbmVuIGVpbmlnZXMgQXVnZW5tZXJrIGF1ZiBkaWUga29ycmVrdGUKK0F1c2Z1ZWhydW5nIHJpY2h0ZW4uIEVpbmlnZSBCZWlzcGllbGUgc2luZCBuYWNoZm9sZ2VuZCBhdWZnZWZ1ZWhydDoKKworbyBjYXRjaF90ZWxsKCkgLyBSZWNlaXZlTXNnKCkKKyAgRGllIFJlYWt0aW9uIHZvbiBPYmpla3RlbiwgaW5zYmVzb25kZXJlIE5QQ3MsIGF1ZiBlaW5nZWhlbmRlIFRleHRtZWxkdW5nZW4KKyAgbGFlc3N0IHNpY2ggbnV0emVuLCB1bSBzY2hvZW5lIHVuZCBzdGltbXVuZ3N2b2xsZSBHZWJpZXRlIG1pdCBkeW5hbWlzY2gKKyAgcmVhZ2llcmVuZGVuIEJld29obmVybiB6dSBzY2hhZmZlbi4gRXMgbGFlc3N0IHNpY2ggYXVmIGRlciBkdW5rbGVuIFNlaXRlCisgIGRlciBNYWNodCBoaW5nZWdlbiBhdWNoIHZlcndlbmRlbiwgdW0gdWVibGUgS29uc3RydWt0ZSB6dSByZWFsaXNpZXJlbiwKKyAgZnVlciBkaWUgZXMgc2VpdCBFd2lna2VpdGVuIGdlZWlnbmV0ZSBJbXBsZW1lbnRpZXJ1bmdlbiBnaWJ0LCB1bmQgZGllCisgIGRlbXp1Zm9sZ2UgbmllbWFscyBkdXJjaCBlaW5lIEVuZGFibmFobWUgZHVyY2ggZWluZW4gUk0gZHVyY2hzY2hsdWVwZmVuCisgIGR1ZXJmZW4uIEVpbiBwYWFyIHJlYWxlIE5QQy1CZWlzcGllbGUgYXVzIGRlciBQcmF4aXM6CisKKyAgU2Nobmlwc2VsIDEpCisKKyAgaWYgKHNzY2FuZihzdHIsICIgICVzIGdyZWlmdCBkZW4gUHJpZXN0ZXIgJXMiLG5hbWUxLCBkdW1teSkgPT0gMikKKyAgeworICAgIHBsID0gZmluZF9wbGF5ZXIobG93ZXJfY2FzZShuYW1lMSkpOworICAgIGlmICghcGwgfHwgIWxpdmluZyhwbCkpCisgICAgICByZXR1cm4gMTsKKyAgICBlbHNlCisgICAgICBLaWxsKHBsKTsKKyAgfQorICBad2VjazogICAgIFNpbXVsYXRpb24gdm9uIEFkZERlZmVuZGVyKCkgdW5kIEluZm9ybURlZmVuZCgpL0RlZmVuZE90aGVyKCkKKyAgS29tbWVudGFyOiBBYnNvbHV0ZXMgTm8tR28hIE1pdCBFY2hvLUZhZWhpZ2tlaXRlbiB2b24gU3BpZWxlcm4gKEdpbGRlIG9kZXIKKyAgICAgICAgICAgICBhbmRlcndlaXRpZykgaXN0IGhpZXJtaXQgZWluIGluZGlyZWt0ZXIgUGxheWVya2lsbCBtb2VnbGljaC4KKyAgICAgICAgICAgICBJbmFremVwdGFibGUgSW1wbGVtZW50aWVydW5nLgorCisKKyAgU2Nobmlwc2VsIDIpCisKKyAgaWYgKHNzY2FuZihzdHIsICIlcyBzYWd0OiAlc1xuIiwgd2VyLHdhcykpCisgIHsKKyAgICBpZiAobG93ZXJfY2FzZSh3YXMpPT0iamEiICkKKyAgICAgIHRoaXNfcGxheWVyKCktPm1vdmUoemllbHJhdW0sIE1fVFBPUlQpOworICB9CisgIFp3ZWNrOiAgICAgQXVzbG9lc2VuIGVpbmVzIEtvbW1hbmRvcywgb2huZSAic2FnZSAuLi4iIGFscyBCZWZlaGwKKyAgICAgICAgICAgICB1ZWJlcnNjaHJlaWJlbiB6dSBtdWVzc2VuLgorICBLb21tZW50YXI6IEF1c251dHpiYXIgYWxzIFJlbW90ZS1GbHVjaHR0ZWxlcG9ydCwgaW5kZW0gbWFuIGRpZSBNZWxkdW5nCisgICAgICAgICAgICAgbWl0dGVscyB0ZWlsZS1taXQgYW4gZGVuIE5QQyBzZW5kZXQ6CisgICAgICAgICAgICAgIlJvYmVydCB0ZWlsdCBEaXIgbWl0OiBzYWd0OiBqYSIsIHdhcyB1bmdlcHJ1ZWZ0IGVpbiBtb3ZlKCkgCisgICAgICAgICAgICAgenVyIEZvbGdlIGhhdC4gT2ZmZW5zaWNodGxpY2ggZWJlbnNvIHVuZ2VlaWduZXQgd2llIGRhcyAKKyAgICAgICAgICAgICB2b3JpZ2UgQmVpc3BpZWwuCisKKworICBTY2huaXBzZWwgMykKKworICBpZiAoc3NjYW5mKGxvd2VyX2Nhc2Uoc3RyKSwiJXMgc2FndDogJXN2ZXJzdGVjayVzIixzMSxzMixzMykpCisgICAgdGVsbF9yb29tKGVudmlyb25tZW50KCksc3ByaW50ZigiRGVyIEZpc2NoIHNhZ3Q6IERhcyBpc3QgYWJlciBrZWluZSAiCisgICAgICAiZ3Jvc3NlIEhpbGZlLCAlcy5cbiIsY2FwaXRhbGl6ZShzMSkpLCh7VE99KSk7CisKKyAgc2llaHQgZXJzdG1hbCBoYXJtbG9zIGF1cywgZnVlaHJ0IGFiZXIgbWl0IGRlciBBbndlaXN1bmcKKworICBTZXRDaGF0cyg4LCAoeyAiRGVyIEZpc2NoIHNhZ3Q6IFdvIGthbm4gaWNoIG1pY2ggbnVyIHZlcnN0ZWNrZW4/In0pICk7CisKKyAgZGF6dSwgZGFzcyBkZXIgTlBDIGRhdWVybmQgbWl0IHNpY2ggc2VsYmVyIHNjaHdhdHp0LiBLZWluIGtyaXRpc2NoZXIgQnVnCisgIGltIGVpZ2VudGxpY2hlbiBTaW5uLCBhYmVyIGF1ZiBqZWRlbiBGYWxsIGRlciBBdG1vc3BoYWVyZSBpbSBHZWJpZXQKKyAgc2VociBhYnRyYWVnbGljaC4KKworbyBtb3ZlKCkKKyAgVWViZXJzY2hyZWliZW4gdm9uIG1vdmUoKSBpc3QgZWluZSBleHRyZW0gaGVpa2xlIEFuZ2VsZWdlbmhlaXQsIGJlaSBkZXIKKyAgYmVpbSBrbGVpbnN0ZW4gRmVobGVyIG1hc3NpdmUgUHJvYmxlbWUgcmVzdWx0aWVyZW4ga29lbm5lbiwgamVkb2NoIG1laXN0CisgIG5pY2h0IG9mZmVuc2ljaHRsaWNoIGlzdCwgd29oZXIgZGFzIHJlc3VsdGllcnQuIEFscyBhbGxnZW1laW5lIEVtcGZlaGx1bmcKKyAgc29sbHRlIGdlbHRlbiwgZGFzcyBtb3ZlKCkgTklFIHVlYmVyc2NocmllYmVuIHdpcmQsIHVuZCB3ZW5uLCBkYW5uIG11c3MKKyAgYXVzZnVlaHJsaWNoIHVuZCBhdWZtZXJrc2FtIGdlcHJ1ZWZ0IHdlcmRlbiwgd2FzIGRhIHBhc3NpZXJ0LCB1bmQgb2IgZGVyCisgIGdld3VlbnNjaHRlIEVmZmVrdCBuaWNodCBhbmRlcnMgc2F1YmVyZXIgZXJyZWljaHQgd2VyZGVuIGthbm4uCisgIEFscyB6dXNhZXR6bGljaGVyIEhpbndlaXMgc2VpIGF1ZiBOb3RpZnlNb3ZlKCkgdW5kIFByZXZlbnRNb3ZlKCkgdmVyd2llc2VuLAorICBtaXQgZGVyZW4gSGlsZmUgc2ljaCBkaWUgYWxsZXJtZWlzdGVuIEZhZWxsZSBlcnNjaGxhZ2VuIGxhc3NlbiwgaW4gZGVuZW4KKyAgTWFnaWVyIGZhZWxzY2hsaWNoZXJ3ZWlzZSBnbGF1YmVuLCBtb3ZlKCkgdWViZXJzY2hyZWliZW4genUgbXVlc3Nlbi4KKworbyBEZWZlbmQoKS9BdHRhY2soKQorICBoaWVyIGlzdCBlaW4gYmVsaWVidGVyIEZlaGxlciBlaW5mYWNoIGRlciwgZGFzcyBtYW4gYW0gRW5kZSBkZXIgRnVua3Rpb24KKyAgOjpEZWZlbmQoKSBiencuIDo6QXR0YWNrKCkgcnVmdCwgYWJlciBpbSBDb2RlYmxvY2sgdm9yaGVyIGRhcyBPYmpla3QKKyAgZHVyY2ggZWlnZW5lbiBUb2Qgb2RlciBhbmRlcmVzIHNjaG9uIHplcnN0b2VydCB3dXJkZS4gRGFubiBnZWh0IGRhcyBzY2hpZWYuCisgIEVpbmZhY2ggbWFsIGhpbnNjaGF1ZW4gLSBlcyBpc3QgYWJlciBrZWluIHdpcmtsaWNoIGdyYXZpZXJlbmRlciBGZWhsZXIsCisgIGRhIHNvd2FzIGltIEthbXBmIG1laXN0IHppZW1saWNoIHNjaG5lbGwgYXVmZmFlbGx0LgorCitvIGNhbGxfb3V0KCkKKyAgSGllcnp1IHp3ZWkgSGlud2Vpc2U6IHp1bSBlaW5lbiBmdWVocnQgY2FsbF9vdXQoIngiLDApIHNlaXQgZGVyIFVtc3RlbGx1bmcKKyAgYXVmIExEbXVkIGFscyBEcml2ZXIgbmljaHQgbWVociBpbXBsaXppdCB6dSBlaW5lbSBjYWxsX291dCgieCIsMSksIHdpZSBlcworICB6dXZvciB3YXIsIHNvbmRlcm4gdGF0c2FlY2hsaWNoIHp1IGVpbmVtIGZhc3Qgc29mb3J0aWdlbiBGdW5rdGlvbnNhdWZydWYgZGVyCisgIEZ1bmt0aW9uIHgoKSAtIG1pdCBhbGxlbiBLb25zZXF1ZW56ZW4sIGlua2x1c2l2ZSBlaW5lcyAidG9vIGxvbmcgZXZhbCItCisgIEJ1Z3MuIFdlciBlaW5lIGVjaHRlIFZlcnpvZWdlcnVuZyBicmF1Y2h0LCBtdXNzIG1pbmRlc3RlbnMgY2FsbF9vdXQoIngiLDEpCisgIHZlcndlbmRlbi4KKyAgWnVtIGFuZGVyZW4gd3VyZGUgbWl0IExEbXVkIGRpZSBHcmFudWxhcml0YWV0IGRlcyByZXNldCgpLUF1ZnJ1ZmVzIGF1ZgorICBIZWFydGJlYXQtR2VuYXVpZ2tlaXQgKDIgcykgdmVyZmVpbmVydCwgc28gZGFzcyBtYW4gYmVxdWVtIGxhZW5nZXJlCisgIFZlcnpvZWdlcnVuZ2VuIGF1ZiBkaWUgVmVyd2VuZHVuZyB2b24gcmVzZXQoKSB1bXN0ZWxsZW4ga2Fubi4KKworbyBaZXJzdG9lcmVuIHZvbiBPYmpla3RlbiBtaXQgcmVtb3ZlKCkgb2RlciBkZXN0cnVjdCgpCisgIE1hbiBzb2xsdGUgZWluZW4gc2VociBrcml0aXNjaGVuIEJsaWNrIGF1ZiBLb25zdHJ1a3RlIHdlcmZlbiwgZGllCisgIG5hY2ggZWluZW0gcmVtb3ZlKCkgbm9jaCB3ZWl0ZXJlbiBDb2RlIGF1c2Z1ZWhyZW4gKEF1c25haG1lOiBlY2h0ZSBlZnVucyAKKyAgdW5kIENvbXBpbGVyLUtvbnN0cnVrdGUgd2llIHJldHVybikuCisgIFdlbm4gbWFuIE9iamVrdGUgemVyc3RvZXJlbiB3aWxsIG9kZXIgbXVzcywgc29sbHRlIG1hbiBpbW1lciB6dWVyc3QgCisgIHJlbW92ZSgpIHZlcndlbmRlbi4gRGVzdHJ1Y3QgbXVzcyBkZW0gYWJzb2x1dGVuIEF1c25haG1lZmFsbCB2b3JiZWhhbHRlbiAKKyAgYmxlaWJlbi4gTWFuIHNvbGx0ZSBpbSBIaW50ZXJrb3BmIGJlaGFsdGVuLCBkYXNzIE9iamVrdGUgZ3V0ZSBHcnVlbmRlIGhhYmVuCisgIGtvZW5uZW4sIHNpY2ggZWluZW0gcmVtb3ZlKCkgenUgdmVyd2VpZ2Vybi4KKworbyBmb3IoKS1TY2hsZWlmZW4KKyAgRWlnZW50bGljaCBrZWluZSBGdW5rdGlvbiwgYWJlciBhbiBkaWVzZXIgU3RlbGxlIGRvY2ggcGFzc2VuZDoKKyAgZm9yKCktU2NobGVpZmVuIHNvbGx0ZW4gZ2VuZXJlbGwgZHVyY2ggZm9yZWFjaCgpLUtvbnN0cnVrdGlvbmVuIGVyc2V0enQKKyAgd2VyZGVuLCBkYSBkaWVzIHNpZ25pZmlrYW50IHVuZCBtZXNzYmFyIHNjaG5lbGxlciBpc3QuIERpZSBuYWVjaHN0LQorICBzY2huZWxsZXJlIFZhcmlhbnRlIHdhZXJlIGV0d2EgZm9sZ2VuZGVzLCBzb2Zlcm4gZGllIFJlaWhlbmZvbGdlIGRlcgorICBBYmFyYmVpdHVuZyB1bmVyaGVibGljaCBpc3QgKGkgaXN0IGludGVnZXIsIGFyciBpc3QgZWluIG1peGVkLUFycmF5KToKKworICBmb3IgKCBpPXNpemVvZihhcnIpOyBpLS07ICkgeworICAgIHR1X2V0d2FzX21pdChhcnJbaV0pOworICB9CisKK28gd3JpdGVfZmlsZSgpCisgIEJlbnV0enVuZyBkaWVzZXIgRnVua3Rpb24gbnVyIGluIGJlZ3J1ZW5kZXRlbiBBdXNuYWhtZWZhZWxsZW4gYWJuZWhtZW4sIGRhCisgIGtlaW5lcmxlaSBCZWdyZW56dW5nIGRlciBEYXRlaWdyb2Vzc2UgZXhpc3RpZXJ0LiBJbnNiZXNvbmRlcmUgYmVpIExvZ2ZpbGVzCisgIGVudHN0ZWhlbiBoaWVyZHVyY2ggaW0gTGF1ZmUgZGVyIFplaXQgTW9uc3RlcmRhdGVpZW4sIGRpZSBudXIgUGxhdHRlbnBsYXR6CisgIHZlcmJyYXVjaGVuLCBhYmVyIGthdW0genUgdWViZXJzY2hhdWVuIHNpbmQuIFN0YXR0IHdyaXRlX2ZpbGUoKSB3aXJkIGluCisgIGRlbiBhbGxlcm1laXN0ZW4gRmFlbGxlbiBsb2dfZmlsZSgpIG1pdCBkZXIgU3RhbmRhcmRncm9lc3NlIHZvbiA1MCBrQiBmdWVyCisgIExvZ2ZpbGUgdW5kIGVpbmUgZ2dmLiB2b3JoYW5kZW5lIEFsdHZlcnNpb24gKCouT0xEKSBhdXNyZWljaGVuZCBzZWluLgorCitvIFZlcndhbHRlbiB2b24gY2hhcmFrdGVyYmV6b2dlbmVuIERhdGVuCisgIEFscyBCZWlzcGllbCBzZWllbiBoaWVyIFN0YXR1c2RhdGVuIGZ1ZXIgZGVuIEFibGF1ZiB2b24gUXVlc3RzIGdlbmFubnQsCisgIG9kZXIgSGlnaHNjb3JlcyBpbiBpcmdlbmR3ZWxjaGVuIFRvcGxpc3Rlbi4gRnVlciBkaWUgVW1zZXR6dW5nIGRpZXNlcgorICBEYXRlbmVyZmFzc3VuZyB3ZXJkZW4gdHlwaXNjaGVyd2Vpc2UgendlaSBUZWNobmlrZW4gZWluZ2VzZXR6dC4gWnVtCisgIGVpbmVuIGthbm4gZWluIE1hc3Rlcm9iamVrdCBlcnN0ZWxsdCB3ZXJkZW4sIGRhcyBkaWUgRGF0ZW4gc2FtbWVsdCB1bmQKKyAgbWl0dGVscyBzYXZlX29iamVjdCgpIGRhdWVyaGFmdCBzcGVpY2hlcnQuIFp1bSBhbmRlcmVuIGthbm4gbWFuIGF1Y2gKKyAgRGF0ZW4gaW4gZWluZXIgUHJvcGVydHkgaW0gU3BpZWxlciBhYmxlZ2VuIHVuZCBkaWVzZSBqZSBuYWNoIEFud2VuZHVuZ3MtCisgIGZhbGwgYXVmIFNBVkUgc2V0emVuLgorCisgIEJlaSBkZXIgZXJzdGVuIFZhcmlhbnRlIHdpcmQgbWFuIHVlYmxpY2hlcndlaXNlIGRpZSBVSUQgb2RlciBVVUlEIGRlcyAKKyAgU3BpZWxlcnMgYWxzIEluZGl6aWVydW5nc21lcmttYWwgdmVyd2VuZGVuLiBEZXIgZXJzdGUgRmFsbHN0cmljayBpc3QgbnVuLAorICBkYXNzIGRpZSBVSUQgYmVpIFNwaWVsZXJuIChuaWNodCBTZWhlcm4pIGdnZi4gbmFjaCBlaW5lciBTZWxic3Rsb2VzY2h1bmcKKyAgbmV1IHZlcmdlYmVuIHdlcmRlbiBrYW5uLCBzbyBkYXNzIGRpZSBEYXRlbiBpbmtvbnNpc3RlbnQgd2VyZGVuIGJ6dy4gZGVyCisgIFNwaWVsZXIgc2NoZWluYmFyIHNjaG9uIGluIEV1cmVtIE1hc3RlciBlaW5nZXRyYWdlbiBpc3QsIG9id29obCBlcyBzaWNoCisgIGVpZ2VudGxpY2ggdW0gamVtYW5kIGdhbnogYW5kZXJlcyBoYW5kZWx0LgorICBBbHMgQWJoaWxmZW1hc3NuYWhtZSBiaWV0ZXQgc2ljaCBmb2xnZW5kZXMgYW46IAorICBhKSBVVUlEIHZlcndlbmRlbiwgZGEgZGllc2UgZnVlciBqZWRlbiBTcGllbGVyIGVpbmRldXRpZyBpc3QuCisgIGIpIEhpbndlaXM6IGZpbmRfcGxheWVyKCkga2FubiBhdWNoIG1pdCBVVUlEcyB1bWdlaGVuIHVuZCBkYXMgenVnZWhvZXJpZ2UKKyAgICAgU3BpZWxlcm9iamVrdCBlcm1pdHRlbG4uCisgIGMpIE1hbiBzb2xsdGUgZ2dmLiBhdWYgZGFzIE11ZGxpYi1FdmVudCBFVlRfTElCX1BMQVlFUl9ERUxFVElPTiBsYXVzY2hlbiwgCisgICAgIHVtIFNwaWVsZXIgYXVzenV0cmFnZW4sIGRpZSBzaWNoIGxvZXNjaGVuLCB3b2R1cmNoIGRpZSB6dWdlaG9lcmlnZW4KKyAgICAgRGF0ZW4gb2Jzb2xldCB3ZXJkZW4uCisKKyAgQmVpIGRlciB6d2VpdGVuIFZhcmlhbnRlIG11c3MgbWFuIHZlcnNjaGllZGVuZSBEaW5nZSBiZXJ1ZWNrc2ljaHRpZ2VuOgorICBhKSBuaWNodCBlbmRsb3MgdmllbGUgUHJvcGVydGllcyBtYWNoZW4sIHNvbmRlcm4gcHJvIFRoZW1hICh6LkIuIFF1ZXN0KQorICAgICBlaW5mYWNoIGVpbmUuCisgIGIpIG51ciBkaWUgUHJvcGVydGllcyBzcGVpY2hlcm4sIGJlaSBkZW5lbiBkYXMgd2lya2xpY2ggbm9ldGlnIGlzdC4KKyAgYykgU3BlaWNoZXJ0IG1hbiBQcm9wZXJ0aWVzIHVuZCBkaWUgQXVmZ2FiZSB3aXJkIGVybGVkaWd0LCBkLmguIGRlciAKKyAgICAgSW5oYWx0IGRlciBQcm9wZXJ0eSBvYnNvbGV0LCBtdXNzIGRpZSBQcm9wZXJ0eSB3aWVkZXIgZ2Vsb2VzY2h0IHdlcmRlbi4KZGlmZiAtLWdpdCBhL2RvYy93aXovcnVlc3R1bmdlbiBiL2RvYy93aXovcnVlc3R1bmdlbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yzc0MjViCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dpei9ydWVzdHVuZ2VuCkBAIC0wLDAgKzEsMjEyIEBACisgUlVlU1RVTkdFTjoKKyAgICAgYS4gQWxsZ2VtZWluZXMKKworCUF1Y2ggaGllciBnZWx0ZW4gZGllIGFrdHVlbGxlbiBHZW5laG1pZ3VuZ3NncmVuendlcnRlLiBBbGxlcywgd2FzCisJZGllc2UgQUMtR3Jlbnp3ZXJ0ZSB1ZWJlcnN0ZWlndCwgaXN0IHByaW56aXBpZWxsIAorCWdlbmVobWlndW5nc3BmbGljaHRpZy4gRGllIFJNcyBzaW5kIGdlZm9yZGVydCwgZnVlciBlaW5lIGF1c2dld29nZW5lCisJQmVzdHVlY2t1bmcgZGVyIFJ1ZXN0dW5nZW4gaW4gaWhyZW0gR2ViaWV0IHp1IHNvcmdlbi4gTmljaHQgbnVyIGRpZQorCW9iZXJlbiBTY2h1dHp3ZXJ0ZSBnaWx0IGVzIGFienVkZWNrZW4sIGF1Y2ggZGllIHdlbmlnZXIgZ3V0ZW4gCisJUnVlc3R1bmdlbiBzb2xsdGUgZXMgZ2ViZW4uCisKKwlBbHMgUmljaHR3ZXJ0IHNvbGx0ZSBnZWx0ZW46IEVpbmUgZ3V0ZSBMZWRlcnJ1ZXN0dW5nIGhhdCBjYS4gQUMgMjAsIAorCWVpbmUgc3RhYmlsZSBKZWFucyBldHdhIEFDIDUsIGVpbmUgZ2VoYWVydGV0ZSBMZWRlcmthcHBlIEFDIDUuIE51ciAKKwlzbyBhbHMgSWRlZS4uLgorCisJQmVzb25kZXJzIGV4aXN0aWVyZW5kZSBSdWVzdHVuZ2VuIHdpZSBkZXIgTGljaHRwYW56ZXIgZXRjLiBzaW5kIAorCWRlZmluaXRpdiB6dSBndXQsIGJ6dy4gZXIgaXN0IGZ1ZXIgZWluZSBzbyBsZWljaHQgZXJyZWljaGJhcmUgCisJUnVlc3R1bmcgenUgZ3V0LiBIaWVyIHNvbGx0ZW4gZGllIFJNcyB2ZXJzdGFlcmt0IGRhcmF1ZiBhY2h0ZW4sIGRhc3MgCisJbmljaHQgdW5iZWRpbmd0IGRlciBEdXJjaHNjaG5pdHQgZGVyIEFDcyBiZWkgNC81IGRlciBNYXgtQUMgbGllZ3QsIAorCXNvbmRlcm4gZGFzcyBhdWNoIGhpZXIgYXVmIGVpbmUgUnVlc3R1bmcgbWl0IGhvaGVyIEFDIHZpZWxlIG1pdCAKKwluaWVkcmlnZXJlciBBQyBrb21tZW4uCisKKwlSdWVzdHVuZ2VuIHZvbSBUeXAgQVRfTUlTQyBkdWVyZmVuIGtlaW5lcmxlaSBWZXJhZW5kZXJ1bmdlbiBpbSAKKwlTcGllbGVyIHZlcnVyc2FjaGVuLCBrZWluZSBBdHRyaWJ1dGUgdmVyYWVuZGVybiBub2NoIHNvbnN0d2llIAorCWthbXBmcmVsZXZhbnRlIEJlZGV1dHVuZyBiZXNpdHplbiBvZGVyIFNwaWVsZXIvR2VnbmVyIG1hbmlwdWxpZXJlbi4gCisJRGllIEFDIHNvbGNoZXIgUnVlc3R1bmdlbiBpc3QgaW1tZXIgMCB1bmQgd2lyZCBuaWNodCBhbmRlcnMgZ2UtCisJbmVobWlndC4gV2VpdGVyIGR1ZXJmZW4gc29sY2hlIFJ1ZXN0dW5nZW4gbmljaHQgdWViZXIgZWluZSBIaXQtCisJdW5kL29kZXIgRGVmZW5kRnVuYyB2ZXJmdWVnZW4uCisKKyAgICAgYi4gUHJvcGVydGllcworCisgICAgICBQX1dFSUdIVAorCUJpdHRlIHJlYWxpc3Rpc2NoIGhhbHRlbi4gUmluZ2UgbWl0IHdlaXQgdWViZXIgMTAwIEdyYW1tIHNpbmQgCisJU2Nod2FjaHNpbm4sIGViZW5zbyBIb3NlbiBtaXQgR2V3aWNodGVuIHVudGVyIDIwMCB1c3cuCisgIChCVFc6IFNwaWVsZXIga29lbm5lbiBiZWkgTWF4LVN0YWVya2UgKDMwKSAzMzIwMCBnciB6emdsLiBldHdhaWdlCisgICBUcmFnZXNraWxscyBkZXIgR2lsZGUgdHJhZ2VuLikKKworICAgICAgUF9WQUxVRQorCVdlcnQgZGVyIFJ1ZXN0dW5nZW4gc29sbHRlIGF1Y2ggbmljaHQgenUgZ3Jvc3Mgc2VpbiB1bmQgc2ljaCBlaW4gCisJd2VuaWcgYW4gZGVyIEFDIG9yaWVudGllcmVuLiBFYmVuZmFsbHM6IFJNcywgc2NoYXV0IGdlbmF1IGhpbi4KKworICAgICAgUF9BUk1PVVJfVFlQRQorCUJpdHRlIHNpbm52b2xsIGJlbnV0emVuISBLbGVpZGVyIGFscyBIb3NlbiBkZWZpbmllcmVuIG9kZXIgCisJYWVobmxpY2hlcyBpc3QgdW5zaW5uaWcgdW5kIHNvbGx0ZSBuaWNodCBnZW5laG1pZ3Qgd2VyZGVuLiBTaW5kIG1hbCAKKwl3aWVkZXIgZGllIFJNcyBmdWVyIHp1c3RhZW5kaWcuIEJpdHRlIGFjaHRldCBkcmF1ZiEKKworCUZvbGdlbmRlIFJ1ZXN0dW5nc3R5cGVuIHNpbmQgbW9lZ2xpY2g6CisKKwlBVF9BUk1PVVIKKwkJQWxsZXMgd2FzIGlyZ2VuZHdpZSBkZW4gVG9yc28gc2NodWV0enQuIEFsc28gdm9ybiB1bmQgCisJCWhpbnRlbiwgd2llIGVpbiBQdWxsb3ZlciwgZWluIEtldHRlbmhlbWQsIGVpbiBQYW56ZXIgZXRjLgorCUFUX0NMT0FLCisJCVVtaGFlbmdlLCBhdWNoIGltIHdlaXRlcmVuIFNpbm4gd2llIERlY2tlbiB1bmQgU2NobGVpZXIuIEltIAorCQlQcmluemlwIGRhcywgd2FzIG5vcm1hbGVyd2Vpc2UgbnVyIGRlbiBSdWVja2VuIHNjaHVldHp0LCBiZWkgCisJCUJlZGFyZiBhYmVyIGF1Y2ggdm9ybiBoZXJ1bSBnZXdpY2tlbHQgd2VyZGVuIGtvZW5udGUuCisJQVRfSEVMTUVUCisJCUtvcGZiZWRlY2t1bmdlbiBqZWRlciBBcnQsIHZvbSBub3JtYWxlbiBIdXQgdWViZXIgS3JvbmVuIGJpcyAKKwkJaGluIHp1IFN0aXJuYmFlbmRlcm4gKHdlbm4gc2llIHNjaHVldHplbiBzb2xsZW4pCisJQVRfVFJPVVNFUlMKKwkJSG9zZW4uIEFsbGVzIHdhcyB6dW0gdWViZXJ3aWVnZW5kZW4gVGVpbCBkYXp1IGdlZGFjaHQgaXN0LCAKKwkJZGllIEJlaW5lIHVuZC9vZGVyIGRlbiBQb3BvIHp1IHNjaHVldHplbiwgYWxzbyBhdWNoIAorCQlTY2h1ZXJ6ZW4gb2RlciBMZWdnaW5zLiBOYXR1ZXJsaWNoIGdlaG9lcmVuIGF1Y2ggQmFkZWhvc2VuIAorCQlvZGVyIExlbmRlbnNjaHVlcnplIGhpZXJoZXIuIEFDIGRhbm4gc2VsYnN0dmVyc3RhZW5kbGljaCAKKwkJZ2VyaW5nLgorCUFUX0JPT1QKKwkJU2NodWhlLCBTdGllZmVsIHVuZCBGdXNzYmVrbGVpZHVuZ2VuIGplZGVyIEFydC4KKwlBVF9HTE9WRQorCQlIYW5kc2NodWhlIG9kZXIgYWxsZXMsIHdhcyBtYW4gc28genVtIFNjaHV0eiBkZXIgb2JlcmVuIAorCQlFeHRyZW1pdGFldGVuIGJlbnV0enQsIHdpZSBBcm1zY2hvbmVyLCBHbGFjZWhhbmRzY2h1aGUsIAorCQlGYWV1c3RsaW5nZSwgQm94aGFuZHNjaHVoZSBldGMuCisJQVRfUVVJVkVSCisJCUtvZWNoZXIgdW5kIGFlaG5saWNoZXMsIGluIGRlbmVuIG1hbiBNdW5pdGlvbiBmdWVyIAorCQlTY2h1c3N3YWZmZW4gdW50ZXJicmluZ2VuIGthbm4uIFNjaHVldHplbiB0dXQgc293YXMgCisJCW5hdHVlcmxpY2ggbmljaHQuCisJQVRfU0hJRUxECisJCUFsbGVzLCB3YXMgbWFuIHNvIGFuc3RlbGxlIGRlciBlaWdlbmVuIEFybWUgaW4gZWluZW4gCisJCWdlZ25lcmlzY2hlbiBTY2hsYWcgaGFsdGVuIGthbm4gdW5kIGRhcyBuaWNodCBvZmZpemllbGwgYWxzIAorCQlXYWZmZSBkZWtsYXJpZXJ0IGlzdC4gRXMgc29sbHRlIG5pY2h0IGdyYWRlIGF1cyBQYXBpZXIgCisJCWJlc3RlaGVuLCB1bmQgZGFzIEdld2ljaHQgaXN0IG1pdCBlbnRzY2hlaWRlbmQgZnVlciBkaWUgCisJCUd1ZXRlIGRlcyBTY2hpbGRlcy4gU2llIHdlcmRlbiBzZWhyIHdlbmlnIGltIE1HIGdlbnV0enQsIHdhcyAKKwkJZWlnZW50bGljaCBzZWx0c2FtIGlzdC4gU2NobGllc3NsaWNoIGVycmVpY2h0IGVpbiBndXRlciAKKwkJU2NoaWxkIGRpZSBHdWV0ZSB2b24gSGVsbSwgSG9zZSB1bmQgSGFuZHNjaHVoZW4genVzYW1tZW4gCisJCW9kZXIgMy80IGRlciBRdWFsaXRhZXQgZWluZXIgUnVlc3R1bmcuIEFuZGVyZXJzZWl0czogZXMgZ2lidCAKKwkJYXVjaCBuaWNodCBzZWhyIHZpZWxlIFNjaGlsZGUuIERhIGhlcnJzY2h0IEJlZGFyZiEKKwlBVF9SSU5HCisJCVJpbmdlLiBQcmluemlwaWVsbCBzb2xsdGUgZ2VsdGVuLCBkYXMgUmluZ2UgcHJha3Rpc2NoIGtlaW5lIAorCQlTY2h1dHp3aXJrdW5nIGhhYmVuIChhbHNvIEFDIDEgb2RlciBtYXguIDIpLiBOdXIsIHVuZCBkYWZ1ZXIgCisJCXNpbmQgZGllIERpbmdlciBkYSwgd2VubiBzaWUgbWFnaXNjaCBzaW5kIGtvZW5uZW4gc2llIAorCQl6dXNhZXR6bGljaGUgRnVua3Rpb25lbiBoYWJlbi4KKwlBVF9BTVVMRVQKKwkJSW0gUHJpbnppcCBkYXNzZWxiZSB3aWUgYmVpIEFUX1JJTkcsIG51ciB3ZXJkZW4gZGllIERpbmdlciAKKwkJbWVpc3QgYW4gS29yZGVsbiB1bSBkZW4gSGFscyBvZGVyIGFscyBCcm9zY2hlbiBhbiBkZW4gCisJCUtsYW1vdHRlbiBnZXRyYWdlbiwga29lbm50ZW4gYWxzbyBqZSBuYWNoIEdyb2Vzc2UgCisJCXRhdHNhZWNobGljaCBtZWhyIFNjaHV0eiBiaWV0ZW4gYWxzIGVpbiBSaW5nLiBBYmVyIGF1Y2ggaGllciAKKwkJZ2lsdDogQUM+MiBzY2hyZWl0IG5hY2ggRXJrbGFlcnVuZyB1bmQgc29sbHRlIG1hZ2lzY2hlbiAKKwkJRGluZ2VybiB2b3JiZWhhbHRlbiBibGVpYmVuLgorCUFUX0JFTFQKKwkJR3VlcnRlbCBhbGxlciBBcnQgKHouQi4gV2FmZmVuZ3VlcnRlbCBvZGVyIE1hZ2lzdGVyZ3VlcnRlbCAKKwkJZGVyIFphdWJlcmVyKS4gU2NodXR6d2lya3VuZyBoYXQgc293YXMgbmF0dWVybGljaCBrYXVtLgorCUFUX01JU0MKKwkJQWxsZXMsIHdhcyBtYW4gc29uc3Qgbm9jaCBzbyBhbnppZWhlbiBrYW5uLCB3YXMgYWJlciBlaGVyIAorCQlhbHMgWmllcnJhdCBnZWRhY2h0IGlzdC4gQUMgaW1tZXIgMC4gQml0dGUgKmtlaW5lKiAKKwkJS2xlaWR1bmdzc3R1ZWNrZSwgZGllIGluIGVpbmUgZGVyIGFuZGVyZW4gS2F0ZWdvcmllbiBwYXNzZW4sIAorCQlhbHMgQVRfTUlTQyBkZWZpbmllcmVuLiBEYW5uIGxpZWJlciBkaWUgQUMgc2VociB0aWVmLiBXZW5uIAorCQllcyBlaCBhbHMgR2FnIGdlZGFjaHQgaXN0IGtvZW5uZW4gZGllIFNwaWVsZXIgc2ljaCBhdWNoIGJlaSAKKwkJQmVkYXJmIHVtemllaGVuLgorCQlTb2xjaGUgUnVlc3R1bmdlbiBkdWVyZmVuIGtlaW5lcmxlaSAoISkgQmVkZXV0dW5nIGltIEthbXBmIAorCQlmdWVyIGRlbiBTcGllbGVyIGhhYmVuLiBLZWluZXJsZWkgVmVyYWVuZGVydW5nZW4gaW0vYW4gCisJCVNwaWVsZXIvR2VnbmVyIHZlcnVyc2FjaGVuIG9kZXIgYWVobmxpY2hlcy4KKworICAgICAgUF9BQworCXNpZWhlIFRhYmVsbGUgd2VpdGVyIHVudGVuCisKKyAgICAgIFBfRUZGRUNUSVZFX0FDCisJRmFsbHMgZWluZSBEZWZlbmRGdW5jIHZvcmhhbmRlbiBpc3QgdW5kIGRpZSByZWd1bGFlcmUgQUMgdmVyYWVuZGVydCwgCisJc29sbHRlIHNpZSBnZXNldHp0IHdlcmRlbi4gRXMgd2lyZCBkZXIgRHVyY2hzY2huaXR0c3dlcnQgZGVyIEFDIAorCWluY2wuIGRlciBEZWZlbmRGdW5jIGdlc2V0enQuIERpZW50IGRlciBLYWVtcGZlcmdpbGRlIHp1ciAKKwlFaW5zY2hhZXR6dW5nLgorCisgICAgICBQX0RBTV9UWVBFCisJQXVjaCBSdWVzdHVuZ2VuIGtvZW5uZW4gZWluZW4gRGFtYWdlLVR5cCBoYWJlbi4gTnV0emVuIHR1dCBkYXMgCisJYmlzaGVyIG51ciBkaWUgS2FlbXBmZXJnaWxkZSwgYWJlciBzY2hhZGVuIHR1dCdzIGtlaW5lbS4gRGVmYXVsdCBpc3QgCisJRFRfQkxVREdFT04uCisKKyAgICAgIFBfTk9CVVkKKwlBbGxlIFJ1ZXN0dW5nZW4gYWIgMi8zIGRlciBtYXhpbWFsIGZ1ZXIgZGVuIGpld2VpbGlnZW4gUnVlc3R1bmdzdHlwIAorCXp1bGFlc3NpZ2VuIEFDIHdlcmRlbiBiZWltIFZlcmthdWYgaW0gTGFkZW4gZWluYmVoYWx0ZW4uIERlbm5vY2ggCisJc29sbHRlbiBiZXNvbmRlcmUgUnVlc3R1bmdlbiBQX05PQlVZIGdlc2V0enQgaGFiZW4uIEluc2Jlc29uZGVyZSAKKwl3YWVyZSBkYXMgZnVlciBhbGxlcyBtaXQgRGVmZW5kRnVuY3MgenUgd3VlbnNjaGVuLCBhYmVyIGF1Y2ggU2FjaGVuLCAKKwlkaWUgYWxzIEdhZyBnZWRhY2h0IHNpbmQuIERhZnVlciBrb2VubmVuIHNpY2ggZGllIFNwaWVsZXIgcnVoaWcgCisJZXR3YXMgcmVja2VuLgorCisgICAgYy4gU3BlemlhbHJ1ZXN0dW5nZW4vUnVlc3R1bmdlbiBtaXQgU29uZGVyZnVua3Rpb24KKworCUFsbGUgUnVlc3R1bmdlbiwgZGllIHVlYmVyIGVpbmUgRGVmZW5kRnVuYyBvZGVyIGFlaG5saWNoZXMgdmVyZnVlZ2VuIAorCXNpbmQgZ2VuZWhtaWd1bmdzcGZsaWNodGlnLgorCisJUHJpbnppcGllbGwgc29sbHRlbiBkaWUgZ2VsdGVuZGVuIEdyZW56d2VydGUgKHMudS4pIG5pY2h0IAorCXVlYmVyc2Nocml0dGVuIHdlcmRlbjsgQXVzbmFobWVuIGtvZW5uZW4gdW50ZXIgVW1zdGFlbmRlbiBnZW5laG1pZ3QgCisJd2VyZGVuLiBJbW1lciBpc3QgZGVyIFJldHVybi1XZXJ0IHBlciByYW5kb20oKSB6dXJ1ZWNrenVsaWVmZXJuLCBkYSAKKwlkZXIgV2VydCBvaG5lIHdlaXRlcmVzIHJhbmRvbSgpIGF1ZmFkZGllcnQgd2lyZC4KKworCVdlYXJGdW5jcywgZGllIFJlc3RyaWt0aW9uZW4gdm9yc2VoZW4gKEdlc2NobGVjaHRzYWJoYWVuZ2lna2VpdCwKKwlSYXNzZW4tIG9kZXIgR2lsZGVucmVzdHJpa3Rpb25lbikgc29sbHRlbiBkaWUgUk1zIHVlYmVycHJ1ZWZlbi4KKworCVNhZW10bGljaGUgU29uZGVyZnVua3Rpb25lbiwgd2llIEhlaWx1bmdlbiwgU29uZGVyYXR0YWNrZW4gYXVmIAorCUdlZ25lciwgV2FmZmVuYmVzY2hhZWRpZ3VuZ2VuIGV0Yy4gbXVlc3NlbiBnZW5laG1pZ3Qgd2VyZGVuLgorCisgIERpZSBQcm9wZXJ0aWVzLCBtaXQgZGVuZW4gSGFuZHNjaHVoZSAnaGFuZGZyZWknIGJ6dyAnZmluZ2VyZnJlaScgZ2VtYWNodAorICB3ZXJkZW4sIGR1ZXJmZW4gbnVyIHZlcmdlYmVuIHdlcmRlbiwgd2VubiBkaWUgSGFuZHNjaHVoZSBkZW4gU2NoYWRlbiBkZXIgSGFuZAorICBuaWNodCB2ZXJhZW5kZXJuIHVuZCBkaWUgQmVzY2hyZWlidW5nIGRlciBIYW5kc2NodWhlIGRhenUgcGFzc3QuCisKKworICAgIGQuIEFDLSB1bmQgR2VuZWhtaWd1bmdzZ3JlbnplbgorCisJRm9sZ2VuZGUgR3Jlbnp3ZXJ0ZSBnZWx0ZW4gZGVyemVpdDoKKworCSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCXwgUnVlc3R1bmdzdHlwIHwgTUFYX0FDIHwgR2VuZWhtaWd1bmdzZ3JlbnplIChpbmtsLikgfAorCSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCXwgQVRfQU1VTEVUICAgIHwgICAgMiAgIHwJICAgICAgLS0JICAgICB8CisJKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJfCBBVF9BUk1PVVIgICAgfCAgIDUwICAgfAkgICAgICAzOAkgICAgIHwKKwkrLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwl8IEFUX0JFTFQgICAgICB8ICAgIDIgICB8CSAgICAgIC0tCSAgICAgfAorCSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCXwgQVRfQk9PVCAgICAgIHwgICAgNiAgIHwJCTUJICAgICB8CisJKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJfCBBVF9DTE9BSyAgICAgfCAgIDEwICAgfAkJOAkgICAgIHwKKwkrLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwl8IEFUX0dMT1ZFICAgICB8ICAgIDUgICB8CQk1CSAgICAgfAorCSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCXwgQVRfSEVMTUVUICAgIHwgICAxNSAgIHwJICAgICAgMTMJICAgICB8CisJKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJfCBBVF9RVUlWRVIgICAgfCAgICAwICAgfAkgICAgICAtLQkgICAgIHwKKwkrLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwl8IEFUX1JJTkcgICAgICB8ICAgIDIgICB8CSAgICAgIC0tCSAgICAgfAorCSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCXwgQVRfU0hJRUxEICAgIHwgICA0MCAgIHwJICAgICAgMjgJICAgICB8CisJKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJfCBBVF9UUk9VU0VSUyAgfCAgIDE1ICAgfAkgICAgICAxMwkgICAgIHwKKwkrLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkrLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwl8IEFUX01JU0MgICAgICB8ICAgIDAgICB8CSAgICAgIC0tCSAgICAgfAorCSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCisgICAgIGUuIFJ1ZXN0dW5nZW4gZnVlciBaYXViZXJlcgorCisJWmF1YmVyZXIgd2VyZGVuIG5vcm1hbGVyd2Vpc2UgZHVyY2ggUnVlc3R1bmdlbiBiZWhpbmRlcnQuIEdpYnQgbWFuIAorCWRlciBSdWVzdHVuZyBqZWRvY2ggZGllIGluIGAvcC96YXViZXJlci96YXViZXJlci5oJyBkZWZpbmllcnRlIElEIAorCUdJTERFTl9ST0JFTl9JRCwgYmVoaW5kZXJ0IGRpZSBSdWVzdHVuZyBaYXViZXJlciBuaWNodCBtZWhyLiBEYXMgCisJU2V0emVuIGRpZXNlciBJRCBpc3QgYXVmIGplZGVuIEZhbGwgbWl0IGRlbSBDaGVmIGRlciBaYXViZXJlcmdpbGRlIAorCWFienVrbGFlcmVuIHNvd2llIG1pdCBkZXIgT2JqZWt0YmFsYW5jZSEKKworCVphdWJlcmVycnVlc3R1bmdlbiBrb2VubmVuIGF1c3NlcmRlbSBiZXN0aW1tdGUgWmF1YmVyc3BydWVjaGUgCisJdW50ZXJzdHVldHplbiwgbmFlaGVyZXMgZGF6dSBlYmVuZmFsbHMgYmVpbSBaYXViZXJlcmdpbGRlbmNoZWYgc293aWUgCisJYmVpIGRlciBPYmpla3RiYWxhbmNlLgorCisgICAgIGYuIFJ1ZXN0dW5nZW4gbWl0IHNvbnN0aWdlbiBHaWxkZW5mYWVoaWdrZWl0ZW4KKworCVJ1ZXN0dW5nZW4sIGRpZSBpbiBpcmdlbmQgZWluZXIgV2Vpc2UgZGllIEZhZWhpZ2tlaXRlbiBkZXIgR2lsZGVuIAorCXNwZXppZmlzY2ggdmVyYWVuZGVybiAoenVtIEJlaXNwaWVsIGRpZSBTY2hhZGVuc2FydCBkZXIgS2FyYXRla2FzIAorCW9kZXIgZGVzIGFrc2hhcmEgZGVyIFRhbmppYW4gdmVyYWVuZGVybikgc2luZCBhdWYgamVkZW4gRmFsbCBtaXQgZGVuIAorCUdpbGRlbmNoZWZzIGRlciBqZXdlaWxpZ2VuIEdpbGRlIHNvd2llIG1pdCBkZXIgT2JqZWt0YmFsYW5jZSAKKwlhYnp1c3ByZWNoZW4uCisKKyBTSUVIRSBBVUNIOgorICAgICBiYWxhbmNlLCB3YWZmZW4sIGZlcm53YWZmZW4sIHVuaXF1ZXMsIG5wY3MsIGdyZW56d2VydGUsCisgICAgIGF0dHJpYnV0c3ZlcmFlbmRlcnVuZ2VuLCByZXNpc3Rlbnplbiwga2FtcGZvYmpla3RlCisKKyBMRVRaVEUgQWVOREVSVU5HOgorICAxOC4xMC4yMDEwLCBaZXNzdHJhCisKZGlmZiAtLWdpdCBhL2RvYy93aXovc2NoYWRlbnN0eXBlbiBiL2RvYy93aXovc2NoYWRlbnN0eXBlbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGYwOTA5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dpei9zY2hhZGVuc3R5cGVuCkBAIC0wLDAgKzEsNDcgQEAKK1NjaGFkZW5zdHlwZW46CisKK0VzIHdlcmRlbiB6d2VpIEFydGVuIHZvbiBTY2hhZGVuc3R5cGVuIHVudGVyc2NoaWVkZW46CisKK2EpIHBoeXNpa2FsaXNjaGUgU2NoYWRlbnN0eXBlbgorCisgICBEVF9CTFVER0VPTiAgICAgIFNjaGxhZ3NjaGFkZW4sIHouQi4gS2V1bGVuCisgICBEVF9FWFBMT1NJT04gICAgIFNjaGFkZW4gZHVyY2ggZWluZSBFeHBsb3Npb24KKyAgIERUX1BJRVJDRSAgICAgICAgU3RlY2hzY2hhZGVuLCB6LkIuIExhbnplbgorICAgRFRfUklQICAgICAgICAgICBSZWlzc2VuZGVyIFNjaGFkZSwgei5CLiBLcmFsbGVuCisgICBEVF9TTEFTSCAgICAgICAgIFNjaG5pdHRzY2hhZGVuLCB6LkIuIFNjaHdlcnRlcgorICAgRFRfU1FVRUVaRSAgICAgICBRdWV0c2Noc2NoYWRlbiwgei5CLiBUZW50YWtlbAorICAgRFRfV0hJUCAgICAgICAgICBQZWl0c2NoZW5zY2hhZGVuLCB6LkIuIFBlaXRzY2hlbgorCisgICBBbGxlIHBoeXNpa2FsaXNjaGVuIFNjaGFkZW5zdHlwZW4gc3RlaGVuIGF1Y2ggaW4gZGVtIE1hcHBpbmcKKyAgIFBIWVNJQ0FMX0RBTUFHRV9UWVBFUy4KKworYikgbWFnaXNjaGUgU2NoYWRlbnN0eXBlbgorCisgICBEVF9BQ0lEICAgICAgICAgIFNhZXVyZXNjaGFkZW4KKyAgIERUX0FJUiAgICAgICAgICAgTHVmdChtYW5nZWwpc2NoYWRlbgorICAgRFRfQ09MRCAgICAgICAgICBLYWVsdGVzY2hhZGVuCisgICBEVF9GSVJFICAgICAgICAgIEZldWVyc2NoYWRlbgorICAgRFRfSE9MWSAgICAgICAgICBIZWlsaWdlciBTY2hhZGVuCisgICBEVF9MSUdIVE5JTkcgICAgIEJsaXR6c2NoYWRlbgorICAgRFRfTUFHSUMgICAgICAgICBHZW5lcmVsbGVyIG1hZ2lzY2hlciBTY2hhZGVuCisgICBEVF9QT0lTT04gICAgICAgIEdpZnRzY2hhZGVuCisgICBEVF9TT1VORCAgICAgICAgIExhZXJtc2NoYWRlbgorICAgRFRfVEVSUk9SICAgICAgICBBbmdzdHNjaGFkZW4KKyAgIERUX1VOSE9MWSAgICAgICAgVW5oZWlsaWdlci9kYWVtb25pc2NoZXIgU2NoYWRlbgorICAgRFRfV0FURVIgICAgICAgICBXYXNzZXJzY2hhZGVuCisKKyAgIEFsbGUgbWFnaXNjaGVuIFNjaGFkZW5zdHlwZW4gc3RlaGVuIGF1Y2ggaW4gZGVtIE1hcHBpbmcKKyAgIE1BR0lDQUxfREFNQUdFX1RZUEVTLgorCitFaW5lIExpc3RlIGFsbGVyIGRlZmluaWVydGVuIFNjaGFkZW5zdHlwZW4gc3RlaHQgYXVzc2VyZGVtIGluIGRlbQorQXJyYXkgQUxMX0RBTUFHRV9UWVBFUy4KKworQWxsZSBTY2hhZGVuc3R5cGVuIHVuZCB6dXNhbW1lbmdlZmFzc3RlIEdydXBwZW4gc2luZCBkZWZpbmllcnQgaW4KKzxjb21iYXQuaD4KKworV2FmZmVuIGR1ZXJmZW4gbWF4aW1hbCA1MCUgbWFnLiBTY2hhZGVuIG1hY2hlbi4gRGllIFN1bW1lIGRlciBtYWcuCitTY2hhZWRlbiBkYXJmIG1heGltYWwgNjYlIGJldHJhZ2VuLiBFcyBfbXVzc18gaW1tZXIgbWluZC4gZWluIHBoeS4KK1NjaGFkZW4gZ2VzZXR6dCBzZWluLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBNaXQsIDAzLjAxIDEyOjAwOjU0IDIwMDIgdm9uIFRpbGx5CmRpZmYgLS1naXQgYS9kb2Mvd2l6L3NjaGVpZHVuZyBiL2RvYy93aXovc2NoZWlkdW5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NGM1ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd2l6L3NjaGVpZHVuZwpAQCAtMCwwICsxLDk1IEBACisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZWlkdW5nIGVpbmVyIE1HLUVoZQorICAgICAgICAgICAgICAgICAgICAgICAgICA9PT09PT09PT09PT09PT09PT09PT09CisKKyAgRGllIEhvY2h6ZWl0IGltIE1vcmdlbkdyYXVlbiBpc3QgZWluIHNlaHIgdW50ZXJzY2hpZWRsaWNoIGR1cmNoZ2VmdWVocnRlcworICBSaXR1YWwsIGRhcyBtaXQgZGVyIEhpbGZlIHZvbiBOUENzIG9kZXIgYXVjaCBTcGllbGVybiB2b3JnZW5vbW1lbiB3ZXJkZW4KKyAga2Fubi4gQXVmZ3J1bmQgZGllc2VyIFZpZWxmYWx0IG11ZXNzZW4gZWluaWdlIERpbmdlIGJlYWNodGV0IHdlcmRlbiwgd2VubgorICBtYW4gZWluZSBIb2NoemVpdCBydWVja2dhZW5naWcgbWFjaGVuIHdpbGwuCisKKyAgRGEgZGFiZWkgYXVjaCBQcm9wZXJ0aWVzIGltIFNwaWVsZXIgZ2Vsb2VzY2h0LCBnZ2YuIExvZ2ZpbGVzIGVkaXRpZXJ0IHVuZAorICBPYmpla3RlIGltIFNwaWVsZXJpbnZlbnRhciB6ZXJzdG9lcnQgd2VyZGVuIG11ZXNzZW4sIGVtcGZpZWhsdCBlcyBzaWNoLAorICBkaWVzZW4gVm9yZ2FuZyB2b24gZWluZW0gTWFnaWVyIG1pdCBlbnRzcHJlY2hlbmRlciBFcmZhaHJ1bmcgdW5kIGluc2Jlc29uLQorICBkZXJlIGRlbiBub2V0aWdlbiBTY2hyZWlicmVjaHRlbiBpbiBkZXIgVW50ZXJ3ZWx0IGR1cmNoZnVlaHJlbiB6dSBsYXNzZW4uCisKKyAgMSkgR3J1bmRzYWV0emxpY2hlcyB6dXIgSG9jaHplaXQKKyAKKyAgICAgYSkgUF9NQVJSSUVEOgorCisgICAgICAgIFByb3BlcnR5IGltIFNwaWVsZXIsIGRpZSBkZW4gTmFtZW4gZGVzIEVoZXBhcnRuZXJzIGFscyBsb3dlcmNhc2UgCisgICAgICAgIFN0cmluZyBlbnRoYWVsdCAoVUlELCB6LkIuICJib2luZyIpLiBEaWVzZSBQcm9wZXJ0eSB3aXJkIHZvbiBhbGxlbiAKKyAgICAgICAgT2JqZWt0ZW4sIGRpZSBlaW5lIEhvY2h6ZWl0IGR1cmNoZnVlaHJlbiBrb2VubmVuLCBpZGVudGlzY2gKKyAgICAgICAgdmVyd2VuZGV0LgorCisgICAgIGIpIFByaWVzdGVyOgorCisgICAgICAgIE5lYmVuIE1pdGdsaWVkZXJuIGRlciBLbGVydXMtR2lsZGUga29lbm5lbiBIb2NoemVpdGVuIHZvbiBmb2xnZW5kZW4KKyAgICAgICAgTlBDcyBkdXJjaGdlZnVlaHJ0IHdlcmRlbjoKKyAgICAgICAgL2QvdW50ZXJ3ZWx0L2NocmlzL21vbnN0ZXIvcHJpZXN0ZXIuYyAgICAgKEthcGVsbGUgaW4gZGVyIFVudGVyd2VsdCkKKyAgICAgICAgL2QvcG9sYXIvZmlsZXMuY2hhb3MvZmV1ZXJ3ZWhyL21vbi9jbDJfeHJ1dXIuYyAgICAgICAoQ2hhb3Nwcmllc3RlcikKKworICAgICBjKSBWZXJsb2J1bmdzLSB1bmQgRWhlcmluZ2U6CisgICAgICAgIAorICAgICAgICBBbHMgRWhlcmluZ2Uga29tbWVuIHZlcnNjaGllZGVuZSBPYmpla3RlIGltIE1HIHp1bSBFaW5zYXR6OgorICAgICAgICAvZC91bnRlcndlbHQvY2hyaXMvb2JqZWt0ZS9yaW5nLmMgICAgICAgKFJpbmcgdm9tIFVudGVyd2VsdHByaWVzdGVyKQorICAgICAgICAvZC9wb2xhci9maWxlcy5jaGFvcy9mZXVlcndlaHIvb2JqL2NsMl9laGVyaW5nLmMgICAgKHNjaHdhcnplciBEb3JuKQorICAgICAgICAvZ2lsZGVuL2ZpbGVzLmtsZXJ1cy9laGVyaW5nLmMgICAgICAgICAgICAgICAgKFJpbmcgZGVyIEtsZXJ1c2dpbGRlKQorCisgICAgICAgIFp1c2FldHpsaWNoIGV4aXN0aWVydCBub2NoIGVpbiBWZXJsb2J1bmdzcmluZyB2b24gUmlrdXM6CisgICAgICAgIC9wbGF5ZXJzL3Jpa3VzL29iai92ZXJscmluZy5jCisgICAgICAgIEVpbiB2ZXJoZWlyYXRldGVyIFNwaWVsZXIga2FubiBkaWVzZW4gUmluZyB6dXNhZXR6bGljaCBpbSBJbnZlbnRhcgorICAgICAgICBoYWJlbi4gRXIgd2lyZCBiZWkgZGVyIGVpZ2VudGxpY2hlbiBIb2NoemVpdCBuaWNodCB6ZXJzdG9lcnQuCisKKyAgICAgICAgRGllIGJlaWRlbiBFaGVwYXJ0bmVyIHNvd2llIGRhcyBEYXR1bSBkZXMgSG9jaHplaXRzdGFncyB3ZXJkZW4gCisgICAgICAgIHp1c2FldHpsaWNoIHp1ciBTcGllbGVyLVByb3BlcnR5IChzLiAxYSkgYWxzIEF1dG9sb2FkLURhdGVuIAorICAgICAgICBpbiBkZW4gUmluZ2VuIGFiZ2VzcGVpY2hlcnQuCisKKyAgICAgZCkgTG9nZmlsZXM6CisgCisgICAgICAgIEplIG5hY2hkZW0sIHdlbGNoZXIgUHJpZXN0ZXIgZGllIEhvY2h6ZWl0IGR1cmNoZnVlaHJ0LCB3aXJkIGRlcgorICAgICAgICBlcmZvbGdyZWljaGUgQWJzY2hsdXNzIGRlciBaZXJlbW9uaWUgaW4gdW50ZXJzY2hpZWRsaWNoZW4gTG9ncworICAgICAgICBwcm90b2tvbGxpZXJ0LgorCisgICAgICAgIC0gRGllIEJsdXRob2NoemVpdCBkZXIgQ2hhb3RlbiBpbgorICAgICAgICAgIC9kL3BvbGFyL2ZpbGVzLmNoYW9zL2ZldWVyd2Voci9zYXZlL0J1Y2hEZXJIYXNzZW5kZW4KKyAgICAgICAgLSBEaWUgSG9jaHplaXQgZGVyIEtsZXJpa2VyIGluCisgICAgICAgICAgL2xvZy9rbGVydXMvSEVJUkFUCisgICAgICAgIC0gRGllIEhvY2h6ZWl0IGluIGRlciBVbnRlcndlbHQtS2FwZWxsZSBpbgorICAgICAgICAgIC9kL3VudGVyd2VsdC9jaHJpcy9IT0NIWkVJVFNCVUNICisgICAgICAgICAgdW5kCisgICAgICAgICAgL2xvZy9ob2NoemVpdGVuLmNocmlzCisKKyAgMikgVm9yZ2VoZW5zd2Vpc2UgenVyIEF1ZmxvZXN1bmcgZGVyIEVoZQorCisgICAgIGEpIExvZXNjaGVuIHZvbiBQX01BUlJJRUQgaW4gX2JlaWRlbl8gU3BpZWxlcm4gKFNldFByb3AoUF9NQVJSSUVELDApKQorICAgICAgICB1bmQgYW5zY2hsaWVzc2VuZGVzIFNwZWljaGVybiBkZXMgU3BpZWxlcnMKKworICAgICBJc3QgZGVyIHp3ZWl0ZSBTcGllbGVyIG5ldHp0b3QsIGthbm4gZGllIFByb3BlcnR5IGRpcmVrdCBnZXNldHp0IHdlcmRlbi4KKyAgICAgU29sbHRlIGRlciB6d2VpdGUgU3BpZWxlciBuaWNodCBleGlzdGllcmVuLCB3ZWlsIGVyIGluendpc2NoZW4gCisgICAgIGdlbG9lc2NodCB3dXJkZSwgcmVpY2h0IGVzLCBkaWUgUHJvcGVydHkgaW0gdmVyYmxlaWJlbmRlbiBTcGllbGVyIAorICAgICB6dSBhZW5kZXJuIChkaWVzIHdpcmQgaGFldWZpZyBhdWNoIGRlciBHcnVuZCBkZXIgQml0dGUgdW0gU2NoZWlkdW5nCisgICAgIHNlaW4pLgorCisgICAgIFNvbGx0ZSBkZXIgendlaXRlIFNwaWVsZXIgaW4gZGVyIGxhdWZlbmRlbiBVcHRpbWUgbm9jaCBuaWNodCBlaW5nZWxvZ2d0CisgICAgIGdld2VzZW4gc2Vpbiwga2FubiBkaWUgUHJvcGVydHkgbnVyIHZvbiBlaW5lbSBFcnptYWdpZXIgbWl0IEhpbGZlIAorICAgICBkZXIgRnVua3Rpb24gX19jcmVhdGVfcGxheWVyX2R1bW15KCkgenVydWVja2dlc2V0enQgd2VyZGVuLgorCisgICAgIGIpIFplcnN0b2VyZW4gX2JlaWRlcl8gRWhlcmluZ2UuIEZhbGxzIGplZG9jaCB2b24gZGVtIEVoZXBhcnRuZXIgCisgICAgICAgIGtlaW4gU3BpZWxlcm9iamVrdCBleGlzdGllcnQsIGlzdCBlcyBuaWNodCBtb2VnbGljaCwgZGVzc2VuIAorICAgICAgICBFaGVyaW5nIHp1IHplcnN0b2VyZW4uCisKKyAgICAgYykgemVyc3RvZXJlbiBldnRsLiB2b3JoYW5kZW5lciBWZXJsb2J1bmdzcmluZ2UsIGZhbGxzIGdld3VlbnNjaHQuCisKKyAgICAgZCkgSW0gRmFsbCB2b24gSG9jaHplaXRlbiwgZGllIGluIGRlciBVbnRlcndlbHRrYXBlbGxlIGR1cmNoZ2VmdWVocnQKKyAgICAgICAgd3VyZGVuLCBpc3QgZXMgb2ZmZW5iYXIgVHJhZGl0aW9uLCBkYXNzIGRpZSBTY2hlaWR1bmcgZG9ydCBpbiBGb3JtCisgICAgICAgIGVpbmVzIFp1c2F0emVzIHp1bSBMb2dmaWxlLUVpbnRyYWcgbmFjaGdldHJhZ2VuIHdpcmQuIEJlaXNwaWVsOgorICAgICAgICBbLi4uXSAiQ2Fzc2FuZHJhIHVuZCBWaXBlciAgKGdlcy46IERvbiwgMDIuIE5vdiAxOTk1LCBXYXJnb24pIgorICAgICAgICBEaWVzIHNvbGwgYXVjaCBpbiBadWt1bmZ0IGJlaWJlaGFsdGVuIHdlcmRlbi4gRnVlciBkaWUgQWVuZGVydW5nCisgICAgICAgIHNpbmQgU2NocmVpYnJlY2h0ZSBpbiBkZXIgUmVnaW9uIFVudGVyd2VsdCBlcmZvcmRlcmxpY2guCisKKworICBTSUVIRSBBVUNIOgorICAgICBQcm9wZXJ0aWVzOiAgUF9NQVJSSUVECisgICAgIEtsZXJ1c2dpbGRlOiBtYW4gdHJhdWUgKC9kb2MvZy5rbGVydXMvdHJhdWUpCisKK0FyYXRob3JuLCAwNC4wMS4yMDEwCmRpZmYgLS1naXQgYS9kb2Mvd2l6L3Njb3JlbWFzdGVyIGIvZG9jL3dpei9zY29yZW1hc3RlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzIzMTlmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dpei9zY29yZW1hc3RlcgpAQCAtMCwwICsxLDIxMyBAQAorRGVyIFNjb3JlbWFzdGVyCis9PT09PT09PT09PT09PT0KKworQkVTQ0hSRUlCVU5HCisKKyAgRnVua3Rpb246IFZlcndhbHR1bmcgZGVyIEVyc3RraWxsLVN0dWZlbnB1bmt0ZSwgZGllIGZ1ZXIgZGFzIFRvZXRlbiB2b24KKyAgTlBDcyB2ZXJnZWJlbiB3ZXJkZW4uIEZ1ZXIgYWxsZSBOUENzLCBkaWUgbWVociBhbHMgMjAwMDAwIFhQCisgIChTQ09SRV9MT1dfTUFSSykgZ2ViZW4sIHdpcmQgZWluIFN0dWZlbnB1bmt0IHZlcmdlYmVuLiBBYiA2MDAwMDAgWFAKKyAgKFNDT1JFX0hJR0hfTUFSSykgc2luZCBlcyAyIFN0dWZlbnB1bmt0ZS4gVWViZXIgZGllc2UgV2VydGUgaGluYXVzZ2VoZW5kZQorICBQdW5rdGUgbXVlc3NlbiBiZWFudHJhZ3QgdW5kIG1hbnVlbGwgdWViZXIgZGVuIFNjb3JlbWFzdGVyIGVpbmdldHJhZ2VuCisgIHdlcmRlbi4KKworICBKZWRlciBOUEMsIGRlciBtaW5kZXN0ZW5zIGVpbmVuIFN0dWZlbnB1bmt0IGdpYnQsIHdpcmQgYXV0b21hdGlzY2ggaW4KKyAgZWluZSBMaXN0ZSB0ZW1wb3JhZXJlciBFS3MgZWluZ2V0cmFnZW4sIGRpZSB2b20gRUstTWFpbnRhaW5lciBlaW56ZWxuCisgIGJlc3RhZXRpZ3Qgd2VyZGVuIG11ZXNzZW4uIERpZXNlcyBWZXJmYWhyZW4gaXN0IGVyZm9yZGVybGljaCwgd2VpbCBkZXIKKyAgYmlzIHZvciBlaW5pZ2VyIFplaXQgZWluZ2VzZXR6dGUgTWVjaGFuaXNtdXMsIEVLcyBhdXRvbWF0aXNjaCBlaW56dXRyYWdlbiwKKyAgZGF6dSBnZWZ1ZWhydCBoYXQsIGRhc3MgZWlnZW50bGljaCBuaWNodCBhbHMgRUsgdm9yZ2VzZWhlbmUgb2RlciBlcmxhdWJ0ZSwKKyAgYWJlciBhdWNoIGxhZW5nc3Qgd2llZGVyIGFiZ2VoYWVuZ3RlIG9kZXIgZ2FyIG5pZSBhbmdlc2NobG9zc2VuZSBOUENzCisgIGVpbmdldHJhZ2VuIHdhcmVuLiBEYSBhdXMgZGVtIFNjb3JlbWFzdGVyIGF1Y2ggZGllIHZvbiBCcnVtbmkgaW4gZGVyCisgIEZyYXRlcm5pdGFzIGF1c2dlZ2ViZW5lbiBFSy1UaXBzIGFiZ2VmcmFndCB3ZXJkZW4sIGlzdCBkYXMgbmF0dWVybGljaCBmYXRhbAorICBmdWVyIFNwaWVsZXIsIHdlbm4gc2llIFRpcHMgYmVrb21tZW4sIGRpZSBzaWUgbmljaHQgZXJyZWljaGVuIGtvZW5uZW4uCisKKyAgRGllIExpc3RlIGRlciBFcnN0a2lsbHMgaXN0IGVpbiBNYXBwaW5nLCBkYXMgYWxzIEtleXMgZWluZSBmb3J0bGF1ZmVuZGUKKyAgTnVtbWVyIGVudGhhZWx0LCB6dSBkZXIgamV3ZWlscyBkaWUgRGF0ZW4gZGVzIE5QQ3MgenVnZW9yZG5ldCBzaW5kLiBEaWVzZQorICBOdW1tZXIgZGllbnQgdm9yIGFsbGVtIGF1Y2ggenVyIEluZGl6aWVydW5nIGRlcyBCaXRzdHJpbmdzIGltIFNwaWVsZXIsCisgIGluIGRlbSBkaWUgRXJzdGtpbGxzIGdlc3BlaWNoZXJ0IHdlcmRlbi4KKworICBEaWVzZSBEYXRlaSBkb2t1bWVudGllcnQgZGllIEZ1bmt0aW9uYWxpdGFldCBkZXMgU2NvcmVtYXN0ZXJzIGZ1ZXIgZGllCisgIEJlbnV0enVuZyBkdXJjaCBFTSB1bmQgRUstTWFpbnRhaW5lciwgamVkb2NoIG5pY2h0IGRpZSB2b2xsc3RhZW5kaWdlCisgIGludGVybmUgQXJiZWl0c3dlaXNlIHVuZCBWZXJ3YWx0dW5nIGRlciBEYXRlbi4KKworICBJbmhhbHRzdmVyemVpY2huaXMgZGllc2VyIERva3VtZW50YXRpb24KKyAgMSkgTmV1ZWludHJhZ3VuZyB2b24gRUtzCisgIDIpIFZlcndhbHR1bmcgZGVyIHVuYmVzdGFldGlndGVuIEVLcworICAzKSBBZW5kZXJ1bmdlbiBhbiBiZXN0ZWhlbmRlbiBFS3MKKyAgNCkgU3BpZWxlcmJlem9nZW5lIERhdGVuIHZlcndhbHRlbgorICA1KSBEYXRlbiB2b24gTlBDcyBhYmZyYWdlbgorICA2KSBQZXJtYW5lbnRlcyBMb2VzY2hlbiB2b24gRUtzCisgIDcpIFZlcndhbHR1bmcgZGVyIEVLLVRpcHMgdm9uIEJydW1uaQorICA4KSBTb25zdGlnZSBGdW5rdGlvbmVuIChudXIgdm9uIE5QQ3MgZ2VydWZlbikKKworCitSVUVDS0dBQkVXRVJURToKKworICBTQ09SRV9JTlZBTElEX0FSRyAgIC0xCisgIFNDT1JFX05PX1BFUk1JU1NJT04gLTIKKworCitGVU5LVElPTkVOCisKKzEpIE5ldWVpbnRyYWd1bmcgdm9uIEVLcworCisgIE5ld05QQyhzdHJpbmcga2V5LCBpbnQgc2NvcmUpCisgIEFkZE5QQyhzdHJpbmcga2V5LCBpbnQgc2NvcmUpIFt2ZXJhbHRldCwgbGVpdGV0IGFuIE5ld05QQyB3ZWl0ZXJdCisgICAgICAgIE5ldWVuIE5QQyBlaW50cmFnZW4sIGtleSBpc3QgaGllcmJlaSBkZXIgUGZhZCwgc2NvcmUgZGllIFB1bmt0emFobAorICAgICAgICBEaWUgSUQgZGVzIEVLcyB3aXJkIGF1dG9tYXRpc2NoIGF1c2dld2FlaGx0LCBpbmRlbSBkZXIgbmFlY2hzdGUKKyAgICAgICAgZnJlaWUgUGxhdHogaW0gTWFwcGluZyBiZWxlZ3Qgd2lyZC4KKworCisyKSBWZXJ3YWx0dW5nIGRlciB1bmJlc3RhZXRpZ3RlbiBFS3MKKworICBDb25maXJtU2NvcmUobWl4ZWQga2V5KQorICAgICAgICB1bmJlc3RhZXRpZ3RlbiBFSyBtaXQgZGVyIE51bW1lciBvZGVyIGRlbSBQZmFkICJrZXkiIGdlbmVobWlnZW4KKyAgICA9PiAgRUsgaW4gZGVuIFNwaWVsZXJuIHNldHplbiB1bmQgU3RhdGlzdGlrIGhvY2h6YWVobGVuLAorICAgID0+ICBFSyBhdXMgZGVyIExpc3RlIGRlciB1bmJlc3RhZXRpZ3RlbiBFS3MgaW4gZGllIExpc3RlIGRlciBha3RpdmVuCisgICAgICAgIHVlYmVydHJhZ2VuLAorCisgIFJlamVjdFNjb3JlKG1peGVkIGtleSkKKyAgICAgICAgdW5iZXN0YWV0aWd0ZW4gRUsgbWl0IGRlciBOdW1tZXIgb2RlciBkZW0gUGZhZCAia2V5IiBhYmxlaG5lbgorICAgID0+ICBFaW50cmFnIGF1cyBkZXIgTGlzdGUgZGVyIHVuYmVzdGFldGlndGVuIEVLcyBsb2VzY2hlbgorICAgID0+ICBCaXQtTnIuIGluIGRpZSBMaXN0ZSBkZXIgZnJlaWVuIE51bW1lcm4gZWludHJhZ2VuCisKKyAgRHVtcFVuY29uZmlybWVkU2NvcmVzKCkKKyAgICAgICAgdW5iZXN0YWV0aWd0ZSBOUENzIGFuIGRlbiBhYmZyYWdlbmRlbiBNYWdpZXIgYXVzZ2ViZW4KKworCiszKSBBZW5kZXJ1bmdlbiBhbiBiZXN0ZWhlbmRlbiBFS3MKKworICBTZXRTY29yZShtaXhlZCBrZXksIGludCBzY29yZSkKKyAgICAgICAgUHVua3R6YWhsIGZ1ZXIgYmVyZWl0cyBlaW5nZXRyYWdlbmVuIE5QQyBhZW5kZXJuLCBrZXkgaXN0IGRlciBQZmFkCisgICAgICAgIG9kZXIgZGllIE5QQy1OdW1tZXIsIHNjb3JlIGRpZSBuZXVlIFB1bmt0emFobAorCisgIFJlbW92ZVNjb3JlKG1peGVkIGtleSkKKyAgICAgICAgU2V0enQgZGllIFB1bmt0emFobCBhdWYgMC4gU29sY2hlIEVLcyBrb2VubmVuIHNwYWV0ZXIgZHVyY2ggQW5nYWJlCisgICAgICAgIGVpbmVyIG5ldWVuIFB1bmt0emFobCByZWFrdGl2aWVydCB3ZXJkZW4uCisgICAgICAgIEFsdGVybmF0aXYga2FubiBmdWVyIGRpZXNlIEZ1bmt0aW9uIGF1Y2ggU2V0U2NvcmUobWl4ZWQga2V5LCAwKQorICAgICAgICB2ZXJ3ZW5kZXQgd2VyZGVuLgorICAgICAgICBrZXkga2FubiBoaWVyYmVpIGRlciBQZmFkIG9kZXIgZGllIE5QQy1OdW1tZXIgc2VpbgorCisgIE1vdmVTY29yZShtaXhlZCBvbGRrZXksIHN0cmluZyBuZXdwYXRoKQorICAgICAgICBWZXJsZWd0IGVpbmVuIEVLCisgICAgICAgIG9sZGtleSBpc3QgZGVyIGFrdHVlbGxlIFBmYWQgb2RlciBkaWUgTnVtbWVyCisgICAgICAgIG5ld3BhdGggaXN0IGRlciBuZXVlIFBmYWQKKworCis0KSBTcGllbGVyYmV6b2dlbmUgRGF0ZW4gdmVyd2FsdGVuCisKKyAgSGFzS2lsbChtaXhlZCBwbCwgbWl4ZWQgbnBjKQorICAgICAgICBmcmFndCBhYiwgb2IgZGVyIFNwaWVsZXIgInBsIiBkZW4gS2lsbCAibnBjIiBoYXQKKyAgICAgICAgcGwga2FubiBoaWVyYmVpIGRlciBTcGllbGVybmFtZSBvZGVyIGRhcyBTcGllbGVyb2JqZWt0IHNlaW4sCisgICAgICAgIG5wYyBkZXIgUGZhZCBvZGVyIGRlc3NlbiBOdW1tZXIKKworICBTZXRTY29yZUJpdChzdHJpbmcgcGwsIGludCBiaXQpCisgICAgICAgIE1pdCBkaWVzZXIgRnVua3Rpb24gd2lyZCBkZW0gU3BpZWxlciAicGwiIGRlciBFSyBtaXQgZGVyIE51bW1lcgorICAgICAgICAiYml0IiBndXRnZXNjaHJpZWJlbi4KKworICBDbGVhclNjb3JlQml0KHN0cmluZyBwbCwgaW50IGJpdCkKKyAgICAgICAgTWl0IGRpZXNlciBGdW5rdGlvbiB3aXJkIGRlbSBTcGllbGVyICJwbCIgZGVyIEVLIG1pdCBkZXIgTnVtbWVyCisgICAgICAgICJiaXQiIHBlcm1hbmVudCBhdXNnZXRyYWdlbi4KKworICBRdWVyeUtpbGxQb2ludHMobWl4ZWQgcGwpCisgICAgICAgIGxpZWZlcnQgZGllIEFuemFobCBkZXIgU3R1ZmVucHVua3RlIHp1cnVlY2ssIGRpZSBkZW0gU3BpZWxlciBwbAorICAgICAgICBkdXJjaCBkaWUgYWt0aXZlbiBFS3MgZ3V0Z2VzY2hyaWViZW4gd3VyZGVuCisKKyAgZ2V0RnJlZUVLc0ZvclBsYXllcihvYmplY3QgcGxheWVyKQorICAgICAgICBsaWVmZXJ0IGFsbGUgRUtzLCBkaWUgYWt0aXYgc2luZCwgdW5kIGRpZSBkZXIgU3BpZWxlciBub2NoIG5pY2h0CisgICAgICAgIGhhdCwgaW4gZWluZW0gTWFwcGluZyBlbnRzcHJlY2hlbmQgZGVyIExpc3RlICJucGNzIiB6dXJ1ZWNrLgorCisgIFF1ZXJ5QWxsS2lsbHMoc3RyaW5nIHBsKQorICAgICAgICBsaWVmZXJ0IGFsbGUgS2lsbHMgZGVzIFNwaWVsZXJzIGFscyBCaXRzdHJpbmcgenVydWVjaywgYXVjaCBzb2xjaGUsCisgICAgICAgIGRpZSBtb21lbnRhbiBhdXNnZXRyYWdlbi9kZWFrdGl2aWVydCBzaW5kCisgICAgICAgIHBsIGlzdCBoaWVyYmVpIGRlciBTcGllbGVybmFtZSBhbHMgU3RyaW5nCisKKyAgUXVlcnlLaWxscyhzdHJpbmcgcGwpCisgICAgICAgIGxpZWZlcnQgZGllIGFrdGl2ZW4gS2lsbHMgZGVzIFNwaWVsZXJzIGFscyBCaXRzdHJpbmcgenVydWVjaworICAgICAgICBwbCBpc3QgaGllcmJlaSBkZXIgU3BpZWxlcm5hbWUgYWxzIFN0cmluZworCisKKzUpIERhdGVuIHZvbiBOUENzIGFiZnJhZ2VuCisKKyAgUXVlcnlOUENieU51bWJlcihpbnQgbnVtKQorICAgICAgICBsaWVmZXJ0IGRpZSBEYXRlbiBkZXMgTlBDcyBtaXQgZGVyIE51bW1lciAibnVtIiBhbHMgQXJyYXkgenVydWVjaworCisgIFF1ZXJ5TlBDYnlPYmplY3Qob2JqZWN0IG8pCisgICAgICAgIGxpZWZlcnQgZGllIERhdGVuIGRlcyBOUENzIG1pdCBkZW0gT2JqZWt0ICJvIiBhbHMgQXJyYXkgenVydWVjaworCisKKzYpIFBlcm1hbmVudGVzIExvZXNjaGVuIHZvbiBFS3MKKworICBNYXJrRUtGb3JMaXF1aWRhdGlvbihtaXhlZCBrZXkpCisgICAgICAgIGVudGZlcm50IGVpbmVuIEVLIGVuZGd1ZWx0aWcgdW5kIHVud2lkZXJydWZsaWNoIHVuZCBnaWJ0IGRpZSBOci4KKyAgICAgICAgd2llZGVyIGZyZWkuCisgICAgICAgIFRlY2huaXNjaCB3aXJkIGRlciBFSyBlcnN0bWFsIGluIGVpbmUgTGlzdGUgZWluZ2V0cmFnZW4uIEltIFJlc2V0CisgICAgICAgIGl0ZXJpZXJ0IGRlciBNYXN0ZXIgdWViZXIgYWxsZSBTcGllbGVyLVNhdmVmaWxlcyB1bmQgbG9lc2NodCBkZW4gRUsKKyAgICAgICAgYXVzIGFsbGVuIFNwaWVsZXJuLiBOYWNoIEFic2NobHVzcyB3aXJkIGRlciBFaW50cmFnIGluICJucGNzIgorICAgICAgICBnZWxvZXNjaHQgdW5kIHNlaW5lIE5yLiBpbiBkaWUgTGlzdGUgZnJlaWVyIE51bW1lcm4gZWluZ2V0cmFnZW4uCisKKyAgVW5tYXJrRUtGb3JMaXF1aWRhdGlvbihtaXhlZCBrZXkpCisgICAgICAgIEVudGZlcm50IGRpZSBMb2VzY2htYXJraWVydW5nIHZvbiBlaW5lbSBFSworICAgID0+ICBEaWVzIGdlaHQgbnVyLCBzb2xhbmdlIG5hY2ggZWluZW0gTWFya0VLRm9yTGlxdWlkYXRpb24oKSBub2NoIGtlaW4KKyAgICAgICAgcmVzZXQoKSBnZWxhdWZlbiBpc3QhCisKKyAgUXVlcnlMaXF1aWRhdGlvbk1hcmtzKCkKKyAgICAgICAgRnJhZ3QgZGllIGZ1ZXIgTG9lc2NodW5nIHZvcmdlc2VoZW5lbiBFS3MgYWIuCisKKyAgUmVzdG9yZUVLKHN0cmluZyBrZXksIGludCBiaXQsIGludCBzY29yZSkKKyAgICAgICAgcmVzdGF1cmllcnQgZGllIERhdGVuIGVpbmVzIGZydWVoZXIgZ2Vsb2VzY2h0ZW4sIGluIGRlbiBTcGllbGVybiBub2NoCisgICAgICAgIGVudGhhbHRlbmVuIEVLcy4gTW9lZ2xpY2ggbnVyIGRhbm4sIHdlbm4gZGVyIEVLIGZydWVoZXIgbWFsIGdlbG9lc2NodAorICAgICAgICB3dXJkZSwgYWJlciBpbiBkZW4gQml0c3RyaW5ncyBpbiBkZW4gU3BpZWxlcm4gbm9jaCBlaW5nZXRyYWdlbiBpc3QuCisgICAgICAgIEVzIHdlcmRlbiBQZmFkLCBOci4gdW5kIFB1bmt0ZSBiZW5vZXRpZ3QuCisgICAgICAgIEZ1ZXIgbmFjaCBkZW0gVW1iYXUgZGVzIFNjb3JlbWFzdGVycyBnZWxvZXNjaHRlIEVLcyBuaWNodCBtZWhyCisgICAgICAgIG1vZWdsaWNoLCB3ZWlsIGRpZXNlIHBlcm1hbmVudCBhdXMgZGVuIEJpdHN0cmluZ3MgYXVzZ2V0cmFnZW4gd2lyZC4KKworCis3KSBWZXJ3YWx0dW5nIGRlciBFSy1UaXBzIHZvbiBCcnVtbmkKKworICBhZGRUaXAobWl4ZWQga2V5LHN0cmluZyB0aXApCisgICAgICAgIFRyYWVndCBmdWVyIGRlbiBOUEMgbWl0IGRlciBOdW1tZXIgb2RlciBkZW0gUGZhZCAia2V5IiBlaW5lbiBFSy1UaXAtCisgICAgICAgIFRleHQgZnVlciBCcnVtbmkgZWluLgorCisgIGNoYW5nZVRpcChtaXhlZCBrZXksc3RyaW5nIHRpcCkKKyAgICAgICAgQWVuZGVydCBkZW4gZHVyY2ggQnJ1bW5pIGF1c3p1Z2ViZW5kZW4gRUstVGlwIGZ1ZXIgZGVuIE5QQyBtaXQgZGVyCisgICAgICAgIE51bW1lciBvZGVyIGRlbSBQZmFkICJrZXkiLiBEZXIgbmV1ZSBUaXAgd2lyZCBkYWJlaSBhbHMgMi4gUGFyYW1ldGVyCisgICAgICAgICJ0aXAiIHVlYmVyZ2ViZW4uCisKKyAgcmVtb3ZlVGlwKG1peGVkIGtleSkKKyAgICAgICAgTG9lc2NodCBkZW4gZHVyY2ggQnJ1bW5pIGF1c3p1Z2ViZW5kZW4gRUstVGlwLVNwcnVjaC4gRGVyIFRpcCBhbHMKKyAgICAgICAgc29sY2hlciBibGVpYnQgYmVzdGVoZW4gLSBhbnNjaGxpZXNzZW5kIHdpcmQgd2llZGVyIGRlciBTdGFuZGFyZC0KKyAgICAgICAgU3BydWNoIGF1c2dlZ2ViZW4uCisKKyAgZ2V0VGlwKG1peGVkIGtleSkKKyAgICAgICAgR2lidCBkZW4gVGlwLVNwcnVjaCBmdWVyIGRlbiBOUEMgbWl0IGRlciBOdW1tZXIgb2RlciBkZW0gUGZhZAorICAgICAgICAia2V5IiB6dXJ1ZWNrLCBvZGVyIGRlbiBTdGFuZGFyZC1TcHJ1Y2guIExpZWZlcnQgZnVlciBuaWNodAorICAgICAgICBlaW5nZXRyYWdlbmVuICJrZXkiIGRlbiBMZWVyc3RyaW5nIHp1cnVlY2suCisKKyAgUXVlcnlUaXBPYmplY3RzKG1peGVkIHBsYXllcikKKyAgICAgICAgR2lidCBkaWUgT2JqZWt0bmFtZW4gZGVyIEVLLVRpcHMgZGVzIGpld2VpbGlnZW4gU3BpZWxlcnMgenVydWVjay4KKworICBhbGxUaXBzRm9yUGxheWVyKG9iamVjdCBwbGF5ZXIpCisgICAgICAgIEdpYnQgZGVuIEdlc2FtdHN0cmluZyBhbGxlciBUaXBzIGRlcyBTcGllbGVycyAicGxheWVyIiB6dXJ1ZWNrLgorCisgIHBsYXllck1heUdldFRpcChvYmplY3QgcGxheWVyKQorICAgICAgICBGcmFndCBhYiwgb2IgZGVyIFNwaWVsZXIgInBsYXllciIgZWluZW4gVGlwIGJla29tbWVuIGthbm4uCisKKyAgZ2l2ZVRpcEZvclBsYXllcihvYmplY3QgcGxheWVyKQorICAgICAgICBXYWVobHQgZWluZW4genVmYWVsbGlnZW4gRUsgYXVzLCBkZW4gZGVyIFNwaWVsZXIgbm9jaCBuaWNodCBoYXQsIHVuZAorICAgICAgICB0cmFlZ3QgZGllc2VuIGltIE1hc3RlciBpbiBkaWUgTGlzdGUgZWluLCBkaWUgbWl0IGFsbFRpcHNGb3JQbGF5ZXIoKQorICAgICAgICBhYmdlZnJhZ3Qgd2VyZGVuIGthbm4uCisKKworOCkgU29uc3RpZ2UgRnVua3Rpb25lbiAobnVyIHZvbiBOUENzIGdlcnVmZW4pCisKKyAgR2l2ZUtpbGwob2JqZWN0IHBsLCBpbnQgYml0KQorICAgICAgICBzY2hyZWlidCBkZW0gU3BpZWxlciAicGwiIGRlbiBFSyBtaXQgZGVyIE51bW1lciAiYml0IiBndXQuCisgICAgICAgIERpZXNlIEZ1bmt0aW9uIHdpcmQgYXVzc2NobGllc3NsaWNoIGF1cyBOUENzIGhlcmF1cyBnZXJ1ZmVuLgorCisgIFF1ZXJ5TlBDKGludCBzY29yZSkKKyAgICAgICAgV2lyZCB2b20gZ2V0b2V0ZXRlbiBOUEMgZ2VydWZlbiwgdW0genUgZXJtaXR0ZWxuLCBvYiBkaWVzZXIgZWluZW4KKyAgICAgICAgRXJzdGtpbGwgZ2lidC4gV2VubiBkZXIgRUsgbm9jaCBuaWNodCBleGlzdGllcnQsIHdpcmQgZGllc2VyIGltCisgICAgICAgIE1hc3RlciB6dW5hZWNoc3QgaW4gZGVyIExpc3RlIGRlciB1bmJlc3RhZXRpZ3RlbiBFS3MgZWluZ2V0cmFnZW4KKyAgICAgICAgRGlyZWt0ZSBBYmZyYWdlIGRpZXNlciBGdW5rdGlvbiB2b24gYXVzc2VuIHouQi4gZHVyY2ggTWFnaWVyIG5pY2h0CisgICAgICAgICBtb2VnbGljaCwgd2VpbCBuaWNodCBzaW5udm9sbC4KKwpkaWZmIC0tZ2l0IGEvZG9jL3dpei9zZWlsIGIvZG9jL3dpei9zZWlsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwODY4NDIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd2l6L3NlaWwKQEAgLTAsMCArMSw2OCBAQAorCitEb2t1bWVudGF0aW9uIGZ1ZXIgZGFzIFN0ZC1TZWlsOiAvb2JqL3NlaWwuYworCitBYmhhZW5naWdrZWl0ZW46IC9zeXMvdGhpbmcvc2VpbC5oCisKK0RhcyBTdGFuZGFyZC1TZWlsIGVybW9lZ2xpY2hzdCBkYXMgRmVzdGJpbmRlbiB1bmQgTG9lc2VuIGVpbmVzIFNlaWxlcyBhbgorT2JqZWN0ZW4gdW5kIFJhZXVtZW4uIEVzIGthbm4gaW0gZ2FuemVuIE1vcmdlbmdyYXVlbiB2ZXJ3ZW5kZXQgd2VyZGVuLgorCitpbiBkZW4gT2JqZWN0ZW4sIGRpZSBmZXN0Z2VidW5kZW4gd2VyZGVuLCB3aXJkIGRpZSBQcm9wZXJ0aWUgUF9USUVEIGdlc2V0enQuCitTaWUgZW50aGFlbHQgZWluIE1hcHBuZyBkZXIgRm9ybToKKworKFsKKworIG9iamVjdGlkOiAoWyAicGxheWVyIiA6IHBsYXllcmlkLCAidGltZSIgOiB0aW1lc3RhbXAgXSkKKworXSkKKworV2VubiBlaW4gT2JqZWN0IGZlc3RnZWJ1bmRlbiB3aXJkLCBzbyB3aXJkIGRpZSBGdW5rdGlvbiB0aWUoKSBpbiBkZW0gT2JqZWN0CithdWZnZXJ1ZmVuLiBEaWUgRnVua3Rpb24gbXVzcyBpbiBkZW0gT2JqZWN0IHZvcmhhbmRlbiBzZWluLiBMaWVmZXJ0IGRpZQorRnVua3Rpb24gMSB6dXJ1ZWNrLCBkYXJmIG1hbiBlaW4gU2VpbCBkYXJhbiBiaW5kZW4uCisKK0F1cyBkZXIgRnVua3Rpb24gaGVyYXVzIGthbm4gaW0gU2VpbCBpbiBkZXIgUHJvcGVydGllIFBfVElFX1VTRVIgYXVzZ2VsZXNlbgord2VyZGVuLCB3ZWxjaGUgVXNlciBkaWUgQWt0aW9uIGF1c2dlbG9lc3QgaGF0LgorKERpZXNlIERhdGVuIHdlcmRlbiBhdXMgS29tcGF0aWJpbGl0YWV0c2dydWVuZGVuIG5pY2h0IGFuIGRpZSBGa3QuIGRpcmVrdAordWViZXJnZWJlbi4pCisKK1dpcmQgZWluIFNlaWwgd2llZGVyIGxvc2dlYnVuZGVuLCBzbyB3aXJkIGRpZSBGdW5rdGlvbiAKK3VudGllKCkKK2luIGRlbSBPYmplY3QgYXVmZ2VydWZlbi4gCisKK0RhbWl0IGVpbiBTZWlsIGluIGVpbmVtIFJhdW0gZmVzdGdlYnVuZGVuIHdlcmRlbiBrYW5uLCBtdXNzIGRlciBSYXVtIGVpbmUKK2lkKCkgYmVrb21tZW4gLSB3aWUgZWluIG5vcm1hbGVzIE9iamVjdC4KKworSW4gZGVuIEZ1bmt0aW9uZW4gdGllKCkgdW5kIHVudGllKCkga2FubiBqZXdlaWxzIHVlYmVycHJ1ZWZ0IHdlcmRlbiwgb2IgZWluCitTcGllbGVyIGVpbiBTZWlsIGJlbnV0emVuIGRhcmYgb2RlciBuaWNodC4gTGllZmVybiBkaWUgRnVua3Rpb25lbiAwIHp1cnVlY2ssCitzbyB3aXJkIGRpZSBCZW51dHp1bmcgZGVzIFNlaWxlcyB2ZXJ3ZWlnZXJ0LgorCitEaWUgRnVua3Rpb24gc2VpbC0+cXVlcnlfdGllZF90b19vYigpIGxpZWZlcnQgZGFzIE9iamVjdCB6dXJ1ZWNrLCBhbiB3ZWxjaGVzCitlaW4gU2VpbCBnZWJ1bmRlbiBpc3Qgb2RlciAwOworCitCZWkgZGVyIEJlbnV0enVuZyBlaW5lcyBTZWlsZXMgaW0gUmF1bSB3aXJkIHp1ciBCZXNjaHJlaWJ1bmcgZGllIEZ1bmt0aW9uCituYW1lKCkgYXVmZ2VydWZlbi4gRXMga2FubiBhbHNvIFBfTkFNRSBnZXNldHp0IHdlcmRlbiBvZGVyIGRpcmVrdCBuYW1lKCkgaW0KK1JhdW0gdWViZXJzY2hyaWViZW4gd2VyZGVuLgorCitTZWlsZSBrb2VubmVuIHVlYmVyIE5QQydzL1JhZXVtZSB1bmQgWmF1YmVyIGdlc3RldWVydCB3ZXJkZW46CisKK3ZhcmFyZ3MgaW50IGJpbmRlX3NlaWwoc3RyaW5nIHppZWwsIHN0cmluZyBtc2cpCisKKwlaaWVsIGJlc2NocmVpYnQgZGFzIE9iamVjdCBvZGVyIFJhdW0sIHdvIGVzIGZlc3RnZWJ1bmRlbiB3ZXJkZW4gc29sbAorCW1zZyBpc3QgZGllIEF1c2dhYmUuIFdpcmQgbXNnIG5pY2h0IGdlc2V0enQsIHNvIHdpcmQgZWluZSAKKwkgICAgU3RhbmRhcmQtQXVzZ2FiZSBhdXNnZWdlYmVuLgorCit2YXJhcmdzIGludCBsb2VzZV9zZWlsKHN0cmluZyBtc2cpCisJRGFzIFNlaWwgd2lyZCBnZWxvZXN0IC0gZXMgd2lyZCBkYWJlaSBkaWUgbXNnIGluIGRlbiBSYXVtCisgICAgICAgIGF1c2dlZ2ViZW4uIElzdCBtc2cgbmljaHQgZGVmaW5pZXJ0LCB3aXJkIGVpbmUgU3RhbmRhcmRhdXNnYWJlCisgICAgCWVyemV1Z3QuCisKKworQmVpZGUgRnVua3Rpb25lbiB3ZXJkZW4gd2lyIHZvbiBlbmVtIFNwaWVsZXIgYmVoYW5kZWx0IC0gZXMgd2VyZGVuIHRpZSgpIHVuZAordW50aWUoKSBpbiBkZW4gZmVzdGdlYnVuZGVuZW4gT2JqZWN0ZW4gYXVzZ2V3ZXJ0ZXQuCisKK0VpbmUgd2VpdGVyZSBQcm9wZXJ0aWUgaXN0IFBfVElFX0FVVE8uCitEaWVzZXIgV2VydCBzdGVodCBwZXIgRGVmYXVsdCBhdWYgMSB1bmQgZXJsYXVidCBkYW1pdCBlaW5lIGF1dG9tYXRpc2NoZQorQmVudXR6dW5nIGRlcyBTZWlsZXMgdWViZXIgZGllIEZ1bmt0aW9uZW4gYmluZGVfc2VpbCgpIHVuZCBsb2VzZV9zZWlsKCkuCitJc3QgZGllc2UgUHJvcGVydGllIGF1ZiAwLCBzbyBrb2VubmVuIG51ciBTcGllbGVyIGRhcyBTZWlsIGJlbnV0emVuLgorCisKK0xldHp0ZSDEbmRlcnVuZzogMjUuNi4gR2FuZG8KZGlmZiAtLWdpdCBhL2RvYy93aXovc2Vuc2l0aXZlIGIvZG9jL3dpei9zZW5zaXRpdmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE5MjBhMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93aXovc2Vuc2l0aXZlCkBAIC0wLDAgKzEsNjcgQEAKK1NlbnNpdGl2ZSBPYmpla3RlCisKK01hbiBrYW5uIGVpbiBPYmpla3QgbWl0IGRlciBQcm9wZXJ0eSBQX1NFTlNJVElWRSBkYXp1IHZlcmFubGFzc2VuLCBhdWYKK2dld2lzc2UgRGluZ2UgenUgcmVhZ2llcmVuLiBXZW5uIGRpZXNlIFByb3BlcnR5IGJlbnV0enQgd2lyZCwgc29sbHRlIHNpZSBlaW4KK0FycmF5IHZvbiBBcnJheXMgZW50aGFsdGVuLCBkYXMgc28gYXVzc2llaHQ6CisKKyh7ICh7IGVyZWlnbmlzMSwga2V5MSwgZ3Jlbnp3ZXJ0MSAoLE9wdGlvbmVuMSkgfSksCisgICAoeyBlcmVpZ25pczIsIGtleTIsIGdyZW56d2VydDIgKCxPcHRpb25lbjIpIH0pLAorICAgLi4uCisgICAoeyBlcmVpZ25pc04sIGtleU4sIGdyZW56d2VydE4gKCxPcHRpb25lbk4pIH0pIH0pCisKK0ZvbGdlbmRlIG1vZWdsaWNoZSBFcmVpZ25pc3NlIHNpbmQgaW4gPHNlbnNpdGl2ZS5oPiBkZWZpbmllcnQ6CisKK1NFTlNJVElWRV9BVFRBQ0sgLSByZWFnaWVydCBhdWYgQW5ncmlmZi4KKyAgICAgSW4gZGllc2VtIEZhbGwgaXN0IGRlciBLZXkgZGVyIFNjaGFkZW5zdHlwIHVuZCBkZXIgR3Jlbnp3ZXJ0IGRlcgorICAgICBTY2hhZGVuLCBhYiBkZW0gZGllIEZ1bmt0aW9uIHRyaWdnZXJfc2Vuc2l0aXZlX2F0dGFjaygpIGluIGRlbSBPYmpla3QKKyAgICAgYXVmZ2VydWZlbiB3aXJkLiBEaWVzZSBGdW5rdGlvbiBiZWtvbW10IHVlYmVyZ2ViZW46CisgICAgICAgMS4gRGVuIEZlaW5kCisgICAgICAgMi4gRGVuIEtleSAobmljaHQgQUxMRSBTY2hhZGVuc3R5cGVuKQorICAgICAgIDMuIERlbiBTY2hhZGVuCisgICAgICAgNC4gRGFzIEFyZ3VtZW50IHNwZWxsIHZvbiBEZWZlbmQoKQorICAgICAgIDUuIERpZSBPcHRpb25lbiwgdW5kIHp3YXIgYWxsZXMgbmFjaCBkZW0gR3Jlbnp3ZXJ0IGFscyBBcnJheS4KKworICAgICBCZW1lcmt1bmdlbjoKKyAgICAgICAgbyBEZXIgU2NoYWRlbiBuYWNoIEFienVnIGR1cmNoIFJ1ZXN0dW5nZW4gdW5kIHZvciBCZXJ1ZWNrc2ljaHRpZ3VuZworICAgICAgICAgIHZvbiBSZXNpc3RlbnogdW5kIEtvZXJwZXJzY2h1dHogaXN0IGF1c3NjaGxhZ2dlYmVuZC4KKyAgICAgICAgbyBFaW4gRXJlaWduaXMga2FubiBtaXQgdmVyc2NoaWVkZW5lbiBLZXlzIG1laHJmYWNoIGFuZ2VnZWJlbgorICAgICAgICAgIHdlcmRlbi4KK1NFTlNJVElWRV9JTlZFTlRPUlkgLSByZWFnaWVydCBhdWYgYmVzdGltbXRlIE9iamVrdGUgaW0gSW52ZW50b3J5LgorICAgICBFaW4gc29sY2hlcyBPYmpla3QgcmVhZ2llcnQgYXVmIGFuZGVyZSBPYmpla3RlIGVtcGZpbmRsaWNoLCBkaWUKKyAgICAgc2Vuc2l0aXYgc2luZCB1bmQgU0VOU0lUSVZFX0lOVkVOVE9SWV9UUklHR0VSIG1pdCBkZW0gZ2xlaWNoZW4gS2V5IHVuZAorICAgICBlaW5lbSBob2VoZXJlbiBHcmVuendlcnQgYXVzbG9lc2VuLgorCisgICAgIEVzIGlzdCBkYWJlaSBlZ2FsLCB3ZWxjaGVzIGRlciBiZWlkZW4gT2JqZWt0ZSB6dWVyc3QgZGEgd2FyLiBJbiBlaW5lbQorICAgICBzb2xjaGVuIE9iamVrdCB3aXJkIGRhbm4gZGllIEZ1bmt0aW9uIHRyaWdnZXJfc2Vuc2l0aXZlX2ludigpCisgICAgIGF1ZmdlcnVmZW4sIHVuZCB6d2FyIG1pdCBmb2xnZW5kZW4gQXJndW1lbnRlbjoKKyAgICAgICAxLiBEYXMgYXVzbG9lc2VuZGUgT2JqZWt0IChEYXMgbWl0IEVyZWlnbmlzCisgICAgICAgICAgU0VOU0lUSVZFX0lOVkVOVE9SWV9UUklHR0VSKQorICAgICAgIDIuIERlciBLZXkKKyAgICAgICAzLiBEZXIgR3Jlbnp3ZXJ0IGRlcyBhdXNsb2VzZW5kZW4gT2JqZWt0cworICAgICAgIDQuIERpZSBPcHRpb25lbiBkZXMgYXVzbG9lc2VuZGVuIE9iamVrdHMKKyAgICAgICA1LiBEaWUgT3B0aW9uZW4gZGVzIHJlYWdpZXJlbmRlbiBPYmpla3RzCitTRU5TSVRJVkVfSU5WRU5UT1JZX1RSSUdHRVIgLSBzaWVoZSBvYmVuCisgICAgIE1pdCBkaWVzZW0gT2JqZWt0IHNlbGJlciBnZXNjaGllaHQgbmljaHRzLCBlcyBsb2VzdCBudXIgRnVua3Rpb25lbiBpbgorICAgICBhbmRlcmVuIE9iamVrdGVuIGF1cyAoc2llaGUgb2JlbikuCisKK0luIFBsYW51bmcgaXN0IG5vY2g6CisKK1NFTlNJVElWRV9FTlZJUk9OTUVOVF9DSEFOR0UgKGZhbGxzIGltIEludmVudG9yeSB2b24gTGViZXdlc2VuKQorCitEaWUgRWluc2F0em1vZWdsaWNoa2VpdGVuIHNlbnNpdGl2ZXIgT2JqZWt0ZSBzaW5kIHZpZWxmYWVsdGlnOgorCisgICAqIER5bmFtaXQga29lbm50ZSBqZXR6dCBTRU5TSVRJVkVfQVRUQUNLIG1pdCBEVF9GSVJFIHVuZCB6LkIuIEdyZW56d2VydAorICAgICAxNTAgaGFiZW4sIGRpZSBGdW5rdGlvbiB0cmlnZ2VyX3NlbnNpdGl2ZV9hdHRhY2soKSBzb2xsdGUgZGFubiB6LkIuIGRpZQorICAgICBadWVuZHNjaG51ciBhbnp1ZW5kZW4uLi4KKyAgICogQmVpIE5pdHJvZ2x5Y2VyaW4gZW50c3ByZWNoZW5kIG1pdCBEVF9CTFVER0VPTiwgZWluZW0gc2VociBrbGVpbmVuCisgICAgIEdyZW56d2VydCB1bmQgZWluZXIgdHJpZ2dlcl9zZW5zaXRpdmVfYXR0YWNrKCktRnVua3Rpb24sIGRpZSBCVU1NCisgICAgIG1hY2h0Li4uCisgICAqIEVzIHNvbGwgYXVjaCBEaW5nZSBnZWJlbiwgZGllIG1hbiBiZXNzZXIgTklDSFQgZ2xlaWNoemVpdGlnIGFtIGdsZWljaGVuCisgICAgIE9ydCBhdWZiZXdhaHJlbiBzb2xsdGUuLi4gRnVlciBzb2xjaGUgRGluZ2Ugc2luZCBTRU5TSVRJVkVfSU5WRU5UT1JZCisgICAgIHVuZCBTRU5TSVRJVkVfSU5WRU5UT1JZX1RSSUdHRVIgZGEuCisgICAqIFNFTlNJVElWRV9FTlZJUk9OTUVOVF9DSEFOR0UgaXN0IGRhZnVlciB2b3JnZXNlaGVuLCBkYXNzIE9iamVrdGUgaW0KKyAgICAgSW52ZW50b3J5IGVtcGZpbmRsaWNoIGF1ZiBUYXVjaGVuIG9kZXIgQXVmZW50aGFsdCBhbiBoZWlzc2VuIE9ydGVuIHVzdy4KKyAgICAgcmVhZ2llcmVuLCBkaWVzIGlzdCBqZWRvY2ggbm9jaCBpbiBQbGFudW5nLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBXZWQgTWF5IDggMTA6MDA6MjggMTk5NiBieSBXYXJnb24KZGlmZiAtLWdpdCBhL2RvYy93aXovc2hlcmlmZiBiL2RvYy93aXovc2hlcmlmZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmI4MzY2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dpei9zaGVyaWZmCkBAIC0wLDAgKzEsNDEgQEAKK1dhcyBpc3QgenUgdHVuLCB3ZW5uIGljaCBqZW1hbmRlbiBiZWkgZWluZW0gUmVnZWx2ZXJzdG9zcyBlcndpc2NoZT8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICBHcnVuZHNhZXR6bGljaCBzb2xsdGV0IGlociBkZW4gU2hlcmlmZiwgZWluZW4gZGVyIERlcHV0aWVzIG9kZXIKKyAgICAgICAgZWluZW4gRXJ6bWFnaWVyIGJlbmFjaHJpY2h0aWdlbi4KKworICAgICAgICBJc3Qga2VpbiBNYWdpZXIgYXVzIGRpZXNlciBHcnVwcGUgYW53ZXNlbmQgb2RlciBzaW5kIGRpZXNlIG5pY2h0CisgICAgICAgIGFuc3ByZWNoYmFyLCBzbyBlbXBmaWVobHQgc2ljaCBkaWUgZm9sZ2VuZGUgSGFuZGx1bmdzd2Vpc2UuCisKKyAgICAgICAgU3ByZWNodCBkZW4gU3BpZWxlciBhdWYgc2VpbiBGZWhsdmVyaGFsdGVuIGFuIHVuZCB3ZWlzdCBpaG4gZGFyYXVmCisgICAgICAgIGhpbiwgZGFzcyBkaWVzIGFuIGRlbiBTaGVyaWZmIGdlbWVsZGV0IHdpcmQsIGRhbWl0IGVyIGRpZQorICAgICAgICBHZWxlZ2VuaGVpdCBoYXQgc2VpbmUgU2ljaHQgZGVyIFNpdHVhdGlvbiBmZXN0enVoYWx0ZW4gdW5kCisgICAgICAgIGViZW5mYWxscyBhbiBkZW4gU2hlcmlmZiB6dSBzZW5kZW4uCisgICAgICAgIERpZXNlciBIaW53ZWlzIHNvbGx0ZSBkZXV0bGljaCBlcmZvbGdlbiB1bmQgYXVjaCBldmVudHVlbGxlIFRhdWItCisgICAgICAgIG9kZXIgQmxpbmRoZWl0IGJlcnVlY2tzaWNodGlnZW4sIGVzIGVtcGZpZWhsdCBzaWNoIHRlbGxfb2JqZWN0KCkKKyAgICAgICAgYnp3LiBlY2hvdG8genUgdmVyd2VuZGVuLgorCisgICAgICAgIFNvbGx0ZSBkZXIgU3BpZWxlciBuaWNodCByZWFnaWVyZW4gdW5kIG1pdCBzZWluZW0gVmVyaGFsdGVuIGFuZGVyZQorICAgICAgICBTcGllbGVyIGltIFNwaWVsIGJlZWludHJhZWNodGlnZW4sIHNvIHNvbGx0ZSBlciBuYWNoIC9yb29tL2phaWwKKyAgICAgICAgYmVmb2VyZGVydCB3ZXJkZW4uIFZlcndlbmRldCBkYXp1IGJpdHRlIGRpZSBNZXRob2RlIG1vdmUgaW0KKyAgICAgICAgUGxheWVyLCBhbnN0YXR0IGlucyBKYWlsIHp1IGdlaGVuIHVuZCBpaG4gZGFubiB6dSB0cmFuc2VuLiBCZWkKKyAgICAgICAgbGV0enRlcmVtIHNldHp0IElociBldWNoIHNlbGJzdCBmZXN0LgorCisgICAgICAgIEJpdHRlIHNlaHQgdm9uIFphcHMsIERpc2Nvbm5lY3RzIG9kZXIgQWVobmxpY2hlbSBhYiwgc293ZWl0IGFuZGVyZQorICAgICAgICBNb2VnbGljaGtlaXRlbiBibGVpYmVuLiBCZWkgZGVuLCBkdXJjaGF1cyBuaWNodCB1bnVlYmxpY2hlbiwKKyAgICAgICAgb2Jzem9lbmVuIExldmVsLTEtUnVmZXJuIGlzdCBlaW4gRGlzY29ubmVjdCBkdXJjaGF1cyBhbmdlYnJhY2h0LgorCisgICAgICAgIFNlbmRldCBkZW0gU2hlcmlmZiBlaW5lIGt1cnplIEJlc2NocmVpYnVuZyBkZXIgU2l0dWF0aW9uIHVuZCB3YXMKKyAgICAgICAgSWhyIHVudGVybm9tbWVuIGhhYnQuCisKKyAgICAgICAgQml0dGUgdWViZXJwcnVlZnQgc29yZ2ZhZWx0aWcgYmV2b3IgSWhyIGhhbmRlbHQsIG9iIGVzIHNpY2gKKyAgICAgICAgdWViZXJoYXVwdCB1bSBlaW5lbiBSZWdlbHZlcnN0b3NzIGhhbmRlbHQgdW5kIG9iIGRpZSBTaXR1YXRpb24KKyAgICAgICAgbmljaHQgYXVjaCBvaG5lIG9iaWdlIEVpbmdyaWZmZSBnZWtsYWVydCB3ZXJkZW4ga2Fubi4KKworCisgU0lFSEUgQVVDSDoKKyAgICBsZWl0ZmFkZW4KKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgV2VkLCAzMC4wOC4yMDAwLCAxMTozNTowMCB2b24gTXVhZGliCisKZGlmZiAtLWdpdCBhL2RvYy93aXovc2ltdWxfZWZ1bnMgYi9kb2Mvd2l6L3NpbXVsX2VmdW5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NzA4MDEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd2l6L3NpbXVsX2VmdW5zCkBAIC0wLDAgKzEsNDcgQEAKK0FsbGdlbWVpbiBudWV0emxpY2hlIHNpbXVsX2VmdW4nczoKKworZmlsZV90aW1lKHN0cmluZyBmaWxlbmFtZSkgbGllZmVydCBkaWUgQWNjZXNzdGltZSBkZXMgRmlsZXMgaW4gU2VrdW5kZW4gc2VpdAorCTEuMS4xOTcwIChkYXMga2FubiBtYW4gYWxzIGlucHV0IGZ1ZXIgY3RpbWUgb2RlciBkdGltZSB2ZXJ3ZW5kZW4pLgorCitxdWVyeV93aXpfbGV2ZWwobWl4ZWQgcGxheWVyKSBiZWtvbW10IGVpbmVuIFNwaWVsZXJuYW1lbiBvZGVyIGVpbiBTcGllbGVyLQorCU9iamVjdCBhbHMgYXJndW1lbnQgdW5kIGxpZWZlcnQgZGVuIE1hZ2llcmxldmVsIChzaWVoZSBhdWNoIAorCS9zZWN1cmUvd2l6bGV2ZWxzLmgpCisKK3F1ZXJ5X3dpel9ncnAobWl4ZWQgcGxheWVyKSB3aWUgcXVlcnlfd2l6X2xldmVsLCBsaWVmZXJ0IGFiZXIgZGllIE1hZ2llci0KKwlHcnVwcGUgKGF1Y2ggd2l6bGV2ZWxzLmgpCisKK21peGVkICpleGNsdWRlX2FycmF5KG1peGVkICphcnIsaW50IGZyb20saW50IHRvKSBsaWVmZXJ0IGRlbiBhcnJheSBvaG5lIGRpZQorCWFyclswLi5mcm9tLTFdK2Fyclt0bysxLi48MV0KKworbWl4ZWQgKnJlbW92ZV9hbGlzdChtaXhlZCBrZXksbWl4ZWQgKmFsaXN0KSBuaW1tdCBkYXMgRWxlbS4gbWl0IFNjaGx1ZXNzZWwKKwlrZXkgYXVzIGRlciBBbGlzdCBoZXJhdXMuCisKK21peGVkICpleGNsdWRlX2FsaXN0KGludCBpLG1peGVkICphbGlzdCkgbmltbXQgZGFzIEVsZW1lbnQgbWl0IGRlciBOdW1tZXIgaQorCWF1cyBkZXIgQWxpc3QuCisKK3N0cmluZyBkdGltZShpbnQgd2Fubikgd2llIGN0aW1lLCBhYmVyIGRldXRzY2ggKG1hY2h0IGF1cyBkZXIgWmFobCwgZGllIHRpbWUKKwl1c3cgbGllZmVybiwgZWluZW4gbGVzYmFyZW4gU3RyaW5nKQorCit2YXJhZ3Mgc3RyaW5nCisJYnJlYWtfc3RyaW5nKHN0cmluZyBzdHIsIGludCB3aWR0aCwgbWl4ZWQgaW5kZW50LCBpbnQgbGVhdmVfbXlfbGZzKQorCWJyaWNodCBlaW5lbiBTdHJpbmcgdW0gYXVmIFdlaXRlIHdpZHRoLCBtYW4ga2FubiBlaW5lbiBpbmRlbnQtU3RyaW5nCisJYW5nZWJlbiwgZGVyIHZvciBqZWRlbiBUZWlsc3RyaW5nIGdlaGFlbmd0IHdpcmQsIG9kZXIgYXVjaCBlaW5lIFphaGwKKwlkYW5uIHdlcmRlbiBlbnRzcHJlY2hlbiB2aWVsZSBMZWVyemVpY2hlbiBkb3J0aGluIGdlaGFlbmd0LiBEZXIgbGV0enRlCisJUGFyYW1ldGVyIGxlZ3QgZmVzdCwgb2IgYmVyZWl0cyBleGlzdGllcmVuZGUgTGluZWZlZWRzIGVyaGFsdGVuIGJsZWliZW4KKwlvZGVyIG5pY2h0LgorCitzdHJpbmcgdXB0aW1lKCkgbGllZmVydCBnZW5hdSBkaWVzZSBpbiBsZXNiYXJlciBGb3JtLgorCitwdWJsaWMgb2JqZWN0ICphbGxfZW52aXJvbm1lbnQob2JqZWN0IG9iKSBsaWVmZXJ0IGVpbmVuIEFycmF5IG1pdCBkZW0gcmUtCisJa3Vyc2l2ZW4gRW52aXJvbm1lbnQgKGRlbiBCZXV0ZWwsIGluIGRlbSBvYiBzdGVja3QsIGRlbiBTcGllbGVyLAorCWRlciBkZW4gQmV1dGVsIHRyYWVndCwgdW5kIGRlbiBSYXVtLCBpbiBkZW0gc2ljaCBkZXIgU3BpZWxlciBhdWZoYWVsdC4KKwordmFyYXJncyBtaXhlZCBtYXRjaF9saXZpbmcoc3RyaW5nIHN0ciwgaW50IHBsYXllcnNfb25seSkKKwliZWtvbW10IGVpbmVuIFN0cmluZy4gRmFsbHMgZGVyIEdFTkFVIGRlbSBOYW1lbiBlaW5lcyBuaWNodCBuZXR6dG90ZW4KKwlTcGllbGVycyBlbnRzcHJpY2h0LCBiZWtvbW10IG1hbiBkZW4uIEZhbGxzIGVyIGdlbmF1IGRlbSBOYW1lbiBlaW5lcworCU1vbnN0ZXJzIGVudHNwcmljaHQgdW5kIG1hbiBuaWNodCBwbGF5ZXJzX29ubHkhPTAgYW5nZWdlYmVuIGhhdCwKKwlsaWVmZXJ0IGVyIGRlbiBOYW1lbiBkZXMgTW9uc3RlcnMuIEFuc29uc3RlbiBzdWNodCBlciBuYWNoIGVpbmVtIAorCVNwaWVsZXIsIGRlc3NlbiBOYW1lIG1pdCBzdGQgYW5mYWVuZ3QuIEdpYnQgZXMga2VpbmVuLCByZXR1cm5lZAorCWVyIGVpbmUgLTIsIGdpYnQgZXMgbWVociBhbHMgZWluZW4sIGVpbmUgLTEsIGJlaSBnZW5hdSBlaW5lbSBkZW4KKwlOYW1lbi4KKwpkaWZmIC0tZ2l0IGEvZG9jL3dpei9za2lsbHMuZG9jIGIvZG9jL3dpei9za2lsbHMuZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NWIzODMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd2l6L3NraWxscy5kb2MKQEAgLTAsMCArMSw3NyBAQAorIFNraWxscyBzaW5kIEZlcnRpZ2tlaXRlbiwgZGllIGVpbiBTcGllbGVyIGVyd2VyYmVuIGthbm4uIFp1IGVpbmVtIFNraWxsIGtvZW5uZW4KK21laHJlcmUgVmVyYmVuIGdlaG9lcmVuLiBBdXNzZXJkZW0ga2FubiBlaW4gVmVyYiB1bnRlciBVbXN0YWVuZGVuIGJlaSBtZWhyZXJlbgorU2tpbGxzIGRlZmluaWVydCBzZWluICh6QiwgZmFsbHMgZXMgZWluZSBNYWdpZXJnaWxkZSB1bmQgZWluZSBQc2lvbmtpZXItCitnaWxkZSBnYWViZSwga29lbm50ZSBlcyBza2lsbHMgIm1hZ2llIiB1bmQgInBzaSIgZ2ViZW4sIGRpZSBiZWlkZSBkYXMKK1ZlcmIgInRlbGVwb3J0aWVyZSIgZGVmaW5pZXJlbikuCisKKyBXZWxjaGUgU2tpbGxzIGVzIGdpYnQsIHdlbGNoZSBWZXJiZW4gZGF6dWdlaG9lcmVuLCB3ZWxjaGUgT2JqZWt0ZSB1bmQKK0Z1bmt0aW9uZW4gZGllc2VuIHp1Z2VvcmRuZXQgc2luZCwgcmVnZWx0IGVpbiB6ZW50cmFsZXIgIlNraWxsbWFzdGVyIi4KK0RhcnVlYmVyaGluYXVzIGdpYnQgZXMgaW4gamVkZW0gU3BpZWxlcm9iamVrdCBlaW4gIlNraWxsIi1Nb2R1bC4KKworRGVyIFNraWxsbWFzdGVyIG9mZmVyaWVydCBkaWUgZm9sZ2VuZGVuIEZ1bmt0aW9uZW46CisKK0luc2VydFNraWxsKHN0cmluZyBza2lsbG5hbWUsIHN0cmluZyBza2lsbGRlc2NyLCBzdHJpbmcgKnZlcmJlbiwKKyAgICAgICAgICAgIHN0cmluZyAqb2JqRnVuRGVzY3IpCisgc2tpbGxuYW1lIGlzdCAobmF0dWVybGljaCkgZGVyIE5hbWUgZGVzIFNraWxscyAoekIgTWFnaWUpLgorIHNraWxsZGVzY3IgaXN0IGVpbiBzdHJpbmcsIGRlciBkZW4gU2tpbGwgbmFlaGVyIGJlc2NocmVpYnQsIHpCCisgICAgICAgICAgICAiTWFnaWUgZ2lidCBkZW0gQW53ZW5kZXIgZWluIGJyZWl0ZXMgU3Bla3RydW0gdm9uIE1vZWdsaWNoa2VpdGVuLAorICAgICAgICAgICAgIHNvd29obCBpbSBLYW1wZiBhbHMgYXVjaCBhdXNzZXJoYWxiLiIKKyB2ZXJiZW4gaXN0IGVpbiBBcnJheSwgZGVyIGRpZSBWZXJiZW4genUgZGVtIFNraWxsIGVudGhhZWx0LgorIG9iakZ1bkRlc2NyIGlzdCBlaW4gQXJyYXksIGRlciBkaWVzZWxiZSBHcm9lc3NlIGhhYmVuIG11c3Mgd2llIFZlcmJlbi4gSmVkZXMKKyAgICAgICAgICAgICBFbGVtZW50IGlzdCBlaW4gNC1lbGVtZW50aWdlciBBcnJheS4gRXJzdGVzIEVsZW1lbnQgZGllc2VzIEFycmF5cworICAgICAgICAgICAgIGlzdCBlaW4gRmlsZW5hbWUsIHp3ZWl0ZXMgZWluZSBGdW5rdGlvbi4gQmVpIGRlciBFaW5nYWJlIGRlcyBWZXJicworICAgICAgICAgICAgIHdpcmQgaW4gZGVtIE9iamVrdCBkaWUgRnVua3Rpb24gYXVmZ2VydWZlbi4gRGllIGRhYmVpIHVlYmVyZ2ViZW5lbgorICAgICAgICAgICAgIFBhcmFtZXRlciB3ZXJkZW4gc3BhZXRlciBiZXNjaHJpZWJlbi4KKyAgICAgICAgICAgICBEcml0dGVzIEVsZW1lbnQgaXN0IGVpbiBTdHJpbmcsIGRlciBkaWUgenUgZGllc2VtIFZlcmIgdW5kIFNraWxsCisgICAgICAgICAgICAgZ2Vob2VyZW5kZSBBa3Rpb24gbmFlaGVyIGJlc2NocmVpYnQsIHpCOgorICAgICAgICAgICAgICJEaWUgTWFnaXNjaGUgUmFrZXRlIGtvc3RldCBkZW4gR2VnbmVyIHp3aXNjaGVuIDUgdW5kIDEwIEhpdHBvaW50cyIKKyAgICAgICAgICAgICBEYXMgNC4gRWxlbWVudCBtdXNzIGVpbmUgWmFobCBhdXMgWzEuLjE5XSBzZWluIHVuZCBnaWJ0IGRlbiBMZXZlbAorICAgICAgICAgICAgIGFuLCBhYiBkZW0gZWluIFBsYXllciBkaWVzZXMgU2tpbGx2ZXJiIGVyd2VyYmVuIGthbm4uCisgRGllIEZ1bmt0aW9uIGRhcmYgbnVyIHZvbiBFcnptYWdpZXJuIGF1ZmdlcnVmZW4gd2VyZGVuLgorIEVzIGRhcmYgbm9jaCBrZWluZW4gU2tpbGwgZGllc2VzIE5hbWVzIGdlYmVuLiBGYWxscyBtYW4gZWluZW4gYmVzdGVoZW5kZW4KKyBTa2lsbCBsZWRpZ2xpY2ggZXJ3ZWl0ZXJuIG1vZWNodGUsIG11c3MgbWFuIGRpZSBGdW5rdGlvbiBBZGRWZXJicyBiZW51dHplbgorIChzaWVoZSB1bnRlbikuCisKK1JlbW92ZVNraWxsKHNraWxsbmFtZSkKKyBlbnRmZXJudCBlaW5lbiBTa2lsbCB3aWVkZXIuIEFDSFRVTkc6IFdlbm4gUGxheWVyIGRlbiBTa2lsbCBiZXJlaXRzIGVyd29yYmVuCisgaGFiZW4sIHZlcmxpZXJlbiBzaWUgaWhuLCB3ZW5uIHNpZSB6dW0gbmFlY2hzdGVuIG1hbCB2ZXJzdWNoZW4sIGlobiB6dSBiZS0KKyBudXR6ZW4uCisKK0dldFNraWxscygpCisgZ2lidCBkaWUgQUxpc3QgbWl0IGRlbiBTa2lsbHMgenVydWVjay4KKworR2V0U2tpbGwoc2tpbGxuYW1lKQorIGxpZWZlcnQgZGVuIGVudHNwcmVjaGVuZGVuIEVpbnRyYWcgYXVzIGRlciBBTGlzdCB6dXJ1ZWNrLgorCitHZXRGdW5jdGlvbkFuZERlc2NyaXB0aW9uKHNraWxsbmFtZSwgdmVyYikKKyBsaWVmZXJ0IGRlbiBpbiBBZGRTa2lsbCB1ZWJlcmdlYmVuZW4gNGVsZW1lbnRpZ2VuIEFycmF5IG1pdCBPYmpla3RuYW1lLAorIEZ1bmt0aW9uc25hbWUsIEFrdGlvbnNiZXNjaHJlaWJ1bmcgdW5kIExldmVsIHp1cnVlY2suCisKK0dldFNraWxsRGVzY3JpcHRpb24oc2tpbGxuYW1lKQorIGxpZWZlcnQgZGllIGluIEFkZFNraWxsIHVlYmVyZ2ViZW5lIEJlc2NocmVpYnVuZyBkZXMgU2tpbGxzIHp1cnVlY2suCisKK0FkZFZlcmJzKHNraWxsbmFtZSwgbWl4ZWQgKnZlcmJzLCBtaXhlZCAqb2JqRnVuRGVzY3IpCisgZXJ3ZWl0ZXJ0IGVpbmVuIGJlc3RlaGVuZGVuIFNraWxsIHVtIGVpbmlnZSBWZXJiZW4sIG5hZWhlcmUgQmVzY2hyZWlidW5nCisgc2llaGUgQWRkU2tpbGwuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0RhcyBTa2lsbG1vZHVsIGltIFBsYXllcm9iamVrdCBiaWV0ZXQgZGllIGZvbGdlbmRlbiBGdW5rdGlvbmVuOgorCitHaXZlQWJpbGl0eSh2ZXJiLCBza2lsbCwgaW50IHByb21pbGwpCisgZ2lidCBlaW5lbSBTcGllbGVyIGRpZSBGYWVoaWdrZWl0LCBkYXMgVmVyYiB2ZXJiIGF1cyBkZW0gU2tpbGwgc2tpbGwgenUgYmVudXQtCisgemVuLiBQcm9taWxsIHdpcmQgYmVpIGRlbSBWZXJzdWNoLCBkYXMgVmVyYiB6dSBiZW51dHplbiwgYW4gZGFzIFNraWxsb2JqZWt0CisgdWViZXJnZWJlbiB1bmQgc29sbHRlIGRpZSBXYWhyc2NoZWlubGljaGtlaXQsIGRhcyBkZW0gUGxheWVyIGRpZSBTa2lsbGFrdGlvbgorIGdlbGluZ3QsIGluIFByb21pbGwgYmVzY2hyZWliZW4uIFdlbm4gZGVyIFBsYXllciBkaWUgQWJpbGl0eSBzY2hvbiBoYXR0ZSwgd2lyZAorIGxlZGlnbGljaCBwcm9taWxsIGdldXBkYXRlZC4KKyBFcyB3aXJkIGVpbmUgLTEgenVydWVja2dlZ2ViZW4sIGZhbGxzIGVpbmUgc29sY2hlIEtvbWJpbmF0aW9uIGF1cyBTa2lsbCB1bmQKKyBWZXJiIChub2NoKSBuaWNodCBkZWZpbmllcnQgaXN0LCBlaW5lIC0yIGZhbGxzIGRlciBMZXZlbCBkZXMgU3BpZWxlcnMgbmljaHQKKyBhdXNyZWljaHQuCisKK0dldEFsbEFiaWxpdGllcygpCisgZ2lidCBkaWUgQUxpc3QgbWl0IGRlbiBBYmlsaXRpZXMgZGVzIFNwaWVsZXJzIHp1cnVlY2suIFNjaGx1ZXNzZWwgaW4gZGVyIEFMaXN0Cisgc2luZCBkaWUgVmVyYmVuLCBFaW50cmFlZ2Ugc2luZCBBcnJheXMgbWl0IGRlbiBTa2lsbHMuIERpZSBBcnJheXMgaGFiZW4gc28KKyB2aWVsZSBFaW50cmFlZ2UsIHdpZSBkZXIgUGxheWVyIFNraWxscyBoYXQsIGRpZSBkYXMgYmV0cmVmZmVuZGUgV29ydAorIGRlZmluaWVyZW4gKGltIElkZWFsZmFsbCBhbHNvIEVJTkVOIEVpbnRyYWcsIG5hZW1saWNoIHdlbm4gZXMga2VpbmUgVWViZXItCisgc2NoZWlkdW5nZW4gZ2lidCkuIERpZSBFaW50cmFlZ2Ugc2luZCB3aWVkZXJ1bSAyZWxlbWVudGlnZSBBcnJheXMsIGRpZQorIGFscyAxLiBFbGVtZW50IGRlbiBTa2lsbG5hbWVuLCBhbHMgMi4gRWxlbWVudCBkaWUgUHJvbWlsbCBlbnRoYWx0ZW4uCisKZGlmZiAtLWdpdCBhL2RvYy93aXovc3FsaXRlZGIgYi9kb2Mvd2l6L3NxbGl0ZWRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YTdkY2UKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd2l6L3NxbGl0ZWRiCkBAIC0wLDAgKzEsMTQgQEAKK1NRTGl0ZS1EQnMgaW0gTW9yZ2VuZ3JhdWVuCisKK0ltIE1HIGtvZW5uZW4gT2JqZWt0ZSBzcWxpdGUtRGF0ZW5iYW5rZW4gdmVyd2VuZGVuLgorRGllIG5vdHdlbmRpZ2VuIGVmdW5zIGRhZnVlciBzaW5kIHNsX29wZW4sIHNsX2Nsb3NlLCBzbF9leGVjLCBzbF9pbnNlcnRfaWQuCisKK0hhdCBtYW4gZGFzIFNwZWljaGVyZmlsZSAoU2F2ZWZpbGUpIGRlciBEQiwga2FubiBtYW4gZGllc2VzIG1pdCBkZW0gS29tbWFuZG8KK3NxbGl0ZTMgYXVmIGVpbmVyIFNoZWxsIGF1Y2ggZGlyZWt0IGFiZnJhZ2VuOgorCitBdWYgZGVyIFNoZWxsIGZyYWd0IG1hbiBkaWUgREIgcmVjaHQgc2ltcGVsIHNvIGFiOgorc3FsaXRlMyAtY29sdW1uIC1oZWFkZXIgPHBmYWRfenVyX2RiPgorCitBbGxlcyBhdXMgZWluZXIgVGFiZWxsZSBhbnplaWdlbiwgd28gZWluZSBTcGFsdGUgZWluZW4gYmVzdGltbXRlbiBXZXJ0IGhhdDoKK3NlbGVjdCAqIGZyb20gPHRhYmVsbGU+IHdoZXJlIDxzcGFsdGU+PSdhYmMnOworCmRpZmYgLS1naXQgYS9kb2Mvd2l6L3RlYW1rYW1wZiBiL2RvYy93aXovdGVhbWthbXBmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZmM5MzQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd2l6L3RlYW1rYW1wZgpAQCAtMCwwICsxLDExMyBAQAorCitUZWFta2FtcGYgaW0gTW9yZ2VuR3JhdWVuCis9PT09PT09PT09PT09PT09PT09PT09PT09CisKK1p1bSBUZWFta2FtcGYgaW0gTUcgZ2Vob2VyZW4gendlaSBPYmpla3RlOiBEYXMgTGViZXdlc2VuLCBkYXMgaW0gVGVhbSBpc3QsCitzb3dpZSBkYXMgVGVhbW9iamVrdC4gRXJzdGVyZXMgZXJidCBzZWluZSBGdW5rdGlvbmFsaXRhZXQgYXVzCisKKy9zdGQvbGl2aW5nL3RlYW0uYworCitkYXMgVGVhbW9iamVrdCBpc3QgZWluIGNsb25lIHZvbgorCisvb2JqL3RlYW0uYworCitBbGxlcmRpbmdzIHNvbGx0ZSBtYW4gaW1tZXIgZGFzICNkZWZpbmUgZnVlciBkaWVzZW4gUGZhZCBudXR6ZW4sIHdlbGNoZXMKK2luIC9zeXMvbGl2aW5nL3RlYW0uaCBkZWZpbmllcnQgaXN0OiBURUFNX09CSkVDVAorCitEYXJ1ZWJlcmhpbmF1cyBnaWJ0IGVzIGluIGRpZXNlbSBWZXJ6ZWljaG5pcyBub2NoIGRlbiBUZWFtbWFzdGVyLgorCisKK0FsbGUgcmVsZXZhbnRlbiBGdW5rdGlvbmVuIHVuZCBQcm9wZXJ0aWVzIHNpbmQgaW0gVGVhbW1pdGdsaWVkIGFicnVmYmFyIHVuZAorbGllZmVybiBJbmZvcm1hdGlvbmVuIHVlYmVyIGRlbiBUZWFta2FtcGYuCisKKworVUVCRVJTSUNIVCB1ZWJlciBkaWUgUHJvcGVydGllcyB1bmQgRnVua3Rpb25lbiBkZXMgVGVhbWthbXBmcworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitQcm9wZXJ0aWVzIGRlcyBUZWFtbWl0Z2xpZWRzOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUF9URUFNICAgICAgICAgICAgICAgICAtIFRlYW1vYmpla3QKK1BfVEVBTV9ORVdNRU1CRVIgICAgICAgLSBTcGllbGVyIG1vZWNodGUgaW5zIFRlYW0gaGllcnZvbiBhdWZnZW5vbW1lbiB3ZXJkZW4uCitQX1RFQU1fQVRUQUNLX0NNRCAgICAgIC0gQW5ncmlmZnNiZWZlaGwgZGVzIFNwaWVsZXJzLCBuaWNodCBzZXR6YmFyLgorUF9URUFNX0FVVE9GT0xMT1cgICAgICAtIEZvbGdld3Vuc2NoIGRlcyBTcGllbGVycywgbmljaHQgc2V0emJhci4KK1BfVEVBTV9XQU5URURfUk9XICAgICAgLSBHZXd1ZW5zY2h0ZSBSZWloZSBkZXMgU3BpZWxlcnMuCitQX1RFQU1fV0lNUFlfUk9XICAgICAgIC0gRmx1Y2h0cmVpaGUgZGVzIFNwaWVsZXJzLgorUF9URUFNX0xFQURFUiAgICAgICAgICAtIFNwaWVsZXIgaXN0IEFuZnVlaHJlciBkaWVzZXMgVGVhbXMuCitQX1RFQU1fQVNTT0NfTUVNQkVSUyAgIC0gQWxsZSB6dWdlb3JkbmV0ZW4gTlBDcyBiencuIGRlciBTcGllbGVyIGRlbSBkaWVzZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICBOUEMgenVnZW9yZG5ldCBpc3QuCitQX1RFQU1fQ09MT1JTICAgICAgICAgIC0gR3Jlbnp3ZXJ0ZSBmdWVyIGZhcmJpZ2UgQW56ZWlnZS4KKworRnVua3Rpb25lbiBkZXMgVGVhbW1pdGdsaWVkczoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RlYW1QcmVmaXgoKSAgICAgICAgICAgLSAiW1RlYW0gVGVhbW5hbWVdICIgZmFsbHMgVGVhbW1pdGdsaWVkLCAiIiBzb25zdC4KK0lzVGVhbUxlYWRlcigpICAgICAgICAgLSBUZXN0IG9iIFNwaWVsZXIgQW5mdWVocmVyIGVpbmVzIFRlYW1zIGlzdC4KK0lzVGVhbU1vdmUoKSAgICAgICAgICAgLSBUZXN0IG9iIEFuZ3JpZmZzYmV3ZWd1bmcgZ2VyYWRlIGF1c2dlZnVlaHJ0IHdpcmQuCitUZWFtTWVtYmVycygpICAgICAgICAgIC0gVGVhbW1pdGdsaWVkZXIuCitQcmVzZW50UG9zaXRpb24oKSAgICAgIC0gQWt0dWVsbGUgUmVpaGVubnVtbWVyIGRlcyBTcGllbGVycy4KK1ByZXNlbnRUZWFtUG9zaXRpb25zKCkgLSBSZWloZW5udW1tZXJuIGFsbGVyIGFud2VzZW5kZW4gVGVhbW1pdGdsaWVkZXIuCitQcmVzZW50VGVhbVJvd3MoKSAgICAgIC0gUmVpaGVuIGFsbGVyIGFud2VzZW5kZW4gVGVhbW1pdGdsaWVkZXIuCitQcmVzZW50RW5lbXlSb3dzKCkgICAgIC0gUmVpaGVuIGFsbGVyIGFud2VzZW5kZW4gRmVpbmR0ZWFtcyB6dXNhbW1lbi4KK1NlbGVjdE5lYXJFbmVteSgpICAgICAgLSBXYWVobHQgZGlyZWt0IGFuZ3JlaWZiYXJlbiBGZWluZCBhdXMuCitTZWxlY3RGYXJFbmVteSgpICAgICAgIC0gV2FlaGx0IEZlaW5kIGF1cyBoaW50ZXJlbiBSZWloZW4gYXVzLgorSW5zZXJ0RW5lbXlUZWFtKCkgICAgICAtIE1hY2h0IGFsbGUgTWl0Z2xpZWRlciB2b24gVGVhbSBkZXMgRmVpbmRlcyB6dQorICAgICAgICAgICAgICAgICAgICAgICAgIEZlaW5kZW4gYWxsZXIgTWl0Z2xpZWRlciBkZXMgZWlnZW5lbiBUZWFtcy4KK0Fzc29jTWVtYmVyKCkgICAgICAgICAgLSBBc3NvemlpZXJ0IGVpbmVuIEhpbGZzTlBDIG1pdCBlaW5lbSBTcGllbGVyLgorRGVBc3NvY01lbWJlcigpICAgICAgICAtIEhlYnQgQXNzb3ppYXRpb24gendpc2NoZW4gTlBDIHVuZCBTcGllbGVyIGF1Zi4KK1RlYW1GbGVlKCkgICAgICAgICAgICAgLSBTcGllbGVyIHdpcmQgdmVyYW5sYXNzdCBpbiBGbHVjaHRyZWloZSB6dSB3ZWNoc2Vsbi4KKworRnVua3Rpb25lbiBkZXMgVGVhbW9iamVrdHM6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU3dhcFJvd3MoKSAgICAgICAgICAgICAtIFNwaWVsZXIgdGF1c2NoZW4gZGllIFJlaWhlbgorCisKK0JFSVNQSUVMOgorICBNYW4gbW9lY2h0ZSB2b24gZWluZW0gU3BpZWxlciwgd2VsY2hlciBzaWNoIGluIGVpbmVtIFRlYW0gYmVmaW5kZXQsIGFsbGUKKyAgVGVhbW1pdGdsaWVkZXIgc293aWUgZGVyZW4gQW56YWhsIGVybWl0dGVsbiwgZGllIFZPUiBkaWVzZW0gU3BpZWxlciBzdGVoZW4uCisKKyAgSW0gYWJmcmFnZW5kZW4gT2JqZWt0IG11c3MgbWFuIHp1bmFlY2hzdCBkaWUgSGVhZGVyZGF0ZWkgZGVzIFRlYW1rYW1wZnMKKyAgaW5jbHVkZW46CisKKyAgI2luY2x1ZGUgIi9zeXMvbGl2aW5nL3RlYW0uaCIKKworCisgIHZvaWQgZnVuKCBvYmplY3QgcGwgKQorICB7CisgICBpbnQgYWN0X3JvdyxhbGw7CisgICBtaXhlZCAqcm93czsKKyAgIG9iamVjdCB0ZWFtLCp0ZWFtX21lbWJlcnM7CisKKyAgIHRlYW09cGwtPlF1ZXJ5UHJvcChQX1RFQU0pOyAgICAgICAgICAgLy8gbGllZmVydCBkYXMgVGVhbW9iamVrdAorCisgICBhY3Rfcm93PXBsLT5QcmVzZW50UG9zaXRpb24oKTsgICAgICAgIC8vIGFrdHVlbGxlIFBvc2l0aW9uIGVybWl0dGVsbgorCisgICB0ZWFtX21lbWJlcnM9KHt9KTsKKworICAgaWYgKCBvYmplY3RwKHRlYW0pICYmIChhY3Rfcm93ID4gMSkgKQorICAgIHsKKyAgICAgcm93cz10ZWFtLT5QcmVzZW50Um93cyhFTlYocGwpKTsgICAgLy8gZGllIFJlaWhlbiB3ZXJkZW4gYWxzIG1peGVkLWFycmF5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVlYmVyZ2ViZW4KKworICAgICBmb3JlYWNoICggaW50IGkgOiBhY3Rfcm93ICkKKyAgICAgIHRlYW1fbWVtYmVycys9cm93c1tpXTsgICAgICAgICAgICAgLy8gZGllIFJlaWhlbiB3ZXJkZW4ga29tcGxldHQgaW5zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ldWUgQXJyYXkgdWViZXJ0cmFnZW4KKyAgICB9CisKKyAgIGFsbD1zaXplb2YodGVhbV9tZW1iZXJzKTsgICAgICAgICAgICAgLy8gQW56YWhsIGRlciBUZWFtbWl0Z2xpZWRlciwgZGllCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZvciBkZW0gU3BpZWxlciBzdGVoZW4KKyAgfQorCisKK1NJRUhFIEFVQ0g6CisgICAgICAgIFByb3BlcnRpZXM6IFBfVEVBTSwgUF9BU1NPQ19NRU1CRVJTLCBQX1RFQU1fQVRUQUNLX0NNRCwKKyAgICAgICAgICAgICAgICAgICAgUF9URUFNX0FVVE9GT0xMT1csIFBfVEVBTV9DT0xPUlMsIFBfVEVBTV9MRUFERVIsCisgICAgICAgICAgICAgICAgICAgIFBfVEVBTV9ORVdNRU1CRVIsIFBfVEVBTV9XQU5URURfUk9XLCBQX1RFQU1fV0lNUFlfUk9XCisgICAgICAgIEJld2VndW5nOiAgIElzVGVhbU1vdmUsIFRlYW1GbGVlCisgICAgICAgIE1pdGdsaWVkZXI6IElzVGVhbUxlYWRlciwgVGVhbU1lbWJlcnMKKyAgICAgICAgS2FtcGY6ICAgICAgQXNzb2NNZW1iZXIsIERlQXNzb2NNZW1iZXIsIEluc2VydEVuZW15VGVhbQorICAgICAgICAgICAgICAgICAgICBTZWxlY3ROZWFyRW5lbXksIFNlbGVjdEZhckVuZW15CisgICAgICAgIFBvc2l0aW9uZW46IFByZXNlbnRQb3NpdGlvbiwgUHJlc2VudFJvd3MsIFByZXNlbnRFbmVteVJvd3MsCisgICAgICAgICAgICAgICAgICAgIFByZXNlbnRUZWFtUG9zaXRpb24sIFN3YXBSb3dzCisgICAgICAgIFNvbnN0aWdlczogIFRlYW1QcmVmaXgsIHRlYW1rYW1wZl9pbnRlcm4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogMTYtMDgtMjAxMCwgR2FieWxvbgpkaWZmIC0tZ2l0IGEvZG9jL3dpei90ZWFta2FtcGZfaW50ZXJuIGIvZG9jL3dpei90ZWFta2FtcGZfaW50ZXJuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YzI5NjMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd2l6L3RlYW1rYW1wZl9pbnRlcm4KQEAgLTAsMCArMSwxMjcgQEAKKworVGVhbWthbXBmLUludGVybmEKKz09PT09PT09PT09PT09PT09CisKK1ZlcndhbHR1bmcgZGVyIEthbXBmcmVpaGVuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitEaWUgVW1vcmRudW5nIGRlciBUZWFtbWl0Z2xpZWRlciB3aXJkIGR1cmNoIGRpZSBGb3JtYXRpb24gZ2VzdGV1ZXJ0LgorCisgIGZvcm1pbltyZWloZV0gLSBNaW5pbWFsZSBBbnphaGwgdm9uIFRlYW1taXRnbGllZGVybiBpbiBkaWVzZXIgUmVpaGUKKyAgZm9ybWF4W3JlaWhlXSAtIE1heGltYWxlIEFuemFobCB2b24gVGVhbW1pdGdsaWVkZXJuIGluIGRpZXNlciBSZWloZQorCitEaWUgRnVua3Rpb24gQ2hlY2tGb3JtYXRpb24oKSBwYXNzdCBkaWUgV2VydGUgc28gYW4sIGRhc3Mgc2llIGJlaSBBbndlc2VuaGVpdAorYWxsZXIgVGVhbW1pdGdsaWVkZXIgZXJmdWVsbGJhciBzaW5kLCB3b2JlaSBnZ2YuIGRlciBNYXhpbWFsd2VydCB2b3JuZQorYW5mYW5nZW5kIGVyaG9laHQgd2lyZCB1bmQgZGVyIE1pbmltYWx3ZXJ0IGhpbnRlbiBhbmZhbmdlbmQgdmVycmluZ2VydCB3aXJkLgorRGFiZWkgaXN0IGRlciBNaW5pbWFsd2VydCBkZXIgZXJzdGVuIFJlaWhlIDEuCisKK0VzIGlzdCB6d2lzY2hlbiBkZXIgVGVhbWF1ZnN0ZWxsdW5nIHVuZCBkZXIgUmF1bWF1ZnN0ZWxsdW5nIHp1IHVudGVyc2NoZWlkZW4uCitEaWUgVGVhbWF1ZnN0ZWxsdW5nIGlzdCBkaWUgQXVmc3RlbGx1bmcsIGluIGRlciBkaWUgTWl0Z2xpZWRlciBhbmdlb3JkbmV0Cit3YWVyZW4sIHdlbm4gYWxsZSBhbndlc2VuZCB3YWVyZW4uIEluIGRlciBUZWFtYXVmc3RlbGx1bmcgaXN0IGR1cmNoIGRpZQorRnVua3Rpb24gTWFrZUZvcm1hdGlvbigpIHNpY2hlcmdlc3RlbGx0LCBkYXNzIGRpZSBNaW5pbWFsLSB1bmQKK01heGltYWxhbmZvcmRlcnVuZ2VuIGVyZnVlbGx0IHNpbmQuCitEaWUgUmF1bWF1ZnN0ZWxsdW5nIGVyZ2lidCBzaWNoIGF1cyBkZW4gYW53ZXNlbmRlbiBNaXRnbGllZGVybiBkZXIKK1RlYW1hdWZzdGVsbHVuZy4gU29sbHRlbiBkaWUgTWluaW1hbGFuZm9yZGVydW5nZW4gZWluZXIgdm9yZGVyZW4gUmVpaGUgbmljaHQKK2VyZnVlbGx0IHNlaW4sIHdlcmRlbiBhbndlc2VuZGUgTWl0Z2xpZWRlciBhdXMgZGVuIGhpbnRlcmVuIFJlaWhlbiBJTiBERVIKK1JBVU1BVUZTVEVMTFVORyBuYWNoIHZvcm5lIGdlc2Nob2JlbiBzb3dlaXQgbm9ldGlnLgorCitWb3IgVmVyc2NoaWVidW5nZW4gdW5kIGJlaSBVcGRhdGVzIGRlciBURUFNQVVGU1RFTExVTkcgd2VyZGVuIGRpZSBBcnJheXMgbWl0CitkZW4gTWl0Z2xpZWRlcm4gamVkZXIgUmVpaGUgc29ydGllcnQsIHdvYmVpIGRpZSBnZXd1ZW5zY2h0ZSBSZWloZSBkZXIKK01pdGdsaWVkZXIgZGFzIGdyb2Vzc3RlIEdld2ljaHQgKDEyNSkgaW0gU29ydGllcmtyaXRlcml1bSBoYXQgdW5kIGRpZSBBbnphaGwKK2RlciBMZWJlbnNwdW5rdGUgZWluZmFjaCBlaW5nZWh0LiBTb2xhbmdlIGRpZSBUZWFtbWl0Z2xpZWRlciB1bnRlciAyNTAgTFAKK2hhYmVuLCBrYW5uIGVpbiBNaXRnbGllZCBtaXQgd2VuaWdlbiBMUCBoaW50ZXIgZWluZW0gbWl0IHZpZWxlbiBMUCBlaW5zb3J0aWVydAorc2VpbiwgZGVyIEVJTkUgUmVpaGUgd2VpdGVyIGhpbnRlciBzdGVoZW4gd2lsbCwgYWJlciBuaWNodCB6d2VpIG9kZXIgbWVoci4KK1dpcmQgZXMgbm9ldGlnLCBNaXRnbGllZGVyIGF1cyBlaW5lciBSZWloZSBpbiBlaW5lIGFuZGVyZSB6dSB2ZXJzY2hpZWJlbiwKK3dlcmRlbiBNaXRnbGllZGVyIHZvbSBBbmZhbmcgZGVzIEFycmF5cyBuYWNoIHZvcm5lIHZlcnNjaG9iZW4gKGFuIGRhcyBFbmRlCitkZXMgZGF2b3JsaWVnZW5kZW4gQXJyYXlzKSBiencuIE1pdGdsaWVkZXIgdm9tIEVuZGUgZGVzIEFycmF5cyBuYWNoIGhpbnRlbgorKGFuIGRlbiBBbmZhbmcgZGVzIGRhaGludGVybGllZ2VuZGVuIEFycmF5cykuIERhZHVyY2ggd2VyZGVuIGltbWVyIGRpZQorTWl0Z2xpZWRlciBtaXQgZGVtIHN0YWVya3N0ZW4gRHJhbmcgbmFjaCB2b3JuZSBhbiBkaWUgRnJvbnQgZ2VzY2hpY2t0IDotKQorCitXZW5uIGplbWFuZCBkaWUgUmVpaGUgd2VjaHNlbHQgdW5kIGRhYmVpIGRpZSBNaW5pbWFsYW5mb3JkZXJ1bmcgZGVyIFF1ZWxscmVpaGUKK3VudGVyc2Nocml0dGVuIG9kZXIgZGllIE1heGltYWxhbmZvcmRlcnVuZyBkZXIgWmllbHJlaWhlIHVlYmVyc2Nocml0dGVuIHdpcmQsCit3aXJkIG1pdCBDeWNsZVJvd3MoKSByb3RpZXJ0LiBLb21tdCBlaW4gbmV1ZXMgTWl0Z2xpZWQgaGluenUgdW5kIGRpZQorTWF4aW1hbGFuZm9yZGVydW5nIHNlaW5lciBnZXd1ZW5zY2h0ZW4gUmVpaGUgd3VlcmRlIHVlYmVyc2Nocml0dGVuLCB3aXJkCitpbiBBZGRUb1JvdygpIHp1bmFlY2hzdCB2ZXJzdWNodCBlaW4gTWl0Z2xpZWQgZWluZSBSZWloZSB2b3J6dXNjaGllYmVuLCBmYWxscworZGEgbm9jaCBQbGF0eiBpc3QsIHNvbnN0IGVpbmUgUmVpaGUgenVydWVjaywgZmFsbHMgZGEgbm9jaCBQbGF0eiBpc3QgKGRpZQorQW56YWhsIGRlciBNaXRnbGllZGVyIGFsc28gPCBmb3JtYXggaXN0KS4gV2lyZCBlaW4gTWl0Z2xpZWQgZW50ZmVybnQgb2RlcgorZ2V3YWx0c2FtIGVudGZlcm50IHVuZCB3dWVyZGUgZGFiZWkgZGllIE1pbmltYWxhbmZvcmRlcnVuZyBzZWluZXIgUmVpaGUKK3VudGVyc2Nocml0dGVuLCB3aXJkIGluIFJlbW92ZUZyb21Sb3coKSB2ZXJzdWNodCwgZWluIE1pdGdsaWVkIGF1cyBkZXIKK25hY2hmb2xnZW5kZW4gUmVpaGUgbmFjaCB2b3JuZSB6dSBob2xlbiwgZmFsbHMgZG9ydCBVZWJlcnNjaHVzcyB2b3JoYW5kZW4gaXN0CisoaW4gZGVyIG5hY2hmb2xnZW5kZW4gUmVpaGUgYWxzbyBtZWhyIE1pdGdsaWVkZXIgYWxzIGZvcm1pbiBzaW5kKSwgc29uc3QgYXVzCitkZXIgdm9yYW5nZWhlbmRlbiBSZWloZSwgZmFsbHMgZG9ydCBVZWJlcnNjaHVzcyBpc3QuCisKK1NvbGx0ZW4gZGllc2UgVW1vcmRudW5nZW4gbmljaHQgYXVzcmVpY2hlbiBkaWUgRm9ybWF0aW9uIGluIGRlcgorVEVBTUFVRlNURUxMVU5HIGVpbnp1aGFsdGVuLCB3aXJkIGRpZSBGb3JtYXRpb24gbWl0IE1ha2VGb3JtYXRpb24oKSBlcnp3dW5nZW4uCitEaWVzIHdpcmQgaW4gendlaSBEdXJjaGxhZXVmZW4gZXJyZWljaHQuIERlciBlcnN0ZSBEdXJjaGxhdWYgd2lyZCB2b24gdm9ybmUKK25hY2ggaGludGVuIGR1cmNoZ2VmdWVocnQuIElzdCBkYXMgTWF4aW11bSBlaW5lciBSZWloZSB1ZWJlcnNjaHJpdHRlbiwgd2VyZGVuCitzb3ZpZWxlIE1pdGdsaWVkZXIgbmFjaCB2b3JuZSBnZXNjaG9iZW4gd2llIGluIGRlciBkYXZvcmxpZWdlbmRlbiBSZWloZSBmcmVpZQorUGxhZXR6ZSBzaW5kIHVuZCBkaWUgcmVzdGxpY2hlbiB1ZWJlcnNjaHVlc3NpZ2VuIE1pdGdsaWVkZXIgbmFjaCBoaW50ZW4uIFNvbGx0ZQorZGFzIE1pbmltdW0gZWluZXIgUmVpaGUgdW50ZXJzY2hyaXR0ZW4gc2Vpbiwgd2VyZGVuIHNvdmllbGUgTWl0Z2xpZWRlciBhdXMgZGVuCituYWNoZm9sZ2VuZGVuIFJlaWhlbiBoZXJnZWhvbHQsIHdpZSB6dW0gRXJyZWljaGVuIGRlcyBNaW5pbXVtcyBub2V0aWcgaXN0LiBEZXIKK3p3ZWl0ZSBEdXJjaGxhdWYgd2lyZCB2b24gaGludGVuIG5hY2ggdm9ybmUgYXVzZ2VmdWVocnQuIEZhbGxzIGRhcyBNaW5pbXVtCitlaW5lciBSZWloZSB1bnRlcnNjaHJpdHRlbiB3aXJkLCB3ZXJkZW4gTWl0Z2xpZWRlciBhdXMgZGVuIGRhdm9ybGllZ2VuZGVuCitSZWloZW4gZ2Vob2x0IHNvd2VpdCBub2V0aWcsIHdlbm4gamVkb2NoIFVlYmVyc2NodXNzIHZvcmhhbmRlbiBpc3QsIHdpcmQKK2RpZXNlciBuYWNoIHZvcm5lIGdlc2Nob2Jlbi4KKworQkVJU1BJRUw6CisKK0Zvcm1hdGlvbiAzLTYgMi0yIDEtMiAwLTYgMS0xIChibG9lZHNpbm5pZ2UgRm9ybWF0aW9uIDstKQorCisxLiBEdXJjaGxhdWYgKHZvcm5lIGJlZ2lubmVuZCk6CisKKyAgIDEgMSA2IDEgMAorICAgPC0tLS0gICAgIChNaW5pbXVtIFJlaWhlIDEgdW50ZXJzY2hyaXR0ZW4pCisgICAzIDAgNSAxIDAKKyAgICAgPC0tICAgICAoTWluaW11bSBSZWloZSAyIHVudGVyc2Nocml0dGVuKQorICAgMyAyIDMgMSAwCisgICAgICAgLS0+ICAgKE1heGltdW0gUmVpaGUgMyB1ZWJlcnNjaHJpdHRlbikKKyAgIDMgMiAyIDIgMAorCisyLiBEdXJjaGxhdWYgKGhpbnRlbiBiZWdpbm5lbmQpOgorCisgICAzIDIgMiAyIDAKKyAgICAgICAgIC0tPiAoTWluaW11bSBSZWloZSA1IHVudGVyc2Nocml0dGVuKQorICAgMyAyIDIgMSAxCisKK0VyZ2VibmlzIGVudHNwcmljaHQgZGVyIGdld3VlbnNjaHRlbiBGb3JtYXRpb24uIEVybWl0dGx1bmcgZGVyIFJBVU1hdWZzdGVsbHVuZzoKKworICAgMiAwIDIgMSAxIChBbndlc2VuZGUgYXVzIGRlciB2b3JhbmdlZ2FuZ2VuZW4gVEVBTWF1ZnN0ZWxsdW5nKQorICAgPC0tLS0KKyAgIDMgMCAxIDEgMQorICAgICA8LS0tLQorICAgMyAyIDAgMCAxCisgICAgICAgPC0tLS0KKyAgIDMgMiAxIDAgMAorCitFcmdlYm5pcyBlcmZ1ZWxsdCBNaW5pbWFsYW5mb3JkZXJ1bmdlbiB6dW1pbmRlc3Qgdm9ybmUsIE1heGltYWxhbmZvcmRlcnVuZ2VuCitrb2VubmVuIG5pY2h0IHVlYmVyc2Nocml0dGVuIHdlcmRlbiwgd2VpbCBkaWUgUmF1bWF1ZnN0ZWxsdW5nIGhvZWNoc3RlbnMKK3NvdmllbGUgTWl0Z2xpZWRlciB3aWUgZGllIFRlYW1hdWZzdGVsbHVuZyBoYXQuCisKKworQWJhcmJlaXR1bmcgZGVzIEFuZ3JpZmZzYmVmZWhscyB1bmQgVmVydGVpbHVuZyBkZXIgQmVncnVlc3N1bmdzc2NobGFlZ2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitEYXMgR3J1bmRwcmluemlwIGlzdCBmb2xnZW5kZXM6CitXZW5uIGRhcyBnYW56ZSBUZWFtIGJld2VndCB3aXJkLCB3ZXJkZW4gZGllIEJlZ3J1ZXNzdW5nc3NjaGxhZWdlIHVudGVyCitWb3JiZWhhbHQgd2VnZ2VsYXNzZW4uIFNvYmFsZCBhbGxlIFRlYW1taXRnbGllZGVyIGJld2VndCB3dXJkZW4sIG1hY2h0CitqZWRlcyBNb25zdGVyLCBkYXMgbm9jaCBlaW5lbiBCZWdydWVzc3VuZ3NzY2hsYWcgYXVzZnVlaHJlbiBtdXNzLCBlaW5lbgorU2NobGFnIGF1ZiBFSU4gVGVhbW1pdGdsaWVkIGRhcyBpbSBOYWhrYW1wZiBlcnJlaWNoYmFyIGlzdCB1bmQgZGVyIFZvcmJlaGFsdAord2lyZCBmdWVyIGFsbGUgTWl0Z2xpZWRlciBhdWZnZWhvYmVuLiBXZW5uIGVpbiBUZWFtbWl0Z2xpZWQgdmVyc3VjaHQKK3NpY2ggenUgYmV3ZWdlbiB1bmQgbm9jaCBlaW4gQmVncnVlc3N1bmdzc2NobGFnIHVudGVyIFZvcmJlaGFsdCBmZWhsdCwKK3dpcmQgZGllc2VyIG5vY2ggdm9yIGRlciBCZXdlZ3VuZyBuYWNoZ2Vob2x0LgorCisKK1NJRUhFIEFVQ0g6CisgICAgICAgIFVlYmVyc2ljaHQ6IHRlYW1rYW1wZgorICAgICAgICBQcm9wZXJ0aWVzOiBQX1RFQU0sIFBfQVNTT0NfTUVNQkVSUywgUF9URUFNX0FUVEFDS19DTUQsCisgICAgICAgICAgICAgICAgICAgIFBfVEVBTV9BVVRPRk9MTE9XLCBQX1RFQU1fQ09MT1JTLCBQX1RFQU1fTEVBREVSLAorICAgICAgICAgICAgICAgICAgICBQX1RFQU1fTkVXTUVNQkVSLCBQX1RFQU1fV0FOVEVEX1JPVywgUF9URUFNX1dJTVBZX1JPVworICAgICAgICBCZXdlZ3VuZzogICBJc1RlYW1Nb3ZlLCBUZWFtRmxlZQorICAgICAgICBNaXRnbGllZGVyOiBJc1RlYW1MZWFkZXIsIFRlYW1NZW1iZXJzCisgICAgICAgIEthbXBmOiAgICAgIEFzc29jTWVtYmVyLCBEZUFzc29jTWVtYmVyLCBJbnNlcnRFbmVteVRlYW0sCisgICAgICAgICAgICAgICAgICAgIFNlbGVjdE5lYXJFbmVteSwgU2VsZWN0RmFyRW5lbXkKKyAgICAgICAgUG9zaXRpb25lbjogUHJlc2VudFBvc2l0aW9uLCBQcmVzZW50Um93cywgUHJlc2VudEVuZW15Um93cywKKyAgICAgICAgICAgICAgICAgICAgUHJlc2VudFRlYW1Qb3NpdGlvbiwgU3dhcFJvd3MKKyAgICAgICAgU29uc3RpZ2VzOiAgVGVhbVByZWZpeAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiAxNi0wOC0yMDEwLCBHYWJ5bG9uCmRpZmYgLS1naXQgYS9kb2Mvd2l6L3RlY2huaWtlbiBiL2RvYy93aXovdGVjaG5pa2VuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZWZkNTkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd2l6L3RlY2huaWtlbgpAQCAtMCwwICsxLDExMSBAQAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBEaWVzZXIgVGV4dCBpc3QgdmVyYWx0ZXQuIERpZSBUZWNobmlrZW4gd2VyZGVuIHZvbiBkZXIgTXVkbGliIG5pY2h0ICAgICAgKgorKiBhdXNnZXdlcnRldCB1bmQgbW9tZW50YW4gYXVjaCB2b24ga2VpbmVyIEdpbGRlIChBdXNuYWhtZTogZGllIFRhbmppYW4gICAgKgorKiB6ZWlndCBzaWUgYW4sIHR1dCBhYmVyIG5peCBkYW1pdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgIFRlY2huaWtlbiwgbWl0IGRlbmVuIFdhZmZlbiBlaW5nZXNldHp0IHdlcmRlbiBrb2VubmVuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RRX1RIUkFTSCAtICJTY2hsYWd0ZWNobmlrIgorCisgICAgRGllIHZvbSBWZXJzdGFlbmRuaXMgaGVyIGVpbmZhY2hzdGUgVGVjaG5pazogTWFuIG5laG1lIHNpY2ggZWluZW4KKyAgICBHZWdlbnN0YW5kLCAgZGVyIGdyb3NzIGdlbnVnIGlzdCB1bmQgaGFsYndlZ3MgIGJyYXVjaGJhcmUgIERpY2h0ZSAKKyAgICBiZXNpdHp0IC0gYWxzbyBuaWNodCBnZXJhZGUgZmVkZXJsZWljaHQgIGZ1ZXIgc2VpbmUgR3JvZXNzZSBpc3QgLSAKKyAgICB1bmQgaGF1ZSBkcmF1Zi4gIEVnYWwgb2IgSGVua2Vyc2F4dCwgIFN0b2NrLCAgU3R1aGwsICBCaWVyZmxhc2NoZSAKKyAgICAoZ2FueiksIEtudWVwcGVsLCBLZXVsZSBvZGVyIEJyYXRwZmFubmUsICBkYXMgdW5kIGFlaG5saWNoZXMgc2luZCAKKyAgICBicmF1Y2hiYXJlICAnV2FmZmVuJywgIHVtIG1pdCBkaWVzZXIgVGVjaG5payBFcmZvbGcgenUgaGFiZW4uICBFcyAKKyAgICBpc3QgZWluZSBzY2hsYWdlbmRlIEJld2VndW5nLCAgYWxzbyBkYXMgZ2V3b2xsdGUgc2Nod3VuZ2hhZnRlIFp1LQorICAgIHNhbW1lbmZ1ZWhyZW4gendlaWVyIEtvZXJwZXIsIGZ1ZXIgZ2V3b2VobmxpY2ggV2FmZmUgdW5kIEdlZ25lci4KKworCitUUV9USFJVU1QgLSAiU3Rvc3N0ZWNobmlrIgorCisgICAgQXVjaCBkaWVzZSBUZWNobmlrIGVyZnJldXQgc2ljaCB6dW1pbmRlc3QgaW4gS25laXBlbnNjaGxhZWdlcmVpZW4KKyAgICBncm9zc2VyIEJlbGllYnRoZWl0OiBEYXMgU3Rvc3Nlbi4gIE1pdCBlaW5lbSB2b3J6dWdzd2Vpc2Ugc3BpdHplbgorICAgIEdlZ2Vuc3RhbmQgd2llIFNwZWVyLCBEb2xjaCwgQmllcmZsYXNjaGUgKHplcmJyb2NoZW4pIG9kZXIgSGVsbGUtCisgICAgYmFyZGUgIHdpcmQgZGVtIEdlZ25lciBlaW4gTG9jaCBpbiBkZW4gTGVpYiAgZ2VzdG9zc2VuLCAgaW0gRmFsbGUgCisgICAgZWluZXMgICBzdHVtcGZlbiBHZWdlbnN0YW5kZXMgd2llIHouQi4gIGVpbmVtIEthbXBmc3RvY2sgb2RlciBkZW0gCisgICAgZWlnZW5lbiAgWmVpZ2VmaW5nZXIgb2RlciBLbm9lY2hlbCB6aWVsdCBtYW4gYXVmIFZpdGFscHVua3RlIG9kZXIKKyAgICBXZWljaHRlaWxlIHVuZCBlcnppZWx0IGF1Y2ggZGFtaXQgYmVlaW5kcnVja2VuZGUgRXJnZWJuaXNzZS4gIERhcworICAgIEdld2ljaHQgZGVyIFdhZmZlIGlzdCAgd2VuaWdlciB2b24gQmVkZXV0dW5nLCAgZGEgIGRlciBBa3RldXIgYmVpIAorICAgIGVpbmVtIGtvcnJla3QgYXVzZ2VmdWVocnRlbSBzZWluZSBlaWdlbmUgTWFzc2UgbWl0IGVpbnNldHp0LgorCisKK1RRX1NUUk9LRSAtICJTdHJlaWNodGVjaG5payIKKworICAgIEVpbiBldHdhcyBlaWdlbndpbGxpZyBhbm11dGVuZGVyIEJlZ3JpZmYsICBhYmVyIGJlaSBnZW5hdWVyZXIgQmUtCisgICAgdHJhY2h0dW5nIGhhdCAgZGllc2UgVGVjaG5payB0YXRzYWVjaGxpY2ggZXR3YXMgbWl0IFN0cmVpY2hlbG4genUKKyAgICB0dW46ICBEaWUgd2ljaHRpZ3N0ZSBLb21wb25lbnRlIGRlciBCZXdlZ3VuZyBmdWVocnQgbWVociBvZGVyIHdlLQorICAgIG5pZ2VyIGFtICBHZWduZXIgX2VudGxhbmdfIHVuZCBuaWNodCBhdWYgaWhuIHp1LiAgTWFuIHN0ZWxsZSBzaWNoIAorICAgIGVpbiBTY2h3ZXJ0IHZvciwgZGFzIGdlc2NobWVpZGlnIGR1cmNoIGRpZSBLZWhsZSBlaW5lcyBPcmtzIGdsZWktCisgICAgdGV0ICB1bmQgZWluZSBNZW5nZSBCbHV0ICBmcmVpc2V0enQgb2RlciBlaW4gUGVyZ2FtZW50YmxhdHQsICBkYXMKKyAgICBtYW4gYXVzIGRlciBIYW5kIGdlem9nZW4gYmVrb21tdCAgKHVuZCBlYmVuZmFsbHMgZWluZSBNZW5nZSAgQmx1dAorICAgIGZyZWlzZXR6dCkuICBJbiBkZW4gYWxsZXJtZWlzdGVuIEZhZWxsZW4gaXN0IGFsc28gZWluZSBtb2VnbGljaHN0CisgICAgc2NoYXJmZSBTY2huZWlkZSBpbSBTcGllbCB1bmQsIGF1Y2ggd2VubiBzY2htZXJ6aGFmdGUgRXJmYWhydW5nZW4KKyAgICBtaXQgIFBhcmdhbWVudGthbnRlbiBnZWxlZ2VudGxpY2ggZ2VnZW50ZWlsaWdlcyAgdmVybXV0ZW4gbGFzc2VuLCAKKyAgICBqZSBzY2hhZXJmZXIgZGllIFNjaG5laWRlLCBkZXN0byB3ZW5pZ2VyIERydWNrIGluIFJpY2h0dW5nIGZlaW5kLQorICAgIGxpY2hlbiAgWmllbGtvZXJwZXIgIG11c3MgZnVlciAgZWluZW4gICJkdXJjaHNjaG5laWRlbmRlbiBFcmZvbGciIAorICAgIGF1c2dldWVidCB3ZXJkZW4uCisKKworVFFfV0hJUCAtICJQZWl0c2NodGVjaG5payIKKworICAgIFVudGVyIGRlciBQZWl0c2NodGVjaG5payB3aXJkIG51biBhbGxlcyB6dXNhbW1lbmdlZmFzc3QsICB3YXMgZGVuCisgICAgVW1nYW5nIG1pdCBiZXdlZ2xpY2hlbiBFbGVtZW50ZW4gYW4gZGVyIFdhZmZlIGJldHJpZmZ0LiAgRWdhbCwgb2IKKyAgICBQZWl0c2NoZSBhIGxhIEdlb3JnZSBMdWNhcywgbmV1bnNjaHdhZW56aWdlIEthdHplLCBNYW5yaWtpLUd1c2FyaQorICAgIChlaW5lIGhhbGJtZXRlciBsYW5nZSBLZXR0ZSBtaXQgR2V3aWNodGVuIGFuIGRlbiBFbmRlbiksIGVpbi0gYmlzCisgICAgZHJlaWtvZXBmaWdlbSAgYmVrZXR0ZXRlbiBNb3JnZW5zdGVybiBvZGVyIGdhciBEcmVzY2hmbGVnZWwsICBzaWUgCisgICAgc2luZCB6dW1pbmRlc3R0ZWlsd2Vpc2Ugc2VociB1bnRlcnNjaGllZGxpY2gga29uemlwaWVydCAoc28gZmVobHQKKyAgICBkZXIgIFBlaXRzY2hlIGFtIGFldXNzZXJlbiBFbmRlIGRhcyBHZXdpY2h0LCAgc28gZGFzcyBqZW5lcyBkdXJjaAorICAgIGVpbmUgZ2VnZW5sYWV1ZmlnZSBCZXdlZ3VuZyBiZXNjaGxldW5pZ3Qgd2VyZGVuIG11c3MpLCBoYWJlbiBhYmVyCisgICAgZWluZXMgZ2VtZWluc2FtOiBEZXIgU2NoYWRlbiB3aXJkIGR1cmNoIGVpbiB1ZWJlciBkaWUgbm9ybWFsZSBCZS0KKyAgICB3ZWd1bmcgZGVzIEthZW1wZmVycyAgaGluYXVzIGJlc2NobGV1bmlndGVzIFRlaWwgZGVyIFdhZmZlIHZlcnVyLQorICAgIHNhY2h0LiBEdXJjaCBqZW5lIEJld2VnbGljaGtlaXQgZGVyICBXYWZmZSB3aXJkIGVpbiBzZWhyICBncm9zc2VzIAorICAgIE1hc3MgYW4gS29vcmRpbmF0aW9uc3Zlcm1vZWdlbiB2b20gS2FlbXBmZXIgYWJ2ZXJsYW5ndC4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitWZXJtaXNjaHRlcworCisgICAgLSBXYWZmZW4ga29lbm5lbiAgc2ljaCBmdWVyIG1laHJlcmUgIFRlY2huaWtlbiBlaWduZW4uICBNaXQgZWluZW0KKyAgICAgIEthdGFuYSwgZGVtIFNjaHdlcnQgZGVyIFNhbXVyYWksIGJlaXNwaWVsc3dlaXNlIGthbm4gbWFuIGluIGRpZQorICAgICAgdW5nZXNjaHVldHp0ZW4gUGFydGllbiBkZXMgR2VnbmVycyBzdGVjaGVuLCAgZGVtIEdlZ25lciBtaXQgZGVyIAorICAgICAgU3RyZWljaHRlY2huaWsgdGllZmUgU2Nobml0dGUgaW4gZGllIFVudGVyc2VpdGVuIGRlciBBcm1lICAoZWluCisgICAgICBkdXJjaCB0eXBpc2NoZSBTYW11cmFpcnVlc3R1bmdlbiBzY2hsZWNodCBnZXNjaHVldHp0ZXIgQmVyZWljaCkKKyAgICAgIHp1ZnVlZ2VuLCB1bmQgbWl0IGRlciBiZXJ1ZWhtdGVuIGhhbGJlbiBLb2VycGVyZHJlaHVuZyBkZW0gaW4tCisgICAgICB6d2lzY2hlbiB0YXVtZWxuZGVtIEtvbnRyYWhlbnRlbiBkZW4gS29wZiBhYnNjaGxhZ2VuLiAKKworICAgIC0gV2FmZmVuIGtvZW5uZW4gc2ljaCwgb2J3b2hsIHZvbiBkZXIgZ2xlaWNoZW4gR2F0dHVuZywgZnVlciB2ZXItCisgICAgICBzY2hpZWRlbmUgVGVjaG5pa2VuIGVpZ25lbi4gIEVpbiBzcGl0emVyIERvbGNoIG1hZyBlaW5lIHN0dW1wZmUKKyAgICAgIEtsaW5nZSBoYWJlbiAgdW5kIG51ciBmdWVyIGF1c3NjaGxpZXNzbGljaCBzdG9zc2VuZGUgIFByYWt0aWtlbgorICAgICAgenUgZ2VicmF1Y2hlbiB6dSBzZWluLCB3YWVocmVuZCBlaW4gYWJnZXJ1bmRldGVzIEt1ZWNoZW5tZXNzZXIsCisgICAgICBlYmVuZmFsbHMgdm9tIFR5cCAiWnluIiwgZnVlciBrYW50aWdlcyBadXNjaGxhZ2VuIHVuZCBldmVudHVlbGwKKyAgICAgIGF1Y2ggZnVlciBzY2huaXR0aWdlIFN0cmVpY2h0ZWNobmlrZW4gaGVyaGFsdGVuIGthbm4uCisKKyAgICAtIEplIG5hY2ggWndlY2sgdW5kIEtvZW5uZW4gd2lyZCBkaWUgYmVzdGUgenUgdmVyd2VuZGVuZGUgVGVjaG5payAKKyAgICAgIHZhcmlpZXJlbjogIFdlbm4gZXMgdW0gYXJtZSBHcmFzaGFsbWUgZ2VodCwgIHdpcmQgZGllIFNlbnNlIG1pdCAKKyAgICAgIHNjaG5laWRlbmRlbiBCZXdlZ3VuZ2VuIGdlZnVlaHJ0ICAoc2Nob2VuIGluIGRlciAgTWlsa2EtV2VyYnVuZyAKKyAgICAgIHp1IHNlaGVuLCAgZnVlciBkaWUsIGRpZSBlcyBwYXJ0b3V0IG5pY2h0IGdsYXViZW4gd29sbGVuKSwgIGJlaSAKKyAgICAgIGVpbmVyIEJhdWVybnJldm9sdGUgbWFnIGRhcyBndXRlIFN0dWVjayBqZWRvY2ggYXVjaCBtaXQgYW5kZXJlbiAKKyAgICAgIFRlY2huaWtlbiBlZmZla3RpdiAodW5kIHZpZWxsZWljaHQgc29nYXIgZWZmZWt0aXZlcikgZWluZ2VzZXR6dCAKKyAgICAgIHdlcmRlbiwgd2VyIHdlaXNzLCB3ZXIgd2FyIHNjaG9uIGRhYmVpLi4uPyAgU2VsYnN0IGJlaSBub3JtYWxlbgorICAgICAgV2FmZmVuIHdpZSBTY2h3ZXJ0ZXJuICB3dWVyZGUgZWluIFVuZ2V1ZWJ0ZXIgIHNlbHRlbiB2ZXJzdWNoZW4sICAKKyAgICAgIG1pdCBTdHJlaWNodGVjaG5pa2VuIFNjaGFkZW4genUgdmVydXJzYWNoZW4sIGRlbm4gZGFzIFp1c3RlY2hlbiAKKyAgICAgIGlzdCBzY2hsaWNodCBlaW5mYWNoZXIuCisKKyAgICAtIEVzIHdpcmQgaW1tZXIgIGJlc29uZGVyZSBXYWZmZW4gZ2ViZW4uICBTbyAgc2luZCBiZWlzcGllbHN3ZWlzZQorICAgICAgZGFzIFp3ZWlsaWxpZW4gdW5kICBkaWUgSGVsbGViYXJkZSAgYmVpZGUgZGVtIFR5cCAiS3pyb2siIChmdWVyCisgICAgICBuaWNodC1UcnZlczogU3RhbmdlbndhZmZlbikgenV6dW9yZG5lbiwgZGllIFRlY2huaWtlbiAgd2VpY2hlbiwKKyAgICAgIGJlZGluZ3QgIGR1cmNoIGRpZSBWaWVsc2VpdGlna2VpdCAgZGVyIFdhZmZlbiwgIGplZG9jaCB2b24gIGRlcgorICAgICAgTm9ybSBhYjogRGFzIFp3ZWlsaWxpZW4sIGFuIGplZGVtICBFbmRlIGVpbmUgbGFuZ2UgdW5kICBzY2hhcmZlCisgICAgICBLbGluZ2UsICBrYW5uICBlYmVuc28gIHZpZWxzZWl0aWcgIGdlaGFuZGhhYnQgIHdlcmRlbiAgd2llICBlaW4gCisgICAgICBTY2h3ZXJ0LCAgd2FlaHJlbmQgZGllIEhlbGxlYmFyZGUgKGVpbmUgTWlzY2h1bmcgYXVzICBMYW56ZSB1bmQKKyAgICAgIEF4dCkgZHVyY2ggaWhyZSB1bmF1c2dld29nZW5lIEdld2ljaHRzdmVydGVpbHVuZyAgdW5kIGRlbSBkYW1pdAorICAgICAgdmVyYnVuZGVuZW4gUG90ZW56aWFsIGFuIFNjaHd1bmcgc2NobGljaHR3ZWcgRElFIFdhZmZlIGRlciBXYWhsIAorICAgICAgZnVlciBmZWlnZSBad2VyZ2UgaXN0OiAgU2Nod2luZ2VuIHdpZSBlaW5lIGdyb3NzZSAgQXh0IHVuZCAgZGVuIAorICAgICAgR2VnbmVyIGF1ZiBEaXN0YW56IGhhbHRlbiBrb2VubmVuLiAgR3V0LCAgZGFzcyBlcyBrZWluZSAgZmVpZ2VuIAorICAgICAgWndlcmdlIGdpYnQgO28pCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFR1ZSBBcHIgMTMgMTM6MDA6MDAgMjAwMCBieSBBbmF0b2wKZGlmZiAtLWdpdCBhL2RvYy93aXovdGVzdHNwaWVsZXIgYi9kb2Mvd2l6L3Rlc3RzcGllbGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZmMyZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd2l6L3Rlc3RzcGllbGVyCkBAIC0wLDAgKzEsNDAgQEAKKworVGVzdHNwaWVsZXIKKz09PT09PT09PT09CisKKyBURVNUU1BJRUxFUjoKKyAgICBUZXN0c3BpZWxlciBzaW5kIFp3ZWl0Y2hhcmFrdGVyZSB2b24gTWFnaWVybiwgZGllIGF1Y2ggZ2xlaWNoemVpdGlnIG1pdAorICAgIGRlbSBNYWdpZXIgZWluZ2Vsb2dndCBzZWluIGR1ZXJmZW4uIFNpZSBtdWVzc2VuIGVudHNwcmVjaGVuZCBtYXJraWVydCBzZWluCisgICAgKHNpZWhlIHVudGVuKSB1bmQgZHVlcmZlbiBhdWNoIHJ1aGlnIHZvbSBNYWdpZXIgbWFuaXB1bGllcnQgd2VyZGVuLgorCisgICAgVEVTVFNQSUVMRVIgVU5URVJMSUVHRU4gVk9MTCBERU4gUkVHRUxOIERFUyBNQUdJRVJWRVJUUkFHUyEKKworICAgIFRlc3RzcGllbGVyIHdlcmRlbiBoYXVwdHNhZWNobGljaCBkYW5uIGdlYnJhdWNodCwgd2VubiBPYmpla3RlIG9kZXIKKyAgICBHZWJpZXRlIHdpcmtsaWNoIGF1cyBTcGllbGVyc2ljaHQgZ2V0ZXN0ZXQgd2VyZGVuIHNvbGxlbiB1bmQgZGFzCisgICAgQWJzY2hhbHRlbiBkZXMgTWFnaWVybW9kdXMgZGF6dSBuaWNodCBhdXNyZWljaHQuIEVpbiBhbmRlcmVzIEVpbnNhdHpnZWJpZXQKKyAgICBpc3QgZGFzIFRlc3RlbiB2b24gTWVsZHVuZ2VuIG9kZXIgQWt0aW9uZW4sIGRpZSBuaWNodCBudXIgZGVuCisgICAgQXVzZnVlaHJlbmRlbiBzZWxic3QgYmV0cmVmZmVuLCBzb25kZXJuIHouQi4gYXVjaCB1bXN0ZWhlbmRlIFBlcnNvbmVuIGluCisgICAgZWluZW0gUmF1bS4KKworIEdJTERFTlRFU1RTUElFTEVSOgorICAgIFNvZmVybiBlaW5lIEdpbGRlIGRhcyBBbmxlZ2VuIHZvbiBUZXN0c3BpZWxlcm4gdW50ZXJzdHVldHp0LCBnaWJ0IGVzCisgICAgZW50c3ByZWNoZW5kZSBIaWxmZXNlaXRlbiB1bnRlciAiaGlsZmUgPGdpbGRlbm5hbWU+LnRlc3RzcGllbGVyIi4KKworIE1BUktJRVJFTjoKKyAgICBFaW4gVGVzdHNwaWVsZXIgd2lyZCBkdXJjaCBzZXR6ZW4gZGVyIFByb3BlcnR5IFBfVEVTVFBMQVlFUiBtYXJraWVydC4gRXMKKyAgICByZWljaHQgendhciBhdXMsIGRpZXNlIFByb3BlcnR5IGVpbmZhY2ggYXVmIGVpbmVuIFdlcnQgIT0gMCB6dSBzZXR6ZW4sCisgICAgYWJlciBtYW4gc29sbHRlIGhpZXIgbGllYmVyIGRlbiBOYW1lbiBkZXMgTWFnaWVycyBlaW50cmFnZW4sIHp1IGRlbSBkZXIKKyAgICBUZXN0aWUgZ2Vob2VydC4KKworICAgIEVpbmlnZSBNYWdpZXIgbWFya2llcmVuIGlocmUgVGVzdHNwaWVsZXIgbmljaHQsIHVuZCB6d2FyIG1pdCBkZXIKKyAgICBCZWdydWVuZHVuZywgZGFzcyBkYW5uIFRvZGVzbWVsZHVuZ2VuIG5pY2h0IGF1c2dlZ2ViZW4gd2VyZGVuLiBEYXMgaXN0CisgICAgYWxsZXJkaW5ncyBrZWluZSBBdXNyZWRlIG1laHIsIGRhcyBUZXN0c3BpZWxlci1Ub2Rlc21lbGR1bmdlbiBhdWYgLVRkVAorICAgIGF1c2dlZ2ViZW4gd2VyZGVuLgorICAgIFNpbmQgbmljaHRtYXJraWVydGVyIFRlc3RzcGllbGVyIGVudHNwcmVjaGVuZCBtYW5pcHVsaWVydCwga29lbm50ZSBlcworICAgIHBhc3NpZXJlbiwgZGFzcyBzaWUgd2VnZW4gU2NodW1tZWxlaSBnZWxvZXNjaHQgd2VyZGVuLi4uCisKKyBTSUVIRSBBVUNIOgorICAgIHp3ZWl0c3BpZWxlciwgdmVydHJhZywgbXNjaGF1LCBQX1RFU1RQTEFZRVIKKworIExFVFpURSBBZU5ERVJVTkc6CisgICAgMTkuIE1hZXJ6IDIwMDQgR2xvaW5zb24KZGlmZiAtLWdpdCBhL2RvYy93aXovdG9kZXNmYWxsZW4gYi9kb2Mvd2l6L3RvZGVzZmFsbGVuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ODUwMzIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd2l6L3RvZGVzZmFsbGVuCkBAIC0wLDAgKzEsMzU1IEBACitNYW5wYWdlIHp1IFRvZGVzZmFsbGVuLiBUZWNobmlzY2hlciBMZWl0ZmFkZW4uCisKKworRGllc2UgTWFucGFnZSByaWNodGV0IHNpY2ggYW4gKEp1bmcpbWFnaWVyLCBkaWUgVG9kZXNmYWxsZW4gbnV0emVuIHdvbGxlbiwKK3VtIHZlcnNjaGllZGVuc3RlIERpbmdlIGluIGlocmVuIEdlYmlldGVuIGRhbWl0IHp1IGVycmVpY2hlbi4gRGFiZWkgc29sbCBoaWVyCituaWNodCBkaXNrdXRpZXJ0IHdlcmRlbiwgd28gd2VsY2hlIEFydCB2b24gVG9kZXNmYWxsZSBTaW5uIG1hY2h0IChvZGVyIGF1Y2gKK25pY2h0KSwgc29uZGVybiBlcyBzb2xsZW4gdGVjaG5pc2NoZSBBc3Bla3RlIGJlaSBkZXIgUHJvZ3JhbW1pZXJ1bmcgZWluZXIKK3NvbGNoZW4gKFRvZGVzKWZhbGxlIGF1ZmdlemVpZ3Qgd2VyZGVuLgorCisKK0thcGl0ZWwgMS4gRGFzIFVtZmVsZCBlaW5lciBUb2Rlc2ZhbGxlLgorCitFaW5lIFRvZGVzZmFsbGUga2FubiB3aWUgaW4gc3BhZXRlcmVuIEthcGl0ZWxuIGJlc2NocmllYmVuLCBsZWljaHQgdW1nZXNldHp0Cit3ZXJkZW4uIERhbWl0IHNpZSBzaWNoIGF1Y2ggc28gdmVyaGFlbHQgd2llIHNpZSBzb2xsLCB3ZXJkZW4gaGllciBlaW5pZ2UKK1NpY2hlcmhlaXRzYXNwZWt0ZSBiZWhhbmRlbHQsIGRpZSBkdXJjaGdlZ2FuZ2VuIHdlcmRlbiBzb2xsdGVuLgorCisKK0thcGl0ZWwgMS4xIFdlciBoYXQgZGllIFRvZGVzZmFsbGUgYXVzZ2Vsb2VzdD8KKworRGllIG1laXN0ZW4gVG9kZXNmYWxsZW4gd2VyZGVuIGR1cmNoIGVpbiBLb21tYW5kbyBhdXNnZWxvZXN0LCB3ZWxjaGVzIGRlcgorU3BpZWxlciBhdXNmdWVocnQuIFouQi4KKwlkcnVlY2tlIGdyb3NzZW4gcm90ZW4ga25vcGYgbWl0IGRlciBhdWZzY2hyaWZ0ICJ0b2Rlc2ZhbGxlIGF1c2xvZXNlbiIKK0luIGRpZXNlbSBGYWxsIGV4aXN0aWVydCBpbiBkZXIgYXVmZ2VydWZlbmVuIEZ1bmt0aW9uIGRpZSBNb2VnbGljaGtlaXQsIHVlYmVyCitkaWUgRnVua3Rpb24gdGhpc19wbGF5ZXIoKSBkZW4gYWt0dWVsbCAiZ3VlbHRpZ2VuIiBTcGllbGVyIGF1c3p1ZmlzY2hlbi4KK0hpZXJiZWkgaXN0IHp1IGJlYWNodGVuLCBkYXNzIGF1Y2ggTlBDcyB2b24gZGllc2VyIEZ1bmt0aW9uIHp1cnVlY2tnZWdlYmVuCit3ZXJkZW4ga29lbm5lbi4gQXVjaCBpbSBpbml0KCkgZWluZXMgUmF1bWVzIHdpcmQgaW4gdGhpc19wbGF5ZXIoKSBkZXIgU3BpZWxlcgorenVydWVja2dlZ2ViZW4uIEhpZXJiZWkgaXN0IGplZG9jaCB6dSBiZWFjaHRlbiwgZGFzcyBtYW4gaW1tZXIgc2NoYXVlbiBzb2xsdGUsCitvYiB0aGlzX3BsYXllcigpIGF1Y2ggdGF0c2FlY2hsaWNoIGVpbiBPYmpla3QgenVydWVja2xpZWZlcnQuIERpZXMgaXN0Cit3aWNodGlnLCBkYSBkYXMgaW5pdCgpIChvZGVyIGF1Y2ggYW5kZXJlIEZ1bmt0aW9uZW4pIGR1cmNoIEdlZ2Vuc3RhZW5kZSwgd2llCitkZW4gQnVtZXJhbmcgYXVzZ2Vsb2VzdCB3ZXJkZW4ga29lbm5lbi4gSW4gZGllc2VtIEZhbGwgc3RlaHQgaW4gdGhpc19wbGF5ZXIoKQordWVibGljaGVyd2Vpc2Uga2VpbiBPYmpla3QuIERpZSBTaWNoZXJoZWl0c2FiZnJhZ2Ugc29sbHRlIGFsc28gd2llIGZvbGd0CithdXNzZWhlbjoKKworICAgIG9iamVjdCBzcGllbGVyOworICAgIHNwaWVsZXIgPSB0aGlzX3BsYXllcigpOworICAgIGlmIChzcGllbGVyKSAvLyBFaW4gTGViZXdlc2VuPworICAgIHsKKyAgICAgIC4uLgorICAgIH0KKyAgICAvLyBlbHNlOiBEaWUgRmFsbGUgbmljaHQgYXVzbG9lc2VuLCBkYSBrZWluIExlYmV3ZXNlbi4KKworCitLYXBpdGVsIDEuMiBXZXIgc29sbCBkaWUgVG9kZXNmYWxsZSBuaWNodCBhdXNsb2VzZW4/CisKK09mdCBrb21tdCBlcyB2b3IsIGRhc3MgZWluZSBzY2hvZW5lIFRvZGVzZmFsbGUgdm9uIEdvdHQgdW5kIGRlciBXZWx0CithdXNnZWxvZXN0IHdpcmQuIE5vcm1hbGVyd2Vpc2UgbW9lY2h0ZSBtYW4gYWJlciBuaWNodCwgZGFzcyAiR290dCIgb2RlciBhbmRlcmUKK2Jlc29uZGVyZSBQZXJzb25lbmdydXBwZW4gZGllc2UgRmFsbGUgYXVzbG9lc2VuLiBJbiBkZW4gZm9sZ2VuZGVuCitVbnRlcmthcGl0ZWxuIHdlcmRlbiBBYmZyYWdlbiBnZXplaWd0LCB1bSBQZXJzb25lbmdydXBwZW4gYXVzenVzY2hsaWVzc2VuLgorCisKK0thcGl0ZWwgMS4yLjEgVG9kZXNmYWxsZW4sIGRpZSBuaWNodCBhdWYgR2Vpc3RlciByZWFnaWVyZW4uCisKK1VlYmxpY2hlcndlaXNlIHNvbGxlbiBUb2Rlc2ZhbGxlbiBiZWkgZGVuIEF1c2xvZXNlcm4gU2NoYWRlbiB2ZXJ1cnNhY2hlbi4gQmVpCitHZWlzdGVybiBsYWV1ZnQgZGllcyBqZWRvY2ggaW5zIExlZXJlLiBNYW4ga29lbm50ZSBudW4gYXVmIGRpZSBJZGVlIGtvbW1lbiwKK2FsdGVybmF0aXYgYXVmIEdlaXN0ZXIgenUgcmVhZ2llcmVuLgorCisKK0thcGl0ZWwgMS4yLjEuMSBOaWNodCBhdWYgR2Vpc3RlciByZWFnaWVyZW4uCisKK0FuZ2Vub21tZW4sIG1hbiBoYXQgZWluZW4gU3BpZWxlciAoc2llaGUgb2JlbiksIGRlciBpbSBCZWdyaWZmIGlzdCwgZGllIEZhbGxlCithdXN6dWxvZXNlbi4gTWFuIHNvbGx0ZSBudW4gcHJ1ZWZlbiwgb2IgZXIgZWluIEdlaXN0IGlzdC4gRmFsbHMgZXIga2VpbiBHZWlzdAoraXN0LCBrYW5uIG1hbiB3aWUgZ2V3dWVuc2NodCAoVG9kZXNmYWxsZSkgcmVhZ2llcmVuLiBGYWxscyBuaWNodCwgc29sbHRlIG1hbgorZWluZSBwYXNzZW5kZSBNZWxkdW5nIGF1c2dlYmVuLiBaLkIuICJBbHMgR2Vpc3QgaGFzdCBEdSBuaWNodCBkaWUgbm90d2VuZGlnZQorS3JhZnQsIGRpZXNlbiBLbm9wZiB6dSBkcnVlY2tlbi4iIERpZSB0ZWNobmlzY2hlIEFiZnJhZ2UsIG9iIGVpbiBTcGllbGVyIGVpbgorR2Vpc3QgaXN0LCBzaWVodCB3aWUgZm9sZ3QgYXVzLgorCisgICAgaWYgKCFzcGllbGVyLT5RdWVyeVByb3AoUF9HSE9TVCkpCisgICAgeworICAgICAgICAvLyBpc3QgX2tlaW5fIEdlaXN0LCBhbHNvIFRvZGVzZmFsbGUuCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vIEFsdGVybmF0aXZlciBUZXh0LCBkYSBHZWlzdC4KKyAgICB9CisKKworS2FwaXRlbCAxLjIuMS4yIEdlaXN0ZXIgZW50Z2Vpc3Rlcm4uCisKK0RhIGF1c3NjaGxpZXNzbGljaCBkaWUgUmFzc2Vuc3RhcnRyYWV1bWUgZW50Z2Vpc3Rlcm4gc29sbGVuLCB3dXJkZSBkaWVzZXIKK1B1bmt0IGhlcmF1c2dlbm9tbWVuLiBBbHNvOiBFcyBpc3QgdW5lcnd1ZW5zY2h0LCBHZWlzdGVyIHp1IGVudGdlaXN0ZXJuLCB1bQorZWluZSBUb2Rlc2ZhbGxlIGtvcnJla3QgYXVzenVsb2VzZW4uCisKKworS2FwaXRlbCAxLjIuMS4zIEFsdGVybmF0aXZlIGZ1ZXIgR2Vpc3Rlci4KKworUm9sbGVuc3BpZWx0ZWNobmlzY2ggZ2VzZWhlbiBtYWNodCBlcyBpbiBkZW4gYWxsZXJ3ZW5pZ3N0ZW4gRmFlbGxlbiBTaW5uLAorYWx0ZXJuYXRpdiBhdWYgZWluZW4gR2Vpc3QgenUgcmVhZ2llcmVuLiBEZXIgVm9sbHN0YWVuZGlna2VpdCBoYWxiZXIgc2VpIGRpZXNlCitMb2VzdW5nIHRyb3R6ZGVtIGVyd2FlaG50LiBFaW4gUHJvZ3JhbW1iZWlzcGllbCBzb2xsdGUgb2huZSBncm9zc2UgTXVlaGUgZHVyY2gKK2RpZSBzY2hvbiB2b3JoYW5kZW5lbiBCZWlzcGllbGUgZXJzdGVsbHQgd2VyZGVuIGtvZW5uZW4uCisKKworS2FwaXRlbCAxLjIuMiBHYWVzdGUgdW5kIGtsZWluZSBTcGllbGVyLgorCitSb2xsZW5zcGllbHRlY2huaXNjaCBtYWNodCBlcyBvZnQga2VpbmVuIFNpbm4sIGF1ZiBHYWVzdGUgb2RlciBrbGVpbmUgU3BpZWxlcgorYW5kZXJzIHp1IHJlYWdpZXJlbiwgYWxzIGF1ZiAiZGVuIFJlc3QiLiBNb2VjaHRlIG1hbiBqZWRvY2ggZWluZW4gYmVzb25kZXJlbgorU2NodXR6IGZ1ZXIga2xlaW5lIFNwaWVsZXIgZWluYmF1ZW4gKCJEdSBoYXN0IHp1IGdyb3NzZSBBbmdzdCwgZGllc2VuIGdyb3NzZW4sCityb3RlbiBLbm9wZiB6dSBkcnVlY2tlbi4iKSBvZGVyIG1vZWNodGUgbWFuIEdhc3QtU3RlcmJlLVRlc3Rlcm4gZGVuIEhhaG4gCit6dWRyZWhlbiAoZGllIFdlaWNoZWllciEpLCBzbyBzaW5kIGZvbGdlbmRlIEFiZnJhZ2VuIHVudGVyIFVtc3RhZW5kZW4KK3Npbm52b2xsLgorCisgIC8vIEdhc3Q/CisgIGlmIChzcGllbGVyLT5RdWVyeUd1ZXN0KCkpCisgIHsKKyAgICAgIC8vIElzdCBlaW4gR2FzdC4uLgorICB9CisgIGVsc2UKKyAgeworICAgICAgLy8gVG9kZXNmYWxsZS4gS2VpbiBHYXN0LgorICB9CisgIAorICAvLyBLbGVpbmVyIFNwaWVsZXI/CisgIC8vIEluIGRpZXNlbSBCZWlzcGllbCBBYmZyYWdlIGRlcyBTcGllbGVybGV2ZWxzLgorICBpZiAoc3BpZWxlci0+UXVlcnlQcm9wKFBfTEVWRUwpIDwgMTApCisgIHsKKyAgICAgIC8vIFNwaWVsZXJsZXZlbCA8IDEwIGhhYmVuIHp1dmllbCBBbmdzdC4KKyAgfQorICBlbHNlCisgIHsKKyAgICAgIC8vIFNwaWVsZXJsZXZlbCA+PSAxMCBrb2VubmVuIGhpZXIgcnVoaWcgZGllIFRvZGVzZmFsbGUgYXVzbG9lc2VuLgorICB9CisKKworS2FwaXRlbCAxLjIuMyBNYWdpZXIKKworVWVibGljaGVyd2Vpc2Ugc2luZCBNYWdpZXIgdW5zdGVyYmxpY2ggdW5kIHNvbGwodCllbiBhdWNoIG5pY2h0CisodmVyc2VoZW50bGljaCkgVG9kZXNmYWxsZW4gYXVzbG9lc2VuLiBEaWVzIGlzdCB2b3IgYWxsZW0gZGFubiBkZXIgRmFsbCwgd2VubgorInp1ZmFlbGxpZyIgaW0gZ2xlaWNoZW4gUmF1bSBzdGVoZW5kZSBTcGllbGVyIE1lbGR1bmdlbiBiZWtvbW1lbiB3dWVyZGVuIHVuZAorZGFkdXJjaCBnZXdhcm50IHdlcmRlbi4gRGllIHRlY2huaXNjaGUgVW1zZXR6dW5nLCBkYXNzIE1hZ2llciBUb2Rlc2ZhbGxlbgorbmljaHQgYXVzbG9lc2VuLCBzaWVodCB3aWUgZm9sZ3QgYXVzLiBEaWUgQWJmcmFnZSBiZXJ1ZWNrc2ljaHRpZ3QKKyJtc2NoYXUgYXVzIi4gRGFzIGhlaXNzdCwgTWFnaWVyIGtvZW5uZW4gc3RlcmJlbiwgd2VubiBzaWUgbXNjaGF1IGF1cyBnZW1hY2h0CitoYWJlbi4KKworICAgICNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKworICAgIGlmKElTX0xFQVJORVIoc3BpZWxlcikgJiYgc3BpZWxlci0+UXVlcnlQcm9wKFBfV0FOVFNfVE9fTEVBUk4pKQorICAgIHsKKyAgICAgIC8vIE1hZ2llcjogTWFuIHNvbGwgaWhtIG1pdHRlaWxlbiwgZGFzcyBlciBkaWVzZSBBa3Rpb24gYWxzIE1hZ2llciBuaWNodAorICAgICAgLy8gdHVuIGRhcmYuCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvLyBLZWluIE1hZ2llci4gPT4gVG9kZXNmYWxsZS4KKyAgICB9CisKKworS2FwaXRlbCAxLjMgV2ljaHRpZ2UgUHVua3RlIGVpbmVyIG5pY2h0IHNpbm5mcmVpZW4gVG9kZXNmYWxsZS4KKworRWluZSBUb2Rlc2ZhbGxlIGlzdCwgd2llIGluIEthcGl0ZWwgMiBnZXplaWd0LCBlaWdlbnRsaWNoIGVpbmUgZWluZmFjaGUgU2FjaGUuCitLb21iaW5pZXJ0IG1pdCBkZW4gc2Nob24gZ2V6ZWl0Z3RlbiBTaWNoZXJoZWl0c2FiZnJhZ2VuIGhhdCBtYW4gdWVibGljaGVyd2Vpc2UKK2VpbiBndWVsdGlnZXMgT3BmZXIuIEFsbGdlbWVpbmUgRGluZ2UsIHdpZSBiZWlzcGllbHN3ZWlzZSAiRGFzIE9wZmVyIHNvbGx0ZQorZWluIGVudmlyb25tZW50IGhhYmVuIiB3ZXJkZW4gaGllciB1ZWJlcmdhbmdlbiB1bmQgbnVyIGRpZSB3ZXNlbnRsaWNoZW4gRGluZ2UKK2dlbmFubnQsIGRpZSBiZWltIHBvdGVudGllbGxlbiBUb2V0ZW4gZWluZXMgU3BpZWxlcnMgdm9uIEJlbGFuZyBzaW5kLgorCisKK0thcGl0ZWwgMS4zLjEgV28gaXN0IGRlciBTcGllbGVyPworCitHYW56IHdpY2h0aWcgYmVpIFRvZGVzZmFsbGVuIGlzdCBkaWUgRnJhZ2UsIHdvIHNpY2ggZGVyIFNwaWVsZXIgYmVmaW5kZXQuCitXaXJkIGVpbmUgVG9kZXNmYWxsZSBpbiBpbml0KCkgYXVzZ2Vsb2VzdCwgZGFubiBiZWZpbmRldCBzaWNoIGRlciBTcGllbGVyCitzY2hvbiBpbiBkZW0gZW50c3ByZWNoZW5kZW4gUmF1bSwgZGVzc2VuIGluaXQoKSBudW4gYXVzZ2VmdWVocnQgd2lyZC4gRGFzCitiZWRldXRldCwgd2VubiBkZXIgU3BpZWxlciBzdGlyYnQsIHNpbmQgc2VpbmUgU2FjaGVuIHp1bmFlY2hzdCBlaW5tYWwgaW4gZGVtCitiZXRyZWZmZW5kZW4gUmF1bS4gSW4gc2VsdGVuZW4gRmFlbGxlbiBzcGllbHQgZXMgd2lya2xpY2ggZWluZSBSb2xsZSwgd28gc2ljaAorZGVyIFNwaWVsZXIgYmVmaW5kZXQgdW5kIGVyIGhhdCBlaWdlbnRsaWNoIGltbWVyIGVpbiBlbnZpcm9ubWVudCwgaW4gZGFzIHNlaW5lCitMZWljaGUgZGFubiBrb21tdC4gRGVubm9jaCBzb2xsdGUgbWFuIGJlaSBUb2Rlc2ZhbGxlbiB0ZXN0ZW4sIHdvIHNpY2ggZGVyCitTcGllbGVyIGJlZmluZGV0LiBXZW5uIGRlciBTcGllbGVyIGRpZSBGYWxsZSBpbSBWb3JyYXVzIG9kZXIgdm9uIHdvYW5kZXJzCithdXNsb2VzZW4ga2FubiwgZGFubiBtYWNodCBlcyBuaWNodCBpbW1lciBTaW5uLCBkaWUgRmFsbGUgdGF0c2FlY2hsaWNoCithdXN6dWxvZXNlbiBvZGVyIGRlbSBTcGllbGVyIGRlbiBFZmZla3QgInp1enVtdXRlbiIuCitFaW5lIGVpbmZhY2hlIEFiZnJhZ2UsIG9iIHNpY2ggZGVyIFNwaWVsZXIgaW0gZ2xlaWNoZW4gUmF1bSBiZWZpbmRldCwgc2llaHQgc28KK2F1czoKKworICAgIGlmIChlbnZpcm9ubWVudChzcGllbGVyKSAmJiAoZW52aXJvbm1lbnQoc3BpZWxlcikgPT0gdGhpc19vYmplY3QoKSkpCisgICAgeworICAgICAgICAvLyBTcGllbGVyIGhhdCBlaW4gZW52aXJvbm1lbnQgdW5kIGRhcyBlbnZpcm9ubWVudCBpc3QgZGllc2VyIFJhdW0uCisgICAgfQorICAgIAorCitLYXBpdGVsIDEuMy4yIFdlciB0b2V0ZXQgZGVuIFNwaWVsZXI/CisKK1VlYmxpY2hlcndlaXNlIHRvZXRldCBtYW4gZWluZW4gU3BpZWxlciBtaXQgZGVuIGluIEthcGl0ZWwgMiBnZW5hbm50ZW4KK01vZWdsaWNoa2VpdGVuLiBJbiBkaWVzZW4gTW9lZ2xpY2hrZWl0ZW4gaXN0IGRhcyB0b2V0ZW5kZSBPYmpla3QgZGVyIFJhdW0uCitEYSBhYmVyIG51biBkZXIgUmF1bSBrZWluZW4gTmFtZW4gaGF0LCBtdXNzIG1hbiBkaWVzZW0gUmF1bSBlaW5pZ2UgUHJvcGVydGllcworc2V0emVuLCBkaWUgdWVibGljaGVyd2Vpc2UgZXJzdCBlaW5tYWwgbnVyIE5QQ3MgaGFiZW4uIERpZSBQcm9wZXJ0aWVzIHJlZ2VsbiwKKyJ3ZXIiIGluIEthbXBmbWVsZHVuZ2VuLCBBbmdyaWZmZW4gdW5kIFRvZGVzbWVsZHVuZ2VuIGFscyBBbmdyZWlmZXIgb2RlcgorS2lsbGVyIHN0ZWh0LiBTZXR6dCBtYW4gZGllc2UgV2VydGUgZGlyZWt0IHZvciBkZXIgQXVzZnVlaHJ1bmcgZWluZXIKK1RvZGVzZmFsbGUsIGRhbm4ga2FubiBtYW4gbWVocmVyZSBUb2Rlc2ZhbGxlbiBpbiBlaW5lbSBSYXVtIG1pdCB2ZXJzY2hpZWRlbmVuCitNZWxkdW5nZW4gdmVyc2VoZW4uCisKKyAgICBTZXRQcm9wKFBfTkFNRSwgIkVpbiBnbGVpc3NlbmRlciBGZXVlcmJhbGwiKTsgLy8gRGVyIEFuZ3JlaWZlci1OYW1lCisgICAgU2V0UHJvcChQX0tJTExfTkFNRSwgIkVpbiBnbGVpc3NlbmRlciBGZXVlcmJhbGwiKTsKKyAgICAgICAgLy8gTmFtZSBmdWVyIGRlbiBUb2Rlc2thbmFsLgorCisKK0thcGl0ZWwgMS40IEdpbW1pY2tzCisKK0RlciBWb2xsc3RhZW5kaWdrZWl0IGhhbGJlciBzb2xsIG5vY2ggZXJ3YWVobnQgd2VyZGVuLCBkYXNzIG1hbiBpbiBkZXIKK1Byb3BlcnR5IFBfRU5FTVlfREVBVEhfU0VRVUVOQ0UgZGFzIEZpbGUgZWluZXIgKGVpZ2VuZW4pIFRvZGVzc2VxdWVueiBhYmxlZ2VuCitrYW5uLgorCisKK0thcGl0ZWwgMiBUZWNobmlzY2hlIFVtc2V0enVuZyB2b24gVG9kZXNmYWxsZW4uCisKK0RlbiBUb2QgZHVyY2ggb2RlciBkZW4gQW5ncmlmZiBhdWYgZWluZW4gU3BpZWxlciBtaXR0ZWxzIGVpbmVyIFRvZGVzZmFsbGUga2FubgorbWFuIGF1ZiB2ZXJzY2hpZWRlbmUgV2Vpc2UgYmV3ZXJrc3RlbGxpZ2VuLiBEaWUgd2ljaHRpZ3N0ZW4gTW9lZ2xpY2hrZWl0ZW4KK3dlcmRlbiBpbiBkZW4gZm9sZ2VuZGVuIFVudGVya2FwaXRlbG4ga3VyeiBlcmxhZXV0ZXJ0LiBFcyB3aXJkIGF1c3NlcmRlbSBhdWYKK2VpbmlnZSB0ZWNobmlzY2hlIEZlaW5oZWl0ZW4gZWluZ2VnYW5nZW4sIGRpZSB6dSBiZWFjaHRlbiBzaW5kLgorCisKK0thcGl0ZWwgMi4xIFRvZCBkdXJjaCBkaWUoKQorCitEaWUgZWluZmFjaHN0ZSBNb2VnbGljaGtlaXQsIGVpbmVuIFNwaWVsZXIgc2ljaGVyIHN0ZXJiZW4genUgbGFzc2VuLCBpc3QgZGVyCitBdWZydWYgdm9uIGRpZSgpLiBEaWUgc3BhZXRlciBnZW5hbm50ZW4gTW9lZ2xpY2hrZWl0ZW4gbWl0IEF1c25haG1lIGRlcworRmFrZXRvZHMgYmV3aXJrZW4gbGV0enRlbmRsaWNoIGF1Y2ggZWluZW4gQXVmcnVmIHZvbiBkaWUoKSwgc29sbHRlIGRlciBTcGllbGVyCitzaWNoIG5pY2h0IGF1c3JlaWNoZW5kIGRhZ2VnZW4gZ2VzY2h1ZXR6dCBoYWJlbi4gQmVpIGRlbSBkaXJla3RlbiBBdWZydWYga2Fubgorc2ljaCBkZXIgU3BpZWxlciBuaWNodCBkYWdlZ2VuIHdlaHJlbi4gKEF1c25haG1lOiBHZWlzdCBzZWluLCBzaWVoZSBvYmVuLikKK0RpZSB0ZWNobmlzY2hlIFVtc2V0enVuZyBzaWVodCB3aWUgZm9sZ3QgYXVzLiBFdmVudHVlbGxlIFBhcmFtZXRlciBmdWVyIGRpZSgpCitzaW5kIGRlciBtYW5wYWdlIGZ1ZXIgZGllKCkgenUgZW50bmVobWVuLgorCisgICAgc3BpZWxlci0+ZGllKCk7IC8vIEpldHp0IGlzdCBkZXIgU3BpZWxlciB0b3QuCisKKworS2FwaXRlbCAyLjIgVG9kZXNmYWxsZSBtaXQgZG9fZGFtYWdlKCkKKworRGllIHp3ZWl0ZSBGb3JtIGRlciBUb2Rlc2ZhbGxlIGlzdCBuaWNodCBnYW56IHNvIGFnZ3Jlc3Npdiwgd2llIGRpZSBlcnN0ZS4KK0hpZXIgd2lyZCBkZW0gU3BpZWxlciBlaW5lIGZlc3RlIG9kZXIgenVmYWVsbGlnZSBaYWhsIGFuIFNjaGFkZW5zcHVua3RlbiAKK3p1Z2VmdWVndC4gRGVyIGVybGl0dGVuZSBTY2hhZGVuIGlzdCBkYWJlaSBuaWNodCB2b24gUnVlc3R1bmcgb2RlciBzb25zdGlnZW0KK1NjaHV0eiBhYmhhZW5naWcsIHNvbmRlcm4gZGVyIFNjaGFkZW4gYmV0cmFlZ3QgZGVtIHVlYmVyZ2ViZW5lbiBXZXJ0LiBJc3QgZGVyCit1ZWJlcmdlYmVuZSBXZXJ0IGhvZWhlciBhbHMgZGllIFphaGwgZGVyIExlYmVuc3B1bmt0ZSBkZXMgU3BpZWxlcnMsIHNvIHN0aXJidAorZGVyIFNwaWVsZXIuIE5hY2hsZXNlbiBrYW5uIG1hbiBkaWVzIGluIGRlciBtYW5wYWdlIHp1IGRvX2RhbWFnZSgpLgorRGllc2UgRm9ybSBkZXIgVG9kZXNmYWxsZSBpc3QgdmVybXV0bGljaCBkaWUgYW0gaGFldWZpZ3N0ZW4gdmVyYnJlaXRldGUsIGRhCitkZXIgTWFnaWVyIGFtIGVpbmZhY2hzdGVuIGRpZSBLb25zZXF1ZW56ZW4gdWViZXJibGlja2VuIGthbm4sIG9obmUgZGVuIFNwaWVsZXIKK3p3aW5nZW5kIHp1IHRvZXRlbi4gV2ljaHRpZyBiZWkgZGllc2VyIFVtc2V0enVuZyBpc3QsIGRhc3MgZGVyIFNwaWVsZXIga2VpbmUKK0FuZ3JpZmZzbWVsZHVuZyBvZGVyIGRlcmdsZWljaGVuIHNpZWh0LiBFciBiZWtvbW10IGhvZWNoc3RlbmZhbGxzIG1pdCwgZGFzcyBlcgordWViZXJoYXVwdCBTY2hhZGVuIGVyaGFsdGVuIGhhdC4gRGFoZXIgc29sbHRlIHZvciBkZW0gWnVmdWVnZW4gZGVzIFNjaGFkZW5zCitlaW5lIE1lbGR1bmcgYXVzZ2VnZWJlbiB3ZXJkZW4sIGRpZSBkZW0gU3BpZWxlciBhbnplaWd0LCB3ZXNoYWxiIGVyIFNjaGFkZW4KK2Jla2FtLiAoQnNwLiAiRWluIEZldWVyYmFsbCByYXN0IGF1ZiBEaWNoIHp1IHVuZCB0cmlmZnQgRGljaC4iKQorRGllIHRlY2huaXNjaGUgVW1zZXR6dW5nIHNpZWh0IHdpZSBmb2xndCBhdXM6CisKKyAgICB0ZWxsX29iamVjdChzcGllbGVyLCAiRWluIEZldWVyYmFsbCB0cmlmZnQgRGljaCB2b24gaGludGVuLlxuIik7CisgICAgc3BpZWxlci0+ZG9fZGFtYWdlKDEwLCB0aGlzX29iamVjdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTcGllbGVyIGVyaGFlbHQgZ2VuYXUgMTAgU2NoYWRlbnNwdW5rdGUgdW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RpcmJ0LCB3ZW5uIGVyIGRhZHVyY2ggdW50ZXIgMCBIUCBrb21tdC4KKworS2FwaXRlbCAyLjIuMSBBbmdlcGFzc3RlIFRvZGVzZmFsbGUgbWl0IGRvX2RhbWFnZSgpCisKK01vZWNodGUgbWFuLCBkYXNzIGRpZSBTdGFlcmtlIGRlciBUb2Rlc2ZhbGxlIGFiaGFlbmdpZyB2b20gU3BpZWxlciBpc3QsIGRhbm4KK2thbm4gbWFuIGRlbiBpbiBkb19kYW1hZ2UoKSB1ZWJlcmdlYmVuZW4gU2NoYWRlbiBhYmhhZW5naWcgdm9tIFNwaWVsZXIgbWFjaGVuLgorRGllcyBpc3QgaW4gR2ViaWV0ZW4gc2lubnZvbGwsIGluIGRlbmVuIEFuZmFlbmdlciB1bmQgZ3JvZXNzZXJlIFNwaWVsZXIKK2dsZWljaGVybWFzc2VuIGdlZm9yZGVydCBzZWluIHNvbGxlbiAoei5CLiBRdWVzdCkuIEZvbGdlbmRlcyBCZWlzcGllbCB6ZWlndCwKK3dpZSBtYW4gZWluZSBUb2Rlc2ZhbGxlIG1hY2h0LCBkaWUgZGVtIFNwaWVsZXIgZXR3YSAxLzQgc2VpbmVyIG1heGltYWxlbiBIUAorYWJ6aWVodC4KKyAgICAKKyAgICBzcGllbGVyLT5kb19kYW1hZ2Uoc3BpZWxlci0+UXVlcnlQcm9wKFBfTUFYX0hQKSAvIDQpOworCisKK0thcGl0ZWwgMi4zIFRvZGVzZmFsbGUgbWl0IHJlZHVjZV9oaXRfcG9pbnQKKworTWl0dGVscyByZWR1Y2VfaGl0X3BvaW50KCkgaXN0IGVzIG1vZWdsaWNoLCBlaW5lIG5pY2h0IHRvZWRsaWNoZSAiVG9kZXMiLUZhbGxlCit6dSBlbnR3aWNrZWxuLiBEaWVzIGthbm4gZ2VudXR6dCB3ZXJkZW4sIHdlbm4gbWFuIGVpbmUgZWlnZW50bGljaCB0b2VkbGljaGUKK0ZhbGxlIG1hY2hlbiB3aWxsLCBkaWUgQXVzd2lya3VuZ2VuIGVpbmVzIFRvZGVzIGRlbSBTcGllbGVyIGdlZ2VudWViZXIgYWJlciB6dQorYWdncmVzc2l2IHdhZXJlbi4gSGllcmJlaSBpc3QgenUgYmVhY2h0ZW4sIGRhc3MgZWluIG5lZ2F0aXZlciBXZXJ0IGVpbmUKK0hlaWx1bmcgYmV3aXJrZW4gd3VlcmRlLiBEYWhlciBpc3QgenV2b3IgZWluZSBTaWNoZXJoZWl0c2FiZnJhZ2UgenUgbWFjaGVuLgorV2llIGJlaSBkb19kYW1hZ2UoKSBpc3QgZWluZSBNZWxkdW5nIGF1c3p1Z2ViZW4sIGRhIHJlZHVjZV9oaXRfcG9pbnQgZWluZQorc29sY2hlIG5pY2h0IGdlbmVyaWVydC4gQWxsZXMgenVzYW1tZW4gc2FlaGUgZGVyIFBhcnQgd2llIGZvbGd0IGF1czoKKworICAgIGludCBzY2hhZGVuOworICAgIHRlbGxfb2JqZWN0KHNwaWVsZXIsICJFaW4gRmV1ZXJiYWxsIHRyaWZmdCBEaWNoLlxuIik7CisgICAgLy8gSGllciBkZW4gU2NoYWRlbiBiZXJlY2huZW47CisgICAgLy8gWi5CLiBzY2hhZGVuID0gMzsKKyAgICBpZiAoc2NoYWRlbiA8IDEpIHNjaGFkZW4gPSAxOyAvLyBFcyBzb2xsIG1pbmRlc3RlbnMgMSBTY2hhZGVuc3B1bmt0IGdlYmVuIQorICAgIHNwaWVsZXItPnJlZHVjZV9oaXRfcG9pbnQoc2NoYWRlbik7CisKKworS2FwaXRlbCAyLjQgRmFrZXRvZGUKKworRmFrZXRvZGUgc2luZCBrZWluZSBUb2RlIGltIGVpZ2VudGxpY2hlbiBTaW5uLCBkYSBkZXIgU3BpZWxlciB2b24gZGVuCittZWlzdGVuIG5lZ2F0aXZlbiBBdXN3aXJrdW5nZW4gdmVyc2Nob250IGJsZWlidC4gRWluIEZha2V0b2QgaXN0IGltIEdydW5kZQora2VpbmUga29tcGxpemllcnRlIFNhY2hlIHVuZCBlaWduZXQgc2ljaCBoZXJ2b3JyYWdlbmQgZnVlciBBbmZhZW5nZXJnZWJpZXRlLgorVmVyc2NoaWVkZW5lbiBBdXNwcmFlZ3VuZ2VuIChCc3AuIEdpYnQgZXMgZWluZSBMZWljaGUgbWl0IGRlciBBdXNydWVzdHVuZyBkZXMKK1NwaWVsZXJzIG9kZXIgYmVoYWVsdCBlciBkaWUgQXVzcnVlc3R1bmc/KSBnZW1laW4gaXN0IGRpZSBUYXRzYWNoZSwgZGFzcyBkZXIKK1NwaWVsZXIgYXVnZW5zY2hlaW5saWNoIGdlc3RvcmJlbiBpc3QsIGplZG9jaCBrZWluIGRpZSgpIGF1ZmdlcnVmZW4gd2lyZC4gRXMKK3dlcmRlbiB0b2Rlc2JlZGluZ3QgYWxzbyBrZWluZSBBdHRyaWJ1dGUgYWJnZXpvZ2VuLCBkaWUgRXJmYWhydW5nc3B1bmt0ZQorYmxlaWJlbiB1bmFuZ2V0YXN0ZXQgdXN3LCB1c2YuCitEaWUgdGVjaG5pc2NoZSBVbXNldHp1bmcgc2llaHQgd2llIGZvbGd0IGF1cy4gRGFiZWkgaXN0IHp1IGJlYWNodGVuLCBkYXNzIGRlcgorU3BpZWxlciBHZWlzdCB3ZXJkZW4gbXVzcy4gWnV2b3Igc29sbHRlIHdpZSBiZWkgZGVuIHZvcmhlcmdlaGVuZGVuIE1ldGhvZGVuCitkZXIgS2lsbC1OYW1lIGV0Yy4gZ2VzZXR6dCB3ZXJkZW4uCisKKyAgICBzcGllbGVyLT5TZXRQcm9wKFBfR0hPU1QsMSk7CisgICAgY2xvbmVfb2JqZWN0KCIvcm9vbS9kZWF0aC9kZWF0aF9tYXJrIiktPm1vdmUoc3BpZWxlcik7CisKKworS2FwaXRlbCAyLjQuMSBCZWRpbmd0ZSBGYWtldG9kZS4KKworTWFuIGthbm4gZGllIFRlY2huaWsgdm9uIEthcGl0ZWwgMi4zIG1pdCBkZW4gRmFrZXRvZGVuIGtvbWJpbmllcmVuLCBpbmRlbSBtYW4KK3Rlc3RldCwgb2IgZGVyIFNwaWVsZXIgYXVmIG9kZXIgdW50ZXIgMCBMZWJlbnNwdW5rdGUga29tbWVuIHd1ZXJkZSwgd2VubiBtYW4KK2Fuc3RhdHQgcmVkdWNlX2hpdHBvaW50IGRvX2RhbWFnZSgpIG1hY2hlbiB3dWVyZGUgdW5kIGRhbm4genVzYWV0emxpY2ggenVtCitBYnppZWhlbiBkZXIgTFAgbm9jaCBlaW5lbiBGYWtldG9kIGF1c2Z1ZWhydC4gRGFiZWkgc2luZCB6d2VpIERpbmdlIHp1CitiZWFjaHRlbjoKK0Vyc3RlbnMgc29sbHRlIG1hbiBrZWluZSB6d2VpIE1lbGR1bmdlbiBhdXNnZWJlbiwgYWxzbyBkZXIgU3BpZWxlciBzb2xsdGUKK2tlaW5lIHp3ZWkgRmV1ZXJiYWVsbGUgYXVmIHNpY2ggenVmbGllZ2VuIHNlaGVuLCBvYndvaGwgbnVyIGVpbmVyIGRhIGlzdC4KK1p3ZWl0ZW5zIHNvbGx0ZSBtYW4gbmljaHQgdmVyZ2Vzc2VuLCBkZW0gU3BpZWxlciBkZW5ub2NoIGRpZSBMUCBhYnp1emllaGVuLAord2VpbCBkZXIgU3BpZWxlciBhbnNvbnN0ZW4gbmFjaCBkZW0gRW50Z2Vpc3Rlcm4gYW5zdGF0dCAxIExQIG5vY2ggc292aWVsZSBoYXQsCit3aWUgdm9yIGRlbSBGZXVlcmJhbGwtQW5ncmlmZi4KK0RpZSB0ZWNobmlzY2hlIFVtc2V0enVuZyBkaWVzZXIgS29tYmluYXRpb24gd2lyZCBhbiBkaWVzZXIgU3RlbGxlIG5pY2h0IG5hZWhlcgorZXJsYWV1dGVydCwgZGEgZGFzIFZvcmdlaGVuIGF1cyBkZW4gdm9yaWdlbiBLYXBpdGVsbiBrbGFyIGlzdC4KKworCitLYXBpdGVsIDIuNSBBbmdyaWZmIG1pdHRlbHMgRGVmZW5kKCkKKworRWluZSByZWFsaXN0aXNjaGUsIHdlbm4gYXVjaCB0ZWlsd2Vpc2UgaGVpa2xlIE1vZWdsaWNoa2VpdCBmdWVyIGVpbmUKK1RvZGVzZmFsbGUgaXN0IGRlciBBdWZydWYgZGVyIERlZmVuZCgpLUZ1bmt0aW9uIGRlcyBTcGllbGVycy4gRGVyIFZvcnRlaWwKK3ZvbiBEZWZlbmQgaXN0LCBkYXNzIG1hbiB1bnRlciBBbmdhYmUgZGVyIGtvcnJla3RlbiBQYXJhbWV0ZXIgZGVuIFNjaHV0eiBkZXIKK1J1ZXN0dW5nZW4gZWluZXMgU3BpZWxlcnMgb2RlciBhdWNoIGRpZSBHaWxkZW5mYWVoaWdrZWl0ZW4gYmVydWVja3NpY2h0aWd0Cit3ZXJkZW4uIERhcmF1cyBmb2xndCwgZGFzcyBkZXIgYWxzIEJlaXNwaWVsIHZlcndlbmRldGUgRmV1ZXJiYWxsIHZvbiBlaW5lbSB2b3IKK0ZldWVyIHNjaHVldHplbmRlbiBPYmpla3QgYWJnZXNjaHdhZWNodCB3dWVyZGUuIEFud2VuZHVuZ3N0ZWNobmlzY2ggZ2lidCBlcworZXJzdCBlaW5tYWwga2VpbmUgUHJvYmxlbWUsIHNvZmVybiBlaW5pZ2Ugd2ljaHRpZ2UgUHVua3RlIGJlYWNodGV0IHdlcmRlbiwgYXVmCitkaWUgaGllciBudW4gZWluZ2VnYW5nZW4gd2lyZC4gRWluemlnZXIgTmFjaHRlaWwgYmVzdGVodCBudXIgaW4gZGVyIG1hbmdlbG5kZW4KK0VyZmFocnVuZyBkZXIgZWluenV0cmFnZW5kZW4gU2NoYWRlbnN3ZXJ0ZSwgZGEgZGllc2UgbmljaHQgMToxIGFuIGRpZQorU2NoYWRlbnNwdW5rdGUgZ2Vrb3BwZWx0IHNpbmQsIGRpZSBhbiBkZW4gU3BpZWxlciB3ZWl0ZXJnZXJlaWNodCB3ZXJkZW4uCitEaWUgdGVjaG5pc2NoZSBVbXNldHp1bmcgZnVlciBkZW4gQW5ncmlmZiBlaW5lcyBTcGllbGVycyBkdXJjaCBlaW5lIFRvZGVzZmFsbGUKK3VlYmVyIERlZmVuZCBzaWVodCB3aWUgZm9sZ3QgYXVzOgorCisgICAgI2luY2x1ZGUgPG5ld19za2lsbHMuaD4KKworICAgIGludCBzY2hhZGVuOworICAgIHNjaGFkZW4gPSA1MDArcmFuZG9tKDUwMCk7IC8vIERpZXNlIFdlcnRlIG1hY2hlbiB1LlUuIHZpZWwgU2NoYWRlbi4KKworICAgIHNwaWVsZXItPkRlZmVuZCgKKyAgICAgICAgMTAwLAorICAgICAgICBEVF9GSVJFLAorICAgICAgICAoWworICAgICAgICAgICAgU1BfU0hPV19EQU1BR0U6MCwKKyAgICAgICAgICAgIFNQX1BIWVNJQ0FMX0FUVEFDSzoxCisgICAgICAgIF0pLAorICAgICAgICB0aGlzX29iamVjdCgpCisgICAgKTsKKworV2ljaHRpZyBzaW5kIGhpZXJiZWkgZm9sZ2VuZGUgUHVua3RlOgorICAgIDEuIE1hbiBzb2xsdGUgU1BfU0hPV19EQU1BR0U6MCBpbSBNYXBwaW5nIGFuZ2ViZW4sIHdlbm4gbWFuIGRpZSBNZWxkdW5nCisgICAgICAgei5CLiAiRWluIEZldWVyYmFsbCB0cmlmZnQgRGljaCB2b24gaGludGVuLlxuIiBzZWxic3QgYXVzZ2ViZW4gd2lsbC4KKyAgICAgICBUdXQgbWFuIGRpZXMgbmljaHQsIG11c3MgaW0gUmF1bSB6dXNhZXR6bGljaCBQX0dFTkRFUiwgUF9OQU1FLCBldGMuCisgICAgICAgYXVmIGVpbmVuIHNpbm52b2xsZW4gV2VydCBnZXNldHp0IHdlcmRlbiwgYmVpc3BpZWxzd2Vpc2UgUF9HRU5ERVIgYXVmCisgICAgICAgTUFMRSB1bmQgUF9OQU1FIGF1ZiAiRmV1ZXJiYWxsIi4KKyAgICAyLiBTUF9QSFlTSUNBTF9BVFRBQ0s6MSBzb2xsdGUgZ2VzZXR6dCB3ZXJkZW4sIHdlbm4gZGVzIFNwaWVsZXJzIFJ1ZXN0dW5nCisgICAgICAgZnVlciBkaWUgVmVydGVpZGlndW5nIGJlcnVlY2tzaWNodGlndCB3ZXJkZW4gc29sbC4gR2VuYXVlcmVzIGZpbmRldCBtYW4KKyAgICAgICBhdWYgZGVyIE1hbnBhZ2Ugdm9uIERlZmVuZCgpLgorICAgIDMuIHRoaXNfb2JqZWN0KCkgc29sbHRlIGltbWVyIGFuZ2VnZWJlbiB3ZXJkZW4sIGRhbWl0IGRlciBSYXVtIGRlcgorICAgICAgIEFuZ3JlaWZlciBpc3QsIGFuc3RhdHQgZWluIG5pY2h0IG5hZWhlciBiZXN0aW1tdGVzIE9iamVrdC4gRGllcyBrb2VubnRlCisgICAgICAgZGFubiBiZWlzcGllbHN3ZWlzZSBkZXIgU3BpZWxlciBzZWxic3Qgc2Vpbiwgd2FzIGRhenUgZnVlaHJ0LCBkYXNzIGltCisgICAgICAgRmFsbGUgZWluZXMgVG9kZXMgZGVyIFNwaWVsZXIgYWxzIEtpbGxlciB2b24gc2ljaCBzZWxic3QgZ2VuYW5udCB3aXJkLAorICAgICAgIGFuc3RhdHQgIkVpbiBGZXVlcmJhbGwiLgorCisKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBXZWQgRmViIDEzIDE3OjAwOjU0IDIwMDIgYnkgQmFtYmkKZGlmZiAtLWdpdCBhL2RvYy93aXovdG9kZXNzZXF1ZW56IGIvZG9jL3dpei90b2Rlc3NlcXVlbnoKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFiMDNlOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93aXovdG9kZXNzZXF1ZW56CkBAIC0wLDAgKzEsMTE1IEBACitFaW5lIFRvZGVzc2VxdWVueiBpc3QgZWluZSBnYW56IG5vcm1hbGUgVGV4dGRhdGVpIG1pdCBmb2xnZW5kZW0gQXVmYmF1OgorSW4gZGVyIGVyc3RlbiBaZWlsZSBzdGVodCBkaWUgRGF1ZXIgZGVyIFRvZGVzc2VxdWVueiBpbiBoZWFydF9iZWF0LUVpbmhlaXRlbi4KK0VzIGZvbGdlbiBFaW50cmFlZ2UgZGVyIEZvcm0gPHplaXQ+Ojx0ZXh0Pi4gPHplaXQ+IGlzdCBkYWJlaSBkZXIgWmVpdHB1bmt0CisoZWJlbmZhbGxzIGluIGhlYXJ0X2JlYXQtRWluaGVpdGVuKSwgaW4gZGVuZW4gZGVyIFRleHQgPHRleHQ+IGF1c2dlZ2ViZW4KK3dlcmRlbiBzb2xsLiA8dGV4dD4ga2FubiBzaWNoIGRhYmVpIGF1Y2ggdWViZXIgbWVocmVyZSBaZWlsZW4gZXJzdHJlY2tlbjsKK0xlZXJ6ZWlsZW4gd2VyZGVuIDE6MSB1ZWJlcm5vbW1lbi4KKworQmVpc3BpZWw6CistLS0tIDxzbmlwPiAtLS0tCis3MAorMTpWb3IgRGlyIHR1dCBzaWNoIGVpbiB0aWVmZXIsIHNjaHdhcnplciBBYmdydW5kIGF1Zi4gRWluIHN0YXJrZXIgU29nCit2ZXJzdWNodCwgRGljaCBoaW5laW56dXppZWhlbi4KKworMjpEdSBiYWxhbmNpZXJzdCBtdWVoc2FtIGF1ZiBkZW0gUmFuZCBkZXMgQWJncnVuZGVzLCBkb2NoIGRhbm4gd2lyZCBkZXIKK1NvZyB6dSBzdGFyayEKKworMzpEdSBmYWVsbHN0ISBVbSBEaWNoIGhlcnVtIGlzdCBudXIgbm9jaCB0aWVmZSBTY2h3YWVyemUuCisuLi4gdXN3LgorLS0tLSA8c25pcD4gLS0tCisKK1VtIGRpZSBUb2Rlc3NlcXVlbnogZWluIHdlbmlnIGFid2VjaHNsdW5nc3JlaWNoZXIgenUgZ2VzdGFsdGVuLCBrYW5uIG1hbgorZWluaWdlIFBsYXR6aGFsdGVyIHZlcndlbmRlbi4gTWFuIGthbm4gTWVsZHVuZ2VuIGVpbmJhdWVuLCBkaWUgYWJoYWVuaWcgc2luZAorCistIHZvbSBHZXNjaGxlY2h0OiBkaWVzIGdlaHQgbWl0IDxHPm1UZXh0OndUZXh0PC9HPi4gbVRleHQgd2lyZCBiZWkgbWFlbm5saWNoZW4KKyAgVG90ZW4gZWluZ2ViYXV0LCB3VGV4dCBiZWkgd2VpYmxpY2hlbi4gTWFuIGthbm4gYXVjaCBlaW5lbiBkZXIgVGV4dGUgd2VnLQorICBsYXNzZW47IGRlciBEb3BwZWxwdW5rdCBpc3QgamVkb2NoIFBmbGljaHQhCisgIEJlaXNwaWVsOgorICAgIDU6RGVyIFRvZCBzYWd0OiBLT01NIE1JVCBNSVIsIFNURVJCTElDSEU8Rz5SOjwvRz4hCisgICAgNjpEZXIgVG9kIHNhZ3Q6IFdBUiBXT0hMIE5JWCwgPEc+QlVFUlNDSENIRU46RlJPTExFSU5DSEVOPC9HPiEKKworLSB2b24gZGVyIFJhc3NlOiBEaWVzIGdlaHQgYWVobmxpY2ggd2llIGJlaW0gR2VzY2hsZWNodCwgdW5kIHp3YXIgaW4gZGVyIEZvcm0KKyAgPFI+ZFRleHR8bVRleHR8ZVRleHR8elRleHR8aFRleHR8ZlRleHQ8L1I+LgorICBtVGV4dCB3aXJkIGJlaSBNZW5zY2hlbiBhdXNnZWdlYmVuLCBlVGV4dCBiZWkgRWxmZW4sIHpUZXh0IGJlaSBad2VyZ2VuLAorICBoVGV4dCBiZWkgSG9iYml0cywgZlRleHQgYmVpIEZlbGluZW4gdW5kIGRUZXh0IGJlaSBhbGxlbiBhbmRlcmVuCisgICh6Qi4gTWFnaWVyIG1pdCBzZWxic3QgZ2VzZXR6dGVuIFJhc3NlbikuCisKKyAgV2llIGJlaSBnZXNjaGxlY2h0c2FiaGFlbmdpZ2VuIE1lbGR1bmdlbiBrb2VubmVuIGF1Y2ggaGllciBlaW56ZWxuZSBUZXh0ZQorICB3ZWdnZWxhc3NlbiB3ZXJkZW4uCisKKyAgQmVpc3BpZWw6CisgICAgMTpEZXIgVG9kIHNhZ3Q6IFNDSE9FTiBHRVNUT1JCRU4sIDxSPkZSRU1ETElOR3xNRU5TQ0hMRUlOfFNQSVRaT0hSfERSRUlLQUVTRUhPQ0g8L1I+PworICAgIDI6PFI+fHxEZXIgVG9kIHNhZ3Q6IEVMRkVOIFdBUkVOIFNDSE9OIExBTkdFIE5JQ0hUIE1FSFIgSElFUiF8PC9SPgorCistIHZvbSBDaGFyYWt0ZXI6IERlciBDaGFyYWt0ZXIgZWluZXMgU3BpZWxlcnMga2FubiBzaWNoIGltIEJlcmVpY2ggdm9uIC0xMDAwCisgIChzYXRhbmlzY2gpIGJpcyArMTAwMCAoaGVpbGlnKSBiZXdlZ2VuLiBad2lzY2hlbiA8QT4gdW5kIDwvQT4ga2FubiBtYW4KKyAgY2hhcmFrdGVyYWJoYWVuZ2lnZSBNZWxkdW5nZW4gZWluYmF1ZW4uIERpZSBBYnN0dWZ1bmdlbiB3ZXJkZW4gZGFiZWkgaW4gZGVyCisgIEZvcm0gIyM8VW50ZXJncmVuemU+IyMgYW5nZWdlYmVuLCB3b2JlaSA8VW50ZXJncmVuemU+IGRpZSB1bnRlcmUgR3JlbnplIGRlcworICBDaGFyYWt0ZXJ3ZXJ0ZXMgaXN0LCBhYiBkZW0gZGllIE1lbGR1bmcgYXVzZ2VnZWJlbiB3aXJkLgorICBEZXIgVGV4dCBkaXJla3QgbmFjaCA8QT4gZW50c3ByaWNodCBlaW5lciBVbnRlcmdyZW56ZSB2b24gLTEwMDAsIGRpZQorICB3ZWl0ZXJlbiBUZXh0ZSBzb2xsdGVuIGluIGF1ZnN0ZWlnZW5kZXIgUmVpaGVuZm9sZ2UgYW5nZWdlYmVuIHdlcmRlbi4KKyAgQmVpc3BpZWw6CisgICAgNzo8QT4KKyAgICBEZXIgVG9kIHNhZ3Q6IEFILCBFSU4gU0FUQU5JU1QhCisgICAgIyMtOTk5IyMKKyAgICBEZXIgVG9kIHNhZ3Q6IFNPIEVJTjxHPjpFPC9HPiBTQ0hMSU1NRTxHPlI6PC9HPiEKKyAgICAjIzAjIworICAgIERlciBUb2Qgc2FndDogRUlOIFRZUElTQ0hFUyBVTkVOVFNDSElFREVOLi4uCisgICAgIyMxIyMKKyAgICBEZXIgVG9kIHNhZ3Q6IFNPIEVJTjxHPjpFPC9HPiBMSUVCRTxHPlI6PC9HPiEKKyAgICAjIzEwMDAjIworICAgIERlciBUb2Qgc2FndDogT0gsIEdVVEVOIFRBRywgRVVFUiBIRUlMSUdLRUlUIQorICAgIDwvQT4KKworLSB2b24gZGVyIFphaGwgZGVyIFRvZGU6IERpZXMgZ2VodCBhZWhsaWNoIHdpZSBiZWltIENoYXJha3RlciwgYWxsZXJkaW5ncworICBpc3QgZGVyIFBsYXR6aGFsdGVyIGhpZXIgPEQ+Li4uPC9EPi4gRGllIFVudGVyZ3JlbnplIGZ1ZXIgZGVuIGVyc3RlbiBUZXh0CisgIGlzdCAxIChzb25zdCB3YWVyZSBkZXIgU3BpZWxlciBqYSBuaWNodCBoaWVyIDspCisgIEJlaXNwaWVsOgorICAgIDg6PEQ+CisgICAgRGVyIFRvZCBzYWd0OiBTQ0hPRU4sIERJQ0ggQVVDSCBNQUwgSElFUiBaVSBTRUhFTiEKKyAgICAjIzIjIworICAgIERlciBUb2Qgc2FndDogTUFDSCBESVIgTklYIERSQVVTLCBEQVMgUEFTU0lFUlQgU0NIT04gTUFMIQorICAgICMjMjAjIworICAgIERlciBUb2Qgc2FndDogV0FTLCBEVSBTQ0hPTiBXSUVERVI/CisgICAgIyM1MCMjCisgICAgRGVyIFRvZCBzYWd0OiBOT0NIIEVJTk1BTCwgVU5EIElDSCBCRUhBTFRFIERJQ0ggRU5ER1VFTFRJRyBISUVSIQorICAgIDwvRD4KKworLSB2b20gTGV2ZWw6IEF1Y2ggaGllciBlcmZvbGd0IGRpZSBBdXN3ZXJ0dW5nIHdpZSBiZWltIENoYXJha3RlciwgYWxsZXJkaW5ncworICB6d2lzY2hlbiBkZW4gUGxhdHpoYWx0ZXJuIDxMPiB1bmQgPC9MPi4gRGllIFVudGVyZ3JlbnplIGZ1ZXIgZGVuIGVyc3RlbgorICBUZXh0IGlzdCAwLgorICBCZWlzcGllbDoKKyAgICA4OjxMPgorICAgIERlciBUb2Qgc2FndDogTUFDSCBESVIgTklDSFRTIERSQVVTLgorICAgICMjNSMjCisgICAgRGVyIFRvZCBzYWd0OiBWSUVMTEVJQ0hUIFNPTExURVNUIERVIERBUyBOQUVDSFNURSBNQUwgQkVTU0VSIEFVRlBBU1NFTiEKKyAgICAjIzE1IyMKKyAgICBEZXIgVG9kIHNhZ3Q6IFNPIFdJUlNUIERVIE5JRSBTRUhFUiBPREVSIE1BR0lFUiEKKyAgICAjIzIwIyMKKyAgICBEZXIgVG9kIHNhZ3Q6IE5VUiBFSU4gVE9URVIgU0VIRVIgSVNUIEVJTiBHVVRFUiBTRUhFUiEgOykKKyAgICA8L0w+CisKKy0gdm9tIFp1ZmFsbDogVW5kIG5vY2ggbWVociBBYndlY2hzbHVuZy4uLiA7KSBEZXIgQXVmYmF1IGlzdCBhZWhubGljaCBkZW0gZGVyCisgIHZvcmhlcmlnZW4uIFp3aXNjaGVuIGRlbiBQbGF0emhhbHRlcm4gPFo9d2VydD4gdW5kIDwvWj4gc3RlaGVuIE1lbGR1bmdlbiBkZXIKKyAgIyN4IyN0ZXh0LCB3b2JlaSBkaWUgeCBkaWUgcmVsYXRpdmUgV2FocnNjaGVpbmxpY2hrZWl0IChiZXpvZ2VuIGF1ZiB3ZXJ0KQorICBhbmdlYmVuLCBtaXQgZGVyIGRlciBUZXh0IHRleHQgYXVzZ2VnZWJlbiB3aXJkLgorICBEaWUgeCBzb2xsdGVuIHp1c2FtbWVuZ2V6YWVobHQgd2VydCBlcmdlYmVuISBEaWUgUmVpaGVuZm9sZ2UgaXN0IHp3YXIKKyAgcHJpbnppcGllbGwgZWdhbCwgYXVzIFBlcmZvcm1hbmNlZ3J1ZW5kZW4gc29sbHRlIG1hbiBkaWUgVGV4dGUgYWJlciBtaXQKKyAgYWJzdGVpZ2VuZGVyIFdhaHJzY2hlaW5saWNoa2VpdCBhbm9yZG5lbi4KKyAgQmVpc3BpZWw6CisgICAgOTo8Wj02PgorICAgICMjMyMjCisgICAgRGllc2VyIFRleHQgd2lyZCBpbiA1MCUgYWxsZXIgRmFlbGxlIGF1c2dlZ2ViZW4gKDMvNikKKyAgICAjIzIjIworICAgIERpZXNlciBUZXh0IGluIDMzJSBhbGxlciBGYWVsbGUgKDIvNikKKyAgICAjIzEjIworICAgIFVuZCBkaWVzZXIgVGV4dCBpbiAxNyUgYWxsZXIgRmFlbGxlICgxLzYpCisgICAgPC9aPgorCitBdXNzZXJkZW0ga2FubiBtYW4gbm9jaCBkZW4gTmFtZW4gZGVzIFRvdGVuIGVpbmJhdWVuLCB1bmQgendhciBtaXQgPG4+IGluCitub3JtYWxlciBTY2hyZWlid2Vpc2UsIHVuZCBtaXQgPE4+IGluIEdST1NTYnVjaHN0YWJlbi4KK0JlaXNwaWVsOgorICAxMDpEdSBzY2hhdXN0IGluIGRlbiBTcGllZ2VsIHVuZCBzaWVoc3Q6IDxuPiEKKyAgMTE6RGVyIFRvZCBzYWd0OiBIQUxMTywgPE4+IQorCisKZGlmZiAtLWdpdCBhL2RvYy93aXovdG9wbGlzdGUgYi9kb2Mvd2l6L3RvcGxpc3RlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzOWVmYzYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd2l6L3RvcGxpc3RlCkBAIC0wLDAgKzEsMzMgQEAKK0Z1ZXIgZGllIFZlcndhbHR1bmcgZGVyIFN0YW5kYXJkdG9wbGlzdGVuIGdpYnQgZXMgL3NlY3VyZS90b3BsaXN0ZSwgd2VsY2hlcyAoenVyIFplaXQpIGJlaSBMb2dpbiBiZWkgdG9wbGlzdGVuLXdpbGxpZ2VuIFNwaWVsZXJuIGRpZSB0b3BsaXN0ZW4tcmVsZXZhbnRlbiBEYXRlbiB2b20gU3BpZWxlciBhYmZyYWd0IHVuZCBpbiBlaW5lciBUYWJlbGxlIGVpbnRyYWVndC4KKworQWJmcmFnZW4gbGFlc3N0IGRpZSBMaXN0ZSBqZWRlcnplaXQgd2llIGZvbGd0IGR1cmNoIEF1ZnJ1ZiBmb2xnZW5kZXIgRnVua3Rpb25lbiBpbiAvc2VjdXJlL3RvcGxpc3RlOiBMaXN0ZSwgU3BpZWxlckxpc3RlLCBTZWhlckxpc3RlIHVuZCBIYXJkY29yZUxpc3RlLgorCitEaWUgNCBzaW5kIHZhcmFyZ3MgdW5kIGJla29tbWVuIGZvbGdlbmRlIG1vZWdsaWNoZSBBcmd1bWVudGU6CisqIHN0cmluZyByYXNzZQorICBOdXIgU3BpZWxlciBkZXIgUmFzc2UgPHJhc3NlPiBiZXJ1ZWNrc2ljaHRpZ2VuCisqIHN0cmluZyBnaWxkZQorICBOdXIgU3BpZWxlciBkZXIgR2lsZGUgPGdpbGRlPiBiZXJ1ZWNrc2ljaHRpZ2VuCisqIGludCBsaW1pdAorICBNYXguIDxsaW1pdD4gRWludHJhZWdlLCBEZWZhdWx0OiAxMDAsIE1heDogMTAwCisqIHN0cmluZyBzb3J0CisgIExpc3RlIHNvcnRpZXJlbiBuYWNoOiBsZXAsIHFwLCB4cCwgYWdlLCB3aXpsZXZlbCwgaGFyZGNvcmUsIGdpbGRlLCByYXNzZSwgCisgIG5hbWUKKyAgRGVmYXVsdDogbGVwCisKK0RpZSBGdW5rdGlvbmVuIGxpZWZlcm4gZWluIEFycmF5IHp1cnVlY2ssIHdhcyBmdWVyIGplZGVuIEVpbnRyYWcgaW4gZGVyIFRvcGxpc3RlIHdpZWRlciBlaW4gQXJyYXkgZW50aGFlbHQ6IDwgPHN0cmluZ3xpbnQ+KiA+KgorCitCZWlzcGllbGU6CisjIC9zZWN1cmUvdG9wbGlzdGUtPkxpc3RlKCkKKyAgRGllIDEwMCBDaGFycyBtaXQgZGVuIG1laXN0ZW4gU3R1ZmVucHVua3RlbgorIyAvc2VjdXJlL3RvcGxpc3RlLT5IYXJkY29yZUxpc3RlKDAsMCwxMCkKKyAgRGllIDEwIEhDLUNoYXJzIG1pdCBkZW4gbWVpc3RlbiBTdHVmZW5wdW5rdGVuCisjIC9zZWN1cmUvdG9wbGlzdGUtPkxpc3RlKDAsImthZW1wZmVyIiwxMCwieHAiKQorICBEaWUgMTAgS2FlbXBmZXItQ2hhcnMgbWl0IGRlbiBtZWlzdGVuIFhQCisjIC9zZWN1cmUvdG9wbGlzdGUtPkxpc3RlKCJad2VyZyIsInphdWJlcmVyIikKKyAgRGllIDEwMCBad2VyZ2VuemF1YmVyZXIgbWl0IGRlbiBtZWlzdGVuIFN0dWZlbnB1bmt0ZW4KK1dlaXRlcmVzIGtvZW5udCBpaHIgZXVjaCBqYSBzaWNoZXIgZGVua2VuLgorCitBY2hzbywgZGFzIEVyZ2VibmlzIHNpZWh0IGRhbm4gdW5nZWZhZWhyIHNvIGF1czoKKyh7ICh7bmFtZSwgbGVwLCBxcCwgeHAsIGxldmVsLCBhZ2UsIHJhc3NlLCBnaWxkZSwgd2l6bGV2ZWwsIGhhcmRjb3JlfSksIC4uLiB9KQorKHsoeyJoY3BsYXkiLDEwMCwwLDAsMSw2MiwiTWVuc2NoIiwiYWJlbnRldXJlciIsMCwxfSl9KQorCmRpZmYgLS1naXQgYS9kb2Mvd2l6L3RyYW5zcG9ydGVyIGIvZG9jL3dpei90cmFuc3BvcnRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2YwMDFjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dpei90cmFuc3BvcnRlcgpAQCAtMCwwICsxLDE5IEBACitERUZJTklFUlQgSU46CisJIi9zdGQvdHJhbnNwb3J0IgorCSIvc3lzL3RyYW5zcG9ydC5oIgorCitCRU1FUktVTkdFTjoKKwladSBUcmFuc3BvcnRlcm4gZ2lidCBlcyBlaW4gQmVpc3BpZWwgdW50ZXIKKyAgICAgICAgJy9kb2MvYmVpc3BpZWxlL21pc2MvYnNwdHJhbnNwb3J0ZXIxLmMnIHVuZCBhdWNoIGRpZSB2ZXJ3ZW5kZXRlbiAKKyAgICAgICAgUHJvcGVydGllcyBzaW5kIGRva3VtZW50aWVydC4KKwkKKyAgICAgICAgVW0gZWluZW4gVHJhbnNwb3J0ZXIgenUgYWt0aXZpZXJlbiwgbXVzcyBlciBpbiBkYXMgUHJlbG9hZC1GaWxlIGRlcgorCVJlZ2lvbiBnZXNjaHJpZWJlbiB3ZXJkZW4sIG9kZXIgYWJlciB1ZWJlciBlaW5lIEZ1bmt0aW9uIGltIFN0YXJ0LQorCXVuZCBaaWVscmF1bSBhdWZnZXJ1ZmVuIHdlcmRlbiwgZGllIGRhcyBlcmxlZGlndC4KKworU0lFSEUgQVVDSDoKKwlQX0FSUklWRU1TRywgUF9ERVBBUlRNU0csIFBfRU5URVJNU0csIFBfTEVBVkVNU0csIFBfTEVBVkVGQUlMLAorCVBfRU5URVJGQUlMLCBQX01BWF9QQVNTRU5HRVJTLCBBZGRSb3V0ZSwgQWRkTXNnLCBTdGFydAorICAgICAgICAvZC9pbnNlbG4vc2NoaWZmZS9Ib3dUbworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogV2VkIERlYyAyNiAxNC40MzowNyAyMDAxIGJ5IFRpbGx5CmRpZmYgLS1naXQgYS9kb2Mvd2l6L3VuaXF1ZXMgYi9kb2Mvd2l6L3VuaXF1ZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUwN2ZmOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93aXovdW5pcXVlcwpAQCAtMCwwICsxLDQyIEBACisKKyBVTklRVUVTCisgICAgCisgICAgU29nZW5hbm50ZSAidW5pcXVlcyIgc2luZCBPYmpla3RlLCBkaWUgbmljaHQgaW4gYmVsaWViaWdlciBBbnphaGwgaW0gTXVkCisgICAgdm9yaGFuZGVuIHNlaW4ga29lbm5lbiwgc29uZGVybiB2b24gZGVuZW4gZXMgZW50d2VkZXIgbnVyIGVpbnMgb2RlciBlaW5lCisgICAgYmVncmVuenRlIEFuemFobCBnaWJ0LiBCZWlzcGllbGUgZnVlciB1bmlxdWVzIHNpbmQgZGVyIGJla2FubnRlIFZvbGwtCisgICAgc3RyZWNrZXIgZGVzIFdlZ2hpZXJzIG9kZXIgZGllIGdydWVuZW4gUm9iZW4gYXVzIGRlbSBTY2hlbWVucmVpY2guCisgICAgRGllIEJlZ3Jlbnp1bmcgYXVmIHdlbmlnZSBPYmpla3RlIGhhdCBub3JtYWxlcndlaXNlIGRlbiBTaW5uLCBiZXNvbmRlcmUKKyAgICBFaWdlbnNjaGFmdGVuIG9kZXIgYXVzc2VyZ2V3b2VobmxpY2hlIFN0YWVya2UgenUgcmVjaHRmZXJ0aWdlbi4gQmVpIAorICAgIGVpbmlnZW4gT2JqZWt0ZW4gcGFzc2llcnQgZGllcyBhdWNoIGF1cyBsb2dpc2NoZW4gR3J1ZW5kZSwgd2VpbCBkYXMKKyAgICBPYmpla3QgZWluZmFjaCBlaW56aWdhcnRpZyBpc3QuCisKKyAgICBGdWVyIHVuaXF1ZXMgZ2VsdGVuIGZvbGdlbmRlIFJpY2h0bGluaWVuOgorCisgICAgLSBEaWUgRXJyZWljaGJhcmtlaXQgZGVzL2RlciB1bmlxdWVzIGRhcmYgbmljaHQgdm9tIFJlYm9vdCBhYmhhZW5nZW4uCisgICAgICBEYXMgYmVkZXV0ZXQsIGVpbiBTcGllbGVyIG11c3Mgd2FlaHJlbmQgZGVyIGdlc2FtdGVuIFVwdGltZSBkaWUKKyAgICAgIHRoZW9yZXRpc2NoZSBNb2VnbGljaGtlaXQgaGFiZW4sIGVpbiBiZXN0aW1tdGVzIE9iamVrdCBkdXJjaCB3ZWxjaGVuCisgICAgICBBdWZ3YW5kIGF1Y2ggaW1tZXIgenUgZXJyZWljaGVuLgorCisgICAgLSBEYXMgT2JqZWt0IG11c3MgYXVjaCBnZWdlbiBkZW4gV2lsbGVuIGRlcyBiaXNoZXJpZ2VuIEJlc2l0emVycyB6dQorICAgICAgYmVrb21tZW4gc2Vpbi4KKworICAgIC0gU29sbHRlIGRhcyBPYmpla3QgaW4gVW1sYXVmIHNlaW4sIG11c3MgYW4gZGVyIEZ1bmRzdGVsbGUgZWluIEhpbndlaXMKKyAgICAgIGRhcmF1ZiBleGlzdGllcmVuLCBkYXNzIGRpZXNlcyBPYmpla3QgZG9ydCB6dSBiZWtvbW1lbiBpc3QuIEF1Y2ggd2VubgorICAgICAgZmFuYXRpc2NoZSBTcGllbGVyIGVpbiBVbmlxdWUgNSBTZWt1bmRlbiBuYWNoIFJlYm9vdCB3ZWdzY3JpcHRlbiwKKyAgICAgIHNvbGx0ZW4gbmFjaGZvbGdlbmRlIFNwaWVsZXIgd2VuaWdzdGVucyB3aXNzZW4sIHdvIGVzIG1hbCBnZXdlc2VuIGlzdC4KKworICAgIFVuaXF1ZXMsIGRpZSBhdWZncnVuZCBpaHJlciBXZXJ0ZSBuaWNodCBnZW5laG1pZ3VuZ3NwZmxpY2h0aWcgc2luZCwgc29sbHRlbgorICAgIHNpY2ggdHJvdHpkZW0gYW4gZGllc2UgUmljaHRsaW5pZSBoYWx0ZW4uIFVuaXF1ZXMgb2huZSBqZWdsaWNoZXMgS29uemVwdCwKKyAgICBkaWUgZGVyIEJhbGFuY2Ugdm9yZ2VsZWd0IHdlcmRlbiwgaGFiZW4gamVkb2NoIGthdW0gQ2hhbmNlIGF1ZiBHZW5laG1pZ3VuZy4KKyAgICAKKworIFNJRUhFIEFVQ0gKKworICAgICBiYWxhbmNlLCBydWVzdHVuZ2VuLCB3YWZmZW4sIGZlcm53YWZmZW4sIG5wY3MsIGdyZW56d2VydGUsCisgICAgIGF0dHJpYnV0c3ZlcmFlbmRlcnVuZ2VuLCByZXNpc3Rlbnplbiwga2FtcGZvYmpla3RlCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICBEb24sIDMxLjEwLjE5OTksIDIwOjAwOjAwIHZvbiBOYWNodHdpbmQKKyAgIApkaWZmIC0tZ2l0IGEvZG9jL3dpei92ZXJ0cmFnIGIvZG9jL3dpei92ZXJ0cmFnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYmM2OGEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd2l6L3ZlcnRyYWcKQEAgLTAsMCArMSwxMjggQEAKKworSGVyemxpY2ggd2lsbGtvbW1lbiBpbSBLcmVpcyBkZXIgTWFnaWVyIQorCitBYiBqZXR6dCBrYW5uc3QgRHUgaGludGVyIGRpZSBLdWxpc3NlIGRlcyBNb3JnZW5HcmF1ZW5zIHNjaGF1ZW4uCitEaWVzZSBGYWVoaWdrZWl0IGJpcmd0IFZlcmFudHdvcnR1bmcuCisKK0Rlc2hhbGIgZ2VsdGVuIGFiIGpldHp0IHp1c2FldHpsaWNoIHp1IGRlbiBiaXNoZXJpZ2VuIFJlZ2VsbiBmb2xnZW5kZQorTWFnaWVycmVnZWxuIGZ1ZXIgRGljaDoKKworTWFuIGRhcmYgU3BpZWxlcm4ga2VpbmUgSGlsZmVuIGdlYmVuLCBlcyBzZWkgZGVubiwgZXMgbGllZ3QgZWluCisqb2ZmZW5zaWNodGxpY2hlciogRmVobGVyIHZvci4gRGFiZWkgemFlaGx0IGF1Y2ggZWluIFp3ZWl0c3BpZWxlciwKK21pdCBkZW0gZWluIE1hZ2llciBzcGllbHQsIHp1IGRlbiBTcGllbGVybiEKK0hhZWx0IGRlciBTaGVyaWZmIGVpbmVuIEV4dHJhLUNoYXJha3RlciBlaW5lcyBNYWdpZXJzIG5pY2h0IGZ1ZXIgZWluZW4KK2VjaHRlbiBad2VpdGllLCBrYW5uIGVyIGlobiBqZWRlcnplaXQgenVtIFRlc3RzcGllbGVyIGVya2xhZXJlbi4gCisKK0JlaXNwaWVsZSBmdWVyIG5pY2h0IGVybGF1YnRlIEhpbGZlbjoKKy0gU3RhdHMgdm9uIE1vbnN0ZXJuIG1pdHRlaWxlbi4KKy0gT2JqZWt0ZSBjbG9uZW4sIHVuZCBTcGllbGVybiBnZWJlbi4KKy0gT2JqZWt0ZSBzY2hyZWliZW4sIGRpZSBkZW4gU3BpZWxlcm4genUgc2VociBoZWxmZW4sIG9kZXIgdW1nZWtlaHJ0CisgIGRpZSBTcGllbGVyIHNjaGFlZGlnZW4uCistIFNwaWVsZXIgdGVsZXBvcnRpZXJlbi4KKy0gRXhwbGl6aXRlIEtvbW1hbmRvcyBhbmdlYmVuLCBkaWUgZWluIFNwaWVsZXIgZWluZ2ViZW4gbXVzcy4KKy0gU2VsYmVyIChvZGVyIG1pdCBad2VpdGNoYXJha3RlcmVuKSBtaXRzcGllbGVuIG9kZXIgLWthZW1wZmVuLCBzb2JhbGQgCisgIEluc2lkZXJ3aXNzZW4gaW4gQW53ZW5kdW5nIGtvbW10LiBIaWVyIGlzdCBkZXIgZ2VzdW5kZSBNZW5zY2hlbnZlcnN0YW5kCisgIGJlaSBkZXIgRW50c2NoZWlkdW5nIGdlZnJhZ3QsIGFiIHdhbm4gZGllcyBkZXIgRmFsbCBpc3QuCistIFJhZXVtZSByZXNldHRlbiwgZGFtaXQgZGllIFNwaWVsZXIgT2JqZWt0ZSBiZWtvbW1lbi4KKyAgKEluc2Jlc29uZGVyZSBrYW5uIGRhcyBOZWJlbmVmZmVrdGUgaGFiZW4sIGRpZSBtYW4gYWxzIG5vcm1hbGVyCisgICBNYWdpZXIgbmljaHQgdWViZXJzY2hhdWVuIGthbm4sIGF1c3NlcmRlbSBrb2VubmVuIGRpZSBTcGllbGVyIGF1Y2ggbWFsCisgICB3YXJ0ZW4uKQorLSBXZWl0ZXJnYWJlIHZvbiBPYmpla3RpbmZvcm1hdGlvbmVuLCBkaWUgZGVyIFNwaWVsZXIgbmljaHQgZWluc2VoZW4ga2Fubi4KKworSW4gZGVuIGZvbGdlbmRlbiBGYWVsbGVuIGRhcmYgbmF0dWVybGljaCBnZWhvbGZlbiB3ZXJkZW46CistIFNwaWVsZXJuIGF1cyBmZWhsZXJoYWZ0ZW4gUmFldW1lbiBvZGVyIGRlciAndm9pZCcgaGVyYXVzaGVsZmVuLgorLSBNYW4gc2llaHQsIGRhc3MgZGVyIFNwaWVsZXIgd2Vpc3MsIHdhcyBlciB6dSB0dW4gaGF0LCBhYmVyIGlobSBkaWUKKyAgYWJ3ZWdpZ2UoISkgRm9ybXVsaWVydW5nIG5pY2h0IGVpbmZhZWxsdC4gKEhpZXIgc29sbHRlIG1hbiBhYmVyCisgIHp1c2FldHpsaWNoIGRlbSBNYWdpZXIsIGRlciBkYXMgZW50c3ByZWNoZW5kZSBPYmpla3QgJ3ZlcmJyb2NoZW4nCisgIGhhdCwgZWluZSBNaXR0ZWlsdW5nIGdlYmVuLCBhdWYgZGFzcyBlciBlcyB2ZXJiZXNzZXJ0LikKKworU2VsYmVyIHNwaWVsZW4gc29sbCBtYW4gbnVyIGRhbm4sIHdlbm4gbWFuIGRlbiBTcGllbGVybiBkYWJlaSBuaWNodAoraGlsZnQgb2RlciBpaG5lbiBlaW4gQWJlbnRldWVyIHZvciBkZXIgTmFzZSB3ZWdsb2VzdC4KKworCitHZW5lcmVsbCBtdXNzIGRpZSBQcml2YXRzcGhhZXJlIHZvbiBTcGllbGVybiBnZWFjaHRldCB3ZXJkZW4uIAorCitTbm9vcGVuIHZvbiBTcGllbGVybiBpc3QgbnVyIGRhbm4gZXJsYXVidCwgd2VubiBlcyBkYXJ1bSBnZWh0LCBGZWhsZXIKK2ltIE11ZCB6dSBmaW5kZW4gb2RlciBJZGVlbiB6dSBzYW1tZWxuLCB1bSBzZWluZW4gX2VpZ2VuZW5fIEdlYmlldGUsCitiencuIFJlZ2lvbmVuIGZ1ZXIgZGllIG1hbiB2ZXJhbnR3b3J0bGljaCBpc3QsIHp1IHZlcmJlc3Nlcm4gdW5kIAorYW56dXBhc3Nlbi4gRXMgZGFyZiBhdWYga2VpbmVuIEZhbGwgZGFmdWVyIGJlbnV0enQgd2VyZGVuLCBTcGllbGVyCitvaG5lIGJlc29uZGVyZW4gR3J1bmQgenUgYmVvYmFjaHRlbiwgc2ljaCB1ZWJlciBzaWUgbHVzdGlnIHp1IG1hY2hlbiwgCitvZGVyIHNpZSBhdXN6dXNwaW9uaWVyZW4uIFdlbm4gU3BpZWxlciBQb3N0IHNjaHJlaWJlbiBvZGVyIGxlc2VuIGlzdCAKK3Nub29wZW4gc3RyZW5nc3RlbnMgdW50ZXJzYWd0IChCcmllZmdlaGVpbW5pcykuCitHZW5lcmVsbCBpc3QgZXMgYW5nZWJyYWNodCBTcGllbGVyIGRhcmF1ZiBoaW56dXdlaXNlbiwgZGFzcyBzaWUgCitnZXNub29wdCB3ZXJkZW4uCisKK0VzIGlzdCBlYmVuc28gdW56dWxhZXNzaWcsIGFuZGVyZSBNb2VnbGljaGtlaXRlbiBhdXN6dW51dHplbiwgZGllIAorZGF6dSBkaWVuZW4gU3BpZWxlciB6dSBiZW9iYWNodGVuLCBiencuIGF1c3p1c3Bpb25pZXJlbiAoekIgdmVyZm9sZ2VuKS4KKworSW5zYmVzb25kZXJlIGlzdCBlcyBTVFJJS1QgdW50ZXJzYWd0LCBPYmpla3RlIHp1IHNjaHJlaWJlbiwgZGllIGluCitpcmdlbmRlaW5lciBXZWlzZSAoekIgYWRkX2FjdGlvbiguLi4sIiIsMSkpICd0ZWlsZSBtaXQnLCAnZmx1ZXN0ZXInCit1bmQgYWVobmxpY2hlIEtvbW11bmlrYXRpb25zYmVmZWhsZSBhYmZhbmdlbiwgdW0gR2VzcHJhZWNoZSB2b24gYW5kZXJlbgorYWJ6dWhvZXJlbi4gRGllcyBzdGVsbHQgZWluZW4gc2Nod2VyZW4gRWluZ3JpZmYgaW4gZGllIEludGltc3BoYWVyZSBkZXIKK2FuZGVyZW4gVGVpbG5laG1lciBkYXIgdW5kIHdpcmQgZGVtZW50c3ByZWNoZW5kIGdlYWhuZGV0IQorCitKZWdsaWNoZSBBcnQgdm9uIEJlbGFlc3RpZ3VuZyB2b24gU3BpZWxlcm4gaXN0IHVudGVyc2FndC4gCitEYXp1IGdlaG9lcnQgZGFzIFZlcmZsdWNoZW4sIE1vbnN0ZXIgYXVmIHNpZSBoZXR6ZW4sIG9kZXIgaWhuZW4gYXVmCitpcmdlbmRlaW5lIEFydCBib2Vzd2lsbGlnIFNjaGFkZW4genV6dWZ1ZWdlbi4KKworCitadSBkZW0sIHdhcyBEdSBoaWVyIHNvIHByb2dyYW1taWVyc3Q6CitBbGxlcyB3YXMgRHUgaGllciBhbiBEYXRlbiBhYmxlZ3N0IGlzdCBuYXR1ZXJsaWNoIERlaW4gZWlnZW5lcywgCitnZWlzdGlnZXMgRWlnZW50dW0uIFRyb3R6ZGVtIGdlaGVuIHdpciBkYXZvbiBhdXMsIGRhcyBhbGxlcywgd2FzIGhpZXIKK2ltIE11ZHZlcnplaWNobmlzIGxhbmRldCwgYXVjaCBmdWVyIGRhcyBNb3JnZW5HcmF1ZW4gZW50d2lja2VsdCB3b3JkZW4KK2lzdCwgYWxzbyBhbGxlcyB3YXMgRHUgc2NocmVpYnN0LCBhdWNoIHZvbSBNdWQgZ2VudXR6dCB3ZXJkZW4gZGFyZi4KK0RpZXMgZnVlaHJ0IHp1IGZvbGdlbmRlciBSZWdlbHVuZzoKKyAKK0Z1ZXIgZGFzIE1vcmdlbkdyYXVlbiBnaWx0IHVuZWluZ2VzY2hyYWVua3RlcyBOdXR6dW5nc3JlY2h0IGZ1ZXIgYWxsZSAKK01vbnN0ZXIsIE9iamVrdGUgb2RlciBSYWV1bWUgZGllIER1IGhpZXIgcHJvZ3JhbW1pZXJzdC4gRGllcyBnaWx0IAoraW5zYmVzb25kZXJlIGZ1ZXIgYWxsZSBTYWNoZW4sIGRpZSBiZXJlaXRzIGFuIGRpZSBSZWdpb25lbiBkZXMgTUdzCithbmdlc2NobG9zc2VuIHNpbmQuCitEYXMgYmVkZXV0ZXQgZnVlciBEaWNoLCBkYXNzIHVudGVyIFVtc3RhZW5kZW4gdm9uIERpciBnZXNjaHJpZWJlbmUgCitPYmpla3RlIGF1Y2ggZ2VnZW4gRGVpbmVuIFdpbGxlbiBhbmdlc2NobG9zc2VuIGJsZWliZW4sIHVuZCB2aWVsbGVpY2h0Citzb2dhciBnZ2YuIGF1cyBlaW5lbSBCYWNrdXAgd2llZGVyIGVpbmdlc3BpZWx0IHdlcmRlbi4KK01pdCBkaWVzZXIgUmVnZWwgc29sbCB2ZXJoaW5kZXJ0IHdlcmRlbiwgZGFzIHVuZ2x1ZWNrc2VsaWdlIE1hZ2llciBhdXMtCitzdGVpZ2VuIHVuZCBiZWltIFZlcmxhc3NlbiBkZXMgTUcgcmllc2lnZSBMb2VjaGVyIGluIGRlciBMYW5kc2NoYWZ0IAordW5kIGltIGFsbGdlbWVpbmVuIEdsZWljaGdld2ljaHQgaGludGVybGFzc2VuLgorCisKK1NvbGx0ZSBEZWluZSBNYWdpZXJ6ZWl0IGJlZW5kZXQgc2VpbiwgdmVycGZsaWNodGVzdCBEdSBEaWNoLCB1ZWJlcgorZXR3YWlnZSB3YWVocmVuZCBEZWluZXIgTWFnaWVyemVpdCBnZXdvbm5lIG5pY2h0LW9lZmZlbnRsaWNoZSBJbnRlcm5hCistIGluc2IuIG5pY2h0LW9lZmZlbnRsaWNoZW4gQ29kZSAtIGF1Y2ggd2VpdGVyaGluIFN0aWxsc2Nod2VpZ2VuIHp1IAorYmV3YWhyZW4uIERpZXMgZ2lsdCB1bmFiaGFlbmdpZyB2b24gZGVtIEdydW5kIG9kZXIgZGVyIEFydCB1bmQgV2Vpc2UsCitEZWluZSBNYWdpZXJ6ZWl0IHp1IGJlZW5kZW4gKHouQi4gTG9lc2NodW5nKS4KKworCitXZW5uIER1IGRpZXNlbiBWZXJ0cmFnIHVudGVyc2NocmVpYnN0LCBlcmtlbm5zdCBEdSBkaWUgUmVnZWxuIGFuLgorRGllIFJlZ2VsbiBpbiAvZXRjL1dJWlJVTEVTIHNpbmQgaW1tZXIgdmVyYmluZGxpY2gsIHVuYWJoYWVuZ2lnIGRhdm9uLAord2llIHNpZSB6dW0gWmVpdHB1bmt0IGRlaW5lcyBNYWdpZXJ3ZXJkZW5zIGF1c3NhaGVuLgorCisKK051biBnZW51ZyBkZXIgc3RyZW5nZW4gUmVnZWxuIDspLgorTnVuIHp1IGRlbSwgd2FzIER1IGplZGVuIE1vbWVudCB3aXJzdDsgdW5kIHp1IGRlbSwgd2FzIGRhbmFjaCBrb21tdDoKKworMS4pIFdlbm4gRHUgZGllc2VuIFZlcnRyYWcgdW50ZXJzY2hyaWViZW4gaGFzdCwgdW5kIERlaW4gU3BvbnNvciAoZGFzIGlzdAorICAgIGRlciwgZGVyIERpciBkZW4gVmVydHJhZyBnZWdlYmVuIGhhdCkgTWVybGluIGdlYmV0ZW4gaGF0LCBEaWNoIHp1bQorICAgIE1hZ2llciB6dSBtYWNoZW4sIGJla29tbXN0IER1IGRpZSBtYWdpc2NoZW4gRmFlaGlna2VpdGVuIGRlciBNYWdpZXIuCisgICAgRHUgd2lyc3QgRGljaCB1bnNpY2h0YmFyIG1hY2hlbiBrb2VubmVuLCBhbmRlcmUgV2VzZW4gdGVsZXBvcnRpZXJlbgorICAgIGtvZW5uZW4gKHNpZWhlIGplZG9jaCBSZWdlbG4pLCBPYmpla3RlIGNsb25lbiB1bmQgc28gd2VpdGVyIHVuZCBzbworICAgIHdlaXRlci4gRGVpbiBTcG9uc29yIGhhdCBkaWUgQXVmZ2FiZSwgRGlyIGRlbiBVbWdhbmcgbWl0IGRlbiBuZXVlbgorICAgIEZhZWhpZ2tlaXRlbiBiZWl6dWJyaW5nZW4gKER1IGRhcmZzdCBpaG4gZGFyYXVmIGZlc3RuYWdlbG4gOy0pKS4KKworMi4pIER1IGthbm5zdCBqZWRvY2ggc2VsYnN0IG5vY2gga2VpbmVybGVpIFByb2dyYW1tZSBzY2hyZWliZW4uIFdlbm4gRHUKKyAgICBhdWNoIHNlbGJlciBwcm9ncmFtbWllcmVuIHdpbGxzdCwgbXVzc3QgRHUgenVlcnN0IGVpbiBHZXNlbGxlbnN0dWVjaworICAgIGFibGllZmVybi4gV2llIGRhcyBnZWh0LCBmaW5kZXN0IGR1IGJlaSBkZXIgSGlsZmUgenVtIEdlc2VsbGVuc3R1ZWNrCisgICAgYmVzY2hyaWViZW4oImhpbGZlIGdlc2VsbGVuc3R1ZWNrIikuCisKKworU28gdW5kIG51biB6dSBkZW4gRGluZ2VuLCBkaWUgZnVlciBEaWNoIGRhIHNpbmQ6CisKKyAgICBNaXQgZGVtIEJlZmVobCAibWhpbGZlIiBrYW5uc3QgRHUgZWluZSBVZWJlcnNpY2h0IHVlYmVyIGRpZSBCZWZlaGxlCisgICAgYmVrb21tZW4sIGRpZSBlaW4gTWFnaWVyIHp1c2FldHpsaWNoIHp1IGRlbmVuIGRlciBTcGllbGVyIGhhdC4gSW4KKyAgICBkZW0gVmVyemVpY2huaXNzIC9kb2MgZmluZGVzdCBEdSB2ZXJzY2hpZWRlbmUgRmlsZXMsIGRpZSBEaXIgZGFzCisgICAgVmVyc3RhZW5kbmlzIGVybGVpY2h0ZXJuIHNvbGxlbi4gRWluZSBVZWJlcnNpY2h0IGthbm5zdCBEdSBtaXQgZGVtCisgICAgQmVmZWhsLiAibW9yZSAvZG9jL1JFQURNRSIgYmVrb21tZW4uCisJCisgICAgRGVyIGd1dGUgYWx0ZSBNZXJsaW4gaXN0IG5pY2h0IG51ciBkZXIgVXJ2YXRlciBhbGxlciBNYWdpZXIsIHNvbmRlcm4KKyAgICBiZWhlcmJlcmd0IGRhcnVlYmVyIGhpbmF1cyBhdWNoIGVpbmVuIChhYiB1bmQgenUpIGd1dCBiZXN1Y2h0ZW4gV2l6Q2x1Yi4KKyAgICBXZXIgc2ljaCBtaXQgImdvdG8iIG5vY2ggbmljaHQgc28gZ3V0IGF1c2tlbm50LCBrYW5uIGlobiBpbiBkZXIgCisgICAgQWJlbnRldXJlcmdpbGRlIG1pdCBkZW0gS29tbWFuZG8gInRyZWZmIiBiZXRyZXRlbi4KZGlmZiAtLWdpdCBhL2RvYy93aXovd2FmZmVuIGIvZG9jL3dpei93YWZmZW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThjNGMwNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93aXovd2FmZmVuCkBAIC0wLDAgKzEsMjAyIEBACisgV0FGRkVOOgorCisgICAgYS4gQWxsZ2VtZWluZXMKKworICAgIEFsbGUgKHp1bWluZGVzdCBuZXVlbiEpIFdhZmZlbiBzb2xsdGVuIHVlYmVyIGVpbmUgdmVybnVlbmZ0aWdlCisgICAgQmVzY2hyZWlidW5nIHVuZCBhdWNoIERldGFpbHMgdmVyZnVlZ2VuLiBFaW5mYWNoICJFaW4gU2Nod2VydCIgaXN0CisgICAgZWluIGJpc3NlbCBhcmcgZHVlcmZ0aWcgdW5kIHJlY2h0ZmVydGlndCBhdWYga2VpbmVuIEZhbGwKKyAgICBpcmdlbmR3ZWxjaGUgaG9oZW4gV0NzIG9kZXIgZ2FyIEhpdEZ1bmNzISBEYXJhdWYgc29sbHRlbiBzY2hvbiBkaWUKKyAgICBSTXMgYWNodGVuLi4uCisKKyAgICBOYWNoIE1vZWdsaWNoa2VpdCBhdWNoIFBfSU5GTyBzZXR6ZW4sIGRhcyBpc3QgZnVlciBTcGllbGVyIG5pY2h0IHNvCisgICAgZnJ1c3RyaWVyZW5kIHVuZCBrYW5uIGphIGF1Y2ggZWluZW4gbmV0dGVuIFNwcnVjaCBlbnRoYWx0ZW4uIFBfSU5GTworICAgIGlzdCAqendpbmdlbmQqIGJlaSBXYWZmZW4gbWl0IEhpdEZ1bmNzISBNdXNzIGphIG5pY2h0IGFic29sdXQgZWluLQorICAgIGRldXRpZyBzZWluLCBhYmVyIGV0d2FzIExpZWJlIHp1bSBEZXRhaWwgc29sbHRlIGJlaSBTb25kZXJ3YWZmZW4gYXVmCisgICAgamVkZW4gRmFsbCBnZWx0ZW4uCisKKyAgICBXYWZmZW4gdm9tIFR5cCBXVF9NSVNDIGR1ZXJmZW4gd2VkZXIgdWViZXIgZWluZSBEZWZlbmQtIG5vY2ggZWluZQorICAgIEhpdEZ1bmMgdmVyZnVlZ2VuLiBEaWUgQUMgc29sY2hlciBXYWZmZW4gaXN0IGltbWVyIDAuIFdlaXRlciBkdWVyZmVuCisgICAgc29sY2hlIFdhZmZlbiBrZWluZXJsZWkgYW5kZXJlIGthbXBmcmVsZXZhbnRlIEJlZGV1dHVuZyBiZXNpdHplbgorICAgIG9kZXIgTWFuaXB1bGF0aW9uZW4gYW0vaW0gU3BpZWxlci9HZWduZXIgdmVydXJzYWNoZW4uCisKKworICAgIGIuIEJlbWVya3VuZ2VuIHp1IGVpbmlnZW4gUHJvcGVydGllczoKKworICAgICBQX1dDCisgICAgICAgIERpZSBXQyBzb2xsdGUgZWluaWdlcm1hc3NlbiAicmVhbGlzdGlzY2giIGdld2FlaGx0IHdlcmRlbi4gRGllCisgICAgICAgIFZlcmFudHdvcnR1bmcgaGllcmZ1ZXIgb2JsaWVndCBkZW4gamV3ZWlsaWdlbiBSTXMuIFNpZSBzb2xsdGUKKyAgICAgICAgendpc2NoZW4gY2EuIDM1IHVuZCAyMDAgbGllZ2VuLiBBdWYgamVkZW4gRmFsbCBzaW5kIGRpZSBha3R1ZWxsZW4KKyAgICAgICAgR2VuZWhtaWd1bmdzZ3JlbnplbiB6dSBiZWFjaHRlbi4gU29sbHRlIGRpZSBXQyBkaWVzZSBHcmVuemVuCisgICAgICAgIHVlYmVyc2NocmVpdGVuLCB1bnRlcmxpZWd0IGRpZSBXYWZmZSBhdXNzZXIgZGVyIEdlbmVobWlndW5nIGR1cmNoCisgICAgICAgIGRlbiBSTSBkZXIgQmV1cnRlaWx1bmcgZHVyY2ggZGFzIFdhZmZlbmdyZW1pdW0uCisKKyAgICAgUF9OUl9IQU5EUworICAgICAgICBXYWZmZW4gdWViZXIgZWluZXIgZWZmZWt0aXZlbiBXQyB2b24gMTUwIG11ZXNzZW4gendlaWhhZW5kaWcgc2Vpbi4KKyAgICAgICAgQXVzbmFobWVuIGtvZW5uZW4gdW50ZXIgVW1zdGFlbmRlbiBnZW5laG1pZ3Qgd2VyZGVuLCB6dW0gQmVpc3BpZWwKKyAgICAgICAgd2VubiBkaWUgV2FmZmUgc2Nod2VyIGVycmVpY2hiYXIgb2RlciB6YWhsZW5tYWVzc2lnIGJlZ3Jlbnp0LCBlaW5lCisgICAgICAgIFF1ZXN0YmVsb2hudW5nIGV0Yy4gaXN0LiBBbGxlIGVpbmhhZW5kaWdlbiBXYWZmZW4gdWViZXIgV0MgMTQwIHNpbmQKKyAgICAgICAgaW4gamVkZW0gRmFsbCBnZW5laG1pZ2VuIHp1IGxhc3Nlbi4KKworICAgICAgICBNZXNzZXIgbXVlc3NlbiBnZW5lcmVsbCBlaW5oYWVuZGlnIHNlaW4hCisKKyAgICAgUF9XRUlHSFQKKyAgICAgICAgQml0dGUgcmVhbGlzdGlzY2ggaGFsdGVuLiBEYW1pdCBpc3QgKm5pY2h0KiBkYXMgUkwtR2V3aWNodAorICAgICAgICBnZW1laW50LCBzb25kZXJuIG1hbiBzb2xsdGUgYW0gYmVzdGVuIHZlcmdsZWljaGJhcmUgV2FmZmVuIGRlcworICAgICAgICBNRyBhbHMgTWFzc3N0YWIgbnV0emVuLiBEYSBoaWVyIHouVC4gZ3JhdmllcmVuZGUgRGlza3JlcGFuemVuCisgICAgICAgIGJlc3RlaGVuLCBldnRsLiBtYWwgbWVocmVyZSB2ZXJnbGVpY2hlbi4gRGllIFZlcmFudHdvcnR1bmcKKyAgICAgICAgaGllcmZ1ZXIgb2JsaWVndCBkZW4gUk1zLgorCisgICAgICAgIFdhZmZlbiBtaXQgZWluZW0gR2V3aWNodCB2b24gdWViZXIgNDAwMCBHcmFtbSBzb2xsdGVuIG5vcm1hbGVyd2Vpc2UKKyAgICAgICAgYXVjaCB6d2VpaGFlbmRpZyBzZWluIG9kZXIgbXVlc3NlbiBkZXIgQmFsYW5jZSB2b3JnZWxlZ3Qgd2VyZGVuLgorCisgICAgICoqIEJlc29uZGVyZSBMZWljaHRnZXdpY2h0ZSBiaXR0ZSBnZW5laG1pZ2VuIGxhc3NlbiwgdW0gc3BhZXRlcmVtICAgICAqKgorICAgICAqKiBBZXJnZXIgdm9yenViZXVnZW4uIEdyYWRlIGZ1ZXIgS2FlbXBmZXIgaXN0IGRhcyBHZXdpY2h0IHZvbiBXYWZmZW4gKioKKyAgICAgKiogc2VociB3aWNodGlnISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqCisKKyAgICBadXIgRXJpbm5lcnVuZzogU3BpZWxlciBtaXQgS3JhZnQgMjAga29lbm5lbiBudXIgMjUwMDAgR2V3aWNodHMtCisgICAgZWluaGVpdGVuICgiR3JhbW0iKSB0cmFnZW4uCisKKyAgICAgUF9TSVpFCisgICAgICAgIERpZSBMYWVuZ2UgZGVyIFdhZmZlIGluIGNtLiBTZXR6dCBtYW4gc2llIG5pY2h0LCBzbyBnaWx0IGRlcgorICAgICAgICBEZWZhdWx0LSB3ZXJ0IGZ1ZXIgZGVuIGpld2VpbGlnZW4gV2FmZmVudHlwLCB3ZWxjaGVyIGluIGRlciBNYW5wYWdlCisgICAgICAgIHp1IFBfU0laRSBub3RpZXJ0IGlzdC4KKworICAgICBQX1ZBTFVFCisgICAgICAgIFdpZSBiZWkgUF9XRUlHSFQgc2luZCBkaWUgUk1zIGdlZnJhZ3Q6IEF1Z2VubWFzcyB6YWVobHQuIFdlcnRlIHVlYmVyCisgICAgICAgIDEwMDAwIG9kZXIgc28gc2luZCB6d2FyIG5ldHQsIGFiZXIgc2lubmxvcyB1bmQgdW5yZWFsaXN0aXNjaC4KKworICAgICBQX0RBTV9UWVBFCisgICAgICAgIEplZGUgV2FmZmUsIGRpZSBhdXMgcGh5c2lrYWxpc2NoZW0gTWF0ZXJpYWwgYmVzdGVodCAoYWxzbyBmYWt0aXNjaAorICAgICAgICBhbGxlcyBtaXQgSGFyZHdhcmUpICptdXNzKiBlaW5lbiBwaHlzaWthbGlzY2hlbiBTY2hhZGVuc3R5cCBoYWJlbi4KKworICAgICAqKiBXYWZmZW4gbWl0IG1laHIgYWxzIGVpbmVtIG5pY2h0cGh5c2lrYWxpc2NoZW4gU2NoYWRlbnN0eXAgb2RlciAgICoqCisgICAgICoqIG1laHIgYWxzIDUwJSBuaWNodHBoeXNpa2FsaXNjaGVuIEFudGVpbGVuIHNpbmQgZ2VuZXJlbGwgenVyICAgICAgKioKKyAgICAgKiogR2VuZWhtaWd1bmcgdm9yenVsZWdlbiB1bmQgYWxzIEJlc29uZGVyaGVpdCB6dSBoYW5kaGFiZW4uIE5pY2h0ICAqKgorICAgICAqKiBnZW5laG1pZ3QgdW5kIG51ciBpbSBSYWhtZW4gZGVyIEdpbGRlbmJhbGFuY2UgZXJtb2VnbGljaHQgd2VyZGVuICoqCisgICAgICoqIGEpIFdhZmZlbiBtaXQgbWVociBhbHMgNjYlIG5pY2h0cGh5c2lrYWxpc2NoZW0gU2NoYWRlbiBpbSBBcnJheSwgKioKKyAgICAgKiogYikgV2FmZmVuIG1pdCBlaW5lbSBuaWNodHBoeXNpa2FsaXNjaGVuIFNjaGFkZW5zdHlwIHVlYmVyIDUwJSAgICAqKgorCisgICAgV2VpdGVyaGluIGdlbmVobWlndW5nc3BmbGljaHRpZyBzaW5kIGRpZSBTY2hhZGVuc3R5cGVuOgorCisgICAgRFRfVEVSUk9SLCBEVF9TT1VORCwgRFRfU1FVRUVaRQorCisgICAgRGllc2UgU2NoYWRlbnN0eXBlbiB3ZXJkZW4gaW4gV2FmZmVuIG51ciBnZW5laG1pZ3QsIHdlbm4gc2llIGd1dAorICAgIGJlZ3J1ZW5kZXQgc2luZC4KKworICAgIERlciBTY2hhZGVuc3R5cCBEVF9FWFBMT1NJT04gd2lyZCBpbiBXYWZmZW4gZ2VuZXJlbGwgbmljaHQgbWVocgorICAgIGdlbmVobWlndC4KKworICAgICBQX1dFQVBPTl9UWVBFCisgICAgICAgIE51ciB6dXIgRXJpbm5lcnVuZzogZXMgZ2lidCBpbSBNRyB6dSB2aWVsZSBTY2h3ZXJ0ZXIgdW5kIFNwZWVyZS4KKyAgICAgICAgTnV0enQgYXVjaCBkaWUgYW5kZXJlbiBXYWZmZW50eXBlbiEgKE1lc3NlciB1bmQgUGVpdHNjaGVuIHNpbmQgc2VocgorICAgICAgICByYXIuIEJpdHRlIGFuZ2VwYXNzdGUgV0NzISkKKworICAgICBQX0VGRkVDVElWRV9XQworICAgICAgICBIaWVyIGthbm4gZGllIGV2dGwgZHVyY2ggZWluZSBIaXRGdW5jIHZlcmFlbmRlcnRlIFdDIGFuZ2VnZWJlbgorICAgICAgICB3ZXJkZW4uIERlciBEdXJjaHNjaG5pdHRzd2VydCBzb2xsIGRhIHN0ZWhlbi4gRGllIEthZW1wZmVyZ2lsZGUga2FubgorICAgICAgICBkYXMgaW4gZ2V3aXNzZW4gR3JlbnplbiBhYnNjaGFldHplbi4KKworICAgICBQX0VGRkVDVElWRV9BQworICAgICAgICBGdWVyIFBhcmFkZXdhZmZlbiBzZXR6ZW4uIFdlcnRlIHVuYmVkaW5ndCBtaXQgQm9pbmcgYWJzcHJlY2hlbiEKKworICAgICBQX05PQlVZCisgICAgICAgIFdhZmZlbiBhYiBXQyAxNTAgd2VyZGVuIGJlaW0gVmVya2F1ZiBpbSBMYWRlbiB6dXJ1ZWNrYmVoYWx0ZW4uIEVzCisgICAgICAgIHNvbGx0ZSBhYmVyIGF1Y2ggZnVlciBXYWZmZW4sIGRpZSBIaXRGdW5jcyBlbnRoYWx0ZW4sIFBfTk9CVVkKKyAgICAgICAgZ2VzZXR6dCB3ZXJkZW4uCisKKworICAgIGMuIFNwZXppYWx3YWZmZW4vV2FmZmVuIG1pdCBTb25kZXJmdW5rdGlvbgorCisgICAgICoqIEFMTEUgV2FmZmVuIG1pdCBIaXRGdW5jIG9kZXIgZW50c3ByZWNoZW5kZXIgRmt0LiBtdWVzc2VuICAgKioKKyAgICAgKiogZ2VuZWhtaWd0IHdlcmRlbiEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKgorCisgICAgU29sY2hlIFdhZmZlbiBtdWVzc2VuIHVlYmVyIGVpbiBQX0lORk8gdmVyZnVlZ2VuIHVuZCBpcmdlbmR3byBpbgorICAgIGlocmVyIEJlc2NocmVpYnVuZyBvZGVyIGltIFBfSU5GTyBtaW5kZXN0ZW5zIGVpbmUgQW5kZXV0dW5nIHVlYmVyCisgICAgZGllIEhlcmt1bmZ0IG9kZXIgZGVuIEdydW5kIGlocmVyIGJlc29uZGVyZW4gRmFlaGlna2VpdCBoYWJlbi4KKworICAgIEF1Y2ggU3BlemlhbHdhZmZlbiBzb2xsdGVuIG5hY2ggTW9lZ2xpY2hrZWl0IG5pY2h0IHVlYmVyIGVpbmUKKyAgICBFRkZFQ1RJVkVfV0Mgdm9uIDIwMCBoaW5hdXNnZWhlbi4gRGVyIFJldHVybi1XZXJ0IGRlciBIaXRGdW5jLAorICAgIHNvZmVybiBlciB2b24gMCBhYndlaWNodCwgTVVTUyBwZXIgcmFuZG9tKCkgenVydWVja2dlZ2ViZW4gd2VyZGVuLAorICAgIGRhIGVyIG9obmUgd2VpdGVyZXMgcmFuZG9tKCkgYXVmIGRpZSBXQyBhdWZhZGRpZXJ0IHdpcmQuCisKKyAgICBadSBiZWFjaHRlbiBpc3QsIGRhc3MgbWFuIGJlaSBXYWZmZW4sIGRpZSBudXIgZnVlciBOUENzIG1laHIgU2NoYWRlbgorICAgIG1hY2hlbiBzb2xsZW4sIG5pY2h0IChudXIpIHVlYmVyIFBfUkFDRSBwcnVlZnQsIG9iIGRlciBCZW51dHplciBlaW4KKyAgICBzb2xjaGVyIGlzdC4gRXMgaXN0IGRlbmtiYXIsIGRhc3MgU3BpZWxlciBpaHJlIFJhc3NlIHRlbXBvcmFlciB2ZXItCisgICAgYWVuZGVybiBrb2VubmVuLiBXYWZmZW4gZGllIG51ciBiZWkKKyAgICAhaW50ZXJhY3RpdmUoUXVlcnlQcm9wKFBfV0lFTERFRCkpIGJlc3NlciB6dXNjaGxhZ2VuLCBicmF1Y2hlbgorICAgIG5hdHVlcmxpY2ggbmljaHQgZ2VuZWhtaWd0IHp1IHdlcmRlbi4KKworICAgIERpZSBEaWNodGUgc29sY2hlciBXYWZmZW4gaW4gZWluZW0gR2ViaWV0IHNvbGx0ZSBlaW4gdmVybnVlbmZ0aWdlcworICAgIE1hc3MgbmljaHQgdWViZXJzY2hyZWl0ZW4uIEZ1ZXIgZWluZSBTb25kZXJ3YWZmZSBzb2xsdGVuIGF1Y2gKKyAgICBldGxpY2hlIG5pY2h0LW1hZ2lzY2hlIFdhZmZlbiBpbiBkZXIgVW1nZWJ1bmcgc2Vpbi4gWnVtaW5kZXN0IGRpZQorICAgIHN0YXJrZW4gV2FmZmVuIChhbHNvIG5pY2h0IGRpZSwgZGllIG51ciBlaW5lbiBHYWcgb2RlciBzbworICAgIGJlaW5oYWx0ZW4sIHNvbmRlcm4gd2lya2xpY2ggaW4gZGVuIEthbXBmIGVpbmdyZWlmZW4pIHNvbGx0ZW4gbmljaHQKKyAgICB6dSBsZWljaHQgenUgYmVrb21tZW4gc2Vpbi4gSGllcmF1ZiBzb2xsZW4gZGllIFJNcyBhY2h0ZW4uIFNvbGNoZQorICAgIFNhY2hlbiBnZWhvZXJlbiB6dSBNb25zdGVybiwgZGllIGVpbiB3ZW5pZyBzY2hsZWNodGVyIGVycmVpY2hiYXIKKyAgICBzaW5kIG9kZXIgZGllIGJlc29uZGVycyBzdGFyayBvZGVyIHNvbnN0d2llIHVuYW5nZW5laG0gc2luZC4gQWxzbworICAgIG5peCB2ZXJzY2hlbmtlbi4KKworICAgIFdhZmZlbiwgZGllIE1vbnN0ZXIgdmVyZ2lmdGVuIChhbHNvIG5pY2h0IG51ciBQX0RBTV9UWVBFIERUX1BPSVNPTgorICAgIGhhYmVuKSBzaW5kIHp3YXIgbmljaHQgZ3J1bmRzYWV0emxpY2ggdmVyYm90ZW4sIGFiZXIgZG9jaAorICAgIHVuZXJ3dWVuc2NodC4gU2llIHNpbmQgYXVmIGplZGVuIEZhbGwgZ2VuZWhtaWd1bmdzcGZsaWNodGlnLgorICAgIEF1c3NlcmRlbSBzb2xsdGUgZGllIFdhaHJzY2hlaW5saWNoa2VpdCBlaW5lciBWZXJnaWZ0dW5nIHBybworICAgIEthbXBmcnVuZGUgbWF4LiBiZWkgMSUgbGllZ2VuLgorCisgICAgRGVzIHdlaXRlcmVuIG11ZXNzZW4gV2FmZmVuLCBkaWUgZnVlciBiZXN0aW1tdGUgR2lsZGVuIGJlc3RpbW10ZQorICAgIFZvcnRlaWxlIGJyaW5nZW4gKHNpY2ggYmVpbSBLYW1pIGRlciBUYW5qaWFuIG5pY2h0IGFibnV0emVuIHp1bQorICAgIEJlaXNwaWVsKSBlYmVuZmFsbHMgdm9uIGRlciBCYWxhbmNlIGdlbmVobWlndCB3ZXJkZW4uCisKKworICAgIGQuIEdlbmVobWlndW5nc2dyZW56ZW4KKworICAgIEVpbmhhZW5kaWdlIFdhZmZlbiAgOiAgICBhYiBQX1dDID49IDE0MAorICAgIFp3ZWloYWVuZGlnZSBXYWZmZW4gOiAgICBhYiBQX1dDID49IDE3NQorCisgICAgRnVlciBXYWZmZW4gZGllIGVpbmVuIG5pY2h0cGh5c2lrYWxpc2NoZW4gU2NoYWRlbnN0eXAgZW50aGFsdGVuOgorCisgICAgRWluaGFlbmRpZ2UgV2FmZmVuICA6ICAgIGFiIFBfV0MgPj0gMTIwCisgICAgWndlaWhhZW5kaWdlIFdhZmZlbiA6ICAgIGFiIFBfV0MgPj0gMTUwCisKKworICAgIGUuIFNwZXppZWxsZSBQcm9wZXJ0aWVzIGZ1ZXIgZGllIEthZW1wZmVyZ2lsZGUKKworICAgIERpZXNlIFByb3BlcnRpZXMgc2luZCBkZWZpbmllcnQgaW4gJy9wL2thZW1wZmVyL2thZW1wZmVyLmgnLiBNaXQgaWhuZW4KKyAgICBrYW5uIG1hbiBCb25pIGZ1ZXIgYmVzdGltbXRlIEF0dGFja2VuIGRlciBLYWVtcGZlciB2ZXJnZWJlbiAoei5CLgorICAgIEJvbnVzIGF1ZiBXYWZmZW5zY2hsYWcgb2RlciBUb2Rlc3N0b3NzKS4KKworICAgIEdlbmF1ZXJlIEhpbndlaXNlIHp1IGRpZXNlbiBQcm9wZXJ0aWVzIHVuZCBkZW4genUgc2V0emVuZGVuIFdlcnRlbgorICAgIGZpbmRldCBtYW4gaW4gJ21hbiBrYWVtcGZlcmJvbmknLgorCisgICAgUHJpbnppcGllbGwgZ2lsdDoKKworICAgICAqKiBBbGxlIFdhZmZlbiwgaW4gZGVuZW4gZWluZSBzb2xjaGUgUHJvcGVydHkgZ2VzZXR6dCB3aXJkLCAgKioKKyAgICAgKiogc2luZCBtaXQgZGVyIE9iamVrdGJhbGFuY2UgYWJ6dWtsYWVyZW4uICAgICAgICAgICAgICAgICAgICoqCisKKworICAgIGYuIFBhcmllcndhZmZlbgorCisgICAgUGFyaWVyd2FmZmVuIHNpbmQgV2FmZmVuLCBkaWUgZGllIFZlcnRlaWRpZ3VuZyB1bnRlcnN0dWV0emVuLiAgRWluZQorICAgIFdhZmZlIHdpcmQgYWxzIFBhcmllcndhZmZlIHZlcndlbmRldCwgd2VubiBkaWUgUHJvcGVydHkgUF9QQVJSWQorICAgIGdlc2V0enQgaXN0LiBGb2xnZW5kZSBXZXJ0ZSBzaW5kIG1vZWdsaWNoOgorCisgICAgUEFSUllfTk9UICAgICBEaWUgaXN0IEtFSU5FIFBhcmllcndhZmZlICg9ZGVmYXVsdCkuCisKKyAgICBQQVJSWV9PTkxZICAgIERpZXMgaXN0IGVpbmUgcmVpbmUgUGFyaWVyd2FmZmUuCisKKyAgICBQQVJSWV9UT08gICAgIERpZXNlIFdhZmZlIHdpcmQgc293b2hsIGFscyBQYXJpZXJ3YWZmZSBhbHMgYXVjaAorICAgICAgICAgICAgICAgICAgYWxzIEFuZ3JpZmZzd2FmZmUgYmVudXR6dAorCisgICAgRGllIFNjaHV0endpcmt1bmcgZGVyIFBhcmllcndhZmZlIHdpcmQgd2llIGJlaSBSdWVzdHVuZ2VuIHVlYmVyIGRpZQorICAgIFByb3BlcnR5IFBfQUMgZ2VzZXR6dC4gVWViZXIgZGllIFByb3BlcnR5IFBfREVGRU5EX0ZVTkMga2FubiB3aWUgYmVpCisgICAgUnVlc3R1bmdlbiBlaW5lIERlZmVuZEZ1bmMgZ2VzZXR6dCB3ZXJkZW4uCisKKyAgICBXYWZmZW4gbWl0IFBBUlJZX09OTFkgdW50ZXJsaWVnZW4gZGVuIGdsZWljaGVuIFBfQUMtR3Jlbnp3ZXJ0ZW4gd2llCisgICAgUnVlc3R1bmdlbiB2b20gVHlwIEFUX1NISUVMRC4gV2FmZmVuIG1pdCBQQVJSWV9UT08gb2RlciBlaW5lcgorICAgIERlZmVuZEZ1bmMgbXVlc3NlbiBnZW5lcmVsbCBnZW5laG1pZ3Qgd2VyZGVuLgorCisgU0lFSEUgQVVDSDoKKyAgICAgYmFsYW5jZSwgcnVlc3R1bmdlbiwgZmVybndhZmZlbiwgdW5pcXVlcywgbnBjcywgZ3Jlbnp3ZXJ0ZSwKKyAgICAgYXR0cmlidXRzdmVyYWVuZGVydW5nZW4sIHJlc2lzdGVuemVuLCBrYW1wZm9iamVrdGUsIGthZW1wZmVyYm9uaQorCisgTEVUWlRFIEFlTkRFUlVORzoKKyAgICAgMTYuIEphbnVhciAyMDE0IEdsb2luc29uCmRpZmYgLS1naXQgYS9kb2Mvd2l6L3dhZmZlbnNraWxscyBiL2RvYy93aXovd2FmZmVuc2tpbGxzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMmRkZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd2l6L3dhZmZlbnNraWxscwpAQCAtMCwwICsxLDU5IEBACitXYWZmZW5za2lsbHMgaW0gTW9yZ2VuR3JhdWVuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0RhcyBTa2lsbHN5c3RlbSBkZXMgTUdzIGlzdCByZWNodCBrb21wbGV4LiBIaWVyIG51ciBlaW4gcGFhciBCZW1lZXJrdW5nZW4KK3p1IGRlbiBXYWZmZW5za2lsbHMuCisKK0VzIGdpYnQgMiBTb3J0ZW4gdm9uIFdhZmZlbnNraWxsczoKKworKiBhbGxnZW1laW5lIFdhZmZlbnNraWxscy4gRGllc2Ugc2luZCBpbiBkaWUgU2hlbGwgZWluZ2VidW5kZW4uCisqIEdpbGRlbnNwZXppZmlzY2hlIFNraWxscy4gRGllc2Ugc2luZCBpbiBkZXIgZW50c3ByZWNoZW5kZW4gR2lsZGUgZGVmaW5pZXJ0LgorCitEaWUgU2tpbGxzIHdlcmRlbiBpbiBlaW5lciBQcm9wZXJ0eSBpbSBTcGllbGVyIGdlc3BlaWNoZXJ0IChQX05FV1NLSUxMUykuIEVzCitoYW5kZWx0IGVzIHNpY2ggdW0gZWluIG1hcHBpbmcsIGRhcyBkaWVzZW4gQXVmYmF1IGhhdDoKKworKFsiQU5ZIjooW0FOWVNLSUxMU10pLAorImdpbGRlMSI6KFtTS0lMTFNfVk9OX0dJTERFXzFdKSwKKyJnaWxkZTIiOihbU0tJTExTX1ZPTl9HSUxERV8yXSksCisuLi5dKQorCitNaXQgUXVlcnkoUF9ORVdTS0lMTFMpIGVyaGFlbHQgbWFuIGRhcyBnZXNhbXRlIE1hcHBpbmcuCisKK01pdCBRdWVyeVByb3AoUF9ORVdTS0lMTFMpIGVyaGFlbHQgbWFuIE5VUiBESUUgU0tJTExTIERFUiBBS1RVRUxMRU4gR0lMREUhCitEYXMgaGVpc3N0LCBpbSBvYmlnZW4gQmVpc3BpZWwsIHdlbm4gZGVyIFNwaWVsZXIgaW4gZ2lsZGUxIGlzdCwgaXN0CitkZXIgUmV0dXJud2VydCBTS0lMTFNfVk9OX0dJTERFXzEuCisKK1NwcmljaDogQWxsZ2VtZWluZSBTa2lsbHMsIHdpZSBhbGxnZW1laW5lIFdhZmZlbnNraWxscywgc3RlaGVuIGluIGRpZXNlbSAKK01hcHBpbmcgbmljaHQgZHJpbiEgRWJlbnNvIHdpZSB6LkIuIGRlciBlbnRnaWZ0ZS1TcGVsbCBhdXMgZGVyIAorRHVlc3RlcndhbGRxdWVzdCAod29obCBhYmVyIGRlciBkZXIgS2xlcmlrZXIsIHdlbm4gbWFuIGVpbmVyIGlzdCkuCisKK01pdCBRdWVyeVNraWxsKCJza2lsbG5hbWUiKSBrYW5uIG1hbiBlaW5lbiBTa2lsbCBhYmZyYWdlbi4gRGFiZWkgd2lyZCwgd2Vubgora2VpbiBTa2lsbCB1bnRlciBkaWVzZW0gTmFtZW4gaW4gZGVyIGFrdHVlbGxlbiBHaWxkZSBlaW5nZXRyYWdlbiBpc3QsIGVpbgorZXZlbnR1ZWxsIHZvcmhhbmRlbmVyIEFOWS1Ta2lsbCB6dXJ1ZWNrZ2VnZWJlbi4gRGFoZXIgd2lyZCB6LkIuIGJlaSBlaW5lbQorQWJlbnRldXJlciBiZWkgUXVlcnlQcm9wKFBfTkVXU0tJTExTKSBkZXIgU2Nod2VydHdhZmZlbnNraWxsIG5pY2h0CithbmdlemVpZ3QsIHdvaGwgYWJlciBiZWkgZWluZW0gUXVlcnlTa2lsbChGSUdIVChXVF9TV09SRCkpLgorCitQcmlvcml0YWV0IGhhdCBpbW1lciBkZXIgU2tpbGwgZGVyIEdpbGRlLCB3ZW5uIGVyIHZvcmhhbmRlbiBpc3QuCisKK01hbiBrYW5uIGF1Y2ggU2tpbGxzIGluIGRlciBHaWxkZSB1bnRlcmRydWVja2VuLiBEaWVzIGdlaHQgdWViZXIgZGllIFBvcGVydHkKK1BfR1VJTERfREVBQ1RJVkFURV9TS0lMTFMuIERpZXNlIFNraWxscyB3ZXJkZW4gbmljaHQgcGVyIHNlIHVudGVyZHJ1ZWNrdCwKK3NvbmRlcm4gbnVyIGRpZSBlbnRzcHJlY2hlbmRlbiBBTlktU2tpbGxzLgorCitTcHJpY2g6IEVzIHNlaSBBIGVpbiBBYmVudGV1cmVyLgorCit4Y2FsbCBBLT5RdWVyeVNraWxsKEZJR0hUKFdUX1NXT1JEKSkKKworbWFnIGZvbGdlbmRlcyB6dXJ1ZWNrZ2ViZW46CisKK1Jlc3VsdDogKFsic2lfZGlmZmljdWx0eSI6MTUwLCJzaV9hYmlsIjowLCJzaV9ndWlsZCI6IkFOWSJdKQorCit0cml0dCBBIGRhcmF1ZmhpbiBkZW4gS2FlbXBmZXJuIGJlaSB1bmQgaGF0IGRvcnQgbm9jaCBrZWluZW4gU2Nod2VydHNraWxsCitnZWxlcm50LCB3aXJkIGhpbmdlZ2VuIDAgenVydWVja2dlZ2Vibi4gRnVlciBkZW4gRmFsbCBlaW5lcyBBdXN0cml0dHMgaXN0IGRlcgorV2VydCBhYmVyIG5hY2ggd2llIHZvciBnZXNwZWljaGVydCwgd2llIG1hbiBwZXIgUXVlcnkoUF9ORVdTS0lMTFMpIGxlaWNodAorc2VoZW4ga2Fubi4gRGllcyB3aXJkIHVudGVyZHJ1ZWNrdCwgZGEgaW4gZGVyIEthZW1wZmVyZ2lsZGUgZGllIFByb3AgCitQX0dVSUxEX0RFQUNUSVZBVEVfU0tJTExTIGdlc2V0enQgd2lyZC4KKworVHJpdHQgZGVyIFNwaWVsZXIgZGVuIENoYW90ZW4gYmVpLCBhZW5kZXJ0IHNpY2ggaGluZ2VnZW4gYmVpIGRpZXNlbSBBdWZydWYKK25pY2h0cy4KKworTGV0enRlIEFlbmRlcnVuZzogSHVtbmksIDIwMDMtMDctMDkKZGlmZiAtLWdpdCBhL2RvYy93aXovemF1YmVydHJhZW5rZSBiL2RvYy93aXovemF1YmVydHJhZW5rZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWRiNTRhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dpei96YXViZXJ0cmFlbmtlCkBAIC0wLDAgKzEsOTUgQEAKKworWmF1YmVydHJhZW5rZSBmdWVyIE1hZ2llcgorPT09PT09PT09PT09PT09PT09PT09PT09PQorCitXaWUgbWFuIGRpZSBUcmFlbmtlIGpldHp0IGdlbmF1IHZlcnN0ZWNrdCBibGVpYnQgZGVtIGJldHJlZmZlbmRlbiBNYWdpZXIKK3VlYmVybGFzc2VuLCBlcyBzb2xsdGUgaGFsdCBpbnNnZXNhbXQgZWluIGJyZWl0ZXMgU3Bla3RydW0gdm9uIHNlaHIgbGVpY2h0Cit6dSBmaW5kZW4gYmlzIGZhc3QgdW5tb2VnbGljaCBhYmdlZGVja3Qgc2Vpbi4KK0Z1ZXIgZGFzIE9yYWtlbCBkZXIgSG9jaGViZW5lIHNvbGx0ZSBkYW5uIGVpbiBlbnRzcHJlY2hlbmRlciBTcHJ1Y2gKK3ZvcmJlcmVpdGV0IHdlcmRlbiwgbmljaHQgenUga3J5cHRpc2NoIGFiZXIgZG9jaCBvcmFrbGVpZy4KKworRGllIHp1ZmFlbGxpZ2UgQXVzd2FobCBhbiB6dWdlb3JkbmV0ZW4gWmF1YmVydHJhZW5rZW4gd2lyZCBiZWltIGVyc3RlbgorRWlubG9nZ2VuIGRlcyBTcGllbGVycyBmZXN0Z2VsZWd0LgorCitEaWUgUmFldW1lLCBpbiBkZW5lbiBUcmFlbmtlIHZlcnN0ZWNrdCB3ZXJkZW4gKHVuZCBlcyBkdWVyZmVuIG51ciBSYWV1bWUKK3NlaW4pLCB3ZXJkZW4gaW4gOCBMaXN0ZW4gZWluZ2V0ZWlsdCwgamUgbmFjaCBTY2h3aWVyaWdrZWl0c2dyYWQuIERlciBoYWVuZ3QKK25hdHVlcmxpY2ggdm9uIGRlciBMYWdlIChzbyBpc3QgZWluIFRyYW5rIGluIGVpbmVtIG1vbnN0ZXJ3aW1tZWxuZGVuCitMYWJ5cmludGggc2Nod2llcmlnZXIgenUgZXJyZWljaGVuLCBhbHMgZWluZXIgYXVmIGRlciBIb2NoZWJlbmUpLCB1bmQgdm9uCitkZW0gVmVyc3RlY2sgc2VsYnN0IGFiLgorUXVlc3RyYWV1bWUsIGRpZSBudXIgaW0gUmFobWVuIGRlciBRdWVzdCBlcnJlaWNoYmFyIHNpbmQsIHNpbmQgdW5nZWVpZ25ldC4KKworCitNZWluIFN0YW5kYXJkYmVpc3BpZWwgZnVlciBlaW4gVmVyc3RlY2sgaXN0IGltbWVyIGZvbGdlbmRlczoKKyAKKz4gc2NoYXVlCitibGFibGFibGFibGEgLi4uLiBFaW4gU2NocmVpYnRpc2NoIHN0ZWh0IGluIGRlciBFY2tlLiAuLi4gYmxhYmxhYmxhCis+IHVudCBzY2hyZWlidGlzY2gKK0VyIGhhdCBlaW5lIFNjaHVibGFkZS4KKz4gb2VmZm5lIHNjaHVibGFkZSAgICAgICAgICAgICAgICAgICAgICAgICAKK0R1IG9lZmZuZXN0IGRpZSBTY2h1YmxhZGUuCis+IHVudCBzY2h1YmxhZGUKK0luIGRlciBTY2h1YmxhZGUgZW50ZWNrc3QgRHUgZWluIHBhYXIgUGFwaWVyZS4KKz4gdW50IHBhcGllcmUKK0JlaW0gUnVtd3VlaGxlbiBpbiBkZW4gUGFwaWVyZW4gZW50ZGVja3N0IER1IGVpbmVuIGtsZWluZW4gWmF1YmVydHJhbmssIGRlbgorRHUgc29mb3J0IHRyaW5rc3QuCisgCitEYW5uIGtvbW10IGRpZSBBdXN3YWhsc2VxdWVueiwgd2VsY2hlIEVpZ2Vuc2NoYWZ0IG1hbiBlcmhvZWhlbiB3aWxsLgorIAorSW4gZGllc2VtIEZhbGwgcmVpY2hlbiBEZXRhaWxzLCBEZXRhaWxzIG1pdCBDbG9zdXJlIHVuZCBlaW5lIEtvbW1hbmRvIGZ1ZXIKKyJvZWZmbmUiIGF1cy4gRXR3YSB3aWUgZm9sZ3Q6CisKKyAgdm9pZCBjcmVhdGUoKSB7CisgICAgWy4uLl0KKyAgICBTZXRQcm9wKFBfSU5UX0xPTkcsIC4uLiBFaW4gU2NocmVpYnRpc2NoIHN0ZWh0IGluIGRlciBFY2tlIC4uLik7CisgIAorICAgIEFkZERldGFpbCgoeyJ0aXNjaCIsICJzY2hyZWlidGlzY2gifSksCisgICAgICAiRXIgaGF0IGVpbmUgU2NodWJsYWRlLiIpOworCisgICAgQWRkQ21kKCJvZWZmbmUmc2NodWJsYWRlIiwgIydhY3Rpb25fb2VmZm5lLAorICAgICAgICAgICAiV2FzIG1vZWNodGVzdCBkdSBvZWZmbmVuLiIpOworICB9CisKKyAgcHJpdmF0ZSBpbnQgYWN0aW9uX29lZmZuZSgpIHsKKyAgICB0ZWxsX29iamVjdCh0aGlzX3BsYXllcigpLCAiRHUgb2VmZm5lc3QgZGllIFNjaHVibGFkZS5cbiIpOworICAgIHRlbGxfcm9vbSh0aGlzX29iamVjdCgpLCB0aGlzX3BsYXllcigpLT5OYW1lKCkrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgb2VmZm5ldCBlaW5lIFNjaHVibGFkZS5cbiIsICh7dGhpc19wbGF5ZXIoKX0pKTsKKworICAgIEFkZERldGFpbCgic2NodWJsYWRlIiwKKyAgICAgICAgICAgICAgIkluIGRlciBTY2h1YmxhZGUgZW50ZGVja3N0IGR1IGVpbiBwYWFyIFBhcGllcmUuXG4iKTsKKyAgICBBZGREZXRhaWwoInBhcGllcmUiLCAjJ2RldGFpbF9wYXBpZXJlKTsKKyAgfQorCisgIC8vIFphdWJlcnRyYW5rZ2ViZW5kZXMgRGV0YWlsICAKKyAgcHJpdmF0ZSBzdHJpbmcgZGV0YWlsX3BhcGllcmUoKSB7CisgICAgaWYgKHRoaXNfcGxheWVyKCktPkZpbmRQb3Rpb24oCisgICAgICAgIGJyZWFrX3N0cmluZygiQmVpbSBSdW13dWVobGVuIGluIGRlbiBQYXBpZXJlbiBlbnRkZWNrc3QgRHUgZWluZW4gIgorICAgICAgICAgICAgICAgICAgICAgImtsZWluZW4gWmF1YmVydHJhbmssIGRlbiBEdSBzb2ZvcnQgdHJpbmtzdC4iLCA3OCkpKQorICAgICAgcmV0dXJuICIiOyAgCisgICAgICAvLyBFcyBtdXNzIGVpbiBTdHJpbmcgenVydWVja2dlZ2ViZW4gd2VyZGVuLCBkYSBtYW4gc29uc3QKKyAgICAgIC8vIGRpZSBGZWhsZXJtZWxkdW5nICJTb3dhcyBzaWVoc3QgZHUgaGllciBuaWNodC4iIGJla29tbXQKKyAgICBlbHNlCisgICAgICByZXR1cm4gIkRpZSBQYXBpZXJlIHNpbmQgYWxsZSB1bmJlc2NocmlmdGV0LlxuIjsKKyAgfQorCisgIC8vIEF1ZnJhZXVtZW4gZGVzIFJhdW1lcworICB2b2lkIHJlc2V0KCkgeworICAgIGlmKCFzaXplb2YoZmlsdGVyKGFsbF9pbnZlbnRvcnkodGhpc19vYmplY3QoKSksICMnaW50ZXJhY3RpdmUpKSkgeworICAgICAgUmVtb3ZlRGV0YWlsKCJwYXBpZXJlIik7CisgICAgICBSZW1vdmVEZXRhaWwoInNjaHVibGFkZSIpOworICAgIH0KKyAgICA6OnJlc2V0KCk7CisgIH0KKyAgCitGaW5kUG90aW9uKCkgZ2lidCAxIHp1cnVlY2ssIHdlbm4gZGVyIFNwaWVsZXIgZGVuIFphdWJlcnRyYW5rIGZpbmRlbiBkYXJmLgorCitXZXIgYWxzbyBUcmFlbmtlIHZlcnN0ZWNrZW4gd2lsbCwgbWFjaHQgc293YXMgaW4gZGVyIEFydCB1bmQgbWVsZGV0IGRhbm4gZGVuCitSYXVtIHBlcnNvZW5saWNoIG9kZXIgcGVyIFBvc3QgYmVpIGRlbiBFcnptYWdpZXJuIGJ6dyBzZWluZW0gYWt0aXZlbgorUmVnaW9uc21hZ2llciBhbi4KKyAKK1NJRUhFIEFVQ0g6CisgICAgV2VpdGVyZSBEYXRlaW5hbWVuIG1pdCBCZWlzcGllbGVuIGZ1ZXIgVHJhbmt2ZXJzdGVja2Uga2FubiBtYW4gZGVyCisgICAgRGF0ZWkgL2V0Yy90cmFlbmtlIGVudG5laG1lbi4KKworICAgIEJlZmVobDogICAgdHJhZW5rZSAoZnVlciBNYWdpZXIgenVtIEVpbnNjaGFsdGVuIGRlcyBGaW5kZW5zIHZvbiBaVHMpCisKKzEwLiBBdWd1c3QgMjAxNSBHbG9pbnNvbgpkaWZmIC0tZ2l0IGEvZG9jL3dpei96d2VpdGllZGIgYi9kb2Mvd2l6L3p3ZWl0aWVkYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjcyZDI2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dpei96d2VpdGllZGIKQEAgLTAsMCArMSwyMSBAQAorSW4gZGVyIFp3ZWl0aWUtREIgd2VyZGVuIGFsbGUgQ2hhcnMgdmVyd2FsdGV0LCBkaWUgYWxzIFp3ZWl0aWUgdm9uIGlyZ2VuZGVpbmVtIGFuZGVyZW4gbWFya2llcnQgc2luZC4gKFp1ciBaZWl0OiBudXIgZGllIHNlaXQgSGVyYnN0IDIwMTQgZWluZ2Vsb2dndGVuLikKKworRGlyZWt0ZSBBYmZyYWdlIGRlciBad2VpdGllLURCIChmdWVyIEVyem1hZ2llcik6CisKK0RpZSBad2VpdGllLURCIGxpZWd0IHVudGVyCitzZWN1cmUvQVJDSC9zZWNvbmQuc3FsaXRlCitEYXMgdmVyd2FsdGVuZGUgT2JqZWt0IGltIE11ZCBpc3QgL3NlY3VyZS96d2VpdGllcworCitBdWYgZGVyIFNoZWxsIGZyYWd0IG1hbiBkaWUgREIgcmVjaHQgc2ltcGVsIHNvIGFiOgorc3FsaXRlMyAtY29sdW1uIC1oZWFkZXIgc2VjdXJlL0FSQ0gvc2Vjb25kLnNxbGl0ZQorCitBbGxlIFp3ZWl0aWVzIHZvbiBBcmF0aG9ybiBlcm1pdHRlbG46CitzZWxlY3QgKiBmcm9tIHp3ZWl0aWVzIHdoZXJlIGVyc3RpZT0nYXJhdGhvcm4nOworCitFcnN0aWUgdm9uIEFoYWIgZXJtaXR0ZWxuOgorc2VsZWN0IGVyc3RpZSBmcm9tIHp3ZWl0aWVzIHdoZXJlIG5hbWU9J2FoYWInOworCitEaWVzZSBzZWxlY3QtQW53ZWlzdW5nZW4gbGFzc2VuIHNpY2ggKGFscyBFTSkgYXVjaCBpbSBNdWQgYWJzZXR6ZW46Cit4Y2FsbCAvc2VjdXJlL3p3ZWl0aWVzLT5zcWxfcXVlcnkoCisgICAgInNlbGVjdCAqIGZyb20gendlaXRpZXMgd2hlcmUgZXJzdGllPSdhcmF0aG9ybic7IikKKwpkaWZmIC0tZ2l0IGEvaXRlbXMvLnJlYWRtZSBiL2l0ZW1zLy5yZWFkbWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlmZWQ0YQotLS0gL2Rldi9udWxsCisrKyBiL2l0ZW1zLy5yZWFkbWUKQEAgLTAsMCArMSw0IEBACitJbiBkaWVzZW0gVmVyemVpY2huaXMgc29sbHRlbiBnbG9iYWwgKHVuYWJoYWVuZ2lnIGVpbmVyIFJlZ2lvbiwgR2lsZGUgZXRjLikKK3ZlcmZ1ZWdiYXJlIEl0ZW1zIGFuZ2VzY2hsb3NzZW4gd2VyZGVuLCB3ZWxjaGUga2VpbmUgYmVzb25kZXJlbiBSZWNodGUKK2JyYXVjaGVuLiBBbGxlIE9iamVrdGUgYmVrb21tZW4gZGllIHNwZXppZWxsZSBVSUQgSVRFTVMsIHdlbGNoZSBlaW5lbiBMZXZlbAordm9uIDAgdW5kIGtlaW5lIFNjaHJlaWJyZWNodGUgaGF0LgpkaWZmIC0tZ2l0IGEvaXRlbXMvYm9lcnNlLmMgYi9pdGVtcy9ib2Vyc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTFlY2NlCi0tLSAvZGV2L251bGwKKysrIGIvaXRlbXMvYm9lcnNlLmMKQEAgLTAsMCArMSwxOTQgQEAKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHJ0dF9jaGVja3MKKworaW5oZXJpdCAiL3N0ZC9jb250YWluZXIiOworCisjZGVmaW5lIFVfUkVRICAgICAgInVfcmVxIgorCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPG1vbmV5Lmg+CisKKy8vIHp1bSBkZWJ1Z2dlbiB1bmQgZXh0cmEgcHVibGljCitwdWJsaWMgc3RyaW5nIGRlYnVnbW9kZTsKK3B1YmxpYyBzdHJpbmcgX19zZXRfZGVidWcoc3RyaW5nIHJlY3YpIHtyZXR1cm4gZGVidWdtb2RlPXJlY3Y7fQorI2luY2x1ZGUgPGxpdmluZy9jb21tLmg+CisjZGVmaW5lIFpERUJVRyh4KSBpZiAoc3RyaW5ncChkZWJ1Z21vZGUpICYmIGZpbmRfcGxheWVyKGRlYnVnbW9kZSkpIFwKKyAgZmluZF9wbGF5ZXIoZGVidWdtb2RlKS0+UmVjZWl2ZU1zZyh4LE1UX0RFQlVHLDAsb2JqZWN0X25hbWUoKSsiOiAiLE1FKQorLy8jZGVmaW5lIFpERUJVRyh4KQorCitpbnQgZG9udGFjY2VwdG1vbmV5OworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfTkFNRSwgIkdlbGRib2Vyc2UiKTsKKyAgU2V0UHJvcChQX1NIT1JULCAiRWluZSBHZWxkYm9lcnNlIik7CisgIFNldFByb3AoUF9MT05HLCAgIkVpbmUgc2Nob2VuZSBhdXMgTGVkZXIgZ2VmZXJ0aWd0ZSBHZWxkYm9lcnNlLlxuIik7CisgIFNldFByb3AoUF9NQVRFUklBTCwgKFtNQVRfTEVBVEhFUjoxMDBdKSk7CisgIFNldFByb3AoUF9HRU5ERVIsIEZFTUFMRSk7CisgIFNldFByb3AoUF9WQUxVRSwgIDgwKTsKKyAgU2V0UHJvcChQX1dFSUdIVCwgMzAwKTsKKyAgU2V0UHJvcChQX1dFSUdIVF9QRVJDRU5ULCA1MCk7CisgIFNldFByb3AoUF9NQVhfV0VJR0hULCAyNTAwMDApOyAvLyAxIG1pby4gTXVlbnplbi4KKyAgQWRkSWQoKHsiZ2VsZGJvZXJzZSIsICJib2Vyc2UiLCBCT0VSU0VJRH0pKTsKKyAgU2V0UHJvcChQX05PSU5TRVJUX01TRywKKyAgICAgICJEdSBrYW5uc3QgaW1tZXIgbnVyIGVpbmUgR2VsZGJvZXJzZSBnbGVpY2h6ZWl0aWcgYmVudXR6ZW4uXG4iKTsKK30KKworc3RhdGljIHN0cmluZyBfcXVlcnlfa2VlcF9vbl9zZWxsKCkKK3sKKyAgaWYgKGZpcnN0X2ludmVudG9yeSgpICYmIGxpdmluZyhlbnZpcm9ubWVudCgpKSkKKyAgICAgcmV0dXJuIGdldHVpZChlbnZpcm9ubWVudCgpKTsKKyAgcmV0dXJuIFF1ZXJ5KFBfS0VFUF9PTl9TRUxMKTsKK30KKworc3RhdGljIGludCBfcXVlcnlfYW1vdW50KCkKK3sKKyAgb2JqZWN0IG9iID0gZmlyc3RfaW52ZW50b3J5KCk7CisgIGlmIChsb2FkX25hbWUob2IpID09IEdFTEQpCisgICAgcmV0dXJuIG9iLT5RdWVyeVByb3AoUF9BTU9VTlQpOworICByZXR1cm4gMDsKK30KKwordm9pZCBBZGRBbW91bnQoaW50IGFtKQoreworICBvYmplY3Qgb2IgPSBmaXJzdF9pbnZlbnRvcnkoKTsKKyAgaWYgKGxvYWRfbmFtZShvYikgPT0gR0VMRCkKKyAgICBvYi0+QWRkQW1vdW50KGFtKTsKK30KKworc3RyaW5nIHNob3J0KCkKK3sKKyAgaW50IGk7CisgIHN3aXRjaCAoaT1RdWVyeVByb3AoUF9BTU9VTlQpKSB7CisgICAgY2FzZSAwOiAgcmV0dXJuICJFaW5lIGxlZXJlIEdlbGRib2Vyc2UuXG4iOworICAgIGNhc2UgMTogIHJldHVybiAiRWluZSBHZWxkYm9lcnNlIG1pdCBlaW5lciBNdWVuemUuXG4iOworICAgIGRlZmF1bHQ6IHJldHVybiAiRWluZSBHZWxkYm9lcnNlIG1pdCAiK2krIiBNdWVuemVuLlxuIjsKKyAgfQorICByZXR1cm4gMDsKK30KKworLy8gR2VsZCBkYXJmIG51ciByZWluLCB3ZW5uIGRpZXNlIEJvZXJzZSBzY2hvbiBHZWxkIGVudGhhZWx0CisvLyBPREVSIGVzIGF1Y2gga2VpbmUgYW5kZXJlIGltIGxlYmVuZGVuICghKSBJbnZlbnRhciBnaWJ0LCBkaWUgR2VsZAorLy8gZW50aGFlbHQuCitwcml2YXRlIGludCBhY2NlcHRfbW9uZXkoKQoreworICAvLyB3ZW5uIHdpciBnZXJhZGUgemVyc3RvZXJ0IHdlcmRlbiwgaXN0IGRhcyBoaWVyIGdlc2V0enQsIGRhbm4gYWt6ZXB0aWVyZW4KKyAgLy8gd2lyIGVpbiBHZWxkLiBTb25zdCB3dXJkZSBHZWxkLCB3YXMgZ2VyYWRlIGluIHByZXBhcmVfZGVzdHJ1Y3QoKQorICAvLyByYXVzYmV3ZWd0IHd1cmRlLCBldnRsLiB3aWVkZXIgcmVpbmJld2VndC4uLgorICBpZiAoZG9udGFjY2VwdG1vbmV5KQorICAgIHJldHVybiAwOworICAvLyBBdXNzZXJoYWxiIHZvbiBMaXZpbmdzIGdlaHQgcmVpbnN0ZWNrZW4gdm9uIEdlbGQgaW1tZXIuCisgIGlmICghbGl2aW5nKGVudmlyb25tZW50KCkpKQorICAgIHJldHVybiAxOworICAvLyB3ZW5uIGluIHVucyBHZWxkIGlzdCwgYXVjaC4KKyAgb2JqZWN0IGdlbGQgPSBmaXJzdF9pbnZlbnRvcnkoKTsKKyAgaWYgKGdlbGQgJiYgbG9hZF9uYW1lKGdlbGQpID09IEdFTEQpCisgICAgcmV0dXJuIDE7IC8vIGVybGF1YnQKKyAgLy8gd2lyIGhhYmVuIGtlaW4gR2VsZC4uLiBXZW5uIGVzIGVpbmUgbWl0IEdlbGQgaW0gZ2xlaWNoZW4gaW52IGdpYnQsCisgIC8vIG5laG1lbiB3aXIga2VpbnMuCisgIG9iamVjdCBhbmRlcmVib2Vyc2UgPSBwcmVzZW50KEdFTERCT0VSU0VfTUlUX0dFTEQsIGVudmlyb25tZW50KCkpOworICBpZiAob2JqZWN0cChhbmRlcmVib2Vyc2UpKQorICAgIHJldHVybiAwOworCisgIHJldHVybiAxOworfQorCit2YXJhcmdzIGludCBQcmV2ZW50SW5zZXJ0KG9iamVjdCBvYikKK3sKKyAgaWYgKG9iICYmIGxvYWRfbmFtZShvYik9PUdFTEQKKyAgICAgICYmIGFjY2VwdF9tb25leSgpKQorICB7CisgICAgcmV0dXJuIDo6UHJldmVudEluc2VydChvYik7CisgIH0KKyAgcmV0dXJuIDE7IC8vIG51ciBnZWxkIGVybGF1YnQKK30KKworcHVibGljIHZvaWQgTWVyZ2VNb25leShvYmplY3QgZ2VsZCkKK3sKKyAgaWYgKGdlbGQgJiYgcHJldmlvdXNfb2JqZWN0KCkgPT0gZ2VsZAorICAgICAgJiYgbG9hZF9uYW1lKGdlbGQpID09IEdFTEQKKyAgICAgICYmIGFjY2VwdF9tb25leSgpKQorICB7CisgICAgaW50IGZyZW1kYW1vdW50ID0gZ2VsZC0+UXVlcnlQcm9wKFBfQU1PVU5UKTsKKyAgICAvLyBEYSB3aXIgYXVzIGVpbmVuIE5vdGlmeU1vdmUgKGQuaC4gbW92ZSgpKSBnZXJ1ZmVuIHdlcmRlbiwgZGFyZiBoaWVyCisgICAgLy8ga2VpbmVzZmFsbHMgZWluIG1vdmUoKSBnZW1hY2h0IHdlcmRlbi4KKyAgICAvLyBXZW5uIGluIHVucyBHZWxkIGlzdCwgcHJpbWEsIGVpbmZhY2ggUF9BTU9VTlQgdmVyYWVuZGVybi4KKyAgICAvLyBXZW5uIG5pY2h0LCBtdWVzc2VuIHdpciBlaW4gbmV1ZXMgR2VsZG9iamVrdCBjbG9uZW4sIGZhbGxzIGZyZW1kYW1vdW50CisgICAgLy8gPiAwIGlzdC4KKyAgICBvYmplY3QgbWVpbmdlbGQgPSBmaXJzdF9pbnZlbnRvcnkoKTsKKyAgICBpZiAobWVpbmdlbGQgJiYgbG9hZF9uYW1lKG1laW5nZWxkKSA9PSBHRUxEKQorICAgIHsKKyAgICAgIGludCBtZWluYW1vdW50ID0gbWVpbmdlbGQtPlF1ZXJ5UHJvcChQX0FNT1VOVCk7CisgICAgICBaREVCVUcoc3ByaW50ZigiTWVyZ2VNb25leTogbWVpbmFtb3VudDogJWQsIGZyZW1kYW1vdW50OiAlZFxuIiwKKyAgICAgICAgICAgIG1laW5hbW91bnQsZnJlbWRhbW91bnQpKTsKKyAgICAgIC8vIHdlbm4gZnJlbWRhbW91bnQgcG9zaXRpdiBpc3QsIHZlcmVpbmlnZW4gd2lyIHVucyBuYXR1ZXJsaWNoLCBhdWNoCisgICAgICAvLyB3ZW5uIG1laW4gR2VsZCBuZWdhdGl2IGlzdC4gQWJlciBtYXguIDEgTWlvLiBNdWVuemVuIGF1Zm5laG1lbi4KKyAgICAgIGlmIChmcmVtZGFtb3VudCA+IDApCisgICAgICB7CisgICAgICAgIGludCB6dWJ1Y2hlbiA9IG1pbigxMDAwMDAwLW1laW5hbW91bnQsIGZyZW1kYW1vdW50KTsKKyAgICAgICAgWkRFQlVHKHNwcmludGYoIk1lcmdlTW9uZXk6IHp1YnVjaGVuOiAlZFxuIiwgenVidWNoZW4pKTsKKyAgICAgICAgbWVpbmdlbGQtPlNldFByb3AoUF9BTU9VTlQsIG1laW5hbW91bnQgKyB6dWJ1Y2hlbik7CisgICAgICAgIGdlbGQtPlNldFByb3AoUF9BTU9VTlQsIGZyZW1kYW1vdW50IC0genVidWNoZW4pOworICAgICAgICAvLyBlbnZpcm9ubWVudCB2ZXJzdGFlbmRpZ2VuIHVlYmVyIEludmVudGFyYWVuZGVydW5nLi4uIFVuZCB1bnMuIFdpcgorICAgICAgICAvLyBtYWNoZW4gbnVyIGRpZSBiZWlkZW4sIHdlaWwgYWxsZSBob2VocmVuIEVudnMgbmljaHQgc28gd2ljaHRpZworICAgICAgICAvLyBzaW5kLCBkYXNzIGVzIHNvZm9ydCBnZW1hY2h0IHdlcmRlbiBtdXNzLgorICAgICAgICBlbnZpcm9ubWVudCgpLT5fc2V0X2xhc3RfY29udGVudF9jaGFuZ2UoKTsKKyAgICAgICAgX3NldF9sYXN0X2NvbnRlbnRfY2hhbmdlKCk7CisgICAgICB9CisgICAgICAvLyBhbnNvbnN0ZW4gdmVyZWluaWdlbiB3aXIgdW5zLCB3ZW5uIG1laW5hbW91bnQgPiAwIHVuZCBmcmVtZGFtb3VudCA8IDAKKyAgICAgIC8vIGlzdCwgYWJlciBudXIgc292aWVsLCBkYXNzIGhpbnRlcmhlciBpbiBtaXIgbml4IG1laHIgdmVyYmxlaWJ0LgorICAgICAgZWxzZSBpZiAobWVpbmFtb3VudCA+IDAgJiYgZnJlbWRhbW91bnQgPCAwKQorICAgICAgeworICAgICAgICBpbnQgYW1vdW50X3RvX21lcmdlID0gbWluKG1laW5hbW91bnQsIGFicyhmcmVtZGFtb3VudCkpOworICAgICAgICBaREVCVUcoc3ByaW50ZigiTWVyZ2VNb25leTogenVidWNoZW46ICVkXG4iLCBhbW91bnRfdG9fbWVyZ2UpKTsKKyAgICAgICAgbWVpbmdlbGQtPlNldFByb3AoUF9BTU9VTlQsIG1laW5hbW91bnQgLSBhbW91bnRfdG9fbWVyZ2UpOworICAgICAgICBnZWxkLT5TZXRQcm9wKFBfQU1PVU5ULCBmcmVtZGFtb3VudCArIGFtb3VudF90b19tZXJnZSk7CisgICAgICAgIC8vIGVudmlyb25tZW50IHZlcnN0YWVuZGlnZW4gdWViZXIgSW52ZW50YXJhZW5kZXJ1bmcuLi4gVW5kIHVucy4gV2lyCisgICAgICAgIC8vIG1hY2hlbiBudXIgZGllIGJlaWRlbiwgd2VpbCBhbGxlIGhvZWhyZW4gRW52cyBuaWNodCBzbyB3aWNodGlnCisgICAgICAgIC8vIHNpbmQsIGRhc3MgZXMgc29mb3J0IGdlbWFjaHQgd2VyZGVuIG11c3MuCisgICAgICAgIGVudmlyb25tZW50KCktPl9zZXRfbGFzdF9jb250ZW50X2NoYW5nZSgpOworICAgICAgICBfc2V0X2xhc3RfY29udGVudF9jaGFuZ2UoKTsKKyAgICAgIH0KKyAgICAgIC8vIGluIGFuZGVyZW4gRmFlbGxlbiB2ZXJlaW5pZ2VuIHdpciBlaW5mYWNoIG5pY2h0IChiZWlkZSBuZWdhdGl2KQorICAgIH0KKyAgICAvLyBBbnNvbnN0ZW4gbmVobWVuIHdpciBudXIgcG9zaXRpdmVzIEdlbGQgdW5kIG51ciwgc293ZWl0IGVzIG5vY2gKKyAgICAvLyByZWlucGFzc3QuCisgICAgZWxzZSBpZiAoZnJlbWRhbW91bnQgPiAwKQorICAgIHsKKyAgICAgIFpERUJVRyhzcHJpbnRmKCJNZXJnZU1vbmV5OiBsZWVyZSBCb2Vyc2UsIGZyZW1kYW1vdW50OiAlZFxuIiwKKyAgICAgICAgICAgICBmcmVtZGFtb3VudCkpOworICAgICAgbWVpbmdlbGQgPSBjbG9uZV9vYmplY3QoR0VMRCk7CisgICAgICAvLyBub2NoZWNrLCB3ZWlsIHdpciBlaWdlbnRsaWNoIDxnZWxkPiBiZXdlZ2VuIHdvbGxlbiB1bmQgc2Nob24KKyAgICAgIC8vIGZlc3RnZXN0ZWxsdCBoYWJlbiwgZGFzcyBkaWVzZSBCb2Vyc2UgR2VsZCBha3plcHRpZXJ0LiBUcmFnZW4ga2FubgorICAgICAgLy8gZGVyIFNwaWVsZXIgZXMgYXVjaCAoc29nYXIgb2huZSBHZXdpY2h0c3JlZHVrdGlvbikuIERpZSBCb2Vyc2Ugc29sbAorICAgICAgLy8gbWF4LiAxTWlvIE11ZW56ZW4gYXVmbmVobWVuLgorICAgICAgaW50IHp1YnVjaGVuID0gbWluKGZyZW1kYW1vdW50LDEwMDAwMDApOworICAgICAgWkRFQlVHKHNwcmludGYoIk1lcmdlTW9uZXk6IHp1YnVjaGVuOiAlZFxuIiwgenVidWNoZW4pKTsKKyAgICAgIG1laW5nZWxkLT5TZXRQcm9wKFBfQU1PVU5ULCB6dWJ1Y2hlbik7CisgICAgICBnZWxkLT5TZXRQcm9wKFBfQU1PVU5ULCBmcmVtZGFtb3VudC16dWJ1Y2hlbik7CisgICAgICBtZWluZ2VsZC0+bW92ZSh0aGlzX29iamVjdCgpLCBNX05PQ0hFQ0spOworICAgICAgLy8gZW52aXJvbm1lbnQgdmVyc3RhZW5kaWdlbiB1ZWJlciBJbnZlbnRhcmFlbmRlcnVuZyBkdXJjaCBnZWxkLT5TZXRQcm9wCisgICAgICBlbnZpcm9ubWVudCgpLT5fc2V0X2xhc3RfY29udGVudF9jaGFuZ2UoKTsKKyAgICB9CisgICAgWkRFQlVHKHNwcmludGYoIk1lcmdlTW9uZXk6IEZpbmFsOiBtZWluYW1vdW50OiAlZCwgZnJlbWRhbW91bnQ6ICVkXG4iLAorICAgICAgICAgIG1laW5nZWxkLT5RdWVyeVByb3AoUF9BTU9VTlQpLGdlbGQtPlF1ZXJ5UHJvcChQX0FNT1VOVCkpKTsKKyAgfQorfQorCit2YXJhcmdzIGludCByZW1vdmUoaW50IHNpbGVudCkKK3sKKyAgZG9udGFjY2VwdG1vbmV5PTE7CisgIHJldHVybiA6OnJlbW92ZShzaWxlbnQpOworfQorCit2YXJhcmdzIGludCBpZChzdHJpbmcgc3RyLCBpbnQgbHZsKQoreworICBpZiAoc3RyPT1HRUxEQk9FUlNFX01JVF9HRUxECisgICAgICAmJiBsb2FkX25hbWUoZmlyc3RfaW52ZW50b3J5KCkpID09IEdFTEQpCisgICAgICByZXR1cm4gMTsKKyAgcmV0dXJuIDo6aWQoc3RyLCBsdmwpOworfQorCmRpZmYgLS1naXQgYS9pdGVtcy9ib3R0bGUuYyBiL2l0ZW1zL2JvdHRsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzOTM1ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9pdGVtcy9ib3R0bGUuYwpAQCAtMCwwICsxLDMyMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBCT1RUTEUuQyAtLSBhIHN0YW5kYXJkIGJvdHRsZSBvYmplY3QgKi8KKy8qICAgICAgICAgICAgIG9yIGJldHRlciBhIGNvbnRhaW5lciBmb3IqLworLyogICAgICAgICAgICAgbGlxdWlkZXMgICAgICAgICAgICAgICAgICovCisvKiAtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIChjKSBieSBIYXRlIDE5OTMgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2luaGVyaXQgIi9zdGQvdGhpbmciOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisKKyNkZWZpbmUgUEwJCXRoaXNfcGxheWVyKCkKKworI2RlZmluZSBHVUxQCQkyMAkJLyogbWlsbGlsaXRyZSBpcyBvbmUgZ3VscCA7KSAgICAgICAgICovCisKKyNkZWZpbmUgTk8JCSh7Imh1bmRlcnQiLCAibmV1bnppZyIsICJhY2h0emlnIiwgInNpZWJ6aWciLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInNlY2h6aWciLCAiZnVlbmZ6aWciLCAidmllcnppZyIsICJkcmVpc3NpZyIsXAorICAgICAgICAgICAgICAgICAgICAgICAgICAiendhbnppZyIsICJ6ZWhuIn0pCisKKyNkZWZpbmUgRlVMTCh3aGF0LCBhbW91bnQpCSh3aGF0Kl9NYXhDYXBhY2l0eS9hbW91bnQpCisjZGVmaW5lIFBBUlQod2hhdCwgYW1vdW50KQkod2hhdCphbW91bnQvX01heENhcGFjaXR5KQorI2RlZmluZSBBVkVSKHgseSwgYW1vdW50KQkoKEZVTEwoeCwgYW1vdW50KSt5KS8yKQorCitwcml2YXRlIHN0cmluZyBfRm5hbWUsIF9GZGVzY3I7Citwcml2YXRlIGludCBfRnByaWNlLCBfRmhlYWwsIF9Gc3RyZW5ndGgsIF9Gc29hazsKK3ByaXZhdGUgaW50IF9NYXhDYXBhY2l0eSwgX0NhcGFjaXR5LCBfTm9Ecmlua2luZzsKK3ByaXZhdGUgaW50IF9vcGVuLCBfTm9DbG9zZTsKKworLyoqKiogQUxMIFRIRSBQVUJMSUMgRlVOQ1RJT05TICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcHVibGljIHZvaWQgTGlxdWlkQ29udERlc2NyKHN0cmluZyBDbmFtZSwgc3RyaW5nICpDaWRzLCBzdHJpbmcgQ3Nob3J0LCBzdHJpbmcgQ2xvbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEN3ZWlnaHQsIGludCBDYXBhLCBpbnQgTm9DbG9zZSwgc3RyaW5nIENsYWJlbCkKKy8qIGdpdmUgYSBkZWNyaXB0aW9uIGZvciB0aGUgbGlxdWlkIGNvbnRhaW5lciAgICAgICAgICAqLworLyogQ25hbWUgICAtLSBQX05BTUUgb2YgdGhlIGNvbnRhaW5lciAgICAgICAgICAgICAgICAgICovCisvKiBDaWQgICAgIC0tIGlkZW50aXR5IG9mIHRoZSBjb250YWluZXIgICAgICAgICAgICAgICAgKi8KKy8qIENzaG9ydCAgLS0gUF9TSE9SVCBvZiB0aGUgY29udGFpbmVyICAgICAgICAgICAgICAgICAqLworLyogQ2xvbmcgICAtLSBQX0xPTkcgb2YgdGhlIGNvbnRhaW5lciAgICAgICAgICAgICAgICAgICovCisvKiBDd2VpZ2h0IC0tIHdlaWdodCBvZiB0aGUgY29udGFpbmVyICAgICAgICAgICAgICAgICAgKi8KKy8qIENjYXBhICAgLS0gY2FwYWNpdHkgb2YgdGhlIGNvbnRhaW5lciAgICAgICAgICAgICAgICAqLworLyogLS0gT1BUSU9OQUwgLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOb0Nsb3NlIC0tIG1lYW5zIGlmIDEgdGhlIGNvbnRhaW5lciBjYW4ndCBiZSBjbG9zZWQgKi8KKy8qIENsYWJlbCAgLS0gb3B0aW9uYWwgcmVhZGFibGUgbGFiZWwgKGZvciBib3R0bGVzKSAgICAqLworeworICBTZXRQcm9wKFBfTkFNRSwgQ25hbWUpOworICBTZXRQcm9wKFBfU0hPUlQsIENzaG9ydCk7CisgIFNldFByb3AoUF9MT05HLCBDbG9uZyk7CisgIFNldFByb3AoUF9SRUFEX01TRywgQ2xhYmVsKTsKKyAgU2V0UHJvcChQX1dFSUdIVCwgQ3dlaWdodCk7CisgIFNldFByb3AoUF9JRFMsIENpZHMpOworICBfTWF4Q2FwYWNpdHkgPSBDYXBhOworICBfQ2FwYWNpdHkgPSBDYXBhOworICBpZihfTm9DbG9zZSA9IE5vQ2xvc2UpIF9vcGVuID0gMTsKK30KKworcHVibGljIGludCBBZGRMaXF1aWQoaW50IEZhbW91bnQsIHN0cmluZyBGbmFtZSwgc3RyaW5nIEZkZXNjciwgaW50IEZwcmljZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBGaGVhbCwgaW50IEZzdHJlbmd0aCwgaW50IEZzb2FrKSAKKy8qIGFkZCBzb21ldGhpbmcgaW4gdGhlIGNvbnRhaW5lciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGYW1vdW50ICAgLS0gYW1vdW50IG9mIGxpcXVpZCB0byBiZSBhZGRlZCB0byBjb250YWluZXIsIGlmIG1vcmUgaWdub3JlZCAqLworLyogICAgICAgICAgICAgIG9yIGJldHRlciB0aGUgY29udGFpbmVyIHdpbGwgcnVuIG92ZXIgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZuYW1lICAgICAtLSBuYW1lIG9mIHRoZSBsaXF1aWQsIGlmIHRoZXJlIGlzIHN0aWxsIHNvbWV0aGluZyBpbnNpZGUgdGhlICovCisvKiAgICAgICAgICAgICAgY29udGFpbmVyLCBpdCBpdCB3aWxsIGJlIG1peGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRmRlc2NyICAgIC0tIGlmIHNvbWVib2R5IHdhbnRzIHRvIGxvb2sgYXQgdGhlIGxpcXVpZCBoZSBzZWVzIGl0IGlmIHRoZSAgKi8KKy8qICAgICAgICAgICAgICBjb250YWluZXIgaXMgb3BlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGcHJpY2UgICAgLS0gdGhlIHByaWNlIG9mIHRoZSBsaXF1aWQgZm9yIHRoZSBnaXZlbiBhbW91bnQgICAgICAgICAgICAgICAqLworLyogRmhlYWwgICAgIC0tIHRoZSBoZWFsaW5nIHBlciBmb3IgdGhlIGdpdmVuIGFtb3VudCAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZzdHJlbmd0aCAtLSB0aGUgc3RyZW5ndGggb2YgdGhlIGxpcXVpZCBmb3IgdGhlIGdpdmVuIGFtb3VudCAgICAgICAgICAgICovCisvKiBGc29hayAgICAgLS0gdGhlIHNvYWsgdmFsdWUgZm9yIHRoZSBnaXZlbiBhbW91bnQgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpZihfQ2FwYWNpdHkgJiYgRmFtb3VudCkKKyAgeworICAgIGlmKEZhbW91bnQ8PV9DYXBhY2l0eSkgX0NhcGFjaXR5IC09IEZhbW91bnQ7CisgICAgZWxzZSB7IEZhbW91bnQgPSBfQ2FwYWNpdHk7IF9DYXBhY2l0eSA9IDA7IH0gCisgICAgaWYoIV9GbmFtZSB8fCBfRm5hbWUgPT0gRm5hbWUpIHsgX0ZuYW1lID0gRm5hbWU7IF9GZGVzY3IgPSBGZGVzY3I7IH0KKyAgICBlbHNlIHsgX0ZkZXNjciA9ICJFaW5lIE1peHR1ciBhdXMgIitfRm5hbWUrIiB1bmQgIitGbmFtZTsgCisgICAgICAgICAgIF9GbmFtZSA9IF9GbmFtZSsiOiIrRm5hbWU7IH0KKyAgICBpZihfRnByaWNlKSBfRnByaWNlID0gQVZFUihGcHJpY2UsIF9GcHJpY2UsIEZhbW91bnQpOworICAgIGVsc2UgX0ZwcmljZSA9IEZVTEwoRnByaWNlLCBGYW1vdW50KTsKKyAgICBpZihfRmhlYWwpIF9GaGVhbCA9IEFWRVIoRmhlYWwsIF9GaGVhbCwgRmFtb3VudCk7CisgICAgZWxzZSBfRmhlYWwgPSBGVUxMKEZoZWFsLCBGYW1vdW50KTsKKyAgICBpZihfRnN0cmVuZ3RoKSBfRnN0cmVuZ3RoID0gQVZFUihGc3RyZW5ndGgsIEZzdHJlbmd0aCwgRmFtb3VudCk7CisgICAgZWxzZSBfRnN0cmVuZ3RoID0gRlVMTChGc3RyZW5ndGgsIEZhbW91bnQpOworICAgIGlmKF9Gc29haykgX0Zzb2FrID0gQVZFUihGc29haywgX0Zzb2FrLCBGYW1vdW50KTsKKyAgICBlbHNlIF9Gc29hayA9IEZVTEwoRnNvYWssIEZhbW91bnQpOworICAgIFNldFByb3AoUF9WQUxVRSwgUEFSVChfRnByaWNlLCAoX01heENhcGFjaXR5LV9DYXBhY2l0eSkpKTsKKyAgfQorICByZXR1cm4gRmFtb3VudDsKK30gICAKKworLyogdG8gcG91ciBzb21ldGhpbmcgb3V0IG9mIHRoZSBjb250YWluZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRmFtb3VudCAtLSBhbW91bnQgb2YgbGlxdWlkIHRvIGJlIHBvdXJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0gT1BUSU9OQUwgLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogd2hlcmUgICAtLSBpZiBzZXQgdGhlIGFtb3VudCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBjb250YWluZXIgJ3doZXJlJyAqLyAKK3B1YmxpYyBpbnQgUG91ckxpcXVpZChpbnQgRmFtb3VudCwgb2JqZWN0IHdoZXJlKQoreworICBpbnQgcG91ciwgcmVzdCwgb2xkYzsKKworICBvbGRjID0gX0NhcGFjaXR5OworICBpZihvYmplY3RwKHdoZXJlKSAmJiB3aGVyZS0+UXVlcnlDb250YWluZXIoKSkKKyAgeworICAgIHBvdXIgPSBGYW1vdW50OworICAgIHdoaWxlKHBvdXIgJiYKKyAgICAgICAgICAocmVzdD13aGVyZS0+QWRkTGlxdWlkKEdVTFAsIF9GbmFtZSwgX0ZkZXNjciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJUKF9GcHJpY2UsIEZhbW91bnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSVChfRmhlYWwsIEZhbW91bnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSVChfRnN0cmVuZ3RoLCBGYW1vdW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUlQoX0Zzb2FrLCBGYW1vdW50KSkpPT1HVUxQKQorICAgICAgcG91ciAtPSBHVUxQOworICAgIEZhbW91bnQgLT0gcmVzdDsKKyAgfQorICBlbHNlCisgICAgaWYob2JqZWN0cCh3aGVyZSkgJiYgbGl2aW5nKHdoZXJlKSkKKyAgICB7CisgICAgICBpZihGYW1vdW50Pl9NYXhDYXBhY2l0eS1fQ2FwYWNpdHkpIEZhbW91bnQgPSBfTWF4Q2FwYWNpdHktX0NhcGFjaXR5OworICAgICAgaWYoUEFSVChfRnNvYWssIEZhbW91bnQpICYmICF3aGVyZS0+ZHJpbmtfc29mdChQQVJUKF9Gc29haywgRmFtb3VudCkpKQorICAgICAgICByZXR1cm4gMDsgCisgICAgICBpZighd2hlcmUtPmRyaW5rX2FsY29ob2woUEFSVChfRnN0cmVuZ3RoLCBGYW1vdW50KSkpCisgICAgICAgIHJldHVybiAwOyAKKyAgICAgIHdoZXJlLT5oZWFsX3NlbGYoUEFSVChfRmhlYWwsIEZhbW91bnQpKTsKKyAgICB9CisgIF9DYXBhY2l0eSArPSBGYW1vdW50OworICBTZXRQcm9wKFBfVkFMVUUsIFBBUlQoX0ZwcmljZSwgKF9NYXhDYXBhY2l0eS1fQ2FwYWNpdHkpKSk7CisgIHJldHVybiBvbGRjICE9IF9DYXBhY2l0eTsKK30KKworLyogc29tZXRpbWVzIHRoZXJlIGlzIHNvbWV0aGluZyBwb2luc29ub3VzIGluc2lkZSB0aGUgY29udGFpbmVyICAgICAgICAgICAqLworLyogbm8gLS0gbXVzdCBiZSAxIGlmIGl0IGlzIG5vdCBhbGxvd2VkIHRvIGRyaW5rIChzdGFuZGFyZCB5ZXMpICAgICAgICAgICAqLworLyogICAgICAgdGhhdCBtZWFucyB0aGUgbGlxdWlkIGNhbiBiZSBwb3VyZWQgYW5kIGZpbGxlZCwgYnV0IG5vdGhpbmcgZWxzZSAqLworcHVibGljIGludCBBbGxvd0RyaW5raW5nKGludCBubykgeyByZXR1cm4gX05vRHJpbmtpbmcgPSBubzsgfQorCisvKiByZXR1cm5zIHRoZSBhbW91bnQgYW5kIG5hbWUgb2YgdGhlIGNvbnRlbnRzIGFzIGFuIGFycmF5IDAtY29udGVudHMgMS1uYW1lICovCitwdWJsaWMgPGludHxzdHJpbmc+KiBRdWVyeUNvbnRlbnRzKCkgeyByZXR1cm4gKHsgX01heENhcGFjaXR5LV9DYXBhY2l0eSwgX0ZuYW1lIH0pOyB9CisKKy8qIHJldHVybnMgMSBpZiB0aGlzIGlzIGFuIGxpcXVpZCBjb250YWluZXIgKi8KK3B1YmxpYyBpbnQgUXVlcnlDb250YWluZXIoKSB7IHJldHVybiAxOyB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgIDo6Y3JlYXRlKCk7CisKKyAgU2V0UHJvcChQX05BTUUsICJGbGFzY2hlIik7CisgIEFkZElkKCJmbGFzY2hlIik7CisgIFNldFByb3AoUF9TSE9SVCwgIkVpbmUgRmxhc2NoZSIpOworICBTZXRQcm9wKFBfTE9ORywgIkR1IHNpZWhzdCBuaWNodHMgYmVzb25kZXJlcyBhbiBvZGVyIGluIGRlciBGbGFzY2hlLlxuIik7CisgIFNldFByb3AoUF9HRU5ERVIsIEZFTUFMRSk7CisgIFNldFByb3AoUF9XRUlHSFQsMTAwKTsKK30KKwordm9pZCBpbml0KCkKK3sKKyAgOjppbml0KCk7CisgIAorICBhZGRfYWN0aW9uKCJEb0RyaW5rIiwgInRyaW5rZSIpOworICBhZGRfYWN0aW9uKCJEb0RyaW5rIiwgInRyaW5rIik7CisgIGFkZF9hY3Rpb24oIkRvUG91ciIsICJzY2h1ZXR0ZSIpOworICBhZGRfYWN0aW9uKCJEb1BvdXIiLCAic2NodWV0dCIpOworICBhZGRfYWN0aW9uKCJEb1BvdXIiLCAiZnVlbGxlIik7CisgIGFkZF9hY3Rpb24oIkRvUG91ciIsICJmdWVsbCIpOworICBhZGRfYWN0aW9uKCJEb09wZW4iLCAib2VmZm5lIik7CisgIGFkZF9hY3Rpb24oIkRvQ2xvc2UiLCAic2NobGllc3NlIik7CisgIGFkZF9hY3Rpb24oIkRvTG9va0luc2lkZSIsICJzY2hhdWUiKTsKKyAgYWRkX2FjdGlvbigiRG9Mb29rSW5zaWRlIiwgInNjaGF1Iik7Cit9CisKK2ludCBEb0RyaW5rKHN0cmluZyBhcmcpCit7CisgIHN0cmluZyBob3dtdWNoLCB0cmFzaCwgc3RyOworICBpbnQgYWxsLCBjbnQ7CisKKyAgaWYoIV9Ob0RyaW5raW5nICYmIGFyZyAmJiBzc2NhbmYoYXJnLCAiJXNhdXMgJXMiLCBzdHIsIHRyYXNoKT09MiAmJiBpZCh0cmFzaCkpCisgIHsKKyAgICBpZighX29wZW4pIHJldHVybiB3cml0ZShjYXBpdGFsaXplKG5hbWUoMCwxKSkrIiBpc3QgYWJlciBub2NoIHp1LlxuIikgfHwgMTsKKyAgICBpZihfQ2FwYWNpdHk9PV9NYXhDYXBhY2l0eSkKKyAgICB7CisgICAgICB3cml0ZSgiRHUgc2V0enQgIituYW1lKFdFTiwgMSkrIiBhbiB1bmQgbWVya3N0LCBkYXNzIG5pY2h0cyBtZWhyIGRhcmluICIKKyAgICAgICAgICAgKyJpc3QuXG4iKTsKKyAgICAgIHNheShQTC0+bmFtZSgpKyIgc2V0enQgIituYW1lKFdFTikrIiBhbiB1bmQgbWVya3QsIGRhc3MgbmljaHRzIG1laHIgZGFyaW4iCisgICAgICAgICArIiBpc3QuXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZihzc2NhbmYoc3RyLCAiYWxsZXMlcyIsIHRyYXNoKSA9PSAxKQorICAgIHsKKyAgICAgIGFsbCA9IF9DYXBhY2l0eTsKKyAgICAgIHdoaWxlKFBvdXJMaXF1aWQoR1VMUCwgUEwpKTsKKyAgICAgIGlmKF9DYXBhY2l0eT09YWxsKSByZXR1cm4gd3JpdGUoIkR1IHNjaGFmZnN0IGVzIG5pY2h0IHp1IHRyaW5rZW4uXG4iKSwwOworICAgICAgaWYoX01heENhcGFjaXR5Pl9DYXBhY2l0eSkKKyAgICAgICAgd3JpdGUoIkR1IGhhc3QgbnVyIGVpbmVuIFRlaWwgenUgdHJpbmtlbiBnZXNjaGFmZnQuXG4iKTsKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgd3JpdGUoIkR1IHRyaW5rc3QgYWxsZXMgYmlzIHp1bSBsZXR6dGVuIFJlc3QgYXVzICIrbmFtZShXRU0sIDEpKyIuXG4iKTsKKyAgICAgICAgc2F5KFBMLT5uYW1lKCkrIiB0cmlua3QgYWxsZXMgYmlzIHp1bSBsZXR6dGVuIFJlc3QgYXVzICIKKyAgICAgICAgICAgK25hbWUoV0VNKSsiLlxuIik7CisgICAgICB9CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYoc3RyPT0iICIgfHwgKHN0cj09InNjaGx1Y2siIHx8IHNzY2FuZihzdHIsICJzY2hsdWNrJXMiLCB0cmFzaCkpID09IDEpIAorICAgICAgaWYoUG91ckxpcXVpZChHVUxQLCBQTCkpCisgICAgICB7CisgICAgICAgIHdyaXRlKCJEdSB0cmlua3N0IGVpbmVuIFNjaGx1Y2sgYXVzICIrbmFtZShXRU0sIDEpKyIuXG4iKTsKKyAgICAgICAgc2F5KFBMLT5uYW1lKCkrIiB0cmlua3QgZWluZW4gU2NobHVjayBhdXMgIituYW1lKFdFTSkrIi5cbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICAgIGVsc2UgcmV0dXJuIHdyaXRlKCJEdSBzY2hhZmZzdCBlcyBuaWNodCB6dSB0cmlua2VuLlxuIikgfHwgMTsKKyAgICBlbHNlCisgICAgeworICAgICAgaWYoc3NjYW5mKHN0ciwgIiVzIHNjaGx1Y2slcyIsIGhvd211Y2gsIHRyYXNoKT49MSkgCisgICAgICBzd2l0Y2goaG93bXVjaCkKKyAgICAgIHsKKyAgICAgICAgY2FzZSAiMSI6CisgICAgICAgIGNhc2UgImVpbiI6CisgICAgICAgIGNhc2UgImVpbmVuIjogeyBjbnQgPSAxOyBob3dtdWNoID0gImVpbmVuIjsgYnJlYWs7IH0KKyAgICAgICAgY2FzZSAiMiI6CisgICAgICAgIGNhc2UgInp3ZWkiIDogeyBjbnQgPSAyOyBicmVhazsgfQorICAgICAgICBjYXNlICIzIjoKKyAgICAgICAgY2FzZSAiZHJlaSIgOiB7IGNudCA9IDM7IGJyZWFrOyB9CisgICAgICAgIGNhc2UgIjQiOgorICAgICAgICBjYXNlICJ2aWVyIiA6IHsgY250ID0gNDsgYnJlYWs7IH0KKyAgICAgICAgY2FzZSAiNSI6CisgICAgICAgIGNhc2UgImZ1ZW5mIjogeyBjbnQgPSA1OyBicmVhazsgfQorICAgICAgICBjYXNlICI2IjoKKyAgICAgICAgY2FzZSAic2VjaHMiOiB7IGNudCA9IDY7IGJyZWFrOyB9CisgICAgICAgIGNhc2UgIjciOgorICAgICAgICBjYXNlICJzaWViZW4iOnsgY250ID0gNzsgYnJlYWs7IH0KKyAgICAgICAgY2FzZSAiOCI6CisgICAgICAgIGNhc2UgImFjaHQiIDogeyBjbnQgPSA4OyBicmVhazsgfQorICAgICAgICBjYXNlICI5IjoKKyAgICAgICAgY2FzZSAibmV1biIgOiB7IGNudCA9IDk7IGJyZWFrOyB9CisgICAgICAgIGNhc2UgIjEwIjoKKyAgICAgICAgY2FzZSAiemVobiIgOiB7IGNudCA9IDEwOyBicmVhazsgfQorICAgICAgICBkZWZhdWx0OiBjbnQgPSAwOworICAgICAgfQorICAgICAgaWYoIWNudCkgeyBjbnQgPSAxOyBob3dtdWNoID0gImVpbmVuIjsgfQorICAgICAgd2hpbGUoY250LS0gJiYgYWxsPVBvdXJMaXF1aWQoR1VMUCwgUEwpKTsKKyAgICAgIGlmKGNudD4wICYmIGFsbD09X01heENhcGFjaXR5KSAKKyAgICAgICAgd3JpdGUoIlNvb28gdmllbGUgU2NobHVlY2tlIHdhcmVuIGdhciBuaWNodCBpbiAiK25hbWUoV0VNLCAxKSsiLlxuIik7CisgICAgICBlbHNlIHdyaXRlKCJEdSB0cmlua3N0IGVpbiBwYWFyIFNjaGx1Y2sgYXVzICIrbmFtZShXRU0sIDEpKyIuXG4iKTsKKyAgICAgIHNheShQTC0+bmFtZSgpKyIgdHJpbmt0IGF1cyAiK25hbWUoV0VNKSsiLlxuIik7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2ludCBEb1BvdXIoc3RyaW5nIGFyZykKK3sKKyAgb2JqZWN0IGRlc3Q7CisgIHN0cmluZyB3aGVyZSwgc3RyOworCisgIGlmKGFyZyAmJiBzc2NhbmYoYXJnLCAiJXNhdXMgJXMiLCBzdHIsIHdoZXJlKT09MiAmJiBpZCh3aGVyZSkpCisgIHsKKyAgICBpZighX29wZW4pIHJldHVybiB3cml0ZShjYXBpdGFsaXplKG5hbWUoMCwxKSkrIiBpc3QgYWJlciBub2NoIHp1LlxuIikgfHwgMTsKKyAgICBpZihfQ2FwYWNpdHk9PV9NYXhDYXBhY2l0eSkKKyAgICAgIHJldHVybiB3cml0ZSgiRXMgaXN0IG5pY2h0cyBpbiAiK25hbWUoV0VNLCAxKSsiLlxuIikgfHwgMTsKKyAgICBpZihzc2NhbmYoc3RyLCAiYWxsZXMlcyIsIHdoZXJlKT09MSkgCisgICAgeworICAgICAgUG91ckxpcXVpZChfTWF4Q2FwYWNpdHksIGVudmlyb25tZW50KHRoaXNfcGxheWVyKCkpKTsKKyAgICAgIHdyaXRlKCJEdSBzY2h1ZXR0ZXN0IGFsbGVzIGF1cyAiK25hbWUoV0VNLCAxKSsiLlxuIik7CisgICAgICBzYXkoUEwtPm5hbWUoKSsiIHNjaHVldHRldCBhbGxlcyBhdXMgIituYW1lKFdFTSkrIi5cbiIpOworICAgICAgcmV0dXJuIF9DYXBhY2l0eTsKKyAgICB9CisgICAgaWYoc3NjYW5mKHN0ciwgImluICVzIiwgd2hlcmUpPT0xKQorICAgIHsKKyAgICAgIGlmKCFkZXN0ID0gcHJlc2VudCh3aGVyZSkpIGRlc3QgPSBwcmVzZW50KHdoZXJlLCBlbnZpcm9ubWVudChQTCkpOworICAgICAgaWYoZGVzdCAmJiAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShkZXN0KSAmJgorICAgICAgICAgUG91ckxpcXVpZChfTWF4Q2FwYWNpdHktX0NhcGFjaXR5LCBkZXN0KSkKKyAgICAgIHsKKyAgICAgICAgd3JpdGUoIkR1IGZ1ZWxsc3QgIitkZXN0LT5uYW1lKFdFTiwgMSkrIiBtaXQgIitfRm5hbWUrIiBhYi5cbiIpOworICAgICAgICBzYXkoUEwtPm5hbWUoKSsiIGZ1ZWxsdCAiK2Rlc3QtPm5hbWUoV0VOKSsiIG1pdCAiK19GbmFtZSsiIGFiLlxuIik7CisgICAgICAgIHJldHVybiBfQ2FwYWNpdHk7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiAwOworfSAKKworaW50IERvT3BlbihzdHJpbmcgc3RyKQoreworICBpZihpZChzdHIpICYmICFfTm9DbG9zZSkKKyAgeworICAgIGlmKF9vcGVuKSByZXR1cm4gd3JpdGUoY2FwaXRhbGl6ZShuYW1lKDAsMSkpKyIgaXN0IHNjaG9uIG9mZmVuLlxuIikgfHwgMTsKKyAgICB3cml0ZSgiRHUgb2VmZm5lc3QgIituYW1lKFdFTiwgMSkrIi5cbiIpOworICAgIHNheShQTC0+bmFtZSgpKyIgb2VmZm5ldCAiK25hbWUoV0VOKSsiLlxuIik7CisgICAgX29wZW4gPSAxOworICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQorCitpbnQgRG9DbG9zZShzdHJpbmcgc3RyKQoreworICBpZihpZChzdHIpICYmICFfTm9DbG9zZSkKKyAgeworICAgIGlmKCFfb3BlbikgcmV0dXJuIHdyaXRlKGNhcGl0YWxpemUobmFtZSgwLDEpKSsiIGlzdCBzY2hvbiB6dS5cbiIpIHx8IDE7CisgICAgd3JpdGUoIkR1IG1hY2hzdCAiK25hbWUoV0VOLCAxKSsiIHp1LlxuIik7CisgICAgc2F5KFBMLT5uYW1lKCkrIiBzY2hsaWVzc3QgIituYW1lKFdFTikrIi5cbiIpOworICAgIF9vcGVuID0gMDsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworaW50IERvTG9va0luc2lkZShzdHJpbmcgc3RyKQoreworICBzdHJpbmcgdHJhc2g7CisKKyAgaWYoc3RyICYmIHNzY2FuZihzdHIsICJpbiAlcyIsIHRyYXNoKT09MSAmJiBpZCh0cmFzaCkpCisgIHsKKyAgICBpZighX29wZW4pIHJldHVybiB3cml0ZShjYXBpdGFsaXplKG5hbWUoMCwxKSkrIiBpc3QgYWJlciBub2NoIHp1LlxuIikgfHwgMTsKKyAgICBpZihfQ2FwYWNpdHk9PV9NYXhDYXBhY2l0eSkKKyAgICAgIHJldHVybiB3cml0ZSgiRXMgaXN0IG5pY2h0cyBpbiAiK25hbWUoV0VNLCAxKSsiLlxuIikgfHwgMTsKKyAgICB3cml0ZShjYXBpdGFsaXplKG5hbWUoMCwxKSkKKyAgICAgICAgICsiIGlzdCB6dSAiK05PW19DYXBhY2l0eSoxMC9fTWF4Q2FwYWNpdHldKyIgUHJvemVudCB2b2xsIG1pdCAiCisgICAgICAgICArX0ZkZXNjcisiLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2l0ZW1zL2J1Y2gvYnVjaC5jIGIvaXRlbXMvYnVjaC9idWNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgxZDQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2l0ZW1zL2J1Y2gvYnVjaC5jCkBAIC0wLDAgKzEsMTk0IEBACisvKgorICAxNy4wNC4yMDA3IEVubm94IGFuZ2VwYXNzdCBmdWVyIEJsaW5kZSwgYXV0b21hdGlzY2hlcyBmaWx0ZXJuIG9kZXIgZWlnZW5lcworICBWZXJ6ZWljaG5pcyBmdWVyIGJsaW5kZW5mcmV1bmRsaWNoZSBWZXJzaW9uIGVpbnplbG5lciBTZWl0ZW4gcGVyIAorICBidWNoZGlyX25vYXNjaWkKKyAqLworaW5oZXJpdCAic3RkL3RoaW5nIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorCisjZGVmaW5lIFRQIHRoaXNfcGxheWVyKCkKKyNkZWZpbmUgVFBOIHRoaXNfcGxheWVyKCktPm5hbWUoKQorCitpbnQgb2ZmZW4gPSAwOworaW50IHNlaXRlID0gMDsKKworaW50IGdldHNlaXR6YWhsKCk7CisKK3ZvaWQgY3JlYXRlKCkgeworICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuOworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfU0hPUlQsICJFaW4gQnVjaCIpOworICBTZXRQcm9wKFBfTE9ORywKKwkiRHUgaGFlbHRzdCBlaW4gbGVpbmVuZ2VidW5kZW5lcyBCdWNoIGluIERlaW5lbiBIYWVuZGVuLiBEZXIgVGl0ZWwgaGVpc3N0OlxuIisKKwkiQEBidWNoaW5mb0BALlxuIik7CisgIFNldFByb3AoUF9OQU1FLCJCdWNoIik7CisgIEFkZElkKCJidWNoIik7CisgIFNldFByb3AoUF9HRU5ERVIsIE5FVVRFUik7CisgIFNldFByb3AoUF9XRUlHSFQsODApOworICBTZXRQcm9wKFBfTk9CVVksIDEpOworICBBZGRDbWQoImxpZXN8bGVzZSZASUQiLCAibGllcyIsICJXYXMgd2lsbHN0IER1IGxlc2VuID8gU3ludGF4OiBMSUVTIDxFVFdBUz4uXG4iKTsKKyAgQWRkQ21kKCJvZWZmbmUmQElEIiwib2VmZm5lIiwiV2FzIHdpbGxzdCBEdSBvZWZmbmVuPyIpOworICBBZGRDbWQoInNjaGxpZXNzZXxzY2hsaWVzc0BJRCIsInNjaGxpZXNzZSIsIldhcyB3aWxsc3QgRHUgc2NobGllc3Nlbj8iKTsKKyAgQWRkQ21kKCJibGFldHRlcmUiLCJibGFldHRlcmUiKTsKK30KKworc3RhdGljIGludCBvZWZmbmUoKSB7CisgIGlmIChvZmZlbikgCisgICAgd3JpdGUoIkVzIGlzdCBzY2hvbiBnZW9lZmZuZXQuXG4iKTsKKyAgZWxzZSB7CisgICAgb2ZmZW49MTsKKyAgICBzZWl0ZT0xOworICAgIHdyaXRlKCJEdSBvZWZmbmVzdCBkYXMgQnVjaCBhdWYgU2VpdGUgMS5cbiIpOworICAgIHNheShUUE4gKyAiIG9lZmZuZXQgZWluIEJ1Y2guXG4iLFRQKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBzY2hsaWVzc2UoKSB7CisgIGlmICghb2ZmZW4pIAorICAgIHdyaXRlKCJFcyBpc3Qgc2Nob24gZ2VzY2hsb3NzZW4uXG4iKTsKKyAgZWxzZSB7CisgICAgb2ZmZW49MDsKKyAgICBzZWl0ZT0wOworICAgIHdyaXRlKCJEdSBzY2hsaWVzc3QgZGFzIEJ1Y2ggd2llZGVyLlxuIik7CisgICAgc2F5KFRQTiArICIgc2NobGllc3N0IGVpbiBCdWNoIHdpZWRlci5cbiIsVFApOworICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGJsYWV0dGVyZShzdHJpbmcgc3RyKSB7CisgIGlmICghb2ZmZW4gfHwgIXN0cmluZ3Aoc3RyKSkgcmV0dXJuIDA7CisgIGludCB6dV9zZWl0ZTsKKyAgaWYgKHNzY2FuZihzdHIsInp1IHNlaXRlICVkIix6dV9zZWl0ZSkhPTEpIHJldHVybiAwOworICBpbnQgc2VpdGVuemFobCA9IGdldHNlaXR6YWhsKCk7CisgIGlmICh6dV9zZWl0ZSA8IDEgfHwgenVfc2VpdGUgPiBzZWl0ZW56YWhsKSByZXR1cm4gMDsKKyAgd3JpdGUoIkR1IGJsYWV0dGVyc3QgenUgU2VpdGUgIit6dV9zZWl0ZSsiLlxuIik7CisgIHNheShUUE4gKyAiYmxhZXR0ZXJ0IGluIGVpbmVtIEJ1Y2guXG4iKTsKKyAgc2VpdGU9enVfc2VpdGU7CisgIHJldHVybiAxOworfQorCisKK3N0cmluZyBidWNoaW5mbygpIHsKKyAgcmV0dXJuICInU3RhbmRhcmRidWNoIG9kZXIgV2llIG1hbiBlaW4gc3RhbmRhcmRpc2llcnRlcyBCdWNoIHNjaHJlaWJ0JyI7Cit9CisKK2ludCBnZXRzZWl0emFobCgpIHsKKyAgcmV0dXJuIDM7Cit9CisKK3N0cmluZyBidWNoZGlyKCkgeworICByZXR1cm4gIi9pdGVtcy9idWNoLyI7Cit9CisvLyBaZWlndCBnZXd1ZW5zY2h0ZSBTZWl0ZSBhbiwgbWl0IGNsZWFyIHdlcmRlbiBncmFmaXNjaGUKKy8vIFNlaXRlbiBhdWZnZXNwYWx0ZW4gdW5kIG9obmUgUmFobWVuIGdlemVpZ3QKKwordm9pZCB6ZWlnZV9zZWl0ZShzdHJpbmcgZmlsZSwgc3RhdHVzIGNsZWFyKSB7CisgIGlmICghY2xlYXIpIHsKKyAgICBUUC0+bW9yZShmaWxlLDEpOworICAgIHJldHVybjsKKyAgfQorICBzdHJpbmcgdGV4dD1yZWFkX2ZpbGUoZmlsZSk7CisgIGlmICghc3RyaW5ncCh0ZXh0KSkgcmV0dXJuOworICAKKyAgc3RyaW5nKiBwYWdlcz0oeyIiLCIifSk7CisgIHN0cmluZyogbGluZXM9ZXhwbG9kZSh0ZXh0LCJcbiIpOworICBpbnQgbGVuLCBjb3VudD1zaXplb2YobGluZXMpLTE7CisgIHN0cmluZyBsaW5lOworCisgIGZvciAoaW50IGk9MTtpPGNvdW50O2krKykgeworICAgIGxpbmU9bGluZXNbaV07CisgICAgbGVuPXNpemVvZihsaW5lKTsKKyAgICBpZiAobGVuPjUwKSB7CisgICAgICBwYWdlc1swXSs9bGluZVsxLi5sZW4vMi0yXSsiXG4iOworICAgICAgcGFnZXNbMV0rPWxpbmVbbGVuLzIrMi4uPDJdKyJcbiI7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHBhZ2VzWzBdKz1saW5lWzEuLjwyXSsiXG4iOworICB9CisgIFRQLT5Nb3JlKChwYWdlc1swXStwYWdlc1sxXSkpOworfQorCisvLyBTY2hhdXQgb2IgZXMgZGllIFNlaXRlbi1EYXRlaSBtaXQgZGlyL3NlaXRlMDEgb2RlciBkaXIvc2VpdGUxIGZpbmRldAorc3RyaW5nIGZpbmRfZmlsZShzdHJpbmcgZGlyLCBzdHJpbmcgZmlsZSwgaW50IHBhZ2UpIHsKKyAgc3RyaW5nIGZpbGVuYW1lPWRpcitmaWxlKyhwYWdlPyAocGFnZTwxMCA/ICIwIitwYWdlIDogcGFnZSApIDogIiIpOworICBpZiAoZmlsZV9zaXplKGZpbGVuYW1lKT49MCkgcmV0dXJuIGZpbGVuYW1lOworICBmaWxlbmFtZT1kaXIrZmlsZSsocGFnZT8gcGFnZSA6ICIiKTsKKyAgaWYgKGZpbGVfc2l6ZShmaWxlbmFtZSk+PTApIHJldHVybiBmaWxlbmFtZTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vIHdlbm4ga2VpbmUgZ2VyYWR6YWhsaWdlIHNlaXRlIHZvcmhhbmRlbiwgZGFubiB3aXJkIHVuZ2VyYWRlIGFuZ2V6ZWlndAorc3RyaW5nIGZpbmRfcGFnZShzdHJpbmcgZGlyLCBzdHJpbmcgZmlsZSwgaW50IHBhZ2UpIHsKKyAgc3RyaW5nIGZpbGVuYW1lPWZpbmRfZmlsZShkaXIsZmlsZSxwYWdlKTsKKyAgLy8gZWlnZW50bGljaCBudXIgdW5nZXJhZGUgc2VpdGVuIGdlZm9yZGVydAorICBpZiAoIWZpbGVuYW1lICYmIHNlaXRlJTI9PTApIHsKKyAgICByZXR1cm4gZmluZF9maWxlKGRpcixmaWxlLHBhZ2UrMSk7CisgIH0KKyAgcmV0dXJuIGZpbGVuYW1lOworfQorCisvLyB3ZW5uIF9ub2FzY2lpIFZlcnplaWNobmlzIHdpcmQgenVlcnN0IGRvcnQgZ2VzdWNodCwgd2VubiBmbGFnCisvLyBub2FzY2lpIGdlc2V0enQgaXN0LCBkYSBkaWUgZmlsZXMgZGFubiBhdWZiZXJlaXRldCBzaW5kLCB3aXJkIGRhcworLy8gZmxhZyBnZWxvZXNjaHQKK3N0cmluZyBmaW5kX3BhZ2Vfbm9hc2NpaShzdHJpbmcgZGlyLCBzdHJpbmcgZmlsZSwgaW50IHBhZ2UsIHN0YXR1cyBub2FzY2lpKSB7CisgIGlmIChub2FzY2lpKSB7CisgICAgc3RyaW5nIG5vYXNjaWlfZGlyPWRpclsuLjwyXSsiX25vYXNjaWkvIjsKKyAgICBpZiAoZmlsZV9zaXplKG5vYXNjaWlfZGlyKT09LTIpIHsKKyAgICAgIHN0cmluZyBmaWxlbmFtZT1maW5kX3BhZ2Uobm9hc2NpaV9kaXIsZmlsZSxwYWdlKTsKKyAgICAgIGlmIChzdHJpbmdwKGZpbGVuYW1lKSkgeworCW5vYXNjaWk9MDsKKwlyZXR1cm4gZmlsZW5hbWU7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBmaW5kX3BhZ2UoZGlyLGZpbGUscGFnZSk7Cit9CisKK3ZvaWQgbGVzc2VpdGUoaW50IHNlaXRlKSB7CisgIHN0cmluZyBkaXI9YnVjaGRpcigpOworICBzdGF0dXMgbm9hc2NpaT0wOworICBpZiAoVFAtPlF1ZXJ5UHJvcChQX05PX0FTQ0lJX0FSVCkpIHsKKyAgICBub2FzY2lpPTE7CisgIH0KKyAgc3RyaW5nIGJ1Y2hfZmlsZT1maW5kX3BhZ2Vfbm9hc2NpaShkaXIsc2VpdGUgPyAic2VpdGUiIDogInRpdGVsIixzZWl0ZSwmbm9hc2NpaSk7CisgIGlmICghYnVjaF9maWxlKSB7CisgICAgd3JpdGUoIkJ1Y2hkYXRlbiBuaWNodCBnZWZ1bmRlbiFcbiIpOworICAgIHJldHVybjsKKyAgfQorICB6ZWlnZV9zZWl0ZShidWNoX2ZpbGUsbm9hc2NpaSk7Cit9Cit2b2lkIGxlc2J1Y2goKSB7CisgIGxlc3NlaXRlKHNlaXRlKTsKKyAgc2VpdGUrPTI7CisgIGlmIChzZWl0ZSA+IGdldHNlaXR6YWhsKCkpIHsKKyAgICBvZmZlbj0wOworICAgIHNlaXRlPTA7CisgICAgd3JpdGUoIkR1IGhhc3QgZGFzIEJ1Y2ggYXVzZ2VsZXNlbiB1bmQgc2NobGllc3N0IGVzLlxuIik7CisgICAgc2F5KFRQTiArICIgaGF0IGVpbiBCdWNoIGF1c2dlbGVzZW4gdW5kIHNjaGxpZXNzdCBlcy5cbiIsVFApOworICB9IGVsc2UgeworICAgIHdyaXRlKCJEdSBibGFldHRlcnN0IHVtLlxuIik7CisgICAgc2F5KFRQTiArICIgYmxhZXR0ZXJ0IHVtLlxuIixUUCk7CisgIH0KK30KKwordm9pZCB0aXRlbCgpIHsKKyAgbGVzc2VpdGUoMCk7Cit9CisKK3N0YXRpYyBpbnQgbGllcyhzdHJpbmcgc3RyKSB7CisgIHN0cmluZyB3YXM7CisgIG5vdGlmeV9mYWlsKCJadSB3ZWxjaGVyIFNlaXRlIHdpbGxzdCBEdSBibGFldHRlcm4/XG4iKTsKKyAgaWYoIXN0cikgcmV0dXJuIDA7CisgIGlmKHNzY2FuZihzdHIsIiVzIix3YXMpIT0xKSByZXR1cm4gMDsKKyAgaWYgKCFpZChzdHIpKSByZXR1cm4gMDsKKyAgc2F5KFRQTiArICIgbGllc3QgaW4gZWluZW0gQnVjaC5cbiIsVFApOworICBpZiAob2ZmZW4pIHsKKyAgICBsZXNidWNoKCk7CisgIH0gZWxzZSB7CisgICAgdGl0ZWwoKTsKKyAgfQorICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2l0ZW1zL2J1Y2gvYnVjaC5pbmZvIGIvaXRlbXMvYnVjaC9idWNoLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM2ZjE3MQotLS0gL2Rldi9udWxsCisrKyBiL2l0ZW1zL2J1Y2gvYnVjaC5pbmZvCkBAIC0wLDAgKzEsNTkgQEAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICAgICAgIERhcyBTdGFuZGFyZGJ1Y2ggICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICAgb2RlciAgICAgICAgICAgICAgICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICBXaWUgbWFuIGVpbiBzdGFuZGFyZGlzaWVydGVzICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICAgICAgICAgQnVjaCBzY2hyZWlidCAgICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitAc2VpdGVACisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiMqKioqKioqKioqKioqKiAtIDEgLSAqKioqKioqKioqKioqKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICojKiAgICAgICAgICAgS0VJTkUgUEFOSUshICAgICAgICAgICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiMqIFdlbm4gICBtYW4gIGVpbiAgIGdld29laG5saWNoZXMgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICojKiBCdWNoICBzY2hyZWliZW4gd2lsbCwgIGlzdCAgZGFzICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIyogU2Nod2llcmlnc3RlLCAgZGVtIFRleHQgIGRpZXNlcyAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiMqIEZvcm1hdCB6dSBnZWJlbi4gRGFyYW4ga2FubiBtYW4gKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICojKiBzaWNoIGFiZXIgYXVjaCBnZXdvZWhuZW4uICAgICAgICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiMqIERhcyAgQnVjaCBiZXN0ZWh0IGF1cyBkZW0gZmlsZSwgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICojKiBkYXMgIGRpZXNlcyBCdWNoICBlcnpldWd0LCAgdW5kICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIyogZWluZW0gIGRpcmVjdG9yeSwgIGluICBkZW0gIGRpZSAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiMqIFNlaXRlbiAgZW50aGFsdGVuICBzaW5kLiAgRGFiZWkgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICojKiBoYXQgIGRpZSAgVGl0ZWxzZWl0ZSBkZW4gIE5hbWVtICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIyogJ3RpdGVsJyB1bmQgZGllIFNlaXRlbiBiZWdpbm5lbiAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiMqIG1pdCAgJ3NlaXRlMScsICdzZWl0ZTMnLCAuLi4gRXMgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICojKiBnaWJ0ICBoaWVyYmVpIG51ciB1bmdlcmFkZSBTZWktICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIyogdGVubnVtbWVybi4gICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQHNlaXRlQAorKioqKioqKioqKioqKiogLSAyIC0gKioqKioqKioqKioqKiojKioqKioqKioqKioqKiogLSAzIC0gKioqKioqKioqKioqKioKKyogSW0gIGZpbGUgd2lyZCBlaW5mYWNoIC9vYmovYnVjaCAqIyogVmVyYmVzc2VydW5nc3ZvcnNjaGxhZWdlICAgc2luZCAqCisqIGluaGVyaXRlZCAgdW5kICBkYW5uIG1laXN0ICBudXIgKiMqIGF1c2RydWVja2xpY2ggZXJ3dWVuc2NodCEgICAgICAgKgorKiBkcmVpIEZ1bmt0aW9uZW4gZ2VhZW5kZXJ0OiAgICAgICojKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIGJ1Y2hkaXIoKSA6IGluIGRpZXNlciBGdW5rdGlvbiAgKiMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgIHdpcmQgZGFzIGRpcmVjdG9yeSBhbmdlZ2ViZW4sICojKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICBpbiBkZW0gZGFzIEJ1Y2ggZW50aGFsdGVuIGlzdCAqIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBnZXRzZWl0emFobCgpIDogZGllc2UgRnVua3Rpb24gICojKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICB1ZWJlcmdpYnQgZGllIFNlaXRlbnphaGwgZGVzICAqIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgQnVjaHMgICAgICAgICAgICAgICAgICAgICAgICAgKiMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICojKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogYnVjaGluZm8oKSA6IGRpZXNlIEZ1bmt0aW9uICAgICAqIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgdWViZXJnaWJ0IGRhcyBBdXNzZWhlbiBkZXMgICAgKiMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgIEJ1Y2hzLCBkYXMgbWFuIG1pdCAndW50ZXItICAgICojKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICBzdWNoZSBidWNoJyBiZWtvbW10ICAgICAgICAgICAqIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiojKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2l0ZW1zL2J1Y2gvYnVjaDEuYyBiL2l0ZW1zL2J1Y2gvYnVjaDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODBjMWMwCi0tLSAvZGV2L251bGwKKysrIGIvaXRlbXMvYnVjaC9idWNoMS5jCkBAIC0wLDAgKzEsOTkgQEAKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHNhdmVfdHlwZXMscnR0X2NoZWNrcworCitpbmhlcml0ICIvc3RkL3RoaW5nIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxzeXNfZGVidWcuaD4KKworI2RlZmluZSBQX1NFSVRFTlpBSEwgInNlaXRlbnphaGwiCisjZGVmaW5lIFBfU0VJVEUgICAgICAiYnVjaHNlaXRlIgorI2RlZmluZSBQX0JVQ0ggICAgICAgImJ1Y2hkaXIiCisKK3N0cmluZyAqbG9hZChzdHJpbmcgZmlsZSkgeyByZXR1cm4gZXhwbG9kZShyZWFkX2ZpbGUoZmlsZSksICJAc2VpdGVAXG4iKTsgfQorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuOworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfU0hPUlQsICJFaW4gQnVjaCIpOworICBTZXRQcm9wKFBfU0VJVEUsIDApOworICBTZXRQcm9wKFBfQlVDSCwgIi9pdGVtcy9idWNoL2J1Y2guaW5mbyIpOworICBTZXRQcm9wKFBfU0VJVEVOWkFITCwgc2l6ZW9mKGxvYWQoUXVlcnlQcm9wKFBfQlVDSCkpKSk7CisgIFNldFByb3AoUF9TSE9SVCwgIldpZSBtYW4gZWluIEJ1Y2ggc2NocmVpYnQhIik7CisgIFNldFByb3AoUF9MT05HLAorCSJEdSBoYWVsdHN0IGVpbiBsZWluZW5nZWJ1bmRlbmVzIEJ1Y2ggaW4gRGVpbmVuIEhhZW5kZW4uIERlciBUaXRlbCBsYXV0ZXQ6XG4iCisgICtRdWVyeVByb3AoUF9TSE9SVCkrIlxuIik7CisgIFNldFByb3AoUF9OQU1FLCJCdWNoIik7CisgIEFkZElkKCJidWNoIik7CisgIFNldFByb3AoUF9HRU5ERVIsIE5FVVRFUik7CisgIFNldFByb3AoUF9XRUlHSFQsODApOworICBTZXRQcm9wKFBfTk9CVVksIDEpOworICBBZGRDbWQoKHsibGllcyIsImxlc2UifSksICJsaWVzIik7CisgIEFkZENtZCgib2VmZm5lIiwib2VmZm5lIik7CisgIEFkZENtZCgic2NobGllc3NlIiwic2NobGllc3NlIik7CisgIEFkZENtZCgiYmxhZXR0ZXJlIiwiYmxhZXR0ZXJlIik7Cit9CisKK2ludCBvZWZmbmUoc3RyaW5nIHN0cikgeworICBpZiAoIXN0ciB8fCAhaWQoc3RyKSkgcmV0dXJuIDA7CisgIGlmIChRdWVyeVByb3AoUF9TRUlURSkpIHdyaXRlKCJFcyBpc3Qgc2Nob24gZ2VvZWZmbmV0LlxuIik7CisgIGVsc2UgeworCSAgU2V0UHJvcChQX1NFSVRFLCAxKTsKKwkgIHdyaXRlKCJEdSBvZWZmbmVzdCBkYXMgQnVjaCBhdWYgU2VpdGUgMS5cbiIpOworCSAgc2F5KFBMLT5uYW1lKCkgKyAiIG9lZmZuZXQgZWluIEJ1Y2guXG4iLFBMKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworaW50IHNjaGxpZXNzZShzdHJpbmcgc3RyKSB7CisgIHN0cmluZyB3YXM7CisKKyAgaWYgKCFzdHIgfHwgIWlkKHN0cikpIHJldHVybiAwOworICBpZiAoIVF1ZXJ5UHJvcChQX1NFSVRFKSkgd3JpdGUoIkVzIGlzdCBzY2hvbiBnZXNjaGxvc3Nlbi5cbiIpOworICBlbHNlIHsKKyAgICBTZXRQcm9wKFBfU0VJVEUsIDApOworCSAgd3JpdGUoIkR1IHNjaGxpZXNzdCBkYXMgQnVjaCB3aWVkZXIuXG4iKTsKKwkgIHNheShQTC0+bmFtZSgpICsgIiBzY2hsaWVzc3QgZWluIEJ1Y2ggd2llZGVyLlxuIixQTCk7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2ludCBibGFldHRlcmUoc3RyaW5nIHN0cikgeworICBpbnQgc2VpdGU7CisKKyAgbm90aWZ5X2ZhaWwoIlp1IHdlbGNoZXIgU2VpdGUgbW9lY2h0ZXN0IER1IGJsYWV0dGVybj9cbiIpOworICBpZiAoIXN0ciB8fCAhKHNlaXRlID0gUXVlcnlQcm9wKFBfU0VJVEUpKSkgcmV0dXJuIDA7CisgIGlmIChzc2NhbmYoc3RyLCJ6dSBzZWl0ZSAlZCIsIHNlaXRlKTwxICYmCisgICAgICAoKHNlaXRlIDwgMSkgfHwgKHNlaXRlID4gc2l6ZW9mKGxvYWQoUXVlcnlQcm9wKFBfQlVDSCkpKSkpKSByZXR1cm4gMDsKKyAgd3JpdGUoIkR1IGJsYWV0dGVyc3QgenUgU2VpdGUgIitzZWl0ZSsiLlxuIik7CisgIHNheShQTC0+bmFtZSgpICsgImJsYWV0dGVydCBpbiBlaW5lbSBCdWNoLlxuIik7CisgIFNldFByb3AoUF9TRUlURSwgc2VpdGUpOworICByZXR1cm4gMTsKK30KKworaW50IGxpZXMoc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIHdhczsKKyAgaW50IHNlaXRlOworCisgIG5vdGlmeV9mYWlsKCJXYXMgd2lsbHN0IER1IGxlc2VuID8gU3ludGF4OiBMSUVTIDxFVFdBUz4uXG4iKTsKKyAgaWYoIXN0ciB8fCAhaWQoc3RyKSB8fCBzc2NhbmYoc3RyLCIlcyIsd2FzKSE9MSkgcmV0dXJuIDA7CisgIHNheShQTC0+bmFtZSgpICsgIiBsaWVzdCBpbiBlaW5lbSBCdWNoLlxuIixQTCk7CisKKyAgc2VpdGUgPSBRdWVyeVByb3AoUF9TRUlURSk7CisJUEwtPk1vcmUobG9hZChRdWVyeVByb3AoUF9CVUNIKSlbc2VpdGUrK10pOworICBpZiAoIVF1ZXJ5UHJvcChQX1NFSVRFKSkgcmV0dXJuIDE7CisJaWYgKHNlaXRlID49IHNpemVvZihsb2FkKFF1ZXJ5UHJvcChQX0JVQ0gpKSkpIHsKKyAgICBTZXRQcm9wKFBfU0VJVEUsIDApOworCQl3cml0ZSgiRHUgaGFzdCBkYXMgQnVjaCBhdXNnZWxlc2VuIHVuZCBzY2hsaWVzc3QgZXMuXG4iKTsKKwkJc2F5KFBMLT5uYW1lKCkgKyAiIGhhdCBlaW4gQnVjaCBhdXNnZWxlc2VuIHVuZCBzY2hsaWVzc3QgZXMuXG4iLFBMKTsKKwl9IGVsc2UgeworICAgIFNldFByb3AoUF9TRUlURSwgc2VpdGUpOworCSAgd3JpdGUoIkR1IGJsYWV0dGVyc3QgdW0uXG4iKTsKKwkJc2F5KFBMLT5uYW1lKCkgKyAiIGJsYWV0dGVydCB1bS5cbiIsUEwpOworICB9CisJcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL2l0ZW1zL2J1Y2gvc2VpdGUxIGIvaXRlbXMvYnVjaC9zZWl0ZTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdmYzgxMAotLS0gL2Rldi9udWxsCisrKyBiL2l0ZW1zL2J1Y2gvc2VpdGUxCkBAIC0wLDAgKzEsMTkgQEAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIyoqKioqKioqKioqKioqIC0gMSAtICoqKioqKioqKioqKioqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiMqICAgICAgICAgICBLRUlORSBQQU5JSyEgICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICojKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIyogV2VubiAgIG1hbiAgZWluICAgZ2V3b2VobmxpY2hlcyAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiMqIEJ1Y2ggIHNjaHJlaWJlbiB3aWxsLCAgaXN0ICBkYXMgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICojKiBTY2h3aWVyaWdzdGUsICBkZW0gVGV4dCAgZGllc2VzICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIyogRm9ybWF0IHp1IGdlYmVuLiBEYXJhbiBrYW5uIG1hbiAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiMqIHNpY2ggYWJlciBhdWNoIGdld29laG5lbi4gICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICojKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIyogRGFzICBCdWNoIGJlc3RlaHQgYXVzIGRlbSBmaWxlLCAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiMqIGRhcyAgZGllc2VzIEJ1Y2ggIGVyemV1Z3QsICB1bmQgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICojKiBlaW5lbSAgZGlyZWN0b3J5LCAgaW4gIGRlbSAgZGllICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIyogU2VpdGVuICBlbnRoYWx0ZW4gIHNpbmQuICBEYWJlaSAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiMqIGhhdCAgZGllICBUaXRlbHNlaXRlIGRlbiAgTmFtZW0gKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICojKiAndGl0ZWwnIHVuZCBkaWUgU2VpdGVuIGJlZ2lubmVuICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIyogbWl0ICAnc2VpdGUxJywgJ3NlaXRlMycsIC4uLiBFcyAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiMqIGdpYnQgIGhpZXJiZWkgbnVyIHVuZ2VyYWRlIFNlaS0gKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICojKiB0ZW5udW1tZXJuLiAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9pdGVtcy9idWNoL3NlaXRlMyBiL2l0ZW1zL2J1Y2gvc2VpdGUzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MTNlMGUKLS0tIC9kZXYvbnVsbAorKysgYi9pdGVtcy9idWNoL3NlaXRlMwpAQCAtMCwwICsxLDE5IEBACisqKioqKioqKioqKioqKiAtIDIgLSAqKioqKioqKioqKioqKiMqKioqKioqKioqKioqKiAtIDMgLSAqKioqKioqKioqKioqKgorKiBJbSAgZmlsZSB3aXJkIGVpbmZhY2ggL3N0ZC9idWNoICojKiBWZXJiZXNzZXJ1bmdzdm9yc2NobGFlZ2UgICBzaW5kICoKKyogaW5oZXJpdGVkICB1bmQgIGRhbm4gbWVpc3QgIG51ciAqIyogYXVzZHJ1ZWNrbGljaCBlcnd1ZW5zY2h0ISAgICAgICAqCisqIGRyZWkgRnVua3Rpb25lbiBnZWFlbmRlcnQ6ICAgICAgKiMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICojKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogYnVjaGRpcigpIDogaW4gZGllc2VyIEZ1bmt0aW9uICAqIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgd2lyZCBkYXMgZGlyZWN0b3J5IGFuZ2VnZWJlbiwgKiMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgIGluIGRlbSBkYXMgQnVjaCBlbnRoYWx0ZW4gaXN0ICojKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIGdldHNlaXR6YWhsKCkgOiBkaWVzZSBGdW5rdGlvbiAgKiMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgIHVlYmVyZ2lidCBkaWUgU2VpdGVuemFobCBkZXMgICojKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICBCdWNocyAgICAgICAgICAgICAgICAgICAgICAgICAqIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBidWNoaW5mbygpIDogZGllc2UgRnVua3Rpb24gICAgICojKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICB1ZWJlcmdpYnQgZGFzIEF1c3NlaGVuIGRlcyAgICAqIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgQnVjaHMsIGRhcyBtYW4gbWl0ICd1bnRlci0gICAgKiMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgIHN1Y2hlIGJ1Y2gnIGJla29tbXQgICAgICAgICAgICojKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvaXRlbXMvYnVjaC90aXRlbCBiL2l0ZW1zL2J1Y2gvdGl0ZWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgxYzljYQotLS0gL2Rldi9udWxsCisrKyBiL2l0ZW1zL2J1Y2gvdGl0ZWwKQEAgLTAsMCArMSwxOSBAQAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgRGFzIFN0YW5kYXJkYnVjaCAgICAgICAgICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICAgICAgICAgICBvZGVyICAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogIFdpZSBtYW4gZWluIHN0YW5kYXJkaXNpZXJ0ZXMgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgICBCdWNoIHNjaHJlaWJ0ICAgICAgICAgICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2l0ZW1zL2Vpc2Vuc3RhbmdlLmMgYi9pdGVtcy9laXNlbnN0YW5nZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhYjMxNmQKLS0tIC9kZXYvbnVsbAorKysgYi9pdGVtcy9laXNlbnN0YW5nZS5jCkBAIC0wLDAgKzEsNDEgQEAKK2luaGVyaXQgIi9zdGQvd2VhcG9uIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPGNvbWJhdC5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSB7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9TSE9SVCwgIkVpbmUgRWlzZW5zdGFuZ2UiKTsKKyAgU2V0UHJvcChQX0xPTkcsCisiRGllc2UgRWlzZW5zdGFuZ2UgZWlnbmV0IHNpY2ggaGVydm9ycmFnZW5kIGRhenUsXG5cCittaXQgaWhyIGF1ZiBqZW1hbmRlbiBlaW56dXNjaGxhZ2VuLlxuIik7CisKKyAgU2V0UHJvcChQX05BTUUsICJFaXNlbnN0YW5nZSIpOworICBTZXRQcm9wKFBfR0VOREVSLCBGRU1BTEUpOworICBBZGRJZCgic3RhbmdlIik7CisgIEFkZElkKCJlaXNlbnN0YW5nZSIpOworICBTZXRQcm9wKFBfV0VJR0hULCA4MDAwKTsKKyAgU2V0UHJvcChQX1ZBTFVFLCAyMDApOworICBTZXRQcm9wKFBfTk9CVVksMSk7CisgIFNldFByb3AoUF9XRUFQT05fVFlQRSwgV1RfQ0xVQik7CisgIFNldFByb3AoUF9EQU1fVFlQRSxEVF9CTFVER0VPTik7CisgIFNldFByb3AoUF9OUl9IQU5EUywyKTsKKyAgU2V0UHJvcChQX1dDLCAyMDApOworICBTZXRQcm9wKFBfTUFURVJJQUwsKFtNQVRfSVJPTjoxMDBdKSk7CisKKyAgU2V0UHJvcChQX0hJVF9GVU5DLHRoaXNfb2JqZWN0KCkpOworfQorCitpbnQgSGl0RnVuYyhvYmplY3QgZW5lbXkpIHsKKyAgaW50IGRhbTsKKworICBpZiAoIW9iamVjdHAoZW5lbXkpIHx8ICFJU19MRUFSTkVSKGVuZW15KSkKKyAgICByZXR1cm4gMDsKKyAgZGFtPXF1ZXJ5X3dpel9sZXZlbChlbmVteSkqMTAwOworICBpZiAoZ2V0dWlkKGVuZW15KVswLi4xXT09InBhIiB8fCBnZXR1aWQoZW5lbXkpPT0idnJhaSIpCisgICAgZGFtKj0xMDA7CisgIHJldHVybiBkYW07Cit9CmRpZmYgLS1naXQgYS9pdGVtcy9mYWNrZWwuYyBiL2l0ZW1zL2ZhY2tlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMjE5ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9pdGVtcy9mYWNrZWwuYwpAQCAtMCwwICsxLDI0IEBACisjcHJhZ21hIHN0cm9uZ190eXBlcyxydHRfY2hlY2tzCisKK2luaGVyaXQgIi9zdGQvbGlnaHRzb3VyY2UiOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpIHsKKyAgbGlnaHRzb3VyY2U6OmNyZWF0ZSgpOworICBBZGRJZCgoeyJmYWNrZWwiLCJcbmZhY2tlbCJ9KSk7CisgIFNldFByb3AoUF9OQU1FLCJGYWNrZWwiKTsKKyAgU2V0UHJvcChQX1ZBTFVFLDUpOworICBTZXRQcm9wKFBfV0VJR0hULDEwMDApOworICBTZXRQcm9wKFBfR0VOREVSLEZFTUFMRSk7CisgIFNldFByb3AoUF9TSE9SVCwiRWluZSBGYWNrZWwiKTsKKyAgU2V0UHJvcChQX0xPTkcsIkVpbmUgZ2FueiBub3JtYWxlIEZhY2tlbC4gTWFuIGthbm4gc2llIGFuenVlbmRlbiB1bmQgd2llZGVyIGxvZXNjaGVuLlxuIik7CisgIFNldFByb3AoUF9BUlRJQ0xFLDEpOworICBTZXRQcm9wKFBfRlVFTCwyMDAwKTsKKyAgU2V0UHJvcChQX0xJR0hUREVTQywKKwkgICh7ImdsaW1tZW5kIiwiZmxhY2tlcm5kIiwibGVpY2h0IGZsYWNrZXJuZCIsImJyZW5uZW5kIiwKKyAgICAgICAgICAgICJoZWxsIGxvZGVybmQiLCJmcmlzY2ggYW5nZXp1ZW5kZXQifSkpOworICBTZXRQcm9wKFBfTElHSFRfVFlQRSwgTFRfVE9SQ0gpOworICBTZXRQcm9wKFBfTUFURVJJQUwsKFtNQVRfTUlTQ19XT09EOjEwMF0pKTsKK30KZGlmZiAtLWdpdCBhL2l0ZW1zL2Zpc2hpbmcvYXF1YXJpdW0vYWxsaWdhdG9yLmMgYi9pdGVtcy9maXNoaW5nL2FxdWFyaXVtL2FsbGlnYXRvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZTQwM2MKLS0tIC9kZXYvbnVsbAorKysgYi9pdGVtcy9maXNoaW5nL2FxdWFyaXVtL2FsbGlnYXRvci5jCkBAIC0wLDAgKzEsMTkgQEAKKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxmaXNoaW5nLmg+CisKK2luaGVyaXQgU1REX0ZJU0NIOworCisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpIHsKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpCisgICAgcmV0dXJuOworICA6OmNyZWF0ZSgpOworICBjb3Jwc2VvYmplY3QgPSAwOworICBBZGRJZCgoeyJhbGxpZ2F0b3IifSkpOworICBTZXRQcm9wKFBfTkFNRSwiQWxsaWdhdG9yIiApOworICBTZXRQcm9wKFBfU0hPUlQsIkVpbiBBbGxpZ2F0b3IiICk7CisgIFNldFByb3AoUF9MT05HLCJFaW4gb3JpZ2luYWwgS2FuYWxsaWdhdG9yIChUTSkuXG4iKTsKKyAgU2V0UHJvcChQX1ZBTFVFLDYwMCk7CisgIFNldFByb3AoUF9XRUlHSFQsIDEwMDApOworfQpkaWZmIC0tZ2l0IGEvaXRlbXMvZmlzaGluZy9hcXVhcml1bS9iYXJzY2guYyBiL2l0ZW1zL2Zpc2hpbmcvYXF1YXJpdW0vYmFyc2NoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA4YTViZQotLS0gL2Rldi9udWxsCisrKyBiL2l0ZW1zL2Zpc2hpbmcvYXF1YXJpdW0vYmFyc2NoLmMKQEAgLTAsMCArMSwxNyBAQAorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGZpc2hpbmcuaD4KKworaW5oZXJpdCBTVERfRklTQ0g7CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpIHsKKyAgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgICA6OmNyZWF0ZSgpOworICBBZGRJZCgoeyJiYXJzY2gifSkpOworICBTZXRQcm9wKFBfTkFNRSwiQmFyc2NoIiApOworICBTZXRQcm9wKFBfR0VOREVSLE1BTEUpOworICBTZXRQcm9wKFBfU0hPUlQsIkVpbiBCYXJzY2giICk7CisgIFNldFByb3AoUF9MT05HLCJFaW4gZHVua2VsZ3J1ZW5lciBCYXJzY2guXG4iKTsKKyAgU2V0UHJvcChQX1ZBTFVFLDYwKTsKKyAgU2V0UHJvcChQX1dFSUdIVCwgNTAwKTsKK30KZGlmZiAtLWdpdCBhL2l0ZW1zL2Zpc2hpbmcvYXF1YXJpdW0vYmZvcmVsbGUuYyBiL2l0ZW1zL2Zpc2hpbmcvYXF1YXJpdW0vYmZvcmVsbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTk3M2IzCi0tLSAvZGV2L251bGwKKysrIGIvaXRlbXMvZmlzaGluZy9hcXVhcml1bS9iZm9yZWxsZS5jCkBAIC0wLDAgKzEsMTcgQEAKKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxmaXNoaW5nLmg+CisKK2luaGVyaXQgU1REX0ZJU0NIOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSB7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgIDo6Y3JlYXRlKCk7CisgIEFkZElkKCh7ImZvcmVsbGUiLCJiYWNoZm9yZWxsZSJ9KSk7CisgIFNldFByb3AoUF9OQU1FLCJGb3JlbGxlIiApOworICBTZXRQcm9wKFBfR0VOREVSLEZFTUFMRSk7CisgIFNldFByb3AoUF9TSE9SVCwiRWluZSBGb3JlbGxlIiApOworICBTZXRQcm9wKFBfTE9ORywiRWluZSBrbGVpbmUgcm90Z2VmbGVja3RlIEJhY2hmb3JlbGxlLlxuIik7CisgIFNldFByb3AoUF9WQUxVRSwxMDApOworICBTZXRQcm9wKFBfV0VJR0hULCA1MDApOworfQpkaWZmIC0tZ2l0IGEvaXRlbXMvZmlzaGluZy9hcXVhcml1bS9ic2FpYi5jIGIvaXRlbXMvZmlzaGluZy9hcXVhcml1bS9ic2FpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMWNmMDAKLS0tIC9kZXYvbnVsbAorKysgYi9pdGVtcy9maXNoaW5nL2FxdWFyaXVtL2JzYWliLmMKQEAgLTAsMCArMSwxNyBAQAorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGZpc2hpbmcuaD4KKworaW5oZXJpdCBTVERfRklTQ0g7CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpIHsKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgOjpjcmVhdGUoKTsKKyAgQWRkSWQoKHsiYmFjaHNhaWJsaW5nIiwic2FpYmxpbmcifSkpOworICBTZXRQcm9wKFBfTkFNRSwiQmFjaHNhaWJsaW5nIiApOworICBTZXRQcm9wKFBfR0VOREVSLE1BTEUpOworICBTZXRQcm9wKFBfU0hPUlQsIkVpbiBCYWNoc2FpYmxpbmciICk7CisgIFNldFByb3AoUF9MT05HLCJFaW4gb2xpdi1icmF1bmVyIEJhY2hzYWlibGluZy5cbiIpOworICBTZXRQcm9wKFBfVkFMVUUsODApOworICBTZXRQcm9wKFBfV0VJR0hULCA0MDApOworfQpkaWZmIC0tZ2l0IGEvaXRlbXMvZmlzaGluZy9hcXVhcml1bS9kb3JzY2guYyBiL2l0ZW1zL2Zpc2hpbmcvYXF1YXJpdW0vZG9yc2NoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk3ZDkwYQotLS0gL2Rldi9udWxsCisrKyBiL2l0ZW1zL2Zpc2hpbmcvYXF1YXJpdW0vZG9yc2NoLmMKQEAgLTAsMCArMSwxNyBAQAorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGZpc2hpbmcuaD4KKworaW5oZXJpdCBTVERfRklTQ0g7CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpIHsKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgOjpjcmVhdGUoKTsKKyAgQWRkSWQoKHsiZG9yc2NoIiwia2FiZWxqYXUifSkpOworICBTZXRQcm9wKFBfTkFNRSwiRG9yc2NoIiApOworICBTZXRQcm9wKFBfR0VOREVSLE1BTEUpOworICBTZXRQcm9wKFBfU0hPUlQsIkVpbiBEb3JzY2giICk7CisgIFNldFByb3AoUF9MT05HLCJFaW4ga2xlaW5lcmVyIERvcnNjaC5cbiIpOworICBTZXRQcm9wKFBfVkFMVUUsMTAwKTsKKyAgU2V0UHJvcChQX1dFSUdIVCwgMjAwKTsKK30KZGlmZiAtLWdpdCBhL2l0ZW1zL2Zpc2hpbmcvYXF1YXJpdW0vZmlzY2guYyBiL2l0ZW1zL2Zpc2hpbmcvYXF1YXJpdW0vZmlzY2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGZlMjQxCi0tLSAvZGV2L251bGwKKysrIGIvaXRlbXMvZmlzaGluZy9hcXVhcml1bS9maXNjaC5jCkBAIC0wLDAgKzEsMTYgQEAKKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxmaXNoaW5nLmg+CisKK2luaGVyaXQgU1REX0ZJU0NIOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSB7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9OQU1FLCJGSVNDSCIgKTsKKyAgU2V0UHJvcChQX0dFTkRFUixNQUxFKTsKKyAgU2V0UHJvcChQX1NIT1JULCJFaW4gRmlzY2giICk7CisgIFNldFByb3AoUF9MT05HLCJFaW4gemllbWxpY2ggZ2V3b2VobmxpY2hlciBGaXNjaC5cbiIpOworICBTZXRQcm9wKFBfVkFMVUUsMTApOworICBTZXRQcm9wKFBfV0VJR0hULCAxMDApOworfQpkaWZmIC0tZ2l0IGEvaXRlbXMvZmlzaGluZy9hcXVhcml1bS9mbHVuZGVyLmMgYi9pdGVtcy9maXNoaW5nL2FxdWFyaXVtL2ZsdW5kZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTUwNTk4Ci0tLSAvZGV2L251bGwKKysrIGIvaXRlbXMvZmlzaGluZy9hcXVhcml1bS9mbHVuZGVyLmMKQEAgLTAsMCArMSwxNyBAQAorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGZpc2hpbmcuaD4KKworaW5oZXJpdCBTVERfRklTQ0g7CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpIHsKKyAgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgIDo6Y3JlYXRlKCk7CisgIEFkZElkKCh7ImZsdW5kZXIifSkpOworICBTZXRQcm9wKFBfTkFNRSwiRmx1bmRlciIgKTsKKyAgU2V0UHJvcChQX0dFTkRFUixGRU1BTEUpOworICBTZXRQcm9wKFBfU0hPUlQsIkVpbmUgRmx1bmRlciIgKTsKKyAgU2V0UHJvcChQX0xPTkcsIkVpbiB6aWVtbGljaCBmbGFjaGUgRmx1bmRlci5cbiIpOworICBTZXRQcm9wKFBfVkFMVUUsNjApOworICBTZXRQcm9wKFBfV0VJR0hULCAzMDApOworfQpkaWZmIC0tZ2l0IGEvaXRlbXMvZmlzaGluZy9hcXVhcml1bS9mb3JlbGxlLmMgYi9pdGVtcy9maXNoaW5nL2FxdWFyaXVtL2ZvcmVsbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGQxZmUyCi0tLSAvZGV2L251bGwKKysrIGIvaXRlbXMvZmlzaGluZy9hcXVhcml1bS9mb3JlbGxlLmMKQEAgLTAsMCArMSwxNyBAQAorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGZpc2hpbmcuaD4KKworaW5oZXJpdCBTVERfRklTQ0g7CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpIHsKKyAgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgIDo6Y3JlYXRlKCk7CisgIEFkZElkKCh7ImZvcmVsbGUiLCJyZWdlbmJvZ2VuZm9yZWxsZSJ9KSk7CisgIFNldFByb3AoUF9OQU1FLCJGb3JlbGxlIiApOworICBTZXRQcm9wKFBfR0VOREVSLEZFTUFMRSk7CisgIFNldFByb3AoUF9TSE9SVCwiRWluZSBGb3JlbGxlIiApOworICBTZXRQcm9wKFBfTE9ORywiRWluZSBncm9zc2UsIGJ1bnRlIFJlZ2VuYm9nZW5mb3JlbGxlLlxuIik7CisgIFNldFByb3AoUF9WQUxVRSwyMDApOworICBTZXRQcm9wKFBfV0VJR0hULCAxMDAwKTsKK30KZGlmZiAtLWdpdCBhL2l0ZW1zL2Zpc2hpbmcvYXF1YXJpdW0vZ2Zpc2NoLmMgYi9pdGVtcy9maXNoaW5nL2FxdWFyaXVtL2dmaXNjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZGQ2YTIKLS0tIC9kZXYvbnVsbAorKysgYi9pdGVtcy9maXNoaW5nL2FxdWFyaXVtL2dmaXNjaC5jCkBAIC0wLDAgKzEsMTcgQEAKKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxmaXNoaW5nLmg+CisKK2luaGVyaXQgU1REX0ZJU0NIOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSB7CisgICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuOworICA6OmNyZWF0ZSgpOworICBBZGRJZCgoeyJnb2xkZmlzY2gifSkpOworICBTZXRQcm9wKFBfTkFNRSwiR29sZGZpc2NoIiApOworICBTZXRQcm9wKFBfR0VOREVSLE1BTEUpOworICBTZXRQcm9wKFBfU0hPUlQsIkVpbiBHb2xkZmlzY2giICk7CisgIFNldFByb3AoUF9MT05HLCJFaW4gd3VuZGVyc2Nob2VuIHJvdGVyIEdvbGRmaXNjaC5cbiIpOworICBTZXRQcm9wKFBfVkFMVUUsMTAwKTsKKyAgU2V0UHJvcChQX1dFSUdIVCwgODApOworfQpkaWZmIC0tZ2l0IGEvaXRlbXMvZmlzaGluZy9hcXVhcml1bS9nb3JmZS5jIGIvaXRlbXMvZmlzaGluZy9hcXVhcml1bS9nb3JmZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NmMwMDEKLS0tIC9kZXYvbnVsbAorKysgYi9pdGVtcy9maXNoaW5nL2FxdWFyaXVtL2dvcmZlLmMKQEAgLTAsMCArMSwxOSBAQAorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGZpc2hpbmcuaD4KKworaW5oZXJpdCBTVERfRklTQ0g7CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpIHsKKyAgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgIDo6Y3JlYXRlKCk7CisgIEFkZElkKCh7ImdvbGRvcmZlIiwib3JmZSJ9KSk7CisgIFNldFByb3AoUF9OQU1FLCJHb2xkb3JmZSIgKTsKKyAgU2V0UHJvcChQX0dFTkRFUixGRU1BTEUpOworICBTZXRQcm9wKFBfU0hPUlQsIkVpbiBHb2xkb3JmZSIgKTsKKyAgU2V0UHJvcChQX0xPTkcsCisgICJFaW5lIHJvdGUgR29sZG9yZmUuIFNpZSBoYXQgZWluIHdlbmlnIEFlaG5saWNoa2VpdCBtaXQgZWluZW0gR29sZGZpc2NoLFxuIgorICArImlzdCBqZWRvY2ggd2VzZW50bGljaCBzY2hsYW5rZXIsIHNjaG5lbGxlciB1bmQgZ2VmcmFlc3NpZ2VyLlxuIik7CisgIFNldFByb3AoUF9WQUxVRSwgMTUwKTsKKyAgU2V0UHJvcChQX1dFSUdIVCwgODApOworfQpkaWZmIC0tZ2l0IGEvaXRlbXMvZmlzaGluZy9hcXVhcml1bS9oYWkuYyBiL2l0ZW1zL2Zpc2hpbmcvYXF1YXJpdW0vaGFpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgxZTU0NgotLS0gL2Rldi9udWxsCisrKyBiL2l0ZW1zL2Zpc2hpbmcvYXF1YXJpdW0vaGFpLmMKQEAgLTAsMCArMSwxNyBAQAorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGZpc2hpbmcuaD4KKworaW5oZXJpdCBTVERfRklTQ0g7CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpIHsKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgOjpjcmVhdGUoKTsKKyAgQWRkSWQoKHsiYmxhdWhhaSIsImhhaSJ9KSk7CisgIFNldFByb3AoUF9OQU1FLCJIYWkiICk7CisgIFNldFByb3AoUF9HRU5ERVIsTUFMRSk7CisgIFNldFByb3AoUF9TSE9SVCwiRWluIEhhaSIgKTsKKyAgU2V0UHJvcChQX0xPTkcsIkVpbiBncm9zc2VyLCBiaXNzaWdlciBCbGF1aGFpLlxuIik7CisgIFNldFByb3AoUF9WQUxVRSw4MDApOworICBTZXRQcm9wKFBfV0VJR0hULCAxMjAwKTsKK30KZGlmZiAtLWdpdCBhL2l0ZW1zL2Zpc2hpbmcvYXF1YXJpdW0vaGVjaHQuYyBiL2l0ZW1zL2Zpc2hpbmcvYXF1YXJpdW0vaGVjaHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzU4ZmY5Ci0tLSAvZGV2L251bGwKKysrIGIvaXRlbXMvZmlzaGluZy9hcXVhcml1bS9oZWNodC5jCkBAIC0wLDAgKzEsMTcgQEAKKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxmaXNoaW5nLmg+CisKK2luaGVyaXQgU1REX0ZJU0NIOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSB7CisgICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuOworICA6OmNyZWF0ZSgpOworICBBZGRJZCgoeyJoZWNodCJ9KSk7CisgIFNldFByb3AoUF9OQU1FLCJIZWNodCIgKTsKKyAgU2V0UHJvcChQX0dFTkRFUixNQUxFKTsKKyAgU2V0UHJvcChQX1NIT1JULCJFaW4gSGVjaHQiICk7CisgIFNldFByb3AoUF9MT05HLCJFaW4gdG9ycGVkb2ZvZXJtaWdlciwgZ3J1ZW5nZXN0cmVpZnRlciBIZWNodC5cbiIpOworICBTZXRQcm9wKFBfVkFMVUUsOTApOworICBTZXRQcm9wKFBfV0VJR0hULCA3MDApOworfQpkaWZmIC0tZ2l0IGEvaXRlbXMvZmlzaGluZy9hcXVhcml1bS9oZXJpbmcuYyBiL2l0ZW1zL2Zpc2hpbmcvYXF1YXJpdW0vaGVyaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJjYjMwYgotLS0gL2Rldi9udWxsCisrKyBiL2l0ZW1zL2Zpc2hpbmcvYXF1YXJpdW0vaGVyaW5nLmMKQEAgLTAsMCArMSwxOCBAQAorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGZpc2hpbmcuaD4KKworaW5oZXJpdCBTVERfRklTQ0g7CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpIHsKKyAgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgIDo6Y3JlYXRlKCk7CisgIEFkZElkKCh7ImhlcmluZyJ9KSk7CisgIFNldFByb3AoUF9OQU1FLCJIZXJpbmciICk7CisgIFNldFByb3AoUF9HRU5ERVIsTUFMRSk7CisgIFNldFByb3AoUF9TSE9SVCwiRWluIEhlcmluZyIgKTsKKyAgU2V0UHJvcChQX0xPTkcsCisgICJFaW4ga2xlaW5lciBIZXJpbmcuXG4iKTsKKyAgU2V0UHJvcChQX1ZBTFVFLDMwKTsKKyAgU2V0UHJvcChQX1dFSUdIVCwgMTAwKTsKK30KZGlmZiAtLWdpdCBhL2l0ZW1zL2Zpc2hpbmcvYXF1YXJpdW0va2FycGZlbi5jIGIvaXRlbXMvZmlzaGluZy9hcXVhcml1bS9rYXJwZmVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEyZWNlNwotLS0gL2Rldi9udWxsCisrKyBiL2l0ZW1zL2Zpc2hpbmcvYXF1YXJpdW0va2FycGZlbi5jCkBAIC0wLDAgKzEsMTcgQEAKKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxmaXNoaW5nLmg+CisKK2luaGVyaXQgU1REX0ZJU0NIOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSB7CisgICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuOworICA6OmNyZWF0ZSgpOworICBBZGRJZCgoeyJrYXJwZmVuIn0pKTsKKyAgU2V0UHJvcChQX05BTUUsIkthcnBmZW4iICk7CisgIFNldFByb3AoUF9HRU5ERVIsTUFMRSk7CisgIFNldFByb3AoUF9TSE9SVCwiRWluIEthcnBmZW4iICk7CisgIFNldFByb3AoUF9MT05HLCJFaW4gZ3Jvc3NlciBibGF1Z3JhdWVyIEthcnBmZW4uXG4iKTsKKyAgU2V0UHJvcChQX1ZBTFVFLDIwMCk7CisgIFNldFByb3AoUF9XRUlHSFQsIDEwMDApOworfQpkaWZmIC0tZ2l0IGEvaXRlbXMvZmlzaGluZy9hcXVhcml1bS9raGFpLmMgYi9pdGVtcy9maXNoaW5nL2FxdWFyaXVtL2toYWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmNmZTE5Ci0tLSAvZGV2L251bGwKKysrIGIvaXRlbXMvZmlzaGluZy9hcXVhcml1bS9raGFpLmMKQEAgLTAsMCArMSwxOSBAQAorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGZpc2hpbmcuaD4KKworaW5oZXJpdCBTVERfRklTQ0g7CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpIHsKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgOjpjcmVhdGUoKTsKKyAgQWRkSWQoKHsia2F0emVuaGFpIiwiaGFpIiwic2NobWlyZ2VscGFwaWVyIiwiXG5raGF1dCJ9KSk7CisgIFNldFByb3AoUF9OQU1FLCJLYXR6ZW5oYWkiICk7CisgIFNldFByb3AoUF9HRU5ERVIsTUFMRSk7CisgIFNldFByb3AoUF9TSE9SVCwiRWluIEthdHplbmhhaSIgKTsKKyAgU2V0UHJvcChQX0xPTkcsIkVpbiBrbGVpbmVyIEthdHplbmhhaSwgZXIgaGF0IGVpbmUgYWV1c3NlcnN0IHJhdWUgSGF1dC5cbiIpOworICBTZXRQcm9wKFBfVkFMVUUsMTAwKTsKKyAgU2V0UHJvcChQX1dFSUdIVCwgMjAwKTsKKyAgU2V0RWF0TWVzc2FnZSgiRHUgaGFldXRlc3QgZGVuIEthdHplbmhhaSB1bmQgaXNzdCBpaG4uIik7CisgIFNldENvcnBzZU9iamVjdChBTkdFTE9CSigia2hhdXQiKSk7Cit9CmRpZmYgLS1naXQgYS9pdGVtcy9maXNoaW5nL2FxdWFyaXVtL2tqYXUuYyBiL2l0ZW1zL2Zpc2hpbmcvYXF1YXJpdW0va2phdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZmI5MjkKLS0tIC9kZXYvbnVsbAorKysgYi9pdGVtcy9maXNoaW5nL2FxdWFyaXVtL2tqYXUuYwpAQCAtMCwwICsxLDE3IEBACisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8ZmlzaGluZy5oPgorCitpbmhlcml0IFNURF9GSVNDSDsKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkgeworICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuOworICA6OmNyZWF0ZSgpOworICBBZGRJZCgoeyJkb3JzY2giLCJrYWJlbGphdSJ9KSk7CisgIFNldFByb3AoUF9OQU1FLCJLYWJlbGphdSIgKTsKKyAgU2V0UHJvcChQX0dFTkRFUixNQUxFKTsKKyAgU2V0UHJvcChQX1NIT1JULCJFaW4gS2FiZWxqYXUiICk7CisgIFNldFByb3AoUF9MT05HLCJFaW4gcHJhZWNodGlnZXIsIGdyb3NzZXIgS2FiZWxqYXUuXG4iKTsKKyAgU2V0UHJvcChQX1ZBTFVFLDUwMCk7CisgIFNldFByb3AoUF9XRUlHSFQsIDUwMCk7Cit9CmRpZmYgLS1naXQgYS9pdGVtcy9maXNoaW5nL2FxdWFyaXVtL2xhY2hzLmMgYi9pdGVtcy9maXNoaW5nL2FxdWFyaXVtL2xhY2hzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY5ZmE0NAotLS0gL2Rldi9udWxsCisrKyBiL2l0ZW1zL2Zpc2hpbmcvYXF1YXJpdW0vbGFjaHMuYwpAQCAtMCwwICsxLDE2IEBACisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8ZmlzaGluZy5oPgorCitpbmhlcml0IFNURF9GSVNDSDsKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkgeworICAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgOjpjcmVhdGUoKTsKKyAgQWRkSWQoKHsibGFjaHMifSkpOworICBTZXRQcm9wKFBfTkFNRSwiTGFjaHMiICk7CisgIFNldFByb3AoUF9TSE9SVCwiRWluIExhY2hzIiApOworICBTZXRQcm9wKFBfTE9ORywiRWluIHNjaG9lbmVyLCBncm9zc2VyIExhY2hzLlxuIik7CisgIFNldFByb3AoUF9WQUxVRSw2MCk7CisgIFNldFByb3AoUF9XRUlHSFQsIDQwMCk7Cit9CmRpZmYgLS1naXQgYS9pdGVtcy9maXNoaW5nL2FxdWFyaXVtL25ldW4uYyBiL2l0ZW1zL2Zpc2hpbmcvYXF1YXJpdW0vbmV1bi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNDQ0OGQKLS0tIC9kZXYvbnVsbAorKysgYi9pdGVtcy9maXNoaW5nL2FxdWFyaXVtL25ldW4uYwpAQCAtMCwwICsxLDE5IEBACisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8ZmlzaGluZy5oPgorCitpbmhlcml0IFNURF9GSVNDSDsKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkgeworICAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgOjpjcmVhdGUoKTsKKyAgQWRkSWQoKHsibmV1bmF1Z2UiLCJiYWNobmV1bmF1Z2UifSkpOworICBTZXRQcm9wKFBfTkFNRSwiQmFjaG5ldW5hdWdlIiApOworICBTZXRQcm9wKFBfR0VOREVSLE5FVVRFUik7CisgIFNldFByb3AoUF9TSE9SVCwiRWluIE5ldW5hdWdlIiApOworICBTZXRQcm9wKFBfTE9ORywKKyAgIkVpbiBCYWNobmV1bmF1Z2UgbWl0IGVpbmVyIGtsZWluZW4gTXVuZHNjaGVpYmUuIERhbWl0IGthbm4gZXMgc2ljaFxuIgorICArImFuIFN0ZWluZW4gZmVzdGhhbHRlbiB1bmQgaW4gZGVyIFN0cm9lbXVuZyB0cmVpYmVuLlxuIik7CisgIFNldFByb3AoUF9WQUxVRSw2MCk7CisgIFNldFByb3AoUF9XRUlHSFQsIDMwMCk7Cit9CmRpZmYgLS1naXQgYS9pdGVtcy9maXNoaW5nL2FxdWFyaXVtL3BpcmFuaGEuYyBiL2l0ZW1zL2Zpc2hpbmcvYXF1YXJpdW0vcGlyYW5oYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZDFlYTIKLS0tIC9kZXYvbnVsbAorKysgYi9pdGVtcy9maXNoaW5nL2FxdWFyaXVtL3BpcmFuaGEuYwpAQCAtMCwwICsxLDE4IEBACisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8ZmlzaGluZy5oPgorCitpbmhlcml0IFNURF9GSVNDSDsKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkgeworICAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgOjpjcmVhdGUoKTsKKyAgQWRkSWQoKHsicGlyYW5oYSJ9KSk7CisgIFNldFByb3AoUF9OQU1FLCJQaXJhbmhhIiApOworICBTZXRQcm9wKFBfR0VOREVSLE1BTEUpOworICBTZXRQcm9wKFBfU0hPUlQsIkVpbiBQaXJhbmhhIiApOworICBTZXRQcm9wKFBfTE9ORywiRWluIGJvZXNhcnRpZ2VyIGtsZWluZXIgUGlyYW5oYSBtaXQgc2VociBzY2hhcmZlbiAiCisgICAgIlphZWhuZW4uXG4iKTsKKyAgU2V0UHJvcChQX1ZBTFVFLDQwKTsKKyAgU2V0UHJvcChQX1dFSUdIVCwgMTAwKTsKK30KZGlmZiAtLWdpdCBhL2l0ZW1zL2Zpc2hpbmcvYXF1YXJpdW0vcm9jaGVuLmMgYi9pdGVtcy9maXNoaW5nL2FxdWFyaXVtL3JvY2hlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMzhkMjgKLS0tIC9kZXYvbnVsbAorKysgYi9pdGVtcy9maXNoaW5nL2FxdWFyaXVtL3JvY2hlbi5jCkBAIC0wLDAgKzEsMTcgQEAKKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxmaXNoaW5nLmg+CisKK2luaGVyaXQgU1REX0ZJU0NIOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSB7CisgICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuOworICA6OmNyZWF0ZSgpOworICBBZGRJZCgoeyJyb2NoZW4iLCJuYWdlbHJvY2hlbiJ9KSk7CisgIFNldFByb3AoUF9OQU1FLCJSb2NoZW4iICk7CisgIFNldFByb3AoUF9HRU5ERVIsTUFMRSk7CisgIFNldFByb3AoUF9TSE9SVCwiRWluIFJvY2hlbiIgKTsKKyAgU2V0UHJvcChQX0xPTkcsIkVpbiBrbGVpbmVyIE5hZ2Vscm9jaGVuLlxuIik7CisgIFNldFByb3AoUF9WQUxVRSw2MCk7CisgIFNldFByb3AoUF9XRUlHSFQsIDMwMCk7Cit9CmRpZmYgLS1naXQgYS9pdGVtcy9maXNoaW5nL2FxdWFyaXVtL3NjaGxlaS5jIGIvaXRlbXMvZmlzaGluZy9hcXVhcml1bS9zY2hsZWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDBmMjNiCi0tLSAvZGV2L251bGwKKysrIGIvaXRlbXMvZmlzaGluZy9hcXVhcml1bS9zY2hsZWkuYwpAQCAtMCwwICsxLDE3IEBACisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8ZmlzaGluZy5oPgorCitpbmhlcml0IFNURF9GSVNDSDsKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkgeworICAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgOjpjcmVhdGUoKTsKKyAgQWRkSWQoKHsic2NobGVpZSIsInNjaGxlaSJ9KSk7CisgIFNldFByb3AoUF9OQU1FLCJTY2hsZWllIiApOworICBTZXRQcm9wKFBfR0VOREVSLEZFTUFMRSk7CisgIFNldFByb3AoUF9TSE9SVCwiRWluZSBTY2hsZWkiICk7CisgIFNldFByb3AoUF9MT05HLCJFaW5lIGFldXNzZXJzdCBzY2hsZWltaWdlIFNjaGxlaWUuXG4iKTsKKyAgU2V0UHJvcChQX1ZBTFVFLDEwMCk7CisgIFNldFByb3AoUF9XRUlHSFQsIDgwMCk7Cit9CmRpZmYgLS1naXQgYS9pdGVtcy9maXNoaW5nL2FxdWFyaXVtL3NjaG9sbGUuYyBiL2l0ZW1zL2Zpc2hpbmcvYXF1YXJpdW0vc2Nob2xsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYjZhYjQKLS0tIC9kZXYvbnVsbAorKysgYi9pdGVtcy9maXNoaW5nL2FxdWFyaXVtL3NjaG9sbGUuYwpAQCAtMCwwICsxLDE3IEBACisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8ZmlzaGluZy5oPgorCitpbmhlcml0IFNURF9GSVNDSDsKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkgeworICAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgOjpjcmVhdGUoKTsKKyAgQWRkSWQoKHsic2Nob2xsZSJ9KSk7CisgIFNldFByb3AoUF9OQU1FLCJTY2hvbGxlIiApOworICBTZXRQcm9wKFBfR0VOREVSLEZFTUFMRSk7CisgIFNldFByb3AoUF9TSE9SVCwiRWluZSBTY2hvbGxlIiApOworICBTZXRQcm9wKFBfTE9ORywiRWluIHBsYXR0ZSwgZmxhY2hlIFNjaG9sbGUuXG4iKTsKKyAgU2V0UHJvcChQX1ZBTFVFLDYwKTsKKyAgU2V0UHJvcChQX1dFSUdIVCwgNTAwKTsKK30KZGlmZiAtLWdpdCBhL2l0ZW1zL2Zpc2hpbmcvYXF1YXJpdW0vc2Nod2VydC5jIGIvaXRlbXMvZmlzaGluZy9hcXVhcml1bS9zY2h3ZXJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM3NTRjOQotLS0gL2Rldi9udWxsCisrKyBiL2l0ZW1zL2Zpc2hpbmcvYXF1YXJpdW0vc2Nod2VydC5jCkBAIC0wLDAgKzEsMTcgQEAKKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxmaXNoaW5nLmg+CisKK2luaGVyaXQgU1REX0ZJU0NIOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSB7CisgICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuOworICA6OmNyZWF0ZSgpOworICBBZGRJZCgoeyJzY2h3ZXJ0ZmlzY2gifSkpOworICBTZXRQcm9wKFBfTkFNRSwiU2Nod2VydGZpc2NoIiApOworICBTZXRQcm9wKFBfR0VOREVSLE1BTEUpOworICBTZXRQcm9wKFBfU0hPUlQsIkVpbiBTY2h3ZXJ0ZmlzY2giICk7CisgIFNldFByb3AoUF9MT05HLCJFaW4gU2Nod2VydGZpc2NoIG1pdCBlaW5lbSBzZWhyIGxhbmdlbiBTY2h3ZXJ0LlxuIik7CisgIFNldFByb3AoUF9WQUxVRSw3MDApOworICBTZXRQcm9wKFBfV0VJR0hULCAxMDAwKTsKK30KZGlmZiAtLWdpdCBhL2l0ZW1zL2Zpc2hpbmcvYXF1YXJpdW0vc2VlaGFzZS5jIGIvaXRlbXMvZmlzaGluZy9hcXVhcml1bS9zZWVoYXNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MxNzNkMAotLS0gL2Rldi9udWxsCisrKyBiL2l0ZW1zL2Zpc2hpbmcvYXF1YXJpdW0vc2VlaGFzZS5jCkBAIC0wLDAgKzEsMTcgQEAKKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxmaXNoaW5nLmg+CisKK2luaGVyaXQgU1REX0ZJU0NIOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSB7CisgICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuOworICA6OmNyZWF0ZSgpOworICBBZGRJZCgoeyJzZWVoYXNlIiwiaGFzZSJ9KSk7CisgIFNldFByb3AoUF9OQU1FLCJTZWVoYXNlIiApOworICBTZXRQcm9wKFBfR0VOREVSLE1BTEUpOworICBTZXRQcm9wKFBfU0hPUlQsIkVpbiBTZWVoYXNlIiApOworICBTZXRQcm9wKFBfTE9ORywiRWluIGtsb2JpZ2VyLCBkdW5rZWxncmF1YmxhdWVyIFNlZWhhc2UuXG4iKTsKKyAgU2V0UHJvcChQX1ZBTFVFLDMwKTsKKyAgU2V0UHJvcChQX1dFSUdIVCwgMjAwKTsKK30KZGlmZiAtLWdpdCBhL2l0ZW1zL2Zpc2hpbmcvYXF1YXJpdW0vc2VldGV1ZmVsLmMgYi9pdGVtcy9maXNoaW5nL2FxdWFyaXVtL3NlZXRldWZlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZWI4NjMKLS0tIC9kZXYvbnVsbAorKysgYi9pdGVtcy9maXNoaW5nL2FxdWFyaXVtL3NlZXRldWZlbC5jCkBAIC0wLDAgKzEsMTggQEAKKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxmaXNoaW5nLmg+CisKK2luaGVyaXQgU1REX0ZJU0NIOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSB7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgIDo6Y3JlYXRlKCk7CisgIEFkZElkKCh7InNlZXRldWZlbCIsInRldWZlbCJ9KSk7CisgIFNldFByb3AoUF9OQU1FLCJTZWV0ZXVmZWwiICk7CisgIFNldFByb3AoUF9TSE9SVCwiRWluIFNlZXRldWZlbCIgKTsKKyAgU2V0UHJvcChQX0xPTkcsCisgICJFaW4gZ3JpbW1pZ2VyIFNlZXRldWZlbCBtaXQgdmllbGVuIHNjaGFyZmVuIFphZWhuZW4uIEVyIGhhdCBlaW5lIGtsZWluZSxcbiIKKyAgKyJhdWZmYWVsbGlnZSBBbmdlbCBvYmVuIGFuIHNlaW5lbSBLb3BmLCBtaXQgZGVyIGVyIG5hY2ggQmV1dGUga29lZGVydC5cbiIpOworICBTZXRQcm9wKFBfVkFMVUUsMjAwKTsKKyAgU2V0UHJvcChQX1dFSUdIVCwgODAwKTsKK30KZGlmZiAtLWdpdCBhL2l0ZW1zL2Zpc2hpbmcvYXF1YXJpdW0vc2Vld29sZi5jIGIvaXRlbXMvZmlzaGluZy9hcXVhcml1bS9zZWV3b2xmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM0YTA3YwotLS0gL2Rldi9udWxsCisrKyBiL2l0ZW1zL2Zpc2hpbmcvYXF1YXJpdW0vc2Vld29sZi5jCkBAIC0wLDAgKzEsMTggQEAKKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxmaXNoaW5nLmg+CisKK2luaGVyaXQgU1REX0ZJU0NIOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSB7CisgICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuOworICA6OmNyZWF0ZSgpOworICBBZGRJZCgoeyJzZWV3b2xmIiwid29sZiJ9KSk7CisgIFNldFByb3AoUF9OQU1FLCJTZWV3b2xmIiApOworICBTZXRQcm9wKFBfU0hPUlQsIkVpbiBTZWV3b2xmIiApOworICBTZXRQcm9wKFBfTE9ORywKKyAgIkVpbiBoYWVzc2xpY2hlciBTZWV3b2xmIG1pdCBzY2hhcmZlbiwgZ2Vib2dlbmVuIFphZWhuZW4uIEVyIHNpZWh0XG4iCisgICsicmljaHRpZyBib2VzYXJ0aWcgYXVzLlxuIik7CisgIFNldFByb3AoUF9WQUxVRSwxMDApOworICBTZXRQcm9wKFBfV0VJR0hULCA2MDApOworfQpkaWZmIC0tZ2l0IGEvaXRlbXMvZmlzaGluZy9hcXVhcml1bS9zc2FpYi5jIGIvaXRlbXMvZmlzaGluZy9hcXVhcml1bS9zc2FpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNDEwYWQKLS0tIC9kZXYvbnVsbAorKysgYi9pdGVtcy9maXNoaW5nL2FxdWFyaXVtL3NzYWliLmMKQEAgLTAsMCArMSwxNiBAQAorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGZpc2hpbmcuaD4KKworaW5oZXJpdCBTVERfRklTQ0g7CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpIHsKKyAgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgIDo6Y3JlYXRlKCk7CisgIEFkZElkKCh7InNlZXNhaWJsaW5nIiwic2FpYmxpbmcifSkpOworICBTZXRQcm9wKFBfTkFNRSwiU2Vlc2FpYmxpbmciICk7CisgIFNldFByb3AoUF9TSE9SVCwiRWluIFNlZXNhaWJsaW5nIiApOworICBTZXRQcm9wKFBfTE9ORywiRWluIGJsYXVncmF1ZXIgU2Vlc2FpYmxpbmcgbWl0IGVpbmVtIHJvdGVuIEJhdWNoLlxuIik7CisgIFNldFByb3AoUF9WQUxVRSw4MCk7CisgIFNldFByb3AoUF9XRUlHSFQsIDQwMCk7Cit9CmRpZmYgLS1naXQgYS9pdGVtcy9maXNoaW5nL2FxdWFyaXVtL3N0aWNobGluZy5jIGIvaXRlbXMvZmlzaGluZy9hcXVhcml1bS9zdGljaGxpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzAxZTBjCi0tLSAvZGV2L251bGwKKysrIGIvaXRlbXMvZmlzaGluZy9hcXVhcml1bS9zdGljaGxpbmcuYwpAQCAtMCwwICsxLDE2IEBACisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8ZmlzaGluZy5oPgorCitpbmhlcml0IFNURF9GSVNDSDsKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkgeworICAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgOjpjcmVhdGUoKTsKKyAgQWRkSWQoKHsic3RpY2hsaW5nIn0pKTsKKyAgU2V0UHJvcChQX05BTUUsIlN0aWNobGluZyIgKTsKKyAgU2V0UHJvcChQX1NIT1JULCJFaW4gU3RpY2hsaW5nIiApOworICBTZXRQcm9wKFBfTE9ORywiRWluIHN1ZXNzZXIga2xlaW5lciBTdGljaGxpbmcuXG4iKTsKKyAgU2V0UHJvcChQX1ZBTFVFLDYpOworICBTZXRQcm9wKFBfV0VJR0hULCAzMCk7Cit9CmRpZmYgLS1naXQgYS9pdGVtcy9maXNoaW5nL2FxdWFyaXVtL3N6dW5nZS5jIGIvaXRlbXMvZmlzaGluZy9hcXVhcml1bS9zenVuZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTM1NTcyCi0tLSAvZGV2L251bGwKKysrIGIvaXRlbXMvZmlzaGluZy9hcXVhcml1bS9zenVuZ2UuYwpAQCAtMCwwICsxLDE3IEBACisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8ZmlzaGluZy5oPgorCitpbmhlcml0IFNURF9GSVNDSDsKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkgeworICAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgOjpjcmVhdGUoKTsKKyAgQWRkSWQoKHsic2VlenVuZ2UifSkpOworICBTZXRQcm9wKFBfTkFNRSwiU2VlenVuZ2UiICk7CisgIFNldFByb3AoUF9HRU5ERVIsRkVNQUxFKTsKKyAgU2V0UHJvcChQX1NIT1JULCJFaW5lIFNlZXp1bmdlIiApOworICBTZXRQcm9wKFBfTE9ORywiRWluZSBrbGVpbmUgYnJhdW5lIFNlZXp1bmdlLlxuIik7CisgIFNldFByb3AoUF9WQUxVRSw2MCk7CisgIFNldFByb3AoUF9XRUlHSFQsIDMwMCk7Cit9CmRpZmYgLS1naXQgYS9pdGVtcy9maXNoaW5nL2FxdWFyaXVtL3RodW4uYyBiL2l0ZW1zL2Zpc2hpbmcvYXF1YXJpdW0vdGh1bi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMmM5MjgKLS0tIC9kZXYvbnVsbAorKysgYi9pdGVtcy9maXNoaW5nL2FxdWFyaXVtL3RodW4uYwpAQCAtMCwwICsxLDE3IEBACisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8ZmlzaGluZy5oPgorCitpbmhlcml0IFNURF9GSVNDSDsKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkgeworICAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgOjpjcmVhdGUoKTsKKyAgQWRkSWQoKHsidGh1bmZpc2NoIn0pKTsKKyAgU2V0UHJvcChQX05BTUUsIlRodW5maXNjaCIgKTsKKyAgU2V0UHJvcChQX0dFTkRFUixNQUxFKTsKKyAgU2V0UHJvcChQX1NIT1JULCJFaW4gVGh1bmZpc2NoIiApOworICBTZXRQcm9wKFBfTE9ORywiRWluIGdyb3NzZXIgVGh1bmZpc2NoLlxuIik7CisgIFNldFByb3AoUF9WQUxVRSw3NSk7CisgIFNldFByb3AoUF9XRUlHSFQsIDUwMCk7Cit9CmRpZmYgLS1naXQgYS9pdGVtcy9maXNoaW5nL2Jvb3RzcnV0ZS5jIGIvaXRlbXMvZmlzaGluZy9ib290c3J1dGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTc1MjBlCi0tLSAvZGV2L251bGwKKysrIGIvaXRlbXMvZmlzaGluZy9ib290c3J1dGUuYwpAQCAtMCwwICsxLDIzIEBACisjcHJhZ21hIHN0cm9uZ190eXBlcywgc2F2ZV90eXBlcywgcnR0X2NoZWNrcworI3ByYWdtYSBub19pbmhlcml0LCBub19zaGFkb3cKKworI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGZpc2hpbmcuaD4KKworaW5oZXJpdCBTVERfQU5HRUw7CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpIHsKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIAorICAgIHJldHVybjsKKyAgOjpjcmVhdGUoKTsKKworICBTZXRQcm9wKFBfTkFNRSwgIkJvb3RzcnV0ZSIpOworICBTZXRQcm9wKFBfR0VOREVSLCBGRU1BTEUpOworICBTZXRQcm9wKFBfU0hPUlQsICJFaW5lIGt1cnplLCBzdGFya2UgQW5nZWwiKTsKKyAgU2V0UHJvcChQX0xPTkcsIkVpbmUgQW5nZWwgc3BlemllbGwgZnVlciBkaWUgSG9jaHNlZS1GaXNjaGVyZWkuXG4iCisgICAgIlNpZSBpc3Qgdm9uIEZhY2hsZXV0ZW4gYXVmIEhhaS1GZXN0aWdrZWl0IGdldGVzdGV0IVxuIik7CisgIFNldFByb3AoUF9UUkFOU1BBUkVOVCwxKTsKKyAgU2V0UHJvcChQX01BWF9XRUlHSFQsIDEwMDAwKTsgLy9IYWktZmVzdCEhISEhIQorICBTZXRQcm9wKFBfV0FURVIsV19TSE9SVCk7ICAgICAvL3NpZWhlIGZpc2hpbmcuaAorfQpkaWZmIC0tZ2l0IGEvaXRlbXMvZmlzaGluZy9maXNjaHdhYWdlLmMgYi9pdGVtcy9maXNoaW5nL2Zpc2Nod2FhZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGUyZGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvaXRlbXMvZmlzaGluZy9maXNjaHdhYWdlLmMKQEAgLTAsMCArMSwxNzkgQEAKKy8vIEFlbmRlcnVuZ3NoaXN0b3JpZToKKy8vIDI1LjA3LjIwMTUsIEFtYXJ5bGxpczogUXVlcnlGaXNoIGltcGxlbWVudGllcnQsIEFkZEZpc2hGb29kIGFuL3ZvbiBGcmFnZ2xlIGFkYXB0aWVydAorCitpbmhlcml0ICIvc3RkL2NvbnRhaW5lciI7CisKKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDxmaXNoaW5nLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPG1vbmV5Lmg+CisKKyNkZWZpbmUgVFAgdGhpc19wbGF5ZXIoKQorI2RlZmluZSBCUyh4KSBicmVha19zdHJpbmcoeCwgNzgpCisKK3ByaXZhdGUgaW50IGdvb2RfcHJpY2UsIGJhZF9wcmljZSwgRkFDLCBGT0MsIERJVjsKK3ByaXZhdGUgaW50IHdhYWdlbl9wcmVpc19mYWt0b3I9NDsgLy8gVW0gd2lldmllbCB0ZXVyZXIgYWxzIGluIExhZWRlbiB3aXJkIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVyIEZpc2NoIHZlcmthdWZ0IC8gSW0gRmlzY2ggd2lyZCBkdXJjaCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDQgZ2V0ZWlsdCwgZGFzIHdpcmQgaGllciB3aWVkZXIgYXVzZ2VnbGljaGVuLgorCitwcml2YXRlIGludCBnZXRfcHJpY2UoKTsKK3ByaXZhdGUgdm9pZCBSZW1vdmVGaXNoKCk7CisKKy8vIEFtYXJ5bGxpcywgMjUuMDcuMjAxNTogUXVlcnlGaXNoICJxdWljayBhbmQgZGlydHkiIHJlaW5nZWhhY2t0LCAKKy8vIGRhbWl0cyBmdW5rdGlvbmllcnQuIEthbm4gbWFuIHNpY2hlciBiZXNzZXIgbWFjaGVuLi4uCitwcml2YXRlIGludCBRdWVyeUZpc2gob2JqZWN0IG9iKTsgLy8gd2lyZCBoaWVyIGltIE9iamVrdCBpbiBQcmV2ZW50SW5zZXJ0IHZlcndlbmRldAorCitwcml2YXRlIGludCBRdWVyeUZpc2gob2JqZWN0IG9iKSB7CisgIHJldHVybiAob2JqZWN0cChvYikpJiYob2ItPmlkKEZJU0NIX0lEKSk7Cit9CisKK3ByaXZhdGUgaW50IFNldEZhY3RvcnMoaW50IGdvb2RfdmFsdWUsIGludCBiYWRfdmFsdWUpIHsKKyAgRkFDPWdvb2RfdmFsdWU7CisgIEZPQz1iYWRfdmFsdWU7CisgIERJVj0xMDA7CisgIGlmKCEoRkFDICYmIEZPQyAmJiBESVYpKQorICAgIFNldEZhY3RvcnMoMTAwLDUwKTsKKyAgcmV0dXJuIDE7Cit9CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpIHsKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgOjpjcmVhdGUoKTsKKyAgU2V0RmFjdG9ycygxMDAsNTApOyAvLzEwMCUgZnVlciBmcmlzY2hlLCA1MCUgZnVlciBhbHRlIEZpc2NoZQorICBTZXRQcm9wKFBfTkFNRSwgIkZpc2Nod2FhZ2UiKTsKKyAgQWRkSWQoKHsid2FhZ2UiLCJmaXNjaHdhYWdlIn0pKTsKKyAgU2V0UHJvcChQX0dFTkRFUiwgRkVNQUxFKTsKKyAgU2V0UHJvcChQX1NIT1JULCAiRWluZSBGaXNjaHdhYWdlIik7CisgIFNldFByb3AoUF9MT05HLAorICAgICJFaW5lIHNlaHIgZ2VuYXVlIEZpc2Nod2FhZ2UgbWl0IGVpbmVtIGdyb3NzZW4gWmVpZ2VyLiBEdSBrYW5uc3RcbiIKKyAgICAiRGVpbmUgQmV1dGUgZHJhdWZsZWdlbiwgZGVuIFplaWdlciBhYmxlc2VuIHVuZCwgc29mZXJuIER1IG1pdFxuIgorICAgICJkZW0gUHJlaXMgZWludmVyc3RhbmRlbiBiaXN0LCBkaWUgVmVya2F1ZnNnbG9ja2UgbGFldXRlbi5cbiIpOworICBTZXRQcm9wKFBfREVTVF9QUkVQT1NJVElPTiwgImF1ZiIpOworICBTZXRQcm9wKFBfU09VUkNFX1BSRVBPU0lUSU9OLCAidm9uIik7CisgIFNldFByb3AoUF9NQVRFUklBTCwgTUFUX01JU0NfTUVUQUwpOworICBTZXRQcm9wKFBfVFJBTlNQQVJFTlQsIDEpOworICBTZXRQcm9wKFBfTk9HRVQsIDEpOworICBTZXRQcm9wKFBfTUFYX1dFSUdIVCwgMTAwMDApOworICBTZXRQcm9wKFBfV0VJR0hULCA1MDAwKTsKKyAgCisgIEFkZERldGFpbCgoeyJ6ZWlnZXIifSksIEJTKAorICAgICJEZXIgWmVpZ2VyIGJlc3RlaHQgYXVzIE1ldGFsbC4gRHUga2FubnN0IGlobiBhYmxlc2VuLCB3ZW5uIER1ICIKKyAgICAiZ2VuYXUgd2lzc2VuIHdpbGxzdCwgd2FzIERlaW4gRmFuZyB3ZXJ0IGlzdC4iKSk7CisgIEFkZERldGFpbCgoeyJmYW5nIiwiYmV1dGUifSksIGZ1bmN0aW9uIHN0cmluZyAoc3RyaW5nIGtleSkgeworICAgIHJldHVybiBCUyhzaXplb2YoYWxsX2ludmVudG9yeSgpKT8iRHUgc2NoYXVzdCB6dWZyaWVkZW4gYXVmIGRpZSBCZXV0ZSwgIgorICAgICAgImRpZSBhdWYgZGVyIFdhYWdlIGxpZWd0LiBXZWxjaGVyIFByZWlzIHNpY2ggZGFmdWVyIHdvaGwgZXJ6aWVsZW4gIgorICAgICAgImxhZXNzdD8iOiJEdSBtdWVzc3Rlc3QgZXJzdCBlaW5tYWwgZXR3YXMgZHJhdWZsZWdlbi4iKTsKKyAgfSk7CisgIEFkZFJlYWREZXRhaWwoKHsiemVpZ2UiLCJ6ZWlnZXIgYWIifSksIGZ1bmN0aW9uIHN0cmluZyAoc3RyaW5nIGtleSkgeworICAgIGludCBjdXJyZW50X3dlaWdodCA9IHF1ZXJ5X3dlaWdodF9jb250ZW50cygpOworICAgIGdldF9wcmljZSgpOworICAgIHJldHVybgorICAgICAgIkR1IHNjaGF1c3QgYXVmIGRlbiBncm9zc2VuIFplaWdlciBkZXIgV2FhZ2UsIGRlciBlcnN0YXVubGljaGVyd2Vpc2VcbiIKKyAgICAgICJuaWNodCBudXIgZGFzIEdld2ljaHQsIHNvbmRlcm4gYXVjaCBkZW4gUHJlaXMgYW56ZWlndC5cbiIKKyAgICAgICJEZXIgWmVpZ2VyIHN0ZWh0IGF1ZiAiKworICAgICAgICAoY3VycmVudF93ZWlnaHQ/Y3VycmVudF93ZWlnaHQrIiBHcmFtbS5cbiI6Ik51bGwuXG4iKSsKKyAgICAgIChnb29kX3ByaWNlP2dvb2RfcHJpY2UrIiBHb2xkbXVlbnplbiBmdWVyIGZhbmdmcmlzY2hlbiBGaXNjaC5cbiI6IiIpKworICAgICAgKGJhZF9wcmljZT9iYWRfcHJpY2UrIiBHb2xkbXVlbnplbiBmdWVyIGV0d2FzIGFlbHRlcmVuIEZpc2NoLlxuIjoiIik7CisgIH0pOworICBBZGREZXRhaWwoKHsiZ2xvY2tlIn0pLCBCUygKKyAgICAiQW4gZGVyIFdhYWdlIGJlZmluZGV0IHNpY2ggZWluZSBrbGVpbmUgR2xvY2tlIGRpZSBEdSBsYWV1dGVuIGthbm5zdCwgIgorICAgICJ1bSBkZW4gSW5oYWx0IGRlciBXYWFnZSB6dSB2ZXJrYXVmZW4uIFVuZCB3YXJ0ZSBkYW1pdCBuaWNodCB6dSBsYW5nZSwgIgorICAgICJqZSBhZWx0ZXIgZGVyIEZpc2NoLCBkZXN0byBuaWVkcmlnZXIgZGVyIFByZWlzISIpKTsKKworICBBZGRDbWQoImxhZXV0ZSZnbG9ja2V8dmVya2F1ZnNnbG9ja2UiLCJjbWRfbGFldXRlIiwKKyAgICAiV2FzIHdpbGxzdCBEdSBkZW5uIGxhZXV0ZW4/Iik7Cit9CisKK3N0YXRpYyBpbnQgY21kX2xhZXV0ZShzdHJpbmcgc3RyLCBtaXhlZCAqcGFyYW0pIHsKKyAgdGVsbF9yb29tKE1FLCBUUC0+TmFtZSgpKyIgbGFldXRldCBlaW5lIGtsZWluZSBHbG9ja2UgYW4gZGVyIEZpc2Nod2FhZ2UuIiwKKyAgICAoe1RQfSkpOworICB0ZWxsX29iamVjdChUUCwgIkR1IGxhZXV0ZXN0IGRpZSBHbG9ja2UsIHVtIERlaW5lIFdhcmUgenUgdmVya2F1ZmVuLlxuIik7CisgIGZvcmVhY2gob2JqZWN0IG9iOiBhbGxfaW52ZW50b3J5KE1FKSkgeworICAgIGlmICggIW9iLT5pZChGSVNDSF9JRCkgKSB7CisgICAgICB0ZWxsX29iamVjdChUUCwgCisgICAgICAgICJBdWYgZGVyIFdhYWdlIGxpZWd0IG5pY2h0IG51ciBGaXNjaCFcbiIKKyAgICAgICAgIkR1IHNvbGx0ZXN0IG5pY2h0IHZlcnN1Y2hlbiwgaGllciB6dSBiZXRydWVnZW4hXG4iKTsKKyAgICAgIHRlbGxfcm9vbShNRSwgVFAtPk5hbWUoKSsiIG1hY2h0IHNpY2ggaGllciBnZXJhZGUgdW5iZWxpZWJ0LlxuIiwoe1RQfSkpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmICggb2ItPlF1ZXJ5UXVhbGl0eSgpPD0wICkgeworICAgICAgdGVsbF9vYmplY3QoVFAsICJBdWYgZGVyIFdhYWdlIGxpZWd0IGFsdGVyLCBnYW1tbGlnZXIgRmlzY2guXG4iCisgICAgICAgICAgICJEZW4ga2FubnN0IER1IG5pY2h0IHZlcmthdWZlbiFcbiIpOworICAgICAgdGVsbF9yb29tKE1FLCBUUC0+TmFtZSgpKyIgbWFjaHQgc2ljaCBoaWVyIGdlcmFkZSB1bmJlbGllYnQuXG4iLCh7VFB9KSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKyAgCisgIGludCBwcmljZT1nZXRfcHJpY2UoKTsKKyAgaWYoICFwcmljZSApIHsKKyAgICB0ZWxsX29iamVjdChUUCwgCisgICAgICAiRHUgc29sbHRlc3QgRGVpbmUgQmV1dGUgZXJzdG1hbCBhdWYgZGllIFdhYWdlIGxlZ2VuIVxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgdGVsbF9vYmplY3QoVFAsICJEdSBlcmhhZWx0c3QgIitwcmljZSsiIEdvbGRtdWVuemVuIGZ1ZXIgRGVpbmVuIEZpc2NoLlxuIik7CisgIHRlbGxfcm9vbShNRSwgVFAtPk5hbWUoKSsiIGVyaGFlbHQgaGF1ZmVud2Vpc2UgR2VsZCBmdWVyICIrCisgICAgVFAtPlF1ZXJ5UG9zc1Byb25vdW4oTUFMRSwgV0VOKSsiIEZpc2NoLlxuIiwoe1RQfSkpOworICAvL1paOiBBZGRNb25leSgpIGdpYnQgZGllIHdlcnRlIHZvbiBtb3ZlKCkgenVydWVjaywgZC5oLiAhPTAgZ2VodCBuaWNodC4KKyAgaWYgKHRoaXNfcGxheWVyKCktPkFkZE1vbmV5KHByaWNlKSAhPSBNT1ZFX09LKSB7IAorICAgIG9iamVjdCBtb25leT1jbG9uZV9vYmplY3QoR0VMRCk7CisgICAgdGVsbF9vYmplY3QoVFAsIEJTKAorICAgICAgIkR1IGthbm5zdCBkYXMgR2VsZCBuaWNodCBtZWhyIHRyYWdlbi4gRXMgZmFlbGx0IGtsaW1wZXJuZCB6dSAiCisgICAgICAiQm9kZW4uIikpOworICAgIG1vbmV5LT5TZXRQcm9wKFBfQU1PVU5ULCBwcmljZSk7CisgICAgbW9uZXktPm1vdmUoZW52aXJvbm1lbnQoTUUpLCBNX01PVkVfQUxMfE1fUFVUKTsKKyAgfQorICBSZW1vdmVGaXNoKCk7CisgIHJldHVybiAxOworfQorCitwcml2YXRlIGludCBnZXRfcHJpY2UoKSB7CisgIGludCBwcmVpcywgcHJlaXNfdm9uX2RpZXNlbTsKKyAgaW50IGdld2ljaHQ7CisKKyAgZ29vZF9wcmljZSAgICAgPSAwOworICBiYWRfcHJpY2UgICAgICA9IDA7CisKKyAgZm9yZWFjaChvYmplY3Qgb2IgOiBhbGxfaW52ZW50b3J5KE1FKSkgeworICAgIHByZWlzX3Zvbl9kaWVzZW0gPSBvYi0+UXVlcnlQcm9wKFBfVkFMVUUpOworICAgIGlmKG9iLT5RdWVyeVF1YWxpdHkoKT4yKQorICAgICAgZ29vZF9wcmljZSArPSBwcmVpc192b25fZGllc2VtKkZBQy9ESVY7CisgICAgZWxzZQorICAgICAgYmFkX3ByaWNlICs9cHJlaXNfdm9uX2RpZXNlbSAqRk9DL0RJVjsKKyAgfQorCisgIGdvb2RfcHJpY2UgKj0gd2FhZ2VuX3ByZWlzX2Zha3RvcjsKKyAgYmFkX3ByaWNlICAqPSB3YWFnZW5fcHJlaXNfZmFrdG9yOworICByZXR1cm4gKGdvb2RfcHJpY2UgKyBiYWRfcHJpY2UpOworfQorCitpbnQgUHJldmVudEluc2VydChvYmplY3Qgb2JqKSB7CisvLyAgaWYoIG9iamVjdHAob2JqKSAmJiBvYmotPlF1ZXJ5RmlzaCgpICkKKyAgaWYoIG9iamVjdHAob2JqKSAmJiBRdWVyeUZpc2gob2JqKSApCisgICAgcmV0dXJuIDo6UHJldmVudEluc2VydChvYmopOworICB3cml0ZSgiRGFzIGlzdCBlaW5lIEZpc2Nod2FhZ2UhIFVuZCBrZWluZSBXYWFnZSBmdWVyICIrb2JqLT5uYW1lKFdFTikrCisgICAgIi5cbiIpOworICByZXR1cm4gMTsKK30KKworI2RlZmluZSBFVE8gZW52aXJvbm1lbnQodGhpc19vYmplY3QoKSkKKworcHJpdmF0ZSB2b2lkIFJlbW92ZUZpc2goKSB7CisgIHN0cmluZyBwdWJuYW1lID0gRVRPLT5HZXRQdWIoKTsKKyAgb2JqZWN0IHB1YjsKKworICBpZiAoIHN0cmluZ3AocHVibmFtZSkgKQorICAgIHB1YiA9IGxvYWRfb2JqZWN0KHB1Ym5hbWUpOworICBlbHNlIAorICAgIHB1YiA9IEVUTzsKKworICBmb3JlYWNoKG9iamVjdCBvYiA6IGFsbF9pbnZlbnRvcnkoTUUpKSB7CisgICAgLy8gcHViLT5BZGRGaXNoRm9vZChvYik7CisgICAgLy8gQW1hcnlsbGlzLCAyNS4wNy4yMDE1OiBBbmdlcGFzc3Qgd2VnZW4gQWRkRmlzaEZvb2Qgdm9uIEZyYWdnbGUKKyAgICBwdWItPkFkZEZpc2hGb29kKG9iLT5uYW1lKFdFUiwwKSxvYi0+UXVlcnlQcm9wKFBfV0VJR0hUKSxvYi0+UXVlcnlRdWFsaXR5KCkpOworICAgIG9iLT5yZW1vdmUoKTsKKyAgfQorfQorCisjdW5kZWYgRVRPCmRpZmYgLS1naXQgYS9pdGVtcy9maXNoaW5nL2dyYWV0ZW4uYyBiL2l0ZW1zL2Zpc2hpbmcvZ3JhZXRlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NjBhMDQKLS0tIC9kZXYvbnVsbAorKysgYi9pdGVtcy9maXNoaW5nL2dyYWV0ZW4uYwpAQCAtMCwwICsxLDIyIEBACitpbmhlcml0ICIvc3RkL3RoaW5nIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkgeworICBpZiAoICFjbG9uZXAodGhpc19vYmplY3QoKSkgKSB7CisgICAgc2V0X25leHRfcmVzZXQoLTEpOworICAgIHJldHVybjsKKyAgfQorICA6OmNyZWF0ZSgpOworCisgIFNldFByb3AoUF9TSE9SVCwgIkVpbiBwYWFyIEdyYWV0ZW4iKTsKKyAgU2V0UHJvcChQX0xPTkcsICJFaW5pZ2UgR3JhZXRlbiwgZGllIHZvbiBlaW5lbSBGaXNjaCB1ZWJyaWdnZWJsaWViZW4gIgorICAgICJzaW5kLlxuIik7CisgIFNldFByb3AoUF9QTFVSQUwsIDEpLAorICBTZXRQcm9wKFBfTkFNRSwgIkdyYWV0ZW4iKTsKKyAgQWRkSWQoImdyYWV0ZW4iKTsKKyAgU2V0UHJvcChQX1dFSUdIVCwgMyk7CisgIFNldFByb3AoUF9WQUxVRSwgMSk7CisgIFNldFByb3AoUF9OT0JVWSwgMSk7CisgIFNldFByb3AoUF9HRU5ERVIsIEZFTUFMRSk7Cit9CmRpZmYgLS1naXQgYS9pdGVtcy9maXNoaW5nL2hha2VuLmMgYi9pdGVtcy9maXNoaW5nL2hha2VuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE1MmI2NwotLS0gL2Rldi9udWxsCisrKyBiL2l0ZW1zL2Zpc2hpbmcvaGFrZW4uYwpAQCAtMCwwICsxLDE3IEBACisjcHJhZ21hIHN0cm9uZ190eXBlcywgc2F2ZV90eXBlcywgcnR0X2NoZWNrcworI3ByYWdtYSBub19pbmhlcml0LCBub19zaGFkb3cKKworI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGZpc2hpbmcuaD4KKyNpbmNsdWRlIDxpdGVtcy9mbGFzY2hlLmg+CisKK2luaGVyaXQgU1REX0hBS0VOOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSB7CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9OQU1FLCAiSGFrZW4iKTsKKyAgU2V0UHJvcChQX1NIT1JULCAiRWluIEhha2VuIik7CisgIFNldFByb3AoUF9MT05HLCAiRWluIEFuZ2VsaGFrZW4gYXVzIE1ldGFsbC5cbiIpOworICBTZXRQcm9wKFBfTE9OR19FTVBUWSwgIkR1IGthbm5zdCBldHdhcyBkYW1pdCBhdWZzcGllc3NlbiFcbiIpOworfQpkaWZmIC0tZ2l0IGEvaXRlbXMvZmlzaGluZy9raGF1dC5jIGIvaXRlbXMvZmlzaGluZy9raGF1dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZGIwODIKLS0tIC9kZXYvbnVsbAorKysgYi9pdGVtcy9maXNoaW5nL2toYXV0LmMKQEAgLTAsMCArMSwxOCBAQAoraW5oZXJpdCAiL3N0ZC90aGluZyI7CisKKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkgeworICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuOworICA6OmNyZWF0ZSgpOworICBBZGRJZCgoeyJoYXV0Iiwia2F0emVuaGFpaGF1dCIsInNjaG1pcmdlbHBhcGllciIsIlxua2hhdXQifSkpOworICBTZXRQcm9wKFBfTkFNRSwgIkhhdXQiKTsKKyAgU2V0UHJvcChQX0dFTkRFUiwgRkVNQUxFKTsKKyAgU2V0UHJvcChQX1NIT1JULCAiRXR3YXMgSGF1dCBlaW5lcyBLYXR6ZW5oYWllcyIgKTsKKyAgU2V0UHJvcChQX0xPTkcsICJFaW4gU3R1ZWNrIGRlciByYXVlbiBIYXV0IGVpbmVzIEthdHplbmhhaWVzLlxuIik7CisgIFNldFByb3AoUF9NQVRFUklBTCxNQVRfU0tJTik7CisgIFNldFByb3AoUF9WQUxVRSwxMCk7CisgIFNldFByb3AoUF9OT0JVWSwxKTsKKyAgU2V0UHJvcChQX1dFSUdIVCwyICk7Cit9CmRpZmYgLS1naXQgYS9pdGVtcy9maXNoaW5nL21hZGUuYyBiL2l0ZW1zL2Zpc2hpbmcvbWFkZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZGQwYjMKLS0tIC9kZXYvbnVsbAorKysgYi9pdGVtcy9maXNoaW5nL21hZGUuYwpAQCAtMCwwICsxLDE5IEBACisjcHJhZ21hIHN0cm9uZ190eXBlcywgc2F2ZV90eXBlcywgcnR0X2NoZWNrcworI3ByYWdtYSBub19pbmhlcml0LCBub19zaGFkb3cKKworI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGZpc2hpbmcuaD4KKworaW5oZXJpdCBTVERfS09FREVSOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSB7CisgIDo6Y3JlYXRlKCk7CisgIEFkZElkKCh7V1VSTV9JRCwibWFkZSJ9KSk7CisgIFNldFByb3AoUF9OQU1FLCAiTWFkZSIpOworICBTZXRQcm9wKFBfR0VOREVSICwgRkVNQUxFKTsKKyAgU2V0UHJvcChQX1dBVEVSLCBXX1NXRUVUKTsKKyAgU2V0UHJvcChQX0ZJU0gsIDMwKTsKKyAgU2V0UHJvcChQX1NIT1JULCAiRWluZSBNYWRlIik7CisgIFNldFByb3AoUF9MT05HLCAiRWluZSBrbGVpbmUgZWtsaWdlIE1hZGUuXG4iKTsKK30KZGlmZiAtLWdpdCBhL2l0ZW1zL2Zpc2hpbmcvbWVobHd1cm0uYyBiL2l0ZW1zL2Zpc2hpbmcvbWVobHd1cm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWJkNzUxCi0tLSAvZGV2L251bGwKKysrIGIvaXRlbXMvZmlzaGluZy9tZWhsd3VybS5jCkBAIC0wLDAgKzEsMTggQEAKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLCBzYXZlX3R5cGVzLCBydHRfY2hlY2tzCisjcHJhZ21hIG5vX2luaGVyaXQsIG5vX3NoYWRvdworCisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8ZmlzaGluZy5oPgorCitpbmhlcml0IFNURF9LT0VERVI7CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpIHsKKyAgOjpjcmVhdGUoKTsKKyAgQWRkSWQoKHsid3VybSIsIm1laGx3dXJtIn0pKTsKKyAgU2V0UHJvcChQX05BTUUsICJNZWhsd3VybSIpOworICBTZXRQcm9wKFBfRklTSCwgMTApOworICBTZXRQcm9wKFBfV0FURVIsIFdfU1dFRVQpOworICBTZXRQcm9wKFBfU0hPUlQsICJFaW4gTWVobHd1cm0iKTsKKyAgU2V0UHJvcChQX0xPTkcsICJFaW4ga2xlaW5lciBNZWhsd3VybS5cbiIpOworfQpkaWZmIC0tZ2l0IGEvaXRlbXMvZmlzaGluZy9ydXRlLmMgYi9pdGVtcy9maXNoaW5nL3J1dGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTZjNTcxCi0tLSAvZGV2L251bGwKKysrIGIvaXRlbXMvZmlzaGluZy9ydXRlLmMKQEAgLTAsMCArMSwyNiBAQAorI3ByYWdtYSBzdHJvbmdfdHlwZXMsIHNhdmVfdHlwZXMsIHJ0dF9jaGVja3MKKyNwcmFnbWEgbm9faW5oZXJpdCwgbm9fc2hhZG93CisKKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxmaXNoaW5nLmg+CisKK2luaGVyaXQgU1REX0FOR0VMOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSB7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSAKKyAgICByZXR1cm47CisgIDo6Y3JlYXRlKCk7CisKKyAgU2V0UHJvcChQX05BTUUsICJBbmdlbCIpOworICBTZXRQcm9wKFBfR0VOREVSLCBGRU1BTEUpOworICBTZXRQcm9wKFBfU0hPUlQsICJFaW5lIEFuZ2VsIik7CisgIFNldFByb3AoUF9MT05HLCAiRWluZSBub3JtYWxlIEFuZ2VsLlxuIik7CisgIFNldFByb3AoUF9UUkFOU1BBUkVOVCwgMSk7CisgIC8vIDIwMTQtTWFpLTEwLCBBcmF0aG9ybi4gdm9uIDEwMDAgYXVmIDEwNTAgZXJob2VodCwgZGFtaXQgSGFrZW4rS29lZGVyCisgIC8vIGF1ZmdydW5kIGlocmVzIEdld2ljaHRzIHZvbiB3ZW5pZ2VuIEdyYW1tIG5pY2h0IG1laHIgdmVyaGluZGVybiwgZGFzcworICAvLyBlaW5lciBkZXIgc3RhbmRhcmRtYWVzc2lnIDEwMDAgZyBzY2h3ZXJlbiBGaXNjaGUgZ2VmYW5nZW4gd2VyZGVuIGthbm4uCisgIFNldFByb3AoUF9NQVhfV0VJR0hULCAxMDUwKTsKKyAgU2V0UHJvcChQX1dBVEVSLFdfU0hPUlQpOyAgICAvL3NpZWhlIGZpc2hpbmcuaAorfQorCmRpZmYgLS1naXQgYS9pdGVtcy9maXNoaW5nL3NlYXNuYWlsLmMgYi9pdGVtcy9maXNoaW5nL3NlYXNuYWlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI2ZGVkMAotLS0gL2Rldi9udWxsCisrKyBiL2l0ZW1zL2Zpc2hpbmcvc2Vhc25haWwuYwpAQCAtMCwwICsxLDQ4IEBACisjcHJhZ21hIHN0cm9uZ190eXBlcywgc2F2ZV90eXBlcywgcnR0X2NoZWNrcworI3ByYWdtYSBub19pbmhlcml0LCBub19zaGFkb3cKKworI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGZpc2hpbmcuaD4KKworaW5oZXJpdCBTVERfS09FREVSOworCitwcml2YXRlIGludCBzbmFpbHR5cGUgPSByYW5kb20oOCk7CisKK3ByaXZhdGUgPCA8c3RyaW5nfHN0cmluZyo+Kj4qIGRlc2MgPSAoeworLy9wcml2YXRlIG1peGVkIGRlc2MgPSAoeyAKKyAgICAoeworICAgICJFaW5lIHB1cnB1cm5lIFB1cnB1cnNjaG5lY2tlLlxuIiwKKyAgICAiRWluZSByb3NhLWdlc3RyZWlmdGUgS3JlaXNlbHNjaG5lY2tlLlxuIiwKKyAgICAiRWluZSBzdWVzc2Uga2xlaW5lIEthdXJpc2NobmVja2UuXG4iLAorICAgICJFaW5lIGtsZWluZSByb3RlIEJ1Y2tlbHNjaG5lY2tlLlxuIiwKKyAgICAiRWluZSBrbGVpbmUgZ2VzdHJpY2hlbHRlIFR1cmJhbnNjaG5lY2tlLlxuIiwKKyAgICAiRWluZSBrbGVpbmUgZ2VzdHJlaWZ0ZSBMb2NobmFwZnNjaG5lY2tlLlxuIiwKKyAgICAiRWluIGdydWVuZXMgU2Vlb2hyLlxuIiwKKyAgICAiRWluZSBzdWVzc2Uga2xlaW5lIFNlZXNjaG5lY2tlLlxuIiB9KSwKKyAgICAoeworICAgICJwdXJwdXJzY2huZWNrZSIsCisgICAgImtyZWlzZWxzY2huZWNrZSIsCisgICAgImthdXJpc2NobmVja2UiLAorICAgICJidWNrZWxzY2huZWNrZSIsCisgICAgInR1cmJhbnNjaG5lY2tlIiwKKyAgICAibmFwZnNjaG5lY2tlIiwKKyAgICAoeyJvaHIiLCJzZWVvaHIifSksCisgICAgInNlZXNjaG5lY2tlIn0pCisgIH0pOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSB7CisgIDo6Y3JlYXRlKCk7CisgIEFkZElkKCh7V1VSTV9JRCwgInNjaG5lY2tlIiwgIlxuZmFfc25haWxzIiwgInNlZXNjaG5lY2tlIn0pKTsKKyAgQWRkSWQoZGVzY1sxXVtzbmFpbHR5cGVdKTsKKyAgU2V0UHJvcChQX05BTUUsICJTY2huZWNrZSIpOworICBTZXRQcm9wKFBfR0VOREVSLCBGRU1BTEUpOworICBTZXRQcm9wKFBfQVJUSUNMRSwgMSk7CisgIFNldFByb3AoUF9TSE9SVCwgIkVpbiBTZWVzY2huZWNrZSIpOworICBTZXRQcm9wKFBfTE9ORywgZGVzY1swXVtzbmFpbHR5cGVdKTsKKyAgU2V0UHJvcChQX01BVEVSSUFMLCBNQVRfTUlTQ19MSVZJTkcpOworICBTZXRQcm9wKFBfRklTSCwgc25haWx0eXBlKnJhbmRvbSgxMCkpOworICBTZXRQcm9wKFBfV0FURVIsIFdfU0FMVCk7CisgIFNldFByb3AoUF9WQUxVRSwxKTsKKyAgU2V0UHJvcChQX1dFSUdIVCwgNSk7Cit9CmRpZmYgLS1naXQgYS9pdGVtcy9maXNoaW5nL3NoYWtlbi5jIGIvaXRlbXMvZmlzaGluZy9zaGFrZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmVjNjIxCi0tLSAvZGV2L251bGwKKysrIGIvaXRlbXMvZmlzaGluZy9zaGFrZW4uYwpAQCAtMCwwICsxLDYyIEBACisjcHJhZ21hIHN0cm9uZ190eXBlcywgc2F2ZV90eXBlcywgcnR0X2NoZWNrcworI3ByYWdtYSBub19zaGFkb3csIG5vX2luaGVyaXQKKworI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGZpc2hpbmcuaD4KKyNpbmNsdWRlIDxpdGVtcy9mbGFzY2hlLmg+CisKK2luaGVyaXQgU1REX0hBS0VOOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSB7CisgIDo6Y3JlYXRlKCk7CisgIEFkZElkKCh7InNwZXppYWxoYWtlbiJ9KSk7CisgIFNldFByb3AoUF9OQU1FLCAiSGFrZW4iKTsKKyAgU2V0UHJvcChQX0FSVElDTEUsIDEpOworICBTZXRQcm9wKFBfV0FURVIsIFdfVU5JVkVSU0FMKTsKKyAgU2V0UHJvcChQX0ZJU0gsIC0yMCtyYW5kb20oNjApKTsgLy8gLTIwIC4uLiArMzkKKyAgU2V0UHJvcChQX1NIT1JULCAiRWluIFNwZXppYWxoYWtlbiIpOworICBTZXRQcm9wKFBfTE9ORywgYnJlYWtfc3RyaW5nKAorICAgICJFaW4gQW5nZWxoYWtlbiBhdXMgTWV0YWxsLiBFcyBpc3QgZWluZSBTcGV6aWFsYW5mZXJ0aWd1bmcgYXVzIFNhbSAiCisgICAgIkhhcmt3aW5kcyBBbmdsZXJsYWRlbiwgZGllIGVpbmVuIGt1ZW5zdGxpY2hlbiBXdXJtIGVudGhhZWx0LlxuIiw3OCkpOworICBTZXRQcm9wKFBfSU5GTywgYnJlYWtfc3RyaW5nKAorICAgICJEZXIga3VlbnN0bGljaGUgS29lZGVyIHNvbGwgaW4gamVkZW0gR2V3YWVzc2VyIHJlY2h0IGd1dCAiCisgICAgImZ1bmt0aW9uaWVyZW4sIGhhdCBtYW4gRGlyIGltIExhZGVuIHZlcnNwcm9jaGVuLiIsNzgpKTsKKyAgCisgIEFkZERldGFpbCgoeyJrb2VkZXIiLCJ3dXJtIn0pLCBmdW5jdGlvbiBzdHJpbmcgKHN0cmluZyBrZXkpIHsKKyAgICBzdHJpbmcgZGVzYyA9ICJEZXIgS29lZGVyIGlzdCBoYW5kd2Vya2xpY2ggJXMgZ2VsdW5nZW4uIER1IGdsYXVic3QsICIKKyAgICAgICJkYXNzIGVyIGF1ZiBGaXNjaGUgJXMgd2lya2VuIGR1ZXJmdGUuIjsKKyAgICBzdHJpbmcgY3JhZnQsIGVmZmVjdDsKKyAgICBzd2l0Y2goUXVlcnlQcm9wKFBfRklTSCkpIHsKKyAgICAgIGNhc2UgLTIwLi4tNjoKKyAgICAgICAgY3JhZnQgPSAiemllbWxpY2ggbWllcyI7CisgICAgICAgIGVmZmVjdCA9ICJlaGVyIGFic3Rvc3NlbmQiOyAKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIC01Li45OgorICAgICAgICBjcmFmdCA9ICJiZXN0ZW5mYWxscyBkdXJjaHNjaG5pdHRsaWNoIjsKKyAgICAgICAgZWZmZWN0ID0gImdlbmF1c28gZHVyY2hzY2huaXR0bGljaCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMC4uMjQ6CisgICAgICAgIGNyYWZ0ID0gIndpcmtsaWNoIHNvbGlkZSI7CisgICAgICAgIGVmZmVjdCA9ICJyZWNodCBhcHBldGl0bGljaCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyNS4uMzk6CisgICAgICAgIGNyYWZ0ID0gInVlYmVycmFnZW5kIjsKKyAgICAgICAgZWZmZWN0ID0gInVud2lkZXJzdGVobGljaCI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDogCisgICAgICAgIGNyYWZ0ID0gInNvIGxhLWxhIjsKKyAgICAgICAgZWZmZWN0ID0gImtvbWlzY2giOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGJyZWFrX3N0cmluZyhzcHJpbnRmKGRlc2MsY3JhZnQsZWZmZWN0KSw3OCk7CisgIH0pOworCisgIFNldFByb3AoUF9MT05HX0VNUFRZLCAiIik7CisgIFNldFByb3AoUF9WQUxVRSwgMjApOworICBTZXRQcm9wKFBfV0VJR0hULCAxMCk7Cit9CisKK2ludCBRdWVyeUtvZWRlcigpIHsgCisgIHJldHVybiAxOyAKK30KZGlmZiAtLWdpdCBhL2l0ZW1zL2Zpc2hpbmcvc3RyYW5kcnV0ZS5jIGIvaXRlbXMvZmlzaGluZy9zdHJhbmRydXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdlODU5MwotLS0gL2Rldi9udWxsCisrKyBiL2l0ZW1zL2Zpc2hpbmcvc3RyYW5kcnV0ZS5jCkBAIC0wLDAgKzEsMjUgQEAKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLCBzYXZlX3R5cGVzLCBydHRfY2hlY2tzCisjcHJhZ21hIG5vX2luaGVyaXQsIG5vX3NoYWRvdworCisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8ZmlzaGluZy5oPgorCitpbmhlcml0IFNURF9BTkdFTDsKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkgeworICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkKKyAgICByZXR1cm47CisgIDo6Y3JlYXRlKCk7CisKKyAgU2V0UHJvcChQX05BTUUsICJTdHJhbmRydXRlIik7CisgIFNldFByb3AoUF9HRU5ERVIsIEZFTUFMRSk7CisgIFNldFByb3AoUF9TSE9SVCwgIkVpbmUgc2VociBsYW5nZSBBbmdlbCIpOworICBTZXRQcm9wKFBfTE9ORywgIkVpbmUgQW5nZWwgc3BlemllbGwgZnVlciBkaWUgU3RyYW5kLUZpc2NoZXJlaS5cbiIpOworICBTZXRQcm9wKFBfVFJBTlNQQVJFTlQsIDEpOworICAvLyAyMDE0LU1haS0xMCwgQXJhdGhvcm4uIHZvbiAxMDAwIGF1ZiAxMDUwIGVyaG9laHQsIGRhbWl0IEhha2VuK0tvZWRlcgorICAvLyBhdWZncnVuZCBpaHJlcyBHZXdpY2h0cyB2b24gd2VuaWdlbiBHcmFtbSBuaWNodCBtZWhyIHZlcmhpbmRlcm4sIGRhc3MKKyAgLy8gZWluZXIgZGVyIHN0YW5kYXJkbWFlc3NpZyAxMDAwIGcgc2Nod2VyZW4gRmlzY2hlIGdlZmFuZ2VuIHdlcmRlbiBrYW5uLgorICBTZXRQcm9wKFBfTUFYX1dFSUdIVCwgMTA1MCk7CisgIFNldFByb3AoUF9XQVRFUiwgV19MT05HKTsKK30KZGlmZiAtLWdpdCBhL2l0ZW1zL2Zpc2hpbmcvd3VybS5jIGIvaXRlbXMvZmlzaGluZy93dXJtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIxZWY2MgotLS0gL2Rldi9udWxsCisrKyBiL2l0ZW1zL2Zpc2hpbmcvd3VybS5jCkBAIC0wLDAgKzEsNiBAQAorI3ByYWdtYSBzdHJvbmdfdHlwZXMsIHNhdmVfdHlwZXMsIHJ0dF9jaGVja3MKKyNwcmFnbWEgbm9faW5oZXJpdCwgbm9fc2hhZG93CisKKyNpbmNsdWRlIDxmaXNoaW5nLmg+CisKK2luaGVyaXQgU1REX0tPRURFUjsKZGlmZiAtLWdpdCBhL2l0ZW1zL2ZsYXNjaGUuYyBiL2l0ZW1zL2ZsYXNjaGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjAyNmM5Ci0tLSAvZGV2L251bGwKKysrIGIvaXRlbXMvZmxhc2NoZS5jCkBAIC0wLDAgKzEsMyBAQAorI3ByYWdtYSBzdHJvbmdfdHlwZXMscnR0X2NoZWNrcworaW5oZXJpdCAiL3N0ZC9pdGVtcy9mbGFzY2hlIjsKKwpkaWZmIC0tZ2l0IGEvaXRlbXMvZnVyei5jIGIvaXRlbXMvZnVyei5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NmI1YTgKLS0tIC9kZXYvbnVsbAorKysgYi9pdGVtcy9mdXJ6LmMKQEAgLTAsMCArMSwxMDggQEAKKy8qCitMZXR6dGUgQWVuZGVydW5nOiAyOS4wMS4wMSB2b24gVGlsbHkgKFp1c2F0ei1BYmZyYWdlIGluIGhlYXJ0X2JlYXQoKSApCisgICAgICAgICAgICAgICAgICAyNS4wOC4wMSB2b24gVGlhbWFrIChUaWxseXMgQWJmcmFnZW4gZGVidWdndCA7XikKKyovCisjcHJhZ21hIHN0cm9uZ190eXBlcyxydHRfY2hlY2tzCisKK2luaGVyaXQgIi9zdGQvdGhpbmciOworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorCitpbnQgICAgYWx0ZXI7CitzdHJpbmcgZnVyemVyV0VSLGZ1cnplcldFU1NFTjsKKwordm9pZCBjcmVhdGUoKQoreworICBpZighY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9TSE9SVCwgMCk7CisgIFNldFByb3AoUF9MT05HLCAwKTsKKyAgU2V0UHJvcChQX0lOVklTLDEpOworICBTZXRQcm9wKFBfTkFNRSwgIkV0d2FzIik7CisgIFNldFByb3AoUF9HRU5ERVIsIDEpOworICBTZXRQcm9wKFBfQVJUSUNMRSwwKTsKKyAgU2V0UHJvcChQX05PR0VULCJIYWVoP1xuIik7CisgIEFkZElkKCJfZnVyel8iKTsKKyAgaWYgKHRoaXNfcGxheWVyKCkpCisgICAgQWRkSWQoIkZ1cnpfIitnZXR1aWQodGhpc19wbGF5ZXIoKSkpOworICBhbHRlciA9IDA7CisgIHNldF9oZWFydF9iZWF0KDEpOworfQorCit2b2lkIGhlYXJ0X2JlYXQoKQoreworICBpbnQgaTsKKyAgaWYoIWVudmlyb25tZW50KCkpCisgIHsKKyAgICBzZXRfaGVhcnRfYmVhdCgwKTsKKyAgICBkZXN0cnVjdCh0aGlzX29iamVjdCgpKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYobGl2aW5nKGVudmlyb25tZW50KCkpKQorICB7CisgICAgc2V0X2hlYXJ0X2JlYXQoMCk7CisgICAgZGVzdHJ1Y3QodGhpc19vYmplY3QoKSk7CisgICAgcmV0dXJuOworICB9CisgIGlmICghYWx0ZXIpCisgICAgdGVsbF9yb29tKGVudmlyb25tZW50KCksICJGdWVyY2h0ZXJsaWNoZXIgR2VzdGFuayBlcmZ1ZWxsdCBkZW4gUmF1bS5cbiIpOworICBhbHRlcisrOworICBpZiAoIXJhbmRvbSgxMCkpCisgIHsKKyAgICBpID0gcmFuZG9tICg1KTsKKyAgICBpZiAoaT09MCkKKyAgICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudCgpLCBmdXJ6ZXJXRVNTRU4rIiBGdXJ6IHN0aW5rdCB3aXJrbGljaCBncmF1ZW5lcnJlZ2VuZC5cbiIpOworICAgIGlmIChpPT0xKQorICAgICAgdGVsbF9yb29tKGVudmlyb25tZW50KCksICJEdSBoYWVsdHN0IERpciBkaWUgTmFzZSB6dS5cbiIpOworICAgIGlmIChpPT0yKQorICAgICAgdGVsbF9yb29tKGVudmlyb25tZW50KCksICJXaWRlcmxpY2hlIER1ZW5zdGUgZXJmdWVsbGVuIGRlbiBSYXVtLlxuIik7CisgICAgaWYgKGk9PTMpCisgICAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSwgIkRlciBGdXJ6IHJpZWNodCwgYWxzIHd1ZXJkZSAiICsgZnVyemVyV0VSICsiIGlubmVybGljaCB2ZXJmYXVsZW4uXG4iKTsKKyAgICBpZiAoaT09NCkKKyAgICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudCgpLCAiRHUgbXVzc3QgRGljaCBiZWluYWggdWViZXJnZWJlbiwgYWxzICIgKyBmdXJ6ZXJXRVNTRU4gKyAiIEZ1cnogaW4gRGVpbmUgTmFzZSBrcmllY2h0LlxuIik7IAorICB9CisgIGlmIChhbHRlcj09NDUpIHsKKyAgICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudCgpLCBmdXJ6ZXJXRVNTRU4gKyAiIHdpZGVybGljaGVyIEZ1cnogaGF0IHNpY2ggZW5kbGljaCB2ZXJ6b2dlbi5cbiIpOworICAgICAgZGVzdHJ1Y3QodGhpc19vYmplY3QoKSk7CisgICAgfQorfQorCisKK3ZvaWQgc2V0X2FsdGVyKGludCBhKQoreyBhbHRlcj1hOyB9CisKK3ZvaWQgc2V0X2Z1cnplciAob2JqZWN0IHdlcikKK3sKKyAgaWYgKG9iamVjdHAod2VyKSkKKyAgICB7CisgICAgICBmdXJ6ZXJXRVI9d2VyLT5uYW1lKFdFUik7CisgICAgICBmdXJ6ZXJXRVNTRU49d2VyLT5uYW1lKFdFU1NFTik7CisgICAgICBBZGRJZCgiRnVyel8iK2dldHVpZCh3ZXIpKTsKKyAgICB9Cit9CisKK3ZhcmFyZ3MgaW50IG1vdmUobWl4ZWQgZGVzdCwgaW50IG1ldGhvZHMsIHN0cmluZyBkaXJlY3Rpb24sIHN0cmluZyB0ZXh0b3V0LHN0cmluZyB0ZXh0aW4pCit7CisgIGludCBlcmc7CisgIG9iamVjdCBvdGhlcmZ1cno7CisKKyAgZXJnPTo6bW92ZShkZXN0LG1ldGhvZHMsZGlyZWN0aW9uLHRleHRvdXQsdGV4dGluKTsKKyAgCisgIC8vIFZhbmlvbiwgMjQuMDkuMDI6IEthbm4gc2VpbiwgZGFzcyBkYXMgbW92ZSBuaWNoIGtsYXBwdCwKKyAgLy8gICAgICAgICAgICAgICAgICAgZGFubiBzb2xsdGUgZGFzIE9iamVrdCB3ZWcuCisgIGlmIChlcmcgIT0gTU9WRV9PSyB8fCAhZW52aXJvbm1lbnQodGhpc19vYmplY3QoKSkpIAorICB7CisgICAgaWYgKCFyZW1vdmUoKSkgZGVzdHJ1Y3QodGhpc19vYmplY3QoKSk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKHRoaXNfcGxheWVyKCkpCisgICAgeworICAgICAgaWYgKG90aGVyZnVyej1wcmVzZW50KCJGdXJ6XyIrZ2V0dWlkKHRoaXNfcGxheWVyKCkpKyIgMiIsZW52aXJvbm1lbnQoKSkpCisJeworCSAgb3RoZXJmdXJ6LT5zZXRfYWx0ZXIoMCk7CisJICByZXR1cm4gcmVtb3ZlKCk7CisJfQorICAgIH0KKyAgcmV0dXJuIGVyZzsKK30KZGlmZiAtLWdpdCBhL2l0ZW1zL2tyYWV1dGVyL2Vpc3phaG4uYyBiL2l0ZW1zL2tyYWV1dGVyL2Vpc3phaG4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjAyM2RlCi0tLSAvZGV2L251bGwKKysrIGIvaXRlbXMva3JhZXV0ZXIvZWlzemFobi5jCkBAIC0wLDAgKzEsMzYgQEAKKy8vIChjKSAyMDAxIGJ5IFBhZHJlaWMgKFBhZHJlaWNAbWcubXVkLmRlKQorCisjcHJhZ21hIHN0cm9uZ190eXBlcyxydHRfY2hlY2tzCisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8aXRlbXMva3JhZXV0ZXIva3JhZXV0ZXIuaD4KKyNpbmNsdWRlIDxpdGVtcy9rcmFldXRlci9rcmFldXRlcmxpc3RlLmg+CisKK2luaGVyaXQgU1REUExBTlQ7Cit2b2lkIGNyZWF0ZSgpCit7IAorICA6OmNyZWF0ZSgpOworICBjdXN0b21pemVNZShFSVNaQUhOKTsKKyAgU2V0UHJvcChQX05BTUUsICAgICAiRWlzemFobiIpOworICBTZXRQcm9wKFBfTkFNRV9BREosICJrYWx0Iik7CisgIFNldFByb3AoUF9HRU5ERVIsICAgTUFMRSk7CisgIFNldFByb3AoUF9MT05HLAorICAgICJEZXIgRWlzemFobiBpc3QgZWluIGF1c2dlc3Byb2NoZW4gbWVya3d1ZXJkaWdlcyBLcmF1dC5cbiIKKyAgICsiVHlwaXNjaCBzaW5kIGRpZSB3aWUga2xlaW5lIFphZWhuZSBhbmdlb3JkbmV0ZW4gQmxhZXR0ZXIsIGRpZVxuIgorICAgKyJhbSBIYXVwdHN0ZW5nZWwgZW50bGFuZyB3YWNoc2VuIHVuZCBzaWNoIHN0ZXRzIHp1bSBIaW1tZWwgcmVja2VuLlxuIgorICAgKyJBdXNzZXJkZW0gc3RyYWhsdCBkYXMgS3JhdXQgc3B1ZXJiYXIgS2FlbHRlIGF1cy5cbiIpOworICBTZXRQcm9wKFBMQU5UX1JPT01ERVRBSUwsCisgICAgICJEZXIgRWlzemFobiBmdWVobHQgc2ljaCBhdWYgZGVtIEVpc2JvZGVuIHNpY2h0bGljaCB3b2hsLlxuIik7CisgIFNldFByb3AoUF9TSE9SVCwgICAgIkVpbiBFaXN6YWhuIik7CisgIEFkZElkKCh7ICJ6YWhuIiwgImVpc3phaG4iIH0pKTsKKyAgQWRkRGV0YWlsKCJrcmF1dCIsCisgICAgICJEZXIgRWlzemFobiBpc3QgZGEgc2VociBlaWdlbjogRXIgaXN0IGtlaW4gUGlseiwgZXIgaXN0IGVpbiBLcmF1dC5cbiIpOworICBBZGREZXRhaWwoImthZWx0ZSIsICJIdWFoLCBnYW56IHNjaG9lbiBrYWx0LlxuIik7CisgIEFkZERldGFpbCgiYmxhZXR0ZXIiLAorICAgICJEaWUgQmxhZXR0ZXIgc2VoZW4gYXVzIHdpZSBrbGVpbmUgWmFlaG5lLiBTaWUgc2luZCBnYW56IHdlaXNzIHVuZFxuIgorICAgKyJvcmRlbnRsaWNoIGF1ZmdlcmVpaHQuXG4iKTsKKyAgQWRkRGV0YWlsKCJoYXVwdHN0ZW5nZWwiLAorICAgICAiRWlnZW50bGljaCBoYXQgZGFzIEtyYXV0IG51ciBlaW5lbiBTdGFlbmdlbCwgZGVyIGxlaWNodCB6dXIgU2VpdGUgaGFlbmd0XG4iCisgICAgKyJ3ZWlsIGRpZSAnWmFlaG5lJyBhdXNyZWljaGVuZCBHZXdpY2h0IGhhYmVuLlxuIik7CisgIEFkZERldGFpbCgiemFlaG5lIiwgIlNvIG5lbm50IG1hbiBkaWUgQmxhZXR0ZXIgZGVzIEVpc3phaG5zLlxuIik7Cit9CmRpZmYgLS1naXQgYS9pdGVtcy9rcmFldXRlci9nbG9ja2VuYmx1bWUuYyBiL2l0ZW1zL2tyYWV1dGVyL2dsb2NrZW5ibHVtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2M2FkNjMKLS0tIC9kZXYvbnVsbAorKysgYi9pdGVtcy9rcmFldXRlci9nbG9ja2VuYmx1bWUuYwpAQCAtMCwwICsxLDQ5IEBACisvLyAoYykgMjAwMSBieSBQYWRyZWljIChQYWRyZWljQG1nLm11ZC5kZSkKKy8vIGJlc2NocmVpYnVuZyBtYWdkYWxlbmFAbW9yZ2VuZ3JhdWVuLmRlIC0gOC4xMi4yMDAzCisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHJ0dF9jaGVja3MKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxpdGVtcy9rcmFldXRlci9rcmFldXRlci5oPgorI2luY2x1ZGUgPGl0ZW1zL2tyYWV1dGVyL2tyYWV1dGVybGlzdGUuaD4KKworaW5oZXJpdCBTVERQTEFOVDsKKworI2RlZmluZSBCUyh4KSBicmVha19zdHJpbmcoeCwgNzgpCisKKwordm9pZCBjcmVhdGUoKQoreworICA6OmNyZWF0ZSgpOworICBjdXN0b21pemVNZShHTE9DS0VOQkxVTUUpOworICBTZXRQcm9wKFBfTkFNRSwgICAgICJHbG9ja2VuYmx1bWUiKTsKKyAgU2V0UHJvcChQX05BTUVfQURKLCAic2Nob2VuIik7CisgIFNldFByb3AoUF9HRU5ERVIsICAgRkVNQUxFKTsKKyAgU2V0UHJvcChQX0xPTkcsIEJTKAorICAgICJEaWUgQmx1ZXRlbnN0ZXJuZSBpbiBibGF1LXZpb2xldHQgc2luZCBlaW4gdG9sbGVyIEJsaWNrZmFuZywgd2llICIKKyAgICsic2llIGFtIGxhbmdlbiBTdGllbCBpbSBXaW5kIGhpbi0gdW5kIGhlcm5pY2tlbi4gRGllICIKKyAgICsiZ2xvY2tlbmZvZXJtaWdlIEJsdW1lbmtyb25lIG1pdCBpaHJlbiBmdWVuZiBicmVpdGVuLCBuaWNodCBiaXMgenVyICIKKyAgICsiTWl0dGUgcmVpY2hlbmRlbiBaaXBmZWxuIGVyZnJldXQgRGljaCBtaXQgaWhyZXIgU2Nob2VuaGVpdC4iKSk7CisgIFNldFByb3AoUExBTlRfUk9PTURFVEFJTCwgCisgICAgIkVpbmUgYW5tdXRpZ2UsIHNjaG9lbmUgR2xvY2tlbmJsdW1lIG5pY2t0IGRpciBhdWZmb3JkZXJuZCB6dS4gT2IgbWFuIHNpZSAiCisgICArInBmbHVlY2tlbiBrYW5uP1xuIik7CisgIFNldFByb3AoUF9TSE9SVCwgICAgIkVpbmUgR2xvY2tlbmJsdW1lIik7CisgIEFkZElkKCh7ICJibHVtZSIsICJnbG9ja2VuYmx1bWUiIH0pKTsKKyAgCisgIEFkZERldGFpbCgoeyJibGlja2ZhbmciLCJzY2hvZW5oZWl0In0pLEJTKAorICAgICAiRGllc2UgR2xvY2tlbmJsdW1lIGJlc3RpY2h0IGR1cmNoIGlocmUgU2Nob2VuaGVpdC4gSWhyZSBGYXJiZW4gc2luZCAiIAorICAgICsic2luZCBlaW4gd2FocmVyIEJsaWNrZmFuZy5cbiIpKTsKKyAgQWRkRGV0YWlsKCh7ImZhcmJlbiIsImJsdWV0ZW4ifSksQlMoCisgICAgICJEaWUgQmx1ZXRlbiBkZXIgR2xvY2tlbmJsdW1lIHNpbmQgYmxhdS12aW9sZXR0LlxuIikpOworICBBZGREZXRhaWwoImJsdW1lbmtyb25lIixCUygKKyAgICAgIkRpZSBCbHVtZSBpc3QgZ2xvY2tlbmZvZXJtaWcuIERhaGVyIGhhdCBkaWUgUGZsYW56ZSBpaHJlbiBOYW1lbi5cbiIpKTsKKyAgQWRkRGV0YWlsKCJwZmxhbnplIixCUygKKyAgICAgIkRpZXNlIFBmbGFuemUgaXN0IGVpbmRldXRpZyBlaW5lIEdsb2NrZW5ibHVtZS5cbiIpKTsKKyAgQWRkRGV0YWlsKCh7ImJsdWV0ZW5zdGVybmUiLCJzdGVybmUiLCJ6aXBmZWwiLCJ6aXBmZWxuIn0pLEJTKAorICAgICAiQmVtZXJrZW5zd2VydCBhbiBkZXIgUGZsYW56ZSBzaW5kIGRpZSBCbHVldGVuc3Rlcm5lLiBEaWUgYmxhdS12aW9sZXR0ZW4gIgorICAgICsiWmlwZmVsIGJpbGRlbiBkaWUgQmx1ZXRlIGRlciBQZmxhbnplLCB3YXMgc2VociBhdWZmYWVsbGlnIGlzdC4gRGllc2UgIgorICAgICsiQmx1ZXRlbnN0ZXJuZSBnYWJlbiBkZXIgQmx1bWUgaWhyZW4gTmFtZW4uXG4iKSk7CisKK30KKworCmRpZmYgLS1naXQgYS9pdGVtcy9rcmFldXRlci9rZXNzZWwuYyBiL2l0ZW1zL2tyYWV1dGVyL2tlc3NlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwOWVlYWQKLS0tIC9kZXYvbnVsbAorKysgYi9pdGVtcy9rcmFldXRlci9rZXNzZWwuYwpAQCAtMCwwICsxLDMzNSBAQAorLy8gKGMpIDIwMDMgYnkgVGhvbWFzIFdpbmhlbGxlciAocGFkcmVpY0BtZy5tdWQuZGUpCisvLyBCZWkgZGllc2VtIEZpbGUgaGFuZGVsdCBlcyBzaWNoIHVtIGVpbmVuIHVuaXZlcnNlbGxlbgorLy8gS2Vzc2VsIHp1bSBCcmF1ZW4gdm9uIFRyYWVua2VuLiBEYW1pdCBlciBzaWNoIGluIGRlbgorLy8gUmF1bSBlbnRzcHJlY2hlbmQgZWlucGFzc2VuIGthbm4sIGlzdCBlciBpbnZpcy4KKworLy8gRWluIFJhdW0sIGluIGRlbSBUcmFlbmtlIHVuZCBHaWZ0IGdlYnJhdXQgd2VyZGVuIGtvZW5uZW4KKy8vIHNvbGwsIGJyYXVjaHQgbmljaHRzIHdlaXRlciBtYWNoZW4gYWxzOgorLy8gLSAgZWluZSBNb2VnbGljaGtlaXQgenUgaW1wbGVtZW50aWVyZW4gV2Fzc2VyIGluIGRlbiBLZXNzZWwKKy8vICAgIHp1IGZ1ZWxsZW4uIEhpZXJ6dSBtdXNzIGRhbm4gbWl0dGVscyBBZGRXYXRlcigzMDAwKQorLy8gICAgaW5zZ2VzYW10IDNsIFdhc3NlciBlaW5nZWZ1ZWxsdCB3ZXJkZW4uIEFkZFdhdGVyIGdpYnQgZGllCisvLyAgICBNZW5nZSBkZXMgdGF0c2FlY2hsaWNoIG5vY2ggZWluZ2VmdWVsbHRuIFdhc3NlcnMgenVydWVjay4KKy8vIEFubWVya3VuZzogYmlzaGVyIGVudGhhZWx0IC9vYmovZmxhc2NoZSBub2NoIGtlaW5lIE1vZWdsaWNoa2VpdAorLy8gICAgICAgICAgICBGbHVlc3NpZ2tlaXRlbiB2b24gZWluZW0gRmx1ZXNzaWdrZWl0ZW5jb250YWluZXIgaW4KKy8vICAgICAgICAgICAgZWluZW4gYW5kZXJlbiB6dSBzY2h1ZXR0ZW4sIGFiZXIgdmllbGxlaWNodCBhZW5kZXJ0CisvLyAgICAgICAgICAgIGRhcyBqYSBpcmdlbmR3YW5uIG1hbCB3ZXIgLSBkZXIgS2Vzc2VsIGthbm4gZGFubgorLy8gICAgICAgICAgICBkdXJjaCBhbGxlIGRpZXNlIEZsYXNjaGVuIGJlZnVlbGx0IHdlcmRlbiEKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHJ0dF9jaGVja3MKKworaW5oZXJpdCAiL3N0ZC9jb250YWluZXIiOworCisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDxmaXNoaW5nLmg+CisjaW5jbHVkZSA8aXRlbXMva3JhZXV0ZXIva3JhZXV0ZXIuaD4KKyNpbmNsdWRlIDxpdGVtcy9mbGFzY2hlLmg+CisKKyNpZm5kZWYgQlMKKyMgIGRlZmluZSBCUyh4KSAgICAgICAgICAgICBicmVha19zdHJpbmcoeCwgNzgpCisjZW5kaWYKKworcHJpdmF0ZSBpbnQgd2Fzc2VybWVuZ2U7CisKKy8vIEFrdHVlbGxlciBOdXR6ZXIgZGVzIEtlc3NlbHMgaW4gRm9ybSBkZXIgU3BpZWxlci1VSUQgCitwcml2YXRlIHN0cmluZyBjdXJyZW50X3VzZXI7CisKKy8vIFplaXRwdW5rdCwgd2FubiBkaWUgU3BlcnJlIGVuZGV0LiAKK3ByaXZhdGUgaW50IHRpbWVvdXQ7CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9TSE9SVCwgIkVpbiBzY2h3ZXJlciBLZXNzZWwiKTsKKyAgLy8gXG4gd2VyZGVuIGluIGxvbmcoKSBlaW5nZWZ1ZWd0CisgIFNldFByb3AoUF9MT05HLAorICAgICJFaW4ga2xlaW5lciwgYWJlciBzZWhyIHNjaHdlcmVyIEtlc3NlbCwgaW4gZGVtIGRpZSB2ZXJzY2hpZWRlbnN0ZW4gIgorICAgICJUcmFlbmtlIGdlYnJhdXQgd2VyZGVuIGtvZW5uZW4uIik7IAorICBTZXRQcm9wKFBfTkFNRSwgIktlc3NlbCIpOworICBTZXRQcm9wKFBfTkFNRV9BREosICJrbGVpbiIpOworICBTZXRQcm9wKFBfTUFURVJJQUwsIE1BVF9CUk9OQ0UpOworICBTZXRQcm9wKFBfTk9HRVQsICJEZXIgS2Vzc2VsIGlzdCB6dSBzY2h3ZXIsIHVtIGlobiBlaW5mYWNoIG1pdG5laG1lbiAiCisgICAgICJ6dSBrb2VubmVuLlxuIik7CisgIFNldFByb3AoUF9NQVhfV0VJR0hULCAxMDAwMDApOyAvLyBlaW4gX3dpcmtsaWNoXyBncm9zc2VyIEtlc3NlbCA7bykKKyAgU2V0UHJvcChQX1dFSUdIVCwgNTAwMDApOworICBTZXRQcm9wKFBfVkFMVUUsIDI1MDAwKTsKKyAgU2V0UHJvcChQX01BWF9PQkpFQ1RTLCA5KTsgLy8gbWF4LiA4IEtyYWV1dGVyICsgV2Fzc2VyCisgIFNldFByb3AoUF9HRU5ERVIsIE1BTEUpOworICBTZXRQcm9wKFBfTElRVUlELCAzMDAwKTsgLy8gaW4gZGVuIEtlc3NlbCBwYXNzZW4gM2wgOm8pCisgIEFkZElkKCh7Imtlc3NlbCIsIEtFU1NFTElEfSkpOworICBBZGRBZGplY3RpdmUoKHsia2xlaW4iLCAia2xlaW5lciJ9KSk7CisgIEFkZENtZCgibGVlcnxsZWVyZSZASUQmYXVzIiwgImNtZF9sZWVyZW4iLAorICAgICJXYXMgbW9lY2h0ZXN0IER1IGxlZXJlbj98TW9lY2h0ZXN0IER1IGRlbiBLZXNzZWwgZXR3YSBhdXNsZWVyZW4/Iik7CisgIEFkZENtZCgoeyJicmF1IiwgImJyYXVlIiwgImtvY2giLCAia29jaGUifSksICJjbWRfYnJhdWVuIik7CisgIEFkZENtZCgiZnVlbGx8ZnVlbGxlJnRyYW5rfGhlaWx0cmFua3xlcmdlYm5pc3xrZXNzZWxpbmhhbHR8aW5oYWx0JmluJiIKKyAgICAiQFBSRVNFTlQiLCAiY21kX2Z1ZWxsZW4iLAorICAgICJXYXMgd2lsbHN0IER1IGZ1ZWxsZW4/fFdpbGxzdCBEdSBldHdhcyBpbiBldHdhcyBmdWVsbGVuP3wiCisgICAgIldvcmVpbiB3aWxsc3QgRHUgZGVuIEtlc3NlbGluaGFsdCBmdWVsbGVuPyIpOworICBBZGRDbWQoKHsidGF1Y2giLCAidGF1Y2hlIn0pLCAiY21kX3RhdWNoZW4iKTsKK30KKworI2RlZmluZSBUUkFOS0ZFUlRJRyAiX2xpYl9wX2tyYXV0dHJhbmtmZXJ0aWciCisKK3ByaXZhdGUgaW50IGNoZWNrX2J1c3koaW50IHVzZXJvbmx5KQoreworICBpZiAodXNlcm9ubHkpCisgICAgcmV0dXJuIGN1cnJlbnRfdXNlciAmJiBjdXJyZW50X3VzZXIgIT0gZ2V0dWlkKFBMKTsKKyAgLy8gVGltZW91dCBkYXJmIG5vY2ggbmljaHQgYWJnZWxhdWZlbiBzZWluLiBXaXJkIGJlaW0gRW50bGVlcmVuIGdlcHJ1ZWZ0LgorICByZXR1cm4gY3VycmVudF91c2VyICYmIHRpbWVvdXQgPiB0aW1lKCkgJiYgY3VycmVudF91c2VyICE9IGdldHVpZChQTCk7Cit9CisKK3ByaXZhdGUgdm9pZCBjbGVhcl9rZXNzZWwoKQoreworICBhbGxfaW52ZW50b3J5KCktPnJlbW92ZSgxKTsKKyAgLy8gZ2VzcGVpY2hlcnRlIERhdGVuIG51bGxlbgorICB3YXNzZXJtZW5nZSA9IGN1cnJlbnRfdXNlciA9IHRpbWVvdXQgPSAwOworICBTZXRQcm9wKFBfV0FURVIsIDApOworICBTZXRQcm9wKFRSQU5LRkVSVElHLCAwKTsKK30KKworaW50IEFkZFdhdGVyKGludCBtZW5nZSkKK3sKKyAgLy8gV2VubiBlaW4gVXNlciBlaW5nZXRyYWdlbiBpc3QsIGRpZXNlciBuaWNodCBQTCBpc3QgdW5kIGRpZSBTcGVycmUKKyAgLy8gYXVjaCBub2NoIG5pY2h0IGFiZ2VsYXVmZW4gaXN0LCBkYW5uIHdpcmQgZGFzIEVpbmZ1ZWxsZW4gdm9uIFdhc3NlcgorICAvLyB2ZXJoaW5kZXJ0LiBOdXR6ZXIgZGVyIEZ1bmt0aW9uIG11ZXNzZW4gZGllIFJ1ZWNrZ2FiZXdlcnRlIHBydWVmZW4KKyAgLy8gdW5kIGVudHNwcmVjaGVuZGUgTWVsZHVuZ2VuIGF1c2dlYmVuLgorICBpZiAoY2hlY2tfYnVzeSgxKSkKKyAgICByZXR1cm4gLTE7CisKKyAgaW50IG9sZCA9IHdhc3Nlcm1lbmdlOworICB3YXNzZXJtZW5nZSA9IG1pbih3YXNzZXJtZW5nZSttZW5nZSwgUXVlcnlQcm9wKFBfTElRVUlEKSk7CisKKyAgaWYgKHdhc3Nlcm1lbmdlPD0wKQorICB7CisgICAgd2Fzc2VybWVuZ2U9MDsgLy8gd2Fzc2VyIGVudG5haG1lCisgICAgU2V0UHJvcChQX1dBVEVSLCAwKTsKKyAgfQorICBlbHNlCisgICAgIFNldFByb3AoUF9XQVRFUiwgV19ERUFEKTsKKyAgcmV0dXJuIHdhc3Nlcm1lbmdlLW9sZDsKK30KKworc3RhdGljIGludCBjbWRfbGVlcmVuKHN0cmluZyBzdHIpCit7CisgIGlmICghUXVlcnlQcm9wKFBfV0FURVIpICYmICFzaXplb2YoYWxsX2ludmVudG9yeSgpKSkKKyAgeworICAgIHdyaXRlKEJTKCJJbSBLZXNzZWwgaXN0IGJpc2hlciBub2NoIG5pY2h0cyBlbnRoYWx0ZW4sIHdhcyBEdSBhdXNsZWVyZW4gIgorICAgICAgICAgICAgICJrb2VubnRlc3QuIikpOworICB9CisgIC8vIEVzIGdpYnQgZWluZW4gYWt0dWVsbGVuIFVzZXIsIGRpZXNlciBpc3QgbmljaHQgUEwsIHVuZCBkZXIgVGltZW91dAorICAvLyBpc3QgYXVjaCBub2NoIG5pY2h0IGFiZ2VsYXVmZW4gPT4gRmluZ2VyIHdlZy4KKyAgZWxzZSBpZiAoY2hlY2tfYnVzeSgwKSkKKyAgeworICAgIHRlbGxfb2JqZWN0KFBMLCBCUygKKyAgICAgICJEZXIgSW5oYWx0IGRlcyBLZXNzZWxzIHd1cmRlIGVyc3Qga3VlcnpsaWNoIHZvbiBqZW1hbmQgYW5kZXJlbSBkb3J0ICIKKyAgICAgICJoaW5laW5nZWZ1ZWxsdC4gRHUgc29sbHRlc3QgRGljaCBuaWNodCBkYXJhbiB6dSBzY2hhZmZlbiBtYWNoZW4uIikpOworICB9CisgIHdyaXRlKCJWb3JzaWNodGlnIG5pbW1zdCBEdSBkZW4gS2Vzc2VsIHVuZCBzY2h1ZXR0ZXN0IHNlaW5lbiBJbmhhbHQgaW4gZGVuIEFiZmx1c3MuXG4iKTsKKyAgc2F5KEJTKFBMLT5OYW1lKFdFUikrIiBuaW1tdCBkZW4gS2Vzc2VsIHVuZCBzY2h1ZXR0ZXQgZGVuIEluaGFsdCBpbiBkZW4gQWJmbHVzcy4iKSk7CisgIGNsZWFyX2tlc3NlbCgpOworICByZXR1cm4gMTsKK30KKworLyojaW5jbHVkZSAiL2QvZXJ6bWFnaWVyL2JvaW5nL2JhbGFuY2UvYmFsYW5jZS5oIgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2RlZmluZSBURVNURVIgKEJURUFNKyh7ImVsZW5kaWwiLCJzYXJheSIsICJodXJheHByYXgifSkpKi8KK3N0YXRpYyBpbnQgY21kX2JyYXVlbihzdHJpbmcgc3RyKQoreworICAvKmlmICghSVNfQVJDSCh0aGlzX2ludGVyYWN0aXZlKCkpCisgICAgICAmJiAhbWVtYmVyKFRFU1RFUiwgUEwtPnF1ZXJ5X3JlYWxfbmFtZSgpKSkKKyAgICByZXR1cm4gMDsqLworICAKKyAgbm90aWZ5X2ZhaWwoIldBUyBtb2VjaHRlc3QgRHUgYnJhdWVuP1xuIik7CisgIGlmICghc3RyKSByZXR1cm4gMDsKKy8qICBpZiAoc3RyPT0iemF1YmVydHJhbmsiKSB7CisgICAgIHdyaXRlKCJPaG5lIHBhc3NlbmRlcyBSZXplcHQgZHVlcmZ0ZSBkaWVzIHNjaHdpZXJpZyB3ZXJkZW4uLi5cbiIpOworICAgICByZXR1cm4gMTsKKyAgfSovCisgIGlmIChtZW1iZXIoKHsidHJhbmsiLCJ6YXViZXJ0cmFuayIsImtyYWV1dGVydHJhbmsiLCJ0ZWUiLCJrcmFldXRlcnRlZSJ9KSwKKyAgICAgICAgICAgICBzdHIpPDApIAorICAgIHJldHVybiAwOworCisgIGlmIChjaGVja19idXN5KDEpKSB7CisgICAgdGVsbF9vYmplY3QoUEwsIEJTKAorICAgICAgIkFuIGRlbSBUcmFuayBpbiBkZW0gS2Vzc2VsIGFyYmVpdGV0IGdlcmFkZSBub2NoICIrCisgICAgICBjYXBpdGFsaXplKGN1cnJlbnRfdXNlcikrIi4gRHUga2FubnN0IGhvZWNoc3RlbnMgaW4gZWluIHBhYXIgIgorICAgICAgIk1pbnV0ZW4gdmVyc3VjaGVuLCBkZW4gSW5oYWx0IGRlcyBLZXNzZWxzIGF1c3p1bGVlcmVuLiBTZWxic3QgIgorICAgICAgIkhhbmQgYW56dWxlZ2VuLCB3dWVyZGUgbWFuIERpciBzaWNoZXJsaWNoIHVlYmVsbmVobWVuLiIpKTsKKyAgfQorICBlbHNlIGlmICghUXVlcnlQcm9wKFBfV0FURVIpKSB7CisgICAgd3JpdGUoIlZpZWxsZWljaHQgc29sbHRlc3QgRHUgenVuYWVjaHN0IG5vY2ggV2Fzc2VyIGluIGRlbiBLZXNzZWwgIgorICAgICAgImZ1ZWxsZW4uLi5cbiIpOworICB9CisgIGVsc2UgaWYgKHdhc3Nlcm1lbmdlPFF1ZXJ5UHJvcChQX0xJUVVJRCkpIHsKKyAgICB3cml0ZSgiVmllbGxlaWNodCBzb2xsdGVzdCBEdSB6dW5hZWNoc3Qgbm9jaCBldHdhcyBtZWhyIFdhc3NlciBpbiAiCisgICAgICAiZGVuIEtlc3NlbFxuZnVlbGxlbi4uLlxuIik7CisgIH0KKyAgZWxzZSBpZiAoc2l6ZW9mKGFsbF9pbnZlbnRvcnkoKSk8MykgeworICAgIHdyaXRlKCJEZXJ6ZWl0IGlzdCBEZWluIFRyYW5rIG5vY2ggZWluIHdlbmlnIHdhZXNzcmlnLlxuIgorICAgICAgICAgKyJNaW5kZXN0ZW5zIGRyZWkgWnV0YXRlbiBtdWVzc2VuIGluIGVpbmVuIFRyYW5rIHNjaG9uIGhpbmVpbi5cbiIpOworICB9CisgIGVsc2UgeworICAgIHdyaXRlKEJTKCJWb3JzaWNodGlnIGxhZXNzdCBEdSBkZW4gS2Vzc2VsIGV0d2FzIG5hZWhlciB6dXIgRmV1ZXJzdGVsbGUgIgorICAgICAgInJ1bnRlciB1bmQgd2FydGVzdCB1bnRlciBnZWxlZ2VudGxpY2hlbSBSdWVocmVuLCBiaXMgZXIga29jaHQuICIKKyAgICAgICJEZWluIFRyYW5rIHNvbGx0ZSBudW4gZmVydGlnIHNlaW4gdW5kIER1IGthbm5zdCBpaG4gbnVuIGFiZnVlbGxlbi4gIgorICAgICAgIldhcyBlciB3b2hsIGZ1ZXIgZWluZSBXaXJrdW5nIGhhYmVuIHdpcmQ/IikpOworICAgIHNheShCUyhQTC0+TmFtZSgpKyIgbGFlc3N0IGRlbiBLZXNzZWwgenVyIEZldWVyc3RlbGxlIGhlcnVudGVyIHVuZCAiCisgICAgICAicnVlaHJ0IGxhbmdzYW0gZGFyaW4gaGVydW0uIE5hY2ggZWluZXIgV2VpbGUga29jaHQgZGllIEZsdWVzc2lna2VpdCAiCisgICAgICAiZGFyaW4sIHVuZCAiK1BMLT5OYW1lKFdFUikrIiBzdGVsbHQgZGFzIFJ1ZWhyZW4gd2llZGVyIGVpbi4iKSk7CisgICAgU2V0UHJvcChUUkFOS0ZFUlRJRywgMSk7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY21kX2Z1ZWxsZW4oc3RyaW5nIHN0cixtaXhlZCogcGFyYW1zKQoreworLyogIGlmICghSVNfQVJDSCh0aGlzX2ludGVyYWN0aXZlKCkpCisgICAgICAmJiAhbWVtYmVyKFRFU1RFUiwgdGhpc19wbGF5ZXIoKS0+cXVlcnlfcmVhbF9uYW1lKCkpKQorICAgIHJldHVybiAwOyovCisgCisgIGlmICggIVF1ZXJ5UHJvcChUUkFOS0ZFUlRJRykgKSAKKyAgeworICAgIHdyaXRlKCJJbSBLZXNzZWwgYmVmaW5kZXQgc2ljaCBhYmVyIGdhciBrZWluIFRyYW5rLlxuIik7CisgIH0KKyAgLy8gQWJmdWVsbGVuIGlzdCBudXIgZnVlciBkZW4gU3BpZWxlciBtb2VnbGljaCwgZGVyIGRpZSBLcmFldXRlcgorICAvLyByZWluZ2V0YW4gaGF0LgorICBlbHNlIGlmIChjaGVja19idXN5KDEpKQorICB7CisgICAgdGVsbF9vYmplY3QoUEwsIEJTKCJEaWVzZW4gVHJhbmsgaGFzdCBEdSBkb2NoIGdhciBuaWNodCBzZWxic3QgIgorICAgICAgImdlYnJhdXQhIER1IHNvbGx0ZXN0IG5vY2ggZWluZSBXZWlsZSB3YXJ0ZW4sIG9iICIrCisgICAgICBjYXBpdGFsaXplKGN1cnJlbnRfdXNlcikrIiBpaG4gbmljaHQgZG9jaCBub2NoIHNlbGJzdCBhYmZ1ZWxsZW4gIgorICAgICAgIndpbGwuIFdlbm4gbmljaHQsIGtvZW5udGVzdCBEdSBudXIgbm9jaCB2ZXJzdWNoZW4sIGRlbiBLZXNzZWwgIgorICAgICAgImF1c3p1bGVlcmVuIC0gamVkZW5mYWxscyBlcyBlcnNjaGVpbnQgRGlyIHZpZWwgenUgcmlza2FudCwgZGFzICIKKyAgICAgICJHZWJyYWV1IHNlbGJzdCB6dSB0cmlua2VuLCBkYXMgIitjYXBpdGFsaXplKGN1cnJlbnRfdXNlcikrCisgICAgICAiIGRhIHp1c2FtbWVuZ2VydWVocnQgaGF0LiIpKTsKKyAgfQorICBlbHNlIGlmIChCTFVFX05BTUUocGFyYW1zWzJdKT09VFJBTktJVEVNKQorICB7CisgICAgaW50IHJldCA9IHBhcmFtc1syXS0+RmlsbChhbGxfaW52ZW50b3J5KCkpOworICAgIHN3aXRjaCggcmV0ICkgeworICAgICAgY2FzZSAtMzoKKyAgICAgIGNhc2UgLTE6CisgICAgICAgIHdyaXRlKEJTKCJGZWhsZXIgYmVpbSBGdWVsbGVuIGRlciBQaGlvbGUuIEJpdHRlIHNhZyBlaW5lbSBNYWdpZXIgIgorICAgICAgICAgICJCZXNjaGVpZCB1bmQgbmVubmUgZGVuIEZlaGxlcmNvZGUgIityZXQrIi4iKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAtMjoKKyAgICAgICAgd3JpdGUoQlMoIkRpZSBQaGlvbGUgaXN0IGJlcmVpdHMgZ2VmdWVsbHQuIikpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHdyaXRlKEJTKCJEdSBuaW1tc3QgZGVuIEtlc3NlbCB1bmQgZnVlbGxzdCBzZWluZW4ga29uemVudHJpZXJ0ZW4gIgorICAgICAgICAgICJJbmhhbHQgaW4gRGVpbmUgR2xhc2ZsYXNjaGUuIEhvZmZlbnRsaWNoIGlzdCBEaXIgaGllciBlaW4gIgorICAgICAgICAgICJ0b2xsZXIgVHJhbmsgZ2VsdW5nZW4uIikpOworICAgICAgICBzYXkoQlMoUEwtPk5hbWUoV0VSKSsiIG5pbW10IGRlbiBLZXNzZWwgdW5kIGZ1ZWxsdCBkZXNzZW4gIgorICAgICAgICAgICJrb256ZW50cmllcnRlbiBJbmhhbHQgaW4gZWluZSBrbGVpbmUgR2xhc2ZsYXNjaGUuIFdhcyAiKworICAgICAgICAgIFBMLT5RdWVyeVByb25vdW4oV0VSKSsiIGRhIHdvaGwgZ2VicmF1dCBoYXQ/IikpOworICAgICAgICBjbGVhcl9rZXNzZWwoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UgeworICAgIHdyaXRlKCJEYXJlaW4ga2FubnN0IER1IGRlbiBUcmFuayBsZWlkZXIgbmljaHQgZnVlbGxlbi5cbiIpOworICB9CisgIHJldHVybiAxOworfQorCit2YXJhcmdzIHN0cmluZyBsb25nKGludCBtb2RlKQoreworICBzdHJpbmcgaW52X2Rlc2MgPSBtYWtlX2ludmxpc3QoUEwsIGFsbF9pbnZlbnRvcnkoTUUpKTsKKyAgaWYgKGludl9kZXNjPT0iIikgeworICAgIGlmIChRdWVyeVByb3AoUF9XQVRFUikpCisgICAgICByZXR1cm4gQlMoUXVlcnkoUF9MT05HKSsiIERlcnplaXQgaXN0IGVyIGxlZGlnbGljaCBtaXQgV2Fzc2VyICIKKyAgICAgICAgImdlZnVlbGx0LiIpOworICAgIHJldHVybiBCUyhRdWVyeShQX0xPTkcpKyIgRXIgaXN0IGltIE1vbWVudCBsZWVyLiIpOworICB9CisgIGlmIChRdWVyeVByb3AoUF9XQVRFUikpCisgICAgcmV0dXJuIEJTKFF1ZXJ5KFBfTE9ORykrIiBFciBpc3QgbWl0IFdhc3NlciBnZWZ1ZWxsdCwgdW5kIER1IHNpZWhzdCAiCisgICAgICAgICAgICAgICsiZm9sZ2VuZGUgS3JhZXV0ZXIgaW4gaWhtIHNjaHdpbW1lbjoiKStpbnZfZGVzYzsKKyAgcmV0dXJuIEJTKFF1ZXJ5KFBfTE9ORykpKyJFciBlbnRoYWVsdDpcbiIraW52X2Rlc2M7Cit9CisKK3N0YXRpYyBpbnQgX3F1ZXJ5X2ludmlzKCkKK3sKKyAgaWYgKG1lbWJlcigoeyJuaW1tIiwgIm5laG0iLCAibmVobWUiLCAibGVnIiwgImxlZ2UiLAorICAgICAgICAgICAgICAgInN0ZWNrIiwgInN0ZWNrZSJ9KSwgcXVlcnlfdmVyYigpKSE9LTEpIHJldHVybiAwOworICByZXR1cm4gUXVlcnkoUF9JTlZJUywgRl9WQUxVRSk7Cit9CisvKgordmFyYXJncyBzdHJpbmcgbmFtZShpbnQgY2FzdXMsIGludCBkZW1vbikKK3sKKyAgU2V0UHJvcChQX0lOVklTLCAwKTsKKyAgc3RyaW5nIHJldD06Om5hbWUoY2FzdXMsIGRlbW9uKTsKKyAgU2V0UHJvcChQX0lOVklTLCAxKTsKKyAgcmV0dXJuIHJldDsKK30KKyovCit2YXJhcmdzIGludCBQcmV2ZW50SW5zZXJ0KG9iamVjdCBvYikKK3sKKyAgaW50IHBsYW50aWQgPSBvYi0+UXVlcnlQbGFudElkKCk7IAorICBpbnQgKmludiA9IGFsbF9pbnZlbnRvcnkoTUUpLT5RdWVyeVBsYW50SWQoKTsKKyAgCisgIC8vIGVzIGtvZW5uZW4gbmF0dWVybGljaCBudXIgZWNodGUgS3JhZXV0ZXIgaW4gZGVuIEtlc3NlbCBnZWxlZ3Qgd2VyZGVuCisgIGlmICggcGxhbnRpZDw9MCB8fCAhSVNfUExBTlQob2IpICkKKyAgICByZXR1cm4gMTsKKyAgCisgIGlmIChRdWVyeVByb3AoVFJBTktGRVJUSUcpKQorICB7CisgICAgdGVsbF9vYmplY3QoUEwsIGJyZWFrX3N0cmluZygKKyAgICAgICJJbSBLZXNzZWwgaXN0IGVpbiBmZXJ0aWdlciBUcmFuay4gV2VubiBEdSBldHdhcyBuZXVlcyBtYWNoZW4gIgorICAgICAgIndpbGxzdCwgbGVlcmUgZGVuIEtlc3NlbCBvZGVyIGZ1ZWxsZSBkZW4gVHJhbmsgYWIuIikpOworICAgIHJldHVybiAxOworICB9CisgIC8vIFJlaW50dW4gZGFyZiBudXIgZGVyIGFrdHVlbGxlIFVzZXIsIGVzIHNlaSBkZW5uLCBlaW4gYW5kZXJlciBTcGllbGVyIAorICAvLyBmYWVuZ3QgZnJpc2NoIGFuLCB3ZW5uIGRlciBLZXNzZWwgZ2VyYWRlIHVuYmVudXR6dCBpc3QuCisgIGVsc2UgaWYgKCBjaGVja19idXN5KDEpICkKKyAgeworICAgIHRlbGxfb2JqZWN0KFBMLCBCUygiRGllc2VyIEtlc3NlbCB3dXJkZSBiaXMgZ2VyYWRlIGViZW4gbm9jaCB2b24gIisKKyAgICAgIGNhcGl0YWxpemUoY3VycmVudF91c2VyKSsiIGdlbnV0enQuIFdhcnRlIGJlc3NlciwgYmlzIGRlciBLZXNzZWwgIgorICAgICAgIndpZWRlciBmcmVpIGlzdC4iKSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgZWxzZSBpZiAoICFTRUNVUkUoImtyYXV0bWFzdGVyIiktPkNhblVzZUluZ3JlZGllbnQoUEwsIHBsYW50aWQpICkgCisgIHsKKyAgICAvLyBtaXQgS3JhZXV0ZXJuIHVlYmVyIGRpZSBtYW4gbmljaHRzIHdlaXNzLCBrYW5uIG1hbiBuaWNodCBicmF1ZW4KKyAgICB0ZWxsX29iamVjdChQTCwgQlMoIlVlYmVyIGRpZSBXaXJrdW5nc3dlaXNlIHZvbiAiK29iLT5uYW1lKFdFTSkrCisgICAgICAiIHdlaXNzdCBEdSBiaXNoZXIgbGVpZGVyIHdpcmtsaWNoIHVlYmVyaGF1cHQgbmljaHRzLiIpKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBlbHNlIGlmICggc2l6ZW9mKGludikgPj0gOCApIAorICB7CisgICAgdGVsbF9vYmplY3QoUEwsIEJTKCJNZWhyIGFscyBhY2h0IFp1dGF0ZW4gc29sbHRlIG1hbiBuaWUgenUgZWluZW0gIgorICAgICAgIlRyYW5rIHZlcmVpbmlnZW4sIHVuZCBlcyBzaW5kIHNjaG9uIGFjaHQgaW0gS2Vzc2VsLiIpKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBlbHNlIGlmIChtZW1iZXIoaW52LCBwbGFudGlkKT4tMSkgCisgIHsKKyAgICB0ZWxsX29iamVjdChQTCwgQlMoIkltIEtlc3NlbCBiZWZpbmRldCBzaWNoIGJlcmVpdHMgIitvYi0+bmFtZShXRVIpKworICAgICAgIi4gRHUga2FubnN0IGtlaW4gS3JhdXQgbWVociBhbHMgZWlubWFsIHZlcndlbmRlbi4iKSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgY3VycmVudF91c2VyID0gZ2V0dWlkKFBMKTsKKyAgdGltZW91dCA9IHRpbWUoKSsxMjA7CisgIHJldHVybiA6OlByZXZlbnRJbnNlcnQob2IpOworfQorCitpbnQgUHJldmVudExlYXZlKG9iamVjdCBvYiwgbWl4ZWQgZGVzdCkKK3sKKyAgaWYgKFF1ZXJ5UHJvcChQX1dBVEVSKSkgeworICAgIHRlbGxfb2JqZWN0KFBMLCBCUygiRXMgYmVmaW5kZXQgc2ljaCBiZXJlaXRzIFdhc3NlciBpbSBLZXNzZWwsIGRpZSAiCisgICAgICAiZWluemVsbmVuIFp1dGF0ZW4ga2FubnN0IER1IG51biBsZWlkZXIgbmljaHQgbWVociBlaW56ZWxuICIKKyAgICAgICJyYXVzaG9sZW4sIG9obmUgZGVuIGdhbnplbiBLZXNzZWwgYXVzenVsZWVyZW4uIikpOworICAgICAgcmV0dXJuIDE7CisgIH0KKyAgLy8gUmF1c25laG1lbiBpc3QgbnVyIGZ1ZXIgZGVuIGFrdHVlbGxlbiBVc2VyIG1vZWdsaWNoLiBBbGxlIGFuZGVyZW4KKyAgLy8ga29lbm5lbiBhdWNoIG5hY2ggQWJsYXVmIGRlciBaZWl0c3BlcnJlIG51ciBhdXNsZWVyZW4uCisgIGVsc2UgaWYgKCBjaGVja19idXN5KDEpICkgeworICAgIHRlbGxfb2JqZWN0KFBMLCBCUygiRHUgaGFzdCAiK29iLT5uYW1lKFdFTiwxKSsiIG5pY2h0IGRvcnQgaGluZWluZ2V0YW4sICIKKyAgICAgICJhbHNvIGthbm5zdCBEdSAiK29iLT5RdWVyeVByb25vdW4oV0VOKSsiIGF1Y2ggbmljaHQgaGVyYXVzbmVobWVuLiAiCisgICAgICAiWnVtaW5kZXN0IHZvcmVyc3QgbmljaHQuIFNvbGx0ZSAiK2NhcGl0YWxpemUoY3VycmVudF91c2VyKSsKKyAgICAgICJuaWNodCBpbm5lcmhhbGIgZGVyIG5hZWNoc3RlbiBwYWFyIE1pbnV0ZW4gd2VpdGVyYnJhdWVuLCBrYW5uc3QgIgorICAgICAgIkR1IGRlbiBLZXNzZWxpbmhhbHQgenVtaW5kZXN0IG1pdCBlaW5lbSBndXRlbiBTY2hsdWNrIFdhc3NlciAiCisgICAgICAicmF1c3NwdWVsZW4uIikpOworICAgIHJldHVybiAxOworICB9CisgIHJldHVybiA6OlByZXZlbnRMZWF2ZShvYiwgZGVzdCk7Cit9CisKZGlmZiAtLWdpdCBhL2l0ZW1zL2tyYWV1dGVyL2tpY2hlcnBpbHouYyBiL2l0ZW1zL2tyYWV1dGVyL2tpY2hlcnBpbHouYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGIxMGEzCi0tLSAvZGV2L251bGwKKysrIGIvaXRlbXMva3JhZXV0ZXIva2ljaGVycGlsei5jCkBAIC0wLDAgKzEsNTEgQEAKKy8vIChjKSAyMDAxIGJ5IFBhZHJlaWMgKFBhZHJlaWNAbWcubXVkLmRlKQorLy8gQmVzY2hyaWViZW4gdm9uIE1hZ2RhbGVuYSA6bykgMDguMDguMDMKKworI3ByYWdtYSBzdHJvbmdfdHlwZXMscnR0X2NoZWNrcworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGl0ZW1zL2tyYWV1dGVyL2tyYWV1dGVyLmg+CisjaW5jbHVkZSA8aXRlbXMva3JhZXV0ZXIva3JhZXV0ZXJsaXN0ZS5oPgorCitpbmhlcml0IFNURFBMQU5UOworCisjZGVmaW5lIEJTKHgpIGJyZWFrX3N0cmluZyh4LCA3OCkKKwordm9pZCBjcmVhdGUoKQoreworICA6OmNyZWF0ZSgpOworICBjdXN0b21pemVNZShLSUNIRVJQSUxaKTsKKyAgU2V0UHJvcChQX05BTUUsICAgICAiS2ljaGVycGlseiIpOworICBTZXRQcm9wKFBfTkFNRV9BREosICJsdXN0aWciKTsKKyAgU2V0UHJvcChQX0dFTkRFUiwgICBNQUxFKTsKKyAgU2V0UHJvcChQX0xPTkcsICAgICAKKyAgICAiRXIgaGF0IGVpbiBncnVlbmVzIEthZXBwY2hlbiBhdWYgdW5kIGlzdCBmdWVyIGVpbmVuIFBpbHogcmVsYXRpdiBncm9zcy4gQWIgdW5kXG4iCisgICArImFuIHp1Y2t0IGVyIHVuZCBraWNoZXJ0IGFsYmVybi4gRGFoZXIgaGF0IGVyIHdvaGwgYXVjaCBzZWluZW4gTmFtZW4uXG4iKTsKKyAgU2V0UHJvcChQTEFOVF9ST09NREVUQUlMLCAKKyAgICAiRWluIGJlc29uZGVycyBwcmFlY2h0aWdlcyBFeGVtcGxhciBlaW5lcyBLaWNoZXJwaWx6ZXMgd2lua3QgZGlyXG4iCisgICArImF1ZmRyaW5nbGljaCB6dSwgYWxzbyBvYiBlcyBzY2hhcmYgZGFyYXVmIHdhZXJlLCBnZXBmbHVlY2t0IHp1IHdlcmRlbi5cbiIpOworICBTZXRQcm9wKFBfU0hPUlQsICAgICJFaW4gS2ljaGVycGlseiIpOworICBBZGRJZCgoeyAicGlseiIsICJraWNoZXJwaWx6IiB9KSk7CisgIAorICBBZGREZXRhaWwoImthZXBwY2hlbiIsQlMoCisgICAgICJEZXIgUGlseiBzY2hlaW50IHNpY2ggZnVlciBkaWUgbmV1ZXN0ZSBNb2RlIHp1IGludGVyZXNzaWVyZW4uICIKKyAgICArIk1pdCBkZW0gZ3J1ZW5lbiBLYWVwcGNoZW4gaXN0IGVyIG5hY2ggZGVtIGxldHp0ZW4gU2NocmVpIGdla2xlaWRldC4iKSk7CisgIEFkZERldGFpbCgibW9kZSIsQlMoCisgICAgICJEdSBzY2hhdXN0IGFuIGRlaW5lciBLbGVpZHVuZyBoaW51bnRlciAtIG5hamEsIG1pdCBkZW0gUGlseiAiCisgICAgKyJrYW5uc3QgZHUgbmljaHQgbWl0aGFsdGVuLiIpKTsKKyAgQWRkRGV0YWlsKCJzY2hyZWkiLEJTKAorICAgICAiU2VpIGVocmxpY2g6IEJlaSBkZW0gR3J1ZW4ga2FubiBtYW4gbnVyIHNjaHJlaWVuISIpKTsKKyAgQWRkRGV0YWlsKCJncnVlbiIsQlMoCisgICAgICJFaWdlbnRsaWNoIGlzdCBlcyBkb2NoIGdhbnogZ3V0LCBzaWNoIG5pY2h0IGZ1ZXIgTW9kZSB6dSAiCisgICAgKyJpbnRlcmVzc2llcmVuLCBkZW5uIGRhcyBHcnVlbiBzY2htZXJ6dCBpbiBkZW4gQXVnZW4uIikpOworIAorICBzZXRfbmV4dF9yZXNldCgyMDArcmFuZG9tKDIwMCkpOworfQorCit2b2lkIHJlc2V0KCkKK3sKKyAgIHNldF9uZXh0X3Jlc2V0KDIwMCtyYW5kb20oMjAwKSk7CisgICBpZiAoZW52aXJvbm1lbnQoKSkgCisgICAgICB0ZWxsX29iamVjdChlbnZpcm9ubWVudCgpLCAiRGVyIEtpY2hlcnBpbHoga2ljaGVydCBEaWNoIGFuLlxuIik7IAorICAgOjpyZXNldCgpOworfQpkaWZmIC0tZ2l0IGEvaXRlbXMva3JhZXV0ZXIva3JhdXQuYyBiL2l0ZW1zL2tyYWV1dGVyL2tyYXV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTViMzQyOQotLS0gL2Rldi9udWxsCisrKyBiL2l0ZW1zL2tyYWV1dGVyL2tyYXV0LmMKQEAgLTAsMCArMSwyNiBAQAorI3ByYWdtYSBzdHJvbmdfdHlwZXMscnR0X2NoZWNrcworCisjaW5jbHVkZSA8aXRlbXMva3JhZXV0ZXIva3JhZXV0ZXIuaD4KKworaW5oZXJpdCBTVERQTEFOVDsKKwordm9pZCBjcmVhdGUoKQoreworICA6OmNyZWF0ZSgpOworICAvL3ByaW50ZigiY3JlYXRlKCk6ICVPXG4iLGxvYWRfbmFtZSgpKTsKKyAgLy9yZXBsYWNlX3Byb2dyYW0oKTsKKyAgLy8gV2VubiBlcyBkYXMgU3RhbmRhcmRmaWxlIGdlY2xvbnQgd2lyZCwgd2lyZCBjdXN0b21pemVNZSgwKSBnZXJ1ZmVuLCB3YXMKKyAgLy8gZGVuIEtyYWV1dGVyLVZDIGRhenUgYnJpbmd0LCBkaWVzZXMgbWl0IGRlbiBEYXRlbiBkZXMgS3JhdXRlcyB6dQorICAvLyBrb25maWd1cmllcmVuLCB3YXMgZGVyIFZDIGdlcmFkZSBlcnpldWd0IGhhdC4KKyAgLy8gbG9hZF9uYW1lKCkgYmxlaWJ0IGZ1ZXIgYWxsZSBWQy1lcnpldWd0ZW4gS3JhZXV0ZXItQmx1ZXByaW50cyBkYXMKKyAgLy8gUExBTlRJVEVNLgorICAvLyBoaWVyIGRhcmYgX25pY2h0XyBwcmV2aW91c19vYmplY3QoKS0+Q3VzdG9taXplT2JqZWN0KCkgdmVyd2FuZHQgd2VyZGVuLAorICAvLyBkYSBudXIgZGllIEJsdWVwcmludCB3aXJrbGljaCB2b20gVkMgZXJ6ZXVndCB3aXJkLiBGdWVyIGRpZSBDbG9uZXMKKyAgLy8gcnVmdCBkZXIgRHJpdmVyIGRlbiBWQyBuaWNodCBqZWRlc21hbCBlcm5ldXQgYXVmLgorICBpZiAobG9hZF9uYW1lKCkgPT0gUExBTlRJVEVNKQorICAgIGN1c3RvbWl6ZU1lKDApOworfQorCitzdHJpbmcgR2V0T3duZXIoKSB7CisgIHJldHVybiAiUGFkcmVpYyI7Cit9CmRpZmYgLS1naXQgYS9pdGVtcy9rcmFldXRlci90cmFuay5jIGIvaXRlbXMva3JhZXV0ZXIvdHJhbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTdiNDJmCi0tLSAvZGV2L251bGwKKysrIGIvaXRlbXMva3JhZXV0ZXIvdHJhbmsuYwpAQCAtMCwwICsxLDEzIEBACisjcHJhZ21hIHN0cm9uZ190eXBlcyxydHRfY2hlY2tzCisKKyNpbmNsdWRlIDxpdGVtcy9rcmFldXRlci9rcmFldXRlci5oPgorCitpbmhlcml0IFNURFRSQU5LOworLyoKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgOjpjcmVhdGUoKTsKKyAgcmVwbGFjZV9wcm9ncmFtKCk7Cit9CisqLworCmRpZmYgLS1naXQgYS9pdGVtcy9rcmFldXRlci90cm9ja25lci5jIGIvaXRlbXMva3JhZXV0ZXIvdHJvY2tuZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmU3NDE3Ci0tLSAvZGV2L251bGwKKysrIGIvaXRlbXMva3JhZXV0ZXIvdHJvY2tuZXIuYwpAQCAtMCwwICsxLDQ3NSBAQAorI3ByYWdtYSBzdHJvbmdfdHlwZXMsIHNhdmVfdHlwZXMsIHJ0dF9jaGVja3MKKyNwcmFnbWEgbm9faW5oZXJpdCwgbm9fc2hhZG93CisKK2luaGVyaXQgIi9zdGQvY29udGFpbmVyIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8aXRlbXMva3JhZXV0ZXIva3JhZXV0ZXIuaD4KKworI2RlZmluZSBCUyh4KSBicmVha19zdHJpbmcoeCwgNzgsIDAsIEJTX0xFQVZFX01ZX0xGUykKKworLy8gRW50aGFlbHQgZGllIHJhdW1hYmhhZW5naWcgdmFyaWFibGUgS3VyemJlc2NocmVpYnVuZywgZGllIGRlciBUcm9ja25lciAKKy8vIGFubmltbXQsIHdlbm4gZ2VyYWRlIGVpbiBLcmF1dCBnZXRyb2NrbmV0IHdpcmQuCitwcml2YXRlIHN0cmluZyBzaG9ydF9kZXNjOworCisvLyBHbG9iYWxlIFZhcmlhYmxlIGZ1ZXIgZGllIFF1YWxpdGFldCwgZGFtaXQgbWFuIGRlbiBXZXJ0IG5pY2h0IGltIAorLy8gY2FsbF9vdXQoKSBtaXRnZWJlbiBtdXNzLCB1bmQgc2llIHNvbWl0IGF1Y2ggbmljaHQgbWl0IGNhbGxfb3V0X2luZm8oKQorLy8gYWJmcmFnYmFyIGlzdC4KK3ByaXZhdGUgaW50IGRyeWluZ19xdWFsaXR5OworCitwcml2YXRlIHZvaWQgZHJ5X3BsYW50KG9iamVjdCBrcmF1dCwgc3RyaW5nICptc2dzKTsKK3ByaXZhdGUgdm9pZCBkZXN0cm95X2hlcmIob2JqZWN0IGtyYXV0KTsKK3ByaXZhdGUgc3RyaW5nIG15X3Nob3J0KCk7Citwcml2YXRlIGludHxzdHJpbmcgbXlfbm9nZXQoKTsKK3ByaXZhdGUgc3RyaW5nIG15X2xvbmcoKTsKK3ByaXZhdGUgc3RyaW5nKiBteV9pZHMoKTsKK3ByaXZhdGUgc3RyaW5nfHN0cmluZyogbXlfbmFtZSgpOworcHJpdmF0ZSBtaXhlZCBteV9tYXQoKTsKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkgeworICBpZiAoICFjbG9uZXAoTUUpICkgeworICAgIHNldF9uZXh0X3Jlc2V0KC0xKTsKKyAgICByZXR1cm47CisgIH0KKyAgOjpjcmVhdGUoKTsKKworICBTZXQoUF9TSE9SVCwgIydteV9zaG9ydCwgRl9RVUVSWV9NRVRIT0QpOworICBTZXQoUF9MT05HLCAjJ215X2xvbmcsIEZfUVVFUllfTUVUSE9EKTsKKyAgU2V0KFBfTk9HRVQsICMnbXlfbm9nZXQsIEZfUVVFUllfTUVUSE9EKTsKKyAgU2V0KFBfSURTLCAjJ215X2lkcywgRl9RVUVSWV9NRVRIT0QpOworICBTZXQoUF9OQU1FLCAjJ215X25hbWUsIEZfUVVFUllfTUVUSE9EKTsKKyAgU2V0KFBfTUFURVJJQUwsICMnbXlfbWF0LCBGX1FVRVJZX01FVEhPRCk7CisgIC8vIFByb3BlcnRpZXMgenUgc2VjdXJlbiBpc3QgdmllbGxlaWNodCBldHdhcyBzZWhyIHBhcmFub2lkLgorICBTZXQoUF9TSE9SVCwgU0VDVVJFRHxOT1NFVE1FVEhPRCwgRl9NT0RFX0FTKTsKKyAgU2V0KFBfTE9ORywgU0VDVVJFRHxOT1NFVE1FVEhPRCwgRl9NT0RFX0FTKTsKKyAgU2V0KFBfTk9HRVQsIFNFQ1VSRUR8Tk9TRVRNRVRIT0QsIEZfTU9ERV9BUyk7CisgIFNldChQX0lEUywgU0VDVVJFRHxOT1NFVE1FVEhPRCwgRl9NT0RFX0FTKTsKKyAgU2V0KFBfTkFNRSwgU0VDVVJFRHxOT1NFVE1FVEhPRCwgRl9NT0RFX0FTKTsKKyAgU2V0UHJvcChQX01BWF9PQkpFQ1RTLDEpOworICBTZXRQcm9wKFBfTUFYX1dFSUdIVCwxMDAwMDApOworICBTZXRQcm9wKFBfVFJBTlNQQVJFTlQsMCk7CisKKyAgQWRkQ21kKCJ0cm9ja25lJkBQUkVTRU5UIiwgImNtZF90cm9ja25lbiIsICJXYXMgd2lsbHN0IER1IHRyb2NrbmVuPyIpOworfQorCitwcml2YXRlIHN0cmluZyBteV9zaG9ydCgpIHsKKyAgaWYgKCBmaXJzdF9pbnZlbnRvcnkoTUUpICkKKyAgICByZXR1cm4gc2hvcnRfZGVzYzsKKyAgcmV0dXJuIDA7Cit9CisKKy8vIFF1ZXJ5bWV0aG9kZW4sIGRpZSBMYW5nYmVzY2hyZWlidW5nIHVuZCB3ZWl0ZXJlIFByb3BlcnRpZXMgZGVzIGltIAorLy8gVHJvY2tuZXIgZW50aGFsdGVuZW4gS3JhdXRvYmpla3RlcyBuYWNoIGRyYXVzc2VuIHdlaXRlcnJlaWNoZW4sIHVtIGRpZQorLy8gSWxsdXNpb24genUgZXJ6ZXVnZW4sIGRhc3Mgd2lya2xpY2ggZGFzIGVjaHRlIEtyYXV0IGltIFJhdW0genUgc2VoZW4gc2VpLgorLy8gQWxsZSBGdW5rdGlvbmVuIGdlaGVuIGRhdm9uIGF1cywgZGFzcyBkYXMgenUgdHJvY2tuZW5kZSBLcmF1dCBkYXMgZXJzdGUKKy8vICh1bmQgZWluemlnZSkgT2JqZWt0IGltIEludmVudGFyIGRlcyBUcm9ja25lcnMgaXN0IHVuZCBnZWJlbiBkZXNzZW4KKy8vIFByb3BlcnRpZXMgenVydWVjay4KK3ByaXZhdGUgc3RyaW5nIG15X2xvbmcoKSB7CisgIG9iamVjdCBpbnYgPSBmaXJzdF9pbnZlbnRvcnkoTUUpOworICBpZiAoIG9iamVjdHAoaW52KSApCisgICAgcmV0dXJuIGludi0+UXVlcnlQcm9wKFBfTE9ORykraW52LT5OYW1lKFdFUiwxKSsKKyAgICAgICIgd2lyZCBnZXJhZGUgZ2V0cm9ja25ldC5cbiI7CisgIHJldHVybiAwOworfQorCitwcml2YXRlIHN0cmluZ3xzdHJpbmcqIG15X25hbWUoKSB7CisgIG9iamVjdCBpbnYgPSBmaXJzdF9pbnZlbnRvcnkoTUUpOworICBpZiAoIG9iamVjdHAoaW52KSApCisgICAgcmV0dXJuIGludi0+UXVlcnlQcm9wKFBfTkFNRSk7CisgIHJldHVybiBRdWVyeShQX05BTUUsRl9WQUxVRSk7Cit9CisKK3ByaXZhdGUgbWl4ZWQgbXlfbWF0KCkgeworICBvYmplY3QgaW52ID0gZmlyc3RfaW52ZW50b3J5KE1FKTsKKyAgaWYgKCBvYmplY3RwKGludikgKQorICAgIHJldHVybiBpbnYtPlF1ZXJ5UHJvcChQX01BVEVSSUFMKTsKKyAgcmV0dXJuIChbXSk7Cit9CisKK3ByaXZhdGUgaW50fHN0cmluZyBteV9ub2dldCgpIHsKKyAgb2JqZWN0IGludiA9IGZpcnN0X2ludmVudG9yeShNRSk7CisgIGlmICggb2JqZWN0cChpbnYpICkKKyAgICByZXR1cm4gaW52LT5OYW1lKFdFUiwxKSsiIHdpcmQgZ2VyYWRlIGdldHJvY2tuZXQsIER1IHNvbGx0ZXN0ICIrCisgICAgICBpbnYtPlF1ZXJ5UHJvbm91bihXRU4pKyIgbGllZ2VubGFzc2VuLCBiaXMgIisKKyAgICAgIGludi0+UXVlcnlQcm9ub3VuKFdFUikrIiBmZXJ0aWcgaXN0LiI7CisgIHJldHVybiAxOworfQorCitwcml2YXRlIHN0cmluZyogbXlfaWRzKCkgeworICBvYmplY3QgaW52ID0gZmlyc3RfaW52ZW50b3J5KE1FKTsKKyAgaWYgKCBvYmplY3RwKGludikgKQorICAgIHJldHVybiBpbnYtPlF1ZXJ5UHJvcChQX0lEUyk7CisgIHJldHVybiBRdWVyeShQX0lEUyxGX1ZBTFVFKTsKK30KKworLy8gS29tbWFuZG9mdW5rdGlvbiB6dW0gU3RhcnRlbiBkZXMgVG9ja251bmdzdm9yZ2FuZ2VzLiBIb2x0IHNpY2ggZGllCisvLyByZWxldmFudGVuIERhdGVuIGF1cyBkZW0gS3JhdXRtYXN0ZXIgYWIsIHNldHp0IE1lbGR1bmdlbiB1bmQgVGV4dGUgdW5kCisvLyB3aXJmdCBkZW4gVHJvY2tudW5ncy1DYWxsb3V0IGFuLgorc3RhdGljIGludCBjbWRfdHJvY2tuZW4oc3RyaW5nIHN0ciwgbWl4ZWQgKnBhcmFtKSB7CisgIC8vIE1hc3RlciBsaWVmZXJ0IGxlZXJlcyBBcnJheSBvZGVyIGVpbnMgbWl0IDIgRWxlbWVudGVuICh7ZGVsYXksIHF1YWxpdHl9KQorICAvLyBlbnZpcm9ubWVudChNRSkgbGllc3QgZXIgc2VsYnN0YWVuZGlnIGF1cworICBpbnQgKmRyeWluZ19kYXRhID0gUExBTlRNQVNURVItPlF1ZXJ5RHJ5aW5nRGF0YSgpOworICBvYmplY3Qga3JhdXQgPSBwYXJhbVswXTsKKworICAvLyBEZXIgVHJvY2tuZXIgdGFldXNjaHQgdm9yLCBzZWxic3QgZGFzIEtyYXV0IHp1IHNlaW4sIGRhcyB6dW0gVHJvY2tuZW4KKyAgLy8gaW0gUmF1bSBsaWVndC4gRGFoZXIgd2lyZCBoaWVyIG5vY2ggZ2VwcnVlZnQsIG9iIGRlciBTcGllbGVyIHZpZWxsZWljaHQKKyAgLy8gZGVuIFRyb2NrbmVyIHNlbGJzdCB6dSB0cm9ja25lbiB2ZXJzdWNodC4gCisgIGlmICgga3JhdXQgPT0gTUUgKSB7CisgICAgdGVsbF9vYmplY3QoUEwsIEJTKGtyYXV0LT5OYW1lKFdFUiwxKSsiIHdpcmQgYmVyZWl0cyBnZXRyb2NrbmV0LCBEdSAiCisgICAgICAic29sbHRlc3QgIitrcmF1dC0+UXVlcnlQcm9ub3VuKFdFTikrIiBiZXNzZXIgbGllZ2VubGFzc2VuLiIpKTsKKyAgfQorICAvLyBFcyBtdXNzIHNpY2ggYXVjaCB1bSBlaW4gS3JhdXQgaGFuZGVsbiB1bmQgbmljaHQgaXJnZW5kd2FzIGFuZGVyZXMuCisgIGVsc2UgaWYgKCBsb2FkX25hbWUoa3JhdXQpICE9IFBMQU5USVRFTSApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICAvLyBTcGllbGVyIG11c3MgZGFzIEtyYXV0IGltIEludmVudGFyIGhhYmVuLgorICBlbHNlIGlmICggZW52aXJvbm1lbnQoa3JhdXQpICE9IFBMICkgeworICAgIHRlbGxfb2JqZWN0KFBMLCBCUygKKyAgICAgICJEdSBtdXNzdCAiK2tyYXV0LT5uYW1lKFdFTiwxKSsiIHNjaG9uIGluIGRpZSBIYW5kIG5laG1lbiwgdW0gIisKKyAgICAgIGtyYXV0LT5RdWVyeVByb25vdW4oV0VOKSsiIHNvcmdmYWVsdGlnIHRyb2NrbmVuIHp1IGtvZW5uZW4uIikpOworICB9CisgIC8vIERhcyBLcmF1dCBkYXJmIG5pY2h0IHVud2lya3NhbSBzZWluLCB3YXMgZHVyY2ggZWluZSBQbGFudC1JRCB2b24gLTEgCisgIC8vIGdla2VubnplaWNoZXQgaXN0LgorICBlbHNlIGlmICggcGFyYW1bMF0tPlF1ZXJ5UGxhbnRJZCgpID09IC0xICkgeworICAgIHRlbGxfb2JqZWN0KFBMLCBCUygKKyAgICAgIGtyYXV0LT5OYW1lKFdFUiwxKSsiIGhhZXR0ZSBvaG5laGluIGtlaW5lIFdpcmt1bmcsIGRhIGthbm5zdCBEdSBEaXIgIgorICAgICAgImRpZSBNdWVoZSBzcGFyZW4sICIra3JhdXQtPlF1ZXJ5UHJvbm91bihXRU4pKyIgbm9jaCBhdWZ3ZW5kaWcgenUgIgorICAgICAgInRyb2NrbmVuLiIpKTsKKyAgfQorICAvLyBNYXN0ZXIgaGF0IGtlaW5lIERhdGVuIGdlbGllZmVydCwgYWxzbyBiZWZpbmRldCBzaWNoIGRlciBUcm9ja25lcgorICAvLyBvZmZlbmJhciBpbiBlaW5lbSB1bnp1bGFlc3NpZ2VuIFJhdW0uCisgIGVsc2UgaWYgKCBzaXplb2YoZHJ5aW5nX2RhdGEpICE9IDIgKSB7CisgICAgdGVsbF9vYmplY3QoUEwsIEJTKAorICAgICAgIkRpZXNlciBPcnQgaXN0IG5pY2h0IGdlZWlnbmV0LCB1bSAiK2tyYXV0LT5uYW1lKFdFTiwxKSsiIGhpZXIgenUgIgorICAgICAgInRyb2NrbmVuLiIpKTsKKyAgfQorICAvLyBLcmF1dCBpc3Qgc2Nob24gZ2V0cm9ja25ldD8gRGFubiB3YWVyZSBlaW5lIHdlaXRlcmUgVHJvY2tudW5nIHVuc2lubmlnLgorICBlbHNlIGlmICgga3JhdXQtPlF1ZXJ5RHJpZWQoKSApIHsKKyAgICB0ZWxsX29iamVjdChQTCwgQlMoa3JhdXQtPk5hbWUoV0VSLDEpKyIgaXN0IHNjaG9uIGdldHJvY2tuZXQsIGVpbmUgIgorICAgICAgIndlaXRlcmUgQmVoYW5kbHVuZyB3dWVyZGUgIitrcmF1dC0+UXVlcnlQcm9ub3VuKFdFTSkrIiB6dSBzdGFyayAiCisgICAgICAienVzZXR6ZW4sICIra3JhdXQtPlF1ZXJ5UHJvbm91bihXRU4pKyIgZ2FyIHplcnN0b2VyZW4uIikpOworICB9CisgIC8vIEVzIGlzdCBzY2hvbiBlaW5lIFBmbGFuemUgaW0gVHJvY2tuZXI/IERhbm4gbmljaHQgbm9jaCBlaW5lIHJlaW50dW4uCisgIGVsc2UgaWYgKCBmaXJzdF9pbnZlbnRvcnkoTUUpICkgeworICAgIHRlbGxfb2JqZWN0KFBMLCBCUygiSGllciB3aXJkIGdlcmFkZSBzY2hvbiBldHdhcyBnZXRyb2NrbmV0LiIpKTsKKyAgfQorICAvLyBBdXMgaXJnZW5kZWluZW0gR3J1bmQgc2NobGFlZ3QgZGllIEJld2VndW5nIGRlcyBLcmF1dGVzIGluIGRlbiBUcm9ja25lcgorICAvLyBmZWhsPyBEYW5uIG11c3Mgc2ljaCBkYXMgZWluIE1hZ2llciBhbnNjaGF1ZW4sIGRlbm4gZGFzIGdlaHQgbmljaHQgbWl0CisgIC8vIHJlY2h0ZW4gRGluZ2VuIHp1LgorICBlbHNlIGlmICgga3JhdXQtPm1vdmUoTUUsIE1fUFVUKSAhPSBNT1ZFX09LICkgeworICAgIHRlbGxfb2JqZWN0KFBMLCBCUygiQXVzIGVpbmVtIERpciB1bmVyZmluZGxpY2hlbiBHcnVuZCBzY2hhZmZzdCBEdSBlcyAiCisgICAgICAibmljaHQsIGRpZSBUcm9ja251bmcgIitrcmF1dC0+bmFtZShXRVNTRU4sMSkrIiB6dWZyaWVkZW5zdGVsbGVuZCAiCisgICAgICAiZHVyY2h6dWZ1ZWhyZW4gdW5kIGJyaWNoc3QgZGVuIFZlcnN1Y2ggd2llZGVyIGFiLiBEdSBzb2xsdGVzdCBlaW5lbSAiCisgICAgICAiTWFnaWVyIEJlc2NoZWlkIHNhZ2VuLCBkYXNzIGhpZXIgZXR3YXMgbmljaHQgc3RpbW10LiIpKTsKKyAgfQorICAvLyBBbGxlcyBnZWtsYXBwdCwgYWxsZSBCZWRpbmd1bmdlbiBlcmZ1ZWxsdD8gRGFubiBrb2VubmVuIHdpciBqZXR6dAorICAvLyB0YXRzYWVjaGxpY2ggZW5kbGljaCBkYXMgS3JhdXQgdHJvY2tuZW4uCisgIGVsc2UgeworICAgIGludCBkcnlpbmdfZGVsYXkgPSBkcnlpbmdfZGF0YVswXTsgLy8gbnVyIGxva2FsIGJlbm9ldGlndAorICAgIGRyeWluZ19xdWFsaXR5ID0gZHJ5aW5nX2RhdGFbMV07IC8vIGdsb2JhbGUgVmFyaWFibGUKKyAgICBzdHJpbmcgd2hlcmUgPSBsb2FkX25hbWUoZW52aXJvbm1lbnQoTUUpKTsKKyAgICBzdHJpbmcgbXNnX3NlbGYsIG1zZ19vdGhlcjsKKyAgICBzdHJpbmcga3IgPSBrcmF1dC0+bmFtZShXRU4sMSk7CisgICAgc3RyaW5nKiBjYWxsb3V0X21zZ3MgPSAoeworICAgICAgICBrcmF1dC0+TmFtZShXRVIsMSkrIiBpc3QgamV0enQgaW4gZWluZW0genVmcmllZGVuc3RlbGxlbmRlbiAiCisgICAgICAgICJadXN0YW5kLiBCZXNzZXIgd2lyc3QgRHUgZXMgYW4gZGllc2VtIE9ydCB2ZXJtdXRsaWNoIG5pY2h0ICIKKyAgICAgICAgImhpbmJla29tbWVuLCBkYWhlciBiZWVuZGVzdCBEdSBkaWUgVHJvY2tudW5nIHVuZCBuaW1tc3QgIisKKyAgICAgICAga3JhdXQtPlF1ZXJ5UHJvbm91bihXRU4pKyIgd2llZGVyIGFuIERpY2guIiwKKyAgICAgICAgUEwtPk5hbWUoV0VSKSsiIHNjaGF1dCAiK2tyKyIgcHJ1ZWZlbmQgYW4gdW5kICIKKyAgICAgICAgImJlZW5kZXQgZGFubiBkaWUgVHJvY2tudW5nLCBvZmZlbmJhciB6dWZyaWVkZW4gbWl0IGRlbSBSZXN1bHRhdC4ifSk7CisgICAgaW50IGJsb2NrZXI7IC8vIGF1ZiAxIHNldHplbiwgZmFsbHMgZGFzIFRyb2NrbmVuIHZlcmhpbmRlcnQgd2VyZGVuIHNvbGwKKyAgICAvLyBIaWVyIGtvZW5uZW4gamV0enQgYWJoYWVuZ2lnIHZvbSBSYXVtIHBhc3NlbmRlIE1lbGR1bmdlbiBnZXNldHp0CisgICAgLy8gd2VyZGVuLiBEaWUgenVsYWVzc2lnZW4gU3RhbmRvcnRlIGhpZXIgbm9jaCB3ZWl0ZXIgenUgb2JmdXNjYXRlbgorICAgIC8vIHdhZXJlIHp3YXIgbW9lZ2xpY2gsIGFiZXIgenUgdW51ZWJlcnNpY2h0bGljaCBnZXdvcmRlbi4KKyAgICBzd2l0Y2god2hlcmUpIHsKKyAgICAgIC8qCisgICAgICAgKiBHRUJJUkdFIAorICAgICAgICovCisgICAgICBjYXNlICIvZC9nZWJpcmdlL3NpbHZhbmEvY3Jvbm9lcnRhbC9yb29tL3RoN3UiOgorICAgICAgICBtc2dfc2VsZiA9ICJEdSBsZWdzdCAiK2tyKyIgdm9yc2ljaHRpZyB1bmQgaW4gZ2VidWVocmVuZGVtIEFic3RhbmQgIgorICAgICAgICAgICJ6dSBkZW4gRmxhbW1lbiBuZWJlbiBkaWUgRmV1ZXJzdGVsbGUgdW5kIHdhcnRlc3QgZ2VzcGFubnQsIG9iICIKKyAgICAgICAgICAiZGllIFRyb2NrbnVuZyB3b2hsIGdlbGluZ2VuIHdpcmQuIjsKKyAgICAgICAgbXNnX290aGVyID0gUEwtPk5hbWUoV0VSKSsiIGxlZ3QgZXR3YXMgbmViZW4gZGllIEZldWVyc3RlbGxlLCAiCisgICAgICAgICAgInZlcm11dGxpY2gsIHVtIGVzIHp1IHRyb2NrbmVuLiI7CisgICAgICAgIHNob3J0X2Rlc2MgPSBrcmF1dC0+TmFtZShXRVIpKyIgbGllZ3QgenVtIFRyb2NrbmVuIGFtIEZldWVyIjsKKyAgICAgICAgYnJlYWs7CisgICAgICAvKgorICAgICAgICogRUJFTkUgCisgICAgICAgKi8KKyAgICAgIGNhc2UgIi9kL2ViZW5lL3phcmRvei9idXJnL2t1ZWNoZSI6CisgICAgICAgIG1zZ19zZWxmID0gIkR1IGxlZ3N0ICIra3IrIiB2b3JzaWNodGlnIGFuIGVpbmUgZGVyIGt1ZWhsZXJlbiAiCisgICAgICAgICAgIlN0ZWxsZW4gZGVzIEJsZWNoZXMgaW0gT2ZlbiwgZXMgc29sbCBqYSB0cm9ja25lbiwgdW5kIG5pY2h0ICIKKyAgICAgICAgICAiYmFja2VuLiI7CisgICAgICAgIG1zZ19vdGhlciA9IFBMLT5OYW1lKFdFUikrIiBsZWd0IGV0d2FzIEdydWVuemV1ZyBhdWYgZGFzIEJsZWNoIGltICIKKyAgICAgICAgICAiT2Zlbi4iOworICAgICAgICBzaG9ydF9kZXNjID0ga3JhdXQtPk5hbWUoV0VSKSsiIGxpZWd0IHp1bSBUcm9ja25lbiBpbSBPZmVuIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICIvZC9lYmVuZS9lc21lL21hc2lueWEvcm9vbXMva3VlY2hlIjoKKyAgICAgICAgbXNnX3NlbGYgPSAiRHUgaGFlbmdzdCAiK2tyKyIgdWViZXIgZGVuIEhlcmQsIHVtICIrCisgICAgICAgICAga3JhdXQtPlF1ZXJ5UHJvbm91bihXRU4pKyIgaW4gZGVyIEFid2Flcm1lIHRyb2NrbmVuIHp1IGxhc3Nlbi4iOworICAgICAgICBtc2dfb3RoZXIgPSBQTC0+TmFtZShXRVIpKyIgaGFlbmd0IGVpbiBLcmF1dCB6dW0gVHJvY2tuZW4gdWViZXIgIgorICAgICAgICAgICJkZW4gSGVyZC4iOworICAgICAgICBzaG9ydF9kZXNjID0ga3JhdXQtPk5hbWUoV0VSKSsiIGhhZW5ndCB6dW0gVHJvY2tuZW4gdWViZXIgZGVtIEhlcmQiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgIi9kL2ViZW5lL3Rocm9pbi9icmF1ZXJlaS9yb29tL2RhcnJlMDYiOgorICAgICAgICBtc2dfc2VsZiA9ICJEdSBsZWdzdCAiK2tyKyIgenUgZGVtIE1hbHogaW4gZGVuICIKKyAgICAgICAgICAiS2VpbWthc3RlbiBpbiBkZXIgSG9mZm51bmcsIGRhc3MgIitrcmF1dC0+UXVlcnlQcm9ub3VuKFdFUikrCisgICAgICAgICAgIiBhdWYgZGllc2UgV2Vpc2UgZ2V0cm9ja25ldCB3ZXJkZW4ga2Fubi4iOworICAgICAgICBtc2dfb3RoZXIgPSBQTC0+TmFtZShXRVIpKyIgbGVndCBldHdhcyBlaWdlbmVzIEdydWVuemV1ZyB6dSBkZW0gIgorICAgICAgICAgICJNYWx6IGluIGRlbiBLZWlta2FzdGVuLiI7CisgICAgICAgIHNob3J0X2Rlc2MgPSBrcmF1dC0+TmFtZShXRVIpKyIgbGllZ3QgenVtIFRyb2NrbmVuIGltIEtlaW1rYXN0ZW4iOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgIi9kL2ViZW5lL2FyYXRob3JuL29yYWtlbC9yb29tL3plbHQiOgorICAgICAgICBtc2dfc2VsZiA9ICJEdSBsZWdzdCAiK2tyKyIgdm9yc2ljaHRpZyBhbnMgIgorICAgICAgICAgICJMYWdlcmZldWVyLiBEdSBzY2hhdXN0IHVuc2ljaGVyIHp1IENoaW5rdXdhaWxhLCBkb2NoIGRlciAiCisgICAgICAgICAgImFsdGUgU2NoYW1hbmUgbmlja3QgenVzdGltbWVuZCwgRHUgaGFzdCB3b2hsIGFsbGVzIHJpY2h0aWcgIgorICAgICAgICAgICJnZW1hY2h0LiI7CisgICAgICAgIG1zZ19vdGhlciA9IFBMLT5OYW1lKFdFUikrIiBsZWd0IGVpbmUgUGZsYW56ZSBhbnMgTGFnZXJmZXVlciwgd29obCAiCisgICAgICAgICAgInVtIHNpZSB6dSB0cm9ja25lbi4iOworICAgICAgICBzaG9ydF9kZXNjID0ga3JhdXQtPk5hbWUoV0VSKSsiIHdpcmQgZ2VyYWRlIGFtIExhZ2VyZmV1ZXIgZ2V0cm9ja25ldCI7CisgICAgICAgIGJyZWFrOworICAgICAgLyoKKyAgICAgICAqIFdVRVNURQorICAgICAgICovCisgICAgICBjYXNlICIvZC93dWVzdGUvdHN1bmFtaS9zY2h1bGUvcm9vbXMva3JhZXV0ZXIiOgorICAgICAgICBibG9ja2VyID0gb2JqZWN0cChwcmVzZW50X2Nsb25lKCIvZC93dWVzdGUvdHN1bmFtaS9zY2h1bGUvbW9uL2hleGUiLCAKKyAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoTUUpKSk7CisgICAgICAgIGlmICggIWJsb2NrZXIgKSB7CisgICAgICAgICAgbXNnX3NlbGYgPSAiRHUgc3RlY2tzdCAiK2tyKyIgaW4gTXVldHRlcmNoZW4gIgorICAgICAgICAgICAgIklzZXdpbmRzIFRyb2NrZW5vZmVuLCBkZXIgd29obGlnIHp1IGtuaXN0ZXJuIGJlZ2lubnQuIjsKKyAgICAgICAgICBtc2dfb3RoZXIgPSBQTC0+TmFtZShXRVIpKyIgbGVndCB2b3JzaWNodGlnIGVpbiBLcmF1dCAiOworICAgICAgICAgIHNob3J0X2Rlc2MgPSBrcmF1dC0+TmFtZShXRVIpKyIgd2lyZCBnZXJhZGUgaW0gT2ZlbiBnZXRyb2NrbmV0IjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBtc2dfc2VsZiA9ICJNdWV0dGVyY2hlbiBJc2V3aW5kIGhhZWx0IERpY2ggYXVmLCBzaWUgc2NoZWludCAiCisgICAgICAgICAgICAibmllbWFuZGVuIGFuIGlocmVuIFRyb2NrZW5vZmVuIGhlcmFubGFzc2VuIHp1IHdvbGxlbi4iOworICAgICAgICAgIG1zZ19vdGhlciA9IFBMLT5OYW1lKFdFUikrIiB3aXJkIHZvbiBNdWV0dGVyY2hlbiBJc2V3aW5kIGFuIGRlciAiCisgICAgICAgICAgICAiQmVudXR6dW5nIGRlcyBPZmVucyBnZWhpbmRlcnQuIjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIC8qCisgICAgICAgKiBXQUxECisgICAgICAgKi8KKyAgICAgIGNhc2UgIi9kL3dhbGQvZmVpZ2xpbmcvcXVlc3Qvcm9vbS9odWV0dGUzIjoKKyAgICAgICAgbXNnX3NlbGYgPSAiRHUgbGVnc3QgIitrcisiIHNvIG5haCBhbnMgRmV1ZXIsICIKKyAgICAgICAgICAid2llIER1IGdsYXVic3QsIGRhc3MgZXMgZGVyIFRyb2NrbnVuZyBuaWNodCBzY2hhZGV0LiI7CisgICAgICAgIG1zZ19vdGhlciA9IFBMLT5OYW1lKCkrIiBsZWd0IGVpbmUgUGZsYW56ZSBhbiBkaWUgS29jaHN0ZWxsZS4iOworICAgICAgICBzaG9ydF9kZXNjID0ga3JhdXQtPk5hbWUoV0VSKSsiIGxpZWd0IHp1bSBUcm9ja25lbiBhbiBkZXIgIgorICAgICAgICAgICJGZXVlcnN0ZWxsZSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAiL2Qvd2FsZC9sZXVzZWwvcXVlc3Qvcm9vbXMvbGFib3JzdWVkb3N0ZW4iOgorICAgICAgICBtc2dfc2VsZiA9ICJEdSBsZWdzdCAiK2tyKyIgaW4gZWlucyBkZXIgIgorICAgICAgICAgICJUb25zY2hpZmZjaGVuIHVuZCBzY2hpZWJzdCBlcyBpbiBkZW4gbWl0dGVsaGVpc3NlbiBPZmVuIGhpbmVpbi4gIgorICAgICAgICAgICJIb2ZmZW50bGljaCBnZWh0IGRhcyBndXQsIGVzIGtvbW10IERpciBkYSBkcmlubmVuIHNjaG9uIGZhc3QgenUgIgorICAgICAgICAgICJ3YXJtIGZ1ZXIgZWluZSBvcmRudW5nc2dlbWFlc3NlIFRyb2NrbnVuZyB2b3IuIjsKKyAgICAgICAgbXNnX290aGVyID0gUEwtPk5hbWUoV0VSKSsiIHNjaGllYnQgZWluIEtyYXV0IGluIGVpbmVtICIKKyAgICAgICAgICAiVG9uc2NoaWZmY2hlbiBpbiBlaW5lbiBkZXIgT2VmZW4gaGluZWluLCB1bSBlcyB6dSB0cm9ja25lbi4iOworICAgICAgICBzaG9ydF9kZXNjID0ga3JhdXQtPk5hbWUoV0VSKSsiIGRhbXBmdCBpbiBlaW5lbSBUb25zY2hpZmZjaGVuIGltICIKKyAgICAgICAgICAiZXJzdGVuIE9mZW4gdm9yIHNpY2ggaGluIjsKKyAgICAgICAgYnJlYWs7CisgICAgICAvKgorICAgICAgICogSU5TRUxOCisgICAgICAgKi8KKyAgICAgIGNhc2UgIi9kL2luc2Vsbi96ZXNzdHJhL3Z1bGthbndlZy9yb29tL3I4IjoKKyAgICAgICAgbXNnX3NlbGYgPSAiRHUgbGVnc3QgIitrcisiIHZvcnNpY2h0aWcgYXVmIGRpZSAiCisgICAgICAgICAgImhlaXNzZW4gRmVsc2VuIGluIGRlciBOYWVoZSBkZXMgTGF2YXNlZXMsIGF1ZiBkYXNzIGRpZSAiCisgICAgICAgICAgImhlaXNzZW4gV2luZGUgIitrcmF1dC0+UXVlcnlQcm9ub3VuKFdFTikrIiB0cm9ja25lbiBtb2VnZW4uIjsKKyAgICAgICAgbXNnX290aGVyID0gUEwtPk5hbWUoV0VSKSsiIGxlZ3QgZWluIEtyYXV0IGF1ZiBkZW4gRmVsc2VuIGFiLCB1bSBlcyAiCisgICAgICAgICAgInZvbiBkZXIgaGVpc3NlbiBMdWZ0IHRyb2NrbmVuIHp1IGxhc3Nlbi4iOworICAgICAgICBzaG9ydF9kZXNjID0ga3JhdXQtPk5hbWUoV0VSKSsiIGxpZWd0IHp1bSBUcm9ja25lbiBhdWYgZGVtIEZlbHNlbiI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAiL2QvaW5zZWxuL21pcmlsL3p5a2xvcGVuL3Jvb20vcGFsYXN0L2luc2VsMXA2IjoKKyAgICAgICAgLy8gUXVlcnlPdmVuKCkgbGllZmVydCAyIGZ1ZXIgIkZldWVyIiwgMSBmdWVyICJHbHV0IiwgMCBmdWVyICJhdXMiLgorICAgICAgICBzd2l0Y2ggKGVudmlyb25tZW50KE1FKS0+UXVlcnlPdmVuKCkpIHsKKyAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBtc2dfc2VsZiA9ICJEdSBsZWdzdCAiK2tyKyIgdm9yc2ljaHRpZyBhbiBkYXMgRmV1ZXIsIGRhcyBpbiAiCisgICAgICAgICAgICAgICJkZXIgRmV1ZXJzdGVsbGUgYnJlbm50LCBzb3Jnc2FtIGJlbXVlaHQsIGRhc3MgIisKKyAgICAgICAgICAgICAga3JhdXQtPlF1ZXJ5UHJvbm91bihXRVIpKyIgbmljaHQgenV2aWVsIEhpdHplIGFiYmVrb21tdC4iOworICAgICAgICAgICAgbXNnX290aGVyID0gUEwtPk5hbWUoV0VSKSsiIGxlZ3Qgc29yZ3NhbSBlaW4gS3JhdXQgaW4gZGllIE5hZWhlICIKKyAgICAgICAgICAgICAgImRlcyBGZXVlcnMsIGRhcyBpbiBkZXIgRmV1ZXJzdGVsbGUgYnJlbm50LiI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBtc2dfc2VsZiA9ICJEdSBsZWdzdCAiK2tyKyIgYW4gZGllIEZldWVyc3RlbGxlLCBwcnVlZnN0IGRpZSAiCisgICAgICAgICAgICAgICJIaXR6ZSB1bmQgcnVlY2tzdCAiK2tyYXV0LT5RdWVyeVByb25vdW4oV0VOKSsiIG5vY2ggZXR3YXMgIgorICAgICAgICAgICAgICAibmFlaGVyIGFuIGRpZSBHbHV0LCBkYW5uIHRyaXR0c3QgRHUgenVmcmllZGVuIGVpbmVuIFNjaHJpdHQgIgorICAgICAgICAgICAgICAienVydWVjay4iOworICAgICAgICAgICAgbXNnX290aGVyID0gUEwtPk5hbWUoV0VSKSsiIGxlZ3QgIitrcmF1dC0+bmFtZShXRU4pKyIgYW4gZGllICIKKyAgICAgICAgICAgICAgIkZldWVyc3RlbGxlLCBzY2h1YnN0IG5vY2ggZWluIHdlbmlnIGRhcmFuIGhlcnVtIHVuZCB0cml0dCAiCisgICAgICAgICAgICAgICJkYW5uIHZvbiBkZXIgR2x1dCB6dXJ1ZWNrLCAiK1BMLT5RdWVyeVByb25vdW4oV0VSKSsiIHNjaGVpbnQgIgorICAgICAgICAgICAgICAicmVjaHQgenVmcmllZGVuIHp1IHNlaW4uIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBibG9ja2VyPTE7CisgICAgICAgICAgICBtc2dfc2VsZiA9ICJJbiBkZW0gS2FtaW4gZmluZGVzdCBEdSBuaWNodCBlaW5tYWwgZXR3YXMgR2x1dCwgIgorICAgICAgICAgICAgICAiZ2VzY2h3ZWlnZSBkZW5uIG9mZmVuZXMgRmV1ZXIuIFNvIHdpcmQgZGFzIG1pdCBkZW0gVHJvY2tuZW4gIgorICAgICAgICAgICAgICAibmljaHRzLCB1bmQgYXVmIGRlbSBIZXJkIGlzdCBEaXIgZGFzIFJpc2lrbyB6dSBncm9zcywgZGFzcyAiCisgICAgICAgICAgICAgICJGZXR0IGF1cyBkZXIgUGZhbm5lIGF1ZiAiK2tyKyIgc3ByaXR6dC4iOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc2hvcnRfZGVzYyA9IGtyYXV0LT5OYW1lKFdFUikrIiBsaWVndCB6dW0gVHJvY2tuZW4gYW4gZGVyICIKKyAgICAgICAgICAiRmV1ZXJzdGVsbGUiOworICAgICAgICBicmVhazsKKyAgICAgIC8qCisgICAgICAgKiBQT0xBUgorICAgICAgICovCisgICAgICBjYXNlICIvZC9wb2xhci90aWxseS9sbHAvcmVudG5lci9rdWVjaGUiOgorICAgICAgICBtc2dfc2VsZiA9ICJEZXIgSGVyZCBnaWJ0IGVpbmUgaW5mZXJuYWxpc2NoZSBIaXR6ZSBhYi4gWnVtIEtvY2hlbiAiCisgICAgICAgICAgImlzdCBkYXMgdG9sbCwgYWJlciBEdSBicmF1Y2hzdCBkb2NoIGVpbmVuIE1vbWVudCwgdW0gZWluICIKKyAgICAgICAgICAiZ2VlaWduZXRlcyBQbGFldHpjaGVuIGZ1ZXIgIitrcisiIHp1IGZpbmRlbi4iOworICAgICAgICBtc2dfb3RoZXIgPSBQTC0+TmFtZShXRVIpKyIgbGVndCBlaW4gS3JhdXQgYXVmIGRlbiBoZWlzc2VuIEhlcmQgIgorICAgICAgICAgICJ1bmQgc2NoaWVidCBlcyB1bnJ1aGlnIG5vY2ggZWluIHdlbmlnIGhpbiB1bmQgaGVyLCBhbHMgd2FlcmUgIisKKyAgICAgICAgICBQTC0+UXVlcnlQcm9ub3VuKFdFTSkrIiBkaWUgSGl0emUgYmVpbmFoZSBlaW4gd2VuaWcgenUgZ3Jvc3MuIjsKKyAgICAgICAgc2hvcnRfZGVzYyA9IGtyYXV0LT5OYW1lKFdFUikrIiBsaWVndCBhdWYgZGVtIHNjaG1pZWRlZWlzZXJuZW4gIgorICAgICAgICAgICJIZXJkIjsKKyAgICAgICAgYnJlYWs7CisgICAgICAvKgorICAgICAgICogVkxBTkQKKyAgICAgICAqLworICAgICAgY2FzZSAiL2QvdmxhbmQvbW9yZ290aC9yb29tL2thdGEvdWthdDEzIjoKKyAgICAgICAgb2JqZWN0IGMgPSBwcmVzZW50X2Nsb25lKCIvZC92bGFuZC9tb3Jnb3RoL29iai9rYXRhL3JmZGNvcnBzZSIsIAorICAgICAgICAgICAgICBlbnZpcm9ubWVudChNRSkpOworICAgICAgICAvLyBCZXF1ZW1lciwgZGFzIGF1ZiAwIHp1IHNldHplbiwgd2VubidzIGtsYXBwdCwgYmVpIHNvdmllbGVuCisgICAgICAgIC8vIEhpbmRlcnVuZ3NncnVlbmRlbi4gOy0pCisgICAgICAgIGJsb2NrZXIgPSAxOworICAgICAgICAvLyBMZWljaGUgbGllZ3QgZGEuCisgICAgICAgIGlmICggb2JqZWN0cChjKSApIAorICAgICAgICB7CisgICAgICAgICAgLy8gRmV1ZXJkYWVtb24gYW53ZXNlbmQ6IGRlciBibG9ja3QgZGVuIFZlcnN1Y2gKKyAgICAgICAgICBpZiAoIHByZXNlbnRfY2xvbmUoIi9kL3ZsYW5kL21vcmdvdGgvbnBjL2thdGEvZmlyZWRlbW9uMyIsCisgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoTUUpKSApIAorICAgICAgICAgIHsKKyAgICAgICAgICAgIG1zZ19zZWxmID0gIkRlciBGZXVlcmRhZW1vbiBkcm9odCBEaXIgbWl0IHNlbmdlbmRlciBIb2VsbGVucGVpbi4gIgorICAgICAgICAgICAgICAiQmVzY2h3aWNodGlnZW5kIHRyaXR0c3QgRHUgZWluZW4gU2Nocml0dCB6dXJ1ZWNrLiI7CisgICAgICAgICAgICBtc2dfb3RoZXIgPSBQTC0+TmFtZShXRVIpKyIgdHJpdHQgYXVmIGRlbiBBc2NoZWhhdWZlbiB6dSwgd2lyZCAiCisgICAgICAgICAgICAgICJhYmVyIHZvbiBkZW0gRmV1ZXJkYWVtb24gYmVkcm9odCB1bmQgd2VpY2h0IHdpZWRlciB6dXJ1ZWNrLiI7CisgICAgICAgICAgfQorICAgICAgICAgIC8vIEFzY2hlaGF1ZmVuIG5pY2h0IG1laHIgaGVpc3MgZ2VudWc/CisgICAgICAgICAgZWxzZSBpZiAoIGMtPlF1ZXJ5RGVjYXkoKTwyICkgeworICAgICAgICAgICAgbXNnX3NlbGYgPSBjLT5OYW1lKFdFUiwxKSsiIGlzdCBzY2hvbiB6dSBzZWhyIGFiZ2VrdWVobHQgdW5kICIKKyAgICAgICAgICAgICAgInd1ZXJkZSBuaWNodCBtZWhyIGdlbnVnIEhpdHplIHNwZW5kZW4sIHVtICIra3IrIiB6dSB0cm9ja25lbi4iOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIAorICAgICAgICAgIHsKKyAgICAgICAgICAgIGJsb2NrZXIgPSAwOworICAgICAgICAgICAgbXNnX3NlbGYgPSAiRGljaCB2b3JzaWNodGlnIHVtc2NoYXVlbmQsIGxlZ3N0IER1ICIra3IrIiBpbiBkaWUgIgorICAgICAgICAgICAgICAiTmFlaGUgIitjLT5uYW1lKFdFU1NFTiwxKSsiLiBIb2ZmZW50bGljaCBnZWxpbmd0IGRhcyBpbiAiCisgICAgICAgICAgICAgICJkaWVzZXIgdW53aXJ0bGljaGVuIFVtZ2VidW5nISI7CisgICAgICAgICAgICBtc2dfb3RoZXIgPSBQTC0+TmFtZShXRVIpKyIgYmV1Z3Qgc2ljaCB6dW0gQm9kZW4gaGludW50ZXJuIHVuZCAiCisgICAgICAgICAgICAgICJsZWd0IHZvcnNpY2h0aWcgZWluIEtyYXV0IGluIGRpZSBOYWVoZSAiK2MtPm5hbWUoV0VTU0VOLDEpKyIuIjsKKyAgICAgICAgICB9CisgICAgICAgICAgc2hvcnRfZGVzYyA9IGtyYXV0LT5OYW1lKFdFUikrIiBsaWVndCBuZWJlbiAiK2MtPm5hbWUoV0VNLDEpKworICAgICAgICAgICAgIiwgb2ZmZW5iYXIgc29sbCAiK2tyYXV0LT5RdWVyeVByb25vdW4oV0VSKSsiIGdldHJvY2tuZXQgd2VyZGVuIjsKKyAgICAgICAgfQorICAgICAgICAvLyBLZWluZSBMZWljaGUgZGE/IERhbm4gZ2VodCdzIG5pY2h0LgorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBtc2dfc2VsZiA9ICJHZW5hdXNvd2VuaWcsIHdpZSBEaXIgZGllIEZsYW1tZW4gaW4gZGllc2VtIEluZmVybm8gIgorICAgICAgICAgICAgImV0d2FzIGFuaGFiZW4ga29lbm5lbiwgc28gd2VuaWcga2FubnN0IER1IHNpZSBudXR6ZW4sIHVtICIrCisgICAgICAgICAgICBrcisiIHp1IHRyb2NrbmVuLiI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICIvZC92bGFuZC9tb3Jnb3RoL3Jvb20va2F0YS9rYXRhNSI6CisgICAgICAgIG9iamVjdCBvYiA9IHByZXNlbnRfY2xvbmUoIi9kL3ZsYW5kL21vcmdvdGgvbnBjL2thdGEvZ2hvc3QiLAorICAgICAgICAgICAgZW52aXJvbm1lbnQoTUUpKTsKKyAgICAgICAgYmxvY2tlciA9IDE7CisgICAgICAgIC8vIEdlaXN0IGFud2VzZW5kPyBLZWluZSBDaGFuY2UuCisgICAgICAgIGlmICggb2JqZWN0cChvYikgKSB7CisgICAgICAgICAgbXNnX3NlbGYgPSBvYi0+TmFtZShXRVIsMSkrIiBzdG9lcnQgRGljaCBpbiBEZWluZXIgS29uemVudHJhdGlvbiwgIgorICAgICAgICAgICAgIkR1IGthbm5zdCBzbyBuaWNodCBhcmJlaXRlbiEiOworICAgICAgICB9CisgICAgICAgIC8vIFVtZ2VidW5nIG5vY2ggbmVibGlnPyBEYW5uIG5pY2h0IHRyb2NrbmVuLgorICAgICAgICBlbHNlIGlmICggZW52aXJvbm1lbnQoTUUpLT5RdWVyeUZvZygpICkgeworICAgICAgICAgIG1zZ19zZWxmID0gIkluIGRpZXNlbSB2ZXJkYW1tdGVuIE5lYmVsIGlzdCBhYnNvbHV0IG5pY2h0cyB6dSAiCisgICAgICAgICAgICAic2VoZW4uIEF1c3NlcmRlbSBpc3QgZXMgaGllciB2aWVsIHp1IGZldWNodCwgIitrcisiIHd1ZXJkZSAiCisgICAgICAgICAgICAib2huZWhpbiBudXIgdm9yIERlaW5lciBOYXNlIHdlZ3NjaGltbWVsbi4iOworICAgICAgICB9CisgICAgICAgIC8vIEZldWVyIGJyZW5udCBudXIgbm9jaCA5MCBTZWt1bmRlbj8gRGFubiBsb2hudCBzaWNoIGRhcyBuaWNodC4KKyAgICAgICAgZWxzZSBpZiAoIHF1ZXJ5X25leHRfcmVzZXQoZW52aXJvbm1lbnQoKSkgPCB0aW1lKCkrOTAgKSB7CisgICAgICAgICAgbXNnX3NlbGYgPSAiRWluIHBydWVmZW5kZXIgQmxpY2sgYXVmIGRhcyBGZXVlciB6ZWlndCBEaXIsIGRhc3MgIgorICAgICAgICAgICAgImVzIHdvaGwgbmljaHQgbWVociBsYW5nZSBnZW51ZyBicmVubmVuIHdpcmQsIHVtICIra3IrIiBub2NoICIKKyAgICAgICAgICAgICJlcmZvbGdyZWljaCB0cm9ja25lbiB6dSBrb2VubmVuLiI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgYmxvY2tlciA9IDA7CisgICAgICAgICAgbXNnX3NlbGYgPSAiRHUgbGVnc3QgIitrcisiIGluIGFuZ2VtZXNzZW5lbSBBYnN0YW5kIHp1bSBGZXVlciAiCisgICAgICAgICAgICAiYXVmIGRlbiBCb2RlbiB1bmQgd2FydGVzdCBnZXNwYW5udCwgb2IgRGlyIGhpZXIgd29obCBlaW5lICIKKyAgICAgICAgICAgICJicmF1Y2hiYXJlIFRyb2NrbnVuZyBnZWxpbmdlbiB3aXJkLiI7CisgICAgICAgICAgbXNnX290aGVyID0gUEwtPk5hbWUoV0VSKSsiIGJ1ZWNrdCBzaWNoIHp1bSBCb2RlbiB1bmQgbGVndCBldHdhcyAiCisgICAgICAgICAgICAiYW5zIEZldWVyLCBhbnNjaGVpbmVuZCBlaW4gS3JhdXQsIGRhcyAiK1BMLT5RdWVyeVByb25vdW4oV0VSKSsKKyAgICAgICAgICAgICIgdHJvY2tuZW4gd2lsbC4iOworICAgICAgICAgIHNob3J0X2Rlc2MgPSBrcmF1dC0+TmFtZShXRVIpKyIgbGllZ3QgenVtIFRyb2NrbmVuIGFtIEZldWVyIjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgIi9kL3ZsYW5kL2FsbGUva29vbWlfdi93c2NoZW5rZS9yb29tL3dhbGRzY2hlbmtlIjoKKyAgICAgICAgbXNnX3NlbGYgPSAiRGllc2VyIEthY2hlbG9mZW4gaXN0IHVuZ2VtZWluIHByYWt0aXNjaC4gRHUgbGVnc3QgIisKKyAgICAgICAgICBrcisiIGVpbmZhY2ggb2JlbiBkcmF1ZiwgdW5kIGRpZSBrdXNjaGVsaWdlIFdhZXJtZSB0cm9ja25ldCAiKworICAgICAgICAgIGtyYXV0LT5RdWVyeVByb25vdW4oV0VOKSsiIGJlaW5haGUgdm9uIHNlbGJzdC4iOworICAgICAgICBtc2dfb3RoZXIgPSBQTC0+TmFtZShXRVIpKyIgbGVndCBlaW4gS3JhdXQgenVtIFRyb2NrbmVuIG9iZW4gYXVmICIKKyAgICAgICAgICAiZGVuIEthY2hlbG9mZW4sIG9mZmVuYmFyIHJlY2h0IGFuZ2V0YW4gdm9uIGRlc3NlbiBrdXNjaGVsaWdlciAiCisgICAgICAgICAgIldhZXJtZS4iOworICAgICAgICBzaG9ydF9kZXNjID0ga3JhdXQtPk5hbWUoV0VSKSsiIGxpZWd0IHp1bSBUcm9ja25lbiBhdWYgZGVtICIKKyAgICAgICAgICAiS2FjaGVsb2ZlbiI7CisgICAgICAgIGJyZWFrOworICAgICAgLyoKKyAgICAgICAqIERFQlVHWldFQ0tFCisgICAgICAgKi8KKyAgICAgIGNhc2UgIi9wbGF5ZXJzL2FyYXRob3JuL3dvcmtyb29tIjoKKyAgICAgICAgbXNnX3NlbGYgPSAiRHUgaGFlbHRzdCBkYXMgS3JhdXQgdm9ycyBGZXVlciB1bmQgYmVnaW5uc3QgZGllICIKKyAgICAgICAgICAiVHJvY2tudW5nLiI7CisgICAgICAgIG1zZ19vdGhlciA9IFBMLT5OYW1lKFdFUikrIiBzY2hpY2t0IHNpY2ggYW4sIGVpbiBLcmF1dCBhbSBGZXVlciB6dSAiCisgICAgICAgICAgInRyb2NrbmVuLiI7CisgICAgICAgIHNob3J0X2Rlc2MgPSBrcmF1dC0+TmFtZShXRVIpKyIgbGllZ3QgenVtIFRyb2NrbmVuIGFtIEZldWVyIjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIC8vIFJhdW1tZWxkdW5nZW4gZW50c3ByZWNoZW5kIGRlciBlaW5nZXN0ZWxsdGVuIFRleHRlIGF1c2dlYmVuLgorICAgIHRlbGxfb2JqZWN0KFBMLCBCUyhtc2dfc2VsZikpOworICAgIGlmICggbXNnX290aGVyICkKKyAgICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudChNRSksIEJTKG1zZ19vdGhlciksICh7UEx9KSk7CisgICAgLy8gQ2FsbG91dCBzdGFydGVuLCB3ZW5uIG5pZW1hbmQgZGFzIFRyb2NrbmVuIHZlcmhpbmRlcnQuCisgICAgaWYgKCAhYmxvY2tlciApCisgICAgICBjYWxsX291dCgjJ2RyeV9wbGFudCwgZHJ5aW5nX2RlbGF5LCBrcmF1dCwgY2FsbG91dF9tc2dzKTsKKyAgICAvLyBBbnNvbnN0ZW4gZGFzIEtyYXV0IGluIGRlbiBTcGllbGVyIHp1cnVlY2ssIGRhcyBqYSBvYmVuIHNjaG9uCisgICAgLy8gaW4gZGVuIFRyb2NrbmVyIGJld2VndCB3dXJkZS4KKyAgICBlbHNlIHsKKyAgICAgIGtyYXV0LT5tb3ZlKFBMLCBNX0dFVCk7CisgICAgfQorICB9CisgIHJldHVybiAxOworfQorCisvLyBLcmF1dCB3aXJkIGdldHJvY2tuZXQsIHNvZmVybiBkZXIgU3BpZWxlciBub2NoIGltIFJhdW0gaXN0LCAuLi4KK3ByaXZhdGUgdm9pZCBkcnlfcGxhbnQob2JqZWN0IGtyYXV0LCBzdHJpbmcgKm1zZ3MpIHsKKyAgaWYgKCBvYmplY3RwKFBMKSAmJiBlbnZpcm9ubWVudChQTCkgPT0gZW52aXJvbm1lbnQoTUUpICkgeworICAgIHRlbGxfb2JqZWN0KFBMLCBCUyhtc2dzWzBdKSk7CisgICAgdGVsbF9yb29tKGVudmlyb25tZW50KE1FKSwgQlMobXNnc1sxXSksICh7UEx9KSk7CisgICAga3JhdXQtPm1vdmUoUEwsIE1fR0VUKTsKKyAgICBrcmF1dC0+RHJ5UGxhbnQoZHJ5aW5nX3F1YWxpdHkpOworICB9CisgIC8vIC4uLiBhbnNvbnN0ZW4gbGFldWZ0IGRpZSBUcm9ja251bmcgd2VpdGVyLCB1bmQgZGFzIEtyYXV0IHZlcmJyZW5udC4KKyAgZWxzZSB7CisgICAgdGVsbF9yb29tKE1FLCBCUyhrcmF1dC0+TmFtZShXRVIsMSkrIiB3aXJkIGV4dHJlbSBkdW5rZWwsIGJhbGQgd2lyZCAiKworICAgICAga3JhdXQtPlF1ZXJ5UHJvbm91bihXRVIpKyIgenUgbmljaHRzIG1laHIgenUgZ2VicmF1Y2hlbiBzZWluISIpKTsKKyAgICAvLyBEYXMgRGVsYXkgZnVlciBkaWVzZW4gendlaXRlbiBDYWxsb3V0IGlzdCBpbW1lciBmaXguIEtvbW10IGhvZmZlbnRsaWNoCisgICAgLy8gc2VsdGVuIGdlbnVnIHZvciB1bmQgYnJhdWNodCBkYWhlciBlaGVyIG5pY2h0IGV4dHJhIGF1cyBkZW0gTWFzdGVyCisgICAgLy8gZ2Vob2x0IHp1IHdlcmRlbi4KKyAgICBjYWxsX291dCgjJ2Rlc3Ryb3lfaGVyYiwgMjAsIGtyYXV0KTsKKyAgfQorfQorCisvLyBaZXJzdG9lcnVuZyBkZXMgS3JhdXRlcy4gRGEgZGllIEtyYXV0b2JqZWt0ZSBzZWxic3QgZWluZSBNZWxkdW5nIAorLy8gYXVzZ2ViZW4sIHdlbm4gRHJ5UGxhbnQoMCkgZ2VydWZlbiB3aXJkLCB3aXJkIGVyc3QgZGFzIEtyYXV0IGlucworLy8gRW52aXJvbm1lbnQgYmV3ZWd0IHVuZCBlcnN0IGRhbmFjaCBkaWUgRnVua3Rpb24gZ2VydWZlbi4KK3ByaXZhdGUgdm9pZCBkZXN0cm95X2hlcmIob2JqZWN0IGtyYXV0KSB7CisgIGtyYXV0LT5tb3ZlKGVudmlyb25tZW50KE1FKSxNX1BVVCk7CisgIGtyYXV0LT5EcnlQbGFudCgwKTsKK30KKworLy8gTnVyIGRpZSBrb3JyZWt0ZW4gS3JhdXRvYmpla3RlIGtvZW5uZW4gaW4gZGVuIFRyb2NrbmVyIGJld2VndCB3ZXJkZW4uCisvLyBTY2h1ZXR6dCBuYXR1ZXJsaWNoIG5pY2h0IHZvciBNX05PQ0hFQ0ssIGFiZXIgd2VubiBkYXMgdm9ya29tbWVuIHNvbGx0ZSwKKy8vIG11c3MgdmllbGxlaWNodCBub2NoIHdlaXRlciBhYmdlc2ljaGVydCB3ZXJkZW4sIG9kZXIgZGVyIHZlcnVyc2FjaGVuZGUKKy8vIE1hZ2llciBhdXNnZXNjaGltcGZ0LiA7LSkgCit2YXJhcmdzIGludCBQcmV2ZW50SW5zZXJ0KG9iamVjdCBvYikgeworICBpZiAobG9hZF9uYW1lKG9iKSA9PSBQTEFOVElURU0gJiYgY2xvbmVwKG9iKSkgCisgICAgcmV0dXJuIDo6UHJldmVudEluc2VydChvYik7CisgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvaXRlbXMva3JhZXV0ZXIvdmlydHVhbF9jb21waWxlci5jIGIvaXRlbXMva3JhZXV0ZXIvdmlydHVhbF9jb21waWxlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ODM3MGUKLS0tIC9kZXYvbnVsbAorKysgYi9pdGVtcy9rcmFldXRlci92aXJ0dWFsX2NvbXBpbGVyLmMKQEAgLTAsMCArMSwzMDAgQEAKKy8vIChjKSBieSBQYWRyZWljIChQYWRyZWljQG1nLm11ZC5kZSkKKworI3ByYWdtYSBub19pbmhlcml0LG5vX2Nsb25lLHN0cm9uZ190eXBlcyxydHRfY2hlY2tzCisKKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHZfY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxpdGVtcy9rcmFldXRlci9rcmFldXRlci5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorCitpbmhlcml0ICIvc3RkL3ZpcnR1YWwvdl9jb21waWxlciI7Citpbmhlcml0ICIvc3RkL3RoaW5nL2xhbmd1YWdlIjsKK2luaGVyaXQgIi9zdGQvdGhpbmcvZGVzY3JpcHRpb24iOworCisvLyBtaXQgSGlsZmUgZGllc2VzIG1hcHBpbmdzIGtvbW10IG1hbiBzb3dvaGwgYW4gZGllIElEIHVuZCBkaWUgRWlnZW5zY2hhZnRlbiwKKy8vIGFscyBhdWNoIGFuIGRpZSBMaXN0ZSBkZXIgUmFldW1lIGluIGRlbmVuIGRhcyBLcmF1dCBtaXQgZGVtIGZpbGVuYW1lbiByb29tCisvLyBnZWZ1bmRlbiB3ZXJkZW4ga2Fubi4KKy8vIChbICJrZXkiOiAoeyAoe2VpZ2Vuc2NoYWZ0ZW59KSwgKFtyYWV1bWVdKSB9KSBdKQorcHJpdmF0ZSBtYXBwaW5nIGtyYXV0ZGF0ZW47CisKKy8vIEFOOiBlbnRoYWVsdCBkaWUgTGlzdGUgZGVyIGd1ZWx0aWdlbiBLcmFldXRlci1EYXRlaW5hbWVuIG9obmUgLmMKKy8vIGFtIEVuZGUuIEljaCB2ZXJtdXRlLCBkYXNzIGVzIGRlc3dlZ2VuIGVpbiBNYXBwaW5nIGlzdCwgZGFtaXQgaW4gCisvLyBWYWxpZGF0ZSgpIGVpbmZhY2ggbWVtYmVyKCkgZHJhdWYgZ2VtYWNodCB3ZXJkZW4ga2FubiB1bmQgbWFuIG51ciAwLzEKKy8vIGFscyBSdWVja2dhYmV3ZXJ0ZSBwcnVlZmVuIG11c3MsIHN0YXR0IC0xIGJlaSBuZW0gbWVtYmVyKCkgYXVmIGVpbiBBcnJheS4KK3ByaXZhdGUgbWFwcGluZyB2YWxpZGZpbGVzOworCitwdWJsaWMgdm9pZCB1cGRhdGUobWFwcGluZyBkYXRhKQoreworICBpZiAocHJldmlvdXNfb2JqZWN0KCkgPT0gZmluZF9vYmplY3QoUExBTlRNQVNURVIpKQorICB7CisgICAga3JhdXRkYXRlbiA9IGRhdGE7CisgICAgdmFsaWRmaWxlcyA9IG1rbWFwcGluZyhtX2luZGljZXMoa3JhdXRkYXRlbikpOworICB9Cit9CisKKy8vIFdpcmQgYmVudXR6dCwgdW0ga3VyemUgSURzIHZvbiBLcmFldXRlcm4genUgcmF0ZW4uIERpZXNlIElEcyB3ZXJkZW4KKy8vIGVpbmdldHJhZ2VuLCB3ZW5uIGRlciBLcmF1dG5hbWUgZGllIElEIGFscyBUZWlsc3RyaW5nIGVudGhhZWx0LgorI2RlZmluZSBJRExJU1QgKHsgImtsZWUiLCAicmViZSIsICJoYWhuZW5mdXNzIiwgInJldHRpY2giLCAia3JhdXQiLCAid3VyeiIsXAorICAgICAgICAgICAgICAgICAgICAgIm1vb3MiLCAiZW56aWFuIiwgInJhdXRlbndpY2tlIiwgInBpbHoiLCAibmVsa2UiLFwKKyAgICAgICAgICAgICAgICAgICAgICJsaWNodG5lbGtlIiwgIndpY2tlIiwgInp3aWViZWwiLCAiaGFuZiIsICJrcmVzc2UifSkKKwordm9pZCBjcmVhdGUoKQoreworICAgc2V0ZXVpZChnZXR1aWQoKSk7CisKKyAgIHZfY29tcGlsZXI6OmNyZWF0ZSgpOworICAgZGVzY3JpcHRpb246OmNyZWF0ZSgpOworCisgICBTZXRQcm9wKFBfQ09NUElMRVJfUEFUSCwgX19ESVJfXyk7CisgICBTZXRQcm9wKFBfU1REX09CSkVDVCwgUExBTlRJVEVNKTsKKyAgIAorICAgUExBTlRNQVNURVItPlVwZGF0ZVZDKCk7Cit9CisKK3N0cmluZyBWYWxpZGF0ZShzdHJpbmcgZmlsZSkKK3sKKyAgIGlmICghc3RyaW5ncChmaWxlKSkgcmV0dXJuIDA7CisgICBmaWxlID0gOjpWYWxpZGF0ZShleHBsb2RlKGZpbGUsICIjIilbMF0pOworI2lmIE1VRE5BTUUgPT0gIk1vcmdlbkdyYXVlbiIKKyAgIHJldHVybiAobWVtYmVyKHZhbGlkZmlsZXMsIGZpbGUpID8gZmlsZSA6IDApOworI2Vsc2UKKyAgIHJldHVybiBmaWxlOworI2VuZGlmCit9CisKK3ByaXZhdGUgbm9zYXZlIG9iamVjdCBzaW11bF9lZnVuOworCisvLyBmdWVyIFNJTVVMX0VGVU5fRklMRQorI2luY2x1ZGUgPGNvbmZpZy5oPgorCisvLyBBTjogRnVua3Rpb24gbGllZmVydCBkYXMgY2xvbmVuZGUgT2JqZWt0IGFscyBkZXNzZW4gQmx1ZXByaW50LU5hbWVuLAorLy8gaW5kZW0gZXMgZGVuIENhbGxlci1TdGFjayBkdXJjaGxhZXVmdCB1bmQgbmFjaCBlaW5lbSBPYmpla3Qgc3VjaHQsCisvLyBkYXMgd2VkZXIgZGVyIE1hc3Rlciwgbm9jaCBlaW4gU2ltdWwtRWZ1bi1PYmpla3QsIG5vY2ggZGllc2VyIFZDIHNlbGJzdAorLy8gaXN0LiBEZXIgTmFtZSBkZXMgZ2VmdW5kZW5lbiBPYmpla3RzIHdpcmQgenVydWVja2dlZ2ViZW4sIG9kZXIgMC4KK25vbWFzayBwcml2YXRlIHN0cmluZyBnZXRfY2xvbmVyKCkKK3sKKyAgIGludCBpOworICAgb2JqZWN0IHBvOworCisgICBpZiAoIXNpbXVsX2VmdW4pCisgICB7CisgICAgICBpZiAoIShzaW11bF9lZnVuPWZpbmRfb2JqZWN0KFNJTVVMX0VGVU5fRklMRSkpKQorICAgICAgICAgc2ltdWxfZWZ1bj1maW5kX29iamVjdChTUEFSRV9TSU1VTF9FRlVOX0ZJTEUpOworICAgfQorICAgLy8gd2VubiBzaWUgamV0enQgbmljaHQgZXhpc3RpZXJ0IC0gYXVjaCBndXQsIGRhbm4gZ2lidCBlcyBoYWx0IGtlaW5lCisgICAvLyBzZWZ1bnMuCisKKyAgIGZvciAoaT0wOyBwbz1wcmV2aW91c19vYmplY3QoaSk7IGkrKykKKyAgIHsKKyAgICAgIGlmIChwbz09bWFzdGVyKCkgfHwgcG89PXNpbXVsX2VmdW4gfHwgcG89PU1FIHx8IHBvPT1wcmV2aW91c19vYmplY3QoKSkKKyAgICAgICAgIGNvbnRpbnVlOworICAgICAgcmV0dXJuIEJMVUVfTkFNRShwbyk7CisgICB9CisgICByZXR1cm4gMDsKK30KKworLy8gS29uZmlndXJpZXJ0IGRhcyBlcnpldWd0ZSBPYmpla3QgZW50c3ByZWNoZW5kIGRlciBkYWZ1ZXIgaW0gS3JhZXV0ZXJtYXN0ZXIKKy8vIGJla2FubnRlbiBEYXRlbi4gVmVyZ2lidCBhdWYgZGllIFBsYW50LUlELgordmFyYXJncyBzdHJpbmcgQ3VzdG9taXplT2JqZWN0KHN0cmluZyBmaWxlKQoreworICAgaWYgKHByZXZpb3VzX29iamVjdCgpLT5RdWVyeVBsYW50SWQoKSkgcmV0dXJuIDA7IC8vIGJlcmVpdHMgaW5pdGlhbGlzaWVydAorICAgCisgICBpZiAoc3RyaW5ncChmaWxlKSkKKyAgICAgIGZpbGU9VmFsaWRhdGUoZmlsZSk7CisgICBlbHNlIGZpbGU9OjpDdXN0b21pemVPYmplY3QoKTsKKyAgIGlmICghZmlsZSkgcmV0dXJuIDA7CisKKyAgIGNsb3N1cmUgc3A9c3ltYm9sX2Z1bmN0aW9uKCJTZXRQcm9wIiwgcHJldmlvdXNfb2JqZWN0KCkpOworICAgbWl4ZWQgYXJyPWtyYXV0ZGF0ZW5bZmlsZV07CisgICBpZiAocG9pbnRlcnAoYXJyKSkKKyAgIHsKKyAgICAgIC8vIFdlbGNoZXMgT2JqZWt0IGNsb250IGRhcyBGaWxlPworICAgICAgc3RyaW5nIGNsb25lciA9IGdldF9jbG9uZXIoKTsKKyAgICAgIHN0cmluZyByb29tcyA9IGFyclsxXTsKKyAgICAgIG1peGVkIHByb3BzID0gYXJyWzBdOworICAgICAgLy8gV2lyZCBkYXMgS3JhdXQgbGVnYWwgdm9uIGVpbmVtIGVpbmdldHJhZ2VuZW4gQ2xvbmVyIGVyemV1Z3Q/IE51ciBkYW5uCisgICAgICAvLyBiZWtvbW10IGVzIGVpbmUgZ3VlbHRpZ2UgUGxhbnQtSUQuCisgICAgIGludCBsZWdhbD1tZW1iZXIocm9vbXMsIGdldF9jbG9uZXIoKSkgfHwgY2xvbmVyPT1QTEFOVE1BU1RFUjsKKyAgICAgaWYgKCFsZWdhbCAmJiB0aGlzX2ludGVyYWN0aXZlKCkgJiYgSVNfQVJDSCh0aGlzX2ludGVyYWN0aXZlKCkpKQorICAgICAgICBsZWdhbD0xOworICAgICAKKyAgICAgIC8vIEtvbmZpZ3VyaWVydCB3aXJkIGRhcyBPYmpla3QgZGFubiwgd2VubiBlcyBwZXIgVkMgZXJ6ZXVndCB3aXJkIG9kZXIKKyAgICAgIC8vIGVpbiBDbG9uZSBlaW5lciBwZXIgVkMgZXJ6ZXVndGVuIEJQIGlzdCAtIGQuaC4gd2VubiBlcyBuaWNodCBhdXMKKyAgICAgIC8vIGVpbmVtIHJlYWwgZXhpc3RpZXJlbmRlbiBGaWxlIGF1ZiBkZXIgUGxhdHRlIGV4aXN0aWVydC4gRGFzIGlzdCBkYW5uCisgICAgICAvLyBkZXIgRmFsbCwgd2VubiBkZXIgTG9hZG5hbWUgZ2xlaWNoIGRlbSBTdGFuZGFyZHBsYW50b2JqZWt0IGRlcyBWQworICAgICAgLy8gaXN0LgorICAgICAgaWYgKGxvYWRfbmFtZShwcmV2aW91c19vYmplY3QoKSk9PVBMQU5USVRFTSkKKyAgICAgIHsKKyAgICAgICAgaWYgKChwcm9wc1tJTkdSRURJRU5UX05BTUVdPT0iS2xlZSIpIHx8CisgICAgICAgICAgICAocHJvcHNbSU5HUkVESUVOVF9OQU1FXVs8NC4uXT09ImtsZWUiKSkgeworICAgICAgICAgICBmdW5jYWxsKHNwLCBQX05BTUUsICh7IHByb3BzW0lOR1JFRElFTlRfTkFNRV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHNbSU5HUkVESUVOVF9OQU1FXSsicyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHNbSU5HUkVESUVOVF9OQU1FXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wc1tJTkdSRURJRU5UX05BTUVdfSkpOworICAgICAgICB9CisgICAgICAgIGVsc2UgZnVuY2FsbChzcCwgUF9OQU1FLCAgICAgcHJvcHNbSU5HUkVESUVOVF9OQU1FXSk7CisgICAgICAgIGZ1bmNhbGwoc3AsIFBfTkFNRV9BREosIHByb3BzW0lOR1JFRElFTlRfQURKXSk7CisgICAgICAgIGZ1bmNhbGwoc3AsIFBfR0VOREVSLCAgIHByb3BzW0lOR1JFRElFTlRfR0VOREVSXSk7CisgICAgICAgIGZ1bmNhbGwoc3AsIFBfTE9ORywgICAgIHByb3BzW0lOR1JFRElFTlRfTE9OR10pOworICAgICAgICBmdW5jYWxsKHNwLCBQTEFOVF9ST09NREVUQUlMLCBwcm9wc1tJTkdSRURJRU5UX1JPT01ERVRBSUxdKTsKKyAgICAgICAgaWYgKHByb3BzW0lOR1JFRElFTlRfREVNT05dPT1SQVcpIHsKKyAgICAgICAgICAgZnVuY2FsbChzcCwgUF9BUlRJQ0xFLCAwKTsKKyAgICAgICAgICAgZnVuY2FsbChzcCwgUF9TSE9SVCwgcHJldmlvdXNfb2JqZWN0KCktPk5hbWUoV0VSKSk7CisgICAgICAgICAgIGZ1bmNhbGwoc3AsIFBfQVJUSUNMRSwgMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBmdW5jYWxsKHNwLCBQX1NIT1JULAorICAgICAgICAgICAgIHByZXZpb3VzX29iamVjdCgpLT5OYW1lKFdFUixwcm9wc1tJTkdSRURJRU5UX0RFTU9OXSkpOworICAgICAgICBwcmV2aW91c19vYmplY3QoKS0+QWRkSWQobG93ZXJzdHJpbmcocHJvcHNbSU5HUkVESUVOVF9OQU1FXSkpOworICAgICAgICAvLyBiZWkgenVzYW1tZW5nZXNldHp0ZW4gTmFtZW4sIGF1Y2ggZGVuIGhhdXB0bmFtZW4gYWt6ZXB0aWVyZW4KKyAgICAgICAgc3RyaW5nIHN0cj1sb3dlcnN0cmluZyhwcm9wc1tJTkdSRURJRU5UX05BTUVdKTsKKyAgICAgICAgc3RyaW5nICpuYW1lcz1leHBsb2RlKHN0ciwgIi0iKTsKKyAgICAgICAgaWYgKHNpemVvZihuYW1lcyk+MSkgcHJldmlvdXNfb2JqZWN0KCktPkFkZElkKG5hbWVzWzwxXSk7CisgICAgICAgIG5hbWVzPWV4cGxvZGUoc3RyLCAiICIpOworICAgICAgICBpZiAoc2l6ZW9mKG5hbWVzKT4xKSBwcmV2aW91c19vYmplY3QoKS0+QWRkSWQobmFtZXNbPDFdKTsKKyAgICAgICAgZm9yZWFjaChzdHJpbmcgaWQ6IElETElTVCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChzdHJzdHIoc3RyLCBpZCk9PS0xKSBjb250aW51ZTsKKyAgICAgICAgICBwcmV2aW91c19vYmplY3QoKS0+QWRkSWQoaWQpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vIEFkamVjdGl2ZSB2b3JoZXIgZGVrbGluaWVyZW4KKyAgICAgICAgc3RyPXByb3BzW0lOR1JFRElFTlRfQURKXTsKKyAgICAgICAgaWYgKHN0cmluZ3Aoc3RyKSkKKyAgICAgICAgeworICAgICAgICAgIHN0cj1EZWNsQWRqKGxvd2Vyc3RyaW5nKHN0ciksIFdFTiwgMCk7CisgICAgICAgICAgcHJldmlvdXNfb2JqZWN0KCktPkFkZEFkamVjdGl2ZShzdHIpOworICAgICAgICB9CisgICAgICB9ICAvLyBFbmRlIEtvbmZpZ3VyYXRpb24gZWluZXMgVkMtZXJ6ZXVndGVuIE9iamVrdHMKKyAgICAgIC8vIFBsYW50LUlEIHdpcmQgZnVlciBhbGxlIE9iamVrdGUgYXVmIGlyZ2VuZHdhcyBnZXNldHp0LgorICAgICAgcHJldmlvdXNfb2JqZWN0KCktPlNldFBsYW50SWQobGVnYWwgPyBwcm9wc1tJTkdSRURJRU5UX0lEXSA6IC0xKTsKKyAgIH0KKyAgIC8vIEtlaW5lIEtyYXV0ZGF0ZW4gYmVrYW5udC4uLgorICAgZWxzZQorICAgeworICAgICBmdW5jYWxsKHNwLCBQX05BTUUsICAgICAiS3JhdXQiKTsKKyAgICAgZnVuY2FsbChzcCwgUF9HRU5ERVIsICAgTkVVVEVSKTsKKyAgICAgZnVuY2FsbChzcCwgUF9TSE9SVCwgICAgIkVpbiBUZXN0a3JhdXQgKCIrY2FwaXRhbGl6ZShmaWxlKSsiKSIpOworICAgICBmdW5jYWxsKHNwLCBQX0xPTkcsICAgICAiRWluIG5pY2h0IG5hZWhlciBzcGV6aWZpemllcnRlcyBUZXN0a3JhdXQuXG4iKTsKKyAgICAgZnVuY2FsbChzcCwgUExBTlRfUk9PTURFVEFJTCwKKyAgICAgICAgICJFaW4gbmljaHQgbmFlaGVyIHNwZXppZml6aWVydGVzIFRlc3RrcmF1dCAoIgorICAgICAgICAgK2NhcGl0YWxpemUoZmlsZSkrIikuXG4iKTsKKyAgICAgcHJldmlvdXNfb2JqZWN0KCktPkFkZElkKCJrcmF1dCIpOworICAgICBwcmV2aW91c19vYmplY3QoKS0+U2V0UGxhbnRJZCgtMSk7CisgICB9CisgICByZXR1cm4gZmlsZTsKK30KKworaW50IE5vUGFyYU9iamVjdHMoKQoreyAgIHJldHVybiAxOyAgIH0KKworLy8gQU46IEZ1bmt0aW9uIGVyemV1Z3QgYXVzIGRlbiB2b3JsaWVnZW5kZW4gRGF0ZW4gZGVyIEtyYWV1dGVybGlzdGUgZWluCisvLyBwaHlzaWthbGlzY2ggZXhpc3RpZXJlbmRlcyBGaWxlIGluIGRpZXNlbSBWZXJ6ZWljaG5pcywgekIgd2VubiBkaWUgRGF0ZW4KKy8vIGVyd2VpdGVydCB3ZXJkZW4gc29sbGVuLiBEaWUgS3JhZXV0ZXJsaXN0ZSBzdGVsbHQgbnVyIGdlbmVyaXNjaGUgT2JqZWt0ZQorLy8genVyIFZlcmZ1ZWd1bmcsIGRpZSBrZWluZSBEZXRhaWxzIGhhYmVuLiBXZW5uIGRpZSBPYmpla3RlIGF1c2dlc2NobXVlY2t0CisvLyB3ZXJkZW4gc29sbGVuLCBrb2VubmVuIGRpZXNlIGF1Y2ggYWxzIERhdGVpIGhpZXIgbGllZ2VuLgorLy8gV2lyZCB2b20gUGxhbnRtYXN0ZXIgYXVzIGdlcnVmZW4uIERpZSBFeGlzdGVueiB2b24gS2xhcnRleHQtCisvLyBGZWhsZXJtZWxkdW5nZW4gbGFlc3N0IGRhcmF1ZiBzY2hsaWVzc2VuLCBkYXNzIGRpZXNlIEZ1bmt0aW9uIGRhZnVlcgorLy8gdm9yZ2VzZWhlbiB3YXIsIHZvbSBQbGFudHRvb2wgYXVzIGdlcnVmZW4genUgd2VyZGVuLiBEaWVzIHdpcmQgZGFkdXJjaAorLy8gYmVzdGFldGlndCwgZGFzcyBkb3J0IHdpZSBoaWVyIGFsbGUgdm9uIE1hZ2llcm4gYmVudXR6YmFyZW4gS29tbWFuZG8tCisvLyBmdW5rdGlvbmVuIG1pdCBfIGJlZ2lubmVuIChfc2hvd3BsYW50KCksIF9hZGRyb29tKCkgZXRjLiksIHVuZCBkaWUKKy8vIEtvbW1hbmRvZnVua3Rpb24gaW0gUGxhbnR0b29sIGdlbmVyZWxsIGluIGRlciBMYWdlIGlzdCwgYWxsZSBfKigpIAorLy8gaW0gUGxhbnRtYXN0ZXIgenUgcnVmZW4sIHNvZmVybiBleGlzdGVudCB1bmQgZnVlciBkZW4gTWFnaWVyIGZyZWlnZWdlYmVuLgorLy8gQU4vVE9ETzogZ2dmLiBzb2xsdGUgbWFuIGhpZXIgbm9jaCBwcnVlZmVuLCBvYiBkaWUgVkMtQmx1ZXByaW50IGRlcworLy8gYW5nZWZvcmRlcnRlbiBLcmF1dGVzIGdlcmFkZSBleGlzdGllcnQsIGRlbm4gc29uc3Qgd3VlcmRlIGRhcyBhdWYgZGVyCisvLyBQbGF0dGUgbGllZ2VuZGUsIHNjaGVpbmJhciAobmljaHQpIGdlbGFkZW5lIE9iamVrdCBuaWNodCBtaXQgZGVtCisvLyBWQy1PYmpla3QgdWViZXJlaW5zdGltbWVuLiBFdnRsLiByZWljaHQgZXMgYXVzLCBkaWUgQmx1ZXByaW50IGVpbmZhY2gKKy8vIHp1IHplcnN0b2VyZW4gdW5kIG5ldXp1bGFkZW4uCitpbnQgX2NyZWF0ZWZpbGUoc3RyaW5nIGZpbGVuYW1lKQoreworICAgaW50IGk7CisgICBzdHJpbmcgc3RyLCBzaG9ydCwgbG9uZywgZ2VuZGVyLCAqbmFtZSwgcm9vbWRldGFpbDsKKyAgIHN0cmluZyAqaWRzOworICAgc3RyaW5nIHBsYW50ZmlsZTsKKworLyogICBpZiAob2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpIT1QTEFOVE1BU1RFUikgeworICAgICAgd3JpdGUoIklsbGVnYWwgdXNhZ2Ugb2YgX2NyZWF0ZWZpbGUoKSFcbiIpOworICAgICAgcmV0dXJuIDE7ICAgCisgICB9Ki8KKy8vIF5eXiBab29rLCBnZ2Yuc3BhZXRlciB3aWVkZXIgS29tbWVudGFyIGVudGZlcm5lbi4gCisKKyAgIG1peGVkIGFycjsKKyAgIGlmICghcG9pbnRlcnAoYXJyPWtyYXV0ZGF0ZW5bZmlsZW5hbWVdKSkgeworICAgICAgd3JpdGUoIlVua25vd24gcGxhbnQgJyIrZmlsZW5hbWUrIicuXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgfQorICAgaWYgKGZpbGVfc2l6ZShQTEFOVERJUitmaWxlbmFtZSsiLmMiKT49MCkgeworICAgICAgd3JpdGUoImVycm9yOiBmaWxlICIrUExBTlRESVIrZmlsZW5hbWUrIi5jIGFscmVhZHkgZXhpc3RzLlxuIik7CisgICAgICByZXR1cm4gMTsKKyAgIH0KKyAgIG1peGVkIHByb3BzID0gYXJyWzBdOworCisgICAvLyBLdXJ6YmVzY2hyZWlidW5nIGVyemV1Z2VuCisgICBTZXRQcm9wKFBfTkFNRSwgICAgIHByb3BzW0lOR1JFRElFTlRfTkFNRV0pOworICAgU2V0UHJvcChQX05BTUVfQURKLCBwcm9wc1tJTkdSRURJRU5UX0FESl0pOworICAgU2V0UHJvcChQX0dFTkRFUiwgICBwcm9wc1tJTkdSRURJRU5UX0dFTkRFUl0pOworICAgaWYgKHByb3BzW0lOR1JFRElFTlRfREVNT05dPT1SQVcpIHsKKyAgICAgICBTZXRQcm9wKFBfQVJUSUNMRSwgMCk7CisgICAgICAgc2hvcnQ9TmFtZShXRVIpOworICAgICAgIFNldFByb3AoUF9BUlRJQ0xFLCAxKTsKKyAgIH0KKyAgIGVsc2Ugc2hvcnQ9TmFtZShXRVIscHJvcHNbSU5HUkVESUVOVF9ERU1PTl0pOworICAgaWRzID0gKHsgbG93ZXJzdHJpbmcocHJvcHNbSU5HUkVESUVOVF9OQU1FXSkgfSk7CisgICAvLyBiZWkgenVzYW1tZW5nZXNldHp0ZW4gTmFtZW4sIGF1Y2ggZGVuIGhhdXB0bmFtZW4gYWt6ZXB0aWVyZW4KKyAgIHN0cj1sb3dlcnN0cmluZyhwcm9wc1tJTkdSRURJRU5UX05BTUVdKTsKKyAgIG5hbWU9ZXhwbG9kZShzdHIsICItIik7CisgICBpZiAoc2l6ZW9mKG5hbWUpPjEpIGlkcyArPSAoeyBuYW1lWzwxXSB9KTsKKyAgIG5hbWU9ZXhwbG9kZShzdHIsICIgIik7CisgICBpZiAoc2l6ZW9mKG5hbWUpPjEpIGlkcyArPSAoeyBuYW1lWzwxXSB9KTsKKyAgIGZvciAoaT1zaXplb2YoSURMSVNUKS0xOyBpPj0wOyBpLS0pIHsKKyAgICAgICBpZiAoc3Ryc3RyKHN0ciwgSURMSVNUW2ldLCAwKT09LTEpIGNvbnRpbnVlOworICAgICAgIGlkcyArPSAoeyBJRExJU1RbaV0gfSk7CisgICAgICAgYnJlYWs7CisgICB9CisgICBzd2l0Y2gocHJvcHNbSU5HUkVESUVOVF9HRU5ERVJdKSB7CisgICAgIGNhc2UgTUFMRTogICBnZW5kZXI9Ik1BTEUiOyBicmVhazsKKyAgICAgY2FzZSBGRU1BTEU6IGdlbmRlcj0iRkVNQUxFIjsgYnJlYWs7CisgICAgIGNhc2UgTkVVVEVSOiBnZW5kZXI9Ik5FVVRFUiI7IGJyZWFrOworICAgICBkZWZhdWx0OiBnZW5kZXI9cHJvcHNbSU5HUkVESUVOVF9HRU5ERVJdOworICAgfQorICAgbG9uZz0iICAgIFwiIitpbXBsb2RlKG9sZF9leHBsb2RlKHByb3BzW0lOR1JFRElFTlRfTE9OR10sICJcbiIpLCAKKyAgICAgICAgICAgICAgICAgICAiXFxuXCJcbiAgICtcIiIpKyJcXG5cIiI7CisgICByb29tZGV0YWlsPSIgICAgXCIiK2ltcGxvZGUoCisgICAgICBvbGRfZXhwbG9kZShwcm9wc1tJTkdSRURJRU5UX1JPT01ERVRBSUxdLCAiXG4iKSwgIlxcblwiXG4gICArXCIiKSsKKyAgICAgICJcXG5cIiI7CisgICBwbGFudGZpbGU9CisgICAgIiNwcmFnbWEgc3Ryb25nX3R5cGVzLHJ0dF9jaGVja3NcblxuIgorICAgICIjaW5jbHVkZSA8cHJvcGVydGllcy5oPlxuIgorICAgICIjaW5jbHVkZSA8aXRlbXMva3JhZXV0ZXIva3JhdWV0ZXIuaD5cbiIKKyAgICAiI2luY2x1ZGUgPGl0ZW1zL2tyYWV1dGVyL2tyYWV1dGVybGlzdGUuaD5cblxuIgorICAgICJpbmhlcml0IFNURFBMQU5UO1xuXG4iCisgICAgInByb3RlY3RlZCB2b2lkIGNyZWF0ZSgpXG4iCisgICAgIntcbiIKKyAgICAiICA6OmNyZWF0ZSgpO1xuIjsKKyAgIHBsYW50ZmlsZSs9IiAgY3VzdG9taXplTWUoIit1cHBlcnN0cmluZyhmaWxlbmFtZSkrIik7XG4iOworICAgcGxhbnRmaWxlKz0KKyAgICAiICBTZXRQcm9wKFBfTkFNRSwgICAgIFwiIitwcm9wc1tJTkdSRURJRU5UX05BTUVdKyJcIik7XG4iCisgICAgIiAgU2V0UHJvcChQX05BTUVfQURKLCBcIiIrKHByb3BzW0lOR1JFRElFTlRfQURKXXx8IiIpKyJcIik7XG4iCisgICAgIiAgU2V0UHJvcChQX0dFTkRFUiwgICAiK2dlbmRlcisiKTtcbiIKKyAgICAiICBTZXRQcm9wKFBfTE9ORywgICAgIFxuIisKKyAgICBsb25nKyIpO1xuIgorICAgICIgIFNldFByb3AoUExBTlRfUk9PTURFVEFJTCwgXG4iKworICAgIHJvb21kZXRhaWwrIik7XG4iCisgICAgIiAgU2V0UHJvcChQX1NIT1JULCAgICBcIiIrc2hvcnQrIlwiKTtcbiI7CisgICBwbGFudGZpbGUrPSIgIEFkZElkKCh7IjsKKyAgIGZvciAoaT1zaXplb2YoaWRzKS0xOyBpPj0wOyBpLS0pCisgICAgIHBsYW50ZmlsZSs9IiBcIiIraWRzW2ldKyJcIiwiOworICAgcGxhbnRmaWxlWzwxXT0nICc7CisgICBwbGFudGZpbGUrPSJ9KSk7XG4iOworICAgLy8gQWRqZWN0aXZlIHZvcmhlciBkZWtsaW5pZXJlbgorICAgaWYgKHN0cmluZ3Aoc2hvcnQ9cHJvcHNbSU5HUkVESUVOVF9BREpdKSkgeworICAgICBzaG9ydD1EZWNsQWRqKGxvd2Vyc3RyaW5nKHNob3J0KSwgV0VOLCAwKVswLi48Ml07CisgICAgIHBsYW50ZmlsZSs9IiAgQWRkQWRqZWN0aXZlKFwiIitzaG9ydCsiXCIpO1xuIjsKKyAgIH0KKyAgIHBsYW50ZmlsZSs9In1cbiI7CisgICB3cml0ZShwbGFudGZpbGUpOworICAgLy93cml0ZV9maWxlKFBMQU5URElSK2ZpbGVuYW1lKyIuYyIsIHBsYW50ZmlsZSk7CisgICB3cml0ZSgiRmlsZW5hbWU6ICIrUExBTlRESVIrZmlsZW5hbWUrIi5jXG4iKTsKKyAgIHJldHVybiAxOworfQorCmRpZmYgLS1naXQgYS9pdGVtcy9tb25leS5jIGIvaXRlbXMvbW9uZXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTlhNWY0Ci0tLSAvZGV2L251bGwKKysrIGIvaXRlbXMvbW9uZXkuYwpAQCAtMCwwICsxLDM0MCBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIG1vbmV5LmMgLS0gVW5zZXIgR2VsZAorLy8KKy8vICRJZDogbW9uZXkuYyA4ODkzIDIwMTQtMDgtMDQgMTk6NDg6NTZaIFplc3N0cmEgJAorCitpbmhlcml0ICIvc3RkL3VuaXQiOworCisjcHJhZ21hIHN0cm9uZ190eXBlcyxydHRfY2hlY2tzCisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8dW5pdC5oPgorI2luY2x1ZGUgPG1vbmV5Lmg+CisKKy8vIHp1bSBkZWJ1Z2dlbiAoZGVidWdtb2RlIGtvbW10IGF1cyAvc3RkL3VuaXQuYworI2luY2x1ZGUgPGxpdmluZy9jb21tLmg+CisjZGVmaW5lIFpERUJVRyh4KSBpZiAoc3RyaW5ncChkZWJ1Z21vZGUpICYmIGZpbmRfcGxheWVyKGRlYnVnbW9kZSkpIFwKKyAgZmluZF9wbGF5ZXIoZGVidWdtb2RlKS0+UmVjZWl2ZU1zZyh4LE1UX0RFQlVHLDAsb2JqZWN0X25hbWUoKSsiOiAiLE1FKQorLy8jZGVmaW5lIFpERUJVRyh4KQorCitwcm90ZWN0ZWQgdm9pZCBOb3RpZnlNb3ZlKG9iamVjdCBkZXN0LCBvYmplY3Qgb2xkZW52LCBpbnQgbWV0aG9kKQoreworICAvLyBMb2dnLUZ1bmt0aW9uLCB1bSBOaWNodC1TdGFuZGFyZC1HZWxkYnVncyB6dSBmaW5kZW4uCisgIC8vIEVpbmdlYmF1dCAyNy4wMy4yMDAwIC0gVGlhbWFrCisgIC8vIFZvciB2ZXJlaW5pZ2VuIG1pdCBhbmRlcmVuIEdlbGRvYmpla3RlbiBpbiBOb3RpZnlNb3ZlKCkuCisgIG9iamVjdCBtb25leWxvZyA9IGZpbmRfb2JqZWN0KCIvcC9kYWVtb24vbW9uZXlsb2ciKTsKKyAgaWYgKCAoIWVudmlyb25tZW50KCkgJiYgcHJldmlvdXNfb2JqZWN0KCkgJiYKKyAgICAgICAgIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUocHJldmlvdXNfb2JqZWN0KCkpICYmCisgICAgICAgIGxvYWRfbmFtZShwcmV2aW91c19vYmplY3QoKSkgIT0gR0VMRCkgJiYKKyAgICAgICAgbW9uZXlsb2cpCisgICAgICBtb25leWxvZy0+QWRkTW9uZXkoIHByZXZpb3VzX29iamVjdCgpLCBRdWVyeShVX1JFUSkgKTsKKworICAvLyBIaWVyIHBhc3NpZXJ0IFZlcmVpbmlndW5nIG1pdCBhbmRlcmVuIEdlbGRvYmpla3Rlbi4uLiBFdGMuCisgIDo6Tm90aWZ5TW92ZShkZXN0LCBvbGRlbnYsIG1ldGhvZCk7CisKKyAgLy8gWnUgZGllc2VtIFplaXRwdW5rdCBzaW5kIFZlcmVpbmlndW5nZW4gbWl0IGFuZGVyZW4gR2VsZG9iamVrdGVuIGluIGRlc3QKKyAgLy8gc2Nob24gZ2VsYXVmZW4sIGhpZXIgbXVlc3NlbiBqZXR6dCBub2NoIEdlbGRib2Vyc2VuIHVuZCBTZWhlcmthcnRlbgorICAvLyBiZXJ1ZWNrc2ljaHRpZ3Qgd2VyZGVuLgorICAvLyBTb2xsdmVyaGFsdGVuIGlzdDoKKyAgLy8gVmVyZWluaWd1bmcgbWl0IEJvZXJzZW4rZ2VsZGthcnRlbiBudXIgaW4gTGViZXdlc2VuLgorICAvLyBBdXNzZXJkZW0gc29sbCBuaWNodCB2ZXJlaW5pZ3Qgd2VyZGVuLCB3ZW5uIG1hbiBtdWVuemVuIGF1cyBlaW5lciBCb2Vyc2UKKyAgLy8gbmltbXQuIAorICAvLyBBKSBCZXRyYWcgaXN0IHBvc2l0aXY6CisgIC8vIEExKSBtaXQgZGVyIGVyc3RlbiBnZWxkLWVuaGFsdGVuZW4gR2VsZGJvZXJzZSBpbSBJbnZlbnRhciB2ZXJlaW5pZ2VuLgorICAvLyAgICAgR2lidCBlcyBrZWluZSBnZWxkLWdlZnVlbGx0ZSwgd2lyZCBkaWUgZXJzdGUgbGVlcmUgZ2Vub21tZW4uCisgIC8vIEIpIEJldHJhZyBpc3QgbmVnYXRpdjoKKyAgLy8gICAgRXMgd2lyZCB2ZXJzdWNodCwgbWl0IGdlbGRnZWZ1ZWxsdGVuIEJvZXJzZW4gdW5kIGFrdGl2ZW4gU2VoZXJrYXJ0ZW4KKyAgLy8gICAgKGQuaC4gS2FydGVuLCBkaWVzZW0gRW52aXJvbm1lbnQgZ2Vob2VyZW4pIHp1IHZlcmVpbmlnZW4uCisgIC8vICAgIEVzIHdpcmQgZXJzdCBlaW5lciBCb2Vyc2VuICJhYmdlYnVjaHQiIChmYWxscyB2b3JoYW5kZW4pIHVuZCBkYW5uCisgIC8vICAgIChmYWxscyBub2NoIG5vZXRpZykgdm9uIGVpbmVyIEdlbGRrYXJ0ZS4gSXN0IGRlciBCZXRyYWcgYW0gRW5kZQorICAvLyAgICBuZWdhdGl2LCB3aXJkIGVpbiBGZWhsZXIgYXVzZ2Vsb2VzdC4KKyAgaWYgKCFsaXZpbmcoZGVzdCkpCisgICAgcmV0dXJuOworICAvLyB3ZW5uIHdpciBhdXMgZWluZXIgQm9lcnNlIGluIGRpZXNlbSBFbnZpcm9ubWVudCBrb21tZW4sIHZlcmVpbmlnZW4gd2lyCisgIC8vIHVucyBuaWNodCB3aWVkZXIgZXJuZXV0LgorICBpZiAobG9hZF9uYW1lKG9sZGVudikgPT0gQk9FUlNFCisgICAgICAmJiBlbnZpcm9ubWVudChvbGRlbnYpID09IGVudmlyb25tZW50KCkpCisgICAgcmV0dXJuOworCisgIGludCBhbW91bnQgPSBRdWVyeVByb3AoUF9BTU9VTlQpOworICBaREVCVUcoc3ByaW50ZigiTm90aWZ5TW92ZSAxOiBhbW91bnQ6ICVkXG4iLAorICAgICAgICAgYW1vdW50KSk7CisgIGlmIChhbW91bnQgPiAwKQorICB7CisgICAgb2JqZWN0IGJvZXJzZSA9IHByZXNlbnQoR0VMREJPRVJTRV9NSVRfR0VMRCwgZW52aXJvbm1lbnQoKSkKKyAgICAgICAgICAgICAgICAgICAgfHwgcHJlc2VudChCT0VSU0VJRCwgZW52aXJvbm1lbnQoKSk7CisgICAgaWYgKGJvZXJzZSkKKyAgICB7CisgICAgICBib2Vyc2UtPk1lcmdlTW9uZXkodGhpc19vYmplY3QoKSk7CisgICAgICAvLyBTb2xsdGVuIHdpciBqZXR6dCBQX0FNT1VOVCA9PSAwIGhhYmVuLCB6ZXJzdG9lcnQgdW5zIGRlciBDb2RlIGF1cworICAgICAgLy8gdW5pdC5jIHNwYWV0ZXIuCisgICAgICBaREVCVUcoc3ByaW50ZigiTm90aWZ5TW92ZSBuYWNoIEJvZXJzZW52ZXJlaW5pZ3VuZyAxOiBhbW91bnQ6ICVkXG4iLAorICAgICAgICAgICAgIFF1ZXJ5UHJvcChQX0FNT1VOVCkpKTsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoYW1vdW50IDwgMCkKKyAgeworICAgIG9iamVjdCBib2Vyc2UgPSBwcmVzZW50KEdFTERCT0VSU0VfTUlUX0dFTEQsIGVudmlyb25tZW50KCkpOworICAgIGlmIChib2Vyc2UpCisgICAgeworICAgICAgYm9lcnNlLT5NZXJnZU1vbmV5KHRoaXNfb2JqZWN0KCkpOworICAgICAgWkRFQlVHKHNwcmludGYoIk5vdGlmeU1vdmUgbmFjaCBCb2Vyc2VudmVyZWluaWd1bmcgMjogYW1vdW50OiAlZFxuIiwKKyAgICAgICAgICAgICBRdWVyeVByb3AoUF9BTU9VTlQpKSk7CisgICAgfQorICAgIC8vIHdlbm4gaW1tZXIgbm9jaCB3YXMgYXVzenVnbGVpY2hlbiBpc3QsIEdlbGRrYXJ0ZSB2ZXJzdWNoZW4uCisgICAgaWYgKFF1ZXJ5UHJvcChQX0FNT1VOVCkgPCAwKQorICAgIHsKKyAgICAgIG9iamVjdCBnZWxka2FydGUgPSBwcmVzZW50KFNFSEVSS0FSVEVJRF9BS1RJViwgZW52aXJvbm1lbnQoKSk7CisgICAgICBpZiAoZ2VsZGthcnRlKQorICAgICAgeworICAgICAgICBnZWxka2FydGUtPk1lcmdlTW9uZXkodGhpc19vYmplY3QoKSk7CisgICAgICAgIFpERUJVRyhzcHJpbnRmKCJOb3RpZnlNb3ZlIG5hY2ggS2FydGVudmVyZWluaWd1bmc6IGFtb3VudDogJWRcbiIsCisgICAgICAgICAgICAgICBRdWVyeVByb3AoUF9BTU9VTlQpKSk7CisgICAgICB9CisgICAgfQorICAgIGlmIChRdWVyeVByb3AoUF9BTU9VTlQpIDwgMCkKKyAgICAgIGNhdGNoKHJhaXNlX2Vycm9yKHNwcmludGYoCisgICAgICAgICAgICAiR2VsZCBtaXQgbmVnYXRpdmVtIEJldHJhZyBpbW1lciBub2NoIG5lZ2F0aXYgbmFjaCAiCisgICAgICAgICAgICAiVmVyZWluaWd1bmcgbWl0IGFsbGVuIEdlbGRxdWVsbGVuIGltIEludmVudGFyOiAlTy4gUmVzdDogJWRcbiIsCisgICAgICAgICAgICBlbnZpcm9ubWVudCgpLCBRdWVyeVByb3AoUF9BTU9VTlQpKSk7IHB1Ymxpc2gpOworICB9Cit9CisKK2ludCBfc2V0X2F1dG9sb2Fkb2JqKCBtaXhlZCBhcmdzICkKK3sKKyAgaWYgKHBvaW50ZXJwKGFyZ3MpKQorICAgIGFyZ3M9YXJnc1swXTsKKyAgaWYgKHN0cmluZ3AoYXJncykpCisgICAgc3NjYW5mKGFyZ3MsIiVkIixhcmdzKTsKKyAgaWYgKCFpbnRwKGFyZ3MpKQorICAgIGFyZ3M9MDsKKyAgcmV0dXJuIFNldFByb3AoUF9BTU9VTlQsYXJncyk7Cit9CisKK2ludCBfcXVlcnlfYXV0b2xvYWRvYmooKQoreworICByZXR1cm4gKGludClRdWVyeShQX0FNT1VOVCwgRl9WQUxVRSk7Cit9CisKK3N0cmluZyBjdXJyZW50X2xvbmcoKSB7CisgaW50IHI7Cisgcj1RdWVyeShVX1JFUSk7CisgcmV0dXJuKGJyZWFrX3N0cmluZygKKyAgKChyPT0xKT8iIjoiRHUgYmV0cmFjaHRlc3QgZWluZSBkZXIgTXVlbnplbiBnZW5hdWVyOlxuIikrCisgICJEaWUgT2JlcmZsYWVjaGUgZGVyIEdvbGRtdWVuemUgaXN0IHZvbSB0YWVnbGljaGVuIEdlYnJhdWNoIHppZW1saWNoICIKKyAgIm1pdGdlbm9tbWVuLiBLcmF0emVyIHVuZCBzb2dhciBCaXNzc3B1cmVuIHppZXJlbiBkaWUgUHJhZWdlbXVlbnplICIKKyAgInp1c2FldHpsaWNoIHp1bSBLb250ZXJmZWkgIisKKyAgKHsiZGVzIEpvZiIsImRlciBSdW1hdGEiLCJkZXMgWm9vayJ9KVsoUXVlcnkoUF9BTU9VTlQpK3IpJTNdKworICAiLiBEZXIgUmFuZCAiKworICAoKCEociUyKSk/InNjaGVpbnQgZXR3YXMgYmVzY2hhZWRpZ3QgenUgc2Vpbi4iOgorICAgICAgICAgICAgImlzdCB3ZW5pZ3N0ZW5zIHVuYmVzY2hhZWRpZ3QuIiksCisgIDc4LDAsQlNfTEVBVkVfTVlfTEZTKSk7Cit9CisKK3N0YXRpYyBpbnQgYWN0aW9uX3NjaG5pcHBzKHN0cmluZyBzdHIpIHsKKyBpZighaWQoc3RyKSkgcmV0dXJuIDA7Cisgd3JpdGUoYnJlYWtfc3RyaW5nKAorICAoKFF1ZXJ5KFVfUkVRKT09MSk/IkR1IG5pbW1zdCBkaWUgTXVlbnplIjoKKyAgICAgICAgICAgICAgICAgICAgICJEdSBuaW1tc3QgZWluZSBkZXIgTXVlbnplbiIpKworICAiIHVuZCBzY2huaXBwc3Qgc2llIGluIGRpZSBMdWZ0LiBTaWUga2xpbmd0IGhlbGwgYXVmLiAiKworICAoKHRoaXNfcGxheWVyKCkgJiYgdGhpc19wbGF5ZXIoKS0+UXVlcnlBdHRyaWJ1dGUoQV9ERVgpPjEwKT8KKyAgICJHZXNjaGlja3QgZmFlbmdzdCBEdSBzaWUgd2llZGVyIGF1Zi4iOgorICAgIlNpZSBwbHVtcHN0IERpciB3aWVkZXIgaW4gZGllIEhhbmQgdW5kIGJlaW5haGUgbGFlc3N0IER1ICIKKyAgICJzaWUgZmFsbGVuLiIpLDc4KSk7CisgaWYodGhpc19wbGF5ZXIoKSAmJiBlbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKSkKKyAgdGVsbF9yb29tKGVudmlyb25tZW50KHRoaXNfcGxheWVyKCkpLAorICAgICAgICAgICAgYnJlYWtfc3RyaW5nKHRoaXNfcGxheWVyKCktPk5hbWUoKSsiIHNjaG5pcHB0IG1pdCBoZWxsZW0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICJLbGluZ2VuIGVpbiBNdWVuemUgaW4gZGllIEx1ZnQgdW5kIGZhZW5ndCBzaWUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJ3aWVkZXIuIiw3OCksCisgICAgICAgICAgICAoe3RoaXNfcGxheWVyKCl9KSk7CisgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgYWN0aW9uX3BydWVmZShzdHJpbmcgc3RyKSB7CisgaWYoIWlkKHN0cikpIHJldHVybiAwOworIHdyaXRlKGJyZWFrX3N0cmluZygKKyAgKChRdWVyeShVX1JFUSk9PTEpPyJEdSBuaW1tc3QgZGllIE11ZW56ZSI6CisgICAgICAgICAgICAgICAgICAgICAiRHUgbmltbXN0IGVpbmUgZGVyIE11ZW56ZW4iKSsKKyAgIiB1bmQgYmVpc3N0IHZvcnNpY2h0aWcgaGluZWluLiBEZWluIFphaG4gdmVyc2lua3QgdGllZiBpbSByZWluZW4gR29sZCwgIgorICAidW5kIER1IGJpc3QgRGlyIG51biBzaWNoZXIsIGRhc3MgZGllc2UgTXVlbnplIGF1Y2ggd2lya2xpY2ggZWNodCBpc3QuIiwKKyAgNzgpKTsKKyBpZih0aGlzX3BsYXllcigpICYmIGVudmlyb25tZW50KHRoaXNfcGxheWVyKCkpKQorICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQodGhpc19wbGF5ZXIoKSksCisgICAgICAgICAgICBicmVha19zdHJpbmcodGhpc19wbGF5ZXIoKS0+TmFtZSgpKyIgYmVpc3N0IGluIGVpbmUgTXVlbnplICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAidW5kIHNjaGF1dCBpcmdlbmR3aWUgYmVmcmllZGlndCBkcmVpbi4iLDc4KSwKKyAgICAgICAgICAgICh7dGhpc19wbGF5ZXIoKX0pKTsKKyByZXR1cm4gMTsKK30KKworCitzdGF0aWMgc3RyaW5nIERldEtvbnRlcmZlaSgpIHsKKyBzdHJpbmcgbTsKKyBzd2l0Y2goKFF1ZXJ5KFBfQU1PVU5UKStRdWVyeShVX1JFUSkpJTMpIHsKKyAgZGVmYXVsdDoKKyAgY2FzZSAwOgorICAgICAgICBtPSJKb2ZzIHJ1bmRlcyBHZXNpY2h0IGdyaW5zdCBEaWNoIHZlcnRyYXVlbnNlcndlY2tlbmQgdW5kICIKKyAgICAgICAgICAiZnJldW5kbGljaCBhbi4iO2JyZWFrOworICBjYXNlIDE6CisgICAgICAgIG09IlJ1bWF0YSBzY2hlaW50IERpciB6dXp1YmxpbnplbG4uIjticmVhazsKKyAgY2FzZSAyOgorICAgICAgICBtPSJab29rcyBHZXNpY2h0IHNjaGF1dCB6aWVtbGljaCBmcmlzY2ggZ2VwcmFlZ3QgZHJlaW4uIFdlbm4gIgorICAgICAgICAgICJlaW5lIGRlciBNdWVuemVuIGJlaW0gU2NobmlwcGVuIGtsaW5ndCwgZGFubiBiZXN0aW1tdCBkaWUuIjticmVhazsKKyB9CisgcmV0dXJuKGJyZWFrX3N0cmluZyhtLDc4KSk7Cit9CisKKworc3RhdGljIHN0cmluZyBEZXRSYW5kKCkgeworIHJldHVybihicmVha19zdHJpbmcoCisgICgoIShRdWVyeShVX1JFUSklMikpPworICAgICAgICAgICAgIkRlciBSYW5kIGRlciBNdWVuemUgaXN0IHplcmtsdWVmdGV0IHVuZCBhYmdlc2NoYWJ0LiBPYiAiCisgICAgICAgICAgICAiZGEgamVtYW5kIHZlcnN1Y2h0IGhhdCwgZGFzIEdvbGQgZGVyIE11ZW56ZSBhYnp1c2NoYWJlbiwgIgorICAgICAgICAgICAgInVtIHNpY2ggZXR3YXMgbmViZW5oZXIgenUgdmVyZGllbmVuPyI6CisgICAgICAgICAgICAiRGVyIFJhbmQgaXN0IHZvbGxrb21tZW4gaW4gT3JkbnVuZywgZWluIHdpcmtsaWNoIGZyaXNjaGUgIgorICAgICAgICAgICAgIlByYWVndW5nLiIpLDc4KSk7Cit9CisKKworc3RhdGljIGludCBhY3Rpb25fd3VyZihzdHJpbmcgc3RyKQoreworICBpbnQgbnVtLCBwYXJ0OworCisgIGlmICghaWQoc3RyKSkKKyAgICByZXR1cm4gMDsKKworICBudW0gPSBRdWVyeShVX1JFUSk7CisgIHdyaXRlIChicmVha19zdHJpbmcoCisJICgobnVtPT0xKT8iRHUgbmltbXN0IGRpZSBNdWVuemUiOgorCSAgc3ByaW50ZigiRHUgbmltbXN0ICVkIE11ZW56ZW4iLCBudW0pKSsKKwkgICAiLCB3aXJmc3Qgc2llIGhvY2gsIGxhZXNzdCBzaWUgenUgQm9kZW4gcHJhc3NlbG4gdW5kICIKKwkgICAiYmV0cmFjaHRlc3QgZGFzIEVyZ2VibmlzOiIsIDc4KSk7CisgIGlmICh0aGlzX3BsYXllcigpICYmIGVudmlyb25tZW50KHRoaXNfcGxheWVyKCkpKQorICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKSwKKwkgICAgICBicmVha19zdHJpbmcodGhpc19wbGF5ZXIoKS0+TmFtZSgpKyIgd2lyZnQgIisKKyAgICAgICAgIAkgICAoKG51bT09MSk/ImVpbmUgTXVlbnplIjoKKwkJCSAgIHNwcmludGYoIiVkIE11ZW56ZW4iLCBudW0pKSsKKwkJICAgIiBob2NoLCBsYWVzc3Qgc2llIHp1IEJvZGVuIHByYXNzZWxuIHVuZCBiZXRyYWNodGV0ICIKKwkJICAgKyJkYXMgRXJnZWJuaXM6IiwgNzgpLCAoe3RoaXNfcGxheWVyKCl9KSk7CisKKyAgaWYgKG51bSA9PSAxKSB7CisgICAgaWYgKHJhbmRvbSgxMDAwMDAwKSA9PSAxMjM0NTYpIHsKKyAgICAgIHdyaXRlKCIgICBEaWUgTXVlbnplIGJsZWlidCBhdWYgZGVtIFJhbmQgc3RlaGVuLlxuIik7CisgICAgICBpZiAodGhpc19wbGF5ZXIoKSAmJiBlbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKSkKKwl0ZWxsX3Jvb20oZW52aXJvbm1lbnQodGhpc19wbGF5ZXIoKSksCisJCSAgIiAgIERpZSBNdWVuemUgYmxlaWJ0IGF1ZiBkZW0gUmFuZCBzdGVoZW4uXG4iLAorCQkgICh7dGhpc19wbGF5ZXIoKX0pKTsKKyAgICB9CisgICAgZWxzZSBpZiAocmFuZG9tKDEwMCkgPCA1MCkgeworICAgICAgd3JpdGUoIiAgIEtvcGYuXG4iKTsKKyAgICAgIGlmICh0aGlzX3BsYXllcigpICYmIGVudmlyb25tZW50KHRoaXNfcGxheWVyKCkpKQorCXRlbGxfcm9vbShlbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKSwKKwkJICAiICAgS29wZi5cbiIsCisJCSAgKHt0aGlzX3BsYXllcigpfSkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHdyaXRlKCIgICBaYWhsLlxuIik7CisgICAgICBpZiAodGhpc19wbGF5ZXIoKSAmJiBlbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKSkKKwl0ZWxsX3Jvb20oZW52aXJvbm1lbnQodGhpc19wbGF5ZXIoKSksCisJCSAgIiAgIFphaGwuXG4iLAorCQkgICh7dGhpc19wbGF5ZXIoKX0pKTsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgcGFydCA9IDUqbnVtICsgcmFuZG9tKG51bSsxKSAtIHJhbmRvbShudW0rMSkgLy8gZXR3YXMgR2F1c3MtdmVydGVpbGVuCisJCSArIHJhbmRvbShudW0rMSkgLSByYW5kb20obnVtKzEpCisJCSArIHJhbmRvbShudW0rMSkgLSByYW5kb20obnVtKzEpCisJCSArIHJhbmRvbShudW0rMSkgLSByYW5kb20obnVtKzEpCisJCSArIHJhbmRvbShudW0rMSkgLSByYW5kb20obnVtKzEpOworICAgIHBhcnQgPSAocGFydCs1KS8xMDsKKworICAgIGlmIChwYXJ0KSB7CisgICAgICBwcmludGYoIiAgICVkeCBLb3BmIiwgcGFydCk7CisgICAgICBpZiAocGFydCAhPSBudW0pCisJcHJpbnRmKCIgdW5kICVkeCBaYWhsIiwgbnVtLXBhcnQpOworICAgICAgaWYodGhpc19wbGF5ZXIoKSAmJiBlbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKSkKKwl0ZWxsX3Jvb20oZW52aXJvbm1lbnQodGhpc19wbGF5ZXIoKSksCisJCSAgc3ByaW50ZigiICAgJWR4IEtvcGYiLCBwYXJ0KSsKKwkJICAoKHBhcnQhPW51bSk/c3ByaW50ZigiIHVuZCAlZHggWmFobCIsIG51bS1wYXJ0KToiIikrCisJCSAgIi5cbiIsCisJCSAgKHt0aGlzX3BsYXllcigpfSkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHByaW50ZigiICAgJWR4IFphaGwiLCBudW0pOworICAgICAgaWYgKHRoaXNfcGxheWVyKCkgJiYgZW52aXJvbm1lbnQodGhpc19wbGF5ZXIoKSkpCisJdGVsbF9yb29tKGVudmlyb25tZW50KHRoaXNfcGxheWVyKCkpLAorCQkgIHNwcmludGYoIiAgICVkeCBaYWhsLlxuIiwgbnVtKSwKKwkJICAoe3RoaXNfcGxheWVyKCl9KSk7CisgICAgfQorICAgIHdyaXRlICgiLlxuIik7CisgIH0KKworICB3cml0ZShicmVha19zdHJpbmcoCisJIlNjaG5lbGwgc2FtbWVsc3QgRHUgIisKKwkoKG51bT09MSk/IkRlaW5lIE11ZW56ZSI6IkRlaW5lIE11ZW56ZW4iKSsiIHdpZWRlciBlaW4uIiwgNzgpKTsKKyAgaWYgKHRoaXNfcGxheWVyKCkgJiYgZW52aXJvbm1lbnQodGhpc19wbGF5ZXIoKSkpCisgICAgdGVsbF9yb29tKGVudmlyb25tZW50KHRoaXNfcGxheWVyKCkpLAorCSAgICAgIGJyZWFrX3N0cmluZyh0aGlzX3BsYXllcigpLT5OYW1lKCkrICIgc2FtbWVsdCBzY2huZWxsICIrCisJICAgICAgKChudW09PTEpPyh0aGlzX3BsYXllcigpLT5RdWVyeVBvc3NQcm9ub3VuKEZFTUFMRSxXRU4sIFNJTkdVTEFSKQorCQkJICsiIE11ZW56ZSB3aWVkZXIgZWluLiIpOgorCSAgICAgICAodGhpc19wbGF5ZXIoKS0+UXVlcnlQb3NzUHJvbm91bihGRU1BTEUsV0VOLCBQTFVSQUwpKworCQkiIE11ZW56ZW4gd2llZGVyIGVpbi4iKSkpLCAoe3RoaXNfcGxheWVyKCl9KSk7CisgIHJldHVybiAxOworfQorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICBtaXhlZCBwbGlzdCwgaTsKKworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfTkFNRSwoeyJNdWVuemUiLCJNdWVuemVuIn0pKTsKKyAgU2V0KFBfTE9ORywjJ2N1cnJlbnRfbG9uZyk7CisgIFNldFByb3AoUF9TSE9SVCwiR2VsZCIpOworICBTZXRQcm9wKFBfSU5GTywiRHUgaGFzdCBiZWkgZGllc2VtIEdlbGQgZWluIHNpY2hlcmVzIEdlZnVlaGwuXG4iKTsKKyAgU2V0UHJvcChQX01BVEVSSUFMLChbTUFUX0dPTEQ6MTAwXSkpOworICBBZGRTaW5ndWxhcklkKCJtdWVuemUiKTsKKyAgQWRkUGx1cmFsSWQoIm11ZW56ZW4iKTsKKyAgQWRkU2luZ3VsYXJJZCgiZ29sZHN0dWVjayIpOworICBBZGRQbHVyYWxJZCgiZ29sZHN0dWVja2UiKTsKKyAgQWRkSWQoKHsiZ2VsZCIsIEdFTERJRH0pKTsKKyAgU2V0UHJvcChQX0dFTkRFUixGRU1BTEUpOworICBTZXRDb2luc1BlclVuaXRzKDEsMSk7CisgIFNldEdyYW1zUGVyVW5pdHMoMSw0KTsKKworICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgeworICAgIHNldF9uZXh0X3Jlc2V0KC0xKTsKKyAgICByZXR1cm47CisgIH0KKyAgQWRkRGV0YWlsKCh7InJhbmQiLCJtdWVuenJhbmQifSksIydEZXRSYW5kKTsKKyAgQWRkRGV0YWlsKCh7Im9iZXJmbGFlY2hlIiwiZmxhZWNoZSJ9KSxicmVha19zdHJpbmcoCisgICAiRGllc2UgTXVlbnplIGlzdCBzY2hvbiBkdXJjaCB2aWVsZSBIYWVuZGUgZ2VnYW5nZW4uIERpZSBLcmF0emVyICIKKyAgICJ6ZXVnZW4gZGF2b24sIGRhc3Mgc2llIG5pY2h0IHNlbHRlbiBhbGxlaW4gZ2V0cmFnZW4gd3VyZGUgdW5kIGRpZSAiCisgICAiQmlzc3NwdXJlbiB2b24gbWFuZ2VsbmRlbSBWZXJ0cmF1ZW4uIiw3OCkpOworICBBZGREZXRhaWwoImtyYXR6ZXIiLGJyZWFrX3N0cmluZygKKyAgICJEYXMgS29udGVyZmVpIGlzdCBzY2hvbiBnYW56IHNjaG9lbiB6ZXJrcmF0enQuIiw3OCkpOworICBBZGREZXRhaWwoKHsiYmlzc3NwdXIiLCJiaXNzc3B1cmVuIn0pLGJyZWFrX3N0cmluZygKKyAgICJEYSBoYXQgZG9jaCB0YXRzYWVjaGxpY2ggamVtYW5kIHNvIHdlbmlnIFZlcnRyYXVlbiBpbiBkYXMgR29sZCAiCisgICAiZ2V6ZWlndCwgZGFzcyBlciBoaW5laW5nZWJpc3NlbiBoYXQsIHVtIGVzIHp1IHBydWVmZW4uIiw3OCkpOworICBBZGREZXRhaWwoKHsiYmlsZCIsImtvbnRlcmZlaSIsInByYWVndW5nIn0pLCMnRGV0S29udGVyZmVpKTsKKyAgQWRkRGV0YWlsKCJnb2xkIiwiRXMgZ2xhZW56dCBEaWNoIHZlcmhlaXNzdW5nc3ZvbGwgYW4uXG4iKTsKKworICBBZGRDbWQoKHsicHJ1ZWYiLCJwcnVlZmUiLCJiZWlzcyIsImJlaXNzZSIsInRlc3QiLCJ0ZXN0ZSJ9KSwKKyAgICAgICAgICMnYWN0aW9uX3BydWVmZSk7CisgIEFkZENtZCgoeyJzY2huaXBwIiwic2NobmlwcGUiLCJzY2huaXBwcyIsInNjaG5pcHBzZSJ9KSwKKyAgICAgICAgICMnYWN0aW9uX3NjaG5pcHBzKTsKKworICBBZGRDbWQoICh7ICJ3aXJmIiwgIndlcmYiLCAid2VyZmUiIH0pLCAjJ2FjdGlvbl93dXJmKTsKK30KKwordmFyYXJncyBzdHJpbmcgR2V0RGV0YWlsKG1peGVkIGtleSxtaXhlZCByYWNlLGludCBzZW5zZSkgeworIHN0cmluZyBtOworIGlmKHN0cmluZ3AobT06OkdldERldGFpbCgma2V5LCZyYWNlLCZzZW5zZSkpICYmIHNpemVvZihtKSkgeworICBpbnQgcjsKKyAgcj1RdWVyeShVX1JFUSk7CisgIGlmKHIhPTEpIG09c3ByaW50ZigiRHUgYmV0cmFjaHRlc3QgZWluZSBkZXIgJWQgTXVlbnplbiBnZW5hdWVyOlxuIixyKSttOworIH0KKyByZXR1cm4gbTsKK30KKwpkaWZmIC0tZ2l0IGEvaXRlbXMvcGZlaWZjaGVuLmMgYi9pdGVtcy9wZmVpZmNoZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGQ4OTc2Ci0tLSAvZGV2L251bGwKKysrIGIvaXRlbXMvcGZlaWZjaGVuLmMKQEAgLTAsMCArMSwxNDkgQEAKK2luaGVyaXQgIi9zdGQvdGhpbmciOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisKK2ludCB0bTsKK2ludCBnZXN0b3BmdCA9IDA7CitpbnQgcmF1Y2hlbiAgPSAwOworCitzdHJpbmcgZGVzOworCitzdHJpbmcgX3F1ZXJ5X2xvbmcoKXsKKyAgc3RyaW5nIHM7CisgIHM9IkVpbiBlaW5mYWNoZXMgSG9senBmZWlmY2hlbjogT2huZSBWZXJ6aWVydW5nZW4gb2RlciBiZXNvbmRlcmUgIgorICAgICJFeHRyYXMsIHNvbmRlcm4gc2NobGljaHQgdW5kIHN0YWJpbCBnZW51ZyBmdWVyIGVpbiBBYmVudGV1cmVybGViZW4uICIKKyAgICAiRXMgZWlnbmV0IHNpY2ggaGVydm9ycmFnZW5kIGRhenUsIGVpbm1hbCB6dSBlbnRzcGFubmVuIHVuZCBndXRlbiAiCisgICAgIlRhYmFrIHp1IGdlbmllc3NlbiI7CisgIGlmKGdlc3RvcGZ0KSBzKz0iLiBEYXMgUGZlaWZjaGVuIGlzdCBnZXN0b3BmdCI7CisgIGlmKHJhdWNoZW4pICBzKz0iIHVuZCBhbmdlenVlbmRldC4iOworICBlbHNlICAgICAgICAgcys9Ii4iOworICByZXR1cm4oYnJlYWtfc3RyaW5nKHMsNzgpKTsKK30KKworc3RyaW5nIF9xdWVyeV9zaG9ydCgpeworICBpZihyYXVjaGVuKSAgcmV0dXJuICJFaW4gUGZlaWZjaGVuIChhbmdlenVlbmRldCkiOworICBpZihnZXN0b3BmdCkgcmV0dXJuICJFaW4gUGZlaWZjaGVuIChnZXN0b3BmdCkiOworICBlbHNlICAgICAgICAgcmV0dXJuICJFaW4gUGZlaWZjaGVuIjsKK30KKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCl7CisgIGlmKCFjbG9uZXAodGhpc19vYmplY3QoKSkpcmV0dXJuIDsKKyAgdGhpbmc6OmNyZWF0ZSgpOworICB0bT0wOworICBTZXRQcm9wKFBfR0VOREVSLE5FVVRFUik7CisgIFNldFByb3AoUF9OQU1FLCJQZmVpZmNoZW4iKTsKKyAgU2V0UHJvcChQX1dFSUdIVCwxMCk7CisgIFNldFByb3AoUF9WQUxVRSwwKTsKKyAgQWRkSWQoKHsicGZlaWZjaGVuIiwiaG9senBmZWlmY2hlbiJ9KSk7CisgIFNldFByb3AoUF9OT0RST1AsMSk7CisgIFNldFByb3AoUF9ORVZFUkRST1AsMSk7CisgIFNldFByb3AoUF9NQVRFUklBTCxNQVRfSVJPTl9XT09EKTsKKyAgQWRkQ21kKCh7InJhdWNoIiwicmF1Y2hlIn0pLCJjbV9zbW9rZSIpOworICBBZGRDbWQoKHsic3RvcGYiLCJzdG9wZmUifSksImNtX3N0b3BmIik7Cit9CisKK3N0YXRpYyBpbnQgY21fc3RvcGYoc3RyaW5nIHN0cil7CisgIHN0cmluZyBzMSxzMjsKKyAgb2JqZWN0IG9iOworICBfbm90aWZ5X2ZhaWwoIlN5bnRheDogc3RvcGZlIHBmZWlmY2hlbiBtaXQgPHdhcz5cbiIpOworICBpZighc3RyKSByZXR1cm4gMDsKKyAgaWYoc3NjYW5mKHN0ciwiJXMgbWl0ICVzIixzMSxzMik9PTIpeworICAgIGlmKGlkKHMxKSl7CisgICAgICBpZighb2I9cHJlc2VudChzMix0aGlzX3BsYXllcigpKSl7CisgICAgICAgIHdyaXRlKCJTbyBldHdhcyBoYXN0IER1IGRvY2ggZ2FyIG5pY2h0IGJlaSBEaXIuXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICAgfQorICAgICAgaWYoKG9iLT5pZCgidGFiYWsiKSkgfHwgKG9iLT5RdWVyeU1hdGVyaWFsKE1BVF9DQU5OQUJJUyk+NTApKXsKKyAgICAgICAgaWYocmF1Y2hlbil7CisgICAgICAgICAgd3JpdGUoYnJlYWtfc3RyaW5nKCJEdSByYXVjaHN0IERlaW4gUGZlaWZjaGVuIGRvY2ggZ2VyYWRlLiBEYW1pdCAiCisgICAgICAgICAgICJtdXNzdCBEdSBzY2hvbiB3YXJ0ZW4sIGJpcyBEdSBmZXJ0aWcgYmlzdC4iLDc4KSk7CisgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICB9CisgICAgICAgIGlmKGdlc3RvcGZ0KXsKKyAgICAgICAgICB3cml0ZShicmVha19zdHJpbmcoIkR1IGhhc3QgRGVpbiBQZmVpZmNoZW4gYmVyZWl0cyBnZXN0b3BmdC4gRXMgIgorICAgICAgICAgICAibGllc3NlIHNpY2ggbnVuIHZvcnRyZWZmbGljaCByYXVjaGVuLiIsNzgpKTsKKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgIH0KKyAgICAgICAgZWxzZXsKKyAgICAgICAgICB3cml0ZShicmVha19zdHJpbmcoIkR1IHN0b3Bmc3QgRGVpbiBQZmVpZmNoZW4gbWl0ICIrCisgICAgICAgICAgIG9iLT5uYW1lKFdFTSwxKSsKKyAgICAgICAgICAgIiB1bmQgZnJldXN0IERpY2ggc2Nob24gZGFyYXVmLCBlcyB6dSByYXVjaGVuLiIsNzgpKTsKKyAgICAgICAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQodGhpc19wbGF5ZXIoKSksdGhpc19wbGF5ZXIoKS0+TmFtZSgpKworICAgICAgICAgICAiIHN0b3BmdCBlaW4gUGZlaWZjaGVuLlxuIiwoe3RoaXNfcGxheWVyKCl9KSk7CisgICAgICAgICAgaWYoIW9iLT5HZXRTbW9rZURlc2NyaXB0aW9uKCkpIGRlcz0iRXMgc2NoZWludCBzaWNoIHVtIGtlaW5lbiAiCisgICAgICAgICAgICJiZXNvbmRlcnMgZ3V0ZW4gVGFiYWsgenUgaGFuZGVsbi4gTnVuLCBqYS4gQmVzc2VyIGFscyBuaWNodHMgIgorICAgICAgICAgICAiaW1tZXJoaW4uIjsKKyAgICAgICAgICBlbHNlIGRlcz1vYi0+R2V0U21va2VEZXNjcmlwdGlvbigpOworICAgICAgICAgIGlmKCFvYi0+UXVlcnlQcm9wKFBfQU1PVU5UKSkKKyAgICAgICAgICAgIG9iLT5yZW1vdmUoKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBvYi0+QWRkQW1vdW50KC0xKTsKKyAgICAgICAgICBnZXN0b3BmdCA9IDE7CisgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICB9CisgICAgICAgfQorICAgICAgd3JpdGUoYnJlYWtfc3RyaW5nKCJEYXMgbGFlc3N0IHNpY2ggYWJlciBzY2hsZWNodCByYXVjaGVuLCBzdWNoICIKKyAgICAgICAiRGlyIGxpZWJlciBlaW5lbiBvcmRlbnRsaWNoZW4gVGFiYWsuIiw3OCkpOworICAgICAgcmV0dXJuIDE7CisgICAgIH0KKyAgIH0KKyAgcmV0dXJuKDApOyAvL25vbi12b2lkIEZ1bmt0aW9uLCBaZXNzdHJhCit9CisKK3N0YXRpYyBpbnQgY21fc21va2Uoc3RyaW5nIHN0cil7CisgIG9iamVjdCBvYjsKKworICBfbm90aWZ5X2ZhaWwoIldhcyBtb2VjaHRlc3QgRHUgcmF1Y2hlbj9cbiIpOworICBpZighc3RyKSByZXR1cm4gMDsKKyAgaWYoIWlkKHN0cikpIHJldHVybiAwOworICBpZihyYXVjaGVuKXsKKyAgICB3cml0ZSgiRGFzIG1hY2hzdCBEdSBkb2NoIGJlcmVpdHMsIG5pY2h0IHNvIGhla3Rpc2NoLlxuIik7CisgICAgcmV0dXJuIDE7CisgICB9CisgIGlmKCFnZXN0b3BmdCl7CisgICAgd3JpdGUoIlZpZWxsZWljaHQgc29sbHRlc3QgRHUgRGVpbiBQZmVpZmNoZW4gZXJzdCBtYWwgc3RvcGZlbj9cbiIpOworICAgIHJldHVybiAxOworICAgfQorICBpZih0bSA+IHRpbWUoKSl7CisgICAgd3JpdGUoIk5hbmEsIGVpbiBQZmVpZmNoZW4gZ2VuaWVzc3QgbWFuLiBTZWkgbWFsIG5pY2h0IHNvIGhla3Rpc2NoLlxuIik7CisgICAgcmV0dXJuIDE7CisgICB9CisgIHRtID0gdGltZSgpKzIwOworICByYXVjaGVuID0gMTsKKyAgdGVsbF9yb29tKGVudmlyb25tZW50KHRoaXNfcGxheWVyKCkpLHRoaXNfcGxheWVyKCktPk5hbWUoKSsiIHJhdWNodCBpbiAiCisgICArIlJ1aGUgZWluIFBmZWlmY2hlbi5cbiIsKHt0aGlzX3BsYXllcigpfSkpOworICB3cml0ZSgiRHUgcmF1Y2hzdCBpbiBSdWhlIERlaW4gUGZlaWZjaGVuLlxuIik7CisgIHdyaXRlKGJyZWFrX3N0cmluZyhkZXMsNzgpKTsKKyAgaWYoZmluZF9jYWxsX291dCgic21va2UyIik9PS0xKQorICAgIGNhbGxfb3V0KCJzbW9rZTIiLDIwLGdldHVpZCh0aGlzX3BsYXllcigpKSk7CisgIHJldHVybiAxOworfQorCitpbnQgc21va2UyKG9iamVjdCBwbCl7CisgIG9iamVjdCBvYjsKKyAgaWYoIXJhdWNoZW4pIHJldHVybiAwOworICBpZighb2I9ZmluZF9wbGF5ZXIocGwpKSByZXR1cm4gMDsKKyAgaWYoZW52aXJvbm1lbnQoKSE9b2IpIHJldHVybiAwOworICB0ZWxsX29iamVjdChvYiwiR2VudWVzc2xpY2ggcHVzdGVzdCBEdSBlaW4gcGFhciBSYXVjaGtyaW5nZWwgaW4gZGllIEx1ZnQuXG4iKTsKKyAgdGVsbF9yb29tKGVudmlyb25tZW50KG9iKSxvYi0+TmFtZSgpKyIgcHVzdGV0IGdlbnVlc3NsaWNoIGVpbiBwYWFyICIKKyAgICsiUmF1Y2hrcmluZ2VsIGluIGRpZSBMdWZ0LlxuIiwoe29ifSkpOworICBpZihmaW5kX2NhbGxfb3V0KCJzbW9rZTMiKT09LTEpCisgICAgY2FsbF9vdXQoInNtb2tlMyIsMjAsZ2V0dWlkKGVudmlyb25tZW50KCkpKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBzbW9rZTMob2JqZWN0IHBsKXsKKyAgb2JqZWN0IG9iOworICBpZighcmF1Y2hlbikgcmV0dXJuIDA7CisgIGlmKCFvYj1maW5kX3BsYXllcihwbCkpIHJldHVybiAwOworICBpZihlbnZpcm9ubWVudCgpIT1vYikgcmV0dXJuIDA7CisgIHRlbGxfb2JqZWN0KG9iLGJyZWFrX3N0cmluZygiR2VudWVzc2xpY2ggcHVzdGVzdCBEdSBlaW4gcGFhciBSYXVjaGtyaW5nZWwgIgorICAgImluIGRpZSBMdWZ0LCByYXVjaHN0IERlaW4gUGZlaWZjaGVuIGF1ZiB1bmQga2xvcGZzdCBlcyBhdXMuIiw3OCkpOworICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQob2IpLGJyZWFrX3N0cmluZyhvYi0+TmFtZSgpKyIgcHVzdGV0IGdlbnVlc3NsaWNoIGVpbiAiCisgICAicGFhciBSYXVjaGtyaW5nZWwgaW4gZGllIEx1ZnQsIGJlZW5kZXQgZGFzIFJhdWNocGFldXNjaGVuIHVuZCBrbG9wZnQgIgorICAgKyhvYi0+UXVlcnlQcm9wKFBfR0VOREVSKT09MT8ic2VpbiI6ImlociIpKyIgUGZlaWZjaGVuIGF1cy4iLDc4KSwoe29ifSkpOworICByYXVjaGVuID0gMDsKKyAgZ2VzdG9wZnQgPSAwOworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2l0ZW1zL3NjaGF1ZmVsLmMgYi9pdGVtcy9zY2hhdWZlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNDk0MGIKLS0tIC9kZXYvbnVsbAorKysgYi9pdGVtcy9zY2hhdWZlbC5jCkBAIC0wLDAgKzEsMjYgQEAKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHJ0dF9jaGVja3MKKworaW5oZXJpdCAiL3N0ZC90aGluZyI7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKwordm9pZCBjcmVhdGUoKQoreworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfU0hPUlQsIkVpbmUgU2NoYXVmZWwiKTsKKyAgU2V0UHJvcChQX0xPTkcsIkR1IGthbm5zdCB2ZXJzdWNoZW4sIG1pdCBkaWVzZXIgU2NoYXVmZWwgenUgZ3JhYmVuLlxuIik7CisgIEFkZElkKCJzY2hhdWZlbCIpOworICBBZGRJZCgiXG5zY2hhdWZlbCIpOworICBTZXRQcm9wKFBfTkFNRSwgIlNjaGF1ZmVsIik7CisgIFNldFByb3AoUF9HRU5ERVIsIEZFTUFMRSk7CisgIFNldFByb3AoUF9WQUxVRSwgNTApOworICBTZXRQcm9wKFBfV0VJR0hULCAxMjAwKTsKKwlBZGRDbWQoICh7ImdyYWIiLCJncmFiZSIsImJ1ZGRlbCIsImJ1ZGRlbGUifSksICJncmFiIiApOworfQorCitpbnQgZ3JhYihzdHJpbmcgc3RyKSAKK3sKKyAgX25vdGlmeV9mYWlsKCJEdSBrYW5uc3QgaGllciBuaWNodCBncmFiZW4uXG4iKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9pdGVtcy9zZWVyY2FyZC5jIGIvaXRlbXMvc2VlcmNhcmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODk5ZTlmCi0tLSAvZGV2L251bGwKKysrIGIvaXRlbXMvc2VlcmNhcmQuYwpAQCAtMCwwICsxLDM1OSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIG9iai9zZWVyY2FyZC5jIC0tIGJhcmdlbGRsb3NlciBaYWhsdW5nc3ZlcmtlaHIgYXVmIEd1dGhhYmVuYmFzaXMKKy8vCisKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisKK2luaGVyaXQgIi9zdGQvdGhpbmciOworCisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPHVuaXQuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxtb25leS5oPgorCisjZGVmaW5lIEtPTlRPICJzZWVyY2FyZF9rb250b3N0YW5kIgorI2RlZmluZSBCRVNJVFpFUl9HVUVMVElHIFwKKyAgICAoZW52aXJvbm1lbnQoKSAmJiBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKGVudmlyb25tZW50KCkpICYmIFwKKyAgICBnZXR1aWQoZW52aXJvbm1lbnQoKSkgPT0gb3duZXIpCisKKy8vIHp1bSBkZWJ1Z2dlbiB1bmQgZXh0cmEgcHVibGljCitwdWJsaWMgc3RyaW5nIGRlYnVnbW9kZTsKK3B1YmxpYyBzdHJpbmcgX19zZXRfZGVidWcoc3RyaW5nIHJlY3YpIHtyZXR1cm4gZGVidWdtb2RlPXJlY3Y7fQorI2luY2x1ZGUgPGxpdmluZy9jb21tLmg+CisjZGVmaW5lIFpERUJVRyh4KSBpZiAoc3RyaW5ncChkZWJ1Z21vZGUpICYmIGZpbmRfcGxheWVyKGRlYnVnbW9kZSkpIFwKKyAgZmluZF9wbGF5ZXIoZGVidWdtb2RlKS0+UmVjZWl2ZU1zZyh4LE1UX0RFQlVHLDAsb2JqZWN0X25hbWUoKSsiOiAiLE1FKQorLy8jZGVmaW5lIFpERUJVRyh4KQorCitwcml2YXRlIHN0cmluZyBvd25lcjsKKworc3RhdGljIGludCBfcXVlcnlfYW1vdW50KCkKK3sKKyAgICBpbnQgcmVzOworCisgICAgLy8gV2VubiBkaWUgS2FydGUgaW0gSW52IGRlcyBCZXNpdHplcnMgaXN0LCBLb250b3N0YW5kIGxpZWZlcm4KKyAgICBpZiAoIEJFU0lUWkVSX0dVRUxUSUcgJiYgSVNfU0VFUihlbnZpcm9ubWVudCgpKSApeworICAgICAgICByZXMgPSAoaW50KSBlbnZpcm9ubWVudCgpLT5RdWVyeShLT05UTyk7CisKKyAgICAgICAgLy8gLi4uIGFsbGVyZGluZ3MgbnVyLCB3ZW5uIGVyIGd1ZWx0aWcgaXN0IDstKQorICAgICAgICBpZiAoICFpbnRwKHJlcykgfHwgcmVzIDwgMCB8fCByZXMgPiAxMDAwMDAgKQorICAgICAgICAgICAgcmV0dXJuIGVudmlyb25tZW50KCktPlNldCggS09OVE8sIDAgKSwgMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICAvLyBGdWVyIEZyZW1kZSBpc3QgZGllIEthcnRlIHdlcnRsb3MgKGJpcyBhdWYgaWhyZW4gTWF0ZXJpYWx3ZXJ0KQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RyaW5nIF9mZWxkKCkKK3sKKyAgICBpZiAoICFCRVNJVFpFUl9HVUVMVElHICkKKyAgICAgICAgcmV0dXJuIGJyZWFrX3N0cmluZyggIkRhcyBGZWxkIHNjaGltbWVydCBhdXMgamVkZXIgUmljaHR1bmcgYW5kZXJzIC0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWJlciBtZWhyIGthbm5zdCBEdSBuaWNodCBlcmtlbm5lbi4iLCA3OCApOworCisgICAgcmV0dXJuICJEdSBrYW5uc3QgaW4gZGVtIFNjaGltbWVybiBlaW4gcGFhciBaaWZmZXJuIGVya2VubmVuLlxuIjsKK30KKworCitzdGF0aWMgc3RyaW5nIF9iaWxkKCkKK3sKKyAgICBpZiAoIHRoaXNfcGxheWVyKCkgJiYgZ2V0dWlkKHRoaXNfcGxheWVyKCkpID09IG93bmVyICkKKyAgICAgICAgcmV0dXJuIGJyZWFrX3N0cmluZyggIkR1IGZpbmRlc3QsIGRhc3MgZGFzIEJpbGQgZ2FueiBzY2hsZWNodCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZXRyb2ZmZW4gaXN0LiBEYXNzIG1hbiBzZWxiZXIgYWJlciBhdWNoIGltbWVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvIHVudm9ydGVpbGhhZnQgYWJnZWJpbGRldCB3aXJkISIsIDc4ICk7CisKKyAgICByZXR1cm4gYnJlYWtfc3RyaW5nKCAiRHUgZmluZGVzdCwgZGFzcyAiICsgY2FwaXRhbGl6ZShvd25lcikgKyAiIHNlaHIgZ3V0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0cm9mZmVuIGlzdC4gQW5zY2hlaW5lbmQgd2lyc3QgbnVyIER1IGltbWVyIHNvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAidW52b3J0ZWlsaGFmdCBhYmdlYmlsZGV0LiIsIDc4ICk7Cit9CisKKy8vIFVlYmVyIGRhcyBBcmd1bWVudCA8c2lsZW50PiBrYW5uIG51biBnZXN0ZXVlcnQgd2VyZGVuLCBvYiBtYW4gZGllIAorLy8genVzYWV0emxpY2hlIE1lbGR1bmcgYXVzZ2ViZW4gd2lsbCBvZGVyIG5pY2h0LiBEaWVzIGlzdCBqZXR6dCBudXIgYmVpbQorLy8gVW50ZXJzdWNoZW4gZGVyIEthcnRlIGRlciBGYWxsLCBkZXIgQmVmZWhsICJndXRoYWJlbiIgZ2lidCB3aWUgZnJ1ZWhlcgorLy8gbnVyIGRhcyBHdXRoYWJlbiBhdXMuCitwcml2YXRlIHN0cmluZyBfZ3V0aGFiZW4oaW50IHNpbGVudCkKK3sKKyAgICBpbnQgaTsKKworICAgIGlmICggIUJFU0lUWkVSX0dVRUxUSUcgKQorICAgICAgICByZXR1cm4gIkR1IGthbm5zdCBpbSBTY2hpbW1lcm4gbmljaHRzIGVya2VubmVuLlxuIjsKKworICAgIGlmICggIShpID0gX3F1ZXJ5X2Ftb3VudCgpKSApCisgICAgICAgIHJldHVybiAiV2VsY2hlcyBHdXRoYWJlbj8gOi0pXG4iOworCisgICAgc3RyaW5nIG1zZyA9ICAKKyAgICAgICJEZWluIEd1dGhhYmVuIGJldHJhZWd0ICIgKyAoKGkgPiAxKSA/IHRvX3N0cmluZyhpKSA6ICJlaW5lIikgKworICAgICAgIiBNdWVuemUiICsgKChpID4gMSkgPyAibiIgOiAiIikgKyAiLlxuIjsKKyAgICBpZiAoICFzaWxlbnQgKSAKKyAgICAgIG1zZyArPSAKKyAgICAgICAgIkR1IGVyaW5uZXJzdCBEaWNoIGFuIGRpZSBXb3J0ZSBkZXMgU2NoYWx0ZXJiZWFtdGVuLCBkYXNzIERlaW5lICIKKyAgICAgICAgIlNlZXItQ2FyZCAoVE0pIGltbWVyIGVyc3QgZGFubiBiZWxhc3RldCB3aXJkLCB3ZW5uIER1IERlaW4gQmFyZ2VsZCAiCisgICAgICAgICJrb21wbGV0dCB2ZXJwdWx2ZXJ0IGhhc3QuIjsKKyAgICByZXR1cm4gYnJlYWtfc3RyaW5nKG1zZywgNzgsIDAsIEJTX0xFQVZFX01ZX0xGUyk7Cit9CisKKy8vIFdyYXBwZXIgZnVlciBkYXMgRGV0YWlsICJndXRoYWJlbiIsIHVtIGRhcyBuZXVlIEFyZ3VtZW50IGFuZ2ViZW4genUgCisvLyBrb2VubmVuCitzdGF0aWMgc3RyaW5nIF9ndXRoYWJlbl9kZXQoc3RyaW5nIGtleSkgeworICByZXR1cm4gX2d1dGhhYmVuKDApOworfQorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICAgIGlmICggIWNsb25lcChNRSkgKXsKKyAgICAgICAgc2V0X25leHRfcmVzZXQoLTEpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgOjpjcmVhdGUoKTsKKworICAgIFNldFByb3AoIFBfTE9HX0ZJTEUsICJyZXBvcnQvdGlhbWFrLnJlcCIgKTsKKyAgICBTZXRQcm9wKCBQX05BTUUsICJHZWxka2FydGUiICk7CisgICAgU2V0UHJvcCggUF9JTkZPLAorICAgICAgICAgICAgIGJyZWFrX3N0cmluZyggIlNvIHNlaHIgRHUgRGljaCBhdWNoIGFuc3RyZW5nc3QsIER1IGtvbW1zdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiZWluZmFjaCBuaWNodCBoaW50ZXIgZGFzIEdlaGVpbW5pcyBkaWVzZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkthcnRlLiBEdSB3ZWlzc3QgbnVyIGVpbmVzIG1pdCBTaWNoZXJoZWl0OiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXMgbXVzcyBldHdhcyBtaXQgTWFnaWUgenUgdHVuIGhhYmVuLiIsIDc4ICkgKTsKKyAgICBTZXRQcm9wKCBQX0dFTkRFUiwgRkVNQUxFICk7CisgICAgU2V0UHJvcCggUF9NQVRFUklBTCwgKFsgTUFUX1BFQVJfV09PRDogODAsIE1BVF9NSVNDX01BR0lDOiAyMCBdKSApOworICAgIFNldFByb3AoIFBfV0VJR0hULCA1MCApOworICAgIFNldFByb3AoIFBfVkFMVUUsIDEwMDAgKTsKKyAgICBTZXRQcm9wKCBQX05PQlVZLCAxICk7CisKKyAgICBBZGRTb3VuZHMoIFNFTlNFX0RFRkFVTFQsCisgICAgICAgICAgICAgICBicmVha19zdHJpbmcoICJEdSBrYW5uc3QgbmljaHRzIGhvZXJlbi4gRXMgc2luZCBhbnNjaGVpbmVuZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdWNoIGtlaW5lIGxvc2VuIFRlaWxlIHZvcmhhbmRlbi4iLCA3OCApICk7CisKKyAgICBBZGRTbWVsbHMoIFNFTlNFX0RFRkFVTFQsICJBdWNoIGJhcmdlbGRsb3NlIFphaGx1bmdzbWl0dGVsIHN0aW5rZW4gIgorICAgICAgICAgICAgICAgIm5pY2h0LiA7LSlcbiIgKTsKKworICAgIEFkZERldGFpbCggInNpY2hlcmhlaXQiLCAiU28gZXR3YXMgYmlldGV0IGRpZXNlIEthcnRlIG5pY2h0IVxuIiApOworICAgIEFkZERldGFpbCggImdlaGVpbW5pcyIsICJFcyBsYXV0ZXQgXCJndXRoYWJlblwiLiBBYmVyIHZlcnJhdGUgZXMgIgorICAgICAgICAgICAgICAgIm5pY2h0IHdlaXRlciFcbkFuZ2VibGljaCBrYW5uc3QgRHUgZGFzIEd1dGhhYmVuIHNvZ2FyIGRpcmVrdCAiCisgICAgICAgICAgICAgICAid2llZGVyIGFiaGViZW4uXG4iICk7CisgICAgQWRkRGV0YWlsKCAibWFnaWUiLCAiV2VubiBtYW4gc2llIHNvIGVpbmZhY2ggdW50ZXJzdWNoZW4ga29lbm50ZSwgIgorICAgICAgICAgICAgICAgIndhZXJlIHNpZSBuaWNodCBoYWxiIHNvXG5nZWhlaW1uaXN2b2xsLlxuIiApOworICAgIEFkZERldGFpbCggInJlY2h0ZWNrIiwKKyAgICAgICAgICAgICAgIGJyZWFrX3N0cmluZyggIkFuIGRpZXNlciBLYXJ0ZSBpc3QgYWxsZXMgcmVjaHRlY2tpZzogZGFzIEJpbGQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhcyBtZXJrd3VlcmRpZ2UgRmVsZCB1bmQgZGllIEthcnRlIHNlbGJlci4iLAorICAgICAgICAgICAgICAgNzgpICk7CisgICAgQWRkRGV0YWlsKCAoeyAiaG9seiIsICJiaXJuYmF1bWhvbHoiIH0pLCAiRXMgaGFuZGVsdCBzaWNoIHVtIGRhcyAiCisgICAgICAgICAgICAgICAibWluZGVzdGVucyBnZW5hdXNvIHNlbHRlbmUgd2llIG1hZ2lzY2hlIEJpcm5iYXVtaG9sei5cbiIgKTsKKyAgICBBZGREZXRhaWwoICh7ICJzY2hyaWZ0enVnIiwgInNjaHJpZnQiIH0pLCAiTnVyIHdvIFwiU2Vlci1DYXJkXCIgZHJhdWYgIgorICAgICAgICAgICAgICAgInN0ZWh0LCBpc3QgYXVjaCB3aXJrbGljaCBlaW5lIFNlZXItQ2FyZCBkcmluLlxuIiApOworICAgIEFkZERldGFpbCggKHsgImJ1Y2hzdGFiZSIsICJidWNoc3RhYmVuIiB9KSwgIlNpZSBiaWxkZW4gZGVuICIKKyAgICAgICAgICAgICAgICJ1bnZlcm1laWRsaWNoZW4gU2NocmlmdHp1ZyBcIlNlZXItQ2FyZCAoVE0pXCIuXG4iICk7CisgICAgQWRkRGV0YWlsKCAiZHJpdHRlbCIsICJOYSB1bnRlbiBoYWx0LlxuIiApOworICAgIEFkZERldGFpbCggKHsgInNlaXRlIiwgInNlaXRlbiIgfSksICJFaW5lIHZvbiBiZWlkZW4uXG4iICk7CisgICAgQWRkRGV0YWlsKCAoeyAicmVjaHRlIHNlaXRlIiwgInJlY2h0cyIgfSksICJEYXMgaXN0IGRpZSBlaW5lLlxuIiApOworICAgIEFkZERldGFpbCggKHsgImxpbmtlIHNlaXRlIiwgImxpbmtzIiB9KSwgIkRhcyBpc3QgZGllIGFuZGVyZS5cbiIgKTsKKyAgICBBZGREZXRhaWwoICJydWVja3NlaXRlIiwgIkRpZSBSdWVja3NlaXRlIGlzdCB0b3RhbCBsZWVyIHVuZCAiCisgICAgICAgICAgICAgICAibGFuZ3dlaWxpZy5cbiIgKTsKKyAgICBBZGREZXRhaWwoICh7ICJ6YWhsIiwgInphaGxlbiIsICJ6aWZmZXJuIiwgInppZmZlciIgfSksICJWaWVsbGVpY2h0IHNvbGxlbiAiCisgICAgICAgICAgICAgICAic2llIERlaW4gR3V0aGFiZW4gZGFyc3RlbGxlbj9cbiIgKTsKKyAgICBBZGREZXRhaWwoICh7ICJmZWxkIiwgInNjaGltbWVybiIsICJyaWNodHVuZyIgfSksICMnX2ZlbGQvKicqLyApOworICAgIEFkZERldGFpbCggImJpbGQiLCAjJ19iaWxkLyonKi8gKTsKKyAgICBBZGREZXRhaWwoICJndXRoYWJlbiIsICMnX2d1dGhhYmVuX2RldC8qJyovICk7CisgICAgQWRkRGV0YWlsKCAoeyAibXVlbnplIiwgIm11ZW56ZW4iIH0pLCAiVGlwcCBtYWwgXCJndXRoYWJlblwiIGVpbi5cbiIgKTsKKworICAgIEFkZENtZCggImd1dGhhYmVuIiwgIl9rb250b3N0YW5kIiApOworICAgIEFkZENtZCggKHsgImhlYiIsICJoZWJlIiB9KSwgIl9hYmhlYmVuIiApOworCisgICAgQWRkSWQoICh7IFNFSEVSS0FSVEVJRCwgImdlbGRrYXJ0ZSIsICJzZWVyY2FyZCIsICJzZWVyLWNhcmQiLAorICAgICAgICAgICAgICAgICAgImthcnRlIiwgImNhcmQiIH0pICk7Cit9CisKKworc3RhdGljIGludCBfa29udG9zdGFuZCggc3RyaW5nIHN0ciApCit7CisgICAgaWYgKCAhdGhpc19wbGF5ZXIoKSB8fCBlbnZpcm9ubWVudCh0aGlzX29iamVjdCgpKSAhPSB0aGlzX3BsYXllcigpICkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoICFzdHIgfHwgc3RyID09ICIiICl7CisgICAgICAgIHdyaXRlKCBfZ3V0aGFiZW4oMSkgKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKworLy8gQWJmcmFnZSBkZXMgS2FydGVuYmVzaXR6ZXJzIHZvbiBhdXNzZW4KK3B1YmxpYyBzdHJpbmcgcXVlcnlfb3duZXIoKQoreworICAgIHJldHVybiBvd25lcjsKK30KKworCisvLyBMb2thbGUgUHJvcGVydHktTWV0aG9kZW4KKworc3RhdGljIHN0cmluZyBfcXVlcnlfbG9uZygpCit7CisgICAgc3RyaW5nIHN0cjsKKworICAgIHN0ciA9ICJFaWdlbnRsaWNoIGlzdCBkaWUgU2Vlci1DYXJkIHppZW1saWNoIHNjaGxpY2h0IGdlaGFsdGVuLiBTaWUgaXN0ICIKKyAgICAgICAgImFscyBlaW4gZXR3YSBkYXVtZW5kaWNrZXMgUmVjaHRlY2sgYXVzIGR1bmtsZW0gSG9seiBnZWZvcm10LiAiCisgICAgICAgICJBdWYgZGVyIHJlY2h0ZW4gU2VpdGUgaXN0IGVpbiBCaWxkIHZvbiAiICsKKyAgICAgICAgKCh0aGlzX3BsYXllcigpICYmIGdldHVpZCh0aGlzX3BsYXllcigpKSA9PSBvd25lcikgPyAiRGlyIiA6CisgICAgICAgICBjYXBpdGFsaXplKG93bmVyKSkgKyAiIGF1ZmdlbWFsdC4gTGlua3MgIgorICAgICAgICAiZGFuZWJlbiBiZWZpbmRldCBzaWNoIGVpbiBzY2htdWNrZXIgU2NocmlmdHp1ZyBpbiBncm9zc2VuIHNpbGJlcm5lbiAiCisgICAgICAgICJCdWNoc3RhYmVuLiBJbSB1bnRlcmVuIERyaXR0ZWwgZGVyIEthcnRlIGJlZmluZGV0IHNpY2ggZWluIGRlemVudCAiCisgICAgICAgICJzY2hpbW1lcm5kZXMgcmVjaHRlY2tpZ2VzIEZlbGQuIjsKKworICAgIHJldHVybiBicmVha19zdHJpbmcoIHN0ciwgNzgsIDAsIEJTX0xFQVZFX01ZX0xGUyApOworfQorCisKK3N0YXRpYyBzdHJpbmcgX3F1ZXJ5X3Nob3J0KCkKK3sKKyAgICBpZiAoICFvd25lciB8fCAhc2l6ZW9mKG93bmVyKSApCisgICAgICAgIHJldHVybiAiRWluZSBHZWxka2FydGUiOworCisgICAgaWYgKCB0aGlzX3BsYXllcigpICYmIGdldHVpZCh0aGlzX3BsYXllcigpKSA9PSBvd25lciApCisgICAgICAgIHJldHVybiAiRGVpbmUgU2Vlci1DYXJkIChUTSkiOworCisgICAgcmV0dXJuICJEaWUgR2VsZGthcnRlIHZvbiAiICsgY2FwaXRhbGl6ZShvd25lcik7Cit9CisKKworc3RhdGljIHN0cmluZyBfcXVlcnlfYXV0b2xvYWRvYmooKQoreworICAgIC8vIERpZSBLYXJ0ZSBpc3QgbnVyIGZ1ZXIgZGVuIEVpZ2VudHVlbWVyIGF1dG9sb2FkIC0gYXVjaCwgd2VubiBzaWUgaW4KKyAgICAvLyBlaW5lbSBQYWtldCBvLmFlLiBzdGVja3QKKyAgICBmb3JlYWNoIChvYmplY3QgZW52OiBhbGxfZW52aXJvbm1lbnQoKSkKKyAgICB7CisgICAgICBpZiAoZ2V0dWlkKGVudikgPT0gb3duZXIpCisgICAgICAgICAgcmV0dXJuIG93bmVyOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RyaW5nIF9zZXRfYXV0b2xvYWRvYmooIHN0cmluZyB3ZXJ0ICkKK3sKKyAgICAvLyBEYXJmIG5hY2ggUGVyc29uYWxpc2llcnVuZyBuaWNodCBtZWhyIGdlYWVuZGVydCB3ZXJkZW4uCisgICAgaWYgKCAhb3duZXIgJiYgc3RyaW5ncCh3ZXJ0KSApCisgICAgeworCisgICAgICAgIGlmICggbWVtYmVyKCAoeyAneCcsICd6JywgJ3MnIH0pLCB3ZXJ0WzwxXSApICE9IC0xICl7CisgICAgICAgICAgICBBZGRBZGplY3RpdmUoIHdlcnQrIiciICk7CisgICAgICAgICAgICBBZGRBZGplY3RpdmUoIHdlcnQgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggd2VydFs8MV0gIT0gJ3MnICkKKyAgICAgICAgICAgIEFkZEFkamVjdGl2ZSggd2VydCsicyIgKTsKKworICAgICAgICByZXR1cm4gb3duZXIgPSB3ZXJ0OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RyaW5nIF9xdWVyeV9rZWVwX29uX3NlbGwoKQoreworICAgIC8vIERlciBCZXNpdHplciBkZXIgS2FydGUgJ2JlaGFlbHQnIHNpZSBhdXRvbWF0aXNjaAorICAgIC8vIFRlaWwgMiBkZXIgQWJmcmFnZSwgZmFsbHMgZGllIEthcnRlIGluIGVpbmVtIFBha2V0IG8uYWUuIHN0ZWNrdAorICAgIGlmICggQkVTSVRaRVJfR1VFTFRJRyB8fCB0aGlzX3BsYXllcigpICYmIGdldHVpZCh0aGlzX3BsYXllcigpKSA9PSBvd25lciApCisgICAgICAgIHJldHVybiBvd25lcjsKKworICAgIC8vIEJlaSBkZW4gYW5kZXJlbiBqZSBuYWNoIFd1bnNjaAorICAgIHJldHVybiBRdWVyeShQX0tFRVBfT05fU0VMTCk7Cit9CisKKworLy8gTWFuIGthbm4gYXVzIGRlbSBHdXRoYWJlbiBhdWNoIHdpZWRlciBrbGluZ2VuZGUgTXVlbnplbiBtYWNoZW4uCisvLyBXZW5uIGVzIGRlbm4gc2VpbiBtdXNzLgorc3RhdGljIGludCBfYWJoZWJlbiggc3RyaW5nIHN0ciApCit7CisgICAgaW50IHN1bW1lLCBndXRoYWJlbjsKKyAgICBzdHJpbmcgZHVtbXk7CisgICAgCisgICAgaWYgKCAhdGhpc19wbGF5ZXIoKSB8fCBlbnZpcm9ubWVudCh0aGlzX29iamVjdCgpKSAhPSB0aGlzX3BsYXllcigpICkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoIHN0ciA9PSAiMSBtdWVuemUgYWIiICkKKyAgICAgICAgc3VtbWUgPSAxOworICAgIGVsc2UKKyAgICAgICAgaWYgKCAhc3RyaW5ncChzdHIpIHx8CisgICAgICAgICAgICAgc3NjYW5mKCBzdHIsICIlZCBtdWVuemVuIGFiJXMiLCBzdW1tZSwgZHVtbXkgKSAhPSAyIHx8CisgICAgICAgICAgICAgc3VtbWUgPCAxIHx8IGR1bW15ICE9ICIiICl7CisgICAgICAgICAgICBfbm90aWZ5X2ZhaWwoICJXaWV2aWVsZSBNdWVuemVuIG1vZWNodGVzdCBEdSBkZW5uIGFiaGViZW4/XG4iICk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgaWYgKCAoZ3V0aGFiZW4gPSBfcXVlcnlfYW1vdW50KCkpIDwgc3VtbWUgKXsKKyAgICAgICAgX25vdGlmeV9mYWlsKCAiU28gaG9jaCBpc3QgRGVpbiBHdXRoYWJlbiBhYmVyIG5pY2h0IVxuIiApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoIChpbnQpIHRoaXNfcGxheWVyKCktPkFkZE1vbmV5KHN1bW1lKSAhPSAxICl7CisgICAgICAgIHdyaXRlKCAiU292aWVsIEdlbGQga29lbm50ZXN0IER1IGdhciBuaWNodCBtZWhyIHRyYWdlbi5cbiIgKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgZW52aXJvbm1lbnQoKS0+U2V0KCBLT05UTywgZ3V0aGFiZW4gLSBzdW1tZSApOworCisgICAgd3JpdGUoIGJyZWFrX3N0cmluZyggIkR1IHNjaHVldHRlbHN0IERlaW5lIFNlZXItQ2FyZCAoVE0pIHZvcnNpY2h0aWcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJoaW4gdW5kIGhlciB1bmQgbXVybWVsc3QgZWluIHBhYXIgZ2VoZWltZSBXb3J0ZS5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiUGxvZXR6bGljaCBtYWNodCBlcyAqUExPUFAqIHVuZCBEdSBoYWVsdHN0IEdlbGQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBkZW4gSGFlbmRlbiEiLCA3OCwgMCwgQlNfTEVBVkVfTVlfTEZTICkgKTsKKyAgICByZXR1cm4gMTsKK30KKworcHJvdGVjdGVkIHZvaWQgTm90aWZ5TW92ZShvYmplY3QgZGVzdCwgb2JqZWN0IG9sZGVudiwgaW50IG1ldGhvZCkKK3sKKyAgICA6Ok5vdGlmeU1vdmUoZGVzdCxvbGRlbnYsbWV0aG9kKTsKKworICAgIC8vIEJlc2l0emVyIGRlciBLYXJ0ZSBzZXR6ZW4sIGZhbGxzIG5vY2gga2VpbmVyIGV4aXN0aWVydAorICAgIGlmICggIW93bmVyICYmIGVudmlyb25tZW50KCkgJiYKKyAgICAgICAgIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoZW52aXJvbm1lbnQoKSkgKQorICAgIHsKKyAgICAgICAgIG93bmVyID0gZ2V0dWlkKGVudmlyb25tZW50KCkpOworCisgICAgICAgIGlmICggbWVtYmVyKCAoeyAneCcsICd6JywgJ3MnIH0pLCBvd25lcls8MV0gKSAhPSAtMSApeworICAgICAgICAgICAgQWRkQWRqZWN0aXZlKCBvd25lciApOworICAgICAgICAgICAgQWRkQWRqZWN0aXZlKCBvd25lcisiJyIgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIG93bmVyWzwxXSAhPSAncycgKQorICAgICAgICAgICAgQWRkQWRqZWN0aXZlKCBvd25lcisicyIgKTsKKyAgICB9Cit9CisKK3ZhcmFyZ3MgaW50IGlkKHN0cmluZyBzdHIsIGludCBsdmwpCit7CisgIGlmIChzdHI9PVNFSEVSS0FSVEVJRF9BS1RJVgorICAgICAgJiYgQkVTSVRaRVJfR1VFTFRJRykKKyAgICAgIHJldHVybiAxOworICByZXR1cm4gOjppZChzdHIsIGx2bCk7Cit9CisKK3B1YmxpYyB2b2lkIE1lcmdlTW9uZXkob2JqZWN0IGdlbGQpCit7CisgIGlmIChnZWxkICYmIHByZXZpb3VzX29iamVjdCgpID09IGdlbGQKKyAgICAgICYmIGxvYWRfbmFtZShnZWxkKSA9PSBHRUxECisgICAgICAmJiBCRVNJVFpFUl9HVUVMVElHKQorICB7CisgICAgaW50IGZyZW1kYW1vdW50ID0gZ2VsZC0+UXVlcnlQcm9wKFBfQU1PVU5UKTsKKyAgICBpbnQgbWVpbmFtb3VudCA9IF9xdWVyeV9hbW91bnQoKTsKKyAgICBaREVCVUcoc3ByaW50ZigiTWVyZ2VNb25leTogbWVpbmFtb3VudDogJWQsIGZyZW1kYW1vdW50OiAlZFxuIiwKKyAgICAgICAgICBtZWluYW1vdW50LGZyZW1kYW1vdW50KSk7CisgICAgaWYgKG1laW5hbW91bnQgPiAwICYmIGZyZW1kYW1vdW50IDwgMCkKKyAgICB7CisgICAgICBpbnQgYW1vdW50X3RvX21lcmdlID0gbWluKG1laW5hbW91bnQsIGFicyhmcmVtZGFtb3VudCkpOworICAgICAgZW52aXJvbm1lbnQoKS0+U2V0KCBLT05UTywgbWVpbmFtb3VudCAtIGFtb3VudF90b19tZXJnZSwgRl9WQUxVRSApOworICAgICAgZ2VsZC0+U2V0UHJvcChQX0FNT1VOVCwgZnJlbWRhbW91bnQgKyBhbW91bnRfdG9fbWVyZ2UpOworICAgIH0KKyAgICBaREVCVUcoc3ByaW50ZigiTWVyZ2VNb25leTogRmluYWw6IG1laW5hbW91bnQ6ICVkLCBmcmVtZGFtb3VudDogJWRcbiIsCisgICAgICAgICAgX3F1ZXJ5X2Ftb3VudCgpLGdlbGQtPlF1ZXJ5UHJvcChQX0FNT1VOVCkpKTsKKyAgfQorfQorCisvLyBGdWVyIGRpZSBadW9yZG51bmcgZHVyY2ggZGFzIEhvZXJyb2hyIGV0Yy4KK3B1YmxpYyBzdHJpbmcgR2V0T3duZXIoKQoreworICAgIHJldHVybiAiVGlhbWFrIjsKK30KZGlmZiAtLWdpdCBhL2l0ZW1zL3NlaWwuYyBiL2l0ZW1zL3NlaWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWNmMDc5Ci0tLSAvZGV2L251bGwKKysrIGIvaXRlbXMvc2VpbC5jCkBAIC0wLDAgKzEsMjg2IEBACisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8c2VpbC5oPgoraW5oZXJpdCAiL3N0ZC90aGluZyI7CisKKyNwcmFnbWEgc3RyaWN0X3R5cGVzLHJ0dF9jaGVja3MKKworb2JqZWN0IHRpZWRfdG9fb2I7CitzdHJpbmcgdGllZF9uYW1lOworCit2b2lkIGNyZWF0ZSgpeworICA6OmNyZWF0ZSgpOworCisgIEFkZElkKCAoeyJzZWlsIiwgIlxuc2VpbCJ9KSApOworICBTZXRQcm9wKFBfTkFNRSwgIlNlaWwiKTsKKworICBTZXRQcm9wKFBfR0VOREVSLCBORVVURVIpOworICBTZXRQcm9wKFBfTE9ORyxicmVha19zdHJpbmcoIkR1IHNpZWhzdCBlaW4gZ2FueiBub3JtYWxlcyBTZWlsLiBEdSBrYW5uc3QgZXMgYW4gIisKKyAgICAgICAgICAgICAgICAgICJHZWdlbnN0YWVuZGVuIGZlc3RiaW5kZW4gdW5kIHdpZWRlciBsb2VzZW4uIERhcyBTZWlsIGJlc3RlaHQgIisKKyAgICAgICAgICAgICAgICAgICJhdXMgc29saWRlciBmZXN0ZXIgU3RlaW5iZWlzc2Vyd29sbGUuIiw3OCkpOworICBBZGREZXRhaWwoKHsid29sbGUiLCJzdGVpbmJlaXNzZXJ3b2xsZSJ9KSwiRGllc2UgV29sbGUgaXN0IGVpbmUgYmVzb25kZXJzIGZlc3RlIHVuZCBzdGFiaWxlIFdvbGxlLlxuIik7CisgIFNldFByb3AoUF9WQUxVRSwgMTUpOworICBTZXRQcm9wKFBfVElFX0FVVE8sMSk7CisgIFNldFByb3AoUF9XRUlHSFQsIDMwMCk7CisKKyAgU2V0UHJvcChQX01BVEVSSUFMLCh7TUFUX01JU0NfU1RPTkUsTUFUX1dPT0x9KSk7CisgIEFkZENtZCggKHsiYmluZGUiLCJiaW5kIiwia25vdGUiLCJiZWZlc3RpZ2UiLCJtYWNoIiwibWFjaGUifSksICJ0aWUiICk7CisKKyAgLy8gZGVyIEJlZmVobGUgbG9lc2VuIHdpcmQgYXVmIGRpZSBhbmRlcmVuIEJlZmVobGUgdW1nZWJvZ2VuIHVuZCBkaWVudCBudXIKKyAgLy8gZGVyIGJlc3NlcmVuIGJlbnV0emJhcmtlaXQgZGVzIHNlaWxlcy4KKyAgQWRkQ21kKCAoeyJsb2VzZSIgfSksICJsb2VzZW4iICk7CisKK30KKworLy8gZGllc2VzIERpbmcgd2lyZCB1LmEuIGdlZXJidC4gRGFtaXQgZGllIEJQIGJlaW0gRXJiZW4gYXVjaCBpbml0aWFsaXNpZXJ0CisvLyB3aXJkIChmdWVyIGRpZSBMYWVkZW4pLCBtdXNzIGNyZWF0ZV9zdXBlcigpIGRhcyBjcmVhdGUoKSBydWZlbi4KK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZV9zdXBlcigpIHsKKyAgY3JlYXRlKCk7Cit9CisKK3N0cmluZyBfcXVlcnlfc2hvcnQoKQoreworIHN0cmluZyBhcnRpa2VsOworIHN3aXRjaCggUXVlcnlQcm9wKFBfR0VOREVSKSApCisgeworICBjYXNlIE5FVVRFUiA6IGFydGlrZWw9ImRhcyI7YnJlYWs7CisgIGNhc2UgTUFMRSAgIDogYXJ0aWtlbD0iZGVyIjticmVhazsKKyAgY2FzZSBGRU1BTEUgOglhcnRpa2VsPSJkaWUiO2JyZWFrOworICBkZWZhdWx0ICAgICA6IGFydGlrZWw9ImRhcyI7CisgfQorCisgaWYgKHRpZWRfdG9fb2IpCisgIHJldHVybiB0aGlzX29iamVjdCgpLT5OYW1lKFdFUikrIiwgIithcnRpa2VsKyIgYW4gIgorICAgICArICh0aWVkX25hbWU/dGllZF9uYW1lOihzdHJpbmcpKHRpZWRfdG9fb2ItPm5hbWUoV0VNKSkpCisgICAgICsgIiBmZXN0Z2VidW5kZW4gaXN0IjsKKyByZXR1cm4gKHN0cmluZyl0aGlzX29iamVjdCgpLT5OYW1lKFdFUik7CisKK30KKworbWl4ZWQgX3F1ZXJ5X25vZ2V0KCkKK3sKKyBpZiAodGllZF90b19vYikKKyAgcmV0dXJuICJEYXMgZ2VodCBuaWNodCwgc29sYW5nZSAiK25hbWUoV0VSKSsiIGZlc3RnZWJ1bmRlbiBpc3QuXG4iOworIHJldHVybiAwOworfQorCitpbnQgdGllKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyB0MSwgdDI7CisgIG9iamVjdCBvYjsKKyAgc3RyaW5nIHZlcmI7CisgIG1hcHBpbmcgdGllZF9tYXA7CisKKyAgX25vdGlmeV9mYWlsKCJCaW5kZSB3YXM/XG4iKTsKKworICAvLyB6dW5hZWNoc3QgZGVuIFVzZXIgbm90aWVyZW4sIGRhbWl0IHNwYWV0ZXIgaW1tZXIgZHJhdWYgCisgIC8vIHp1Z2VncmlmZmVuIHdlcmRlbiBrYW5uLgorICAvLyBXZWdlbiBrb21wYXRpYmlsaXRhZXQgd2lyZCBkYXMgbmljaHQgZGlyZWt0IGFuIHRpZSgpL3VudGllKCkKKyAgLy8gdWViZXJnZWJlbi4KKyAgU2V0UHJvcChQX1RJRV9VU0VSLHRoaXNfcGxheWVyKCkpOworCisgIGlmICghc3RyfHwhc3RyaW5ncChzdHIpKSByZXR1cm4gMDsKKworICB2ZXJiID0gcXVlcnlfdmVyYigpOworICAKKyAgLy9hdXRvbWF0aXNjaGVyIGF1cyBvYmplY3Rlbi9yYWV1bWVuIGdlbmVyaWVydGVyIGF1ZnJ1ZgorICBpZihRdWVyeVByb3AoUF9USUVfVkVSQikpIHZlcmI9UXVlcnlQcm9wKFBfVElFX1ZFUkIpOyAKKyAgCQorICBpZiAoc3NjYW5mKHN0ciwgIiVzIGFuICVzIiwgdDEsIHQyKSAhPSAyICYmIAorICAgICAgc3NjYW5mKHN0ciwiJXMgbG9zIix0MSkgIT0gMSAmJgorICAgICAgc3NjYW5mKHN0ciwiJXMgZmVzdCIsdDEpICE9IDEgKQorICAgcmV0dXJuIDA7CisKKyAgaWYoaWQodDEpICYmIHN0cj09KHQxKyIgZmVzdCIpKSBzdHI9InNlaWwgYW4gcmF1bSI7CisKKyAgaWYoc3NjYW5mKHN0ciwiJXMgYW4gJXMiLHQxLHQyKT09MikKKyAgeworICAgaWYodGllZF90b19vYikKKyAgIHsKKyAgICB3cml0ZSgiRXMgaXN0IGJlcmVpdHMgaXJnZW5kd28gZmVzdGdlYnVuZGVuLlxuIik7CisgICAgcmV0dXJuIDE7CisgICB9CisKKyAgIGlmICghaWQodDEpKSByZXR1cm4gMDsKKworICAgaWYgKHQyID09ICJtaWNoIikKKyAgIHsKKyAgICBfbm90aWZ5X2ZhaWwoIldhcnVtIHdpbGxzdCBEdSBkYXMgZGVubiBtYWNoZW4/XG4iKTsKKyAgICByZXR1cm4gMDsKKyAgIH0KKworICAgb2IgPSBwcmVzZW50KHQyLCB0aGlzX3BsYXllcigpKTsJCQorCisgICBpZiAoIW9iKSBvYiA9IHByZXNlbnQodDIsIGVudmlyb25tZW50KHRoaXNfcGxheWVyKCkpKTsKKworICAgaWYgKCFvYikKKyAgIHsKKyAgICBpZiAoY2FsbF9vdGhlcihlbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKSwgImlkIiwgdDIpKQorICAgIG9iID0gZW52aXJvbm1lbnQodGhpc19wbGF5ZXIoKSk7CisgICB9CisJCQorICAgaWYoIW9iICYmIHN0ciA9PSAic2VpbCBhbiByYXVtIikKKyAgIHsKKyAgICBvYj1lbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKTsKKyAgIH0KKworICAgX25vdGlmeV9mYWlsKCAiU29ldHdhcyBmaW5kZXN0IER1IGhpZXIgbmljaHQuXG4iICk7CisgICBpZiAoIW9iKSByZXR1cm4gMDsKKworICAgaWYgKCEodGllZF9uYW1lPShzdHJpbmcpY2FsbF9vdGhlcihvYiwgInRpZSIsIHQyKSkpCisgICB7CisgICAgaWYob2ItPlF1ZXJ5UHJvcChQX0lOVklTKSkgcmV0dXJuIDA7CisgICAgCisgICAgaWYgKG9iICE9IGVudmlyb25tZW50KHRoaXNfcGxheWVyKCkpKQorICAgIHsKKyAgICAgX25vdGlmeV9mYWlsKCJEdSBrYW5uc3QgIituYW1lKFdFUikrIiBuaWNodCBhbiAiK29iLT5uYW1lKFdFTSkrCisgICAgICAgICAgICAgICAgICIgZmVzdGJpbmRlbi5cbiIpOworICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgX25vdGlmeV9mYWlsKCJEdSBrYW5uc3QgIituYW1lKFdFUikrIiBuaWNodCBkYXJhbiBmZXN0YmluZGVuLlxuIik7CisgICAgIHJldHVybiAwOworICAgIH0KKworICAgfQorCQkKKyAgLyogSXMgaGUgY2FycnlpbmcgdGhlIHJvcGUgPyAqLworICBpZiAoZW52aXJvbm1lbnQoKSA9PSB0aGlzX3BsYXllcigpKSAKKyAgeworICAgdGhpc19vYmplY3QoKS0+bW92ZShlbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKSk7CisgIH0KKworICB0aWVkX3RvX29iID0gb2I7CisKKyAgaWYgKHRpZWRfdG9fb2IgIT0gZW52aXJvbm1lbnQodGhpc19wbGF5ZXIoKSkgfHwgCisgICAgICBlbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKS0+bmFtZSgpIT0wICkKKyAgIHsKKyAgICB0aWVkX25hbWUgPSAoc3RyaW5nKSh0aWVkX3RvX29iLT5uYW1lKFdFTSkpOworICAgfQorICBlbHNlCisgICB7CisgICAgaWYoICFzdHJpbmdwKHRpZWRfbmFtZSkgKSB0aWVkX25hbWU9ImV0d2FzIjsKKyAgIH0KKworICBpZihRdWVyeVByb3AoUF9USUVfVkVSQikpCisgIHsKKyAgICAvLyBkYXMgc2VpbCB3aXJkIGdlc3RldWVydAorICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudCgpLFF1ZXJ5UHJvcChQX1RJRV9NRVNTQUdFKSk7CisKKyAgICAvLyBzZWlsIHdpZWRlciBpbiByb2gtenVzdGFuZCB2ZXJzZXR6ZW4uCisgICAgU2V0UHJvcChQX1VOVElFX01FU1NBR0UsMCk7CisgICAgU2V0UHJvcChQX1RJRV9WRVJCLDApOworICB9CisgIGVsc2UKKyAgeworICAgd3JpdGUoIkR1IGJpbmRlc3QgIituYW1lKFdFUikrIiBhbiAiICsgdGllZF9uYW1lICsgIiBmZXN0LlxuIik7CisgICBzYXkodGhpc19wbGF5ZXIoKS0+bmFtZShXRVIpICsgIiBiaW5kZXQgIituYW1lKFdFUikrIiBhbiAiCisgICArIHRpZWRfbmFtZSArICIgZmVzdC5cbiIpOworICB9CisKKyAgLy8gZGVuIG9iamVjdCBtaXR0ZWlsZW4sIGFuIHdlbiBlcyBnZWJ1bmRlbiBpc3QuCisgIGlmKHRpZWRfdG9fb2ItPlF1ZXJ5UHJvcChQX1RJRUQpPT0wKSB0aWVkX3RvX29iLT5TZXRQcm9wKFBfVElFRCwoW10pICk7CisgIHRpZWRfdG9fb2ItPlNldFByb3AoUF9USUVELHRpZWRfdG9fb2ItPlF1ZXJ5UHJvcChQX1RJRUQpKyhbdGhpc19vYmplY3QoKTogCisgICAgIChbCisgICAgICAgInBsYXllciI6dGhpc19wbGF5ZXIoKSwKKyAgICAgICAidGltZSIgIDp0aW1lKCkKKyAgICAgXSkgXSkpOworCisgIHJldHVybiAxOworIH0KKworIGlmKCAobWVtYmVyKCAoeworICAgICAgICAgImJpbmRlIiwKKyAgICAgICAgICJiaW5kIiwKKyAgICAgICAgICJrbm90ZSIsCisgICAgICAgICAibWFjaCIsCisgICAgICAgICAibWFjaGUiLAorICAgICAgICAgImxvZXNlIiAKKyAgICAgICAgIH0pLHZlcmIgICAgICAgICAgICAgICAgIAorICAgICkhPS0xKSAmJiAKKyAgICBzc2NhbmYoc3RyLCIlcyBsb3MiLHQxKT09MSkKKyAgeworICAgaWYgKCF0aWVkX3RvX29iKQorICAgeworICAgIHdyaXRlKE5hbWUoV0VSKSsiIGlzdCBuaXJnZW5kd28gZmVzdGdlYnVuZGVuLlxuIik7CisgICAgcmV0dXJuIDE7CisgICB9CisKKyAgIGlmICghY2FsbF9vdGhlcih0aWVkX3RvX29iLCAidW50aWUiKSkKKyAgIHsKKyAgICB3cml0ZSgiRGFzIGtsYXBwdCBsZWlkZXIgbmljaHQuXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgIH0KKworICAgaWYoUXVlcnlQcm9wKFBfVElFX1ZFUkIpKQorICAgeworICAgIC8vIGRhcyBzZWlsIHdpcmQgZ2VzdGV1ZXJ0CisgICAgdGVsbF9yb29tKGVudmlyb25tZW50KCksUXVlcnlQcm9wKFBfVU5USUVfTUVTU0FHRSkpOworCisgICAgLy8gd2llZGVyIGluIHJvaC16dXN0YW5kIHZlcnNldHplbi4KKyAgICBTZXRQcm9wKFBfVU5USUVfTUVTU0FHRSwwKTsKKyAgICBTZXRQcm9wKFBfVElFX1ZFUkIsMCk7CisgICB9CisgICBlbHNlCisgICB7CisgICAgd3JpdGUoIkR1IGJpbmRlc3QgIituYW1lKFdFUikrIiBsb3MuXG4iKTsKKyAgICBzYXkodGhpc19wbGF5ZXIoKS0+bmFtZSgpKyIgYmluZGV0ICIrbmFtZShXRVIpKyIgbG9zLlxuIik7CisgICB9CisKKyAgdGllZF9tYXA9KFtdKSt0aWVkX3RvX29iLT5RdWVyeVByb3AoUF9USUVEKTsKKyAgdGllZF9tYXA9bV9jb3B5X2RlbGV0ZSh0aWVkX21hcCx0aGlzX29iamVjdCgpKTsKKworICB0aWVkX3RvX29iLT5TZXRQcm9wKFBfVElFRCx0aWVkX21hcCk7CisKKyAgdGllZF90b19vYiA9IChvYmplY3QpIDA7CisgCisgIHJldHVybiAxOworIH0KKyByZXR1cm4gMDsKK30KKworaW50IGxvZXNlbihzdHJpbmcgc3RyKQoreworIGlmKHN0ciA9PSAic2VpbCIgIHx8CisgICAgc3RyID09IGxvd2VyX2Nhc2UoUXVlcnlQcm9wKFBfTkFNRSkpIHx8CisgICAgaWQoc3RyKQorICkKKyB7CisgIHJldHVybiB0aWUoInNlaWwgbG9zIik7CisgfQorIF9ub3RpZnlfZmFpbCgiV2FzIG1vZWNodGVzdCBEdSBsb2VzZW4/XG4iKTsKKyByZXR1cm4gMDsKK30KKworCitvYmplY3QgcXVlcnlfdGllZF90b19vYigpCit7CisgIHJldHVybiB0aWVkX3RvX29iOworfQorCit2YXJhcmdzIGludCBiaW5kZV9zZWlsKHN0cmluZyB6aWVsLHN0cmluZyBtc2cpCit7CisgaWYoIVF1ZXJ5UHJvcChQX1RJRV9BVVRPKSkgcmV0dXJuIDA7CisKKyAvLyBkaWVzZSBmdW5rdGlvbiBiaW5kZXQgZWluIFNlaWwgdW5kIGthbm4gdm9uIGVpbmVtIG9iamVjdCBhdXMgCisgLy8gYXVmZ2VydWZlbiB3ZXJkZW4uCisgU2V0UHJvcChQX1RJRV9WRVJCLCJiaW5kZSIpOworCisgaWYoIW1zZykgbXNnID0gTmFtZShXRVIpKyIgd2lyZCBhdWYgbWFnaXNjaGUgQXJ0IHVuZCBXZWlzZSBmZXN0Z2VidW5kZW4uXG4iOworCisgU2V0UHJvcChQX1RJRV9NRVNTQUdFLG1zZyk7CisgcmV0dXJuIHRpZSgic2VpbCBhbiAiK3ppZWwpOyAKK30KKwordmFyYXJncyBpbnQgbG9lc2Vfc2VpbChzdHJpbmcgbXNnKQoreworIGlmKCFRdWVyeVByb3AoUF9USUVfQVVUTykpIHJldHVybiAwOworCisgaWYoIW1zZykgbXNnID0gTmFtZShXRVIpKyIgbG9lc3Qgc2ljaC5cbiI7CisgCisgU2V0UHJvcChQX1RJRV9WRVJCLCJiaW5kZSIpOworIFNldFByb3AoUF9VTlRJRV9NRVNTQUdFLG1zZyk7CisgcmV0dXJuIHRpZSgic2VpbCBsb3MiKTsKK30KKwpkaWZmIC0tZ2l0IGEvb2JqLy5yZWFkbWUgYi9vYmovLnJlYWRtZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTc0ODNhCi0tLSAvZGV2L251bGwKKysrIGIvb2JqLy5yZWFkbWUKQEAgLTAsMCArMSw1IEBACitJbiBkaWVzZW0gVmVyemVpY2huaXMgYmVrb21tZW4gYWxsZSBPYmpla3RlIGRpZSBVSUQgZGVzIGVyemV1Z2VycyAod2FzCitkZW1lbnRzcHJlY2hlbmQgYmlzIEdvdHQgZ2VodCksIGRhaGVyIGR1ZXJmZW4gaGllciBudXIgRU0rIHNjaHJlaWJlbiB1bmQgaGllcgorYW5nZXNjaGxvc3NlbmVyIENvZGUgc29sbHRlIHNlaHIgZ3J1ZW5kbGljaCBnZXBydWVmdCB3ZXJkZW4uCitGdWVyIGdsb2JhbCB2ZXJmdWVnYmFyZSBJdGVtcyBpbiBTcGllbGVyaGFlbmRlbiBzb2xsdGUgL2l0ZW1zLyB2ZXJ3ZW5kZXQKK3dlcmRlbi4KZGlmZiAtLWdpdCBhL29iai9ib2Vyc2UuYyBiL29iai9ib2Vyc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjU0ZDc0Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL2JvZXJzZS5jCkBAIC0wLDAgKzEsMiBAQAorI3ByYWdtYSBub19jbG9uZQorCmRpZmYgLS1naXQgYS9vYmovZG9vcm1hc3Rlci5jIGIvb2JqL2Rvb3JtYXN0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmU5MzY0Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL2Rvb3JtYXN0ZXIuYwpAQCAtMCwwICsxLDQ2OSBAQAorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8bW92aW5nLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDxkb29ycm9vbS5oPgorCitpbmhlcml0ICIvc3RkL3RoaW5nIjsKKworI3ByYWdtYSBzdHJvbmdfdHlwZXMKKworcHJpdmF0ZSBtYXBwaW5nIGRvb3Jfc3RhdHVzOworcHJpdmF0ZSBpbnQgaWRfemFlaGxlcjsKKy8vIEZvcm1hdDogImZpbGVuYW1lMTpmaWxlbmFtZTIiOnN0YXR1cworCitpbnQgb2VmZm5lbiAoc3RyaW5nIHN0cik7CisKK21hcHBpbmcgUXVlcnlBbGxEb29ycygpIHtyZXR1cm4gZG9vcl9zdGF0dXM7fQorCitpbnQgUXVlcnlEb29yU3RhdHVzKHN0cmluZyBkZXN0KSB7CisgIHN0cmluZyBzb3VyY2UsZGtleTsKKyAgb2JqZWN0IGVudjsKKworICBpZiAoIWRlc3QpIHJldHVybiAwOworICBpZiAoIW9iamVjdHAoZW52PXByZXZpb3VzX29iamVjdCgpKSkgcmV0dXJuIDA7CisgIHNvdXJjZT1vYmplY3RfbmFtZShlbnYpOworICBka2V5PShzb3VyY2U8ZGVzdCk/KHNvdXJjZSsiOiIrZGVzdCk6KGRlc3QrIjoiK3NvdXJjZSk7CisgIHJldHVybiBkb29yX3N0YXR1c1tka2V5XTsKK30KKwordm9pZCBTZXREb29yU3RhdHVzKHN0cmluZyBkZXN0LCBpbnQgeCkgeworICBzdHJpbmcgc291cmNlLGRrZXk7CisgIG9iamVjdCBlbnY7CisKKyAgaWYgKCFkZXN0KSByZXR1cm47CisgIGlmICghb2JqZWN0cChlbnY9cHJldmlvdXNfb2JqZWN0KCkpKSByZXR1cm47CisgIHNvdXJjZT1vYmplY3RfbmFtZShlbnYpOworICBka2V5PShzb3VyY2U8ZGVzdCk/KHNvdXJjZSsiOiIrZGVzdCk6KGRlc3QrIjoiK3NvdXJjZSk7CisgIGRvb3Jfc3RhdHVzW2RrZXldPXg7Cit9CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpIHsKKyAgZG9vcl9zdGF0dXM9KFtdKTsKKyAgaWRfemFlaGxlcj0wOworICBpZiAoSVNfQ0xPTkUodGhpc19vYmplY3QoKSkpIHJlbW92ZSgpOworfQorCit2YXJhcmdzIGludCByZW1vdmUoaW50IHNpbGVudCkge3JldHVybiAwO30KKwordmFyYXJncyBpbnQgTmV3RG9vcihzdHJpbmd8c3RyaW5nKiBjbWRzLCBzdHJpbmcgZGVzdCwgc3RyaW5nfHN0cmluZyogaWRzLAorICAgICAgICAgICAgICAgICAgICBtYXBwaW5nfDxpbnR8c3RyaW5nfHN0cmluZyo+KiBwcm9wcykKK3sKKyAgb2JqZWN0IGVudjsKKyAgc3RyaW5nIHNvdXJjZSxka2V5LHNlY19pZDsKKyAgbWl4ZWQgKmluZm8yLHp3OworICBtYXBwaW5nIGluZm87CisgIGludCBpOworCisgIGlmICghb2JqZWN0cChlbnY9cHJldmlvdXNfb2JqZWN0KCkpKSByZXR1cm4gMDsKKyAgaWYgKCFjbWRzIHx8ICFkZXN0KSByZXR1cm4gMDsKKyAgaWYgKCFpZHMpIGlkcz0oeyJ0dWVyIn0pOworICBpZiAoc3RyaW5ncChjbWRzKSkgY21kcz0oe2NtZHN9KTsKKyAgaWYgKHN0cmluZ3AoaWRzKSkgaWRzPSh7aWRzfSk7CisgIGlmICghcG9pbnRlcnAoY21kcykgfHwgIXBvaW50ZXJwKGlkcykpIHJldHVybiAwOworICBpZiAoZGVzdFswLi4wXSE9Ii8iKSBkZXN0PSIvIitkZXN0OworICBpZF96YWVobGVyKys7CisgIHNlY19pZD1zcHJpbnRmKCJzZWN1cmVfaWQ6ZG9vciVkIixpZF96YWVobGVyKTsKKworICBpbmZvPShbRF9ERVNUICAgOiBkZXN0LAorCSBEX0NNRFMgICA6IGNtZHMsCisJIERfSURTICAgIDogKHsgc2VjX2lkIH0pICsgaWRzLAorCSBEX0ZMQUdTICA6IChET09SX0NMT1NFRHxET09SX1JFU0VUX0NMKSwKKyAgICAgICAgIERfTE9ORyAgIDogIkVpbmUgVHVlci5cbiIsCisJIERfU0hPUlQgIDogIkVpbmUgJXNlIFR1ZXIuICIsCisJIERfTkFNRSAgIDogIlR1ZXIiLAorCSBEX0dFTkRFUiA6IEZFTUFMRV0pOworICBzb3VyY2U9b2JqZWN0X25hbWUoZW52KTsKKyAgZGtleT0oc291cmNlPGRlc3QpPyhzb3VyY2UrIjoiK2Rlc3QpOihkZXN0KyI6Iitzb3VyY2UpOworCisgIGlmIChwb2ludGVycChwcm9wcykpIHsKKyAgICBmb3IgKGk9MDtpPHNpemVvZihwcm9wcyktMTtpKz0yKQorICAgICAgaWYgKGludHAocHJvcHNbaV0pICYmIHByb3BzW2ldPj1EX01JTlBST1BTICYmIHByb3BzW2ldPD1EX01BWFBST1BTKQorICAgICAgICBpbmZvW3Byb3BzW2ldXT1wcm9wc1tpKzFdOworICB9CisgIGVsc2UgaWYobWFwcGluZ3AocHJvcHMpKXsKKyAgICBpbmZvICs9IHByb3BzOworICB9CisKKyAgaWYgKCFkb29yX3N0YXR1c1tka2V5XSkgeworICAgIC8vIE51ciBpbml0aWFsaXNpZXJlbiwgd2VubiBUdWVyIG5vY2ggbmljaHQgZXhpc3RpZXJ0LgorICAgIGlmIChpbmZvW0RfRkxBR1NdICYgRE9PUl9PUEVOKQorICAgICAgICBkb29yX3N0YXR1c1tka2V5XT1EX1NUQVRVU19PUEVOOworICAgIGlmIChpbmZvW0RfRkxBR1NdICYgRE9PUl9DTE9TRUQpCisgICAgICAgIGRvb3Jfc3RhdHVzW2RrZXldPQorICAgICAgICAgICgoaW5mb1tEX0ZMQUdTXSAmIERPT1JfTkVFREtFWSkgPyBEX1NUQVRVU19MT0NLRUQgOiBEX1NUQVRVU19DTE9TRUQpOworICB9CisgIGluZm8yPWVudi0+UXVlcnlQcm9wKFBfRE9PUl9JTkZPUyk7CisgIGlmICghcG9pbnRlcnAoaW5mbzIpKQorICAgIGluZm8yPSh7aW5mb30pOworICBlbHNlCisgICAgaW5mbzIrPSh7aW5mb30pOworICBlbnYtPlNldFByb3AoUF9ET09SX0lORk9TLGluZm8yKTsKKworICBpZihtYXBwaW5ncChpbmZvW0RfTE9OR10pICYmIHBvaW50ZXJwKHp3PW1faW5kaWNlcyhpbmZvW0RfTE9OR10pKSAmJgorICAgICBzaXplb2YoencpICYmIGludHAoendbMF0pKQorICAgIGVudi0+QWRkU3BlY2lhbERldGFpbChpZHMsInNwZWNpYWxfZGV0YWlsX2Rvb3JzIik7CisgIGVsc2UgaWYoaW5mb1tEX0xPTkddICYmIGluZm9bRF9MT05HXSE9IiIpCisgICAgZW52LT5BZGREZXRhaWwoaWRzLGluZm9bRF9MT05HXSk7CisKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgaW5pdF9kb29ycyAoKSB7CisgIG9iamVjdCBlbnY7CisgIG1peGVkICppbmZvOworICBzdHJpbmcgc291cmNlLGRlc3QsZGtleTsKKyAgaW50IGk7CisKKyAgaWYgKCFvYmplY3RwKGVudj1wcmV2aW91c19vYmplY3QoKSkpIHJldHVybjsKKyAgaW5mbz1lbnYtPlF1ZXJ5UHJvcChQX0RPT1JfSU5GT1MpOworICBpZiAoIXBvaW50ZXJwKGluZm8pKSByZXR1cm47CisKKyAgc291cmNlPW9iamVjdF9uYW1lKGVudik7CisgIGZvciAoaT1zaXplb2YoaW5mbyktMTtpPj0wO2ktLSkgeworICAgIGlmICghbWFwcGluZ3AoaW5mb1tpXSkpIGNvbnRpbnVlOworICAgIGRlc3Q9aW5mb1tpXVtEX0RFU1RdOworICAgIGRrZXk9KHNvdXJjZTxkZXN0KT8oc291cmNlKyI6IitkZXN0KTooZGVzdCsiOiIrc291cmNlKTsKKyAgICBlbnYtPnNldF9kb29ycyhpbmZvW2ldW0RfQ01EU10sKGRvb3Jfc3RhdHVzW2RrZXldPjApKTsKKyAgfQorfQorCitzdHJpbmcgbG9va19kb29ycyAoKSB7CisgIG9iamVjdCBlbnY7CisgIG1peGVkICppbmZvLCBkczsKKyAgc3RyaW5nIHNvdXJjZSxka2V5LGRlc3QscmVzOworICBpbnQgaSwgc3Q7CisKKyAgaWYgKCFvYmplY3RwKGVudj1wcmV2aW91c19vYmplY3QoKSkpIHJldHVybiAiIjsKKyAgaW5mbz1lbnYtPlF1ZXJ5UHJvcChQX0RPT1JfSU5GT1MpOworICBpZiAoIXBvaW50ZXJwKGluZm8pKSByZXR1cm4gIiI7CisgIGluaXRfZG9vcnMoKTsgLy8gQWt0dWVsbGVyIFp1c3RhbmQgc29sbCBhdWNoIGJlaSBkZW4gRXhpdHMgYW5nZXplaWd0IHdlcmRlbgorCisgIHNvdXJjZT1vYmplY3RfbmFtZShlbnYpO3Jlcz0iIjsKKyAgZm9yIChpPXNpemVvZihpbmZvKS0xO2k+PTA7aS0tKSB7CisgICAgaWYgKCFtYXBwaW5ncChpbmZvW2ldKSkgY29udGludWU7CisgICAgZGVzdD1pbmZvW2ldW0RfREVTVF07CisgICAgZGtleT0oc291cmNlPGRlc3QpPyhzb3VyY2UrIjoiK2Rlc3QpOihkZXN0KyI6Iitzb3VyY2UpOworICAgIGlmIChzdHJpbmdwKGluZm9baV1bRF9TSE9SVF0pKSB7CisgICAgICByZXMrPXNwcmludGYoaW5mb1tpXVtEX1NIT1JUXSwKKwkJICAgICgoZG9vcl9zdGF0dXNbZGtleV0+PURfU1RBVFVTX09QRU4pPyJnZW9lZmZuZXQiOgorCQkJICgoZG9vcl9zdGF0dXNbZGtleV0hPURfU1RBVFVTX0NMT1NFRCk/ImFiIjoiIikrImdlc2NobG9zc2VuIikpOworCSAgaWYgKHNpemVvZihyZXMpICYmIHJlc1s8MV0hPSdcbicpCisJCXJlcys9IiAiOworCX0KKyAgICBlbHNlIGlmKG1hcHBpbmdwKGRzPWluZm9baV1bRF9TSE9SVF0pKXsKKyAgICAgIHN0PWRvb3Jfc3RhdHVzW2RrZXldOworICAgICAgaWYoKHN0PT1EX1NUQVRVU19MT0NLRUQpICYmICFkc1tEX1NUQVRVU19MT0NLRURdKQorICAgICAgICBzdD1EX1NUQVRVU19DTE9TRUQ7CisgICAgICBpZihzdHJpbmdwKGRzW3N0XSkpeworICAgICAgICByZXMgKz0gZHNbc3RdOworICAgICAgICBpZihzaXplb2YoZHNbc3RdKSAmJiByZXNbPDFdIT0nXG4nKXJlcys9IiAiOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAocmVzICYmIHJlcyE9IiIpCisgICAgcmV0dXJuIGJyZWFrX3N0cmluZyhyZXMsNzgsMCwxKTsKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQgZG9vcl9tZXNzYWdlKG9iamVjdCByb29tLCBzdHJpbmcgZG5hbWUsIGludCBkZ2VuZGVyLCBzdHJpbmcgbXNnKSB7CisgIG9iamVjdCBvYjsKKworICAvLyBwcmludGYoIiVPLCVPLCVPLCVPXG4iLHJvb20sZG5hbWUsZGdlbmRlcixtc2cpOworICBpZiAoIXJvb20gfHwgIWRuYW1lIHx8ICFtc2cpIHJldHVybjsKKyAgb2I9dGhpc19vYmplY3QoKTsKKyAgb2ItPlNldFByb3AoUF9OQU1FLGRuYW1lKTsKKyAgb2ItPlNldFByb3AoUF9HRU5ERVIsZGdlbmRlcik7CisgIG9iLT5TZXRQcm9wKFBfQVJUSUNMRSwxKTsKKyAgdGVsbF9yb29tKHJvb20sY2FwaXRhbGl6ZShvYi0+bmFtZShXRVIpKSttc2crIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGRvb3JfbWVzc2FnZV9vdGhlcihzdHJpbmcgc291cmNlLCBzdHJpbmcgZGVzdCwgc3RyaW5nIG1zZykgeworICBtaXhlZCBpbmZvOworICBvYmplY3QgZW52OworICBpbnQgaTsKKworICAvLyBwcmludGYoIiVPICVPICVPXG4iLHNvdXJjZSxkZXN0LG1zZyk7CisgIGlmICghc291cmNlIHx8ICFkZXN0IHx8ICFtc2cpIHJldHVybjsKKyAgaWYgKCFvYmplY3RwKGVudj1maW5kX29iamVjdChkZXN0KSkpIHJldHVybjsKKyAgaWYgKCFwb2ludGVycChpbmZvPWVudi0+UXVlcnlQcm9wKFBfRE9PUl9JTkZPUykpKSByZXR1cm47CisgIGZvciAoaT1zaXplb2YoaW5mbyktMTtpPj0wO2ktLSkgeworICAgIGlmICghbWFwcGluZ3AoaW5mb1tpXSkpIGNvbnRpbnVlOworICAgIGlmIChpbmZvW2ldW0RfREVTVF0hPXNvdXJjZSkgY29udGludWU7IC8vIEFuZGVyZSBUdWVyIHp1IGRpZXNlbSBSYXVtCisgICAgZG9vcl9tZXNzYWdlKGVudixpbmZvW2ldW0RfTkFNRV0saW5mb1tpXVtEX0dFTkRFUl0sbXNnKTsKKyAgfQorfQorCit2b2lkIHJlc2V0X2Rvb3JzICgpIHsKKyAgb2JqZWN0IGVudjsKKyAgbWl4ZWQgKmluZm87CisgIHN0cmluZyBzb3VyY2UsZGVzdCxka2V5LG1zZzsKKyAgaW50IGksajsKKworICBpZiAoIW9iamVjdHAoZW52PXByZXZpb3VzX29iamVjdCgpKSkgcmV0dXJuOworICBpbmZvPWVudi0+UXVlcnlQcm9wKFBfRE9PUl9JTkZPUyk7CisgIGlmICghcG9pbnRlcnAoaW5mbykpIHJldHVybjsKKworICBzb3VyY2U9b2JqZWN0X25hbWUoZW52KTsKKyAgZm9yIChpPXNpemVvZihpbmZvKS0xO2k+PTA7aS0tKSB7CisgICAgaWYgKCFtYXBwaW5ncChpbmZvW2ldKSkgY29udGludWU7CisgICAgZGVzdD1pbmZvW2ldW0RfREVTVF07CisgICAgZGtleT0oc291cmNlPGRlc3QpPyhzb3VyY2UrIjoiK2Rlc3QpOihkZXN0KyI6Iitzb3VyY2UpOworCisvLyAJaWYgKGRvb3Jfc3RhdHVzW2RrZXldPi0yICYmIGRvb3Jfc3RhdHVzW2RrZXldPDIpIHsKKy8vIAkgIGlmIChkb29yX3N0YXR1c1tka2V5XT4wKQorLy8gCQlkb29yX3N0YXR1c1tka2V5XT0yOworLy8gCSAgZWxzZQorLy8gCQlkb29yX3N0YXR1c1tka2V5XT0tMjsKKy8vIAkgIGNvbnRpbnVlOyAvLyBudXIgamVkZXIgMi4gUmVzZXQgd2lyZCBhdXNnZWZ1ZWhydC4KKy8vIAl9CisKKyAgICBpZiAoaW5mb1tpXVtEX0ZMQUdTXSAmIERPT1JfUkVTRVRfQ0wpIHsKKyAgICAgIC8vIFR1ZXIgbXVzcyBiZWkgUmVzZXQgZ2VzY2hsb3NzZW4gd2VyZGVuCisgICAgICBpZiAoZG9vcl9zdGF0dXNbZGtleV0gPj0gRF9TVEFUVVNfT1BFTikgeworICAgICAgICBpZighbXNnPWluZm9baV1bRF9SRVNFVF9NU0ddKW1zZz0iIHNjaGxpZXNzdCBzaWNoLiI7CisgICAgICAgIGRvb3JfbWVzc2FnZShlbnYsaW5mb1tpXVtEX05BTUVdLGluZm9baV1bRF9HRU5ERVJdLG1zZyk7CisgICAgICAgIGRvb3JfbWVzc2FnZV9vdGhlcihzb3VyY2UsZGVzdCxtc2cpOworICAgICAgfQorCSAgaWYgKGRvb3Jfc3RhdHVzW2RrZXldIT1EX1NUQVRVU19MT0NLRUQpCisJCWRvb3Jfc3RhdHVzW2RrZXldPQorICAgICAgKChpbmZvW2ldW0RfRkxBR1NdICYgRE9PUl9ORUVES0VZKSA/IERfU1RBVFVTX0xPQ0tFRCA6IERfU1RBVFVTX0NMT1NFRCk7CisgICAgfQorICAgIGlmIChpbmZvW2ldW0RfRkxBR1NdICYgRE9PUl9SRVNFVF9PUCkgeworICAgICAgLy8gVHVlciBtdXNzIGJlaSBSZXNldCBnZW9lZmZuZXQgd2VyZGVuCisgICAgICBpZiAoZG9vcl9zdGF0dXNbZGtleV0gPCBEX1NUQVRVU19PUEVOKSB7CisgICAgICAgIGlmKCFtc2c9aW5mb1tpXVtEX1JFU0VUX01TR10pbXNnPSIgb2VmZm5ldCBzaWNoLiI7CisgICAgICAgIGRvb3JfbWVzc2FnZShlbnYsaW5mb1tpXVtEX05BTUVdLGluZm9baV1bRF9HRU5ERVJdLG1zZyk7CisgICAgICAgIGRvb3JfbWVzc2FnZV9vdGhlcihzb3VyY2UsZGVzdCxtc2cpOworICAgICAgfQorICAgICAgZG9vcl9zdGF0dXNbZGtleV09RF9TVEFUVVNfT1BFTjsKKyAgICB9CisgIH0KKyAgaW5pdF9kb29ycygpOworfQorCitzdGF0aWMgdmFyYXJncyBpbnQgZXhlY19mdW5jMihzdHJpbmcgZGVzdCwgbWl4ZWQgZnVuYykgeworICBpZiAoIXN0cmluZ3AoZGVzdCkgfHwgIXN0cmluZ3AoZnVuYykpIHJldHVybiAxOworICBjYWxsX290aGVyKGRlc3QsZnVuYyk7CisgIHJldHVybiAxOworfQorCit2YXJhcmdzIGludCBnb19kb29yIChzdHJpbmcgc3RyKSB7CisgIG9iamVjdCBlbnYscGwsb2I7CisgIG1peGVkICppbmZvOworICBzdHJpbmcgc291cmNlLGRlc3QsZGtleTsKKyAgaW50IGk7CisKKyAgaWYgKCFzdHIpIHJldHVybiAwOworICBpZiAoIW9iamVjdHAoZW52PXByZXZpb3VzX29iamVjdCgpKSkgcmV0dXJuIDA7CisgIGlmICghb2JqZWN0cChwbD10aGlzX3BsYXllcigpKSkgcmV0dXJuIDA7CisgIGluZm89ZW52LT5RdWVyeVByb3AoUF9ET09SX0lORk9TKTsKKyAgaWYgKCFwb2ludGVycChpbmZvKSkgcmV0dXJuIDA7CisKKyAgc291cmNlPW9iamVjdF9uYW1lKGVudik7CisgIG9iPXRoaXNfb2JqZWN0KCk7CisgIG9iLT5TZXRQcm9wKFBfQVJUSUNMRSwxKTsKKyAgZm9yIChpPXNpemVvZihpbmZvKS0xO2k+PTA7aS0tKSB7CisgICAgaWYgKCFtYXBwaW5ncChpbmZvW2ldKSkgY29udGludWU7CisgICAgaWYgKG1lbWJlcihpbmZvW2ldW0RfQ01EU10sc3RyKTwwKSBjb250aW51ZTsKKyAgICBkZXN0PWluZm9baV1bRF9ERVNUXTsKKyAgICBka2V5PShzb3VyY2U8ZGVzdCk/KHNvdXJjZSsiOiIrZGVzdCk6KGRlc3QrIjoiK3NvdXJjZSk7CisgICAgb2ItPlNldFByb3AoUF9OQU1FLGluZm9baV1bRF9OQU1FXSk7CisgICAgb2ItPlNldFByb3AoUF9HRU5ERVIsaW5mb1tpXVtEX0dFTkRFUl0pOworICAgIG5vdGlmeV9mYWlsKGNhcGl0YWxpemUob2ItPm5hbWUoV0VSLDEpKSsiIGlzdCBnZXNjaGxvc3Nlbi5cbiIpOworICAgIGlmKChkb29yX3N0YXR1c1tka2V5XTw9MCkgJiYKKyAgICAgICAhaW5mb1tpXVtEX09QRU5fV0lUSF9NT1ZFXSkgY29udGludWU7IC8vIFR1ZXIgZ2VzY2hsb3NzZW4KKyAgICBpZihkb29yX3N0YXR1c1tka2V5XTw9MCl7CisgICAgICAvLyBJbiBkaWVzZW0gRmFsbCB2ZXJzdWNoZW4sIGRpZSBUdWVyIHp1IG9lZmZuZW4uCisgICAgICBvZWZmbmVuKGluZm9baV1bRF9JRFNdWzBdKTsKKyAgICB9CisgICAgbm90aWZ5X2ZhaWwoY2FwaXRhbGl6ZShvYi0+bmFtZShXRVIsMSkpKyIgaXN0IGdlc2NobG9zc2VuLlxuIik7CisgICAgaWYgKGRvb3Jfc3RhdHVzW2RrZXldPD0wKSBjb250aW51ZTsgLy8gVHVlciBpbW1lciBub2NoIHp1LgorICAgIGlmIChzdHJpbmdwKGluZm9baV1bRF9URVNURlVOQ10pKQorICAgICAgaWYgKGNhbGxfb3RoZXIoZW52LGluZm9baV1bRF9URVNURlVOQ10pKQorCQlyZXR1cm4gMTsgLy8gRHVyY2hnYW5nIHZvbiBkZXIgVHVlciBuaWNodCBlcmxhdWJ0LgorICAgIGlmIChzdHJpbmdwKGluZm9baV1bRF9GVU5DXSkpCisgICAgICBjYWxsX290aGVyKGVudixpbmZvW2ldW0RfRlVOQ10pOworCWlmIChzdHJpbmdwKGluZm9baV1bRF9NU0dTXSkpIHsKKwkgIGlmIChwbC0+bW92ZShkZXN0LE1fR08saW5mb1tpXVtEX01TR1NdKT4wKQorCQlyZXR1cm4gZXhlY19mdW5jMihkZXN0LGluZm9baV1bRF9GVU5DMl0pOworCSAgZWxzZQorCQlyZXR1cm4gMTsKKwl9CisJaWYgKHBvaW50ZXJwKGluZm9baV1bRF9NU0dTXSkgJiYgc2l6ZW9mKGluZm9baV1bRF9NU0dTXSk+PTMpIHsKKwkgIGlmIChwbC0+bW92ZShkZXN0LE1fR08saW5mb1tpXVtEX01TR1NdWzBdLAorCQkJCSAgIGluZm9baV1bRF9NU0dTXVsxXSxpbmZvW2ldW0RfTVNHU11bMl0pKQorCQlyZXR1cm4gZXhlY19mdW5jMihkZXN0LGluZm9baV1bRF9GVU5DMl0pOworCSAgZWxzZQorCQlyZXR1cm4gMTsKKwl9CisgICAgaWYgKHBsLT5tb3ZlKGRlc3QsTV9HTywibmFjaCAiK2NhcGl0YWxpemUoc3RyKSkpCisJICByZXR1cm4gZXhlY19mdW5jMihkZXN0LGluZm9baV1bRF9GVU5DMl0pOworICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQorCitpbnQgb2VmZm5lbiAoc3RyaW5nIHN0cikgeworICBvYmplY3QgZW52LHNjaGwsb2I7CisgIG1peGVkICppbmZvLHMyOworICBzdHJpbmcgc291cmNlLGRrZXksZGVzdCxzMTsKKyAgaW50IGk7CisKKyAgbm90aWZ5X2ZhaWwoIldBUyB3aWxsc3QgRHUgb2VmZm5lbj9cbiIpOworICBpZiAoIXN0ciB8fCAhdGhpc19wbGF5ZXIoKSkgcmV0dXJuIDA7CisgIG5vdGlmeV9mYWlsKCJEYXMga2FubnN0IER1IG5pY2h0IG9lZmZuZW4uXG4iKTsKKyAgc3RyPWxvd2VyX2Nhc2Uoc3RyKTsKKyAgaWYgKHNzY2FuZihzdHIsIiVzIG1pdCAlcyIsczEsczIpIT0yKQorICAgIHtzMT1zdHI7czI9MDt9CisgIGlmIChzMikgeworICAgIGlmICghKHNjaGw9cHJlc2VudChsb3dlcl9jYXNlKHMyKSx0aGlzX3BsYXllcigpKSkpIHsKKyAgICAgIG5vdGlmeV9mYWlsKCJTbyBlaW5lbiBTY2hsdWVzc2VsIGhhc3QgRHUgbmljaHQuXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICBzMj1zY2hsLT5RdWVyeURvb3JLZXkoKTsKKwkgIGlmIChzdHJpbmdwKHMyKSkgczI9KHtzMn0pOworICAgIH0KKyAgfQorCisgIGlmICghb2JqZWN0cChlbnY9cHJldmlvdXNfb2JqZWN0KCkpKSByZXR1cm4gMDsKKyAgaW5mbz1lbnYtPlF1ZXJ5UHJvcChQX0RPT1JfSU5GT1MpOworICBpZiAoIXBvaW50ZXJwKGluZm8pKSByZXR1cm4gMDsKKworICBzb3VyY2U9b2JqZWN0X25hbWUoZW52KTsKKyAgb2I9dGhpc19vYmplY3QoKTsKKyAgb2ItPlNldFByb3AoUF9BUlRJQ0xFLDEpOworICBmb3IgKGk9c2l6ZW9mKGluZm8pLTE7aT49MDtpLS0pIHsKKyAgICBpZiAoIW1hcHBpbmdwKGluZm9baV0pKSBjb250aW51ZTsKKyAgICBpZiAobWVtYmVyKGluZm9baV1bRF9JRFNdLHMxKTwwKSBjb250aW51ZTsgLy8gRmFsc2NoZSBUdWVyCisgICAgb2ItPlNldFByb3AoUF9OQU1FLGluZm9baV1bRF9OQU1FXSk7CisgICAgb2ItPlNldFByb3AoUF9HRU5ERVIsaW5mb1tpXVtEX0dFTkRFUl0pOworICAgIGRlc3Q9aW5mb1tpXVtEX0RFU1RdOworICAgIGRrZXk9KHNvdXJjZTxkZXN0KT8oc291cmNlKyI6IitkZXN0KTooZGVzdCsiOiIrc291cmNlKTsKKyAgICBub3RpZnlfZmFpbChjYXBpdGFsaXplKG9iLT5uYW1lKFdFUiwxKSkrIiBpc3QgZG9jaCBzY2hvbiBnZW9lZmZuZXQhXG4iKTsKKyAgICBpZiAoZG9vcl9zdGF0dXNbZGtleV0+MCkKKyAgICAgIGNvbnRpbnVlOyAvLyBFaW5lIGFuZGVyZSBUdWVyIGtvZW5udGUgZ2VtZWludCBzZWluLgorICAgIGlmICgoaW5mb1tpXVtEX0ZMQUdTXSAmIERPT1JfTkVFREtFWSkKKyAgICAgICAgJiYgZG9vcl9zdGF0dXNbZGtleV0gPT0gRF9TVEFUVVNfTE9DS0VEKSB7IC8vIGFiZ2VzY2hsb3NzZW4KKyAgICAgIG5vdGlmeV9mYWlsKCJEdSBicmF1Y2hzdCBlaW5lbiBTY2hsdWVzc2VsLCB1bSAiK29iLT5uYW1lKFdFTiwxKSsiIHp1IG9lZmZuZW4uXG4iKTsKKyAgICAgIGlmICghc2NobCkgY29udGludWU7IC8vIEVpbmUgYW5kZXJlIFR1ZXIga29lbm50ZSBnZW1laW50IHNlaW4uCisgICAgICBub3RpZnlfZmFpbChjYXBpdGFsaXplKHNjaGwtPm5hbWUoV0VSKSkrIiBwYXNzdCBuaWNodCFcbiIpOworICAgICAgaWYgKCFwb2ludGVycChzMikpIGNvbnRpbnVlOworCSAgaWYgKG1lbWJlcihzMixka2V5KTwwKSBjb250aW51ZTsgLy8gS29lbm50ZSBhbiBlaW5lciBhbmRlcmVuIHBhc3Nlbi4KKyAgICB9CisgICAgZG9vcl9zdGF0dXNbZGtleV09MTsKKyAgICBpbml0X2Rvb3JzKCk7CisgICAgd3JpdGUoIkR1IG9lZmZuZXN0ICIrb2ItPm5hbWUoV0VOKSsiLlxuIik7CisgICAgc2F5KGNhcGl0YWxpemUob2ItPm5hbWUoV0VSKSkrIiB3aXJkIHZvbiAiK3RoaXNfcGxheWVyKCktPm5hbWUoV0VNKSsKKyAgICAgICAgIiBnZW9lZmZuZXQuXG4iKTsKKyAgICBkb29yX21lc3NhZ2Vfb3RoZXIoc291cmNlLGRlc3QsIiB3aXJkIHZvbiBkZXIgYW5kZXJlbiBTZWl0ZSBnZW9lZmZuZXQuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2ludCBzY2hsaWVzc2VuIChzdHJpbmcgc3RyKSB7CisgIG9iamVjdCBlbnYsc2NobCxvYjsKKyAgbWl4ZWQgKmluZm8sczI7CisgIHN0cmluZyBzb3VyY2UsZGtleSxkZXN0LHMxOworICBpbnQgaSxhYmc7CisKKyAgbm90aWZ5X2ZhaWwoIldBUyB3aWxsc3QgRHUgc2NobGllc3Nlbj9cbiIpOworICBpZiAoIXN0ciB8fCAhdGhpc19wbGF5ZXIoKSkgcmV0dXJuIDA7CisgIG5vdGlmeV9mYWlsKCJEYXMga2FubnN0IER1IG5pY2h0IHNjaGxpZXNzZW4uXG4iKTsKKyAgc3RyPWxvd2VyX2Nhc2Uoc3RyKTsKKyAgaWYgKHNzY2FuZihzdHIsIiVzIG1pdCAlcyIsczEsczIpIT0yKQorICAgIHtzMT1zdHI7czI9MDt9CisgIGlmIChzMikgeworICAgIGlmICghKHNjaGw9cHJlc2VudChsb3dlcl9jYXNlKHMyKSx0aGlzX3BsYXllcigpKSkpIHsKKyAgICAgIG5vdGlmeV9mYWlsKCJTbyBlaW5lbiBTY2hsdWVzc2VsIGhhc3QgRHUgbmljaHQuXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICBzMj1zY2hsLT5RdWVyeURvb3JLZXkoKTsKKwkgIGlmIChzdHJpbmdwKHMyKSkgczI9KHtzMn0pOworICAgIH0KKyAgfQorCisgIGlmICghb2JqZWN0cChlbnY9cHJldmlvdXNfb2JqZWN0KCkpKSByZXR1cm4gMDsKKyAgaW5mbz1lbnYtPlF1ZXJ5UHJvcChQX0RPT1JfSU5GT1MpOworICBpZiAoIXBvaW50ZXJwKGluZm8pKSByZXR1cm4gMDsKKworICBzb3VyY2U9b2JqZWN0X25hbWUoZW52KTsKKyAgb2I9dGhpc19vYmplY3QoKTsKKyAgb2ItPlNldFByb3AoUF9BUlRJQ0xFLDEpOworICBhYmc9MDsKKyAgZm9yIChpPXNpemVvZihpbmZvKS0xO2k+PTA7aS0tKSB7CisgICAgaWYgKCFtYXBwaW5ncChpbmZvW2ldKSkgY29udGludWU7CisgICAgaWYgKG1lbWJlcihpbmZvW2ldW0RfSURTXSxzMSk8MCkgY29udGludWU7IC8vIEZhbHNjaGUgVHVlcgorICAgIG9iLT5TZXRQcm9wKFBfTkFNRSxpbmZvW2ldW0RfTkFNRV0pOworICAgIG9iLT5TZXRQcm9wKFBfR0VOREVSLGluZm9baV1bRF9HRU5ERVJdKTsKKyAgICBkZXN0PWluZm9baV1bRF9ERVNUXTsKKyAgICBka2V5PShzb3VyY2U8ZGVzdCk/KHNvdXJjZSsiOiIrZGVzdCk6KGRlc3QrIjoiK3NvdXJjZSk7CisJaWYgKHNjaGwpIHsKKwkgIG5vdGlmeV9mYWlsKGNhcGl0YWxpemUob2ItPm5hbWUoV0VSLDEpKSsiIGlzdCBkb2NoIHNjaG9uIGFiZ2VzY2hsb3NzZW4hXG4iKTsKKwkgIGlmIChkb29yX3N0YXR1c1tka2V5XTw9MAorICAgICAgICAmJiBkb29yX3N0YXR1c1tka2V5XSA9PSBEX1NUQVRVU19MT0NLRUQpCisgICAgICBjb250aW51ZTsgLy8gRWluZSBhbmRlcmUgVHVlciBrb2VubnRlIGdlbWVpbnQgc2Vpbi4KKwkgIGlmIChpbmZvW2ldW0RfRkxBR1NdICYgRE9PUl9DTE9TRUtFWSkgeyAvLyBTY2hsdWVzc2VsIG5vZXRpZz8KKwkJICBub3RpZnlfZmFpbChjYXBpdGFsaXplKHNjaGwtPm5hbWUoV0VSKSkrIiBwYXNzdCBuaWNodCFcbiIpOworCQkgIGlmICghcG9pbnRlcnAoczIpKSBjb250aW51ZTsKKwkJICBpZiAobWVtYmVyKHMyLGRrZXkpPDApIGNvbnRpbnVlOyAvLyBLb2VubnRlIGFuIGVpbmVyIGFuZGVyZW4gcGFzc2VuLgorCQkgIGRvb3Jfc3RhdHVzW2RrZXldPURfU1RBVFVTX0xPQ0tFRDsKKwkJICBhYmc9MTsgIC8vIFR1ZXIgd2lyZCByaWNodGlnIGFiZ2VzY2hsb3NzZW4KKwkgIH0KKyAgICBlbHNlIHsKKwkJICAvLyBvaG5lIFNjaGx1ZXNzZWwgYWJzY2hsaWVzc2JhcgorCQkgIGRvb3Jfc3RhdHVzW2RrZXldPQorICAgICAgICAoKGluZm9baV1bRF9GTEFHU10gJiBET09SX05FRURLRVkpID8gRF9TVEFUVVNfTE9DS0VEIDogRF9TVEFUVVNfQ0xPU0VEKTsKKwkgIH0KKwl9CisgIGVsc2UgeworCSAgbm90aWZ5X2ZhaWwoY2FwaXRhbGl6ZShvYi0+bmFtZShXRVIsMSkpKyIgaXN0IGRvY2ggc2Nob24gZ2VzY2hsb3NzZW4hXG4iKTsKKwkgIGlmIChkb29yX3N0YXR1c1tka2V5XSA8IERfU1RBVFVTX09QRU4pCisJCSAgY29udGludWU7IC8vIEVpbmUgYW5kZXJlIFR1ZXIga29lbm50ZSBnZW1laW50IHNlaW4uCisJICBpZiAoKGluZm9baV1bRF9GTEFHU10gJiBET09SX05FRURLRVkpICYmIAorICAgICAgICAhKGluZm9baV1bRF9GTEFHU10gJiBET09SX0NMT1NFS0VZKSkKKwkJICBkb29yX3N0YXR1c1tka2V5XT1EX1NUQVRVU19MT0NLRUQ7IC8vIEFic2NobGllc3NiYXIsIGFiZXIgZGF6dSBzY2hsdWVzc2VsIHVubm9ldGlnCisJICBlbHNlCisJCSAgZG9vcl9zdGF0dXNbZGtleV09RF9TVEFUVVNfQ0xPU0VEOworCX0KKwlpbml0X2Rvb3JzKCk7CisJd3JpdGUoIkR1IHNjaGxpZXNzdCAiK29iLT5uYW1lKFdFTikrCisJCSAgKGFiZz8iIGFiIjoiIikrIi5cbiIpOworCXNheShjYXBpdGFsaXplKG9iLT5uYW1lKFdFUikpKyIgd2lyZCB2b24gIit0aGlzX3BsYXllcigpLT5uYW1lKFdFTSkrCisJCShhYmc/IiBhYiI6IiAiKSsiZ2VzY2hsb3NzZW4uXG4iKTsKKwlkb29yX21lc3NhZ2Vfb3RoZXIoc291cmNlLGRlc3QsIiB3aXJkIHZvbiBkZXIgYW5kZXJlbiBTZWl0ZSAiKworCQkJCQkgICAoYWJnPyJhYiI6IiIpKyJnZXNjaGxvc3Nlbi4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KK3N0cmluZyBzcGVjaWFsX2RldGFpbF9kb29ycyhzdHJpbmcga2V5KXsKKyAgb2JqZWN0IGVudjsKKyAgbWl4ZWQgKmluZm87CisgIG1hcHBpbmcgZGw7CisgIGludCBpLCBzdDsKKyAgc3RyaW5nIHNvdXJjZSwgZGVzdCwgZGtleTsKKworICBpZighb2JqZWN0cChlbnY9cHJldmlvdXNfb2JqZWN0KCkpKXJldHVybiAwOworICBpZighcG9pbnRlcnAoaW5mbz1lbnYtPlF1ZXJ5UHJvcChQX0RPT1JfSU5GT1MpKSlyZXR1cm4gMDsKKyAgc291cmNlPW9iamVjdF9uYW1lKGVudik7CisKKyAgZm9yKGk9c2l6ZW9mKGluZm8pLTE7aT49MDtpLS0peworICAgIGlmKCFtYXBwaW5ncChpbmZvW2ldKSljb250aW51ZTsKKyAgICBpZihtZW1iZXIoaW5mb1tpXVtEX0lEU10sa2V5KTwwKWNvbnRpbnVlOworICAgIGlmKHN0cmluZ3AoaW5mb1tpXVtEX0xPTkddKSlyZXR1cm4gaW5mb1tpXVtEX0xPTkddOworICAgIGlmKCFtYXBwaW5ncChpbmZvW2ldW0RfTE9OR10pKWNvbnRpbnVlOworICAgIGRsPWluZm9baV1bRF9MT05HXTsKKyAgICBkZXN0PWluZm9baV1bRF9ERVNUXTsKKyAgICBka2V5PShzb3VyY2U8ZGVzdCk/KHNvdXJjZSsiOiIrZGVzdCk6KGRlc3QrIjoiK3NvdXJjZSk7CisgICAgc3Q9ZG9vcl9zdGF0dXNbZGtleV07CisgICAgaWYoKHN0PT1EX1NUQVRVU19MT0NLRUQpICYmICFkbFtEX1NUQVRVU19MT0NLRURdKQorICAgICAgICBzdD1EX1NUQVRVU19DTE9TRUQ7IC8qIEZhbGxzIGtlaW5lIGVpZ2VuZSBCZXNjaHJlaWJ1bmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBmdWVyIGFiZ2VzY2hsb3NzZW5lIFR1ZXIgdm9yaGFuZGVuICovCisgICAgcmV0dXJuIGRsW3N0XTsKKyAgfQorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29iai9lbnRzb3JnLmMgYi9vYmovZW50c29yZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZGRhMTMKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovZW50c29yZy5jCkBAIC0wLDAgKzEsOTIgQEAKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisKK2luaGVyaXQgIi9zdGQvbnBjIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKwordm9pZCBjcmVhdGUoKQoreworICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuOworICA6OmNyZWF0ZSgpOworCisgIFNldFByb3AoUF9TSE9SVCwiRWluIE11ZWxsc2NobHVja2VyIik7CisgIFNldFByb3AoUF9MT05HLGJyZWFrX3N0cmluZygKKyAgICAiRGVyIE11ZWxsc2NobHVja2VyIGdlaG9lcnQgenUgRmFtaWxpZSBkZXIgS2xlaW5zYXVyaWVyIHVuZCB6ZWljaG5ldCAiKworICAgICJzaWNoIGR1cmNoIGVpbiBzZWhyIGdyb3NzZXMgTWF1bCB1bmQgbmFoZXp1IHVuYmVncmVuenRlbiBBcHBldGl0IGF1cy4gIisKKyAgICAiRGFzIGVpbnppZ2UsIHdhcyBlciBuaWNodCBtYWcsIHNpbmQgRGluZ2UsIGRpZSBtYXRlcmllbGxlbiBXZXJ0IGhhYmVuLiAiKworICAgICJBbGxlcyBhbmRlcmUga2FubiBtYW4gaWhtIG1pdCAnZnVldHRlcmUgbXVlbGxzY2hsdWNrZXIgbWl0IDxuYW1lPicgIisKKyAgICAiaW4gZGVuIFJhY2hlbiBzdG9wZmVuLiIsNzgpKTsKKyAgU2V0UHJvcChQX0lORk8sYnJlYWtfc3RyaW5nKAorICAgICJEaWVzZXIgTXVlbGxzY2hsdWNrZXIgdmVyc2NobGluZ3QgYXVjaCBsb3NlIGhlcnVtbGllZ2VuZGUgRGluZ2UuIEFsc28gIisKKyAgICAicGFzcyBhdWYsIHdhcyBEdSB3ZWd3aXJmc3QuIiw3OCkpOworICBTZXRQcm9wKFBfTkFNRSwiTXVlbGxzY2hsdWNrZXIiKTsKKyAgU2V0UHJvcChQX0dFTkRFUiwgTUFMRSk7CisgIFNldFByb3AoUF9SQUNFLCJzYXVyaWVyIik7CisgIFNldFByb3AoUF9BUlRJQ0xFLDEpOworICBBZGRJZCgoeyJtdWVsbHNjaGx1Y2tlciIsInNjaGx1Y2tlciIsImtsZWluc2F1cmllciIsInNhdXJpZXIifSkpOworICBjcmVhdGVfZGVmYXVsdF9ucGMoIDEgKTsKKyAgU2V0UHJvcChQX1hQLDApOworICBTZXRQcm9wKFBfQk9EWSwxMDApOworICBTZXRQcm9wKFBfSEFORFMsKHsiIG1pdCBkZW0gYWxsZXMgdmVyc2NobGluZ2VuZGVuIEdlYmlzcyIsMjB9KSk7CisgIFNldFByb3AoUF9BTElHTiwgMCk7CisgIHNldGV1aWQoZ2V0dWlkKHRoaXNfb2JqZWN0KCkpKTsKKyAgU2V0UHJvcChQX0RFRkFVTFRfSU5GTywiZ3J1bnp0IG51ciB2b3Igc2ljaCBoaW4uXG4iKTsKKyAgU2V0UHJvcChQX01TR0lOLCJyb2xsdCBoZXJlaW4iKTsKKyAgU2V0UHJvcChQX01TR09VVCwicm9sbHQiKTsKKyAgU2V0UHJvcChQX01BWF9XRUlHSFQsIDIwMDAwMCk7CisgIEFkZENtZCgoeyJmdWV0dGVyIiwiZnVldHRlcmUifSksImhhcHMiKTsKKyAgZW5hYmxlX2NvbW1hbmRzKCk7Cit9CisKK2ludCBoYXBzKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyBzMSxzMjsKKyAgb2JqZWN0IG9iOworICBub3RpZnlfZmFpbCgiU3ludGF4OiBmdWV0dGVyZSBtdWVsbHNjaGx1Y2tlciBtaXQgPG5hbWU+XG4iKTsKKyAgaWYoIXN0cilyZXR1cm4gMDsKKyAgaWYoc3NjYW5mKHN0ciwiJXMgbWl0ICVzIixzMSxzMikhPTIpcmV0dXJuIDA7CisgIGlmKCFpZChzMSkpcmV0dXJuIDA7CisgIG5vdGlmeV9mYWlsKCJTbyBldHdhcyBoYXN0IER1IG5pY2h0LlxuIik7CisgIGlmKCghb2I9cHJlc2VudChzMix0aGlzX3BsYXllcigpKSkgJiYgCisgICAgICghb2I9cHJlc2VudChzMixlbnZpcm9ubWVudCgpKSkpIHJldHVybiAwOworICBpZihvYi0+UXVlcnlQcm9wKFBfTk9EUk9QKSB8fCBvYi0+UXVlcnlQcm9wKFBfTkVWRVJEUk9QKSl7CisgICAgd3JpdGUoIkRhcyBrYW5uc3QgRHUgbmljaHQgd2Vnd2VyZmVuLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYobGl2aW5nKG9iKSl7CisgICAgd3JpdGUoIkRlciBNdWVsbHNjaGx1Y2tlciBmcmlzc3Qga2VpbmUgTGViZXdlc2VuLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYob2ItPlF1ZXJ5UHJvcChQX1ZBTFVFKSl7CisgICAgd3JpdGUoIkRhcyBpc3QgenUgd2VydHZvbGwsIGRhcyB2ZXJ0cmFlZ3QgZGVyIE11ZWxsc2NobHVja2VyIG5pY2h0LlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKG9iLT5RdWVyeVByb3AoUF9DVVJTRUQpKSB7CisgICAgd3JpdGUoIlZlcmZsdWNodGUgRGluZ2UgYmVrb21tZW4gZGVtIE11ZWxsc2NobHVja2VyIG5pY2h0IVxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgb2ItPnJlbW92ZSgpOworICBpZihvYil7CisgICAgd3JpdGUoIkF1cyBpcmdlbmRlaW5lbSBHcnVuZCBzY2hlaW50IGRhcyBkZW0gTXVlbGxzY2hsdWNrZXIgbmljaHQgIisKKyAgICAienUgc2NobWVja2VuLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgd3JpdGUoIk1pdCBlaW5lbSBsYXV0ZW4gUnVlbHBzZW4gdmVyc2NobGluZ3QgZGVyIE11ZWxsc2NobHVja2VyIGFsbGVzLlxuIik7CisKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgcmVzZXQoKQoreworICBpbnQgaTsKKyAgb2JqZWN0ICppbnY7CisgIDo6cmVzZXQoKTsKKyAgCisgIGludj1hbGxfaW52ZW50b3J5KHRoaXNfb2JqZWN0KCkpOworICBpZihpbnYgJiYgc2l6ZW9mKGludikpCisgICAgZm9yKGk9c2l6ZW9mKGludiktMTtpPj0wO2ktLSkKKyAgICAgIGRlc3RydWN0KGludltpXSk7CisgIGNvbW1hbmQoIm5pbW0gYWxsZXMiKTsKK30KKwpkaWZmIC0tZ2l0IGEvb2JqL21pc2MvYm9uYm9uLmMgYi9vYmovbWlzYy9ib25ib24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2JmN2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL21pc2MvYm9uYm9uLmMKQEAgLTAsMCArMSwxMDIgQEAKKy8vIEFzcmFoZWwKKworaW5oZXJpdCAic3RkL3RoaW5nIiA7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bW92aW5nLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisKK3ZvaWQgZ2VzY2htYWNrKCkKK3sKKwlpbnQgbnVtOworCW51bSA9IHJhbmRvbSAoOCk7CisJc3dpdGNoKG51bSkKKwl7CisJCWNhc2UgMCA6CQorCQkJU2V0UHJvcChQX1NIT1JULCJFaW4gT3JhbmdlbmJvbmJvbiIpOworCQkJU2V0UHJvcChQX0xPTkcsIkVpbiBnZWZ1ZWxsdGVzIEJvbmJvbiBtaXQgT3Jhbmdlbmdlc2NobWFjay5cbiIpOworCQkJU2V0UHJvcChQX05BTUUsIk9yYW5nZW5ib25ib24iKTsKKwkJCUFkZElkKCh7Im9yYW5nZW5ib25ib24ifSkpOworCQkJYnJlYWs7CisJCWNhc2UgMSA6CisJCQlTZXRQcm9wKFBfU0hPUlQsIkVpbiBaaXRyb25lbmJvbmJvbiIpOworCQkJU2V0UHJvcChQX0xPTkcsIkVpbiBnZWZ1ZWxsdGVzIEJvbmJvbiBtaXQgWml0cm9uZW5nZXNjaG1hY2suXG4iKTsKKwkJCVNldFByb3AoUF9OQU1FLCJaaXRyb25lbmJvbmJvbiIpOworCQkJQWRkSWQoKHsieml0cm9uZW5ib25ib24ifSkpOworCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyIDoKKwkJCVNldFByb3AoUF9TSE9SVCwiRWluIFNjaG9rb2xhZGVuYm9uYm9uIik7CisJCQlTZXRQcm9wKFBfTE9ORywiRWluIFNjaG9rb2xhZGVuYm9uYm9uLCBwYXNzIGF1ZiwgZGFzcyBlcyBuaWNodCBzY2htaWx6dC5cbiIpOworCQkJU2V0UHJvcChQX05BTUUsIlNjaG9rb2xhZGVuYm9uYm9uIik7CisJCQlBZGRJZCgoeyJzY2hva29ib25ib24iLCJzY2hva29sYWRlbmJvbmJvbiJ9KSk7CisJCQlicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDMgOgorCQkJU2V0UHJvcChQX1NIT1JULCJFaW4gUGZlZmZlcm1pbnpib25ib24iKTsKKwkJCVNldFByb3AoUF9MT05HLCJQZmVmZmVybWluemUgYmVmcmVpdCBkZW4gSGFscyB1bmQga2l0emVsdCBpbiBkZXIgTmFzZS5cbiIpOworCQkJU2V0UHJvcChQX05BTUUsIlBmZWZmZXJtaW56Ym9uYm9uIik7CisJCQlBZGRJZCgoeyJwZmVmZmVybWluemJvbmJvbiIsIm1pbnplIiwicGZlZmZlcm1pbnoifSkpOworCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA0IDoKKwkJCVNldFByb3AoUF9TSE9SVCwiRWluIFNhaG5lYm9uYm9uIik7CisJCQlTZXRQcm9wKFBfTE9ORywiU2VociBzdWVzcyB1bmQgc2VociBrbGVicmlnLlxuIik7CisJCQlTZXRQcm9wKFBfTkFNRSwiU2FobmVib25ib24iKTsKKwkJCUFkZElkKCh7InNhaG5lYm9uYm9uIn0pKTsKKwkJCWJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNSA6CisJCQlTZXRQcm9wKFBfU0hPUlQsIkVpbiBLYXJhbWVsYm9uYm9uIik7CisJCQlTZXRQcm9wKFBfTE9ORywiRWluIEthcmFtZWxib25ib24sIGRlciBSZXN0IHZvbiBLYXJuZXZhbD9cbiIpOworCQkJU2V0UHJvcChQX05BTUUsIkthcmFtZWxib25ib24iKTsKKwkJCUFkZElkKCh7ImthcmFtZWxib25ib24ifSkpOworCQkJYnJlYWs7CisJCWNhc2UgNiA6CisJCQlTZXRQcm9wKFBfU0hPUlQsIkVpbiBBbmFuYW5hc2JvbmJvbiIpOworCQkJU2V0UHJvcChQX0xPTkcsIkVpbiBkcmVpZWNraWdlcyBBbmFuYW5hc2JvbmJvbiwgZGFzIHNjaG1lY2t0IGJlc3RpbW10IGdhbnogYW5hbmFzc2lnLlxuIik7CisJCQlTZXRQcm9wKFBfTkFNRSwiQW5hbmFzYm9uYm9uIik7CisJCQlBZGRJZCgoeyJhbmFuYXNib25ib24ifSkpOworCQkJYnJlYWs7CisJCWNhc2UgNyA6CisJCQlTZXRQcm9wKFBfU0hPUlQsIkVpbiBIaW1iZWVyZHJvcHMiKTsKKwkJCVNldFByb3AoUF9MT05HLCJEaWVzZXMgaGltYmVlcmlnZSBGcnVjaHRib25ib24gaXN0IHZpZWwgZ3JvZXNzZXIgYWxzIGVpbmUgSGltYmVlcmUuXG4iKTsKKwkJCVNldFByb3AoUF9OQU1FLCJIaW1iZWVyZHJvcHMiKTsKKwkJCUFkZElkKCh7ImRyb3BzIiwiaGltYmVlcmRyb3BzIiwiZnJ1Y2h0Ym9uYm9uIn0pKTsKKwkJCWJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorCQkJU2V0UHJvcChQX1NIT1JULCJFaW4gTXVsdGl2aXRhbWluYm9uYm9uIik7CisJCQlTZXRQcm9wKFBfTE9ORywiRWluIE11bHRpdml0YW1pbmJvbmJvbiwgc2VociBnZXN1bmQgKGJlc29uZGVycyBiZWkgZGVtIFdldHRlciBpbiBNdWVuc3RlcikuXG4iKTsKKwkJCVNldFByb3AoUF9OQU1FLCJNdWx0aXZpdGFtaW5ib25ib24iKTsKKwkJCUFkZElkKCh7InZpdGFtaW5ib25ib24iLCJtdWx0aXZpdGFtaW5ib25ib24ifSkpOworCQkJYnJlYWs7CisgICAgfQorfQorCit2b2lkIGNyZWF0ZSgpCit7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisJOjpjcmVhdGUoKTsKKwlTZXRQcm9wKFBfV0VJR0hULCAyNSk7CisJU2V0UHJvcChQX1ZBTFVFLCAwKTsKKwlTZXRQcm9wKFBfR0VOREVSLCBORVVURVIgKTsKKwlBZGRJZCgiYm9uYm9uIik7CisJZ2VzY2htYWNrKCk7Cit9CisKKwordm9pZCBpbml0KCkKK3sKKwk6OmluaXQoKTsKKwlhZGRfYWN0aW9uKCJlc3NlbiIsImVzc2UiKTsKKwlhZGRfYWN0aW9uKCJlc3NlbiIsImlzcyIpOworCWFkZF9hY3Rpb24oImVzc2VuIiwibHV0c2NoZSIpOworfQorCitpbnQgZXNzZW4oc3RyaW5nIHN0cikKK3sKKwlub3RpZnlfZmFpbCgiV2FzIG1vZWNodGVzdCBEdSBlc3Nlbj9cbiIpOworCWlmICggIXN0ciB8fCAhaWQoc3RyKSApCisJICAgIHJldHVybiAwOworCXdyaXRlKCJEdSBsdXRzY2hzdCBnZW51ZXNzbGljaCAiICsgbmFtZShXRU4sMCkgKyAiLlxuIik7CisJc2F5KCBQTC0+TmFtZShXRVIsMikgKyAiIGx1dHNjaHQgIiArIG5hbWUoV0VOLDApICsgIi5cbiIpOworCXJlbW92ZSgpOworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvb2JqL21pc2Mva2lzc2VuLmMgYi9vYmovbWlzYy9raXNzZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2MzNjViCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL21pc2Mva2lzc2VuLmMKQEAgLTAsMCArMSwxMjggQEAKK2luaGVyaXQgInN0ZC90aGluZyI7CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisKK3N0cmluZyBjc3RyOyAgCisKK2luaXQoKQoreworICBpbnQgY29sb3VyOworICA6OmluaXQoKTsKKyAgY29sb3VyID0gcmFuZG9tKDgpOworICBpZiAoY29sb3VyPT0wKSBjc3RyID0gImdydWVuZXMiOworICBpZiAoY29sb3VyPT0xKSBjc3RyID0gInJvdGVzIjsKKyAgaWYgKGNvbG91cj09MikgY3N0ciA9ICJibGF1ZXMiOworICBpZiAoY29sb3VyPT0zKSBjc3RyID0gImdlbGJlcyI7CisgIGlmIChjb2xvdXI9PTQpIGNzdHIgPSAic2Nod2Fyei13ZWlzcy1rYXJpZXJ0ZXMiOworICBpZiAoY29sb3VyPT01KSBjc3RyID0gIm9yYW5nZS1waW5rLWdlc3RyZWlmdGVzIjsKKyAgaWYgKGNvbG91cj09NikgY3N0ciA9ICJsaWxhLWdydWVuLWdldHVlcGZlbHRlcyI7CisgIGlmIChjb2xvdXI9PTcpIGNzdHIgPSAic2lsYmVyZ3JhdWVzIjsKKyAgYWRkX2FjdGlvbigidGhyb3dfaXQiLCJ3aXJmIik7IAorICBhZGRfYWN0aW9uKCJ3dyIsICJ3dyIpOworfQorCitzaG9ydCgpCit7CisgIHJldHVybiAiRWluICIgKyBjc3RyICsgIiBLaXNzZW5cbiI7Cit9CisKK2xvbmcoKQoreworICByZXR1cm4gIkRpZXMgaXN0IGVpbiB3dW5kZXJzY2hvZW5lcywgIiArIGNzdHIgKyAiIEtpc3Nlbi5cbiIrCisgICAgICAgICAgIkR1IGthbm5zdCB2ZXJzdWNoZW4gZXMgenUgd2VyZmVuLlxuIjsKK30KKworY3JlYXRlKCkKK3sKKyAgOjpjcmVhdGUoKTsKKyAgY3N0ciA9ICJ2b24gQm9pbmcgaGFuZGdlbmFlaHRlcyI7CisgIEFkZElkKCJraXNzZW4iKTsKKyAgU2V0UHJvcChQX1dFSUdIVCwgMSk7CisgIFNldFByb3AoUF9WQUxVRSwgMSk7CisgIFNldFByb3AoUF9OQU1FLCAiS2lzc2VuIik7CisgIFNldFByb3AoUF9HRU5ERVIsIDApOworfQorCit3dyhzdHIpCit7CisgIGlmIChzdHIpCisgICAgcmV0dXJuIHRocm93X2l0KCJraXNzZW4gbmFjaCAiK3N0cik7CisgIGVsc2UKKyAgeworICAgIG9iamVjdCAqYWxsLCAqbGl2OworICAgIGludCBpOworCisgICAgYWxsPWFsbF9pbnZlbnRvcnkoZW52aXJvbm1lbnQodGhpc19wbGF5ZXIoKSkpOworICAgIGZvciAoaT0wOyBpPHNpemVvZihhbGwpOyBpKyspCisgICAgICBpZiAocXVlcnlfb25jZV9pbnRlcmFjdGl2ZShhbGxbaV0pKQorICAgICAgICBpZiAoIWxpdikKKwkgIGxpdiA9ICh7YWxsW2ldfSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBsaXYgPSBsaXYrKHthbGxbaV19KTsKKyAgICBpID0gcmFuZG9tKHNpemVvZihsaXYpKTsKKyAgICByZXR1cm4gdGhyb3dfaXQoImtpc3NlbiBuYWNoICIrbG93ZXJfY2FzZShsaXZbaV0tPnF1ZXJ5X3JlYWxfbmFtZSgpKSk7CisgIH0KK30KKwordGhyb3dfaXQoc3RyKQoreworICBpbnQgdHJlZmZlcjsKKyAgc3RyaW5nIHdlcmZlcl9uYW1lOworICBzdHJpbmcgdmljdGltX3N0cmluZyx3ZXJmZXJfc3RyaW5nOworICBzdHJpbmcgd2FzLGF0LHdlbjsKKyAgaW50IGZlaGxlcjsKKyAgb2JqZWN0IHZpY3RpbTsKKworICBpZiAoIXN0cikgcmV0dXJuIDA7CisgIGZlaGxlciA9IDA7CisgIGlmIChzc2NhbmYoc3RyLCIlcyAlcyAlcyIsd2FzLGF0LHdlbikgIT0gMykKKyAgICBmZWhsZXIgPSAxOworICBpZiAoIWlkKHdhcykgfHwgYXQgIT0gIm5hY2giKQorICAgIGZlaGxlciA9IDE7CisgIGlmIChmZWhsZXIpCisgIHsgCisgICAgIG5vdGlmeV9mYWlsKCJadW0gV2VyZmVuOiB3aXJmIGtpc3NlbiBuYWNoIDxzcGllbGVybmFtZT5cbiIpOworICAgICByZXR1cm4gMDsKKyAgfQorICB2aWN0aW0gPSBwcmVzZW50KHdlbixlbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKSk7CisgIGlmICghdmljdGltKQorICB7IAorICAgICB3cml0ZSgiRGllc2VyIFNwaWVsZXIgaXN0IG5pY2h0IGhpZXIhXG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICByZXR1cm4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIHdlcmZlcl9uYW1lID0gdGhpc19wbGF5ZXIoKS0+bmFtZSgpOworICB0cmVmZmVyID0gcmFuZG9tKDUpOworICB3cml0ZSgiRHUgc2NobWVpc3N0IGVpbiBLaXNzZW4gbmFjaCAiICsgdmljdGltLT5uYW1lKFdFTSkgKyIuXG4iKTsKKyAgc2F5KHdlcmZlcl9uYW1lICsgIiB3aXJmdCBlaW4gS2lzc2VuIG5hY2ggIiArIHZpY3RpbS0+bmFtZShXRU0pICsgIi5cbiIpOworICBpZiAodHJlZmZlcj09MCkKKyAgeworICAgIHdlcmZlcl9zdHJpbmcgPSAiRHUgdmVyZmVobHN0ICIgKyB2aWN0aW0tPm5hbWUoV0VOKSArICIgbWVpbGVud2VpdC5cbiI7CisgICAgdmljdGltX3N0cmluZyA9IHdlcmZlcl9uYW1lICsgIiB2ZXJmZWhsdCBEaWNoIG1laWxlbndlaXQuXG4iOworICAgIHRoaXNfb2JqZWN0KCktPm1vdmUoZW52aXJvbm1lbnQodGhpc19wbGF5ZXIoKSkpOworICB9CisgIGlmICh0cmVmZmVyPT0xKQorICB7CisgICAgd2VyZmVyX3N0cmluZyA9ICJEYXMgS2lzc2VuIHN0cmVpZnQgIiArIHZpY3RpbS0+bmFtZShXRU4pKyAiIGFtIE9ocmxhZXBwY2hlbi5cbiI7CisgICAgdmljdGltX3N0cmluZyA9ICJEYXMgS2lzc2VuIHN0cmVpZnQgRGljaCBhbSBPaHJsYWVwcGNoZW4uXG4iOworICB9CisgIGlmICh0cmVmZmVyPT0yKQorICB7CisgICAgd2VyZmVyX3N0cmluZyA9ICJQQUZGISBEdSB0cmlmZnN0ICIgKyB2aWN0aW0tPm5hbWUoV0VOKSArICIgbWl0dGVuIGlucyBHZXNpY2h0LlxuIjsKKyAgICB2aWN0aW1fc3RyaW5nID0gIlBBRkYhIERhcyBLaXNzZW4gdHJpZmZ0IERpY2ggbWl0dGVuIGltIEdlc2ljaHQhXG4iOworICB9CisgIGlmICh0cmVmZmVyPT0zKQorICB7CisgICAgd2VyZmVyX3N0cmluZyA9ICJXVVNDSCEgRGFzIEtpc3NlbiB0cmlmZnQgIiArIHZpY3RpbS0+bmFtZShXRVNTRU4pICsgIiBCYXVjaCBtaXQgdm9sbGVyIFd1Y2h0LlxuIjsKKyAgICB2aWN0aW1fc3RyaW5nID0gIldVU0NIISBEYXMgS2lzc2VuIGZsaWVndCBtaXQgdm9sbGVyIFd1Y2h0IGdlZ2VuIERlaW5lbiBCYXVjaC5cbiI7CisgIH0KKyAgaWYgKHRyZWZmZXI9PTQpCisgIHsKKyAgICB3ZXJmZXJfc3RyaW5nID0gIHZpY3RpbS0+bmFtZSgpICsgIiB2ZXJzdWNodCB3ZWd6dXJlbm5lbiwgZG9jaCBkYXMgS2lzc2VuIHRyaWZmdCBkZW4gSGludGVya29wZi5cbiI7CisgICAgdmljdGltX3N0cmluZyA9ICJEdSB2ZXJzdWNoc3Qgd2VnenVyZW5uZW4sIGFiZXIgZGFzIEtpc3NlbiB0cmlmZnQgRGljaCBhbSBIaW50ZXJrb3BmLlxuIjsKKyAgfQorICB3cml0ZSh3ZXJmZXJfc3RyaW5nKTsKKyAgdGVsbF9vYmplY3QodmljdGltLHZpY3RpbV9zdHJpbmcpOworICBpZiAodHJlZmZlcikgdGhpc19vYmplY3QoKS0+bW92ZSh2aWN0aW0pOworICByZXR1cm4gMTsKK30KKwpkaWZmIC0tZ2l0IGEvb2JqL21pc2MvbG9sbGkuYyBiL29iai9taXNjL2xvbGxpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI4Mjc4ZQotLS0gL2Rldi9udWxsCisrKyBiL29iai9taXNjL2xvbGxpLmMKQEAgLTAsMCArMSwyOSBAQAoraW5oZXJpdCAic3RkL3RoaW5nIjsKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKwordm9pZCBjcmVhdGUoKQoreworICAgLy8gTGFlZGVuIGVyd2FydGVuIFNob3J0IHVuZCBWYWx1ZSBpbiBkZXIgQmx1ZXByaW50LgorICAgU2V0UHJvcChQX1NIT1JULCAiRWluIExvbGxpIik7CisgICBTZXRQcm9wKFBfVkFMVUUsIDUpOworICAgCisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgICA6OmNyZWF0ZSgpOworICAgU2V0UHJvcChQX1NIT1JULCAiRWluIExvbGxpIik7CisgICBTZXRQcm9wKFBfTkFNRSwgIkxvbGxpIik7CisgICBTZXRQcm9wKFBfR0VOREVSLCBNQUxFKTsKKyAgIFNldFByb3AoUF9MT05HLCAiRWluIGxlY2tlcmVyIExvbGxpLCBEdSBrYW5uc3QgaWhuIHNjaGxlY2tlbi5cbiIpOworICAgQWRkSWQoImxvbGxpIik7CisgICBTZXRQcm9wKFBfV0VJR0hULCAxMCk7CisgICBBZGRDbWQoICh7InNjaGxlY2siLCJzY2hsZWNrZSIsImxlY2siLCJsZWNrZSJ9KSwgInNjaGxlY2siICk7Cit9CisKK2ludCBzY2hsZWNrKHN0cmluZyBzdHIpCit7CisgICBub3RpZnlfZmFpbCgiV2FzIG1vZWNodGVzdCBEdSBzY2hsZWNrZW4/XG4iKTsKKyAgIGlmICghc3RyIHx8ICFpZChzdHIpKSByZXR1cm4gMDsKKyAgIHdyaXRlKCJEdSBzY2hsZWNrc3QgYW4gRGVpbmVtIExvbGxpLiBFciBzY2htZWNrdCBhdXNnZXplaWNobmV0LlxuIik7CisgICBzYXkodGhpc19wbGF5ZXIoKS0+bmFtZSgpKyIgc2NobGVja3QgYW4gIit0aGlzX3BsYXllcigpLT5RdWVyeVBvc3NQcm9ub3VuKHRoaXNfb2JqZWN0KCksIFdFTSkrIiBMb2xsaS5cbiIpOworICAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9vYmovbWlzYy90dWV0ZS5jIGIvb2JqL21pc2MvdHVldGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzE3M2JkCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL21pc2MvdHVldGUuYwpAQCAtMCwwICsxLDQ3IEBACisvL0FzcmFoZWwKKworaW5oZXJpdCAic3RkL3RoaW5nIiA7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bW92aW5nLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgOjpjcmVhdGUoKSA7CisKKyAgU2V0UHJvcCggUF9TSE9SVCwgIkVpbmUgVHVldGUgQm9uYm9ucyIgKSA7CisgIFNldFByb3AoIFBfTE9ORywgIkVpbmUgbWFnaXNjaGUgQm9uYm9udHVldGUuIFNvIG9mdCBEdSBhdWNoIGhpbmVpbmdyZWlmc3QsIHNpZSB3aXJkIG5pZW1hbHMgbGVlclxuIgorCQkrICAidW5kIGVudGhhZWx0IGltbWVyIGVpbmUgYnVudGUgTWlzY2h1bmcuXG4iKTsKKworICBTZXRQcm9wKCBQX1dFSUdIVCwgMCApIDsKKyAgU2V0UHJvcCggUF9OT0JVWSwgMSkgOworICBTZXRQcm9wKCBQX05PRFJPUCwgIk5laW4sIER1IHdpbGxzdCBkb2NoIG5pY2h0IGRpZXNlcyBHZXNjaGVuayB3ZWdnZWJlbiAhP1xuIik7CisgIFNldFByb3AoIFBfTkVWRVJEUk9QLCAxKSA7CisgIFNldFByb3AoIFBfTkFNRSwgIlR1ZXRlIikgOworICBTZXRQcm9wKCBQX0dFTkRFUiwgRkVNQUxFICkgOworICBBZGRJZCggKHsgImJvbmJvbnR1ZXRlIiwidHVldGUiLCAiYm9uYm9ucyIgfSkgKSA7CisgIFNldFByb3AoUF9BVVRPTE9BRE9CSiwgMSk7CisKK30KKwordm9pZCBpbml0KCkKK3sKKwk6OmluaXQoKTsKKwlhZGRfYWN0aW9uKCJuYXNjaGVuIiwiZ3JlaWZlIik7CisJYWRkX2FjdGlvbigibmFzY2hlbiIsImdyZWlmIik7Cit9CisKK2ludCBuYXNjaGVuIChzdHJpbmcgc3RyKQoreworICBub3RpZnlfZmFpbCgiV29oaW5laW4gbW9lY2h0ZXN0IER1IGdyZWlmZW4gP1xuIik7CisJaWYgKCBzdHIgIT0gInR1ZXRlIiAmJiBzdHIgIT0gImluIHR1ZXRlIiAmJiBzdHIgIT0gImJvbmJvbnMiICYmIHN0ciAhPSAiaW4gYm9uYm9udHVldGUiKQorCQkgcmV0dXJuIDA7CisJd3JpdGUoIkR1IGdyZWlmc3QgaW4gRGVpbmUgVHVldGUgdW5kIGhvbHN0IGVpbiBCb25ib24gaGVyYXVzLlxuIik7CisJc2F5KCBQTC0+bmFtZShXRVIsMikgKyAiIGhvbHQgZWluIEJvbmJvbiBhdXMgZWluZXIgVHVldGUuXG4iKTsKKwljbG9uZV9vYmplY3QoIm9iai9taXNjL2JvbmJvbiIpLT5tb3ZlKFBMKTsKKwlyZXR1cm4gMTsKK30KKwpkaWZmIC0tZ2l0IGEvb2JqL21pc2Mvd3VlcmZlbC5jIGIvb2JqL21pc2Mvd3VlcmZlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1Y2NiNjkKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovbWlzYy93dWVyZmVsLmMKQEAgLTAsMCArMSwzMCBAQAoraW5oZXJpdCAic3RkL3RoaW5nIjsKKworI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCit2b2lkIGNyZWF0ZSgpCit7CisgIC8vIFNob3J0IHVuZCBWYWx1ZSB3ZXJkZW4gdm9uIExhZWRlbiBpbiBkZXIgQmx1ZXByaW50IGVyd2FydGV0CisgIFNldFByb3AoUF9TSE9SVCwgIkVpbiBXdWVyZmVsIik7CisgIFNldFByb3AoUF9WQUxVRSwgMSk7CisgIAorICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuOworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfTE9ORywgIkVpbiBXdWVyZmVsIG1pdCA2IFNlaXRlbi5cbiIpOworICBTZXRQcm9wKFBfTkFNRSwgIld1ZXJmZWwiKTsKKyAgU2V0UHJvcChQX0dFTkRFUiwgTUFMRSk7CisgIFNldFByb3AoUF9XRUlHSFQsIDEpOworICBBZGRJZCgid3VlcmZlbCIpOworCUFkZENtZCgid3VlcmZlbCIsInd1ZXJmZWwiKTsKK30KKworaW50IHd1ZXJmZWwoc3RyaW5nIHN0cikKK3sKKyAgaW50IHphaGw7CisKKyAgemFobCA9IHJhbmRvbSg2KSArIDE7CisgIHdyaXRlKCJEdSB3dWVyZmVsc3QgZWluZSAiICsgemFobCArICIuXG4iKTsKKyAgc2F5KHRoaXNfcGxheWVyKCktPm5hbWUoKSArICIgd3VlcmZlbHQgZWluZSAiICsgemFobCArICIuXG4iKTsKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9vYmovbWxpc3RlLmMgYi9vYmovbWxpc3RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY5NTVkNQotLS0gL2Rldi9udWxsCisrKyBiL29iai9tbGlzdGUuYwpAQCAtMCwwICsxLDEwNiBAQAoraW5oZXJpdCAiL3N0ZC90aGluZy9wcm9wZXJ0aWVzIjsKKworI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8c3lzX2RlYnVnLmg+CisKKyNkZWZpbmUgRU1fREFUQSAgICIvZXRjL0Vyem1hZ2llciIKKyNkZWZpbmUgTUFHSUVSICAgICIvZXRjL01hZ2llcmxpc3RlIgorI2RlZmluZSBNQVNURVIgICAgIi9zZWN1cmUvbWFzdGVyIgorI2RlZmluZSBXSVpfSE9NRSAgIi9wbGF5ZXJzIgorCisjZGVmaW5lIFJFTSAgIDAgICAvLyBSZWdpb25zRXJ6TWFnaWVyCisjZGVmaW5lIE1BRyAgIDEgICAvLyBOb3JtYWxlIE1hZ2llcgorCitwcml2YXRlIG1hcHBpbmcgZG9tYWlucywgYnVpbGRfZG9tYWluczsKK3ByaXZhdGUgaW50IEZpbmlzaGVkLCB0b2RheTsKK3ZvaWQgTWFnaWVyTGlzdGUoKTsKKworcHJpdmF0ZSBtYXBwaW5nIF9xdWVyeV9NYWdpZXJsaXN0ZSgpIHsgcmV0dXJuIGRvbWFpbnM7IH0KKwordm9pZCBjcmVhdGUoKQoreworICA6OmNyZWF0ZSgpOworICBzZXRldWlkKGdldHVpZCgpKTsKKyAgU2V0KCJNYWdpZXJsaXN0ZSIsICMnX3F1ZXJ5X01hZ2llcmxpc3RlLyonKi8sIEZfUVVFUllfTUVUSE9EKTsKKyAgY2FsbF9vdXQoInJlc2V0IiwgMCk7Cit9CisKK3ZvaWQgcmVzZXQoKQoreworICBpZiAodG9kYXkgPj0gdGltZSgpLzg2NDAwKQorICAgIHJldHVybjsKKworICB0b2RheT10aW1lKCkvODY0MDA7CisgIE1hZ2llckxpc3RlKCk7Cit9CisKK3ZvaWQgUHJvY2Vzc0xpc3QobWl4ZWQgbmFtZXMpCit7CisgIG1peGVkIERuYW1lOworICBpbnQgaTsKKyAgaSA9IDU7CisKKyAgd2hpbGUoaS0tICYmIHNpemVvZihuYW1lcykpCisgIHsKKyAgICBpZighcG9pbnRlcnAoRG5hbWUgPSBNQVNURVItPmdldF9kb21haW5faG9tZXMobmFtZXNbMF0pKSkKKyAgICAgIERuYW1lID0gKHtEbmFtZX0pOworICAgIGlmKCFzaXplb2YoRG5hbWUpKSBEbmFtZSA9ICh7IktlaW5lIFJlZ2lvbiJ9KTsKKyAgICB3aGlsZShzaXplb2YoRG5hbWUpKQorICAgIHsKKyAgICAgIGlmKCFidWlsZF9kb21haW5zW0RuYW1lWzBdXSkKKyAgICAgIHsKKyAgICAgICAgYnVpbGRfZG9tYWluc1tEbmFtZVswXSwgUkVNXSA9ICh7fSk7CisgICAgICAgIGJ1aWxkX2RvbWFpbnNbRG5hbWVbMF0sIE1BR10gPSAoe30pOworICAgICAgfQorICAgICAgaWYoRG5hbWVbMF0hPSJLZWluZSBSZWdpb24iICYmIE1BU1RFUi0+ZG9tYWluX21hc3RlcihuYW1lc1swXSwgRG5hbWVbMF0pKQorICAgICAgICBidWlsZF9kb21haW5zW0RuYW1lWzBdLCBSRU1dICs9ICh7bmFtZXNbMF19KTsKKyAgICAgIGVsc2UKKyAgICAgICAgYnVpbGRfZG9tYWluc1tEbmFtZVswXSwgTUFHXSArPSAoe25hbWVzWzBdfSk7CisgICAgICBEbmFtZSA9IERuYW1lWzEuLl07CisgICAgfQorICAgIG5hbWVzID0gbmFtZXNbMS4uXTsKKyAgfQorICBpZihzaXplb2YobmFtZXMpKSBjYWxsX291dCgiUHJvY2Vzc0xpc3QiLCAwLCBuYW1lcyk7CisgIGVsc2UgeyBGaW5pc2hlZCA9IDE7IE1hZ2llckxpc3RlKCk7IH0KK30KKwordm9pZCBNYWdpZXJMaXN0ZSgpCit7CisgIHN0cmluZyBvdXRwdXQ7CisgIG1peGVkIGQ7CisKKyAgaWYoIUZpbmlzaGVkKQorICB7CisgICAgaWYoZmluZF9jYWxsX291dCgiUHJvY2Vzc0xpc3QiKSA9PSAtMSkKKyAgICB7CisgICAgICBGaW5pc2hlZCA9IDA7CisgICAgICBidWlsZF9kb21haW5zID0gbV9hbGxvY2F0ZSgwLDIpOworICAgICAgY2FsbF9vdXQoIlByb2Nlc3NMaXN0IiwgMCwgZ2V0X2RpcihXSVpfSE9NRSsiLyoiKSAtICh7Ii4iLCAiLi4iLCAiLnJlYWRtZSJ9KSk7CisgICAgfQorICAgIGNhbGxfb3V0KCJNYWdpZXJMaXN0ZSIsIDIwLCAxKTsKKyAgICByZXR1cm47CisgIH0KKyAgd2hpbGUocmVtb3ZlX2NhbGxfb3V0KCJNYWdpZXJsaXN0ZSIpICE9ICAtMSk7CisKKyAgaWYgKCFidWlsZF9kb21haW5zKQorICAgIHJldHVybjsKKworICBvdXRwdXQgPSAiTWFnaWVybGlzdGUgdm9uIE1vcmdlbkdyYXVlbiB2b20gIitkdGltZSh0aW1lKCkpKyJcbiI7CisKKyAgZG9tYWlucyA9IGRlZXBfY29weShidWlsZF9kb21haW5zKTsKKyAgYnVpbGRfZG9tYWlucz0wOworICBmb3IoZCA9IG1faW5kaWNlcyhkb21haW5zKTsgc2l6ZW9mKGQpOyBkID0gZFsxLi5dKQorICB7CisgICAgb3V0cHV0ICs9ICJSRUdJT046ICIrY2FwaXRhbGl6ZShkWzBdKQorICAgICAgICAgICAgICsiIFJFTTogIgorICAgICAgICAgICAgICtpbXBsb2RlKG1hcChkb21haW5zW2RbMF0sIFJFTV0sICMnY2FwaXRhbGl6ZSksICIsICIpCisgICAgICAgICAgICAgKyIgKCIrc2l6ZW9mKGRvbWFpbnNbZFswXSwgUkVNXStkb21haW5zW2RbMF0sIE1BR10pCisgICAgICAgICAgICAgKyIgTWFnaWVyKVxuIgorICAgICAgICAgICAgICsgYnJlYWtfc3RyaW5nKGltcGxvZGUobWFwKGRvbWFpbnNbZFswXSwgTUFHXSwjJ2NhcGl0YWxpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgIiksIDYyLCA4KQorICAgICAgICAgICAgICsiXG4iOworICB9CisgIHJtKE1BR0lFUik7CisgIHdyaXRlX2ZpbGUoTUFHSUVSLCBvdXRwdXQpOworfQpkaWZmIC0tZ2l0IGEvb2JqL21wYS5jIGIvb2JqL21wYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZDE5NzIKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovbXBhLmMKQEAgLTAsMCArMSwxNTczIEBACisvKiBEYXMgU2VydmljZXBha2V0IGRlciBNb3JnZW5ncmF1ZW4tUHJlc3NlYWdlbnR1ci4gRWluZSBlcndlaXRlcnRlIFplaXR1bmcuCisgICBUZWlsd2Vpc2UgenVyIGFsdGVuIFplaXR1bmcgaWRlbnRpc2NoLgorCisgICB1bnRlciBWZXJ3ZW5kdW5nIGRlciBaZWl0dW5nIHZvbiBKb2YsIHZvZWxsaWcgdW1nZXNjaHJpZWJlbi4KKworICAgKEMpIE5vdiAxOTkzIC0gMTk5NiAgTG9jb0BNb3JnZW5ncmF1ZW4KKworICAgVmVyd2VuZHVuZyBhdXNzZXJoYWxiIHZvbiBNb3JnZW5ncmF1ZW4gaXN0IGdlc3RhdHRldCB1bnRlciBmb2xnZW5kZW4KKyAgIEJlZGluZ3VuZ2VuOgorICAgLSBCZW51dHp1bmcgZXJmb2xndCBhdWYgZWlnZW5lIEdlZmFoci4gSmVnbGljaGUgVmVyYW50d29ydHVuZyB3aXJkCisgICAgIGFiZ2VsZWhudC4gQnVncyBhdXNzZXJoYWxiIHZvbiBNRyBzaW5kIG5pY2h0IG1laW4gUHJvYmxlbS4KKyAgIC0gQXVjaCBpbiB2ZXJhZW5kZXJ0ZW4gb2RlciBhYmdlbGVpdGV0ZW4gT2JqZWt0ZW4gbXVzcyBlaW4gSGlud2VpcyBhdWYKKyAgICAgZGllIEhlcmt1bmZ0IGVyaGFsdGVuIGJsZWliZW4uCisgICAtIEJpdHRlIGZyYWd0IG1pY2ggdm9yaGVyIQorICAgRWluIFVwZGF0ZS1TZXJ2aWNlIGJlc3RlaHQgbmljaHQuIFJ1ZWNrbmFobWUgZGllc2VyIExpemVueiBpc3QgamVkZXJ6ZWl0CisgICBtb2VnbGljaC4gVW5kIHdlciBuaWNodCBpbiBkZXIgTGFnZSBpc3QsIG5ldWUgVmVyc2lvbmVuIHNlbGJlciBhbnp1cGFzc2VuLAorICAgaGF0IGluIGRlciBBZG1pbmlzdHJhdGlvbiBlaW5lcyBNdWRzIG5pY2h0cyB6dSBzdWNoZW4uCisKKworICAgMDQuMTEuOTMgICBFcnN0ZSBicmF1Y2hiYXJlIFZlcnNpb24KKyAgICguLi4gc2VpdGRlbSB2aWVsZSBBZW5kZXJ1bmdlbiAuLi4pCisgICAxMy4wOS45NSBjYSAwMjowMCAgZXJ3YXJ0ZSBtcGEKKyAgIDEzLjA5Ljk1IGNhIDIzOjAwICBSZWJ1aWxkR3JvdXBMaXN0KCkKKyAgIDE1LjA5Ljk1ICAgICAgICAgICAgIHZvcmxhZXVmaWcgYXVzZ2ViYXV0CisgICAxNi4wOS4gICAgICAgICAgICAgICBhbmRlcnMgd2llZGVyIGVpbmdlYmF1dCwgdW5kIEtsZWluaWdrZWl0ZW4KKyAgIDA1LjEyLjk1IGNhIDE5OjIwICBTcGllbGVyIGtvZW5uZW4gbnVyIG5vY2ggZWlnZW5lIEFydGlrZWwgbG9lc2NoZW4vdmVybC4KKyAgIDA3LjEyLjk1IGNhIDIzOjAwICBLZWluZSBBbnplaWdlIGRlciBTdGF0dXN6ZWlsZS4gU3RhdHVzemVpbGVuIGJlZ2lubmVuCisgICAgICAgICAgICAgICAgICAgICAgbWl0IH4jISwgc2luZCBkYW1pdCBuaWNodCBtaXQgZGVtIEVkaXRvciBlcnpldWdiYXIuCisgICAyMC4xMi45NSBjYSAxNzowMCAgdWViZXJnZWhlIHRocmVhZC9hbnR3b3J0ZW4KKyAgIDMxLjAxLjk2ICAgICAgICAgICB3aWVkZXJob2xlL3VuY2F0Y2h1cAorICAgMjIuMDQuOTYgICAgICAgICAgIEF1ZnJhZXVtZW4gaWdub3JpZXJ0ZXIgdGhyZWFkcy4gQUxQSEEhCisgICAyNC4wNC45NiAgICAgICAgICAgKyAtIC4gYWxzIEFkcmVzc2llcnVuZ2VuLCB6ZWl0dW5nc21lbGR1bmcKKyAgIDAyLjEwLjk2ICAgICAgICAgICBLbGVpbmlna2VpdGVuCisgICAwOC4xMC45NiAgICAgICAgICAgS2xlaW5pZ2tlaXRlbgorICAgMDUuMTIuOTYgICAgICAgICAgIGFudHdvcnRlIGF1ZiBhcnRpa2VsIDxucj4sIHJlcGx5IDxuZXVlciB0aXRlbD4sCisgICAgICAgICAgICAgICAgICAgICAgdmVyc2VuZGUgYXJ0aWtlbCwgQWJrdWVyenVuZ2VuIGZ1ZXIgUnVicmlrZW5uYW1lbiwKKyAgICAgICAgICAgICAgICAgICAgICBMYXlvdXRhZW5kZXJ1bmdlbiwKKyAgICAgICAgICAgICAgICAgICAgICBIZXJrdW5mdCBiZWkgdmVybGVndGVuIEFydGlrZWxuIGluIFN0YXR1c3plaWxlCisKKyAgIExldHp0ZSBBZW5kZXJ1bmc6IAorICAgMDQuMTEuMDYgWmVzc3RyYSAgQW5wYXNzdW5nIGFuIGRhcyBuZXVlIFZlcmhhbHRlbiB2b24gaW5oZXJpdF9saXN0KCkgaW4gTEQKKworKi8KKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPG5ld3MuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxhbnNpLmg+CisjaW5jbHVkZSA8aW5wdXRfdG8uaD4KKyNpbmNsdWRlICIvbWFpbC9wb3N0LmgiCisKK2luaGVyaXQgIi9zdGQvdGhpbmciOworaW5oZXJpdCBORURJVDsKKy8qCisjZGVmaW5lIERFQlVHKHgpICAgICAgICBpZiAoZnVuY2FsbChzeW1ib2xfZnVuY3Rpb24oJ2ZpbmRfcGxheWVyKSwiemVzc3RyYSIpKVwKKyAgICAgICAgICB0ZWxsX29iamVjdChmdW5jYWxsKHN5bWJvbF9mdW5jdGlvbignZmluZF9wbGF5ZXIpLCJ6ZXNzdHJhIiksXAorICAgICAgICAgICAgICAgICAgICAgICJNUEE6ICIreCsiXG4iKQorI2RlZmluZSBERUJVR1ZBUih4KSBERUJVRyhzcHJpbnRmKHgrIjpcbiVPXG4iLHgpKQorKi8KKyNkZWZpbmUgREVCVUdWQVIoeCkKKworLy8gS29uZmlndXJhdGlvbiwgZ2dmIG11ZGFiaGFlbmdpZworI2RlZmluZSBERUZBVUxUR1JPVVAgImFsbGdlbWVpbmVzIgorI2RlZmluZSBNSU5JSEVMUFBBR0UgInAvc2VydmljZS9sb2NvL2RvYy9taW5pLW1wYS50eHQiCisjZGVmaW5lIEhFTFBQQUdFICAgICAiL3Avc2VydmljZS9sb2NvL2RvYy9tcGEiCisjZGVmaW5lIFdJWkhFTFBQQUdFICAiL3Avc2VydmljZS9sb2NvL2RvYy9tcGEud2l6IgorI2RlZmluZSBTQVZFTVNHUEFUSChwbCkgKCIvb3Blbi9OZXdzLyIrKGdldGV1aWQocGwpKSsiLm5ld3MiKQorI2RlZmluZSBJU19QT1NUKHIpICAobWVtYmVyKGluaGVyaXRfbGlzdChyKSxTVERQT1NUKyIuYyIpPj0wKQorI2RlZmluZSBJTklUSUFMX1NVQlNDUklQVElPTlMgXAorICAoeyAgImJla2FubnRtYWNodW5nZW4iLCBcCisgICAgICAiZC5lYmVuZSIsIFwKKyAgICAgICJkLnd1ZXN0ZSIsIFwKKyAgICAgICJkLmluc2VsbiIsIFwKKyAgICAgICJkLnVudGVyd2VsdCIsIFwKKyAgICAgICJkLmRzY2h1bmdlbCIsIFwKKyAgICAgICJkLmdlYmlyZ2UiLCBcCisgICAgICAiZC5wb2xhciIsIFwKKyAgICAgICJkLndhbGQiLCBcCisgICAgICAiZC5mZXJud2VzdCIsIFwKKyAgICAgICJkLnZsYW5kIiwgXAorICAgICAgImQuYW5mYWVuZ2VyIiwgXAorICAgICAgImVudHdpY2tsdW5nIiwgXAorICAgfSkKKworLy8gTWFrcm9zIGV0Yy4KKworI2RlZmluZSBUUCAgICAgICAgICB0aGlzX3BsYXllcigpCisjZGVmaW5lIFRJICAgICAgICAgIHRoaXNfaW50ZXJhY3RpdmUoKQorI2RlZmluZSBTVEFUVVNFU0NBUEUgIn4jISIgCisjZGVmaW5lIElTX1NUQVRVU0xJTkUocykgKChzWzAuLjFdPT0iIyEiKXx8KHNbMC4uMl09PSJ+IyEiKSkKKy8vI2RlZmluZSBJU19TVEFUVVNMSU5FKHMpIChzWzAuLjJdPT0ifiMhIikKKy8vIGluIFJ1YnJpayBtdWVsbCBmYW5kZW4gc2ljaCB0YXRzYWVjaGxpY2ggbm9jaCBzb2xjaGUgdXJhbHRlbiBub3Rlcy4uLgorI2RlZmluZSBJR05PUkVHUk9VUCAiKmlnbm9yZWQqIgorI2RlZmluZSBOTkFEV01TRyAgICAiKk5OQURXTVNHKiIKKyNkZWZpbmUgU1lTVEVNR1JPVVBTICh7SUdOT1JFR1JPVVAsTk5BRFdNU0d9KQorCisvLyBBdWZiYXUgZGVyIGlnbm9yZWdyb3VwOgorLy8gICAoW2dyb3VwMTooW3RpZDE6bGFzdHRpbWUxLHRpZDI6bGFzdHRpbWUyLC4uLl0pLGdyb3VwMjouLi5dKQorCisvLyBGbGFncyBmdWVyIE1lc3NhZ2Uyc3RyaW5nKCkKKyNkZWZpbmUgTTJTX1ZUMTAwICAgIDEKKyNkZWZpbmUgTTJTX0FOU0kgICAgIE0yU19WVDEwMAorI2RlZmluZSBNMlNfUkVNT1RFICAgMgorCisvLyBGb3JtYXQgdm9uIGxhc3R0aXRsZQorI2RlZmluZSBMQVNUX1RJVExFICAgMAorI2RlZmluZSBMQVNUX1dSSVRFUiAgMQorI2RlZmluZSBMQVNUX1RJTUUgICAgMgorI2RlZmluZSBMQVNUX1RJRCAgICAgMworI2RlZmluZSBMQVNUX0dST1VQICAgNAorI2RlZmluZSBMQVNUX05SICAgICAgNQorI2RlZmluZSBMQVNUX1NJWkVPRiAgNgorCisKK21hcHBpbmcgcmVhZF91bnRpbDsKK21peGVkICAgbGFzdHRpdGxlOyAvLyBBdWZiYXUgcy5vLgorbWl4ZWQgICBtZXNzYWdlOworaW50ICAgICBkZWFkVElEOworc3RyaW5nICBHUk9VUDsKKworaW50IEdldFRJRChtaXhlZCBtZXNzYWdlKTsKK3ByaXZhdGUgdm9pZCBJbml0aWFsU3Vic2NyaXB0aW9ucygpOworCitjcmVhdGUoKQoreworICA6OmNyZWF0ZSgpOworICBzZXRldWlkKGdldHVpZCgpKTsKKyAgR1JPVVA9ImJla2FubnRtYWNodW5nZW4iOworICBTZXRQcm9wKFBfU0hPUlQsIkRpZSBaZWl0dW5nIik7CisgIFNldFByb3AoUF9OQU1FLCJaZWl0dW5nIik7CisgIFNldFByb3AoUF9XRUlHSFQsIDUwKTsKKyAgU2V0UHJvcChQX1NJWkUsIDM1KTsKKyAgU2V0UHJvcChQX01BVEVSSUFMLCAoW01BVF9QQVBFUjogMTAwXSkgKTsKKyAgU2V0UHJvcChQX0dFTkRFUiwgRkVNQUxFKTsKKyAgQWRkSWQoKHsibm4iLCJ6ZWl0dW5nIiwic2VydmljZXBha2V0IiwibXBhIn0pKTsKKyAgU2V0UHJvcChQX05PRFJPUCwKKyAgICAiRGFzIHBlcnNvZW5saWNoZSBTZXJ2aWNlcGFrZXQgZGVyIE1QQSBrYW5uIG1hbiBuaWNodCB3ZWd3ZXJmZW4uXG4iKTsKKyAgU2V0UHJvcChQX05FVkVSRFJPUCwgMSk7CisKKyAgaWYgKCFyZWFkX3VudGlsKSByZWFkX3VudGlsPShbIm11ZWxsIjotMV0pOworfQorCitzdGF0aWMgbWl4ZWQgX3F1ZXJ5X3JlYWRfbXNnKCkgeyByZXR1cm4gbG9uZygpOyB9CisKK2xvbmcoKSB7CisgIHJldHVybiAiXAorRGllcyBpc3QgZGFzIFNlcnZpY2VwYWtldCBkZXIgTVBBIChNb3JnZW5ncmF1ZW5zIFByZXNzZSBBZ2VudHVyKSAtXG5cCitkaWUgWmVpdHVuZyBkZXMgTW9yZ2VuZ3JhdWVucy5cblwKK0R1IGthbm5zdCBkYW1pdCBha3R1ZWxsZSBBcnRpa2VsIGxlc2VuIHVuZCBzY2hyZWliZW4sIG1pdCBmb2xnZW5kZW4gQmVmZWhsZW46XG5cCisgJ25uIFtydWJyaWtdJyAoTmV1ZXN0ZSBOYWNocmljaHRlbikgd3VlaGx0IGRpZSBSdWJyaWsgZHVyY2ggdW5kIHNjaGF1dCxcblwKKyAgICAgICAgICAgICAgICBvYiB3YXMgbmV1IGlzdC4gRGVyIGVyc3RlIHVuZ2VsZXNlbmUgQXJ0aWtlbCB3aXJkIGFuZ2V6ZWlndC5cblwKKyAgICAgICAgICAgICAgICBPaG5lIEFyZ3VtZW50IHdlcmRlbiBhbGxlIFJ1YnJpa2VuIGR1cmNod3VlaGx0LlxuXAorICdoaWxmZSBtcGEnICAgIEF1c2Z1ZWhybGljaGUgSGlsZnNzZWl0ZS4gTGVzZW4gZHJpbmdlbmQgZW1wZm9obGVuIVxuXAorV2VpdGVyZSBCZWZlaGxlOlxuXAorIHJ1YnJpa2VuIFtuZXVdICAgICAgICAgICAgICAgICAgICAgICBiZXN0ZWxsZSA8cnVicmlrPiBhYlxuXAorIFtsaWVzIF1ydWJyaWsgPHJ1YnJpaz4gICAgICAgICAgICAgICBhYm9ubmllcmUgPHJ1YnJpaz5cblwKKyBpbmhhbHQgWzxydWJyaWs+fG5ldXxzdWNoZSA8dGV4dD5dICAgd2llZGVyaG9sZSAuLi5cblwKKyBubiA8cnVicmlrZW4+fDxsaXN0ZT4gICAgICAgICAgICAgICAgdWViZXJnZWhlIC4uLlxuXAorIFtsaWVzIF1hcnRpa2VsIDxudW1tZXI+IisKKyAgKCAoSVNfTEVBUk5FUihUUCkpID8gIiAgICAgICAgICAgICAgc3BlaWNoZXJlIGFydGlrZWwgPG5yPiIgOiAiIiApKyJcblwKKyBzY2hyZWliIDx0aXRlbD4gICAgICAgICAgICAgICAgICAgICAgdmVyc2VuZGUgYXJ0aWtlbCBbbnJdIGFuIDxhZHJlc3NlPlxuXAorIGFudHdvcnRlIFthdWYgYXJ0aWtlbCA8bnI+XSBbdGl0ZWxdICB2ZXJsZWdlIGFydGlrZWwgPG5yPiBuYWNoIDxydWJyaWs+XG5cCisgbG9lc2NoZSBhcnRpa2VsIDxucj4gICAgICAgICAgICAgICAgIHplaXR1bmdzbWVsZHVuZyBbbmV1ZSBNZWxkdW5nXVxuXAorIHZlcmJyZW5uZSB6ZWl0dW5nICAgICAgICAgICAgICAgICAgICB3ZW5uIERpciBhbGxlcyB6dXZpZWwgd2lyZC4uLi5cblwKKyIrIChJU19TRUVSKFRQKSA/ICJcCitNaXQgJ21haWwnIGJ6dyAnbWFpbCA8c3BpZWxlcj4nIGthbm5zdCBEdSBQb3N0IGxlc2VuIHVuZCBzY2hyZWliZW4uXG5cCisiIDogIiIgKSsiXAorRWluZ2ViYXV0ZSBhbGlhc2U6IG5vdGUsIGNhdGNodXAsIHJlcGx5LCB1bnN1YnNjcmliZSwgc3Vic2NyaWJlLCB1bmNhdGNodXAuXG5cCitWaWVsZSBCZWZlaGxlIGdlYmVuIG1pdCAnPGJlZmVobD4gPycgZWluaWdlIFN5bnRheGhpbndlaXNlLlxuXAorQWt0dWVsbGUgUnVicmlrOiAiK0dST1VQKyJcblwKKyI7Cit9CisKKworaW5pdCgpCit7CisgIDo6aW5pdCgpOworCisgIGFkZF9hY3Rpb24oInNjaHJlaWIiLCJzY2hyZWliIik7CisgIGFkZF9hY3Rpb24oInNjaHJlaWIiLCJzY2hyZWliZSIpOworICBhZGRfYWN0aW9uKCJzY2hyZWliIiwibm90ZSIpOworICBhZGRfYWN0aW9uKCJMaWVzQXJ0aWtlbCIsImxpZXMiKTsKKyAgYWRkX2FjdGlvbigiYXJ0aWtlbCIsImFydGlrZWwiKTsKKyAgYWRkX2FjdGlvbigibG9lc2NoZSIsImxvZXNjaCIpOworICBhZGRfYWN0aW9uKCJsb2VzY2hlIiwibG9lc2NoZSIpOworICBhZGRfYWN0aW9uKCJydWJyaWsiLCJydWJyaWsiKTsKKyAgYWRkX2FjdGlvbigiaW5oYWx0IiwiaW5oYWx0Iik7CisgIGFkZF9hY3Rpb24oInJ1YnJpa2VuIiwicnVicmlrZW4iKTsKKyAgYWRkX2FjdGlvbigiUmVhZE5leHRVbnJlYWQiLCJubiIpOworICBhZGRfYWN0aW9uKCJDYXRjaHVwIiwiY2F0Y2h1cCIpOworICBhZGRfYWN0aW9uKCJDYXRjaHVwIiwidWViZXJnZWgiKTsKKyAgYWRkX2FjdGlvbigiQ2F0Y2h1cCIsInVlYmVyZ2VoZSIpOworICBhZGRfYWN0aW9uKCJVbmNhdGNodXAiLCJ3aWVkZXJob2wiKTsKKyAgYWRkX2FjdGlvbigiVW5jYXRjaHVwIiwid2llZGVyaG9sZSIpOworICBhZGRfYWN0aW9uKCJVbmNhdGNodXAiLCJ1bmNhdGNodXAiKTsKKyAgYWRkX2FjdGlvbigiUmVwbHkiLCJhbnR3b3J0Iik7CisgIGFkZF9hY3Rpb24oIlJlcGx5IiwiYW50d29ydGUiKTsKKyAgYWRkX2FjdGlvbigiUmVwbHkyIiwicmVwbHkiKTsKKyAgYWRkX2FjdGlvbigiSGVscFBhZ2UiLCJoaWxmZSIpOworICBhZGRfYWN0aW9uKCJIZWxwUGFnZSIsIm1hbiIpOworICBhZGRfYWN0aW9uKCJVbnN1YnNjcmliZSIsInVuc3Vic2NyaWJlIik7CisgIGFkZF9hY3Rpb24oIkJlc3RlbGxlIiwiYmVzdGVsbCIpOworICBhZGRfYWN0aW9uKCJCZXN0ZWxsZSIsImJlc3RlbGxlIik7CisgIGFkZF9hY3Rpb24oIlN1YnNjcmliZSIsInN1YnNjcmliZSIpOworICBhZGRfYWN0aW9uKCJTdWJzY3JpYmUiLCJhYm9ubmllciIpOworICBhZGRfYWN0aW9uKCJTdWJzY3JpYmUiLCJhYm9ubmllcmUiKTsKKyAgYWRkX2FjdGlvbigiTW92ZU1lc3NhZ2UiLCJ2ZXJsZWciKTsKKyAgYWRkX2FjdGlvbigiTW92ZU1lc3NhZ2UiLCJ2ZXJsZWdlIik7CisgIGFkZF9hY3Rpb24oIlNldE5OQURXTVNHIiwiemVpdHVuZ3NtZWxkdW5nIik7CisgIGFkZF9hY3Rpb24oIklnbm9yZSIsImlnbm9yaWVyIik7CisgIGFkZF9hY3Rpb24oIklnbm9yZSIsImlnbm9yaWVyZSIpOworICBhZGRfYWN0aW9uKCJNYWlsTWVzc2FnZSIsInZlcnNlbmRlIik7CisgIGFkZF9hY3Rpb24oInZlcmJyZW5uZW4iLCJ2ZXJicmVubmUiKTsKKworICBpZiAoSVNfU0VFUihUUCkpIHsKKyAgICBhZGRfYWN0aW9uKCJNYWlsIiwibWFpbCIpOworICB9CisgIGlmIChJU19MRUFSTkVSKFRQKSkgeworICAgIGFkZF9hY3Rpb24oIlNhdmVNZXNzYWdlIiwic3BlaWNoZXIiKTsKKyAgICBhZGRfYWN0aW9uKCJTYXZlTWVzc2FnZSIsInNwZWljaGVyZSIpOworICAgIGFkZF9hY3Rpb24oIlJlYWROZXh0VW5yZWFkIiwicmVhZCIpOyAvKiBORiBDb21wYXRpYmlsaXR5IFNwZWNpYWwgKi8KKyAgfQorICBpZiAoSVNfRUxERVIoVFApKQorICB7CisgICAgYWRkX2FjdGlvbigiTW92ZVRyYXNoIiwidHJhc2giKTsKKyAgfQorICBpbml0X3Jlc2N1ZSgpOworfQorCit2ZXJicmVubmVuKHN0cikgeworICBpZiAoIXN0ciB8fCAhaWQoc3RyKSkgcmV0dXJuIDA7CisgIHdyaXRlKCJEdSB2ZXJicmVubnN0IERlaW5lIFplaXR1bmcgbWl0IGdyb2Vzc3RlbSBWZXJnbnVlZ2VuLlxuIik7CisgIHNheShUUC0+TmFtZShXRVIpKyIgdmVyYnJlbm50ICIrCisgICAgVFAtPlF1ZXJ5UG9zc1Byb25vdW4oRkVNQUxFLCBXRU4sIFNJTkdVTEFSKSsiIFplaXR1bmcgaW4gZWluZW0gIgorICAgICJGcmV1ZGVuZmV1ZXIuXG4iKTsKKyAgcmVtb3ZlKDEpOworICByZXR1cm4gMTsKK30KKworLy8gS2lsbEdyb3VwIC0gbG9lc2NodCBlaW5lIG5pY2h0IG1laHIgYmVub2V0aWd0ZSBSdWJyaWsgYXVzIGRlciBMaXN0ZS4KKy8vIEF1ZnJ1ZiBhdXMgcnVicmlrZW4oKSB1bmQgUmVhZE5leHRVbnJlYWQoKSwgd2VubiBkaWUgZ3VlbHRpZ2UKKy8vIFJ1YnJpa2VubGlzdGUgc293aWVzbyBzY2hvbiBhYmdlcnVmZW4gd3VyZGUuCisKK3N0YXRpYyBLaWxsR3JvdXAobmFtZSkgeyByZWFkX3VudGlsPW1fY29weV9kZWxldGUocmVhZF91bnRpbCxuYW1lKTsgfQorCisvKiBSZWJ1aWxkR3JvdXBMaXN0KCkgLSB0dXQgZG9jaCBuaWNodCBzbywgd2VpbCAvc2VjdXJlL25ld3MgYW5kZXJzIGFyYmVpdGV0LgorICogQmxlaWJ0IHZvcmVyc3QgenVtIE5hY2hzY2hsYWdlbi4KK3N0YXRpYyBSZWdpc3Rlckdyb3VwKG5hbWUpIHsgcmVhZF91bnRpbFtuYW1lXT0xOyB9CitzdGF0aWMgUmVidWlsZEdyb3VwTGlzdCgpIHsKKyAgbWl4ZWQgZ3JvdXBzOworICBpZiAoKHBvaW50ZXJwKGdyb3Vwcz1ORVdTU0VSVkVSLT5HZXRHcm91cHMoKSkpJiYoc2l6ZW9mKGdyb3VwcykpKSB7CisgICAgbWFwKG1faW5kaWNlcyhyZWFkX3VudGlsKS1ncm91cHMtU1lTVEVNR1JPVVBTLCMnS2lsbEdyb3VwKTsKKyAgICBtYXAoZ3JvdXBzLW1faW5kaWNlcyhyZWFkX3VudGlsKSwjJ1JlZ2lzdGVyR3JvdXApOworICB9CisgIFRQLT5TZXRQcm9wKFBfUkVBRF9ORVdTLHJlYWRfdW50aWwpOworfSAgICAKKyovCisKKworX3NldF9hdXRvbG9hZG9iaihtaXhlZCBhcmcpIHsKKworICBpZiAocG9pbnRlcnAoYXJnKSAmJiBzaXplb2YoYXJnKT49MikKKyAgeworICAgIHJlYWRfdW50aWw9YXJnWzFdOworICB9CisgIGVsc2UgeworICAgIGlmIChUUCkKKyAgICAgICByZWFkX3VudGlsPSgoVFAtPlF1ZXJ5UHJvcChQX1JFQURfTkVXUykpfHwoW10pKTsKKyAgfQorCisgIGlmIChUUCkgVFAtPlNldFByb3AoUF9SRUFEX05FV1MscmVhZF91bnRpbCk7Cit9CisKK19xdWVyeV9hdXRvbG9hZG9iaigpIHsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBNYWlsKHN0cikgeworICBvYmplY3QgbWFpbGVyOworICBpZiAodGhpc19pbnRlcmFjdGl2ZSgpIT10aGlzX3BsYXllcigpKSByZXR1cm4gMDsKKyAgbWFpbGVyPWNsb25lX29iamVjdChNQUlMRVIpOworICBtYWlsZXItPlNldE9mZmljZU5hbWUoIm1wYSBLdXJpZXJkaWVuc3QiKTsKKyAgbWFpbGVyLT5kb19tYWlsKCAoKCFzdHIpfHwoc3RyPT0ibWFpbCIpKSA/IDAgOiBUUC0+X3VucGFyc2VkX2FyZ3MoKSApOworICByZXR1cm4gMTsKK30KKworc3RhdGljIHZhcmFyZ3Mgc3RyaW5nIE1lc3NhZ2Uyc3RyaW5nKG1peGVkIG1zZyxtaXhlZCBtZXNzYWdlcyxpbnQgZmxhZyxzdHJpbmcgZ3JvdXApIHsKKyAgLy8gQXVmcnVmZTogKE51bW1lcixOb3Rlc1ssZmxhZ1ssZ3JvdXBdXSkgb2RlciAoTm90ZSxOb3Rlc1ssZmxhZ1ssZ3JvdXBdXSkKKyAgLy8gZmxhZzogTTJTX1ZUMTAwIDogZ2dmIEFOU0ktQ29kZXMgdmVyd2VuZGVuCisgIC8vICAgICAgIE0yU19SRU1PVEU6IFJ1YnJpayB1bmQgQXJ0aWtlbG51bW1lciBhdXNnZWJlbiAoc3BlaWNoZXJuLCB2ZXJzZW5kZW4pCisgIC8vIEFjaHR1bmc6IFdlbm4gZmxhZyZNMlNfUkVNT1RFLCBtdXNzIG1zZyBpbnQgc2VpbgorICAvLyBncm91cDogTmFtZSBkZXIgUnVicmlrLCB3ZW5uIG5pY2h0IGFrdHVlbGxlIFJ1YnJpay4gTnVyIGJlaSBNMlNfUkVNT1RFCisKKyAgc3RyaW5nIHR4dCxocyxzLCptLHMyOworICBpbnQgaSxoaSx0aGlzbnIsYW5zaWZsYWc7CisKKyAgaWYgKGZsYWcmTTJTX1JFTU9URSkgdHh0PSJSdWJyaWs6ICIrKGdyb3VwP2dyb3VwOkdST1VQKSsiLCBBcnRpa2VsOiAiKworICAgIChpbnRwKG1zZyk/dG9fc3RyaW5nKG1zZysxKToiPz8/IikrIiB2b24gIitzaXplb2YobWVzc2FnZXMpKyJcbiI7CisgIGVsc2UgdHh0PSIiOworCisgIGlmIChpbnRwKG1zZykpIHsKKyAgICB0aGlzbnI9bXNnOworICAgIG1zZz1tZXNzYWdlc1ttc2ddOworICB9IGVsc2UgdGhpc25yPS0xOworICBpZiAoIW1zZykgcmV0dXJuIDA7CisKKyAgYW5zaWZsYWc9KGZsYWcmTTJTX1ZUMTAwKSYmKHRoaXNfcGxheWVyKCktPlF1ZXJ5UHJvcChQX1RUWSkhPSJkdW1iIik7CisKKyAgdHh0ICs9IChhbnNpZmxhZz9BTlNJX0JPTEQ6IiIpKyBtc2dbTV9USVRMRV0rKGFuc2lmbGFnP0FOU0lfTk9STUFMOiIiKSsKKyAgICAiICgiK21zZ1tNX1dSSVRFUl0rIiwgIisKKyAgICBkdGltZShtc2dbTV9USU1FXSlbNS4uMjZdKyIpOlxuIjsKKy8vICBpZiAoZ2V0ZXVpZChUUCk9PSJzaXRvcGFuYWtpIikgdHh0Kz0iVElEPSIrR2V0VElEKG1zZykrIlxuIjsgLy8gRGVidWcKKyAgaWYgKCFJU19TVEFUVVNMSU5FKG1zZ1tNX01FU1NBR0VdKSkKKyAgICByZXR1cm4gdHh0KyJcbiIrbXNnW01fTUVTU0FHRV07CisgIG09ZXhwbG9kZShtc2dbTV9NRVNTQUdFXSwiXG4iKTsKKyAgd2hpbGUgKElTX1NUQVRVU0xJTkUobVswXSkpIHsKKy8vICAgIHR4dCs9bVswXSsiXG4iOyAvLyAjIyMKKyAgICBpZiAoc3NjYW5mKG1bMF0sIiVzIHJuPSVzIHJ0PSVkIHJnPSVzIixocyxzLGhpLGhzKT09NCB8fAorICAgICAgICBzc2NhbmYobVswXSwiJXMgcm49JXMgcnQ9JWQiLGhzLHMsaGkpPT0zKQorICAgIHsKKyAgICAgIGludCBucixoOworICAgICAgbnI9LTE7CisgICAgICBpZiAocG9pbnRlcnAobWVzc2FnZXMpKQorICAgICAgeworICAgICAgICBmb3IgKGg9KCh0aGlzbnI+PTApID8gdGhpc25yLTEgOiBzaXplb2YobWVzc2FnZXMpLTEpOworICAgICAgICAgICAgIChoPj0wICYmIG1lc3NhZ2VzW2hdW01fVElNRV0+PWhpKTtoLS0pIAorICAgICAgICAgIGlmIChtZXNzYWdlc1toXVtNX1RJTUVdPT1oaSAmJgorICAgICAgICAgICAgICBsb3dlcl9jYXNlKG1lc3NhZ2VzW2hdW01fV1JJVEVSXSk9PWxvd2VyX2Nhc2UocykpCisgICAgICAgICAgICBucj1oOworICAgICAgfQorICAgICAgdHh0Kz0iW0JlenVnOiBBcnRpa2VsICIrKChucj49MCkgPyAobnIrMSkgOiAKKyAgICAgICAgIChocz09U1RBVFVTRVNDQVBFfHxocz09KGdyb3VwP2dyb3VwOkdST1VQKT8iKGdlbG9lc2NodD8pIjoiaW4gIitocykpKworICAgICAgICAgIiB2b24gIitjYXBpdGFsaXplKHMpKyIgdm9tICIrZHRpbWUoaGkpWzUuLjI2XSsiXVxuIjsKKyAgICB9CisgICAgaWYgKHNzY2FuZihtWzBdLCIlcyBvbj0lcyBvdD0lZCBvZz0lcyIsaHMscyxoaSxocyk9PTQpIHsKKyAgICAgIHR4dCs9IltBdXRvcjogIitzKyIsICIrZHRpbWUoaGkpWzUuLjI2XSsiLCB2ZXJsZWd0IHZvbiAiK2hzKyJdXG4iOworICAgIH0KKyAgICBtPW1bMS4uXTsKKyAgfQorICByZXR1cm4gdHh0KyJcbiIraW1wbG9kZShtLCJcbiIpOworfQorCitzdGF0aWMgdmFyYXJncyBsaWVzKG1peGVkIHN0cikgeworICBtaXhlZCBudW07CisgIG1peGVkICptZXNzYWdlczsKKyAgaW50IHRpZDsKKworICBpZiAoc3RyPT0iPyJ8fHN0cj09Ii0/IikgcmV0dXJuIAorICAgIHdyaXRlKCJTeW50YXg6IGxpZXMgPG5yPlxuIgorICAgICAgICAgICIgICAgICAgIGFydGlrZWwgPG5yPlxuIgorICAgICAgICAgICJTaWVoZSBhdWNoOiBublxuIiksMTsKKworICBpZiAoaW50cChzdHIpKSBudW09c3RyOworICBpZiAoKCFudW0gJiYgKCFzdHIgfHwgc3RyPT0iIiB8fCBzc2NhbmYoc3RyLCIlZCIsbnVtKSE9MSkpIHx8IG51bTw9MCkgeworICAgIG5vdGlmeV9mYWlsKCJXRUxDSEUgTmFjaHJpY2h0IHdpbGxzdCBEdSBsZXNlbj9cbiIpOworICAgIHJldHVybiAwOworICB9CisgIGlmICghcG9pbnRlcnAobWVzc2FnZXM9TkVXU1NFUlZFUi0+R2V0Tm90ZXMoR1JPVVApKSkKKyAgICByZXR1cm4gbm90aWZ5X2ZhaWwoIlNlbHRzYW0sIGRpZSBSdWJyaWsgJyIrR1JPVVArCisgICAgICAgICInIGdpYnQgZXMgbmljaHQgbWVoci4uLlxuIiksIDA7CisgIG51bS0tOworICBpZiAoc2l6ZW9mKG1lc3NhZ2VzKTw9bnVtKSB7CisgICAgbm90aWZ5X2ZhaWwoIlNvIHZpZWxlIEFydGlrZWwgc2luZCBkYSBuaWNodCFcbiIpOworICAgIHJldHVybiAwOworICB9CisgIAorICBsYXN0dGl0bGU9KHttZXNzYWdlc1tudW1dW01fVElUTEVdLG1lc3NhZ2VzW251bV1bTV9XUklURVJdLAorICAgICAgbWVzc2FnZXNbbnVtXVtNX1RJTUVdLEdldFRJRChtZXNzYWdlc1tudW1dKSxHUk9VUCxudW19KTsKKyAgdGhpc19wbGF5ZXIoKS0+TW9yZShNZXNzYWdlMnN0cmluZyhtZXNzYWdlc1tudW1dLG1lc3NhZ2VzLE0yU19WVDEwMCkpOworICBpZiAodGhpc19wbGF5ZXIoKSAmJiBJU19MRUFSTkVSKHRoaXNfcGxheWVyKCkpKQorICAgIHRoaXNfcGxheWVyKCktPnNhdmVfbWUoMSk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgdmFyYXJncyBtaXhlZCBHZXRHcm91cE5hbWUobWl4ZWQgZyxtaXhlZCBncm91cHMpIHsKKyAgLyogTmFtZSBlaW5lciBSdWJyaWsuIGcgaXN0IGludCBvZGVyIHN0cmluZywgZW50aGFlbHQgTmFtZSBvZGVyIE51bW1lcgorICAgICAoYWIgMSBudW1lcmllcnQpICovCisgIG1peGVkIGksZXhwcixnZzsKKyAgaWYgKCFnKSByZXR1cm4gd3JpdGUoIkR1IHNvbGx0ZXN0IHNjaG9uIGRpZSBSdWJyaWsgYW5nZWJlbi5cbiIpLDA7CisgIGlmICghZ3JvdXBzKSBncm91cHM9TkVXU1NFUlZFUi0+R2V0R3JvdXBzKCk7CisgIGlmIChpbnRwKGk9ZykgfHwgc3NjYW5mKGcsIiVkIixpKSkgeworICAgIGlmIChpPjAgJiYgaTw9c2l6ZW9mKGdyb3VwcykpIHJldHVybiBncm91cHNbaS0xXTsKKyAgICB3cml0ZSgiRWluZSBSdWJyaWsgbWl0IGRlciBOdW1tZXIgIitpKyIgZ2lidCBlcyBsZWlkZXIgbmljaHQuXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBnPWxvd2VyX2Nhc2UoZyk7CisgIHN3aXRjaChnKXsKKyAgY2FzZSAiLiI6IHJldHVybiBHUk9VUDsKKyAgY2FzZSAiKyI6IHJldHVybiBncm91cHNbKG1lbWJlcihncm91cHMsR1JPVVApKzEpJXNpemVvZihncm91cHMpXTsKKyAgY2FzZSAiLSI6IAorICAgIHJldHVybiBncm91cHNbKG1lbWJlcihncm91cHMsR1JPVVApLTErc2l6ZW9mKGdyb3VwcykpJXNpemVvZihncm91cHMpXTsKKyAgfQorCisgIC8vIEV4aXN0aWVydCBkaWUgUnVicmlrIGdlbmF1IHNvPworICBpZiAobWVtYmVyKGdyb3VwcyxnKT4tMSkgcmV0dXJuIGc7CisKKyAgZyA9IHJlZ3JlcGxhY2UoZywiW1tcXF1cXCooKT9dIiwiIiwxKTsKKyAgLy8gaGFlcnRlcmVzIEtyaXRlcml1bTogQWxsZSBBYnNjaG5pdHRlIGFuZ2VnZWJlbgorICBleHByPSJeIitpbXBsb2RlKGV4cGxvZGUoZywiLiIpLCJbXlxcLl0qXFwuIikrIlteXFwuXSokIjsKKy8vICB3cml0ZSgiUkVHRVhQPSIrZXhwcisiXG4iKTsKKyAgZ2c9cmVnZXhwKGdyb3VwcyxleHByKTsKKyAgaWYgKHNpemVvZihnZyk9PTEpIHJldHVybiBnZ1swXTsKKworICAvLyB3ZWljaGVyZXMgS3JpdGVyaXVtOiBOaWNodCBhbGxlIEFic2Nobml0dGUgYW5nZWdlYmVuCisgIGV4cHI9Il4oLipcXC4pKiIraW1wbG9kZShleHBsb2RlKGcsIi4iKSwiLipcXC4iKSsiLiokIjsKKy8vICB3cml0ZSgiUkVHRVhQPSIrZXhwcisiXG4iKTsKKyAgZ2c9cmVnZXhwKGdyb3VwcyxleHByKTsKKworICBpZiAoIXNpemVvZihnZykpIHsKKyAgICB3cml0ZSgiRWluZSBSdWJyaWsgJyIrZysiJyBnaWJ0IGVzIGhpZXIgbGVpZGVyIG5pY2h0LlxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoc2l6ZW9mKGdnKT09MSkgcmV0dXJuIGdnWzBdOworICAKKyAgd3JpdGUoYnJlYWtfc3RyaW5nKCJEaWUgUnVicmlrICIrZysiIGlzdCBuaWNodCBlaW5kZXV0aWcuIFdhaHJzY2hlaW5saWNoICIKKyAgICAgICAgIm1laW5zdCBEdSBlaW5lIGRlciBmb2xnZW5kZW46ICIraW1wbG9kZShnZywiLCAiKSsiLlxuIiw3OCkpOworICByZXR1cm4gMDsKK30KKworc3RhdGljIHJ1YnJpayhzdHIpCit7CisgIG1peGVkICpncnVwcGVuOworICBtaXhlZCBuZXdzOworICBpbnQgYW56LGk7CisgIAorICBpZiAoc3RyPT0iPyJ8fHN0cj09Ii0/IikgcmV0dXJuCisgICAgd3JpdGUoIlN5bnRheDogcnVicmlrIDxydWJyaWs+XG4iCisgICAgICAgICAgIiAgd2VjaHNlbHQgZGllIGFrdHVlbGxlIFJ1YnJpay4gRXMgd2lyZCBkaWUgTnVtbWVyIGRlciBSdWJyaWssXG4iCisgICAgICAgICAgIiAgaWhyIE5hbWUgb2RlciBqZWRlIGVpbmRldXRpZ2UgQWJrdWVyenVuZyBha3plcHRpZXJ0LlxuIiksMTsKKworICBpZiAoIXN0ciB8fCBzdHI9PTApIHsKKyAgICAgIGlmICghcG9pbnRlcnAobmV3cz1ORVdTU0VSVkVSLT5HZXROb3RlcyhHUk9VUCkpKXsKKyAgICAgIEdST1VQPURFRkFVTFRHUk9VUDsKKyAgICBpZiAoIXBvaW50ZXJwKG5ld3M9TkVXU1NFUlZFUi0+R2V0Tm90ZXMoR1JPVVApKSkKKyAgICAgIHJldHVybiBub3RpZnlfZmFpbCgiU2VsdHNhbSwgaXJnZW5kd2llIGdlaHQgaGllciBlaW5pZ2VzIHNjaGllZi4uLlxuIiksMDsKKyAgICAgIH0KKyAgICByZXR1cm4gd3JpdGUoIkFrdHVlbGxlIFJ1YnJpazogIitHUk9VUCsiICgiK3NpemVvZihuZXdzKSsiIEFydGlrZWwpLlxuIiksMTsKKyAgfQorICBzdHI9R2V0R3JvdXBOYW1lKHN0cik7CisgIGlmICghc3RyKSByZXR1cm4gMTsKKyAgR1JPVVA9c3RyOworICBuZXdzPU5FV1NTRVJWRVItPkdldE5vdGVzKEdST1VQKTsKKyAgd3JpdGUoYnJlYWtfc3RyaW5nKCJPaywgRHUgaGFzdCBkaWUgUnVicmlrICIrR1JPVVArIiBtaXQgIitzaXplb2YobmV3cykrCisgICAgICAgICAgICAgICAgICAgICAiIEFydGlrZWwiKyhzaXplb2YobmV3cyk9PTE/IiI6Im4iKSsiIGF1Zmdlc2NobGFnZW4uXG4iLAorICAgICAgICAgICAgICAgICAgICAgNzgpKTsKKyAgcmV0dXJuIDE7Cit9CisKK0xpZXNBcnRpa2VsKHN0cikgeworICBzdHJpbmcgczE7CisgIGludCBpMTsKKyAgaWYgKCAhc3RyICkgcmV0dXJuIDA7CisgIGlmIChzc2NhbmYoc3RyLCJydWJyaWsgJXMiLHMxKSkKKyAgICByZXR1cm4gcnVicmlrKHMxKTsKKyAgIGlmIChzc2NhbmYoc3RyLCIlZCIsaTEpKQorICAgIHJldHVybiBsaWVzKHRvX2ludChpMSkpOworICBpZiAoc3NjYW5mKHN0ciwiYXJ0aWtlbCAlcyIsczEpKQorICAgIHJldHVybiBsaWVzKHMxKTsKK30KKworCisvKiBVZWJlcnBydWVmZSwgb2IgaW4gUnVicmlrIHRvdGUgdGhyZWFkcyBpZ25vcmllcnQgd2VyZGVuLiBUb3QgYmVkZXV0ZXQsCisgICBkYXNzIGRlciBsZXR6dGUgZGFyaW4gdWViZXJnYW5nZW5lIEFydGlrZWwgYmVyZWl0cyBleHBpcmVkIGlzdCBVTkQKKyAgIGtlaW5lIEFydGlrZWwgYXVzIGRpZXNlbSB0aHJlYWQgbWVociB2b3JoYW5kZW4gc2luZC4KKyAgIEFDSFRVTkc6IEVzIGthbm4gcGFzc2llcmVuLCBkYXNzIGRhendpc2NoZW4gbm9jaCBlaW4gbmV1ZXIgQXJ0aWtlbAorICAgZGF6dWdla29tbWVuIGlzdC4KKyAgIEhpZXIgd2lyZCBhdWYgZXhwaXJlZCBnZXBydWVmdCB1bmQgZ2dmIFZhcmlhYmxlIGRlYWRUSUQgZ2VzZXR6dC4gV2lyZCBiZWltCisgICBMZXNlbiBtaXQgbm4gZWluIEFydGlrZWwgbWl0IGRpZXNlciBUSUQgZ2VmdW5kZW4gKHBhc3NpZXJ0IGRpcmVrdCBoaW50ZXIKKyAgIFBydWVmdW5nKSwgd2lyZCBkZWFkVElEIHdpZWRlciBhdWYgMCBnZXNldHp0LiBJc3QgZGVhZFRJRCBiZWltIFVtc2NoYWx0ZW4KKyAgIGF1ZiBuYWVjaHN0ZSBSdWJyaWsgIT0wLCBpc3QgZGVyIHRocmVhZCB0b3QuCisqLworCitzdGF0aWMgaW50IENoZWNrVGhyZWFkcyhzdHJpbmcgcnVicmlrLGludCB0aW1lb3V0KSB7CisgIG1peGVkIHRpZHM7CisgIGludCBpOworCisvLyAgZGVhZFRJRD0wOworICB0aWRzPW1faW5kaWNlcyhyZWFkX3VudGlsW0lHTk9SRUdST1VQXVtydWJyaWtdKTsKKyAgZm9yIChpPXNpemVvZih0aWRzKS0xO2k+PTAmJiFkZWFkVElEO2ktLSkKKyAgICBpZiAocmVhZF91bnRpbFtJR05PUkVHUk9VUF1bcnVicmlrXVt0aWRzW2ldXTx0aW1lb3V0KSBkZWFkVElEPXRpZHNbaV07CisgIHJldHVybiAxOworfSAgCisKK3N0YXRpYyBpbnQgcnVicmlrZW4obWl4ZWQgYXJnKQoreworICBtaXhlZCAqZ3J1cHBlbiwgKm1lc3NhZ2VzOworICBtaXhlZCBuZXdzOworICBpbnQgYW56LGksbGFzdHRpbWUsdGltZW91dCxmb3VuZG9uZTsKKyAgc3RyaW5nIHM7CisgIAorICBpZiAoYXJnPT0iPyJ8fGFyZz09Ii0/IikgcmV0dXJuCisgICAgd3JpdGUoIlN5bnRheDogcnVicmlrZW4gICAgICAgIGxpc3RldCBhbGxlIFJ1YnJpa2VuXG4iCisgICAgICAgICAgIiAgICAgICAgcnVicmlrZW4gbmV1ICAgIG51ciBSdWJyaWtlbiBtaXQgdW5nZWxlc2VuZW4gQXJ0aWtlbG5cbiIpLDE7CisKKyAgZ3J1cHBlbj1ORVdTU0VSVkVSLT5HZXRHcm91cHMoKTsKKyAgbWFwKG1faW5kaWNlcyhyZWFkX3VudGlsKS1ncnVwcGVuLVNZU1RFTUdST1VQUywjJ0tpbGxHcm91cCk7IC8vICcpOworICBzPSJcbkVzIGdpYnQgenVyIFplaXQgIjsKKyAgYW56PXNpemVvZihncnVwcGVuKTsKKyAgaWYgKGFuej09MCkgeworICAgIHdyaXRlKHMrImtlaW5lIFJ1YnJpa2VuICh3aWUgc2VsdHNhbSAuLi4pXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBzKz1hbnorIiBSdWJyaWsiKyhhbno9PTEgPyAiIiA6ICJlbiIpKyIuIjsKKyAgaWYgKGFyZz09Im5ldSIpIHMrPSJcbkRhdm9uIGVudGhhbHRlbiBuZXVlIEFydGlrZWw6XG5cbiI7CisgIGVsc2Ugcys9IlxuKCogb2RlciB4OiBlbnRoYWVsdCBuZXVlIEFydGlrZWwsIHggb2RlciAtOiBhYmJlc3RlbGx0LCAiCisgICAgIj46IGFrdHVlbGxlIFJ1YnJpaylcblxuIjsKKyAgZm9yIChpPTA7aTxhbno7aSsrKSB7CisgICAgdGltZW91dD1yZWFkX3VudGlsW2dydXBwZW5baV1dOworICAgIC8qIEdldE5ld3NUaW1lIGxpZWZlcnRlIGxlaWRlciBtYW5jaG1hbCB3YXMgZmFsc2NoZXMgOi0oICAqLworICAgIC8qIGpldHp0IGhvZmZlbnRsaWNoIHJpY2h0aWc/IFdlbm4gbmljaHQsIGRhcyBpZiBhdXNrbGFtbWVybiAqLworICAgIGlmICggYXJnIT0ibmV1IiB8fCAobGFzdHRpbWU9TkVXU1NFUlZFUi0+R2V0TmV3c1RpbWUoZ3J1cHBlbltpXSkpID4gdGltZW91dCkgeworICAgICAgbWVzc2FnZXM9TkVXU1NFUlZFUi0+R2V0Tm90ZXMoZ3J1cHBlbltpXSk7CisgICAgICBpZiAoIW1lc3NhZ2VzIHx8ICFzaXplb2YobWVzc2FnZXMpKSBsYXN0dGltZT0wOworICAgICAgZWxzZSBsYXN0dGltZT1tZXNzYWdlc1tzaXplb2YobWVzc2FnZXMpLTFdW01fVElNRV07CisgICAgICBmb3VuZG9uZT0xOworICAgIH0KKyAgICBpZiAoYXJnIT0ibmV1IiB8fCAodGltZW91dD49MCAmJiBsYXN0dGltZT5hYnModGltZW91dCkpKQorICAgICAgcys9c3ByaW50ZigiJXMlcyUzZFwuICUtMzkuMzlzOiAiLAorICAgICAgICAgICAgICAgICAoKGdydXBwZW5baV09PUdST1VQKT8iPiI6IiAiKSwKKyAgICAgICAgICAgICAgICAgKChsYXN0dGltZT5hYnModGltZW91dCkpID8gKCh0aW1lb3V0PDApID8gIngiIDogIioiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoKHRpbWVvdXQ8MCkgPyAiLSIgOiAiICIpICksCisgICAgICAgICAgICAgICAgIGkrMSxncnVwcGVuW2ldKSsgCisgICAgICAgICAobGFzdHRpbWUgPyBzcHJpbnRmKCIlM2QgQXJ0aWtlbCAoJXMpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobWVzc2FnZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoKHNpemVvZihtZXNzYWdlcyk9PTEpID8gIi4gICIgOiAiZW4uIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0aW1lKGxhc3R0aW1lKVs1Li4xMl0rY3RpbWUobGFzdHRpbWUpWzwyLi5dKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgIC0gbGVlciAtXG4iKTsKKyAgfQorICBpZiAoYXJnPT0ibmV1IiYmIWZvdW5kb25lKSBzKz0iS2VpbmUgUnVicmlrIGVudGhhZWx0IG5ldWUgQXJ0aWtlbC5cbiI7CisgIHRoaXNfcGxheWVyKCktPk1vcmUocyk7CisgIHJldHVybiAxOworfQorCisjZGVmaW5lIE1fUkVBRE5FWFQgIDEKKyNkZWZpbmUgTV9MSVNUTkVXICAgMgorI2RlZmluZSBNX0xJU1RORVdHUiAzCisjZGVmaW5lIE1fUkVBREdSICAgIDQKKworc3RhdGljIFJlYWROZXh0VW5yZWFkKHN0cikKK3sKKyAgc3RyaW5nICpncm91cHMsZ3JvdXA7CisgIG1peGVkICptZXNzYWdlczsKKyAgaW50IGN1cmdyLGN1cm1zZyx0aW1lb3V0LHN0YXJ0LG5yZ3JvdXBzLHNvZyxtb2RlOworCisgIGlmIChzdHI9PSJtYWlsIikgcmV0dXJuIE1haWwoMCk7IC8qIE5GIENvbXBhdGliaWxpdHkgU3BlY2lhbCAqLworCisgIGlmIChzdHI9PSI/Inx8c3RyPT0iLT8iKSByZXR1cm4KKyAgICB3cml0ZSgiU3ludGF4OiBubiAgICAgICAgICAgICBuYWVjaHN0ZXIgbmV1ZXIgQXJ0aWtlbFxuIgorICAgICAgICAgICIgICAgICAgIG5uIDxydWJyaWs+ICAgIGluIGVudHNwci4gUnVicmlrLCB3ZW5uIGRhIHdhcyBuZXUgaXN0XG4iCisgICAgICAgICAgIiAgICAgICAgbm4gcnVicmlrZW4gICAgTGlzdGUgZGVyIFJ1YnJpa2VuIG1pdCBuZXVlbiBBcnRpa2VsblxuIgorICAgICAgICAgICIgICAgICAgIG5uIGxpc3RlICAgICAgIExpc3RlIGRlciB1bmdlbGVzZW5lbiBBcnRpa2VsXG4iKSwxOworCisgIGdyb3Vwcz1ORVdTU0VSVkVSLT5HZXRHcm91cHMoKTsKKyAgZGVhZFRJRD0wOworICBtYXAobV9pbmRpY2VzKHJlYWRfdW50aWwpLWdyb3Vwcy1TWVNURU1HUk9VUFMsIydLaWxsR3JvdXApOyAvLycKKyAgbnJncm91cHM9c2l6ZW9mKGdyb3Vwcyk7CisgIGlmIChzdHIgJiYgc3RyIT0icnVicmlrZW4iICYmIHN0ciE9Imxpc3RlIil7CisgICAgaWYgKCFncm91cD1HZXRHcm91cE5hbWUoc3RyKSkgcmV0dXJuIDE7CisgIH0KKyAgZWxzZQorICAgIGdyb3VwPTA7CisgIGlmIChncm91cCAmJiAoY3VyZ3I9bWVtYmVyKGdyb3Vwcyxncm91cCkrMSkpIHsKKyAgICAtLWN1cmdyOworICAgIGlmIChjdXJncjwwIHx8IGN1cmdyPj1zaXplb2YoZ3JvdXBzKSkgCisgICAgICByZXR1cm4gbm90aWZ5X2ZhaWwoIk5lZS4uLiBzbyBlaW5lIFJ1YnJpayBnaWJ0cyBoaWVyIG5pY2h0LlxuIiksMDsKKyAgICBHUk9VUD1ncm91cDsKKyAgICBzdGFydD1jdXJncisxOworICAgIG1vZGU9TV9SRUFER1I7CisgICAgd3JpdGUoIlJ1YnJpayAiKyhjdXJncisxKSsiOiAiK0dST1VQKyJcbiIpOworICB9IGVsc2UgeworICAgIHN3aXRjaCAoc3RyKSB7CisgICAgY2FzZSAwOiBtb2RlPU1fUkVBRE5FWFQ7IGJyZWFrOworICAgIGNhc2UgImxpc3RlIjogbW9kZT1NX0xJU1RORVc7IHdyaXRlKCJEdSBoYXN0IG5vY2ggbmljaHQgZ2VsZXNlbjpcbiIpOyBicmVhazsKKyAgICBjYXNlICJydWJyaWtlbiI6IHJldHVybiBydWJyaWtlbigibmV1Iik7CisgICAgZGVmYXVsdDoKKyAgICAgIG5vdGlmeV9mYWlsKCJcCitEaWVzZW4gUGFyYW1ldGVyIHZlcnN0ZWhlIGljaCBuaWNodC4gRW50d2VkZXIgZ2FyIG5pY2h0cywgXCJsaXN0ZVwiXG5cCitcInJ1YnJpa2VuXCIsIG9kZXIgTmFtZSBiencuIE51bW1lciBlaW5lciBSdWJyaWsuXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBjdXJncj1tZW1iZXIoZ3JvdXBzLEdST1VQKTsKKyAgICBzdGFydD1jdXJncitucmdyb3VwczsKKyAgfQorICBpZiAoIXBvaW50ZXJwKG1lc3NhZ2VzPU5FV1NTRVJWRVItPkdldE5vdGVzKEdST1VQKSkpeworICAgIEdST1VQPURFRkFVTFRHUk9VUDsKKyAgICBpZiAoIXBvaW50ZXJwKG1lc3NhZ2VzPU5FV1NTRVJWRVItPkdldE5vdGVzKEdST1VQKSkpCisgICAgcmV0dXJuIG5vdGlmeV9mYWlsKCJTZWx0c2FtLCBpcmdlbmR3aWUgZ2VodCBoaWVyIGVpbmlnZXMgc2NoaWVmLi4uXG4iKSwwOworICB9CisgIHRpbWVvdXQ9cmVhZF91bnRpbFtHUk9VUF07CisgIGN1cm1zZz0wOworICBzb2c9c2l6ZW9mKG1lc3NhZ2VzKTsKKyAgd2hpbGUgKGN1cmdyPHN0YXJ0KSB7CisgICAgKytjdXJtc2c7CisgICAgaWYgKGN1cm1zZz5zb2cpIHsKKyAgICAgIGlmIChkZWFkVElEKQorICAgICAgICByZWFkX3VudGlsW0lHTk9SRUdST1VQXVtHUk9VUF09CisgICAgICAgICAgbV9jb3B5X2RlbGV0ZShyZWFkX3VudGlsW0lHTk9SRUdST1VQXVtHUk9VUF0sZGVhZFRJRCk7CisgICAgICArK2N1cmdyOworICAgICAgZGVhZFRJRD0wOworICAgICAgaWYgKG1vZGUhPU1fUkVBREdSKSB7CisgICAgICAgIEdST1VQPWdyb3Vwc1tjdXJnciVucmdyb3Vwc107CisgICAgICAgIHRpbWVvdXQ9cmVhZF91bnRpbFtHUk9VUF07CisgICAgICAgIGlmICghdGltZW91dCkgcmVhZF91bnRpbFtHUk9VUF09MTsgIC8vIE5pbW0gbmV1ZSBHcnVwcGVuIGluIExpc3RlIGF1ZgorICAgICAgICBpZiAodGltZW91dDwwIHx8IHRpbWVvdXQ+PU5FV1NTRVJWRVItPkdldE5ld3NUaW1lKEdST1VQKSkgeworICAgICAgICAgIHNvZz0wOyAgICAvKiBVZWJlcmxpc3R1bmc6IEdydXBwZSBoYXQgbml4IG5ldWVzIG9kZXIgKi8KKyAgICAgICAgICBjdXJtc2c9MTsgLyogaXN0IHVuc3Vic2NyaWJlZCAqLworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIG1lc3NhZ2VzPU5FV1NTRVJWRVItPkdldE5vdGVzKEdST1VQKTsKKyAgICAgICAgICBjdXJtc2c9MDsKKyAgICAgICAgICBzb2c9c2l6ZW9mKG1lc3NhZ2VzKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoKHRpbWVvdXQ+PTAgfHwgbW9kZT09TV9SRUFER1IpICYmIG1lc3NhZ2VzW2N1cm1zZy0xXVtNX1RJTUVdID4gYWJzKHRpbWVvdXQpKSB7CisgICAgICAgIGlmIChwb2ludGVycCh0aGlzX3BsYXllcigpLT5RdWVyeVByb3AoUF9JR05PUkUpKSAmJgorICAgICAgICAgICAgbWVtYmVyKHRoaXNfcGxheWVyKCktPlF1ZXJ5UHJvcChQX0lHTk9SRSksCisgICAgICAgICAgICAgICAgICAgbG93ZXJfY2FzZShtZXNzYWdlc1tjdXJtc2ctMV1bTV9XUklURVJdKSsiLm5ld3MiKSAhPSAtMSkgeworICAgICAgICAgIHByaW50ZigiVWViZXJnZWhlIGlnbm9yaWVydGVuIEFydGlrZWwgJWQgdm9uICVzIGluIFJ1YnJpayAlcy5cbiIsCisgICAgICAgICAgICAgICAgIGN1cm1zZyxtZXNzYWdlc1tjdXJtc2ctMV1bTV9XUklURVJdLEdST1VQKTsKKyAgICAgICAgICByZWFkX3VudGlsW0dST1VQXT1tZXNzYWdlc1tjdXJtc2ctMV1bTV9USU1FXTsKKyAgICAgICAgICBpZiAoVFApIFRQLT5TZXRQcm9wKFBfUkVBRF9ORVdTLHJlYWRfdW50aWwpOworICAgICAgICB9IGVsc2UgaWYgCisgICAgICAgICAgKHJlYWRfdW50aWxbSUdOT1JFR1JPVVBdJiYKKyAgICAgICAgICAgcmVhZF91bnRpbFtJR05PUkVHUk9VUF1bR1JPVVBdJiYKKyAgICAgICAgICAgQ2hlY2tUaHJlYWRzKEdST1VQLG1lc3NhZ2VzWzBdW01fVElNRV0pJiYgLyogVG90ZSB0aHJlYWRzIHdlZyAqLworICAgICAgICAgICByZWFkX3VudGlsW0lHTk9SRUdST1VQXVtHUk9VUF1bR2V0VElEKG1lc3NhZ2VzW2N1cm1zZy0xXSldKSB7CisgICAgICAgICAgICBwcmludGYoIlVlYmVyZ2VoZSBBcnRpa2VsICVkIGF1cyBpZ25vcmllcnRlbSBUaHJlYWQuXG4iLGN1cm1zZyk7CisgICAgICAgICAgICByZWFkX3VudGlsW0lHTk9SRUdST1VQXVtHUk9VUF1bR2V0VElEKG1lc3NhZ2VzW2N1cm1zZy0xXSldPQorICAgICAgICAgICAgICBtZXNzYWdlc1tjdXJtc2ctMV1bTV9USU1FXTsKKyAgICAgICAgICAgIGlmIChkZWFkVElEJiZkZWFkVElEPT1HZXRUSUQobWVzc2FnZXNbY3VybXNnLTFdKSkgZGVhZFRJRD0wOworICAgICAgICAgICAgcmVhZF91bnRpbFtHUk9VUF09bWVzc2FnZXNbY3VybXNnLTFdW01fVElNRV07CisgICAgICAgICAgICBpZiAoVFApIFRQLT5TZXRQcm9wKFBfUkVBRF9ORVdTLHJlYWRfdW50aWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHdyaXRlKCJcblJ1YnJpayAiKyhjdXJnciVucmdyb3VwcysxKSsiOiAiK0dST1VQKyIsIEFydGlrZWw6ICIrY3VybXNnKyIgdm9uICIrc29nKyJcbiIpOworICAgICAgICAgIGlmIChtb2RlPT1NX0xJU1RORVcpIHsKKyAgICAgICAgICAgIHdyaXRlKHNwcmludGYoIiAgJS00NXMgWyUtMTFzXSAlc1xuIixtZXNzYWdlc1tjdXJtc2ctMV1bTV9USVRMRV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzW2N1cm1zZy0xXVtNX1dSSVRFUl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGR0aW1lKG1lc3NhZ2VzW2N1cm1zZy0xXVtNX1RJTUVdKVs1Li4xNl0pKTsKKyAgICAgICAgICB9IGVsc2UgeyAvKiBtb2RlID09IE1fUkVBRE5FWFQgfHwgbW9kZT09TV9SRUFER1IgKi8KKyAgICAgICAgICAgIGlmICh0aW1lb3V0Pj0wKSByZWFkX3VudGlsW0dST1VQXT1tZXNzYWdlc1tjdXJtc2ctMV1bTV9USU1FXTsKKyAgICAgICAgICAgIGVsc2UgcmVhZF91bnRpbFtHUk9VUF09LW1lc3NhZ2VzW2N1cm1zZy0xXVtNX1RJTUVdOworICAgICAgICAgICAgaWYgKFRQKSBUUC0+U2V0UHJvcChQX1JFQURfTkVXUyxyZWFkX3VudGlsKTsKKyAgICAgICAgICAgIHJldHVybiAobGllcygiIitjdXJtc2cpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIHNvbnN0IG1hY2ggZWluZmFjaCBnYXJuaXguIFNjaGxlaWZlIGxhZXVmdCB3ZWl0ZXIuICovCisgICAgfQorICB9CisgIHN3aXRjaChtb2RlKSB7CisgICAgY2FzZSBNX0xJU1RORVc6ICByZXR1cm4gMTsKKyAgICBjYXNlIE1fUkVBRE5FWFQ6IHdyaXRlKChyZWFkX3VudGlsW05OQURXTVNHXXx8Ik5peCBOZXVlcyBhdWYgZGVyIFdlbHQuIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsiXG4iKTsgYnJlYWs7CisgICAgY2FzZSBNX1JFQURHUjogICB3cml0ZSgiTml4IE5ldWVzIGluIGRpZXNlciBSdWJyaWsuXG4iKTsgYnJlYWs7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIFNldE5OQURXTVNHKHN0cikgeworICBpZiAoc3RyPT0iPyJ8fHN0cj09Ii0/IikgcmV0dXJuCisgICAgd3JpdGUoIlN5bnRheDogemVpdHVuZ3NtZWxkdW5nIDxuZXVlIE1lbGR1bmc+ICAgIHNldHp0IE1lbGR1bmdcbiIKKyAgICAgICAgICAiICAgICAgICB6ZWl0dW5nc21lbGR1bmcgICAgICAgICAgICAgICAgICAgbG9lc2NodCBNZWxkdW5nXG4iKSwxOworICBpZiAoIXJlYWRfdW50aWxbTk5BRFdNU0ddKSB7CisgICAgd3JpdGUoIkR1IGhhc3QgenVyIFplaXQga2VpbmUgZWlnZW5lIE5OQURXLU1lbGR1bmcgZGVmaW5pZXJ0LlxuIik7CisgICAgaWYgKCFzdHIpIHJldHVybiAxOworICB9CisgIGVsc2Ugd3JpdGUoIkRlaW5lIGFsdGUgTk5BRFctTWVsZHVuZyB3YXI6XG4iK3JlYWRfdW50aWxbTk5BRFdNU0ddKyJcbiIpOworICBpZiAoIXN0cikgeworICAgIHJlYWRfdW50aWw9bV9jb3B5X2RlbGV0ZShyZWFkX3VudGlsLE5OQURXTVNHKTsKKyAgICB3cml0ZSgiTWVsZHVuZyBpc3QgZ2Vsb2VzY2h0LCBlcyBnaWx0IHdpZWRlciBkaWUgU3RhbmRhcmRtZWxkdW5nLlxuIik7CisgIH0gZWxzZSB7CisgICAgcmVhZF91bnRpbFtOTkFEV01TR109dGhpc19wbGF5ZXIoKS0+X3VucGFyc2VkX2FyZ3MoKTsKKyAgICB3cml0ZSgiRGVpbmUgbmV1ZSBNZWxkdW5nIGxhdXRldCBqZXR6dDpcbiIrcmVhZF91bnRpbFtOTkFEV01TR10rIlxuIik7CisgIH0KKyAgaWYgKFRQKSBUUC0+U2V0UHJvcChQX1JFQURfTkVXUyxyZWFkX3VudGlsKTsKKyAgcmV0dXJuIDE7Cit9ICAgIAorCit2YXJhcmdzIGludCBJbnRlcnByZXRUaW1lKG1peGVkIGEsaW50IGZsYWcpIHsKKyAgLy8gc3RyaW5nIG9kZXIgc3RyaW5nICoKKyAgLy8gYWt6ZXB0aWVydCBmb2xnZW5kZSBGb3JtYXRlOgorICAvLyAgIGRkLm1tLmpqICAgICAoUnVlY2tnYWJlOiAwOjAwIGRlcyBlbnRzcHJlY2hlbmRlbiBUYWdlcykKKyAgLy8gICB2b3IgWzxhbno+IGR8dGFnZW5dIFs8YW56PiBofHN0dW5kZW5dIFs8YW56PiBtfG1pbnV0ZW5dCisgIC8vIGZsYWc9MTogImlua2x1c2l2ZSI6IGJlaSBkZC5tbS5qai1Gb3JtYXQgMjM6NTk6NTkgc3RhdHQgMDowMCBVaHIKKworICBpbnQgaSxqLGssdCxucmFyZ3M7CisgIHN0cmluZyBzOworICBpZiAoc3RyaW5ncChhKSkgYT1leHBsb2RlKGEsIiAiKTsKKworLy8gIHByaW50ZigiJU9cbiIsYSk7CisKKyAgaWYgKChucmFyZ3M9c3NjYW5mKGFbMF0sIiVkLiVkLiVkIixpLGosaykpPT0zIHx8IAorICAgICAgKG5yYXJncz1zc2NhbmYoYVswXSwiJWQuJWQuIixpLGopKT09MikgeworICAgIC8vIERhdHVtIC0+IFplaXQ6IEZ1bmt0aW9uaWVydCBpbSBaZWl0cmF1bSAxOTczIC0gY2EuIDIwOTAKKyAgICAvLyAgICAgICAgICAgICAgICBpbiBaZWl0em9uZW4gbWl0IGdhbnplbiBTdHVuZGVuIGdndWUgUmVjaG5lcnVoci4KKyAgICBpZiAobnJhcmdzPT0yKSAKKyAgICAgIGs9NzArdGltZSgpLzMxNTM2MDAwOworICAgIGlmIChrPDcwKSBrKz0xMDA7CisgICAgaWYgKGs+MTk3MCkgay09MTkwMDsKKyAgICBpZiAoazw3MHx8az4xNTApIHJldHVybgorICAgICAgd3JpdGUoIlVuenVsYWVzc2lnZXMgSmFociAoZXJsYXVidDogNzAtaGV1dGUpLlxuIiksMDsKKyAgICB0PShrLTcwKSozMTUzNjAwMDsKKworICAgIGlmIChpPDF8fGk+MzEpIHJldHVybiB3cml0ZSgiVW56dWxhZXNzaWdlciBUYWcgKGVybGF1YnQ6IDEtMzEpLlxuIiksMDsKKyAgICBpZiAoajwxfHxqPjEyKSByZXR1cm4gd3JpdGUoIlVuenVsYWVzc2lnZXIgTW9uYXQgKGVybGF1YnQ6IDEtMTIpLlxuIiksMDsKKy8vICAgIHByaW50ZigiJWQuJWQuJWRcbiIsaSxqLGspOworICAgIHM9Y3RpbWUodCk7CisgICAgaWYgKChqPjIpICYmICEoayU0KSkgdCs9ODY0MDA7ICAgIC8vIFNjaGFsdGphaHJrb3JyZWt0dXIgZnVlciBNb25hdGU+PTMKKyAgICB0Kz0oeyAgICAgICAgMCwgIDI2Nzg0MDAsICA1MDk3NjAwLCAgNzc3NjAwMCwKKyAgICAgICAgICAxMDM2ODAwMCwgMTMwNDY0MDAsIDE1NjM4NDAwLCAxODMxNjgwMCwKKyAgICAgICAgICAyMDk5NTIwMCwgMjM1ODcyMDAsIDI2MjY1NjAwLCAyODg1NzYwMH0pW2otMV07CisgICAgdCs9ODY0MDAqKGktMSk7CisgICAgdCs9ODY0MDAqKDMyLXRvX2ludChzWzguLjldKSk7ICAvLyBTY2hhbHRqYWhya29ycmVrdHVyCisgICAgdC09MzYwMCp0b19pbnQoc1sxMS4uMTJdKTsgICAgICAvLyBaZWl0em9uZW5rb3JyZWt0dXIKKyAgICB0LT0zNjAwKnRvX2ludChjdGltZSh0KVsxMS4uMTJdKTsgICAgICAvLyBTb21tZXJ6ZWl0a29ycmVrdHVyCisvLyAgICB3cml0ZSgiS29udHJvbGxlOiAiK2R0aW1lKHQpKyJcbiIpOworICAgIGlmIChucmFyZ3M9PTIgJiYgdD50aW1lKCkpIHQtPTMxNTM2MDAwOworICAgIHJldHVybiAoZmxhZz90Kzg2Mzk5OnQpOworICB9CisKKyAgdD0wOworICBpZiAoYVswXT09InZvciIpIGZvciAoaT1zaXplb2YoYSktMTtpPjA7aS0tKSB7CisgICAgc3dpdGNoIChhW2ldKSB7CisgICAgY2FzZSAibSI6IAorICAgIGNhc2UgIm1pbnV0ZW4iOiAKKyAgICBjYXNlICJtaW4iOiAKKyAgICBjYXNlICJtaW51dGUiOgorICAgICAgdCs9NjAqdG9faW50KGFbaS0xXSk7CisgICAgICBicmVhazsKKyAgICBjYXNlICJoIjogCisgICAgY2FzZSAic3R1bmRlIjogCisgICAgY2FzZSAic3R1bmRlbiI6IAorICAgIGNhc2UgInMiOgorICAgICAgdCs9MzYwMCp0b19pbnQoYVtpLTFdKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgImQiOiAKKyAgICBjYXNlICJ0YWciOiAKKyAgICBjYXNlICJ0YWdlIjogCisgICAgY2FzZSAidCI6CisgICAgICB0Kz04NjQwMCp0b19pbnQoYVtpLTFdKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6IAorICAgICAgaWYgKCF0b19pbnQoYVtpXSkpCisgICAgICAgIHdyaXRlKCJBcmd1bWVudGZlaGxlcjogS2FubiBuaWNodHMgbWl0ICciK2FbaV0rIicgYW5mYW5nZW4uXG4iKTsKKyAgICB9CisgICAgcmV0dXJuIHRpbWUoKS10OworICB9CisgIGVsc2UgcmV0dXJuIHdyaXRlKCJBcmd1bWVudGZlaGxlci5cbiIpLDA7Cit9CisKK3N0YXRpYyBDYXRjaHVwKHN0cmluZyBzdHIpCit7CisgIGludCB3ZWxjaGUsemVpdCxpOworICBzdHJpbmcgZ3I7CisgIG1peGVkIGdyb3VwcyxuZXdzLGFyZ3M7CisKKyAgaWYgKCFwb2ludGVycChORVdTU0VSVkVSLT5HZXROb3RlcyhHUk9VUCkpKQorICAgIHJldHVybiBub3RpZnlfZmFpbCgiU2VsdHNhbSwgZGllIFJ1YnJpayAnIitHUk9VUCsKKyAgICAgICAgIicgZ2lidCBlcyBuaWNodCBtZWhyLi4uXG4iKSwgMDsKKworICBzdHI9dGhpc19wbGF5ZXIoKS0+X3VucGFyc2VkX2FyZ3MoKTsgICAvLyB3Zy4gRGF0dW0KKyAgaWYgKHN0cikgc3RyPWxvd2VyX2Nhc2Uoc3RyKTsKKyAgZWxzZSBzdHI9R1JPVVA7IC8vIGRlZmF1bHQ6IGFrdHVlbGxlIFJ1YnJpayBrb21wbGV0dC4KKworICBpZiAoc3RyPT0iPyJ8fCBzdHI9PSItPyIpIHJldHVybiBDYXRjaHVwU3ludGF4KCk7CisKKyAgLy8gdWViZXJnZWhlIEFudHdvcnRlbiAoVGhyZWFkIGlnbm9yaWVyZW4pCisgIGlmIChzdHImJihzdHJbMC4uNl09PSJhbnR3b3J0Inx8c3RyPT0idGhyZWFkIikpIHsKKyAgICBpZiAoIXBvaW50ZXJwKGxhc3R0aXRsZSkpIHJldHVybiAKKyAgICAgIHdyaXRlKCJEdSBoYXN0IGJpc2hlciBub2NoIGtlaW5lbiBBcnRpa2VsIGdlbGVzZW4sIGRhbWl0IGthbm4gaWNoIG5pY2h0IHdpc3NlbixcbndlbGNoZW4gVGhyZWFkIGR1IHVlYmVyZ2VoZW4gd2lsbHN0LlxuIiksMTsKKyAgICBpZiAoIXJlYWRfdW50aWxbSUdOT1JFR1JPVVBdKSByZWFkX3VudGlsW0lHTk9SRUdST1VQXT0oW10pOworICAgIGlmICghcmVhZF91bnRpbFtJR05PUkVHUk9VUF1bR1JPVVBdKSByZWFkX3VudGlsW0lHTk9SRUdST1VQXVtHUk9VUF09KFtdKTsKKyAgICBpZiAocmVhZF91bnRpbFtJR05PUkVHUk9VUF1bR1JPVVBdW2xhc3R0aXRsZVszXV0pIHsKKyAgICAgIHJlYWRfdW50aWxbSUdOT1JFR1JPVVBdW0dST1VQXT1tX2NvcHlfZGVsZXRlKHJlYWRfdW50aWxbSUdOT1JFR1JPVVBdW0dST1VQXSxsYXN0dGl0bGVbM10pOworICAgICAgd3JpdGUoIkRpZXNlciBUaHJlYWQgd2lyZCBqZXR6dCBuaWNodCBtZWhyIHVlYmVyZ2FuZ2VuLlxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlYWRfdW50aWxbSUdOT1JFR1JPVVBdW0dST1VQXVtsYXN0dGl0bGVbM11dPWxhc3R0aXRsZVsyXTsKKyAgICAgIHdyaXRlKCJEaWVzZXIgVGhyZWFkIHdpcmQgYWIgc29mb3J0IHVlYmVyZ2FuZ2VuLlxuRmFsbHMgZGFzIGVpbiBJcnJ0dW0gd2FyLCB3aWVkZXJob2xlIGRlbiBCZWZlaGwgYXVnZW5ibGlja2xpY2guXG4iKTsKKyAgICB9CisgICAgaWYgKFRQKSBUUC0+U2V0UHJvcChQX1JFQURfTkVXUyxyZWFkX3VudGlsKTsKKyAgICByZXR1cm4gMTsKKyAgfSAgICAKKworICBncm91cHM9TkVXU1NFUlZFUi0+R2V0R3JvdXBzKCk7CisKKyAgYXJncz1leHBsb2RlKHN0ciwiICIpOworCisgIC8vIFVlYmVyZ2VoZSBhbGxlcworCisgIGlmIChhcmdzWzBdPT0iYWxsZSIgfHwgYXJnc1swXT09ImFsbGVzIiB8fCBhcmdzWzBdPT0iYWxsIikgeworICAgIGlmIChzaXplb2YoYXJncyk8PTEpIHplaXQ9dGltZSgpLTE7CisgICAgZWxzZSBpZiAoYXJnc1sxXSE9ImJpcyIpIHJldHVybiBDYXRjaHVwU3ludGF4KCk7CisgICAgZWxzZSBpZiAoc2l6ZW9mKGFyZ3MpPDMpIHJldHVybiBDYXRjaHVwU3ludGF4KCk7CisKKyAgICBlbHNlIHplaXQ9SW50ZXJwcmV0VGltZShhcmdzWzIuLl0sMSk7CisgICAgaWYgKHplaXQ+dGltZSgpKSB6ZWl0PXRpbWUoKS0xOworICAgIHdyaXRlKCJVZWJlcmdlaGUgYWxsZSBSdWJyaWtlbiBiaXMgIitkdGltZSh6ZWl0KSsiLlxuIik7CisgICAgZm9yICh3ZWxjaGU9MDt3ZWxjaGU8c2l6ZW9mKGdyb3Vwcyk7Kyt3ZWxjaGUpIHsKKyAgICAgIGdyPWdyb3Vwc1t3ZWxjaGVdOworLy8gICAgICB6ZWl0PU5FV1NTRVJWRVItPkdldE5ld3NUaW1lKGdyKTsKKyAgICAgIGlmIChhYnMocmVhZF91bnRpbFtncl0pPHplaXQpIAorICAgICAgICByZWFkX3VudGlsW2dyXT0ocmVhZF91bnRpbFtncl0+PTApP3plaXQ6LXplaXQ7CisgICAgICBpZiAoVFApIFRQLT5TZXRQcm9wKFBfUkVBRF9ORVdTLHJlYWRfdW50aWwpOworICAgIH0KKyAgICByZXR1cm4gMTsKKyAgfQorCisgIC8vIEFuemFobCBBcnRpa2VsCisgIAorICBpZiAoc2l6ZW9mKGFyZ3MpPj0yICYmIGFyZ3NbMV09PSJhcnRpa2VsIikgeworICAgIGlmICghdG9faW50KGFyZ3NbMF0pKSByZXR1cm4gQ2F0Y2h1cFN5bnRheCgpOworICAgIG5ld3M9TkVXU1NFUlZFUi0+R2V0Tm90ZXMoR1JPVVApOworICAgIGZvciAoaT1zaXplb2YobmV3cyktMTtpPj0wJiZuZXdzW2ldW01fVElNRV0+cmVhZF91bnRpbFtHUk9VUF07aS0tKTsKKyAgICB3ZWxjaGU9aSt0b19pbnQoYXJnc1swXSk7CisgICAgaWYgKHdlbGNoZT49c2l6ZW9mKG5ld3MpKSB3ZWxjaGU9c2l6ZW9mKG5ld3MpLTE7CisgICAgd3JpdGUoIlVlYmVyZ2VoZSBkaWUgbmFlY2hzdGVuICIrKHdlbGNoZS1pKSsiIEFydGlrZWwgaW4gUnVicmlrICIrCisgICAgICAgIEdST1VQKyJcbi4iKTsKKyAgICBpZiAod2VsY2hlPj0wKSB7CisgICAgICB6ZWl0PW5ld3Nbd2VsY2hlXVtNX1RJTUVdOworICAgICAgcmVhZF91bnRpbFtHUk9VUF09KHJlYWRfdW50aWxbR1JPVVBdPj0wKT96ZWl0Oi16ZWl0OworICAgICAgaWYgKFRQKSBUUC0+U2V0UHJvcChQX1JFQURfTkVXUyxyZWFkX3VudGlsKTsKKyAgICB9CisgICAgcmV0dXJuIDE7CisgIH0KKworICAvLyBlaW56ZWxuZSBSdWJyaWsuCisKKyAgaWYgKCEoZ3I9R2V0R3JvdXBOYW1lKGFyZ3NbMF0pKSkgcmV0dXJuIDE7CisgIG5ld3M9TkVXU1NFUlZFUi0+R2V0Tm90ZXMoZ3IpOworICBpZiAoIXNpemVvZihuZXdzKSkgeworICAgIHdyaXRlKCJSdWJyaWsgIitncisiIGlzdCBsZWVyLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKy8vICB6ZWl0PW5ld3Nbc2l6ZW9mKG5ld3MpLTFdW01fVElNRV07CisgIGlmIChzaXplb2YoYXJncyk8PTEpCisgICAgemVpdD10aW1lKCk7CisgIGVsc2UKKyAgICBpZiAoYXJnc1sxXSE9ImJpcyIpIHJldHVybiBDYXRjaHVwU3ludGF4KCk7CisgIGVsc2UgCisgICAgemVpdD1JbnRlcnByZXRUaW1lKGFyZ3NbMi4uXSwxKTsKKyAgaWYgKHplaXQ+dGltZSgpKSB6ZWl0PXRpbWUoKTsKKyAgcmVhZF91bnRpbFtncl09emVpdDsKKyAgaWYgKFRQKSBUUC0+U2V0UHJvcChQX1JFQURfTkVXUyxyZWFkX3VudGlsKTsKKyAgd3JpdGUoIlVlYmVyZ2VoZSAiK2dyKyIgYmlzICIrZHRpbWUoemVpdCkrIixcbmxldHp0ZXIgQXJ0aWtlbCB3YXIgdm9tICIrCisgICAgICBkdGltZShORVdTU0VSVkVSLT5HZXROZXdzVGltZShncikpKyJcbiIpOworICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgSWdub3JlKHN0cikgeworICBpZiAoc3RyPT0idGhyZWFkInx8c3RyPT0iYW50d29ydGVuIikgcmV0dXJuIENhdGNodXAoc3RyKTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBDYXRjaHVwU3ludGF4KCkgeworICB3cml0ZSgiU3ludGF4IGRlcyBCZWZlaGxzIHVlYmVyZ2VoZSAob2RlciBjYXRjaHVwKTpcbiIKKyAgICAgICAgIiAgdWViZXJnZWhlIFtydWJyaWtdICAgICAgICAgICAgICAoZGVmYXVsdDogYWt0dWVsbGUgUnVicmlrKVxuIgorICAgICAgICAiICB1ZWJlcmdlaGUgYWxsZXMgICAgICAgICAgICAgICAgIChpbiBhbGxlbiBSdWJyaWtlbilcbiIKKyAgICAgICAgIiAgdWViZXJnZWhlIDxhbno+IGFydGlrZWwgICAgICAgICAoaW4gYWt0LiBSdWJyaWspXG4iCisgICAgICAgICIgIHVlYmVyZ2VoZSBbcnVicmlrXXxhbGxlcyBiaXMgPHRhZz4uPG1vbmF0Pi5bPGphaHI+XVxuIgorICAgICAgICAiICB1ZWJlcmdlaGUgW3J1YnJpa118YWxsZXMgYmlzIHZvciA8emVpdD4gICAgICAgIHdvYmVpXG4iCisgICAgICAgICIgICAgICA8emVpdD4gPSBbPG4+IGR8dGFnZV0gWzxuPiBofHN0dW5kZW5dIFs8bj4gbXxtaW58bWludXRlbl1cbiIKKyAgICAgICAgIiAgdWViZXJnZWhlIHRocmVhZHxhbnR3b3J0ZW4gICAgICAoZW50c3ByLiAnaWdub3JpZXJlIHRocmVhZCcpXG4iKTsKKworICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IFVuY2F0Y2h1cFN5bnRheCgpCit7CisgIG5vdGlmeV9mYWlsKAorICAgICJTeW50YXg6IHdpZWRlcmhvbGUgPGFuej4gW2FydGlrZWxdXG4iCisgICAgIiAgICAgICAgd2llZGVyaG9sZSBbYWIgdm9yXSBbPGFuej4gbXxtaW51dGVbbl1dIFs8YW56PiBofHN0dW5kZVtuXV0gWzxhbno+IGR8dGFnW2VdXVxuIgorICAgICIgICAgICAgIHdpZWRlcmhvbGUgYWIgdGFnLm1vbmF0Wy5qYWhyXVxuIgorICAgICIgICAgICAgIHdpZWRlcmhvbGUgYWxsZXNcbiIKKyAgICAiRGVyIHdpZWRlcmhvbGUtIG9kZXIgdW5jYXRjaHVwLUJlZmVobCBiZXppZWh0IHNpY2ggaW1tZXIgYXVmIGRpZSBha3R1ZWxsZVxuIgorICAgICJSdWJyaWsgdW5kIG1hcmtpZXJ0IGRpZSBhbmdlZ2ViZW5lbiBBcnRpa2VsIHdpZWRlciBhbHMgdW5nZWxlc2VuLlxuIgorICAgICJaZWl0ZW4gKDIuIFN5bnRheCkgc2luZCBydWVja3dhZXJ0cyBhYiBha3R1ZWxsZXIgVWhyemVpdCBnZXJlY2huZXQuXG4iKSwwOworICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgVW5jYXRjaHVwKHN0cmluZyBzdHIpCit7CisgIG1peGVkIGFyZ3M7CisgIGludCBpLHplaXQ7CisgIGludCBtb2RlOyAvLyAwID0gbml4LCAxPUFuemFobCBBcnRpa2VsLCAyPVplaXQsIDM9YWxsZXMKKworICBzdHI9dGhpc19wbGF5ZXIoKS0+X3VucGFyc2VkX2FyZ3MoKTsgICAvLyB3Zy4gRGF0dW0KKyAgaWYgKCAhVFAgfHwgIXN0ciB8fCAhc3RyaW5ncChzdHIpIHx8IHN0cj09Ij8iIHx8IHN0cj09Ii0/IiApCisgICAgcmV0dXJuIFVuY2F0Y2h1cFN5bnRheCgpOworCisgIGlmICghcG9pbnRlcnAoTkVXU1NFUlZFUi0+R2V0Tm90ZXMoR1JPVVApKSkKKyAgICByZXR1cm4gbm90aWZ5X2ZhaWwoIlNlbHRzYW0sIGRpZSBSdWJyaWsgJyIrR1JPVVArCisgICAgICAgICInIGdpYnQgZXMgbmljaHQgbWVoci4uLlxuIiksIDA7CisKKyAgYXJncz0oeyIifSkrZXhwbG9kZShsb3dlcl9jYXNlKHN0ciksIiAiKTsKKyAgaWYgKGFyZ3NbMV09PSJhYiIpIHsKKyAgICBtb2RlPTI7CisgICAgaWYgKHNpemVvZihhcmdzKTwzKQorICAgICAgcmV0dXJuIFVuY2F0Y2h1cFN5bnRheCgpOworICAgIHplaXQ9SW50ZXJwcmV0VGltZShhcmdzWzIuLl0pOworICB9IGVsc2UgeworICAgIHplaXQ9dGltZSgpOworICAgIGZvciAoaT1zaXplb2YoYXJncyktMTtpPjA7aS0tKSB7CisgICAgICBzd2l0Y2goYXJnc1tpXSl7CisgICAgICBjYXNlICJhbGxlcyI6CisgICAgICBjYXNlICJhbGxlIjoKKyAgICAgIGNhc2UgImFsbCI6CisgICAgICAgIGlmIChtb2RlJiZtb2RlIT0zKSByZXR1cm4KKyAgICAgICAgICBub3RpZnlfZmFpbCgiQml0dGUgbnVyIFplaXQgT0RFUiBhbGxlcyBPREVSIEFuemFobCBhbmdlYmVuIVxuIiksMDsKKyAgICAgICAgbW9kZT0zOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgIm1pbnV0ZW4iOgorICAgICAgY2FzZSAibWludXRlIjoKKyAgICAgIGNhc2UgIm0iOgorICAgICAgY2FzZSAic3R1bmRlbiI6CisgICAgICBjYXNlICJzdHVuZGUiOgorICAgICAgY2FzZSAiaCI6CisgICAgICBjYXNlICJ0YWdlIjoKKyAgICAgIGNhc2UgInRhZyI6CisgICAgICBjYXNlICJkIjoKKyAgICAgICAgaWYgKG1vZGUmJm1vZGUhPTIpIHJldHVybgorICAgICAgICAgIG5vdGlmeV9mYWlsKCJCaXR0ZSBudXIgWmVpdC9EYXR1bSBPREVSIGFsbGVzIE9ERVIgIgorICAgICAgICAgICAgICAiQW56YWhsIGFuZ2ViZW4hXG4iKSwwOworICAgICAgICBtb2RlPTI7CisgICAgICAgIHplaXQtPSgoKGFyZ3NbaV1bMF09PSdtJykgPyA2MCA6CisgICAgICAgICAgICAgICAgKChhcmdzW2ldWzBdPT0ncycgfHwgYXJnc1tpXVswXT09J2gnKSA/IDM2MDAgOiA4NjQwMCkpCisgICAgICAgICAgICAgICAqdG9faW50KGFyZ3NbaS0xXSkpOworICAgICAgICBpLS07CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAiYXJ0aWtlbCI6CisgICAgICAgIGlmIChtb2RlJiZtb2RlIT0xKSByZXR1cm4gCisgICAgICAgICAgbm90aWZ5X2ZhaWwoIkJpdHRlIG51ciBaZWl0L0RhdHVtIE9ERVIgYWxsZXMgT0RFUiAiCisgICAgICAgICAgICAgICJBbnphaGwgYW5nZWJlbiFcbiIpLDA7CisgICAgICAgIG1vZGU9MTsKKyAgICAgICAgemVpdD10b19pbnQoYXJnc1tpLTFdKTsKKyAgICAgICAgaS0tOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgImFiIjoKKyAgICAgICAgcmV0dXJuIAorICAgICAgICAgIG5vdGlmeV9mYWlsKCJCaXR0ZSBudXIgWmVpdC9EYXR1bSBPREVSIGFsbGVzIE9ERVIgIgorICAgICAgICAgICAgICAiQW56YWhsIGFuZ2ViZW4hXG4iKSwwOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKCF0b19pbnQoYXJnc1tpXSkpIAorICAgICAgICAgIHJldHVybiBub3RpZnlfZmFpbCgiVW5iZWthbm50ZXMgQXJndW1lbnQgJyIrYXJnc1tpXSsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIichIEFrdGlvbiBhYmdlYnJvY2hlbi5cbiIpLDA7CisgICAgICAgIGlmIChtb2RlJiZtb2RlIT0xKSByZXR1cm4gCisgICAgICAgICAgbm90aWZ5X2ZhaWwoIkJpdHRlIG51ciBaZWl0L0RhdHVtIE9ERVIgYWxsZXMgT0RFUiAiCisgICAgICAgICAgICAgICJBbnphaGwgYW5nZWJlbiFcbiIpLDA7CisgICAgICAgIG1vZGU9MTsKKyAgICAgICAgemVpdD10b19pbnQoYXJnc1tpXSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgc3dpdGNoKG1vZGUpeworICBjYXNlIDA6CisgICAgcmV0dXJuIG5vdGlmeV9mYWlsKCJHaWIgYml0dGUgaXJnZW5kZWluZSBFaW5oZWl0IGFuICIKKyAgICAgICAgIihIaWxmZSBtaXQgd2llZGVyaG9sZSAtPykhXG4iKTsKKyAgY2FzZSAyOgorICAgIHJlYWRfdW50aWxbR1JPVVBdPShyZWFkX3VudGlsW0dST1VQXT49MCk/emVpdDotemVpdDsKKyAgICB3cml0ZShicmVha19zdHJpbmcoIk1hcmtpZXJlIGFsbGUgQXJ0aWtlbCBpbiBSdWJyaWsgIitHUk9VUCsKKyAgICAgICAgICAiIHNlaXQgIitkdGltZSh6ZWl0KSsiIGFscyB1bmdlbGVzZW4uXG4iLDc4KSk7CisgICAgYnJlYWs7CisgIGNhc2UgMzoKKyAgICByZWFkX3VudGlsW0dST1VQXT0ocmVhZF91bnRpbFtHUk9VUF0+PTA/MTotMSk7CisgICAgd3JpdGUoIk1hcmtpZXJlIGRpZSBrb21wbGV0dGUgUnVicmlrICIrR1JPVVArIiBhbHMgdW5nZWxlc2VuLlxuIik7CisgICAgYnJlYWs7CisgIGNhc2UgMToKKyAgICB3cml0ZShicmVha19zdHJpbmcoIk1hcmtpZXJlIGRpZSBsZXR6dGVuICIremVpdCsKKyAgICAgICAgICAiIGdlbGVzZW5lbiBBcnRpa2VsIGluIFJ1YnJpayAiK0dST1VQKyIgYWxzIHVuZ2VsZXNlbi5cbiIsNzgpKTsKKyAgICB7IGludCBoOyBtaXhlZCBub3RlczsKKyAgICAgIG5vdGVzPU5FV1NTRVJWRVItPkdldE5vdGVzKEdST1VQKTsKKyAgICAgIGg9c2l6ZW9mKG5vdGVzKS0xOworICAgICAgd2hpbGUgKCAoaD49MCkgJiYgKGFicyhyZWFkX3VudGlsW0dST1VQXSkgPCBub3Rlc1toXVtNX1RJTUVdKSApIHsKKyAgICAgICAgaC0tOworICAgICAgfQorICAgICAgaWYgKGg9PS0xfHxoPHplaXQpCisgICAgICAgIHJlYWRfdW50aWxbR1JPVVBdPQorICAgICAgICAgIChyZWFkX3VudGlsW0dST1VQXT49MCk/MTotMTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmVhZF91bnRpbFtHUk9VUF09KAorICAgICAgICAgIChyZWFkX3VudGlsW0dST1VQXT49MCk/bm90ZXNbaC16ZWl0XVtNX1RJTUVdCisgICAgICAgICAgICA6LW5vdGVzW2gtemVpdF1bTV9USU1FXSk7CisgICAgfQorICB9CisgIHdyaXRlKCJPay4gRHUga2FubnN0IGRpZSBhbHMgdW5nZWxlc2VuIG1hcmtpZXJ0ZW4gQXJ0aWtlbCAiCisgICAgICAibWl0IG5uIG5vY2htYWwgbGVzZW4uXG4iKTsKKyAgCisgIGlmIChUUCkgVFAtPlNldFByb3AoUF9SRUFEX05FV1MscmVhZF91bnRpbCk7CisgIHJldHVybiAxOworfQorCisKK1F1ZXJ5UmVhZCgpIHsgCisgIHJldHVybiByZWFkX3VudGlsOyAKK30KKworc3RhdGljIENhdGNoTmV3c0Vycm9yKGludCBlcnIsc3RyaW5nIHRleHQ0bWludXMzKSB7CisgIHN3aXRjaCAoZXJyKSB7CisgICAgY2FzZSAgMTogcmV0dXJuIDE7CisgICAgY2FzZSAtMTogd3JpdGUoIkR1IGRhcmZzdCBpbiBkaWVzZXIgUnVicmlrIG5pY2h0IHNjaHJlaWJlbiFcbiIpOyByZXR1cm4gMDsKKyAgICBjYXNlIC0yOiB3cml0ZSgiRGllIFJ1YnJpayBnaWJ0IGVzIG5pY2h0IG1laHIsIHNlaHIgc2VsdHNhbS4uLlxuIik7IHJldHVybiAwOworICAgIGNhc2UgLTM6IHdyaXRlKHRleHQ0bWludXMzKyJcbiIpOyByZXR1cm4gMDsKKyAgICBkZWZhdWx0OiB3cml0ZSgiSW50ZXJuZXIgRmVobGVyICIrZXJyKyIsIEVyem1hZ2llciB2ZXJzdGFlbmRpZ2VuIVxuIik7IHJldHVybiAwOworICB9Cit9CisKK3N0YXRpYyB2YXJhcmdzIHNjaHJlaWIoc3RyLHByZXRleHQsY2FsbGVkX2J5X2l0c2VsZixzdGF0dXNsaW5lcykgeworICBpbnQgZXJyOworCisgIGlmIChzdHI9PSI/Inx8c3RyPT0iLT8iKSB7CisgICAgd3JpdGUoIlN5bnRheDogc2NocmVpYiA8VGl0ZWw+XG4iCisgICAgICAgICAgIiAgYmVnaW5udCBlaW5lbiBuZXVlbiBBcnRpa2VsIGluIGRlciBaZWl0dW5nLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgCisgIGlmICghdGhpc19pbnRlcmFjdGl2ZSgpIHx8ICF0aGlzX2ludGVyYWN0aXZlKCktPnF1ZXJ5X3JlYWxfbmFtZSgpKSByZXR1cm4gMDsKKyAgaWYgKCFjYWxsZWRfYnlfaXRzZWxmICYmIGV4dGVybl9jYWxsKCkgJiYgIXByZXRleHQpCisgICAgc3RyPXRoaXNfaW50ZXJhY3RpdmUoKS0+X3VucGFyc2VkX2FyZ3MoKXx8IiI7CisgIGlmIChjYWxsZWRfYnlfaXRzZWxmICYmIHN0cj09In5xIikgeworICAgIHdyaXRlKCJBYmdlYnJvY2hlbi5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIGlmICghQ2F0Y2hOZXdzRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgTkVXU1NFUlZFUi0+QXNrQWxsb3dlZFdyaXRlKEdST1VQKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRGllc2UgUnVicmlrIGlzdCBsZWlkZXIgc2Nob24gcmFuZHZvbGwhIikpIHJldHVybiAxOworICBpZiAoIWNhbGxlZF9ieV9pdHNlbGYpCisgICAgd3JpdGUoIk5ldWVyIEFydGlrZWwgaW4gUnVicmlrICIrR1JPVVArIjpcbiIpOworICBpZiAoIXN0ciB8fCBzdHI9PSIiIHx8IHN0cj09ImFydGlrZWwiKSB7CisgICAgaW5wdXRfdG8oInNjaHJlaWIiLCBJTlBVVF9QUk9NUFQsICJUaXRlbCBkZXMgQXJ0aWtlbHM6ICIsIHByZXRleHQsMSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgLy8gd3JpdGVyPXRoaXNfaW50ZXJhY3RpdmUoKS0+cXVlcnlfcmVhbF9uYW1lKCk7CisgIG1lc3NhZ2U9YWxsb2NhdGUoNik7CisgIG1lc3NhZ2VbTV9CT0FSRF09R1JPVVA7CisgIG1lc3NhZ2VbTV9USVRMRV09a2lsbGN0cmwoc3RyKTsKKyAgbWVzc2FnZVtNX01FU1NBR0VdPXN0YXR1c2xpbmVzOworICB3cml0ZSgiVGl0ZWwgaXN0OiAiK3N0cisiLlxuXAorR2liIGpldHp0IERlaW5lbiBUZXh0IGVpbixcblwKKyoqIG9kZXIgLiB3ZW5uIER1IGZlcnRpZyBiaXN0LCB+cSB6dW0gQWJicmVjaGVuLCB+aCBmdWVyIGVpbmUgSGlsZnNzZWl0ZS5cbiIpOworICBuZWRpdCgiUG9zdE5vdGUiLHByZXRleHQpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIHZhcmFyZ3MgUmVwbHkoc3RyaW5nIHN0cixzdHJpbmcgbmV3dGl0bGUpIHsKKyAgbWl4ZWQgZHVtbXkscmVwbHl0aXRsZSxzOworICBpbnQgbnI7CisKKyAgaWYgKChkdW1teT0oc3RyfHxuZXd0aXRsZSkpPT0iPyJ8fGR1bW15PT0iLT8iKSB7CisgICAgd3JpdGUoIkRlciBBbnR3b3J0ZS1CZWZlaGwgaXN0IGRvcHBlbHQgYmVsZWd0LlxuIgorICAgICAgICAgICIxLiAoWmVpdHVuZyk6IFNjaHJlaWJlIEFudHdvcnQgYXVmIGVpbmVuIEFydGlrZWwgaW4gZGVyIFplaXR1bmcuXG4iCisgICAgICAgICAgIiAgIFN5bnRheDogYW50d29ydGVcbiIKKyAgICAgICAgICAiICAgICAgICAgICBhbnR3b3J0ZSBhdWYgYXJ0aWtlbCA8bnI+IFtuZXVlciBUaXRlbF1cbiIKKyAgICAgICAgICAiICAgICAgICAgICByZXBseSBbYXVmIGFydGlrZWwgPG5yPiB8IHRvIG5vdGUgPG5yPl0gW25ldWVyIFRpdGVsXVxuIgorICAgICAgICAgICIyLiBhZWhubGljaCAnc2FnZSc6XG4iCisgICAgICAgICAgIiAgIER1IHRpcHBzdCB6dW0gQmVpc3BpZWw6XG4iCisgICAgICAgICAgIiAgICAgYW50d29ydGUgamEsIGRhcyB3ZWlzcyBpY2hcbiIKKyAgICAgICAgICAiICAgQWxsZSBTcGllbGVyIGltIFJhdW0gc2VoZW4gZGFubjpcbiIKKyAgICAgICAgICAiICAgICA8RGVpbiBOYW1lPiBhbnR3b3J0ZXQ6IGphLCBkYXMgd2Vpc3MgaWNoLlxuIgorICAgICAgICAgICJCaXR0ZSBiZWFjaHRlLCBkYXNzIGplZGUgU3ludGF4LCBkaWUgYXVmIGRlbiBhbnR3b3J0ZS1CZWZlaGwgZGVyICIKKyAgICAgICAgICAiWmVpdHVuZ1xucGFzc3QsIGF1Y2ggdm9uIGRlciBaZWl0dW5nIGF1c2dld2VydGV0IHdpcmQuXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGlmIChzdHImJgorICAgICAgKChzc2NhbmYobG93ZXJfY2FzZShzdHIpLCJhdWYgYXJ0aWtlbCAlZCIsZHVtbXkpPT0xICYmIAorICAgICAgICBzdHI9dGhpc19wbGF5ZXIoKS0+X3VucGFyc2VkX2FyZ3MoKVsxMi4uXSl8fAorICAgICAgIChzc2NhbmYobG93ZXJfY2FzZShzdHIpLCJ0byBub3RlICVkIixkdW1teSk9PTEgJiYgCisgICAgICAgIHN0cj10aGlzX3BsYXllcigpLT5fdW5wYXJzZWRfYXJncygpWzguLl0pKSkgeworICAgIG1peGVkIG5vdGVzOworICAgIG5vdGVzPU5FV1NTRVJWRVItPkdldE5vdGVzKEdST1VQKTsKKyAgICBpZiAoZHVtbXk8MXx8ZHVtbXk+c2l6ZW9mKG5vdGVzKSkKKyAgICAgIHJldHVybiB3cml0ZSgiRWluZW4gQXJ0aWtlbCBtaXQgZGVyIE51bW1lciAiK2R1bW15KworICAgICAgICAgICAgICAgICAgICIgZ2lidCBlcyBpbiBkaWVzZXIgUnVicmlrIG5pY2h0LlxuIiksMTsKKyAgICBkdW1teS0tOworICAgIHJlcGx5dGl0bGU9KHtub3Rlc1tkdW1teV1bTV9USVRMRV0sbm90ZXNbZHVtbXldW01fV1JJVEVSXSwKKyAgICAgICAgICAgICAgICAgICBub3Rlc1tkdW1teV1bTV9USU1FXSxHZXRUSUQobm90ZXNbZHVtbXldKSxHUk9VUH0pOworICAgIERFQlVHVkFSKHN0cik7CisgICAgaWYgKCFuZXd0aXRsZSYmc3RyJiZzaXplb2Yoc3RyKSYmc3NjYW5mKHN0ciwiJWQgJXMiLGR1bW15LHN0cik9PTIpCisgICAgICBuZXd0aXRsZT1zdHI7CisgIH0KKyAgZWxzZSBpZiAoIXN0cnx8IXNpemVvZihzdHIpKSB7CisgICAgaWYgKCFsYXN0dGl0bGUpIHJldHVybgorICAgICAgd3JpdGUoIkR1IGhhc3Qgbm9jaCBnYXIgbmljaHRzIGdlbGVzZW4sIHdvcmF1ZiBEdSAiCisgICAgICAgICAgImFudHdvcnRlbiBrb2VubnRlc3QuXG4iKSwxOworICAgIHJlcGx5dGl0bGU9bGFzdHRpdGxlOworICB9CisgIGVsc2UgcmV0dXJuIDA7ICAgICAgCisKKy8vIHJldHVybiBDb21wb3NlUmVwbHkocmVwbHl0aXRsZSk7CisvL30KKy8vCisvLworLy9Db21wb3NlUmVwbHkobWl4ZWQgcmVwbHl0aXRsZSkgeworCisgIGlmICghbmV3dGl0bGUpIHsKKyAgICBpZiAocmVwbHl0aXRsZVswXVswLi43XT09IlJlOiBSZTogIikgbmV3dGl0bGU9IlJlXjM6ICIrcmVwbHl0aXRsZVswXVs4Li5dOworICAgIGVsc2UgaWYgKHNzY2FuZihyZXBseXRpdGxlWzBdLCJSZV4lZDogJXMiLG5yLG5ld3RpdGxlKSkKKyAgICAgIG5ld3RpdGxlPSJSZV4iKyhucisxKSsiOiAiK25ld3RpdGxlOworICAgIGVsc2UgbmV3dGl0bGU9IlJlOiAiK3JlcGx5dGl0bGVbMF07CisgIH0KKyAgcmV0dXJuIHNjaHJlaWIobmV3dGl0bGUsMCwwLAorICAgICAgICAgICAgICAgICBTVEFUVVNFU0NBUEUrIiBybj0iK3JlcGx5dGl0bGVbTEFTVF9XUklURVJdKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBydD0iK3JlcGx5dGl0bGVbTEFTVF9USU1FXSsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcmc9IityZXBseXRpdGxlW0xBU1RfR1JPVVBdKyJcbiIrCisgICAgICAgICAgICAgICAgIFNUQVRVU0VTQ0FQRSsiIHRpZD0iK3JlcGx5dGl0bGVbTEFTVF9USURdKyJcbiIpOworfQorCitzdGF0aWMgUmVwbHkyKHN0cikgeworICBzdHIgPSB0aGlzX3BsYXllcigpLT5fdW5wYXJzZWRfYXJncygpOworICBpZiAoIXN0cnx8c3RyWzAuLjExXT09ImF1ZiBhcnRpa2VsICJ8fHN0clswLi43XT09InRvIG5vdGUgIikKKyAgICByZXR1cm4gUmVwbHkoc3RyKTsKKyAgcmV0dXJuIFJlcGx5KDAsc3RyKTsKK30KKworc3RhdGljIHZvaWQgSW5mb3JtUGxheWVycyhzdHJpbmcgZ3JvdXAsc3RyaW5nIHBsYXllcixzdHJpbmcgdGV4dCkKK3sKKyAgb2JqZWN0ICpwbGF5ZXJzOworICBpbnQgaTsKKyAgbWl4ZWQgZGF0YTsKKyAgc3RyaW5nIGlnOworCisgIHBsYXllcnM9dXNlcnMoKTsKKyAgaWc9bG93ZXJfY2FzZShwbGF5ZXIpKyIubmV3cyI7CisgIGZvciAoaT1zaXplb2YocGxheWVycyktMTtpPj0wO2ktLSkgeworICAgIGRhdGE9cGxheWVyc1tpXS0+UXVlcnlQcm9wKFBfV0FJVEZPUik7CisgICAgaWYgKHBvaW50ZXJwKGRhdGEpJiYobWVtYmVyKGRhdGEsIk1wYSIpPi0xKSkgeworICAgICAgZGF0YT1wbGF5ZXJzW2ldLT5RdWVyeVByb3AoUF9SRUFEX05FV1MpOworICAgICAgaWYgKG1hcHBpbmdwKGRhdGEpJiYoZGF0YVtncm91cF0+MCkpIHsKKyAgICAgICAgZGF0YT1wbGF5ZXJzW2ldLT5RdWVyeVByb3AoUF9JR05PUkUpOworICAgICAgICBpZiAoKCFwb2ludGVycChkYXRhKSl8fChtZW1iZXIoZGF0YSxpZyk9PS0xKSkKKyAgICAgICAgICB0ZWxsX29iamVjdChwbGF5ZXJzW2ldLHRleHQpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitzdGF0aWMgUG9zdE5vdGUodGV4dCkgeworICBpbnQgZXJyOworICBzdHJpbmcgc2lnOworCisgIGlmICghdGV4dCkgeworICAgIHdyaXRlKCJBYmJydWNoISBBcnRpa2VsIGxhbmRldCBpbSBSZWlzc3dvbGYuXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoIXNpemVvZihvbGRfZXhwbG9kZSh0ZXh0LCJcbiIpLQorICAgICAgICAgICAgICAoeyJxIiwicXVpdCIsIiAqKiIsIioqICIsImVuZGUiLCIiLCJleGl0IiwiICJ9KSAKKyAgICAgICAgICAgICAgKSApCisgICAgcmV0dXJuIHdyaXRlKCJcCitBQ0hUVU5HOiBXb2xsdGVzdCBEdSB3aXJrbGljaCBlaW5lbiBBcnRpa2VsIG9obmUgSW5oYWx0IGluIGRpZSBtcGEgc2V0emVuP1xuXAorQXJ0aWtlbCBvaG5lIGVya2VubmJhcmVuIEluaGFsdCB3ZXJkZW4gTklDSFQgdmVyb2VmZmVudGxpY2h0LiBCaXR0ZSB1ZWJlci1cblwKK3BydWVmIERlaW5lIFN5bnRheCwgZmFsbHMgRHUga2VpbmVuIEFydGlrZWwgc2NocmVpYmVuIHdvbGx0ZXN0LCBvZGVyIHNjaHJlaWJcblwKK2F1Y2ggZWluIGJpc3NjaGVuIFRleHQhXG5cCitBcnRpa2VsIGxhbmRldCBpbSBSZWlzc3dvbGYuXG4iKSwxOworICBpZiAoIW1lc3NhZ2VbTV9NRVNTQUdFXSkKKyAgICBtZXNzYWdlW01fTUVTU0FHRV0gPSB0ZXh0OworICBlbHNlCisgICAgbWVzc2FnZVtNX01FU1NBR0VdKz10ZXh0OworICBpZiAoc2lnPXJlYWRfZmlsZSgiL3BsYXllcnMvIitnZXRldWlkKHRoaXNfaW50ZXJhY3RpdmUoKSkrIi8uc2lnbmF0dXJlIikpCisgICAgbWVzc2FnZVtNX01FU1NBR0VdKz1zaWc7CisgIGlmICghQ2F0Y2hOZXdzRXJyb3IoTkVXU1NFUlZFUi0+V3JpdGVOb3RlKG1lc3NhZ2UpLAorICAgICAgICJEaWVzZSBSdWJyaWsgaXN0IHZvbGwuIE1pc3QsIGRhIHdhciBqZW1hbmQgc2NobmVsbGVyLi4uIikpIHsKKyAgICB3cml0ZSgiVmVyc3VjaCwgUGxhdHogaW4gZGVyIFJ1YnJpayB6dSBmaW5kZW4sIGRhbm4ga2FubnN0IER1IG1pciB+ciBub2NobWFsXG5pbiBkZW4gVGV4dCBlaW5zdGVpZ2VuIHVuZCBpaG4gYW5zY2hsaWVzc2VuZCB2ZXJvZWZmZW50bGljaGVuLlxuKFZvcnNjaGxhZzogRWluZW4gdmVyYWx0ZXRlbiBBcnRpa2VsIGFiaGFlbmdlbiBvZGVyIHZlcmxlZ2VuLlxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgd3JpdGUoIk9LLCBBcnRpa2VsIGlzdCB2ZXJvZWZmZW50bGljaHQuXG4iKTsKKyAgc2F5KGNhcGl0YWxpemUoVFAtPm5hbWUoKSkrCisgICAgICAiIGhhdCBlaW5lbiBBcnRpa2VsIGluIGRlciBaZWl0dW5nIHZlcm9lZmZlbnRsaWNodC5cbiIpOworICBpZiAoZ2V0ZXVpZChUUCkhPSJzaXRvcGFuYWtpIikKKyAgICBJbmZvcm1QbGF5ZXJzKG1lc3NhZ2VbTV9CT0FSRF0sZ2V0ZXVpZCh0aGlzX2ludGVyYWN0aXZlKCkpLAorICAgICAgICAgICAgICAgICIqIE1QQTogTmV1ZXIgQXJ0aWtlbCB2b24gIisKKyAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldGV1aWQodGhpc19pbnRlcmFjdGl2ZSgpKSkrCisgICAgICAgICAgICAgICAgIiBpbiBSdWJyaWsgXCIiK21lc3NhZ2VbTV9CT0FSRF0rIlwiLlxuIik7CisgIG1lc3NhZ2U9MDsgLyogUGxhdHogc3BhcmVuISAqLworICByZXR1cm4gMTsKK30KKworCisvL3N0YXRpYyAvLyBhbGxvd2luZyBhbGlhc2luZyAqUnVtYXRhKiA1LzgvOTYKK2luaGFsdChzdHIpIHsKKyAgaW50IGksZW5kZmxhZyx0aW1lb3V0OworICBzdHJpbmcgKmdydXBwZW4scyx0eHQsc3VjaGU7CisgIG1peGVkIG1lc3NhZ2VzOworCisgIGlmIChzdHI9PSI/Inx8c3RyPT0iLT8iKSByZXR1cm4KKyAgICB3cml0ZSgiU3ludGF4OiBpbmhhbHQgWzxydWJyaWs+XSBbZW5kZV0gW3N1Y2hlIDx0ZXh0Pl1cbiIpLDE7CisKKyAgc3RyPSghc3RyKT8oe30pOmV4cGxvZGUoc3RyLCIgIik7CisKKyAgaWYgKHNpemVvZihzdHIpICYmIChzdHJbMF09PSJuZXUiIHx8IHN0clswXT09Im5ldWVzIikgKQorICAgIHJldHVybiBSZWFkTmV4dFVucmVhZCgibGlzdGUiKSwxOworCisgIGlmIChlbmRmbGFnPW1lbWJlcihzdHIsImVuZGUiKSsxKSBzdHItPSh7ImVuZGUifSk7CisgIGlmICgoKGk9bWVtYmVyKHN0ciwic3VjaGUiKSkgIT0gLTEpICYmIChzaXplb2Yoc3RyKSA+IGkpKSB7CisgICAgc3VjaGU9bG93ZXJfY2FzZShpbXBsb2RlKHN0cltpKzEuLl0sIiAiKSk7CisgICAgc3RyPXN0clswLi5pLTFdOworICB9CisgIGVsc2UKKyAgICBzdWNoZT0wOworICBpZiAoIXNpemVvZihzdHIpKSB7CisgICAgc3RyPUdST1VQOworICAgIGlmICghcG9pbnRlcnAobWVzc2FnZXM9TkVXU1NFUlZFUi0+R2V0Tm90ZXMoc3RyKSkpeworICAgICAgc3RyPUdST1VQPURFRkFVTFRHUk9VUDsKKyAgICBpZiAoIXBvaW50ZXJwKG1lc3NhZ2VzPU5FV1NTRVJWRVItPkdldE5vdGVzKHN0cikpKQorICAgICAgcmV0dXJuIG5vdGlmeV9mYWlsKCJTZWx0c2FtLCBpcmdlbmR3aWUgZ2VodCBoaWVyIGVpbmlnZXMgc2NoaWVmLi4uXG4iKSwwOworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICBzdHI9R2V0R3JvdXBOYW1lKHN0clswXSk7CisgICAgaWYgKCFzdHIpIHJldHVybiAxOworICAgIG1lc3NhZ2VzPU5FV1NTRVJWRVItPkdldE5vdGVzKHN0cik7CisgIH0KKyAgdGltZW91dD1hYnMocmVhZF91bnRpbFtzdHJdKTsKKyAgcz0iSW5oYWx0IGRlciBSdWJyaWsgIitzdHIrIjpcblxuIjsKKyAgaWYgKCFwb2ludGVycChtZXNzYWdlcykgfHwgIXNpemVvZihtZXNzYWdlcykpCisgICAgcmV0dXJuIAorICAgICAgd3JpdGUocysiWnVyIFplaXQgYmVmaW5kZW4gc2ljaCBrZWluZSBBcnRpa2VsIGluIGRpZXNlciBSdWJyaWsuXG4iKSwxOworICBpZiAoc3VjaGUpCisgICAgcys9IlN1Y2hlIG5hY2ggJyIrc3VjaGUrIicgaW4gZGVyIFJ1YnJpayBlcmdhYiBmb2xnZW5kZSBUcmVmZmVyOlxuXG4iOworICBlbHNlCisgICAgaWYgKHNpemVvZihtZXNzYWdlcyk9PTEpCisgICAgICBzKz0iWnVyIFplaXQgYmVmaW5kZXQgc2ljaCBlaW4gQXJ0aWtlbCBpbiBkZXIgUnVicmlrOlxuXG4iOworICAgIGVsc2UKKyAgICAgIHMrPSJadXIgWmVpdCBiZWZpbmRlbiBzaWNoICIrc2l6ZW9mKG1lc3NhZ2VzKSsKKyAgICAgICAgIiBBcnRpa2VsIGluIGRlciBSdWJyaWs6XG5cbiI7CisgIGlmIChlbmRmbGFnJiYoc2l6ZW9mKG1lc3NhZ2VzKT4xNikmJgorICAgICAgbWVzc2FnZXNbc2l6ZW9mKG1lc3NhZ2VzKS0xNl1bTV9USU1FXT49dGltZW91dCkgdGltZW91dD0tMTsKKyAgZm9yIChpPShlbmRmbGFnPygoKGVuZGZsYWc9c2l6ZW9mKG1lc3NhZ2VzKS0xNSk8MCk/MDplbmRmbGFnKTowKTsKKyAgICAgICBpPHNpemVvZihtZXNzYWdlcyk7aSsrKQorICB7CisgICAgdHh0PXNwcmludGYoIiUyZC4lcyUtNDhzJTRkICglLTExcykgJXNcbiIsaSsxLAorICAgICAgICAgICAgICAgICgoKHRpbWVvdXQ+PTApICYmIHRpbWVvdXQ8bWVzc2FnZXNbaV1bTV9USU1FXSApPworICAgICAgICAgICAgICAgICAoICh0aW1lb3V0PS0xKSwiKiIpOiIgIiksbWVzc2FnZXNbaV1bTV9USVRMRV0sCisgICAgICAgICAgICAgICAgc2l6ZW9mKGV4cGxvZGUobWVzc2FnZXNbaV1bTV9NRVNTQUdFXSwiXG4iKSksCisgICAgICAgICAgICAgICAgbWVzc2FnZXNbaV1bTV9XUklURVJdLAorICAgICAgICAgICAgICAgIGR0aW1lKG1lc3NhZ2VzW2ldW01fVElNRV0pWzUuLjExXSk7CisgICAgaWYgKCFzdWNoZSB8fCAoc3Ryc3RyKGxvd2VyX2Nhc2UodHh0KSwgc3VjaGUpICE9IC0xKSkKKyAgICAgIHMrPXR4dDsKKyAgfQorICBpZiAoZW5kZmxhZykgd3JpdGUocyk7CisgIGVsc2UgdGhpc19wbGF5ZXIoKS0+TW9yZShzKTsKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGFydGlrZWwoc3RyKSB7CisgIHJldHVybiBsaWVzKHN0cik7Cit9CisKKworc3RhdGljIGxvZXNjaGUoc3RyKSB7CisgIGludCBudW07CisgIG1peGVkICptZXNzYWdlczsKKworICBpZiAoc3RyPT0iPyJ8fHN0cj09Ii0/IikgcmV0dXJuIAorICAgIHdyaXRlKCJTeW50YXg6IGxvZXNjaGUgYXJ0aWtlbCA8bnI+XG4iCisgICAgICAgICAgIiAgKGJlemllaHQgc2ljaCBpbW1lciBhdWYgZGllIGFrdHVlbGxlIFJ1YnJpay5cbiIpLDE7CisKKyAgaWYgKCFzdHIgfHwgc3NjYW5mKHN0ciwiYXJ0aWtlbCAlZCIsbnVtKSE9MSB8fCBudW08PTApIAorICAgcmV0dXJuIG5vdGlmeV9mYWlsKCJXRUxDSEVOIEFydGlrZWwgd2lsbHN0IER1IGxvZXNjaGVuID9cbiIpLDA7CisgIG51bS0tOworICBtZXNzYWdlcz0oTkVXU1NFUlZFUi0+R2V0Tm90ZXMoR1JPVVApKTsKKyAgaWYgKHNpemVvZihtZXNzYWdlcyk8PW51bSkgcmV0dXJuCisgICAgbm90aWZ5X2ZhaWwoIlNvIHZpZWxlIEFydGlrZWwgc2luZCBkYSBuaWNodCFcbiIpLDA7CisgIAorICB3cml0ZSgiUnVicmlrICIrR1JPVVArIiwgQXJ0aWtlbCAiKyhudW0rMSkrCisgICAgICAgICIgdm9uICIrY2FwaXRhbGl6ZShtZXNzYWdlc1tudW1dW01fV1JJVEVSXSkrCisgICAgICAgICIgdm9tICIrZHRpbWUobWVzc2FnZXNbbnVtXVtNX1RJTUVdKVs1Li4yNl0rCisgICAgICAgICIsXG5UaXRlbDogIittZXNzYWdlc1tudW1dW01fVElUTEVdKyIsXG5cbiIpOworCisgIC8qICh1ZWJlcmZsdWVzc2lnZSBBYmZyYWdlLCBtYWNodCBzY2hvbiAvc2VjdXJlL25ld3MpCisgIGlmICghSVNfTEVBUk5FUihUSSkgJiYgbG93ZXJfY2FzZShtZXNzYWdlc1tudW1dW01fV1JJVEVSXSkhPWdldGV1aWQoVEkpKSAKKyAgICByZXR1cm4gCisgICAgICB3cml0ZSgiTmljaHQgZ2Vsb2VzY2h0IC0gZHUgZGFyZnN0IG51ciBlaWdlbmUgQXJ0aWtlbCBsb2VzY2hlbi5cbiIpLDE7CisgICAgICAgICAgKi8KKworICBzd2l0Y2ggKE5FV1NTRVJWRVItPlJlbW92ZU5vdGUoR1JPVVAsIG51bSkpeworICBjYXNlIDE6IHdyaXRlKCJBcnRpa2VsIGlzdCBnZWxvZXNjaHQuXG4iKTsKKyAgICBzYXkodGhpc19wbGF5ZXIoKS0+bmFtZSgpKyIgbG9lc2NodCBlaW5lbiBBcnRpa2VsIGF1cyBkZXIgWmVpdHVuZy5cbiIpOworICAgIHJldHVybiAxOworICBjYXNlIC0xOiB3cml0ZSgiRGllc2VuIEFydGlrZWwgZGFyZnN0IER1IG5pY2h0IGxvZXNjaGVuLlxuIik7CisgICAgc2F5KHRoaXNfcGxheWVyKCktPm5hbWUoKSsiIHZlcnN1Y2h0IHZlcmdlYmxpY2gsIGVpbmVuIEFydGlrZWwgenUgbG9lc2NoZW4uXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgY2FzZSAtMzogd3JpdGUoIlNvIHZpZWxlIEFydGlrZWwgc2luZCBkYSBuaWNodCAhXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgZGVmYXVsdDogd3JpdGUoIkludGVybmVyIEZlaGxlci4gQml0dGUgRXJ6bWFnaWVyIHZlcnN0YWVuZGlnZW4gIVxuIik7CisgICAgcmV0dXJuIDE7CisgIH0gIAorfQorCisvLyBMb3ctbGV2ZWwgRnVua3Rpb24genVtIEFib25uaWVyZW4vQWJiZXN0ZWxsZW4gdm9uIFJ1YnJpa2VuCisvLyBiZXN0ZWxsZW49PTAgLT4gYWJiZXN0ZWxsZW4sIGJlc3RlbGxlbiE9MCAtPiBiZXN0ZWxsZW4KKy8vIFJ1ZWNrZ2FiZTogMCwgd2VubiBkZXIgZ2V3dWVuc2NodGUgWnVzdGFuZCBzY2hvbiBlaW5nZXN0ZWxsdCB3YXIsIHNvbnN0IDEKK3ByaXZhdGUgaW50IF9zdWJzY3JpYmUoc3RyaW5nIGdyb3VwbmFtZSwgaW50IGJlc3RlbGxlbikgeworCisgIGludCB0aW1lb3V0ID0gcmVhZF91bnRpbFtncm91cG5hbWVdOworICAvLyBnYXIgbmljaHQgYWJvbm5pZXJ0L2FiYmVzdGVsbHQ/CisgIGlmICghYmVzdGVsbGVuICYmIHRpbWVvdXQgPCAwKQorICAgIHJldHVybiAwOworICBlbHNlIGlmIChiZXN0ZWxsZW4gJiYgdGltZW91dCA+IDApCisgICAgcmV0dXJuIDA7CisKKyAgLy8gd2VubiBub2NoIGtlaW4gdGltZW91dCwgZXJzdG1hbCBhdWYgMSBzZXR6ZW4KKyAgdGltZW91dCB8fD0gMTsKKworICAvLyAtMSBmdWVyIGFiYmVzdGVsbGVuLCArMSBmdWVyIGJlc3RlbGxlbgorICBpZiAoYmVzdGVsbGVuKQorICAgIHJlYWRfdW50aWxbZ3JvdXBuYW1lXSA9IGFicyh0aW1lb3V0KTsKKyAgZWxzZQorICAgIHJlYWRfdW50aWxbZ3JvdXBuYW1lXSA9IC10aW1lb3V0OworCisgIGlmIChlbnZpcm9ubWVudCgpKQorICAgIGVudmlyb25tZW50KCktPlNldFByb3AoUF9SRUFEX05FV1MsIHJlYWRfdW50aWwpOworCisgIHJldHVybiAxOworfQorCitzdGF0aWMgVW5zdWJzY3JpYmUoc3RyKSB7CisgIGludCB0aW1lb3V0OworICBpZiAoc3RyPT0iPyJ8fHN0cj09Ii0/IikgcmV0dXJuCisgICAgd3JpdGUoIlN5bnRheDogdW5zdWJzY3JpYmUgPHJ1YnJpaz4iCisgICAgICAgICAgIiAgb2RlcjogYmVzdGVsbGUgPHJ1YnJpaz4gYWJcbiIpLDE7CisgIHN0cj1HZXRHcm91cE5hbWUoc3RyKTsKKyAgaWYgKCFzdHIpIHJldHVybiAxOworICBpZiAoIV9zdWJzY3JpYmUoc3RyLDApKSB7CisgICAgbm90aWZ5X2ZhaWwoIkRpZSBSdWJyaWsgaGFzdCBEdSBnYXIgbmljaHQgYWJvbm5pZXJ0IVxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgZWxzZSB7CisgICAgd3JpdGUoIlJ1YnJpayAiK3N0cisiIGFiYmVzdGVsbHQuXG4iKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgQmVzdGVsbGUoc3RyKSB7IC8qIGFiICEgKi8KKyAgaWYgKCFzdHIgfHwgIXNzY2FuZihzdHIsIiVzIGFiIixzdHIpKSByZXR1cm4gX25vdGlmeV9mYWlsKAorICAgICAgICJEaWUgU3ludGF4IGlzdDogJ2Jlc3RlbGxlIDxydWJyaWs+IGFiJywgIgorICAgICAgICJvZGVyIG1laW5zdCBEdSAnYWJvbm5pZXJlJz9cbiIpLDA7CisgIHJldHVybiBVbnN1YnNjcmliZShzdHIpOworfQorCitzdGF0aWMgU3Vic2NyaWJlKHN0cikgeworICBpbnQgdGltZW91dDsKKyAgaWYgKHN0cj09Ij8ifHxzdHI9PSItPyIpIHJldHVybgorICAgIHdyaXRlKCJTeW50YXg6IGFib25uaWVyZSA8cnVicmlrPlxuIgorICAgICAgICAgICIgIG9kZXI6IHN1YnNjcmliZSA8cnVicmlrPlxuIiksMTsKKyAgc3RyPUdldEdyb3VwTmFtZShzdHIpOworICBpZiAoIXN0cikgcmV0dXJuIDE7CisgIGlmICghX3N1YnNjcmliZShzdHIsMSkpIHsKKyAgICBub3RpZnlfZmFpbCgiRGllIFJ1YnJpayBoYXN0IER1IGRvY2ggc2Nob24gYWJvbm5pZXJ0IVxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgZWxzZSB7CisgICAgd3JpdGUoIlJ1YnJpayAiK3N0cisiIGFib25uaWVydC5cbiIpOworICB9CisgIHJldHVybiAxOworfQorCisvLyBMZWd0IGRpZSBhbmZhZW5nbGljaGVuIEFib25uZW1lbnRzIGVpbmVzIE5ldWxlc2VycyBmZXN0IHVuZCBiZXN0ZWxsdCBhbGxlCisvLyBhbmRlcmVuIGFiLgorcHJpdmF0ZSB2b2lkIEluaXRpYWxTdWJzY3JpcHRpb25zKCkgeworICAvLyBhbGxlIGFiYmVzdGVsbGVuLiA7LSkKKyAgLy8gQWx0ZXJuYXRpdmU6IGZ1ZXIgYWxsZSBfc3Vic2NyaWJlKCwwKSBydWZlbgorICBpZiAoIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoZW52aXJvbm1lbnQoKSkpCisgICAgcmV0dXJuOworICBzdHJpbmcgKmdydXBwZW4gPSBORVdTU0VSVkVSLT5HZXRHcm91cHMoKTsKKyAgaW50ICp2YWxzID0gYWxsb2NhdGUoc2l6ZW9mKGdydXBwZW4pLC0xKTsKKyAgcmVhZF91bnRpbCA9IG1rbWFwcGluZyhncnVwcGVuLHZhbHMpOworCisgIC8vIGpldHp0IGRpZSB2b3JhdXNnZXdhZWhsdGVuIGJlc3RlbGxlbgorICBmb3JlYWNoKHN0cmluZyBncnVwcGUgOiBJTklUSUFMX1NVQlNDUklQVElPTlMpIHsKKyAgICBpZiAobWVtYmVyKGdydXBwZW4sIGdydXBwZSkgPiAtMSkKKyAgICAgIF9zdWJzY3JpYmUoZ3J1cHBlLDEpOworICB9CisgIC8vIHVuZCBnZ2YuIG5vY2ggZGllIGVpZ2VuZSBHaWxkZW5ydWJyaWsKKyAgc3RyaW5nIGdpbGRlID0gZW52aXJvbm1lbnQoKS0+UXVlcnlQcm9wKFBfR1VJTEQpOworICBpZiAoc3RyaW5ncChnaWxkZSkKKyAgICAgICYmIG1lbWJlcihncnVwcGVuLCAiZ2lsZGVuLiIrZ2lsZGUpID4gLTEpCisgICAgX3N1YnNjcmliZSgiZ2lsZGVuLiIrZ2lsZGUsMSk7CisKKyAgZW52aXJvbm1lbnQoKS0+U2V0UHJvcChQX1JFQURfTkVXUywgcmVhZF91bnRpbCk7Cit9CisKK3N0YXRpYyBNb3ZlTWVzc2FnZShzdHIpIHsKKyAgaW50IG51bSxpOworICBtaXhlZCBtc2cvKixleHBsKi87CisgIHN0cmluZyBncjsKKyAgaWYgKHN0cj09Ij8ifHxzdHI9PSItPyIpIHJldHVybgorICAgIHdyaXRlKCJTeW50YXg6IHZlcmxlZ2UgYXJ0aWtlbCA8bnI+IG5hY2ggPHJ1YnJpaz5cbiIKKyAgICAgICAgICAiICBBcnRpa2VsIHVuZCBSdWJyaWsgbXVlc3NlbiBleHBsaXppdCBhbmdlZ2ViZW4gd2VyZGVuLlxuIiksMTsKKyAgaWYgKCFzdHIgfHwgc3NjYW5mKHN0ciwiYXJ0aWtlbCAlZCBuYWNoICVzIixudW0sZ3IpIT0yKSByZXR1cm4gKGludClub3RpZnlfZmFpbCgKKyAgICAgICAgInZlcmxlZ2UgYXJ0aWtlbCA8bnI+IG5hY2ggPHJ1YnJpaz4sIG9kZXIgd2FzP1xuIik7CisgIGlmICghKGdyPUdldEdyb3VwTmFtZShncikpKSByZXR1cm4gMTsKKyAgaWYgKCEoQ2F0Y2hOZXdzRXJyb3IoTkVXU1NFUlZFUi0+QXNrQWxsb3dlZFdyaXRlKGdyKSwiRGllIFJ1YnJpayBpc3QgbGVpZGVyIHZvbGwuXG4iKSkpIHJldHVybiAxOworCisgIGlmICghcG9pbnRlcnAobXNnPU5FV1NTRVJWRVItPkdldE5vdGVzKEdST1VQKSkpCisgICAgcmV0dXJuIG5vdGlmeV9mYWlsKCJTZWx0c2FtLCBkaWUgUnVicmlrICciK0dST1VQKworICAgICAgICAiJyBnaWJ0IGVzIG5pY2h0IG1laHIuLi5cbiIpLCAwOworCisgIG51bS0tOworICBpZiAoc2l6ZW9mKG1zZyk8PW51bSkgcmV0dXJuCisgICAgbm90aWZ5X2ZhaWwoIlNvIHZpZWxlIE5hY2hyaWNodGVuIHNpbmQgZGEgbmljaHQgIVxuIiksMDsKKyAgbXNnPW1zZ1tudW1dOworICBpZiAoZ2V0ZXVpZChUSSkgIT0gbG93ZXJfY2FzZShtc2dbTV9XUklURVJdKSkgeyAgICAKKyAgICBpZiAoIUlTX0xFQVJORVIoVEkpKSByZXR1cm4gCisgICAgICB3cml0ZSgiRHUgZGFyZnN0IG51ciBEZWluZSBlaWdlbmVuIEFydGlrZWwgdmVybGVnZW4uXG4iKSwxOworICAgIHdyaXRlKCJXQVJOVU5HOiBEYXMgaXN0IG5pY2h0IERlaW4gZWlnZW5lciBBcnRpa2VsIVxuIik7CisgIH0KKyAgICAvLyAgcmV0dXJuIChpbnQpbm90aWZ5X2ZhaWwoIk1hbiBkYXJmIHp1ciBaZWl0IG51ciBlaWdlbmUgQXJ0aWtlbCB2ZXJsZWdlbi5cbiIpOworICBpZiAoIUNhdGNoTmV3c0Vycm9yKE5FV1NTRVJWRVItPlJlbW92ZU5vdGUoR1JPVVAsbnVtKSwiRGllc2VyIEZlaGxlciBrYW5uIGVpZ2VudGxpY2ggbmljaHQgYXVmdHJldGVuIikpCisgICAgd3JpdGUoIldhcm51bmchIEtvbm50ZSBBcnRpa2VsIGFuIGFsdGVyIFBvc2l0aW9uIG5pY2h0IGxvZXNjaGVuLlxuIik7CisgIGVsc2Ugd3JpdGUoIkFydGlrZWwgdm9uIFJ1YnJpayAiK0dST1VQKyIgZW50ZmVybnQuXG4iKTsKKworICBtc2dbTV9NRVNTQUdFXT0KKyAgICBzcHJpbnRmKCIlcyBvbj0lcyBvdD0lZCBvZz0lc1xuIiwKKyAgICAgICAgICAgIFNUQVRVU0VTQ0FQRSxtc2dbTV9XUklURVJdLG1zZ1tNX1RJTUVdLG1zZ1tNX0JPQVJEXSkKKyAgICAgICttc2dbTV9NRVNTQUdFXTsKKworLyoKKyAgZXhwbD1leHBsb2RlKG1zZ1tNX01FU1NBR0VdLCJcbiIpOworICBmb3IgKGk9MDsoSVNfU1RBVFVTTElORShleHBsW2ldWzAuLjJdKSk7aSsrKTsKKyAgbXNnW01fTUVTU0FHRV09KCAoaSkgPyBpbXBsb2RlKGV4cGxbMC4uaS0xXSwiXG4iKSsiXG4iIDogIiIgKSArCisgICAgIltWZXJsZWd0IHZvbiAiK21zZ1tNX0JPQVJEXSsiLCAiK21zZ1tNX1dSSVRFUl0rIiwgIisKKyAgICBkdGltZShtc2dbTV9USU1FXSlbNS4uMjZdKyJdOlxuIisKKyAgICAgIGltcGxvZGUoZXhwbFtpLi5dLCJcbiIpKyJcbiI7CisqLworCisgIG1zZ1tNX0JPQVJEXT1ncjsKKyAgTkVXU1NFUlZFUi0+V3JpdGVOb3RlKG1zZyk7CisgIHdyaXRlKCJBcnRpa2VsIG5hY2ggUnVicmlrICIrZ3IrIiB2ZXJsZWd0LlxuIik7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgTW92ZVRyYXNoKCkKK3sKKyAgaWYgKCFwb2ludGVycChsYXN0dGl0bGUpfHxzaXplb2YobGFzdHRpdGxlKTxMQVNUX1NJWkVPRikgcmV0dXJuCisgICAgd3JpdGUoIldhcyBkZW5uIGJpdHRlPyBEdSBoYXN0IG5vY2ggZ2FyIG5pY2h0cyBnZWxlc2VuIVxuIiksMTsKKyAgaWYgKGxhc3R0aXRsZVtMQVNUX0dST1VQXSE9R1JPVVApIHJldHVybgorICAgIHdyaXRlKCJOaXggZ2lidHMhIER1IGhhc3QgZGllIFJ1YnJpayBnZXdlY2hzZWx0IVxuIiksMTsKKyAgcmV0dXJuIE1vdmVNZXNzYWdlKHNwcmludGYoImFydGlrZWwgJWQgbmFjaCBtdWVsbCIsbGFzdHRpdGxlW0xBU1RfTlJdKzEpKTsKK30KKworc3RhdGljIFNhdmVNZXNzYWdlKHN0cikgeworICBtaXhlZCBudW07CisgIG1peGVkICptZXNzYWdlczsKKworICBpZiAoaW50cChzdHIpKSBudW09c3RyOworICBpZiAoKCFudW0gJiYgKCFzdHIgfHwgc3RyPT0iIiB8fCBzc2NhbmYoc3RyLCJhcnRpa2VsICVkIixudW0pIT0xKSkgfHwgbnVtPD0wKSB7CisgICAgbm90aWZ5X2ZhaWwoIldlbGNoZW4gQXJ0aWtlbCB3aWxsc3QgRHUgYWJzcGVpY2hlcm4/XG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoIXBvaW50ZXJwKG1lc3NhZ2VzPU5FV1NTRVJWRVItPkdldE5vdGVzKEdST1VQKSkpCisgICAgcmV0dXJuIG5vdGlmeV9mYWlsKCJTZWx0c2FtLCBkaWUgUnVicmlrICciK0dST1VQKworICAgICAgICAiJyBnaWJ0IGVzIG5pY2h0IG1laHIuLi5cbiIpLCAwOworICBudW0tLTsKKyAgaWYgKHNpemVvZihtZXNzYWdlcyk8PW51bSkgeworICAgIG5vdGlmeV9mYWlsKCJTbyB2aWVsZSBOYWNocmljaHRlbiBzaW5kIGRhIG5pY2h0ICFcbiIpOworICAgIHJldHVybiAwOworICB9CisgIGlmKHdyaXRlX2ZpbGUoU0FWRU1TR1BBVEgoVFApLE1lc3NhZ2Uyc3RyaW5nKG51bSxtZXNzYWdlcyxNMlNfUkVNT1RFKSsiXG4iKSkKKyAgICB3cml0ZShicmVha19zdHJpbmcoCisgICAgICAiSW5oYWx0IGRlcyBBcnRpa2VscyB3dXJkZSBuYWNoICIrU0FWRU1TR1BBVEgoVFApKyIgZ2VzcGVpY2hlcnQuXG4iKSk7CisgIGVsc2UKKyAgICB3cml0ZShicmVha19zdHJpbmcoCisgICAgICAiRmVobGVyIGJlaW0gU2NocmVpYmVuIG5hY2ggIitTQVZFTVNHUEFUSChUUCkrIiFcbiIpKTsKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIE1haWxNZXNzYWdlKHN0cikgeworICBtaXhlZCBudW0scmVjLGdyb3VwOworICBtaXhlZCAqbWVzc2FnZXM7CisKKy8vICBwcmludGYoIiVPXG4iLGluaGVyaXRfbGlzdChlbnZpcm9ubWVudChUUCkpKTsKKy8vICBpZiAobWVtYmVyKHF1ZXJ5X2FjdGlvbnModGhpc19wbGF5ZXIoKSksIm1haWwiKTwwKQorLy8gICAgIHR1dCBuaWNodCB3ZWdlbiBhbmRlcmVyIEltcGxlbXRpZXJ1bmcgdm9uIEFkZENtZCBpbiBSYWV1bWVuCisgIAorICBpZiAoc3RyPT0iPyJ8fHN0cj09Ii0/IikgcmV0dXJuCisgICAgd3JpdGUoIlN5bnRheDogdmVyc2VuZGUgYXJ0aWtlbCA8bnI+IGFuIDxhZHJlc3NlPlxuIiksMTsKKworICBzdHI9VFAtPl91bnBhcnNlZF9hcmdzKCk7ICAgICAvLyB3ZWdlbiBNYWlsYWRyZXNzZW4KKyAgaWYgKHN0cikgc3RyPWxvd2VyX2Nhc2Uoc3RyKTsKKworICBpZiAoIUlTX1NFRVIoVFApICYmICFJU19QT1NUKGVudmlyb25tZW50KFRQKSkpCisgICAgcmV0dXJuIG5vdGlmeV9mYWlsKCJEdSBtdXNzdCBpbiBlaW4gUG9zdGFtdCBnZWhlbiwgIgorICAgICAgICAidW0gZXR3YXMgdmVyc2VuZGVuIHp1IGtvZW5uZW4uXG4iKSwwOworICAKKyAgbnVtPTA7CisgIAorICBpZiAoIXN0ciB8fCAoc3NjYW5mKHN0ciwiYXJ0aWtlbCAlZCBhbiAlcyIsbnVtLHJlYykhPTIgJiYKKyAgICAgICAgICAgICAgIHNzY2FuZihzdHIsIm5vdGUgJWQgdG8gJXMiLG51bSxyZWMpIT0yICYmCisgICAgICAgICAgICAgICBzc2NhbmYoc3RyLCJub3RlIHRvICVzIixyZWMpIT0xICYmCisgICAgICAgICAgICAgICBzc2NhbmYoc3RyLCJhcnRpa2VsIGFuICVzIixyZWMpIT0xKSl7CisgICAgIGlmICghc3RyIHx8IHN0clswLi42XT09ImFydGlrZWwifHxzdHJbMC4uM109PSJub3RlIikgcmV0dXJuIAorICAgICAgd3JpdGUoIldlbGNoZW4gQXJ0aWtlbCB3aWxsc3QgRHUgdmVyc2VuZGVuLCB1bmQgd29oaW4/XG4iKSwxOworICAgIGVsc2UgcmV0dXJuIAorICAgICAgbm90aWZ5X2ZhaWwoIldlbGNoZW4gQXJ0aWtlbCB3aWxsc3QgRHUgdmVyc2VuZGVuLCB1bmQgd29oaW4/XG4iKSwwOworICB9CisgIGlmICghbnVtJiYoIXBvaW50ZXJwKGxhc3R0aXRsZSl8fHNpemVvZihsYXN0dGl0bGUpPExBU1RfU0laRU9GKSkKKyAgICByZXR1cm4gd3JpdGUoIkR1IGhhc3Qgc2NoZWluYmFyIG5vY2ggbmljaHRzIGdlbGVzZW4sIHdvcmF1ZiBtYW4gc2ljaCAiCisgICAgICAgICJiZXppZWhlbiBrYW5uLlxuR2liIG5vdGZhbGxzIGRpZSBOdW1tZXIgZGVzIEFydGlrZWxzIGFuLlxuIiksMTsKKworICAvLyAgcHJpbnRmKCJsYXN0dGl0bGU9ICVPXG5udW09JWRcbiIsbGFzdHRpdGxlLG51bSk7CisKKyAgaWYgKCFwb2ludGVycChtZXNzYWdlcz0KKyAgICAgIE5FV1NTRVJWRVItPkdldE5vdGVzKGdyb3VwPShudW0/R1JPVVA6bGFzdHRpdGxlW0xBU1RfR1JPVVBdKSkpKQorICAgIHJldHVybiBub3RpZnlfZmFpbCgiU2VsdHNhbSwgZGllIFJ1YnJpayBnaWJ0IGVzIG5pY2h0IG1laHIuLi5cbiIpLCAwOworCisgIGlmICghcG9pbnRlcnAobWVzc2FnZXMpfHwhc2l6ZW9mKG1lc3NhZ2VzKSkKKyAgICByZXR1cm4gd3JpdGUoIkRpZSBSdWJyaWsgIitncm91cCsiIGlzdCBsZWVyLlxuIiksMTsKKyAgaWYgKG51bTwwfHxzaXplb2YobWVzc2FnZXMpPG51bSkgcmV0dXJuCisgICAgd3JpdGUoIkVpbmVuIEFydGlrZWwgbWl0IE51bW1lciAiK251bSsiIGdpYnQgZXMgaW4gUnVicmlrICIrZ3JvdXArCisgICAgICAgICIgbmljaHQhXG4iKSwxOworCisgIGlmIChudW0pIG51bS0tOworICBlbHNlIHsKKyAgICBpbnQgaDsKKyAgICBudW09LTE7CisgICAgaWYgKHBvaW50ZXJwKG1lc3NhZ2VzKSkgeworICAgICAgZm9yIChoPXNpemVvZihtZXNzYWdlcyktMTsKKyAgICAgICAgICAgKGg+PTAgJiYgbWVzc2FnZXNbaF1bTV9USU1FXT49bGFzdHRpdGxlW0xBU1RfVElNRV0pO2gtLSkgCisgICAgICAgIGlmIChtZXNzYWdlc1toXVtNX1RJTUVdPT1sYXN0dGl0bGVbTEFTVF9USU1FXSAmJiAKKyAgICAgICAgICAgIGxvd2VyX2Nhc2UobWVzc2FnZXNbaF1bTV9XUklURVJdKT09CisgICAgICAgICAgICBsb3dlcl9jYXNlKGxhc3R0aXRsZVtMQVNUX1dSSVRFUl0pKQorICAgICAgICAgIG51bT1oOworICAgIH0KKyAgICBpZiAobnVtPDApCisgICAgICByZXR1cm4gbm90aWZ5X2ZhaWwoIktvbm50ZSBBcnRpa2VsIG5pY2h0IHdpZWRlcmZpbmRlbiwgIgorICAgICAgICAgICJiaXR0ZSBnaWIgZGllIE51bW1lciBhbi5cbiIpLDA7CisgIH0KKyAgTUFJTEVSLT5kb19tYWlsKCByZWMsCisgICAgICAiTVBBOiAiK21lc3NhZ2VzW251bV1bTV9USVRMRV0rIiAoIittZXNzYWdlc1tudW1dW01fV1JJVEVSXSsiKSIsCisgICAgICBNZXNzYWdlMnN0cmluZyhudW0sbWVzc2FnZXMsTTJTX1JFTU9URSxncm91cCkrIlxuIik7CisgIHJldHVybiAxOworfQorCisKKworSGVscFBhZ2Uoc3RyKSB7CisgIGlmIChzdHIhPSJtcGEiJiZzdHIhPSJ6ZWl0dW5nIikgcmV0dXJuIDA7CisgIHRoaXNfcGxheWVyKCktPk1vcmUocmVhZF9maWxlKEhFTFBQQUdFKSsKKyAgICAgIChJU19MRUFSTkVSKFRQKSA/IHJlYWRfZmlsZShXSVpIRUxQUEFHRSkgOiAiIikpOworICByZXR1cm4gMTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3Byb3RlY3RlZCB2b2lkIE5vdGlmeU1vdmUob2JqZWN0IGRlc3QsIG9iamVjdCBvbGRlbnYsIGludCBtZXRob2QpIHsKKyAgOjpOb3RpZnlNb3ZlKGRlc3QsIG9sZGVudiwgbWV0aG9kKTsKKworICAvLyBQX1JFQURfTkVXUyBhdXMgZGVtIFNwaWVsZXIgaG9sZW4uCisgIGlmIChvYmplY3RwKGVudmlyb25tZW50KCkpICYmIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoZW52aXJvbm1lbnQoKSkpIHsKKyAgICByZWFkX3VudGlsPWVudmlyb25tZW50KCktPlF1ZXJ5UHJvcChQX1JFQURfTkVXUyk7CisgIH0KKworICBpZiAoIW1hcHBpbmdwKHJlYWRfdW50aWwpIHx8ICFzaXplb2YocmVhZF91bnRpbCkpCisgICAgSW5pdGlhbFN1YnNjcmlwdGlvbnMoKTsKK30KKworaW50IEdldFRJRChtaXhlZCBtZXNzYWdlKSB7CisgIHN0cmluZyBkdW1teTsKKyAgaW50IHRpZDsKKyAgcmV0dXJuIChzc2NhbmYobWVzc2FnZVtNX01FU1NBR0VdLCIlcyIgU1RBVFVTRVNDQVBFICIgdGlkPSVkIixkdW1teSx0aWQpPT0yKSAKKyAgICA/IHRpZCA6IG1lc3NhZ2VbTV9USU1FXTsKK30KKwpkaWZmIC0tZ2l0IGEvb2JqL3BsYXllcmRhdGEuYyBiL29iai9wbGF5ZXJkYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUyNzI5YgotLS0gL2Rldi9udWxsCisrKyBiL29iai9wbGF5ZXJkYXRhLmMKQEAgLTAsMCArMSwxMDQgQEAKKy8vIERpZXNlcyBEaW5nIGtyaWVndCBkaWUgVUlEIHZvbSBDbG9uZW5kZW4uCisvLyBEZXIgTWFzdGVyIGV4cG9ydGllcnQgYWxsZXJkaW5ncyBwZXIgZXhwb3J0X3VpZCgpIGdnZi4gZWluZSBVSUQgYW4gZGllc2VzCisvLyBPYmpla3QuCisvLyBBYmZyYWdlbiBrYW5uIGVzIG51ciBkYXMgT2JqZWt0LCB3ZWxjaGVzIGRlbiBTcGllbGVyIGdlbGFkZW4gaGF0LgorCisjcHJhZ21hIG5vX2luaGVyaXQsbm9fc2hhZG93CisjcHJhZ21hIHN0cm9uZ190eXBlcyxzYXZlX3R5cGVzLHJ0dF9jaGVja3MKKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorCitpbmhlcml0ICIvc3RkL3RoaW5nL3Byb3BlcnRpZXMiOworCitvYmplY3R8c3RyaW5nIHBsOworb2JqZWN0IHVzZXI7CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7CisgIHNldGV1aWQoMCk7CisgIHNldF9uZXh0X3Jlc2V0KDMwMCk7Cit9CisKK3B1YmxpYyBpbnQgUmVsZWFzZVBsYXllcigpCit7CisgIHBsID0gMDsKKyAgdXNlciA9IDA7CisgIC8vIERhcyBPYmpla3QgZGFyZiBrZWluZSBFVUlEIG1laHIgaGFiZW4sIGRhbWl0IFJPT1QtT2JqZWt0ZSBpaG0gZ2dmLiBlaW5lCisgIC8vIG5ldWUgVUlEIGV4cG9ydGllcmVuIGtvZW5uZW4sIGRhbWl0IGVzIGVpbmVuIG5ldWVuIFNwaWVsZXIgbGFkZW4ga2Fubi4KKyAgc2V0ZXVpZCgwKTsKKyAgcmV0dXJuIDE7Cit9CisKK3B1YmxpYyBpbnQgTG9hZFBsYXllcihzdHJpbmcgbmFtZSkKK3sKKyAgaWYgKHF1ZXJ5X3dpel9sZXZlbChnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpKSA8IFdJWkFSRF9MVkwpCisgICAgcmV0dXJuIDA7CisKKyAgc2V0ZXVpZChnZXR1aWQoKSk7CisKKyAgbWl4ZWQgdXNlcmluZm89TUFTVEVSLT5nZXRfdXNlcmluZm8obmFtZSk7CisgIGlmICghcG9pbnRlcnAodXNlcmluZm8pKQorICAgIHJldHVybiAwOworICAvLyBXZW5uIGVzIGRhcyBTcGllbGVyb2JqZWt0IGdpYnQsIGlzdCBhbGxlcyBndXQsIGRhbm4gZnJhZ2VuIHdpciBlaW5mYWNoCisgIC8vIGRhcy4KKyAgcGwgPSBmaW5kX3BsYXllcihuYW1lKSB8fCBmaW5kX25ldGRlYWQobmFtZSk7CisgIGlmICghcGwpCisgIHsKKyAgICAvLyB3ZW5uIG5pY2h0OiBTYXZlZmlsZSBlaW5sZXNlbi4KKyAgICByZXN0b3JlX29iamVjdCgiLyJTQVZFUEFUSCArIG5hbWVbMC4uMF0gKyAiLyIgKyBuYW1lKTsKKyAgICBwbCA9IG5hbWU7CisgIH0KKyAgdXNlciA9IHByZXZpb3VzX29iamVjdCgpOworICBzZXRfbmV4dF9yZXNldCgzMDApOworICByZXR1cm4gMTsKK30KKworcHVibGljIHZhcmFyZ3MgbWl4ZWQgUXVlcnkoIHN0cmluZyBuYW1lLCBpbnQgVHlwZSApCit7CisgIGlmICghdXNlciB8fCB1c2VyICE9IHByZXZpb3VzX29iamVjdCgpKQorICAgIHJldHVybiAwOworCisgIGlmIChvYmplY3RwKHBsKSkKKyAgICByZXR1cm4gcGwtPlF1ZXJ5KG5hbWUsVHlwZSk7CisgIGVsc2UgaWYgKHN0cmluZ3AocGwpKQorICAgIHJldHVybiA6OlF1ZXJ5KG5hbWUsIFR5cGUpOworICByZXR1cm4gMDsKK30KKworcHVibGljIHZhcmFyZ3MgbWl4ZWQgUXVlcnlQcm9wKCBzdHJpbmcgbmFtZSApCit7CisgIGlmICghdXNlciB8fCB1c2VyICE9IHByZXZpb3VzX29iamVjdCgpKQorICAgIHJldHVybiAwOworCisgIGlmIChvYmplY3RwKHBsKSkKKyAgICByZXR1cm4gcGwtPlF1ZXJ5UHJvcChuYW1lKTsKKyAgZWxzZSBpZiAoc3RyaW5ncChwbCkpCisgICAgcmV0dXJuIDo6UXVlcnlQcm9wKG5hbWUpOworICByZXR1cm4gMDsKK30KKworCisvLyBrZWluIFNjaHJlaWJ6dWdyaWZmCitwdWJsaWMgdmFyYXJncyBtaXhlZCBTZXQoIHN0cmluZyBuYW1lLCBtaXhlZCBWYWx1ZSwgaW50IFR5cGUsIGludCBleHRlcm4gKQoreworICByZXR1cm4gMDsKK30KKworcHVibGljIHZvaWQgcmVzZXQoKQoreworICBpZiAoY2xvbmVwKHRoaXNfb2JqZWN0KCkpKQorICAgIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOworfQorCitwdWJsaWMgaW50IGNsZWFuX3VwKGludCByZWYpCit7CisgIGlmIChjbG9uZXAodGhpc19vYmplY3QoKSkKKyAgICAgIHx8IHJlZiA8PSAxICkKKyAgeworICAgIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOworICB9CisgIHJldHVybiAxOworfQorCmRpZmYgLS1naXQgYS9vYmovc2VlcmNhcmQuYyBiL29iai9zZWVyY2FyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNTRkNzQKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovc2VlcmNhcmQuYwpAQCAtMCwwICsxLDIgQEAKKyNwcmFnbWEgbm9fY2xvbmUKKwpkaWZmIC0tZ2l0IGEvb2JqL3NodXQuYyBiL29iai9zaHV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE4MjY5NAotLS0gL2Rldi9udWxsCisrKyBiL29iai9zaHV0LmMKQEAgLTAsMCArMSwzNzcgQEAKKy8qIFNodXRkb3duLURhZW1vbiAtLSBkaWUgTWVzc2FnZXMgbXVlc3NlbiB3b2hsIG5vY2htYWwgdWViZXJhcmJlaXRldCB3ZXJkZW4gKi8KKy8qCisgKiAgMDQuMDQuMjAwNCAgIFZhbmlvbiAgZGllKCkgdWViZXJzY2hyaWViZW4sIGlnbm9yaWVyYmFyIGdlbWFjaHQKKyAqICAxNS4wMS4yMDAwICAgVGlhbWFrICBhdWZnZXJhZXVtdCwgc2ljaGVyZXIgZ2VtYWNodCAKKyAqICAxNS4wMi4xOTk4ICAgV2FyZ29uICBBcm1hZ2VkZG9uIHRlaWx0IGVpbmVtIGRpZSBSZXN0emVpdCBtaXQKKyAqICAwNy4wMS4xOTk4ICAgICAgICAgUnVtYXRhICBJU19FTERFUiBhdXNnZWJhdXQuCisgKgorICogIDIzLjA3LjE5OTcgICAgICAgICAxNy4wMCAgICAgICAgIFlhbnRybworICogICAgSWNoIGhhYiBtYWwgZGllIHNob3V0cyBaZWl0YWJoYWVuZ2lnIGdlbWFjaHQsIGFsc28gc2llIHNvbGx0ZW4KKyAqICAgIGhlZnRpZ2VyIHdlcmRlbiBtaXQgQW5uYWVoZXJ1bmcgYW4gZGVuIFJlYm9vdC4gRGVzd2VnZW4gZ2lidAorICogICAgZXMgbnVuIDQgYXJyYXlzIG1pdCBtZXNzYWdlcyB1bmQgZGllIEVudHNwcmVjaGVuZGUgQXVmcnVmYWVuZGVydW5nCisgKiAgICBpbiBBcm1hc1Nob3V0KCkKKyAqLworCisjcHJhZ21hIGNvbWJpbmVfc3RyaW5ncworI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIG5vX2luaGVyaXQKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgbm9fc2hhZG93CisKK2luaGVyaXQgInN0ZC9ucGMiOworCisjZGVmaW5lIFNfUFJFU0FZIDEKKyNkZWZpbmUgU19JR05PUkUgMgorCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgIi9zZWN1cmUvd2l6bGV2ZWxzLmgiCisKKyNkZWZpbmUgbWVzc2FnZXMxICh7IFwKKyAgIldvbGtlbiBiYWxsZW4gc2ljaCBhbSBIaW1tZWwuIEVzIHNjaGVpbnQgd29obCBlaW4gVW53ZXR0ZXIgYXVmenV6aWVoZW4uICIgXAorICAiRHUgaGFzdCBlaW4gdW5ndXRlcyBHZWZ1ZWhsIGluIERlaW5lciBIYXV0LiIsIFwKKyAgIkF1cyBkZXIgRmVybmUgaG9lcnN0IER1IGVpbiBEb25uZXJuIC4uLiBvYiBkYXMgZWluIEdld2l0dGVyIGlzdD8iLCBcCisgICJXb2xrZW4gemllaGVuIHNjaG5lbGwgdm9yYmVpIHVuZCB2ZXJkdW5rZWxuIGRpZSBTb25uZSB1bmQgZGllIFN0ZXJuZS4gIiBcCisgICJEaWVzIHNjaGVpbnQga2VpbmVzIGRlciBub3JtYWxlbiBVbndldHRlciB6dSBzZWluLCBkaWUgRHUgc2Nob24gZXJsZWJ0ICIgXAorICAiaGFzdC4iLCBcCisgICJEYXMgZmVybmUgUmF1c2NoZW4gZGVyIEJhZWNoZSB1bmQgRmx1ZXNzZSB3aXJkIGxhdXRlci4gRGllIFdhc3Nlcm1hc3NlbiAiIFwKKyAgInNjaGVpbmVuIG5pY2h0IG1laHIga29udHJvbGxpZXJ0IHp1IGZsaWVzc2VuIHVuZCBEdSBiZWtvbW1zdCBBbmdzdCEiLCBcCisgICJEZXIgSGltbWVsIGZhZXJidCBzaWNoIHZpb2xldHQuIERhcyBVbndldHRlciBzY2hlaW50IGdld2FsdGlnZXIgenUgIiBcCisgICJ3ZXJkZW4gYWxzIHNvbnN0LiBEaXIgbGFldWZ0IGVpbiBTY2hhdWVyIHVlYmVyIGRlbiBSdWVja2VuLiIgXAorICB9KQorCisjZGVmaW5lIG1lc3NhZ2VzMiAoeyBcCisgICJEaWUgV29sa2VuIHZlcmR1bmtlbG4gZGVuIEhpbW1lbC4gRXMgd2lyZCB1ZWJlcmFsbCBkdWVzdGVyIGluIGRlciBXZWx0ICIgXAorICAidW5kIER1IGthbm5zdCBrYXVtIG5vY2ggZXJrZW5uZW4sIHdhcyB1bSBEaWNoIGhlcnVtIGdlc2NoaWVodC4iLCBcCisgICJFaW4gc3RhcmtlciBXaW5kIHdlaHQgZHVyY2ggYWxsZSBHZWdlbmRlbiB1bmQgemVycnQgYW4gYWxsZW0sIHdhcyBuaWNodCAiIFwKKyAgImZlc3QgaXN0LiBIb2ZmZW50bGljaCB3aXJkIGRhcyBuaWNodCBub2NoIHNjaGxpbW1lci4iLCBcCisgICJSZWdlbiBwcmFzc2VsdCB1ZWJlcmFsbCBuaWVkZXIgdW5kIGZ1ZWxsdCBkaWUgQmFlY2hlIHVuZCBTZWVuLCBkaWUgZGFzICIgXAorICAiV2Fzc2VyIGFiZXIga2F1bSBub2NoIGhhbHRlbiBrb2VubmVuLiBEdSB2ZXJzdWNodCBlaW5lIHRyb2NrZW5lIFN0ZWxsZSAiIFwKKyAgInp1IGZpbmRlbi4iLCBcCisgICJEZXIgSGltbWVsIGlzdCBmYXN0IHNjaHdhcnouIERlciBSZWdlbiBmYWVsbHQgaW4gZWluZXIgTWVuZ2UsIGFscyBoYWV0dGVuICIgXAorICAiYWxsZSBTY2hsZXVzZW4gZGVyIFdlbHQgZ2VvZWZmbmV0LCB1bSBzaWUgZnVlciBpbW1lciB6dSBlcnRyYWVua2VuLiIsIFwKKyAgIkRpZSBMdWZ0IHNjaGVpbnQgenUga25pc3Rlcm4hIERhcyBFbmRlIGRlcyBVbndldHRlcnMgaXN0IHNpY2hlciBub2NoIG5pY2h0ICJcCisgICJpbiBTaWNodC4gRWxla3RyaXppdGFldCBlbnRsYWVkdCBzaWNoIGltIEhpbW1lbCB6d2lzY2hlbiBkZW4gV29sa2VuLiAiIFwKKyAgIldhcyBmdWVyIGVpbiBMaWNodHNwaWVsISIsIFwKKyAgIkJsaXR6IHVuZCBEb25uZXIgaGFsbGVuIGR1cmNoIGRpZSBXZWx0LiBFcyBzY2hlaW50IGtlaW5lIFN0ZWxsZSB6dSBnZWJlbiwgIiBcCisgICJhbiBkZXIgbWFuIHNpY2hlciBzZWluIGthbm4uIiBcCisgIH0pCisKKyNkZWZpbmUgbWVzc2FnZXMzICh7IFwKKyAgIkR1IHNpZWhzdCwgd2llIGRpZSBFaW53b2huZXIgZGVyIFdlbHQgdmVyc3VjaGVuLCBzaWNoIHBhbmlzY2ggdm9yIGRlbSAiIFwKKyAgIlVud2V0dGVyIHp1IHJldHRlbiwgYWJlciBlcyBpc3QgZnVlciBzaWUgenUgc3BhZXQuIiwgXAorICAiQmxpdHplIG5pZSBnZXNlaGVuZXIgR2V3YWx0IHNjaGxhZ2VuIHJ1bmQgdW0gRGljaCBlaW4uIEZldWVyIGZsYW1tZW4gYXVmICIgXAorICAidW5kIHNjaGVpbmVuIGFsbGVzIHZlcmJyZW5uZW4genUgd29sbGVuLCB3YXMgdW0gRGljaCBoZXJ1bSBleGlzdGllcnQuIiwgXAorICAiRGlja2UgV29sa2VuIHR1ZXJtZW4gc2ljaCBpbW1lciB3ZWl0ZXIgYXVmIHVuZCBzY2hlaW5lbiBEaWNoIGVyZHJ1ZWNrZW4genUgIlwKKyAgIndvbGxlbi4gU2llIHNpbmQgbmljaHQgbWVociBzY2h3YXJ6LCBzb25kZXJuIGJsdXRyb3Qgd2llIGRhcyBXYXNzZXIsIHdhcyAiIFwKKyAgInNpZSB2b24gc2ljaCBnZWJlbi4iLCBcCisgICJEaWUgRmx1ZXNzZSB1bmQgTWVlcmUgZGVyIFdlbHQgdHJldGVuIHVlYmVyIGlocmUgVWZlciB1bmQgemVyc3RvZXJlbiBhbGxlcyAiXAorICAiTGViZW4uIERhcyBXYXNzZXIgaGF0IHNpY2ggenUgQmx1dCBnZXdhbmRlbHQhIFVtIERpY2ggaGVydW0gd2lyZCBhbGxlcyAiIFwKKyAgInJvdCEiLCBcCisgICJEZXIgRG9ubmVyIGdyb2xsdCBtaXQgcm9oZXIgR2V3YWx0IGR1cmNoIGRpZSBXZWx0LiBEaWUgU2NoYWxsd2VsbGVuICIgXAorICAic2NobGFnZW4gbWl0IGFsbGVyIEtyYWZ0IGdlZ2VuIGRpZSBHZWJpcmdlIHVuZCBzY2hlaW5lbiBzaWUgcmVpemVuIHp1ICIgXAorICAid29sbGVuLiBEdSBrcmllZ3N0IEFuZ3N0ISIsIFwKKyAgIkRlciBSZWdlbiBmYWVyYnQgc2ljaCByb3QhIERhcyBpc3Qga2VpbiBXYXNzZXIgbWVociwgc29uZGVybiBCbHV0LCB3YXMgZGEgIiBcCisgICJhdWYgRGljaCBoZXJhYnJlZ25ldC4gRGlyIHNjaHdpbmRlbiBrdXJ6IGRpZSBTaW5uZSBiZWltIEdlZGFua2VuIGFuIGRhcywgIiBcCisgICJ3YXMgbm9jaCBrb21tZW4gbWFnLiIgXAorICB9KQorCisjZGVmaW5lIG1lc3NhZ2VzNCAoeyBcCisgICJEYXMgQmx1dCBkZXMgUmVnZW5zIHNjaGVpbnQgRGljaCBmb3J0enVzY2h3ZW1tZW4uIFVlYmVyYWxsIGlzdCBkYXMgQmx1dCAiIFwKKyAgInVlYmVyIGRpZSBVZmVyIGdldHJldGVuIHVuZCBzdWNodCBzaWNoIHNlaW5lbiB0b2VkbGljaGVuIFdlZy4iLCBcCisgICJEaWUgVnVsa2FuZSBkZXIgV2VsdCBicmVjaGVuIGF1cyB1bmQgZGllIExhdmEgdmVyYnJlbm50IGFsbGVzLCB3YXMgc2ljaCAiIFwKKyAgImlociBpbiBkZW4gV2VnIHN0ZWxsdC4gU2llIGJyaW5ndCBkYXMgQmx1dCB6dW0gVmVyZGFtcGZlbiB1bmQgZXJmdWVsbHQgIiBcCisgICJhbGxlcyBtaXQgaWhyZXIgemVyc3RvZXJlcmlzY2hlbiwgZ3JhdXNhbWVuIEhpdHplLiIsIFwKKyAgIlBsb2V0emxpY2ggaXN0IGFsbGVzIG1pdCBGZXVlciB1bmQgSGl0emUgZXJmdWVsbHQuIERpZSBNZWVyZSB1bmQgIiBcCisgICJGbHVlc3NlIHZlcmRhbXBmZW4gdW5kIGRlciBEYW1wZiB0cmVpYnQgaGVpc3MgdWViZXIgZGllIFdlbHQsIHVtIGFsbGVzICIgXAorICAienUgdmVyYnJ1ZWhlbiwgd2FzIHNpY2ggbmljaHQgc2NodWV0enQhIiwgXAorICAiVm9uIHVlYmVyYWxsIGhvZXJzdCBEdSBTY2hyZWllIHVuZCBEdSBlcmtlbm5zdCBwYW5pc2NoZSBBbmdzdCBpbiBkZW4gIiBcCisgICJBdWdlbiBkZXIgRWluZ2Vib3JlbmVuLiBFbGVuZGlnIHZlcmVuZGVuIHNpZSBpbiBkZXIgSGl0emUgendpc2NoZW4gRmV1ZXIgIiBcCisgICJ1bmQgTGF2YS4gRGlyIHdpcmQgdWViZWwuIiwgXAorICAiVW0gRGljaCBoZXJ1bSBzaWVoc3QgRHUgbnVyIGJyZW5uZW5kZSBUcnVlbW1lci4gRGllIFdlbHQgc2NoZWludCB2b3IgIiBcCisgICJpaHJlbSBVbnRlcmdhbmcsIGRlbm4gdWViZXJhbGwgb2VmZm5ldCBzaWNoIGRlciBCb2RlbiB1bmQgc3B1Y2t0IEZldWVyLiAiIFwKKyAgIkhlaXNzZXMgTWFnbWEgcXVpbGx0IGF1cyBpaG0gaGVyYXVzIHVuZCBtaXNjaHQgc2ljaCB6aXNjaGVuZCBtaXQgZGVtIEJsdXQgIiBcCisgICJkZXIgTWVlcmUuIEVzIGdpYnQgbnVuIHNpY2hlciBrZWluIEVudHJpbm5lbiBtZWhyLiIsIFwKKyAgIkR1IGthbm5zdCBEaWNoIGthdW0gbm9jaCBoYWx0ZW4uIEVyZGJlYmVuIGVyc2NodWV0dGVybiBhbGxlcyB1bSBEaWNoICIgXAorICAiaGVydW0uIFVlYmVyYWxsIGthbm5zdCBEdSBudXIgbm9jaCBUcnVlbW1lciBlcmtlbm5lbiwgd28gZWlubWFsIEhhZXVzZXIgIiBcCisgICJzdGFuZGVuLiBBbGxlcyBpc3QgZXJmdWVsbHQgdm9tIEdlcnVjaCBkZXMgVG9kZXMhIiBcCisgIH0pCisKK3N0YXRpYyBpbnQgcmVzdHplaXQ7CitzdGF0aWMgc3RyaW5nICppZ25vcmllcmVyID0gKHt9KTsKKworc3RhdGljIGludCBfcXVlcnlfcmVzdHplaXQoKSB7IHJldHVybiByZXN0emVpdCArIGZpbmRfY2FsbF9vdXQoIk5leHRTdGVwIik7IH0KK3N0YXRpYyBzdHJpbmcgKl9xdWVyeV9pZ25vcmUoKSB7IHJldHVybiBpZ25vcmllcmVyOyB9CisKK3B1YmxpYyB2YXJhcmdzIHZvaWQgZGllKGludCBwb2lzb25kZWF0aCxpbnQgZXh0ZXJuKQoreworICBvYmplY3QgdHA7CisgIG9iamVjdCByb29tOworCisgIGlmIChvYmplY3RwKHJvb209ZW52aXJvbm1lbnQodGhpc19vYmplY3QoKSkpKQorICAgIGlmICghb2JqZWN0cCh0cD10aGlzX3BsYXllcigpKSkKKyAgICAgIHRlbGxfcm9vbShyb29tLCJBcm1hZ2VkZG9uIGtyYXR6dCBzaWNoIHJhdGxvcyBhbSBLb3BmLlxuIik7CisgICAgZWxzZSAKKyAgICAgIHRlbGxfcm9vbShyb29tLAorICAgICAgICAiQXJtYWdlZGRvbiBzYWd0OiBJY2ggd2VpZ2VyZSBtaWNoLCBlaW5mYWNoIHNvIHp1IHN0ZXJiZW4sICIrCisgICAgICAgICh0cC0+TmFtZSgpKSsiLlxuIik7CisgIHJldHVybjsKK30KKworc3RhdHVzIGFjY2Vzc19jaGVjaygpIHsKKyAgICAvL3dlciBkYXJmIHJlYm9vdGVuPworCisgICAgLy9pbiBlaW5lbSBwcm9jZXNzX3N0cmluZygpIGdhciBuaWNodC4KKyAgICBpZiAocHJvY2Vzc19jYWxsKCkpIHJldHVybigwKTsKKworICAgIC8vTWFzdGVyIGRhcmYgbmF0dWVybGljaC4gKC0+c2xvd19zaHV0X2Rvd24oKSwgdm9tIERyaXZlciBiZWkKKyAgICAvL1NwZWljaGVya25hcHBoZWl0IGdlcnVmZW4uKQorICAgIGlmIChwcmV2aW91c19vYmplY3QoKSAmJiAKKyAgICAgICAgcHJldmlvdXNfb2JqZWN0KCk9PWZpbmRfb2JqZWN0KF9fTUFTVEVSX09CSkVDVF9fKSkKKyAgICAgICAgcmV0dXJuKDEpOworCisgICAgLy8gcmVib290ZW4gZHVlcmZlbiBhbnNvbnN0ZW4gbnVyIFtXXSsKKyAgICBpZiAoIEVMREVSX1NFQ1VSSVRZKSB7CisgICAgICAgIHJldHVybigxKTsKKyAgICB9CisKKyAgICAvL2FuZGVyZSBuaWNodC4KKyAgICByZXR1cm4oMCk7Cit9CisKK3B1YmxpYyB2b2lkIGNyZWF0ZSgpCit7ICAgIAorICAgIDo6Y3JlYXRlKCk7CisgICAgCisgICAgU2V0UHJvcCggUF9OQU1FLCAiQXJtYWdlZGRvbiIgKTsKKyAgICBTZXRQcm9wKCBQX0dFTkRFUiwgTUFMRSApOworICAgIFNldFByb3AoIFBfU0hPUlQsICJBcm1hZ2VkZG9uLCBkZXIgV2VsdGVudmVybmljaHRlciIgKTsKKyAgICBBZGRJZCggImFybWFnZWRkb24iICk7CisgICAgc2V0X2xpdmluZ19uYW1lKCAiYXJtYWdlZGRvbiIgKTsKKyAgICBTZXRQcm9wKCBQX0FSVElDTEUsIDAgKTsKKyAgICBTZXRQcm9wKCBQX1hQLCAwICk7CisgICAgU2V0UHJvcCggUF9OT19BVFRBQ0ssCisgICAgICAgICAgICAgIkFybWFnZWRkb24gZ3JpbnN0OiBEZWluIEVuZGUga29tbXQgbm9jaCBmcnVlaCBnZW51ZyFcbiIgKTsKKworICAgIGlmICghYWNjZXNzX2NoZWNrKCkpIHsKKyAgICAgICAgZGVzdHJ1Y3QodGhpc19vYmplY3QoKSk7CisgICAgICAgIHJhaXNlX2Vycm9yKCJBcm1hZ2VkZG9uIGRhcmYgbnVyIHZvbiBXKyBha3RpdmllcnQgd2VyZGVuISIpOworICAgIH0KK30KKworCitzdGF0aWMgdmFyYXJncyBzdHJpbmcgdGV4dF90aW1lKCBpbnQgc2VjLCBpbnQgZmxhZyApCit7CisgICAgc3RyaW5nIHM7CisgICAgaW50IHRhZ2UsIHN0dW5kZW4sIG1pbnV0ZW4sIHNla3VuZGVuOworCisgICAgc2VrdW5kZW4gPSBzZWM7CisgICAgdGFnZSA9IHNla3VuZGVuIC8gODY0MDA7CisgICAgc3R1bmRlbiA9IChzZWt1bmRlbiAlIDg2NDAwKSAvIDM2MDA7CisgICAgbWludXRlbiA9IChzZWt1bmRlbiAlIDM2MDApIC8gNjA7CisgICAgc2VrdW5kZW4gPSBzZWMgJSA2MDsKKyAgICBzID0gIiI7CisgICAgCisgICAgaWYgKCBzZWMgPj0gODY0MDAgKQorICAgICAgICBzICs9IHRhZ2UgKyAiIFRhZyIgKyAodGFnZSA9PSAxID8gIiwgIiA6IChmbGFnID8gImVuLCAiIDogImUsICIpKTsKKyAgICAKKyAgICBpZiAoIHNlYyA+PSAzNjAwICkKKyAgICAgICAgcyArPSBzdHVuZGVuICsgIiBTdHVuZGUiICsgKHN0dW5kZW4gPT0gMSA/ICIsICIgOiAibiwgIik7CisgICAgCisgICAgaWYgKCBzZWMgPj0gNjAgKQorICAgICAgICBzICs9IG1pbnV0ZW4gKyAiIE1pbnV0ZSIgKyAobWludXRlbiA9PSAxID8gIiIgOiAibiIpOworICAgIAorICAgIHMgKz0gKHNlYy82MCA/ICIgdW5kICIgOiAiICIpICsgc2VrdW5kZW4gKyAiIFNla3VuZGUiICsKKyAgICAgICAgKHNla3VuZGVuID09IDEgPyAiIiA6ICJuIik7CisgICAgCisgICAgcmV0dXJuIHM7Cit9CisKKworcHVibGljIHN0cmluZyBfcXVlcnlfbG9uZygpCit7CisgICAgcmV0dXJuIGJyZWFrX3N0cmluZyggIkRpZXMgaXN0IEFybWFnZWRkb24sIGRlciBXZWx0ZW52ZXJuaWNodGVyLiBBbHMgRHUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJpaG4gYW5zaWVoc3QsIGJsaWNrdCBlciBhdWYgdW5kIGZsdWVzdGVydCBEaXIgenU6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiTm9jaCAiICsgdGV4dF90aW1lKF9xdWVyeV9yZXN0emVpdCgpKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgIiBtdWVzc2VuIHZlcmdlaGVuLCBlaGUgaWNoIGRpZSBXZWx0IHZlcm5pY2h0ZS4iLCA3OCApOworfQorCisKK3B1YmxpYyBzdHJpbmcgX3F1ZXJ5X3Nob3J0KCkKK3sKKyAgICByZXR1cm4gIkFybWFnZWRkb24sIGRlciBXZWx0ZW52ZXJuaWNodGVyIjsKK30KKworCitwdWJsaWMgaW50IHNodXQoIG1peGVkIG1pbnV0ZXMgKQoreworICAgIGludCBhLCBiLCBjOworCisgICAgaWYgKCFhY2Nlc3NfY2hlY2soKSkgeworICAgICAgICBkZXN0cnVjdCh0aGlzX29iamVjdCgpKTsKKyAgICAgICAgcmFpc2VfZXJyb3IoIkFybWFnZWRkb24gZGFyZiBudXIgdm9uIFcrIGFrdGl2aWVydCB3ZXJkZW4hIik7CisgICAgICAgIHJldHVybigtMSk7ICAgLy9uZXZlciByZWFjaGVkCisgICAgfQorICAgIAorICAgIGEgPSBiID0gYyA9IDA7CisgICAgbW92ZSggIi9naWxkZW4vYWJlbnRldXJlciIsIE1fR08gKTsKKyAgICAKKyAgICBpZiAoIGludHAobWludXRlcykgKQorICAgICAgICBjID0gbWludXRlczsKKyAgICBlbHNlIGlmICggc3RyaW5ncChtaW51dGVzKSApeworICAgICAgICBpZiAoIHNzY2FuZiggbWludXRlcywgIiVkOiVkOiVkIiwgYSwgYiwgYyApID09IDMgKQorICAgICAgICAgICAgYyArPSBiICogNjAgKyBhICogMjQgKiA2MDsKKyAgICAgICAgZWxzZSBpZiggc3NjYW5mKCBtaW51dGVzLCAiJWQ6JWQiLCBiLCBjKSA9PSAyICkKKyAgICAgICAgICAgIGMgKz0gYiAqIDYwOworICAgICAgICBlbHNlIGlmKCBzc2NhbmYoIG1pbnV0ZXMsICIlZCIsIGMgKSAhPSAxICkKKyAgICAgICAgICAgIHJldHVybiAtMjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBkZXN0cnVjdChNRSk7CisgICAgICByYWlzZV9lcnJvcigiSWxsZWdhbCBhcmd1bWVudCB0eXBlIHRvIHNodXQoKVxuIik7CisgICAgfQorCisgICAgd2hpbGUgKCByZW1vdmVfY2FsbF9vdXQoIk5leHRTdGVwIikgPj0gMCApCisgICAgICAgIDsKKyAgICAKKyAgICByZXN0emVpdCA9IGMgKiA2MDsKKyAgICBjYWxsX291dCggIk5leHRTdGVwIiwgMCwgcmVzdHplaXQgKTsKKyAgICByZXR1cm4gcmVzdHplaXQ7Cit9CisKKy8vIFNjaGlja3QgZGllIE1lbGR1bmcgc3RyIGFuIGFsbGUgU3BpZWxlciwgZGllIEFybWFnZWRkb24gbmljaHQgaWdub3JpZXJlbgorLy8gRmxhZ3M6IFNfSUdOT1JFIC0gU2hvdXQga2FubiB2b24gU3BpZWxlcm4gaWdub3JpZXJ0IHdlcmRlbi4KKy8vICAgICAgICBTX1BSRVNBWSAtIEVzIHdpcmQgZWluICJBcm1hZ2VkZG9uIHJ1ZnQ6IiB2b3Jhbmdlc3RlbGx0Lgorc3RhdGljIHZvaWQgU0hPVVQoIHN0cmluZyBzdHIsIGludCBmbGFncyApCit7CisgICBpZiAoZmxhZ3MmU19QUkVTQVkpCisgICAgIHN0ciA9IGJyZWFrX3N0cmluZyhzdHIsIDc4LCAiQXJtYWdlZGRvbiBydWZ0OiAiKTsKKyAgIGVsc2UKKyAgICAgc3RyID0gYnJlYWtfc3RyaW5nKHN0ciwgNzgpOworICAgICAKKyAgIGlmIChmbGFncyZTX0lHTk9SRSkKKyAgICAgZmlsdGVyKAorICAgICAgIHVzZXJzKCktZmlsdGVyX29iamVjdHModXNlcnMoKSwiVGVzdElnbm9yZSIsKHsiYXJtYWdlZGRvbiJ9KSkKKyAgICAgICAgICAgICAgLW1hcChpZ25vcmllcmVyLCAjJ2ZpbmRfcGxheWVyKSwKKyAgICAgICAjJ3RlbGxfb2JqZWN0LCBzdHIpOworICAgZWxzZQorICAgICBmaWx0ZXIoIHVzZXJzKCksICMndGVsbF9vYmplY3QsIHN0cik7Cit9CisKKworc3RhdGljIHZvaWQgTmV4dFN0ZXAoIGludCBzZWNvbmRzICkKK3sKKyAgICBpbnQgbmV1OworCisgICAgaWYgKCBzZWNvbmRzIDw9IDAgKXsKKyAgICAgICAgU0hPVVQoICJJY2ggc3RhcnRlIGRhcyBTcGllbCBqZXR6dCBuZXUgISIsIFNfUFJFU0FZKTsKKyAgICAgICAgc2h1dGRvd24oIiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIGlmICggc2Vjb25kcyA8PSA2MDAgKQorICAgICAgU0hPVVQoICJUZWlsZSBtaXIgbWl0LCB3ZW5uIER1IGluIGRlbiBMYWRlbiBnZWJyYWNodCB3ZXJkZW4gd2lsbHN0ISIsIAorICAgICAgICAgICAgICBTX1BSRVNBWXxTX0lHTk9SRSk7CisgICAgCisgICAgaWYgKCBzZWNvbmRzID4gMiAqIDg2NDAwICkKKyAgICAgICAgbmV1ID0gc2Vjb25kcyAtIDUgKiAzNjAwOworICAgIGVsc2UgaWYgKCBzZWNvbmRzID4gNDgwMCApCisgICAgICAgIG5ldSA9IHNlY29uZHMgLSAxODAwOworICAgIGVsc2UKKyAgICAgICAgbmV1ID0gc2Vjb25kcyAqIDMgLyA0IC0gMTA7CisgICAgCisgICAgcmVzdHplaXQgPSBuZXU7CisgICAgY2FsbF9vdXQoICJOZXh0U3RlcCIsIHNlY29uZHMtbmV1LCBuZXUgKTsKKyAgICAKKyAgICBTSE9VVCggIkluICIgKyB0ZXh0X3RpbWUoIHNlY29uZHMsIDEgKSArICIgd2VyZGUgaWNoIGRpZSBXZWx0ICIKKyAgICAgICAgICAgInplcnN0b2VyZW4gdW5kIG5ldSBlcnNjaGFmZmVuISIsIFNfUFJFU0FZfFNfSUdOT1JFKTsKKyAgICAKKyAgICBpZiAoIG5ldSA8IDkwMCAmJiBmaW5kX2NhbGxfb3V0KCJBcm1hc1Nob3V0IikgPT0gLTEgKQorICAgICAgICBjYWxsX291dCggIkFybWFzU2hvdXQiLCByYW5kb20oNjApKzEwICk7Cit9CisKKworc3RhdGljIHZvaWQgQXJtYXNTaG91dCgpCit7CisgICAgaW50IGRhdWVyOworICAgIAorICAgIGRhdWVyID0gX3F1ZXJ5X3Jlc3R6ZWl0KCk7CisgICAgY2FsbF9vdXQoICJBcm1hc1Nob3V0IiwgNDArcmFuZG9tKDQwKSApOworICAgIAorICAgIGlmICggNzAxIDwgZGF1ZXIgKQorICAgICAgICBTSE9VVCggbWVzc2FnZXMxWyByYW5kb20oc2l6ZW9mKG1lc3NhZ2VzMSkpXSwgU19JR05PUkUpOworICAgIGVsc2UgaWYgKCA1MDEgPCBkYXVlciApCisgICAgICAgIFNIT1VUKCBtZXNzYWdlczJbIHJhbmRvbShzaXplb2YobWVzc2FnZXMyKSldLCBTX0lHTk9SRSk7CisgICAgZWxzZSBpZiAoIDI1MSA8IGRhdWVyICkKKyAgICAgICAgU0hPVVQoIG1lc3NhZ2VzM1sgcmFuZG9tKHNpemVvZihtZXNzYWdlczMpKV0sIFNfSUdOT1JFKTsKKyAgICBlbHNlCisgICAgICAgIFNIT1VUKCBtZXNzYWdlczRbIHJhbmRvbShzaXplb2YobWVzc2FnZXM0KSldLCBTX0lHTk9SRSk7Cit9CisKKworcHVibGljIHZvaWQgY2F0Y2hfdGVsbCggc3RyaW5nIHN0ciApCit7CisgICAgc3RyaW5nIHdobywgd2hhdDsKKyAgICBvYmplY3Qgb2I7CisKKyAgICBpZiAoIHNzY2FuZiggc3RyLCAiJXMgdGVpbHQgRGlyIG1pdDogJXMiLCB3aG8sIHdoYXQgKSAhPSAyIHx8CisgICAgICAgICAhdGhpc19wbGF5ZXIoKSApCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICAvLyBFaW4gU3BpZWxlciB3aWxsIGZ1ZXIgZGllc2VzIFJlYm9vdCBpZ25vcmllcnQgd2VyZGVuLCBvZGVyCisgICAgLy8gZGFzIElnbm9yaWVyZSBzb2xsIGF1ZmdlaG9iZW4gd2VyZGVuLgorICAgIGlmIChsb3dlcl9jYXNlKHdoYXQpWzAuLjwyXT09InJ1aGUiKXsKKyAgICAgIGlmIChtZW1iZXIoaWdub3JpZXJlciwgZ2V0dWlkKHRoaXNfcGxheWVyKCkpKT4tMSkKKyAgICAgIHsKKyAgICAgICAgIGlnbm9yaWVyZXIgLT0gKHsgZ2V0dWlkKHRoaXNfcGxheWVyKCkpIH0pOworICAgICAgICAgdGVsbF9vYmplY3QoIHRoaXNfcGxheWVyKCksIGJyZWFrX3N0cmluZygKKyAgICAgICAgICAiR3V0LCBpY2ggbm90aWVyJ3MgbWlyLiBBYiBudW4gaGFzdCBEdSB3aWVkZXIgYW0gZ3Jvc3NlbiBTaG93ZG93biAiCisgICAgICAgICAgInRlaWwuIFZpZWwgU3Bhc3MgZGFiZWkuXG4iLCA3OCwgIkFybWFnZWRkb24gdGVpbHQgRGlyIG1pdDogIikpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIGlnbm9yaWVyZXIgKz0gKHsgZ2V0dWlkKHRoaXNfcGxheWVyKCkpIH0pOworICAgICAgICAgdGVsbF9vYmplY3QoIHRoaXNfcGxheWVyKCksIGJyZWFrX3N0cmluZygKKyAgICAgICAgICAiR3V0LCBpY2ggbm90aWVyJ3MgbWlyLiBEZXIgV2VsdHVudGVyZ2FuZyBzb2xsIERpY2ggYmVpbSBTcGllbGVuICIKKyAgICAgICAgICAibmljaHQgd2VpdGVyIHN0b2VyZW4uXG4iLCA3OCwgIkFybWFnZWRkb24gdGVpbHQgRGlyIG1pdDogIikpOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgIAorICAgIC8vIEluIGRlbiBMYWRlbgorICAgIGlmICggX3F1ZXJ5X3Jlc3R6ZWl0KCkgPCA2MDAgKXsKKyAgICAgICAgdGhpc19wbGF5ZXIoKS0+bW92ZSggIi9kL2ViZW5lL3Jvb20vUG9ydFZhaW4vbGFkZW4iLCBNX1RQT1JUICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAgdGVsbF9vYmplY3QoIHRoaXNfcGxheWVyKCksCisgICAgICAgICAgICAgICAgIGJyZWFrX3N0cmluZyggIkVzIGlzdCBub2NoIHp1IGZydWVoISBQcm9iaWVyIGVzIDEwIE1pbnV0ZW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2b3IgZGVtIEVuZGUgbm9jaG1hbCFcbkluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdGltZSggX3F1ZXJ5X3Jlc3R6ZWl0KCksIDEgKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpc3QgZXMgc293ZWl0ISIsIDc4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcm1hZ2VkZG9uIHRlaWx0IERpciBtaXQ6ICIsIDEgKSApOworICAgIHJldHVybjsKK30KKworCitwdWJsaWMgdmFyYXJncyBpbnQgcmVtb3ZlKCkKK3sKKyAgICB3cml0ZSggIkFybWFnZWRkb24gd2lsbCBuaWNodCByZW1vdmVkIHdlcmRlbiFcbiIgKTsKKyAgICByZXR1cm4gMDsKK30KKworCitwdWJsaWMgaW50IGRvX2RhbWFnZSggaW50IGRhbSwgb2JqZWN0IGVuZW15ICkKK3sKKyAgICByZXR1cm4gMDsKK30KKworLy8gTmljaHQgamVkZXIgTWFnaWVyIGRhcmYgQXJtYWdlZGRvbiBkZXN0cnVjdGVuLgorc3RyaW5nIE5vdGlmeURlc3RydWN0KG9iamVjdCBjYWxsZXIpIHsKKyAgICBpZiggKGNhbGxlciE9dGhpc19vYmplY3QoKSAmJiAhRUxERVJfU0VDVVJJVFkpIHx8IHByb2Nlc3NfY2FsbCgpICkgeworICAgICAgcmV0dXJuICJEdSBkYXJmc3QgQXJtYWdlZGRvbiBuaWNodCB6ZXJzdG9lcmVuIVxuIjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL29iai9zcGVycmVyLmMgYi9vYmovc3BlcnJlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlOTRjZDgKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovc3BlcnJlci5jCkBAIC0wLDAgKzEsOTggQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyAkSWQ6IHNwZXJyZXIuYyA4NzQ3IDIwMTQtMDQtMjYgMTM6MDg6NDdaIFplc3N0cmEgJAorCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKworI2RlZmluZSBQTyBwcmV2aW91c19vYmplY3QoKQorI2RlZmluZSBUSSB0aGlzX2ludGVyYWN0aXZlKCkKKworY3JlYXRlKCkKK3sKKyAgaWYgKGNsb25lcChNRSkpCisgIHsKKyAgICB3cml0ZSgiQXV0b2Rlc3RcbiIpOworICAgIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOworICB9CisgIHVwZCgpOworfQorCit1cGQoKQoreworICBtb3ZlX29iamVjdCgiL3Jvb20vbmV0enRvdCIpOworfQorCitkZWJ1Zyh3aGF0LGFyZykKK3sKKyAgc3RyaW5nIGxvZzsKKyAgCisgIGlmICghZW52aXJvbm1lbnQoKSkKKyAgICByZXR1cm47CisgIGxvZz1zcHJpbnRmKCIlcyAlcyAlTyBQTz0lTyBQUE89JU8gVE89JU8gVEk9JU8gdmVyYj0lT1xuIiwKKyAgICAgIGR0aW1lKHRpbWUoKSksIHdoYXQsIGFyZywgCisgICAgICBwcmV2aW91c19vYmplY3QoKSwgcHJldmlvdXNfb2JqZWN0KDEpLCAKKyAgICAgIHRoaXNfb2JqZWN0KCksIHRoaXNfaW50ZXJhY3RpdmUoKSwgCisgICAgICAodGhpc19pbnRlcmFjdGl2ZSgpfHx0aGlzX3BsYXllcigpfHx0aGlzX29iamVjdCgpKS0+X3VucGFyc2VkX2FyZ3MoKSk7CisgIGxvZ19maWxlKCJOREVBRCIsbG9nKTsKKyAgCisgIGlmIChmaW5kX3BsYXllcigiam9mIikpCisgICAgdGVsbF9vYmplY3QoZmluZF9wbGF5ZXIoImpvZiIpLGxvZyk7CisgIGlmIChwcmV2aW91c19vYmplY3QoKSAmJiAKKyAgICAgICghaW50ZXJhY3RpdmUoUE8pfHxJU19MRUFSTkVSKFBPKSkgJiYgCisgICAgICBnZXR1aWQoUE8pIT1ST09USUQgJiYgUE8hPXRoaXNfb2JqZWN0KCkpCisgIHsKKyAgICBsb2dfZmlsZSgiTkRFQUQiLHNwcmludGYoIkRFTEVURUQgJU9cbiIsUE8pKTsKKyAgICBjYXRjaChQTy0+cmVtb3ZlKCkpOworICAgIGlmIChQTyAmJiAhKFBPPT10aGlzX29iamVjdCgpKSAmJiBvYmplY3RfbmFtZShQTykhPSIvc2VjdXJlL3NpbXVsX2VmdW4iKQorICAgICAgZGVzdHJ1Y3QoUE8pOworICAgIGlmIChUSSAmJiBJU19MRUFSTkVSKFRJKSkKKyAgICB7CisgICAgICB0ZWxsX29iamVjdChUSSwiTUVTU0lORyBXSVRIIE5FVERFQUQgUk9PTSAtIFNUT1BcbiIpOworICAgICAgVEktPnJlbW92ZSgpOworICAgICAgaWYgKFRJKQorICAgICAgICBkZXN0cnVjdChUSSk7CisgICAgICBsb2dfZmlsZSgiTkRFQUQiLHNwcmludGYoIlNUT1BQRUQgJU9cbiIsVEkpKTsKKyAgICB9CisgICAgcmFpc2VfZXJyb3IoIkRPTlQgTUVTUyBXSVRIIE5FVERFQURcbiIpOworICB9CisgIGVsc2UgaWYgKCBwcmV2aW91c19vYmplY3QoKSAmJiBpbnRlcmFjdGl2ZShwcmV2aW91c19vYmplY3QoKSkgKXsKKyAgICAgIHRlbGxfb2JqZWN0KCBwcmV2aW91c19vYmplY3QoKSwgIldpZSBiaXN0IER1IGRlbm4gaGllcmhpbiBnZWtvbW1lbj9cbiIKKyAgICAgICAgICAgICAgICAgICAiSWNoIHNldHogRGljaCBiZXNzZXIgbWFsIGluIGRlciBBYmVudGV1cmVyZ2lsZGUgYWIuXG4iICk7CisgICAgICBwcmV2aW91c19vYmplY3QoKS0+bW92ZSggIi9naWxkZW4vYWJlbnRldXJlciIsIE1fR098TV9OT0NIRUNLICk7CisgICAgICBsb2dfZmlsZSggIk5ERUFEIiwgc3ByaW50ZiggIk1PVkVEICVPXG4iLCBwcmV2aW91c19vYmplY3QoKSApICk7CisgIH0KK30KKworcmVzZXQoKQoreworICB1cGQoKTsKK30KKworaWQoc3RyKQoreworICBkZWJ1ZygiaWQiLHN0cik7Cit9CisKK1F1ZXJ5KHdoYXQpCit7CisgIGRlYnVnKCJxdWVyeSIsd2hhdCk7Cit9CisKK3JlbW92ZSgpCit7CisgIGRlYnVnKCJyZW1vdmUiLDApOworfQorCitsb25nKCkKK3sKKyAgZGVidWcoImxvbmciLDApOworfQorCitzaG9ydCgpCit7CisgIGRlYnVnKCJzaG9ydCIsMCk7Cit9CmRpZmYgLS1naXQgYS9vYmovdGVhbS5jIGIvb2JqL3RlYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzE5ZjVlCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3RlYW0uYwpAQCAtMCwwICsxLDE0MzIgQEAKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHNhdmVfdHlwZXMKKyNwcmFnbWEgbm9fc2hhZG93CisvLyBUT0RPOiBNb3Jnb3RoIGVyYnQgZGFzIFRlYW1vYmpla3Q6IGtsYWVyZW4gd2FydW0gdW5kIHdpZXNvIGVpZ2VudGxpY2guCisvLyNwcmFnbWEgbm9faW5oZXJpdAorI3ByYWdtYSBwZWRhbnRpYworCisjaW5jbHVkZSA8bGl2aW5nL3RlYW0uaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxuZXdfc2tpbGxzLmg+CisjaW5jbHVkZSA8YW5zaS5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2RlZmluZSBNRSB0aGlzX29iamVjdCgpCisjZGVmaW5lIFBPIHByZXZpb3VzX29iamVjdCgpCisjZGVmaW5lIFRQIHRoaXNfcGxheWVyKCkKKyNkZWZpbmUgVEkgdGhpc19pbnRlcmFjdGl2ZSgpCisKKyNkZWZpbmUgQVVUT0lORl9IUF9NSU5VUyAweDAxCisjZGVmaW5lIEFVVE9JTkZfSFBfUExVUyAgMHgwMgorI2RlZmluZSBBVVRPSU5GX1NQX01JTlVTIDB4MDQKKyNkZWZpbmUgQVVUT0lORl9TUF9QTFVTICAweDA4CisjZGVmaW5lIEFVVE9JTkZfSU5TVEFOVCAgMHgxMAorCitwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIGlzX21lbWJlcjsgICAvLyBUZWFtbWl0Z2xpZWRlcgorcHJpdmF0ZSBub3NhdmUgb2JqZWN0IGxlYWRlcjsgICAgICAgLy8gVGVhbWxlaXRlcgorcHJpdmF0ZSBub3NhdmUgc3RyaW5nIHRuYW1lOyAgICAgICAgLy8gVGVhbW5hbWUKK3ByaXZhdGUgbm9zYXZlIG1hcHBpbmcgd2FudGVkX3JvdzsgIC8vIEdld3VlbnNjaHRlIFJlaWhlCitwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIHdpbXB5X3JvdzsgICAvLyBGbHVjaHRyZWloZQorcHJpdmF0ZSBub3NhdmUgbWFwcGluZyBhY3Rfcm93OyAgICAgLy8gQWt0dWVsbGUgUmVpaGUKK3ByaXZhdGUgbm9zYXZlIG1hcHBpbmcgYXV0b2ZvbGxvdzsgIC8vIFNwaWVsZXIgZm9sZ3QgVGVhbWxlaXRlcgorcHJpdmF0ZSBub3NhdmUgbWFwcGluZyBhdHRhY2tfY21kOyAgLy8gU3BpZWxlciBoYXQgQW5ncmlmZnNiZWZlaGwKK3ByaXZhdGUgbm9zYXZlIG1hcHBpbmcgYXNzb2NfbWVtOyAgIC8vIFp1Z2VvcmRuZXRlIE1pdGdsaWVkZXIgKEthbXBmIE5QQ3MpCitwcml2YXRlIG5vc2F2ZSBpbnQgKmZvcm1pbiwqZm9ybWF4OyAvLyBGb3JtYXRpb24KK3ByaXZhdGUgbm9zYXZlIG1peGVkICpyb3dzOyAgICAgICAgIC8vIERpZSBSZWloZW4KK3ByaXZhdGUgbm9zYXZlIGludCBsYXN0X3Jlb3JkZXI7ICAgIC8vIExldHp0ZSBGb3JtYXRpb25zcHJ1ZWZ1bmcKK3ByaXZhdGUgbm9zYXZlIG1hcHBpbmcgaDsgICAgICAgICAgIC8vIFNvcnRpZXItU2NvcmU6IDEyNSpHLlJlaWhlLUhQCitwcml2YXRlIG5vc2F2ZSBvYmplY3QgKmF0dF9leGVjOyAgICAvLyBNaXRnbGllZGVyLCBkaWUgQXR0YWNrZSBhdXNmdWVocmVuLgorcHJpdmF0ZSBub3NhdmUgb2JqZWN0ICptaXNfYXR0YWNrZWQ7Ly8gKEV4LSlNaXRnbGllZGVyIG9obmUgQmVncnVlc3N1bmdzc2NobGFnCitwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIG1pc19pbml0X2F0dDsvLyBGZWhsZW5kZSBCZWdydWVzc3VuZ3NzY2hsYWVnZQorcHJpdmF0ZSBub3NhdmUgbWFwcGluZyBocF9pbmZvOyAgICAgLy8gSFAsIE1BWF9IUCwgU1AsIE1BWF9TUAorcHJpdmF0ZSBub3NhdmUgaW50IGF1dG9pbmZfZmxhZ3M7Citwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIGF1dG9pbmZfaHA7Citwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIGF1dG9pbmZfc3A7Citwcml2YXRlIG5vc2F2ZSBpbnQgYXV0b2luZl90aW1lOworcHJpdmF0ZSBub3NhdmUgc3RyaW5nICpoaXN0OworCitwcml2YXRlIG5vc2F2ZSBvYmplY3QgZGVidWdnZXI7CisKK3ZvaWQgX3NldF9kZWJ1ZygpIHsKKyAgaWYgKCFkZWJ1Z2dlciAmJiBJU19MRUFSTkVSKFRJKSkKKyAgICBkZWJ1Z2dlcj1USTsKKyAgZWxzZSBpZiAoZGVidWdnZXI9PVRJKQorICAgIGRlYnVnZ2VyPTA7Cit9CisgCitwcml2YXRlIHZvaWQgZGVidWcoc3RyaW5nIHN0cikgeworICBpZiAob2JqZWN0cChkZWJ1Z2dlcikgJiYgc3RyaW5ncChzdHIpKQorICAgIHRlbGxfb2JqZWN0KGRlYnVnZ2VyLCIjVEVBTTogIitzdHIpOworfQorCit2b2lkIGNyZWF0ZSgpIHsKKyAgYXV0b2luZl9mbGFncz0wOworICBhdXRvaW5mX3NwPShbXSk7CisgIGF1dG9pbmZfaHA9KFtdKTsKKyAgaXNfbWVtYmVyPShbXSk7CisgIGxlYWRlcj0wOworICB3YW50ZWRfcm93PShbXSk7CisgIGFjdF9yb3c9KFtdKTsKKyAgd2ltcHlfcm93PShbXSk7CisgIGF1dG9mb2xsb3c9KFtdKTsKKyAgYXR0YWNrX2NtZD0oW10pOworICBhc3NvY19tZW09KFtdKTsKKyAgZm9ybWluPSh7MSwwLDAsMCwwfSk7CisgIGZvcm1heD0oezUsNCwzLDIsMX0pOworICByb3dzPUVNUFRZX1RFQU1BUlJBWTsKKyAgaD0oW10pOworICBhdHRfZXhlYz0oe30pOworICBtaXNfaW5pdF9hdHQ9KFtdKTsKKyAgbWlzX2F0dGFja2VkPSh7fSk7CisgIGhwX2luZm89KFtdKTsKKyAgaGlzdD0oe30pOworICBpZiAob2JqZWN0X25hbWUoTUUpPT1URUFNX09CSkVDVCkKKyAgICByZXR1cm47CisgIGlmICghc3RyaW5ncCh0bmFtZT1URUFNX01BU1RFUi0+UmVnaXN0ZXJUZWFtKCkpKQorICAgIHRuYW1lPSI/IjsKK30KKworb2JqZWN0ICpNZW1iZXJzKCkgeworICByZXR1cm4gKG1faW5kaWNlcyhpc19tZW1iZXIpLSh7MH0pKTsKK30KKworb2JqZWN0IExlYWRlcigpIHsKKyAgcmV0dXJuIGxlYWRlcjsKK30KKwordmFyYXJncyBzdHJpbmcgbmFtZShpbnQgY2FzdXMsIGludCBkZW1vbikgeworICBpZiAoIXN0cmluZ3AodG5hbWUpKQorICAgIHJldHVybiAiVGVhbSA/IjsKKyAgcmV0dXJuICJUZWFtICIrY2FwaXRhbGl6ZSh0bmFtZSk7Cit9CisKK3ZhcmFyZ3Mgc3RyaW5nIE5hbWUoaW50IGNhc3VzLCBpbnQgZGVtb24pIHsKKyAgcmV0dXJuIG5hbWUoY2FzdXMsZGVtb24pOworfQorCit2YXJhcmdzIGludCByZW1vdmUoaW50IHNpbGVudCkgeworICBpZiAobWFwcGluZ3AoaXNfbWVtYmVyKSAmJiBzaXplb2YoTWVtYmVycygpKSkgLy8gTnVyIGxlZXJlIFRlYW1zIHJlbW92ZW4KKyAgICByZXR1cm4gMDsKKyAgVEVBTV9NQVNURVItPlVucmVnaXN0ZXJUZWFtKCk7IC8vIFRlYW1uYW1lbiBmcmVpZ2ViZW4uCisgIGRlc3RydWN0KE1FKTsKKyAgcmV0dXJuIDE7Cit9CisKK3ByaXZhdGUgdm9pZCBUcnlSZW1vdmUoKSB7CisgIGlmIChjbG9uZXAoTUUpCisgICAgICAmJiAoIW1hcHBpbmdwKGlzX21lbWJlcikgfHwgIXNpemVvZihNZW1iZXJzKCkpKQorICAgICAgJiYgIWZpcnN0X2ludmVudG9yeShNRSkKKyAgICAgICYmIGZpbmRfY2FsbF9vdXQoInJlbW92ZSIpPDApCisgICAgY2FsbF9vdXQoInJlbW92ZSIsMCk7Cit9CisKK2ludCBDbXBGaXJzdEFycmF5RWxlbWVudChtaXhlZCAqYSwgbWl4ZWQgKmIpIHsKKyAgcmV0dXJuKGFbMF08YlswXSk7Cit9CisKK3ZhcmFyZ3MgcHJpdmF0ZSB2b2lkIGd0ZWxsKHN0cmluZyBzdHIsIHN0cmluZyB3aG8sIGludCB0b2hpc3QpIHsKKyAgaW50IGk7CisgIG9iamVjdCAqdG1lbWJlcnMscm9jaHVzOworICBzdHJpbmcgcHJlZml4LG1zZzsKKworICB0bWVtYmVycz1NZW1iZXJzKCk7CisgIHByZWZpeD1zcHJpbnRmKCJbJXM6JXNdICIsbmFtZSgpLHN0cmluZ3Aod2hvKT93aG86IiIpOworICBtc2c9YnJlYWtfc3RyaW5nKHN0ciw3OCxwcmVmaXgpOworICBmb3IgKGk9c2l6ZW9mKHRtZW1iZXJzKS0xO2k+PTA7aS0tKQorICAgIHRlbGxfb2JqZWN0KHRtZW1iZXJzW2ldLG1zZyk7CisgIGlmIChvYmplY3RwKHJvY2h1cz1maW5kX3BsYXllcigicm9jaHVzIikpCisgICAgICAmJiByb2NodXMtPlF1ZXJ5UHJvcCgiZGVidWdfdGVhbSIpKQorICAgIHRlbGxfb2JqZWN0KHJvY2h1cyxtc2cpOworICBpZiAodG9oaXN0KQorICAgIGhpc3Q9KGhpc3QrKHticmVha19zdHJpbmcoc3RyKyIgPCIrY3RpbWUoKVsxMS4uMTVdKyI+Iiw3OCxwcmVmaXgpfSkpWy0xMDAuLl07Cit9CisKK2ludCBJc01lbWJlcihvYmplY3Qgb2IpIHsKKyAgcmV0dXJuIChvYmplY3RwKG9iKSAmJiBpc19tZW1iZXJbb2JdKTsKK30KKworaW50IElzSW50ZXJhY3RpdmVNZW1iZXIob2JqZWN0IG9iKSB7CisgIHJldHVybiAob2JqZWN0cChvYikgJiYgaXNfbWVtYmVyW29iXSAmJiBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iKSk7Cit9CisKK3ZhcmFyZ3MgcHJpdmF0ZSBpbnQgKkdldEhwSW5mbyhvYmplY3Qgb2IsIGNsb3N1cmUgY2wpIHsKKyAgaW50ICpyZXM7CisKKyAgaWYgKCFjbG9zdXJlcChjbCkpIGNsPXN5bWJvbF9mdW5jdGlvbigiUXVlcnlQcm9wIixvYik7CisgIGlmICghcG9pbnRlcnAocmVzPWhwX2luZm9bb2JdKSB8fCBzaXplb2YocmVzKTw0KQorICAgIHJlcz0oezAsZnVuY2FsbChjbCxQX01BWF9IUCksMCxmdW5jYWxsKGNsLFBfTUFYX1NQKX0pOworICByZXNbMF09ZnVuY2FsbChjbCxQX0hQKTsKKyAgcmVzWzJdPWZ1bmNhbGwoY2wsUF9TUCk7CisgIHJldHVybiBocF9pbmZvW29iXT1yZXM7Cit9CisKK2ludCBDb21wYXJlSHAob2JqZWN0IGEsIG9iamVjdCBiKSB7CisgIHJldHVybiBoW2FdPmhbYl07Cit9CisKKy8vIEFrdHVhbGlzaWVydCBhY3Rfcm93ICgtPndlciBzdGVodCBpbiB3ZWxjaGVyIFJlaWhlKS4KK3ByaXZhdGUgdm9pZCBVcGRhdGVBY3RSb3coKSB7CisgIGludCBpLGosdXBkYXRlX2hwOworICBvYmplY3QgKm5ldzsKKyAgbWl4ZWQgYXNvOworCisgIGFjdF9yb3c9KFtdKTsKKyAgcm93c1swXSs9TWVtYmVycygpOworICB1cGRhdGVfaHA9MDsKKyAgaWYgKCFtYXBwaW5ncChoKSkgeworICAgIGg9KFtdKTsKKyAgICB1cGRhdGVfaHA9MTsKKyAgfQorICBmb3IgKGk9TUFYX1RFQU1ST1dTLTE7aT49MDtpLS0pIHsKKyAgICBuZXc9KHt9KTsKKyAgICBmb3JlYWNoKG9iamVjdCBvYjogcm93c1tpXSkgeworICAgICAgaWYgKG9iamVjdHAob2IpICYmIGlzX21lbWJlcltvYl0gJiYgIWFjdF9yb3dbb2JdKSB7CisgICAgICAgIGFjdF9yb3dbb2JdPWkrMTsKKyAgICAgICAgbmV3Kz0oe29ifSk7CisgICAgICAgIGlmICh1cGRhdGVfaHApIHsKKyAgICAgICAgICBpZiAoIW9iamVjdHAoYXNvPWFzc29jX21lbVtvYl0pIHx8IGVudmlyb25tZW50KGFzbykhPWVudmlyb25tZW50KG9iKSkKKyAgICAgICAgICAgIGFzbz1vYjsKKyAgICAgICAgICBoW29iXT0KKyAgICAgICAgICAgIDEwMDAqd2FudGVkX3Jvd1thc29dCisgICAgICAgICAgICArNDAqYWN0X3Jvd1thc29dCisgICAgICAgICAgICAtKHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoYXNvKT84OjIpKmFzby0+UXVlcnlQcm9wKFBfSFApCisgICAgICAgICAgICAtcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYik7CisgICAgICAgICAgLy8gTlBDcyBiZWtvbW1lbiBmYXN0IGdsZWljaGVuIFdlcnQgd2llIENhc3RlciwKKyAgICAgICAgICAvLyBpbSBad2VpZmVsc2ZhbGxlIHN0ZWh0IGRlciBDYXN0ZXIgd2VpdGVyIHZvcm5lLi4uCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcm93c1tpXT1zb3J0X2FycmF5KG5ldywiQ29tcGFyZUhwIixNRSk7CisgIH0KK30KKworcHJpdmF0ZSB2b2lkIENoZWNrRm9ybWF0aW9uKCkgeworICBpbnQgaSxtaW5jYXAsbWF4Y2FwLGQsbnVtOworCisgIG1pbmNhcD1tYXhjYXA9MDsKKyAgaWYgKGZvcm1pblswXTwxKQorICAgIGZvcm1pblswXT0xOworICAKKyAgLy8gZXJzdG1hbCBkaWUgV3VlbnNjaGUgbm9ybWFsaXNpZXJlbi9rb3JyaWdpZXJlbiBhdWYgc2lubnZvbGxlIFdlcnRlLgorICBmb3IgKGk9MDtpPE1BWF9URUFNUk9XUztpKyspIHsKKyAgICBpZiAoZm9ybWluW2ldPDApIGZvcm1pbltpXT0wOworICAgIGlmIChmb3JtYXhbaV08Zm9ybWluW2ldKSBmb3JtYXhbaV09Zm9ybWluW2ldOworICAgIGlmIChmb3JtYXhbaV0+TUFYX1RFQU1fUk9XTEVOKSBmb3JtYXhbaV09TUFYX1RFQU1fUk9XTEVOOworICAgIGlmIChmb3JtaW5baV0+Zm9ybWF4W2ldKSBmb3JtaW5baV09Zm9ybWF4W2ldOworICAgIG1pbmNhcCs9Zm9ybWluW2ldOyAvLyBTdW1tZSBkZXIgbWluLiBqZSBSZWloZSBnZXd1ZW5zY2h0ZW4uCisgICAgbWF4Y2FwKz1mb3JtYXhbaV07IC8vIFN1bW1lIGRlciBtYXguIGplIFJlaWhlIGdld3VlbnNjaHRlbi4KKyAgfQorCisgIG51bT1zaXplb2YoTWVtYmVycygpKTsKKworICAvLyBtYXguIGdld3VlbnNjaHRlIFJlaWhlbmxhZW5nZSB2ZXJsYWVuZ2Vybiwgd2VubiBkaWUgU3VtbWUgZGVyIG1heGltYWwgamUKKyAgLy8gUmVpaGUgZ2V3dWVuc2NodGVuIGtsZWluZXIgYWxzIGRpZSBBbnphaGwgZGVyIFNwaWVsZXIgaXN0LiBWb24gdm9ybmUKKyAgLy8gbmF0dWVybGljaC4KKyAgZD1udW0tbWF4Y2FwOworICBmb3IgKGk9MDtpPE1BWF9URUFNUk9XUztpKyspIHsKKyAgICBpZiAoZDw9MCkKKyAgICAgIGJyZWFrOworICAgIGQtPShNQVhfVEVBTV9ST1dMRU4tZm9ybWF4W2ldKTsKKyAgICBmb3JtYXhbaV09TUFYX1RFQU1fUk9XTEVOOworICAgIGlmIChkPDApCisgICAgICBmb3JtYXhbaV0rPWQ7ICAvLyBkb2NoIG5vY2ggd2FzIHVlYnJpZywgd2llZGVyIGFuaGFlbmdlbi4gCisgIH0KKyAgLy8gbWluLiBnZXd1ZW5zY2h0ZSBSZWloZW5sYWVuZ2UgYXVmIDAgdmVya3Vlcnplbiwgd2VubiBkaWUgU3VtbWUgZGVyCisgIC8vIG1pbmltYWwgamUgUmVpaGUgZ2V3dWVuc2NodGVuIGdyb2Vzc2VyIGFscyBkaWUgQW56YWhsIGRlciBTcGllbGVyIGlzdC4KKyAgLy8gVm9uIGhpbnRlbiBuYXR1ZXJsaWNoLgorICBkPW1pbmNhcC1udW07IC8vIAorICBmb3IgKGk9TUFYX1RFQU1ST1dTLTE7aT49MDtpLS0pIHsKKyAgICBpZiAoZDw9MCkKKyAgICAgIGJyZWFrOworICAgIGQtPWZvcm1pbltpXTsKKyAgICBmb3JtaW5baV09MDsKKyAgICBpZiAoZDwwKQorICAgICAgZm9ybWluW2ldLT1kOyAvLyBkb2NoIG5vY2ggd2FzIHVlYnJpZywgd2llZGVyIGFuaGFlbmdlbi4KKyAgfQorfQorCitwcml2YXRlIHZvaWQgTWFrZUZvcm1hdGlvbigpIHsKKyAgLy8gVmVybGVndW5nc3N0cmF0ZWdpZToKKyAgLy8gICAgUmljaHR1bmcgVGVzdCBWZXJzY2hpZWJlbgorICAvLyAxLiAtLS0tLT4gYSkgTUFYICAgICAgICAgIDwtIFgKKyAgLy8gICAgICAgICAgIGIpIE1BWCAgICAgICAgICAgICBYIC0+CisgIC8vICAgICAgICAgICBjKSBNSU4gICAgICAgICAgICAgWCA8LSA8LSA8LSA8LQorICAvLyAyLiA8LS0tLS0gYSkgTUlOIC0+IC0+IC0+IC0+IFgKKyAgLy8gICAgICAgICAgIGIpIE1BWCAgICAgICAgICA8LSBYCisgIGludCBpLGosZDsKKworICBsYXN0X3Jlb3JkZXI9dGltZSgpOworICBVcGRhdGVBY3RSb3coKTsKKyAgQ2hlY2tGb3JtYXRpb24oKTsKKyAgZm9yIChpPTA7aTxNQVhfVEVBTVJPV1M7aSsrKSB7CisgICAgZD1zaXplb2Yocm93c1tpXSk7CisgICAgaWYgKGQ8Zm9ybWluW2ldIHx8IGQ+Zm9ybWF4W2ldKQorICAgICAgYnJlYWs7CisgIH0KKyAgaWYgKGk+PU1BWF9URUFNUk9XUykKKyAgICByZXR1cm47IC8vIEZvcm1hdGlvbiBpc3Qgbm9jaCBpbiBPcmRudW5nCisKKyAgZm9yIChpPTA7aTxNQVhfVEVBTVJPV1M7aSsrKSB7CisgICAgaWYgKHNpemVvZihyb3dzW2ldKT5mb3JtYXhbaV0pIHsgICAgIC8vIFJlaWhlIGlzdCB6dSB2b2xsCisgICAgICBpZiAoaT4wKSB7CisgICAgICAgIGQ9Zm9ybWF4W2ktMV0tc2l6ZW9mKHJvd3NbaS0xXSk7CisgICAgICAgIGlmIChkPjApIHsgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlaWhlIHZvcmhlciBoYXQgZCBmcmVpZSBQbGFldHplCisgICAgICAgICAgcm93c1tpLTFdKz1yb3dzW2ldWzAuLihkLTEpXTsgIC8vIEFsc28gZCBNaXRnbGllZGVyIGFiZ2ViZW4KKyAgICAgICAgICByb3dzW2ldPXJvd3NbaV1bZC4uXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGk8TUFYX1RFQU1ST1dTLTEgJiYgc2l6ZW9mKHJvd3NbaV0pPmZvcm1heFtpXSkgey8vIEltbWVyIG5vY2ggenUgdm9sbAorICAgICAgICByb3dzW2krMV09cm93c1tpXVtmb3JtYXhbaV0uLl0rcm93c1tpKzFdOyAgICAgICAgIC8vIFJlc3QgbmFjaCBoaW50ZW4uCisgICAgICAgIHJvd3NbaV09cm93c1tpXVswLi4oZm9ybWF4W2ldLTEpXTsKKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOyAvLyBXYXIgenUgdm9sbCwga2FubiBuaWNodCB6dSBsZWVyIHNlaW4KKyAgICB9CisgICAgZm9yIChqPWkrMTtqPE1BWF9URUFNUk9XUztqKyspIHsKKyAgICAgIGQ9Zm9ybWluW2ldLXNpemVvZihyb3dzW2ldKTsKKyAgICAgIGlmIChkPD0wKSAgICAgICAgICAgICAgICAgICAvLyBBdXNyZWljaGVuZGUgQW56YWhsCisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgLy8ga2VpbiB3ZWl0ZXJlcyBqIG5vZXRpZworICAgICAgcm93c1tpXSs9cm93c1tqXVswLi4oZC0xKV07IC8vIFNvbnN0IE5hY2hzY2h1YiB2b24gaGludGVuIGhvbGVuCisgICAgICByb3dzW2pdPXJvd3Nbal1bZC4uXTsKKyAgICB9CisgIH0KKyAgZm9yIChpPU1BWF9URUFNUk9XUy0xO2k+MDtpLS0pIHsKKyAgICBmb3IgKGo9aS0xO2o+PTA7ai0tKSB7CisgICAgICBkPWZvcm1pbltpXS1zaXplb2Yocm93c1tpXSk7CisgICAgICBpZiAoZDw9MCkgICAgICAgICAgICAgICAgICAgLy8gQXVzcmVpY2hlbmRlIEFuemFobAorICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgIC8vIGtlaW4gd2VpdGVyZXMgaiBub2V0aWcKKyAgICAgIHJvd3NbaV0rPXJvd3Nbal1bMC4uKGQtMSldOyAvLyBTb25zdCBOYWNoc2NodWIgdm9uIHZvcm5lIGhvbGVuCisgICAgICByb3dzW2pdPXJvd3Nbal1bZC4uXTsKKyAgICB9CisgICAgZD1zaXplb2Yocm93c1tpXSktZm9ybWF4W2ldOworICAgIGlmIChkPjApIHsKKyAgICAgIHJvd3NbaS0xXSs9cm93c1tpXVswLi4oZC0xKV07IC8vIFVlYmVyc2NodXNzIG5hY2ggdm9ybmUgc2NoaWViZW4KKyAgICAgIHJvd3NbaV09cm93c1tpXVtkLi5dOworICAgIH0KKyAgfQorICBVcGRhdGVBY3RSb3coKTsKK30KKworcHJpdmF0ZSB2b2lkIFJlbW92ZUZyb21Sb3cob2JqZWN0IG9iLCBpbnQgc3JjKSB7CisgIGlmIChzcmM8MCB8fCBzcmM+PU1BWF9URUFNUk9XUykKKyAgICByZXR1cm47CisgIHJvd3Nbc3JjXS09KHtvYn0pOworICBpZiAoc2l6ZW9mKHJvd3Nbc3JjXSk+PWZvcm1pbltzcmNdKQorICAgIHJldHVybjsKKyAgLy8gRmFsbHMgaGludGVuIG5vY2ggVWViZXJzY2h1c3MgZGEgaXN0LCBoZXIgZGFtaXQuCisgIGlmIChzcmM8TUFYX1RFQU1ST1dTLTEgJiYgc2l6ZW9mKHJvd3Nbc3JjKzFdKS0xPj1mb3JtaW5bc3JjKzFdKSB7CisgICAgcm93c1tzcmNdKz1yb3dzW3NyYysxXVswLi4wXTsKKyAgICByb3dzW3NyYysxXT1yb3dzW3NyYysxXVsxLi5dOworICAgIHJldHVybjsKKyAgfQorICAvLyBGYWxscyB2b3JuZSBub2NoIFVlYmVyc2NodXNzIGRhIGlzdCwgaGVyIGRhbWl0LgorICBpZiAoc3JjPjAgJiYgc2l6ZW9mKHJvd3Nbc3JjLTFdKS0xPj1mb3JtaW5bc3JjLTFdKSB7CisgICAgcm93c1tzcmNdPXJvd3Nbc3JjLTFdWzwxLi5dK3Jvd3Nbc3JjXTsKKyAgICByb3dzW3NyYy0xXT1yb3dzW3NyYy0xXVswLi48Ml07CisgIH0KK30KKworcHJpdmF0ZSB2b2lkIEFkZFRvUm93KG9iamVjdCBvYiwgaW50IGRlc3QpIHsKKyAgaWYgKGRlc3Q8MCB8fCBkZXN0Pj1NQVhfVEVBTVJPV1MpCisgICAgcmV0dXJuOworICByb3dzW2Rlc3RdKz0oe29ifSk7CisgIGlmIChzaXplb2Yocm93c1tkZXN0XSk8PWZvcm1heFtkZXN0XSkKKyAgICByZXR1cm47CisgIC8vIEZhbGxzIHZvcm5lIG5vY2ggamVtYW5kIGhpbiBrYW5uLCBkb3J0aGluCisgIGlmIChkZXN0PjAgJiYgc2l6ZW9mKHJvd3NbZGVzdC0xXSkrMTw9Zm9ybWF4W2Rlc3QtMV0pIHsKKyAgICByb3dzW2Rlc3QtMV0rPXJvd3NbZGVzdF1bMC4uXTsKKyAgICByb3dzW2Rlc3RdPXJvd3NbZGVzdF1bMS4uXTsKKyAgICByZXR1cm47CisgIH0KKyAgLy8gRmFsbHMgaGludGVuIG5vY2ggamVtYW5kIGhpbiBrYW5uLCBkb3J0aGluCisgIGlmIChkZXN0PE1BWF9URUFNUk9XUy0xICYmIHNpemVvZihyb3dzW2Rlc3QrMV0pKzE8PWZvcm1heFtkZXN0KzFdKSB7CisgICAgLy8gRGVzdDogKHsuLi4gPDMsIDwyLCBvYn0pOworICAgIHJvd3NbZGVzdCsxXT1yb3dzW2Rlc3RdWzwyLi48Ml0rcm93c1tkZXN0KzFdOworICAgIHJvd3NbZGVzdF09cm93c1tkZXN0XVswLi48M10rKHtvYn0pOworICB9Cit9CisKK3ByaXZhdGUgdm9pZCBDeWNsZVJvd3Mob2JqZWN0IG9iLCBpbnQgc3JjLCBpbnQgZGVzdCkgeworICBpbnQgaTsKKworICBpZiAoc3JjPDAgfHwgc3JjPj1NQVhfVEVBTVJPV1MgfHwgZGVzdDwwIHx8IGRlc3Q+PU1BWF9URUFNUk9XUykKKyAgICByZXR1cm47CisgIHJvd3Nbc3JjXS09KHtvYn0pOworICBpZiAoc2l6ZW9mKHJvd3Nbc3JjXSk8Zm9ybWluW3NyY10gfHwgc2l6ZW9mKHJvd3NbZGVzdF0pPj1mb3JtYXhbZGVzdF0pIHsKKyAgICBpZiAoc3JjPGRlc3QpIHsgICAgICAgICAgICAgLy8gKDwtIC1YKSA8LSA8LSA8LSA8LSAoK1ggPC0pCisgICAgICBmb3IgKGk9c3JjKzE7aTw9ZGVzdDtpKyspIHsKKyAgICAgICAgcm93c1tpLTFdKz1yb3dzW2ldWzAuLjBdOworICAgICAgICByb3dzW2ldPXJvd3NbaV1bMS4uXTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHNyYz5kZXN0KSB7ICAgICAgICAgICAvLyAoLT4gK1gpIC0+IC0+IC0+IC0+ICgtWCAtPikKKyAgICAgIGZvciAoaT1zcmMtMTtpPj1kZXN0O2ktLSkgeworICAgICAgICByb3dzW2krMV09cm93c1tpXVs8MS4uXStyb3dzW2krMV07CisgICAgICAgIHJvd3NbaV09cm93c1tpXVswLi48Ml07CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChzcmM8PWRlc3QpCisgICAgcm93c1tkZXN0XSs9KHtvYn0pOworICBlbHNlCisgICAgcm93c1tkZXN0XT0oe29ifSkrcm93c1tkZXN0XTsKK30KKworLy8gdGF1c2NodCB6dWZhZWxsaWcgYXVzIGRlbiBlcnN0ZW4gNCBSZWloZW4gYXVzIGVpbmVyIFJlaWhlIGRlbiBsZXR6dGVuIG1pdAorLy8gZGVtIGVyc3RlbiBhdXMgZGVyIEZvbGdlcmVpaGUsIHdlbm4gZGllIGRlciBTY29yZSBkZXMgdm9yZGVyZW4gU3BpZWxlciBtZWhyCisvLyBhbHMgMTAgZ3JvZXNzZXIgYWxzIGRlciBkZXMgaGludGVyZW4gU3BpZWxlcnMgaXN0LgorcHJpdmF0ZSB2b2lkIFJhbmRvbUNoYW5nZVJvdygpIHsKKyAgaW50ICpudW1zLGk7CisgIG9iamVjdCBwMSxwMjsKKworICBpZiAoIW1hcHBpbmdwKGgpKQorICAgIFVwZGF0ZUFjdFJvdygpOworICBmb3IgKG51bXM9KHswLDEsMiwzfSk7c2l6ZW9mKG51bXMpO251bXMtPSh7aX0pKSB7CisgICAgaT1udW1zW3JhbmRvbShzaXplb2YobnVtcykpXTsKKyAgICBpZiAoIXNpemVvZihyb3dzW2ldKSB8fCAhc2l6ZW9mKHJvd3NbaSsxXSkpIGNvbnRpbnVlOworICAgIGlmICghb2JqZWN0cChwMT1yb3dzW2ldWzwxXSkgfHwgIW9iamVjdHAocDI9cm93c1tpKzFdWzBdKSkgY29udGludWU7CisgICAgaWYgKHdhbnRlZF9yb3dbcDFdPHdhbnRlZF9yb3dbcDJdKSBjb250aW51ZTsKKyAgICBpZiAoaFtwMl0taFtwMV0+PS0xMCkgY29udGludWU7CisgICAgcm93c1tpXVs8MV09cDI7CisgICAgcm93c1tpKzFdWzBdPXAxOworICAgIHJldHVybjsKKyAgfQorfQorCit2YXJhcmdzIHByaXZhdGUgc3RyaW5nCitDb3VudFVwTmFtZXMob2JqZWN0ICpvYnMsIHN0cmluZyB6c2luZywgc3RyaW5nIHpwbHVyKSB7CisgIHN0cmluZyByZXM7CisgIG9iamVjdCBvYjsKKyAgaW50IGksc3o7CisKKyAgcmVzPSIiOworICBpZiAoIXBvaW50ZXJwKG9icykpIHJldHVybiByZXM7CisgIGlmICghc3RyaW5ncCh6c2luZykpIHpzaW5nPSIiOworICBpZiAoIXN0cmluZ3AoenBsdXIpKSB6cGx1cj0iIjsKKyAgaWYgKHN6PXNpemVvZihvYnMpKSB7CisgICAgZm9yIChpPTA7aTxzejtpKyspIHsKKyAgICAgIGlmIChpKQorCSAgICAgIHJlcys9KChpPHN6LTEpPyIsICI6IiB1bmQgIik7CisgICAgICBpZiAob2JqZWN0cChvYj1vYnNbaV0pKQorICAgICAgICByZXMrPW9iLT5uYW1lKFdFUik7CisgICAgfQorICAgIGlmIChzej4xKQorICAgICAgcmVzKz16cGx1cjsKKyAgICBlbHNlCisgICAgICByZXMrPXpzaW5nOworICB9CisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIERvQ2hhbmdlUm93KG9iamVjdCBwbCwgaW50IGRlc3QpIHsKKyAgbWFwcGluZyBvbGRfcm93LGVjMSxlYzIsZWNiOworICBpbnQgaTsKKyAgb2JqZWN0ICpvYnMsKmVudnMsZW52OworICBzdHJpbmcgKm1zZyxzdHI7CisKKyAgZGVzdC0tOworICBDaGVja0Zvcm1hdGlvbigpOworICBoPTA7ICAvLyBkYW1pdCBIUC1MaXN0ZSBnZXVwZGF0ZWQgd2lyZC4KKyAgVXBkYXRlQWN0Um93KCk7CisgIG9sZF9yb3c9ZGVlcF9jb3B5KGFjdF9yb3cpOworCisgIC8vIHdlbGNoZSBPYmpla3RlIGJld2VnZW4/CisgIG9icz0oe30pOworICBpZiAob2JqZWN0cChwbCkpIHsKKyAgICBvYnM9KHtwbH0pOworICAgIGlmIChwb2ludGVycChhc3NvY19tZW1bcGxdKSkKKyAgICAgIG9icys9YXNzb2NfbWVtW3BsXTsKKyAgfSBlbHNlIHsKKyAgICBSYW5kb21DaGFuZ2VSb3coKTsKKyAgfQorCisgIGZvcmVhY2ggKG9iamVjdCBvYjpvYnMpIHsKKyAgICBpZiAoIW9iamVjdHAob2IpKQorICAgICAgY29udGludWU7CisgICAgLy8gQWxsZSBhc3NvemlpZXJ0ZW4gTlBDIGtyaWVnZW4gZGllIGdsZWljaGUgZ2V3dWVuc2NodGUgUmVpaGUgd2llIGRlcgorICAgIC8vIFNwaWVsZXIuCisgICAgd2FudGVkX3Jvd1tvYl09d2FudGVkX3Jvd1twbF07CisgICAgVXBkYXRlQWN0Um93KCk7CisgICAgLy8gdW5kIGRhbm4gaW4gZGllIGdldy4gUmVpaGUgc3RvcGZlbi4KKyAgICBpbnQgc3JjPWFjdF9yb3dbb2JdLTE7CisgICAgaWYgKGRlc3Q8MCB8fCBkZXN0Pj1NQVhfVEVBTVJPV1MpCisgICAgICBSZW1vdmVGcm9tUm93KG9iLHNyYyk7CisgICAgZWxzZSBpZiAoc3JjPDAgfHwgc3JjPj1NQVhfVEVBTVJPV1MpCisgICAgICBBZGRUb1JvdyhvYixkZXN0KTsKKyAgICBlbHNlIGlmIChzcmMhPWRlc3QpCisgICAgICBDeWNsZVJvd3Mob2Isc3JjLGRlc3QpOworICB9CisKKyAgTWFrZUZvcm1hdGlvbigpOworCisgIG9icyA9IE1lbWJlcnMoKTsgLy8gYWxsZSBNZW1iZXJzIGJlcnVlY2tzaWNodGlnZW4gYmVpbSBBYmdsZWljaCEKKyAgb2JqZWN0ICpjaGFuZ2VkID0gYWxsb2NhdGUoMCk7CisgIGZvcmVhY2ggKG9iamVjdCBvYjpvYnMpCisgICAgaWYgKG9iamVjdHAob2IpICYmIG9sZF9yb3dbb2JdIT1hY3Rfcm93W29iXSkgeworICAgICAgb2ItPkluZm9ybVJvd0NoYW5nZShvbGRfcm93W29iXSxhY3Rfcm93W29iXSk7CisgICAgICBjaGFuZ2VkICs9ICh7b2J9KTsKKyAgICB9CisKKyAgLy8gQWIgamV0enQgbnVyIG5vY2ggQXVzZ2FiZS4KKyAgaWYgKGdldF9ldmFsX2Nvc3QoKTw4MDAwMDApIHJldHVybjsgLy8gV2FyIHNjaG9uIHRldWVyIGdlbnVnLCBMYWd2ZXJtZWlkdW5nCisgIG1zZz0oe30pO2VjMT0oW10pO2VjMj0oW10pO2VjYj0oW10pOworICBmb3JlYWNoIChvYmplY3Qgb2I6Y2hhbmdlZCkgeworICAgIHRlbGxfb2JqZWN0KG9iLHNwcmludGYoIkR1IGJpc3QgamV0enQgaW4gUmVpaGUgJWQuXG4iLGFjdF9yb3dbb2JdKSk7CisgICAgbXNnKz0oe3NwcmludGYoIiVzLT4lZCIsb2ItPk5hbWUoV0VSKSxhY3Rfcm93W29iXSl9KTsKKyAgICBpZiAocXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYikgJiYgIWludGVyYWN0aXZlKG9iKSkgY29udGludWU7CisgICAgaWYgKCFvYmplY3RwKGVudj1lbnZpcm9ubWVudChvYikpKSBjb250aW51ZTsKKyAgICBpZiAob2xkX3Jvd1tvYl08PTEpIHsKKyAgICAgIGlmICghcG9pbnRlcnAoZW52cz1lYzFbZW52XSkpIGVudnM9KHt9KTsKKyAgICAgIGVjMVtlbnZdPWVudnMrKHtvYn0pO2VjYltlbnZdfD0xOworICAgIH0KKyAgICBpZiAoYWN0X3Jvd1tvYl08PTEpIHsKKyAgICAgIGlmICghcG9pbnRlcnAoZW52cz1lYzJbZW52XSkpIGVudnM9KHt9KTsKKyAgICAgIGVjMltlbnZdPWVudnMrKHtvYn0pO2VjYltlbnZdfD0yOworICAgIH0KKyAgfQorICBpZiAoc2l6ZW9mKG1zZykpCisgICAgZ3RlbGwoaW1wbG9kZShtc2csIiwgIikpOyAvLyBBdXNnYWJlIGFuIGFsbGUgR3J1cHBlbm1pdGdsaWVkZXIuCisgIG1fZGVsZXRlKGVjYixmaW5kX29iamVjdCgiL3Jvb20vbmV0enRvdCIpKTsgLy8gRGFzIGdhZWJlIE1lZ2EtTGFnIDotKQorICBlbnZzPW1faW5kaWNlcyhlY2IpO29icz1NZW1iZXJzKCk7CisgIGZvciAoaT1zaXplb2YoZW52cyktMTtpPj0wO2ktLSkgeworICAgIGlmICghb2JqZWN0cChlbnY9ZW52c1tpXSkpIGNvbnRpbnVlOworICAgIHN0cj0iIjsKKyAgICBzdHIrPUNvdW50VXBOYW1lcyhlYzFbZW52XSwiIHRyaXR0IHp1cnVlY2siLCIgdHJldGVuIHp1cnVlY2siKTsKKyAgICBpZiAoZWNiW2Vudl09PTMpIHN0cis9IiwgIjsKKyAgICBzdHIrPUNvdW50VXBOYW1lcyhlYzJbZW52XSwiIHRyaXR0IHZvciIsIiB0cmV0ZW4gdm9yIik7CisgICAgc3RyKz0iLlxuIjsKKyAgICB0ZWxsX3Jvb20oZW52LGNhcGl0YWxpemUoYnJlYWtfc3RyaW5nKHN0ciw3OCkpLG9icyk7CisgIH0KK30KKwordm9pZCBVcGRhdGVGb3JtYXRpb24oKSB7CisgIERvQ2hhbmdlUm93KDAsMCk7Cit9CisKK2ludCBTd2FwUm93cyhvYmplY3Qgb2IxLCBvYmplY3Qgb2IyKSB7CisgIGludCBpLHIxLHIyLHAxLHAyOworCisgIGlmICghb2JqZWN0cChvYjEpIHx8ICFvYmplY3RwKG9iMikgfHwgb2IxPT1vYjIpCisgICAgcmV0dXJuIDA7CisgIHIxPXIyPS0xOworICBmb3IgKGk9MDtpPE1BWF9URUFNUk9XUztpKyspIHsKKyAgICBpZiAocjE9PS0xICYmIChwMT1tZW1iZXIocm93c1tpXSxvYjEpKT49MCkKKyAgICAgIHIxPWk7CisgICAgaWYgKHIyPT0tMSAmJiAocDI9bWVtYmVyKHJvd3NbaV0sb2IyKSk+PTApCisgICAgICByMj1pOworICB9CisgIGlmIChyMT09LTEgfHwgcjI9PS0xKQorICAgIHJldHVybiAwOworICBpZiAocjE9PXIyKQorICAgIHJldHVybiAxOworICBpZiAocjE8cjIpIHsgLy8gTmljaHQgTW9uc3RlciB2b3IgU3BpZWxlciBzdGVsbGVuCisgICAgaWYgKHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2IxKSAmJiAhaW50ZXJhY3RpdmUob2IyKSkKKyAgICAgIHJldHVybiAwOworICB9IGVsc2UgeworICAgIGlmIChxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iMikgJiYgIWludGVyYWN0aXZlKG9iMSkpCisgICAgICByZXR1cm4gMDsKKyAgfQorICByb3dzW3IxXVtwMV09b2IyO29iMi0+SW5mb3JtUm93Q2hhbmdlKHIyLHIxKTsKKyAgcm93c1tyMl1bcDJdPW9iMTtvYjEtPkluZm9ybVJvd0NoYW5nZShyMSxyMik7CisgIGd0ZWxsKG9iMS0+TmFtZShXRVIpKyIgdW5kICIrb2IyLT5uYW1lKFdFUikrIiB0YXVzY2hlbiBkaWUgUGxhZXR6ZS5cbiIpOworICByZXR1cm4gMTsKK30KKworcHJpdmF0ZSBpbnQgQ2hhbmdlUm93KHN0cmluZyBhcmcpIHsKKyAgaW50IG51bTsKKworICBpZiAoIWFyZyB8fCBzc2NhbmYoYXJnLCIlZCIsbnVtKSE9MSkKKyAgICByZXR1cm4gbm90aWZ5X2ZhaWwoIkluIHdlbGNoZSBSZWloZSB3aWxsc3QgRHUgZGVubiB3ZWNoc2Vsbj9cbiIpLDA7CisgIGlmIChudW08MSB8fCBudW0+TUFYX1RFQU1ST1dTKQorICAgIHJldHVybiBub3RpZnlfZmFpbCgiRGllIFJlaWhlbmFuZ2FiZSBpc3QgdW5ndWVsdGlnLlxuIiksMDsKKyAgVFAtPlNldFByb3AoUF9URUFNX1dBTlRFRF9ST1csd2FudGVkX3Jvd1tUUF09bnVtKTsKKyAgcHJpbnRmKCJEdSB2ZXJzdWNoc3QgaW4gUmVpaGUgJWQgenUgd2VjaHNlbG4uXG4iLG51bSk7CisgIERvQ2hhbmdlUm93KFRQLG51bSk7CisgIHJldHVybiAxOworfQorCitwcml2YXRlIGludCBDaGFuZ2VXaW1weVJvdyhzdHJpbmcgYXJnKSB7CisgIGludCBudW07CisKKyAgaWYgKCFhcmcgfHwgc3NjYW5mKGFyZywiJWQiLG51bSkhPTEpCisgICAgcmV0dXJuIG5vdGlmeV9mYWlsKCJJbiB3ZWxjaGUgUmVpaGUgd2lsbHN0IER1IGZsaWVoZW4/XG4iKSwwOworICBpZiAobnVtPDAgfHwgbnVtPk1BWF9URUFNUk9XUykKKyAgICByZXR1cm4gbm90aWZ5X2ZhaWwoIkRpZSBSZWloZW5hbmdhYmUgaXN0IHVuZ3VlbHRpZy5cbiIpLDA7CisgIFRQLT5TZXRQcm9wKFBfVEVBTV9XSU1QWV9ST1csd2ltcHlfcm93W1RQXT1udW0pOworICBpZiAobnVtPjEpCisgICAgcHJpbnRmKCJCZWkgZGVyIEZsdWNodCB3aXJzdCBEdSBpbiBSZWloZSAlZCB3ZWNoc2Vsbi5cbiIsbnVtKTsKKyAgZWxzZQorICAgIHdyaXRlKCJCZWkgZGVyIEZsdWNodCB3aXJzdCBEdSBkZW4gUmF1bSB2ZXJsYXNzZW4uXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK21peGVkICpQcmVzZW50Um93cyhvYmplY3QgZW52KSB7CisgIGludCBpLGosZCxhcmJlaXQ7CisgIG1peGVkICpyZXM7CisgIG9iamVjdCAqbmQsb2I7CisKKyAgaWYgKCFvYmplY3RwKGVudikpCisgICAgZW52PWVudmlyb25tZW50KFRQKTsKKyAgaWYgKGxhc3RfcmVvcmRlciE9dGltZSgpIHx8ICFtYXBwaW5ncChoKSkKKyAgICBVcGRhdGVGb3JtYXRpb24oKTsKKyAgcmVzPUVNUFRZX1RFQU1BUlJBWTthcmJlaXQ9MDtuZD0oe30pOworICBmb3IgKGk9MDtpPE1BWF9URUFNUk9XUztpKyspIHsKKyAgICBvYmplY3QgKm5ldz0oe30pOworICAgIGZvcmVhY2gob2I6IHJvd3NbaV0pIHsKKyAgICAgIGlmIChvYmplY3RwKG9iKSAmJiBpc19tZW1iZXJbb2JdICYmIGVudmlyb25tZW50KG9iKT09ZW52KSB7CisgICAgICAgIGlmIChxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iKSAmJiAhaW50ZXJhY3RpdmUob2IpKSB7CisgICAgICAgICAgbmQrPSh7b2J9KTsKKyAgICAgICAgICBhcmJlaXQ9MTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBuZXcrPSh7b2J9KTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXJiZWl0PTE7CisgICAgICB9CisgICAgfQorICAgIHJlc1tpXT1uZXc7CisgIH0KKyAgaWYgKCFhcmJlaXQpCisgICAgcmV0dXJuIHJlczsKKyAgZm9yIChpPWo9MDtpPE1BWF9URUFNUk9XUztpKyspIHsKKyAgICBpZiAoajw9aSkgaj1pKzE7CisgICAgZm9yICg7ajxNQVhfVEVBTVJPV1M7aisrKSB7CisgICAgICBkPWZvcm1pbltpXS1zaXplb2YocmVzW2ldKTsKKyAgICAgIGlmIChkPD0wKSAgICAgICAgICAgICAgICAgICAvLyBBdXNyZWljaGVuZGUgQW56YWhsCisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgLy8ga2VpbiB3ZWl0ZXJlcyBqIG5vZXRpZworICAgICAgcmVzW2ldKz1yZXNbal1bMC4uKGQtMSldOyAgIC8vIFNvbnN0IE5hY2hzY2h1YiB2b24gaGludGVuIGhvbGVuCisgICAgICByZXNbal09cmVzW2pdW2QuLl07CisgICAgfQorICB9CisgIHJlc1tNQVhfVEVBTVJPV1MtMV0rPW5kOyAvLyBOZXR6dG90ZSBiaWV0ZW4ga2VpbmUgRGVja3VuZywgbmFjaCBoaW50ZW4uCisgIHJldHVybiByZXM7Cit9CisKK21hcHBpbmcgUHJlc2VudFBvc2l0aW9ucyhtaXhlZCBwcmVzX3Jvd3MpIHsKKyAgbWFwcGluZyByZXM9KFtdKTsKKyAgaWYgKG9iamVjdHAocHJlc19yb3dzKSkKKyAgICBwcmVzX3Jvd3M9UHJlc2VudFJvd3MocHJlc19yb3dzKTsKKyAgaWYgKCFwb2ludGVycChwcmVzX3Jvd3MpKQorICAgIHJldHVybiByZXM7CisgIGZvciAoaW50IGk9MDtpPE1BWF9URUFNUk9XUztpKyspIHsKKyAgICBmb3JlYWNoKG9iamVjdCBvYjogcHJlc19yb3dzW2ldKQorICAgICAgaWYgKG9iKQorICAgICAgICByZXNbb2JdPWkrMTsKKyAgfQorICByZXR1cm4gcmVzOworfQorCisKK3ZhcmFyZ3MgaW50IEZsZWVUb1JvdyhvYmplY3Qgb2IpIHsKKyAgaW50IG51bTsKKworICBpZiAoIW9iamVjdHAob2IpKQorICAgIG9iPVRQOworICBpZiAoIUlzTWVtYmVyKG9iKSkKKyAgICByZXR1cm4gMDsKKyAgaD0wOyAvLyBSZWloZW4gYmVpIG5hZWNoc3RlciBBYmZyYWdlIG5ldSBzb3J0aWVyZW4KKyAgbnVtPXdpbXB5X3Jvd1tvYl07CisgIGlmIChudW08MiB8fCBudW0+TUFYX1RFQU1ST1dTKSAvLyBGbHVjaHQgaW4gMS4gUmVpaGUgbmljaHQgc2lubnZvbGwuCisgICAgcmV0dXJuIDA7CisgIGlmIChudW09PXdhbnRlZF9yb3dbb2JdKSAvLyBJc3Qgc2Nob25tYWwgbmFjaCBoaW50ZW4gZ2VmbG9oZW4uCisgICAgcmV0dXJuIDA7CisgIHRlbGxfb2JqZWN0KG9iLHNwcmludGYoIkR1IHZlcnN1Y2hzdCBpbiBSZWloZSAlZCB6dSBmbGllaGVuLlxuIixudW0pKTsKKyAgb2ItPlNldFByb3AoUF9URUFNX1dBTlRFRF9ST1csd2FudGVkX3Jvd1tvYl09bnVtKTsKKyAgRG9DaGFuZ2VSb3cob2IsbnVtKTsKKyAgaWYgKFByZXNlbnRQb3NpdGlvbnMoZW52aXJvbm1lbnQob2IpKVtvYl08PTEpIC8vIEZsdWNodCBnZXNjaGVpdGVydD8KKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgQ2hhbmdlRm9ybWF0aW9uKHN0cmluZyBhcmcpIHsKKyAgc3RyaW5nICp3b3JkczsKKyAgaW50IGksbWluLG1heDsKKyAgbWFwcGluZyBvbGRfcm93OworCisgIGlmIChhcmc9PSJhdXMiKQorICAgIGFyZz0iMS02IDAtNiAwLTYgMC02IDAtNiI7CisgIGk9c2l6ZW9mKHdvcmRzPW9sZF9leHBsb2RlKGFyZywiICIpKTsKKyAgaWYgKGk+TUFYX1RFQU1ST1dTKQorICAgIGk9TUFYX1RFQU1ST1dTOworICBmb3IgKC0taTtpPj0wO2ktLSkgeworICAgIGlmIChzc2NhbmYod29yZHNbaV0sIiVkLSVkIixtaW4sbWF4KT09MikgeworICAgICAgZm9ybWluW2ldPW1pbjsKKyAgICAgIGZvcm1heFtpXT1tYXg7CisgICAgfSBlbHNlIGlmIChzc2NhbmYod29yZHNbaV0sIiVkIixtaW4pPT0xKSB7CisgICAgICBmb3JtaW5baV09Zm9ybWF4W2ldPW1pbjsKKyAgICB9CisgIH0KKworICBVcGRhdGVGb3JtYXRpb24oKTsKKworICB3b3Jkcz0oe30pOworICBmb3IgKGk9MDtpPE1BWF9URUFNUk9XUztpKyspCisgICAgd29yZHMrPSh7c3ByaW50ZigiJWQtJWQiLGZvcm1pbltpXSxmb3JtYXhbaV0pfSk7CisgIGd0ZWxsKCJEaWUgRm9ybWF0aW9uIGlzdCBqZXR6dCAiK2ltcGxvZGUod29yZHMsIiAvICIpKyIuXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBTaG91dChzdHJpbmcgc3RyKSB7CisgIGlmICghc3RyIHx8IHN0cj09IiIpCisgICAgcmV0dXJuIG5vdGlmeV9mYWlsKCJXYXMgd2lsbHN0IER1IGRlbiBhbmRlcmVuIFRlYW1taXRnbGllZGVybiBzYWdlbj9cbiIpLDA7CisgIGd0ZWxsKHN0cixUUC0+TmFtZShXRVIpLDEpOworICByZXR1cm4gMTsKK30KKworaW50IEhpc3Qoc3RyaW5nIHN0cikgeworICBpbnQgaSxhbnosbWF4aW1hbDsKKworICAvLyBub24taW50ZXJhY3RpdmUgb2RlciBOaWNodC1NaXRnbGllZGVyIHNvbGx0ZW4gZGllIEhpc3QgbmljaHQgYWJmcmFnZW4uCisgIGlmICghSXNJbnRlcmFjdGl2ZU1lbWJlcihUUCkpIHJldHVybiAtMTsKKworICBtYXhpbWFsPXNpemVvZihoaXN0KTsKKyAgaWYgKHN0ciAmJiBzc2NhbmYoc3RyLCIlZCIsYW56KT09MSkKKyAgICBpPW1heGltYWwtYW56OworICBpZiAoaTwwKQorICAgIGk9MDsKKworICBUUC0+TW9yZShzcHJpbnRmKCIlQHMiLGhpc3RbaS4ubWF4aW1hbF0pfHwiIik7CisgIHJldHVybiAxOworfQorCitwcml2YXRlIHZvaWQgRG9DaGFuZ2VMZWFkZXIob2JqZWN0IG9iKSB7CisgIGlmIChvYmplY3RwKGxlYWRlcikgJiYgbGVhZGVyLT5RdWVyeVByb3AoUF9URUFNX0xFQURFUik9PU1FKQorICAgIGxlYWRlci0+U2V0UHJvcChQX1RFQU1fTEVBREVSLDApOworICBsZWFkZXI9b2I7CisgIGxlYWRlci0+U2V0UHJvcChQX1RFQU1fTEVBREVSLE1FKTsKK30KKworcHJpdmF0ZSBpbnQgQ2hhbmdlTGVhZGVyKHN0cmluZyBhcmcpIHsKKyAgb2JqZWN0IG9iOworCisgIGlmIChzdHJpbmdwKGFyZykgJiYgYXJnIT0iIikgeworICAgIGlmICghb2JqZWN0cChvYj1maW5kX3BsYXllcihhcmcpKQorICAgICAgICAmJiAhb2JqZWN0cChvYj1wcmVzZW50KGFyZyxlbnZpcm9ubWVudChUUCkpKSkKKyAgICAgIHJldHVybiBub3RpZnlfZmFpbChjYXBpdGFsaXplKGFyZykrIiBuaWNodCBnZWZ1bmRlbi5cbiIpLDA7CisgIH0gZWxzZSB7CisgICAgb2I9VFA7CisgIH0KKyAgaWYgKG9iamVjdHAobGVhZGVyKQorICAgICAgJiYgVFAhPWxlYWRlcgorICAgICAgJiYgKCFpbnRlcmFjdGl2ZShUUCkgfHwgKGludGVyYWN0aXZlKGxlYWRlcikgJiYgcXVlcnlfaWRsZShsZWFkZXIpPDE4MCkpKQorICAgIHJldHVybiBub3RpZnlfZmFpbCgiRGVyIFRlYW1sZWl0ZXIgaXN0IG5vY2ggYWt0aXYuXG4iKSwwOworICBpZiAob2JqZWN0cChsZWFkZXIpCisgICAgICAmJiBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKGxlYWRlcikKKyAgICAgICYmICFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKGxlYWRlcikpCisgICAgcmV0dXJuIG5vdGlmeV9mYWlsKCJOdXIgZWluIFNwaWVsZXIga2FubiBkYXMgVGVhbSBsZWl0ZW4uXG4iKSwwOworICBpZiAoIUlzTWVtYmVyKG9iKSkKKyAgICByZXR1cm4gbm90aWZ5X2ZhaWwob2ItPk5hbWUoV0VSKSsiIGlzdCBrZWluIFRlYW1taXRnbGllZC5cbiIpLDA7CisgIERvQ2hhbmdlTGVhZGVyKG9iKTsKKyAgZ3RlbGwob2ItPk5hbWUoV0VSKSsiIGxlaXRldCBqZXR6dCBkYXMgVGVhbS5cbiIpOworICByZXR1cm4gMTsKK30KKwordmFyYXJncyBwcml2YXRlIGludCBDaGVja1NlY29uZChvYmplY3QgcGwsIG9iamVjdCAqb2JzKSB7CisgIG1peGVkIHgsaXA7CisgIG1hcHBpbmcgc2Vjb25kOworICBvYmplY3Qgb2I7CisgIGludCBpOworCisgIGlmICghb2JqZWN0cChwbCkpCisgICAgcGw9VFA7CisgIGlmICghcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShwbCkpCisgICAgcmV0dXJuIDA7CisgIGlmICghcG9pbnRlcnAob2JzKSkKKyAgICBvYnM9TWVtYmVycygpOworICBvYnMtPSh7cGx9KTsKKyAgc2Vjb25kPShbXSk7CisgIGZvciAoaT1zaXplb2Yob2JzKS0xO2k+PTA7aS0tKSB7CisgICAgaWYgKCFvYmplY3RwKG9iPW9ic1tpXSkgfHwgIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2IpKSBjb250aW51ZTsKKyAgICBzZWNvbmRbZ2V0dWlkKG9iKV09MTsKKyAgICBpZiAoc3RyaW5ncCh4PW9iLT5RdWVyeVByb3AoUF9TRUNPTkQpKSkKKyAgICAgIHNlY29uZFtsb3dlcl9jYXNlKHgpXT0xOworICB9CisgIGlmIChzZWNvbmRbZ2V0dWlkKHBsKV0gfHwKKyAgICAgIChzdHJpbmdwKHg9cGwtPlF1ZXJ5UHJvcChQX1NFQ09ORCkpICYmIHNlY29uZFtsb3dlcl9jYXNlKHgpXSkpCisgICAgcmV0dXJuIDE7CisKKyAgaWYgKCFzdHJpbmdwKGlwPXBsLT5RdWVyeVByb3AoUF9DQUxMRURfRlJPTV9JUCkpIHx8IGlwPT0iIikKKyAgICByZXR1cm4gMDsKKyAgZm9yIChpPXNpemVvZihvYnMpLTE7aT49MDtpLS0pIHsKKyAgICBpZiAoIW9iamVjdHAob2I9b2JzW2ldKSB8fCAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYikpIGNvbnRpbnVlOworICAgIGlmIChvYi0+UXVlcnlQcm9wKFBfQ0FMTEVEX0ZST01fSVApIT1pcCkgY29udGludWU7CisgICAgbG9nX2ZpbGUoInJvY2h1cy96d2VpdGlldmVyZGFjaHQiLAorICAgICAgICAgICAgIHNwcmludGYoIiVzICVzLCVzXG4iLGN0aW1lKClbNC4uMTVdLGdldHVpZChwbCksZ2V0dWlkKG9iKSkpOworICAgIGJyZWFrOworICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IEFsbG93ZWQob2JqZWN0IHBsKSB7CisgIG1peGVkIHg7CisgIHN0cmluZyBubTsKKworICBpZiAoIW9iamVjdHAocGwpKQorICAgIHJldHVybiBub3RpZnlfZmFpbCgiV0VSIHNvbGwgaW5zIFRlYW0gYXVmZ2Vub21tZW4gd2VyZGVuP1xuIiksMDsKKyAgaWYgKHBsPT1UUCkKKyAgICBubT0iRHUgYiI7CisgIGVsc2UKKyAgICBubT1wbC0+TmFtZShXRVIpKyIgIjsKKyAgaWYgKG9iamVjdHAoeD1wbC0+UXVlcnlQcm9wKFBfVEVBTSkpICYmIHghPU1FKQorICAgIHJldHVybiBub3RpZnlfZmFpbChubSsiaXN0IHNjaG9uIGluIGVpbmVtIGFuZGVyZW4gVGVhbS5cbiIpLDA7CisgIGlmIChwbC0+UXVlcnlHdWVzdCgpKQorICAgIHJldHVybiBub3RpZnlfZmFpbChubSsiaXN0IGVpbiBHYXN0LlxuIiksMDsKKyAgaWYgKHBsLT5RdWVyeVByb3AoUF9HSE9TVCkpCisgICAgcmV0dXJuIG5vdGlmeV9mYWlsKG5tKyJpc3QgZWluIEdlaXN0LlxuIiksMDsKKyAgaWYgKENoZWNrU2Vjb25kKHBsKSkKKyAgICByZXR1cm4gbm90aWZ5X2ZhaWwobm0rImlzdCBad2VpdHNwaWVsZXIgZWluZXMgVGVhbW1pdGdsaWVkcy5cbiIpLDA7CisgIGlmIChzaXplb2YoZmlsdGVyKE1lbWJlcnMoKSwiSXNJbnRlcmFjdGl2ZU1lbWJlciIsTUUpKQorICAgICAgPj1NQVhfVEVBTV9NRU1CRVJTKQorICAgIHJldHVybiBub3RpZnlfZmFpbCgiRXMgc2luZCBzY2hvbiB6dXZpZWxlIFNwaWVsZXIgaW0gVGVhbS5cbiIpLDA7CisgIHJldHVybiAxOworfQorCitwcml2YXRlIHZvaWQgRG9BZGRNZW1iZXIob2JqZWN0IG9iKSB7CisgIGNsb3N1cmUgY2w7CisKKyAgaWYgKCFJc01lbWJlcihsZWFkZXIpKQorICAgIERvQ2hhbmdlTGVhZGVyKG9iKTsKKyAgb2ItPlNldFByb3AoUF9URUFNLE1FKTsKKyAgaWYgKElzTWVtYmVyKG9iKSkKKyAgICByZXR1cm47CisgIGlzX21lbWJlcltvYl09MTsKKyAgY2w9c3ltYm9sX2Z1bmN0aW9uKCJRdWVyeVByb3AiLG9iKTsKKyAgYXR0YWNrX2NtZFtvYl09ZnVuY2FsbChjbCxQX1RFQU1fQVRUQUNLX0NNRCk7CisgIGF1dG9mb2xsb3dbb2JdPWZ1bmNhbGwoY2wsUF9URUFNX0FVVE9GT0xMT1cpOworICB3aW1weV9yb3dbb2JdPWZ1bmNhbGwoY2wsUF9URUFNX1dJTVBZX1JPVyk7CisgIHdhbnRlZF9yb3dbb2JdPWZ1bmNhbGwoY2wsUF9URUFNX1dBTlRFRF9ST1cpOworICBpZiAoIXdhbnRlZF9yb3dbb2JdKSB3YW50ZWRfcm93W29iXT0xOzsKKyAgb2ItPlNldFByb3AoUF9URUFNX05FV01FTUJFUiwwKTsKKyAgR2V0SHBJbmZvKG9iLGNsKTsKKyAgaWYgKHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2IpKSBvYi0+QWRkSHBIb29rKE1FKTsKKyAgaWYgKCFvYmplY3RwKGFzc29jX21lbVtvYl0pKQorICAgIGd0ZWxsKG9iLT5OYW1lKFdFUikrIiB3dXJkZSBpbnMgVGVhbSBhdWZnZW5vbW1lbi5cbiIpOworICBEb0NoYW5nZVJvdyhvYix3YW50ZWRfcm93W29iXSk7Cit9CisKK2ludCBBZGRBc3NvY01lbWJlcihvYmplY3QgY2FzdGVyLCBvYmplY3QgbnBjKSB7CisgIG9iamVjdCAqb2JzOworCisgIGlmIChleHRlcm5fY2FsbCgpICYmIFBPIT1jYXN0ZXIpCisgICAgcmV0dXJuIDA7CisgIGlmICghSXNNZW1iZXIoY2FzdGVyKQorICAgICAgfHwgIW9iamVjdHAobnBjKQorICAgICAgfHwgcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShucGMpCisgICAgICB8fCBJc01lbWJlcihucGMpCisgICAgICB8fCBvYmplY3RwKGFzc29jX21lbVtjYXN0ZXJdKQorICAgICAgfHwgYXNzb2NfbWVtW25wY10KKyAgICAgIHx8IGNhc3Rlcj09bnBjKQorICAgIHJldHVybiAwOworICBhc3NvY19tZW1bbnBjXT1jYXN0ZXI7CisgIERvQWRkTWVtYmVyKG5wYyk7CisgIGlmICghcG9pbnRlcnAob2JzPWFzc29jX21lbVtjYXN0ZXJdKSkKKyAgICBvYnM9KHt9KTsKKyAgb2JzPShvYnMtKHtucGMsMH0pKSsoe25wY30pOworICBhc3NvY19tZW1bY2FzdGVyXT1vYnM7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBBZGRNZW1iZXJBbmRBc3NvY3Mob2JqZWN0IGNhc3RlcikgeworICBvYmplY3QgKm9icyxvYjsKKyAgaW50IGk7CisKKyAgRG9BZGRNZW1iZXIoY2FzdGVyKTsKKyAgaWYgKCFwb2ludGVycChvYnM9Y2FzdGVyLT5RdWVyeVByb3AoUF9URUFNX0FTU09DX01FTUJFUlMpKSkKKyAgICByZXR1cm47CisgIGZvciAoaT1zaXplb2Yob2JzKS0xO2k+PTA7aS0tKQorICAgIGlmIChvYmplY3RwKG9iPW9ic1tpXSkgJiYgIWNhc3Rlci0+SXNFbmVteShvYikpCisgICAgICBBZGRBc3NvY01lbWJlcihjYXN0ZXIsb2IpOworfQorCitpbnQgQWRkTWVtYmVyKG9iamVjdCBvYikgeworIAorICBpZiAoIUFsbG93ZWQob2IpKQorICAgIHJldHVybiAwOworICAKKyAgLy8gV2VubiBlcyBlaW5lbiBUUCBnaWJ0LCB1bnRlcmxpZWd0IGVyIGVpbmlnZW4gRWluc2NocmFlbmt1bmdlbi4KKyAgLy8gRGFmdWVyIHdpcmQgZXIgYWJlciB2aWEgQXVmbmFobWUgaW5zIFRlYW0gYXVjaCBnZ2YuIFRlYW1sZWl0ZXIsIHdlbm4KKyAgLy8gbm9ldGlnLgorICAvLyBUT0RPOiBEaWVzZXIgQ29kZSBnZWh0IGRhdm9uIGF1cywgZGFzcyBlciBudXIgYXVzIGVpbmVtIEtvbW1hbmRvCisgIC8vIGF1c2dlZnVlaHJ0IHdpcmQgdW5kIFRQIGRlciBWZXJhbmxhc3NlciBkZXIgQXVmbmFobWUgaXN0LiBEaWVzIHNjaGVpbnQKKyAgLy8gbWlyIHVucmVhbGlzdGlzY2guIChaZXNzdHJhKQorICBpZiAoVFAgJiYgVFA9PXByZXZpb3VzX29iamVjdCgpKSB7CisgICAgaWYgKCFBbGxvd2VkKFRQKSkKKyAgICAgIHJldHVybiAwOworICAgIGlmIChUUCE9b2IgJiYgQ2hlY2tTZWNvbmQob2IsKHtUUH0pKSkgey8vIFp3ZWl0aWVyZWdsdW5nIGJlaSBHcnVlbmR1bmcuCisgICAgICBub3RpZnlfZmFpbChvYi0+TmFtZShXRVIpKyIgaXN0IFp3ZWl0c3BpZWxlciB2b24gRGlyLlxuIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCFJc01lbWJlcihsZWFkZXIpKQorICAgICAgQWRkTWVtYmVyQW5kQXNzb2NzKFRQKTsKKyAgICBpZiAoVFAhPWxlYWRlcikgeworICAgICAgbm90aWZ5X2ZhaWwoIk51ciBkZXIgVGVhbWxlaXRlciBrYW5uIE1pdGdsaWVkZXIgYXVmbmVobWVuLlxuIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICBBZGRNZW1iZXJBbmRBc3NvY3Mob2IpOworICByZXR1cm4gMTsKK30KKworcHJpdmF0ZSB2b2lkIERvUmVtb3ZlTWVtYmVyKG9iamVjdCBvYikgeworICBvYmplY3QgKnRtZW1iZXJzLGNhc3RlcjsKKyAgbWl4ZWQgYXNtZW07CisgIGludCBpOworCisgIG9iLT5TZXRQcm9wKFBfVEVBTSwwKTsKKyAgbV9kZWxldGUoaXNfbWVtYmVyLG9iKTsKKyAgbV9kZWxldGUod2FudGVkX3JvdyxvYik7CisgIG1fZGVsZXRlKGFjdF9yb3csb2IpOworICBtX2RlbGV0ZSh3aW1weV9yb3csb2IpOworICBtX2RlbGV0ZShhdXRvZm9sbG93LG9iKTsKKyAgbV9kZWxldGUoYXR0YWNrX2NtZCxvYik7CisgIGlmIChvYmplY3RwKGNhc3Rlcj1hc3NvY19tZW1bb2JdKSAmJiBwb2ludGVycChhc21lbT1hc3NvY19tZW1bY2FzdGVyXSkpCisgICAgYXNzb2NfbWVtW2Nhc3Rlcl09YXNtZW0tKHtvYiwwfSk7CisgIGlmIChxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iKSkgb2ItPlJlbW92ZUhwSG9vayhNRSk7CisgIG1fZGVsZXRlKGhwX2luZm8sb2IpOworICBtX2RlbGV0ZShhdXRvaW5mX2hwLG9iKTsKKyAgbV9kZWxldGUoYXV0b2luZl9zcCxvYik7CisgIERvQ2hhbmdlUm93KG9iLC0xKTsKKworICBpZiAoIW9iamVjdHAoYXNzb2NfbWVtW29iXSkpIHsKKyAgICBpZiAob2ItPlF1ZXJ5UHJvcChQX0dIT1NUKSkgeworICAgICAgZ3RlbGwodXBwZXJfY2FzZShvYi0+bmFtZShXRVIpKSsiIEhBVCBEQVMgVEVBTSBWRVJMQVNTRU4uIiwiVG9kIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHRlbGxfb2JqZWN0KG9iLCJEdSB2ZXJsYWVzc3QgZGFzIFRlYW0uXG4iKTsKKyAgICAgIGd0ZWxsKG9iLT5OYW1lKFdFUikrIiBoYXQgZGFzIFRlYW0gdmVybGFzc2VuLlxuIik7CisgICAgfQorICB9CisgIG1fZGVsZXRlKGFzc29jX21lbSxvYik7CisKKyAgaWYgKElzTWVtYmVyKGxlYWRlcikpIC8vIEhhdCBkYXMgVGVhbSBub2NoIGVpbmVuIExlaXRlcj8KKyAgICByZXR1cm47CisgIHRtZW1iZXJzPU1lbWJlcnMoKTtvYj0wOworICBpZiAoaT1zaXplb2YodG1lbWJlcnMpKSB7CisgICAgb2I9dG1lbWJlcnNbMF07CisgICAgZm9yICgtLWk7aT49MDtpLS0pIHsKKyAgICAgIGlmIChpbnRlcmFjdGl2ZSh0bWVtYmVyc1tpXSkpIHsKKyAgICAgICAgb2I9dG1lbWJlcnNbaV07CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUodG1lbWJlcnNbaV0pKQorICAgICAgICBvYj09dG1lbWJlcnNbaV07CisgICAgfQorICAgIERvQ2hhbmdlTGVhZGVyKG9iKTsKKyAgICBndGVsbChsZWFkZXItPk5hbWUoV0VSKSsiIGhhdCBkaWUgVGVhbWxlaXR1bmcgdWViZXJub21tZW4uXG4iKTsKKyAgICByZXR1cm47CisgIH0KKyAgVHJ5UmVtb3ZlKCk7Cit9CisKK2ludCBSZW1vdmVBc3NvY01lbWJlcihvYmplY3QgY2FzdGVyLCBvYmplY3QgbnBjKSB7CisgIG9iamVjdCAqb2JzOworCisgIGlmIChleHRlcm5fY2FsbCgpICYmIFBPIT1jYXN0ZXIpCisgICAgcmV0dXJuIDA7CisgIGlmICghSXNNZW1iZXIoY2FzdGVyKSB8fCBhc3NvY19tZW1bbnBjXSE9Y2FzdGVyKQorICAgIHJldHVybiAwOworICBEb1JlbW92ZU1lbWJlcihucGMpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgUmVtb3ZlTWVtYmVyQW5kQXNzb2NzKG9iamVjdCBjYXN0ZXIpIHsKKyAgb2JqZWN0ICpvYnMsb2I7CisgIGludCBpOworCisgIGlmIChwb2ludGVycChvYnM9Y2FzdGVyLT5RdWVyeVByb3AoUF9URUFNX0FTU09DX01FTUJFUlMpKSkgeworICAgIGZvciAoaT1zaXplb2Yob2JzKS0xO2k+PTA7aS0tKQorICAgICAgaWYgKG9iamVjdHAob2I9b2JzW2ldKSkKKyAgICAgICAgUmVtb3ZlQXNzb2NNZW1iZXIoY2FzdGVyLG9iKTsKKyAgfQorICBEb1JlbW92ZU1lbWJlcihjYXN0ZXIpOworfQorCitwcml2YXRlIHZvaWQgUmVtb3ZlU2luZ2xlcygpIHsKKyAgb2JqZWN0ICpvYnM7CisgIG1peGVkIGFzbzsKKworICBpZiAoIUlzTWVtYmVyKGxlYWRlcikpIHJldHVybjsKKyAgaWYgKCFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKGxlYWRlcikpIHJldHVybjsgLy8gTlBDIFRlYW0KKyAgb2JzPU1lbWJlcnMoKS0oe2xlYWRlcn0pOworICBpZiAocG9pbnRlcnAoYXNvPWFzc29jX21lbVtsZWFkZXJdKSkKKyAgICBvYnMtPWFzbzsKKyAgaWYgKHNpemVvZihvYnMpKSByZXR1cm47CisgIGd0ZWxsKCJEYXMgVGVhbSBsb2VzdCBzaWNoIGF1Zi5cbiIpOworICBSZW1vdmVNZW1iZXJBbmRBc3NvY3MobGVhZGVyKTsKKyAgVHJ5UmVtb3ZlKCk7Cit9CisKK2ludCBSZW1vdmVNZW1iZXIobWl4ZWQgYXJnKSB7CisgIG9iamVjdCAqbWVtcyxtZW0sb2I7CisgIGludCBpOworICAKKyAgaWYgKG9iamVjdHAoYXJnKSkgeworICAgIG9iPWFyZzsKKyAgfSBlbHNlIGlmIChzdHJpbmdwKGFyZykgJiYgYXJnIT0iIikgeworICAgIG1lbXM9TWVtYmVycygpLSh7bGVhZGVyfSk7CisgICAgZm9yIChpPXNpemVvZihtZW1zKS0xO2k+PTA7aS0tKSB7CisgICAgICBpZiAob2JqZWN0cChtZW09bWVtc1tpXSkgJiYgbWVtLT5pZChhcmcpKSAgeworICAgICAgICBvYj1tZW07CisgICAgICAgIGlmIChxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFvYmplY3RwKG9iKSkKKyAgICAgIHJldHVybiBub3RpZnlfZmFpbChjYXBpdGFsaXplKGFyZykrIiBuaWNodCBnZWZ1bmRlbi5cbiIpLDA7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKFRQIT1sZWFkZXIgJiYgVFAhPW9iICYmIG9iIT1QTykKKyAgICByZXR1cm4gbm90aWZ5X2ZhaWwoIk51ciBkZXIgVGVhbWxlaXRlciBrYW5uIE1pdGdsaWVkZXIgZW50bGFzc2VuLlxuIiksMDsKKyAgaWYgKCFJc01lbWJlcihvYikgJiYgb2ItPlF1ZXJ5UHJvcChQX1RFQU0pIT1NRSkKKyAgICByZXR1cm4gbm90aWZ5X2ZhaWwob2ItPk5hbWUoV0VSKSsiIGlzdCBrZWluIFRlYW1taXRnbGllZC5cbiIpLDA7CisgIGlmIChQTyE9b2IgJiYgb2JqZWN0cChhc3NvY19tZW1bb2JdKSkKKyAgICByZXR1cm4gbm90aWZ5X2ZhaWwob2ItPk5hbWUoV0VSKSsiIGdlaG9lcnQgenUgIisKKyAgICAgICAgICAgICAgICAgICAgICAgYXNzb2NfbWVtW29iXS0+TmFtZShXRU0pKyIuXG4iKSwwOworCisgIFJlbW92ZU1lbWJlckFuZEFzc29jcyhvYik7CisgIFJlbW92ZVNpbmdsZXMoKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgQ2hhbmdlTmFtZShzdHJpbmcgc3RyKSB7CisgIGlmIChsZWFkZXIgJiYgVFAhPWxlYWRlcikKKyAgICByZXR1cm4gbm90aWZ5X2ZhaWwoIk51ciBkZXIgVGVhbWxlaXRlciBrYW5uIGRlbiBOYW1lbiBhZW5kZXJuLlxuIiksMDsKKyAgaWYgKCFzdHIgfHwgc3RyPT0iIikKKyAgICByZXR1cm4gMDsKKyAgc3RyPXN0clswLi4xOV07CisgIGlmICghc3RyaW5ncChzdHI9KFRFQU1fTUFTVEVSLT5SZWdpc3RlclRlYW0oc3RyKSkpKQorICAgIHJldHVybiBub3RpZnlfZmFpbCgiRGVyIE5hbWUgaXN0IHNjaG9uIHZlcmdlYmVuLlxuIiksMDsKKyAgdG5hbWU9c3RyOworICBpZiAob2JqZWN0cChUUCkpCisgICAgZ3RlbGwoVFAtPk5hbWUoV0VSKSsiIGFlbmRlcnQgZGVuIFRlYW1uYW1lbiBhdWYgXCIiK3RuYW1lKyJcIi5cbiIpOworICByZXR1cm4gMTsKK30KKwordm9pZCBUZWFtSW5pdEF0dGFjaygpIHsKKyAgb2JqZWN0ICpvYnMsKmVucywqcmVtb3ZlZCxvYixlbjsKKyAgaW50IGksajsKKworICBkZWJ1ZyhzcHJpbnRmKCJtaXNfaW5pdF9hdHQ6ICVPXG4iLG1pc19pbml0X2F0dCkpOworICBlbnM9bV9pbmRpY2VzKG1pc19pbml0X2F0dCk7cmVtb3ZlZD0oe30pOworICBmb3IgKGk9c2l6ZW9mKGVucyktMTtpPj0wO2ktLSkgeworICAgIGlmICghb2JqZWN0cChlbj1lbnNbaV0pKQorICAgICAgY29udGludWU7CisgICAgaWYgKCFwb2ludGVycChvYnM9bWlzX2luaXRfYXR0W2VuXSkpCisgICAgICBjb250aW51ZTsKKyAgICBmb3IgKGo9c2l6ZW9mKG9icyktMTtqPj0wO2otLSkKKyAgICAgIGlmICghSXNNZW1iZXIob2I9b2JzW2pdKSB8fCBlbnZpcm9ubWVudChvYikhPWVudmlyb25tZW50KGVuKSkKKyAgICAgICAgb2JzW2pdPTA7CisgICAgb2JzLT0oezB9KTsKKyAgICBvYj1lbi0+U2VsZWN0TmVhckVuZW15KG9icywxKTsKKyAgICBkZWJ1ZyhzcHJpbnRmKCJCZWdydWVzc3VuZ3NzY2hsYWcgdm9uICVPIGZ1ZXIgJU9cbiIsZW4sb2IpKTsKKyAgICBpZiAoIW9iamVjdHAob2IpKQorICAgICAgY29udGludWU7CisgICAgZW4tPkF0dGFjazIob2IpOyAvLyBCZWdydWVzc3VuZ3NzY2hsYWcKKyAgICByZW1vdmVkKz0oe2VufSk7IC8vIEtlaW4gQmVncnVlc3N1bmdzc2NobGFnIG1laHIgdm9uIGRpZXNlbSBNb25zdGVyCisgIH0KKworICBmb3IgKGk9c2l6ZW9mKG1pc19hdHRhY2tlZCktMTtpPj0wO2ktLSkKKyAgICBpZiAob2JqZWN0cChvYj1taXNfYXR0YWNrZWRbaV0pKQorICAgICAgb2ItPkV4ZWN1dGVNaXNzaW5nQXR0YWNrcyhyZW1vdmVkKTsKKyAgLy8gQmVncnVlc3N1bmdzc2NobGFlZ2UgZGllIGF1c2dlZnVlaHJ0IHd1cmRlbiBlbnRmZXJuZW4KKyAgLy8gdW5kIG5pY2h0IGF1c2dlZnVlaHJ0ZSBuYWNoaG9sZW4KKworICBtaXNfYXR0YWNrZWQ9KHt9KTsKKyAgbWlzX2luaXRfYXR0PShbXSk7CisgIGF0dF9leGVjPSh7fSk7Cit9CisKK2ludCBJbml0QXR0YWNrX0NhbGxiYWNrKG9iamVjdCBlbmVteSkgeworICBvYmplY3QgKmFycjsKKworICBpZiAoIUlzTWVtYmVyKFBPKSB8fCBtZW1iZXIoYXR0X2V4ZWMsUE8pPDApCisgICAgcmV0dXJuIDA7CisgIGlmICghcG9pbnRlcnAoYXJyPW1pc19pbml0X2F0dFtlbmVteV0pKQorICAgIGFycj0oe30pOworICBtaXNfaW5pdF9hdHRbZW5lbXldPWFycisoe1BPfSk7CisgIGlmIChtZW1iZXIobWlzX2F0dGFja2VkLFBPKTwwKQorICAgIG1pc19hdHRhY2tlZCs9KHtQT30pOworICByZXR1cm4gMTsKK30KKwordm9pZCBUZWFtQXR0YWNrRXhlY3V0ZWRfQ2FsbGJhY2soaW50IHN1Y2Nlc3MpIHsKKyAgaWYgKCFJc01lbWJlcihQTykpCisgICAgcmV0dXJuOworICBhdHRfZXhlYy09KHtQTywwfSk7CisgIGlmICghc2l6ZW9mKGF0dF9leGVjKSkKKyAgICBUZWFtSW5pdEF0dGFjaygpOworfQorCitwcml2YXRlIGludCBTdGFydEF0dGFjaygpIHsKKyAgb2JqZWN0ICp0bWVtYmVycyxvYixlbnY7CisgIGludCBpOworCisgIGlmIChUUCE9bGVhZGVyIHx8ICFvYmplY3RwKGVudj1lbnZpcm9ubWVudChUUCkpKQorICAgIHJldHVybiBub3RpZnlfZmFpbCgiTnVyIGRlciBUZWFtbGVpdGVyIGthbm4gZGVuIEFuZ3JpZmYgc3RhcnRlbi5cbiIpLDA7CisgIHRtZW1iZXJzPU1lbWJlcnMoKTsKKyAgVGVhbUluaXRBdHRhY2soKTsgLy8gRmFsbHMgbm9jaCBTY2hsYWVnZSBmZWhsZW4uLi4uCisgIGZvciAoaT1zaXplb2YodG1lbWJlcnMpLTE7aT49MDtpLS0pCisgICAgaWYgKG9iamVjdHAob2I9dG1lbWJlcnNbaV0pICYmIHN0cmluZ3AoYXR0YWNrX2NtZFtvYl0pKQorICAgICAgaWYgKG9iLT5DYWxsVGVhbUF0dGFjayhlbnYpKSAvLyBBbmdyaWZmIHdpcmQgYXVzZ2VmdWVocnQ/CisgICAgICAgIGF0dF9leGVjKz0oe29ifSk7ICAgICAgICAgIC8vIExpc3RlIGRlciBBbmdyZWlmZXIKKyAgZ3RlbGwoVFAtPk5hbWUoV0VSKSsiIHN0YXJ0ZXQgZGVuIEFuZ3JpZmYuXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgU3RhcnRGb2xsb3cob2JqZWN0IGVudikgeworICBvYmplY3QgKnRtZW1iZXJzLG9iOworICBpbnQgaTsKKyAgc3RyaW5nIGNtZCxhcmdzOworCisgIC8vIHByaW50ZigibGQ6JU8gUE86JU8gVFA6JU8gcXY6JU8gZW52OiVPXG4iLGxlYWRlcixQTyxUUCxxdWVyeV92ZXJiKCksZW52KTsKKyAgaWYgKFRQIT1sZWFkZXIKKyAgICAgIHx8ICFzdHJpbmdwKGNtZD1xdWVyeV92ZXJiKCkpCisgICAgICB8fCAhb2JqZWN0cChlbnYpCisgICAgICB8fCBUUCE9UE8KKyAgICAgIHx8IFRQLT5RdWVyeVByb3AoUF9HSE9TVCkgLy8gRGVyIEJlZmVobCB3YXIgd29obCB1bmdlc3VuZC4uLgorICAgICAgfHwgVFAtPklzVGVhbU1vdmUoKSkgLy8gQW5ncmlmZnNiZWZlaGwgbmljaHQgZHVyY2ggdmVyZm9sZ2UgMiBtYWwuLi4KKyAgICByZXR1cm47CisgIGNtZD0iXFwiK2NtZDsKKyAgaWYgKHN0cmluZ3AoYXJncz1UUC0+X3VucGFyc2VkX2FyZ3MoKSkgJiYgYXJncyE9IiIpCisgICAgY21kKz0oIiAiK2FyZ3MpOworICB0bWVtYmVycz1NZW1iZXJzKCktKHtsZWFkZXJ9KTsKKyAgZm9yIChpPXNpemVvZih0bWVtYmVycyktMTtpPj0wO2ktLSkKKyAgICBpZiAob2JqZWN0cChvYj10bWVtYmVyc1tpXSkgJiYgYXV0b2ZvbGxvd1tvYl0pICAgIAorICAgIAlpZighcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYikgIHx8IGVudj09ZW52aXJvbm1lbnQob2IpKSAvLyBhdXRvZm9sZ2UgbnVyIGJlaSBhbmZ1ZWhyZXIgaW0gZ2xlaWNoZW4gcmF1bQorICAgIAkgICAgICBvYi0+Q2FsbFRlYW1Gb2xsb3coZW52LGNtZCk7Cit9CisKK3ZvaWQgU2hvd1RlYW1JbmZvKCkgeworICBpbnQgaTsKKyAgb2JqZWN0ICp0bWVtYmVycyxvYjsKKyAgc3RyaW5nIGZvcm07CisKKyAgaWYgKCFUSSB8fCBUUCE9VEkgfHwgIUlTX0xFQVJORVIoVEkpKQorICAgIHJldHVybjsKKworICBVcGRhdGVBY3RSb3coKTsKKyAgZm9ybT0iIjsKKyAgZm9yIChpPTA7aTxNQVhfVEVBTVJPV1M7aSsrKQorICAgIGZvcm0rPXNwcmludGYoIiAlZC0lZCIsZm9ybWluW2ldLGZvcm1heFtpXSk7CisgIHByaW50ZigiJXMgWyVPXSBMOiAlcyBGOiVzXG4iLG5hbWUoKSxNRSwKKyAgICAgICAgIChvYmplY3RwKGxlYWRlcik/bGVhZGVyLT5OYW1lKFdFUik6Ij8iKSxmb3JtKTsKKyAgdG1lbWJlcnM9TWVtYmVycygpOworICBmb3IgKGk9c2l6ZW9mKHRtZW1iZXJzKS0xO2k+PTA7aS0tKSB7CisgICAgb2I9dG1lbWJlcnNbaV07CisgICAgcHJpbnRmKCIgICVkKCVkKSAlcyBbJU9dXG4iLAorICAgICAgICAgICBhY3Rfcm93W29iXSx3YW50ZWRfcm93W29iXSxvYi0+TmFtZShXRVIpLG9iKTsKKyAgfQorfQorCit2YXJhcmdzIGludCBTaG93VGVhbUhQKHN0cmluZyBhcmcpIHsKKyAgb2JqZWN0ICp0bWVtYmVycyxvYjsKKyAgY2xvc3VyZSBxcDsKKyAgaW50IGksbG9uZ2luZjsKKyAgbWl4ZWQgKnZhbHMsKnJlcyxjb2xzLGZyLHJyLHRlcm1zdHI7CisgIG1hcHBpbmcgcmVhbF9yb3c7CisgIHN0cmluZyBubSxpbmY7CisKKyAgaWYgKGFyZyAmJiBhcmdbMC4uM109PSJsYW5nIikgeworICAgIGlmIChUUCE9bGVhZGVyKQorICAgICAgcmV0dXJuIG5vdGlmeV9mYWlsKCJOdXIgZGVyIFRlYW1sZWl0ZXIga2FubiBkaWUgbGFuZ2UgIisKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVWViZXJzaWNodCBhdWZydWZlbi5cbiIpLDA7CisgICAgbG9uZ2luZj0xOworICAgIGFyZz1hcmdbNS4uXTsKKyAgfSBlbHNlCisgICAgbG9uZ2luZj0wOworICByZWFsX3Jvdz1QcmVzZW50UG9zaXRpb25zKGVudmlyb25tZW50KFRQKSk7CisgIHRtZW1iZXJzPSh7fSk7CisgIGZvciAoaT0wO2k8TUFYX1RFQU1ST1dTO2krKykKKyAgICB0bWVtYmVycys9cm93c1tpXTsKKyAgcmVzPSh7fSk7CisgIHN3aXRjaChUUC0+UXVlcnlQcm9wKFBfVFRZKSkgeworICBjYXNlICJhbnNpIjoKKyAgICB0ZXJtc3RyPSh7QU5TSV9SRUQrQU5TSV9CT0xELEFOU0lfWUVMTE9XLEFOU0lfR1JFRU4sQU5TSV9OT1JNQUwsCisgICAgICAgICAgICAgIEFOU0lfVU5ERVJMfSk7CisgICAgYnJlYWs7CisgIGNhc2UgInZ0MTAwIjoKKyAgICB0ZXJtc3RyPSh7QU5TSV9CT0xELCIiLCIiLEFOU0lfTk9STUFMLEFOU0lfVU5ERVJMfSk7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgdGVybXN0cj0oeyIiLCIiLCIiLCIiLCIifSk7CisgIH0KKyAgdmFscz0oeyIiLDAsMCx0ZXJtc3RyWzNdLCIiLDAsMCx0ZXJtc3RyWzNdfSk7CisKKyAgcHJpbnRmKCIgIE5hbWUgICAgICAgIEdpbGRlICAgICAgICAgICBMViBHTFYgIExQIChNTFApICBLUCAoTUtQKSBWb3JzLiBHUiBBUiBUUiBGUiBBIFZcbiIpOworICBpZiAobG9uZ2luZikKKyAgICBwcmludGYoIiAgKFplaWxlIDIpICAgQW5ncmlmZnNiZWZlaGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsdWNodHJpY2h0dW5nXG4iKTsKKworICBmb3IgKGk9c2l6ZW9mKHRtZW1iZXJzKS0xO2k+PTA7aS0tKSB7CisgICAgaWYgKCFvYmplY3RwKG9iPXRtZW1iZXJzW2ldKSkgY29udGludWU7CisgICAgcXA9c3ltYm9sX2Z1bmN0aW9uKCJRdWVyeVByb3AiLG9iKTsKKyAgICBmcj1HZXRIcEluZm8ob2IscXApOworICAgIHZhbHNbMV09ZnJbMF07dmFsc1syXT1mclsxXTt2YWxzWzVdPWZyWzJdO3ZhbHNbNl09ZnJbM107CisgICAgLyoKKyAgICB2YWxzWzFdPWZ1bmNhbGwocXAsUF9IUCk7dmFsc1syXT1mdW5jYWxsKHFwLFBfTUFYX0hQKTsKKyAgICB2YWxzWzVdPWZ1bmNhbGwocXAsUF9TUCk7dmFsc1s2XT1mdW5jYWxsKHFwLFBfTUFYX1NQKTsKKyAgICAqLworICAgIGlmICghcG9pbnRlcnAoY29scz1mdW5jYWxsKHFwLFBfVEVBTV9DT0xPUlMpKSB8fCBzaXplb2YoY29scyk8NCkKKyAgICAgIGNvbHM9KHt2YWxzWzJdLzQsdmFsc1syXS8yLHZhbHNbNl0vNCx2YWxzWzZdLzJ9KTsKKyAgICBpZiAodmFsc1sxXTxjb2xzWzBdKQorICAgICAgdmFsc1swXT10ZXJtc3RyWzBdOworICAgIGVsc2UgaWYgKHZhbHNbMV08Y29sc1sxXSkKKyAgICAgIHZhbHNbMF09dGVybXN0clsxXTsKKyAgICBlbHNlCisgICAgICB2YWxzWzBdPXRlcm1zdHJbMl07CisgICAgaWYgKHZhbHNbNV08Y29sc1syXSkKKyAgICAgIHZhbHNbNF09dGVybXN0clswXTsKKyAgICBlbHNlIGlmICh2YWxzWzVdPGNvbHNbM10pCisgICAgICB2YWxzWzRdPXRlcm1zdHJbMV07CisgICAgZWxzZQorICAgICAgdmFsc1s0XT10ZXJtc3RyWzJdOworICAgIGlmIChpbnRwKGZyPXdpbXB5X3Jvd1tvYl0pICYmIGZyPjEpIGZyPXNwcmludGYoIiUyZCIsZnIpOyBlbHNlIGZyPSItLSI7CisgICAgaWYgKGludHAocnI9cmVhbF9yb3dbb2JdKSAmJiBycj4wKSAgcnI9c3ByaW50ZigiJTJkIixycik7IGVsc2UgcnI9Ii0tIjsKKyAgICBubT1vYi0+TmFtZShSQVcpOworICAgIGluZj1zcHJpbnRmKCIlcyAlLTExcyVzICUtMTRzICUzZCAlM2QgJXMlM2QgKCUzZCklcyAlcyUzZCAoJTNkKSVzICU1ZCAlMmQgJTJkICUycyAlMnMgJTFzICUxc1xuIiwKKyAgICAgICAgICAgICAgICgob2I9PWxlYWRlcik/KHRlcm1zdHJbNF0rIioiKToiICIpLAorICAgICAgICAgICAgICAgbm1bMC4uMTBdLHRlcm1zdHJbM10sCisgICAgICAgICAgICAgICBjYXBpdGFsaXplKGZ1bmNhbGwocXAsUF9HVUlMRCl8fCIiKVswLi4xM10sCisgICAgICAgICAgICAgICBmdW5jYWxsKHFwLFBfTEVWRUwpLAorICAgICAgICAgICAgICAgZnVuY2FsbChxcCxQX0dVSUxEX0xFVkVMKSwKKyAgICAgICAgICAgICAgIHZhbHNbMF0sdmFsc1sxXSx2YWxzWzJdLHZhbHNbM10sCisgICAgICAgICAgICAgICB2YWxzWzRdLHZhbHNbNV0sdmFsc1s2XSx2YWxzWzddLAorICAgICAgICAgICAgICAgZnVuY2FsbChxcCxQX1dJTVBZKSwKKyAgICAgICAgICAgICAgIHdhbnRlZF9yb3dbb2JdLGFjdF9yb3dbb2JdLHJyLGZyLAorICAgICAgICAgICAgICAgKGF0dGFja19jbWRbb2JdPyJYIjoiLSIpLAorICAgICAgICAgICAgICAgKGF1dG9mb2xsb3dbb2JdPyJYIjoiLSIpKTsKKyAgICBpZiAobG9uZ2luZikgeworICAgICAgaWYgKCFzdHJpbmdwKGZyPWZ1bmNhbGwocXAsUF9XSU1QWV9ESVJFQ1RJT04pKSkgZnI9IiI7CisgICAgICBpZiAoIXN0cmluZ3AocnI9YXR0YWNrX2NtZFtvYl0pKSBycj0iIjsKKyAgICAgIGlmIChmciE9IiIgfHwgcnIhPSIiKQorICAgICAgICBpbmYrPXNwcmludGYoIiAgICAgICAgICAgICAgJS00MnMgJS0yMXNcbiIscnJbMC4uNDFdLGZyWzAuLjIwXSk7CisgICAgfQorCisgICAgc3dpdGNoIChhcmcpIHsKKyAgICBjYXNlICJhbHBoYWJldGlzY2giOgorICAgICAgcmVzKz0oeyh7KHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2IpPyIwIjoiMSIpK25tLGluZn0pfSk7CisgICAgICBicmVhazsKKyAgICBjYXNlICJzb3J0aWVydCI6CisgICAgICByZXMrPSh7KHtzcHJpbnRmKCIlMnMgJTJkICUyZCAlcyIscnIsYWN0X3Jvd1tvYl0sd2FudGVkX3Jvd1tvYl0sbm0pLAorICAgICAgICAgICAgICAgICBpbmZ9KX0pOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJlcys9KHsoe2ksaW5mfSl9KTsKKyAgICB9CisgIH0KKyAgaWYgKGFyZyAmJiBhcmchPSIiKQorICAgIHJlcz1zb3J0X2FycmF5KHJlcywiQ21wRmlyc3RBcnJheUVsZW1lbnQiLE1FKTsKKyAgZm9yIChpPXNpemVvZihyZXMpLTE7aT49MDtpLS0pCisgICAgd3JpdGUocmVzW2ldWzFdKTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZhcmFyZ3MgaW50IFNob3dUZWFtUm9vbXMoc3RyaW5nIGFyZykgeworICBvYmplY3QgKnRtZW1iZXJzLG9iOworICBzdHJpbmcgczEsczI7CisgIG1peGVkICpyZXM7CisgIGludCBpOworCisgIHRtZW1iZXJzPU1lbWJlcnMoKTtyZXM9KHt9KTsKKyAgZm9yIChpPXNpemVvZih0bWVtYmVycyktMTtpPj0wO2ktLSkgeworICAgIGlmICghb2JqZWN0cChvYj10bWVtYmVyc1tpXSkpIGNvbnRpbnVlOworICAgIGlmICghcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYikgJiYgYXJnIT0iYWxsZSIpIGNvbnRpbnVlOworICAgIHMxPW9iLT5OYW1lKFJBVyk7CisgICAgaWYgKCFvYmplY3RwKG9iPWVudmlyb25tZW50KG9iKSkpIGNvbnRpbnVlOworICAgIGlmICghc3RyaW5ncChzMj1vYi0+UXVlcnlQcm9wKFBfSU5UX1NIT1JUKSkpIHMyPSIiOworICAgIHJlcys9KHsoe3MxLHMyfSl9KTsKKyAgfQorICByZXM9c29ydF9hcnJheShyZXMsIkNtcEZpcnN0QXJyYXlFbGVtZW50IixNRSk7CisgIGZvciAoaT1zaXplb2YocmVzKS0xO2k+PTA7aS0tKQorICAgIHByaW50ZigiJS0xMXMgJS02NnNcbiIscmVzW2ldWzBdWzAuLjEwXSxyZXNbaV1bMV1bMC4uNjVdKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBDaGFuZ2VDb2xvcnMoc3RyaW5nIGFyZykgeworICBpbnQgKmNvbDsKKworICBub3RpZnlfZmFpbCgidGVhbSBmYXJiZW4gbHBfcm90IGxwX2dlbGIgW2twX3JvdCBrcF9nZWxiXVxuIik7CisgIGlmICghYXJnKQorICAgIHJldHVybiAwOworICBjb2w9KHswLDAsMCwwfSk7CisgIGlmIChzc2NhbmYoYXJnLCIlZCAlZCAlZCAlZCIsY29sWzBdLGNvbFsxXSxjb2xbMl0sY29sWzNdKSE9NCkgeworICAgIGlmIChzc2NhbmYoYXJnLCIlZCAlZCIsY29sWzBdLGNvbFsxXSkhPTIpCisgICAgICByZXR1cm4gMDsKKyAgICBjb2xbMl09Y29sWzBdO2NvbFszXT1jb2xbMV07CisgIH0KKyAgcHJpbnRmKCJEaWUgQW56ZWlnZSBpc3QgamV0enQgZ2VsYiB1bnRlciAlZCBMUCwgcm90IHVudGVyICVkIExQXG4iKworICAgICAgICAgIiAgICAgICAgICAgICAgICAgYnp3LiBnZWxiIHVudGVyICVkIEtQLCByb3QgdW50ZXIgJWQgS1AuXG4iLAorICAgICAgICAgY29sWzFdLGNvbFswXSxjb2xbM10sY29sWzJdKTsKKyAgVFAtPlNldFByb3AoUF9URUFNX0NPTE9SUyxjb2wpOworICBUUC0+U2V0KFBfVEVBTV9DT0xPUlMsU0FWRSxGX01PREVfQVMpOworICByZXR1cm4gMTsKK30KKworaW50IENoYW5nZUF1dG9JbmZvKHN0cmluZyBhcmcpIHsKKyAgc3RyaW5nICp3b3Jkcyx0eHQ7CisgIGludCBpLGZsOworCisgIGlmIChUUCE9bGVhZGVyKQorICAgIHJldHVybiBub3RpZnlfZmFpbCgiTnVyIGRlciBUZWFtbGVpdGVyIGthbm4gYXV0b21hdGlzY2ggIisKKyAgICAgICAgICAgICAgICAgICAgICAgImluZm9ybWllcnQgd2VyZGVuLlxuIiksMDsKKyAgd29yZHM9b2xkX2V4cGxvZGUoYXJnP2FyZzoiIiwiICIpO2ZsPTA7CisgIGZvciAoaT1zaXplb2Yod29yZHMpLTE7aT49MDtpLS0pIHsKKyAgICBzd2l0Y2god29yZHNbaV0pIHsKKyAgICBjYXNlICJhdXMiOgorICAgICAgd3JpdGUoIkR1IHdpcnN0IG5pY2h0IG1laHIgYXV0b21hdGlzY2ggaW5mb3JtaWVydC5cbiIpOworICAgICAgYXV0b2luZl9mbGFncz0wOworICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSAiK2twIjoKKyAgICAgIGZsfD1BVVRPSU5GX1NQX1BMVVM7CisgICAgY2FzZSAia3AiOgorICAgICAgZmx8PUFVVE9JTkZfU1BfTUlOVVM7CisgICAgICBicmVhazsKKyAgICBjYXNlICIrbHAiOgorICAgICAgZmx8PUFVVE9JTkZfSFBfUExVUzsKKyAgICBjYXNlICJscCI6CisgICAgY2FzZSAiZWluIjoKKyAgICBjYXNlICJhbiI6CisgICAgICBmbHw9QVVUT0lORl9IUF9NSU5VUzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgInNvZm9ydCI6CisgICAgICBmbHw9QVVUT0lORl9JTlNUQU5UOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIDsKKyAgICB9CisgIH0KKyAgaWYgKCFmbCkKKyAgICByZXR1cm4gbm90aWZ5X2ZhaWwoIldJRSBtb2VjaHRlc3QgRHUgYXV0b21hdGlzY2ggaW5mb3JtaWVydCB3ZXJkZW4/XG4iKSwwOworICBpZiAoZmw9PUFVVE9JTkZfSU5TVEFOVCkgZmx8PUFVVE9JTkZfSFBfTUlOVVM7CisgIGF1dG9pbmZfZmxhZ3M9Zmw7CisgIHR4dD0iRHUgd2lyc3QiKygoZmwmQVVUT0lORl9JTlNUQU5UKT8iIHNvZm9ydCAiOiIgIikrImluZm9ybWllcnQsIHdlbm4iOworICBpZiAoZmwmKEFVVE9JTkZfSFBfUExVU3xBVVRPSU5GX0hQX01JTlVTKSkgeworICAgIHR4dCs9IiBkaWUgTGViZW5zcHVua3RlIGVpbmVzIFRlYW1taXRnbGllZHMiOworICAgIGlmIChmbCYoQVVUT0lORl9IUF9QTFVTKSkgdHh0Kz0iIHNpY2ggYWVuZGVybiI7IGVsc2UgdHh0Kz0iIGZhbGxlbiI7CisgICAgaWYgKGZsJihBVVRPSU5GX1NQX1BMVVN8QVVUT0lORl9TUF9NSU5VUykpIHR4dCs9IiBvZGVyIjsKKyAgfQorICBpZiAoZmwmKEFVVE9JTkZfU1BfUExVU3xBVVRPSU5GX1NQX01JTlVTKSkgeworICAgIHR4dCs9IiBkaWUgS29uemVudHJhdGlvbnNwdW5rdGUiOworICAgIGlmIChmbCYoQVVUT0lORl9TUF9QTFVTKSkgdHh0Kz0iIHNpY2ggYWVuZGVybiI7IGVsc2UgdHh0Kz0iIGZhbGxlbiI7CisgIH0KKyAgd3JpdGUoYnJlYWtfc3RyaW5nKHR4dCsiLlxuIiw3OCkpOworICByZXR1cm4gMTsKK30KKworcHJpdmF0ZSB2b2lkIERvTm90aWZ5SHBDaGFuZ2UoKSB7CisgIG9iamVjdCAqb2JzLG9iOworICBzdHJpbmcgc3RyOworICBpbnQgaTsKKworICBhdXRvaW5mX3RpbWU9dGltZSgpOworICBzdHI9IiI7CisgIG9icz1tX2luZGljZXMoYXV0b2luZl9ocCk7CisgIGZvciAoaT1zaXplb2Yob2JzKS0xO2k+PTA7aS0tKSB7CisgICAgaWYgKCFvYmplY3RwKG9iPW9ic1tpXSkpIGNvbnRpbnVlOworICAgIGlmIChzdHIhPSIiKSBzdHIrPSIsICI7CisgICAgc3RyKz1zcHJpbnRmKCIlczogJWQgTFAiLG9iLT5uYW1lKFdFUiksYXV0b2luZl9ocFtvYl0pOworICAgIGlmIChtZW1iZXIoYXV0b2luZl9zcCxvYikpCisgICAgICBzdHIrPXNwcmludGYoIiAvICVkIEtQIixhdXRvaW5mX3NwW29iXSk7CisgICAgbV9kZWxldGUoYXV0b2luZl9zcCxvYik7CisgIH0KKyAgb2JzPW1faW5kaWNlcyhhdXRvaW5mX3NwKTsKKyAgZm9yIChpPXNpemVvZihvYnMpLTE7aT49MDtpLS0pIHsKKyAgICBpZiAoIW9iamVjdHAob2I9b2JzW2ldKSkgY29udGludWU7CisgICAgaWYgKHN0ciE9IiIpIHN0cis9IiwgIjsKKyAgICBzdHIrPXNwcmludGYoIiVzOiAlZCBLUCIsb2ItPm5hbWUoV0VSKSxhdXRvaW5mX3NwW29iXSk7CisgIH0KKworICBpZiAoc3RyIT0iIiAmJiBJc01lbWJlcihsZWFkZXIpKQorICAgIHRlbGxfb2JqZWN0KGxlYWRlcixicmVha19zdHJpbmcoY2FwaXRhbGl6ZShzdHIpKyJcbiIsNzgpKTsKKyAgYXV0b2luZl9ocD0oW10pOworICBhdXRvaW5mX3NwPShbXSk7Cit9CisKK3ZvaWQgTm90aWZ5SHBDaGFuZ2UoKSB7CisgIG1peGVkIGFjdCxvbGQ7CisgIGludCBjaGFuZ2U7CisKKyAgaWYgKCFJc01lbWJlcihQTykgfHwgIXBvaW50ZXJwKGFjdD1ocF9pbmZvW1BPXSkpCisgICAgcmV0dXJuOworICBvbGQ9YWN0WzAuLl07CisgIGFjdD1HZXRIcEluZm8oUE8pO2NoYW5nZT0wOworICBpZiAoIWF1dG9pbmZfZmxhZ3MpIHJldHVybjsKKyAgaWYgKCgoYXV0b2luZl9mbGFncyZBVVRPSU5GX0hQX01JTlVTKSAmJiBhY3RbMF08b2xkWzBdKSB8fAorICAgICAgKChhdXRvaW5mX2ZsYWdzJkFVVE9JTkZfSFBfUExVUykgICYmIGFjdFswXT5vbGRbMF0pKQorICAgIGF1dG9pbmZfaHBbUE9dPWFjdFswXSxjaGFuZ2U9MTsKKyAgaWYgKCgoYXV0b2luZl9mbGFncyZBVVRPSU5GX1NQX01JTlVTKSAmJiBhY3RbMl08b2xkWzJdKSB8fAorICAgICAgKChhdXRvaW5mX2ZsYWdzJkFVVE9JTkZfU1BfUExVUykgICYmIGFjdFsyXT5vbGRbMl0pKQorICAgIGF1dG9pbmZfc3BbUE9dPWFjdFsyXSxjaGFuZ2U9MTsKKworICBpZiAoYXV0b2luZl90aW1lPHRpbWUoKSB8fCAoY2hhbmdlICYmIChhdXRvaW5mX2ZsYWdzJkFVVE9JTkZfSU5TVEFOVCkpKQorICAgIERvTm90aWZ5SHBDaGFuZ2UoKTsKK30KKworaW50IFRlYW1DbWQoc3RyaW5nIGNtZCwgc3RyaW5nIGFyZykgeworICBpZiAoIUlzTWVtYmVyKFRQKSkgeworICAgIG5vdGlmeV9mYWlsKCJEdSBiaXN0IGtlaW4gVGVhbW1pdGdsaWVkLlxuIik7CisgICAgaWYgKFRQLT5RdWVyeVByb3AoUF9URUFNKT09TUUpCisgICAgICBUUC0+U2V0UHJvcChQX1RFQU0sMCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgc3dpdGNoKGNtZCkgeworICBjYXNlICJhbmdyaWZmIjoKKyAgICByZXR1cm4gU3RhcnRBdHRhY2soKTsKKyAgY2FzZSAiYW5ncmlmZnNiZWZlaGwiOgorICAgIGlmIChzdHJpbmdwKGFyZykpCisgICAgICBhdHRhY2tfY21kW1RQXT1hcmc7CisgICAgZWxzZQorICAgICAgbV9kZWxldGUoYXR0YWNrX2NtZCxhcmcpOworICAgIHJldHVybiAxOworICBjYXNlICJhdXRvZm9sZ2UiOgorICBjYXNlICJhdXRvZiI6CisgICAgaWYgKGFyZz09ImVpbiIgfHwgYXJnPT0iYW4iKQorICAgICAgYXV0b2ZvbGxvd1tUUF09MTsKKyAgICBlbHNlCisgICAgICBtX2RlbGV0ZShhdXRvZm9sbG93LFRQKTsKKyAgICByZXR1cm4gMTsKKyAgY2FzZSAiYXV0b2kiOgorICBjYXNlICJhdXRvaW5mIjoKKyAgY2FzZSAiYXV0b2luZm8iOgorICBjYXNlICJhdXRvaW5mb3JtIjoKKyAgICByZXR1cm4gQ2hhbmdlQXV0b0luZm8oYXJnKTsKKyAgY2FzZSAiZW50bGFzc2UiOgorICAgIHJldHVybiBSZW1vdmVNZW1iZXIoYXJnKTsKKyAgY2FzZSAiZmFyYmVuIjoKKyAgICByZXR1cm4gQ2hhbmdlQ29sb3JzKGFyZyk7CisgIGNhc2UgImZsdWNodHJlaWhlIjoKKyAgY2FzZSAiZmx1Y2h0IjoKKyAgICByZXR1cm4gQ2hhbmdlV2ltcHlSb3coYXJnKTsKKyAgY2FzZSAiZm9ybWF0aW9uIjoKKyAgICBpZiAoVFAhPWxlYWRlcikKKyAgICAgIHJldHVybiBub3RpZnlfZmFpbCgiTnVyIGRlciBUZWFtbGVpdGVyIGthbm4gZGllIEZvcm1hdGlvbiBhZW5kZXJuLlxuIiksMDsKKyAgICByZXR1cm4gQ2hhbmdlRm9ybWF0aW9uKGFyZyk7CisgIGNhc2UgImhpc3QiOgorICBjYXNlICJoaXN0b3J5IjoKKyAgICByZXR1cm4gSGlzdChhcmcpOworICBjYXNlICIiOgorICBjYXNlICJpbmZvIjoKKyAgICByZXR1cm4gU2hvd1RlYW1IUChhcmcpOworICBjYXNlICJsZWl0ZXIiOgorICBjYXNlICJsZWl0ZXJpbiI6CisgIGNhc2UgImxlaXR1bmciOgorICAgIHJldHVybiBDaGFuZ2VMZWFkZXIoYXJnKTsKKyAgY2FzZSAibmFtZSI6CisgICAgcmV0dXJuIENoYW5nZU5hbWUoYXJnKTsKKyAgY2FzZSAib3J0ZSI6CisgICAgcmV0dXJuIFNob3dUZWFtUm9vbXMoYXJnKTsKKyAgY2FzZSAia2FtcGZyZWloZSI6CisgIGNhc2UgInJlaWhlIjoKKyAgICByZXR1cm4gQ2hhbmdlUm93KGFyZyk7CisgIGNhc2UgInJ1ZiI6CisgIGNhc2UgInJ1ZmUiOgorICAgIHJldHVybiBTaG91dChhcmcpOworICBjYXNlICJ2ZXJsYXNzZSI6CisgICAgVFAtPlNldFByb3AoUF9URUFNLDApOworICAgIHJldHVybiBSZW1vdmVNZW1iZXIoVFApOworICBkZWZhdWx0OjsKKyAgfQorICByZXR1cm4gMDsKK30KKwordm9pZCByZXNldCgpIHsKKyAgUmVtb3ZlU2luZ2xlcygpOworICBUcnlSZW1vdmUoKTsKK30KZGlmZiAtLWdpdCBhL29iai90ZXN0bW9uc3Rlci5jIGIvb2JqL3Rlc3Rtb25zdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWViZjBiNAotLS0gL2Rldi9udWxsCisrKyBiL29iai90ZXN0bW9uc3Rlci5jCkBAIC0wLDAgKzEsODkgQEAKK2luaGVyaXQgInN0ZC9ucGMiOworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorCitpbnQgd2FydGU7CisgCitjcmVhdGUoKQoreworICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuOworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfTkFNRSwgIlRlc3Rtb25zdGVyIik7CisgIFNldFByb3AoUF9HRU5ERVIsIE5FVVRFUik7CisgIFNldFByb3AoUF9TSE9SVCwgIkRhcyBUZXN0bW9uc3RlciAtIG5lcnZ0b2V0ZW5kIC0iKTsKKyAgU2V0UHJvcChQX0FMSUdOLCAxMDApOworICBTZXRQcm9wKFBfTE9ORywgCisgICJEaWVzIGlzdCBUZXN0aWUsIGRhcyBUZXN0bW9uc3Rlci4gRXMgaGF0dGUgYWxsZSBtb2VnbGljaGVuLCB1ZWJlbCBhdXNzZWhlbmRlblxuIisKKyAgIlRlc3RnZXJhZXRlIGRhYmVpLiBMZWcgRGljaCBsaWViZXIgbmljaHQgbWl0IGlobSBhbiAuLi5cbiIpOworICBBZGRJZCgibW9uc3RlciIpOworICBBZGRJZCgidGVzdG1vbnN0ZXIiKTsKKyAgQWRkSWQoInRlc3RpZSIpOworICBTZXRQcm9wKFBfUkFDRSwgInRlc3RlciIpOworICBTZXRQcm9wKFBfTEVWRUwsIDE5KTsKKyAgU2V0UHJvcChQX01BWF9IUCwgMjc1KTsKKyAgU2V0UHJvcChQX0hQLCAyNzUpOworICBTZXRQcm9wKFBfWFAsIDApOworICBTZXRQcm9wKFBfSEFORFMsICh7IiBtaXQgZWluZW0gU3Bhbm51bmdzcHJ1ZWZlciIsIDV9KSApOworICBTZXRQcm9wKFBfQUMsIDEpOworICBzZXRldWlkKGdldHVpZCh0aGlzX29iamVjdCgpKSk7CisgIEFkZFNwZWxsKDEsNSwiRWluIFRlc3Rtb25zdGVyIHNjaGxhZWd0IERpciBlaW4gVGVzdGhlZnQgdW0gZGllIE9ocmVuLlxuIiwKKyAgICAgICAgICAgICAgICJFaW4gVGVzdG1vbnN0ZXIgc2NobGFlZ3QgQFdFTiBtaXQgZWluZW0gVGVzdGhlZnQuXG4iKTsKKyAgQWRkU3BlbGwoMSw4LCJFaW4gVGVzdG1vbnN0ZXIgdGVzdGV0IERlaW5lIFJlYWt0aW9uIGF1ZiBIaXR6ZS5cbiIsCisgICAgICAgICAgICAgICAiRWluIFRlc3Rtb25zdGVyIGhhZWx0IGVpbiBGZXVlcnpldWcgdW50ZXIgQFdFU1NFTiBIaW50ZXJuLlxuIik7CisgIEFkZFNwZWxsKDEsMTEsIkVpbiBUZXN0bW9uc3RlciB0ZXN0ZXQgRGVpbmUgUmVha3Rpb24gYXVmIGVsZWt0cmlzY2hlbiBTdHJvbS5cbiIsCisgICAgICAgICAgICAgICAgIkVpbiBUZXN0bW9uc3RlciB2ZXJwYXNzdCBAV0VNIGVpbmVuIEVsZWt0cm9zY2hvY2suXG4iKTsKKyAgQWRkU3BlbGwoMSwxNSwiRWluIFRlc3Rtb25zdGVyIHRlc3RldCBEZWluZSBTYWV1cmViZXN0YWVuZGlna2VpdC5cbiIsCisgICAgICAgICAgICAgICAgIkVpbiBUZXN0bW9uc3RlciB1ZWJlcnNjaHVldHRldCBAV0VOIG1pdCBrb256ZW50cmllcnRlciBTYWV1cmUuXG4iKTsKKyAgQWRkU3BlbGwoMSwxMCwiRWluIFRlc3Rtb25zdGVyIG5pbW10IGVpbmUgQmx1dHByb2JlIHZvbiBEaXIuXG4iLAorICAgICAgICAgICAgICAgICJFaW4gVGVzdG1vbnN0ZXIgc3RpY2h0IEBXRU4gbWl0IGVpbmVyIGdpZ2FudGlzY2hlbiBOYWRlbC5cbiIpOworICBTZXRQcm9wKFBfU1BFTExSQVRFLDUwKTsKKyAgd2FydGU9MTA7Cit9CisKK2dpdmVfbm90aWZ5KG9iaikKK3sKKyAgd3JpdGUoIkRhbmtlIGZ1ZXIgIitvYmotPm5hbWUoV0VOLCAxKSsiLlxuIik7CisgIHJldHVybiAxOworfQorCitjYXRjaF90ZWxsKHN0cikKK3sKKyAgc3RyaW5nIHMxLCBzMjsKKworICBpZiAoIXN0ciB8fCBzdHI9PSIiKSByZXR1cm47CisgIGlmIChzc2NhbmYoc3RyLCIlcyB0cml0dCVzVGVzdG1vbnN0ZXIiLHMxLHMyKSkKKyAgeworICAgIHNheV9zdHIoY2FwaXRhbGl6ZShuYW1lKCkpKyIgc2FndDogQXVhLCB3aWVzbyB0cml0dHN0IER1IG1pY2gsICIrczErIj9cbiIpOworICAgIHJldHVybjsKKyAgfQorICBpZiAoc3NjYW5mKHN0ciwiJXMgc2FndDogJXMiLHMxLHMyKSkKKyAgeworICAgIGlmICghczIpIHMyPSIgIjsKKyAgICBzMj1vbGRfZXhwbG9kZShzMiwiXG4iKTsKKyAgICBpZiAoc2l6ZW9mKHMyKSkKKyAgICAgIHMyPWltcGxvZGUoczIsIiAiKTsKKyAgICBlbHNlCisgICAgICByZXR1cm47CisgICAgc2F5X3N0cihjYXBpdGFsaXplKG5hbWUoKSkrIiBzYWd0OiBXaWVzbyBzYWdzdCBEdSBcIiIrczIrIlwiLCAiK3MxKyI/IFxuIik7CisgICAgcmV0dXJuOworICB9Cit9CisKK3NheV9zdHIoc3RyKQoreworICBjYWxsX291dCgiZG9fc2F5IiwwLHN0cik7Cit9CisKK2RvX3NheShzdHIpCit7CisgIHNheShzdHIpOworfQorCitoZWFydF9iZWF0KCkKK3sKKyAgOjpoZWFydF9iZWF0KCk7CisgIHdhcnRlLS07CisgIGlmICh3YXJ0ZSkgcmV0dXJuOworICB3YXJ0ZT04OworICBGbGVlKCk7Cit9CmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sLmMgYi9vYmovdG9vbHMvTUd0b29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI3ZjM0ZgotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wuYwpAQCAtMCwwICsxLDE4MjMgQEAKKy8qCisgKiAgTUd0b29sLTEuMworICogIEZpbGU6IE1HdG9vbC5jCisgKiAgTWFpbnRhaW5lcjogS2lya0BNb3JnZW5HcmF1ZW4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiB0aGUgb3JpZ2luYWwgWHRvb2wgaXMgY29weXJpZ2h0ZWQgYnkgSHlwICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisKK2luaGVyaXQgIi9zdGQvdGhpbmcvcHJvcGVydGllcyI7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaWYgIWRlZmluZWQoUVVFUllDQUNIRUQpCisjZGVmaW5lIFFVRVJZQ0FDSEVEIDQwOTYKKyNlbmRpZgorI2lmICFkZWZpbmVkIChTRVRDQUNIRUQpCisjZGVmaW5lIFNFVENBQ0hFRCA0MDk2CisjZW5kaWYKKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlICIvc2VjdXJlL3dpemxldmVscy5oIgorI2luY2x1ZGUgIi9zZWN1cmUvY29uZmlnLmgiCisjaW5jbHVkZSA8dXNlcmluZm8uaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisKKyNpbmNsdWRlICJNR3Rvb2wvdG9vbC5oIgorCisjaW5jbHVkZSAiTUd0b29sL3Rvb2xsaWIuaCIKKworI2RlZmluZSBYREJHIDEKKworbm9zYXZlIG9iamVjdCAgY2xvbmVyOworbm9zYXZlIG9iamVjdCAgbXNndG89TlVMTDsKK25vc2F2ZSBzdHJpbmcgKm1hbnBhdGg9KHtUT09MX1BBVEgrIi9tYW4uZC8iLAorCQkJICIvZG9jL2VmdW4vIiwKKwkJCSAiL2RvYy9sZnVuLyIsCisJCQkgIi9kb2Mvdy8iLAorCQkJICIvZG9jL2hlbHBkaXIvIiwKKwkJCSAiL2RvYy9MUEMvIiwKKwkJCSAiL2RvYy9zdGQvIiwKKwkJCSAiL2RvYy9jb25jZXB0cy8iLAorCQkJICIifSk7Citub3NhdmUgc3RyaW5nICBtb3JlZmlsZT1OVUxMOworbm9zYXZlIHN0cmluZyAqc2NyaXB0bGluZT1OVUxMOworbm9zYXZlIHN0cmluZyAqaGlzdG9yeT1hbGxvY2F0ZShNQVhfSElTVE9SWSk7Citub3NhdmUgaW50ICAgICBtb3JlZmxhZz1GQUxTRTsKK25vc2F2ZSBpbnQgICAgIG1vcmVvZmZzZXQ9MTsKK25vc2F2ZSBpbnQgICAgIHRlcm09TlVMTDsKK25vc2F2ZSBpbnQgICAgIHNjcmlwdHNpemU9TlVMTDsKK25vc2F2ZSBpbnQgICAgIG5vc3RvcmU9RkFMU0U7Citub3NhdmUgaW50ICAgICB4bGlnaHQ9MDsKK25vc2F2ZSBpbnQgICAgIHBpcGVfaW49RkFMU0U7Citub3NhdmUgaW50ICAgICBwaXBlX291dD1GQUxTRTsKK25vc2F2ZSBpbnQgICAgIHBpcGVfb3ZyPVRSVUU7Citub3NhdmUgc3RyaW5nICBwaXBlX2lmPU5VTEw7Citub3NhdmUgc3RyaW5nICBwaXBlX29mPU5VTEw7Citub3NhdmUgaW50ICAgICB4dGs9RkFMU0U7Citub3NhdmUgbWFwcGluZyB2YXJpYWJsZT0oW10pOworbm9zYXZlIHN0cmluZyAqY21kczsKK3ByaXZhdGUgbm9zYXZlIG1hcHBpbmcgbGluZV9idWZmZXI9KFtdKTsKK3ByaXZhdGUgbm9zYXZlIHN0cmluZyBsaW5lX2J1ZmZlcl9uYW1lPSIiOworcHJpdmF0ZSBub3NhdmUgc3RyaW5nIG1vcmVfc2VhcmNoZXhwcj0iIjsKK2ludCAgICBtb3JlbGluZXM9TU9SRV9MSU5FUzsKK2ludCAgICBtb2RpPShNT0RFX0ZJUlNUfE1PREVfUFJPVEVDVHxNT0RFX1NIT1JUKTsKKworI2luY2x1ZGUgIk1HdG9vbC90b29sbGliLmMiCisjaW5jbHVkZSAiTUd0b29sL3Rvb2xjbWQuYyIKKworI2RlZmluZSBTYWZlUmV0dXJuKHgpIFwKK3sgXAorICBjbWRzPSh7fSk7IFwKKyAgcGlwZV9pbj1GQUxTRTsgXAorICBwaXBlX29mPU5VTEw7IFwKKyAgcGlwZV9vdnI9VFJVRTsgXAorICBwaXBlX291dD1GQUxTRTsgXAorICBwaXBlX29mPU5VTEw7IFwKKyAgcmV0dXJuICh4KTsgXAorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGNoZWNrIHNvbWUgc2VjdXJpdHkgYXNwZWN0cworICovCisKK3N0YXRpYyBpbnQgc2VjdXJpdHkoKQoreworICBvYmplY3QgcHJldjsKKyAKKyAgaWYoIHByb2Nlc3NfY2FsbCgpIHx8IGdldHVpZCgpIT1nZXR1aWQoY2xvbmVyKSApIHJldHVybiBGQUxTRTsgLy8gUnVtYXRhCisKKyAgVEsoIlVJRDogIitnZXR1aWQoTUUpKyIgY2xvbmVyOiIrZ2V0dWlkKGNsb25lcikpOworLy8gIFRLKCJwcmV2OiAiK29iamVjdF9uYW1lKFBSRVYpKyIgbWU6IitvYmplY3RfbmFtZShNRSkpOworICBpZihwcmV2PVBSRVYpCisgIHsKKyAgICBpZighY2xvbmVyKQorICAgICAgcmV0dXJuIFRSVUU7CisgICAgaWYoZ2V0dWlkKHByZXYpPT1ST09USUR8fElTX0FSQ0gocHJldikpCisgICAgICByZXR1cm4gVFJVRTsKKyAgICBpZihwcmV2PT1NRSkKKyAgICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiBzZWN1cmVfbGV2ZWwoKT49cXVlcnlfd2l6X2xldmVsKGNsb25lcik7IC8vIFJ1bWF0YQorICAgIC8vcmV0dXJuIGdldHVpZChwcmV2KT09Z2V0dWlkKCkmJmdldGV1aWQocHJldik9PWdldGV1aWQoKSYmY2xvbmVyPT1SVFA7CisgIH0KKyAgZWxzZQorICAgIHJldHVybiBjbG9uZXI9PU5VTEw7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogb3duIHdyaXRlIGZ1bmN0aW9uCisgKi8KKworc3RhdGljIGludCBXcml0ZShzdHJpbmcgc3RyKQoreworICBpZighc3RyaW5ncChzdHIpIHx8IHN0cj09IiIpCisgICAgcmV0dXJuIEZBTFNFOworICBpZighY2xvbmVyICYmIG9iamVjdHAodGhpc19wbGF5ZXIoKSkpCisgICAgd3JpdGUoc3RyKTsKKyAgZWxzZQorICAgIHRlbGxfb2JqZWN0KGNsb25lciwgc3RyKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogb3duIGNvbW1hbmQgZnVuY3Rpb24KKyAqLworCitzdGF0aWMgaW50IENvbW1hbmQoc3RyaW5nIHN0cikKK3sKKyAgaW50IGk7CisgIFRLKCJDb21tYW5kOiBzdHI6ICIrKHN0cj9zdHI6IihOVUxMKSIpKTsKKyAgbm9zdG9yZSsrOworICBpZihNT0RFKE1PREVfRUNITykpCisgICAgV0xOKCJEb2luZzogIitzdHIpOworICBpPShpbnQpY2xvbmVyLT5jb21tYW5kX21lKHN0cik7CisgIG5vc3RvcmUtLTsKKyAgcmV0dXJuIGk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogb2JqZWN0IHNlYXJjaGluZworICovCisKK3N0YXRpYyB2YXJhcmdzIG9iamVjdCBYRmluZE9iaihzdHJpbmcgc3RyLCBpbnQgc2lsZW50KQoreworICBvYmplY3Qgb2JqLCBlbnY7CisgIHN0cmluZyAqc3RyczsKKyAgaW50IGksIHMsIGNudDsKKyAgCisgIGlmKCFzdHIpCisgICAgcmV0dXJuIE5VTEw7CisgIFRLKCJYRmluZE9iajogc3RyOiAiKyhzdHI/c3RyOiIoTlVMTCkiKSk7CisgIGVudj1FTlYoY2xvbmVyKTsKKyAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwgIlxcLiIsIrAwMSIpOworICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCAiXFxeIiwgIrAwMiIpOworICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCAiXFwkIiwgIrAwMyIpOworICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCAiXFxcXCIsICJcXCIpOworICBpZiAoZmluZF9vYmplY3Qoc3RyKSkgcmV0dXJuIGZpbmRfb2JqZWN0KHN0cik7CisgIGlmIChmaWxlX3NpemUoc3RyKT4xKSB7CisgICAgIGNhbGxfb3RoZXIoc3RyLCAiPz8/Iik7CisgICAgIHJldHVybiBmaW5kX29iamVjdChzdHIpOworICB9CisgIHM9c2l6ZW9mKHN0cnM9c3RyaXBfZXhwbG9kZShzdHIsICIuIikpOworICB3aGlsZShzLS0pCisgIHsKKyAgICBpZihzdHJzW2ldPT0ibSJ8fHN0cnNbaV09PSJtZSIpCisgICAgICBzdHJzW2ldPVJOQU1FKGNsb25lcik7CisgICAgZWxzZSBpZihzdHJzW2ldPT0iaCJ8fHN0cnNbaV09PSJoZXJlIikKKyAgICAgIHN0cnNbaV09b2JqZWN0X25hbWUoRU5WKGNsb25lcikpOworICAgIGlmKG9iaj1GaW5kT2JqKHN0cnNbaSsrXSxlbnYsKHNpbGVudD8xOjApKSkKKyAgICAgIGVudj1vYmo7CisgICAgZWxzZQorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIG9iajsKK30KKworc3RhdGljIHZhcmFyZ3Mgb2JqZWN0IEZpbmRPYmooc3RyaW5nIHN0ciwgb2JqZWN0IGVudiwgaW50IHNpbGVudCkKK3sKKyAgb2JqZWN0IG9iaiwgKmludjsKKyAgc3RyaW5nIHRtcDsKKyAgaW50IG51bSwgZTsKKyAgCisgIGlmICghc3RyaW5ncChzdHIpIHx8ICFzaXplb2Yoc3RyKSB8fCAhb2JqZWN0cChlbnYpKQorICAgIHJldHVybiBOVUxMOworICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCAisDAxIiwgIi4iKTsKKyAgd2hpbGUoc3RyW2UrK109PSdeJykKKyAgICA7CisgIHN0cj1zdHJbLS1lLi48MV07CisgIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsICKwMDIiLCAiXiIpOworICBpZihvYmo9VmFyVG9PYmooc3RyKSkKKyAgICA7CisgIGVsc2UgaWYoc3RyWzBdPT0nAycpCisgICAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwgIrAwMyIsICIkIik7CisgIGVsc2UgaWYoc3NjYW5mKHN0ciwgIiVkIiwgbnVtKSYmKGludj1hbGxfaW52ZW50b3J5KGVudikpKQorICB7CisgICAgaWYobnVtPjAmJm51bTw9c2l6ZW9mKGludikpCisgICAgICBvYmo9aW52W251bS0xXTsKKyAgICBlbHNlCisgICAgeworICAgICAgV0RMTigiU3BlY2lmaWVkIG9iamVjdCBudW1iZXIgb3V0IG9mIHJhbmdlIFsxLSIrc2l6ZW9mKGludikrIl0iKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgfQorICBpZihvYmp8fChvYmo9cHJlc2VudChzdHIsIGVudikpfHwKKyAgICAgKG9iaj1maW5kX3BsYXllcihMT1dFUihzdHIpKSl8fAorICAgICAob2JqPWZpbmRfbGl2aW5nKHN0cikpfHwKKyAgICAgKG9iaj1maW5kX29iamVjdChsb25nX3BhdGgoc3RyKSkpKQorICB7CisgICAgd2hpbGUoZS0tKQorICAgIHsKKyAgICAgIGlmKCEob2JqPUVOVihvYmopKSkKKyAgICAgIHsKKwlXKCJTcGVjaWZpZWQgb2JqZWN0IGhhcyBubyBlbnZpcm9ubWVudCBbIik7CisJd2hpbGUoZS0tKQorCSAgVygiXiIpOworCVdETE4oc3RyKyJdIik7CisJcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UKKyAgICBpZighc2lsZW50KQorICAgICAgV0RMTigiU3BlY2lmaWVkIG9iamVjdCBkb2VzIG5vdCBleGlzdCBbIitzdHIrIl0iKTsKKyAgcmV0dXJuIG9iajsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBvYmplY3QgdmFyaWFibGUgaGFuZGxpbmcKKyAqLworCitzdGF0aWMgb2JqZWN0IFZhclRvT2JqKHN0cmluZyBzdHIpCit7CisgIGlmICghc3RyaW5ncChzdHIpIHx8ICFzaXplb2Yoc3RyKSB8fCBzdHJbMF0hPSckJykKKyAgICByZXR1cm4gTlVMTDsKKyAgc3dpdGNoKHN0cikKKyAgeworICAgIGNhc2UgIiRtIjoKKyAgICBjYXNlICIkbWUiOgorICAgIHJldHVybiBjbG9uZXI7CisgICAgY2FzZSAiJGgiOgorICAgIGNhc2UgIiRoZXJlIjoKKyAgICByZXR1cm4gRU5WKGNsb25lcik7CisgICAgZGVmYXVsdDoKKyAgICByZXR1cm4gdmFyaWFibGVbc3RyWzEuLjwxXV07CisgIH0KKyAgcmV0dXJuKE5VTEwpOyAvL25ldmVyIHJlYWNoZWQKK30KKworc3RhdGljIHN0cmluZyBWYXJUb0ZpbGUoc3RyaW5nIHN0cikKK3sKKyAgcmV0dXJuIHNvdXJjZV9maWxlX25hbWUoVmFyVG9PYmooc3RyKSk7Cit9CisKK3N0YXRpYyBzdHJpbmcgVmFyVG9QdXJlRmlsZShzdHJpbmcgc3RyKQoreworICByZXR1cm4gcHVyZV9maWxlX25hbWUoVmFyVG9PYmooc3RyKSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogb2JqZWN0IGRlc2NyaXB0aW9uIHByaW50aW5nCisgKi8KKworc3RhdGljIHZvaWQgUHJpbnRPYmoob2JqZWN0IG9iaiwgc3RyaW5nIGZpbGUpCit7CisgIG9iamVjdCBpdGVtLCB0bXA7CisgIHN0cmluZyBzdHI7CisgIGludCBpOworCisgIFNFQ1VSRTEoKTsKKyAgaWYoIW9iaikKKyAgICByZXR1cm47CisgIFByaW50U2hvcnQoIlNob3J0OiAiLCBvYmosIGZpbGUpOworICBpZighZmlsZXx8ZmlsZT09IiIpCisgICAgV0xOKCJMb25nIDoiKTsKKyAgZWxzZQorICAgIHdyaXRlX2ZpbGUoZmlsZSwiTG9uZyA6XG4iKTsKKyAgaWYocXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYmopKQorICAgIHN0cj1jYXBpdGFsaXplKGdldHVpZChvYmopKTsKKyAgZWxzZQorICB7CisgICAgaWYob2JqZWN0X25hbWUob2JqKVswLi4yNl09PSIvZC91bnRlcndlbHQvb2JqZWt0ZS90ZWRkeSMiICYmCisgICAgICAgSVNfQVJDSCh0aGlzX2ludGVyYWN0aXZlKCkpKQorICAgICAgc3RyPSJFaW4gVGVkZHkgKHN0dW1tKSI7CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmKHN0cj0oc3RyaW5nKW9iai0+UXVlcnlQcm9wKFBfSU5UX0xPTkcpKQorCTsKKyAgICAgIGVsc2UgaWYoc3RyPShzdHJpbmcpb2JqLT5RdWVyeVByb3AoUF9MT05HKSkKKwk7CisgICAgICBlbHNlCisJc3RyPSItIG5vIGxvbmcgZGVzY3JpcHRpb24gLVxuIjsKKyAgICB9CisgIH0KKyAgaWYoIWZpbGV8fGZpbGU9PSIiKQorICAgIFcoc3RyKTsKKyAgZWxzZQorICAgIHdyaXRlX2ZpbGUoZmlsZSxzdHIpOworICBGT1JBTEwoaXRlbSwgb2JqKQorICB7CisgICAgaWYoIWkpCisgICAgICBpZighZmlsZXx8ZmlsZT09IiIpCisJV0xOKCJDb250ZW50OiIpOworICAgICAgZWxzZQorCXdyaXRlX2ZpbGUoZmlsZSwiQ29udGVudDpcbiIpOworICAgIFByaW50U2hvcnQoQVJJR0hUKCsraSsiLiAiLCA0LCAiICIpLCBpdGVtLCBmaWxlKTsKKyAgfQorfQorCitzdGF0aWMgc3RyaW5nIE9iakZpbGUob2JqZWN0IG9iaikKK3sKKyAgcmV0dXJuICJbIitzaG9ydF9wYXRoKG9iamVjdF9uYW1lKG9iaikpKyJdIjsKK30KKworc3RhdGljIHZhcmFyZ3Mgdm9pZCBQcmludFNob3J0KHN0cmluZyBwcmUsIG9iamVjdCBvYmosIHN0cmluZyBmaWxlKQoreworICBzdHJpbmcgc3RyOworCisgIFNFQ1VSRTEoKTsKKyAgaWYoIW9iaikKKyAgICByZXR1cm47CisgIGlmKE1PREUoTU9ERV9TSE9SVCkpCisgIHsKKyAgICBpZiAocXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYmopKQorICAgICAgc3RyPWNhcGl0YWxpemUoZ2V0dWlkKG9iaikpOworICAgIGVsc2UKKyAgICB7CisgICAgICBpZighKChzdHI9KHN0cmluZylvYmotPlF1ZXJ5UHJvcChQX0lOVF9TSE9SVCkpfHwKKwkgICAoc3RyPShzdHJpbmcpb2JqLT5RdWVyeVByb3AoUF9TSE9SVCkpKSkKKwlpZihpc19wbGF5ZXIob2JqKSkKKwkgIHN0cj1DUk5BTUUob2JqKSsiIChpbnZpc2libGUpIjsKKwllbHNlCisJICBzdHI9Ii0gbm8gc2hvcnQgZGVzY3JpcHRpb24gLSI7CisgICAgfQorICAgIHN0cj1BTEVGVChzcHJpbnRmKCIlTyAiLHN0ciksIDM0LCAiLiIpKyIgIjsKKyAgfQorICBlbHNlCisgICAgc3RyPSIiOworICBpZihpbnRlcmFjdGl2ZShvYmopKQorICAgIHN0cis9ImkiOworICBlbHNlIGlmKGxpdmluZyhvYmopKQorICAgIHN0cis9ImwiOworICBlbHNlCisgICAgc3RyKz0iLiI7CisgIHN0cis9KHNoYWRvdyhvYmosIDApID8gInMiIDogIi4iKTsKKyAgaWYoIWZpbGV8fGZpbGU9PSIiKQorICAgIFdMTigocHJlK0NBUChzdHIpKyIgIitPYmpGaWxlKG9iaikpWzAuLjc5XSk7CisgIGVsc2UKKyAgICB3cml0ZV9maWxlKGZpbGUsKHByZStDQVAoc3RyKSsiICIrT2JqRmlsZShvYmopKVswLi43OV0rIlxuIik7Cit9CisKK3N0YXRpYyB2YXJhcmdzIHZvaWQgRGVlcFByaW50U2hvcnQob2JqZWN0IGVudiwgaW50IGluZGVudCwgc3RyaW5nIHByZSwgc3RyaW5nIGZpbGUpCit7CisgIGludCBpOworICBvYmplY3QgaXRlbTsKKyAgc3RyaW5nIHN0cjsKKyAgCisgIFNFQ1VSRTEoKTsKKyAgaWYoIWVudikKKyAgICByZXR1cm47CisgIGZvcihpPWluZGVudCxzdHI9IiI7IGktLTsgc3RyKz0iICAiKTsKKyAgaWYocHJlKQorICAgIHN0cis9cHJlOworICBpZighZmlsZXx8ZmlsZT09IiIpCisgICAgVyhzdHIpOworICBlbHNlCisgICAgd3JpdGVfZmlsZShmaWxlLHN0cik7CisgIGkrKzsKKyAgUHJpbnRTaG9ydCgiIixlbnYsZmlsZSk7CisgIEZPUkFMTChpdGVtLCBlbnYpCisgICAgRGVlcFByaW50U2hvcnQoaXRlbSxpbmRlbnQrMSxBUklHSFQoKCsraSkrIi4gIiw0LCIgIiksZmlsZSk7Cit9CisKK3N0YXRpYyBzdHJpbmcgYnJlYWtfc3RyaW5nX2hhcmQoc3RyaW5nIHN0ciwgaW50IGxlbiwgc3RyaW5nIHByZSkKK3sKKyAgaW50IHMscCx0OworICBzdHJpbmcgdG1wOworCisgIGlmKCFzdHJ8fCEocz1zaXplb2Yoc3RyKSkpCisgICAgcmV0dXJuICIiOworICB0PWxlbi0ocD1zaXplb2YocHJlKSktMTsKKworICB0bXA9IiI7CisgIHdoaWxlKHArcz5sZW4pCisgIHsKKyAgICB0bXArPXByZStzdHJbMC4udF0rIlxuIjsKKwlzdHI9c3RyW3QrMS4uXTsKKwlzLT10OworICB9CisgIGlmKHNpemVvZihzdHIpKQorICAgIHRtcCs9cHJlK3N0clswLi5dKyJcbiI7CisgIHJldHVybiB0bXA7Cit9CisgIAorc3RhdGljIHZvaWQgZHByb3Aoc3RyaW5nIGtleSwgbWl4ZWQgZGF0YSwgb2JqZWN0IG9iaikKK3sKKyAgaWYocGlwZV9vdXQmJnBpcGVfb2YpCisgICAgd3JpdGVfZmlsZShwaXBlX29mLGJyZWFrX3N0cmluZ19oYXJkKG1peGVkX3RvX3N0cmluZyhvYmotPlF1ZXJ5UHJvcChrZXkpLE1BWF9SRUNVUlNJT04pLDc4LEFMRUZUKGtleSsiICIsMTgsIi4iKSsiID0gIikpOworICBlbHNlCisgICAgVyhicmVha19zdHJpbmdfaGFyZChtaXhlZF90b19zdHJpbmcob2JqLT5RdWVyeVByb3Aoa2V5KSxNQVhfUkVDVVJTSU9OKSw3OCxBTEVGVChrZXkrIiAiLDE4LCIuIikrIiA9ICIpKTsKK30KKworc3RhdGljIHN0cmluZyBwcm9wZmxhZ3Moc3RyaW5nIGtleSwgb2JqZWN0IG9iKQoreworICBpbnQgdG1wOworICBzdHJpbmcgKmZsYWdzOworICB0bXA9KGludClvYi0+UXVlcnkoa2V5LDEpOworICBmbGFncz0oe30pOworICB0bXAmU0FWRSA/CSAgICAgICBmbGFncys9KHsiU0FWIn0pIDogZmxhZ3MrPSh7IiAgICJ9KTsKKyAgdG1wJlBST1RFQ1RFRCA/ICAgICAgZmxhZ3MrPSh7IlBSTyJ9KSA6IGZsYWdzKz0oeyIgICAifSk7CisgIHRtcCZTRUNVUkVEID8gICAgICAgIGZsYWdzKz0oeyJTRUMifSkgOiBmbGFncys9KHsiICAgIn0pOworICB0bXAmTk9TRVRNRVRIT0QgPyAgICBmbGFncys9KHsiTlNNIn0pIDogZmxhZ3MrPSh7IiAgICJ9KTsKKyAgdG1wJlNFVE1OT1RGT1VORCA/ICAgZmxhZ3MrPSh7IlNNTiJ9KSA6IGZsYWdzKz0oeyIgICAifSk7CisgIHRtcCZRVUVSWU1OT1RGT1VORCA/IGZsYWdzKz0oeyJRTU4ifSkgOiBmbGFncys9KHsiICAgIn0pOworICB0bXAmUVVFUllDQUNIRUQgPyAgICBmbGFncys9KHsiUUNBIn0pIDogZmxhZ3MrPSh7IiAgICJ9KTsKKyAgdG1wJlNFVENBQ0hFRCA/ICAgICAgZmxhZ3MrPSh7IlNDQSJ9KSA6IGZsYWdzKz0oeyIgICAifSk7CisgIHJldHVybiAiIitpbXBsb2RlKGZsYWdzLCJ8Iik7Cit9CisKK3N0YXRpYyB2b2lkIGRwcm9wMihzdHJpbmcga2V5LCBtaXhlZCBkYXRhLCBvYmplY3Qgb2IpCit7CisgIGlmKHBpcGVfb3V0JiZwaXBlX29mKQorICAgIHdyaXRlX2ZpbGUocGlwZV9vZixicmVha19zdHJpbmdfaGFyZChtaXhlZF90b19zdHJpbmcocHJvcGZsYWdzKGtleSxvYiksTUFYX1JFQ1VSU0lPTiksNzgsQUxFRlQoa2V5KyIgIiwxOCwiLiIpKyIgPSAiKSk7CisgIGVsc2UKKyAgICBXKGJyZWFrX3N0cmluZ19oYXJkKG1peGVkX3RvX3N0cmluZyhwcm9wZmxhZ3Moa2V5LG9iKSxNQVhfUkVDVVJTSU9OKSw3OCxBTEVGVChrZXkrIiAiLDE4LCIuIikrIiA9ICIpKTsKK30KKworc3RhdGljIG1peGVkIHByb3BtZXRob2RzKHN0cmluZyBrZXksIG9iamVjdCBvYikKK3sKKyAgcmV0dXJuIChtaXhlZClvYi0+UXVlcnkoa2V5LDIpOworfQorCitzdGF0aWMgdm9pZCBkcHJvcDMoc3RyaW5nIGtleSwgbWl4ZWQgZGF0YSwgb2JqZWN0IG9iKQoreworICBpZihwaXBlX291dCYmcGlwZV9vZikKKyAgICB3cml0ZV9maWxlKHBpcGVfb2YsYnJlYWtfc3RyaW5nX2hhcmQobWl4ZWRfdG9fc3RyaW5nKHByb3BtZXRob2RzKGtleSxvYiksTUFYX1JFQ1VSU0lPTiksNzgsQUxFRlQoa2V5KyIgIiwxOCwiLiIpKyIgPSAiKSk7CisgIGVsc2UKKyAgICBXKGJyZWFrX3N0cmluZ19oYXJkKG1peGVkX3RvX3N0cmluZyhwcm9wbWV0aG9kcyhrZXksb2IpLE1BWF9SRUNVUlNJT04pLDc4LEFMRUZUKGtleSsiICIsMTgsIi4iKSsiID0gIikpOworfQorCitzdGF0aWMgdm9pZCBEdW1wUHJvcGVydGllcyhvYmplY3Qgb2JqLCBpbnQgZmxhZykKK3sKKyAgU0VDVVJFMSgpOworICBpZighb2JqKQorICAgIHJldHVybjsKKyAgUElQRV9ERUxFVEUocGlwZV9vZik7CisgIHN3aXRjaCAoZmxhZykgeworICAgIGNhc2UgMDoKKyAgICAgIHdhbGtfbWFwcGluZygoKG1hcHBpbmcgKikob2JqLT5fX3F1ZXJ5X3Byb3BlcnRpZXMoKSkpWzBdLCMnZHByb3Asb2JqKTsgLy8nKQorICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgd2Fsa19tYXBwaW5nKCgobWFwcGluZyAqKShvYmotPl9fcXVlcnlfcHJvcGVydGllcygpKSlbMF0sIydkcHJvcDIsb2JqKTsgLy8nKQorICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgd2Fsa19tYXBwaW5nKCgobWFwcGluZyAqKShvYmotPl9fcXVlcnlfcHJvcGVydGllcygpKSlbMF0sIydkcHJvcDMsb2JqKTsgLy8nKQorICAgICAgYnJlYWs7CisgIH0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBtb3Zpbmcgb2JqZWN0cworICovCisKK3N0YXRpYyBpbnQgTW92ZU9iaihvYmplY3Qgb2JqMSwgb2JqZWN0IG9iajIsIGludCBzaWxlbnQpCit7CisgIGludCBlcnI7CisgIG9iamVjdCBvbGRlbnY7CisKKyAgU0VDVVJFMihGQUxTRSk7CisgIGlmKCEob2JqMSYmb2JqMikpCisgICAgcmV0dXJuIEZBTFNFOworICBvbGRlbnY9RU5WKG9iajEpOworICBlcnI9KGludClvYmoxLT5tb3ZlKG9iajIsIE1fU0lMRU5UfE1fTk9DSEVDSyk7CisgIGlmKCFzaWxlbnQpCisgICAgc3dpdGNoKGVycikKKyAgICB7CisgICAgICBjYXNlIE1FX1BMQVlFUjoKKyAgICAgIFdETE4oIk9iamVjdCByZXR1cm5lZCBNRV9QTEFZRVIiKTsKKyAgICAgIGlmKG9sZGVudiAmJiBvbGRlbnYgIT0gRU5WKG9iajEpKQorCVdETE4oIk9iamVjdCBoYXMgYmVlbiBtb3ZlZCIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgY2FzZSBNRV9UT09fSEVBVlk6CisgICAgICBXRExOKCJPYmplY3QgcmV0dXJuZWQgTUVfVE9PX0hFQVZZIik7CisgICAgICBpZihvbGRlbnYgJiYgb2xkZW52ICE9IEVOVihvYmoxKSkKKwlXRExOKCJPYmplY3QgaGFzIGJlZW4gbW92ZWQiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIGNhc2UgTUVfQ0FOVF9UUE9SVF9JTjoKKyAgICAgIFdETE4oIk9iamVjdCByZXR1cm5lZCBNRV9DQU5UX1RQT1JUX0lOIik7CisgICAgICBpZihvbGRlbnYgJiYgb2xkZW52ICE9IEVOVihvYmoxKSkKKwlXRExOKCJPYmplY3QgaGFzIGJlZW4gbW92ZWQiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIGNhc2UgTUVfQ0FOVF9UUE9SVF9PVVQ6CisgICAgICBXRExOKCJPYmplY3QgcmV0dXJuZWQgTUVfQ0FOVF9UUE9SVF9PVVQiKTsKKyAgICAgIGlmKG9sZGVudiAmJiBvbGRlbnYgIT0gRU5WKG9iajEpKQorCVdETE4oIk9iamVjdCBoYXMgYmVlbiBtb3ZlZCIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgZGVmYXVsdDoKKyAgICAgIFdETE4oIk9iamVjdCByZXR1cm5lZCB1bmtub3duIHJldHVybiB2YWx1ZSIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogc2F2ZSBkZXN0cnVjdGluZyBvZiBvYmplY3RzCisgKi8KKworc3RhdGljIHZvaWQgRGVzdHJ1Y3Qob2JqZWN0IG9iaikKK3sKKyAgaWYoIW9iaiB8fCAhdGhpc19vYmplY3QoKSkKKyAgICByZXR1cm47CisgIGNhdGNoKG9iai0+cmVtb3ZlKCkpOworICBpZihvYmplY3RwKG9iaikgJiYgIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2JqKSkKKyAgICBkZXN0cnVjdChvYmopOworfQorCitzdGF0aWMgdm9pZCBEZWVwQ2xlYW4ob2JqZWN0IG9iaikKK3sKKyAgaWYoIW9iaikKKyAgICByZXR1cm47CisgIGZpbHRlcihmaWx0ZXIoZGVlcF9pbnZlbnRvcnkob2JqKSwgImlzX25vdF9wbGF5ZXIiLCBNRSksCisJICAgICAgICJEZXN0cnVjdCIsIE1FKTsKKyAgaWYoaXNfbm90X3BsYXllcihvYmopKQorICAgIERlc3RydWN0KG9iaik7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU2hvdyB0aGUgaW5oZXJpdGFuY2UgdHJlZSBvZiBvYmplY3RzCisgKi8KKworc3RhdGljIG9iamVjdCAqU3ViTm9kZXMob2JqZWN0IG9iaikKK3sKKyAgaW50IHM7CisgIG9iamVjdCAqb2JqczsKKyAgc3RyaW5nICppbmxpc3Q7CisgIAorICBpZighb2JqKQorICAgIHJldHVybiBOVUxMOworICBpbmxpc3Q9aW5oZXJpdF9saXN0KG9iaik7CisgIHM9c2l6ZW9mKGlubGlzdCk7CisgIG9ianM9KHt9KTsKKyAgd2hpbGUocy0tPjEpCisgICAgb2Jqcz0oe2ZpbmRfb2JqZWN0KGlubGlzdFtzXSl9KStvYmpzOworICByZXR1cm4gb2JqczsKK30KKworc3RhdGljIHZvaWQgSW5oZXJpdGFuY2Uob2JqZWN0IG9iaiwgc3RyaW5nIGZ1bmMsIHN0cmluZyBwcmUpCit7CisgIGludCBpLCBzOworICBvYmplY3QgKmxuOworICBzdHJpbmcgc3RyOworICAKKyAgaWYoIW9iaikKKyAgICByZXR1cm47CisgIHN0cj1wcmUrIiAiK09iakZpbGUob2JqKTsKKyAgaWYoZnVuYykKKyAgeworICAgIHN0cj1BTEVGVChzdHIrIiAiLCA1MCwgIi4iKTsKKyAgICBpZihmdW5jdGlvbl9leGlzdHMoZnVuYywgb2JqKT09b2JqZWN0X25hbWUob2JqKSkKKyAgICAgIHN0cis9QVJJR0hUKCIgIitmdW5jLCAxOSwgIi4iKTsKKyAgICBlbHNlCisgICAgICBzdHIrPUFSSUdIVCgiIiwgMTksICIuIik7CisgIH0KKyAgaWYocGlwZV9vdXQmJnBpcGVfb2YpCisgICAgd3JpdGVfZmlsZShwaXBlX29mLHN0cisiXG4iKTsKKyAgZWxzZQorICAgIFdMTihzdHIpOworICBsbj1TdWJOb2RlcyhvYmopOworICBmb3IoaT0wOyBpPHNpemVvZihsbik7IGkrKykKKyAgICBsbj1sbi1TdWJOb2RlcyhsbltpXSk7CisgIHM9c2l6ZW9mKGxuKTsKKyAgZm9yKGk9MDsgaTxzOyBpKyspCisgICAgSW5oZXJpdGFuY2UobG5baV0sIGZ1bmMsIHByZSsiLi4uLi4iKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBmaWxlIG5hbWUgaGFuZGxpbmcKKyAqLworCitzdGF0aWMgc3RyaW5nIFhGaWxlKHN0cmluZyBmaWxlKQoreworICBUSygiWEZpbGU6IGZpbGU6ICIrKGZpbGU/ZmlsZToiKE5VTEwpIikpOworICBpZihmaWxlKQorICAgIHN3aXRjaChmaWxlWzBdKQorICAgIHsKKyAgICAgIGNhc2UgJ0AnOgorCXJldHVybiBzb3VyY2VfZmlsZV9uYW1lKFhGaW5kT2JqKGZpbGVbMS4uPDFdKSk7CisgICAgICBjYXNlICckJzoKKwlyZXR1cm4gc291cmNlX2ZpbGVfbmFtZShYRmluZE9iaihmaWxlKSk7CisgICAgICBkZWZhdWx0OgorCXJldHVybiBvbGRfZXhwbG9kZShsb25nX3BhdGgoZmlsZSksIiMiKVswXTsKKyAgICB9CisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RyaW5nIFhGaW5kRmlsZShzdHJpbmcgZmlsZSkKK3sKKyAgVEsoIlhGaW5kRmlsZTogZmlsZTogIisoZmlsZT9maWxlOiIoTlVMTCkiKSk7CisgIGlmKGZpbGU9WEZpbGUoZmlsZSkpCisgIHsKKyAgICBpZihmaWxlX3NpemUoZmlsZSk+PTApCisgICAgICByZXR1cm4gZmlsZTsKKyAgICBpZihmaWxlWzwzLi48MV0hPSIuYyIgJiYgZmlsZV9zaXplKGZpbGUrIi5jIik+MCkKKyAgICAgIHJldHVybiBmaWxlKyIuYyI7CisgIH0KKyAgV0RMTigiRmlsZSBub3QgZm91bmQgb3Igbm90IHJlYWRhYmxlIFsiK3Nob3J0X3BhdGgoZmlsZSkrIl0iKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogZmlsZSBwcmludGluZywgc2VhcmNoaW5nIGFuZCBleGVjdXRpbmcKKyAqLworCitzdGF0aWMgdm9pZCBYTW9yZUZpbGUoc3RyaW5nIGZpbGUsIGludCBmbGFnKQoreworICBpbnQgcyxzaXplOworICAKKyAgU0VDVVJFMSgpOworICBpZighZmlsZSkKKyAgICByZXR1cm47CisgIAorICAvLyB0ZXJtPShzdHJpbmcpY2xvbmVyLT5RdWVyeVByb3AoUF9UVFkpIT0iZHVtYiI7CisgIGlmKChzaXplPShmaWxlX3NpemUobW9yZWZpbGU9bG9uZ19wYXRoKGZpbGUpKSkpPjApCisgIHsKKyAgICBpZihzaXplPjEwMDAwMCkKKyAgICAgIFdETE4oIldhcm5pbmc6IGxhcmdlIGZpbGUiKTsKKyAgICBNb3JlRmlsZShOVUxMKTsKKyAgfQorICBlbHNlIGlmKGZsYWcpCisgICAgV0RMTigiQ2Fubm90IHJlYWQgZmlsZSIpOworfQorCisvKgorc3RhdGljIHN0cmluZyByZWFkX2J1ZmZlcihzdHJpbmcgZmlsZW5hbWUsIGludCBzdGFydCwgaW50IG51bWJlcikKK3sKKyAgbWl4ZWQgdG1wOworICBzdHJpbmcgcmVzdWx0OworICBpbnQgY3VycmVudDsKKworICBpZighZmlsZW5hbWV8fGZpbGVuYW1lPT0iIikKKyAgICByZXR1cm4gIiI7CisgIGlmKG51bWJlcjw9MSkKKyAgICBudW1iZXI9MTsKKyAgbnVtYmVyLS07CisgIHJlc3VsdD0iIjsKKyAgaWYoZmlsZW5hbWUhPWxpbmVfYnVmZmVyX25hbWUpCisgIHsKKyAgICAvLyBUSygicmVhZF9idWZmZXI6IGluaXRpYWxpemluZyIpOworICAgIGxpbmVfYnVmZmVyPShbXSk7CisgICAgbGluZV9idWZmZXJfbmFtZT1maWxlbmFtZTsKKyAgICBjdXJyZW50PTA7CisgIH0KKyAgZWxzZQorICAgIGN1cnJlbnQ9c3RhcnQ7CisKKyAgd2hpbGUoY3VycmVudDw9c3RhcnQrbnVtYmVyICYmIHN0cmluZ3AoKHRtcD1sb2FkX2J1ZmZlcihjdXJyZW50KyspKSkpCisgICAgaWYoY3VycmVudD49c3RhcnQpCisgICAgICByZXN1bHQrPXRtcDsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHN0cmluZyBsb2FkX2J1ZmZlcihpbnQgbGluZSkKK3sKKyAgaW50IGksIGN1cnJlbnQsIHN0YXJ0LCBsZW5ndGgsICppZHg7CisKKyAgaWYoaW50cChsaW5lX2J1ZmZlcltsaW5lXSkpCisgIHsKKyAgICAvLyBUSygibG9hZF9idWZmZXI6IE5vdGZvdW5kOiAiK2xpbmUpOworICAgIGN1cnJlbnQ9bGluZTsKKyAgICB3aGlsZShjdXJyZW50PjAmJmludHAobGluZV9idWZmZXJbLS1jdXJyZW50XSkpOworICAgIGZvcihpPWN1cnJlbnQ7aTw9bGluZTtpKyspCisgICAgeworICAgICAgLy8gVEsoImxvYWRfYnVmZmVyOiB0cnlpbmc6ICIraSk7CisgICAgICBpZihpPjApCisJaWR4PWxpbmVfYnVmZmVyW2ktMV07CisgICAgICBlbHNlCisJaWR4PSh7MCwwfSk7CisgICAgICBsZW5ndGg9cmVhZF9saW5lKChzdGFydD1pZHhbMF0raWR4WzFdKSk7CisgICAgICAvLyBUSygibG9hZF9idWZmZXI6ICIrc3RhcnQrIi8iK2xlbmd0aCk7CisgICAgICBsaW5lX2J1ZmZlcltpXT0oe3N0YXJ0LGxlbmd0aH0pOworICAgIH0KKyAgfQorICBpZHg9bGluZV9idWZmZXJbbGluZV07CisgIHJldHVybgorICAgIHJlYWRfYnl0ZXMobGluZV9idWZmZXJfbmFtZSxpZHhbMF0saWR4WzFdKTsKK30KKworc3RhdGljIGludCByZWFkX2xpbmUoaW50IG9mZnNldCkKK3sKKyAgbWl4ZWQgbG9jX2J1ZjsKKyAgaW50IGxlbmd0aCwgcG9zOworCisgIC8vIFRLKCJyZWFkX2xpbmU6ICIrb2Zmc2V0KTsKKyAgbGVuZ3RoPTA7CisgIHdoaWxlKCFpbnRwKChsb2NfYnVmPXJlYWRfYnl0ZXMobGluZV9idWZmZXJfbmFtZSxvZmZzZXQrbGVuZ3RoLDEwMjQpKSkpCisgIHsKKyAgICBpZigocG9zPW1lbWJlcihsb2NfYnVmLCdcbicpKT49MCkKKyAgICAgIHJldHVybiBsZW5ndGgrcG9zKzE7CisgICAgbGVuZ3RoKz0xMDI0OworICB9CisgIHJldHVybiBsZW5ndGg7Cit9CisqLworCitzdGF0aWMgdm9pZCBNb3JlRmlsZShzdHJpbmcgc3RyKQoreworICBpbnQgaSwgb2ZmOworICBzdHJpbmcgZiwgbCwgcjsKKyAgCisgIFNFQ1VSRTEoKTsKKyAgCisgIGlmIChzdHIgLyomJiBzaXplb2Yoc3RyKSovKQorICB7CisJCWlmKCAhc2l6ZW9mKHN0cikgKSBzdHI9IlwwIjsKKyAgICBpZih0ZXJtKQorICAgICAgVygiG00bWzFNIik7CisgICAgc3dpdGNoKHN0clswXSkKKyAgICB7CisgICAgICBjYXNlICdxJzoKKyAgICAgIGNhc2UgJ3gnOgorICAgICAgbW9yZWZsYWc9RkFMU0U7CisgICAgICBtb3Jlb2Zmc2V0PTE7CisgICAgICBpZihtb3JlZmlsZT09VE1QX0ZJTEV8fG1vcmVmaWxlPT1QSVBFX0ZJTEUpCisJcm0obW9yZWZpbGUpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ1AnOgorICAgICAgY2FzZSAnVSc6CisgICAgICBtb3JlZmxhZz1GQUxTRTsKKyAgICAgIG1vcmVvZmZzZXQ9bW9yZW9mZnNldC1tb3JlbGluZXM7CisgICAgICBjYXNlICdwJzoKKyAgICAgIGNhc2UgJ3UnOgorICAgICAgbW9yZW9mZnNldD1tb3Jlb2Zmc2V0LTIqbW9yZWxpbmVzOworICAgICAgYnJlYWs7CisgICAgICBjYXNlICdEJzoKKyAgICAgIGNhc2UgJ04nOgorICAgICAgbW9yZW9mZnNldCs9bW9yZWxpbmVzOworICAgICAgY2FzZSAwOgkvKiBSRVRVUk4gKi8KKyAgICAgIGNhc2UgJ2QnOgorICAgICAgaWYobW9yZWZsYWcpCisgICAgICB7CisJbW9yZWZsYWc9RkFMU0U7CisJbW9yZW9mZnNldD0xOworCWlmKG1vcmVmaWxlPT1UTVBfRklMRSkKKwkgIHJtKG1vcmVmaWxlKTsKKwlyZXR1cm47CisgICAgICB9CisgICAgICBicmVhazsKKyAgICAgIGNhc2UgJy8nOgorICAgICAgbW9yZW9mZnNldC0tOworICAgICAgbW9yZV9zZWFyY2hleHByPXN0clsxLi48MV07CisgICAgICBjYXNlICduJzoKKyAgICAgIGk9bW9yZW9mZnNldC1tb3JlbGluZXMrMTsKKyAgICAgIGlmKG1vcmVfc2VhcmNoZXhwcj09IiIpCisgICAgICB7CisJV0RMTigiTm8gcHJldmlvdXMgcmVndWxhciBleHByZXNzaW9uIik7CisJcmV0dXJuOworICAgICAgfQorICAgICAgaWYoIXJlZ2V4cCgoeyJkdW1teSJ9KSwgbW9yZV9zZWFyY2hleHByKSkKKwlXRExOKCJCYWQgcmVndWxhciBleHByZXNzaW9uIik7CisgICAgICBlbHNlCisJd2hpbGUoKGw9cmVhZF9maWxlKG1vcmVmaWxlLCBpKyssIDEpKSYmCisJICAgICAgIXNpemVvZihyZWdleHAoKHtsfSksIG1vcmVfc2VhcmNoZXhwcikpKQorCSAgOworICAgICAgaWYobCkKKyAgICAgIHsKKwlXTE4oIioqKiBTa2lwcGluZyAuLi4iKTsKKwltb3Jlb2Zmc2V0PWktMTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKwlXTE4oIioqKiBQYXR0ZXJuIG5vdCBmb3VuZCIpOworCW1vcmVvZmZzZXQtPW1vcmVsaW5lczsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgICAgY2FzZSAnMCcuLic5JzoKKyAgICAgIHNzY2FuZihzdHIsICIlZCIsIGkpOworICAgICAgbW9yZW9mZnNldD1pOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIG1vcmVvZmZzZXQ9MTsKKyAgICBtb3JlZmxhZz1GQUxTRTsKKyAgfQorICBpZihtb3Jlb2Zmc2V0PDEpCisgICAgbW9yZW9mZnNldD0xOworICBpZihDYXRGaWxlKCkpCisgICAgVygiKioqIE1vcmU6IHEsdSxVLGQsRCwvPHJlZ2V4cD4sPGxpbmU+IFsiKyhtb3Jlb2Zmc2V0LTEpKyJdICoqKiAiKTsKKyAgZWxzZQorICB7CisgICAgVygiKioqIE1vcmU6IHEsdSxVLGQsRCwvPHJlZ2V4cD4sPGxpbmU+IFsiKyhtb3Jlb2Zmc2V0LTEpKyI9RU9GXSAqKiogIik7CisgICAgbW9yZWZsYWc9VFJVRTsKKyAgfQorICBpbnB1dF90bygiTW9yZUZpbGUiKTsKKyAgcmV0dXJuOworfQorCisvLyBTY2hhZGUgZWlnZW50bGljaCBkYXMgaWNoIGVzIG5ldXNjaHJlaWJlbiBtdXNzdGUsIGFiZXIgZXMgaXN0CisvLyBzY2huZWxsZXIgbmV1IGdlc2NocmllYmVuIGFscyBkdXJjaCBkaWUgdW5kb2t1bWVudGllcmVuIGFsdGVuIEZ1bmt0aW9uZW4KKy8vIGR1cmNoenVzdGVpZ2VuLi4uICpzZXVmeioKKy8vCQkJCQkgIFBhZHJlaWMKKworc3RhdGljIHN0cmluZyBsYXN0X2ZpbGUsICpsYXN0X2ZpbGVfYnVmZmVyOworc3RhdGljIGludCAgICBsYXN0X2ZpbGVfZGF0ZSwgbGFzdF9maWxlX3NpemUsIGxhc3RfZmlsZV9jb21wbGV0ZTsKKworc3RhdGljIHN0cmluZyBzcmVhZF9saW5lKGludCBudW0pCit7CisgICBpZiAoIW1vcmVmaWxlKSByZXR1cm4gIiI7CisgICBpZiAobGFzdF9maWxlIT1tb3JlZmlsZSB8fCBsYXN0X2ZpbGVfZGF0ZSE9ZmlsZV90aW1lKG1vcmVmaWxlKSkgeworICAgICAgaWYgKCEobGFzdF9maWxlPXJlYWRfYnl0ZXMobW9yZWZpbGUsIDAsIDUwMDAwKSkpIHJldHVybiAiIjsKKyAgICAgIGxhc3RfZmlsZV9kYXRlPWZpbGVfdGltZShtb3JlZmlsZSk7CisgICAgICBsYXN0X2ZpbGVfYnVmZmVyPWV4cGxvZGUobGFzdF9maWxlLCAiXG4iKTsKKyAgICAgIGxhc3RfZmlsZV9zaXplPXNpemVvZihsYXN0X2ZpbGVfYnVmZmVyKTsKKyAgICAgIGlmIChzaXplb2YobGFzdF9maWxlKT09NTAwMDAgJiYgbGFzdF9maWxlWzwxXSE9J1xuJykgeworCSBsYXN0X2ZpbGVfc2l6ZS0tOyAvLyBsZXR6dGUgWmVpbGUgbmljaHQgdm9sbHN0YWVuZGlnIGdlbGVzZW4KKwkgbGFzdF9maWxlX2NvbXBsZXRlPTA7CisgICAgICB9CisgICAgICBlbHNlIGlmIChmaWxlX3NpemUobW9yZWZpbGUpPjUwMDAwKQorCWxhc3RfZmlsZV9jb21wbGV0ZT0wOworICAgICAgZWxzZSBsYXN0X2ZpbGVfY29tcGxldGU9MTsKKyAgICAgIGxhc3RfZmlsZT1tb3JlZmlsZTsKKyAgIH0KKyAgIGlmIChudW09PTApIG51bT0xOworICAgLy8gYmVpIHp1IGdyb3NzZW4gRmlsZXMgbmljaHQgbWVociBhbGxlcyBidWZmZXJuLi4uCisgICBpZiAobnVtPmxhc3RfZmlsZV9zaXplKSB7CisgICAgICBpZiAobGFzdF9maWxlX2NvbXBsZXRlKSByZXR1cm4gIiI7CisgICAgICByZXR1cm4gKHJlYWRfZmlsZShtb3JlZmlsZSwgbnVtLCAxKSB8fCAiIik7CisgICB9CisgICByZXR1cm4gbGFzdF9maWxlX2J1ZmZlcltudW0tMV0rIlxuIjsKK30KKworc3RhdGljIGludCBDYXRGaWxlKCkKK3sKKyAgaW50IGVuZDsKKyAgc3RyaW5nIGw7CisgIAorICBlbmQ9bW9yZW9mZnNldCttb3JlbGluZXM7CisgIHdoaWxlKG1vcmVvZmZzZXQ8ZW5kKQorLy8gICAgaWYoKGw9cmVhZF9maWxlKG1vcmVmaWxlLCBtb3Jlb2Zmc2V0LCAxKSkhPSIiKQorICAgIGlmKChsPXNyZWFkX2xpbmUobW9yZW9mZnNldCkpIT0iIikKKyAgICB7CisgICAgICBtb3Jlb2Zmc2V0Kys7CisgICAgICBXKGwpOworICAgIH0KKyAgICBlbHNlCisgICAgICByZXR1cm4gRkFMU0U7CisvLyAgaWYocmVhZF9maWxlKG1vcmVmaWxlLCBtb3Jlb2Zmc2V0KzEsIDEpIT0iIikKKyAgaWYoc3JlYWRfbGluZShtb3Jlb2Zmc2V0KzEpIT0iIikKKyAgICByZXR1cm4gVFJVRTsKKyAgZWxzZQorICAgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGludCBYR3JlcEZpbGUoc3RyaW5nIHBhdCwgc3RyaW5nIGZpbGUsIGludCBtb2RlKQoreworICBpbnQgaSwgaiwgZiwgcywgZnNpemU7CisgIHN0cmluZyB0ZmlsZSwgKnRtcCwgKnRzLCB0OworICAKKyAgU0VDVVJFMihGQUxTRSk7CisgIFRLKCJYR3JlcEZpbGU6IHBhdDogIitwYXQrIiBmaWxlOiAiK2ZpbGUrIiBtb2RlOiAiK21vZGUpOworICBpZighKHBhdCYmZmlsZSkpCisgICAgcmV0dXJuIEZBTFNFOworICB0ZmlsZT1UTVBfRklMRTsKKyAgZnNpemU9ZmlsZV9zaXplKGZpbGUpOworICBmb3IoaT0wLGY9MDsgaTxmc2l6ZSAmJiB0PXJlYWRfYnl0ZXMoZmlsZSwgaSwgNTAwMDApOyBpKz01MDAwMCkKKyAgICB0bXA9c3RyaXBfZXhwbG9kZSh0LCJcbiIpOworICAgIGlmICh0ICYmIHRbPDFdIT0nXG4nICYmIHNpemVvZih0KT09NTAwMDApIHsKKyAgICAgICBpLT1zaXplb2YodG1wWzwxXSk7CisgICAgICAgdG1wPXRtcFswLi48Ml07CisgICAgfQorICAgIGlmKHM9c2l6ZW9mKHRtcCkpCisgICAgeworICAgICAgZm9yKGo9MDtqPHM7aisrKQorICAgICAgeworCWlmKHNpemVvZih0cz1yZWdleHAoKHsobW9kZSZYR1JFUF9JQ0FTRT9sb3dlcl9jYXNlKHRtcFtqXSk6dG1wW2pdKX0pLHBhdCkpKQorCXsKKwkgIGlmKCEobW9kZSZYR1JFUF9SRVZFUlQpKQorCSAgIHsKKwkgICAgIGlmKCFmKyspCisJICAgICAgIHdyaXRlX2ZpbGUodGZpbGUsICIqKiogRmlsZTogIitmaWxlKyIgKioqXG4iKTsKKwkgICAgIHdyaXRlX2ZpbGUodGZpbGUsIHRtcFtqXSsiXG4iKTsKKwkgICB9CisJfQorCWVsc2UgaWYobW9kZSZYR1JFUF9SRVZFUlQpCisJeworCSAgaWYoIWYrKykKKwkgICAgd3JpdGVfZmlsZSh0ZmlsZSwgIioqKiBGaWxlOiAiK2ZpbGUrIiAqKipcbiIpOworCSAgd3JpdGVfZmlsZSh0ZmlsZSwgdG1wW2pdKyJcbiIpOworCX0KKyAgICAgIH0KKyAgICB9CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZCBYRXhlY0ZpbGUoaW50IGxpbmUpCit7CisgIGludCBpOworICAKKyAgaWYoIXNjcmlwdGxpbmUpCisgICAgcmV0dXJuOworICBmb3IoaT1saW5lOyBpPHNjcmlwdHNpemUmJmk8bGluZStFWEVDX0xJTkVTOyBpKyspCisgIHsKKyAgICBpZighc2NyaXB0bGluZVtpXSkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmKCFDb21tYW5kKHNjcmlwdGxpbmVbaV0pKQorICAgIHsKKyAgICAgIHNjcmlwdGxpbmU9TlVMTDsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgaWYoaTxzY3JpcHRzaXplKQorICAgIGNhbGxfb3V0KCJYRXhlY0ZpbGUiLCBFWEVDX1RJTUUsIGkpOworICBlbHNlCisgICAgc2NyaXB0bGluZT1OVUxMOworfQorCitzdGF0aWMgdm9pZCBYbXRwU2NyaXB0KHN0cmluZyBkaXIsIHN0cmluZyBmaWxlLCBzdHJpbmcgb3B0KQoreworICBpbnQgcywgdDsKKyAgc3RyaW5nICpmaWxlczsKKyAgCisgIHM9c2l6ZW9mKGZpbGVzPWdldF9kaXIoZGlyKyIvKiIpKTsKKyAgd2hpbGUocy0tKQorICB7CisgICAgdD1zaXplb2YoZmlsZXNbc10pLTE7CisgICAgaWYoZmlsZXNbc10gPT0gIi4uIiB8fCBmaWxlc1tzXSA9PSAiLiIgfHwgZmlsZXNbc11bdF0gPT0gJ34nIHx8CisgICAgICAgKGZpbGVzW3NdWzBdID09ICcjJyAmJiBmaWxlc1tzXVt0XSA9PSAnIycpKQorICAgICAgY29udGludWU7CisgICAgaWYoZmlsZV9zaXplKGRpcisiLyIrZmlsZXNbc10pPT0tMikKKyAgICB7CisgICAgICB3cml0ZV9maWxlKGZpbGUsICJta2RpciAiK2ZpbGVzW3NdKyIgOyBjZCAiK2ZpbGVzW3NdKyJcbiIpOworICAgICAgWG10cFNjcmlwdChkaXIrIi8iK2ZpbGVzW3NdLCBmaWxlLCBvcHQpOworICAgICAgd3JpdGVfZmlsZShmaWxlLCAiY2QgLi5cbiIpOworICAgIH0KKyAgICBlbHNlCisgICAgICB3cml0ZV9maWxlKGZpbGUsICJtdHAgLXIgIitvcHQrIiAiK2RpcisiLyIrZmlsZXNbc10rIlxuIik7CisgIH0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgcGxheWVyIHByb3BlcnRpZXMgaGFuZGxpbmcKKyAqLworCitzdGF0aWMgc3RyaW5nIFBsYXllcklkbGUob2JqZWN0IG9iaikKK3sKKyAgc3RyaW5nIHN0cjsKKyAgaW50IGksIHRtcDsKKyAgCisgIGlmKCFvYmopCisgICAgcmV0dXJuIE5VTEw7CisgIGlmKChpPXF1ZXJ5X2lkbGUob2JqKSk+PTYwKQorICB7CisgICAgc3RyPUFSSUdIVCgiIisoaS8zNjAwKSwgMiwgIjAiKTsKKyAgICBpLT0oaS8zNjAwKSozNjAwOworICAgIHN0cis9IiciK0FSSUdIVCgiIisoaS82MCksIDIsICIwIik7CisgIH0KKyAgZWxzZQorICAgIHN0cj0iLi4uLi4iOworICByZXR1cm4gc3RyOworfQorCitzdGF0aWMgc3RyaW5nIFBsYXllckFnZShvYmplY3Qgb2JqKQoreworICBzdHJpbmcgc3RyOworICBpbnQgaSwgdG1wOworICAKKyAgaWYoIW9iaikKKyAgICByZXR1cm4gTlVMTDsKKyAgaT0oaW50KW9iai0+UXVlcnlQcm9wKFBfQUdFKTsKKyAgc3RyPSIgIitBUklHSFQoIiIrKGkvNDMyMDApLCA0LCAiLiIpOworICBpLT0oaS80MzIwMCkqNDMyMDA7CisgIHJldHVybiBzdHIrIjoiK0FSSUdIVCgiIisoaS8xODAwKSwgMiwgIjAiKTsKK30KKworc3RhdGljIHN0cmluZyBjcm5hbWUob2JqZWN0IHdobykKK3sKKyAgc3RyaW5nIHVpZCwgbG5hbWU7CisKKyAgaWYoKHVpZD1nZXR1aWQod2hvKSk9PVJPT1RJRCAmJiAKKyAgICAgb2JqZWN0X25hbWUod2hvKVswLi43XT09Ii9zZWN1cmUvIiAmJgorICAgICAobG5hbWU9KHN0cmluZyl3aG8tPmxvZ2lubmFtZSgpKSkKKyAgICByZXR1cm4gQ0FQKGxuYW1lKTsKKyAgcmV0dXJuIENBUCh1aWQpOworfQorCitzdGF0aWMgc3RyaW5nIFBsYXllcldobyhvYmplY3Qgb2JqKQoreworICBvYmplY3QgdG1wOworICBzdHJpbmcgc3RyLCBzdG1wOworICBzdHI9QVJJR0hUKCIiK0xFVkVMKG9iaikgICwgIDMsICIgIik7CisgIHN0cis9QUxFRlQoIiAiK2NybmFtZShvYmopKyIgIiwgMTIsICIuIik7CisgIHN0cis9UGxheWVyQWdlKG9iaik7CisgIHN0cis9KChpbnQpb2JqLT5RdWVyeVByb3AoUF9HRU5ERVIpPT0xID8gIiBtICIgOiAiIGYgIik7CisgIHN0cis9KG9iai0+UXVlcnlQcm9wKFBfRlJPRykpICA/ICJmIiA6ICIuIjsKKyAgc3RyKz0ob2JqLT5RdWVyeVByb3AoUF9HSE9TVCkpID8gImciIDogIi4iOworICBzdHIrPShvYmotPlF1ZXJ5UHJvcChQX0lOVklTKSkgPyAiaSIgOiAiLiI7CisgIHN0cis9KHF1ZXJ5X2VkaXRpbmcob2JqKXx8cXVlcnlfaW5wdXRfcGVuZGluZyhvYmopID8gImUiIDogIi4iKTsKKyAgc3RyKz0ob2JqLT5RdWVyeVByb3AoUF9BV0FZKSkgID8gImEiIDogIi4iOworICBzdHIrPSIgIitQbGF5ZXJJZGxlKG9iaikrIiAiOworICBzdHIrPSh0bXA9RU5WKG9iaikpID8gT2JqRmlsZSh0bXApIDogIi0gZmFicmljIG9mIHNwYWNlIC0iOworICByZXR1cm4gc3RyOworfQorCitzdGF0aWMgc3RyaW5nIFBsYXllck1haWwob2JqZWN0IG9iaiwgaW50IGZsYWcpCit7CisgIHN0cmluZyBwcmU7CisgIAorICBwcmU9KGZsYWcpID8gQUxFRlQoY3JuYW1lKG9iaikrIiAiLCAxMiwgIi4iKSsiICIgOiAiIjsKKyAgcmV0dXJuIHByZSsibWFpbDogIitvYmotPlF1ZXJ5UHJvcChQX01BSUxBRERSKTsKK30KKworc3RhdGljIHN0cmluZyBQbGF5ZXJJUChvYmplY3Qgb2JqLCBpbnQgZmxhZykKK3sKKyAgc3RyaW5nIHByZTsKKyAgCisgIHByZT0oZmxhZykgPyBBTEVGVChjcm5hbWUob2JqKSsiICIsIDEyLCAiLiIpKyIgIiA6ICIiOworICByZXR1cm4gcHJlKyJob3N0OiAiK3F1ZXJ5X2lwX25hbWUob2JqKSsiICgiK3F1ZXJ5X2lwX251bWJlcihvYmopKyIpIjsKK30KKworc3RhdGljIHN0cmluZyBQbGF5ZXJSYWNlKG9iamVjdCBvYmosIGludCBmbGFnKQoreworICBzdHJpbmcgdG1wLCBwcmU7CisgIAorICBwcmU9KGZsYWcpID8gQUxFRlQoY3JuYW1lKG9iaikrIiAiLCAxMiwgIi4iKSsiICIgOiAiIjsKKyAgcHJlPXByZSsicmFjZTogIitBTEVGVChvYmotPlF1ZXJ5UHJvcChQX1JBQ0UpKyIgIiwgMTAsICIuIikrIiBndWlsZDogIjsKKyAgdG1wPShzdHJpbmcpb2JqLT5RdWVyeVByb3AoUF9HVUlMRCk7CisgIHJldHVybiB0bXAgPyBwcmUrdG1wIDogcHJlKyItIG5vbmUgLSI7Cit9CisKK3N0YXRpYyBzdHJpbmcgUGxheWVyRG9tYWluKG9iamVjdCBvYmosIGludCBmbGFnKQoreworICBpbnQgaSwgczsKKyAgbWl4ZWQgKnVpbmZvOworICBzdHJpbmcgKmRvbWFpbnMsIHByZTsKKyAgCisgIHByZT0oZmxhZykgPyBBTEVGVChjcm5hbWUob2JqKSsiICIsIDEyLCAiLiIpKyIgIiA6ICIiOworICBwcmUrPSJkb21haW5sb3JkIG9mOiAiOworICB1aW5mbz0obWl4ZWQqKU1BU1RFUi0+Z2V0X3VzZXJpbmZvKGdldHVpZChvYmopKTsKKyAgaWYodWluZm8mJihkb21haW5zPXVpbmZvWzNdKSYmKHM9c2l6ZW9mKGRvbWFpbnMpKSkKKyAgeworICAgIGZvcihpPTA7IGk8czsgaSsrKQorICAgIHsKKyAgICAgIHByZSArPSBDQVAoZG9tYWluc1tpXSk7CisgICAgICBpZihpPHMtMSkKKwlwcmUgKz0gIiwgIjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHByZTsKK30KKworc3RhdGljIHN0cmluZyBQbGF5ZXJTdGF0cyhvYmplY3Qgb2JqLCBpbnQgZmxhZykKK3sKKyAgc3RyaW5nIHByZTsKKyAgCisgIHByZT0oZmxhZykgPyBBTEVGVChjcm5hbWUob2JqKSsiICIsIDEyLCAiLiIpKyIgIiA6ICIiOworICBwcmUrPSJocD0iK0FSSUdIVChvYmotPlF1ZXJ5UHJvcChQX0hQKSwgMywgIjAiKTsKKyAgcHJlKz0iLyIrQVJJR0hUKG9iai0+UXVlcnlQcm9wKFBfTUFYX0hQKSwgMywgIjAiKTsKKyAgcHJlKz0iIHNwPSIrQVJJR0hUKG9iai0+UXVlcnlQcm9wKFBfU1ApLCAzLCAiMCIpOworICBwcmUrPSIvIitBUklHSFQob2JqLT5RdWVyeVByb3AoUF9NQVhfU1ApLCAzLCAiMCIpOworICBwcmUrPSIgZm9vZD0iK0FSSUdIVChvYmotPlF1ZXJ5UHJvcChQX0ZPT0QpLCAzLCAiMCIpOworICBwcmUrPSIvIitBUklHSFQob2JqLT5RdWVyeVByb3AoUF9NQVhfRk9PRCksIDMsICIwIik7CisgIHByZSs9IiBkcmluaz0iK0FSSUdIVChvYmotPlF1ZXJ5UHJvcChQX0RSSU5LKSwgMywgIjAiKTsKKyAgcHJlKz0iLyIrQVJJR0hUKG9iai0+UXVlcnlQcm9wKFBfTUFYX0RSSU5LKSwgMywgIjAiKTsKKyAgcHJlKz0iIGV4cHM9IitvYmotPlF1ZXJ5UHJvcChQX1hQKTsKKyAgcmV0dXJuIHByZTsKK30KKworc3RhdGljIHN0cmluZyBQbGF5ZXJTbm9vcChvYmplY3Qgb2JqLCBpbnQgZmxhZykKK3sKKyAgc3RyaW5nIHRtcCwgcHJlOworICBvYmplY3QgdmljdGltOworICAKKyAgcHJlPShmbGFnKSA/IEFMRUZUKGNybmFtZShvYmopKyIgIiwgMTIsICIuIikrIiAiIDogIiI7CisgIHByZT1wcmUrImlzIHNub29wZWQgYnk6ICI7CisgIGlmKHZpY3RpbT1xdWVyeV9zbm9vcChvYmopKQorICAgIHByZSs9QVJJR0hUKCIgIitjcm5hbWUodmljdGltKSwgMTIsICIuIik7CisgIGVsc2UKKyAgICBwcmUrPSIuLi4uLi4uLi4uLi4iOworICByZXR1cm4gcHJlOworfQorCitzdGF0aWMgc3RyaW5nIFBsYXllckNtZEF2ZyhvYmplY3Qgb2JqLCBpbnQgZmxhZykKK3sKKyAgc3RyaW5nIHByZTsKKyAgCisgIHByZT0oZmxhZykgPyBBTEVGVChjcm5hbWUob2JqKSsiICIsIDEyLCAiLiIpKyIgIiA6ICIiOworICByZXR1cm4gcHJlKyJjbWRhdmc6ICIrKGludClvYmotPl9xdWVyeV9jb21tYW5kX2F2ZXJhZ2UoKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIG1zZyBpbnB1dCB0byBvYmplY3RzCisgKi8KKworc3RhdGljIHZvaWQgWE1zZ1NheShzdHJpbmcgc3RyKQoreworICBpZihzdHI9PSIuInx8c3RyPT0iKioiKQorICB7CisgICAgV0xOKCJbRW5kIG9mIG1lc3NhZ2VdIik7CisgICAgc2F5KCJbRW5kIG9mIG1lc3NhZ2VdXG4iKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBzYXkoc3RyKyJcbiIpOworICAgIGlucHV0X3RvKCJYTXNnU2F5Iik7CisgIH0KK30KKworc3RhdGljIHZvaWQgWE1zZ1RlbGwoc3RyaW5nIHN0cikKK3sKKyAgaWYoc3RyPT0iLiJ8fHN0cj09IioqIikKKyAgeworICAgIFdMTigiW0VuZCBvZiBtZXNzYWdlXSIpOworICAgIHRlbGxfb2JqZWN0KG1zZ3RvLCAiW0VuZCBvZiBtZXNzYWdlXVxuIik7CisgIH0KKyAgZWxzZQorICB7CisgICAgdGVsbF9vYmplY3QobXNndG8sIHN0cisiXG4iKTsKKyAgICBpbnB1dF90bygiWE1zZ1RlbGwiKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBYTXNnU2hvdXQoc3RyaW5nIHN0cikKK3sKKyAgaWYoc3RyPT0iLiJ8fHN0cj09IioqIikKKyAgeworICAgIFdMTigiW0VuZCBvZiBtZXNzYWdlXSIpOworICAgIHNob3V0KCJbRW5kIG9mIG1lc3NhZ2VdXG4iKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBzaG91dChzdHIrIlxuIik7CisgICAgaW5wdXRfdG8oIlhNc2dTaG91dCIpOworICB9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogb3duIG9iamVjdCBtb3ZpbmcKKyAqLworCitpbnQgbW92ZShtaXhlZCBkZXN0KQoreworICBtb3ZlX29iamVjdChNRSwgY2xvbmVyP2Nsb25lcjpkZXN0KTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogb2JqZWN0IGlkCisgKi8KKworaW50IGlkKHN0cmluZyBzdHIpCit7CisgIGlmKCFzZWN1cml0eSgpJiZNT0RFKE1PREVfU0NBTkNISykmJlJUUCYmIUlTX0FSQ0goUlRQKSkKKyAgICBXRExOKGNybmFtZShSVFApKyIgc2Nhbm5lZCB5b3UgKGlkKSBbIitxdWVyeV92ZXJiKCkrIl0gIisKKwkgKFBSRVYgPyBPYmpGaWxlKFBSRVYpIDogIltkZXN0cnVjdGVkIG9iamVjdF0iKSk7CisgIHJldHVybiBMT1dFUihzdHIpPT1MT1dFUihUT09MX05BTUUpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHNob3J0IGFuZCBsb25nIGRlc2NyaXB0aW9uCisgKi8KKworc3RyaW5nIHNob3J0KCkKK3sKKyAgcmV0dXJuIF9xdWVyeV9zaG9ydCgpKyIuXG4iOworfQorCitzdHJpbmcgX3F1ZXJ5X3Nob3J0KCkKK3sKKyAgc3RyaW5nIHNoOyAvLyBhZGRlZCBieSBSdW1hdGEKKyAgaWYoY2xvbmVyKQorICB7CisgICAgaWYoKCFzZWN1cml0eSgpKSYmTU9ERShNT0RFX1NDQU5DSEspJiYhSVNfQVJDSChSVFApKQorICAgICAgV0RMTihjcm5hbWUoUlRQKSsiIHNjYW5uZWQgeW91IChzaG9ydCkgWyIrcXVlcnlfdmVyYigpKyJdICIrCisJICAgKFBSRVYgPyBPYmpGaWxlKFBSRVYpIDogIltkZXN0cnVjdGVkIG9iamVjdF0iKSk7CisJaWYoIHNoPVF1ZXJ5KFBfU0hPUlQpICkgcmV0dXJuIHNoOyAvLyBhZGRlZCBieSBSdW1hdGEKKyAgICByZXR1cm4gY2xvbmVyLT5uYW1lKFdFU1NFTikrIiAiK1RPT0xfVElUTEUrIiBbIisKKyAgICAgIGN0aW1lKHRpbWUoKSlbMTEuLjE4XSsiXSI7CisgIH0KKyAgcmV0dXJuIFRPT0xfVElUTEU7Cit9CisKK3N0cmluZyBsb25nKCkKK3sKKyAgcmV0dXJuIF9xdWVyeV9sb25nKCk7Cit9CisKK3N0cmluZyBfcXVlcnlfbG9uZygpCit7CisgIGlmKGNsb25lciYmIXNlY3VyaXR5KCkmJk1PREUoTU9ERV9TQ0FOQ0hLKSYmIUlTX0FSQ0goUlRQKSkKKyAgeworICAgIFdETE4oY3JuYW1lKFJUUCkrIiBzY2FubmVkIHlvdSAobG9uZykgWyIrcXVlcnlfdmVyYigpKyJdICIrCisJIChQUkVWID8gT2JqRmlsZShQUkVWKSA6ICJbZGVzdHJ1Y3RlZCBvYmplY3RdIikpOworICB9CisgIHJldHVybiAKKyAgICAiVGhpcyBpcyAiK1RPT0xfTkFNRSsiIHZlcnNpb24gIitUT09MX1ZFUlNJT04rCisgICAgIiAobWFpbnRhaW5lZCBieSBLaXJrQE1vcmdlbkdyYXVlbilcbiIrCisgICAgIk9yaWdpbmFsIGNvcHlyaWdodCBoZWxkIGJ5IEh5cC5cbiIrCisgICAgIkdhbWVkcml2ZXIgcGF0Y2hsZXZlbDogIitfX1ZFUlNJT05fXysiIG1hc3RlciBvYmplY3Q6ICIrX19NQVNURVJfT0JKRUNUX18rCisgICAgIlxuXG5EbyAneGhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuIjsKK30KKworc3RyaW5nIG5hbWUobWl4ZWQgZHVtbXkxLCBtaXhlZCBkdW1teTIpCit7CisgIHJldHVybiBfcXVlcnlfc2hvcnQoKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBsaWdodCBzdHVmZgorICovCisKK2ludCBfcXVlcnlfbGlnaHQoKQoreworICByZXR1cm4geGxpZ2h0OworfQorCitpbnQgX3NldF9saWdodChpbnQgeCkKK3sKKyAgcmV0dXJuIHhsaWdodDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBBdXRvbG9hZGluZworICovCisKK21peGVkICpfcXVlcnlfYXV0b2xvYWRvYmooKQoreworICByZXR1cm4gQVVUT0xPQURfQVJHUzsKK30KKwordm9pZCBfc2V0X2F1dG9sb2Fkb2JqKG1peGVkICphcmdzKQoreworICBXTE4oVE9PTF9USVRMRSsiIC4uLiIpOworICBpZighcG9pbnRlcnAoYXJncykpCisgICAgOworICBlbHNlIGlmKHNpemVvZihhcmdzKSE9MykKKyAgICA7CisgIGVsc2UgaWYoIXN0cmluZ3AoYXJnc1swXSkpCisgICAgOworICBlbHNlIGlmKCFpbnRwKGFyZ3NbMV0pKQorICAgIDsKKyAgZWxzZSBpZighaW50cChhcmdzWzJdKSkKKyAgICA7CisgIGVsc2UKKyAgeworICAgIGlmKChzdHJpbmcpYXJnc1swXSE9VE9PTF9JTlRFUk5BTCkKKyAgICB7CisgICAgICBXTE4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7CisgICAgICBXTE4oIioqKgkgICAgTkVXIEVESVRJT04gICAgICAqKioiKTsKKyAgICAgIFdMTigiKioqCWRvICd4dG9vbCBuZXdzJyBmb3IgICoqKiIpOworICAgICAgV0xOKCIqKioJIG1vcmUgaW5mb3JtYXRpb24gICAgKioqIik7CisgICAgICBXTE4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7CisgICAgfQorICAgIG1vZGk9KGludClhcmdzWzFdOworICAgIG1vcmVsaW5lcz0oaW50KWFyZ3NbMl07CisgICAgcmV0dXJuOworICB9CisgIFcoIihiYWQgYXV0b2xvYWQsIHVzaW5nIGRlZmF1bHQpXG4iKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBjcmVhdGlvbiwgdXBkYXRpbmcgYW5kIGluaXRpYWxpemF0aW9uIHN0dWZmCisgKi8KKwordm9pZCB1cGRhdGVfdG9vbChtaXhlZCAqYXJncywgb2JqZWN0IG9iaikKK3sKKyAgU0VDVVJFMSgpOworICBpZighKG9iaiYmYXJncykpCisgICAgcmV0dXJuOworICBEZXN0cnVjdChQUkVWKTsKKyAgX3NldF9hdXRvbG9hZG9iaihhcmdzKTsKKyAgbW92ZShvYmopOworfQorCit2b2lkIGNyZWF0ZSgpCit7CisgIG9iamVjdCBvYmo7CisgIAorICBpZihtZW1iZXIob2JqZWN0X25hbWUoKSwnIycpPDApCisgICAgcmV0dXJuOworICBpZighY2xvbmVyJiYhKChjbG9uZXI9VFApfHwoY2xvbmVyPUVOVihNRSkpKSYmIWludGVyYWN0aXZlKGNsb25lcikpCisgICAgZGVzdHJ1Y3QoTUUpOworICBpZighSVNfTEVBUk5FUihjbG9uZXIpKQorICAgIGRlc3RydWN0KE1FKTsKKyAgU2V0UHJvcChQX05PRFJPUCwiRGFzIHdhZXJlIHp1IGdlZmFlaHJsaWNoLlxuIik7CisgIFNldFByb3AoUF9ORVZFUkRST1AsMSk7CisgIFNldFByb3AoUF9OT0JVWSwxKTsKKyAgaWYoZmlsZV9zaXplKFNBVkVfRklMRSsiLm8iKT4wKQorICB7CisgICAgV0RMTigiTG9hZGluZyAiK1RPT0xfVElUTEUrIiBzZXR0aW5ncyIpOworICAgIHJlc3RvcmVfb2JqZWN0KFNBVkVfRklMRSk7CisgIH0KKyAgaWYoTU9ERShNT0RFX0ZJUlNUKSkKKyAgICBjYWxsX291dCgibW92ZSIsMCxjbG9uZXIpOworICBjYWxsX291dCgiYWRkX2luc2VydF9ob29rIiwxLE1FKTsKK30KKwordm9pZCBUSyhzdHJpbmcgc3RyKQoreworICBpZiAoIXh0aykKKyAgICByZXR1cm47CisgIHRlbGxfb2JqZWN0KGNsb25lciwiWFRPT0w6ICIrc3RyKyJcbiIpOworfQorCitpbnQgWHRrKHN0cmluZyBzdHIpCit7CisgIHh0az0heHRrOworICBXRExOKCJYdG9vbCBpbnRlcm5hbCB0cmFjaW5nICIrKHh0az8iZW5hYmxlZCI6ImRpc2FibGVkIikpOworICByZXR1cm4gVFJVRTsKK30KKwordm9pZCBhZGRfaW5zZXJ0X2hvb2sob2JqZWN0IG9iaikKK3sKKyAgaWYob2JqZWN0cChvYmopKQorICAgIGNsb25lci0+QWRkSW5zZXJ0SG9vayhvYmopOworfQorCit2b2lkIGluaXQoKQoreworICBvYmplY3QgZmlyc3QsIHByZXY7CisgIAorICBpZihtZW1iZXIob2JqZWN0X25hbWUoKSwnIycpPDApIHJldHVybjsKKyAgZmlyc3Q9Zmlyc3RfaW52ZW50b3J5KEVOVihNRSkpOworICBpZihNT0RFKE1PREVfUFJPVEVDVCkmJmlzX3BsYXllcihmaXJzdCkmJiFJU19BUkNIKGZpcnN0KSkKKyAgeworICAgIFdETE4oIldBUk5JTkc6ICIrY3JuYW1lKGZpcnN0KSsiIHRyaWVkIHRvIG1vdmUgaW50byB5b3VyIGludmVudG9yeSIpOworICAgIHRlbGxfb2JqZWN0KGZpcnN0LCAiWW91IGNhbm5vdCBtb3ZlIHlvdXJzZWxmIGludG8gIisKKwkJY3JuYW1lKGNsb25lcikrIidzIGludmVudG9yeS5cbiIpOworICAgIGNhbGxfb3V0KCJEcm9wT2JqIiwwLGZpcnN0KTsKKyAgICByZXR1cm47CisgIH0KKyAgZWxzZSBpZihNT0RFKE1PREVfRklSU1QpJiZmaXJzdCE9TUUpCisgICAgbW92ZShjbG9uZXIpOworICBlbHNlIGFjdGlvbnMoKTsKK30KKwordm9pZCBEcm9wT2JqKG9iamVjdCBvYmopCit7CisgIGlmKCFvYmp8fCFvYmplY3RwKG9iaikpCisgICAgcmV0dXJuOworICBvYmotPm1vdmUoRU5WKGNsb25lciksTV9OT0NIRUNLfE1fTk9fU0hPVyk7Cit9CisKKyNkZWZpbmUgQUNUSU9OU1wKKyhbXAorICAieGNhbGxvdXRzIiA6ICJYY2FsbG91dHMiOzA7MSxcCisgICJ4Y2FsbCIgICAgIDogIlhjYWxsIjswOzEsXAorICAieGNhdCIgICAgICA6ICJYY2F0IjsxOzEsXAorICAieGNkIiAgICAgICA6ICJYY2QiOzA7MCxcCisgICJ4Y2xlYW4iICAgIDogIlhjbGVhbiI7MDswLFwKKyAgInhjbG9uZSIgICAgOiAiWGNsb25lIjswOzAsXAorICAieHVjbG9uZSIgICA6ICJYdWNsb25lIjswOzAsXAorICAieGNtZHMiICAgICA6ICJYY21kcyI7MDsxLFwKKyAgInhkYmciICAgICAgOiAiWGRiZyI7MDswLFwKKyAgInhkY2xlYW4iICAgOiAiWGRjbGVhbiI7MDswLFwKKyAgInhkZGVzIiAgICAgOiAiWGRkZXMiOzA7MCxcCisgICJ4ZGVzIiAgICAgIDogIlhkZXMiOzA7MCxcCisgICJ4ZGVzdCIgICAgIDogIlhkZXMiOzA7MCxcCisgICJ4ZGxvb2siICAgIDogIlhkbG9vayI7MDsxLFwKKyAgInhkbyIgICAgICAgOiAiWGRvIjswOzAsXAorICAieGR1cGRhdGUiICA6ICJYZHVwZGF0ZSI7MDswLFwKKyAgInhlY2hvIiAgICAgOiAiWGVjaG8iOzA7MCxcCisgICJ4ZXZhbCIgICAgIDogIlhldmFsIjswOzEsXAorICAieGZvcmFsbCIgICA6ICJYZm9yYWxsIjswOzAsXAorICAieGdvdG8iICAgICA6ICJYZ290byI7MDswLFwKKyAgInhoYmVhdHMiICAgOiAiWGhiZWF0cyI7MDsxLFwKKyAgInhncmVwIiAgICAgOiAiWGdyZXAiOzE7MSxcCisgICJ4aGVhZCIgICAgIDogIlhoZWFkIjsxOzEsXAorICAieGhlbHAiICAgICA6ICJYaGVscCI7MDswLFwKKyAgInhpbnZlbnRvcnkiOiAiWGludmVudG9yeSI7MDsxLFwKKyAgInhpZHMiICAgICAgOiAiWGlkcyI7MDswLFwKKyAgInhpbmZvIiAgICAgOiAiWGluZm8iOzA7MCxcCisgICJ4aW5oZXJpdCIgIDogIlhpbmhlcml0IjswOzEsXAorICAieGxhZyIgICAgICA6ICJYbGFnIjswOzAsXAorICAieGxpZ2h0IiAgICA6ICJYbGlnaHQiOzA7MCxcCisgICJ4bG9hZCIgICAgIDogIlhsb2FkIjswOzAsXAorICAieGxvb2siICAgICA6ICJYbG9vayI7MDsxLFwKKyAgInhscGMiICAgICAgOiAiWGxwYyI7MDswLFwKKyAgInhtYW4iICAgICAgOiAiWG1hbiI7MDswLFwKKyAgInhtb3JlIiAgICAgOiAiWG1vcmUiOzE7MCxcCisgICJ4bW92ZSIgICAgIDogIlhtb3ZlIjswOzAsXAorICAieG1zZyIgICAgICA6ICJYbXNnIjsxOzAsXAorICAieG10cCIgICAgICA6ICJYbXRwIjswOzAsXAorICAieHByb2MiICAgICA6ICJYcHJvYyI7MDsxLFwKKyAgInhwcm9mIiAgICAgOiAiWHByb2YiOzA7MCxcCisgICJ4cHJvcHMiICAgIDogIlhwcm9wcyI7MDsxLFwKKyAgInhxdWl0IiAgICAgOiAiWHF1aXQiOzA7MCxcCisgICJ4c2NhbiIgICAgIDogIlhzY2FuIjswOzAsXAorICAieHNldCIgICAgICA6ICJYc2V0IjswOzAsXAorICAieHNoIiAgICAgICA6ICJYc2giOzA7MCxcCisgICJ4c29ydCIgICAgIDogIlhzb3J0IjsxOzEsXAorICAieHRhaWwiICAgICA6ICJYdGFpbCI7MTsxLFwKKyAgInh0ayIgICAgICAgOiAiWHRrIjswOzAsXAorICAieHRvb2wiICAgICA6ICJYdG9vbCI7MDswLFwKKyAgInh0cmFjZSIgICAgOiAiWHRyYWNlIjswOzAsXAorICAieHRyYW5zIiAgICA6ICJYdHJhbnMiOzA7MCxcCisgICJ4dXBkYXRlIiAgIDogIlh1cGRhdGUiOzA7MCxcCisgICJ4d2MiICAgICAgIDogIlh3YyI7MTswLFwKKyAgInh3aG8iICAgICAgOiAiWHdobyI7MDsxLFwKKyAgXSkKKworc3RhdGljIHN0cmluZyBQcmVwYXJlTGluZShzdHJpbmcgc3RyKQoreworICByZXR1cm4gc3RyOworfQorCitzdGF0aWMgc3RyaW5nIFF1b3RlTGluZShzdHJpbmcgc3RyKQoreworICBzdHJpbmcgKnRtcCwqdG1wMjsKKyAgaW50IGksIGkyLCBsZW4sIGxlbjIsIHFkLCBxczsKKworICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCJcXFxcIiwisEJTSEwiKTsKKyAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwiXFxcIiIsIrBEQkxRIik7CisgIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsIlxcXCciLCKwU0dMUSIpOworICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCJcXHwiLCKwUElQRSIpOworICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCJ8fCIsIrBPUk9SIik7CisgIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsIi0+IiwisExBUlIiKTsKKyAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwiXFwkIiwisERPTFIiKTsKKyAgdG1wPXJlZ2V4cGxvZGUoc3RyLCIoXCJ8JykiKTsKKyAgbGVuPXNpemVvZih0bXApOworICBxZD1xcz0wOworICBmb3IoaT0wO2k8bGVuO2krKykKKyAgeworICAgIGlmKGklMikKKyAgICB7CisgICAgICBpZih0bXBbaV09PSInIikKKwlxZD0oIXFzPyFxZDpxZCk7CisgICAgICBlbHNlCisJcXM9KCFxZD8hcXM6cXMpOworICAgICAgaWYoKHRtcFtpXT09IlwiIiYmIXFkKXx8KHRtcFtpXT09IiciJiYhcXMpKQorCXRtcFtpXT0iIjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmKCFxZCkKKyAgICAgIHsKKwlsZW4yPXNpemVvZih0bXAyPXJlZ2V4cGxvZGUodG1wW2ldLCJcXCRbXiBdW14gXSoiKSk7CisJZm9yKGkyPTA7aTI8bGVuMjtpMisrKQorCSAgaWYoaTIlMikKKwkgIHsKKwkgICAgVEsoIlF1b3RlTGluZTogIit0bXAyW2kyXVsxLi5dKTsKKwkgICAgdG1wMltpMl09KHN0cmluZylYRmluZE9iaigodG1wMltpMl0pWzEuLl0pOworCSAgfQorCXRtcFtpXT1pbXBsb2RlKHRtcDIsIiIpOworICAgICAgfQorICAgIH0KKyAgfQorICBpZihxZHx8cXMpCisgICAgcmV0dXJuIE5VTEw7CisgIHN0cj1pbXBsb2RlKHRtcCwiIik7CisgIFRLKCJRdW90ZUxpbmU6IHN0cjogIitzdHIpOworICByZXR1cm4gc3RyOworfQorCitzdGF0aWMgc3RyaW5nIFVucXVvdGVMaW5lKHN0cmluZyBzdHIpCit7CisgIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsIrBCU0hMIiwiXFwiKTsKKyAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwisERCTFEiLCJcIiIpOworICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCKwU0dMUSIsIlwnIik7CisgIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsIrBEUVVPIiwiIik7CisgIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsIrBTUVVPIiwiIik7CisgIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsIrBQSVBFIiwifCIpOworICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCKwT1JPUiIsInx8Iik7CisgIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsIrBMQVJSIiwiLT4iKTsKKyAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwisERPTFIiLCIkIik7CisgIFRLKCJVbnF1b3RlTGluZTogc3RyOiAiK3N0cik7CisgIHJldHVybiBzdHI7Cit9CisKK3N0YXRpYyBzdHJpbmcgKkV4cGxvZGVDbWRzKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyAqdG1wOworICAKKyAgdG1wPXJlZ2V4cGxvZGUoc3RyLCJcXHx8Pnw+PiIpOworICB3aGlsZSh0bXBbPDFdPT0iIikKKyAgICB0bXA9dG1wWzAuLjwyXTsKKyAgcmV0dXJuIHRtcDsKK30KKwordmFyYXJncyBpbnQgUGFyc2VMaW5lKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyB2ZXJiLCBhcmc7CisgIGludCByZXQ7CisgIAorICBUSygiUGFyc2VMaW5lOiBzdHI6ICIrKHN0cj9zdHI6IiIpKTsKKyAgaWYoIXNpemVvZihjbWRzKSkKKyAgeworICAgIC8vIHRoaXMgaXMgYSBzaW5nbGUgY29tbWFuZCBvciBiZWdpbm5pbmcgb2YgYSBjb21tYW5kIHBpcGUKKyAgICB2ZXJiPXF1ZXJ5X3ZlcmIoKTsKKworICAgIC8vIHJldHVybiBvbiB1bmtub3duIGNvbW1hbmRzCisgICAgaWYoIXZlcmJ8fCFzaXplb2YodmVyYil8fCFHZXRGdW5jKHZlcmIsVFJVRSkpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBzdHI9KHN0cmluZyl0aGlzX3BsYXllcigpLT5fdW5wYXJzZWRfYXJncygpOworICAgIHBpcGVfaW49RkFMU0U7CisgICAgcGlwZV9vZj1OVUxMOworICAgIHBpcGVfb3ZyPVRSVUU7CisgICAgcGlwZV9vdXQ9RkFMU0U7CisgICAgcGlwZV9vZj1OVUxMOworICAgIC8vIHBhc3MgYXJndW1lbnRzIHRvIHNvbWUgc3BlY2lhbCBmdW5jdGlvbnMgdW5wYXJzZWQKKyAgICBpZihtZW1iZXIoKHsieGxwYyIsInhjYWxsIiwieGV2YWwifSksdmVyYik+PTApCisgICAgeworI2lmZGVmIFhEQkcKKyAgICAgIFRLKCJQYXJzZUxpbmU6IHNwZWNpYWwgZnVuYzogIit2ZXJiKTsKKyNlbmRpZgorICAgICAgcmV0PUNhbGxGdW5jKHZlcmIsc3RyKTsKKyAgICAgIFNhZmVSZXR1cm4ocmV0KTsKKyAgICB9CisgICAgLy8gb2ssIGhlcmUgd2UgZ28KKyAgICBwaXBlX2luPXBpcGVfb3V0PUZBTFNFOworICAgIHBpcGVfaWY9cGlwZV9vZj1OVUxMOworICAgIHBpcGVfb3ZyPVRSVUU7CisgICAgaWYoZmlsZV9zaXplKFBJUEVfRklMRSk+PTApCisgICAgICBybShQSVBFX0ZJTEUpOworICAgIGlmIChzdHImJnN0ciE9IiIpCSAgCisgICAgeworICAgICAgaWYoIShzdHI9UXVvdGVMaW5lKHN0cikpKQorICAgICAgeworCVdETE4oIlVudGVybWluYXRlZCBxdW90YXRpb24iKTsKKwlTYWZlUmV0dXJuKFRSVUUpOworICAgICAgfQorICAgICAgY21kcz1FeHBsb2RlQ21kcyhzdHIpOworICAgIH0KKyAgICBlbHNlCisgICAgICBjbWRzPSh7IiJ9KTsKKyAgICBhcmc9c3RyaXBfc3RyaW5nKGNtZHNbMF0pOworICB9CisgIGVsc2UKKyAgeworICAgIGNtZHNbMF09c3RyaXBfc3RyaW5nKGNtZHNbMF0pOworICAgIFRLKCJQYXJzZUxpbmU6IGNtZHNbMF06ICIrY21kc1swXSk7CisgICAgaWYoc3NjYW5mKGNtZHNbMF0sIiVzICVzIix2ZXJiLGFyZykhPTIpCisgICAgeworICAgICAgdmVyYj1jbWRzWzBdOworICAgICAgYXJnPSIiOworICAgIH0KKyAgfQorICBjbWRzPWNtZHNbMS4uXTsKKyAgVEsoIlBhcnNlTGluZTogdmVyYjogIit2ZXJiKTsKKyAgaWYgKCF2ZXJifHwhc2l6ZW9mKHZlcmIpfHwhR2V0RnVuYyh2ZXJiLFRSVUUpKQorICAgIFNhZmVSZXR1cm4oRkFMU0UpOworICBUSygiUGFyc2VMaW5lKDEpOiBhcmc6ICIrYXJnKyIgY21kczogIitzcHJpbnRmKCIlTyIsY21kcykpOworICBzd2l0Y2goc2l6ZW9mKGNtZHMpKQorICB7CisgICAgY2FzZSAwOgorICAgIHJldD1DYWxsRnVuYyh2ZXJiLHN0cmlwX3N0cmluZyhVbnF1b3RlTGluZShhcmcpKSk7CisgICAgU2FmZVJldHVybihyZXQpOworICAgIGJyZWFrOworICAgIAorICAgIGNhc2UgMToKKyAgICBXRExOKCJNaXNzaW5nIHJocyBvZiBjb21tYW5kIHBpcGUiKTsKKyAgICBTYWZlUmV0dXJuKFRSVUUpOworICAgIGJyZWFrOworICAgIAorICAgIGRlZmF1bHQ6CisgICAgcGlwZV9vdXQ9VFJVRTsKKyAgICBzd2l0Y2goY21kc1swXSkKKyAgICB7CisgICAgICBjYXNlICJ8IjoKKyAgICAgIHBpcGVfb2Y9UElQRV9GSUxFOworICAgICAgcGlwZV9vdnI9VFJVRTsKKyAgICAgIGNtZHM9Y21kc1sxLi5dOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgIGNhc2UgIj4iOgorICAgICAgcGlwZV9vdnI9VFJVRTsKKyAgICAgIGlmKHNpemVvZihjbWRzKSE9MikKKyAgICAgIHsKKwlXRExOKCJJbGxlZ2FsIElPIHJlZGlyZWN0aW9uIik7CisJU2FmZVJldHVybihUUlVFKTsKKyAgICAgIH0KKyAgICAgIHBpcGVfb2Y9Y21kc1sxXTsKKyAgICAgIGNtZHM9KHt9KTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgICBjYXNlICI+PiI6CisgICAgICBwaXBlX292cj1GQUxTRTsKKyAgICAgIGlmKHNpemVvZihjbWRzKSE9MikKKyAgICAgIHsKKwlXRExOKCJJbGxlZ2FsIElPIHJlZGlyZWN0aW9uIik7CisJU2FmZVJldHVybihUUlVFKTsKKyAgICAgIH0KKyAgICAgIHBpcGVfb2Y9Y21kc1sxXTsKKyAgICAgIGNtZHM9KHt9KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBUSygiUGFyc2VMaW5lKDIpOiBhcmc6ICIrYXJnKyIgY21kczogIitzcHJpbnRmKCIlTyIsY21kcykpOworICBpZighQ2FsbEZ1bmModmVyYixzdHJpcF9zdHJpbmcoYXJnKSkpCisgICAgU2FmZVJldHVybihGQUxTRSk7CisgIHBpcGVfaW49cGlwZV9vdXQ7CisgIHBpcGVfaWY9cGlwZV9vZjsKKyAgcGlwZV9vdnI9RkFMU0U7CisgIHBpcGVfb3V0PUZBTFNFOworICBwaXBlX29mPU5VTEw7CisgIGlmKHNpemVvZihjbWRzKSkKKyAgICBjYWxsX291dCgiUGFyc2VMaW5lIiwwKTsKKyAgZWxzZQorICAgIFNhZmVSZXR1cm4oVFJVRSk7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IENhbGxGdW5jKHN0cmluZyB2ZXJiLCBzdHJpbmcgc3RyKQoreworICBzdHJpbmcgZnVuOworCisgIGZ1bj1HZXRGdW5jKHZlcmIsRkFMU0UpOworI2lmZGVmIFhEQkcKKyAgVEsoIkNhbGxGdW5jOiB2ZXJiOiAiK3ZlcmIrIiBzdHI6ICIrc3RyKTsKKyAgVEsoIkNhbGxGdW5jOiByZXNvbHZlZCBmdW5jdGlvbjogIisoZnVuP2Z1bjoiKHVucmVzb2x2ZWQpIikpOworI2VuZGlmCisgIGlmKHN0cj09IiIpCisgICAgc3RyPU5VTEw7CisgIHJldHVybiBmdW4/KGludCljYWxsX290aGVyKE1FLGZ1bixzdHIpOkZBTFNFOworfQorCitzdGF0aWMgc3RyaW5nIEdldEZ1bmMoc3RyaW5nIHZlcmIsIGludCB0ZXN0KQoreworICBzdHJpbmcgZnVuLCprZXlzLGtleTsKKyAgaW50IGksbGVuOworCisgIFRLKCJHZXRGdW5jOiB2ZXJiOiAiK3ZlcmIpOworCisgIGlmKHZlcmJbMC4uMF0hPSJ4IikgLy8gQXNzdW1lIGFsbCBjb21tYW5kcyBzdGFydCB3aXRoICJ4IgorICAgIHJldHVybiAwOworCisgIGlmICghKGZ1bj0oc3RyaW5nKUFDVElPTlNbdmVyYiwwXSkpIHsgLy8gVHJ5IGV4YWN0IGhpdCBmaXJzdAorICAgIGtleT0iIjsKKyAgICBsZW49c2l6ZW9mKHZlcmIpOworICAgIGZvciAoaT1zaXplb2Yoa2V5cz1tX2luZGljZXMoQUNUSU9OUykpLTE7aT49MDtpLS0pIHsKKyAgICAgIFRLKCIgIHRyeWluZzogIitrZXlzW2ldKTsKKyAgICAgIGlmKHNpemVvZihrZXlzW2ldKT49bGVuJiZrZXlzW2ldWzAuLmxlbi0xXT09dmVyYikgeworCWlmKHNpemVvZihrZXkpKSB7CisJICBXTE4oIkRhcyBpc3QgbmljaHQgZWluZGV1dGlnIC4uLiIpOworCSAgcmV0dXJuIDA7CisJfQorCWZ1bj1BQ1RJT05TW2tleXNbaV0sMF07CisJa2V5PWtleXNbaV07CisJLy9icmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZQorICAgIGtleT12ZXJiOworCisgIGlmKHRlc3QpCisgICAgcmV0dXJuIGZ1bjsKKyAgCisgIGlmIChrZXkpIHsKKyNpZmRlZiBYREJHCisgICAgVEsoIkdldEZ1bmM6IGZ1bjogIitmdW4rIiAoa2V5OiAiK2tleSsiKVxuIisKKyAgICAgICAicGlwZV9pbjogIisocGlwZV9pbj8iVFJVRSAgIjoiRkFMU0UgIikrKHBpcGVfaWY/cGlwZV9pZjoiKE5VTEwpIikrIlxuIisKKyAgICAgICAicGlwZV9vdXQ6ICIrKHBpcGVfb3V0PyJUUlVFICAiOiJGQUxTRSAiKSsocGlwZV9vZj9waXBlX29mOiIoTlVMTCkiKSsiXG4iKworICAgICAgICJwaXBlX292cjogIisocGlwZV9vdnI/IlRSVUUiOiJGQUxTRSIpKTsKKyNlbmRpZgorICAgIGlmIChwaXBlX2luJiYhQUNUSU9OU1trZXksUElQRV9JTl0pCisgICAgeworICAgICAgLy8gdGhpcyBjb21tYW5kIGRvZXMgbm90IHJlYWQgcGlwZXMKKyNpZmRlZiBYREJHCisgICAgICBUSygiSWxsZWdhbCByaHMgb2YgY29tbWFuZCBwaXBlIFwiIitmdW4rIlwiXG4iKTsKKyNlbmRpZgorICAgICAgbm90aWZ5X2ZhaWwoIklsbGVnYWwgcmhzIG9mIGNvbW1hbmQgcGlwZSBcIiIrZnVuKyJcIlxuIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZSBpZiAocGlwZV9vdXQmJiFBQ1RJT05TW2tleSxQSVBFX09VVF0pCisgICAgeworICAgICAgLy8gdGhpcyBjb21tYW5kIGRvZXMgbm90IGZlZWQgcGlwZXMKKyNpZmRlZiBYREJHCisgICAgICBUSygiSWxsZWdhbCBsaHMgb2YgY29tbWFuZCBwaXBlIFwiIitmdW4rIlwiXG4iKTsKKyNlbmRpZgorICAgICAgbm90aWZ5X2ZhaWwoIklsbGVnYWwgbGhzIG9mIGNvbW1hbmQgcGlwZSBcIiIrZnVuKyJcIlxuIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZ1bjsKK30KKwordm9pZCBhY3Rpb25zKCkKK3sKKyAgaWYgKCFjbG9uZXJ8fCFSVFB8fGNsb25lcj09UlRQfHxxdWVyeV93aXpfbGV2ZWwoY2xvbmVyKTw9cXVlcnlfd2l6X2xldmVsKFJUUCkpCisgICAgYWRkX2FjdGlvbigiUGFyc2VMaW5lIiwiIiwxKTsKKyAgYWRkX2FjdGlvbigiQ29tbWFuZFNjYW4iLCAiIiwgMSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIHRoZSBjaGVja2luZyBzdHVmZgorICovCisKK3ZvaWQgSW5zZXJ0Tm90aWZ5KG9iamVjdCBvYmopCit7CisgIGlmKCFjbG9uZXIpCisgICAgcmV0dXJuOworICBpZihNT0RFKE1PREVfRklSU1QpICYmIGZpbmRfY2FsbF9vdXQoIm1vdmUiKT09LTEpCisgICAgY2FsbF9vdXQoIm1vdmUiLDAsY2xvbmVyKTsKKyAgaWYoTU9ERShNT0RFX0lOVkNIRUNLKSkKKyAgICB3cml0ZV9uZXdpbnZvYmoob2JqKTsKK30KKworc3RhdGljIHZvaWQgVmFyQ2hlY2soaW50IHNob3cpCit7CisgIGludCBpLCBzOworICBmb3JlYWNoKHN0cmluZyBrLCBtaXhlZCB2IDogdmFyaWFibGUpCisgIHsKKyAgICBpZiAodikgY29udGludWU7CisgICAgaWYoc2hvdykgV0RMTigiKioqIFZhcmlhYmxlICQiK2srIiBoYXMgYmVlbiBkZXN0cnVjdGVkIik7CisgICAgbV9kZWxldGUodmFyaWFibGUsIGspOworICB9Cit9CisKKworaW50IHdyaXRlX25ld2ludm9iaihvYmplY3Qgb2JqKQoreworICBpZihvYmopIFdETE4oIioqKiBOZXcgb2JqZWN0IGluIGludmVudG9yeSAiK09iakZpbGUob2JqKSk7CisgIHJldHVybigxKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgY2F0Y2ggYWxsIGNvbW1hbmRzLCBhYnNvcmIgZm9yY2VzIGFuZCBjaGVjayBoaXN0b3J5CisgKi8KKworaW50IENvbW1hbmRTY2FuKHN0cmluZyBhcmcpCit7CisgIHN0cmluZyB2ZXJiLCBjbWQ7CisgIG9iamVjdCBydHA7CisgIHJ0cD1SVFA7CisKKyAgaWYoIWNsb25lciYmIShjbG9uZXI9cnRwKSkgZGVzdHJ1Y3QoTUUpOworCisgIGlmKCghTU9ERShNT0RFX1BST1RFQ1QpKXx8c2VjdXJpdHkoKXx8CisgICAgIHF1ZXJ5X3dpel9sZXZlbChjbG9uZXIpPHF1ZXJ5X3dpel9sZXZlbChydHApKQorICB7CisgICAgdmVyYj1xdWVyeV92ZXJiKCk7CisgICAgaWYodmVyYiYmRG9IaXN0b3J5KHZlcmIrKGFyZyA/ICIgIithcmcgOiAiIikpKQorICAgICAgcmV0dXJuIFRSVUU7CisgICAgbm9zdG9yZT1GQUxTRTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYocnRwKQorICAgIHsKKyAgICAgIFdETE4oIllvdXIgIitUT09MX1RJVExFKyIgcHJvdGVjdHMgeW91IGZyb20gYSBmb3JjZSBieSAiK2NybmFtZShydHApKworCSAgICIgWyIrcXVlcnlfdmVyYigpKyhhcmcgPyAiICIrYXJnKyJdIiA6ICJdIikpOworICAgICAgdGVsbF9vYmplY3QocnRwLCBjcm5hbWUoY2xvbmVyKSsiJ3MgIitUT09MX1RJVExFKworCQkgICIgYWJzb3JiZXMgeW91ciBmb3JjZS5cbiIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgV0RMTigiWW91ciAiK1RPT0xfVElUTEUrIiBwcm90ZWN0cyB5b3UgZnJvbSBhIGZvcmNlIFsiKworCSAgIHF1ZXJ5X3ZlcmIoKSsoYXJnID8gIiAiK2FyZysiXSIgOiAiXSIpKTsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7CisgIH0KK30KKworaW50IERvSGlzdG9yeShzdHJpbmcgbGluZSkKK3sKKyAgaW50IGk7CisgIHN0cmluZyBjbWQsICpzdHJzOworICAKKyAgU0VDVVJFMihGQUxTRSk7CisgIGlmKCFzdHJpbmdwKGxpbmUpIHx8ICFzaXplb2YobGluZSkpCisgICAgcmV0dXJuIFRSVUU7CisgIGVsc2UgaWYobGluZT09IiUhIikKKyAgeworICAgIFdMTigiQ3VycmVudCBjb21tYW5kIGhpc3Rvcnk6Iik7CisgICAgZm9yKGk9TUFYX0hJU1RPUlk7IGk7IC0taSkKKyAgICAgIGlmKGhpc3RvcnlbaS0xXSkKKyAgICAgIHsKKwlXKCIgIitBUklHSFQoIiIraSwgMiwgIiAiKSsiOiAiKTsKKwlpZihzaXplb2YoaGlzdG9yeVtpLTFdKT43MCkKKwkgIFdMTihBTEVGVChoaXN0b3J5W2ktMV0sIDcwLCAiICIpKTsKKwllbHNlCisJICBXTE4oaGlzdG9yeVtpLTFdKTsKKyAgICAgIH0KKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBlbHNlIGlmKGxpbmVbMC4uMV09PSIlJSIgJiYgKGNtZD1oaXN0b3J5WzBdK2xpbmVbMi4uPDFdKSkKKyAgeworICAgIENvbW1hbmQoY21kKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBlbHNlIGlmKGxpbmVbMF09PSdeJyYmKHN0cnM9c3RyaXBfZXhwbG9kZShsaW5lLCAiXiIpKSkKKyAgeworICAgIGlmKHNpemVvZihzdHJzKSYmc3Ryc1swXSYmKGNtZD1oaXN0b3J5WzBdKSkKKyAgICB7CisgICAgICBpZihzaXplb2Yoc3Rycyk9PTIpCisJY21kPXN0cmluZ19yZXBsYWNlKGNtZCwgc3Ryc1swXSwgc3Ryc1sxXSk7CisgICAgICBlbHNlCisJY21kPXN0cmluZ19yZXBsYWNlKGNtZCwgc3Ryc1swXSwgIiIpOworICAgICAgbm9zdG9yZS0tOworICAgICAgQ29tbWFuZChjbWQpOworICAgICAgbm9zdG9yZSsrOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisgIGVsc2UgaWYobGluZVswXT09JyUnICYmIChzc2NhbmYobGluZVsxLi48MV0sICIlZCIsIGkpKSkKKyAgeworICAgIGk9IGk+MCA/IGkgOiAxOworICAgIGk9IGk8PU1BWF9ISVNUT1JZID8gaSA6IE1BWF9ISVNUT1JZOworICAgIGlmKGNtZD1oaXN0b3J5W2ktMV0pCisgICAgICBDb21tYW5kKGNtZCk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgZWxzZSBpZihsaW5lWzBdPT0nJScpCisgIHsKKyAgICBmb3IoaT0wOyBpPE1BWF9ISVNUT1JZOyBpKyspCisgICAgeworICAgICAgaWYoaGlzdG9yeVtpXSYmCisJIGhpc3RvcnlbaV1bMC4uc2l6ZW9mKGxpbmUpLTJdPT1saW5lWzEuLiA8MV0pCisgICAgICB7CisJQ29tbWFuZChoaXN0b3J5W2ldKTsKKwlyZXR1cm4gVFJVRTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZSBpZihub3N0b3JlPDEpCisgICAgaGlzdG9yeT0oe2xpbmV9KStoaXN0b3J5WzAuLk1BWF9ISVNUT1JZLTJdOworICByZXR1cm4gRkFMU0U7Cit9CisKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveGNhbGwgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hjYWxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZTIxZWEKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hjYWxsCkBAIC0wLDAgKzEsMjEgQEAKK1NZTk9QU0lTCisgICAgICB4Y2FsbCA8b2JqZWN0Pi0+PGZ1bmN0aW9uPig8ZXhwcmVzc2lvbj4pCisKK0RFU0NSSVBUSU9OCisgICAgICBDYWxscyB0aGUgbGZ1biA8ZnVuY3Rpb24+IG9mIHRoZSA8b2JqZWN0PiB3aXRoIDxleHByZXNzaW9uPiBhcworICAgICAgYXJndW1lbnQuIFRoZSA8cHJvcGVydGllcy5oPiBhcmUgaW5jbHVkZWQuIFRocmVlIG9iamVjdHMgYXJlIGFsbHJlYWR5CisgICAgICBkZWZpbmVkIG9uIGludm9rYXRpb24uICJtZSIgcmVwcmVzZW50cyB0aGUgb253ZXIgb2YgdGhlIFh0b29sLiAiaGVyZSIKKyAgICAgIGlzIHRoZSBjdXJyZW50IHJvb20gYW5kICJvYmoiIGlzIHRoZSBvYmplY3Qgd2hpY2ggbGZ1biBpcyBjYWxsZWQuCisgICAgICBUbyB1c2UgdGhlIG9iamVjdCBhY2Nlc3Mgc3ludGF4IGRlc2NyaWJlZCBhYm92ZSwgYSBmdW5jdGlvbiBjYWxsZWQKKyAgICAgICJnZXQoc3RyaW5nKSIgY2FuIGJlIHVzZWQuIElmIHRoZSBjYWxsIHJldHVybmVkIGFuIG9iamVjdCwgdGhlIHZhcmlhYmxlCisgICAgICAiJHJlc3VsdCIgd2lsbCBiZSBzZXQgdG8gdGhpcyBvYmplY3QuCisgICAgICB4Y2FsbCBpbmNsdWRlcyBhIHByaXZhdGUgfi8ueHRvb2wuaCwgaWYgaXQgZXhpc3RzLCB0byBzdXBwb3J0IHVzZXIKKyAgICAgIGRlZmluZWQgbWFjcm9zLgorCitFWEFNUExFUworICAgICAgeGNhbGwgJG1lLT5RdWVyeVByb3AoUF9MT05HKQorICAgICAgeGNhbGwgL3N0ZC90aGluZyMxNDUtPlNldFByb3AoUF9TSE9SVCwiYSBzbWFsbCB0aGluZyIpCisgICAgICB4Y2FsbCAvc2VjdXJlL21hc3Rlci0+YWRkX2RvbWFpbl93aXooImhlbGwiLCAiaHlwIikKKyAgICAgIHhjYWxsICRtZS0+bW92ZShnZXQoIl5kZWVwdGhvdWdodCIpLCJnbyIpCisgICAgICAodGhlIGxhc3Qgb25lIHVzZXMgdGhlIGZ1bmN0aW9uIGdldCgpIHRvIGZpbmQgdGhlIHJvb20gd2hlcmUgb3VyIGdvZCBpcykKKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94Y2FsbG91dHMgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hjYWxsb3V0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWFkZmE2Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94Y2FsbG91dHMKQEAgLTAsMCArMSwxNiBAQAorU1lOT1BTSVMKKyAgICAgIHhjYWxsb3V0cyBbc2VhcmNoIHBhdHRlcm5dCisJICBvcgorCSAgeGNhbGxvdXRzICAgICh3aGVuIHdyaXRpbmcgdG8gYSBwaXBlKQorCitERVNDUklQVElPTgorICAgICAgV2l0aCBubyBhcmd1bWVudCBpdCBzaG93cyBhbGwgeW91ciBjYWxsb3V0cy4gV2l0aCBhIHJlZ2V4cCBhcyBhcmd1bWVudCwKKyAgICAgIGFsbCBtYXRjaGluZyBjYWxsb3V0cyB3aWxsIGJlIHByaW50ZWQuIFdoZW4gd3JpdGluZyB0byBhIHBpcGUsIGFsbAorCSAgY2FsbF9vdXRzIHdpbGwgYmUgcHJpbnRlZCBhbmQgdGhlIHNlYXJjaCBwYXR0ZXJuIGlzIG5vdCBhbGxvd2VkLgorCitFWEFNUExFUworICAgICAgeGNhbGxvdXRzIG9iaiAgIFNob3cgYWxsIGNhbGxvdXRzIHdpdGggdGhlIHN0cmluZyAib2JqIiBpbiBpdC4KKyAgICAgIHhjYWxsb3V0cyAuICAgICBTaG93IGFsbCBjYWxsb3V0cy4gUGxlYXNlIG5ldmVyIGRvIHRoaXMgaWYgaXQgaXNuJ3QKKyAgICAgICAgICAgICAgICAgICAgICByZWFsbHkgbmVjY2Vzc2FyeS4gSXQganVzdCBjb3N0cyB0aW1lIC0gYW5kIHdoYXQgZG8geW91CisgICAgICAgICAgICAgICAgICAgICAgd2FudCB0byBkbyB3aXRoIHRoaXMgbWFzcyBvZiBpbmZvcm1hdGlvbj8KKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94Y2xlYW4gYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hjbGVhbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2M0ODhlCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94Y2xlYW4KQEAgLTAsMCArMSwxMiBAQAorU1lOT1BTSVMKKyAgICAgIHhjbGVhbiBbb2JqZWN0XQorCitERVNDUklQVElPTgorICAgICAgQ2xlYW4gdGhlIGludmVudG9yeSBvZiB0aGUgb2JqZWN0LCBidXQgZG9uJ3QgZGVzdHJ1Y3QgYW55IGxpdmluZy4KKyAgICAgIFdpdGggbm8gYXJndW1lbnQgdGhlIGN1cnJlbnQgcm9vbSB3aWxsIGJlIGNsZWFuZWQuIFRoZSBvYmplY3RzCisgICAgICBhcmUgcmVtb3ZlZCB3aXRoIHRoZSBsZnVuIHJlbW92ZSgpLgorCitFWEFNUExFCisgICAgICB4Y2xlYW4gJG1lLmJhZworICAgICAgQ2xlYW4gbXkgYmFnLgorCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hjbG9uZSBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGNsb25lCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYzFiN2EKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hjbG9uZQpAQCAtMCwwICsxLDEzIEBACitTWU5PUFNJUworICAgICAgeGNsb25lIDxmaWxlbmFtZT4KKworREVTQ1JJUFRJT04KKyAgICAgIENsb25lcyBhbiBvYmplY3QuIE9uIGVycm9yLCB0aGUgZXJyb3IgbG9nIGZpbGUgd2lsbCBiZSBwcmludGVkLgorICAgICAgTW92ZXMgdGhlIG9iamVjdCAoaWYgcG9zc2libGUpIGludG8geW91ciBpbnZlbnRvcnkuIElmIHRoZSBvYmplY3QKKyAgICAgIGhhcyBiZWVuIGNsb25lZCBzdWNjZXNzZnVsbHksIHRoZSB2YXJpYWJsZSAiJGNsb25lIiB3aWxsIGJlIHNldCwKKyAgICAgIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBsb3NlIHRoZSBvYmplY3Qgb3V0IG9mIHNpZ2h0IDopCisKK0VYQU1QTEUKKyAgICAgIHhjbG9uZSAvc3RkL3RoaW5nCisgICAgICB4Y2FsbCAkY2xvbmUtPlNldFNob3J0KCJhIEJJRyB0aGluZyEiKTsKKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94ZGJnIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94ZGJnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MDlmMmYKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hkYmcKQEAgLTAsMCArMSwxNCBAQAorU1lOT1BTSVMKKyAgICAgIHhkYmcgPG9iamVjdD4KKworREVTQ1JJUFRJT04KKyAgICAgIFByaW50cyBvdXQgZGVidWcgaW5mb3JtYXRpb24gYnV5IHVzaW5nIHRoZSBlZnVuIGRlYnVnX2luZm8oKS4KKyAgICAgIE5vdCBhbGwgb2YgdGhlc2UgaW5mb3JtYXRpb24gaXMgdXNlZnVsIGJ1dCBpdCBnaXZlcyB5b3UgaW5mb3JtYXRpb24KKyAgICAgIG9mIGhvdyBtYW55IHZhcmlhYmxlcywgZnVuY3Rpb25zLCBpbmhlcml0ZWQgb2JqZXRjcyBhbmQgc28gb24gYSBvYmplY3QKKyAgICAgIGhhcy4gSXQgYWxzbyBzaG93cyBpZiBhbiBvYmplY3QgaXMgbGl2aW5nLCBpZiBpdHMgaGVhcnQgYmVhdCBpcyB0dXJuZWQKKyAgICAgIG9uLCB3aGVuIHRoZSBuZXh0IGNhbGwgb2YgcmVzZXQoKSB3aWxsIGJlIChidXQgZG9uJ3QgdGFrZSB0aGlzIHZhbHVlCisgICAgICBub3QgdG9vIHNlcmlvdXNseSkgZXRjLgorCitFWEFNUExFCisgICAgICB4ZGJnICRtZQorCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hkY2xlYW4gYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hkY2xlYW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlmOTA5MwotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGRjbGVhbgpAQCAtMCwwICsxLDYgQEAKK1NZTk9QU0lTCisgICAgICB4ZGNsZWFuIDxvYmplY3Q+CisKK0RFU0NSSVBUSU9OCisgICAgICBTYW1lIGFzIHhjbGVhbiwgYnV0IG1ha2VzIGEgZGVlcCBjbGVhbi4KKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94ZGRlcyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGRkZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIzNTY0NQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGRkZXMKQEAgLTAsMCArMSw2IEBACitTWU5PUFNJUworICAgICAgeGRkZXMgPG9iamVjdD4KKworREVTQ1JJUFRJT04KKyAgICAgIFNhbWUgYXMgeGRlcywgYnV0IG1ha2VzIGEgZGVlcCBkZXN0cnVjdC4KKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94ZGVzIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94ZGVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YmY5ODQKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hkZXMKQEAgLTAsMCArMSw4IEBACitTWU5PUFNJUworICAgICAgeGRlcyA8b2JqZWN0PgorCitERVNDUklQVElPTgorICAgICAgRGVzdHJ1Y3QgYW4gb2JqZWN0IHVzaW5nIGJ5IGZpcnN0IGNhbGxpbmcgdGhlIGxmdW4gcmVtb3ZlKCkgb2YgdGhlCisgICAgICBvYmplY3QgYW5kIGlmIGl0cyBzdGlsbCAiYWxpdmUiIHRoZW4gZGVzdHJ1Y3QgaXQgd2l0aCB0aGUgZWZ1bgorICAgICAgZGVzdHJ1Y3QoKS4KKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94ZGxvb2sgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hkbG9vawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Zjc3NzJmCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94ZGxvb2sKQEAgLTAsMCArMSw2IEBACitTWU5PUFNJUworICAgICAgeGRsb29rIDxvYmplY3Q+CisKK0RFU0NSSVBUSU9OCisgICAgICBTYW1lIGFzIGxvb2ssIGJ1dCB0YWtlcyBhIGRlZXAgbG9vayBhdCB0aGUgb2JqZWN0LgorCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hkbyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGRvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZmE1ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hkbwpAQCAtMCwwICsxLDE0IEBACitTWU5PUFNJUworICAgICAgeGRvIFs8bnVtYmVyMT4jXTxjb21tYW5kMT5bO1s8bnVtYmVyMj4jXTxjb21tYW5kMj5dIC4uLgorCitERVNDUklQVElPTgorICAgICAgUGVyZm9ybSBtdWx0aXBsZSBjb21tYW5kIGV4ZWN1dGlvbi4KKworICAgICAgRXhhbXBsZXM6CisgICAgICB4ZG8gNSNzbWlsZSAgIChzbWlsZSA1IHRpbWVzKQorCisgICAgICB4ZG8gbDtpICAgICAgIChsb29rIGFyb3VuZCBpbiB0aGUgcm9vbSBhbmQgdGhlbiBpbiB5b3VyIGludmVudG9yeSkKKworICAgICAgeGRvIHM7OSN3OzMjbjtraWxsIHNoYW1hbjtnZXQgc3dvcmQgZnJvbSBjb3Jwc2U7MyNzOzkjZTtuOy4uLgorICAgICAgICAgICAgICAgICAgICAoeW91IGtub3cgdGhpcyBvbmUgOikKKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94ZHVwZGF0ZSBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGR1cGRhdGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM3NTJiOQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGR1cGRhdGUKQEAgLTAsMCArMSw4IEBACitTWU5PUFNJUworICAgICAgeGR1cGRhdGUgPGZpbGVuYW1lPgorCitERVNDUklQVElPTgorICAgICBVcGRhdGUgYW4gb2JqZWN0IGluY2x1ZGluZyBhbGwgaXRzIGluaGVyaXRlZCBvYmplY3RzLgorCitFWEFNUExFCisgICAgIHhkdXBkYXRlIC9zdGQvcGxheWVyLmMKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveGV2YWwgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hldmFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MzJiZGYKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hldmFsCkBAIC0wLDAgKzEsMTggQEAKK1NZTk9QU0lTCisgICAgICB4ZXZhbCA8ZXhwcmVzc2lvbj4KKworREVTQ1JJUFRJT04KKyAgICAgIEV4ZWN1dGUgYW4gTFBDIGV4cHJlc3Npb24uIEluc2lkZSB0aGUgPGV4cHJlc3Npb24+LCAibWUiIGFuZCAiaGVyZSIgYXJlCisgICAgICBwcmVkZWZpbmVkIG9iamVjdHMgKGd1ZXNzIGZvciB3aGF0IDopLiBIZXJlIHdlIGNhbiBhbHNvIHVzZSB0aGUgZnVuY3Rpb24KKyAgICAgICJnZXQoKSIgdG8gZmluZCBhbiBvYmplY3QgdXNpbmcgdGhlIG9iamVjdCBhY2Nlc3Mgc3ludGF4LiBJZiB0aGUKKyAgICAgIEV4cHJlc3Npb24gcmV0dXJucyBhbiBvYmplY3QgdGhlIHZhcmlhYmxlICIkcmVzdWx0IiB3aWxsIGJlIHNldCB0byB0aGlzLgorICAgICAgeGV2YWwgaW5jbHVkZXMgYSBwcml2YXRlIH4vLnh0b29sLmgsIGlmIGl0IGV4aXN0cywgdG8gc3VwcG9ydCB1c2VyICAgICAgICAKKyAgICAgIGRlZmluZWQgbWFjcm9zLgorCisKK0VYQU1QTEVTCisgICAgICBKdXN0IGRvIGl0IQorICAgICAgeGV2YWwgdXNlcnMoKQorICAgICAgeGV2YWwgZ2V0dWlkKG1lKQorICAgICAgeGV2YWwgZ2V0KCIkbWUueHRvb2wiKQorCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hmb3JhbGwgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hmb3JhbGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc1NThmNAotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGZvcmFsbApAQCAtMCwwICsxLDI5IEBACitTWU5PUFNJUworICAgICAgeGZvcmFsbCA8ZmlsZXBhdHRlcm4+IDxjb21tYW5kPgorCitERVNDUklQVElPTgorICAgICAgRXhlY3V0ZSA8Y29tbWFuZD4gZm9yIGFsbCBtYXRjaGluZyBmaWxlcy4gVGhlIDxjb21tYW5kPiBzdHJpbmcgY2FuCisgICAgICBjb250YWluIHJlcGxhY21lbnQgbWFya3MuIEN1cnJlbnRseSB0aGVyZSBhcmUgZml2ZSBvZiB0aGVzZSBtYXJrczoKKyAgICAgIC0gIiEhIiB0aGlzIG1hcmsgc3RhbmRzIGZvciB0aGUgZnVsbCBmaWxlIG5hbWUuCisgICAgICAtICIhZSIgc3RhbmRzIGZvciB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBmaWxlIG5hbWUuCisgICAgICAtICIhZiIgc3RhbmRzIGZvciB0aGUgZmlsZSBuYW1lIHdpdGhvdXQgZXh0ZW5zaW9uIGFuZCBkaXJlY3RvcnkgbmFtZS4KKyAgICAgIC0gIiFoIiBzdGFuZHMgZm9yIHRoZSBmdWxsIGRpcmVjdG9yeSBuYW1lIG9mIHRoZSBmaWxlcy4KKyAgICAgIC0gIiFyIiBzdGFuZHMgZm9yIHRoZSBmdWxsIGZpbGUgbmFtZSB3aXRob3V0IGZpbGUgZXh0ZW5zaW9uLgorICAgICAgLSAiIXQiIHN0YW5kcyBmb3IgdGhlIGZpbGUgbmFtZSB3aXRob3V0IHRoZSBkaXJlY3RvcnkgbmFtZS4KKworICAgICAgSWYgdGhlIGZ1bGwgZmlsZSBuYW1lIHdvdWxkIGJlICIvZGlyZWN0b3J5L2ZpbGUuZXh0IiB0aGVuCisgICAgICAiISEiIGVxdWFscyAiL2RpcmVjdG9yeS9maWxlLmV4dCIKKyAgICAgICIhZSIgZXF1YWxzICJleHQiCisgICAgICAiIWYiIGVxdWFscyAiZmlsZSIKKyAgICAgICIhaCIgZXF1YWxzICIvZGlyZWN0b3J5IgorICAgICAgIiFyIiBlcXVhbHMgIi9kaXJlY3RvcnkvZmlsZSIKKyAgICAgICIhdCIgZXF1YWxzICJmaWxlLmV4dCIKKworRVhBTVBMRVMKKyAgICAgIHhmb3JhbGwgfi9yb29tLyouYyB4Y2FsbCAhci0+cmVzZXQoKTsKKyAgICAgIENhbGwgdGhlIHJlc2V0KCkgZnVuY3Rpb24gaW4gYWxsIHlvdXIgcm9vbXMuCisKKyAgICAgIHhmb3JhbGwgfi9vYmovKiBtdiAhISAhaC9vbGRvYmovIWYuIWUub2xkCisgICAgICBNb3ZlIGFsbCBmaWxlcyBmcm9tIHlvdXIgIm9iaiIgZGlyIGludG8gdGhlICJvYmovb2xkb2JqIiBkaXIgYW5kIGNoYW5nZQorICAgICAgdGhlIGV4dGVuc2lvbnMuCisKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveGdvdG8gYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hnb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNGNjYmEKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hnb3RvCkBAIC0wLDAgKzEsMTYgQEAKK1NZTk9QU0lTCisgICAgICB4Z290byBbb2JqZWN0XQorCitERVNDUklQVElPTgorICAgICAgR28gaW5zaWRlIDxvYmplY3Q+LiBXaXRob3V0IGFuIGFyZ3VtZW50IHlvdSB3aWxsIGxlYXZlIGludG8geW91cgorICAgICAgd29ya3Jvb20uIElmIDxvYmplY3Q+IGlzIGEgbGl2aW5nIHRoaW5nLCBnb3RvIGl0J3MgZW52aXJvbm1lbnQKKyAgICAgIChuZXZlciB0ZXN0ZWQgdW50aWwgbm93LCB3aGVuIGdvaW5nIHRvIGEgbGl2aW5nIHRoaW5nLCBpbnNpZGUKKyAgICAgIGEgbGl2aW5nIHRoaW5nIDopCisKK0VYQU1QTEVTCisgICAgICB4Z290byAvcm9vbS9zaG9wCisgICAgICB4Z290byBzaG9wCSAoYm90aCBhcmUgdGhlIHNhbWUsIGJlY2F1c2UgaWYgdGhlcmUgaXMgbm8gc2hvcCBpbgorCQkJICB0aGUgY3VycmVudCBkaXJlY3RvcnksIGEgIi9yb29tLyIgd2lsbCBiZSBhcHBlbmRlZAorCQkJICB0byB0aGUgYXJndW1lbnQpCisgICAgICB4Z290byBwdWJsaWMgZW5lbXkgKGRvIHRoaXMgb25seSB3aGVuIHlvdSBhcmUgcmVhbGx5IGJvcmVkKQorCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hncmVwIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94Z3JlcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTE0ZmNiCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94Z3JlcApAQCAtMCwwICsxLDI1IEBACitTWU5PUFNJUworICAgICAgeGdyZXAgWy1pdl0gPHJlZ2V4cD4gPGZpbGVwYXR0ZXJuPgorICAgICAgICBvcgorICAgICAgeGdyZXAgWy1pdl0gPHJlZ2V4cD4gICAgKHdoZW4gcmVhZGluZyBmcm9tIGEgcGlwZSkKKworREVTQ1JJUFRJT04KKyAgICAgIFNlYXJjaCBmb3IgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiA8cmVnZXhwPiBpbiBhbGwgZmlsZXMgbWF0Y2hpbmcgdGhlCisgICAgICA8ZmlsZXBhdHRlcm4+LgorICAgICAgV29ya3Mgc2ltdWxhciB0byB0aGUgVW5peCBjb21tYW5kICJncmVwIi4gVGhlIHJlc2x1dCB3aWxsIGJlIHdyaXR0ZW4KKyAgICAgIHRvIDxTVERPVVQ+IGFuZCBtYXkgYmUgcGlwZWQgaW50byBhbm90aGVyIGNvbW1hbmQuCisKK09QVElPTlMKKyAgICAgIC12ICByZXZlcnRzIHRoZSBzZW5zZSBvZiA8cmVnZXhwPi4KKworICAgICAgLWkgIG1hdGNoZXMgY2FzZS1pbnNlbnNpdGl2ZQorCitFWEFNUExFUworICAgICAgeGdyZXAgRGVlcHRob3VnaHQgL2xvZy9TSE9VVFMKKyAgICAgIFRoaXMgd2lsbCBzZWFyY2ggdGhyb3VnaHQgdGhlIHNob3V0IGxvZyBmaWxlIGZvciBhbnkgbGluZSB3aGljaCBoYXMKKyAgICAgIHRoZSB3b3JkICJEZWVwdGhvdWdodCIgaW4gaXQuCisKKyAgICAgIHhncmVwIGNyZWF0ZVwoXCkgKi5jCisgICAgICBUaGlzIHdpbGwgc2VhcmNoIGZvciBhbGwgbGluZXMgb2YgYWxsIGxwYyBjb2RlIGZpbGVzIGluIHRoZSBjdXJyZW50IGRpcgorICAgICAgd2hpY2ggaGF2ZSB0aGUgZnVuY3Rpb24gImNyZWF0ZSgpIiBkZWZpbmVkLgorCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hoYmVhdHMgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hoYmVhdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E4OTdmMwotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGhiZWF0cwpAQCAtMCwwICsxLDE4IEBACitTWU5PUFNJUworICAgICAgeGhiZWF0cyBbc2VhcmNoIHBhdHRlcm5dCisgICAgICBvcgorCSAgeGhiZWF0cyAgICAgKHdoZW4gd3JpdGluZyB0byBhIHBpcGUpCisKK0RFU0NSSVBUSU9OCisgICAgICBXaXRoIG5vIGFyZ3VtZW50IGl0IHNob3dzIGFsbCB5b3VyIG9iamVjdHMgd2hpY2ggaGF2ZSBhIHJ1bm5pbmcgaGVhcnQKKyAgICAgIGJlYXQuIFdpdGggYSByZWdleHAgYXMgYXJndW1lbnQsIGFsbCBtYXRjaGluZyBvYmplY3RzIHdpbGwgYmUgcHJpbnRlZC4KKwkgIFdoZW4gd3JpdGluZyB0byBhIHBpcGUsIGFsbCBoZWFyYmVhdHMgd2lsbCBiZSBwcmludGVkIGFuZCBhIHNlYXJjaAorCSAgcGF0dGVybiBpcyBub3QgYWxsb3dlZC4KKworRVhBTVBMRVMKKyAgICAgIHhoYmVhdHMgb2JqICAgU2hvdyBhbGwgb2JqZWN0cyB3aGljaCBoYXZlIGEgcnVubmluZyBoZWFydCBiZWF0IGF0IHRoZQorICAgICAgICAgICAgICAgICAgICBvYmplY3QgbmFtZXMgd2l0aCB0aGUgc3RyaW5nICJvYmoiIGluIGl0LgorICAgICAgeGhiZWF0cyAuICAgICBTaG93IGFsbCBjYWxsb3V0cy4gUGxlYXNlIGRvbid0IGRvIHRoaXMgaWYgaXQgaXNuJ3QKKyAgICAgICAgICAgICAgICAgICAgcmVhbGx5IG5lY2Nlc3NhcnkuIEl0IGp1c3QgY29zdHMgdGltZSAtIGFuZCB3aGF0IGRvIHlvdQorICAgICAgICAgICAgICAgICAgICB3YW50IHRvIGRvIHdpdGggdGhpcyBpbmZvcm1hdGlvbj8KKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94aGVhZCBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGhlYWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgwMTA1NQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGhlYWQKQEAgLTAsMCArMSwxMSBAQAorU1lOT1BTSVMKKyAgICAgIHhoZWFkIDwtIz4gPGZpbGU+CisJICBvcgorCSAgeGhlYWQgPC0jPiAgICAod2hlbiByZWFkaW5nIGZyb20gYSBwaXBlKQorCitERVNDUklQVElPTgorICAgICAgeGhlYWQgcHJpbnRzIHRoZSBmaXJzdCBwYXJ0IG9mIGEgZ2l2ZW4gZmlsZTsgSXQgcmVhZHMgZnJvbSBhIHBpcGUKKwkgIGlmIG5vIGZpbGUgaXMgZ2l2ZW4uCisKK0VYQU1QTEVTCisgICAgICB4aGVhZCAtMTAgd29ya3Jvb20uYyBwcmludHMgdGhlIGZpcnN0IDEwIGxpbmVzIG9mIHRoZSBmaWxlIHdvcmtyb29tLmMuCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hoZWxwIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94aGVscApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGFhN2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94aGVscApAQCAtMCwwICsxLDYgQEAKK1NZTk9QU0lTCisgICAgICB4aGVscAorCitERVNDUklQVElPTgorICAgICAgU2hvdyB0aGUgbWFpbiBoZWxwIGZpbGUuCisKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveGlkcyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGlkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2VmNzYxCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94aWRzCkBAIC0wLDAgKzEsNiBAQAorU1lOT1BTSVMKKyAgICAgIHhpZHMgPG9iamVjdD4KKworREVTQ1JJUFRJT04KKyAgICAgIFNob3cgdGhlIHVzZXIgaWQgYW5kIHRoZSBlZmZlY3RpdmUgdXNlciBpZCBvZiB0aGUgPG9iamVjdD4uCisKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveGluaGVyaXQgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hpbmhlcml0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMDJmM2UKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hpbmhlcml0CkBAIC0wLDAgKzEsMTYgQEAKK1NZTk9QU0lTCisgICAgICB4aW5oZXJpdCA8b2JqZWN0PiBbZnVuY3Rpb25dCisKK0RFU0NSSVBUSU9OCisgICAgICBTaG93IHRoZSBpbmhlcml0YW5jZSB0cmVlIG9mIGFuIG9iamVjdCBhbmQgaWYgb3B0aW9uYWwgc3BlY2lmaWVkCisgICAgICBkaXNwbGF5IGFsbCBvY2N1cmVuY2llcyBvZiB0aGUgZnVuY3Rpb24uCisgICAgICBUaGUgaW5oZXJpdGFuY2UgdHJlZSBpcyBwZXJoYXBzIG5vdCB0aGUgb25lIHlvdSBleHBlY3QgdG8gc2VlLiBJbgorICAgICAgZmFjdCBpdHMgdGhlIG9uZSB0aGUgZ2FtZWRyaXZlciByZWFsbHkgdXNlcy4gVGhhdCBtZWFucyBpZiBmb3IKKyAgICAgIGV4YW1wbGUgdHdvIG9iamVjdCBpbmhlcml0IGVhY2ggb3RoZXIgb3IgaW4gYW55IG90aGVyIGNhc2Ugb2YgcmVjdXJzaW9uCisgICAgICBpdCB3aWxsIG5vdCBiZSBzaG93bi4gT3IgaWYgYW4gb2JqZWN0IEEgaW5oZXJpdHMgb2JqZWN0IEIgYW5kIEMKKyAgICAgIGFuZCBvYmplY3QgQiBhbHNvIGluaGVyaXRzIG9iamVjdCBDLCB0aGUgb2JqZWN0IEMgd2lsbCBvbmx5IGRpc3BsYXllZAorICAgICAgb25jZSAoYmVjYXVzZSB0aGUgZ2FtZWRyaXZlciBhbHNvIGluaGVyaXRzIG9iamVjdCBvbmNlKS4KKworRVhBTVBMRQorICAgICAgeGluaGVyaXQgJG1lCisKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveGxhZyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGxhZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDI4MTE0Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94bGFnCkBAIC0wLDAgKzEsMTYgQEAKK1NZTk9QU0lTCisgICAgICB4bGFnCisKK0RFU0NSSVBUSU9OCisgICAgICB4bGFnIGRpc3BsYXlzIHRoZSBjdXJyZW50IHN5c3RlbSBMQUcgYnkgY29tcGFyaW5nIHRoZSBhY3R1YWwKKyAgICAgIHByb2Nlc3NlZCBoZWFydGJlYXRzIHdpdGggdGhlIGluaXRpYWwgaGVhcnRiZWF0IHJhdGUgKDEvMnMpLgorICAgICAgVmFsdWVzIHdpbGwgd2UgZGlzcGxheWVkIGZvciB0aGUgbGFzdCBtaW51dGUsIHRoZSBsYXN0IDE1IG1pbnV0ZXMKKyAgICAgIGFuZCB0aGUgbGFzdCBob3VyLgorCitFWEFNUExFCisgICAgICBMZXR6dGUgNjAgbWluOiAjIyMjIyMjICg3LjIlKQorICAgICAgTGV0enRlIDE1IG1pbjogIyMjIyMjIyMgKDguMyUpCisgICAgICBMZXR6dGUgTWludXRlOiAjIyMjIyMjIyMgKDkuNCUpIAorCitBVkFJTEFCSUxJVFkKKyAgICAgIHhsYWcgcmVxdWlyZXMgL3BsYXllcnMva2lyay9vYmovbGFnLW8tZGFlbW9uLmMgdG8gYmUgbG9hZGVkLgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94bG9hZCBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGxvYWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBkYjg3NwotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGxvYWQKQEAgLTAsMCArMSwxNSBAQAorU1lOT1BTSVMKKyAgICAgIHhsb2FkIDxmaWxlbmFtZT4KKworREVTQ1JJUFRJT04KKyAgICAgIFVwZGF0ZSBhbmQgbG9hZCB0aGUgb2JqZWN0IHNwZWNpZmllZCBieSB0aGUgZmlsZW5hbWUuIElmIHlvdSB1cGRhdGUKKyAgICAgIHlvdXIgY3VycmVudCBlbnZpcm9ubWVudCwgYWxsIHBsYXllcnMgd2lsbCBiZSBtb3ZlZCBzaWxlbnRseSBpbnRvCisgICAgICAiL3N0ZC92b2lkIiBhbmQgYWZ0ZXIgc3VjY2Vzc2Z1bCB1cGRhdGluZyBhbmQgbG9hZGluZyBiYWNrIGludG8gaXQuCisKK0VYQU1QTEVTCisgICAgICB4bG9hZCAkaGVyZQorICAgICAgVXBkYXRlIGFuZCByZWxvYWQgdGhlIGN1cnJlbnQgcm9vbSAoYnV0IHdpdGhvdXQgYSB0cmlwIGludG8gdGhlIHZvaWQgOikuCisKKyAgICAgIHhsb2FkIG9iai9saXR0bGVfdGhpbmcuYworICAgICAgVXBkYXRlIGFuZCBsb2FkIGl0LgorCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hsb29rIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94bG9vawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTliYzllCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94bG9vawpAQCAtMCwwICsxLDcgQEAKK1NZTk9QU0lTCisgICAgICB4bG9vayBbb2JqZWN0XQorCitERVNDUklQVElPTgorICAgICAgTG9vayBhdCB0aGUgb2JqZWN0LiBJZiB0aGUgYXJndW1lbnQgaXMgb21taXR0ZWQsIGxvb2sgaW5zaWRlIHRoZQorICAgICAgY3VycmVudCByb29tLgorCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hscGMgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hscGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY0NzFlZAotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGxwYwpAQCAtMCwwICsxLDIwIEBACitTWU5PUFNJUworICAgICAgeGxwYyA8bHBjIGNvZGU+CisKK0RFU0NSSVBUSU9OCisgICAgICBFeGVjdXRlIHB1cmUgTFBDIGNvZGUuICJtZSIgYW5kICJoZXJlIiBhcmUgcHJlZGVmaW5lZCBvYmplY3RzLiBBbHNvIHRoZQorICAgICAgPHByb3BlcnRpZXMuaD4gd2lsbCBiZSBpbmNsdWRlZC4gVGhlIGZ1bmN0aW9uICJnZXQoc3RyaW5nKSIgY2FuIGJlIHVzZWQKKyAgICAgIGZvciBhY2Nlc3Npbmcgb2JqZWN0cy4gSWYgdGhlIGV4ZWN1dGlvbiByZXR1cm5zIGFuIG9iamVjdCB0aGUgdmFyaWFibGUKKyAgICAgICIkcmVzdWx0IiB3aWxsIHNldCB0byB0aGlzIG9iamVjdC4KKworRVhBTVBMRVMKKyAgICAgIHhscGMgaW50IGk7b2JqZWN0ICpvO289dXNlcnMoKTtmb3IoaT0wO2k8c2l6ZW9mKG8pO2krKylvW2ldLT4KKyAgICAgICAgICAgU2V0UHJvcChQX0ZST0csMSk7CisgICAgICAoTGV0IGFsbCB1c2VycyBiZSBzbGlteSBmcm9ncyA6KQorCisgICAgICB4bHBjIGludCBpO29iamVjdCAqbztvPXVzZXJzKCk7Zm9yKGk9MDtpPHNpemVvZihvKTtpKyspCisJICAgb1tpXS0+U2V0UHJvcChQX1RJVExFLGdldCgiJG1lIiktPlF1ZXJ5UHJvcChQX1RJVExFKSk7CisgICAgICAoR2l2ZSBhbGwgdXNlcnMgeW91ciBwcmVmZXJlZCB0aXRsZS4gVGFrZSBhIGxvb2sgb2YgdGhlIHVzZSBvZiBnZXQoKS4pCisKKyAgICAgIEJvdGggY29tbWFuZHMgbXVzdCBiZSB3cml0dGVuIGluIG9uZSBsaW5lIG9mIGNvdXJzZSEKKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94bWFuIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94bWFuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNTZhZDEKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3htYW4KQEAgLTAsMCArMSwxNyBAQAorU1lOT1BTSVMKKyAgICAgIHhtYW4gPHRvcGljPgorCitERVNDUklQVElPTgorICAgICAgU2VhcmNoZXMgaW4gc29tZSBzcGVjaWFsIGRpcmVjdG9yaWVzIHVuZGVyIC9kb2MgZm9yIHRoZSBnaXZlbiB0b3BpYworICAgICAgb3IgY29tbWFuZC4gSWYgdGhlcmUgYXJlIHR3byBlcXVhbCB0b3BpY3MgaW4gZGlmZmVyZW50IGRpcmVjdG9yaWVzCisgICAgICB0aGUgb25lIGZvdW5kIGZpcnN0IHdpbGwgYmUgcHJpbnRlZC4KKworRVhBTVBMRVMKKyAgICAgIHhtYW4geG1hbgorICAgICAgeG1hbiB4Zm9yYWxsCisgICAgICB4bWFuIGVmdW4vZGVzdHJ1Y3QKKyAgICAgIHhtYW4gdy9kZXN0cnVjdAorICAgICAgeG1hbiBtb3ZlCisgICAgICB4bWFuIHRoaW5nCisgICAgICB4bWFuIGRvbWFpbnMKKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94bW9yZSBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveG1vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNkOTI1MAotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveG1vcmUKQEAgLTAsMCArMSwxMiBAQAorU1lOT1BTSVMKKyAgICAgIHhtb3JlIDxmaWxlbmFtZT4gW3N0YXJ0XQorCitERVNDUklQVElPTgorICAgICAgUHJpbnRzIG91dCBhIGZpbGUgYW5kIGlmIGEgc3RhcnRpbmcgbGluZSBpcyBnaXZlbiwgdGhlbiB0aGUgcHJpbnRpbmcKKyAgICAgIHdpbGwgc3RhcnQgdGhlcmUuIE9uIGFuc2kgb3IgdnQxMDAgdGVybWluYWxzIHRoZSBzdGF0dXMgbGluZSB3aWxsIGJlCisgICAgICBvdmVyc3Ryb2tlZCB0byBnaXZlIGEgaGFybW9uaWMgdmlldyBvZiB0aGUgZmlsZS4KKworRVhBTVBMRVMKKyAgICAgIHhtb3JlIH4vd29ya3Jvb20uYworICAgICAgeG1vcmUgJGhlcmUgKHRoaXMgd2lsbCBzaG93IHRoZSBzb3VyY2Ugb2YgdGhlIGN1cnJlbnQgcm9vbSkKKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94bW92ZSBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveG1vdmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRjMGFlYwotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveG1vdmUKQEAgLTAsMCArMSwxMyBAQAorU1lOT1BTSVMKKyAgICAgIHhtb3ZlIDxvYmplY3Q+IGludG8gPG9iamVjdD4KKworREVTQ1JJUFRJT04KKyAgICAgIE1vdmVzIG9uZSBvYmplY3QgaW50byBhbm90aGVyIG9yIGdpdmUgdGhlIHJlYXNvbiB3aHkgdGhlIG1vdmUgZmFpbGVkLgorCitFWEFNUExFUworICAgICAgeG1vdmUgJGNsb25lIGludG8gJG1lCisgICAgICBJZiB5b3UgY2xvbmVkIGFuIG9iamVjdCB3aXRoIHhjbG9uZSBidXQgdGhlIG9iamVjdCBjb3VsZG4ndCBiZSBtb3ZlZAorICAgICAgdGhlbiB0aGlzIGNhbiBiZSB1c2VkIHRvIGdldCB0aGUgcmVhc29uIGZvciBpdC4KKworICAgICAgeG1vdmUgaHlwIGludG8gXnd1cnplbCAgKHRoaXMgaXMgYSBzaWxlbnQgZm9ybSBvZiBnb2luZyB0byBvdGhlciBwbGF5ZXJzKQorCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3htc2cgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3htc2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc1Yjc4MAotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveG1zZwpAQCAtMCwwICsxLDExIEBACitTWU5PUFNJUworICAgICAgeG1zZyBbdG8gPG9iamVjdD58YWxsXQorCitERVNDUklQVElPTgorICAgICAgU2VuZCBhIG1lc3NhZ2UuIElmIG5vIGFyZ3VtZW50cyBhcmUgZ2l2ZW4gdGhlIG1lc3NhZ2Ugd2lsbCBiZSBzZW5kIGludG8KKyAgICAgIHRoZSByb29tLiBJZiBzZWNvbmQgYXJndW1lbnQgaXMgInRvIiB0aGVuIHNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlCisgICAgICBzcGVjaWZpZWQgPG9iamVjdD4uIElmIHNlY29uZCBhcmd1bWVudCBpcyAiYWxsIiB0aGVuIHNlbmQgdGhlIG1lc3NhZ2UgdG8KKyAgICAgIGFsbCBwbGF5ZXJzIGluIHRoZSBtdWQuCisgICAgICBUaGlzIGNvbW1hbmQgY2FuIGJlIHVzZWQgdG8gc2VuZCB0ZXh0IHZpYSBjdXQmcGFzdGUgdG8gc29tZW9uZSB3aXRob3V0CisgICAgICBwdXR0aW5nIGEgInNheSIsICJ0ZWxsIiBvciAic2hvdXQiIGluZnJvbnQgb2YgZWFjaCBsaW5lLgorCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3htdHAgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3htdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ3NGE5YwotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveG10cApAQCAtMCwwICsxLDI0IEBACitTWU5PUFNJUworICAgICAgeG10cCBbb3B0aW9uc10gPGRpcmVjdG9yeT4gPGZpbGU+CisKK0RFU0NSSVBUSU9OCisgICAgICBDcmVhdGUgYSBzY3JpcHQgZmlsZSBmb3IgdHJhbnNmZXJpbmcgY29tcGxldGUgZGlyZWN0b3JpZXMgd2l0aCBtdHAuCisgICAgICBJZiB5b3VyIG10cCBuZWVkcyBleHRyYSBhcmd1bWVudHMgKGV4Y2VwdCBvZiB0aGUgLXIgb3B0aW9uIHdoaWNoCisgICAgICBzdGFuZHMgZm9yIHJlYWRpbmcgZmlsZXMpIGZvciBleGFtcGxlIHRoZSAtZyBvcHRpb24gdGhlbiB5b3UgY2FuIGFkZAorICAgICAgdGhlbiB0byB0aGUgY29tbWFuZC4KKyAgICAgIFRoaXMgY29tbWFuZCB3b3JrcyByZWN1cnNpdmVseSBhbmQgY2FuIGNhdXNlIGEgdG8gZGVlcCByZWN1cnNpb24gb3IKKyAgICAgIGEgdG9vIGxvbmcgZXZhbHVhdGlvbiBlcnJvciB3aGVuIHRyeWluZyB0byBtYWtlIGEgc2NyaXB0IGZvciBodWdlCisgICAgICBkaXJlY3RvcmllcyBsaWtlICIvcGxheWVycyIgZm9yIGV4YW1wbGUuCisgICAgICBJZiB0aGUgPGZpbGU+IGFsbHJlYWR5IGV4aXN0cyBpdCB3aWxsIG5vdCBiZSByZW1vdmVkIGluc3RlYWQgdGhlIHNjcmlwdAorICAgICAgd2lsbCBzaW1wbHkgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZS4KKworRVhBTVBMRQorICAgICAgeG10cCAtZ3R1Ym11ZCAvYmFzaWMgfi9iYXNpYy5jc2gKKyAgICAgIENyZWF0ZSBhIHNjcmlwdCBmaWxlICJiYXNpYy5jc2giIHRvIHRyYW5zZmVyIHRoZSB3aG9sZSBjb250ZW50IG9mIHRoZQorICAgICAgIi9iYXNpYyIgZGlyZWN0b3J5LgorCisgICAgICBPbiB5b3VyIGhvc3QgeW91IHRoZW4ganVzdCBjcmVhdGUgYSBkaXJlY3RvcnkgKG5vcm1hbGx5IHdpdGggdGhlIHNhbWUKKyAgICAgIG5hbWUgZ2l2ZSB0byB0aGUgeG10cCBjb21tYW5kKSwgY2hhbmdlIGludG8gdGhlIGRpcmVjdG9yeSBhbmQgcmVhZAorICAgICAgdGhlIHNjcmlwdCBmaWxlIHdpdGggIm10cCAtciBiYXNpYy5jc2giLiBUaGVuIGp1c3QgZXhlY3V0ZSB0aGUgc2NyaXB0CisgICAgICB3aXRoICJjc2giIG9yICJzaCIuCisKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveHByb2MgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hwcm9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZDBhYTEKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hwcm9jCkBAIC0wLDAgKzEsMTMgQEAKK1NZTk9QU0lTCisgICAgICB4cHJvYyBbLWNdIFstbF0gWy1tXSBbLXVdIFstdl0KKworREVTQ1JJUFRJT04KKyAgICAgIHhwcm9jIHByaW50cyBpbmZvcm1hdGlvbiBmcm9tIHRoZSAvcHJvYyBmaWxlc3lzdGVtIHRvIHRoZSBzY3JlZW4uCisgICAgICBUaGUgZm9ybWF0IGlzIHRvdGFsbHkgdW5mb3JtYXR0ZWQhIChJIGNhbid0IGhlbHAgaXQgZm9yIG5vdy4uLikgCisgICAgICBXaXRob3V0IGFueSBvcHRpb24sIGl0IGRpc3BsYXkgdGhlIG1hY2hpbmVzIGxvYWQgYXZlcmFnZXMuCisKKyAgICAgIC1jOiBjcHUgaW5mb3JtYXRpb24KKyAgICAgIC1sOiBsb2FkIGF2ZXJhZ2VzCisgICAgICAtbTogbWVtb3J5IHVzYWdlCisgICAgICAtdTogbWFjaGluZSdzIHVwdGltZQorICAgICAgLXY6IGtlcm5lbCB2ZXJzaW9uCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hwcm9wcyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveHByb3BzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZjBkZmUKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hwcm9wcwpAQCAtMCwwICsxLDE1IEBACitTWU5PUFNJUworICAgICAgeHByb3BzIFstZnwtbV0gPG9iamVjdD4KKworREVTQ1JJUFRJT04KKyAgICAgIFByaW50cyBvdXQgYWxsIHByb3BlcnRpZXMgb2YgPG9iamVjdD4gd2hpY2ggYXJlIGN1cnJlbnRseSBkZWZpbmVkCisgICAgICBpbiAvc3lzL3Byb3BlcnRpZXMuaC4KKworT1BUSU9OUworICAgICAgLWYgIExpc3QgcHJvcGVydHkgZmxhZ3MgdmVyYm9zZQorCisgICAgICAtbSAgTGlzdCBwcm9wZXJ0eSBtZXRob2RzCisKK0VYQU1QTEUKKyAgICAgIHhwcm9wcyAkbWUKKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94c2NhbiBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveHNjYW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y3YjQ1MAotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveHNjYW4KQEAgLTAsMCArMSw3IEBACitTWU5PUFNJUworICAgICAgeHNjYW4KKworREVTQ1JJUFRJT04KKyAgICAgIFNjYW4gY3VycmVudCByb29tIGZvciBuZXRkZWFkIHBsYXllcnMgYW5kIGNoZWNrIHZhcmlhYmxlcy4KKyAgICAgIChUaGVyZSB3aWxsIGZvbGxvdyBtb3JlIGNoZWNraW5nIHJvdXRpbmVzIGxpa2Ugc25vb3AsIGludmlzIGV0Yy4gOikKKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94c2V0IGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94c2V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiN2M2NmQKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hzZXQKQEAgLTAsMCArMSwxNSBAQAorU1lOT1BTSVMKKyAgICAgIHhzZXQgWyQ8bmFtZT49PG9iamVjdD5dCisKK0RFU0NSSVBUSU9OCisgICAgICBXaXRob3V0IGFuIGFyZ3VtZW50IGFsbCBjdXJyZW50IHZhcmlhYmxlIHNldHRpbmdzIHdpbGwgYmUgc2hvd24gYW5kCisgICAgICBkZXN0cnVjdGVkIG9iamVjdHMgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IG9mIHZhcmlhYmxlcy4KKyAgICAgIFdpdGggYXJndW1lbnQgdGhlIHNwZWNpZmllZCB2YXJpYWJsZSB3aWxsIGJlIHNldC4KKworRVhBTVBMRVMKKyAgICAgIHhzZXQgJGRlZXA9ZGVlcHRob3VnaHQKKyAgICAgIHhzZXQgJHh0b29sPSRtZS54dG9vbAorICAgICAgeHNldCAkZ29kPSRkZWVwCisgICAgICB4c2V0ICRsYXN0X3Jlc3VsdD0kcmVzdWx0CisgICAgICB4c2V0ICQzPV4kMS4zCisKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveHNoIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94c2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM3Nzk5MgotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveHNoCkBAIC0wLDAgKzEsMTIgQEAKK1NZTk9QU0lTCisgICAgICB4c2ggPGZpbGVuYW1lPgorCitERVNDUklQVElPTgorICAgICAgUmVhZCBpbiBhIGZpbGUgYW5kIGV4ZWN1dGUgZWFjaCBsaW5lIG9mIGl0IGFzIGEgY29tbWFuZCBnaXZlbiBmcm9tIHRoZQorICAgICAga2V5Ym9hcmQuCisKK0VYQU1QTEUKKyAgICAgIHhzaCB+L3NldHVwLnhzaAorICAgICAgRXhlY3V0ZSB0aGUgZmlsZSAifi9zZXR1cC54c2giLiBUaGlzIHdheSB5b3UgY2FuIHNldCB1cCB5b3VyIGFsaWFzZXMgb3IKKyAgICAgIG90aGVyIHBhcmFtZXRlcnMgZm9yIG90aGVyIHRvb2xzIGlmIHRoZSBzZXR0aW5nIGdvbmUgbG9zdC4KKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94c29ydCBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveHNvcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZlYTJkYQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveHNvcnQKQEAgLTAsMCArMSwxMSBAQAorU1lOT1BTSVMKKyAgICAgIHhzb3J0IFstcl0gPGZpbGU+CisJICBvcgorCSAgeHNvcnQgWy1yXSAgICAod2hlbiByZWFkaW5nIGZyb20gYSBwaXBlKQorCitERVNDUklQVElPTgorICAgICAgeHNvcnQgc29ydCBhbGwgbGluZXMgb2YgYSBnaXZlbiBmaWxlIGluIGluY3JlYXNpbmcvZGVjcmVhc2luZyBvcmRlci4KKwkgIElmIG5vIGZpbGUgaXMgZ2l2ZW4gaXQgcmVhZHMgZnJvbSBhIHBpcGUuCisKK0VYQU1QTEVTCisgICAgICB4c29ydCAtciB3b3Jrcm9vbS5jIHNvcnRzIGFsbCBsaW5lcyBvZiB3b3Jrcm9vbS5jIGluIHJldmVyc2Ugb3JkZXIuCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3h0YWlsIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94dGFpbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGMyMzAwCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94dGFpbApAQCAtMCwwICsxLDEyIEBACitTWU5PUFNJUworICAgICAgeHRhaWwgPC18KyM+IDxmaWxlPgorCSAgb3IKKwkgIHh0YWlsIDwtfCsjPiAgICAod2hlbiByZWFkaW5nIGZyb20gYSBwaXBlKQorCitERVNDUklQVElPTgorICAgICAgeHRhaWwgcHJpbnRzIHRoZSBsYXN0IHBhcnQgb2YgYSBnaXZlbiBmaWxlOyBJdCByZWFkcyBmcm9tIGEgcGlwZQorCSAgaWYgbm8gZmlsZSBpcyBnaXZlbi4KKworRVhBTVBMRVMKKyAgICAgIHh0YWlsIC0xMCB3b3Jrcm9vbS5jIHByaW50cyB0aGUgbGFzdCAxMCBsaW5lcyBvZiB0aGUgZmlsZSB3b3Jrcm9vbS5jLgorCSAgeHRhaWwgKzEwIHdvcmtyb29tLmMgcHJpbnRzIGFsbCBsaW5lcyBvZiB3b3Jrcm9vbS5jIGJlZ2lubmluZyBhdCBsaW5lIDEwLgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94dG9vbCBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveHRvb2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJkMDYxNAotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveHRvb2wKQEAgLTAsMCArMSw0NSBAQAorU1lOT1BTSVMKKyAgICAgIHh0b29sIFt1cGRhdGV8aGVhcnQ9PG9ufG9mZj58Zmlyc3Q9PG9ufG9mZj58cHJvdGVjdD08b258b2ZmPnwKKwkgICAgIGludmNoZWNrPTxvbnxvZmY+fGVudmNoZWNrPTxvbnxvZmY+fG5kY2hlY2s9PG9ufG9mZj58CisJICAgICB2YXJjaGVjaz08b258b2ZmPnxzaG9ydD08b258b2ZmPnxlY2hvPTxvbnxvZmY+fAorCSAgICAgbW9yZT08YW1vdW50PnxraWxsfG5ld3N8c2F2ZXxsb2FkfHJlc2V0XQorCitERVNDUklQVElPTgorICAgICAgVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gc2V0IHNvbWUgdG9vbC1zcGVjaWZpYyBiZWhhdmlvdXJzLgorICAgICAgLSAidXBkYXRlIiBjbG9uZXMgYSBuZXcgWHRvb2wgYW5kIGRlc3RydWN0cyB0aGUgb2xkIG9uZS4gVGhpcyBzaG91bGQKKyAgICAgICAgb25seSBiZSBkb25lIHdoZW4gd29ya2luZyBvbiB0aGUgc291cmNlIG9mIHRoZSB0b29sIGFuZCB0byBnZXQgYSBmYXN0CisgICAgICAgIHVwZGF0ZS4gU2V0dGluZ3MgYW5kIGFsaWFzZXMgd2lsbCBiZSByZWFjaGVkIHRocm91Z2ggdGhlIG5ldyBjbG9uZS4KKyAgICAgIC0gImhlYXJ0PTxvbnxvZmY+IiB0dXJucyB0aGUgaGVhcnQgYmVhdCBvZiB0aGUgdG9vbCBvbiBvciBvZmYuCisgICAgICAgIFRoZSBoZWFydCBiZWF0IGlzIGZvciBhIGhpZ2hlciBzZWN1cml0eSBhbmQgdG8ga2VlcCB0aGUgb3RoZXIgY2hlY2tzCisgICAgICAgIHJ1bm5pbmcuIElmIHlvdSBqdXN0IHdhbnQgdG8gdXNlIHRoZSBYdG9vbCBhcyBhIHBhc3NpdmUgdG9vbCB3aXRob3V0CisgICAgICAgIGFueSBjaGVja3MgdGhlbiB0dXJuIHRoZSBoZWFydCBiZWF0IG9mZi4KKyAgICAgIC0gImZpcnN0PTxvbnxvZmY+IiB0dXJucyB0aGUgYXV0b21hdGljIG1vdmluZyBpbnRvIHRoZSBwb2xlIHBvc2l0aW9uCisgICAgICAgIG9mIHlvdXIgaW52ZW50b3J5IG9uIG9yIG9mZi4gVHVybmluZyBpdCBvZmYsIGF2b2lkcyBzdHJ1Z2dsZSB3aXRoCisgICAgICAgIG90aGVyIHRvb2xzIHdoaWNoIGJlaGF2ZSBzYW1lLCBidXQgYWxzbyByZWR1Y2VzIHNlY3VyaXR5LiBUaGUgaGlzdG9yeQorICAgICAgICBtZWNoYW5pc20gd2lsbCBhbHNvIGNhcHR1cmUgdGhlIGxlc3MgY29tbWFuZHMuCisgICAgICAtICJwcm90ZWN0PTxvbnxvZmY+IiB0dXJucyBvbi9vZmYgdGhlIHByb3RlY3Rpb24gbW9kZSBvZiB0aGUgWHRvb2wuCisgICAgICAgIEl0IHdpbGwgcHJvdGVjdCB5b3UgZnJvbSBmb3JjZXMgb2Ygb3RoZXIgd2l6YXJkcyBhbmQgb2YgcGxheWVyIG9iamVjdHMKKyAgICAgICAgd2hpY2ggdHJ5IHRvIG1vdmUgaW50byB5b3VyIGludmVudG9yeS4KKyAgICAgIC0gImludmNoZWNrPTxvbnxvZmY+IiB0dXJucyB0aGUgYXV0b21hdGljIGNoZWNrIG9mIHlvdXIgaW52ZW50b3J5IG9uIG9yCisgICAgICAgIG9mZi4gSWYgdHVybmVkIG9uLCBhbGwgbmV3IG9iamVjdHMgaW4geW91ciBpbnZlbnRvcnkgd2lsbCBiZSByZXBvcnRlZC4KKyAgICAgIC0gImVudmNoZWNrPTxvbnxvZmY+IiBsaWtlICJpbnZjaGVjayIgYnV0IGNoZWNrcyB5b3VyIGVudmlyb25tZW50LCB0aGUKKyAgICAgICAgY29udGVudCBvZiB0aGUgY3VycmVudCByb29tLgorICAgICAgLSAibmRjaGVjaz08b258b2ZmPiIgc2V0cyB0aGUgbmV0ZGVhZGNoZWNraW5nIG1vZGUgb2YgdGhlIFh0b29sLgorICAgICAgLSAic2hvcnQ9PG9ufG9mZj4iIHR1cm5zIGRpc3BsYXlpbmcgb2Ygc2hvcnQgZGVzY3JpcHRpb25zIG9uIG9yIG9mZi4KKyAgICAgICAgVGhpcyBpcyB0byBhdm9pZCB0byBnZXQgb24gb3RoZXIgd2l6YXJkcyBuZXJ2ZXMsIHdoZW4gdGhleSBoYXZlIGEgdG9vbAorICAgICAgICB0aGF0IG5vdGlmaWVzIGludmVudG9yeSBjaGVja3MgKGxpa2UgdGhpcyB0b29sIGRvZXMgOikuIEJ1dCB0aGUgbWFpbgorICAgICAgICByZWFzb24gaXMgdG8gY29wZSB3aXRoIGJhZCBzaG9ydCBkZXNjcmlwdGlvbnMgb2Ygb2JqZWN0cy4gRm9yCisgICAgICAgIGV4YW1wbGUgaWYgeW91IHdhbnQgdG8gZGVzdHJ1Y3QgaXQgYSBidWcgaW4gdGhlIHNob3J0IGRlc2MuIHdvdWxkCisgICAgICAgIG1ha2UgaXQgbmVhcmx5IGltcG9zc2libGUgdG8gZG8gc28uCisgICAgICAtICJtb3JlPTxhbW91bnQ+IiBzZXRzIHRoZSBhbW91bnQgb2YgbGluZXMgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBhdCBvbmUKKyAgICAgICAgdGltZSB3aXRoIHRoZSB4bW9yZSBjb21tYW5kLiBXaWxsIGJlIHJlbW92ZWQgc29vbiBiZWNhdXNlIHRoZXJlIGlzIGEKKyAgICAgICAgcGxheWVyIHByb3BlcnR5IGNhbGxlZCBQX1BBR0VTSVpFIHRvIHRha2UgY2FyZSBvZiBpdC4KKyAgICAgIC0gImVjaG89PG9ufG9mZj4iIHR1cm5zIHRoZSBlY2hvaW5nIG9mIGNvbW1hbmRzIGV4ZWN1dGVkIHZpYSBhbGlhcywKKyAgICAgICAgaGlzdG9yeSBvciBtdWx0aXBsZSBjb21tYW5kIGV4ZWN1dGlvbiBvbiBvciBvZmYuCisgICAgICAtICJraWxsIiBkZXN0cnVjdHMgdGhlIFh0b29sIGFuZCByZW1vdmVzIGl0IGZyb20gdGhlIGF1dG9sb2FkIGxpc3QuCisgICAgICAtICJuZXdzIiBzaG93IHRoZSBuZXdzIGFuZCBjaGFuZ2VzIG9mIHRoZSBYdG9vbC4KKyAgICAgIC0gInNhdmUiIHNhdmVzIHRoZSBzZXR0aW5ncyBvZiB0aGUgWHRvb2wgaW5jbHVkaW5nIHRoZSBhbGlhc2VzIGludG8gYQorICAgICAgICBmaWxlLgorICAgICAgLSAibG9hZCIgcmVzdG9yZXMgdGhlIHNhdmVkIHNldHRpbmdzIGZyb20gdGhlIHNhdmUgZmlsZS4KKyAgICAgIC0gInJlc2V0IiByZXNldHMgdGhlIFh0b29sLgorCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3h0cmFjZSBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveHRyYWNlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMDVlOTQKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3h0cmFjZQpAQCAtMCwwICsxLDE0IEBACitTWU5PUFNJUworICAgICAgeHRyYWNlIDxvYmplY3Q+CisKK0RFU0NSSVBUSU9OCisgICAgICBUcmFjZSBhbGwgZnVuY3Rpb24gY2FsbHMgd2l0aCBhcmd1bWVudHMgYW5kIHRoZWlyIHJldHVybiB2YWx1ZXMgb2YKKyAgICAgIHRoZSBzcGVjaWZpZWQgb2JqZWN0LiBXaXRob3V0IGFueSBhcmd1bWVudCB0dXJucyB0aGUgdHJhY2luZyBvZmYgYWdhaW4uCisKK0VYQU1QTEUKKyAgICAgIHh0cmFjZSAkbWUuYnVnZ3l0aGluZworICAgICAgTGV0cyBkZWJ1ZyBhbiBidWdneSBvYmplY3QuCisKKyAgICAgIHh0cmFjZQorICAgICAgVHVybiBkZWJ1Z2dpbmcgb2ZmLgorCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3h0cmFucyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveHRyYW5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNTZkMGEKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3h0cmFucwpAQCAtMCwwICsxLDYgQEAKK1NZTk9QU0lTCisgICAgICB4dHJhbnMgPHBsYXllcj4KKworREVTQ1JJUFRJT04KKyAgICAgIFRlbGVwb3J0IDxwbGF5ZXI+IHRvIHlvdS4KKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94dWNsb25lIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94dWNsb25lCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MWM4MjUKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3h1Y2xvbmUKQEAgLTAsMCArMSwxMyBAQAorU1lOT1BTSVMKKyAgICAgIHh1Y2xvbmUgPGZpbGVuYW1lPgorCitERVNDUklQVElPTgorICAgICAgVXBkYXRlcyAmIENsb25lcyBhbiBvYmplY3QuIE9uIGVycm9yLCB0aGUgZXJyb3IgbG9nIGZpbGUgd2lsbCBiZQorICAgICAgcHJpbnRlZC4gTW92ZXMgdGhlIG9iamVjdCAoaWYgcG9zc2libGUpIGludG8geW91ciBpbnZlbnRvcnkuIElmIHRoZQorICAgICAgb2JqZWN0IGhhcyBiZWVuIGNsb25lZCBzdWNjZXNzZnVsbHksIHRoZSB2YXJpYWJsZSAiJGNsb25lIiB3aWxsIGJlIHNldCwKKyAgICAgIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBsb3NlIHRoZSBvYmplY3Qgb3V0IG9mIHNpZ2h0IDopCisKK0VYQU1QTEUKKyAgICAgIHh1Y2xvbmUgL3N0ZC90aGluZworICAgICAgeGNhbGwgJGNsb25lLT5TZXRTaG9ydCgiYSBCSUcgdGhpbmchIik7CisKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveHVwZGF0ZSBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveHVwZGF0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWI2NTY3Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94dXBkYXRlCkBAIC0wLDAgKzEsMTAgQEAKK1NZTk9QU0lTCisgICAgICB4dXBkYXRlIDxmaWxlbmFtZT4KKworREVTQ1JJUFRJT04KKyAgICAgVXBkYXRlIGFuIG9iamVjdCBieSBmaXJzdCBjYWxsaW5nIHRoZSBsZnVuICJyZW1vdmUoKSIgb2YgaXQgYW5kIHdoZW4KKyAgICAgaXQgc3RpbGwgZXhpc3RzIGRlc3RydWN0IGl0LgorCitFWEFNUExFCisgICAgIHh1cGRhdGUgb2JqL2JsdWIuYworCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3h3YyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveHdjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMTMxNDcKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3h3YwpAQCAtMCwwICsxLDIyIEBACitTWU5PUFNJUworICAgICAgeHdjIFstY2x3XSA8ZmlsZT4KKwkgIG9yCisJICB4d2MgWy1jbHddICAgICh3aGVuIHJlYWRpbmcgZnJvbSBhIHBpcGUpCisKK0RFU0NSSVBUSU9OCisgICAgICB4d2MgY291bnRzIHRoZSBudW1iZXIgb2YgYnl0ZXMsIHdoaXRlc3BhY2Utc2VwYXJhdGVkIHdvcmRzLCBhbmQgbmV3LQorICAgICAgbGluZXMgaW4gYSBnaXZlbiBmaWxlLCBvciByZWFkaW5nIGZyb20gYSBwaXBlLiBJdCBwcmludHMgb25lIGxpbmUKKyAgICAgIG9mIGNvdW50cywgYW5kIGlmIHRoZSBmaWxlIG5hbWUgd2FzIGdpdmVuIGFzIGFuIGFyZ3VtZW50LCBpdCBwcmludHMKKyAgICAgIHRoZSBmaWxlbmFtZSBmb2xsb3dpbmcgdGhlIGNvdW50cy4gVGhlIGNvdW50cyBhcmUgcHJpbnRlZCBpbiB0aGUKKyAgICAgIG9yZGVyOiBsaW5lcywgd29yZHMsIGJ5dGVzLgorICAgICAgQnkgZGVmYXVsdCwgd2MgcHJpbnRzIGFsbCB0aHJlZSBjb3VudHMuCisKK09QVElPTlM6CisgICAgICAtYyBwcmludCBjaGFyYWN0ZXIgY291bnQKKworICAgICAgLWwgcHJpbnQgbGluZSBjb3VudAorCisgICAgICAtdyBwcmludCB3b3JkIGNvdW50CisgICAgICAKK0VYQU1QTEVTCisKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveHdobyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveHdobwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTlmYmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94d2hvCkBAIC0wLDAgKzEsMTcgQEAKK1NZTk9QU0lTCisgICAgICB4d2hvIFttYWlsfGlwfHJhY2V8Z3VpbGR8ZG9tYWlufHN0YXRzfGNtZGF2Z10KKworREVTQ1JJUFRJT04KKyAgICAgIFdpdGhvdXQgYW55IGFyZ3VtZW50IHRoaXMgY29tbWFuZCBiZWhhdmVzIGxpa2UgdGhlIG5vcm1hbCBwZW9wbGUKKyAgICAgIGNvbW1hbmQuIFdpdGggdGhlIGFyZ3VtZW50ICJtYWlsIiBpdCB3aWxsIGxpc3QgYWxsIHBsYXllcnMgd2l0aCB0aGVpcgorICAgICAgZW1haWwgYWRkcmVzcy4gV2l0aCB0aGUgYXJndW1lbnQgImlwIiBpdCB3aWxsIGxpc3QgYWxsIHBsYXllcnMgd2l0aAorICAgICAgdGhlaXIgaG9zdCBuYW1lIGFuZCBpcCBudW1iZXIuIElmIHRoZSBhcmd1bWVudCBpcyAicmFjZSIgb3IgImd1aWxkIgorICAgICAgeW91IHdpbGwgZ2V0IGEgbGlzdCBvZiBhbGwgcGxheWVycyB3aXRoIHRoZXNlIGF0dHJpYnV0ZXMuICJkb21haW4iCisgICAgICB3aWxsIHNob3cgdGhlIGRvbWFpbihzKSBvZiB0aGUgY3VycmVudCBwbGF5ZXJzLiBBbmQgd2l0aCAic3RhdHMiIGl0CisgICAgICB3aWxsIHByaW50IHNvbWUgc3RhdHMgaW5mb3JtYXRpb24gb2YgYWxsIHBsYXllcnMuCisgICAgICBUaGUgYXJndW1lbnQgImNtZGF2ZyIgbGlzdCB0aGUgdmFsdWUgb2YgX3F1ZXJ5X2NvbW1hbmRfYXZlcmFnZSgpCisgICAgICBmb3IgZXZlcnkgdXNlciBzb3J0ZWQgaW4gaW5jcmVhc2luZyBvcmRlci4KKworRVhBTVBMRVMKKyAgICAgIHh3aG8KKyAgICAgIHh3aG8gaXAKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvcHJvYy9jcHVpbmZvIGIvb2JqL3Rvb2xzL01HdG9vbC9wcm9jL2NwdWluZm8KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNGFlN2Q3ZQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvcHJvYy9jcHVpbmZvCkBAIC0wLDAgKzEgQEAKKy9wcm9jL2NwdWluZm8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL3Byb2MvbG9hZGF2ZyBiL29iai90b29scy9NR3Rvb2wvcHJvYy9sb2FkYXZnCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmU2OTgzZjQKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL3Byb2MvbG9hZGF2ZwpAQCAtMCwwICsxIEBACisvcHJvYy9sb2FkYXZnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9wcm9jL21lbWluZm8gYi9vYmovdG9vbHMvTUd0b29sL3Byb2MvbWVtaW5mbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4zMzhiNTcwCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9wcm9jL21lbWluZm8KQEAgLTAsMCArMSBAQAorL3Byb2MvbWVtaW5mbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvcHJvYy91cHRpbWUgYi9vYmovdG9vbHMvTUd0b29sL3Byb2MvdXB0aW1lCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjI3NzJhOGYKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL3Byb2MvdXB0aW1lCkBAIC0wLDAgKzEgQEAKKy9wcm9jL3VwdGltZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvcHJvYy92ZXJzaW9uIGIvb2JqL3Rvb2xzL01HdG9vbC9wcm9jL3ZlcnNpb24KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYjE3YWYxZQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvcHJvYy92ZXJzaW9uCkBAIC0wLDAgKzEgQEAKKy9wcm9jL3ZlcnNpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL3Byb2YuaCBiL29iai90b29scy9NR3Rvb2wvcHJvZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZGNlYmYKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL3Byb2YuaApAQCAtMCwwICsxLDQyIEBACitwcml2YXRlIG1peGVkIF9fdG1fXz0oezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0pOworcHJpdmF0ZSBtaXhlZCBfX3h0bV9fPSh7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSk7Citwcml2YXRlIG1peGVkICBfX2VjX189KHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9KTsKK3ByaXZhdGUgbWl4ZWQgIF9feGVjX189KHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9KTsKK3ByaXZhdGUgaW50IF9fbGV2ZWxfXzsKK3ByaXZhdGUgbWFwcGluZyBfX2RhdGFfXyA9IChbXSk7CitfX3F1ZXJ5X3hwcm9mX2RhdGFfXygpIHsgcmV0dXJuIF9fZGF0YV9fOyB9CisjZGVmaW5lIFUyVChydSkgKCgocnUpWzBdKyhydSlbMV0pKjEwKQorI2RlZmluZSBFQzEgNDAKKyNkZWZpbmUgRUMyIDIyCisjZGVmaW5lIEVDMyAxNTAKKyNkZWZpbmUgVE0xIDAKKyNkZWZpbmUgVE0yIDAKKyNkZWZpbmUgVE0zIDAKKyNkZWZpbmUgRihmdW5jLG5hbWUsYXJncykgZnVuYyBhcmdzIHsgXAorICBtaXhlZCAqX19kdF9fLCAqX19ydV9fLCBfX3JlX187IFwKKyAgaW50IF9fdF9fOyBcCisgIGlmKCFfX2RhdGFfXykgcmV0dXJuIDo6IGZ1bmMgYXJnczsgXAorICBfX3J1X189cnVzYWdlKCk7IFwKKyAgX190bV9fW19fbGV2ZWxfX109KF9fdF9fPVUyVChfX3J1X18pKTwwPzA6X190X187IFwKKyAgX194dG1fX1tfX2xldmVsX19dPVRNMTsgX190bV9fW19fbGV2ZWxfXysxXT0wOyBcCisgIF9fZWNfX1tfX2xldmVsX19dPWdldF9ldmFsX2Nvc3QoKTsgXAorICBfX3hlY19fW19fbGV2ZWxfX109RUMxOyBfX2VjX19bX19sZXZlbF9fKzFdPTA7IFwKKyAgX19sZXZlbF9fKys7IF9fcmVfXyA9IDo6IGZ1bmMgYXJnczsgX19sZXZlbF9fLS07IFwKKyAgaWYoIShfX2R0X189X19kYXRhX19bbmFtZV0pKSB7IFwKKyAgICBfX2R0X189X19kYXRhX19bbmFtZV09KHswLDAsMCwwLDB9KTsgXAorICAgIF9feHRtX19bX19sZXZlbF9fXSs9VE0yOyBfX3hlY19fW19fbGV2ZWxfX10rPUVDMjsgXAorICB9IFwKKyAgX19lY19fW19fbGV2ZWxfX10tPWdldF9ldmFsX2Nvc3QoKStfX3hlY19fW19fbGV2ZWxfX107IFwKKyAgX19ydV9fPXJ1c2FnZSgpOyBcCisgIF9fdF9fPShfX3RfXz1VMlQoX19ydV9fKSk8MD8wOl9fdF9fOyBcCisgIF9fdG1fX1tfX2xldmVsX19dPV9fdF9fLV9fdG1fX1tfX2xldmVsX19dLV9feHRtX19bX19sZXZlbF9fXTsgXAorICBfX2R0X19bMF0rKzsgXAorICBfX2R0X19bMV0rPV9fZWNfX1tfX2xldmVsX19dLV9fZWNfX1tfX2xldmVsX18rMV07IFwKKyAgX19kdF9fWzJdKz1fX3RtX19bX19sZXZlbF9fXS1fX3RtX19bX19sZXZlbF9fKzFdOyBcCisgIF9fZHRfX1szXSs9X19lY19fW19fbGV2ZWxfX107IF9fZHRfX1s0XSs9X190bV9fW19fbGV2ZWxfX107IFwKKyAgaWYoX19sZXZlbF9fPjApIHsgXAorICAgIF9feGVjX19bX19sZXZlbF9fLTFdKz1fX3hlY19fW19fbGV2ZWxfX10rRUMzOyBcCisgICAgX194dG1fX1tfX2xldmVsX18tMV0rPV9feHRtX19bX19sZXZlbF9fXStUTTM7IFwKKyAgfSBcCisgIHJldHVybiBfX3JlX187IFwKK30KZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvdG9vbC5kb2MgYi9vYmovdG9vbHMvTUd0b29sL3Rvb2wuZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNDc3Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL3Rvb2wuZG9jCkBAIC0wLDAgKzEsMTAxIEBACitDT01NQU5EUzoKKyAgICB4Y2FsbCAgICAgIHhkZGVzICAgICAgeGZvcmFsbCAgICB4aWRzICAgICAgIHhtYW4gICAgICAgeHNjYW4gICAgICB4dHJhY2UKKyAgICB4Y2FsbG91dHMgIHhkZXMgICAgICAgeGdvdG8gICAgICB4aW5oZXJpdCAgIHhtb3JlICAgICAgeHNldCAgICAgICB4dHJhbnMKKyAgICB4Y2xlYW4gICAgIHhkbG9vayAgICAgeGdyZXAgICAgICB4bGFnICAgICAgIHhtb3ZlICAgICAgeHNoICAgICAgICB4dWNsb25lCisgICAgeGNsb25lICAgICB4ZG8gICAgICAgIHhoYmVhdHMgICAgeGxvYWQgICAgICB4bXNnICAgICAgIHhzb3J0ICAgICAgeHVwZGF0ZQorICAgIHhkYmcgICAgICAgeGR1cGRhdGUgICB4aGVhZCAgICAgIHhsb29rICAgICAgeG10cCAgICAgICB4dGFpbCAgICAgIHh3YworICAgIHhkY2xlYW4gICAgeGV2YWwgICAgICB4aGVscCAgICAgIHhscGMgICAgICAgeHByb3BzICAgICB4dG9vbCAgICAgIHh3aG8KKworCitHaXZlIGEgIj8iIGFzIHNpbmdsZSBhcmd1bWVudCB0byBnZXQgdGhlIGNvbW1hbmQgdXNhZ2Ugb3IgZG8gInhtYW4gPGNvbW1hbmQ+IgorZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgYSBjb21tYW5kLgorCitRVUlDS1RZUEVSOgorICAgVGhlIE1HdG9vbCBjb250YWlucyBhIGZ1bGwgcXVpY2t0eXBpbmcgdG9vbC4gSXQgcHJvdmlkZXMgdGhlIGZvbGxvd2luZworICAgZmVhdHVyZXM6CisKKyAgICAgIC0gbXVsdGlwbGUgY29tbWFuZCBleGVjdXRpb24gKHNlZSB0aGUgeGRvIGFuZCB4Zm9yYWxsIGNvbW1hbmQpCisgICAgICAtIHNjcmlwdCBmaWxlcyAgICAgICAgICAgICAgIChzZWUgdGhlIHhzaCBjb21tYW5kKQorICAgICAgLSBjb21tYW5kIHBpcGVsaW5pbmcKKyAgICAgIC0gY29tbWFuZCBoaXN0b3J5CisKKyAgIFRoZSBjb21tYW5kIGhpc3Rvcnkgc3RvcmVzIChuZWFybHkpIGVhY2ggY29tbWFuZCB5b3UgdHlwZSBpbiBhbmQgbGV0cyB5b3UKKyAgIHJlLWV4ZWN1dGUgaXQuCisKKyAgICAgIC0gJSEgICAgICAgIHNob3cgdGhlIGNvbW1hbmQgaGlzdG9yeQorICAgICAgLSAlJSAgICAgICAgcmUtZXhlY3V0ZSB0aGUgbGFzdCBjb21tYW5kCisgICAgICAtIF5vbGRebmV3ICByZS1leGVjdXRlIHRoZSBsYXN0IGNvbW1hbmQgYnV0IHJlcGxhY2UgYWxsIG9jY3VyZW5jaWVzIG9mCisgICAgICAgICAgICAgICAgICB0aGUgIm9sZCIgc3RyaW5nIG9mIHRoZSBjb21tYW5kIGJ5ICJuZXciLgorICAgICAgLSAlbnVtICAgICAgcmUtZXhlY3V0ZSB0aGUgY29tbWFuZCBhdCBwb3NpdGlvbiBudW0gb2YgdGhlIGhpc3RvcnkKKyAgICAgIC0gJXN0ciAgICAgIHJlLWV4ZWN1dGUgdGhlIGxhc3QgY29tbWFuZCBiZWdpbm5pbmcgd2l0aCB0aGUgc3RyaW5nICJzdHIiCisKKworQ09NTUFORCBBUkdVTUVOVFM6CisgICBNb3N0IGNvbW1hbmRzIG5lZWQgZmlsZW5hbWVzIG9yIG9iamVjdHMgYXMgYXJndW1lbnQuIFRoZSB3YXkgb2JqZWN0cyBhcmUKKyAgIHNwZWNpZmllZCB3aWxsIGJlIGRlc2NyaXBlZCBpbiB0aGUgZm9sbG93aW5nLgorCisgICAgICAtIGFuIG9iamVjdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgYnkgaXRzIHVuaXF1ZSBvYmplY3QgbmFtZQorICAgICAgLSBhIHBsYXllciBjYW4gYmUgYWNjZXNzZWQgYnkgaXRzIHBsYXllciBuYW1lCisgICAgICAtIGEgbGl2aW5nIGNhbiBiZSBhY2Nlc3NlZCBieSBpdHMgbGl2aW5nIG5hbWUKKyAgICAgIC0gYSBvYmplY3QgaW5zaWRlIHRoZSBjdXJyZW50IHJvb20gYnkgaXRzIGlkCisgICAgICAtIGEgb2JqZWN0IGluc2lkZSB0aGUgY3VycmVudCByb29tIGJ5IGl0cyBwb3NpdGlvbgorCisgICBJZiB0aGUgb2JqZWN0IGNhbiBub3QgYmUgYWNjZXNzZWQgYnkgdGhlIGFib3ZlIG1lbnRpb25lZCB3YXlzIHlvdSBjYW4gYWxzbworICAgdXNlIHRoZSBmb2xsb3dpbmcgb2JqZWN0IG1vZGlmaWVyczoKKworICAgICAgXm9iaiAgICAgICAgIHN0YW5kcyBmb3IgdGhlIGVudmlyb25tZW50IG9mIGFuIG9iamVjdAorICAgICAgb2JqMS5vYmoyICAgIHN0YW5kcyBmb3IgYW4gb2JqZWN0IG9iajIgaW5zaWRlIGFub3RoZXIgb2JqZWN0IG9iajEKKyAgICAgIAorICBUaGVzZSBtb2RpZmllcnMgY2FuIGJlIGNvbmNhdGVuYXRlZCB0b2dldGhlciB3aGVyZSB0aGUgIl4iIGhhcyBhIGhpZ2hlcgorICBwcmlvcml0eSB0aGFuIHRoZSAiLiIuIFRoaXMgYWxsb3dzIHlvdSB0byBhY2Nlc3MgYW4gb2JqZWN0IGZyb20gYW5vdGhlciBrbm93CisgIG9iamVjdC4KKworICBOb3cgc29tZSBleGFtcGxlcyB3aGljaCBkZW1vbnN0cmF0ZXMgaG93IHRvIHVzZSB0aGlzIGFjY2Vzc2luZyBtZWNoYW5pc20uCisgIFRoZXJlZm9yZSB3ZSB1c2UgdGhlIGNvbW1hbmQgInhsb29rIiB3aGljaCBwcmludHMgdGhlIHNob3J0IGFuZCBsb25nCisgIGRlc2NyaXB0aW9uIGFuZCBhbHNvIHRoZSBjb250ZW50IG9mIGFuIG9iamVjdDoKKworICAgMS4geGxvb2sgZGVlcHRob3VnaHQKKyAgICAgIExvb2sgYXQgRGVlcHRob3VnaHQuCisgICAyLiB4bG9vayBeZGVlcHRob3VnaHQKKyAgICAgIExvb2sgYXQgdGhlIHJvb20gRGVlcHRob3VnaHQgaXMgaW4uCisgICAzLiB4bG9vayBkZWVwdGhvdWdodC5iYWcKKyAgICAgIExvb2sgYXQgdGhlIGJhZyBvZiBEZWVwdGhvdWdodC4KKyAgIDQuIHhsb29rIGRlZXB0aG91Z2h0LmJhZy5iYWcKKyAgICAgIExvb2sgYXQgdGhlIGJhZyBpbnNpZGUgRGVlcHMgYmFnLgorICAgNC4geGxvb2sgZGVlcHRob3VnaHQuNQorICAgICAgTG9vayBhdCB0aGUgZmlmdGggb2JqZWN0IG9mIERlZXBzIGludmVudG9yeS4KKyAgIDUuIHhsb29rIC9zdGQvdGhpbmcjMTIzCisgICAgICBMb29rIGF0IHRoZSBvYmplY3Qgd2l0aCB0aGUgdW5pcXVlIG9iamVjdCBuYW1lICIvc3RkL3RoaW5nIzEyMyIuCisgICA2LiB4bG9vayAxCisgICAgICBMb29rIGF0IHRoZSBmaXJzdCBvYmplY3QgaW4gdGhlIGN1cnJlbnQgcm9vbS4KKyAgIDcuIHhsb29rIDEuMi4zCisgICAgICBMb29rIGF0IHRoZSB0aGlyZCBvZiB0aGUgc2Vjb25kIG9mIHRoZSBmaXJzdCBvYmplY3QgaW4gdGhlIHJvb20uCisKKyAgSWYgdGhlIG5hbWUgb2YgYW4gb2JqZWN0IGNvbnRhaW5zIGFuIG9iamVjdCBtb2RpZmllciBhcyBhIGNoYXJhY3RlciB0aGVuIGl0CisgIGNhbiBiZSBlc2NhcGVkIGJ5IGEgIlwiLiBBICJcIiBpcyBlc2NhcGVkIGJ5IGl0c2VsZi4gVGhpcyBpcyBiZWNhdXNlIGZpbGUKKyAgbmFtZXMgb2Z0ZW4gY29udGFpbiB0aGUgIi4iIGZvciBmaWxlIGV4dGVuc2lvbnMuIFNvIGlmIHlvdSB3YW50IHRvIGFjY2VzcworICBkaXJlY3RseSBhbiBvYmplY3Qgd2l0aCBmb3IgZXhhbXBsZSBzdWNoIGEgbmFtZSAiZmlsZS5vbGQuYnVsYiIgeW91IGhhdmUgdG8KKyAgd3JpdGUgImZpbGVcLm9sZFwuYmx1YiIuCisgICAgCisgIElmIGEgY29tbWFuZCBuZWVkcyBhIGZpbGUgYXMgYXJndW1lbnQgeW91IGNhbiB1c2UgdGhlIGZpbGVuYW1lIG9mIGFuIG9iamVjdAorICBmb3IgaXQgYnkgcGxhY2luZyBhbiAiQCIgaW5mcm9udCBvZiB0aGUgb2JqZWN0LiBUaGlzIHdheSB5b3UgY2FuIGNsb25lCisgIGFuIG9iamVjdCBieSB1c2luZyBhbm90aGVyIGNsb25lOgorCisgICAgIHhjbG9uZSBAaGFycnkuYmFnLmNhbmRsZXMKKyAgICAgQ2xvbmUgc29tZSBjYW5kbGVzIG9mIHRoZSBraW5kIEhhcnJ5IGlzIGNhcnJ5aW5nIGluIGhpcyBiYWcuCisKKworQVJHVU1FTlQgVkFSSUFCTEVTOgorICAgV2hlbmV2ZXIgYW4gb2JqZWN0IG9yIGEgZmlsZW5hbWUgaXMgbmVlZGVkLCB3ZSBjYW4gdXNlIHZhcmlhYmxlcy4KKyAgIEEgdmFyaWFibGUgYWxsd2F5cyBzdGFydHMgd2l0aCBhICIkIiBmb2xsb3dlZCBieSB0aGUgbmFtZSB3aGljaAorICAgaWRlbnRpZmljYXRlcyBpdC4gVHdvIHZhcmlhYmxlIG5hbWVzIGFyZSByZXNlcnZlZCBmb3Igc3BlY2lhbCBwdXJwb3NlLgorICAgVGhlIGZpcnN0LCAiJG1lIiBpcyBhbHdheXMgc2V0IHRvIHRoZSBvbmUgd2hvIG93bnMgdGhlIFh0b29sLiBUaGUgb3RoZXIsCisgICAiJGhlcmUiIHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgcm9vbS4KKworICAgKEluc3RlYWQgb2YgIiRtZSIgYW5kICIkaGVyZSIgeW91IGNhbiBhbHNvIHVzZSAiJG0iIGFuZCAiJGgiLikKKworICAgSWYgYSBjb21tYW5kIG5lZWRzIGEgZmlsZSBhcyBhcmd1bWVudCBhbmQgZ2V0cyBhIHZhcmlhYmxlIGl0IHdpbGwgYmUKKyAgIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIGludG8gdGhlIHNvdXJjZSBmaWxlIG9mIHRoZSBvYmplY3QuCisgICAoVGhpcyBpcyBkb25lIGJ5IHRha2luZyB0aGUgdW5pcXVlIG9iamVjdCBpZGVudGlmaWVyIGFuZCByZXBsYWNpbmcgdGhlCisgICAiIy4uLiIgYnkgYSAiLmMiLikKKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC90b29sLmggYi9vYmovdG9vbHMvTUd0b29sL3Rvb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWZmMjNkCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC90b29sLmgKQEAgLTAsMCArMSwyNDYgQEAKKyNpZm5kZWYgX19UT09MX0hfXworI2RlZmluZSBfX1RPT0xfSF9fCisKKy8qCisgKiBNR3Rvb2wtMS4zCisgKiBGaWxlOiB0b29sLmgKKyAqIE1haW50YWluZXI6IEtpcmtATW9yZ2VuR3JhdWVuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogdGhlIG9yaWdpbmFsIFh0b29sIGlzIGNvcHlyaWdodGVkIGJ5IEh5cCAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIE1BU1RFUgorI2RlZmluZSBNQVNURVIgX19NQVNURVJfT0JKRUNUX18KKyNlbmRpZgorCisjZGVmaW5lIFZPSUQgIi9yb29tL3ZvaWQiCisKKyNkZWZpbmUgTlVMTCAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBGQUxTRSAgICAgICAgICAgICAgKDApCisjZGVmaW5lIFRSVUUgICAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgRVJST1IgICAgICAgICAgICAgICgtMSkKKyNkZWZpbmUgUFJFViAgICAgICAgICAgICAgIHByZXZpb3VzX29iamVjdCgpCisjZGVmaW5lIFRQICAgICAgICAgICAgICAgICBlZnVuOjp0aGlzX3BsYXllcigpCisjZGVmaW5lIFJUUCAgICAgICAgICAgICAgICBlZnVuOjp0aGlzX2ludGVyYWN0aXZlKCkKKyNkZWZpbmUgVE9PTF9OQU1FICAgICAgICAgICJNR3Rvb2wiCisjZGVmaW5lIFRPT0xfVkVSU0lPTiAgICAgICAiMS4zLjMiCisjZGVmaW5lIFRPT0xfVElUTEUgICAgICAgICBUT09MX05BTUUrIiB2IitUT09MX1ZFUlNJT04KKyNkZWZpbmUgVE9PTF9JTlRFUk5BTCAgICAgICIxLjMuMy0xMC4wNy45NyIKKworI2RlZmluZSBUT09MX1BBVEggICAgICAgICAgIi9vYmovdG9vbHMvTUd0b29sIgorCisjZGVmaW5lIFRPT0xfTUFOUEFHRSAgICAgICBUT09MX1BBVEgrIi90b29sLmRvYyIKKyNkZWZpbmUgVE9PTF9ORVdTICAgICAgICAgIFRPT0xfUEFUSCsiL3Rvb2wubmV3cyIKKyNkZWZpbmUgVE9PTF9MT0cgICAgICAgICAgICIvbG9nL3h0b29sIgorI2RlZmluZSBYUFJPRl9NQUNSTyAgICAgICAgVE9PTF9QQVRIKyIvcHJvZi5oIgorI2RlZmluZSBMQUdfT19EQUVNT04gICAgICAgIi9wL2RhZW1vbi9sYWctby1kYWVtb24iCisKKyNkZWZpbmUgVE9PTF9MRVZFTCAgICAgICAgICg0MCkKKworI2RlZmluZSBNT1JFX0xJTkVTICAgICAgICAgKDIwKQorI2RlZmluZSBNQVhfSElTVE9SWSAgICAgICAgKDI1KQorI2RlZmluZSBNQVhfUkVDVVJTSU9OICAgICAgKDYpCisjZGVmaW5lIFRSQUNFX0xFVkVMICAgICAgICAoMXwyfDR8OCkKKyNkZWZpbmUgQVVUT0xPQURfQVJHUyAgICAgICh7VE9PTF9JTlRFUk5BTCwgbW9kaSwgbW9yZWxpbmVzfSkKKyNkZWZpbmUgRVhFQ19MSU5FUyAgICAgICAgICgxMCkKKyNkZWZpbmUgRVhFQ19USU1FICAgICAgICAgICgxKQorCisjZGVmaW5lIElBKHgpICAgICAgICAgICAgICBpbnRlcmFjdGl2ZSh4KQorI2RlZmluZSBFTlYoeCkgICAgICAgICAgICAgZW52aXJvbm1lbnQoeCkKKyNkZWZpbmUgTE9XRVIoeCkgICAgICAgICAgIGxvd2VyX2Nhc2UoeCkKKyNkZWZpbmUgTkFNRSh4KSAgICAgICAgICAgICgoc3RyaW5nKXgtPnF1ZXJ5X25hbWUoKSkKKyNkZWZpbmUgQ05BTUUoeCkgICAgICAgICAgIENBUCgoc3RyaW5nKU5BTUUoeCkpCisKKyNkZWZpbmUgUk5BTUUoeCkgICAgICAgICAgIGdldHVpZCh4KQorI2RlZmluZSBDUk5BTUUoeCkgICAgICAgICAgQ0FQKFJOQU1FKHgpKQorCisjZGVmaW5lIExFVkVMKHgpICAgICAgICAgICBxdWVyeV93aXpfbGV2ZWwoeCkKKworI2RlZmluZSBGT1JBTEwoeCwgeSkgICAgICAgZm9yKHg9Zmlyc3RfaW52ZW50b3J5KHkpO3g7eD1uZXh0X2ludmVudG9yeSh4KSkKKyNkZWZpbmUgREVTVFJVQ1QoeCkgICAgICAgIERlc3RydWN0KHgpCisjZGVmaW5lIEFMRUZUKHgseSx6KSAgICAgICBzcHJpbnRmKCIlLSonIit6KyIncyIsIHksICgiIisoeCkpWzAuLnktMV0pCisjZGVmaW5lIEFSSUdIVCh4LHkseikgICAgICBzcHJpbnRmKCIlKiciK3orIidzIiAsIHksICgiIisoeCkpWzAuLnktMV0pCisjZGVmaW5lIFcoeCkgICAgICAgICAgICAgICBXcml0ZSh4KQorI2RlZmluZSBXTE4oeCkgICAgICAgICAgICAgVyh4KyJcbiIpCisjZGVmaW5lIFdETE4oeCkgICAgICAgICAgICBXKHgrIi5cbiIpCisKKyNkZWZpbmUgTU9ERV9PTih4KSAgICAgICAgIChtb2RpfD14KQorI2RlZmluZSBNT0RFX09GRih4KSAgICAgICAgKG1vZGkmPX54KQorI2RlZmluZSBNT0RFKHgpICAgICAgICAgICAgKG1vZGkmeCkKKyNkZWZpbmUgTU9ERV9IRUFSVCAgICAgICAgICgxKQorI2RlZmluZSBNT0RFX0ZJUlNUICAgICAgICAgKDIpCisjZGVmaW5lIE1PREVfUFJPVEVDVCAgICAgICAoNCkKKyNkZWZpbmUgTU9ERV9JTlZDSEVDSyAgICAgICg4KQorI2RlZmluZSBNT0RFX0VOVkNIRUNLICAgICAgKDE2KQorI2RlZmluZSBNT0RFX05EQ0hFQ0sgICAgICAgKDMyKQorI2RlZmluZSBNT0RFX1ZBUkNIRUNLICAgICAgKDY0KQorI2RlZmluZSBNT0RFX0VDSE8gICAgICAgICAgKDEyOCkKKyNkZWZpbmUgTU9ERV9TSE9SVCAgICAgICAgICgyNTYpCisjZGVmaW5lIE1PREVfU05PT1BDSEsgICAgICAoNTEyKQorI2RlZmluZSBNT0RFX0lOVklTQ0hLICAgICAgKDEwMjQpCisjZGVmaW5lIE1PREVfU0NBTkNISyAgICAgICAoMjA0OCkKKworI2RlZmluZSBFUlJfRklMRSAgICAgICAgICAgIi9wbGF5ZXJzLyIrUk5BTUUoY2xvbmVyKSsiLy5lcnIiCisjZGVmaW5lIExQQ19GSUxFICAgICAgICAgICAiL3BsYXllcnMvIitSTkFNRShjbG9uZXIpKyIvLnRvb2wubHBjIgorI2RlZmluZSBUTVBfRklMRSAgICAgICAgICAgIi9wbGF5ZXJzLyIrUk5BTUUoY2xvbmVyKSsiLy50b29sLnRtcCIKKyNkZWZpbmUgU0FWRV9GSUxFICAgICAgICAgICIvcGxheWVycy8iK1JOQU1FKGNsb25lcikrIi8udG9vbHJjIgorI2RlZmluZSBYUFJPRl9GSUxFICAgICAgICAgIi9wbGF5ZXJzLyIrUk5BTUUoY2xvbmVyKSsiL3Byb2YuYyIKKyNkZWZpbmUgUElQRV9GSUxFICAgICAgICAgICIvcGxheWVycy8iK1JOQU1FKGNsb25lcikrIi8udG9vbC5waXBlIgorI2RlZmluZSBQUklWQVRFX0hFQURFUiAgICAgIi9wbGF5ZXJzLyIrUk5BTUUoY2xvbmVyKSsiLy54dG9vbC5oIgorI2RlZmluZSBQSVBFX0RFTEVURSh4KSAgICAgaWYocGlwZV9vdXQmJnBpcGVfb3ZyJiZmaWxlX3NpemUoeCk+PTApIHJtKHgpCisKKyNkZWZpbmUgUElQRV9JTiAgICAgICAgICAgIDEKKyNkZWZpbmUgUElQRV9PVVQgICAgICAgICAgIDIKKyNkZWZpbmUgUElQRV9NQVggICAgICAgICAgIDEwMDAwCisKKyNkZWZpbmUgWEdSRVBfUkVWRVJUICAgICAgIDEKKyNkZWZpbmUgWEdSRVBfSUNBU0UgICAgICAgIDIKKworI2RlZmluZSBTRUNVUkUxKCkgICAgaWYoIXNlY3VyaXR5KCkpIHJldHVybjsKKyNkZWZpbmUgU0VDVVJFMih4KSAgIGlmKCFzZWN1cml0eSgpKSByZXR1cm4geDsKKyNkZWZpbmUgVVNBR0UxKHgseSkgIG5vdGlmeV9mYWlsKCJVc2FnZTogIisoeSkrIlxuIik7XAorICAgICAgICAgICAgICAgICAgICAgaWYoKHgpPT0iPyIpIHJldHVybiBGQUxTRTsKKyNkZWZpbmUgVVNBR0UyKHgseSkgIG5vdGlmeV9mYWlsKCJVc2FnZTogIisoeSkrIlxuIik7XAorICAgICAgICAgICAgICAgICAgICAgaWYoKCEoeCkpfHwoKHgpPT0iPyIpKSByZXR1cm4gRkFMU0U7CisjZGVmaW5lIFVTQUdFMyh4KSAgICByZXR1cm4gV0xOKCJVc2FnZTogIisoeCkpCisKK3N0YXRpYyBpbnQgQ2F0RmlsZSgpOworc3RhdGljIGludCBDb21tYW5kKHN0cmluZyBzdHIpOworaW50IENvbW1hbmRTY2FuKHN0cmluZyBhcmcpOworaW50IERvQWxpYXMoc3RyaW5nIHZlcmIsIHN0cmluZyBhcmcpOworaW50IERvSGlzdG9yeShzdHJpbmcgbGluZSk7CitzdGF0aWMgaW50IE1vdmVPYmoob2JqZWN0IG9iajEsIG9iamVjdCBvYmoyLCBpbnQgc2lsZW50KTsKK3N0YXRpYyBpbnQgWEdyZXBGaWxlKHN0cmluZyBwYXQsIHN0cmluZyBmaWxlLCBpbnQgcmV2ZXJ0KTsKK2ludCBYY2FsbChzdHJpbmcgc3RyKTsKK2ludCBYY2FsbG91dHMoc3RyaW5nIHN0cik7CitpbnQgWGNhdChzdHJpbmcgc3RyKTsKK2ludCBYY2luZGVudChzdHJpbmcgc3RyKTsKK2ludCBYY2xlYW4oc3RyaW5nIHN0cik7CitpbnQgWGNsb25lKHN0cmluZyBzdHIpOworaW50IFh1Y2xvbmUoc3RyaW5nIHN0cik7CitpbnQgWGNtZHMoc3RyaW5nIHN0cik7CitpbnQgWGRhdGUoc3RyaW5nIHN0cik7CitpbnQgWGRiZyhzdHJpbmcgc3RyKTsKK2ludCBYZGNsZWFuKHN0cmluZyBzdHIpOworaW50IFhkZGVzKHN0cmluZyBzdHIpOworaW50IFhkZXMoc3RyaW5nIHN0cik7CitpbnQgWGRsb29rKHN0cmluZyBzdHIpOworaW50IFhkbyhzdHJpbmcgc3RyKTsKK2ludCBYZHVwZGF0ZShzdHJpbmcgc3RyKTsKK2ludCBYZWNobyhzdHJpbmcgc3RyKTsKK2ludCBYZXZhbChzdHJpbmcgc3RyKTsKK2ludCBYZm9yYWxsKHN0cmluZyBzdHIpOworaW50IFhnb3RvKHN0cmluZyBzdHIpOworaW50IFhncmVwKHN0cmluZyBzdHIpOworaW50IFhoYmVhdHMoc3RyaW5nIHN0cik7CitpbnQgWGhlYWQoc3RyaW5nIHN0cik7CitpbnQgWGhlbHAoc3RyaW5nIHN0cik7CitpbnQgWGlkcyhzdHJpbmcgc3RyKTsKK2ludCBYaW5mbyhzdHJpbmcgc3RyKTsKK2ludCBYaW5oZXJpdChzdHJpbmcgc3RyKTsKK2ludCBYaW52ZW50b3J5KHN0cmluZyBzdHIpOworaW50IFhsYWcoc3RyaW5nIHN0cik7CitpbnQgWGxpZ2h0KHN0cmluZyBzdHIpOworaW50IFhsb2FkKHN0cmluZyBzdHIpOworaW50IFhsb29rKHN0cmluZyBzdHIpOworaW50IFhscGMoc3RyaW5nIHN0cik7CitpbnQgWG1hbihzdHJpbmcgc3RyKTsKK2ludCBYbW9yZShzdHJpbmcgc3RyKTsKK2ludCBYbW92ZShzdHJpbmcgc3RyKTsKK2ludCBYbXNnKHN0cmluZyBzdHIpOworaW50IFhtdHAoc3RyaW5nIHN0cik7CitpbnQgWHByb2Moc3RyaW5nIHN0cik7CitpbnQgWHByb3BzKHN0cmluZyBzdHIpOworaW50IFhwcm9mKHN0cmluZyBzdHIpOworaW50IFhxdWl0KHN0cmluZyBzdHIpOworaW50IFhzY2FuKHN0cmluZyBzdHIpOworaW50IFhzZXQoc3RyaW5nIHN0cik7CitpbnQgWHNoKHN0cmluZyBzdHIpOworaW50IFhzb3J0KHN0cmluZyBzdHIpOworaW50IFhzdG9wKHN0cmluZyBzdHIpOworaW50IFh0b29sKHN0cmluZyBzdHIpOworaW50IFh0cmFjZShzdHJpbmcgc3RyKTsKK2ludCBYdHJhbnMoc3RyaW5nIHN0cik7CitpbnQgWHVwZGF0ZShzdHJpbmcgc3RyKTsKK2ludCBYd2Moc3RyaW5nIHN0cik7CitpbnQgWHdobyhzdHJpbmcgb3B0KTsKK3N0YXRpYyBzdHJpbmcgY3JuYW1lKG9iamVjdCB3aG8pOworaW50IGlkKHN0cmluZyBzdHIpOworaW50IG1vdmUobWl4ZWQgZGVzdCk7CitzdGF0aWMgaW50IHNlY3VyaXR5KCk7CitpbnQgd3JpdGVfbmV3aW52b2JqKG9iamVjdCB3aG8pOworaW50IHdyaXRlX25ld2Vudm9iaihvYmplY3Qgd2hvKTsKK2ludCB3cml0ZV9uZXRkZWFkKG9iamVjdCB3aG8pOworaW50IHdyaXRlX2FsaXZlKG9iamVjdCB3aG8pOworaW50IHdyaXRlX3Nub29wZWUob2JqZWN0IHdobyk7CitpbnQgd3JpdGVfbm9zbm9vcChvYmplY3Qgd2hvKTsKK2ludCB3cml0ZV9pbnZpc29iaihvYmplY3Qgd2hvKTsKK2ludCB3cml0ZV9pbnZpc2x2ZyhvYmplY3Qgd2hvKTsKK2ludCB3cml0ZV9pbnZpc3BseShvYmplY3Qgd2hvKTsKK2ludCB3cml0ZV92aXNpYm9iaihvYmplY3Qgd2hvKTsKK2ludCB3cml0ZV92aXNpYmx2ZyhvYmplY3Qgd2hvKTsKK2ludCB3cml0ZV92aXNpYnBseShvYmplY3Qgd2hvKTsKK3N0YXRpYyBvYmplY3QgKlN1Yk5vZGVzKG9iamVjdCBvYmopOworc3RhdGljIHZhcmFyZ3Mgb2JqZWN0IEZpbmRPYmooc3RyaW5nIHN0ciwgb2JqZWN0IGVudiwgaW50IHNpbGVudCk7CitzdGF0aWMgb2JqZWN0IFZhclRvT2JqKHN0cmluZyBzdHIpOworc3RhdGljIHZhcmFyZ3Mgb2JqZWN0IFhGaW5kT2JqKHN0cmluZyBzdHIsIGludCBzaWxlbnQpOworc3RhdGljIHN0cmluZyBPYmpGaWxlKG9iamVjdCBvYmopOworc3RhdGljIHN0cmluZyBQbGF5ZXJBZ2Uob2JqZWN0IG9iaik7CitzdGF0aWMgc3RyaW5nIFBsYXllckRvbWFpbihvYmplY3Qgb2JqLCBpbnQgZmxhZyk7CitzdGF0aWMgc3RyaW5nIFBsYXllcklQKG9iamVjdCBvYmosIGludCBmbGFnKTsKK3N0YXRpYyBzdHJpbmcgUGxheWVySWRsZShvYmplY3Qgb2JqKTsKK3N0YXRpYyBzdHJpbmcgUGxheWVyTWFpbChvYmplY3Qgb2JqLCBpbnQgZmxhZyk7CitzdGF0aWMgc3RyaW5nIFBsYXllclJhY2Uob2JqZWN0IG9iaiwgaW50IGZsYWcpOworc3RhdGljIHN0cmluZyBQbGF5ZXJTbm9vcChvYmplY3Qgb2JqLCBpbnQgZmxhZyk7CitzdGF0aWMgc3RyaW5nIFBsYXllclN0YXRzKG9iamVjdCBvYmosIGludCBmbGFnKTsKK3N0YXRpYyBzdHJpbmcgUGxheWVyV2hvKG9iamVjdCBvYmopOworc3RhdGljIHN0cmluZyBWYXJUb0ZpbGUoc3RyaW5nIHN0cik7CitzdGF0aWMgc3RyaW5nIFZhclRvUHVyZUZpbGUoc3RyaW5nIHN0cik7CitzdGF0aWMgc3RyaW5nIFhGaWxlKHN0cmluZyBmaWxlKTsKK3N0YXRpYyBzdHJpbmcgWEZpbmRGaWxlKHN0cmluZyBmaWxlKTsKK3N0YXRpYyB2YXJhcmdzIHZvaWQgRGVlcFByaW50U2hvcnQob2JqZWN0IGVudiwgaW50IGluZGVudCwgc3RyaW5nIHByZSwgc3RyaW5nIGZpbGUpOworc3RhdGljIHZvaWQgRGVzdHJ1Y3Qob2JqZWN0IG9iaik7CitzdGF0aWMgdm9pZCBEdW1wUHJvcGVydGllcyhvYmplY3Qgb2JqLCBpbnQgZmxhZyk7CitzdGF0aWMgdm9pZCBJbmhlcml0YW5jZShvYmplY3Qgb2JqLCBzdHJpbmcgZnVuYywgc3RyaW5nIHByZSk7Cit2b2lkIEludmlzQ2hlY2soKTsKK3N0YXRpYyB2b2lkIE1vcmVGaWxlKHN0cmluZyBzdHIpOwordm9pZCBOZXREZWFkQ2hlY2soaW50IHNob3cpOworc3RhdGljIHZvaWQgUHJpbnRPYmoob2JqZWN0IG9iaiwgc3RyaW5nIGZpbGUpOworc3RhdGljIHZhcmFyZ3Mgdm9pZCBQcmludFNob3J0KHN0cmluZyBwcmUsIG9iamVjdCBvYmosIHN0cmluZyBmaWxlKTsKK3ZvaWQgU25vb3BDaGVjaygpOworc3RhdGljIHZvaWQgVmFyQ2hlY2soaW50IHNob3cpOworc3RhdGljIGludCAgV3JpdGUoc3RyaW5nIHN0cik7CitzdGF0aWMgdm9pZCBYRXhlY0ZpbGUoaW50IGxpbmUpOworc3RhdGljIHZvaWQgWE1vcmVGaWxlKHN0cmluZyBmaWxlLCBpbnQgZmxhZyk7CitzdGF0aWMgdm9pZCBYTXNnU2F5KHN0cmluZyBzdHIpOworc3RhdGljIHZvaWQgWE1zZ1Nob3V0KHN0cmluZyBzdHIpOworc3RhdGljIHZvaWQgWE1zZ1RlbGwoc3RyaW5nIHN0cik7CitzdGF0aWMgdm9pZCBYbXRwU2NyaXB0KHN0cmluZyBkaXIsIHN0cmluZyBmaWxlLCBzdHJpbmcgb3B0KTsKK3ZvaWQgYWN0aW9ucygpOwordm9pZCBpbml0KCk7Cit2b2lkIHVwZGF0ZV90b29sKG1peGVkICphcmdzLCBvYmplY3Qgb2JqKTsKK3N0cmluZyBfcXVlcnlfbG9uZygpOworc3RyaW5nIF9xdWVyeV9zaG9ydCgpOworCitzdGF0aWMgaW50IENhbGxGdW5jKHN0cmluZyB2ZXJiLCBzdHJpbmcgc3RyKTsKK3N0YXRpYyBzdHJpbmcgR2V0RnVuYyhzdHJpbmcgdmVyYiwgaW50IHRlc3QpOworCitzdGF0aWMgc3RyaW5nIFByZXBhcmVMaW5lKHN0cmluZyBzdHIpOworc3RhdGljIHN0cmluZyBRdW90ZUxpbmUoc3RyaW5nIHN0cik7CitzdGF0aWMgc3RyaW5nIFVucXVvdGVMaW5lKHN0cmluZyBzdHIpOworaW50IFF1b3RlT2soc3RyaW5nIHN0cik7CitzdGF0aWMgc3RyaW5nICpFeHBsb2RlQ21kcyhzdHJpbmcgc3RyKTsKKworc3RyaW5nIHJlYWRfYnVmZmVyKHN0cmluZyBmaWxlbmFtZSwgaW50IHN0YXJ0LCBpbnQgbnVtYmVyKTsKK3N0cmluZyBsb2FkX2J1ZmZlcihpbnQgbGluZSk7CitpbnQgcmVhZF9saW5lKGludCBvZmZzZXQpOworCisvKgorICogZGVidWcgc3R1ZmYKKyAqLwordm9pZCBUSyhzdHJpbmcgc3RyKTsKK2ludCBYdGsoc3RyaW5nIHN0cik7CisKKyNlbmRpZiAvKiBfX1RPT0xfSF9fICovCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL3Rvb2wubmV3cyBiL29iai90b29scy9NR3Rvb2wvdG9vbC5uZXdzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYWRiZDkKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL3Rvb2wubmV3cwpAQCAtMCwwICsxLDE0MyBAQAorWzEwLjA3Ljk3XQorCistIGZpeGVkIG1pbm9yIGJ1ZyBpbiBjb21tYW5kIGxvb2t1cDoKKyAgJ3hkb3NvbWV0aGluZ29yc29tZXRoaW5nZWxzZScgd2FzIHByZXZpb3VzbHkgZXhlY3V0ZWQgYXMgJ3hkbycKKyAgVGhpcyBpcyB0cmVhdGVkIGFzIGFuIHVua25vd24gY29tbWFuZCBub3cuIEFueXdheSBjb21tYW5kcyBtYXkgYmUKKyAgYWJicmV2aWF0ZWQgYXMgbG9uZyBhcyB0aGV5IGFyZSBub3QgYW1iaWd1b3VzLgorCitbMTIuMDMuOTddCisKKy0geGxwYyBpbmNsdWRlcyBzb21lIG1vcmUgc3RkLWluY2x1ZGUtZmlsZXMgYW5kIC54dG9vbC5oIChpZiBwcmVzZW50KQorCitbMDQuMDMuOTddCisKKy0gbmV3IGNvbW1hbmQ6IHhwcm9jCisgIGRpc3BsYXkgc29tZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSAvcHJvYyBmaWxlc3lzdGVtIGluIGEgdmVyeSByYXcgZmFzaGlvbi4KKworWzA4LjA1Ljk2XQorCistIFhtb3JlL1h0YWlsOiBtb2RpZmllZCBNb3JlRmlsZS9DYXRGaWxlIHVzaW5nIG5ldyByZWFkX2J1ZmZlcigpIGluc3RlYWQgb2YKKyAgcmVhZF9maWxlKCkgZnVuY3Rpb24gd2hpY2ggaXMgVkVSWSBzbG93IHdoZW4gZ2l2aW5nIG9mZnNldHMgYXMgYXJndW1lbnQuCisKK1sxMy4wMi45Nl0KKworLSBzZWUgYmVsb3cgLi4uCisKK1swMy4wMS45Nl0KKworLSBuZXcgY29tbWFuZCBsaW5lIHBhcnNlciB1bmRlciBkZXZlbG9wbWVudCAoQUxQSEEhKQorCitbMjEuMTEuOTVdCisKKy0gTUd0b29sIHdpbGwgYmUgZGVzdHJ1Y3RlZCBkdXJpbmcgY3JlYXRpb24sIHdoZW4gIUlTX0xFQVJORVIoPGNsb25lcj4pIGlzIHRydWUKKworLSBuZXcgb3B0aW9uICItcyIgdG8geGlbbnZlbnRvcnldIHByaW50cyBzaG9ydCBpbnZlbnRvcnkgbGlzdCAoZmlsZW5hbWVzIG9ubHkpLgorICBUaGlzIGlzIHVzZWZ1bCBmb3IgYWxlcnQgb2JqZWN0ICIuLi4gc2Nhbm5lZCB5b3VyIGludmVudG9yeSIgZXRjLgorICB4aSBhY2NlcHRzIDx1c2VybmFtZT4gYXMgb3B0aW9uYWwgYXJndW1lbnQgdG8gcmV0cmlldmUgPHVzZXJuYW1lPidzIAorICBpbnZlbnRvcnkgaW5zdGVhZCBvZiB0aGUgY2xvbmVyJ3Mgb3duIGludmVudG9yeSBhbmQgbWF5IHdyaXRlIGludG8gcGlwZXMKKyAgdG8gY3JlYXRlIGNvbW1hbmQgY2hhaW5zIGxpa2U6IHhpIC1zIGtpcmt8eGdyZXAgTUd0b29sCisKKy0gbmV3IGNvbW1hbmQgeGxhZyA6LSkgCisKK1swOS4xMS45NV0KKworLSBidWdmaXg6IHhpbmhlcml0IG5vdyBjYWxscyB4aW5oZXJpdCBhbmQgTk9UIHhpbnZlbnRvcnkKKworWzIzLjA4Ljk1XQorCistIHhjYWxsIGFuZCB4ZXZhbCB0cnkgdG8gaW5jbHVkZSBhIHByaXZhdGUgaGVhZGVyIGZpbGUgfi8ueHRvb2wuaCBpZiBvbmUgCisgIGV4aXN0cy4gWW91IG1heSBkZWZpbmUgb3duIG1hY3JvcyBvciB3aGF0ZXZlciB0byBtYWtlIHRoaW5ncyBlYXNpZXIKKworWzIxLjA2Ljk1XQorCistIG5ldyBvcHRpb24gImNtZGF2ZyIgdG8geHdobywgc2hvd3MgY29tbWFuZF9hdmVyYWdlIGluIGFzY2VuZGluZyBvcmRlcgorCitbMjAuMDYuOTVdCisKKy0gcmVtb3ZlZCByZWRpcmVjdGluZyBvZiB4Y2FsbCBhbmQgeGV2YWwgKHRvbyBidWdneSkKKworLSBhZGRlZCBvcHRpb25zIC1mIGFuZCAtbSB0byB4cHJvcHMgKHNob3cgcHJvcGZsYWdzIGFuZCBwcm9wbWV0aG9kcykKKworWzA2LjA2Ljk1XQorCisgICoqIElNUE9SVEFOVCAqKiAobm90IGJhY2t3YXJkIGNvbXBhdGlibGUgY2hhbmdlKQorLSB4Y2FsbCBhbmQgeGV2YWwgbm93IHdyaXRlIHRvIGEgZmlsZSwgd2hlbiByZWRpcmVjdGluZyB0aGVpciBvdXRwdXQKKyAgdXNpbmcgJz4nLiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHBpcGUgb3V0cHV0IGludG8gb3RoZXIgY29tbWFuZHMKKworWzMwLjA1Ljk1XQorCistIHhsb29rL3hkbG9vayBhcmUgbm93IGFibGUgdG8gd3JpdGUgaW50byBwaXBlcworCistIHh3aG8gc2hvd3MgdGhlIG5hbWUgb2YgYW55IHVzZXIgY3VycmVudGx5IGxvZ2dpbmcgaW4KKyAgaW5zdGVhZCBvZiBzaW1wbHkgIiBSIE8gTyBUICIKKworWzEwLjA0Ljk1XQorCistIGFkZGVkIG9wdGlvbiAtaSB0byB4Z3JlcCAoaWdub3JlIGNhc2UpCisKKy0gYnVnZml4IGluIGNvbW1hbmQgcGlwZWxpbmVzCisKK1syOC4wMy45NV0KKworLSB4aW5oZXJpdCBpcyBub3cgYWJsZSB0byB3cml0ZSBpbnRvIHBpcGVzCisKK1syMC4wMy45NV0KKworLSBhZGRlZCBJTyByZWRpcmVjdGlvbiBsaWtlOiAgeHdobyBpcCA+IHRlc3RmaWxlICBvciAgeHdobyA+PiB0ZXN0ZmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgYW5kOiAgeG1vcmUgPCB0ZXN0ZmlsZQorICAodGhpcyBpcyB2ZXJ5IEFMUEhBISEhKQorCitbMDEuMDMuOTVdCisKKy0gbmV3IGNvbW1hbmQgeHdjLiBDb3VudCBsaW5lcywgd29yZHMgYW5kIGNoYXJzIGluIGZpbGUKKyAgU3ludGF4IHh3YyBbLWNsd10gW2ZpbGVdICAoaXMgYWJsZSB0byByZWFkIGZyb20gcGlwZSkKKworWzE3LjAyLjk1XQorCistIGNoYW5nZWQgZm9ybWF0dGluZyBvZiB4cHJvcHMgb3V0cHV0CisKK1sxNS4wMi45NV0KKworLSBsb3RzIG9mIGNvZGUgYWRkZWQsIHNvbWUgcmV3cml0dGVuCisKKy0gcmVtb3ZlZCB4YWxpYXMgY2FwYWJpbGl0eSAodGhlIHNoZWxsIGFsaWFzIHByb3ZpZGVzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkpCisKKy0gcmVtb3ZlZCB4Y2luZGVudCwgeGRhdGUsIHhxdWl0IAorCistIGJ1Z3MgZml4ZWQgaW4geGNhbGxvdXRzLCB4cHJvcHMsIHhtYW4gKHdoZW4gdXNpbmcgeHh0b29sKQorCistIGFkZGVkIGNvbW1hbmQgcGlwZWxpbmVzIGZvciBzZWxlY3RlZCBjb21tYW5kczoKKworICAtPiBjbWQgOiBpcyBhYmxlIHRvIHJlYWQgZnJvbSBwaXBlCisgIGNtZCAtPiA6IGlzIGFibGUgdG8gd3JpdGUgaW50byBwaXBlCisKKyAgeGNhbGxvdXRzIC0+CisgIC0+IHhjYXQgLT4KKyAgeGNtZHMgLT4KKyAgLT4geGdyZXAgLT4KKyAgeGhiZWF0cyAtPgorICAtPiB4aGVhZCAtPgorICAtPiB4bW9yZQorICAtPiB4bXNnCisgIHhwcm9wcyAtPgorICAtPiB4c29ydCAtPgorICAtPiB4dGFpbCAtPgorICB4d2hvIC0+CisKKyAgdGhlIGdlbmVyYWwgc3ludGF4IHVzaW5nIHBpcGVzIGlzOgorCisgICAgY21kX2EgW2FyZ19hXSB8IGNtZF9iIFthcmdfYl0gfCAuLi4KKworICBvbmx5IHRoZSBmaXJzdCBzcGFjZSBiZXR3ZWVuIGNtZF9hIGFuZCBhcmdfYSBvciBiZXR3ZWVuIGNtZF9hIGFuZCB0aGUKKyAgZmlyc3QgcGlwZSBzeW1ib2wgaXMgbmVjZXNzYXJ5LgorCisgIEFsbCBmdW5jdGlvbnMgd2hpY2ggYWxsb3cgZGlyZWN0IG91dHB1dCBpbnRvIGEgcGlwZSBkb24ndCB1c2UgYSBwYWdlcgorICB0byBzaG93IGl0cyBvdXRwdXQgZXZlbiBpZiBubyBwaXBlIGZvbGxvd3MgdGhpcyBjb21tYW5kLiBZb3UgbWF5IHVzZQorICBjbWQgW2FyZ118eG1vcmUgdG8gb2J0YWluIHRoZSBvbGQgcmVzdWx0cy4KKworLSBuZXcgY29tbWFuZHMgeHRhaWwsIHhoZWFkLCB4Y2F0IGFuZCB4c29ydAorCistIGNvbW1hbmQgbGluZSBvcHRpb24gLXYgYWRkZWQgdG8geGdyZXAgdG8gcHJpbnQgbGluZXMgbm90IG1hdGNoaW5nIHRoZSBzZWFyY2gKKyAgcGF0dGVybgorCistIGkvbyByZWRpcmVjdGlvbiBpcyBjb21pbmcgc29vbgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC90b29sY21kLmMgYi9vYmovdG9vbHMvTUd0b29sL3Rvb2xjbWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzUwNGI0Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC90b29sY21kLmMKQEAgLTAsMCArMSwyMDMzIEBACisvKgorICogTUd0b29sLTEuMAorICogRmlsZTogdG9vbGNtZHMuYworICogTWFpbnRhaW5lcjogS2lya0BNb3JnZW5HcmF1ZW4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiB0aGUgb3JpZ2luYWwgWHRvb2wgaXMgY29weXJpZ2h0ZWQgYnkgSHlwICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJ0b29sLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogY29tbWFuZCBmdW5jdGlvbnMKKyAqLworCitpbnQgWGNhbGwoc3RyaW5nIHN0cikKK3sKKyAgb2JqZWN0IG9iaiwgY2FsbG9iajsKKyAgc3RyaW5nIGZpbGUsIGNhbGxzdHIsIGNhbGxmdW4sIGNhbGxleHByLCBlcnJvciwgZXJybG9nOworICBpbnQgKnJ1MSwgKnJ1MiwgeHRpbWU7CisgIG1peGVkIHJlczsKKyAgCisgIFNFQ1VSRTIoVFJVRSk7CisgIFVTQUdFMihzdHIsICJ4Y2FsbCA8b2JqZWN0Pi0+PGZ1bmN0aW9uPig8YXJndW1lbnRzPikiKTsKKyAgVEsoIlhjYWxsOiBzdHI6ICIrKHN0cj9zdHI6IihOVUxMKSIpKTsKKyAgaWYoc3NjYW5mKHN0ciwgIiVzLT4lcyglcyIsIGNhbGxzdHIsIGNhbGxmdW4sIGNhbGxleHByKSE9MykKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmKCEoY2FsbG9iaj1YRmluZE9iaihjYWxsc3RyKSkpCisgICAgcmV0dXJuIFRSVUU7CisgIGVsc2UKKyAgeworI2lmIDAKKyAgICB3cml0ZV9maWxlKFRPT0xfTE9HLAorCSAgICAgICBzcHJpbnRmKCIlcyAoJXMpIHhjYWxsICVzIChlbnY6ICVzKVxuIixjdGltZSh0aW1lKCkpLAorCQkgICAgICAgZ2V0dWlkKGNsb25lciksc3RyLG9iamVjdF9uYW1lKGVudmlyb25tZW50KGNsb25lcikpKSk7CisjZW5kaWYKKyAgICBmaWxlPUxQQ19GSUxFKyIuYyI7CisgICAgaWYoZmlsZV9zaXplKGZpbGUpPjApCisgICAgICBybShmaWxlKTsKKyAgICBpZihvYmo9ZmluZF9vYmplY3QoTFBDX0ZJTEUpKQorICAgICAgRGVzdHJ1Y3Qob2JqKTsKKyAgICBvYmo9MDsKKyAgICB3cml0ZV9maWxlKGZpbGUsCisJICAgICAgICIjaW5jbHVkZSA8cHJvcGVydGllcy5oPlxuIisKKwkgICAgICAgIiNpbmNsdWRlIDx0aGluZy9wcm9wZXJ0aWVzLmg+XG4iKworCSAgICAgICAiI2luY2x1ZGUgPGRlZmluZXMuaD5cbiIrCisJICAgICAgICIjaW5jbHVkZSA8d2l6bGlzdC5oPlxuIisKKwkgICAgICAgIiNpbmNsdWRlIDxtb3ZpbmcuaD5cbiIrCisJICAgICAgICIjaW5jbHVkZSBcIi9zZWN1cmUvd2l6bGV2ZWxzLmhcIlxuIisKKwkgICAgICAgKGZpbGVfc2l6ZShQUklWQVRFX0hFQURFUik+PTA/IiNpbmNsdWRlIFwiIitQUklWQVRFX0hFQURFUisiXCJcbiI6IiIpKworCSAgICAgICAibWl4ZWQgZ2V0KHN0cmluZyBzdHIpe3JldHVybiBwcmV2aW91c19vYmplY3QoKS0+WEZpbmRPYmooc3RyKTt9XG4iKworCSAgICAgICAibWl4ZWQgZXZhbChvYmplY3Qgb2JqLG1peGVkIG1lLG1peGVkIGhlcmUpe3JldHVybiBvYmotPiIrY2FsbGZ1bisiKCIrY2FsbGV4cHIrIjt9XG4iKTsKKyAgICBlcnJsb2cgPSBFUlJfRklMRTsKKyAgICBpZihmaWxlX3NpemUoZXJybG9nKT4wKQorICAgICAgcm0oZXJybG9nKTsKKyAgICBpZihlcnJvcj1jYXRjaCgoTFBDX0ZJTEUpLT5fX25peGdpYnRzX18oKSkpCisgICAgICBXKCJFcnJvcjogIitlcnJvclsxLi5dKTsKKyAgICBlbHNlCisgICAgeworICAgICAgb2JqPWZpbmRfb2JqZWN0KExQQ19GSUxFKTsKKyAgICAgIHJ1MT1ydXNhZ2UoKTsKKyAgICAgIGVycm9yPWNhdGNoKHJlcz0obWl4ZWQpb2JqLT5ldmFsKGNhbGxvYmosIGNsb25lciwgRU5WKGNsb25lcikpKTsKKyAgICAgIHJ1Mj1ydXNhZ2UoKTsKKyAgICAgIGlmKGVycm9yKQorCVcoIkVycm9yOiAiK2Vycm9yWzEuLl0pOworICAgICAgZWxzZQorICAgICAgeworCXh0aW1lPXJ1MlswXS1ydTFbMF0rcnUyWzFdLXJ1MVsxXTsKKwlXRExOKCJFdmFsdWF0aW9uIHRpbWU6ICIrKHh0aW1lPDAgPyAwIDogeHRpbWUpKyIgbXMiKTsKKwlQSVBFX0RFTEVURShwaXBlX29mKTsKKwlpZihwaXBlX291dCYmcGlwZV9vZikKKwkgIHdyaXRlX2ZpbGUocGlwZV9vZixtaXhlZF90b19zdHJpbmcocmVzLCBNQVhfUkVDVVJTSU9OKSsiXG4iKTsKKwllbHNlCisJV0xOKCJSZXN1bHQ6ICIrbWl4ZWRfdG9fc3RyaW5nKHJlcywgTUFYX1JFQ1VSU0lPTikpOworCWlmKG9iamVjdHAocmVzKSkKKyAgICBtX2FkZCh2YXJpYWJsZSwgInJlc3VsdCIsIHJlcyk7CisgICAgICB9CisgICAgfQorICAgIHJtKGZpbGUpOworICB9CisgIGlmKG9iaikgRGVzdHJ1Y3Qob2JqKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYY2FsbG91dHMoc3RyaW5nIHN0cikKK3sKKyAgb2JqZWN0IG9iajsKKyAgbWl4ZWQgY2FsbG91dHMsIGFyZ3M7CisgIHN0cmluZyBmdW4sIHRtcCwgZmlsZTsKKyAgaW50IGRlbGF5LCBpLCBzOworICAKKyAgU0VDVVJFMihUUlVFKTsKKyAgVEsoIlhjYWxsb3V0czogc3RyOiAiKyhzdHI/c3RyOiIoTlVMTCkiKSk7CisgIGlmKCFwaXBlX291dCkKKyAgeworICAgIFVTQUdFMShzdHIsICJ4Y2FsbG8odXRzKSBbc2VhcmNoIHBhdHRlcm5dIik7CisgICAgZmlsZT1UTVBfRklMRTsKKyAgICBpZihmaWxlX3NpemUoZmlsZSk+MCkKKyAgICAgIHJtKGZpbGUpOworICAgIGlmKCFzdHIpCisgICAgICBzdHI9Il5cXFt+LyI7CisgICAgZWxzZSBpZighcmVnZXhwKCh7ImR1bW15In0pLCBzdHIpKQorICAgIHsKKyAgICAgIFdETE4oIkJhZCByZWd1bGFyIGV4cHJlc3Npb24iKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0gCisgIH0KKyAgZWxzZQorICB7CisgICAgVVNBR0UxKHN0ciwgInhjYWxsbyh1dHMpIik7CisgICAgaWYoc3RyJiZzdHIhPSIiKQorICAgIHsKKyAgICAgIFdETE4oIk1vcmUgYXJndW1lbnRzIHRoYW4gZXhwZWN0ZWQiKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorICBjYWxsb3V0cz1jYWxsX291dF9pbmZvKCk7CisgIHM9c2l6ZW9mKGNhbGxvdXRzKTsKKyAgUElQRV9ERUxFVEUocGlwZV9vZik7CisgIGZvcihpPTA7IGk8czsgaSsrKQorICB7CisgICAgaWYoY2FsbG91dHNbaV0mJnBvaW50ZXJwKGNhbGxvdXRzW2ldKSkKKyAgICB7CisgICAgICB0bXA9c3ByaW50ZigiJU8gJU9zICVPICglcykiLGNhbGxvdXRzW2ldWzBdLGNhbGxvdXRzW2ldWzJdLAorCQkgIGNhbGxvdXRzW2ldWzFdLChzaXplb2YoY2FsbG91dHNbaV0pPjM/CisJCQkJICBtaXhlZF90b19zdHJpbmcoY2FsbG91dHNbaV1bM10sCisJCQkJCQkgIE1BWF9SRUNVUlNJT04pOiIwIikpOworICAgICAgaWYocGlwZV9vdXQmJnBpcGVfb2YpCisJd3JpdGVfZmlsZShwaXBlX29mLHRtcCsiXG4iKTsKKyAgICAgIGVsc2UKKwlpZihzaXplb2YocmVnZXhwKCh7dG1wfSksIHN0cikpKQorCSAgV0xOKHRtcCk7CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWGNhdChzdHJpbmcgc3RyKQoreworICBzdHJpbmcgKnRtcCxmaWxlOworICBpbnQgczsKKworICBTRUNVUkUyKFRSVUUpOworICBUSygiWGNhdDogc3RyOiAiK3N0cik7CisgIGlmKCFwaXBlX2luKQorICB7CisgICAgVVNBR0UyKHN0ciwgInhjYXQgPGZpbGU+Iik7CisgICAgaWYoIShmaWxlPVhGaW5kRmlsZShzdHIpKSkKKyAgICB7CisgICAgICBXRExOKCJDYW4ndCBmaW5kIGZpbGUiKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBpZihzdHImJnN0ciE9Ii0iKQorICAgICAgVVNBR0UzKCJ4Y2F0IC0iKTsKKworICAgIGlmIChmaWxlX3NpemUoZmlsZT1waXBlX2lmKTwwKQorICAgIHsKKyAgICAgIFdETE4oIk1pc3NpbmcgaW5wdXQgdG8geGNhdCIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisgIHRtcD1vbGRfZXhwbG9kZShyZWFkX2ZpbGUoZmlsZSwwLFBJUEVfTUFYKSwiXG4iKTsKKyAgaWYocGlwZV9pbiYmcGlwZV9pZj09UElQRV9GSUxFKQorICAgIHJtKFBJUEVfRklMRSk7CisgIGlmIChwaXBlX291dCYmcGlwZV9vZikKKyAgICB3cml0ZV9maWxlKHBpcGVfb2YsaW1wbG9kZSh0bXAsIlxuIikrIlxuIik7CisgIGVsc2UKKyAgICBXTE4oaW1wbG9kZSh0bXAsIlxuIikpOworICByZXR1cm4gVFJVRTsKK30KKworaW50IFhjZChzdHJpbmcgc3RyKQoreworICBvYmplY3QgZGVzdDsKKyAgc3RyaW5nIHBhdGg7CisgIAorICBTRUNVUkUyKFRSVUUpOworICBVU0FHRTEoc3RyLCAieGNkIFtvYmplY3RdIik7CisgIFRLKCJYY2Q6IHN0cjogIisoc3RyP3N0cjoiKE5VTEwpIikpOworICBpZighc3RyKQorICB7CisgICAgaWYoIShwYXRoPShzdHJpbmcpY2xvbmVyLT5RdWVyeVByb3AoInN0YXJ0X2hvbWUiKSkpCisgICAgICBwYXRoPSIvIjsKKyAgfQorICBlbHNlIGlmKChkZXN0PVhGaW5kT2JqKHN0ciwxKSkpCisgICAgcGF0aD0iLyIraW1wbG9kZShvbGRfZXhwbG9kZShvYmplY3RfbmFtZShkZXN0KSwiLyIpWzAuLjwyXSwiLyIpOworICBlbHNlCisgICAgcGF0aD0iIjsKKworICBUSygiWGNkOiBwYXRoOiAiKyhwYXRoP3BhdGg6IihOVUxMKSIpKTsKKyAgaWYoIXNpemVvZihwYXRoKSkKKyAgICBwYXRoPXN0cjsKKyAgUEwtPl9jZChwYXRoKTsKKworICByZXR1cm4gVFJVRTsKK30KKworaW50IFhjbGVhbihzdHJpbmcgc3RyKQoreworICBvYmplY3QgZW52OworICAKKyAgU0VDVVJFMihUUlVFKTsKKyAgVVNBR0UxKHN0ciwgInhjbGUoYW4pIFtvYmplY3RdIik7CisgIFRLKCJYY2xlYW46IHN0cjogIisoc3RyP3N0cjoiKE5VTEwpIikpOworICBpZighc3RyKQorICAgIGVudj1FTlYoY2xvbmVyKTsKKyAgaWYoZW52fHwoZW52PVhGaW5kT2JqKHN0cikpKQorICB7CisgICAgUHJpbnRTaG9ydCgiQ2xlYW5pbmc6ICIsIGVudik7CisgICAgZmlsdGVyKGZpbHRlcihhbGxfaW52ZW50b3J5KGVudiksICMnaXNfbm90X3BsYXllciksLy8nCisJCSAiRGVzdHJ1Y3QiLCBNRSk7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYY2xvbmUoc3RyaW5nIHN0cikKK3sKKyAgb2JqZWN0IG9iajsKKyAgc3RyaW5nIGZpbGUsIGVycmxvZywgZXJyb3I7CisgIAorICBTRUNVUkUyKFRSVUUpOworICBVU0FHRTIoc3RyLCAieGNsbyhuZSkgPGZpbGVuYW1lPiIpOworICBpZighKGZpbGU9WEZpbmRGaWxlKHN0cikpKSByZXR1cm4gVFJVRTsKKyAgZXJybG9nPUVSUl9GSUxFOworICBpZihmaWxlX3NpemUoZXJybG9nKT4wKSBybShlcnJsb2cpOworICBXTE4oIkNsb25lOiAiK3Nob3J0X3BhdGgoZmlsZSkpOworICBpZighKGVycm9yPWNhdGNoKG9iaj1jbG9uZV9vYmplY3QoZmlsZSkpKSkKKyAgeyAKKyAgICBtX2FkZCh2YXJpYWJsZSwgImNsb25lIiwgb2JqKTsKKyAgICBpZighTW92ZU9iaihvYmosIEVOVihjbG9uZXIpLCBUUlVFKSkKKyAgICAgIFdETE4oIkNhbm5vdCBtb3ZlIG9iamVjdCBpbnRvIHRoaXMgcm9vbSIpOworICAgIGVsc2UgaWYoIW9iai0+UXVlcnlOb0dldCgpKQorICAgIHsKKyAgICAgIGlmKCFNb3ZlT2JqKG9iaiwgY2xvbmVyLCBUUlVFKSkKKwlXRExOKCJDYW5ub3QgbW92ZSBvYmplY3QgaW50byB5b3VyIGludmVudG9yeSIpOworICAgIH0KKyAgfQorICBlbHNlCisgICAgVygiRXJyb3I6ICIrZXJyb3JbMS4uXSk7CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWHVjbG9uZShzdHJpbmcgc3RyKQoreworICBvYmplY3Qgb2JqOworICBzdHJpbmcgZmlsZSwgZXJybG9nLCBlcnJvcjsKKyAgCisgIFNFQ1VSRTIoVFJVRSk7CisgIFVTQUdFMihzdHIsICJ4dWNsbyhuZSkgPGZpbGVuYW1lPiIpOworICBpZighKGZpbGU9WEZpbmRGaWxlKHN0cikpKSByZXR1cm4gVFJVRTsKKyAgZXJybG9nPUVSUl9GSUxFOworICBpZihmaWxlX3NpemUoZXJybG9nKT4wKSBybShlcnJsb2cpOworICBpZihvYmo9ZmluZF9vYmplY3QoZmlsZSkpIHsKKyAgICBEZXN0cnVjdChvYmopOworICAgIFdMTigiVXBkYXRlIGFuZCBjbG9uZTogIitzaG9ydF9wYXRoKGZpbGUpKTsKKyAgfQorICBlbHNlCisgICAgV0xOKCJDbG9uZTogIitzaG9ydF9wYXRoKGZpbGUpKTsKKyAgaWYoIShlcnJvcj1jYXRjaChvYmo9Y2xvbmVfb2JqZWN0KGZpbGUpKSkpCisgIHsKKyAgICB2YXJpYWJsZVsiY2xvbmUiXSA9IG9iajsKKyAgICBpZighTW92ZU9iaihvYmosIEVOVihjbG9uZXIpLCBUUlVFKSkKKyAgICAgIFdETE4oIkNhbm5vdCBtb3ZlIG9iamVjdCBpbnRvIHRoaXMgcm9vbSIpOworICAgIGVsc2UgaWYoIW9iai0+UXVlcnlOb0dldCgpKQorICAgIHsKKyAgICAgIGlmKCFNb3ZlT2JqKG9iaiwgY2xvbmVyLCBUUlVFKSkKKwlXRExOKCJDYW5ub3QgbW92ZSBvYmplY3QgaW50byB5b3VyIGludmVudG9yeSIpOworICAgIH0KKyAgfQorICBlbHNlCisgICAgVygiRXJyb3I6ICIrZXJyb3JbMS4uXSk7CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWGNtZHMoc3RyaW5nIHN0cikKK3sKKyAgb2JqZWN0IG9iajsKKyAgbWl4ZWQgKmNtZHM7CisgIGludCBpLCBzOworCisgIFNFQ1VSRTIoVFJVRSk7CisgIFVTQUdFMShzdHIsICJ4Y20oZHMpIFtvYmplY3RdIik7CisgIFRLKCJYY21kczogc3RyOiAiKyhzdHI/c3RyOiIoTlVMTCkiKSk7CisgIGlmKCFzdHIpCisgICAgb2JqPUVOVihjbG9uZXIpOworICBlbHNlIGlmKCEob2JqPVhGaW5kT2JqKHN0cikpKQorICB7CisgICAgV0RMTigiQ2FuJ3QgZmluZCBvYmplY3QiKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBzPXNpemVvZihjbWRzPXF1ZXJ5X2FjdGlvbnMoY2xvbmVyLDF8Mnw0fDh8MTYpKTsKKyAgUElQRV9ERUxFVEUocGlwZV9vZik7CisgIGZvcihpPTA7IGk8czsgaSs9NSkKKyAgICBpZihjbWRzW2krM109PW9iaikKKyAgICAgIGlmKHBpcGVfb3V0JiZwaXBlX29mKQorCXdyaXRlX2ZpbGUocGlwZV9vZixBTEVGVChjbWRzW2ldKyIgIiwgMTUsICIuIikrCisJCSAgIChjbWRzW2krMl0gPyAiICogIiA6ICIgLiAiKStjbWRzW2krNF0rIigpXG4iKTsKKyAgICAgIGVsc2UKKwlXTE4oQUxFRlQoY21kc1tpXSsiICIsIDE1LCAiLiIpKworCSAgICAoY21kc1tpKzJdID8gIiAqICIgOiAiIC4gIikrY21kc1tpKzRdKyIoKSIpOworICByZXR1cm4gVFJVRTsKK30KKyAgCitpbnQgWGRiZyhzdHJpbmcgc3RyKQoreworICBvYmplY3Qgb2JqOworICAKKyAgU0VDVVJFMihUUlVFKTsKKyAgVVNBR0UyKHN0ciwgInhkYihnKSA8b2JqZWN0PiIpOworICBUSygiWGRiZzogc3RyOiAiKyhzdHI/c3RyOiIoTlVMTCkiKSk7CisgIGlmKChvYmo9WEZpbmRPYmooc3RyKSkpCisgIHsKKyAgICBkZWJ1Z19pbmZvKDEsIG9iaik7CisgICAgZGVidWdfaW5mbygwLCBvYmopOworICB9CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWGRjbGVhbihzdHJpbmcgc3RyKQoreworICBvYmplY3QgZW52OworICAKKyAgU0VDVVJFMihUUlVFKTsKKyAgVVNBR0UxKHN0ciwgInhkYyhsZWFuKSBbb2JqZWN0XSIpOworICBUSygiWGRjbGVhbjogc3RyOiAiKyhzdHI/c3RyOiIoTlVMTCkiKSk7CisgIGlmKCFzdHIpCisgICAgZW52PUVOVihjbG9uZXIpOworICBpZihlbnZ8fChlbnY9WEZpbmRPYmooc3RyKSkpCisgIHsKKyAgICBQcmludFNob3J0KCJEZWVwIGNsZWFuaW5nOiAiLCBlbnYpOworICAgIGZpbHRlcihmaWx0ZXIoYWxsX2ludmVudG9yeShlbnYpLCAjJ2lzX25vdF9wbGF5ZXIsIE1FKSwvLycKKwkJICJEZWVwQ2xlYW4iLCBNRSk7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYZGRlcyhzdHJpbmcgc3RyKQoreworICBvYmplY3Qgb2JqOworICAKKyAgU0VDVVJFMihUUlVFKTsKKyAgVVNBR0UyKHN0ciwgInhkZChlcykgPG9iamVjdD4iKTsKKyAgVEsoIlhkZGVzOiBzdHI6ICIrKHN0cj9zdHI6IihOVUxMKSIpKTsKKyAgaWYoKG9iaj1YRmluZE9iaihzdHIpKSkKKyAgeworICAgIFByaW50U2hvcnQoIkRlZXAgZGVzdHJ1Y3Q6ICIsIG9iaik7CisgICAgZmlsdGVyKGRlZXBfaW52ZW50b3J5KG9iaiksICJEZXN0cnVjdCIsIE1FKTsKKyAgICBEZXN0cnVjdChvYmopOworICB9CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWGRlcyhzdHJpbmcgc3RyKQoreworICBvYmplY3Qgb2JqOworICAKKyAgU0VDVVJFMihUUlVFKTsKKyAgVVNBR0UyKHN0ciwgInhkZShzKSA8b2JqZWN0PiIpOworICBUSygiWGRlczogc3RyOiAiKyhzdHI/c3RyOiIoTlVMTCkiKSk7CisgIGlmKChvYmo9WEZpbmRPYmooc3RyKSkpCisgIHsKKyAgICBQcmludFNob3J0KCJEZXN0cnVjdDogIixvYmopOworICAgIERlc3RydWN0KG9iaik7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYZGxvb2soc3RyaW5nIHN0cikKK3sKKyAgb2JqZWN0IG9iajsKKyAgCisgIFNFQ1VSRTIoVFJVRSk7CisgIFVTQUdFMShzdHIsICJ4ZGwob29rKSBbb2JqZWN0XSIpOworICBUSygiWGRsb29rOiBzdHI6ICIrKHN0cj9zdHI6IihOVUxMKSIpKTsKKyAgaWYoIXN0cikKKyAgICBvYmo9Y2xvbmVyOworICBpZihvYmp8fChvYmo9WEZpbmRPYmooc3RyKSkpCisgIHsKKyAgICBQSVBFX0RFTEVURShwaXBlX29mKTsKKyAgICBEZWVwUHJpbnRTaG9ydChvYmosTlVMTCxOVUxMLChwaXBlX291dCYmcGlwZV9vZik/cGlwZV9vZjoiIik7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYZG8oc3RyaW5nIHN0cikKK3sKKyAgaW50IGksIG4sIHM7CisgIHN0cmluZyAqc3RycywgY21kOworICAKKyAgU0VDVVJFMihUUlVFKTsKKyAgVVNBR0UyKHN0ciwgInhkbyBbPG51bWJlcjE+I108Y29tbWFuZDE+WztbPG51bWJlcjI+I108Y29tbWFuZDI+XSAuLi4iKTsKKyAgaWYoIXN0cnx8c3RyPT0iInx8IShzPXNpemVvZihzdHJzPXN0cmlwX2V4cGxvZGUoc3RyLCAiOyIpKSkpCisgICAgcmV0dXJuIEZBTFNFOworICBmb3IoaT0wOyBpPHM7IGkrKykKKyAgeworICAgIGlmKHN0cnNbaV0pCisgICAgeworICAgICAgc3dpdGNoKHNzY2FuZihzdHJzW2ldLCAiJWQjJXMiLCBuLCBjbWQpKQorICAgICAgeworCWNhc2UgMDoKKwlpZighQ29tbWFuZChzdHJzW2ldKSkgcmV0dXJuIFRSVUU7CisJYnJlYWs7CisJY2FzZSAxOgorCWlmKGNtZCYmKCFDb21tYW5kKGNtZCkpKSByZXR1cm4gVFJVRTsKKwlicmVhazsKKwljYXNlIDI6CisJbj0gbjwxID8gMSA6IG47CisJaWYoY21kKQorCXsKKwkgIHdoaWxlKG4tLSkKKwkgICAgaWYoIUNvbW1hbmQoY21kKSkgcmV0dXJuIFRSVUU7CisJfQorCWJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworaW50IFhkdXBkYXRlKHN0cmluZyBzdHIpCit7CisgIGludCBpLCBzOworICBvYmplY3Qgb2JqOworICBzdHJpbmcgZmlsZSwgKmxpc3Q7CisgIAorICBTRUNVUkUyKFRSVUUpOworICBVU0FHRTIoc3RyLCAieGR1KHBkYXRlKSA8ZmlsZW5hbWU+Iik7CisgIGlmKCEoZmlsZT1YRmluZEZpbGUoc3RyKSkpCisgICAgcmV0dXJuIFRSVUU7CisgIGlmKGZpbGVbPDIuLjwxXT09Ii5jIikKKyAgICBmaWxlPWZpbGVbMC4uPDNdOworICBpZihvYmo9WEZpbmRPYmooZmlsZSkpCisgIHsKKyAgICBQcmludFNob3J0KCJEZWVwIHVwZGF0aW5nOiAiLCBvYmopOworICAgIGxpc3Q9aW5oZXJpdF9saXN0KG9iaik7CisgICAgZm9yKHM9c2l6ZW9mKGxpc3QpOyBpPHM7IGkrKykKKyAgICB7CisgICAgICBpZihvYmo9ZmluZF9vYmplY3QobGlzdFtpXSkpCisJRGVzdHJ1Y3Qob2JqKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYZWNobyhzdHJpbmcgc3RyKQoreworICBUSygiWGVjaG86IHN0cjogIisoc3RyP3N0cjoiKE5VTEwpIikpOworICBXTE4oc3RyKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYZXZhbChzdHJpbmcgc3RyKQoreworICBvYmplY3Qgb2JqOworICBzdHJpbmcgZmlsZSwgZXJyb3I7CisgIGludCAqcnUxLCAqcnUyLCB4dGltZTsKKyAgbWl4ZWQgcmVzOworICAKKyAgU0VDVVJFMihUUlVFKTsKKyAgVVNBR0UyKHN0ciwgInhldihhbCkgPGV4cHJlc3Npb24+Iik7CisgIGZpbGU9TFBDX0ZJTEUrIi5jIjsKKyAgaWYoZmlsZV9zaXplKGZpbGUpPjApCisgICAgcm0oZmlsZSk7CisgIGlmKG9iaj1maW5kX29iamVjdChMUENfRklMRSkpCisgICAgRGVzdHJ1Y3Qob2JqKTsKKyNpZiAwCisgIHdyaXRlX2ZpbGUoVE9PTF9MT0csCisJICAgICBzcHJpbnRmKCIlcyAoJXMpIHhldmFsICVzXG4iLAorCQkgICAgIGN0aW1lKHRpbWUoKSksZ2V0dWlkKGNsb25lciksc3RyKSk7CisjZW5kaWYKKyAgd3JpdGVfZmlsZShmaWxlLAorCSAgICAgIiNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+XG4iKworCSAgICAgIiNpbmNsdWRlIDx0aGluZy9wcm9wZXJ0aWVzLmg+XG4iKworCSAgICAgIiNpbmNsdWRlIDxkZWZpbmVzLmg+XG4iKworICAgICAgICAgICAgICIjaW5jbHVkZSA8d2l6bGlzdC5oPlxuIisKKwkgICAgICIjaW5jbHVkZSA8bW92aW5nLmg+XG4iKworCSAgICAgIiNpbmNsdWRlIFwiL3NlY3VyZS93aXpsZXZlbHMuaFwiXG4iKworCSAgICAgKGZpbGVfc2l6ZShQUklWQVRFX0hFQURFUik+PTA/IiNpbmNsdWRlIFwiIitQUklWQVRFX0hFQURFUisiXCJcbiI6IiIpKworCSAgICAgImdldChzdHIpe3JldHVybiBwcmV2aW91c19vYmplY3QoKS0+WEZpbmRPYmooc3RyKTt9XG4iKworCSAgICAgImV2YWwobWUsaGVyZSl7cmV0dXJuICIrc3RyKyI7fSIpOworICBpZihlcnJvcj1jYXRjaChvYmo9Y2xvbmVfb2JqZWN0KGZpbGUpKSkKKyAgICBXKCJFcnJvcjogIitlcnJvclsxLi5dKTsKKyAgZWxzZQorICB7CisgICAgcnUxPXJ1c2FnZSgpOworICAgIGVycm9yPWNhdGNoKHJlcz0obWl4ZWQpb2JqLT5ldmFsKGNsb25lciwgRU5WKGNsb25lcikpKTsKKyAgICBydTI9cnVzYWdlKCk7CisgICAgaWYoZXJyb3IpCisgICAgICBXKCJFcnJvcjogIitlcnJvclsxLi5dKTsKKyAgICBlbHNlCisgICAgeworICAgICAgeHRpbWU9cnUyWzBdLXJ1MVswXStydTJbMV0tcnUxWzFdOworICAgICAgV0RMTigiRXZhbHVhdGlvbiB0aW1lOiAiKyh4dGltZTwwID8gMCA6IHh0aW1lKSsiIG1zIik7CisgICAgICBQSVBFX0RFTEVURShwaXBlX29mKTsKKyAgICAgIGlmKHBpcGVfb3V0JiZwaXBlX29mKQorICAgICAgICB3cml0ZV9maWxlKHBpcGVfb2YsbWl4ZWRfdG9fc3RyaW5nKHJlcyxNQVhfUkVDVVJTSU9OKSsiXG4iKTsKKyAgICAgIGVsc2UKKyAgICAgICAgV0xOKCJSZXN1bHQ6ICIrbWl4ZWRfdG9fc3RyaW5nKHJlcywgTUFYX1JFQ1VSU0lPTikpOworICAgICAgaWYob2JqZWN0cChyZXMpKQorICAgICAgICB2YXJpYWJsZVsicmVzdWx0Il0gPSByZXM7CisgICAgfQorICB9CisgIHJtKGZpbGUpOworICBpZihvYmopCisgICAgRGVzdHJ1Y3Qob2JqKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYZm9yYWxsKHN0cmluZyBzdHIpCit7CisgIGludCBpLCBzLCB0LCB1OworICBzdHJpbmcgcGF0LCBjbWQsIGFyZywgKnN0cnMsICpmaWxlcywgZmgsIGZyLCBmZSwgZnQsIGZmOworICAKKyAgU0VDVVJFMihUUlVFKTsKKyAgVVNBR0UyKHN0ciwgInhmbyhyYWxsKSA8ZmlsZXBhdHRlcm4+IDxjb21tYW5kPiIpOworICBpZihzc2NhbmYoc3RyLCAiJXMgJXMiLCBwYXQsIGFyZykhPTIpCisgICAgcmV0dXJuIEZBTFNFOworICBmaWxlcz1sb25nX2dldF9kaXIocGF0LCBGQUxTRSk7CisgIGlmKCEocz1zaXplb2YoZmlsZXMpKSkKKyAgeworICAgIFdETE4oIk5vIG1hdGNoaW5nIGZpbGVzIGZvdW5kIik7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgc3Rycz1vbGRfZXhwbG9kZShmaWxlc1swXSwgIi8iKTsKKyAgZmg9Ii8iOworICBpZih0PXNpemVvZihzdHJzKS0xKQorICAgIGZoKz1pbXBsb2RlKHN0cnNbMC4udC0xXSwgIi8iKTsKKyAgZm9yKGk9MDsgaTxzOyBpKyspCisgIHsKKyAgICBmdD1vbGRfZXhwbG9kZShmaWxlc1tpXSwgIi8iKVt0XTsKKyAgICBpZigodT1zaXplb2Yoc3Rycz1vbGRfZXhwbG9kZShmdCwgIi4iKSkpJiYtLXUpCisgICAgeworICAgICAgZmY9aW1wbG9kZShzdHJzWzAuLnUtMV0sICIuIik7CisgICAgICBmcj1maCsiLyIrZmY7CisgICAgICBmZT1zdHJzW3VdOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgZmU9IiI7CisgICAgICBmZj1mdDsKKyAgICAgIGZyPWZpbGVzW2ldOworICAgIH0KKyAgICBjbWQ9c3RyaW5nX3JlcGxhY2UoYXJnLCAiISEiLCBmaWxlc1tpXSk7CisgICAgY21kPXN0cmluZ19yZXBsYWNlKGNtZCwgIiFlIiwgZmUpOworICAgIGNtZD1zdHJpbmdfcmVwbGFjZShjbWQsICIhZiIsIGZmKTsKKyAgICBjbWQ9c3RyaW5nX3JlcGxhY2UoY21kLCAiIWgiLCBmaCk7CisgICAgY21kPXN0cmluZ19yZXBsYWNlKGNtZCwgIiFyIiwgZnIpOworICAgIGNtZD1zdHJpbmdfcmVwbGFjZShjbWQsICIhdCIsIGZ0KTsKKyAgICBpZighKENvbW1hbmQoY21kKSkpCisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworaW50IFhnb3RvKHN0cmluZyBzdHIpCit7CisgIG9iamVjdCBvYmosIHRtcDsKKyAgCisgIFNFQ1VSRTIoVFJVRSk7CisgIFVTQUdFMShzdHIsICJ4Z28odG8pIFtvYmplY3RdIik7CisgIGlmKCFzdHIpIHN0cj0ifi93b3Jrcm9vbSI7CisgIGlmKCEob2JqPVhGaW5kT2JqKHN0cikpKQorICB7CisgICAgaWYoIShzdHI9WEZpbmRGaWxlKHN0cikpKQorICAgICAgcmV0dXJuIFRSVUU7CisgICAgaWYoY2F0Y2goY2FsbF9vdGhlcihzdHIsICI/Pz8iKSkpCisgICAgICByZXR1cm4gVFJVRTsKKyAgICBvYmo9ZmluZF9vYmplY3Qoc3RyKTsKKyAgfQorICB0bXA9b2JqOworICB3aGlsZShvYmomJmxpdmluZyhvYmopKQorICAgIG9iaj1FTlYob2JqKTsKKyAgY2xvbmVyLT5tb3ZlKG9iaiA/IG9iaiA6IHRtcCwgTV9UUE9SVCk7CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWGdyZXAoc3RyaW5nIHN0cikKK3sKKyAgaW50IGksIHMsIHQsIG1vZGU7CisgIHN0cmluZyAqZmlsZXMsICp0czsKKyAgCisgIFNFQ1VSRTIoVFJVRSk7CisgIFRLKCJYZ3JlcDogc3RyOiAiKyhzdHI/c3RyOiIoTlVMTCkiKSk7CisgIG1vZGU9MDsKKyAgaWYoIXBpcGVfaW4pCisgIHsKKyAgICBVU0FHRTIoc3RyLCAieGdyKGVwKSBbLWldIFstdl0gPHJlZ2V4cD4gPGZpbGVwYXR0ZXJuPiIpOworICAgIGlmKCEodHM9b2xkX2V4cGxvZGUoc3RyLCAiICIpKXx8IShzPXNpemVvZih0cykpKQorICAgICAgcmV0dXJuIEZBTFNFOworICAgIHdoaWxlKHRzWzBdWzBdPT0nLScpCisgICAgeworICAgICAgaWYoczwzKQorICAgICAgeworCVdETE4oIlRvbyBmZXcgYXJndW1lbnRzIHRvIHhncmVwIik7CisJcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgc3dpdGNoKHRzWzBdKQorICAgICAgeworCWNhc2UgIi12IjoKKwkgIG1vZGV8PVhHUkVQX1JFVkVSVDsKKwkgIHRzPXRzWzEuLl07CisJICBzLS07CisJICBicmVhazsKKwljYXNlICItaSI6CisJICBtb2RlfD1YR1JFUF9JQ0FTRTsKKwkgIHRzPXRzWzEuLl07CisJICBzLS07CisJICBicmVhazsKKwljYXNlICItdmkiOgorCWNhc2UgIi1pdiI6CisJICBtb2RlfD1YR1JFUF9SRVZFUlQ7CisJICBtb2RlfD1YR1JFUF9JQ0FTRTsKKwkgIHRzPXRzWzEuLl07CisJICBzLS07CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgV0RMTigiVW5rbm93biBvcHRpb24gIit0c1swXSsiIGdpdmVuIHRvIHhncmVwIik7CisJICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgfQorICAgIHN0cj1pbXBsb2RlKHRzWzAuLnMtMl0sICIgIik7CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYoISgodHM9b2xkX2V4cGxvZGUoc3RyLCAiICIpKSYmKHM9c2l6ZW9mKHRzKSkpKQorICAgICAgVVNBR0UzKCJ4Z3IoZXApIFstaV0gWy12XSA8cmVnZXhwPiIpOworICAgIHdoaWxlKHRzWzBdWzBdPT0nLScpCisgICAgeworICAgICAgaWYoczwyKQorICAgICAgeworCVdETE4oIlRvbyBmZXcgYXJndW1lbnRzIHRvIHhncmVwIik7CisJcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgc3dpdGNoKHRzWzBdKQorICAgICAgeworCWNhc2UgIi12IjoKKwkgIG1vZGV8PVhHUkVQX1JFVkVSVDsKKwkgIHRzPXRzWzEuLl07CisJICBzLS07CisJICBicmVhazsKKwljYXNlICItaSI6CisJICBtb2RlfD1YR1JFUF9JQ0FTRTsKKwkgIHRzPXRzWzEuLl07CisJICBzLS07CisJICBicmVhazsKKwljYXNlICItaXYiOgorCWNhc2UgIi12aSI6CisJICBtb2RlfD1YR1JFUF9SRVZFUlQ7CisJICBtb2RlfD1YR1JFUF9JQ0FTRTsKKwkgIHRzPXRzWzEuLl07CisJICBzLS07CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgV0RMTigiVW5rbm93biBvcHRpb24gIit0c1swXSsiIGdpdmVuIHRvIHhncmVwIik7CisJICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgfQorICAgIHN0cj1pbXBsb2RlKHRzWzAuLnMtMV0sICIgIik7CisgIH0KKyAgCisgIGlmKG1vZGUmWEdSRVBfSUNBU0UpCisgICAgc3RyPWxvd2VyX2Nhc2Uoc3RyKTsKKyAgaWYoIShyZWdleHAoKHsiZHVtbXkifSksIHN0cikpKQorICB7CisgICAgV0RMTigiQmFkIHJlZ3VsYXIgZXhwcmVzc2lvbiIpOworICAgIHJldHVybiBUUlVFOworICB9CisgIGlmKCFwaXBlX2luKQorICB7CisgICAgaWYoZmlsZV9zaXplKFRNUF9GSUxFKT4wKQorICAgICAgcm0oVE1QX0ZJTEUpOworICAgIGlmKCh0PXNpemVvZihmaWxlcz1sb25nX2dldF9kaXIoWEZpbGUodHNbcy0xXSksIEZBTFNFKSkpJiYKKyAgICAgICAoZmlsZV9zaXplKGZpbGVzWzBdKT49MCkpCisgICAgeworICAgICAgZm9yKGk9MDsgaTx0OyBpKyspCisJWEdyZXBGaWxlKHN0ciwgZmlsZXNbaV0sIG1vZGUpOworICAgICAgaWYocGlwZV9vdXQmJnBpcGVfb2YpCisgICAgICB7CisJUElQRV9ERUxFVEUocGlwZV9vZik7CisJaWYoIXBpcGVfb3ZyKQorCXsKKwkgIHdyaXRlX2ZpbGUocGlwZV9vZixyZWFkX2ZpbGUoVE1QX0ZJTEUsMCxQSVBFX01BWCkpOworCSAgcm0oVE1QX0ZJTEUpOworCX0KKwllbHNlCisJICByZW5hbWUoVE1QX0ZJTEUscGlwZV9vZik7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisJVyhyZWFkX2ZpbGUoVE1QX0ZJTEUsMCxQSVBFX01BWCkpOworCXJtKFRNUF9GSUxFKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgV0RMTigiQ2Fubm90IHJlYWQgZmlsZShzKSIpOworICB9CisgIGVsc2UKKyAgeworICAgIHN0cmluZyAqdG1wOworICAgIGlmKGZpbGVfc2l6ZShwaXBlX2lmKTwwKQorICAgIHsKKyAgICAgIFdETE4oIk1pc3NpbmcgaW5wdXQgdG8geGdyZXAiKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBUSygiWGdyZXA6IHN0cjogIitzdHIrIiBtb2RlOiAiK21vZGUpOworICAgIHM9c2l6ZW9mKHRtcD1vbGRfZXhwbG9kZShyZWFkX2ZpbGUocGlwZV9pZiwwLFBJUEVfTUFYKSwiXG4iKSk7CisgICAgUElQRV9ERUxFVEUocGlwZV9vZik7CisgICAgZm9yKGk9MDtpPHM7aSsrKQorICAgIHsKKyAgICAgIC8vIFRLKHRtcFtpXSsiPC0+IitzdHIpOworICAgICAgaWYoc2l6ZW9mKHJlZ2V4cCgoeyhtb2RlJlhHUkVQX0lDQVNFP2xvd2VyX2Nhc2UodG1wW2ldKTp0bXBbaV0pfSksc3RyKSkpCisgICAgICB7CisJLy8gVEsoIlhncmVwOiBtYXRjaGVkISIpOworCWlmKCEobW9kZSZYR1JFUF9SRVZFUlQpKQorCSAgaWYocGlwZV9vdXQmJnBpcGVfb2YpCisJICAgIHdyaXRlX2ZpbGUocGlwZV9vZix0bXBbaV0rIlxuIik7CisJICBlbHNlCisJICAgIFdMTih0bXBbaV0pOworICAgICAgfQorICAgICAgZWxzZQorCWlmKG1vZGUmWEdSRVBfUkVWRVJUKQorCSAgaWYocGlwZV9vdXQmJnBpcGVfb2YpCisJICAgIHdyaXRlX2ZpbGUocGlwZV9vZix0bXBbaV0rIlxuIik7CisJICBlbHNlCisJICAgIFdMTih0bXBbaV0pOworICAgIH0KKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworaW50IFhoYmVhdHMoc3RyaW5nIHN0cikKK3sKKyAgb2JqZWN0IG9iajsKKyAgb2JqZWN0ICpoYmVhdGluZm87CisgIHN0cmluZyB0bXAsIGZpbGU7CisgIGludCBpLCBzOworICAKKyAgU0VDVVJFMihUUlVFKTsKKyAgVEsoIlhoYmVhdHM6IHN0cjogIisoc3RyP3N0cjoiKE5VTEwpIikpOworICBpZighcGlwZV9vdXQpCisgIHsKKyAgICBVU0FHRTEoc3RyLCAieGhiKGVhdHMpIFtzZWFyY2ggcGF0dGVybl0iKTsKKyAgICBpZighc3RyKQorICAgICAgc3RyPVJOQU1FKGNsb25lcik7CisgICAgZWxzZSBpZighcmVnZXhwKCh7ImR1bW15In0pLCBzdHIpKQorICAgIHsKKyAgICAgIFdETE4oIkJhZCByZWd1bGFyIGV4cHJlc3Npb24iKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBVU0FHRTEoc3RyLCJ4aGIoZWF0cykiKTsKKyAgICBpZihzdHImJnN0ciE9IiIpCisgICAgeworICAgICAgV0RMTigiTW9yZSBhcmd1bWVudHMgdGhhbiBleHBlY3RlZCIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisgIHM9c2l6ZW9mKGhiZWF0aW5mbz1oZWFydF9iZWF0X2luZm8oKSk7CisgIFBJUEVfREVMRVRFKHBpcGVfb2YpOworICBmb3IoaT0wOyBpPHM7IGkrKykKKyAgICBpZihoYmVhdGluZm9baV0mJm9iamVjdHAoaGJlYXRpbmZvW2ldKSkKKyAgICB7CisgICAgICB0bXA9T2JqRmlsZShoYmVhdGluZm9baV0pOworICAgICAgaWYoc2l6ZW9mKHJlZ2V4cCgoe3RtcH0pLCBzdHIpKSkKKwlpZihwaXBlX291dCYmcGlwZV9vZikKKwkgIHdyaXRlX2ZpbGUocGlwZV9vZiwgdG1wKyJcbiIpOworCWVsc2UKKwkgIFdMTih0bXApOworICAgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYaGVhZChzdHJpbmcgc3RyKQoreworICBpbnQgbGluZXM7CisgIHN0cmluZyAqdG1wLCBmaWxlOworCisgIFNFQ1VSRTIoVFJVRSk7CisgIFRLKCJYaGVhZDogc3RyOiAiKyhzdHI/c3RyOiIoTlVMTCkiKSk7CisgIGlmKCFwaXBlX2luKQorICB7CisgICAgVVNBR0UyKHN0ciwgInhoZWFkIDwtIz4gPGZpbGU+Iik7CisgICAgaWYoc3NjYW5mKHN0ciwiLSVkICVzIixsaW5lcyxmaWxlKSE9MikKKwlyZXR1cm4gRkFMU0U7CisgICAgaWYoIShmaWxlPVhGaW5kRmlsZShmaWxlKSkpCisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgZWxzZQorICB7CisgICAgVVNBR0UyKHN0ciwgInhoZWFkIDwtIz4iKTsKKyAgICBpZihzc2NhbmYoc3RyLCItJWQiLGxpbmVzKSE9MSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBpZiAoZmlsZV9zaXplKGZpbGU9cGlwZV9pZik8MCkKKyAgICB7CisgICAgICBXRExOKCJNaXNzaW5nIGlucHV0IHRvIHhoZWFkIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKyAgdG1wPW9sZF9leHBsb2RlKHJlYWRfZmlsZShmaWxlLDAsUElQRV9NQVgpLCJcbiIpWzAuLmxpbmVzLTFdOworICBpZihwaXBlX2luJiZwaXBlX2lmPT1QSVBFX0ZJTEUpCisgICAgcm0oUElQRV9GSUxFKTsKKyAgaWYgKHBpcGVfb3V0JiZwaXBlX29mKQorICB7CisgICAgUElQRV9ERUxFVEUocGlwZV9vZik7CisgICAgd3JpdGVfZmlsZShwaXBlX29mLGltcGxvZGUodG1wLCJcbiIpKyJcbiIpOworICB9CisgIGVsc2UKKyAgICBXRExOKGltcGxvZGUodG1wLCJcbiIpKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYaGVscChzdHJpbmcgc3RyKQoreworICBTRUNVUkUyKFRSVUUpOworICBVU0FHRTEoc3RyLCAieGhlKGxwKSIpOworICBYTW9yZUZpbGUoVE9PTF9NQU5QQUdFLCBGQUxTRSk7CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWGlkcyhzdHJpbmcgc3RyKQoreworICBvYmplY3Qgb2JqOworICAKKyAgU0VDVVJFMihUUlVFKTsKKyAgVVNBR0UyKHN0ciwgInhpZChzKSA8b2JqZWN0PiIpOworICBUSygiWGlkczogc3RyOiAiKyhzdHI/c3RyOiIoTlVMTCkiKSk7CisgIGlmKChvYmo9WEZpbmRPYmooc3RyKSkpCisgICAgV0xOKCJVSUQ9XCIiK2dldHVpZChvYmopKyJcIiAvIEVVSUQ9XCIiK2dldGV1aWQob2JqKSsiXCIiKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYaW5mbyhzdHJpbmcgc3RyKQoreworICBvYmplY3Qgb2JqOworICAKKyAgU0VDVVJFMihUUlVFKTsKKyAgVVNBR0UyKHN0ciwgInhpbmYobykgPG9iamVjdD4iKTsKKyAgVEsoIlhpbmZvOiBzdHI6ICIrKHN0cj9zdHI6IihOVUxMKSIpKTsKKyAgaWYoKG9iaj1YRmluZE9iaihzdHIpKSkKKyAgeworICAgIGlmKGlzX3BsYXllcihvYmopKQorICAgIHsKKyAgICAgIFdMTihQbGF5ZXJXaG8ob2JqKSk7CisgICAgICBXTE4oUGxheWVyTWFpbChvYmosIEZBTFNFKSk7CisgICAgICBXTE4oUGxheWVySVAob2JqLCBGQUxTRSkpOworICAgICAgV0xOKFBsYXllclJhY2Uob2JqLCBGQUxTRSkpOworICAgICAgV0xOKFBsYXllckRvbWFpbihvYmosIEZBTFNFKSk7CisgICAgICBXTE4oUGxheWVyU3RhdHMob2JqLCBGQUxTRSkpOworICAgICAgV0xOKFBsYXllclNub29wKG9iaiwgRkFMU0UpKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgV0RMTigiU29ycnksIHRoaXMgaXMgbm90IGEgcGxheWVyIik7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYaW5oZXJpdChzdHJpbmcgc3RyKQoreworICBpbnQgczsKKyAgb2JqZWN0IG9iajsKKyAgc3RyaW5nICpzdHJzLCAqaW5saXN0OworICAKKyAgU0VDVVJFMihUUlVFKTsKKyAgVVNBR0UyKHN0ciwgInhpbmgoZXJpdCkgPG9iamVjdD4gW2Z1bmN0aW9uXSIpOworICBUSygiWGluaGVyaXQ6IHN0cjogIitzdHIpOworICBpZighKHN0cnM9c3RyaXBfZXhwbG9kZShzdHIsICIgIikpKQorICAgIHJldHVybiBGQUxTRTsKKyAgaWYob2JqPVhGaW5kT2JqKHN0cnNbMF0pKQorICB7CisgICAgaW5saXN0PWluaGVyaXRfbGlzdChvYmopOworICAgIHM9c2l6ZW9mKGlubGlzdCk7CisgICAgd2hpbGUocy0tKQorICAgIHsKKyAgICAgIGlmKGNhdGNoKGNhbGxfb3RoZXIoaW5saXN0W3NdLCAiPz8/IikpKQorICAgICAgeworCVdETE4oIkZhaWxlZCB0byBsb2FkIGFsbCBpbmhlcml0YW5jZSBvYmplY3RzIik7CisJcmV0dXJuIFRSVUU7CisgICAgICB9CisgICAgfQorICAgIG9iaj1maW5kX29iamVjdChpbmxpc3RbMF0pOworICAgIFBJUEVfREVMRVRFKHBpcGVfb2YpOworICAgIGlmKHNpemVvZihzdHJzKT09MSkKKyAgICAgIEluaGVyaXRhbmNlKG9iaiAsMCAsIiIpOworICAgIGVsc2UKKyAgICAgIEluaGVyaXRhbmNlKG9iaiwgc3Ryc1sxXSwgIiIpOworICB9CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWGludmVudG9yeShzdHJpbmcgc3RyKQoreworICBpbnQgaSwgc2hvcnQ7CisgIG9iamVjdCBpdGVtOworICBtaXhlZCB3aG87CisgIAorICBTRUNVUkUyKFRSVUUpOworICBVU0FHRTEoc3RyLCAieGkgWy1zXSBbcGxheWVyXSIpOworICBUSygiWGludmVudG9yeTogc3RyOiAiK3N0cik7CisgIHNob3J0PTA7CisgIHdobz1jbG9uZXI7CisgIGlmKHN0ciYmc3RyIT0iIikKKyAgeworICAgIGlmKHN0cj09Ii1zIikKKyAgICB7CisgICAgICBzaG9ydD0xOworICAgICAgd2hvPWNsb25lcjsKKyAgICB9CisgICAgZWxzZSBpZihzc2NhbmYoc3RyLCItcyAlcyIsd2hvKSkKKyAgICB7CisgICAgICBzaG9ydD0xOworICAgICAgd2hvPVhGaW5kT2JqKHdobyk7CisgICAgfQorICAgIGVsc2UgaWYoc3NjYW5mKHN0ciwiJXMiLHdobykpCisgICAgeworICAgICAgc2hvcnQ9MDsKKyAgICAgIHdobz1YRmluZE9iaih3aG8pOworICAgIH0KKyAgICBlbHNlCisgICAgICB3aG89Y2xvbmVyOworICB9CisgIGlmKCF3aG8pCisgICAgcmV0dXJuIEZBTFNFOworICBQSVBFX0RFTEVURShwaXBlX29mKTsKKyAgaWYoIShwaXBlX291dCYmcGlwZV9vZikpCisgICAgV0xOKHdoby0+bmFtZShXRVNTRU4pKyIgSW52ZW50b3J5OiIrKHNob3J0PyIgKHNob3J0KSI6IiIpKTsKKyAgaWYoIXNob3J0KQorICAgIGlmKHBpcGVfb3V0JiZwaXBlX29mKQorICAgICAgRk9SQUxMKGl0ZW0sIHdobykgUHJpbnRTaG9ydChBUklHSFQoKytpKyIuICIsIDQsICIgIiksIGl0ZW0sIHBpcGVfb2YpOworICAgIGVsc2UKKyAgICAgIEZPUkFMTChpdGVtLCB3aG8pIFByaW50U2hvcnQoQVJJR0hUKCsraSsiLiAiLCA0LCAiICIpLCBpdGVtKTsKKyAgZWxzZQorICAgIGlmKHBpcGVfb3V0JiZwaXBlX29mKQorICAgICAgRk9SQUxMKGl0ZW0sIHdobykgd3JpdGVfZmlsZShwaXBlX29mLCsraSsiLiBbIitvYmplY3RfbmFtZShpdGVtKSsiXVxuIik7CisgICAgZWxzZQorICAgICAgRk9SQUxMKGl0ZW0sIHdobykgV0xOKCsraSsiLiBbIitvYmplY3RfbmFtZShpdGVtKSsiXSIpOworICByZXR1cm4gVFJVRTsKK30KKworaW50IFhsYWcoc3RyaW5nIHN0cikKK3sKKyAgaW50IGk7CisgIGZsb2F0ICpsYWc7CisgIG9iamVjdCBkYWVtb247CisgIHN0cmluZyBsYWdzOworCisgIGlmKGZpbGVfc2l6ZShMQUdfT19EQUVNT04rIi5jIik8PTApCisgIHsKKyAgICBXTE4oIlNvcnJ5LCBsYWctby1kYWVtb24gaXMgbWlzc2luZyEiKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICAKKyAgTEFHX09fREFFTU9OLT5NYWNoSGluKCk7CisgIGlmKCEoZGFlbW9uPWZpbmRfb2JqZWN0KExBR19PX0RBRU1PTikpKQorICAgIGxhZz0oey0xLjAsLTEuMCwtMS4wfSk7CisgIGVsc2UKKyAgICBsYWc9KGZsb2F0ICopZGFlbW9uLT5yZWFkX2xhZ19kYXRhKCk7CisgIGxhZ3M9IkxldHp0ZSA2MCBtaW46ICI7CisgIGlmKGxhZ1swXT49MC4wKQorICB7CisgICAgZm9yKGk9cm91bmQobGFnWzBdKS0xO2k+PTA7aS0tKQorICAgICAgbGFncys9IiMiOworICAgIGxhZ3MrPSIgKCIrc3ByaW50ZigiJS4xZiIsbGFnWzBdKSsiJSkiOworICB9CisgIGVsc2UKKyAgICBsYWdzKz0iTi9BIjsKKyAgbGFncys9IlxuTGV0enRlIDE1IG1pbjogIjsKKyAgaWYobGFnWzFdPj0wLjApCisgIHsKKyAgICBmb3IoaT1yb3VuZChsYWdbMV0pLTE7aT49MDtpLS0pCisgICAgICBsYWdzKz0iIyI7CisgICAgbGFncys9IiAoIitzcHJpbnRmKCIlLjFmIixsYWdbMV0pKyIlKSI7CisgIH0KKyAgZWxzZQorICAgIGxhZ3MrPSJOL0EiOworICBsYWdzKz0iXG5MZXR6dGUgTWludXRlOiAiOworICBpZihsYWdbMl0+PTAuMCkKKyAgeworICAgIGZvcihpPXJvdW5kKGxhZ1syXSktMTtpPj0wO2ktLSkKKyAgICAgIGxhZ3MrPSIjIjsKKyAgICBsYWdzKz0iICgiK3NwcmludGYoIiUuMWYiLGxhZ1syXSkrIiUpIjsKKyAgfQorICBlbHNlCisgICAgbGFncys9Ik4vQSI7CisgIFdMTihsYWdzKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYbGlnaHQoc3RyaW5nIHN0cikKK3sKKyAgaW50IHMsIGFkZGxpZ2h0OworCisgIFNFQ1VSRTIoVFJVRSk7CisgIFVTQUdFMShzdHIsICJ4bGkoZ2h0KSBbbGlnaHRdIik7CisgIGlmKHN0cikKKyAgeworICAgIGlmKCFzc2NhbmYoc3RyLCAiJWQiLCBhZGRsaWdodCkpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgeGxpZ2h0Kz1hZGRsaWdodDsKKyAgICBjbG9uZXItPkFkZEludExpZ2h0KGFkZGxpZ2h0KTsKKyAgfQorICBXRExOKCJDdXJyZW50IGxpZ2h0IGxldmVsczogIitUT09MX05BTUUrIj0iK3hsaWdodCsiLCByb29tPSIrCisgICAgICAgRU5WKGNsb25lciktPlF1ZXJ5SW50TGlnaHQoKSk7CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWGxvYWQoc3RyaW5nIHN0cikKK3sKKyAgaW50IGksIGY7CisgIG9iamVjdCBvYmosICppbnYsIHZyb29tOworICBzdHJpbmcgZmlsZSwgZXJybG9nLCBlcnJvciwgKnN0cnM7CisgIAorICBTRUNVUkUyKFRSVUUpOworICBVU0FHRTIoc3RyLCAieGxvYShkKSA8ZmlsZW5hbWU+Iik7CisgIGlmKCEoZmlsZT1YRmluZEZpbGUoc3RyKSkpCisgICAgcmV0dXJuIFRSVUU7CisgIGVycmxvZz1FUlJfRklMRTsKKyAgaWYoZmlsZV9zaXplKGVycmxvZyk+MCkKKyAgICBybShlcnJsb2cpOworICBpZihvYmo9ZmluZF9vYmplY3QoZmlsZSkpCisgIHsKKyAgICBpZihjYXRjaChjYWxsX290aGVyKFZPSUQsICI/Pz8iKSkpCisgICAgeworICAgICAgV0RMTigiRXJyb3I6IGNhbm5vdCBmaW5kICIrVk9JRCsiIHRvIHJlc2N1ZSBwbGF5ZXJzIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgZWxzZQorICAgICAgdnJvb20gPSBmaW5kX29iamVjdChWT0lEKTsKKyAgICBpZihpbnY9ZmlsdGVyKGFsbF9pbnZlbnRvcnkob2JqKSwgIydpc19wbGF5ZXIsIE1FKSkvLycKKyAgICAgIGZvcihpPTA7IGk8c2l6ZW9mKGludik7IGkrKykKKwlNb3ZlT2JqKGludltpXSwgdnJvb20sIFRSVUUpOworICAgIERlc3RydWN0KG9iaik7CisgICAgV0xOKCJVcGRhdGUgYW5kIGxvYWQ6ICIrZmlsZSk7CisgIH0KKyAgZWxzZQorICAgIFdMTigiTG9hZDogIitmaWxlKTsKKyAgaWYoZXJyb3I9Y2F0Y2goY2FsbF9vdGhlcihmaWxlLCAiPz8/IikpKQorICB7CisgICAgVygiRXJyb3I6ICIrZXJyb3JbMS4uXSk7CisgICAgaWYodnJvb20pCisgICAgICB0ZWxsX29iamVjdCh2cm9vbSwgIioqKiBGYWlsZWQgdG8gbG9hZCByb29tLiBZb3UgYXJlIGluIHRoZSB2b2lkIVxuIik7CisgIH0KKyAgZWxzZSBpZihpbnYpCisgIHsKKyAgICBvYmo9ZmluZF9vYmplY3QoZmlsZSk7CisgICAgZm9yKGk9MDsgaTxzaXplb2YoaW52KTsgaSsrKQorICAgICAgaWYoaW52W2ldKQorCU1vdmVPYmooaW52W2ldLCBvYmosIFRSVUUpOworICB9CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWGxvb2soc3RyaW5nIHN0cikKK3sKKyAgb2JqZWN0IG9iajsKKyAgc3RyaW5nIHN0OworICBzdHJpbmcgZmlsZTsKKyAgCisgIFNFQ1VSRTIoVFJVRSk7CisgIFVTQUdFMShzdHIsICJ4bG9vKGspIFtvYmplY3RdIik7CisgIFRLKCJYbG9vazogc3RyOiAiK3N0cik7CisgIFBJUEVfREVMRVRFKHBpcGVfb2YpOworICBmaWxlID0gcGlwZV9vdXQmJnBpcGVfb2YgPyBwaXBlX29mIDogIiI7CisgIGlmKHN0ciYmc3RyIT0iIikKKyAgeworICAgIGlmKChvYmo9WEZpbmRPYmooc3RyKSkpCisgICAgICBQcmludE9iaihvYmosZmlsZSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgb2JqPUVOVihjbG9uZXIpOworICAgIFByaW50T2JqKG9iaixmaWxlKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworaW50IFhscGMoc3RyaW5nIHN0cikKK3sKKyAgb2JqZWN0IG9iajsKKyAgc3RyaW5nIGZpbGUsIGVycm9yOworICBpbnQgKnJ1MSwgKnJ1MiwgdGltZTsKKyAgbWl4ZWQgcmVzOworICAKKyAgU0VDVVJFMihUUlVFKTsKKyAgVVNBR0UyKHN0ciwgInhscChjKSA8bHBjIGNvZGU+Iik7CisgIGZpbGU9TFBDX0ZJTEUrIi5jIjsKKyAgaWYoZmlsZV9zaXplKGZpbGUpPjApCisgICAgcm0oZmlsZSk7CisgIGlmKG9iaj1maW5kX29iamVjdChMUENfRklMRSkpCisgICAgRGVzdHJ1Y3Qob2JqKTsKKyAgd3JpdGVfZmlsZShmaWxlLAorICAgICAgIiNwcmFnbWEgbm9fd2Fybl9taXNzaW5nX3JldHVybixzdHJvbmdfdHlwZXMsd2Fybl9kZXByZWNhdGVkLHJ0dF9jaGVja3NcbiIKKyAgICAgICIjaW5jbHVkZSA8cHJvcGVydGllcy5oPlxuIgorICAgICAgIiNpbmNsdWRlIDx0aGluZy9wcm9wZXJ0aWVzLmg+XG4iCisgICAgICAiI2luY2x1ZGUgPGRlZmluZXMuaD5cbiIKKyAgICAgICIjaW5jbHVkZSA8d2l6bGlzdC5oPlxuIgorICAgICAgIiNpbmNsdWRlIDxtb3ZpbmcuaD5cbiIKKyAgICAgICIjaW5jbHVkZSBcIi9zZWN1cmUvd2l6bGV2ZWxzLmhcIlxuIgorICAgICAgKyhmaWxlX3NpemUoUFJJVkFURV9IRUFERVIpPj0wPyIjaW5jbHVkZSBcIiIrUFJJVkFURV9IRUFERVIrIlwiXG4iOiIiKSsKKyAgICAgICJvYmplY3QgZ2V0KHN0cmluZyBzdHIpe3JldHVybiBwcmV2aW91c19vYmplY3QoKS0+WEZpbmRPYmooc3RyKTt9XG4iKworICAgICAgIm1peGVkIGV2YWwobWl4ZWQgbWUsIG1peGVkIGhlcmUpeyIrc3RyKyJ9Iik7CisgIGlmKGVycm9yPWNhdGNoKG9iaj1jbG9uZV9vYmplY3QoZmlsZSkpKQorICAgIFcoIkVycm9yOiAiK2Vycm9yWzEuLjBdKTsKKyAgZWxzZQorICB7CisgICAgcnUxPXJ1c2FnZSgpOworICAgIGVycm9yPWNhdGNoKHJlcz0obWl4ZWQpb2JqLT5ldmFsKGNsb25lciwgRU5WKGNsb25lcikpKTsKKyAgICBydTI9cnVzYWdlKCk7CisgICAgaWYoZXJyb3IpCisgICAgICBXKCJFcnJvcjogIitlcnJvclsxLi5dKTsKKyAgICBlbHNlCisgICAgeworICAgICAgdGltZT1ydTJbMF0tcnUxWzBdK3J1MlsxXS1ydTFbMV07CisgICAgICBXRExOKCJFdmFsdWF0aW9uIHRpbWU6ICIrKHRpbWU8MCA/IDAgOiB0aW1lKSsiIG1zIik7CisgICAgICBXTE4oIlJlc3VsdDogIittaXhlZF90b19zdHJpbmcocmVzLCBNQVhfUkVDVVJTSU9OKSk7CisgICAgICBpZihvYmplY3RwKHJlcykpCisgICAgICAgIHZhcmlhYmxlWyJyZXN1bHQiXSA9IHJlczsKKyAgICB9CisgIH0KKyAgcm0oZmlsZSk7CisgIGlmKG9iaikKKyAgICBEZXN0cnVjdChvYmopOworICByZXR1cm4gVFJVRTsKK30KKworaW50IFhtYW4oc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIG1hbnBhZ2U7CisgIGludCBpLCBmb3VuZDsKKyAgCisgIFNFQ1VSRTIoVFJVRSk7CisgIFVTQUdFMihzdHIsICJ4bWEobikgPG1hbnBhZ2U+Iik7CisgIFcoIk1hbjogIik7CisgIGZvcihpPTAsIGZvdW5kPTA7IGk8c2l6ZW9mKG1hbnBhdGgpOyBpKyspCisgIHsKKyAgICBtYW5wYWdlPW1hbnBhdGhbaV0rc3RyOworICAgIGlmKGZpbGVfc2l6ZShtYW5wYWdlKT49MCkKKyAgICB7CisgICAgICBXTE4obWFucGFnZSk7CisgICAgICBYTW9yZUZpbGUobWFucGFnZSwgRkFMU0UpOworICAgICAgZm91bmQ9MTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZighZm91bmQpCisgICAgV0xOKCItIG5vIGhlbHAgYXZhaWxhYmxlIC0iKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYbW9yZShzdHJpbmcgc3RyKQoreworICBzdHJpbmcgKmFyZ3MsIGZpbGU7CisgIGludCBsaW5lOworICAKKyAgU0VDVVJFMihUUlVFKTsKKyAgVEsoIlhtb3JlOiBzdHI6ICIrc3RyKTsKKyAgaWYgKCFwaXBlX2luKQorICB7CisgICAgVVNBR0UyKHN0ciwgInhtb3IoZSkgPGZpbGVuYW1lPiBbc3RhcnRdIik7CisgICAgc3dpdGNoKHNpemVvZihhcmdzPXN0cmlwX2V4cGxvZGUoc3RyLCAiICIpKSkKKyAgICB7CisgICAgICBjYXNlIDE6CisgICAgICBtb3Jlb2Zmc2V0PTE7CisgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjoKKyAgICAgIHNzY2FuZihhcmdzWzFdLCAiJWQiLCBsaW5lKTsKKyAgICAgIG1vcmVvZmZzZXQ9IGxpbmU+MCA/IGxpbmUgOiAxOworICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBpZihmaWxlPVhGaW5kRmlsZShhcmdzWzBdKSkKKyAgICAgIFhNb3JlRmlsZShmaWxlLCBUUlVFKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBpZihmaWxlX3NpemUocGlwZV9pZik8MCkKKyAgICB7CisgICAgICBXRExOKCJNaXNzaW5nIGlucHV0IHRvIHhtb3JlIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgaWYgKCFzdHJ8fHN0cj09IiIpCisgICAgICBsaW5lPTE7CisgICAgZWxzZSBpZiAoc3NjYW5mKHN0ciwgIiVkIiwgbGluZSkhPTEpCisgICAgICBVU0FHRTMoInhtb3IoZSkgW3N0YXJ0XSIpOworICAgIG1vcmVvZmZzZXQ9IGxpbmU+MCA/IGxpbmUgOiAxOworICAgIFhNb3JlRmlsZShwaXBlX2lmLCBUUlVFKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworaW50IFhtb3ZlKHN0cmluZyBzdHIpCit7CisgIG9iamVjdCBvYmoxLCBvYmoyOworICBzdHJpbmcgd2hhdCwgaW50bzsKKyAgCisgIFNFQ1VSRTIoVFJVRSk7CisgIFVTQUdFMihzdHIsICJ4bW92KGUpIDxvYmplY3Q+IGludG8gPG9iamVjdD4iKTsKKyAgaWYoKHNzY2FuZihzdHIsICIlcyBpbnRvICVzIiwgd2hhdCwgaW50byk9PTIpJiYKKyAgICAgKG9iajE9WEZpbmRPYmood2hhdCkpJiYob2JqMj1YRmluZE9iaihpbnRvKSkpCisgICAgTW92ZU9iaihvYmoxLCBvYmoyLCBGQUxTRSk7CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWG1zZyhzdHJpbmcgc3RyKQoreworICBzdHJpbmcgdG1wOworICAKKyAgU0VDVVJFMihUUlVFKTsKKyAgVEsoIlhtc2c6IHN0cjogIitzdHIpOworICBVU0FHRTEoc3RyLCAieG1zKGcpIFt0byA8b2JqZWN0PnxhbGxdIik7CisgIGlmKCFzdHJ8fHN0cj09IiIpCisgIHsKKyAgICBXRExOKCJTZW5kIG1lc3NhZ2UgaW50byByb29tIik7CisgICAgc2F5KCJNZXNzYWdlIGZyb20gIitDUk5BTUUoY2xvbmVyKSsiOlxuIik7CisgICAgaWYocGlwZV9pbiYmcGlwZV9pZikKKyAgICAgIHNheShyZWFkX2ZpbGUocGlwZV9pZiwwLFBJUEVfTUFYKSk7CisgICAgZWxzZQorICAgIHsKKyAgICAgIFdETE4oIkVuZCBtZXNzYWdlIHdpdGggXCIuXCIgb3IgXCIqKlwiIik7CisgICAgICBpbnB1dF90bygiWE1zZ1NheSIpOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBlbHNlIGlmKHNzY2FuZihzdHIsICJ0byAlcyIsIHRtcCkpCisgIHsKKyAgICBpZihtc2d0bz1YRmluZE9iaih0bXApKQorICAgIHsKKyAgICAgIFByaW50U2hvcnQoIlNlbmQgbWVzc2FnZSB0bzogIiwgbXNndG8pOworICAgICAgdGVsbF9vYmplY3QobXNndG8sICJNZXNzYWdlIGZyb20gIitDUk5BTUUoY2xvbmVyKSsiIHRvIHlvdTpcbiIpOworICAgICAgaWYocGlwZV9pbiYmcGlwZV9pZikKKwl0ZWxsX29iamVjdChtc2d0byxyZWFkX2ZpbGUocGlwZV9pZiwwLFBJUEVfTUFYKSk7CisgICAgICBlbHNlCisgICAgICB7CisJV0RMTigiRW5kIG1lc3NhZ2Ugd2l0aCBcIi5cIiBvciBcIioqXCIiKTsKKwlpbnB1dF90bygiWE1zZ1RlbGwiKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgZWxzZSBpZihzdHI9PSJhbGwiKQorICB7CisgICAgV0RMTigiU2VuZCBtZXNzYWdlIHRvIGFsbCBwbGF5ZXJzIik7CisgICAgc2hvdXQoIk1lc3NhZ2UgZnJvbSAiK0NSTkFNRShjbG9uZXIpKyIgdG8gYWxsOlxuIik7CisgICAgaWYocGlwZV9pbiYmcGlwZV9pZikKKyAgICAgIHNob3V0KHJlYWRfZmlsZShwaXBlX2lmLDAsUElQRV9NQVgpKTsKKyAgICBlbHNlCisgICAgeworICAgICAgV0RMTigiRW5kIG1lc3NhZ2Ugd2l0aCBcIi5cIiBvciBcIioqXCIiKTsKKyAgICAgIGlucHV0X3RvKCJYTXNnU2hvdXQiKTsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorCitpbnQgWG10cChzdHJpbmcgc3RyKQoreworICBpbnQgczsKKyAgc3RyaW5nICpzdHJzLCBvcHQsIGRpciwgZmlsZTsKKworICBTRUNVUkUyKFRSVUUpOworICBVU0FHRTIoc3RyLCAieG10KHApIFtvcHRpb25zXSA8ZGlyZWN0b3J5PiA8ZmlsZW5hbWU+Iik7CisgIHM9c2l6ZW9mKHN0cnM9b2xkX2V4cGxvZGUoc3RyLCAiICIpKTsKKyAgaWYoczwyKQorICAgIHJldHVybiBGQUxTRTsKKyAgZWxzZSBpZihzPT0yKQorICAgIG9wdD0iIjsKKyAgZWxzZQorICAgIG9wdD1pbXBsb2RlKHN0cnNbMC4ucy0zXSwgIiAiKTsKKyAgaWYoIShkaXI9Ii8iKyhzdHJpbmcpTUFTVEVSLT52YWxpZF9yZWFkKHN0cnNbcy0yXSwgZ2V0ZXVpZCgpLAorCQkJCQkgICJnZXRfZGlyIiwgTUUpKSkgeworICAgIFdETE4oIk5vIHBlcm1pc3Npb24gdG8gb3BlbiBkaXJlY3RvcnkgZm9yIHJlYWRpbmciKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZighKGZpbGU9Ii8iKyhzdHJpbmcpTUFTVEVSLT52YWxpZF93cml0ZShzdHJzW3MtMV0sIGdldGV1aWQoKSwKKwkJCQkJICAgICJ3cml0ZV9maWxlIiwgTUUpKSkgeworICAgIFdETE4oIk5vIHBlcm1pc3Npb24gdG8gb3BlbiBzY3JpcHQgZmlsZSBmb3Igd3JpdGluZyIpOworICAgIHJldHVybiBUUlVFOworICB9CisgIGlmKGZpbGVfc2l6ZShkaXIpIT0tMiB8fCBmaWxlX3NpemUoZmlsZSk9PS0yKQorICAgIHJldHVybiBGQUxTRTsKKyAgWG10cFNjcmlwdChkaXIsIGZpbGUsIG9wdCk7CisgIFdETE4oIkRvbmUiKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYcHJvYyhzdHJpbmcgc3RyKQoreworICBpbnQgczsKKyAgc3RyaW5nICpzdHJzOworCisgIFNFQ1VSRTIoVFJVRSk7CisgIFVTQUdFMShzdHIsICJ4cHJvYyBbLWNdIFstbF0gWy1tXSBbLXVdIFstdl0iKTsKKworICBpZihmaWxlX3NpemUoVE9PTF9QQVRIKyIvcHJvYyIpIT0tMikKKyAgeworICAgIFdMTigiU29ycnksIG5vIC9wcm9jIGluZm9ybWF0aW9uIGF2YWlsYWJsZSEiKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICAKKyAgaWYoIXN0cnx8c3RyPT0iInx8IShzPXNpemVvZihzdHJzPW9sZF9leHBsb2RlKHN0ciwgIiAiKSkpKQorICB7CisgICAgV0xOKCJMb2FkIGF2ZXJhZ2VzOiIpOworICAgIGNhdChUT09MX1BBVEgrIi9wcm9jL2xvYWRhdmciKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICAKKyAgd2hpbGUocz1zaXplb2Yoc3RycykpCisgIHsKKyAgICBzd2l0Y2goc3Ryc1swXSkKKyAgICB7CisgICAgICBjYXNlICItYyI6CisgICAgICBXTE4oIkNQVSBpbmZvOiIpOworICAgICAgY2F0KFRPT0xfUEFUSCsiL3Byb2MvY3B1aW5mbyIpOworICAgICAgYnJlYWs7CisgICAgICBjYXNlICItbCI6CisgICAgICBXTE4oIkxvYWQgYXZlcmFnZXM6Iik7CisgICAgICBjYXQoVE9PTF9QQVRIKyIvcHJvYy9sb2FkYXZnIik7CisgICAgICBicmVhazsKKyAgICAgIGNhc2UgIi1tIjoKKyAgICAgIFdMTigiTWVtb3J5IHVzYWdlOiIpOworICAgICAgY2F0KFRPT0xfUEFUSCsiL3Byb2MvbWVtaW5mbyIpOworICAgICAgYnJlYWs7CisgICAgICBjYXNlICItdSI6CisgICAgICBXTE4oIlVwdGltZToiKTsKKyAgICAgIGNhdChUT09MX1BBVEgrIi9wcm9jL3VwdGltZSIpOworICAgICAgYnJlYWs7CisgICAgICBjYXNlICItdiI6CisgICAgICBXTE4oIlZlcnNpb246Iik7CisgICAgICBjYXQoVE9PTF9QQVRIKyIvcHJvYy92ZXJzaW9uIik7CisgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICBXTE4oIlVua25vd24gb3B0aW9uOiAiK3N0cnNbMF0pOworICAgIH0KKyAgICBzdHJzPXN0cnNbMS4uXTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworaW50IFhwcm9mKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyAqZnVuY3MsIGluaCwgdG1wOworICBtaXhlZCAqZGF0YSwgKmQ7CisgIG1hcHBpbmcgeHByOworICBvYmplY3Qgb2JqOworICBpbnQgaSwgcm47CisKKyAgU0VDVVJFMihUUlVFKTsKKyAgVVNBR0UyKHN0ciwgInhwcm9mIDw8LWM+fDwtQz4gPGZpbGU+Pnw8b2JqZWN0PiIpOworICBpZihzdHJbMC4uMl09PSItYyAifHxzdHJbMC4uMl09PSItQyAiKQorICB7CisgICAgcm49KHN0clsxXT09J0MnKTsKKyAgICBpZihzdHI9WEZpbmRGaWxlKHN0clszLi5dKSkKKyAgICB7CisgICAgICBpbmg9c3RyPXN0clswLi48M107CisgICAgICBpZihvYmo9ZmluZF9vYmplY3QoaW5oKSkKKwlEZXN0cnVjdChvYmopOworICAgICAgaWYoY2F0Y2goY2FsbF9vdGhlcihpbmgsIj8/PyIpKSkKKwlyZXR1cm4gVFJVRTsKKyAgICAgIG9iaj1maW5kX29iamVjdChpbmgpOworICAgICAgaWYocm4pCisgICAgICB7CisJaW5oKz0iLnhwcm9mLmMiOworCXJtKGluaCk7CisJc3RyKz0iLmMiOworCXJlbmFtZShzdHIsIGluaCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisJc3RyPVhQUk9GX0ZJTEU7CisJcm0oc3RyKTsKKyAgICAgIH0KKyAgICAgIHRtcD0iaW5oZXJpdCBcIiIraW5oKyJcIjtcbiNpbmNsdWRlIFwiIitYUFJPRl9NQUNSTysiXCJcbiI7CisgICAgICBmdW5jcz1tX2luZGljZXMobWttYXBwaW5nKGZ1bmN0aW9ubGlzdChvYmosIDB4MDgwMDAwMDEpKSktKHsiX19JTklUIn0pOworICAgICAgZm9yKGk9c2l6ZW9mKGZ1bmNzKTsgaS0tOykKKwl0bXArPSJGKCIrZnVuY3NbaV0rIixcIiIrZnVuY3NbaV0rIlwiLCIrCisJICAiKEEwLEExLEEyLEEzLEE0LEE1LEE2LEE3LEE4LEE5KSlcbiI7CisgICAgICB3cml0ZV9maWxlKHN0ciwgdG1wKTsKKyAgICAgIFdETE4oIkRvbmUiKTsKKyAgICB9CisgIH0KKyAgZWxzZSBpZihvYmo9WEZpbmRPYmooc3RyKSkKKyAgeworICAgIGlmKHhwcj0obWFwcGluZylvYmotPl9fcXVlcnlfeHByb2ZfZGF0YV9fKCkpCisgICAgeworICAgICAgZnVuY3M9bV9pbmRpY2VzKHhwcik7CisgICAgICBkYXRhPW1fdmFsdWVzKHhwcik7CisgICAgICBybShUTVBfRklMRSk7CisgICAgICBzdHI9IkV2YWx1YXRpb24gY29zdCBwZXIgZnVuY3Rpb246XG5OQU1FCQkJICAgIisKKwkiIENBTExTIHwgIFRPVC5FWENMLiAgVE9ULklOQ0wuIHwgUkVMLkVYQ0wuIFJFTC5JTkNMLlxuIjsKKyAgICAgIGZvcihpPXNpemVvZihmdW5jcyk7IGktLTspCisgICAgICB7CisJaWYoZD1kYXRhW2ldKSB7CisJICBmdW5jc1tpXT1BTEVGVCgiIitmdW5jc1tpXSsiICIsMjUsIi4iKStBUklHSFQoIiAiK2RbMF0sIDYsIi4iKSsiIHwgIisKKwkgICAgQVJJR0hUKCIgIitkWzFdLDEwLCIuIikJKyIgIitBUklHSFQoIiAiK2RbM10sMTAsIi4iKSsiIHwgIisKKwkgICAgQVJJR0hUKCIgIitkWzFdL2RbMF0sOSwiLiIpICsiICIrQVJJR0hUKCIgIitkWzNdL2RbMF0sOSwiLiIpOworCX0KKyAgICAgIH0KKyAgICAgIHN0cis9aW1wbG9kZShzb3J0X2FycmF5KGZ1bmNzLCAic3RyaW5nX2NvbXBhcmUiLCBNRSksIlxuIikrIlxuIjsKKyAgICAgIHdyaXRlX2ZpbGUoVE1QX0ZJTEUsc3RyKTsKKyAgICAgIHN0cj0iXG5FbGFwc2VkIHRpbWUgcGVyIGZ1bmN0aW9uOlxuTkFNRQkJCSAgIisKKwkiIENBTExTIHwgIFRPVC5FWENMLiAgVE9ULklOQ0wuIHwgUkVMLkVYQ0wuIFJFTC5JTkNMLlxuIjsKKyAgICAgIGZ1bmNzPW1faW5kaWNlcyh4cHIpOworICAgICAgZm9yKGk9c2l6ZW9mKGZ1bmNzKTsgaS0tOykKKyAgICAgIHsKKwlpZihkPWRhdGFbaV0pCisJeworCSAgZnVuY3NbaV09QUxFRlQoIiIrZnVuY3NbaV0rIiAiLDI1LCIuIikrQVJJR0hUKCIgIitkWzBdLCA2LCIuIikrIiB8ICIrCisJICAgIEFSSUdIVCgiICIrKGRbMl0rNSkvMTArIm1zIiwxMCwiLiIpKyIgIisKKwkgICAgQVJJR0hUKCIgIisoZFs0XSs1KS8xMCsibXMiLDEwLCIuIikrIiB8ICIrCisJICAgIEFSSUdIVCgiICIrZFsyXS9kWzBdKyJ1cyIsOSwiLiIpKyIgIisKKwkgICAgQVJJR0hUKCIgIitkWzRdL2RbMF0rInVzIiw5LCIuIik7CisJfQorICAgICAgfQorICAgICAgc3RyKz1pbXBsb2RlKHNvcnRfYXJyYXkoZnVuY3MsICJzdHJpbmdfY29tcGFyZSIsIE1FKSwiXG4iKSsiXG4iOworICAgICAgd3JpdGVfZmlsZShUTVBfRklMRSxzdHIpOworICAgICAgWE1vcmVGaWxlKFRNUF9GSUxFLCBGQUxTRSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIFdETE4oIk5vIHByb2ZpbGluZyBpbmZvcm1hdGlvbiBhdmFpbGFibGUiKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworaW50IFhwcm9wcyhzdHJpbmcgc3RyKQoreworICBpbnQgaSwgcywgZmxhZzsKKyAgb2JqZWN0IG9iajsKKyAgc3RyaW5nICp0bXA7CisgIAorICBTRUNVUkUyKFRSVUUpOworICBVU0FHRTIoc3RyLCAieHByb3AocykgWy1mfC1tXSA8b2JqZWN0PiIpOworICBUSygiWHByb3BzOiBzdHI6ICIrc3RyKTsKKyAgdG1wPW9sZF9leHBsb2RlKHN0ciwiICIpOworICBzd2l0Y2godG1wWzBdKQorICB7CisgICAgY2FzZSAiLWYiOgorICAgIHsKKyAgICAgIGZsYWcgPSAxOworICAgICAgdG1wPXRtcFsxLi5dOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgIi1tIjoKKyAgICB7CisgICAgICBmbGFnID0gMjsKKyAgICAgIHRtcD10bXBbMS4uXTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBzdHI9aW1wbG9kZSh0bXAsIiAiKTsKKyAgaWYoKG9iaj1YRmluZE9iaihzdHIpKSkKKyAgICBEdW1wUHJvcGVydGllcyhvYmosZmxhZyk7CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWHF1aXQoc3RyaW5nIHN0cikKK3sKKyAgU0VDVVJFMihUUlVFKTsKKyAgVVNBR0UxKHN0ciwgInhxdShpdCkiKTsKKyAgc3RyPW9iamVjdF9uYW1lKEVOVihjbG9uZXIpKTsKKyAgaWYobWVtYmVyKHN0ciwgJyMnKTwwKQorICAgIGNsb25lci0+c2V0X2hvbWUoc3RyKTsKKyAgY2xvbmVyLT5xdWl0KCk7CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWHNjYW4oc3RyaW5nIHN0cikKK3sgIAorICBTRUNVUkUyKFRSVUUpOworICBVU0FHRTEoc3RyLCAieHNjKGFuKSIpOworICBXKCJEZXN0cnVjdGVkIHZhcmlhYmxlKHMpOiAiKTsKKyAgc3RyaW5nKiBvbGR2YXJzPW1faW5kaWNlcyh2YXJpYWJsZSk7CisgIFZhckNoZWNrKEZBTFNFKTsKKyAgc3RyaW5nKiBkZXN2YXJzPW9sZHZhcnMtbV9pbmRpY2VzKHZhcmlhYmxlKTsKKyAgZGVzdmFycyA9IG1hcChkZXN2YXJzLCBmdW5jdGlvbiBzdHJpbmcgKHN0cmluZyBrKQorICAgICAge3JldHVybiAiJCIrazt9ICk7CisgIFcoQ291bnRVcChkZXN2YXJzKSk7CisgIFdMTigiIik7CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWHNldChzdHJpbmcgc3RyKQoreworICBpbnQgaTsKKyAgbWl4ZWQgb2JqOworICBzdHJpbmcgbmFtZSwgdG1wOworICAKKyAgU0VDVVJFMihUUlVFKTsKKyAgVVNBR0UxKHN0ciwgInhzZSh0KSBbJDxuYW1lPj08b2JqZWN0Pl0iKTsKKyAgaWYoc3RyKSB7CisgICAgaWYobWVtYmVyKCh7IiRtZSIsIiRtIiwiJGhlcmUiLCIkaCJ9KSxzdHIpIT0tMSkKKyAgICAgIFdETE4oIlNvcnJ5LCB0aGlzIGlzIGEgcmVzZXJ2ZWQgdmFyaWFibGUgWyIrc3RyKyJdIik7CisgICAgZWxzZSBpZihzc2NhbmYoc3RyLCAiJCVzPSVzIiwgbmFtZSwgdG1wKSkKKyAgICB7CisgICAgICBpZihvYmo9WEZpbmRPYmoodG1wKSkKKyAgICAgIHsKKyAgICAgICAgdmFyaWFibGVbbmFtZV0gPSBvYmo7CisgICAgICAgIFdMTigiICQiK25hbWUrIj0iK09iakZpbGUob2JqKSk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBWYXJDaGVjayhGQUxTRSk7CisgICAgV0xOKCJDdXJyZW50IHNldHRpbmdzOiIpOworICAgIGZvcmVhY2goc3RyaW5nIGtleSwgbWl4ZWQgdmFsIDogdmFyaWFibGUpCisgICAgeworICAgICAgaWYgKHZhbCkKKyAgICAgICAgV0xOKCIgJCIra2V5KyI9IitPYmpGaWxlKHZhbCkpOworICAgICAgZWxzZQorICAgICAgICBtX2RlbGV0ZSh2YXJpYWJsZSwga2V5KTsKKyAgICB9CisgICAgV0xOKCIgJG1lPSIrT2JqRmlsZShjbG9uZXIpKTsKKyAgICBXTE4oIiAkaGVyZT0iK09iakZpbGUoRU5WKGNsb25lcikpKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworaW50IFhzaChzdHJpbmcgc3RyKQoreworICBTRUNVUkUyKFRSVUUpOworICBVU0FHRTEoc3RyLCAieHNoIDxmaWxlbmFtZT4iKTsKKyAgaWYoc2NyaXB0bGluZSkKKyAgeworICAgIFdETE4oIkNhbm5vdCBleGVjdXRlIGFub3RoZXIgc2NyaXB0IGZpbGUgdW50aWwgbGFzdCBleGVjdXRpb24gaGFzIGVuZGVkIik7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYoIShzdHI9WEZpbmRGaWxlKHN0cikpKQorICAgIHJldHVybiBUUlVFOworICBzdHI9cmVhZF9maWxlKHN0ciwgMSwgMTAwMCk7CisgIGlmKCEoc2NyaXB0bGluZT1vbGRfZXhwbG9kZShzdHIsICJcbiIpKSkKKyAgeworICAgIFdETE4oIkJhZCBzY3JpcHQgZmlsZSIpOworICAgIHJldHVybiBUUlVFOworICB9CisgIHNjcmlwdHNpemU9c2l6ZW9mKHNjcmlwdGxpbmUpOworICBYRXhlY0ZpbGUoTlVMTCk7CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWHNvcnQoc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nICp0bXAsZmlsZTsKKyAgaW50IHMscmV2ZXJzZTsKKworICBTRUNVUkUyKFRSVUUpOworICBUSygiWHNvcnQ6IHN0cjogIitzdHIpOworICBpZighcGlwZV9pbikKKyAgeworICAgIFVTQUdFMihzdHIsICJ4c28ocnQpIFstcl0gW2ZpbGVdIik7CisgICAgaWYoISh0bXA9b2xkX2V4cGxvZGUoc3RyLCAiICIpKXx8KHM9c2l6ZW9mKHRtcCkpPjIpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgaWYodG1wWzBdPT0iLXIiKQorICAgICAgaWYocz09MSkKKwlyZXR1cm4gRkFMU0U7CisgICAgICBlbHNlCisgICAgICB7CisJcmV2ZXJzZT1UUlVFOworCXRtcD10bXBbMS4uXTsKKyAgICAgIH0KKyAgICBlbHNlIGlmKHM+MSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBpZighKGZpbGU9WEZpbmRGaWxlKHRtcFswXSkpKQorICAgIHsKKyAgICAgIFdETE4oIkNhbid0IGZpbmQgZmlsZSIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIGlmKHN0ciYmc3RyIT0iIikKKyAgICAgIGlmKHN0cj09Ii1yIikKKwlyZXZlcnNlPVRSVUU7CisgICAgICBlbHNlCisJVVNBR0UzKCJ4c28ocnQpIFstcl0iKTsKKyAgICBpZiAoZmlsZV9zaXplKGZpbGU9cGlwZV9pZik8MCkKKyAgICB7CisgICAgICBXRExOKCJNaXNzaW5nIGlucHV0IHRvIHhzb3J0Iik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKyAgdG1wPW9sZF9leHBsb2RlKHJlYWRfZmlsZShmaWxlLDAsUElQRV9NQVgpLCJcbiIpOworICBpZihwaXBlX2luJiZwaXBlX2lmPT1QSVBFX0ZJTEUpCisgICAgcm0oUElQRV9GSUxFKTsKKyAgdG1wPXNvcnRfYXJyYXkodG1wLHJldmVyc2U/Iyc8OiMnPik7CisgICAgaWYgKHBpcGVfb3V0JiZwaXBlX29mKQorICAgICAgd3JpdGVfZmlsZShwaXBlX29mLGltcGxvZGUodG1wLCJcbiIpKyJcbiIpOworICAgIGVsc2UKKyAgICAgIFdETE4oaW1wbG9kZSh0bXAsIlxuIikpOworICByZXR1cm4gVFJVRTsKK30KKworaW50IFh0YWlsKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyAqdG1wLGZpbGUsc2lnbjsKKyAgaW50IGxpbmVzOworCisgIGlmICghc3RyKSB7CisgICAgV0RMTigiTWlzc2luZyBpbnB1dCB0byB4dGFpbCIpOworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgc2lnbj0iLSI7CisgIGxpbmVzPTEwOworICBTRUNVUkUyKFRSVUUpOworICBUSygiWHRhaWw6IHN0cjogIitzdHIpOworICBpZighcGlwZV9pbikKKyAgeworICAgIGlmKHNzY2FuZihzdHIsIi0lZCAlcyIsbGluZXMsZmlsZSk9PTIpCisgICAgICBzaWduPSItIjsKKyAgICBlbHNlIGlmKHNzY2FuZihzdHIsIislZCAlcyIsbGluZXMsZmlsZSk9PTIpCisgICAgICBzaWduPSIrIjsKKyAgICBlbHNlCisgICAgICBmaWxlPXN0cjsKKworICAgIGlmKCEoZmlsZT1YRmluZEZpbGUoZmlsZSkpKQorICAgIHsKKyAgICAgIFdETE4oIkNhbid0IGZpbmQgZmlsZSIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIGlmKHNzY2FuZihzdHIsIi0lZCIsbGluZXMpPT0xKQorICAgICAgc2lnbj0iLSI7CisgICAgZWxzZSBpZihzc2NhbmYoc3RyLCIrJWQiLGxpbmVzKT09MSkKKyAgICAgIHNpZ249IisiOworICAgIGlmIChmaWxlX3NpemUoZmlsZT1waXBlX2lmKTwwKQorICAgIHsKKyAgICAgIFdETE4oIk1pc3NpbmcgaW5wdXQgdG8geHRhaWwiKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorCisgIGlmKHNpZ249PSItIikKKyAgeworICAgIGlmKCFsaW5lcykKKyAgICAgIHJldHVybiBUUlVFOworICB9CisKKyAgaWYoZmlsZV9zaXplKGZpbGUpPjUwMDAwKQorICB7CisgICAgV0RMTigiRmlsZSB0b28gbGFyZ2UiKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIGlmKHNpZ249PSIrIikKKyAgICB0bXA9b2xkX2V4cGxvZGUocmVhZF9maWxlKGZpbGUsMCxQSVBFX01BWCksIlxuIilbbGluZXMuLl07CisgIGVsc2UKKyAgICB0bXA9b2xkX2V4cGxvZGUocmVhZF9maWxlKGZpbGUsMCxQSVBFX01BWCksIlxuIilbPGxpbmVzLi5dOworICBpZihwaXBlX2luJiZwaXBlX2lmPT1QSVBFX0ZJTEUpCisgICAgcm0oUElQRV9GSUxFKTsKKyAgaWYgKHBpcGVfb3V0JiZwaXBlX29mKQorICAgIHdyaXRlX2ZpbGUocGlwZV9vZixpbXBsb2RlKHRtcCwiXG4iKSsiXG4iKTsKKyAgZWxzZQorICAgIFdMTihpbXBsb2RlKHRtcCwiXG4iKSk7CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWHRvb2woc3RyaW5nIHN0cikKK3sKKyAgaW50IG07CisgIHN0cmluZyB0bXA7CisgIG9iamVjdCBvYmo7CisgIAorICBTRUNVUkUyKFRSVUUpOworICBUSygiWHRvb2w6IHN0cjogIitzdHIpOworICBVU0FHRTEoc3RyLCAieHRvKG9sKSBbdXBkYXRlfGZpcnN0PTxvbnxvZmY+fHByb3RlY3Q9PG9ufG9mZj58IisKKwkgImludmNoZWNrPTxvbnxvZmY+fFxuIisKKwkgIlx0XHR2YXJjaGVjaz08b258b2ZmPnxzY2FuY2hrPTxvbnxvZmY+fHNob3J0PTxvbnxvZmY+fFxuIisKKwkgIlx0XHRlY2hvPTxvbnxvZmY+fG1vcmU9PGFtb3VudD58a2lsbHxuZXdzfHNhdmV8bG9hZHxyZXNldF0iKTsKKyAgaWYoc3RyJiZzdHIhPSIiKQorICB7CisgICAgaWYoc3NjYW5mKHN0ciwgIm1vcmU9JWQiLCBtKSkKKyAgICB7CisgICAgICBpZihtPDUpCisJV0RMTigiU29ycnksIGFtb3VudCBvZiBsaW5lcyBzaG91bGQgYmUgbW9yZSB0aGVuIDUiKTsKKyAgICAgIGVsc2UKKyAgICAgIHsKKwlXRExOKCJTZXR0aW5nIGFtb3VudCBvZiBkaXNwbGF5ZWQgbGluZXMgdG8gIittKTsKKwltb3JlbGluZXM9bTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgc3dpdGNoKHN0cikKKyAgICAgIHsKKwljYXNlICJ1cGRhdGUiOgorCWlmKG9iaj1maW5kX29iamVjdChUT09MX1BBVEgpKQorCSAgRGVzdHJ1Y3Qob2JqKTsKKwlpZihjYXRjaChvYmo9Y2xvbmVfb2JqZWN0KFRPT0xfUEFUSCkpKQorCSAgV0xOKCJVcGRhdGluZyAiK1RPT0xfVElUTEUrIiBmYWlsZWQhIik7CisJZWxzZQorCSAgb2JqLT51cGRhdGVfdG9vbChBVVRPTE9BRF9BUkdTLCBjbG9uZXIpOworCXJldHVybiBUUlVFOworCWJyZWFrOworCWNhc2UgImZpcnN0PW9uIjoKKwlNT0RFX09OKE1PREVfRklSU1QpOworCW1vdmUoY2xvbmVyKTsKKwlXRExOKCJBdXRvbWF0aWMgbW92aW5nIGludG8gcG9sZSBwb3NpdGlvbiBvZiBpbnZlbnRvcnkgdHVybmVkIG9uIik7CisJYnJlYWs7CisJY2FzZSAiZmlyc3Q9b2ZmIjoKKwlNT0RFX09GRihNT0RFX0ZJUlNUKTsKKwlXRExOKCJBdXRvbWF0aWMgbW92aW5nIGludG8gcG9sZSBwb3NpdGlvbiBvZiBpbnZlbnRvcnkgdHVybmVkIG9mZiIpOworCWJyZWFrOworCWNhc2UgInByb3RlY3Q9b24iOgorCU1PREVfT04oTU9ERV9QUk9URUNUKTsKKwlXRExOKCJQcm90ZWN0aW9uIGZyb20gZm9yY2VzIGFuZCBpbGxlZ2FsIG1vdmVzIHR1cm5lZCBvbiIpOworCWJyZWFrOworCWNhc2UgInByb3RlY3Q9b2ZmIjoKKwlNT0RFX09GRihNT0RFX1BST1RFQ1QpOworCVdETE4oIlByb3RlY3Rpb24gZnJvbSBmb3JjZXMgYW5kIGlsbGVnYWwgbW92ZXMgdHVybmVkIG9mZiIpOworCWJyZWFrOworCWNhc2UgImludmNoZWNrPW9uIjoKKwlNT0RFX09OKE1PREVfSU5WQ0hFQ0spOworCVdETE4oIkF1dG9tYXRpYyBjaGVja2luZyBmb3IgbmV3IG9iamVjdHMgaW4gaW52ZW50b3J5IHR1cm5lZCBvbiIpOworCWJyZWFrOworCWNhc2UgImludmNoZWNrPW9mZiI6CisJTU9ERV9PRkYoTU9ERV9JTlZDSEVDSyk7CisJV0RMTigiQXV0b21hdGljIGNoZWNraW5nIGZvciBuZXcgb2JqZWN0cyBpbiBpbnZlbnRvcnkgdHVybmVkIG9mZiIpOworCWJyZWFrOworCWNhc2UgInZhcmNoZWNrPW9uIjoKKwlNT0RFX09OKE1PREVfVkFSQ0hFQ0spOworCVZhckNoZWNrKFRSVUUpOworCVdETE4oIkF1dG9tYXRpYyB2YXJpYWJsZSBjaGVja2luZyB0dXJuZWQgb24iKTsKKwlicmVhazsKKwljYXNlICJ2YXJjaGVjaz1vZmYiOgorCU1PREVfT0ZGKE1PREVfVkFSQ0hFQ0spOworCVdETE4oIkF1dG9tYXRpYyB2YXJpYWJsZSBjaGVja2luZyB0dXJuZWQgb2ZmIik7CisJYnJlYWs7CisJY2FzZSAic2NhbmNoaz1vbiI6CisJTU9ERV9PTihNT0RFX1NDQU5DSEspOworCVdETE4oIlNjYW4gY2hlY2sgdHVybmVkIG9uIik7CisJYnJlYWs7CisJY2FzZSAic2NhbmNoaz1vZmYiOgorCU1PREVfT0ZGKE1PREVfU0NBTkNISyk7CisJV0RMTigiU2NhbiBjaGVjayB0dXJuZWQgb2ZmIik7CisJYnJlYWs7CisJY2FzZSAiZWNobz1vbiI6CisJTU9ERV9PTihNT0RFX0VDSE8pOworCVdETE4oIkVjaG9pbmcgb2YgbXVsdGlwbGUgY29tbWFuZCBleGVjdXRpb24gdHVybmVkIG9uIik7CisJYnJlYWs7CisJY2FzZSAiZWNobz1vZmYiOgorCU1PREVfT0ZGKE1PREVfRUNITyk7CisJV0RMTigiRWNob2luZyBvZiBtdWx0aXBsZSBjb21tYW5kIGV4ZWN1dGlvbiB0dXJuZWQgb2ZmIik7CisJYnJlYWs7CisJY2FzZSAic2hvcnQ9b24iOgorCU1PREVfT04oTU9ERV9TSE9SVCk7CisJV0RMTigiVXNlIG9mIHNob3J0IGRlc2NyaXB0aW9ucyB0dXJuZWQgb24iKTsKKwlicmVhazsKKwljYXNlICJzaG9ydD1vZmYiOgorCU1PREVfT0ZGKE1PREVfU0hPUlQpOworCVdETE4oIlVzZSBvZiBzaG9ydCBkZXNjcmlwdGlvbnMgdHVybmVkIG9mZiIpOworCWJyZWFrOworCWNhc2UgImtpbGwiOgorCVdETE4oVE9PTF9OQU1FKyIgc2VsZmRlc3RydWN0cyIpOworCWRlc3RydWN0KE1FKTsKKwlicmVhazsKKwljYXNlICJuZXdzIjoKKwlYTW9yZUZpbGUoVE9PTF9ORVdTLCBGQUxTRSk7CisJYnJlYWs7CisJY2FzZSAicmVzZXQiOgorCVdETE4oIlJlc2V0dGluZyAiK1RPT0xfVElUTEUpOworCU1FLT5fX0lOSVQoKTsKKwlicmVhazsKKwljYXNlICJsb2FkIjoKKwlpZihmaWxlX3NpemUoU0FWRV9GSUxFKyIubyIpPjApCisJeworCSAgV0RMTigiTG9hZGluZyAiK1RPT0xfVElUTEUrIiBzZXR0aW5ncyIpOworCSAgcmVzdG9yZV9vYmplY3QoU0FWRV9GSUxFKTsKKwl9CisJZWxzZQorCSAgV0RMTigiU29ycnksIGNhbm5vdCBmaW5kIGZpbGUgdG8gbG9hZCBzZXR0aW5ncyIpOworCWJyZWFrOworCWNhc2UgInNhdmUiOgorCVdETE4oIlNhdmluZyAiK1RPT0xfVElUTEUrIiBzZXR0aW5ncyIpOworCXNhdmVfb2JqZWN0KFNBVkVfRklMRSk7CisJYnJlYWs7CisJZGVmYXVsdDoKKwlyZXR1cm4gRkFMU0U7CisgICAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgV0xOKFRPT0xfVElUTEUrIiBzZXR0aW5nczoiKTsKKyAgICB0bXA9ICgiIGZpcnN0IC4uLi4gPSAiKyhNT0RFKE1PREVfRklSU1QpID8gIm9uXG4iIDogIm9mZlxuIikpOworICAgIHRtcCs9KCIgcHJvdGVjdCAuLiA9ICIrKE1PREUoTU9ERV9QUk9URUNUKSA/ICJvblxuIiA6ICJvZmZcbiIpKTsKKyAgICB0bXArPSgiIGludmNoZWNrIC4gPSAiKyhNT0RFKE1PREVfSU5WQ0hFQ0spID8gIm9uXG4iIDogIm9mZlxuIikpOworICAgIHRtcCs9KCIgdmFyY2hlY2sgLiA9ICIrKE1PREUoTU9ERV9WQVJDSEVDSykgPyAib25cbiIgOiAib2ZmXG4iKSk7CisgICAgdG1wKz0oIiBzY2FuY2hrIC4uID0gIisoTU9ERShNT0RFX1NDQU5DSEspID8gIm9uXG4iIDogIm9mZlxuIikpOworICAgIHRtcCs9KCIgZWNobyAuLi4uLiA9ICIrKE1PREUoTU9ERV9FQ0hPKSA/ICJvblxuIiA6ICJvZmZcbiIpKTsKKyAgICB0bXArPSgiIHNob3J0IC4uLi4gPSAiKyhNT0RFKE1PREVfU0hPUlQpID8gIm9uXG4iIDogIm9mZlxuIikpOworICAgIHRtcCs9KCIgbW9yZSAuLi4uLiA9ICIrbW9yZWxpbmVzKTsKKyAgICBXTE4oc3ByaW50ZigiJS04MCNzIiwgdG1wKSk7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYdHJhY2Uoc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIGZpbGU7CisgIG9iamVjdCBvYmo7CisgIAorICBTRUNVUkUyKFRSVUUpOworICBVU0FHRTEoc3RyLCAieHRyYWMoZSkgPG9iamVjdD4iKTsKKyAgaWYoIXN0cnx8c3RyPT0iIikKKyAgeworICAgIHRyYWNlKDApOworICAgIFdETE4oIkVuZGluZyB0cmFjZSBbIitzaG9ydF9wYXRoKCIvIit0cmFjZXByZWZpeCgwKSkrIl0iKTsKKyAgfQorICBlbHNlIGlmKG9iaj1YRmluZE9iaihzdHIpKQorICB7CisgICAgUHJpbnRTaG9ydCgiVHJhY2luZzogIiwgb2JqKTsKKyAgICBmaWxlPW9iamVjdF9uYW1lKG9iaik7CisgICAgZmlsZT1maWxlWzEuLjwxXTsKKyAgICB0cmFjZXByZWZpeChmaWxlKTsKKyAgICB0cmFjZShUUkFDRV9MRVZFTCk7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYdHJhbnMoc3RyaW5nIHN0cikKK3sKKyAgb2JqZWN0IG9iajsKKyAgCisgIFNFQ1VSRTIoVFJVRSk7CisgIFVTQUdFMihzdHIsICJ4dHJhbihzKSA8b2JqZWN0PiIpOworICBpZigob2JqPVhGaW5kT2JqKHN0cikpJiZFTlYob2JqKSkKKyAgeworICAgIHRlbGxfcm9vbShFTlYob2JqKSwgQ1JOQU1FKG9iaikrIiB2YW5pc2hlcy5cbiIpOworICAgIHRlbGxfcm9vbShFTlYoY2xvbmVyKSwgQ1JOQU1FKG9iaikrCisJICAgICAgIiBpcyB0ZWxlcG9ydGVkIGludG8gdGhpcyByb29tIGJ5ICIrQ1JOQU1FKGNsb25lcikrIi5cbiIpOworICAgIE1vdmVPYmoob2JqLCBFTlYoY2xvbmVyKSwgVFJVRSk7CisgICAgdGVsbF9vYmplY3Qob2JqLCAiWW91J3ZlIGJlZW4gdGVsZXBvcnRlZCB0byAiK0NSTkFNRShjbG9uZXIpKyIuXG4iKTsKKyAgfQorICBlbHNlCisgICAgV0RMTigiRmFpbGVkIHRvIHRlbGVwb3J0IG9iamVjdCIpOworICByZXR1cm4gVFJVRTsKK30KKworaW50IFh1cGRhdGUoc3RyaW5nIHN0cikKK3sKKyAgb2JqZWN0IG9iajsKKyAgc3RyaW5nIGZpbGU7CisgIAorICBTRUNVUkUyKFRSVUUpOworICBVU0FHRTIoc3RyLCAieHVwKGRhdGUpIDxmaWxlbmFtZT4iKTsKKyAgaWYoIShmaWxlPVhGaW5kRmlsZShzdHIpKSkKKyAgICByZXR1cm4gVFJVRTsKKyAgaWYoZmlsZVs8Mi4uIDwxXT09Ii5jIikKKyAgICBmaWxlPWZpbGVbMC4uIDwzXTsKKyAgaWYoKG9iaj1YRmluZE9iaihmaWxlKSkmJihvYmo9ZmluZF9vYmplY3QocHVyZV9maWxlX25hbWUob2JqKSkpKQorICB7CisgICAgUHJpbnRTaG9ydCgiVXBkYXRpbmc6ICIsIG9iaik7CisgICAgRGVzdHJ1Y3Qob2JqKTsKKyAgfQorICBlbHNlCisgICAgV0RMTigiT2JqZWN0IG5vdCBmb3VuZCIpOworICByZXR1cm4gVFJVRTsKK30KKworaW50IFh1cHRpbWUoc3RyaW5nIHN0cikKK3sKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYd2Moc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIGZpbGU7CisgIHN0cmluZyB0bXAsICp0bXAyOworICBpbnQgaSwgY2hhcnMsIHdvcmRzLCBsaW5lcywgbmNoYXJzLCBud29yZHMsIG5saW5lczsKKyAgCisgIFNFQ1VSRTIoVFJVRSk7CisgIFRLKCJYd2M6IHN0cjogIitzdHIpOworICBjaGFycz13b3Jkcz1saW5lcz1GQUxTRTsKKyAgaWYoIXBpcGVfaW4pCisgIHsKKyAgICBVU0FHRTIoc3RyLCAieHdjIFstY3dsXSA8ZmlsZT4iKTsKKyAgICBpZihzdHJbMF09PSctJykKKyAgICB7CisgICAgICB3aGlsZSgoc3RyPXN0clsxLi5dKVswXSE9JyAnJiZzaXplb2Yoc3RyKSkKKwlzd2l0Y2goc3RyWzBdKQorCXsKKwkgIGNhc2UgJ2MnOgorCSAgY2hhcnM9VFJVRTsKKwkgIGJyZWFrOworCSAgY2FzZSAndyc6CisJICB3b3Jkcz1UUlVFOworCSAgYnJlYWs7CisJICBjYXNlICdsJzoKKwkgIGxpbmVzPVRSVUU7CisJICBicmVhazsKKwkgIGRlZmF1bHQ6CisJICByZXR1cm4gRkFMU0U7CisJfQorICAgICAgc3RyPXN0clsxLi5dOworICAgIH0KKyAgICBpZighKGZpbGU9WEZpbmRGaWxlKHN0cikpKQorICAgIHsKKyAgICAgIFdETE4oIkNhbid0IGZpbmQgZmlsZSIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIFVTQUdFMShzdHIsInh3YyBbLWN3bF0iKTsKKyAgICBpZihzdHIpCisgICAgICBpZihzdHJbMF09PSctJykKKyAgICAgIHsKKwl3aGlsZSgoc3RyPXN0clsxLi5dKVswXSE9JyAnJiZzaXplb2Yoc3RyKSkKKwkgIHN3aXRjaChzdHJbMF0pCisJICB7CisJICAgIGNhc2UgJ2MnOgorCSAgICBjaGFycz1UUlVFOworCSAgICBicmVhazsKKwkgICAgY2FzZSAndyc6CisJICAgIHdvcmRzPVRSVUU7CisJICAgIGJyZWFrOworCSAgICBjYXNlICdsJzoKKwkgICAgbGluZXM9VFJVRTsKKwkgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJICAgIHJldHVybiBGQUxTRTsKKwkgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKwlyZXR1cm4gRkFMU0U7CisgICAgaWYoZmlsZV9zaXplKGZpbGU9cGlwZV9pZik8MCkKKyAgICB7CisgICAgICBXRExOKCJNaXNzaW5nIGlucHV0IHRvIHh3YyIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisgIGlmKCEoY2hhcnN8d29yZHN8bGluZXMpKQorICAgIGNoYXJzPXdvcmRzPWxpbmVzPVRSVUU7CisgIG5saW5lcz1ud29yZHM9bmNoYXJzPTA7CisgIHRtcD1yZWFkX2ZpbGUoZmlsZSwwLFBJUEVfTUFYKTsKKyAgdG1wMj1leHBsb2RlKHRtcCwiXG4iKTsKKyAgaWYobGluZXMpCisgIHsKKyAgICBubGluZXM9c2l6ZW9mKHRtcDIpOworICAgIGlmKHRtcDJbPDFdPT0iIiYmbmxpbmVzPjEpCisgICAgICBubGluZXMtLTsKKyAgfQorICBpZih3b3JkcykKKyAgICBmb3IoaT1zaXplb2YodG1wMiktMTtpPj0wO2ktLSkKKyAgICB7CisgICAgICBUSyhzcHJpbnRmKCIlTyIsdG1wMltpXSkpOworICAgICAgaWYodG1wMltpXSE9IiIpCisJbndvcmRzKz1zaXplb2YocmVnZXhwbG9kZSh0bXAyW2ldLCJbCV0iKS0oeyIiLCIgIiwiCSJ9KSk7CisgICAgICBUSyhzcHJpbnRmKCIlTyIscmVnZXhwbG9kZSh0bXAyW2ldLCJbCV0iKS0oeyIiLCIgIiwiCSJ9KSkpOworICAgICAgVEsoIm53b3JkczogIitud29yZHMpOworICAgIH0KKyAgaWYoY2hhcnMpCisgICAgZm9yKGk9c2l6ZW9mKHRtcDIpLTE7aT49MDtpLS0pCisgICAgICBuY2hhcnMrPXNpemVvZih0bXAyW2ldKSsxOworICB0bXAyPTA7CisgIHRtcD0iIjsKKyAgaWYobGluZXMpCisgICAgdG1wKz1zcHJpbnRmKCIlN2QiLG5saW5lcykrIiAiOworICBpZih3b3JkcykKKyAgICB0bXArPXNwcmludGYoIiU3ZCIsbndvcmRzKSsiICI7CisgIGlmKGNoYXJzKQorICAgIHRtcCs9c3ByaW50ZigiJTdkIixuY2hhcnMpKyIgIjsKKyAgaWYoZmlsZSE9cGlwZV9pZikKKyAgICB0bXArPWZpbGU7CisgIFdMTih0bXApOworICByZXR1cm4gVFJVRTsKK30KKworaW50IGNtZGF2Z19jb21wYXJlKHN0cmluZyBhLCBzdHJpbmcgYikKK3sKKyAgaW50IHgseTsKKyAgc3RyaW5nIGR1bTsKKyAgc3NjYW5mKGEsIiVzIGNtZGF2ZzogJWQiLGR1bSx4KTsKKyAgc3NjYW5mKGIsIiVzIGNtZGF2ZzogJWQiLGR1bSx5KTsKKyAgcmV0dXJuIHg9PXk/MDooeD55PzE6LTEpOworfQorCitpbnQgWHdobyhzdHJpbmcgb3B0KQoreworICBzdHJpbmcgKnN0cnMsc3RyLGZ1bmM7CisgIAorICBTRUNVUkUyKFRSVUUpOworICBUSygiWHdobzogb3B0OiBcIiIrb3B0KyJcIiIpOworICBVU0FHRTEob3B0LCAieHdoKG8pIFttYWlsfGlwfHJhY2V8Z3VpbGR8ZG9tYWlufHN0YXRzfHNub29wXSIpOworICBmdW5jPSJzdHJpbmdfY29tcGFyZSI7CisgIGlmKCFvcHR8fG9wdD09IiIpCisgICAgc3Rycz1tYXAodXNlcnMoKSwgIlBsYXllcldobyIsIE1FKTsKKyAgZWxzZQorICAgIHN3aXRjaChvcHQpCisgICAgeworICAgICAgY2FzZSAibWFpbCI6CisgICAgICBzdHJzPW1hcCh1c2VycygpLCAiUGxheWVyTWFpbCIsIE1FLCBUUlVFKTsKKyAgICAgIGJyZWFrOworICAgICAgY2FzZSAiaXAiOgorICAgICAgc3Rycz1tYXAodXNlcnMoKSwgIlBsYXllcklQIiwgTUUsIFRSVUUpOworICAgICAgYnJlYWs7CisgICAgICBjYXNlICJyYWNlIjoKKyAgICAgIGNhc2UgImd1aWxkIjoKKyAgICAgIHN0cnM9bWFwKHVzZXJzKCksICJQbGF5ZXJSYWNlIiwgTUUsIFRSVUUpOworICAgICAgYnJlYWs7CisgICAgICBjYXNlICJkb21haW4iOgorICAgICAgc3Rycz1tYXAodXNlcnMoKSwgIlBsYXllckRvbWFpbiIsIE1FLCBUUlVFKTsKKyAgICAgIGJyZWFrOworICAgICAgY2FzZSAic3RhdCI6CisgICAgICBjYXNlICJzdGF0cyI6CisgICAgICBzdHJzPW1hcCh1c2VycygpLCAiUGxheWVyU3RhdHMiLCBNRSwgVFJVRSk7CisgICAgICBicmVhazsKKyAgICAgIGNhc2UgInNub29wIjoKKyAgICAgIHN0cnM9bWFwKHVzZXJzKCksICJQbGF5ZXJTbm9vcCIsIE1FLCBUUlVFKTsKKyAgICAgIGJyZWFrOworICAgICAgY2FzZSAiY21kYXZnIjoKKyAgICAgIHN0cnM9bWFwKHVzZXJzKCksICJQbGF5ZXJDbWRBdmciLCBNRSwgVFJVRSk7CisgICAgICBmdW5jPSJjbWRhdmdfY29tcGFyZSI7CisgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBzdHJzPXNvcnRfYXJyYXkoc3RycywgZnVuYywgTUUpOworICBpZihwaXBlX291dCYmcGlwZV9vZikKKyAgICB3cml0ZV9maWxlKHBpcGVfb2YsaW1wbG9kZShzdHJzLCJcbiIpKyJcbiIpOworICBlbHNlCisgICAgV0xOKGltcGxvZGUoc3RycywiXG4iKSk7CisgIHJldHVybiBUUlVFOworfQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC90b29sbGliLmMgYi9vYmovdG9vbHMvTUd0b29sL3Rvb2xsaWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDY0MDA0Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC90b29sbGliLmMKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisgKiBNR3Rvb2wtMS4wCisgKiBGaWxlOiB0b29sbGliLmMKKyAqIE1haW50YWluZXI6IEtpcmtATW9yZ2VuR3JhdWVuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogdGhlIG9yaWdpbmFsIFh0b29sIGlzIGNvcHlyaWdodGVkIGJ5IEh5cCAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAidG9vbGxpYi5oIgorI2luY2x1ZGUgPGxwY3R5cGVzLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorLyoKK3N0cmluZyAqb2xkX2V4cGxvZGUoc3RyaW5nIHN0ciwgc3RyaW5nIGRlbCkKK3sKKyAgaW50IHMsIHQ7CisgIHN0cmluZyAqc3RyczsKKyAgCisgIGlmKGRlbCA9PSAiIikKKyAgICByZXR1cm4gKHtzdHJ9KTsKKyAgc3Rycz1leHBsb2RlKHN0ciwgZGVsKTsKKyAgcz0wOworICB0PXNpemVvZihzdHJzKS0xOworICB3aGlsZShzPD10ICYmIHN0cnNbcysrXSA9PSAiIikKKyAgICA7CisgIHMtLTsKKyAgd2hpbGUodD49MCAmJiBzdHJzW3QtLV0gPT0gIiIpCisgICAgOworICB0Kys7CisgIGlmKHM8PXQpCisgICAgcmV0dXJuIHN0cnNbcy4udF07CisgIHJldHVybiAwOworfQorCitzdHJpbmcgKmV4cGxvZGUoc3RyaW5nIHN0ciwgc3RyaW5nIGRlbCkKK3sKKyAgcmV0dXJuIGV4cGxvZGUoc3RyLCBkZWwpOworfQorKi8KK3N0cmluZyAqc3RyaXBfZXhwbG9kZShzdHJpbmcgc3RyLCBzdHJpbmcgZGVsKQoreworICByZXR1cm4gZXhwbG9kZShzdHIsIGRlbCktKHsiIn0pOworfQorCitzdHJpbmcgc3RyaXBfc3RyaW5nKHN0cmluZyBzdHIpCit7CisgIHJldHVybiBpbXBsb2RlKHN0cmlwX2V4cGxvZGUoc3RyLCIgIiksIiAiKTsKK30KKworaW50IHN0cmluZ19jb21wYXJlKHN0cmluZyBhLCBzdHJpbmcgYikKK3sKKyAgcmV0dXJuIGE9PWI/MDooYT5iPzE6LTEpOworfQorCitzdHJpbmcgY2FwX3N0cmluZyhzdHJpbmcgc3RyKQoreworICByZXR1cm4gY2FwaXRhbGl6ZShzdHIpOworfQorCitzdHJpbmcgc2hvcnRfcGF0aChzdHJpbmcgZmlsZSkKK3sKKyAgaW50IHM7CisgIHN0cmluZyB0bXA7CisgIAorICBpZighZmlsZSkKKyAgICByZXR1cm4gMDsKKyAgaWYoUEwpCisgIHsKKyAgICBpZihmaWxlWzAuLiA4XT09Ii9wbGF5ZXJzLyIpCisgICAgeworICAgICAgcz1zaXplb2YoZ2V0dWlkKFBMKSkrODsKKyAgICAgIHJldHVybiAifiIrKGZpbGVbOS4uIHNdPT1nZXR1aWQoUEwpID8KKwkJICBmaWxlW3MrMS4uIDwxXSA6IGZpbGVbOS4uIDwxXSk7CisgICAgfQorICB9CisgIGlmKGZpbGVbMC4uIDJdPT0iL2QvIikKKyAgICByZXR1cm4gIisiK2ZpbGVbMy4uIDwxXTsKKyAgZWxzZQorICAgIHJldHVybiBmaWxlOyAgCit9CisKK3N0cmluZyBsb25nX3BhdGgoc3RyaW5nIGZpbGUpCit7CisgIHJldHVybiAoc3RyaW5nKU1BU1RFUi0+bWFrZV9wYXRoX2Fic29sdXRlKGZpbGUpOworfQorCitzdHJpbmcgKmxvbmdfZ2V0X2RpcihzdHJpbmcgcGF0LCBpbnQgYWxsKQoreworICBpbnQgaSwgczsKKyAgc3RyaW5nIHN0ciwgZGlyLCAqZmlsZSwgKnRtcDsKKyAgCisgIGlmKCFwYXQpCisgICAgcmV0dXJuICh7fSk7CisgIHBhdD1sb25nX3BhdGgocGF0KTsKKyAgaWYodG1wPW9sZF9leHBsb2RlKHBhdCwgIi8iKSkKKyAgICBkaXI9Ii8iK2ltcGxvZGUodG1wWzAuLnNpemVvZih0bXApLTJdLCAiLyIpKyIvIjsKKyAgZWxzZQorICAgIGRpcj0iLyI7CisgIHM9c2l6ZW9mKHRtcD1nZXRfZGlyKHBhdCkpOworICBmaWxlPSh7fSk7CisgIGZvcihpPTA7aTxzO2krKykKKyAgeworICAgIHN0cj1kaXIrdG1wW2ldOworICAgIGlmKGFsbHx8ZmlsZV9zaXplKHN0cik+PTApCisgICAgICBmaWxlKz0oe3N0cn0pOworICB9CisgIHJldHVybiBmaWxlOworfQorCitzdHJpbmcgbGl0X3N0cmluZyhzdHJpbmcgc3RyKQoreworICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCAiXFwiLCAiXFxcXCIpOworICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCAiXGIiLCAiXFxiIik7CisgIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsICJcbiIsICJcXG4iKTsKKyAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwgIlxyIiwgIlxcciIpOworICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCAiXHQiLCAiXFx0Iik7CisgIHJldHVybiBzdHJpbmdfcmVwbGFjZShzdHIsICJcIiIsICJcXFwiIik7Cit9CisKK3N0cmluZyBtaXhlZF90b19zdHJpbmcobWl4ZWQgbWl4LCBpbnQgbHZsKQoreworICBpbnQgaSwgaiwgcywgdDsKKyAgc3RyaW5nIHN0cjsKKyAgbWl4ZWQgKmtleXM7CisKKyAgaWYobHZsKQorICB7CisgICAgc3dpdGNoKHR5cGVvZihtaXgpKQorICAgIHsKKyAgICAgIGRlZmF1bHQ6CisgICAgICBjYXNlIFRfSU5WQUxJRDoKKyAgICAgIHJldHVybiAiPGludmFsaWQ+IjsKKyAgICAgIGNhc2UgVF9TVFJVQ1Q6CisgICAgICByZXR1cm4gdG9fc3RyaW5nKG1peCk7CisgICAgICBjYXNlIFRfTFZBTFVFOgorICAgICAgcmV0dXJuICImIittaXhlZF90b19zdHJpbmcobWl4LCBsdmwtMSk7CisgICAgICBjYXNlIFRfTlVNQkVSOgorICAgICAgY2FzZSBUX0ZMT0FUOgorICAgICAgcmV0dXJuIHRvX3N0cmluZyhtaXgpOworICAgICAgY2FzZSBUX1NUUklORzoKKyAgICAgIHJldHVybiAiXCIiK2xpdF9zdHJpbmcobWl4KSsiXCIiOworICAgICAgY2FzZSBUX1BPSU5URVI6CisgICAgICByZXR1cm4gIih7IitpbXBsb2RlKG1hcChtaXgsIm1peGVkX3RvX3N0cmluZyIsTUUsbHZsLTEpLCIsIikrIn0pIjsKKyAgICAgIGNhc2UgVF9PQkpFQ1Q6CisgICAgICByZXR1cm4gIlsiK3Nob3J0X3BhdGgob2JqZWN0X25hbWUoKG9iamVjdCltaXgpKSsiXSI7CisgICAgICBjYXNlIFRfTUFQUElORzoKKyAgICAgIHM9c2l6ZW9mKGtleXM9bV9pbmRpY2VzKG1peCkpOworICAgICAgdD1nZXRfdHlwZV9pbmZvKG1peCwgMSk7CisgICAgICBzdHI9IihbIjsKKyAgICAgIGZvcihpPTA7aTxzO2krKykKKyAgICAgIHsKKwlzdHIrPW1peGVkX3RvX3N0cmluZyhrZXlzW2ldLCBsdmwtMSk7CisJaWYodCkKKwl7CisJICBzdHIrPSI6IittaXhlZF90b19zdHJpbmcobWl4W2tleXNbaV0sMF0sIGx2bC0xKTsKKwkgIGZvcihqPTE7ajx0O2orKykKKwkgICAgc3RyKz0iOyIrbWl4ZWRfdG9fc3RyaW5nKG1peFtrZXlzW2ldLGpdLCBsdmwtMSk7CisJfQorCWlmKGk8cy0xKSBzdHIrPSIsIjsKKyAgICAgIH0KKyAgICAgIHJldHVybiBzdHIrIl0pIjsKKyAgICAgIGNhc2UgVF9DTE9TVVJFOgorICAgICAgY2FzZSBUX1NZTUJPTDoKKyAgICAgIHJldHVybiBzcHJpbnRmKCIlTyIsIG1peCk7CisgICAgICBjYXNlIFRfUVVPVEVEX0FSUkFZOgorICAgICAgcmV0dXJuICInIittaXhlZF90b19zdHJpbmcoZnVuY2FsbChsYW1iZGEoMCwgbWl4KSksIGx2bC0xKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuICIuLi4iOworfQorCitpbnQgaXNfcGxheWVyKG9iamVjdCBvYmopCit7CisgIHJldHVybiBpc19vYmoob2JqKSYmcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYmopOworfQorCitpbnQgaXNfbm90X3BsYXllcihvYmplY3Qgb2JqKQoreworICByZXR1cm4gaXNfb2JqKG9iaikmJiFpc19wbGF5ZXIob2JqKTsKK30KKworaW50IHJvdW5kKGZsb2F0IHZhbCkKK3sKKyAgaW50IHRtcDsKKworICB0bXA9KGludCl2YWw7CisgIC8vIG9ubHkgcG9zaXRpdmUgdmFsCisgIGlmKCB2YWwgLSB0bXAgPj0gMC41ICkKKyAgICByZXR1cm4gdG1wKzE7CisgIHJldHVybiB0bXA7Cit9CmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL3Rvb2xsaWIuaCBiL29iai90b29scy9NR3Rvb2wvdG9vbGxpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZTgyNjQKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL3Rvb2xsaWIuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogTUd0b29sLTEuMAorICogRmlsZTogdG9vbGxpYi5oCisgKiBNYWludGFpbmVyOiBLaXJrQE1vcmdlbkdyYXVlbgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIHRoZSBvcmlnaW5hbCBYdG9vbCBpcyBjb3B5cmlnaHRlZCBieSBIeXAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBfX1RPT0xMSUJfSF9fCisjZGVmaW5lIF9fVE9PTExJQl9IX18gMQorCisjaWZuZGVmIE1BU1RFUgorI2RlZmluZSBNQVNURVIgX19NQVNURVJfT0JKRUNUX18KKyNlbmRpZgorCisjZGVmaW5lIGlzX29iaih4KSAgICAgICAgICgoeCkmJm9iamVjdHAoeCkpCisKKyNkZWZpbmUgaXNfbGl2aW5nKHgpICAgICAgKGlzX29iaih4KSYmbGl2aW5nKHgpKQorI2RlZmluZSBpc19ub3RfbGl2aW5nKHgpICAoaXNfb2JqKHgpJiYhaXNfbGl2aW5nKHgpKQorI2RlZmluZSBpc19uZXRkZWFkKHgpICAgICAoaXNfb2JqKHgpJiZpc19wbGF5ZXIoeCkmJiFpbnRlcmFjdGl2ZSh4KSkKKyNkZWZpbmUgaXNfYWxpdmUoeCkgICAgICAgKGlzX29iaih4KSYmaXNfcGxheWVyKHgpJiZpbnRlcmFjdGl2ZSh4KSkKKyNkZWZpbmUgaXNfc25vb3BlZCh4KSAgICAgKGlzX29iaih4KSYmb2JqZWN0cChxdWVyeV9zbm9vcCh4KSkpCisjZGVmaW5lIGlzX25vdF9zbm9vcGVkKHgpIChpc19vYmooeCkmJiFpc19zbm9vcGVkKHgpKQorI2RlZmluZSBpc19pbnZpcyh4KSAgICAgICAoaXNfb2JqKHgpJiYoKHgpLT5RdWVyeVByb3AoUF9JTlZJUyl8fCEoeCktPlF1ZXJ5UHJvcChQX1NIT1JUKSkpKQorI2RlZmluZSBpc19ub3RfaW52aXMoeCkgICAoaXNfb2JqKHgpJiYhaXNfaW52aXMoeCkpCisKKyNkZWZpbmUgcHVyZV9maWxlX25hbWUoeCkgICAgIChpc19vYmooeCk/b2xkX2V4cGxvZGUob2JqZWN0X25hbWUoeCksIiMiKVswXTowKQorI2RlZmluZSBzb3VyY2VfZmlsZV9uYW1lKHgpICAgKGlzX29iaih4KT9wdXJlX2ZpbGVfbmFtZSgoeCkpKyIuYyI6MCkKKyNkZWZpbmUgc3RyaW5nX3JlcGxhY2UoeCx5LHopIGltcGxvZGUoZXhwbG9kZSgoeCksKHkpKSwoeikpCisKK2ludCBzdHJpbmdfY29tcGFyZShzdHJpbmcgYSwgc3RyaW5nIGIpOworc3RyaW5nIGNhcF9zdHJpbmcoc3RyaW5nIHN0cik7ICAKK3N0cmluZyBzaG9ydF9wYXRoKHN0cmluZyBmaWxlKTsKK3N0cmluZyBsb25nX3BhdGgoc3RyaW5nIGZpbGUpOworLy9zdHJpbmcgKm9sZF9leHBsb2RlKHN0cmluZyBzdHIsIHN0cmluZyBkZWwpOworLy9zdHJpbmcgKmV4cGxvZGUoc3RyaW5nIHN0ciwgc3RyaW5nIGRlbCk7CitzdHJpbmcgKnN0cmlwX2V4cGxvZGUoc3RyaW5nIHN0ciwgc3RyaW5nIGRlbCk7CitzdHJpbmcgc3RyaXBfc3RyaW5nKHN0cmluZyBzdHIpOworc3RyaW5nICpsb25nX2dldF9kaXIoc3RyaW5nIHBhdCwgaW50IGFsbCk7CitzdHJpbmcgbGl0X3N0cmluZyhzdHJpbmcgc3RyKTsKK3N0cmluZyBtaXhlZF90b19zdHJpbmcobWl4ZWQgbWl4LCBpbnQgbGV2ZWwpOworaW50IGlzX3BsYXllcihvYmplY3Qgb2JqKTsKK2ludCBpc19ub3RfcGxheWVyKG9iamVjdCBvYmopOworaW50IHJvdW5kKGZsb2F0IHZhbCk7CisKKyNlbmRpZiAvKiBfX1RPT0xMSUJfSF9fICovCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvUkVBRE1FIGIvb2JqL3Rvb2xzL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDBjZTEwCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL1JFQURNRQpAQCAtMCwwICsxIEBACitUaGUgZmlsZXMgY29udGFpbmVkIGluIHRoaXMgc3VidHJlZSBhcmUgdW5zdXBwb3J0ZWQuCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvYnRvb2wuYyBiL29iai90b29scy9idG9vbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNjNlODgKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvYnRvb2wuYwpAQCAtMCwwICsxLDEyMSBAQAorI3ByYWdtYSBub19zaGFkb3csIG5vX2luaGVyaXQKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHNhdmVfdHlwZXMscnR0X2NoZWNrcworI3ByYWdtYSBwZWRhbnRpYyxyYW5nZV9jaGVjayx3YXJuX2RlcHJlY2F0ZWQKKyNwcmFnbWEgd2Fybl9lbXB0eV9jYXN0cyx3YXJuX21pc3NpbmdfcmV0dXJuLHdhcm5fZnVuY3Rpb25faW5jb25zaXN0ZW50CisKK2luaGVyaXQgIi9zdGQvdGhpbmciOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKworI2RlZmluZSBCQVJDSElWICIvZC9lcnptYWdpZXIvYm9pbmcvYmFsYW5jZS9iYXJjaGl2ZXMiCisKKyNkZWZpbmUgQlMoeCkgYnJlYWtfc3RyaW5nKHgsNzgsMCxCU19MRUFWRV9NWV9MRlMpCisKK3ByaXZhdGUgdmFyYXJncyB2b2lkIHByaW50X21hcChtYXBwaW5nIHRtcCxpbnQgc2hvcnQpOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfTkFNRSwiQmFsYW5jZS1Ub29sIik7CisgIEFkZElkKCh7ImJ0b29sIiwiYmFsYW5jZXRvb2wiLCJiYWxhbmNlLXRvb2wifSkpOworICBTZXRQcm9wKFBfU0hPUlQsIkVpbiBCYWxhbmNlLVRvb2wgbGlnaHQiKTsKKyAgU2V0UHJvcChQX0xPTkcsCisgICAgQlMoIkRpZXMgaXN0IGRhcyBCYWxhbmNlLVRvb2wgbGlnaHQuIEVzIHZlcnN0ZWh0IGZvbGdlbmRlIEJlZmVobGU6XG4iCisgICAgIi0gYnRvcCA8bj46IFplaWd0IGRlbiBsZXR6dGVuIGdlbmVobWlndGVuIEFudHJhZyB6dSBUb3Agbi5cbiIKKyAgICAiLSBic3VjaCBbLXNdIDxzdHI+OiBTdWNodCBjYXNlLXNlbnNpdGl2IG5hY2ggc3RyLCAtcyBicmljaHQgamVkZW4gIgorICAgICJFaW50cmFnIG5hY2ggNzggWmVpY2hlbiBhYi5cbiIKKyAgICAiLSBiaW5oYWx0IFstc106IFplaWd0IGRlbiBnZXNhbXRlbiBJbmhhbHQgZGVzIEJhbGFuY2VhcmNoaXZlcywgLXMgIgorICAgICJicmljaHQgamVkZW4gRWludHJhZyBuYWNoIDc4IFplaWNoZW4gYWIuXG5cbiIKKyAgICAiRXMga2FubiB2b3Jrb21tZW4sIGRhc3MgRWludHJhZWdlIGRlciBmYWxzY2hlbiBVSUQgenVnZW9yZG5ldCBzaW5kLCAiCisgICAgIm9kZXIgZGFzcyBkaWUgR2VuZWhtaWd1bmcgbmljaHQgc2VociBhdXNzYWdla3JhZWZ0aWcgaXN0LCBpbiBkaWVzZW0gIgorICAgICJGYWxsIGJpdHRlIGVpbmUgTWFpbCBhbiBkYXMgQmFsYW5jZXRlYW0gc2NocmVpYmVuLiIpKTsKKyAgQWRkQ21kKCJidG9wIiwKKyAgICBmdW5jdGlvbiBpbnQoc3RyaW5nIHN0cikKKyAgICB7CisgICAgICBpbnQgbjsKKyAgICAgIGlmKCFzdHIgfHwgc3NjYW5mKHN0ciwiJWQiLG4pIT0xKQorICAgICAgeworICAgICAgICBub3RpZnlfZmFpbCgKKyAgICAgICAgICBCUygiU3ludGF4OiBidG9wIDxuPiIpKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICB0aGlzX2ludGVyYWN0aXZlKCktPlJlY2VpdmVNc2coCisgICAgICAgIEJBUkNISVYtPkdldExpZ2h0QW5ub3VuY2UobiksCisgICAgICAgIE1UX05PVElGSUNBVElPTnxNU0dfQlNfTEVBVkVfTEZTKTsKKyAgICAgIHJldHVybiAxOworICAgIH0pOworICBBZGRDbWQoImJzdWNoIiwKKyAgICBmdW5jdGlvbiBpbnQoKQorICAgIHsKKyAgICAgIHN0cmluZyBzdHI9dGhpc19pbnRlcmFjdGl2ZSgpLT5fdW5wYXJzZWRfYXJncygpOworICAgICAgaWYoIXN0ciB8fCAhc2l6ZW9mKHN0cikpCisgICAgICB7CisgICAgICAgIG5vdGlmeV9mYWlsKAorICAgICAgICAgIEJTKCJTeW50YXg6IGJzdWNoIDxzdHI+IikpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGludCBzaG9ydDsKKyAgICAgIHN0cmluZyogYXJyPW9sZF9leHBsb2RlKHN0ciwiICIpOworICAgICAgCisgICAgICBpZihhcnJbMF09PSItcyIpCisgICAgICB7CisgICAgICAgIHNob3J0PTE7CisgICAgICAgIHN0cj1pbXBsb2RlKGFyclsxLi5dLCIgIik7CisgICAgICB9CisgICAgICBtYXBwaW5nIHRtcD1CQVJDSElWLT5TZWFyY2hJbmRleChzdHIpOworICAgICAgaWYoIXNpemVvZih0bXApKQorICAgICAgeworICAgICAgICB0aGlzX2ludGVyYWN0aXZlKCktPlJlY2VpdmVNc2coCisgICAgICAgICAgIktlaW5lIEVpbnRyYWVnZSBnZWZ1bmRlbi4iLAorICAgICAgICAgIE1UX05PVElGSUNBVElPTik7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHByaW50X21hcCh0bXAsc2hvcnQpOworICAgICAgfQorICAgICAgcmV0dXJuIDE7CisgICAgfSk7CisgIEFkZENtZCgiYmluaGFsdCIsCisgICAgZnVuY3Rpb24gaW50KHN0cmluZyBzdHIpCisgICAgeworICAgICAgaW50IHNob3J0OworICAgICAgaWYoc2l6ZW9mKHN0cikpCisgICAgICB7CisgICAgICAgIHN0cmluZyogYXJyPW9sZF9leHBsb2RlKHN0ciwiICIpOworICAgICAgCisgICAgICAgIGlmKGFyclswXT09Ii1zIikKKyAgICAgICAgeworICAgICAgICAgIHNob3J0PTE7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAKKyAgICAgIHByaW50X21hcChCQVJDSElWLT5HZXRJbmRleEZvcldpemFyZHMoKSxzaG9ydCk7CisgICAgICByZXR1cm4gMTsKKyAgICB9KTsKK30KKworcHJpdmF0ZSB2YXJhcmdzIHZvaWQgcHJpbnRfbWFwKG1hcHBpbmcgdG1wLGludCBzaG9ydCkKK3sKKwlpZiAoIW1hcHBpbmdwKHRtcCkpCisJeworCQl0aGlzX2ludGVyYWN0aXZlKCktPlJlY2VpdmVNc2coIktlaW5lIERhdGVuIHZvcmhhbmRlbi5cbiIpOworCQlyZXR1cm47CisJfQorICBpbnQqIHNvcnQ9c29ydF9hcnJheShtX2luZGljZXModG1wKSwjJz4pOworICBzdHJpbmcgcmV0PSIiOworICBmb3JlYWNoKGludCBpIDogc29ydCkKKyAgeworICAgIHN0cmluZyBzdHI9c3ByaW50ZigiICU0ZDogICVzIHslc30gKCVzKSIsaSx0bXBbaSwwXSx0bXBbaSwyXSwKKyAgICAgIHN0cmZ0aW1lKCIlZC4lbS4leSIsdG1wW2ksMV0pKTsKKyAgICBpZihzaG9ydCkKKyAgICB7CisgICAgICByZXQrPUJTKHN0clswLi43N10pOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgcmV0Kz1CUyhzdHIpOworICAgIH0KKyAgfQorICB0aGlzX2ludGVyYWN0aXZlKCktPk1vcmUocmV0KTsKK30KZGlmZiAtLWdpdCBhL29iai90b29scy9kYW5jZXRvb2wuYyBiL29iai90b29scy9kYW5jZXRvb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2YzYjlhCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL2RhbmNldG9vbC5jCkBAIC0wLDAgKzEsMzIxIEBACisvLyBEQU5DRVRPT0wuQyAgIFN0YW5kOiAxMC4xMi45NCBEYW5jZXIgCisvLworLy8gS2xlaW5lcyBUb29sIHp1bSBTY2hyZWliZW4gdW5kIE5hY2hzZWhlbiB2b24gRGV0YWlscy4KKy8vCisvLworIAoraW5oZXJpdCAic3RkL3RoaW5nIjsKKyAKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorIAorI2RlZmluZSBicyggeCApIGJyZWFrX3N0cmluZyggeCwgNzggKQorIAorcHJpdmF0ZSBpbnQgaSwgY291bnRlciwgZmlyc3RfZGV0YWlsX2xpbmUsIHN0YXJ0bGluZSwgZW5kbGluZTsgCitwcml2YXRlIHN0cmluZyAqZGV0YWlsX3Nob3J0cywgKm5ld3N0cmluZywgKmZpbGVfbGluZXMsICpuZXdfbGluZXM7Citwcml2YXRlIHN0cmluZyBkZXRhaWxfbG9uZywgc2F2ZV9zdHJpbmcsIG9sZF9maWxlLCBuZXdfZmlsZSwgYWN0dWFsX2ZpbGUsCisgICAgICAgICAgICAgICBkZXRhaWxfdGV4dDsKKyAgICAgICAKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgIDo6Y3JlYXRlKCk7CisgICBTZXRQcm9wKCBQX0FVVE9MT0FET0JKLDEgKTsKKyAgIFNldFByb3AoIFBfTkFNRSwgIkRhbmNlcnMgU2FuZHRpZ2Vya3JhbGxlIiApOworICAgU2V0UHJvcCggUF9HRU5ERVIsIEZFTUFMRSApOworICAgU2V0UHJvcCggUF9TSE9SVCwgIkRhbmNlcnMgU2FuZHRpZ2Vya3JhbGxlIiApOworICAgU2V0UHJvcCggUF9MT05HLCBicyggIkRpZSBTYW5kdGlnZXJrcmFsbGUgdm9uIERhbmNlciBpc3QgIisKKyAgICAgICAgICAgICAgImVpbiBrbGVpbmVzIFRvb2wsIG1pdCBkZW0gRHUgZ2V3b2VobmxpY2hlIERldGFpbHMgIisKKyAgICAgICAgICAgICAgImluIGFsbGVuIFJhZXVtZW4gbmFjaHNjaGF1ZW4gdW5kIGluIERlaW5lbiBlaWdlbmVuICIrCisgICAgICAgICAgICAgICJoaW56dWZ1ZWdlbiBrYW5uc3QuIFdlaXRlcmUgSW5mb3JtYXRpb25lbiBrYW5uc3QgRHUgIisKKyAgICAgICAgICAgICAgIm1pdCBkZW0gQmVmZWhsIDxkYW5jZXRvb2w+IGJla29tbWVuLiIgKSApOworICAgU2V0UHJvcCggUF9BUlRJQ0xFLCAyICk7CisgICBTZXRQcm9wKCBQX1dFSUdIVCwgNTAwICk7CisgICBTZXRQcm9wKCBQX1ZBTFVFLCAxMDAwMCApOworICAgU2V0UHJvcCggUF9OT0JVWSwgMSApOworICAgU2V0UHJvcCggUF9OT0RST1AsIDEgKTsKKyAgIEFkZElkKCAia3JhbGxlIiApOworICAgQWRkSWQoICJzYW5kdGlnZXJrcmFsbGUiICk7CisgICBBZGRJZCggInRpZ2Vya3JhbGxlIiApOworICAgQWRkSWQoICJkYW5jZXRvb2wiICk7CisgICBBZGRJZCggImRhbmNlcnRvb2wiICk7CisgICBzZXRldWlkKGdldHVpZCh0aGlzX29iamVjdCgpKSk7Cit9CisgCisgCit2b2lkIGluaXQoKQoreworICBpZiAoIUlTX0xFQVJORVIodGhpc19wbGF5ZXIoKSkpIHJldHVybjsKKyAgOjppbml0KCk7CisgIGFkZF9hY3Rpb24oInF1ZXJ5X2FkZF9kZXRhaWxzIiwgInNob3dfZGV0YWlsIiApOworICBhZGRfYWN0aW9uKCJxdWVyeV9hZGRfZGV0YWlscyIsICJzaG93X2RldGFpbHMiICk7CisgIGFkZF9hY3Rpb24oInF1ZXJ5X2FkZF9kZXRhaWxzIiwgInNkIiApOworICBhZGRfYWN0aW9uKCJzZXRfYWRkX2RldGFpbCIsICJhZGRfZGV0YWlsIiApOworICBhZGRfYWN0aW9uKCJzZXRfYWRkX2RldGFpbCIsICJhZGRfZGV0YWlscyIgKTsKKyAgYWRkX2FjdGlvbigic2V0X2FkZF9kZXRhaWwiLCAiYWQiICk7CisgIGFkZF9hY3Rpb24oImdpdmVfaW5mbyIsICJkYW5jZXRvb2wiICk7Cit9CisgCisgCitpbnQgZ2l2ZV9pbmZvKCkKK3sKKyAgIHdyaXRlKCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIgKTsKKyAgIHdyaXRlKCAiRGllIFNhbmR0aWdlcmtyYWxsZSBlcm1vZWdsaWNodCBmb2xnZW5kZSBCZWZlaGxlOlxuIiApOworICAgd3JpdGUoICJcbmFkZF9kZXRhaWwsIGFkZF9kZXRhaWxzIG9kZXIgYWQ6XG4iICk7CisgICB3cml0ZSggYnMoICJSdWZ0IGVpbmVuIGtsZWluZW4gQWRkRGV0YWlsLUVkaXRvciBhdWYsIG1pdCBkZW0gRHUgIisKKyAgICAgICJEZXRhaWxzIGluIERlaW5lIGVpZ2VuZW4gUmFldW1lIGVpbmZ1ZWdlbiBrYW5uc3QuIEFscyBBcmd1bWVudCAiKworICAgICAgImthbm4gaGludGVyIGRlbiBCZWZlaGwgZGVyIEZpbGVuYW1lIGVpbmVzIFJhdW1lcyBlaW5nZWdlYmVuICIrCisgICAgICAid2VyZGVuLiBXaXJkIGtlaW4gQXJndW1lbnQgZWluZ2VnZWJlbiwgc28gd2lyZCBkZXIgUmF1bSAiKworICAgICAgImdlbm9tbWVuLCBpbiBkZW0gRHUgZ2VyYWRlIHN0ZWhzdC4gQWNodHVuZzogRXMga29lbm5lbiAiKworICAgICAgIm51ciBEZXRhaWxzIGluIFJhZXVtZSBlaW5nZWZ1ZWd0IGhhYmVuLCBkaWUgYmVyZWl0cyBlaW4gIisKKyAgICAgICJBZGREZXRhaWwgaW4gaWhyZW0gY3JlYXRlKCkgaGFiZW4uIER1IG11c3N0IGRpZSBMdXBlIGhhYmVuLCAiKworICAgICAgImRhIGRlciBSYXVtIG5hY2ggZGVtIEVpbmZ1ZWdlbiBkZXMgRGV0YWlscyBhdXRvbWF0aXNjaCAiKworICAgICAgIm5ldSBnZWxhZGVuIHdpcmQuIiApICk7CisgICB3cml0ZSggIlxuc2hvd19kZXRhaWwsIHNob3dfZGV0YWlscyBvZGVyIHNkOlxuIiApOworICAgd3JpdGUoIGJzKCAiWmVpZ3QgRGlyIGFsbGUgWmVpbGVuIGRlcyBhbmdlc3Byb2NoZW5lbiBSYXVtZXMgYnp3LiAiKworICAgICAgImRlcyBSYXVtZXMgaW4gZGVtIER1IHN0ZWhzdCwgZGllIGVpbiBBZGREZXRhaWwgIisKKyAgICAgICJiZWluaGFsdGVuLiBTbyBrYW5uc3QgRHUga29udHJvbGxpZXJlbiwgd2VsY2hlIERldGFpbHMgIisKKyAgICAgICJEdSBzY2hvbiBlaW5nZWJhdXQgaGFzdC4iICkgKTsKKyAgIHdyaXRlKCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIgKTsKKyAgIHJldHVybiAxOworfQorIAorIAoraW50IHJlbmV3X3ZhcmlhYmxlcygpCit7CisgICBpID0gY291bnRlciA9IGZpcnN0X2RldGFpbF9saW5lID0gc3RhcnRsaW5lID0gZW5kbGluZSA9IDA7IAorICAgZGV0YWlsX3Nob3J0cyA9IG5ld3N0cmluZyA9IGZpbGVfbGluZXMgPSBuZXdfbGluZXMgPSAoe30pOworICAgZGV0YWlsX2xvbmcgPSBzYXZlX3N0cmluZyA9IG9sZF9maWxlID0gbmV3X2ZpbGUgPSBhY3R1YWxfZmlsZSA9IGRldGFpbF90ZXh0ID0gMDsKKyAgIHJldHVybiAxOworfSAKKyAKKyAKKyAKK2ludCBxdWVyeV9hZGRfZGV0YWlscyggc3RyaW5nIHN0ciApCit7CisgICBzdHJpbmcgb2xkX2ZpbGUsICpmaWxlX2xpbmVzLCBuZXdfZmlsZSwgKm5ld19saW5lcywgYWN0dWFsX2ZpbGU7ICAgICAgICAKKyAgIGludCBpLCBjb3VudGVyLCBmaXJzdF9kZXRhaWxfbGluZSwgc3RhcnRsaW5lLCBlbmRsaW5lOyAgICAgIAorIAorICAgYWN0dWFsX2ZpbGUgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgIGlmICggIXN0ciApIGFjdHVhbF9maWxlID0gb2JqZWN0X25hbWUoIGVudmlyb25tZW50KCB0aGlzX3BsYXllcigpICkgKSsiLmMiOworICAgZWxzZSAgICAgICAKKyAgIHsKKyAgICAgIGlmICggc3RyWzAuLjBdID09ICIvIiApCisgICAgICB7CisgICAgICAgICBpZiAoIHN0cls8Mi4uXSAhPSAiLmMiICkKKyAgICAgICAgICAgICBhY3R1YWxfZmlsZSA9IHN0cisiLmMiOworICAgICAgICAgZWxzZQorICAgICAgICAgICAgIGFjdHVhbF9maWxlID0gc3RyOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgaWYgKCBzdHJbPDIuLl0gIT0gIi5jIiApCisgICAgICAgICAgICAgYWN0dWFsX2ZpbGUgPSB0aGlzX3BsYXllcigpLT5RdWVyeVByb3AoIFBfQ1VSUkVOVERJUiApKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8iK3N0cisiLmMiOworICAgICAgICAgZWxzZQorICAgICAgICAgICAgIGFjdHVhbF9maWxlID0gdGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKCBQX0NVUlJFTlRESVIgKSsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIvIitzdHI7CisgICAgICB9CisgICB9CisgICBpZiAoIGZpbGVfc2l6ZSggYWN0dWFsX2ZpbGUgKT09LTEgKQorICAgeworICAgICB3cml0ZSggIkZpbGU6ICIrYWN0dWFsX2ZpbGUrIiBuaWNodCBnZWZ1bmRlbiFcbiIgKTsKKyAgICAgcmV0dXJuIDE7CisgICB9CisgICBjYWxsX290aGVyKCBhY3R1YWxfZmlsZSwgIj8/PyIgKTsKKyAgIHdyaXRlKCAiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiApOworICAgd3JpdGUoICJBa3R1ZWxsZXMgRmlsZTogICAiK2FjdHVhbF9maWxlKyJcbiIgKTsKKyAgIHdyaXRlKCAiRmlsZWdyb2Vzc2U6ICAgICAgIitmaWxlX3NpemUoIGFjdHVhbF9maWxlICkrIlxuIiApOworICAgd3JpdGUoICJVc2VyaWQgZGVzIEZpbGVzOiAiK2dldHVpZCggZmluZF9vYmplY3QoIGFjdHVhbF9maWxlICkgKSsiXG4iICk7CisgICBuZXdfZmlsZSA9ICIiOworICAgY291bnRlciA9IDA7CisgICBmaXJzdF9kZXRhaWxfbGluZSA9IDA7CisgICBvbGRfZmlsZSA9IHJlYWRfZmlsZSggYWN0dWFsX2ZpbGUgKTsKKyAgIGZpbGVfbGluZXMgPSAoeyAiZHVtbXkiIH0pICsgb2xkX2V4cGxvZGUoIG9sZF9maWxlLCAiXG4iICk7ICAgICAgICAgIAorICAgc3RhcnRsaW5lID0gMTsKKyAgIGVuZGxpbmUgPSBzaXplb2YoIGZpbGVfbGluZXMgKS0xOyAgICAgICAgCisgICBmb3IoIGkgPSBzdGFydGxpbmU7IGkgPD0gZW5kbGluZTsgaSsrICkKKyAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgbmV3X2ZpbGUgPSBuZXdfZmlsZStmaWxlX2xpbmVzWyBpIF0rIlxuIjsKKyAgICAgIGlmICggc3Ryc3RyKCBmaWxlX2xpbmVzW2ldLCAiQWRkRGV0YWlsIiApICE9IC0xICkKKyAgICAgIHsKKyAgICAgICAgIHdyaXRlKCBmaWxlX2xpbmVzW2ldKyJcbiIgKTsKKyAgICAgICAgIGlmICggIWZpcnN0X2RldGFpbF9saW5lICkgZmlyc3RfZGV0YWlsX2xpbmUgPSBpOworICAgICAgICAgIGNvdW50ZXIgPSBjb3VudGVyICsgMTsKKyAgICAgIH0KKyAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgd3JpdGUoICJEZXRhaWxzIGZvdW5kOiAiK2NvdW50ZXIrIi5cbiIgKTsgCisgICB3cml0ZSggIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iICk7CisgICByZXR1cm4gMTsKK30gICAgCisgCisgCitpbnQgc2V0X2FkZF9kZXRhaWwoIHN0cmluZyBzdHIgKQoreworIAorICAgcmVuZXdfdmFyaWFibGVzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICBpZiAoICFzdHIgKSBhY3R1YWxfZmlsZSA9IG9iamVjdF9uYW1lKCBlbnZpcm9ubWVudCggdGhpc19wbGF5ZXIoKSApICkrIi5jIjsKKyAgIGVsc2UgICAgICAgCisgICB7CisgICAgICBpZiAoIHN0clswLi4wXSA9PSAiLyIgKQorICAgICAgeworICAgICAgICAgaWYgKCBzdHJbPDIuLl0gIT0gIi5jIiApCisgICAgICAgICAgICAgYWN0dWFsX2ZpbGUgPSBzdHIrIi5jIjsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICBhY3R1YWxfZmlsZSA9IHN0cjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIGlmICggc3RyWzwyLi5dICE9ICIuYyIgKQorICAgICAgICAgICAgIGFjdHVhbF9maWxlID0gdGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKCBQX0NVUlJFTlRESVIgKSsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIvIitzdHIrIi5jIjsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICBhY3R1YWxfZmlsZSA9IHRoaXNfcGxheWVyKCktPlF1ZXJ5UHJvcCggUF9DVVJSRU5URElSICkrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiLyIrc3RyOworICAgICAgfQorICAgfQorICAgaWYgKCBmaWxlX3NpemUoIGFjdHVhbF9maWxlICk9PS0xICkKKyAgIHsKKyAgICAgd3JpdGUoICJGaWxlOiAiK2FjdHVhbF9maWxlKyIgbmljaHQgZ2VmdW5kZW4hXG4iICk7CisgICAgIHJldHVybiAxOworICAgfQorICAgY2FsbF9vdGhlciggYWN0dWFsX2ZpbGUsICI/Pz8iICk7CisgICB3cml0ZSggIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIgKTsKKyAgIHdyaXRlKCAiQWt0dWVsbGVzIEZpbGU6ICAgIithY3R1YWxfZmlsZSsiXG4iICk7CisgICB3cml0ZSggIkZpbGVncm9lc3NlOiAgICAgICIrZmlsZV9zaXplKCBhY3R1YWxfZmlsZSApKyJcbiIgKTsKKyAgIHdyaXRlKCAiVXNlcmlkIGRlcyBGaWxlczogIitnZXR1aWQoIGZpbmRfb2JqZWN0KCBhY3R1YWxfZmlsZSApICkrIlxuIiApOworICAgbmV3X2ZpbGUgPSAiIjsKKyAgIG5ld19saW5lcyA9ICh7ICJkdW1teSIgfSk7CisgICBjb3VudGVyID0gMDsKKyAgIGZpcnN0X2RldGFpbF9saW5lID0gMDsKKyAgIG9sZF9maWxlID0gcmVhZF9maWxlKCBhY3R1YWxfZmlsZSApOworICAgZmlsZV9saW5lcyA9ICh7ICJkdW1teSIgfSkgKyBvbGRfZXhwbG9kZSggb2xkX2ZpbGUsICJcbiIgKTsgICAgICAgICAgCisgICBzdGFydGxpbmUgPSAxOworICAgZW5kbGluZSA9IHNpemVvZiggZmlsZV9saW5lcyApLTE7ICAgICAgICAKKyAgIGZvciggaSA9IHN0YXJ0bGluZTsgaSA8PSBlbmRsaW5lOyBpKysgKQorICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBuZXdfZmlsZSA9IG5ld19maWxlK2ZpbGVfbGluZXNbIGkgXSsiXG4iOworICAgICAgaWYgKCBzdHJzdHIoIGZpbGVfbGluZXNbaV0sICJBZGREZXRhaWwiICkgIT0gLTEgKQorICAgICAgeworICAgICAgICBpZiAoICFmaXJzdF9kZXRhaWxfbGluZSApIGZpcnN0X2RldGFpbF9saW5lID0gaTsKKyAgICAgICAgY291bnRlciA9IGNvdW50ZXIgKyAxOworICAgICAgfQorICAgfQorICAgaWYgKCAhZmlyc3RfZGV0YWlsX2xpbmUgKQorICAgeworICAgICAgd3JpdGUoIGJzKCAiRXMgd3VyZGVuIGltIEZpbGUgIithY3R1YWxfZmlsZSsiIGtlaW5lICIrCisgICAgICAgICAiRGV0YWlscyBnZWZ1bmRlbiEgVW0gRGV0YWlscyBoaW56dWZ1ZWdlbiB6dSBrb2VubmVuLCAiKworICAgICAgICAgIm11c3MgbWluZGVzdGVucyBlaW4gQWRkRGV0YWlsIGJlcmVpdHMgdm9yaGFuZGVuIHNlaW4hIiApICk7CisgICAgICB3cml0ZSggIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iICk7CisgICAgICByZXR1cm4gMTsKKyAgIH0KKyAgIHdyaXRlKCAiRGV0YWlscyBmb3VuZDogICAgIitjb3VudGVyKyIuXG4iICk7CisgICB3cml0ZSggIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iICk7IAorICAgd3JpdGUoICJCaXR0ZSBkaWUgRGV0YWlsLUt1ZXJ6ZWwgZWluZ2ViZW46XG4oQmVtZXJrdW5nOiAiKworICAgICAgICAgICJkaWUgS3VlcnplbCBtdWVzc2VuIG1pdCBMZWVyemVpY2hlbiBnZXRyZW5udCBzZWluLCAiKworICAgICAgICAgICJBYmJydWNoIG1pdCAncScuKVxuLT4iICk7CisgICBpbnB1dF90byggImdldF9kZXRhaWxfc2hvcnQiICk7CisgICByZXR1cm4gMTsKK30gICAgCisgCisgCitpbnQgZ2V0X2RldGFpbF9zaG9ydCggc3RyaW5nIHN0ciApCit7CisgICBzdHJpbmcgZHVtbXk7CisgICBpZiAoIHN0ciA9PSAicSIgKQorICAgeworICAgICB0ZWxsX29iamVjdCggdGhpc19wbGF5ZXIoKSwgIkFiZ2Vicm9jaGVuIVxuIiApOworICAgICByZXR1cm4gMTsKKyAgIH0KKyAgIGRldGFpbF9zaG9ydHMgPSBtYXAoIG9sZF9leHBsb2RlKCBzdHIsICIgIiApLCMnbG93ZXJfY2FzZSk7CisgICBkdW1teSA9IGJyZWFrX3N0cmluZyhpbXBsb2RlKHNvcnRfYXJyYXkobWFwKGRldGFpbF9zaG9ydHMsIydsb3dlcl9jYXNlKSwjJz4pLCIsICIpKyI6Iiw3OCk7CisgICB3cml0ZSggIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iICk7CisgICB3cml0ZSggYnMgKCAiQml0dGUgQmVzY2hyZWlidW5nIGVpbmdlYmVuIGZ1ZXIgZGFzIERldGFpbCBtaXQgZGVuIE5hbWVuIFxuIiApICk7CisgICB3cml0ZSggZHVtbXkrIiggQWJicnVjaCBtaXQgJ3EnLilcbi0+IiApOworICAgaW5wdXRfdG8oICJnZXRfZGV0YWlsX2xvbmciICk7CisgICByZXR1cm4gMTsKK30KKyAKKyAKK2ludCBnZXRfZGV0YWlsX2xvbmcoIHN0cmluZyBzdHIgKQoreworICAgaWYgKCBzdHIgPT0gInEiICkKKyAgIHsKKyAgICAgd3JpdGUoICJBYmdlYnJvY2hlbiFcbiIgKTsKKyAgICAgd3JpdGUoICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiApOworICAgICByZXR1cm4gMTsKKyAgIH0KKyAgIGRldGFpbF9sb25nID0gYnJlYWtfc3RyaW5nKCAiYnJlYWtfc3RyaW5nKCBcIiIrc3RyLCA2MCApOyAKKyAgIHNhdmVfc3RyaW5nID0gIiAgQWRkRGV0YWlsKCAoeyAiOyAgICAgICAgCisgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZW9mKCBkZXRhaWxfc2hvcnRzICk7IGkgKysgKQorICAgeworICAgICAgaWYgKCAhKGklMykgJiYgaSApCisgICAgICAgIHNhdmVfc3RyaW5nID0gc2F2ZV9zdHJpbmcgKyAiXG4gICAgICAgICAgICAgICAgIjsKKyAgICAgIGlmICggaSA8IHNpemVvZiggZGV0YWlsX3Nob3J0cyApIC0gMSApIAorICAgICAgICAgZGV0YWlsX3Nob3J0c1sgaSBdID0gIlwiIitkZXRhaWxfc2hvcnRzWyBpIF0rIlwiLCAiOworICAgICAgZWxzZQorICAgICAgICAgZGV0YWlsX3Nob3J0c1sgaSBdID0gIlwiIitkZXRhaWxfc2hvcnRzWyBpIF0rIlwiICI7CisgICAgICBzYXZlX3N0cmluZyA9IHNhdmVfc3RyaW5nICsgZGV0YWlsX3Nob3J0c1sgaSBdOyAgICAgIAorICAgICAgd3JpdGUoIGRldGFpbF9zaG9ydHNbIGkgXSsiXG4iICk7CisgICB9CisgICBzYXZlX3N0cmluZyA9IHNhdmVfc3RyaW5nICsgIn0pLCBcbiI7CisgICBuZXdzdHJpbmcgPSBvbGRfZXhwbG9kZSggZGV0YWlsX2xvbmcsIlxuIik7CisgICBpID0gMDsgCisgICBmb3IoIGkgPSAwOyBpPHNpemVvZihuZXdzdHJpbmcpOyBpKyspIAorICAgeworICAgICAgaWYgKCBpIDwgc2l6ZW9mKG5ld3N0cmluZyktMSApCisgICAgICB7CisgICAgICAgICBpZiAoIGk9PTB8fCFpICkKKyAgICAgICAgICBzYXZlX3N0cmluZyA9IHNhdmVfc3RyaW5nICsiICAgICAgICAgICAgICAgICIrbmV3c3RyaW5nW2ldKyIgXCIrXG4iOworICAgICAgICAgZWxzZQorICAgICAgICAgIHNhdmVfc3RyaW5nID0gc2F2ZV9zdHJpbmcgKyIgICAgICAgICAgICAgICAgXCIiKyBuZXdzdHJpbmdbaV0rIiBcIitcbiI7CisgCisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBpZiAoIGk9PTB8fCFpICkKKyAgICAgICAgICBzYXZlX3N0cmluZyA9IHNhdmVfc3RyaW5nICsiICAgICAgICAgICAgICAgICIrIG5ld3N0cmluZ1tpXSsiXCIsIDc4ICkgKTsiOworICAgICAgICAgZWxzZQorICAgICAgICAgIHNhdmVfc3RyaW5nID0gc2F2ZV9zdHJpbmcgKyIgICAgICAgICAgICAgICAgXCIiKyBuZXdzdHJpbmdbaV0rIlwiLCA3OCApICk7IjsKKyAgICAgIH0KKyAgIH0KKyAgIG5ld19saW5lcyArPSAoeyAiZHVtbXkiIH0pOworICAgZm9yICggaSA9IDE7IGkgPCBmaXJzdF9kZXRhaWxfbGluZTsgaSsrICkKKyAgIHsKKyAgICAgbmV3X2xpbmVzICs9ICh7IGZpbGVfbGluZXNbaV0gfSk7CisgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgbmV3X2xpbmVzICs9ICh7IHNhdmVfc3RyaW5nIH0pOworICAgZm9yICggaSA9IGZpcnN0X2RldGFpbF9saW5lICsgMTsgaSA8PSBlbmRsaW5lKzE7IGkrKyApCisgICAgIG5ld19saW5lcyArPSAoeyBmaWxlX2xpbmVzWyBpIC0gMSBdIH0pOworICAgd3JpdGUoICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiApOworICAgd3JpdGUoIGJzKCAiRm9sZ2VuZGUgWmVpbGVuIHdlcmRlbiBpbiBkaWUgRGF0ZWkgIithY3R1YWxfZmlsZSsiIGdlc2NocmllYmVuLCBmYWxscyBgamAgZWluZ2VnZWJlbiB3aXJkOlxuIiApICk7CisgICB3cml0ZSggc2F2ZV9zdHJpbmcrIlxuIiApOworICAgd3JpdGUoICJcbkRldGFpbCBzcGVpY2hlcm4/IChqL24pXG4tPiIgKTsKKyAgIGlucHV0X3RvKCAic2F2ZV9kZXRhaWwiICk7CisgICByZXR1cm4gMTsKK30KKyAKKyAKK2ludCBzYXZlX2RldGFpbCggc3RyaW5nIHN0ciApCit7ICAKKyAgIGlmICggc3RyICE9ICJqIiAmJiBzdHIgIT0gImphIiAmJiBzdHIgIT0gIkphIiAmJiBzdHIgIT0gIkoiICkKKyAgIHsKKyAgICAgd3JpdGUoICJBYmdlYnJvY2hlbiFcbiIgKTsKKyAgICAgd3JpdGUoICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiApOworICAgICByZXR1cm4gMTsKKyAgIH0gICAKKyAgIGlmICggIXJtKCBhY3R1YWxfZmlsZSApICkKKyAgIHsKKyAgICAgIHdyaXRlKCAiRmlsZTogIithY3R1YWxfZmlsZSsiIHd1cmRlIG5pY2h0IGdlZnVuZGVuIVxuIiApOworICAgICAgcmV0dXJuIDE7CisgICB9ICAgICAgICAgICAgICAgICAgIAorICAgZm9yICggaSA9IDI7IGkgPD0gZW5kbGluZSsyOyBpKysgKQorICAgICB3cml0ZV9maWxlKCBhY3R1YWxfZmlsZSwgbmV3X2xpbmVzW2ldKyJcbiIgKTsgCisgICAgIC8vd3JpdGUoIG5ld19saW5lc1tpXSsiXG4iICk7IAorICAgd3JpdGUoICJEYXMgRGV0YWlsIHd1cmRlIGluIGRpZSBEYXRlaSBnZXNjaHJpZWJlbi5cbiIgKTsKKyAgIHRoaXNfcGxheWVyKCktPmNvbW1hbmRfbWUoICJoZXJlIG1ha2UiICk7CisgICB3cml0ZSggIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iICk7ICAKKyAgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL2V4cGxvcmVyLmMgYi9vYmovdG9vbHMvZXhwbG9yZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmRhOGFjCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL2V4cGxvcmVyLmMKQEAgLTAsMCArMSw0NDUgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBleHBsb3Jlci5jIC0tIFRvb2wgenVyIEZQLVZlcndhbHR1bmcKKy8vCisvLyAkSWQ6IGV4cGxvcmVyLmMgODM1NyAyMDEzLTAyLTA5IDExOjE2OjE0WiBaZXNzdHJhICQKKworaW5oZXJpdCAiL3N0ZC9zZWN1cmVfdGhpbmciOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGV4cGxvcmF0aW9uLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisKK2NyZWF0ZSgpCit7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9TSE9SVCwgIkRlciBFcmZvcnNjaGVyIik7CisgIFNldFByb3AoUF9OQU1FLCAiRXJmb3JzY2hlciIpOworICBTZXRQcm9wKFBfR0VOREVSLCBNQUxFKTsKKyAgU2V0UHJvcChQX0xPTkcsICJEaWVzIGlzdCBkZXIgYmVydWVobXRlIEVyZm9yc2NoZXIgZGVzIE1vcmdlbkdyYXVlbnMuIEVyXG4iCisJICArInN0ZWxsdCBmb2xnZW5kZSBCZWZlaGxlIHp1ciBWZXJmdWVndW5nOlxuIgorCSAgKyIgIGVwYWRkIDx3YXM+OiA8Ym9udXM+IDx0eXA+IDxrZXlzPlxuIgorCSAgKyIgIGVwY2hhbmdlIDx3YXM+OiA8d2llPiA8bmV1PlxuIgorCSAgKyIgIGVwZGVsIDx3YXM+XG4iCisJICArIiAgZXBpbmZvIDx3YXM+XG4iCisJICArIiAgZXBjb3VudCA8c3BpZWxlcm5hbWU+ICAgICAgICAgICAgICAgICAgIC0gQW56YWhsIGRlciBFUHMgZGVzIFNwaWVsZXJzXG4iCisJICArIiAgZXBzY2FuIDxzcGllbGVybmFtZT4gW2ZpbGVuYW1lbnBhdHRlcm5dIC0gWmVpZ2UgZGVzc2VuIEVQcyBnZWZpbHRlcnQgYW5cbiIKKwkgICsiICBlcHBsYWRkIDxzcGllbGVybmFtZT4gPGVwLWFuemFobD4gICAgICAgLSBHaWIgaWhtIGVwLWFuemFobCBFUHMgKHp1ZmFlbGxpZylcbiIKKwkgICsiICBlcHBsZGVsIDxzcGllbGVybmFtZT4gPGVwLWFuemFobD4gICAgICAgLSBMb2VzY2hlIGlobSBlcC1hbnphaGwgRVBzICh6dWZhZWwuKVxuIgorCSAgKyIgIGVwcGxzZXQgPHNwaWVsZXJuYW1lPiA8ZXAtbnVtbWVyPiAgICAgICAtIFNldHplIGlobSBFUCBlcC1udW1tZXJcbiIKKwkgICsiICBlcHBsY2xyIDxzcGllbGVybmFtZT4gPGVwLW51bW1lcj4gICAgICAgLSBMb2VzY2hlIGlobSBFUCBlcC1udW1tZXJcbiIKKwkgICsiRGFiZWkgYmVkZXV0ZXQ6XG4iCisJICArIjx3YXM+ICAgLSBEYXMgT2JqZWt0IChlaW5lIElEIGJlaSBPYmpla3RlbiBpbiBkZXIgTmFlaGUsIGhpZXIgb2RlclxuIgorCSAgKyIgICAgICAgICAgaGVyZSBmdWVyIGRlbiBha3R1ZWxsZW4gUmF1bSwgb2RlciBlaW4gRGF0ZWluYW1lKVxuIgorCSAgKyI8Ym9udXM+IC0gbiBmdWVyIG5vcm1hbGUgRVBzLCBiIGZ1ZXIgQm9udXMtRVBzICh6LkIuIFBhcmEtRVBzKVxuIgorCSAgKyI8dHlwPiAgIC0gZGV0YWlsLCByZGV0YWlsLCBleGl0L2F1c2dhbmcsIGNtZC9iZWZlaGwva29tbWFuZG8sIGluZm8sIHB1YiwgbWlzYyxcbiIKKwkgICsiICAgICAgICAgIHNtZWxsL2dlcnVjaCwgc291bmQvbm9pc2UsIHRhc3RlL3RvdWNoXG4iCisJICArIjxrZXk+ICAgLSBMaXN0ZSBkZXIgU2NobHVlc3NlbHdvZXJ0ZXIsIG1pdCBLb21tYXRhIGdldHJlbm50XG4iCisJICArIjx3aWU+ICAgLSBvYmosIGtleSwgYm9udXMgb2RlciB0eXAgMVxuIgorCSAgKyI8bmV1PiAgIC0gSmUgbmFjaCA8d2llPjsgc2llaGUgPHdhcz4sIDxrZXk+LCA8dHlwPlxuIgorCSAgKTsKKyAgU2V0UHJvcChQX05PRFJPUCwgMSk7CisgIFNldFByb3AoUF9ORVZFUkRST1AsIDEpOworICBTZXRQcm9wKFBfQVVUT0xPQURPQkosMSk7CisgIEFkZElkKCh7ImV4cGxvcmVyIiwiZXJmb3JzY2hlciJ9KSk7CisKKyAgQWRkQ21kKCh7ImVwYWRkIn0pLCAiYWRkIik7CisgIEFkZENtZCgoeyJlcGNoYW5nZSJ9KSwgImNoYW5nZSIpOworICBBZGRDbWQoKHsiZXBkZWwifSksICJkZWwiKTsKKyAgQWRkQ21kKCh7ImVwaW5mbyJ9KSwgImluZm8iKTsKKyAgQWRkQ21kKCh7ImVwY291bnQifSksICJlcGNvdW50Iik7CisgIEFkZENtZCgoeyJlcHNjYW4ifSksICJlcHNjYW4iKTsKKyAgQWRkQ21kKCh7ImVwcGxhZGQifSksICJlcHBsYWRkIik7CisgIEFkZENtZCgoeyJlcHBsZGVsIn0pLCAiZXBwbGRlbCIpOworICBBZGRDbWQoKHsiZXBwbHNldCJ9KSwgImVwcGxzZXQiKTsKKyAgQWRkQ21kKCh7ImVwcGxjbHIifSksICJlcHBsY2xyIik7Cit9CisKK3N0YXRpYyBzdHJpbmcgc3RyQXJyKHN0cmluZyAqcykKK3sKKyAgc3RyaW5nIHJldDsKKyAgaW50IGk7CisKKyAgcmV0ID0gKCJcIiIgKyBzWzwxXSArICJcIiIpOworICBmb3IgKGk9c2l6ZW9mKHMpLTI7IGk+PTA7IGktLSkKKyAgICByZXQgKz0gKCIsIFwiIitzW2ldKyJcIiIpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2V0VHlwZShzdHJpbmcgcykKK3sKKyAgc3dpdGNoKHNbMC4uMl0pIHsKKyAgY2FzZSAiZGV0IjoKKyAgICByZXR1cm4gRVBfREVUQUlMOworICBjYXNlICJyZGUiOgorICAgIHJldHVybiBFUF9SREVUOworICBjYXNlICJhdXMiOgorICBjYXNlICJleGkiOgorICAgIHJldHVybiBFUF9FWElUOworICBjYXNlICJjbWQiOgorICBjYXNlICJiZWYiOgorICBjYXNlICJrb20iOgorICAgIHJldHVybiBFUF9DTUQ7CisgIGNhc2UgImluZiI6CisgICAgcmV0dXJuIEVQX0lORk87CisgIGNhc2UgInB1YiI6CisgICAgcmV0dXJuIEVQX1BVQjsKKyAgY2FzZSAibWlzIjoKKyAgY2FzZSAidmVyIjoKKyAgICByZXR1cm4gRVBfTUlTQzsKKyAgY2FzZSAic21lIjoKKyAgY2FzZSAiZ2VyIjoKKyAgICByZXR1cm4gRVBfU01FTEw7CisgIGNhc2UgInNvdSI6CisgIGNhc2UgIm5vaSI6CisgICAgcmV0dXJuIEVQX1NPVU5EOworICBjYXNlICJ0YXMiOgorICBjYXNlICJ0b3UiOgorICAgIHJldHVybiBFUF9UT1VDSDsKKyAgfQorICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBvYmplY3QgZ2V0T2Ioc3RyaW5nIHN0cikKK3sKKyAgb2JqZWN0IG9iOworCisgIGlmIChzdHIgPT0gImhpZXIiIHx8IHN0ciA9PSAiaGVyZSIgKQorICAgIHJldHVybiBlbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKTsKKworICBvYiA9IHByZXNlbnQoc3RyLCBlbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKSk7CisgIGlmICghb2IpCisgICAgb2IgPSBwcmVzZW50KHN0ciwgdGhpc19wbGF5ZXIoKSk7CisKKyAgaWYgKCFvYikgeworICAgIHN0ciA9ICIvc2VjdXJlL21hc3RlciItPl9nZXRfcGF0aChzdHIsIGdldHVpZCh0aGlzX3BsYXllcigpKSk7CisgICAgY2F0Y2goY2FsbF9vdGhlcihzdHIsICI/Pz8iKSk7CisgICAgb2IgPSBmaW5kX29iamVjdChzdHIpOworICB9CisgIHJldHVybiBvYjsKK30KKworc3RhdGljIHN0cmluZyAqZ2V0S2V5cyhzdHJpbmcgc3RyKQoreworICBpbnQgaTsKKyAgc3RyaW5nICp0MSwgKnQyOworCisgIHQxID0gcmVnZXhwbG9kZShzdHIsICIsICoiKTsKKyAgZm9yICh0MiA9ICh7fSksIGk9c2l6ZW9mKHQxKS0xOyBpPj0wOyBpLT0yKQorICAgIHQyID0gKHsgdDFbaV0gfSkgKyB0MjsKKyAgcmV0dXJuIHQyOworfQorCitzdGF0aWMgc3RyaW5nIGVyck1zZyhpbnQgY29kZSkKK3sKKyAgaWYgKGNvZGUgPj0gMCB8fCBjb2RlIDwgRVBFUlJfSU5WQUxJRF9BUkcpCisgICAgcmV0dXJuICJVbmJla2FubnRlciBGZWhsZXIiOworCisgIGNvZGUgPSAtKGNvZGUrMSk7CisgIHJldHVybiAoeyAiRHUgYmlzdCBrZWluIEVyem1hZ2llciIsICJVbmd1ZWx0aWdlcyBPYmpla3QiLAorCSAgICAiT2JqZWt0IHN0ZWh0IG5pY2h0IGluIGRlciBMaXN0ZSIsICJVbmd1ZWx0aWdlcyBBcmd1bWVudCJ9KVtjb2RlXTsKK30KKworc3RhdGljIGludCBhZGQoc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIHdhcywgdCwgaywgKmtleXMsIGI7CisgIGludCB0eXBlLCBib251czsKKyAgb2JqZWN0IG9iOworCisgIGlmKCAhQVJDSF9TRUNVUklUWSApIHsKKyAgICBub3RpZnlfZmFpbCgiRHUgYmlzdCBrZWluIEVyem1hZ2llciFcbiIpOworICAgIHJldHVybiAwOworICB9CisgIG5vdGlmeV9mYWlsKCJTeW50YXg6IGVwYWRkIDx3YXM+OiA8dHlwPlxuIik7CisgIGlmICghKHN0ciA9IHRoaXNfcGxheWVyKCktPl91bnBhcnNlZF9hcmdzKCkpKQorICAgIHJldHVybiAwOworCisgIGlmIChzc2NhbmYoc3RyLCAiJXM6ICVzICVzICVzIiwgd2FzLCBiLCB0LCBrKSAhPTQpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKCEob2IgPSBnZXRPYih3YXMpKSkgeworICAgIHByaW50ZigiS2FubiAnJXMnIG5pY2h0IGZpbmRlbiFcbiIsIHdhcyk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKCh0eXBlID0gZ2V0VHlwZSh0KSkgPCAwKSB7CisgICAgd3JpdGUoIlVuZ3VlbHRpZ2VyIFR5cCFcbiIpOworICAgIHJldHVybiAxOworICB9CisgIGlmIChiPT0ibiIpIGJvbnVzPTA7IGVsc2UgaWYgKGI9PSJiIikgYm9udXM9MTsKKyAgZWxzZSB7CisgICAgd3JpdGUoIlVuZ3VlbHRpZ2UgQm9udXNhcnQhXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBrZXlzID0gZ2V0S2V5cyhrKTsKKworICB0eXBlID0gRVBNQVNURVItPkFkZEVQT2JqZWN0KG9iLCBrZXlzLCB0eXBlLCBib251cyk7CisgIGlmICh0eXBlIDwgMCkKKyAgICBwcmludGYoIkZlaGxlcjogJXNcbiIsIGVyck1zZyh0eXBlKSk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNoYW5nZShzdHJpbmcgc3RyKQoreworICBzdHJpbmcgd2FzLCB3aWUsIG5ldTsKKyAgb2JqZWN0IG9iOworICBpbnQgdHlwZTsKKyAgbWl4ZWQgbmV3OworCisgIGlmKCAhQVJDSF9TRUNVUklUWSApIHsKKyAgICBub3RpZnlfZmFpbCgiRHUgYmlzdCBrZWluIEVyem1hZ2llciFcbiIpOworICAgIHJldHVybiAwOworICB9CisKKyAgbm90aWZ5X2ZhaWwoIlN5bnRheDogZXBjaGFuZ2UgPHdhcz46IDx3aWU+IDxuZXU+XG4iKTsKKyAgaWYgKCEoc3RyID0gdGhpc19wbGF5ZXIoKS0+X3VucGFyc2VkX2FyZ3MoKSkpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKHNzY2FuZihzdHIsICIlczogJXMgJXMiLCB3YXMsIHdpZSwgbmV1KSAhPSAzKQorICAgIHJldHVybiAwOworCisgIGlmICghKG9iID0gZ2V0T2Iod2FzKSkpIHsKKyAgICBwcmludGYoICJLYW5uICclcycgbmljaHQgZmluZGVuIVxuIiwgd2FzKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBzd2l0Y2god2llWzAuLjJdKSB7CisgIGNhc2UgIm9iaiI6CisgICAgdHlwZSA9IENIQU5HRV9PQjsKKyAgICBuZXcgPSBnZXRPYihuZXUpOworICAgIGlmICghbmV3KSB7CisgICAgICBwcmludGYoICJLYW5uICclcycgbmljaHQgZmluZGVuIVxuIiwgbmV1KTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSAia2V5IjoKKyAgICB0eXBlID0gQ0hBTkdFX0tFWTsKKyAgICBuZXcgPSBnZXRLZXlzKG5ldSk7CisgICAgYnJlYWs7CisgIGNhc2UgInR5cCI6CisgICAgdHlwZSA9IENIQU5HRV9UWVBFOworICAgIGlmICgobmV3ID0gZ2V0VHlwZShuZXUpKSA8IDApIHsKKyAgICAgIHdyaXRlKCJVbmd1ZWx0aWdlciBUeXAhXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSAiYm9uIjoKKyAgICB0eXBlID0gQ0hBTkdFX0JPTlVTOworICAgIGlmIChuZXU9PSJuIikgbmV3PTA7IGVsc2UgaWYgKG5ldT09ImIiKSBuZXc9MTsKKyAgICBlbHNlIHsKKyAgICAgIHdyaXRlKCJVbmd1ZWx0aWdlIEJvbnVzYXJ0IVxuIik7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgd3JpdGUoIkRhcyBsYWVzc3Qgc2ljaCBuaWNodCBhZW5kZXJuLi4uXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgICBicmVhazsKKyAgfQorICB0eXBlID0gRVBNQVNURVItPkNoYW5nZUVQT2JqZWN0KCBvYiwgdHlwZSwgbmV3ICk7CisgIGlmICh0eXBlIDwgMCkKKyAgICBwcmludGYoIkZlaGxlcjogJXNcbiIsZXJyTXNnKHR5cGUpKTsKKworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBkZWwoc3RyaW5nIHN0cikKK3sKKyAgb2JqZWN0IG9iOworICBpbnQgcmV0OworCisgIGlmKCAhQVJDSF9TRUNVUklUWSApIHsKKyAgICBub3RpZnlfZmFpbCgiRHUgYmlzdCBrZWluIEVyem1hZ2llciFcbiIpOworICAgIHJldHVybiAwOworICB9CisgIGlmICghc3RyKSB7CisgICAgbm90aWZ5X2ZhaWwoIlN5bnRheDogZXBkZWwgPHdhcz5cbiIpOworICAgIHJldHVybiAwOworICB9CisgIGlmICghKG9iID0gZ2V0T2Ioc3RyKSkpIHsKKyAgICB3cml0ZSgiS2FubiBkYXMgT2JqZWt0IG5pY2h0IGZpbmRlbiFcbiIpOworICAgIHJldHVybiAxOworICB9CisgIHJldCA9IEVQTUFTVEVSLT5SZW1vdmVFUE9iamVjdChvYik7CisgIGlmIChyZXQgPCAwKQorICAgIHByaW50ZigiRmVobGVyOiAlc1xuIiwgZXJyTXNnKHJldCkpOworCisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGluZm8oc3RyaW5nIHN0cikKK3sKKyAgb2JqZWN0IG9iOworICBtaXhlZCBpbmZvOworCisgIGlmKCAhQVJDSF9TRUNVUklUWSApIHsKKyAgICBub3RpZnlfZmFpbCgiRHUgYmlzdCBrZWluIEVyem1hZ2llciFcbiIpOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKCFzdHIpIHsKKyAgICBub3RpZnlfZmFpbCgiU3ludGF4OiBlcGluZm8gPHdhcz5cbiIpOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKCEob2IgPSBnZXRPYihzdHIpKSkgeworICAgIHdyaXRlKCJEYXMgZmluZGUgaWNoIGxlaWRlciBuaWNodC4uLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKCEoaW5mbyA9IEVQTUFTVEVSLT5RdWVyeUVQT2JqZWN0KG9iKSkpCisgICAgd3JpdGUgKCJEYXMgT2JqZWt0IGlzdCBuaWNodCBlaW5nZXRyYWdlbiFcbiIpOworICBlbHNlCisgICAgcHJpbnRmKCJOdW1tZXI6ICVkXG5Cb251czogJWRcblR5cDogJXNcblNjaGx1ZXNzZWw6ICVzXG4iLAorCSAgIGluZm9bTVBPU19OVU1dLAorCSAgIGluZm9bTVBPU19UWVBFKzFdLAorCSAgICh7ICJEZXRhaWwiLCAiQXVzZ2FuZyIsICJLb21tYW5kbyIsICJJbmZvIiwgIk1pc2MiLCAiUmVhZERldGFpbCIsCisgICAgICAgICAiS25laXBlIiwgIkdlcnVjaCIsICJHZXJhZXVzY2giLCAiVGFzdGRldGFpbCJ9KVtpbmZvW01QT1NfVFlQRV1dLAorCSAgIHN0ckFycihpbmZvW01QT1NfS0VZXSApKTsKKworICByZXR1cm4gMTsKK30KKworc3RhdGljIG9iamVjdCBmaW5kX3BsYXllcm9iKCBzdHJpbmcgbmFtZSApIHsKKyAgcmV0dXJuIGZpbmRfcGxheWVyKG5hbWUpfHxmaW5kX25ldGRlYWQobmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgZXBjb3VudCggc3RyaW5nIHN0ciApIHsKKyAgb2JqZWN0IHBsLGVwbTsKKyAgCisgIGlmKCAhQVJDSF9TRUNVUklUWSApIHsKKyAgICBub3RpZnlfZmFpbCgiRHUgYmlzdCBrZWluIEVyem1hZ2llciFcbiIpOworICAgIHJldHVybiAwOworICB9CisgIAorICBpZiAoIXN0ciB8fCBzdHI9PSIiKSB7CisgICAgbm90aWZ5X2ZhaWwoIlN5bnRheDogZXBjb3VudCA8c3BpZWxlcm5hbWU+XG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHByaW50ZiggIiVzIGhhdCAlZCB2b24gJWQgRlBzLiAoRHVyY2hzY2huaXR0ID0gJWQpXG4iLAorCSAgY2FwaXRhbGl6ZShzdHIpLAorCSAgRVBNQVNURVItPlF1ZXJ5RXhwbG9yYXRpb25Qb2ludHMoc3RyKSwKKwkgIEVQTUFTVEVSLT5RdWVyeU1heEVQKCksCisJICBFUE1BU1RFUi0+UXVlcnlBdmVyYWdlKCkKKwkgICk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGVwc2Nhbiggc3RyaW5nIHN0ciApIHsKKyAgb2JqZWN0IHBsOworICBpbnQgZXJnOworICBzdHJpbmcgKmFzdHI7CisKKyAgaWYoICFBUkNIX1NFQ1VSSVRZICkgeworICAgIG5vdGlmeV9mYWlsKCJEdSBiaXN0IGtlaW4gRXJ6bWFnaWVyIVxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgCisgIGlmICghc3RyIHx8IHN0cj09IiIpIHsKKyAgICBub3RpZnlfZmFpbCgiU3ludGF4OiBlcHNjYW4gPHNwaWVsZXJuYW1lPiBbVGVpbCBkZXMgRmlsZW5hbWVuc11cbiIpOworICAgIHJldHVybiAwOworICB9CisKKyAgYXN0cj1vbGRfZXhwbG9kZSh0aGlzX3BsYXllcigpLT5fdW5wYXJzZWRfYXJncygpLCIgIik7CisgIAorICBpZiAoc2l6ZW9mKGFzdHIpPDIpCisgICAgZXJnID0gRVBNQVNURVItPlNob3dQbGF5ZXJFUHMoYXN0clswXSk7CisgIGVsc2UKKyAgICBlcmcgPSBFUE1BU1RFUi0+U2hvd1BsYXllckVQcyhhc3RyWzBdLGFzdHJbMV0pOworICBpZiAoZXJnIDwgMCkKKyAgICBwcmludGYoIkZlaGxlcjogJXNcbiIsZXJyTXNnKGVyZykpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGVwcGxkZWwoIHN0cmluZyBzdHIgKSB7CisJc3RyaW5nIHBsYXllciwgcmVzdDsKKwlpbnQgZXBudW07CisJb2JqZWN0IHRtcDsKKworCWlmKCAhQVJDSF9TRUNVUklUWSApIHsKKwkgIG5vdGlmeV9mYWlsKCJEdSBiaXN0IGtlaW4gRXJ6bWFnaWVyIVxuIik7CisJICByZXR1cm4gMDsKKwl9CisKKwlub3RpZnlfZmFpbCggImVwcGxkZWwgPHNwaWVsZXI+IDxhbnphaGxfZXBzPiA8Z3J1bmQ+XG4iICk7CisJaWYoICFzdHIgfHwgc3NjYW5mKCBzdHIsICIlcyAlZCAlcyIsIHBsYXllciwgZXBudW0sIHJlc3QgKTwyICkKKwkJcmV0dXJuIDA7CisKKwlpZiggZXBudW0gPD0gMCApIHsKKwkJd3JpdGUoICJBbnphaGwgZGVyIEZQcyA8PSAwID9cbiIgKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmKCAhcmVzdCB8fCByZXN0PT0iIiApIHsKKwkJd3JpdGUoICJCaXR0ZSBHcnVuZCBhbmdlYmVuIVxuIiApOworCQlyZXR1cm4gMTsKKwl9CisKKwlwcmludGYoICIlTyAlTyAlT1xuIiwgZXBudW0sIHBsYXllciwgc2VjdXJlX2xldmVsKCkgKTsKKwllcG51bSA9CSIvc2VjdXJlL2V4cGxvcmF0aW9ubWFzdGVyIi0+UmVtb3ZlRlAoIGVwbnVtLCBwbGF5ZXIsIHJlc3QgKTsKKwlwcmludGYoICJFcmdlYm5pcyAoYWJnZXpvZ2VuZSBFUHMpID0gJU9cbiIsIGVwbnVtICk7CisJcmV0dXJuIDE7CisKK30KKworc3RhdGljIGVwcGxhZGQoIHN0cmluZyBzdHIgKSB7CisJc3RyaW5nIHBsYXllciwgcmVzdDsKKwlpbnQgZXBudW07CisJb2JqZWN0IHBsLHRtcDsKKworCWlmKCAhQVJDSF9TRUNVUklUWSApIHsKKwkgIG5vdGlmeV9mYWlsKCJEdSBiaXN0IGtlaW4gRXJ6bWFnaWVyIVxuIik7CisJICByZXR1cm4gMDsKKwl9CisKKwlub3RpZnlfZmFpbCggImVwcGxhZGQgPHNwaWVsZXI+IDxhbnphaGxfZXBzPlxuIiApOworCWlmKCAhc3RyIHx8IHNzY2FuZiggc3RyLCAiJXMgJWQiLCBwbGF5ZXIsIGVwbnVtICk8MiApCisJCXJldHVybiAwOworCisJaWYoIGVwbnVtIDw9IDAgKSB7CisJCXdyaXRlKCAiQW56YWhsIGRlciBGUHMgPD0gMCA/XG4iICk7CisJCXJldHVybiAxOworCX0KKworCWVwbnVtID0JIi9zZWN1cmUvZXhwbG9yYXRpb25tYXN0ZXIiLT5BZGRGUCggZXBudW0sIHBsYXllciApOworCXByaW50ZiggIkVyZ2VibmlzIChoaW56dWdlZnVlZ3RlIEZQcykgPSAlT1xuIiwgZXBudW0gKTsKKwlyZXR1cm4gMTsKKworfQorCitzdGF0aWMgZXBwbHNldCggc3RyaW5nIHN0ciApIHsKKyAgc3RyaW5nIHBsYXllciwgcmVzdDsKKyAgaW50IGVwbnVtOworICBvYmplY3QgcGwsdG1wOworICAKKyAgaWYoICFBUkNIX1NFQ1VSSVRZICkgeworICAgIG5vdGlmeV9mYWlsKCJEdSBiaXN0IGtlaW4gRXJ6bWFnaWVyIVxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgCisgIG5vdGlmeV9mYWlsKCAiZXBwbHNldCA8c3BpZWxlcj4gPGVwLW51bW1lcj5cbiIgKTsKKyAgaWYoICFzdHIgfHwgc3NjYW5mKCBzdHIsICIlcyAlZCIsIHBsYXllciwgZXBudW0gKTwyICkKKyAgICByZXR1cm4gMDsKKyAgCisgIGVwbnVtID0gIi9zZWN1cmUvZXhwbG9yYXRpb25tYXN0ZXIiLT5TZXRGUCggZXBudW0sIHBsYXllciApOworICBwcmludGYoICJFcmdlYm5pcyAoZ2VzZXR6dGVyIEZQKSA9ICVPXG4iLCBlcG51bSApOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGVwcGxjbHIoIHN0cmluZyBzdHIgKSB7CisgIHN0cmluZyBwbGF5ZXIsIHJlc3Q7CisgIGludCBlcG51bTsKKyAgb2JqZWN0IHBsLHRtcDsKKyAgCisgIGlmKCAhQVJDSF9TRUNVUklUWSApIHsKKyAgICBub3RpZnlfZmFpbCgiRHUgYmlzdCBrZWluIEVyem1hZ2llciFcbiIpOworICAgIHJldHVybiAwOworICB9CisgIAorICBub3RpZnlfZmFpbCggImVwcGxjbHIgPHNwaWVsZXI+IDxlcC1udW1tZXI+XG4iICk7CisgIGlmKCAhc3RyIHx8IHNzY2FuZiggc3RyLCAiJXMgJWQiLCBwbGF5ZXIsIGVwbnVtICk8MiApCisgICAgcmV0dXJuIDA7CisgIAorICBlcG51bSA9ICIvc2VjdXJlL2V4cGxvcmF0aW9ubWFzdGVyIi0+Q2xlYXJGUCggZXBudW0sIHBsYXllciApOworICBwcmludGYoICJFcmdlYm5pcyAoZ2Vsb2VzY2h0ZXIgRlApID0gJU9cbiIsIGVwbnVtICk7CisgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL2ZlaGxlcnRldWZlbC5jIGIvb2JqL3Rvb2xzL2ZlaGxlcnRldWZlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNWZlYzEKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvZmVobGVydGV1ZmVsLmMKQEAgLTAsMCArMSw5OTMgQEAKKy8qIC9vYmovdG9vc3RlbHMvZmVobGVydGV1ZmVsLmMKKyAgIEZlaGxlcnRldWZlbCAtIE1hZ2llcnRvb2wgenVyIEFiZnJhZ2UgZGVzIEZlaGxlci1EYWVtb25zIGRlciBNdWRsaWIKKyAgIEF1dG9yOiBaZXNzdHJhCisgICBDaGFuZ2Vsb2c6CisqLworCisjcHJhZ21hIHN0cmljdF90eXBlcworI3ByYWdtYSBwZWRhbnRpYworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19zaGFkb3cKKyNwcmFnbWEgbm9faW5oZXJpdAorCitpbmhlcml0ICIvc3RkL3NlY3VyZV90aGluZyI7Citpbmhlcml0ICIvc2VjdXJlL2Vycm9yZC1zdHJ1Y3RzIjsKKworI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bW92aW5nLmg+CisjaW5jbHVkZSA8ZXJyb3JkLmg+CisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8ZGVidWdfaW5mby5oPgorI2luY2x1ZGUgPGlucHV0X3RvLmg+CisjaW5jbHVkZSA8c3RyaW5ncy5oPgorCisjZGVmaW5lIFRJIHRoaXNfaW50ZXJhY3RpdmUoKQorCisjZGVmaW5lIERFQlVHKHgpICBpZiAoZnVuY2FsbChzeW1ib2xfZnVuY3Rpb24oJ2ZpbmRfcGxheWVyKSwiemVzc3RyYSIpKVwKKyAgICAgICAgdGVsbF9vYmplY3QoZnVuY2FsbChzeW1ib2xfZnVuY3Rpb24oJ2ZpbmRfcGxheWVyKSwiemVzc3RyYSIpLFwKKyAgICAgICAgIkVEQkc6ICIreCsiXG4iKQorCisvLyB2YXJpYWJsZXMKK3ByaXZhdGUgc3RyaW5nIG93bmVyOyAgLy8gVUlEIHZvbSBFaWdlbnR1ZW1lcgorcHJpdmF0ZSBzdHJpbmcgKnVpZHM9KHt9KTsgLy8gVUlEcywgYXVmIGRpZSBtYW4gc2NocmVpYnJlY2h0ZSBoYXQKK3ByaXZhdGUgc3RyaW5nICpmaWx0ZXJ1aWRzPSh7fSk7IC8vIHdlbm4gbmljaHQtbGVlciwgbnVyIGRpZXNlIFVJRHMgemVpZ2VuCitwcml2YXRlIHN0cmluZyAqbW9uaXRvcnVpZHM9KHt9KTsgLy8gZGllc2UgVUlEcyBpbiBkaWUgTGlzdGUgZWluc2NobGllc3NlbgorcHJpdmF0ZSBpbnQgZmlsdGVyc3RhdHVzPTA7ICAgICAgIC8vIEZpbHRlciBhbiBvZGVyIGF1cz8KK3ByaXZhdGUgbWFwcGluZyBpc3N1ZWxpc3QgPSAoW10pOworLyogKFsgdHlwZTE6IChbdWlkMTogPGlzc3VlbGlzdD4sIHVpZDI6IDxpc3N1ZWxpc3Q+IF0pLAorICAgICAgdHlwZTI6IC4uLiBdKQorICAgPGlzc3VlbGlzdD4gaXN0IGVpbiA8IDxpbnR8c3RyaW5nPiogPiogdm9tIEVycm9yRCAqLworCisvL1dlbGNoZSBBcnQgdm9uIEZlaGxlciBhbnplaWdlbj8KK3ByaXZhdGUgaW50IG1vZHVzPVRfUlRFUlJPUiB8IFRfUlRXQVJOIHwgVF9SRVBPUlRFRF9FUlI7Citwcml2YXRlIHN0cmluZyAqeG1vbml0b3J1aWRzID0gKHt9KTsgLy8gZXhwYW5kZWQgTW9uaXRvci1VSURzCitwcml2YXRlIGludCBsZmVobGVyOyAgICAgICAgICAgICAgLy8gbGV0enRlciAnYmVudXR6dGVyJyBGZWhsZXIuCitwcml2YXRlIGludCBmZWhsZXJ6YWhsOyAgICAgICAvLyBmZWhsZXJ6YWhsIGltIGxldHp0ZW4gUmVzZXQuCitwcml2YXRlIG1hcHBpbmcgZmVpbmdhYmU7ICAgICAgICAgLy8gZ2VyYWRlIGVpbmdlZ2ViZW5lciBGZWhsZXIKKworLy8gKioqKioqKioqKioqKiogcHJpdmF0ZSBmdW5jdGlvbnMgICoqKioqKioqKioqKioqCitwcml2YXRlIHZhcmFyZ3MgaW50IGdldF9pc3N1ZWxpc3QoaW50IGxtb2R1cyk7Citwcml2YXRlIHZvaWQgZ2V0X3VpZHMoKTsKKworLy8gaXJnZW5kZWluZW4gRmVobGVyIG9kZXIgV2FybnVuZyBhbnplaWdlbi4KK3ByaXZhdGUgaW50IHNob3dfZW50cnkoc3RydWN0IGZ1bGxpc3N1ZV9zIGlzc3VlKQoreworICBpZiAoIWlzc3VlKSByZXR1cm4gMDsKKworICBzdHJpbmcgdHh0PUVSUk9SRC0+Zm9ybWF0X2Vycm9yKGlzc3VlLCAwKTsKKworICBpZiAoIXN0cmluZ3AodHh0KSB8fCAhc2l6ZW9mKHR4dCkpCisgICAgICByZXR1cm4gMDsKKworICB0ZWxsX29iamVjdChQTCx0eHQrIlxuIik7CisgIHJldHVybiAxOworfQorCitwcm90ZWN0ZWQgaW50IF9mZWluZ2FiZV9mZXJ0aWcoc3RyaW5nIGFyZykgeworCisgIGlmIChhcmcgPT0gImoiKQorICB7CisgICAgaWYgKCFmZWluZ2FiZVtGX01TR10pCisgICAgeworICAgICAgdGVsbF9vYmplY3QoUEwsCisgICAgICAgICJBbHNvLCBlaW5lIEZlaGxlcmJlc2NocmVpYnVuZyBzb2xsdGVzdCBEdSBzY2hvbiBlaW5nZWJlbiEgQWJnZWJyb2NoZW4uXG4iKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHN0cmluZyBoYXNoa2V5ID0gKHN0cmluZylFUlJPUkQtPkxvZ1JlcG9ydGVkRXJyb3IoZmVpbmdhYmUpOworICAgICAgdGVsbF9vYmplY3QoUEwsIHNwcmludGYoCisgICAgICAgICAiVmllbGVuIERhbmshIERpZSBJRCBkZXMgZWluZ2VnZWJlbmVuIEZlaGxlcnMgbGF1dGV0OiAlc1xuIiwKKyAgICAgICAgIGhhc2hrZXkgfHwgIk4vQSIpKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgdGVsbF9vYmplY3QoUEwsICJGZWhsZXJlaW5nYWJlIGFiZ2Vicm9jaGVuLlxuIik7CisgIH0KKworICBmZWluZ2FiZSA9IDA7CisKKyAgcmV0dXJuIDE7Cit9CisKK3B1YmxpYyBpbnQgQ21kRmVobGVyRWluZ2FiZShzdHJpbmcgYXJnKSB7CisgIG9iamVjdCB0YXJnZXQ7CisKKyAgaWYgKGZlaW5nYWJlKQorICB7CisgICAgdGVsbF9vYmplY3QoUEwsICJEdSBnaWJ0cyBkb2NoIGJlcmVpdHMgZWluZW4gRmVobGVyIGVpbiFcbiIpOworICAgIHJldHVybiAxOworICB9CisgIGZlaW5nYWJlID0gKFtdKTsKKworICBpZiAoYXJnKQorICB7CisgICAgdGFyZ2V0ID0gcHJlc2VudChhcmcpOworICAgIGlmICghdGFyZ2V0KQorICAgICAgdGFyZ2V0ID0gZmluZF9vYmplY3QoYXJnKTsgLy8gdmllbGxlaWNodCBkaXJla3QgYW5nZWdlYmVuPworICB9CisgIC8vIHdlbm4gbml4IGdlZnVuZGVuLCBFbnZpcm9ubWVudCBkZXMgTWFnaWVycyBuZWhtZW4uCisgIGlmICghdGFyZ2V0KQorICAgIHRhcmdldCA9IGVudmlyb25tZW50KGVudmlyb25tZW50KCkpOworCisgIGZlaW5nYWJlW0ZfT0JKXSA9IHRhcmdldDsKKworICB0ZWxsX29iamVjdChQTCwgYnJlYWtfc3RyaW5nKHNwcmludGYoCisgICAgICAgICAgIkR1IGJlZ2lubnN0IGVpbmVuIEZlaGxlcmVpbnRyYWcgZnVlciBkYXMgT2JqZWt0OiAlT1xuIiwgdGFyZ2V0KSw3OCkpOworCisgIGlucHV0X3RvKGZ1bmN0aW9uIHZvaWQgKHN0cmluZyBzdHIpCisgICAgICB7CisgICAgICAgIGlmIChzaXplb2Yoc3RyKSkgZmVpbmdhYmVbRl9NU0ddID0gc3RyOworICAgICAgfSwgSU5QVVRfUFJPTVBULCAiRmVobGVyYmVzY2hyZWlidW5nIGVpbmdlYmVuOlxuIik7CisKKyAgaW5wdXRfdG8oZnVuY3Rpb24gdm9pZCAoc3RyaW5nIHN0cikKKyAgICAgIHsKKyAgICAgICAgaWYgKHNpemVvZihzdHIpKSBmZWluZ2FiZVtGX1BST0ddID0gc3RyOworICAgICAgICBlbHNlIGZlaW5nYWJlW0ZfUFJPR10gPSAidW5iZWthbm50IjsKKyAgICAgIH0sIElOUFVUX1BST01QVHxJTlBVVF9BUFBFTkQsIAorICAgICAiUHJvZ3JhbW0gZWluZ2ViZW4sIGluIGRlbSBkZXIgRmVobGVyIGF1ZnRyaXR0IChmYWxscyBiZWthbm50KTpcbiIpOworCisgIGlucHV0X3RvKGZ1bmN0aW9uIHZvaWQgKHN0cmluZyBzdHIpCisgICAgICB7CisgICAgICAgIGlmIChzaXplb2Yoc3RyKSkgZmVpbmdhYmVbRl9MSU5FXSA9IHRvX2ludChzdHIpOworICAgICAgICB0ZWxsX29iamVjdChQTCxicmVha19zdHJpbmcoc3ByaW50ZigKKyAgICAgICAgICAiRHUgaGFzdCBkaWUgZm9sZ2VuZGVuIERhdGVuIGVpbmdlZ2ViZW46XG4iCisgICAgICAgICAgIk9iamVrdDogJU9cbiIKKyAgICAgICAgICAiRmVobGVyYmVzY2hyZWlidW5nOiAlc1xuIgorICAgICAgICAgICJQcm9ncmFtbTogJXNcbiIKKyAgICAgICAgICAiWmVpbGVubnIuOiAlZFxuIiwKKyAgICAgICAgICBmZWluZ2FiZVtGX09CSl0sIGZlaW5nYWJlW0ZfTVNHXSB8fCAiIiwgZmVpbmdhYmVbRl9QUk9HXSwKKyAgICAgICAgICBmZWluZ2FiZVtGX0xJTkVdKSwgNzgsICIiLCBCU19MRUFWRV9NWV9MRlMpKTsKKyAgICAgIH0sIElOUFVUX1BST01QVHxJTlBVVF9BUFBFTkQsCisgICAgICAiWmVpbGVubnIuIGVpbmdlYmVuLCBpbiBkZXIgZGVyIEZlaGxlciBhdWZ0cml0dCAoZmFsbHMgYmVrYW5udCk6XG4iKTsKKworICBpbnB1dF90bygjJ19mZWluZ2FiZV9mZXJ0aWcsCisgICAgICBJTlBVVF9QUk9NUFR8SU5QVVRfQVBQRU5ELCAiRWluZ2FiZW4ga29ycmVrdD8gKGovbilcbiIpOworCisgIHJldHVybiAxOworfQorCitwdWJsaWMgaW50IENtZEZlaGxlclplaWdlbihzdHJpbmcgYXJnKQoreworICBpbnQgaXNzdWVpZDsKKworICBpZiAoc3RyaW5ncChhcmcpICYmIHNpemVvZihhcmcpKQorICB7CisgICAgICBhcmcgPSB0cmltKGFyZywgVFJJTV9CT1RIKTsKKyAgICAgIGlzc3VlaWQgPSB0b19pbnQoYXJnKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAgIGlzc3VlaWQgPSBsZmVobGVyOworICAgICAgYXJnID0gdG9fc3RyaW5nKGlzc3VlaWQpOworICB9CisgIG5vdGlmeV9mYWlsKCJFaW5lbiBFaW50cmFnIG1pdCBkaWVzZXIgSUQgZ2lidCBlcyBuaWNodCFcbiIpOworCisgIC8vIE1pdCBlaW5lbSAvIGFtIEFuZmFuZyBpc3QgYXJnIHdvaGwgZWluIEZpbGVuYW1lLCB3ZW5uIHRvX3N0cmluZyhpc3N1ZWlkKQorICAvLyA9PSBhcmcgd2lyZCBkaWUgSXNzdWVpZCB2b24gb2JlbiBnZW5vbW1lbi4KKyAgc3RydWN0IGZ1bGxpc3N1ZV9zIGlzc3VlOworICBzdHJ1Y3QgZnVsbGlzc3VlX3MgKmlzc3VlczsKKyAgaWYgKGFyZ1swXSA9PSAnLycpCisgIHsKKyAgICBpc3N1ZXM9KHt9KTsKKyAgICBmb3JlYWNoKGludCBtOiBBTExfRVJSX1RZUEVTKQorICAgIHsKKyAgICAgIGlmICghKG0gJiBtb2R1cykpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgc3RydWN0IGZ1bGxpc3N1ZV9zICp0bXAgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBmdWxsaXNzdWVfcyAqKUVSUk9SRC0+UXVlcnlJc3N1ZXNCeUZpbGUoYXJnLCBtKTsKKyAgICAgIGlmICh0bXApCisgICAgICAgIGlzc3Vlcys9dG1wOworICAgIH0KKyAgICBpZiAoIXNpemVvZihpc3N1ZXMpKQorICAgICAgaXNzdWVzPTA7CisgIH0KKyAgZWxzZSBpZiAodG9fc3RyaW5nKGlzc3VlaWQpID09IGFyZykKKyAgICBpc3N1ZSA9IChzdHJ1Y3QgZnVsbGlzc3VlX3MpRVJST1JELT5RdWVyeUlzc3VlQnlJRChpc3N1ZWlkKTsKKyAgZWxzZQorICAgIGlzc3VlID0gKHN0cnVjdCBmdWxsaXNzdWVfcylFUlJPUkQtPlF1ZXJ5SXNzdWVCeUhhc2goYXJnKTsKKworICBpZiAoc3RydWN0cChpc3N1ZSkpCisgIHsKKyAgICBzaG93X2VudHJ5KGlzc3VlKTsKKyAgICAvLyBsZXR6dGVuIEZlaGxlciBtZXJrZW4uCisgICAgbGZlaGxlciA9IGlzc3VlaWQ7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgLy8gV2VubiBkYXMgbmljaHQgZXJmb2xncmVpY2ggaXN0LCBpc3QgZGFzIEFyZ3VtZW50IGV2dGwuIGVpbiBPYmpla3QtLAorICAvLyBQcm9ncmFtbS0gb2RlciBMYWRlbmFtZS4gSW4gZGVtIEZhbGwgYWxsZSB2b24gZGVuZW4gYW56ZWlnZW4sIGRpZSBwYXNzZW4KKyAgLy8gaGllcmJlaSB3aXJkIGRlciBUeXAgTklDSFQgYmVydWVja3NpY2h0aWd0LgorICBlbHNlIGlmIChwb2ludGVycChpc3N1ZXMpKQorICB7CisgICAgZm9yZWFjaChpc3N1ZSA6IGlzc3VlcykKKyAgICB7CisgICAgICBzaG93X2VudHJ5KGlzc3VlKTsKKyAgICB9CisgICAgcmV0dXJuIDE7CisgIH0KKworICBub3RpZnlfZmFpbCgiS2VpbmUgRWludHJhZWdlIGZ1ZXIgZGllc2VuIERhdGVpbmFtZW4vZGllc2UgSUQgZ2VmdW5kZW4uXG4iKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vIExvZXNjaHQgYWxsZSBGZWhsZXIgdW5kIFdhcm51bmdlbiBlaW5lcyBPYmpla3RzIChzb3dlaXQgcGVyIG1vZHVzCisvLyBhdXNnZXdhZWhsdCkuIEVudHNjaGVpZGVuZCBpc3QgZGVyIF9Mb2FkbmFtZV8hCitwcml2YXRlIGludCBEZWxldGVFcnJvcnNGb3JMb2FkbmFtZShzdHJpbmcgbG9hZG5hbWUpCit7CisgIGludCBzdW1fZGVsZXRlZDsKKyAgLy8gQmVpID09IDAgd2lyZCBzb25zdCBhbGxlcyBnZWxvZXNjaHQuIDstKQorICBpZiAoIWxvYWRuYW1lKQorICAgIHJldHVybiAwOworCisgIGZvcmVhY2goaW50IG06IEFMTF9FUlJfVFlQRVMpCisgIHsKKyAgICBpZiAoIShtICYgbW9kdXMpKQorICAgICAgY29udGludWU7CisgICAgPCA8aW50fHN0cmluZz4qID4qIGxpc3QgPSBFUlJPUkQtPlF1ZXJ5SXNzdWVMaXN0QnlMb2FkbmFtZShsb2FkbmFtZSxtKTsKKyAgICBpZiAocG9pbnRlcnAobGlzdCkpCisgICAgeworICAgICAgZm9yZWFjaCg8aW50fHN0cmluZz4qIHJvdyA6IGxpc3QpCisgICAgICB7CisgICAgICAgICAgaWYgKChpbnQpRVJST1JELT5Ub2dnbGVEZWxldGVFcnJvcihyb3dbMF0pID09IDEpCisgICAgICAgICAgeworICAgICAgICAgICAgdGVsbF9vYmplY3QoUEwsCisgICAgICAgICAgICAgICAgcm93WzBdICsgIiBhbHMgZ2Vsb2VzY2h0IG1hcmtpZXJ0LlxuIik7CisgICAgICAgICAgfQorICAgICAgfQorICAgICAgc3VtX2RlbGV0ZWQrPXNpemVvZihsaXN0KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHN1bV9kZWxldGVkOworfQorCitwdWJsaWMgaW50IENtZEZlaGxlckxvZXNjaGVuKHN0cmluZyBhcmcpCit7CisgIGludCBpc3N1ZWlkOworICBhcmcgPSAoc3RyaW5nKXRoaXNfcGxheWVyKCktPl91bnBhcnNlZF9hcmdzKDApOworCisgIGlmIChzdHJpbmdwKGFyZykgJiYgc2l6ZW9mKGFyZykpCisgICAgICBpc3N1ZWlkID0gdG9faW50KGFyZyk7CisgIGVsc2UKKyAgICAgIGlzc3VlaWQgPSBsZmVobGVyOworCisgIG5vdGlmeV9mYWlsKCJFaW5lbiBFaW50cmFnIG1pdCBkaWVzZXIgSUQvZGllc2VtIExvYWRuYW1lIGdpYnQgZXMgbmljaHQhXG4iKTsKKworICBpbnQgcmVzID0gKGludClFUlJPUkQtPlRvZ2dsZURlbGV0ZUVycm9yKGlzc3VlaWQpOworICBpZiAocmVzID09IDEpCisgIHsKKyAgICB0ZWxsX29iamVjdChQTCwKKyAgICAgICJGZWhsZXIvV2FybnVuZyB3dXJkZSB6dW0gTG9lc2NoZW4gbWFya2llcnQgdW5kIHdpcmQgaW4gS3VlcnplICIKKyAgICAgICJnZWxvZXNjaHQuXG4iKTsKKyAgICBsZmVobGVyID0gaXNzdWVpZDsKKyAgICByZXR1cm4gMTsKKyAgfQorICBlbHNlIGlmIChyZXM9PTApCisgIHsKKyAgICB0ZWxsX29iamVjdChQTCwiTG9lc2NobWFya2llcnVuZyB3dXJkZSBlbnRmZXJudC5cbiIpOworICAgIGxmZWhsZXIgPSBpc3N1ZWlkOworICAgIHJldHVybiAxOworICB9CisgIGVsc2UgaWYgKHJlcyA8IC0xKQorICB7CisgICAgdGVsbF9vYmplY3QoUEwsICJJcmdlbmR3YXMgaXN0IGJlaW0gTG9lc2NoZW4gc2NoaWVmZ2VnYW5nZW4uICIKKyAgICAgICAgICAgICAgICAgICAgIktlaW5lIFNjaHJlaWJyZWNodGU/XG4iKTsKKyAgICBsZmVobGVyID0gaXNzdWVpZDsKKyAgICByZXR1cm4gMTsKKyAgfQorICAvLyByZXMgd2FyID09IC0xIC0+IEZlaGxlciBuaWNodCBnZWZ1bmRlbi4gVmllbGxlaWNodCBpc3QgZXMgbmVuIExvYWRuYW1lCisgIHJldHVybiBEZWxldGVFcnJvcnNGb3JMb2FkbmFtZShhcmcpOworfQorCitwdWJsaWMgaW50IENtZFJlZnJlc2goc3RyaW5nIGFyZykgeworICAgIHJlc2V0KCk7CisgICAgdGVsbF9vYmplY3QoUEwsIkZlaGxlcmRhdGVuIHd1cmRlbiBuZXUgZWluZ2VsZXNlbi5cbiIpOworICAgIHJldHVybiAxOworfQorCitwcml2YXRlIGludCBzZWxlY3RfbW9kdXMoc3RyaW5nIGFyZykgeworICAgIGludCBsbW9kdXM7CisgICAgc3dpdGNoKGFyZykgeworICAgIGNhc2UgImFsbGVzIjoKKyAgICBjYXNlICJhbGxlIjoKKyAgICAgIGxtb2R1cyA9IFRfUlRFUlJPUiB8IFRfUlRXQVJOIHwgVF9DVEVSUk9SIHwgVF9DVFdBUk4gfCBUX1JFUE9SVEVEX0VSUgorICAgICAgICAgICAgICAgfCBUX1JFUE9SVEVEX0lERUEgfCBUX1JFUE9SVEVEX1RZUE8gfCBUX1JFUE9SVEVEX01EOworICAgICAgYnJlYWs7CisgICAgY2FzZSAiZmVobGVyIjoKKyAgICBjYXNlICJlcnJvciI6CisgICAgY2FzZSAiZXJyb3JzIjoKKyAgICAgIGxtb2R1cz1UX1JURVJST1IgfCBUX0NURVJST1IgfCBUX1JFUE9SVEVEX0VSUjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIndhcm51bmdlbiI6CisgICAgY2FzZSAid2FybnVuZyI6CisgICAgY2FzZSAid2FybmluZyI6CisgICAgY2FzZSAid2FybmluZ3MiOgorICAgICAgbG1vZHVzPVRfUlRXQVJOIHwgVF9DVFdBUk47CisgICAgICBicmVhazsKKyAgICBjYXNlICJsYXVmemVpdGZlaGxlciI6CisgICAgICBsbW9kdXM9VF9SVEVSUk9SOworICAgICAgYnJlYWs7CisgICAgY2FzZSAibGFkZXplaXRmZWhsZXIiOgorICAgICAgbG1vZHVzPVRfQ1RFUlJPUjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgImZlaGxlcmhpbndlaXMiOgorICAgIGNhc2UgImZlaGxlcmhpbndlaXNlIjoKKyAgICBjYXNlICJoaW53ZWlzZSI6CisgICAgICBsbW9kdXM9VF9SRVBPUlRFRF9FUlI7CisgICAgICBicmVhazsKKyAgICBjYXNlICJpZGVlbiI6CisgICAgY2FzZSAiaWRlZSI6CisgICAgICBsbW9kdXM9VF9SRVBPUlRFRF9JREVBOworICAgICAgYnJlYWs7CisgICAgY2FzZSAibWQiOgorICAgICAgbG1vZHVzPVRfUkVQT1JURURfTUQ7CisgICAgICBicmVhazsKKyAgICBjYXNlICJ0eXBvIjoKKyAgICBjYXNlICJ0eXBvcyI6CisgICAgICBsbW9kdXM9VF9SRVBPUlRFRF9UWVBPOworICAgICAgYnJlYWs7CisgICAgY2FzZSAibGF1ZnplaXR3YXJudW5nZW4iOgorICAgIGNhc2UgInJ1bnRpbWV3YXJuaW5ncyI6CisgICAgICBsbW9kdXM9VF9SVFdBUk47CisgICAgICBicmVhazsKKyAgICBjYXNlICJsYWRlemVpdHdhcm51bmdlbiI6CisgICAgY2FzZSAiY29tcGlsZXRpbWV3YXJuaW5ncyI6CisgICAgICBsbW9kdXM9VF9DVFdBUk47CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgbG1vZHVzPW1vZHVzOworICAgIH0KKyAgICByZXR1cm4gbG1vZHVzOworfQorCitwcml2YXRlIHN0cmluZyAgKiBlcnJvcmxhYmVsKGludCB0KQoreworICBzd2l0Y2godCkgeworICAgIGNhc2UgVF9SVEVSUk9SOgorICAgICAgcmV0dXJuICh7IkxhdWZ6ZWl0ZmVobGVyIiwiTGF1ZnplaXRmZWhsZXIiLCJEaWVzZXIgTGF1ZnplaXRmZWhsZXIifSk7CisgICAgY2FzZSBUX1JFUE9SVEVEX0VSUjoKKyAgICAgIHJldHVybiAoeyJGZWhsZXJoaW53ZWlzIiwiRmVobGVyaGlud2Vpc2UiLCJEaWVzZXIgRmVobGVyaGlud2VpcyJ9KTsKKyAgICBjYXNlIFRfUkVQT1JURURfSURFQToKKyAgICAgIHJldHVybiAoeyJJZGVlIiwiSWRlZW4iLCJEaWVzZSBJZGVlIn0pOworICAgIGNhc2UgVF9SRVBPUlRFRF9NRDoKKyAgICAgIHJldHVybiAoeyJmZWhsZW5kZSBEZXRhaWwiLCJmZWhsZW5kZSBEZXRhaWxzIiwiRGllc2VzIGZlaGxlbmRlIERldGFpbCJ9KTsKKyAgICBjYXNlIFRfUkVQT1JURURfVFlQTzoKKyAgICAgIHJldHVybiAoeyJUeXBvIiwiVHlwb3MiLCJEaWVzZXIgVHlwbyJ9KTsKKyAgICBjYXNlIFRfUlRXQVJOOgorICAgICAgcmV0dXJuICh7IkxhdWZ6ZWl0d2FybnVuZyIsIkxhdWZ6ZWl0d2FybnVuZ2VuIiwiRGllc2UgTGF1ZnplaXR3YXJudW5nIn0pOworICAgIGNhc2UgVF9DVFdBUk46CisgICAgICByZXR1cm4gKHsiTGFkZXplaXR3YXJudW5nIiwgIkxhZGV6ZWl0d2FybnVuZ2VuIiwiRGllc2UgTGFkZXplaXR3YXJudW5nIn0pOworICAgIGNhc2UgVF9DVEVSUk9SOgorICAgICAgcmV0dXJuICh7IkxhZGV6ZWl0ZmVobGVyIiwiTGFkZXplaXRmZWhsZXIiLCJEaWVzZXIgTGFkZXplaXRmZWhsZXIifSk7CisgIH0KKyAgcmFpc2VfZXJyb3IoIlVua2FubnRlciBGZWhsZXJ0eXA6ICIrdCsiXG4iKTsKKyAgcmV0dXJuIDA7Cit9CisKK3B1YmxpYyBpbnQgQ21kRmVobGVyTGlzdGUoc3RyaW5nIGFyZykgeworICBzdHJpbmcgdHh0OworICAvL3N0cmluZyAqbHVpZHM7CisgIGludCBsbW9kdXM7IC8vIG1vZHVzIGZ1ZXIgZGllc2UgTGlzdGUKKyAgbWFwcGluZyBmZWhsZXJiYWNrdXA7CisKKyAgaWYgKHN0cmluZ3AoYXJnKSAmJiBzaXplb2YoYXJnKSkKKyAgeworICAgIGxtb2R1cz1zZWxlY3RfbW9kdXMoYXJnKTsKKyAgICBpZiAobG1vZHVzICE9IG1vZHVzKQorICAgIHsKKyAgICAgIGZlaGxlcmJhY2t1cD1pc3N1ZWxpc3Q7IC8vIEZlaGxlcmxpc3RlIHZvbiAnbW9kdXMnIGF1ZmhlYmVuCisgICAgICBnZXRfaXNzdWVsaXN0KGxtb2R1cyk7ICAvLyBuZXVlIEZlaGxlcmxpc3RlIGhvbGVuCisgICAgfQorICB9CisgIGVsc2UKKyAgICBsbW9kdXM9bW9kdXM7CisvKgorICBpZiAoIWZlaGxlcnphaGwpCisgIHsKKyAgICB0eHQ9IkZ1ZXIgRGVpbmUgVUlEcyBzaW5kIGtlaW5lIEZlaGxlci9XYXJudW5nZW4gYmVrYW5udC4gOi0pXG4iOworICAgIHRlbGxfb2JqZWN0KFBMLHR4dCk7CisgICAgcmV0dXJuIDE7CisgIH0KKyovCisgIGZvcmVhY2goaW50IHR5cCwgbWFwcGluZyB0eXBlbWFwIDogaXNzdWVsaXN0KQorICB7CisgICAgaWYgKCEodHlwICYgbG1vZHVzKSkKKyAgICAgIGNvbnRpbnVlOyAvLyBUeXBlIG5pY2h0IGdld2FlaGx0LgorICAgIHR4dD0iIjsKKyAgICBpZiAoIXNpemVvZih0eXBlbWFwKSkgeworICAgICAgdGVsbF9vYmplY3QoUEwsCisgICAgICAgICJFcyBzaW5kIGtlaW5lICIgKyBlcnJvcmxhYmVsKHR5cClbMV0gKyAiRGVpbmVyIFVJRHMgYmVrYW5udC4gOi0pIik7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgZm9yZWFjaChzdHJpbmcgdWlkLCA8IDxpbnR8c3RyaW5nPiogPiogbGlzdCA6IHR5cGVtYXApCisgICAgeworICAgICAgaWYgKCFzaXplb2YobGlzdCkpIGNvbnRpbnVlOworICAgICAgaWYgKGZpbHRlcnN0YXR1cyAmJiBtZW1iZXIoZmlsdGVydWlkcywgdWlkKSA+IC0xKSBjb250aW51ZTsKKyAgICAgIC8vdHh0Kz1zcHJpbnRmKCIlczpcbiIsIHVpZCk7CisgICAgICBmb3JlYWNoKDxpbnR8c3RyaW5nPiogcm93IDogbGlzdCkKKyAgICAgIHsKKyAgICAgICAgdHh0Kz1zcHJpbnRmKCIlOjZkIHwgJTo0MC1zIHwgJToyNi1zXG4iLAorICAgICAgICAgICAgICByb3dbMF0sIHJvd1sxXSwgcm93WzJdKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHR4dCAmJiBzaXplb2YodHh0KSkKKyAgICB7CisgICAgICB0eHQgPSBzcHJpbnRmKCJcbkZ1ZXIgRGVpbmUgVUlEcyBzaW5kIGZvbGdlbmRlICVzIGJla2FubnQgKEZpbHRlcjogJXMpOlxuIgorICAgICAgICAgICAgICAgICAgICAiJTo2fHMgfCAlOjQwfHMgfCAgICVzXG4iLAorICAgICAgICAgICAgICAgICBlcnJvcmxhYmVsKHR5cClbMV0sIChmaWx0ZXJzdGF0dXMgPyAiYW4iIDogImF1cyIpLAorICAgICAgICAgICAgICAgICAiSUQiLCAiTG9hZG5hbWUiLCAiVUlEIikKKyAgICAgICAgICArIHR4dDsKKyAgICAgIHRlbGxfb2JqZWN0KFBMLCB0eHQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgdGVsbF9vYmplY3QoUEwsIHNwcmludGYoCisgICAgICAgICAgICAiXG5GdWVyIERlaW5lIFVJRHMgc2luZCBrZWluZSAlcyBiZWthbm50IChGaWx0ZXI6ICVzKTpcbiIsCisgICAgICAgICAgICBlcnJvcmxhYmVsKHR5cClbMV0sIChmaWx0ZXJzdGF0dXMgPyAiYW4iIDogImF1cyIpKSk7CisgICAgfQorICB9CisKKyAgaWYgKG1hcHBpbmdwKGZlaGxlcmJhY2t1cCkgJiYgbW9kdXMhPWxtb2R1cykKKyAgICBpc3N1ZWxpc3Q9ZmVobGVyYmFja3VwOyAvLyBmZWhsZXJsaXN0ZSBmdWVyICdtb2R1cycgcmVzdGF1cmllcmVuCisgIHJldHVybiAxOworfQorCitwdWJsaWMgaW50IENtZEZpbHRlcihzdHJpbmcgYXJnKSB7CisKKyAgYXJnPShzdHJpbmcpUEwtPl91bnBhcnNlZF9hcmdzKDApOyAgCisKKyAgaWYgKCFzdHJpbmdwKGFyZykgfHwgIXNpemVvZihhcmcpKSB7CisgICAgdGVsbF9vYmplY3QoUEwsYnJlYWtfc3RyaW5nKAorICAgICAgICAgICJNb21lbnRhbiBpbnRlcmVzc2llcmVuIERpY2ggZm9sZ2VuZGUgVUlEcyBuaWNodCIKKyAgICAgICAgICArKGZpbHRlcnN0YXR1cyA/ICIgKEZpbHRlciBhbik6XG4iIDogIiAoRmlsdGVyIGF1cyk6XG4iKQorICAgICAgICAgICtDb3VudFVwKGZpbHRlcnVpZHMpKyJcbiIsIDc4LCIiLEJTX0xFQVZFX01ZX0xGUykpOworICAgIHJldHVybiAxOworICB9CisKKyAgaWYgKGFyZz09ImtlaW5lIikgeworICAgIGZpbHRlcnVpZHM9KHt9KTsKKyAgICBmaWx0ZXJzdGF0dXM9MTsKKyAgICB0ZWxsX29iamVjdChQTCxicmVha19zdHJpbmcoCisgICAgICAgICJEZWluIEZlaGxlcnRldWZlbCB3aXJkIERpciBudW4gbnVyIG5vY2ggYXVzZ2V3YWVobHRlICIKKyAgICAgICAgIkZlaGxlciBiZXJpY2h0ZW4uIE1vbWVudGFuIGhhc3QgRHUga2VpbmUgVUlEcyBhdXNnZWJsZW5kZXQuICIKKyAgICAgICAgIihGaWx0ZXIgYW4pIiw3OCkpOworICB9CisgIGVsc2UgaWYgKGFyZz09ImFsbGUiKSB7CisgICAgZmlsdGVyc3RhdHVzPTE7CisgICAgZmlsdGVydWlkcz11aWRzOworICAgIHRlbGxfb2JqZWN0KFBMLGJyZWFrX3N0cmluZygKKyAgICAgICAgIkRlaW4gRmVobGVydGV1ZmVsIHdpcmQgRGlyIG51biBudXIgbm9jaCBhdXNnZXdhZWhsdGUgIgorICAgICAgICAiRmVobGVyIGJlcmljaHRlbi4gRHUgYmxlbmRlc3QgbW9tZW50YW4gYWxsZSBVSURzIGF1cy4gIgorICAgICAgICAiKEZpbHRlciBhbikiLDc4KSk7CisgIH0KKyAgZWxzZSBpZiAoYXJnPT0iYXVzIikgeworICAgIGZpbHRlcnN0YXR1cz0wOworICAgIHRlbGxfb2JqZWN0KFBMLGJyZWFrX3N0cmluZygKKyAgICAgICAgIkRlaW4gRmVobGVydGV1ZmVsIHdpcmQgRGlyIG51biB3aWVkZXIgYWxsZSBGZWhsZXIgYmVyaWNodGVuLiAiLAorICAgICAgICA3OCkpOworICB9CisgIGVsc2UgaWYgKGFyZz09ImFuIiB8fCBhcmc9PSJlaW4iKSB7CisgICAgZmlsdGVyc3RhdHVzPTE7CisgICAgdGVsbF9vYmplY3QoUEwsYnJlYWtfc3RyaW5nKAorICAgICAgICAiRGVpbiBGZWhsZXJ0ZXVmZWwgd2lyZCBEaXIgbnVuIG51ciBub2NoIGF1c2dld2FlaGx0ZSAiCisgICAgICAgICJGZWhsZXIgYmVyaWNodGVuLiIsNzgpKTsKKyAgfQorICBlbHNlIHsKKyAgICBmb3JlYWNoKHN0cmluZyB1aWQ6IGV4cGxvZGUoYXJnLCIgIiktKHsiIn0pKSB7CisgICAgICBpZiAoc2l6ZW9mKHVpZCk+MSAmJiB1aWRbMF09PScrJykgeworICAgICAgICBpZiAobWVtYmVyKGZpbHRlcnVpZHMsdWlkWzEuLl0pPT0tMSkKKyAgICAgICAgICBmaWx0ZXJ1aWRzKz0oe3VpZFsxLi5dfSk7CisgICAgICB9CisgICAgICBlbHNlIGlmIChzaXplb2YodWlkKT4xICYmIHVpZFswXT09Jy0nKSB7CisgICAgICAgICAgZmlsdGVydWlkcy09KHt1aWRbMS4uXX0pOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGlmIChtZW1iZXIoZmlsdGVydWlkcyx1aWQpPT0tMSkKKyAgICAgICAgICBmaWx0ZXJ1aWRzKz0oe3VpZH0pOworICAgICAgICBlbHNlCisgICAgICAgICAgZmlsdGVydWlkcy09KHt1aWR9KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICB0ZWxsX29iamVjdChQTCxicmVha19zdHJpbmcoCisgICAgICAgICAgIk1vbWVudGFuIGludGVyZXNzaWVyZW4gRGljaCBmb2xnZW5kZSBVSURzIG5pY2h0IgorICAgICAgICAgICsoZmlsdGVyc3RhdHVzID8gIiAoRmlsdGVyIGFuKTpcbiIgOiAiIChGaWx0ZXIgYXVzKTpcbiIpCisgICAgICAgICAgK0NvdW50VXAoZmlsdGVydWlkcykrIlxuIiwgNzgsIiIsQlNfTEVBVkVfTVlfTEZTKSk7CisKKyAgcmV0dXJuIDE7Cit9CisKK3B1YmxpYyBpbnQgQ21kTW9uaXRvcihzdHJpbmcgYXJnKSB7CisKKyAgYXJnPShzdHJpbmcpUEwtPl91bnBhcnNlZF9hcmdzKDApOyAgCisKKyAgaWYgKCFzdHJpbmdwKGFyZykgfHwgIXNpemVvZihhcmcpKSB7CisgICAgdGVsbF9vYmplY3QoUEwsYnJlYWtfc3RyaW5nKAorICAgICAgICAgICJNb21lbnRhbiBpbnRlcmVzc2llcmVuIERpY2ggZm9sZ2VuZGUgVUlEcyB6dXNhZXR6bGljaCB6dSBEZWluZW46IFxuIgorICAgICAgICAgICsoc2l6ZW9mKG1vbml0b3J1aWRzKSA/IENvdW50VXAobW9uaXRvcnVpZHMpIDogIiIpCisgICAgICAgICAgKyJcbiIsIDc4LCIiLEJTX0xFQVZFX01ZX0xGUykpOworICAgIHJldHVybiAxOworICB9CisKKyAgaWYgKGFyZz09ImtlaW5lIikgeworICAgIG1vbml0b3J1aWRzPSh7fSk7CisgICAgeG1vbml0b3J1aWRzPSh7fSk7CisgICAgdGVsbF9vYmplY3QoUEwsYnJlYWtfc3RyaW5nKAorICAgICAgICAiRGVpbiBGZWhsZXJ0ZXVmZWwgd2lyZCBEaXIgbnVuIG51ciBub2NoICIKKyAgICAgICAgIkZlaGxlciBEZWluZXIgZWlnZW5lbiBVSURzIGJlcmljaHRlbi4iLDc4KSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgZWxzZSB7CisgICAgZm9yZWFjaChzdHJpbmcgdWlkOiBleHBsb2RlKGFyZywiICIpLSh7IiJ9KSkgeworICAgICAgaWYgKHNpemVvZih1aWQpPjEgJiYgdWlkWzBdPT0nKycpIHsKKyAgICAgICAgaWYgKG1lbWJlcihtb25pdG9ydWlkcyx1aWRbMS4uXSk9PS0xKQorICAgICAgICAgIG1vbml0b3J1aWRzKz0oe3VpZFsxLi5dfSk7CisgICAgICB9CisgICAgICBlbHNlIGlmIChzaXplb2YodWlkKT4xICYmIHVpZFswXT09Jy0nKSB7CisgICAgICAgICAgbW9uaXRvcnVpZHMtPSh7dWlkWzEuLl19KTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBpZiAobWVtYmVyKG1vbml0b3J1aWRzLHVpZCk9PS0xKQorICAgICAgICAgIG1vbml0b3J1aWRzKz0oe3VpZH0pOworICAgICAgICBlbHNlCisgICAgICAgICAgbW9uaXRvcnVpZHMtPSh7dWlkfSk7CisgICAgICB9CisgICAgfQorICB9CisgIGdldF91aWRzKCk7CisgIHRlbGxfb2JqZWN0KFBMLGJyZWFrX3N0cmluZygKKyAgICAgICAgIk1vbWVudGFuIGludGVyZXNzaWVyZW4gRGljaCBmb2xnZW5kZSBVSURzIHp1c2FldHpsaWNoIHp1IERlaW5lbjogXG4iCisgICAgICAgICsoc2l6ZW9mKG1vbml0b3J1aWRzKSA/IENvdW50VXAobW9uaXRvcnVpZHMpIDogIiIpCisgICAgICAgICsiXG4iLCA3OCwiIixCU19MRUFWRV9NWV9MRlMpKTsKKworICByZXR1cm4gMTsKK30KKworcHVibGljIGludCBDbWRNb2R1cyhzdHJpbmcgYXJnKSB7CisgIHN0cmluZyB0eHQ7CisKKyAgLy8gQXJndW1lbnQgdmVyd3Vyc3RlbgorICBpZiAoc3RyaW5ncChhcmcpICYmIHNpemVvZihhcmcpKSB7CisgICAgbW9kdXMgPSBzZWxlY3RfbW9kdXMoYXJnKTsKKyAgICByZXNldCgpOyAgLy8gbmV1ZSBGZWhsZXJsaXN0ZSBob2xlbgorICB9CisgIC8vIGFrdHVlbGxlIEVpbnN0ZWxsdW5nIGF1c2dlYmVuLgorICBzdHJpbmcgKm1vZHN0cj0oe30pOworICBpZiAobW9kdXMgJiBUX1JURVJST1IpCisgICAgICBtb2RzdHIrPSh7IkZlaGxlciAoTGF1ZnplaXQpIn0pOworICBpZiAobW9kdXMgJiBUX1JUV0FSTikKKyAgICAgIG1vZHN0cis9KHsiV2FybnVuZ2VuIChMYXVmemVpdCkifSk7CisgIGlmIChtb2R1cyAmIFRfQ1RFUlJPUikKKyAgICAgIG1vZHN0cis9KHsiRmVobGVyIChMYWRlemVpdCkifSk7CisgIGlmIChtb2R1cyAmIFRfQ1RXQVJOKQorICAgICAgbW9kc3RyKz0oeyJXYXJudW5nZW4gKExhZGV6ZWl0KSJ9KTsKKyAgaWYgKG1vZHVzICYgVF9SRVBPUlRFRF9FUlIpCisgICAgICBtb2RzdHIrPSh7IkZlaGxlcmhpbndlaXNlIn0pOworICBpZiAobW9kdXMgJiBUX1JFUE9SVEVEX0lERUEpCisgICAgICBtb2RzdHIrPSh7IklkZWUifSk7CisgIGlmIChtb2R1cyAmIFRfUkVQT1JURURfTUQpCisgICAgICBtb2RzdHIrPSh7ImZlaGxlbmRlIERldGFpbHMifSk7CisgIGlmIChtb2R1cyAmIFRfUkVQT1JURURfVFlQTykKKyAgICAgIG1vZHN0cis9KHsiVHlwbyJ9KTsKKworICB0ZWxsX29iamVjdChQTCwgYnJlYWtfc3RyaW5nKAorICAgICAgIkRlaW4gRmVobGVydGV1ZmVsIHdpcmQgRGlyIG51biB1ZWJlciBhdWZnZXRyZXRlbmUgIgorICAgICAgK0NvdW50VXAobW9kc3RyKSsiIEJlcmljaHQgZXJzdGF0dGVuLiIsNzgpKTsKKyAgcmV0dXJuKDEpOworfQorCitpbnQgQ21kQWRkTm90ZShzdHJpbmcgc3RyKSB7CisgIHN0cmluZyAqYXJyOworCisgIG5vdGlmeV9mYWlsKCJCaXR0ZSBlaW5lIElEIHVuZCBlaW5lbiBUZXh0IGFuZ2ViZW4hXG4iKTsKKyAgaWYoIW9iamVjdHAoVEkpKQorICAgIHJldHVybiAwOworCisgIHN0cj0oc3RyaW5nKVBMLT5fdW5wYXJzZWRfYXJncygwKTsKKyAgaWYgKCFzdHJpbmdwKHN0cikgfHwgIXNpemVvZihzdHIpKQorICAgIHJldHVybiAwOworCisgIGFycj1leHBsb2RlKHN0ciwiICIpLSh7IiJ9KTsKKyAgaWYgKHNpemVvZihhcnIpPDIpCisgICAgcmV0dXJuIDA7CisgIGludCBpc3N1ZWlkID0gdG9faW50KGFyclswXSk7CisKKyAgc3RyPWltcGxvZGUoYXJyWzEuLl0sIiAiKTsgIC8vdGV4dCB3aWVkZXJoZXJzdGVsbGVuLCBhYmVyIG9obmUgSUQKKworICBzd2l0Y2goKGludClFUlJPUkQtPkFkZE5vdGUoaXNzdWVpZCxzdHIpKQorICB7CisgICAgY2FzZSAtMToKKyAgICAgIHRlbGxfb2JqZWN0KFBMLAorICAgICAgICAgIHNwcmludGYoIkVzIGdpYnQga2VpbmVuIEZlaGxlciBtaXQgZGVyIElEOiAlZFxuIixpc3N1ZWlkKSk7CisgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIC0zOgorICAgICAgcmV0dXJuIDA7IC8vb2ZmZW5iYXIga2VpbmUgTm90aXogYW5nZWdlYmVuLgorICB9CisgIC8vIGxldHp0ZW4gRmVobGVyIG1lcmtlbi4KKyAgbGZlaGxlciA9IGlzc3VlaWQ7CisKKyAgdGVsbF9vYmplY3QoUEwsCisgICAgICBzcHJpbnRmKCJEZWluZSBOb3RpeiB3dXJkZSB6dSAlZCBoaW56dWdlZnVlZ3QuXG4iLAorICAgICAgICBpc3N1ZWlkKSk7CisgIHJldHVybiAxOworfQorCitpbnQgQ21kRml4KHN0cmluZyBzdHIpCit7CisgIHN0cmluZyAqYXJyOworICBpbnQgZml4aW5nLCByZXM7CisKKyAgbm90aWZ5X2ZhaWwoIkJpdHRlIGVpbmUgSUQgdW5kIG9wdGlvbmFsIGVpbmUgTm90aXogYW5nZWJlbiFcbiIpOworICBpZighb2JqZWN0cChUSSkpCisgICAgcmV0dXJuIDA7CisKKyAgc3RyPShzdHJpbmcpUEwtPl91bnBhcnNlZF9hcmdzKDApOworICBpZiAoIXN0cmluZ3Aoc3RyKSB8fCAhc2l6ZW9mKHN0cikpCisgICAgcmV0dXJuIDA7CisKKyAgYXJyPWV4cGxvZGUoc3RyLCIgIiktKHsiIn0pOworICBpZiAoIXNpemVvZihhcnIpKQorICAgIHJldHVybiAwOworCisgIGludCBpc3N1ZWlkPXRvX2ludChhcnJbMF0pOworICBpZiAoc2l6ZW9mKGFycik+MSkKKyAgICBzdHI9aW1wbG9kZShhcnJbMS4uXSwiICIpOyAgLy90ZXh0IHdpZWRlcmhlcnN0ZWxsZW4sIGFiZXIgb2huZSBLZXkKKyAgZWxzZSBzdHI9MDsKKworICBpZiAocXVlcnlfdmVyYigpPT0iZmZpeCIgfHwgcXVlcnlfdmVyYigpPT0iZmVobGVyZml4IikKKyAgeworICAgICAgZml4aW5nPTE7CisgICAgICByZXMgPSAoaW50KUVSUk9SRC0+UmVzb2x2ZUlzc3VlKGlzc3VlaWQsIHN0cik7CisgIH0KKyAgZWxzZQorICB7CisgICAgICByZXMgPSAoaW50KUVSUk9SRC0+UmVPcGVuSXNzdWUoaXNzdWVpZCwgc3RyKTsKKyAgfQorCisgIGlmIChyZXM9PS0xKQorICB7CisgICAgICB0ZWxsX29iamVjdChQTCwKKyAgICAgICAgICBzcHJpbnRmKCJFcyBnaWJ0IGtlaW5lbiBGZWhsZXIgbWl0IGRlciBJRDogJWRcbiIsaXNzdWVpZCkpOworICB9CisgIGVsc2UgaWYgKHJlcz09LTEwKQorICB7CisgICAgICB0ZWxsX29iamVjdChQTCwKKyAgICAgICAgIkR1IGhhc3QgbGVpZGVyIGtlaW5lbiBTY2hyZWlienVncmlmZiBkaWVzZW4gRmVobGVyLlxuIgorICAgICAgICAiQWJlciB2aWVsbGVpY2h0IG1vZWNodGVzdCBEdSBtaXQgZm5vdGl6IGVpbmUgTm90aXogYW5oYWVuZ2VuP1xuIik7CisgIH0KKyAgZWxzZSBpZiAocmVzPT0tMykKKyAgeworICAgIGlmIChmaXhpbmcpCisgICAgICB0ZWxsX29iamVjdChQTCwiRGllc2VyIEZlaGxlciBpc3QgYmVyZWl0cyBnZWZpeHQuXG4iKTsKKyAgICBlbHNlCisgICAgICB0ZWxsX29iamVjdChQTCwiRGllc2VyIEZlaGxlciBpc3Qgbm9jaCBuaWNodCBnZWZpeHQuXG4iKTsKKyAgfQorICBlbHNlIGlmIChyZXM9PTEpCisgIHsKKyAgICAgIHRlbGxfb2JqZWN0KFBMLAorICAgICAgICAgIHNwcmludGYoIkZlaGxlciAlZCBhbHMgZ2VmaXh0IG1hcmtpZXJ0LlxuIixpc3N1ZWlkKSk7CisgIH0KKyAgZWxzZSBpZiAocmVzPT0wKQorICB7CisgICAgICB0ZWxsX29iamVjdChQTCwKKyAgICAgICAgICBzcHJpbnRmKCJGZWhsZXIgJWQgYWxzIG5pY2h0IGdlZml4dCBtYXJraWVydC5cbiIsaXNzdWVpZCkpOworICB9CisgIC8vIGxldHp0ZW4gRmVobGVyIG1lcmtlbi4KKyAgbGZlaGxlciA9IGlzc3VlaWQ7CisKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBDbWRMb2NrKHN0cmluZyBzdHIpIHsKKyAgc3RyaW5nICphcnI7CisgIGludCBsb2NraW5nOworICBpbnQgcmVzOworCisgIG5vdGlmeV9mYWlsKCJCaXR0ZSBlaW5lIElEIHVuZCBvcHRpb25hbCBlaW5lIE5vdGl6IGFuZ2ViZW4hXG4iKTsKKyAgaWYoIW9iamVjdHAoVEkpKQorICAgIHJldHVybiAwOworCisgIHN0cj0oc3RyaW5nKVBMLT5fdW5wYXJzZWRfYXJncygwKTsKKyAgaWYgKCFzdHJpbmdwKHN0cikgfHwgIXNpemVvZihzdHIpKQorICAgIHJldHVybiAwOworCisgIGFycj1leHBsb2RlKHN0ciwiICIpLSh7IiJ9KTsKKyAgaWYgKCFzaXplb2YoYXJyKSkKKyAgICByZXR1cm4gMDsKKworICBpbnQgaXNzdWVpZD10b19pbnQoYXJyWzBdKTsKKyAgaWYgKHNpemVvZihhcnIpPjEpCisgICAgc3RyPWltcGxvZGUoYXJyWzEuLl0sIiAiKTsgIC8vdGV4dCB3aWVkZXJoZXJzdGVsbGVuLCBhYmVyIG9obmUgS2V5CisgIGVsc2Ugc3RyPTA7CisKKyAgaWYgKHF1ZXJ5X3ZlcmIoKT09ImZsb2NrIiB8fCBxdWVyeV92ZXJiKCk9PSJmZWhsZXJsb2NrIikKKyAgeworICAgICAgbG9ja2luZz0xOworICAgICAgcmVzPShpbnQpRVJST1JELT5Mb2NrSXNzdWUoaXNzdWVpZCxzdHIpOworICB9CisgIGVsc2UKKyAgeworICAgICAgcmVzPShpbnQpRVJST1JELT5VbmxvY2tJc3N1ZShpc3N1ZWlkLHN0cik7CisgIH0KKworICBpZiAocmVzPT0tMSkKKyAgeworICAgICAgdGVsbF9vYmplY3QoUEwsCisgICAgICAgICAgc3ByaW50ZigiRXMgZ2lidCBrZWluZW4gRmVobGVyIG1pdCBkZXIgSUQ6ICVkXG4iLGlzc3VlaWQpKTsKKyAgfQorICBlbHNlIGlmIChyZXM9PS0xMCkKKyAgeworICAgICAgIHRlbGxfb2JqZWN0KFBMLAorICAgICAgICAgICAiRHUgaGFzdCBsZWlkZXIga2VpbmVuIFNjaHJlaWJ6dWdyaWZmIGRpZXNlbiBGZWhsZXIuXG4iKTsKKyAgfQorICBlbHNlIGlmIChyZXM9PS0zKQorICB7CisgICAgICBpZiAobG9ja2luZykKKyAgICAgICAgICB0ZWxsX29iamVjdChQTCwKKyAgICAgICAgICAgICAgIkRpZXNlciBGZWhsZXIgaXN0IGJlcmVpdHMgdm9yIGF1dG9tLiBMb2VzY2hlbiBnZXNjaHVldHp0LlxuIik7CisgICAgICBlbHNlCisgICAgICAgICAgdGVsbF9vYmplY3QoUEwsCisgICAgICAgICAgICAgICJEaWVzZXIgRmVobGVyIGlzdCBiZXJlaXRzIHp1bSBhdXRvbS4gTG9lc2NoZW4gZnJlaWdlZ2ViZW4uXG4iKTsKKyAgfQorICBlbHNlIGlmIChyZXM9PS0yKQorICB7CisgICAgICAgdGVsbF9vYmplY3QoUEwsCisgICAgICAgICAgICJEaWVzZXIgRmVobGVyIGlzdCBiZXJlaXRzIGdlZml4dCB1bmQgd2lyZCBiYWxkIGdlbG9lc2NodC5cbiIpOworICB9CisgIGVsc2UgaWYgKHJlcz09MSkKKyAgeworICAgIHRlbGxfb2JqZWN0KFBMLAorICAgICAgICBzcHJpbnRmKCJGZWhsZXIgJWQgdm9yIGF1dG9tLiBMb2VzY2hlbiBnZXNjaHVldHp0LlxuIixpc3N1ZWlkKSk7CisgIH0KKyAgZWxzZSBpZiAocmVzPT0wKQorICB7CisgICAgdGVsbF9vYmplY3QoUEwsCisgICAgICAgIHNwcmludGYoIkZlaGxlciAlZCB6dW0gYXV0b20uIExvZXNjaGVuIGZyZWlnZWdlYmVuLlxuIixpc3N1ZWlkKSk7CisgIH0KKyAgLy8gbGV0enRlbiBGZWhsZXIgbWVya2VuLgorICBsZmVobGVyID0gaXNzdWVpZDsKKworICByZXR1cm4gMTsKK30KKworaW50IENtZFJlYXNzaWduKHN0cmluZyBzdHIpIHsKKworICBub3RpZnlfZmFpbCgiQml0dGUgZWluZSBJRCwgZGllIG5ldWUgVUlEIHVuZCBnZ2YuIGVpbmUgTm90aXogYW5nZWJlbiFcbiIpOworICBpZighb2JqZWN0cChUSSkpCisgICAgcmV0dXJuIDA7CisKKyAgc3RyPShzdHJpbmcpUEwtPl91bnBhcnNlZF9hcmdzKDApOworICBpZiAoIXN0cmluZ3Aoc3RyKSB8fCAhc2l6ZW9mKHN0cikpCisgICAgcmV0dXJuIDA7CisKKyAgc3RyaW5nICphcnI9ZXhwbG9kZShzdHIsIiAiKS0oeyIifSk7CisgIGlmIChzaXplb2YoYXJyKTwyKQorICAgIHJldHVybiAwOworICBpbnQgaXNzdWVpZD10b19pbnQoYXJyWzBdKTsKKyAgc3RyaW5nIG5ld3VpZD1hcnJbMV07CisKKyAgLy90ZXh0IHdpZWRlcmhlcnN0ZWxsZW4sIGFiZXIgb2huZSBLZXkgdW5kIFVJRAorICBpZiAoc2l6ZW9mKGFycikgPiAyKQorICAgIHN0ciA9IGltcGxvZGUoYXJyWzIuLl0sIiAiKTsKKyAgZWxzZQorICAgIHN0ciA9IDA7CisKKyAgc3dpdGNoKChpbnQpRVJST1JELT5SZWFzc2lnbklzc3VlKGlzc3VlaWQsIG5ld3VpZCwgc3RyKSkKKyAgeworICAgIGNhc2UgLTE6CisgICAgICB0ZWxsX29iamVjdChQTCwKKyAgICAgICAgICBzcHJpbnRmKCJFcyBnaWJ0IGtlaW5lbiBGZWhsZXIgbWl0IGRlciBJRDogJWRcbiIsaXNzdWVpZCkpOworICAgICAgcmV0dXJuKDEpOworICAgIGNhc2UgLTEwOgorICAgICAgdGVsbF9vYmplY3QoUEwsCisgICAgICAgICAgc3ByaW50ZigiRHUgaGFzdCBrZWluZSBTY2hyZWlicmVjaHRlIGF1ZiBGZWhsZXIgJWRcbiIsaXNzdWVpZCkpOworICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSAtMjoKKyAgICAgIHJldHVybigwKTsgLy9vZmZlbmJhciBrZWluZSBuZXVlIHVpZCBhbmdlZ2ViZW4uIChrYW5uIG5pY2h0KQorICAgIGNhc2UgLTM6CisgICAgICB0ZWxsX29iamVjdChQTCxicmVha19zdHJpbmcoCisgICAgICAgICAgIkFsdGUgPT0gTmV1ZSBVSUQgaXN0IGlyZ2VuZHdpZSB1bnNpbm5pZy4uLiIsNzgpKTsKKyAgICAgIHJldHVybiAxOworICB9CisgIC8vIGxldHp0ZW4gRmVobGVyIG1lcmtlbi4KKyAgbGZlaGxlciA9IGlzc3VlaWQ7CisKKyAgdGVsbF9vYmplY3QoUEwsYnJlYWtfc3RyaW5nKAorICAgICAgc3ByaW50ZigiRGVyIEZlaGxlciBkZXIgSUQgJWQgd3VyZGUgYW4gZGllIFVJRCAlcyAiCisgICAgICAgICJ1ZWJlcnRyYWdlbi5cbiIsIGlzc3VlaWQsIG5ld3VpZCksNzgpKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vICoqKioqKioqKioqKioqIHB1YmxpYyAnaW50ZXJuYWwnIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKgorcHVibGljIHN0cmluZyBRdWVyeU93bmVyKCkge3JldHVybiBvd25lcjt9CitwdWJsaWMgbWl4ZWQgUXVlcnlJc3N1ZUxpc3QoKSB7cmV0dXJuIGlzc3VlbGlzdDt9CisKK3ZvaWQgY3JlYXRlKCkgeworICAgIGlmICghY2xvbmVwKE1FKSkKKyAgICAgICAgcmV0dXJuOworICAgIDo6Y3JlYXRlKCk7IAorCisgICAgU2V0UHJvcChQX1NIT1JULCJEZXIgRmVobGVydGV1ZmVsIik7CisgICAgU2V0UHJvcChQX0xPTkcsYnJlYWtfc3RyaW5nKAorICAgICAgICAgICJEZWluIEZlaGxlcnRldWZlbCBzb2xsIERpciBoZWxmZW4sIEluZm9ybWF0aW9uZW4gIgorICAgICAgICAgICJ1ZWJlciBhdWZnZXRyZXRlbmUgRmVobGVyIHp1IGVyaGFsdGVuLiBIaWVyenUgZnJhZ3QgZXIgZGllICIKKyAgICAgICAgICAiaW4gXCJEZWluZW5cIiBVSURzIGF1ZmdldHJldGVuZW4gRmVobGVyIHVuZCBkZXJlbiBEZXRhaWxzIHZvbSAiCisgICAgICAgICAgIkZlaGxlcnNwZWljaGVyIGRlciBNdWRsaWIgYWIuIEZvbGdlbmRlIEtvbW1hbmRvcyBrZW5udCBlcjoiLDc4KQorICAgICsiZmVobGVyYWJmcmFnZSA8aWQ+ICAtIEZyYWd0IERldGFpbHMgdWViZXIgRmVobGVyIG1pdCBkZXIgSUQgYWIuXG4iCisgICAgImZlaGxlcmxvZXNjaGVuIDxpZD4gLSBGZWhsZXIgenVtIExvZXNjaGVuIG1hcmtpZXJlbi5cbiIKKyAgICAiZmVobGVybGlzdGUgICAgICAgICAtIEZlaGxlcmxpc3RlIGRlciBlaWdlbmVuIFVJRHMgYW56ZWlnZW5cbiIKKyAgICAiZmVobGVycmVmcmVzaCAgICAgICAtIEZlaGxlcmRhdGVuIHVuZCBVSURzIG5ldSBlaW5sZXNlblxuIgorICAgICJmZWhsZXJmaWx0ZXIgICAgICAgIC0gVUlEcyBmdWVyIGRlbiBGaWx0ZXIgYW5nZWJlbiAocy4gbWFucGFnZSEpXG4iCisgICAgImZlaGxlcm1vZHVzICAgICAgICAgLSBGZWhsZXIgb2RlciBXYXJudW5nZW4gYXVzZ2ViZW4/IChzLiBtYW5wYWdlKVxuIgorICAgICJmZWhsZXJtb25pdG9yICAgICAgIC0genVzLiBVSURzIGJlb2JhY2h0ZW4gKHMuIG1hbnBhZ2UpXG4iCisgICAgImZub3RpeiA8aWQ+IDxub3RlPiAgLSBlaW5lIE5vdGl6IGFuaGFlbmdlblxuIgorICAgICJmbG9jayA8aWQ+ICA8bm90ZT4gIC0gRmVobGVyIHZvciBhdXRvbS4gTG9lc2NoZW4gc2NodWV0emVuXG4iCisgICAgImZ1bmxvY2sgPGlkPiA8bm90ZT4gLSBGZWhsZXIgenVtIGF1dG9tLiBMb2VzY2hlbiBmcmVpZ2ViZW5cbiIKKyAgICAiZmZpeCA8aWQ+IDxub3RlPiAgICAtIEZlaGxlciBhbHMgZ2VmaXh0IGtlbm56ZWljaG5lblxuIgorICAgICJmdW5maXggPGlkPiA8bm90ZT4gIC0gZ2VmaXh0ZW4gRmVobGVyIGFscyBuaWNodC1nZWZpeHQgbWFya2llcmVuXG4iCisgICAgImZ1ZWJlcnRyYWdlIDxpZD4gPG5ld3VpZD4gPG5vdGU+XG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgLSBGZWhsZXIgYW4gZGllIFVJRCB1ZWJlcnRyYWdlblxuIgorICAgICk7CisgICAgU2V0UHJvcChQX05BTUUsIkZlaGxlcnRldWZlbCIpOworICAgIFNldFByb3AoUF9HRU5ERVIsTUFMRSk7CisgICAgU2V0UHJvcChQX1dFSUdIVCwwKTsKKyAgICBTZXRQcm9wKFBfVkFMVUUsMCk7CisgICAgU2V0UHJvcChQX1NJWkUsMTApOworICAgIFNldFByb3AoUF9OT0RST1AsIkRlbiBGZWhsZXJ0ZXVmZWwgYmVoYWVsc3QgRHUgbGllYmVyIGJlaSBEaXIuXG4iKTsKKyAgICBTZXRQcm9wKFBfTkVWRVJEUk9QLDEpOworCisgICAgQWRkSWQoICh7ImZlaGxlcnRldWZlbCIsInRldWZlbCJ9KSApOworCisgICAgQWRkQ21kKCh7ImZlaGxlcmFiZnJhZ2UiLCJmYWJmcmFnZSJ9KSwgIkNtZEZlaGxlclplaWdlbiIgKTsKKyAgICBBZGRDbWQoKHsiZmVobGVybG9lc2NoZW4iLCJmbG9lc2NoZW4ifSksICJDbWRGZWhsZXJMb2VzY2hlbiIpOworICAgIEFkZENtZCgoeyJmZWhsZXJsaXN0ZSIsImZsaXN0ZSIsICJmZWhsZXJ1ZWJlcnNpY2h0IiwiZnVlYmVyc2ljaHQifSksIAorICAgICAgICAiQ21kRmVobGVyTGlzdGUiKTsKKyAgICBBZGRDbWQoKHsiZmVobGVycmVmcmVzaCIsImZyZWZyZXNoIn0pLCJDbWRSZWZyZXNoIik7CisgICAgQWRkQ21kKCh7ImZlaGxlcmZpbHRlciIsImZmaWx0ZXIifSksIkNtZEZpbHRlciIpOworICAgIEFkZENtZCgoeyJmZWhsZXJtb2R1cyIsImZtb2R1cyJ9KSwiQ21kTW9kdXMiKTsKKyAgICBBZGRDbWQoKHsiZmVobGVybW9uaXRvciIsImZtb25pdG9yIn0pLCJDbWRNb25pdG9yIik7CisgICAgQWRkQ21kKCh7ImZlaGxlcm5vdGl6IiwiZm5vdGl6In0pLCJDbWRBZGROb3RlIik7CisgICAgQWRkQ21kKCh7ImZlaGxlcmxvY2siLCJmbG9jayIsImZlaGxlcnVubG9jayIsImZ1bmxvY2sifSksCisgICAgICAgICJDbWRMb2NrIik7CisgICAgQWRkQ21kKCh7ImZlaGxlcmZpeCIsImZmaXgiLCJmZWhsZXJ1bmZpeCIsImZ1bmZpeCJ9KSwKKyAgICAgICAgIkNtZEZpeCIpOworICAgIEFkZENtZCgoeyJmZWhsZXJ1ZWJlcnRyYWdlIiwiZnVlYmVydHJhZ2UifSksIkNtZFJlYXNzaWduIik7CisgICAgQWRkQ21kKCh7ImZlaGxlcmVpbmdhYmUiLCAiZmVpbmdhYmUifSksICJDbWRGZWhsZXJFaW5nYWJlIik7Cit9CisKK3ZvaWQgaW5pdCgpCit7CisgICAgaWYgKGZpbmRfY2FsbF9vdXQoInJlbW92ZSIpICE9IC0xKSByZXR1cm47CisKKyAgICAvLyBwcnVlZnVuZyBhdWYgZW52IG5pY2h0IG5vZXRpZywgbW92ZSBnZWh0IG51ciBpbiBlaW4gZW52IHVuZCBvaG5lIGVudgorICAgIC8vIGF1Y2gga2VpbiBpbml0KCkuCisgICAgaWYgKCAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShlbnZpcm9ubWVudCgpKSB8fCAKKyAgICAgICAgIUlTX0xFQVJORVIoZW52aXJvbm1lbnQoKSkpIHsKKyAgICAgICAgLy8gaW4gaW50ZXJhY3RpdmUsIGFiZXIga2VpbiBtYWdpZXIgLT4gZGlyZWt0IHdlZy4KKyAgICAgICAgY2FsbF9vdXQoInJlbW92ZSIsMCwxKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlbHNlIGlmICghc2l6ZW9mKG93bmVyKSkKKyAgICAgICAgLy8gRW52IGlzdCBJbnRlcmFjdGl2IHVuZCBNYWdpZXIgKHNvbnN0IHdhZXIgbWFuIG9iZW4gcmF1c2dlZmxvZ2VuKQorICAgICAgICBvd25lcj1nZXR1aWQoZW52aXJvbm1lbnQoKSk7CisgICAgZWxzZSBpZiAob3duZXIhPWdldHVpZChlbnZpcm9ubWVudCgpKSkgeworICAgICAgIC8vb2ssIG5pY2h0IGRlciBFaWdlbnR1ZW1lciwgZGlyZWt0IHdlZy4KKyAgICAgICBjYWxsX291dCgicmVtb3ZlIiwwKTsKKyAgICAgICByZXR1cm47CisgICB9CisgICBTZXRQcm9wKFBfRVhUUkFfTE9PSyxicmVha19zdHJpbmcoCisgICAgICAgICAiQXVmICIrZW52aXJvbm1lbnQoKS0+TmFtZShXRVNTRU4pKyIgU2NodWx0ZXIgc2l0enQgZWluIGtsZWluZXIgIgorICAgICAgICAgIkZlaGxlcnRldWZlbCwgZGVyICIKKyAgICAgICAgICtlbnZpcm9ubWVudCgpLT5RdWVyeVByb25vdW4oV0VNKQorICAgICAgICAgKyIgaW1tZXIgd2llZGVyIGV0d2FzIGlucyBPaHIgZmx1ZXN0ZXJ0LiIsNzgpKTsKKworICAgY2FsbF9vdXQoInJlc2V0IiwxKTsKKworICAgOjppbml0KCk7Cit9CisKK3B1YmxpYyBtaXhlZCBDb25maWd1cmUobWl4ZWQgZGF0YSkKK3sKKyAgaWYgKCFkYXRhKQorICB7CisgICAgcmV0dXJuIChbImZpbHRlcnVpZHMiOmZpbHRlcnVpZHMsCisgICAgICAgICAgICAgImZpbHRlcnN0YXR1cyI6ZmlsdGVyc3RhdHVzLAorICAgICAgICAgICAgICJtb2R1cyI6bW9kdXMsCisgICAgICAgICAgICAgIm1vbml0b3J1aWRzIjptb25pdG9ydWlkcywKKyAgICAgICAgICAgICAiZmVobGVyemFobCI6IGZlaGxlcnphaGxdKTsKKyAgfQorICBlbHNlIGlmIChtYXBwaW5ncChkYXRhKSkKKyAgeworICAgIGlmIChtZW1iZXIoZGF0YSwiZmlsdGVydWlkcyIpICYmIHBvaW50ZXJwKGRhdGFbImZpbHRlcnVpZHMiXSkpCisgICAgICBmaWx0ZXJ1aWRzPWRhdGFbImZpbHRlcnVpZHMiXTsKKyAgICBpZiAobWVtYmVyKGRhdGEsImZpbHRlcnN0YXR1cyIpICYmIGludHAoZGF0YVsiZmlsdGVyc3RhdHVzIl0pKQorICAgICAgZmlsdGVyc3RhdHVzPWRhdGFbImZpbHRlcnN0YXR1cyJdOworICAgIGlmIChtZW1iZXIoZGF0YSwibW9kdXMiKSAmJiBpbnRwKGRhdGFbIm1vZHVzIl0pKQorICAgICAgbW9kdXM9ZGF0YVsibW9kdXMiXTsKKyAgICBpZiAobWVtYmVyKGRhdGEsIm1vbml0b3J1aWRzIikgJiYgcG9pbnRlcnAoZGF0YVsibW9uaXRvcnVpZHMiXSkpCisgICAgICBtb25pdG9ydWlkcz1kYXRhWyJtb25pdG9ydWlkcyJdOworICAgIGlmIChtZW1iZXIoZGF0YSwiZmVobGVyemFobCIpICYmIGludHAoZGF0YVsiZmVobGVyemFobCJdKSkKKyAgICAgIGZlaGxlcnphaGw9ZGF0YVsiZmVobGVyemFobCJdOworICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQorCittYXBwaW5nIF9xdWVyeV9hdXRvbG9hZG9iaigpCit7CisgIHJldHVybiBDb25maWd1cmUoMCk7Cit9CisKK21hcHBpbmcgX3NldF9hdXRvbG9hZG9iaihtaXhlZCBkYXRhKQoreworICBDb25maWd1cmUoZGF0YSk7CisgIHJldHVybiBfcXVlcnlfYXV0b2xvYWRvYmooKTsKK30KKworCit2b2lkIHJlc2V0KCkKK3sKKyAgICBnZXRfdWlkcygpOworICAgIGludCBuZXVlZmVobGVyemFobD1nZXRfaXNzdWVsaXN0KCk7CisKKyAgICBpZiAoZmVobGVyemFobCA8IG5ldWVmZWhsZXJ6YWhsKQorICAgICAgdGVsbF9vYmplY3QoZW52aXJvbm1lbnQoTUUpLCBicmVha19zdHJpbmcoCisgICAgICAgICJEZWluZSBGZWhsZXJsaXN0ZSBpc3Qgc29lYmVuIGxhZW5nZXIgZ2V3b3JkZW4uIiw3OCwKKyAgICAgICAgIkRlaW4gRmVobGVydGV1ZmVsIHRlaWx0IERpciBtaXQ6ICIpKTsKKyAgICBlbHNlIGlmIChmZWhsZXJ6YWhsID4gbmV1ZWZlaGxlcnphaGwpCisgICAgICB0ZWxsX29iamVjdChlbnZpcm9ubWVudChNRSksIGJyZWFrX3N0cmluZygKKyAgICAgICAgIkRlaW5lIEZlaGxlcmxpc3RlIGlzdCBzb2ViZW4ga3VlcnplciBnZXdvcmRlbi4iLDc4LAorICAgICAgICAiRGVpbiBGZWhsZXJ0ZXVmZWwgdGVpbHQgRGlyIG1pdDogIikpOworICAgIGZlaGxlcnphaGwgPSBuZXVlZmVobGVyemFobDsKK30KKworLy8gKioqKioqKiogcHJpdmF0ZSBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqCitwcml2YXRlIHZvaWQgZ2V0X3VpZHMoKQoreworICAgIHVpZHM9KHN0cmluZyAqKW1hc3RlcigpLT5RdWVyeVVJRHNGb3JXaXphcmQob3duZXIpOworICAgIHhtb25pdG9ydWlkcz0oe30pOworICAgIGlmIChzaXplb2YobW9uaXRvcnVpZHMpKQorICAgIHsKKyAgICAgIGNsb3N1cmUgY2w9c3ltYm9sX2Z1bmN0aW9uKCJRdWVyeVVJREFsaWFzIiwgbWFzdGVyKCkpOworICAgICAgZm9yZWFjaChzdHJpbmcgdWlkOiBtb25pdG9ydWlkcykgeworICAgICAgICB4bW9uaXRvcnVpZHMgKz0gKHN0cmluZyopZnVuY2FsbChjbCwgdWlkKTsKKyAgICAgIH0KKyAgICB9Cit9CisKKy8qIEhvbHQgc2ljaCBhdXMgZGVtIEVycm9yRCBkaWUgTGlzdGUgdW5nZWxvZXNjaHRlciB1bmQgdW5nZWZpeHRlciBGZWhsZXIgZnVlcgorICogZnVlciBkaWUgVUlEcyBkZXMgTWFnaWVyIGZ1ZXIgYWxsZSBUeXBlbgorICovCitwcml2YXRlIHZhcmFyZ3MgaW50IGdldF9pc3N1ZWxpc3QoaW50IGxtb2R1cykKK3sKKyAgICBpbnQgY291bnQ7CisKKyAgICBpZiAoIWxtb2R1cykKKyAgICAgIGxtb2R1cz1tb2R1czsKKworICAgIGlzc3VlbGlzdD1tX2FsbG9jYXRlKHNpemVvZihBTExfRVJSX1RZUEVTKSwxKTsKKworICAgIGZvcmVhY2goaW50IHR5cGU6IEFMTF9FUlJfVFlQRVMpCisgICAgeworICAgICAgaWYgKHR5cGUgJiBsbW9kdXMpCisgICAgICB7CisgICAgICAgICAgLy9ERUJVRyhzcHJpbnRmKCJUeXBlOiAlZFxuIix0eXBlKSk7CisgICAgICAgICAgZm9yZWFjaChzdHJpbmcgdWlkIDogdWlkcyArIHhtb25pdG9ydWlkcykKKyAgICAgICAgICB7CisgICAgICAgICAgICAvL0RFQlVHKHNwcmludGYoIlR5cGU6ICVkLCBVSUQ6ICVzXG4iLHR5cGUsdWlkKSk7CisgICAgICAgICAgICA8IDxpbnR8c3RyaW5nPiogPiogbGlzdCA9CisgICAgICAgICAgICAgICAgICAoPCA8aW50fHN0cmluZz4qID4qKUVSUk9SRC0+UXVlcnlJc3N1ZUxpc3QodHlwZSx1aWQpOworICAgICAgICAgICAgY291bnQgKz0gc2l6ZW9mKGxpc3QpOworCisgICAgICAgICAgICBpZiAoIW1lbWJlcihpc3N1ZWxpc3QsIHR5cGUpKQorICAgICAgICAgICAgICBpc3N1ZWxpc3QgKz0gKFsgdHlwZTogKFsgdWlkOiBsaXN0IF0pIF0pOworICAgICAgICAgICAgZWxzZSBpZiAoIW1lbWJlcihpc3N1ZWxpc3RbdHlwZV0sIHVpZCkpCisgICAgICAgICAgICAgIGlzc3VlbGlzdFt0eXBlXSArPSAoW3VpZDogbGlzdCBdKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY291bnQ7Cit9CisKZGlmZiAtLWdpdCBhL29iai90b29scy9saXNwL2VzY2FwZS5jIGIvb2JqL3Rvb2xzL2xpc3AvZXNjYXBlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVmNTY0OAotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9saXNwL2VzY2FwZS5jCkBAIC0wLDAgKzEsMzcgQEAKKy8vIEVTQ0FQRS5DIC0tIGV4cGFuZGluZyBlc2NhcGUgY2hhcmFjdGVycworLy8gKGMpIDE5OTQgYnkgSGF0ZUBNb3JnZW5HcmF1ZW4sIFRVQm11ZCwgTmlnaHRGYWxsCisvLyAtLQorLy8gQ29weSwgY2hhbmdlIGFuZCBkaXN0cmlidXRlIHRoaXMgYml0IG9mIHNvZnR3YXJlIGFzIG11Y2ggYXMgeW91IGxpa2UsCisvLyBidXQga2VlcCB0aGUgbmFtZSBvZiB0aGUgb3JpZ2luYWwgYXV0aG9yIGluIHRoZSBoZWFkZXIuCisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisKK3N0cmluZyBlc2NhcGUoc3RyaW5nIHN0cikKK3sKKyAgc3dpdGNoKHN0cikgCisgIHsKKyAgICBjYXNlICJcYiIgOiByZXR1cm4gIlxcYiI7CisgICAgY2FzZSAiXGYiIDogcmV0dXJuICJcXGYiOworICAgIGNhc2UgIlxuIiA6IHJldHVybiAiXFxuIjsKKyAgICBjYXNlICJcciIgOiByZXR1cm4gIlxcciI7CisgICAgY2FzZSAiXHQiIDogcmV0dXJuICJcXHQiOworICAgIGNhc2UgIlxcIiA6IHJldHVybiAiXFxcXCI7CisgIH0KKyAgcmV0dXJuIHN0cjsKK30KKworc3RyaW5nIHVuZXNjYXBlKHN0cmluZyBzdHIpCit7CisgIHN3aXRjaChzdHIpIAorICB7CisgICAgY2FzZSAiXFxiIiA6IHJldHVybiAiXGIiOworICAgIGNhc2UgIlxcZiIgOiByZXR1cm4gIlxmIjsKKyAgICBjYXNlICJcXG4iIDogcmV0dXJuICJcbiI7CisgICAgY2FzZSAiXFxyIiA6IHJldHVybiAiXHIiOworICAgIGNhc2UgIlxcdCIgOiByZXR1cm4gIlx0IjsKKyAgICBjYXNlICJcXFxcIjogcmV0dXJuICJcXCI7CisgICAgZGVmYXVsdCAgIDogaWYoc3RyICYmIHNpemVvZihzdHIpPjEgJiYgc3RyWzBdPT0nXFwnKSAKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RyWzEuLl07IAorICB9CisgIHJldHVybiBzdHI7Cit9CmRpZmYgLS1naXQgYS9vYmovdG9vbHMvbGlzcC9rbmV0ZS5jIGIvb2JqL3Rvb2xzL2xpc3Ava25ldGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGMxNDMyCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL2xpc3Ava25ldGUuYwpAQCAtMCwwICsxLDE5MCBAQAorLy8gS05FVEUuQyAtLSBDb21tYW5kTGluZSBGcm9udGVuZCB0byB0aGUgTGlzcDJDbG9zdXJlIGNvbXBpbGVyCisvLyAoYykgMTk5NCBieSBIYXRlQE1vcmdlbkdyYXVlbiwgVFVCbXVkLCBOaWdodEZhbGwKKy8vIC0tCisvLyBDb3B5LCBjaGFuZ2UgYW5kIGRpc3RyaWJ1dGUgdGhpcyBiaXQgb2Ygc29mdHdhcmUgYXMgbXVjaCBhcyB5b3UgbGlrZSwKKy8vIGJ1dCBrZWVwIHRoZSBuYW1lIG9mIHRoZSBvcmlnaW5hbCBhdXRob3IgaW4gdGhlIGhlYWRlci4KKworI2luY2x1ZGUgInR3ZWFrLmgiCisKK3N0YXRpYyBpbmhlcml0IEhPTUUoImxpc3AiKTsKKworI2lmZGVmIEFMQVRJQQorIyAgZGVmaW5lIFRVQk1VRAorI2VuZGlmCisvLyBUVUJNVUQgaXMgYSBDT01QQVQgbW9kZSBnYW1lISAod2VsbCBzb3J0IG9mLCBpdHMgYSBOQVRJVkUvQ09NUEFUIG1peHR1cmUpCisvLyB0aGUgZm9sbG93aW5nIGRlZmluZXMgc2hvdWxkIGJlIHRoZSBvbmx5IG9uZXMgdG8gY2hhbmdlCisvLyBkZWZpbmUgRU5HTElTSCBpZiB5b3UgZG9uJ3Qgd2FudCBnZXJtYW4gbWVzc2FnZXMgOykKKyNpZiAoZGVmaW5lZChUVUJNVUQpIHx8IGRlZmluZWQoVEFQUE1VRCkgfHwgZGVmaW5lZChVTkl0b3BpYSkgfHwgXAorICAgICBkZWZpbmVkKEFEQU1BTlQpKQorIyBpZmRlZiBBREFNQU5UCisjICAgaW5jbHVkZSA8Y29uZmlnLmg+CisgICAgaW5oZXJpdCAiL2xpYi9vYmoiOworIyAgIGRlZmluZSBXSVpMT0NBTCAiL3dpei8iCisjICAgZGVmaW5lIElEKHgpICAgICAgICBzZXRfbmFtZSh4KQorIyAgIGRlZmluZSBTSE9SVCh4KSAgICAgc2V0X3Nob3J0KHgpCisjICAgZGVmaW5lIExPTkcoeCkgICAgICBzZXRfbG9uZyh4KQorIyAgIGRlZmluZSBJU1dJWkFSRChwbCkgKExFVkVMTUFTVEVSLT5pc193aXphcmQocGwtPnF1ZXJ5X3JlYWxfbmFtZSgpKSkKKyMgZW5kaWYKKyMgaWZkZWYgVFVCTVVECisjICAgaW5jbHVkZSA8a2VybmVsLmg+CisjICAgaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisgICAgaW5oZXJpdCBBQ0NFU1M7CisgICAgaW5oZXJpdCAiL2NvbXBsZXgvaXRlbSI7CisgICAgaW5oZXJpdCAiL2Jhc2ljL2F1dG9sb2FkIjsKKyMgICBkZWZpbmUgV0laTE9DQUwgIi9wbGF5ZXJzLyIKKyMgICBkZWZpbmUgSUQoeCkgICAgICAgIGFkZF9pZCh4KQorIyAgIGRlZmluZSBJU1dJWkFSRChwbCkgKHBsLT5xdWVyeV9sZXZlbCgpID49IFdMX1dJWkFSRCkKKyMgZW5kaWYKKyMgaWZkZWYgVEFQUE1VRAorIyAgIGluY2x1ZGUgPGxldmVscy5oPgorICAgIGluaGVyaXQgIi9vYmovdGhpbmciOworIyAgIGRlZmluZSBXSVpMT0NBTCAiL3cvIgorIyAgIGRlZmluZSBJRCh4KSAgICAgICAgc2V0X2FsaWFzKHgpCisjICAgZGVmaW5lIElTV0laQVJEKHBsKSAocGwtPnF1ZXJ5X2xldmVsKCkgPj0gTFZMX1dJWkFSRCkKKyMgZW5kaWYKKyMgZGVmaW5lIEVOR0xJU0gKKyMgaWZkZWYgVU5JdG9waWEKKyMgICB1bmRlZiBFTkdMSVNICisjICAgaWZkZWYgRmluYWxGcm9udGllcgorIyAgICAgaW5jbHVkZSA8bGV2ZWwuaD4KKyMgICBlbHNlCisjICAgICBpbmNsdWRlIDxsZXZlbHMuaD4KKyMgICBlbmRpZgorICAgIGluaGVyaXQgIi9pL2l0ZW0iOworICAgIGluaGVyaXQgIi9pL2luc3RhbGwiOworIyAgIGRlZmluZSBXSVpMT0NBTCAiL3cvIgorIyAgIGRlZmluZSBJRCh4KSAgICAgICAgYWRkX2lkKHgpCisjICAgZGVmaW5lIElTV0laQVJEKHBsKSB3aXpwKHBsKQorIyBlbmRpZgorIyBkZWZpbmUgV0laSE9NRSAgICAgICAgKFdJWkxPQ0FMK3RoaXNfcGxheWVyKCktPnF1ZXJ5X3JlYWxfbmFtZSgpKQorIyBkZWZpbmUgTE9ORyh4KSAgICAgICAgc2V0X2xvbmcoeCkKKyMgZGVmaW5lIFNIT1JUKHgpICAgICAgIHNldF9zaG9ydCh4KQorI2Vsc2UKKyAgaW5oZXJpdCAiL3N0ZC90aGluZyI7CisjIGlmZGVmIE5JR0hURkFMTAorIyAgIGRlZmluZSBFTkdMSVNICisjIGVuZGlmCisjIGluY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyMgaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjIGRlZmluZSBXSVpIT01FICAgICAgICAoIi9wbGF5ZXJzLyIrZ2V0dWlkKHRoaXNfb2JqZWN0KCkpKQorIyBkZWZpbmUgSUQoeCkgICAgICAgICAgQWRkSWQoeCk7IFNldFByb3AoUF9OQU1FLCB4KQorIyBkZWZpbmUgTE9ORyh4KSAgICAgICAgU2V0UHJvcChQX0xPTkcsIHgpCisjIGRlZmluZSBTSE9SVCh4KSAgICAgICBTZXRQcm9wKFBfU0hPUlQsIHgpOworIyBkZWZpbmUgSVNXSVpBUkQocGwpICAgSVNfV0laQVJEKHBsKQorI2VuZGlmCisKK25vbWFzayB2b2lkIGNyZWF0ZSgpCit7CisgIGlmKHNpemVvZihvbGRfZXhwbG9kZShvYmplY3RfbmFtZSh0aGlzX29iamVjdCgpKSwgIiMiKSkgPT0gMSkgcmV0dXJuOworICBpZighaW50ZXJhY3RpdmUodGhpc19wbGF5ZXIoKSkpIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOworI2lmbmRlZiBNT1JHRU5HUkFVRU4KKyAgaWYoKHRoaXNfcGxheWVyKCkgIT0gZmluZF9wbGF5ZXIoImhhdGUiKSAmJgorICAgICAgaW50ZXJhY3RpdmUoZmluZF9wbGF5ZXIoImhhdGUiKSkpICYmCisgICAgIG9sZF9leHBsb2RlKG9iamVjdF9uYW1lKHRoaXNfb2JqZWN0KCkpLCAiIyIpWzBdID09IEhPTUUoImtuZXRlIikpCisgIHsKKyNpZmRlZiBUVUJNVUQKKyAgICBpZihjaGVja19wcml2aWxlZ2UoImhhdGUiKSkgc2V0X3ByaXZpbGVnZSgiaGF0ZSIpOworICAgIGVsc2Ugc2V0X3ByaXZpbGVnZSgwKTsKKyNlbHNlCisgICAgcHJpbnRmKCIqRVJST1I6IGRvIG5vdCBjbG9uZSB0aGlzIGZpbGUhXG4iCisgICAgICAgICAgKyIgICAgICAgIGNyZWF0ZSBhIGZpbGUgd2l0aCB0aGUgZm9sbG93aW5nIGxpbmUgaW4geW91IGhvbWU6XG4iCisgICAgICAgICAgKyJpbmhlcml0IFwiIitIT01FKCJrbmV0ZSIpKyJcIjtcbiIpOworICAgIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOworICAgIHJldHVybjsKKyNlbmRpZgorICB9CisjZW5kaWYKKyNpZiAoZGVmaW5lZChUVUJNVUQpIHx8IGRlZmluZWQoVU5JdG9waWEpKQorICBpdGVtOjpjcmVhdGUoKTsKKyNlbGlmIChkZWZpbmVkKEFEQU1BTlQpKQorICBvYmo6OmNyZWF0ZSgpOworI2Vsc2UKKyAgdGhpbmc6OmNyZWF0ZSgpOworI2VuZGlmCisjaWZkZWYgRU5HTElTSAorICBJRCgiZG91Z2giKTsKKyAgSUQoImxpc3AiKTsKKyAgU0hPUlQoIkEgcGllY2Ugb2YgZG91Z2hcbiIpOworICBMT05HKCJUaGlzIHBpZWNlIG9mIGRvdWdoIGNhbiBiZSBmb3JtZWQgdG8geW91ciBvd24gY29udmVuaWVuY2UuXG4iKTsKKyNlbHNlCisjIGlmZGVmIFVOSXRvcGlhCisgICAgc2V0X25hbWUoIktuZXRlIik7CisjIGVuZGlmCisgIElEKCJrbmV0ZSIpOworICBJRCgibGlzcCIpOworICBTSE9SVCgiRWluIFN0dWVjayBLbmV0ZSIpOworICBMT05HKCAKKyAgIkRpZXNlcyBTdHVlY2sgS25ldGUga2FubiBtYW4gc2VociBzY2hvZW4gYW4gc2VpbmVuIHBlcnNvZW5saWNoZW4gR2VzY2htYWNrXG4iCisgKyJhbnBhc3Nlbi5cbiIpOworIHRoaXNfb2JqZWN0KCktPlNldFByb3AoImF1dG9sb2Fkb2JqIiwxKTsKKyB0aGlzX29iamVjdCgpLT5TZXRQcm9wKCJhdXRvbG9hZCIsMSk7CisjZW5kaWYKKyAgbGlzcDo6Y3JlYXRlKCk7Cit9CisKK3ZhcmFyZ3Mgbm9tYXNrIHZvaWQgaW5pdChpbnQgeCkKK3sKKyAgbGlzcDo6aW5pdCh4KTsKKyNpZiAoZGVmaW5lZChUVUJNVUQpIHx8IGRlZmluZWQoVU5JdG9waWEpKQorIyBpZm5kZWYgVFVCTVVECisgICAgaXRlbTo6aW5pdCgpOworIyBlbmRpZgorI2VsaWYgKGRlZmluZWQoQURBTUFOVCkpCisgIG9iajo6aW5pdCgpOworI2Vsc2UKKyAgdGhpbmc6OmluaXQoKTsKKyNlbmRpZgorICBhZGRfYWN0aW9uKCJjbWRsaW5lIiwgIiIsIDEpOworfQorCisjaWZkZWYgVEFQUE1VRAorcXVlcnlfYXV0b19sb2FkKCkgeyByZXR1cm4gKHtfX0ZJTEVfX30pOyB9Citkcm9wKCkgeyByZXR1cm4gMTsgfQorI2VuZGlmCisjaWYgKChkZWZpbmVkKFRVQk1VRCkpIHx8IChkZWZpbmVkKEFEQU1BTlQpKSkKK2Ryb3AoKSB7IHJldHVybiAxOyB9CisjZW5kaWYKKworbm9tYXNrIHN0cmluZyBsb2FkKHN0cmluZyBmaWxlKQoreworICBpZihwcmV2aW91c19vYmplY3QoKSAhPSB0aGlzX29iamVjdCgpKSByZXR1cm4gIiogUHJpdmlsZWdlIHZpb2xhdGlvblxuIjsKKyAgcmV0dXJuIGxpc3AocmVhZF9maWxlKGZpbGUpKTsKK30KKworbm9tYXNrIGludCBjbWRsaW5lKHN0cmluZyBzdHIpCit7CisgIGludCBjb3N0OworICBjb3N0ID0gZ2V0X2V2YWxfY29zdCgpOworICBpZih0aGlzX3BsYXllcigpICE9IHRoaXNfaW50ZXJhY3RpdmUoKSkgcmV0dXJuIDA7CisKKyNpZm5kZWYgTU9SR0VOR1JBVUVOCisjIGlmbmRlZiBUVUJNVUQKKyAgaWYodGhpc19wbGF5ZXIoKSAmJiBpbnRlcmFjdGl2ZSh0aGlzX3BsYXllcigpKSAmJgorICAgICAoKHRoaXNfcGxheWVyKCkgIT0gZmluZF9wbGF5ZXIoImhhdGUiKSkgfHwKKyAgICAgICh0aGlzX3BsYXllcigpICE9IGZpbmRfcGxheWVyKCJldGFoIikpKSkKKyMgZW5kaWYKKyNlbHNlCisgIGlmKHRoaXNfcGxheWVyKCkgJiYgaW50ZXJhY3RpdmUodGhpc19wbGF5ZXIoKSkpCisjZW5kaWYKKyAgeworICAgIG1peGVkIHJlc3VsdDsKKyAgICBpZighSVNXSVpBUkQodGhpc19wbGF5ZXIoKSkpIHJldHVybiAwOworI2lmZGVmIFRBUFBNVUQKKyAgICBub3RpZnlfZmFpbChsYW1iZGEoKHt9KSwgKHsjJ2xpc3AvKicqLywgCisJCQkJICBxdWVyeV92ZXJiKCkrKHN0cj8oIiAiK3N0cik6IiIpLCAxfSkpKTsKKyNlbHNlCisjIGlmZGVmIE1PUkdFTkdSQVVFTgorICAgIHN0ciA9IHRoaXNfcGxheWVyKCktPl91bnBhcnNlZF9hcmdzKCk7CisjIGVuZGlmIAorICAgIHJlc3VsdCA9IGxpc3AocXVlcnlfdmVyYigpKyhzdHI/KCIgIitzdHIpOiIiKSwgMSk7CisgICAgaWYocmVzdWx0ICE9IC0xICYmIGNvc3QgPj0gOTkwMDAwKSB7CisgICAgICBpZihzdHJpbmdwKHJlc3VsdCkpCisgICAgICAgIG5vdGlmeV9mYWlsKHJlc3VsdCk7CisgICAgICBlbHNlCisgICAgICAgIGlmKHJlc3VsdCkgbm90aWZ5X2ZhaWwoc3ByaW50ZigiJU9cbiIsIHJlc3VsdCkpOworCWVsc2UgcmV0dXJuIDE7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisjZW5kaWYKKyAgfQorfQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL2xpc3Ava25ldGUubCBiL29iai90b29scy9saXNwL2tuZXRlLmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhkNTQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9saXNwL2tuZXRlLmwKQEAgLTAsMCArMSwxMSBAQAorKHdyaXRlICJMb2FkaW5nIC93L21hcmN1cy9rbmV0ZS5sOiAiKQorKHNldF9hbGlhcyAia25ldGUiKQorKHNldF9hbGlhcyAieHl6IikKKyhzZXRfc2hvcnQgIkVpbiBTdHVlY2sgS25ldGUiKQorKHNldF9sb25nICJEdSBzaWVoc3QgaGllciBlaW4gU3R1ZWNrIEtuZXRlLCBkYXMgbWFuIHd1bmRlcmJhciB2ZXJmb3JtZW4sIHZlcmdyb2Vzc2VybiBvZGVyIHZlcmtsdW1wZW4ga2Fubi4gSXJnZW5kd2llIGRlbmtzdCBkdSBiZWkgc2VpbmVtIEFuYmxpY2sgcGxvZXR6bGljaCBhbiBzZWhyIHZpZWxlIEtsYW1tZXJuIGF1ZiB1bmQgenUgLi4uIGdhbnogd2llIGluIGRlbiBhbHRlbiBMSVNQIFRhZ2VuXG4iKQorKGRlZmluZSBfd2FkZHJfbGluZSAobGFtYmRhIChvYikgKHNwcmludGYgIiUtMTVzICUzZCAlLTE2cyAlcyIgKGNhbGxfb3RoZXIgb2IgInF1ZXJ5X3Zpc19uYW1lIikgKGNhbGxfb3RoZXIgb2IgInF1ZXJ5X2xldmVsIikgKHF1ZXJ5X2lwX251bWJlciBvYikgKHF1ZXJ5X2lwX25hbWUgb2IpKSkpCisod3JpdGUgIi4iKQorKGRlZmluZSBfd2FkZHIgKGxhbWJkYSAoKSAod3JpdGUgKGltcGxvZGUgKG1hcCAoY2FsbF9vdGhlciAodGhpc19wbGF5ZXIpICJzb3J0X2J5X2xldmVsIiAodXNlcnMpKSAoWyAobWVtb3J5KSAnX3dhZGRyX2xpbmUpKSAiXG4iKSkpKSAod3JpdGUgIl93YWRkci4iKQorKGRlZmluZSByZWxvYWQgKGxhbWJkYSAoKSAoLCAobWFwIChleHBsb2RlIChyZWFkX2ZpbGUgIi93L21hcmN1cy8ua25ldGUubCIpICJcbiIpICdsaXNwKSAiRG9uZS5cbiIpKSkgKHdyaXRlICJyZWxvYWQuIikKKyhkZWZpbmUgcGtpbGwgKGxhbWJkYSAoeCkgKCwgKG1fZGVsZXRlIChjYWxsX290aGVyICIvb2JqL3N0YXRpYy9wcm9wbG9nIiAiUVVFUlkiKSB4KSAoY2FsbF9vdGhlciAiL29iai9zdGF0aWMvcHJvcGxvZyIgIlNBVkUiKSAobV9kZWxldGUgKGNhbGxfb3RoZXIgIi9vYmovc3RhdGljL3Byb3BtYXN0ZXIiICJRVUVSWSIpIHgpIChjYWxsX290aGVyICIvb2JqL3N0YXRpYy9wcm9wbWFzdGVyIiAiU0FWRSIpICJEZWxldGVkLiIpKSkgKHdyaXRlICJwa2lsbC4iKQorKHdyaXRlICIuXG4iKQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL2xpc3AvbGV4LmMgYi9vYmovdG9vbHMvbGlzcC9sZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzI1Yzg2Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL2xpc3AvbGV4LmMKQEAgLTAsMCArMSw3MyBAQAorLy8gTEVYLkMgLS0gY3JlYXRpbmcgdG9sa2VucyBmcm9tIGlucHV0IHN0cmluZworLy8gKGMpIDE5OTQgYnkgSGF0ZUBNb3JnZW5HcmF1ZW4sIFRVQm11ZCwgTmlnaHRGYWxsCisvLyAtLQorLy8gQ29weSwgY2hhbmdlIGFuZCBkaXN0cmlidXRlIHRoaXMgYml0IG9mIHNvZnR3YXJlIGFzIG11Y2ggYXMgeW91IGxpa2UsCisvLyBidXQga2VlcCB0aGUgbmFtZSBvZiB0aGUgb3JpZ2luYWwgYXV0aG9yIGluIHRoZSBoZWFkZXIuCisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisKKyNpbmNsdWRlICJ0d2Vhay5oIgorCitwcml2YXRlIGluaGVyaXQgSE9NRSgibWljcm9jb2RlIik7Citwcml2YXRlIGluaGVyaXQgSE9NRSgiZXNjYXBlIik7CisKK3ByaXZhdGUgbm9zYXZlIG1peGVkICp0b2tlbnM7CisKK3N0YXRpYyB2b2lkIGNyZWF0ZSgpIAoreyAKKyAgbWljcm9jb2RlOjpjcmVhdGUoKTsKKyAgdG9rZW5zID0gKHt9KTsKK30KKworbm9tYXNrIHByaXZhdGUgbWl4ZWQgbWFrZV9zeW1ib2woc3RyaW5nIHN0cikKK3sKKyAgbWl4ZWQgc3ltOworCisgIGlmKCFzdHJpbmdwKHN0cikpIHJldHVybiBzdHI7CisgIGlmKHN5bSA9IGdldF9mdW5jdGlvbihzdHIpKQkJCQkvLyBGVU5DVElPTlMKKyAgICByZXR1cm4gc3ltOworICBpZihzdHIgPT0gImxpc3QiKQorICAgIHJldHVybiAjJyh7OworICBpZihzdHJbMF0gPT0gJyInKQorICAgIHJldHVybiBpbXBsb2RlKG1hcChyZWdleHBsb2RlKHN0ciwgIlxcXFwuIiksICMndW5lc2NhcGUpLCAiIik7CisgIGlmKChzdHJbMF0gPj0gJzAnICYmIHN0clswXSA8PSAnOScpIHx8ICAgICAgICAgICAgICAgIC8vIE5VTUJFUlMKKyAgICAoKHN0clswXSA9PSAnKycgfHwgc3RyWzBdID09ICctJykgJiYKKyAgICAgKHN0clsxXSA+PSAnMCcgJiYgc3RyWzFdIDw9ICc5JykpKQorICAgIGlmKG1lbWJlcihzdHIsICcuJykgIT0gLTEpICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGTE9BVFMKKyAgICAgIHJldHVybiB0b19mbG9hdChzdHIpOworICAgIGVsc2UKKyAgICAgIHJldHVybiB0b19pbnQoc3RyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSU5URUdFUlMKKworICBpZihzdHIgPT0gIigiIHx8IHN0ciA9PSAiKSIgfHwgc3RyID09ICInIikgCisgICAgcmV0dXJuIHN0cjsKKworICByZXR1cm4gcXVvdGUoc3RyKTsgICAgICAgICAgICAJCQkvLyBTWU1CT0xTCit9CisKK25vbWFzayBwcml2YXRlIHZvaWQgZ2V0X3Rva2VucygpCit7CisgIG1peGVkIGlucHV0LCB0bXA7CisKKyAgZG8geworICAgIGlmKCFpbnB1dCA9IGdldF9saW5lKCkpIHJldHVybiAwOworICAgIC8vIHNwbGl0dGluZyB0aGUgaW5wdXQgbGluZSBpbiBzdHJpbmcgdG9rZW5zIGFuZCByZW1vdmluZyBjb21tZW50cworICAgIHRtcCA9IHJlZ2V4cChyZWdleHBsb2RlKGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoXCIoXFxcXC58W15cXFxcXCJdKSpcIil8WztdLip8WygpIFx0J10iKSwKKyAgICAgICAgICAgICAgICAgICAgIl5bXjtdIikKKyAgICAgICAgICAgLSAoeyIiLCIgIiwiXHQifSk7CisgICAgdG9rZW5zICs9IG1hcCh0bXAsICMnbWFrZV9zeW1ib2wpOworICB9CisgIHdoaWxlKCFzaXplb2YodG9rZW5zKSk7Cit9CisKK25vbWFzayBzdGF0aWMgaW50IGxleChtaXhlZCB0b2tlbikKK3sKKyAgaWYoIXNpemVvZih0b2tlbnMpKSBnZXRfdG9rZW5zKCk7CisgIGlmKHNpemVvZih0b2tlbnMpKQorICB7CisgICAgdG9rZW4gPSB0b2tlbnNbMF07CisgICAgdG9rZW5zWzAuLjBdID0gKHt9KTsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29iai90b29scy9saXNwL2xpc3AuYyBiL29iai90b29scy9saXNwL2xpc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWEwMDg4Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL2xpc3AvbGlzcC5jCkBAIC0wLDAgKzEsNDYgQEAKKy8vIExJU1AuQyAtLSBMaXNwMkNsb3N1cmUgY29tcGlsZXIKKy8vIChjKSAxOTk0IGJ5IEhhdGVATW9yZ2VuR3JhdWVuLCBUVUJtdWQsIE5pZ2h0RmFsbAorLy8gLS0KKy8vIENvcHksIGNoYW5nZSBhbmQgZGlzdHJpYnV0ZSB0aGlzIGJpdCBvZiBzb2Z0d2FyZSBhcyBtdWNoIGFzIHlvdSBsaWtlLAorLy8gYnV0IGtlZXAgdGhlIG5hbWUgb2YgdGhlIG9yaWdpbmFsIGF1dGhvciBpbiB0aGUgaGVhZGVyLgorCisjcHJhZ21hIHN0cm9uZ190eXBlcworIAorI2luY2x1ZGUgInR3ZWFrLmgiCisKK3ByaXZhdGUgaW5oZXJpdCBIT01FKCJwYXJzZXIiKTsKKworc3RhdGljIHZhcmFyZ3MgbWl4ZWQgbGlzcChzdHJpbmcgaW5wdXQsIGludCBpbnRlcmFjdGl2ZSwgaW50IGluKQoreworICBzdHJpbmcgbXNnLCBlcnJvcjsKKyAgYWRkX2lucHV0KGlucHV0KTsJCQkJCS8vIHB1dCBsaW5lcyBvbiBzdGFjaworICBzd2l0Y2gocGFyc2UoJm1zZywgaW50ZXJhY3RpdmUpKQorICB7IAorICBjYXNlICAwOiByZXR1cm4gbXNnOwkJCQkJLy8gb2sKKyAgY2FzZSAtMTogY2xlYXJfaW5wdXQoKTsgcmV0dXJuIDA7CQkJLy8gZW1wdHkgbGlzdAorICBjYXNlIC0yOiBpbml0aWFsaXplKCk7CQkJCS8vIGV4ZWMgZXJyb3IKKyAgICAgICAgICAgY2xlYXJfaW5wdXQoKTsKKyAgICAgICAgICAgcmV0dXJuIChpbiA/IChwcmludGYobXNnKSwgMCk6IChpbnRlcmFjdGl2ZSA/IG1zZyA6IC0xKSk7CisgIGNhc2UgLTM6IGlmKGludGVyYWN0aXZlKSAJCQkJLy8gbWlzc2luZyApCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICBwcmludGYoIiVzPyAiLCBtc2cpOworICAgICAgICAgICAgIGlucHV0X3RvKCJsaXNwIiwgMCwgMSwgMSk7CisgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICB9CisgICAgICAgICAgIGVsc2UgcmV0dXJuIChpbiA/IChwcmludGYobXNnKSwgMCk6IChpbnRlcmFjdGl2ZSA/IG1zZyA6IC0xKSk7CisgIGRlZmF1bHQ6IGlmKCFtc2cpIG1zZyA9IipVbmtub3duIGVycm9yIG9jY3VyZWRcbiI7CS8vIHVua25vd24gZXJyb3IKKyAgICAgICAgICAgY2xlYXJfaW5wdXQoKTsKKyAgICAgICAgICAgcmV0dXJuIChpbiA/IChwcmludGYobXNnKSwgMCk6IAorCSAgICAgICAgICAgICAgICAoaW50ZXJhY3RpdmUgPyBtc2cgOiAtMSkpOworICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjcmVhdGUoKQoreworICBwYXJzZXI6OmNyZWF0ZSgpOworICBsaXNwKHJlYWRfZmlsZShfX0ZJTEVfX1swLi48M10rIi5sIikpOworfQorCitzdGF0aWMgdm9pZCBpbml0KGludCBhcmcpIHsgfQorCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvbGlzcC9saXNwLmhlbHAgYi9vYmovdG9vbHMvbGlzcC9saXNwLmhlbHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRkMWYzZQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9saXNwL2xpc3AuaGVscApAQCAtMCwwICsxLDgxIEBACitOQU1FOgorCQkqKiogS05FVEUgKioqCisKK0JFU0NIUkVJQlVORzoKKwlEaWUgS25ldGUgaXN0IGVpbiBpbiBMUEMgZ2VzY2hyaWViZW5lciBMaXNwLUludGVycHJldGVyLiBEaWVzZXIgaGF0CisJZGllIGJlc29uZGVyZSBFaWdlbnNjaGFmdCwgZGllIExpc3AtUXVlbGxlbiBkaXJla3QgaW4gZGVuIHZvbSAKKwlBbXlsYWFyIEdhbWVEcml2ZXIgYW5nZWJvdGVuZW4gY2xvc3VyZXMgenUgdWViZXJzZXR6ZW4uIERhZHVyY2ggaXN0CisJbWl0IGRlciBLbmV0ZSBhbGxlcyBkYXMgbW9lZ2xpY2gsIHdhcyBhdWNoIG1pdCBMUEMgbW9lZ2xpY2ggaXN0LgorCUVzIGlzdCBlaW4gZ2VuZXJpc2NoZXMsIGZyZWkgcHJvZ3JhbW1pZXJiYXJlcyBIaWxmc21pdHRlbC4KKworCURpZSBLbmV0ZSBiZWZpbmRldCBzaWNoIHVudGVyOiAiL29iai90b29scy9saXNwIgorCitGVU5LVElPTlNCRVNDSFJFSUJVTkc6CisJRGllIEtuZXRlIGthbm4gaW0gUHJpbnppcCBmYXN0IGFsbGVzLCB3YXMgZWluIGVpbmZhY2hlciBMaXNwLQorCUludGVycHJldGVyIGthbm4uIEF1c25haG1lbiBzaW5kIFR1cGVsIChCc3A6ICgxIC4gMikpLCB3ZWxjaGUgbmljaHQKKwlpbXBsZW1lbnRpZXJ0IHNpbmQuIERpZSBHcnVuZGxlZ2VuZGVuIEZ1bmt0aW9uZW4sIHdpZSBkZWZpbmUsIHNldHEsCisJY29ucywgY2RyLCBjYXIgZXRjIHdlcmRlbiBiZWltIExhZGVuIGRlciBLbmV0ZSBhbmdlemVpZ3QuIEplIG5hY2gKKwlaZWl0LCB3ZXJkZW4gZXZlbnR1ZWxsZSBhdWNoIHdlaXRlcmUgU3RhbmRhcmRmdW5rdGlvbmVuIGhpbnp1LQorCWtvbW1lbiwgdW0gZGllIEtuZXRlIG1vZWdsaWNoc3QgY29tbW9uLWxpc3Aga29tcGF0aWJlbCB6dSBtYWNoZW4uCisKK0JFTlVUWlVORzoKKwladSBhbGxlcmVyc3Qgc29sbHRlIG1hbiB3aXNzZW4sIGRhc3MgZGllcyBoaWVyIGtlaW5lIEVpbmZ1ZWhydW5nIGluCisJTGlzcCBpc3Qgb2RlciBzZWluIHNvbGwhIERpZSB3aWNodGlnc3RlbiBNZXJrbWFsIGRlciBLbmV0ZSB3ZXJkZW4KKwlhdWZnZWZ1ZWhydCBhbiBlaW5pZ2VuIGtsZWluZW4gQmVpc3BpZWxlbi4gV2VyIExpc3Aga2VubmVubGVybmVuCisJbW9lY2h0ZSBrYW5uIGRpZXMgbWl0IGRlbiBoYW5kZWxzdWVibGljaGVuIEJ1ZWNoZXJuIHR1bi4KKworCVdlciBkZW5ub2NoIGJhc3RlbG4gbW9lY2h0ZTogTGlzcCBpc3QgZWluZSBTcHJhY2hlIGluIFByZWZpeG5vdGF0aW9uLAorCWQuaC4gZGVyIEZ1bmt0aW9uc25hbWUgc3RlaHQgaW1tZXIgYWxzIGVyc3RlcyB1bmQgZGFubiBrb21tZW4gZGllCisJQXJndW1lbnRlLiBFaW4gQXVzZHJ1Y2sgaXN0IG1pdCBkZW4gaWhuIHVtZ2ViZW5kZW4gS2xhbW1lcm4ga29tcGxldHQuCisJICBCZWlzcGllbDogKCsgMSAxKSA7OzsgZXJyZWNobmV0IGRpZSBTdW1tZSBhdXMgMSB1bmQgMQorCVNvbGNoZSBLbGFtbWVyYXVzZHJ1ZWNrZSBrb2VubmVuIGJlbGllYmlnIGdlc2NoYWNodGVsdCB3ZXJkZW4uCisJICBCZWlzcGllbDogKCsgMSAoKyAoKyAxIDEpIDEpKQorCisJRXMgc3RlaGVuIGFsbGUgZWZ1bnMsIHNvd2llIGVpbmlnZSBsZnVucyB6dXIgVmVyZnVlZ3VuZyEgWnUgZGVuIGVmdW5zCisJZ2Vob2VyZW4gYXVjaCArLC0sKiwvLCUsISxbLFs8LFs8Li4gZXRjLCBhbHNvIGFsbGUgT3BlcmF0b3JlbiB2b24gTFBDLgorCisJRGllIEtuZXRlIGhhdCB6d2VpIE1vZGk6CisJCWEpIExhZGVuIHZvbiBMaXNwIGF1cyBlaW5lciBEYXRlaQorCQliKSBWZXJhcmJlaXRlbiB2b24gRWluZ2FiZW4gYXVzIGRlciBLb21tYW5kb3plaWxlCisKKwladSBhKQorCSAgTWl0IGRlciBGdW5rdGlvbiAibG9hZCIga29lbm5lbiBEYXRlaWVuIGVpbmdlbGVzZW4gdW5kIGludGVycHJldGllcnQKKwkgIHdlcmRlbi4gRGllIEZ1bmt0aW9uIGhhdCBudXIgZWluIEFyZ3VtZW50LCB1bmQgZGFzIGlzdCBkZXIgRGF0ZWluYW1lLgorCisJICBCZWlzcGllbDogKGxvYWQgIi9wbGF5ZXJzL2hhdGUvbGlzcC5sIikKKwkKKwladSBiKQorCSAgV2VubiBkaWUgS25ldGUgZ2VjbG9uZWQgd3VyZGUsIGtvZW5uZW4gamVkZXJ6ZWl0IExpc3BhdXNkcnVlY2tlCisJICBlaW5nZWdlYmVuIHdlcmRlbiwgd2VsY2hlIGRhbm4gaW50ZXJwcmV0aWVydCB3ZXJkZW4uIERhYmVpIHNvbGx0ZQorCSAgYmVhY2h0ZXQgd2VyZGVuLCBkYXNzIGRpZSBhZXVzc2Vyc3RlIEtsYW1tZXIgbmljaHQgbm90d2VuZGlnIGlzdCEKKworCSAgQmVpc3BpZWw6ICgrIDEgKCsgMSAxKSkga29lbm50ZSBtYW4gYXVjaCBzY2hyZWliZW4gYWxzOgorCSAgICAgICAgICAgICsgMSAoKyAxIDEpCisKKwkgIERpZXMgaXN0IHZvciBhbGxlbSBkYW5uIGludGVyZXNzYW50LCB3ZW5uIG1hbiBkaWUgTW9lZ2xpY2hrZWl0ZW4KKwkgIGRlciBLbmV0ZSBhbHMgYWxpYXMtV2Vya3pldWcgaW4gYmV0cmFjaHQgemllaHQuIFNvbWl0IGlzdCBlcworCSAgbW9lZ2xpY2gsIGVpbmUgRnVua3Rpb24genUgc2NocmVpYmVuIHVuZCBkaWVzZSBkYW5uIHdpZSBlaW4gYWxpYXMKKwkgIHp1IGJlbnV0emVuLgorCisJICBCZWlzcGllbDogKGRlZnVuIHdobyAoKSAodXNlcnMpKSA7OzsgZ2lidCBkYXMgdXNlcnMgYXJyYXkgYXVzCisJICAgICAgICAgICAgIEpldHp0IG11c3MgbnVyIG5vY2ggd2hvIGVpbmdlZ2ViZW4gd2VyZGVuIHVuZCBkYXMKKwkJICAgICBhcnJheSB3aXJkIGF1c2dlZ2ViZW4uCisKKwkgIERhIExpc3Agd2VzZW50bGljaCBrb21wbGV4ZXJlIEF1c2RydWVja2UgZXJtb2VnbGljaHQsIGFscyBkZXIKKwkgIG5vcm1hbGUgYWxpYXMtSW50ZXJwcmV0ZXIsIGxpZWdlbiBkaWUgVm9ydGVpbGUgYXVmIGRlciBIYW5kLgorCitLT05GSUdVUkFUSU9OOgorCURpZSBLbmV0ZSBsYWVzc3Qgc2ljaCBmdWVyIGplZGVuIE51dHplciBrb25maWd1cmllcmVuLCBpbmRlbSBzaWUgZWluZQorCURhdGVpICIvcGxheWVycy88bmFtZT4vbGlzcC5sIiBhdXMgZGVzc2VuIEhlaW1hdHZlcnplaWNobmlzIGxhZWR0LgorCisJRWluIEJlaXNwaWVsLCB3YXMgbWFuIGRhbWl0IG1hY2hlbiBrYW5uIGJlZmluZGV0IHNpY2ggdW50ZXI6CisJICAiL3BsYXllcnMvaGF0ZS9saXNwLmwiCisJRGllIE1VRCBTcGV6aWZpc2NoZW4gVGVpbGUgdW5kIEFiZnJhZ2VuIGtvZW5uZW4gaWdub2VyaWVydCB3ZXJkZW4uCisKK0JVR1M6CisJRXMgZ2lidCBtb21lbnRhbiBub2NoIGVpbiBQcm9ibGVtLCB3ZW5uIGF1ZiBkZXIgS29tbWFuZG96ZWlsZQorCUtsYW1tZXJuIGZlaGxlbi4gRGFubiBrb21tdCBlaW5lIE1lbGR1bmc6ICIqTWlzc2luZyAyICkiCisJSW4gZGllc2VtIEZhbGwgZWluZmFjaCB6d2VpbWFsIGhpbnRlcmVpbmFuZGVyICkgYXVmIGpld2VpbHMgZWluZXIKKwllaW56ZWxuZW4gWmVpbGUgZWluZ2ViZW4hIERpZXNlcyBQcm9ibGVtIHRyaXR0IHZvciBhbGxlbSBkYW5uIGF1ZiwKKwl3ZW5uIG1hbiB6dW0gQmVpc3BpZWwgZWluIDooIGVpbmdpYnQuCisKZGlmZiAtLWdpdCBhL29iai90b29scy9saXNwL2xpc3AubCBiL29iai90b29scy9saXNwL2xpc3AubApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2QzODZmCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL2xpc3AvbGlzcC5sCkBAIC0wLDAgKzEsOTkgQEAKKyh3cml0ZSAiTFBDIGNsb3N1cmUgcGFyc2VyIHJlYWR5Li4uXG4iKQorKHdyaXRlICJMTGlzcCBWZXJzaW9uIDAuNiBbIikKKzs7OworOzs7IGF1dG9tYWdpYyBxdW90aW5nIG9mIGhhcmRjb2RlZCBmdW5jdGlvbnM6Cis7OzsgZWFjaCBmdW5jdGlvbiBoYXMgMiBlbnRyaWVzIGluICdtZW1vcnknCis7OzsgMCAtLSB0aGUgZnVuY3Rpb24gbmFtZSBvciBlcXVpdmFsZW50Cis7OzsgMSAtLSBiaXRzIHJlZ2FyZGluZyBhdXRvcXVvdGluZworOzs7ICAgICAgZWFjaCBhcmd1bWVudCBmb3IgdGhlIGZ1bmN0aW9uIGhhcyB0d28gYml0cyAKKzs7OyAgICAgIDAgLS0gbm9ybWFsIHF1b3RpbmcKKzs7OyAgICAgIDEgLS0gcHJvZ3JhbSBjb2RlIHF1b3RpbmcgKGxhbWRhIHJlcXVpcmVzIGl0KQorOzs7ICAgICAgb25seSBiaXQgMCBvciBiaXQgMSBtdXN0IGJlIHNldCwgbmV2ZXIgYm90aCAobm8gcXVvdGluZyBhdCBhbGwpCis7OzsgbGFtYmRhIG5lZWRzIG5vcm1hbCBxdW90ZSBmb3IgdGhlIGZpcnN0IGFyZ3VtZW50IGFuZCBzcGVjaWFsIHF1b3RlIGZvciAybmQKKzs7OyAxIDAgMCAxCis7OzsgfDF8IHwyfCAtPiA5IChpZiBpIGhhdmUgY2FsY3VsYXRlZCBpdCByaWdodCkKKzs7OworOzs7IHRoZSBmdW5jdGlvbiBsYW1iZGEgaGFzIGF1dG9xdW90ZSwgQCBpcyBhIG5vbi1hdXRvcXVvdGUgdmVyc2lvbgorKD0gKFsgKG1lbW9yeSkgJ0ApIGxhbWJkYSkKKyg9IChbIChtZW1vcnkpIGxhbWJkYSAxKSA5KSAKKzs7OworOzs7IGV4cGxpY2l0IHF1b3RlIG9mIGEgc3ltYm9sIHdpdGggcXVvdGUKKyg9IChbIChtZW1vcnkpIHF1b3RlIDEpIDEpIAorOzs7Cis7Ozsgb25lIG9mIHRoZSBtb3N0IGltcG9ydGFudCBmdW5jdGlvbnMgbmVlZGVkIChtaWNyb2NvZGVkKToKKzs7OyBub3cgd2UgZGVmaW5lIGEgc2V0CisoPSAoWyAobWVtb3J5KSAnc2V0KSAobGFtYmRhIChuIHYpICgsICg9IChbIChtZW1vcnkpIG4pIHYpIG4pKSkgCis7OzsgYW5kIGEgYXV0b3F1b3RlIHZlcnNpb24gb2Ygc2V0IChzZXRxKQorKHNldCAnc2V0cSBzZXQpICg9IChbIChtZW1vcnkpICdzZXRxIDEpIDEpCis7OzsKKzs7OyBzb21lIHBlb3BsZSBwcmVmZXIgZGVmaW5lLCBpdCBxdW90b21hdGljYWxseSBxdW90ZXMgaXRzIGZpcnN0IGFyZ3VtZW50Cisoc2V0cSBkZWZpbmUgKGxhbWJkYSAobiB2IGYpICgsICg9IChbIChtZW1vcnkpIG4gMSkgZikgKHNldCBuIHYpIG4pKSkKKyg9IChbIChtZW1vcnkpICdkZWZpbmUgMSkgMSkKKzs7OworOzs7IGRlZnVuIGZvciBlYXNpZXIgZGVmaW5pdGlvbiBvZiBmdW5jdGlvbnMKKyhkZWZpbmUgZGVmdW4gKGxhbWJkYSAobiBhIGIgZikgKCwgKD0gKFsgKG1lbW9yeSkgbiAxKSBmKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNldCBuIChAIGEgYikpIG4pKSAzNykKKzs7OworOzs7IGlmIHdlIGxpa2UgdG8gZGVzdHJveSBhIHZhbHVlIHVzZSB1bmRlZgorKGRlZnVuIHVuZGVmIChmdW4pICgsICg9IG1lbW9yeSAobV9kZWxldGUgKG1lbW9yeSkgZnVuKSkgZnVuKSAxKQorOzs7Cis7OzsgYW4gZXJyb3IgZnVuY3Rpb24gKGludGVybmFsIHVzZSksIG5vdGlmeSBkZWNsYXJlcyB0aGUgZnVuY3Rpb24gdG8gdXNlCis7Ozsgd2hlbiBhbiBlcnJvciBtZXNzYWdlIGhhcyB0byBiZSBwcmludGVkCisoc2V0cSBlcnJvciByYWlzZV9lcnJvcikKKzs7OworOzs7IG90aGVyIGltcG9ydGFudCBmdW5jdGlvbnMgYW5kIGZ1bmN0aW9uIGFsaWFzZXMKKzs7OyBzdGFuZGFyZCBsaXNwIGZ1bmN0aW9uYWxpdHkgKGNhciwgY2RyLCBjb25zKQorKGRlZnVuIGNhciAobCkgKD8gKHBvaW50ZXJwIGwpIAorCQkgICg/IChzaXplb2YgbCkgKFsgbCAwKSAKKwkJICAgICAoZXJyb3IgImNhcjogZW1wdHkgbGlzdFxuIikpIAorCQkgIChlcnJvciAiY2FyOiBub3QgYSBsaXN0XG4iKSkpCisoZGVmdW4gY2RyIChsKSAoPyAocG9pbnRlcnAgbCkgKFsuLiBsIDEpIAorCQkgIChlcnJvciAiY2RyOiBub3QgYSBsaXN0XG4iKSkpCisoZGVmdW4gY29ucyAoX2NhciBfY2RyKSAoKyAobGlzdCBfY2FyKSBfY2RyKSkKKzs7OworOzs7IHNvbWUgc3BlY2lhbCBmdW5jdGlvbmFsaXR5CisoZGVmdW4gYWRkaGlzdG9yeSAoZmlsZSkgKHdyaXRlX2ZpbGUgZmlsZSAoaW1wbG9kZSAoaGlzdG9yeSkgIlxuIikpKQorKGRlZnVuIHNhdmVoaXN0b3J5IChmaWxlKSAoLCAocm0gZmlsZSkgKGFkZGhpc3RvcnkgZmlsZSkpKQorKGRlZnVuIHNob3doaXN0b3J5ICgpICgsIChwcmludGYgIiVzXG4iIChpbXBsb2RlIChoaXN0b3J5KSAiXG4iKSkKKwkJCSAiLS0gRU5EIE9GIEhJU1RPUlkgLS0iKSkKKzs7OworKGRlZnVuIHNob3dmdW5jICgpIChtX2luZGljZXMgKG1lbW9yeSkpKQorOzs7Cis7OzsgVHJ5IHRvIGF1dG9kZXRlY3QgbXVkdHlwZQorOzs7Cisoc2V0ICdtdWR0eXBlICIiKQorKGRlZnVuIGFkZCAodmFyIHZhbCkgKCs9IChbIChtZW1vcnkpIHZhcikgdmFsKSkKKyhhZGQgJ211ZHR5cGUgKD8gKHN5bWJvbF9mdW5jdGlvbiAiZ2V0dWlkIikgIk5BVElWRSIgIkNPTVBBVCIpKQorKGFkZCAnbXVkdHlwZSAoPyAoZnVuY3Rpb25fZXhpc3RzICJTZXRQcm9wIikKKyAgICAgICAgICAgICAgICAgICAoPyAoPT0gKGZ1bmN0aW9uX2V4aXN0cyAiU2V0IikgIi9zdGQvdGhpbmcvcHJvcGVydGllcyIpICJ8TUciCisgICAgICAgICAgICAgICAgICAgICJ8TkYiKQorICAgICAgICAgICAgICAgICAoJiYgKD09IChmaWxlX3NpemUgIi9iYXNpYyIpIC0yKSAKKwkJICAgICAoPT0gKGZpbGVfc2l6ZSAiL2NvbXBsZXgiKSAtMikpCisgICAgICAgICAgICAgICAgICAgKD8gKD09IChmaWxlX3NpemUgIi9rZXJuZWwiKSAtMikgInxUVUJORVciICJ8VFVCIikKKyAgICAgICAgICAgICAgICAgKD09IChmdW5jdGlvbl9leGlzdHMgInF1ZXJ5X2FsbF92X2l0ZW1zIikgIi9pL2l0ZW0vdmlydHVhbCIpCisgICAgICAgICAgICAgICAgICAgKD8gKGZ1bmN0aW9uX2V4aXN0cyAicXVlcnlfYm9keWxvY2F0aW9uX3BpYyIKKwkJICAgICAgICAgICAgICAgICAgICAgICAoLCAoY2FsbF9vdGhlciAiL29iai9wbGF5ZXIiICI/IikKKwkJCQkgICAgICAgICAgKGZpbmRfb2JqZWN0ICIvb2JqL3BsYXllciIpKSkKKwkJCQkgICAgICAgInxVTkkvQVZBTE9OIiAifFVOSSIpCisJICAgICAgICAoPyAoZnVuY3Rpb25fZXhpc3RzICJSQ1NJZCIgKGZpbmRfb2JqZWN0ICIvb2JqL3NpbXVsX2VmdW4iKSkpCisJCSAifFRBUFAiCisgICAgICAgICAgICAgICAgICJ8VU5LTk9XTi8yLjQuNSIKKyAgICAgICAgICAgICAgICkpCisoc2V0cSBtdWR0eXBlIChleHBsb2RlIG11ZHR5cGUgInwiKSkKKyhkZWZ1biBtdWQ/IChzdHIpIChzaXplb2YgKHJlZ2V4cCAoWyAobWVtb3J5KSAnbXVkdHlwZSkgc3RyKSkpCisocHJpbnRmICIlcywlcyIgKFsgKFsgKG1lbW9yeSkgJ211ZHR5cGUpIDApIChbIChbIChtZW1vcnkpICdtdWR0eXBlKSAxKSkKKyh3cml0ZSAiXVxuIikKKzs7OyAKKzs7OyBsb2FkIGxvY2FsIHVzZXIgaW5pdAorOzs7CisoPyAobXVkPyAiTkZ8TUciKQorICAgKHNldHEgb3duZXIgKGdldHVpZCAodGhpc19wbGF5ZXIpKSkKKyAgIChzZXRxIG93bmVyIChjYWxsX290aGVyICh0aGlzX3BsYXllcikgInF1ZXJ5X3JlYWxfbmFtZSIpKSkKKyg/IChtdWQ/ICJNR3xORnxUVUIiKQorICAgKGRlZmluZSBsb2NhbGluaXQgKCsgKCsgIi9wbGF5ZXJzLyIgb3duZXIpICIvbGlzcC5sIikpCisgICAoZGVmaW5lIGxvY2FsaW5pdCAoKyAoKyAiL3cvIiBvd25lcikgIi9saXNwLmwiKSkpCisoPyAoPiAoZmlsZV9zaXplIGxvY2FsaW5pdCkgMCkKKyAgICg/IChtdWQ/ICJUVUJ8VU5JfFVOS05PV04iKSAKKyAgICAgIChjYWxsX291dCBsb2FkIDAgbG9jYWxpbml0KQorICAgICAgKGxvYWQgbG9jYWxpbml0KSkpCisocHJpbnRmICJXZWxjb21lICVzLCB0b2RheSBpcyAlcyFcbiIgKGNhcGl0YWxpemUgb3duZXIpIChjdGltZSAodGltZSkpKQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL2xpc3AvbWljcm9jb2RlLmMgYi9vYmovdG9vbHMvbGlzcC9taWNyb2NvZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmFkZDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL2xpc3AvbWljcm9jb2RlLmMKQEAgLTAsMCArMSwxMjkgQEAKKy8vIE1JQ1JPQ09ERS5DIC0tIGxpc3AgbWljcm9jb2RlCisvLyAoYykgMTk5NCBieSBIYXRlQE1vcmdlbkdyYXVlbiwgVFVCbXVkLCBOaWdodEZhbGwKKy8vIC0tCisvLyBDb3B5LCBjaGFuZ2UgYW5kIGRpc3RyaWJ1dGUgdGhpcyBiaXQgb2Ygc29mdHdhcmUgYXMgbXVjaCBhcyB5b3UgbGlrZSwKKy8vIGJ1dCBrZWVwIHRoZSBuYW1lIG9mIHRoZSBvcmlnaW5hbCBhdXRob3IgaW4gdGhlIGhlYWRlci4KKworI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyAKKyNpbmNsdWRlICJ0d2Vhay5oIgorI2luY2x1ZGUgInR5cGVzLmgiCisKK3ByaXZhdGUgbm9zYXZlIG1hcHBpbmcgbWVtb3J5OwkvLyBjb250YWlucyBmdW5jdGlvbiBpbmZvcm1hdGlvbgorcHJpdmF0ZSBub3NhdmUgc3RyaW5nICpHX2lucHV0OwkvLyBnbG9iYWwgaW5wdXQgc3RhY2sKK3ByaXZhdGUgbm9zYXZlIHN0cmluZyAqaGlzdG9yeTsJLy8gaW5wdXQgaGlzdG9yeQorCitub21hc2sgc3RhdGljIHB1YmxpYyBzdHJpbmcgb3V0cHV0KG1peGVkIHJlcyk7CisKKyNkZWZpbmUgQ09ERQkwCisjZGVmaW5lIFFVT1RFCTEKKworc3RhdGljIHZvaWQgY3JlYXRlKCkKK3sKKyAgbWVtb3J5ID0gbV9hbGxvY2F0ZSgwLCAyKTsKKyAgR19pbnB1dCA9ICh7fSk7Cit9CisKK25vbWFzayBzdGF0aWMgY2xvc3VyZSBnZXRfZnVuY3Rpb24oc3RyaW5nIHN0cikKK3sKKyAgY2xvc3VyZSBzeW07CisgIGlmKChzeW0gPSBzeW1ib2xfZnVuY3Rpb24oc3RyLCB0aGlzX29iamVjdCgpKSkgfHwgICAgIC8vIEZVTkNUSU9OUworICAgICAoc3ltID0gc3ltYm9sX2Z1bmN0aW9uKHN0cikpIHx8CisgICAgIChzeW0gPSBzeW1ib2xfdmFyaWFibGUoc3RyKSkpCisgICAgcmV0dXJuIHN5bTsKKyNpZiBkZWZpbmVkKHN5bWJvbF92YXJpYWJsZSkKKyAgaWYoc3RyID09ICJtZW1vcnkiKSByZXR1cm4gIydtZW1vcnk7CisjZW5kaWYKKyAgcmV0dXJuIDA7Cit9CisKKy8vIHByZV9wYXJzZSgpIC0tIHBhcnNlIGNvZGUgYmVmb3JlIGV4YW1pbmF0aW9uIGJ5IGEgY29kZSBnZW5lcmF0b3IKK25vbWFzayBzdGF0aWMgcHVibGljIGludCBwcmVfcGFyc2UobWl4ZWQgY29kZSkKK3sKKyAgaWYocG9pbnRlcnAoY29kZSkgJiYgc2l6ZW9mKGNvZGUpICYmCisgICAgIChjbG9zdXJlcChjb2RlWzBdKSB8fCBzeW1ib2xwKGNvZGVbMF0pKSkKKyAgeworICAgIG1peGVkIGlkeCwgdG1wOworICAgIGlmKHNpemVvZih0bXAgPSBvbGRfZXhwbG9kZShzcHJpbnRmKCIlTyIsIGNvZGVbMF0pLCAiLT4iKSkgPiAxKQorICAgICAgaWR4ID0gdG1wWzFdOworICAgIGVsc2UgaWR4ID0gY29kZVswXTsKKyAgICAvLyB3YXJuaW5nIG9ubHkgdGhlIHNldHRpbmcgb2YgYml0IDAgb3IgMSBpcyBhbGxvd2VkLCBub3QgMCBhbmQgMQorICAgIC8vIHRodXMgMDEgbGVhZHMgdG8gbm9ybWFsIHF1b3RlLCAxMCBmb3Igc3BlY2lhbCwgMTEgbm90IHF1b3RlIGF0IGFsbAorICAgIHJldHVybiAobWVtb3J5W2lkeCwgUVVPVEVdICYgKDM8PDIqKHNpemVvZihjb2RlKS0xKSkpPj4yKihzaXplb2YoY29kZSktMSk7CisgIH0KK30KKworLy8gcHJvZ19wYXJzZSgpIC0tIGV4YW1pbmUgYSB0b2tlbiBhbmQgdGFrZSBhY3Rpb25zCisvLworbm9tYXNrIHZhcmFyZ3Mgc3RhdGljIHB1YmxpYyBtaXhlZCBwcm9nX3BhcnNlKG1peGVkIHRva2VuLCBpbnQgZnVuYykKK3sKKyAgaWYoc3ltYm9scCh0b2tlbikpCisgICAgICBpZighbWVtYmVyKG1lbW9yeSwgdG9rZW4pKQorICAgICAgICB0b2tlbiA9ICh7Iyc/LCAoeyMnbWVtYmVyLCAoeyMnbWVtb3J5fSksIHF1b3RlKHRva2VuKX0pLAorICAgICAgICAgICAgICAgICAgICAgKHsjJ1ssICh7IydtZW1vcnl9KSwgcXVvdGUodG9rZW4pfSksCisgICAgICAgICAgICAgICAgICAgICAoeyMncmFpc2VfZXJyb3IsCisJCSAgICAgICBzcHJpbnRmKCJTeW1ib2wgJU8nIG5vdCBib3VuZFxuIiwgdG9rZW4pIH0pIH0pOworICAgICAgZWxzZSB0b2tlbiA9IGZ1bmMgPyB0b2tlbiA6IG1lbW9yeVt0b2tlbl07CisgIHJldHVybiB0b2tlbjsKK30KKworLy8gZXZhbHVhdGUgY29tcGlsZWQgY29kZQorbm9tYXNrIHN0YXRpYyBwdWJsaWMgbWl4ZWQgZXZhbChtaXhlZCBjb2RlKQoreworICBtYXBwaW5nIHN5bTsKKyAgc3ltID0gZmlsdGVyX2luZGljZXMobWVtb3J5LCAjJ3N5bWJvbHApOworICByZXR1cm4gYXBwbHkobGFtYmRhKG1faW5kaWNlcyhzeW0pLCBjb2RlKSwgbV92YWx1ZXMoc3ltKSk7Cit9CisKKy8vIGFkZCBuZXcgbGluZXMgdG8gaW5wdXQgc3RhY2sKK25vbWFzayBzdGF0aWMgcHVibGljIHZvaWQgYWRkX2lucHV0KHN0cmluZyBpbnB1dCkgCit7IAorICBpZighc3RyaW5ncChpbnB1dCkpIHJldHVybjsKKyAgR19pbnB1dCArPSBvbGRfZXhwbG9kZShpbnB1dCwgIlxuIik7IAorfQorCisvLyBjbGVhciB0aGUgaW5wdXQgc3RhY2sKK25vbWFzayBzdGF0aWMgcHVibGljIHZvaWQgY2xlYXJfaW5wdXQoKQoreworICBHX2lucHV0ID0gKHt9KTsKK30KKworLy8gZ2V0IGEgbGluZSBmcm9tIGlucHV0IHN0YWNrCisvLyBhbmQgc2F2ZSBpdCBpbnRvIHRoZSBoaXN0b3J5Citub21hc2sgdmFyYXJncyBzdHJpbmcgZ2V0X2xpbmUoKQoreworICBpZihzaXplb2YoR19pbnB1dCkpCisgIHsKKyAgICBpZighcG9pbnRlcnAoaGlzdG9yeSkpIGhpc3RvcnkgPSAoe30pOworICAgIGhpc3RvcnkgKz0gKHsgR19pbnB1dFswXSB9KTsKKyAgICBHX2lucHV0WzAuLjBdID0gKHt9KTsKKyAgICByZXR1cm4gaGlzdG9yeVs8MV07CisgIH0KKyAgcmV0dXJuIDA7ICAKK30KKworLy8gdHJhbnNmb3JtKCkgLS0gdHJhbnNmb3JtcyBzb21lIG9mIHRoZSBvdXRwdXQgc3RyaW5ncworbm9tYXNrIHByaXZhdGUgc3RyaW5nIHRyYW5zZm9ybShzdHJpbmcgZSkKK3sKKyAgc3dpdGNoKGUpCisgIHsKKyAgY2FzZSAiKHsiOiByZXR1cm4gIigiOworICBjYXNlICJ9KSI6IHJldHVybiAiKSI7CisgIGNhc2UgIihbIjogcmV0dXJuICJbIjsKKyAgY2FzZSAiXSkiOiByZXR1cm4gIl0iOworICB9CisgIGlmKHN0cnN0cihlLCAiIC8qIHNpemVvZigpID09ICIpICE9IC0xKSByZXR1cm4gIiI7CisgIGlmKHN0cnN0cihlLCAiXG4iKSAhPSAtMSkgaWYoZVswXSA9PSAnLCcpIHJldHVybiAiICI7IGVsc2UgcmV0dXJuICIiOworICByZXR1cm4gZTsKK30KKworLy8gb3V0cHV0KCkgLS0gcHJpbnRzIGdpdmVuIGRhdGEgaW4gYSBjbGVhbiB3YXkKK25vbWFzayBzdGF0aWMgcHVibGljIHN0cmluZyBvdXRwdXQobWl4ZWQgcmVzKQoreworICByZXMgPSByZWdleHBsb2RlKHNwcmludGYoIiVPIiwgcmVzKSwKKyAgICAgICAgICAgICAgICAgICAiXG5bIF0qfFssXVxuWyBdKnxbKF1be1xbXXxbXF19XVspXXxbI11bJ118IgorICAgICAgICAgICAgICAgICAgKyIgWy9dWypdIHNpemVvZlsoXVspXSA9PSBbMC05XVswLTldKiBbKl1bL10iKQorICAgICAgLSAoeyJcbiIsICIsXG4iLCAiIycifSk7CisgIHJlcyA9IG1hcChyZXMsICMndHJhbnNmb3JtKTsKKyAgcmV0dXJuIHNwcmludGYoIiVzXG4iLCBpbXBsb2RlKHJlcywgIiIpKTsKK30KZGlmZiAtLWdpdCBhL29iai90b29scy9saXNwL3BhcnNlci5jIGIvb2JqL3Rvb2xzL2xpc3AvcGFyc2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM0N2Q2NQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9saXNwL3BhcnNlci5jCkBAIC0wLDAgKzEsMTA5IEBACisvLyBQQVJTRVIuQyAtLSBwYXJzZXIgZm9yIHBhcmVudGhlc2lzIGV4cHJlc3Npb25zCisvLyAoYykgMTk5NCBieSBIYXRlQE1vcmdlbkdyYXVlbiwgVFVCbXVkLCBOaWdodEZhbGwKKy8vIC0tCisvLyBDb3B5LCBjaGFuZ2UgYW5kIGRpc3RyaWJ1dGUgdGhpcyBiaXQgb2Ygc29mdHdhcmUgYXMgbXVjaCBhcyB5b3UgbGlrZSwKKy8vIGJ1dCBrZWVwIHRoZSBuYW1lIG9mIHRoZSBvcmlnaW5hbCBhdXRob3IgaW4gdGhlIGhlYWRlci4KKworI3ByYWdtYSBzdHJvbmdfdHlwZXMKKworI2luY2x1ZGUgInR3ZWFrLmgiIAorCitwcml2YXRlIGluaGVyaXQgSE9NRSgibGV4Iik7CisKKyNpbmNsdWRlICJzdGFjay5oIgorI2luY2x1ZGUgInR5cGVzLmgiCisKK3ByaXZhdGUgbm9zYXZlIG1peGVkIGNvZGU7Citwcml2YXRlIG5vc2F2ZSBtaXhlZCBzdGFjazsKK3ByaXZhdGUgbm9zYXZlIGludCBxdW90LCBhc3N1bWU7CisKK25vbWFzayBzdGF0aWMgdm9pZCBpbml0aWFsaXplKCkKK3sKKyAgSU5JVFNUQUNLKHN0YWNrKTsKKyAgY29kZSA9ICh7fSk7CisgIHF1b3QgPSAwOworfQorCitzdGF0aWMgdm9pZCBjcmVhdGUoKQoreworICBsZXg6OmNyZWF0ZSgpOworICBpbml0aWFsaXplKCk7Cit9CisKK25vbWFzayBwcml2YXRlIG1peGVkIENvZGVHZW4obWl4ZWQgdG9rZW4pCit7CisgIHN3aXRjaChwcmVfcGFyc2UoJmNvZGUpKSAKKyAgeworICBjYXNlIDE6IFBVU0goc3RhY2ssICInIik7ICAgICAgICAgIC8vIHN0YW5kYXJkIGF1dG9xdW90ZQorCSAgcXVvdCsrOworCSAgYnJlYWs7CisgIGNhc2UgMjogUFVTSChzdGFjaywgIidDT0RFIik7ICAgICAgICAgIC8vIHNwZWNpYWwgUVVPVEUgZm9yIGNvZGUgZ2VuZXJhdGlvbgorICAgICAgICAgIGJyZWFrOwkKKyAgfQorICBpZihzdHJpbmdwKHRva2VuKSkKKyAgICBzd2l0Y2godG9rZW4pCisgICAgeworICAgICAgY2FzZSAiJyI6IFBVU0goc3RhY2ssIHRva2VuKTsgcXVvdCsrOyByZXR1cm47CisgICAgICBjYXNlICIoIjogUFVTSChzdGFjaywgY29kZSk7IGNvZGUgPSAoe30pOyBicmVhazsKKyAgICAgIGNhc2UgIikiOgorICAgICAgeworICAgICAgICBtaXhlZCB0bXA7CisJaWYoU1Aoc3RhY2spICYmIHBvaW50ZXJwKFRPUChzdGFjaykpKSBQT1Aoc3RhY2ssIHRtcCk7CisgICAgICAgIGVsc2UgdG1wID0gKHt9KTsKKyAgICAgICAgaWYoU1Aoc3RhY2spICYmIFRPUChzdGFjaykgPT0gIiciKQorCSAgLyogZG8gbm90aGluZyAqLyA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBpZihzaXplb2YoY29kZSkpCisJICB7CisJICAgIGNvZGVbMF0gPSBwcm9nX3BhcnNlKGNvZGVbMF0pOworCSAgICBpZihDTF9MQU1CREEoY29kZVswXSkgfHwgc3ltYm9scChjb2RlWzBdKSB8fCBwb2ludGVycChjb2RlWzBdKSkKKwkgICAgICBjb2RlID0gKHsjJ2Z1bmNhbGx9KSArIGNvZGU7CisJICB9CisgICAgICAgIGNvZGUgPSB0bXAgKyAoeyBjb2RlIH0pOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQgOiBjb2RlICs9ICh7IHRva2VuWzEuLjwyXSB9KTsgYnJlYWs7CisgICAgfQorICBlbHNlCisgICAgY29kZSArPSAoeyBxdW90ID8gdG9rZW4gOiBwcm9nX3BhcnNlKHRva2VuLCAhc2l6ZW9mKGNvZGUpKSB9KTsKKworICB3aGlsZShTUChzdGFjaykgJiYgKFRPUChzdGFjaykgPT0gIiciICB8fCBUT1Aoc3RhY2spID09ICInQ09ERSIpICYmIAorICAgICAgICBzaXplb2YoY29kZSkpIAorICB7IAorICAgIGludCBxOworICAgIGlmKHN0cmluZ3AoY29kZVs8MV0pIHx8IHN5bWJvbHAoY29kZVs8MV0pIHx8IHBvaW50ZXJwKGNvZGVbPDFdKSB8fCAKKyAgICAgICBnZXRfdHlwZV9pbmZvKGNvZGVbPDFdKVswXSA9PSAxMCkgLy8gcXVvdGVkIGFycmF5CisgICAgICAgIGNvZGVbPDFdID0gcXVvdGUoY29kZVs8MV0pOyAKKyAgICBQT1BYKHN0YWNrKTsgCisgIH0KK30KKworLy8gcGFyc2UoKSAtLSBub24tdGhyZWFkZWQgcGFyc2luZyAoY29udGludWUgb24gaW5wdXQpCitub21hc2sgc3RhdGljIGludCBwYXJzZShtaXhlZCBtc2csIGludCBpbnRlcmFjdGl2ZSkKK3sKKyAgbWl4ZWQgdG9rZW4sIHJlczsKKyAgaW50IGxleGluZywgbWlzc2luZ19wYXI7CisgIGRvIHsKKyAgICBpZihsZXhpbmcgPSBsZXgoJnRva2VuKSkJCisgICAgewkJCQkJLy8gdHJ5IHRvIGFzc3VtZSBvdXRlciAiKCIKKyAgICAgIGlmKCFTUChzdGFjaykgJiYgdG9rZW4gIT0gIigiKSB7IENvZGVHZW4oIigiKTsgYXNzdW1lID0gMTsgfQorICAgICAgQ29kZUdlbih0b2tlbik7CisgICAgfQorICAgIGVsc2UgCQkJCS8vIGFkZCAiKSIgaWYgIigiIGlzIGFzc3VtZWQKKyAgICAgIGlmKHNpemVvZihzdGFjaykgPT0gMSAmJiBhc3N1bWUpIHsgQ29kZUdlbigiKSIpOyBhc3N1bWUgPSAwOyBsZXhpbmcgPSAxOyB9CisgICAgaWYobGV4aW5nICYmICFTUChzdGFjaykpCQkvLyBjb21wbGV0ZSBleHByZXNzaW9uIGZvdW5kCisgICAgeworICAgICAgbWl4ZWQgZXhlY19jb2RlOyBleGVjX2NvZGUgPSBjb2RlOyBpbml0aWFsaXplKCk7CisgICAgICBpZihzaXplb2YoZXhlY19jb2RlKSAmJiBwb2ludGVycChleGVjX2NvZGVbMF0pKSAKKyAgICAgICAgZXhlY19jb2RlID0gKHsjJyx9KSArIGV4ZWNfY29kZTsvLyBtb3JlIHRoYW4gb25lIGV4cHIgb24gb25lIGxpbmUKKyAgICAgIGlmKG1zZyA9IGNhdGNoKHJlcyA9IGV2YWwoZXhlY19jb2RlKSkpIAorICAgICAgICByZXR1cm4gLTI7CQkJLy8gZXhlY3V0aW9uIGVycm9yCisgICAgICBpZihpbnRlcmFjdGl2ZSkgcHJpbnRmKG91dHB1dChyZXMpKTsKKyAgICAgIGVsc2UgbXNnID0gcmVzOworICAgIH0KKyAgfQorICB3aGlsZShsZXhpbmcpOworICBpZihtaXNzaW5nX3BhciA9IFNQKHN0YWNrKSkgCisgICAgcmV0dXJuIChtc2cgPSBzcHJpbnRmKCIqTWlzc2luZyAlZCApXG4iLCBtaXNzaW5nX3BhciksIC0zKTsgCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL2xpc3Avc3RhY2suaCBiL29iai90b29scy9saXNwL3N0YWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA1NzhmNAotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9saXNwL3N0YWNrLmgKQEAgLTAsMCArMSw4IEBACisvLyBTVEFDSy5IIC0tIHN0YWNrIG1hY3JvcworCisjZGVmaW5lIElOSVRTVEFDSyhzKQkocyA9ICh7fSkpCisjZGVmaW5lIFBVU0gocyx4KQkocyArPSAoeyAoeCkgfSkpCisjZGVmaW5lIFBPUChzLHgpCSh4ID0gc1s8MV0sIHMgPSBzWzAuLjwyXSkKKyNkZWZpbmUgUE9QWChzKQkJKHMgPSBzWzAuLjwyXSkKKyNkZWZpbmUgVE9QKHMpCQkoKHMpWzwxXSkKKyNkZWZpbmUgU1AocykJCShzaXplb2YocykpCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvbGlzcC90d2Vhay5oIGIvb2JqL3Rvb2xzL2xpc3AvdHdlYWsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTE4YjYwCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL2xpc3AvdHdlYWsuaApAQCAtMCwwICsxLDM0IEBACisvLyBUV0VBSy5IIC0tIHN5c3RlbSBkZXBlbmRlbmQgbWFjcm9zCisKKyNkZWZpbmUgTU9SR0VOR1JBVUVOCisKKyNpZiAoZGVmaW5lZChBVkFMT04pIHx8IGRlZmluZWQoRmluYWxGcm9udGllcikpCisjICBkZWZpbmUgVU5JdG9waWEKKyNlbmRpZgorCisvLyBUaGUgaG9tZSBkaXJlY3Rvcnkgb2YgdGhlIGxpc3AgY29tcGlsZXJzIGZpbGVzCisjaWYgKGRlZmluZWQoVEFQUE1VRCkgfHwgZGVmaW5lZChVTkl0b3BpYSkpCisjICBkZWZpbmUgSE9NRShmaWxlKQkiL3cvaGF0ZS9saXNwLyIrZmlsZQorI2VsaWYgKGRlZmluZWQoQURBTUFOVCkpCisjICBkZWZpbmUgSE9NRShmaWxlKQkiL3dpei9oYXRlL2xpc3AvIitmaWxlCisjZWxzZQorIyBpZmRlZiBNT1JHRU5HUkFVRU4KKyMgICBkZWZpbmUgSE9NRShmaWxlKQkiL29iai90b29scy9saXNwLyIrZmlsZQorIyBlbHNlCisjICAgZGVmaW5lIEhPTUUoZmlsZSkJIi9wbGF5ZXJzL2hhdGUvbGlzcC8iK2ZpbGUKKyMgZW5kaWYKKyNlbmRpZgorCisvLyBzeW1ib2xfdmFyaWFibGUoKSBpcyBub3QgYXZhaWxhYmxlIG9uIGRyaXZlcnMgYmVsb3cgMy4yLjFAMQorLy8jZGVmaW5lIHN5bWJvbF92YXJpYWJsZShzdHIpCTAKKworLy8gREVCVUcgbW9kZQorI2lmZGVmIE1PUkdFTkdSQVVFTgorIyAgZGVmaW5lIFVTRVIgImV0YWgiCisjZWxzZQorIyAgZGVmaW5lIFVTRVIgImhhdGUiCisjZW5kaWYKKyNkZWZpbmUgREVCVUcoeCkJaWYoZmluZF9wbGF5ZXIoVVNFUikpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGVsbF9vYmplY3QoZmluZF9wbGF5ZXIoVVNFUiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZigiWyVPXSAlT1xuIiwgdGhpc19vYmplY3QoKSwgKHgpKSkKKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL2xpc3AvdHlwZXMuaCBiL29iai90b29scy9saXNwL3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFlZjVlYgotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9saXNwL3R5cGVzLmgKQEAgLTAsMCArMSw0IEBACisjZGVmaW5lIENMX0xBTUJEQSh4KSAgKGdldF90eXBlX2luZm8oeClbMF09PTggJiYgZ2V0X3R5cGVfaW5mbyh4KVsxXT09NSkKKyNkZWZpbmUgQ0xfTEZVTih4KSAgICAoZ2V0X3R5cGVfaW5mbyh4KVswXT09OCAmJiBnZXRfdHlwZV9pbmZvKHgpWzFdPT0wKQorI2RlZmluZSBDTF9FRlVOKHgpICAgIChnZXRfdHlwZV9pbmZvKHgpWzBdPT04ICYmIGdldF90eXBlX2luZm8oeClbMV08IDApCisjZGVmaW5lIENMX1ZBUih4KSAgICAgKGdldF90eXBlX2luZm8oeClbMF09PTggJiYgZ2V0X3R5cGVfaW5mbyh4KVsxXT09MSkKZGlmZiAtLWdpdCBhL29iai90b29scy9sb2d0b29sLmMgYi9vYmovdG9vbHMvbG9ndG9vbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0OTNiNzUKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvbG9ndG9vbC5jCkBAIC0wLDAgKzEsMTU2IEBACisvLyAoYykgYnkgUGFkcmVpYyAoUGFkcmVpY0BtZy5tdWQuZGUpCisKK2luaGVyaXQgInN0ZC9zZWN1cmVfdGhpbmciOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKworI2RlZmluZSBTQVZFRklMRSAgIi9wbGF5ZXJzLyIrZ2V0ZXVpZCgpKyIvLmxvZ3Rvb2wiCisKKy8vIGRlZmluaWVyZW4gdm9uICJpbmxpbmUiIEZ1bmt0aW9uZW46CisjZGVmaW5lIGFsbG93ZWQoKSAgICghcHJvY2Vzc19jYWxsKCkgJiYgUEw9PVJQTCAmJiBnZXRldWlkKCk9PWdldHVpZChSUEwpKQorCittYXBwaW5nIGxvZ3M7CisKK3N0YXRpYyB2b2lkIGNoZWNrX2xvZ3MoKQoreworICBmaWx0ZXIoc29ydF9hcnJheShtX2luZGljZXMobG9ncyksICMnPiksIGxhbWJkYSggKHsgJ3ggfSksICh7Iyc/LCAKKyAgICAoeyMnIT0sICh7IydbLCBsb2dzLCAneCwgMn0pLCAoeyMnZmlsZV90aW1lLCAoeyMnWywgbG9ncywgJ3gsIDB9KSB9KSB9KSwKKyAgICAgICAoeyMndGVsbF9vYmplY3QsICh7IydlbnZpcm9ubWVudCB9KSwgKHsjJ3NwcmludGYsCisgICAgICAgIk5ldWUgRWludHJhZWdlIGluIDwlcz4uXG4iLCAneCB9KSB9KSwgMH0pKSk7Cit9CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAoTUUpKSByZXR1cm47CisgIDo6Y3JlYXRlKCk7CisgIGlmICghcmVzdG9yZV9vYmplY3QoU0FWRUZJTEUpKSB7CisgICAgbG9ncz0oWyAicmVwZmlsZSI6IHNwcmludGYoIi9sb2cvcmVwb3J0LyVzLnJlcCIsIGdldGV1aWQoKSk7IDA7IDAgXSk7CisgICAgaWYgKElTX0FSQ0goZ2V0ZXVpZCgpKSkKKyAgICAgIGxvZ3MrPShbInNub29wbG9nIjogIi9sb2cvU05PT1AiOyAwOyAwLCAia2lsbGVyIjogIi9sb2cvS0lMTEVSIjsgMDsgMF0pOworICB9CisgIFNldFByb3AoUF9TSE9SVCwgdGhpc19wbGF5ZXIoKS0+TmFtZShXRVNTRU4pKyIgTG9ndG9vbCIpOworICBTZXRQcm9wKFBfTkFNRSwgUXVlcnlQcm9wKFBfU0hPUlQpKTsKKyAgU2V0UHJvcChQX05PRFJPUCwgMCk7CisgIFNldFByb3AoUF9ORVZFUkRST1AsIDApOworICBTZXRQcm9wKFBfQVVUT0xPQURPQkosIDEpOworICBBZGRJZCgibG9ndG9vbCIpOworICBBZGRDbWQoIm1hcmsiLCAiYWt0dWFsaXNpZXJlbiIpOworICBBZGRDbWQobV9pbmRpY2VzKGxvZ3MpLCAicmVhZF9sb2ciKTsKKyAgQWRkQ21kKCJBZGRMb2ciLCAiYWRkX2xvZyIpOworICBBZGRDbWQoIkRlbExvZyIsICJkZWxfbG9nIik7Cit9CisKK3ZvaWQgcmVzZXQoKQoreworICA6OnJlc2V0KCk7CisgIGlmICghY2xvbmVwKE1FKSB8fCAhZW52aXJvbm1lbnQoKSkgcmV0dXJuOworICBjYWxsX291dCgiY2hlY2tfbG9ncyIsIDApOworICBzZXRfbmV4dF9yZXNldCgyKl9fUkVTRVRfVElNRV9fKTsgLy8ga2VpbiBadWZhbGwsIG1heC4gTGFlbmdlCit9CisKK3ZhcmFyZ3MgaW50IG1vdmUobWl4ZWQgZGVzdCwgaW50IG1ldGhvZCkKK3sKKyAgaW50IGk7CisgIGlmICghb2JqZWN0cChkZXN0KSkgZGVzdD1maW5kX29iamVjdChkZXN0KTsKKyAgaWYgKCFkZXN0IHx8ICFpbnRlcmFjdGl2ZShkZXN0KSB8fCBnZXR1aWQoZGVzdCkhPWdldGV1aWQoKSkgCisgICAgcmV0dXJuIE1FX0NBTlRfQkVfVEFLRU47CisgIGk9Ojptb3ZlKGRlc3QsIG1ldGhvZCk7CisgIGlmIChpIT0xKSByZXR1cm4gaTsKKyAgaWYgKGVudmlyb25tZW50KCkpIGNhbGxfb3V0KCJjaGVja19sb2dzIiwgMCk7CisgIHJldHVybiAxOworfQorCit2YXJhcmdzIHN0cmluZyBsb25nKCkgCit7CisgICByZXR1cm4gIkZvbGdlbmRlIExvZ2ZpbGVzIHdlcmRlbiBkZXJ6ZWl0IHZvbiBEZWluZW0gTG9ndG9vbCB2ZXJ3YWx0ZXQ6XG5cbiIKKyAgICAgICAgICtpbXBsb2RlKG1hcChzb3J0X2FycmF5KG1faW5kaWNlcyhsb2dzKSwgIyc+KSwKKyAgICAgICAgICBsYW1iZGEoICh7ICd4IH0pLCAoeyMnc3ByaW50ZiwgIiAlMXMgJS0xNHMgLSAlcyIsICh7Iyc/LCAoeyMnIT0sCisgICAgICAgICAgKHsjJ1ssbG9ncywneCwgMn0pLCAoeyMnZmlsZV90aW1lLCh7IydbLGxvZ3MsJ3gsIDB9KX0pfSksIioiLCIifSksCisgICAgICAgICAgKHsjJ3NwcmludGYsICI8JXM+IiwgJ3h9KSwgKHsjJ1ssIGxvZ3MsICd4LCAwfSl9KSApICksICJcbiIpCisgICAgICAgICArIlxuXG5NaXQgPG1hcms+IGtvZW5uZW4gYWxsZSBFaW50cmFlZ2UgYWxzIGdlbGVzZW4gbWFya2llcnQgdW5kICIKKyAgICAgICAgICsibWl0IEFkZC0gdW5kXG5EZWxMb2cgTG9nZmlsZXMgaW4gZGllIExpc3RlIGF1Zmdlbm9tbWVuIGJ6dy4gYXVzICIKKyAgICAgICAgICsiZGVyIExpc3RlIGVudGZlcm50IHdlcmRlbi5cbiI7Cit9CisKK3N0YXRpYyBpbnQgYWt0dWFsaXNpZXJlbihzdHJpbmcgc3RyKQoreworICBpZiAoIWFsbG93ZWQoKSkgcmV0dXJuIDA7CisgIGlmIChzdHIgJiYgc3RyIT0iIikgeworICAgIGlmICghbG9nc1tzdHJdKSB7CisgICAgICBub3RpZnlfZmFpbCgiRWluIHNvbGNoZXMgTG9nZmlsZSBpc3QgbmljaHQgaW4gZGVyIExpc3RlIGVudGhhbHRlbi5cbiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGxvZ3Nbc3RyLCAxXT1maWxlX3NpemUobG9nc1tzdHIsIDBdKTsKKyAgICBsb2dzW3N0ciwgMl09ZmlsZV90aW1lKGxvZ3Nbc3RyLCAwXSk7CisgIH0KKyAgZWxzZSBmaWx0ZXIobV9pbmRpY2VzKGxvZ3MpLCBsYW1iZGEoICh7ICd4IH0pLCh7IycsICwKKyAgICh7Iyc9LCAoeyMnWywgbG9ncywgJ3gsIDF9KSwgKHsjJ2ZpbGVfc2l6ZSwgKHsjJ1ssIGxvZ3MsICd4LCAwfSkgfSkgfSksCisgICAoeyMnPSwgKHsjJ1ssIGxvZ3MsICd4LCAyfSksICh7IydmaWxlX3RpbWUsICh7IydbLCBsb2dzLCAneCwgMH0pIH0pfSl9KSkpOworICB3cml0ZSgiRG9uZSFcbiIpOworICBzYXZlX29iamVjdChTQVZFRklMRSk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHJlYWRfbG9nKHN0cmluZyBzdHIpCit7CisgIGludCBzaTsKKyAgaWYgKCFhbGxvd2VkKCkpIHJldHVybiAwOworICBzaT1maWxlX3NpemUobG9nc1txdWVyeV92ZXJiKCksMF0pOworICBpZiAoc3RyKQorICAgIFBMLT5tb3JlKGxvZ3NbcXVlcnlfdmVyYigpLDBdKTsKKyAgZWxzZSB7CisgICAgaWYgKHNpPDAgfHwgZmlsZV90aW1lKGxvZ3NbcXVlcnlfdmVyYigpLCAwXSk9PWxvZ3NbcXVlcnlfdmVyYigpLCAyXSkKKyAgICAgIHdyaXRlKCJLZWluZSBuZXVlbiBFaW50cmFlZ2UgaW4gPCIrcXVlcnlfdmVyYigpKyI+LlxuIik7CisgICAgZWxzZSB7CisgICAgICB3cml0ZSgiRm9sZ2VuZGVzIGlzdCBuZXUgaW4gPCIrcXVlcnlfdmVyYigpKyI+LlxuIik7CisgICAgICBpZiAoc2k8bG9nc1txdWVyeV92ZXJiKCksMV0pCisgICAgICAgIFBMLT5tb3JlKGxvZ3NbcXVlcnlfdmVyYigpLDBdKTsKKyAgICAgIGVsc2UgUEwtPk1vcmUocmVhZF9ieXRlcyhsb2dzW3F1ZXJ5X3ZlcmIoKSwwXSwKKwkgICAgbG9nc1txdWVyeV92ZXJiKCksMV0sc2ktbG9nc1txdWVyeV92ZXJiKCksMV0pKTsKKyAgICB9CisgIH0KKyAgbG9nc1txdWVyeV92ZXJiKCksIDFdPXNpOworICBsb2dzW3F1ZXJ5X3ZlcmIoKSwgMl09ZmlsZV90aW1lKGxvZ3NbcXVlcnlfdmVyYigpLCAwXSk7CisgIHNhdmVfb2JqZWN0KFNBVkVGSUxFKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgYWRkX2xvZygpCit7CisgIHN0cmluZyBrZXksIHBhdGgsIHN0cjsKKyAgc3RyPVBMLT5fdW5wYXJzZWRfYXJncygpOyAgCisgIGlmICghYWxsb3dlZCgpIHx8ICFzdHIgfHwgc3NjYW5mKHN0ciwgIiVzICVzIiwga2V5LCBwYXRoKSE9MikgeworICAgIG5vdGlmeV9mYWlsKCJTeW50YXg6IEFkZExvZyA8a2V5PiA8cGF0aD5cbiIpOworICAgIHJldHVybiAwOworICB9CisgIGtleT1sb3dlcl9jYXNlKGtleSk7CisgIGlmIChsb2dzW2tleV0pIHsKKyAgICBub3RpZnlfZmFpbCgiRXMgZ2lidCBzY2hvbiBlaW4gTG9nZmlsZSBtaXQgZGllc2VtIEtleSBpbiBkZXIgTGlzdGUuXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBsb2dzKz0oWyBrZXk6IHBhdGg7IDA7IDAgXSk7CisgIEFkZENtZChrZXksICJyZWFkX2xvZyIpOworICBzYXZlX29iamVjdChTQVZFRklMRSk7CisgIHdyaXRlKCJMb2dmaWxlIDwiK2tleSsiPiBpbiBkaWUgTGlzdGUgYXVmZ2Vub21tZW4uXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZGVsX2xvZyhzdHJpbmcgc3RyKQoreworICBpZiAoIWFsbG93ZWQoKSB8fCAhc3RyKSB7CisgICAgbm90aWZ5X2ZhaWwoIldFTENIRVMgTG9nZmlsZSBzb2xsIGF1cyBkZXIgTGlzdGUgZW50ZmVybnQgd2VyZGVuP1xuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKCFsb2dzW3N0cl0pIHsKKyAgICBub3RpZnlfZmFpbCgiTG9nZmlsZSBuaWNodCBpbiBMaXN0ZSBlbnRoYWx0ZW4uXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBsb2dzPW1fY29weV9kZWxldGUobG9ncyxzdHIpOworICBSZW1vdmVDbWQoc3RyKTsKKyAgc2F2ZV9vYmplY3QoU0FWRUZJTEUpOworICB3cml0ZSgiTG9nZmlsZSA8IitzdHIrIj4gYXVzIExpc3RlIGVudGZlcm50LlxuIik7CisgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL2x1cGUuYyBiL29iai90b29scy9sdXBlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ2ZjEwOQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9sdXBlLmMKQEAgLTAsMCArMSwxODg4IEBACisvLyBUaGlzIHRvb2wgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBNYWNiZXRoQFRVQm11ZAorLy8KKy8vIFNvbWUgY2hhbmdlcy9leHRlbnNpb25zIGJ5IEpvZkBNb3JnZW5HcmF1ZW4KKworaW5oZXJpdCAiL3N0ZC90aGluZyI7CisKKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8cXVlc3RtYXN0ZXIuaD4KKyNpbmNsdWRlIDx1c2VyaW5mby5oPgorCisjZGVmaW5lIGFkZChzKSBjb21tYW5kcys9KHtzfSk7ZnVuY3Rpb25zKz0oe3N9KTtuY21kcysrCisjZGVmaW5lIGFkZDIocyxmKSBjb21tYW5kcys9KHtzfSk7ZnVuY3Rpb25zKz0oe2Z9KTtuY21kcysrCisjZGVmaW5lIE1BWFNUQUNLIDEwCisjZGVmaW5lIE1BWFZBUlMgMTAKKyNkZWZpbmUgTUFYREVQVEggNQorI2RlZmluZSBNQVhMSU5FUyA0MAorI2RlZmluZSBNQVhMSU5FTEVOIDc5CisKK21peGVkICpzdGFjaywgKnZhcmFyZWEsIGVycjsKKworc3RyaW5nICpjb21tYW5kcywgKmZ1bmN0aW9ucywgdXNlciwgKnF1ZXJ5X2xpc3QsICphcmd2OworaW50IG1heHZlcmIsbmNtZHMsYXJnYyxyZWN1cnNpdmUsaGlkZV9zaG9ydCxsaW5lcyxmaXJzdGxpbmUsbGFzdGxpbmU7CitzdGF0aWMgaW50IHRlbGwoc3RyaW5nIHN0cik7CitpbnQgZXZhbGNtZChzdHJpbmcgc3RyKTsKK2ludCBldmFsKHN0cmluZyBzdHIpOworc3RyaW5nIHN0ayhzdHJpbmcgYXJnKTsKK3N0cmluZyBkZXNjKG9iamVjdCBvYik7Cit2b2lkIGNsZWFuKG9iamVjdCBvYik7Cit2b2lkIGNsZWFub2Yoc3RyaW5nIHN0cixvYmplY3Qgb2IpOworCisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgb2JqZWN0IG93bmVyOworICBzdHJpbmcgc3RyOworICAKKyAgaWYgKCFjbG9uZXAoTUUpKSByZXR1cm47CisgIDo6Y3JlYXRlKCk7CisgIG93bmVyPWVudmlyb25tZW50KCl8fHRoaXNfcGxheWVyKCk7CisgIGlmIChvd25lcikKKyAgICBzdHI9Y2FwaXRhbGl6ZSgoKHN0cj1nZXRldWlkKG93bmVyKSlbPDFdPT0ncyd8fHN0cls8MV09PSd4J3x8c3RyWzwxXSA9PSd6Jyk/c3RyKz0iJyI6c3RyKz0icyIpOyAKKyAgZWxzZQorICAgIHN0cj0iRWluZSI7CisgIFNldFByb3AoIFBfU0hPUlQsc3RyKyIgTHVwZSIgKTsKKyAgU2V0UHJvcCggUF9OQU1FLCBzdHIrIiBMdXBlIiApOworICBTZXRQcm9wKCBQX0xPTkcsICJNaXQgZGllc2VyIEx1cGUga2FubiBtYW4gZGllIEZlaW5oZWl0ZW4gZGVzIExQQyBiZXNzZXIgZXJrZW5uZW4uXG4iICk7CisgIFNldFByb3AoIFBfTkVWRVJEUk9QLCAxICk7CisgIFNldFByb3AoIFBfTk9EUk9QLCAiRHUga2FubnN0IERlaW5lIEx1cGUgbmljaHQgd2Vnd2VyZmVuLiBEYXp1IGlzdCBzaWUgenUgd2VydHZvbGwuXG4iKTsKKyAgU2V0UHJvcCggUF9OT0JVWSwgMSApOworICBTZXRQcm9wKCBQX0dFTkRFUiwgRkVNQUxFICk7CisgIFNldFByb3AoIFBfV0VJR0hULCAwICk7CisgIFNldFByb3AoIFBfQVJUSUNMRSwwKTsKKyAgU2V0UHJvcCggUF9HRU5ERVIsMCk7CisgIEFkZElkKCAibHVwZSIgKTsKKyAgdXNlcj0iKiI7CisgIHN0YWNrPSh7fSk7CisgIGNvbW1hbmRzPSh7fSk7CisgIGZ1bmN0aW9ucz0oe30pOworICBuY21kcz0wOworICBhZGQoIkRlc3QiKTsKKyAgYWRkKCJfZ290byIpOworICBhZGQoImNsbm9mIik7CisgIGFkZCgiY2xuIik7CisgIGFkZCgiY2xyIik7CisgIGFkZCgiY29weV9sZGZpZWQiKTsKKyAgYWRkKCJjcmVhdCIpOworICBhZGQoImRlc3QiKTsKKyAgYWRkKCJkaW5mbyIpOworICBhZGQoImRpc2NvIik7CisgIGFkZCgiZHVtcF9saXN0cyIpOworICBhZGQoImR1cCIpOworICBhZGQoImVudiIpOworICBhZGQoImhlcmUiKTsKKyAgYWRkKCJpbmZvIik7CisgIGFkZCgiaW52Iik7CisgIGFkZCgibHYiKTsKKyAgYWRkKCJtYWtlIik7CisgIGFkZCgibWUiKTsKKyAgYWRkKCJtaW5mbyIpOworICBhZGQoIm5ldyIpOworICBhZGQoIm5vcmVjIik7CisgIGFkZCgib2IiKTsKKyAgYWRkKCJvdmVyIik7CisgIGFkZCgicGwiKTsKKyAgYWRkKCJyZWMiKTsKKyAgYWRkKCJyZXN1bHQiKTsKKyAgLy8gYWRkKCJydXNhZ2UiKTsKKyAgYWRkKCJzY2FuIik7CisgIGFkZCgic3RhdCIpOworICBhZGQoInN0ayIpOworICBhZGQoInN3YXAiKTsKKyAgYWRkKCJzd2hvIik7CisgIGFkZCgidmFycyIpOworICBhZGQyKCIjIiwibG9jayIpOworICBhZGQyKCIuIiwic2VsIik7CisgIGFkZDIoIi8iLCJmaWxlIik7CisgIGFkZDIoIjwiLCJyZWFkdmFyIik7CisgIGFkZDIoIj0iLCJkdW1wIik7CisgIGFkZDIoIj4iLCJ3cml0ZXZhciIpOworICBhZGQyKCJAIiwicGljayIpOworICBhZGQyKCJbIiwiY2FsbCIpOworICBhZGQyKCJfbW8iLCJfbXYiKTsKKyAgYWRkMigiX21vdiIsIl9tdiIpOworICBhZGQyKCJfbW92ZSIsIl9tdiIpOworICBhZGQyKCJfbXYiLCJfbXYiKTsKKyAgYWRkMigiY2FsbF9vdXQiLCJjYWxsb3V0Iik7CisgIGFkZDIoImRlYnVnX2luZm8iLCAiZGJfaW5mbyIpOworICBhZGQyKCJkZXNjIiwidG9nZ2xlX3Nob3J0Iik7CisgIGFkZDIoImR1bXAiLCJkdW1wbGlzdHMiKTsKKyAgYWRkMigiaGVhcnRfYmVhdCIsImhlYXJ0YmVhdCIpOworICBhZGQyKCJpZGxlIiwiaWRsZSIpOworICBhZGQyKCJpbmhlcml0X2xpc3QiLCJpbmhlcml0bGlzdCIpOworICBhZGQyKCJtb3ZlIiwibXYiKTsKKyAgYWRkMigibW92IiwibXYiKTsKKyAgYWRkMigibW8iLCJtdiIpOworICBhZGQyKCJwb3AiLCJ4cG9wIik7CisgIGFkZDIoInB1c2giLCJ4cHVzaCIpOworICBhZGQyKCJyZW5ldyIsInJlbmV3X3BsYXllciIpOworICBhZGQyKCJzYyIsInNjYW4iKTsKKyAgYWRkMigifiIsImZpbGUyIik7CisgIG1heHZlcmI9bmNtZHM7CisgIHZhcmFyZWE9YWxsb2NhdGUoTUFYVkFSUyk7CisgIHF1ZXJ5X2xpc3QgPQorICAgICh7CisgICAgICAiVkFMVUUiLCItdmFsdWUiLCJMRVZFTCIsIi1sZXZlbCIsIklEUyIsIi1pZHMiLAorICAgICAgIldFQVBPTiBDTEFTUyIsIi13YyIsIkFSTU9VUiBDTEFTUyIsIi1hYyIsCisgICAgICAiV0VJR0hUIiwiLXdlaWdodCIsIlRZUEUiLCJxdWVyeV90eXBlIiwKKyAgICAgICJVSUQiLCItdWlkIiwiRVVJRCIsIi1ldWlkIgorICAgIH0pOworfQorCitpbnQgX3F1ZXJ5X2F1dG9sb2Fkb2JqKCkKK3sKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgX3NldF9hdXRvbG9hZG9iaigpCit7CisgIGNhbGxfb3V0KCJfbG9hZF9wcm9maWxlIiwwKTsKK30KKwordm9pZCBfbG9hZF9wcm9maWxlKCkKK3sKKyAgb2JqZWN0IHByb2ZpbGU7CisgIHN0cmluZyBwZmlsZTsKKyAgCisgIGlmIChnZXRldWlkKCkgJiYgZW52aXJvbm1lbnQoKSAmJiBnZXRldWlkKGVudmlyb25tZW50KCkpPT1nZXRldWlkKCkgJiYKKyAgICAgIGludGVyYWN0aXZlKGVudmlyb25tZW50KCkpKQorICAgIGlmIChmaWxlX3NpemUocGZpbGU9Ii9wbGF5ZXJzLyIrZ2V0ZXVpZCgpKyIvLnByb2ZpbGUuYyIpPjApCisgICAgICBpZiAocGZpbGU9Y2F0Y2goY2FsbF9vdGhlcihwZmlsZSwic2V0dXAiLGVudmlyb25tZW50KCkpKSkKKwlwcmludGYoIkVycm9yIHdoZW4gbG9hZGluZyBwcm9maWxlOiAlT1xuIixwZmlsZSk7Cit9CisKK3ZvaWQgaW5pdCgpCit7CisgIGludCBpLGNoOworICAKKyAgOjppbml0KCk7CisgIGlmIChlbnZpcm9ubWVudCgpIT10aGlzX3BsYXllcigpKSByZXR1cm47CisvLyAgaWYgKCFJU19MRUFSTkVSKHRoaXNfcGxheWVyKCkpKSByZXR1cm47CisgIGlmICghSVNfTEVBUk5FUih0aGlzX3BsYXllcigpKSkgcmV0dXJuIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOworICAKKyAgYWRkX2FjdGlvbigiY21kbGluZSIsIiIsMSk7Cit9CisKK2ludCBjbWRsaW5lKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyB2ZXJiOworICBpbnQgaSxyZXQ7CisgIAorICB2ZXJiPXF1ZXJ5X3ZlcmIoKTsKKyAgaWYgKCF2ZXJiKSByZXR1cm4gMDsKKyAgc3dpdGNoICh2ZXJiKQorICB7CisgICAgY2FzZSAiZXJ6YWVobCI6IHJldHVybiB0ZWxsKHN0cik7CisgIH0KKyAgc3RyPVBMLT5fdW5wYXJzZWRfYXJncygpOworICBmb3IgKGk9MDtpPG1heHZlcmI7aSsrKQorICAgIGlmIChjb21tYW5kc1tpXT09dmVyYlswLi5zaXplb2YoY29tbWFuZHNbaV0pLTFdKQorICAgICAgaWYgKHJldD1ldmFsY21kKHN0cikpCisJcmV0dXJuIHJldDsKKyAgcmV0dXJuKDApOyAvLyBub24tdm9pZCBmdW5jdGlvbiwgWmVzc3RyYQorfQorCitzdGF0aWMgaW50IHRlbGwoc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nICp0bXA7CisgIG9iamVjdCB3aG8sc247CisgIGludCByZXQ7CisKKyAgaWYgKCFJU19BUkNIKHRoaXNfaW50ZXJhY3RpdmUoKSkpIHJldHVybiAwOworICBpZiAoIShzdHI9dGhpc19pbnRlcmFjdGl2ZSgpLT5fdW5wYXJzZWRfYXJncygpKSkgcmV0dXJuIDA7CisgIGlmIChzaXplb2YodG1wPW9sZF9leHBsb2RlKHN0ciwiICIpKTwyKSByZXR1cm4gMDsKKyAgaWYgKCEod2hvPWZpbmRfcGxheWVyKHRtcFswXSkpKSByZXR1cm4gMDsKKyAgaWYgKCEoc249cXVlcnlfc25vb3Aod2hvKSkpIHJldHVybiAwOworICBpZiAocXVlcnlfd2l6X2dycCh0aGlzX2ludGVyYWN0aXZlKCkpPD1xdWVyeV93aXpfZ3JwKHNuKSB8fAorICAgICAgcXVlcnlfd2l6X2dycCh0aGlzX2ludGVyYWN0aXZlKCkpPD1xdWVyeV93aXpfZ3JwKHdobykpIHJldHVybiAwOworICBzbm9vcChzbiwwKTsKKyAgcmV0PXRoaXNfaW50ZXJhY3RpdmUoKS0+X2VyemFlaGxlKHN0cik7CisgIHNub29wKHNuLHdobyk7CisgIHJldHVybiByZXQ7Cit9CisKK2ludCBzZXRfdXNlcihzdHJpbmcgc3RyKQoreworICBzdHJpbmcgd2hvOworICBpZiAoIXN0cikgcmV0dXJuIDA7CisgIGlmIChzdHI9PSJubyBhY2Nlc3MiKQorICB7CisgICAgdXNlcj0iKiI7CisgICAgbW92ZV9vYmplY3QodGhpc19vYmplY3QoKSxlbnZpcm9ubWVudCgpKTsKKyAgICB3cml0ZSgiT2suXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoc3NjYW5mKHN0ciwiYWNjZXNzIHRvICVzIix3aG8pPT0xKQorICB7CisgICAgb2JqZWN0IHBsOworICAgIHBsPWZpbmRfcGxheWVyKHdobyk7CisgICAgaWYgKCFwbCkKKyAgICAgIHdyaXRlKCJObyBzdWNoIHBsYXllci5cbiIpOworICAgIGVsc2UKKyAgICB7CisgICAgICB1c2VyID0gd2hvOworICAgICAgd3JpdGUoIk9rLlxuIik7CisgICAgICBtb3ZlX29iamVjdCh0aGlzX29iamVjdCgpLHBsKTsKKyAgICAgIHRlbGxfb2JqZWN0KHBsLCJEdSBkYXJmc3QgbnVuIGR1cmNoIGRpZSBtYWdpc2NoZSBMdXBlIHNjaGF1ZW4uXG4iKTsKKyAgICB9CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0cmluZyBzdHJpcChzdHJpbmcgc3RyKQoreworICBzdHJpbmcgdGVtcDsKKyAgaWYoIXN0cikgcmV0dXJuICIiOworICB3aGlsZSAoc3NjYW5mKHN0ciwiICVzIix0ZW1wKT09MSkgc3RyPXRlbXA7CisgIHJldHVybiBzdHI7Cit9CisKK2ludCBhcmdsZW47CisKK3N0cmluZyBnZXRhcmcoc3RyaW5nIGFyZ3MpCit7CisgIHN0cmluZyBhcmc7CisgIHN0cmluZyByZXN0OworICBpZiAoc3NjYW5mKGFyZ3MsIlwiJXNcIiVzIixhcmcscmVzdCk9PTIgfHwKKyAgICAgIHNzY2FuZihhcmdzLCJcJyVzXCclcyIsYXJnLHJlc3QpPT0yIHx8CisgICAgICBzc2NhbmYoYXJncywifCVzfCVzIixhcmcscmVzdCk9PTIpCisgIHsKKyAgICBpZiAoYXJnPT0iIikKKyAgICAgIGFyZ2xlbj0yOworICAgIGVsc2UKKyAgICAgIGFyZ2xlbj1zaXplb2YoYXJnKSsyOworICAgIHJldHVybiBhcmc7CisgIH0KKyAgaWYgKHNzY2FuZihhcmdzLCIlcyAlcyIsYXJnLHJlc3QpPT0yKQorICAgIGFyZ3M9YXJnOworICBpZiAoc3NjYW5mKGFyZ3MsIiVzLiVzIixhcmcscmVzdCk9PTIpCisgICAgYXJncz1hcmc7CisgIGlmIChzc2NhbmYoYXJncywiJXNbJXMiLGFyZyxyZXN0KT09MikKKyAgICBhcmdzPWFyZzsKKyAgaWYgKHNzY2FuZihhcmdzLCIlc10lcyIsYXJnLHJlc3QpPT0yKQorICAgIGFyZ3M9YXJnOworICBpZiAoYXJncz09IiIpCisgICAgYXJnbGVuPTA7CisgIGVsc2UKKyAgICBhcmdsZW49c2l6ZW9mKGFyZ3MpOworICByZXR1cm4gYXJnczsKK30KKworc3RyaW5nIGdldHJlc3Qoc3RyaW5nIHN0cikKK3sKKyAgaWYgKGFyZ2xlbj09MCkKKyAgICByZXR1cm4gc3RyOworICBpZiAoYXJnbGVuPT1zaXplb2Yoc3RyKSkKKyAgICByZXR1cm4gIiI7CisgIHJldHVybiBzdHJpcChzdHJbYXJnbGVuLi5zaXplb2Yoc3RyKS0xXSk7Cit9CisKK2ludCBpbnRlcmFjdGl2ZU1vZGUoc3RyaW5nIHN0cikKK3sKKyAgaWYgKHN0cikKKyAgICByZXR1cm4gZXZhbChzdHIpOworICBzdGsoIiIpOworICB3cml0ZSgiJy4nIHRvIGV4aXQuXG4iKTsKKyAgd3JpdGUoIj8gIik7CisgIGlucHV0X3RvKCJtb3JlIik7CisgIHJldHVybiAxOworfQorCit2b2lkIG1vcmUoc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIGNtZDsKKyAgaWYgKHN0cj09Ii4iKSByZXR1cm47CisgIGlmIChzc2NhbmYoc3RyLCIhJXMiLGNtZCk9PTEpCisgICAgY29tbWFuZChjbWQsdGhpc19wbGF5ZXIoKSk7CisgIGVsc2UKKyAgeworICAgIGV2YWwoc3RyKTsKKyAgICBzdGsoIiIpOworICB9CisgIHdyaXRlKCI/ICIpOworICBpbnB1dF90bygibW9yZSIpOworfQorCitpbnQgZXZhbGNtZChzdHJpbmcgc3RyKQoreworICBzdHJpbmcgdmVyYjsKKyAgaWYgKCFJU19MRUFSTklORyh0aGlzX3BsYXllcigpKSkgcmV0dXJuIDA7CisgIHZlcmI9cXVlcnlfdmVyYigpOworICBpZiAodmVyYj09Ij8iKQorICAgIHZlcmI9IiI7CisgIGlmIChzdHIpCisgICAgc3RyPXZlcmIrIiAiK3N0cjsKKyAgZWxzZQorICAgIHN0cj12ZXJiOworICByZXR1cm4gZXZhbChzdHIpOworfQorCitpbnQgZXZhbChzdHJpbmcgc3RyKQoreworICBpbnQgaSxmbGFnLG9sZF9zcCxmaXJzdDsKKyAgbWl4ZWQgKm9sZF9zdGFjazsKKyAgc3RyaW5nIGFyZyx0bXA7CisgIGVycj0wOworICBmaXJzdD0xOworICB3aGlsZSAoc3RyIT0iIikKKyAgeworICAgIGZsYWc9MDsKKyAgICBzdHI9c3RyaXAoc3RyKTsKKyAgICBpZiAoc3NjYW5mKHN0ciwiIyVzIixhcmcpPT0xKQorICAgIHsKKyAgICAgIG9sZF9zdGFjaz1zdGFja1swLi48MV07CisgICAgICBzdHI9YXJnOworICAgIH0KKyAgICBlbHNlCisgICAgICBvbGRfc3RhY2s9MDsKKyAgICBzdHI9c3RyaXAoc3RyKTsKKyAgICBpZiAoc3RyPT0iIikKKyAgICAgIGJyZWFrOworICAgIGZvciAoaT0wO2k8bmNtZHM7aSsrKQorICAgIHsKKyAgICAgIGlmIChzc2NhbmYoc3RyLGNvbW1hbmRzW2ldKyIlcyIsYXJnKT09MSkKKyAgICAgIHsKKwlpZiAoYXJnIT0iIiAmJiBzdHJbMF0+PSdhJyAmJiBzdHJbMF08PSd6JyAmJgorCSAgICBhcmdbMF0+PSdhJyAmJiBhcmdbMF08PSd6JykKKwl7CisJICBpZiAoZmlyc3QpCisJICAgIHJldHVybiAwOworCSAgZWxzZQorCSAgeworCSAgICBwcmludGYoIkNvdWxkbid0IHBhcnNlOiAlTy5cbiIsc3RyKTsKKwkgICAgcmV0dXJuIDE7CisJICB9CisJfQorCWFyZz1zdHJpcChhcmcpOworCXN0cj1jYWxsX290aGVyKHRoaXNfb2JqZWN0KCksZnVuY3Rpb25zW2ldLGFyZyk7CisJZmlyc3Q9MDsKKwlpZiAob2xkX3N0YWNrKQorCXsKKwkgIHN0YWNrPW9sZF9zdGFjazsKKwkgIG9sZF9zdGFjaz0wOworCX0KKwlpZiAoc3RyaW5ncChlcnIpKQorCXsKKwkgIGlmIChzc2NhbmYoZXJyLCIlc1xuIix0bXApPT0xKQorCSAgICBlcnIgPSB0bXA7CisJICBub3RpZnlfZmFpbChzcHJpbnRmKCJFUlJPUjogJU8uXG4iLGVycikpOworCSAgcmV0dXJuIDA7CisJfQorCWZsYWc9MTsKKwlicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFmbGFnKQorICAgIHsKKyAgICAgIG5vdGlmeV9mYWlsKHNwcmludGYoIkNvdWxkbid0IHBhcnNlOiAlTy5cbiIsc3RyKSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2ludCBwdXNoKG9iamVjdCBvYikKK3sKKyAgc3RhY2srPSh7b2J9KTsKKyAgaWYgKHNpemVvZihzdGFjayk+TUFYU1RBQ0spCisgICAgc3RhY2s9c3RhY2tbMS4uTUFYU1RBQ0tdOworICByZXR1cm4gMTsKK30KKworbWl4ZWQgcG9wKCkKK3sKKyAgb2JqZWN0IHRtcDsKKyAgaWYgKCFzaXplb2Yoc3RhY2spKQorICB7CisgICAgZXJyPSJzdGFjayB1bmRlcmZsb3ciOworICAgIHRtcD10aGlzX29iamVjdCgpOworICAgIHJldHVybiAwOworICB9CisgIHRtcD1zdGFja1tzaXplb2Yoc3RhY2spLTFdOworICBzdGFjaz1zdGFja1swLi48Ml07CisgIGlmICghdG1wKQorICAgIGVycj0ib3BlcmF0aW5nIG9uIGRlc3RydWN0ZWQgb2JqZWN0IjsKKyAgcmV0dXJuIHRtcDsKK30KKworbWl4ZWQgeHBvcChzdHJpbmcgYXJnKQoreworICBpZiAoIXBvcCgpKQorICAgIGVycj0wOworICByZXR1cm4gYXJnOworfQorCittaXhlZCB0b2dnbGVfc2hvcnQoc3RyaW5nIGFyZykKK3sKKyAgaGlkZV9zaG9ydCA9ICFoaWRlX3Nob3J0OworICBpZiAoaGlkZV9zaG9ydCkKKyAgICB3cml0ZSgiU2hvcnQgZGVzY3JpcHRpb25zIG9mZi5cbiIpOworICBlbHNlCisgICAgd3JpdGUoIlNob3J0IGRlc2NyaXB0aW9ucyBvbi5cbiIpOworICByZXR1cm4gYXJnOworfQorCittaXhlZCBwbChzdHJpbmcgYXJnKQoreworICBzdHJpbmcgd2hvLHJlc3Q7CisgIG9iamVjdCBwOworICB3aG89Z2V0YXJnKGFyZyk7CisgIHJlc3Q9Z2V0cmVzdChhcmcpOworICBpZiAoZXJyKSByZXR1cm4gMDsKKyAgcD1tYXRjaF9saXZpbmcod2hvLDEpOworICBpZiAoIXN0cmluZ3AocCkpCisgIHsKKyAgICBpZiAoIXA9ZmluZF9uZXRkZWFkKHdobykpCisgICAgICBlcnI9InBsYXllciAiK3dobysiIG5vdCBmb3VuZCI7CisgICAgZWxzZSAKKyAgICAgIHB1c2gocCk7CisgIH0KKyAgZWxzZQorICAgIHB1c2goZmluZF9wbGF5ZXIocCkpOworICByZXR1cm4gcmVzdDsKK30KKworbWl4ZWQgbHYoc3RyaW5nIGFyZykKK3sKKyAgc3RyaW5nIHdobyxyZXN0OworICBvYmplY3QgcDsKKyAgd2hvPWdldGFyZyhhcmcpOworICByZXN0PWdldHJlc3QoYXJnKTsKKyAgaWYgKGVycikgcmV0dXJuIDA7CisgIHA9ZmluZF9saXZpbmcod2hvKTsKKyAgaWYgKCFwKQorICAgIGVycj0ibGl2aW5nIG9iamVjdCAiK3dobysiIG5vdCBmb3VuZCI7CisgIGVsc2UKKyAgICBwdXNoKHApOworICByZXR1cm4gcmVzdDsKK30KKworc3RyaW5nIG1lKHN0cmluZyBhcmcpCit7CisgIHB1c2godGhpc19wbGF5ZXIoKSk7CisgIHJldHVybiBhcmc7Cit9CisKK3N0cmluZyBtYWtlX3BhdGgoc3RyaW5nIHBhdGgpCit7CisgIHJldHVybiAic2VjdXJlL21hc3RlciItPl9nZXRfcGF0aCggcGF0aCwgZ2V0ZXVpZCggdGhpc19wbGF5ZXIoKSApICk7Cit9CisKK3N0cmluZyBuZXcoc3RyaW5nIGFyZykKK3sKKyAgc3RyaW5nIHdoYXQscmVzdCxmaWxlOworICBvYmplY3Qgb2I7CisgIHdoYXQ9Z2V0YXJnKGFyZyk7CisgIHJlc3Q9Z2V0cmVzdChhcmcpOworICBmaWxlPW1ha2VfcGF0aCh3aGF0KTsKKyAgZXJyPWNhdGNoKG9iPWNsb25lX29iamVjdChmaWxlKSk7CisgIGlmICghZXJyKQorICB7CisgICAgcHVzaChvYik7CisgICAgb2ItPm1vdmUodGhpc19wbGF5ZXIoKSxNX05PQ0hFQ0spOworICAgIHdyaXRlKCJDcmVhdGVkICIrZGVzYyhvYikrIi5cbiIpOworICB9CisgIGVsc2UKKyAgICBlcnIgPSAidW5hYmxlIHRvIGNyZWF0ZSBvYmplY3QsIGNhdXNlIDogIitlcnI7CisgIHJldHVybiByZXN0OworfQorCitzdGF0aWMgc3RyaW5nIGNyZWF0KHN0cmluZyBhcmcpCit7CisgIHN0cmluZyB3aGF0LHJlc3QsZmlsZTsKKyAgb2JqZWN0IG9iOworICB3aGF0PWdldGFyZyhhcmcpOworICByZXN0PWdldHJlc3QoYXJnKTsKKyAgZmlsZT1tYWtlX3BhdGgod2hhdCk7CisgIGVycj1jYXRjaChvYj1jbG9uZV9vYmplY3QoZmlsZSkpOworICBpZiAoIWVycikKKyAgeworICAgIHB1c2gob2IpOworICAgIHdyaXRlKCJDcmVhdGVkICIrZGVzYyhvYikrIi5cbiIpOworICB9CisgIGVsc2UKKyAgICBlcnIgPSAidW5hYmxlIHRvIGNyZWF0ZSBvYmplY3QsIGNhdXNlIDogIitlcnI7CisgIHJldHVybiByZXN0OworfQorCitzdHJpbmcgeHB1c2goc3RyaW5nIGFyZykKK3sKKyAgc3RyaW5nIHJlc3Qsd2hhdDsKKyAgb2JqZWN0IG9iOworCisgIHdoYXQ9Z2V0YXJnKGFyZyk7CisgIHJlc3Q9Z2V0cmVzdChhcmcpOworICBvYiA9IGZpbmRfb2JqZWN0KHdoYXQpOworICBpZiAoIW9iKQorICAgIGVycj0iT2JqZWN0ICIrd2hhdCsiIG5vdCBmb3VuZCFcbiI7CisgIGVsc2UKKyAgICBwdXNoKG9iKTsKKyAgcmV0dXJuIHJlc3Q7Cit9CisKK3N0YXRpYyBzdHJpbmcgb2Ioc3RyaW5nIGFyZykKK3sKKyAgc3RyaW5nIHdoYXQscmVzdCxmaWxlLHRtcDsKKyAgb2JqZWN0IG9iOworICB3aGF0PWdldGFyZyhhcmcpOworICByZXN0PWdldHJlc3QoYXJnKTsKKyAgZmlsZT1tYWtlX3BhdGgod2hhdCk7Cit7CisgIG9iPWZpbmRfb2JqZWN0KGZpbGUpOworICBpZiAoIW9iKQorICB7CisgICAgdG1wID0gY2F0Y2goY2FsbF9vdGhlcihmaWxlLCI/PyIpKTsKKyAgICBpZiAoIWVycikKKyAgICAgIG9iID0gZmluZF9vYmplY3QoZmlsZSk7CisgIH0KK30KK2lmICghb2IpCit7CisgIGVycj0ib2JqZWN0ICIrZmlsZSsiIG5vdCBmb3VuZCI7CisgIGlmICh0bXApCisgICAgZXJyICs9ICIoIit0bXArIikiOworfQorZWxzZQorcHVzaChvYik7CityZXR1cm4gcmVzdDsKK30KKworc3RyaW5nIGZpbGUoc3RyaW5nIGFyZykKK3sKKyAgcmV0dXJuIG9iKCIvIithcmcpOworfQorCitzdHJpbmcgZmlsZTIoc3RyaW5nIGFyZykKK3sKKyAgcmV0dXJuIG9iKCJ+IithcmcpOworfQorCitzdHJpbmcgc2VsKHN0cmluZyBhcmcpCit7CisgIHN0cmluZyByZXN0O21peGVkIHdoYXQ7CisgIG9iamVjdCBvYixwOworICBvYj1wb3AoKTsKKyAgaWYgKGVycikgcmV0dXJuIGFyZzsKKyAgaWYgKHNzY2FuZihhcmcsIiVkJXMiLHdoYXQscmVzdCk9PTIpCisgIHsKKyAgICBpZiAod2hhdDw9MCkKKyAgICB7CisgICAgICBlcnI9Im5lZ2F0aXZlIGluZGV4IjsKKyAgICAgIHB1c2gob2IpOworICAgICAgcmV0dXJuIGFyZzsKKyAgICB9CisgICAgd2hhdC0tOworICAgIHA9Zmlyc3RfaW52ZW50b3J5KG9iKTsKKyAgICB3aGlsZSAocCAmJiB3aGF0KQorICAgIHsKKyAgICAgIHA9bmV4dF9pbnZlbnRvcnkocCk7CisgICAgICB3aGF0LS07CisgICAgfQorICAgIGlmICghcCkKKyAgICB7CisgICAgICBlcnI9ImluZGV4IHRvIGxhcmdlIjsKKyAgICAgIHB1c2gob2IpOworICAgICAgcmV0dXJuIGFyZzsKKyAgICB9CisgICAgcHVzaChwKTsKKyAgICByZXR1cm4gcmVzdDsKKyAgfQorICB3aGF0PWdldGFyZyhhcmcpOworICByZXN0PWdldHJlc3QoYXJnKTsKKyAgcD1wcmVzZW50KHdoYXQsb2IpOworICBpZiAocCkKKyAgICBwdXNoKHApOworICBlbHNlCisgIHsKKyAgICBwdXNoKG9iKTsKKyAgICBlcnI9d2hhdCsiIG5vdCBwcmVzZW50IGluICIrZGVzYyhvYik7CisgIH0KKyAgcmV0dXJuIHJlc3Q7Cit9CisKK3N0cmluZyBoZXJlKHN0cmluZyBhcmcpCit7CisgIHB1c2goZW52aXJvbm1lbnQodGhpc19wbGF5ZXIoKSkpOworICByZXR1cm4gYXJnOworfQorCitzdHJpbmcgZW52KHN0cmluZyBhcmcpCit7CisgIG9iamVjdCBvYjsKKyAgb2I9cG9wKCk7CisgIGlmICghZXJyKQorICB7CisgICAgaWYgKCFlbnZpcm9ubWVudChvYikpCisgICAgICBlcnI9ZGVzYyhvYikrIiBoYXMgbm8gZW52aXJvbm1lbnQiOworICAgIGVsc2UKKyAgICAgIHB1c2goZW52aXJvbm1lbnQob2IpKTsKKyAgfQorICByZXR1cm4gYXJnOworfQorCitzdHJpbmcgZHVwKHN0cmluZyBhcmcpCit7CisgIG9iamVjdCB0b3M7CisgIHRvcz1wb3AoKTsKKyAgaWYgKCFlcnIpCisgIHsKKyAgICBwdXNoKHRvcyk7CisgICAgcHVzaCh0b3MpOworICB9CisgIHJldHVybiBhcmc7Cit9CisKK3N0cmluZyBzd2FwKHN0cmluZyBhcmcpCit7CisgIG9iamVjdCB0b3M7CisgIGludCBzdHM7CisKKyAgaWYgKChzdHM9c2l6ZW9mKHN0YWNrKSk8MikKKyAgeworICAgIGVycj0ic3RhY2sgdW5kZXJmbG93IjsKKyAgICByZXR1cm4gYXJnOworICB9CisgIHRvcz1zdGFja1tzdHMtMV07CisgIHN0YWNrW3N0cy0xXT1zdGFja1tzdHMtMl07CisgIHN0YWNrW3N0cy0yXT10b3M7CisgIHJldHVybiBhcmc7Cit9CisKK3N0cmluZyBvdmVyKHN0cmluZyBhcmcpCit7CisgIG9iamVjdCBvYjsKKyAgaWYgKHNpemVvZihzdGFjayk8MikKKyAgeworICAgIGVycj0ic3RhY2sgdW5kZXJmbG93IjsKKyAgICByZXR1cm4gYXJnOworICB9CisgIHB1c2goc3RhY2tbc2l6ZW9mKHN0YWNrKS0yXSk7CisgIHJldHVybiBhcmc7Cit9CisKK3N0cmluZyBwaWNrKHN0cmluZyBhcmcpCit7CisgIHN0cmluZyByZXN0OworICBpbnQgbm87CisgIGlmIChzc2NhbmYoYXJnLCIlZCVzIixubyxyZXN0KSE9MiB8fCBubzwwIHx8IG5vPj1zaXplb2Yoc3RhY2spKQorICB7CisgICAgZXJyPSJzdGFjayBzaXplIGV4Y2VlZGVkIjsKKyAgICByZXR1cm4gYXJnOworICB9CisgIGVsc2UKKyAgICBwdXNoKHN0YWNrW3NpemVvZihzdGFjayktbm8tMV0pOworICByZXR1cm4gcmVzdDsKK30KKworc3RyaW5nIHN0cmluZ19kZXNjKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyBvdXQ7CisgIG91dCA9IGltcGxvZGUob2xkX2V4cGxvZGUoc3RyLCJcXCIpLCJcXFxcIik7CisgIG91dCA9IGltcGxvZGUob2xkX2V4cGxvZGUob3V0LCJcbiIpLCJcXG4iKTsKKyAgb3V0ID0gaW1wbG9kZShvbGRfZXhwbG9kZShvdXQsIlwiIiksIlxcXCIiKTsKKyAgcmV0dXJuICJcIiIrb3V0KyJcIiI7Cit9CisKK21peGVkIHJlY19kZXNjKG1peGVkIG9iKQoreworICBpZiAoaW50cChvYikpCisgICAgcmV0dXJuICIiK29iOworICBpZiAoc3RyaW5ncChvYikpCisgICAgcmV0dXJuIHN0cmluZ19kZXNjKChzdHJpbmcpb2IpOworICBpZiAob2JqZWN0cChvYikpCisgICAgcmV0dXJuICJPQkooIitvYmplY3RfbmFtZShvYikrIikiOworICBpZiAoIXBvaW50ZXJwKG9iKSkKKyAgICByZXR1cm4gc3ByaW50ZigiJU8iLG9iKTsKKyAgcmV0dXJuICIoeyAiK2ltcGxvZGUobWFwKG9iLCJyZWNfZGVzYyIsdGhpc19vYmplY3QoKSksIiwgIikrIiB9KSI7Cit9CisKK3N0cmluZyBhcnJheV9kZXNjKG1peGVkIGFycikKK3sKKyAgc3RyaW5nIHN0cixsaW5lLHJlczsKKyAgbWl4ZWQgdG1wOworICBpbnQgaSxqOworICBzdHI9cmVjX2Rlc2MoYXJyKTsKKyAgaWYgKHNpemVvZihzdHIpPD1NQVhMSU5FTEVOLTQpCisgICAgcmV0dXJuICItLT4gIitzdHIrIlxuIjsKKyAgdG1wPW9sZF9leHBsb2RlKHN0ciwiICIpOworICByZXM9IiI7CisgIGxpbmVzPTA7CisgIGk9MTsKKyAgbGluZT0iLS0+ICIrdG1wWzBdKyIgIjsKKyAgZm9yICg7OykKKyAgeworICAgIHdoaWxlIChpPHNpemVvZih0bXApICYmIHNpemVvZihsaW5lKStzaXplb2YodG1wW2ldKzEpPD1NQVhMSU5FTEVOLTEpCisgICAgeworICAgICAgbGluZSs9dG1wW2ldKyIgIjsKKyAgICAgIGkrKzsKKyAgICB9CisgICAgaWYgKHNpemVvZihsaW5lKT09MCkKKyAgICB7CisgICAgICBsaW5lPXRtcFtpXSsiICI7CisgICAgICBpKys7CisgICAgfQorICAgIGlmIChpPHNpemVvZih0bXApKQorICAgICAgbGluZSs9InxcbiI7CisgICAgZWxzZQorICAgICAgbGluZSs9IlxuIjsKKyAgICByZXMrPWxpbmU7CisgICAgbGluZXMrKzsKKyAgICBpZiAobGluZXM+PU1BWExJTkVTKQorICAgICAgcmV0dXJuIHJlcysiKioqIFRSVU5DQVRFRCAqKipcbiI7CisgICAgaWYgKGk+PXNpemVvZih0bXApKQorICAgICAgcmV0dXJuIHJlczsKKyAgICBsaW5lPSIiOworICB9CisgIHJldHVybigwKTsgLy8gbm9uLXZvaWQsIFplc3N0cmEgKG5ldmVyIHJlYWNoZWQpCit9CisKK3N0cmluZyBkZXNjKG9iamVjdCBvYikKK3sKKyAgaWYgKCFvYikKKyAgICByZXR1cm4gIjxkZXN0cnVjdGVkIG9iamVjdD4iOworICBpZiAoIW9iamVjdHAob2IpKQorICAgIHJldHVybiAiPGNvcnJ1cHRlZCBzdGFjayBlbnRyeT4iOworICBpZiAocXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYikpCisgICAgcmV0dXJuIG9iamVjdF9uYW1lKG9iKSsiICIrY2FwaXRhbGl6ZShnZXRldWlkKG9iKSk7CisgIGlmICghaGlkZV9zaG9ydCAmJiBvYi0+c2hvcnQoKSkKKyAgICByZXR1cm4gb2JqZWN0X25hbWUob2IpKyIgIitvYi0+bmFtZSgpOworICBlbHNlCisgICAgcmV0dXJuIG9iamVjdF9uYW1lKG9iKTsKK30KKworc3RyaW5nIHN0ayhzdHJpbmcgYXJnKQoreworICBpbnQgaSxzdHM7CisgIGlmICghKHN0cz1zaXplb2Yoc3RhY2spKSkKKyAgICB3cml0ZSAoIjxlbXB0eSBzdGFjaz5cbiIpOworICBlbHNlCisgICAgZm9yIChpPTE7aTw9c3RzO2krKykKKyAgICB7CisgICAgICB3cml0ZSgiQCIrKGktMSkrIjogIitkZXNjKHN0YWNrW3N0cy1pXSkrIlxuIik7CisgICAgfQorICByZXR1cm4gYXJnOworfQorCitzdHJpbmcgY2xyKHN0cmluZyBhcmcpCit7CisgIHN0YWNrPSh7fSk7CisgIHJldHVybiBhcmc7Cit9CisKK3N0cmluZyBkdW1wKHN0cmluZyBhcmcpCit7CisgIG9iamVjdCBvYjsKKyAgc3RyaW5nIHM7CisgIG9iPXBvcCgpOworICBpZiAoZXJyKSByZXR1cm4gYXJnOworICBwdXNoKG9iKTsKKyAgd3JpdGUoIkZJTEVOQU1FOiAiK29iamVjdF9uYW1lKG9iKSsiICIpOworICBpZiAoIWhpZGVfc2hvcnQgJiYgKHM9b2ItPnNob3J0KCkpKQorICAgIHdyaXRlKCIgU0hPUlQ6ICIrb2ItPm5hbWUoKSk7CisgIHdyaXRlKCJcbiIpOworICByZXR1cm4gYXJnOworfQorCitzdHJpbmcgaW5mbyhzdHJpbmcgYXJnKQoreworICBvYmplY3Qgb2I7CisgIG1peGVkIHM7CisgIGludCBpOworICBvYj1wb3AoKTsKKyAgaWYgKGVycikgcmV0dXJuIGFyZzsKKyAgd3JpdGUoIkZJTEVOQU1FOiAiK29iamVjdF9uYW1lKG9iKSsiICIpOworICBpZiAocz1vYi0+c2hvcnQoKSkKKyAgICB3cml0ZSgiIFNIT1JUOiAiK29iLT5uYW1lKCkpOworICB3cml0ZSgiXG4iKTsKKyAgaWYgKGdldHVpZChvYikpCisgICAgd3JpdGUoIkNSRUFUT1I6ICIrZ2V0dWlkKG9iKSsiXG4iKTsKKyAgaWYgKHM9cXVlcnlfaXBfbnVtYmVyKG9iKSkKKyAgeworICAgIHdyaXRlKCJJUC1OVU1CRVI6ICIrcysiIElQLU5BTUU6ICIrcXVlcnlfaXBfbmFtZShvYikrIiBJRExFOiAiCisJICArIHF1ZXJ5X2lkbGUob2IpKyJcbiIpOworICB9CisgIGlmIChzPXF1ZXJ5X3Nub29wKG9iKSkKKyAgICB3cml0ZSgiU05PT1BFRCBCWTogIitzLT5xdWVyeV9yZWFsX25hbWUoKSsiXG4iKTsKKyAgcz0iIjsKKyAgaWYgKGxpdmluZyhvYikpCisgICAgcyArPSJsaXZpbmcgIjsKKyAgaWYgKG9iLT5xdWVyeV9ucGMoKSkKKyAgICBzKz0ibnBjICI7CisgIGlmIChvYi0+cXVlcnlfZ2VuZGVyX3N0cmluZygpKQorICAgIHMrPW9iLT5xdWVyeV9nZW5kZXJfc3RyaW5nKCk7CisgIGlmIChzIT0iIikKKyAgICB3cml0ZSgiRkxBR1M6ICIrcysiXG4iKTsKKyAgLy8gIHdyaXRlKCJMT05HOlxuIik7CisgIC8vICBpZiAoc3RyaW5ncChzPW9iLT5sb25nKCkpKQorICAvLyAgICB3cml0ZShzKTsKKyAgLy8gIHdyaXRlKCJcbiIpOworICBmb3IgKGk9MDtpPHNpemVvZihxdWVyeV9saXN0KTtpKz0yKQorICB7CisgICAgaWYgKHF1ZXJ5X2xpc3RbaSsxXVswXT09Jy0nKQorICAgICAgcz1vYi0+UXVlcnlQcm9wKHF1ZXJ5X2xpc3RbaSsxXVsxLi5dKTsKKyAgICBlbHNlCisgICAgICBzPWNhbGxfb3RoZXIob2IscXVlcnlfbGlzdFtpKzFdKTsKKyAgICBpZiAocykKKyAgICB7CisgICAgICBwcmludGYoIiVzOiAlT1xuIixxdWVyeV9saXN0W2ldLHMpOworICAgIH0KKyAgfQorICByZXR1cm4gYXJnOworfQorCitzdHJpbmcgZmlsbGVyKGludCBuKQoreworICBzdHJpbmcgczsKKyAgaWYgKCFyZWN1cnNpdmUpIHJldHVybiAiOiAiOworICBzPSI6ICI7CisgIHdoaWxlICgrK248TUFYREVQVEgpCisgICAgcz0iICAiK3M7CisgIHJldHVybiBzOworfQorCit2b2lkIGxpc3RpbnYob2JqZWN0IG9iLGludCBkZXB0aCxzdHJpbmcgcHJlZml4KQoreworICBpbnQgaTsKKyAgb2JqZWN0IHA7CisgIGlmIChkZXB0aDxNQVhERVBUSCkKKyAgeworICAgIHA9Zmlyc3RfaW52ZW50b3J5KG9iKTsKKyAgICBpPTE7CisgICAgaWYgKHApCisgICAgeworICAgICAgd2hpbGUgKHApCisgICAgICB7CisJaWYgKGxpbmVzPmxhc3RsaW5lKSByZXR1cm47CisJaWYgKGxpbmVzPj1maXJzdGxpbmUpCisJICB3cml0ZShwcmVmaXgrIi4iK2krZmlsbGVyKGRlcHRoKStkZXNjKHApKyJcbiIpOworCWxpbmVzKys7CisJaWYgKGxpbmVzPT1sYXN0bGluZSsxICYmIG5leHRfaW52ZW50b3J5KHApKQorCSAgd3JpdGUoIioqKiBUUlVOQ0FURUQgKioqXG4iKTsKKwlpZiAocmVjdXJzaXZlKQorCSAgbGlzdGludihwLGRlcHRoKzEscHJlZml4KyIuIitpKTsKKwlpKys7CisJcD1uZXh0X2ludmVudG9yeShwKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgaWYgKCFkZXB0aCkKKwl3cml0ZSgiPGVtcHR5IGludmVudG9yeT5cbiIpOworICB9Cit9CisKK3N0cmluZyBpbnYoc3RyaW5nIGFyZykKK3sKKyAgb2JqZWN0IG9iOworICBzdHJpbmcgcmVzdDsKKyAgaW50IHRtcDsKKyAgb2I9cG9wKCk7CisgIGxpbmVzPTE7CisgIGZpcnN0bGluZT0xOworICBsYXN0bGluZT1NQVhMSU5FUzsKKyAgaWYgKCFlcnIpCisgIHsKKyAgICBpZiAoc3NjYW5mKGFyZywiOiVkJXMiLHRtcCxyZXN0KT09MikKKyAgICB7CisgICAgICBmaXJzdGxpbmU9dG1wOworICAgICAgbGFzdGxpbmU9dG1wK01BWExJTkVTLTE7CisgICAgICBhcmcgPSByZXN0OworICAgICAgaWYgKHNzY2FuZihhcmcsIjolZCVzIix0bXAscmVzdCk9PTIpCisgICAgICB7CisJbGFzdGxpbmU9dG1wOworCWlmIChsYXN0bGluZTxmaXJzdGxpbmUpCisJICBlcnIgPSAiZmlyc3QgbGluZSA+IGxhc3QgbGluZSI7CisJYXJnPXJlc3Q7CisgICAgICB9CisgICAgfQorICAgIHB1c2gob2IpOworICAgIGxpc3RpbnYob2IsMCwiIik7CisgIH0KKyAgcmVjdXJzaXZlPTA7CisgIHJldHVybiBhcmc7Cit9CisKK29iamVjdCBjYWxsX3Jlc3VsdDsKKworc3RyaW5nIGNhbGwoc3RyaW5nIGFyZykKK3sKKyAgc3RyaW5nIGZ1bmMsYXJnczsKKyAgaW50IHRlbXAsaTsKKyAgc3RyaW5nIHJlc3QsdG1wOworCisgIG9iamVjdCBvYjsKKyAgb2I9cG9wKCk7CisgIGlmIChlcnIpIHJldHVybiBhcmc7CisgIHB1c2gob2IpOworICBmdW5jPWdldGFyZyhhcmcpOworICBhcmdzPWdldHJlc3QoYXJnKTsKKyAgaWYgKGVycikgcmV0dXJuIGFyZ3M7CisgIGFyZ3Y9KHt9KTsKKyAgaT0wOworICB3aGlsZSAoMSkKKyAgeworICAgIGFyZ3M9c3RyaXAoYXJncyk7CisgICAgaWYgKHNzY2FuZihhcmdzLCJdJXMiLHJlc3QpKQorICAgICAgYnJlYWs7CisgICAgaWYgKHNzY2FuZihhcmdzLCIlZCVzIix0bXAscmVzdCk9PTIpCisgICAgeworICAgICAgYXJncz1yZXN0OworICAgICAgYXJndis9KHt0bXB9KTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoc3NjYW5mKGFyZ3MsIlwiJXNcIiVzIix0bXAscmVzdCk9PTIgfHwKKwlzc2NhbmYoYXJncywiXCclc1wnJXMiLHRtcCxyZXN0KT09MiB8fAorCXNzY2FuZihhcmdzLCJ8JXN8JXMiLHRtcCxyZXN0KT09MikKKyAgICB7CisgICAgICBhcmdzPXJlc3Q7CisgICAgICBhcmd2Kz0oe3RtcH0pOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChzc2NhbmYoYXJncywiQCVkJXMiLHRlbXAscmVzdCk9PTIpCisgICAgeworICAgICAgaWYgKHRlbXA8MCB8fCB0ZW1wPj1zaXplb2Yoc3RhY2spKQorICAgICAgeworCWVycj0ic3RhY2tpbmRleCBvdXQgb2YgcmFuZ2UiOworCXJldHVybiBhcmdzOworICAgICAgfQorICAgICAgYXJndis9KHtzdGFja1tzaXplb2Yoc3RhY2spLXRlbXAtMV19KTsKKyAgICAgIGFyZ3M9cmVzdDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICB0bXA9Z2V0YXJnKGFyZ3MpOworICAgIHJlc3Q9Z2V0cmVzdChhcmdzKTsKKyAgICBhcmd2Kz0oe3RtcH0pOworICAgIGlmICh0bXAhPSIiKQorICAgIHsKKyAgICAgIGFyZ3M9cmVzdDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBlcnI9ImJhZCBhcmd1bWVudCB0byBbXSI7CisgICAgcmV0dXJuIGFyZ3M7CisgIH0KKyAgaWYgKHNzY2FuZihhcmdzLCJdJXMiLHJlc3QpIT0xKQorICB7CisgICAgZXJyPSJ0b28gbWFueSBvciB1bnRlcm1pbmF0ZWQgYXJndW1lbnQocykiOworICAgIHJldHVybiBhcmdzOworICB9CisgIGNhbGxfcmVzdWx0PWFwcGx5KCMnY2FsbF9vdGhlcixvYixmdW5jLGFyZ3YpOworICAvLycKKyAgLy8gIGlmIChvYmplY3RwKGNhbGxfcmVzdWx0KSkKKyAgLy8gICAgd3JpdGUoIi0tPiAiK2Rlc2MoY2FsbF9yZXN1bHQpKyJcbiIpOworICAvLyAgZWxzZSBpZiAocG9pbnRlcnAoY2FsbF9yZXN1bHQpKQorICAvLyAgICB3cml0ZShhcnJheV9kZXNjKGNhbGxfcmVzdWx0KSk7CisgIC8vICBlbHNlCisgIC8vICAgIHdyaXRlKCItLT4gIitjYWxsX3Jlc3VsdCsiXG4iKTsKKyAgcHJpbnRmKCItLT4gJU9cbiIsY2FsbF9yZXN1bHQpOworICBwb3AoKTsKKyAgYXJndj0oe30pOworICByZXR1cm4gcmVzdDsKK30KKworc3RyaW5nIHJlc3VsdChzdHJpbmcgYXJnKQoreworICBpZiAob2JqZWN0cChjYWxsX3Jlc3VsdCkpCisgICAgcHVzaChjYWxsX3Jlc3VsdCk7CisgIGVsc2UKKyAgICBlcnI9ImNhbGwgcmV0dXJuZWQgbm8gb2JqZWN0IjsKKyAgcmV0dXJuIGFyZzsKK30KKworaW50IGRlc3Ryb3lhYmxlKG9iamVjdCBvYikKK3sKKyAgaWYgKCFvYikKKyAgICByZXR1cm4gMDsKKyAgaWYgKHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2IpKQorICAgIHJldHVybiAwOworICBpZiAob2I9PXRoaXNfb2JqZWN0KCkpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiAxOworfQorCitzdHJpbmcgY2xuKHN0cmluZyBhcmcpCit7CisgIG9iamVjdCBvYjsKKyAgb2I9cG9wKCk7CisgIGlmICghZXJyKQorICB7CisgICAgY2xlYW4ob2IpOworICAgIHdyaXRlKGRlc2Mob2IpKyIgY2xlYW5lZCB1cC5cbiIpOworICB9CisgIHJlY3Vyc2l2ZT0wOworICByZXR1cm4gYXJnOworfQorCitzdHJpbmcgY2xub2Yoc3RyaW5nIGFyZykKK3sKKyAgb2JqZWN0IG9iOworICBpbnQgcmVjc2F2ZTsKKyAgc3RyaW5nIG5hbWUscmVzdDsKKworICB3cml0ZSgiQ2xuT2YiKTsKKyAgcmVjc2F2ZT1yZWN1cnNpdmU7CisgIHJlY3Vyc2l2ZT0wOworICBvYj1wb3AoKTsKKyAgaWYgKGVycikgcmV0dXJuIGFyZzsKKyAgbmFtZT1nZXRhcmcoYXJnKTsKKyAgcmVzdD1nZXRyZXN0KGFyZyk7CisgIGlmIChlcnIpIHJldHVybiBhcmc7CisgIHJlY3Vyc2l2ZT1yZWNzYXZlOworICBjbGVhbm9mKG5hbWUsb2IpOworICByZWN1cnNpdmU9MDsKKyAgcmV0dXJuIHJlc3Q7Cit9CisKK3ZvaWQgUmVtb3ZlKG9iamVjdCBvYixpbnQgYSkKK3sKKyAgaWYgKCFvYmplY3RwKG9iKSkgcmV0dXJuOworICBpZiAoIWEpCisgIHsKKyAgICBwcmludGYoIlJlbW92aW5nICVPIixvYik7CisgICAgaWYgKCFoaWRlX3Nob3J0KSBwcmludGYoIiAlTyIsb2ItPm5hbWUoKSk7CisgIH0KKyAgY2F0Y2gob2ItPnJlbW92ZSgpKTsKKyAgaWYgKG9iKQorICB7CisgICAgaWYgKCFhKSBwcmludGYoIiBIQVJEIik7CisgICAgZGVzdHJ1Y3Qob2IpOworICB9CisgIHdyaXRlKCJcbiIpOworfQorCit2b2lkIGNsZWFuKG9iamVjdCBvYikKK3sKKyAgb2JqZWN0IHAscDI7CisgIHA9Zmlyc3RfaW52ZW50b3J5KG9iKTsKKyAgd2hpbGUgKGRlc3Ryb3lhYmxlKHApKQorICB7CisgICAgaWYgKHJlY3Vyc2l2ZSkgY2xlYW4ocCk7CisgICAgUmVtb3ZlKHAsMCk7CisgICAgcD1maXJzdF9pbnZlbnRvcnkob2IpOworICB9CisgIHdoaWxlIChwKQorICB7CisgICAgcDI9bmV4dF9pbnZlbnRvcnkocCk7CisgICAgaWYgKGRlc3Ryb3lhYmxlKHAyKSkKKyAgICB7CisgICAgICBpZiAocmVjdXJzaXZlKSBjbGVhbihwMik7CisgICAgICBSZW1vdmUocDIsMCk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHA9cDI7CisgIH0KK30KKworIHZvaWQgY2xlYW5vZihzdHJpbmcgc3RyLG9iamVjdCBvYikKK3sKKyAgb2JqZWN0IHAscDI7CisgIHA9Zmlyc3RfaW52ZW50b3J5KG9iKTsKKyAgd2hpbGUgKHAgJiYgcC0+aWQoc3RyKSAmJiBkZXN0cm95YWJsZShwKSkKKyAgeworICAgIGlmIChyZWN1cnNpdmUpIGNsZWFuKHApOworICAgIFJlbW92ZShwLDApOworICAgIHA9Zmlyc3RfaW52ZW50b3J5KG9iKTsKKyAgfQorICB3aGlsZSAocCkKKyAgeworICAgIHAyPW5leHRfaW52ZW50b3J5KHApOworICAgIGlmIChwMiAmJiBwMi0+aWQoc3RyKSAmJiBkZXN0cm95YWJsZShwMikpCisgICAgeworICAgICAgaWYgKHJlY3Vyc2l2ZSkgY2xlYW4ocDIpOworICAgICAgUmVtb3ZlKHAyLDApOworICAgIH0KKyAgICBlbHNlCisgICAgICBwPXAyOworICB9Cit9CisKK3N0cmluZyBkZXN0KHN0cmluZyBhcmcpCit7CisgIG9iamVjdCBvYjsKKyAgb2I9cG9wKCk7CisgIGlmIChlcnIpIHJldHVybiBhcmc7CisgIGlmICghZGVzdHJveWFibGUob2IpKQorICB7CisgICAgZXJyPWRlc2Mob2IpKyIgbXVzdCBub3QgYmUgZGVzdHJveWVkIjsKKyAgICByZXR1cm4gYXJnOworICB9CisgIFJlbW92ZShvYiwwKTsKKyAgcmV0dXJuIGFyZzsKK30KKworbWl4ZWQgZGlzY28oc3RyaW5nIGFyZykKK3sKKyAgb2JqZWN0IG9iOworCisgIG9iPXBvcCgpOworICBpZiAoZXJyKSByZXR1cm4gYXJnOworICBpZiAoIWludGVyYWN0aXZlKG9iKSkKKyAgeworICAgIGVycj1kZXNjKG9iKSsiIGlzIG5vdCBpbnRlcmFjdGl2ZSI7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmVtb3ZlX2ludGVyYWN0aXZlKG9iKTsKKyAgcmV0dXJuIGFyZzsKK30KKworc3RyaW5nIERlc3Qoc3RyaW5nIGFyZykKK3sKKyAgb2JqZWN0IG9iOworICBvYj1wb3AoKTsKKyAgaWYgKGVycikgcmV0dXJuIGFyZzsKKyAgaWYgKCFkZXN0cm95YWJsZShvYikpCisgIHsKKyAgICBlcnI9ZGVzYyhvYikrIiBtdXN0IG5vdCBiZSBkZXN0cm95ZWQiOworICAgIHJldHVybiBhcmc7CisgIH0KKyAgZGVzdHJ1Y3QoIG9iICk7CisgIHJldHVybiBhcmc7Cit9CisKK3N0cmluZyBtdihzdHJpbmcgYXJnKQoreworICBvYmplY3QgZnJvbSx0bzsKKyAgdG89cG9wKCk7CisgIGlmIChlcnIpIHJldHVybiBhcmc7CisgIGZyb209cG9wKCk7CisgIGlmIChlcnIpIHJldHVybiBhcmc7CisgIGZyb20tPm1vdmUodG8sTV9OT0NIRUNLKTsKKyAgd3JpdGUoIkJld2VnZSAiK2Rlc2MoZnJvbSkrIiBuYWNoICIrZGVzYyh0bykrIi5cbiIpOworICByZXR1cm4gYXJnOworfQorCitzdHJpbmcgX212KHN0cmluZyBhcmcpCit7CisgIG9iamVjdCBmcm9tLHRvOworICB0bz1wb3AoKTsKKyAgaWYgKGVycikgcmV0dXJuIGFyZzsKKyAgZnJvbT1wb3AoKTsKKyAgaWYgKGVycikgcmV0dXJuIGFyZzsKKyAgX19zZXRfZW52aXJvbm1lbnQoZnJvbSx0byk7CisgIHdyaXRlKCJCZXdlZ2UgIitkZXNjKGZyb20pKyIgbmFjaCAiK2Rlc2ModG8pKyIuXG4iKTsKKyAgcmV0dXJuIGFyZzsKK30KKworc3RyaW5nIGRiX2luZm8oc3RyaW5nIGFyZykKK3sKKyAgb2JqZWN0IG9iOworCisgIG9iPXBvcCgpOworICBpZiAoZXJyKSByZXR1cm4gYXJnOworICBkZWJ1Z19pbmZvKDAsb2IpOworICBkZWJ1Z19pbmZvKDEsb2IpOworICByZXR1cm4gYXJnOworfQorCitzdHJpbmcgaW5oZXJpdGxpc3Qoc3RyaW5nIGFyZykKK3sKKyAgb2JqZWN0IG9iOworICBpbnQgaTsKKyAgc3RyaW5nICppbmhlcml0ZWQ7CisKKyAgb2I9cG9wKCk7CisgIGlmIChlcnIpIHJldHVybiBhcmc7CisgIGluaGVyaXRlZD1pbmhlcml0X2xpc3Qob2IpOworICB3cml0ZShvYik7d3JpdGUoIiBpbmhlcml0czpcbiIpOworICBmb3IgKGk9MDtpPHNpemVvZihpbmhlcml0ZWQpO2krKykKKyAgICB3cml0ZShpbmhlcml0ZWRbaV0rIlxuIik7CisgIHJldHVybiBhcmc7Cit9CisKK21peGVkIGdldF9jYWxsb3V0KCkKK3sKKyAgbWl4ZWQgKmNhbGxzLHJldDsKKyAgc3RyaW5nIHRtcDsKKyAgaW50IGksajsKKworICBjYWxscz1jYWxsX291dF9pbmZvKCk7CisgIHJldD0oe30pOworICBpZiAoIXBvaW50ZXJwKGNhbGxzKSB8fCAhc2l6ZW9mKGNhbGxzKSkgCisgICAgcmV0dXJuIDA7CisgIGZvciAoaT0wO2k8c2l6ZW9mKGNhbGxzKTtpKyspCisgIHsKKyAgICBpZiAocG9pbnRlcnAoY2FsbHNbaV0pKQorICAgIHsKKyAgICAgIHRtcD0iIjsKKwkJCWlmIChzaXplb2YoY2FsbHNbaV0pPjMpCisJICAgICAgdG1wKz1zcHJpbnRmKCIlLTUwTyAlLTE2TyIsY2FsbHNbaV1bMF0sY2FsbHNbaV1bMV0pK3NwcmludGYoIiAlLTZPICUtM09cbiIsY2FsbHNbaV1bMl0sY2FsbHNbaV1bM10pOworCQkJZWxzZSAKKwkJCQl0bXArPXNwcmludGYoIiAqKiogJU9cbiIsY2FsbHNbaV0pOworICAgIH0KKyAgICByZXQrPSh7dG1wfSk7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworbWl4ZWQgZ2V0X2hlYXJ0YmVhdCgpCit7CisgIG1peGVkICpvYmo7CisgIHN0cmluZyAqcmV0OworICBpbnQgaTsKKworICBvYmo9aGVhcnRfYmVhdF9pbmZvKCk7CisgIHJldD0oe30pOworICBpZiAoIXBvaW50ZXJwKG9iaikgfHwgc2l6ZW9mKG9iaik9PTApIHJldHVybiAwOworICBmb3IgKGk9MDtpPHNpemVvZihvYmopO2krKykKKyAgICByZXQrPSh7c3ByaW50ZigiJU8gaW4gJU9cbiIsb2JqW2ldLGVudmlyb25tZW50KG9ialtpXSkpfSk7CisgIHJldHVybiByZXQ7Cit9CisKK3N0cmluZyBtYWtlKHN0cmluZyBhcmcpCit7CisgIG9iamVjdCAqbGlzdCwgb2IsIGVudjsKKyAgc3RyaW5nIGZpbGUsdGVtcCxkdW1teTsKKyAgaW50IGksY2xvbmVkOworIAorICBvYj1wb3AoKTsKKyAgaWYgKGVycikgcmV0dXJuIGFyZzsKKyAgaWYgKCFkZXN0cm95YWJsZShvYikpCisgIHsKKyAgICBlcnI9ImNhbid0IHVwZGF0ZSAiK2Rlc2Mob2IpOworICAgIHJldHVybiBhcmc7CisgIH0KKyAgZW52PWVudmlyb25tZW50KG9iKTsKKyAgZmlsZT1vYmplY3RfbmFtZShvYik7CisgIHdyaXRlKCJVcGRhdGluZyAiK29iamVjdF9uYW1lKG9iKSsiLi4uXG4iKTsKKyAgaWYgKHNzY2FuZihmaWxlLCIlcyMlcyIsdGVtcCxkdW1teSk9PTIpCisgIHsKKyAgICBmaWxlPXRlbXA7CisgICAgY2xvbmVkPTE7CisgIH0KKyAgZWxzZQorICAgIGNsb25lZD0wOworICBsaXN0PWFsbF9pbnZlbnRvcnkob2IpOworICBmb3IgKGk9c2l6ZW9mKGxpc3QpLTE7aT49MDtpLS0pCisgICAgaWYgKGxpc3RbaV0gJiYgcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShsaXN0W2ldKSkKKyAgICB7CisgICAgICBsaXN0W2ldLT5tb3ZlKCJyb29tL3ZvaWQiLE1fVFBPUlQgfCBNX1NJTEVOVCB8IE1fTk9fU0hPVyB8IE1fTk9DSEVDSyk7CisgICAgfSBlbHNlCisgICAgICBsaXN0W2ldPTA7CisgIGxpc3QtPSh7MH0pOworICAKKyAgaWYgKG9iKQorICB7CisgICAgUmVtb3ZlKG9iLDEpOworICB9CisgIGlmIChjbG9uZWQpCisgIHsKKyAgICBpZiAob2I9ZmluZF9vYmplY3QoZmlsZSkpCisgICAgeworICAgICAgUmVtb3ZlKG9iLDEpOworICAgIH0KKyAgICBlcnI9Y2F0Y2gob2I9Y2xvbmVfb2JqZWN0KGZpbGUpKTsKKyAgICBpZiAoIWVycikKKyAgICAgIG9iLT5tb3ZlKGVudixNX1RQT1JUIHwgTV9TSUxFTlQgfCBNX05PX1NIT1cgfCBNX05PQ0hFQ0spOworICB9CisgIGVsc2UKKyAgeworICAgIGVycj1jYXRjaChjYWxsX290aGVyKGZpbGUsIj8/PyIpKTsKKyAgICBpZiAoIWVycikKKyAgICAgIG9iPWZpbmRfb2JqZWN0KGZpbGUpOworICAgIGVsc2UKKyAgICAgIG9iPTA7CisgIH0KKyAgaWYgKCFvYikKKyAgeworICAgIHdyaXRlKCJFcnJvciBpbiBsb2FkZWQgb2JqZWN0LiBTdGF5aW5nIGluIHZvaWQgLi4uXG4iKTsKKyAgICByZXR1cm4gYXJnOworICB9CisgIGZvciAoaT1zaXplb2YobGlzdCktMTtpPj0wO2ktLSkKKyAgICBpZiAobGlzdFtpXSkKKyAgICAgIGxpc3RbaV0tPm1vdmUob2IsTV9UUE9SVCB8IE1fU0lMRU5UIHwgTV9OT19TSE9XIHwgTV9OT0NIRUNLKTsKKyAgcmV0dXJuIGFyZzsKK30KKworc3RyaW5nIHJlYyhzdHJpbmcgYXJnKQoreworICByZWN1cnNpdmU9MTsKKyAgcmV0dXJuIGFyZzsKK30KKworc3RyaW5nIG5vcmVjKHN0cmluZyBhcmcpCit7CisgIHJlY3Vyc2l2ZT0wOworICByZXR1cm4gYXJnOworfQorCitzdHJpbmcgcmVhZHZhcihzdHJpbmcgYXJnKQoreworICBzdHJpbmcgcmVzdDsKKyAgaW50IG5vOworICBpZiAoc3NjYW5mKGFyZywiJWQlcyIsbm8scmVzdCkhPTIgfHwgbm88MCB8fCBubz49TUFYVkFSUykKKyAgeworICAgIGVycj0iaWxsZWdhbCB2YXIgbnVtYmVyIjsKKyAgICByZXR1cm4gYXJnOworICB9CisgIGlmICh2YXJhcmVhW25vXSkKKyAgICBwdXNoKHZhcmFyZWFbbm9dKTsKKyAgZWxzZQorICAgIGVycj0idmFyICMiK25vKyIgaXMgZW1wdHkiOworICByZXR1cm4gcmVzdDsKK30KKworc3RyaW5nIHdyaXRldmFyKHN0cmluZyBhcmcpCit7CisgIHN0cmluZyByZXN0OworICBpbnQgbm87CisgIG9iamVjdCBvYjsKKyAgaWYgKHNzY2FuZihhcmcsIiVkJXMiLG5vLHJlc3QpIT0yIHx8IG5vPDAgfHwgbm8+PU1BWFZBUlMpCisgIHsKKyAgICBlcnI9ImlsbGVnYWwgdmFyIG51bWJlciI7CisgICAgcmV0dXJuIGFyZzsKKyAgfQorICBvYj1wb3AoKTsKKyAgaWYgKGVycikgcmV0dXJuIHJlc3Q7CisgIHZhcmFyZWFbbm9dPW9iOworICByZXR1cm4gcmVzdDsKK30KKworc3RyaW5nIHZhcnMoc3RyaW5nIGFyZykKK3sKKyAgaW50IGk7CisgIGZvciAoaT0wO2k8TUFYVkFSUztpKyspCisgIHsKKyAgICBpZiAodmFyYXJlYVtpXSkKKyAgICAgIHdyaXRlKCI8IitpKyI6ICIrZGVzYyh2YXJhcmVhW2ldKSsiXG4iKTsKKyAgfQorICByZXR1cm4gYXJnOworfQorCit2b2lkIHZhbmlzaCgpCit7CisgLy8gUmVtb3ZlQXV0b2xvYWQoKTsKKyAgZGVzdHJ1Y3QoIHRoaXNfb2JqZWN0KCkgKTsKK30KKworbWl4ZWQgcnVzYWdlKHN0cmluZyBhcmcpCit7CisgIG1peGVkICpyZXN1c2FnZTsKKyAgaW50IGksajsKKy8qCisgIHJlc3VzYWdlPSh7bWl4ZWQgKn0pZWZ1bjo6cnVzYWdlKCk7CisgIGZvciAoaT0wO2k8MTg7aSsrKXsKKyAgICB3cml0ZShhbGlnbigoeyJVc2VyIHRpbWUiLCJTeXN0ZW0gdGltZSIsIk1heCByZXMgc2V0IHNpemUiLAorCQkgICJQYWdlIHJlY2xhaW1zIiwiUGFnZSBmYXVsdHMiLAorCQkgICJVbnNoYXJlZCBzdGFjayBzaXplIiwKKwkJICAiU2hhcmVkIHRleHQgc2l6ZSIsIlVuc2hhcmVkIGRhdGEgc2l6ZSIsCisJCSAgIlN5c3RlbSBzd2FwcyIsCisJCSAgIkJsb2NrIGlucHV0IG9wZXJhdGlvbnMiLCJCbG9jayBvdXRwdXQgb3BlcmF0aW9ucyIsCisJCSAgIk1lc3NhZ2VzIHNlbnQiLCJNZXNzYWdlcyByZWNlaXZlZCIsIlNpZ25hbHMgcmVjZWl2ZWQiLAorCQkgICJWb2x1bnRhcnkgY29udGV4dCBzd2l0Y2hlcyIsIkludm9sdW50YXJ5IGNvbnRleHQgc3dpdGNoZXMiLAorCQkgICJUb3RhbCBpbnRlcm5ldCBwYWNrZXRzIiwiVG90YWwgaW50ZXJuZXQgYnl0ZXMifSlbaV0sCisJCTQwKSsiOiAiK3Jlc3VzYWdlW2ldKyJcbiIpOworICB9CisgIHJldHVybiBhcmc7CisgICovCisgIHJldHVybiAoe30pOworfQorCitzdHJpbmcgYWxpZ24oc3RyaW5nIHMsaW50IHgpeworICByZXR1cm4gKHMrIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpWzAuLngtMV07Cit9CisKK3N0YXRpYyBzdHJpbmcgc3dobyhzdHJpbmcgYXJnKQoreworICBvYmplY3QgKnVzZXJsaXN0LCBzbm9vcGVyLCBmb3VuZDttaXhlZCBhY3RpdmU7CisgIGludCBpLGosZG9uZTsKKworICBpZiAoZ2V0ZXVpZCh0aGlzX2ludGVyYWN0aXZlKCkpIT1nZXRldWlkKCkpIHJldHVybiBhcmc7CisgIHVzZXJsaXN0PXVzZXJzKCk7CisgIGFjdGl2ZT0oe30pOworICBmb3IgKGk9c2l6ZW9mKHVzZXJsaXN0KS0xO2k+PTA7aS0tKQorICAgIGlmIChzbm9vcGVyPXF1ZXJ5X3Nub29wKHVzZXJsaXN0W2ldKSkKKyAgICB7CisgICAgICBpZiAobWVtYmVyKGFjdGl2ZSxzbm9vcGVyKT09LTEpCisJYWN0aXZlKz0oe3Nub29wZXJ9KTsKKyAgICAgIGlmIChtZW1iZXIoYWN0aXZlLHVzZXJsaXN0W2ldKT09LTEpCisJYWN0aXZlKz0oe3VzZXJsaXN0W2ldfSk7CisgICAgfQorICBpZiAoIXNpemVvZihhY3RpdmUpKQorICB7CisgICAgcHJpbnRmKCJLZWluZSBha3RpdmVuIFNub29wcy5cbiIpOworICAgIHJldHVybiBhcmc7CisgIH0KKyAgZm9yIChpPXNpemVvZihhY3RpdmUpLTE7aT49MDtpLS0pCisgICAgYWN0aXZlW2ldPSh7YWN0aXZlW2ldfSk7CisgIGZvciAoaT1zaXplb2YoYWN0aXZlKS0xO2k+PTA7aS0tKQorICAgIGlmIChwb2ludGVycChhY3RpdmVbaV0pJiZzbm9vcGVyPXF1ZXJ5X3Nub29wKGFjdGl2ZVtpXVswXSkpCisgICAgeworICAgICAgZG9uZT0wOworICAgICAgZm9yIChqPXNpemVvZihhY3RpdmUpLTE7aj49MCAmJiAhZG9uZTtqLS0pCisJaWYgKHBvaW50ZXJwKGFjdGl2ZVtqXSkgJiYgYWN0aXZlW2pdW3NpemVvZihhY3RpdmVbal0pLTFdPT1zbm9vcGVyKQorCXsKKwkgIGFjdGl2ZVtqXSs9YWN0aXZlW2ldOworCSAgYWN0aXZlW2ldPTA7CisJICBkb25lPTE7CisJfQorICAgIH0KKyAgYWN0aXZlLT0oezB9KTsKKyAgZm9yIChpPTA7aTxzaXplb2YoYWN0aXZlKTtpKyspCisgIHsKKyAgICBmb3IgKGo9MDtqPHNpemVvZihhY3RpdmVbaV0pO2orKykKKyAgICAgIHByaW50ZigiJXMlcyIsKGo9PTA/IiI6IiAtPiAiKSxjYXBpdGFsaXplKGdldHVpZChhY3RpdmVbaV1bal0pKSk7CisgICAgcHJpbnRmKCJcbiIpOworICB9CisgIHJldHVybiBhcmc7Cit9CisKK3N0cmluZyB0aW1lZihpbnQgc2VjKQoreworICBzdHJpbmcgczsKKworICBzPSIiOworICBpZiAoc2VjPj04NjQwMCkKKyAgICBzKz1zcHJpbnRmKCIlZCBkLCAiLHNlYy84NjQwMCk7CisgIGlmIChzZWM+MzYwMCkKKyAgICBzKz1zcHJpbnRmKCIlZCBoLCAiLChzZWMvMzYwMCklMjQpOworICBpZiAoc2VjPjYwKQorICAgIHMrPXNwcmludGYoIiVkIG0sICIsKHNlYy82MCklNjApOworICByZXR1cm4gcytzcHJpbnRmKCIlZCBzIixzZWMlNjApOworfQorCitzdHJpbmcgaWRsZShzdHJpbmcgYXJnKQoreworICBvYmplY3Qgb2I7CisgIGludCBpOworCisgIG9iPXBvcCgpOworICBpZiAoZXJyKSByZXR1cm4gYXJnOworICB3cml0ZShjYXBpdGFsaXplKG9iLT5uYW1lKFdFUikpKyIgIik7CisgIGlmICghcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYikpCisgIHsKKyAgICB3cml0ZSgiaXN0IGtlaW4gZWNodGVyIFNwaWVsZXIuXG4iKTsKKyAgICByZXR1cm4gYXJnOworICB9CisgIGlmICghcXVlcnlfaXBfbnVtYmVyKG9iKSkKKyAgeworICAgIHdyaXRlKCJpc3QgbmV0enRvdC5cbiIpOworICAgIHJldHVybiBhcmc7CisgIH0KKyAgcHJpbnRmKCJpc3QgaWRsZSBzZWl0ICVkIFNla3VuZGVuIixpPXF1ZXJ5X2lkbGUob2IpKTsKKyAgaWYgKGk+NjApCisgICAgcHJpbnRmKCIgKCVzKVxuIix0aW1lZihpKSk7CisgIGVsc2UKKyAgICB3cml0ZSgiXG4iKTsKKyAgcmV0dXJuIGFyZzsKK30KKworc3RyaW5nIHN0YXQoc3RyaW5nIGFyZykKK3sKKyAgb2JqZWN0IG9iOworICBtYXBwaW5nIHF1ZXN0czsKKyAgbWl4ZWQgc3RhdHMsICphcnIsIHRtcCx0bXAyLCBsaXN0OworICBzdHJpbmcgdGl0ZWwsIGxldmVsLCBzdGF0X3N0cix3ZWFwb24sYXJtb3VyOworICBpbnQgcGw7CisgIGludCBpOworICAKKyAgb2I9cG9wKCk7CisgIGlmIChlcnIpCisgICAgcmV0dXJuIGFyZzsKKyAgCisgIHRpdGVsPW9iLT5RdWVyeVByb3AoUF9USVRMRSk7CisgIGlmICghKHBsPXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2IpKSkKKyAgICBsZXZlbD0iTW9uc3Rlcj0iK29sZF9leHBsb2RlKG9iamVjdF9uYW1lKG9iKSwiIyIpWzBdOworICBlbHNlCisgICAgaWYgKElTX0dPRChvYikpCisgICAgICBsZXZlbD0iTXVkLUdvdHQiOworICAgIGVsc2UgaWYgKElTX0FSQ0gob2IpKQorICAgICAgbGV2ZWw9IkVyem1hZ2llciI7CisgICAgZWxzZSBpZiAoSVNfRUxERVIob2IpKQorICAgICAgbGV2ZWw9IldlaXNlciI7CisgICAgZWxzZSBpZiAoSVNfTE9SRChvYikpCisgICAgICBsZXZlbD0iUmVnaW9uc21hZ2llciI7CisgICAgZWxzZSBpZiAoSVNfRE9NQUlOTUVNQkVSKG9iKSkKKyAgICAgIGxldmVsPSJSZWdpb25zbWl0Z2xpZWQiOworICAgIGVsc2UgaWYgKElTX1dJWkFSRChvYikpCisgICAgICBsZXZlbD0iTWFnaWVyIjsKKyAgICBlbHNlIGlmIChJU19MRUFSTkVSKG9iKSkKKyAgICAgIGxldmVsPSJMZWhybGluZyI7CisgICAgZWxzZSBpZiAoSVNfU0VFUihvYikpCisgICAgICBsZXZlbD0iU2VoZXIiOworICAgIGVsc2UgbGV2ZWw9IlNwaWVsZXIiOworICBpZiAoSVNfRE9NQUlOTUVNQkVSKG9iKSkKKyAgICBmb3IgKHRtcD0ic2VjdXJlL21hc3RlciItPmdldF9kb21haW5faG9tZXMoZ2V0ZXVpZChvYikpOworCSBzaXplb2YodG1wKTt0bXA9dG1wWzEuLl0pCisgICAgICBsZXZlbCs9Ii0iK2NhcGl0YWxpemUodG1wWzBdKTsKKyAgaWYgKHBsKQorICB7CisgICAgaWYgKCFpbnRlcmFjdGl2ZShvYikpCisgICAgICBsZXZlbCs9IiwgbmV0enRvdCI7CisgICAgZWxzZQorICAgICAgaWYgKHF1ZXJ5X2lkbGUob2IpPjYwMCkKKwlsZXZlbCs9IiwgaWRsZSI7CisgICAgaWYgKG9iLT5RdWVyeVByb3AoUF9HSE9TVCkpCisgICAgICBsZXZlbCs9IiwgdG90IjsKKyAgICBpZiAob2ItPlF1ZXJ5UHJvcChQX0lOVklTKSkKKyAgICAgIGxldmVsKz0iLCB1bnNpY2h0YmFyIjsKKyAgICBpZiAob2ItPlF1ZXJ5UHJvcChQX0ZST0cpKQorICAgICAgbGV2ZWwrPSIsIGdydWVuIHVuZCBnbGl0c2NoaWciOworICAgIGlmIChvYi0+UXVlcnlQcm9wKFBfVEVTVFBMQVlFUikpCisgICAgICBsZXZlbCs9IiwgVGVzdHNwaWVsZXIiOworICB9CisgIHRtcD1vYi0+UXVlcnlQcm9wKFBfUFJFU0FZKTsKKyAgaWYgKHRtcCAmJiB0bXAhPSIiKQorICAgIHRtcD10bXArIiAiOworICBlbHNlCisgICAgdG1wPSIiOworICB0bXAyPW9iLT5RdWVyeVByb3AoUF9SQUNFKTsKKyAgaWYoIXRtcDIpCisgICAgdG1wMj0iRGluZ3NkYSI7CisgIGFycj1vYi0+UXVlcnlQcm9wKFBfTkFNRSk7CisgIGlmIChwb2ludGVycChhcnIpKSBhcnI9YXJyWzBdOworICBwcmludGYoIiVzJXMgJXMgKCVzKVslc10uXG5cbiIsdG1wfHwiIixhcnJ8fCIiLHRpdGVsfHwiIiwKKwkgdG1wMnx8Ij8/IixsZXZlbHx8Ij8/Iik7CisgIGlmIChwbCkKKyAgICBwcmludGYoIiAgICAgICAgQWx0ZXIgOiAlcy4lc1xuIiwKKwkgICB0aW1lZigyKm9iLT5RdWVyeVByb3AoUF9BR0UpKSwKKwkgICAodG1wPW9iLT5RdWVyeVByb3AoUF9NQVJSSUVEKSk/CisJICAgKCJWZXJoZWlyYXRldCBtaXQgIitjYXBpdGFsaXplKHRtcCkrIi4iKToiIik7CisgIGVsc2UKKyAgICBwcmludGYoIiAgICBBZ2dyZXNzaXYgOiAlNHMgICAgICAgICAgR2VzcHJhZWNoaWcgOiAlZCUlXG4iLAorCSAgIG9iLT5RdWVyeVByb3AoUF9BR0dSRVNTSVZFKT8gIkphIiA6ICJOZWluIiwgCisJICAgb2ItPlF1ZXJ5UHJvcChQX0NIQVRfQ0hBTkNFKSkgOworICBwcmludGYoIiBMZWJlbnNwdW5rdGUgOiBbJTRkLyU0ZF0gICBNYWdpZXB1bmt0ZSA6IFslNGQvJTRkXSAgICIgKworCSAiRXJmYWhydW5nIDogJWRcbiIsCisJIG9iLT5RdWVyeVByb3AoUF9IUCksIG9iLT5RdWVyeVByb3AoUF9NQVhfSFApLCAKKwkgb2ItPlF1ZXJ5UHJvcChQX1NQKSwgb2ItPlF1ZXJ5UHJvcChQX01BWF9TUCksIAorCSBvYi0+UXVlcnlQcm9wKFBfWFApKTsKKyAgcHJpbnRmKCIgICAgICBOYWhydW5nIDogWyUzZC8lZF0gICAgRmx1ZXNzaWdrZWl0IDogWyUzZC8lZF0gICAgICAgIiArCisJICJBbGtvaG9sIDogWyUzZC8lZF1cbiIsCisJIG9iLT5RdWVyeVByb3AoUF9GT09EKSwgb2ItPlF1ZXJ5UHJvcChQX01BWF9GT09EKSwKKwkgb2ItPlF1ZXJ5UHJvcChQX0RSSU5LKSwgb2ItPlF1ZXJ5UHJvcChQX01BWF9EUklOSyksCisJIG9iLT5RdWVyeVByb3AoUF9BTENPSE9MKSwgb2ItPlF1ZXJ5UHJvcChQX01BWF9BTENPSE9MKSkgOworICBzd2l0Y2gob2ItPlF1ZXJ5UHJvcChQX0dFTkRFUikpICB7CisgICAgY2FzZSBGRU1BTEUgOiB0bXAyID0gIndlaWJsaWNoICIgOyBicmVhayA7CisgICAgY2FzZSBNQUxFICAgOiB0bXAyID0gIm1hZW5ubGljaCIgOyBicmVhayA7CisgICAgZGVmYXVsdCAgICAgOiB0bXAyID0gImJvaW5naXNjaCIgOyBicmVhayA7CisgIH0KKyAgcHJpbnRmKCIgICBHZXNjaGxlY2h0IDogJXMgICAgICAgQ2hhcmFrdGVyIDogJS01ZCAgICAgICAgICAgICBTdHVmZSA6ICUtM2RcbiIsCisJIHRtcDIsIG9iLT5RdWVyeVByb3AoUF9BTElHTiksIG9iLT5RdWVyeVByb3AoUF9MRVZFTCkpIDsKKyAgc3RhdHMgPSBvYi0+UXVlcnlQcm9wKFBfQVRUUklCVVRFUykgOworCWlmICghbWFwcGluZ3Aoc3RhdHMpKSBzdGF0cz0oW10pOworICB0bXAgID0gbV9pbmRpY2VzKHN0YXRzKTsgdG1wMiA9IG1fdmFsdWVzKHN0YXRzKTsgc3RhdF9zdHIgPSAiIiA7CisgIGZvcig7IHNpemVvZih0bXApOyB0bXA9dG1wWzEuLl0sdG1wMj10bXAyWzEuLl0pCisgICAgc3RhdF9zdHIgKz0gKHRtcFsgMCBdICsgIlsiICsgdG1wMlsgMCBdICsgIl0gIikgOworICAKKyAgaWYoc3RhdF9zdHIgPT0gIiIpCisgICAgc3RhdF9zdHIgPSAiS2VpbmUiIDsKKyAgZWxzZQorICAgIHN0YXRfc3RyID0gc3RhdF9zdHJbMC4uPDJdOworICAKKyAgcHJpbnRmKCIgICAgICAgICBHZWxkIDogJS05ZCAgICAgICAgICAgU3RhdGkgOiAlc1xuXG4iLCBvYi0+UXVlcnlNb25leSgpLAorCSBzdGF0X3N0cikgOworICAKKyAgd2VhcG9uID0gIktlaW5lIiA7IGFybW91ciA9ICIiIDsKKyAgZm9yKHRtcD1hbGxfaW52ZW50b3J5KG9iKTsgc2l6ZW9mKHRtcCk7IHRtcD10bXBbMS4uXSkKKyAgeworICAgIGlmKHRtcFsgMCBdLT5RdWVyeVByb3AoUF9XSUVMREVEKSkgLy8gZ2V6dWVja3RlIFdhZmZlCisgICAgICB3ZWFwb24gPSAodG1wWyAwIF0tPm5hbWUoV0VSKSkgKyAiICgiICsKKyAgICAgICAgIG9sZF9leHBsb2RlKG9iamVjdF9uYW1lKHRtcFsgMCBdKSwiIyIpWzBdICsgIilbIiArCisgICAgICAgICB0bXBbIDAgXS0+UXVlcnlQcm9wKFBfV0MpICsgIl0iIDsKKworICAgIGlmKHRtcFsgMCBdLT5RdWVyeVByb3AoUF9XT1JOKSkgICAvLyBnZXRyYWdlbmUgUnVlc3R1bmcKKyAgICAgIGFybW91ciArPSAodG1wWyAwIF0tPm5hbWUoV0VSKSkgKyAiWyIgKworICAgICAgICAgIHRtcFsgMCBdLT5RdWVyeVByb3AoUF9BQykgKyAiXSIgKworICAgICIsICIgOworICB9CisKKyAgaWYoYXJtb3VyID09ICIiKQorICAgIGFybW91ciA9ICJLZWluZSIgOworICBlbHNlCisgIHsKKyAgICB0bXAgPSBvbGRfZXhwbG9kZShicmVha19zdHJpbmcoYXJtb3VyWzAuLnNpemVvZihhcm1vdXIpIC0gM10sCisJCQkgICAgICAgNjMpLCAiXG4iKSA7CisgICAgYXJtb3VyID0gdG1wWyAwIF0gOworICAgIHRtcD10bXBbMS4uXTsKKyAgICBmb3IgKDtzaXplb2YodG1wKTsgdG1wPXRtcFsxLi5dKQorICAgICAgYXJtb3VyICs9ICJcbiAgICAgICAgICAgICAgICAiICsgdG1wWyAwIF0gOworICB9CisgIAorICBwcmludGYoIiAgIFdhZmZlKCUzZCkgOiAlc1xuUnVlc3R1bmcoJTNkKSA6ICVzXG4iLAorCSBvYi0+UXVlcnlQcm9wKFBfVE9UQUxfV0MpLCB3ZWFwb24sCisJIG9iLT5RdWVyeVByb3AoUF9UT1RBTF9BQyksIGFybW91cikgOworICAKKyAgbGlzdCA9IG9iLT5RdWVyeUVuZW1pZXMoKTsKKyAgaWYgKHBvaW50ZXJwKGxpc3QpKSAKKyAgeworICAgIGxpc3Q9bGlzdFswXTsKKyAgICB0bXAyID0gIiIgOworICAgIGZvcihpPXNpemVvZihsaXN0KS0xIDsgaT49MDtpLS0pCisgICAgICBpZiAob2JqZWN0cChsaXN0W2ldKSkKKyAgICAgICAgdG1wMiArPSAobGlzdFsgaSBdLT5uYW1lKFdFUikgKyAiLCAiKSA7CisgICAgaWYodG1wMiAhPSAiIikKKyAgICAgIHByaW50ZigiICAgICAgIEZlaW5kZSA6ICVzLlxuIiwgdG1wMlswLi48M10pOworICB9CisgIAorICAvLyA4LlplaWxlIDogR2Vsb2VzdGUgQXVmZ2FiZW4KKyAgaWYocGwpCisgIHsKKyAgICBwcmludGYoIGJyZWFrX3N0cmluZyggCisgICAgICAgICAgICAgIENvdW50VXAobV9pbmRpY2VzKG9iLT5RdWVyeVByb3AoUF9RVUVTVFMpKSksIAorICAgICAgICAgICAgICA3NSwKKyAgICAgICAgICAgICAgIiAgICAgQXVmZ2FiZW4gOiAiLAorICAgICAgICAgICAgICBCU19JTkRFTlRfT05DRSkpOworICAgIGlmKCgodG1wMiA9IG9iLT5RdWVyeVByb3AoUF9NQUlMQUREUikpICE9ICJub25lIikgJiYgdG1wMiAmJgorICAgICAgICh0bXAyICE9ICIiKSkKKyAgICAgIHRtcDIgPSAiICgiICsgdG1wMiArICIpIiA7CisgICAgZWxzZQorICAgICAgdG1wMiA9ICIiIDsKKyAgfQorICBlbHNlCisgICAgdG1wMiA9ICIiIDsKKworICBpZihlbnZpcm9ubWVudChvYikpCisgICAgcHJpbnRmKCIgICBBdWZlbnRoYWx0IDogJXMlcy5cbiIsCisJICAgb2xkX2V4cGxvZGUob2JqZWN0X25hbWUoZW52aXJvbm1lbnQob2IpKSwiIyIpWzBdLCB0bXAyKSA7CisKKyAgcmV0dXJuIGFyZzsKK30KKworc3RyaW5nIHNjYW4oc3RyaW5nIGFyZykKK3sKKyAgb2JqZWN0IG9iOworICBtaXhlZCB0bXAsdG1wMix0bXAzOworICBpbnQgaTsKKworICBvYj1wb3AoKTsKKyAgaWYgKGVycikgcmV0dXJuIGFyZzsKKyAgaWYgKHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2IpKQorICAgIHByaW50ZigiU3BpZWxlcjogJXMsIExldmVsOiAlZCwgV2l6bGV2ZWw6ICVkXG4iLAorCSAgIGNhcGl0YWxpemUoZ2V0dWlkKG9iKSksIG9iLT5RdWVyeVByb3AoUF9MRVZFTCksCisJICAgcXVlcnlfd2l6X2xldmVsKG9iKSk7CisgIGVsc2UKKyAgICBwcmludGYoIk1vbnN0ZXIsIFVJRDogJXMsIEVVSUQ6ICVzLCBMZXZlbDogJWRcbiIsCisJICAgZ2V0dWlkKG9iKSwgKGdldGV1aWQob2IpP2dldGV1aWQob2IpOiIwIiksIG9iLT5RdWVyeVByb3AoUF9MRVZFTCkpOworICB0bXA9b2ItPnNob3J0KCk7CisgIGlmICghc3RyaW5ncCh0bXApfHwhc2l6ZW9mKHRtcCkpCisgICAgdG1wPXNwcmludGYoIiglcyAlcyAlcyAlcykiLG9iLT5RdWVyeVByb3AoUF9QUkVTQVkpKyIiLAorCQlvYi0+UXVlcnlQcm9wKFBfTkFNRSkrIiIsb2ItPlF1ZXJ5UHJvcChQX1RJVExFKSsiIiwKKwkJKGludGVyYWN0aXZlKG9iKT8iIjoiKG5ldHp0b3QiKSk7CisgIGVsc2UKKyAgICB0bXA9dG1wWzAuLjwzXTsKKyAgcHJpbnRmKCIlcywgUmFzc2U6ICVzXG4iLHRtcCwgIiIrb2ItPlF1ZXJ5UHJvcChQX1JBQ0UpKTsKKyAgcHJpbnRmKCJTdGF0czogICAgIik7CisgIHRtcD1vYi0+UXVlcnlQcm9wKFBfQVRUUklCVVRFUyk7CisgIHRtcDM9b2ItPlF1ZXJ5UHJvcChQX0FUVFJJQlVURVNfT0ZGU0VUUyk7CisgIGlmICghdG1wKQorICAgIHByaW50Zigia2VpbmVcbiIpOworICBlbHNlCisgIHsKKyAgICB0bXAyPW1faW5kaWNlcyh0bXApOworICAgIGZvciAoaT0wO2k8c2l6ZW9mKHRtcDIpO2krKykKKwl7CisgICAgICBwcmludGYoIiVzJXM6ICVkIiwoaT4wPyIsICI6IiIpLHRtcDJbaV0sdG1wW3RtcDJbaV1dKTsKKwkgIGlmICh0bXAzW3RtcDJbaV1dKQorCSAgICBwcmludGYoIiUrZCIsdG1wM1t0bXAyW2ldXSk7CisgICAgfQorICAgIHByaW50ZigiXG4iKTsKKyAgfQorICBwcmludGYoIlJ1ZXN0dW5nOiAlLTZkICAgIFdhZmZlbjogJS02ZCAgICAgIFZvcnNpY2h0OiAlLTZkICAgR2VzY2hsZWNodDogIiwKKwkgb2ItPlF1ZXJ5UHJvcChQX1RPVEFMX0FDKSxvYi0+UXVlcnlQcm9wKFBfVE9UQUxfV0MpLAorCSBvYi0+UXVlcnlQcm9wKFBfV0lNUFkpKTsKKyAgaWYgKCEodG1wPW9iLT5RdWVyeVByb3AoUF9HRU5ERVIpKSkKKyAgICBwcmludGYoIk5cbiIpOworICBlbHNlCisgIHsKKyAgICBpZiAodG1wPT0yKQorICAgICAgcHJpbnRmKCJGXG4iKTsKKyAgICBlbHNlCisgICAgICBwcmludGYoIk1cbiIpOworICB9CisgIGlmICh0bXA9b2ItPlF1ZXJ5UHJvcChQX01BUlJJRUQpKQorICAgIHByaW50ZigiVmVyaGVpcmF0ZXQgbWl0ICVzLlxuIixjYXBpdGFsaXplKHRtcCkpOworICBwcmludGYoIkxlYmVuc3B1bmt0ZTogJTRkIFslNGRdLCBNYWdpZXB1bmt0ZTogJTRkIFslNGRdLCBFcmY6ICUtOGRcbiIsCisJIG9iLT5RdWVyeVByb3AoUF9IUCksIG9iLT5RdWVyeVByb3AoUF9NQVhfSFApLCAKKwkgb2ItPlF1ZXJ5UHJvcChQX1NQKSwgb2ItPlF1ZXJ5UHJvcChQX01BWF9TUCksCisJIG9iLT5RdWVyeVByb3AoUF9YUCkpOworICBpZiAobGl2aW5nKG9iKSkKKyAgeworICAgIHRtcD1wcmVzZW50KCJnZWxkIixvYik7CisgICAgaWYgKHRtcCkKKyAgICAgIHRtcD10bXAtPlF1ZXJ5UHJvcChQX0FNT1VOVCk7CisgICAgcHJpbnRmKCJUcmFlZ3QgJTZkICglNmQpIGcuIEVpZ2VuZ2V3aWNodCAlNmQgZy4gJTZkIE11ZW56ZW4uXG4iLAorCSAgIG9iLT5xdWVyeV93ZWlnaHRfY29udGVudHMoKSxvYi0+UXVlcnlQcm9wKFBfTUFYX1dFSUdIVCksCisJICAgb2ItPlF1ZXJ5UHJvcChQX1dFSUdIVCksdG1wKTsKKyAgICBpZiAodG1wPW9iLT5TZWxlY3RFbmVteSgpKQorICAgICAgcHJpbnRmKCJLYWVtcGZ0IGdlZ2VuICVzIFslT11cbiIsdG1wLT5uYW1lKFdFTiksdG1wKTsKKyAgfQorICBwcmludGYoIkVOVjogJXMiLAorCSAoKHRtcD1lbnZpcm9ubWVudChvYikpP29iamVjdF9uYW1lKHRtcCk6Ii0gZmFicmljIG9mIHNwYWNlIC0iKSk7CisgIGlmKHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2IpKQorICB7CisgICAgcHJpbnRmKCIsIEVNYWlsOiAlc1xuIiwgb2ItPlF1ZXJ5UHJvcChQX01BSUxBRERSKSsiIik7CisgICAgdG1wPSIvc2VjdXJlL21hc3RlciItPmZpbmRfdXNlcmluZm8oZ2V0dWlkKG9iKSk7CisgICAgaWYgKHBvaW50ZXJwKHRtcCkgJiYgc2l6ZW9mKHRtcCk+VVNFUl9ET01BSU4pCisgICAgeworICAgICAgdG1wPXRtcFtVU0VSX0RPTUFJTl07CisgICAgICBpZiAocG9pbnRlcnAodG1wKSAmJiBzaXplb2YodG1wKSkKKyAgICAgIHsKKwlwcmludGYoIkxvcmQgaW46ICIpOworCWZvciAodG1wMj0wO3RtcDI8c2l6ZW9mKHRtcCk7dG1wMisrKQorCSAgcHJpbnRmKCIlcyVzIiwodG1wMj4wPyIsICI6IiIpLCIiK3RtcFt0bXAyXSk7CisJcHJpbnRmKCIuXG4iKTsKKyAgICAgIH0KKyAgICB9CisgICAgdG1wPSIvc2VjdXJlL21hc3RlciItPmdldF9kb21haW5faG9tZXMoZ2V0dWlkKG9iKSk7CisgICAgaWYgKHBvaW50ZXJwKHRtcCkmJnNpemVvZih0bXApPjApCisgICAgeworICAgICAgcHJpbnRmKCJNaXRnbGllZCBpbjogIik7CisgICAgICBmb3IgKHRtcDI9MDt0bXAyPHNpemVvZih0bXApO3RtcDIrKykKKyAgICAgCXByaW50ZigiJXMlcyIsKHRtcDI+MD8iLCAiOiIiKSwiIit0bXBbdG1wMl0pOworICAgICAgcHJpbnRmKCIuXG4iKTsKKyAgICB9CisgICAgcHJpbnRmKCJRdWVzdHM6ICIpOworICAgIHRtcD1vYi0+UXVlcnlQcm9wKFBfUVVFU1RTKTsKKyAgICBpZiAodG1wPT0oe30pfHwhcG9pbnRlcnAodG1wKSkKKyAgICAgIHByaW50ZigiS2VpbmUuXG4iKTsKKyAgICBlbHNlCisgICAgeworICAgICAgdG1wMj0iIjsKKyAgICAgIHRtcC09KHsoe30pLDB9KTsKKyAgICAgIGZvciAoaT0wOyBpPHNpemVvZih0bXApOyBpKyspCisJdG1wMis9c3ByaW50ZigiJXMlcyIsKGk/IiwgIjoiIiksdG1wW2ldWzBdKTsKKyAgICAgIHRtcD1icmVha19zdHJpbmcodG1wMiw3OSw4KTsKKyAgICAgIHRtcD10bXBbOC4uXTsKKyAgICAgIHByaW50ZigiJXMiLHRtcCk7CisgICAgfQorICAgIHByaW50ZigiUEtpbGxzOiAlZCAiLG9iLT5RdWVyeVByb3AoUF9LSUxMUykpOworICAgIHByaW50ZigiLCBRdWVzdFBvaW50czogJWQgKCVkLyVkKSwgQWx0ZXI6ICVzXG4iLG9iLT5RdWVyeVByb3AoUF9RUCksb2ItPlF1ZXJ5UHJvcChQX05FRURFRF9RUCksUU0tPlF1ZXJ5TWF4UVAoKSx0aW1lZigyKm9iLT5RdWVyeVByb3AoUF9BR0UpKSk7CisgICAgaWYgKGludGVyYWN0aXZlKG9iKSkKKyAgICB7CisgICAgICBwcmludGYoIkZyb206ICVzICglcykgWyVzXVxuIixxdWVyeV9pcF9uYW1lKG9iKSxxdWVyeV9pcF9udW1iZXIob2IpLGNvdW50cnkocXVlcnlfaXBfbmFtZShvYikpKTsKKyAgICAgIHRtcD1xdWVyeV9pZGxlKG9iKTsKKyAgICAgIHByaW50ZigiSWRsZSBzZWl0ICVkIFNla3VuZGVuIix0bXApOworICAgICAgaWYgKHRtcD42MCkKKyAgCXByaW50ZigiICglcykiLHRpbWVmKHRtcCkpOworCQkJcHJpbnRmKCIsIGNtZCBhdmc6ICVkIixvYi0+UXVlcnlQcm9wKCJjb21tYW5kX2F2ZXJhZ2UiKSk7CisgICAgICBwcmludGYoIiwgbm9jaCAlZCBaVCB6dSBmaW5kZW4uXG5HZXNub29wZWQgdm9uOiAlc1xuIiwKKwkgICAgICgodG1wPW9iLT5RdWVyeVByb3AoUF9QT1RJT05ST09NUykpP3NpemVvZih0bXApOjApLAorCSAgICAgKCh0bXA9cXVlcnlfc25vb3Aob2IpKT9jYXBpdGFsaXplKGdldHVpZCh0bXApKToiTmllbWFuZGVtIikpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgdG1wPWdldHVpZChvYik7CisgICAgICB0bXA9ZmlsZV90aW1lKCJzYXZlLyIrdG1wWzAuLjBdKyIvIit0bXArIi5vIik7CisgICAgICB0bXA9dGltZSgpLXRtcDsKKyAgICAgIHByaW50ZigiS2FtIHZvbjogJXMsIHZvcjogJWQgcyglcylcbiIsCisJICAgICBvYi0+UXVlcnlQcm9wKFBfQ0FMTEVEX0ZST01fSVApLHRtcCx0aW1lZih0bXApKTsgIAorICAgIH0KKyAgfQorICBlbHNlCisgICAgcHJpbnRmKCJcbiIpOworICByZXR1cm4gYXJnOworfQorCittaXhlZCBkaW5mbyhzdHJpbmcgYXJnKQoreworICBvYmplY3Qgb2I7CisKKyAgb2I9cG9wKCk7CisgIGlmICghb2IpCisgICAgcmV0dXJuIDE7CisgIGRlYnVnX2luZm8oMCxvYik7CisgIHJldHVybiBhcmc7Cit9CisKK21peGVkIG1pbmZvKHN0cmluZyBhcmcpCit7CisgIG9iamVjdCBvYjsKKworICBvYj1wb3AoKTsKKyAgaWYgKCFvYikKKyAgICByZXR1cm4gMTsKKyAgZGVidWdfaW5mbygxLG9iKTsKKyAgcmV0dXJuIGFyZzsKK30KKwordm9pZCBkdW1wX2xpc3QobWl4ZWQgd2hhdCkKK3sKKyAgaW50IGksczsKKworICBpZiAoIXBvaW50ZXJwKHdoYXQpfHwhKHM9c2l6ZW9mKHdoYXQpKSkKKyAgICByZXR1cm47CisgIGZvciAoaT0wO2k8cztpKyspCisgICAgd3JpdGUod2hhdFtpXSk7Cit9CisKK3N0cmluZyBjYWxsb3V0KHN0cmluZyBhcmdzKQoreworICBkdW1wX2xpc3QoZ2V0X2NhbGxvdXQoKSk7CisgIHJldHVybiBhcmdzOworfQorCitzdHJpbmcgaGVhcnRiZWF0KHN0cmluZyBhcmdzKQoreworICBkdW1wX2xpc3QoZ2V0X2hlYXJ0YmVhdCgpKTsKKyAgcmV0dXJuIGFyZ3M7Cit9CisKK3N0cmluZyBkdW1wbGlzdHMoc3RyaW5nIGFyZ3MpCit7CisgIHN0cmluZyBmaWxlbjsKKyAgc3RyaW5nICpsaXN0OworICBpbnQgaSxzOworCisgIGlmICghZ2V0ZXVpZCh0aGlzX29iamVjdCgpKSkKKyAgICByZXR1cm4gYXJnczsKKyAgZmlsZW49Ii9wbGF5ZXJzLyIrZ2V0ZXVpZCh0aGlzX29iamVjdCgpKSsiL0xJU1RTLkxVUEUiOworICB3cml0ZSgiRHVtcGluZyB0byAiK2ZpbGVuKyIgLi4uICIpOworICBpZiAoZmlsZV9zaXplKGZpbGVuKT49MCkKKyAgICBybShmaWxlbik7CisgIHdyaXRlX2ZpbGUoZmlsZW4sIk9CSkVDVCBXSVRIIEFDVElWRSBIRUFSVF9CRUFUOlxuIik7CisgIGxpc3Q9Z2V0X2hlYXJ0YmVhdCgpOworICBpZiAoIWxpc3QgfHwgIShzPXNpemVvZihsaXN0KSkpCisgICAgd3JpdGVfZmlsZShmaWxlbiwiTk9ORVxuIik7CisgIGZvciAoaT0wO2k8cztpKyspCisgICAgd3JpdGVfZmlsZShmaWxlbixsaXN0W2ldKTsKKyAgd3JpdGVfZmlsZShmaWxlbiwiXG5cblJVTk5JTkcgQ0FMTF9PVVRTOlxuIik7CisgIGxpc3Q9Z2V0X2NhbGxvdXQoKTsKKyAgaWYgKCFsaXN0IHx8ICEocz1zaXplb2YobGlzdCkpKQorICAgIHdyaXRlX2ZpbGUoZmlsZW4sIk5PTkVcbiIpOworICBmb3IgKGk9MDtpPHM7aSsrKQorICAgIHdyaXRlX2ZpbGUoZmlsZW4sbGlzdFtpXSk7CisgIHdyaXRlKCJkb25lLlxuIik7CisgIHJldHVybiBhcmdzOworfQorCittaXhlZCByZW5ld19wbGF5ZXIoc3RyaW5nIGFyZykKK3sKKyAgb2JqZWN0IG9iOworCisgIG9iPXBvcCgpOworICBpZiAoIW9iKQorICAgIHJldHVybiAxOworICBpZiAoIW9iamVjdHAob2IpJiYhaW50ZXJhY3RpdmUob2IpKQorICB7CisgICAgZXJyPWRlc2Mob2IpKyIgaXMgbm90IGFuIGludGVyYWN0aXZlIHBsYXllciI7CisgICAgcmV0dXJuIGFyZzsKKyAgfQorICBpZiAoKGVycj0iL3NlY3VyZS9tYXN0ZXIiLT5yZW5ld19wbGF5ZXJfb2JqZWN0KG9iKSk8MCkKKyAgICBlcnI9ImVycm9yICIrZXJyKyIgd2hlbiByZW5ld2luZyAiK2Rlc2Mob2IpOworICByZXR1cm4gYXJnOworfQorCittaXhlZCBjb3B5X2xkZmllZChzdHJpbmcgYXJnKQoreworICBvYmplY3Qgb2IsIG5ldzsKKyAgbWFwcGluZyBwcm9wczsKKworICBvYj1wb3AoKTsKKyAgaWYgKCFvYikKKyAgICByZXR1cm4gMTsKKyAgaWYgKCFvYmplY3RwKG9iKSkKKyAgeworICAgIGVycj1kZXNjKG9iKSsiIGlzIG5vdCBhbiB2YWxpZCBvYmplY3QiOworICAgIHJldHVybiBhcmc7CisgIH0KKyAgbmV3PWNsb25lX29iamVjdChvbGRfZXhwbG9kZShvYmplY3RfbmFtZShvYiksIiMiKVswXSk7CisgIHByb3BzPW9iLT5RdWVyeVByb3BlcnRpZXMoKTsKKyAgbmV3LT5TZXRQcm9wZXJ0aWVzKG9iLT5RdWVyeVByb3BlcnRpZXMoKSk7CisgIHB1c2gobmV3KTsKKyAgbmV3LT5tb3ZlKHRoaXNfcGxheWVyKCksTV9OT0NIRUNLKTsKKyAgcmV0dXJuIGFyZzsKK30KKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL2x1cGUuZG9jIGIvb2JqL3Rvb2xzL2x1cGUuZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMzk0NmYKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvbHVwZS5kb2MKQEAgLTAsMCArMSwxNDAgQEAKK1RoZSBsZW5zIG9iamVjdCB1c2VzIGEgc3RhY2sgdG8gbWFuaXB1bGF0ZSBvYmplY3RzLiBTb21lIGNvbW1hbmRzIHB1c2ggb2JqZWN0cworb24gdGhlIHN0YWNrLCBzb21lIHBvcCB0aGVtIGFnYWluIG9mZiB0aGUgc3RhY2sgYW5kIHVzZSB0aGVtIGZvciB2YXJpb3VzCitwdXJwb3Nlcy4gVGhlcmUgbWF5IGJlIG11bHRpcGxlIGNvbW1hbmRzIG9uIGEgc2luZ2xlIGxpbmUsIHNlcGFyYXRlZCBieQorc3BhY2VzLiBUaGUgbnVtYmVyIG9mIHNwYWNlcyBiZXR3ZWVuIGNvbW1hbmRzIG9yIGJldHdlZW4gY29tbWFuZHMgYW5kCithcmd1bWVudHMgaXMgbm90IGNyaXRpY2FsLCBpLmUuIHRoZXJlIG1heSBhbHNvIGJlIHR3byBvciBtb3JlIHNwYWNlcy4KKworTm90YXRpb246CisJPGFyZz4JOiBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgd2hpY2ggZG9lc24ndCBjb250YWluIHNwYWNlcyBvcgorCQkgIGRvdHMuIElmIGl0IGRvZXMsIHVzZSAiLi4uIiwgJy4uLicgb3IgfC4uLnwgdG8gZW5jbG9zZQorCQkgIGl0LgorCTxudW1iZXI+OiBhbiBpbnRlZ2VyLCBwb3NpdGl2ZSBvciBuZWdhdGl2ZS4KKwk8ZmlsZW5hbWU+OiBzYW1lIGFzIDxhcmc+ICh1c2UgcXVvdGVzIGlmIGl0IGNvbnRhaW5zIGRvdHMpLiBNYXkgYmUKKwkJICBhYnNvbHV0ZSAoc3RhcnRpbmcgd2l0aCAvKSByZWxhdGl2ZSB0byB5b3VyIGhvbWUgZGlyZWN0b3J5CisJCSAgKHN0YXJ0aW5nIHdpdGggfi8pIG9yIHJlbGF0aXZlIHRvIHNvbWVib2R5IGVsc2UncyBob21lCisJCSAgZGlyZWN0b3J5IChzdGFydGluZyB3aXRoIH5uYW1lLykuCisJPGZ1bmN0aW9uPjogTmFtZSBvZiBhbiBMUEMtZnVuY3Rpb24uCisKK0NvbW1hbmRzOgorCXBsIDxhcmc+CTogcHVzaCBwbGF5ZXIgb2JqZWN0IHdpdGggbmFtZSA8YXJnPi4KKwlsdiA8YXJnPgk6IHB1c2ggbGl2aW5nIG9iamVjdCB3aXRoIG5hbWUgPGFyZz4uCisJbWUJCTogcHVzaCB5b3Vyc2VsZi4KKwloZXJlCQk6IHB1c2ggdGhlIGxvY2F0aW9uIHlvdSBhcmUgaW4uCisJb2IgPGZpbGVuYW1lPgk6IGxvYWQgJiBwdXNoIHRoZSBvYmplY3QgZGVub3RlZCBieSA8ZmlsZW5hbWU+LgorCTxmaWxlbmFtZT4JOiBzYW1lIGFzIG9iIDxmaWxlbmFtZT4gaWYgaXQgYmVnaW5zIHdpdGggLyBvciB+LgorCW5ldyA8ZmlsZW5hbWU+CTogY2xvbmUgJiBwdXNoIHRoZSBvYmplY3QgZGVub3RlZCBieSA8ZmlsZW5hbWU+LgorCQkJICBUaGVyZWFmdGVyIG1vdmUgaXQgaW4geW91ciBpbnZlbnRvcnkuCisgICAgICAgIGNyZWF0IDxmaWxlbmFtZT46IHNhbWUgYXMgbmV3LCBidXQgZG9uJ3QgbW92ZSBpdCBpbnRvIHlvdXIgaW52ZW50b3J5LgorCWVudgkJOiBwdXNoIHRoZSBlbnZpcm9ubWVudCBvZiB0aGUgVE9TLgorCS48bnVtYmVyPgk6IHB1c2ggdGhlIG50aCBvYmplY3QgaW4gdGhlIGludmVudG9yeSBvZiB0aGUgVE9TLgorCS48YXJnPgkJOiBwdXNoIHRoZSBvYmplY3Qgd2l0aCBpZCA8YXJnPiBpbiB0aGUgaW52ZW50b3J5CisJCQkgIG9mIHRoZSBUT1MuCisJPQkJOiBkaXNwbGF5IHRoZSBUT1MuCisJaW5mbwkJOiBzaG93IGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoZSBUT1MuCisJc3RrCQk6IHNob3cgdGhlIGVudGlyZSBzdGFjay4KKwljbHIJCTogY2xlYXIgdGhlIGVudGlyZSBzdGFjay4KKwlkdXAJCTogZHVwbGljYXRlIHRoZSB0b3Btb3N0IHN0YWNrIGVudHJ5LgorCXBvcAkJOiBkaXNjYXJkIHRoZSB0b3Btb3N0IHN0YWNrIGVudHJ5LgorCXN3YXAJCTogZXhjaGFuZ2UgdGhlIHR3byB0b3Btb3N0IHN0YWNrIGVudHJpZXMuCisJb3ZlcgkJOiBwdXNoIHRoZSBlbnRyeSBzZWNvbmQgZnJvbSB0b3AuCisJQDxudW1iZXI+CTogcHVzaCB0aGUgc3RhY2sgZW50cnkgY29ycmVzcG9uZGluZyB0byB0aGUgbnVtYmVyLgorCQkJICBUaGUgdG9wbW9zdCBvbmUgaGFzIG51bWJlciAwLgorCWludgkJOiBzaG93IHRoZSBpbnZlbnRvcnkgb2YgdGhlIFRPUy4KKwljbG4JCTogY2xlYW4gdGhlIGludmVudG9yeSBvZiB0aGUgVE9TLiBQbGF5ZXJzIGFyZSBub3QKKwkJCSAgZGVzdHJ1Y3RlZC4KKwljbG5vZiA8YXJnPgk6IGNsZWFuIHRoZSBpbnZlbnRvcnkgb2YgdGhlIFRPUyBvZiBhbGwgb2JqZWN0cyB3aXRoCisJCQkgIGlkIDxhcmc+LgorCXJlYwkJOiBwZXJmb3JtIHRoZSBuZXh0IGludiwgY2xuIG9yIGNsbm9mIHJlY3Vyc2l2ZWx5LgorCW5vcmVjCQk6IHVzZSB0aGlzIHRvIHR1cm4gb2YgcmVjIGFnYWluIGlmIHlvdSBhcmUgbm90IGdvaW5nCisJCQkgIHRvIHVzZSBvbmUgb2YgaW52LCBjbG4gb3IgY2xub2YuIGludiwgY2xuIGFuZCBjbG5vZgorCQkJICB0dXJuIG9mZiByZWMgYXV0b21hdGljYWxseSBhZnRlciBiZWluZyB1c2VkLgorCWRlc3QJCTogZGVzdHJ1Y3QgdGhlIFRPUy4KKwltYWtlCQk6IGRlc3RydWN0IHRoZSBUT1MsIHRoZW4gcmVidWlsZCBpdCBmcm9tIHRoZSBmaWxlLgorCQkJICBWZXJ5IHVzZWZ1bCB3aGVuIGRldmVsb3Bpbmcgcm9vbXMuCisJbW92CQk6IG1vdmUgdGhlIG9iamVjdCBkZW5vdGVkIGJ5IHRoZSBzdGFjayBlbnRyeSB0aGF0IGlzCisJCQkgIHNlY29uZCBmcm9tIHRvcCBpbnRvIHRoZSBUT1MuCisJWzxmdW5jdGlvbj5dCTogY2FsbCA8ZnVuY3Rpb24+IGluIHRoZSBUT1MuCisJWzxmdW5jdGlvbj4gPGFyZzE+IC4uLiA8YXJnbj5dCisJCQk6IGNhbGwgPGZ1bmN0aW9uPiBpbiB0aGUgVE9TLiBhcmd1bWVudHMgYXJlIHNlcGFyYXRlZAorCQkJICBieSBzcGFjZXMuIElmIHRoZSBhcmd1bWVudHMgdGhlbXNlbHZlcyBjb250YWluCisJCQkgIHNwYWNlcywgZW5jbG9zZSB0aGVtIGJ5ICIuLi4iLCAnLi4uJyBvciB8Li4ufC4KKwkJCSAgVXNlIEA8bnVtYmVyPiB0byBzdXBwbHkgb2JqZWN0cyBvbiB0aGUgc3RhY2sKKwkJCSAgYXMgYXJndW1lbnRzLgorCXJlc3VsdAkJOiBwdXNoIHRoZSByZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwgaWYgaXQgaXMKKwkJCSAgYW4gb2JqZWN0LgorCWRlc2MJCTogdG9nZ2xlIHdoZXRoZXIgc2hvcnQgZGVzY3JpcHRpb25zIGFyZSBzaG93biB3aGVuCisJCQkgIGRpc3BsYXlpbmcgb2JqZWN0cy4KKwkjCQk6IHRoZSBjb250ZW50cyBvZiB0aGUgc3RhY2sgd2lsbCBiZSByZXN0b3JlZCBhZnRlcgorCQkJICBwZXJmb3JtaW5nIHRoZSBuZXh0IGNvbW1hbmQgb24gdGhlIHNhbWUgbGluZS4KKwkJCSAgU2luY2UgYWxsIGNvbW1hbmRzIHdoaWNoIG1hbmlwdWxhdGUgc3RhY2sgb2JqZWN0cworCQkJICBleGNlcHQgaW52IGFuZCA9IHBvcCB0aGVtLCB0aGlzIG1pZ2h0IGNvbWUgaW4gaGFuZHkuCisJPDxudW1iZXI+CTogdXNlZCB0byBwdXNoIHZhcmlhYmxlIDxudW1iZXI+LiBNYXkgcmFuZ2UgZnJvbQorCQkJICAwIHRvIDkuCisJPjxudW1iZXI+CTogc3RvcmUgdGhlIFRPUyBpbiB2YXJpYWJsZSA8bnVtYmVyPi4KKwl2YXJzCQk6IGRpc3BsYXkgYWxsIHZhcmlhYmxlcy4KKworVGhlIGZvbGxvd2luZyB0d28gY29tbWFuZHMgY2FuIG9ubHkgYmUgdXNlZCBhcyB0aGUgZmlyc3QgY29tbWFuZCBvbiBhIGxpbmUuCisKKwk/CQk6IHRoZXJlIGFyZSB0d28gdXNhZ2VzIGZvciB0aGUgPy1jb21tYW5kLiBGb2xsb3dlZAorCQkJICBieSB0ZXh0IGl0IHdpbGwgZXhlY3V0ZSB0aGUgY29tbWFuZHMgaW4gaXQuCisJCQkgIFNpbXBseSBoaXR0aW5nID88Q1I+IHdpbGwgcHV0IHlvdSBpbiBpbnRlcmFjdGl2ZQorCQkJICBtb2RlLiBMZWF2ZSB0aGlzIG1vZGUgYnkgdHlwaW5nIC48Q1I+LiBMaW5lcworCQkJICB0eXBlZCBpbiB3aWxsIGJlIGV4ZWN1dGVkIGJ5IHRoZSBsZW5zIGFuZCB0aGUKKwkJCSAgc3RhY2sgc2hvd24gYWZ0ZXJ3YXJkcy4KKworCWdyYW50CQk6IFR3byBmb3JtcyBhcmUgcG9zc2libGU6CisJCQkgICdncmFudCBhY2Nlc3MgdG8gPG5hbWU+JyBhbGxvd3MgdGhlIHBsYXllciB3aXRoCisJCQkgIG5hbWUgPG5hbWU+IHRvIHVzZSB0aGUgbGVucy4KKwkJCSAgJ2dyYW50IG5vIGFjY2VzcycgZGVuaWVzIHRoZSBhY2Nlc3MgdG8gYWxsIHBsYXllcnMKKwkJCSAgYmVsb3cgbGV2ZWwgMjEuCisKK0V4YW1wbGVzOgorCW1lIC9yb29tL2NodXJjaCBtbworCQk6IGdvIHRvIHRoZSBjaHVyY2guCisJcGwgZGVtb3Mgb2IgfmRlbW9zL3dvcmtyb29tIG1vCisJCTogbW92ZSB0aGUgcGxheWVyIGRlbW9zIHRvIGhpcyB3b3Jrcm9vbS4KKwloZXJlIG1ha2UKKwkJOiB1cGRhdGUgYW5kIGxvYWQgdGhlIHJvb20geW91IGFyZSBpbiwga2VlcGluZyB0aGUgaW52ZW50b3J5CisJCSAgdW50b3VjaGVkLgorCWhlcmUgZHVwIHJlYyBjbG4gbWFrZQorCQk6IHNhbWUsIHRoaXMgdGltZSBjbGVhbmluZyB1cCBiZWZvcmUuCisJbWUuYmFnIGludgorCQk6IHNob3cgdGhlIGNvbnRlbnRzIG9mIHRoZSBiYWcgeW91IGhhdmUuCisJbWUuImJhZyAyIiBpbnYKKwkJOiBzYW1lIGZvciB0aGUgc2Vjb25kIGJhZy4KKwltZSBbc2hvcnRdCisJCTogc2hvd3MgeW91ciBzaG9ydCBkZXNjcmlwdGlvbi4KKwltZSBbcXVlcnlfYXR0YWNrXSByZXN1bHQgW3N0b3BfZmlnaHRdCisJCTogcGFjaWZ5IHlvdXIgb3Bwb25lbnQuCisJcGwgZGVtb3MgW2F0dGFja2VkX2J5IEAwXQorCQk6IG1ha2UgRGVtb3MgYXR0YWNrIGhpbXNlbGYuCisJbHYgdHJvbGwgcGwgZGVtb3MgW2F0dGFja2VkX2J5IEAxXQorCQk6IGRlbW9zIGlzIGF0dGFja2VkIGJ5IGEgdHJvbGwuCisJaGVyZS50cm9sbCBoZXJlLmRlbW9zIFthdHRhY2tlZF9ieSBAMV0KKwkJOiBzYW1lIGVmZmVjdCBpZiB0aGV5J3JlIGJvdGggaGVyZS4KKwluZXcgL29iai9sZXZlbF9saXN0CisJCTogZ2V0IHlvdXJzZWxmIGEgY29weSBvZiB0aGUgdG9wIHRlbiBsaXN0LgorCXBsIGVyZWJvcm4gY2xub2YgZmxlYQorCQk6IGhlbHAgcG9vciBlcmVib3JuIHRvIGdldCByaWQgb2YgdGhvc2UgZmxlYXMuCisJcGwgZGVtb3MgZW52IFtsb25nXQorCQk6IHNob3cgdGhlIHJvb20gd2hlcmUgZGVtb3MgaXMuCisJaGVyZSByZWMgaW52IHBvcAorCQk6IHNob3cgdGhlIGludmVudG9yeSBvZiB5b3VyIGN1cnJlbnQgbG9jYXRpb24gYW5kIGNsZWFuCisJCSAgdXAgdGhlIHN0YWNrIGFmdGVyd2FyZHMuCisJbWUgI1tzZXRfc3RyIDIwXSAjW3NldF9kZXggMjBdICNbc2V0X2ludCAyMF0gI1tzZXRfY29uIDIwXQorCQk6IHNldCBhbGwgeW91ciBzdGF0cyB0byB0aGUgbWF4aW11bSBwb3NzaWJsZSB2YWx1ZS4KKwltZSBbc2V0X3RpdGxlICJ0aGUgbmV3IHdpemFyZCJdCisJCTogY2hhbmdlcyB5b3VyIHRpdGxlIGFjY29yZGluZ2x5LgorCXBsIGRlbW9zIGVudiA+NAorCQk6IHN0b3JlIHRoZSByb29tIERlbW9zIGlzIGluIGluIHZhcmlhYmxlIDQuCisJPDQgW3F1ZXJ5X2Rlc3RfZGlyXQorCQk6IGdldCBpdCBhZ2FpbiBhbmQgbGlzdCB0aGUgcG9zc2libGUgZXhpdHMuCisJbWUgcmVjIGludiAuNCBpbnYKKwkJOiBnZXQgYSByZWN1cnNpdmUgbGlzdGluZyBvZiB5b3Vyc2VsZiwgdGhlbiBhIG5vbi1yZWN1cnNpdmUKKwkJICBvbmUgb2YgdGhlIDR0aCBpdGVtIGluIHlvdXIgaW52ZW50b3J5CisJbWUuNC4xIGluZm8KKwkJOiBzaG93IHNvbWUgaW5mb3JtYXRpb24gb2YgdGhlIGZpcnN0IGl0ZW0gd2l0aGluIHRoZSBmb3VydGgKKwkJICBpdGVtIGluIHlvdXIgaW52ZW50b3J5LgorCQkgIFBsZWFzZSBub3RlIHRoYXQgd2hlbiBkb2luZyBhIHJlYyBpbnYgYWxsIHRoZSBuZWNlc3NhcnkKKwkJICBpbmZvcm1hdGlvbiB0byBmaW5kIGFueSBvYmplY3QgaXMgZGlzcGxheWVkIGluIGZyb250CisJCSAgb2YgaXQuCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvbHVwZS5kb2sgYi9vYmovdG9vbHMvbHVwZS5kb2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhlMjNmZQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9sdXBlLmRvawpAQCAtMCwwICsxLDIwOSBAQAorQUxMR0VNRUlORVM6CisJRGllIEx1cGUgYmVudXR6dCBlaW5lbiBTdGFwZWwgKFN0YWNrKSwgdW0gT2JqZWt0ZSB6dSBiZWFyYmVpdGVuLgorCUVpbmlnZSBCZWZlaGxlIHNjaGllYmVuIE9iamVrdGUgYXVmIGRlbiBTdGFwZWwsIGFuZGVyZSB3aWVkZXJ1bQorCWhvbGVuIHNpZSB3aWVkZXIgdm9tIFN0YXBlbCBoZXJ1bnRlciB1bmQgYmVudXR6ZW4gc2llIGZ1ZXIgZGllCisJdmVyc2NoaWVkZW5zdGVuIFp3ZWNrZS4KKwlNYW4ga2FubiBpbiBlaW5lciBaZWlsZSBtZWhyZXJlIEtvbW1hbmRvcyBnbGVpY2h6ZWl0aWcgYW5nZWJlbgorCShkdXJjaCBMZWVyemVpY2hlbiBnZXRyZW5udCkuCisJRWluZSBaZWlsZSB3aXJkIGltbWVyIHZvbiBsaW5rcyBuYWNoIHJlY2h0cyBhYmdlYXJiZWl0ZXQuCisKK1NDSFJFSUJXRUlTRU46CisJPGFyZz4JLSBFaW5lIFJlaWhlIHZvbiBaZWljaGVuLCBkaWUgd2VkZXIgTGVlcnplaWNoZW4gbm9jaCBQdW5rdGUKKwkJICAoLikgZW50aGFlbHQuIEZhbGxzIGRvY2ggTGVlcnplaWNoZW4gb2RlciBQdW5rdGUgaW4gPGFyZz4KKwkJICBhdWZ0YXVjaGVuLCBtdXNzIG1hbiBkaWUgWmVpY2hlbmtldHRlIHp3aXNjaGVuICIuLi4iLAorCQkgICcuLi4nIG9kZXIgfC4uLnwgZWluc2NobGllc3Nlbi4KKwk8bnI+CS0gRWluZSAocG9zaXRpdmUgb2RlciBuZWdhdGl2ZSkgZ2FuemUgWmFobC4KKwk8ZmlsZW5hbWU+IC0gRWluIERhdGVpbmFtZS4gRnVlciBpaG4gZ2lsdCBkYXMgR2xlaWNoZSB3aWUgZnVlciA8YXJnPjoKKwkJICBXZW5uIGVyIFB1bmt0ZSBlbnRoYWVsdCwgbXVzcyBtYW4gaWhuIHp3aXNjaGVuICIuLi4iLAorCQkgICcuLi4nIG9kZXIgfC4uLnwgZWluc2NobGllc3Nlbi4KKwkJICBFcyBzaW5kIGFsbGUgVmFyaWF0aW9uZW4gbW9lZ2xpY2gsIGRpZSBtYW4gYXVjaCBhdXMgZGVyCisJCSAgTWFnaWVyc2hlbGwga2VubnQ6IGFic29sdXRlIERhdGVpbmFtZW4gKGJlZ2lubmVuIG1pdCAiLyIpLAorCQkgIERhdGVpbmFtZW4gcmVsYXRpdiB6dW0gZWlnZW5lbiBIb21ldmVyemVpY2huaXMgKCJ+LyIpCisJCSAgb2RlciB6dW0gSG9tZXZlcnplaWNobmlzIGVpbmVzIGFuZGVyZW4gTWFnaWVycyAoIn5uYW1lLyIpLAorCQkgIERhdGVpbmFtZW4gaW4gZWluZXIgUmVnaW9uICgiK3JlZ2lvbi8iKSB1bmQgRGF0ZWluYW1lbgorCQkgIHJlbGF0aXYgenVtIGFrdHVlbGxlbiBWZXJ6ZWljaG5pcyAoYWxsZXMgYW5kZXJlIDspLgorCTxmdW5jPgktIE5hbWUgZWluZXIgTFBDLUZ1bmt0aW9uLgorCVRPUwktIERhcyBPYmpla3QgZ2FueiBvYmVuIGF1ZiBkZW0gU3RhcGVsIChUb3AgT2YgU3RhY2spLgorCitERVIgU1RBUEVMOgorCUJlaSBkZW0gU3RhcGVsIGhhbmRlbHQgZXMgc2ljaCB1bSBlaW5lbiBMSUZPLVN0YXBlbCAoTGFzdCBJbiAtIEZpcnN0CisJT3V0KSwgZC5oLiBkYXMgT2JqZWt0LCBkYXMgenVsZXR6dCBhdWYgZGVuIFN0YXBlbCBnZXNjaG9iZW4gd3VyZGUsCisJd2lyZCBhbHMgZXJzdGVzIGJlYXJiZWl0ZXQuCisJQmVpIGRlciBCZWFyYmVpdHVuZyB3aXJkIGRlciBUT1MgaW4gZGVyIFJlZ2VsIHZvbSBTdGFwZWwgZW50ZmVybnQKKwkoQXVzbmFobWVuOiA9LCBzdGsgdW5kICMpLCBkZXIgU3RhcGVsIHdpcmQgYWxzbyBpbSBMYXVmZSBkZXIgWmVpdAorCXdpZWRlciBrbGVpbmVyLgorCURlciBTdGFwZWwga2FubiBtYXhpbWFsIHplaG4gRWxlbWVudGUgYXVmbmVobWVuLiBEaWVzZXMgTGltaXQgd2lyZAorCW1hbiBiZWkgIm5vcm1hbGVtIEJldHJpZWIiIGFsbGVyZGluZ3Mgc2VsdGVuIGVycmVpY2hlbi4KKwlTb2xsdGUgZXMgdHJvdHpkZW0gZWlubWFsIGVuZyB3ZXJkZW4sIHN0ZWhlbiBlaW5lbSBub2NoIHplaG4KKwlWYXJpYWJsZW4genVyIFZlcmZ1ZWd1bmcsIGluIGRlbmVuIG1hbiB6dXNhZXR6bGljaCBPYmpla3RlICh2b20KKwlTdGFwZWwpIGFibGVnZW4ga2Fubi4KKworQkVGRUhMRToKKwlFcyBnaWJ0IGRyZWkgdW50ZXJzY2hpZWRsaWNoZSBCZWZlaGxzZ3J1cHBlbjoKKwlhKSBCZWZlaGxlLCBkaWUgZWluIE9iamVrdCBhdWYgZGVuIFN0YXBlbCBzY2hpZWJlbjsKKwliKSBCZWZlaGxlLCBkaWUgbWl0IE9iamVrdGVuIGF1ZiBkZW0gU3RhcGVsIGFyYmVpdGVuOworCWMpIEJlZmVobGUsIGRpZSBvaG5lIGRlbiBTdGFwZWwgYXVza29tbWVuLgorCUVpbmlnZSBCZWZlaGxlIHNldHplbiB2b3JhdXMsIGRhcyBkZXIgVE9TIGVpbiBMZWJld2VzZW4gb2RlciBnYXIgZWluCisJU3BpZWxlcm9iamVrdCBpc3Q7IGFuZGVyZSBCZWZlaGxlIHNpbmQgZXJzdCBhYiBlaW5lbSBiZXN0aW1tdGVuCisJTWFnaWVybGV2ZWwgenVnYWVuZ2xpY2guIERpZXMgaXN0IGJlaSBkZW4gZW50c3ByZWNoZW5kZW4gQmVmZWhsZW4KKwlqZXdlaWxzIHZlcm1lcmt0LgorCisgICAgRGllc2UgQmVmZWhsZSBzY2hpZWJlbiBlaW4gbmV1ZXMgT2JqZWt0IGF1ZiBkZW4gU3RhcGVsOgorCWNyZWF0IDxmaWxlbmFtZT4gTWFjaHQgZGFzIEdsZWljaGUgd2llICduZXcnLCBkYXMgT2JqZWt0IHdpcmQgYWxsZXItCisJCQlkaW5ncyBuaWNodCBpbiBEZWluIEludmVudG9yeSBnZXN0ZWNrdC4KKwloZXJlCQlEYXMgT2JqZWt0LCBpbiBkZW0gbWFuIGdlcmFkZSBzdGVodCwgYXVmIGRlbiBTdGFwZWwKKwkJCXNjaGllYmVuLgorCWx2IDxhcmc+CVNjaGllYnQgZGFzIExlYmV3ZXNlbiBtaXQgZGVtIGxpdmluZ19uYW1lIDxhcmc+IGF1ZgorCQkJZGVuIFN0YXBlbC4gQUNIVFVORyEgRGFzIG11c3MgZGFubiBuaWNodCB1bmJlZGluZ3QKKwkJCWRhcyBMZWJld2VzZW4gc2VpbiwgZGFzIG1hbiBkb3J0IGVpZ2VudGxpY2ggaGFiZW4KKwkJCXdpbGwhIEVzIHdpcmQgZWluZmFjaCBkYXMgZXJzdGUgT2JqZWt0IGdlbm9tbWVuLAorCQkJZGVzc2VuIGxpdmluZ19uYW1lIHBhc3N0ISBXZW5uIG1hbiBldHdhcyBtaXQgZWluZW0KKwkJCU5QQyB2b3JoYXQsIGRlciBpbSBnbGVpY2hlbiBSYXVtIHN0ZWh0LCBzcHJpY2h0IG1hbgorCQkJaWhuIGJlc3NlciBtaXQgaGVyZS5uYW1lIGFuLgorCW1lCQlTaWNoIHNlbGJzdCBhdWYgZGVuIFN0YXBlbCBzY2hpZWJlbi4KKwluZXcgPGZpbGVuYW1lPglDbG9uZWQgZGFzIG1pdCA8ZmlsZW5hbWU+IGFuZ2VnZWJlbmUgT2JqZWt0IHVuZAorCQkJc2NoaWVidCBlcyBhdWYgZGVuIFN0YXBlbC4gQW5zY2hsaWVzc2VuZCBiZWZpbmRldCBlcworCQkJc2ljaCBpbiBEZWluZW0gSW52ZW50b3J5LgorCW9iIDxmaWxlbmFtZT4JTGFlZHQgZGFzIE9iamVrdCwgZGFzIG1pdCA8ZmlsZW5hbWU+IGFuZ2VnZWJlbiBpc3QsCisJCQl1bmQgc2NoaWVidCBlcyBhdWYgZGVuIFN0YXBlbC4KKwlwbCA8YXJnPglTY2hpZWJ0IGRhcyBTcGllbGVyb2JqZWt0IG1pdCBkZW0gTmFtZW4gPGFyZz4gYXVmIGRlbgorCQkJU3RhcGVsLgorCQkJRXMgd2VyZGVuIGF1Y2ggbmV0enRvdGUgU3BpZWxlciBiZXJ1Y2tzaWNodGlndC4KKwlwdXNoIDxmaWxlbmFtZT4gU2NoaWVidCBkYXMgT2JqZWt0LCBkYXMgbWl0IDxmaWxlbmFtZT4gYW5nZWdlYmVuIGlzdCwKKwkJCWF1ZiBkZW4gU3RhcGVsLgorCTxmaWxlbmFtZT4JTWFjaHQgZGFzIGdsZWljaGUgd2llICdvYicsIGZhbGxzIDxmaWxlbmFtZT4gbWl0ICIvIgorCQkJb2RlciAifiIgYmVnaW5udC4KKworICAgIERpZSBuYWVjaHN0ZW4gQmVmZWhsZSBzY2hhbHRlbiBPcHRpb25lbiBkZXIgTHVwZSBhbi9hdXMvdW06CisJZGVzYwkJRGllIHp1c2FldHpsaWNoZSBBbmdhYmUgZGVyIEt1cnpiZXNjaHJlaWJ1bmcgZGVzCisJCQlha3R1ZWxsZW4gT2JqZWt0ZXMgd2lyZCB1bnRlcmRydWVja3QuCisJcmVjCQlTY2hhbHRldCBpbiBkZW4gInJla3Vyc2l2Ii1Nb2R1cyB1bS4gRGllc2VyIE1vZHVzCisJCQl3aXJkIHZvbiBmb2xnZW5kZW4gQmVmZWhsZW4gZ2VudXR6dDoKKwkJCSdpbnYnLCAnY2xuJyB1bmQgJ2Nsbm9mJworCQkJTmFjaCBBdXNmdWVocnVuZyBlaW5lcyBkaWVzZXIgQmVmZWhsZSB3aXJkIGRlcgorCQkJInJla3Vyc2l2Ii1Nb2R1cyBhdXRvbWF0aXNjaCB3aWVkZXIgYWJnZXN0ZWxsdC4KKwlub3JlYwkJU3RlbGx0IGRlbiAicmVrdXJzaXYiLU1vZHVzICJ2b24gSGFuZCIgYWIuCisKKyAgICBEaWVzZSBCZWZlaGxlIHNjaGllYmVuIGViZW5mYWxscyBlaW4gbmV1ZXMgT2JqZWt0IGF1ZiBkZW4gU3RhcGVsLiBTaWUKKyAgICBhcmJlaXRlbiBkYWJlaSBhbGxlcmRpbmdzIHJlbGF0aXYgenVtIFRPUy4gTWFuIG11c3MgYWxzbyBzY2hvbiBtaW5kZXN0ZW5zCisgICAgZWluIE9iamVrdCBhdWYgZGVuIFN0YXBlbCBnZXNjaG9iZW4gaGFiZW4uIERlciBhbHRlIFRPUyB3aXJkIGRhYmVpIGluIGRlcgorICAgIFJlZ2VsIGVudGZlcm50LgorCS48bnI+CQlTY2hpZWJ0IGRhcyA8bnI+dGUgT2JqZWt0IGltIEludmVudG9yeSBkZXMgVE9TIGF1ZiBkZW4KKwkJCVN0YXBlbC4KKwkuPGFyZz4JCVNjaGllYnQgZGFzIE9iamVrdCBtaXQgZGVyIElEIDxhcmc+IGltIEludmVudG9yeSBkZXMKKwkJCVRPUyBhdWYgZGVuIFN0YXBlbC4KKwk8PG5yPgkJU2NoaWVidCBkaWUgVmFyaWFibGUgPG5yPiBhdWYgZGVuIFN0YXBlbC4gQWxzIDxucj4KKwkJCXNpbmQgV2VydGUgendpc2NoZW4gMCB1bmQgOSBtb2VnbGljaC4KKwlAPG5yPgkJU2NoaWVidCBkYXMgPG5yPnRlIE9iamVrdCB2b24gb2JlbiBub2NoIGVpbm1hbCBhdWYgZGVuCisJCQlTdGFwZWwuIERlciBhbHRlIFRPUyBoYXQgZGllIE51bW1lciAwLiBXZWRlciBkZXIgYWx0ZQorCQkJVE9TIG5vY2ggZGFzIHZlcnNjaG9iZW5lIE9iamVrdCB3ZXJkZW4gdm9tIFN0YXBlbCBlbnQtCisJCQlmZXJudC4KKwkJCUAxIGlzdCBhbmFsb2cgenUgJ292ZXInLgorCWNvcHkJCUxlZ3QgZWluZSBLb3BpZSBkZXMgVE9TIGFuIChpbmtsLiBhbGxlciBQcm9wZXJ0eXdlcnRlKQorCQkJdW5kIHNjaGllYnQgZGllc2UgS29waWUgYXVmIGRlbiBTdGFwZWwuIERpZSBLb3BpZQorCQkJYmVmaW5kZXQgc2ljaCBkYW5hY2ggaW4gRGVpbmVtIEludmVudG9yeS4KKwlkdXAJCVNjaGllYnQgZGVuIFRPUyBkb3BwZWx0IGF1ZiBkZW4gU3RhcGVsLgorCWVudgkJU2NoaWVidCBkYXMgT2JqZWt0LCBpbiBkZW0gc2ljaCBkZXIgVE9TIGJlZmluZGV0LCBhdWYKKwkJCWRlbiBTdGFwZWwuCisJb3ZlcgkJU2NoaWVidCBkYXMgT2JqZWt0LCBkYXMgc2ljaCB1bnRlciBkZW0gVE9TIGJlZmluZGV0LAorCQkJbm9jaG1hbCBhdWYgZGVuIFN0YXBlbC4gRGFiZWkgd2VyZGVuIHdlZGVyIGRlciBhbHRlCisJCQlUT1Mgbm9jaCBkYXMgT2JqZWt0IHVudGVyIGlobSBlbnRmZXJudC4KKwlyZXN1bHQJCVdlbm4gaW4gZWluZW0gT2JqZWt0IGVpbmUgRnVua3Rpb24gYXVmZ2VydWZlbiB3dXJkZSwKKwkJCXVuZCBkaWVzZSBGdW5rdGlvbiB3aWVkZXIgZWluIE9iamVrdCB6dXJ1ZWNrZ2VnZWJlbgorCQkJaGF0LCBzbyB3aXJkIGRpZXNlcyBPYmpla3QgYXVmIGRlbiBTdGFwZWwgZ2VzY2hvYmVuLgorCXN3YXAJCVRhdXNjaHQgVE9TIHVuZCBkYXMgZGFydW50ZXIgbGllZ2VuZGUgRWxlbWVudCBnZWdlbi0KKwkJCWVpbmFuZGVyIGF1cy4KKworICAgIERpZSBuYWVjaHN0ZW4gQmVmZWhsZSBhcmJlaXRlbiBtaXQgZGVuIGF1ZiBkZW0gU3RhcGVsIGxpZWdlbmRlbiBPYmpla3Rlbi4KKyAgICBEYWJlaSB3ZXJkZW4gZGllIGJlYXJiZWl0ZXRlbiBPYmpla3RlIGluIGRlciBSZWdlbCB2b20gU3RhcGVsIGVudGZlcm50LgorCT48bnI+CQlTcGVpY2hlcnQgZGVuIFRPUyBpbiBkZXIgVmFyaWFibGVuIDxucj4uIEFscyA8bnI+CisJCQlzaW5kIFdlcnRlIHp3aXNjaGVuIDAgdW5kIDkgbW9lZ2xpY2guCisJPQkJWmVpZ3QgZGVuIFRPUy4gRGllc2VyIGJsZWlidCBkYWJlaSB1bnZlcmFlbmRlcnQuCisJIwkJRGVyIFN0YWNrIGJsZWlidCB1ZWJlciBkYXMgbmFlY2hzdGUgS29tbWFuZG8gaGluYXVzCisJCQllcmhhbHRlbi4KKwlpbnYJCVplaWd0IGRhcyBJbnZlbnRvcnkgZGVzIFRPUy4gRGVyIFRPUyBibGVpYnQgZGFiZWkKKwkJCXVudmVyYWVuZGVydC4KKwljbG4JCUVudGZlcm50IGFsbGUgT2JqZWt0ZSBhdXMgZGVtIEludmVudG9yeSBkZXMgVE9TLiBFcworCQkJd2VyZGVuIGFsbGVyZGluZ3Mga2VpbmUgU3BpZWxlciBlbnRmZXJudC4KKwljbG5vZiA8YXJnPglFbnRmZXJudCBhbGxlIE9iamVrdGUsIGRpZSBhdWYgZGllIElEIDxhcmc+IGFuc3ByZS0KKwkJCWNoZW4sIGF1cyBkZW0gSW52ZW50YXIgZGVzIFRPUy4KKwljbHIJCUxvZXNjaHQgZGVuIGdlc2FtdGVuIFN0YWNrLgorCURlc3QJCURlciBUT1Mgd2lyZCB6ZXJzdG9lcnQuIERhcyBnZWh0IGFsbGVyZGluZ3MgTklDSFQsCisJCQl3ZW5uIGRlciBUT1MgZWluIFNwaWVsZXJvYmpla3Qgb2RlciBkaWUgTHVwZSBzZWxic3QKKwkJCWlzdC4KKwlkZXN0CQlXaWUgRGVzdCwgYWxsZXJkaW5ncyB3aXJkIHp1ZXJzdCBUT1MtPnJlbW92ZSgpIGF1Zi0KKwkJCWdlcnVmZW4sIHVtIGRlbSBUT1MgZGllIE1vZWdsaWNoa2VpdCB6dSBnZWJlbiwgbm9jaAorCQkJaGludGVyIHNpY2ggYXVmenVyYWV1bWVuLgorCWRpbmZvCQlHaWJ0IGVpbmlnZSBHYW1lRHJpdmVyLWludGVybmUgSW5mb3JtYXRpb25lbiB3aWUgekIuCisJCQlkaWUgWmVpdCBkZXMgbmFlY2hzdGVuIHJlc2V0KCktQXVmcnVmcyBvZGVyIGRpZSBhbi0KKwkJCWdlc2FtbWVsdGUgZXZhbGNvc3QgZGVzIFRPUyBhdXMuCisJZGlzY28JCVVudGVyYnJpY2h0IGRpZSBWZXJiaW5kdWcgZGVzIFRPUyAobXVzcyBlaW4gYWt0aXZlcgorCQkJU3BpZWxlciBzZWluKSB6dW0gTUcgKGRpc2Nvbm5lY3QpLgorCWhsCQlaZWlndCBkaWUgSGlzdG9yeWxpc3RlIGRlcyBUT1MgYW4gKGhpZXJiZWkgbXVzcyBlcworCQkJc2ljaCB1bSBlaW5lbiBTcGllbGVyIGhhbmRlbG4pLgorCQkJRGllc2VyIEJlZmVobCBzdGVodCBhYiBFTERFUl9MVkwgKDUwKSB6dXIgVmVyZnVlZ3VuZy4KKwkJCSEhIUZ1ZXIgZGllIEJlbnV0enVuZyBnaWx0IGRhcyBHbGVpY2hlIHdpZSBmdWVyIGRhcworCQkJU25vb3BlbiEhIQorCWlkbGUJCUdpYnQgYW4sIHdpZSBsYW5nZSBkZXIgVE9TIHNjaG9uIGlkbGV0LiAoRGVyIFRPUworCQkJc29sbHRlIGRhYmVpIG5hdHVlcmxpY2ggZWluIFNwaWVsZXIgc2VpbikuCisJaW5mbwkJR2lidCBlaW5pZ2UgSW5mb3JtYXRpb25lbiB1ZWJlciBkZW4gVE9TIGF1cy4KKwlpbmhlcml0X2xpc3QJR2lidCBkZW4gVmVyZXJidW5nc2JhdW0gZGVzIFRPUyBhdXMgKGFsbGVyZGluZ3MgbmljaHQKKwkJCXNlaHIgYmF1bWZvZXJtaWcgOykKKwlpbnYJCVplaWd0IGRhcyBJbnZlbnRvcnkgZGVzIFRPUyBhbi4KKworCW1ha2UJCUZ1ZWhydCBlaW4gVXBkYXRlIGRlcyBUT1MgZHVyY2guIEdlaHQgbmljaHQgYmVpCisJCQlTcGllbGVybiEgRGFmdWVyIGdpYnQgZXMgcmVuZXcuCisJbWluZm8JCUdpYnQgZWluaWdlIEluZm9ybWF0aW9uZW4gdWViZXIgZGVuIFNwZWljaGVydmVyYnJhdWNoCisJCQlkZXMgVE9TIGF1cy4KKwltb3ZlLCBtb3YsIG1vCURhcyBPYmpla3QsIGRhcyB1bnRlciBkZW0gVE9TIHN0ZWh0LCB3aXJkIGluIGRlbiBUT1MKKwkJCWdlbW92ZWQuIEJlaWRlIE9iamVrdGUgd2VyZGVuIGRhYmVpIHZvbSBTdGFwZWwgZW50LQorCQkJZmVybnQuCisJX21vdmUsIF9tb3YsIF9tbywgX212CisJCQlEYXMgT2JqZWt0LCBkYXMgdW50ZXIgZGVtIFRPUyBzdGVodCwgd2lyZCBpbiBkZW4gVE9TCisJCQlnZW1vdmVkLCBvaG5lIGRhc3MgZG9ydCBpbml0KCkgYXVmZ2VydWZlbiB3aXJkLiBCZWlkZQorCQkJT2JqZWt0ZSB3ZXJkZW4gZGFiZWkgdm9tIFN0YXBlbCBlbnRmZXJudC4KKwkJCURpZXNlciBCZWZlaGwgc3RlaHQgYWIgQVJDSF9MVkwgKDYwKSB6dXIgVmVyZnVlZ3VuZy4KKwlwb3AJCUVudGZlcm50IGRlbiBUT1MuCisJcmVuZXcJCUFlaG5saWNoIHdpZSAnbWFrZScsIGRlciBUT1MgbXVzcyBhbGxlcmRpbmdzIGVpbgorCQkJU3BpZWxlciBzZWluLiBBQ0hUVU5HISBNYW4gc29sbHRlIG5pY2h0ICJlaW5mYWNoIHNvIgorCQkJU3BpZWxlciAncmVuZXcnZW4sIHNvbmRlcm4gbnVyIGRhbm4sIHdlbm4gZXMgd2lya2xpY2gKKwkJCWdlcmVjaHRmZXJ0aWd0IGlzdCEKKwlzY2FuLCBzYwlLb21iaW5pZXJ0ICdzdGF0JyB1bmQgZmluZ2VyLiBEZXIgVE9TIG11c3MgZWluIExlYmUtCisJCQl3ZXNlbiBzZWluLgorCXN0YXQJCUdpYnQgSW5mb3JtYXRpb25lbiB1ZWJlciBadXN0YW5kLCBBdXNydWVzdHVuZywgZ2UtCisJCQlsb2VzdGUgUXVlc3RzIGV0Yy4gZGVzIFRPUyBhdXMuIERlciBUT1MgbXVzcyBkYWJlaQorCQkJZWluIExlYmV3ZXNlbiBzZWluLgorCXN0awkJWmVpZ3QgZGVuIGdlc2FtdGVuIFN0YWNrLiBEaWVzZXIgYmxlaWJ0IGRhYmVpIHVudmVyLQorCQkJYWVuZGVydC4KKwlbPGZ1bmM+XQlSdWZ0IGltIFRPUyBkaWUgRnVua3Rpb24gPGZ1bmM+IG9obmUgUGFyYW1ldGVyIGF1Zi4KKwkJCUZhbGxzIGRpZXNlIEZ1bmt0aW9uIGVpbiBPYmpla3QgenVydWVja2dpYnQsIGthbm4gbWFuCisJCQlkaWVzZXMgYW5zY2hsaWVzc2VuZCBtaXQgcmVzdWx0IGF1ZiBkZW4gU3RhcGVsCisJCQlzY2hpZWJlbi4KKwlbPGZ1bmM+IDxhcmcxPiAuLi4gPGFyZ24+XQorCQkJUnVmdCBpbSBUT1MgZGllIEZ1bmt0aW9uIDxmdW5jPiBtaXQgZGVuIFBhcmFtZXRlcm4KKwkJCTxhcmcxPiBiaXMgPGFyZ24+IGF1Zi4gRGllIFBhcmFtZXRlciBzaW5kIG1pdCBMZWVyLQorCQkJemVpY2hlbiB6dSB0cmVubmVuLiBFbnRoYWx0ZW4gZGllIFBhcmFtZXRlciBzZWxic3QKKwkJCUxlZXJ6ZWljaGVuLCBzbyBzaW5kIHNpZSBpbiAiLi4uIiwgJy4uLicgb2RlciB8Li4ufAorCQkJZWluenVzY2hsaWVzc2VuLgorCQkJTWl0dGVscyBAPG5yPiBrYW5uIG1hbiBhdWNoIE9iamVrdGUsIGRpZSBzaWNoIGF1ZiBkZW0KKwkJCVN0YXBlbCBiZWZpbmRlbiwgYWxzIEFyZ3VtZW50ZSBhbmdlYmVuLgorCisgICAgRGllIGZvbGdlbmRlbiBCZWZlaGxlIGtvbW1lbiBvaG5lIE9iamVrdGUgYXVmIGRlbSBTdGFjayBhdXM6CisJY2FsbF9vdXQJR2lidCBlaW5lIExpc3RlIGFsbGVyIE9iamVrdGUgbWl0IGVpbmVtIGxhdWZlbmRlbgorCQkJY2FsbF9vdXQgYXVzLgorCWR1bXAJCVNjaHJlaWJ0IGRpZSBMaXN0ZW4gYWxsZXIgT2JqZWt0ZSBtaXQgYWt0aXZlbQorCQkJaGVhcnRfYmVhdCB1bmQgYWxsZXIgT2JqZWt0ZSBtaXQgbGF1ZmVuZGVtIGNhbGxfb3V0CisJCQlpbiBkaWUgRGF0YWkgTElTVFMuTFVQRSBpbiBEZWluIEhvbWV2ZXJ6ZWljaG5pcy4KKwlkdW1waGlzdHMJU2NocmVpYnQgZGllIEJlZmVobHNoaXN0b3J5IGFsbGVyIG1vbWVudGFuIGVpbmdlLQorCQkJbG9nZ3RlbiBTcGllbGVyIG5hY2ggL2xvZy9BUkNIL0hELgorCQkJRGllc2VyIEJlZmVobCBzdGVodCBlcnN0IGFiIEFSQ0hfTFZMICg2MCkgenVyCisJCQlWZXJmdWVndW5nLgorCWhlYXJ0X2JlYXQJR2lidCBlaW5lIExpc3RlIGFsbGVyIE9iamVrdGUgbWl0IGFrdGl2ZW0gaGVhcnRfYmVhdAorCQkJYXVzLgorCXJ1c2FnZQkJWmVpZ3QgZWluaWdlIEluZm9zIHVlYmVyIGRlbiBSZXNzb3VyY2VuZ2UtLy12ZXJicmF1Y2gKKwkJCWRlcyBNdWRzIGFuLgorCXN3aG8JCVplaWd0IChzbyBndXQgd2llKSBhbGxlIGFrdGl2ZW4gU25vb3BzLgorCXZhcnMJCVplaWd0IGRpZSBiZWxlZ3RlbiBWYXJpYWJsZW4gYW4uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xhc3QgbW9kaWZpZWQ6IFdlZCBKdW4gMjYgMTQ6NDk6MDIgMTk5NiBieSBXYXJnb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvbWVya3pldHRlbC9tZXJremV0dGVsLmMgYi9vYmovdG9vbHMvbWVya3pldHRlbC9tZXJremV0dGVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA0NDdhYgotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9tZXJremV0dGVsL21lcmt6ZXR0ZWwuYwpAQCAtMCwwICsxLDExMzAgQEAKKy8qICAvb2JqL3Rvb2xzL21lcmt6ZXR0ZWwuYworICAgIE1lcmt6ZXR0ZWwgZnVlciBNYWdpZXIKKyAgICBBdXRvcjogWmVzc3RyYQorICAgIGdnZi4gQ2hhbmdlbG9nOgorKi8KKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIG5vX3NoYWRvdworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBwZWRhbnRpYworCitpbmhlcml0ICIvc3RkL3NlY3VyZV90aGluZyI7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSAibWVya3pldHRlbC5oIgorI3VuZGVmIE5FRURfUFJPVE9UWVBFUworCisvL1ZhcmlhYmxlbgorbWFwcGluZyBub3RpemVuOworLy9tYXBwaW5nIG5vdGl6ZW5faW5ha3RpdjsKK2ludCBtYXh1c2VkSUQ7CitzdGF0aWMgc3RyaW5nIG93bmVyOyAvL1VJRCBkZXMgQmVzaXR6ZXJzLCB3aXJkIGluIFBfQVVUT0xPQUQgZ2VzcGVpY2hlcnQKKy8vc3RhdGljIGludCAqY2FjaGU7IC8vbmFjaCBQcmlvcml0YWV0IHNvcnRpZXJ0ZXMgQXJyYXkgZGVyIElEcworCit2b2lkIGNyZWF0ZSgpIHsKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX05BTUUsICJNZXJremV0dGVsIik7CisgIFNldFByb3AoUF9TSE9SVCwgIkVpbiBNZXJremV0dGVsIik7CisgIEFkZElkKCh7Im1lcmt6ZXR0ZWwiLCJ6ZXR0ZWwifSkpOworICAvL0Fic2ljaHQsIGRhbWl0IGRpZSBCbHVlcHJpbnQgZWluZSBJRCwgUF9OQU1FIHVuZCBQX1NIT1JUIGhhdC4KKyAgaWYoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuOworICAKKyAgU2V0UHJvcChQX0xPTkcsCisgICJXYXMgd29sbHRlc3QgRHUgZ2xlaWNoIG5vY2htYWwgc2Nob2VuZXMgcHJvZ2dlbj8gOy0pXG4iCisgICJCZWZlaGxzbGlzdGU6XG4iCisgICJ6bWVya2Uvem5vdGl6IDxzdHJpbmc+ICA6IEV0d2FzIGF1ZiBkZW4gTWVya3pldHRlbCBzY2hyZWliZW5cbiIKKyAgInpsaXN0ZSAgICAgICAgICAgICAgICAgIDogMjAgd2ljaHRpZ3N0ZW4gTm90aXplbiBhbnplaWdlblxuIgorICAiemxpc3RlIDxpbnQ+ICAgICAgICAgICAgOiA8aW50PiB3aWNodGlnc3RlIE5vdGl6ZW4gYW56ZWlnZW5cbiIKKyAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgKHVud2ljaHRpZ3N0ZSwgd2VubiA8aW50PiBuZWdhdGl2KVxuIgorICAiICAgICAgICAgICAgICAgICAgICAgICAgICBBbmdhYmUgdm9uIDAgb2RlciAnYWxsZScgZ2lidCBhbGxlIGF1c1xuIgorICAiemxpc3RlIDxpbnQ+IDxmaWx0ZXI+ICAgOiA8aW50PiB3aWNodGlnc3RlIE5vdGl6ZW4gYW56ZWlnZW5cbiIKKyAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgKEZpbHRlcjogJ2FrdGl2JywgJ3dhcnRlbmQnXG4iCisgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5ha3RpdicsICdhYmdlaGFrdCcsICdhbGxlJ3wnMCcpXG4iCisgICIgICAgICAgICAgICAgICAgICAgICAgICAgIE9obmUgQW5nYWJlIGVpbmVzIEZpbHRlciBnaWx0ICdha3RpdidcbiIKKyAgInpzdGF0dXMgPGludD4gICAgICAgICAgIDogU3RhdHVzIHZvbiBOb3RpeiBtaXQgSUQgdW1zY2hhbHRlblxuIgorICAienN0YXR1cyA8aW50PiA8aW50Mj4gICAgOiBTdGF0dXMgdm9uIE5vdGl6IG1pdCBJRCBhdWYgPGludD4gc2V0emVuIFxuIgorICAiemxvZXNjaGUvenJtIDxpbnQ+ICAgICAgOiBOb3RpeiBtaXQgSUQgPGludD4gbG9lc2NoZW5cbiIKKyAgInpsaWVzL3psZXNlIDxpbnQ+ICAgICAgIDogTm90aXogbWl0IElEIDxpbnQ+IGFuemVpZ2VuXG4iCisgICJ6ZGVwbGllcyA8aW50PiA8aW50Mj4gICA6IEFiaGFlbmdpZ2tlaXRlbiB2b24gPGludD4gbGVzZW4sIFxuIgorICAiICAgICAgICAgICAgICAgICAgICAgICAgOiByZWt1cnNpdiwgd2VubiA8aW50Mj4gIT0gMFxuIgorICAiemZlcnRpZy96aGFrZSA8aW50PiAgICAgOiBOb3RpeiBtaXQgSUQgPGludD4gYWJoYWtlbiAoZmVydGlnKVxuIgorICAienByaW8gPGludDE+IDxpbnQyPiAgICAgOiBOb3RpeiBtaXQgSUQgPGludD4gbWl0IFByaW9yaXRhZXQgPGludDI+XG4iCisgICIgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNlaGVuLlxuIgorICAiemRlcCA8aW50MT4gPGludDI+ICAgICAgOiBOb3RpeiBtaXQgSUQgPGludD4gc29sbCB2b24gTm90aXogbWl0IElEXG4iCisgICIgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnQyPiBhYmhhZW5nZW4uXG4iCisgICJ6aGVsZmVyIDxpbnQxPiA8bmFtZW4+ICA6IE5vdGl6IG1pdCBJRCA8aW50PiB3aXJkIChtaXQpYmVhcmJlaXRldFxuIgorICAiICAgICAgICAgICAgICAgICAgICAgICAgICB2b24gZGVuIGFuZ2VnZWJlbmVuIFBlcnNvbmVuXG4iCisgICJ6ZXJnYWVuemUgPGludD4gPHRleHQ+ICA6IGhhZW5ndCA8dGV4dD4gYW4gTm90aXogPGludD4gYW5cbiIKKyAgInplcnNldHplIDxpbnQ+IDx0ZXh0PiAgIDogZXJzZXR6dCBUZXh0IHZvbiBOb3RpeiA8aW50PiBkdXJjaCA8dGV4dD5cbiIKKyAgInpleHBpcmUgPGludD4gICAgICAgICAgIDogYWxsZSBhYmdlaGFrdGVuIE5vdGl6ZW4gYXJjaGl2aWVyZW4gdW5kIGxvZXNjaGVuLFxuIgorICAiICAgICAgICAgICAgICAgICAgICAgICAgOiBkaWUgYWVsdGVyIGFscyA8aW50PiBUYWdlIHNpbmQuXG4iCisgICJ6emVpZ2UgPG5hbWU+ICAgICAgICAgICA7IHplaWdlIDxuYW1lPiwgd2llIGZ1cmNodGJhciB2aWVsIER1IHp1IHR1biBoYXN0XG4iCisgICJ6d2VkZWwgPG5hbWU+CSAgIDogPG5hbWU+IGF1cyBkZXIgRmVybmUgdm9yIGRlciBOYXNlIHJ1bXdlZGVsbi5cbiIKKyAgKTsKKyAgU2V0UHJvcChQX0lORk8sYnJlYWtfc3RyaW5nKCJFaW4gTWVya3pldHRlbCBmdWVyIE1hZ2llci4gOy0pLiIpKTsKKyAgU2V0UHJvcChQX0dFTkRFUiwgTUFMRSk7CisgIFNldFByb3AoUF9BUlRJQ0xFLCAxKTsKKyAgU2V0UHJvcChQX1dFSUdIVCwgMCk7CisgIFNldFByb3AoUF9WQUxVRSwgMCk7CisgIFNldChQX0FVVE9MT0FET0JKLCMncXVlcnlfYXV0b2xvYWRvYmosRl9RVUVSWV9NRVRIT0QpOworICBTZXQoUF9BVVRPTE9BRE9CSiwjJ3NldF9hdXRvbG9hZG9iaixGX1NFVF9NRVRIT0QpOworICBTZXQoUF9BVVRPTE9BRE9CSixQUk9URUNURUQsRl9NT0RFX0FTKTsKKyAgU2V0UHJvcChQX05FVkVSRFJPUCwxKTsKKyAgU2V0UHJvcChQX05PRFJPUCwxKTsKKyAgQWRkQ21kKCh7InptZXJrZSIsInpub3RpeiJ9KSwiQWRkTm90aXoiKTsKKyAgQWRkQ21kKCh7InpsaXN0ZSIsInp0b2RvIn0pLCJMaXN0Tm90aXplbiIpOworICBBZGRDbWQoKHsiemxvZXNjaGUiLCJ6cm0ifSksIlJlbW92ZU5vdGl6Iik7CisgIEFkZENtZCgoeyJ6ZmVydGlnIiwiemhha2UifSksIkZpbmlzaE5vdGl6Iik7CisgIEFkZENtZCgoeyJ6bGllcyIsInpsZXNlIn0pLCJMaWVzTm90aXoiKTsKKyAgQWRkQ21kKCh7InpwcmlvIn0pLCJDaGFuZ2VQcmlvIik7CisgIEFkZENtZCgoeyJ6ZGVwIn0pLCJDaGFuZ2VEZXAiKTsKKyAgQWRkQ21kKCh7InpzdGF0dXMifSksIkNoYW5nZVN0YXR1cyIpOworICBBZGRDbWQoKHsiemVyc2V0emUifSksIkVyc2V0emVUZXh0Iik7CisgIEFkZENtZCgoeyJ6ZXJnYWVuemUifSksIkVyZ2FlbnplVGV4dCIpOworICBBZGRDbWQoKHsiemhlbGZlciIsInpkZWxlZ2llcmUifSksIkNoYW5nZUhlbHBlciIpOworICBBZGRDbWQoKHsienplaWdlIn0pLCJaZWlnZVpldHRlbCIpOworICBBZGRDbWQoKHsiendlZGVsIn0pLCJXZWRlbFpldHRlbCIpOworICBBZGRDbWQoKHsiemRlcGxpZXMifSksIkxpZXNEZXBzIik7CisgIEFkZENtZCgoeyJ6ZXhwaXJlIn0pLCJFeHBpcmUiKTsKKyAgLy9jYWNoZT0oe30pOworICAKK30KKworLy8qKioqKioqKioqKioqKioqKiogQWRkQ21kICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitpbnQgQWRkTm90aXooc3RyaW5nIHN0cikgeworICAKKyAgaWYoIW9iamVjdHAoVEkpKSByZXR1cm4oMCk7CisgIGlmKCFjaGVja19hbGxvd2VkKCkpIHsKKyAgICBpZihvYmplY3RwKHRoaXNfaW50ZXJhY3RpdmUoKSkpCisgICAgICB0ZWxsX29iamVjdCh0aGlzX2ludGVyYWN0aXZlKCksCisgICAgICAgIEJTKCJEaWVzZXIgWnVncmlmZiBhdWYgZGVuIE1lcmt6ZXR0ZWwgd3VyZGUgbmljaHQgZXJsYXVidC4iKSk7CisgICAgcmV0dXJuKDApOworICB9CisgIC8vZ2dmLiBudXIgRWlubGVzZW4sIENhY2hlIG11c3MgaGllciBuaWNodCBha3R1YWxpc2llcnQgd2VyZGVuIDstKQorICBjaGVja1N0YXR1cygxKTsKKyAgc3RyPShzdHJpbmcpUEwtPl91bnBhcnNlZF9hcmdzKDApOyAgLy9rZWluIHBhcnNpbmcKKyAgaWYgKCFzdHJpbmdwKHN0cikgfHwgIXNpemVvZihzdHIpKSB7CisgICAgdGVsbF9vYmplY3QoUEwsCisgICAgICAiV2FzIG1vZWNodGVzdCBEdSBEaXIgZGVubiBub3RpZXJlbj9cbiIpOworICAgIHJldHVybigxKTsKKyAgfQorICBpZiAoc2l6ZW9mKHN0cik+TUFYX05PVEVfTEVOR1RIKSB7CisgICAgdGVsbF9vYmplY3QoUEwsQlMoCisgICAgICBzcHJpbnRmKCJEZWluZSBOb3RpeiBpc3QgbWl0ICVkIFplaWNoZW4genUgbGFuZyEgTGVpZGVyIHBhc3NlbiBhdWYgIgorICAgICAgICAgICAgICJEZWluZW4gTWVya3pldHRlbCBudXIgJSBaZWljaGVuIGRyYXVmLiIsCisgICAgICAgIHNpemVvZihzdHIpLE1BWF9OT1RFX0xFTkdUSCkpKTsKKyAgICByZXR1cm4oMSk7CisgIH0KKyAgCisgIC8vbV9hbGxvY2F0ZSBnaWx0IG51ciBiaXMgRnVua3Rpb25zZW5kZSwgZGFoZXIgaGlsZnQgZGFzIGluCisgIC8vY2hlY2tTdGF0dXMgbGVpZGVyIG5pY2h0LgorICBpZiAoIW1hcHBpbmdwKG5vdGl6ZW4pIHx8ICFzaXplb2Yobm90aXplbikpCisgICAgbm90aXplbj1tX2FsbG9jYXRlKDAsNyk7CisgIAorICAvL2ZyZWllIElEIGZpbmRlbiAobWF4dXNlZElEKzEgc29sbHRlIGRpZSBuYWVjaHN0ZSBmcmVpIHNlaW4sIGFiZXIgZmFsbHMKKyAgLy9kYSBtYWwgd2FzIGthcHV0dGdlZ2FuZ2VuIGlzdDogUHJ1ZWZlbiA7LSkgKQorICB3aGlsZShtZW1iZXIobm90aXplbixtYXh1c2VkSUQpKSB7bWF4dXNlZElEKys7fQorICAvL1JlaWhlbmZvbGdlOiBzLiBtZXJremV0dGVsLmgKKyAgbm90aXplbis9KFttYXh1c2VkSUQ6c3RyOzA7dGltZSgpOyh7fSk7KHt9KTtOT1RFX0FDVElWRTswXSk7CisvKiAgbm90aXplbis9KFttYXh1c2VkSURdKTsKKyAgbm90aXplblttYXh1c2VkSUQsTk9URV9URVhUXT1zdHI7CisgIG5vdGl6ZW5bbWF4dXNlZElELE5PVEVfUFJJT109MDsKKyAgbm90aXplblttYXh1c2VkSUQsTk9URV9TVEFSVFRJTUVdPXRpbWUoKTsKKyAgbm90aXplblttYXh1c2VkSUQsTk9URV9ERVBTXT0oe30pOworKi8KKyAgCisgIC8vY2FjaGU9KHt9KTsgLy9jYWNoZSBpbnZhbGlkaWVyZW4KKyAgLy9pbiBLdWVyemUgc3BlaWNoZXJuLCBhYmVyIG5pY2h0IGZ1ZXIgamVkZSBBZW5kZXJ1bmcgc3BlaWNoZXJuCisgIHNhdmVfbWUoNjApOworICB0ZWxsX29iamVjdChQTCxCUygKKyAgICAgIHNwcmludGYoIkR1IHNjaHJlaWJzdCBzb3JnZmFlbHRpZyBEZWluZSBOb3RpeiBhdWYgRGVpbmVuIE1lcmt6ZXR0ZWwuICIKKyAgICAgICAgICAiRXMgaXN0IG51biBkaWUgJWQuIE5vdGl6LiIsbWF4dXNlZElEKSkpOworICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoVEkpLAorICAgIEJTKHNwcmludGYoIiVzIG5vdGllcnQgc2ljaCBldHdhcyBhdWYgJXMgTWVya3pldHRlbC5cbiIsCisgICAgICAgIGNhcGl0YWxpemUoKHN0cmluZylUSS0+bmFtZShXRVIpKSwKKyAgICAgICAgKCgoaW50KVRJLT5RdWVyeVByb3AoUF9HRU5ERVIpKT09RkVNQUxFID8gImlocmVtIiA6ICJzZWluZW0iKSAKKyAgICAgICAgICAgICAgKSksKHtUSX0pKTsKKyAgcmV0dXJuKDEpOworfQorCitpbnQgTGllc05vdGl6KHN0cmluZyBzdHIpIHsKKyAgaW50IGlkOworICAKKyAgaWYoIW9iamVjdHAoVEkpKSByZXR1cm4oMCk7CisgIGlmKCFjaGVja19hbGxvd2VkKCkpIHsKKyAgICBpZihvYmplY3RwKHRoaXNfaW50ZXJhY3RpdmUoKSkpCisgICAgICB0ZWxsX29iamVjdCh0aGlzX2ludGVyYWN0aXZlKCksCisgICAgICAgIEJTKCJEaWVzZXIgWnVncmlmZiBhdWYgZGVuIE1lcmt6ZXR0ZWwgd3VyZGUgbmljaHQgZXJsYXVidC4iKSk7CisgICAgcmV0dXJuKDApOworICB9CisgIGlmICghc3RyaW5ncChzdHIpIHx8ICFzaXplb2Yoc3RyKSB8fCAhaWQ9dG9faW50KHN0cikpIHsKKyAgICB0ZWxsX29iamVjdChQTCwKKyAgICAgICJXZWxjaGUgTm90aXogbW9lY2h0ZXN0IER1IGxlc2VuPyBCaXR0ZSBlaW5lIElEIGFuZ2ViZW4hXG4iKTsKKyAgICByZXR1cm4oMSk7CisgIH0KKyAgaWYgKCFjaGVja1N0YXR1cygpKSB7CisgICAgdGVsbF9vYmplY3QoUEwsCisgICAgICAiRXMgZ2lidCBrZWluZSBOb3RpeiwgZGllIER1IGxlc2VuIGtvZW5udGVzdCFcbiIpOworICAgIHJldHVybigxKTsKKyAgfQorICBpZiAoIW1lbWJlcihub3RpemVuLGlkKSkgeworICAgIHRlbGxfb2JqZWN0KFBMLAorICAgICAgc3ByaW50ZigiRXMgZ2lidCBrZWluZSBOb3RpeiBtaXQgZGVyIElEOiAlZFxuIixpZCkpOworICAgIHJldHVybigxKTsKKyAgfQorICAvL0F1c2dhYmV0ZXh0IGhvbGVuIHVuZCBhdXNnZWJlbgorICB0ZWxsX29iamVjdChQTCxzcHJpbnRmKCJcbkR1IHZlcnRpZWZzdCBEaWNoIGluIERlaW5lbiBNZXJremV0dGVsIHVuZCBsaWVzdDpcbiVzXG4iLF9MaWVzTm90aXooaWQpKSk7CisgIHRlbGxfcm9vbShlbnZpcm9ubWVudChUSSksCisgICAgQlMoc3ByaW50ZigiJXMgbGllc3QgZXR3YXMgYXVmICVzIE1lcmt6ZXR0ZWwuXG4iLAorICAgICAgICBjYXBpdGFsaXplKChzdHJpbmcpVEktPm5hbWUoV0VSKSksCisgICAgICAgICgoKGludClUSS0+UXVlcnlQcm9wKFBfR0VOREVSKSk9PUZFTUFMRSA/ICJpaHJlbSIgOiAic2VpbmVtIikgCisgICAgICAgICAgICAgICkpLCh7VEl9KSk7CisgIHJldHVybigxKTsKK30KKworaW50IFJlbW92ZU5vdGl6KHN0cmluZyBzdHIpIHsKKyAgaW50IGlkOworICAKKyAgaWYoIW9iamVjdHAoVEkpKSByZXR1cm4oMCk7CisgIGlmKCFjaGVja19hbGxvd2VkKCkpIHsKKyAgICBpZihvYmplY3RwKHRoaXNfaW50ZXJhY3RpdmUoKSkpCisgICAgICB0ZWxsX29iamVjdCh0aGlzX2ludGVyYWN0aXZlKCksCisgICAgICAgIEJTKCJEaWVzZXIgWnVncmlmZiBhdWYgZGVuIE1lcmt6ZXR0ZWwgd3VyZGUgbmljaHQgZXJsYXVidC4iKSk7CisgICAgcmV0dXJuKDApOworICB9CisgIGlmICghc3RyaW5ncChzdHIpIHx8ICFzaXplb2Yoc3RyKSB8fCAhaWQ9dG9faW50KHN0cikpIHsKKyAgICB0ZWxsX29iamVjdChQTCwKKyAgICAgICJXZWxjaGUgTm90aXogbW9lY2h0ZXN0IER1IGF1c3JhZGllcmVuPyBCaXR0ZSBlaW5lIElEIGFuZ2ViZW4hXG4iKTsKKyAgICByZXR1cm4oMSk7CisgIH0KKyAgaWYgKCFjaGVja1N0YXR1cygpKSB7CisgICAgdGVsbF9vYmplY3QoUEwsCisgICAgICAiRXMgZ2lidCBrZWluZSBOb3RpeiwgZGllIER1IGF1c3JhZGllcmVuIGtvZW5udGVzdCFcbiIpOworICAgIHJldHVybigxKTsKKyAgfQorICBpZiAoIW1lbWJlcihub3RpemVuLGlkKSkgeworICAgIHRlbGxfb2JqZWN0KFBMLAorICAgICAgc3ByaW50ZigiRXMgZ2lidCBrZWluZSBOb3RpeiBtaXQgZGVyIElEOiAlZFxuIixpZCkpOworICAgIHJldHVybigxKTsKKyAgfQorICAvL2RpcmVrdCBMb2VzY2hlbiwga2VpbmUgS29waWUsIGRhaGVyIG1fZGVsZXRlKCkKKyAgbV9kZWxldGUobm90aXplbixpZCk7CisgIC8vaW4gS3VlcnplIHNwZWljaGVybiwgYWJlciBuaWNodCBmdWVyIGplZGUgQWVuZGVydW5nIHNwZWljaGVybgorICBzYXZlX21lKDYwKTsKKyAgLy9jYWNoZSBpbnZhbGlkaWVyZW4KKyAgLy9jYWNoZT0oe30pOworICB0ZWxsX29iamVjdChQTCwKKyAgICBzcHJpbnRmKCJTb3JnZmFlbHRpZyByYWRpZXJzdCBEdSBOb3RpeiAlZCB2b24gRGVpbmVtIE1lcmt6ZXR0ZWwuXG4iLAorICAgICAgICAgICBpZCkpOworICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoVEkpLAorICAgIEJTKHNwcmludGYoIiVzIHJhZGllcnQgc29yZ2ZhZWx0aWcgZXR3YXMgdm9uICVzIE1lcmt6ZXR0ZWwuXG4iLAorICAgICAgICBjYXBpdGFsaXplKChzdHJpbmcpVEktPm5hbWUoV0VSKSksCisgICAgICAgICgoKGludClUSS0+UXVlcnlQcm9wKFBfR0VOREVSKSk9PUZFTUFMRSA/ICJpaHJlbSIgOiAic2VpbmVtIikgCisgICAgICAgICAgICAgICkpLCh7VEl9KSk7CisgIHJldHVybigxKTsKK30KKworaW50IEZpbmlzaE5vdGl6KHN0cmluZyBzdHIpIHsKKyAgaW50IGlkOworICBtaXhlZCBsaXN0ZTsKKyAgaWYoIW9iamVjdHAoVEkpKSByZXR1cm4oMCk7CisgIGlmKCFjaGVja19hbGxvd2VkKCkpIHsKKyAgICBpZihvYmplY3RwKHRoaXNfaW50ZXJhY3RpdmUoKSkpCisgICAgICB0ZWxsX29iamVjdCh0aGlzX2ludGVyYWN0aXZlKCksCisgICAgICAgIEJTKCJEaWVzZXIgWnVncmlmZiBhdWYgZGVuIE1lcmt6ZXR0ZWwgd3VyZGUgbmljaHQgZXJsYXVidC4iKSk7CisgICAgcmV0dXJuKDApOworICB9CisgIGlmICghc3RyaW5ncChzdHIpIHx8ICFzaXplb2Yoc3RyKSB8fCAhaWQ9dG9faW50KHN0cikpIHsKKyAgICB0ZWxsX29iamVjdChQTCwKKyAgICAgICJXZWxjaGUgTm90aXogbW9lY2h0ZXN0IER1IGFiaGFrZW4/IEJpdHRlIGVpbmUgSUQgYW5nZWJlbiFcbiIpOworICAgIHJldHVybigxKTsKKyAgfQorICBpZiAoIWNoZWNrU3RhdHVzKCkpIHsKKyAgICB0ZWxsX29iamVjdChQTCwKKyAgICAgICJFcyBnaWJ0IGtlaW5lIE5vdGl6LCBkaWUgRHUgYWJoYWtlbiBrb2VubnRlc3QhXG4iKTsKKyAgICByZXR1cm4oMSk7CisgIH0KKyAgaWYgKCFtZW1iZXIobm90aXplbixpZCkpIHsKKyAgICB0ZWxsX29iamVjdChQTCwKKyAgICAgIHNwcmludGYoIkVzIGdpYnQga2VpbmUgTm90aXogbWl0IGRlciBJRDogJWRcbiIsaWQpKTsKKyAgICByZXR1cm4oMSk7CisgIH0KKyAgaWYobm90aXplbltpZCxOT1RFX1NUQVRVU109PU5PVEVfRklOSVNIRUQpIHsKKyAgICB0ZWxsX29iamVjdChQTCwKKyAgICAgIHNwcmludGYoIk5vdGl6ICVkIGlzdCBzY2hvbiBhYmdlaGFrdCFcbiIsaWQpKTsKKyAgICByZXR1cm4oMSk7CisgIH0KKyAgbGlzdGU9Z2V0VW5yZXNvbHZlZERlcHMoaWQpOyAgLy9saXN0ZSBpc3QgQXJyYXkgdm9uIGludHMKKyAgaWYgKHNpemVvZihsaXN0ZSkpIHsKKyAgICBsaXN0ZT1tYXAobGlzdGUsIyd0b19zdHJpbmcpOyAgLy9saXN0ZSBpc3QgQXJyYXkgdm9uIHN0cmluZ3MKKyAgICB0ZWxsX29iamVjdChQTCxCUyhzcHJpbnRmKCJEdSBrYW5uc3QgTm90aXogJWQgbmljaHQgYWJoYWtlbiwgZGEgbm9jaCAiCisgICAgICAgICJuaWNodCBlcmxlZGlndGUgQWJoYWVuZ2lna2VpdGVuIGV4aXN0aWVyZW4uIElEczogJXMuIiwKKyAgICAgICAgaWQsQ291bnRVcChsaXN0ZSkpKSk7CisgICAgcmV0dXJuKDEpOyAKKyAgfQorICBub3RpemVuW2lkLE5PVEVfU1RBVFVTXT1OT1RFX0ZJTklTSEVEOworICBub3RpemVuW2lkLE5PVEVfQ0xPU0VUSU1FXT10aW1lKCk7CisgIHRlbGxfb2JqZWN0KFBMLEJTKAorICAgIHNwcmludGYoIkR1IG1hbHN0IHp1ZnJpZWRlbiBlaW5lbiBzY2hvZW5lbiBncm9zc2VuIEhha2VuIGhpbnRlciAiCisgICAgICAgICJkaWUgTm90aXogTnIuICVkLiBIYWNoIC0gd2FzIGJpc3QgRHUgbnVuIHp1ZnJpZWRlbiEgOi0pXG4iLGlkKSkpOworICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoVEkpLAorICAgIEJTKHNwcmludGYoIiVzIGhha3QgZXJmcmV1dCBldHdhcyBhdWYgJXMgTWVya3pldHRlbCBhYi5cbiIsCisgICAgICAgIGNhcGl0YWxpemUoKHN0cmluZylUSS0+bmFtZShXRVIpKSwKKyAgICAgICAgKCgoaW50KVRJLT5RdWVyeVByb3AoUF9HRU5ERVIpKT09RkVNQUxFID8gImlocmVtIiA6ICJzZWluZW0iKSAKKyAgICAgICAgICAgICAgKSksKHtUSX0pKTsKKyAgcmV0dXJuKDEpOworfQorCitpbnQgTGlzdE5vdGl6ZW4oc3RyaW5nIHN0cikgeworICBpbnQgemFobCxub3RpenphaGwsaSxpZCxmaWx0ZXJzdGF0ZTsKKyAgc3RyaW5nIHR4dDsKKyAgc3RyaW5nICphcnI7CisgIHN0YXR1cyBpbnZlcnM7CisgIAorICBpZighb2JqZWN0cChUSSkpIHJldHVybigwKTsKKyAgc3RyPShzdHJpbmcpUEwtPl91bnBhcnNlZF9hcmdzKDApOworICBpZighY2hlY2tfYWxsb3dlZCgpKSB7CisgICAgaWYob2JqZWN0cCh0aGlzX2ludGVyYWN0aXZlKCkpKQorICAgICAgdGVsbF9vYmplY3QodGhpc19pbnRlcmFjdGl2ZSgpLAorICAgICAgICBCUygiRGllc2VyIFp1Z3JpZmYgYXVmIGRlbiBNZXJremV0dGVsIHd1cmRlIG5pY2h0IGVybGF1YnQuIikpOworICAgIHJldHVybigwKTsKKyAgfQorICBpZiAoIW5vdGl6emFobD1jaGVja1N0YXR1cygpKSB7CisgICAgdGVsbF9vYmplY3QoUEwsQlMoCisgICAgICAiRGVpbiBNZXJremV0dGVsIGlzdCBibHVldGVud2Vpc3MgdW5kIGxlZXIhIFdpZSBrb21tdCBkYXMgZGVubj8/ICIKKyAgICAgICJIYXN0IER1IG5peCB6dSB0dW4/IikpOworICAgIHJldHVybigxKTsKKyAgfQorICAvL0FyZ3VtZW50ZSBwYXJzZW4KKyAgaWYoc3RyaW5ncChzdHIpICYmIHNpemVvZihzdHIpKQorICAgIGFycj1leHBsb2RlKHN0ciwiICIpOworICBpZiAocG9pbnRlcnAoYXJyKSkgYXJyLT0oeyIifSk7IC8vZG9wcGVsdGUgbGVlcnplaWNoZW4gaW0gU3RyaW5nCisgIGlmIChwb2ludGVycChhcnIpICYmIHNpemVvZihhcnIpPj0yKSB7CisgICAgemFobD10b19pbnQoYXJyWzBdKTsKKyAgICBzd2l0Y2goYXJyWzFdKSB7CisgICAgICBjYXNlICJha3RpdiI6CisgICAgICAgIGZpbHRlcnN0YXRlPU5PVEVfQUNUSVZFOyBicmVhazsKKyAgICAgIGNhc2UgImluYWt0aXYiOgorICAgICAgICBmaWx0ZXJzdGF0ZT1OT1RFX0lOQUNUSVZFOyBicmVhazsKKyAgICAgIGNhc2UgIndhcnRlbmQiOgorICAgICAgY2FzZSAicGVuZGluZyI6CisgICAgICAgIGZpbHRlcnN0YXRlPU5PVEVfUEVORElORzsgYnJlYWs7CisgICAgICBjYXNlICJhYmdlaGFrdCI6CisgICAgICBjYXNlICJmZXJ0aWciOgorICAgICAgY2FzZSAiYWJnZXNjaGxvc3NlbiI6CisgICAgICAgIGZpbHRlcnN0YXRlPU5PVEVfRklOSVNIRUQ7IGJyZWFrOworICAgICAgY2FzZSAiYWxsZSI6CisgICAgICAgIGZpbHRlcnN0YXRlPTA7IGJyZWFrOworICAgICAgZGVmYXVsdDogCisgICAgICAgIGZpbHRlcnN0YXRlPXRvX2ludChhcnJbMV0pOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAocG9pbnRlcnAoYXJyKSAmJiBzaXplb2YoYXJyKT09MSkgeworICAgIHphaGw9dG9faW50KGFyclswXSk7CisgICAgZmlsdGVyc3RhdGU9Tk9URV9BQ1RJVkU7CisgIH0KKyAgZWxzZSB7CisgICAgLy9Wb3JlaW5zdGVsbHVuZ2VuCisgICAgemFobD0yMDsKKyAgICBmaWx0ZXJzdGF0ZT1OT1RFX0FDVElWRTsKKyAgfQorICAvLzEuIEFyZ3VtZW50ICJhbGwiIG9kZXIgImFsbGUiIGlzdDogYWxsZSBhbnplaWdlbgorICBpZiAocG9pbnRlcnAoYXJyKSAmJiBzaXplb2YoYXJyKSAmJiBzdHJpbmdwKGFyclswXSkgJiYKKyAgICAgIHNpemVvZihhcnJbMF0pICYmIGFyclswXT09ImFsbGUiKQorICAgIHphaGw9bm90aXp6YWhsOyAgLy9hbGxlIGFuemVpZ2VuCisgIAorICAvL3dlbm4gZGllIGdld3VlbnNjaHRlIFphaGwgZGllIEFuemFobCBnZXNwZWljaGVydGVyCisgIC8vTm90aXplbiB1ZWJlcnNjaHJlaXRldCAob2RlciAwIGlzdCkKKyAgaWYoIXphaGwgfHwgemFobD5ub3RpenphaGwpIHphaGw9bm90aXp6YWhsOworICAKKyAgLy93ZW5uIDEuIEFyZ3VtZW50IG5lZ2F0aXY6IExpc3RlIGluIHVtZ2VrZWhydGVyIFJlaWhlbmZvbGdlCisgIGlmICh6YWhsPDApIHsKKyAgICBpbnZlcnM9MTsKKyAgICB6YWhsPXphaGwqLTE7CisgIH0KKyAgdHh0PXNwcmludGYoIlxufCU6OXxzfCU6NTZ8c3wlOjd8c3xcbiIsIklEIiwiTm90aXp0ZXh0IiwiUHJpby4iKTsKKyAgdHh0Kz1zcHJpbnRmKCIlOjc4Jy0nc1xuIiwiLSIpOworICAvL2FsbGUgcGFzc2VuZGVuIE5vdGl6ZW4gZXJtaXR0ZWxuCisgIGFycj1maWx0ZXIobV9pbmRpY2VzKG5vdGl6ZW4pLCMnbm90ZV9maWx0ZXIsZmlsdGVyc3RhdGUpOworICAvL3NvcnRpZXJlbgorICBhcnI9c29ydF9hcnJheShhcnIsIydzb3J0X3ByaW8pOworICBpZiAoemFobD5zaXplb2YoYXJyKSkgemFobD1zaXplb2YoYXJyKTsKKyAgLy9hdXNnZWJlbgorICBmb3IoaT0wO2k8emFobDtpKyspIHsKKyAgICBpZiAoIWludmVycykKKyAgICAgIGlkPXRvX2ludChhcnJbaV0pOworICAgIGVsc2UKKyAgICAgIC8vdm9uIGhpbnRlbgorICAgICAgaWQ9dG9faW50KGFycls8aSsxXSk7IC8vIGkrMSBpc3Qgd2lya2xpY2ggQWJzaWNodC4gOy0pCisgICAgdHh0Kz1zcHJpbnRmKCJ8ICU6N3xkIHwgJTo1NC1zIHwgJTo1fGQgfFxuIiwKKyAgICAgICAgICAgIGlkLAorCSAgICAvL251ciBiaXMgenVtIGVyc3RlbiBcbiBhbnplaWdlbgorCSAgICBleHBsb2RlKG5vdGl6ZW5baWQsTk9URV9URVhUXSwiXG4iKVswXSwKKyAgICAgICAgICAgIG5vdGl6ZW5baWQsTk9URV9QUklPXSk7CisgIH0KKyAgdHh0Kz1zcHJpbnRmKCIlOjc4Jy0nc1xuXG4iLCItIik7CisgIHRlbGxfb2JqZWN0KFBMLHR4dCk7CisgIHRlbGxfcm9vbShlbnZpcm9ubWVudChUSSksCisgICAgQlMoc3ByaW50ZigiJXMgd2lyZnQgZWluZW4gQmxpY2sgYXVmICVzIE1lcmt6ZXR0ZWwuXG4iLAorICAgICAgICBjYXBpdGFsaXplKChzdHJpbmcpVEktPm5hbWUoV0VSKSksCisgICAgICAgICgoKGludClUSS0+UXVlcnlQcm9wKFBfR0VOREVSKSk9PUZFTUFMRSA/ICJpaHJlbiIgOiAic2VpbmVuIikgCisgICAgICAgICAgICAgICkpLCh7VEl9KSk7CisgIHJldHVybigxKTsKK30KKworaW50IENoYW5nZURlcChzdHJpbmcgc3RyKSB7CisgIGludCBpZDsKKyAgc3RyaW5nICphcnI7CisgIGludCAqZGVwczsKKyAgCisgIG5vdGlmeV9mYWlsKCJCaXR0ZSBlaW5lIElEIHVuZCBlaW5lIG1pbi4gZWluZSBBYmhhZW5naWdrZWl0IGFuZ2ViZW4hXG4iKTsKKyAgaWYoIW9iamVjdHAoVEkpKSByZXR1cm4oMCk7CisgIGlmKCFjaGVja19hbGxvd2VkKCkpIHsKKyAgICBpZihvYmplY3RwKHRoaXNfaW50ZXJhY3RpdmUoKSkpCisgICAgICB0ZWxsX29iamVjdCh0aGlzX2ludGVyYWN0aXZlKCksCisgICAgICAgIEJTKCJEaWVzZXIgWnVncmlmZiBhdWYgZGVuIE1lcmt6ZXR0ZWwgd3VyZGUgbmljaHQgZXJsYXVidC4iKSk7CisgICAgcmV0dXJuKDApOworICB9CisgIHN0cj0oc3RyaW5nKVBMLT5fdW5wYXJzZWRfYXJncygwKTsKKyAgaWYgKCFzdHJpbmdwKHN0cikgfHwgIXNpemVvZihzdHIpKQorICAgIHJldHVybigwKTsKKyAgCisgIGlmICghY2hlY2tTdGF0dXMoKSkgeworICAgIHRlbGxfb2JqZWN0KFBMLEJTKAorICAgICAgIkRlaW4gTWVya3pldHRlbCBpc3QgYmx1ZXRlbndlaXNzIHVuZCBsZWVyISBXaWUga29tbXQgZGFzIGRlbm4/PyAiCisgICAgICAiSGFzdCBEdSBuaXggenUgdHVuPyIpKTsKKyAgICByZXR1cm4oMSk7CisgIH0KKyAgYXJyPWV4cGxvZGUoc3RyLCIgIik7CisgIGFyci09KHsiIn0pOyAgLy8gIiIgZW50ZmVybmVuLCB3aWNodGlnLiA7LSkKKyAgaWYgKHNpemVvZihhcnIpPDIpCisgICAgcmV0dXJuKDApOworICBpZD10b19pbnQoYXJyWzBdKTsKKyAgYXJyLT0oe2FyclswXX0pOyAgLy9laWdlbmUgSUQgbG9lc2NoZW4KKyAgaWYgKHNpemVvZihhcnIpPDEpCisgICAgcmV0dXJuKDApOyAgLy9tZWhyZmFjaCBkaWUgZWlnZW5lIElEIGdpbHQgbmljaHQuOy0pCisgIGlmICghbWVtYmVyKG5vdGl6ZW4saWQpKSB7CisgICAgdGVsbF9vYmplY3QoUEwsCisgICAgICBzcHJpbnRmKCJFcyBnaWJ0IGtlaW5lIE5vdGl6IG1pdCBkZXIgSUQ6ICVkXG4iLGlkKSk7CisgICAgcmV0dXJuKDEpOworICB9CisgIC8vZGllcyB1cGRhdGVkIGRpcmVrdCBkaWUgQWJoYWVuZ2lna2VpdGVuIGluICdub3RpemVuJyEKKyAgbWFwKGFyciwjJ3VwZGF0ZV9kZXBzLGlkKTsKKyAgc2F2ZV9tZSg2MCk7CisgIHRlbGxfb2JqZWN0KFBMLEJTKAorICAgICAgc3ByaW50ZigiRHUgYWVuZGVyc3QgZGllIEFiaGFlbmdpZ2tlaXRlbiB2b24gTm90aXogJWQuXG4iLAorICAgICAgICAgICAgICBpZCkpKTsKKyAgdGVsbF9yb29tKGVudmlyb25tZW50KFRJKSwKKyAgICBCUyhzcHJpbnRmKCIlcyBrcml0emVsdCBhdWYgJXMgTWVya3pldHRlbCBoZXJ1bS5cbiIsCisgICAgICAgIGNhcGl0YWxpemUoKHN0cmluZylUSS0+bmFtZShXRVIpKSwKKyAgICAgICAgKCgoaW50KVRJLT5RdWVyeVByb3AoUF9HRU5ERVIpKT09RkVNQUxFID8gImlocmVtIiA6ICJzZWluZW0iKSAKKyAgICAgICAgICAgICAgKSksKHtUSX0pKTsKKyAgcmV0dXJuKDEpOworfQorCitpbnQgQ2hhbmdlUHJpbyhzdHJpbmcgc3RyKSB7CisgIGludCBpZCwgcHJpbzsKKyAgc3RyaW5nKiBhcnI7CisgIAorICBub3RpZnlfZmFpbCgiQml0dGUgZWluZSBJRCB1bmQgZWluZSBuZXVlIFByaW9yaXRhZXQgYW5nZWJlbiFcbiIpOworICBpZighb2JqZWN0cChUSSkpIHJldHVybigwKTsKKyAgaWYoIWNoZWNrX2FsbG93ZWQoKSkgeworICAgIGlmKG9iamVjdHAodGhpc19pbnRlcmFjdGl2ZSgpKSkKKyAgICAgIHRlbGxfb2JqZWN0KHRoaXNfaW50ZXJhY3RpdmUoKSwKKyAgICAgICAgQlMoIkRpZXNlciBadWdyaWZmIGF1ZiBkZW4gTWVya3pldHRlbCB3dXJkZSBuaWNodCBlcmxhdWJ0LiIpKTsKKyAgICByZXR1cm4oMCk7CisgIH0KKyAgc3RyPShzdHJpbmcpUEwtPl91bnBhcnNlZF9hcmdzKDApOworICBpZiAoIXN0cmluZ3Aoc3RyKSB8fCAhc2l6ZW9mKHN0cikpCisgICAgcmV0dXJuKDApOworICAKKyAgaWYgKCFjaGVja1N0YXR1cygpKSB7CisgICAgdGVsbF9vYmplY3QoUEwsQlMoCisgICAgICAiRGVpbiBNZXJremV0dGVsIGlzdCBibHVldGVud2Vpc3MgdW5kIGxlZXIhIFdpZSBrb21tdCBkYXMgZGVubj8/ICIKKyAgICAgICJIYXN0IER1IG5peCB6dSB0dW4/IikpOworICAgIHJldHVybigxKTsKKyAgfQorICBhcnI9ZXhwbG9kZShzdHIsIiAiKTsKKyAgaWYgKHNpemVvZihhcnIpPjIpIHsKKyAgICBub3RpZnlfZmFpbCgiQml0dGUgbnVyIGVpbmUgSUQgdW5kIGVpbmUgbmV1ZSBQcmlvcml0YWV0IGFuZ2ViZW4hIik7CisgICAgcmV0dXJuKDApOworICB9CisgIGVsc2UgaWYoc2l6ZW9mKGFycik9PTIpIHsKKyAgICBpZD10b19pbnQoYXJyWzBdKTsKKyAgICBwcmlvPXRvX2ludChhcnJbMV0pOworICB9CisgIGVsc2UKKyAgICByZXR1cm4oMCk7CisKKyAgaWYgKCFtZW1iZXIobm90aXplbixpZCkpIHsKKyAgICB0ZWxsX29iamVjdChQTCwKKyAgICAgIHNwcmludGYoIkVzIGdpYnQga2VpbmUgTm90aXogbWl0IGRlciBJRDogJWRcbiIsaWQpKTsKKyAgICByZXR1cm4oMSk7CisgIH0KKyAgbm90aXplbltpZCxOT1RFX1BSSU9dPXByaW87CisgIC8vY2FjaGU9KHt9KTsgLy9jYWNoZSBpbnZhbGlkaWVyZW4KKyAgc2F2ZV9tZSg2MCk7CisgIHRlbGxfb2JqZWN0KFBMLEJTKAorICAgICAgc3ByaW50ZigiRHUgYWVuZGVyc3QgZGllIFByaW9yaXRhZXQgdm9uIE5vdGl6ICVkIGF1ZiAlZC4iLAorICAgICAgICAgICAgICBpZCxub3RpemVuW2lkLE5PVEVfUFJJT10pKSk7CisgIHRlbGxfcm9vbShlbnZpcm9ubWVudChUSSksCisgICAgQlMoc3ByaW50ZigiJXMga3JpdHplbHQgYXVmICVzIE1lcmt6ZXR0ZWwgaGVydW0uXG4iLAorICAgICAgICBjYXBpdGFsaXplKChzdHJpbmcpVEktPm5hbWUoV0VSKSksCisgICAgICAgICgoKGludClUSS0+UXVlcnlQcm9wKFBfR0VOREVSKSk9PUZFTUFMRSA/ICJpaHJlbSIgOiAic2VpbmVtIikgCisgICAgICAgICAgICAgICkpLCh7VEl9KSk7CisgIHJldHVybigxKTsKK30KKworaW50IENoYW5nZUhlbHBlcihzdHJpbmcgc3RyKSB7CisgIGludCBpZDsKKyAgc3RyaW5nICphcnI7CisgIAorICBub3RpZnlfZmFpbCgiQml0dGUgZWluZSBJRCB1bmQgZWluZSBtaW4uIGVpbmVuIE5hbWVuIGFuZ2ViZW4hXG4iKTsKKyAgaWYoIW9iamVjdHAoVEkpKSByZXR1cm4oMCk7CisgIGlmKCFjaGVja19hbGxvd2VkKCkpIHsKKyAgICBpZihvYmplY3RwKHRoaXNfaW50ZXJhY3RpdmUoKSkpCisgICAgICB0ZWxsX29iamVjdCh0aGlzX2ludGVyYWN0aXZlKCksCisgICAgICAgIEJTKCJEaWVzZXIgWnVncmlmZiBhdWYgZGVuIE1lcmt6ZXR0ZWwgd3VyZGUgbmljaHQgZXJsYXVidC4iKSk7CisgICAgcmV0dXJuKDApOworICB9CisgIHN0cj0oc3RyaW5nKVBMLT5fdW5wYXJzZWRfYXJncygwKTsKKyAgaWYgKCFzdHJpbmdwKHN0cikgfHwgIXNpemVvZihzdHIpKQorICAgIHJldHVybigwKTsKKyAgCisgIGlmICghY2hlY2tTdGF0dXMoKSkgeworICAgIHRlbGxfb2JqZWN0KFBMLEJTKAorICAgICAgIkRlaW4gTWVya3pldHRlbCBpc3QgYmx1ZXRlbndlaXNzIHVuZCBsZWVyISBXaWUga29tbXQgZGFzIGRlbm4/PyAiCisgICAgICAiSGFzdCBEdSBuaXggenUgdHVuPyIpKTsKKyAgICByZXR1cm4oMSk7CisgIH0KKyAgYXJyPWV4cGxvZGUoc3RyLCIgIik7CisgIGFyci09KHsiIn0pOyAgLy8gIiIgZW50ZmVybmVuLCB3aWNodGlnLiA7LSkKKyAgaWYgKHNpemVvZihhcnIpPDIpCisgICAgcmV0dXJuKDApOworICBpZD10b19pbnQoYXJyWzBdKTsKKyAgYXJyLT0oe2FyclswXX0pOyAgLy9laWdlbmUgSUQgbG9lc2NoZW4KKyAgaWYgKHNpemVvZihhcnIpPDEpCisgICAgcmV0dXJuKDApOyAgLy9tZWhyZmFjaCBkaWUgZWlnZW5lIElEIGdpbHQgbmljaHQuOy0pCisgIGlmICghbWVtYmVyKG5vdGl6ZW4saWQpKSB7CisgICAgdGVsbF9vYmplY3QoUEwsCisgICAgICBzcHJpbnRmKCJFcyBnaWJ0IGtlaW5lIE5vdGl6IG1pdCBkZXIgSUQ6ICVkXG4iLGlkKSk7CisgICAgcmV0dXJuKDEpOworICB9CisgIG5vdGl6ZW5baWQsTk9URV9IRUxQRVJdPWFycjsKKyAgc2F2ZV9tZSg2MCk7CisgIHRlbGxfb2JqZWN0KFBMLEJTKAorICAgICAgc3ByaW50ZigiTWl0YXJiZWl0ZXIgdm9uIE5vdGl6ICVkIGdlYWVuZGVydC4iLGlkKSkpOworICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoVEkpLAorICAgIEJTKHNwcmludGYoIiVzIGtyaXR6ZWx0IGF1ZiAlcyBNZXJremV0dGVsIGhlcnVtLlxuIiwKKyAgICAgICAgY2FwaXRhbGl6ZSgoc3RyaW5nKVRJLT5uYW1lKFdFUikpLAorICAgICAgICAoKChpbnQpVEktPlF1ZXJ5UHJvcChQX0dFTkRFUikpPT1GRU1BTEUgPyAiaWhyZW0iIDogInNlaW5lbSIpIAorICAgICAgICAgICAgICApKSwoe1RJfSkpOworICByZXR1cm4oMSk7Cit9CisKK2ludCBDaGFuZ2VTdGF0dXMoc3RyaW5nIHN0cikgeworICBpbnQgaWQsIHN0YXRlOworICBzdHJpbmcgKmFycjsKKyAgCisgIG5vdGlmeV9mYWlsKEJTKAorICAgICAgIkJpdHRlIG1pbi4gZWluZSBJRCBhbmdlYmVuLCB1bSBkZW4gU3RhdHVzIHVtenVzY2hhbHRlbiBvZGVyICIKKyAgICAgICJlaW5lIElEIHVuZCBkZW4gbmV1ZW4gU3RhdHVzICgxPT1Ba3RpdiwgMj09V2FydGVuZCwgIgorICAgICAgIi0xPT1JbmFrdGl2L1BhdXNlKSIpKTsKKyAgaWYoIW9iamVjdHAoVEkpKSByZXR1cm4oMCk7CisgIGlmKCFjaGVja19hbGxvd2VkKCkpIHsKKyAgICBpZihvYmplY3RwKHRoaXNfaW50ZXJhY3RpdmUoKSkpCisgICAgICB0ZWxsX29iamVjdCh0aGlzX2ludGVyYWN0aXZlKCksCisgICAgICAgIEJTKCJEaWVzZXIgWnVncmlmZiBhdWYgZGVuIE1lcmt6ZXR0ZWwgd3VyZGUgbmljaHQgZXJsYXVidC4iKSk7CisgICAgcmV0dXJuKDApOworICB9CisgIHN0cj0oc3RyaW5nKVBMLT5fdW5wYXJzZWRfYXJncygwKTsKKyAgaWYgKCFzdHJpbmdwKHN0cikgfHwgIXNpemVvZihzdHIpKQorICAgIHJldHVybigwKTsKKyAgaWYgKCFjaGVja1N0YXR1cygpKSB7CisgICAgdGVsbF9vYmplY3QoUEwsQlMoCisgICAgICAiRGVpbiBNZXJremV0dGVsIGlzdCBibHVldGVud2Vpc3MgdW5kIGxlZXIhIFdpZSBrb21tdCBkYXMgZGVubj8/ICIKKyAgICAgICJIYXN0IER1IG5peCB6dSB0dW4/IikpOworICAgIHJldHVybigxKTsKKyAgfQorICBhcnI9ZXhwbG9kZShzdHIsIiAiKTsKKyAgaWYgKHNpemVvZihhcnIpPjIpIHsKKyAgICBub3RpZnlfZmFpbCgiQml0dGUgbnVyIGVpbmUgSUQgdW5kIGVpbmVuIG5ldWVuIFN0YXR1cyBhbmdlYmVuISIpOworICAgIHJldHVybigwKTsKKyAgfQorICBlbHNlIGlmKHNpemVvZihhcnIpPT0yKSB7CisgICAgaWQ9dG9faW50KGFyclswXSk7CisgICAgc3RhdGU9dG9faW50KGFyclsxXSk7CisgIH0KKyAgZWxzZSBpZihzaXplb2YoYXJyKT09MSkgeworICAgIGlkPXRvX2ludChhcnJbMF0pOworICB9CisgIGVsc2UKKyAgICByZXR1cm4oMCk7CisgIAorICBpZiAoIW1lbWJlcihub3RpemVuLGlkKSkgeworICAgIHRlbGxfb2JqZWN0KFBMLAorICAgICAgc3ByaW50ZigiRXMgZ2lidCBrZWluZSBOb3RpeiBtaXQgZGVyIElEOiAlZFxuIixpZCkpOworICAgIHJldHVybigxKTsKKyAgfQorICBpZihtZW1iZXIoTk9URV9TVEFURVMsc3RhdGUpPT0tMSkgeworICAgIGlmIChub3RpemVuW2lkLE5PVEVfU1RBVFVTXT09Tk9URV9BQ1RJVkUpIHsKKyAgICAgIHRlbGxfb2JqZWN0KFBMLEJTKAorICAgICAgICAgIHNwcmludGYoIiVkIGlzdCBlaW4gdW5iZWthbm50ZXIgU3RhdHVzLCBzZXR6dCBOb3RpeiAlZCBhdWYgIgorICAgICAgICAgICAgICAiJ0luYWt0aXYnLiIsc3RhdGUsaWQpKSk7CisgICAgICBzdGF0ZT1OT1RFX0lOQUNUSVZFOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHRlbGxfb2JqZWN0KFBMLEJTKAorICAgICAgICAgIHNwcmludGYoIiVkIGlzdCBlaW4gdW5iZWthbm50ZXIgU3RhdHVzLCBzZXR6dCBOb3RpeiAlZCBhdWYgIgorICAgICAgICAgICAgICAiJ0FrdGl2Jy4iLHN0YXRlLGlkKSkpOworICAgICAgc3RhdGU9Tk9URV9BQ1RJVkU7CisgICAgfQorICB9CisgIG5vdGl6ZW5baWQsTk9URV9TVEFUVVNdPXN0YXRlOworICBzYXZlX21lKDYwKTsKKyAgdGVsbF9vYmplY3QoUEwsQlMoCisgICAgICBzcHJpbnRmKCJTdGF0dXMgdm9uIE5vdGl6ICVkIGdlYWVuZGVydC4iLGlkKSkpOworICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoVEkpLAorICAgIEJTKHNwcmludGYoIiVzIGtyaXR6ZWx0IGF1ZiAlcyBOb3RpenpldHRlbCBoZXJ1bS5cbiIsCisgICAgICAgIGNhcGl0YWxpemUoKHN0cmluZylUSS0+bmFtZShXRVIpKSwKKyAgICAgICAgKCgoaW50KVRJLT5RdWVyeVByb3AoUF9HRU5ERVIpKT09RkVNQUxFID8gImlocmVtIiA6ICJzZWluZW0iKSAKKyAgICAgICAgICAgICAgKSksKHtUSX0pKTsKKyAgcmV0dXJuKDEpOworfQorCitpbnQgRXJzZXR6ZVRleHQoc3RyaW5nIHN0cikgeworICBzdHJpbmcgKmFycjsKKyAgaW50IGlkOworICAKKyAgbm90aWZ5X2ZhaWwoIkJpdHRlIGVpbmUgSUQgdW5kIGVpbmVuIG5ldWVuIFRleHQgYW5nZWJlbiFcbiIpOworICBpZighb2JqZWN0cChUSSkpIHJldHVybigwKTsKKyAgCisgIGlmKCFjaGVja19hbGxvd2VkKCkpIHsKKyAgICBpZihvYmplY3RwKHRoaXNfaW50ZXJhY3RpdmUoKSkpCisgICAgICB0ZWxsX29iamVjdCh0aGlzX2ludGVyYWN0aXZlKCksCisgICAgICAgIEJTKCJEaWVzZXIgWnVncmlmZiBhdWYgZGVuIE1lcmt6ZXR0ZWwgd3VyZGUgbmljaHQgZXJsYXVidC4iKSk7CisgICAgcmV0dXJuKDApOworICB9CisgIHN0cj0oc3RyaW5nKVBMLT5fdW5wYXJzZWRfYXJncygwKTsKKyAgaWYgKCFzdHJpbmdwKHN0cikgfHwgIXNpemVvZihzdHIpKQorICAgIHJldHVybigwKTsKKyAgCisgIGlmICghY2hlY2tTdGF0dXMoKSkgeworICAgIHRlbGxfb2JqZWN0KFBMLEJTKAorICAgICAgIkRlaW4gTWVya3pldHRlbCBpc3QgYmx1ZXRlbndlaXNzIHVuZCBsZWVyISBXaWUga29tbXQgZGFzIGRlbm4/PyAiCisgICAgICAiSGFzdCBEdSBuaXggenUgdHVuPyIpKTsKKyAgICByZXR1cm4oMSk7CisgIH0KKyAgYXJyPWV4cGxvZGUoc3RyLCIgIik7CisgIGFyci09KHsiIn0pOyAgLy8gIiIgZW50ZmVybmVuCisgIGlmIChzaXplb2YoYXJyKTwyKQorICAgIHJldHVybigwKTsKKyAgaWQ9dG9faW50KGFyclswXSk7CisgIHN0cj1pbXBsb2RlKGFyclsxLi5dLCIgIik7ICAvL3RleHQgd2llZGVyaGVyc3RlbGxlbiwgb2huZSBlcnN0ZXMgRWxlbWVudAorICBpZiAoIXNpemVvZihzdHIpKSByZXR1cm4oMCk7CisgIGlmICghbWVtYmVyKG5vdGl6ZW4saWQpKSB7CisgICAgdGVsbF9vYmplY3QoUEwsCisgICAgICBzcHJpbnRmKCJFcyBnaWJ0IGtlaW5lIE5vdGl6IG1pdCBkZXIgSUQ6ICVkXG4iLGlkKSk7CisgICAgcmV0dXJuKDEpOworICB9CisgIG5vdGl6ZW5baWQsTk9URV9URVhUXT1zdHI7CisgIHNhdmVfbWUoNjApOworICB0ZWxsX29iamVjdChQTCxCUygKKyAgICAgIHNwcmludGYoIlRleHQgdm9uIE5vdGl6ICVkIGVyc2V0enQuIixpZCkpKTsKKyAgdGVsbF9yb29tKGVudmlyb25tZW50KFRJKSwKKyAgICBCUyhzcHJpbnRmKCIlcyByYWRpZXJ0IHp1ZXJzdCBldHdhcyBhdWYgJXMgTm90aXp6ZXR0ZWwgaGVydW0gdW5kICIKKyAgICAgICAgInNjaHJlaWJ0IGFuc2NobGllc3NlbmQgc29yZ2ZhZWx0aWcgZXR3YXMgbmV1ZXMgYXVmLlxuIiwKKyAgICAgICAgY2FwaXRhbGl6ZSgoc3RyaW5nKVRJLT5uYW1lKFdFUikpLAorICAgICAgICAoKChpbnQpVEktPlF1ZXJ5UHJvcChQX0dFTkRFUikpPT1GRU1BTEUgPyAiaWhyZW0iIDogInNlaW5lbSIpIAorICAgICAgICAgICAgICApKSwoe1RJfSkpOworICByZXR1cm4oMSk7Cit9CisKK2ludCBFcmdhZW56ZVRleHQoc3RyaW5nIHN0cikgeworICBzdHJpbmcgKmFycjsKKyAgaW50IGlkOworICAKKyAgbm90aWZ5X2ZhaWwoIkJpdHRlIGVpbmUgSUQgdW5kIGVpbmVuIFRleHQgYW5nZWJlbiFcbiIpOworICBpZighb2JqZWN0cChUSSkpIHJldHVybigwKTsKKyAgaWYoIWNoZWNrX2FsbG93ZWQoKSkgeworICAgIGlmKG9iamVjdHAodGhpc19pbnRlcmFjdGl2ZSgpKSkKKyAgICAgIHRlbGxfb2JqZWN0KHRoaXNfaW50ZXJhY3RpdmUoKSwKKyAgICAgICAgQlMoIkRpZXNlciBadWdyaWZmIGF1ZiBkZW4gTWVya3pldHRlbCB3dXJkZSBuaWNodCBlcmxhdWJ0LiIpKTsKKyAgICByZXR1cm4oMCk7CisgIH0KKyAgc3RyPShzdHJpbmcpUEwtPl91bnBhcnNlZF9hcmdzKDApOworICBpZiAoIXN0cmluZ3Aoc3RyKSB8fCAhc2l6ZW9mKHN0cikpCisgICAgcmV0dXJuKDApOworICAKKyAgaWYgKCFjaGVja1N0YXR1cygpKSB7CisgICAgdGVsbF9vYmplY3QoUEwsQlMoCisgICAgICAiRGVpbiBNZXJremV0dGVsIGlzdCBibHVldGVud2Vpc3MgdW5kIGxlZXIhIFdpZSBrb21tdCBkYXMgZGVubj8/ICIKKyAgICAgICJIYXN0IER1IG5peCB6dSB0dW4/IikpOworICAgIHJldHVybigxKTsKKyAgfQorICBhcnI9ZXhwbG9kZShzdHIsIiAiKTsKKyAgYXJyLT0oeyIifSk7ICAvLyAiIiBlbnRmZXJuZW4KKyAgaWYgKHNpemVvZihhcnIpPDIpCisgICAgcmV0dXJuKDApOworICBpZD10b19pbnQoYXJyWzBdKTsKKyAgc3RyPSJcbiI7CisgIHN0cis9aW1wbG9kZShhcnJbMS4uXSwiICIpOyAgLy90ZXh0IHdpZWRlcmhlcnN0ZWxsZW4KKyAgaWYgKCFtZW1iZXIobm90aXplbixpZCkpIHsKKyAgICB0ZWxsX29iamVjdChQTCwKKyAgICAgIHNwcmludGYoIkVzIGdpYnQga2VpbmUgTm90aXogbWl0IGRlciBJRDogJWRcbiIsaWQpKTsKKyAgICByZXR1cm4oMSk7CisgIH0KKyAgbm90aXplbltpZCxOT1RFX1RFWFRdKz1zdHI7CisgIHNhdmVfbWUoNjApOworICB0ZWxsX29iamVjdChQTCxCUygKKyAgICAgIHNwcmludGYoIlRleHQgdm9uIE5vdGl6ICVkIGVyZ2Flbnp0LiIsaWQpKSk7CisgIHRlbGxfcm9vbShlbnZpcm9ubWVudChUSSksCisgICAgQlMoc3ByaW50ZigiJXMgZXJnYWVuenQgZXR3YXMgYXVmICVzIE5vdGl6emV0dGVsLlxuIiwKKyAgICAgICAgY2FwaXRhbGl6ZSgoc3RyaW5nKVRJLT5uYW1lKFdFUikpLAorICAgICAgICAoKChpbnQpVEktPlF1ZXJ5UHJvcChQX0dFTkRFUikpPT1GRU1BTEUgPyAiaWhyZW0iIDogInNlaW5lbSIpIAorICAgICAgICAgICAgICApKSwoe1RJfSkpOworICByZXR1cm4oMSk7Cit9CisKK2ludCBaZWlnZVpldHRlbChzdHJpbmcgc3RyKSB7CisgICAgLy9hbmRlcmVuIHplaWdlbiwgd2llIGZ1cmNodGJhciB2aWVsIG1hbiB6dSB0dW4gaGF0LgorICBvYmplY3QgcGw7CisgIGludCBjb3VudDsKKyAgaW50ICppZHM7CisgIAorICBub3RpZnlfZmFpbCgiV2VtIHdpbGxzdCBEdSBEZWluZW4gTWVya3pldHRlbCB6ZWlnZW4/XG4iKTsKKyAgaWYgKCFvYmplY3RwKFRJKSkgcmV0dXJuKDApOworICBpZiAoIWVudmlyb25tZW50KCkgfHwgIWVudmlyb25tZW50KGVudmlyb25tZW50KCkpKQorICAgICByZXR1cm4oMCk7CisgIGlmICghc3RyaW5ncChzdHIpIHx8ICFzaXplb2Yoc3RyKSkgcmV0dXJuKDApOworICBpZighY2hlY2tfYWxsb3dlZCgpKSB7CisgICAgaWYob2JqZWN0cCh0aGlzX2ludGVyYWN0aXZlKCkpKQorICAgICAgdGVsbF9vYmplY3QodGhpc19pbnRlcmFjdGl2ZSgpLAorICAgICAgICBCUygiRGllc2VyIFp1Z3JpZmYgYXVmIGRlbiBNZXJremV0dGVsIHd1cmRlIG5pY2h0IGVybGF1YnQuIikpOworICAgIHJldHVybigwKTsKKyAgfQorIGlmICghY2hlY2tTdGF0dXMoKSkgeworICAgIHRlbGxfb2JqZWN0KFBMLEJTKAorICAgICAgIkRlaW4gTWVya3pldHRlbCBpc3QgYmx1ZXRlbndlaXNzIHVuZCBsZWVyISBXaWUga29tbXQgZGFzIGRlbm4/PyAiCisgICAgICAiSGFzdCBEdSBuaXggenUgdHVuPyBEdSB3aWxsc3QgYW5kZXJlbiBMZXV0ZW4gZG9jaCBiZXN0aW1tdCBuaWNodCAiCisgICAgICAiemVpZ2VuLCBkYXNzIER1IG5peCB6dSB0dW4gaGFzdCwgb2Rlcj8iKSk7CisgICAgcmV0dXJuKDEpOworICB9CisgaWYoIW9iamVjdHAocGw9cHJlc2VudChzdHIsZW52aXJvbm1lbnQoZW52aXJvbm1lbnQoKSkpKSkKKyAgICAgcmV0dXJuKDApOworIGlmICghbGl2aW5nKHBsKSkKKyAgICAgcmV0dXJuKDApOworCisgaWRzPWZpbHRlcihtX2luZGljZXMobm90aXplbiksIydub3RlX2ZpbHRlcixOT1RFX0FDVElWRSk7CisgdGVsbF9vYmplY3QoVEksQlMoIkR1IHplaWdzdCAiK3BsLT5OYW1lKFdFTSkrIiB2b2xsZXIgU3RvbHogZGVpbmVuIHZvbGxlbiAiCisgICAgICAgIk1lcmt6ZXR0ZWwuIikpOworIHRlbGxfcm9vbShlbnZpcm9ubWVudChlbnZpcm9ubWVudCgpKSxCUyhzcHJpbnRmKAorCSAiJXMgemVpZ3QgJXMgJXMgTWVya3pldHRlbC4iLAorICAgICAgIFRJLT5OYW1lKFdFUikscGwtPk5hbWUoV0VNKSxUSS0+UXVlcnlQb3NzUHJvbm91bihNQUxFLFdFTixTSU5HVUxBUikpKSwKKyAgICAgKHtUSSxwbH0pKTsKKyBzd2l0Y2goc2l6ZW9mKGlkcykpIHsKKyAgICAgY2FzZSAwLi4xMDoKKyAgICAgICB0ZWxsX29iamVjdChwbCxCUyhzcHJpbnRmKCIlcyB6ZWlndCBEaXIgdm9sbGVyIFN0b2x6ICVzIE1lcmt6ZXR0ZWwuIER1ICIKKwkgICAgICAgIndpcmZzdCBlaW5lbiBzY2huZWxsZW4gQmxpY2sgZGFydWViZXIgdW5kIHphZWhsc3QgJWQgIgorCSAgICAgICAiTm90aXplbi4gTmEsIHNvdmllbCBpc3QgZGFzIGphIHp1bSBHbHVlY2sgbm9jaCBuaWNodC4iLAorCSAgICAgICBUSS0+TmFtZShXRVIpLFRJLT5RdWVyeVBvc3NQcm9ub3VuKE1BTEUsV0VOLFNJTkdVTEFSKSwKKwkgICAgICAgc2l6ZW9mKGlkcykpKSk7CisgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMS4uMjA6CisgICAgICAgIHRlbGxfb2JqZWN0KHBsLEJTKHNwcmludGYoIiVzIHplaWd0IERpciB2b2xsZXIgU3RvbHogJXMgTWVya3pldHRlbC4gRHUgIgorCSAgICAgICAid2lyZnN0IGVpbmVuIHNjaG5lbGxlbiBCbGljayBkYXJ1ZWJlciB1bmQgemFlaGxzdCAlZCAiCisJICAgICAgICJOb3RpemVuLiBPaCwgZGFzIGlzdCBqYSBzY2hvbiBzbyBlaW5pZ2VzISIsCisJICAgICAgIFRJLT5OYW1lKFdFUiksVEktPlF1ZXJ5UG9zc1Byb25vdW4oTUFMRSxXRU4sU0lOR1VMQVIpLAorCSAgICAgICBzaXplb2YoaWRzKSkpKTsKKyAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICB0ZWxsX29iamVjdChwbCxCUyhzcHJpbnRmKCIlcyB6ZWlndCBEaXIgdm9sbGVyIFN0b2x6ICVzIE1lcmt6ZXR0ZWwuIER1ICIKKwkgICAgICAgIndpcmZzdCBlaW5lbiBzY2huZWxsZW4gQmxpY2sgZGFydWViZXIgdW5kIHphZWhsc3QgJWQgIgorCSAgICAgICAiTm90aXplbi4gUHV1dWguICVzIGhhdCBnYW56IHNjaG9lbiB2aWVsIHp1IHR1biEgSW4gIgorCSAgICAgICAiRGlyIHJlZ3Qgc2ljaCBsZWlzZXMgTWl0bGVpZC4iLAorCSAgICAgICBUSS0+TmFtZShXRVIpLFRJLT5RdWVyeVBvc3NQcm9ub3VuKE1BTEUsV0VOLFNJTkdVTEFSKSwKKwkgICAgICAgc2l6ZW9mKGlkcyksVEktPk5hbWUoV0VSKSApKSk7CisgICAgICAgYnJlYWs7CisgfQorIHJldHVybigxKTsKKyB9CisKK2ludCBXZWRlbFpldHRlbChzdHJpbmcgc3RyKSB7CisgICAgb2JqZWN0IHBsOworICAgIHN0cmluZyByd2VkZWw7CisgIC8vd2VkZWx0IGFuZGVyZW4gbWl0IGRlbSBaZXR0ZWwgdm9yIGRlciBOYXNlIGhlcnVtLgorICBub3RpZnlfZmFpbCgiV2VtIHdpbGxzdCBEdSBEZWluZW4gTWVya3pldHRlbCB6ZWlnZW4/XG4iKTsKKyAgaWYgKCFvYmplY3RwKFRJKSkgcmV0dXJuKDApOworICBpZiAoIWVudmlyb25tZW50KCkgfHwgIWVudmlyb25tZW50KGVudmlyb25tZW50KCkpKQorICAgICByZXR1cm4oMCk7CisgIGlmICghc3RyaW5ncChzdHIpIHx8ICFzaXplb2Yoc3RyKSkgcmV0dXJuKDApOworICBpZighY2hlY2tfYWxsb3dlZCgpKSB7CisgICAgaWYob2JqZWN0cCh0aGlzX2ludGVyYWN0aXZlKCkpKQorICAgICAgdGVsbF9vYmplY3QodGhpc19pbnRlcmFjdGl2ZSgpLAorICAgICAgICBCUygiRGllc2VyIFp1Z3JpZmYgYXVmIGRlbiBNZXJremV0dGVsIHd1cmRlIG5pY2h0IGVybGF1YnQuIikpOworICAgIHJldHVybigwKTsKKyAgfQorICBpZiAoIW9iamVjdHAocGw9ZmluZF9wbGF5ZXIoc3RyKSkpIHJldHVybigwKTsKKyAgaWYgKCFwcmVzZW50KHBsLGVudmlyb25tZW50KGVudmlyb25tZW50KCkpKSkKKyAgICByd2VkZWw9ImF1cyBkZXIgRmVybmUiOworICAgICAgCisgIHRlbGxfb2JqZWN0KFBMLEJTKCJEdSB3ZWRlbHN0ICIrcGwtPk5hbWUoV0VNKSAKKwkrIChyd2VkZWw/IiAiK3J3ZWRlbDoiIikgCisJKyIgaGVmdGlnIG1pdCBEZWluZW0gTWVya3pldHRlbCB2b3IgZGVyIE5hc2UgaGVydW0uIikpOworICB0ZWxsX29iamVjdChwbCxCUyhQTC0+TmFtZShXRVIpKyAiIHdlZGVsdCBEaXIgIiAKKwkrIChyd2VkZWw/cndlZGVsKyIgIjoiIikgKyJoZWZ0aWcgbWl0ICIKKwkrUEwtPlF1ZXJ5UG9zc1Byb25vdW4oTUFMRSxXRU0sU0lOR1VMQVIpCisJKyIgTWVya3pldHRlbCB2b3IgZGVyIE5hc2UgaGVydW0uIikpOworICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQocGwpLEJTKFBMLT5OYW1lKFdFUikgKyAiIHdlZGVsdCAiCisJK3BsLT5OYW1lKFdFTSkgKyAocndlZGVsPyIgIityd2VkZWw6IiIpICsgIiBoZWZ0aWcgbWl0ICIKKyAgICAgICArUEwtPlF1ZXJ5UG9zc1Byb25vdW4oTUFMRSxXRU0sU0lOR1VMQVIpCisgICAgICAgKyIgTWVya3pldHRlbCB2b3IgZGVyIE5hc2UgaGVydW0uIiksKHtQTCxwbH0pKTsKKyAgcmV0dXJuKDEpOworfQorCitpbnQgTGllc0RlcHMoc3RyaW5nIHN0cikgeworICAvL2Vyc3RtYWwgKHJla3Vyc2l2KSBhbGxlIEFiaGFlbmdpZ2tlaXRlbiBlaW5lciBOb3RpeiBlcm1pdHRlbG4KKyAgc3RyaW5nICphcnI7CisgIGludCBpZCwgcmVjLCBpOworICBpbnQgKmxpc3RlOworICAKKyAgbm90aWZ5X2ZhaWwoIkJpdHRlIGVpbmUgSUQgdW5kIGdnZi4gJzEnIGZ1ZXIgcmVrdXJzaXZlIFN1Y2hlIGFuZ2ViZW4hXG4iKTsKKyAgaWYoIW9iamVjdHAoVEkpKSByZXR1cm4oMCk7CisgIGlmKCFjaGVja19hbGxvd2VkKCkpIHsKKyAgICBpZihvYmplY3RwKHRoaXNfaW50ZXJhY3RpdmUoKSkpCisgICAgICB0ZWxsX29iamVjdCh0aGlzX2ludGVyYWN0aXZlKCksCisgICAgICAgIEJTKCJEaWVzZXIgWnVncmlmZiBhdWYgZGVuIE1lcmt6ZXR0ZWwgd3VyZGUgbmljaHQgZXJsYXVidC4iKSk7CisgICAgcmV0dXJuKDApOworICB9CisgIHN0cj0oc3RyaW5nKVBMLT5fdW5wYXJzZWRfYXJncygwKTsKKyAgaWYgKCFzdHJpbmdwKHN0cikgfHwgIXNpemVvZihzdHIpKQorICAgIHJldHVybigwKTsKKyAgCisgIGlmICghY2hlY2tTdGF0dXMoKSkgeworICAgIHRlbGxfb2JqZWN0KFBMLEJTKAorICAgICAgIkRlaW4gTWVya3pldHRlbCBpc3QgYmx1ZXRlbndlaXNzIHVuZCBsZWVyISBXaWUga29tbXQgZGFzIGRlbm4/PyAiCisgICAgICAiSGFzdCBEdSBuaXggenUgdHVuPyIpKTsKKyAgICByZXR1cm4oMSk7CisgIH0KKyAgYXJyPWV4cGxvZGUoc3RyLCIgIik7CisgIGFyci09KHsiIn0pOyAgLy8gIiIgZW50ZmVybmVuCisgIGlmIChzaXplb2YoYXJyKT09MSkgeworICAgIGlkPXRvX2ludChhcnJbMF0pOworICAgIHJlYz0wOyAgLy9TdGFuZGFyZDoga2VpbmUgUmVrdXJzaW9uCisgIH0KKyAgZWxzZSBpZiAoc2l6ZW9mKGFycik+PTIpIHsKKyAgICBpZD10b19pbnQoYXJyWzBdKTsKKyAgICByZWM9dG9faW50KGFyclsxXSk7CisgIH0KKyAgZWxzZSB7CisgICAgcmV0dXJuKDApOworICB9CisgIGlmICghbWVtYmVyKG5vdGl6ZW4saWQpKSB7CisgICAgdGVsbF9vYmplY3QoUEwsCisgICAgICBzcHJpbnRmKCJFcyBnaWJ0IGtlaW5lIE5vdGl6IG1pdCBkZXIgSUQ6ICVkXG4iLGlkKSk7CisgICAgcmV0dXJuKDEpOworICB9CisgIC8vTm90aXplbiwgdm9uIGRlbmVuIGlkIGFiaGFlbmd0LCBob2xlbgorICAvL3VuZCBudXIgYWt0aXZlIE5vdGl6ZW4gYmVoYWx0ZW4KKyAgbGlzdGU9ZmlsdGVyKGdldERlcHMoaWQscmVjKSwjJ25vdGVfZmlsdGVyLE5PVEVfQUNUSVZFKTsKKyAgLy9uYWNoIFByaW9yaXRhZXQgc29ydGllcmVuCisgIGxpc3RlPXNvcnRfYXJyYXkobGlzdGUsIydzb3J0X3ByaW8pOworICAvL2Rhbm4gbWFsIGF1c2dlYmVuLgorICBpPXNpemVvZihsaXN0ZSk7CisgIHRlbGxfb2JqZWN0KFBMLEJTKHNwcmludGYoIkR1IHZlcnRpZWZzdCBEaWNoIGluIGRpZSBBYmhhZW5oaWdrZWl0ZW4gdm9uIE5vdGl6OiAlZFxuIixpZCkpKTsKKyAgd2hpbGUoaS0tKSB7CisgICAgdGVsbF9vYmplY3QoUEwsX0xpZXNOb3RpeihsaXN0ZVtpXSkrIlxuIik7CisgIH0KKyAgdGVsbF9yb29tKGVudmlyb25tZW50KFRJKSwKKyAgICBCUyhzcHJpbnRmKCIlcyBsaWVzdCBldHdhcyBhdWYgJXMgTWVya3pldHRlbC5cbiIsCisgICAgICAgIGNhcGl0YWxpemUoKHN0cmluZylUSS0+bmFtZShXRVIpKSwKKyAgICAgICAgKCgoaW50KVRJLT5RdWVyeVByb3AoUF9HRU5ERVIpKT09RkVNQUxFID8gImlocmVtIiA6ICJzZWluZW0iKSAKKyAgICAgICAgICAgICAgKSksKHtUSX0pKTsKKyAgcmV0dXJuKDEpOyAgICAKK30KKworaW50IEV4cGlyZShzdHJpbmcgc3RyKSB7CisgIGZsb2F0IGFnZTsKKyAgaW50IHNla3VuZGVuLCBpOworICBpbnQgKmxpc3RlOworICBzdHJpbmcgcmVzOworICAKKyAgbm90aWZ5X2ZhaWwoIkJpdHRlIGFuZ2ViZW4sIHdpZSBhbHQgenUgbG9lc2NoZW5kZSBOb3RpemVuIHNlaW4gc29sbGVuIChpbiBUYWdlbikhXG4iKTsKKyAgaWYoIW9iamVjdHAoVEkpKSByZXR1cm4oMCk7CisgIGlmKCFjaGVja19hbGxvd2VkKCkpIHsKKyAgICBpZihvYmplY3RwKHRoaXNfaW50ZXJhY3RpdmUoKSkpCisgICAgICB0ZWxsX29iamVjdCh0aGlzX2ludGVyYWN0aXZlKCksCisgICAgICAgIEJTKCJEaWVzZXIgWnVncmlmZiBhdWYgZGVuIE1lcmt6ZXR0ZWwgd3VyZGUgbmljaHQgZXJsYXVidC4iKSk7CisgICAgcmV0dXJuKDApOworICB9CisgIHN0cj0oc3RyaW5nKVBMLT5fdW5wYXJzZWRfYXJncygwKTsKKyAgaWYgKCFzdHJpbmdwKHN0cikgfHwgIXNpemVvZihzdHIpKQorICAgIHJldHVybigwKTsKKyAgYWdlPXRvX2Zsb2F0KHN0cik7CisgIGlmIChhZ2U8PTApIHJldHVybigwKTsKKyAgc2VrdW5kZW49dGltZSgpIC0gKGludCkoYWdlKjg2NDAwKTsKKyAgaWYgKCFjaGVja1N0YXR1cygpKSB7CisgICAgdGVsbF9vYmplY3QoUEwsQlMoCisgICAgICAiRGVpbiBNZXJremV0dGVsIGlzdCBibHVldGVud2Vpc3MgdW5kIGxlZXIhIFdpZSBrb21tdCBkYXMgZGVubj8/ICIKKyAgICAgICJIYXN0IER1IG5peCB6dSB0dW4/IikpOworICAgIHJldHVybigxKTsKKyAgfQorICAvL2FiZ2VoYWt0ZSBOb3RpemVuIGVybWl0dGVsbgorICBsaXN0ZT1maWx0ZXIobV9pbmRpY2VzKG5vdGl6ZW4pLCMnbm90ZV9maWx0ZXIsTk9URV9GSU5JU0hFRCk7CisgIC8vTm90aXplbiBlcm1pdHRlbG4sIGRpZSBsYW5nIGdlbnVnIGFiZ2VoYWt0IHNpbmQuCisgIGxpc3RlPWZpbHRlcihsaXN0ZSwjJ2FlbHRlcl9hbHMsc2VrdW5kZW4pOworICBpZiAoIXNpemVvZihsaXN0ZSkpIHsKKyAgICB0ZWxsX29iamVjdChQTCxCUygiS2VpbmUgTm90aXplbiBnZWZ1bmRlbiwgZGllIGxhbmcgZ2VudWcgYWJnZWhha3Qgc2luZC4iKSk7CisgICAgcmV0dXJuKDEpOworICB9CisgIHJlcz1zcHJpbnRmKCJBcmNoaXZpZXJ0ZSBOb3RpemVuIHZvbSAlc1xuXG4iLGR0aW1lKHRpbWUoKSkpOworICBmb3IgKGk9c2l6ZW9mKGxpc3RlKTtpLS07KSB7CisgICAgLy9JbmZvcyBub2NoIGVpbm1hbCBhdXNnZWJlbiB1bmQgbG9lc2NoZW4KKyAgICByZXMrPV9MaWVzTm90aXoobGlzdGVbaV0pKyJcbiI7CisgICAgbV9kZWxldGUobm90aXplbixsaXN0ZVtpXSk7CisgIH0KKyAgcmVzKz0iXG4iOworICB3cml0ZV9maWxlKEFSQ0hJVkUob3duZXIpLHJlcyk7CisgIHRlbGxfb2JqZWN0KFBMLEJTKHNwcmludGYoCisgICAgIiVkIGFsdGUgTm90aXplbiB3dXJkZW4gbmFjaCAlcyBhcmNoaXZpZXJ0IHVuZCBnZWxvZXNjaHQuIiwKKyAgICAgICBzaXplb2YobGlzdGUpLEFSQ0hJVkUob3duZXIpKSkpOworICByZXR1cm4oMSk7Cit9CisKKy8vCitzdGF0aWMgc3RyaW5nIF9MaWVzTm90aXooaW50IGlkKSB7CisgIC8vRnVua3Rpb24gdmVybGFlc3N0IHNpY2ggZHJhdWYsIGRhc3MgaWQgZXhpc3RpZXJ0LiA7LSkKKyAgc3RyaW5nIHJlcyx0eHQ7CisgIHJlcz1CU0woc3ByaW50ZigiJS0xMXM6ICVkIiwiTm90aXotTnIuIixpZCkpOworICByZXMrPWJyZWFrX3N0cmluZyhub3RpemVuW2lkLE5PVEVfVEVYVF0sNzgsIk5vdGl6dGV4dCAgOiAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCU19JTkRFTlRfT05DRXxCU19MRUFWRV9NWV9MRlMpOworICByZXMrPXNwcmludGYoIiUtMTFzOiAlZFxuIiwiUHJpb3JpdGFldCIsbm90aXplbltpZCxOT1RFX1BSSU9dKTsKKyAgLy93ZW5uIG5pY2h0IGFrdGl2OiBTdGF0dXMgYW56ZWlnZW4KKyAgaWYgKG5vdGl6ZW5baWQsTk9URV9TVEFUVVNdIT1OT1RFX0FDVElWRSkgeworICAgIHN3aXRjaChub3RpemVuW2lkLE5PVEVfU1RBVFVTXSkgeworICAgICAgY2FzZSBOT1RFX0lOQUNUSVZFOgorICAgICAgICAgIHR4dD0iSW5ha3Rpdi9QYXVzZSI7CisgICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE5PVEVfRklOSVNIRUQ6CisgICAgICAgICAgdHh0PSJBYmdlc2NobG9zc2VuIjsgCisgICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE5PVEVfUEVORElORzoKKyAgICAgICAgICB0eHQ9IldhcnRlIGF1ZiBSdWVja21lbGR1bmciOyAKKyAgICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6IHR4dD1zcHJpbnRmKCIlZCIsbm90aXplbltpZCxOT1RFX1NUQVRVU10pOyBicmVhazsKKyAgICB9CisgICAgcmVzKz1zcHJpbnRmKCIlLTExczogJXNcbiIsIlN0YXR1cyIsdHh0KTsKKyAgICAvL3dlbm4gYWJnZXNjaGxvc3NlbjogRW5kZXplaXQgYW56ZWlnZW4KKyAgICBpZiAobm90aXplbltpZCxOT1RFX1NUQVRVU109PU5PVEVfRklOSVNIRUQpCisgICAgICByZXMrPXNwcmludGYoIiUtMTFzOiAlc1xuIiwiRW5kZXplaXQiLAorICAgICAgICAgICAgICAgICAgZHRpbWUobm90aXplbltpZCxOT1RFX0NMT1NFVElNRV0pKTsKKyAgfQorICByZXMrPXNwcmludGYoIiUtMTFzOiAlc1xuIiwiTWVya3plaXQiLGR0aW1lKG5vdGl6ZW5baWQsTk9URV9TVEFSVFRJTUVdKSk7CisgIC8vbnVyIHdlbm4gQWJoYWVuZ2lna2VpdGVuOiBhbmV6ZWlnZW4KKyAgaWYgKHBvaW50ZXJwKG5vdGl6ZW5baWQsTk9URV9ERVBTXSkgJiYgc2l6ZW9mKG5vdGl6ZW5baWQsTk9URV9ERVBTXSkpIHsKKyAgICB0eHQ9aW1wbG9kZShtYXAobm90aXplbltpZCxOT1RFX0RFUFNdLCMndG9fc3RyaW5nKSwiICIpOworICAgIHJlcys9c3ByaW50ZigiJS0xMXM6ICVzXG4iLCJhYmguIHZvbiIsdHh0KTsKKyAgfQorICAvL251ciB3ZW5uIEhlbGZlcjogYW5lemVpZ2VuCisgIGlmIChwb2ludGVycChub3RpemVuW2lkLE5PVEVfSEVMUEVSXSkgJiYgc2l6ZW9mKG5vdGl6ZW5baWQsTk9URV9IRUxQRVJdKSkKKyAgICByZXMrPXNwcmludGYoIiUtMTFzOiAlc1xuIiwiSGVsZmVyIiwKKyAgICAgICAgICAgICAgICBpbXBsb2RlKG5vdGl6ZW5baWQsTk9URV9IRUxQRVJdLCIgIikpOworICByZXR1cm4ocmVzKTsKK30KKworLy9pbnQuIEhlbGZlcgorc3RhdGljIGludCBub3RlX2ZpbHRlcihpbnQgaWQsaW50IGZpbHRlcnN0YXRlKSB7CisgICAgLy9rZWluIGZpbHRlciAtPiBwYXNzdCBpbW1lcgorICAgIGlmICghZmlsdGVyc3RhdGUpIHJldHVybigxKTsKKyAgICBpZiAobWVtYmVyKG5vdGl6ZW4saWQpICYmCisgICAgbm90aXplbltpZCxOT1RFX1NUQVRVU109PWZpbHRlcnN0YXRlKQorICAgIHJldHVybigxKTsKKyAgICByZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBpbnQgYWVsdGVyX2FscyhpbnQgaWQsaW50IHplaXQpIHsKKyAgLy9saWVmZXJ0IDEgenVydWVjaywgd2VubiBTY2hsaWVzc3plaXQgZGVyIE5vdGl6IGxhZW5nZXIgYWxzICdzZWt1bmRlbicgaGVyIGlzdCwgc29uc3QgMC4KKyAgaWYgKG5vdGl6ZW5baWQsTk9URV9DTE9TRVRJTUVdPHplaXQpIHJldHVybigxKTsKKyAgcmV0dXJuKDApOworfQorCitzdGF0aWMgc3RyaW5nIHVwZGF0ZV9kZXBzKHN0cmluZyBzdHIsaW50IGlkKSB7CisgIC8vd2FuZGVsdCBzdHIgbmFjaCBpbnQgdW0KKyAgLy9zY2hhdXQsIG9iIGRlcCBwb3NpdGl2IHVuZCBub2NoIG5pY2h0IGJla2FubnQgaXN0LCB3ZW5uIGphOiAKKyAgLy96dSBkZXBzIGhpbnp1ZnVlZ2VuCisgIC8vd2VubiBkZXAgPCAwIHVuZCBiZWthbm50IGlzdDogYXVzIGRlcHMgZW50ZmVybmVuCisgIC8vUnVlY2tnYWJld2VydCBpc3QgZWdhbC4gOy0pCisgIGludCBkZXA7CisgIGRlcD10b19pbnQoc3RyKTsKKyAgaWYgKGRlcD4wICYmIG1lbWJlcihub3RpemVuW2lkLE5PVEVfREVQU10sZGVwKT09LTEpCisgICAgbm90aXplbltpZCxOT1RFX0RFUFNdKz0oe2RlcH0pOworICBlbHNlIGlmIChkZXA8MCAmJiBtZW1iZXIobm90aXplbltpZCxOT1RFX0RFUFNdLGRlcCotMSkhPS0xKQorICAgIG5vdGl6ZW5baWQsTk9URV9ERVBTXS09KHtkZXAqLTF9KTsKKyAgcmV0dXJuKCIiKTsKK30KKworc3RhdGljIGludCAqZ2V0RGVwcyhpbnQgaWQsIGludCByZWMpIHsKKyAgLy9lcm1pdHRlbHQgKGdnZi4gcmVrdXJzaXYgYmVpIHJlYyE9MCkgZGllIEFiaGFlbmdpZ2tlaXRlbiBlaW5lciBOb3RpegorICBpbnQgaSwgKmxpc3RlOworICBsaXN0ZT1ub3RpemVuW2lkLE5PVEVfREVQU107CisgIC8vamV0enQgZ2dmLiBub2NoIHJla3Vyc2l2IHdlaXRlcmhvbGVuCisgIGlmIChyZWMpICB7CisgICAgaT0wOworICAgIHdoaWxlKGk8c2l6ZW9mKGxpc3RlKSkgeworICAgICAgICAvL25pY2h0IHNjaHJlaWVuLiA7LSkKKyAgICAgICAgaWYgKGdldF9ldmFsX2Nvc3QoKTwxMDAwMDApIHsKKyAgICAgICAgICAgIHRlbGxfb2JqZWN0KFBMLCJGZWhsZXI6IFp1IGxhbmdlIFJla3Vyc2lvbiBiZWkgIgorCQkiRXJtaXR0ZWxuIGRlciBBYmhhZW5naWdrZWl0ZW4sIEFiYnJ1Y2hcbiIpOworICAgICAgICAgICAgcmV0dXJuKGxpc3RlKTsKKyAgICAgICAgfQorICAgICAgICAvL0FiaGFlbmdpZ2tlaXRlbiBkZXIgYW5kZXJlbiBBYmhhZW5naWdrZWl0ZW4gaGludGVuIGFuaGFlbmdlbi4KKyAgICAgICAgbGlzdGUrPW5vdGl6ZW5bbGlzdGVbaV0sTk9URV9ERVBTXTsKKyAgICAgICAgaSsrOworICAgIH0KKyAgfQorICByZXR1cm4obGlzdGUpOworfQorCitzdGF0aWMgaW50ICpnZXRVbnJlc29sdmVkRGVwcyhpbnQgaWQpIHsKKyAgLy9saWVmZXJ0IGRpZSBBbnphaGwgZGVyIG5pY2h0IGFiZ2VoYWt0ZW4gTm90aXplbiwgdm9uIGRlbmVuIGVpbmUgCisgIC8vTm90aXogYWJoYWVuZ2lnIGlzdCAocmVrdXJzaXYpCisgIGludCAqbGlzdGU7CisgIC8vQWJoYWVuZ2lna2VpdGVuIHJla3Vyc2l2IGhvbGVuCisgIGxpc3RlPWdldERlcHMoaWQsMSk7CisgIC8vbmljaHQgYWJnZWhha3RlIHp1cnVlY2tnZWJlbgorICByZXR1cm4obGlzdGUtZmlsdGVyKGxpc3RlLCMnbm90ZV9maWx0ZXIsTk9URV9GSU5JU0hFRCkpOworfQorCit2b2lkIGluaXQoKSB7CisgIDo6aW5pdCgpOworICAvL3dlbm4ga2VpbiBFbnYsIEVudiBrZWluIG1hZ2llciBvZGVyIG5pY2h0IGRlciBFaWdlbnR1ZW1lciBpc3Q6IHdlZworICBpZiAoIW9iamVjdHAoZW52aXJvbm1lbnQoKSkgfHwgIUlTX0xFQVJORVIoZW52aXJvbm1lbnQoKSkKKyAgICAgfHwgKHN0cmluZ3Aob3duZXIpICYmIGdldHVpZChlbnZpcm9ubWVudCgpKSE9b3duZXIpICkgeworICAgIGlmIChmaW5kX2NhbGxfb3V0KCJyZW1vdmUiKSA9PSAtMSkKKyAgICAgIGNhbGxfb3V0KCJyZW1vdmUiLDEsMSk7CisgICAgcmV0dXJuOworICB9CisgIC8vYmVpbSBlcnN0bWFsaWdlbiBCZXdlZ2VuIGluIGVpbmVuIE1hZ2llciB3aXJkIGRlciBhbHMgRWlnZW50dWVtZXIKKyAgLy9yZWdpc3RyaWVydC4gRGFuYWNoIGtvbW10IGRpZXNlIEluZm8gYXVzIFBfQVVUT0xPQUQKKyAgaWYgKCFzdHJpbmdwKG93bmVyKSkKKyAgICBvd25lcj1nZXR1aWQoZW52aXJvbm1lbnQoKSk7Cit9CisKK3N0YXRpYyBub21hc2sgc3RhdHVzIGNoZWNrX2FsbG93ZWQoKSB7CisgIC8vWnVncmlmZiBhdWYgZGllIERhdGVuIGZ1ZXIgZGVuIEVpZ2VudHVlbWVyCisgIGlmKG9iamVjdHAodGhpc19pbnRlcmFjdGl2ZSgpKSAmJgorICAgICBnZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpKT09b3duZXIKKyAgICAgJiYgIXByb2Nlc3NfY2FsbCgpKQorICAgIHJldHVybigxKTsKKyAgcmV0dXJuKDApOworfQorCitwcm90ZWN0ZWQgaW50IHJlc3RvcmVfbWUoKSB7CisgIC8vbGFlZHQgU2F2ZWZpbGUgaW0gSG9tZSB2b20gTWFnaWVyCisgIGlmKCFzdHJpbmdwKG93bmVyKSkgcmV0dXJuKDApOworICBpZighcmVzdG9yZV9vYmplY3QoU0FWRUZJTEUob3duZXIpKSkgeworICAgIG1heHVzZWRJRD0xOworICAgIG5vdGl6ZW49MDsKKyAgICAvL2NhY2hlPSh7fSk7CisgICAgcmV0dXJuKDApOworICB9CisgIHJldHVybigxKTsKK30KKwordmFyYXJncyBwcm90ZWN0ZWQgdm9pZCBzYXZlX21lKGludCBkZWxheSkgeworICAvL3NwZWljaGVydCBTYXZlZmlsZSBpbSBIb21lIHZvbSBNYWdpZXIKKyAgaWYoIXN0cmluZ3Aob3duZXIpKSByZXR1cm47CisgIC8vd2VubiBtYXh1c2VkSUQ9PTAgd3VyZGUgZGVyIHpldHRlbCBub2NoIG5pY2h0IG9yZGVudGxpY2ggaW5pdGlhbGlzaWVydAorICAvL2J6dy4gcmVzdGF1cmllcnQuIEluIGRpZXNlbSBGYWxsIHd1ZXJkZSBlaW4gbGVlcmVzIFNhdmVmaWxlIGdlc2NocmllYmVuCisgIGlmIChtYXh1c2VkSUQ9PTApCisgICAgcmVzdG9yZV9tZSgpOworICBpZighZGVsYXkpCisgICAgLy9kaXJla3Qgc3BlaWNoZW4uIDstKQorICAgIHNhdmVfb2JqZWN0KFNBVkVGSUxFKG93bmVyKSk7CisgIGVsc2UgeworICAgIC8vdmVyem9lZ2VydCBzcGVpY2hlcm4sIHdlbm4gc2Nob24gZWluIGNhbGxfb3V0IGxhZXVmdCwgbmVobSBpY2ggZGVuCisgICAgaWYoZmluZF9jYWxsX291dCgjJ3NhdmVfbWUpPT0tMSkKKyAgICAgIGNhbGxfb3V0KCMnc2F2ZV9tZSxkZWxheSk7CisgIH0KK30KKwordmFyYXJncyBpbnQgcmVtb3ZlKGludCBzaWxlbnQpIHsKKyAgLy9lcnN0bWFsIHNwZWljaGVybi4gOy0pCisgIHNhdmVfbWUoKTsKKyAgcmV0dXJuIDo6cmVtb3ZlKHNpbGVudCk7Cit9CisKK3N0YXRpYyBzdHJpbmcgcXVlcnlfYXV0b2xvYWRvYmooKSB7CisgIC8vaW4gUF9BVVRPTE9BRCB3aXJkIG51ciBkZXIgRWlnZW50dWVtZXIgZ2VzcGVpY2hlcnQKKyAgcmV0dXJuIG93bmVyOworfQorCitzdGF0aWMgc3RyaW5nIHNldF9hdXRvbG9hZG9iaihtaXhlZCBhcmcpICB7CisgIC8vRWlnZW50dWVtZXIgYXVzIFBfQVVUT0xPQUQgcmVzdGF1cmllcmVuCisgIGlmIChzdHJpbmdwKGFyZykpCisgICAgb3duZXI9YXJnOworICByZXR1cm4ob3duZXIpOworfQorCisvL1NoYWRvdyB1bmVyd3VlbnNjaHQKK2ludCBxdWVyeV9wcmV2ZW50X3NoYWRvdygpIHtyZXR1cm4oMSk7fQorCit2YXJhcmdzIHN0YXRpYyBpbnQgY2hlY2tTdGF0dXMoaW50IG5vY2FjaGUpIHsKKyAgLy9zY2hhdXQsIG9iIE5vdGl6ZW4gZGEsIG9iIGRlciBDYWNoZSBPayBpc3QsIGV0Yy4KKyAgLy9saWVmZXJ0IEFuemFobCBkZXIgTm90aXplbiBhdWYgZGVtIE1lcmt6ZXR0ZWwKKyAgCisgIC8vd2VubiBrZWluZSBOb3RpemVuIGRhIHNpbmQsIHNjaGF1ZW4sIG9iIGRhcyBTYXZlZmlsZSBlaW5nZWxlc2VuIHdlcmRlbgorICAvL2thbm4KKyAgaWYgKCFtYXBwaW5ncChub3RpemVuKSB8fCAhc2l6ZW9mKG5vdGl6ZW4pKQorICAgIHJlc3RvcmVfbWUoKTsKKyAgaWYgKCFtYXBwaW5ncChub3RpemVuKSkgcmV0dXJuKDApOworLyogQ2FjaGUgaXN0IGVpZ2VudGxpY2ggbmljaHQgbm9ldGlnIHVuZCBtaXIgZ2VyYWRlIHp1IHVucHJha3Rpc2NoLCByYXVzIGRhbWl0LiAgCisgIC8vd2VubiBrZWluZSBBa3R1YWxpc2llcnVuZyBkZXMgQ2FjaGUgZXJ3dWVuc2NodCBpc3QKKyAgaWYobm9jYWNoZSkgcmV0dXJuKDApOworICAKKyAgaWYgKHNpemVvZihub3RpemVuKSkgeworICAgIGlmKCFwb2ludGVycChjYWNoZSkgfHwgIXNpemVvZihjYWNoZSkpIHsKKyAgICAgIC8vY2FjaGUgZXJuZXVlcm4KKyAgICAgIGNhY2hlPXNvcnRfYXJyYXkobV9pbmRpY2VzKG5vdGl6ZW4pLCJzb3J0X3ByaW8iKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuKHNpemVvZihjYWNoZSkpOyAvL2FlcXVpdmFsZW50IHp1IHNpemVvZihub3RpemVuKQorICAqLworICByZXR1cm4oc2l6ZW9mKG5vdGl6ZW4pKTsKK30KKworc3RhdGljIHN0YXR1cyBzb3J0X3ByaW8oaW50IGtleTEsIGludCBrZXkyKSB7CisgIC8vIDEsIGZhbGxzIGZhbHNjaGUgUmVpaGVuZm9sZ2UsCisgIC8vIDAsIHdlbm4gcmljaHRpZ2UKKyAgLy8gdW5kIHp3YXIgX2Fic3RlaWdlbmRfLCBhbHNvIGhvZWNoc3RlIFByaW8gaW4gbGlzdGVbMF0gIQorICByZXR1cm4obm90aXplbltrZXkxLE5PVEVfUFJJT108PW5vdGl6ZW5ba2V5MixOT1RFX1BSSU9dKTsKK30KKworCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworLy8gRGVidWdnaW5nCittYXBwaW5nIFF1ZXJ5Tm90aXplbigpIHsKKyAgCisgIGlmKCFjaGVja19hbGxvd2VkKCkpIHsKKyAgICBpZihvYmplY3RwKHRoaXNfaW50ZXJhY3RpdmUoKSkpCisgICAgICB0ZWxsX29iamVjdCh0aGlzX2ludGVyYWN0aXZlKCksCisgICAgICAgIEJTKCJEaWVzZXIgWnVncmlmZiBhdWYgZGVuIE1lcmt6ZXR0ZWwgd3VyZGUgbmljaHQgZXJsYXVidC4iKSk7CisgICAgcmV0dXJuKDApOworICB9CisgIGNoZWNrU3RhdHVzKCk7CisgIHJldHVybihub3RpemVuKTsKK30KKworLy9pbnQgKlF1ZXJ5Q2FjaGUoKSB7cmV0dXJuKGNhY2hlKTt9CisKK2ludCBRdWVyeVNpemUoKSB7cmV0dXJuKHNpemVvZihub3RpemVuKSk7fQorCitzdHJpbmcgUXVlcnlPd25lcigpIHtyZXR1cm4ob3duZXIpO30KZGlmZiAtLWdpdCBhL29iai90b29scy9tZXJremV0dGVsL21lcmt6ZXR0ZWwuaCBiL29iai90b29scy9tZXJremV0dGVsL21lcmt6ZXR0ZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2E3NzI0Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL21lcmt6ZXR0ZWwvbWVya3pldHRlbC5oCkBAIC0wLDAgKzEsNzkgQEAKKyNpZm5kZWYgX19aRVNTVFJBX01FUktaRVRURUxfSF9fCisjZGVmaW5lIF9fWkVTU1RSQV9NRVJLWkVUVEVMX0hfXworCisjZGVmaW5lIFNBVkVGSUxFKHgpICgiL3BsYXllcnMvIit4KyIvLm1lcmt6ZXR0ZWwiKQorI2RlZmluZSBBUkNISVZFKHgpICgiL3BsYXllcnMvIit4KyIvbWVya3pldHRlbC5hcmNoaXYiKQorCisjZGVmaW5lIE5PVEVfVEVYVCAwCisjZGVmaW5lIE5PVEVfUFJJTyAxCisjZGVmaW5lIE5PVEVfU1RBUlRUSU1FIDIKKyNkZWZpbmUgTk9URV9ERVBTIDMKKyNkZWZpbmUgTk9URV9IRUxQRVIgNAorI2RlZmluZSBOT1RFX1NUQVRVUyA1CisjZGVmaW5lIE5PVEVfQ0xPU0VUSU1FIDYKKworLy9TdGF0dXMsID4wIHNpbmQgYWt0aXYsIDwwIGluYWt0aXYKKyNkZWZpbmUgTk9URV9BQ1RJVkUgMQorI2RlZmluZSBOT1RFX1BFTkRJTkcgMgorI2RlZmluZSBOT1RFX0lOQUNUSVZFIC0xCisjZGVmaW5lIE5PVEVfRklOSVNIRUQgLTIKKyNkZWZpbmUgTk9URV9TVEFURVMgKHtOT1RFX0FDVElWRSxOT1RFX1BFTkRJTkcsTk9URV9JTkFDVElWRSxOT1RFX0ZJTklTSEVEfSkKKworLy9Tb3J0aWVycmVpaGVuZm9sZ2UKKyNkZWZpbmUgU09SVF9JTlZFUlNFIDEKKworLy93aWV2aWVsIHdpcmQgbWF4LmFiZ2VzcGVpY2hlcnQKKyNkZWZpbmUgTUFYX05PVEVfTEVOR1RIIDEwMDAKKy8vd2lldmllbCB3aXJkIG1heC4gaW4gZGVyIExpc3RlIGFuZ2V6ZWlndAorI2RlZmluZSBNQVhfTk9URV9MSVNUX0xFTkdUSCA1MAorCisjZGVmaW5lIEJTKHgpIGJyZWFrX3N0cmluZyh4LDc4KQorI2RlZmluZSBCU0koeCx5KSBicmVha19zdHJpbmcoeCw3OCx5KQorI2RlZmluZSBCU0woeCkgYnJlYWtfc3RyaW5nKHgsNzgsIiIsQlNfTEVBVkVfTVlfTEZTKQorI2RlZmluZSBCU0lMKHgseSkgYnJlYWtfc3RyaW5nKHgsNzgseSxCU19MRUFWRV9NWV9MRlMpCisKKyNkZWZpbmUgVEkgdGhpc19pbnRlcmFjdGl2ZSgpCisKKyNpZmRlZiBORUVEX1BST1RPVFlQRVMKKy8vQWRkQ21kCitpbnQgQWRkTm90aXooc3RyaW5nIHN0cik7CitpbnQgRXJzZXR6ZVRleHQoc3RyaW5nIHN0cik7CitpbnQgRXJnYWVuemVUZXh0KHN0cmluZyBzdHIpOworaW50IFJlbW92ZU5vdGl6KHN0cmluZyBzdHIpOworaW50IEZpbmlzaE5vdGl6KHN0cmluZyBzdHIpOworaW50IExpc3ROb3RpemVuKHN0cmluZyBzdHIpOworaW50IExpZXNOb3RpeihzdHJpbmcgc3RyKTsKK2ludCBDaGFuZ2VEZXAoc3RyaW5nIHN0cik7CitpbnQgQ2hhbmdlU3RhdHVzKHN0cmluZyBzdHIpOworaW50IENoYW5nZVByaW8oc3RyaW5nIHN0cik7CitpbnQgQ2hhbmdlSGVscGVyKHN0cmluZyBzdHIpOworaW50IFplaWdlWmV0dGVsKHN0cmluZyBzdHIpOworaW50IFdlZGVsWmV0dGVsKHN0cmluZyBzdHIpOworaW50IExpZXNEZXBzKHN0cmluZyBzdHIpOworaW50IEV4cGlyZShzdHJpbmcgc3RyKTsKKworLy92b24gZGVuIEFkZENtZC1GdW5zIGdlcnVmZW4KK3N0YXRpYyBzdHJpbmcgX0xpZXNOb3RpeihpbnQgaWQpOworCisvL3NvbnN0LiBGdW5rdGlvbmVuLCB6LkIuIGZ1ZXIgRGVidWd6d2Vja2UKK21hcHBpbmcgUXVlcnlOb3RpemVuKCk7CitzdHJpbmcgUXVlcnlPd25lcigpOwordmFyYXJncyBpbnQgcmVtb3ZlKGludCBzaWxlbnQpOworCisvL2ludC4gRnVua3Rpb25lbgorc3RhdGljIHN0YXR1cyBzb3J0X3ByaW8oaW50IGtleTEsIGludCBrZXkyKTsKK3N0YXRpYyBub21hc2sgc3RhdHVzIGNoZWNrX2FsbG93ZWQoKTsKK3Byb3RlY3RlZCBpbnQgcmVzdG9yZV9tZSgpOwordmFyYXJncyBwcm90ZWN0ZWQgdm9pZCBzYXZlX21lKGludCBkZWxheSk7CitzdGF0aWMgc3RyaW5nIHF1ZXJ5X2F1dG9sb2Fkb2JqKCk7CitzdGF0aWMgc3RyaW5nIHNldF9hdXRvbG9hZG9iaihtaXhlZCBhcmcpOwordmFyYXJncyBzdGF0aWMgaW50IGNoZWNrU3RhdHVzKGludCBub2NhY2hlKTsKK3N0YXRpYyBzdHJpbmcgdXBkYXRlX2RlcHMoc3RyaW5nIHN0cixpbnQgaWQpOworc3RhdGljIGludCBub3RlX2ZpbHRlcihpbnQgaWQsaW50IGZpbHRlcnN0YXRlKTsKK3N0YXRpYyBpbnQgYWVsdGVyX2FscyhpbnQgaWQsaW50IHplaXQpOworc3RhdGljIGludCAqZ2V0VW5yZXNvbHZlZERlcHMoaW50IGlkKTsKK3N0YXRpYyBpbnQgKmdldERlcHMoaW50IGlkLGludCByZWMpOworCisjZW5kaWYgLy8gTkVFRF9QUk9UT1RZUEVTCisKKyNlbmRpZiAvLyBfX1pFU1NUUkFfTUVSS1pFVFRFTF9IX18KZGlmZiAtLWdpdCBhL29iai90b29scy9tdWRsaW5rLmMgYi9vYmovdG9vbHMvbXVkbGluay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwOWQ1NDYKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvbXVkbGluay5jCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBtdWRsaW5rIHRvb2wsIG9mZmVycyBzZXZlcmFsIGNvbW1hbmRzIGFzIGFuIGludGVyZmFjZSB0byB0aGUKKyAqIE1VRExJTksgc3lzdGVtLgorICoKKyAqIENvbW1hbmRzIG9mZmVyZWQ6CisgKiBycGVlcnMKKyAqIHJ3aG8gPHJlbW90ZW11ZD4KKyAqIHJ0ZWxsIDxwbGF5ZXI+QDxyZW1vdGVtdWQ+CisgKgorICogRGVlcHRob3VnaHQsIDE5LUphbi05MworICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisKK2luaGVyaXQgIi9zdGQvdGhpbmciOworCitjcmVhdGUoKSB7CisgIHN0cmluZyBuYW1lLCBmb287CisKKyAgaWYgKHNpemVvZihvbGRfZXhwbG9kZShvYmplY3RfbmFtZSh0aGlzX29iamVjdCgpKSwiIyIpKSAhPSAyKSByZXR1cm47CisKKyAgdGhpbmc6OmNyZWF0ZSgpOworICBTZXRQcm9wIChQX1NIT1JULCJhIE1VRExJTksgdG9vbCIpOworICBTZXRQcm9wIChQX0xPTkcsCisgIlRoaXMgdG9vbCBpcyB1c2VkIGZvciBjb21tdW5pY2F0aW5nIHdpdGggTVVETElOSy4gQ29tbWFuZHMgYXJlOlxuIgorKyJycGVlcnMgICAgICAgICAgICAgICAgICAgICAgICAgIEdldCBhIGxpc3Qgb2YgbXVkcyBjb25uZWN0ZWQgdG8gTVVETElOS1xuIgorKyJyd2hvIDxtdWQ+ICAgICAgICAgICAgICAgICAgICAgIFNob3cgYSBsaXN0IG9mIHBsYXllcnMgb24gdGhlIHJlbW90ZSBtdWRcbiIKKysicnRlbGwgPHBsYXllcj5APG11ZD4gPG1lc3NhZ2U+ICBUZWxsIHNvbWV0aGluZyB0byBhIHBsYXllciBvbiBhbm90aGVyIG11ZFxuIgorICAgICAgICAgICk7CisgIEFkZElkICgidG9vbCIpOworICBBZGRJZCAoIm11ZGxpbmsiKTsKKyAgQWRkQWRqZWN0aXZlKCJtdWRsaW5rIik7CisgIFNldEluZm8gKCJNdWRsaW5rIFRvb2wgVjAuMSBieSBEZWVwdGhvdWdodCIpOworfQorCitfcXVlcnlfcmVhZF9tc2coKSB7IHJldHVybiAwOyB9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKiogQWRkIGFuZCBkZWNvZGUgb3VyIGNvbW1hbmRzLgorKi8KKworaW5pdCgpIHsKKyAgdGhpbmc6OmluaXQoKTsKKyAgYWRkX2FjdGlvbigicnBlZXJzIiwicnBlZXJzIik7CisgIGFkZF9hY3Rpb24oInJ3aG8iLCJyd2hvIik7CisgIGFkZF9hY3Rpb24oInJ0ZWxsIiwicnRlbGwiKTsKK30KKworcnBlZXJzKCkgeworICBzdHJpbmcgdTsKKyAgdSA9IGdldGV1aWQodGhpc19wbGF5ZXIoKSk7CisgIGlmIChzdHJpbmdwKHUpKQorICAgIHRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJtdWRsaW5rIiksInJwZWVycyAiK3UrIlxuIik7CisgIHJldHVybiAxOworfQorCityd2hvKHN0cikgeworICBzdHJpbmcgdTsKKyAgaWYgKCFzdHIgfHwgc3RyID09ICIiKSB7CisgICAgd3JpdGUoIlVzYWdlOiByd2hvIDxtdWQ+XG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoc3RyaW5ncCh1ID0gZ2V0ZXVpZCh0aGlzX3BsYXllcigpKSkpCisgICAgdGVsbF9vYmplY3QoZmluZF9wbGF5ZXIoIm11ZGxpbmsiKSwicndobyAiK3UrIj0iK3N0cisiXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK3J0ZWxsKHN0cikgeworICBzdHJpbmcgdTsKKyAgc3RyaW5nIGEsIGIsIGMsIGQ7CisKKyAgaWYgKCFzdHIgfHwgc3RyID09ICIiKSB7CisgICAgd3JpdGUoIlVzYWdlOiBydGVsbCA8cGxheWVyPkA8bXVkPiA8bWVzc2FnZT5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIGlmIChzc2NhbmYoc3RyLCAiJXNAJXMgJXMiLCBhLCBiLCBjKSAhPSAzKSB7CisgICAgd3JpdGUoIlVzYWdlOiBydGVsbCA8cGxheWVyPkA8bXVkPiA8bWVzc2FnZT5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIGlmIChzdHJpbmdwKHUgPSBnZXRldWlkKHRoaXNfcGxheWVyKCkpKSkKKyAgICB0ZWxsX29iamVjdChmaW5kX3BsYXllcigibXVkbGluayIpLCJycGFnZSAiK3UrIkAiK2ErIkAiK2IrIj0iK2MrIlxuIik7CisgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL25ld3N0b29sLmMgYi9vYmovdG9vbHMvbmV3c3Rvb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTY3MTk3Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL25ld3N0b29sLmMKQEAgLTAsMCArMSwzMzUgQEAKK2luaGVyaXQgInN0ZC90aGluZyI7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxuZXdzLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorCisjZGVmaW5lIFVBIFBMLT5fdW5wYXJzZWRfYXJncygpCisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgc3RyaW5nIHN0cjsKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX0xPTkcsIkVpbiBOZXdzLUdydXBwZW4tVG9vbC5cblwKK0JlZmVobGU6IGFkZGcgICAgICA8Z3JuYW1lPiA8b3duZXJuYW1lPiAgIDogR3J1cHBlIGVyemV1Z2VuXG5cCisgICAgICAgICByZW1vdmVnICAgPGdybmFtZT4gICAgICAgICAgICAgICA6IEdydXBwZSBsb2VzY2hlblxuXAorICAgICAgICAgYWRkdyAgICAgIDxncm5hbWU+IDx1c2VybmFtZT4gICAgOiBTY2hyZWliYmVyZWNodGlndGVuIGVpbnRyYWdlblxuXAorICAgICAgICAgcmVtb3ZldyAgIDxncm5hbWU+IDx1c2VybmFtZT4gICAgOiBTY2hyZWliYmVyZWNodGlndGVuIGF1c3RyYWdlblxuXAorICAgICAgICAgYWRkZCAgICAgIDxncm5hbWU+IDx1c2VybmFtZT4gICAgOiBMb2VzY2hiZXJlY2h0aWd0ZW4gZWludHJhZ2VuXG5cCisgICAgICAgICByZW1vdmVkICAgPGdybmFtZT4gPHVzZXJuYW1lPiAgICA6IExvZXNjaGJlcmVjaHRpZ3RlbiBhdXN0cmFnZW5cblwKKyAgICAgICAgIGFkZHIgICAgICA8Z3JuYW1lPiA8dXNlcm5hbWU+ICAgIDogTGVzZWJlcmVjaHRpZ3RlbiBlaW50cmFnZW5cblwKKyAgICAgICAgIHJlbW92ZXIgICA8Z3JuYW1lPiA8dXNlcm5hbWU+ICAgIDogTGVzZWJlcmVjaHRpZ3RlbiBhdXN0cmFnZW5cblwKKyAgICAgICAgIGdpbmZvICAgICA8Z3JuYW1lPiAgICAgICAgICAgICAgIDogSW5mbyB1ZWJlciBHcnVwcGUgYWJmcmFnZW5cblwKKyAgICAgICAgIHNldGV4cGlyZSA8Z3JuYW1lPiA8dGFnZT4gICAgICAgIDogRXhwaXJldGltZSBzZXR6ZW5cblwKKyAgICAgICAgIHNldG1heG1zZyA8Z3JuYW1lPiA8YW56PiAgICAgICAgIDogTWF4bXNnIHNldHplblxuXAorICAgICAgICAgc2V0ZyA8Z3JuYW1lPiA8bG9lc2NobGV2PiA8c2NocmVpYmxldj4gPGxlc2VsZXY+IDxtYXhtc2c+IDxleHBpcmU+XG4iKTsKKyAgc3RyPWNhcGl0YWxpemUoKChzdHI9Z2V0dWlkKHRoaXNfcGxheWVyKCkpKVs8MV09PSdzJ3x8c3RyWzwxXT09J3gnfHwKKwkJICBzdHJbPDFdPT0neicpP3N0cis9IiciOnN0cis9InMiKTsKKyAgU2V0UHJvcChQX1NIT1JULHN0cisiIE5ld3NUb29sIik7CisgIFNldFByb3AoUF9OQU1FLHN0cisiIE5ld3NUb29sIik7CisgIFNldFByb3AoUF9HRU5ERVIsTkVVVEVSKTsKKyAgU2V0UHJvcChQX0FSVElDTEUsMCk7CisgIEFkZElkKCJuZXdzdG9vbCIpOworICBBZGRJZCgibmV3c2dydXBwZW50b29sIik7CisgIEFkZElkKCJuZXdzLWdydXBwZW4tdG9vbCIpOworICBTZXRQcm9wKFBfQVVUT0xPQURPQkosMSk7CisgIFNldFByb3AoUF9OT0RST1AsMSk7Cit9CisKK3ZvaWQgaW5pdCgpCit7CisgIGFkZF9hY3Rpb24oImFkZGciLCJhZGRnIik7CisgIGFkZF9hY3Rpb24oInJlbW92ZWciLCJyZW1vdmVnIik7CisgIGFkZF9hY3Rpb24oImFkZHciLCJhZGR3Iik7CisgIGFkZF9hY3Rpb24oInJlbW92ZXciLCJyZW1vdmV3Iik7CisgIGFkZF9hY3Rpb24oImFkZGQiLCJhZGRkIik7CisgIGFkZF9hY3Rpb24oInJlbW92ZWQiLCJyZW1vdmVkIik7CisgIGFkZF9hY3Rpb24oImFkZHIiLCJhZGRyIik7CisgIGFkZF9hY3Rpb24oInJlbW92ZXIiLCJyZW1vdmVyIik7CisgIGFkZF9hY3Rpb24oInNldGciLCJzZXRnIik7CisgIGFkZF9hY3Rpb24oInNldGV4cGlyZSIsInNldGV4cGlyZSIpOworICBhZGRfYWN0aW9uKCJleHBpcmUiLCJleHBpcmUiKTsKKyAgYWRkX2FjdGlvbigiZ2luZm8iLCJnaW5mbyIpOworICBhZGRfYWN0aW9uKCJzZXRtYXhtc2ciLCJzZXRtYXhtc2ciKTsKK30KKworaW50IGFkZHIoc3RyaW5nIHN0cikKK3sKKyAgbWl4ZWQgKmFycjsKKyAgc3RyaW5nIHN0MSwgc3QyOworICAKKyAgaWYgKChzdHI9VUEpPT0iIiB8fCBzc2NhbmYoc3RyLCIlcyAlcyIsc3QxLHN0MikgIT0yKXsKKyAgICB3cml0ZSgiYWRkciA8Z3JvdXBuYW1lPiA8dXNlcm5hbWU+XG5BbnNjaGxpZXNzZW5kIGRhcmYgZGVyIFVzZXIgdW5hYmhhZW5naWcgdm9tIFdpemxldmVsIGRpZSBHcnVwcGUgbGVzZW4uXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICAKKyAgYXJyPW9sZF9leHBsb2RlKHN0MiwiICIpLSh7IiJ9KTsKKyAgc3dpdGNoICgiL3NlY3VyZS9uZXdzIi0+QWRkQWxsb3dlZChzdDEsKHt9KSwoe30pLGFycikpeworICAgIGNhc2UgMDogd3JpdGUoIlBhcmFtIGVyclxuIik7IGJyZWFrOworICAgIGNhc2UgMTogd3JpdGUoIk9rLlxuIik7IGJyZWFrOworICAgIGNhc2UgLTE6IHdyaXRlKCJObyBwZXJtaXNzaW9uXG4iKTsgYnJlYWs7CisgICAgY2FzZSAtMjogd3JpdGUoIk5vIHN1Y2ggYm9hcmRcbiIpOyBicmVhazsKKyAgfQorICByZXR1cm4gMTsKK30KKworaW50IHJlbW92ZXIoc3RyaW5nIHN0cikKK3sKKyAgbWl4ZWQgKmFycjsKKyAgc3RyaW5nIHN0MSwgc3QyOworCisgIGlmICghKHN0cj1VQSkgfHwgc3NjYW5mKHN0ciwiJXMgJXMiLHN0MSxzdDIpICE9Mil7CisgICAgd3JpdGUoInJlbW92ZXIgPGdydXBwZW5uYW1lPiA8dXNlcm5hbWU+XG5EYW5hY2ggZGFyZiBkZXIgVXNlciBkaWUgR3J1cHBlIG51ciBub2NoIGxlc2VuLCB3ZW5uIHNlaW4gV2l6bGV2ZWwgZGllcyBlcmxhdWJ0LlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBhcnI9b2xkX2V4cGxvZGUoc3QyLCIgIiktKHsiIn0pOworICBzd2l0Y2ggKCIvc2VjdXJlL25ld3MiLT5SZW1vdmVBbGxvd2VkKHN0MSwoe30pLCh7fSksYXJyKSl7CisgICAgY2FzZSAwOiB3cml0ZSgiUGFyYW0gZXJyXG4iKTsgYnJlYWs7CisgICAgY2FzZSAxOiB3cml0ZSgiT2suXG4iKTsgYnJlYWs7CisgICAgY2FzZSAtMTogd3JpdGUoIk5vIHBlcm1pc3Npb25cbiIpOyBicmVhazsKKyAgICBjYXNlIC0yOiB3cml0ZSgiTm8gc3VjaCBib2FyZFxuIik7IGJyZWFrOworICB9CisgIHJldHVybiAxOworfQorCitpbnQgYWRkZChzdHJpbmcgc3RyKQoreworICBtaXhlZCAqYXJyOworICBzdHJpbmcgc3QxLCBzdDI7CisKKyAgaWYgKCEoc3RyPVVBKSB8fCBzc2NhbmYoc3RyLCIlcyAlcyIsc3QxLHN0MikgIT0yKXsKKyAgICB3cml0ZSgiYWRkZCA8Z3J1cHBlPiA8dXNlcj5cblVzZXIgZGFyZiBBcnRpa2VsIGxvZXNjaGVuICh1bmFiaCB2b20gV2l6bGV2ZWwpXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGFycj1vbGRfZXhwbG9kZShzdDIsIiAiKS0oeyIifSk7CisgIAlzd2l0Y2ggKCIvc2VjdXJlL25ld3MiLT5BZGRBbGxvd2VkKHN0MSxhcnIsKHt9KSwoe30pKSl7CisgICAgY2FzZSAwOiB3cml0ZSgiUGFyYW0gZXJyXG4iKTsgYnJlYWs7CisgICAgY2FzZSAxOiB3cml0ZSgiT2suXG4iKTsgYnJlYWs7CisgICAgY2FzZSAtMTogd3JpdGUoIk5vIHBlcm1pc3Npb25cbiIpOyBicmVhazsKKyAgICBjYXNlIC0yOiB3cml0ZSgiTm8gc3VjaCBib2FyZFxuIik7IGJyZWFrOworICB9CisgIHJldHVybiAxOworfQorCitpbnQgcmVtb3ZlZChzdHJpbmcgc3RyKQoreworICBtaXhlZCAqYXJyOworICBzdHJpbmcgc3QxLCBzdDI7CisKKyAgaWYgKCEoc3RyPVVBKSB8fCBzc2NhbmYoc3RyLCIlcyAlcyIsc3QxLHN0MikgIT0yKXsKKyAgICB3cml0ZSgicmVtb3ZlZCA8Z3J1cHBlPiA8dXNlcj5cblVzZXIgZGFyZiBudXIgbm9jaCBBcnRpa2VsIGxvZXNjaGVuLCB3ZW5uIHNlaW4gV2l6bGV2ZWwgZGFzIGVybGF1YnQuXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGFycj1vbGRfZXhwbG9kZShzdDIsIiAiKS0oeyIifSk7CisgIHN3aXRjaCAoIi9zZWN1cmUvbmV3cyItPlJlbW92ZUFsbG93ZWQoc3QxLGFyciwoe30pLCh7fSkpKXsKKyAgICBjYXNlIDA6IHdyaXRlKCJQYXJhbSBlcnJcbiIpOyBicmVhazsKKyAgICBjYXNlIDE6IHdyaXRlKCJPay5cbiIpOyBicmVhazsKKyAgICBjYXNlIC0xOiB3cml0ZSgiTm8gcGVybWlzc2lvblxuIik7IGJyZWFrOworICAgIGNhc2UgLTI6IHdyaXRlKCJObyBzdWNoIGJvYXJkXG4iKTsgYnJlYWs7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2ludCBhZGR3KHN0cmluZyBzdHIpCit7CisgIG1peGVkICphcnI7CisgIHN0cmluZyBzdDEsIHN0MjsKKworICBpZiAoIShzdHI9VUEpIHx8IHNzY2FuZihzdHIsIiVzICVzIixzdDEsc3QyKSAhPTIpeworICAgIHdyaXRlKCJhZGR3IDxncnVwcGU+IDx1c2VyPlxuVXNlciBkYXJmIEFydGlrZWwgc2NocmVpYmVuICh1bmFiaCB2b20gV2l6bGV2ZWwpXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGFycj1vbGRfZXhwbG9kZShzdDIsIiAiKS0oeyIifSk7CisgIHN3aXRjaCAoIi9zZWN1cmUvbmV3cyItPkFkZEFsbG93ZWQoc3QxLCh7fSksYXJyLCh7fSkpKXsKKyAgICBjYXNlIDA6IHdyaXRlKCJQYXJhbSBlcnJcbiIpOyBicmVhazsKKyAgICBjYXNlIDE6IHdyaXRlKCJPay5cbiIpOyBicmVhazsKKyAgICBjYXNlIC0xOiB3cml0ZSgiTm8gcGVybWlzc2lvblxuIik7IGJyZWFrOworICAgIGNhc2UgLTI6IHdyaXRlKCJObyBzdWNoIGJvYXJkXG4iKTsgYnJlYWs7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2ludCByZW1vdmV3KHN0cmluZyBzdHIpCit7CisgIG1peGVkICphcnI7CisgIHN0cmluZyBzdDEsIHN0MjsKKworICBpZiAoIShzdHI9VUEpIHx8IHNzY2FuZihzdHIsIiVzICVzIixzdDEsc3QyKSAhPTIpeworICAgIHdyaXRlKCJyZW1vdmV3IDxncnVwcGU+IDx1c2VyPlxuVXNlciBkYXJmIG51ciBub2NoIEFydGlrZWwgc2NocmVpYmVuLCB3ZW5uIHNlaW4gV2l6bGV2ZWwgZGllcyBlcmxhdWJ0LlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBhcnI9b2xkX2V4cGxvZGUoc3QyLCIgIiktKHsiIn0pOworICBzd2l0Y2ggKCIvc2VjdXJlL25ld3MiLT5SZW1vdmVBbGxvd2VkKHN0MSwoe30pLGFyciwoe30pKSl7CisgICAgY2FzZSAwOiB3cml0ZSgiUGFyYW0gZXJyXG4iKTsgYnJlYWs7CisgICAgY2FzZSAxOiB3cml0ZSgiT2suXG4iKTsgYnJlYWs7CisgICAgY2FzZSAtMTogd3JpdGUoIk5vIHBlcm1pc3Npb25cbiIpOyBicmVhazsKKyAgICBjYXNlIC0yOiB3cml0ZSgiTm8gc3VjaCBib2FyZFxuIik7IGJyZWFrOworICB9CisgIHJldHVybiAxOworfQorCitpbnQgc2V0ZyhzdHJpbmcgc3RyKQoreworICBzdHJpbmcgbmFtZTsKKyAgaW50IGRsZXZlbCwgd2xldmVsLCBybGV2ZWwsIG1heG1lc3NhZ2VzLCBleHBpcmU7CisKKyAgaWYgKCEoc3RyPVVBKSB8fAorICAgICAgc3NjYW5mKHN0ciwiJXMgJWQgJWQgJWQgJWQgJWQiLG5hbWUsZGxldmVsLHdsZXZlbCxybGV2ZWwsbWF4bWVzc2FnZXMsZXhwaXJlKSAhPSA2KSB7CisgICAgd3JpdGUoInNldGcgPGdydXBwZT4gPGxvZXNjaGxldmVsPiA8c2NocmVpYmxldmVsPiA8bGVzZWxldmVsPiA8bWF4bWVzc2FnZXM+IDxleHBpcmU+XG5HcnVwcGVucGFyYW1ldGVyIHNldHplbiwgQmVkZXV0dW5nIChEZWZhdWx0d2VydGUgaW4gS2xhbW1lcm4pOlxuXAorICAgIG5hbWUgICAgICAgICAgICAgIDogRGVyIE5hbWUgZGVyIE5ld3Nncm91cFxuXAorICAgIGxvZXNjaGxldmVsICAoMjApIDogV2l6bGV2ZWwsIGFiIGRlbSBVc2VyIEFydGlrZWwgbG9lc2NoZW4ga29lbm5lblxuXAorICAgIHNjaHJlaWJsZXZlbCAoIDApIDogV2l6bGV2ZWwsIGFiIGRlbSBVc2VyIEFydGlrZWwgc2NocmVpYmVuIGtvZW5uZW5cblwKKyAgICBsZXNlbGV2ZWwgICAgKCAwKSA6IFdpemxldmVsLCBhYiBkZW0gVXNlciBBcnRpa2VsIGxlc2VuIGtvZW5uZW5cblwKKyAgICBtYXhtZXNzYWdlcyAgKDQwKSA6IE1heGltYWxlIEFuemFobCBBcnRpa2VsIGluIGVpbmVyIE5ld3NncnVwcGVcblwKKyAgICBleHBpcmUgICAgICAgKC0xKSA6IEV4cGlyZXRpbWUgaW4gVGFnZW4sIC0xID0gbmllXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBleHBpcmU9ODY0MDAqZXhwaXJlOworICBzd2l0Y2goIi9zZWN1cmUvbmV3cyItPlNldEdyb3VwKG5hbWUsIGRsZXZlbCwgd2xldmVsLCBybGV2ZWwsIG1heG1lc3NhZ2VzLGV4cGlyZSkpeworICAgIGNhc2UgMTogd3JpdGUoIk9rXG4iKTsgYnJlYWs7CisgICAgY2FzZSAwOiB3cml0ZSgiUGFyYW0gZXJyb3IuXG4iKTsgYnJlYWs7CisgICAgY2FzZSAtMTogd3JpdGUoIk5vIHBlcm1pc3Npb25cbiIpOyBicmVhazsKKyAgICBjYXNlIC0yOiB3cml0ZSgiTm8gc3VjaCBncm91cFxuIik7IGJyZWFrOworICB9CisgIHJldHVybiAxOworfQorCitpbnQgc2V0ZXhwaXJlKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyBuYW1lOworICBpbnQgZXhwaXJlOworICBtaXhlZCAqZ3I7CisKKyAgaWYgKCEoc3RyPVVBKXx8c3NjYW5mKHN0ciwiJXMgJWQiLG5hbWUsZXhwaXJlKSE9MikKKyAgeworICAgIHdyaXRlKCJzZXRleHBpcmUgPGdydXBwZT4gPHRhZ2U+XG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBleHBpcmU9ODY0MDAqZXhwaXJlOworICBpZiAoIXBvaW50ZXJwKChncj0iL3NlY3VyZS9uZXdzIi0+R2V0R3JvdXAobmFtZSkpKSkKKyAgeworICAgIHdyaXRlKCJHZXQgZ3JvdXAgZXJyb3JcbiIpOworICAgIHJldHVybiAxOworICB9CisgIHN3aXRjaCgiL3NlY3VyZS9uZXdzIi0+U2V0R3JvdXAobmFtZSwgZ3JbR19ETEVWRUxdLCBncltHX1dMRVZFTF0sIGdyW0dfUkxFVkVMXSwgZ3JbR19NQVhfTVNHXSxleHBpcmUpKXsKKyAgICBjYXNlIDE6IHdyaXRlKCJPa1xuIik7IGJyZWFrOworICAgIGNhc2UgMDogd3JpdGUoIlBhcmFtIGVycm9yLlxuIik7IGJyZWFrOworICAgIGNhc2UgLTE6IHdyaXRlKCJObyBwZXJtaXNzaW9uXG4iKTsgYnJlYWs7CisgICAgY2FzZSAtMjogd3JpdGUoIk5vIHN1Y2ggZ3JvdXBcbiIpOyBicmVhazsKKyAgfQorICByZXR1cm4gMTsKK30KKworaW50IHNldG1heG1zZyhzdHJpbmcgc3RyKQoreworICBzdHJpbmcgbmFtZTsKKyAgaW50IG1heG1zZzsKKyAgbWl4ZWQgKmdyOworICAKKyAgaWYgKCEoc3RyPVVBKXx8c3NjYW5mKHN0ciwiJXMgJWQiLG5hbWUsbWF4bXNnKSE9MikKKyAgeworICAgIHdyaXRlKCJzZXRleHBpcmUgPGdydXBwZT4gPHRhZ2U+XG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoIXBvaW50ZXJwKChncj0iL3NlY3VyZS9uZXdzIi0+R2V0R3JvdXAobmFtZSkpKSkKKyAgeworICAgIHdyaXRlKCJHZXQgZ3JvdXAgZXJyb3JcbiIpOworICAgIHJldHVybiAxOworICB9CisgIHN3aXRjaCgiL3NlY3VyZS9uZXdzIi0+U2V0R3JvdXAobmFtZSwgZ3JbR19ETEVWRUxdLCBncltHX1dMRVZFTF0sIGdyW0dfUkxFVkVMXSwgbWF4bXNnLCBncltHX0VYUElSRV0pKXsKKyAgICBjYXNlIDE6IHdyaXRlKCJPa1xuIik7IGJyZWFrOworICAgIGNhc2UgMDogd3JpdGUoIlBhcmFtIGVycm9yLlxuIik7IGJyZWFrOworICAgIGNhc2UgLTE6IHdyaXRlKCJObyBwZXJtaXNzaW9uXG4iKTsgYnJlYWs7CisgICAgY2FzZSAtMjogd3JpdGUoIk5vIHN1Y2ggZ3JvdXBcbiIpOyBicmVhazsKKyAgfQorICByZXR1cm4gMTsKK30KKworaW50IGdpbmZvKHN0cmluZyBzdHIpCit7CisgIG1peGVkICpncjsKKyAgaW50IGk7CisgIAorICBpZiAoIShzdHI9VUEpKQorICB7CisgICAgd3JpdGUoIlVzYWdlOiBnaW5mbyA8Z25hbWU+XG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoIXBvaW50ZXJwKChncj0iL3NlY3VyZS9uZXdzIi0+R2V0R3JvdXAoc3RyKSkpKQorICB7CisgICAgd3JpdGUoIkdldCBncm91cCBlcnJvclxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKGdyWzExXT09LTEpCisgIHsKKyAgICB3cml0ZSgiR3JvdXAgXCIiK2dyWzBdKyJcIiBkb2VzIG5vdCBleGlzdC5cbiIpOworICAgIHJldHVybiAxOworICB9CisgICAgICAgIC8vICAgICAgICAgMSAgICAgICAgIDIgICAgICAgICAzICAgICAgICAgNCAgICAgICAgIDUgICAgICAgICA2ICAgICAgICAgNyAKKyAgICAgICAgLy8xMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2NzgKKyAgcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworICAKKyAgcHJpbnRmKCJSdWJyaWsgIDogJXMgKCVzKSBTYXZlZmlsZTogJXNcblxuIixnclswXSxjYXBpdGFsaXplKGdyWzFdKSxnclsyXSk7CisgIHByaW50ZigiTWVzc2FnZXM6ICVpLyVpICAgIEV4cGlyZTogJWkgVGFnZS5cblxuIiwKKwkJICAocG9pbnRlcnAoZ3JbMTFdKT9zaXplb2YoZ3JbMTFdKTowKSxnclsxMF0sZ3JbM10vODY0MDApOyAgCisgIAorICBwcmludGYoIGJyZWFrX3N0cmluZygoc2l6ZW9mKGdyWzZdKT8iKCIrKENvdW50VXAobWFwKGdyWzZdLCMnY2FwaXRhbGl6ZSkpKSsiKSI6IiAiKSwgNzgsICJSZWFkZXJzIDogIitncls5XSsiICIsMTYpKTsKKyAgCisgIHByaW50ZiggYnJlYWtfc3RyaW5nKChzaXplb2YoZ3JbNV0pPyIoIisoQ291bnRVcChtYXAoZ3JbNV0sIydjYXBpdGFsaXplKSkpKyIpIjoiICIpLCA3OCwgIldyaXRlcnMgOiAiK2dyWzhdKyIgIiwxNikpOworICAKKyAgcHJpbnRmKCBicmVha19zdHJpbmcoKHNpemVvZihncls0XSk/IigiKyhDb3VudFVwKG1hcChncls0XSwjJ2NhcGl0YWxpemUpKSkrIikiOiIgIiksIDc4LCAiRGVsZXRlcnM6ICIrZ3JbN10rIiAiLDE2KSk7CisgIAorICBwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisgIHJldHVybiAxOworfQorICAgIAoraW50IHJlbW92ZWcoc3RyaW5nIHN0cikKK3sKKyAgaWYgKCEoc3RyPVVBKSkKKyAgeworICAgIHdyaXRlKCJyZW1vdmVnIDxncnVwcGVubmFtZT5cbkdydXBwZSBMT0VTQ0hFTi5cbiIpOworICAgIHJldHVybiAwOworICB9CisgIHN3aXRjaCgiL3NlY3VyZS9uZXdzIi0+UmVtb3ZlR3JvdXAoc3RyKSl7CisgICAgY2FzZSAxOiB3cml0ZSgiT2suIEJpdHRlIG5pY2h0IHZlcmdlc3NlbiwgZGFzIFNhdmVmaWxlIGRlciBOZXdzZ3JvdXAgdm9uIEhhbmQgenUgZW50ZmVybmVuICFcbiIpOyBicmVhazsKKyAgICBjYXNlIDA6IHdyaXRlKCJQYXJhbSBlcnJvci5cbiIpOyBicmVhazsKKyAgICBjYXNlIC0xOiB3cml0ZSgiTm8gcGVybWlzc2lvblxuIik7IGJyZWFrOworICAgIGNhc2UgLTI6IHdyaXRlKCJObyBzdWNoIGdyb3VwIik7IGJyZWFrOworICB9CisgIHJldHVybiAxOworfQorCitpbnQgYWRkZyhzdHJpbmcgc3RyKQoreworICBzdHJpbmcgbmFtZSwgb3duZXI7CisKKyAgaWYgKCEoc3RyPVVBKSB8fCBzc2NhbmYoc3RyLCIlcyAlcyIsbmFtZSxvd25lcikhPTIpCisgIHsKKyAgICB3cml0ZSgiYWRkZyA8Z3J1cHBlPiA8dXNlcj5cbkdydXBwZSBhbmxlZ2VuLCA8dXNlcj4gd2lyZCBCZXNpdHplciBkZXIgR3J1cHBlXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBzd2l0Y2ggKCJzZWN1cmUvbmV3cyItPkFkZEdyb3VwKG5hbWUsIG93bmVyKSl7CisgICAgY2FzZSAxOiB3cml0ZSgiT2suXG4iKTsgYnJlYWs7CisgICAgY2FzZSAwOiB3cml0ZSgiUGFyYW0gZXJyb3IuXG4iKTsgYnJlYWs7CisgICAgY2FzZSAtMTogd3JpdGUoIk5vIHBlcm1pc3Npb24uXG4iKTsgYnJlYWs7CisgICAgY2FzZSAtMjogd3JpdGUoIkdyb3VwIGFscmVhZHkgdGhlcmVcbiIpOyBicmVhazsKKyAgICBjYXNlIC0zOiB3cml0ZSgiT3duZXIgbm90IGZvdW5kLlxuIik7IGJyZWFrOworICAgIGNhc2UgLTQ6IHdyaXRlKCJTYXZlZmlsZSBhbHJlYWR5IGluIHVzZS5cbiIpOyBicmVhazsKKyAgfQorICByZXR1cm4gMTsKK30KKyAgCitpbnQgZXhwaXJlKCkKK3sKKyAgIi9zZWN1cmUvbmV3cyItPmV4cGlyZV9hbGwoKTsKKyAgd3JpdGUoIkV4cGlyaW5nIHN0YXJ0ZXQuXG4iKTsKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9vYmovdG9vbHMvcGxhbnR0b29sLmMgYi9vYmovdG9vbHMvcGxhbnR0b29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQwY2NiOQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9wbGFudHRvb2wuYwpAQCAtMCwwICsxLDQxIEBACitpbmhlcml0ICIvc3RkL3NlY3VyZV90aGluZyI7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjZGVmaW5lIFBMQU5UTUFTVEVSICIvc2VjdXJlL2tyYXV0bWFzdGVyIgorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSAKK3sKKyAgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSAKKyAgICAgcmV0dXJuOworICAgOjpjcmVhdGUoKTsKKyAgIAorICAgU2V0UHJvcChQX1NIT1JULCAiRGFzIEtyYWV1dGVydG9vbCIpOworICAgU2V0KFBfTE9ORywgZnVuY3Rpb24gc3RyaW5nICgpIHsgcmV0dXJuIAorICAgICAiRGFzIEtyYWV1dGVydG9vbCBoYXQgZm9sZ2VuZGUgQmVmZWhsZTpcbiIKKyAgICArIi0gc2hvd3BsYW50IFtrYXRlZ29yaWVdIChsaXN0ZXQgYWxsZSBQZmxhbnplbiBlaW5lciBLYXRlZ29yaWUgYXVmLilcbiIKKyAgICArKElTX0FSQ0godGhpc19wbGF5ZXIoKSk/CisgICAgIkZvbGdlbmRlIEJlZmVobGUgc2luZCBudXIgZnVlciBFTSsgdmVyZnVlZ2JhcjpcbiIKKyAgICArIi0gc2hvd3Jvb21zIFtJRHxhbGxdIChMaXN0ZXQgYWxsZSBSYWV1bWUgYXVmLCBpbiBkZW5lbiBkYXMgS3JhdXQgPElEPlxuIgorICAgICsiICB6dSBmaW5kZW4gaXN0LCBvZGVyIGFsbGUgUmFldW1lLCBpbiBkZW5lbiBlaW4gS3JhdXQgd2FlY2hzdC4pXG4iCisgICAgKyItIHJlZnJlc2ggKHVwZGF0ZXQgYWxsZSBGaWxlcykuXG4iCisgICAgKyItIGFkZHJvb20gPHBsYW50SWQ+IDxsb2FkbmFtZT4gKHRyYWVndCBlaW5lbiBuZXVlbiBGdW5kb3J0IGVpbikuXG4iCisgICAgKyItIGRlbHJvb20gPGxvYWRuYW1lPiAobG9lc2NodCBhbGxlIEtyYWV1dGVyIGZ1ZXIgZWluZW4gRnVuZG9ydCkuXG4iCisgICAgKyItIGNyZWF0ZWZpbGUgPHBsYW50SWQ+IChlcnpldWd0IGRhcyBLcmF1dCBhbHMgRmlsZSkuXG4iCisgICAgKyItIGNsb25lcGxhbnQgPHBsYW50SWR8cGxhbnRGaWxlPiAoY2xvbnQgZGFzIEtyYXV0IGludiBJbnYpLlxuIjoKKyAgICAiIik7fSwgRl9RVUVSWV9NRVRIT0QpOworICAgU2V0UHJvcChQX05BTUUsICJQbGFudHRvb2wiKTsKKyAgIFNldFByb3AoUF9HRU5ERVIsIE5FVVRFUik7CisgICBTZXRQcm9wKFBfQVVUT0xPQURPQkosIDEpOworICAgU2V0UHJvcChQX05PRFJPUCwgMSk7CisgICBTZXRQcm9wKFBfTkVWRVJEUk9QLCAxKTsKKyAgIEFkZElkKCh7InRvb2wiLCAia3JhZXV0ZXJ0b29sIiwgInBsYW50dG9vbCJ9KSk7CisgICBBZGRDbWQoKHsiY2xvbmVwbGFudCIsICJzaG93cGxhbnQiLCAic2hvd3Jvb21zIiwgInJlZnJlc2giLAorICAgICAgICAgICAgImFkZHJvb20iLCAiZGVscm9vbSIsICJjcmVhdGVmaWxlIn0pLCAiX3BsYW50bWFzdGVyIik7Cit9CisKK3N0YXRpYyBpbnQgX3BsYW50bWFzdGVyKHN0cmluZyBzdHIpCit7CisgICBub3RpZnlfZmFpbCgiVW5rbm93biBGdW5jdGlvbiBpbiBwbGFudG1hc3RlcjogXyIrcXVlcnlfdmVyYigpKyIoKVxuIik7CisgICByZXR1cm4gY2FsbF9vdGhlcihQTEFOVE1BU1RFUiwgIl8iK3F1ZXJ5X3ZlcmIoKSwgc3RyKTsKK30KZGlmZiAtLWdpdCBhL29iai90b29scy9wcm9qZWt0dG9vbC5jIGIvb2JqL3Rvb2xzL3Byb2pla3R0b29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYxYTlkZAotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9wcm9qZWt0dG9vbC5jCkBAIC0wLDAgKzEsMjEyIEBACisvLworLy8gUHJvamVjdHRvb2wKKy8vCisKKyNpbmNsdWRlICIvcC9zZXJ2aWNlL21hbmRyYWdvbi9wcm9qZWt0YnJldHQvcHJvamVjdG1hc3Rlci5oIgorI2luY2x1ZGUgIi9zZWN1cmUvd2l6bGV2ZWxzLmgiCisjaW5jbHVkZSA8bW92aW5nLmg+CisKK2luaGVyaXQgIi9zdGQvdGhpbmciOworc3RyaW5nIGhpbGZlOworc3RhdGljIGludCBjaGFuZ2V0aW1lOworc3RhdGljIGludCBzdXBwcmVzc2luZm9zOworCit2b2lkIGNyZWF0ZSgpCit7CisJaWYgKCFJU19DTE9ORShUTykpIHJldHVybjsKKwk6OmNyZWF0ZSgpOworCWlmICghZmluZF9vYmplY3QoUFJPSkVDVE1BU1RFUikpIGNhbGxfb3RoZXIoUFJPSkVDVE1BU1RFUiwiPz8/Iik7CisgICAgICAgIAorCVNldFByb3AoUF9OQU1FLCJTY2hyZWliZmVkZXIiKTsKKwlTZXRQcm9wKFBfTk9EUk9QLCJEdSBtb2VjaHRlc3QgRGVpbmUgRmVkZXIgZGFubiBkb2NoIGxpZWJlciBiZWhhbHRlbi5cbiIpOworCVNldFByb3AoUF9ORVZFUkRST1AsMSk7CisJU2V0UHJvcChQX0dFTkRFUixGRU1BTEUpOworCVNldFByb3AoUF9TSE9SVCwiRWluZSBrbGVpbmUgbWFnaXNjaGUgU2NocmVpYmZlZGVyIik7CisgICAgICAgIGlmICghY2hhbmdldGltZSkgY2hhbmdldGltZT0xOworICAgICAgICBoaWxmZT1CUygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKKyAgICAgICAgICAgICAgICAgIkRpZXNlIEZlZGVyIGVybW9lZ2xpY2h0IGVzIERpciBuaWNodCBudXIsIHZvbiB1ZWJlcmFsbCBoZXIgYXVmIGRpZSAiCisgICAgICAgICAgICAgICAgICJhbGxzZWl0cyBiZWxpZWJ0ZW4gU2Nod2FyemVuIEJyZXR0ZXIgZnVlciBQcm9qZWt0ZSB6dXp1Z3JlaWZlbiwgIgorICAgICAgICAgICAgICAgICAic29uZGVybiBlcm1vZWdsaWNodCBlcyBEaXIgYXVjaCwgc2VsYmVyIFByb2pla3RlIGRvcnQgenUgIgorICAgICAgICAgICAgICAgICAidmVyb2VmZmVudGxpY2hlbi5cbiIKKyAgICAgICAgICAgICAgICAgIkZvbGdlbmRlIEtvbW1hbmRvcyBrb2VubmVuIERpciBkYWJlaSBoZWxmZW46XG5cbiIKKyAgICAgICAgICAgICAgICAgImZlZGVyaGlsZmUgICAgICAgICAgICAgIC0gRGllc2UgVWViZXJzaWNodFxuIgorICAgICAgICAgICAgICAgICAiZmVkZXJkb2t1ICAgICAgICAgICAgICAgLSBEb2t1bWVudGF0aW9uIGFsbGVyIEJlZmVobGVcbiIKKyAgICAgICAgICAgICAgICAgInByb2pla3RoaWxmZSAgICAgICAgICAgIC0gVWViZXJzaWNodCB1ZWJlciBkaWUgQnJldHRiZWZlaGxlXG4iCisgICAgICAgICAgICAgICAgICJBZGRQcm9qZWN0ICAgICAgICAgICAgICAtIFByb2pla3QgYW5sZWdlblxuIgorICAgICAgICAgICAgICAgICAiUmVtb3ZlUHJvamVjdCA8TnVtbWVyPiAgLSBQcm9qZWt0IGVudGZlcm5lblxuIgorICAgICAgICAgICAgICAgICAiTW9kaWZ5UHJvamVjdCA8TnVtbWVyPiAgLSBQcm9qZWt0IGFlbmRlcm5cbiIKKyAgICAgICAgICAgICAgICAgInByb2pla3RpbmZvcyBlaW58YW58YXVzIC0gQWVuZGVydW5nZW4gKG5pY2h0IG1laHIpIGFuemVpZ2VuXG5cbiIKKyAgICAgICAgICAgICAgICAgIkJlaSBGcmFnZW4sIEJ1Z3MgdW5kL29kZXIgVHlwb3Mgd2VuZGUgRGljaCBiaXR0ZSB2ZXJ0cmF1ZW5zdm9sbCBhbiBkZW5cbiIKKyAgICAgICAgICAgICAgICAgIk1hbmRyYWdvbiBEZWluZXIgV2FobC5cbiIKKyAgICAgICAgICAgICAgICAgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworCVNldFByb3AoUF9MT05HLAorCQlCUygiRGllc2Uga2xlaW5lLCB3ZWlzc2UsIG1hZ2lzY2ggZ2xhZW56ZW5kZSBGZWRlciBsaWVndCBzYW5mdCAiICsKKwkgICAgICAgICAgICJpbiBEZWluZXIgSGFuZC4gRHUgc3B1ZXJzdCBmb2VybWxpY2gsIHdpZSBzaWUgZGFuYWNoIGRyaW5ndCwgIiArCisJCSAgICJOZXVlcyB6dSBzY2hhZmZlbiB1bmQgZGllIFdlbHQgenUgdmVyZ3JvZXNzZXJuLlxuXG4iKStoaWxmZSk7CisgICAgICAgIEFkZElkKCh7InNjaHJlaWJmZWRlciIsImZlZGVyIiwicHJvamVrdHRvb2wifSkpOworCUFkZENtZCgiZmVkZXJoaWxmZSIsImhpbGZlX2Z1biIpOworCUFkZENtZCgicHJvamVrdGhpbGZlIiwiYm9hcmRfaGVscCIpOworCUFkZENtZCgicHJvamVrdGxpc3RlIiwiYm9hcmRfbGlzdCIpOworICAgICAgICBBZGRDbWQoImZlZGVyZG9rdSIsImRva3VfZnVuIik7CisJQWRkQ21kKCh7InByb2pla3RkZXRhaWwiLCJwcm9qZWt0ZGV0YWlscyJ9KSwiYm9hcmRfbG9uZyIpOworCUFkZENtZCgoeyJhZGRwcm9qZWN0IiwiQWRkUHJvamVjdCIsImFwIn0pLCJhZGRwcm9qX2Z1biIpOworCUFkZENtZCgoeyJyZW1vdmVwcm9qZWN0IiwiUmVtb3ZlUHJvamVjdCIsInJwIn0pLCJyZW1wcm9qX2Z1biIpOworCUFkZENtZCgoeyJtb2RpZnlwcm9qZWN0IiwiTW9kaWZ5UHJvamVjdCIsIm1wIn0pLCJtb2Rwcm9qX2Z1biIpOworICAgICAgICBBZGRDbWQoInByb2pla3RpbmZvcyIsIndhdGNoX2Z1biIpOworCVRPLT5tb3ZlKFRQLE1fTk9DSEVDSyk7CisJcmV0dXJuOworfQorCit2b2lkIF9zZXRfYXV0b2xvYWRvYmoobWl4ZWQgdmFsKQoreworICBpZiAoaW50cCh2YWwpKSBjaGFuZ2V0aW1lPXRpbWUoKTsKKyAgZWxzZSBpZiAocG9pbnRlcnAodmFsKSYmc2l6ZW9mKHZhbCk9PTIpCisgIHsKKyAgICBjaGFuZ2V0aW1lPXZhbFswXTsKKyAgICBzdXBwcmVzc2luZm9zPXZhbFsxXTsKKyAgfQorICByZXR1cm47Cit9CisKK2ludCAqX3F1ZXJ5X2F1dG9sb2Fkb2JqKCkgeyByZXR1cm4gKHsgY2hhbmdldGltZSwgc3VwcHJlc3NpbmZvcyB9KTsgfQorCitpbnQgZG9rdV9mdW4oc3RyaW5nIGFyZykKK3sKKyAgVFAtPk1vcmUoUFJPSkVDVERPS1UsMSk7CisgIHJldHVybiAxOworfQorCitpbnQgYm9hcmRfaGVscChzdHJpbmcgYXJnKQoreworICBQUk9KRUNUTUFTVEVSLT5Cb2FyZEhlbHAoKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBib2FyZF9saXN0KHN0cmluZyBhcmcpCit7CisgIGFyZz1UUC0+X3VucGFyc2VkX2FyZ3MoMSk7CisgIGlmICghc2l6ZW9mKGFyZykpIChQUk9KRUNUTUFTVEVSKS0+U2hvd0xpc3QoKTsKKyAgZWxzZSBQUk9KRUNUTUFTVEVSLT5QYXJzZUFyZ3MoYXJnKTsKKyAgY2hhbmdldGltZT10aW1lKCk7CisgIHJldHVybiAxOworfQorCitpbnQgYm9hcmRfbG9uZyhzdHJpbmcgYXJnKQoreworICBpbnQgbnVtYmVyOworICBhcmc9VFAtPl91bnBhcnNlZF9hcmdzKDEpOworICBub3RpZnlfZmFpbCgiU3ludGF4OiBwcm9qZWt0ZGV0YWlsIDxQUk9KRUtUTlVNTUVSPlxuIik7CisgIGlmICghc2l6ZW9mKGFyZykpIHJldHVybiAwOworICBpZiAoIShudW1iZXI9dG9faW50KGFyZykpfHwoYXJnIT10b19zdHJpbmcobnVtYmVyKSkpIHJldHVybiAwOworICBub3RpZnlfZmFpbCgiUHJvamVrdG51bW1lcm4ga29lbm5lbiBudXIgWmFobGVuIGdyb2Vzc2VyIE51bGwgc2Vpbi5cbiIpOworICBpZiAobnVtYmVyPDEpIHJldHVybiAwOworICBQUk9KRUNUTUFTVEVSLT5TaG93TG9uZyhudW1iZXIpOworICByZXR1cm4gMTsKK30KKworaW50IGhpbGZlX2Z1bihzdHJpbmcgYXJnKQoreworICB0ZWxsX29iamVjdChUUCxoaWxmZSk7CisgIHJldHVybiAxOworfQorCitpbnQgYm9hcmRfZnVuKHN0cmluZyBhcmcpCit7CisgIFBST0pFQ1RNQVNURVItPlBhcnNlQXJncyhUUC0+X3VucGFyc2VkX2FyZ3MoMSkpOworICByZXR1cm4gMTsKK30KKworaW50IGFkZHByb2pfZnVuKHN0cmluZyBhcmcpCit7CisgIGlmICghSVNfTEVBUk5FUihUUCkpCisgIHsKKyAgICB0ZWxsX29iamVjdChUUCwiV2llIGJpc3QgRFUgZGVubiBhbiBkaWUgRmVkZXIgZ2Vrb21tZW4/XG4iKTsKKyAgICBUTy0+cmVtb3ZlKCk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgUFJPSkVDVE1BU1RFUi0+Q2hhbmdlRGF0YSgwKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCByZW1wcm9qX2Z1bihzdHJpbmcgYXJnKQoreworICBpZiAoIUlTX0xFQVJORVIoVFApKQorICB7CisgICAgdGVsbF9vYmplY3QoVFAsIldpZSBiaXN0IERVIGRlbm4gYW4gZGllIEZlZGVyIGdla29tbWVuP1xuIik7CisgICAgVE8tPnJlbW92ZSgpOworICAgIHJldHVybiAxOworICB9CisgIG5vdGlmeV9mYWlsKCJTeW50YXg6IHJlbW92ZXByb2plY3QgTlVNTUVSXG4iKTsKKyAgaWYgKCFzaXplb2YoYXJnKXx8IWludHAodG9faW50KGFyZykpfHwoYXJnIT10b19zdHJpbmcodG9faW50KGFyZykpKSkgcmV0dXJuIDA7CisgIFBST0pFQ1RNQVNURVItPkRlbGV0ZURhdGEodG9faW50KGFyZykpOworICByZXR1cm4gMTsKK30KKworaW50IG1vZHByb2pfZnVuKHN0cmluZyBhcmcpCit7CisgIGlmICghSVNfTEVBUk5FUihUUCkpCisgIHsKKyAgICB0ZWxsX29iamVjdChUUCwiV2llIGJpc3QgRFUgZGVubiBhbiBkaWUgRmVkZXIgZ2Vrb21tZW4/XG4iKTsKKyAgICBUTy0+cmVtb3ZlKCk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgbm90aWZ5X2ZhaWwoIlN5bnRheDogbW9kaWZ5cHJvamVjdCBOVU1NRVJcbiIpOworICBpZiAoIWFyZ3x8IWludHAodG9faW50KGFyZykpfHwoYXJnIT10b19zdHJpbmcodG9faW50KGFyZykpKSkgcmV0dXJuIDA7CisgIG5vdGlmeV9mYWlsKCJFcyBnaWJ0IGtlaW4gUHJvamVrdCBtaXQgZGVyIE51bW1lciAwLlxuIik7CisgIGlmICh0b19pbnQoYXJnKT09MCkgcmV0dXJuIDA7CisgIFBST0pFQ1RNQVNURVItPkNoYW5nZURhdGEodG9faW50KGFyZykpOworICByZXR1cm4gMTsKK30KKworaW50IHdhdGNoX2Z1bihzdHJpbmcgYXJnKQoreworICBpZiAoIUlTX0xFQVJORVIoVFApKQorICB7CisgICAgdGVsbF9vYmplY3QoVFAsIldpZSBiaXN0IERVIGRlbm4gYW4gZGllIEZlZGVyIGdla29tbWVuP1xuIik7CisgICAgVE8tPnJlbW92ZSgpOworICAgIHJldHVybiAxOworICB9CisgIGlmICghc2l6ZW9mKGFyZykpCisgIHsKKyAgICB0ZWxsX29iamVjdChUUCxCUyhzcHJpbnRmKCJEdSBiZWtvbW1zdCBkZXJ6ZWl0ICVzSW5mb3JtYXRpb25lbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidWViZXIgQWVuZGVydW5nZW4gYW0gUHJvamVrdGJyZXR0LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwcmVzc2luZm9zPyJrZWluZSAiOiIiKSkpOworICAgIHJldHVybiAxOworICB9CisgIG5vdGlmeV9mYWlsKCJTeW50YXg6IHByb2pla3RpbmZvcyA8ZWlufGFufGF1cz5cbiIpOworICBpZiAoYXJnIT0iZWluIiYmYXJnIT0iYW4iJiZhcmchPSJhdXMiKSByZXR1cm4gMDsKKyAgaWYgKGFyZz09ImF1cyIpCisgIHsKKyAgICBzdXBwcmVzc2luZm9zPTE7CisgICAgdGVsbF9vYmplY3QoVFAsQlMoIkR1IHdpcnN0IGpldHp0IGtlaW5lIE1lbGR1bmdlbiBtZWhyIHVlYmVyICIKKyAgICAgICAgICAgICAgICAgICAgICAiQWVuZGVydW5nZW4gYW0gUHJvamVrdGJyZXR0IGVyaGFsdGVuLlxuIikpOworICAgIHJldHVybiAxOworICB9CisgIHN1cHByZXNzaW5mb3M9MDsKKyAgdGVsbF9vYmplY3QoVFAsQlMoIkR1IGJla29tbXN0IGFiIHNvZm9ydCBNZWxkdW5nZW4gdWViZXIgQWVuZGVydW5nZW4gIgorICAgICAgICAgICAgICAgICAgICAiYW0gUHJvamVrdGJyZXR0LlxuIikpOworICByZXR1cm4gMTsKK30KKwordm9pZCBpbml0KCkKK3sKKyAgaWYgKCFJU19MRUFSTkVSKFRQKSkgeworICAgIGlmIChmaW5kX2NhbGxfb3V0KCJyZW1vdmUiKSA9PSAtMSkKKyAgICAgIGNhbGxfb3V0KCJyZW1vdmUiLDApOworICB9CisgIGVsc2UgOjppbml0KCk7CisgIHJldHVybjsKK30KKwordm9pZCByZXNldCgpCit7CisgIGlmICghZW52aXJvbm1lbnQoKSkKKyAgeworICAgIGRlc3RydWN0KFRPKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCFzdXBwcmVzc2luZm9zJiZjaGFuZ2V0aW1lPChQUk9KRUNUTUFTVEVSLT5DaGFuZ2VUaW1lKCkpKQorICAgIHRlbGxfb2JqZWN0KGVudmlyb25tZW50KCksIkludHVpdGl2IHNwdWVyc3QgRHUsIGRhc3Mgc2ljaCAiCisgICAgICAgICAgICAgICAgImRpZSBBdXNoYWVuZ2UgYW0gUHJvamVrdGJyZXR0IGdlYWVuZGVydCBoYWJlbi5cbiIpOworICByZXR1cm47Cit9CmRpZmYgLS1naXQgYS9vYmovdG9vbHMvcHRvb2wuYyBiL29iai90b29scy9wdG9vbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MzZjYWUKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvcHRvb2wuYwpAQCAtMCwwICsxLDI5MSBAQAorLyoKKyAgIE9iamVrdCB6dW0gRWludHJhZ2VuIHZvbiBSYWV1bWVuIGRpZSBaYXViZXJ0cmFlbmtlIGVudGhhbHRlbiBiZWltCisgICBwb3Rpb25tYXN0ZXIuIAorKi8KKworI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorCitpbmhlcml0ICJzdGQvdGhpbmciOworCitpbnQgZHVtcCgpOworCitpbnQgc2VjdXJlKCkKK3sKKyAgaWYgKCFwcmV2aW91c19vYmplY3QoKSkgcmV0dXJuIDA7CisgIGlmIChnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKT09Uk9PVElEKSByZXR1cm4gMTsKKyAgaWYgKGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpICE9IGdldGV1aWQodGhpc19pbnRlcmFjdGl2ZSgpKSkgcmV0dXJuIDA7CisgIGlmICh0aGlzX2ludGVyYWN0aXZlKCkgIT0gdGhpc19wbGF5ZXIoKSkgcmV0dXJuIDA7CisgIGlmICghQVJDSF9TRUNVUklUWSkgcmV0dXJuIDA7CisgIHJldHVybiAxOworfQorCit2b2lkIGNyZWF0ZSgpCit7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9TSE9SVCwgIlBvdGlvbi1Ub29sIik7CisgIFNldFByb3AoUF9MT05HLCAKKyAgICAgIkVpbiBUb29sIHp1bSBFaW50cmFnZW4gdm9uIFJhdW1lbiBpbiBkZW4gUG90aW9ubWFzdGVyLlxuIisKKyAgICAgIkZvbGdlbmRlIEJlZmVobGUgZ2lidCBlczpcbiIrCisgICAgICJwdGFkZCA8bGlzdGU+ICAgICBBZGRpZXJ0IGRlbiBaVCBpbSBSYXVtIGluIExpc3RlIDxsaXN0ZT5cbiIrCisgICAgICIgICAgICAgICAgICAgICAgICB1bmQgYWt0aXZpZXJ0IGlobiBnbGVpY2h6ZWl0aWcuXG4iKworICAgICAicHRzZXQgPGxpc3RlPiAgICAgQWt0aXZpZXJ0IGRlbiBaVCBpbSBSYXVtIHVuZCBzZXR6dCBpaG4gaW5cbiIrCisgICAgICIgICAgICAgICAgICAgICAgICBkaWUgTGlzdGUgPGxpc3RlPi5cbiIrCisgICAgICJwdGNoYW5nZSA8bnVtbWVyPiBFcnNldHp0IGRlbiBaVCA8bnVtbWVyPiBkdXJjaCBkZW4gWlQgaW0gUmF1bS5cbiIrCisgICAgICJwdGFjdCAgICAgICAgICAgICBBa3RpdmllcnQgZWluZW4gZGVha3RpdmllcnRlbiBaVCBpbiBzZWluZXJcbiIrCisgICAgICIgICAgICAgICAgICAgICAgICBiaXNoZXJpZ2VuIExpc3RlLlxuIisKKyAgICAgInB0ZGVhY3QgICAgICAgICAgIERlYWt0aXZpZXJ0IGRlbiBaVCBpbSBSYXVtIGF1cyBkZXIgWlRMaXN0ZVxuIisKKyAgICAgIiAgICAgICAgICAgICAgICAgIHVuZCB2ZXJzY2hpZWJ0IGlobiBuYWNoICdkZWFrdGl2aWVydGUgWlRzJy5cbiIrCisgICAgICJwdGluZm8gW3BhcmFdICAgICBrZWluIHBhcmE6ICAgWmVpZ3QgSW5mb3MgdWViZXIgZGVuIFpUIGltIGFrdHUtXG4iKworICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsbGVuIFJhdW0uXG4iKworICAgICAiICAgICAgICAgICAgICAgICAgaW50IHBhcmE6ICAgIFplaWd0IEluZm9zIHp1bSBaVCBwYXJhIGFuLlxuIisKKyAgICAgIiAgICAgICAgICAgICAgICAgIHN0cmluZyBwYXJhOiBaZWlndCBaVC1JbmZvcyBkZXMgU3BpZWxlcnMgcGFyYS5cbiIrCisgICAgICJwdGR1bXAgICAgICAgICAgICBFcnpldWd0IGVpbiBEdW1wIGRlciBha3R1ZWxsZW4gWlRMaXN0ZSB1bmRcbiIrCisgICAgICIgICAgICAgICAgICAgICAgICBzcGVpY2hlcnQgZGllc2VuIGFiLlxuXG4iKTsKKyAgU2V0UHJvcChQX05BTUUsICJQVG9vbCIpOworICBTZXRQcm9wKFBfR0VOREVSLCBORVVURVIpOworICBBZGRJZCgoeyJ0b29sIiwgInB0b29sIn0pKTsKKyAgU2V0UHJvcChQX05PRFJPUCwgMSk7CisgIFNldFByb3AoUF9BVVRPTE9BRE9CSiwgMSk7CisgIEFkZENtZCgicHRhZGQiLCAiYWRkIik7CisgIEFkZENtZCgicHRzZXQiLCAic2V0bGlzdCIpOworICBBZGRDbWQoInB0Y2hhbmdlIiwgImNoYW5nZXBhdGgiKTsKKyAgQWRkQ21kKCJwdGFjdCIsICJhY3RpdmF0ZSIpOworICBBZGRDbWQoInB0ZGVhY3QiLCAiZGVhY3RpdmF0ZSIpOworICBBZGRDbWQoInB0aW5mbyIsICJpbmZvIik7CisgIEFkZENtZCgicHRkdW1wIiwgImR1bXAiKTsKK30KKworaW50IGFkZChzdHJpbmcgbnVtYmVyKQoreworICBpbnQgbnIsIG5leHQsIGFjdGl2ZTsKKyAgc3RyaW5nIHJvb207CisgIGlmICghc2VjdXJlKCkpCisgIHsgcHJpbnRmKCJGZWhsZXI6IC0xXG4iKTsgcmV0dXJuIC0xOyB9CisgIGlmICghcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShlbnZpcm9ubWVudCgpKSkKKyAgeyBwcmludGYoIkZlaGxlcjogLTJcbiIpOyByZXR1cm4gLTI7IH0KKyAgaWYgKCFudW1iZXIpCisgIHsgcHJpbnRmKCJGZWhsZXI6IC0zXG4iKTsgcmV0dXJuIC0zOyB9CisgIHNzY2FuZihudW1iZXIsICIlZCIsIG5yKTsKKyAgaWYgKCFpbnRwKG5yKSkKKyAgeyBwcmludGYoIkZlaGxlcjogLTRcbiIpOyByZXR1cm4gLTQ7IH0KKyAgcm9vbSA9IG9iamVjdF9uYW1lKGVudmlyb25tZW50KGVudmlyb25tZW50KHRoaXNfb2JqZWN0KCkpKSk7CisgIG5leHQgPSAiL3NlY3VyZS9wb3Rpb25tYXN0ZXIiLT5BZGRQb3Rpb25Sb29tKHJvb20sbnIpOworICBpZiAobmV4dD4wKQorICAgIHByaW50ZigiUmF1bSBpbiBHZXNhbXRsaXN0ZSBlaW5nZXRyYWdlbiwgTnVtbWVyOiAlZFxuIiwgbmV4dC0xKTsKKyAgZWxzZQorICB7CisgICAgcHJpbnRmKCJSYXVtIGtvbm50ZSBuaWNodCBlaW5nZXRyYWdlbiB3ZXJkZW4sIEVyZ2VibmlzOiAlZFxuIiwgbmV4dCk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgLy8gTmljaHQgbWVociBub2V0aWcsIEFyYXRob3JuLCAyMDEzLU1haS0zMAorICAvL2FjdGl2ZSA9ICIvc2VjdXJlL3BvdGlvbm1hc3RlciItPlNldExpc3ROcihyb29tLCBucik7CisgIGlmIChhY3RpdmU+PTApCisgIHsKKyAgICBwcmludGYoIlJhdW0gYWt0aXZpZXJ0IGluIExpc3RlICVkXG4iLCBucik7CisgICAgZHVtcCgpOworICB9CisgIGVsc2UKKyAgICBwcmludGYoIkZlaGxlciBiZWltIEFrdGl2aWVyZW4sIEVyZ2VibmlzOiAlZFxuIiwgYWN0aXZlKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBjaGFuZ2VwYXRoKHN0cmluZyBudW1iZXIpCit7CisgIGludCBucixuZXU7CisgIHN0cmluZyByb29tOworICBtaXhlZCByb29tb2xkOworICBpZiAoIXNlY3VyZSgpKQorICB7IHByaW50ZigiRmVobGVyOiAtMVxuIik7IHJldHVybiAtMTsgfQorICBpZiAoIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoZW52aXJvbm1lbnQoKSkpCisgIHsgcHJpbnRmKCJGZWhsZXI6IC0yXG4iKTsgcmV0dXJuIC0yOyB9CisgIGlmICghbnVtYmVyKQorICB7IHByaW50ZigiRmVobGVyOiAtM1xuIik7IHJldHVybiAtMzsgfQorICBzc2NhbmYobnVtYmVyLCAiJWQiLCBucik7CisgIGlmICghaW50cChucikpCisgIHsgcHJpbnRmKCJGZWhsZXI6IC00XG4iKTsgcmV0dXJuIC00OyB9CisgIHJvb20gPSBvYmplY3RfbmFtZShlbnZpcm9ubWVudChlbnZpcm9ubWVudCh0aGlzX29iamVjdCgpKSkpOworICByb29tb2xkID0gIi9zZWN1cmUvcG90aW9ubWFzdGVyIi0+R2V0RmlsZW5hbWVCeU51bWJlcihucik7CisgIGlmIChyb29tb2xkPT0tMSkKKyAgeyBwcmludGYoIkZlaGxlcjogLTVcbiIpOyByZXR1cm4gLTU7IH0KKyAgbmV1ID0gIi9zZWN1cmUvcG90aW9ubWFzdGVyIi0+Q2hhbmdlUm9vbVBhdGgocm9vbW9sZCxyb29tKTsKKyAgaWYgKG5ldT4wKQorICAgIHsKKyAgICAgIHByaW50ZigiWlQgJWQgZHVyY2ggYWt0dWVsbGVuIFJhdW0gZXJzZXR6dC5cbiIsIG5ldSk7CisgICAgICBkdW1wKCk7CisgICAgfQorICBlbHNlCisgICAgcHJpbnRmKCJaVCAlZCBrb25udGUgbmljaHQgZXJzZXR6dCB3ZXJkZW4sIEVyZ2VibmlzOiAlZFxuIiwgbnIsbmV1KTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBzZXRsaXN0KHN0cmluZyBudW1iZXIpCit7CisgIGludCBuciwgbmV4dCwgYWN0aXZlOworICBzdHJpbmcgcm9vbTsKKyAgaWYgKCFzZWN1cmUoKSkKKyAgeyBwcmludGYoIkZlaGxlcjogLTFcbiIpOyByZXR1cm4gLTE7IH0KKyAgaWYgKCFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKGVudmlyb25tZW50KCkpKQorICB7IHByaW50ZigiRmVobGVyOiAtMlxuIik7IHJldHVybiAtMjsgfQorICBpZiAoIW51bWJlcikKKyAgeyBwcmludGYoIkZlaGxlcjogLTNcbiIpOyByZXR1cm4gLTM7IH0KKyAgc3NjYW5mKG51bWJlciwgIiVkIiwgbnIpOworICBpZiAoIWludHAobnIpIHx8IG5yPDAgfHwgbnI+NykKKyAgeyBwcmludGYoIkZlaGxlcjogLTRcbiIpOyByZXR1cm4gLTQ7IH0KKyAgcm9vbSA9IG9iamVjdF9uYW1lKGVudmlyb25tZW50KGVudmlyb25tZW50KHRoaXNfb2JqZWN0KCkpKSk7CisgIGFjdGl2ZSA9ICIvc2VjdXJlL3BvdGlvbm1hc3RlciItPlNldExpc3ROcihyb29tLCBucik7CisgIGlmIChhY3RpdmU+PTApCisgIHsKKyAgICBwcmludGYoIlJhdW0gYWt0aXZpZXJ0IGluIExpc3RlICVkXG4iLCBucik7CisgICAgZHVtcCgpOworICB9CisgIGVsc2UKKyAgICBwcmludGYoIkZlaGxlciBiZWltIEFrdGl2aWVyZW4sIEVyZ2VibmlzOiAlZFxuIiwgYWN0aXZlKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBhY3RpdmF0ZSgpCit7CisgIGludCBuciwgYWN0aXZlOworICBzdHJpbmcgcm9vbTsKKyAgCisgIGlmICghc2VjdXJlKCkpCisgIHsgcHJpbnRmKCJGZWhsZXI6IC0xXG4iKTsgcmV0dXJuIC0xOyB9CisgIGlmICghcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShlbnZpcm9ubWVudCgpKSkKKyAgeyBwcmludGYoIkZlaGxlcjogLTJcbiIpOyByZXR1cm4gLTI7IH0KKyAgcm9vbSA9IG9iamVjdF9uYW1lKGVudmlyb25tZW50KGVudmlyb25tZW50KHRoaXNfb2JqZWN0KCkpKSk7CisgIGFjdGl2ZSA9ICIvc2VjdXJlL3BvdGlvbm1hc3RlciItPkFjdGl2YXRlUm9vbShyb29tKTsKKyAgaWYgKGFjdGl2ZT49MCkKKyAgICB7CisgICAgICBwcmludGYoIlJhdW0gYWt0aXZpZXJ0IGluIExpc3RlICVkXG4iLCBhY3RpdmUpOworICAgICAgZHVtcCgpOworICAgIH0KKyAgZWxzZQorICAgIHByaW50ZigiRmVobGVyIGJlaW0gQWt0aXZpZXJlbiwgRXJnZWJuaXM6ICVkXG4iLCBhY3RpdmUpOworICByZXR1cm4gMTsKK30KKworaW50IGRlYWN0aXZhdGUoKQoreworICBpbnQgZGVhY3RpdmU7CisgIHN0cmluZyByb29tOworICAKKyAgaWYgKCFzZWN1cmUoKSkKKyAgeyBwcmludGYoIkZlaGxlcjogLTFcbiIpOyByZXR1cm4gLTE7IH0KKyAgaWYgKCFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKGVudmlyb25tZW50KCkpKQorICB7IHByaW50ZigiRmVobGVyOiAtMlxuIik7IHJldHVybiAtMjsgfQorICByb29tID0gb2JqZWN0X25hbWUoZW52aXJvbm1lbnQoZW52aXJvbm1lbnQodGhpc19vYmplY3QoKSkpKTsKKyAgZGVhY3RpdmUgPSAiL3NlY3VyZS9wb3Rpb25tYXN0ZXIiLT5EZWFjdGl2YXRlUm9vbShyb29tKTsKKyAgaWYgKGRlYWN0aXZlPj0wKQorICAgIHsKKyAgICAgIHByaW50ZigiUmF1bSBkZWFrdGl2aWVydCBpbiBMaXN0ZSAlZFxuIixkZWFjdGl2ZSk7CisgICAgICBkdW1wKCk7CisgICAgfQorICBlbHNlCisgICAgcHJpbnRmKCJGZWhsZXIgYmVpbSBEZWFrdGl2aWVyZW4sIEVyZ2VibmlzOiAlZFxuIiwgZGVhY3RpdmUpOworICByZXR1cm4gMTsKK30KKworaW50IGluZm8oc3RyaW5nIHBhcmEpCit7CisgIGludCBpbmZvLG5yOworICBzdHJpbmcgczsKKyAgb2JqZWN0IHJvb20sbzsKKyAgbWl4ZWQgbSwqcG90aW9uczsKKyAgaWYgKCFzZWN1cmUoKSkKKyAgeyBwcmludGYoIkZlaGxlcjogLTFcbiIpOyByZXR1cm4gLTE7IH0KKyAgaWYgKCFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKGVudmlyb25tZW50KCkpKQorICB7IHByaW50ZigiRmVobGVyOiAtMlxuIik7IHJldHVybiAtMjsgfQorICBpZiAoIXBhcmEgfHwgcGFyYT09IiIpCisgICAgeworICAgICAgcm9vbSA9IGVudmlyb25tZW50KGVudmlyb25tZW50KHRoaXNfb2JqZWN0KCkpKTsKKyAgICAgIGluZm8gPSAiL3NlY3VyZS9wb3Rpb25tYXN0ZXIiLT5IYXNQb3Rpb24ocm9vbSk7CisgICAgICBpZiAoaW5mbz49MCkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZigiUmF1bSBoYXQgWlQgbWl0IE5yOiAgJWRcblxuIixpbmZvKTsKKyAgICAgICAgICBuciA9ICIvc2VjdXJlL3BvdGlvbm1hc3RlciItPkdldExpc3RCeU51bWJlcihpbmZvKTsKKyAgICAgICAgICBpZiAobnI+PTApCisgICAgICAgICAgICBwcmludGYoIlpUIGFrdGl2IGluIExpc3RlOiAgICVkXG5cbiIsbnIpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbnIgPSAiL3NlY3VyZS9wb3Rpb25tYXN0ZXIiLT5HZXRJbmFjdExpc3RCeU51bWJlcihpbmZvKTsKKyAgICAgICAgICAgICAgaWYgKG5yPj0wKQorICAgICAgICAgICAgICAgIHByaW50ZigiWlQgSU5ha3RpdiBpbiBMaXN0ZTogJWRcblxuIixucik7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwcmludGYoIlpUIElOYWt0aXZcblxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgaWYgKGluZm8+PTAgJiYgcz1yZWFkX2ZpbGUoIi9zZWN1cmUvQVJDSC9aVC8iK2luZm8rIi56dCIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICB3cml0ZSgiVGlwOlxuIitzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBwcmludGYoIlJhdW0gaGF0IGtlaW5lbiBaVCBlaW5nZXRyYWdlbi5cbiIpOworICAgIH0KKyAgZWxzZQorICAgIGlmIChzc2NhbmYocGFyYSwiJWQiLGluZm8pPT0xKQorICAgICAgeworICAgICAgICBwcmludGYoIlpUIG1pdCBOdW1tZXI6ICVkXG5cbiIsaW5mbyk7CisgICAgICAgIG0gPSAiL3NlY3VyZS9wb3Rpb25tYXN0ZXIiLT5HZXRGaWxlbmFtZUJ5TnVtYmVyKGluZm8pOworICAgICAgICBpZiAobSE9LTEpCisgICAgICAgICAgeworICAgICAgICAgICAgd3JpdGUoIkZpbGVuYW1lOiAiK20rIlxuXG4iKTsKKyAgICAgICAgICAgIG5yID0gIi9zZWN1cmUvcG90aW9ubWFzdGVyIi0+R2V0TGlzdEJ5TnVtYmVyKGluZm8pOworICAgICAgICAgICAgaWYgKG5yPj0wKQorICAgICAgICAgICAgICBwcmludGYoIlpUIGFrdGl2IGluIExpc3RlOiAlZFxuXG4iLG5yKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5yID0gIi9zZWN1cmUvcG90aW9ubWFzdGVyIi0+R2V0SW5hY3RMaXN0QnlOdW1iZXIoaW5mbyk7CisgICAgICAgICAgICAgICAgaWYgKG5yPj0wKQorICAgICAgICAgICAgICAgICAgcHJpbnRmKCJaVCBJTmFrdGl2IGluIExpc3RlOiAlZFxuXG4iLG5yKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICBwcmludGYoIlpUIElOYWt0aXZcblxuIik7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbmZvPj0wICYmIHM9cmVhZF9maWxlKCIvc2VjdXJlL0FSQ0gvWlQvIitpbmZvKyIuenQiKSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdyaXRlKCJUaXA6XG4iK3MpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgd3JpdGUoIktlaW4gWlQgbWl0IGRpZXNlciBOdW1tZXIgYmVrYW5udC5cbiIpOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgd3JpdGUoIlNwaWVsZXIgIitjYXBpdGFsaXplKHBhcmEpKyJcblxuIik7CisgICAgICAgIGlmIChvPWZpbmRfcGxheWVyKHBhcmEpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHBvdGlvbnM9c29ydF9hcnJheShvLT5RdWVyeVByb3AoUF9QT1RJT05ST09NUyksIyc+KTsKKyAgICAgICAgICAgIGlmIChzaXplb2YocG90aW9ucykpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzPSIiOworICAgICAgICAgICAgICAgIGZvciAobnI9MDtucjxzaXplb2YocG90aW9ucyk7bnIrKykKKyAgICAgICAgICAgICAgICAgIHMrPXBvdGlvbnNbbnJdKyIsICI7CisgICAgICAgICAgICAgICAgd3JpdGUoIlBvdGlvbnJvb21zOlxuIiticmVha19zdHJpbmcoc1swLi48M10sNzgpKyJcbiIpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHdyaXRlKCJTcGllbGVyIGhhdCBrZWluZSB3ZWl0ZXJlbiBQb3Rpb25yb29tcy5cbiIpOworICAgICAgICAgICAgcG90aW9ucz1zb3J0X2FycmF5KG8tPlF1ZXJ5UHJvcChQX0tOT1dOX1BPVElPTlJPT01TKSwjJz4pOworICAgICAgICAgICAgaWYgKHNpemVvZihwb3Rpb25zKSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHM9IiI7CisgICAgICAgICAgICAgICAgZm9yIChucj0wO25yPHNpemVvZihwb3Rpb25zKTtucisrKQorICAgICAgICAgICAgICAgICAgcys9cG90aW9uc1tucl0rIiwgIjsKKyAgICAgICAgICAgICAgICB3cml0ZSgiQmVrYW5udGUgUG90aW9ucm9vbXM6XG4iKworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrX3N0cmluZyhzWzAuLjwzXSw3OCkpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHdyaXRlKCJTcGllbGVyIGhhdCBrZWluZSBiZWthbm50ZW4gUG90aW9ucm9vbXMuXG4iKTsKKyAgICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICB3cml0ZSgiS2VpbiBTcGllbGVyIG1pdCBkaWVzZW0gTmFtZW4gYW53ZXNlbmQuXG4iKTsKKyAgICAgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2ludCBkdW1wKCkKK3sKKyAgIi9zZWN1cmUvcG90aW9ubWFzdGVyIi0+RHVtcExpc3QoKTsKKyAgcHJpbnRmKCJMaXN0ZSB3dXJkZSBlcnpldWd0LlxuIik7CisgIHJldHVybiAxOworfQorCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvcHVidG9vbC5jIGIvb2JqL3Rvb2xzL3B1YnRvb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODVhZmM5Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3B1YnRvb2wuYwpAQCAtMCwwICsxLDYwIEBACisvKiBNb3JnZW5HcmF1ZW4gTXVkTGliIDogUHVidG9vbCAqLworCisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorCitpbmhlcml0ICIvc3RkL3RoaW5nIjsKKworY3JlYXRlKCkKK3sKKyAgICBpZiAoIWNsb25lcChNRSkpCisgICAgICAgIHJldHVybjsKKyAgICA6OmNyZWF0ZSgpOworCisgICAgU2V0UHJvcChQX1NIT1JULCJFaW4gUHVidG9vbCIpOworICAgIFNldFByb3AoUF9MT05HLAorICAgICJEYXMgUHVidG9vbCBiZXJlY2huZXQgZGllIG1heGltYWwgenVsYWVzc2lnZSBIZWlsdW5nIGVpbmVyIEtuZWlwZS5cbiIrCisgICJcbiIrCisgICJTeW50YXg6IHB1YnRlc3QgPFBfQUxDT0hPTD4gPFBfRFJJTks+IDxQX0ZPT0Q+IDxQX1ZBTFVFPiA8UmF0ZT4gPERlbGF5PlxuIisKKyAgIlxuIisKKyAgIldlcnRlYmVyZWljaDogICAgICA+PTAgICAgICAgICA+PTAgICAgICAgPj0wICAgICAgPj0wICAgIDEuLjIwICAgMC4uXG4iKworICAiXG4iKTsKKyAgICBTZXRQcm9wKFBfTkFNRSwiUHVidG9vbCIpOworICAgIFNldFByb3AoUF9HRU5ERVIsTkVVVEVSKTsKKyAgICBTZXRQcm9wKFBfV0VJR0hULDApOworICAgIFNldFByb3AoUF9WQUxVRSwwKTsgCisgICAgU2V0UHJvcChQX05PRFJPUCwiRGFzIFB1YnRvb2wgYmVoYWVsc3QgRHUgbGllYmVyIGJlaSBEaXIuXG4iKTsKKyAgICBTZXRQcm9wKFBfTkVWRVJEUk9QLDEpOworICAgIFNldFByb3AoUF9BVVRPTE9BRE9CSiwxKTsKKworICAgIEFkZElkKCAicHVidG9vbCIgKTsKKworICAgIEFkZENtZCggInB1YnRlc3QiLCAicHVidGVzdCIgKTsKK30KKworaW50IHB1YnRlc3Qoc3RyaW5nIGFyZykKK3sgICBpbnQgdixkLGEsZixyLGgseTsKKworICAgIG5vdGlmeV9mYWlsKAorICAiU3ludGF4OiBwdWJ0ZXN0IDxQX0FMQ09IT0w+IDxQX0RSSU5LPiA8UF9GT09EPiA8UF9WQUxVRT4gPFJhdGU+IDxEZWxheT5cbiIpOworCisgICAgaWYgKCFhcmcgfHwgIXN0cmluZ3AoYXJnKSB8fAorICAgICAgICBzc2NhbmYoYXJnLCIlZCAlZCAlZCAlZCAlZCAlZCIsYSxkLGYsdixyLHkpIT02KQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICh2PDEgfHwgZDwwIHx8IGE8MCB8fCBmPDAgfHwgcjwxIHx8IHI+MjAgfHwgeTwwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGg9Y2FsbF9vdGhlcigiL3NlY3VyZS9wdWJtYXN0ZXIiLCJDYWxjTWF4IiwKKyAgICAgICAgICAgICAgICAgKFtQX1ZBTFVFOnYsUF9BTENPSE9MOmEsUF9EUklOSzpkLFBfRk9PRDpmLAorICAgICAgICAgICAgICAgICAiZGVsYXkiOnksInJhdGUiOnJdKSwwKTsKKworICAgIHByaW50ZigiQmVyZWNobmV0ZSBNYXhpbWFsaGVpbHVuZyBmdWVyOlxuIisKKyAgICAgICAgICAgIlBfQUxDT0hPTCA9ICUzZCAgICBQX0RSSU5LICAgPSAlM2QgICAgUF9GT09EICAgID0gJTNkIFxuIisKKyAgICAgICAgICAgIlBfVkFMVUUgICA9ICUzZCAgICBSYXRlICAgICAgPSAlM2QgICAgRGVsYXkgICAgID0gJTNkIFxuIisKKyAgICAgICAgICAgIkVyZ2VibmlzOlxuIisKKyAgICAgICAgICAgIkdlc2FtdDogJTNkIChIUCtTUCksIGF1ZmdldGVpbHQgei5CLiAlM2QgSFAgdW5kICUzZCBTUC5cbiIsCisgICAgICAgICAgIGEsZCxmLHYscix5LGgsKGgvMiksKGglMj8oaC8yKSsxOihoLzIpKSk7CisgICAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9vYmovdG9vbHMvcXVlc3R0b29sLmMgYi9vYmovdG9vbHMvcXVlc3R0b29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY0ZmE3YwotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9xdWVzdHRvb2wuYwpAQCAtMCwwICsxLDc1NCBAQAorLyoKKyAqICBUaGUgbmV3IHVsdGltYXRlIHF1ZXN0IGFkbWluaXN0cmF0aW9uIHRvb2wKKyAqLworCisvKiBBRU5ERVJVTkdFTgorICogMjAwNi0wOS0yOSA6IFpvb2sKKyAqICAgICAgICAgICAgICBRdWVzdHRvb2wgYW4gbmV1ZSBGZWxkZXIgIkF0dHJpYnV0ZSIgdW5kICJLbGFzc2UiCisgKiAgICAgICAgICAgICAgYW5nZXBhc3N0LgorICogMjAwMC0xMS0xOCA6IFpvb2s6CisgKgkJUXVlc3R0b29sIHVtIG5ldWVzIEZlbGQgIldhcnRlbmRlciBNYWdpZXIiIGRlcyBRdWVzdG1hc3RlcgorICoJCWVyd2VpdGVydC4KKyAqIDIwMDAtMTEtMTggOiBab29rOgorICoJCVF1ZXN0dG9vbCB1bSBuZXVlcyBGZWxkICJHcnVwcGVuZWlub3JkbnVuZyIgZGVzIFF1ZXN0bWFzdGVyCisgKgkJZXJ3ZWl0ZXJ0LgorICovCisKK2luaGVyaXQgInN0ZC90aGluZyI7Citpbmhlcml0ICJzdGQvbW9yZSI7CisKKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSAiL3NlY3VyZS9xdWVzdG1hc3Rlci5oIgorCisjZGVmaW5lIFVBIHRoaXNfaW50ZXJhY3RpdmUoKS0+X3VucGFyc2VkX2FyZ3MoKQorCisjZGVmaW5lIFFOQU1FCTAKKyNkZWZpbmUgUVAJMQorI2RlZmluZSBYUAkyCisjZGVmaW5lIEFMTE9XCTMKKyNkZWZpbmUgSU5GTwk0CisjZGVmaW5lIExFVkVMCTUKKyNkZWZpbmUgQ0xBU1MJNgorI2RlZmluZSBBVFRSCTcKKyNkZWZpbmUgV0laCTgKKyNkZWZpbmUgU0NORFdJWiA5CisjZGVmaW5lIEVORCAgICAxMAorCisjcHJhZ21hIHN0cm9uZ190eXBlcworCitwcml2YXRlIHZvaWQgTG9hZF9OdW1LZXkoKTsKK2ludCAgQWRkX1F1ZXN0CSAgICAgKCBzdHJpbmcgc3RyICk7Cit2b2lkIFJlYWROZXdRdWVzdCAgICAoIHN0cmluZyBzdHIgKTsKK2ludCAgUmVtb3ZlX1F1ZXN0ICAgICggc3RyaW5nIHN0ciApOworaW50ICBDaGFuZ2VfUXVlc3QgICAgKCBzdHJpbmcgc3RyICk7CitpbnQgIFJlc3RvcmVfUXVlc3QgICAoIHN0cmluZyBzdHIgKTsKK2ludCAgU2V0X1F1ZXN0CSAgICAgKCBzdHJpbmcgc3RyICk7CitpbnQgIFJlbW92ZV9RdWVzdCAgICAoIHN0cmluZyBzdHIgKTsKK2ludCAgUXVlcnlfUXVlc3QgICAgICggc3RyaW5nIHN0ciApOworaW50ICBRdWVyeV9LZXlzICAgICAgKCBzdHJpbmcgc3RyICk7CitpbnQgIFF1ZXJ5X1F1ZXN0cyAgICAoIHN0cmluZyBzdHIgKTsKK2ludCAgQWN0aXZhdGVRdWVzdCAgICggc3RyaW5nIHN0ciApOworaW50ICBEZWFjdGl2YXRlUXVlc3QgKCBzdHJpbmcgc3RyICk7CitpbnQgIEdldFJldHVybgkgICAgICggc3RyaW5nIHN0ciApOworCitzdHJpbmcgbmFtZTsKK2ludCAgICBxcDsKK2ludCAgICB4cDsKK2ludCAgICBsZXZlbDsKK2ludCAgICBuZWVkOworc3RyaW5nICphbGxvd2VkOworc3RyaW5nIGluZm87CitzdHJpbmcgd2l6YXJkOworc3RyaW5nIHNjbmR3aXphcmQ7CitpbnQgICAgZ3JvdXA7CittYXBwaW5nIG51bV9rZXk7CisKK29iamVjdCBvd25lcjsKK2ludCAgICBjb3VudGVyOworbWl4ZWQgICpzYXZlcXVlc3Q7CitzdHJpbmcgc2F2ZWtleTsKK2ludCAgICBkb19jaGFuZ2U7CitzdHJpbmcgY2hhbmdla2V5OworCit2b2lkIGNyZWF0ZSgpCit7CisgIHN0cmluZyBzdHI7CisKKyAgaWYoSVNfQkxVRShNRSkpIHJldHVybjsKKyAgdGhpbmc6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfR0VOREVSLE5FVVRFUik7CisgIG93bmVyID0gUEw7CisgIEFkZElkKCJxdWVzdHRvb2wiKTsKKyAgQWRkSWQoInF0Iik7CisgIFNldFByb3AoUF9BUlRJQ0xFLDApOworICBTZXRQcm9wKFBfR0VOREVSLCBORVVURVIpOworICBzdHI9Y2FwaXRhbGl6ZSgoKHN0cj1vd25lci0+cXVlcnlfcmVhbF9uYW1lKCkpWzwxXT09J3MnfHxzdHJbPDFdPT0neCd8fHN0cls8MV09PSd6Jyk/c3RyKz0iJyI6c3RyKz0icyIpOworICBTZXRQcm9wKFBfTkFNRSwgc3RyKyIgUXVlc3RUb29sIik7CisgIFNldFByb3AoUF9TSE9SVCwgc3RyKyIgUXVlc3RUb29sIik7CisgIFNldFByb3AoUF9MT05HLAorICAgIkRhcyBRdWVzdFRvb2wgZGllbnQgZGVyIEFkbWluaXN0cmF0aW9uIHZvbiBRdWVzdHMuIChieSBLaXJrLCAxMC4xMS45NClcbiIKKyAgKyJpbXBsZW1lbnRpZXJ0ZSBLb21tYW5kb3M6XG4iCisgICsiICBBZGRRCQkJICAgIDogTmV1ZW4gUXVlc3RlaW50cmFnIGVpbmZ1ZWdlblxuIgorICArIiAgUmVtb3ZlUQkgIDxxdWVzdD4JICAgIDogUXVlc3RlaW50cmFnIGxvZXNjaGVuXG4iCisgICsiICBDaGFuZ2VRCSAgPHF1ZXN0PgkgICAgOiBRdWVzdGVpbnRyYWcgYWVuZGVyblxuIgorICArIiAgUmVTdG9yZVEJCQkgICAgOiBadWxldHp0IGdlbG9lc2NodGVuIG9kZXIgZ2VhZW5kZXJ0ZW5cbiIKKyAgKyIJCQkJICAgIDogUXVlc3RlaW50cmFnIHJlc3RhdXJpZXJlblxuIgorICArIiAgU2V0UQkgIDxzcGllbGVyPiA8cXVlc3Q+IDogUXVlc3QgYWxzICdnZWxvZXN0JyBtYXJraWVyZW5cbiIKKyAgKyIgIERlbFEJICA8c3BpZWxlcj4gPHF1ZXN0PiA6IFF1ZXN0IGFscyAnbmljaHQgZ2Vsb2VzdCcgbWFya2llcmVuXG4iCisgICsiICBRdWVyeVEJICA8cXVlc3Q+CSAgICA6IFF1ZXN0ZWludHJhZyBhbnplaWdlblxuIgorICArIiAgUXVlcnlLCQkJICAgIDogQWxsZSBLZXlzIHVuZCBJbmRpY2VzIGFuemVpZ2VuXG4iCisgICsiICBRdWVyeUFsbFEgCQkgICAgOiBBbGxlIEVpbnRyYWVnZSB2b2xsc3RhZW5kaWcgYW56ZWlnZW5cbiIKKyAgKyIgIEFjdGlWYXRlUSAgIDxxdWVzdD4JICAgIDogUXVlc3QgaW0gUXVlc3RtYXN0ZXIgYWt0aXZpZXJlblxuIgorICArIiAgRGVhY3RpVmF0ZVEgPHF1ZXN0PgkgICAgOiBRdWVzdCBpbSBRdWVzdG1hc3RlciBkZWFrdGl2aWVyZW5cblxuIgorICArIiAgZnVlciA8cXVlc3Q+IGthbm4gZGVyIEluZGV4IHZlcndlbmRldCB3ZXJkZW4sIGRlbiBRdWVyeUsgbGllZmVydCFcblxuIgorICArIiAgKEFsbGUgS29tbWFuZG9zIGtvZW5uZW4gYWJnZWt1ZXJ6dCB3ZXJkZW4uKVxuIgorCSsiICAgLT4gQmVpc3BpZWw6IERlYWN0aVZhdGVRID09IERWUSA9PSBkdnEgPT0gZGVhY3RpdmF0ZXFcbiIpOworCisgIFNldFByb3AoUF9ORVZFUkRST1AsIDEpOworICBTZXRQcm9wKFBfTk9EUk9QLCAKKyAgIk1pdCBIaWxmZSBkZXMgUXVlc3RUb29scyBrb2VubmVuIFF1ZXN0cyBlaW5nZXRyYWdlbiwgb2RlciBnZWxvZXNjaHRcbiIrCisgICJ3ZXJkZW4uIER1IGJyYXVjaHN0IGVzIHZpZWxsZWljaHQgbm9jaCwgZGVzaGFsYiB3aXJmc3QgRHUgZXMgbmljaHQgd2VnLlxuIik7CisgIFNldFByb3AoUF9OT0JVWSwgMSk7CisgIEFkZENtZCgoeyAiQWRkUSIsICJhZGRxIiwgIkFRIiwgImFxIiB9KSwJCSAgICJBZGRfUXVlc3QiKTsKKyAgQWRkQ21kKCh7ICJSZW1vdmVRIiwgInJlbW92ZXEiLCAiUlEiLCAicnEiIH0pLAkgICAiUmVtb3ZlX1F1ZXN0Iik7CisgIEFkZENtZCgoeyAiQ2hhbmdlUSIsICJjaGFuZ2VxIiwgIkNRIiwgImNxIiB9KSwJICAgIkNoYW5nZV9RdWVzdCIpOworICBBZGRDbWQoKHsgIlJlU3RvcmVRIiwgInJlc3RvcmVxIiwgIlJTUSIsICJyc3EiIH0pLAkgICAiUmVzdG9yZV9RdWVzdCIpOworICBBZGRDbWQoKHsgIlNldFEiLCAic2V0cSIsICJTUSIsICJzcSIgfSksCQkgICAiU2V0X1F1ZXN0Iik7CisgIEFkZENtZCgoeyAiRGVsUSIsICJkZWxxIiwgIkRRIiwgImRxIiB9KSwJCSAgICJEZWxfUXVlc3QiKTsKKyAgQWRkQ21kKCh7ICJRdWVyeVEiLCAicXVlcnlxIiwgIlFRIiwgInFxIiB9KSwJCSAgICJRdWVyeV9RdWVzdCIpOworICBBZGRDbWQoKHsgIlF1ZXJ5SyIsICJxdWVyeWsiLCAiUUsiLCAicWsiIH0pLAkJICAgIlF1ZXJ5X0tleXMiKTsKKyAgQWRkQ21kKCh7ICJRdWVyeUFsbFEiLCAicXVlcnlhbGxxIiwgIlFBUSIsICJxYXEiIH0pLAkgICAiUXVlcnlfUXVlc3RzIik7CisgIEFkZENtZCgoeyAiQWN0aVZhdGVRIiwgImFjdGl2YXRlcSIsICJBVlEiLCAiYXZxIiB9KSwJICAgIkFjdGl2YXRlUXVlc3QiKTsKKyAgQWRkQ21kKCh7ICJEZWFjdGlWYXRlUSIsICJkZWFjdGl2YXRlcSIsICJEVlEiLCAiZHZxIiB9KSwgIkRlYWN0aXZhdGVRdWVzdCIpOworICBjb3VudGVyID0gUU5BTUU7CisgIHNhdmVrZXkgPSAiIjsKKyAgZG9fY2hhbmdlID0gMDsKKyAgbnVtX2tleSA9IChbXSk7Cit9CisKK2ludCBfcXVlcnlfYXV0b2xvYWRvYmooKSB7IHJldHVybiAxOyB9CisKK3ZvaWQgaW5pdCgpCit7CisgIG9iamVjdCB0cDsKKworICBpZighKHRwID0gUEwpIHx8IHRwICE9IGVudmlyb25tZW50KCkpCisgICAgcmV0dXJuOworCisgIHRoaW5nOjppbml0KCk7CisKKyAgaWYgKCAhSVNfV0laQVJEKHRwKSB8fCB0cCAhPSBvd25lciApCisgICAgcmV0dXJuIGNhbGxfb3V0KCJkb19yZW1vdmUiLDEpOworfQorCitzdGF0aWMgdm9pZCBkb19yZW1vdmUoKQoreworICB3cml0ZSAoIE1FLT5RdWVyeVByb3AoUF9TSE9SVCkrIiB6ZXJmYWVsbHQgenUgU3RhdWIuXG4iKTsKKyAgc2F5ICggTUUtPlF1ZXJ5UHJvcChQX1NIT1JUKSsiIHplcmZhZWxsdCBpbiAiK1BMLT5uYW1lKFdFU1NFTikrCisgICAgICAgIiB1bmJlZnVndGVuIEhhZW5kZW4genUgU3RhdWIuXG4iKTsKKyAgY2FsbF9vdXQoInJlbW92ZSIsMSk7Cit9CisKK3ByaXZhdGUgdm9pZCBMb2FkX051bUtleSgpCit7CisgIHN0cmluZyAqa2V5czsKKyAgaW50IGk7CisKKyAgaWYgKCAhKGtleXMgPSAoc3RyaW5nKikgUU0tPlF1ZXJ5QWxsS2V5cygpKSApIHJldHVybjsKKyAga2V5cz1zb3J0X2FycmF5KGtleXMsIyc+KTsvLycpCisgIGZvciAoIGkgPSAwLCBudW1fa2V5ID0gKFtdKTsgaSA8IHNpemVvZihrZXlzKTsgaSsrICkKKyAgICBudW1fa2V5ICs9IChbKGkrMSkrIiI6a2V5c1tpXV0pOworfQorCitpbnQgQWRkX1F1ZXN0KHN0cmluZyBzdHIpCit7CisgIGNvdW50ZXIgPSBRTkFNRTsKKyAgd3JpdGUgKCAiTmV1ZSBRdWVzdDogKEFiYnJ1Y2ggbWl0ICcuJyBvZGVyICd+cScpXG4iICk7CisgIHdyaXRlICggIktleSA6XG4iICk7IAorICBpbnB1dF90byAoICJSZWFkTmV3UXVlc3QiICk7CisgIHJldHVybiAxOworfQorCit2b2lkIFJlYWROZXdRdWVzdCAoc3RyaW5nIHN0cikKK3sKKyAgbWl4ZWQgKm9sZHF1ZXN0OworICBpbnQgZXJyc3RhdDsKKyAgaW50IGFjdGl2ZTsKKworICBpZiAoIHN0ciA9PSAifnEiIHx8IHN0ciA9PSAiLiIgKQorICB7CisgICAgY291bnRlciA9IFFOQU1FOworICAgIGlmKGRvX2NoYW5nZSkKKyAgICB7CisgICAgICBkb19jaGFuZ2UgPSAwOworICAgICAgY2hhbmdla2V5ID0gIiI7CisgICAgICBzYXZla2V5ID0gIiI7CisgICAgICBzYXZlcXVlc3QgPSAoe30pOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKworICBzd2l0Y2ggKCBjb3VudGVyICkKKyAgeworICAgIGNhc2UgUU5BTUU6CisgICAgICBpZigoIXN0cnx8IXNpemVvZihzdHIpKSAmJiBkb19jaGFuZ2UpCisJbmFtZSA9IHNhdmVrZXk7CisgICAgICBlbHNlCisJbmFtZSA9IHN0cjsKKyAgICAgIGNvdW50ZXIrKzsKKyAgICAgIHdyaXRlICggc3ByaW50ZigiUHVua3RlICg+MCkgWyVkXTpcbiIsCisJCSAgICAgIChkb19jaGFuZ2U/KGludClzYXZlcXVlc3RbMF06MTApKSApOyAKKyAgICAgIGlucHV0X3RvICggIlJlYWROZXdRdWVzdCIgKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUVA6CisgICAgICBpZigoIXN0cnx8IXNpemVvZihzdHIpKSkKKwlpZihkb19jaGFuZ2UpCisJICBxcCA9IChpbnQpIHNhdmVxdWVzdFtRX1FQXTsKKwllbHNlCisJICBxcCA9IDEwOworICAgICAgZWxzZQorCXNzY2FuZiAoIHN0ciwgIiVkIiwgcXAgKTsKKyAgICAgIGNvdW50ZXIrKzsKKyAgICAgIHdyaXRlICggc3ByaW50ZigiRXJmYWhydW5nICg+PTApIFslZF06XG4iLAorCQkgICAgICAoZG9fY2hhbmdlPyhpbnQpc2F2ZXF1ZXN0WzFdOnFwKjEwMDApKSk7CisgICAgICBpbnB1dF90byAoICJSZWFkTmV3UXVlc3QiICk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhQOiAKKyAgICAgIGlmKCghc3RyfHwhc2l6ZW9mKHN0cikpKQorCWlmKGRvX2NoYW5nZSkKKwkgIHhwID0gKGludCkgc2F2ZXF1ZXN0W1FfWFBdOworCWVsc2UKKwkgIHhwID0gcXAgKiAxMDAwOworICAgICAgZWxzZQorCXNzY2FuZiAoIHN0ciwgIiVkIiwgeHAgKTsKKyAgICAgIGNvdW50ZXIrKzsKKyAgICAgIHdyaXRlICggc3ByaW50ZigiRmlsZW5hbWVuIGZpbGUxWyxmaWxlMiwuLi5dKSAlczpcbiIsCisJCSAgICAgIChkb19jaGFuZ2U/IlsiK2ltcGxvZGUoKHN0cmluZyAqKXNhdmVxdWVzdFsyXSwiLCIpKyJdIjoKKwkJICAgICAgICIiKSkgKTsKKyAgICAgIGlucHV0X3RvICggIlJlYWROZXdRdWVzdCIgKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQUxMT1c6CisgICAgICBpZigoIXN0cnx8IXNpemVvZihzdHIpKSAmJiBkb19jaGFuZ2UpCisJYWxsb3dlZCA9IChzdHJpbmcgKikgc2F2ZXF1ZXN0W1FfQUxMT1dFRF07CisgICAgICBlbHNlCisJYWxsb3dlZCA9IG9sZF9leHBsb2RlKGltcGxvZGUob2xkX2V4cGxvZGUoc3RyLCIuYyIpLCIiKSwiLCIpOworICAgICAgY291bnRlcisrOworICAgICAgd3JpdGUgKCBzcHJpbnRmKCJJbmZvICVzOlxuIiwgKGRvX2NoYW5nZT8KKwkJCQkgICAgICJbIiticmVha19zdHJpbmcoIlxiXGJcYlxiXGJcYiIrKHN0cmluZykKKwkJCQkJCSAgICAgIHNhdmVxdWVzdFszXSsiXSIsNzgsNikKKwkJCQkgICAgIDoiIikpICk7IAorICAgICAgaW5wdXRfdG8gKCAiUmVhZE5ld1F1ZXN0IiApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJTkZPOgorICAgICAgaWYoKCFzdHJ8fCFzaXplb2Yoc3RyKSkgJiYgZG9fY2hhbmdlKQorCWluZm8gPSAoc3RyaW5nKSBzYXZlcXVlc3RbUV9ISU5UXTsKKyAgICAgIGVsc2UKKwlpbmZvID0gc3RyOworICAgICAgY291bnRlcisrOworICAgICAgd3JpdGUgKCBzcHJpbnRmKCJTdHVmZSAoLTEgPD1sZXY8PTEwKSAoLTEgaXN0IGVpbmUgU2VoZXJxdWVzdCkgWyVkXTpcbiIsCisJCSAgICAgIChkb19jaGFuZ2U/KGludClzYXZlcXVlc3RbNF06MCkpICk7CisgICAgICBpbnB1dF90byAoICJSZWFkTmV3UXVlc3QiICk7CisgICAgICBicmVhazsKKyAgICBjYXNlIExFVkVMOgorICAgICAgaWYoKCFzdHJ8fCFzaXplb2Yoc3RyKSkpCisJaWYoZG9fY2hhbmdlKQorCSAgbGV2ZWwgPSAoaW50KSBzYXZlcXVlc3RbUV9ESUZGXTsKKwllbHNlCisJICBsZXZlbCA9IDA7CisJc3NjYW5mICggc3RyLCAiJWQiLCBsZXZlbCApOworICAgICAgY291bnRlcisrOworICAgICAgd3JpdGUgKCBzcHJpbnRmKCJLbGFzc2UgKFswMTIzNDVdKSBbJWRdOlxuIiwKKwkJICAgICAgKGRvX2NoYW5nZT8oaW50KXNhdmVxdWVzdFs1XTowKSkgKTsgCisgICAgICBpbnB1dF90byAoICJSZWFkTmV3UXVlc3QiICk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENMQVNTOgorICAgICAgaWYoKCFzdHJ8fCFzaXplb2Yoc3RyKSkpCisJaWYoZG9fY2hhbmdlKQorCSAgbmVlZCA9IChpbnQpIHNhdmVxdWVzdFtRX0NMQVNTXTsKKwllbHNlCisJICBuZWVkID0gMDsKKyAgICAgIGVsc2UKKwlzc2NhbmYgKCBzdHIsICIlZCIsIG5lZWQgKTsKKyAgICAgIGNvdW50ZXIrKzsKKyAgICAgIHdyaXRlICggc3ByaW50ZigiQXR0cmlidXQgWzAxMjM0XVxuKDE9ZmxlaXNzaWcsMj1oZXJvaXNjaCwzPWVwaXNjaCw0PWxlZ2VuZGFlcikgJXM6XG4iLAorCQkgICAgICAoZG9fY2hhbmdlPyJbIisoc3RyaW5nKXNhdmVxdWVzdFs5XSsiXSI6IiIpKSApOworICAgICAgaW5wdXRfdG8gKCAiUmVhZE5ld1F1ZXN0IiApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBVFRSOgorICAgICAgaWYgKCghc3RyfHwhc2l6ZW9mKHN0cikpKQorCWlmIChkb19jaGFuZ2UpCisJICBncm91cCA9IChpbnQpIHNhdmVxdWVzdFtRX0FUVFJdOworCWVsc2UKKwkgIGdyb3VwID0gMDsKKyAgICAgIGVsc2UKKwlzc2NhbmYgKHN0ciwgIiVkIiwgZ3JvdXApOworICAgICAgY291bnRlcisrOworICAgICAgd3JpdGUgKCBzcHJpbnRmKCJNYWdpZXIgJXM6XG4iLAorCQkgICAgICAoZG9fY2hhbmdlPyJbIisoc3RyaW5nKXNhdmVxdWVzdFs3XSsiXSI6IiIpKSApOworICAgICAgaW5wdXRfdG8gKCAiUmVhZE5ld1F1ZXN0IiApOworICAgIGJyZWFrOwkKKyAgICBjYXNlIFdJWjoKKyAgICAgIGlmKCghc3RyfHwhc2l6ZW9mKHN0cikpICYmIGRvX2NoYW5nZSkKKwl3aXphcmQgPSAoc3RyaW5nKSBzYXZlcXVlc3RbUV9XSVpdOworICAgICAgZWxzZQorCXdpemFyZCA9IHN0cjsKKyAgICAgIHdpemFyZCA9IGxvd2VyX2Nhc2Uod2l6YXJkKTsKKyAgICAgIGNvdW50ZXIrKzsKKyAgICAgIHdyaXRlICggc3ByaW50ZigiV2FydGVuZGVyIE1hZ2llciAlczpcbiIsCisJCSAgICAgIChkb19jaGFuZ2U/IlsiKyhzdHJpbmcpc2F2ZXF1ZXN0WzhdKyJdIjoiIikpICk7CisgICAgICBpbnB1dF90byAoICJSZWFkTmV3UXVlc3QiICk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNDTkRXSVo6CisgICAgICBpZiAoKCFzdHJ8fCFzaXplb2Yoc3RyKSkgJiYgZG9fY2hhbmdlKQorCXNjbmR3aXphcmQgPSAoc3RyaW5nKSBzYXZlcXVlc3RbUV9TQ05EV0laXTsKKyAgICAgIGVsc2UKKwlzY25kd2l6YXJkID0gc3RyOworICAgICAgc2NuZHdpemFyZCA9IGxvd2VyX2Nhc2Uoc2NuZHdpemFyZCk7CisgICAgICBjb3VudGVyKys7CisgICAgICB3cml0ZSAoICJFaW50cmFnZW4gKGovbik/XG4iICk7CisgICAgICBpbnB1dF90byAoICJSZWFkTmV3UXVlc3QiICk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEVORDoKKyAgICAgIGNvdW50ZXI9UU5BTUU7CisKKyAgICAgIGlmICggc3RyICE9ICJqIiAmJiBzdHIgIT0gImphIiAmJiBzdHIgIT0gInkiICYmIHN0ciAhPSAieWVzIiApCisJcmV0dXJuOworCisgICAgICBhY3RpdmUgPSAwOworICAgICAgaWYgKCBkb19jaGFuZ2UgJiYgY2hhbmdla2V5ICYmIHNpemVvZihjaGFuZ2VrZXkpICkKKyAgICAgIHsKKwlvbGRxdWVzdCA9IChtaXhlZCAqKSBRTS0+UXVlcnlRdWVzdCAoIGNoYW5nZWtleSApOworCisJaWYgKCAhcG9pbnRlcnAgKCBvbGRxdWVzdCApIHx8ICFzaXplb2YgKCBvbGRxdWVzdCApICkKKwl7CisJICB3cml0ZSAoICJBbHRlbiBFaW50cmFnIG5pY2h0IGdlZnVuZGVuLlxuIiApOworCSAgcmV0dXJuOworCX0KKworCWVycnN0YXQgPSAoaW50KSBRTS0+UmVtb3ZlUXVlc3QoIGNoYW5nZWtleSApOworCisJZG9fY2hhbmdlID0gMDsKKwljaGFuZ2VrZXkgPSAiIjsKKworCXN3aXRjaCAoIGVycnN0YXQgKQorCXsKKwkgIGNhc2UJMDogd3JpdGUgKCAiWnVncmlmZiBhdWYgYWx0ZW4gRWludHJhZyB2ZXJ3ZWlnZXJ0LlxuIiApOyByZXR1cm47CisJICBjYXNlIC0xOiB3cml0ZSAoICJQYXJhbWV0ZXJmZWhsZXIgYmVpbSBMb2VzY2hlbi5cbiIgKTsgcmV0dXJuOworCSAgY2FzZSAtMjogd3JpdGUgKCAiQWx0ZW4gRWludHJhZyBuaWNodCBnZWZ1bmRlbi5cbiIgKTsgcmV0dXJuOworCSAgZGVmYXVsdDogd3JpdGUgKCAiQWx0ZXIgRWludHJhZyBnZWxvZXNjaHQuXG4iICk7CisJfQorCWFjdGl2ZSA9IG9sZHF1ZXN0WzZdOworCXNhdmVxdWVzdCA9IG9sZHF1ZXN0OworCXNhdmVrZXkgICA9IGNoYW5nZWtleTsKKyAgICAgIH0KKworICAgICAgLy8gYWRkIG5ldyBRdWVzdCBkZWFjdGl2YXRlZCBieSBkZWZhdWx0IGFuZCBrZWVwIG9sZCBhY3RpdmUgZmxhZworICAgICAgLy8gaWYgY2hhbmdpbmcgYW4gZXhpc3RpbmcgZW50cnkKKyAgICAgIGVycnN0YXQ9IChpbnQpUU0tPkFkZFF1ZXN0KG5hbWUscXAseHAsYWxsb3dlZCxpbmZvLGxldmVsLG5lZWQsYWN0aXZlLAorCQkJCSB3aXphcmQsIHNjbmR3aXphcmQsIGdyb3VwKTsKKworICAgICAgc3dpdGNoICggZXJyc3RhdCApCisgICAgICB7CisJY2FzZSAgMDogd3JpdGUgKCAiWnVncmlmZiB2ZXJ3ZWlnZXJ0LlxuIiApOyBicmVhazsKKwljYXNlIC0xOiB3cml0ZSAoICJLZXkgdW5ndWVsdGlnIG9kZXIgc2l6ZW9mKGtleSkgPCA1LlxuIiApOyBicmVhazsKKwljYXNlIC0yOiB3cml0ZSAoICJRUCB1bmd1ZWx0aWcgb2RlciA8IDEuXG4iICk7IGJyZWFrOworCWNhc2UgLTM6IHdyaXRlICggIlhQIHVuZ3VlbHRpZy5cbiIgKTsgYnJlYWs7CisJY2FzZSAtNDogd3JpdGUgKCAiRmlsZW5hbWUobikgdW5ndWVsdGlnLlxuIiApOyBicmVhazsKKwljYXNlIC01OiB3cml0ZSAoICJJbmZvIHVuZ3VlbHRpZy5cbiIgKTsgYnJlYWs7CisJY2FzZSAtNjogd3JpdGUgKCAiU3R1ZmUgdW5ndWVsdGlnIG9kZXIgPCAwIG9kZXIgPiAyMC5cbiIgKTsgYnJlYWs7CisJY2FzZSAtNzogd3JpdGUgKCAiQWt0aXYtRmxhZyA8IDAgb2RlciA+IDEuXG4iICk7IGJyZWFrOworCWNhc2UgLTg6IHdyaXRlICggIk1hZ2llcm5hbWUgdW5ndWVsdGlnLlxuIiApOyBicmVhazsKKwljYXNlIC05OiB3cml0ZSAoICJNYWdpZXJuYW1lIGRlcyB3YXJ0ZW5kZW4gTWFnaWVycyB1bmd1ZWx0aWcuXG4iKTsgYnJlYWs7CisJY2FzZSAtMTA6IHdyaXRlICgiRmFsc2NoZSBHcnVwcGVuZWlub3JkbnVuZy5cbiIpOyBicmVhazsKKwlkZWZhdWx0OiB3cml0ZSAoICJFaW50cmFnIGVpbmdlZnVlZ3QuXG4iICk7CisgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybjsKKyAgfQorfQorCitpbnQgUmVtb3ZlX1F1ZXN0ICggc3RyaW5nIHN0ciApCit7CisgIG1peGVkICpvbGRxdWVzdDsKKyAgc3RyaW5nIG5ld3N0cjsKKyAgaW50IGVycnN0YXQ7CisKKyAgaWYgKCAhKHN0cj1VQSkgKQorICB7CisgICAgd3JpdGUgKCAiU3ludGF4OiBSZW1vdmVRIDxuYW1lPlxuIiApOworICAgIHJldHVybiAxOworICB9CisKKyAgTG9hZF9OdW1LZXkoKTsKKworICBpZiAoICEobmV3c3RyID0gbnVtX2tleVtzdHIrIiJdKSApCisgICAgbmV3c3RyID0gc3RyOworCisgIG9sZHF1ZXN0ID0gKG1peGVkICopIFFNLT5RdWVyeVF1ZXN0ICggbmV3c3RyICk7CisKKyAgaWYgKCAhcG9pbnRlcnAgKCBvbGRxdWVzdCApIHx8ICFzaXplb2YgKCBvbGRxdWVzdCApICkKKyAgeworICAgIHdyaXRlICggIktlaW5lIFF1ZXN0IGRpZXNlcyBOYW1lbnMgZ2VmdW5kZW4uXG4iICk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBlcnJzdGF0ID0gKGludCkgUU0tPlJlbW92ZVF1ZXN0KCBuZXdzdHIgKTsKKworICBzd2l0Y2ggKCBlcnJzdGF0ICkKKyAgeworICAgIGNhc2UgIDA6IHdyaXRlICggIlp1Z3JpZmYgdmVyd2VpZ2VydC5cbiIgKTsgYnJlYWs7CisgICAgY2FzZSAtMTogd3JpdGUgKCAiUGFyYW1ldGVyZmVobGVyLlxuIiApOyBicmVhazsKKyAgICBjYXNlIC0yOiB3cml0ZSAoICJRdWVzdCBuaWNodCBnZWZ1bmRlbi5cbiIgKTsgYnJlYWs7CisgICAgZGVmYXVsdDogd3JpdGUgKCAiUXVlc3QgZW50ZmVybnQuXG4iICk7CisgIH0KKworICBzYXZlcXVlc3QgPSBvbGRxdWVzdDsKKyAgc2F2ZWtleSAgID0gbmV3c3RyOworCisgIHJldHVybiAxOworfQorCitpbnQgQ2hhbmdlX1F1ZXN0ICggc3RyaW5nIHN0ciApCit7CisgIG1peGVkICpvbGRxdWVzdDsKKyAgc3RyaW5nIG5ld3N0cjsKKworICBpZiAoICEoc3RyPVVBKSApCisgIHsKKyAgICB3cml0ZSAoICJTeW50YXg6IENoYW5nZVEgPHF1ZXN0PlxuIiApOworICAgIHJldHVybiAxOworICB9CisKKyAgTG9hZF9OdW1LZXkoKTsKKworICBpZiAoICEobmV3c3RyID0gbnVtX2tleVtzdHIrIiJdKSApCisgICAgbmV3c3RyID0gc3RyOworCisgIG9sZHF1ZXN0ID0gKG1peGVkICopIFFNLT5RdWVyeVF1ZXN0ICggbmV3c3RyICk7CisKKyAgaWYgKCAhcG9pbnRlcnAoIG9sZHF1ZXN0ICkgfHwgIXNpemVvZiAoIG9sZHF1ZXN0ICkgKQorICB7CisgICAgd3JpdGUgKCAiS2VpbmUgUXVlc3QgZGllc2VzIE5hbWVucyBnZWZ1bmRlbi5cbiIgKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGRvX2NoYW5nZSA9IDE7CisgIGNoYW5nZWtleSA9IG5ld3N0cjsKKyAgc2F2ZWtleSA9IG5ld3N0cjsKKyAgc2F2ZXF1ZXN0ID0gb2xkcXVlc3Q7CisKKyAgd3JpdGUgKCAiQWt0dWVsbGVyIEVpbnRyYWc6XG4iKTsKKyAgd3JpdGUgKCAiS2V5ICAgICAgICAgICAgICA6ICIrbmV3c3RyKyJcbiIgKTsKKyAgd3JpdGUgKCAiUHVua3RlICAgICAgICAgICA6ICIrb2xkcXVlc3RbUV9RUF0rIlxuIiApOworICB3cml0ZSAoICJFcmZhaHJ1bmcgICAgICAgIDogIitvbGRxdWVzdFtRX1hQXSsiXG4iICk7CisgIHdyaXRlICggIkZpbGVuYW1lbiAgICAgICAgOiAiK2ltcGxvZGUob2xkcXVlc3RbUV9BTExPV0VEXSwiLCIpKyJcbiIgKTsKKyAgd3JpdGUgKCAiSW5mbyAgICAgICAgICAgICA6ICIrb2xkcXVlc3RbUV9ISU5UXSsiXG4iICk7CisgIHdyaXRlICggIlN0dWZlICAgICAgICAgICAgOiAiK29sZHF1ZXN0W1FfRElGRl0rIlxuIiApOworICB3cml0ZSAoICJLbGFzc2UgICAgICAgICAgIDogIitRQ0xBU1NfU1RBUlMob2xkcXVlc3RbUV9DTEFTU10pKyJcbiIgKTsKKyAgd3JpdGUgKCAiQXR0cmlidXQgICAgICAgICA6ICIrUUFUVFJfU1RSSU5HU1tvbGRxdWVzdFtRX0FUVFJdXSsiXG4iICk7CisgIHdyaXRlICggIk1hZ2llciAgICAgICAgICAgOiAiK2NhcGl0YWxpemUob2xkcXVlc3RbUV9XSVpdKSsiXG4iICk7CisgIHdyaXRlICggIldhcnRlbmRlciBNYWdpZXIgOiAiK2NhcGl0YWxpemUob2xkcXVlc3RbUV9TQ05EV0laXSkrIlxuIiApOworCisKKyAgd3JpdGUgKCAiXG5OZXVlIFF1ZXN0OiAgICAgKG1pdCAnLicgb2RlciAnfnEnIGthbm4gYWJnZWJyb2NoZW4gd2VyZGVuKVxuIiApOworICB3cml0ZSAoIHNwcmludGYoIktleSBbJXNdOlxuIiwgc2F2ZWtleSkgKTsKKyAgaW5wdXRfdG8gKCAiUmVhZE5ld1F1ZXN0IiApOworCisgIHJldHVybiAxOworfQorCitpbnQgUmVzdG9yZV9RdWVzdCAoIHN0cmluZyBzdHIgKQoreworICBpbnQgZXJyc3RhdDsKKworICBpZiAoICFzYXZla2V5IHx8ICFzaXplb2Yoc2F2ZWtleSkgKQorICB7CisgICAgd3JpdGUgKCAiXG5UdXQgbWlyIGxlaWQhXG4iICk7CisgICAgd3JpdGUgKCAiTmljaHRzIHp1bSBSZXN0YXVyaWVyZW4gZ2VmdW5kZW4gLi4uXG4iICk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBlcnJzdGF0ID0gCisJKGludClRTS0+QWRkUXVlc3QoIHNhdmVrZXksIChpbnQpIHNhdmVxdWVzdFswXSwgKGludCkgc2F2ZXF1ZXN0WzFdLAorCQkJICAoc3RyaW5nICopIHNhdmVxdWVzdFsyXSwgKHN0cmluZykgc2F2ZXF1ZXN0WzNdLAorCQkJICAoaW50KSBzYXZlcXVlc3RbNF0sIChpbnQpIHNhdmVxdWVzdFs1XSwKKwkJCSAgKHN0cmluZykgc2F2ZXF1ZXN0WzZdLCAoaW50KSBzYXZlcXVlc3RbN10sCisJCQkgIChzdHJpbmcpIHNhdmVxdWVzdFs4XSApOworCisgIHN3aXRjaCAoIGVycnN0YXQgKQorICB7CisgICAgY2FzZSAgMDogd3JpdGUgKCAiWnVncmlmZiB2ZXJ3ZWlnZXJ0LlxuIiApOyBicmVhazsKKyAgICBjYXNlIC0xOiB3cml0ZSAoICJLZXkgdW5ndWVsdGlnIG9kZXIgc2l6ZW9mKGtleSkgPCA1LlxuIiApOyBicmVhazsKKyAgICBjYXNlIC0yOiB3cml0ZSAoICJRUCB1bmd1ZWx0aWcgb2RlciA8IDEuXG4iICk7IGJyZWFrOworICAgIGNhc2UgLTM6IHdyaXRlICggIlhQIHVuZ3VlbHRpZy5cbiIgKTsgYnJlYWs7CisgICAgY2FzZSAtNDogd3JpdGUgKCAiRmlsZW5hbWUobikgdW5ndWVsdGlnLlxuIiApOyBicmVhazsKKyAgICBjYXNlIC01OiB3cml0ZSAoICJJbmZvIHVuZ3VlbHRpZy5cbiIgKTsgYnJlYWs7CisgICAgY2FzZSAtNjogd3JpdGUgKCAiU3R1ZmUgdW5ndWVsdGlnIG9kZXIgPCAwIG9kZXIgPiAyMC5cbiIgKTsgYnJlYWs7CisgICAgY2FzZSAtNzogd3JpdGUgKCAiQWt0aXYtRmxhZyA8IDAgb2RlciA+IDEuXG4iICk7IGJyZWFrOworICAgIGNhc2UgLTg6IHdyaXRlICggIk1hZ2llcm5hbWUgdW5ndWVsdGlnLlxuIiApOyBicmVhazsKKyAgICBjYXNlIC05OiB3cml0ZSAoICJNYWdpZXJuYW1lIHVuZ3VlbHRpZy5cbiIpOyBicmVhazsKKyAgICBjYXNlIC0xMDogd3JpdGUgKCJVbmd1ZWx0aWdlIEdydXBwZW5udW1tZXIuXG4iKTsgYnJlYWs7CisgICAgZGVmYXVsdDogd3JpdGUgKCAiJyIrc2F2ZWtleSsiJyByZXN0YXVyaWVydC5cbiIgKTsKKyAgfQorICBzYXZla2V5ID0gIiI7CisgIHJldHVybiAxOworfQorCitpbnQgU2V0X1F1ZXN0ICggc3RyaW5nIHN0ciApCit7CisgIHN0cmluZyBxdWVzdCwgcGxheWVyLCBuZXdxdWVzdDsKKyAgaW50IGNyZWF0ZWQ7CisgIG9iamVjdCBvYjsKKworICBpZiAoICEoc3RyPVVBKSB8fCBzc2NhbmYoIHN0ciwgIiVzICVzIiwgcGxheWVyLCBxdWVzdCApICE9IDIgKQorICB7CisgICAgd3JpdGUgKCAiU3ludGF4OiBTZXRRIDxwbGF5ZXI+IDxxdWVzdD5cbiIgKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGNyZWF0ZWQ9MDsKKyAgTG9hZF9OdW1LZXkoKTsKKworICBpZiAoICEobmV3cXVlc3QgPSBudW1fa2V5W3F1ZXN0KyIiXSkgKQorICAgIG5ld3F1ZXN0ID0gcXVlc3Q7CisKKyAgb2I9ZmluZF9wbGF5ZXIocGxheWVyKTsKKyAgaWYoIW9iKQorICB7CisgICAgb2I9ZmluZF9uZXRkZWFkKHBsYXllcik7CisgICAgaWYoIW9iKQorICAgIHsKKyAgICAgIGNyZWF0ZWQ9MTsKKyAgICAgIG9iPV9fY3JlYXRlX3BsYXllcl9kdW1teShwbGF5ZXIpOworICAgIH0KKyAgfQorICBpZighb2IpCisgIHsKKyAgICB3cml0ZSgiS2VpbiBzb2xjaGVyIFNwaWVsZXIgZ2VmdW5kZW4uXG4hIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgCisgIHdyaXRlKEVSUk5PXzJfU1RSSU5HKCJHUSIsKGludClvYi0+R2l2ZVF1ZXN0KG5ld3F1ZXN0LCJfX3NpbGVudF9fIikpKyJcbiIpOworICBpZihjcmVhdGVkKQorICB7CisgICAgb2ItPnNhdmVfbWUoMCk7CisgICAgaWYoIShvYi0+cmVtb3ZlKCkpKQorICAgIHsKKyAgICAJZGVzdHJ1Y3Qob2IpOworICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKworaW50IERlbF9RdWVzdCAoIHN0cmluZyBzdHIgKQoreworICBzdHJpbmcgcXVlc3QsIHBsYXllciwgbmV3cXVlc3Q7CisgIGludCBjcmVhdGVkOworICBvYmplY3Qgb2I7CisKKyAgaWYgKCAhKHN0cj1VQSkgfHwgc3NjYW5mKCBzdHIsICIlcyAlcyIsIHBsYXllciwgcXVlc3QgKSAhPSAyICkKKyAgeworICAgIHdyaXRlICggIlN5bnRheDogRGVsUSA8cGxheWVyPiA8cXVlc3Q+XG4iICk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBMb2FkX051bUtleSgpOworCisgIGlmICggIShuZXdxdWVzdCA9IG51bV9rZXlbcXVlc3QrIiJdKSApCisgICAgbmV3cXVlc3QgPSBxdWVzdDsKKworICBjcmVhdGVkPTA7CisgIG9iPWZpbmRfcGxheWVyKHBsYXllcik7CisgIGlmKCFvYikKKyAgeworICAgIG9iPWZpbmRfbmV0ZGVhZChwbGF5ZXIpOworICAgIGlmKCFvYikKKyAgICB7CisgICAgICBjcmVhdGVkPTE7CisgICAgICBvYj1fX2NyZWF0ZV9wbGF5ZXJfZHVtbXkocGxheWVyKTsKKyAgICB9CisgIH0KKyAgaWYoIW9iKQorICB7CisgICAgd3JpdGUoIktlaW4gc29sY2hlciBTcGllbGVyIGdlZnVuZGVuLlxuISIpOworICAgIHJldHVybiAxOworICB9CisgIAorICB3cml0ZShFUlJOT18yX1NUUklORygiRFEiLChpbnQpIG9iLT5EZWxldGVRdWVzdCAoIG5ld3F1ZXN0ICkpKyJcbiIpOworICBpZihjcmVhdGVkKQorICB7CisgICAgb2ItPnNhdmVfbWUoMCk7CisgICAgaWYoIShvYi0+cmVtb3ZlKCkpKQorICAgIHsKKyAgICAJZGVzdHJ1Y3Qob2IpOworICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKworaW50IFF1ZXJ5X1F1ZXN0ICggc3RyaW5nIHN0ciApCit7CisgIG1peGVkICpxdWVzdDsKKyAgc3RyaW5nIG5ld3N0cjsKKyAgaW50IGk7CisKKyAgaWYgKCAhKHN0cj1VQSkgKQorICB7CisgICAgd3JpdGUgKCAiU3ludGF4OiBRdWVyeVEgPHF1ZXN0PlxuIiApOworICAgIHJldHVybiAxOworICB9CisKKyAgTG9hZF9OdW1LZXkoKTsKKworICBpZiAoICEobmV3c3RyID0gbnVtX2tleVtzdHIrIiJdKSApCisJbmV3c3RyID0gc3RyOworCisgIHF1ZXN0ID0gKG1peGVkICopIFFNLT5RdWVyeVF1ZXN0KCBuZXdzdHIgKTsKKworICBpZiAoICFwb2ludGVycCggcXVlc3QgKSB8fCAhc2l6ZW9mICggcXVlc3QgKSApCisgIHsKKyAgICB3cml0ZSAoICJLZWluZSBRdWVzdCBkaWVzZXMgTmFtZW5zIGdlZnVuZGVuLlxuIiApOworICAgIHJldHVybiAxOworICB9CisKKyAgd3JpdGUgKCAiQWt0dWVsbGVyIEVpbnRyYWc6XG4iKTsKKyAgd3JpdGUgKCAiS2V5ICAgICAgICAgICAgICA6ICIrbmV3c3RyICk7CisgIGlmKHF1ZXN0W1FfQUNUSVZFXSkKKyAgICB3cml0ZSAoIiAoYWt0aXZpZXJ0KVxuIik7CisgIGVsc2UKKyAgICB3cml0ZSAoIiAoZGVha3RpdmllcnQpXG4iKTsKKyAgd3JpdGUgKCAiUHVua3RlICAgICAgICAgICA6ICIrcXVlc3RbUV9RUF0rIlxuIiApOworICB3cml0ZSAoICJFcmZhaHJ1bmcgICAgICAgIDogIitxdWVzdFtRX1hQXSsiXG4iICk7CisgIHdyaXRlICggYnJlYWtfc3RyaW5nICggaW1wbG9kZSggcXVlc3RbUV9BTExPV0VEXSwgIiAiICksIDY1LCAiRmlsZW5hbWVuCSA6ICIgKSApOworICB3cml0ZSAoIGJyZWFrX3N0cmluZyAoIHF1ZXN0W1FfSElOVF0sIDY1LCAiSW5mbyAgICAgICAgICAgICA6ICIgKSApOworICB3cml0ZSAoICJTdHVmZSAgICAgICAgICAgIDogIitxdWVzdFtRX0RJRkZdKyJcbiIgKTsKKyAgcHJpbnRmKCJTdHVmZSAoYXZnKSAgICAgIDogJS4yZiAoJWQpXG4iLCBxdWVzdFtRX0FWRVJBR0VdWzBdLCAKKyAgICAgICAgcXVlc3RbUV9BVkVSQUdFXVsxXSk7CisgIHdyaXRlICggIktsYXNzZSAgICAgICAgICAgOiAiKyBRQ0xBU1NfU1RBUlMocXVlc3RbUV9DTEFTU10pKyJcbiIpOworICB3cml0ZSAoICJBdHRyaWJ1dGUgICAgICAgIDogIisgUUFUVFJfU1RSSU5HU1txdWVzdFtRX0FUVFJdXSsiXG4iKTsKKyAgd3JpdGUgKCAiTWFnaWVyICAgICAgICAgICA6ICIrY2FwaXRhbGl6ZShxdWVzdFtRX1dJWl0pKyJcbiIgKTsKKyAgd3JpdGUgKCAiV2FydGVuZGVyIE1hZ2llciA6ICIrY2FwaXRhbGl6ZShxdWVzdFtRX1NDTkRXSVpdKSsiXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBRdWVyeV9LZXlzICggc3RyaW5nIHN0ciApCit7CisgIHN0cmluZyAqa2V5cywgYWN0aXZlOworICBtaXhlZCAqcXVlc3Q7CisgIGludCBpOworCisgIGlmICggIShrZXlzID0gKHN0cmluZyAqKSBRTS0+UXVlcnlBbGxLZXlzKCkpICkKKyAgICByZXR1cm4gMTsKKworICB3cml0ZSAoICJcbiIgKTsKKyAga2V5cz1zb3J0X2FycmF5KGtleXMsIyc+KTsvLycpCisgIGZvciAoIGkgPSAwOyBpIDwgc2l6ZW9mKGtleXMpOyBpKysgKQorICB7CisgICAgcXVlc3QgPSAobWl4ZWQgKikgUU0tPlF1ZXJ5UXVlc3Qoa2V5c1tpXSk7CisgICAgaWYocXVlc3RbNl0pCisgICAgICBhY3RpdmU9IioiOworICAgIGVsc2UKKyAgICAgIGFjdGl2ZT0iICI7CisgICAgd3JpdGUoc3ByaW50ZigiJTJkJXMgJS0zM3MlcyIsaSsxLHF1ZXN0WzZdPyIqIjoiICIsa2V5c1tpXSwKKwkJICAgICAgIShpJTIpPyIgIjoiXG4iKSk7CisgIH0KKyAgaWYoaSUyKQorICAgIHdyaXRlKCJcbiIpOworCisgIHJldHVybiAxOworfQorCitpbnQgUXVlcnlfUXVlc3RzICggc3RyaW5nIHN0ciApCit7CisgIG1peGVkICpxdWVzdDsKKyAgc3RyaW5nICprZXlzLCByc3RyOworICBpbnQgaTsKKworICBpZiAoICEoa2V5cyA9IChtaXhlZCAqKSBRTS0+UXVlcnlBbGxLZXlzKCkpICkKKyAgICByZXR1cm4gMTsKKworICBrZXlzPXNvcnRfYXJyYXkoa2V5cywjJz4pOy8vJykKKyAgZm9yICggaSA9IDAsIHJzdHIgPSAiIjsgaSA8IHNpemVvZihrZXlzKTsgaSsrICkKKyAgeworICAgIHF1ZXN0ID0gKG1peGVkICopIFFNLT5RdWVyeVF1ZXN0KGtleXNbaV0pOworICAgICAgd3JpdGUgKCAiXG5LZXkgICAgICAgICAgICAgIDogIitrZXlzW2ldICk7CisgIGlmKHF1ZXN0W1FfQUNUSVZFXSkKKyAgICB3cml0ZSAoIiAoYWt0aXZpZXJ0KVxuIik7CisgIGVsc2UKKyAgICB3cml0ZSAoIiAoZGVha3RpdmllcnQpXG4iKTsKKyAgd3JpdGUgKCAiUHVua3RlICAgICAgICAgICA6ICIrcXVlc3RbUV9RUF0rIlxuIiApOworICB3cml0ZSAoICJFcmZhaHJ1bmcgICAgICAgIDogIitxdWVzdFtRX1hQXSsiXG4iICk7CisgIHdyaXRlICggYnJlYWtfc3RyaW5nICggaW1wbG9kZSggcXVlc3RbUV9BTExPV0VEXSwgIiAiICksIDc4LCAiRmlsZW5hbWVuCSA6ICIgKSApOworICB3cml0ZSAoIGJyZWFrX3N0cmluZyAoIHF1ZXN0W1FfSElOVF0sIDc4LCAiSW5mbwkJIDogIiApICk7CisgIHdyaXRlICggIlN0dWZlICAgICAgICAgICAgOiAiK3F1ZXN0W1FfRElGRl0rIlxuIiApOworICB3cml0ZSAoICJLbGFzc2UgICAgICAgICAgIDogIisgUUNMQVNTX1NUQVJTKHF1ZXN0W1FfQ0xBU1NdKSsiXG4iKTsKKyAgd3JpdGUgKCAiQXR0cmlidXRlICAgICAgICA6ICIrIFFBVFRSX1NUUklOR1NbcXVlc3RbUV9BVFRSXV0rIlxuIik7CisgIHdyaXRlICggIk1hZ2llciAgICAgICAgICAgOiAiK2NhcGl0YWxpemUocXVlc3RbN10pKyJcbiIgKTsKKyAgd3JpdGUgKCAiV2FydGVuZGVyIE1hZ2llciA6ICIrY2FwaXRhbGl6ZShxdWVzdFs4XSkrIlxuIik7CisgIH0KKyAgTW9yZSggcnN0ciwgMCApOworICByZXR1cm4gMTsKK30KKworaW50IEFjdGl2YXRlUXVlc3QoIHN0cmluZyBzdHIgKQoreworICBtaXhlZCAqcXVlc3Q7CisgIHN0cmluZyBuZXdzdHI7CisgIGludCBlcnJzdGF0OworCisgIGlmICggIShzdHI9VUEpICkKKyAgeworICAgIHdyaXRlICggIlN5bnRheDogQWN0aVZhdGVRIDxxdWVzdD5cbiIgKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIExvYWRfTnVtS2V5KCk7CisKKyAgaWYgKCAhKG5ld3N0ciA9IG51bV9rZXlbc3RyKyIiXSkgKQorCW5ld3N0ciA9IHN0cjsKKworICBzd2l0Y2goIFFNLT5TZXRBY3RpdmUoIG5ld3N0ciwgMSApICkKKyAgeworICAgIGNhc2UgLTM6IHdyaXRlICggIlVuZ3VlbHRpZ2VyIEZsYWcuXG4iICk7IGJyZWFrOworICAgIGNhc2UgLTI6IHdyaXRlICggIlF1ZXN0IHdhciBiZXJlaXRzIGFrdGl2aWVydC5cbiIgKTsgYnJlYWs7CisgICAgY2FzZSAtMTogd3JpdGUgKCAiS2VpbmUgUXVlc3QgZGllc2VzIE5hbWVucyBnZWZ1bmRlbi5cbiIgKTsgYnJlYWs7CisgICAgY2FzZSAgMDogd3JpdGUgKCAiWnVncmlmZiB2ZXJ3ZWlnZXJ0XG4iICk7IGJyZWFrOworICAgIGNhc2UgIDE6IHdyaXRlICggIlF1ZXN0ICciK25ld3N0cisiJyBha3RpdmllcnQuXG4iICk7IGJyZWFrOworICAgIGRlZmF1bHQ6IHdyaXRlICggInVuYmVrYW5udGVyIEZlaGxlcnN0YXR1cy5cbiIgKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworaW50IERlYWN0aXZhdGVRdWVzdCggc3RyaW5nIHN0ciApCit7CisgIG1peGVkICpxdWVzdDsKKyAgc3RyaW5nIG5ld3N0cjsKKyAgaW50IGVycnN0YXQ7CisKKyAgaWYgKCAhKHN0cj1VQSkgKQorICB7CisgICAgd3JpdGUgKCAiU3ludGF4OiBEZWFjdGlWYXRlUSA8cXVlc3Q+XG4iICk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBMb2FkX051bUtleSgpOworCisgIGlmICggIShuZXdzdHIgPSBudW1fa2V5W3N0cisiIl0pICkKKwluZXdzdHIgPSBzdHI7CisKKyAgc3dpdGNoKCBRTS0+U2V0QWN0aXZlKCBuZXdzdHIsIDAgKSApCisgIHsKKyAgICBjYXNlIC0zOiB3cml0ZSAoICJVbmd1ZWx0aWdlciBGbGFnLlxuIiApOyBicmVhazsKKyAgICBjYXNlIC0yOiB3cml0ZSAoICJRdWVzdCB3YXIgYmVyZWl0cyBkZWFrdGl2aWVydC5cbiIgKTsgYnJlYWs7CisgICAgY2FzZSAtMTogd3JpdGUgKCAiS2VpbmUgUXVlc3QgZGllc2VzIE5hbWVucyBnZWZ1bmRlbi5cbiIgKTsgYnJlYWs7CisgICAgY2FzZSAgMDogd3JpdGUgKCAiWnVncmlmZiB2ZXJ3ZWlnZXJ0XG4iICk7IGJyZWFrOworICAgIGNhc2UgIDE6IHdyaXRlICggIlF1ZXN0ICciK25ld3N0cisiJyBkZWFrdGl2aWVydC5cbiIgKTsgYnJlYWs7CisgICAgZGVmYXVsdDogd3JpdGUgKCAidW5iZWthbm50ZXIgRmVobGVyc3RhdHVzLlxuIiApOworICB9CisgIHJldHVybiAxOworfQorCisKZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvYWRtL21rIGIvb2JqL3Rvb2xzL3RlbGxlci9hZG0vbWsKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTc5ODI2NAotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvYWRtL21rCkBAIC0wLDAgKzEsMjUgQEAKKyMhL3Vzci9sb2NhbC9iaW4vcGVybAorCiskbW9kZSA9IDA7CiskVDE9Im1peGVkfGZsb2F0fGludHxzdHJpbmd8b2JqZWN0fHZvaWR8cXVvdGVkX2FycmF5fHN5bWJvbHxjbG9zdXJlfG1hcHBpbmciOworJFQyPSJtaXhlZCBcKnxmbG9hdCBcKnxpbnQgXCp8c3RyaW5nIFwqfG9iamVjdCBcKnx2b2lkIFwqfHF1b3RlZF9hcnJheSBcKnxzeW1ib2wgXCp8Y2xvc3VyZSBcKnxtaXhlZCBcJiI7CiskVFlQRVM9IlwoJFQxfCRUMlwpIjsKKword2hpbGUoIDw+ICkgeworCWNob3AgJF87CisJaWYoICRtb2RlID09IDAgJiYgJF8gZXEgIiVlZnVucyIgKSB7CisJCSRtb2RlID0gMTsKKwl9IGVsc2lmKCAkbW9kZSA9PSAxICYmICRfIGVxICIleGNvZGVzIiApIHsKKwkJJG1vZGUgPSAyOworCX0gZWxzaWYoICRfID1+ICIjZW5kaWYiICYmICRtb2RlID09IDMgKSB7CisJCSRtb2RlID0gMTsKKwl9IGVsc2lmKCAkbW9kZSA9PSAxICkgeworCQlpZiggJF8gPX4gbSIjaWZuZGVmIE5BVElWRSIgfHwgJF8gPX4gbSIjaWZkZWYgTUFMTE9DX21hbGxvYyIgKSB7CisJCQkkbW9kZSA9IDM7CisJCX0gZWxzaWYoICRfIG5lICIiICYmICRfICF+IG0iXi5cKiIgJiYgJF8gIX4gIl4jIiApIHsKKwkJCXMvZGVmYXVsdDogXHcqLy87CisJCQlzLyRUWVBFUy9taXhlZC9nOworCQkJcHJpbnQgIiRfXG4iOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9hcnJheSBiL29iai90b29scy90ZWxsZXIvaGlsZmUvYXJyYXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI1MzAwMAotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvYXJyYXkKQEAgLTAsMCArMSwxOSBAQAorQkVGRUhMOgorCWFycmF5LCBhcnIKKworQVJHVU1FTlRFOgorCUFsbGUgU3RhY2tlbGVtZW50ZSBiaXMgenVtIGxldHp0ZW4gTG9jay4KKworRlVOS1RJT046CisJQWxsZSBFbGVtZW50ZSB3ZXJkZW4genUgZWluZW0gQXJyYXkgenVzYW1tZW5nZWZ1ZWd0LiBEZXIgTG9jaworCXdpcmQgZW50ZmVybnQgdW5kIGRhcyBBcnJheSB3aWVkZXIgYXVmIGRlbiBTdGFjayBnZWxlZ3QuCisKK0JFSVNQSUVMRToKKwksbWUgInphcF9tc2ciLCAiRHUga29jaHN0IEBAd2VuQEAuXG4iICJAQGljaEBAIGtvY2h0IEBAd2VuQEAuXG4iCisJIkBAaWNoQEAga29jaHQgRGljaC5cbiIgYXJyYXkgIVNldFByb3AKKwkJV2FuZGVsdCBkaWUgZHJlaSBTdHJpbmdzIGluIGVpbiBBcnJheSB1bS4gRGFuYWNoIHdpcmQgaW0KKwkJU3BpZWxlciBkaWUgWmFwcC1NZWxkdW5nIG5ldSBnZXNldHp0LiBEYXMgb2JpZ2UgbXVzcworCQluYXR1ZXJsaWNoIGluIGVpbmVyIFplaWxlIGVpbmdlZ2ViZW4gd2VyZGVuLgorCitTUElFSEUgQVVDSDoKKwkic3BsaXQiLCAibG9jayIKZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvaGlsZmUvY2FsbCBiL29iai90b29scy90ZWxsZXIvaGlsZmUvY2FsbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTk3Mjk5Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9jYWxsCkBAIC0wLDAgKzEsMjYgQEAKK0JFRkVITDoKKwknZnVua3Rpb24sICcnZnVua3Rpb24gb2RlcgorCS0+ZnVua3Rpb24sIC0tPmZ1bmt0aW9uCisKK0FSR1VNRU5URToKKwlBbGxlIFN0YWNrZWxlbWVudGUgYmlzIHp1bSBsZXR6dGVuIExvY2suCisJZnVua3Rpb24gLS0gTmFtZSBlaW5lciBsZnVuLgorCitGVU5LVElPTjoKKwlSdWZlIGluIGRlbSBPYmpla3Qgb2JlcmhhbGIgZGVzIGxldHp0ZW4gTG9ja3MsIGRpZSBhbmdlZ2ViZW5lCisJRnVua3Rpb24gYXVmIHVuZCB1ZWJlcmdpYiBkaWUgZm9sZ2VuZGVuIEVsZW1lbnRlIGRlcyBTdGFja3MKKwkoYmlzIGhpbmF1ZiB6dW0gVE9TKSBhbHMgQXJndW1lbnRlLiBFbnRmZXJuZSBkZW4gTG9jay4KKwlXZW5uIG1pdCBkaWUgRnVua3Rpb24gbWl0IHp3ZWkgQXBvc3Ryb3BoZW4gb2RlciB6d2VpIE1pbnVzemVpY2hlbgorCWdlcnVmZW4gd3VyZGUsIGxlZ2UgZGFzIEVyZ2VibmlzIGF1ZiBkZW4gU3RhY2suIChCZWkgZWluZmFjaGVtCisJQXBvc3Ryb3BoIGJ6dy4gTWludXN6ZWljaGVuIGFsc28gbmljaHQuKQorCitCRUlTUElFTDoKKwksbWUgImRhcyBHcmF1ZW4gYW0gTW9yZ2VuIiAnc2V0X3RpdGxlCisJRW5zcHJpY2h0OgorCWNhbGxfb3RoZXIoIHRoaXNfcGxheWVyKCksICJzZXRfdGl0bGUiLCAiZGFzIEdyYXVlbiBhbSBNb3JnZW4iICk7CisKK1dBUk5VTkc6CisJTWFuIHNvbGx0ZSB2b3JoZXIgbmFjaHNjaGF1ZW4sIG9iIG5pY2h0IG5vY2ggZXR3YXMgYXVmIGRlbSBTdGFjaworCWxpZWd0LCBkZW5uIHdlbm4ga2VpbiBMb2NrIGRhIGlzdCwgd3VlcmRlIGRpZSBGdW5rdGlvbiBkYXJpbgorCWF1ZmdlcnVmZW4gd2VyZGVuIChtaXQgbWUgdW5kICJkYXMgR3JhdWVuIGFtIE1vcmdlbiIgYWxzIEFyZ3VtZW50ZSksCisJRGVzaGFsYiBiZXNzZXIgc286ICwsbWUgImRhcyBHcmF1ZW4gYW0gTW9yZ2VuIiAnJ3NldF90aXRsZQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9jYWxsZWZ1biBiL29iai90b29scy90ZWxsZXIvaGlsZmUvY2FsbGVmdW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFmZGUyYQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvY2FsbGVmdW4KQEAgLTAsMCArMSwyNSBAQAorQkVGRUhMOgorCWBmdW5rdGlvbiwgYGBmdW5rdGlvbiBvZGVyCisJLSpmdW5rdGlvbiwgLS0qZnVua3Rpb24KKworQVJHVU1FTlRFOgorCUFsbGUgU3RhY2tlbGVtZW50ZSBiaXMgenVtIGxldHp0ZW4gTG9jay4KKwlmdW5rdGlvbiAtLSBOYW1lIGVpbmVyIGVmdW4uCisKK0ZVTktUSU9OOgorCVJ1ZmUgZGllIGFuZ2VnZWJlbmUgZWZ1biBhdWYsIHVuZCB1ZWJlcmdlYmUgYWxsZSBTdGFja2VsZW1lbnRlCisJYmlzIHp1bSBsZXR6dGVuIExvY2sgYWxzIEFyZ3VtZW50ZS4gRW50ZmVybmUgZGVuIExvY2suCisJV2VubiBkaWUgZWZ1biBtaXQgZG9wcGVsdGVuIEJhY2txdW90ZXMgb2RlciBNaW51c3plaWNoZW4gKCdgYCcgb2RlcgorCSctLSonKSBhdWZnZXJ1ZmVuIHd1cmRlLCBsZWdlIGRhcyBFcmdlYm5pcyBhdWYgZGVuIFN0YWNrLiAoQmVpCisJZWluZmFjaGVtICdgJyBhbHNvIG5pY2h0LikKKworQkVJU1BJRUw6CisJLG1lIGBlbnZpcm9ubWVudAorCUVuc3ByaWNodDoKKwllbnZpcm9ubWVudCggdGhpc19wbGF5ZXIoKSApOworCitXQVJOVU5HOgorCU1hbiBzb2xsdGUgdm9yaGVyIG5hY2hzY2hhdWVuLCBvYiBuaWNodCBub2NoIGV0d2FzIGF1ZiBkZW0gU3RhY2sKKwlsaWVndCwgZGVubiB3ZW5uIGtlaW4gTG9jayBkYSBpc3QsIHdlcmRlbiB6dWFldHpsaWNoIG5vY2gKKwl1bmdld3Vuc2NodGUgQXJndW1lbnRlIG1pdHVlYmVyZ2ViZW4uCisJRGVzaGFsYiBiZXNzZXIgc286ICwsbWUgYGBlbnZpcm9ubWVudApkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9jYWxsb3V0cyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvY2FsbG91dHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgzMDQyYwotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvY2FsbG91dHMKQEAgLTAsMCArMSwyNCBAQAorQkVGRUhMOgorCWNhbGxvdXRzCisJY2FsbG91dHMhCisKK0FSR1VNRU5URToKKwljYWxsb3V0czogVE9TIFN0cmluZywgbmFjaCBkZW0gZ2VzdWNodCB3aXJkLgorCWNhbGxvdXRzIToga2VpbmUKKworRlVOS1RJT046CisJR2liIGVpbmUgTGlzdGUgYWxsZXIgaW0gU3BpZWwgbGF1ZmVuZGVuIGNhbGxfb3V0cyBhdXMuIEVpbiBjYWxsX291dAorCXdpcmQgaW4gZm9sZ2VuZGVtIEZvcm1hdCBhdXNnZWdlYmVuOgorCTEuKSBaZWl0LCBiaXMgenVtIEF1ZnJ1ZiBkZXIgRnVua3Rpb24uCisJMi4pIE9iamVrdCwgaW4gZGVtIGRpZSBGdW5rdGlvbiBhdWZnZXJ1ZmVuIHdpcmQuCisJMy4pIE5hbWUgZGVyIEZ1bmt0aW9uLgorCTQuKSBBcmd1bWVudCwgZGFzIGRlbSBjYWxsX291dCB1ZWJlcmdlYmVuIHdpcmQuCisKKwlXaXJkIGRlciBCZWZlaGwgb2huZSBSdWZ6ZWloZW4gZWluZ2VnZWJlbiwgc28gd2VyZGVuIG51ciBkaWUKKwlNZWxkdW5nZW4gYXVzZ2VnZWJlbiwgZGllIGluIGRlbiBlcnN0ZW4gZHJlaSAoISkgQXJndW1lbnRlbgorCWRlbiBhbmdlZ2ViZW5lbiBTdHJpbmcgZW50aGFsdGVuLgorCitCRUlTUElFTDoKKwksImdvIiBjYWxsb3V0cworCUdpYnQgYWxsZSBNb25zdGVyIGF1cywgZGllIG1pdHRlbHMgZGVyIEZ1bmt0aW9uICJnbyIgdW1oZXJsYXVmZW4uCisJKEVzIGdpYnQgYWJlciBhdWNoIHdlbGNoZSwgZGllIG1pdHRlbHMgIldhbGsiIGxhdWZlbi4gOi0pCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2NsZWFub2YgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2NsZWFub2YKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU1N2NmMQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvY2xlYW5vZgpAQCAtMCwwICsxLDE2IEBACitCRUZFSEw6CisJY2xlYW5vZiwgY2xub2YKKworQVJHVU1FTlRFOgorCURpZSB6d2VpIG9iZXJzdGVuIFN0YWNrZWxlbWVudGUuCisKK0ZVTktUSU9OOgorCVplcnN0b2VyZSBhbGxlIE9iamVrdGUgaW4gZGVtIHp3ZWl0ZW4gT2JqZWt0IGF1ZiBkZW0gU3RhY2ssCisJZGllIHNpY2ggdW50ZXIgZGVtIE5hbWVuLCBkZXIgaW4gVE9TIHN0ZWh0LCBhbmdlc3Byb2NoZW4gZnVlaGxlbi4KKwlEaWUgT2JqZWt0ZSB3ZXJkZW4gYWJlciBudXIgcmVtb3ZlZCwgZGFzIGRhcyBkZXIgZW1wZm9obGVuZSBXZWcKKwlpc3QsIE9iamVrdGUgenUgemVyc3RvZXJlbi4gU29sbGVuIGRpZSBPYmpla3RlIHdpcmtsaWNoIGhhcnQgemVyc3RvZXJ0CisJd2VyZGVuLCBzbyBrYW5uIG1hbiBlaW4gUnVmemVpY2hlbiBhbiBkZW4gQmVmZWhsIGFuaGFlbmdlbi4KKwkoQWxzbyAnY2xlYW5vZiEnLikKKworU0lFSEUgQVVDSDoKKwkicmVtb3ZlIiwgImRlc3RydWN0IgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9jbGVhciBiL29iai90b29scy90ZWxsZXIvaGlsZmUvY2xlYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFjYjVkYwotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvY2xlYXIKQEAgLTAsMCArMSw5IEBACitCRUZFSEw6CisJY2xlYXIsIGNscgorCitBUkdVTUVOVEU6CisJU1RBQ0sKKworRlVOS1RJT046CisJTG9lc2NoZSBkZW4gZ2FuemVuIFN0YWNrLiBEaWUgT2JqZWt0ZSBhdWYgZGVtIFN0YWNrIHdlcmRlbiBhYmVyCisJbmljaHQgZGVzdHJ1Y3RlZC4KZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvaGlsZmUvY2xvbmUgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2Nsb25lCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNTYyMGIKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2Nsb25lCkBAIC0wLDAgKzEsNyBAQAorQkVGRUhMOgorCitBUkdVTUVOVEU6CisKK0ZVTktUSU9OOgorCitCRUlTUElFTEU6CmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2Rlc3RydWN0IGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9kZXN0cnVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGVkMjM0Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9kZXN0cnVjdApAQCAtMCwwICsxLDE0IEBACitCRUZFSEw6CisJZGVzdHJ1Y3QsIGRlc3QsIGRlcworCitBUkdVTUVOVEU6CisJVE9TCisKK0ZVTktUSU9OOgorCVplcnN0b2VyZSBkYXMgT2JqZWt0IGF1ZiBkZW0gVE9TLiBJbiB3aXJrbGljaGtlaXQgd2lyZCBhYmVyIG51ciByZW1vdmUKKwlhdWZnZXJ1ZmVuLCBkYXMgZGFzIGRpZSBlbXBmb2hsZW5lIEFydCBkZXJaZXJzdG9lcnVuZyB2b24gT2JqZWt0ZW4KKwlpc3QuIFdpbGwgbWFuIGplZG9jaCBlaW4gT2JqZWt0IHdpcmtsaWNoIGhhcnQgZGVzdHJ1Y3Rlbiwgc28KKwloYWVuZ2UgbWFuIGVpbiBSdWZ6ZWljaGVuICgnIScpIGFuIGRhcyBLb21tYW5kbyAoYWxzbyAnZGVzdHJ1Y3QhJykuCisKK1NJRUhFIEFVQ0g6CisJInJlbW92ZSIKZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvaGlsZmUvZHVtcCBiL29iai90b29scy90ZWxsZXIvaGlsZmUvZHVtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2JlNDZiCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9kdW1wCkBAIC0wLDAgKzEsMTYgQEAKK0JFRkVITDoKKwlkdW1wCisJCitBUkdVTUVOVEU6CisJa2VpbnMgb2RlcgorCVRPUyAtLSBmaWxlbmFtZQorCQorRlVOS1RJT046CisJU3BlaWNoZXJlIGFsbGUgc2VsYnN0ZGVmaW5pZXJ0ZW4gRnVua3Rpb25lbiBpbiBkZXIgYW5nZWdlYmVuZW4KKwlEYXRlaSBhYi4gSXN0IGRlciBUT1Mga2VpbiBTdHJpbmcsIHNvIHdpcmQgaW4gZGVyIERhdGVpCisJfi8ubWVtb3J5Lm8gZ2VzcGVpY2hlcnQuCisKKwlFcyBrb2VubmVuIG51ciBGdW5rdGlvbmVuIGFiZ2VzcGVpY2hlcnQgb2RlciBnZWxhZGVuIHdlcmRlbiEKKworU0lFSEUgQVVDSDoKKwkiZnVua3Rpb25lbiIsICJyZXN0b3JlIiwgIm1lbW9yeSIKZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvaGlsZmUvZHVwIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9kdXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcwMmI3NQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvZHVwCkBAIC0wLDAgKzEsOSBAQAorQkVGRUhMOgorCWR1cAorCitBUkdVTUVOVEU6CisJVE9TCisKK0ZVTktUSU9OOgorCUxlZ2UgZGFzIE9iamVrdCwgZGFzIG9iZW4gYXVmIGRlbSBTdGFjayBsaWVndCwgbm9jaGVpbm1hbCBhdWYKKwlkZW4gU3RhY2ssIHVtIGVzIGV2ZW50dWVsbCBzcGFldGVyIG5vY2ggZWlubWFsIHdpZWRlciB6dSB2ZXJ3ZW5kZW4uCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2VpbmxlaXR1bmcgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2VpbmxlaXR1bmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQxOWQwMwotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvZWlubGVpdHVuZwpAQCAtMCwwICsxLDEyMSBAQAorV0lDSFRJRzoKKwkqKioqKioqKioqKioqKioqKioqKioqCisJRGFzIGVyc3RlIFplaWNoZW4gbXVzcyBhYiBqZXR6dCBlaW4gS29tbWEgKCwpIHNlaW4uIEJpc2hlciB3YXIKKwllcyBlaW4gU2VtaWtvbG9uLCBhYmVyIGRhcyB3ZWNoc2Vsd2lya3QgamEgbWl0IGRlbSBlbW90ZS4KKwkqKioqKioqKioqKioqKioqKioqKioqCisKK0RFUiBURUxMRVJTVEFQRUw6CisKKwlEZXIgVGVsbGVyc3RhcGVsIGlzdCBlaW4gc3RhY2tvcmllbnRpZXJ0ZXMgTWFnaWVydG9vbC4KKwlEYXMgaGVpc3N0LCBtYW4gbGVndCBkaWUgT2JqZWt0ZSwgU3RyaW5ncyBvZGVyIHdhcyBhdWNoIGltbWVyIGF1ZgorCWRlbiBTdGFjayB1bmQgcnVmdCBhbHMgbGV0enRlcyBkaWUgRnVua3Rpb24gYXVmLCBkaWUgZGFubiBtaXQKKwlkZW0gU3RhY2tpaG5oYWx0IGlyZ2VuZGV0d2FzIG1hY2h0LiBEYXMgRXJnZWJuaXMgd2lyZCBtZWlzdGVucworCWRhbm4gd2llZGVyIGF1ZiBkZW0gU3RhY2sgYWJnZWxlZ3QuCisJSW0gZ3Jvc3NlbiB1bmQgZ2FuemVuIGRpZXNlcyBUb29sIHZvbiBNYWNiZXRocyBMdXBlIGluc3BpcmllcnQuCisKKwlJbSBmb2xnZW5kZW4gd2lyZCBtaXQgVE9TIChUb3BPZlN0YWNrKSBkYXMgRGluZyBiZXplaWNobmV0LCBkYXMKKwlhbHMgbGV0enRlcyBhdWYgZGVtIFN0YWNrIGFiZ2VsZWd0IHd1cmRlLgorCitLT01NQU5ET1M6CisKKwlKZWRlcyBLb21tYW5kbywgZGFzIG1pdCBkZW4gVGVsbGVybiBhdXNnZWZ1ZWhydCB3ZXJkZW4gc29sbCwKKwl3aXJkIG1pdCAnLCcgZWluZ2VsZWl0ZXQuIEFsbGVyZGluZ3MgaGF0IGRhcyBTZW1pa29sb24gbm9jaAorCWVpbmUgd2VpdGVyZSBGdW5rdGlvbiwgYWJlciBkYXp1IHNwYWV0ZXIuCisKK0RJTkdFIEFVRiBERU4gU1RBQ0sgTEVHRU46CisKKwlIaW50ZXIgZGVtIFNlbWlrb2xvbiB3ZXJkZW4gKGJlbGllYmlnIHZpZWxlKSBTdGFja29wZXJhdGlvbmVuCisJYW5nZWdlYmVuLiBEaWUgbWVpc3N0ZW4gZGllc2VyIE9wZXJhdGlvbmVuIGxlZ2VuIGlyZ2VuZGV0d2FzIGF1ZgorCWRlbSBTdGFjayBhYi4gV2lsbCBtYW4gT2JqZWt0ZSBhdWYgZGVtIFN0YWNrIGFibGVnZW4sIHNvIGdpYnQKKwltYW4gZWluZmFjaCBkZXJlbiBGaWxlbmFtZW4gYW4uIFphaGxlbiBnaWJ0IG1hbiBkdXJjaCBlaW4gdm9yYW4KKwlnZXN0ZWxsdGVzIERvcHBlbGtyZXV6ICgnIycpIGFuLiAoUG9zaXRpdmUgWmFobGVuIGdlaGVuIGF1Y2ggb2huZS4pCisJdW5kIFN0cmluZ3Mgd2VyZGVuIGluIEFuZnVlaHJ1bmdzemVpY2hlbiBlaW5nZWZhc3N0LCBkYW1pdCBzaWUgdm9uCisJZGVuIE9iamVrdGVuIHVudGVyc2NoaWVkZW4gd2VyZGVuIGtvZW5uZW4uIChVZWJyaWdlbnMgaXN0IGRhcyBaZWljaGVuCisJJ1xuJyB1bmQgZGFzIEVTQy1aZWljaGVuICgnXGUnKSBpbiBTdHJpbmdzIGVybGF1YnQuKQorCitTVEFDS09QRVJBVElPTkVOOgorCisJU3RhY2tvcGVyYXRpb25lbiwgZGllIGRlbiBTdGFjayBuaWNodCBiZWVpbmZsdXNzZW4uCisKKwkJc2F5ICAgICAtIE1lbGR1bmdlbiBhbiBNaXRzcGllbGVyIGVpbi0gdW5kIGF1c3NjaGFsdGVuLgorCQkJICBVbXN0ZWhlbmRlIHNlaGVuIG5vcm1hbGVyd2Vpc2UsIHdlbm4gbWFuIG1pdCBkZW4KKwkJCSAgVGVsbGVybiBhcmJlaXRldCwgZWluZSBNZWxkdW5nIGRlciBBcnQ6CisJCQkgICJTb3dpZXNvIGpvbmdpbGVydCBtaXQgc2VpbmVuIFRlbGxlcm4uIiBiencKKwkJCSAgIlNvd2llc28gZmFlbGx0IGJlaW0gSm9uZ2xpZXJlbiBlaW4gVGVsbGVyIGhlcnVudGVyLiIKKwkJbmFtZXMgICAtIE9iamVrdGUgbWl0IG9kZXIgb2huZSBOYW1lbiBiZWkgQXVmbGlzdHVuZ2VuCisJCQkgIGF1c2dlYmVuLgorCQlzdGFjayAgIC0gR2ViZSBTdGFja2luaGFsdCBhdXMgKDAgaXN0IGRlciBUT1MpLgorCQltZW1vcnkgIC0gR2ViZSBJbmhhbHQgZGVyIFZhcmlhYmxlbiBhdXMuCisJCXRvcCAgICAgLSBHZWJlIGRlbiBUT1MgYXVzLgorCQlpbnYgICAgIC0gR2ViZSBlaW5lIExpc3RlIGRlciBPYmpla3RlIGF1cywKKwkJCSAgZGllIHNpY2ggaW0gVE9TLU9iamVrdCBiZWZpbmRlbi4KKwkJc2NhbiAgICAtIEdlYmUgcmVsZXZhbnRlIERhdGVuIHp1IGRlbSBTcGllbGVyIGF1ZiBkZW0gVE9TIGF1cy4KKworCVN0YWNrb3BlcmF0aW9uZW4sIGRpZSBtaXQgc2VsYnN0ZGVmaW5pZXJ0ZW4gRnVua3Rpb25lbiB6dSB0dWVuCisJaGFiZW46CisKKwkJIQktIERlZmluaWVyZSBlaW5lIG5ldWUgRnVua3Rpb24uCisJCQkgIChIaWxmZSB1bnRlciAiZnVua3Rpb25lbiIuKQorCQlkdW1wCisJCXJlc3RvcmUgLSBTcGVpY2hlcm4gdW5kIExhZGVuIGRlciBiZW51dHplcmRlZmluaWVydGVuCisJCQkgIEZ1bmt0aW9uZW4KKworCVN0YWNrb3BlcmF0aW9uZW4sIGRpZSBldHdhcyBhdWYgZGVtIFN0YWNrIGFibGVnZW46CisKKwkJbWUgICAgICAtIExlZ2UgZGljaCBzZWxic3QgYXVmIGRlbiBTdGFjay4KKwkJaGVyZSAgICAtIExlZ2UgZGVuIFJhdW0sIGluIGRlbSBEdSBiaXN0LCBhdWYgZGVuIFN0YWNrLgorCisJU3RhY2tvcGVyYXRpb25lbiB6dSBkZXNzZW4gVmVyd2FsdHVuZzoKKworCQlkdXAgICAgIC0gTGVnZSBkZW4gVE9TIG5vY2ggZWlubWFsIGF1ZiBkZW4gU3RhY2suCisJCXBvcCAgICAgLSBMb2VzY2hlIGRlbiBUT1Mgdm9tIFN0YWNrLgorCQlzd2FwICAgIC0gVmVyc3RhdWNoZSBkZW4gVE9TIG1pdCBkZW0gRGluZyBkYXJ1bnRlci4KKwkJY2xlYXIgICAtIExvZXNjaGUgZGVuIGdhbnplbiBTdGFjay4KKworCURpZSBmb2xnZW5kZW4gRnVua3Rpb25lbiBwb3BwZW4gaWhyZSBQYXJhbWV0ZXIgdm9tIFN0YWNrIGhlcnVudGVyLgorCisJRnVua3Rpb25lbiBtaXQgZWluZW0gUGFyYW1ldGVyOgorCisJCWNsb25lICAgLSBDbG9uZSBlaW4gT2JqZWt0IG1pdCBkZW4gYW5nZWdlYmVuZW4gRmlsZW5hbWVuLgorCQkgICAgICAgICAgTGVnZSBkYXMgZ2VjbG9udGUgT2JqZWt0IGF1ZiBkZW4gU3RhY2suCisJCXVwZGF0ZSAgLSBaZXJzdG9lcmUgZGllIEJsdWVwcmludCBkZXMgT2JqZWt0ZXMuCisJCXJlbW92ZSAgLSBaZXJzdG9lcmUgZGFzIE9iamVrdC4KKworCUZ1bmt0aW9uZW4gbWl0IG1laHJlcmVuIFBhcmFtZXRlcm46CisKKwkJbW92ZQktIEJld2VnZSBkYXMgendlaXRvYmVyc3RlIEVsZW1lbnQgaW4gZGFzIE9iZXJzdGUuCisJCWlmICAgICAgLSBzdWNoZSBhYmhhZW5naWcgdm9tIG9iZXJzdGVuIEVsZW1lbnQgZWluZXMgZGVyCisJCQkgIGRhcnVudGVyIGxpZWdlbmRlbiBhdXMuCisKKwlGdW5rdGlvbmVuIG1pdCBiZWxpZWJpZyB2aWVsZW4gUGFyYW1ldGVybjoKKworCQlVbSB6dSB3aXNzZW4sIHdpZXZpZWxlIGRlciBTdGFja2VsZW1lbnRlIHp1IGRlbSBGdW5rdGlvbnMtCisJCWF1ZnJ1ZiBnZWhvZXJlbiwgbXVzcyBlaW5lIEluZm9ybWF0aW9uIGF1ZiBkZW0gU3RhY2sKKwkJYWJnZWxlZ3Qgd2VyZGVuLiBEaWVzZXMgd2lyZCBtaXQgZWluZW0gTG9jayAoJzsnKSBnZW1hY2h0LgorCQlVbnRlciBkZW0gU3RpY2hwdW5rdCAibG9jayIgc2luZCBhdWNoIEJlaXNwaWVsZS4KKworCQlhcnJheQktIEZ1ZWdlIGFsbGUgRWxlbWVudGUgenUgZWluZW0gQXJyYXkgenVzYW1tZW4uCisJCXNwbGl0CS0gWmVybGVnZSBkYXMgQXJyYXkgYXVmIGRlbSBTdGFjayBpbiBFaW56ZWx0ZWlsZS4KKworCQktPgktIFJ1ZmUgaW4gZGVtIHVudGVyc3RlbiBPYmpla3QgZGllIGhpbnRlciBkZW0KKwkJCSAgUGZlaWwgc3RlaGVuZGUgRnVua3Rpb24gYXVmLiBVZWJlcmdlYmUgYWxsZQorCQkJICBkZW0gT2JqZWt0IGZvbGdlbmRlbiBFbGVtZW50ZSBhbHMgUGFyYW1ldGVyLgorCQktLT4JLSBEaXRvLiBMZWdlIGFiZXIgZGFzIEVyZ2VibmlzIHdpZWRlciBhdWYKKwkJCSAgYXVmIGRlbSBTdGFjayBhYi4KKwkJCSAgKEhpbGZlIGlzdCB1bnRlciBkZW0gQmVncmlmZiAiY2FsbCIgenUgZmluZGVuLikKKworCQktKgktIFJ1ZmUgZGllIGhpbnRlciBkZW0gLSogc3RlaGVuZGUgZWZ1biBhdWYuCisJCQkgIHVlYmVyZ2liIGFsbGUgU3RhY2tlbGVtZW50ZSBhbHMgUGFyYW1ldGVyLgorCQktLSoJLSBEaXRvIG1pdCBFcmdlYm5pc3J1ZWNrZ2FiZS4KKwkJCSAgKEhpbGZlIHVudGVyIGRlbSBCZWdyaWZmICJjYWxsZWZ1biIuKQorCisJCUAJLSBGdWVocmUgZGVuIExQQy1Db2RlIGhpbnRlciBkZW0gS2xhbW1lcmFmZmVuIGF1cy4KKwkJQEAJLSBEaXRvIG1pdCBSZXR1cm53ZXJ0LgorCQkJICAoSGlsZmUgdW50ZXIgImV2YWx1YXRlIi4pCisKKwlXaWUgZGllIEJlZmVobGUgaW0gZWluemVsbmVuIGZ1bmt0aW9uaWVyZW4sIGthbm4gbWFuIGR1cmNoCisJIjtoaWxmZSA8QmVmZWhsPiIgZXJmYWhyZW4uIFRoZW1hIGlzdCBpbSBBbGxnZW1lbmVpbmVuIGRlcgorCUJlZmVobHNuYW1lLiBCZWkgQXVzbmFobWVuIGJpdHRlIG9iZW4gbmFjaGxlc2VuLiA7LSkKKworCVZpZWwgU3Bhc3MgZGFtaXQKKwkJUnVtYXRhLCBkaWUgR29ldHRpbiBkZXIgTW9yZ2Vucm9ldGUuCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2V2YWx1YXRlIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9ldmFsdWF0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWY2ZTBhCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9ldmFsdWF0ZQpAQCAtMCwwICsxLDIyIEBACitCRUZFSEw6CisJZXZhbHVhdGUsIGV2YWwKKwkKK0FSR1VNRU5URToKKwlUT1MgLSBOYW1lIGVpbmVyIEZ1bmt0aW9uIGFscyBTdHJpbmcuCisJCitGVU5LVElPTjoKKwlEZXIgTmFtZSB3aXJkIHZvbiBTdGFjayBnZW5vbW1lbi4KKwlEZXIgdW50ZXIgTmFtZW4gZ2VzcGVpY2hlcnRlIFdlcnQgd2lyZCBhdXNnZXdlcnRldC4gRnVlciBub3JtYWxlCisJV2VydGUgYmVkZXV0ZXQgZGFzLCBkYXNzIHNpZSBhdWYgZGVuIFN0YWNrIGdlbGVndCB3ZXJkZW4uIEZ1bmt0aW9uZW4KKwl3ZXJkZW4gYXVzZ2V3ZXJ0ZXQuCisJCitCRUlTUElFTDoKKwksIVEgITEgcGwgITAgLT5RdWVyeVByb3AKKwkscnVtYXRhIHRpdGxlIFEKKwkJbGllZmVydCBkaXJla3QgZGVuIFRpdGVsLgorCSxydW1hdGEgdGl0bGUgIlEiIGV2YWwKKwkJdHV0IGRhcyBzZWxiZSwgbnVyIGRhcyAiUSIgYWxzIFN0cmluZworCQl6d2lzY2hlbmR1cmNoIGF1ZiBkZW0gU3RhY2sgbGllZ3QuCisKK1NJRUhFIEFVQ0g6CisJImZ1bmt0aW9uZW4iCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2Z1bmt0aW9uZW4gYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2Z1bmt0aW9uZW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVlN2Q3NQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvZnVua3Rpb25lbgpAQCAtMCwwICsxLDI1IEBACitCRUZFSEw6CisJIWZ1bmt0aW9uc25hbWUgdGV4dAorCQorQVJHVU1FTlRFOgorCXRleHQgLS0gZGVyICpnYW56ZSogUmVzdCBkZXIgWmVpbGUKKwkKK0ZVTktUSU9OOgorCUVyemV1Z2UgYXVzIHRleHQgZWluZSBuZXVlIEZ1bmt0aW9uIG1pdCBkZW0gYW5nZWdlYmVuZW4gTmFtZW4uIERpZXNlcgorCU5hbWUgaXN0IGFscyBuZXVlciBCZWZlaGwgaW5uZXJoYWxiIGRlciBUZWxsZXIgYmVudXR6YmFyIHdpZSBkaWUKKwllaW5nZWJhdXRlbiBCZWZlaGxlLgorCVdpcmQgZWluIEJlZmVobCBhdXNnZWZ1ZWhydCwgYmVrb21tdCBlciBhdWYgZWluZW0gbmV1ZW4gU3RhY2sgc2VpbmUKKwlQYXJhbWV0ZXIgdWViZXJnZWJlbi4gV2FzIGFtIEVuZGUgZGVzIEZ1bmt0aW9uc2F1ZnJ1ZmVzIGF1ZiBkZW0KKwlTdGFjayBsZWd0LCB3aXJkIGRhbm4gYXVmIGRlbiB1cnNwcnVlbmdsaWNoZW4gYWJnZWxlZ3QuCisKK0JFSVNQSUVMOgorCSwhUXVlcnkgITEgcGwgITAgLS0+UXVlcnlQcm9wCisJRGVmaW5pZXJlIGRpZSBGdW5rdGlvbiAiUXVlcnkiLCBzaWUgaGF0IHp3ZWkgUGFyYW1ldGVyICghMCB1bmQgITEpLAorCXdvYmVpICEwIGRlciBUT1MgaXN0LgorCSxydW1hdGEgdGl0bGUgUXVlcnkKKwkJTGllZmVydCBkYW5uIGRlbiBUaXRlbCB2b24gUnVtYXRhIGF1ZiBkZW0gU3RhY2sgenVydWVjaywgZGEKKwkJYW0gRW5kZSBkZXIgQXVzd2VydHVuZyBkaWVzZXIgYXVmIGRlbSBTdGFjayBsaWVnZW4gd3VlcmRlLgorCSwhRGVtbyAhMSBzdGsKKwksMSAyIDMgNCBEZW1vCisJCVplaWd0IGVpbmVuIFN0YWNrIGF1ZiBkZW0gZGFzIHp3ZWl0b2JlcnN0ZSBFbGVtZW50IHZvbiBkZW0KKwkJdXJzcHJ1bmdzc3RhY2sgbGllZ3Q7IGluIGRpZXNlbSBGYWxsIGFsc28gMy4KZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvaGlsZmUvZ2VuZXJhbCBiL29iai90b29scy90ZWxsZXIvaGlsZmUvZ2VuZXJhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjZkNzQzCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9nZW5lcmFsCkBAIC0wLDAgKzEsMTcgQEAKK0RhcyBzaW5kIGRpZSBCZWZlaGxlLCBkaWUgZGllIG1hZ2lzY2hlbiBUZWxsZXIgenVyIFplaXQgYmVoZXJyc2NoZW46CisoTGV0enRlIEFlbmRlcnVuZyBhbSAyMC4wMS4xOTk1IGFuIGRlbiBtaXQgJSBtYXJraWVydGVuIEZ1bmt0aW9uZW4sCitkaWUgbWl0ICogc2luZCBuZXUhIEFCIEpFVFpUIEdJQlQgRVMgQVVDSCBGVU5LVElPTkVOISApCisKK2FycmF5ICAgICAgIGRlc3RydWN0ICAgIGhlcmUgICAgICAgIG1lbW9yeSUgICAgIHJla2ludiAgICAgIHNwbGl0CitjYWxsICAgICAgICBkdW1wKiAgICAgICBpZiogICAgICAgICBtZXNzYWdlICAgICByZW1vdmUgICAgICBzdGFjaworY2FsbGVmdW4gICAgZHVwICAgICAgICAgaW52ICAgICAgICAgbW92ZSAgICAgICAgcmVzdG9yZSogICAgc3dhcAorY2FsbG91dHMgICAgZWlubGVpdHVuZyAgbGl2aW5nICAgICAgbmFtZXMgICAgICAgcnVwZGF0ZSAgICAgdG9kbworY2xlYW5vZiAgICAgZXZhbHVhdGUqICAgbG9jayAgICAgICAgb2JqZWN0ICAgICAgc2F5ICAgICAgICAgdG9wCitjbGVhciAgICAgICBGVU5LVElPTkVOKiBscGMgICAgICAgICBwbGF5ZXIgICAgICBzY2FuICAgICAgICB1cGRhdGUKK2Nsb25lICAgICAgIGdlbmVyYWwgICAgIG1lICAgICAgICAgIHBvcCAgICAgICAgIHNub29wICAgICAgIHZhcnMKKworTWl0ICIsaGlsZmUgPEJlZmVobD4iIGthbm5zdCBEdSBJbmZvcm1hdGlvbmVuIHp1IGRlbiBCZWZlaGxlbiBhYmZyYWdlbi4KK1dlbm4gRHUgZ2Fybml4IHZlcnN0ZWhzdCwgZGFubiB2ZXJzdWNoZSBtYWwgIixoaWxmZSBlaW5sZWl0dW5nIi4gOi0pCisKK1dJQ0hUSUc6IERhcyBTZW1pa29sb24gd2lyZCBuaWNodCBtZWhyIHVudGVyc3R1ZXR6dCwgc3RhdHRkZXNzZW4KKwlrYW5uIG51ciBub2NoIGRhcyBLb21tYSBiZW51dHp0IHdlcmRlbi4KZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvaGlsZmUvaGVyZSBiL29iai90b29scy90ZWxsZXIvaGlsZmUvaGVyZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGViZGY2Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9oZXJlCkBAIC0wLDAgKzEsOCBAQAorQkVGRUhMOgorCWhlcmUKKworQVJHVU1FTlRFOgorCUtlaW5zCisKK0ZVTktUSU9OOgorCUxlZ2UgZGVuIFJhdW0sIGluIG1hbiBzaWNoIGJlZmluZGV0IG9iZW4gYXVmIGRlbiBTdGFjay4KZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvaGlsZmUvaWYgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5OTQ3MTcKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2lmCkBAIC0wLDAgKzEsMjIgQEAKK0JFRkVITDoKKwlpZgorCQorQVJHVU1FTlRFOgorCXdlbm4gc29uc3QgYmVkaW5ndW5nKFRPUykKKwkKK0ZVTktUSU9OOgorCVdlbm4gZGVyIFRPUyBOdWxsIGlzdCwgbGllZmVyZSBkYXMgZHJpdHRvYmVyc3RlIEVsZW1lbnQgdm9tIFN0YWNrLAorCXNvbnN0IGRhcyB6d2VpdG9iZXJzdGUuIERpZXNlciBCZWZlaGwgaXN0IGluc2Jlc29uZGVyZSBpbSBadXNhbW1lbi0KKwloYW5nIG1pdCAiZXZhbHVhdGUiIGludGVyZXNzYW50LgorCQorQkVJU1BJRUw6CisJLCJibGEiICJibHViYiIgMCBpZgorCQlMaWVmZXJ0ICJibHViYiIKKwksImJsYSIgImJsdWliYiIgMSBpZgorCQlMaWVmZXJ0ICJibGEiCisJLCJRIiAiUiIgdGVzdCBpZiBldmFsdWF0ZQorCQlXZXJ0ZSBRIGF1cywgd2VubiBkZXIgV2VydCAidGVzdCIgbmljaHQgbnVsbCBpc3QuCisJCUFuZGVyZW5mYWxscyB3ZXJ0ZSBSIGF1cy4KKworU0lFSEUgQVVDSDoKKwkiZXZhbHVhdGUiLCAiZnVua3Rpb25lbiIKZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvaGlsZmUvaW52IGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9pbnYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk0MzgwMAotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvaW52CkBAIC0wLDAgKzEsMTcgQEAKK0JFRkVITDoKKwlpbnYKKworQVJHVU1FTlRFOgorCVRPUworCitGVU5LVElPTjoKKwlHZWJlIGFsbGUgT2JqZWt0ZSBhbiwgZGllIHNpY2ggaW4gZGVtIE9iamVrdCBUT1MgYmVmaW5kZW4uCisJR2liIGVpbmVuIEZlaGxlciBhdXMsIHdlbm4gVE9TIGtlaW4gT2JqZWt0IGlzdC4KKwlUT1MgYmxlaWJ0IGF1ZiBkZW0gU3RhY2ssIGRhIGRpZXNlciBCZWZlaGwgbWVpc3RlbnMgZGF6dSBiZW51dHp0CisJd2lyZCwgZWluIE9iamVrdCBhdWYgZGVuIFN0YWNrIHp1IGxlZ2VuIHVuZCBkYW5uIGJlc3RpbW10ZQorCU9iamVrdGUgaW4gaWhtIHp1IHN1Y2hlbiwgdW5kIGRhbm4gZGllc2UgenUgaG9sZW4uCisKK0JFSVNQSUVMRToKKwksbWUgaW52CisJRGFubiBzaWVodCBtYW4gLi4uLiAiLjIgL2JsYS9ibGEvYmxhL29iamVrdCIgdW5kIG1hbiBrYW5uIGRhbm4KKwltaXR0ZWxzICwuMiBkaWVzZXMgT2JqZWt0IGhvbGVuLgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9saXZpbmcgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2xpdmluZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDYwNmE3Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9saXZpbmcKQEAgLTAsMCArMSwxNyBAQAorQkVGRUhMOgorCWxpdmluZywgbHYKKworQVJHVU1FTlRFOgorCVRPUyAtLSBOYW1lIGVpbmVzIE1vbnN0ZXJzCisKK0ZVTktUSU9OOgorCUhvbGUgZWluZW4gTmFtZW4gdm9tIFN0YWNrIHVuZCBsZWdlIHN0YXR0ZGVzc2VuIGRhcyBlbnRzcHJlY2hlbmRlCisJTW9uc3Rlcm9iamVrdCBhdWYgZGVuIFN0YWNrLiBHZWJlIGVpbmUgRmVobGVybWVsZHVuZyBhdXMsIHdlbm4ga2VpbgorCWRlcmFydGlnZXMgTW9uc3RlciB2b3JoYW5kZW4gaXN0LgorCitCRUlTUElFTEU6CisJLCJvcmsiIGxpdmluZworCVN1Y2h0IGRlbiBlcnN0YmVzdGVuIE9yay4KKworU0lFSEUgQVVDSDoKKwkib2JqZWN0IiwgInBsYXllciIKZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvaGlsZmUvbG9jayBiL29iai90b29scy90ZWxsZXIvaGlsZmUvbG9jawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDcwZGIzCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9sb2NrCkBAIC0wLDAgKzEsMjYgQEAKK0JFRkVITDoKKwksCisKK0FSR1VNRU5URToKKwlLZWluZQorCitGVU5LVElPTjoKKwlMZWdlIGVpbmVuICdMb2NrJyBhdWYgZGVtIFN0YWNrIGFiLiBBbmhhbmQgZWluZXMgTG9ja3MgZXJrZW5uZW4KKwlGdW5rdGlvbmVuLCBkaWUgZWluZSB2YXJpYmFsZSBBbnphaGwgdm9uIEFyZ3VtZW50ZW4gdm9tIFN0YWNrCisJbmVobWVuIGtvZW5uZW4sIHdpZXZpZWxlIGRlciBBcmd1bWVudGUgZnVlciBzaWUgYmVzdGltbXQgc2luZC4KKworCVdpY2h0aWc6IERhcyBLb21tYSBhbSBBbmZhZyBqZWRlciBFaW5nYWJlemVpbGUgaXN0IEtFSU4gTG9jay4KKworQkVJU1BJRUxFOgorCSxtZSwgMSAyIDMgYXJyYXkKKwkJRXMgd2VyZGVuIG51ciBkaWUgWmFobGVuIDEgMiB1bmQgMyBpbiBkYXMgQXJyYXkgYXVmZ2Vub21tZW4sCisJCW5pY2h0IGRlciBTcGllbGVyIHNlbGJzdC4gQXVmIGRlbSBTdGFjayBsaWVnZW4gbmFjaGVyIGRlcgorCQlTcGllbGVyIHVuZCBkYXMgQXJyYXkuCisJLGhlcmUsIG1lICJydW1hdGEiIC0+aWQKKwkJImlkIiB3aXJkIGltIFNwaWVsZXIgbWl0IGVpbmVtIEFyZ3VtZW50ICgicnVtYXRhIikgYXVmZ2VydWZlbi4KKwksaGVyZSBtZSAicnVtYXRhIiAtPmlkCQorCQlIaWVyIHdpcmQgZGllIEZ1bmt0aW9uIGltIFJhdW0gbWl0IHp3ZWkgQXJndW1lbnRlbiBhdWZnZXJ1ZmVuLAorCQl3YXMgaGllciBuYXR1ZXJsaWNoIGtlaW5lbiBTaW5uIG1hY2h0LgorCitTSUVIRSBBVUNIOgorCSJhcnJheSIsICJzcGxpdCIsICJjYWxsIiwgImNhbGxlZnVuIiwgImV2YWx1YXRlIgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9scGMgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2xwYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmEwZTAxCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9scGMKQEAgLTAsMCArMSwyMSBAQAorQkVGRUhMOgorCUAgdGV4dAorCUBAIHRleHQKKwkKK0FSR1VNRU5URToKKwl0ZXh0IC0tIGRlciBnYW56ZSghKSBSZXN0IGRlciBFaW5nYWJlemVpbGUuCisJRGVyIFN0YWNrIGJpcyB6dW0gbGV0enRlbiBMb2NrLgorCQorRlVOS1RJT046CisJRnVlaHJlIGRlbiBMUEMtQ29kZSA8dGV4dD4gZGlyZWt0IGF1cy4gRGFiZWkga29lbm5lbiBkaWUgQXJndW1lbnRlCisJdm9tIFN0YWNrIG1pdCBAPG51bW1lcj5AIGVpbmdlc2V0enQgd2VyZGVuLiBXaWNodGlnLCB3ZW5uIG1hbiBlaW4KKwlFcmdlYm5pcyB3ZWl0ZXJiZXJlY2huZW4gd2lsbCwgbXVzcyBtYW4gYXVjaCBlaW4gJ3JldHVybicgdW0KKwlMUEMtQ29kZSBiZW51dHp0IGhhYmVuLgorCisJQmVpIGRlciBBdXNmdWVocnVuZyB3ZXJkZW4gbmljaHQgYWxsZSBJbmNsdWRlLURhdGVpZW4gZWluZ2VsYWRlbi4KKwkKK0JFSVNQSUVMOgorCSxtZSBAIHdyaXRlKCBAMEAtPm5hbWUoV0VSKSsiXG4iICkKKwlHaWJ0IERlaW5lbiBOYW1lbiBhdXMuCisJLG1lIEBAIHJldHVybiBAMEAtPm5hbWUoV0VSKQorCUdpYnQgZGVuIE5hbWVuIHp1cnVlY2sgdW5kIGxlZ3QgaWhuIGF1ZiBkZW4gU3RhY2suCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL21lIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9tZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODYxZjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9tZQpAQCAtMCwwICsxLDggQEAKK0JFRkVITDoKKwltZQorCitBUkdVTUVOVEU6CisJS2VpbmUKKworRlVOS1RJT046CisJTGVnZSBkZW4gRWlnZW50dWVtZXIgKERpY2ghKSBvYmVuIGF1ZiBkZW4gU3RhY2suCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL21lbW9yeSBiL29iai90b29scy90ZWxsZXIvaGlsZmUvbWVtb3J5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMTI0NTEKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL21lbW9yeQpAQCAtMCwwICsxLDE1IEBACitCRUZFSEw6CisJbWVtb3J5LCBtZW0KKworQVJHVU1FTlRFOgorCUtlaW5lCisKK0ZVTktUSU9OOgorCVplaWdlIGRlbiBJbmhhbHQgYWxsZXIgVmFyaWFibGVuIGFuLCBkaWUgbWFuIGFuZ2VsZWd0IGhhdC4KKwlOb3JtYWxlcndlaXNlIHdpcmQgZGVyIEluaGFsdCBpbiBkZXIgRm9ybSBOYW1lID0gSW5oYWx0IGFuZ2V6ZWlndC4KKwlJc3QgdW50ZXIgZGVtIE5hbWVuIGVpbmUgRnVua3Rpb24gZ2VzcGVpY2hlcnQsIHdpcmQKKwkJTmFtZSA+IEluaGFsdAorCWFuZ2V6ZWlndCwgdW0gRnVua3Rpb25lbiB2b24gU3RyaW5ncyB1bnRlcnNjaGVpZGVuIHp1IGtvZW5uZW4uCisKK1NJRUhFIEFVQ0g6CisJInZhcnMiLCAiZnVua3Rpb25lbiIKZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvaGlsZmUvbWVzc2FnZSBiL29iai90b29scy90ZWxsZXIvaGlsZmUvbWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTZkOTRhCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9tZXNzYWdlCkBAIC0wLDAgKzEsMTMgQEAKK0tPTU1BTkRPOgorCW1lc3NhZ2UgW3RvIDxzcGllbGVyPl0KKwltc2cgW3RvIDxzcGllbGVyPl0KKworRlVOS1RJT046CisJV2VubiBtYW4gZ2FuemUgVGV4dGJsb2Vja2Ugc2FnZW4gbW9lY2h0ZSwga2FubiBtYW4gZGFzIG1pdCBkaWVzZW0KKwlCZWZlaGwgdHVuLiBOYWNoIEVpbmdhYmUgdm9uICdtZXNzYWdlJyB3aXJkIGplZGUgRWluZ2FiZSBkaXJla3QgZnVlcgorCWFsbGUgaW0gUmF1bSBzaWNodGJhciBvZGVyIGZ1ZXIgZGVuIGFuZ2VnZWJlbmVuIFNwaWVsZXIgYXVzZ2VnZWJlbi4KKwlNaXQgJyoqJyBrYW5uIG1hbiB3aWVkZXIgYXVmIG5vcm1hbGUgRWluZ2FiZSB6dXJ1ZWNrc2NoYWx0ZW4uCisKK0FDSFRVTkc6CisJRGllc2VyIEJlZmVobCBnZWhvZXJ0IG5pY2h0IHp1IGRlbmVuLCBkaWUgbWl0dGVscyAnLCcgZWluZ2VsZWl0ZXQKKwl3ZXJkZW4uCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL21vdmUgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL21vdmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE4MWMzNAotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvbW92ZQpAQCAtMCwwICsxLDE0IEBACitCRUZFSEw6CisJbW92ZSwgbXYKKworQVJHVU1FTlRFOgorCW9iaiAtLSBPYmpla3QsIGRhcyBiZXdlZ3Qgd2VyZGVuIHNvbGwuCisJemllbChUT1MpIC0tIFJhdW0sIGluIGRlbiBkYXMgT2JqZWt0IHNvbGwKKworRlVOS1RJT046CisJQmV3ZWdlIGRhcyBPYmpla3QgaW4gZGVuIGFuZ2VnZWJlbmVuIFJhdW0uIERpZSBtZWlzdGVuIFNpY2hlcnVuZ2VuCisJd2VyZGVuIGJlaSBkaWVzZW0gVmVyc2NoaXVlYmVuIHVtZ2FuZ2VuLCBhbHNvIHZvcnNpY2h0IQorCitCRUlTUElFTEU6CisJLG1lICJ+L3dvcmtyb29tIiBvYiBtdgorCQlNYW4gZ2VodCBpbiBkZW4gZWlnZW5lbiBXb3Jrcm9vbS4KZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvaGlsZmUvbmFtZXMgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL25hbWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZWJjM2IKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL25hbWVzCkBAIC0wLDAgKzEsMTcgQEAKK0JFRkVITDoKKwluYW1lcywgbmFtCisKK0FSR1VNRU5URToKKwlrZWluZQorCitGVU5LVElPTjoKKwlOb3JtYWxlcndlaXNlIHdlcmRlbiBkZXIgRmlsZW5hbWUgdW5kIGRlciBOYW1lIChRdWVyeVByb3AoUF9OQU1FKSkKKwlhbmdlemVpZ3QsIHdlbm4gbWFuIGRlbiBTdGFjayBvZGVyIGFlaG5saWNoZXMgYmV0cmFjaHRldC4KKwlNaXQgZGllc2VtIEJlZmVobCBzY2hhbHRldCBtYW4gZGVuIE5hbWVuIGF1cyBvZGVyIGFuLgorCisJRHVyY2ggQW5zY2hhdWVuIGRlciBUZWxsZXIga2FubiBtYW4gZmVzdHN0ZWxsZW4sIG9iIGRpZSBOYW1lbiBvZGVyCisJbnVyIGRpZSBGaWxlbmFtZW4gYW5nZXplaWd0IHdlcmRlbi4KKworU0lFSEUgQVVDSDoKKwkiaW52IiwgInN0YWNrIiwgIm1vdmUiLCAidG9wIiwgLi4uCisJQW5kZXJlIFNjaGFsdGVyOiAic2F5IiwgImluZm9ybSIKZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvaGlsZmUvb2JqZWN0IGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9vYmplY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ1YjMwYQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvb2JqZWN0CkBAIC0wLDAgKzEsMjIgQEAKK0JFRkVITDoKKwlvYmplY3QsIG9iCisKK0FSR1VNRU5URToKKwlUT1MgLS0gTmFtZSBlaW5lcyBPYmpla3RlcworCitGVU5LVElPTjoKKwlIb2xlIGVpbmVuIE5hbWVuIHZvbSBTdGFjayB1bmQgbGVnZSBzdGF0dGRlc3NlbiBkYXMgZW50c3ByZWNoZW5kZQorCU9iamVrdCBhdWYgZGVuIFN0YWNrLiBGYWxscyBlcyBrZWluIGdlbGFkZW5lcyBPYmpla3QgZGllc2VzIE5hbWVucywKKwl3b2hsIGFiZXIgZWluZSAobmljaHQgZ2VsYWRlbmUpIEJsdWVwcmludCwgc28gd2lyZCBkaWVzZSBnZWxhZGVuCisKK0JFSVNQSUVMRToKKwksInBsYXllcnMvcnVtYXRhL3dvcmtyb29tIiBvYgorCU1hY2h0IGRhcyBzZWxiZSB3aWUgJywvcGxheWVycy9ydW1hdGEvd29ya3Jvb20nLCBkYSBkaWUgVGVsbGVyCisJRmlsZW5hbWVuIGF1dG9tYXRpc2NoIHp1IGVya2VubmVuIHZlcnN1Y2hlbi4KKwksIn5ydW1hdGEvd29ya3Jvb20iIG9iCisJZ2VodCBhdWNoLgorCSwifi93b3Jrcm9vbSIgb2IKKwlsaWVmZXJ0IGRlbiBlaWdlbmVuIFdvcmtyb29tLgorCitTSUVIRSBBVUNIOgorCSJsaXZpbmciLCAicGxheWVyIgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9wbGF5ZXIgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3BsYXllcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmNhYTE2Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9wbGF5ZXIKQEAgLTAsMCArMSwyMSBAQAorQkVGRUhMOgorCXBsYXllciwgcGwKKworQVJHVU1FTlRFOgorCVRPUyAtLSBOYW1lIGVpbmVzIFNwaWVsZXJzCisKK0ZVTktUSU9OOgorCUhvbGUgZWluZW4gTmFtZW4gdm9tIFN0YWNrIHVuZCBsZWdlIHN0YXR0ZGVzc2VuIGRhcyBlbnRzcHJlY2hlbmRlCisJU3BpZWxlcm9iamVrdCBhdWYgZGVuIFN0YWNrLgorCisJQW0gRW5kZSBkZXMgU3BpZWxlcm5hbWVucyBpc3QgZWluIFN0ZXJuICgnKicpIGFscyBXaWxkY2FyZCBlcmxhdWJ0LgorCURpZSBOYW1lbiBuaWNodCBlaW5nZWxvZ2d0ZXIgU3BpZWxlciBtdWVzc2VuIGluIGplZGVtIEZhbGwgYXVzZ2UtCisJc2NocmllYmVuIHdlcmRlbi4KKworCitCRUlTUElFTEU6CisJLCJydW1hdGEiIHBsCisJTGVndCBSdW1hdGEgYXVmIGRlbiBTdGFjay4KKworU0lFSEUgQVVDSDoKKwkibGl2aW5nIiwgIm9iamVjdCIKZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvaGlsZmUvcG9wIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9wb3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMwZGMwOAotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvcG9wCkBAIC0wLDAgKzEsOCBAQAorQkVGRUhMOgorCXBvcAorCitBUkdVTUVOVEU6CisJVE9TCisKK0ZVTktUSU9OOgorCU5pbW0gZGFzIG9iZXJzdGUgRWxlbWVudCB2b20gU3RhY2suCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3Jla2ludiBiL29iai90b29scy90ZWxsZXIvaGlsZmUvcmVraW52Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNTFiZDIKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3Jla2ludgpAQCAtMCwwICsxLDEyIEBACitCRUZFSEw6CisJcmVraW52CisKK0FSR1VNRU5URToKKwlUT1MKKworRlVOS1RJT046CisJRGllc2VyIEJlZmVobCBtYWNoIGRhcyBzZWxiZSB3aWUgImludiIsIHplaWd0IGFiZXIgcmVrdXJzaXYKKwlhdWNoIGRlbiBJbmhhbHQgZGVyIGVudGhhbHRlbmVuIE9iamVrdGUgYW4uCisKK1NJRUhFIEFVQ0g6CisJImludiIKZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvaGlsZmUvcmVtb3ZlIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9yZW1vdmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZmMjQzNwotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvcmVtb3ZlCkBAIC0wLDAgKzEsMTYgQEAKK0JFRkVITDoKKwlyZW1vdmUsIHJlbQorCitBUkdVTUVOVEU6CisJVE9TCisKK0ZVTktUSU9OOgorCVplcnN0b2VyZSBkYXMgT2JqZWt0IGF1ZiBkZW0gVE9TLiBHaWIgZGVtIE9iamVrdCBkaWUgR2VsZWdlbmhlaXQsCisJQXVmcmFldW1hcmJlaXRlbiBkdXJjaHp1ZnVlaHJlbi4KKworQkVJU1BJRUxFOgorCSxtZSByZW1vdmUKKwlNYW4gbG9nZ3Qgc2ljaCBzZWxiZXIgYXVzLgorCitTSUVIRSBBVUNIOgorCSJkZXN0cnVjdCIKZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvaGlsZmUvcmVzdG9yZSBiL29iai90b29scy90ZWxsZXIvaGlsZmUvcmVzdG9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDIwYTM1Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9yZXN0b3JlCkBAIC0wLDAgKzEsMTUgQEAKK0JFRkVITDoKKwlyZXN0b3JlCisJCitBUkdVTUVOVEU6CisJa2VpbnMgb2RlcgorCVRPUyAtLSBmaWxlbmFtZQorCQorRlVOS1RJT046CisJTGFkZSBkaWUgaW4gZGVyIERhdGVpIGdlc3BlaWNoZXJ0ZW4gRnVua3Rpb25lbi4gV2lyZCBrZWluIEZpbGVuYW1lCisJYW5nZWdlYmVuLCBzbyB3aXJkIGRpZSBEYXRlaSB+Ly5tZW1vcnkubyBhdXNnZWxlc2VuLgorCisJRXMga29lbm5lbiBudXIgRnVua3Rpb25lbiBhYmdlc3BlaWNoZXJ0IG9kZXIgZ2VsYWRlbiB3ZXJkZW4hCisKK1NJRUhFIEFVQ0g6CisJImZ1bmt0aW9uZW4iLCAiZHVtcCIsICJtZW1vcnkiCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3J1cGRhdGUgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3J1cGRhdGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVmMDMzZQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvcnVwZGF0ZQpAQCAtMCwwICsxLDI1IEBACitCRUZFSEw6CisJcm9vbXVwZGF0ZSwgcnVwZGF0ZSwgcnVwZCwgcnVwCisKK0FSR1VNRU5URToKKwlUT1MKKworRlVOS1RJT046CisJWmVyc3RvZXJlIGRlbiBSYXVtIHVuZCBsYWRlIGlobiBuZXUsIGRhbWl0IEFlbmRlcnVuZ2VuIGRlciBGaWxlcworCWFrdGl2IHdlcmRlbiBrb2VubmVuLiBTb3JnZSBkYWZ1ZXIsIGRhc3MgZGllIE9iamVrdGUgaW4gZGVtIGFsdGVuIFJhdW0KKwlpbiBkZW4gbmV1ZW4gaGludWViZXJnZXJldHRldCB3ZXJkZW4uIChEaWVzZSBFaWdlbnNjaGFmdCBrYW5uIG1pdHRlbHMKKwlkZXMgU3Rlcm5jaGVucyAoJyonKSBhYmdlc2NoYWx0ZXQgd2VyZGVuLikKKwkKKwlHZWJlIGRlbSBSYXVtIGplZG9jaCBHZWxlZ2VuaGVpdCwgQXVmcmFldW1hcmJlaXRlbiB6dSB0YWV0aWdlbi4gU29sbAorCWRlciBSYXVtIHdpcmtsaWNoIGhhcnQgemVyc3RvZXJ0IHdlcmRlbiwgc28gaXN0IGVpbiBSdWZ6ZWljaGVuIGFuIGRlbgorCUJlZmVobCBhbnp1aGFlbmdlbi4gKGFsc28gYHJ1cGRhdGUhJywgZWluIFN0ZXJuIG11c3Mgdm9yIGRlbSBSdWZ6ZWljaGVuCisJc3RlaGVuLCBhbHNvIGBydXBkYXRlKiEnIHVuZCBuaWNodCBgcnVwZGF0ZSEqJy4pCisJV2ljaHRpZzogUmFldW1lLCBkaWUga2VpbmUgQmx1ZXByaW50IHNpbmQsIGtvZW5uZW4gbmljaHQgbWl0IGRpZXNlbQorCUJlZmVobCBha3R1YWxpc2llcnQgd2VyZGVuLgorCitCRUlTUElFTEU6CisJLGhlcmUgcnVwZGF0ZQorCUFrdHVhbGlzaWVydCBkZW4gUmF1bSwgaW4gZGVtIGRlciBNYWdpZXIgc2ljaCBiZWZpbmRldC4KKworU0lFSEUgQVVDSDoKKwkidXBkYXRlIgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9zYXkgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3NheQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjIzMzU3Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9zYXkKQEAgLTAsMCArMSwxNyBAQAorQkVGRUhMOgorCXNheQorCitBUkdVTUVOVEU6CisJa2VpbmUKKworRlVOS1RJT046CisJU2NoYWx0ZSBkaWUgTWVsZHVuZywgZGllIGFuZGVyZSBTcGllbGVyIGJla29tbWVuLCB3ZW5uIG1hbgorCW1pdCBkZW4gVGVsbGVybiBhcmJlaXRldCwgYXVzIG9kZXIgYW4uCisKKwlJc3QgbWFuIHVuc2ljaHRiYXIsIGdpYnQgZXMgaW4ga2VpbmVtIEZhbGwgZWluZSBNZWxkdW5nLgorCisJRHVyY2ggQW5zY2hhdWVuIGRlciBUZWxsZXIga2FubiBtYW4gZmVzdHN0ZWxsZW4sIG9iIE1pc3BpZWxlcgorCWRpZSBNZWxkdW5nZW4gYmVrb21tZW4uCisKK1NJRUhFIEFVQ0g6CisJIm5hbWVzIiwgImluZm9ybSIKZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvaGlsZmUvc2NhbiBiL29iai90b29scy90ZWxsZXIvaGlsZmUvc2NhbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzI1MWZkCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9zY2FuCkBAIC0wLDAgKzEsMTcgQEAKK0JFRkVITDoKKwlzY2FuCisKK0FSR1VNRU5URToKKwlUT1MKKworRlVOS1RJT046CisJV2VubiBkZXIgVE9TIGVpbiBTcGllbGVyIG9kZXIgZWluIE1vbnN0ZXIgaXN0LCBzbyBnaWIgZGllCisJc3BpZWxyZWxldmFudGVuIEluZm9ybWF0aW9uZW4genUgaWhtIGF1cy4gV2VubiBkZXIgVE9TIGVpbgorCVN0cmluZyBpc3QsIHNvIHdpcmQgZGVyIFNwaWVsZXIgbWl0IGRpZXNlbSBOYW1lbiBnZXN1Y2h0LgorCitCRUlTUElFTEU6CisJLG1lIHNjYW4KKwksImpvZiIgcGwgc2NhbiAob2RlciBrdWVyemVyOiA7ImpvZiIgc2NhbikKKworU0lFSEUgQVVDSDoKKwkicGxheWVyIgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9zbm9vcCBiL29iai90b29scy90ZWxsZXIvaGlsZmUvc25vb3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJlMTMwMAotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvc25vb3AKQEAgLTAsMCArMSwxMSBAQAorQkVGRUhMRToKKwlzbm9vcAorCitBUkdVTUVOVEU6CisJa2VpbmUKKworRlVOS1RJT046CisJWmVpZ2UgbGF1ZmVuZGUgU25vb3B2b3JnYWVuZ2UgYW4uCisKKwlXZW5uIGRlciBTbm9vcGVyIGVpbmVuIGhvZWhlcmVuIE1hZ2llcmxldmVsIGFscyBtYW4gc2VsYnN0IGhhdCwKKwl3aXJkIGRlciBTbm9vcCBuaWNodCBhbmdlemVpZ3QuCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3NwbGl0IGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9zcGxpdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTkwMjVhCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9zcGxpdApAQCAtMCwwICsxLDE0IEBACitCRUZFSEw6CisJc3BsaXQsIHNwbAorCitBUkdVTUVOVEU6CisJVE9TCisKK0ZVTktUSU9OOgorCVplcmxlZ2UgZGVuIEFycmF5LCBkZXIgYXVmIGRlbSBTdGFjayBsaWVndCB1bmQgbGVnZSBkaWUKKwllaW56ZWxuZW4gRWxlbWVudGUgKGRhcyBFbGVtZW50IG1pdCBJbmRleCAwIHp1dW50ZXJzdCkKKwlhdWYgZGVtIFN0YWNrIGFiLiBXZW5uIGRlciBTdGFjayB2b3JoZXIgbmljaHQgbGVlciB3YXIsCisJbGVnZSB2b3JoZXIgZWluIExvY2sgYXVmIGRlbiBTdGFjay4KKworU0lFSEUgQVVDSDoKKwkiYXJyYXkiLCAibG9jayIKZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvaGlsZmUvc3RhY2sgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3N0YWNrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZjE4MmUKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3N0YWNrCkBAIC0wLDAgKzEsMTggQEAKK0JFRkVITDoKKwlzdGFjaywgc3RrCisJCitBUkdVTUVOVEU6CisJU1RBQ0sKKwkKK0ZVTktUSU9OOgorCVplaWdlIGFsbGUgRGluZ2UgYW4sIGRpZSBhdWYgZGVtIFN0YWNrIGxpZWdlbi4KKwkKK0JFSVNQSUVMOgorCSxtZSBoZXJlOyAxIDIgYXJyYXkgc3RrCisJRXJnaWJ0ICh6dW0gQmVpc3BpZWwpOgorCTA6ICh7CisJICAgICAxCisJICAgICAyCisJICAgfSkKKwkxOiAvcm9vbS9naWxkZSAoZWluIFJhdW0pCisJMjogL3N0ZC9zaGVsbHMvbWFnaWVyIzc2OTEgKEF0YW11cikKZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvaGlsZmUvc3dhcCBiL29iai90b29scy90ZWxsZXIvaGlsZmUvc3dhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWZhZmUzCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9zd2FwCkBAIC0wLDAgKzEsOCBAQAorQkVGRUhMOgorCXN3YXAKKworQVJHVU1FTlRFOgorCURpZSBvYmVyc3RlbiAyIFN0YWNrZWxlbWVudGUuCisKK0ZVTktUSU9OOgorCVZlcnRhdXNjaGUgZGllIGJlaWRlbiBvYmVyc3RlbiBFbGVtZW50ZSB2b20gU3RhY2suCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3RvZG8gYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3RvZG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYyY2VmYgotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvdG9kbwpAQCAtMCwwICsxLDE0IEBACitXYXMgbm9jaCBrb21tZW4gc29sbDoKKworCURva3UgdmVyYmVzc2VybiwgZGEgZWluZSBTdGFja21hY2hpbmUgbmljaHQgamVkZXJtYW5ucyBTYWNoZSBpc3QuCisJKHNjaG9uICIsaGlsZmUgZWlubGVpdHVuZyIgZ2VtYWNodD8pCisKKwlBbGxlcywgd2FzIG5pY2h0IHBsYXllciBpc3QsIGF1cyBkZW0gUmF1bSBoZXJhdXNyYWV1bWVuLgorCTxjbGVhbnVwPiA/CisKK1dhcyBOSUNIVCBrb21tZW4gc29sbDoKKworCUFsYXJtLCB3ZW5uIG1hbiBhbmdlc2NoYXV0IHdpcmQuIChXb3p1IGF1Y2g/IDotKQorCitXZWl0ZXJlIElkZWVuIHdlcmRlbiB2b24gUnVtYXRhIGdlcm5lIGVudGdlZ2VuZ2Vub21tZW4uCitBYmVyIGJpdHRlIG5pY2h0IGRhdWVybmQgYW5sYWJlcm4sIHNvbmRlcm4gYWxzIG1haWwgOi0pCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3RvcCBiL29iai90b29scy90ZWxsZXIvaGlsZmUvdG9wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMDdmYTkKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3RvcApAQCAtMCwwICsxLDIzIEBACitCRUZFSEw6CisJdG9wCisKK0FSR1VNRU5URToKKwlUT1MKKworRlVOS1RJT046CisJWmVpZ3QgZGFzIE9iamVrdCBhbiwgZGFzIGF1ZiBkZW0gU3RhY2sgenVvYmVyc3QgbGllZ3QgKD1UT1MpLgorCitCRUlTUElFTEU6CisJO21lIHRvcAorCVplaWdlIGRhcyBPYmpla3QsIGRhcyBtYW4gc2VsYnN0IGlzdCwgYW4uCisKKwk7aGVyZSB0b3AKKwlaZWlnZSBkZW4gUmF1bSwgaW4gZGVtIG1hbiBzaWNoIGJlZmluZGV0LgorCisJOzsgMSAyIDMgYXJyYXkgdG9wIChEYXMgendlaXRlICc7JyBpc3Qgd2ljaHRpZykKKwlFcmdpYnQ6CisJVE9TPSAoeworCSAgICAgICAxCisJICAgICAgIDIKKwkgICAgICAgMworCSAgICAgfSkKZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvaGlsZmUvdXBkYXRlIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS91cGRhdGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQzNWFhZAotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvdXBkYXRlCkBAIC0wLDAgKzEsMjIgQEAKK0JFRkVITDoKKwl1cGRhdGUsIHVwZAorCitBUkdVTUVOVEU6CisJVE9TCisKK0ZVTktUSU9OOgorCVplcnN0b2VyZSBkaWUgQmx1ZXByaW50IGRlcyBPYmpla3RlcywgZGFzIGF1ZiBkZW0gU3RhY2sgbGllZ3QsIGRhbWl0CisJQWVuZGVydW5nZW4gZGVyIEZpbGVzIGFrdGl2IHdlcmRlbiBrb2VubmVuLiBHZWJlIGRlciBCbHVlcHJpbnQKKwlqZWRvY2ggR2VsZWdlbmhlaXQsIEF1ZnJhZXVtYXJiZWl0ZW4genUgdGFldGlnZW4uIFNvbGwgZGllIEJsdWVwcmludAorCXdpcmtsaWNoIGhhcnQgemVyc3RvZXJ0IHdlcmRlbiwgc28gaXN0IGVpbiBSdWZ6ZWljaGVuIGFuIGRlbiBCZWZlaGwKKwlhbnp1aGFlbmdlbi4gKGFsc28gYHVwZGF0ZSEnKQorCVdpY2h0aWc6IERhcyBnZWNsb250ZSBPYmpla3QsIHVlYmVyIGRhcyBkaWUgQmx1ZXByaW50IHplcnN0b2VydCB3aXJkLAorCWJsZWlidCBlcmhhbHRlbiwgZWJlbnNvIHdpZSBhbGxlIGFuZGVyZW4gZ2VjbG9udGVuIE9iamVrdGUuCisKK0JFSVNQSUVMRToKKwksbWUgLnRlZGR5IHVwZGF0ZQorCVplcnN0b2VydCBkaWUgQmx1ZXByaW50IHZvbSBUZWRkeSwgZGVuIG1hbiBoYXQuIChEYXMgaXN0IG5hdHVlcmxpY2ggbnVyCisJZnVlciBNYWdpZXIgc2lubnZvbGwsIGRpZSBkYXMgRmlsZSBlZGl0aWVyZW4ga29ubnRlbi4pCisKK1NJRUhFIEFVQ0g6CisJInJvb211cGRhdGUiCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3ZhcnMgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3ZhcnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM2ZGVhYgotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvdmFycwpAQCAtMCwwICsxLDIzIEBACitCRUZFSExFOgorCTx2YXJuYW1lLCA+dmFybmFtZQorCitBUkdVTUVOVEU6CisJVE9TIAorCXZhcm5hbWUgLS0gU3RyaW5nCisKK0ZVTktUSU9OOgorCT52YXJuYW1lCisJCVNwZWljaGVyZSBkYXMgb2JlcnN0ZSBFbGVtZW50IGRlcyBTdGFja3MgaW4gZGVyIFZhcmlhYmxlCisJCSJ2YXJuYW1lIiBhYi4KKwk8dmFybmFtZQorCQlLb3BpZXJlIGRlbiBJbmhhbHQgZGVyIFZhcmlhYmxlICJ2YXJuYW1lIiBhdWYgZGVuIFN0YWNrLgorCQlXZW5uIGRlciBJbmhhbHQgZGVyIFZhcmlhYmxlIGVpbmUgRnVua3Rpb24gaXN0LCB3byB3aXJkCisJCWRpZXNlIGluIFN0cmluZ2Zvcm0gYXVmIGRlbiBTdGFjayBnZWxlZ3QgdW5kIG5pY2h0IGF1cy0KKwkJZ2V3ZXJ0ZXQuCisKKwlFcyBrb2VubmVuIGF1c3NlciBPYmpla3RlbiBhdWNoIEFycmF5cywgU3RyaW5ncyB1bmQgSW50ZWdlcnMKKwlpbiBWYXJpYWJsZW4gZ2VzcGVpY2hlcnQgd2VyZGVuLiBXaXJkIGVpbmUgMCBpbiBlaW5lciBWYXJpYWJsZQorCWdlc3BlaWNoZXJ0LCBzbyB3aXJkIGRpZSBWYXJpYWJsZSB3aWVkZXIgZ2Vsb2VzY2h0LgorCitTSUVIRSBBVUNIOgorCSJtZW1vcnkiCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL3RfYmFzZS5jIGIvb2JqL3Rvb2xzL3RlbGxlci90X2Jhc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzM2ZDNiCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci90X2Jhc2UuYwpAQCAtMCwwICsxLDM2MSBAQAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRGllIEJhc2lzLSB1bmQgSGlsZnNmdW5rdGlvbmVuIGRlciBUZWxsZXIuCisvLyBTdGFjayB1bmQgTWVtb3J5CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaW5jbHVkZSAidGVsbGVyLmgiCisKKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDx0ZXJtaW5hbC5oPgorCitzdGF0aWMgbWl4ZWQgKnN0YWNrOworc3RhdGljIG1hcHBpbmcgbWVtb3J5Oworc3RhdGljIG9iamVjdCAqb2xkaW52Oworc3RhdGljIGJvb2wgbWl0X25hbWVuOworc3RhdGljIGJvb2wgZmVobGVyX3Bhc3NpZXJ0Oworc3RhdGljIGJvb2wgbWl0X3NheTsKK3N0YXRpYyBib29sIHNlY3VyZWludjsKK3N0YXRpYyBib29sIGRvbG9nYWNjZXNzOworc3RhdGljIGJvb2wgcHJldHR5Oworc3RhdGljIGJvb2wgZG9fcHJvZmlsZTsKKworc3RhdGljIG1peGVkIHRvcCgpOworc3RhdGljIG1peGVkIHBvcCgpOworc3RhdGljIHZvaWQgcHVzaCggbWl4ZWQgb2IgKTsKKworc3RhdGljIHZvaWQgZHVtcF9vYmooIG1peGVkIG9iLCBpbnQgaW5kZW50ICk7CisKK3ZvaWQgY3JlYXRlKCkKK3sKKwlzdGFjayA9ICh7fSk7CisJbWVtb3J5ID0gKFtdKTsKKwltaXRfbmFtZW4gPSBUUlVFOworCWZlaGxlcl9wYXNzaWVydCA9IEZBTFNFOworCW1pdF9zYXkgPSBUUlVFOworCXNlY3VyZWludiA9IEZBTFNFOworCWRvbG9nYWNjZXNzID0gRkFMU0U7CisJcHJldHR5ID0gVFJVRTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGlsZnNmdW5rdGlvbmVuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbnQgZXJyb3IoIHN0cmluZyBtc2cgKQoreworCXdyaXRlKCAiRmVobGVyIGluICIrbXNnKyIuXG4iICk7CisJZmVobGVyX3Bhc3NpZXJ0ID0gVFJVRTsKKwlyZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBpbnQgbWVtbyggc3RyaW5nIG1zZyApCit7CisJd3JpdGUoICJNRU1POiAiK21zZysiLlxuIiApOworCXJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGludCBjYWxjaW52KCBzdHJpbmcgc3RyICkKK3sKKwlvYmplY3QqIG9iczsKKwlvYmplY3Qgb2I7CisJaW50IHZhbDsKKworCWlmKCBzc2NhbmYoIHN0ciwgIiVkIiwgdmFsICkgPT0gMSApCisJeworCQlvYnMgPSBhbGxfaW52ZW50b3J5KHRvcCgpKTsKKwkJaWYoIHZhbDwwIHx8IHZhbD49c2l6ZW9mKG9icykgKQorCQkJcmV0dXJuIGVycm9yKCAiJy4nOiBLZWluIE9iamVrdCBtaXQgZGllc2VyIE51bW1lciIgKTsKKwkJcG9wKCk7CisJCXB1c2gob2JzW3ZhbF0pOworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwlpZiggIShvYj1wcmVzZW50KHN0cix0b3AoKSkpICkKKwkJcmV0dXJuIGVycm9yKCAiJy4nOiBLZWluIE9iamVrdCBuYW1lbnMgXCIiK3N0cisiXCIgZ2VmdW5kZW4iICk7CisJcG9wKCk7CisJcHVzaChvYik7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBtaXhlZCBwdXNoX3N0ciggc3RyaW5nIHN0ciApCit7CisJcmV0dXJuCisJCXB1c2goIGltcGxvZGUob2xkX2V4cGxvZGUoIGltcGxvZGUob2xkX2V4cGxvZGUoIGltcGxvZGUob2xkX2V4cGxvZGUoCisJCQkJCSIgIitzdHIrIiAiLAorCQkJCSJcXG4iKSwiXG4iKSwgIlxcZSIpLEVTQyksICJcXGIiKSwiXGIiKQorCQlbMS4uPDJdICk7Cit9CisKK3N0YXRpYyB2b2lkIGRvX21vdmUoIG9iamVjdCBvYiwgbWl4ZWQgZGVzdCApCit7CisJaW50IHdlaWdodDsKKworCXdlaWdodCA9IG9iLT5RdWVyeVdlaWdodCgpOworCWlmKCBlbnZpcm9ubWVudChvYikgKQorCQllbnZpcm9ubWVudChvYiktPkFkZFdlaWdodCgtd2VpZ2h0KTsKKwlvYi0+bW92ZShkZXN0LE1fTk9DSEVDSyk7CisJZGVzdC0+QWRkV2VpZ2h0KHdlaWdodCk7Cit9CisKK3ZvaWQgaGVhcnRfYmVhdCgpCit7CisJb2JqZWN0ICpuZXdpbnY7CisJb2JqZWN0IG93bmVyOworCWludCBpLGo7CisKKwlpZiggb3duZXI9ZmluZF9wbGF5ZXIoZ2V0dWlkKCkpICkKKwl7CisJCW5ld2ludiA9IHNvcnRfYXJyYXkoIGFsbF9pbnZlbnRvcnkob3duZXIpLCBsYW1iZGEoICh7J2EsJ2J9KSwKKwkJCSh7ICMnPCwKKwkJCQkoeyAjJ29iamVjdF9uYW1lLCAnYSB9KSwKKwkJCQkoeyAjJ29iamVjdF9uYW1lLCAnYiB9KQorCQkJfSkKKwkJKSApOworCQlpZiggcG9pbnRlcnAob2xkaW52KSApCisJCXsKKwkJCWZvciggaT0wLGo9MDsgaTxzaXplb2YobmV3aW52KSAmJiBqPHNpemVvZihvbGRpbnYpIDsgKQorCQkJeworCQkJCWlmKCBuZXdpbnZbaV0gPT0gb2xkaW52W2pdICkKKwkJCQl7IGkrKzsgaisrOyB9CisJCQkJZWxzZSBpZiggb2JqZWN0X25hbWUobmV3aW52W2ldKSA+IG9iamVjdF9uYW1lKG9sZGludltqXSkgKQorCQkJCXsKKwkJCQkJdGVsbF9vYmplY3Qob3duZXIsCisJCQkJCQkiTUVNTzogXCIiK29iamVjdF9uYW1lKG5ld2ludltpXSkrIlwiIGVudGVyZWQgaW52ZW50b3J5LlxuIiApOworCQkJCQlpKys7CisJCQkJfQorCQkJCWVsc2UKKwkJCQkJaisrOworCQkJfQorCQkJZm9yKCA7IGk8c2l6ZW9mKG5ld2ludikgOyBpKysgKQorCQkJCXRlbGxfb2JqZWN0KCBvd25lciwKKwkJCQkJIk1FTU86IFwiIitvYmplY3RfbmFtZShuZXdpbnZbaV0pKyJcIiBlbnRlcmVkIGludmVudG9yeS5cbiIgKTsKKwkJfQorCX0KKwlvbGRpbnYgPSBuZXdpbnY7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIER1bXBmdW5rdGlvbmVuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIGR1bXBfYXJyYXkoIG1peGVkKiBvYiwgaW50IGluZGVudCApCit7CisJaW50IGk7CisJZm9yKCBpPTA7IGk8c2l6ZW9mKG9iKTsgaSsrICkKKwl7CisJCXByaW50ZiggIiUqcyIsIGluZGVudCwgIiIgKTsKKwkJZHVtcF9vYmooIG9iW2ldLCBpbmRlbnQgKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfbWFwcGluZyggbWFwcGluZyBvYiwgaW50IGluZGVudCApCit7CisJbWl4ZWQgKmluZGV4OworCW1peGVkIGtleTsKKwlpbnQgaSxqLHZhbHVlczsKKworCWluZGV4ID0gbV9pbmRpY2VzKCBvYiApOworCXZhbHVlcyA9IGdldF90eXBlX2luZm8ob2IpWzFdOworCWZvciggaT0wOyBpPHNpemVvZihpbmRleCk7IGkrKyApCisJeworCQlrZXkgPSBpbmRleFtpXTsKKwkJcHJpbnRmKCAiJSpzIiwgaW5kZW50LCAiIiApOworCQlkdW1wX29iaigga2V5LCBpbmRlbnQgKTsKKwkJZm9yKCBqPTA7IGo8dmFsdWVzOyBqKysgKQorCQl7CisJCQlwcmludGYoICIlKnM6ICIsIGluZGVudCsxLCAiIiApOworCQkJZHVtcF9vYmooIG9iW2tleSxqXSwgaW5kZW50KzMgKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZHVtcF9vYmooIG1peGVkIG9iLCBpbnQgaW5kZW50ICkKK3sKKwlpZiggIXByZXR0eSApCisJeworCQlwcmludGYoICIlT1xuIiwgb2IgKTsKKwkJcmV0dXJuOworCX0KKwlpZiggaW50cChvYikgKQorCQl3cml0ZSggb2IgKyAiXG4iICk7CisJZWxzZSBpZiggZmxvYXRwKG9iKSApCisJCXByaW50ZiggIiUxLjVmXG4iLCBvYiApOworCWVsc2UgaWYoIHN0cmluZ3Aob2IpICkKKwl7CisJCWlmICggb2I9PSI7IiApCisJCQl3cml0ZSggIjtcbiIgKTsKKwkJZWxzZQorCQl7CisJCQl3cml0ZSggIlwiIiArIGltcGxvZGUob2xkX2V4cGxvZGUoIGltcGxvZGUob2xkX2V4cGxvZGUoIGltcGxvZGUob2xkX2V4cGxvZGUoCisJCQkJCQkJIiAiK29iKyIgIiwKKwkJCQkJCSAiXG4iKSwiXFxuIiksIEVTQyksICJcXGUiKSwgIlxiIiksIlxcYiIpCisJCQkJCQkgWzEuLjwyXSArICJcIlxuIgorCQkJKTsKKwkJfQorCX0KKwllbHNlIGlmKCBvYmplY3RwKG9iKSApCisJeworCQlpZiggbWl0X25hbWVuICkKKwkJCXdyaXRlKCBvYmplY3RfbmFtZShvYikrIiAoIitvYi0+bmFtZShXRVIsMCkrIilcbiIgKTsKKwkJZWxzZQorCQkJd3JpdGUoIG9iamVjdF9uYW1lKG9iKSsiXG4iICk7CisJfQorCWVsc2UgaWYoIG1hcHBpbmdwKG9iKSApCisJeworCQl3cml0ZSggIihbXG4iICk7CisJCWR1bXBfbWFwcGluZyggb2IsIGluZGVudCArIDIgKTsKKwkJcHJpbnRmKCAiJSpzXG4iLCBpbmRlbnQgKyAyLCAiXSkiICk7CisJfQorCWVsc2UgaWYoIHBvaW50ZXJwKG9iKSApCisJeworCQl3cml0ZSggIih7XG4iICk7CisJCWR1bXBfYXJyYXkoIG9iLCBpbmRlbnQrMiApOworCQlwcmludGYoICIlKnNcbiIsIGluZGVudCsyICwgIn0pIiApOworCX0KKwllbHNlCisJCXByaW50ZiggIiVPXG4iLCBvYiApOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTcGVpY2hlcmZ1bmt0aW9uZW4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgZG9fcmVjYWxsKCBtaXhlZCBhcmcgKQoreworCWlmKCBtZW1iZXIobWVtb3J5LGFyZykgKQorCQlwdXNoKCBtZW1vcnlbYXJnLDBdICk7Cit9CisKK3N0YXRpYyB2b2lkIGRvX3N0b3JlKCBtaXhlZCBhcmcgKQoreworCWlmICggc2l6ZW9mKHN0YWNrKSApCisJeworCQlpZiggIXRvcCgpICkKKwkJCW1lbW9yeSA9IG1fZGVsZXRlKG1lbW9yeSxhcmcpOworCQllbHNlCisJCQltZW1vcnkgKz0gKFsgYXJnOiB0b3AoKTsgMCBdKTsKKwl9CisJZWxzZQorCQltZW1vKCAiRXMgd3VyZGUga2VpbiBXZXJ0IGluIFwiIithcmcrIlwiIGdlc3BlaWNoZXJ0IiApOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTdGFjay1GdW5rdGlvbmVuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIHB1c2goIG1peGVkIG9iICkKK3sKKwlzdGFjayA9ICh7IG9iIH0pICsgc3RhY2s7Cit9CisKK3N0YXRpYyBtaXhlZCBwb3AoKQoreworCW1peGVkIGFuc3dlcjsKKworCWlmKCAhc2l6ZW9mKCBzdGFjayApICkKKwkJcmV0dXJuIEZBTFNFOworCWFuc3dlciA9IHN0YWNrWzBdOworCXN0YWNrID0gc3RhY2tbMS4uXTsKKwlyZXR1cm4gYW5zd2VyOworfQkKKworc3RhdGljIG1peGVkIHRvcCgpCit7CisJaWYoIHNpemVvZihzdGFjaykgKQorCQlyZXR1cm4gc3RhY2tbMF07Cit9CisKK3N0YXRpYyB2YXJhcmdzIGludCBiZWNvbWVzX29iaiggbWl4ZWQgYXJndikKK3sKKwlvYmplY3Qgb2I7CisKKwlpZiggIXBvaW50ZXJwKGFyZ3YpICkgLy8gZGVmYXVsdCBpc3QgZGVyIHN0YWNrICEKKwkJYXJndiA9IHN0YWNrOworCWlmKCAhc2l6ZW9mKGFyZ3YpICkKKwkJcmV0dXJuIEZBTFNFOyAKKwlpZiggc3RyaW5ncChhcmd2WzBdKSAmJiAhY2F0Y2goY2FsbF9vdGhlcihhcmd2WzBdLCI/IikpICkKKwl7CisJICBhcmd2WzBdID0gZmluZF9vYmplY3QoYXJndlswXSk7CisJCXJldHVybiBUUlVFOworCX0KKwllbHNlCisJCXJldHVybiBvYmplY3RwKGFyZ3ZbMF0pOworfQorCitzdGF0aWMgaXNTdWJTdHIoIHBsLCBzdHIsIGxlbiApCit7CisJcmV0dXJuIGdldHVpZChwbClbMC4ubGVuXSA9PSBzdHI7Cit9CisKK3N0YXRpYyBiZWNvbWVzX3BsKGFyZ3YpCit7CisJb2JqZWN0IHBsOworCW9iamVjdCogcGxsaXN0OworCXN0cmluZyBzdHI7CisJaW50IGxlbjsKKworCWlmKCAhYXJndiApIGFyZ3YgPSBzdGFjazsKKwlpZiggIXNpemVvZihhcmd2KSB8fCAoIGJlY29tZXNfb2JqKCkgJiYgIWludGVyYWN0aXZlKGFyZ3ZbMF0pICkgKQorCQlyZXR1cm4gRkFMU0U7CisJaWYoIHN0cmluZ3AoYXJndlswXSkgKQorCXsKKwkJc3RyID0gbG93ZXJfY2FzZSggYXJndlswXSApOworCQlwbCA9IDA7CisJCWlmKCBzdHJbPDEuLjwxXSA9PSAiKiIgKQorCQl7CQorCQkJc3RyID0gc3RyWzAuLjwyXTsKKwkJCWxlbiA9IHNpemVvZihzdHIpIC0gMTsKKwkJCXBsbGlzdCA9IGZpbHRlciggdXNlcnMoKSwgIydpc1N1YlN0ciwgc3RyLCBsZW4gKTsKKwkJCWlmKCBzaXplb2YocGxsaXN0KSA9PSAxICkKKwkJCXsKKwkJCQlwbD1wbGxpc3RbMF07CisJCQkJYXJndlswXSA9IHBsOworCQkJfQorCQl9CisJCWlmKCAhcGwgJiYgcGw9ZmluZF9wbGF5ZXIoYXJndlswXSkgKQorCQkJYXJndlswXSA9IHBsOworCQlyZXR1cm4gcGw7CisJfQorCXJldHVybiBhcmd2WzBdOworfQorCitzdGF0aWMgRHVtcE9iaiggb2IgKQoreworICBzdHJpbmcgYW5zOworICBpbnQgaSxqOworCisgIGlmKCBpbnRwKG9iKSApCisgICAgcmV0dXJuICIiK29iOworICBlbHNlIGlmKCBzdHJpbmdwKG9iKSApCisgICAgcmV0dXJuICJcIiIraW1wbG9kZShleHBsb2RlKG9iLCJcbiIpLCJcXG4iKSsiXCIiOworICBlbHNlIGlmKCBvYmplY3RwKG9iKSApCisgICAgcmV0dXJuICJcIiIrb2JqZWN0X25hbWUob2IpKyJcIiI7CisgIGVsc2UgaWYoIG1hcHBpbmdwKG9iKSApCisgIHsKKyAgICBhbnM9IihbIjsKKyAgICBmb3IoIGk9MDsgaTxzaXplb2Yob2IpLTE7IGkrKyApCisgICAgICBhbnMgKz0gRHVtcE1hcHAob2IsaSkrIiwiOworICAgIC8vIHJlbHkgb24gcmlnaHQgdmFsdWUgb2YgaQorICAgIHJldHVybiBhbnMrRHVtcE1hcHAob2IsaSkrIl0pIjsKKyAgfQorICBlbHNlCisgIHsKKyAgICBhbnM9Iih7IjsKKyAgICBmb3IoIGk9MDsgaTxzaXplb2Yob2IpLTE7IGkrKyApCisgICAgICBhbnMgKz0gRHVtcE9iaihvYltpXSkrIiwiOworICAgIC8vIHJlbHkgb24gcmlnaHQgdmFsdWUgb2YgaQorICAgIHJldHVybiBhbnMrRHVtcE9iaihvYltpXSkrIn0pIjsKKyAgfQorfQorCitzdGF0aWMgRHVtcE1hcHAob2IsaSkKK3sKKyAgaW50IGosdno7CisgIHN0cmluZyBhbnM7CisKKyAgdnogPSBnZXRfdHlwZV9pbmZvKG9iKVsxXTsKKyAgYW5zID0gRHVtcE9iaihtX2luZGljZXMob2IpW2ldKSsiOiI7CisgIGZvciggaj0wOyBqPHZ6LTE7IGorKyApCisgICAgYW5zICs9IER1bXBPYmoob2JbbV9pbmRpY2VzKG9iKVtpXSxqXSkrIjsiOworICAvLyByZWx5IG9uIHZhbHVlIG9mIGoKKyAgcmV0dXJuIGFucyArIER1bXBPYmoob2JbbV9pbmRpY2VzKG9iKVtpXSxqXSk7Cit9CmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL3RfY21kcy5jIGIvb2JqL3Rvb2xzL3RlbGxlci90X2NtZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGZhNWQzCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci90X2NtZHMuYwpAQCAtMCwwICsxLDEwMDAgQEAKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEJ1aWx0aW5rb21tYW5kb3MgZGVyIFRlbGxlci4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpbmNsdWRlICJ0ZWxsZXIuaCIKK2luaGVyaXQgVF9CQVNFOworCisjaW5jbHVkZSA8bW92aW5nLmg+CisjaW5jbHVkZSA8YXR0cmlidXRlcy5oPgorI2luY2x1ZGUgPHRlcm1pbmFsLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisKK3N0YXRpYyB2b2lkIGRvX3JpbnYoIG9iamVjdCBlbnYsIGludCBkZXB0aCApOworc3RhdGljIHNjYW5fb2JqKCBvYmplY3QgcGxheWVyLCBvYmplY3Qgb2JqICk7CitzdGF0aWMgdm9pZCBta193YWl0Zm9yKCBtaXhlZCB3YWl0Zm9yICk7CitzdGF0aWMgdm9pZCBta19hdXRvbG9hZCggbWl4ZWQgYXV0b2xvYWQgKTsKK3N0YXRpYyBpbnQgZG9fcm9vbXVwZGF0ZSggaW50IGRlc3RmbGFnLCBpbnQgbm9pdGVtcyApOworc3RhdGljIGludCBkb19jbGVhbm9mKCBpbnQgc3Ryb25nICk7CisKKy8vIGZyb20gdGVsbGVyLmMKK3N0YXRpYyBpbnQgZG9fY21kKCBzdHJpbmcgc3RyICk7CisKK3N0YXRpYyBpbnQgY21kX2NsZWFyKCkKK3sKKwlzdGFjayA9ICh7fSk7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgY21kX3BvcCgpCit7CisJaWYoICFzaXplb2Yoc3RhY2spICkKKwkJcmV0dXJuIGVycm9yKCAicG9wOiBEZXIgU3RhY2sgaXN0IGxlZXIiICk7CisJcG9wKCk7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgY21kX3RvcCgpCit7CisJaWYoICFzaXplb2Yoc3RhY2spICkKKwkJcmV0dXJuIGVycm9yKCAidG9wOiBEZXIgU3RhY2sgaXN0IGxlZXIiICk7CisJd3JpdGUoICJUT1M9ICIgKTsKKwlkdW1wX29iaiggdG9wKCksIDUgKTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBjbWRfc3dhcCgpCit7CisJbWl4ZWQgdG1wOworCisJaWYoIHNpemVvZihzdGFjayk8MiApCisJCXJldHVybiBlcnJvciggInN3YXA6IEtlaW5lIDIgRWxlbWVudGUgYXVmIGRlbSBTdGFjayIgKTsKKwl0bXAgPSBzdGFja1swXTsKKwlzdGFja1swXSA9IHN0YWNrWzFdOworCXN0YWNrWzFdID0gdG1wOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IGNtZF9kdXAoKQoreworCWlmKCAhc2l6ZW9mKHN0YWNrKSApCisJCXJldHVybiBlcnJvciggImR1cDogRGVyIFN0YWNrIGlzdCBsZWVyIiApOworCXB1c2godG9wKCkpOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IGNtZF9oZXJlKCkKK3sKKwlwdXNoKGVudmlyb25tZW50KFBMKSk7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgY21kX3N0YWNrKCkKK3sKKyAgaW50IGk7CisgIGlmKCAhc2l6ZW9mKHN0YWNrKSApCisgICAgcmV0dXJuIG1lbW8oICJEZXIgU3RhY2sgaXN0IGxlZXIiICk7CisKKyAgZm9yKCBpPTA7IGk8c2l6ZW9mKHN0YWNrKTsgaSsrICkKKyAgeworICAgIHByaW50ZiggIiUyZDogIiwgaSApOworICAgIGR1bXBfb2JqKCBzdGFja1tpXSwgNCApOworICB9CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IGNtZF9pbnYoKQoreworICBpbnQgaTsKKyAgb2JqZWN0IG9iOworCisJaWYoICFiZWNvbWVzX29iaigpICkKKwkJcmV0dXJuIGVycm9yKCAiaW52OiBUT1MgaXN0IGtlaW4gT2JqZWt0IiApOworICB3cml0ZSggIkludmVudGFyIHZvbiAiICk7CisgIGR1bXBfb2JqKCB0b3AoKSwgMTMgKTsKKyAgZm9yKCBpPTAsIG9iPWZpcnN0X2ludmVudG9yeSh0b3AoKSk7IG9iOyBvYj1uZXh0X2ludmVudG9yeShvYiksIGkrKyApCisgIHsKKyAgICBwcmludGYoICIlMmQuICIsIGkgKTsKKyAgICBkdW1wX29iaiggb2IsIDQgKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBjbWRfcmVraW52KCkKK3sKKwlpZiggIWJlY29tZXNfb2JqKCkgKQorCQlyZXR1cm4gZXJyb3IoICJyZWtpbnY6IFRPUyBpc3Qga2VpbiBPYmpla3QiICk7CisJd3JpdGUoICJJbnZlbnRhciB2b24gIiApOworCWR1bXBfb2JqKCB0b3AoKSwgMTMgKTsKKworCWRvX3JpbnYoIHRvcCgpLCAyICk7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkIGRvX3JpbnYoIG9iamVjdCBlbnYsIGludCBkZXB0aCApCit7CisJaW50IGk7CisJb2JqZWN0IG9iOworCisJZm9yKCBpPTAsIG9iPWZpcnN0X2ludmVudG9yeShlbnYpOyBvYjsgb2I9bmV4dF9pbnZlbnRvcnkob2IpLCBpKysgKQorCXsKKwkJcHJpbnRmKCAiJSpkLiAiLCBkZXB0aCwgaSApOworCQlkdW1wX29iaiggb2IsIDIrZGVwdGggKTsKKwkJZG9fcmludiggb2IsIGRlcHRoKzIgKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY21kX21lKCkKK3sKKwlwdXNoKCBQTCApOworCXJldHVybiBUUlVFOworfQorCisvLyBVZWJlcm5vbW1lbiBhdXMgZGVtIFRlZGR5IChtaXQgZnJldW5kbGljaGVyIEdlbmVobWlndW5nIHZvbiBTaXIpLgorc3RhdGljIGludCBjbWRfc2NhbigpCit7CisJb2JqZWN0IG9iajsKKworCWlmKCAhYmVjb21lc19wbCgpICYmICggIW9iamVjdHAodG9wKCkpIHx8ICFsaXZpbmcodG9wKCkpICkgKQorCXsKKwkJaWYoIHN0cmluZ3AodG9wKCkpICYmIGZpbGVfc2l6ZSggIi9zYXZlLyIrdG9wKClbMC4uMF0rIi8iK3RvcCgpKyIubyIpID4gMCApCisJCXsKKwkJCW9iaiA9IGNsb25lX29iamVjdCggVF9QTEFZRVIgKTsKKwkJCW9iai0+TG9hZCggdG9wKCkgKTsKKwkJCW9iai0+U2V0UHJvcCggUF9OQU1FLCBjYXBpdGFsaXplKCBwb3AoKSApICk7CisJCQlzY2FuX29iaiggVFJVRSwgb2JqICk7CisJCQlkZXN0cnVjdCggb2JqICk7CisJCQlyZXR1cm4gVFJVRTsKKwkJfQorCQlyZXR1cm4gZXJyb3IoICJzY2FuOiBUT1MgaXN0IGtlaW4gTGViZXdlc2VuIiApOworCX0KKworCXNjYW5fb2JqKCBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKCB0b3AoKSApLCBwb3AoKSApOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IFdpekxldmVsKCBvYmplY3Qgb2JqICkKK3sKKwlpZiggb2JqLT5Ob3Rsb2dnZWQoKSApCisJCXJldHVybiBxdWVyeV93aXpfbGV2ZWwoIGxvd2VyX2Nhc2Uob2JqLT5wbGF5ZXJuYW1lKCkpICk7CisJZWxzZQorCQlyZXR1cm4gcXVlcnlfd2l6X2xldmVsKCBvYmogKTsKK30KKworc3RhdGljIHN0cmluZyBJcE5hbWUoIG9iamVjdCBvYmogKQoreworCXN0cmluZyBpcF9uYW1lLCBpcF9udW0sIG5tOworCisJaWYoIG9iai0+Tm90bG9nZ2VkKCkgKQorCXsKKwkJLy8gQXVzIFVtc3RlbGx1bmdzZ3J1ZW5kZW4gd2VyZGVuIENBTExFRF9GUk9NX0lQIHVuZCBJUF9OQU1FCisJCS8vIGFiZ2VmcmFndC4gSVBfTkFNRSBpc3QgbmV1ZXIuCisKKwkJbm0gPSBsb3dlcl9jYXNlKG9iai0+cGxheWVybmFtZSgpKTsKKwkJaXBfbmFtZSA9IG9iai0+UXVlcnlQcm9wKFBfQ0FMTEVEX0ZST01fSVApOworCQlpZiggIWlwX25hbWUgKSBpcF9uYW1lID0gb2JqLT5RdWVyeShQX0lQX05BTUUpOworCQlyZXR1cm4gaXBfbmFtZSArICIgKCIKKwkJCSsgZHRpbWUoZ2V0X2RpcigiL3NhdmUvIitubVswLi4wXSsiLyIrbm0rIi5vIiw0KVswXSkgKyIpIjsKKwl9CisJZWxzZQorCXsKKwkJbm0gPSBsb3dlcl9jYXNlKCBvYmotPm5hbWUoUkFXKSApOworCQlpcF9uYW1lID0gcXVlcnlfaXBfbmFtZSggb2JqICk7CisJCWlmKCBpcF9uYW1lID09ICIiIHx8ICFpcF9uYW1lICkKKwkJeworCQkJaXBfbmFtZSA9IG9iai0+UXVlcnlQcm9wKFBfQ0FMTEVEX0ZST01fSVApOworCQkJaWYoICFpcF9uYW1lICkgaXBfbmFtZSA9IG9iai0+UXVlcnkoUF9JUF9OQU1FKTsKKwkJCXJldHVybiBpcF9uYW1lICsgIiAoIgorCQkJCSsgZHRpbWUoZ2V0X2RpcigiL3NhdmUvIitubVswLi4wXSsiLyIrbm0rIi5vIiw0KVswXSkgKyIpIjsKKwkJfQorCQlyZXR1cm4gaXBfbmFtZSArICIgWyIgKyBxdWVyeV9pcF9udW1iZXIob2JqKSArICJdIjsKKwl9Cit9CisKK3N0cmluZyBJZGxlVGltZSggb2JqZWN0IG9iaiApCit7CisJaWYoIG9iai0+Tm90bG9nZ2VkKCkgKSByZXR1cm4gIi1uaWNodCBkYS0iOworCWlmKCBxdWVyeV9pcF9udW1iZXIob2JqKSApIHJldHVybiAiIitxdWVyeV9pZGxlKG9iaik7CisJcmV0dXJuICItbmV0enRvdC0iOworfQorCitzdGF0aWMgc2Nhbl9vYmooIG9iamVjdCBwbGF5ZXIsIG9iamVjdCBvYmogKQoreworCXN0cmluZyB0aXRsZSwgbGV2ZWwsIGdlbmRlciwgcm9vbSwgdGVzdHBsLAorCQl3ZWFwb24sIGFybW91ciwgcXVlc3QsIHN0YXRfc3RyLCAqYXJyOworCWludCBpLGFjOworCW9iamVjdCB3ZWFwb25vYmosICpsaXN0LCAqZ2VnbmVyOworCW1peGVkICpoYW5kcywgKnF1ZXN0cywgKnN0YXRzOworCisJLy8gMS5aZWlsZSA6IE5hbWUgVGl0ZWwgLSBSYXNzZSAtIFsgV2l6bGV2ZWwgXQorCXRpdGxlID0gb2JqLT5RdWVyeVByb3AoUF9USVRMRSk7CisKKyAgaWYoICFwbGF5ZXIgKQorICAgIGxldmVsID0gIk1vbnN0ZXIiIDsKKyAgZWxzZSBpZiggV2l6TGV2ZWwoIG9iaiApIDwgV0laQVJEX0xWTCApCisJeworCQlpZiggdGVzdHBsPW9iai0+UXVlcnlQcm9wKCBQX1RFU1RQTEFZRVIgKSApCisJCXsKKwkJCWlmKCBzdHJpbmdwKHRlc3RwbCkgKQorCQkJCWxldmVsID0gIigiK3Rlc3RwbCsiKSI7CisJCQllbHNlCisJCQkJbGV2ZWwgPSAiVGVzdHNwaWVsZXIiOworCQl9CisJCWVsc2UgaWYoIFdpekxldmVsKCBvYmogKSA+PSBTRUVSX0xWTCApCisJCQlsZXZlbCA9ICJTZWhlciI7CisJCWVsc2UKKwkJCWxldmVsID0gIlNwaWVsZXIiIDsKKwl9CisgIGVsc2UgaWYoIFdpekxldmVsKCBvYmogKSA+PSBHT0RfTFZMICkKKyAgICBsZXZlbCA9ICJNdWRHb3R0IiA7CisgIGVsc2UgaWYoIFdpekxldmVsKCBvYmogKSA+PSBBUkNIX0xWTCApCisgICAgbGV2ZWwgPSAiRXJ6bWFnaWVyIiA7CisgIGVsc2UgaWYoIFdpekxldmVsKCBvYmogKSA+PSBMT1JEX0xWTCApCisgICAgbGV2ZWwgPSAiUmVnaW9uc21hZ2llciIgOworICBlbHNlCisgICAgbGV2ZWwgPSAiTWFnaWVyIiA7CisKKyAgaWYoICFvYmotPnNob3J0KCkgKQorICAgIGxldmVsICs9ICIsIHVuc2ljaHRiYXIiIDsKKyAgaWYoIG9iaiAtPiBRdWVyeVByb3AoIFBfRlJPRyApICkKKyAgICBsZXZlbCArPSAiLCBGcm9zY2giIDsKKyAgaWYoIG9iai0+UXVlcnlQcm9wKCBQX0dIT1NUICkgKQorICAJbGV2ZWwgKz0gIiwgdG90IjsKKwlpZiggb2JqLT5Ob3Rsb2dnZWQoKSApCisJCWxldmVsICs9ICIsIGF1c2dlbG9nZ3QiOworCWlmKG9iai0+UXVlcnlQcm9wKFBfU0VDT05EKSApCisJCWxldmVsICs9IiwgWndlaXRpZSI7CisKKwlpZiggZW52aXJvbm1lbnQob2JqKSApCisJCXJvb20gPSBvYmplY3RfbmFtZShlbnZpcm9ubWVudCggb2JqICkpOworCWVsc2UKKwkJcm9vbSA9ICItbmlyZ2VuZHMtIjsKKworICBwcmludGYoICIlcyAlcyAlc1sgJXMgXS5cbkJlZmluZGV0IHNpY2ggaW4gJXMuXG4iLAorCQlvYmotPm5hbWUoUkFXKSwgdGl0bGU/IHRpdGxlIDogIiIsCisJCXN0cmluZ3Aob2JqLT5RdWVyeVByb3AoUF9SQUNFKSkgPyAiLSAiK29iai0+UXVlcnlQcm9wKFBfUkFDRSkrIiAtICIgOiAiIiwKKwkJbGV2ZWwsIHJvb20gKSA7CisKKwkvLyAxIGFiYyBaZWlsZSA6IEhvc3QsRW1haWwsU25vb3BlcgorCWlmKCBwbGF5ZXIgKQorCXsKKwkJcHJpbnRmKCAiSG9zdC4uLi4uLi46ICVzXG4iLCBJcE5hbWUob2JqKSApOworCQlwcmludGYoICJFLU1haWwuLi4uLjogJXMuXG4iLCBvYmotPlF1ZXJ5UHJvcChQX01BSUxBRERSKSApOworCQlpZiggIW9iai0+Tm90bG9nZ2VkKCkgJiYgcXVlcnlfc25vb3Aob2JqKSApCisJCQlwcmludGYoICJTbm9vcGVyLi4uLjogJXMuXG4iLCBjYXBpdGFsaXplKGdldHVpZChxdWVyeV9zbm9vcChvYmopKSkgKTsKKworCQlwcmludGYoICJWb3JzaWNodC4uLjogJTExZCBLdXJ6bW9kdXMuOiAlMTFzIE1hZ2llcmJsaWNrLi4uLjogJTExcy5cbiIsCisJCQlvYmotPlF1ZXJ5UHJvcChQX1dJTVBZKSwgb2JqLT5RdWVyeVByb3AoUF9CUklFRikgPyAiLWFuLSIgOiAiLWF1cy0iLAorCQkJb2JqLT5RdWVyeVByb3AoUF9XQU5UU19UT19MRUFSTikgPyAiLWFuLSIgOiAiLWF1cy0iICk7CisJCXByaW50ZiggIklkbGV6ZWl0Li4uOiAlMTFzIEFsdGVyLi4uLi46ICUxMXMgVmVyaGVpcmF0ZXQgbWl0OiAlLTExcy5cbiIsCisJCQlJZGxlVGltZShvYmopLCB0aW1lMnN0cmluZygiJTVkOiUwMmg6JTAybSIsb2JqLT5RdWVyeVByb3AoUF9BR0UpKjIpLAorCQkJKHN0cmluZ3Aob2JqLT5RdWVyeVByb3AoUF9NQVJSSUVEKSkgPyBvYmotPlF1ZXJ5UHJvcChQX01BUlJJRUQpIDogIi0iICkKKwkJKTsKKwl9CisKKyAgLy8gMi5aZWlsZSA6IEhQLCBTUCB1bmQgWFAKKyAgcHJpbnRmKCAiTGViZW5zcGt0Li46IFslNGQvJTRkXSBNYWdpZXBrdC4uOiBbJTRkLyU0ZF0uXG4iICsKKyAgICAiUXVlc3RwdW5rdGU6IFslNGQvJTRkXSBFcmZhaHJ1bmcuOiAlMTFkLlxuIiwKKyAgICBvYmotPlF1ZXJ5UHJvcChQX0hQKSwgb2JqLT5RdWVyeVByb3AoUF9NQVhfSFApLAorCQlvYmotPlF1ZXJ5UHJvcChQX1NQKSwgb2JqLT5RdWVyeVByb3AoUF9NQVhfU1ApLAorCQlvYmotPlF1ZXJ5UHJvcChQX1FQKSwgIi9zZWN1cmUvcXVlc3RtYXN0ZXIiLT5RdWVyeU1heFFQKCksCisJCW9iai0+UXVlcnlQcm9wKFBfWFApICk7CisKKyAgLy8gMy5aZWlsZSA6IEZPT0QsIERSSU5LLCBBTENPSE9MCisgIHByaW50ZiggIk5haHJ1bmcuLi4uOiBbJTRkLyU0ZF0gRmx1ZXNzaWdrLjogWyU0ZC8lNGRdICIgKworICAgICJBbGtvaG9sLi4uLi4uLi46IFslNGQvJTRkXS5cbiIsCisgICAgb2JqLT5RdWVyeVByb3AoUF9GT09EKSwgb2JqLT5RdWVyeVByb3AoUF9NQVhfRk9PRCksCisgICAgb2JqLT5RdWVyeVByb3AoUF9EUklOSyksIG9iai0+UXVlcnlQcm9wKFBfTUFYX0RSSU5LKSwKKyAgICBvYmotPlF1ZXJ5UHJvcChQX0FMQ09IT0wpLCBvYmotPlF1ZXJ5UHJvcChQX01BWF9BTENPSE9MKSApIDsKKworICAvLyA0LlplaWxlIDogR2VzY2hsZWNodCwgQWxpZ25tZW50LCBMZXZlbAorICBzd2l0Y2goIG9iai0+UXVlcnlQcm9wKFBfR0VOREVSKSApCisgIHsKKyAgICBjYXNlIEZFTUFMRSA6IGdlbmRlciA9ICJ3ZWlibGljaCAgICIgOyBicmVhayA7CisgICAgY2FzZSBNQUxFICAgOiBnZW5kZXIgPSAibWFlbm5saWNoICAiIDsgYnJlYWsgOworICAgIGRlZmF1bHQgICAgIDogZ2VuZGVyID0gIm5ldXRydW0gICAgIiA7IGJyZWFrIDsKKyAgfQorICBwcmludGYoCisJCSJHZXNjaGxlY2h0LjogJXMgQ2hhcmFrdGVyLjogJTExZCAoTWFnaWVyKVN0dWZlLi46IFslNHMvJTRkXS5cbiIsIAorICAgIGdlbmRlciwgb2JqLT5RdWVyeVByb3AoUF9BTElHTiksCisJCXBsYXllciA/IFdpekxldmVsKG9iaikrIiIgOiAiLSIsIG9iai0+UXVlcnlQcm9wKFBfTEVWRUwpICk7CisKKwkvLyA1LlplaWxlIDogR2VsZCwgR2V3aWNodCwgUGxheWVya2lsbHMKKwlwcmludGYoICJHZWxkLi4uLi4uLjogJTExZCBUcmFlZ3QuLi4uOiAlMTFkIFBsYXllcmtpbGxzLi4uLjogJTExZC5cbiIsCisJCW9iai0+UXVlcnlNb25leSgpLCBvYmotPnF1ZXJ5X3dlaWdodF9jb250ZW50cygpLAorCQlvYmotPlF1ZXJ5UHJvcChQX0tJTExTKSApOworCisgIC8vIDYuWmVpbGUgOiBzdGF0aQorICBzdGF0cyA9IG9iai0+UXVlcnlQcm9wKFBfQVRUUklCVVRFUykgOworCWFyciA9IG1faW5kaWNlcyggc3RhdHMgKTsKKyAgc3RhdF9zdHIgPSAiIiA7CisgIGZvciggaSA9IDA7IGkgPCBzaXplb2YoIGFyciApOyBpKysgKSB7CisgICAgc3RhdF9zdHIgKz0gY2FwaXRhbGl6ZShhcnJbIGkgXSkgKyAiWyIgKyBzdGF0c1thcnJbIGkgXV07CisgICAgaWYoIGFjID0gb2JqLT5RdWVyeUF0dHJpYnV0ZU9mZnNldChhcnJbaV0pICkgeworICAgIAlzdGF0X3N0ciArPSAiKyIgKyBhYzsKKyAgICB9CisgICAgc3RhdF9zdHIgKz0gIl0sICI7CisgIH0KKworICBpZiggc3RhdF9zdHIgPT0gIiIgKQorICAgIHN0YXRfc3RyID0gIktlaW5lIiA7CisgIGVsc2UKKyAgICBzdGF0X3N0ciA9IHN0YXRfc3RyWzAuLnNpemVvZiggc3RhdF9zdHIgKSAtIDNdIDsKKyAgcHJpbnRmKCAiQXR0cmlidXRlLi46ICVzLlxuIiwgc3RhdF9zdHIgKSA7CisKKyAgLy8gNy5aZWlsZSA6IFdhZmZlKCBEYXRlaW5hbWUgKVsgQUMgXQorICAvLyA4LlplaWxlIDogUnVlc3R1bmcoZW4pWyBXQyBdCisJd2VhcG9ub2JqPW9iai0+UXVlcnlQcm9wKFBfV0VBUE9OKTsKKwlpZiggd2VhcG9ub2JqICkKKyAgICB3ZWFwb24gPSB3ZWFwb25vYmotPm5hbWUoUkFXKSArICIgKCIgKyAKKyAgICAgIG9iamVjdF9uYW1lKCB3ZWFwb25vYmogKSArICIpIFsiICsKKyAgICAgIHdlYXBvbm9iai0+UXVlcnlQcm9wKFBfV0MpICsgIl0iIDsKKwllbHNlCisJeworCQloYW5kcyA9IG9iai0+UXVlcnlQcm9wKFBfSEFORFMpOworCQl3ZWFwb24gPSBzcHJpbnRmKCAia2FlbXBmdCVzIFslZF0iLCBoYW5kc1swXSwgaGFuZHNbMV0gKTsKKwl9CisJYWMgPSAwOworCWxpc3QgPSBvYmotPlF1ZXJ5UHJvcChQX0FSTU9VUlMpOworCWFybW91ciA9ICIiOworCWZvciggaSA9IDA7IGkgPCBzaXplb2YoIGxpc3QgKTsgaSsrICkKKwl7CisgICAgIGFybW91ciArPSAoIGxpc3RbaV0tPm5hbWUoUkFXKSArICJbIiArCisgICAgICAgICBsaXN0W2ldLT5RdWVyeVByb3AoUF9BQykgKyAiXSIgKyAiLCAiKSA7CisJCSBhYyArPSBsaXN0W2ldLT5RdWVyeVByb3AoUF9BQyk7CisJfQorCisgIGlmKCBhcm1vdXIgPT0gIiIgKQorICAgIGFybW91ciA9ICJLZWluZSAgIiA7CisKKwlhcnIgPSBvbGRfZXhwbG9kZSggYnJlYWtfc3RyaW5nKCBhcm1vdXJbMC4uPDNdK3NwcmludGYoIiA9PlslZF0iLAorCQlhYytvYmotPlF1ZXJ5UHJvcChQX0JPRFkpICksIDY1ICksICJcbiIgKSA7CisJYXJtb3VyID0gYXJyWyAwIF0gOworCWZvciggaSA9IDE7IGkgPCBzaXplb2YoIGFyciApOyBpKysgKQorCQlhcm1vdXIgKz0gIlxuICAgICAgICAgICAgICIgKyBhcnJbIGkgXSA7CisgIHByaW50ZiggIldhZmZlLi4uLi4uOiAlcy5cblJ1ZXN0dW5nLi4uOiAlcy5cbiIsIHdlYXBvbiwgYXJtb3VyICkgOworCisJZ2VnbmVyID0gb2JqLT5RdWVyeUVuZW1pZXMoKTsKKwlpZiggcG9pbnRlcnAoZ2VnbmVyKSApCisJeworCQlnZWduZXIgPSBnZWduZXJbMF07CisJCWZvciggaT0wOyBpPHNpemVvZihnZWduZXIpOyBpKysgKQorCQl7CisJCQlpZiggaT09MCApIHByaW50ZiggIkdlZ25lci4uLi4uOiAiKTsgZWxzZSBwcmludGYoICIgICAgICAgICAgICAgIiApOworCQkJaWYoICFvYmplY3RwKGdlZ25lcltpXSkgKQorCQkJCXByaW50ZiggIjwlTz5cbiIsIGdlZ25lcltpXSApOworCQkJZWxzZQorCQkJCXByaW50ZiggIiVzICglcylcbiIsIGdlZ25lcltpXS0+bmFtZShXRVIsMCksIG9iamVjdF9uYW1lKGdlZ25lcltpXSkgKTsKKwkJfQorCX0KKworCW1rX3dhaXRmb3IoIG9iai0+UXVlcnlQcm9wKFBfV0FJVEZPUikgKTsKKworCW1rX2F1dG9sb2FkKCBvYmotPlF1ZXJ5UHJvcChQX0FVVE9MT0FEKSApOworCisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkIG1rX3dhaXRmb3IoIG1peGVkIHdhaXRmb3IgKQoreworCXN0cmluZyBzdHI7CisJaW50IGk7CisKKwlpZiggIXBvaW50ZXJwKHdhaXRmb3IpIHx8IHNpemVvZih3YWl0Zm9yKT09MCApCisJCXJldHVybjsKKwlzdHIgPSAiV2FpdGluZyBmb3I6ICI7CisJZm9yKCBpPXNpemVvZih3YWl0Zm9yKS0xOyBpPjA7IGktLSApCisJCXN0ciArPSB3YWl0Zm9yW2ldICsgIiwgIjsKKwlzdHIgKz0gd2FpdGZvclswXTsKKwl3cml0ZSggc3RyKyJcbiIgKTsKK30KKwkKK3N0YXRpYyB2b2lkIG1rX2F1dG9sb2FkKCBtaXhlZCBhdXRvbG9hZCApCit7CisJc3RyaW5nIHN0ciwgKm9iamxpc3Q7CisJaW50IGk7CisKKwlpZiggIW1hcHBpbmdwKGF1dG9sb2FkKSApCisJCXJldHVybjsKKwlzdHIgPSAiQXV0b2xvYWQuLi46ICI7CisJb2JqbGlzdCA9IG1faW5kaWNlcyhhdXRvbG9hZCk7CisJZm9yKCBpPXNpemVvZihvYmpsaXN0KS0xOyBpPj0wOyBpLS0gKQorCXsKKwkJc3RyICs9ICJcIiIgKyBvYmpsaXN0W2ldICsgIlwiXG4iOworCQlpZiggaT4wICkKKwkJCXN0ciArPSAiICAgICAgICAgICAgICI7CisJfQorCXdyaXRlKCBzdHIgKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfbWVtb3J5X2xpbmUoIHN0cmluZyBrZXksIG9iamVjdCBkYXRhLCBpbnQgZmxhZyApCit7CisgIHByaW50ZiggIiAlLTEwcyVzICIsIGtleSwgKGZsYWcgPyAiPiIgOiAiPSIpICk7CisgIGR1bXBfb2JqKCBkYXRhLCAxMyApOworfQorCQorc3RhdGljIGludCBjbWRfbWVtb3J5KCkKK3sKKyAgaW50IGk7CisgIGlmKCAhc2l6ZW9mKG1lbW9yeSkgKQorICAgIHJldHVybiBtZW1vKCAiS2VpbmUgVmFyaWFibGVuIGRlZmluaWVydCIgKTsKKworICB3YWxrX21hcHBpbmcoIG1lbW9yeSwgIydwcmludF9tZW1vcnlfbGluZSApOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBjbWRfYXJyYXkoKQoreworICBtaXhlZCAqYXJyYXk7CisgIG1peGVkIG9iOworCisJaWYoICFzaXplb2Yoc3RhY2spICkKKwkJcmV0dXJuIGVycm9yKCAiYXJyYXk6IERlciBTdGFjayBpc3QgbGVlciIgKTsKKyAgYXJyYXkgPSAoe30pOworICB3aGlsZSggc2l6ZW9mKHN0YWNrKSAmJiAob2I9cG9wKCkpICYmIG9iIT0iOyIgKQorICAgIGFycmF5ID0gKHtvYn0pICsgYXJyYXk7CisgIHB1c2goIGFycmF5ICk7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgY21kX3NwbGl0KCkKK3sKKyAgbWl4ZWQgKmFycmF5OworICBpbnQgaTsKKworCWlmKCAhcG9pbnRlcnAodG9wKCkpICkKKwkJcmV0dXJuIGVycm9yKCAic3BsaXQ6IFRPUyBpc3Qga2VpbiBBcnJheSIgKTsKKyAgYXJyYXk9cG9wKCk7CisgIGlmKCBzaXplb2Yoc3RhY2spICkKKyAgICBwdXNoKCAiOyIgKTsKKyAgZm9yKCBpPTA7IGk8c2l6ZW9mKGFycmF5KTsgaSsrICkKKyAgICBwdXNoKGFycmF5W2ldKTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBjbWRfcGxheWVyKCkKK3sKKwlvYmplY3Qgb2I7CisJc3RyaW5nIHN0cjsKKworCXN0ciA9IHRvcCgpOworCWlmKCAhc3RyaW5ncChzdHIpICkKKwkJcmV0dXJuIGVycm9yKCAicGxheWVyOiBUT1MgaXN0IGtlaW4gU3RyaW5nIiApOworCW9iID0gYmVjb21lc19wbCgpOworCWlmKCAhb2IgKQorCQlyZXR1cm4gZXJyb3IoICJwbGF5ZXI6IEtlaW5lbiBTcGllbGVyIG5hbWVucyBcIiIrc3RyKyJcIiBnZWZ1bmRlbiIgKTsKKwkvL3BvcCgpOworCS8vcHVzaChvYik7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgY21kX29iamVjdCgpCit7CisJb2JqZWN0IG9iOworCXN0cmluZyBlcnIsZm5hbTsKKworCWlmKCAhc3RyaW5ncCh0b3AoKSkgKQorCQlyZXR1cm4gZXJyb3IoICJvYmplY3Q6IFRPUyBpc3Qga2VpbiBTdHJpbmciICk7CisJb2IgPSBmaW5kX29iamVjdCh0b3AoKSk7CisJaWYoICFvYiApCisJeworCQlpZiggIShmbmFtPXRoaXNfcGxheWVyKCktPmZpbmRfZmlsZSh0b3AoKSwiLmMiKSkgKQorCQkJcmV0dXJuIGVycm9yKCAib2JqZWN0OiBLZWluIE9iamVrdCBuYW1lbnMgXCIiK3RvcCgpKyJcIiBnZWZ1bmRlbiIgKTsKKwkJaWYoIGVycj0oY2F0Y2goY2FsbF9vdGhlcihmbmFtLCI/IikpKSApCisJCQlyZXR1cm4gZXJyb3IoICJvYmplY3Q6IEZlaGxlciBiZWltIExhZGVuOiAiK2VyclsxLi48M10gKTsKKwkJb2IgPSBmaW5kX29iamVjdChmbmFtKTsKKwl9CisJcG9wKCk7CisJcHVzaChvYik7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgY21kX2xpdmluZygpCit7CisJb2JqZWN0IG9iOworCWlmKCAhc3RyaW5ncCh0b3AoKSkgKQorCQlyZXR1cm4gZXJyb3IoICJvYmplY3Q6IFRPUyBpc3Qga2VpbiBTdHJpbmciICk7CisJb2IgPSBmaW5kX2xpdmluZyh0b3AoKSk7CisJaWYoICFvYiApCisJCXJldHVybiBlcnJvciggIm9iamVjdDogS2VpbiBPYmpla3QgbmFtZW5zIFwiIit0b3AoKSsiXCIgZ2VmdW5kZW4iICk7CisJcG9wKCk7CisJcHVzaChvYik7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgY21kX3NheSgpCit7CisJbWl0X3NheSA9ICFtaXRfc2F5OworCWlmKCBtaXRfc2F5ICkKKwkJbWVtbyggIk1lbGR1bmdlbiBhbiBNaXRzcGllbGVyIGFuIiApOworCWVsc2UKKwkJbWVtbyggIk1lbGR1bmdlbiBhbiBNaXRzcGllbGVyIGF1cyIgKTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBjbWRfbmFtZXMoKQoreworCW1pdF9uYW1lbiA9ICFtaXRfbmFtZW47CisJaWYoIG1pdF9uYW1lbiApCisJCW1lbW8oICJOYW1lbiB3ZXJkZW4gYW5nZXplaWd0IiApOworCWVsc2UKKwkJbWVtbyggIk5hbWVuIHdlcmRlbiBuaWNodCBhbmdlemVpZ3QiICk7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgY21kX3NlY3VyZWludigpCit7CisJc2VjdXJlaW52ID0gIXNlY3VyZWludjsKKwlpZiggc2VjdXJlaW52ICkKKwkJbWVtbyggIkludmVudG9yeSB3aXJkIHVlYmVyd2FjaHQiICk7CisJZWxzZQorCQltZW1vKCAiSW52ZW50b3J5IHdpcmQgbmljaHQgdWViZXJ3YWNodCIgKTsKKwlzZXRfaGVhcnRfYmVhdChzZWN1cmVpbnYpOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IGNtZF9sb2dhY2Nlc3MoKQoreworCWRvbG9nYWNjZXNzID0gIWRvbG9nYWNjZXNzOworCWlmKCBkb2xvZ2FjY2VzcyApCisJCW1lbW8oICJadWdyaWZmZSB3ZXJkZW4gZ2VtZWxkZXQiICk7CisJZWxzZQorCQltZW1vKCAiWnVncmlmZmUgd2VyZGVuIG5pY2h0IGdlbWVsZGV0IiApOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IGNtZF9kZXN0cnVjdF9iYW5nKCkKK3sKKwlpZiggIWJlY29tZXNfb2JqKCkgKQorCQlyZXR1cm4gZXJyb3IoICJkZXN0cnVjdDogVE9TIGlzdCBrZWluIE9iamVrdCIgKTsKKwlkZXN0cnVjdChwb3AoKSk7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgY21kX2Rlc3RydWN0KCkKK3sKKwlpZiggIWJlY29tZXNfb2JqKCkgKQorCQlyZXR1cm4gZXJyb3IoICJyZW1vdmU6IFRPUyBpc3Qga2VpbiBPYmpla3QiICk7CisJbWVtbyggImRlc3RydWN0OiBUT1Mgd2lyZCAncmVtb3ZlZCchIiApOworCXRvcCgpLT5yZW1vdmUoKTsKKwlpZiggdG9wKCkgKQorCQltZW1vKCAiZGVzdHJ1Y3Q6IFRPUyBsZWJ0IG5vY2guIiApOworCWVsc2UKKwkJcG9wKCk7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgY21kX3JlbW92ZSgpCit7CisJaWYoICFiZWNvbWVzX29iaigpICkKKwkJcmV0dXJuIGVycm9yKCAicmVtb3ZlOiBUT1MgaXN0IGtlaW4gT2JqZWt0IiApOworCXRvcCgpLT5yZW1vdmUoKTsKKwlpZiggdG9wKCkgKQorCQltZW1vKCAiZGVzdHJ1Y3Q6IFRPUyBsZWJ0IG5vY2guIiApOworCWVsc2UKKwkJcG9wKCk7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgY21kX3VwZGF0ZSgpCit7CisJb2JqZWN0IGJsdWU7CisKKwlpZiggIWJlY29tZXNfb2JqKCkgKQorCQlyZXR1cm4gZXJyb3IoICJ1cGRhdGU6IFRPUyBpc3Qga2VpbiBPYmpla3QiICk7CisJYmx1ZSA9IGZpbmRfb2JqZWN0KG9sZF9leHBsb2RlKG9iamVjdF9uYW1lKHRvcCgpKSwiIyIpWzBdKTsKKwlibHVlLT5yZW1vdmUoKTsKKwlpZiggYmx1ZSApCisJCW1lbW8oICJ1cGRhdGU6IFRPUyBsZWJ0IG5vY2giICk7CisJZWxzZQorCQlwb3AoKTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBjbWRfdXBkYXRlX2JhbmcoKQoreworCWlmKCAhYmVjb21lc19vYmooKSApCisJCXJldHVybiBlcnJvciggInVwZGF0ZTogVE9TIGlzdCBrZWluIE9iamVrdCIgKTsKKwlkZXN0cnVjdChmaW5kX29iamVjdChvbGRfZXhwbG9kZShvYmplY3RfbmFtZShwb3AoKSksIiMiKVswXSkpOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IGNtZF9yb29tdXBkYXRlKCkKK3sKKwlyZXR1cm4gZG9fcm9vbXVwZGF0ZSggRkFMU0UsIEZBTFNFICk7Cit9CisKK3N0YXRpYyBpbnQgY21kX3Jvb211cGRhdGVfYmFuZygpCit7CisJcmV0dXJuIGRvX3Jvb211cGRhdGUoIFRSVUUsIEZBTFNFICk7Cit9CisKK3N0YXRpYyBpbnQgY21kX2V4dHJvb211cGRhdGUoKQoreworCXJldHVybiBkb19yb29tdXBkYXRlKCBGQUxTRSwgVFJVRSApOworfQorCitzdGF0aWMgaW50IGNtZF9leHRyb29tdXBkYXRlX2JhbmcoKQoreworCXJldHVybiBkb19yb29tdXBkYXRlKCBUUlVFLCBUUlVFICk7Cit9CisKKy8vIEhpbGZzZnVua3Rpb25lbiB6dW0gRmlsdGVybiB2b24gSXRlbXMKK3N0YXRpYyBvYmplY3QgKmNvbGxlY3RfaXRlbXM7CitzdGF0aWMgdm9pZCBjb2xsZWN0KCBvYmplY3QqIGRhdGEgKSB7IGNvbGxlY3RfaXRlbXMgKz0gKHsgZGF0YVswXSB9KTsgfQorCitzdGF0aWMgaW50IGRvX3Jvb211cGRhdGUoIGludCBkZXN0ZmxhZywgaW50IG5vaXRlbXMgKQoreworCW9iamVjdCB0bXByb29tLG5ld3Jvb207CisJb2JqZWN0ICppbnY7CisJc3RyaW5nIGVycm1zZzsKKwlzdHJpbmcgKmZpbGU7CisJb2JqZWN0ICppdGVtczsKKwlpbnQgaTsKKworCWlmKCAhYmVjb21lc19vYmooKSApCisJCXJldHVybiBlcnJvciggInJvb211cGRhdGU6IFRPUyBpc3Qga2VpbiBPYmpla3QiICk7CisJZmlsZSA9IG9sZF9leHBsb2RlKCBvYmplY3RfbmFtZSggdG9wKCkgKSwgIiMiICk7CisJaWYoIHNpemVvZihmaWxlKSA+IDEgKQorCQlyZXR1cm4gZXJyb3IoICJyb29tdXBkYXRlOiBUT1MgaXN0IGtlaW5lIEJsdWVwcmludCIgKTsKKwlpZiggZmlsZVswXSA9PSAiL3Jvb20vdm9pZCIgKQorCQlyZXR1cm4gZXJyb3IoICJyb29tdXBkYXRlOiBEaWUgYHZvaWQnIGRhcmYgbmljaHQgZ2V1cGRhdGV0IHdlcmRlbiIgKTsKKworCS8vIC0tLS0tIFJldHR1bmcJCisJdGVsbF9yb29tKCB0b3AoKSwKKwkJIkRlciBSYXVtIHZlcnNjaHdpbW10IHZvciBEZWluZW4gQXVnZW4sIHVtIHNpY2ggenUgZXJuZXVlcm4uXG4iCisJKTsKKwl0bXByb29tID0gY2xvbmVfb2JqZWN0KCAiL3Jvb20vdm9pZCIgKTsKKworCWlmKCBub2l0ZW1zICkKKwkgIC8vIE51ciBTcGllbGVyIGtvbW1lbiByYXVzLgorCQlpbnYgPSBmaWx0ZXIoIGFsbF9pbnZlbnRvcnkodG9wKCkpLCAjJ3F1ZXJ5X29uY2VfaW50ZXJhY3RpdmUgKTsKKwllbHNlCisJeyAvLyBEaW5nZSwgZGllIFBfSVRFTVMgc2luZCwgYmxlaWJlbiBkYSEKKwkJY29sbGVjdF9pdGVtcyA9ICh7fSk7CisJCW1hcCggdG9wKCktPlF1ZXJ5UHJvcChQX0lURU1TKSwgIydjb2xsZWN0ICk7IAorCQlpbnYgPSBhbGxfaW52ZW50b3J5KHRvcCgpKSAtIGNvbGxlY3RfaXRlbXM7CisJfQorCisJZm9yKCBpPXNpemVvZihpbnYpLTE7IGk+PTA7IGktLSApCisJCWludltpXS0+bW92ZSggdG1wcm9vbSwgTV9OT0NIRUNLIHwgTV9TSUxFTlQgfCBNX05PX1NIT1cgKTsKKworCS8vIC0tLS0tIFZlcm5pY2h0dW5nCisJaWYoIGRlc3RmbGFnICkKKwkJZGVzdHJ1Y3QoIHBvcCgpICk7CisJZWxzZQorCXsKKwkJdG9wKCktPnJlbW92ZSgpOworCQlpZiggdG9wKCkgKQorCQkJbWVtbyggInJvb211cGRhdGUgOiBUT1MgaXN0IG5pY2h0IHZlcnNjaHd1bmRlbi4iICk7CisJCWVsc2UKKwkJCXBvcCgpOworCX0KKworCS8vIC0tLS0tIE5ldWVyc2NoYWZmdW5nCisJZXJybXNnID0gY2F0Y2goIGNhbGxfb3RoZXIoIGZpbGVbMF0sICI/IiApICk7CisJaWYoIGVycm1zZyApCisJeworCQl0ZWxsX3Jvb20oIHRtcHJvb20sICJEZXIgUmF1bSB2ZXJibGVpY2h0IGluIGVpbiBOaWNodHMuXG4iICk7CisJCXB1c2goIGZpbGVbMF0gKTsKKwkJcmV0dXJuIGVycm9yKCAidXBkYXRlcm9vbTogIiArIGVycm1zZ1sxLi48Ml0gKTsKKwl9CisKKwkvLyAtLS0tLSBSZXN0YXVyaWVydW5nCisJbmV3cm9vbSA9IGZpbmRfb2JqZWN0KCBmaWxlWzBdICk7CisJZm9yKCBpPXNpemVvZihpbnYpLTE7IGk+PTA7IGktLSApCisJCWlmKCBvYmplY3RwKGludltpXSkgKSAvLyBPYmpla3RlIGtvZW5udGVuIHNpY2ggYmVpbSBlcnN0ZW4gbW92ZSB6ZXJzdG9lcmVuLgorCQkJaW52W2ldLT5tb3ZlKCBuZXdyb29tLCBNX05PQ0hFQ0sgfCBNX1NJTEVOVCB8IE1fTk9fU0hPVyApOworCXRlbGxfcm9vbSggbmV3cm9vbSwgIkRpZSBLb250dXJlbiB3ZXJkZW4gd2llZGVyIHNjaGFyZi5cbiIgKTsKKwlkZXN0cnVjdCggdG1wcm9vbSApOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IGNtZF9jbG9uZSgpCit7CisJaWYoICFzdHJpbmdwKHRvcCgpKSApCisJCXJldHVybiBlcnJvciggImNsb25lOiBUT1MgaXN0IGtlaW4gU3RyaW5nIiApOworCWlmKCBmaWxlX3NpemUodG9wKCkrIi5jIik8PTAgKQorCQlyZXR1cm4gZXJyb3IoICJjbG9uZTogS2VpbiBzb2xjaGVzIEZpbGUiICk7CisJcHVzaChjbG9uZV9vYmplY3QocG9wKCkpKTsKKwkvL2RvX21vdmUoIHRvcCgpLCBlbnZpcm9ubWVudChQTCkgKTsKKwkvL3RvcCgpLT5tb3ZlKFBMLE1fR0VUfE1fU0lMRU5UKTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBjbWRfbW92ZSgpCit7CisJb2JqZWN0IG9iOworCisJaWYoICFiZWNvbWVzX29iaigpICkKKwkJcmV0dXJuIGVycm9yKCAibW92ZTogWmllbCBpc3Qga2VpbiBPYmpla3QiICk7CisJb2IgPSBwb3AoKTsKKwlpZiggIWJlY29tZXNfb2JqKCkgKQorCQlyZXR1cm4gZXJyb3IoICJtb3ZlOiBLZWluIHNvbGNoZXIgR2VnZW5zdGFuZCIgKTsKKwlkb19tb3ZlKCBwb3AoKSwgb2IgKTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBjbWRfY2xlYW5vZl9iYW5nKCkKK3sKKwlyZXR1cm4gZG9fY2xlYW5vZiggVFJVRSApOworfQorCitzdGF0aWMgaW50IGNtZF9jbGVhbm9mKCkKK3sKKwlyZXR1cm4gZG9fY2xlYW5vZiggRkFMU0UgKTsKK30KKworc3RhdGljIGludCBkb19jbGVhbm9mKCBpbnQgc3Ryb25nICkKK3sKKwlvYmplY3QgKmludjsKKwlpbnQgaTsKKwlzdHJpbmcgY2xlYW5faWQ7CisKKwlpZiggIXN0cmluZ3AodG9wKCkpICkKKwkJcmV0dXJuIGVycm9yKCAiY2xlYW5vZjogVE9TIGlzdCBrZWluIFN0cmluZyIgKTsKKwljbGVhbl9pZCA9IHBvcCgpOworCWlmKCAhYmVjb21lc19vYmooKSApCisJeworCQlwdXNoKCBjbGVhbl9pZCApOworCQlyZXR1cm4gZXJyb3IoICJjbGVhbm9mOiBLZWluIE9iamVrdCB6dW0gTGVlcmVuIiApOworCX0KKwlmb3IoIGk9MCwgaW52PWFsbF9pbnZlbnRvcnkocG9wKCkpOyBpPHNpemVvZihpbnYpOyBpKysgKQorCQlpZiggaW52W2ldLT5pZChjbGVhbl9pZCkgKQorCQl7CisJCQlpZiggc3Ryb25nICkKKwkJCQlkZXN0cnVjdCggaW52W2ldICk7CisJCQllbHNlCisJCQkJaW52W2ldLT5yZW1vdmUoKTsKKwkJfQorCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IGNtZF9zbm9vcGVycygpCit7CisJb2JqZWN0KiB1LCBzbm9vcGVyOworCWludCBpLCBmbGFnOworCisJZmxhZyA9IDA7CisJdSA9IHVzZXJzKCk7CisJZm9yKCBpPTA7IGk8c2l6ZW9mKHUpOyBpKysgKQorCXsKKwkJaWYoIHNub29wZXIgPSBxdWVyeV9zbm9vcCh1W2ldKSApCisJCXsKKwkJCWZsYWcgPSAxOworCQkJcHJpbnRmKCAiJXMgd2lyZCBnZXNub29wZWQgdm9uOiAlcy5cbiIsCisJCQkJY2FwaXRhbGl6ZShnZXR1aWQodVtpXSkpLCBjYXBpdGFsaXplKGdldHVpZChzbm9vcGVyKSkgKTsKKwkJfQorCX0KKwlpZiggIWZsYWcgKQorCQltZW1vKCAiTW9tZW50YW4gd2lyZCBuaWVtYW5kIGdlc25vb3BlZCIgKTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBjbWRfcGluZygpCit7CisJb2JqZWN0IHBsOworCisJaWYoICFiZWNvbWVzX3BsKCkgKQorCQlyZXR1cm4gZXJyb3IoICJwaW5nOiBUT1MgaXN0IGtlaW4gU3BpZWxlciIgKTsKKworCXBsPXBvcCgpOworCWNhbGxfb3V0KCAicGluZyIsIDAsICh7IHBsLCA1IH0pICk7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkIHBpbmcoIG1peGVkKiBhcmd2ICkKK3sKKwlpZiggIWFyZ3ZbMF0gfHwgLS1hcmd2WzFdIDwgMCApIHJldHVybjsKKwl0ZWxsX29iamVjdCggYXJndlswXSwgQkVFUCtQTC0+bmFtZShXRVIpKyIgcGluZ3QgRGljaCBhbi5cbiIgKTsKKwljYWxsX291dCggInBpbmciLCAxLCBhcmd2ICk7Cit9CisKK3N0YXRpYyB2b2lkIGRvX2NhbGxvdXRpbmZvKCBtaXhlZCogY2FsbCApCit7CisJaW50IGwsaTsKKworCWlmKCBwb2ludGVycChjYWxsKSApCisJeworCQlwcmludGYoICIlNWQ6JU8tPiVPKCIsIGNhbGxbMl0sIGNhbGxbMF0sIGNhbGxbMV0pOworCQlpZiggKGw9c2l6ZW9mKGNhbGwpKT4zICkgeworCQkJZm9yKCA7IGw+PTMgJiYgIWNhbGxbLS1sXTsgKSA7CisJCQlmb3IoIGk9MzsgaTw9bDsgaSsrICkgcHJpbnRmKCAiJU8lcyIsIGNhbGxbaV0sIChpPT1sKT8iIjoiLCIgKTsKKwkJfQorCQl3cml0ZSgiKVxuIik7CisJfQorfQorCitzdGF0aWMgaW50IGNtZF9jYWxsb3V0c19iYW5nKCkKK3sKKwltaXhlZCAqY2FsbHM7CisJb2JqZWN0IG9iajsKKwlzdHJpbmcgbmFtZTsKKwlpbnQgaSxqOworCisJY2FsbHMgPSBjYWxsX291dF9pbmZvKCk7CisJaWYoICFwb2ludGVycChjYWxscykgfHwgIXNpemVvZihjYWxscykgKQorCXsKKwkJbWVtbyggIktlaW5lIENhbGxvdXRzIHZvcmhhbmRlbiIgKTsKKwkJcmV0dXJuIFRSVUU7CisJfQorCW1hcCggY2FsbHMsICMnZG9fY2FsbG91dGluZm8gKTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQgZG9fY2FsbG91dGluZm8yKCBtaXhlZCogY2FsbCwgc3RyaW5nIHN0ciApCit7CisJc3RyaW5nIHM7CisJaW50IGksbDsKKworCWlmKCBwb2ludGVycChjYWxsKSApCisJeworCQlzID0gc3ByaW50ZiggIiU1ZDolTy0+JU8oIiwgY2FsbFsyXSwgY2FsbFswXSwgY2FsbFsxXSk7CisJCWlmKCBzaXplb2YoZXhwbG9kZShzLHN0cikpID4gMSApCisJCXsKKwkJCXdyaXRlKCBzICk7CisJCQlpZiggKGw9c2l6ZW9mKGNhbGwpKT4zICkgeworCQkJCWZvciggOyBsPj0zICYmICFjYWxsWy0tbF07ICkgOworCQkJCWZvciggaT0zOyBpPD1sOyBpKysgKSBwcmludGYoICIlTyVzIiwgY2FsbFtpXSwgKGk9PWwpPyIiOiIsIiApOworCQkJfQorCQkJd3JpdGUoIilcbiIpOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IGNtZF9jYWxsb3V0cygpCit7CisJbWl4ZWQgKmNhbGxzOworCW9iamVjdCBvYmo7CisJc3RyaW5nIHN0cjsKKwlpbnQgaSxqOworCisJaWYoICFzdHJpbmdwKHRvcCgpKSApCisJCXJldHVybiBlcnJvciggIlRPUyBpc3Qga2VpbiBTdHJpbmciICk7CisJc3RyID0gcG9wKCk7CisJY2FsbHMgPSBjYWxsX291dF9pbmZvKCk7CisJaWYoICFwb2ludGVycChjYWxscykgfHwgIXNpemVvZihjYWxscykgKQorCXsKKwkJbWVtbyggIktlaW5lIENhbGxvdXRzIHZvcmhhbmRlbiIgKTsKKwkJcmV0dXJuIFRSVUU7CisJfQorCW1hcCggY2FsbHMsICMnZG9fY2FsbG91dGluZm8yLCBzdHIgKTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBjbWRfaGVhcnRiZWF0cygpCit7CisJbWl4ZWQgKmJlYXRzOworCWludCBpOworCW9iamVjdCBlbnY7CisJc3RyaW5nIGVuYW07CisKKwliZWF0cyA9IGhlYXJ0X2JlYXRfaW5mbygpOworCWlmKCAhcG9pbnRlcnAoYmVhdHMpIHx8ICFzaXplb2YoYmVhdHMpICkKKwl7CisJCW1lbW8oICJLZWluZSBIZWFydGJlYXRzIHZvcmhhbmRlbiIgKTsKKwkJcmV0dXJuIFRSVUU7CisJfQorCWZvciggaT0wOyBpPHNpemVvZihiZWF0cyk7IGkrKyApCisJeworCQllbnYgPSBlbnZpcm9ubWVudChiZWF0c1tpXSk7CisJCWVuYW0gPSBlbnYgPyBvYmplY3RfbmFtZShlbnYpIDogIi0tIG5pcmdlbmRzIC0tIjsKKwkJcHJpbnRmKCAiJS0zNXMgJS0zNXNcbiIsIG9iamVjdF9uYW1lKGJlYXRzW2ldKSwgZW5hbSApOworCX0KKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBjbWRfd2VyKCkKK3sKKwlvYmplY3QqIHBwbDsKKwlzdHJpbmcqIHBsOworCWludCBpOworCisJcHBsID0gc29ydF9hcnJheSggdXNlcnMoKSwgbGFtYmRhKCAoeyAneCwgJ3kgfSksCisJCSh7ICMnPCwgKHsgIydxdWVyeV9pcF9udW1iZXIsICd4IH0pLCAoeyAjJ3F1ZXJ5X2lwX251bWJlciwgJ3kgfSkgfSkKKwkpKTsKKwlwbCA9ICh7fSk7CisJZm9yKCBpPTA7IGk8c2l6ZW9mKHBwbCk7IGkrKyApCisJeworCQlwbCArPSAoeyBzcHJpbnRmKCAiJScuJy0xNHMgJS0xNXMgJTNkICVzIFxuIiwKKwkJCQljYXBpdGFsaXplKGdldGV1aWQocHBsW2ldKSksCisJCQkJcXVlcnlfaXBfbnVtYmVyKHBwbFtpXSksCisJCQkJcXVlcnlfd2l6X2xldmVsKHBwbFtpXSk+MCA/IHF1ZXJ5X3dpel9sZXZlbChwcGxbaV0pCisJCQkJCTogcHBsW2ldLT5RdWVyeVByb3AoUF9MRVZFTCksCisJCQkJcXVlcnlfd2l6X2xldmVsKHBwbFtpXSk+MCA/ICJXIiA6ICJQIgorCQkpIH0pOworCX0KKwl3cml0ZSggaW1wbG9kZShwbCwiIikgKTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBjbWRfZGVidWdpbmZvKCkKK3sKKwlpZiggIWJlY29tZXNfb2JqKCkgKQorCQlyZXR1cm4gZXJyb3IoICJkaW5mbzogVE9TIGlzdCBrZWluIE9iamVrdCIgKTsKKwlkZWJ1Z19pbmZvKCAwLCBwb3AoKSApOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IGNtZF9wcmV0dHkoKQoreworCXByZXR0eSA9ICFwcmV0dHk7CisJaWYoIHByZXR0eSApCisJCW1lbW8oICJTY2hvZW5tb2R1cyBhbiIgKTsKKwllbHNlCisJCW1lbW8oICJTY2hvZW5tb2R1cyBhdXMiICk7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgY21kX2RvcHJvZmlsZSgpCit7CisJZG9fcHJvZmlsZT0hZG9fcHJvZmlsZTsKKwlpZiggZG9fcHJvZmlsZSApCisJCW1lbW8oICJQcm9maWxlIHdpcmQgZ2VsYWRlbiIgKTsKKwllbHNlCisJCW1lbW8oICJQcm9maWxlIHdpcmQgbmljaHQgZ2VsYWRlbiIgKTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBjbWRfZXZhbHVhdGUoKQoreworCXN0cmluZyBzdHI7CisJaWYoICFzaXplb2Yoc3RhY2spICkgcmV0dXJuIGVycm9yKCAiZXZhbHVhdGU6IFN0YWNrIGlzdCBsZWVyIiApOworCWlmKCAhc3RyaW5ncCh0b3AoKSkgKSByZXR1cm4gZXJyb3IoICJldmFsdWF0ZTogVE9TIGlzdCBrZWluIFN0cmluZyIgKTsKKwlzdHIgPSBwb3AoKTsKKwlyZXR1cm4gZG9fY21kKCBzdHIgKTsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfbWVtb3J5KCBzdHJpbmcgbmFtLCBzdHJpbmcgc3RyLCBpbnQgZmxhZywgc3RyaW5nIGZpbGUgKQoreworCWlmKCBmbGFnICkgd3JpdGVfZmlsZSggZmlsZSwgbmFtICsgIiA9ICIgKyBzdHIgKyAiXG4iICk7Cit9CisKK3N0YXRpYyBpbnQgY21kX2R1bXAoKQoreworCXN0cmluZyBmaWxlOworCisJaWYoICFzaXplb2Yoc3RhY2spIHx8ICFzdHJpbmdwKHRvcCgpKSApCisJCWZpbGUgPSAiL3BsYXllcnMvIitnZXR1aWQoUEwpKyIvLm1lbW9yeS5vIjsKKwllbHNlCisJCWZpbGUgPSBwb3AoKTsKKwlybSggZmlsZSApOworCXdyaXRlX2ZpbGUoIGZpbGUsICIjIER1bXAgZGVzIFRlbGxlcnN0YXBlbHMgdm9tICIgKyBkdGltZSh0aW1lKCkpICsgIlxuIiApOworCXdyaXRlX2ZpbGUoIGZpbGUsICIjIE93bmVyID0gIitjYXBpdGFsaXplKGdldHVpZChQTCkpKyJcbiIgKTsKKwl3YWxrX21hcHBpbmcoIG1lbW9yeSwgIyd3cml0ZV9tZW1vcnksIGZpbGUgKTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCByZXN0b3JlX2xpbmUoIHN0cmluZyBsaW5lICkKK3sKKwlzdHJpbmcgbmFtLHN0cjsKKwlpZiggc3NjYW5mKCBsaW5lLCAiJXMgPSAlcyIsIG5hbSwgc3RyICkgIT0gMiApCisJCXJldHVybiBlcnJvciggInJlc3RvcmU6IEZlaGxlciBpbSBmaWxlIiApOworCW1lbW9yeSArPSAoWyBuYW06IHN0cjsgMSBdKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY21kX3Jlc3RvcmUoKQoreworCXN0cmluZyBzdHIsICpsaW5lczsKKworCWlmKCAhc2l6ZW9mKHN0YWNrKSB8fCAhc3RyaW5ncCh0b3AoKSkgKQorCQlzdHIgPSAiL3BsYXllcnMvIitnZXR1aWQoUEwpKyIvLm1lbW9yeS5vIjsKKwllbHNlCisJCXN0ciA9IHBvcCgpOworCisJaWYoZmlsZV9zaXplKHN0cik8PTApCisJCXJldHVybiBlcnJvciggInJlc3RvcmU6IGthbm4gJyIrc3RyKyInIG5pY2h0IGxhZGVuIiApOworCWxpbmVzID0gcmVnZXhwKCBvbGRfZXhwbG9kZSggcmVhZF9maWxlKHN0ciksICJcbiIgKSwgIl5bXiNdIiApOworCW1hcCggbGluZXMsICMncmVzdG9yZV9saW5lICk7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgY21kX2lmKCkKK3sKKwlpZiggc2l6ZW9mKHN0YWNrKSA8IDMgKQorCQlyZXR1cm4gZXJyb3IoICJpZjogenV3ZW5pZyBBcmd1bWVudGUiICk7CisJaWYoICFwb3AoKSApCisJCWNtZF9zd2FwKCk7CisJcG9wKCk7CisJcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL3RfZWZ1bi5jIGIvb2JqL3Rvb2xzL3RlbGxlci90X2VmdW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWEyZGVkCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci90X2VmdW4uYwpAQCAtMCwwICsxLDQxNiBAQAorc3RhdGljIGVmdW5fcmVnZXhwKCBhcmcxLCBhcmcyICkKK3sKKwlyZXR1cm4gcmVnZXhwKCBhcmcxLCBhcmcyICk7Cit9CisKK3N0YXRpYyBlZnVuX2FsbF9pbnZlbnRvcnkoIGFyZyApCit7CisJcmV0dXJuIGFsbF9pbnZlbnRvcnkoIGFyZyApOworfQorCitzdGF0aWMgZWZ1bl9icmVha19zdHJpbmcoIGFyZzEsIGFyZzIsIGFyZzMgKQoreworCXJldHVybiBicmVha19zdHJpbmcoIGFyZzEsIGFyZzIsIGFyZzMgKTsKK30KKworc3RhdGljIGVmdW5fY2FwaXRhbGl6ZSggYXJnICkKK3sKKwlyZXR1cm4gY2FwaXRhbGl6ZSggYXJnICk7Cit9CisKK3N0YXRpYyBlZnVuX2NhdCggYXJnMSwgYXJnMiwgYXJnMyApCit7CisJcmV0dXJuIGNhdCggYXJnMSwgYXJnMiwgYXJnMyApOworfQorCitzdGF0aWMgZWZ1bl9jbGVhcl9iaXQoIGFyZzEsIGFyZzIgKQoreworCXJldHVybiBjbGVhcl9iaXQoIGFyZzEsIGFyZzIgKTsKK30KKworc3RhdGljIGVmdW5fY3J5cHQoIGFyZzEsIGFyZzIgKQoreworCXJldHVybiBjcnlwdCggYXJnMSwgYXJnMiApOworfQorCitzdGF0aWMgZWZ1bl9jdGltZSggYXJnICkKK3sKKwlyZXR1cm4gY3RpbWUoIGFyZyApOworfQorCitzdGF0aWMgZWZ1bl9kZWJ1Z19pbmZvKCBhcmcxLCBhcmcyICkKK3sKKwlyZXR1cm4gZGVidWdfaW5mbyggYXJnMSwgYXJnMiApOworfQorCitzdGF0aWMgZWZ1bl9kZWVwX2ludmVudG9yeSggYXJnICkKK3sKKwlyZXR1cm4gZGVlcF9pbnZlbnRvcnkoIGFyZyApOworfQorCitzdGF0aWMgZWZ1bl9lbnZpcm9ubWVudCggYXJnICkKK3sKKwlyZXR1cm4gZW52aXJvbm1lbnQoIGFyZyApOworfQorCitzdGF0aWMgZWZ1bl9leHBsb2RlKCBhcmcxLCBhcmcyICkKK3sKKwlyZXR1cm4gb2xkX2V4cGxvZGUoIGFyZzEsIGFyZzIgKTsKK30KKworc3RhdGljIGVmdW5fZmlsZV9uYW1lKCBhcmcgKQoreworCXJldHVybiBvYmplY3RfbmFtZSggYXJnICk7Cit9CisKK3N0YXRpYyBlZnVuX2ZpbGVfc2l6ZSggYXJnICkKK3sKKwlyZXR1cm4gZmlsZV9zaXplKCBhcmcgKTsKK30KKworc3RhdGljIGVmdW5fZmlsdGVyX2FycmF5KCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0ICkKK3sKKwlyZXR1cm4gZmlsdGVyKCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0ICk7Cit9CisKK3N0YXRpYyBlZnVuX2ZpbmRfY2FsbF9vdXQoIGFyZyApCit7CisJcmV0dXJuIGZpbmRfY2FsbF9vdXQoIGFyZyApOworfQorCitzdGF0aWMgZWZ1bl9maW5kX2xpdmluZyggYXJnICkKK3sKKwlyZXR1cm4gZmluZF9saXZpbmcoIGFyZyApOworfQorCitzdGF0aWMgZWZ1bl9maW5kX29iamVjdCggYXJnICkKK3sKKwlyZXR1cm4gZmluZF9vYmplY3QoIGFyZyApOworfQorCitzdGF0aWMgZWZ1bl9maW5kX3BsYXllciggYXJnICkKK3sKKwlyZXR1cm4gZmluZF9wbGF5ZXIoIGFyZyApOworfQorCitzdGF0aWMgZWZ1bl9mdW5jdGlvbl9leGlzdHMoIGFyZzEsIGFyZzIgKQoreworCXJldHVybiBmdW5jdGlvbl9leGlzdHMoIGFyZzEsIGFyZzIgKTsKK30KKworc3RhdGljIGVmdW5faW1wbG9kZSggYXJnMSwgYXJnMiApCit7CisJcmV0dXJuIGltcGxvZGUoIGFyZzEsIGFyZzIgKTsKK30KKworc3RhdGljIGVmdW5faW50ZXJhY3RpdmUoIGFyZyApCit7CisJcmV0dXJuIGludGVyYWN0aXZlKCBhcmcgKTsKK30KKworc3RhdGljIGVmdW5faW50cCggYXJnICkKK3sKKwlyZXR1cm4gaW50cCggYXJnICk7Cit9CisKK3N0YXRpYyBlZnVuX2xhc3RfcmVib290X3RpbWUoKQoreworCXJldHVybiBsYXN0X3JlYm9vdF90aW1lKCk7Cit9CisKK3N0YXRpYyBlZnVuX2xpdmluZyggYXJnICkKK3sKKwlyZXR1cm4gbGl2aW5nKCBhcmcgKTsKK30KKworc3RhdGljIGVmdW5fbG93ZXJfY2FzZSggYXJnICkKK3sKKwlyZXR1cm4gbG93ZXJfY2FzZSggYXJnICk7Cit9CisKK3N0YXRpYyBlZnVuX2dldF9kaXIoIGFyZzEsIGFyZzIgKQoreworCXJldHVybiBnZXRfZGlyKCBhcmcxLCBhcmcyICk7Cit9CisKK3N0YXRpYyBlZnVuX21hcF9hcnJheSggYXJnMSwgYXJnMiwgYXJnMywgYXJnNCApCit7CisJcmV0dXJuIG1hcCggYXJnMSwgYXJnMiwgYXJnMywgYXJnNCApOworfQorCitzdGF0aWMgZWZ1bl9tZW1iZXIoIGFyZzEsIGFyZzIgKQoreworCXJldHVybiBtZW1iZXIoIGFyZzEsIGFyZzIgKTsKK30KKworc3RhdGljIGVmdW5fb2JqZWN0cCggYXJnICkKK3sKKwlyZXR1cm4gb2JqZWN0cCggYXJnICk7Cit9CisKK3N0YXRpYyBlZnVuX3BvaW50ZXJwKCBhcmcgKQoreworCXJldHVybiBwb2ludGVycCggYXJnICk7Cit9CisKK3N0YXRpYyBlZnVuX3ByZXNlbnQoIGFyZzEsIGFyZzIgKQoreworCXJldHVybiBwcmVzZW50KCBhcmcxLCBhcmcyICk7Cit9CisKK3N0YXRpYyBlZnVuX3Byb2Nlc3Nfc3RyaW5nKCBhcmcgKQoreworCXJldHVybiBwcm9jZXNzX3N0cmluZyggYXJnICk7Cit9CisKK3N0YXRpYyBlZnVuX3F1ZXJ5X2FjdGlvbnMoIGFyZzEsIGFyZzIgKQoreworCXJldHVybiBxdWVyeV9hY3Rpb25zKCBhcmcxLCBhcmcyICk7Cit9CisKK3N0YXRpYyBlZnVuX3F1ZXJ5X2lkbGUoIGFyZyApCit7CisJcmV0dXJuIHF1ZXJ5X2lkbGUoIGFyZyApOworfQorCitzdGF0aWMgZWZ1bl9xdWVyeV9pcF9uYW1lKCBhcmcgKQoreworCXJldHVybiBxdWVyeV9pcF9uYW1lKCBhcmcgKTsKK30KKworc3RhdGljIGVmdW5fcXVlcnlfaXBfbnVtYmVyKCBhcmcgKQoreworCXJldHVybiBxdWVyeV9pcF9udW1iZXIoIGFyZyApOworfQorCitzdGF0aWMgZWZ1bl9xdWVyeV9sb2FkX2F2ZXJhZ2UoKQoreworCXJldHVybiBxdWVyeV9sb2FkX2F2ZXJhZ2UoKTsKK30KKworc3RhdGljIGVmdW5fcXVlcnlfc25vb3AoIGFyZyApCit7CisJcmV0dXJuIHF1ZXJ5X3Nub29wKCBhcmcgKTsKK30KKworc3RhdGljIGVmdW5fcmFuZG9tKCBhcmcgKQoreworCXJldHVybiByYW5kb20oIGFyZyApOworfQorCitzdGF0aWMgZWZ1bl9yZWFkX2J5dGVzKCBhcmcxLCBhcmcyLCBhcmczICkKK3sKKwlyZXR1cm4gcmVhZF9ieXRlcyggYXJnMSwgYXJnMiwgYXJnMyApOworfQorCitzdGF0aWMgZWZ1bl9yZWFkX2ZpbGUoIGFyZzEsIGFyZzIsIGFyZzMgKQoreworCXJldHVybiByZWFkX2ZpbGUoIGFyZzEsIGFyZzIsIGFyZzMgKTsKK30KKworc3RhdGljIGVmdW5fcmVtb3ZlX2NhbGxfb3V0KCBhcmcgKQoreworCXJldHVybiByZW1vdmVfY2FsbF9vdXQoIGFyZyApOworfQorCitzdGF0aWMgZWZ1bl9yZW1vdmVfaW50ZXJhY3RpdmUoIGFyZyApCit7CisJcmV0dXJuIHJlbW92ZV9pbnRlcmFjdGl2ZSggYXJnICk7Cit9CisKK3N0YXRpYyBlZnVuX3J1c2FnZSgpCit7CisJcmV0dXJuIHJ1c2FnZSgpOworfQorCitzdGF0aWMgZWZ1bl9zYXkoIGFyZzEsIGFyZzIgKQoreworCWlmKCAhYXJnMiApIHJldHVybiBzYXkoIGFyZzEgKTsKKwlyZXR1cm4gc2F5KCBhcmcxLCBhcmcyICk7Cit9CisKK3N0YXRpYyBlZnVuX3NldF9iaXQoIGFyZzEsIGFyZzIgKQoreworCXJldHVybiBzZXRfYml0KCBhcmcxLCBhcmcyICk7Cit9CisKK3N0YXRpYyBlZnVuX3NldF9oZWFydF9iZWF0KCBhcmcgKQoreworCXJldHVybiBzZXRfaGVhcnRfYmVhdCggYXJnICk7Cit9CisKK3N0YXRpYyBlZnVuX3NldF9saXZpbmdfbmFtZSggYXJnICkKK3sKKwlyZXR1cm4gc2V0X2xpdmluZ19uYW1lKCBhcmcgKTsKK30KKworc3RhdGljIGVmdW5fc2l6ZW9mKCBhcmcgKQoreworCXJldHVybiBzaXplb2YoIGFyZyApOworfQorCitzdGF0aWMgZWZ1bl9zb3J0X2FycmF5KCBhcmcxLCBhcmcyLCBhcmczICkKK3sKKwlyZXR1cm4gc29ydF9hcnJheSggYXJnMSwgYXJnMiwgYXJnMyApOworfQorCitzdGF0aWMgZWZ1bl9zdHJpbmdwKCBhcmcgKQoreworCXJldHVybiBzdHJpbmdwKCBhcmcgKTsKK30KKworc3RhdGljIGVmdW5fc3RybGVuKCBhcmcgKQoreworCXJldHVybiBzaXplb2YoIGFyZyApOworfQorCitzdGF0aWMgZWZ1bl90YWlsKCBhcmcgKQoreworCXJldHVybiB0YWlsKCBhcmcgKTsKK30KKworc3RhdGljIGVmdW5fc2hvdXQoIGFyZyApCit7CisJcmV0dXJuIHNob3V0KCBhcmcgKTsKK30KKworc3RhdGljIGVmdW5fdGVsbF9vYmplY3QoIGFyZzEsIGFyZzIgKQoreworCXJldHVybiB0ZWxsX29iamVjdCggYXJnMSwgYXJnMiApOworfQorCitzdGF0aWMgZWZ1bl90ZWxsX3Jvb20oIGFyZzEsIGFyZzIsIGFyZzMgKQoreworCXJldHVybiB0ZWxsX3Jvb20oIGFyZzEsIGFyZzIsIGFyZzMgKTsKK30KKworc3RhdGljIGVmdW5fdGVzdF9iaXQoIGFyZzEsIGFyZzIgKQoreworCXJldHVybiB0ZXN0X2JpdCggYXJnMSwgYXJnMiApOworfQorCitzdGF0aWMgZWZ1bl90aW1lKCkKK3sKKwlyZXR1cm4gdGltZSgpOworfQorCitzdGF0aWMgZWZ1bl91bmlxdWVfYXJyYXkoIGFyZzEsIGFyZzIsIGFyZzMgKQoreworCXJldHVybiB1bmlxdWVfYXJyYXkoIGFyZzEsIGFyZzIsIGFyZzMgKTsKK30KKworc3RhdGljIGVmdW5fdXNlcnMoKQoreworCXJldHVybiB1c2VycygpOworfQorCitzdGF0aWMgZWZ1bl92ZXJzaW9uKCkKK3sKKwlyZXR1cm4gdmVyc2lvbigpOworfQorCitzdGF0aWMgZWZ1bl93cml0ZSggYXJnICkKK3sKKwlyZXR1cm4gd3JpdGUoIGFyZyApOworfQorCitzdGF0aWMgZWZ1bl93cml0ZV9ieXRlcyggYXJnMSwgYXJnMiwgYXJnMyApCit7CisJcmV0dXJuIHdyaXRlX2J5dGVzKCBhcmcxLCBhcmcyLCBhcmczICk7Cit9CisKK3N0YXRpYyBlZnVuX3dyaXRlX2ZpbGUoIGFyZzEsIGFyZzIgKQoreworCXJldHVybiB3cml0ZV9maWxlKCBhcmcxLCBhcmcyICk7Cit9CisKK3N0YXRpYyBlZnVuX2dldGV1aWQoIGFyZyApCit7CisJcmV0dXJuIGdldGV1aWQoIGFyZyApOworfQorCitzdGF0aWMgZWZ1bl9nZXR1aWQoIGFyZyApCit7CisJcmV0dXJuIGdldHVpZCggYXJnICk7Cit9CisKK3N0YXRpYyBlZnVuX2ZpcnN0X2ludmVudG9yeSggYXJnICkKK3sKKwlyZXR1cm4gZmlyc3RfaW52ZW50b3J5KCBhcmcgKTsKK30KKworc3RhdGljIGVmdW5fbmV4dF9pbnZlbnRvcnkoIGFyZyApCit7CisJcmV0dXJuIG5leHRfaW52ZW50b3J5KCBhcmcgKTsKK30KKworc3RhdGljIGVmdW5faW5oZXJpdF9saXN0KCBhcmcgKQoreworCXJldHVybiBpbmhlcml0X2xpc3QoIGFyZyApOworfQorCitzdGF0aWMgZWZ1bl9zdHJzdHIoIGFyZzEsIGFyZzIsIGFyZzMgKQoreworCXJldHVybiBzdHJzdHIoIGFyZzEsIGFyZzIsIGFyZzMgKTsKK30KKworc3RhdGljIGVmdW5fcHJvZ3JhbV90aW1lKCBhcmcgKQoreworCXJldHVybiBwcm9ncmFtX3RpbWUoIGFyZyApOworfQorCitzdGF0aWMgZWZ1bl9nZXRfZXJyb3JfZmlsZSggYXJnMSwgYXJnMiApCit7CisJcmV0dXJuIGdldF9lcnJvcl9maWxlKCBhcmcxLCBhcmcyICk7Cit9CisKK3N0YXRpYyBlZnVuX3NldF9wcm9tcHQoIGFyZzEsIGFyZzIgKQoreworCXJldHVybiBzZXRfcHJvbXB0KCBhcmcxLCBhcmcyICk7Cit9CisKK3N0YXRpYyBlZnVuX2ZpbHRlcl9vYmplY3RzKCBhcmcxLCBhcmcyLCBhcmczICkKK3sKKwlyZXR1cm4gZmlsdGVyX29iamVjdHMoIGFyZzEsIGFyZzIsIGFyZzMgKTsKK30KKworc3RhdGljIGVmdW5fbWFwX29iamVjdHMoIGFyZzEsIGFyZzIsIGFyZzMgKQoreworCXJldHVybiBtYXBfb2JqZWN0cyggYXJnMSwgYXJnMiwgYXJnMyApOworfQorCitzdGF0aWMgZWZ1bl90cmFuc3Bvc2VfYXJyYXkoIGFyZyApCit7CisJcmV0dXJuIHRyYW5zcG9zZV9hcnJheSggYXJnICk7Cit9CisKK3N0YXRpYyBlZnVuX3F1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoIGFyZyApCit7CisJcmV0dXJuIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoIGFyZyApOworfQorCitzdGF0aWMgZWZ1bl93aXpsaXN0KCBhcmcgKQoreworCXdpemxpc3QoIGFyZyApOworCXJldHVybiAxOworfQorCitzdGF0aWMgZWZ1bl9ta2Rpciggc3RyICkKK3sKKwlyZXR1cm4gbWtkaXIoIHN0ciApOworfQorCitzdGF0aWMgZWZ1bl9ybSggc3RyICkKK3sKKwlyZXR1cm4gcm0oIHN0ciApOworfQorCitzdGF0aWMgZWZ1bl9jb3VudHJ5KCBzdHIgKQoreworCXJldHVybiBjb3VudHJ5KCBzdHIgKTsKK30KKworc3RhdGljIGVmdW5fZHRpbWUoIHZhbCApCit7CisJcmV0dXJuIGR0aW1lKCB2YWwgKTsKK30KZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvdF9wbGF5ZXIuYyBiL29iai90b29scy90ZWxsZXIvdF9wbGF5ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzJiMTAwCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci90X3BsYXllci5jCkBAIC0wLDAgKzEsNjAgQEAKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFp3aXNjaGVub2JqZWt0IHp1bSBMZXNlbiBkZXIgU3BpZWxlcmRhdGVuIGF1Y2ggdm9uIG5pY2h0ZWluZ2Vsb2dndGVuLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2luY2x1ZGUgInRlbGxlci5oIgorCitpbmhlcml0ICJzdGQvcGxheWVyL2Jhc2UiOworCitjcmVhdGUoKSB7CisJdXNlZF9hdHRyaWJ1dGVzX29mZnNldHMgPSAoW10pOworfQorCitzdHJpbmcgbmFtZTsKK3N0cmluZyByYWNlOworc3RyaW5nIGhhbmRzOworbWFwcGluZyBhdXRvbG9hZDsKKworX3F1ZXJ5X25hbWUoKSB7IHJldHVybiBuYW1lOyB9CitwbGF5ZXJuYW1lKCkgeyByZXR1cm4gbmFtZTsgfQorX3NldF9uYW1lKCBzdHIgKSB7IHJldHVybiBuYW1lPXN0cjsgfQorCitfcXVlcnlfcmFjZSgpCit7CisJaWYoIHJhY2UgKSByZXR1cm4gcmFjZTsKKwkJCisJcmV0dXJuICIvc2VjdXJlL21hc3RlciIKKwkJLT5xdWVyeV9wbGF5ZXJfb2JqZWN0KGxvd2VyX2Nhc2UobmFtZSkpCisJCS0+UXVlcnlQcm9wKFBfUkFDRSk7Cit9CisKK19xdWVyeV9oYW5kcygpCit7CisJaWYoIGhhbmRzICkgcmV0dXJuIGhhbmRzOworCXJldHVybiAoeyAiIG5pY2h0IiwgMCB9KTsKK30KKworX3F1ZXJ5X2F1dG9sb2FkKCkKK3sKKwlyZXR1cm4gYXV0b2xvYWQ7Cit9CisKK0xvYWQoIHN0ciApCit7CisJcmVzdG9yZV9vYmplY3QoICIvc2F2ZS8iK3N0clswLi4wXSsiLyIrc3RyICk7Cit9CisKK05vdGxvZ2dlZCgpIHsgcmV0dXJuIFRSVUU7IH0KKworUXVlcnlNb25leSgpCit7CisJaWYoICFtYXBwaW5ncChhdXRvbG9hZCkgKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gYXV0b2xvYWRbIi9pdGVtcy9tb25leSJdOworfQorCitRdWVyeUVuZW1pZXMoKQoreworICAgICAgICByZXR1cm4gKHsoe30pLCh7fSl9KTsKK30KKworUXVlcnlBdHRyaWJ1dGVPZmZzZXQoIGFyciApIHsgcmV0dXJuICI/IjsgfQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci90ZWxsZXIuYyBiL29iai90b29scy90ZWxsZXIvdGVsbGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYzNGYwNgotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvdGVsbGVyLmMKQEAgLTAsMCArMSw2ODYgQEAKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRlbGxlcnN0YXBlbCwgZWluIFN0YWNrb3JpZW50aWVydGVzIG1hZ2llcnRvb2wuCisvLyBSdW1hdGEgMTUuMDkuOTMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpbmNsdWRlICJ0ZWxsZXIuaCIKK2luaGVyaXQgInN0ZC9zZWN1cmVfdGhpbmciOworaW5oZXJpdCBUX0NNRFM7Citpbmhlcml0IFRfRUZVTjsKK2luaGVyaXQgInN0ZC9tb3JlIjsKKworI2luY2x1ZGUgIi9zZWN1cmUvd2l6bGV2ZWxzLmgiCisKK25vc2F2ZSBtYXBwaW5nIHRjb21tYW5kczsKK25vc2F2ZSBzdHJpbmcgb3duZXJfbmFtZTsKKwordm9pZCBsb2dhY2Nlc3MoIHN0cmluZyBzICk7CitzdGF0aWMgdm9pZCBkb19tc2coIHN0cmluZyBzLCBvYmplY3QgbyApOworc3RhdGljIHN0cmluZ3xpbnQgcGFyc2VOZXh0KCBzdHJpbmcgc3RyLCBtaXhlZCBhdXhzdGFjaywgc3RyaW5nIGZ1bm5hbWUgKTsKK3N0YXRpYyBtaXhlZCBuZXh0QWxwaGEoIHN0cmluZyBzICk7CitzdGF0aWMgdmFyYXJncyB2b2lkIHJlc3RvcmVfc3RhY2soIHN0cmluZyogYXJndiwgaW50IGFyZ3MgKTsKK3N0YXRpYyBpbnQgZG9fY2FsbCggc3RyaW5nIGZ1biwgaW50IG1pdF9yZXR1cm4gKTsKK3N0YXRpYyBpbnQgZG9fY2FsbF9lZnVuKCBzdHJpbmcgZnVuLCBpbnQgbWl0X3JldHVybiApOworc3RhdGljIGludCBkb19scGMoIHN0cmluZyBzdHIsIGludCBtaXRfcmV0dXJuICk7CitzdGF0aWMgaW50IGRvX2NtZCggc3RyaW5nIHN0ciApOworaW50IGVycm9yKCBzdHJpbmcgcyApOworCitzdGF0aWMgdm9pZCB0QWRkQ21kKCBtaXhlZCBjbWQgKQoreworCWludCBpOworCisJLy9pZiAoZmluZF9wbGF5ZXIoInJpa3VzIikpIHRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJyaWt1cyIpLHNwcmludGYoIiVPXG4iLGNtZCkpOworCWlmKCAhcG9pbnRlcnAoY21kKSApCisgICAgbV9hZGQodGNvbW1hbmRzLCBjbWQsIGNtZCk7CisJZWxzZQorCQlmb3IoIGk9MDsgaTxzaXplb2YoY21kKTsgaSsrICkKKyAgICAgIG1fYWRkKHRjb21tYW5kcywgY21kW2ldLCBjbWRbMF0pOworfQorCit2b2lkIGNyZWF0ZSgpCit7CisJaWYoIElTX0JMVUUoTUUpICkgcmV0dXJuOworCWlmKCAhZmluZF9wbGF5ZXIoZ2V0dWlkKCkpICkgcmV0dXJuOworCW93bmVyX25hbWUgPSBmaW5kX3BsYXllcihnZXR1aWQoKSktPm5hbWUoV0VTU0VOLDEpOworCisJc2VjdXJlX3RoaW5nOjpjcmVhdGUoKTsKKwl0X2NtZHM6OmNyZWF0ZSgpOworCVNldFByb3AoIFBfTkFNRSwgIlRlbGxlcnN0YXBlbCIgKTsKKwlTZXRQcm9wKCBQX0dFTkRFUiwgTUFMRSApOworCUFkZElkKCAoeyJ0ZWxsZXIiLCJzdGFwZWwiLCJ0ZWxsZXJzdGFwZWwifSkgKTsKKwlTZXRQcm9wKCBQX05PRFJPUCwgIldvenUgZGVubj9cbiIgKTsKKwlTZXRQcm9wKCBQX05FVkVSRFJPUCwgMSApOworCVNldFByb3AoIFBfUkVBRF9NU0csICJEaWUgR3JhdnVyIGJlc2FndDogJ0F1cyBkZXIgUnVtYXRhLU1hbnVmYWt0dXInXG4iICk7CisJdGNvbW1hbmRzID0gKFtdKTsKKwkKKwl0QWRkQ21kKCAic2F5IiApOworCXRBZGRDbWQoICh7Im5hbWVzIiwibmFtIn0pICk7CisJdEFkZENtZCggInNlY3VyZWludiIgKTsKKwl0QWRkQ21kKCAibG9nYWNjZXNzIiApOworCXRBZGRDbWQoICJwcmV0dHkiICk7CisJdEFkZENtZCggImRvcHJvZmlsZSIgKTsKKwl0QWRkQ21kKCAoeyJjbGVhciIsImNsciJ9KSk7CisJdEFkZENtZCggInBvcCIgKTsKKwl0QWRkQ21kKCAiZHVwIiApOworCXRBZGRDbWQoICJzd2FwIiApOworCXRBZGRDbWQoICh7ImV2YWx1YXRlIiwiZXZhbCJ9KSApOworCisJdEFkZENtZCggImhlcmUiICk7CisJdEFkZENtZCggIm1lIiApOworCisJdEFkZENtZCggKHsibWVtb3J5IiwibWVtIn0pICk7CisJdEFkZENtZCggImR1bXAiICk7CisJdEFkZENtZCggInJlc3RvcmUiICk7CisJdEFkZENtZCggInRvcCIgKTsKKwl0QWRkQ21kKCAid2VyIiApOworCXRBZGRDbWQoICh7InN0YWNrIiwic3RrIn0pICk7CisJdEFkZENtZCggKHsic25vb3BlcnMiLCJzbm9vcCJ9KSApOworCXRBZGRDbWQoICJjYWxsb3V0cyIgKTsKKwl0QWRkQ21kKCAoeyJjYWxsb3V0c19iYW5nIiwiY2FsbG91dHMhIn0pICk7CisJdEFkZENtZCggKHsiaGVhcnRiZWF0cyIsImJlYXRzIn0pICk7CisJdEFkZENtZCggImludiIgKTsKKwl0QWRkQ21kKCAoeyJyZWtpbnYiLCJyaW52In0pICk7CisJdEFkZENtZCggInNjYW4iICk7CisJdEFkZENtZCggImlmIiApOworCisJdEFkZENtZCggKHsiYXJyYXkiLCJhcnIifSkgKTsKKwl0QWRkQ21kKCAoeyJzcGxpdCIsInNwbCJ9KSApOworCXRBZGRDbWQoICh7InBsYXllciIsInBsIn0pICk7CisJdEFkZENtZCggKHsibGl2aW5nIiwibHYifSkgKTsKKwl0QWRkQ21kKCAoeyJvYmplY3QiLCJvYiJ9KSApOworCisJdEFkZENtZCggKHsiZGVidWdpbmZvIiwiZGluZm8ifSkgKTsKKwl0QWRkQ21kKCAoeyJjbG9uZSIsImNsbiJ9KSApOworCXRBZGRDbWQoICh7InVwZGF0ZSIsInVwZCJ9KSApOworCXRBZGRDbWQoICh7InVwZGF0ZV9iYW5nIiwidXBkYXRlISIsInVwZCEifSkgKTsKKwl0QWRkQ21kKCAoeyJtb3ZlIiwibXYifSkgKTsKKwl0QWRkQ21kKCAoeyJkZXN0cnVjdCIsImRlc3QiLCJkZXMifSkgKTsKKwl0QWRkQ21kKCAoeyJyZW1vdmUiLCJyZW0ifSkgKTsKKwl0QWRkQ21kKCAoeyJkZXN0cnVjdF9iYW5nIiwiZGVzdHJ1Y3QhIiwiZGVzdCEiLCJkZXMhIiwicmVtb3ZlISIsInJlbSEifSkgKTsKKwl0QWRkQ21kKCAoeyJyb29tdXBkYXRlIiwicnVwZGF0ZSIsInJ1cGQiLCJydXAifSkgKTsKKwl0QWRkQ21kKCAoeyJyb29tdXBkYXRlX2JhbmciLCJyb29tdXBkYXRlISIsInJ1cGRhdGUhIiwicnVwZCEiLCJydXAhIn0pICk7CisJdEFkZENtZCggKHsiZXh0cm9vbXVwZGF0ZSIsInJ1cGRhdGUqIiwicnVwZCoiLCJydXAqIn0pICk7CisJdEFkZENtZCggKHsiZXh0cm9vbXVwZGF0ZV9iYW5nIiwicm9vbXVwZGF0ZSohIiwicnVwZGF0ZSohIiwicnVwZCohIiwicnVwKiEiLAorCQkicnVwISoiIH0pICk7CisJdEFkZENtZCggKHsiY2xlYW5vZiIsImNsbm9mIn0pICk7CisJdEFkZENtZCggKHsiY2xlYW5vZl9iYW5nIiwiY2xlYW5vZiEiLCJjbG5vZiEifSkgKTsKKworCXRBZGRDbWQoICJwaW5nIiApOworfQorCit2b2lkIGluaXQoKQoreworCS8vbG9nYWNjZXNzKCAiaW5pdCIgKTsKKwk6OmluaXQoKTsKKwlpZiAoICFJU19XSVpBUkQoUEwpIHx8IGVudmlyb25tZW50KCkhPVBMICkKKwkJcmV0dXJuOworCWFkZF9hY3Rpb24oICJwYXJzZSIsICIsIiwgMSApOworCWFkZF9hY3Rpb24oICJqb25nbGllciIsICJqb25nbGllciIsIDEgKTsKKwlhZGRfYWN0aW9uKCAibWVzc2FnZSIsICJtZXNzYWdlIiApOworCWFkZF9hY3Rpb24oICJtZXNzYWdlIiwgIm1zZyIgKTsKK30KKworc2hvcnQoKQoreworCWxvZ2FjY2VzcyggInNob3J0IiApOworCXJldHVybiAiRWluIFN0YXBlbCBUZWxsZXIuXG4iOworfQorCitpZCggc3RyICkKK3sKKwlsb2dhY2Nlc3MoICJpZCIgKTsKKwlyZXR1cm4gOjppZChzdHIpOworfQorCituYW1lKCBjYXN1cywgZGVtLCBmb3JjZSApCit7CisJbG9nYWNjZXNzKCAibmFtZSIgKTsKKwlyZXR1cm4gOjpuYW1lKCBjYXN1cywgZGVtLCBmb3JjZSApOworfQorCitsb25nKCkKK3sKKwlzdHJpbmcgYW5zd2VyOworCQorCWFuc3dlciA9CisJCSAiRHUgYmV0cmFjaHRlc3QgIitvd25lcl9uYW1lKyIgbWFnaXNjaGVuIFRlbGxlcnN0YXBlbC4gRGllIGVpbnplbG5lbiBUZWxsZXIgc2luZFxuIgorCQkrImJpcyBhdWYgZWluZSBrbGVpbmUgSW5zY2hyaWZ0IGF1ZiBkZW0gQm9kZW4gd2Vpc3MuIFdlbm4gRHUgaGllcm1pdFxuIgorCQkrImpvbmdsaWVyc3QsIGthbm4gQUxMRVMgcGFzc2llcmVuLlxuIjsKKworCWlmKCBnZXR1aWQoUEwpID09IGdldHVpZCgpICkKKwl7CisJCWFuc3dlciArPQorCQkJKCBtaXRfc2F5CisJCQkJPyAiRGllIFRlbGxlciBzaW5kIGJlaW0gSm9uZ2xpZXJlbiBzaWNodGJhci5cbiIKKwkJCQk6ICJEaWUgVGVsbGVyIHNpbmQgYmVpbSBKb25nbGllcmVuIHVuc2ljaHRiYXIuXG4iCisJCQkpICsgKCBtaXRfbmFtZW4KKwkJCQk/ICJEaWUgVGVsbGVyIG5lbm5lbiBkaWUgRGluZ2UgYmVpbSBOYW1lbi5cbiIKKwkJCQk6ICJEaWUgVGVsbGVyIG5lbm5lbiBkaWUgRGluZ2UgYmVpbSBGaWxlbmFtZW4uXG4iCisJCQkpICsgKCBwcmV0dHkKKwkJCQk/ICJEaWUgVGVsbGVyIGhhYmVuIGVpbiB2ZXJzY2hub2Vya2VsdGVzIE11c3Rlci5cbiIKKwkJCQk6ICJEaWUgVGVsbGVyIHNpbmQgZ2VyYWRlenUgc2NobXVja2xvcy5cbiIKKwkJCSkgKyAoIGRvbG9nYWNjZXNzCisJCQkJPyAiRGllIFRlbGxlciBzcHVlcmVuIFp1Z3JpZmZlLlxuIgorCQkJCTogIiIKKwkJCSkgKyAoIHNlY3VyZWludgorCQkJCT8gIkRpZSBUZWxsZXIgYmV3YWNoZW4gRGVpbiBJbnZlbnRhci5cbiIKKwkJCQk6ICIiCisJCQkpICsgKCBkb19wcm9maWxlCisJCQkJPyAiRGllIFRlbGxlciB3ZXJkZW4gYmVpbSBFaW5sb2dnZW4gYWt0aXYuXG4iCisJCQkJOiAiIgorCQkJKTsKKwl9IAorCXJldHVybiBhbnN3ZXI7IAkKK30KKwordm9pZCBfc2V0X2F1dG9sb2Fkb2JqKCBtaXhlZCB2YWwgKQoreworCWlmKCAhcG9pbnRlcnAodmFsKSApIHJldHVybjsKKwl2YWwgKz0gKHsgMCwwLDAsMCwwLDAgfSk7CisJbWl0X25hbWVuID0gdmFsWzBdOworCW1pdF9zYXkgPSB2YWxbMV07CQorCXNldF9oZWFydF9iZWF0KCBzZWN1cmVpbnYgPSB2YWxbMl0gKTsKKwlkb2xvZ2FjY2VzcyA9IHZhbFszXTsKKwlwcmV0dHkgPSB2YWxbNF07CisJZG9fcHJvZmlsZSA9IHZhbFs1XTsKKwlpZiggZG9fcHJvZmlsZSApIGNhbGxfb3V0KCAiX2xvYWRfcHJvZmlsZSIsIDAsIHRoaXNfcGxheWVyKCkgKTsKK30KKworbWl4ZWQgX3F1ZXJ5X2F1dG9sb2Fkb2JqKCkKK3sKKwlyZXR1cm4gKHsgbWl0X25hbWVuLCBtaXRfc2F5LCBzZWN1cmVpbnYsIGRvbG9nYWNjZXNzLCBwcmV0dHksCisJCWRvX3Byb2ZpbGUgfSk7Cit9CisKK3ZvaWQgX2xvYWRfcHJvZmlsZSggb2JqZWN0IHBsICkKK3sKKwlzdHJpbmcgcGYsZXJybXNnOworCisJaWYoIGdldGV1aWQoKSAmJiBwbCAmJiBnZXRldWlkKHBsKT09Z2V0ZXVpZCgpCisJCSYmIGZpbGVfc2l6ZShwZj0iL3BsYXllcnMvIitnZXRldWlkKCkrIi8ucHJvZmlsZS5jIik+MAorCQkmJiAoZXJybXNnPWNhdGNoKGNhbGxfb3RoZXIocGYsInNldHVwIixwbCkpKQorCSkKKwkJcHJpbnRmKCAiRXJyb3IgbG9hZGluZyBwcm9maWxlOiAlT1xuIiwgZXJybXNnICk7Cit9CisKK3ZvaWQgbG9nYWNjZXNzKCBzdHJpbmcgc3RyICkKK3sKKwlpZiggUlBMICYmIGRvbG9nYWNjZXNzICYmIGdldHVpZCgpIT1nZXR1aWQoUlBMKSAmJiBmaW5kX3BsYXllcihnZXR1aWQoKSkKKwkJJiYgcHJldmlvdXNfb2JqZWN0KCkgJiYgZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKSAhPSBST09USUQKKwkJJiYgcXVlcnlfd2l6X2xldmVsKGdldHVpZCgpKT49cXVlcnlfd2l6X2xldmVsKGdldHVpZChSUEwpKQorCSkKKwkJdGVsbF9vYmplY3QoIGZpbmRfcGxheWVyKGdldHVpZCgpKSwgIk1FTU86ICIgKyBzdHIgKyAiKCkgdm9uICIKKwkJCSsgUlBMLT5uYW1lKFdFTSkgKyAiIHZpYSBbIgorCQkJKyBvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSkrIl0uXG4iCisJCSk7CisJaWYoIHNlY3VyZWludiAmJiBmaW5kX3BsYXllcihnZXR1aWQoKSkgJiYgIW1lbWJlcihoZWFydF9iZWF0X2luZm8oKSxNRSkgKQorCXsKKwkJdGVsbF9vYmplY3QoIGZpbmRfcGxheWVyKGdldHVpZCgpKSwgIk1FTU86IGhlYXJ0X2JlYXQgcmVzdGFydGV0IS5cbiIgKTsKKwkJc2V0X2hlYXJ0X2JlYXQoVFJVRSk7CisJfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIaWxmZS1GdW5rdGlvbmVuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgaW50IHNlY3VyZSgpCit7CisJaW50IGk7CisJaWYoIHByb2Nlc3NfY2FsbCgpIHx8IHNlY3VyZV9sZXZlbCgpPHF1ZXJ5X3dpel9sZXZlbChSUEwpICkgcmV0dXJuIDA7CisJZm9yKCBpPTA7IHByZXZpb3VzX29iamVjdChpKT09UlBMOyBpKysgKQorCQk7CisJcmV0dXJuICghcHJldmlvdXNfb2JqZWN0KGkpIHx8IHByZXZpb3VzX29iamVjdCgpPT1NRSkKKwkJICYmIGdldHVpZCgpPT1nZXR1aWQoUlBMKSAmJiBJU19XSVpBUkQoUlBMKTsKK30KKworaW50IGpvbmdsaWVyKCBzdHJpbmcgc3RyICkKK3sKKwlzdHJpbmcgYXJnOworCisJbG9nYWNjZXNzKCAiam9uZ2xpZXJlIiApOworCWlmKCAhc3RyIHx8IGlkKHN0cikgfHwgc3NjYW5mKCBzdHIsICJtaXQgJXMiLCBhcmcgKSA9PSAxICkKKwl7CisJCWlmKCAhc2VjdXJlKCkgKQorCQkJd3JpdGUoCisJCQkJIkRpZXNlciBUZWxsZXJzdGFwZWwgaXN0IG5pY2h0cyBmdWVyIERpY2guIFN1Y2hlIERpciBlaW5lbiBlaWdlbmVuLlxuIgorCQkJKTsKKwkJZWxzZQorCQkJd3JpdGUoCisJCQkgICJEZXIgSm9uZ2xpZXJiZWZlaGwgbGF1dGV0IFwiO1wiIG9kZXIgXCIsXCIuXG4iCisJCQkrCSJcIjtoaWxmZSA8YmVmZWhsPlwiIGdpYnQgRGlyIEhpbGZlc3RlbGx1bmcuXG4iCisJCQkpOworCQlyZXR1cm4gVFJVRTsKKwl9CisgIHJldHVybiAwOworfQorCQkJCitzdGF0aWMgaW50IHplaWdlX2hpbGZlKCBzdHJpbmcgc3RyICkKK3sKKwlpZiggIXN0cmluZ3Aoc3RyKSApIHN0ciA9ICJnZW5lcmFsIjsKKwlzdHIgPSBpbXBsb2RlKCBvbGRfZXhwbG9kZSggSEVMUChzdHIpLCAiLy4uLyIgKSwgIi8iICk7CisJaWYoIGZpbGVfc2l6ZShzdHIpID4gMCApCisJeworCQlNb3JlKCBzdHIsIDEgKTsKKwkJcmV0dXJuIFRSVUU7CisJfQorCXdyaXRlKCAiWnUgZGllc2VtIFRoZW1hIGdpYnQgZXMga2VpbmUgSGlsZmUuXG4iICk7CisJcmV0dXJuIFRSVUU7Cit9CisKK2ludCBtZXNzYWdlKCBzdHJpbmcgc3RyICkKK3sKKwlzdHJpbmcgcGw7CisJb2JqZWN0IGRlc3Q7CisKKwlpZiggIXNlY3VyZSgpICkgcmV0dXJuIEZBTFNFOworCisJaWYoIHN0ciApCisJeworCQlpZiggc3NjYW5mKCBzdHIsICJ0byAlcyIsIHBsICkgPT0gMSApCisJCQlzdHIgPSBwbDsKKwkJaWYoICEoZGVzdCA9IGZpbmRfcGxheWVyKHN0cikgKSApCisJCXsKKwkJCXdyaXRlKCBjYXBpdGFsaXplKHN0cikgKyAiIGlzdCBuaWNodCBlaW5nZWxvZ2d0LlxuIiApOworCQkJcmV0dXJuIFRSVUU7CisJCX0KKwl9CisJZWxzZQorCQlkZXN0ID0gMDsKKworCWRvX21zZyggIjxNaXR0ZWlsdW5nIHZvbiAiK1BMLT5uYW1lKFdFTSkrIj4iLCBkZXN0ICk7CisJd3JpdGUoICJNaXR0ZWlsdW5nIgorCQkrICggZGVzdCA/ICIgYW4gIiArIGRlc3QtPm5hbWUoV0VOKSA6ICIiICkKKwkJKyAiIGthbm4gbWl0ICcqKicgYmVlbmRldCB3ZXJkZW4uXG4iICk7CisKKwlpbnB1dF90byggIm1vcmVfbWVzc2FnZSIsIDAsIGRlc3QgKTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQgZG9fbXNnKCBzdHJpbmcgc3RyLCBvYmplY3Qgb2JqICkKK3sKKwlpZiggb2JqICkKKwkJdGVsbF9vYmplY3QoIG9iaiwgc3RyICsgIlxuIiApOworCWVsc2UKKwkJc2F5KCBzdHIgKyAiXG4iICk7Cit9CisKK3N0YXRpYyBpbnQgbW9yZV9tZXNzYWdlKCBzdHJpbmcgc3RyLCBvYmplY3Qgb2JqICkKK3sKKwlpZiggc3RyICE9ICIqKiIgKQorCXsKKwkJZG9fbXNnKCBzdHIsIG9iaiApOworCQlpbnB1dF90byggIm1vcmVfbWVzc2FnZSIsIDAsIG9iaiApOworCX0KKwllbHNlCisJCWRvX21zZyggIjxFbmRlIGRlciBNaXR0ZWlsdW5nPiIsIG9iaiApOworCXJldHVybiBUUlVFOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQYXJzZS1GdW5rdGlvbmVuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQgcGFyc2UoIHN0cmluZyBzdHIgKQoreworCWludCBpOworCXN0cmluZyBhcmcsIHJlc3Q7CisKKwlpZiggIXNlY3VyZSgpICkgcmV0dXJuIEZBTFNFOworCisJLy8gRGllIEhpbGZlIGZhZWxsdCBhdXMgZGVyIGFsbGdlbWVpbmVuIFN5bnRheCBoZXJhdXMgIQorCWlmKCBxdWVyeV92ZXJiKClbMS4uXSA9PSAiaGlsZmUiIHx8IHF1ZXJ5X3ZlcmIoKVsxLi5dID09ICJoZWxwIiApCisJCXJldHVybiB6ZWlnZV9oaWxmZSggc3RyICk7CisKKwlpZiggc3RyPXRoaXNfcGxheWVyKCktPl91bnBhcnNlZF9hcmdzKCkgKQorCQlzdHIgPSBxdWVyeV92ZXJiKClbMS4uXSsiICIrc3RyOworCWVsc2UKKwkJc3RyID0gcXVlcnlfdmVyYigpWzEuLl07CisKKwlmZWhsZXJfcGFzc2llcnQgPSBGQUxTRTsKKwl3aGlsZSggIWZlaGxlcl9wYXNzaWVydCAmJiBzdHIgJiYgc3RyIT0iIiApCisJCXN0ciA9IHBhcnNlTmV4dCggc3RyLCAoe30pLCAiLVJPT1QtIiApOworCisJaWYoIG1pdF9zYXkgJiYgIVBMLT5RdWVyeVByb3AoUF9JTlZJUykgKQorCXsKKwkJaWYoICFmZWhsZXJfcGFzc2llcnQgKQorCQkJc2F5KCBQTC0+bmFtZShXRVIpKyIgam9uZ2xpZXJ0IG1pdCAiCisJCQkJKyBQTC0+UVBQKE1BTEUsV0VNLFBMVVJBTCkrIiBUZWxsZXJuLlxuIiApOworCQllbHNlCisJCQlzYXkoIFBMLT5uYW1lKFdFTSkrIiBmYWVsbHQgYmVpbSBKb25nbGllcmVuIGVpbiBUZWxsZXIgaGVydW50ZXIuXG4iICk7CisJfQorCWlmKCAhZmVobGVyX3Bhc3NpZXJ0ICkKKwkJd3JpdGUoICJPSy5cbiIgKTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHN0cmluZ3xpbnQgcGFyc2VOZXh0KCBzdHJpbmcgc3RyLCBtaXhlZCBhdXhzdGFjaywgc3RyaW5nIGZ1bm5hbWUgKQoreworCW1peGVkICpyZXM7CisJc3RyaW5nIGFyZywgcmVzdDsKKwlib29sIG1pdF9yZXR1cm47CisJaW50IG51bTsKKworCXdoaWxlKCBzdHIhPSIiICYmIHN0clswXT09JyAnICkKKwkJc3RyID0gc3RyWzEuLl07CisJaWYoIHN0cj09IiIgKQorCQlyZXR1cm4gRkFMU0U7CisKKwlzd2l0Y2goIHN0clswXSApCisJeworCQljYXNlICc7JzogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBLb21tYW5kb2JlZ2lubgorCQljYXNlICcsJzoKKwkJCXB1c2goICI7IiApOworCQkJcmV0dXJuIHN0clsxLi5dOworCQljYXNlICdcIic6IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTdHJpbmdrb25zdGFudGUKKwkJCWlmKCBzc2NhbmYoIHN0ciwgIlwiJXNcIiVzIiwgYXJnLCByZXN0ICk9PTIgKQorCQkJeworCQkJCS8qIHRlc3QgYXVmIG51bWVyaXNjaCBmZWhsdCBoaWVyIG5vY2ggKi8KKwkJCQlwdXNoX3N0ciggYXJnICk7CisJCQkJcmV0dXJuIHJlc3Q7CisJCQl9CisJCQlpZiggIXNzY2FuZiggc3RyLCAiXCIlc1wiIiwgYXJnICkgKQorCQkJCXJldHVybiBlcnJvciggIlN0cmluZyBvaG5lIEVuZGUiICk7CisJCQlwdXNoX3N0ciggYXJnICk7CisJCQlyZXR1cm4gRkFMU0U7CisJCWNhc2UgJyMnOiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFphaGwKKwkJCXJlcyA9IG5leHRBbHBoYSggc3RyWzEuLl0gKTsKKwkJCWlmKCBzc2NhbmYoIHJlc1swXSwgIiVkIiwgbnVtICkgPT0gMSApCisJCQl7CisJCQkJcHVzaCggbnVtICk7CisJCQkJcmV0dXJuIHJlc1sxXTsKKwkJCX0KKwkJCXJldHVybiBlcnJvciggIicjJzoga2VpbmUgZXJsYXVidGUgWmFobCIgKTsKKwkJY2FzZSAnXic6IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSG9sZSBlbnYKKwkJCWlmKCAhYmVjb21lc19vYmooKSApCisJCQkJcmV0dXJuIGVycm9yKCAiJ14nOiBUT1MgaXN0IGtlaW4gT2JqZWt0IiApOworCQkJaWYoICFlbnZpcm9ubWVudCh0b3AoKSkgKQorCQkJCXJldHVybiBlcnJvciggIideJzogVE9TIGhhdCBrZWluIEVudmlyb25tZW50IiApOworCQkJcHVzaChlbnZpcm9ubWVudChwb3AoKSkpOworCQkJcmV0dXJuIHN0clsxLi5dOworCQljYXNlICcuJzogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIb2xlIGF1cyBpbnYKKwkJCWlmKCAhYmVjb21lc19vYmooKSApCisJCQkJcmV0dXJuIGVycm9yKCAiJy4nOiBUT1MgaXN0IGtlaW4gT2JqZWt0IiApOworCQkJcmVzID0gbmV4dEFscGhhKCBzdHJbMS4uXSApOworCQkJY2FsY2ludiggcmVzWzBdICk7CisJCQlyZXR1cm4gcmVzWzFdOworCQljYXNlICc8JzogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSZWNhbGwKKwkJCWlmKCAhc3NjYW5mKCBzdHIsICI8JXMiLCBhcmcgKSB8fCBhcmc9PSIiICkKKwkJCQlyZXR1cm4gZXJyb3IoICInPCc6IFZhcmlhYmxlbm5hbWUgZmVobHQiICk7CisJCQlyZXMgPSBuZXh0QWxwaGEoIHN0clsxLi5dICk7CisJCQlkb19yZWNhbGwocmVzWzBdKTsKKwkJCXJldHVybiByZXNbMV07CisJCWNhc2UgJz4nOiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN0b3JlCisJCQlpZiggIXNzY2FuZiggc3RyLCAiPiVzIiwgYXJnICkgfHwgYXJnPT0iIiApCisJCQkJcmV0dXJuIGVycm9yKCAiJz4nOiBWYXJpYWJsZW5uYW1lIGZlaGx0IiApOworCQkJcmVzID0gbmV4dEFscGhhKCBzdHJbMS4uXSApOworCQkJZG9fc3RvcmUocmVzWzBdKTsKKwkJCXJldHVybiByZXNbMV07CisJCWNhc2UgJy0nOiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENhbGwgbWl0ICctJworCQkJc3RyID0gc3RyWzEuLl07CisJCQlpZiggbWl0X3JldHVybiA9IChzdHJbMF0gPT0gJy0nKSApCisJCQkJc3RyID0gc3RyWzEuLl07CisJCQlyZXMgPSBuZXh0QWxwaGEoIHN0clsxLi5dICk7CisJCQlzd2l0Y2goIHN0clswXSApCisJCQl7CisJCQkJY2FzZSAnPic6CisJCQkJCWlmKCBkb19jYWxsKCByZXNbMF0sIG1pdF9yZXR1cm4gKSApCisJCQkJCQlyZXR1cm4gcmVzWzFdOworCQkJCQlicmVhazsKKwkJCQljYXNlICcqJzoKKwkJCQkJaWYoIGRvX2NhbGxfZWZ1biggcmVzWzBdLCBtaXRfcmV0dXJuICkgKQorCQkJCQkJcmV0dXJuIHJlc1sxXTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJcmV0dXJuIGVycm9yKCAiJy0nOiAnPicgb2RlciAnKicgZXJ3YXJ0ZXQiICk7CisJCQl9CisJCQlyZXR1cm4gRkFMU0U7CisJCWNhc2UgJ1wnJzogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENhbGwKKwkJCXN0ciA9IHN0clsxLi5dOworCQkJaWYoIG1pdF9yZXR1cm4gPSAoc3RyWzBdID09ICdcJycpICkKKwkJCQlzdHIgPSBzdHJbMS4uXTsKKwkJCXJlcyA9IG5leHRBbHBoYSggc3RyICk7CisJCQlpZiggZG9fY2FsbCggcmVzWzBdLCBtaXRfcmV0dXJuICkgKQorCQkJCXJldHVybiByZXNbMV07CisJCQlyZXR1cm4gRkFMU0U7CisJCWNhc2UgJ2AnOiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ2FsbCBFZnVuCisJCQlzdHIgPSBzdHJbMS4uXTsKKwkJCWlmKCBtaXRfcmV0dXJuID0gKHN0clswXSA9PSAnYCcpICkKKwkJCQlzdHIgPSBzdHJbMS4uXTsKKwkJCXJlcyA9IG5leHRBbHBoYSggc3RyICk7CisJCQlpZiggZG9fY2FsbF9lZnVuKCByZXNbMF0sIG1pdF9yZXR1cm4gKSApCisJCQkJcmV0dXJuIHJlc1sxXTsKKwkJCXJldHVybiBGQUxTRTsKKwkJY2FzZSAnQCc6IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFdmFsdWF0ZQorCQkJc3RyID0gc3RyWzEuLl07CisJCQlpZiggbWl0X3JldHVybiA9IChzdHJbMF0gPT0gJ0AnKSApCisJCQkJc3RyID0gc3RyWzEuLl07CisJCQlpZiggZG9fbHBjKCBzdHIsIG1pdF9yZXR1cm4gKSApCisJCQkJcmV0dXJuIEZBTFNFOworCQkJcmV0dXJuIEZBTFNFOworCQljYXNlICchJzogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNRVRBCisJCQlpZiggc3NjYW5mKHN0ciwiISVkJXMiLG51bSxhcmcpPT0yICkKKwkJCXsKKwkJCQlpZiggbnVtPj1zaXplb2YoYXV4c3RhY2spICkKKwkJCQkJcmV0dXJuIGVycm9yKCAiJyIrZnVubmFtZSsiJzogenUgd2VpbmcgQXJndW1lbnRlIiApOworCQkJCXB1c2goIGF1eHN0YWNrW251bV0gKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXMgPSBuZXh0QWxwaGEoIHN0clsxLi5dICk7CisJCQkJbWVtb3J5ICs9IChbIHJlc1swXTogcmVzWzFdOyAxIF0pOworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJCXJldHVybiBhcmc7CisJCWRlZmF1bHQ6IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGRlZmF1bHQKKwkJCXJlcyA9IG5leHRBbHBoYSggc3RyICk7CisJCQlkb19jbWQocmVzWzBdKTsKKwkJCXJldHVybiByZXNbMV07CisJfQorCXJldHVybiBtZW1vKCAiRXR3YXMgU2VsdHNhbWVzIGlzdCBwYXNzaWVydCIgKTsKK30KKworc3RhdGljIGludCBkb19jbWQoIHN0cmluZyBzdHIgKQoreworCXN0cmluZyBmdW4sIGZpbGVuYW1lLCAqc3BsOworCW1peGVkKiBvbGRzdGFjazsKKwlpbnQgaSxtYXgsbnVtOworCisJaWYoIG1lbWJlcihtZW1vcnksc3RyKSApCisJeworCQlmdW4gPSBtZW1vcnlbc3RyLDBdOworCQlpZiggIW1lbW9yeVtzdHIsMV0gKSAvLyBub3JtYWxlIFZhcmlhYmxlbgorCQl7CisJCQlwdXNoKCBmdW4gKTsKKwkJCXJldHVybiBUUlVFOworCQl9CisJCW9sZHN0YWNrID0gc3RhY2s7CisJCXN0YWNrID0gKHt9KTsKKwkJc3BsID0gcmVnZXhwbG9kZSggZnVuLCAiIVswLTldWzAtOV0qIiApOworCQltYXggPSAtMTsKKwkJZm9yKCBpPTE7IGk8c2l6ZW9mKHNwbCk7IGkrPTIgKQorCQkJaWYoIHNzY2FuZihzcGxbaV0sIiElZCIsbnVtKSAmJiBtYXg8bnVtICkgbWF4ID0gbnVtOworCisJCXdoaWxlKCAhZmVobGVyX3Bhc3NpZXJ0ICYmIGZ1biAmJiBmdW4hPSIiICkKKwkJCWZ1biA9IHBhcnNlTmV4dCggZnVuLCBvbGRzdGFjaywgc3RyICk7CisJCWlmKCBmZWhsZXJfcGFzc2llcnQgKQorCQl7CisJCQlzdGFjayA9IG9sZHN0YWNrOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJCXN0YWNrID0gc3RhY2sgKyBvbGRzdGFja1sobWF4KzEpLi5dOworCQlyZXR1cm4gVFJVRTsKKwl9CisgIGVsc2UgaWYgKGZ1bj10Y29tbWFuZHNbc3RyXSkKKwkJcmV0dXJuIGNhbGxfb3RoZXIoTUUsImNtZF8iK2Z1bik7CisKKwlpZiggc3NjYW5mKCBzdHIsICIlZCIsIGkgKSApCisJCXB1c2goIGkgKTsKKwllbHNlCisJeworCQlmaWxlbmFtZSA9IE1BU1RFUi0+X2dldF9wYXRoKHN0cixnZXR1aWQoKSk7CisJCWlmKCBmaWxlbmFtZVs8MV0gPT0gJy4nICkKKwkJCWZpbGVuYW1lID0gZmlsZW5hbWVbMC4uPDJdOworCQlpZiggZmlsZV9zaXplKCBmaWxlbmFtZSsiLmMiICkgIT0gLTEgKQorCQkJcHVzaCggZmlsZW5hbWUgKTsKKwkJZWxzZQorCQkJcHVzaCggc3RyICk7CisJfQorCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgbWl4ZWQgbmV4dEFscGhhKCBzdHJpbmcgc3RyICkKK3sKKwlpbnQgcG9zOworCisJZm9yKCAKKwkJcG9zPTA7CisJCXBvczxzaXplb2Yoc3RyKSAmJiBtZW1iZXIoICIgI1wiOyxeLj48Iiwgc3RyW3Bvc10gKSA9PSAtMTsKKwkJcG9zKysKKwkpCisJCTsKKworCWlmKCBwb3M9PXNpemVvZihzdHIpICkKKwkJcmV0dXJuICh7IHN0ciwgMCB9KTsKKwllbHNlCisJCXJldHVybiAoeyBzdHJbMC4ucG9zLTFdLCBzdHJbcG9zLi5dIH0pOworfQorCitzdGF0aWMgdmFyYXJncyB2b2lkIHJlc3RvcmVfc3RhY2soIHN0cmluZyogYXJndiwgaW50IGFyZ3MgKQoreworCWludCBpOworCWlmKCAhYXJncyApCisJCWFyZ3MgPSBzaXplb2YoYXJndik7CisJaWYoIHNpemVvZihzdGFjaykgKSBwdXNoKCAiOyIgKTsKKwlmb3IoIGk9MDsgaTxhcmdzOyBpKysgKQorCQlwdXNoKGFyZ3ZbaV0pOworfQorCitzdGF0aWMgaW50IGRvX2NhbGwoIHN0cmluZyBmdW4sIGludCBtaXRfcmV0dXJuICkKK3sKKwlpbnQgYXJnczsKKwlzdHJpbmcgZXJyOworCW1peGVkIHJlc3VsdDsKKwltaXhlZCBhcmcsICphcmd2OworCisJYXJndiA9ICh7fSk7CisJd2hpbGUoIHNpemVvZihzdGFjaykgJiYgKGFyZz1wb3AoKSkhPSI7IiApCisJCWFyZ3YgPSAoe2FyZ30pICsgYXJndjsKKwlpZiggIWJlY29tZXNfb2JqKGFyZ3YpICkKKwl7CisJCXJlc3RvcmVfc3RhY2soIGFyZ3YgKTsKKwkJcmV0dXJuIGVycm9yKCAiY2FsbDogRnVua3Rpb24gbmljaHQgYW4gT2JqZWt0IGdlcmljaHRldCIgKTsKKwl9CisJaWYoICFmdW5jdGlvbl9leGlzdHMoZnVuLGFyZ3ZbMF0pICkKKwl7CisJCXJlc3RvcmVfc3RhY2soYXJndik7CisJCXJldHVybiBlcnJvciggImNhbGw6IEZ1bmt0aW9uIG5pY2h0IGdlZnVuZGVuIiApOworCX0KKworCWFyZ3MgPSBzaXplb2YoYXJndik7CisJYXJndiArPSAoeyAwLDAsMCwwLDAgfSk7CisJZXJyPShjYXRjaChyZXN1bHQ9Y2FsbF9vdGhlcihhcmd2WzBdLGZ1biwKKwkJYXJndlsxXSxhcmd2WzJdLGFyZ3ZbM10sYXJndls0XSxhcmd2WzVdKSkpOworCWlmKCBlcnIgKQorCXsKKwkJcmVzdG9yZV9zdGFjayggYXJndiwgYXJncyApOworCQlyZXR1cm4gZXJyb3IoICJjYWxsOiAiK2VyclsxLi48Ml0gKTsKKwl9CisJZWxzZQorCXsKKwkJd3JpdGUoICI9PiAiICk7CisJCWR1bXBfb2JqKCByZXN1bHQsIDMgKTsKKwkJaWYoIG1pdF9yZXR1cm4gKQorCQkJcHVzaCggcmVzdWx0ICk7CisJfQorCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IGRvX2NhbGxfZWZ1biggc3RyaW5nIGZ1biwgaW50IG1pdF9yZXR1cm4gKQoreworCWludCBhcmdzOworCXN0cmluZyBlcnI7CisJbWl4ZWQgcmVzdWx0OworCW1peGVkIGFyZywgKmFyZ3Y7CisKKwlhcmd2ID0gKHt9KTsKKwl3aGlsZSggc2l6ZW9mKHN0YWNrKSAmJiAoYXJnPXBvcCgpKSE9IjsiICkKKwkJYXJndiA9ICh7YXJnfSkgKyBhcmd2OworCisJaWYoICFmdW5jdGlvbl9leGlzdHMoICJlZnVuXyIrZnVuICkgKQorCQlyZXR1cm4gZXJyb3IoICJjYWxsIGVmdW46IFwiIitmdW4rIlwiIG5pY2h0IGJlbnV0emJhciIgKTsKKwlmdW4gPSAiZWZ1bl8iK2Z1bjsKKworCWFyZ3MgPSBzaXplb2YoYXJndik7CisJYXJndiArPSAoeyAwLDAsMCwwLDAgfSk7CisJZXJyPShjYXRjaChyZXN1bHQ9Y2FsbF9vdGhlcihNRSxmdW4sCisJCQlhcmd2WzBdLGFyZ3ZbMV0sYXJndlsyXSxhcmd2WzNdLGFyZ3ZbNF0pKSk7CisJaWYoIGVyciApCisJeworCQlyZXN0b3JlX3N0YWNrKCBhcmd2LCBhcmdzICk7CisJCXJldHVybiBlcnJvciggImNhbGwgZWZ1bjogIitlcnJbMS4uPDJdICk7CisJfQorCWVsc2UKKwl7CisJCXdyaXRlKCAiPT4gIiApOworCQlkdW1wX29iaiggcmVzdWx0LCAzICk7CisJCWlmKCBtaXRfcmV0dXJuICkKKwkJCXB1c2goIHJlc3VsdCApOworCX0KKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBkb19scGMoIHN0cmluZyBzdHIsIGludCBtaXRfcmV0dXJuICkKK3sKKwlpbnQgYXJncywgdmFsOworCXN0cmluZyBlcnI7CisJc3RyaW5nIGZpbGUsIGNtZCwgcHJlLCBwb3N0OworCW1peGVkIHJlc3VsdDsKKwltaXhlZCBhcmcsICphcmd2OworCisJYXJndiA9ICh7fSk7CisJd2hpbGUoIHNpemVvZihzdGFjaykgJiYgKGFyZz1wb3AoKSkhPSI7IiApCisJCWFyZ3YgPSBhcmd2ICsgKHthcmd9KTsKKworCWZpbGUgPSAiL3BsYXllcnMvIitnZXR1aWQoKSsiLy50ZWxsZXIiOworCWNtZCA9ICIjaW5jbHVkZSA8bGFuZ3VhZ2UuaD5cbiNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+XG4iCisJCSsgIiNpbmNsdWRlIDxtb3ZpbmcuaD5cbiNpbmNsdWRlIDxkZWZpbmVzLmg+XG4jaW5jbHVkZSA8dGVybWluYWwuaD5cbiIKKwkJKyAiI2luY2x1ZGUgPHdpemxldmVscy5oPlxuI2luY2x1ZGUgPGFuc2kuaD5cbmNyZWF0ZSgpe31kb2l0KCl7IjsKKworCXdoaWxlKCBzdHIhPSIiICYmIHNzY2FuZiggc3RyLCAiJXNAJXMiLCBwcmUsIHBvc3QgKSA9PSAyICkKKwl7CisJCWlmKCBzc2NhbmYoIHN0ciwgIiVzQCVkQCVzIiwgcHJlLCB2YWwsIHBvc3QgKSA9PSAzICkKKwkJeworCQkJaWYoIHNpemVvZihhcmd2KTw9dmFsIHx8IHZhbDwwICkKKwkJCXsKKwkJCQlyZXN0b3JlX3N0YWNrKCBhcmd2LCBhcmdzICk7CisJCQkJcmV0dXJuIGVycm9yKCAibHBjOiBJbGxlZ2FsZXIgSW5kZXggYXVmIGRlbiBTdGFjayIgKTsKKwkJCX0KKwkJCWNtZCArPSBwcmUgKyBEdW1wT2JqKGFyZ3ZbdmFsXSk7CisJCQlzdHIgPSBwb3N0OworCQl9CisJCWVsc2UKKwkJCWlmKCBzc2NhbmYoIHN0ciwgIiVzQCVzIiwgcHJlLCBwb3N0ICkgPT0gMiApCisJCQl7CisJCQkJY21kICs9IHByZSArICJAIjsKKwkJCQlzdHIgPSBwb3N0OworCQkJfQorCX0KKwljbWQgKz0gc3RyOworCXJtKCBmaWxlKyIuYyIgKTsKKwl3cml0ZV9maWxlKCBmaWxlKyIuYyIgLCBjbWQrIjt9XG4iICk7CisJaWYoIGZpbmRfb2JqZWN0KGZpbGUpICkgZGVzdHJ1Y3QoIGZpbmRfb2JqZWN0KGZpbGUpICk7CisJZXJyPShjYXRjaChyZXN1bHQ9Y2FsbF9vdGhlcihmaWxlLCJkb2l0IikpKTsKKwlpZiggZXJyICkKKwl7CisJCS8vcm0oIGZpbGUrIi5jIiApOworCQlyZXN0b3JlX3N0YWNrKCBhcmd2LCBhcmdzICk7CisJCXJldHVybiBlcnJvciggImxwYzogIitlcnJbMS4uPDJdICk7CisJfQorCWVsc2UKKwl7CisJCS8vcm0oIGZpbGUrIi5jIiApOworCQl3cml0ZSggIj0+ICIgKTsKKwkJZHVtcF9vYmooIHJlc3VsdCwgMyApOworCQlpZiggbWl0X3JldHVybiApCisJCQlwdXNoKCByZXN1bHQgKTsKKwl9CisJcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL3RlbGxlci5oIGIvb2JqL3Rvb2xzL3RlbGxlci90ZWxsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDFkNzk2Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci90ZWxsZXIuaApAQCAtMCwwICsxLDIyIEBACisjaWZuZGVmIF9URUxMRVJfSF8KKyNkZWZpbmUgX1RFTExFUl9IXworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorCisjZGVmaW5lIFRSVUUgMQorI2RlZmluZSBGQUxTRSAwCisjZGVmaW5lIGJvb2wgaW50CisKKyNkZWZpbmUgSU5GT1JNRVIgIi9zZWN1cmUvbWVybGluIgorLy8jZGVmaW5lIE1BU1RFUiAiL3NlY3VyZS9tYXN0ZXIiCisKKyNkZWZpbmUgVF9CQVNFICIvb2JqL3Rvb2xzL3RlbGxlci90X2Jhc2UiCisjZGVmaW5lIFRfRUZVTiAiL29iai90b29scy90ZWxsZXIvdF9lZnVuIgorI2RlZmluZSBUX0NNRFMgIi9vYmovdG9vbHMvdGVsbGVyL3RfY21kcyIKKyNkZWZpbmUgVF9QTEFZRVIgIi9vYmovdG9vbHMvdGVsbGVyL3RfcGxheWVyIgorCisjZGVmaW5lIEhFTFAoeCkgKCIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS8iKyh4KSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVzdGVyL3Rlc3QuYyBiL29iai90b29scy90ZXN0ZXIvdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNzBmYTgKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVzdGVyL3Rlc3QuYwpAQCAtMCwwICsxLDExNDYgQEAKKy8qCisqKiAgIE9iamVrdC1UZXN0ZXIgLSBNaXNjaHVuZyBhdXMgUmlrdXMnIERldGFpbHRlc3RlciB1bmQgUm9jaHVzJyBUZXN0LU5QQy4KKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqICAgIFVyc3BydWVuZ2xpY2hlIE9iamVrdGU6CisqKiAgICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorKiogICAgL3BsYXllcnMvcmlrb3Mvb2JqL3JkZXQuYyAgICAgICAgICAgUmlrdXNATW9yZ2VuR3JhdWVuICAgICAgICAgMjUuMDUuOTYKKyoqCisqKiAgICAvcGxheWVycy9yb2NodXMvbW9uL3Rlc3Rlci5jICAgICAgICBSb2NodXNATW9yZ2VuR3JhdWVuICAgICAgICAxOC4xMC45NAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogICAgRGllc2VzIE9iamVrdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIFZlcnNpb24gMC44IF0KKyoqICAgIH5+fn5+fn5+fn5+fn5+CisqKiAgICAvcGxheWVycy9wYXJhY2Vsc3VzL3Rvb2xzL290ZXN0LmMgICBQYXJhY2Vsc3VzQE1vcmdlbmdyYXVlbiAgICAyOC4wMi45OAorKioKKyoqICAgIERpZSBXZWl0ZXJnYWJlLCBWZXJ3ZW5kdW5nIG9kZXIgVmVyYWVuZGVydW5nIGlzdCBudXIgZXJsYXVidCwgd2VubgorKiogICAgZGllc2UgTWVsZHVuZyBuaWNodCBnZWFlbmRlcnQgd2lyZC4KKyoqICAgIERpZSBCZW51dHp1bmcgZXJmb2xndCBhdWYgZWlnZW5lIEdlZmFociwgamVkZSBWZXJhbnR3b3J0dW5nIHdpcmQKKyoqICAgIGFiZ2VsZWhudC4gRXMgd2lyZCBrZWluZSBHYXJhbnRpZSBnZWdlYmVuLCBkYXNzIGRlciBPYmpla3R0ZXN0ZXIKKyoqICAgIGVpbndhbmRmcmVpLCB2b2xsc3RhZW5kaWcgb2RlciBnYXIgenVmcmllZGVuc3RlbGxlbmQgYXJiZWl0ZXQuCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiAgICBDaGFuZ2VMb2c6CisqKiAgICB+fn5+fn5+fn5+CisqKiAgICBWIDAuMSAgICAyOC4wMi45OCAxMTowMDowMCAgIFBhcmFjZWxzdXMKKyoqCisqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmlrdXMnIFJhdW10ZXN0ZXIga29waWVydCwgb3B0aW1pZXJ0LgorKioKKyoqICAgIFYgMC4yICAgIDI4LjAyLjk4IDExOjMwOjAwICAgUGFyYWNlbHN1cworKioKKyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZWluZSBkaXJla3RlIEF1c2dhYmUgbWVociBzb25kZXJuCisqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHRkZXNzZW4gZWluIE1vcmUoKS4KKyoqCisqKiAgICBWIDAuMyAgICAyOC4wMi45OCAxMzowMDowMCAgIFBhcmFjZWxzdXMKKyoqCisqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdGVuIG5pY2h0IG1laHIgYXVmIFJhZXVtZSBiZXNjaHJhZW5rdC4KKyoqCisqKiAgICBWIDAuNCAgICAyOC4wMi45OCAxNjowMDowMCAgIFBhcmFjZWxzdXMKKyoqCisqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVua3Rpb25lbiBhdXMgUm9jaHVzJyBUZXN0ZXIgdWViZXJub21tZW4KKyoqCisqKiAgICBWIDAuNSAgICAyOC4wMi45OCAxODowMDowMCAgIFBhcmFjZWxzdXMKKyoqCisqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVua3Rpb25hbGl0YWV0ZW4gdm9uIFJpa3VzIHVuZCBSb2NodXMKKyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmVpbmFuZGVyIGFuZ2VwYXNzdC4KKyoqCisqKiAgICBWIDAuNiAgICAyOC4wMi45OCAxOTowMDowMCAgIFBhcmFjZWxzdXMKKyoqCisqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VydWVjaGUgdW5kIEdlcmFldXNjaGUgZWluZ2ViYXV0LAorKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyc3RlIFRlc3RzIGVyZm9sZ3JlaWNoLgorKioKKyoqICAgIFYgMC43ICAgIDI4LjAyLjk4IDE5OjMwOjAwICAgUGFyYWNlbHN1cworKioKKyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGFsdGVuemFobCBlaW5zdGVsbGJhci4KKyoqCisqKiAgICBWIDAuOCAgICAwMS4wMy45OCAxOTozMDowMCAgIFBhcmFjZWxzdXMKKyoqCisqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Nhbm5lbiBnYW56ZXIgVmVyemVpY2huaXNzZS4gR2VodCBqZXR6dAorKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHp1bWluZGVzdCBiZWkgUmFldW1lbi4KKyoqCisqKiAgICBWIDAuOSAgICAyMC4wOS45OCAyMDo0NTowMCAgIFBhcmFjZWxzdXMKKyoqCisqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW1nZXN0ZWxsdCB2b24gaGVhcnRfYmVhdCgpIGF1ZgorKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxfb3V0KCksIGRhbWl0IHRoaXNfcGxheWVyKCkKKyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcmhhbHRlbiBibGVpYnQuCisqKgkgICAgICAgMTMuMTAuMDgJCSAgIENoYWdhbGwKKyoqCisqKgkJCQkgICAgIF9xdWVyeV9kZXRhaWxzKCkgdW5kCisqKgkJCQkgICAgIF9xdWVyeV9zcGVjaWFsX2RldGFpbHMgYXVmCisqKgkJCQkgICAgIFF1ZXJ5UHJvcCgpIHVtZ2VzdGVsbHQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogICBFdmVudHVlbGwgYXVmdHJldGVuZGUgUHJvYmxlbWU6CisqKiAgIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyoqICAgLSBadSBob2hlIGV2YWxfY29zdCwgd2VubiB6dSB2aWVsZSBEZXRhaWxzIHZvcmhhbmRlbiBzaW5kLgorKiogICAgIEdyb2Vzc3RlciBiaXNoZXIgZ2V0ZXN0ZXRlciBSYXVtIChvaG5lIEZlaGxlcikgOiA2MzkwNworKiogICAgIFNjaGVpbnQgYWxzbyB3b2hsIGRvY2gga2VpbiBQcm9ibGVtIHp1IHNlaW4uCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqICAgSWRlZW4vVG9EbzoKKyoqICAgfn5+fn5+fn5+fn4KKyoqCisqKiAgIC0gTlBDLUluZm9zIHRlc3Rlbi4KKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDx0ZXJtaW5hbC5oPgorCisjZGVmaW5lIERBVEFGSUxFICAgICAidGVzdC5kYXQiCisjZGVmaW5lIERFRkFVTFRfREFUQSAiL29iai90b29scy90ZXN0ZXIvdGVzdC5kYXQiCisKKyNkZWZpbmUgUF9PVEVTVF9UWVAgIm9iLXRlc3Q6dHlwIgorI2RlZmluZSBQX09URVNUX1NQTCAib2ItdGVzdDpzcGFsdGVuIgorCisjZGVmaW5lIFRfUk9DSFVTIDEKKyNkZWZpbmUgVF9SSUtVUyAgMgorCisjZGVmaW5lIFRfUEFVU0UgIDQKKworI3ByYWdtYSBzdHJvbmdfdHlwZXMKKworaW5oZXJpdCAiL3N0ZC90aGluZyI7CisKKy8vIEFsbGdlbWVpbiBiZW5vZXRpZ3RlIGdsb2JhbGUgVmFyaWFibGVuCisKK2ludCAgICAgc2NhbnR5cCxzcGFsdGVuOworbWFwcGluZyBhbGxfZGV0czsKK21peGVkICAgb3V0cHV0Oworb2JqZWN0ICBtYXN0ZXI7CisKKy8vIEdsb2JhbGUgVmFyaWFibGVuIGZ1ZXIgZGFzIHNjYW5uZW4gZ2FuemVyIERpcmVjdG9yaWVzCisKK2ludCAgICAgc2NhbnJ1bixzY2FuY291bnQsc2NhbnBhdXNlLCpzY2FuZXJyOworc3RyaW5nICBzY2FuZGlyLCpzY2FuZmlsZXM7CitvYmplY3QgIHRlc3RvYjsKKworc3RyaW5nIHhfbG9uZygpCit7ICAgc3RyaW5nIHJlLFBSRSxFTkQ7CisKKyAgICBzd2l0Y2ggKFBMLT5RdWVyeVByb3AoUF9UVFkpKQorICAgIHsKKyAgICAgICAgY2FzZSAiYW5zaSIgIDoKKyAgICAgICAgY2FzZSAidnQxMDAiIDogUFJFPUJPTEQ7IEVORD1OT1JNQUw7IGJyZWFrOworICAgICAgICBkZWZhdWx0ICAgICAgOiBQUkU9IiI7ICAgRU5EPSIiOyAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmUgPSBicmVha19zdHJpbmcoCisgICAgICAgICAiTWl0IGRpZXNlbSBPYmpla3RwcnVlZmVyIGthbm5zdCBEdSBmZXN0c3RlbGxlbiwgd2VsY2hlIERldGFpbHMsICIrCisgICAgICAgICAiR2VydWVjaGUgb2RlciBHZXJhZXVzY2hlIGluIGVpbmVtIFJhdW0gYnp3IGFuIGVpbmVtIE9iamVrdCBub2NoICIrCisgICAgICAgICAibmljaHQgYmVzY2hyaWViZW4gc2luZC4iLDc4KSsKKyAgICAgICAgICJcbiIrCisgICAgICAgICAiU3ludGF4OiAlc290ZXN0IFtkZXRhaWx8c21lbGx8c291bmRdIHs8b2JqZWt0PltpbiBtaXJ8aW0gcmF1bV18IisKKyAgICAgICAgICAgICAiaGllcn1cblxuIisKKyAgICAgICAgICIgICAgICAgIG90eXBlIFtyaWt1c3xyb2NodXNdXG5cbiIrCisgICAgICAgICAiICAgICAgICBvY29sbSBbMXwyfDN8NHw1fDZ8N3w4fGF1dG9dXG5cbiIrCisgICAgICAgICAiICAgICAgICBvdGRpciA8dmVyemVpY2huaXM+IDxhdXNnYWJlZmlsZT4lc1xuXG4iKworICAgICAgICAgYnJlYWtfc3RyaW5nKAorICAgICAgICAgIk1pdCAlc290eXBlJXMga2FubiBtYW4gZmVzdGxlZ2VuLCBvYiBtYW4gaW0gJ1Jpa3VzJy0gb2RlciBpbSAiKworICAgICAgICAgIidSb2NodXMnLU1vZHVzIHNjYW5uZW4gd2lsbCwgbWl0ICVzb2NvbG0lcyBkaWUgYW56YWhsIGRlciBBdXNnYWJlIisKKyAgICAgICAgICJzcGFsdGVuIHVuZCBtaXQgJXNvdGVzdCVzIHdpcmQgZGFubiBkaWUgQXVzd2VydHVuZyBnZXN0YXJ0ZXQuICIrCisgICAgICAgICAiTWl0IGRlbSBLb21tYW5kbyAlc290ZGlyJXMga2FubiBtYW4gc29nYXIgZ2FuemUgVmVyemVpY2huaXNzZSAiKworICAgICAgICAgImF1ZiBlaW5tYWwgdGVzdGVuIGxhc3Nlbi4gRGFzIGRhdWVydCBuYXR1ZXJsaWNoIGVpbmUgV2VpbGUuICIrCisgICAgICAgICAiQXVzc2VyZGVtIG11c3MgZWluIFZlcnplaWNobmlzICcvbG9nLzxtYWdpZXJuYW1lPi8nIGJlc3RlaGVuLiIsNzgpKworICAgICAgICAgIkRlcnplaXRpZ2VyIFNjYW50eXA6ICAgICVzJyIrKHNjYW50eXA9PVRfUk9DSFVTPyJST0NIVVMiOiJSSUtVUyIpKworICAgICAgICAgIiclc1xuIisKKyAgICAgICAgICJEZXJ6ZWl0aWdlIFNwYWx0ZW56YWhsOiAlcyVzJXNcbiVzIjsKKyAgICByZXR1cm4gc3ByaW50ZihyZSxQUkUsRU5ELFBSRSxFTkQsUFJFLEVORCxQUkUsRU5ELFBSRSxFTkQsUFJFLEVORCxQUkUsCisgICAgICAgICAgIChzcGFsdGVuPjA/c3ByaW50ZigiJWQiLHNwYWx0ZW4pOiInQVVUTyciKSxFTkQsCisgICAgICAgICAgIChzY2FucnVuP3NwcmludGYoCisgICAgICAgICAgICAgICAiXG5EZXJ6ZWl0IERpcnNjYW4gaW46ICAgICAlcyVzJXNcbiIrCisgICAgICAgICAgICAgICAiQW5nZW5vbW1lbmUgUmVzdHplaXQ6ICAgJXMoJXMpIFtGaTolZC8lZHxFcjolZHxTazolZF0lc1xuIiwKKyAgICAgICAgICAgICAgIFBSRSxzY2FuZGlyLEVORCxQUkUsCisgICAgICAgICAgICAgICB0aW1lMnN0cmluZygiJWg6JTAybTolMDJzIiwoc2NhbnJ1bi0xKSo0KlRfUEFVU0UpLAorICAgICAgICAgICAgICAgKHNpemVvZihzY2FuZmlsZXMpLXNjYW5ydW4rMSksKHNpemVvZihzY2FuZmlsZXMpKSwKKyAgICAgICAgICAgICAgIHNjYW5lcnJbMF0sc2NhbmVyclsxXSxFTkQpOiIiKSk7Cit9CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgICBpZiAoIWNsb25lcChNRSkpCisgICAgICAgIHJldHVybjsKKworICAgIDo6Y3JlYXRlKCk7CisKKy8vIEFsbGdlbWVpbmUgZ2xvYmFsZSBWYXJpYWJsZW4gaW5pdGlhbGlzaWVyZW4KKworICAgIHNjYW50eXAgICA9IFRfUk9DSFVTOworICAgIHNwYWx0ZW4gICA9IDQ7CisgICAgYWxsX2RldHMgID0gKFtdKTsKKyAgICBvdXRwdXQgICAgPSAwOworCisvLyBHbG9iYWxlIFZhcmlhYmxlbiBmdWVyIGRlbiBEaXJlY3RvcnlzY2FuIGluaXRpYWxpc2llcmVuCisKKyAgICBzY2FuZGlyICAgPSAwOworICAgIHNjYW5ydW4gICA9IDA7CisgICAgc2NhbmZpbGVzID0gKHt9KTsKKyAgICBzY2FuY291bnQgPSAwOworICAgIHNjYW5wYXVzZSA9IDA7CisgICAgc2NhbmVyciAgID0gKHswLDB9KTsKKworLy8gUHJvcGVydGllcworCisgICAgU2V0UHJvcChQX1NIT1JULCJFaW4gT2JqZWt0cHJ1ZWZlciIpIDsKKyAgICBTZXQoUF9MT05HLCMneF9sb25nLEZfUVVFUllfTUVUSE9EKTsKKyAgICBTZXRQcm9wKFBfTkFNRSwiT2JqZWt0cHJ1ZWZlciIpOworICAgIFNldFByb3AoUF9HRU5ERVIsTUFMRSk7CisgICAgU2V0UHJvcChQX0FVVE9MT0FET0JKLDEpOworICAgIFNldFByb3AoUF9WQUxVRSwwKTsKKyAgICBTZXRQcm9wKFBfV0VJR0hULDApOworICAgIFNldFByb3AoUF9OT0RST1AsMSk7CisgICAgU2V0UHJvcChQX05FVkVSRFJPUCwxKTsKKworICAgIEFkZElkKCAoeyJwcnVlZmVyIiwib2JqZWt0cHJ1ZWZlciJ9KSApOworCisgICAgQWRkQ21kKCAib3Rlc3QiLCJzZWFyY2giICk7CisgICAgQWRkQ21kKCAib3R5cGUiLCJzY2FuYXJ0IiApOworICAgIEFkZENtZCggIm9jb2xtIiwic3BhbHRlbnphaGwiICk7CisgICAgQWRkQ21kKCAib3RkaXIiLCJkaXJ0ZXN0ZW4iICk7Cit9CisKK3ZvaWQgaW5pdCgpCit7CisgICAgOjppbml0KCk7CisgICAgaWYgKFBMLT5RdWVyeVByb3AoUF9URVNUUExBWUVSKSB8fCBJU19MRUFSTkVSKFBMKSkKKyAgICB7CisgICAgICAgIHNjYW50eXA9KFBMLT5RdWVyeVByb3AoUF9PVEVTVF9UWVApfHxUX1JPQ0hVUyk7CisgICAgICAgIHNwYWx0ZW49KFBMLT5RdWVyeVByb3AoUF9PVEVTVF9TUEwpfHw0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoZmluZF9jYWxsX291dCgicmVtb3ZlbiIpID09IC0xKQorICAgICAgY2FsbF9vdXQoInJlbW92ZW4iLDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogIERpZSBIaWxmc2Z1bmt0aW9uZW4gZGVzIE9iamVrdHRlc3RlcnMuCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKwordm9pZCBPdXRwdXQoc3RyaW5nIHRleHQpCit7CisgICAgaWYgKCF0ZXh0IHx8ICFzdHJpbmdwKHRleHQpKQorICAgICAgICByZXR1cm47CisgICAgaWYgKG9iamVjdHAob3V0cHV0KSkKKyAgICAgICAgb3V0cHV0LT5Nb3JlKHRleHQpOworICAgIGVsc2UgaWYgKHN0cmluZ3Aob3V0cHV0KSkKKyAgICAgICAgd3JpdGVfZmlsZShvdXRwdXQsdGV4dCk7CisgICAgZWxzZQorICAgICAgICB3cml0ZSh0ZXh0KTsKK30KKworaW50IHJlbW92ZW4oKQoreworICAgIHdyaXRlKCJEaWVzZXMgVG9vbCBpc3QgbnVyIGZ1ZXIgVGVzdGllcyB1bmQgTWFnaWVyIVxuIik7CisgICAgcmVtb3ZlKCk7CisgICAgcmV0dXJuIDE7Cit9CisKK3N0cmluZyAqZ3Jvc3Moc3RyaW5nIHMpCit7CisgICAgcmV0dXJuIHJlZ2V4cChyZWdleHBsb2RlKHMsIlteQS1aYS16MC05XSIpLCJcXDxbQS1aXSIpOworfQorCitzdHJpbmcgKmRldF9hdXN3ZXJ0ZW4oc3RyaW5nIGlucHV0KQoreyAgIHN0cmluZyAqd29yZHMsc3RyLCpyZTsKKyAgICBpbnQgICAgYW5mLG4saTsKKworICAgIGlmIChzY2FudHlwPT1UX1JJS1VTKQorICAgICAgICByZXR1cm4gZ3Jvc3MoaW5wdXQpOworCisgICAgcmUgPSAoe30pOworICAgIGlmICghaW5wdXQgfHwgIXN0cmluZ3AoaW5wdXQpKQorICAgICAgICByZXR1cm4gcmU7CisKKyAgICB3b3Jkcz1yZWdleHBsb2RlKGlucHV0LCJbXkEtWmEtejAtOV0iKTsKKyAgICAgICAgbj1zaXplb2Yod29yZHMpOworICAgIGlmICghbikKKyAgICAgICAgcmV0dXJuIHJlOworCisgICAgYW5mPTE7CisgICAgZm9yIChpPTA7aTxuO2krKykKKyAgICB7CisgICAgICAgIHN0cj13b3Jkc1tpXTsKKyAgICAgICAgaWYgKHN0cj09IiIgfHwgc3RyPT0iICIpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKHN0cj09Ii4iIHx8IHN0cj09IjoiIHx8IHN0cj09Ij8iIHx8IHN0cj09IiEiKQorICAgICAgICB7CisgICAgICAgICAgICBhbmY9MTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChzaXplb2YocmVnZXhwKCh7c3RyfSksIlteQS1aYS16MC05XSIpKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoc2l6ZW9mKHJlZ2V4cCgoe3N0cn0pLCJcXDxbMC05XSpcXD4iKSkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKHN0ciE9Y2FwaXRhbGl6ZShzdHIpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChhbmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFuZj0wOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgcmUgKz0gKHsgc3RyIH0pOworICAgIH0KKyAgICByZXR1cm4gcmU7Cit9CisKK3ZhcmFyZ3MgbWl4ZWQgdGVzdF9kZXRhaWxzKHN0cmluZyBzdHIsIHN0cmluZyBkZWYpCit7ICAgc3RyaW5nICpzdHJzLG9zdHIsKnN0cnMyLHN1ZjsKKyAgICBpbnQgICAgaTsKKworICAgIGlmICghc3RyIHx8ICFzdHJpbmdwKHN0cikgfHwgIW1hcHBpbmdwKGFsbF9kZXRzKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzdHJzID0gKHtzdHJ9KTsKKyAgICBvc3RyID0gc3RyOworCisgICAgaWYgKChzdWY9c3RyWzwxLi48MV0pPT0icyIgfHwgc3VmPT0ibiIgfHwgc3VmPT0iZSIpCisgICAgeworICAgICAgICBvc3RyICA9IHN0clswLi48Ml07CisgICAgICAgIHN0cnMgKz0gKHsgb3N0ciB9KTsKKyAgICAgICAgb3N0ciArPSAoIigiK3N1ZisiKSIpOworICAgIH0KKyAgICBpZiAoKHN1Zj1zdHJbPDIuLjwxXSk9PSJlcyIgfHwgc3VmPT0iZW4iKQorICAgIHsKKyAgICAgICAgb3N0ciAgPSBzdHJbMC4uPDNdOworICAgICAgICBzdHJzICs9ICh7IG9zdHIgfSk7CisgICAgICAgIG9zdHIgKz0gKCIoIitzdWYrIikiKTsKKyAgICB9CisgICAgZm9yICggc3RyczI9KHt9KSxpPXNpemVvZihzdHJzKS0xIDsgaT49MCA7IGktLSkKKyAgICAgICAgaWYgKG1lbWJlcihhbGxfZGV0cyxzdHJzW2ldKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHN0cmluZ3AoZGVmKSAmJiBhbGxfZGV0c1tzdHJzW2ldXT09ZGVmICYmIHN0ciE9U0VOU0VfREVGQVVMVCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIHN0cnMyICs9ICh7IHN0cnNbaV0gfSk7CisJfQorICAgIGlmIChzaXplb2Yoc3RyczIpPjApCisgICAgICAgIHJldHVybiBzdHJzMjsKKyAgICByZXR1cm4gb3N0cjsKK30KKworc3RyaW5nICpldmFsX2RldGFpbF9lbnRyeShtaXhlZCBrZXkpCit7ICAgbWl4ZWQgIHJlLGg7CisgICAgc3RyaW5nICpyYTsKKyAgICBpbnQgICAgaTsKKworICAgIGlmICgha2V5IHx8ICFzdHJpbmdwKGtleSkgfHwgIW1hcHBpbmdwKGFsbF9kZXRzKSB8fCAhbWVtYmVyKGFsbF9kZXRzLGtleSkpCisgICAgICAgIHJldHVybiAoe30pOworCisgICAgcmU9YWxsX2RldHNba2V5XTsKKyAgICBpZiAoY2xvc3VyZXAocmUpKQorICAgICAgICByZT1mdW5jYWxsKHJlLGtleSk7CisgICAgaWYgKG1hcHBpbmdwKHJlKSkKKyAgICB7CisgICAgICAgIHJhPWZpbHRlcihtX2luZGljZXMocmUpLCMnc3RyaW5ncCk7CisgICAgICAgIGZvciAoIGg9KHsgcmVbMF0gfSksaT1zaXplb2YocmEpLTEgOyBpPj0wIDsgaS0tICkKKyAgICAgICAgICAgIGlmIChzdHJpbmdwKHJlW3JhW2ldXSkpCisgICAgICAgICAgICAgICAgaCArPSAoeyByZVtyYVtpXV0gfSk7CisgICAgICAgICAgICBlbHNlIGlmIChwb2ludGVycChyZVtyYVtpXV0pKQorICAgICAgICAgICAgICAgIGggKz0gcmVbcmFbaV1dOworICAgICAgICByZT1oOworICAgIH0KKyAgICBpZiAocG9pbnRlcnAocmUpKQorICAgICAgICByZXR1cm4gZmlsdGVyKHJlLCMnc3RyaW5ncCk7CisgICAgaWYgKHN0cmluZ3AocmUpKQorICAgICAgICByZXR1cm4gKHsgcmUgfSk7CisgICAgcmV0dXJuICh7fSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiAgRGllIEZ1bmt0aW9uLCBkaWUgZGllIChTcGVjaWFsKURldGFpbHMgaW0gUmF1bSB1bnRlcnN1Y2h0LgorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKK2ludCBzZWFyY2hfZChvYmplY3QgcikKK3sgICBpbnQgICAgIGksaixyb29tOworICAgIG1hcHBpbmcgbTsKKyAgICBzdHJpbmcgICpzLHMxLCpzMixQUkUsRU5ELCpzcGVjaWFsLCp6dWZpbmRlbiwqZGV0YWlscyxyZSwqdWViZXJnZWhlbjsKKyAgICBtaXhlZCAgIG1pOworCisgICAgaWYgKCFyIHx8ICFvYmplY3RwKHIpKQorICAgIHsKKyAgICAgICAgd3JpdGUoIk9URVNULUVSUk9SOiBLZWluIChleGlzdGllcmVuZGVzKSBaaWVsb2JqZWt0IGdlZnVuZGVuIVxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworLy8gRGllIEF1c2dhYmVuIGVyZm9sZ2VuIHp1bmFlY2hzdCBpbiBlaW5lbiBTdHJpbmcuCisKKyAgICByZT0iXG4iOworCisvLyBIYW5kZWx0IGVzIHNpY2ggdW0gZWluZW4gUmF1bT8KKworICAgIHJvb20gPSAoZnVuY3Rpb25fZXhpc3RzKCJpbnRfbG9uZyIscikgPyAxIDogMCApOworCisvLyBUZXJtaW5hbHR5cCBkZXMgTWFnaWVycyBmZXN0c3RlbGxlbi4KKworICAgIGlmIChvYmplY3RwKG91dHB1dCkpCisgICAgICAgIHN3aXRjaCAob3V0cHV0LT5RdWVyeVByb3AoUF9UVFkpKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlICJhbnNpIiAgOgorICAgICAgICAgICAgY2FzZSAidnQxMDAiIDogUFJFPUJPTEQ7IEVORD1OT1JNQUw7IGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdCAgICAgIDogUFJFPSIiOyAgIEVORD0iIjsgICAgIGJyZWFrOworICAgICAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgUFJFPSIiOworICAgICAgICBFTkQ9IiI7CisgICAgfQorCisvLyAgTGlzdGUgZGVyIHp1IHVlYmVyZ2VoZW5kZW4gRGV0YWlscyBlcnpldWdlbi4gRGllIHZlcndlbmRldGUgTWV0aG9kZSBoYXQgZGVuCisvLyAgVm9ydGVpbCwgZGFzcyBtYW4gbmFjaCBlaW5lciBFcmdhZW56dW5nIGRlciBMaXN0ZSBuaWNodCBkYXMgVG9vbCBuZXUgbGFkZW4KKy8vICB1bmQgY2xvbmVuIG11c3MuIERhcyBUb29sIGVyd2FydGV0LCBkaWUgTGlzdGUgREFUQUZJTEUgaW0gZ2xlaWNoZW4KKy8vICBWZXJ6ZWljaG5pcyB6dSBmaW5kZW4sIGluIGRlbSBhdWNoIGRhcyBUb29sIGxpZWd0LgorCisgICAgczE9aW1wbG9kZShleHBsb2RlKG9sZF9leHBsb2RlKG9iamVjdF9uYW1lKE1FKSwiIyIpWzBdLCIvIilbMC4uPDJdLCIvIikrIi8iCisgICAgICAgREFUQUZJTEU7CisgICAgaWYgKGZpbGVfc2l6ZShzMSk8MSkKKyAgICAgICAgczE9REVGQVVMVF9EQVRBOworCisgICAgdWViZXJnZWhlbiA9IHJlZ2V4cChyZWdleHBsb2RlKHJlYWRfZmlsZShzMSksIlteQS1aYS16MC05XSIpLCJcXDxbYS16XSIpOworCisvLyBTYXR6IGFuIERldGFpbHMsIGRpZSBhdWYgamVkZW4gRmFsbCB2b3JoYW5kZW4gc2VpbiBzb2xsdGVuLCBqZSBuYWNoZGVtCisvLyBvYiBQX0lORE9PUlMgZ2VzZXR6dCBpc3Qgb2RlciBuaWNodC4KKworICAgIGlmIChyb29tICYmIHItPlF1ZXJ5UHJvcChQX0lORE9PUlMpKQorICAgICAgICB6dWZpbmRlbiA9ICh7IkJvZGVuIiwiRGVja2UiLCJXYW5kIiwiV2FlbmRlIiwiUmF1bSJ9KTsKKyAgICBlbHNlIGlmIChyb29tKQorICAgICAgICB6dWZpbmRlbiA9ICh7IkJvZGVuIiwiSGltbWVsIiwiU29ubmUiLCJXb2xrZSIsIldvbGtlbiJ9KTsKKyAgICBlbHNlCisgICAgICAgIHp1ZmluZGVuID0gKHt9KTsKKworLy8gQWxsZSB2b3JoYW5kZW5lbiBEZXRhaWxzIGFuemVpZ2VuLgorCisvLyAgICBkZXRhaWxzID0gc29ydF9hcnJheShtX2luZGljZXMoci0+X3F1ZXJ5X2RldGFpbHMoKXx8KFtdKSksIyc8KTsKKyAgICBkZXRhaWxzID0gc29ydF9hcnJheShtX2luZGljZXMoci0+UXVlcnlQcm9wKFBfREVUQUlMUyl8fChbXSkpLCMnPCk7CisKKyAgICBpZiAoc2NhbnJ1bjwxKQorICAgIHsKKyAgICAgICAgaWYgKChpPXNpemVvZihkZXRhaWxzKSk+MCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICggczE9IiIsLS1pOyBpPj0wIDsgaS0tICkKKyAgICAgICAgICAgICAgICBzMSArPSAoZGV0YWlsc1tpXSsoaT8iXG4iOiIiKSk7CisKKyAgICAgICAgICAgIHJlICs9IHNwcmludGYoc3ByaW50ZigiJXNMaXN0ZSBkZXIgdm9yaGFuZGVuZW4gRGV0YWlsczolc1xuXG4iKworICAgICAgICAgICAgICAgICAgICAgICAgICAiJXNcblxuIixQUkUsRU5ELCgiJS0jNzgiKyhzcGFsdGVuPDE/IiI6CisgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoIi4lZCIsc3BhbHRlbikpKyJzIikpLHMxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZSArPSBzcHJpbnRmKCIlc0tlaW5lIERldGFpbHMgZ2VmdW5kZW4uJXNcblxuIixQUkUsRU5EKTsKKyAgICB9CisKKy8vIEFsbGUgdm9yaGFuZGVuZW4gU3BlY2lhbERldGFpbHMgYW56ZWlnZW4uCisKKy8vICAgIHNwZWNpYWw9c29ydF9hcnJheShtX2luZGljZXMoci0+X3F1ZXJ5X3NwZWNpYWxfZGV0YWlscygpfHwoW10pKSwjJzwpOworICAgIHNwZWNpYWw9c29ydF9hcnJheShtX2luZGljZXMoci0+UXVlcnlQcm9wKFBfU1BFQ0lBTF9ERVRBSUxTKXx8KFtdKSksIyc8KTsKKworICAgIGlmIChzY2FucnVuPDEpCisgICAgeworICAgICAgICBpZiAoKGk9c2l6ZW9mKHNwZWNpYWwpKT4wKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKCBzMT0iIiwtLWkgOyBpPj0wIDsgaS0tICkKKyAgICAgICAgICAgICAgICBzMSArPSAoc3BlY2lhbFtpXSsoaT8iXG4iOiIiKSk7CisKKyAgICAgICAgICAgIHJlICs9IHNwcmludGYoc3ByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzTGlzdGUgZGVyIHZvcmhhbmRlbmVuIFNwZWNpYWxEZXRhaWxzOiVzXG5cbiIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICIlc1xuXG4iLFBSRSxFTkQsKCIlLSM3OCIrKHNwYWx0ZW48MT8iIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZigiLiVkIixzcGFsdGVuKSkrInMiKSksczEpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlICs9IHNwcmludGYoIiVzS2VpbmUgU3BlY2lhbERldGFpbHMgZ2VmdW5kZW4uJXNcblxuIixQUkUsRU5EKTsKKyAgICB9CisKKy8vICBEaWUgTGlzdGVuIGRlciB2b3JoYW5kZW5lbiBEZXRhaWxzIHVuZCBTcGVjaWFsRGV0YWlscyB2ZXJlaW5pZ2VuLgorCisgICAgZGV0YWlscyArPSBzcGVjaWFsOworCisvLyAgRGV0YWlscyB1bmQgU3BlY2lhbERldGFpbHMgYXVzd2VydGVuIC0gZ2FyIG5pY2h0IHNvIGVpbmZhY2guCisKKyAgICBhbGxfZGV0cyA9IHItPlF1ZXJ5KFBfREVUQUlMUyk7CisKKyAgICBmb3IgKCBzPSh7fSksaT1zaXplb2YoZGV0YWlscyktMSA7IGk+PTAgOyBpLS0pCisgICAgICAgIHMgKz0gZXZhbF9kZXRhaWxfZW50cnkoZGV0YWlsc1tpXSk7CisKKyAgICBmb3IgKCBzMj0oe30pLGk9c2l6ZW9mKHMpLTEgOyBpPj0wIDsgaS0tICkKKyAgICAgICAgaWYgKHN0cmluZ3Aoc1tpXSkpCisgICAgICAgICAgICBpZiAobWVtYmVyKHMyLHNbaV0pPT0tMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzMiArPSAoeyBzW2ldIH0pOworICAgICAgICAgICAgICAgIHp1ZmluZGVuKz1kZXRfYXVzd2VydGVuKHNbaV0pOworICAgICAgICAgICAgfQorCisvLyAgR3Jvc3NnZXNjaHJpZWJlbmUgV29lcnRlciBhdXMgZGVyIExhbmdiZXNjaHJlaWJ1bmcgaGluenVmdWVnZW4uCisKKyAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCJpbnRfbG9uZyIscikpCisgICAgICAgIHp1ZmluZGVuICs9IGRldF9hdXN3ZXJ0ZW4oCisgICAgICAgICAgICBvbGRfZXhwbG9kZShyLT5pbnRfbG9uZyhtYXN0ZXIsbWFzdGVyKSwiRXMgZ2lidCAiKVswXSk7CisgICAgZWxzZQorICAgICAgICB6dWZpbmRlbiArPSBkZXRfYXVzd2VydGVuKG9sZF9leHBsb2RlKHItPmxvbmcoKSwiZW50aGFlbHQ6IilbMF0pOworCisvLyBEb3BwZWx0ZSBFaW50cmFlZ2UgZWxpbWluaWVyZW4uCisKKyAgICBmb3IgKCBzMj0oe30pLCBpPXNpemVvZih6dWZpbmRlbiktMSA7IGk+PTAgOyBpLS0pCisgICAgICAgIGlmIChtZW1iZXIoczIsenVmaW5kZW5baV0pPT0tMSkKKyAgICAgICAgICAgIHMyICs9ICh7IHp1ZmluZGVuW2ldIH0pOworCisvLyBBbGxlcyBrbGVpbiBtYWNoZW4uCisKKyAgICB6dWZpbmRlbj1tYXAoczIsIydsb3dlcl9jYXNlKTsKKworLy8gQmVpIE5QQ3MvT2JqZWt0ZW4gZGllIElEcyByYXVzZmlsdGVybi4KKworICAgIGlmICghcm9vbSkKKyAgICAgICAgenVmaW5kZW4gLT0gci0+UXVlcnlQcm9wKFBfSURTKTsKKworLy8gRGllIHp1IHVlYmVyZ2VoZW5kZW4gRGV0YWlscyByYXVzZmlsdGVybi4KKworICAgIHp1ZmluZGVuPWZpbHRlcigoenVmaW5kZW4tdWViZXJnZWhlbiksIydzdHJpbmdwKTsKKworLy8gU2NoYXVlbiwgd2VsY2hlIERldGFpbHMgZmVobGVuIHVuZCBkaWVzZSBBdXNnZWJlbi4KKworICAgIGZvciAoIHM9KHt9KSxzMj0oe30pLGk9c2l6ZW9mKHp1ZmluZGVuKS0xO2k+PTA7aS0tKQorICAgIHsKKyAgICAgICAgaWYgKCEobWk9dGVzdF9kZXRhaWxzKHp1ZmluZGVuW2ldKSkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKHBvaW50ZXJwKG1pKSkKKyAgICAgICAgeworICAgICAgICAgICBmb3IgKGo9c2l6ZW9mKG1pKS0xIDsgaj49MCA7IGotLSkKKyAgICAgICAgICAgICAgIGlmIChtZW1iZXIocyxtaVtqXSk9PS0xKQorICAgICAgICAgICAgICAgICAgIHMgKz0gKHsgbWlbal0gfSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc3RyaW5ncChtaSkgJiYgbWVtYmVyKHMyLG1pKT09LTEpCisgICAgICAgICAgICBzMiArPSAoeyBtaSB9KTsKKyAgICB9CisKKyAgICBzICA9IHNvcnRfYXJyYXkocywgIyc8KTsKKyAgICBzMiA9IHNvcnRfYXJyYXkoczIsIyc8KTsKKworICAgIGlmIChzY2FucnVuPDEpCisgICAgeworICAgICAgICBpZiAoKGk9c2l6ZW9mKHMpKT4wKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKCBzMT0iIiwtLWkgOyBpPj0wIDsgaS0tICkKKyAgICAgICAgICAgICAgICBzMSArPSAoc1tpXSsoaT8iXG4iOiIiKSk7CisKKyAgICAgICAgICAgIHJlICs9IHNwcmludGYoc3ByaW50ZigiJXNMaXN0ZSBkZXIgZ2VmdW5kZW5lbiBEZXRhaWxzOiVzXG5cbiIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICIlc1xuXG4iLFBSRSxFTkQsKCIlLSM3OCIrKHNwYWx0ZW48MT8iIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZigiLiVkIixzcGFsdGVuKSkrInMiKSksczEpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlICs9IHNwcmludGYoIiVzRXMgZ2lidCBrZWluZSBEZXRhaWxzLiVzXG5cbiIsUFJFLEVORCk7CisgICAgfQorCisgICAgaWYgKChpPXNpemVvZihzMikpPjApCisgICAgeworICAgICAgICBmb3IgKCBzMT0iIiwtLWkgOyBpPj0wIDsgaS0tICkKKyAgICAgICAgICAgczEgKz0gKHMyW2ldKyhpPyJcbiI6IiIpKTsKKworICAgICAgICByZSArPSBzcHJpbnRmKHNwcmludGYoIiVzTGlzdGUgZGVyIGZlaGxlbmRlbiBEZXRhaWxzOiVzXG5cbiIrCisgICAgICAgICAgICAgICAgICAgICAgIiVzXG5cbiIsUFJFLEVORCwoIiUtIzc4Iisoc3BhbHRlbjwxPyIiOgorICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoIi4lZCIsc3BhbHRlbikpKyJzIikpLHMxKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZSArPSBzcHJpbnRmKCIlc0VzIGZlaGxlbiBrZWluZSBEZXRhaWxzLiVzXG5cbiIsUFJFLEVORCk7CisKKyAgICBpZiAoc2NhbnJ1bjwxKQorICAgICAgICByZSArPSBzcHJpbnRmKCIlc0ZFUlRJRy4lc1xuIixQUkUsRU5EKTsKKworLy8gRGllIGVpZ2VudGxpY2hlIFRleHRhdXNnYWJlLgorCisgICAgT3V0cHV0KHJlKTsKKworICAgIHJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogIEhhdXB0ZnVua3Rpb24gZnVlciBkYXMgVGVzdGVuIHZvbiBHZXJhZXVzY2hlbiB1bmQgR2VydWVjaGVuLgorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKK2ludCBzZWFyY2hfc2Vuc2Uob2JqZWN0IHIsIGludCBzZW5zZSkKK3sgICBzdHJpbmcgcmUsUFJFLEVORCxXQVMsKnNlbnNlcyxzMSwqenVmaW5kZW4sKnMyLCpzMyxkZWY7CisgICAgaW50ICAgIGksajsKKyAgICBtaXhlZCAgbWk7CisKKyAgICBpZiAoIXIgfHwgIW9iamVjdHAocikpCisgICAgeworICAgICAgICB3cml0ZSgiT1RFU1QtRVJST1I6IEtlaW4gKGV4aXN0aWVyZW5kZXMpIFppZWxvYmpla3QgZ2VmdW5kZW4hXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChzZW5zZT09U0VOU0VfU01FTEwpCisgICAgeworICAgICAgICBhbGxfZGV0cz1yLT5RdWVyeShQX1NNRUxMUyl8fChbXSk7CisgICAgICAgIFdBUz0iR2VydWVjaGUiOworICAgIH0KKyAgICBlbHNlIGlmIChzZW5zZT09U0VOU0VfU09VTkQpCisgICAgeworICAgICAgICBhbGxfZGV0cz1yLT5RdWVyeShQX1NPVU5EUyl8fChbXSk7CisgICAgICAgIFdBUz0iR2VyYWV1c2NoZSI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHdyaXRlKCJPVEVTVC1FUlJPUjogSWxsZWdhbGVyIHNlbnNlLVdlcnQgaW4gc2VhcmNoX3NlbnNlKClcbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZSA9ICJcbiI7CisKKyAgICB6dWZpbmRlbiA9ICh7U0VOU0VfREVGQVVMVH0pOworCisgICAgZGVmID0gYWxsX2RldHNbU0VOU0VfREVGQVVMVF07CisKKy8vIFRlcm1pbmFsdHlwIGRlcyBNYWdpZXJzIGZlc3RzdGVsbGVuLgorCisgICAgaWYgKG9iamVjdHAob3V0cHV0KSkKKyAgICAgICAgc3dpdGNoIChvdXRwdXQtPlF1ZXJ5UHJvcChQX1RUWSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgImFuc2kiICA6CisgICAgICAgICAgICBjYXNlICJ2dDEwMCIgOiBQUkU9Qk9MRDsgRU5EPU5PUk1BTDsgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0ICAgICAgOiBQUkU9IiI7ICAgRU5EPSIiOyAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBQUkU9IiI7CisgICAgICAgIEVORD0iIjsKKyAgICB9CisKKyAgICBzZW5zZXMgPSBzb3J0X2FycmF5KG1faW5kaWNlcyhhbGxfZGV0cyksIyc8KTsKKworLy8gQWxsZSB2b3JoYW5kZW5lbiBTZW5zZS1EZXRhaWxzIGFuemVpZ2VuLgorCisgICAgaWYgKHNjYW5ydW48MSkKKyAgICB7CisgICAgICAgIGlmICgoaT1zaXplb2Yoc2Vuc2VzKSk+MCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICggczE9IiIsLS1pOyBpPj0wIDsgaS0tICkKKyAgICAgICAgICAgICAgICBzMSArPSAoKHNlbnNlc1tpXT09U0VOU0VfREVGQVVMVD8iREVGQVVMVCI6CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5zZXNbaV0pKyhpPyJcbiI6IiIpKTsKKworICAgICAgICAgICAgcmUgKz0gc3ByaW50ZihzcHJpbnRmKCIlc0xpc3RlIGRlciB2b3JoYW5kZW5lbiAlczolc1xuXG4iKworICAgICAgICAgICAgICAgICAgICAgICAgICAiJXNcblxuIixQUkUsV0FTLEVORCwoIiUtIzc4Iisoc3BhbHRlbjwxPyIiOgorICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCIuJWQiLHNwYWx0ZW4pKSsicyIpKSxzMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmUgKz0gc3ByaW50ZigiJXNLZWluZSAlcyBnZWZ1bmRlbi4lc1xuXG4iLFBSRSxXQVMsRU5EKTsKKyAgICB9CisKKworLy8gIFNlbnNlLURldGFpbHMgYXVzd2VydGVuIC0gZ2VodCB3aWUgYmVpIERldGFpbHMuCisKKyAgICBmb3IgKCBzMj0oe30pLGk9c2l6ZW9mKHNlbnNlcyktMSA7IGk+PTAgOyBpLS0pCisgICAgICAgIHMyICs9IGV2YWxfZGV0YWlsX2VudHJ5KHNlbnNlc1tpXSk7CisKKyAgICBmb3IgKCBzMz0oe30pLGk9c2l6ZW9mKHMyKS0xIDsgaT49MCA7IGktLSApCisgICAgICAgIGlmIChzdHJpbmdwKHMyW2ldKSkKKyAgICAgICAgICAgIGlmIChtZW1iZXIoczMsczJbaV0pPT0tMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzMyArPSAoeyBzMltpXSB9KTsKKyAgICAgICAgICAgICAgICB6dWZpbmRlbis9ZGV0X2F1c3dlcnRlbihzMltpXSk7CisgICAgICAgICAgICB9CisKKy8vIFRlc3Rlbiwgd2VsY2hlIFNlbnNlLURldGFpbHMgZmVobGVuIHVuZCBhbnplaWdlbgorCisgICAgZm9yICggczI9KHt9KSxzMz0oe30pLGk9c2l6ZW9mKHp1ZmluZGVuKS0xO2k+PTA7aS0tKQorICAgIHsKKyAgICAgICAgaWYgKCEobWk9dGVzdF9kZXRhaWxzKHp1ZmluZGVuW2ldLGRlZikpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChwb2ludGVycChtaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaj1zaXplb2YobWkpLTEgOyBqPj0wIDsgai0tKQorICAgICAgICAgICAgICAgIGlmIChtZW1iZXIoczIsbWlbal0pPT0tMSkKKyAgICAgICAgICAgICAgICAgICAgczIgKz0gKHsgbWlbal0gfSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc3RyaW5ncChtaSkgJiYgbWVtYmVyKHMzLG1pKT09LTEpCisgICAgICAgICAgICBzMyArPSAoeyBtaSB9KTsKKyAgICB9CisgICAgczIgPSBzb3J0X2FycmF5KHMyLCMnPCk7CisgICAgczMgPSBzb3J0X2FycmF5KHMzLCMnPCk7CisKKyAgICBpZiAoc2NhbnJ1bjwxKQorICAgIHsKKyAgICAgICAgaWYgKChpPXNpemVvZihzMikpPjApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoIHMxPSIiLC0taSA7IGk+PTAgOyBpLS0gKQorICAgICAgICAgICAgICAgIHMxICs9ICgoczJbaV09PVNFTlNFX0RFRkFVTFQ/IkRFRkFVTFQiOnMyW2ldKSsoaT8iXG4iOiIiKSk7CisKKyAgICAgICAgICAgIHJlICs9IHNwcmludGYoc3ByaW50ZigiJXNMaXN0ZSBkZXIgZ2VmdW5kZW5lbiAlczolc1xuXG4iKworICAgICAgICAgICAgICAgICAgICAgICAgICAiJXNcblxuIixQUkUsV0FTLEVORCwoIiUtIzc4Iisoc3BhbHRlbjwxPyIiOgorICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCIuJWQiLHNwYWx0ZW4pKSsicyIpKSxzMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmUgKz0gc3ByaW50ZigiJXNFcyBnaWJ0IGtlaW5lICVzLiVzXG5cbiIsUFJFLFdBUyxFTkQpOworICAgIH0KKworICAgIGlmICgoaT1zaXplb2YoczMpKT4wKQorICAgIHsKKyAgICAgICAgZm9yICggczE9IiIsLS1pIDsgaT49MCA7IGktLSApCisgICAgICAgICAgIHMxICs9ICgoczNbaV09PVNFTlNFX0RFRkFVTFQ/IkRFRkFVTFQiOnMzW2ldKSsoaT8iXG4iOiIiKSk7CisKKyAgICAgICAgcmUgKz0gc3ByaW50ZihzcHJpbnRmKCIlc0xpc3RlIGRlciBmZWhsZW5kZW4gJXM6JXNcblxuIisKKyAgICAgICAgICAgICAgICAgICAgICAiJXNcblxuIixQUkUsV0FTLEVORCwoIiUtIzc4Iisoc3BhbHRlbjwxPyIiOgorICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoIi4lZCIsc3BhbHRlbikpKyJzIikpLHMxKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZSArPSBzcHJpbnRmKCIlc0VzIGZlaGxlbiBrZWluZSAlcy4lc1xuXG4iLFBSRSxXQVMsRU5EKTsKKworICAgIGlmIChzY2FucnVuPDEpCisgICAgICAgIHJlICs9IHNwcmludGYoIiVzRkVSVElHLiVzXG4iLFBSRSxFTkQpOworCisvLyBEaWUgZWlnZW50bGljaGUgVGV4dGF1c2dhYmUuCisKKyAgICBPdXRwdXQocmUpOworCisgICAgcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiAgRGllIEZ1bmt0aW9uLCBkaWUgZGllIEdlcmFldXNjaGUgaW0gUmF1bSB1bnRlcnN1Y2h0LgorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKK2ludCBzZWFyY2hfbihvYmplY3QgcikKK3sKKyAgICBpZiAoIXIgfHwgIW9iamVjdHAocikpCisgICAgeworICAgICAgICB3cml0ZSgiT1RFU1QtRVJST1I6IEtlaW4gKGV4aXN0aWVyZW5kZXMpIFppZWxvYmpla3QgZ2VmdW5kZW4hXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcmV0dXJuIHNlYXJjaF9zZW5zZShyLFNFTlNFX1NPVU5EKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqICBEaWUgRnVua3Rpb24sIGRpZSBkaWUgR2VydWVjaGUgaW0gUmF1bSB1bnRlcnN1Y2h0LgorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKK2ludCBzZWFyY2hfbShvYmplY3QgcikKK3sKKyAgICBpZiAoIXIgfHwgIW9iamVjdHAocikpCisgICAgeworICAgICAgICB3cml0ZSgiT1RFU1QtRVJST1I6IEtlaW4gKGV4aXN0aWVyZW5kZXMpIFppZWxvYmpla3QgZ2VmdW5kZW4hXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcmV0dXJuIHNlYXJjaF9zZW5zZShyLFNFTlNFX1NNRUxMKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqICBEaWUgRnVua3Rpb24sIGRpZSBkYXMgZWluZ2VnZWJlbmUgS29tbWFuZG8gemVybGVndCB1bmQgaW50ZXJwcmV0aWVydC4KKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCitpbnQgc2VhcmNoKHN0cmluZyBhcmcpCit7ICAgc3RyaW5nICppbixkdW07CisgICAgb2JqZWN0IHRhcmc7CisgICAgaW50ICAgIHdvOworCisgICAgaWYgKCEoUEwtPlF1ZXJ5UHJvcChQX1RFU1RQTEFZRVIpKSAmJiAhSVNfTEVBUk5FUihQTCkpCisgICAgICAgIHJldHVybiByZW1vdmVuKCk7CisKKyAgICBpZiAoc2NhbnJ1bikKKyAgICB7CisgICAgICAgIHdyaXRlKCJEZXJ6ZWl0IHdpcmQgZWluIFZlcnplaWNobmlzIGdlc2Nhbm5lZC4gQml0dGUgd2FydGVuLlxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIG5vdGlmeV9mYWlsKCJPVEVTVC1TeW50YXg6IG90ZXN0IFtkZXRhaWx8c21lbGx8c291bmRdICIrCisgICAgICAgICAgICAgICAgICJ7PG9iamVrdD5baW4gbWlyfGltIHJhdW1dfGhpZXJ9XG4iKTsKKworICAgIGlmICghYXJnIHx8ICFzdHJpbmdwKGFyZykgfHwgc2l6ZW9mKGluPW9sZF9leHBsb2RlKGFyZywiICIpKTwxKQorICAgIHsKKyAgICAgICAgb3V0cHV0PVBMOworICAgICAgICBzY2FucnVuPTA7CisgICAgICAgIG1hc3Rlcj1QTDsKKyAgICAgICAgcmV0dXJuIHNlYXJjaF9kKGVudmlyb25tZW50KFBMKSk7CisgICAgfQorCisgICAgaWYgKHNpemVvZihpbik+MSkKKyAgICB7CisgICAgICAgIGFyZz1pbXBsb2RlKGluWzEuLl0sIiAiKTsKKyAgICAgICAgaWYgKG1lbWJlcigoeyJoaWVyIiwicmF1bSIsIiJ9KSxhcmcpIT0tMSkKKyAgICAgICAgICAgIHRhcmc9ZW52aXJvbm1lbnQoUEwpOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzc2NhbmYoYXJnLCIlcyBpbiBtaXIiLGR1bSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd289MTsKKyAgICAgICAgICAgICAgICBhcmc9ZHVtOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoc3NjYW5mKGFyZywiJXMgaW0gcmF1bSIsZHVtKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3bz0tMTsKKyAgICAgICAgICAgICAgICBhcmc9ZHVtOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB3bz0wOworICAgICAgICAgICAgaWYgKHdvIT0tMSkKKyAgICAgICAgICAgICAgICB0YXJnPXByZXNlbnQoYXJnLFBMKTsKKyAgICAgICAgICAgIGlmICghb2JqZWN0cCh0YXJnKSAmJiB3byE9MSkKKyAgICAgICAgICAgICAgICB0YXJnPXByZXNlbnQoYXJnLGVudmlyb25tZW50KFBMKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgICB0YXJnPWVudmlyb25tZW50KFBMKTsKKyAgICBpZiAoIW9iamVjdHAodGFyZykpCisgICAgeworICAgICAgICB3cml0ZSgiT1RFU1QtRVJST1I6IEdld3VlbnNjaHRlcyBaaWVsIG5pY2h0IGdlZnVuZGVuLlxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIG91dHB1dD1QTDsKKyAgICBzY2FucnVuPTA7CisgICAgbWFzdGVyPVBMOworCisgICAgc3dpdGNoKGluWzBdKQorICAgIHsKKyAgICAgICAgY2FzZSAiZGUiIDoKKyAgICAgICAgY2FzZSAiZGV0YWlsIiA6CisgICAgICAgIGNhc2UgImRldGFpbHMiIDoKKyAgICAgICAgICAgIHJldHVybiBzZWFyY2hfZCh0YXJnKTsKKyAgICAgICAgY2FzZSAic20iIDoKKyAgICAgICAgY2FzZSAic21lbGwiIDoKKyAgICAgICAgY2FzZSAic21lbGxzIiA6CisgICAgICAgICAgICByZXR1cm4gc2VhcmNoX20odGFyZyk7CisgICAgICAgIGNhc2UgInNvIiA6CisgICAgICAgIGNhc2UgInNvdW5kIiA6CisgICAgICAgIGNhc2UgInNvdW5kcyIgOgorICAgICAgICAgICAgcmV0dXJuIHNlYXJjaF9uKHRhcmcpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqICBIaWVyIGthbm4gbWFuIGRlbiAnU2NhbnR5cCcgZWluc3RlbGxlbi4KKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCitpbnQgc2NhbmFydChzdHJpbmcgYXJnKQoreyAgIGludCBoOworCisgICAgaWYgKCEoUEwtPlF1ZXJ5UHJvcChQX1RFU1RQTEFZRVIpKSAmJiAhSVNfTEVBUk5FUihQTCkpCisgICAgICAgIHJldHVybiByZW1vdmVuKCk7CisKKyAgICBpZiAoc2NhbnJ1bikKKyAgICB7CisgICAgICAgIHdyaXRlKCJEZXJ6ZWl0IHdpcmQgZWluIFZlcnplaWNobmlzIGdlc2Nhbm5lZC4gQml0dGUgd2FydGVuLlxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIG5vdGlmeV9mYWlsKCJPVEVTVC1TeW50YXg6IG90eXBlIFtyaWt1c3xyb2NodXNdXG4iKTsKKyAgICBpZiAoIWFyZyB8fCAhc3RyaW5ncChhcmcpKQorICAgIHsKKyAgICAgICAgaWYgKGg9UEwtPlF1ZXJ5UHJvcChQX09URVNUX1RZUCkpCisgICAgICAgICAgICBzY2FudHlwPWg7CisgICAgICAgIGlmICghaCkKKyAgICAgICAgeworICAgICAgICAgICAgUEwtPlNldFByb3AoUF9PVEVTVF9UWVAsc2NhbnR5cCk7CisgICAgICAgICAgICBQTC0+U2V0KFBfT1RFU1RfVFlQLFNBVkUsRl9NT0RFX0FTKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYoIk9URVNUOiBFaW5nZXN0ZWxsdGVyIFNjYW50eXAgaXN0ICclcydcbiIsCisgICAgICAgICAgICAoc2NhbnR5cD09VF9ST0NIVVM/IlJPQ0hVUyI6IlJJS1VTIikpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKG1lbWJlcigoeyJyaWt1cyIsInJvY2h1cyJ9KSxhcmcpPT0tMSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKGFyZz09InJvY2h1cyIpCisgICAgeworICAgICAgICBzY2FudHlwPVRfUk9DSFVTOworICAgICAgICBQTC0+U2V0UHJvcChQX09URVNUX1RZUCxzY2FudHlwKTsKKyAgICAgICAgUEwtPlNldChQX09URVNUX1RZUCxTQVZFLEZfTU9ERV9BUyk7CisgICAgICAgIHdyaXRlKCJPVEVTVDogRWluZ2VzdGVsbHRlciBTY2FudHlwIGlzdCAnUk9DSFVTJ1xuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBzY2FudHlwPVRfUklLVVM7CisgICAgUEwtPlNldFByb3AoUF9PVEVTVF9UWVAsc2NhbnR5cCk7CisgICAgUEwtPlNldChQX09URVNUX1RZUCxTQVZFLEZfTU9ERV9BUyk7CisgICAgd3JpdGUoIk9URVNUOiBFaW5nZXN0ZWxsdGVyIFNjYW50eXAgaXN0ICdSSUtVUydcbiIpOworICAgIHJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogIEhpZXIga2FubiBtYW4gZGllIFNwYWx0ZW56YWhsIGVpbnN0ZWxsZW4uCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworaW50IHNwYWx0ZW56YWhsKHN0cmluZyBhcmcpCit7ICAgaW50IGg7CisKKyAgICBpZiAoIShQTC0+UXVlcnlQcm9wKFBfVEVTVFBMQVlFUikpICYmICFJU19MRUFSTkVSKFBMKSkKKyAgICAgICAgcmV0dXJuIHJlbW92ZW4oKTsKKworICAgIGlmIChzY2FucnVuKQorICAgIHsKKyAgICAgICAgd3JpdGUoIkRlcnplaXQgd2lyZCBlaW4gVmVyemVpY2huaXMgZ2VzY2FubmVkLiBCaXR0ZSB3YXJ0ZW4uXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgbm90aWZ5X2ZhaWwoIk9URVNULVN5bnRheDogb2NvbG0gWzF8MnwzfDR8NXw2fDd8OHxhdXRvXVxuIik7CisKKyAgICBpZiAoIWFyZyB8fCAhc3RyaW5ncChhcmcpKQorICAgIHsKKyAgICAgICAgaWYgKGg9UEwtPlF1ZXJ5UHJvcChQX09URVNUX1NQTCkpCisgICAgICAgICAgICBzcGFsdGVuPWg7CisgICAgICAgIGlmICghaCkKKyAgICAgICAgeworICAgICAgICAgICAgUEwtPlNldFByb3AoUF9PVEVTVF9TUEwsc3BhbHRlbik7CisgICAgICAgICAgICBQTC0+U2V0KFBfT1RFU1RfU1BMLFNBVkUsRl9NT0RFX0FTKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYoIk9URVNUOiBFaW5nZXN0ZWxsdGUgU3BhbHRlbnphaGwgaXN0ICclcydcbiIsCisgICAgICAgICAgICAoc3BhbHRlbj4wP3NwcmludGYoIiVkIixzcGFsdGVuKToiJ0FVVE8nIikpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKGFyZz09ImF1dG8iKQorICAgIHsKKyAgICAgICAgc3BhbHRlbj0tMTsKKyAgICAgICAgUEwtPlNldFByb3AoUF9PVEVTVF9TUEwsc3BhbHRlbik7CisgICAgICAgIFBMLT5TZXQoUF9PVEVTVF9TUEwsU0FWRSxGX01PREVfQVMpOworICAgICAgICB3cml0ZSgiT1RFU1Q6IEVpbmdlc3RlbGx0ZSBTcGFsdGVuemFobCBpc3QgJ0FVVE8nXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGggPSB0b19pbnQoYXJnKTsKKyAgICBpZiAoaDwxIHx8IGg+OCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgc3BhbHRlbj1oOworICAgIFBMLT5TZXRQcm9wKFBfT1RFU1RfU1BMLHNwYWx0ZW4pOworICAgIFBMLT5TZXQoUF9PVEVTVF9TUEwsU0FWRSxGX01PREVfQVMpOworICAgIHByaW50ZigiT1RFU1Q6IEVpbmdlc3RlbGx0ZSBTcGFsdGVuemFobCBpc3QgJWRcbiIsc3BhbHRlbik7CisgICAgcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiAgSGllciBrYW5uIG1hbiBnYW56ZSBWZXJ6ZWljaG5pc3NlIGR1cmNoc2Nhbm5lbiBsYXNzZW4KKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCitpbnQgZGlydGVzdGVuKHN0cmluZyBhcmcpCit7ICAgc3RyaW5nIHZ6LGFmLHUsKmRpcjsKKyAgICBpbnQgICAgaSxzaTsKKworICAgIGlmICghKFBMLT5RdWVyeVByb3AoUF9URVNUUExBWUVSKSkgJiYgIUlTX0xFQVJORVIoUEwpKQorICAgICAgICByZXR1cm4gcmVtb3ZlbigpOworCisgICAgaWYgKHNjYW5ydW4pCisgICAgeworICAgICAgICB3cml0ZSgiRGVyemVpdCB3aXJkIGVpbiBWZXJ6ZWljaG5pcyBnZXNjYW5uZWQuIEJpdHRlIHdhcnRlbi5cbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAob2JqZWN0X25hbWUoTUUpWzAuLjJdPT0iL3AvIikKKyAgICB7CisgICAgICAgIHdyaXRlKGJyZWFrX3N0cmluZygiRWluIERpcnNjYW4ga2FubiBudXIgZHVyY2hnZWZ1ZWhydCB3ZXJkZW4sICIrCisgICAgICAgICAgICAgICJ3ZW5uIG1hbiBkZW4gUHJ1ZWZlciBpbiBzZWluIC9wbGF5ZXJzLy1WZXJ6ZWljaG5pcyBrb3BpZXJ0ICIrCisgICAgICAgICAgICAgICJoYXQgb2RlciB2b24gZWluZW0gZG9ydCBsaWVnZW5kZW4gT2JqZWt0IGluaGVyaXRlZC4iLDc4LAorICAgICAgICAgICAgICAiT1RFU1Q6ICIpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgbm90aWZ5X2ZhaWwoIk9URVNULVN5bnRheDogb3RkaXIgPHZlcnplaWNobmlzPiA8YXVzZ2FiZWZpbGU+XG4iKTsKKyAgICBpZiAoIWFyZyB8fCAhc3RyaW5ncChhcmcpIHx8IHNzY2FuZihhcmcsIiVzICVzIix2eixhZikhPTIpCisgICAgICAgIHJldHVybiAwOworCisvLyBaaWVsZmlsZW5hbWUgdGVzdGVuL2Zlc3RsZWdlbi4KKworICAgIHU9Z2V0dWlkKFBMKTsKKyAgICBpZiAoZmlsZV9zaXplKCIvbG9nLyIrdSsiLyIpIT0tMikKKyAgICB7CisgICAgICAgIHByaW50ZigiT1RFU1Q6IEVzIGV4aXN0aWVydCBrZWluIFZlcnplaWNobmlzICcvbG9nLyVzLydcbiIsdSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBmb3IgKGk9c2l6ZW9mKGFmKS0xO2k+PTA7aS0tKQorICAgICAgICBpZiAoKChzaT1hZltpXSk8NDggJiYgc2khPTQ2KSB8fCAoc2k+NTcgJiYgc2k8NjUpIHx8IHNpPjEyMiB8fAorICAgICAgICAgICAgKHNpPjkwICYmIHNpPDk3KSkKKyAgICAgICAgeworICAgICAgICAgICAgd3JpdGUoIk9URVNUOiBJbGxlZ2FsZXIgRmlsZW5hbWUgZnVlciBBdXNnYWJlZmlsZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB1PXNwcmludGYoIi9sb2cvJXMvJXMiLHUsYWYpOworCisvLyBadSB1bnRlcnN1Y2hlbmRlcyBWZXJ6ZWljaG5pcyBwcnVlZmVuL2Vpbmxlc2VuLgorCisgICAgaWYgKCF2eiB8fCAhc3RyaW5ncCh2eikgfHwgc2l6ZW9mKHZ6KTwzIHx8IHZ6WzBdIT0nLycgfHwgdnpbPDFdIT0nLycpCisgICAgeworICAgICAgICB3cml0ZSgiT1RFU1Q6IFZlcnplaWNobmlzbmFtZSBtdXNzIG1pdCAnLycgYmVnaW5uZW4gdW5kIGF1ZmhvZXJlbi5cbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZm9yIChpPXNpemVvZihhZiktMTtpPj0wO2ktLSkKKyAgICAgICAgaWYgKCgoc2k9YWZbaV0pPDQ2KSB8fCAoc2k+NTcgJiYgc2k8NjUpIHx8IHNpPjEyMiB8fCAoc2k+OTAgJiYgc2k8OTcpKQorICAgICAgICB7CisgICAgICAgICAgICB3cml0ZSgiT1RFU1Q6IElsbGVnYWxlciBGaWxlbmFtZSBmdWVyIFZlcnplaWNobmlzLlxuIik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIGRpciA9IGdldF9kaXIodnorIiouYyIpOworICAgIGlmICgoc2k9c2l6ZW9mKGRpcikpPDEpCisgICAgeworICAgICAgICB3cml0ZSgiT1RFU1Q6IERhcyBnZXd1ZW5zY2h0ZSBWZXJ6ZWljaG5pcyBleGlzdGllcnQgbmljaHQgb2RlciBpc3QgIisKKyAgICAgICAgICAgICAgImxlZXIuXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgb3V0cHV0ICAgID0gdTsKKworICAgIGlmIChzdHJpbmdwKGNhdGNoCisgICAgICAgICAgKGk9d3JpdGVfZmlsZShvdXRwdXQsIHNwcmludGYoIlRlc3RzdGFydDogJXNcblxuIixkdGltZSh0aW1lKCkpKSkpKQorICAgICAgICAmJiBpIT0xKQorICAgIHsKKyAgICAgICAgd3JpdGUoYnJlYWtfc3RyaW5nKAorICAgICAgICAgICAgc3ByaW50ZigiRmVobGVyIGJlaW0gU2NocmVpYmVuIGluIGRhcyBGaWxlICVzOlxuJXNBYm9ydGluZy4iLAorICAgICAgICAgICAgICAgIG91dHB1dCx1KSw3OCwiT1RFU1Q6ICIsMSkpOworICAgICAgICBvdXRwdXQgPSAwOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBzY2FucnVuICAgPSBzaSsxOworICAgIHNjYW5maWxlcyA9IGRpcjsKKyAgICBzY2FuZGlyICAgPSB2ejsKKyAgICBzY2FuY291bnQgPSAwOworICAgIG1hc3RlciAgICA9IFBMOworICAgIHNjYW5lcnIgICA9ICh7MCwwfSk7CisKKyAgICBjYWxsX291dCgieF9oZWFydF9iZWF0IixUX1BBVVNFKTsKKworICAgIHByaW50ZigiT1RFU1Q6IFNjYW5uZSAlZCBGaWxlczpcbiIrCisgICAgICAgICAgICIgICAgICAgJXMgPT4gJXNcbiIrCisgICAgICAgICAgICJaZWl0OiAgZXR3YSAlc1xuIixzaSx2eixvdXRwdXQsCisgICAgICAgICAgICAgICB0aW1lMnN0cmluZygiJWg6JTAybTolMDJzIixzaSo0KlRfUEFVU0UpKTsKKworICAgIHJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogIERhcyBTY2FubmVuIHZvbiBWZXJ6ZWljaG5pc3NlbiB3aXJkIHVlYmVyIHhfaGVhcnRfYmVhdCgpIGVybGVkaWd0LgorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKK3ZvaWQgeF9oZWFydF9iZWF0KCkKK3sgICBpbnQgICAgbnI7CisgICAgc3RyaW5nIGZuLGVyOworCisgICAgY2FsbF9vdXQoInhfaGVhcnRfYmVhdCIsVF9QQVVTRSk7CisKKyAgICBpZiAoKCsrc2NhbmNvdW50KT40KQorICAgIHsKKyAgICAgICAgc2NhbmNvdW50ID0gMTsKKyAgICAgICAgdGVzdG9iICAgID0gMDsKKyAgICAgICAgc2NhbnJ1bi0tOworICAgIH0KKworICAgIG5yPXNjYW5ydW4tMjsKKyAgICBpZiAobnI8MCkKKyAgICB7CisgICAgICAgIGlmIChlbnZpcm9ubWVudCgpICYmIGludGVyYWN0aXZlKGVudmlyb25tZW50KCkpKQorICAgICAgICAgICAgZW52aXJvbm1lbnQoKS0+TWVzc2FnZShicmVha19zdHJpbmcoIidvdGRpcicgYmVlbmRldC5cbiIrCisgICAgICAgICAgICAgICAgc3ByaW50ZigiRmlsZXM6ICVkIC0gRmVobGVyOiAlZCAtIFNraXBzOiAlZCIsCisgICAgICAgICAgICAgICAgc2l6ZW9mKHNjYW5maWxlcyksc2NhbmVyclswXSxzY2FuZXJyWzFdKSwKKyAgICAgICAgICAgICAgICA3OCwiT1RFU1Q6ICIsMSksTVNHRkxBR19URUxMKTsKKworICAgICAgICBzY2FucnVuICAgPSAwOworICAgICAgICBzY2FuY291bnQgPSAwOworICAgICAgICBvdXRwdXQgICAgPSAwOworICAgICAgICBzY2FuZmlsZXMgPSAoe30pOworICAgICAgICBzY2FuZGlyICAgPSAwOworICAgICAgICB0ZXN0b2IgICAgPSAwOworICAgICAgICBzY2FuZXJyICAgPSAoezAsMH0pOworCisgICAgICAgIHdoaWxlKHJlbW92ZV9jYWxsX291dCgieF9oZWFydF9iZWF0IikhPS0xKTsKKworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZuPXNjYW5kaXIrc2NhbmZpbGVzW25yXTsKKyAgICBpZiAoZm5bPDIuLl09PSIuYyIpCisgICAgICAgIGZuPWZuWzAuLjwzXTsKKworICAgIGlmIChzY2FuY291bnQ9PTEpIC8vIFRlc3Rlbiwgb2IgRmlsZSBsYWRiYXIKKyAgICB7CisgICAgICAgIE91dHB1dChzcHJpbnRmKCJGaWxlOiAlc1xuXG4iLGZuKSk7CisgICAgICAgIGVyPWNhdGNoKGNhbGxfb3RoZXIoZm4sIj8/PyIpKTsKKyAgICAgICAgaWYgKGVyICYmIHN0cmluZ3AoZXIpKQorICAgICAgICB7CisgICAgICAgICAgICBPdXRwdXQoc3ByaW50ZigiRXJyb3I6ICVzLT5BYm9ydEBMb2FkXG5cbiIsZXIpKTsKKyAgICAgICAgICAgIHNjYW5ydW4tLTsKKyAgICAgICAgICAgIHNjYW5jb3VudCAgPSAwOworICAgICAgICAgICAgdGVzdG9iICAgICA9IDA7CisgICAgICAgICAgICBzY2FuZXJyWzBdID0gc2NhbmVyclswXSsxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRlc3RvYiA9IGZpbmRfb2JqZWN0KGZuKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIW9iamVjdHAodGVzdG9iKSkKKyAgICB7CisgICAgICAgIE91dHB1dCgiT2JqZWt0IG5pY2h0IGdlZnVuZGVuXG4tPiBBYm9ydEBPYmplY3QuXG5cbiIpOworICAgICAgICBzY2FucnVuLS07CisgICAgICAgIHNjYW5jb3VudCAgPSAwOworICAgICAgICBzY2FuZXJyWzBdID0gc2NhbmVyclswXSsxOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghZnVuY3Rpb25fZXhpc3RzKCJpbnRfbG9uZyIsdGVzdG9iKSkKKyAgICB7CisgICAgICAgIE91dHB1dCgiT2JqZWt0IGlzdCBrZWluIFJhdW0gLT4gU0tJUFBJTkcuXG5cbiIpOworICAgICAgICBzY2FucnVuLS07CisgICAgICAgIHNjYW5jb3VudCAgPSAwOworICAgICAgICB0ZXN0b2IgICAgID0gMDsKKyAgICAgICAgc2NhbmVyclsxXSA9IHNjYW5lcnJbMV0rMTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzd2l0Y2goc2NhbmNvdW50KQorICAgIHsKKyAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgIGlmICgoZXI9Y2F0Y2goc2VhcmNoX2QodGVzdG9iKSkpICYmIHN0cmluZ3AoZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE91dHB1dChzcHJpbnRmKCJFcnJvcjogJXMtPiBBYm9ydEBEZXRhaWwuXG5cbiIsZXIpKTsKKyAgICAgICAgICAgICAgICBzY2FucnVuLS07CisgICAgICAgICAgICAgICAgc2NhbmNvdW50ICA9IDA7CisgICAgICAgICAgICAgICAgdGVzdG9iICAgICA9IDA7CisgICAgICAgICAgICAgICAgc2NhbmVyclswXSA9IHNjYW5lcnJbMF0rMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgY2FzZSAzIDoKKyAgICAgICAgICAgIGlmICgoZXI9Y2F0Y2goc2VhcmNoX3NlbnNlKHRlc3RvYixTRU5TRV9TTUVMTCkpKSAmJiBzdHJpbmdwKGVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBPdXRwdXQoc3ByaW50ZigiRXJyb3I6ICVzLT4gQWJvcnRAU21lbGwuXG5cbiIsZXIpKTsKKyAgICAgICAgICAgICAgICBzY2FucnVuLS07CisgICAgICAgICAgICAgICAgc2NhbmNvdW50ICA9IDA7CisgICAgICAgICAgICAgICAgdGVzdG9iICAgICA9IDA7CisgICAgICAgICAgICAgICAgc2NhbmVyclswXSA9IHNjYW5lcnJbMF0rMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgY2FzZSA0IDoKKyAgICAgICAgICAgIGlmICgoZXI9Y2F0Y2goc2VhcmNoX3NlbnNlKHRlc3RvYixTRU5TRV9TT1VORCkpKSAmJiBzdHJpbmdwKGVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBPdXRwdXQoc3ByaW50ZigiRXJyb3I6ICVzLT4gQWJvcnRAU291bmQuXG5cbiIsZXIpKTsKKyAgICAgICAgICAgICAgICBzY2FucnVuLS07CisgICAgICAgICAgICAgICAgc2NhbmNvdW50ICA9IDA7CisgICAgICAgICAgICAgICAgdGVzdG9iICAgICA9IDA7CisgICAgICAgICAgICAgICAgc2NhbmVyclswXSA9IHNjYW5lcnJbMF0rMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3Rlc3Rlci90ZXN0LmRhdCBiL29iai90b29scy90ZXN0ZXIvdGVzdC5kYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcyMGM3NgotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZXN0ZXIvdGVzdC5kYXQKQEAgLTAsMCArMSw1IEBACitkZXIgZGllIGRhcyBpY2ggZHUgZXIgc2llIGVzIHdpciBpaHIgc2llIG1laW4gZGVpbiBzZWluIGRlaW5lciBldWVyIGFuIGF1cworZWluIGF1Y2ggZGFmdWVyIGRvY2ggaW0gbmFqYSB3aWUgZGVpbmVuIG1laW5lbiBkZWluZW0gbWVpbmVtIHNpZWh0IGRpY2ggZGllcworc3VlZGVuIG5vcmRlbiB3ZXN0ZW4gb3N0ZW4gc3VlZG9zdGVuIHN1ZWR3ZXN0ZW4gbm9yZG9zdGVuIG5vcmR3ZXN0ZW4gZGllc2UKK2RpciBkb3J0IGhtIGphIG5laW4gYWxzIGF1ZiBpbiBtYW4gbmFjaCB1bSBkaWVzZXIgbmljaHQgZGVpbmUgdm9uIHdlbm4gYW0KK2tlaW5lIG11ZCBoaWVyIHNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3h0b29sLmMgYi9vYmovdG9vbHMveHRvb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDBjNDhhCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3h0b29sLmMKQEAgLTAsMCArMSw3IEBACit2b2lkIGNyZWF0ZSgpCit7CisgIGlmKG1lbWJlcihvYmplY3RfbmFtZSh0aGlzX29iamVjdCgpKSwnIycpPT0tMSkKKyAgICByZXR1cm47CisgIGNsb25lX29iamVjdCgiL29iai90b29scy9NR3Rvb2wiKS0+bW92ZSh0aGlzX29iamVjdCgpKTsKKyAgY2FsbF9vdXQobGFtYmRhKCh7fSksKHsjJ2Rlc3RydWN0LCh7Iyd0aGlzX29iamVjdH0pfSkpLDApOworfQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3h4dG9vbC5jIGIvb2JqL3Rvb2xzL3h4dG9vbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhM2ZiNmMKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMveHh0b29sLmMKQEAgLTAsMCArMSw0MSBAQAorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4NCisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4NCisNCitpbmhlcml0ICJvYmovdG9vbHMvTUd0b29sIjsNCitpbmhlcml0ICJzdGQvdGhpbmciOw0KKw0KK3ZvaWQgY3JlYXRlKCkNCit7DQorICBpZighY2xvbmVwKHRoaXNfb2JqZWN0KCkpKQ0KKyAgICByZXR1cm47DQorICB0aGluZzo6Y3JlYXRlKCk7DQorICA6OmNyZWF0ZSgpOw0KKyAgU2V0UHJvcChQX05BTUUsIkFua2giKTsNCisgIFNldFByb3AoUF9HRU5ERVIsTkVVVEVSKTsNCisgIFNldFByb3AoUF9JRFMsKHsiYW5raCIsInh4dG9vbCJ9KSk7DQorfQ0KKw0KK3N0cmluZyBfcXVlcnlfc2hvcnQoKQ0KK3sNCisgIDo6X3F1ZXJ5X3Nob3J0KCk7DQorICByZXR1cm4gIkVpbiBBbmtoIGFtIEhhbHNiYW5kLlxuIjsNCit9DQorDQorc3RyaW5nIF9xdWVyeV9sb25nKCkNCit7DQorICA6Ol9xdWVyeV9sb25nKCk7DQorICByZXR1cm4NCisgICAgIkVpbiBIYWxzYmFuZCwgYW4gZGVtIGVpbiBBbmtoIGhhZW5ndC5cbiINCisgICAgKwkiRWluIEFua2ggc2llaHQgdW5nZWZhZWhyIHNvIGF1cyB3aWUgZWluIEtyZXV6IGFiZXIgZWJlbiBuaWNodCBnYW56LlxuIjsNCit9DQorDQorc3RyaW5nIG5hbWUoIGludCBkMSwgaW50IGQyICkNCit7DQorICByZXR1cm4gdGhpbmc6Om5hbWUoZDEsZDIpOw0KK30NCisNCitpbnQgaWQoIHN0cmluZyBzdHIgKQ0KK3sNCisgIDo6aWQoc3RyKTsNCisgIHJldHVybiBtZW1iZXIoICh7ImFua2giLCJ4eHRvb2wifSksc3RyICkgIT0gLTE7DQorfQ0KZGlmZiAtLWdpdCBhL29iai90b3BsaXN0ZS5jIGIvb2JqL3RvcGxpc3RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMwYzU0NgotLS0gL2Rldi9udWxsCisrKyBiL29iai90b3BsaXN0ZS5jCkBAIC0wLDAgKzEsMTE2IEBACitpbmhlcml0ICIvc3RkL3RoaW5nIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorCisvLyAoe0Z1bmt0aW9uc25hbWUsICh7YXJndW1lbnRlfSksIHR0dGVsIH0pCitub3NhdmUgPHN0cmluZ3xtaXhlZCo+KiB3YXRkZW5uOworCitzdHJpbmcgX2xpZXNsaXN0ZSgpOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuOworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfU0hPUlQsIkRpZSBUb3AtTGlzdGUsIFRvcC1TcGllbGVybGlzdGUsIFRvcC1TZWhlcmxpc3RlIHVuZCAiCisgICAgICAiVG9wLUhhcmRjb3JlbGlzdGUiKTsKKyAgU2V0UHJvcChQX1dFSUdIVCwwKTsKKyAgU2V0UHJvcChQX0dFTkRFUixGRU1BTEUpOworICBTZXRQcm9wKFBfV0VJR0hULDIwKTsKKyAgQWRkSWQoKHsibGlzdGUiLCJ0b3BsaXN0ZSIsInRvcC1saXN0ZSIsCisgICAgICAgICAgInRvcHNwaWVsZXJsaXN0ZSIsInRvcC1zcGllbGVybGlzdGUiLCJ0b3BzcGllbGVyIiwic3BpZWxlcmxpc3RlIiwKKyAgICAgICAgICAidG9wc2VoZXJsaXN0ZSIsInRvcC1zZWhlcmxpc3RlIiwidG9wc2VoZXIiLCJzZWhlcmxpc3RlIiwKKyAgICAgICAgICAidG9waGFyZGNvcmVsaXN0ZSIsInRvcC1oYXJkY29yZWxpc3RlIiwidG9waGFyZGNvcmUiLCJoYXJkY29yZWxpc3RlIn0pKTsKKyAgU2V0UHJvcChQX05BTUUsIkxpc3RlIik7CisgIFNldFByb3AoUF9OT0dFVCwiRGllIGlzdCBhbiBkZXIgV2FuZCBmZXN0Z2VuYWdlbHQuXG4iKTsKKyAgQWRkUmVhZERldGFpbChTRU5TRV9ERUZBVUxULCAjJ19saWVzbGlzdGUpOworfQorCisjZGVmaW5lIE5BTUUgICAgIDAKKyNkZWZpbmUgTEVQICAgICAgMQorI2RlZmluZSBRUCAgICAgICAyCisjZGVmaW5lIFhQICAgICAgIDMKKyNkZWZpbmUgTEVWRUwgICAgNAorI2RlZmluZSBBR0UgICAgICA1CisjZGVmaW5lIFJBQ0UgICAgIDYKKyNkZWZpbmUgR1VJTEQgICAgNworI2RlZmluZSBXSVpMRVZFTCA4CisjZGVmaW5lIEhBUkRDT1JFIDkKK3B1YmxpYyBzdHJpbmcgZm9ybWF0X2xpc3QoPCA8c3RyaW5nfGludD4qID4qIGxpc3QpCit7CisgIGludCBpZHg7CisgIC8vc3RyaW5nIHJlcz0iICAgICAgTmFtZSAgICAgICAgIExldmVsICBBUCAgRXJmYWhydW5nICAgIEFsdGVyICAgICBHaWxkZVxuIjsKKyAgc3RyaW5nIHJlcyA9IHNwcmludGYoCisgICAgICAiJWMlOjRzICAlOjExLXMgICU6NXxzICU6NXxzICU6NHxzICU6MTJ8cyAlOjEyfHMgICU6MTQtc1xuIiwKKyAgICAgICcgJywgIiIsICJOYW1lIiwgIiIsICJMZXZlbCIsICJBUCIsICJFcmZhaHJ1bmciLCJBbHRlciIsIkdpbGRlIik7CisKKyAgZm9yZWFjaCg8c3RyaW5nfGludD4qIGVudHJ5OiBsaXN0KQorICB7CisgICAgKytpZHg7CisgICAgZW50cnlbQUdFXSAqPSAyOworICAgIGludCB0YWdlID0gZW50cnlbQUdFXS84NjQwMDsKKyAgICBpbnQgc3R1bmRlbiA9IChlbnRyeVtBR0VdICUgODY0MDApIC8gMzYwMDsKKyAgICBpbnQgbWludXRlbiA9IChlbnRyeVtBR0VdICUgMzYwMCkgLyA2MDsKKyAgICByZXMgKz0KKyAgICBzcHJpbnRmKCIlYyU6NGQuICU6MTEtcyAgJTo1LXMgJTo1ZCAlOjRkICU6MTJkICU6NGRkLCAlOjInMCdkOiU6MicwJ2QgICU6MTQtc1xuIiwKKyAgICAgICAgICAgIChlbnRyeVtXSVpMRVZFTF0+MCA/ICcqJyA6ICcgJyksCisgICAgICAgICAgICBpZHgsIGNhcGl0YWxpemUoZW50cnlbTkFNRV0pLAorICAgICAgICAgICAgKGVudHJ5W0hBUkRDT1JFXT4xID8gIihSSVApIiA6ICIiKSwKKyAgICAgICAgICAgIGVudHJ5W0xFVkVMXSwKKyAgICAgICAgICAgIGVudHJ5W1FQXSwgZW50cnlbWFBdLAorICAgICAgICAgICAgdGFnZSwgc3R1bmRlbiwgbWludXRlbiwKKyAgICAgICAgICAgIGNhcGl0YWxpemUoZW50cnlbR1VJTERdKSk7CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKworcHJpdmF0ZSBzdHJpbmcgZ2V0X2xpc3QoPHN0cmluZ3xtaXhlZCo+KiB3YXMpCit7CisgIGlmICh3YXMgPT0gMCkKKyAgICB3YXM9KHsiTGlzdGUiLCAoe30pLCAiICIqMjggKyAiTGlzdGUgZGVyIFRvcHNwaWVsZXIgIVxuXG4iIH0pOworCisgIDwgPHN0cmluZ3xpbnQ+KiA+KiBsaXN0ID0gIi9zZWN1cmUvdG9wbGlzdGUiLT4od2FzWzBdKSh3YXNbMV0uLi4pOworICAKKyAgcmV0dXJuIHdhc1syXSArIGZvcm1hdF9saXN0KGxpc3QpOworfQorCit2YXJhcmdzIGludCBpZChzdHJpbmcgc3RyLGludCBsdmwpCit7CisgIGlmICghOjppZChzdHIsbHZsKSkKKyAgICByZXR1cm4gMDsKKworICBpZiAoc3Ryc3RyKHN0ciwic2VoZXIiKT49MCkKKyAgICB3YXRkZW5uPSh7IlNlaGVyTGlzdGUiLCAoeyB9KSwgIiAiKjI5ICsgIkxpc3RlIGRlciBUb3BzZWhlciAhXG5cbiIgfSk7CisgIGVsc2UgaWYgKHN0cnN0cihzdHIsInNwaWVsZXIiKT49MCkKKyAgICB3YXRkZW5uPSh7IlNwaWVsZXJMaXN0ZSIsICh7IH0pLAorICAgICAgICAgICAgICAgIiAiKjIxICsgIkxpc3RlIGRlciBUb3BzcGllbGVyIChLZWluZSBTZWhlcikgIVxuXG4iIH0pOworICBlbHNlIGlmIChzdHJzdHIoc3RyLCJoYXJkY29yZSIpPj0wKQorICAgIHdhdGRlbm49KHsiSGFyZGNvcmVMaXN0ZSIsICh7IH0pLAorICAgICAgICAgICAgICAgIiAiKjIyICsgIkxpc3RlIGRlciBtdXRpZ3N0ZW4gYWxsZXIgSGVsZGVuICFcblxuIiB9KTsKKyAgZWxzZQorICAgIHdhdGRlbm49KHsiTGlzdGUiLCAoeyB9KSwgIiAiKjI4ICsgIkxpc3RlIGRlciBUb3BzcGllbGVyICFcblxuIiB9KTsKKyAgCisgIHJldHVybiAxOworfQorCitzdHJpbmcgX3F1ZXJ5X2xvbmcoKQoreworICBpZiAodGhpc19wbGF5ZXIoKSkgdGhpc19wbGF5ZXIoKS0+TW9yZShnZXRfbGlzdCh3YXRkZW5uKSk7CisgIHdhdGRlbm49MDsKKyAgcmV0dXJuICIiOworfQorCit2YXJhcmdzIHN0cmluZyBsb25nKGludCBtb2RlKQoreworICBpZiAodGhpc19wbGF5ZXIoKSkgdGhpc19wbGF5ZXIoKS0+TW9yZShnZXRfbGlzdCh3YXRkZW5uKSk7CisgIHdhdGRlbm49MDsKKyAgcmV0dXJuICIiOworfQorCitzdHJpbmcgX2xpZXNsaXN0ZSgpCit7CisgIGlmICh0aGlzX3BsYXllcigpKSB0aGlzX3BsYXllcigpLT5Nb3JlKGdldF9saXN0KHdhdGRlbm4pKTsKKyAgd2F0ZGVubj0wOworICByZXR1cm4gIiI7Cit9CisKZGlmZiAtLWdpdCBhL29iai91aHIuYyBiL29iai91aHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTRiNmVhCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Voci5jCkBAIC0wLDAgKzEsODYgQEAKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgbm9faW5oZXJpdAorI3ByYWdtYSBub19zaGFkb3cKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8ZXZlbnRzLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCitwcml2YXRlIHN0cmluZyB1bG9nID0gIiI7CisKK3ZvaWQgV2FpdEZvclF1YXJ0ZXJIb3VyKCkgeworICB3aGlsZShyZW1vdmVfY2FsbF9vdXQoIlF1YXJ0ZXJSZWFjaGVkIikhPS0xKTsKKyAgY2FsbF9vdXQoIlF1YXJ0ZXJSZWFjaGVkIiw5MDAtKHRpbWUoKSAlIDkwMCkpOworfQorCit2b2lkIGNyZWF0ZSgpIHsKKyAgV2FpdEZvclF1YXJ0ZXJIb3VyKCk7Cit9CisKKy8qIFVlYmVycHJ1ZWZ0IGRpZSBhbHMgUGFyYW1ldGVyICJzdHIiIHVlYmVyZ2ViZW5lIFVocm1lbGR1bmcuCisgICBSdWVja2dhYmV3ZXJ0ZTogMCBmdWVyIGZlaGxlcmhhZnRlIFBhcmFtZXRlciwKKyAgICAgICAgICAgICAgICAgICAxIGZ1ZXIga29ycmVrdGVuIEF1ZmJhdS4gKi8KK2ludCBDaGVja0Nsb2NrTXNnKHN0cmluZyBzdHIpCit7CisgIGludCBpID0gc3Ryc3RyKHN0ciwgIiUiLCAwKTsKKyAgLyogTWVociBhbHMgMXggJWQgZW50aGFsdGVuLCBtZWhyIGFscyAxeCAlIGVudGhhbHRlbiwgb2RlciBhdWYgZGFzIGVpbnppZ2UKKyAgICAgZW50aGFsdGVuZSAlIGZvbGd0IGtlaW4gImQiLiAqLworICBpZiAoIHNpemVvZihleHBsb2RlKHN0ciwiJWQiKSkgPiAyIHx8CisgICAgICAgc2l6ZW9mKGV4cGxvZGUoc3RyLCIlIikpID4gMiB8fAorICAgICAgIChpPi0xICYmICggaT09c2l6ZW9mKHN0ciktMSB8fCBzdHJbaSsxXSAhPSAnZCcpKSkKKyAgICByZXR1cm4gMDsKKyAgZWxzZQorICAgIHJldHVybiAxOworfQorCit2b2lkIFF1YXJ0ZXJSZWFjaGVkKCkgeworICBpbnQgc3RkLCBtaW51dGVuOworICBzdHJpbmcgc3RyLCBmb3JtYXQ7CisgIGludCBvZmY7CisKKyAgaW50ICpsdD1sb2NhbHRpbWUodGltZSgpKTsKKyAgbWludXRlbj1sdFtUTV9NSU5dOworICBzdGQ9bHRbVE1fSE9VUl07CisgIG1hcHBpbmcgZWRhdGEgPSBta21hcHBpbmcoCisgICAgICAgICh7VE1fU0VDLCBUTV9NSU4sIFRNX0hPVVIsIFRNX01EQVksIFRNX01PTiwgVE1fWUVBUiwgVE1fV0RBWSwgVE1fWURBWSwKKyAgICAgICAgICAgIFRNX0lTRFNUfSksCisgICAgICAgIGx0KTsKKworICAvLyBDbG9jay1FdmVudCB0cmlnZ2VybgorICBFVkVOVEQtPlRyaWdnZXJFdmVudChFVlRfTElCX0NMT0NLLCBlZGF0YSk7IAorCisgIC8vIGJlaSBEYXR1bXN3ZWNoc2VsIERBVEVDSEFOR0UtRXZlbnQgYXVzbG9lc2VuLgorICBpZiAoc3RkPT0wICYmIG1pbnV0ZW4gPCAxNSkgeyAgICAgIAorICAgICAgRVZFTlRELT5UcmlnZ2VyRXZlbnQoRVZUX0xJQl9EQVRFQ0hBTkdFLCBlZGF0YSk7CisgIH0KKworICBpZiAobWludXRlbiA8PSAyKSB7CisgICAgZm9yZWFjaChvYmplY3QgdSA6IHVzZXJzKCkpIHsKKyAgICAgIGlmKChvZmY9dG9faW50KHUtPlF1ZXJ5UHJvcChQX1RJTUVaT05FKSkpPDApb2ZmKz0yNDsKKyAgICAgIG9mZj0oc3RkK29mZiklMjQ7CisgICAgICBmb3JtYXQ9dS0+UXVlcnlQcm9wKFBfQ0xPQ0tNU0cpfHwiRHUgaG9lcnN0IGRpZSBVaHIgc2NobGFnZW46ICIKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVzIGlzdCBqZXR6dCAlZCBVaHIuXG4iOworICAgICAgaWYgKCAhQ2hlY2tDbG9ja01zZyhmb3JtYXQpICkKKyAgICAgIHsKKwl0ZWxsX29iamVjdCh1LCBicmVha19zdHJpbmcoCisJICAiU28ga2FubiBpY2ggbmljaHQgYXJiZWl0ZW4hIERlaW5lIFVocm1lbGR1bmcgZnVua3Rpb25pZXJ0IHNvICIKKwkgICJuaWNodC4gQml0dGUga29ycmlnaWVyZSBkYXMuIiwgNzgsICJEaWUgVWhyIHRlaWx0IERpciBtaXQ6ICIpKTsKKwljb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJzdHIoZm9ybWF0LCIlZCIsMCk9PS0xKQorICAgICAgICBzdHI9Zm9ybWF0OworICAgICAgZWxzZQorICAgICAgICBzdHI9c3ByaW50Zihmb3JtYXQsb2ZmKTsKKyAgICAgIGlmIChzdHIhPSIiKSB0ZWxsX29iamVjdCh1LHN0cik7CisgICAgfQorICB9CisgIHN0ciA9ICIiOworICBpZiAobWludXRlbiA8IDEwKSB7CisgICAgbG9nX2ZpbGUoIlVTRVJfU1RBVElTVElLIiwgdWxvZyk7CisgICAgdWxvZyA9IHNwcmludGYoIlxuJXMlMDJkOiAiLCghc3RkPygiIyAiK2x0W1RNX1dEQVldKyI6XG4iKToiIiksc3RkKTsKKyAgfQorICB1bG9nICs9IHNwcmludGYoIiU0ZCIsc2l6ZW9mKHVzZXJzKCkpKTsKKyAgV2FpdEZvclF1YXJ0ZXJIb3VyKCk7Cit9CisKZGlmZiAtLWdpdCBhL29iai92ZXJ0cmFnLmMgYi9vYmovdmVydHJhZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MDk5MGUKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdmVydHJhZy5jCkBAIC0wLDAgKzEsMTE1IEBACisjcHJhZ21hIHN0cmljdF90eXBlcworI3ByYWdtYSBjb21iaW5lX3N0cmluZ3MKKyNwcmFnbWEgbm9fc2hhZG93CisjcHJhZ21hIG5vX2luaGVyaXQKKworaW5oZXJpdCAic3RkL3RoaW5nIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorCitwcml2YXRlIGludCBnZWxlc2VuOworcHJpdmF0ZSBzdHJpbmcgdW50ZXJzY2hyaWViZW47CisKK3N0YXRpYyBzdHJpbmcgdGV4dCgpOworCitwdWJsaWMgdm9pZCBjcmVhdGUoKQoreworICAgaWYgKCAhZ2V0ZXVpZCh0aGlzX29iamVjdCgpKSApCisgICAgICBjYWxsX291dCggInJlbW92ZSIsIDAgKTsKKyAgIAorICAgaWYgKCAhSVNfV0laQVJEKGdldGV1aWQodGhpc19vYmplY3QoKSkpICkKKyAgICAgIGNhbGxfb3V0KCAicmVtb3ZlIiwgMCApOworICAgCisgICBpZiAoICFjbG9uZXAodGhpc19vYmplY3QoKSkgKQorICAgICAgcmV0dXJuOworICAgCisgICB0aGluZzo6Y3JlYXRlKCk7CisgICBTZXRQcm9wKCBQX1NIT1JULCAiRWluIFZlcnRyYWciICk7CisgICBTZXRQcm9wKCBQX0xPTkcsICJAQHVudGVyc2NocmllYmVuQEAiICk7CisgICBTZXRQcm9wKCBQX05BTUUsICJWZXJ0cmFnIiApOworICAgU2V0KFBfUkVBRF9NU0csICMndGV4dCwgRl9RVUVSWV9NRVRIT0QpOyAKKyAgIFNldFByb3AoIFBfR0VOREVSLCBNQUxFICk7CisgICBTZXRQcm9wKCBQX0FSVElDTEUsIDEgKTsKKyAgIEFkZElkKCJ2ZXJ0cmFnIik7CisgICBTZXRQcm9wKFBfTkVWRVJEUk9QLCAxKTsKKyAgIEFkZENtZCgoeyJ1bnRlcnNjaHJlaWJlIiwidW50ZXJzY2hyZWliIiwidW50ZXJ6ZWljaG5lIn0pLCJ1bnRlcnNjaHJlaWJlIik7CisgICBBZGRDbWQoKHsiemVycmVpc3NlIiwgInplcnJlaXNzIn0pLCJ6ZXJyZWlzc2UiKTsKKyAgIAorICAgZ2VsZXNlbiA9IDA7CisgICB1bnRlcnNjaHJpZWJlbiA9ICIiOworfQorCitzdGF0aWMgc3RyaW5nIF9xdWVyeV9ub2Ryb3AoKQoreworICAgaWYgKHRoaXNfcGxheWVyKCkgJiYgSVNfV0laQVJEKHRoaXNfcGxheWVyKCkpKSByZXR1cm4gMDsKKyAgIHJldHVybiAiTmVpbiBOZWluISBEaWVzIGlzdCBkZWluIFZlcnRyYWchXG4iOworfQorCitzdGF0aWMgc3RyaW5nIHVudGVyc2NocmllYmVuKCkKK3sKKyAgIHN0cmluZyBzOworICAgCisgICBzID0gIkRpZXMgaXN0IERlaW4gTWFnaWVyLVZlcnRyYWcuIER1IHNvbGx0ZXN0IGlobiB2aWVsbGVpY2h0ICI7CisgICBpZiAoIGdlbGVzZW4gKQorICAgICAgcyArPSAibm9jaCI7CisgICBzICs9ICJtYWwgbGVzZW4uXG5FciB3dXJkZSBEaXIgdm9uICIgKyBjYXBpdGFsaXplKGdldGV1aWQodGhpc19vYmplY3QoKSkpCisgICAgICArIiB1ZWJlcnJlaWNodC5cbldlbm4gRHUgaWhuIHVudGVyc2NocmVpYnN0LCB3aXJzdCBEdSB2b24gIgorICAgICAgKyBjYXBpdGFsaXplKGdldGV1aWQodGhpc19vYmplY3QoKSkpICsgIiBnZXNwb25zb3J0LlxuIjsKKyAgIAorICAgaWYgKHRoaXNfcGxheWVyKCkgJiYgKHVudGVyc2NocmllYmVuID09IGdldHVpZCh0aGlzX3BsYXllcigpKSkgKQorICAgICAgcyArPSAiRHUgaGFzdCBpaG4gdW50ZXJzY2hyaWViZW4uXG4iOworICAgCisgICByZXR1cm4gczsKK30KKworCitzdGF0aWMgc3RyaW5nIHRleHQoKQoreworICAgZ2VsZXNlbiA9IDE7CisgICB0aGlzX3BsYXllcigpLT5Nb3JlKCIvZXRjL1dJWlJVTEVTIiwxKTsKKyAgIHJldHVybiAiIjsKK30KKworCitzdGF0aWMgaW50IHVudGVyc2NocmVpYmUoIHN0cmluZyBzdHIgKQoreworICAgbm90aWZ5X2ZhaWwoIldhcyB3aWxsc3QgRHUgZGVubiB1bnRlcnNjaHJlaWJlbj9cbiIpOworICAgaWYgKCAhaWQoc3RyKSApCisgICAgICByZXR1cm4gMDsKKyAgIAorICAgaWYgKCAhdGhpc19wbGF5ZXIoKSB8fCB0aGlzX3BsYXllcigpICE9IHRoaXNfaW50ZXJhY3RpdmUoKQorICAgICAgICB8fCB0aGlzX3BsYXllcigpICE9IGVudmlyb25tZW50KCkgKQorICAgICAgcmV0dXJuIDA7CisgICAKKyAgIGlmICggIWdlbGVzZW4gKXsKKyAgICAgIHdyaXRlKCAiRHUgaGFzdCBpaG4gbm9jaCBuaWNodCBnZWxlc2VuLiBFUlNUIGxlc2VuLCBEQU5OIHNjaHJlaWJlbiFcbiIpOworICAgICAgcmV0dXJuIDE7CisgICB9CisgICAKKyAgIHdyaXRlKCAiRHUgdW50ZXJzY2hyZWlic3QgZGVuIFZlcnRyYWcuIFdlbm4gZGFzIGVpbiBWZXJzZWhlbiB3YXIsICIKKyAgICAgICAgICArICJ6ZXJyZWlzcyBpaG4gc29mb3J0LlxuIiApOworICAgdW50ZXJzY2hyaWViZW4gPSBnZXR1aWQoIHRoaXNfaW50ZXJhY3RpdmUoKSApOworICAgU2V0UHJvcCggUF9OT0RST1AsICJOZWluLCBkZXIgaXN0IHVudGVyc2NocmllYmVuLiBEdSBrYW5uc3QgaWhuIGhvZWNoc3RlbnMiCisgICAgICAgICAgICArICIgemVycmVpc3Nlbi5cbiIgKTsKKyAgIFNldFByb3AoIFBfTkVWRVJEUk9QLCAxICk7CisgICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IHplcnJlaXNzZSggc3RyaW5nIHN0ciApCit7CisgICBub3RpZnlfZmFpbCgiV2FzIHdpbGxzdCBEdSBkZW5uIHplcnJlaXNzZW4/XG4iKTsKKyAgIGlmICggIWlkKHN0cikgKSByZXR1cm4gMDsKKyAgIHdyaXRlKCAiRHUgemVycmVpc3N0IGRlbiBWZXJ0cmFnLlxuIiApOworICAgcmV0dXJuIHJlbW92ZSgpOworfQorCisKK3B1YmxpYyBpbnQgaXNfdW50ZXJzY2hyaWViZW4oKQoreworICAgcmV0dXJuIGVudmlyb25tZW50KCkgJiYgcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShlbnZpcm9ubWVudCgpKQorICAgICAgJiYgZ2V0dWlkKGVudmlyb25tZW50KCkpID09IHVudGVyc2NocmllYmVuOworfQorCmRpZmYgLS1naXQgYS9vYmovdmlydHVhbC92X3Jvb20uYyBiL29iai92aXJ0dWFsL3Zfcm9vbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YzI4ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdmlydHVhbC92X3Jvb20uYwpAQCAtMCwwICsxLDEyIEBACitpbmhlcml0ICIvc3RkL3Jvb20iOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKworY3JlYXRlKCkKK3sKKyAgICAgICAgaWYoSVNfQkxVRSh0aGlzX29iamVjdCgpKSkgcmV0dXJuOworICAgICAgICA6OmNyZWF0ZSgpOworICAgICAgICBwcmV2aW91c19vYmplY3QoKS0+Q3VzdG9taXplT2JqZWN0KCk7CisgICAgICAgIGNhbGxfb3V0KHN5bWJvbF9mdW5jdGlvbigiUXVlcnlPYmplY3QiLCBmaW5kX29iamVjdChPQkpFQ1REKSksIDIpOworfQpkaWZmIC0tZ2l0IGEvb2JqL3ZpcnR1YWwvdnJfY29tcGlsZXIuYyBiL29iai92aXJ0dWFsL3ZyX2NvbXBpbGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBlNGJkMAotLS0gL2Rldi9udWxsCisrKyBiL29iai92aXJ0dWFsL3ZyX2NvbXBpbGVyLmMKQEAgLTAsMCArMSw4MSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIFZSX0NPTVBJTEVSLkMgLS0gdmlydHVhbCByb29tIGNvbXBpbGVyCisvLworLy8gJERhdGU6IDIwMDIvMDgvMjggMDk6NTc6MTggJAorLy8gJFJldmlzaW9uOiA2NjA1ICQKKy8qICRMb2c6IHZyX2NvbXBpbGVyLmMsdiAkCisgKiBSZXZpc2lvbiAxLjMgIDIwMDIvMDgvMjggMDk6NTc6MTggIFJpa3VzCisgKiBhdWYgc3Ryb25nX3R5cGVzIHVtZ2VzdGVsbHQKKyAqCisgKiBSZXZpc2lvbiAxLjIgIDE5OTQvMDcvMjcgMTQ6NDg6MTggIEpvZgorICogc3VpZAorICoKKyAqIFJldmlzaW9uIDEuMSAgMTk5NC8wMi8wMSAgMTk6NDc6NTcgIEhhdGUKKyAqIEluaXRpYWwgcmV2aXNpb24KKyAqCisqLworCisvLyBwcmluY2lwbGU6CisvLyAJLSBpbmhlcml0IHRoaXMgb2JqZWN0IGludG8geW91ciBvd24gJ3ZpcnR1YWxfY29tcGlsZXIuYycKKy8vICAtIGN1c3RvbWl6ZSBWYWxpZGF0ZSgpIGFuZCBDdXN0b21pemVPYmplY3QoKSBmb3IgeW91IG93biBzYWtlCisvLyAgCisvLyAgKiBWYWxpZGF0ZSgpIGNoZWNrcyBpZiBhIHJvb20gZmlsZW5hbWUgZ2l2ZW4gYXMgYXJndW1lbnQgKHdpdGhvdXQgcGF0aCkKKy8vICAgIGlzIHZhbGlkIGFuZCByZXR1cm5zIHRoaXMgZmlsZW5hbWUgd2l0aCBzdHJpcHBlZCAnLmMnISEKKy8vICAqIEN1c3RvbWl6ZU9iamVjdCgpIHVzZXMgdGhlIHByZXZpb3VzX29iamVjdCgpLT5GdW5jdGlvbigpIHN0cmF0ZWd5IHRvCisvLyAgICBjdXN0b21pemUgdGhlIHN0YW5kYXJkIG9iamVjdCAoZm9yIGV4YW1wbGUgdG8gc2V0IGEgZGVzY3JpcHRpb24pCisvLworLy8gUHJvcGVydGllczogUF9WQUxJRF9OQU1FLCBQX01JTl9YLCBQX01BWF9YLCBQX01JTl9ZLCBQX01BWF9ZCisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisKK2luaGVyaXQgIi9zdGQvdmlydHVhbC92X2NvbXBpbGVyIjsKKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKworI2luY2x1ZGUgPHRoaW5nL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8dl9jb21waWxlci5oPgorI2luY2x1ZGUgIi9vYmovdmlydHVhbC92cl9jb21waWxlci5oIgorI2luY2x1ZGUgPHN5c19kZWJ1Zy5oPgorCit2b2lkIGNyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7CisJU2V0UHJvcChQX1ZBTElEX05BTUUsICJyYXVtIik7CisJc2V0ZXVpZChnZXR1aWQoKSk7Cit9CisKK3N0cmluZyBWYWxpZGF0ZShzdHJpbmcgZmlsZSkKK3sKKwlpbnQgeCx5OworCXN0cmluZyBwYXRoLCBuYW1lOworCisgIGZpbGUgPSA6OlZhbGlkYXRlKGZpbGUpOworCWlmKChzc2NhbmYoZmlsZSwgIiVzWyVkLCVkXSIsIG5hbWUsIHgsIHkpID09IDMpICYmCisJCQluYW1lID09IFF1ZXJ5UHJvcChQX1ZBTElEX05BTUUpICYmCisJCSAgKHggPj0gUXVlcnlQcm9wKFBfTUlOX1gpICYmIHggPD0gUXVlcnlQcm9wKFBfTUFYX1gpKSAmJgorCQkgICh5ID49IFF1ZXJ5UHJvcChQX01JTl9ZKSAmJiB5IDw9IFF1ZXJ5UHJvcChQX01BWF9ZKSkKKwkJKQorCQlyZXR1cm4gZmlsZTsKK30KKworbWl4ZWQgQ3VzdG9taXplT2JqZWN0KCkKK3sKKwlzdHJpbmcgcGF0aCwgZmlsZSwgbmFtZTsKKwlpbnQgeCx5OworCisJaWYoIShmaWxlID0gOjpDdXN0b21pemVPYmplY3QoKSkpIHJldHVybiAwOworCisJcGF0aCA9IFF1ZXJ5UHJvcChQX0NPTVBJTEVSX1BBVEgpOworCXNzY2FuZihmaWxlLCAiJXNbJWQsJWRdIiwgbmFtZSwgeCwgeSk7CisJbmFtZSA9IFF1ZXJ5UHJvcChQX1ZBTElEX05BTUUpOworCWlmKHkgPCBRdWVyeVByb3AoUF9NQVhfWSkpCisJCXByZXZpb3VzX29iamVjdCgpLT5BZGRFeGl0KCJub3JkZW4iLCBwYXRoKyIvIituYW1lKyJbIisoeCAgKSsiLCIrKHkrMSkrIl0iKTsKKwlpZih5ID4gUXVlcnlQcm9wKFBfTUlOX1kpKQorCQlwcmV2aW91c19vYmplY3QoKS0+QWRkRXhpdCgic3VlZGVuIiwgcGF0aCsiLyIrbmFtZSsiWyIrKHggICkrIiwiKyh5LTEpKyJdIik7CisJaWYoeCA8IFF1ZXJ5UHJvcChQX01BWF9YKSkKKwkJcHJldmlvdXNfb2JqZWN0KCktPkFkZEV4aXQoIm9zdGVuIiAsIHBhdGgrIi8iK25hbWUrIlsiKyh4KzEpKyIsIisoeSAgKSsiXSIpOworCWlmKHggPiBRdWVyeVByb3AoUF9NSU5fWCkpCisJCXByZXZpb3VzX29iamVjdCgpLT5BZGRFeGl0KCJ3ZXN0ZW4iLCBwYXRoKyIvIituYW1lKyJbIisoeC0xKSsiLCIrKHkgICkrIl0iKTsKK30KZGlmZiAtLWdpdCBhL29iai92aXJ0dWFsL3ZyX2NvbXBpbGVyLmggYi9vYmovdmlydHVhbC92cl9jb21waWxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiN2E5NDAKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdmlydHVhbC92cl9jb21waWxlci5oCkBAIC0wLDAgKzEsMzMgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBWX0NPTVBJTEVSLkggLS0gYSBnZW5lcmFsIHZpcnR1YWwgY29tcGlsZXIgb2JqZWN0CisvLworLy8gJERhdGU6IDE5OTQvMDIvMDEgMTk6NDc6NTcgJAorLy8gJFJldmlzaW9uOiA2MDgxICQKKy8qICRMb2c6IHZyX2NvbXBpbGVyLmgsdiAkCisgKiBSZXZpc2lvbiAxLjEgIDE5OTQvMDIvMDEgIDE5OjQ3OjU3ICBIYXRlCisgKiBJbml0aWFsIHJldmlzaW9uCisgKgorKi8KKworI2luY2x1ZGUgPHZfY29tcGlsZXIuaD4KKworI2lmbmRlZiBfX1ZSX0NPTVBJTEVSX0hfXworI2RlZmluZSBfX1ZSX0NPTVBJTEVSX0hfXworCisjZGVmaW5lIFBfVkFMSURfTkFNRQkidmFsaWRfbmFtZSIKKyNkZWZpbmUgUF9NSU5fWAkJCQkibWluX3giCisjZGVmaW5lIFBfTUFYX1gJCQkJIm1heF94IgorI2RlZmluZSBQX01JTl9ZCQkJCSJtaW5feSIKKyNkZWZpbmUgUF9NQVhfWQkJCQkibWF4X3kiCisKKyNlbmRpZiAvLyBfX1ZfQ09NUElMRVJfSF9fCisKKyNpZmRlZiBORUVEX1BST1RPVFlQRVMKKworI2lmbmRlZiBfX1ZSX0NPTVBJTEVSX0hfUFJPVE9fXworI2RlZmluZSBfX1ZSX0NPTVBJTEVSX0hfUFJPVE9fXworCisjZW5kaWYgLy8gX19WUl9DT01QSUxFUl9IX1BST1RPX18KKworI2VuZGlmIC8vTkVFRF9QUk9UT1RZUEVTCmRpZmYgLS1naXQgYS9vYmovd2FuZGVyZXIuYyBiL29iai93YW5kZXJlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMjAwOTIKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovd2FuZGVyZXIuYwpAQCAtMCwwICsxLDExMyBAQAorI3ByYWdtYSBzdHJvbmdfdHlwZXMsIHNhdmVfdHlwZXMsIHJ0dF9jaGVja3MKKyNwcmFnbWEgbm9fY2xvbmUsIG5vX2luaGVyaXQsIG5vX3NoYWRvdworCitpbmhlcml0ICJzdGQvbnBjIjsKKworI2RlZmluZSBERUxBWSA2MAorI2RlZmluZSBNQVhXQVkgMzAKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgIi9zZWN1cmUvcXVlc3RtYXN0ZXIuaCIKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX05BTUUsIldhbmRlcmVyIik7CisgIHNldF9saXZpbmdfbmFtZSgib3Jha2VsIik7CisgIFNldFByb3AoUF9HRU5ERVIsIE1BTEUpOworICBTZXRQcm9wKFBfU0hPUlQsIkVpbiBhbHRlciBXYW5kZXJlciIpOworICBTZXRQcm9wKFBfTE9ORywKKyAgIkVpbiB1cmFsdGVyIFdhbmRlcmVyIG1pdCBlaW5lbSBsYW5nZW4gSGlydGVubWFudGVsIHVuZCBlaW5lbSBIaXJ0ZW5zdGFiLlxuIik7CisgIEFkZElkKCh7IndhbmRlcmVyIiwiaGlydGUiLCJvcmFrZWwifSkpOworCWNyZWF0ZV9kZWZhdWx0X25wYyggMTkgKTsKKyAgU2V0UHJvcChQX01BWF9IUCwgNTAwMCk7CisgIFNldFByb3AoUF9IUCwgNTAwMCk7CisgIFNldFByb3AoUF9HRU5ERVIsTUFMRSk7CisgIFNldFByb3AoUF9BTElHTiwgMTAwMCk7CisgIFNldFByb3AoUF9YUCwgMTAwMCk7CisgIFNldFByb3AoUF9IQU5EUywgKHsiIG1pdCBzZWluZW0gSGlydGVuc3RhYiIsIDUwLCAoe0RUX0JMVURHRU9OfSl9KSApOworICBTZXRQcm9wKFBfTk9fQVRUQUNLLCAxKTsKKyAgU2V0UHJvcChQX1JFSkVDVCwgKHsgUkVKRUNUX0dJVkUsIE5hbWUoV0VSKSArICIgc2FndDogRGFua2UsIGFiZXIgZGFzICIKKwkJCSAgImJyYXVjaGUgaWNoIG5pY2h0LlxuIiB9KSApOworICBjYWxsX291dCgibGF1ZiIsIERFTEFZKTsKKyAgLy8gU29sbHRlIGVpZ2VudGxpY2ggdWViZXIgZGFzIGBpbmZvJy1TeXN0ZW0gbGF1ZmVuIDsoCisgIEFkZENtZCggKHsiZnJhZyIsImZyYWdlIn0pLCAiZnJhZyIgKTsKK30KKworc3RhdGljIGludCBmcmFnKG1peGVkIHN0cikKK3sKKyAgaW50IGksaixnZXJlZGV0OworICBtaXhlZCAqcXVlc3RzOworICBtaXhlZCB0bXA7CisgIAorICBpZiAoIXN0cikgcmV0dXJuIDA7CisgIHN0ciA9IHRoaXNfcGxheWVyKCktPl91bnBhcnNlZF9hcmdzKDEpOworICBzdHIgPSBvbGRfZXhwbG9kZShzdHIsIiAiKTsKKyAgaWYgKCAhc2l6ZW9mKHN0cikgKSByZXR1cm4gMDsKKyAgaWYgKCAhaWQoc3RyWzBdKSApIHJldHVybiAwOworICBpZiAoc2l6ZW9mKHN0cik8MyB8fCAoc3RyWzFdIT0ibmFjaCIgJiYgc3RyWzFdIT0idWViZXIiKSkKKyAgeworICAgIHRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksIkRlciBXYW5kZXJlciBzYWd0OiBJY2ggdmVyc3RlaCBkaWNoIG5pY2h0LlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgZ2VyZWRldD0wOworICBzdHI9aW1wbG9kZShzdHJbMi4uXSwiICIpOworICBxdWVzdHM9UU0tPlF1ZXJ5UXVlc3RzKCk7CisgIGlmIChzdHI9PSJhdWZnYWJlIiB8fCBzdHI9PSJhdWZnYWJlbiIgfHwgc3RyPT0iYWJlbnRldWVyIiB8fCBzdHI9PSJxdWVzdHMiCisgICAgICB8fCBzdHIgPT0gInF1ZXN0IikKKyAgeworICAgIHRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksIkRlciBXYW5kZXJlciBzYWd0OiBGb2xnZW5kZSBBdWZnYWJlbiBnaWJ0ICIKKyAgICAgICAgImVzIGhpZXI6XG4iKTsKKyAgICBxdWVzdHNbMF0gPSBzb3J0X2FycmF5KHF1ZXN0c1swXSwgIyc+KTsKKyAgICBmb3IgKGk9MDtpPHNpemVvZihxdWVzdHNbMF0pO2krKykKKyAgICB7CisgICAgICB0ZWxsX29iamVjdCh0aGlzX3BsYXllcigpLHF1ZXN0c1swXVtpXSk7CisgICAgICBpZiAodGhpc19pbnRlcmFjdGl2ZSgpLT5RdWVyeVF1ZXN0KHF1ZXN0c1swXVtpXSkpCisgICAgICAgIHRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksIiBbaGFzdCBEdSBzY2hvbiBnZWxvZXN0XSIpOworICAgICAgdGVsbF9vYmplY3QodGhpc19wbGF5ZXIoKSwiXG4iKTsKKyAgICB9CisgICAgcmV0dXJuIDE7CisgIH0KKyAgZm9yIChpPTA7aTxzaXplb2YocXVlc3RzWzBdKTtpKyspCisgIHsKKyAgICBpZiAobWVtYmVyKG9sZF9leHBsb2RlKGxvd2VyX2Nhc2UocXVlc3RzWzBdW2ldKSwiICIpLHN0cik+PTAKKwkgICAgICB8fCBzdHJzdHIobG93ZXJfY2FzZShxdWVzdHNbMF1baV0pLCBzdHIpPj0wKQorICAgIHsKKyAgICAgIHRtcD1xdWVzdHNbMF1baV0rIj8gRGF6dSBrYW5uIGljaCBEaXIgZm9sZ2VuZGVzIHNhZ2VuOiAiOworICAgICAgdG1wKz1xdWVzdHNbMV1baV1bM107CisgICAgICB0bXA9b2xkX2V4cGxvZGUoYnJlYWtfc3RyaW5nKHRtcCw2MCksIlxuIik7CisgICAgICBnZXJlZGV0PTE7CisgICAgICBmb3IgKGo9MDtqPHNpemVvZih0bXApO2orKykKKyAgICAgICAgdGVsbF9vYmplY3QodGhpc19wbGF5ZXIoKSwiRGVyIFdhbmRlcmVyIHNhZ3Q6ICIrdG1wW2pdKyJcbiIpOworICAgIH0KKyAgfQorICBpZiAoIWdlcmVkZXQpIAorICAgIHRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksIkRlciBXYW5kZXJlciBzYWd0OiAiK2NhcGl0YWxpemUoc3RyKSsKKyAgICAgICI/IEludGVyZXNzaWVydCBtaWNoIG5pY2h0IVxuIik7CisgIHJldHVybiAxOworfQorCit2b2lkIGxhdWYoKQoreworICBpbnQgaSwgb2s7CisgCisgIC8vIHdlbm4ga2VpbmUgRW52aXJvbm1lbnQsIGRhbm4gbGFldWZ0IGRhcyBEaW5nIGVpbmZhY2ggbmljaHQuCisgIGlmICggIW9iamVjdHAoZW52aXJvbm1lbnQoKSkgKQorICAgIHJldHVybjsKKworICBtYXBwaW5nIGxpc3RlID0gZW52aXJvbm1lbnQoKS0+UXVlcnlQcm9wKFBfRVhJVFMpOworICBzdHJpbmcgKmRpcnMgPSBtX2luZGljZXMobGlzdGUpOworICBzdHJpbmcgKmRpcnMyID0gKHsgfSk7CisgIGZvciAoaT0wO2k8c2l6ZW9mKGxpc3RlKTtpKyspCisgICAgaWYgKCFjYXRjaChvaz1saXN0ZVtkaXJzW2ldXS0+UXVlcnlQcm9wKFBfT1JBS0VMKSkgJiYgb2spIAorICAgICAgZGlyczIgKz0gKHsgZGlyc1tpXSB9KTsKKyAgCisgIGlmIChzaXplb2YoZGlyczIpKQorICB7CisgICAgaT1yYW5kb20oc2l6ZW9mKGRpcnMyKSk7CisgICAgY29tbWFuZF9tZShkaXJzMltpXSk7CisgIH0KKyAgY2FsbF9vdXQoImxhdWYiLERFTEFZKTsKK30KZGlmZiAtLWdpdCBhL29iai93ZXJsaXN0ZS5jIGIvb2JqL3dlcmxpc3RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI1MDQzZAotLS0gL2Rldi9udWxsCisrKyBiL29iai93ZXJsaXN0ZS5jCkBAIC0wLDAgKzEsMzUxIEBACisjcHJhZ21hIHN0cm9uZ190eXBlcworCitpbmhlcml0ICIvc3RkL3VzZXJfZmlsdGVyIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxhbnNpLmg+CisjaW5jbHVkZSA8d2VybGlzdGUuaD4KKworbWl4ZWQgKmVyd2FydGU7CisKKyNkZWZpbmUgTUlOKGEsYikgICAgKCgoYSkgPiAoYikpID8gKGIpIDogKGEpKQorI2RlZmluZSBBQlMoYSkgICAgICAoKChhKSA8IDApID8gLShhKSA6IChhKSkKKworCisvLyBhbHMgRnVua3Rpb24gc3RhdHQgYWxzIGRlZmluZSwgZGEgYWxzIGxmdW4tQ2xvc3VyZSBnZW51dHp0Citwcml2YXRlIGludCBpc19hbHBoX2dyZWF0ZXIoIG9iamVjdCBhLCBvYmplY3QgYiApCit7CisgICAgcmV0dXJuIGdldGV1aWQoYSkgPiBnZXRldWlkKGIpOworfQorCisKKy8vIGtlaW5lIEFobnVuZywgd2VyIHNpY2ggX2RpZV8gQmVyZWNobnVuZ3NncnVuZGxhZ2UgYXVzZ2VkYWNodCBoYXQuCisvLyBBYmVyIGRhIHNpZSBzY2hvbiB1cmFsdCBpc3QsIGJsZWlidCBzaWUgYXVjaCBkcmluIDstKQorcHJpdmF0ZSBpbnQgaXNfZ3JlYXRlciggb2JqZWN0IGEsIG9iamVjdCBiICkKK3sKKyAgICBpbnQgYTEsIGIxOworICAgIAorICAgIGExID0gMjYwMDAgKiBxdWVyeV93aXpfbGV2ZWwoYSkgKworICAgICAgICAyNiAqIE1JTiggMjEyMSwgQUJTKGEtPlF1ZXJ5UHJvcChQX0xFVkVMKSkgKSArIGdldHVpZChhKVswXS0nYSc7CisgICAgCisgICAgYjEgPSAyNjAwMCAqIHF1ZXJ5X3dpel9sZXZlbChiKSArCisgICAgICAgIDI2ICogTUlOKCAyMTIxLCBBQlMoYi0+UXVlcnlQcm9wKFBfTEVWRUwpKSApICsgZ2V0dWlkKGIpWzBdLSdhJzsKKyAgICAKKyAgICByZXR1cm4gYTEgPiBiMTsKK30KKworCitwcml2YXRlIHN0cmluZyBzdGF0KCBvYmplY3Qgb2IsIGludCBpc3RfbWFnaWVyICkKK3sKKyAgICBpbnQgbDsKKyAgCisgICAgbCA9IHF1ZXJ5X3dpel9sZXZlbChvYik7CisgICAgCisgICAgaWYgKCBvYi0+UXVlcnkoUF9URVNUUExBWUVSKSApeworICAgICAgICBpZiAoIGwgPCBTRUVSX0xWTCApCisgICAgICAgICAgICByZXR1cm4gInQiOworICAgICAgICBlbHNlIGlmICggbCA8IExFQVJORVJfTFZMICkKKyAgICAgICAgICAgIHJldHVybiAiVCI7CisgICAgfQorICAgIAorICAgIGlmICggb2ItPlF1ZXJ5KFBfU0VDT05EKSkgeworICAgICAgaWYgKG9iLT5RdWVyeShQX1NFQ09ORF9NQVJLKSA+IC0xICl7CisgICAgICAgIGlmICggbCA8IFNFRVJfTFZMICkKKyAgICAgICAgICAgIHJldHVybiAieiI7CisgICAgICAgIGVsc2UgaWYgKCBsIDwgTEVBUk5FUl9MVkwgKQorICAgICAgICAgICAgcmV0dXJuICJaIjsKKyAgICAgIH0gZWxzZQorICAgICAgaWYgKGlzdF9tYWdpZXIpIHsKKyAgICAgICAgaWYgKCBsIDwgU0VFUl9MVkwgKQorICAgICAgICAgICAgcmV0dXJuICJuIjsKKyAgICAgICAgZWxzZSBpZiAoIGwgPCBMRUFSTkVSX0xWTCApCisgICAgICAgICAgICByZXR1cm4gIk4iOworICAgICAgfQorICAgIH0KKworICAgIHN3aXRjaChsKXsKKyAgICBjYXNlIEdPRF9MVkwgLi4gNjY2OgorICAgICAgICByZXR1cm4gIkciOworICAgIGNhc2UgQVJDSF9MVkwgLi4gR09EX0xWTC0xOgorICAgICAgICByZXR1cm4gIkUiOworICAgIGNhc2UgRUxERVJfTFZMIC4uIEFSQ0hfTFZMLTE6CisgICAgICAgIHJldHVybiAiVyI7CisgICAgY2FzZSBMT1JEX0xWTCAuLiBFTERFUl9MVkwtMToKKyAgICAgICAgcmV0dXJuICJSIjsKKyAgICBjYXNlIFNQRUNJQUxfTFZMIC4uIExPUkRfTFZMLTE6CisgICAgICAgIHJldHVybiAiSCI7CisgICAgY2FzZSBET01BSU5NRU1CRVJfTFZMIC4uIFNQRUNJQUxfTFZMLTE6CisgICAgICAgIHJldHVybiAiTSI7CisgICAgY2FzZSBXSVpBUkRfTFZMKzEgLi4gRE9NQUlOTUVNQkVSX0xWTC0xOgorICAgICAgICByZXR1cm4gIm0iOworICAgIGNhc2UgTEVBUk5FUl9MVkwgLi4gV0laQVJEX0xWTDoKKyAgICAgICAgcmV0dXJuICJMIjsKKyAgICBjYXNlIFNFRVJfTFZMIC4uIExFQVJORVJfTFZMLTE6CisgICAgICAgIHJldHVybiAiUyI7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuICJzIjsKKyAgICB9CisgICAgcmV0dXJuICJzIjsKK30KKworCitwcml2YXRlIHN0cmluZyBpZGxlc3RhdCggb2JqZWN0IG9iICkKK3sKKyAgICBzd2l0Y2goIHF1ZXJ5X2lkbGUob2IpICl7CisgICAgY2FzZSAxODAwIC4uIDcxOTk6CisgICAgICAgIHJldHVybiAiaiI7CisgICAgY2FzZSA2MDAgLi4gMTc5OToKKyAgICAgICAgcmV0dXJuICJJIjsKKyAgICBjYXNlIDEyMCAuLiA1OTk6CisgICAgICAgIHJldHVybiAiaSI7CisgICAgY2FzZSAwIC4uIDExOToKKyAgICAgICAgcmV0dXJuICIuIjsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gIkoiOworICAgIH0KKyAgICByZXR1cm4gIi4iOworfQorCisKK3ByaXZhdGUgc3RyaW5nIHdlZ3N0YXQoIG9iamVjdCBvYiApCit7CisgICAgaWYgKCBvYi0+UXVlcnlQcm9wKFBfQVdBWSkgKQorICAgICAgICByZXR1cm4gInciOworICAgIAorICAgIHJldHVybiAiLiI7Cit9CisKKworcHJpdmF0ZSBzdHJpbmcgaGNzdGF0KCBvYmplY3Qgb2IgKQoreworICAgIGludCBoY3N0YXQ7CisgICAgCisgICAgaGNzdGF0PW9iLT5xdWVyeV9oY19wbGF5KCk7CisgICAgCisgICAgaWYoIWhjc3RhdCkKKyAgICB7CisgICAgICByZXR1cm4gIi4iOworICAgIH0KKyAgICAKKyAgICBpZihoY3N0YXQ+MSkKKyAgICAgICAgcmV0dXJuICIrIjsKKyAgICAKKyAgICByZXR1cm4gImMiOworCit9CisKKworcHJpdmF0ZSBzdHJpbmcgZ2V0X2xvY2F0aW9uKCBvYmplY3Qgb2IgKQoreworICAgIHN0cmluZyByZXM7CisKKyAgICBpZiAoIHN0cmluZ3AocmVzID0gb2ItPlF1ZXJ5KFBfTE9DQVRJT04pKSApCisgICAgICAgIHJlcyA9IGNhcGl0YWxpemUocmVzKSArICIgKHVlYmVyICIgKyBjb3VudHJ5KG9iKSArICIpIjsKKyAgICBlbHNlCisgICAgICAgIHJlcyA9IGNvdW50cnkob2IpOworCisgICAgcmV0dXJuIHJlczsKK30KKworCit2YXJhcmdzIHByaXZhdGUgbWl4ZWQKK1F1ZXJ5Vmlldyggb2JqZWN0IG9iLCBpbnQgaXN0X21hZ2llciwgaW50IHNoLAorICAgICAgICAgICBpbnQgb2JzLCBzdHJpbmcgdHR5LCBzdHJpbmcgb3B0ICkKK3sKKyAgICBzdHJpbmcgcmFjZSwgcmV0LCB0bXAsIHByZWZpeCwgYV9wcmVmaXgsIG5vcm1hbDsKKworICAgIGlmICggIWlzdF9tYWdpZXIgJiYgb2ItPlF1ZXJ5UHJvcChQX0lOVklTKSApCisgICAgICAgIHJldHVybiAiIjsKKyAgICAKKyAgICBwcmVmaXggPSAiIjsKKyAgICBhX3ByZWZpeCA9ICIiOworICAgICAgICAKKyAgICByZXQgPSBjYXBpdGFsaXplKGdldHVpZChvYikpOworICAgIAorICAgIHN3aXRjaCh0dHkpeworICAgIGNhc2UgImFuc2kiOgorICAgICAgICBpZiAoIElTX0xFQVJORVIob2IpICkKKyAgICAgICAgICAgIGFfcHJlZml4ID0gQU5TSV9VTkRFUkw7CisgICAgICAgIAorICAgICAgICBpZiAoIG9iLT5RdWVyeVByb3AoUF9GUk9HKSApCisgICAgICAgICAgICBhX3ByZWZpeCArPSBBTlNJX0dSRUVOOworCisgICAgICAgIGlmICggcG9pbnRlcnAoZXJ3YXJ0ZSkgJiYgbWVtYmVyKCBlcndhcnRlLCByZXQgKSAhPSAtMSApCisgICAgICAgICAgICBhX3ByZWZpeCArPSBBTlNJX1JFRDsKKyAgICAgICAgCisgICAgICAgIG5vcm1hbCA9IEFOU0lfTk9STUFMOworICAgICAgICBicmVhazsKKyAgICAgICAgCisgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKCBwb2ludGVycChlcndhcnRlKSAmJiBtZW1iZXIoIGVyd2FydGUsIHJldCApICE9IC0xICkKKyAgICAgICAgICAgIHByZWZpeCA9ICIqIjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJlZml4ID0gIiI7CisKKyAgICAgICAgbm9ybWFsID0gIiI7CisgICAgfQorCisgICAgaWYgKCByZXQgPT0gUk9PVElEICkKKyAgICAgICAgcmV0ID0gIkxvZ29uIjsKKworICAgIGlmICggc2ggKXsgLy8ga3dlcgorICAgICAgICBpZiAoIG9iLT5RdWVyeVByb3AoUF9JTlZJUykgKQorICAgICAgICAgICAgcmV0ID0gc3ByaW50ZiggIiVzKCUtMTEnLidzKS4lcyVzIiwgYV9wcmVmaXgsIHByZWZpeCArIHJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBoY3N0YXQob2IpICsgaWRsZXN0YXQob2IpICsgd2Vnc3RhdChvYikgKyBzdGF0KG9iLGlzdF9tYWdpZXIpLCBub3JtYWwgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0ID0gc3ByaW50ZiggIiVzJS0xMycuJ3MuJXMlcyIsIGFfcHJlZml4LCBwcmVmaXggKyByZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaGNzdGF0KG9iKSArIGlkbGVzdGF0KG9iKSArIHdlZ3N0YXQob2IpICsgc3RhdChvYixpc3RfbWFnaWVyKSwgbm9ybWFsICk7CisgICAgfSAKKyAgICBlbHNlIGlmICggb3B0ID09ICJrIiApeyAvLyB3ZXIgLWsKKyAgICAgICAgcmV0ID0gc3ByaW50ZiggIlslc10gJS0xM3MgJTE1cyAvICUtMjBzICUyMnMiLCBzdGF0KG9iLGlzdF9tYWdpZXIpLAorICAgICAgICAgICAgICAgICAgICAgICBvYi0+UXVlcnlQcm9wKFBfSU5WSVMpID8gIigiICsgcmV0ICsgIikiIDogcmV0LAorICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdwKHJhY2UgPSBvYi0+UXVlcnlQcm9wKFBfUkFDRSkpID8KKyAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShyYWNlKVswLi4xNF0gOiAiPGtlaW5lIFJhc3NlPiIsCisgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3AocmFjZSA9IG9iLT5RdWVyeVByb3AoUF9HVUlMRCkpID8KKyAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShyYWNlKVswLi4xOV0gOiAiPGtlaW5lIEdpbGRlPiIsCisgICAgICAgICAgICAgICAgICAgICAgICJbIiArIGNvdW50cnkob2IpWzAuLjE5XSArICJdIiApOworICAgIH0gCisgICAgZWxzZSB7IC8vIHdlciwgd2VyIC1vLCB3ZXIgLXMKKyAgICAgICAgaWYgKCB0bXAgPSBvYi0+c2hvcnQoKSApeworICAgICAgICAgICAgcmV0ID0gdG1wWzAuLjwzXTsKKworICAgICAgICAgICAgaWYgKCBvYi0+UXVlcnlQcm9wKFBfVEVBTSkgKQorICAgICAgICAgICAgICAgIHJldCA9IG9iLT5UZWFtUHJlZml4KCkgKyByZXQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0ID0gIigiICsgcmV0ICsgIikiOworCisgICAgICAgIGlmICggIUlTX0xFQVJORVIob2IpICYmIG9iLT5RdWVyeShQX1RFU1RQTEFZRVIpICkKKyAgICAgICAgICAgIHRtcCA9ICIgPFRlc3RTcGllbGVyPiI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRtcCA9ICIiOworCisgICAgICAgIGlmICggIUlTX0xFQVJORVIob2IpICYmIG9iLT5RdWVyeVByb3AoUF9TRUNPTkQpICYmCisgICAgICAgICAgICAgb2ItPlF1ZXJ5UHJvcChQX1NFQ09ORF9NQVJLKSA+IC0xICkKKyAgICAgICAgICAgIHRtcCArPSAiIDxad2VpdGllPiI7CisgICAgICAgIAorICAgICAgICByZXQgPSBzcHJpbnRmKCAiJXMlcyAtICVzJXMlcyIsCisgICAgICAgICAgICAgICAgICAgICAgIChvcHQgPT0gIm8iKSA/ICIiIDogIlsiICsgc3RhdChvYixpc3RfbWFnaWVyKSArICJdICIsIHJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5ncChyYWNlID0gb2ItPlF1ZXJ5UHJvcChQX1JBQ0UpKSA/CisgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUocmFjZSkgOiAiPGtlaW5lIFJhc3NlPiIsCisgICAgICAgICAgICAgICAgICAgICAgIChvcHQgPT0gInMiKSA/ICIgLSBbIiArIGdldF9sb2NhdGlvbihvYikgKyAiXSIgOgorICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5ncChyYWNlID0gb2ItPlF1ZXJ5UHJvcChQX0dVSUxEKSkgPworICAgICAgICAgICAgICAgICAgICAgICAgIi8iICsgY2FwaXRhbGl6ZShyYWNlKSA6ICIvPGtlaW5lIEdpbGRlPiIpLAorICAgICAgICAgICAgICAgICAgICAgICAob3B0ID09ICJvIikgPyB0bXAgOiAiIiApOworICAgIH0KKyAgICAgICAgICAgIAorICAgIGlmICggb2JzICkKKyAgICAgICAgcmV0dXJuICh7IG9iLCByZXQgfSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gcmV0OworfQorCisKK3ByaXZhdGUgb2JqZWN0ICptYWtlX3VuaXF1ZSggb2JqZWN0KiBhcnIgKQoreworICAgIGludCBpOworCisgICAgLy8gbXVzcyB1ZWJlciBlaW5lIFNjaGxlaWZlIGdlbWFjaHQgd2VyZGVuLCB1bSBkaWUgUmVpaGVuZm9sZ2UgenUgZXJoYWx0ZW4hCisgICAgZm9yICggaSA9IHNpemVvZihhcnIpOyBpLS0gPiAxOyApCisgICAgICAgIGlmKCBhcnJbaV0gPT0gYXJyW2ktMV0gKQorICAgICAgICAgICAgYXJyW2ldID0gMDsKKworICAgIHJldHVybiBhcnIgLSAoeyAwIH0pOworfQorCisKKyNkZWZpbmUgT0ZGU0VUKHNwKSAgKChtYXhpLzQpICogc3AgKyAoKHNwIDw9IG1heGklNCkgPyBzcCA6IG1heGklNCkpCisKKy8vIGRpZXNlIEZ1bmt0aW9uIHdpcmQgdm9uIGF1c3NlbiBhdWZnZXJ1ZmVuIGZ1ZXIgZGllIEJlZmVobGUgIndlciIgJiBDbworcHVibGljIHZhcmFyZ3Mgc3RyaW5nCisqUXVlcnlXaG9MaXN0ZSggaW50IGlzdF9tYWdpZXIsIGludCBzaG9ydCwgaW50IG9icywgc3RyaW5nIGFyZywgaW50IG9sZCApCit7CisgICAgb2JqZWN0ICpwbDsKKyAgICBzdHJpbmcgKnBscywgKnMsIG9wdDsKKyAgICBpbnQgaSwgaiwgaywgbCwgKnQsIG1heGk7CisKKyAgICBlcndhcnRlID0gMDsKKyAgICAKKyAgICBpZiAoIHNob3J0ICYgV0hPX1NIT1JUICl7CisgICAgICAgIGlmICggcHJldmlvdXNfb2JqZWN0KCkgKQorICAgICAgICAgICAgZXJ3YXJ0ZSA9IHByZXZpb3VzX29iamVjdCgpLT5RdWVyeVByb3AoUF9XQUlURk9SKTsKKyAgICAgICAgCisgICAgICAgIGlmICggIXBvaW50ZXJwKGVyd2FydGUpICkKKyAgICAgICAgICAgIGVyd2FydGUgPSAoe30pOworICAgIH0KKworICAgIC8vIFdlciBTcGllbGVyc2ljaHQgbW9lY2h0ZSwgc29sbCBTcGllbGVyc2ljaHQgYmVrb21tZW4KKyAgICBpZiAoIHNob3J0ICYgV0hPX1BMQVlFUl9WSUVXICkKKyAgICB7CSAgICAKKwkgICAgaXN0X21hZ2llciA9IDA7CisgICAgfQorCisgICAgCisgICAgaWYgKCBvbGQgKXsKKyAgICAgICAgb3B0ID0gIm8iOworICAgICAgICBhcmcgPSAwOworICAgIH0KKyAgICBlbHNlIGlmICggYXJnID09ICJrIiB8fCBhcmcgPT0gInMiICl7CisgICAgICAgIG9wdCA9IGFyZzsKKyAgICAgICAgYXJnID0gMDsKKyAgICB9CisgICAgZWxzZSBpZiAoIHNpemVvZihhcmcpID09IDEgKSAvLyAobm9jaCkgdW5iZWthbm50ZSBPcHRpb24KKyAgICAgICAgYXJnID0gMDsKKyAgCisgICAgcGwgPSBmaWx0ZXJfdXNlcnMoYXJnKTsKKyAgICAKKyAgICBpZiAoIHNob3J0ICYgV0hPX0FMUEhBICkKKyAgICAgICAgcGwgPSBzb3J0X2FycmF5KCBwbCwgIydpc19hbHBoX2dyZWF0ZXIvKicqLyApOworICAgIGVsc2UKKyAgICAgICAgcGwgPSBzb3J0X2FycmF5KCBwbCwgIydpc19ncmVhdGVyLyonKi8gKTsKKyAgICAKKyAgICBwbCA9IG1ha2VfdW5pcXVlKCBwbCApOworICAgIAorICAgIHBscyA9IG1hcCggcGwsICMnUXVlcnlWaWV3LyonKi8sIGlzdF9tYWdpZXIsIHNob3J0LCBvYnMsCisgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c19vYmplY3QoKS0+UXVlcnlQcm9wKFBfVFRZKSwgb3B0ICkgLSAoeyIifSk7CisgICAgCisgICAgaWYgKCAhKHNob3J0ICYgV0hPX1NIT1JUKSApCisgICAgICAgIHJldHVybiBwbHM7CisgICAgCisgICAgbWF4aSA9IHNpemVvZihwbHMpOworICAgIHMgPSBhbGxvY2F0ZSggbWF4aSAvIDQgKyAobWF4aSAlIDQgPyAxIDogMCkgKTsKKyAgICAKKyAgICBpZiAoIHNob3J0ICYgV0hPX1ZFUlRJQ0FMICkgeyAvLyBzZW5rcmVjaHQgc29ydGllcmVuICEKKyAgICAgICAgLy8gd2lyZCBzbyBudXIgZWlubWFsIGJlcmVjaG5ldAorICAgICAgICB0ID0gKHsgMCwgT0ZGU0VUKDEpLCBPRkZTRVQoMiksIE9GRlNFVCgzKSwgbWF4aSB9KTsKKyAgICAgICAgCisgICAgICAgIGZvciAoIGkgPSAwLCBsID0gc2l6ZW9mKHMpOyBpIDwgbDsgaSsrICkgeworICAgICAgICAgICAgc1tpXSA9ICIiOworICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgKCBqID0gMDsgaiA8IDQ7IGorKyApIHsKKyAgICAgICAgICAgICAgICBpZiAoIChrID0gaSt0W2pdKSA8IHRbaisxXSAmJiBwbHNba10gIT0gIiIgKQorICAgICAgICAgICAgICAgICAgICBzW2ldICs9IHBsc1trXTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiggaiA8IDMgKQorICAgICAgICAgICAgICAgICAgICBzW2ldICs9ICIgIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCBtYXhpOyBpKysgKSB7CisgICAgICAgICAgICBpZiAoICFzW2kvNF0gKQorICAgICAgICAgICAgICAgIHNbaS80XSA9ICIiOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIHBsc1tpXSAhPSAiIiApCisgICAgICAgICAgICAgICAgc1tpLzRdICs9IHBsc1tpXTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCAoaSU0ICE9IDMpICYmIGkgPCBtYXhpLTEgKQorICAgICAgICAgICAgICAgIHNbaS80XSArPSAiICI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKHsgc3ByaW50ZiggIiV8NzhzIiwgIkxpc3RlIGRlciBNaXRzcGllbGVyIHZvbSAiICsgZHRpbWUodGltZSgpKSArCisgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCAiICglZCBUZWlsbmVobWVyKSIsIG1heGkgKSksICIiIH0pICsgczsKK30KKworCitwdWJsaWMgdmFyYXJncyBpbnQgcXVlcnlfcHJldmVudF9zaGFkb3coIG9iamVjdCBvYiApCit7CisgICAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9vYmovemVpdHVuZ3NhdXRvbWF0LmMgYi9vYmovemVpdHVuZ3NhdXRvbWF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU3MWQxZAotLS0gL2Rldi9udWxsCisrKyBiL29iai96ZWl0dW5nc2F1dG9tYXQuYwpAQCAtMCwwICsxLDY5IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLyAKKy8vIHplaXR1bmdzYXV0b21hdC5jIC0tIFplaXR1bmdzYXV0b21hdCBpbiBkZXIgQWJlbnRldXJlcmdpbGRlCisvLyAKKy8vICRJZDoJemVpdHVuZ3NhdXRvbWF0LmMgNjQzNyAyMDA3LTA4LTE4IDIyOjU4OjU4WiBaZXNzdHJhICQKKy8vIAorCitpbmhlcml0ICIvc3RkL3RoaW5nIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDx3d3cuaD4KKworI2RlZmluZSBaRUlUVU5HICIvb2JqL21wYSIKKwordm9pZCBjcmVhdGUoKQoreworICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuOworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfU0hPUlQsIkVpbmUgWmVpdHVuZyIpOworICBTZXRQcm9wKFBfTE9ORywgCisgICAgIkhpZXIgc3RlaGVuIGltbWVyIGRpZSBuZXVlc3RlbiBOYWNocmljaHRlbiB1bmQgR2VydWVjaHRlIGRyaW4uXG4iKTsKKyAgU2V0UHJvcChQX05BTUUsIlplaXR1bmciKTsKKyAgQWRkSWQoKHsiemVpdHVuZyIsIm1wYSIsInNlcnZpY2VwYWtldCJ9KSk7CisgIFNldFByb3AoUF9HRU5ERVIsRkVNQUxFKTsKKyAgU2V0UHJvcChQX05PR0VULDEpOworICBTZXRQcm9wKFBfUElDS19NU0csIE5PX1BOR19NU0cpOworICBTZXRQcm9wKFBfQVJUSUNMRSwxKTsKKyAgU2V0UHJvcChQX1dXV0lORk8sICJNYW4ga2FubiBkaWUgTVBBIGF1Y2ggPEEgSFJFRj1cImh0dHA6Ly8iCisgICAgICArU0VSVkVSK01VRFdXVyArICI/IiArUkVRICsgIj0iICsgUl9ORVdTICsgIlwiPmxlc2VuPC9BPiIpOworfQorCitpbnQgZ2V0KG9iamVjdCB0YXJnKSB7CisgIGludCByZXM7CisKKyAgaWYgKCFvYmplY3RwKHRhcmcpIHx8ICFpbnRlcmFjdGl2ZSh0YXJnKSkKKyAgICByZXR1cm4gTUVfQ0FOVF9CRV9UQUtFTjsKKyAgCisgIGlmIChwcmVzZW50X2Nsb25lKFpFSVRVTkcsIHRhcmcpKSB7CisgICAgdGVsbF9vYmplY3QodGFyZywgIkR1IGhhc3QgZG9jaCBiZXJlaXRzIGVpbmUgWmVpdHVuZy5cbiIpOworICAgIHJldHVybiBNRV9DQU5UX0JFX1RBS0VOOworICB9CisgIAorICBvYmplY3QgemVpdHVuZz1jbG9uZV9vYmplY3QoIi9vYmovbXBhIik7CisgIGlmICgocmVzPXplaXR1bmctPm1vdmUodGFyZyxNX0dFVCkpID09IE1PVkVfT0spIHsKKyAgICB0ZWxsX29iamVjdCh0YXJnLCAiRHUgbmltbXN0IGRpZSBaZWl0dW5nLiBTb2ZvcnQgZXJzY2hlaW50IGF1ZiAiCisJInVuZXJrbGFlcmxpY2hlIFdlaXNlIGVpbmUgbmV1ZS5cbiIpOworICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudCh0YXJnKSwgYnJlYWtfc3RyaW5nKAorCXRhcmctPm5hbWUoV0VSKSArICIgbmltbXQgZGllIFplaXR1bmcuIFNvZm9ydCBlcnNjaGVpbnQgYXVmICIKKwkidW5lcmtsYWVybGljaGUgV2Vpc2UgZWluZSBuZXVlLlxuIiw3OCksKHt0YXJnfSkpOworICB9CisgIGVsc2UgeworICAgIHRlbGxfb2JqZWN0KHRhcmcsICJEdSBrYW5uc3QgZGllIFplaXR1bmcgbGVpZGVyIG5pY2h0IG1laHIgdHJhZ2VuLlxuIik7CisgICAgemVpdHVuZy0+cmVtb3ZlKDEpOworICB9CisgIAorICByZXR1cm4gcmVzOworfQorCit2YXJhcmdzIGludCBtb3ZlKG9iamVjdCB0YXJnZXQsIG1peGVkIG1ldGhvZCkKK3sKKyAgaWYgKG1ldGhvZCZNX0dFVCAmJiBsaXZpbmcodGFyZ2V0KSkKKyAgICByZXR1cm4gZ2V0KHRhcmdldCk7CisgIAorICByZXR1cm4gOjptb3ZlKHRhcmdldCxtZXRob2QpOworfQorCmRpZmYgLS1naXQgYS9wL2RhZW1vbi9jaC5oIGIvcC9kYWVtb24vY2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWZlZDc4Ci0tLSAvZGV2L251bGwKKysrIGIvcC9kYWVtb24vY2guaApAQCAtMCwwICsxLDEwIEBACisvLyBjaC5oIC0gY2hhbm5lbCBkYWVtb24gZGVmaW5lcworLy8gLS0KKy8vICR0aW1lc3RhbXA6OiQKKworLy8gZXhpc3RpZXJ0IGF1cyBLb21wYXRpYmlsaXRhZXRzZ3J1ZW5kZW4sIHdlaWwgZGllIGhhZWxmdGUgdm9tIE11ZCBkaWVzZXMgdW5kCisvLyBkaWUgYW5kZXJlIEhhZWxmdGUgY2hhbm5lbC5oIGlua2x1ZGllcnQuIEVudHNjaGVpZHVuZywgZGVuIGVpbmRldXRpZ2VyZW4KKy8vIE5hbWVuIGNoYW5uZWwuaCB6dSBiZW51dHplbiB1bmQgZGllc2VzIGVpbmZhY2ggY2hhbm5lbC5oIGlua2x1ZGllcmVuIHp1CisvLyBsYXNzZW4uCisjaW5jbHVkZSAiY2hhbm5lbC5oIgorCmRpZmYgLS1naXQgYS9wL2RhZW1vbi9jaGFubmVsLmggYi9wL2RhZW1vbi9jaGFubmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQxZjUwNgotLS0gL2Rldi9udWxsCisrKyBiL3AvZGFlbW9uL2NoYW5uZWwuaApAQCAtMCwwICsxLDU5IEBACisvLyBjaC5oIC0gY2hhbm5lbCBkYWVtb24gZGVmaW5lcworLy8gLS0KKy8vICR0aW1lc3RhbXA6OiQKKworI2lmbmRlZiBfX0RBRU1PTl9DSEFOTkVMX0hfXworI2RlZmluZSBfX0RBRU1PTl9DSEFOTkVMX0hfXworCisjZGVmaW5lIFBfQ0hBTk5FTFMJCSJjaGFubmVscyIKKyNkZWZpbmUgUF9TVERfQ0hBTk5FTAkJInN0ZF9jaGFubmVsIgorCisjZGVmaW5lIENITUFTVEVSCQkiL3AvZGFlbW9uL2NoYW5uZWxkIgorCisvLyBNZXNzYWdlIHR5cGVzCisjZGVmaW5lIE1TR19TQVkgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTVNHX0VNT1RFICAgICAgICAgICAgICAgMQorI2RlZmluZSBNU0dfR0VNT1RFICAgICAgICAgICAgICAyCisjZGVmaW5lIE1TR19FTVBUWSAgICAgICAgICAgICAgIDMKKworLy8gRXJyb3JzCisjZGVmaW5lIEVfQUNDRVNTX0RFTklFRCAgICAgICAgIC0xCisjZGVmaW5lIEVfQUxSRUFEWV9KT0lORUQgICAgICAgIC0yCisjZGVmaW5lIEVfTk9UX01FTUJFUiAgICAgICAgICAgIC0zCisjZGVmaW5lIEVfRU1QVFlfTUVTU0FHRSAgICAgICAgIC00CisjZGVmaW5lIEVfVU5LTk9XTl9UWVBFICAgICAgICAgIC01CisKKy8vIENvbW1hbmRzCisjZGVmaW5lIENfTkVXCQkJIm5ldyIKKyNkZWZpbmUgQ19KT0lOCQkJImpvaW4iCisjZGVmaW5lIENfTEVBVkUJCQkibGVhdmUiCisjZGVmaW5lIENfU0VORAkJCSJzZW5kIgorI2RlZmluZSBDX0xJU1QJCQkibGlzdCIKKyNkZWZpbmUgQ19GSU5ECQkJImZpbmQiCisKKy8vIGRlZmluaXRpb24gb2YgdGhlIGxpc3QgbWFwcGluZyBlbnRyeSAKKy8vIChbIGNoYW5uZWxuYW1lIDogKHsgSV9NRU1CRVIsIElfQUNDRVNTLCBJX0lORk8sIElfTUFTVEVSLCBJX05BTUUgfSkgXSkKKyNkZWZpbmUgSV9NRU1CRVIgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJX0FDQ0VTUyAgICAgICAgICAgICAgICAxCisjZGVmaW5lIElfSU5GTyAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgSV9NQVNURVIJCTMKKyNkZWZpbmUgSV9OQU1FCQkJNAorCisjZW5kaWYgLy9fX0RBRU1PTl9DSEFOTkVMX0hfXworCisvLyBwcm90b3R5cGVzCisjaWZkZWYgTkVFRF9QUk9UT1RZUEVTCisKKyNpZm5kZWYgX19DSEFOTkVMX0hfUFJPVE9fXworI2RlZmluZSBfX0NIQU5ORUxfSF9QUk9UT19fCit2YXJhcmdzIGludCBuZXcoc3RyaW5nIGNoLCBvYmplY3QgcGwsIG1peGVkIGluZm8pOwordmFyYXJncyBpbnQgc2VuZChzdHJpbmcgY2gsIG9iamVjdCBwbCwgc3RyaW5nIG1zZywgaW50IHR5cGUpOworCisvLyBvaywga2VpbmUgUHJvdG90eXBlbiwgYWJlciB0cm90emRlbSBudXIgZnVlciBjaGFubmVsZC5jIGludGVyZXNzYW50LgorI2RlZmluZSBNQVhfSElTVF9TSVpFICAgMjAwCisjZGVmaW5lIE1BWF9DSEFOTkVMUyAgICA5MAorCisjZW5kaWYgLy9fX0NIQU5ORUxfSF9QUk9UT19fCisKKyNlbmRpZiAvL05FRURfUFJPVE9UWVBFUworCmRpZmYgLS1naXQgYS9wL2RhZW1vbi9jaGFubmVsZC5jIGIvcC9kYWVtb24vY2hhbm5lbGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzMxZDU3Ci0tLSAvZGV2L251bGwKKysrIGIvcC9kYWVtb24vY2hhbm5lbGQuYwpAQCAtMCwwICsxLDY0NyBAQAorLy8gY2hhbm5lbGQuYworLy8KKy8vICRJZDogY2hhbm5lbGQuYyA5MTM4IDIwMTUtMDItMDMgMjE6NDY6NTZaIFplc3N0cmEgJAorLy8KKworI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgbm9fc2hhZG93IC8vIGtlaW5lIFNoYWRvd2luZy4uLgorI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBub19pbmhlcml0CisjcHJhZ21hIHNhdmVfdHlwZXMKKworI2luY2x1ZGUgPHN5c19kZWJ1Zy5oPgorI2luY2x1ZGUgPGxwY3R5cGVzLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlICJjaGFubmVsLmgiCisKKyNkZWZpbmUgQ01OQU1FICAiPE1hc3RlUj4iCisjZGVmaW5lIENIQU5ORUxfU0FWRSAgICAiL3AvZGFlbW9uL3NhdmUvY2hhbm5lbGQiCisKKyNkZWZpbmUgTUVNT1JZICIvc2VjdXJlL21lbW9yeSIKKworLy8gY2hhbm5lbHMgLSBjb250YWlucyB0aGUgc2ltcGxlIGNoYW5uZWwgaW5mb3JtYXRpb24KKy8vICAgICAgICAgICAgKFsgY2hhbm5lbG5hbWUgOiAoeyBJX01FTUJFUiwgSV9BQ0NFU1MsIElfSU5GTywgSV9NQVNURVIgfSkuLi5dKQorcHJpdmF0ZSBub3NhdmUgbWFwcGluZyBsb3dlcmNoOworcHJpdmF0ZSBub3NhdmUgbWFwcGluZyBjaGFubmVsczsKK3ByaXZhdGUgbm9zYXZlIG1hcHBpbmcgY2hhbm5lbEg7Citwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIHN0YXRzOworCitwcml2YXRlIG1hcHBpbmcgY2hhbm5lbEM7Citwcml2YXRlIG1hcHBpbmcgY2hhbm5lbEI7CisKK3ByaXZhdGUgaW50IHNhdmVfbWVfc29vbjsKKworLy8gQkVHSU4gT0YgVEhFIENIQU5ORUwgTUFTVEVSIEFETUlOSVNUUkFUSVZFIFBBUlQKKworI2RlZmluZSBSRUNWICAgIDAKKyNkZWZpbmUgU0VORCAgICAxCisjZGVmaW5lIEZMQUcgICAgMgorCisvLyBDaGFubmVsIGZsYWdzCisvLyBMZXZlbGJlc2NocmFlbmt1bmdlbiBnZWdlbiBNYWdpZXJsZXZlbCAocXVlcnlfd2l6X2xldmVsKSBwcnVlZmVuLCBuaWNodAorLy8gUF9MRVZFTC4KKyNkZWZpbmUgRl9XSVpBUkQgMQorLy8gS2VpbmUgR2Flc3RlLiA7LSkKKyNkZWZpbmUgRl9OT0dVRVNUIDIKKworcHJpdmF0ZSBub3NhdmUgbWFwcGluZyBhZG1pbiA9IG1fYWxsb2NhdGUoMCwgMyk7CisKK2ludCBjaGVjayhzdHJpbmcgY2gsIG9iamVjdCBwbCwgc3RyaW5nIGNtZCkKK3sKKyAgaW50IGxldmVsOworICAKKyAgaWYoKGFkbWluW2NoLCBGTEFHXSAmIEZfTk9HVUVTVCkgJiYgcGwtPlF1ZXJ5R3Vlc3QoKSkgcmV0dXJuIDA7CisKKyAgaWYoKGFkbWluW2NoLCBGTEFHXSAmIEZfV0laQVJEKSAmJiBxdWVyeV93aXpfbGV2ZWwocGwpIDwgU0VFUl9MVkwpIHJldHVybiAwOworICBsZXZlbCA9IChhZG1pbltjaCwgRkxBR10gJiBGX1dJWkFSRAorICAgICAgICAgICA/IHF1ZXJ5X3dpel9sZXZlbChwbCkKKyAgICAgICAgICAgOiBwbC0+UXVlcnlQcm9wKFBfTEVWRUwpKTsKKworICBzd2l0Y2goY21kKQorICB7CisgIGNhc2UgQ19GSU5EOgorICBjYXNlIENfTElTVDoKKyAgY2FzZSBDX0pPSU46CisgICAgaWYoYWRtaW5bY2gsIFJFQ1ZdID09IC0xKSByZXR1cm4gMDsKKyAgICBpZihhZG1pbltjaCwgUkVDVl0gPD0gbGV2ZWwpIHJldHVybiAxOworICAgIGJyZWFrOworICBjYXNlIENfU0VORDoKKyAgICBpZihhZG1pbltjaCwgU0VORF0gPT0gLTEpIHJldHVybiAwOworICAgIGlmKGFkbWluW2NoLCBTRU5EXSA8PSBsZXZlbCkgcmV0dXJuIDE7CisgICAgYnJlYWs7CisgIGNhc2UgQ19MRUFWRToKKyAgICByZXR1cm4gMTsKKyAgZGVmYXVsdDogYnJlYWs7CisgIH0KKyAgcmV0dXJuKDApOworfQorCitwcml2YXRlIGludCBDb3VudFVzZXIobWFwcGluZyBsKQoreworICBtYXBwaW5nIG47CisgIG4gPSAoW10pOworICB3YWxrX21hcHBpbmcobCwgbGFtYmRhKCh7J2kvKicqLywgJ2EvKicqLywgJ24vKicqL30pLAorICAgICAgICAgICAgICAgICAgICAgICAgICh7IycrPS8qJyovLCAnbi8qJyovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHsjJ21rbWFwcGluZy8qJyovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeyMnWy8qJyovLCAnYS8qJyovLCAwfSl9KX0pKSwKKyAgICAgICAgICAgICAgICZuKTsKKyAgcmV0dXJuIHNpemVvZihuKTsKK30KKworcHJpdmF0ZSB2b2lkIGJhbm5lZChzdHJpbmcgbiwgbWl4ZWQgY21kcywgc3RyaW5nIHJlcykKK3sKKyAgcmVzICs9IHNwcmludGYoIiVzIFslc10sICIsIGNhcGl0YWxpemUobiksIGltcGxvZGUoY21kcywgIiwiKSk7Cit9CisKK3ByaXZhdGUgbWFwcGluZyBUY21kID0gKFtdKTsKKyNkZWZpbmUgVElNRU9VVCAodGltZSgpIC0gNjApCisKK3ZvaWQgQ2hhbm5lbE1lc3NhZ2UobWl4ZWQgbXNnKQoreworICBzdHJpbmcgcmV0LCBtZXNnOworICBtaXhlZCBsYWc7CisgIGludCBtYXgsIHJla29yZDsKKyAgc3RyaW5nIHRtcDsKKyAgaWYobXNnWzFdID09IHRoaXNfb2JqZWN0KCkgfHwgIXN0cmluZ3AobXNnWzJdKSB8fAorICAgICBtc2dbMF0gIT0gQ01OQU1FIHx8IHByZXZpb3VzX29iamVjdCgpICE9IHRoaXNfb2JqZWN0KCkpIHJldHVybjsKKworCisgIG1lc2cgPSBsb3dlcl9jYXNlKG1zZ1syXSk7CisKKyAgaWYoIXN0cnN0cigiaGlsZmUiLCBtZXNnKSAmJiBzaXplb2YobWVzZykgPD0gNSkKKyAgICByZXQgPSAiRm9sZ2VuZGUgS29tbWFuZG9zIGdpYnQgZXM6IGhpbGZlLCBsYWcsIHVwW3RpbWVdLCBzdGF0aXN0aWssIGJhbm4iOworICBlbHNlCisgIGlmKCFzdHJzdHIoImxhZyIsIG1lc2cpICYmIHNpemVvZihtZXNnKSA8PSAzKQorICB7CisgICAgaWYoVGNtZFsibGFnIl0gPiBUSU1FT1VUKSByZXR1cm47CisgICAgVGNtZFsibGFnIl0gPSB0aW1lKCk7CisgICAgbGFnID0gIi9wL2RhZW1vbi9sYWctby1kYWVtb24iLT5yZWFkX2V4dF9sYWdfZGF0YSgpOworICAgIHJldCA9IHNwcmludGYoIkxhZzogJS4xZiUlLzYwLCAlLjFmJSUvMTUsICUuMWYlJS81LCAlLjFmJSUvMSwgIgorICAgICAgICAgICAgICAgICAgICAgICAiJS4xZiUlLzIwcywgJS4xZiUlLzJzIiwKKyAgICAgICAgICAgICAgICAgIGxhZ1s1XSwgbGFnWzRdLCBsYWdbM10sIGxhZ1syXSwgbGFnWzFdLCBsYWdbMF0pOworICAgIGNhbGxfb3V0KCMnc2VuZC8qJyovLCAyLCBDTU5BTUUsIHRoaXNfb2JqZWN0KCksIHJldCk7CisgICAgcmV0ID0gcXVlcnlfbG9hZF9hdmVyYWdlKCk7CisgIH0gZWxzZQorICBpZighc3Ryc3RyKCJ1cHRpbWUiLCBtZXNnKSAmJiBzaXplb2YobWVzZykgPD0gNikKKyAgeworICAgIGlmKFRjbWRbInVwdGltZSJdID4gVElNRU9VVCkgcmV0dXJuOworICAgIFRjbWRbInVwdGltZSJdID0gdGltZSgpOworICAgIGlmKGZpbGVfc2l6ZSgiL2V0Yy9tYXh1c2VycyIpIDw9IDApIHsKKyAgICAgIHJldCA9ICJEaWVzZSBJbmZvcm1hdGlvbiBsaWVndCBuaWNodCB2b3IuIjsKKyAgICB9IGVsc2UgeworICAgICAgc3NjYW5mKHJlYWRfZmlsZSgiL2V0Yy9tYXh1c2VycyIpLCAiJWQgJXMiLCBtYXgsIHRtcCk7CisgICAgICBzc2NhbmYocmVhZF9maWxlKCIvZXRjL21heHVzZXJzLmV2ZXIiKSwgIiVkICVzIiwgcmVrb3JkLCB0bXApOworICAgICAgcmV0ID0gc3ByaW50ZigiRGFzIE1VRCBsYWV1ZnQgamV0enQgJXMuIEVzIHNpbmQgbW9tZW50YW4gJWQgU3BpZWxlciAiCisgICAgICAgICAgICAgICAgICAiZWluZ2Vsb2dndDsgZGFzIE1heGltdW0gbGFnIGhldXRlIGJlaSAlZCB1bmQgZGVyIFJla29yZCAiCisgICAgICAgICAgICAgICAgICAiYmlzaGVyIGlzdCAlZC4iLCB1cHRpbWUoKSwgc2l6ZW9mKHVzZXJzKCkpLCBtYXgsIHJla29yZCk7CisgICAgfQorICB9IGVsc2UKKyAgaWYoIXN0cnN0cigic3RhdGlzdGlrIiwgbWVzZykgJiYgc2l6ZW9mKG1lc2cpIDw9IDkpCisgIHsKKyAgICBpZihUY21kWyJzdGF0aXN0aWsiXSA+IFRJTUVPVVQpIHJldHVybjsKKyAgICBUY21kWyJzdGF0aXN0aWsiXSA9IHRpbWUoKTsKKyAgICByZXQgPSBzcHJpbnRmKAorICAgICJJbSBNb21lbnQgc2luZCBpbnNnZXNhbXQgJWQgRWJlbmVuIG1pdCAlZCBUZWlsbmVobWVybiBha3Rpdi5cbiIKKyAgICAiRGVyICVzIHd1cmRlIGRhcyBsZXR6dGUgbWFsIGFtICVzIHZvbiAlcyBuZXUgZ2VzdGFydGV0LlxuIgorICAgICJTZWl0ZGVtIHd1cmRlbiAlZCBFYmVuZW4gbmV1IGVyemV1Z3QgdW5kICVkIHplcnN0b2VydC5cbiIsCisgICAgc2l6ZW9mKGNoYW5uZWxzKSwgQ291bnRVc2VyKGNoYW5uZWxzKSwgQ01OQU1FLAorICAgIGR0aW1lKHN0YXRzWyJ0aW1lIl0pLCBzdGF0c1siYm9vdCJdLCBzdGF0c1sibmV3Il0sIHN0YXRzWyJkaXNwb3NlIl0pOworICB9IGVsc2UKKyAgaWYoIXN0cnN0cihtZXNnLCAiYmFubiIpKQorICB7CisgICAgc3RyaW5nIHBsLCBjbWQ7CisgICAgaWYobWVzZyA9PSAiYmFubiIpCisgICAgICBpZihzaXplb2YoY2hhbm5lbEIpKQorICAgICAgeworICAgICAgICByZXQgPSAiIjsKKyAgICAgICAgd2Fsa19tYXBwaW5nKGNoYW5uZWxCLCAjJ2Jhbm5lZC8qJyovLCAmcmV0KTsKKyAgICAgICAgcmV0ID0gIkZ1ZXIgZm9sZ2VuZGUgU3BpZWxlciBiZXN0ZWh0IGVpbiBCYW5uOiAiICsgcmV0OworICAgICAgfSBlbHNlIHJldCA9ICJadXIgWmVpdCBpc3Qga2VpbiBCYW5uIGFrdGl2LiI7CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmKHNzY2FuZihtZXNnLCAiYmFubiAlcyAlcyIsIHBsLCBjbWQpID09IDIgJiYKKyAgICAgICAgIElTX0RFUFVUWShtc2dbMV0pKQorICAgICAgeworIyAgICAgZGVmaW5lIENNRFMgKHtDX0ZJTkQsIENfTElTVCwgQ19KT0lOLCBDX0xFQVZFLCBDX1NFTkQsIENfTkVXfSkKKyAgICAgICAgcGwgPSBsb3dlcl9jYXNlKHBsKTsgY21kID0gbG93ZXJfY2FzZShjbWQpOworICAgICAgICBpZihtZW1iZXIoQ01EUywgY21kKSAhPSAtMSkKKyAgICAgICAgeworICAgICAgICAgIGlmKCFwb2ludGVycChjaGFubmVsQltwbF0pKQorICAgICAgICAgICAgY2hhbm5lbEJbcGxdID0gKHt9KTsKKyAgICAgICAgICBpZihtZW1iZXIoY2hhbm5lbEJbcGxdLCBjbWQpICE9IC0xKQorICAgICAgICAgICAgY2hhbm5lbEJbcGxdIC09ICh7IGNtZCB9KTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBjaGFubmVsQltwbF0gKz0gKHsgY21kIH0pOworICAgICAgICAgIHJldCA9ICJGdWVyICciK2NhcGl0YWxpemUocGwpKyInIGJlc3RlaHQgIgorICAgICAgICAgICAgKyAoc2l6ZW9mKGNoYW5uZWxCW3BsXSkgPworICAgICAgICAgICAgICAgImZvbGdlbmRlciBCYW5uOiAiK2ltcGxvZGUoY2hhbm5lbEJbcGxdLCAiLCAiKSA6CisgICAgICAgICAgICAgICAia2VpbiBCYW5uIG1laHIuIik7CisgICAgICAgICAgaWYoIXNpemVvZihjaGFubmVsQltwbF0pKQorICAgICAgICAgICAgY2hhbm5lbEIgPSBtX2NvcHlfZGVsZXRlKGNoYW5uZWxCLCBwbCk7CisgICAgICAgICAgc2F2ZV9vYmplY3QoQ0hBTk5FTF9TQVZFKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHJldCA9ICJEYXMgS29tbWFuZG8gJyIrY21kKyInIGlzdCB1bmJla2FubnQuIEVybGF1YnRlIEtvbW1hbmRvczogIgorICAgICAgICAgICAgICAgKyBpbXBsb2RlKENNRFMsICIsICIpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBpZighSVNfQVJDSChtc2dbMV0pKSByZXR1cm47CisgICAgICAgIGVsc2UgcmV0ID0gIlN5bnRheDogYmFubiA8bmFtZT4gPGtvbW1hbmRvPiI7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UgaWYobWVzZyA9PSAibHVzdCIpCisgIHsKKyAgICBtaXhlZCB0LCB1cDsKKyAgICBpZihUY21kWyJsYWciXSA+IFRJTUVPVVQgfHwKKyAgICAgICBUY21kWyJzdGF0aXN0aWsiXSA+IFRJTUVPVVQgfHwKKyAgICAgICBUY21kWyJ1cHRpbWUiXSA+IFRJTUVPVVQpIHJldHVybjsKKyAgICBUY21kWyJsYWciXSA9IHRpbWUoKTsKKyAgICBUY21kWyJzdGF0aXN0aWsiXSA9IHRpbWUoKTsKKyAgICBUY21kWyJ1cHRpbWUiXSA9IHRpbWUoKTsKKyAgICBsYWcgPSAiL3AvZGFlbW9uL2xhZy1vLWRhZW1vbiItPnJlYWRfbGFnX2RhdGEoKTsKKworICAgIHNzY2FuZihyZWFkX2ZpbGUoIi9ldGMvbWF4dXNlcnMiKSwgIiVkICVzIiwgbWF4LCB0bXApOworICAgIHNzY2FuZihyZWFkX2ZpbGUoIi9ldGMvbWF4dXNlcnMuZXZlciIpLCAiJWQgJXMiLCByZWtvcmQsIHRtcCk7CisKKyAgICB0PXRpbWUoKS1sYXN0X3JlYm9vdF90aW1lKCk7CisgICAgdXA9IiI7CisgICAgaWYodCA+PSA4NjQwMCkKKyAgICAgIHVwICs9IHNwcmludGYoIiVkVCIsIHQvODY0MDApOworICAgIGlmKHQgPj0gMzYwMCkKKyAgICAgIHVwICs9IHNwcmludGYoIiVkaCIsICh0PXQlODY0MDApLzM2MDApOworICAgIGlmKHQgPiA2MCkKKyAgICAgIHVwICs9IHNwcmludGYoIiVkbSIsICh0PXQlMzYwMCkvNjApOworICAgIHVwICs9IHNwcmludGYoIiVkcyIsIHQlNjApOworCisgICAgcmV0ID0gc3ByaW50ZigiJS4xZiUlLzE1ICUuMWYlJS8xICVzICVkOiVkOiVkIEU6JWQgVDolZCIsCisgICAgICAgICAgICAgICAgICBsYWdbMV0sIGxhZ1syXSwgdXAsIHNpemVvZih1c2VycygpKSwgbWF4LCByZWtvcmQsIAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNoYW5uZWxzKSwgQ291bnRVc2VyKGNoYW5uZWxzKSk7CisgIH0gZWxzZSByZXR1cm47CisKKyAgY2FsbF9vdXQoIydzZW5kLyonKi8sIDIsIENNTkFNRSwgdGhpc19vYmplY3QoKSwgcmV0KTsKK30KKworLy8gc2V0dXAoKSAtLSBzZXQgdXAgYSBjaGFubmVsIGFuZCByZWdpc3RlciBpdAorLy8gICAgICAgICAgICBhcmd1bWVudHMgYXJlIHN0b3JlZCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgorLy8gICAgICAgICAgICAoeyBjaGFubmVsIG5hbWUsCisvLyAgICAgICAgICAgICAgIHJlY2VpdmUgbGV2ZWwsIHNlbmQgbGV2ZWwsCisvLyAgICAgICAgICAgICAgIGZsYWdzLAorLy8gICAgICAgICAgICAgICBkZXNjcmlwdGlvbiwKKy8vICAgICAgICAgICAgICAgbWFzdGVyIG9iagorLy8gICAgICAgICAgICB9KQorcHJpdmF0ZSB2b2lkIHNldHVwKG1peGVkIGMpCit7CisgIGNsb3N1cmUgY2w7CisgIG9iamVjdCBtOworICBzdHJpbmcgZDsKKyAgZCA9ICItIEtlaW5lIEJlc2NocmVpYnVuZyAtIjsKKyAgbSA9IHRoaXNfb2JqZWN0KCk7CisgIGlmKHNpemVvZihjKSAmJiBzaXplb2YoY1swXSkgPiAxICYmIGNbMF1bMF0gPT0gJ1xcJykKKyAgICBjWzBdID0gY1swXVsxLi5dOworCisgIHN3aXRjaChzaXplb2YoYykpCisgIHsKKyAgY2FzZSA2OgorICAgIGlmKCFzdHJpbmdwKGNbNV0pIHx8ICFzaXplb2YoY1s1XSkgCisgICAgICAgIHx8IChjYXRjaChtPWxvYWRfb2JqZWN0KGNbNV0pO3B1Ymxpc2gpIHx8ICFvYmplY3RwKG0pICkpCisgICAgICBtID0gdGhpc19vYmplY3QoKTsKKyAgY2FzZSA1OiBkID0gc3RyaW5ncChjWzRdKSB8fCBjbG9zdXJlcChjWzRdKSA/IGNbNF0gOiBkOworICBjYXNlIDQ6IGFkbWluW2NbMF0sIEZMQUddID0gdG9faW50KGNbM10pOworICBjYXNlIDM6IGFkbWluW2NbMF0sIFNFTkRdID0gdG9faW50KGNbMl0pOworICBjYXNlIDI6IGFkbWluW2NbMF0sIFJFQ1ZdID0gdG9faW50KGNbMV0pOworICAgIGJyZWFrOworICBjYXNlIDA6CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuOworICB9CisgIHN3aXRjaChuZXcoY1swXSwgbSwgZCkpCisgIHsKKyAgY2FzZSBFX0FDQ0VTU19ERU5JRUQ6CisgICAgbG9nX2ZpbGUoIkNIQU5ORUwiLCBzcHJpbnRmKCJbJXNdICVzOiAlTzogZXJyb3IsIGFjY2VzcyBkZW5pZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkdGltZSh0aW1lKCkpLCBjWzBdLCBtKSk7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuOworfQorCit2b2lkIGluaXRpYWxpemUoKQoreworICBtaXhlZCB0bXA7CisgIHRtcCA9IHJlYWRfZmlsZShvYmplY3RfbmFtZSh0aGlzX29iamVjdCgpKSsiLmluaXQiKTsKKyAgdG1wID0gcmVnZXhwKG9sZF9leHBsb2RlKHRtcCwgIlxuIiksICJeW14jXSIpOworICB0bXAgPSBtYXAodG1wLCAjJ3JlZ2V4cGxvZGUvKicqLywgIlteOl1bXjpdKiR8WyBcXHRdKjpbIFxcdF0qIik7CisgIHRtcCA9IG1hcCh0bXAsICMncmVnZXhwLyonKi8sICJeW146IFxcdF0iKTsKKyAgbWFwKHRtcCwgIydzZXR1cC8qJyovKTsKK30KKworLy8gQkVHSU4gT0YgVEhFIENIQU5ORUwgTUFTVEVSIElNUExFTUVOVEFUSU9OCisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgc2V0ZXVpZChnZXR1aWQoKSk7CisgIHJlc3RvcmVfb2JqZWN0KENIQU5ORUxfU0FWRSk7CisgIGlmKCFjaGFubmVsQykgY2hhbm5lbEMgPSAoW10pOworICBpZighY2hhbm5lbEIpIGNoYW5uZWxCID0gKFtdKTsKKyAgY2hhbm5lbHMgPSAoW10pOworCisgIC8qIERpZSBDaGFubmVsLUhpc3Rvcnkgd2lyZCBuaWNodCBudXIgbG9rYWwgc29uZGVybiBhdWNoIG5vY2ggaW0gTWVtb3J5IAorICAgICBnZXNwZWljaGVydCwgZGFkdXJjaCBibGVpYnQgc2llIGF1Y2ggdWViZXIgZWluIFJlbG9hZCBlcmhhbHRlbi4gCisgICAgIERlciBmb2xnZW5kZSBDb2RlIHZlcnN1Y2h0LCBkZW4gWmVpZ2VyIGF1cyBkZW0gTWVtb3J5IHp1IGhvbGVuLiBGYWxscworICAgICBkYXMgbmljaHQgbW9lZ2xpY2ggaXN0LCB3aXJkIGVpbiBuZXVlciBlcnpldWd0IHVuZCBnZWdlYmVuZW5mYWxscyBpbQorICAgICBNZW1vcnkgYWJnZWxlZ3QuICovCisKKyAgLy8gSGFiIGljaCBkaWUgbm9ldGlnZW4gUmVjaHRlIGltIE1lbW9yeT8KKyAgaWYgKGNhbGxfb3RoZXIoTUVNT1JZLCJIYXZlUmlnaHRzIikpIHsKKyAgICAvLyBPYmpla3Rwb2ludGVyIGxhZGVuCisgICAgY2hhbm5lbEggPSAobWl4ZWQpIGNhbGxfb3RoZXIoTUVNT1JZLCJMb2FkIiwiSGlzdG9yeSIpOworCisgICAgLy8gV2VubnMgbmljaCBnZWtsYXBwdCBoYXQsIGhhdCBkZXIgTWVtb3J5IG5vY2gga2VpbmVuIFplaWdlciwgZGFubgorICAgIGlmICghbWFwcGluZ3AoY2hhbm5lbEgpKXsKKyAgICAgIC8vIFplaWdlciBlcnpldWdlbgorICAgICAgY2hhbm5lbEggPSAoW10pOworICAgICAgLy8gdW5kIGluIGRlbiBNZW1vcnkgc2NocmVpYmVuCisgICAgICBjYWxsX290aGVyKE1FTU9SWSwiU2F2ZSIsIkhpc3RvcnkiLGNoYW5uZWxIKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gS2VpbmUgUmVjaHRlIGltIE1lbW9yeSwgZGFubiB3aXJkIG1pdCBlaW5lbSBsb2thbGVuIFplaWdlciBnZWFyYmVpdGV0LgorICAgIGNoYW5uZWxIID0gKFtdKTsKKyAgfQorCisgIHN0YXRzID0gKFsidGltZSI6IHRpbWUoKSwKKyAgICAgICAgICAgICJib290IjogY2FwaXRhbGl6ZShnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpfHwiPFVuYmVrYW5udD4iKV0pOworICBuZXcoQ01OQU1FLCB0aGlzX29iamVjdCgpLCAiWmVudHJhbGUgSW5mb3JtYXRpb25lbiB6dSBkZW4gRWJlbmVuIik7CisgIGluaXRpYWxpemUoKTsKKyAgbWFwX29iamVjdHMoZWZ1bjo6dXNlcnMoKSwgIlJlZ2lzdGVyQ2hhbm5lbHMiKTsKKyAgdGhpc19vYmplY3QoKS0+c2VuZChDTU5BTUUsIHRoaXNfb2JqZWN0KCksCisgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZigiJWQgRWJlbmVuIG1pdCAlZCBUZWlsbmVobWVybiBpbml0aWFsaXNpZXJ0LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY2hhbm5lbHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRVc2VyKGNoYW5uZWxzKSkpOworfQorCisvLyByZXNldCgpIGFuZCBjYWNoZV90bygpIC0gQ2FjaGUgVGltZW91dCwgcmVtb3ZlIHRpbWVkIG91dCBjYWNoZWQgY2hhbm5lbHMKKy8vIFNFRTogbmV3LCBzZW5kCitwcml2YXRlIGludCBjYWNoZV90byhzdHJpbmcga2V5LCBtYXBwaW5nIG0sIGludCB0KQoreworICBpZighcG9pbnRlcnAobVtrZXldKSB8fCBtW2tleV1bMl0gKyA0MzIwMCA+IHQpIHJldHVybiAxOworICByZXR1cm4oMCk7Cit9CisKK3ZhcmFyZ3Mgdm9pZCByZXNldChpbnQgbm9uc3RkKQoreworICBjaGFubmVsQyA9IGZpbHRlcl9pbmRpY2VzKGNoYW5uZWxDLCAjJ2NhY2hlX3RvLyonKi8sIGNoYW5uZWxDLCB0aW1lKCkpOworICBpZiAoc2F2ZV9tZV9zb29uKQorICB7CisgICAgc2F2ZV9tZV9zb29uPTA7CisgICAgc2F2ZV9vYmplY3QoQ0hBTk5FTF9TQVZFKTsKKyAgfQorfQorCisvLyBuYW1lKCkgLSBkZWZpbmUgdGhlIG5hbWUgb2YgdGhpcyBvYmplY3QuCitzdHJpbmcgbmFtZSgpIHsgcmV0dXJuIENNTkFNRTsgfQorc3RyaW5nIE5hbWUoKSB7IHJldHVybiBDTU5BTUU7IH0KKworLy8gYWNjZXNzKCkgLSBjaGVjayBhY2Nlc3MgYnkgbG9va2luZyBmb3IgdGhlIHJpZ2h0IGFyZ3VtZW50IHR5cGVzIGFuZAorLy8gICAgICAgICAgICBjYWxsaW5nIGFjY2VzcyBjbG9zdXJlcyByZXNwZWN0aXZlbHkKKy8vIFNFRTogbmV3LCBqb2luLCBsZWF2ZSwgc2VuZCwgbGlzdCwgdXNlcnMKKy8vIE5vdGU6IDxwbD4gaXMgdXN1YWxseSBhbiBvYmplY3QsIG9ubHkgdGhlIG1hc3RlciBzdXBwbGllcyBhIHN0cmluZyBkdXJpbmcKKy8vICAgICAgIHJ1bnRpbWUgZXJyb3IgaGFuZGxpbmcuCit2YXJhcmdzIHByaXZhdGUgaW50IGFjY2VzcyhtaXhlZCBjaCwgbWl4ZWQgcGwsIHN0cmluZyBjbWQsIHN0cmluZyB0eHQpCit7CisgIG1peGVkIGNvLCBtOworCisgIGlmKCFzdHJpbmdwKGNoKSB8fCAhc2l6ZW9mKGNoID0gbG93ZXJfY2FzZShjaCkpIHx8ICFjaGFubmVsc1tjaF0pCisgICAgcmV0dXJuIDA7CisgIGlmKCFjaGFubmVsc1tjaF1bSV9BQ0NFU1NdfHwhcHJldmlvdXNfb2JqZWN0KDEpfHwhZXh0ZXJuX2NhbGwoKXx8CisgICAgIHByZXZpb3VzX29iamVjdCgxKT09dGhpc19vYmplY3QoKXx8CisgICAgIChzdHJpbmdwKGNoYW5uZWxzW2NoXVtJX01BU1RFUl0pJiYKKyAgICAgIHByZXZpb3VzX29iamVjdCgxKT09ZmluZF9vYmplY3QoY2hhbm5lbHNbY2hdW0lfTUFTVEVSXSkpfHwKKyAgICAgZ2V0dWlkKHByZXZpb3VzX29iamVjdCgxKSkgPT0gUk9PVElEKQorICAgIHJldHVybiAyOworICBpZighb2JqZWN0cChwbCkgfHwgCisgICAgICgocHJldmlvdXNfb2JqZWN0KDEpIT1wbCkgJiYocHJldmlvdXNfb2JqZWN0KDEpIT10aGlzX29iamVjdCgpKSkpIAorICAgICByZXR1cm4gMDsKKyAgIGlmKHBvaW50ZXJwKGNoYW5uZWxCW2dldHVpZChwbCldKSAmJgorICAgICBtZW1iZXIoY2hhbm5lbEJbZ2V0dWlkKHBsKV0sIGNtZCkgIT0gLTEpCisgICAgcmV0dXJuIDA7CisgICBpZihzdHJpbmdwKGNoYW5uZWxzW2NoXVtJX01BU1RFUl0pICYmCisgICAgICghKG0gPSBmaW5kX29iamVjdChjaGFubmVsc1tjaF1bSV9NQVNURVJdKSkgfHwKKyAgICAgICghdG9fb2JqZWN0KGNoYW5uZWxzW2NoXVtJX0FDQ0VTU10pIHx8CisgICAgICAgZ2V0X3R5cGVfaW5mbyhjaGFubmVsc1tjaF1bSV9BQ0NFU1NdKVsxXSkpKQorICB7CisgICAgc3RyaW5nIGVycjsKKyAgICBpZighb2JqZWN0cChtKSkgZXJyID0gY2F0Y2gobG9hZF9vYmplY3QoY2hhbm5lbHNbY2hdW0lfTUFTVEVSXSk7cHVibGlzaCk7CisgICAgaWYoIWVyciAmJgorICAgICAgICgoIXRvX29iamVjdChjaGFubmVsc1tjaF1bSV9BQ0NFU1NdKSB8fAorICAgICAgICAgZ2V0X3R5cGVfaW5mbyhjaGFubmVsc1tjaF1bSV9BQ0NFU1NdKVsxXSkgJiYKKyAgICAgICAgIWNsb3N1cmVwKGNoYW5uZWxzW2NoXVtJX0FDQ0VTU10gPQorICAgICAgICAgICAgICAgICAgc3ltYm9sX2Z1bmN0aW9uKCJjaGVjayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluZF9vYmplY3QoY2hhbm5lbHNbY2hdW0lfTUFTVEVSXSkpKSkpCisgICAgeworICAgICAgbG9nX2ZpbGUoIkNIQU5ORUwiLCBzcHJpbnRmKCJbJXNdICVPIC0+ICVPXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0aW1lKHRpbWUoKSksIGNoYW5uZWxzW2NoXVtJX01BU1RFUl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKSk7CisgICAgICBjaGFubmVscyA9IG1fY29weV9kZWxldGUoY2hhbm5lbHMsIGNoKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICB0aGlzX29iamVjdCgpLT5qb2luKGNoLCBmaW5kX29iamVjdChjaGFubmVsc1tjaF1bSV9NQVNURVJdKSk7CisgIH0KKyAgaWYoY2xvc3VyZXAoY2hhbm5lbHNbY2hdW0lfQUNDRVNTXSkpCisgICAgICByZXR1cm4gZnVuY2FsbChjaGFubmVsc1tjaF1bSV9BQ0NFU1NdLAorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNbY2hdW0lfTkFNRV0sIHBsLCBjbWQsICZ0eHQpOworfQorCisvLyBuZXcoKSAtIGNyZWF0ZSBhIG5ldyBjaGFubmVsCisvLyAgICAgICAgIGEgY2hhbm5lbCB3aXRoIG5hbWUgJ2NoJyBpcyBjcmVhdGVkLCB0aGUgcGxheWVyIGlzIHRoZSBtYXN0ZXIKKy8vICAgICAgICAgaW5mbyBtYXkgY29udGFpbiBhIHN0cmluZyB3aGljaCBkZXNjcmliZXMgdGhlIGNoYW5uZWwgb3IgYSBjbG9zdXJlCisvLyAgICAgICAgIHRvIGRpc3BsYXkgdXAtdG8tZGF0ZSBpbmZvcm1hdGlvbiwgY2hlY2sgbWF5IGNvbnRhaW4gYSBjbG9zdXJlCisvLyAgICAgICAgIGNhbGxlZCB3aGVuIGEgam9pbi9sZWF2ZS9zZW5kL2xpc3QvdXNlcnMgbWVzc2FnZSBpcyByZWNlaXZlZAorLy8gU0VFOiBhY2Nlc3MKKworI2RlZmluZSBJR05PUkUgICJeL3h4IgorCit2YXJhcmdzIGludCBuZXcoc3RyaW5nIGNoLCBvYmplY3QgcGwsIG1peGVkIGluZm8pCit7CisgIG1peGVkIHBsczsKKworICBpZighb2JqZWN0cChwbCkgfHwgIXN0cmluZ3AoY2gpIHx8ICFzaXplb2YoY2gpIHx8IGNoYW5uZWxzW2xvd2VyX2Nhc2UoY2gpXSB8fAorICAgICAocGwgPT0gdGhpc19vYmplY3QoKSAmJiBleHRlcm5fY2FsbCgpKSB8fAorICAgICBzaXplb2YoY2hhbm5lbHMpID49IE1BWF9DSEFOTkVMUyB8fAorICAgICBzaXplb2YocmVnZXhwKCh7IG9iamVjdF9uYW1lKHBsKSB9KSwgSUdOT1JFKSkgfHwKKyAgICAgKHBvaW50ZXJwKGNoYW5uZWxCW2dldHVpZChwbCldKSAmJgorICAgICAgbWVtYmVyKGNoYW5uZWxCW2dldHVpZChwbCldLCBDX05FVykgIT0gLTEpKQorICAgIHJldHVybiBFX0FDQ0VTU19ERU5JRUQ7CisKKyAgaWYoIWluZm8pIHsKKyAgICBpZihjaGFubmVsQ1tsb3dlcl9jYXNlKGNoKV0pIHsKKyAgICAgIGNoID0gY2hhbm5lbENbbG93ZXJfY2FzZShjaCldWzBdOworICAgICAgaW5mbyA9IGNoYW5uZWxDW2xvd2VyX2Nhc2UoY2gpXVsxXTsKKyAgICB9CisgICAgZWxzZSByZXR1cm4gRV9BQ0NFU1NfREVOSUVEOworICB9CisgIGVsc2UgY2hhbm5lbENbbG93ZXJfY2FzZShjaCldID0gKHsgY2gsIGluZm8sIHRpbWUoKSB9KTsKKworICBwbHMgPSAoeyBwbCB9KTsKKworICBjaGFubmVsc1tsb3dlcl9jYXNlKGNoKV0gPSAoeyBwbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbF9mdW5jdGlvbigiY2hlY2siLCBwbCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIydjaGVjay8qJyovLCBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIWxpdmluZyhwbCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFjbG9uZXAocGwpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbCAhPSB0aGlzX29iamVjdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG9iamVjdF9uYW1lKHBsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBwbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgLy8gQ2hhbm5lbEggZnVlciBlaW5lbiBLYW5hbCBudXIgZGFubiBpbml0aWFsaXNpZXJlbiwgd2VubiBlcyBzaWUgbm9jaCBuaWNoIGdpYnQuCisgIGlmICggIXBvaW50ZXJwKGNoYW5uZWxIW2xvd2VyX2Nhc2UoY2gpXSkgKQorICAgICAgICAgY2hhbm5lbEhbbG93ZXJfY2FzZShjaCldID0gKHt9KTsKKworICBpZihwbCAhPSB0aGlzX29iamVjdCgpKQorICAgIGxvZ19maWxlKCJDSEFOTkVMLm5ldyIsIHNwcmludGYoIlslc10gJU86ICVPICVPXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHRpbWUodGltZSgpKSwgY2gsIHBsLCBpbmZvKSk7CisgIGlmKCFwbC0+UXVlcnlQcm9wKFBfSU5WSVMpKQorICAgIHRoaXNfb2JqZWN0KCktPnNlbmQoQ01OQU1FLCBwbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJsYWVzc3QgZGllIEViZW5lICciK2NoKyInIGVudHN0ZWhlbi4iLCBNU0dfRU1PVEUpOworICBzdGF0c1sibmV3Il0rKzsKKyAKKyAgc2F2ZV9tZV9zb29uPTE7CisgIHJldHVybigwKTsKK30KKworLy8gam9pbigpIC0gam9pbiBhIGNoYW5uZWwKKy8vICAgICAgICAgIHRoaXMgZnVuY3Rpb24gY2hlY2tzIHdoZXRoZXIgdGhlIHBsYXllciAncGwnIGlzIGFsbG93ZWQgdG8gam9pbgorLy8gICAgICAgICAgdGhlIGNoYW5uZWwgJ2NoJyBhbmQgYWRkIGlmIHN1Y2Nlc3NmdWwsIG9uZSBjYW5ub3Qgam9pbiBhIGNoYW5uZWwKKy8vICAgICAgICAgIHR3aWNlCisvLyBTRUU6IGxlYXZlLCBhY2Nlc3MKK2ludCBqb2luKHN0cmluZyBjaCwgb2JqZWN0IHBsKQoreworICBpZighZnVuY2FsbCgjJ2FjY2VzcywmY2gsIHBsLCBDX0pPSU4pKSByZXR1cm4gRV9BQ0NFU1NfREVOSUVEOworICBpZihtZW1iZXIoY2hhbm5lbHNbY2hdW0lfTUVNQkVSXSwgcGwpICE9IC0xKSByZXR1cm4gRV9BTFJFQURZX0pPSU5FRDsKKyAgY2hhbm5lbHNbY2hdW0lfTUVNQkVSXSArPSAoeyBwbCB9KTsKKyAgcmV0dXJuKDApOworfQorCisvLyBsZWF2ZSgpIC0gbGVhdmUgYSBjaGFubmVsCisvLyAgICAgICAgICAgdGhlIGFjY2VzcyBjaGVjayBpbiB0aGlzIGZ1bmN0aW9uIGlzIGp1c3QgdGhlcmUgZm9yIGNvbXBsZXRlbmVzcworLy8gICAgICAgICAgIG9uZSBzaG91bGQgYWx3YXlzIGJlIGFsbG93ZWQgdG8gbGVhdmUgYSBjaGFubmVsLgorLy8gICAgICAgICAgIGlmIHRoZXJlIGFyZSBubyBwbGF5ZXJzIGxlZnQgb24gdGhlIGNoYW5uZWwgaXQgd2lsbCB2YW5pc2gsIHVubGVzcworLy8gICAgICAgICAgIGl0cyBtYXN0ZXIgaXMgdGhpcyBvYmplY3QuCisvLyBTRUU6IGpvaW4sIGFjY2VzcworaW50IGxlYXZlKHN0cmluZyBjaCwgb2JqZWN0IHBsKQoreworICBpbnQgcG9zOworICBpZighZnVuY2FsbCgjJ2FjY2VzcywmY2gsIHBsLCBDX0xFQVZFKSkgcmV0dXJuIEVfQUNDRVNTX0RFTklFRDsKKyAgY2hhbm5lbHNbY2hdW0lfTUVNQkVSXSAtPSAoezB9KTsgLy8ga2FwdXR0ZSBPYmpla3RlIGVyc3RtYWwgcmF1cworICBpZigocG9zID0gbWVtYmVyKGNoYW5uZWxzW2NoXVtJX01FTUJFUl0sIHBsKSkgPT0gLTEpIHJldHVybiBFX05PVF9NRU1CRVI7CisgIGlmKHBsID09IGNoYW5uZWxzW2NoXVtJX01BU1RFUl0gJiYgc2l6ZW9mKGNoYW5uZWxzW2NoXVtJX01FTUJFUl0pID4gMSkKKyAgeworICAgIGNoYW5uZWxzW2NoXVtJX01BU1RFUl0gPSBjaGFubmVsc1tjaF1bSV9NRU1CRVJdWzFdOworICAgIGlmKCFwbC0+UXVlcnlQcm9wKFBfSU5WSVMpKQorICAgICAgdGhpc19vYmplY3QoKS0+c2VuZChjaCwgcGwsICJ1ZWJlcmdpYnQgZGllIEViZW5lIGFuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgK2NoYW5uZWxzW2NoXVtJX01BU1RFUl0tPm5hbWUoV0VOKSsiLiIsIE1TR19FTU9URSk7CisgIH0KKyAgY2hhbm5lbHNbY2hdW0lfTUVNQkVSXVtwb3MuLnBvc10gPSAoeyB9KTsKKworCisgIGlmKCFzaXplb2YoY2hhbm5lbHNbY2hdW0lfTUVNQkVSXSkgJiYKKyAgICAgIXN0cmluZ3AoY2hhbm5lbHNbY2hdW0lfTUFTVEVSXSkpCisgIHsKKyAgICAvLyBkZWxldGUgdGhlIGNoYW5uZWwgdGhhdCBoYXMgbm8gbWVtYmVycworICAgIGlmKCFwbC0+UXVlcnlQcm9wKFBfSU5WSVMpKQorICAgICAgdGhpc19vYmplY3QoKS0+c2VuZChDTU5BTUUsIHBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAidmVybGFlc3N0IGFscyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICsocGwtPlF1ZXJ5UHJvcChQX0dFTkRFUikgPT0gMSA/ICJMZXR6dGVyIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxldHp0ZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICsiIGRpZSBFYmVuZSAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICArY2hhbm5lbHNbY2hdW0lfTkFNRV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKyInLCB3b3JhdWYgZGllc2Ugc2ljaCBpbiBlaW5lbSBCbGl0eiBva3RhcmluZW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICArIkxpY2h0cyBhdWZsb2VzdC4iLCBNU0dfRU1PVEUpOworICAgIGNoYW5uZWxDW2xvd2VyX2Nhc2UoY2gpXSA9ICh7IGNoYW5uZWxzW2NoXVtJX05BTUVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzW2NoXVtJX0lORk9dLCB0aW1lKCkgfSk7CisgICAgbV9kZWxldGUoY2hhbm5lbHMsIGxvd2VyX2Nhc2UoY2gpKTsKKworICAgIC8vIFdpcmQgZWluIENoYW5uZWwgZW50ZmVybnQsIHdpcmQgYXVjaCBzZWluZSBIaXN0b3J5IGdlbG9lc2NodAorICAgIGNoYW5uZWxIID0gbV9jb3B5X2RlbGV0ZShjaGFubmVsSCwgbG93ZXJfY2FzZShjaCkpOworCisgICAgc3RhdHNbImRpc3Bvc2UiXSsrOworICAgIHNhdmVfbWVfc29vbj0xOworICB9CisgIHJldHVybigwKTsKK30KKworLy8gc2VuZCgpIC0gc2VuZCBhIG1lc3NhZ2UgdG8gYWxsIHJlY2lwaWVudHMgb2YgdGhlIHNwZWNpZmllZCBjaGFubmVsICdjaCcKKy8vICAgICAgICAgIGNoZWNrcyBpZiAncGwnIGlzIGFsbG93ZWQgdG8gc2VuZCBhIG1lc3NhZ2UgYW5kIHNlbmRzIGlmIHN1Y2Nlc3MtCisvLyAgICAgICAgICBmdWwgYSBtZXNzYWdlIHdpdGggdHlwZSAndHlwZScKKy8vICAgICAgICAgICdwbCcgbXVzdCBiZSBhbiBvYmplY3QsIHRoZSBtZXNzYWdlIGlzIGF0dHJpYnV0ZWQgdG8gaXQuIGUuZy4KKy8vICAgICAgICAgICAgaWdub3JlIGNoZWNrcyB1c2UgaXQuIEl0IGNhbiBiZSAhPSBwcmV2aW91c19vYmplY3QoKQorLy8gU0VFOiBhY2Nlc3MsIGNoLmgKK3ZhcmFyZ3MgaW50IHNlbmQoc3RyaW5nIGNoLCBvYmplY3QgcGwsIHN0cmluZyBtc2csIGludCB0eXBlKQoreworICBpbnQgYTsKKworICBpZighKGEgPSBmdW5jYWxsKCMnYWNjZXNzLCZjaCwgcGwsIENfU0VORCwgJm1zZykpKSByZXR1cm4gRV9BQ0NFU1NfREVOSUVEOworICBpZihhIDwgMiAmJiBtZW1iZXIoY2hhbm5lbHNbY2hdW0lfTUVNQkVSXSwgcGwpID09IC0xKSByZXR1cm4gRV9OT1RfTUVNQkVSOworICBpZighbXNnIHx8ICFzdHJpbmdwKG1zZykgfHwgIXNpemVvZihtc2cpKSByZXR1cm4gRV9FTVBUWV9NRVNTQUdFOworICBtYXBfb2JqZWN0cyhjaGFubmVsc1tjaF1bSV9NRU1CRVJdLAorICAgICAgICAgICAgICAiQ2hhbm5lbE1lc3NhZ2UiLCAoeyBjaGFubmVsc1tjaF1bSV9OQU1FXSwgcGwsIG1zZywgdHlwZSB9KSk7CisgIGlmKHNpemVvZihjaGFubmVsSFtjaF0pID4gTUFYX0hJU1RfU0laRSkKKyAgICBjaGFubmVsSFtjaF0gPSBjaGFubmVsSFtjaF1bMS4uXTsKKyAgY2hhbm5lbEhbY2hdICs9ICh7ICh7IGNoYW5uZWxzW2NoXVtJX05BTUVdLAorICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmluZ3AocGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgPyBwbAorICAgICAgICAgICAgICAgICAgICAgICAgIDogKHBsLT5RdWVyeVByb3AoUF9JTlZJUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICIvKCIrY2FwaXRhbGl6ZShnZXR1aWQocGwpKSsiKSQiIDogIiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgKyAocGwtPk5hbWUoV0VSLCAyKSB8fCAiPFVuYmVrYW5udD4iKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgbXNnKyIgPCIrc3RyZnRpbWUoIiVhLCAlSDolTTolUyIpKyI+XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgfSkgfSk7CisgIHJldHVybigwKTsKK30KKworLy8gbGlzdCgpIC0gbGlzdCBhbGwgY2hhbm5lbHMsIHRoYXQgYXJlIGF0IGxlYXN0IHJlY2VpdmFibGUgYnkgJ3BsJworLy8gICAgICAgICAgcmV0dXJucyBhIG1hcHBpbmcsCisvLyBTRUU6IGFjY2VzcywgY2hhbm5lbHMKK3ByaXZhdGUgdm9pZCBjbGVhbihzdHJpbmcgbiwgbWl4ZWQgYSkgeyBhWzBdIC09ICh7IDAgfSk7IH0KK21peGVkIGxpc3Qob2JqZWN0IHBsKQoreworICBtYXBwaW5nIGNoczsKKyAgCisgIGNocyA9IGZpbHRlcl9pbmRpY2VzKGNoYW5uZWxzLCAjJ2FjY2Vzcy8qJyovLCBwbCwgQ19MSVNUKTsKKyAgd2Fsa19tYXBwaW5nKGNocywgIydjbGVhbi8qJyovKTsKKyAgaWYoIXNpemVvZihjaHMpKSByZXR1cm4gRV9BQ0NFU1NfREVOSUVEOworICByZXR1cm4gZGVlcF9jb3B5KGNocyk7Cit9CisKKy8vIGZpbmQoKSAtIGZpbmQgYSBjaGFubmVsIGJ5IGl0cyBuYW1lIChtYXkgYmUgcGFydGlhbCkKKy8vICAgICAgICAgIHJldHVybnMgYW4gYXJyYXkgZm9yIG11bHRpcGxlIHJlc3VsdHMgYW5kIDAgZm9yIG5vIG1hdGNoaW5nIG5hbWUKKy8vIFNFRTogYWNjZXNzCittaXhlZCBmaW5kKHN0cmluZyBjaCwgb2JqZWN0IHBsKQoreworICBtaXhlZCBjaHMsIHM7CisgIGlmKHN0cmluZ3AoY2gpKSBjaCA9IGxvd2VyX2Nhc2UoY2gpOworICBpZiggIXNpemVvZihyZWdleHAoKHtjaH0pLCJeWzw+YS16MC05Iy1dKiQiKSkgKSByZXR1cm4gMDsgLy8gUlVNCisgIGlmKCFzaXplb2YoY2hzID0gcmVnZXhwKG1faW5kaWNlcyhjaGFubmVscyksICJeIitjaCsiJCIpKSkKKyAgICBjaHMgPSByZWdleHAobV9pbmRpY2VzKGNoYW5uZWxzKSwgIl4iK2NoKTsKKyAgaWYoKHMgPSBzaXplb2YoY2hzKSkgPiAxKQorICAgIGlmKHNpemVvZihjaHMgPSBmaWx0ZXIoY2hzLCAjJ2FjY2Vzcy8qJyovLCBwbCwgQ19GSU5EKSkgPT0gMSkKKyAgICAgIHJldHVybiBjaGFubmVsc1tjaHNbMF1dW0lfTkFNRV07CisgICAgZWxzZSByZXR1cm4gY2hzOworICByZXR1cm4gKChzICYmIGZ1bmNhbGwoIydhY2Nlc3MsY2hzWzBdLCBwbCwgQ19GSU5EKSkgPyBjaGFubmVsc1tjaHNbMF1dW0lfTkFNRV0gOiAwKTsKK30KKworLy8gaGlzdG9yeSgpIC0gZ2V0IHRoZSBoaXN0b3J5IG9mIGEgY2hhbm5lbAorLy8gU0VFOiBhY2Nlc3MKK21peGVkIGhpc3Rvcnkoc3RyaW5nIGNoLCBvYmplY3QgcGwpCit7CisgIGlmKCFmdW5jYWxsKCMnYWNjZXNzLCZjaCwgcGwsIENfSk9JTikpCisgICAgcmV0dXJuIEVfQUNDRVNTX0RFTklFRDsKKyAgcmV0dXJuIGRlZXBfY29weShjaGFubmVsSFtjaF0pOworfQorCisvLyByZW1vdmUgLSByZW1vdmUgYSBjaGFubmVsICh3aXJkIGF1cyBkZXIgU2hlbGwgYXVmZ2VydWZlbikKKy8vIFNFRTogbmV3CittaXhlZCByZW1vdmUoc3RyaW5nIGNoLCBvYmplY3QgcGwpCit7CisgIG1peGVkIG1lbWJlcnM7CisKKyAgaWYocHJldmlvdXNfb2JqZWN0KCkgIT0gdGhpc19vYmplY3QoKSkKKyAgICBpZighc3RyaW5ncChjaCkgfHwKKyAgICAgICBwbCAhPSB0aGlzX3BsYXllcigpIHx8IHRoaXNfcGxheWVyKCkgIT0gdGhpc19pbnRlcmFjdGl2ZSgpIHx8CisgICAgICAgdGhpc19pbnRlcmFjdGl2ZSgpICE9IHByZXZpb3VzX29iamVjdCgpIHx8CisgICAgICAgIUlTX0FSQ0godGhpc19pbnRlcmFjdGl2ZSgpKSkKKyAgICAgIHJldHVybiBFX0FDQ0VTU19ERU5JRUQ7CisKKyAgaWYoY2hhbm5lbHNbbG93ZXJfY2FzZShjaCldKSB7CisgICAgY2hhbm5lbHNbbG93ZXJfY2FzZShjaCldW0lfTUVNQkVSXSA9CisgICAgICAgIGZpbHRlcl9vYmplY3RzKGNoYW5uZWxzW2xvd2VyX2Nhc2UoY2gpXVtJX01FTUJFUl0sCisgICAgICAgICAgICAgICAgICAgICAgICJRdWVyeVByb3AiLCBQX0NIQU5ORUxTKTsKKyAgICBtYXAoY2hhbm5lbHNbbG93ZXJfY2FzZShjaCldW0lfTUVNQkVSXSwKKyAgICAgICAgbGFtYmRhKCh7J3UvKicqL30pLCAoeyMnY2FsbF9vdGhlci8qJyovLCAndSwgLyonKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldFByb3AiLCBQX0NIQU5ORUxTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeyMnLS8qJyovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHsjJ2NhbGxfb3RoZXIvKicqLywgJ3UsIC8qJyovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlF1ZXJ5UHJvcCIsIFBfQ0hBTk5FTFN9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcoeyBsb3dlcl9jYXNlKGNoKSB9KS8qJyovLH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSk7CisgICAgY2hhbm5lbHMgPSBtX2NvcHlfZGVsZXRlKGNoYW5uZWxzLCBsb3dlcl9jYXNlKGNoKSk7CisKKyAgICAvLyBXaXJkIGVpbiBDaGFubmVsIGVudGZlcm50LCB3aXJkIGF1Y2ggc2VpbmUgSGlzdG9yeSBnZWxvZXNjaHQKKyAgICBpZiggcG9pbnRlcnAoY2hhbm5lbEhbbG93ZXJfY2FzZShjaCldICkpCisgICAgIGNoYW5uZWxIID0gbV9jb3B5X2RlbGV0ZShjaGFubmVsSCwgbG93ZXJfY2FzZShjaCkpOworCisgICAgc3RhdHNbImRpc3Bvc2UiXSsrOworICB9CisgIGlmKCFjaGFubmVsQ1tsb3dlcl9jYXNlKGNoKV0pCisgICAgcmV0dXJuIEVfQUNDRVNTX0RFTklFRDsKKyAgY2hhbm5lbEMgPSBtX2NvcHlfZGVsZXRlKGNoYW5uZWxDLCBsb3dlcl9jYXNlKGNoKSk7CisgIHNhdmVfbWVfc29vbj0xOworICByZXR1cm4oMCk7Cit9CisKKy8vIFdpcmQgYXVzIGRlciBTaGVsbCBhdWZnZXJ1ZmVuIAorbWl4ZWQgY2xlYXJfaGlzdG9yeShzdHJpbmcgY2gpCit7CisgIG1peGVkIG1lbWJlcnM7CisgIC8vIFNpY2hlcmhlaXRzYWJmcmFnZW4KKyAgaWYocHJldmlvdXNfb2JqZWN0KCkgIT0gdGhpc19vYmplY3QoKSkKKyAgICBpZighc3RyaW5ncChjaCkgfHwKKyAgICAgICB0aGlzX3BsYXllcigpICE9IHRoaXNfaW50ZXJhY3RpdmUoKSB8fAorICAgICAgIHRoaXNfaW50ZXJhY3RpdmUoKSAhPSBwcmV2aW91c19vYmplY3QoKSB8fAorICAgICAgICFJU19BUkNIKHRoaXNfaW50ZXJhY3RpdmUoKSkpCisgICAgICByZXR1cm4gRV9BQ0NFU1NfREVOSUVEOworCisgIC8vIEhpc3RvcnkgZGVzIENoYW5uZWxzIGxvZXNjaGVuCisgIGlmKCBwb2ludGVycChjaGFubmVsSFtsb3dlcl9jYXNlKGNoKV0gKSkKKyAgICBjaGFubmVsSFtsb3dlcl9jYXNlKGNoKV09KHt9KTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3AvZGFlbW9uL2NoYW5uZWxkLmluaXQgYi9wL2RhZW1vbi9jaGFubmVsZC5pbml0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwOTlkMmQKLS0tIC9kZXYvbnVsbAorKysgYi9wL2RhZW1vbi9jaGFubmVsZC5pbml0CkBAIC0wLDAgKzEsNjUgQEAKKyMgQ0hBTk5FTCBNQVNURVIgSU5JVCBGSUxFCisjIFRvIGNyZWF0ZSBhIG5ldyBjaGFubmVsOgorIyA8bmFtZT46PHJlY3Y+OjxzZW5kPjo8ZmxhZ3M+OjxpbmZvPjo8bWFzdGVyPgorQWxsZ2VtZWluOiAgIDA6IDA6IDA6QWxsZ2VtZWluZSBVbnRlcmhhbHR1bmdzZWJlbmUKK0FiZW50ZXVlcjogICAwOiAwOiAwOkZyYWdlbiBkaWUgQWJlbnRldWVyIGJldHJlZmZlbjoJL3NlY3VyZS9xdWVzdG1hc3RlcgorR3JhdHM6CSAgICAgMDogMDogMDpHcmF0dWxhdGlvbmVuIHp1IGdlbG9lc3RlbiBBYmVudGV1ZXJuIGV0YworQmVpbGVpZDogICAgIDA6IDA6IDA6QmVpbGVpZHNiZWt1bmR1bmdlbiBqZWdsaWNoZXIgQXJ0CitGcmF0ZXJuaXRhczogMDogMDogMDpGcmF0ZXJuaXRhcyBkb25vIEFyY2htYWdvcnVtCitUb2Q6ICAgICAgICAgMDotMTogMDpXZXIgc3RpcmJ0IHdhbm4/Oi9yb29tL2RlYXRoL2RlYXRoX3Jvb20KK1RkVDogICAgICAgICAxNToxNToxOlRvZCBkZW4gVGVzdGllcyE6L3Jvb20vZGVhdGgvZGVhdGhfcm9vbQorTW9lcmRlcjogICAgIDA6LTE6IDA6R3VjayBtYWwgd2VyIGRhIHNwcmljaHQuLi46CS9zdGQvY29ycHNlCitTZWhlcjogICAgICAgMTogMTogMTpEaXNrdXNzaW9uc2ViZW5lIGZ1ZXIgU2VoZXIKK1pUOiAgICAgICAgICAwOiAwOiAwOk51ZXR6bGljaGUgVGlwcyBmdWVyIGRpZSBaYXViZXJ0cmFua3N1Y2hlCisjCisjIEd1aWxkIGNoYW5uZWxzCisjCitLbGVydXM6ICAgICAgMDogMDogMDpEaWUgUHJpZXN0ZXI6CQkJL2dpbGRlbi9rbGVydXMKK0JpZXJzY2h1ZXR0bGVyOiAwOiAwOiAwOkRpZSBCaWVyc2NodWV0dGxlcjoJCS9naWxkZW4vYmllcnNjaHVldHRsZXIKK1dlcndvZWxmZTogICAwOiAwOiAwOkRpZSBXZXJ3b2VsZmU6ICAgICAgICAgICAgICAgICAgICAgL2dpbGRlbi93ZXJ3b2VsZmUKK0FiR2lsZGU6ICAgICAwOiAwOiAwOkFiZW50ZXVyZXIsIHVuZCBzb2xjaGUsIGRpZSBlcyB3ZXJkZW4gd29sbGVuOiAvZ2lsZGVuL2FiZW50ZXVyZXIKK1phdWJlcmVyOiAgICAwOiAwOiAwOkRpZSBaYXViZXJlcjoJCQkvZ2lsZGVuL3phdWJlcmVyCitUYW5qaWFuOiAgICAgMDogMDogMDpEaWUgVGFuamlhbjogICAgICAgICAgICAgICAgICAgICAgIC9naWxkZW4vdGFuamlhbgorS2FyYXRlOiAgICAgIDA6IDA6IDA6RGllIEthcmF0ZWthOgkJCS9naWxkZW4va2FyYXRlCitDaGFvczogICAgICAgMDogMDogMDpDaGFvdGVuLi4uOgkJCS9naWxkZW4vY2hhb3MKK1RydmVzOiAgICAgICAwOiAwOiAwOk5ldWVzIHZvbSBLb3J1IFRzY2hha2FyIFN0cnV2OiAgICAgL3Ava2FlbXBmZXIvc3RkL2tfbWFzdGVyCitNYWd1czogICAgICAgMDogMDogMDpEZXIgbWFnaXNjaGUgQ29udmVudCB6dSBDYXN0YWxsYSBSb3NzbzogIC9naWxkZW4vbWFndXMKK0R1bmtlbGVsZmVuOiAwOiAwOiAwOkRpZSBEdW5rZWxlbGZlbjoJCQkvZ2lsZGVuL2R1bmtlbGVsZmVuCitVcnVrLUhhaTogICAgMDogMDogMDpGdWVyIGVjaHRlIE9ya3M6CQkJL2dpbGRlbi91cnVraGFpCisjCisjIFdpemFyZCBjaGFubmVscworIworTWFnaWVyOiAgICAgMTU6MTU6IDE6RGlza3Vzc2lvbnNlYmVuZSBmdWVyIE1hZ2llcgorRXJ6bWFnaWVyOiAgNjA6NjA6IDE6RXJ6bWFnaWVyCitHb2V0dGVyOiAgIDEwMDoxMDA6IDE6R29ldHRlcgorTFBDOiAgICAgICAgMTU6MTU6IDE6RnJhZ2VuIHp1ciBQcm9ncmFtbWllcnVuZyB1bmQgTFBDCisjCitEZWJ1ZzogICAgICAyMDo2MDogMTpEZWJ1ZyB1bmQgRmVobGVybWVsZHVuZ2VuOgkJL3AvZGFlbW9uL2RlYnVnCitFbnR3aWNrbHVuZzogMjA6NjA6MTpGZWhsZXIgcnVuZCB1bSBFaWdlbmVudHdpY2tsdW5nZW46IC9wL2RhZW1vbi9kZWJ1ZworV2FybnVuZ2VuOiAgIDIwOjYwOjE6TGF1ZnplaXQtV2FybnVuZ2VuOgkJL3AvZGFlbW9uL2RlYnVnCitTbm9vcDogICAgICA2MDotMTogMTpXZXIgc25vb3B0IGRlbm4gaGllcj86CQkvc2VjdXJlL3NpbXVsX2VmdW4vc2ltdWxfZWZ1bgorRlRQOiAgICAgICAgNjA6LTE6IDE6V2VyIG1hY2h0IGRlbm4gRlRQPzoJCS9zZWN1cmUvYmJtYXN0ZXIKKyMKKyMgSW50ZXJtdWQgY2hhbm5lbHMKKyMKK0ludGVybXVkOiAgICAwOiA1OiAyOkludGVybXVkIGNoYXQgKEVuZ2xpc2NoKToJCS9zZWN1cmUvdWRwL2NoYW5uZWwKK0ludGVyY29kZTogIDIwOjIwOiAzOlByb2dyYW1taWVyZnJhZ2VuIChFbmdsaXNjaCk6CS9zZWN1cmUvdWRwL2NoYW5uZWwKK0ludGVyYWRtaW46IDQ1OjU1OiAzOkFkbWluaXN0cmF0aW9uIChFbmdsaXNjaCk6CQkvc2VjdXJlL3VkcC9jaGFubmVsCitELWNoYXQ6CSAgICAgMDogNTogMjpWZXJiaW5kZXQgRGV1dHNjaGUgTVVEczoJCS9zZWN1cmUvdWRwL2NoYW5uZWwKK0QtbGludXg6ICAgICAwOiA1OiAyOkxpbnV4IGltIEQtQ2hhdDogICAgCQkvc2VjdXJlL3VkcC9jaGFubmVsCitELXR2LWFsbGVzOiAgMDogNTogMjpEZXV0c2NoZXMgVFYgUHJvZ3JhbW06CQkvc2VjdXJlL3VkcC9jaGFubmVsCitELW5ld3M6ICAgICAgMDogNTogMjpEZXV0c2NoZXMgTmFjaHJpY2h0ZW46CQkvc2VjdXJlL3VkcC9jaGFubmVsCitELWNvZGU6CSAgICAyMDoyMDogMzpNVUQgUHJvZ3JhbW1pZXIgRm9ydW06CQkvc2VjdXJlL3VkcC9jaGFubmVsCitELWFkbTogICAgICA2MDo2MDogMzpEZXV0c2Noc3ByYWNoaWdlIEFkbWluaXN0cmF0aW9uOgkvc2VjdXJlL3VkcC9jaGFubmVsCisjCisjIHNwZWNpYWwKKyMKK1dpc3NlbnNjaGFmdDowOiAwOiAwOldpc3NlbnNjaGFmdGxpY2hlIERpc3B1dGUKK0t1bHR1cjoJICAgICAwOiAwOiAwOkt1bHR1cmVsbGUgRXJlaWduaXNzZSB1bmQgRXJndWVzc2UKK1Nwb3J0OgkgICAgIDA6IDA6IDA6U3BvcnQgdW5kIFNwaWVsCitBbmZhZW5nZXI6ICAgMDogMDogMDpEaWUgRWJlbmUgZnVlciBBbmZhZW5nZXJmcmFnZW4KK3R3aXR0ZXI6ICAgICAwOiAwOiAxOkVpbiBWb2dlbCBpbSBNdWQ/OiAvc2VjdXJlL21pc2MvdHdpdHRlcgorIworIyBHZWJpZXRzcGV6aWZpc2NoZXMKKyMKK01ldHplbG9yYWtlbDowOiAwOiAwOkZ1ZXIgZGllIE1ldHplbHd1ZXRpZ2VuOgkJL2QvZWJlbmUvYXJhdGhvcm4vb3Jha2VsL3NlY3VyZS9zY2hhbWFuZQpkaWZmIC0tZ2l0IGEvcC9kYWVtb24vY2hhbm5lbGQudHJ1c3RlZCBiL3AvZGFlbW9uL2NoYW5uZWxkLnRydXN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYxOTYzMwotLS0gL2Rldi9udWxsCisrKyBiL3AvZGFlbW9uL2NoYW5uZWxkLnRydXN0ZWQKQEAgLTAsMCArMSwxMiBAQAorIyBDSEFOTkVMRCBNQVNURVIgVFJVU1RFRCBPQkpFQ1RTIEZJTEUKKyMgPG9iamVjdD4gOiA8Y2hhbm5lbHM+IDogPG5hbWU+Cisvc2VjdXJlL21hc3RlciAgICAgICAgICAgICAgICAgICAgICAgOjoKKy9zZWN1cmUvdWRwL2NoYW5uZWwgICAgICAgICAgICAgICAgICA6SU9BV3FQOgorL3NlY3VyZS9zaW11bF9lZnVuICAgICAgICAgICAgICAgICAgIDo6Cisvcm9vbS9kZWF0aC9kZWF0aF9yb29tICAgICAgICAgICAgICAgOlQ6Cisvc2VjdXJlL3F1ZXN0bWFzdGVyICAgICAgICAgICAgICAgICAgOmI6CisvZC9pbnNlbG4vYW50aGVhL3Jvb20vbGFuZC9tdWVobHN0ZWluOlQ6Cisvc3RkL2NvcnBzZSAgICAgICAgICAgICAgICAgICAgICAgICAgOk06CisvcC9kYWVtb24vaW5ld3MgICAgICAgICAgICAgICAgICAgICAgOmFOcVc6RFcKKy9naWxkZW4va2FyYXRlICAgICAgICAgICAgICAgICAgICAgICA6SzoKKy9naWxkZW4vY2hhb3MgICAgICAgICAgICAgICAgICAgICAgICA6YzoKZGlmZiAtLWdpdCBhL3AvZGFlbW9uL2NsYXNzZGIuYyBiL3AvZGFlbW9uL2NsYXNzZGIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGI0MGFlCi0tLSAvZGV2L251bGwKKysrIGIvcC9kYWVtb24vY2xhc3NkYi5jCkBAIC0wLDAgKzEsOTEgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyAvb2JqL2NsYXNzZC5jIC0tIG1hc3RlciBvYmplY3QgZm9yIGNsYXNzZXMuCisvLworLy8gU29sbCBpcmdlbmR3YW5uIG1hbCBLbGFzc2VuIGFlaG5saWNoIGRlciBNYXRlcmlhbC1EQiB2ZXJ3YWx0ZW4sIG1vbWVudGFuCisvLyBtYWNodHMgZXMgZXJzdG1hbCBlaW5mYWNoIGVpbmUgRXJzZXR6dW5nIHZvbiBBbGlhc2VuIHVuZCBlaW4gSGluenVmdWVnZW4KKy8vIHZvbiBpbXBsaXppdGVuIEtsYXNzZW4uCisvLworLy8gJElkJAorI3ByYWdtYSBzdHJpY3RfdHlwZXMsc2F2ZV90eXBlcworI3ByYWdtYSBub19jbG9uZSwgbm9fc2hhZG93LCBub19pbmhlcml0CisjcHJhZ21hIHZlcmJvc2VfZXJyb3JzLGNvbWJpbmVfc3RyaW5ncworI3ByYWdtYSBwZWRhbnRpYywgcmFuZ2VfY2hlY2ssIHdhcm5fZGVwcmVjYXRlZAorCisjaW5jbHVkZSA8Y2xhc3MuaD4KKworLy8gTWFwcGluZyB2b24gQWxpYXNlbiBmdWVyIEtsYXNzZW4uIEFsaWFzZSBkdWVyZmVuIG5pY2h0IHJla3Vyc2l2IHNlaW4uCitwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIGNsYXNzYWxpYXNlcyA9CisgIChbCisgICBdKTsKKy8vIE1hcHBpbmcgdm9uIGltcGxpeml0ZW4gS2xhc3NlbiBmdWVyIGVpbmUgZ2VnZWJlbmUgS2xhc3NlLiBJbXBsaXppdGUgS2xhc3NlbgorLy8gc2luZCBhbHMgQXJyYXkgdm9uIEtsYXNzZW5uYW1lbiBnZWdlYmVuLiBJbXBsaXppdGUgS2xhc3NlbiBkdWVyZmVuIHp1ciBaZWl0CisvLyBuaWNodCByZWt1cnNpdiBzZWluIHVuZCBrZWluZSBBbGlhc2UgZW50aGFsdGVuLgorcHJpdmF0ZSBub3NhdmUgbWFwcGluZyBpbXBsaWNpdGNsYXNzZXMgPQorICAoWworICAgICBDTF9aT01CSUU6ICAgICAgICh7Q0xfVU5ERUFEfSksCisgICAgIENMX1NLRUxFVE9OOiAgICAgKHtDTF9VTkRFQUR9KSwKKyAgICAgQ0xfR0hPVUw6ICAgICAgICAoe0NMX1VOREVBRH0pLAorICAgICBDTF9WQU1QSVJFOiAgICAgICh7Q0xfVU5ERUFEfSksCisgICAgIENMX0hPQkdPQkxJTjogICAgKHtDTF9HT0JMSU59KSwKKyAgICAgQ0xfTUFNTUFMX0xBTkQ6ICAoe0NMX01BTU1BTCwgQ0xfQU5JTUFMfSksCisgICAgIENMX01BTU1BTF9XQVRFUjogKHtDTF9NQU1NQUwsIENMX0FOSU1BTH0pLAorICAgICBDTF9TTkFLRTogICAgICAgICh7Q0xfUkVQVElMRX0pLAorICAgICBDTF9BUkFDSE5JRDogICAgICh7Q0xfQU5JTUFMfSksCisgICAgIENMX0JJUkQ6ICAgICAgICAgKHtDTF9BTklNQUx9KSwKKyAgICAgQ0xfRklTSDogICAgICAgICAoe0NMX0FOSU1BTH0pLAorICAgICBDTF9GUk9HOiAgICAgICAgICh7Q0xfQU5JTUFMfSksCisgICAgIENMX0lOU0VDVDogICAgICAgKHtDTF9BTklNQUx9KSwKKyAgICAgQ0xfTUFNTUFMOiAgICAgICAoe0NMX0FOSU1BTH0pLAorICAgICBDTF9SRVBUSUxFOiAgICAgICh7Q0xfQU5JTUFMfSksCisgICAgIENMX1NOQUtFOiAgICAgICAgKHtDTF9BTklNQUx9KSwKKyAgICAgQ0xfR09MRU06ICAgICAgICAoe0NMX0NPTlNUUlVDVH0pLAorICAgXSk7CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpIHsKK30KKworLyoqIEdpYnQgZGVuIEFsaWFzIGRlciBLbGFzc2UgPGNscz4genVydWVjay4KKyAqIEBwYXJhbVtpbl0gY2xzIHN0cmluZyAtIEtsYXNzZW5uYW1lCisgKiBAcmV0dXJuIHN0cmluZyogLSBBbGlhcyB2b24gS2xhc3NlIDxjbHM+CisgKi8KK3B1YmxpYyBzdHJpbmcgKiBRdWVyeUNsYXNzQWxpYXMoc3RyaW5nIGNscykgeworICBpZiAoIXN0cmluZ3AoY2xzKSkKKyAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoCisgICAgICAgICAgICAiR290IHdyb25nIGFyZ3VtZW50LCBleHBlY3RlZCBzdHJpbmcsIGdvdCAlLjUwT1xuIixjbHMpKTsKKyAgcmV0dXJuIGNvcHkoY2xhc3NhbGlhc2VzW2Nsc10pIHx8IGNsczsKK30KKworLyoqIEdpYnQgZGllIGltcGxpeml0ZW4gS2xhc3NlbiBkZXIgS2xhc3NlIDxjbHM+IHp1cnVlY2suCisgKiBAcGFyYW1baW5dIGNscyBzdHJpbmcgLSBLbGFzc2VubmFtZQorICogQHJldHVybiBzdHJpbmcqIC0gTGlzdGUgdm9uIGltcGxpeml0ZW4gS2xhc3NlbiB2b24gPGNscz4KKyAqLworcHVibGljIHN0cmluZyAqIFF1ZXJ5SW1wbGljaXRDbGFzc2VzKHN0cmluZyBjbHMpIHsKKyAgaWYgKCFzdHJpbmdwKGNscykpCisgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKAorICAgICAgICAgICAgIkdvdCB3cm9uZyBhcmd1bWVudCwgZXhwZWN0ZWQgc3RyaW5nLCBnb3QgJS41ME9cbiIsIGNscykpOworICByZXR1cm4gY29weShpbXBsaWNpdGNsYXNzZXNbY2xzXSkgfHwgKHt9KTsKK30KKworLyoqIEFkZHMgaW1wbGljaXQgY2xhc3NlcyB0byB0aGUgY2xhc3NlcyBnaXZlbiBpbiA8Y2xhc3Nlcz4uCisgKiBBdXNzZXJkZW0gd2VyZGVuIEtsYXNzZW5hbGlhc2UgYXVmZ2Vsb2VzdC4KKyAqIEBwYXJhbVtpbl0gY2xhc3NlcyBzdHJpbmcqIC0gS2xhc3Nlbmxpc3RlLgorICogQHJldHVybiBzdHJpbmcqIC0gbmV1ZSBLbGFzc2VubGlzdGUKKyAqIEBhdHRlbnRpb24gS2FubiBkYXMgdWViZXJnZWJlbmUgQXJyYXkgYWVuZGVybi4gRGFzIEVyZ2VibmlzYXJyYXkgbXVzcyBuaWNodAorICogdW5pcXVlIHNlaW4sIHNvbmRlcm4ga2FubiBEdWJsZXR0ZW4gZW50aGFsdGVuLgorICovCitwdWJsaWMgc3RyaW5nICogQWRkSW1wbGljaXRDbGFzc2VzKHN0cmluZyAqY2xhc3NlcykgeworICBpZiAoIXBvaW50ZXJwKGNsYXNzZXMpKQorICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigKKyAgICAgICAgICAiR290IHdyb25nIGFyZ3VtZW50LCBleHBlY3RlZCBhcnJheSwgZ290ICUuNTBPXG4iLGNsYXNzZXMpKTsKKyAgZm9yZWFjaChzdHJpbmcgY2xzIDogJmNsYXNzZXMpIHsKKyAgICAgIC8vIHp1ZXJzdCBBbGlhc2UgZXJzZXR6ZW4KKyAgICAgIGlmIChtZW1iZXIoY2xhc3NhbGlhc2VzLCBjbHMpKQorICAgICAgICAgIGNscyA9IGNsYXNzYWxpYXNlc1tjbHNdOworICAgICAgLy8gZGFubiBpbXBsaXppdGUgS2xhc3NlbiBhZGRpZXJlbi4KKyAgICAgIGlmIChtZW1iZXIoaW1wbGljaXRjbGFzc2VzLCBjbHMpKQorICAgICAgICAgIGNsYXNzZXMgKz0gaW1wbGljaXRjbGFzc2VzW2Nsc107CisgIH0KKyAgcmV0dXJuIGNsYXNzZXM7Cit9CisKZGlmZiAtLWdpdCBhL3AvZGFlbW9uL2RlYnVnLmMgYi9wL2RhZW1vbi9kZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZDY5NzUKLS0tIC9kZXYvbnVsbAorKysgYi9wL2RhZW1vbi9kZWJ1Zy5jCkBAIC0wLDAgKzEsMTI4IEBACisKKyNwcmFnbWEgc3RyaWN0X3R5cGVzLHNhdmVfdHlwZXMKKyNwcmFnbWEgbm9fY2xvbmUsbm9fc2hhZG93CisKKyNpbmNsdWRlIDxkYWVtb24uaD4KKyNpbmNsdWRlIDxsb2dnaW5nLmg+CisKK3N0YXRpYyBpbnQgZF9zdGFydCwgZF9lbmQsIGVfc3RhcnQsIGVfZW5kOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreyAgICAKKyAgICBkX2VuZCA9IGRfc3RhcnQgPSBlX2VuZCA9IGVfc3RhcnQgPSBmaWxlX3NpemUoX19ERUJVR19MT0dfXyk7Cit9CisKK2ludCBjaGVjayggc3RyaW5nIGNoLCBvYmplY3QgcGwsIHN0cmluZyBjbWQsIHN0cmluZyB0eHQgKQoreworICAgIG1peGVkIHRtcDsKKyAgICAKKyAgICBpZiAoIGNoICE9ICJEZWJ1ZyIgJiYgY2ggIT0gIkVudHdpY2tsdW5nIiAmJiBjaCAhPSAiV2FybnVuZ2VuIiApCisgICAgICAgIHJldHVybiAwOworICAgIAorICAgIGlmKCBvYmplY3RwKHBsKSAmJiBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHBsKSAmJiBxdWVyeV93aXpfbGV2ZWwocGwpID4gMTUgKQorICAgICAgICBzd2l0Y2goY21kKXsKKyAgICAgICAgY2FzZSBDX0ZJTkQ6CisgICAgICAgIGNhc2UgQ19MSVNUOgorICAgICAgICBjYXNlIENfSk9JTjoKKyAgICAgICAgY2FzZSBDX0xFQVZFOgorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGNhc2UgQ19TRU5EOgorICAgICAgICAgICAgLy8gV2VyIChub2NoKSBuaWNodCBhdWYgZGVtIEthbmFsIGlzdCwgYmVrb21tdCBhdWNoIGtlaW5lCisgICAgICAgICAgICAvLyBBdXNnYWJlIC0gc29uc3QgZ2lidCBlcyBzZWxiaWdlIGRvcHBlbHQsIGRhIGRlciBDSE1BU1RFUgorICAgICAgICAgICAgLy8gZWluZW4gYXV0b21hdGlzY2ggZGVuIEthbmFsIGJldHJldGVuIGxhZXNzdCAuLi4KKyAgICAgICAgICAgIGlmICggIW9iamVjdHAocGwpIHx8ICFwb2ludGVycCh0bXA9KG1peGVkKXBsLT5RdWVyeVByb3AoUF9DSEFOTkVMUykpIHx8CisgICAgICAgICAgICAgICAgIG1lbWJlciggdG1wLCBsb3dlcl9jYXNlKGNoKSApID09IC0xICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICAgICAgc3dpdGNoKCBsb3dlcl9jYXNlKHR4dCkgKXsKKyAgICAgICAgICAgIGNhc2UgImJhY2t0cmFjZSI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdHJpbmcgYnQsIGxvZzsKKyAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LCBlbmQ7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAoIGNoID09ICJEZWJ1ZyIgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGRfc3RhcnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSBkX2VuZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaCA9PSAiRW50d2lja2x1bmciKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGVfc3RhcnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSBlX2VuZDsKKyAgICAgICAgICAgICAgICAgICAgfQorCQkgICAgZWxzZSBpZiAoY2ggPT0gIldhcm51bmdlbiIpIHsKKwkJCXBsLT5NZXNzYWdlKCAiWyIgKyBjaCArICI6XSBCYWNrdHJhY2UgZnVlciBXYXJudW5nZW4gIgorCQkJICAgICJuaWNodCB2ZXJmdWVnYmFyIVxuIik7CisJCQlyZXR1cm4gMDsKKwkJICAgIH0KKwkJICAgIGVsc2UgcmV0dXJuKDEpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYoIHN0YXJ0ID49IGVuZCApIAorICAgICAgICAgICAgICAgICAgICAgICAgYnQgPSAiWyIgKyBjaCArICI6XSBLZWluIEJhY2t0cmFjZSB2ZXJmdWVnYmFyIVxuIjsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2cgPSByZWdyZXBsYWNlKCByZWFkX2J5dGVzKCBfX0RFQlVHX0xPR19fLCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbmQtc3RhcnQ+MTAwMDApPzEwMDAwOgorCQkJCQkJICAgICAgZW5kIC0gc3RhcnQgKSB8fCAiXG5GZWhsZXIgYmVpbSBFaW5sZXNlbiBkZXMgRGVidWdsb2dzOiBLZWluIEJhY2t0cmFjZSB2ZXJmdWVnYmFyIVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoTWlzcGxhY2VkfGN1cnJlbnRfb2JqZWN0fCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb25uZWN0aW9ufEhvc3QpW15cbl0qXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsIDEgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ0ID0gIlsiICsgY2ggKyAiOl0gLS0gQkFDS1RSQUNFIEJFR0lOIC0tXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBsb2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJbIiArIGNoICsgIjpdIC0tIEJBQ0tUUkFDRSBFTkQgLS1cbiI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGNhbGxfb3V0KCBzeW1ib2xfZnVuY3Rpb24oICJNZXNzYWdlIiwgcGwgKSwgMCwgYnQgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisJCWlmICggY2ggIT0gIldhcm51bmdlbiIgKSB7CisJCSAgcGwtPk1lc3NhZ2UoICJbIiArIGNoICsgIjpdIEhpbGZlLi4uXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbIiArIGNoICsgIjpdIEZvbGdlbmRlIEtvbW1hbmRvcyBzdGVoZW4genVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZlcmZ1ZWd1bmc6XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbIiArIGNoICsgIjpdICdiYWNrdHJhY2UnIC0tIHNlbmRldCBkZW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFja3RyYWNlIHp1bSBGZWhsZXJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlsiICsgY2ggKyAiOl0gJ2hpbGZlJyAgICAgLS0gc2VuZGV0IGRpZXNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhpbGZlc2VpdGVcbiIpOworCQl9CisJCWVsc2UgeworCQkgIHBsLT5NZXNzYWdlKCAiWyIgKyBjaCArICI6XSBLZWluZSBLb21tYW5kb3MgdmVyZnVlZ2JhciFcbiIpOworCQl9CisgICAgICAgICAgICB9CisJfQorICAgIAorICAgIHJldHVybiAwOworfQorCitzdHJpbmcgbmFtZSgpIHsgcmV0dXJuICI8RGVidWdnZXI+IjsgfQorc3RyaW5nIE5hbWUoKSB7IHJldHVybiAiPERlYnVnZ2VyPiI7IH0KKwordm9pZCBDaGFubmVsTWVzc2FnZSggbWl4ZWQgYSApCit7CisgICAgaW50IGZzOworCisgICAgZnMgPSBmaWxlX3NpemUoX19ERUJVR19MT0dfXyk7CisgICAgCisgICAgc3dpdGNoKCBhWzBdICl7CisgICAgY2FzZSAiRGVidWciOgorICAgICAgICBpZiAoICBmcyA+IGRfZW5kICYmIGZzID4gZV9lbmQgKXsKKwkgICAgZF9zdGFydCA9IG1heCgoZF9lbmQgPiBlX2VuZCA/IGRfZW5kIDogZV9lbmQpLDApOworICAgICAgICAgICAgZF9lbmQgPSBmczsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChmcyA8IGRfc3RhcnQgfHwgZnMgPD0gZF9lbmQpIHsKKwkgICAgLy8gRGVidWdsb2cgd3VyZGUgd29obCBuZXUgZ2VvZWZmbmV0LgorCSAgICBkX3N0YXJ0ID0gZF9lbmQgPSBlX3N0YXJ0ID0gZV9lbmQgPSBmczsKKwl9CisgICAgICAgIGJyZWFrOworICAgICAgICAKKyAgICBjYXNlICJFbnR3aWNrbHVuZyI6CisgICAgICAgIGlmICggIGZzID4gZF9lbmQgJiYgZnMgPiBlX2VuZCApeworCSAgICBlX3N0YXJ0ID0gbWF4KChlX2VuZCA+IGRfZW5kID8gZV9lbmQgOiBkX2VuZCksMCk7CisgICAgICAgICAgICBlX2VuZCA9IGZzOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGZzIDwgZV9zdGFydCB8fCBmcyA8PSBlX2VuZCkgeworCSAgICAvLyBEZWJ1Z2xvZyB3dXJkZSB3b2hsIG5ldSBnZW9lZmZuZXQuCisJICAgIGRfc3RhcnQgPSBkX2VuZCA9IGVfc3RhcnQgPSBlX2VuZCA9IGZzOworCX0KKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorIApkaWZmIC0tZ2l0IGEvcC9kYWVtb24vZG5zbG9va3VwLmMgYi9wL2RhZW1vbi9kbnNsb29rdXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTUyMzI0Ci0tLSAvZGV2L251bGwKKysrIGIvcC9kYWVtb24vZG5zbG9va3VwLmMKQEAgLTAsMCArMSwxMDEgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBkbnNsb29rdXAuYyAtIGtsZWluZXMgRE5TLUxvb2t1cC1PYmpla3QgbWl0IENhY2hlLgorLy8gICAgICAgICAgICAgICBCcmF1Y2h0IGV4dGVybmVuIEROUy1SZXNvbHZlciwgZGVyIHBlciBVRFAgYW5zcHJlY2hiYXIgaXN0LgorLy8KKy8vIEF1dG9yOiBaZXNzdHJhCisKKy8qIEltIE11ZGxpYm1hc3RlciBpbiByZWNlaXZlX3VkcCgpIGJyYXVjaHQgZXMgbm9jaCBldHdhcyBhIGxhOgorICBpZiggbWVzc2FnZVswLi45XT09IkROU0xPT0tVUFxuIiApIHsKKyAgICAiL3AvZGFlbW9uL2Ruc2xvb2t1cCItPnVwZGF0ZSggbWVzc2FnZSApOworICAgIHJldHVybjsKKyAgfQorCisgIGV4dC4gT2JqZWt0IGVyd2FydGV0IGdhbnogc2ltcGVsIDxob3N0bmFtZT5cbiBhbHMgRWluZ2FiZSB1bmQgc2VuZGV0IHp1cnVlY2s6CisgIEROU0xPT0tVUFxuPGhvc3RuYW1lPlxuPGlwLWFkcmVzc2U+fFVOS05PV05cbgorICAoRGFzIHwgc3RlaHQgZnVlciBvZGVyLikKKyovCisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHJ0dF9jaGVja3MKKworLy8gZXh0ZXJuZXIgc2VydmVyLCBkZXIgZGVuIEROUy1SZXNvbHZlIG1hY2h0LgorI2RlZmluZSBJUExPT0tVUF9IT1NUICIxMjcuMC4wLjEiCisjZGVmaW5lIElQTE9PS1VQX1BPUlQgODcxMgorCittYXBwaW5nIGNhY2hlID0gKFtdKTsKKworbWFwcGluZyBfcXVlcnlfY2FjaGUoKSB7cmV0dXJuIGNhY2hlO30KKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgc2V0ZXVpZChnZXR1aWQoKSk7CisgIHNldF9uZXh0X3Jlc2V0KDM2MDApOworfQorCisvLyBqYS4uLiB0b3RhbCBzaW1wZWwuLi4gbmljaHQgbWVociBhdWZ3YW5kIGFscyBub2V0aWcuCit2b2lkIHJlc2V0KCkKK3sKKyAgY2FjaGUgPSAoW10pOworICBzZXRfbmV4dF9yZXNldCgxMDgwMCk7Cit9CisKKy8vIGVpZ2VudGxpY2hlIEFuZnJhZ2UgYW4gZGVuIGV4dGVybmVuIFJlc29sdmVyIHNlbmRlbi4KK3Byb3RlY3RlZCB2b2lkIG1ha2VfcmVxdWVzdChzdHJpbmcgaG9zdG5hbWUpCit7CisgIHNlbmRfdWRwKCBJUExPT0tVUF9IT1NULCBJUExPT0tVUF9QT1JULCBob3N0bmFtZSsiXG4iICk7CisgIGlmIChzaXplb2YoY2FjaGUpID4gMTAwMCkKKyAgICByZXNldCgpOworICBjYWNoZVtob3N0bmFtZV09MDsgLy8gY2FjaGVkIHJlcXVlc3QsIGJ1dCB1bmtub3duIHJlc3VsdCAoeWV0KQorfQorCisvLyBIb3N0bmFtZW4gYXN5bmNocm9uIGF1ZmxvZXNlbi4KK3B1YmxpYyBzdHJpbmcgcmVzb2x2ZSggc3RyaW5nIGhvc3RuYW1lICkKK3sKKyAgaWYgKG1lbWJlcihjYWNoZSwgaG9zdG5hbWUpKQorICAgIHJldHVybiBjYWNoZVtob3N0bmFtZV07CisgIG1ha2VfcmVxdWVzdCggaG9zdG5hbWUgKTsKKyAgcmV0dXJuIDA7ICAvLyBsZWlkZXIuLi4KK30KKworLy8gUHJ1ZWZ1bmcsIG9iIHZvbiA8aXA+IFZlcmJpbmR1bmdlbiB6dSB1bnNlcmVyIElQIG5hY2ggPGxvY2FscG9ydD4KKy8vIHdlaXRlcmdlbGVpdGV0IHdlcmRlbi4KK3B1YmxpYyBpbnQgY2hlY2tfdG9yKHN0cmluZyBpcCwgaW50IGxvY2FscG9ydCkKK3sKKyAgc3RyaW5nICphcnI9ZXhwbG9kZShpcCwiLiIpOworICBpZiAoIXNpemVvZihhcnIpPT00KQorICAgIHJldHVybiAwOworICBzdHJpbmcgcmVxID0KKyAgICBzcHJpbnRmKCIlcy4lcy4lcy4lcy4lZC42MC4yNC43OS44Ny5pcC1wb3J0LmV4aXRsaXN0LnRvcnByb2plY3Qub3JnIiwKKyAgICAgICAgICAgIGFyclszXSxhcnJbMl0sYXJyWzFdLGFyclswXSxsb2NhbHBvcnQpOworICAKKyAgcmV0dXJuIHJlc29sdmUocmVxKSA9PSAiMTI3LjAuMC4yIjsKK30KKworLy8gUHJ1ZWZ1bmcsIG9iIDxpcD4gYXVmIGVpbmlnZW4gQmxhY2tsaXN0cyBzdGVodC4KK3B1YmxpYyBpbnQgY2hlY2tfZG5zYmwoc3RyaW5nIGlwKQoreworICBzdHJpbmcgKmFycj1leHBsb2RlKGlwLCIuIik7CisgIGlmICghc2l6ZW9mKGFycik9PTQpCisgICAgcmV0dXJuIDA7CisgIHN0cmluZyByZXEgPQorICAgIHNwcmludGYoIiVzLiVzLiVzLiVzLmRuc2JsLmRyb25lYmwub3JnIiwKKyAgICAgICAgICAgIGFyclszXSxhcnJbMl0sYXJyWzFdLGFyclswXSk7CisgIAorICByZXR1cm4gcmVzb2x2ZShyZXEpICE9IDA7Cit9CisKKy8qIHdpcmQgdm9tIG1hc3RlciBhdWZnZXJ1ZmVuLCB3ZW5uIGVpbmUgYW50d29ydCB2b20gZXh0ZXJuZW4KKyAqIGlwbG9va3VwIGRpZW5zdCBlaW50cnVkZWx0LgorICovCitwdWJsaWMgdm9pZCB1cGRhdGUoIHN0cmluZyB1ZHBfcmVwbHkgKQoreworICBpZiggcHJldmlvdXNfb2JqZWN0KCkhPW1hc3RlcigpICkgcmV0dXJuOworICBzdHJpbmcgKnJlcGx5ID0gZXhwbG9kZSh1ZHBfcmVwbHksIlxuIik7CisgIGlmKCBzaXplb2YocmVwbHkpPDMgKSByZXR1cm47CisKKyAgaWYgKHJlcGx5WzJdID09ICJVTktOT1dOIikKKyAgICBjYWNoZVtyZXBseVsxXV0gPSAwOworICBlbHNlCisgICAgY2FjaGVbcmVwbHlbMV1dID0gcmVwbHlbMl07Cit9CisKZGlmZiAtLWdpdCBhL3AvZGFlbW9uL2V2ZW50ZC5jIGIvcC9kYWVtb24vZXZlbnRkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgxZDM4YgotLS0gL2Rldi9udWxsCisrKyBiL3AvZGFlbW9uL2V2ZW50ZC5jCkBAIC0wLDAgKzEsMzM0IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gL3AvZGFlbW9uL2V2ZW50ZC5jIC0tIEV2ZW50IERpc3BhdGNoZXIKKy8vCisvLyAkSWQkCisjcHJhZ21hIHN0cmljdF90eXBlcyxzYXZlX3R5cGVzCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIG5vX3NoYWRvdworI3ByYWdtYSBwZWRhbnRpYworI3ByYWdtYSByYW5nZV9jaGVjaworCisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPGV2ZW50cy5oPgorCisvLyBGdWVyIFN0YXRpc3Rpa2VuCisjZGVmaW5lIFNUQVRJU1RJQ1MKKworI2RlZmluZSBIT01FKHgpIChfX1BBVEhfXygwKSt4KQorI2RlZmluZSBTVE9SRSBIT01FKCJzYXZlL2V2ZW50ZCIpCisKKworI2RlZmluZSBMT0coeCkgbG9nX2ZpbGUoIkVWRU5UUyIsIHNwcmludGYoXAorICAgICAgIlslc10gJXNcbiIsZHRpbWUodGltZSgpKSx4KSkKKy8vI2RlZmluZSBMT0dFVkVOVCh4LHkseikgbG9nX2ZpbGUoIkVWRU5UUyIsIHNwcmludGYoXAorLy8gICAgICAiWyVzXSBFdmVudCAlcyB0cmlnZ2VyZWQgYnkgJU8gKEFyZ3M6ICUuNDBPKVxuIixkdGltZSh0aW1lKCkpLHgseSx6KSkKKyNkZWZpbmUgTE9HRVZFTlQoeCx5LHopCisvLyNkZWZpbmUgTE9HUkVHSVNURVIodyx4LHkseikgbG9nX2ZpbGUoIkVWRU5UTElTVEVORVIiLHNwcmludGYoXAorLy8gICAgICAiWyVzXSAlTyAoRnVuOiAlLjI1cykgcmVnaXN0ZXJlZCBmb3IgJXMgYnkgJU9cbiIsZHRpbWUodGltZSgpKSx3LHgseSx6KSkKKyNkZWZpbmUgTE9HUkVHSVNURVIodyx4LHkseikKKy8vI2RlZmluZSBMT0dVTlJFR0lTVEVSKHgseSx6KSBsb2dfZmlsZSgiRVZFTlRMSVNURU5FUiIsc3ByaW50ZihcCisvLyAgICAgICJbJXNdICVPIHdhcyB1bnJlZ2lzdGVyZWQgZnJvbSAlcyBieSAlT1xuIixkdGltZSh0aW1lKCkpLHgseSx6KSkKKyNkZWZpbmUgTE9HVU5SRUdJU1RFUih4LHkseikKKy8vI2RlZmluZSBMT0dFVkVOVEZJTklTSCh4LHkpIGxvZ19maWxlKCJFVkVOVFMiLCBzcHJpbnRmKFwKKy8vICAgICAgIlslc10gRXZlbnQgJXMgKHRyaWdnZXJlZCBieSAlTykgZmluaXNoZWRcbiIsZHRpbWUodGltZSgpKSx4LHkpKQorI2RlZmluZSBMT0dFVkVOVEZJTklTSCh4LHkpCisKKyNpZm5kZWYgREVCVUcKKyNkZWZpbmUgREVCVUcoeCkgIGlmIChmaW5kX3BsYXllcigiemVzc3RyYSIpKVwKKyAgICAgICAgICB0ZWxsX29iamVjdChmaW5kX3BsYXllcigiemVzc3RyYSIpLFwKKyAgICAgICAgICAgICAgICAgICAgICAiRURCRzogIit4KyJcbiIpCisjZW5kaWYKKworI2RlZmluZSBUSUNLX1JFU0VSVkUgMzAwMDAwCisjZGVmaW5lIFRJQ0tTUEVSQ0FMTEJBQ0sgMzAwMDAKKworLy8gSW5kaXplcyBmdWVyIENhbGxiYWNrLUluZm9zIChldmVudHMsIGFjdGl2ZSkKKyNkZWZpbmUgQ0JfRlVOICAgICAgICAwCisjZGVmaW5lIENCX0NMT1NVUkUgICAgMQorI2RlZmluZSBDQl9PQkpFQ1QgICAgIDIKKy8vIEluZGl6ZXMgZnVlciBQZW5kaW5nCisjZGVmaW5lIFBfRUlEICAgICAgICAgMAorI2RlZmluZSBQX1RSSUdPQiAgICAgIDEKKyNkZWZpbmUgUF9UUklHT0JOQU1FICAyCisjZGVmaW5lIFBfQVJHUyAgICAgICAgMworI2RlZmluZSBQX1RJTUUgICAgICAgIDQKKworLy8gSW5kaXplcyBmdWVyIEFjdGl2ZQorI2RlZmluZSBBX0VJRCAgICAgICAgIDAKKyNkZWZpbmUgQV9UUklHT0IgICAgICAxCisjZGVmaW5lIEFfVFJJR09CTkFNRSAgMgorI2RlZmluZSBBX0FSR1MgICAgICAgIDMKKyNkZWZpbmUgQV9MSVNURU5FUlMgICA0CisjZGVmaW5lIEFfVElNRSAgICAgICAgNQorCisvKiBhbGxlIGV2ZW50cywgZGllIGVyIGtlbm50LgorICAgRGF0ZW5zdHJ1a3R1ciBldmVudHM6CisgICAoW2lkOihbb2JuYW1lOmZ1bjtjbG9zdXJlO29iamVjdCwgLi4uIF0pLAorICAgICBpZDI6IChbLi4uLl0pLAorICAgXSkgKi8KK21hcHBpbmcgZXZlbnRzPShbXSk7CisvKiBhYnp1YXJiZWl0ZW5kZSBFdmVudHMsIERhdGVuc3RydWt0dXI6CisgICAoeyAoe2lkLCB0cmlnb2IsIHRyaWdvYm5hbWUsIGFyZ3N9KSwgCisgICAgICAoe2lkMiwgdHJpZ29iLCB0cmlnb2JuYW1lLCBhcmdzfSksIC4uLiB9KSAgKi8KK25vc2F2ZSBtaXhlZCBwZW5kaW5nPSh7fSk7CisvKiBEZXIgZ2VyYWRlIGFrdGl2ZSBFdmVudCwgZGVyIHdpcmQgZ2VyYWRlIGFiZ2VhcmJlaXRldC4KKyAgIERhdGVuc3RydWt0dXIgYWN0aXZlOgorICAgKHsgaWQ6dHJpZ29iO3RyaWdvYm5hbWU7YXJnczsoW29ibmFtZTpmdW47Y2xvc3VyZTtvYmplY3QsIC4uLl0pLCB0cmlndGltZX0pCisqLworbm9zYXZlIG1peGVkIGFjdGl2ZT0oe30pOworCitpbnQgbGFzdGJvb3Q7IC8vIFplaXRzdGVtcGVsIGRlcyBsZXR6dGVuIFJlYm9vdHMKKy8vIEZsYWcsIHdlbm4gZ2VzZXR6dCwgemVyc3RvZXJ0IHNpY2ggZGVyIEV2ZW50ZCwgd2VubiBrZWluZSBFdmVudHMKKy8vIGFienVhcmJlaXRlbiBzaW5kLgorbm9zYXZlIGludCB1cGRhdGVtZTsgCisKKy8vIGVpbmZhY2hlIFN0YXRpc3RpaywgZ2VzcGVpY2hlcnQgd2lyZCBlaW4gSGlzdG9ncmFtbS4gS0V5cyBzaW5kIGRpZQorLy8gWmVpdGRpZmZlcmVuemVuIHp3c2NoZW4gRWludHJhZ2VuIHVuZCBFcmxlZGlnZW4gZGVzIEV2ZW50cywgVmFsdWVzIGRpZQorLy8gSGFldWZpZ2tlaXRlbi4KK25vc2F2ZSBtYXBwaW5nIHN0YXRzPShbXSk7CisKKworcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc19ldmVudHMoKTsKK3Byb3RlY3RlZCB2b2lkIHNhdmVfbWUoKTsKK3ZhcmFyZ3MgaW50IHJlbW92ZShpbnQgc2lsZW50KTsKKworLy8gaXN0IGRlciBFdmVudC1UeXAgImVpZCIgc2Nob24gYmVrYW5udCwgZC5oLiBnaWIgZXMgbWluLiAxIExpc3RlbmVyPworLy8gTGllZmVydCBBbnphaGwgZGVyIExpc3RlbmVyIHp1cnVlY2suCitpbnQgQ2hlY2tFdmVudElEKHN0cmluZyBlaWQpIHsKKyAgICBpZiAoIXN0cmluZ3AoZWlkKSB8fCAhbWVtYmVyKGV2ZW50cyxlaWQpKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4oc2l6ZW9mKGV2ZW50c1tlaWRdKSk7Cit9CisKKy8vIGVudHNjaGVpZGV0LCBvYiBlaW4gT2JqZWt0IGZ1ZXIgZWluZW4gRXZlbnQgZWluZ2V0cmFnZW4gd2VyZGVuIGRhcmYuIFp1bQorLy8gVWViZXJzY2hyZWliZW4gaW4gZ2VlcmJ0ZW4gRGlzcGF0Y2hlcm4sIGluIGRpZXNlbSBTY2hlZHVsZXIgc2luZCBhbGxlCisvLyBFdmVudHMgb2VmZmVudGxpY2guIEJla29tbXQgZGllIEV2ZW50LUlELCBkYXMgZWluenV0cmFnZW5kZSBPYmpla3QgdW5kIGRhcworLy8gZWludHJhZ2VuZGUgT2JqZWt0IHVlYmVyZ2ViZW4uCisvLyAxIGZ1ZXIgRXJsYXVibmlzLCAwIHNvbnN0LgorcHJvdGVjdGVkIGludCBhbGxvd2VkKHN0cmluZyBlaWQsIG9iamVjdCBvYiwgb2JqZWN0IHBvKSB7CisgICAgcmV0dXJuKDEpOworfQorCisvLyBlbnRzY2hlaWRldCwgb2IgZWluIE9iamVrdCBlaW5lbiBiZXN0aW1tdGVuIEV2ZW50IHRyaWdnZXJuIGRhcmYuIFp1bQorLy8gVWViZXJzY2hyZWliZW4gaW4gZ2VlcmJ0ZW4gRGlzcGF0Y2hlcm4sIGluIGRpZXNlbSBTY2hlZHVsZXIgc2luZCBhbGxlCisvLyBFdmVudHMgb2VmZmVudGxpY2guIEJla29tbXQgZGllIEV2ZW50LUlEIHVuZCBkYXMgdHJpZ2dlcm5kZSBPYmpla3QKKy8vIHVlYmVyZ2ViZW4uCisvLyAxIGZ1ZXIgRXJsYXVibmlzLCAwIHNvbnN0LgorcHJvdGVjdGVkIGludCBhbGxvd2VkdHJpZ2dlcihzdHJpbmcgZWlkLCBvYmplY3QgdHJpZ2dlcikgeworICAgIHJldHVybigxKTsKK30KKworLy8gcmVnaXN0cmllcnQgc2ljaCBmdWVyIGVpbmVuIEV2ZW50LiBXZW5uIGVzIGRlbiBiaXNoZXIgbmljaHQgZ2lidCwgd2lyZCBlcgorLy8gaW1wbGl6aXQgZXJ6ZXVndC4gV2VubiBkYXMgT2JqZWt0IG9iIHNjaG9uIGFuZ2VtZWxkZXQgd2FyLCB3aXJkIGRlcgorLy8gYmlzaGVyaWdlIEVpbnRyYWcgdWViZXJzY2hyaWViZW4uCisvLyAxIGJlaSBFcmZvbGcsIDw9MCBiZWkgTWlzc2VyZm9sZworaW50IFJlZ2lzdGVyRXZlbnQoc3RyaW5nIGVpZCwgc3RyaW5nIGZ1biwgb2JqZWN0IG9iKSB7CisgICAgb2JqZWN0IHBvOworICAgIGlmICghc3RyaW5ncChlaWQpIHx8ICFzdHJpbmdwKGZ1bikgfHwgCisgICAgICAgICFvYmplY3RwKG9iKSB8fCAhb2JqZWN0cChwbz1wcmV2aW91c19vYmplY3QoKSkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoIWFsbG93ZWQoZWlkLCBvYiwgcG8pKSByZXR1cm4gLTI7CisgICAgY2xvc3VyZSBjbD1zeW1ib2xfZnVuY3Rpb24oZnVuLG9iKTsKKyAgICBpZiAoIWNsb3N1cmVwKGNsKSkKKyAgICAgICAgcmV0dXJuIC0zOworICAgIGlmICghbWFwcGluZ3AoZXZlbnRzW2VpZF0pKQorICAgICAgICBldmVudHNbZWlkXT1tX2FsbG9jYXRlKDEsMyk7IC8vIDMgV2VydGUgcHJvIEtleQorICAgIGV2ZW50c1tlaWRdKz0oW29iamVjdF9uYW1lKG9iKTpmdW47Y2w7b2JdKTsKKy8vICAgIGlmIChmaW5kX2NhbGxfb3V0KCMnc2F2ZV9tZSk9PS0xKQorLy8gICAgICAgIGNhbGxfb3V0KCMnc2F2ZV9tZSwxNSk7CisgICAgTE9HUkVHSVNURVIob2IsZnVuLGVpZCxwbyk7CisgICAgcmV0dXJuIDE7Cit9CisKKy8vIGVudGZlcm50IGRhcyBPYmpla3QgYWxzIExpc3RlbmVyIGF1cyBkZW0gRXZlbnQgZWlkCisvLyBNZWhyIG9kZXIgd2VuaWdlciBvcHRpb25hbCwgd2VubiBlaW4gZXZlbnQgdmVyYXJiZWl0ZXQgd2lyZCB1bmQgZGFzIE9iamVrdAorLy8gaXN0IG5pY2h0IG1laHIgYXVmZmluZGJhciwgd2lyZCBlcyBlYmVuZmFsbHMgZ2Vsb2VzY2h0LiBCZWkgc2VsdGVuCisvLyBnZXRyaWdnZXJ0ZW4gRXZlbnRzIG11ZWxsdCBlcyBhYmVyIGJpcyBkYWhpbiBkZW4gU3BlaWNoZXIgdm9sbC4KKy8vICsxIGZ1ZXIgRXJmb2xnLCA8PSAwIGZ1ZXIgTWlzc2VyZm9sZworaW50IFVucmVnaXN0ZXJFdmVudChzdHJpbmcgZWlkLCBvYmplY3Qgb2IpIHsKKyAgICBvYmplY3QgcG87CisgICAgaWYgKCFzdHJpbmdwKGVpZCkgfHwgIW9iamVjdHAob2IpIHx8IAorICAgICAgICAhb2JqZWN0cChwbz1wcmV2aW91c19vYmplY3QoKSkgfHwgIW1hcHBpbmdwKGV2ZW50c1tlaWRdKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHN0cmluZyBvbmFtZT1vYmplY3RfbmFtZShvYik7CisgICAgaWYgKCFtZW1iZXIoZXZlbnRzW2VpZF0sb25hbWUpKSAKKyAgICAgICAgcmV0dXJuIC0yOworICAgIG1fZGVsZXRlKGV2ZW50c1tlaWRdLG9uYW1lKTsKKyAgICBpZiAoIXNpemVvZihldmVudHNbZWlkXSkpCisgICAgICAgIG1fZGVsZXRlKGV2ZW50cyxlaWQpOworICAgIC8vIGF1cyBha3RpdmVtIEV2ZW50IGF1c3RyYWdlbiwgZmFsbHMgZXMgZHJpbiBzZWluIHNvbGx0ZS4KKyAgICBpZiAoc2l6ZW9mKGFjdGl2ZSkgJiYgYWN0aXZlW0FfRUlEXSA9PSBlaWQpCisgICAgeworICAgICAgbV9kZWxldGUoYWN0aXZlW0FfTElTVEVORVJTXSwgb2JqZWN0X25hbWUob2IpKTsKKyAgICB9CisvLyAgICBpZiAoZmluZF9jYWxsX291dCgjJ3NhdmVfbWUpPT0tMSkKKy8vICAgICAgY2FsbF9vdXQoIydzYXZlX21lLDE1KTsKKyAgICBMT0dVTlJFR0lTVEVSKG9iLCBlaWQsIHBvKTsKKyAgICByZXR1cm4gMTsKK30KKworLy8gTG9lc3QgZWluZW4gRXZlbnQgYXVzLgorLy8gMSBmdWVyIEVyZm9sZywgPD0gMCBmdWVyIE1pc3NlcmZvbGcKK3ZhcmFyZ3MgaW50IFRyaWdnZXJFdmVudChzdHJpbmcgZWlkLCBtaXhlZCBhcmdzKSB7CisgICAgb2JqZWN0IHRyaWdnZXI7CisgICAgaWYgKCFzdHJpbmdwKGVpZCkgfHwgCisgICAgICAgICFvYmplY3RwKHRyaWdnZXI9cHJldmlvdXNfb2JqZWN0KCkpKSAKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICghYWxsb3dlZHRyaWdnZXIoZWlkLCB0cmlnZ2VyKSkgcmV0dXJuIC0yOworICAgIGlmICghbWVtYmVyKGV2ZW50cyxlaWQpKSByZXR1cm4gLTM7CisgICAgaWYgKHNpemVvZihwZW5kaW5nKSA+IF9fTUFYX0FSUkFZX1NJWkVfXy81KQorICAgICAgICByZXR1cm4gLTQ7CisgICAgcGVuZGluZys9KHsgKHtlaWQsdHJpZ2dlcixvYmplY3RfbmFtZSh0cmlnZ2VyKSwgYXJncywgdGltZSgpfSkgfSk7CisgICAgaWYgKGZpbmRfY2FsbF9vdXQoIydwcm9jZXNzX2V2ZW50cykgPT0gLTEpCisgICAgICBjYWxsX291dCgjJ3Byb2Nlc3NfZXZlbnRzLDApOworICAgIExPR0VWRU5UKGVpZCx0cmlnZ2VyLGFyZ3MpOworICAgIC8vREVCVUcoc3ByaW50ZigiJU8iLHBlbmRpbmcpKTsKKyAgICByZXR1cm4gMTsKK30KKworcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc19ldmVudHMoKSB7CisgIC8vIGVyc3RtYWwgd2llZGVyIG5lbiBjYWxsX291dCBlaW50cmFnZW4uCisgIGNhbGxfb3V0KCMncHJvY2Vzc19ldmVudHMsIDEpOworCisgIC8vIHNvbGFuZ2UgdWViZXIgYWN0aXZlIHVuZCBwZW5kaW5nIGxhdWZlbiwgYmlzIGtlaW5lIFRpY2tzIG1laHIgZGEgc2luZCwKKyAgLy8gYnp3LiBpbiBkZXIgU2NobGVpZmUgYWJnZWJyb2NoZW4gd2lyZCwgd2VpbCBrZWluZSBFdmVudHMgbWVociBkYSBzaW5kLgorICB3aGlsZShnZXRfZXZhbF9jb3N0KCkgPiBUSUNLX1JFU0VSVkUpIHsKKyAgICAvLyBIQiBhYnNjaGFsdGVuLCB3ZW5uIG5peCB6dSB0dW4gaXN0LgorICAgIGlmICghc2l6ZW9mKGFjdGl2ZSkpIHsKKyAgICAgIGlmICghc2l6ZW9mKHBlbmRpbmcpKSB7CisgICAgICAgIHJlbW92ZV9jYWxsX291dCgjJ3Byb2Nlc3NfZXZlbnRzKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAvLyBzY2hlaW50IG5vY2ggbWluLiBlaW4gRWludHJhZyBpbiBwZW5kaW5nIHp1IHNlaW4sIG5hY2ggYWN0aXZlIGtvcGllcmVuLAorICAgICAgLy8gcGx1cyBkaWUgQ2FsbGJhY2stSW5mb3MgYXVzIGV2ZW50cworICAgICAgYWN0aXZlPSh7cGVuZGluZ1swXVtQX0VJRF0sCisgICAgICAgICAgICAgICBwZW5kaW5nWzBdW1BfVFJJR09CXSxwZW5kaW5nWzBdW1BfVFJJR09CTkFNRV0sCisgICAgICAgICAgICAgICBwZW5kaW5nWzBdW1BfQVJHU10sCisgICAgICAgICAgICAgICBkZWVwX2NvcHkoZXZlbnRzW3BlbmRpbmdbMF1bUF9FSURdXSksCisgICAgICAgICAgICAgICBwZW5kaW5nWzBdW1BfVElNRV0gfSk7CisKKyAgICAgIGlmIChzaXplb2YocGVuZGluZyk+MSkKKyAgICAgICAgcGVuZGluZz1wZW5kaW5nWzEuLl07IC8vIHVuZCBhdXMgcGVuZGluZyBlcnN0bWFsIGxvZXNjaGVuLiA7LSkKKyAgICAgIGVsc2UKKyAgICAgICAgcGVuZGluZz0oe30pOworICAgICAgLy9ERUJVRyhzcHJpbnRmKCJQZW5kaW5nOiAlTyIscGVuZGluZykpOworICAgICAgLy9ERUJVRyhzcHJpbnRmKCJBY3RpdmU6ICVPIixhY3RpdmUpKTsKKyAgICB9CisgICAgLy8gamV0enRlIGRlbiBha3RpdmVuIEV2ZW50IGFiYXJiZWl0ZW4uCisgICAgLy8gSW5mb3MgYXVzIGFjdGl2ZSBob2xlbi4uLgorICAgIHN0cmluZyBlaWQ9YWN0aXZlW0FfRUlEXTsKKyAgICBvYmplY3QgdHJpZ29iPWFjdGl2ZVtBX1RSSUdPQl07CisgICAgc3RyaW5nIHRyaWdvYm5hbWU9YWN0aXZlW0FfVFJJR09CTkFNRV07CisgICAgbWl4ZWQgYXJncz1hY3RpdmVbQV9BUkdTXTsKKyAgICBtYXBwaW5nIGxpc3RlbmVycz1hY3RpdmVbQV9MSVNURU5FUlNdOworICAgIC8vIHVuZCB1ZWJlciBhbGxlIExpc3RlbmVyIGl0ZXJpZXJlbgorICAgIGZvcmVhY2goc3RyaW5nIG9ibmFtZSwgc3RyaW5nIGZ1biwgY2xvc3VyZSBjbCwgb2JqZWN0IGxpc3RlbmVyOiAKKyAgICAgICAgICAgICAgICAgbGlzdGVuZXJzKSB7CisgICAgICAvLyBlcnN0IHBydWVmZW4sIG9iIG5vY2ggZ2VudWcgVGlja3MgZGEgc2luZC4gd2VubiBuaWNodCwgZ2VodHMgaW0KKyAgICAgIC8vIG5hZWNoc3RlbiBaeWtsdXMgd2VpdGVyLgorICAgICAgaWYgKGdldF9ldmFsX2Nvc3QoKSA8IFRJQ0tfUkVTRVJWRSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICAvLyB3ZW5uIENsb3N1cmUgdW5kL29kZXIgenVnZWhvZXJpZ2VzIE9iamVrdCBuaWNodCBleGlzdGllcmVuLCB2ZXJzdWNoZW4KKyAgICAgIC8vIHdpciBlcnN0bWFsLCBlcyB3aWVkZXJ6dWZpbmRlbi4gOy0pCisgICAgICBpZiAoIW9iamVjdHAocXVlcnlfY2xvc3VyZV9vYmplY3QoY2wpKSkgeworICAgICAgICBpZiAob2JqZWN0cChsaXN0ZW5lcj1maW5kX29iamVjdChvYm5hbWUpKSAmJgorICAgICAgICAgICAgY2xvc3VyZXAoY2w9c3ltYm9sX2Z1bmN0aW9uKGZ1bixsaXN0ZW5lcikpKSB7CisgICAgICAgICAgICAvL2dla2xhcHB0LCBhdWNoIGluIGV2ZW50cyB3aWVkZXIgZXJnYWVuemVuCisgICAgICAgICAgICBldmVudHNbZWlkXVtvYm5hbWUsQ0JfQ0xPU1VSRV09Y2w7CisgICAgICAgICAgICBldmVudHNbZWlkXVtvYm5hbWUsQ0JfT0JKRUNUXT1saXN0ZW5lcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAvLyBPYmpla3QgbmljaHQgZ2VmdW5kZW4gb2RlciBDbG9zdXJlIG5pY2h0IGVyemV1Z2JhciwgYXVzdHJhZ2VuCisgICAgICAgICAgbV9kZWxldGUobGlzdGVuZXJzLG9ibmFtZSk7CisgICAgICAgICAgLy8gdW5kIGF1cyBldmVudHMgYXVzdHJhZ2VuLgorICAgICAgICAgIG1fZGVsZXRlKGV2ZW50c1tlaWRdLG9ibmFtZSk7CisgICAgICAgICAgLy8gdW5kIG5hZWNoc3RlciBEdXJjaGdhbmcKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLy8gT2JqZWt0IG5vY2ggZGEsIENsb3N1cmUgd2lyZCBhbHMgYXVzZnVlaHJiYXIgYmV0cmFjaHRldC4gCisgICAgICBjYXRjaChsaW1pdGVkKCMnZnVuY2FsbCwoe1RJQ0tTUEVSQ0FMTEJBQ0t9KSxjbCxlaWQsdHJpZ29iLGFyZ3MpO3B1Ymxpc2gpOworICAgICAgLy8gZmVydGlnIG1pdCBkaWVzZW0gT2JqZWt0LgorICAgICAgbV9kZWxldGUobGlzdGVuZXJzLG9ibmFtZSk7CisgICAgfQorICAgIC8vIFN0YXRpc3Rpaz8gRGlmZmVyZW56ZW4gendpc2NoZSBFcmxlZGlndW5nc3plaXQgdW5kIEVpbnRyYWdzemVpdCBiaWxkZW4KKyAgICAvLyBkaWUgS2V5cywgZGllIFZhbHVlcyB3ZXJkZW4gZWluZmFjaCBob2NoZ2V6YWVobHQuCisjaWZkZWYgU1RBVElTVElDUworICAgIHN0YXRzW3RpbWUoKS1hY3RpdmVbQV9USU1FXV0rKzsKKyNlbmRpZiAvLyBTVEFUSVNUSUNTCisgICAgLy8gb2ssIGZlcnRpZyBtaXQgYWN0aXZlLgorICAgIGFjdGl2ZT0oe30pOworICAgIC8vREVCVUcoc3ByaW50ZigiRmVydGlnOiAlTyAlTyIsZWlkLCB0cmlnb2JuYW1lKSk7CisgICAgTE9HRVZFTlRGSU5JU0goZWlkLHRyaWdvYm5hbWUpOworICB9ICAvLyB3aGlsZShnZXRfZXZhbF9jb3N0KCkgPiBUSUNLX1JFU0VSVkUpCisKKyAgLy8gU29sbCBkaWVzIERpbmcgbmV1Z2VsYWRlbiB3ZXJkZW4/IFdlbm4gamEsIFNlbGJzdHplcnN0b2VydW5nLCB3ZW5uIGtlaW5lCisgIC8vIEV2ZW50cyBtZWhyIGRhIHNpbmQuCisgIGlmICh1cGRhdGVtZSAmJiAhc2l6ZW9mKGFjdGl2ZSkgJiYgIXNpemVvZihwZW5kaW5nKSkgeworICAgIERFQlVHKHNwcmludGYoIlVwZGF0ZSByZXF1ZXN0ZWRcbiIpKTsKKyAgICByZW1vdmUoMSk7CisgIH0KK30KKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkgeworICAgIHNldGV1aWQoZ2V0dWlkKE1FKSk7CisgICAgcmVzdG9yZV9vYmplY3QoU1RPUkUpOworICAgIGlmIChsYXN0Ym9vdCAhPSBfX0JPT1RfVElNRV9fKSB7CisgICAgICAvLyBPaC4gUmVib290IHdhci4uLiBBbGxlIEV2ZW50cyB3ZWdzY2htZWlzc2VuIChlcyBrb2VubnRlbiB6d2FyIGRpZQorICAgICAgLy8gRXZlbnRhbm1lbGR1bmdlbiB2b24gQlBzIHVlYmVybGViZW4sIGFiZXIgYXVjaCBkaWUgc29sbGVuIHNpY2ggbGllYmVyCisgICAgICAvLyBpbSBjcmVhdGUoKSBhbm1lbGRlbi4pCisgICAgICBldmVudHM9KFtdKTsKKyAgICAgIGxhc3Rib290PV9fQk9PVF9USU1FX187OworICAgIH0KKyAgICBMT0coIkV2ZW50LURpc3BhdGNoZXIgbG9hZGVkIik7Cit9CisKKworcHJvdGVjdGVkIHZvaWQgc2F2ZV9tZSgpIHsKKyAgc2F2ZV9vYmplY3QoU1RPUkUpOworfQorCit2YXJhcmdzIGludCByZW1vdmUoaW50IHNpbGVudCkgeworICAgIHNhdmVfbWUoKTsKKyAgICBERUJVRyhzcHJpbnRmKCJyZW1vdmUoKSBjYWxsZWQgYnkgJU8gLSBkZXN0cnVjdGluZ1xuIiwgcHJldmlvdXNfb2JqZWN0KCkpKTsgCisgICAgTE9HKHNwcmludGYoInJlbW92ZSBjYWxsZWQgYnkgJU8gLSBkZXN0cnVjdGluZyIscHJldmlvdXNfb2JqZWN0KCkpKTsKKyAgICBkZXN0cnVjdChNRSk7CisgICAgcmV0dXJuIDE7Cit9CisKK3B1YmxpYyB2b2lkIHJlc2V0KCkgeworICBpZiAodXBkYXRlbWUgJiYgIXNpemVvZihhY3RpdmUpICYmICFzaXplb2YocGVuZGluZykpIHsKKyAgICBERUJVRyhzcHJpbnRmKCJVcGRhdGUgcmVxdWVzdGVkXG4iKSk7CisgICAgcmVtb3ZlKDEpOworICB9Cit9CisKKworLy8gZnVlciBEZWJ1Z3p3ZWNrZS4gSW50ZXJmYWNlIHVuZCBWZXJoYWx0ZW4ga2FubiBzaWNoIGplZGVyemVpdCBvaG5lCisvLyBWb3Jhbmt1ZW5kaWd1bmcgYWVuZGVybi4KK21hcHBpbmcgUXVlcnlFdmVudHMoKSB7CisgICAgcmV0dXJuKGRlZXBfY29weShldmVudHMpKTsKK30KKworbWl4ZWQgUXVlcnlQZW5kaW5nKCkgeworICAgIHJldHVybihkZWVwX2NvcHkocGVuZGluZykpOworfQorCittaXhlZCBRdWVyeUFjdGl2ZSgpIHsKKyAgICByZXR1cm4oZGVlcF9jb3B5KGFjdGl2ZSkpOworfQorCittYXBwaW5nIFF1ZXJ5U3RhdHMoKSB7CisgICAgcmV0dXJuKGNvcHkoc3RhdHMpKTsKK30KKworaW50IFVwZGF0ZU1lKGludCBmbGFnKSB7CisgICAgdXBkYXRlbWU9ZmxhZzsKKyAgICBpZiAoZmluZF9jYWxsX291dCgjJ3Byb2Nlc3NfZXZlbnRzKT09LTEpCisgICAgICByZXNldCgpOworICAgIHJldHVybiBmbGFnOworfQorCmRpZmYgLS1naXQgYS9wL2RhZW1vbi9maW5nZXIuYyBiL3AvZGFlbW9uL2Zpbmdlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YjYwMmEKLS0tIC9kZXYvbnVsbAorKysgYi9wL2RhZW1vbi9maW5nZXIuYwpAQCAtMCwwICsxLDQ0MyBAQAorLyogYSBmaW5nZXIKKyAqIE9yaWdpbmFsIChjKSAxNC4wMy4xOTkzIGJ5IFRhdWJlIEBOaWdodGZhbGwKKyAqIFVtc2V0enVuZyBmdWVyIE1vcmdlbmdyYXVlbiAwOS4wOC4xOTkzIGJ5IExvY28KKworICAgVmVyd2VuZHVuZyBhdXNzZXJoYWxiIHZvbiBNb3JnZW5ncmF1ZW4gaXN0IGdlc3RhdHRldCB1bnRlciBmb2xnZW5kZW4KKyAgIEJlZGluZ3VuZ2VuOgorICAgLSBCZW51dHp1bmcgZXJmb2xndCBhdWYgZWlnZW5lIEdlZmFoci4gSmVnbGljaGUgVmVyYW50d29ydHVuZyB3aXJkCisgICAgIGFiZ2VsZWhudC4KKyAgIC0gQXVjaCBpbiB2ZXJhZW5kZXJ0ZW4gb2RlciBhYmdlbGVpdGV0ZW4gT2JqZWt0ZW4gbXVzcyBlaW4gSGlud2VpcyBhdWYKKyAgICAgZGllIEhlcmt1bmZ0IGVyaGFsdGVuIGJsZWliZW4uCisgICBFaW4gVXBkYXRlLVNlcnZpY2UgYmVzdGVodCBuaWNodC4KKworICogMjkuT2t0IDE5OTMgU2VoZXJ2ZXJzaW9uLgorICogc3BhZXRlciBhdWNoIGZ1ZXIgZXh0ZXJuZW4gQXVmcnVmIHZlcndlbmRiYXIgZ2VtYWNodAorICogMTMuT2t0IC5wbGFuIHVuZCAucHJvamVjdCBrb2VubmVuIGF1Y2ggaW4gfmxvY28vcGxhbnMgc2Vpbi4KKyAqIDE1LkphbiAxOTk0IGFuZ2VwYXNzdCBhbiBuZXVlcyBTcGVpY2hlcmZvcm1hdAorICogMDItMDUuRGV6OTQgLW4sIC1wCisgKgorICogR2VsZWdlbnRsaWNoIG1pbm9yIGNoYW5nZXMsIHp1bGV0enQgMDQuT2t0Ljk1CisgKi8KKworI3ByYWdtYSBzdHJvbmdfdHlwZXMsc2F2ZV90eXBlcworI3ByYWdtYSBub19jbG9uZSwgbm9fc2hhZG93CisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8bmV3X3NraWxscy5oPgorI2luY2x1ZGUgPHVzZXJpbmZvLmg+CisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNkZWZpbmUgSEJJTlQgICAgMiAgIC8qIGludGVydmFsIGJldHdlZW4gdHdvIGhlYXJ0X2JlYXRzIGluIHNlY29uZHMgKi8KKyNkZWZpbmUgTUlOSURMRSA2MCAgIC8qIG1pbmltdW0gaWRsZSB0aW1lIGluIHNlY29uZHMgdG8gYmUgc3RhdGVkIGlkbGUgKi8KKyNkZWZpbmUgVEJBTklTSF9FWFRSQUNUIDcxLi4gIC8qIERlciBiZW5vZXRpZ3RlIFRlaWwgZGVzIFRCYW5pc2gtc3RyaW5ncyAqLworCisjZGVmaW5lIFRQIHRoaXNfcGxheWVyKCkKKyNkZWZpbmUgd2l6IChsb2NhbCAmJiBJU19MRUFSTkVSKFRQKSkKKyNkZWZpbmUgc2VlciAobG9jYWwgJiYgSVNfU0VFUihUUCkpCisjZGVmaW5lIElOICgocHJvcGVydGllc1tQX0dFTkRFUl09PTIpPyJpbiI6IiIpCisKKworI2RlZmluZSBGTEFHX05PUExBTiAxCisjZGVmaW5lIEZMQUdfTE9ORyAyCisjZGVmaW5lIEZMQUdfU1BPTlNPUiA0CisjZGVmaW5lIEZMQUdfVklTX0xPR09VVCA4CisjZGVmaW5lIEZMQUdfQVZBVEFSIDE2CisKKworbWFwcGluZyBwcm9wZXJ0aWVzOworaW50IGFnZSxpbnZpcyxoY19wbGF5OworaW50IGZpbGV0aW1lOworbWFwcGluZyByZWxhdGl2ZXM7CisKKwordm9pZCBjcmVhdGUoKQoreworICBzZXRldWlkKGdldHVpZCgpKTsKKyAgZmlsZXRpbWU9MDsKK30KKworCitzdHJpbmcgdGltZWRpZmYoaW50IHRpbWUpCit7CisgIHN0cmluZyByZXQ7CisKKyAgcmV0PSIiOworICBpZiAoIHRpbWUgPj0gODY0MDAqMzY1ICkgeworICAgIHJldCs9dGltZS8oODY0MDAqMzY1KSsiYSAiOworICAgIHRpbWUlPSg4NjQwMCozNjUpOworICB9CisgIGlmKHRpbWU+PTg2NDAwKSB7CisgICAgcmV0Kz10aW1lLzg2NDAwKyJkICI7CisgICAgdGltZSU9ODY0MDA7CisgIH0KKyAgaWYodGltZTwzNjAwMCkgcmV0Kz0iMCI7CisgIHJldCs9dGltZS8zNjAwKyI6IjsKKyAgdGltZSU9MzYwMDsKKyAgaWYodGltZTw2MDApIHJldCs9IjAiOworICByZXQrPXRpbWUvNjArIjoiOworICB0aW1lJT02MDsKKyAgaWYodGltZTwxMCkgcmV0Kz0iMCI7CisgIHJldCs9dGltZSsiIjsKKyAgcmV0dXJuIHJldDsKK30KKworc3RyaW5nIHNwb25zb3Jpbmcoc3RyaW5nIG5hbWUpCit7CisgIGludCBpLHc7CisgIHN0cmluZyAqcyxzMixzMyxzNDsKKyAgLy8gRGF0ZW4gZWlubGVzZW4sIHdlbm4gZGllIGRhdGVuIGFlbHRlciBhbHMgMSBUYWcgc2luZCBvZGVyIHNpY2gKKyAgLy8gL2xvZy9TUE9OU09SUyBnZWFlbmRlcnQgaGF0LgorICBpZiAoKHRpbWUoKSA+IGZpbGV0aW1lKzg2NDAwKSB8fAorICAgICAgZmlsZXRpbWUhPWZpbGVfdGltZSgiL2xvZy9TUE9OU09SIikpIAorICB7CisgICAgICByZWxhdGl2ZXM9bV9hbGxvY2F0ZSgwLDIpOworICAgICAgZmlsZXRpbWU9ZmlsZV90aW1lKCIvbG9nL1NQT05TT1IiKTsKKyAgICAgIHM9ZXhwbG9kZShyZWFkX2ZpbGUoIi9sb2cvU1BPTlNPUiIpLCJcbiIpOworICAgICAgZm9yZWFjaChzdHJpbmcgc3RyOiBzKSB7IAorCSAgc3NjYW5mKHN0ciwiJXM6ICVzIG1hY2h0ICVzIHp1bSBMZWFybmVyLiIsczIsczMsczQpOworCSAgaWYgKElTX0xFQVJORVIobG93ZXJfY2FzZShzMykpICYmIElTX0xFQVJORVIobG93ZXJfY2FzZShzNCkpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICByZWxhdGl2ZXNbbG93ZXJfY2FzZShzNCksMF09czM7CisgICAgICAgICAgICAgczM9bG93ZXJfY2FzZShzMyk7CisgICAgICAgICAgICAgczQrPSIgKCIrcXVlcnlfd2l6X2xldmVsKGxvd2VyX2Nhc2UoczQpKSsiKSI7CisgICAgICAgICAgICAgaWYgKCFyZWxhdGl2ZXNbczMsMV0pIHJlbGF0aXZlc1tzMywxXT0oe3M0fSk7CisgICAgICAgICAgICAgZWxzZSByZWxhdGl2ZXNbczMsMV0rPSh7czR9KTsKKyAgICAgICAgICB9CisgICAgICB9ICAKKyAgfQorICBzMj0iIjsKKyAgaWYgKHJlbGF0aXZlc1tuYW1lLDBdKQorICAgIHMyKz0iVm9yZmFocmU6ICAgICAiK3JlbGF0aXZlc1tuYW1lLDBdKyJcbiI7CisgIGlmIChyZWxhdGl2ZXNbbmFtZSwxXSkKKyAgICBzMis9Ik5hY2hmYWhyZShuKTogIiticmVha19zdHJpbmcoaW1wbG9kZShyZWxhdGl2ZXNbbmFtZSwxXSwiLCAiKSw3OCwxNClbMTQuLl07CisgIHJldHVybiBzMjsKK30KKwordmFyYXJncyBzdHJpbmcgZmluZ2VyX3NpbmdsZShzdHJpbmcgc3RyLGludCBsb2NhbCkKK3sKKyAgbWl4ZWQgICp1c2VyaW5mbzsKKyAgc3RyaW5nIGlwLHRleHQsaXBudW0sZmlsZW5hbWUsYXdheTsKKyAgaW50IHdpemxldmVsLHBsYXllcmxldmVsLGlkbGUscG9zLGZsYWdzLGxhc3Q7CisgIG1peGVkIGgsZGF0YSx0bXA7CisgIG9iamVjdCBwbGF5ZXIsb2I7CisKKyAgLypERUJVRyMjIyAgdGVsbF9vYmplY3QoKGZpbmRfcGxheWVyKCJsb2NvIil8fHRoaXNfb2JqZWN0KCkpLCJGaW5nZXIgcmVxdWVzdDogJyIrc3RyKyInKCIrbG9jYWwrIilcbiIpOy8qKi8KKyAgc3RyPWxvd2VyX2Nhc2Uoc3RyKTsKKyAgdGV4dD0iIjsKKyAgYXdheT0iIjsKKyAgaGNfcGxheT0wOworICAKKyAgaD1leHBsb2RlKHN0ciwiICIpOworICBpZiAoc2l6ZW9mKGgpPT0xKSBoPWV4cGxvZGUoc3RyLCIrIik7CisgIGlmIChtZW1iZXIoaCwiLW4iKT49MCkgZmxhZ3M9RkxBR19OT1BMQU47CisgIGlmIChtZW1iZXIoaCwiLXAiKT49MCkgZmxhZ3M9MDsKKyAgaWYgKG1lbWJlcihoLCItbCIpPj0wKSBmbGFnc3w9RkxBR19MT05HOworICBpZiAobWVtYmVyKGgsIi1zIik+PTApIGZsYWdzfD1GTEFHX1NQT05TT1I7CisgIGlmIChtZW1iZXIoaCwiLXYiKT49MCkgZmxhZ3N8PUZMQUdfVklTX0xPR09VVDsKKyAgaWYgKG1lbWJlcihoLCItYSIpPj0wKSBmbGFnc3w9RkxBR19BVkFUQVI7CisKKyAgaD0oaC0oeyItbiIsIi1wIiwiLWwiLCItcyIsICItdiIsIi1hIn0pKTsKKyAgaWYgKCFzaXplb2YoaCkpIHsKKyAgICB0ZXh0PSJEdSBzb2xsdGVzdCBzY2hvbiBzYWdlbiwgd2VyIERpY2ggaW50ZXJlc3NpZXJ0IVxuIjsKKyAgICBpZiAobG9jYWwpIHJldHVybiB3cml0ZSh0ZXh0KSwwOworICAgIGVsc2UgcmV0dXJuIHRleHQ7CisgIH0KKyAgc3RyPWhbMF07CisgIGlmICghc2l6ZW9mKHN0cikgfHwgc3RyWzBdPCdhJyB8fCBzdHJbMF0+J3onKSB7CisgICAgdGV4dD0iQWxzbywgc28gKCIrc3RyKyIpIGhlaXNzdCBiZXN0aW1tdCBrZWluIFNwaWVsZXIgaGllciFcbiI7CisgICAgaWYgKGxvY2FsKSByZXR1cm4gd3JpdGUodGV4dCksMDsKKyAgICBlbHNlIHJldHVybiB0ZXh0OworICB9CisKKyAgLyogZG9lcyB0aGlzIHBsYXllciBleGlzdD8gKi8KKyAgc3RyPW9sZF9leHBsb2RlKHN0ciwiLiIpWzBdOworICB1c2VyaW5mbz1NQVNURVItPmdldF91c2VyaW5mbyhzdHIpOworICBwbGF5ZXI9ZmluZF9wbGF5ZXIoc3RyKXx8ZmluZF9uZXRkZWFkKHN0cik7CisKKyAgaWYoICghcG9pbnRlcnAodXNlcmluZm8pIHx8IHVzZXJpbmZvW1VTRVJfTEVWRUwrMV09PS0xKQorCSYmICFwbGF5ZXIpIHsKKyAgICB0ZXh0PSJIbW0uLi4gZGllc2VuIE5hbWVuIGdpYnQgZXMgaW0gIk1VRE5BTUUiIG5pY2h0LlxuIjsKKyAgICBpZiAodG1wPSIvc2VjdXJlL21hc3RlciItPlF1ZXJ5QmFuaXNoZWQoc3RyKSl7CisgICAgICB0ZXh0PSJIb3BwbGEgLSBkaWVzZXIgTmFtZSBpc3QgcmVzZXJ2aWVydCBvZGVyIGdlc3BlcnJ0IChcImdlYmFuaXNodFwiKSFcbiI7CisgICAgICBpZiAoIHRtcCAhPSAiRGllc2VyIE5hbWUgaXN0IGdlc3BlcnJ0LiIgKQorICAgICAgICAgIHRleHQgKz0gIkdydW5kIGZ1ZXIgZGllIFNwZXJydW5nOiAiICsgdG1wICsKKyAgICAgICAgICAgICAgKG1lbWJlciggKHsnIScsJz8nLCcuJ30pLCB0bXBbPDFdICkgIT0gLTEgPyAiIiA6ICIuIikgKyAiXG4iOworICAgIH0KKyAgICBpZiAobG9jYWwpIHJldHVybiB3cml0ZSh0ZXh0KSwwOworICAgIGVsc2UgcmV0dXJuIHRleHQ7CisgIH0KKworICBpZiAocGxheWVyKSB7CisgICAgaGNfcGxheT1wbGF5ZXItPnF1ZXJ5X2hjX3BsYXkoKTsKKyAgICBwcm9wZXJ0aWVzPXBsYXllci0+UXVlcnlQcm9wZXJ0aWVzKCk7CisgICAgcHJvcGVydGllc1tQX1JBQ0VdPXBsYXllci0+UXVlcnlQcm9wKFBfUkFDRSk7CisgICAgcHJvcGVydGllc1tQX1ZJU0lCTEVfR1VJTERdPXBsYXllci0+UXVlcnlQcm9wKFBfVklTSUJMRV9HVUlMRCk7CisgICAgcHJvcGVydGllc1tQX1RJVExFXT1wbGF5ZXItPlF1ZXJ5UHJvcChQX1RJVExFKTsKKyAgICB0bXAgPSBwbGF5ZXItPlF1ZXJ5UHJvcChQX1BSRVNBWSk7CisgICAgcHJvcGVydGllc1tQX1BSRVNBWV09KHN0cmluZ3AodG1wKSAmJiBzaXplb2YodG1wKT4xKSA/IHRtcFswLi48Ml0gOiAwOworICB9CisgIGVsc2UKKyAgICByZXN0b3JlX29iamVjdCgiL3NhdmUvIitzdHJbMC4uMF0rIi8iK3N0cik7CisgIGlmICghcHJvcGVydGllcykKKyAgeworICAgIHRleHQrPSJNaXN0ISEhIERhcyBFaW5sZXNlbiBkZXIgRGF0ZW4ga2xhcHB0IG5pY2h0IHdpZSBlcyBzb2xsIDotKFxuIjsKKyAgICBwcm9wZXJ0aWVzPTA7CisgICAgaWYgKCFsb2NhbCkKKyAgICAgIHJldHVybiB0ZXh0OworICAgIHdyaXRlKHRleHQpOworICAgIHJldHVybiAiIjsKKyAgfQorICBpZiAoIHBsYXllciAmJiBpbnRlcmFjdGl2ZShwbGF5ZXIpICkKKyAgICAgIGlwbnVtID0gcXVlcnlfaXBfbnVtYmVyKHBsYXllcik7CisgIGVsc2UKKyAgICAgIGlwbnVtID0gcHJvcGVydGllc1tQX0NBTExFRF9GUk9NX0lQXTsKKyAgLy8gZnJ1ZWhlciBzdGFuZCBpbiBQX0NBTExFRF9GUk9NX0lQIGV2dGwuIGF1Y2ggZGVyIE5hbWUgZGlyZWt0IGRyaW4KKyAgLy8gYW5zdGVsbGUgZGVyIG51bWVyaXNjaGVuIElQCisgIGlwPXF1ZXJ5X2lwX25hbWUoaXBudW0pfHxwcm9wZXJ0aWVzW1BfQ0FMTEVEX0ZST01fSVBdOworICBpZihwbGF5ZXIpIHsKKyAgICAgIGlmICghaW50ZXJhY3RpdmUocGxheWVyKSB8fCAoaWRsZT1xdWVyeV9pZGxlKHBsYXllcikpPE1JTklETEUpCisgICAgICAgICAgaWRsZT0wOworICAgICAgaWYgKCEoaW52aXM9YWdlPXBsYXllci0+UXVlcnlQcm9wKFBfSU5WSVMpKSkKKyAgICAgICAgICBhZ2U9cGxheWVyLT5RdWVyeVByb3AoUF9BR0UpOworICB9IGVsc2UgeworICAgIGlmIChwcm9wZXJ0aWVzW1BfSU5WSVNdKSBhZ2U9cHJvcGVydGllc1tQX0lOVklTXTsKKyAgICBpZGxlPXByb3BlcnRpZXNbUF9MQVNUX0xPR09VVF07CisgIH0KKworICAgd2l6bGV2ZWw9cXVlcnlfd2l6X2xldmVsKHN0cik7CisgICBpZiAoICh0bXAgPSBmaWxlX3RpbWUoIi9zYXZlLyIrc3RyWzAuLjBdKyIvIitzdHIrIi5vIikpIDw9IDAgKQorICAgICAgIC8vIEhhY2ssIHVtIGJlaSBnYW56ICJmcmlzY2hlbiIgU3BpZWxlcm4gKG5vY2gga2VpbiBTYXZlZmlsZSB2b3JoYW5kZW4pCisgICAgICAgLy8gZGllIEF1c2dhYmUgdm9uIDEuMS4xOTcwIHp1IHZlcmhpbmRlcm4KKyAgICAgICB0bXAgPSB0aW1lKCk7CisgICBsYXN0PXByb3BlcnRpZXNbUF9MQVNUX0xPR09VVF07CisgICBpZiAoIGxhc3QgPD0gMCB8fCAoIShmbGFncyZGTEFHX1ZJU19MT0dPVVQpICYmIHdpeiAmJiB3aXpsZXZlbCA+IDEwCisgICAgICAgICAgICAgICAgICAmJiBwcm9wZXJ0aWVzW1BfSU5WSVNdICYmIHRtcCAtIGxhc3QgPiAzMDApICkKKyAgICAgICBsYXN0ID0gdG1wOworCisgIC8qIG91dHB1dCByb3V0aW5lIGZvciBhbGwgKi8KKyAgaWYocGxheWVyKSB7CisgICAgaD1wbGF5ZXItPlF1ZXJ5UHJvcChQX1JBQ0UpOworICAgIGlmKGludGVyYWN0aXZlKHBsYXllcikgJiYgKHdpeiB8fCAhaW52aXMpKSB7CisgICAgICB0ZXh0Kz1jYXBpdGFsaXplKHN0cikrIiBpc3QgYW53ZXNlbmQsXG4iKworICAgICAgICAidW5kIHp3YXIgdm9uOiAiKworICAgICAgICAgICh3aXogPyAoaXArKGlwbnVtPyIgKCIraXBudW0rIikiOiIiKSk6IiIpKworICAgICAgICAgIChzdHJpbmdwKHByb3BlcnRpZXNbUF9MT0NBVElPTl0pID8gKHdpeiA/ICJcbiAgICAgICAgICAgICAgWyIgOiAiIikKKyAgICAgICAgICAgK2NhcGl0YWxpemUocHJvcGVydGllc1tQX0xPQ0FUSU9OXSkrCisgICAgICAgICAgICgocHJvcGVydGllc1tQX0xPQ0FUSU9OXSAhPSBjb3VudHJ5KGlwLCBpcG51bSkpCisgICAgICAgICAgICA/ICIgKHVlYmVyICIrY291bnRyeShpcCwgaXBudW0pKyIpIiA6ICIiICkKKyAgICAgICAgICAgOiAod2l6PyIgWyI6IiIpK2NvdW50cnkoaXAsIGlwbnVtKSkrKHdpeiA/ICJdIjoiIikrIi5cbiI7CisgICAgICBpZihpZGxlKQorICAgICAgICB0ZXh0Kz0iUGFzc2l2IHNlaXQ6ICIrdGltZWRpZmYoaWRsZSkrIlxuIjsKKyAgICAgaWYgKGxvY2FsKQorICAgICAgdGV4dCs9IkVpbmdlbG9nZ3Qgc2VpdDogIitkdGltZShwcm9wZXJ0aWVzW1BfTEFTVF9MT0dJTl0pKyJcbiI7CisgICAgIGlmIChwcm9wZXJ0aWVzW1BfQVdBWV0pCisgICAgICAgYXdheT0iei5aLiBhYndlc2VuZCwgR3J1bmQgIDogIitwcm9wZXJ0aWVzW1BfQVdBWV0rIlxuIjsKKyAgICB9IGVsc2UKKyAgICAgIHRleHQrPWNhcGl0YWxpemUoc3RyKSsiIGlzdCBuaWNodCBhbndlc2VuZC5cblp1bGV0enQgZWluZ2Vsb2dndCB2b246ICIrCisgICAgICAgICh3aXogPyAoaXArKGlwbnVtJiZpcG51bSE9aXA/IiAoIitpcG51bSsiKSI6IiIpKToiIikrCisgICAgICAgIChzdHJpbmdwKHByb3BlcnRpZXNbUF9MT0NBVElPTl0pID8KKyAgICAgICAgICh3aXogPyAiXG4gICAgICAgICAgICAgICAgICAgICAgICBbIjogIiIpCisgICAgICAgICArY2FwaXRhbGl6ZShwcm9wZXJ0aWVzW1BfTE9DQVRJT05dKSsiICh1ZWJlciAiK2NvdW50cnkoaXAsIGlwbnVtKSsiKSI6CisgICAgICAgICAod2l6PyIgWyI6IiIpK2NvdW50cnkoaXAsIGlwbnVtKSkrKHdpeiA/ICJdIjoiIikrIi5cbiIrCisgICAgICAgICJadWxldHp0IGF1c2dlbG9nZ3Q6ICIrZHRpbWUobGFzdCkrIiAoIit0aW1lZGlmZih0aW1lKCktbGFzdCkrIikuXG4iOworICB9CisgIGVsc2UgeworICAgIHRleHQrPWNhcGl0YWxpemUoc3RyKSsiIGlzdCBuaWNodCBhbndlc2VuZC5cblp1bGV0enQgZWluZ2Vsb2dndCB2b246ICIrCisgICAgICAgICh3aXogPyAoaXArKGlwbnVtJiZpcG51bSE9aXA/IiAoIitpcG51bSsiKSI6IiIpKToiIikrCisgICAgICAgIChzdHJpbmdwKHByb3BlcnRpZXNbUF9MT0NBVElPTl0pID8KKyAgICAgICAgICh3aXogPyAiXG4gICAgICAgICAgICAgICAgICAgICAgICBbIjogIiIpCisgICAgICAgICArY2FwaXRhbGl6ZShwcm9wZXJ0aWVzW1BfTE9DQVRJT05dKSsiICh1ZWJlciAiK2NvdW50cnkoaXAsIGlwbnVtKSsiKSI6CisgICAgICAgICAod2l6PyIgWyI6IiIpK2NvdW50cnkoaXAsIGlwbnVtKSkrKHdpeiA/ICJdIjoiIikrIi5cbiIrCisgICAgICAgICJadWxldHp0IGF1c2dlbG9nZ3Q6ICIrZHRpbWUobGFzdCkrIiAoIit0aW1lZGlmZih0aW1lKCktbGFzdCkrIikuXG4iOworICB9CisgIHRleHQrPSJWb2xsZXIgTmFtZTogIisoKChoPXByb3BlcnRpZXNbUF9QUkVTQVldKSAmJiBoIT0iIikgPyBoKyIgIiA6ICIiKSsKKyAgICBjYXBpdGFsaXplKChoPXByb3BlcnRpZXNbUF9OQU1FXSkgPyBoIDogc3RyKSsiICIrCisgICAgICgoaD1wcm9wZXJ0aWVzW1BfVElUTEVdKSA/IGggOgorICAgICgobWFwcGluZ3AoaD1wcm9wZXJ0aWVzWyJndWlsZF90aXRsZSJdKSAmJiAoaD0oaFtwcm9wZXJ0aWVzW1BfR1VJTERdP3Byb3BlcnRpZXNbUF9HVUlMRF06ImFiZW50ZXVyZXIiXSkpICkgPyBoIDogIiIpICkKKyAgICAgICArIlxuIjsKKworICBpZiAocHJvcGVydGllc1tQX0dIT1NUXSkgdGV4dCs9IkhvcHBsYSwgZWluIEdlaXN0IVxuIjsKKyAgaWYgKChmbGFncyZGTEFHX0xPTkcpJiZwcm9wZXJ0aWVzW1BfTE9OR10pCisgICAgdGV4dCs9IkJlc2NocmVpYnVuZzogXG4iK2JyZWFrX3N0cmluZyhwcm9wZXJ0aWVzW1BfTE9OR10sNzgsMik7CisKKyAgaWYod2l6IHx8CisgICAgIChwcm9wZXJ0aWVzW1BfU0hPV0VNQUlMXT09ImFsbGUiKSB8fAorICAgICAoIChwcm9wZXJ0aWVzW1BfU0hPV0VNQUlMXT09ImZyZXVuZGUiKSAmJgorICAgICAgIG9iamVjdHAocGxheWVyKSAmJgorICAgICAgIHRoaXNfcGxheWVyKCkgJiYKKyAgICAgICAob2I9cHJlc2VudCgiXG5cYmZiYW5kIixwbGF5ZXIpKSAmJgorICAgICAgIHBvaW50ZXJwKHRtcD1vYi0+UXVlcnlQcm9wKFBfQVVUT0xPQURPQkopKSAmJgorICAgICAgIHBvaW50ZXJwKHRtcD10bXBbMV0pICYmCisgICAgICAgKG1lbWJlcih0bXAsZ2V0dWlkKHRoaXNfcGxheWVyKCkpKSE9LTEpKSkgdG1wID0gMTsKKyAgZWxzZSB0bXA9MDsKKworCisgIGlmICghKGg9cHJvcGVydGllc1tQX1JBQ0VdKSAmJiB1c2VyaW5mbyAmJiBwb2ludGVycCh1c2VyaW5mbykgJiYgc2l6ZW9mKHVzZXJpbmZvKT40ICYmCisgICAgICBzdHJpbmdwKHVzZXJpbmZvWzRdKSAmJiBzaXplb2YoaD1vbGRfZXhwbG9kZSh1c2VyaW5mb1s0XSwiLyIpKT4yKSB7CisgICAgaD1jYXBpdGFsaXplKGhbMl0pOworICAgIGg9KFsiSHVtYW4iOiJNZW5zY2giLCJEd2FyZiI6Ilp3ZXJnIiwiRGFya2VsZiI6IkR1bmtlbGVsZiIsIk9yYyI6Ik9yayJdKVtoXSB8fCBoOworICB9CisKKyAgaWYgKCFzdHJpbmdwKGgpKSBoPSI8a2VpbmU+IjsKKworICB0ZXh0Kz0iUmFzc2U6ICIraCsiLCAgR2lsZGU6ICIrCisgICAgICAgICAgICAgICAgICAgICAoKGg9cHJvcGVydGllc1tQX1ZJU0lCTEVfR1VJTERdKT9jYXBpdGFsaXplKGgpOigoaD1wcm9wZXJ0aWVzW1BfR1VJTERdKT9jYXBpdGFsaXplKGgpOiJBYmVudGV1cmVyIikpKworICAgICAgICAgICAgICAgICAgICAgKChoPXByb3BlcnRpZXNbUF9WSVNJQkxFX1NVQkdVSUxEX1RJVExFXSk/IiAoIitjYXBpdGFsaXplKGgpKyIpIjooKGg9cHJvcGVydGllc1tQX1NVQkdVSUxEX1RJVExFXSk/IiAoIitjYXBpdGFsaXplKGgpKyIpIjoiIikpKworICAgICAgICAgICAgICAgICAgICAgIiwgIEdlc2NobGVjaHQ6ICIrKHsibmV1dHJhbCA/ISIsIm1hZW5ubGljaCIsIndlaWJsaWNoIiwiPHZlcmRhbW10IHNlbHRzYW0+In0pW3Byb3BlcnRpZXNbUF9HRU5ERVJdXSsiXG4iKworICAgICAgICAgICAgICAgICAgICAgIChzZWVyID8gIkFsdGVyOiAiK3RpbWVkaWZmKGFnZSpIQklOVCkrIiwgICAiIDogIiIpKworICAgICAgICAgICAgICAgICAgICAgICh3aXpsZXZlbD49MTA/Ik1hZ2llcmxldmVsOiAiK3dpemxldmVsKworICAgICAgICAgICh3aXpsZXZlbD49R09EX0xWTD8iIChNdWRnb3R0KSI6c3RyPT0iYm9pbmciPyIgKE11ZGdvdHQgYS5ELikiOnN0cj09Im11YWRpYiI/IiAoQXBvc3RvbGlzY2hlciBWaXNpdGF0b3IpIjp3aXpsZXZlbD49QVJDSF9MVkw/IiAoRXJ6bWFnaWVyKSI6SVNfREVQVVRZKHN0cik/IiAoSGlsZnNzaGVyaWZmKSI6d2l6bGV2ZWw+PUVMREVSX0xWTD8iIChXZWlzZXIpIjp3aXpsZXZlbD49TE9SRF9MVkw/IiAoUmVnaW9uc21hZ2llcikiOndpemxldmVsPj1TUEVDSUFMX0xWTD8iIChIaWxmc21hZ2llcikiOndpemxldmVsPj1ET01BSU5NRU1CRVJfTFZMPyIgKFJlZ2lvbnNtaXRhcmJlaXRlcikiOndpemxldmVsPldJWkFSRF9MVkw/IiAoVm9sbG1hZ2llcikiOiIgKExlaHJsaW5nKSIpOgorICAgICAgICAgICAgICAgICAgICAgICAoIlNwaWVsZXJsZXZlbDogIitwcm9wZXJ0aWVzW1BfTEVWRUxdKyggd2l6bGV2ZWwgPyAiIChTZWhlciIrSU4rIikiIDogIiIgKSsKKyAgICAgICAgICAgICAgICAgICAgICAgICgoKGg9cHJvcGVydGllc1tQX0dVSUxEX0xFVkVMXSkgJiYgaD1oW3Byb3BlcnRpZXNbUF9HVUlMRF1dKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgKCIsICAgR2lsZGVubGV2ZWw6ICIraCkgOiAiIiApCisgICAgICAgICAgICAgICAgICAgICAgICApKSsoKHVzZXJpbmZvJiZwb2ludGVycCh1c2VyaW5mbykpPworICAgICAgICAgICAgICAgICAgICAgICAgKHNwcmludGYoIlxuRGF0dW0gZGVzIGVyc3RlbiBMb2dpbjogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzZXJpbmZvWzVdID4gMCkgPyBkdGltZSh1c2VyaW5mb1s1XSkgOiAidm9yIGRlbSAxMC4gTm92IDE5OTUiKSk6IiIpKworICAgICAgICAgICAgICAgICAgICAgICAgICh0bXAgPyAoIlxuRS1NYWlsLUFkcmVzc2U6ICIrKChoPXByb3BlcnRpZXNbUF9NQUlMQUREUl0pID8gaCA6ICJrZWluZSIpKyJcbiIpIDogIlxuIik7CisKKyAgaWYgKHByb3BlcnRpZXNbUF9IT01FUEFHRV0pCisgICAgdGV4dCs9IkhvbWVwYWdlOiAiK3Byb3BlcnRpZXNbUF9IT01FUEFHRV0rIlxuIjsKKworICBpZiAoc3RyaW5ncChkYXRhPXByb3BlcnRpZXNbUF9NRVNTRU5HRVJdKSkgeworICAgIHRleHQrPXNwcmludGYoIk1lc3NlbmdlcjogJXMiLCBkYXRhKTsKKyAgICBpZiAoaW50cChkYXRhPXByb3BlcnRpZXNbUF9JQ1FdKSkgeworICAgICAgaWYgKGRhdGE8MCAmJiBJU19XSVpBUkQodGhpc19wbGF5ZXIoKSkpIGRhdGEqPS0xOworICAgICAgaWYgKGRhdGE+MCkgdGV4dCArPSBzcHJpbnRmKCIsIElDUTogJWQiLCBkYXRhKTsKKyAgICB9CisgICAgdGV4dCs9IlxuIjsKKyAgfSBlbHNlIAorICAgIGlmIChpbnRwKGRhdGE9cHJvcGVydGllc1tQX0lDUV0pKSB7CisgICAgICBpZiAoZGF0YTwwICYmIElTX1dJWkFSRCh0aGlzX3BsYXllcigpKSkKKyAgICAgICAgZGF0YSo9LTE7CisgICAgICBpZiAoZGF0YT4wKQorICAgICAgICB0ZXh0Kz1zcHJpbnRmKCJJQ1E6ICVkXG4iLGRhdGEpOworICAgIH0KKworICBpZiAocHJvcGVydGllc1tQX01BUlJJRURdKQorICAgIHRleHQrPSJWZXJoZWlyYXRldCBtaXQ6ICIrY2FwaXRhbGl6ZShwcm9wZXJ0aWVzW1BfTUFSUklFRF0pKyJcbiI7CisKKyAgaWYgKCBwb2ludGVycChwcm9wZXJ0aWVzW1BfU0lCTElOR1NdKSApCisgICAgICB0ZXh0ICs9ICh7ICJFcyIsICJFciIsICJTaWUiIH0pW3Byb3BlcnRpZXNbUF9HRU5ERVJdXSArICIgaXN0IEJsdXRzIiArCisgICAgICAgICAgKHsgInZlcndhbmR0IG1pdCAiLCAiYnJ1ZGVyIHZvbiAiLCAic2Nod2VzdGVyIHZvbiAiIH0pCisgICAgICAgICAgW3Byb3BlcnRpZXNbUF9HRU5ERVJdXSArCisgICAgICAgICAgQ291bnRVcChwcm9wZXJ0aWVzW1BfU0lCTElOR1NdKSArICIuXG4iOworCisgIHRleHQrPWF3YXk7CisgIAorICBpZihNQVNURVItPmNoZWNrX2xhdGVfcGxheWVyKHN0cikpCisgIHsKKyAgICB0ZXh0Kz1jYXBpdGFsaXplKHN0cikrIiBoYXQgdW5zIGxlaWRlciBmdWVyIGltbWVyIHZlcmxhc3Nlbi5cbiI7CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYgKGg9TUFTVEVSLT5RdWVyeVRCYW5pc2hlZChzdHIpKQorICAgICAgdGV4dCs9Y2FwaXRhbGl6ZShzdHIpKyIgd2lsbCBmcnVlaGVzdGVucyAiK2hbVEJBTklTSF9FWFRSQUNUXTsKKyAgfQorICAKKyAgaWYgKGg9cHJvcGVydGllc1tQX1RFU1RQTEFZRVJdKQorICB7CisgICAgdGV4dCs9Y2FwaXRhbGl6ZShzdHIpKyIgaXN0IFRlc3RzcGllbGVyIitJTjsKKyAgICBpZiAoc3RyaW5ncChoKSkgdGV4dCs9IiAoIitoKyIpIjsKKyAgICB0ZXh0Kz0iLlxuIjsKKyAgfQorICBpZiAoIGg9cHJvcGVydGllc1tQX1NFQ09ORF0pCisgIHsKKyAgICBpZiAoSVNfV0laQVJEKHRoaXNfcGxheWVyKCkpKSB7CisgICAgICAgdGV4dCs9Y2FwaXRhbGl6ZShzdHIpKyIgaXN0IjsKKyAgICAgICBzd2l0Y2goKGludClwcm9wZXJ0aWVzW1BfU0VDT05EX01BUktdKSB7CisgICAgICAgICBjYXNlIC0xOiB0ZXh0Kz0iIHVuc2ljaHRiYXIgbWFya2llcnRlIgorICAgICAgICAgICAgICAgICAgICAgICArKChpbnQpcHJvcGVydGllc1tQX0dFTkRFUl0hPUZFTUFMRSA/ICJyIjogIiIpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBjYXNlICAwOiB0ZXh0Kz0iIG5pY2h0IG5hbWVudGxpY2ggbWFya2llcnRlIgorICAgICAgICAgICAgICAgICAgICAgICArKChpbnQpcHJvcGVydGllc1tQX0dFTkRFUl0hPUZFTUFMRSA/ICJyIjogIiIpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBkZWZhdWx0OgorICAgICAgIH0KKyAgICAgICB0ZXh0Kz0iIFp3ZWl0c3BpZWxlciIrSU47CisgICAgICAgaWYgKHN0cmluZ3AoaCkpCisgICAgICAgICB0ZXh0Kz0iICgiK2NhcGl0YWxpemUoaCkrIikiOworICAgICAgIHRleHQrPSIuXG4iOworICAgIH0KKyAgICBlbHNlIGlmICgoaW50KXByb3BlcnRpZXNbUF9TRUNPTkRfTUFSS10+MCkKKyAgICB7CisgICAgICB0ZXh0Kz1jYXBpdGFsaXplKHN0cikrIiBpc3QgWndlaXRzcGllbGVyIitJTjsKKyAgICAgIGlmIChzdHJpbmdwKGgpKQorICAgICAgICB0ZXh0Kz0iICgiK2NhcGl0YWxpemUoaCkrIikiOworICAgICAgdGV4dCs9Ii5cbiI7CisgICAgfQorICAgIGVsc2UgaWYgKChpbnQpcHJvcGVydGllc1tQX1NFQ09ORF9NQVJLXT4tMSkKKyAgICAgIHRleHQrPWNhcGl0YWxpemUoc3RyKSsiIGlzdCBad2VpdHNwaWVsZXIiK0lOKyIuXG4iOworICB9CisgIGlmIChwcm9wZXJ0aWVzW1BfREVBRFNdKQorICB7CisgICAgdGV4dCs9IkJpc2hlciBiZXJlaXRzICIrcHJvcGVydGllc1tQX0RFQURTXSsiIG1hbCBnZXN0b3JiZW5cbiI7CisgICAgLy8gQmV6aWVodCBzaWNoIG51ciBhdWYgZGVuIFplaXRyYXVtIGFiIGRlbSAzMC4xMS4nOTQKKyAgfQorICBpZihoY19wbGF5PT0xKQorICB7CisgICAgdGV4dCs9Y2FwaXRhbGl6ZShzdHIpKyIgaXN0IHNlaHIgbXV0aWcuXG4iOworICB9CisgIGlmKGhjX3BsYXk+MSkKKyAgeworICAgIHRleHQrPWNhcGl0YWxpemUoc3RyKSsiIGlzdCBhbSAiK2R0aW1lKGhjX3BsYXkpKyIgaW4gZGFzIE5pcnZhbmEgZWluZ2VnYW5nZW4uXG4iOworICB9CisKKyAgaWYgKC8qd2l6ICYmICovdXNlcmluZm8pIHsKKyAgICBkYXRhPXVzZXJpbmZvWzNdOworICAgIGlmIChzaXplb2YoZGF0YSkpCisgICAgICB0ZXh0Kz0iUmVnaW9uc21hZ2llciIrSU4rIiB2b24gICAgIDogIitpbXBsb2RlKG1hcChkYXRhLCMnY2FwaXRhbGl6ZSksIiwgIikrIi5cbiI7CisgICAgZGF0YT0iL3NlY3VyZS9tYXN0ZXIiLT5nZXRfZG9tYWluX2hvbWVzKHN0cik7CitkYXRhPWZpbHRlcihkYXRhLSh7ImVyem1hZ2llciJ9KSwjJ3N0cmluZ3ApOyAKKyAgICBpZiAoKHdpemxldmVsPj1ET01BSU5NRU1CRVJfTFZMKSAmJiAoc2l6ZW9mKGRhdGEpKSkKKyAgICAgIHRleHQrPSJSZWdpb25zbWl0YXJiZWl0ZXIiK0lOKyIgdm9uOiAiK2ltcGxvZGUobWFwKGRhdGEsIydjYXBpdGFsaXplKSwiLCAiKSsiLlxuIjsgIC8qICMnICovIAorICAgIH0KKworICBpZiAodXNlcmluZm8pIHsKKyAgICBkYXRhPXVzZXJpbmZvWzhdOworICAgIGlmIChzaXplb2YoZGF0YSkpCisgICAgICB0ZXh0ICs9ICJHaWxkZW5tYWdpZXIiK0lOKyIgdm9uICAgICAgOiAiK2ltcGxvZGUobWFwKGRhdGEsICMnY2FwaXRhbGl6ZSksICIsICIpKyIuXG4iOyAgIC8qICMnICovCisgIH0KKworICAvLyBnZ2YuIEF2YXRhci1VUkkgbWl0IGF1c2dlYmVuLgorICBpZiAoZmxhZ3MgJiBGTEFHX0FWQVRBUgorICAgICAgJiYgc3RyaW5ncChwcm9wZXJ0aWVzW1BfQVZBVEFSX1VSSV0pKQorICAgIHRleHQgKz0gIkF2YXRhci1VUkk6ICIgKyBwcm9wZXJ0aWVzW1BfQVZBVEFSX1VSSV0gKyAiXG4iOworCisgIGlmIChmbGFncyAmIEZMQUdfU1BPTlNPUikKKyAgICB0ZXh0Kz1zcG9uc29yaW5nKHN0cik7CisKKyAgZmlsZW5hbWU9Ii9wbGF5ZXJzLyIrc3RyKyIvLnByb2plY3QiOworICBpZihmaWxlX3NpemUoZmlsZW5hbWUpPj0wKQorICAgIHRleHQrPSJQcm9qZWt0OiAiK2V4cGxvZGUocmVhZF9maWxlKGZpbGVuYW1lKSwgIlxuIilbMF0rIlxuIjsKKyAgZWxzZSB7CisgICAgZmlsZW5hbWU9Ii9wL3NlcnZpY2UvbG9jby9wbGFucy8iK3N0cisiLnByb2plY3QiOworICAgIGlmKGZpbGVfc2l6ZShmaWxlbmFtZSk+PTApCisgICAgICB0ZXh0Kz0iUHJvamVrdDogIitleHBsb2RlKHJlYWRfZmlsZShmaWxlbmFtZSksICJcbiIpWzBdKyJcbiI7CisgIH0KKyAgaWYgKHNlZXIgJiYgIShmbGFncyZGTEFHX05PUExBTikpIHsKKyAgICBmaWxlbmFtZT0iL3BsYXllcnMvIitzdHIrIi8ucGxhbiI7CisgICAgaWYoZmlsZV9zaXplKGZpbGVuYW1lKT49MCkKKyAgICAgIHRleHQrPSJQbGFuOlxuIityZWFkX2ZpbGUoZmlsZW5hbWUpOworICAgIGVsc2UgeworICAgICAgZmlsZW5hbWU9Ii9wL3NlcnZpY2UvbG9jby9wbGFucy8iK3N0cisiLnBsYW4iOworICAgICAgaWYoZmlsZV9zaXplKGZpbGVuYW1lKT49MCkKKyAgICAgICAgdGV4dCs9IlBsYW46XG4iK3JlYWRfZmlsZShmaWxlbmFtZSk7CisvLyAgICAgIGVsc2UKKy8vICAgICAgdGV4dCs9IktlaW5lIC5wbGFuLURhdGVpLlxuIjsKKyAgICB9CisgIH0KKyAgcHJvcGVydGllcz0wOworICBpZiAoIWxvY2FsKQorICAgIHJldHVybiB0ZXh0OworICB0aGlzX3BsYXllcigpLT5Nb3JlKHRleHQpOworICByZXR1cm4gIiI7Cit9CisKK3N0cmluZyBGaW5nZXIoc3RyaW5nIHN0cikKK3sKKyAgaWYoIXN0ciB8fCBzdHI9PSIiKSB7IG5vdGlmeV9mYWlsKCJXZW4gZGVubj9cbiIpOyByZXR1cm4gMDsgfQorICBlbHNlCisgICAgcmV0dXJuIGZpbmdlcl9zaW5nbGUoc3RyLDEpOworfQpkaWZmIC0tZ2l0IGEvcC9kYWVtb24vZmlzaG1hc3Rlci5jIGIvcC9kYWVtb24vZmlzaG1hc3Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5OTc1ODQKLS0tIC9kZXYvbnVsbAorKysgYi9wL2RhZW1vbi9maXNobWFzdGVyLmMKQEAgLTAsMCArMSwxNjUgQEAKKy8qRmlzY2gtTWFzdGVyLCAoYykgVmFuaW9uQE1HLCAyNi4wNS4wMgorCisgIEZpc2NoZSBkaWUgaW0gTUcgZ2VhbmdlbHQgd2VyZGVuIGtvZW5uZW4sIHNvbGxlbiBuaWNodCBhbHMgZW5kbG9zZQorICBHZWxkcXVlbGxlIGRpZW5lbi4gRGFoZXIgaGFiZSBpY2ggZWluZW4gTWFzdGVyIGdlYmF1dCwgZGVyIHNpY2ggbWVya3QKKyAgV2VsY2hlciBTcGllbGVyIHdpZXZpZWwgRmlzY2ggZ2VhbmdlbHQgaGF0LiBKZSBtZWhyIEZpc2NoIGRlciBTcGllbGVyCisgIGZhZW5ndCwgZGVzdG8gYmlsbGlnZXIgd2lyZCBkZXIgRmlzY2guCisKKyAgU2Nobml0dHN0ZWxsZToKKworICBEZXIgTWFzdGVyIGhhdCBhYmdlc2VoZW4gdm9uIFN0YW5kYXJkLUZ1bmt0aW9uZW4gbnVyIGVpbmUgU2Nobml0dHN0ZWxsZQorCisgIHB1YmxpYyBpbnQgUHJpY2VPZkZpc2gob2JqZWN0IHBsYXllciwgb2JqZWN0IGZpc2gpCisKKyAgRGVyIGVyc3RlIFBhcmFtZXRlciBpc3QgZGVyIFNwaWVsZXIsIGRlciBkZW4gRmlzY2ggZ2VjbG9uZWQgaGF0LCBkZXIKKyAgendlaXRlIGlzdCBkZXIgRmlzY2gsIGRlbiBkZXIgU3BpZWxlciBnZWZhbmdlbiBoYXQuIERlciBGaXNjaCBtdXNzCisgIGhpZXJiZWkgdm9uIEZyYWdnbGVzIFN0YW5kYXJkZmlzY2ggZXJiZW4uCisKKyAgRGVyIFByZWlzIGRlcyBGaXNjaGVzIGZhZWxsdCBsaW5lYXIgamUgbmFlaGVyIGRlciBTcGllbGVyIGFuIGRpZQorICBNYXhpbWFsLUdyZW56ZSBmdWVyIEZpc2NoIGtvbW10IChEaWVzZSBpc3QgZHVyY2ggZGllIEtvbnN0YW50ZSBNQVhfRklTSAorICBmZXN0Z2VsZWd0LikgRGVyIE1hc3RlciBtZXJrdCBzaWNoIHVlYmVyIGVpbmVuIFplaXRyYXVtIHZvbiBGT1JHRVRfSVQKKyAgU2VrdW5kZW4sIGRhc3MgZGVyIFNwaWVsZXIgZGllc2VuIEZpc2NoIGdlZmFuZ2VuIGhhdC4gSXN0IGRlciBaZWl0cmF1bQorICB2ZXJnYW5nZW4sIGdlaHQgZGVyIEZpc2NoIG5pY2h0IG1laHIgaW4gZGllIFJlY2hudW5nIGVpbi4KKyAqLworCisjcHJhZ21hIHN0cm9uZ190eXBlcywgc2F2ZV90eXBlcywgcnR0X2NoZWNrcworI3ByYWdtYSBub19jbG9uZSwgbm9fc2hhZG93LCBub19pbmhlcml0CisKKyNkZWZpbmUgU0FWRV9GSUxFIF9fRElSX18rInNhdmUvZmlzaGVzIgorCisjZGVmaW5lIEZPUkdFVF9JVCAxNzI4MDAwIC8vIE5hY2ggMjAgVGFnZW4KKyNkZWZpbmUgTUFYX0ZJU0ggIDIwMDAwICAgLy8gV2VubiBTcGllbGVyIE1heC1GaXNoIGdlaG9sdCBoYXQsIGhhdCBkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlzY2gga2VpbmVuIFdlcnQgbWVoci4gKEVpbmhlaXQgR3JhbW0pCisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisKKy8vIEhpZXIgd2lyZCBnZXNwZWljaGVydCwgd2VsY2hlciBTcGllbGVyIHdpZXZpZWwgRmlzY2ggZ2VmYW5nZW4gaGF0LgorbWFwcGluZyBmaXNoZXMgPSBtX2FsbG9jYXRlKDAsMSk7CitzdGF0aWMgaW50IHNhdmVfbWVfc29vbjsKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkgeworICAvLyBPaG5lIGRhcyBkYXJmIGRpZXNlcyBPYmpla3QgaGllciBuaWNodCBzY2hyZWliZW4uCisgIHNldGV1aWQoZ2V0dWlkKCkpOworICAvLyBHbG9iYWxlIFZhcmlhYmxlbiBlaW5sZXNlbi9pbml0aWFsaXNpZXJlbi4KKyAgcmVzdG9yZV9vYmplY3QoU0FWRV9GSUxFKTsKKyAgc2V0X25leHRfcmVzZXQoNCozNjAwKTsKK30KKworc3RhdGljIHZvaWQgQ2xlYW51cERhdGEoKSB7CisgIGludCBleHBpcmVfZGF0ZSA9IHRpbWUoKS1GT1JHRVRfSVQ7CisgIC8vIFVlYmVyIGFsbGUgU3BpZWxlcm5hbWVuIGxhdWZlbi4KKyAgZm9yZWFjaChzdHJpbmcgcGwsIG1peGVkICpmaXNobGlzdDogZmlzaGVzKSB7CisgICAgLy8gVWViZXIgYWxsZSBGaXNjaGRhdGVuIGFsbGVyIFNwaWVsZXIgbGF1ZmVuLgorICAgIGZvcmVhY2goaW50ICpmaXNoOiBmaXNobGlzdCkgeworICAgICAgaWYgKGZpc2hbMF08ZXhwaXJlX2RhdGUpIHsKKyAgICAgICAgZmlzaGxpc3QtPSh7ZmlzaH0pOworICAgICAgICBzYXZlX21lX3Nvb249MTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCAhc2l6ZW9mKGZpc2hsaXN0KSApCisgICAgICBmaXNoZXMgPSBtX2RlbGV0ZShmaXNoZXMsIHBsKTsKKyAgICBlbHNlCisgICAgICBmaXNoZXMgKz0gKFtwbDpmaXNobGlzdF0pOworICB9Cit9CisKKy8vWlo6IG1hbiBrb2VubnRlIGhpZXIgZ2dmLiBkYXMgbmV1ZSBHZXdpY2h0IGJlc3RpbW1lbiBzdGF0dCBlcyBiZWkgamVkZW0KKy8vWlo6QWJydWYgenUgdHVuLgorLy8gRnVlZ3QgZWluZW4gbmV1ZW4gRmlzY2ggaW4gZGllIExpc3RlIG1pdCBGaXNjaGVuIGVpbgorc3RhdGljIGludCBBZGRGaXNoKHN0cmluZyBwbGF5ZXJfaWQsIGludCB3ZWlnaHQpIHsKKyAgLy8gRmlzY2ggaGluenVmdWVnZW4KKyAgaWYgKCBtZW1iZXIoZmlzaGVzLCBwbGF5ZXJfaWQpICkKKyAgICBmaXNoZXNbcGxheWVyX2lkXSArPSAgKHsoeyB0aW1lKCksd2VpZ2h0fSl9KTsKKyAgZWxzZSAKKyAgICBmaXNoZXMgKz0gKFsgcGxheWVyX2lkOiAoeyAoe3RpbWUoKSx3ZWlnaHR9KSB9KSBdKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIEhpZXIgd2lyZCBkYXMgR2V3aWNodCBkZXMgYmVyZWl0cyBnZWZhbmdlbmVuIEZpc2NoZXMgdW1nZXdhbmRlbHQKKy8vIGluIGRlbiBQcmVpcy1Qcm96ZW50c2F0eiwgZGVuIGRlciBGaXNjaCBub2NoIGtvc3RldC4KK3N0YXRpYyBpbnQgV2VpZ2h0VG9QcmljZShpbnQgd2VpZ2h0KSB7CisgIGlmICh3ZWlnaHQgPj0gTUFYX0ZJU0gpIHJldHVybiAwOworICBpZiAod2VpZ2h0IDw9IDAgICAgICAgKSByZXR1cm4gMTAwOworICAvLyBFaW5lIGxpbmVhcmUgS3VydmUuIEplIG1laHIgRmlzY2ggZ2Vob2x0LCBkZXN0byBiaWxsaWdlcgorICAvLyB3aXJkIGRlci4gLy8gQXJhdGhvcm46IFNwYW5uZW5kLCBzbyBlaW5lIGxpbmVhcmUgS3VydmUuIDotKQorICByZXR1cm4gMTAwLSh3ZWlnaHQqMTAwL01BWF9GSVNIKTsKK30KKworLy8gR2lidCBkYXMgR2VzYW10Z2V3aWNodCBkZXMgZ2VmYW5nZW5lbiBGaXNjaGVzIHp1bSBTcGllbGVyIHp1cnVlY2sKK3N0YXRpYyBpbnQgUXVlcnlXZWlnaHQoc3RyaW5nIHBsYXllcl9pZCkgeworICBpbnQgd2VpZ2h0OworICBtaXhlZCBsaXN0ID0gZmlzaGVzW3BsYXllcl9pZF07CisKKyAgLy8gRXJzdG1hbCB3ZXJkZW4gdW5ndWVsdGlnZSBGaXNjaGUgYXVzIGRlciBMaXN0ZSBlbnRmZXJudAorICAvL1paOiBpY2ggZmluZGUsIGRhcyBtdXNzIG5pY2h0IHVuYmVkaW5ndCBiZWkgamVkZW4gQWJydWYgZ2V0YW4gd2VyZGVuCisgIC8vWlo6OnVuZCBuaWNodCBmdWVyIGFsbGUgU3BpZWxlci4gcmVpY2h0IG5pY2h0IGVpbmZhY2ggYWxsZSA0aD8gCisgIENsZWFudXBEYXRhKCk7CisKKyAgLy8gWnVzYW1tZW56YWVobGVuIGRlciBFaW56ZWxnZXdpY2h0ZSBkZXIgZ3VlbHRpZ2VuIEZpc2NoZS4KKyAgZm9yZWFjaChpbnQgKmZpc2ggOiBmaXNoZXNbcGxheWVyX2lkXSkgeworICAgIHdlaWdodCArPSBmaXNoWzFdOworICB9CisgIHJldHVybiB3ZWlnaHQ7Cit9CisKKy8vIFdlbm4gZWluIFNwaWVsZXIgZWluZW4gbmV1ZW4gRmlzY2ggYmVrb21tdCwgd2lyZCBkZXIgUHJlaXMgZnVlciBkZW4KKy8vIEZpc2NoIGJlc3RpbW10LiBEaWVzZXIgcmVzdWx0aWVydCBhdXMgZGVyIE1lbmdlIChHZXdpY2h0KSBkZXMgRmlzY2gsCisvLyBkaWUgZGVyIFNwaWVsZXIgaW4gbGV0enRlciBaZWl0IHNjaG9uIGdlZmFuZ2VuIGhhdC4gWnVydWVja2dlZ2ViZW4KKy8vIHdpcmQgZGVyIFByZWlzIGluIFRlaWxlbiB2b24gMTAwLgorcHVibGljIGludCBQcmljZU9mRmlzaChvYmplY3QgcGxheWVyLCBvYmplY3QgZmlzaCkgeworICBzdHJpbmcgcGxheWVyX2lkOworICBpbnQgcHJpY2Vfb2ZfbmV3X2Zpc2g7CisKKyAgLy8gU2luZCBTcGllbGVyIHVuZCBGaXNjaCB1ZWJlcmdlYmVuPworICBpZiAoICFwbGF5ZXIgfHwgIWZpc2ggKSByZXR1cm4gMDsKKworICAvLyBTcGllbGVyLUlEIGZpbmRlbi4KKyAgcGxheWVyX2lkID0gZ2V0dXVpZChwbGF5ZXIpOworCisgIC8vIElzdCBwbGF5ZXIgZWluIGVjaHRlciBTcGllbGVyPworICAvLyBOUEMgY2xvbmVuIHNpY2ggRmlzY2hlLCBkaWUgMTAwJSBrb3N0ZW4uCisgIGlmIChtZW1iZXIodXNlcnMoKSxwbGF5ZXIpPT0tMSkgcmV0dXJuIDEwMDsKKworICAvLyBJcyBkZXIgRmlzY2ggZWluIEZpc2NoIHZvbiBGcmFnZ2xlPworICBpZiAobWVtYmVyKGluaGVyaXRfbGlzdChmaXNoKSwgX19QQVRIX18oMSkrIi9maXNoLmMiKT09LTEpCisgICAgcmV0dXJuIDA7CisKKyAgLy8gRmVzdHN0ZWxsZW4gd2lldmllbCBGaXNjaCBlaW4gU3BpZWxlciBnZWZhbmdlbiBoYXQsIHVuZAorICAvLyBkYXJhdXMgZGVuIFByZWlzIGJlcmVjaG5lbi4KKyAgcHJpY2Vfb2ZfbmV3X2Zpc2ggPSBXZWlnaHRUb1ByaWNlKFF1ZXJ5V2VpZ2h0KHBsYXllcl9pZCkpOworCisgIC8vIERpZXNlbiBGaXNjaCBpbiBkaWUgRGF0ZW5iYW5rIGVpbnRyYWdlbgorICBBZGRGaXNoKHBsYXllcl9pZCwgZmlzaC0+UXVlcnlQcm9wKFBfV0VJR0hUKSk7CisKKyAgLy8gSWNoIGJpbiBuZXVnaWVyaWcuCisgIC8qREVCVUcocGxheWVyLT5OYW1lKCkrIiBoYXQgZWluZW4gRmlzY2ggbWl0ICIrZmlzaC0+UXVlcnlQcm9wKFBfV0VJR0hUKSsKKyAgICAgICAgIiBnIGdlZmFuZ2VuLiBEZXIgV2VydCBsaWVndCBiZWkgIitwcmljZV9vZl9uZXdfZmlzaCsiJSIpOyovCisKKyAgLy8gRGllIEFlbmRlcnVuZyBzb2xsIHBlcnNpc3RlbnQgc2Vpbi4KKyAgc2F2ZV9tZV9zb29uPTE7CisKKyAgLy8gUnVlY2tnYWJlIGRlcyBGaXNjaHByZWlzZXMuCisgIHJldHVybiBwcmljZV9vZl9uZXdfZmlzaDsKK30KKworLy8gU3BlaWNoZXJuIGRlciBnbG9iYWxlbiBWYXJpYWJsZW4KK3N0YXRpYyB2b2lkIHNhdmUoKSB7CisgIHNhdmVfb2JqZWN0KFNBVkVfRklMRSk7CisgIHJldHVybjsKK30KKworLy8gRGEgbmljaHRzIGdlZXJidCB3aXJkLCBtdXNzIGRhcyBkZXN0cnVjdCgpIHNlbGJzdCBnZW1hY2h0IHdlcmRlbgorLy8gV2lyIHNwZWljaGVybiBhdWYgamVkZW4gRmFsbC4KK3ZhcmFyZ3MgaW50IHJlbW92ZShpbnQgc2lsZW50KSB7CisgIHNhdmUoKTsKKyAgZGVzdHJ1Y3QodGhpc19vYmplY3QoKSk7CisgIHJldHVybiAxOworfQorCisvLyBEYXRlbiBhdWZyYWV1bWVuIHVuZCBnZ2YuIHdlZ3NwZWljaGVybgordm9pZCByZXNldCgpIHsKKyAgQ2xlYW51cERhdGEoKTsKKyAgaWYgKCBzYXZlX21lX3Nvb24gKQorICAgIHNhdmUoKTsKKyAgc2V0X25leHRfcmVzZXQoNCozNjAwKTsgLy8gYWxsZSA0IFN0dW5kZW4gcmVpY2h0LgorfQpkaWZmIC0tZ2l0IGEvcC9kYWVtb24vaXBsb29rdXAuYyBiL3AvZGFlbW9uL2lwbG9va3VwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYwOGQ4ZgotLS0gL2Rldi9udWxsCisrKyBiL3AvZGFlbW9uL2lwbG9va3VwLmMKQEAgLTAsMCArMSwyMjUgQEAKKy8qCisgKiBNdWRsaWJzZWl0ZSBkZXMgaXBsb29rdXAgc3lzdGVtcywgbWl0IGRlbSBhdXMgbnVtZXJpc2NoZW4gSVAgQWRyZXNzZW4KKyAqIGRlciBIb3N0bmFtZSB1bmQgZGVyIE9ydCwgYW4gZGVtIHNpY2ggZGVyIFJlY2huZXIgYmVmaW5kZW4gYmVyZWNobmV0IHdpcmQuCisgKiBFcmdlYm5pc3NlIHdlcmRlbiBnZWNhY2hldC4KKyAqCisgKiAoYykyMDEwIHJ1bWF0YSBAIG1vcmdlbmdyYXVlbgorICovCisKKyNwcmFnbWEgc3RyaWN0X3R5cGVzLHNhdmVfdHlwZXMKKyNwcmFnbWEgbm9fY2xvbmUsbm9fc2hhZG93CisKKy8vIEZvcm1hdCBkZXIgaXBtYXA6CisvLyBLZXk6IG51bWVyaXNjaGUgaXAgYWxzIHN0cmluZyAob2huZSBmdWVocmVuZGUgbnVsbGVuKQorLy8gRGF0YToKKy8vICBbaXAsMF0gSG9zdG5hbWUsIGRlciB2b20gZXh0ZXJuZW4gU2VydmVyIGdlbGllZmVydCB3dXJkZS4KKy8vICBbaXAsMV0gTG9jYXRpb25pbmZvcm1hdGlvbiwgZGllIHZvbSBleHRlcm5lbiBTZXJ2ZXIga29tbXQuCisvLyAgICBkaWVzZXIgc29sbHRlIGRlbiBPcnQsIG9kZXIgZmFsbHMgZXMgbmljaHQgYmVzc2VyIGdlaHQsIGRhcyBMYW5kCisvLyAgICBpbSBLbGFydGV4dCBsaWVmZXJuLgorLy8gIFtpcCwyXSBaZWl0c3RlbXBlbCwgYmVpIGRlc3NlbiBlcnJlaWNoZW4gZGVyIFdlcnQgZ2Vsb2VzY2h0IHdlcmRlbgorLy8gICAgc29sbC4KKy8vICBbaXAsM10gU3RhdHVzIGRlciBBbmZyYWdlCisKK3ByaXZhdGUgbWFwcGluZyBpcG1hcDsKKyNkZWZpbmUgSVBNQVBfSE9TVCAgIDAKKyNkZWZpbmUgSVBNQVBfQ0lUWSAgIDEKKyNkZWZpbmUgSVBNQVBfRVhQSVJFIDIKKyNkZWZpbmUgSVBNQVBfU1RBVFVTIDMKKworLy8gZXh0ZXJuZXIgc2VydmVyLCBkZXIgZGVyIGxva2F0aW9uZGF0ZW4gYmVyZWNobmV0CisjZGVmaW5lIElQTE9PS1VQX0hPU1QgIjEyNy4wLjAuMSIKKyNkZWZpbmUgSVBMT09LVVBfUE9SVCA4NzExCisjZGVmaW5lIElQTE9PS1VQX1NBVkUgIi9wL2RhZW1vbi9zYXZlL2lwbG9va3VwIgorCisvLyBtb2VnbGljaGUgc3RhdHVzd2VydGUgKHBsYXR6IHp1bSB6YWVobGVuIGRlciBhbmZyYWdlbiBnZWxhc3NlbikKKyNkZWZpbmUgU1RBVFVTX1FVRVJZSU5HICAgICAgMQorI2RlZmluZSBTVEFUVVNfQVVUSE9SSVRBVElWRSAxMjgKKworLy8gc28gbGFuZ2Ugd2VyZGVuIGRpZSBkYXRlbiBpbSBjYWNoZSBnZWhhbHRlbgorI2RlZmluZSBDQUNIRV9USU1FICAgIDg2NDAwICAvKiAxIGRheSAqLworCisvLyBBYiBkaWVzZXIgR3JvZXNzZSBiZXRyYWNoZSBpY2ggZGVuIGNhY2hlIGFscyAiZ3Jvc3MgZ2VudWciLAorLy8gdW0gZWluZW4gY2FjaGUgdXBkYXRlIGluIGV0YXBwZW4genUgcmVjaHRmZXJ0aWdlbi4KKyNkZWZpbmUgTEFSR0VfQ0FDSEVfTElNSVQgMjAwMAorCisvLyBzbyBsYW5nZSBzaW5kIHdpciBiZXJlaXQgYXVmIGRpZSBhbnR3b3J0IGVpbmVyIGFuZnJhZ2UgYmVpbSBzZXJ2ZXIgenUgd2FydGVuCisjZGVmaW5lIFFVRVJZX1RJTUUgICAgNjAgICAgIC8qIDEgbWluICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpZiBNVUROQU1FID09ICJNb3JnZW5HcmF1ZW4iCisjZGVmaW5lIExPRyh4KSBsb2dfZmlsZSgicnVtYXRhL2lwbG9va3VwLmxvZyIsc3RyZnRpbWUoIiVZLSVtLSVkICVIOiVNOiVTOiAiKSsoeCkrIlxuIikKKyNlbHNlCisjZGVmaW5lIExPRyh4KQorI2VuZGlmCisKKy8vIFBST1RPVFlQRVMKKworcHVibGljIHZvaWQgY3JlYXRlKCk7CitwdWJsaWMgdm9pZCByZXNldCgpOworc3RhdGljIGludCBhY3RpdmVfZW50cnkoIHN0cmluZyBrZXksIG1peGVkKiBkYXRhICk7CitzdGF0aWMgdm9pZCBleHBpcmVfY2FjaGVfc21hbGwoKTsKK3N0YXRpYyB2b2lkIGV4cGlyZV9jYWNoZV9sYXJnZSggc3RyaW5nKiBrZXlzICk7CitwdWJsaWMgdm9pZCB1cGRhdGUoIHN0cmluZyB1ZHBfcmVwbHkgKTsKKworLy8gSU1QTEVNRU5UQVRJT04KKworcHVibGljIHZvaWQgY3JlYXRlKCkgeworCXNldGV1aWQoZ2V0dWlkKCkpOworCXJlc3RvcmVfb2JqZWN0KCBJUExPT0tVUF9TQVZFICk7CisKKwlpZiggIW1hcHBpbmdwKGlwbWFwKSB8fCB3aWR0aG9mKGlwbWFwKSE9NCApIHsKKwkJaXBtYXAgPSBtX2FsbG9jYXRlKCAwLCA0ICk7CisJCUxPRygicmVzdG9yZSBmYWlsZWQsIGNyZWF0aW5nIG5ldyBpcG1hcCIpOworCX0gZWxzZSB7CisJICBMT0coc3ByaW50ZigiY3JlYXRlZCAoJWQgZW50cmllcykiLHNpemVvZihpcG1hcCkpKTsKKwl9Cit9CisKK3B1YmxpYyB2b2lkIHJlc2V0KCkgeworCWlmKCBzaXplb2YoaXBtYXApIDwgTEFSR0VfQ0FDSEVfTElNSVQgKSB7CisJCWV4cGlyZV9jYWNoZV9zbWFsbCgpOworCX0gZWxzZSB7CisJCUxPRyhzcHJpbnRmKCJyZXNldCAlZCAtPiIsc2l6ZW9mKGlwbWFwKSkpOworCQlleHBpcmVfY2FjaGVfbGFyZ2UoIG1faW5kaWNlcyhpcG1hcCkgKTsKKwl9CisgIHNldF9uZXh0X3Jlc2V0KDEwODAwKTsKK30KKworc3RhdGljIGludCBhY3RpdmVfZW50cnkoIHN0cmluZyBrZXksIG1peGVkKiBkYXRhICkgeworCXJldHVybiB0aW1lKCkgPCBkYXRhW0lQTUFQX0VYUElSRV07Cit9CisKKy8vIERlbiBjYWNoZSBhdWYgZWluZmFjaGUgd2Vpc2UgYXVmcmFldW1lbi4KK3N0YXRpYyAgdm9pZCBleHBpcmVfY2FjaGVfc21hbGwoKSB7CisJaW50IHMgPSBzaXplb2YoaXBtYXApOworCWlwbWFwID0gZmlsdGVyKCBpcG1hcCwgIydhY3RpdmVfZW50cnkgKTsKKwlzYXZlX29iamVjdCggSVBMT09LVVBfU0FWRSApOworCUxPRyhzcHJpbnRmKCJyZXNldCAoJWQgLT4gJWQpIixzLHNpemVvZihpcG1hcCkpKTsKK30KKworLy8gS29tcGxpemllcnRlcmUgcm91dGluZSwgZGllIGRlbiBjYWNoZSBldGFwcGVud2Vpc2UgYWJhcmJlaXRldC4KK3N0YXRpYwl2b2lkIGV4cGlyZV9jYWNoZV9sYXJnZSggc3RyaW5nKiBrZXlzICkgeworCWlmKCAhcG9pbnRlcnAoa2V5cykgKSByZXR1cm47CisJaW50IG5leHQ9MDsKKwlmb3JlYWNoKCBzdHJpbmcga2V5OiBrZXlzICkgeworCQlpZiggZ2V0X2V2YWxfY29zdCgpIDwgMTAwMDAwICkgYnJlYWs7CisJCWlmKCBpcG1hcFtrZXksSVBNQVBfRVhQSVJFXSA8IHRpbWUoKSApIHsKKwkJCW1fZGVsZXRlKCBpcG1hcCwga2V5ICk7CisJCX0KKwkJbmV4dCsrOworCX0KKwlMT0coc3ByaW50ZigiY2hlY2tpbmcgJWQgb2YgJWQiLG5leHQsc2l6ZW9mKGtleXMpKSk7CisJaWYoIG5leHQ8c2l6ZW9mKGtleXMpICkgeworCQljYWxsX291dCggIydleHBpcmVfY2FjaGVfbGFyZ2UsIDYsIGtleXNbbmV4dC4uXSApOworCX0gZWxzZSB7CisJCXNhdmVfb2JqZWN0KCBJUExPT0tVUF9TQVZFICk7CisJCUxPRyhzcHJpbnRmKCJyZXNldCAtPiAlZCAoZG9uZSkiLHNpemVvZihpcG1hcCkpKTsKKwl9Cit9CisKKyNkZWZpbmUgU0VBUkNISU5HICI8YXVmIGRlciBTdWNoZS4uLj4iCisKKy8qIEVyemV1Z3QgZWluZW4gdGVtcG9yYWVyZW4gRWludHJhZywgZGVyIGZ1ZXIgZWluZSBTdWNoZSBzdGVodC4KKyAqIFdlbm4gZGllIEFudHdvcnQga29tbXQsIHdpcmQgZGVyIEVpbnRyYWcgbWl0IGRlbiBlbnRndWVsdGlnZW4KKyAqIERhdGVuIHVlYmVyc2NocmllYmVuLgorICovCitzdGF0aWMgdm9pZCBtYWtlX3JlcXVlc3QoIHN0cmluZyBpcG51bSApIHsKKwlzZW5kX3VkcCggSVBMT09LVVBfSE9TVCwgSVBMT09LVVBfUE9SVCwgaXBudW0gKTsKKwlpcG1hcCArPSAoWyBpcG51bSA6IGlwbnVtIDsgU0VBUkNISU5HIDsKKwkJdGltZSgpK1FVRVJZX1RJTUUgOyBTVEFUVVNfUVVFUllJTkcKKwldKTsKK30KKworLyogTGllZmVydCB6dSBlaW5lciBnZWdlYmVuZW4gaXBudW0gZGVuIE9ydC4KKyAqIGRpZXNlIEZ1bmt0aW9uIHdpcmQgdm9uIHNpbXVsX2VmdW4gYXVmZ2VydWZlbi4KKyAqIEBwYXJhbSBpcG51bSBlaW5lIG51bWVyaXNjaGUgaXAtYWRyZXNzZSBvZGVyIGVpbiBpbnRlcmFjdGl2ZQorICogQHJldHVybiBkZW4gT3J0IChvZGVyIGRhcyBMYW5kKSBpbiBkZW0gc2ljaCBkaWUgaXAtYWRyZXNzZQorICogbGF1dCBleHRlcm5lbSBTZXJ2ZXIgYmVmaW5kZXQuCisgKi8KK3B1YmxpYyBzdHJpbmcgY291bnRyeSggbWl4ZWQgaXBudW0gKSB7CisJc3RyaW5nIGhvc3QsY2l0eTsKKwlpbnQgZXhwaXJlLHN0YXRlOworCisJaWYoIG9iamVjdHAoaXBudW0pICkgeworCQlpcG51bSA9IHF1ZXJ5X2lwX251bWJlcihpcG51bSk7CisJfQorCWlmKCAhc3RyaW5ncChpcG51bSkgKSB7CisJCXJldHVybiAiPHVuZGVmaW5lZD4iOworCX0KKwlpZiggIW1fY29udGFpbnMoICZob3N0LCAmY2l0eSwgJmV4cGlyZSwgJnN0YXRlLCBpcG1hcCwgaXBudW0gKSApIHsKKwkJbWFrZV9yZXF1ZXN0KCBpcG51bSApOworCQlyZXR1cm4gU0VBUkNISU5HOworCX0KKworCXJldHVybiBjaXR5OworfQorCisvKiBMaWVmZXJ0IHp1IGVpbmVyIGdlZ2ViZW5lbiBpcG51bSBkZW4gSG9zdG5hbWVuLgorICogZGllc2UgRnVua3Rpb24gd2lyZCB2b24gc2ltdWxfZWZ1biBhdWZnZXJ1ZmVuLgorICogQHBhcmFtIGlwbnVtIGVpbmUgbnVtZXJpc2NoZSBpcC1hZHJlc3NlIG9kZXIgZWluIGludGVyYWN0aXZlCisgKiBAcmV0dXJuIGRlbiBIb3N0bmFtZW4gZGVyIHp1IGRlciBhbmdlZ2ViZW5lbiBpcC1hZHJlc3NlIGdlaG9lcnQuCisgKiB3ZW5uIGRlciBob3N0bmFtZSBuaWNodCBiZWthbm50IGlzdCwgd2lyZCBkaWUgaXBhZHJlc3NlIHp1cnVlY2tnZWdlYmVuLgorICovCitwdWJsaWMgc3RyaW5nIGhvc3QoIG1peGVkIGlwbnVtICkgeworCXN0cmluZyBob3N0LGNpdHk7CisJaW50IGV4cGlyZSxzdGF0ZTsKKworCWlmKCBvYmplY3RwKGlwbnVtKSApIHsKKwkJaXBudW0gPSBxdWVyeV9pcF9udW1iZXIoaXBudW0pOworCX0KKwlpZiggIXN0cmluZ3AoaXBudW0pICkgeworCQlyZXR1cm4gIjx1bmRlZmluZWQ+IjsKKwl9CisJaWYoICFtX2NvbnRhaW5zKCAmaG9zdCwgJmNpdHksICZleHBpcmUsICZzdGF0ZSwgaXBtYXAsIGlwbnVtICkgKSB7CisJCW1ha2VfcmVxdWVzdCggaXBudW0gKTsKKwkJcmV0dXJuIGlwbnVtOworCX0KKworCXJldHVybiBob3N0OworfQorCisvKiB3aXJkIHZvbSBtYXN0ZXIgYXVmZ2VydWZlbiwgd2VubiBlaW5lIGFudHdvcnQgdm9tIGV4dGVybmVuCisgKiBpcGxvb2t1cCBkaWVuc3QgZWludHJ1ZGVsdC4KKyAqLworcHVibGljIHZvaWQgdXBkYXRlKCBzdHJpbmcgdWRwX3JlcGx5ICkgeworCXN0cmluZyogcmVwbHk7CisJaWYoIHByZXZpb3VzX29iamVjdCgpIT1tYXN0ZXIoKSApIHJldHVybjsKKwlyZXBseSA9IGV4cGxvZGUodWRwX3JlcGx5LCJcbiIpOworCWlmKCBzaXplb2YocmVwbHkpPDQgKSByZXR1cm47CisKKwlpZiggcmVwbHlbM10gPT0gIjx1bmtub3duPiIgKSByZXBseVszXSA9IHJlcGx5WzFdOworCWlmKCByZXBseVsyXSA9PSAiPHVua25vd24+IiApIHJlcGx5WzJdID0gImlyZ2VuZHdvaGVyIjsKKwlpcG1hcCArPSAoWyByZXBseVsxXSA6IHJlcGx5WzNdIDsgcmVwbHlbMl0gOyB0aW1lKCkrQ0FDSEVfVElNRSA7CisJCVNUQVRVU19BVVRIT1JJVEFUSVZFIF0pOworCS8vc2F2ZV9vYmplY3QoIElQTE9PS1VQX1NBVkUgKTsKK30KKworaW50IHJlbW92ZShpbnQgc2lsZW50KSB7CisgIHNhdmVfb2JqZWN0KCBJUExPT0tVUF9TQVZFICk7CisgIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOworICByZXR1cm4gMTsKK30KKworLy8gREVCVUdHSU5HIENPREUKKworI2lmIDAKK3B1YmxpYyB2b2lkIGR1bXAoIHN0cmluZyBrZXksIG1peGVkKiBkYXRhICkgeworCXByaW50ZiggIiVzOiAlcyAoJXMpIHM9JWQgYmlzICVkXG4iLCBrZXksIGRhdGFbMF0sIGRhdGFbMV0sCisJCWRhdGFbM10sIGRhdGFbMl0gKTsKK30KKworcHVibGljIHZvaWQgbG9hZChzdHJpbmcgcykgeworCXJlc3RvcmVfb2JqZWN0KHMpOworCWlmKCAhbWFwcGluZ3AoaXBtYXApIHx8IHdpZHRob2YoaXBtYXApIT00ICkgeworCQlpcG1hcCA9IG1fYWxsb2NhdGUoIDAsIDQgKTsKKwkJTE9HKCJyZXN0b3JlIGZhaWxlZCwgY3JlYXRpbmcgbmV3IGlwbWFwIik7CisJfSBlbHNlIHsKKwkgIExPRyhzcHJpbnRmKCJjcmVhdGVkICglZCBlbnRyaWVzKSIsc2l6ZW9mKGlwbWFwKSkpOworCX0KK30KKworcHVibGljIHZvaWQgZGVidWcoKSB7CisJbWFwKCBpcG1hcCwgIydkdW1wICk7CisJcHJpbnRmKCAiPSAlZCBFaW50cmFlZ2VcbiIsIHNpemVvZihpcG1hcCkgKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcC9kYWVtb24vbGFnLW8tZGFlbW9uLmMgYi9wL2RhZW1vbi9sYWctby1kYWVtb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDIzODYwCi0tLSAvZGV2L251bGwKKysrIGIvcC9kYWVtb24vbGFnLW8tZGFlbW9uLmMKQEAgLTAsMCArMSwyNzIgQEAKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHNhdmVfdHlwZXMscnR0X2NoZWNrcworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBub19zaGFkb3cKKyNwcmFnbWEgbm9faW5oZXJpdAorI3ByYWdtYSBwZWRhbnRpYworCisjaW5jbHVkZSA8ZHJpdmVyX2luZm8uaD4KKworI2lmbmRlZiBERUJVRworI2RlZmluZSBERUJVRyh4KSAgICAgICAgaWYgKGZpbmRfcGxheWVyKCJ6ZXNzdHJhIikpXAorICAgICAgICB0ZWxsX29iamVjdChmaW5kX3BsYXllcigiemVzc3RyYSIpLCJMQUc6ICIreCsiXG4iKQorI2VuZGlmCisKKyNkZWZpbmUgU0FWRUZJTEUgX19ESVJfXysic2F2ZS9sYWctby1kYWVtb24iCisjZGVmaW5lIExPRyh4KSBsb2dfZmlsZSgiTEFHIix4LDIwMDAwMCk7CisjZGVmaW5lIExPR01BWCh4KSBsb2dfZmlsZSgiTEFHTUFYIix4LDMwMDAwMCk7CisKKy8vIEFuemFobCBhbiB6dSBtZXJrZW5kZW4gV2VydGVuICgxODAwPT0zNjAwcykKKyNkZWZpbmUgTUVTU1dFUlRFIDE4MDAKKworbm9zYXZlIGZsb2F0IGhic3RhdCwgb2JzdGF0Oworbm9zYXZlIG1hcHBpbmcgbGFzdHdhcm5pbmc9KFtdKTsKK25vc2F2ZSBpbnQgKmxhc3R0aW1lID0gdXRpbWUoKTsKK25vc2F2ZSBpbnQgbGFzdGhiY291bnQgPSBhYnNvbHV0ZV9oYl9jb3VudCgpOworZmxvYXQgKmxhZ2RhdGEgPSBhbGxvY2F0ZShNRVNTV0VSVEUsMC4wKTsKKy8vIExhZ3MgZnVlciBkaWUgbGV0enRlbiAgIDJzICgxIEhCKSwgMjBzICgxMCBIQiksIDYwcyAoMzAgSEIpLAorLy8gICAgICAgICAgICAgICAgICAgICAgIDMwMHMgKDE1MCBIQiksIDkwMHMgKDQ1MCBIQiksIDM2MDBzICgxODAwIEhCKQorZmxvYXQgKmxhZyA9IGFsbG9jYXRlKDYsMC4wKTsKK2ludCAqaGJkYXRhID0gYWxsb2NhdGUoTUVTU1dFUlRFKTsKKy8vIExhZ3MgZnVlciBkaWUgbGV0enRlbiAgIDJzICgxIEhCKSwgMjBzICgxMCBIQiksIDYwcyAoMzAgSEIpLAorLy8gICAgICAgICAgICAgICAgICAgICAgIDMwMHMgKDE1MCBIQiksIDkwMHMgKDQ1MCBIQiksIDM2MDBzICgxODAwIEhCKQoraW50ICpoYnMgPSBhbGxvY2F0ZSg2KTsKK2ludCAqY29kYXRhID0gYWxsb2NhdGUoTUVTU1dFUlRFKTsKKy8vIExhZ3MgZnVlciBkaWUgbGV0enRlbiAgIDJzICgxIEhCKSwgMjBzICgxMCBIQiksIDYwcyAoMzAgSEIpLAorLy8gICAgICAgICAgICAgICAgICAgICAgIDMwMHMgKDE1MCBIQiksIDkwMHMgKDQ1MCBIQiksIDM2MDBzICgxODAwIEhCKQoraW50ICpjYWxsb3V0cyA9IGFsbG9jYXRlKDYpOworCit2b2lkIGNyZWF0ZSgpIHsKKyAgc2V0ZXVpZChnZXR1aWQoKSk7CisgIC8vIEJlaSBuaWNodCBlaW5sZXNiYXJlbiBTYXZlZmlsZSB1bmQgbmFjaCBSZWJvb3QgV2VydGUgbmV1IGluaXRpYWxpc2llcmVuLgorICAvLyBEZW5uIGRhbm4gaXN0IGRpZSBEaWZmZXJlbnogZGVyIEhCcyBiZWRldXR1bmdzbG9zLiBFcmtlbm51bmcgcGxvZXR6bGljaAorICAvLyBrbGVpbmVyZSBIQi1aYWhsLgorICBpZiAoIXJlc3RvcmVfb2JqZWN0KFNBVkVGSUxFKQorICAgICAgfHwgZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVF9UT1RBTF9DWUNMRVMpIDwgbGFzdGhiY291bnQpCisgIHsKKyAgICBsYWdkYXRhID0gYWxsb2NhdGUoTUVTU1dFUlRFLDAuMCk7CisgICAgbGFnID0gYWxsb2NhdGUoNiwwLjApOworICAgIGhiZGF0YSA9IGFsbG9jYXRlKE1FU1NXRVJURSk7CisgICAgaGJzID0gYWxsb2NhdGUoNik7CisgICAgY29kYXRhID0gYWxsb2NhdGUoTUVTU1dFUlRFKTsKKyAgICBjYWxsb3V0cyA9IGFsbG9jYXRlKDYpOworICB9CisgIHNldF9oZWFydF9iZWF0KDEpOworfQorCitpbnQgcmVtb3ZlKGludCBzaWxlbnQpIHsKKyAgc2F2ZV9vYmplY3QoU0FWRUZJTEUpOworICBkZXN0cnVjdCh0aGlzX29iamVjdCgpKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIGxpZWZlcnQgTWl0dGVsd2VydGFycmF5IHp1cnVlY2sKKy8vVE9ETzogPGludHxzdHJpbmc+KiByZXN1bHRzIAorcHJpdmF0ZSBtaXhlZCBjYWxjX2F2ZXJhZ2VzKG1peGVkIGRhdGEsIG1peGVkIHJlc3VsdHMsIGludCBpbmRleCwgZmxvYXQgc2NhbGUpIHsgCisgIGZsb2F0IHRtcDsKKyAgaW50IHQ7CisKKyAgaWYgKCFzY2FsZSkgc2NhbGU9MS4wOworICAKKyAgLy8gMnMKKyAgcmVzdWx0c1swXSA9IHRvX2Zsb2F0KGRhdGFbaW5kZXhdKSAqIHNjYWxlOworCisgIC8vIGFsbGUgMTBzIC8gNSBIQnMgZGVuIDIwcy1XZXJ0IG5ldSBiZXJlY2huZW4KKyAgaWYgKCBpbmRleCU1ID09IDEpIHsKKyAgICBpZiAoaW5kZXg8OSkgeworICAgICAgZm9yZWFjaChpbnQgaTogaW5kZXgtNCtNRVNTV0VSVEUgLi4gTUVTU1dFUlRFLTEpIHsKKyAgICAgICAgdG1wKz1kYXRhW2ldOworICAgICAgICB0Kys7CisgICAgICB9CisgICAgICBmb3JlYWNoKGludCBpOiAwIC4uIGluZGV4KSB7CisgICAgICAgIHRtcCs9ZGF0YVtpXTsKKyAgICAgICAgdCsrOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGZvcmVhY2goaW50IGk6IGluZGV4LTkgLi4gaW5kZXgpIHsKKyAgICAgICAgdG1wKz1kYXRhW2ldOworICAgICAgICB0Kys7CisgICAgICB9CisgICAgfQorICAgIHJlc3VsdHNbMV09dG1wL3RvX2Zsb2F0KHQpICogc2NhbGU7CisgIH0KKworICAvLyBhbGxlIDEwcyAvIDUgSEJzIGRlbiA2MHMtV2VydCBuZXUgYmVyZWNobmVuLCBhYmVyIGluIGFuZGVyZW0gSEIgYWxzIGRlbgorICAvLyAxMHMtV2VydAorICBpZiAoIGluZGV4JTUgPT0gMykgeworICAgIHRtcD0wLjA7CisgICAgdD0wOworICAgIGlmIChpbmRleDwyOSkgeworICAgICAgZm9yZWFjaChpbnQgaTogaW5kZXgtMTQrTUVTU1dFUlRFIC4uIE1FU1NXRVJURS0xKSB7CisgICAgICAgIHRtcCs9ZGF0YVtpXTsKKyAgICAgICAgdCsrOworICAgICAgfQorICAgICAgZm9yZWFjaChpbnQgaTogMCAuLiBpbmRleCkgeworICAgICAgICB0bXArPWRhdGFbaV07CisgICAgICAgIHQrKzsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICBmb3JlYWNoKGludCBpOiBpbmRleC0yOSAuLiBpbmRleCkgeworICAgICAgICB0bXArPWRhdGFbaV07CisgICAgICAgIHQrKzsKKyAgICAgIH0KKyAgICB9CisgICAgcmVzdWx0c1syXT10bXAvdG9fZmxvYXQodCkgKiBzY2FsZTsKKyAgfQorCisgIC8vIDMwMHMKKyAgLy8gYWxsZSA0MHMgLyAyMCBIQnMgZGVuIDMwMHMtV2VydCBuZXUgYmVyZWNobmVuLgorICBpZiAoIGluZGV4JTIwID09IDEyKSB7CisgICAgdG1wPTAuMDsKKyAgICB0PTA7CisgICAgaWYgKGluZGV4PDE0OSkgeworICAgICAgZm9yZWFjaChpbnQgaTogaW5kZXgtNzQrTUVTU1dFUlRFIC4uIE1FU1NXRVJURS0xKSB7CisgICAgICAgIHRtcCs9ZGF0YVtpXTsKKyAgICAgICAgdCsrOworICAgICAgfQorICAgICAgZm9yZWFjaChpbnQgaTogMCAuLiBpbmRleCkgeworICAgICAgICB0bXArPWRhdGFbaV07CisgICAgICAgIHQrKzsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICBmb3JlYWNoKGludCBpOiBpbmRleC0xNDkgLi4gaW5kZXgpIHsKKyAgICAgICAgdG1wKz1kYXRhW2ldOworICAgICAgICB0Kys7CisgICAgICB9CisgICAgfQorICAgIHJlc3VsdHNbM109dG1wL3RvX2Zsb2F0KHQpICogc2NhbGU7CisgIH0KKworCisgIC8vIDkwMHMKKyAgLy8gYWxsZSA4MHMgLyA0MCBIQnMgZGVuIDkwMHMtV2VydCBuZXUgYmVyZWNobmVuLgorICBpZiAoIGluZGV4JTQwID09IDMxKSB7CisgICAgdG1wPTAuMDsKKyAgICB0PTA7CisgICAgaWYgKGluZGV4PDQ0OSkgeworICAgICAgZm9yZWFjaChpbnQgaTogaW5kZXgtMjI0K01FU1NXRVJURSAuLiBNRVNTV0VSVEUtMSkgeworICAgICAgICB0bXArPWRhdGFbaV07CisgICAgICAgIHQrKzsKKyAgICAgIH0KKyAgICAgIGZvcmVhY2goaW50IGk6IDAgLi4gaW5kZXgpIHsKKyAgICAgICAgdG1wKz1kYXRhW2ldOworICAgICAgICB0Kys7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgZm9yZWFjaChpbnQgaTogaW5kZXgtNDQ5IC4uIGluZGV4KSB7CisgICAgICAgIHRtcCs9ZGF0YVtpXTsKKyAgICAgICAgdCsrOworICAgICAgfQorICAgIH0KKyAgICByZXN1bHRzWzRdPXRtcC90b19mbG9hdCh0KSAqIHNjYWxlOworICB9CisKKyAgLy8gMzYwMHMKKyAgLy8gYWxsZSAzMDBzIC8gMTUwIEhCcyBkZW4gMzYwMHMtV2VydCBuZXUgYmVyZWNobmVuLgorICBpZiAoIGluZGV4JTE1MCA9PSAxMjgpIHsKKyAgICB0bXA9MC4wOworICAgIHQ9MDsKKyAgICBpZiAoaW5kZXg8MTc5OSkgeworICAgICAgZm9yZWFjaChpbnQgaTogaW5kZXgtODk5K01FU1NXRVJURSAuLiBNRVNTV0VSVEUtMSkgeworICAgICAgICB0bXArPWRhdGFbaV07CisgICAgICAgIHQrKzsKKyAgICAgIH0KKyAgICAgIGZvcmVhY2goaW50IGk6IDAgLi4gaW5kZXgpIHsKKyAgICAgICAgdG1wKz1kYXRhW2ldOworICAgICAgICB0Kys7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgZm9yZWFjaChpbnQgaTogaW5kZXgtMTc5OSAuLiBpbmRleCkgeworICAgICAgICB0bXArPWRhdGFbaV07CisgICAgICAgIHQrKzsKKyAgICAgIH0KKyAgICB9CisgICAgcmVzdWx0c1s1XT10bXAvdG9fZmxvYXQodCkgKiBzY2FsZTsKKyAgfQorICByZXR1cm4gcmVzdWx0czsKK30KKworcHJvdGVjdGVkIHZvaWQgaGVhcnRfYmVhdCgpIHsKKyAgaW50IGhiY291bnQ9ZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVF9UT1RBTF9DWUNMRVMpOworICAvLyBwZXIgTW9kdWxvIEluZGV4IGF1ZiAwIC0gNDQ5IGJlZ3JlbnplbgorICBpbnQgaW5kZXg9aGJjb3VudCVNRVNTV0VSVEU7CisKKyAgLy8gbWFzcyBmdWVyIGRhcyBsYWcgaXN0IGRhcyBWZXJoYWVsdG5pcyB2b24gdmVyZ2FuZ2VuZXIgU29sbHplaXQgKERpZmZlcmVuegorICAvLyBIQi1Db3VudHMgKiAyKSB1bmQgdmVyZ2FuZ2VuZXIgSXN0emVpdCAoRGlmZmVyZW56IHZvbiB0aW1lKCkpLiBVbmQgZGFzCisgIC8vIGdhbnplIHdpcmQgZGFubiBhbHMgQWJ3ZWljaHVuZyB2b24gMSBnZXNwZWljaGVydCAoMCwgd2VubiBrZWluIExhZykKKyAgaW50ICpub3d0aW1lID0gdXRpbWUoKTsKKyAgZmxvYXQgdGltZWRpZmYgPSB0b19mbG9hdCgobm93dGltZVswXS1sYXN0dGltZVswXSkpIAorICAgICAgICAgICAgICAgICArIHRvX2Zsb2F0KG5vd3RpbWVbMV0tbGFzdHRpbWVbMV0pLzEwMDAwMDAuMDsKKworLy8gIGxhZ2RhdGFbaW5kZXhdID0gMS4wIC0KKy8vICAgICAgICAgICAgICAgICAgICh0b19mbG9hdCgoaGJjb3VudCAtIGxhc3RoYmNvdW50KSAqIF9fSEVBUlRfQkVBVF9JTlRFUlZBTF9fKQorLy8gICAgICAgICAgICAgICAgICAgICAvIHRpbWVkaWZmKTsKKy8vICBsYWdkYXRhW2luZGV4XSA9ICh0aW1lZGlmZiAtCisvLyAgICB0b19mbG9hdCgoaGJjb3VudCAtIGxhc3RoYmNvdW50KSAqIF9fSEVBUlRfQkVBVF9JTlRFUlZBTF9fKSkgLworLy8gICAgdG9fZmxvYXQoKGhiY291bnQgLSBsYXN0aGJjb3VudCkgKiBfX0hFQVJUX0JFQVRfSU5URVJWQUxfXyk7CisgIGxhZ2RhdGFbaW5kZXhdID0gYWJzKHRvX2Zsb2F0KChoYmNvdW50IC0gbGFzdGhiY291bnQpICogX19IRUFSVF9CRUFUX0lOVEVSVkFMX18pCisgICAgICAgICAgICAgICAgICAgIC0gdGltZWRpZmYpICAvCisgICAgICAgICAgICAgICAgICAgdG9fZmxvYXQoKGhiY291bnQgLSBsYXN0aGJjb3VudCkgKiBfX0hFQVJUX0JFQVRfSU5URVJWQUxfXyk7CisKKworICBoYmRhdGFbaW5kZXhdID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVFNfTEFTVF9QUk9DRVNTRUQpOworICBjb2RhdGFbaW5kZXhdID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0NBTExPVVRTKTsKKworICAvKiAgICAgICAgICAgICAgICAgICAgIAorICBERUJVRyhzcHJpbnRmKCJJbmRleDogJWQ6ICVkLyUuNmYgPT4gJTo2ZiAvMVxuIixpbmRleCwKKyAgICAgICAgKGhiY291bnQgLSBsYXN0aGJjb3VudCkqMiwKKyAgICAgICAgdGltZWRpZmYsIGxhZ2RhdGFbaW5kZXhdKSk7CisgICovICAgICAgCisgIGxhc3RoYmNvdW50PWhiY291bnQ7CisgIGxhc3R0aW1lPW5vd3RpbWU7CisgCisgIGxhZyA9IGNhbGNfYXZlcmFnZXMobGFnZGF0YSwgbGFnLCBpbmRleCwgMTAwLjApOworICAvLyBNdWx0aXBsaXppZXJlbiBtaXQgMTAwCisgIC8vREVCVUcoc3ByaW50ZigiJU9cbiIsbGFnKSk7CisgIC8vbGFnID0gbWFwKGxhZywgZnVuY3Rpb24gZmxvYXQgKGZsb2F0IGYpIHtyZXR1cm4gZioxMDAuMDt9ICk7CisgIC8vREVCVUcoc3ByaW50ZigiJU9cbiIsbGFnKSk7CisgIGhicyA9IG1hcChjYWxjX2F2ZXJhZ2VzKGhiZGF0YSwgaGJzLCBpbmRleCwxLjApLCMndG9faW50KTsKKyAgY2FsbG91dHMgPSBtYXAoY2FsY19hdmVyYWdlcyhjb2RhdGEsIGNhbGxvdXRzLCBpbmRleCwxLjApLCMndG9faW50KTsKKworICAvLyB1bmQgYXVzc2VyZGVtIG1hbCBldHdhcyBsb2dnZW4gZnVlciBkZW4gTW9tZW50CisgIGlmIChsYWdbMF0gPiAxMDAwIHx8IGNhbGxvdXRzWzBdID4gMTAwMCkKKyAgeworICBMT0dNQVgoc3ByaW50ZigiJXMsICVkLCAlZCwgJTo2ZiwgJTo2ZiwgJTo2ZiwgJTo2ZiwgJTo2ZiwgJTo2ZiwgIgorICAgICAgICAgICAgICAiJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgIgorICAgICAgICAgICAgICAiJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgXG4iLAorICAgICAgICAgIHN0cmZ0aW1lKCIleSVtJWQtJUglTSVTIiksdGltZSgpLGhiY291bnQsCisgICAgICAgICAgbGFnWzBdLGxhZ1sxXSxsYWdbMl0sbGFnWzNdLGxhZ1s0XSxsYWdbNV0sCisgICAgICAgICAgaGJzWzBdLGhic1sxXSxoYnNbMl0saGJzWzNdLGhic1s0XSxoYnNbNV0sCisgICAgICAgICAgY2FsbG91dHNbMF0sY2FsbG91dHNbMV0sY2FsbG91dHNbMl0sY2FsbG91dHNbM10sY2FsbG91dHNbNF0sCisgICAgICAgICAgY2FsbG91dHNbNV0pKTsKKyAgfQorICBlbHNlIGlmIChoYmNvdW50JTgwID09IDAgfHwgbGFnWzBdID4gMTApCisgIHsKKyAgTE9HKHNwcmludGYoIiVzLCAlZCwgJWQsICU6NmYsICU6NmYsICU6NmYsICU6NmYsICU6NmYsICU6NmYsICIKKyAgICAgICAgICAgICAgIiVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICIKKyAgICAgICAgICAgICAgIiVkLCAlZCwgJWQsICVkLCAlZCwgJWQsIFxuIiwKKyAgICAgICAgICBzdHJmdGltZSgiJXklbSVkLSVIJU0lUyIpLHRpbWUoKSxoYmNvdW50LAorICAgICAgICAgIGxhZ1swXSxsYWdbMV0sbGFnWzJdLGxhZ1szXSxsYWdbNF0sbGFnWzVdLAorICAgICAgICAgIGhic1swXSxoYnNbMV0saGJzWzJdLGhic1szXSxoYnNbNF0saGJzWzVdLAorICAgICAgICAgIGNhbGxvdXRzWzBdLGNhbGxvdXRzWzFdLGNhbGxvdXRzWzJdLGNhbGxvdXRzWzNdLGNhbGxvdXRzWzRdLAorICAgICAgICAgIGNhbGxvdXRzWzVdKSk7CisgIH0KK30KKworZmxvYXQgKnJlYWRfbGFnX2RhdGEoKSB7CisgIHJldHVybiAoe2xhZ1syXSxsYWdbNF0sbGFnWzVdfSk7Cit9CitmbG9hdCAqcmVhZF9leHRfbGFnX2RhdGEoKSB7CisgIHJldHVybiBjb3B5KGxhZyk7Cit9CitpbnQgKnJlYWRfaGJfZGF0YSgpIHsKKyAgcmV0dXJuIGNvcHkoaGJzKTsKK30KK2ludCAqcmVhZF9jb19kYXRhKCkgeworICByZXR1cm4gY29weShjYWxsb3V0cyk7Cit9CisKZGlmZiAtLWdpdCBhL3AvZGFlbW9uL21hbmQuYyBiL3AvZGFlbW9uL21hbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODBjNTBlCi0tLSAvZGV2L251bGwKKysrIGIvcC9kYWVtb24vbWFuZC5jCkBAIC0wLDAgKzEsMTY5IEBACisvLworLy8gbWFuZC5jIC0gTWFucGFnZSBEYWVtb24KKy8vCisvLyBFcndlaXRlcnQgdW5kIHVtZ2VhcmJlaXRldCBmdWVyIGRpZSBBbmJpbmR1bmcgZHVyY2gKKy8vIGRpZSBNYWdpZXJzaGVsbAorLy8KKy8vIHZvbiBNYW5kcmFnb25ATUcKKy8vCisvLyBCYXNpZXJ0IGF1ZiBkZXIgQXJiZWl0IHZvbiBIYWRyYSxNdXBmZWwgdW5kIFR5cm9uCisvLyAoYWxsZSBAQW5kZXJsYW5kKQorLy8KKworI2RlZmluZSBERUJVR0dFUiAibWFuZHJhZ29uIgorCisjZGVmaW5lIERFQlVHKHgpIGlmIChmaW5kX3BsYXllcihERUJVR0dFUikpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0ZWxsX29iamVjdChmaW5kX3BsYXllcihERUJVR0dFUikseCsiXG4iKQorCisKKyNwcmFnbWEgc3RyaWN0X3R5cGVzLHNhdmVfdHlwZXMKKyNwcmFnbWEgbm9fY2xvbmUsbm9fc2hhZG93CisKKyNpbmNsdWRlIDxkYWVtb24vbWFuZC5oPgorCitwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIHBhZ2VzOworcHJpdmF0ZSBub3NhdmUgc3RyaW5nICprZXlzOworcHJpdmF0ZSBub3NhdmUgbWFwcGluZyBwYWdlc19jYXNlOworcHJpdmF0ZSBub3NhdmUgc3RyaW5nICprZXlzX2Nhc2U7CisKK3N0YXRpYyBzdHJpbmcgZ2xvYjJyZWdleHAoc3RyaW5nIHN0cikKK3sKKyAgc3RyPXJlZ3JlcGxhY2Uoc3RyLCIoW1xcLlxcXlxcJFxcW1xcXVxcKFxcKV0pIiwiXFxcXFxcMSIsMSk7CisgIHN0cj1yZWdyZXBsYWNlKHN0ciwiXFwqIiwiLioiLDEpOworICByZXR1cm4gcmVncmVwbGFjZSgiXiIrc3RyKyIkIiwiPyIsIi4iLDEpOworfQorCit2b2lkIGNhY2hlX2VudHJ5KHN0cmluZyBlbnRyeSwgc3RyaW5nIGRpciwgc3RyaW5nIGZpbGUpCit7CisgIHN0cmluZyAqZGF0YTsKKyAgaW50IGo7CisKKyAgaWYgKG1fY29udGFpbnMoJmRhdGEscGFnZXMsbG93ZXJfY2FzZShlbnRyeSkpKQorICB7CisgICAgaj1zaXplb2YoZGF0YSk7CisgICAgd2hpbGUoai0tKSBkYXRhWy0tal09ZGF0YVtqXTsKKyAgICBwYWdlc1tsb3dlcl9jYXNlKGVudHJ5KV09ZGF0YSsoeyBkaXIrIi8iK2ZpbGUsIGRpcisiLyIrZmlsZX0pOworICB9CisgIGVsc2UKKyAgeworICAgIHBhZ2VzW2xvd2VyX2Nhc2UoZW50cnkpXT0oe2VudHJ5LGRpcisiLyIrZmlsZX0pOworICAgIGtleXMrPSh7bG93ZXJfY2FzZShlbnRyeSl9KTsKKyAgfQorICBpZiAobV9jb250YWlucygmZGF0YSxwYWdlc19jYXNlLGVudHJ5KSkKKyAgeworICAgIGo9c2l6ZW9mKGRhdGEpOworICAgIHdoaWxlKGotLSkgZGF0YVstLWpdPWRhdGFbal07CisgICAgcGFnZXNfY2FzZVtlbnRyeV09ZGF0YSsoeyBkaXIrIi8iK2ZpbGUsIGRpcisiLyIrZmlsZX0pOworICB9CisgIGVsc2UKKyAgeworICAgIHBhZ2VzX2Nhc2VbZW50cnldPSh7ZW50cnksZGlyKyIvIitmaWxlfSk7CisgICAga2V5c19jYXNlKz0oe2VudHJ5fSk7CisgIH0KKyAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBsb2FkX3N5bm9ueW1zKHN0cmluZyBkaXIpCit7CisgIHN0cmluZyBmaWxlZGF0YSwqc3luOworCisgIGlmIChmaWxlX3NpemUoTUFORF9ET0NESVIrZGlyKyIvLnN5bm9ueW0iKTw9MCkgcmV0dXJuOworICBpZiAoIShmaWxlZGF0YT1yZWFkX2ZpbGUoTUFORF9ET0NESVIrZGlyKyIvLnN5bm9ueW0iKSkpIHJldHVybjsKKyAgc3luPXJlZ2V4cGxvZGUoZmlsZWRhdGEsICIoWyBcdF1bIFx0XSp8XG4pIiktKHsiIn0pOworICBzeW4tPXJlZ2V4cChzeW4sIl4oWyBcdF1bIFx0XSp8XG4pJCIpOworICB3aGlsZShzaXplb2Yoc3luKSkKKyAgeworICAgIGNhY2hlX2VudHJ5KHN5blswXSxkaXIsc3luWzFdKTsKKyAgICBzeW49c3luWzIuLl07CisgIH0KKyAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBjYWNoZV9kaXJlY3Rvcnkoc3RyaW5nIGRpcikKK3sKKyAgc3RyaW5nIGZpbGU7CisgIGludCBpLGo7CisgIG1peGVkICpmaWxlczsKKworICBmaWxlcyA9IGdldF9kaXIoTUFORF9ET0NESVIrZGlyKyIvKiIsMyl8fCh7fSk7CisgIGk9c2l6ZW9mKGZpbGVzKTsKKyAgZm9yIChqPTA7ajxpOykKKyAgeworICAgIGZpbGU9ZmlsZXNbaisrXTsKKyAgICBpZiAoZmlsZVswXT09Jy4nKQorICAgIHsKKyAgICAgIGorKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoZmlsZXNbaisrXT09LTIpCisgICAgeworICAgICAgY2FjaGVfZGlyZWN0b3J5KGRpcisiLyIrZmlsZSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgY2FjaGVfZW50cnkoZmlsZSxkaXIsZmlsZSk7CisgIH0KKyAgbG9hZF9zeW5vbnltcyhkaXIpOworfQorCit2b2lkIHVwZGF0ZV9jYWNoZSgpCit7CisgIGludCBpOworICBzdHJpbmcgKmRvY2RpcnM7CisgIG1peGVkICp0bXA7CisKKyAgdG1wPWdldF9kaXIoTUFORF9ET0NESVIgIioiLDMpOworICBkb2NkaXJzPSh7fSk7CisgIHBhZ2VzPShbXSk7CisgIHBhZ2VzX2Nhc2U9KFtdKTsKKyAga2V5c19jYXNlPSh7fSk7CisgIGtleXM9KHt9KTsKKyAgaT1zaXplb2YodG1wKTsKKyAgd2hpbGUoaS0tKQorICAgIGlmICh0bXBbaV09PS0yKQorICAgICAgZG9jZGlycys9KHsgdG1wWyhpLS0pLTFdIH0pOworICBkb2NkaXJzLT0oeyIuIiwiLi4ifSk7CisgIGRvY2RpcnMtPU1BTkRfRVhDTFVERTsKKyAgaT1zaXplb2YoZG9jZGlycyk7CisgIHdoaWxlKGktLSkgY2FjaGVfZGlyZWN0b3J5KGRvY2RpcnNbaV0pOworICByZXR1cm47Cit9CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgc2V0ZXVpZChnZXR1aWQoKSk7CisgIHVwZGF0ZV9jYWNoZSgpOworICBzZXRfbmV4dF9yZXNldCgxMDA4MCk7IC8vRWlubWFsIHBybyBXb2NoZSBsYW5ndAorICByZXR1cm47Cit9CisKK3ZvaWQgcmVzZXQoKQoreworICB1cGRhdGVfY2FjaGUoKTsKKyAgc2V0X25leHRfcmVzZXQoMTAwODApOworICByZXR1cm47Cit9CisKKy8vCisvLyBsb2NhdGUoKTogTWFucGFnZSBpbSBDYWNoZSBzdWNoZW46CisvLyBtYXRjaCA9IDEgLT4gZ2xvYi1tYXRjaGluZywgbWF0Y2g9MiAtPiByZWdleHAtbWF0Y2hpbmcKKy8vIFBydWVmdW5nIG9iIHN0ciBndWVsdGlnZSByZWdleHAgZXJmb2xndCBpbiBkZXIgU2hlbGwKKy8vCisKK3N0cmluZyAqbG9jYXRlKHN0cmluZyBzdHIsaW50IG1hdGNoKQoreworICBzdHJpbmcgKm1hdGNoZXMsKnJldCxzdHIyOworICBpbnQgaTsKKworICBpZiAoIW1hdGNoJiZtZW1iZXIoa2V5c19jYXNlLHN0cikhPS0xKSByZXR1cm4gcGFnZXNfY2FzZVtzdHJdOworICBzdHI9bG93ZXJfY2FzZShzdHIpOworICBpZiAobWF0Y2g9PTEpIHN0cj1nbG9iMnJlZ2V4cChzdHIpOworICBpZiAobWF0Y2gpIG1hdGNoZXM9cmVnZXhwKGtleXMsc3RyKTsKKyAgZWxzZSBpZiAobWVtYmVyKGtleXMsc3RyKSE9LTEpIG1hdGNoZXM9KHsgc3RyIH0pOworICBlbHNlIHJldHVybiAoe30pOworCisgIHJldD0oe30pOworICBpPXNpemVvZihtYXRjaGVzKTsKKyAgd2hpbGUoaS0tKQorICAgIHJldCs9cGFnZXNbbWF0Y2hlc1tpXV07CisgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9wL2RhZW1vbi9tb25leWxvZy5jIGIvcC9kYWVtb24vbW9uZXlsb2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2E1OWJmCi0tLSAvZGV2L251bGwKKysrIGIvcC9kYWVtb24vbW9uZXlsb2cuYwpAQCAtMCwwICsxLDI0NiBAQAorLy8gTG9nLURhZW1vbiwgdW0gR2VsZGJ1Z3MgenUgZmluZGVuLgorLy8KKy8vIE5vY2ggZXhwZXJpbWVudGVsbCwgaWNoIGZlaWxlIG5vY2ggZmxlaXNzaWcgYW4gZGVuIFdlcnRlbiZDby4KKy8vIFdlciBtaXIgb2huZSB0cmlmdGlnZW4gR3J1bmQgZGFyYW4gaGVydW1wZnVzY2h0LCBkZXIgd2lyZCBzdGFuZGVzcmVjaHRsaWNoCisvLyBtaXQgZmF1bGVuIEVpZXJuIGJld29yZmVuLiBdOi0+CisvLworLy8gVGlhbWFrCisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHNhdmVfdHlwZXMKKyNwcmFnbWEgbm9fY2xvbmUsbm9fc2hhZG93CisKKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxtb25leS5oPgorCisjZGVmaW5lIExPR05BTUUgIkFERE1PTkVZIgorI2RlZmluZSBTQVZFRklMRSAiL3AvZGFlbW9uL3NhdmUvbW9uZXlsb2ciCisKKyNkZWZpbmUgVEhSRVNIT0xEX0hPVVJMWSAxMDAwMCAvLyB3aWV2aWVsIEdlbGQgZGFyZiBtYW4gYW4gZWluZXIgU3RlbGxlIHBybworI2RlZmluZSBUSFJFU0hPTERfREFJTFkgIDUwMDAwIC8vIFN0dW5kZS9UYWcgYmVrb21tZW4sIG9obmUgZGFzcyBnZWxvZ2d0IHdpcmQ/CisKKworcHJpdmF0ZSBtYXBwaW5nIG1vbiwgZ3JlbnplbjsKK3ByaXZhdGUgaW50IGNoZWNrLCBuZXh0X3Jlc2V0OworCisKK3B1YmxpYyB2b2lkIGNyZWF0ZSgpCit7ICAgIAorICAgIC8vIHdpciBtdWVzc2VuIFNhdmVmaWxlIHNjaHJlaWJlbiBkdWVyZmVuCisgICAgc2V0ZXVpZChnZXR1aWQoKSk7CisgICAgCisgICAgaWYgKCAhcmVzdG9yZV9vYmplY3QoU0FWRUZJTEUpICl7CisgICAgICAgIG1vbiA9IG1fYWxsb2NhdGUoIDAsIDIgKTsKKyAgICAgICAgZ3JlbnplbiA9IG1fYWxsb2NhdGUoIDAsIDIgKTsKKyAgICAgICAgY2hlY2sgPSAwOworICAgICAgICBuZXh0X3Jlc2V0ID0gMzYwMDsKKyAgICB9CisKKyAgICBpZiAoIG5leHRfcmVzZXQgPiAzNjAwICkKKyAgICAgICAgbmV4dF9yZXNldCA9IDM2MDA7CisKKyAgICBpZiAoIG5leHRfcmVzZXQgPCA2MCApCisgICAgICAgIG5leHRfcmVzZXQgPSA2MDsKKworICAgIC8vIEF1c3dlcnR1bmcgamVkZSBTdHVuZGUKKyAgICBzZXRfbmV4dF9yZXNldCggbmV4dF9yZXNldCApOworICAgIG5leHRfcmVzZXQgKz0gdGltZSgpOworfQorCisKKy8vIFNvcnRpZXJmdW5rdGlvbmVuCisKK3N0YXRpYyBpbnQgX3NvcnRfaG91cmx5KCBzdHJpbmcgZm4xLCBzdHJpbmcgZm4yICkKK3sKKyAgICByZXR1cm4gbW9uW2ZuMSwgMF0gPiBtb25bZm4yLCAwXTsKK30KKworCitzdGF0aWMgaW50IF9zb3J0X2RhaWx5KCBzdHJpbmcgZm4xLCBzdHJpbmcgZm4yICkKK3sKKyAgICByZXR1cm4gbW9uW2ZuMSwgMV0gPiBtb25bZm4yLCAxXTsKK30KKworCisvLyBpbSByZXNldCgpIHdpcmQgZGllIEF1c3dlcnR1bmcgdm9yZ2Vub21tZW4KK3B1YmxpYyB2b2lkIHJlc2V0KCkKK3sKKyAgICBpbnQgaTsKKyAgICBzdHJpbmcgKmZpbGVzLCB0eHQ7CisKKyAgICAvLyBrZWluZW4gQXVmcnVmIHBlciBIYW5kIGJpdHRlCisgICAgaWYgKCB0aW1lKCkgPCBuZXh0X3Jlc2V0ICkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gQXVzd2VydHVuZyBqZWRlIFN0dW5kZQorICAgIHNldF9uZXh0X3Jlc2V0KDM2MDApOworICAgIG5leHRfcmVzZXQgPSB0aW1lKCkgKyAzNjAwOworICAgIGNoZWNrKys7CisgICAgdHh0ID0gIiI7CisgICAgCisgICAgZmlsZXMgPSBzb3J0X2FycmF5KCBtX2luZGljZXMobW9uKSwgIydfc29ydF9ob3VybHkvKicqLyApOworCisgICAgZm9yICggaSA9IHNpemVvZihmaWxlcyk7IGktLTsgKXsKKyAgICAgICAgaWYgKCAhKGdyZW56ZW5bZmlsZXNbaV0sIDBdIDwgMCkgJiYKKyAgICAgICAgICAgICAoZ3JlbnplbltmaWxlc1tpXSwgMF0gJiYgbW9uW2ZpbGVzW2ldLCAwXSA+IGdyZW56ZW5bZmlsZXNbaV0sIDBdKQorICAgICAgICAgICAgIHx8ICghZ3JlbnplbltmaWxlc1tpXSwgMF0gJiYgbW9uW2ZpbGVzW2ldLCAwXSA+IFRIUkVTSE9MRF9IT1VSTFkpICkKKyAgICAgICAgICAgIHR4dCArPSBzcHJpbnRmKCAiJTEyZCAtLS0gJXNcbiIsIG1vbltmaWxlc1tpXSwgMF0sIGZpbGVzW2ldICk7CisgICAgCisgICAgICAgIG1vbltmaWxlc1tpXSwgMF0gPSAwOworICAgIH0KKworICAgIC8vIG51ciBsb2dnZW4sIHdlbm4gZXMgYXVjaCBldHdhcyB6dSBsb2dnZW4gZ2lidAorICAgIGlmICggdHh0ICE9ICIiICkKKyAgICAgICAgbG9nX2ZpbGUoIExPR05BTUUsIHNwcmludGYoICIlczogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI9PT09PT09PT09PT09PShzdHVlbmRsaWNoKT09PVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0aW1lKHRpbWUoKSlbNC4uMTVdICkgKyB0eHQgKTsKKworICAgIC8vIGRlciAiZ3Jvc3NlIiBDaGVjayBrb21tdCBudXIgZWlubWFsIHBybyBUYWcKKyAgICBpZiAoIGNoZWNrIDwgMjQgKXsKKyAgICAgICAgc2F2ZV9vYmplY3QoU0FWRUZJTEUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY2hlY2sgPSAwOworICAgIHR4dCA9ICIiOworICAgIGZpbGVzID0gc29ydF9hcnJheSggbV9pbmRpY2VzKG1vbiksICMnX3NvcnRfZGFpbHkvKicqLyApOworICAgIAorICAgIGZvciAoIGkgPSBzaXplb2YoZmlsZXMpOyBpLS07ICkKKyAgICAgICAgaWYgKCAhKGdyZW56ZW5bZmlsZXNbaV0sIDFdIDwgMCkgJiYKKyAgICAgICAgICAgICAoZ3JlbnplbltmaWxlc1tpXSwgMV0gJiYgbW9uW2ZpbGVzW2ldLCAxXSA+IGdyZW56ZW5bZmlsZXNbaV0sIDFdKQorICAgICAgICAgICAgIHx8ICghZ3JlbnplbltmaWxlc1tpXSwgMV0gJiYgbW9uW2ZpbGVzW2ldLCAxXSA+IFRIUkVTSE9MRF9EQUlMWSkgKQorICAgICAgICAgICAgdHh0ICs9IHNwcmludGYoICIlMTJkIC0tLSAlc1xuIiwgbW9uW2ZpbGVzW2ldLCAxXSwgZmlsZXNbaV0gKTsKKworICAgIGlmICggdHh0ICE9ICIiICkKKyAgICAgICAgbG9nX2ZpbGUoIExPR05BTUUsIHNwcmludGYoICIlczogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI9PT09PT09PT09PT09PSh0YWVnbGljaCk9PT09PVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0aW1lKHRpbWUoKSlbNC4uMTVdICkgKyB0eHQgKTsKKworICAgIG1vbiA9IG1fYWxsb2NhdGUoIDEsIDIgKTsKKyAgICBzYXZlX29iamVjdChTQVZFRklMRSk7Cit9CisKKworLy8gZGllIGVpZ2VudGxpY2hlIExvZ2ctRnVua3Rpb24KK3B1YmxpYyB2b2lkIEFkZE1vbmV5KCBvYmplY3Qgb2IsIGludCBhbW91bnQgKQoreworICAgIHN0cmluZyBmbjsKKworICAgIC8vIGtlaW5lIE1hbmlwdWxhdGlvbmVuIHBlciBIYW5kIGJpdHRlCisgICAgaWYgKCAhb2JqZWN0cChvYikgfHwgYW1vdW50IDwgMCB8fCAhcHJldmlvdXNfb2JqZWN0KCkgfHwKKyAgICAgICAgICghcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShwcmV2aW91c19vYmplY3QoKSkgJiYKKyAgICAgICAgICBsb2FkX25hbWUocHJldmlvdXNfb2JqZWN0KCkpICE9IEdFTEQpCisgICAgICAgICB8fCBJU19MRUFSTkVSKHByZXZpb3VzX29iamVjdCgpKSApCisgICAgICAgIHJldHVybjsKKworICAgIGZuID0gZXhwbG9kZSggb2JqZWN0X25hbWUob2IpLCAiIyIgKVswXTsKKworICAgIG1vbltmbiwgMF0gKz0gYW1vdW50OworICAgIG1vbltmbiwgMV0gKz0gYW1vdW50OworfQorCisKKy8vIFNhdmVmaWxlIG5vY2ggc2NobmVsbCBhYnNwZWljaGVybiAtIHdpciB3b2xsZW4gamEga2VpbmUgRGF0ZW4gdmVybGllcmVuIDstKQorcHVibGljIGludCByZW1vdmUoKQoreworICAgIG5leHRfcmVzZXQgPSBxdWVyeV9uZXh0X3Jlc2V0KHRoaXNfb2JqZWN0KCkpIC0gdGltZSgpOworICAgIHNhdmVfb2JqZWN0KFNBVkVGSUxFKTsKKworICAgIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOworICAgIHJldHVybiAxOworfQorCisKKy8vIGZ1ZXIgYmVzdGltbXRlIEZpbGVzIGthbm4gbWFuIGRpZSBHcmVuendlcnRlIGVpbnplbG4gc2V0emVuCitwdWJsaWMgdmFyYXJncyBpbnQgbW9kaWZ5X3RocmVzaG9sZCggc3RyaW5nIGZuLCBpbnQgYW1vdW50MSwgaW50IGFtb3VudDIgKQoreworICAgIGlmICggIXRoaXNfaW50ZXJhY3RpdmUoKSB8fCB0aGlzX2ludGVyYWN0aXZlKCkgIT0gdGhpc19wbGF5ZXIoKSB8fAorICAgICAgICAgIUlTX0FSQ0godGhpc19pbnRlcmFjdGl2ZSgpKSB8fCBwcm9jZXNzX2NhbGwoKSApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGlmICggIXN0cmluZ3AoZm4pIHx8ICFpbnRwKGFtb3VudDEpIHx8ICFpbnRwKGFtb3VudDIpICkKKyAgICAgICAgcmV0dXJuIC0yOworCisgICAgaWYgKCAhYW1vdW50MSAmJiAhYW1vdW50MiApeworICAgICAgICBtX2RlbGV0ZSggZ3JlbnplbiwgZm4gKTsKKyAgICAgICAgd3JpdGUoICJFaW50cmFnICIgKyBmbiArICIgZ2Vsb2VzY2h0LlxuIiApOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBncmVuemVuW2ZuLCAwXSA9IGFtb3VudDE7CisgICAgZ3JlbnplbltmbiwgMV0gPSBhbW91bnQyOworICAgIAorICAgIHdyaXRlKCBicmVha19zdHJpbmcoICJEaWUgR3JlbnplbiBmdWVyICIgKyBmbiArICIgYmV0cmFnZW4gamV0enQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgKChhbW91bnQxIDwgMCkgPyAidW5lbmRsaWNoIHZpZWxlIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgIHRvX3N0cmluZyhhbW91bnQxKSkgKyAiIE11ZW56ZW4gZnVlciBkZW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICJzdHVlbmRsaWNoZW4gdW5kICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICgoYW1vdW50MiA8IDApID8gInVuZW5kbGljaCB2aWVsZSIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICB0b19zdHJpbmcoYW1vdW50MikpICsgIiBNdWVuemVuIGZ1ZXIgZGVuIHRhZWdsaWNoZW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICJDaGVjay4iLCA3OCApICk7CisKKyAgICBzYXZlX29iamVjdChTQVZFRklMRSk7CisgICAgcmV0dXJuIDE7Cit9CisKKworLy8gZWluemVsbiBnZXNldHp0ZSBHcmVuendlcnRlIGFiZnJhZ2VuCitwdWJsaWMgdmFyYXJncyBtaXhlZCBxdWVyeV90aHJlc2hvbGRzKCBzdHJpbmcgc3RyICkKK3sKKyAgICBpbnQgaTsKKyAgICBzdHJpbmcgKmZpbGVzLCB0eHQ7CisgICAgCisgICAgaWYgKCAhdGhpc19wbGF5ZXIoKSApCisgICAgICAgIHJldHVybiBkZWVwX2NvcHkoZ3Jlbnplbik7CisKKyAgICBpZiAoIHN0cmluZ3Aoc3RyKSAmJiBtZW1iZXIoIGdyZW56ZW4sIHN0ciApICl7CisgICAgICAgIHdyaXRlKCBicmVha19zdHJpbmcoICJEaWUgR3JlbnplbiBmdWVyICIgKyBzdHIgKyAiIGJldHJhZ2VuICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGdyZW56ZW5bc3RyLCAwXSA8IDApID8gInVuZW5kbGljaCB2aWVsZSIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9fc3RyaW5nKGdyZW56ZW5bc3RyLCAwXSkpICsgIiBNdWVuemVuIGZ1ZXIgZGVuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0dWVuZGxpY2hlbiB1bmQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZ3JlbnplbltzdHIsIDFdIDwgMCkgPyAidW5lbmRsaWNoIHZpZWxlIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b19zdHJpbmcoZ3JlbnplbltzdHIsIDFdKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIE11ZW56ZW4gZnVlciBkZW4gdGFlZ2xpY2hlbiBDaGVjay4iLCA3OCApICk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICggc3RyaW5ncChzdHIpICYmIHN0ciAhPSAiIiApeworICAgICAgICB3cml0ZSggIkVzIHNpbmQga2VpbmUgR3JlbnplbiBmdWVyICIgKyBzdHIgKyAiIGVpbmdldHJhZ2VuIVxuIiApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBmaWxlcyA9IHNvcnRfYXJyYXkoIG1faW5kaWNlcyhncmVuemVuKSwgIyc8LyonKi8gKTsKKyAgICB0eHQgPSAiRWluZ2V0cmFnZW5lIEdyZW56d2VydGU6XG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCisgICAgICAgICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiI7CisKKyAgICBmb3IgKCBpID0gc2l6ZW9mKGZpbGVzKTsgaS0tOyApCisgICAgICAgIHR4dCArPSBzcHJpbnRmKCAiJScuJy00OHMgOiAlOGQgKGgpICUxMGQgKGQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXNbaV0sIGdyZW56ZW5bZmlsZXNbaV0sIDBdLCBncmVuemVuW2ZpbGVzW2ldLCAxXSApOworCisgICAgdGhpc19wbGF5ZXIoKS0+TW9yZSggdHh0ICk7CisgICAgcmV0dXJuIDE7Cit9CisKKworLy8gYmlzaGVyIGdlbG9nZ3RlIERhdGVuIGFiZnJhZ2VuCitwdWJsaWMgbWl4ZWQgcXVlcnlfc3RhdHVzKCkKK3sKKyAgICBpbnQgaTsKKyAgICBzdHJpbmcgKmZpbGVzLCB0eHQ7CisgICAgCisgICAgaWYgKCAhdGhpc19wbGF5ZXIoKSApCisgICAgICAgIHJldHVybiBkZWVwX2NvcHkobW9uKTsKKworICAgIGZpbGVzID0gc29ydF9hcnJheSggbV9pbmRpY2VzKG1vbiksICMnPC8qJyovICk7CisgICAgdHh0ID0gIkdlbGRxdWVsbGVuOlxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgorICAgICAgICAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iOworCisgICAgZm9yICggaSA9IHNpemVvZihmaWxlcyk7IGktLTsgKQorICAgICAgICB0eHQgKz0gc3ByaW50ZiggIiUnLictNDhzIDogJThkIChoKSAlMTBkIChkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzW2ldLCBtb25bZmlsZXNbaV0sIDBdLCBtb25bZmlsZXNbaV0sIDFdICk7CisKKyAgICB0aGlzX3BsYXllcigpLT5Nb3JlKCB0eHQgKTsKKyAgICByZXR1cm4gMTsKK30KKworCisvLyBrZWluZSBTaGFkb3dzIGJpdHRlCitwdWJsaWMgdmFyYXJncyBpbnQgcXVlcnlfcHJldmVudF9zaGFkb3coIG9iamVjdCBvYiApIHsgcmV0dXJuIDE7IH0KZGlmZiAtLWdpdCBhL3AvZGFlbW9uL25hbWVmYWtlLmMgYi9wL2RhZW1vbi9uYW1lZmFrZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MTQ2YjIKLS0tIC9kZXYvbnVsbAorKysgYi9wL2RhZW1vbi9uYW1lZmFrZS5jCkBAIC0wLDAgKzEsNTQgQEAKKy8qIERpZXNlcyBPYmpla3QgZGllbnQgenVtIEZha2VuIHZvbiBOYW1lbiBmdWVyIGRlbiBDaGFubmVsZC4KKyAqIEhpbnRlcmdydW5kOiBkZXIgQ2hhbm5lbGQgYnJhdWNodCBiZWltIHNlbmQoKSBlaW4gT2JqZWt0IChiencuIGRpZSBpbiBkZXIKKyAqIFZlcmFyYmVpdHVuZyBkYW5uIGZvbGdlbmRlbiBQcm9ncmFtbWUpLiBEZXIgTXVkbGlibWFzdGVyIHNlbmRldCBNZWxkdW5nIGluCisgKiBhbmRlcmVyIExldXRlIE5hbWVuIChkZXIgZGFyZiBkYXMgYXVjaCkuIERhZnVlciBjbG9udCB1bmQga29uZmlndXJpZXJ0IGVyCisgKiBkaWVzZXMgT2JqZWt0IHVuZCB1ZWJlcmdpYnQgZXMgYW4gZGVuIGNoYW5uZWxkLiBOYWNoIDNzIHJhZXVtZW4gc2ljaCBDbG9uZQorICogZGllc2VzIE9iamVrdGVzIHdpZWRlciBhdWYuCisgKiBGYWxscyBkZXIgU3BpZWxlci9OUEMgZXhpc3RpZXJ0LCB3ZW5uIGRpZSBtZWxkdW5nIGdlc2VuZGV0IHdpcmQsIHdpcmQgdm9tCisgKiBNYXN0ZXIgZGFzIHJpY2h0aWdlIE9iamVrdCB1ZWJlcmdlYmVuLCBuaWNodCBkaWVzZXMgaGllci4KKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisKK2luaGVyaXQgIi9zdGQvc2VjdXJlX3RoaW5nIjsKKworLy8gRW52Y2hlY2stTWVjaGFuaXNtdXMgbWlzc2JyYXVjaGVuLiA7LSkKK3Byb3RlY3RlZCB2b2lkIGNoZWNrX2Zvcl9lbnZpcm9ubWVudChzdHJpbmcgY2xvbmVyKQoreworICBpZiAoY2xvbmVwKHRoaXNfb2JqZWN0KCkpKQorICAgIHJlbW92ZSgxKTsKK30KKworLy8gWnVyIFNpY2hlcmhlaXQgYXVjaCBpbSBSZXNldAordm9pZCByZXNldCgpCit7CisgIGlmIChjbG9uZXAodGhpc19vYmplY3QoKSkpCisgICAgcmVtb3ZlKDEpOworfQorCisvLyBLb3BpZSBhdXMgL3N0ZC90aGluZy9wcm9wZXJ0aWVzLmMuIE1hbiBicmF1Y2h0IGRhdm9uIHdvaGwga2VpbgorLy8genVnYWVuZ2xpY2hlcyBpbiBqZWRlbSB0aGluZy4uLgorLy8gV2VsY2hlIGV4dGVybmVuIE9iamVrdGUgZHVlcmZlbiB6dWdyZWlmZW4/Citub21hc2sgcHJpdmF0ZSBpbnQgYWxsb3dlZCgpCit7CisgICAgaWYgKCAocHJldmlvdXNfb2JqZWN0KCkgJiYgSVNfQVJDSChnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpKSAmJgorICAgICAgICAgIHRoaXNfaW50ZXJhY3RpdmUoKSAmJiBJU19BUkNIKHRoaXNfaW50ZXJhY3RpdmUoKSkpIHx8CisgICAgICAgICAocHJldmlvdXNfb2JqZWN0KCkgJiYgZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKSA9PSBST09USUQgJiYKKyAgICAgICAgICBnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSA9PSBST09USUQpICkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7Cit9CisKKy8vIFNvbGx0ZSBudXIgdm9uIFJPT1Qgb2RlciBFTSsgbWFuaXB1bGllcnQgd2VyZGVuLgorLy8gU3ByaWNoLCBkYXMgdHV0IHNvLCBhbHMgc2VpZW4gYWxsZSBQcm9wcyBTRUNVUkVECitwdWJsaWMgdmFyYXJncyBtaXhlZCBTZXQoIHN0cmluZyBuYW1lLCBtaXhlZCB2YWx1ZSwgaW50IHR5cGUsIGludCBleHRlcm4gKQoreworICBpZiAoKGV4dGVybiB8fCBleHRlcm5fY2FsbCgpKQorICAgICAgJiYgcHJldmlvdXNfb2JqZWN0KCkgIT0gdGhpc19vYmplY3QoKQorICAgICAgJiYgIWFsbG93ZWQoKSkgLy8gYXVzIHRoaW5nL3Byb3BlcnRpZXMuYworICAgIHJldHVybiAtMTsKKworICByZXR1cm4gOjpTZXQobmFtZSwgdmFsdWUsIHR5cGUsIGV4dGVybik7Cit9CisKZGlmZiAtLWdpdCBhL3AvZGFlbW9uL29iamVjdC5oIGIvcC9kYWVtb24vb2JqZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y3ZTIwZgotLS0gL2Rldi9udWxsCisrKyBiL3AvZGFlbW9uL29iamVjdC5oCkBAIC0wLDAgKzEsMzggQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBPQkpFQ1QuSCAtLSBwZXJzaXN0ZW50IG9iamVjdCBoYW5kbGluZworLy8KKy8vICREYXRlOiAxOTk1LzAzLzMxIDEzOjMwOjMzICQKKy8vICRSZXZpc2lvbjogMS4xICQKKy8qICRMb2c6IG9iamVjdC5oLHYgJAorICogUmV2aXNpb24gMS4xICAxOTk1LzAzLzMxICAxMzozMDozMyAgSGF0ZQorICogSW5pdGlhbCByZXZpc2lvbgorICoKKyAqIFJldmlzaW9uIDEuMSAgMTk5NC8wMy8yMCAgMTc6MDc6MjggIEhhdGUKKyAqIEluaXRpYWwgcmV2aXNpb24KKyAqCisgKi8KKyAKKyNpZm5kZWYgX19PQkpFQ1RfSF9fCisjZGVmaW5lIF9fT0JKRUNUX0hfXworCisvLyBkZWZpbmVzCisjZGVmaW5lIE9CSkVDVEQgICAgICAgIi9wL2RhZW1vbi9vYmplY3RkIgorI2RlZmluZSBPQkpFQ1REX1NBVkUgICIvcC9kYWVtb24vc2F2ZS9vYmplY3RkIgorCisjZW5kaWYgLy8gX19PQkpFQ1RfSF9fCisKKyNpZmRlZiBORUVEX1BST1RPVFlQRVMKKworI2lmbmRlZiBfX09CSkVDVF9IX1BST1RPX18KKyNkZWZpbmUgX19PQkpFQ1RfSF9QUk9UT19fCisKKy8vIHByb3RvdHlwZXMKK21peGVkIEFkZE9iamVjdChzdHJpbmcgb2JqLCBzdHJpbmcgZW52KTsKK21peGVkIFJlbW92ZU9iamVjdChzdHJpbmcgb2JqLCBzdHJpbmcgZW52KTsKK3ZhcmFyZ3Mgdm9pZCBRdWVyeU9iamVjdChtaXhlZCBlbnYpOworCisKKyNlbmRpZiAvLyBfX09CSkVDVF9IX1BST1RPX18KKworI2VuZGlmCS8vIE5FRURfUFJPVE9ZUEVTCmRpZmYgLS1naXQgYS9wL2RhZW1vbi9vYmplY3RkLmMgYi9wL2RhZW1vbi9vYmplY3RkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI1ZDgyMQotLS0gL2Rldi9udWxsCisrKyBiL3AvZGFlbW9uL29iamVjdGQuYwpAQCAtMCwwICsxLDE1MCBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIE9CSkVDVEQuQyAtLSBvYmplY3QgZGFlbW9uCisvLworLy8gJERhdGU6IDE5OTUvMDQvMDMgMTQ6NDc6MDIgJAorLy8gJFJldmlzaW9uOiA5NTEwICQKKy8qICRMb2c6IG9iamVjdGQuYyx2ICQKKyAqIFJldmlzaW9uIDEuMiAgMTk5NS8wNC8wMyAxNDo0NzowMiAgV2FyZ29uCisgKiBRdWVyeU9iamVjdCgpIHZlcndlbmRldCBiZWkgQmx1ZVByaW50cyBqZXR6dCBhdWNoIEFkZEl0ZW0uCisgKgorICogUmV2aXNpb24gMS4xICAxOTk1LzAzLzMxICAxMzozMDozMyAgSGF0ZQorICogSW5pdGlhbCByZXZpc2lvbgorICoKKyAqLworCisjcHJhZ21hIHN0cm9uZ190eXBlcyxzYXZlX3R5cGVzLHJ0dF9jaGVja3MKKyNwcmFnbWEgbm9fY2xvbmUsIG5vX3NoYWRvdworCisjaW5jbHVkZSA8cm9vbXMuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPGRhZW1vbi5oPgorCittYXBwaW5nIG9iamVjdHMgPSAoW10pOworcHJpdmF0ZSBub3NhdmUgaW50IGRvX3NhdmU7CisKKyNkZWZpbmUgQ0xBU1MgICAwCisjZGVmaW5lIERBVEEgICAgMQorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICBzZXRldWlkKGdldHVpZChNRSkpOworICByZXN0b3JlX29iamVjdChPQkpFQ1REX1NBVkUpOworfQorCitwcm90ZWN0ZWQgdm9pZCByZXNldCgpIHsKKyAgaWYgKGRvX3NhdmUpCisgIHsKKyAgICBzYXZlX29iamVjdChPQkpFQ1REX1NBVkUpOworICAgIGRvX3NhdmU9MDsKKyAgfQorfQorCitzdHJpbmcgQWRkT2JqZWN0KG9iamVjdCBvYmosIHN0cmluZyBlbnYpCit7CisgIGlmKCFvYmogfHwgIWVudiB8fCAhb2JqZWN0cChvYmopIHx8ICFzdHJpbmdwKGVudikpCisgICAgcmV0dXJuIDA7CisKKyAgLy8gc2F2ZSBpbmZvcm1hdGlvbgorICBpZighbWVtYmVyKG9iamVjdHMsIGVudikpCisgICAgb2JqZWN0c1tlbnZdID0gKHsgKHsgIG9iamVjdF9uYW1lKG9iaiksIG9iai0+UXVlcnlQcm9wKFBfQVVUT0xPQUQpIH0pIH0pOworICBlbHNlCisgICAgb2JqZWN0c1tlbnZdICs9ICh7ICh7IG9iamVjdF9uYW1lKG9iaiksIG9iai0+UXVlcnlQcm9wKFBfQVVUT0xPQUQpIH0pIH0pOworCisgIGRvX3NhdmU9MTsKKyAgcmV0dXJuIGVudjsKK30KKworaW50IFJlbW92ZU9iamVjdChvYmplY3R8c3RyaW5nIG9iaiwgc3RyaW5nIGVudikKK3sKKyAgaWYoIW9iaiB8fCAhZW52IHx8ICFzdHJpbmdwKGVudikpCisgICAgcmV0dXJuIDA7CisKKyAgLy8gc2F2ZSBpbmZvcm1hdGlvbgorICBpZihtZW1iZXIob2JqZWN0cywgZW52KSkKKyAgeworICAgIG1peGVkIG9ibGlzdCA9IG9iamVjdHNbZW52XTsKKyAgICBmb3JlYWNoKG1peGVkIGFycjogJm9ibGlzdCkKKyAgICB7CisgICAgICBpZiAobG9hZF9uYW1lKGFycltDTEFTU10pID09IGxvYWRfbmFtZShvYmopKQorICAgICAgeworICAgICAgICBhcnIgPSAwOworICAgICAgICAvLyBudXIgZWlucyBBdXN0cmFnZW4sIG5pY2h0IGFsbGUsIGZhbGxzIG1laHIgYWxzIGVpbm1hbCBhbmdlbWVsZGV0CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBvYmplY3RzW2Vudl0gPSBvYmxpc3QgLSAoezB9KTsKKyAgfQorICBpZighc2l6ZW9mKG9iamVjdHNbZW52XSkpCisgICAgbV9kZWxldGUob2JqZWN0cywgZW52KTsKKworICBkb19zYXZlPTE7CisgIHJldHVybiAxOworfQorCisvLyBGcmFndCBuaWNodCB3aXJrbGljaCBhYiwgc29uZGVybiBlcnN0ZWxsdCBkaWUgYW5nZW1lbGRldGVuIE9iamVrdCBpbiBlbnYuCisvLyBXZW5uIGtlaW4gZW52LCB3aXJkIHByZXZpb3VzX29iamVjdCgpIGdlbm9tbWVuLgordmFyYXJncyB2b2lkIFF1ZXJ5T2JqZWN0KHN0cmluZyBlbnZuYW1lKQoreworICBvYmplY3QgZW52OworICAvLyB0YWtlIHRoZSBjYWxsZXIgYXMgdGhlIHF1ZXN0aW9uaW5nIG9iamVjdAorICBpZighZW52bmFtZSB8fCAhc3RyaW5ncChlbnZuYW1lKSkKKyAgICBlbnYgPSBwcmV2aW91c19vYmplY3QoKTsKKyAgZWxzZQorICAgIGVudiA9IGZpbmRfb2JqZWN0KGVudm5hbWUpOworCisgIC8vIHRhcmdldCBtdXN0IGJlIGEgYmx1ZXByaW50CisgIGlmKElTX0NMT05FKGVudikpIHJldHVybiAwOworCisgIGVudm5hbWU9b2JqZWN0X25hbWUoZW52KTsKKyAgaWYobWVtYmVyKG9iamVjdHMsIGVudm5hbWUpKQorICB7CisgICAgbWl4ZWQgb2JsaXN0ID0gb2JqZWN0c1tlbnZuYW1lXTsKKyAgICBmb3JlYWNoKG1peGVkIGFyciA6ICZvYmxpc3QpCisgICAgeworICAgICAgIC8vIFdpciBtdWVzc2VuIHVudGVyc2NoZWlkZW4sIG9iIGVpbiBDbG9uZSBhbmdlbWVsZGV0ZSB3dXJkZSBvZGVyIGVpbmUKKyAgICAgICAvLyBCbHVlcHJpbnQuCisgICAgICAgb2JqZWN0IG87CisgICAgICAgc3RyaW5nICpuID0gZXhwbG9kZShhcnJbQ0xBU1NdLCAiIyIpOworICAgICAgIGlmIChzaXplb2YobikgPiAxICYmIHNpemVvZihuWzFdKSA+IDApCisgICAgICAgICBvID0gZW52LT5BZGRJdGVtKG5bMF0sIFJFRlJFU0hfREVTVFJVQ1QpOworICAgICAgIGVsc2UKKyAgICAgICAgIG8gPSBlbnYtPkFkZEl0ZW0oblswXSwgUkVGUkVTSF9ERVNUUlVDVCwgMSk7CisgICAgICAgby0+U2V0UHJvcChQX0FVVE9MT0FELCBhcnJbREFUQV0pOworICAgICAgIC8vIFVuZCBkYXMgbmV1ZSBPYmpla3QgbWVya2VuIChuZSBWZXJ3ZW5kdW5nIGhhdCBkYXMgenVyIFplaXQgYWJlcgorICAgICAgIC8vIG5pY2h0KQorICAgICAgIGFycltDTEFTU10gPSBvYmplY3RfbmFtZShvKTsKKyAgICB9CisgIH0KK30KKworLy8gTGllZmVydCBlaW5lIExpc3RlIGRlciBpbiBlbnYgYW5nZW1lbGRldGVuIE9iamVrdGUuIFdlbm4ga2VpbiBlbnYsIHdpcmQKKy8vIHByZXZpb3VzX29iamVjdCgpIGdlbm9tbWVuLgorcHVibGljIHZhcmFyZ3Mgc3RyaW5nIFF1ZXJ5T2JqZWN0cyhzdHJpbmcgZW52bmFtZSkKK3sKKyAgb2JqZWN0IGVudjsKKyAgLy8gdGFrZSB0aGUgY2FsbGVyIGFzIHRoZSBxdWVzdGlvbmluZyBvYmplY3QKKyAgaWYoIWVudm5hbWUgfHwgIXN0cmluZ3AoZW52bmFtZSkpCisgICAgZW52ID0gcHJldmlvdXNfb2JqZWN0KCk7CisgIGVsc2UKKyAgICBlbnYgPSBmaW5kX29iamVjdChlbnZuYW1lKTsKKworICAvLyB0YXJnZXQgbXVzdCBiZSBhIGJsdWVwcmludAorICBpZihJU19DTE9ORShlbnYpKSByZXR1cm4gMDsKKworICBtaXhlZCBhcnJhcnIgPSBvYmplY3RzW29iamVjdF9uYW1lKGVudildOworICBpZiAoYXJyYXJyKQorICB7CisgICAgcmV0dXJuIENvdW50VXAobWFwKGFycmFyciwgIydbLCBDTEFTUyksIiwgIiwiLCAiKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworcHVibGljIHZhcmFyZ3MgaW50IHJlbW92ZShpbnQgc2lsZW50KQoreworICBzYXZlX29iamVjdChPQkpFQ1REX1NBVkUpOworICBkZXN0cnVjdChNRSk7CisgIHJldHVybiAxOworfQorCmRpZmYgLS1naXQgYS9wL2RhZW1vbi9wYXRoZC5jIGIvcC9kYWVtb24vcGF0aGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2QzNGFkCi0tLSAvZGV2L251bGwKKysrIGIvcC9kYWVtb24vcGF0aGQuYwpAQCAtMCwwICsxLDEwMDAgQEAKKy8vIERhZW1vbiB6dW0gYXV0b21hdGlzaWVydGVuIEVyc3RlbGxlbiB2b24gS2FydGVuLgorLy8gU29sbCBzcGFldGVyIG1hbCB3aWNodGlnZSBXZWdlIGJlcmVjaG5lbiBrb2VubmVuIGZ1ZXIgQW5mYWVuZ2VyLgorLy8KKy8vCisvLyBXZXIgbWlyIG9obmUgdHJpZnRpZ2VuIEdydW5kIGRhcmFuIGhlcnVtcGZ1c2NodCwgZGVyIHdpcmQgc3RhbmRlc3JlY2h0bGljaAorLy8gbWl0IGZhdWxlbiBFaWVybiBiZXdvcmZlbi4gXTotPgorLy8KKy8vIFRpYW1haworCisjcHJhZ21hIHN0cm9uZ190eXBlcyxzYXZlX3R5cGVzLHJ0dF9jaGVja3MKKyNwcmFnbWEgbm9fY2xvbmUsbm9faW5oZXJpdCxub19zaGFkb3cKKyNwcmFnbWEgcGVkYW50aWMscmFuZ2VfY2hlY2ssd2Fybl9kZXByZWNhdGVkCisjcHJhZ21hIHdhcm5fZW1wdHlfY2FzdHMsd2Fybl9taXNzaW5nX3JldHVybix3YXJuX2Z1bmN0aW9uX2luY29uc2lzdGVudAorCisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPHBsYXllci5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxyb29tcy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorCisjZGVmaW5lIExPR05BTUUgIlBBVEhEIgorI2RlZmluZSBTQVZFRklMRSAiL3AvZGFlbW9uL3NhdmUvcGF0aGQiCisjZGVmaW5lIERVTVBGSUxFICIvcC9kYWVtb24vc2F2ZS9wYXRoZC1kdW1wIgorLy8jZGVmaW5lIERFQlVHCisKKy8vIDEwIHZlcnNjaGllZGVuZSBMZXV0ZSB3ZXJkZW4gZ2VicmF1Y2h0LCB1bSBlaW5lIFZlcmJpbmR1bmcgenUgdmVyaWZpemllcmVuCisjZGVmaW5lIE5FRURFRCAxMAorI2RlZmluZSBUSU1FT1VUX05FVyAxMjA5NjAwICAvLyAxNCBUYWdlCisjZGVmaW5lIFRJTUVPVVRfT0xEIDc3NzYwMDAgLy8gOTAgVGFnZQorCisvLyBBcnQgZGVzIEF1c2dhbmdzCisjZGVmaW5lIE5PUk1BTCAgMAorI2RlZmluZSBTUEVDSUFMIDEKKyNkZWZpbmUgQ09NTUFORCAyCisKKy8vIEtvc3RlbiBmdWVyIHVudGVyc2NoaWVkbGljaGUgV2VnZQorI2RlZmluZSBDT1NUX0VYSVRTICh7IDEsIDEwLCAxMDAgfSkKKyNkZWZpbmUgQ09TVF9NQU5ZICAgMworI2RlZmluZSBDT1NUX0ZFVyAgICA1CisjZGVmaW5lIENPU1RfT05FICAgMTAKKy8vIEtvc3RlbiBmdWVyIFdlbHRlbndlY2hzZWwgKFBhcmEgLT4gTm9ybWFsKQorI2RlZmluZSBDT1NUX1dPUkxEQ0hBTkdFIDEwMAorCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgREJHKHgpIGlmICggZmluZF9wbGF5ZXIoInplc3N0cmEiKSApIFwKKyAgICAgICAgICAgICAgICAgICB0ZWxsX29iamVjdCggZmluZF9wbGF5ZXIoInplc3N0cmEiKSwgKHgpKyJcbiIgKTsKKyNkZWZpbmUgVEVMTF9VU0VSKHgpIGlmICggdGhpc19wbGF5ZXIoKSApIFwKKyAgICAgICAgICAgICAgICAgICB0ZWxsX29iamVjdCggdGhpc19wbGF5ZXIoKSwgKHgpKyJcbiIgKTsKKyNlbHNlCisjZGVmaW5lIERCRyh4KQorI2RlZmluZSBURUxMX1VTRVIoeCkKKyNlbmRpZgorCisjZGVmaW5lIExPRyh4KSBsb2dfZmlsZSggIlBBVEhEIiwgKHgpLCAxMDAwMDAgKTsKKworLy8gVmFyaWFibGVuCitub3NhdmUgaW50IHRpbWVfdG9fY2xlYW5fdXA7IC8vIFplaXQgZnVlciBuYWVjaHN0ZXMgQ2xlYW51cCBkZXIgRGF0ZW4KKworbWFwcGluZyBwYXRobWFwOworLyogUHJlZml4IDogKFsgPHN1Ym1hcD4gXSksCisgICA8c3VibWFwPiBpc3QgZWluIE1hcHBpbmcgdm9uIFJhZXVtZW4gbWl0IGVpbmVtIEFycmF5IHZvbiBWZXJiaW5kdW5nZW46CisgICAoWzxyb29tPjogKHsgY29ubjEsIGNvbm4yLCBjb25uMywgLi4ufSksIC4uLl0pCisgICBKZWRlIFZlcmJpbmR1bmcgaXN0IGVpbiBBcnJheSBtaXQgZm9sZ2VuZGVuIEluZGl6ZXM6CisgICAqLworI2RlZmluZSBDT05OX0RFU1QgICAgIDAgICAvLyBaaWVscmF1bQorI2RlZmluZSBDT05OX0NNRCAgICAgIDEgICAvLyBLb21tYW5kbworI2RlZmluZSBDT05OX1VTRVJTICAgIDIgICAvLyBCZW51dHplcjogKHtzcGllbGVyLCBzZWhlcn0pCisjZGVmaW5lIENPTk5fRVhJVFRZUEUgMyAgIC8vIEF1c2dhbmdzYXJ0IChzLm8uKQorI2RlZmluZSBDT05OX1RJTUVTICAgIDQgICAvLyBaZWl0IGxldHp0ZXIgQmVudXR6dW5nOiAoe3NwaWVsZXIsc2VoZXJ9KQorI2RlZmluZSBDT05OX1BBUkEgICAgIDUgICAvLyBQYXJhd2VsdAorI2RlZmluZSBDT05OX0ZMQUdTICAgIDYgICAvLyBGbGFncyBmdWVyIGRpZSBWZXJiaW5kdW5nICh6LkIuIHBlcm1hbmVudCkKKy8vIEluZGl6ZXMgaW4gQ09OTl9VU0VSUy4gQmVpZGUgRWludHJhZWdlIHNpbmQgZW50d2VkZXIgZ2VoYXNodGUgVUlEcyBPREVSIC0xLAorLy8gd2VubiBkaWUgVmVyYmluZHVuZyB2b24gbWVociBhbHMgTkVFREVEIHVudGVyc2NoaWVkbGljaGVuIGdlZ2FuZ2VuIHd1cmRlLgorI2RlZmluZSBDT05OX1VfUExBWUVSUyAwICAvLyBTcGllbGVyLVVJRHMKKyNkZWZpbmUgQ09OTl9VX1NFRVJTICAgMSAgLy8gU2VoZXItVUlEUworLy8gSW5kaXplcyB2b24gQ09OTl9USU1FUy4gWmVpdHN0ZW1wZWwgZGVyIGxldHp0ZW4gQmVudXR6dW5nLi4uCisjZGVmaW5lIENPTk5fVF9QTEFZRVJTIENPTk5fVV9QTEFZRVJTICAvLyAuLi4gZHVyY2ggU3BpZWxlcgorI2RlZmluZSBDT05OX1RfU0VFUlMgICBDT05OX1VfU0VFUlMgIC8vIC4uLiBkdXJjaCBTZWhlcgorCisvLyBLb25zdGFudGVuIGZ1ZXIgQ09OTl9GTEFHUworI2RlZmluZSBDRkxBR19QRVJNQU5FTlQgICAweDEgIC8vIFZlcmJpbmR1bmcgbmljaHQgZXhwaXJlbgorI2RlZmluZSBDRkxBR19ET05UVVNFICAgICAweDIgIC8vIFZlcmJpbmR1bmcgbmljaHQgaW0gUm91dGluZyBudXR6ZW4KKyNkZWZpbmUgQ0ZMQUdfRFVQTElDQVRFICAgMHg0ICAvLyBLb21tYW5kbyBoYXQgbWVocmVyZSBWZXJiaW5kdW5nZW4KKworLy8gbGF1ZmVuZGUgUGZhZHN1Y2hlbgorbm9zYXZlIG1hcHBpbmcgc2VhcmNobGlzdCA9IChbXSk7CisvKgorICAgKFsgPHV1aWQ+IDogU0xfVklTSVRFRDsgU0xfREVTVElOQVRJT047Li4uIC4uLiBdKQorICovCisvLyBJbmRpemVzIGluIDxkYXRhPjoKKyNkZWZpbmUgU0xfU1RBUlQgICAgICAgMAorI2RlZmluZSBTTF9ERVNUSU5BVElPTiAxICAvLyBaaWVscmF1bQorI2RlZmluZSBTTF9WSVNJVEVEICAgICAyICAvLyBhYmdlbGF1ZmVuZS9nZXBydWVmdGUgUmFldW1lCisjZGVmaW5lIFNMX0NBTkRJREFURVMgIDMgIC8vIG1vZWdsaWNoZSBaaWVsZQorI2RlZmluZSBTTF9XSVpMRVZFTCAgICA0ICAvLyBXaXpsZXZlbAorI2RlZmluZSBTTF9QQVJBICAgICAgICA1ICAvLyBQYXJhd2VsdAorI2RlZmluZSBTTF9UT0RPICAgICAgICA2ICAvLyBub2NoIHp1IHBydWVmZW5kZSBSYXVtZSAoU0xfQ0FORElEQVRFUy1TTF9WSVNJVEVEKQorI2RlZmluZSBTTF9DQUxMQkFDSyAgICA3ICAvLyBDbG9zdXJlIGZ1ZXIgQ2FsbGJhY2sgbmFjaCBSb3V0ZW5iZXJlY2hudW5nCisvLyBTTF9DQU5ESURBVEVTOiAoWzxyYXVtPjogKHt2ZXJiaW5kdW5nc2RhdGVufSksIC4uLl0pCisvLyBJbmRpemVzIGltIEFycmF5IDx2ZXJiaW5kdW5nc2RhdGVuPjoKKyNkZWZpbmUgU0xUX0NPU1RTICAgICAwICAgLy8gS29zdGVuIGZ1ZXIgVmVyYmluZHVuZyBiaXMgaGllcgorI2RlZmluZSBTTFRfV0FZICAgICAgIDEgICAvLyBiaXNoZXJpZ2VyIFdlZyB2b24gU3RhcnQgYmlzIGhpZXIKKyNkZWZpbmUgU0xUX0NPTU1BTkRTICAyICAgLy8gS29tbWFuZG9zIGZ1ZXIgV2VnIHZvbiBTdGFydCBiaXMgaGllcgorCisvLyBjYWNoZSBmdWVyIGJlcmVjaG5ldGUgV2VnZQorbm9zYXZlIG1hcHBpbmcgcGF0aGNhY2hlID0gKFtdKTsKKy8vIEF1ZmJhdTogKFsgInN0YXJ0cmF1bSI6IDxkZXN0cz4sIC4uLl0pCisvLyA8ZGVzdHM+OiAoWyJ6aWVscmF1bSI6IDx3ZWdlPiwgLi4uXSkKKy8vIDx3ZWdlPjogKFtwYXJhd2VsdDogKDxzdHJ1Y3QgcGF0aF9zPikgXSkKKworc3RydWN0IHBhdGhfcyB7CisgICAgaW50IGNvc3RzOyAgICAgIC8vIEtvc3RlbiBkZXMga29tcGxldHRlbiBQZmFkZXMKKyAgICBzdHJpbmcgKnJvb21zOyAgLy8gTGlzdGUgdm9uIGR1cmNobGF1ZmVuZW4gUmFldW1lbgorICAgIHN0cmluZyAqY21kczsgICAvLyBMaXN0ZSB2b24gS29tbWFuZG9zLCB1bSBSYWV1bWUgenUgZHVyY2hsYXVmZW4KKyAgICBpbnQgdHRsOyAgICAgICAgLy8gdGltZS10by1saXZlLCBBYmxhdWZ6ZWl0IGRlcyBQZmFkcyBpbSBDYWNoZQorICAgIGludCBwYXJhOyAgICAgICAvLyBQYXJhd2VsdAorICAgIGludCBmbGFnczsgICAgICAvLyBGbGFncyB6dSBkZW0gUGZhZAorfTsKKy8vIEZsYWdzIGZ1ZXIgUGZhZGUgaW0gUGZhZGNhY2hlCisjZGVmaW5lIFBGTEFHX1BFUk1BTkVOVCBDRkxBR19QRVJNQU5FTlQKKyNkZWZpbmUgUEZMQUdfRE9OVFVTRSBDRkxBR19ET05UVVNFCisKKworLy8gUHJvdG90eXBlcworcHVibGljIHZvaWQgY3JlYXRlKCk7CitwdWJsaWMgdm9pZCBhZGRfcGF0aHMoIG1peGVkIGNvbm5lY3Rpb25zICk7CitwdWJsaWMgdmFyYXJncyB2b2lkIHNob3dfcGF0aG1hcCggc3RyaW5nIHBhdGggKTsKK3B1YmxpYyB2YXJhcmdzIGludCBzaG93X3N0YXRpc3RpYyggaW50IHZlcmJvc2UsIGludCBzaWxlbnQgKTsKK3B1YmxpYyBpbnQgY2hhbmdlX3BhdGhtYXAoIHN0cmluZyBwZmFkLCBtaXhlZCAqdmVyYmluZHVuZ2VuICk7CitwdWJsaWMgbWFwcGluZyBnZXRfcGF0aG1hcCgpOworcHVibGljIHZvaWQgcmVzZXQoKTsKK3B1YmxpYyB2YXJhcmdzIGludCByZW1vdmUoIGludCBzaWxlbnQgKTsKK3B1YmxpYyB2YXJhcmdzIGludCBxdWVyeV9wcmV2ZW50X3NoYWRvdyggb2JqZWN0IG9iICk7CitzdGF0aWMgaW50IGluc2VydF9wYXRocyggbWl4ZWQgKnBhdGggKTsKK3N0YXRpYyBtaXhlZCAqZm9ybWF0X3BhdGhzKCBtaXhlZCBidWYgKTsKK3N0YXRpYyB2b2lkIF9zZWFyY2goIHN0cmluZyBmbmFtZSwgc3RyaW5nIHN0YXJ0ICk7Citwcml2YXRlIHN0cmluZyBfZ2V0X3ByZWZpeCggc3RyaW5nIHBhdGggKTsKK3Byb3RlY3RlZCB2b2lkIGNsZWFudXBfZGF0YSggc3RyaW5nICpuYW1lcywgaW50IGlkeCApOworcHJvdGVjdGVkIHZvaWQgZXhwaXJlX3BhdGhfY2FjaGUoc3RyaW5nICpzdGFydHJvb21zKTsKKworCitwdWJsaWMgdm9pZCBjcmVhdGUoKQoreworICAgIC8vIHdpciBtdWVzc2VuIGRhcyBTYXZlZmlsZSBzY2hyZWliZW4gZHVlcmZlbgorICAgIHNldGV1aWQoZ2V0dWlkKCkpOworCisgICAgaWYgKCAhcmVzdG9yZV9vYmplY3QoU0FWRUZJTEUpICkgeworICAgICAgICBwYXRobWFwID0gKFtdKTsKKyAgICB9Cit9CisKKworLy8gV2lyZCB2b24gU3BpZWxlcm4gYXVmZ2VydWZlbiBtaXQgZGVuIFdlZ2VuLCBkaWUgc2llIGdlbGF1ZmVuIHNpbmQKK3B1YmxpYyB2b2lkIGFkZF9wYXRocyggbWl4ZWQgY29ubmVjdGlvbnMgKQoreworICAgIG1peGVkIHBhdGhzOworCisgICAgLy8ga2VpbmVuIEF1ZnJ1ZiBwZXIgSGFuZCBiaXR0ZQorICAgIGlmICggIXByZXZpb3VzX29iamVjdCgpIHx8ICF0aGlzX3BsYXllcigpCisgICAgICAgICB8fCB0aGlzX2ludGVyYWN0aXZlKCkgJiYgZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSkgIT0gInplc3N0cmEiCisgICAgICAgICB8fCBmaWxlX3NpemUoICIvc3RkL3NoZWxscyIgKworICAgICAgICAgICAgICAgICAgICAgICBleHBsb2RlKCBvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSksICI6IiApWzBdCisgICAgICAgICAgICAgICAgICAgICAgICsgIi5jIiApIDwgMSApCisgICAgICAgIHJldHVybjsKKworI2lmIF9fQk9PVF9USU1FX18gPCAxMzU3MDQyMDkyCisgICAgLy8gYWx0ZSBTcGllbGVyb2JqZWt0ZSBsaWVmZXJuIG5vY2ggZWluIEFycmF5IHZvbiBTdHJpbmdzIHN0YXR0IGVpbmVzCisgICAgLy8gQXJyYXlzIHZvbiBBcnJheXMuCisgICAgY29ubmVjdGlvbnMgPSBtYXAoY29ubmVjdGlvbnMsIGZ1bmN0aW9uIG1peGVkIChzdHJpbmcgcGF0aCkKKyAgICAgICAgeworICAgICAgICAgIC8vIEFsbGUgRGF0ZW4ga29tbWVuIGFscyBlaW4gU3RyaW5nIG1pdCAnIycgYWxzIFRyZW5uZXIgYW4uCisgICAgICAgICAgLy8gTXVzdGVyOiBTdGFydHJhdW0jWmllbHJhdW0jVmVyYiNNZXRob2RlIGRlciBCZXdlZ3VuZyNQYXJhd2VsdAorICAgICAgICAgIG1peGVkIGJ1ZiA9IGV4cGxvZGUoIHBhdGgsICIjIiApOworICAgICAgICAgIC8vIEZhbGxzIGltIFZlcmIgYXVjaCAjIHZvcmthbSAodW53YWhyc2NoZWlubGljaCwgYWJlciBtb2VnbGljaCk6CisgICAgICAgICAgYnVmWzIuLjwzXSA9ICh7IGltcGxvZGUoIGJ1ZlsyLi48M10sICIjIiApIH0pOworICAgICAgICAgIHJldHVybiBidWY7CisgICAgICAgIH0gCisgICAgICAgICk7CisjZW5kaWYKKworICAgIC8vIERhdGVuIGF1ZmJlcmVpdGVuCisgICAgcGF0aHMgPSBtYXAoIGNvbm5lY3Rpb25zLCAjJ2Zvcm1hdF9wYXRocy8qJyovICkgLSAoezB9KTsKKyAgICAvLyBOZXVlIFJhZXVtZSBlaW50cmFnZW4KKyAgICBmaWx0ZXIoIHBhdGhzLCAjJ2luc2VydF9wYXRocy8qJyovICk7Cit9CisKK3B1YmxpYyBtaXhlZCBnZXRfcGF0aF9mcm9tX2NhY2hlKHN0cmluZyBmcm9tLCBzdHJpbmcgdG8sIGludCBwYXJhKSB7CisgICAgLy8gd2VubiBpbSBDYWNoZSwgYXVzIGRlbSBDYWNoZSBsaWVmZXJuLgorICAgIG1hcHBpbmcgdGFyZ2V0cyA9IHBhdGhjYWNoZVtmcm9tXTsKKyAgICBpZiAodGFyZ2V0cykgeworICAgICAgICBtYXBwaW5nIHBhdGhzID0gdGFyZ2V0c1t0b107CisgICAgICAgIGlmIChwYXRocykgeworICAgICAgICAgICAgaWYgKG1lbWJlcihwYXRocywgcGFyYSkpIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgcGF0aF9zIHAgPSBwYXRoc1twYXJhXTsKKyAgICAgICAgICAgICAgICBpZiAocC0+dHRsID4gdGltZSgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHsgZnJvbSwgdG8sIHBhcmEsIHAtPmNvc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5KHAtPnJvb21zKSwgY29weShwLT5jbWRzKSB9KTsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbV9kZWxldGUocGF0aHMsIHBhcmEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLy8gU3VjaGZ1bmt0aW9uLCB1bSBkaWUga3Vlcnplc3RlIFZlcmJpbmR1bmcgendpc2NoZW4gendlaSBSYWV1bWVuIHp1IGZpbmRlbgorcHVibGljIGludCBTZWFyY2hQYXRoKCBzdHJpbmcgZnJvbSwgc3RyaW5nIHRvLCBpbnQgcGFyYSwKKyAgICAgICAgICAgICAgICAgICAgICAgY2xvc3VyZSBjYWxsYmFjaykKK3sKKyAgICAvLyBQcm8gVUlEIGRhcmYgZXMgbnVyIGVpbmVuIFN1Y2hhdWZ0cmFnIGdlYmVuLgorICAgIHN0cmluZyB1aWQ9Z2V0dWlkKHByZXZpb3VzX29iamVjdCgpKTsKKyAgICBpZiAoIG1lbWJlcihzZWFyY2hsaXN0LHVpZCkgKQorICAgICAgICByZXR1cm4gLTE7CisgICAgLy8gdW5kIG1laHIgYWxzIDUgZ2xlaWNoemVpdGlnIGVyc3RtYWwgYXVjaCBuaWNodC4KKyAgICBpZiAoc2l6ZW9mKHNlYXJjaGxpc3QpPjQpCisgICAgICAgIHJldHVybiAtMjsKKworICAgIC8vIEFuZnJhZ2UgbG9nZ2VuCisgICAgTE9HKHNwcmludGYoIiVzOiBTdWNoZSAlcyAtPiAlcyAoJWQpIHZvbiAlcyAoJXMsICVzLCAlcylcbiIsCisgICAgICAgICAgc3RyZnRpbWUoIiV5JW0lZC0lSCVNJVMiKSwgZnJvbSwgdG8sIHBhcmEsIHVpZCwKKyAgICAgICAgICBvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSksCisgICAgICAgICAgb2JqZWN0X25hbWUodGhpc19wbGF5ZXIoKSkgfHwgIk5PLVBMIiwKKyAgICAgICAgICBvYmplY3RfbmFtZSh0aGlzX2ludGVyYWN0aXZlKCkpIHx8ICJOTy1USSIpICk7CisKKyAgICAvLyB3ZW5uIFN0YXJ0LSBvZGVyIFppZWxyYXVtIG5pY2h0IGJla2FubnQgc2luZCwga2FubiBlcyBhdWNoIGtlaW5lIFJvdXRlCisgICAgLy8gZ2ViZW4uCisgICAgaWYgKCFtZW1iZXIocGF0aG1hcFtfZ2V0X3ByZWZpeCh0byldLHRvKQorICAgICAgICB8fCAhbWVtYmVyKHBhdGhtYXBbX2dldF9wcmVmaXgoZnJvbSldLGZyb20pICkKKyAgICAgICAgcmV0dXJuIC0zOworCisgICAgbWl4ZWQgcGF0aCA9IGdldF9wYXRoX2Zyb21fY2FjaGUoZnJvbSwgdG8sIHBhcmEpOworICAgIGlmIChwYXRoKSB7CisgICAgICAgIGlmIChjYWxsYmFjaykKKyAgICAgICAgICAgIGFwcGx5KGNhbGxiYWNrLHBhdGgpOyAKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorCisgICAgLy8gRGF0ZW5zdHJ1a3R1cmVya2xhZXJ1bmc6IHMuby4KKyAgICBtYXBwaW5nIHRhcmdldHMgPSBtX2FsbG9jYXRlKDEyMDAsMyk7CisgICAgbV9hZGQodGFyZ2V0cyxmcm9tLDAsKHt9KSwoe30pICk7CisgICAgc2VhcmNobGlzdCs9IChbIHVpZDogZnJvbTsgdG87ICh7fSk7CisgICAgICAgICAgICAgICAgICAgICB0YXJnZXRzOworICAgICAgICAgICAgICAgICAgICAgKHF1ZXJ5X3dpel9sZXZlbCh0aGlzX2ludGVyYWN0aXZlKCkpPzE6MCk7CisgICAgICAgICAgICAgICAgICAgICBwYXJhOyAoe30pOyBjYWxsYmFja10pOworCisgICAgLy8gRGllIGVpZ2VudGxpY2hlIFN1Y2hlIHN0YXJ0ZW4KKyAgICBfc2VhcmNoKCB1aWQsIGZyb20gKTsKKworICAgIHJldHVybiAxOworfQorCisvLyBHZXNwZWljaGVydGUgSW5mb3JtYXRpb25lbiB6dSBlaW5lbSBSYXVtIG9kZXIgZWluZW0ga29tcGxldHRlbiBHZWJpZXQKKy8vIGFiZnJhZ2VuLiBHZWJpZXRlIGxhc3NlbiBzaWNoIGFiZXIgbnVyIGFscyAiT3JnYW5pc2F0aW9uc2VpbmhlaXRlbiIgYWJmcmFnZW4uCisvLyBEYWJlaSB3ZXJkZW4gR2ViaWV0ZSB1bnRlcmhhbGIgdm9uIC9kLyogYWxzIC9kL3JlZ2lvbi9tYWdpZXJuYW1lCisvLyBhYmdlc3BlaWNoZXJ0IHVuZCBkZXIgUmVzdCB1bnRlciBkZW4gZXJzdGVuIGJlaWRlbiBUZWlscGZhZGVuLgorcHVibGljIHZhcmFyZ3Mgdm9pZCBzaG93X3BhdGhtYXAoIHN0cmluZyBwYXRoICkKK3sKKyAgICBzdHJpbmcgcHJlOworCisgICAgaWYgKCBwYXRoICkKKyAgICB7CisgICAgICAgIHByZSA9IF9nZXRfcHJlZml4KHBhdGgpOworCisgICAgICAgIGlmICggcHJlID09IHBhdGggKQorICAgICAgICAgICAgLy8gR2FuemVuIFRlaWxiYXVtIGF1c2dlYmVuCisgICAgICAgICAgICBwcmludGYoICJQYXRobWFwWyVPXTogJU9cbiIsIHBhdGgsIHBhdGhtYXBbcGF0aF0gKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgLy8gTnVyIEluZm9zIHVlYmVyIGVpbmVuIFJhdW0gYXVzZ2ViZW4KKyAgICAgICAgICAgIHByaW50ZiggIlBhdGhtYXBbJU9dOiAlT1xuIiwgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgcGF0aG1hcFtwcmVdID8gcGF0aG1hcFtwcmVdW3BhdGhdIDogMCApOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIC8vIE9obmUgQXJndW1lbnQgd2lyZCBkaWUgZ2VzYW10ZSBNYXAgYXVzZ2VnZWJlbi4KKyAgICAgICAgLy8gS2xhcHB0IGFiZXIgZWhlciBuaWNodCAobWVocikgd2VnZW4gQnVmZmVyIG92ZXJmbG93LiA7XikKKyAgICAgICAgcHJpbnRmKCAiUGF0aG1hcDogJU9cbiIsIHBhdGhtYXAgKTsKK30KKworCisvLyBTdGF0aXN0aWMgenUgZGVuIGdlc3BlaWNoZXJ0ZW4gRGF0ZW4gYW56ZWlnZW4uCisvLyBNaXQgJ3ZlcmJvc2UnIHdpcmQgamVkZSBPcmdhbmlzYXRpb25zZWluaGVpdCBlaW56ZWxuIGF1ZmdlbGlzdGV0LCBvaG5lCisvLyB3aXJkIGdyb2IgbmFjaCBSZWdpb25lbiB6dXNhbW1lbmdlZmFzc3QuCitwdWJsaWMgdmFyYXJncyBpbnQgc2hvd19zdGF0aXN0aWMoIGludCB2ZXJib3NlLCBpbnQgc2lsZW50ICkKK3sKKyAgICBpbnQgaSwgZ2VzOworICAgIHN0cmluZyAqaW5kLCBuYW1lOworICAgIG1hcHBpbmcgbTsKKworICAgIGlmICggdmVyYm9zZSApeyAvLyBTdHVyIGplZGVuIEVpbnRyYWcgYXVmbGlzdGVuCisgICAgICAgIGluZCA9IHNvcnRfYXJyYXkoIG1faW5kaWNlcyhwYXRobWFwKSwgIyc8LyonKi8gKTsKKyAgICAgICAgZm9yICggaSA9IHNpemVvZihpbmQpOyBpLS07ICl7CisgICAgICAgICAgICBpZiAoICFzaWxlbnQgKQorICAgICAgICAgICAgICAgIHByaW50ZiggIiUtMzBzOiAlNGRcbiIsIGluZFtpXSwgc2l6ZW9mKHBhdGhtYXBbaW5kW2ldXSkgKTsKKyAgICAgICAgICAgIGdlcyArPSBzaXplb2YocGF0aG1hcFtpbmRbaV1dKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsgICAgICAgICAgLy8gUmVnaW9uZW4genVzYW1tZW5mYXNzZW4KKyAgICAgICAgaW5kID0gbV9pbmRpY2VzKHBhdGhtYXApOworICAgICAgICBtID0gKFtdKTsKKworICAgICAgICBmb3IgKCBpID0gc2l6ZW9mKGluZCk7IGktLTsgKXsKKyAgICAgICAgICAgIGlmIChzdHJzdHIoaW5kW2ldLCIvZC8iKSA9PSAwKQorICAgICAgICAgICAgICAgIC8vIC9kLi4uIGpld2VpbHMgbmFjaCB6d2VpIFRlaWxwZmFkZW4KKyAgICAgICAgICAgICAgICBuYW1lID0gaW1wbG9kZSggZXhwbG9kZSggaW5kW2ldLCAiLyIgKVswLi4yXSwgIi8iICk7CisgICAgICAgICAgICBlbHNlIGlmICggc3Ryc3RyKGluZFtpXSwiL3BsYXllcnMiKSA9PSAwKQorICAgICAgICAgICAgICAgIC8vIEFsbGUgUGxheWVydmVyemVpY2huaXNzZSB6dXNhbW1lbmZhc3NlbiAuLi4KKyAgICAgICAgICAgICAgICBuYW1lID0gIi9wbGF5ZXJzIjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAvLyAuLi4gZGVuIFJlc3QgbmFjaCBlaW5lbSBUZWlscGZhZAorICAgICAgICAgICAgICAgIG5hbWUgPSBpbXBsb2RlKCBleHBsb2RlKCBpbmRbaV0sICIvIiApWzAuLjFdLCAiLyIgKTsKKworICAgICAgICAgICAgaWYgKCAhbVtuYW1lXSApCisgICAgICAgICAgICAgICAgbVtuYW1lXSA9IHNpemVvZiggcGF0aG1hcFtpbmRbaV1dICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbVtuYW1lXSArPSBzaXplb2YoIHBhdGhtYXBbaW5kW2ldXSApOworICAgICAgICB9CisKKyAgICAgICAgaW5kID0gc29ydF9hcnJheSggbV9pbmRpY2VzKG0pLCAjJzwvKicqLyApOworICAgICAgICBmb3IgKCBpID0gc2l6ZW9mKGluZCk7IGktLTsgKXsKKyAgICAgICAgICAgIGlmICggIXNpbGVudCApCisgICAgICAgICAgICAgICAgcHJpbnRmKCAiJS0zMHM6ICU0ZFxuIiwgaW5kW2ldLCBtW2luZFtpXV0gKTsKKyAgICAgICAgICAgIGdlcyArPSBtW2luZFtpXV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoICFzaWxlbnQgKQorICAgICAgICBwcmludGYoICJcbkdlc2FtdDogJWQgUmFldW1lLlxuIiwgZ2VzICk7CisKKyAgICByZXR1cm4gZ2VzOworfQorCisKKy8vIE1hbmlwdWxpZXJlbiBkZXIgaW50ZXJuZW4gUGF0aG1hcC4gTnVyIHp1bSBEZWJ1Z2dlbiB1bmQgc29taXQKKy8vIG51ciBmdWVyIFplc3N0cmEgZXJsYXVidC4gU29uc3QgdmVyaHVuenQgbWlyIG5vY2ggd2VyIG1laW5lIERhdGVuLiA7XikKK3B1YmxpYyBpbnQgY2hhbmdlX3BhdGhtYXAoIHN0cmluZyBwZmFkLCBtaXhlZCAqdmVyYmluZHVuZ2VuICkKK3sKKyAgICBpZiAoICF0aGlzX2ludGVyYWN0aXZlKCkgfHwgZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSkgIT0gInplc3N0cmEiCisgICAgICAgICB8fCAhcHJldmlvdXNfb2JqZWN0KCkgfHwgZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKSAhPSAiemVzc3RyYSIgKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBpZiAoIG1hcHBpbmdwKHZlcmJpbmR1bmdlbikgKXsKKyAgICAgICAgaWYgKCAhcGF0aG1hcFtfZ2V0X3ByZWZpeChwZmFkKV0gKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgcGF0aG1hcFtfZ2V0X3ByZWZpeChwZmFkKV0gPSB2ZXJiaW5kdW5nZW47CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoICFwYXRobWFwW19nZXRfcHJlZml4KHBmYWQpXVtwZmFkXSApCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBwYXRobWFwW19nZXRfcHJlZml4KHBmYWQpXVtwZmFkXSA9IHZlcmJpbmR1bmdlbjsKKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKworLy8gRGllIEZ1bmt0aW9uIGdpYnQgYWxsZSBkZW0gcGF0aGQgYmVrYW5udGVuIFJhZXVtZSBhbHMgTWFwcGluZyB2b24gQXJyYXlzCisvLyB6dXJ1ZWNrLiBTY2hs/HNzZWwgZGVzIE1hcHBpbmdzIHNpbmQgZGFiZWkgR2ViaWV0ZS4KK3B1YmxpYyBtYXBwaW5nIGdldF9yb29tcygpCit7CisgIHN0cmluZyAqc3VibWFwczsKKyAgbWFwcGluZyByb29tbWFwOworICBpbnQgaTsKKworICByb29tbWFwPShbXSk7CisKKyAgc3VibWFwcz1tX2luZGljZXMocGF0aG1hcCk7CisKKyAgaT1zaXplb2Yoc3VibWFwcyk7CisKKyAgd2hpbGUgKGktLSkKKyAgICBpZiAoc2l6ZW9mKG1faW5kaWNlcyhwYXRobWFwW3N1Ym1hcHNbaV1dKSkpCisgICAgICAgIHJvb21tYXBbc3VibWFwc1tpXV09bV9pbmRpY2VzKHBhdGhtYXBbc3VibWFwc1tpXV0pOworCisgIHJldHVybiByb29tbWFwOworfQorCisvLyBEYXRlbiB6dSBlaW5lciBWZXJiaW5kdW5nIHNhbW1lbG4gdW5kIGF1ZmJlcmVpdGVuCitzdGF0aWMgbWl4ZWQgKmZvcm1hdF9wYXRocyggbWl4ZWQgYnVmICkKK3sKKyAgICBzdHJpbmcgY21kLCB1aWQ7CisgICAgb2JqZWN0IG9iOworICAgIG1hcHBpbmcgZXhpdHM7CisgICAgaW50IGFydDsKKworICAgIC8vIE1hZ2llciB1bmQgVGVzdHNwaWVsZXIga29lbm5lbiBhdWNoIGluIG5pY2h0IGFuZ2VzY2hsb3NzZW5lIEdlYmlldGUKKyAgICAvLyB1bmQgd2VyZGVuIGRlc2hhbGIgbmljaHQgYmVhY2h0ZXQuCisgICAgaWYgKCBJU19MRUFSTkVSKHByZXZpb3VzX29iamVjdCgxKSkgfHwKKyAgICAgICAgIElTX0xFQVJORVIobG93ZXJfY2FzZSggcHJldmlvdXNfb2JqZWN0KDEpLT5RdWVyeShQX1RFU1RQTEFZRVIpfHwiIiApKSApCisgICAgICAgIHJldHVybiAwOworCisgICAgY21kID0gdHJpbShidWZbMl0sVFJJTV9CT1RIKTsKKyNpZiBfX0JPT1RfVElNRV9fIDwgMTM1NzA0MjA5MgorICAgIC8vICIgMCIgYW0gRW5kZSBkZXMgQmVmZWhscyBhYnNjaG5laWRlbi4gKmdydW1tZWwqCisgICAgaWYgKGNtZFs8Mi4uXT09IiAwIikKKyAgICAgIGNtZCA9IGNtZFsuLjwzXTsKKyNlbmRpZgorCisgICAgLy8gV2VubiBkZXIgWmllbHJhdW0gYWxzIFN0cmluZyBhbmdlZ2ViZW4gd3VyZGUsIGthbm4gZGVyIGZ1ZWhyZW5kZQorICAgIC8vIFNsYXNoIGZlaGxlbiEKKyAgICBpZiAoIGJ1ZlsxXVswXSAhPSAnLycgKQorICAgICAgICBidWZbMV0gPSAiLyIgKyBidWZbMV07CisKKyAgICAvLyBadW0gQWJmcmFnZW4gZGVyIHp1c2FldHpsaWNoZW4gRGF0ZW4gYnJhdWNoZW4gd2lyIGRhcyBPYmpla3Qgc2VsYmVyCisgICAgY2F0Y2gob2IgPSBsb2FkX29iamVjdChidWZbMF0pO3B1Ymxpc2gpOworICAgIGlmICghb2JqZWN0cChvYikpCisgICAgICAgIHJldHVybiAwOworCisgICAgLy8gS2xlaW5lciBIYWNrIC0gYmVpIFRyYW5zcG9ydGVybiBldGMuIGlzdCAnb2InIGRpZSBuaWNodCBpbml0aWFsaXNpZXJ0ZQorICAgIC8vIEJsdWVwcmludC4gSmVkZSBBYmZyYWdlIHZvbiBQX0VYSVRTIHd1ZXJkZSBuZXR0IGF1ZiAtRGVidWcgc2Nyb2xsZW4uCisgICAgLy8gRGEgUF9JRFMgaW0gY3JlYXRlKCkgYXVmIGplZGVuIEZhbGwgYXVmIGVpbiBBcnJheSBnZXNldHp0IHdpcmQsCisgICAgLy8gbWlzc2JyYXVjaGUgaWNoIGRhcyBoaWVyIGFscyAiSXN0IGluaXRpYWxpc2llcnQiLUZsYWcuCisgICAgaWYgKCAhb2ItPlF1ZXJ5UHJvcChQX0lEUykgKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8vIEFydCBkZXMgQXVzZ2FuZ3MgZmVzdHN0ZWxsZW4uIAorICAgIGlmICggbWFwcGluZ3AoZXhpdHMgPSBvYi0+UXVlcnlQcm9wKFBfRVhJVFMpKSAmJiBleGl0c1tjbWRdICkKKyAgICAgICAgYXJ0ID0gTk9STUFMOyAgIC8vICJub3JtYWxlciIgQXVzZ2FuZworICAgIGVsc2UgaWYgKCBtYXBwaW5ncChleGl0cyA9IG9iLT5RdWVyeVByb3AoUF9TUEVDSUFMX0VYSVRTKSkgJiYgZXhpdHNbY21kXSApCisgICAgICAgIGFydCA9IFNQRUNJQUw7ICAvLyBTcGVjaWFsRXhpdAorICAgIGVsc2UgeworICAgICAgICAvLyBLb21tYW5kb3MsIGRpZSBlaW5lbiBpbiBlaW5lbiBhbmRlcmVuIFJhdW0gYnJpbmdlbgorICAgICAgICBhcnQgPSB0b19pbnQoYnVmWzNdKTsgICAvLyBNb3ZlLU1ldGhvZGUKKworICAgICAgICAvLyBFcyB6YWVobGVuIGFiZXIgbnVyIEJld2VndW5nZW4sIGRpZSBoYWxid2VncyAibm9ybWFsIiBhdXNzZWhlbiwKKyAgICAgICAgLy8gZC5oLiBrZWluIE1fVFBPUlQsIE1fTk9DSEVDSyB1bmQgTV9HTyBtdXNzIGdlc2V0enQgc2Vpbi4KKyAgICAgICAgaWYgKCBhcnQgJiAoTV9UUE9SVCB8IE1fTk9DSEVDSykgfHwgIShhcnQgJiBNX0dPKSApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXJ0ID0gQ09NTUFORDsKKyAgICB9CisKKyAgICAvLyBEaWUgVUlEIGRlciBTcGllbGVyL1NlaGVyIHdpcmQgdmVyc2NobHVlc3NlbHQuCisgICAgLy8gU2NobGllc3NsaWNoIGJyYXVjaGVuIHdpciBzaWUgbnVyIGZ1ZXIgc3RhdGlzdGlzY2hlIFp3ZWNrZSB1bmQgbmljaHQsCisgICAgLy8gdW0gQmV3ZWd1bmdzcHJvZmlsZSB6dSBlcnN0ZWxsZW4uIGNyeXB0KCkgcmVpY2h0IGZ1ZXIgZGllc2UgWndlY2tlCisgICAgLy8gd29obCBlcnN0bWFsLgorICAgIHVpZCA9IGdldHVpZChwcmV2aW91c19vYmplY3QoMSkpOworICAgIHVpZCA9IGNyeXB0KCB1aWQsICJ3MyIgKTsKKworICAgIC8vIFN0YXJ0LCBaaWVsLCBWZXJiLCBXaXpsZXZlbChUUCksIFVJRChUUCksIEFydCBkZXMgQXVzZ2FuZ3MsIFBhcmF3ZWx0CisgICAgcmV0dXJuICh7IGJ1ZlswXSwgYnVmWzFdLCBjbWQsIHF1ZXJ5X3dpel9sZXZlbChwcmV2aW91c19vYmplY3QoMSkpID8gMSA6IDAsCisgICAgICAgICAgICAgICAgICB1aWQsIGFydCwgdG9faW50KGJ1Zls0XSkgfSk7Cit9CisKKy8vIFBydWVmdCBhbGxlIFZlcmJpbmR1bmdlbiBpbSBBcnJheSA8Y29ubnM+LCB3ZWxjaGUgZGFzIGdsZWljaGUgS29tbWFuZG8gd2llCisvLyA8Y29ubj4gaGFiZW4sIG9iIHNpZSBpbiB1bnRlcnNjaGllZGxpY2hlIFJhZXVtZSBmdWVocmVuLiBXZW5uIGphLCBzaW5kIHNpZQorLy8gZnVlciBkYXMgUm91dGluZyBuaWNodCBudXR6YmFyLiBBdXNuYWhtZTogVmVyYmluZHVuZ2VuLCBkaWUgaW4KKy8vIHVudGVyc2NoaWVkbGljaGUgUGFyYXdlbHRlbiBmdWVocmVuLgorLy8gQWVuZGVydCA8Y29ubnM+IGRpcmVrdC4KK3ByaXZhdGUgdm9pZCBjaGVja19hbmRfbWFya19kdXBsaWNhdGVfY29ubnNfYnlfY29ubihtaXhlZCBjb25ucywgbWl4ZWQgY29ubikgeworICAgIGZvcmVhY2gobWl4ZWQgYzogY29ubnMpIHsKKyAgICAgICAgaWYgKCBjW0NPTk5fQ01EXSA9PSBjb25uW0NPTk5fQ01EXQorICAgICAgICAgICAgJiYgY1tDT05OX0RFU1RdICE9IGNvbm5bQ09OTl9ERVNUXQorICAgICAgICAgICAgJiYgY1tDT05OX1BBUkFdID09IGNvbm5bQ09OTl9QQVJBXSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNbQ09OTl9GTEFHU10gfD0gQ0ZMQUdfRFVQTElDQVRFOworICAgICAgICAgICAgY29ubltDT05OX0ZMQUdTXSB8PSBDRkxBR19EVVBMSUNBVEU7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ByaXZhdGUgdm9pZCBjaGVja19hbmRfbWFya19kdXBsaWNhdGVfY29ubnMobWl4ZWQgY29ubnMpIHsKKyAgICBmb3JlYWNoKG1peGVkIGM6IGNvbm5zKQorICAgICAgICBjaGVja19hbmRfbWFya19kdXBsaWNhdGVfY29ubnNfYnlfY29ubihjb25ucywgYyk7Cit9CisKKworLy8gTmV1ZSBWZXJiaW5kdW5nIGluIGRlciBEYXRlbmJhbmsgZWludHJhZ2VuCitzdGF0aWMgaW50IGluc2VydF9wYXRocyggbWl4ZWQgKnBhdGggKQoreworICAgIHN0cmluZyBwcmUgPSBfZ2V0X3ByZWZpeChwYXRoWzBdKTsKKworICAgIC8vIEZhbGxzIG5vY2ggZ2FyIGtlaW4gRWludHJhZyBleGlzdGllcnQsIG5ldSBpbml0aWFsaXNpZXJlbgorICAgIGlmICggIW1hcHBpbmdwKHBhdGhtYXBbcHJlXSkgKQorICAgICAgICBwYXRobWFwW3ByZV0gPSAoW10pOworCisgICAgaWYgKCAhcG9pbnRlcnAocGF0aG1hcFtwcmVdW3BhdGhbMF1dKSApCisgICAgICAgIHBhdGhtYXBbcHJlXVtwYXRoWzBdXSA9ICh7fSk7CisKKyAgICAvLyBBdWZiYXUgdm9uICdwYXRoJzoKKyAgICAvLyAoeyBTdGFydCwgWmllbCwgVmVyYiwgV2l6bGV2ZWwoVFApLCBVSUQoVFApLCBBcnQgZGVzIEF1c2dhbmdzLCBQYXJhIH0pCisgICAgLy8gQXVmYmF1IHZvbiAnY29ubicgKHMuIGF1Y2ggZ2FueiBvYmVuKQorICAgIC8vICh7IFppZWwsIFZlcmIsICh7IFNwaWVsZXItVUlEcywgU2VoZXItVUlEcyB9KSwgQXJ0IGRlcyBBdXNnYW5ncywKKyAgICAvLyAgICh7IExldHp0ZXMgQmV0cmV0ZW4gZHVyY2ggU3BpZWxlciwgZHVyY2ggU2VoZXIgfSksIFBhcmF3ZWx0IH0pCisKKyAgICAvLyBBbGxlIFZlcmJpbmR1bmdlbiBkZXMgUmF1bWVzIGR1cmNoZ2VoZW4KKyAgICBtaXhlZCBjb25ucyA9IHBhdGhtYXBbcHJlXVtwYXRoWzBdXTsKKyAgICAvLyBLb21tYW5kb3MgZGVyIFZlcmJpbmR1bmdlbiBzYW1tZWxuLiBXZW5uIGVzIHp3ZWkgVmVyYmluZHVuZ2VuIG1pdCBkZW0KKyAgICAvLyBnbGVpY2hlbiBLb21tYW5kbyBnaWJ0LCBzaW5kIGJlaWRlIHVuYmVudXR6YmFyLgorICAgIG1peGVkIGNtZHMgPSBtX2FsbG9jYXRlKDEwKTsKKyAgICBpbnQgaTsKKyAgICBmb3IgKCBpID0gc2l6ZW9mKGNvbm5zKTsgaS0tOyApCisgICAgeworICAgICAgICBtaXhlZCBjb25uID0gY29ubnNbaV07CisgICAgICAgIG1fYWRkKGNtZHMsY29ubltDT05OX0NNRF0pOyAvLyBLb21tYW5kb3MgYWxsZXIgQ29ubnMgbWVya2VuCisgICAgICAgIC8vIFdlbm4gWmllbHJhdW0sIFZlcmIgdW5kIFBhcmF3ZWx0IHBhc3NlbiAuLi4KKyAgICAgICAgaWYgKCBjb25uW0NPTk5fREVTVF0gPT0gcGF0aFsxXSAmJiBjb25uW0NPTk5fQ01EXSA9PSBwYXRoWzJdCisgICAgICAgICAgICAgJiYgY29ubltDT05OX1BBUkFdID09IHBhdGhbNl0gKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBXZW5uIHNjaG9uIGdlbnVnIExldXRlIGRpZXNlIFZlcmJpbmR1bmcgZ2VudXR6dCBoYWJlbiwgZWluZmFjaAorICAgICAgICAgICAgLy8gbnVyIGRpZSBaZWl0IGRlciBsZXR6dGVuIEJlbnV0enVuZyBha3R1YWxpc2llcmVuLgorICAgICAgICAgICAgaW50IGluZGV4ID0gcGF0aFszXSA/IENPTk5fVV9TRUVSUyA6IENPTk5fVV9QTEFZRVJTOyAvLyBTZWhlcj8KKyAgICAgICAgICAgIGlmICggY29ubltDT05OX1VTRVJTXVtpbmRleF0gPT0gLTEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbm5bQ09OTl9USU1FU11baW5kZXhdID0gdGltZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQW5zb25zdGVuIGRpZSAobmV1ZT8pIFVJRCBoaW56dWZ1ZWdlbiB1bmQgZGllIFplaXQgYWt0dWFsaXNpZXJlbi4KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25uW0NPTk5fVVNFUlNdW2luZGV4XSA9CisgICAgICAgICAgICAgICAgICAgIGNvbm5bQ09OTl9VU0VSU11baW5kZXhdIC0gKHsgcGF0aFs0XSB9KSArICh7IHBhdGhbNF0gfSk7CisgICAgICAgICAgICAgICAgaWYgKCBzaXplb2YoY29ubltDT05OX1VTRVJTXVtpbmRleF0pID49IE5FRURFRCApCisgICAgICAgICAgICAgICAgICAgIGNvbm5bQ09OTl9VU0VSU11baW5kZXhdID0gLTE7CisKKyAgICAgICAgICAgICAgICBjb25uW0NPTk5fVElNRVNdW2luZGV4XSA9IHRpbWUoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEZhbGxzIGtlaW5lIFZlcmJpbmR1bmcgZ2VwYXNzdCBoYXQsIGVpbmUgbmV1ZSBlcnpldWdlbi4KKyAgICBpZiAoIGkgPCAwICkgeworICAgICAgICBpbnQgaW5kZXggPSBwYXRoWzNdID8gQ09OTl9VX1NFRVJTIDogQ09OTl9VX1BMQVlFUlM7IC8vIFNlaGVyPworICAgICAgICBtaXhlZCB1aWRzID0gKHsgKHt9KSwgKHt9KSB9KTsKKyAgICAgICAgdWlkc1tpbmRleF0gPSAoeyBwYXRoWzRdIH0pOworICAgICAgICBtaXhlZCB0aW1lcyA9ICh7IDAsIDAgfSk7CisgICAgICAgIHRpbWVzW2luZGV4XSA9IHRpbWUoKTsKKworICAgICAgICAvLyBBdWZiYXUgc2llaGUgb2JlbgorICAgICAgICBtaXhlZCBjb25uID0gKHsgcGF0aFsxXSwgcGF0aFsyXSwgdWlkcywgcGF0aFs1XSwgdGltZXMsIHBhdGhbNl0sIDAgfSk7CisgICAgICAgIGNvbm5zICs9ICh7IGNvbm4gfSk7CisgICAgICAgIC8vIHdlbm4gZGllIG5ldWUgVmVyYmluZHVuZyBuZW4gS29tbWFuZG8gYmVudXR6dCwgd2VsY2hlcyBzY2hvbiBmdWVyCisgICAgICAgIC8vIGVpbmUgYW5kZXJlIFZlcmJpbmR1bmcgYXVzIGRpZXNlbSBSYXVtIGJlbnV0enQgd2lyZCwgc2luZCBiZWlkZQorICAgICAgICAvLyBuaWNodCBudXR6YmFyLCBkYSBkYXMgWmllbCBuaWNodCBlaW5kZXV0aWcgaXN0LiBJbiBkaWVzZW0gRmFsbAorICAgICAgICAvLyBtdWVzc2VuIGFsbGUgZGllc2UgYWxzIHVuYmVudXR6YmFyIGZ1ZXIgZGFzIFJvdXRpbmcgbWFya2llcnQKKyAgICAgICAgLy8gd2VyZGVuLgorICAgICAgICBpZiAobWVtYmVyKGNtZHMsIGNvbm5bQ09OTl9DTURdKSkgeworICAgICAgICAgICAgY2hlY2tfYW5kX21hcmtfZHVwbGljYXRlX2Nvbm5zX2J5X2Nvbm4oY29ubnMsY29ubik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwYXRobWFwW3ByZV1bcGF0aFswXV0gPSBjb25uczsKKworICAgIC8vIE9iIDAgb2RlciAxIGlzdCBlaWdlbnRsaWNoIHRvdGFsIGVnYWwsIGRhIGRhcyBFcmdlYm5pcy1BcnJheSBzb3dpZXNvCisgICAgLy8gdmVyd29yZmVuIHdpcmQuCisgICAgcmV0dXJuIDA7Cit9CisKK3ByaXZhdGUgdm9pZCBhZGRfdG9fY2FjaGUoc3RyaW5nIGZyb20sIHN0cmluZyB0bywgaW50IHBhcmEsIGludCBjb3N0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nICpyb29tcywgc3RyaW5nICpjbWRzKSB7CisgICAgc3RydWN0IHBhdGhfcyBwID0gKDxwYXRoX3M+IGNvc3RzIDogY29zdHMsIHJvb21zOiByb29tcywgY21kcyA6IGNtZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYTogcGFyYSwgZmxhZ3M6IDAsIHR0bDogdGltZSgpKzg2NDAwKTsKKyAgICBpZiAoIW1lbWJlcihwYXRoY2FjaGUsIGZyb20pKSB7CisgICAgICAgIHBhdGhjYWNoZVtmcm9tXSA9IG1fYWxsb2NhdGUoMSk7CisgICAgICAgIHBhdGhjYWNoZVtmcm9tXVt0b10gPSBtX2FsbG9jYXRlKDEpOworICAgIH0KKyAgICBlbHNlIGlmICghbWVtYmVyKHBhdGhjYWNoZVtmcm9tXSwgdG8pKSB7CisgICAgICAgIHBhdGhjYWNoZVtmcm9tXVt0b10gPSBtX2FsbG9jYXRlKDEpOworICAgIH0KKyAgICBwYXRoY2FjaGVbZnJvbV1bdG9dW3BhcmFdID0gcDsKK30KKworLy8gRGllc2UgRnVua3Rpb24gYmVyZWNobmV0IGRpZSBLb3N0ZW4gZWluZXIgVmVyYmluZHVuZy4KKy8vIEVpbiBTZWhlcnN0YXR1cyBzY2hsaWVzc3QgZGllIE1vZWdsaWNoa2VpdGVuIHZvbiBTcGllbGVybiBlaW4gKHNlaGVyCisvLyBrYW5uIFNwaWVsZXJwZmFkZSBwcm9ibGVtbG9zIG51dHplbikuCisvLyBXZW5uIGVpbmUgVmVyYmluZHVuZyBpbiBlaW5lIGFuZGVyZSBQYXJhd2VsdCBmdWVocnQsIGFscyBpbiA8cGFyYT4KKy8vIGFuZ2VmcmFndCwgd2lyZCBzaWUgZXJoZWJsaWNoIHRldXJlci4KK3Byb3RlY3RlZCBpbnQgX2NhbGNfY29zdChtaXhlZCogcGF0aCwgaW50IHNlZXIsIGludCBwYXJhKQoreworICAgIG1peGVkKiBpbnRlcmVzdD1wYXRoW0NPTk5fVVNFUlNdOworCisgICAgLy8gQmFzaXNrb3N0ZW4gbmFjaCBBdXNnYW5nc2FydAorICAgIGludCBjb3N0cyA9IENPU1RfRVhJVFNbcGF0aFtDT05OX0VYSVRUWVBFXV07CisKKyAgICAvLyBWZXJiaW5kdW5nZW4gaW4gYW5kZXJlIGFscyBkaWUgZ2V3dWVuc2NodGUgUGFyYXdlbHQgd2VyZGVuIGJlaSBkZXIKKyAgICAvLyBzdWNoZSBuaWNodCBiZXJ1ZWNrc2ljaHRpZ3QsIGFiZXIgVmVyYmluZHVuZyB2b24gUGFyYSBuYWNoIE5vcm1hbCB1bmQKKyAgICAvLyB1bWdla2VocnQgc2luZCBlcmxhdWJ0LiBQYXJhLT5Ob3JtYWwgc29sbCBhYmVyIGV0d2FzIHRldXJlciBzZWluLCBkYW1pdAorICAgIC8vIGVzIGJldm9yenVndCB3aXJkLCBpbiBkZXIgYW5nZWZyYWd0ZW4gV2VsdCB6dSBibGVpYmVuLgorICAgIC8vIChIaW50ZXJncnVuZDogd2VubiBtYW4gaW4gUGFyYSBpc3QsIGxhZXVmdCBtYW4gbWVpc3RlbnMgdHJvdHpkZW0gZHVyY2gKKyAgICAvLyBOb3JtYWx3ZWx0cmFldW1lLCB3ZWlsIGVzIGtlaW5lIHBhc3NlbmRlbiBQYXJhcmFldW1lIGdpYnQpLgorICAgIGlmIChwYXJhICE9IHBhdGhbQ09OTl9QQVJBXSkKKyAgICAgICAgY29zdHMgKz0gQ09TVF9XT1JMRENIQU5HRTsKKworICAgIC8vIHdlbm4gc2Nob24gZ2VudWcgdW50ZXJzY2hpZWRsaWNoZSBMZXV0ZSBkaWUgVmVyYmluZHVuZyBnZWxhdWZlbiBzaW5kLAorICAgIC8vIGtvc3RldCBlcyBkaWUgQmFzaXNrb3N0ZW4uIEZ1ZXIgU2VoZXIgYXVjaCBkaWUgU3BpZWxlciBlaW5zY2hsaWVzc2VuLgorICAgIGlmIChpbnRlcmVzdFtDT05OX1VfUExBWUVSU109PS0xCisgICAgICAgIHx8IChzZWVyICYmIGludGVyZXN0W0NPTk5fVV9TRUVSU109PS0xKSkKKyAgICAgICAgcmV0dXJuIGNvc3RzOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vIFNvbnN0IHdpcmQgZGllIFZlcmJpbmR1bmcgdGV1cmVyLgorICAgICAgICAvLyBBbnphaGwgU3BpZWxlcm51dHplciBrYW5uIG5pY2h0IC0xIHNlaW4gKHMuby4pLgorICAgICAgICBpbnQgdXNlcmNvdW50ID0gc2l6ZW9mKGludGVyZXN0W0NPTk5fVV9QTEFZRVJTXSk7CisgICAgICAgIC8vIHdlbm4gPHNlZXI+LCB3aXJkIGdnZi4gZGllIEFuemFobCBhbiBTZWhlcm51dHplcm4gZHJhdWYgYWRkaWVydC4KKyAgICAgICAgLy8gV2VydCBmdWVyIFNlaGVyIGthbm4gbmljaHQgLTEgc2VpbiAocy5vLikKKyAgICAgICAgaWYgKHNlZXIpCisgICAgICAgICAgICB1c2VyY291bnQgKz0gc2l6ZW9mKGludGVyZXN0W0NPTk5fVV9TRUVSU10pOworICAgICAgICBzd2l0Y2ggKHVzZXJjb3VudCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGNvc3RzPTEwMDAwMDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEuLjI6CisgICAgICAgICAgICAgICAgY29zdHMqPUNPU1RfT05FOworICAgICAgICAgICAgY2FzZSAzLi40OgorICAgICAgICAgICAgICAgIGNvc3RzKj1DT1NUX0ZFVzsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgY29zdHMqPUNPU1RfTUFOWTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29zdHM7CisgICAgfQorICAgIERCRyhzcHJpbnRmKCJIdWNoLCBrZWluZSBBaG51bmcsIEtvc3RlbiB1bmJlc3RpbW1iYXI6ICVPIixwYXRoKSk7CisgICAgcmV0dXJuIDEwMDA7Cit9CisKKy8vIE5ldWltcGxlbWVudGF0aW9uIHZvbiBIdW1uaSwgYmVudXR6dCBlaW5mYWNoIHNpbXBlbCBlaW5lbgorLy8gRGlqa3N0cmEtQWxnb3JpdGhtdXMuICJTaW1wZWwiIHNjaHJlaWJlIGljaCwgYmV2b3IgaWNoIGRpZQorLy8gRnVua3Rpb24gc2NocmVpYmUsIGZsdWNoZW4gd2VyZGUgaWNoIGdsZWljaC4KK3N0YXRpYyB2b2lkIF9zZWFyY2goc3RyaW5nIGZuYW1lLCBzdHJpbmcgZnJvbSkKK3sKKyAgICAvLyA8ZnJvbT4gaXN0IGpldHp0IGFuenVndWNrZW5kZS96dSBiZWFyYmVpdGVuZGUgUmF1bS4KKworICAgIC8vIERpZSBha3R1ZWxsZSBMaXN0ZSBhbiBhYmdlc3VjaHRlbiBSYWV1bWVuLCBSYWV1bWUsIGluIGRlbmVuCisgICAgLy8gYWxsZSBXZWdlIGJlcmVpdHMgZWluZ2V0cmFnZW4gc2luZC4KKyAgICBzdHJpbmcqIHJvb21zX3NlYXJjaGVkPXNlYXJjaGxpc3RbZm5hbWUsU0xfVklTSVRFRF07CisKKyAgICAvLyBaaWVsb3J0CisgICAgc3RyaW5nIHRvID0gc2VhcmNobGlzdFtmbmFtZSxTTF9ERVNUSU5BVElPTl07CisKKyAgICAvLyBtb2VnbGljaGUgWmllbGUKKyAgICBtYXBwaW5nIHRhcmdldHM9c2VhcmNobGlzdFtmbmFtZSxTTF9DQU5ESURBVEVTXTsKKworICAgIC8vIHdpemxldmVsCisgICAgaW50IHNlZXIgPSBzZWFyY2hsaXN0W2ZuYW1lLFNMX1dJWkxFVkVMXTsKKworICAgIC8vIHBhcmEKKyAgICBpbnQgcGFyYT1zZWFyY2hsaXN0W2ZuYW1lLFNMX1BBUkFdOworCisgICAgLy8gTm9jaCB6dSBiZWFyYmVpdGVuZGUgUmFldW1lCisgICAgc3RyaW5nKiB0b19kbz1zZWFyY2hsaXN0W2ZuYW1lLFNMX1RPRE9dOworCisgICAgREJHKCJfc2VhcmNoKCkgc3RhcnQuIik7CisKKyAgICB3aGlsZSAoKGdldF9ldmFsX2Nvc3QoKT45MDAwMDApICYmIGZyb20gJiYgKGZyb20gIT0gdG8pKQorICAgIHsKKyAgICAgICAgLy8gRnVlZ2UgZGVuIGFrdHVlbGxlbiBSYXVtIChmcm9tKSBhbHMgV2VnIGhpbnp1CisgICAgICAgIERCRyhzcHJpbnRmKCJGdWVnZSBoaW56dTogJXMiLGZyb20pKTsKKyAgICAgICAgcm9vbXNfc2VhcmNoZWQrPSh7ZnJvbX0pOworICAgICAgICAvLyBBdXMgZGVuIFJhZXVtZW4gZHJ1bXJ1bSB3ZXJkZW4gZGllIEF1c2dhZW5nZSBnZXN1Y2h0CisgICAgICAgIC8vIHVuZCB6dXIgV2VnbGlzdGUgaGluenVnZWZ1ZWd0LgorCisgICAgICAgIC8vIFBmYWRlIHZvbiA8ZnJvbT4gd2VnIGF1cyBkZXIgTGlzdGUgaG9sZW4KKyAgICAgICAgbWl4ZWQqIHBhdGhzPXBhdGhtYXBbX2dldF9wcmVmaXgoZnJvbSldW2Zyb21dOworCisgICAgICAgIC8vIExpc3RlIGRlciBWZXJiaW5kdW5nZW4gdm9uIDxmcm9tPiBkdXJjaGdlaGVuCisgICAgICAgIGZvcmVhY2ggKG1peGVkIGNvbm46cGF0aHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBuZXdjb3N0OworICAgICAgICAgICAgLy8gd2VubiBkZXIgUmF1bSBzY2hvbm1hbCBnZXNlaGVuIHd1cmRlLCBpc3QgaGllciBuaXggbWVociBub2V0aWcuCisgICAgICAgICAgICBpZiAobWVtYmVyKHJvb21zX3NlYXJjaGVkLGNvbm5bQ09OTl9ERVNUXSk+LTEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHKHNwcmludGYoIlJhdW0gJXMgaGFiIGljaCBzY2hvbiEiLGNvbm5bQ09OTl9ERVNUXSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFZlcmJpbmR1bmcgamUgbmFjaCBGbGFnIG5pY2h0IG51dHplbi4gQXVzc2VyZGVtOgorICAgICAgICAgICAgICAgIC8vIHdlbm4gZGllIFZlcmJpbmR1bmcgaW4gZWluZSBQYXJhd2VsdCBmdWVocnQsIGFiZXIga2VpbgorICAgICAgICAgICAgICAgIC8vIFNlaGVyc3RhdHVzIGdlZ2ViZW4gaXN0LCBleGlzdGllcnQgZGllIFZlcmJpbmR1bmcgbmljaHQuCisgICAgICAgICAgICAgICAgLy8gV2VpdGVyaGluIGtvbW10IGVpbmUgVmVyYmluZHVuZyBuaWNodCBpbiBGcmFnZSwgd2VubiBzaWUgaW4KKyAgICAgICAgICAgICAgICAvLyBlaW5lIGFuZGVyZSBQYXJhd2VsdCBmdWVocnQsIHdlaWwgZGVyIFdlbHR1ZWJlcmdhbmcgbnVyIGFuCisgICAgICAgICAgICAgICAgLy8gYmVzdGltbXRlbiBPcnRlbiBtb2VnbGljaCBpc3QuIEF1c25haG1lIGRhdm9uIHNpbmQgV2VjaHNlbAorICAgICAgICAgICAgICAgIC8vIHp3aXNjaGVuIE5vcm1hbHdlbHQgdW5kIFBhcmF3ZWx0LgorICAgICAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICAgICAgKGNvbm5bQ09OTl9GTEFHU10gJiBDRkxBR19ET05UVVNFKQorICAgICAgICAgICAgICAgICAgICB8fCAoY29ubltDT05OX0ZMQUdTXSAmIENGTEFHX0RVUExJQ0FURSkKKyAgICAgICAgICAgICAgICAgICAgfHwgKCFzZWVyICYmIGNvbm5bQ09OTl9QQVJBXSkKKyAgICAgICAgICAgICAgICAgICAgfHwgKGNvbm5bQ09OTl9QQVJBXSAmJiBjb25uW0NPTk5fUEFSQV0gIT0gcGFyYSkKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBuZXdjb3N0ID0gdGFyZ2V0c1tmcm9tLFNMVF9DT1NUU107IC8vIGtvc3RlbiBiaXMgaGllcmhlcgorICAgICAgICAgICAgICAgIC8vICsgS29zdGVuIGluIG5hZWNoc3RlbiBSYXVtLgorICAgICAgICAgICAgICAgIG5ld2Nvc3QgKz0gX2NhbGNfY29zdChjb25uLHNlZXIscGFyYSk7CisgICAgICAgICAgICAgICAgLy8gZXMga29lbm50ZSBzZWluLCBkYXNzIGVzIFZlcmJpbmR1bmdlbiBtaXQgZ2xlaWNoZW0KKyAgICAgICAgICAgICAgICAvLyBTdGFydC9aaWVsIGdpYnQsIGFiZXIgdW50ZXJzY2hpZWRsaWNoZW4gS29zdGVuLiBJbiBkaWVzZW0KKyAgICAgICAgICAgICAgICAvLyBGYWxsIHd1ZXJkZSBkYXMgWmllbCBkZXIgYWt0dWVsbGVuIFZlcmJpbmR1bmcgbWVocmZhY2gKKyAgICAgICAgICAgICAgICAvLyBoaW56dWdlZnVlZ3QgdW5kIGRhcyBsZXR6dGUgZ2V3aW5udC4gRGFoZXIgc29sbHRlIGRpZXNlCisgICAgICAgICAgICAgICAgLy8gVmVyYmluZHVuZyBudXIgaGluenVnZWZ1ZWd0IHdlcmRlbiwgd2VubiBub2NoIGtlaW5lCisgICAgICAgICAgICAgICAgLy8gVmVyYmluZHVuZyBpbiBkZW4gWmllbHJhdW0gZXhpc3RpZXJ0LCBkaWUgYmlsbGlnZXIgaXN0LgorICAgICAgICAgICAgICAgIGlmIChtZW1iZXIodGFyZ2V0cyxjb25uW0NPTk5fREVTVF0pCisgICAgICAgICAgICAgICAgICAgICYmIG5ld2Nvc3QgPj0gdGFyZ2V0c1tjb25uW0NPTk5fREVTVF0sU0xUX0NPU1RTXSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgLy8gV2VnIGJpcyBoaWVyaGVyIHBsdXMgbmFlY2hzdGVuIFJhdW0KKyAgICAgICAgICAgICAgICBzdHJpbmcqIG5ld193YXkgPSB0YXJnZXRzW2Zyb20sU0xUX1dBWV07CisgICAgICAgICAgICAgICAgbmV3X3dheSArPSAoe2Nvbm5bQ09OTl9ERVNUXX0pOworICAgICAgICAgICAgICAgIC8vIEtvbW1hbmRvcyBiaXMgaGllcmhlciBwbHVzIG5hZWNoc3RlcyBLb21tYW5kbworICAgICAgICAgICAgICAgIHN0cmluZyogbmV3X2NvbW1hbmRzID0gdGFyZ2V0c1tmcm9tLFNMVF9DT01NQU5EU107CisgICAgICAgICAgICAgICAgbmV3X2NvbW1hbmRzICs9ICh7Y29ubltDT05OX0NNRF19KTsKKyAgICAgICAgICAgICAgICAvLyBuYWVjaHN0ZW4gUmF1bSBpbiBUb2RvIGZ1ZXIgZGllIFBydWVmdW5nIHVudGVuIHZlcm1lcmtlbgorICAgICAgICAgICAgICAgIHRvX2RvICs9ICh7Y29ubltDT05OX0RFU1RdfSk7CisgICAgICAgICAgICAgICAgLy8gVW5kIEtvc3Rlbi9XZWcvS29tbWFuZG9zIGJpcyB6dW0gbmFlY2hzdGVuIFJhdW0gdW50ZXIKKyAgICAgICAgICAgICAgICAvLyB0YXJnZXRzL0thbmRpZGF0ZW4gYWJsZWdlbi4KKyAgICAgICAgICAgICAgICB0YXJnZXRzICs9IChbY29ubltDT05OX0RFU1RdOm5ld2Nvc3Q7bmV3X3dheTtuZXdfY29tbWFuZHNdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBOYWNoZGVtIGRpZSBSYWV1bWUgYWxsZSB6dSBkZW4gS2FuZGlkYXRlbiBhbiBtb2VnbGljaGVuIFdlZ2VuCisgICAgICAgIC8vIGhpbnp1Z2VmdWVndCB3dXJkZW4sIHdpcmQgbnVuIGRlciBuZXVlc3RlIGt1ZXJ6ZXN0ZSBXZWcgZ2VzdWNodC4KKyAgICAgICAgLy8gTmF0dWVybGljaCBudXIgYXVzIGRlbmVuLCBkaWUgc2Nob24gZGEgc2luZC4KKyAgICAgICAgaWYgKHNpemVvZih0b19kbyk+MCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gS29zdGVuIGRlcyBlcnN0ZW4gdG9kbyBhbHMgU3RhcnR3ZXJ0IG5laG1lbgorICAgICAgICAgICAgc3RyaW5nIG1pbnJhdW07CisgICAgICAgICAgICBpbnQgbWluY29zdHM9X19JTlRfTUFYX187CisgICAgICAgICAgICAvLyB1bmQgdWViZXIgYWxsZSB0b2RvcyBsYXVmZW4gdW0gZGFzIE1pbmltdW0genUgZmluZGVuLgorICAgICAgICAgICAgZm9yZWFjaChzdHJpbmcgcmF1bTogdG9fZG8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG1pbmNvc3RzPnRhcmdldHNbcmF1bSxTTFRfQ09TVFNdKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWlucmF1bSA9IHJhdW07CisgICAgICAgICAgICAgICAgICAgIG1pbmNvc3RzPXRhcmdldHNbcmF1bSxTTFRfQ09TVFNdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCRyhzcHJpbnRmKCJOZXVlciBrdWVyemVzdGVyIFJhdW06ICVzIixtaW5yYXVtKSk7CisKKyAgICAgICAgICAgIC8vIGRlciBiaWxsaWdzdCB6dSBlcnJlaWNoZW5kZSBSYXVtIHdpcmQgZGFzIG5ldWUgPGZyb20+IGZ1ZXIgZGVuCisgICAgICAgICAgICAvLyBuYWVjaHN0ZW4gRHVyY2hsYXVmCisgICAgICAgICAgICBmcm9tPW1pbnJhdW07CisgICAgICAgICAgICAvLyB1bmQgbmF0dWVybGljaCBhdXMgZGVtIHRvX2RvIHdlcmZlbi4KKyAgICAgICAgICAgIHRvX2RvLT0oe21pbnJhdW19KTsKKyAgICAgICAgICAgIERCRyhzcHJpbnRmKCJBbnphaGwgdW50ZXJzdWNodGVyIFJhZXVtZTogJWQsIFRvZG86ICVkLCAiCisgICAgICAgICAgICAgICAgICAiS2FuZGlkYXRlbjogJWQiLAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKHJvb21zX3NlYXJjaGVkKSxzaXplb2YodG9fZG8pLHNpemVvZih0YXJnZXRzKSkpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZnJvbT0wOworICAgICAgICB9CisgICAgfSAvLyB3aGlsZSBlbmRlCisKKyAgICBpZiAoIWZyb20pCisgICAgeworICAgICAgICAvLyBIbXBmLi4uCisgICAgICAgIFRFTExfVVNFUigiS2VpbiBXZWcgZ2VmdW5kZW4hIik7CisgICAgICAgIGlmIChzZWFyY2hsaXN0W2ZuYW1lLCBTTF9DQUxMQkFDS10pCisgICAgICAgICAgICBmdW5jYWxsKHNlYXJjaGxpc3RbZm5hbWUsU0xfQ0FMTEJBQ0tdLAorICAgICAgICAgICAgICAgICAgICBzZWFyY2hsaXN0W2ZuYW1lLFNMX1NUQVJUXSwgdG8sIHBhcmEsCisgICAgICAgICAgICAgICAgICAgIDAsMCwwKTsKKyAgICAgICAgbV9kZWxldGUoIHNlYXJjaGxpc3QsIGZuYW1lICk7ICAvLyBzdWNoYXVmdHJhZyBlbnRzb3JnZW4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlbHNlIGlmIChmcm9tPT10bykKKyAgICB7CisgICAgICAgIC8vIEpVQ0hVIQorICAgICAgICBURUxMX1VTRVIoc3ByaW50ZigiV2VnIGdlZnVuZGVuISAlTywlTywlTyIsCisgICAgICAgICAgICAgIHRhcmdldHNbdG8sU0xUX0NPU1RTXSx0YXJnZXRzW3RvLFNMVF9XQVldLAorICAgICAgICAgICAgICB0YXJnZXRzW3RvLFNMVF9DT01NQU5EU10pKTsKKyAgICAgICAgYWRkX3RvX2NhY2hlKHNlYXJjaGxpc3RbZm5hbWUsU0xfU1RBUlRdLCB0bywgcGFyYSwKKyAgICAgICAgICAgICAgICAgICAgIHRhcmdldHNbdG8sU0xUX0NPU1RTXSx0YXJnZXRzW3RvLFNMVF9XQVldLAorICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0c1t0byxTTFRfQ09NTUFORFNdKTsKKyAgICAgICAgaWYgKHNlYXJjaGxpc3RbZm5hbWUsIFNMX0NBTExCQUNLXSkKKyAgICAgICAgICAgIGZ1bmNhbGwoc2VhcmNobGlzdFtmbmFtZSxTTF9DQUxMQkFDS10sCisgICAgICAgICAgICAgICAgICAgIHNlYXJjaGxpc3RbZm5hbWUsU0xfU1RBUlRdLCB0bywgcGFyYSwKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0c1t0byxTTFRfQ09TVFNdLHRhcmdldHNbdG8sU0xUX1dBWV0sCisgICAgICAgICAgICAgICAgICAgIHRhcmdldHNbdG8sU0xUX0NPTU1BTkRTXSk7CisgICAgICAgIG1fZGVsZXRlKCBzZWFyY2hsaXN0LCBmbmFtZSApOyAgLy8gc3VjaGF1ZnRyYWcgZW50c29yZ2VuCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBXZW5uIGRhcyBhbGxlcyBuaWNodCB3YXIsIHdhcmVuIGVzIGRpZSBFdmFsLVRpY2tzLiBNaXN0LiBTcGFldGVyCisgICAgLy8gd2VpdGVyc3VjaGVuLi4uCisgICAgc2VhcmNobGlzdFtmbmFtZSxTTF9WSVNJVEVEXT1yb29tc19zZWFyY2hlZDsKKyAgICBzZWFyY2hsaXN0W2ZuYW1lLFNMX0NBTkRJREFURVNdPXRhcmdldHM7CisgICAgc2VhcmNobGlzdFtmbmFtZSxTTF9UT0RPXT10b19kbzsKKyAgICBjYWxsX291dCgiX3NlYXJjaCIsMixmbmFtZSxmcm9tKTsKK30KKworCisvLyBEaWUgRGF0ZW4gdWViZXIgUmFldW1lIHdlcmRlbiBxdWFzaSBnZWhhc2h0IGFiZ2VzcGVpY2hlcnQsIGRhbWl0IHdpciBuaWNodAorLy8gc28gc2NobmVsbCBhbiBkaWUgQmVncmVuenVuZyBiZWkgQXJyYXlzIHVuZCBNYXBwaW5ncyBzdG9zc2VuLgorLy8gRGFiZWkgaXN0IGRlciAnSGFzaCcgZGVyIEFuZmFuZyBkZXMgUGZhZGVzLgorcHJpdmF0ZSBzdHJpbmcgX2dldF9wcmVmaXgoIHN0cmluZyBwYXRoICkKK3sKKyAgICBzdHJpbmcgKnRtcDsKKworICAgIHRtcCA9IGV4cGxvZGUoIHBhdGgsICIvIiApOworCisgICAgLy8gQmVpIFJhZXVtZW4gdW50ZXJoYWxiIHZvbiAvZC8qIHdpcmQgL2QvcmVnaW9uL21hZ2llcm5hbWUgYmVudXR6dAorICAgIGlmICggc3Ryc3RyKHBhdGgsICIvZC8iKSA9PSAwKQorICAgICAgICByZXR1cm4gaW1wbG9kZSggdG1wWzAuLjNdLCAiLyIgKTsKKyAgICAvLyBBbnNvbnN0ZW4gZGllIGVyc3RlbiBiZWlkZW4gVGVpbHBmYWRlLCBmYWxscyBzb3ZpZWxlIHZvcmhhbmRlbiBzaW5kCisgICAgZWxzZSBpZiAoIHNpemVvZih0bXApIDwgNCApCisgICAgICAgIHJldHVybiBpbXBsb2RlKCB0bXBbMC4uMV0sICIvIiApOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGltcGxvZGUoIHRtcFswLi4yXSwgIi8iICk7Cit9CisKKy8vIFJlc2V0IHVuZCBEYXRlbmhhbHR1bmcKKy8vIHJlc2V0IHdpcmQgYWxsZSAzaCBnZXJ1ZmVuLCB1bSBkYXMgU2F2ZWZpbGUgaW1tZXIgbWFsIHdpZWRlciB6dSBzcGVpY2hlcm4uCisvLyBEYXRlbmF1ZnJhZXVtZW4gYWJlciBudXIgZWlubWFsIHBybyBUYWcuCitwdWJsaWMgdm9pZCByZXNldCgpCit7CisgICAgaWYgKCB0aW1lX3RvX2NsZWFuX3VwIDw9IHRpbWUoKSApCisgICAgeworICAgICAgICAvLyBFaW5tYWwgcHJvIFRhZyBSZXNldCB6dW0gQXVmcmFldW1lbiBkZXIgRGF0ZW5iYW5rCisgICAgICAgIHJtKERVTVBGSUxFIi5yYWV1bWUiKTsKKyAgICAgICAgcm0oRFVNUEZJTEUiLmNvbm5zIik7CisgICAgICAgIHRpbWVfdG9fY2xlYW5fdXAgPSB0aW1lKCkgKyA4NjQwMDsKKyAgICAgICAgZXhwaXJlX3BhdGhfY2FjaGUobV9pbmRpY2VzKHBhdGhjYWNoZSkpOworICAgICAgICBjYWxsX291dCgjJ2NsZWFudXBfZGF0YSwgMzAsCisgICAgICAgICAgICAgICAgICBzb3J0X2FycmF5KG1faW5kaWNlcyhwYXRobWFwKSwgIyc8LyonKi8pLCAwICk7CisKKyAgICB9CisgICAgc2F2ZV9vYmplY3QoU0FWRUZJTEUpOworICAgIHNldF9uZXh0X3Jlc2V0KDEwODAwKTsKK30KKworcHJvdGVjdGVkIHZvaWQgZXhwaXJlX3BhdGhfY2FjaGUoc3RyaW5nICpzdGFydHJvb21zKSB7CisgICAgZm9yZWFjaChzdHJpbmcgc3RhcnQgOiBzdGFydHJvb21zKSB7CisgICAgICAgIG1hcHBpbmcgdGFyZ2V0cyA9IHBhdGhjYWNoZVtzdGFydF07CisgICAgICAgIGZvcmVhY2ggKHN0cmluZyB0YXJnZXQsIG1hcHBpbmcgcGF0aHM6IHRhcmdldHMpIHsKKyAgICAgICAgICAgIGZvcmVhY2goaW50IHBhcmEsIHN0cnVjdCBwYXRoX3MgcDogcGF0aHMpIHsKKyAgICAgICAgICAgICAgICBpZiAocC0+dHRsIDwgdGltZSgpCisgICAgICAgICAgICAgICAgICAgIHx8ICEocC0+ZmxhZ3MgJiBQRkxBR19QRVJNQU5FTlQpICkKKyAgICAgICAgICAgICAgICAgICAgbV9kZWxldGUocGF0aHMscGFyYSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXNpemVvZihwYXRocykpCisgICAgICAgICAgICAgICAgbV9kZWxldGUodGFyZ2V0cywgdGFyZ2V0KTsKKyAgICAgICAgfQorICAgICAgICBzdGFydHJvb21zLT0oe3N0YXJ0fSk7CisgICAgICAgIGlmICghc2l6ZW9mKHRhcmdldHMpKQorICAgICAgICAgICAgbV9kZWxldGUocGF0aGNhY2hlLCBzdGFydCk7CisgICAgICAgIC8vIHJlY2h0IGdyb3NzZXIgV2VydCwgd2VpbCBpbW1lciBrb21wbGV0dGUgU3RhcnRyYWV1bWUgaW4gZWluZW0KKyAgICAgICAgLy8gZXJsZWRpZ3Qgd2VyZGVuLgorICAgICAgICBpZiAoZ2V0X2V2YWxfY29zdCgpIDwgMTAwMDAwMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoc2l6ZW9mKHN0YXJ0cm9vbXMpKQorICAgICAgICBjYWxsX291dCgjJ2V4cGlyZV9wYXRoX2NhY2hlLCA0LCBzdGFydHJvb21zKTsKK30KKworLy8gRGF0ZW5iYW5rIGF1ZnJhZXVtZW4KK3Byb3RlY3RlZCB2b2lkIGNsZWFudXBfZGF0YSggc3RyaW5nICpuYW1lcywgaW50IGlkeCApCit7CisgICAgaW50IHNpemUsIGksIGosIGs7CisgICAgc3RyaW5nICpyb29tczsKKyAgICBtaXhlZCAqcGF0aHM7CisKKyAgICBzaXplID0gc2l6ZW9mKG5hbWVzKTsKKworICAgIC8vIEVpbiBiaXNzZXJsIG1pdGxvZ2dlbiwgZGFtaXQgd2lyIFNjaHdhY2hzdGVsbGVuIGltIFN5c3RlbSBhdWNoIGZpbmRlbi4KKyAgICBpZiAoICFpZHggKXsKKyAgICAgICAgTE9HKCBzcHJpbnRmKCI9PT0gJXM6IFN0YXJ0ZSBjbGVhbnVwX2RhdGEoKTogJU8gR2ViaWV0ZSwgJU8gUmFldW1lICIKKyAgICAgICAgICAgICAgICAgICAgICsgIi4uLlxuIiwgc3RyZnRpbWUoIiV5JW0lZC0lSCVNJVMiKSwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIHNob3dfc3RhdGlzdGljKDEsIDEpICkgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIExPRyggc3ByaW50ZigiJXM6IFNldHplIGNsZWFudXBfZGF0YSgpIGZvcnQuXG4iLAorICAgICAgICAgICAgICBzdHJmdGltZSgiJXklbSVkLSVIJU0lUyIpICkgKTsKKyAgICB9CisKKyAgICAvLyBCcmF2IGdlc3BsaXR0ZXQsIGRhbWl0IGVzIGtlaW4gTGFnIGdpYnQuCisgICAgLy8gRGllIEdyZW56ZSBpc3QgcmVjaHQgaG9jaCBhbmdlc2V0enQsIGRhIGltbWVyIGdsZWljaCBrb21wbGV0dGUKKyAgICAvLyBUZWlsYmFldW1lIGF1ZmdlcmFldW10IHdlcmRlbi4KKyAgICB3aGlsZSAoIGdldF9ldmFsX2Nvc3QoKSA+IDExMDAwMDAgJiYgaWR4IDwgc2l6ZSApeworICAgICAgICByb29tcyA9IHNvcnRfYXJyYXkoIG1faW5kaWNlcyhwYXRobWFwW25hbWVzW2lkeF1dKSwgIyc8LyonKi8gKTsKKworICAgICAgICBmb3IgKCBpID0gc2l6ZW9mKHJvb21zKTsgaS0tOyApeworICAgICAgICAgICAgcGF0aHMgPSBwYXRobWFwW25hbWVzW2lkeF1dW3Jvb21zW2ldXTsKKyAgICAgICAgICAgIGludCBjb25uX2NvdW50ID0gc2l6ZW9mKHBhdGhzKTsKKyAgICAgICAgICAgIG1hcHBpbmcgY21kcz1tX2FsbG9jYXRlKHNpemVvZihwYXRocykpOworCisgICAgICAgICAgICBmb3IgKCBqID0gY29ubl9jb3VudDsgai0tOyApIHsKKyAgICAgICAgICAgICAgICBtaXhlZCBjb25uID0gcGF0aHNbal07CisgICAgICAgICAgICAgICAgZm9yICggayA9IDA7IGsgPCAyOyBrKysgKSB7IC8vIFNwaWVsZXIvU2VoZXJlaW50cmFlZ2UKKyAgICAgICAgICAgICAgICAgICAgLy8gRGllc2UgVmVyYmluZHVuZyBoYXQgbm9jaCBrZWluZXIgZ2VudXR6dCBiaXNoZXIKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAhY29ubltDT05OX1RJTUVTXVtrXSApCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2VubiBWZXJiaW5kdW5nIHBlcm1hbmVudCwgdWViZXJzcHJpbmdlbgorICAgICAgICAgICAgICAgICAgICBpZiAoY29ubltDT05OX0ZMQUdTXSAmIENGTEFHX1BFUk1BTkVOVCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgIGlmICggY29ubltDT05OX1VTRVJTXVtrXSA9PSAtMSAvLyAnYmVrYW5udGVzJyBHZWJpZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0aW1lKCkgLSBjb25uW0NPTk5fVElNRVNdW2tdID4gVElNRU9VVF9PTEQgKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIExPRyggc3ByaW50ZigiKioqIExvZXNjaGUgYWx0ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICArIChrID8gIlNlaGVyIiA6ICJTcGllbGVyIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICsgIi1WZXJiaW5kdW5nICVPLlxuIiwgcGF0aHNbal0pICk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25uW0NPTk5fVVNFUlNdW2tdID0gKHt9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5bQ09OTl9USU1FU11ba10gPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBjb25uW0NPTk5fVVNFUlNdW2tdICE9IC0xIC8vICduZXVlcycgR2ViaWV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0aW1lKCkgLSBjb25uW0NPTk5fVElNRVNdW2tdID4gVElNRU9VVF9ORVcgKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5bQ09OTl9VU0VSU11ba10gPSAoe30pOworICAgICAgICAgICAgICAgICAgICAgICAgY29ubltDT05OX1RJTUVTXVtrXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBXZW5uIGVpbmUgVmVyYmluZHVuZyB3ZWRlciB2b24gU3BpZWxlcm4gbm9jaCB2b24gU2VoZXJuCisgICAgICAgICAgICAgICAgLy8gYmVudXR6dCB3dXJkZSBpbiBsZXR6dGVyIFplaXQgdW5kIHNpZSBrZWluZSBwZXJtYW5lbnRlZAorICAgICAgICAgICAgICAgIC8vIGlzdCwgVmVyYmluZHVuZyBnYW56IGxvZXNjaGVuLgorICAgICAgICAgICAgICAgIGlmICghKGNvbm5bQ09OTl9GTEFHU10gJiBDRkxBR19QRVJNQU5FTlQpCisgICAgICAgICAgICAgICAgICAgICYmICFjb25uW0NPTk5fVElNRVNdW0NPTk5fVF9QTEFZRVJTXQorICAgICAgICAgICAgICAgICAgICAmJiAhY29ubltDT05OX1RJTUVTXVtDT05OX1RfU0VFUlNdICkgeworICAgICAgICAgICAgICAgICAgICBwYXRoc1tqLi5qXSA9ICh7fSk7IC8vIGNvbm4gcmF1c3dlcmZlbgorICAgICAgICAgICAgICAgICAgICBjb25uX2NvdW50LS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBDb25uZWN0aW9ucyBuYWNoIEtvbW1hbmRvcyBzcGVpY2hlcm4uCisgICAgICAgICAgICAgICAgICAgIGlmIChtZW1iZXIoY21kcywgY29ubltDT05OX0NNRF0pKQorICAgICAgICAgICAgICAgICAgICAgICAgY21kc1tjb25uW0NPTk5fQ01EXV0gKz0gKHtjb25ufSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtZHNbY29ubltDT05OX0NNRF1dID0gKHtjb25ufSk7CisgICAgICAgICAgICAgICAgICAgIC8vIHVuZCBkYXMgZHVwbGljYXRlIGZsYWcgbG9lc2NoZW4sIGRhcyB3aXJkIHNwYWV0ZXIgbmV1CisgICAgICAgICAgICAgICAgICAgIC8vIGdlc2V0enQsIHdlbm4gbm9ldGlnLgorICAgICAgICAgICAgICAgICAgICAvLyAoVGhlcmUgaXMgbm8gY2hhbmNlIHRoYXQgYSBjb25jdXJyZW50IHNlYXJjaCB3aWxsIGNoZWNrCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZXNlIGNvbm5lY3Rpb25zIHVudGlsIHRoZXkgYXJlIG1hcmtlZCBhZ2Fpbi4pCisgICAgICAgICAgICAgICAgICAgIGNvbm5bQ09OTl9GTEFHU10gJj0gfkNGTEFHX0RVUExJQ0FURTsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ29ubmVjdGlvbnMgZHVtcGVuCisgICAgICAgICAgICAgICAgICAgIGlmICghKGNvbm5bQ09OTl9GTEFHU10gJiBDRkxBR19EVVBMSUNBVEUpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgbWl4ZWQgdT0oe2Nvbm5bQ09OTl9VU0VSU11bQ09OTl9VX1BMQVlFUlNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubltDT05OX1VTRVJTXVtDT05OX1VfU0VFUlNdIH0pOworICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2ZpbGUoRFVNUEZJTEUiLmNvbm5zIixzcHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzfCVzfCVzfCVkfCVkfCVkfCVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vbXNbaV0sY29ubltDT05OX0RFU1RdLGNvbm5bQ09OTl9DTURdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubltDT05OX0VYSVRUWVBFXSxjb25uW0NPTk5fUEFSQV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodVswXT09LTEgPyAwIDogTkVFREVELXNpemVvZih1WzBdKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodVswXT09LTEgPyAwIDogTkVFREVELXNpemVvZih1WzBdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBFaW4gUmF1bSBvaG5lIFZlcmJpbmR1bmdlbiBmcmlzc3QgbnVyIFBsYXR6IGluIGRlciBEYXRlbmJhbmsKKyAgICAgICAgICAgIGlmICggIWNvbm5fY291bnQgKXsKKyAgICAgICAgICAgICAgICAvLyBMT0coIHNwcmludGYoIioqKiBMb2VzY2hlIGtvbXBsZXR0ZW4gUmF1bSAlT1xuIiwgcm9vbXNbaV0pICk7CisgICAgICAgICAgICAgICAgbV9kZWxldGUoIHBhdGhtYXBbbmFtZXNbaWR4XV0sIHJvb21zW2ldICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyB3ZW5uIEtvbW1hbmRvcyBuaWNodCBlaW5kZXV0aWcgc2luZCwgZGFubiB3ZXJkZW4gZGllCisgICAgICAgICAgICAgICAgLy8gZW50c3ByZWNoZW5kZW4gVmVyYmluZHVuZ2VuIGdla2VubnplaWNobmV0LiBBbGxlIGluIEZyYWdlCisgICAgICAgICAgICAgICAgLy8ga29tbWVuZGVuIFZlcmJpbmR1bmdlbiBzaW5kIGpld2VpbHMgc2Nob24genVzYW1tZW5zb3J0aWVydC4KKyAgICAgICAgICAgICAgICBmb3JlYWNoKHN0cmluZyBjbWQsIG1peGVkIGNvbm5zIDogY21kcykgeworICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZW9mKGNvbm5zKT4xKQorICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfYW5kX21hcmtfZHVwbGljYXRlX2Nvbm5zKGNvbm5zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gZ2dmLiBnZWFlbmRlcnRlcyBWZXJiaW5kdW5nc2FycmF5IHdpZWRlciBpbnMgTWFwcGluZworICAgICAgICAgICAgICAgIC8vIHNjaHJlaWJlbi4KKyAgICAgICAgICAgICAgICBwYXRobWFwW25hbWVzW2lkeF1dW3Jvb21zW2ldXSA9IHBhdGhzOworICAgICAgICAgICAgICAgIC8vIFJhdW0vTm9kZSBpbnMgRHVtcCBzY2hyZWliZW4KKyAgICAgICAgICAgICAgICB3cml0ZV9maWxlKERVTVBGSUxFIi5yYWV1bWUiLHNwcmludGYoCisgICAgICAgICAgICAgICAgICAgICAgIiVzXG4iLHJvb21zW2ldKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWR4Kys7CisgICAgfQorICAgIGlmICggaWR4ID49IHNpemUgKSB7CisgICAgICAgIExPRyggc3ByaW50ZigiPT09ICVzOiBCZWVuZGUgY2xlYW51cF9kYXRhKCkhIFVlYnJpZzogJU8gUmFldW1lLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgIHN0cmZ0aW1lKCIleSVtJWQtJUglTSVTIiksIHNob3dfc3RhdGlzdGljKDEsIDEpICkgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGNhbGxfb3V0KCAjJ2NsZWFudXBfZGF0YSwgMiwgbmFtZXMsIGlkeCApOworICAgICAgICBMT0coIHNwcmludGYoIiVzOiBXQVJURSAyMHMgYmVpIEV2YWxjb3N0ICVPXG4iLAorICAgICAgICAgICAgICAgICAgICAgc3RyZnRpbWUoIiV5JW0lZC0lSCVNJVMiKSwgZ2V0X2V2YWxfY29zdCgpKSApOworICAgIH0KK30KKworLy8gQmVpbSBFbnRsYWRlbiBzcGVpY2hlcm4KK3B1YmxpYyB2YXJhcmdzIGludCByZW1vdmUoIGludCBzaWxlbnQgKQoreworICAgIC8vIFZvciBkZW0gRW50ZmVybmVuIG5vY2ggc2NobmVsbCBkaWUgRGF0ZW4gc2ljaGVybgorICAgIHNhdmVfb2JqZWN0KFNBVkVGSUxFKTsKKyAgICBkZXN0cnVjdCh0aGlzX29iamVjdCgpKTsKKworICAgIHJldHVybiAxOworfQorCisKKy8vIFp1bSBEZWJ1Z2dlbi4gTnVyIGb8ciBUaWFtYWsuIEJ6dy4gbnVuIGZ1ZXIgWm9vaywgVmFuaW9uLCBSdW1hdGEKKyNkZWZpbmUgQUxMT1dFRCAoeyJ6b29rIiwidmFuaW9uIiwicnVtYXRhIiwiemVzc3RyYSIsImh1bW5pIn0pCisjZGVmaW5lIE1BVENIKHgseSkgKHNpemVvZihyZWdleHAoeCx5KSkpCitwdWJsaWMgbWFwcGluZyBnZXRfcGF0aG1hcCgpCit7CisgIGlmICggIXRoaXNfaW50ZXJhY3RpdmUoKSB8fCAhTUFUQ0goQUxMT1dFRCxnZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpKSkKKyAgICAgICB8fCAhcHJldmlvdXNfb2JqZWN0KCkgfHwgIU1BVENIKEFMTE9XRUQsZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKSkpCisgICAgICAgIHJldHVybiAoW10pOworCisgICAgcmV0dXJuIHBhdGhtYXA7Cit9CitwdWJsaWMgbWFwcGluZyBnZXRfcGF0aGNhY2hlKCkKK3sKKyAgaWYgKCAhdGhpc19pbnRlcmFjdGl2ZSgpIHx8ICFNQVRDSChBTExPV0VELGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpKQorICAgICAgIHx8ICFwcmV2aW91c19vYmplY3QoKSB8fCAhTUFUQ0goQUxMT1dFRCxnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpKSkKKyAgICAgICAgcmV0dXJuIChbXSk7CisKKyAgICByZXR1cm4gcGF0aGNhY2hlOworfQorCisjdW5kZWYgQUxMT1dFRAorI3VuZGVmIE1BVENICmRpZmYgLS1naXQgYS9wL2RhZW1vbi9yb3V0aW5nZC5jIGIvcC9kYWVtb24vcm91dGluZ2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjkzMzgyCi0tLSAvZGV2L251bGwKKysrIGIvcC9kYWVtb24vcm91dGluZ2QuYwpAQCAtMCwwICsxLDIwMiBAQAorI3ByYWdtYSBzdHJvbmdfdHlwZXMsc2F2ZV90eXBlcworI3ByYWdtYSBub19jbG9uZSxub19zaGFkb3cKKworI2luY2x1ZGUgPHdpemxldmVscy5oPgorCisjZGVmaW5lIERCX05BTUUgIi9wL2RhZW1vbi9zYXZlL3JvdXRpbmdkIgorI2RlZmluZSBNQVhfTEVOIDUwCisjZGVmaW5lIFRQIHRoaXNfcGxheWVyKCkKKworbWFwcGluZyBkb21haW5zOworbWFwcGluZyBleGl0czsKK21hcHBpbmcgdGFyZ2V0czsKK3N0YXRpYyBtYXBwaW5nIGRpcmVjdGlvbnM7CitzdGF0aWMgbWFwcGluZyByZXZlcnNlX2RpcmVjdGlvbnM7CisKK3ZvaWQgY3JlYXRlKCkgeworICAgIHNldGV1aWQoZ2V0dWlkKCkpOworICBpZiAoIXJlc3RvcmVfb2JqZWN0KERCX05BTUUpKSB7CisgICAgZG9tYWlucz0oWyIvZC8iOjFdKTsKKyAgICBleGl0cz0oW10pOworICAgIHRhcmdldHM9KFtdKTsKKyAgfQorCisgIC8vIFVtc2V0enVuZyB6dXIgU3BlaWNoZXJlcnNwYXJuaXM6CisgIGRpcmVjdGlvbnM9KFsibm9yZGVuIjoxLAorCSAgICAgICAibm9yZG9zdGVuIjoyLAorCSAgICAgICAib3N0ZW4iOjMsCisJICAgICAgICJzdWVkb3N0ZW4iOjQsCisJICAgICAgICJvYmVuIjo1LAorCSAgICAgICAic3VlZGVuIjotMSwKKwkgICAgICAgInN1ZWR3ZXN0ZW4iOi0yLAorCSAgICAgICAid2VzdGVuIjotMywKKwkgICAgICAgIm5vcmR3ZXN0ZW4iOi00LAorCSAgICAgICAidW50ZW4iOi01CisJICAgICAgIF0pOworICByZXZlcnNlX2RpcmVjdGlvbnM9KFsxOiJub3JkZW4iLAorCQkgICAgICAgMjoibm9yZG9zdGVuIiwKKwkJICAgICAgIDM6Im9zdGVuIiwKKwkJICAgICAgIDQ6InN1ZWRvc3RlbiIsCisJCSAgICAgICA1OiJvYmVuIiwKKwkJICAgICAgIC0xOiJzdWVkZW4iLAorCQkgICAgICAgLTI6InN1ZWR3ZXN0ZW4iLAorCQkgICAgICAgLTM6Indlc3RlbiIsCisJCSAgICAgICAtNDoibm9yZHdlc3RlbiIsCisJCSAgICAgICAtNToidW50ZW4iCisJCSAgICAgICBdKTsKK30KKworLy8gRnVlciBEZWJ1Zy1aZWNrZToKK21peGVkIHF1ZXJ5X2V4aXRzKHN0cmluZyByb29tKSB7cmV0dXJuIGV4aXRzW3Jvb21dO30KK21peGVkIHF1ZXJ5X3RhcmdldHMoc3RyaW5nIHR5cCkge3JldHVybiB0YXJnZXRzW3R5cF07fQorCitpbnQgQWRkRG9tYWluKHN0cmluZyBkb20sIGludCB2YWwpIHsKKyAgLy8gRnVlZ3QgbmV1ZSBEb21haW4gaGluenUsIGluIGRlciBSb3V0aW5nIG1vZWdsaWNoIHNlaW4gc29sbC4KKyAgLy8gKzE6IEVpbnNjaGxpZXNzZW4KKyAgLy8gLTE6IEF1c3NjaGxpZXNzZW4KKyAgaWYgKCFJU19BUkNIKFRQKQorICAgICAgfHwgdmFsPC0xCisgICAgICB8fCB2YWw+MSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKCF2YWwpCisgICAgZG9tYWlucz1tX2NvcHlfZGVsZXRlKGRvbWFpbnMsZG9tKTsKKyAgZWxzZQorICAgIGRvbWFpbnNbZG9tXT12YWw7CisgIHNhdmVfb2JqZWN0KERCX05BTUUpOworICByZXR1cm4gMTsKK30KKworaW50IFJlZ2lzdGVyVGFyZ2V0KHN0cmluZyB0eXBlLCBzdHJpbmcgZm5hbWUpIHsKKyAgLy8gUmVnaXN0cmllcnQgUmF1bSBhbHMgenUgZWluZXIgR3J1cHBlIHZvbiBaaWVsZW4genVnZWhvZXJpZworICAvLyAoei5CLiBSZWdpc3RlclRhcmdldCgicHViIiwiL2QvZWJlbmUvcm9vbS9Qb3J0VmFpbi9wdWIyIikpCisgIG1hcHBpbmcgbWFwX2xkZmllZDsKKworICBpZiAoIXR5cGUgfHwgIWZuYW1lKQorICAgIHJldHVybiAwOworICB0eXBlPWxvd2VyX2Nhc2UodHlwZSk7CisgIGlmICh0eXBlWzAuLjFdIT0iIyMiKQorICAgIHR5cGU9IiMjIit0eXBlOworICBpZiAoIW1hcHBpbmdwKG1hcF9sZGZpZWQ9dGFyZ2V0c1t0eXBlXSkpCisgICAgbWFwX2xkZmllZD0oW10pOworICBtYXBfbGRmaWVkW2ZuYW1lXT0xOworICB0YXJnZXRzW3R5cGVdPW1hcF9sZGZpZWQ7CisgIHJldHVybiAxOworfQorCitpbnQgUmVnaXN0ZXJFeGl0KHN0cmluZyBzdGFydCwgbWl4ZWQgcmljaHR1bmdlbiwgc3RyaW5nIHppZWwpIHsKKyAgLy8gUmVnaXN0cmllcnQgQXVzZ2FuZyBpbiBkZXIgYW5nZWdlYmVuZW4gUmljaHR1bmcgdm9uIFN0YXJ0IG5hY2ggWmllbCwKKyAgLy8gd2VubiBSb3V0aW5nIGRvcnQgbW9lZ2xpY2ggc2VpbiBzb2xsLgorICBzdHJpbmcgKmRpcnM7CisgIGludCBpLHN6LG9rLHBvczsKKyAgbWl4ZWQgZXgseCxyaWNodHVuZzsKKyAgCisgIGlmIChzdHJpbmdwKHJpY2h0dW5nZW4pKQorICAgIHJpY2h0dW5nZW49KHtyaWNodHVuZ2VufSk7CisgIGlmICghc3RhcnQgfHwgIXBvaW50ZXJwKHJpY2h0dW5nZW4pIHx8ICF6aWVsKQorICAgIHJldHVybiAwOworICBkaXJzPW9sZF9leHBsb2RlKHN0YXJ0LCIvIik7c3o9c2l6ZW9mKGRpcnMpLTE7eD0iLyI7b2s9MDsKKyAgZm9yIChpPTA7aTxzejtpKyspIHsKKyAgICB4PXgrZGlyc1tpXSsiLyI7CisgICAgaWYgKGRvbWFpbnNbeF09PS0xKSAvLyBTdWJkb21haW4gYXVzZ2VzY2hsb3NzZW4/CisgICAgICByZXR1cm4gMDsKKyAgICBpZiAoZG9tYWluc1t4XT09MSkgLy8gRG9tYWluIGVybGF1YnQ/CisgICAgICBvaz0xOworICB9CisgIGlmICghb2spCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKCFwb2ludGVycChleD1leGl0c1tzdGFydF0pKSB7CisgICAgaWYgKGZpbGVfc2l6ZShzdGFydCsiLmMiKTw9MCkgLy8gQmVpbSBlcnN0ZW4gQXVzZ2FuZyBhdWYgVkMgdGVzdGVuCisgICAgICByZXR1cm4gMDsgLy8gS2VpbmUgVmlydHVhbCBDb21waWxlciBSYWV1bWUgcm91dGVuCisgICAgZXg9KHt9KTsKKyAgfQorICBmb3IgKGk9c2l6ZW9mKHJpY2h0dW5nZW4pLTE7aT49MDtpLS0pIHsKKyAgICByaWNodHVuZz1yaWNodHVuZ2VuW2ldOworICAgIGlmICghKHg9ZGlyZWN0aW9uc1tyaWNodHVuZ10pKQorICAgICAgeD1yaWNodHVuZzsKKyAgCisgICAgcG9zPW1lbWJlcihleCx4KTsKKyAgICBpZiAocG9zPj0wICYmIHBvcysxPHNpemVvZihleCkpIC8vIFJpY2h0dW5nIHNjaG9uIGVpbmdldHJhZ2VuPworICAgICBleFtwb3MrMV09emllbDsgLy8gV3VyZGUgdW1kZWZpbmllcnQKKyAgICBlbHNlCisgICAgICBleCs9KHt4LHppZWx9KTsgLy8gKHsgcmljaHR1bmcsIHppZWwgfSkKKyAgfQorICBleGl0c1tzdGFydF09ZXg7CisgIHJldHVybiAxOworfQorCisvLyBMb3ctTGV2ZWwgRmluZFJvdXRlIDotKQorbWFwcGluZyBkb19maW5kX3JvdXRlKHN0cmluZyBzdGFydCwgbWFwcGluZyBpc190YXJnZXQpIHsKKyAgbWFwcGluZyBlcnJlaWNodDsKKyAgaW50IGksaixrOworICBtaXhlZCAqbmV3eCwgKmFjdHgsIGV4OworICBzdHJpbmcgcm9vbSwgZGlyLCB4OworICAKKyAgZXJyZWljaHQ9KFtzdGFydDoiIyNTVEFSVCJdKTsKKyAgbmV3eD0oe3N0YXJ0fSk7CisgIGZvciAoaz1NQVhfTEVOO2s+PTA7ay0tKSB7CisgICAgYWN0eD1uZXd4OyAvLyBJbiBkaWVzZW0gU2Nocml0dCBkaWUgbmV1IGVycmVpY2h0ZW4gUmFldW1lIHBydWVmZW4KKyAgICBuZXd4PSh7fSk7IC8vIE5vY2gga2VpbmUgUmFldW1lIG5ldSBlcnJlaWNodAorICAgIGZvciAoaT1zaXplb2YoYWN0eCktMTtpPj0wO2ktLSkgeworICAgICAgcm9vbT1hY3R4W2ldOworICAgICAgLy8gcHJpbnRmKCIlT1xuIixyb29tKTsKKyAgICAgIGlmICghcG9pbnRlcnAoZXg9ZXhpdHNbcm9vbV0pKQorCWNvbnRpbnVlOworICAgICAgLy8gcHJpbnRmKCItPiAlT1xuIixleCk7CisgICAgICBmb3IgKGo9c2l6ZW9mKGV4KS0xO2o+PTE7ai09MikgeworCXg9ZXhbal07IC8vIFppZWxyYXVtCisJLy8gcHJpbnRmKCItPiAlT1xuIix4KTsKKwlpZiAoIWVycmVpY2h0W3hdKSB7IC8vIFd1cmRlIGJpc2hlciBub2NoIG5pY2h0IGVycmVpY2h0CisJICBlcnJlaWNodFt4XT0oe3Jvb20sZXhbai0xXX0pOworCSAgaWYgKGlzX3RhcmdldFt4XSkgeyAvLyBFaW4gWmllbCB3dXJkZSBlcnJlaWNodAorCSAgICBlcnJlaWNodFsiIyNaSUVMIl09ZXJyZWljaHRbeF07IC8vIEthbm4gamEgYXVjaCBHcnVwcGUgc2VpbgorCSAgICByZXR1cm4gZXJyZWljaHQ7CisJICB9CisJICBuZXd4Kz0oe3h9KTsKKwl9CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCit2YXJhcmdzIG1peGVkIEZpbmRSb3V0ZShzdHJpbmcgc3RhcnQsIHN0cmluZyB6aWVsLCBpbnQgZXR5cCkgeworICBtYXBwaW5nIHJlcyx6aWVsZTsKKyAgc3RyaW5nIHg7CisgIG1peGVkIGV4LHIscmVzdWx0OworICBpbnQgazsKKyAgCisgIGlmICghc3RhcnQgfHwgIXppZWwpCisgICAgcmV0dXJuIDA7CisgIGlmICghbWFwcGluZ3AoemllbGU9dGFyZ2V0c1t6aWVsXSkpCisgICAgemllbGU9KFt6aWVsOjFdKTsKKyAgaWYgKCFtYXBwaW5ncChyZXM9ZG9fZmluZF9yb3V0ZShzdGFydCwgemllbGUpKSkKKyAgICByZXR1cm4gMDsgLy8gbmljaHQgZ2VmdW5kZW4KKyAgaWYgKGV0eXApCisgICAgcmVzdWx0PSh7fSk7CisgIGVsc2UKKyAgICByZXN1bHQ9KFtdKTsKKyAgeD0iIyNaSUVMIjsKKyAgZm9yIChrPU1BWF9MRU4rMjtrPj0wO2stLSkgeworICAgIGV4PXJlc1t4XTsKKyAgICBpZiAoZXg9PSIjI1NUQVJUIikgLy8gRmVydGlnLgorICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAoIShyPXJldmVyc2VfZGlyZWN0aW9uc1tleFsxXV0pKSAvLyByaWNodGlnZSBSaWNodHVuZ2VuIGVpbnRyYWdlbi4KKyAgICAgIHI9ZXhbMV07CisgICAgeD1leFswXTsKKyAgICBpZiAoZXR5cCkKKyAgICAgIHJlc3VsdD0oe3J9KStyZXN1bHQ7CisgICAgZWxzZQorICAgICAgcmVzdWx0W3hdPXI7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgc2F2ZSgpIHsKKwlzYXZlX29iamVjdChEQl9OQU1FKTsKK30KKwordm9pZCByZXNldCgpIHsKKwlzZXRfbmV4dF9yZXNldCg0MzIwMCk7IC8vIEFsbGUgMTIgU3R1bmRlbiBzcGVpY2hlcm4gcmVpY2h0CisJc2F2ZSgpOworfQpkaWZmIC0tZ2l0IGEvcC9kYWVtb24vcnVlc3R1bmdlbi5jIGIvcC9kYWVtb24vcnVlc3R1bmdlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMDI5ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9wL2RhZW1vbi9ydWVzdHVuZ2VuLmMKQEAgLTAsMCArMSw1NiBAQAorI3ByYWdtYSBzdHJvbmdfdHlwZXMsc2F2ZV90eXBlcworI3ByYWdtYSBub19jbG9uZSxub19zaGFkb3cKKworI2luY2x1ZGUgPHdpemxldmVscy5oPgorCisjZGVmaW5lIFNBVkVGSUxFICAiL3AvZGFlbW9uL3NhdmUvcnVlc3R1bmdlbiIKKyNkZWZpbmUgRFVNUEZJTEUgIi9sb2cvUlVFU1RVTkdFTiIKKworbWFwcGluZyBhcm1vdXJzOworCit2b2lkIGNyZWF0ZSgpCit7CisgICAgc2V0ZXVpZChnZXR1aWQodGhpc19vYmplY3QoKSkpOworCisgICAgaWYgKCFyZXN0b3JlX29iamVjdChTQVZFRklMRSkpCisgICAgeworICAgICAgICBhcm1vdXJzID0gKFtdKTsKKyAgICB9Cit9CisKK3ZvaWQgc2F2ZV9tZSgpCit7CisgICAgc2F2ZV9vYmplY3QoU0FWRUZJTEUpOworfQorCit2b2lkIFJlZ2lzdGVyQXJtb3VyKCkKK3sgICBvYmplY3QgIG9iOworICAgIHN0cmluZyAgaWQ7CisKKyAgICBpZiAoIW9iamVjdHAob2I9cHJldmlvdXNfb2JqZWN0KCkpIHx8IAorICAgICAgbWVtYmVyKGluaGVyaXRfbGlzdChvYiksIi9zdGQvYXJtb3VyLmMiKT09LTEpCisgICAgICAgIHJldHVybjsKKyAgICBpZCA9IG9sZF9leHBsb2RlKG9iamVjdF9uYW1lKG9iKSwiIyIpWzBdOworICAgIGlmIChtZW1iZXIoYXJtb3VycyxpZCkpCisgICAgICAgIHJldHVybjsKKyAgICBhcm1vdXJzICs9IChbIGlkIDogMV0pOworICAgIHNhdmVfbWUoKTsKK30KKworaW50IER1bXAoKQoreyAgIHN0cmluZyAgKmluZDsKKyAgICBpbnQgICAgIGk7CisKKyAgICBpZiAoIXRoaXNfaW50ZXJhY3RpdmUoKSB8fCAhSVNfTE9SRCh0aGlzX2ludGVyYWN0aXZlKCkpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKGZpbGVfc2l6ZShEVU1QRklMRSk+PTApCisgICAgICAgIHJtKERVTVBGSUxFKTsKKworICAgIGluZCA9IHNvcnRfYXJyYXkobV9pbmRpY2VzKGFybW91cnMpLCMnPik7CisgICAgaWYgKChpPXNpemVvZihpbmQpKTwxKQorICAgICAgICByZXR1cm4gMDsKKyAgICB3cml0ZV9maWxlKERVTVBGSUxFLHNwcmludGYoIkR1bXBlZDogJXNcbiIsZHRpbWUodGltZSgpKSkpOworICAgIGZvciAoLS1pO2k+PTA7aS0tKQorICAgICAgd3JpdGVfZmlsZShEVU1QRklMRSxpbmRbaV0rIlxuIik7CisgICAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9wL2RhZW1vbi9zYXN0YXRkLmMgYi9wL2RhZW1vbi9zYXN0YXRkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAyODczZQotLS0gL2Rldi9udWxsCisrKyBiL3AvZGFlbW9uL3Nhc3RhdGQuYwpAQCAtMCwwICsxLDEzNSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLyoqIFxmaWxlIC9wL2RhZW1vbi9zYXN0YXRkLmMKKyogU3RhdGlzdGlrZGFlbW9uIGZ1ZXIgU2tpbGwtQXR0cmlidXRlCisqIERlciBEYWVtb24gbG9nZ3QgU0EtTW9kaWZpZXIgdW5kIHNjaHJlaWJ0IHNpZSB2b24gWmVpdCB6dSBaZWl0IGF1ZiBkaWUKKyogUGxhdHRlLgorKiBcYXV0aG9yIFplc3N0cmEKKyogXGRhdGUgMDYuMDguMjAwOAorKiBcdmVyc2lvbiAkSWQkCisqLworLyogQ2hhbmdlbG9nOgorKi8KKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHNhdmVfdHlwZXMKKyNwcmFnbWEgbm9fY2xvbmUsbm9faW5oZXJpdCxub19zaGFkb3cKKyNwcmFnbWEgcGVkYW50aWMscmFuZ2VfY2hlY2sKKworI2luY2x1ZGUgPGRlZmluZXMuaD4KKworLyoqIGFuZmFlbmdsaWNoZSBHcm9lc3NlIGRlcyBMb2ctUHVmZmVycworICAqLworI2RlZmluZSBERUZBVUxUX0JVRkZFUl9MRU4gMjAwCisvKiogYWIgZGllc2VyIEFuemFobCBhbiBFaW50cmFlZ2VuIHdpcmQgaW0gbmFlY2hzdGVuIEJhY2tlbmQtWnlrbHVzIHZvbSBEcml2ZXIKKyAqIHBlciBDYWxsb3V0IGRlciBQdWZmZXIgd2VnZ2VzY2hyaWViZW4uICovCisjZGVmaW5lIEJVRkZFUlRIUkVTSE9MRCAxNTAKKworLyoqIExvZ2ZpbGUgZnVlciBkaWUgU3RhdHMKKyAgKi8KKyNkZWZpbmUgU1RBVExPRyAiU0FTVEFUUyIKKy8qKiBtYXguIExvZ2ZpbGVncm9lc3NlICgzIE1CKQorICAqLworI2RlZmluZSBNQVhMT0dTSVpFIDMxNDU3MjgKKworc3RydWN0IGxvZ19lbnRyeV9zIHsKKyAgaW50IHRpbWVzdGFtcDsKKyAgc3RyaW5nIGxpdjsKKyAgc3RyaW5nIGNhc3RlcjsKKyAgc3RyaW5nIGF0cm5hbWU7CisgIG1peGVkIHZhbHVlOworICBpbnQgZHVyYXRpb247Cit9OworCitzdHJ1Y3QgbG9nX2J1ZmZlcl9zIHsKKyAgbWl4ZWQgYnVmOyAgLy8gQXJyYXkgdm9uIGxvZ19lbnRyeQorICBpbnQgYnVmZmVybGVuOyAvLyBMYWVuZ2UgZGVzIEJ1ZmZlcnMsIGthbm4gZHluLiB2ZXJncm9lc3NlcnQgd2VyZGVuLgorICBpbnQgc3A7IC8vIG9iZXJzdGVyIEVpbnRyYWcgaW0gQnVmZmVyIChsZXR6dGVuZGxpY2ggbmVuIFN0YWNrKS4KK307CisKKy8qKiBzcGVpY2hlcnQgTG9nZWludHJhZWdlIG1pdCBpbmRpdi4gTW9kaWZpZXJlaW50cmFlZ2VuLgorICogQXJyYXkgdm9uIGxvZ19lbnRyeV9zIG1pdCBJbmZvIHVlYmVyIFB1ZmZlcmxhZW5nZSB1bmQgenVsZXR6dAorICogZ2VzY2hyaWViZW5lbSBBcnJheWVpbnRyYWcuCisqLworc3RydWN0IGxvZ19idWZmZXJfcyBsb2didWYgPSAoPGxvZ19idWZmZXJfcz4KKyAgICBidWYgOiBhbGxvY2F0ZShERUZBVUxUX0JVRkZFUl9MRU4pLAorICAgIGJ1ZmZlcmxlbiA6IERFRkFVTFRfQlVGRkVSX0xFTiwKKyAgICAvLyAtMSwgd2VpbCBkZXIgc3AgYmVpbSBMb2dnZW4genVlcnN0IGVyaG9laHQgd2lyZCB1bmQgc29uc3QgRWxlbWVudGUgMAorICAgIC8vIGxlZXIgYmxlaWJ0LgorICAgIHNwIDogLTEgKTsKKworLyoqIFxkZWYgREVCVUcKKyAgT3V0cHV0cyBkZWJ1ZyBtZXNzYWdlIHRvIE1haW50YWluZXIsIGlmIE1haW50ZWluZXIgaXMgbG9nZ2VkIGluLiAKKyovCisjaWZuZGVmIERFQlVHCisjZGVmaW5lIERFQlVHKHgpICBpZiAoZmluZF9wbGF5ZXIoInplc3N0cmEiKSlcCisgICAgICAgICAgICB0ZWxsX29iamVjdChmaW5kX3BsYXllcigiemVzc3RyYSIpLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVEQkc6ICIreCsiXG4iKQorI2VuZGlmCisKK3ByaXZhdGUgc3RyaW5nIEZvcm1hdExvZ0VudHJ5KHN0cnVjdCBsb2dfZW50cnlfcyBlbnRyeSkgeworICByZXR1cm4gc3ByaW50ZigiWyVzXSAlcywgJXMsICVzLCAlcywgJWRcbiIsIAorICAgICAgc3RyZnRpbWUoIiVkJW0leS0lSCVNJVMiLGVudHJ5LT50aW1lc3RhbXApLAorICAgICAgZW50cnktPmxpdiwgZW50cnktPmNhc3RlciwgZW50cnktPmF0cm5hbWUsCisgICAgICBlbnRyeS0+dmFsdWUsIGVudHJ5LT5kdXJhdGlvbik7Cit9CisKK3ByaXZhdGUgdm9pZCBXcml0ZUJ1ZmZlcigpIHsKKyAgLy8gcmVsZXZhbnRlbiBUZWlsIGRlcyBQdWZmZXJzIGV4dHJhaGllcmVuLgorICBtaXhlZCBidWYgPSBsb2didWYtPmJ1ZlswLi5sb2didWYtPnNwXTsKKyAgLy8gZGFubiBhbGxlIEVpbnRyYWVnZSBpbiBTdHJpbmdzIG1hcHBlbgorICBidWYgPSBtYXAoYnVmLCAjJ0Zvcm1hdExvZ0VudHJ5KTsKKyAgLy8gd2Vnc2NocmVpYmVuCisgIGxvZ19maWxlKFNUQVRMT0csIHNwcmludGYoIiVAcyIsYnVmKSwgTUFYTE9HU0laRSk7CisgIC8vIHNwIGF1ZiBkZW4gUHVmZmVyYW5mYW5nIHNldHplbgorICBsb2didWYtPnNwID0gLTE7Cit9CisKK3B1YmxpYyB2b2lkIExvZ01vZGlmaWVyKG9iamVjdCBjYXN0ZXIsIHN0cmluZyBhdHJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZWQgdmFsdWUsIGludCBkdXJhdGlvbikgeworICAvLyBudXIgU3BpZWxlciBzaW5kIGludGVyZXNzYW50CisgIGlmICghcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShwcmV2aW91c19vYmplY3QoKSkpCisgICAgcmV0dXJuOworCisgIC8vIHNwIHVtIGVpbnMgZXJob2VoZW4gdW5kIHNjaGF1ZW4sIG9iIGRpZSBQdWZmZXJncm9lc3NlIHVlYmVyc2Nocml0dGVuCisgIC8vIHd1cmRlLiBXZW5uIGphLCBQdWZmZXIgdmVyZ3JvZXNzZXJuLgorICBsb2didWYtPnNwKys7CisgIGlmIChsb2didWYtPnNwID49IGxvZ2J1Zi0+YnVmZmVybGVuKSB7CisgICAgbG9nYnVmLT5idWYgPSBsb2didWYtPmJ1ZiArIGFsbG9jYXRlKDUwKTsKKyAgICBsb2didWYtPmJ1ZmZlcmxlbiArPSA1MDsKKyAgfQorICAvLyBlaW50cmFnZW4uIEludGVyZXNzYW50ZXJ3ZWlzZSBpc3QgZXMgdGF0c2FlY2hsaWNoIGtlaW4gUHJvYmxlbSwgd2VubgorICAvLyBTdHJ1Y3RtZW1iZXIgdW5kIGxva2FsZSBWYXJpYWJsZW4gaGllciBkZW4gZ2xlaWNoZW4gTmFtZW4gaGFiZW0uIDstKQorICBsb2didWYtPmJ1Zltsb2didWYtPnNwXSA9ICg8bG9nX2VudHJ5X3M+CisgICAgICB0aW1lc3RhbXAgOiB0aW1lKCksCisgICAgICBsaXYgOiBnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpLCAvLyBudXIgU3BpZWxlcgorICAgICAgY2FzdGVyIDogb2JqZWN0X25hbWUoY2FzdGVyKSwKKyAgICAgIGF0cm5hbWUgOiBhdHJuYW1lLAorICAgICAgdmFsdWUgOiB0b19zdHJpbmcodmFsdWUpLCAvLyB3ZWdlbiAoZmx1ZWNodGlnZXIpIENsb3N1cmVzCisgICAgICBkdXJhdGlvbiA6IGR1cmF0aW9uICk7CisgIC8vIHdlZ3NjaHJlaWJlbiB2ZXJhbmxhc3NlbgorICBpZiAobG9nYnVmLT5zcCA+IEJVRkZFUlRIUkVTSE9MRAorICAgICAgJiYgZmluZF9jYWxsX291dCgjJ1dyaXRlQnVmZmVyKSA9PSAtMSkKKyAgICBjYWxsX291dCgjJ1dyaXRlQnVmZmVyLCAwKTsKK30KKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkgeworICBzZXRldWlkKGdldHVpZChNRSkpOworfQorCit2YXJhcmdzIHB1YmxpYyBpbnQgcmVtb3ZlKGludCBzaWxlbnQpIHsKKyAgaWYgKGxvZ2J1Zi0+c3AgPiAtMSkKKyAgICBXcml0ZUJ1ZmZlcigpOworICBkZXN0cnVjdChNRSk7CisgIHJldHVybiAxOworfQorCit2b2lkIHJlc2V0KCkgeworICAvLyBnZ2YuIFB1ZmZlciB3ZWdzY2hyZWliZW4uCisgIGlmIChsb2didWYtPnNwID4gQlVGRkVSVEhSRVNIT0xEKQorICAgIFdyaXRlQnVmZmVyKCk7CisgIC8vIGdnZi4gc2VociBncm9zc2UgUHVmZmVyIHZlcmtsZWluZXJuCisgIGlmIChsb2didWYtPmJ1ZmZlcmxlbiA+IERFRkFVTFRfQlVGRkVSX0xFTiAqIDIpIHsKKyAgICBsb2didWYtPmJ1ZiA9IGFsbG9jYXRlKERFRkFVTFRfQlVGRkVSX0xFTik7CisgICAgbG9nYnVmLT5idWZmZXJsZW4gPSBERUZBVUxUX0JVRkZFUl9MRU47CisgICAgbG9nYnVmLT5zcCA9IC0xOworICB9Cit9CisKZGlmZiAtLWdpdCBhL3AvZGFlbW9uL3N2bjJuZXdzLmMgYi9wL2RhZW1vbi9zdm4ybmV3cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZWNlNzkKLS0tIC9kZXYvbnVsbAorKysgYi9wL2RhZW1vbi9zdm4ybmV3cy5jCkBAIC0wLDAgKzEsNTUgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBzdm4ybmV3cy5jIC0tIFNldHp0IGRpZSBTdWJ2ZXJzaW9uLUVpbnRyYWVnZSBpbiBtYWdpZXIubXVkbGliCisvLworLy8gJElkJAorCisvLyBFcnN0ZWxsdCBhdWYgQmFzaXMgdm9uIHJjczJuZXdzIHZvbiBab29rLgorCisjcHJhZ21hIHN0cmljdF90eXBlcyxzYXZlX3R5cGVzCisjcHJhZ21hIG5vX2Nsb25lLG5vX3NoYWRvdworCisjaW5jbHVkZSA8ZGFlbW9uLmg+CisKKyNkZWZpbmUgTkVXU0ZJTEUgIi9wL2RhZW1vbi9zYXZlL3N2bjJuZXdzLnR4dCIKKyNkZWZpbmUgTkVXU0ZJTEVPTEQgIi9wL2RhZW1vbi9zYXZlL3N2bjJuZXdzLm9sZCIKKworI2RlZmluZSBERUJVRyhzdHIpIGlmIChmaW5kX3BsYXllcigiem9vayIpKSAgXAorICB0ZWxsX29iamVjdChmaW5kX3BsYXllcigiem9vayIpLCBzcHJpbnRmKCJzdm4ybmV3czogREVCVUc6ICVPXG4iLHN0cikpCisKK3N0YXRpYyB2b2lkIGNoZWNrcmNzKCkKK3sKKyAgc3RyaW5nIHN0cjsKKyAgbWl4ZWQgYXJ0OworICAvLyBMZXR6dGUgRWludHJhZyBzb2xsdGUgZWluIHdlbmlnIGhlciBzZWluLCBkYW1pdCBlcyBrZWluZQorICAvLyBVZWJlcnNjaG5laWR1bmdlbiBnaWJ0LgorICBpZiAoZmlsZV90aW1lKE5FV1NGSUxFKSsxODAwID4gdGltZSgpKSByZXR1cm47CisgIGlmICghKHN0cj1yZWFkX2ZpbGUoTkVXU0ZJTEUsMCwxMDAwMCkpIHx8IChzdHI9PSIiKSkgcmV0dXJuOworICBhcnQ9KHsibWFnaWVyLm11ZGxpYiIsIlNWTjJORVdTIiwwLDAsCisgICAgICAgICJTVk4tRWludHJhZWdlIHZvbSAiK2R0aW1lKHRpbWUoKSksc3RyfSk7CisgIGlmICgoIi9zZWN1cmUvbmV3cyItPldyaXRlTm90ZShhcnQsMSk+PTEpIHx8CisgICAgICAoKCIvc2VjdXJlL25ld3MiLT5SZW1vdmVOb3RlKCJtYWdpZXIubXVkbGliIiwwKT49MSkgJiYKKyAgICAgICAoIi9zZWN1cmUvbmV3cyItPldyaXRlTm90ZShhcnQsMSk+PTEpKSkKKyAgICBjYXRjaChyZW5hbWUoTkVXU0ZJTEUsTkVXU0ZJTEVPTEQpO3B1Ymxpc2gpOworICBlbHNlIGxvZ19maWxlKCJTVk4yTkVXUyIsZHRpbWUodGltZSgpKSsKKwkJIiA6IEthbm4gUkNTLUVpbnRyYWVnZSBuaWNodCBuYWNoIG1hZ2llci5tdWRsaWIgcG9zdGVuIVxuIik7Cit9CisKK3ZvaWQgcmVzZXQoKQoreworICAvLyBjYWxsX291dCgpIG5vZXRpZywgZGEgc29uc3Qga2VpbiB3ZWl0ZXJlcyByZXNldCgpIGdlcnVmZW4gd2lyZAorICAvLyByZXNldCgpIHdpcmQgbnVyIGdlcnVmZW4gYmVpIGVpbmVtIGNhbGwgZWluZXIgYW5kZXJlbiBGdW5rdGlvbgorICAvLyBuYWNoIGVpbmVtIFJlc2V0CisgIGNhbGxfb3V0KCJjaGVja3JjcyIsMSk7Cit9CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgc2V0ZXVpZChnZXR1aWQoKSk7CisgIHJlc2V0KCk7Cit9CisKK3ZvaWQgY2xlYW5fdXAoaW50IHJlZmMpCit7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvcC9kYWVtb24vdGVhbW1hc3Rlci5jIGIvcC9kYWVtb24vdGVhbW1hc3Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZThjYTAKLS0tIC9kZXYvbnVsbAorKysgYi9wL2RhZW1vbi90ZWFtbWFzdGVyLmMKQEAgLTAsMCArMSw4NCBAQAorI3ByYWdtYSBzdHJvbmdfdHlwZXMsc2F2ZV90eXBlcworI3ByYWdtYSBub19zaGFkb3csbm9fY2xvbmUKKworI2luY2x1ZGUgPGxpdmluZy90ZWFtLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjZGVmaW5lIE1FIHRoaXNfb2JqZWN0KCkKKyNkZWZpbmUgUE8gcHJldmlvdXNfb2JqZWN0KCkKKworc3RhdGljIG1hcHBpbmcgdGVhbV9uYW1lczsKK3N0YXRpYyBtYXBwaW5nIHRlYW1fbmFtZXNfcmV2ZXJzZTsKKwordm9pZCBjcmVhdGUoKSB7CisKKyAgdGVhbV9uYW1lcz0oW10pOyAgICAgICAgIC8vIE9iamVrdCAtPiBOYW1lCisgIHRlYW1fbmFtZXNfcmV2ZXJzZT0oW10pOyAvLyBOYW1lIC0+IE9iamVrdAorfQorCitzdGF0aWMgbWl4ZWQgRG9SZWdpc3RlclRlYW0ob2JqZWN0IG9iLCBzdHJpbmcgbmFtZSkgeworICBtaXhlZCBvbGQ7CisKKyAgb2xkPXRlYW1fbmFtZXNbb2JdOworICBtX2RlbGV0ZSh0ZWFtX25hbWVzX3JldmVyc2Usb2xkKTsgLy8gTmFtZW4gRnJlaWdlYmVuCisgIGlmICghbmFtZSkgeyAvLyBVblJlZ2lzdGVyCisgICAgbV9kZWxldGUodGVhbV9uYW1lcyxvYik7CisgICAgcmV0dXJuIG5hbWU7CisgIH0KKyAgdGVhbV9uYW1lc1tvYl09bmFtZTsKKyAgdGVhbV9uYW1lc19yZXZlcnNlW25hbWVdPW9iOworICByZXR1cm4gbmFtZTsKK30KKwordmFyYXJncyBzdHJpbmcgUmVnaXN0ZXJUZWFtKHN0cmluZyBuYW1lKSB7CisgIGludCBpLG1pbjsKKworICBpZiAobWVtYmVyKGluaGVyaXRfbGlzdChQTyksVEVBTV9PQkpFQ1QrIi5jIik8MCkKKyAgICByZXR1cm4gMDsKKyAgaWYgKHN0cmluZ3AobmFtZSkpeworICAgIGlmICghdGVhbV9uYW1lc19yZXZlcnNlW25hbWVdKSAvLyBOYW1lIG5vY2ggbmljaHQgdmVyZ2ViZW4KKyAgICAgIHJldHVybiBEb1JlZ2lzdGVyVGVhbShQTyxuYW1lKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBtaW49c2l6ZW9mKG1faW5kaWNlcyh0ZWFtX25hbWVzX3JldmVyc2UpKSsyOworICBmb3IgKGk9MTtpPG1pbjtpKyspCisgICAgaWYgKCF0ZWFtX25hbWVzX3JldmVyc2Vbc3ByaW50ZigiJWQiLGkpXSkgeworICAgICAgbWluPWk7CisgICAgICBicmVhazsKKyAgICB9CisgIG5hbWU9c3ByaW50ZigiJWQiLGkpOworICByZXR1cm4gRG9SZWdpc3RlclRlYW0oUE8sbmFtZSk7Cit9CisKK3ZvaWQgVW5yZWdpc3RlclRlYW0oKSB7CisgIGlmIChtZW1iZXIoaW5oZXJpdF9saXN0KFBPKSxURUFNX09CSkVDVCsiLmMiKT49MCkKKyAgICBEb1JlZ2lzdGVyVGVhbShQTywwKTsKK30KKworb2JqZWN0ICpMaXN0VGVhbU9iamVjdHMoKSB7CisgIHJldHVybihtX2luZGljZXModGVhbV9uYW1lcyktKHswfSkpOworfQorCitzdHJpbmcgKkxpc3RUZWFtTmFtZXMoKSB7CisgIHJldHVybihtX2luZGljZXModGVhbV9uYW1lc19yZXZlcnNlKS0oezB9KSk7Cit9CisKK3N0cmluZyAqU29ydGVkTGlzdFRlYW1OYW1lcygpIHsKKyAgcmV0dXJuKHNvcnRfYXJyYXkoTGlzdFRlYW1OYW1lcygpLCMnPCkpOworfQorCit2b2lkIFNob3dUZWFtSW5mb3MoKSB7CisgIG9iamVjdCBvYjsKKyAgc3RyaW5nICppbmQ7CisgIGludCBpOworICAKKyAgd3JpdGUoIiAtLS0gVGVhbWxpc3RlOiAtLS1cbiIpOworICBpbmQ9U29ydGVkTGlzdFRlYW1OYW1lcygpOworICBmb3IgKGk9c2l6ZW9mKGluZCktMTtpPj0wO2ktLSkKKyAgICBpZiAob2JqZWN0cChvYj10ZWFtX25hbWVzX3JldmVyc2VbaW5kW2ldXSkpCisgICAgICBvYi0+U2hvd1RlYW1JbmZvKCk7CisgIHdyaXRlKCIgLS0tIChFbmRlIFRlYW1saXN0ZSkgLS0tXG4iKTsKK30KKwordmFyYXJncyBpbnQgcmVtb3ZlKGludCBzaWxlbnQpIHsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9wL2RhZW1vbi90bXBfcHJvcF9tYXN0ZXIuYyBiL3AvZGFlbW9uL3RtcF9wcm9wX21hc3Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZTFkZTcKLS0tIC9kZXYvbnVsbAorKysgYi9wL2RhZW1vbi90bXBfcHJvcF9tYXN0ZXIuYwpAQCAtMCwwICsxLDMzOCBAQAorI3ByYWdtYSBzdHJvbmdfdHlwZXMsc2F2ZV90eXBlcworI3ByYWdtYSBub19jbG9uZSxub19zaGFkb3cKKworI2luY2x1ZGUgPHRoaW5nL3Byb3BlcnRpZXMuaD4KKworI2RlZmluZSBTQVZFRklMRSAiL3AvZGFlbW9uL3NhdmUvdG1wX3Byb3BfbWFzdGVyIgorI2RlZmluZSBQUk9QTUFTVEVSICIvcC9kYWVtb24vdG1wX3Byb3BfbWFzdGVyIgorI2RlZmluZSBJTkRFWChhLGIpIChvYmplY3RfbmFtZShhKSsiIyMiK2IpCisKKworI2lmZGVmIERFQlVHCisjICAgdW5kZWYgREVCVUcKKyNlbmRpZgorCisjaWZkZWYgREVCVUcKKyMgICBkZWZpbmUgREJHKHgpIGlmICggZmluZF9wbGF5ZXIoInJpa3VzIikgKSBcCisgICAgICAgICAgICAgICAgICAgICB0ZWxsX29iamVjdCggZmluZF9wbGF5ZXIoInJpa3VzIiksIHggKTsKKyNlbHNlCisjICAgZGVmaW5lIERCRyh4KQorI2VuZGlmCisKKworbWl4ZWQgKnJlc2V0X3RpbWVzOworbWFwcGluZyBpbl9wcm9ncmVzczsKKworCit2YXJhcmdzIHB1YmxpYyBpbnQgcmVtb3ZlKCBpbnQgc2lsZW50ICk7CitwdWJsaWMgdm9pZCByZXNldCgpOworcHVibGljIHZvaWQgcHJpbnRfZGVidWdfaW5mbygpOworc3RhdGljIHZvaWQgY2FsbF9uZXh0X3VwZGF0ZSgpOworc3RhdGljIHZvaWQgZG9fdXBkYXRlKCk7CitwdWJsaWMgaW50IElzVG1wUHJvcCggb2JqZWN0IG9iLCBzdHJpbmcgcHJvcCApOworcHVibGljIHZvaWQgUmVtb3ZlVG1wUHJvcCggc3RyaW5nIHByb3AgKTsKK3ZhcmFyZ3MgcHVibGljIHZvaWQgU2V0VG1wUHJvcCggb2JqZWN0IG9iLCBzdHJpbmcgcHJvcCwgbWl4ZWQgbmV3dmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG0sIGludCBzcCApOworCisKK3B1YmxpYyB2b2lkIGNyZWF0ZSgpCit7CisKKyAgICBzZXRldWlkKGdldHVpZCh0aGlzX29iamVjdCgpKSk7CisgICAgCisgICAgaWYgKCAhcmVzdG9yZV9vYmplY3QoU0FWRUZJTEUpICl7CisgICAgICAgIGluX3Byb2dyZXNzID0gKFtdKTsKKyAgICAgICAgcmVzZXRfdGltZXMgPSAoe30pOworICAgIH0KKworICAgIGNhbGxfbmV4dF91cGRhdGUoKTsKK30KKworCit2YXJhcmdzIHB1YmxpYyBpbnQgcmVtb3ZlKCBpbnQgc2lsZW50ICkKK3sKKyAgICBzYXZlX29iamVjdChTQVZFRklMRSk7CisgICAgZGVzdHJ1Y3QodGhpc19vYmplY3QoKSk7CisgICAgCisgICAgcmV0dXJuIDE7Cit9CisKKworcHVibGljIHZvaWQgcmVzZXQoKQoreworICAgIHNhdmVfb2JqZWN0KFNBVkVGSUxFKTsKK30KKworCitwdWJsaWMgdm9pZCBwcmludF9kZWJ1Z19pbmZvKCkKK3sKKyAgICBwcmludGYoICJpbl9wcm9ncmVzczogJU9cbnJlc2V0X3RpbWVzOiAlT1xuIiwgaW5fcHJvZ3Jlc3MsIHJlc2V0X3RpbWVzICk7Cit9CisKKworc3RhdGljIHZvaWQgY2FsbF9uZXh0X3VwZGF0ZSgpCit7CisgICAgaW50IGR0OworICAgIAorICAgIHdoaWxlICggcmVtb3ZlX2NhbGxfb3V0KCJkb191cGRhdGUiKSAhPSAtMSApCisgICAgICAgIDsKKyAgICAKKyAgICBpZiAoIHNpemVvZihyZXNldF90aW1lcykgKXsKKyAgICAgICAgZHQgPSByZXNldF90aW1lc1swXVswXSAtIHRpbWUoKTsKKworICAgICAgICBpZiAoIGR0IDw9IDAgKQorICAgICAgICAgICAgZHQgPSA1OworICAgICAgICAKKyAgICAgICAgY2FsbF9vdXQoICJkb191cGRhdGUiLCBkdCApOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZCBkb191cGRhdGUoKQoreworICAgIGludCBpLCBtYXg7CisgICAgc3RyaW5nIGluZGV4OworICAgIG1peGVkICp2YWw7CisKKyAgICBEQkcoICJkb191cGRhdGUoKSBhdWZnZXJ1ZmVuIVxuIiApOworCisgICAgd2hpbGUgKCByZW1vdmVfY2FsbF9vdXQoImRvX3VwZGF0ZSIpICE9IC0xICkKKyAgICAgICAgOworICAgIAorICAgIGNhbGxfb3V0KCAiZG9fdXBkYXRlIiwgMzAgKTsgLy8gWnVyIFNpY2hlcmhlaXQuLi4KKworICAgIGlmICggIShtYXggPSBzaXplb2YocmVzZXRfdGltZXMpKSApCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICBmb3IgKCBpID0gMDsgaSA8IG1heCAmJiByZXNldF90aW1lc1tpXVswXSA8PSB0aW1lKCk7IGkrKyApeworICAgICAgICBpbmRleCA9IHJlc2V0X3RpbWVzW2ldWzFdOworCisgICAgICAgIGlmICggIXBvaW50ZXJwKHZhbCA9IGluX3Byb2dyZXNzW2luZGV4XSkgfHwgIW9iamVjdHAodmFsWzBdKSApCisJeworICAgICAgICAgICAgbV9kZWxldGUoIGluX3Byb2dyZXNzICxpbmRleCApOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBEQkcoIHNwcmludGYoIkVudGZlcm5lIEVpbnRyYWcgJU8hXG4iLCBpbmRleCkgKTsKKworICAgICAgICBpZiAoIHZhbFs0XSApeworICAgICAgICAgICAgaWYgKCB2YWxbMF0tPlF1ZXJ5KHZhbFsxXSwgRl9WQUxVRSkgPT0gdmFsWzNdICl7CisgICAgICAgICAgICAgICAgREJHKCAiQWx0ZSBQcm9wZXJ0eSBwZXIgU2V0UHJvcCgpIHJlc3RhdXJpZXJ0IVxuIiApOworICAgICAgICAgICAgICAgIHZhbFswXS0+U2V0UHJvcCggdmFsWzFdLCB2YWxbMl0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmICggdmFsWzBdLT5RdWVyeSggdmFsWzFdLCBGX1FVRVJZX01FVEhPRCApID09IHZhbFsyXSApeworICAgICAgICAgICAgICAgIHZhbFswXS0+U2V0KCB2YWxbMV0sIDAsIEZfUVVFUllfTUVUSE9EICk7CisgICAgICAgICAgICAgICAgREJHKCAiRl9RVUVSWV9NRVRIT0QgZW50ZmVybnQhXG4iICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICggdmFsWzBdLT5RdWVyeSggdmFsWzFdLCBGX1NFVF9NRVRIT0QgKSA9PSB2YWxbM10gKXsKKyAgICAgICAgICAgICAgICB2YWxbMF0tPlNldCggdmFsWzFdLCAwLCBGX1NFVF9NRVRIT0QgKTsKKyAgICAgICAgICAgICAgICBEQkcoICJGX1NFVF9NRVRIT0QgZW50ZmVybnQhXG4iICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtX2RlbGV0ZSggaW5fcHJvZ3Jlc3MgLGluZGV4ICk7CisgICAgfQorICAgIAorICAgIHJlc2V0X3RpbWVzID0gcmVzZXRfdGltZXNbaS4uXTsKKyAgICBjYWxsX25leHRfdXBkYXRlKCk7Cit9CisKKworLy8gWnVyIEFiZnJhZ2UsIG9iIGVpbmUgdGVtcG9yYWVyZSBQcm9wZXJ0eSBzY2hvbiBnZXNldHp0IGlzdAorcHVibGljIGludCBJc1RtcFByb3AoIG9iamVjdCBvYiwgc3RyaW5nIHByb3AgKQoreworICAgIG1peGVkIG9sZHZhbDsKKworICAgIGlmICggIW9iamVjdHAob2IpIHx8ICFwcm9wICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgCisgICAgaWYgKCAob2xkdmFsID0gaW5fcHJvZ3Jlc3NbSU5ERVgob2IsIHByb3ApXSkKKyAgICAgICAgICYmIG9iID09IG9sZHZhbFswXSAmJiBwcm9wID09IG9sZHZhbFsxXSApCisgICAgICAgIHJldHVybiAxOworICAgIAorICAgIHJldHVybiAwOworfQorCisKKy8vIEVudGZlcm5lbiBlaW5lciB0ZW1wb3JhZXJlbiBQcm9wZXJ0eS4KKy8vIElzdCBuaWNodCB6dW0gRW50ZmVybmVuIHBlciBIYW5kIGdlZGFjaHQsIHNvbmRlcm4ga2FubiBudXIgdm9tIE9iamVrdCBzZWxiZXIKKy8vIGF1ZmdlcnVmZW4gd2VyZGVuLiBHZXNjaGllaHQsIHdlbm4gYmVpIGdlc2V0enRlciB0ZW1wb3JhZXJlciBGX1NFVF9NRVRIT0QKKy8vIGVpbiBmcmVtZGVzIFNldFByb3AoKSBhdWYgZGllIFByb3BlcnR5IGtvbW10LgorcHVibGljIHZvaWQgUmVtb3ZlVG1wUHJvcCggc3RyaW5nIHByb3AgKQoreworICAgIHN0cmluZyBpbmRleDsKKyAgICBtaXhlZCAqdmFsOworICAgIGludCBpOworICAgIAorICAgIERCRyggIlJlbW92ZVRtcFByb3AhXG4iKTsKKyAgICBpZiAoICFwcmV2aW91c19vYmplY3QoKSB8fCAhc3RyaW5ncChwcm9wKSB8fCAhc2l6ZW9mKHByb3ApICkKKyAgICAgICAgcmV0dXJuOworCisgICAgaW5kZXggPSBJTkRFWChwcmV2aW91c19vYmplY3QoKSwgcHJvcCk7CisgICAgREJHKCBzcHJpbnRmKCJSZW1vdmVUbXBQcm9wKCVPKSFcbiIsIGluZGV4KSApOworCisgICAgaWYgKCAhKHZhbCA9IGluX3Byb2dyZXNzW2luZGV4XSkgKXsKKyAgICAgICAgREJHKCAiS2VpbiBFaW50cmFnIHZvcmhhbmRlbiFcbiIgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICggb2JqZWN0cCh2YWxbMF0pICl7CisgICAgICAgIERCRyggIlJlc3RhdXJpZXJlIGFsdGVuIFp1c3RhbmQgLi4uXG4iICk7CisKKyAgICAgICAgaWYgKCB2YWxbNF0gKXsKKyAgICAgICAgICAgIGlmICggdmFsWzBdLT5RdWVyeSh2YWxbMV0sIEZfVkFMVUUpID09IHZhbFszXSApeworICAgICAgICAgICAgICAgIERCRyggIkFsdGUgUHJvcGVydHkgcGVyIFNldFByb3AoKSByZXN0YXVyaWVydCFcbiIgKTsKKyAgICAgICAgICAgICAgICB2YWxbMF0tPlNldFByb3AoIHZhbFsxXSwgdmFsWzJdICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoIHZhbFswXS0+UXVlcnkoIHZhbFsxXSwgRl9RVUVSWV9NRVRIT0QgKSA9PSB2YWxbMl0gKXsKKyAgICAgICAgICAgICAgICB2YWxbMF0tPlNldCggdmFsWzFdLCAwLCBGX1FVRVJZX01FVEhPRCApOworICAgICAgICAgICAgICAgIERCRyggIkZfUVVFUllfTUVUSE9EIGVudGZlcm50IVxuIiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIHZhbFswXS0+UXVlcnkoIHZhbFsxXSwgRl9TRVRfTUVUSE9EICkgPT0gdmFsWzNdICl7CisgICAgICAgICAgICAgICAgdmFsWzBdLT5TZXQoIHZhbFsxXSwgMCwgRl9TRVRfTUVUSE9EICk7CisgICAgICAgICAgICAgICAgREJHKCAiRl9TRVRfTUVUSE9EIGVudGZlcm50IVxuIiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm9yICggaSA9IHNpemVvZihyZXNldF90aW1lcyk7IGktLTsgKQorICAgICAgICBpZiAoIHJlc2V0X3RpbWVzW2ldWzFdID09IGluZGV4ICl7CisgICAgICAgICAgICByZXNldF90aW1lc1tpLi5pXSA9ICh7fSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIAorICAgIERCRyggIkVpbnRyYWcgZW50ZmVybnQhXG4iICk7CisgICAgbV9kZWxldGUoIGluX3Byb2dyZXNzLCBpbmRleCApOworfQorCisKKy8vIFByb3BlcnR5ICdwcm9wJyBpbSBPYmpla3QgJ29iJyBmdWVyICd0bScgU2VrdW5kZW4gYXVmIFdlcnQgJ25ld3ZhbCcgc2V0emVuLgorLy8gV2VubiBkZXIgU2NoYWx0ZXIgJ3NwJyBnZXNldHp0IGlzdCwgd2lyZCBkYWZ1ZXIgU2V0UHJvcCgpIHZlcndlbmRldCwKKy8vIGFuc3RhdHQgZWluZSBGX1FVRVJZX01FVEhPRCB6dSBiZW51dHplbi4KKy8vCisvLyBBQ0hUVU5HOgorLy8KKy8vIERhcyBTZXR6ZW4gdm9uICdzcCcgaXN0IGhvZWNoc3QgZmVobGVyYW5mYWVsbGlnIHVuZCBzb2xsdGUgbnVyIGluIHdlbmlnZW4KKy8vIFNwZXppYWxmYWVsbGVuIGdlc2NoZWhlbiwgaW4gZGVuZW4gZWluZSBTRVQtTWV0aG9kZSBhdWZnZXJ1ZmVuIHdlcmRlbiBtdXNzCisvLyAod2llIGJlaSBQX0xJR0hUIHouQi4pLiBBbnNvbnN0ZW4gYml0dGUgZGVuIERlZmF1bHQtQXVmcnVmIG9obmUgJ3NwJworLy8gdmVyd2VuZGVuIQorLy8gCisvLyBFcyBiZXN0ZWh0IHNvbnN0IGRpZSBHZWZhaHIsIGRhc3MgZGllIFByb3BlcnR5IG5pY2h0IGtvcnJla3QgenVydWVja2dlc2V0enQKKy8vIHdpcmQgKHdlbm4gZGllc2VyIE1hc3RlciBvZGVyICdvYicgemVyc3RvZXJ0IHdpcmQgLSBvZGVyIGJlaWRlcyB3aWUgYmVpIGVpbmVtCisvLyBDcmFzaCkgb2RlciBkYXNzIGR1cmNoIFdlY2hzZWx3aXJrdW5nZW4gbWl0IGFuZGVyZW4gUXVlcnktIG9kZXIgU2V0LU1ldGhvZGVuCisvLyBlaW4gZmFsc2NoZXIgV2VydCAicmVzdGF1cmllcnQiIHdpcmQuCisKK3ZhcmFyZ3MgcHVibGljIHZvaWQgU2V0VG1wUHJvcCggb2JqZWN0IG9iLCBzdHJpbmcgcHJvcCwgbWl4ZWQgbmV3dmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG0sIGludCBzcCApCit7CisgICAgc3RyaW5nIGluZGV4OworICAgIG1peGVkIG9sZHZhbCwgdG1wOworICAgIGludCBtYXgsIHBvcywgbCwgcjsKKyAgICBjbG9zdXJlIGEsIGI7CisKKyAgICBpZiAoICFvYmplY3RwKG9iKSB8fCAhc3RyaW5ncChwcm9wKSB8fCAhc2l6ZW9mKHByb3ApIHx8IHRtIDw9IDAgKQorICAgICAgICByZXR1cm47CisKKyAgICBpbmRleCA9IElOREVYKG9iLCBwcm9wKTsKKyAgICBEQkcoIHNwcmludGYoIlNldFRtcFByb3AoICVPLCAlTywgJU8sICVPLCAlTyApIVxuIiwgb2IsIHByb3AsIG5ld3ZhbCwKKyAgICAgICAgICAgICAgICAgdG0sIHNwKSApOworCisgICAgLy8gd2VubiBiZXJlaXRzIGVpbiB0ZW1wb3JhZXJlciBQcm96ZXNzIGxhZXVmdCwgZGllc2VuIG51biBiZWVuZGVuIQorICAgIGlmICggKG9sZHZhbCA9IGluX3Byb2dyZXNzW2luZGV4XSkKKyAgICAgICAgICYmIG9iID09IG9sZHZhbFswXSAmJiBwcm9wID09IG9sZHZhbFsxXSApeworICAgICAgICBEQkcoICJFcyBsYWV1ZnQgYmVyZWl0cyBlaW4gVm9yZ2FuZyBmdWVyIGRpZXNlIFByb3BlcnR5IVxuIiApOworICAgICAgICAKKyAgICAgICAgLy8gV3VyZGUgZGllIGFsdGUgdGVtcG9yYWVyZSBQcm9wZXJ0eSBwZXIgU2V0UHJvcCgpIGdlc2V0enQsIG11c3MgZGVyCisgICAgICAgIC8vIHVyc3BydWVuZ2xpY2hlIFdlcnQgZXJzdCByZXN0YXVyaWVydCB3ZXJkZW4uIAorICAgICAgICBpZiAoIG9sZHZhbFs0XSApeworICAgICAgICAgICAgaWYgKCBvbGR2YWxbMF0tPlF1ZXJ5KG9sZHZhbFsxXSwgRl9WQUxVRSkgPT0gb2xkdmFsWzNdICl7CisgICAgICAgICAgICBEQkcoICJBbHRlIFByb3BlcnR5IHBlciBTZXRQcm9wKCkgcmVzdGF1cmllcnQhXG4iICk7CisgICAgICAgICAgICBvbGR2YWxbMF0tPlNldFByb3AoIG9sZHZhbFsxXSwgb2xkdmFsWzJdICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gQW5zb25zdGVuIGVpbmZhY2ggZGllIEZfUVVFUlktIHVuZCBGX1NFVF9NRVRIT0QgbG9lc2NoZW4uCisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKCBvbGR2YWxbMF0tPlF1ZXJ5KCBvbGR2YWxbMV0sIEZfUVVFUllfTUVUSE9EICkgPT0gb2xkdmFsWzJdICl7CisgICAgICAgICAgICAgICAgb2xkdmFsWzBdLT5TZXQoIG9sZHZhbFsxXSwgMCwgRl9RVUVSWV9NRVRIT0QgKTsKKyAgICAgICAgICAgICAgICBEQkcoICJGX1FVRVJZX01FVEhPRCBlbnRmZXJudCFcbiIgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBvbGR2YWxbMF0tPlF1ZXJ5KCBvbGR2YWxbMV0sIEZfU0VUX01FVEhPRCApID09IG9sZHZhbFszXSApeworICAgICAgICAgICAgICAgIG9sZHZhbFswXS0+U2V0KCBvbGR2YWxbMV0sIDAsIEZfU0VUX01FVEhPRCApOworICAgICAgICAgICAgICAgIERCRyggIkZfU0VUX01FVEhPRCBlbnRmZXJudCFcbiIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZm9yICggbCA9IHNpemVvZihyZXNldF90aW1lcyk7IGwtLTsgKQorICAgICAgICAgICAgaWYgKCByZXNldF90aW1lc1tsXVsxXSA9PSBpbmRleCApeworICAgICAgICAgICAgICAgIHJlc2V0X3RpbWVzW2wuLmxdID0gKHt9KTsKKyAgICAgICAgICAgICAgICBEQkcoICJUaW1lci1FaW50cmFnIGVudGZlcm50IVxuIiApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgIH0KKworICAgIGlmICggdG0gPCAxMDAwMDAwICkKKyAgICAgICAgdG0gKz0gdGltZSgpOworCisgICAgaWYgKCB0bSA8IHRpbWUoKSApCisgICAgICAgIHJldHVybjsKKworICAgIGlmICggIXNwICl7CisgICAgICAgIC8vIERlZmF1bHQ6IEZfUVVFUllfTUVUSE9EIHNldHplbgorICAgICAgICBvbGR2YWwgPSBvYi0+U2V0KCBwcm9wLCBuZXd2YWwsICBGX1FVRVJZX01FVEhPRCApOworCisgICAgICAgIC8vIEZfU0VUX01FVEhPRCwgZGFtaXQgZGllIHRlbXBvcmFlcmUgUHJvcGVydHkga2VpbmVuIHp3aXNjaGVuemVpdGxpY2gKKyAgICAgICAgLy8gZ2VzZXR6dGVuIGFuZGVyZW4gV2VydCB3aWVkZXIgInJlc3RhdXJpZXJ0Ii4KKworICAgICAgICBhPXN5bWJvbF9mdW5jdGlvbigiUmVtb3ZlVG1wUHJvcCIsdGhpc19vYmplY3QoKSk7CisgICAgICAgIGI9c3ltYm9sX2Z1bmN0aW9uKCJTZXRQcm9wIixvYik7CisgICAgICAgIHRtcD1vYi0+U2V0KHByb3AsbGFtYmRhKCh7J3NldF92YWx1ZSwncHJvcF9uYW1lfSksKHsjJywsKHthLCdwcm9wX25hbWV9KSwoeyMncmV0dXJuLCh7YiwncHJvcF9uYW1lLCdzZXRfdmFsdWV9KX0pfSkpLEZfU0VUX01FVEhPRCk7CisgICAgfQorICAgIGVsc2V7CisgICAgICAgIC8vIEZ1ZXIgU3BlemlhbGZhZWxsZSAoUF9MSUdIVCB6LkIuKSB3aXJkIGRpZSBQcm9wZXJ0eSBkaXJla3QgbWl0CisgICAgICAgIC8vIFNldFByb3AoKSBnZXNldHp0IHVuZCBzcGFldGVyIG1pdCBkZW0gYWx0ZW4gV2VydCByZXN0YXVyaWVydC4KKyAgICAgICAgLy8gQWNodHVuZyAtIGV4dHJlbSBmZWhsZXJhbmZhZWxsaWcgdW5kIHdpcmtsaWNoIG51ciBmdWVyIFNwZXppYWxmYWVsbGUhCisKKyAgICAgICAgLy8gQWx0ZW4gV2VydCBtaXQgUXVlcnkoKSBzaWNoZXJuIGFuc3RhdHQgbWl0IFF1ZXJ5UHJvcCgpLCB1bSBuaWNodAorICAgICAgICAvLyBpcmdlbmR3ZWxjaGVuIEZfUVVFUllfTUVUSE9EcyBhdWYgZGVuIExlaW0genUgZ2VoZW4uCisgICAgICAgIG9sZHZhbCA9IG9iLT5RdWVyeSggcHJvcCwgRl9WQUxVRSApOworCisgICAgICAgIC8vIFJ1ZWNrZ2FiZXdlcnQgZGVzIFNldFByb3AoKSBzcGVpY2hlcm4sIHVtIHNwYWV0ZXIgZXJrZW5uZW4genUKKyAgICAgICAgLy8ga29lbm5lbiwgb2IgZGllIFByb3BlcnR5IHp3aXNjaGVuemVpdGxpY2ggdmVyYWVuZGVydCB3dXJkZS4KKyAgICAgICAgdG1wID0gb2ItPlNldFByb3AoIHByb3AsIG5ld3ZhbCApOworICAgIH0KKworICAgIGluX3Byb2dyZXNzW2luZGV4XSA9ICh7IG9iLCBwcm9wLCBvbGR2YWwsIHRtcCwgc3AgfSk7CisgICAgCisgICAgaWYgKCAhKG1heCA9IHNpemVvZihyZXNldF90aW1lcykpICkKKyAgICAgICAgcG9zID0gMDsKKyAgICBlbHNleworICAgICAgICBsID0gMDsKKyAgICAgICAgciA9IG1heCAtIDE7CisgICAgICAgIAorICAgICAgICB3aGlsZSAoIGwgPCByICl7CisgICAgICAgICAgICBwb3MgPSAobCArIHIpIC8gMjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCB0bSA8IHJlc2V0X3RpbWVzW3Bvc11bMF0gKQorICAgICAgICAgICAgICAgIHIgPSAtLXBvczsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBsID0gKytwb3M7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHdoaWxlICggcG9zID49IDAgJiYgcG9zIDwgbWF4ICYmIHRtIDwgcmVzZXRfdGltZXNbcG9zXVswXSApCisgICAgICAgICAgICBwb3MtLTsKKyAgICB9CisgICAgCisgICAgcmVzZXRfdGltZXMgPSByZXNldF90aW1lc1swLi5wb3NdICsgKHsgKHt0bSwgaW5kZXh9KSB9KQorICAgICAgICArIHJlc2V0X3RpbWVzW3BvcysxLi5dOworCisgICAgREJHKCBzcHJpbnRmKCJQcm9wZXJ0eSBhbiBTdGVsbGUgJU8gZWluZ2VmdWVndCFcbiIsIHBvcysxKSApOworCisgICAgY2FsbF9uZXh0X3VwZGF0ZSgpOworfQpkaWZmIC0tZ2l0IGEvcC9kYWVtb24vdHJhdmVsZC5jIGIvcC9kYWVtb24vdHJhdmVsZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0N2ZkMzgKLS0tIC9kZXYvbnVsbAorKysgYi9wL2RhZW1vbi90cmF2ZWxkLmMKQEAgLTAsMCArMSwyODUgQEAKKy8qKiBEb2t1OgorcHVibGljIGludCBBZGRSb3V0ZShzdHJpbmcgdHJhbnNwb3J0ZXIsIHN0cmluZyogbF9zdG9wcykKKyAgQmVzY2hyZWlidW5nOgorICAgIFNldHp0IGRpZSBha3R1ZWxsZSBSb3V0ZSBlaW5lcyBUcmFuc3BvcnRlcnMuCisgICAgRGllIFJvdXRlIGhpZXIgaXN0IGFsbGVyZGluZ3MgbnVyIGRpZSBMaXN0ZSB2b24gSGFsdGVwdW5rdGVuIC0gbmljaHQgZGVyCisgICAgUmVzdCwgZGVyIGluIGRlbiBSb3V0ZW4gaW4gZGVuIFRyYW5zcG9ydGVyIGFiZ2VsZWd0IGlzdC4KKyAgICBFaW5lIG5ldWUgUm91dGUgZXJzZXR6dCBpbW1lciBkaWUgYmlzaGVyaWdlIFJvdXRlCisgICAgV2lyZCB2b24gL3N0ZC90cmFuc3BvcnQgZ2VydWZlbiwgd2VubiBQX05PX1RSQVZFTElORyBuaWNodCBnZXNldHp0IGlzdC4KKyAgUnVlY2tnYWJld2VydGU6CisgICAgLSAxOiBUcmFuc3BvcnRlciB1bmQgSGFsdGVwdW5rdCBFaW5nZXRyYWdlbi4KKyAgICAtIDA6IFRyYW5zcG9ydGVyIG9kZXIgSGFsdGVwdW5rdCBrZWluIHN0cmluZ3xzdHJpbmcqLgorICAgIC0gLTE6IEVzIHd1cmRlIHZlcnN1Y2h0IGVpbmVuIFRyYW5zcG9ydGVyIGluIC9wLyBvZGVyIC9wbGF5ZXJzLworICAgICAgICAgIGVpbnp1dHJhZ2VuIAorICAgICAgICAgIHVuZCBkZXIgRWludHJhZ2VuZGUgaXN0IGtlaW4gRU0uCisKK3B1YmxpYyBpbnQgUmVtb3ZlVHJhbnNwb3J0ZXIoc3RyaW5nfG9iamVjdCB0cmFuc3BvcnRlcikKK3B1YmxpYyBpbnQgUmVtb3ZlU3RvcChzdHJpbmd8b2JqZWN0IHN0b3ApCisgIEJlc2NocmVpYnVuZzoKKyAgICBFbnRmZXJudCBlaW5lbiBrb21wbGV0dGVuIFRyYW5zcG9ydGVyIG9kZXIgZWluZW4gSGFsdGVwdW5rdCBhdXMgZGVtCisgICAgRGFlbW9uLgorICBSdWVja2dhYmV3ZXJ0ZToKKyAgICAtIDE6IEVyZm9sZy4KKyAgICAtIDA6IFRyYW5zcG9ydGVyfEhhbHRlcHVua3QgZXhpc3RpZXJ0IG5pY2h0LgorICAgIC0gLTE6IEtlaW5lIEJlcmVjaHRpZ3VuZy4KKworcHVibGljIHZhcmFyZ3MgaW50fG9iamVjdCogSGFzVHJhbnNwb3J0ZXIob2JqZWN0IHN0b3AsIHN0cmluZyB0cmFuc3BvcnRlcl9pZCkKKyAgQmVzY2hyZWlidW5nOgorICAgIEdpYnQgZWluZSBMaXN0ZSBkZXIgVHJhbnNwb3J0ZXIgYXVzLCBkZW4gZGVuIEhhbHRlcHVua3QgYW5sYXVmZW4sIG9kZXIKKyAgICBwcnVlZnQgYXVmIGVpbmVuIGJlc3RpbW10ZW4gVHJhbnNwb3J0ZXIuCisgIFJ1ZWNrZ2FiZXdlcnRlOgorICAgIC0gMDogSGFsdGVwdW5rdCBpc3Qga2VpbiBPYmpla3QsIGRlbSBIYWx0ZXB1bmt0IHNpbmQga2VpbmUgVHJhbnNwb3J0ZXIKKyAgICAgICAgIHp1Z2VvcmRuZXQsCisgICAgICAgICBkaWUgVHJhbnNwb3J0ZXIgc2luZCBuaWNodCBnZWxhZGVuCisgICAgICAgICBvZGVyLCBiZWkgYW5nYWJlIHZvbiA8dHJhbnNwb3J0ZXI+OiA8dHJhbnNwb3J0ZXI+IGZhZWhydCBkZW4gSGFmZW4KKyAgICAgICAgIG5pY2h0IGFuLgorICAgIC0gb2JqZWN0KjogTGlzdGUgbWl0IGVpbmVtIG9kZXIgbWVocmVyZW4gVHJhbnNwb3J0ZXJuLgorICBCZW1lcmt1bmc6CisgICAgQXVjaCBiZWkgZGVyIEFuZ2FiZSB2b24gPHRyYW5zcG9ydGVyX2lkPiBrb2VubmVuIG1laHJlcmUgT2JqZWt0ZQorICAgIHp1cnVlY2tnZWdlYmVuIHdlcmRlbiwgZXMgd2lyZCBtaXR0ZWxzIGlkKCkgZ2VmaWx0ZXJ0LgorCitwdWJsaWMgbWl4ZWQgUm91dGVFeGlzdHMob2JqZWN0IHRyYW5zcG9ydGVyLCBzdHJpbmcgZGVzdCkKKyAgQmVzY2hyZWlidW5nOgorICAgIFBydWVmdCBhdWYga29ycmVrdGUgUGFyYW1ldGVyIHVuZCBsZWl0ZXQgZGllIEFuZnJhZ2UgYW4KKyAgICAvc3RkL3RyYW5zcG9ydCB3ZWl0ZXIuCisgIFJ1ZWNrZ2FiZXdlcnRlOgorICAgIC0gMDogPHRyYW5zcG9ydGVyPiBpc3Qga2VpbiBPYmpla3Qgb2RlciA8ZGVzdD4gaXN0IGtlaW4gU3RyaW5nLgorICAgIC0gRGFzIEVyZ2VibmlzIHZvbiB0cmFuc3BvcnRlci0+SGFzUm91dGUoZGVzdCk7CisKK3B1YmxpYyBtYXBwaW5nIFF1ZXJ5VHJhbnNwb3J0ZXJzKCkKK3B1YmxpYyBtYXBwaW5nIFF1ZXJ5QWxsU3RvcHMoKSAKK3B1YmxpYyBtYXBwaW5nIFF1ZXJ5VHJhbnNwb3J0ZXJCeVN0b3Aoc3RyaW5nIHN0b3ApCitwdWJsaWMgbWFwcGluZyBRdWVyeVN0b3BzQnlUcmFuc3BvcnRlcihzdHJpbmcgdHJhbnNwb3J0ZXIpCisgIEJlc2NocmVpYnVuZzoKKyAgICBHaWJ0IGRhcyBqZXdpbGlnZSBnZWZpbHRlcnRlIG9kZXIgdW5nZWZpbHRlcnRlIE1hcHBpbmcgYXVzLgorICBSdWVja2dhYmV3ZXJ0ZToKKyAgICBNYXBwaW5nIG1pdCBkZW0gRXJnZWJuaXMuCisqLworCisjcHJhZ21hIHN0cm9uZ190eXBlcyxzYXZlX3R5cGVzLHJ0dF9jaGVja3MKKyNwcmFnbWEgcGVkYW50aWMscmFuZ2VfY2hlY2ssd2Fybl9kZXByZWNhdGVkCisjcHJhZ21hIHdhcm5fZW1wdHlfY2FzdHMsd2Fybl9taXNzaW5nX3JldHVybix3YXJuX2Z1bmN0aW9uX2luY29uc2lzdGVudAorI3ByYWdtYSBub19jbG9uZSxub19zaGFkb3cKKworI2luY2x1ZGUgPHRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPGRhZW1vbi5oPgorCisjZGVmaW5lIFRSQU5TUE9SVEVSIDAKKyNkZWZpbmUgU1RPUCAxCisKKyNkZWZpbmUgTUVNT1JZICIvc2VjdXJlL21lbW9yeSIKKworLy8gS2V5OiBzdHJpbmcgU2NoaWZmLgorLy8gVmFsdWUwOiBzdHJpbmcqIEhhZWZlbiwgZGllIHZvbiA8U2NoaWZmPiBhbmdlZmFocmVuIHdlcmRlbi4KK21hcHBpbmcgdHJhbnNwb3J0ZXJzID0gKFtdKTsKKy8vIEtleTogc3RyaW5nIEhhZmVuCisvLyBWYWx1ZTA6IHN0cmluZyogU2NoaWZmZSwgZGllIDxIYWZlbj4gYW5mYWhyZW4uCittYXBwaW5nIHN0b3BzID0gKFtdKTsKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgLy8gVm9tIE1FTU9SWSBkaWUgRGF0ZW4gYWJob2xlbi4KKyAgLy8gV2VubiBrZWluZSBkYSwgd2FyIHZlcm11dGxpY2ggUmVib290LCBkYW5uIG11ZXNzZW4gd2lyIHdhcnRlbiwgYmlzIGRpZQorICAvLyBUcmFuc3BvcnRlciBzaWNoIHdpZWRlciBtZWxkZW4uIEFiZXIgZGllIE1hcHBpbmdzIG11ZXNzZW4gaW5zIE1lbW9yeQorICAvLyBnZXNjaHJpZWJlbiB3ZXJkZW4uCisgIG1hcHBpbmcgdG1wID0gTUVNT1JZLT5Mb2FkKCJzdG9wcyIpOworICBpZiAobWFwcGluZ3AodG1wKSkKKyAgeworICAgIHN0b3BzID0gdG1wOworICB9CisgIGVsc2UKKyAgeworICAgIGlmIChNRU1PUlktPlNhdmUoInN0b3BzIixzdG9wcykgIT0gMSkKKyAgICAgIHJhaXNlX2Vycm9yKCJDb3VsZCBub3Qgc2F2ZSBtZW1vcnkgdG8gL3NlY3VyZS9tZW1vcnkuIik7CisgIH0KKyAgdG1wID0gTUVNT1JZLT5Mb2FkKCJ0cmFuc3BvcnRlcnMiKTsKKyAgaWYgKG1hcHBpbmdwKHRtcCkpCisgIHsKKyAgICB0cmFuc3BvcnRlcnMgPSB0bXA7CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYgKE1FTU9SWS0+U2F2ZSgidHJhbnNwb3J0ZXJzIix0cmFuc3BvcnRlcnMpICE9IDEpCisgICAgICByYWlzZV9lcnJvcigiQ291bGQgbm90IHNhdmUgbWVtb3J5IHRvIC9zZWN1cmUvbWVtb3J5LiIpOworICB9Cit9CisKK3ZhcmFyZ3MgaW50IHJlbW92ZShpbnQgcykKK3sKKyAgZGVzdHJ1Y3QodGhpc19vYmplY3QoKSk7CisgIHJldHVybiAxOworfQorCisvLyBMb2VzY2hmdW5rdGlvbgorcHJpdmF0ZSBpbnQgX3JlbW92ZV9kYXRhKHN0cmluZ3xvYmplY3Qga2V5LCBpbnQgd2hhdCkKK3sKKyAgbWFwcGluZyBmaXJzdCxzZWNvbmQ7CisgIC8vIEVyc3RtYWwgZGllIEFyYmVpdHNtYXBwaW5ncyBiZWZ1ZWxsZW4uCisgIGlmKHdoYXQ9PVRSQU5TUE9SVEVSKQorICB7CisgICAgZmlyc3Q9dHJhbnNwb3J0ZXJzOworICAgIHNlY29uZD1zdG9wczsKKyAgfQorICBlbHNlCisgIHsKKyAgICBmaXJzdD1zdG9wczsKKyAgICBzZWNvbmQ9dHJhbnNwb3J0ZXJzOworICB9CisKKyAgLy8gS2V5IGF1ZiBlaW5lbiBTdHJpbmcgbm9ybWFsaXNpZXJlbi4KKyAgaWYob2JqZWN0cChrZXkpKQorICB7CisgICAga2V5PW9iamVjdF9uYW1lKGtleSk7CisgIH0KKworICBpZighbWVtYmVyKGZpcnN0LGtleSkpCisgIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vIEVyc3RtYWwgYXVzIGRlbSBqZXdlaWxzIGFuZGVyZW4gTWFwcGluZyBhdXN0cmFnZW4uCisgIGZvcmVhY2goc3RyaW5nIHMgOiBmaXJzdFtrZXldKQorICB7CisgICAgLy8gTmljaHQgZXhpc3RlbnQgb2RlciBuaWNodCB6dWdlb3JkbmV0IC0+IHdlaXRlci4KKyAgICBpZighbWVtYmVyKHNlY29uZCxzKSB8fCBtZW1iZXIoc2Vjb25kW3NdLGtleSk9PS0xKQorICAgIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBzZWNvbmRbc10tPSh7a2V5fSk7CisgICAgaWYgKCFzaXplb2Yoc2Vjb25kW3NdKSkKKyAgICAgIG1fZGVsZXRlKHNlY29uZCxzKTsKKyAgfQorICAvLyBKZXR6dCBub2NoIGF1cyBkZW0gZWlnZW5lbiBNYXBwaW5nIGF1c3RyYWdlbi4KKyAgbV9kZWxldGUoZmlyc3Qsa2V5KTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIEVpbiBrb21wbGV0dGVzIFNjaGlmZiBlbnRmZXJuZW4uCitwdWJsaWMgaW50IFJlbW92ZVRyYW5zcG9ydGVyKG9iamVjdHxzdHJpbmcgdHJhbnNwb3J0ZXIpCit7CisgIGlmIChleHRlcm5fY2FsbCgpICYmICFJU19BUkNIKGdldHVpZChwcmV2aW91c19vYmplY3QoKSkpKSByZXR1cm4gLTE7CisgIHJldHVybiBfcmVtb3ZlX2RhdGEodHJhbnNwb3J0ZXIsVFJBTlNQT1JURVIpOworfQorCisvLyBFbnRmZXJudCBlaW5lbiBrb21wbGV0dGVuIEhhZmVuIGF1cyBkZW0gRGFlbW9uCitwdWJsaWMgaW50IFJlbW92ZVN0b3Aob2JqZWN0fHN0cmluZyBzdG9wKQoreworICBpZiAoZXh0ZXJuX2NhbGwoKSAmJiAhSVNfQVJDSChnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpKSkgcmV0dXJuIC0xOworICByZXR1cm4gX3JlbW92ZV9kYXRhKHN0b3AsU1RPUCk7Cit9CisKKy8vIFNldHp0IGRpZSBha3R1ZWxsZSBSb3V0ZSBlaW5lcyBUcmFuc3BvcnRlcnMuCisvLyBEaWUgUm91dGUgaGllciBpc3QgYWxsZXJkaW5ncyBudXIgZGllIExpc3RlIHZvbiBIYWx0ZXB1bmt0ZW4gLSBuaWNodCBkZXIKKy8vIFJlc3QsIGRlciBpbiBkZW4gUm91dGVuIGluIGRlbiBUcmFuc3BvcnRlciBhYmdlbGVndCBpc3QuCisvLyBXaXJkIHZvbiAvc3RkL3RyYW5zcG9ydCBnZXJ1ZmVuLCB3ZW5uIFBfTk9fVFJBVkVMSU5HIG5pY2h0IGdlc2V0enQgaXN0LgorcHVibGljIGludCBBZGRSb3V0ZShzdHJpbmcgdHJhbnNwb3J0ZXIsIHN0cmluZyogbF9zdG9wcykKK3sKKyAgaWYgKCFzdHJpbmdwKHRyYW5zcG9ydGVyKSB8fCAhcG9pbnRlcnAobF9zdG9wcykgfHwgIXNpemVvZihsX3N0b3BzKSkKKyAgICByZXR1cm4gMDsKKworICBpZiAoKHRyYW5zcG9ydGVyWzAuLjJdID09ICIvcC8iIHx8IHRyYW5zcG9ydGVyWzAuLjhdID09ICIvcGxheWVycy8iKQorICAgICAgJiYgIUlTX0FSQ0goZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKSkpIAorICB7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgLy8gRGFtaXQgc2luZCBhbGxlIEFiZnJhZ2VuIGF1ZiBmaW5kX29iamVjdCh0cmFuc3BvcnRlcnxzdG9wKSB1ZWJlcmZsdWVzc2lnLAorICAvLyBpbSBad2VpZmVsc2ZhbGwga25hbGx0IGVzIG5hZW1saWNoIGhpZXIuIDstKQorICB0cmFuc3BvcnRlciA9IG9iamVjdF9uYW1lKGxvYWRfb2JqZWN0KHRyYW5zcG9ydGVyKSk7CisKKyAgLy8gV2VubiBkaWUgcm91dGUgYmVyZWl0cyBleGlzdGllcnQsIGF1c3RyYWdlbi4gRGllcyBpc3Qgbm9ldGlnLCB3ZWlsIGRpZQorICAvLyBIYWx0ZXB1bmt0ZSBqYSBhdWNoIGJlcmVpbmlndCB3ZXJkZW4gbXVlc3Nlbi4KKyAgaWYgKG1lbWJlcih0cmFuc3BvcnRlcnMsIHRyYW5zcG9ydGVyKSkKKyAgICBSZW1vdmVUcmFuc3BvcnRlcih0cmFuc3BvcnRlcik7CisKKyAgLy8gVHJhbnNwb3J0ZXIgZWludHJhZ2VuLCBkaWUgUm91dGUgd2lyZCBkYWJlaSBpbW1lciB1ZWJlcnNjaHJpZWJlbiwgd2VubgorICAvLyBkZXIgVHJhbnNwb3J0ZXIgc2Nob24gYmVrYW5udCBpc3QuIFppZWw6IGhpZXIgaXN0IGltbWVyIGRpZSBha3R1ZWxsCisgIC8vIGtvbmZpZ3VyaWVydGUgUm91dGUgZHJpbi4KKyAgbV9hZGQodHJhbnNwb3J0ZXJzLCB0cmFuc3BvcnRlciwgbF9zdG9wcyk7CisKKyAgLy8gTmFjaCBvYmlnZW4gU2NoZW1hLCBudXIgZGllc21hbCBIYWx0ZXB1bmt0ZSB1bmQgenVnZWhvZXJpZ2UgU2NoaWZmZSAKKyAgLy8gZWludHJhZ2VuLgorICBmb3JlYWNoKHN0cmluZyBzdG9wIDogbF9zdG9wcykKKyAgeworICAgIGlmICghbWVtYmVyKHN0b3BzLHN0b3ApKQorICAgIHsKKyAgICAgIG1fYWRkKHN0b3BzLCBzdG9wLCAoe3RyYW5zcG9ydGVyfSkpOworICAgIH0KKyAgICBlbHNlIGlmIChtZW1iZXIoc3RvcHNbc3RvcF0sdHJhbnNwb3J0ZXIpID09IC0xKQorICAgIHsKKyAgICAgIHN0b3BzW3N0b3BdICs9ICh7IHRyYW5zcG9ydGVyIH0pOworICAgIH0KKyAgfQorICByZXR1cm4gMTsKKworfQorCisvLyBBYmZyYWdlIG9iIGVpbiBTY2hpZmYgZWluZW4gSGFmZW4gYW5mYWVocnQuCitwdWJsaWMgdmFyYXJncyBpbnR8b2JqZWN0KiBIYXNUcmFuc3BvcnRlcihvYmplY3Qgc3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0cmFuc3BvcnRlcl9pZCkKK3sKKyAgaWYgKCFvYmplY3RwKHN0b3ApKSByZXR1cm4gMDsKKworICA8c3RyaW5nfG9iamVjdD4qIHRyYW5zPXN0b3BzW29iamVjdF9uYW1lKHN0b3ApXTsKKyAgaWYgKCFwb2ludGVycCh0cmFucykpIHJldHVybiAwOworCisgIC8vIEVpZ2VudGxpY2ggc29sbHRlbiBzaWNoIFRyYW5zcG9ydGVyIG9yZGVudGxpY2ggYWJtZWxkZW4uLi4gQWJlciB6dXIKKyAgLy8gU2ljaGVyaGVpdCBkaWUgbmljaHQgZ2VmdW5kZW5lbiBPYmpla3RlIGF1c2ZpbHRlcm4uCisgIHRyYW5zID0gbWFwKHRyYW5zLCAjJ2ZpbmRfb2JqZWN0KSAtICh7MH0pOworCisgIC8vIFdlbm4gbmUgYmVzdGltbXRlIElEIGdlc3VjaHQgd2lyZCwgbnVyIGRpZXNlIFRyYW5zcG9ydGVyIGxpZWZlcm4uCisgIGlmIChzdHJpbmdwKHRyYW5zcG9ydGVyX2lkKSkKKyAgICB0cmFucyA9IGZpbHRlcl9vYmplY3RzKHRyYW5zLCAiaWQiLCB0cmFuc3BvcnRlcl9pZCk7CisKKyAgcmV0dXJuIHNpemVvZih0cmFucykgPyB0cmFucyA6IDA7Cit9CisKK3B1YmxpYyBtaXhlZCBSb3V0ZUV4aXN0cyhvYmplY3QgdHJhbnNwb3J0ZXIsIHN0cmluZyBkZXN0KQoreworICBpZiAoIW9iamVjdHAodHJhbnNwb3J0ZXIpIHx8ICFzdHJpbmdwKGRlc3QpKQorICB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIHRyYW5zcG9ydGVyLT5IYXNSb3V0ZShkZXN0KTsKK30KKworcHVibGljIG1hcHBpbmcgUXVlcnlUcmFuc3BvcnRlcnMoKQoreworICByZXR1cm4gZGVlcF9jb3B5KHRyYW5zcG9ydGVycyk7Cit9CisKK3B1YmxpYyBtYXBwaW5nIFF1ZXJ5QWxsU3RvcHMoKQoreworICByZXR1cm4gZGVlcF9jb3B5KHN0b3BzKTsKK30KKworLy8gTGllZmVydCBhbGxlIFRyYW5zcG9ydGVyIG1pdCBpaHJlbiBIYWx0ZXB1bmt0ZW4genVydWVjaywgZGllIGRpZXNlbiBIYWx0IGFuc3RldWVybi4KK3B1YmxpYyBtYXBwaW5nIFF1ZXJ5VHJhbnNwb3J0QnlTdG9wKHN0cmluZyBzdG9wKQoreworICBtYXBwaW5nIHJlcz1tX2FsbG9jYXRlKDQpOworICBmb3JlYWNoKHN0cmluZyBzLCBzdHJpbmcqIGFyciA6IHRyYW5zcG9ydGVycykKKyAgeworICAgIGlmKG1lbWJlcihhcnIsc3RvcCkhPS0xKQorICAgIHsKKyAgICAgIG1fYWRkKHJlcyxzLGFycik7CisgICAgfQorICB9CisgIHJldHVybiByZXM7Cit9CisKKy8vIExpZWZlcnQgYWxsZSBIYWx0ZXB1bmt0ZSBtaXQgaWhyZW4gVHJhbnNwb3J0ZXJuIHp1cnVlY2ssIGRpZSBkaWVzZXIKKy8vIHRyYW5zcG9ydGVyIGFuc3RldWVydC4KK3B1YmxpYyBtYXBwaW5nIFF1ZXJ5U3RvcHNCeVRyYW5zcG9ydGVyKHN0cmluZyB0cmFuc3BvcnRlcikKK3sKKyAgbWFwcGluZyByZXM9bV9hbGxvY2F0ZSg0KTsKKyAgZm9yZWFjaChzdHJpbmcgcywgc3RyaW5nKiBhcnIgOiBzdG9wcykKKyAgeworICAgIGlmKG1lbWJlcihhcnIsdHJhbnNwb3J0ZXIpIT0tMSkKKyAgICB7CisgICAgICBtX2FkZChyZXMscyxhcnIpOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzOworfQorCmRpZmYgLS1naXQgYS9wL2RhZW1vbi91cHRpbWVfbWFzdGVyLmMgYi9wL2RhZW1vbi91cHRpbWVfbWFzdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRhNzEyNAotLS0gL2Rldi9udWxsCisrKyBiL3AvZGFlbW9uL3VwdGltZV9tYXN0ZXIuYwpAQCAtMCwwICsxLDExMCBAQAorI3ByYWdtYSBzdHJvbmdfdHlwZXMsIHNhdmVfdHlwZXMKKyNwcmFnbWEgbm9fY2xvbmUsIG5vX3NoYWRvdworCisjaW5jbHVkZSAiL3AvZGFlbW9uL2NoLmgiCisjaW5jbHVkZSAiL3AvZGFlbW9uL3VwdGltZV9tYXN0ZXIuaCIKKworLy8vIFByb3RvdHlwZW4gLy8vCisKK3ZvaWQgY3JlYXRlKCk7Cit2b2lkIHJlc2V0KCk7IAorCit2b2lkIFNhdmVNYXhVcHRpbWUoKTsKK21hcHBpbmcgUXVlck1heFVwdGltZSgpOworCisvLy8gR2xvYmFsZSBWYXJpYWJsZW4gLy8vCitzdGF0aWMgaW50IG5leHRfc2F2ZV91cHRpbWU7CitzdGF0aWMgaW50IG1heF91cHRpbWVfcmVhY2hlZDsKK3N0YXRpYyBpbnQgbGFzdF9yZWNvcmRfYm9vdDsKKworLy8vIEZ1bmt0aW9uZW4gLy8vCisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgc2V0ZXVpZChnZXR1aWQodGhpc19vYmplY3QoKSkpOworICByZXNldCgpOworfQorCit2b2lkIHJlc2V0KCkKK3sKKyAgY2FsbF9vdXQoIlNhdmVNYXhVcHRpbWUiLDEpOworICBzZXRfbmV4dF9yZXNldCgzMDApOworfQorCisvLyBJc3QgZWluZSBSZWtvcmQtVXB0aW1lIGVycmVpY2h0LCB3aXJkIGRpZXNlIGhpZXIgZ2VzcGVpY2hlcnQuCit2b2lkIFNhdmVNYXhVcHRpbWUoKQoreworICBpbnQgbWF4X3NodXQsIG1heF9ib290OworICAKKyAgLy8gTG9obnQgZXMsIHNjaG9uIHdpZWRlciB6dSBwcnVlZmVuPworICBpZiAodGltZSgpPm5leHRfc2F2ZV91cHRpbWUpCisgIHsKKyAgICAvLyBJbml0aWFsaXNpZXJlbgorICAgIGlmIChuZXh0X3NhdmVfdXB0aW1lPT0wKQorICAgIHsKKyAgICAgIERFQlVHKCJNYXN0ZXJpbml0Iik7CisgICAgICAKKyAgICAgIC8vIFplaXQgYmVyZWNobmVuLCBhYiBkZXIgZWluIFJla29yZCBhdWZnZXN0ZWxsdCBpc3QuCisgICAgICAvLyBWb3JoZXIgYnJhdWNodCBuaXhodHMgbWVociBnZXBydWVmdCB3ZXJkZW4KKyAgICAgIHNzY2FuZihyZWFkX2ZpbGUoTUFYX1VQVElNRSl8fCIwIDAiLCIlZCAlZCIsbGFzdF9yZWNvcmRfYm9vdCwgbWF4X3NodXQpOworICAgICAgbmV4dF9zYXZlX3VwdGltZT1sYXN0X3JlYm9vdF90aW1lKCkrKG1heF9zaHV0LWxhc3RfcmVjb3JkX2Jvb3QpKzE7IAorICAgICAgCisgICAgfSBlbHNlIHsKKyAgICAgIERFQlVHKCJSZWtvcmQgbmV1IHNwZWljaGVybi4iKTsKKwkgICAgCisgICAgICAvLyBOZXVlbiBSZWtvcmQgaW4gRGF0ZWkgc2NocmVpYmVuLgorICAgICAgY2F0Y2gocm0oTUFYX1VQVElNRSk7cHVibGlzaCk7CisgICAgICB3cml0ZV9maWxlKE1BWF9VUFRJTUUsIGxhc3RfcmVib290X3RpbWUoKSsiICIrdGltZSgpKTsKKyAgICAgIAorICAgICAgLy8gSmV0enQgY2hlY2tlbiwgb2IgZGllIFVwdGltZSBncmFkZSBnZWtuYWNrdCB3dXJkZSAuLi4KKyAgICAgIC8vIFdlbm4gamEsIGRhbm4gZWluZSBNZWxkdW5nIGFuIGRlbiBNYXN0ZXIKKyAgICAgIGlmKGxhc3RfcmVib290X3RpbWUoKSE9bGFzdF9yZWNvcmRfYm9vdCkKKyAgICAgIHsKKwlERUJVRygiUmVrb3JkbWVsZHVuZy4gTUI6IitsYXN0X3JlY29yZF9ib290KyIgTFU6IitsYXN0X3JlYm9vdF90aW1lKCkpOworCisJLy8gTnVyIGVpbm1hbCBwcm8gUmVrb3JkIFVwdGltZSBtZWxkZW4gLi4uCisJbGFzdF9yZWNvcmRfYm9vdD1sYXN0X3JlYm9vdF90aW1lKCk7CisKKwkvLyBIdXJyYWFhaCA6KQorICAgICAgICBDSE1BU1RFUi0+am9pbihSRUNPUkRfQ0hBTk5FTCx0aGlzX29iamVjdCgpKTsKKwlDSE1BU1RFUi0+c2VuZChSRUNPUkRfQ0hBTk5FTCx0aGlzX29iamVjdCgpLAorCSJbPE1hc3RlUj46TGFyc10gV293LCBlaW5lIFJla29yZC1VcHRpbWUuXG4iCisJIls8TWFzdGVSPjpNZXJsaW5dIERhcyBlcmxlYnQgbWFuIGF1Y2ggbmljaHQgYWxsZSBUYWdlIC4uLlxuIgorCSJbPE1hc3RlUj46RGVyIEdhbWVEcml2ZXJdIERhbm4gd2lyZCBlcyB3b2hsIFplaXQgZnVlciBlaW5lbiBSZWJvb3QsIG9kZXI/XG4iCisJIls8TWFzdGVSPjpNZXJsaW5dIEZhdWxlcyBTdHVlY2ssIGFyYmVpdGUgd2VpdGVyIVxuIgorCSJbPE1hc3RlUj46RGVyIEdhbWVEcml2ZXJdIE9jaCBtZW5ubyEiLAorCSAgTVNHX0VNUFRZKTsKKwlDSE1BU1RFUi0+bGVhdmUoUkVDT1JEX0NIQU5ORUwsdGhpc19vYmplY3QoKSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8vIEdpYnQgRGF0ZW4genVyIGJpc2hlciBtYXhpbWFsZW4gVXB0aW1lIHp1cnVlY2s6ICgyOTkgVGlja3MpCisvLyAxLikgV2FubiB3dXJkZSBnZWJvb3RldAorLy8gMi4pIFdhbm4gZW5kZXRlIGRpZSBVcHRpbWUKKy8vIDMuKSBXYW5uIHdpcmQgZGllc2VyIFJla29yZCBnZWJyb2NoZW4/CisvLyA0LikgRGF1ZXIgZGVyIFVwdGltZSBhbHMgbGVzYmFyZXIgU3RyaW5nLgorbWFwcGluZyBRdWVyeU1heFVwdGltZSgpCit7CisgIGludCB0LCB0bXAsIG1heF9ib290LCBtYXhfc2h1dDsKKyAgc3RyaW5nIHM7CisKKyAgc3NjYW5mKHJlYWRfZmlsZShNQVhfVVBUSU1FKXx8IjAgMCIsIiVkICVkIixtYXhfYm9vdCwgbWF4X3NodXQpOworCisgIHQ9bWF4X3NodXQtbWF4X2Jvb3Q7CisKKyAgcz0iIjsKKyAgaWYgKHQ+PTg2NDAwKQorICAgIHMrPXNwcmludGYoIiVkIFRhZyVzLCAiLHRtcD10Lzg2NDAwLCh0bXA9PTE/IiI6ImUiKSk7CisgIGlmICh0Pj0zNjAwKQorICAgIHMrPXNwcmludGYoIiVkIFN0dW5kZSVzLCAiLHRtcD0odD10JTg2NDAwKS8zNjAwLCh0bXA9PTE/IiI6Im4iKSk7CisgIGlmICh0PjYwKQorICAgIHMrPXNwcmludGYoIiVkIE1pbnV0ZSVzIHVuZCAiLHRtcD0odD10JTM2MDApLzYwLCh0bXA9PTE/IiI6Im4iKSk7CisgIHMrPXNwcmludGYoIiVkIFNla3VuZGUlcyIsdD10JTYwLCh0PT0xPyIiOiJuIikpOworCisgIHJldHVybiAoWyJiZWdpbm4iOm1heF9ib290LCAKKyAgICAgICAgICAgImVuZGUiOm1heF9zaHV0LCAKKwkgICAibmFlY2hzdGVyIHJla29yZCI6bGFzdF9yZWJvb3RfdGltZSgpKyhtYXhfc2h1dC1tYXhfYm9vdCksIAorCSAgICJyZWtvcmQgYWxzIHN0cmluZyI6c10pOworfQpkaWZmIC0tZ2l0IGEvcC9kYWVtb24vdXB0aW1lX21hc3Rlci5oIGIvcC9kYWVtb24vdXB0aW1lX21hc3Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MmU0NGEKLS0tIC9kZXYvbnVsbAorKysgYi9wL2RhZW1vbi91cHRpbWVfbWFzdGVyLmgKQEAgLTAsMCArMSwxNCBAQAorI2lmbmRlZiBfX1VQVElNRV9NQVNURVJfXworI2RlZmluZSBfX1VQVElNRV9NQVNURVJfXworCisjZGVmaW5lIFVQVElNRV9NQVNURVIgICIvcC9kYWVtb24vdXB0aW1lX21hc3RlciIKKyNkZWZpbmUgTUFYX1VQVElNRSAgICAgIi9wL2RhZW1vbi9zYXZlL21heHVwdGltZSIKKyNkZWZpbmUgUkVDT1JEX0NIQU5ORUwgIjxNYXN0ZVI+IgorCisjZGVmaW5lIERFQlVHKHgpCisvKgorI2RlZmluZSBERUJVRyh4KSBpZihmaW5kX3BsYXllcigidmFuaW9uIikpIHRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJ2YW5pb24iKSxcCisJCSAgICAgICAgICAgICAgICAiVVBUSU1FOiAiK3grIlxuIik7CisqLworCisjZW5kaWYgLyogX19VUFRJTUVfTUFTVEVSX18gKi8KZGlmZiAtLWdpdCBhL3AvZGFlbW9uL3plbnRyYWxiYW5rLmMgYi9wL2RhZW1vbi96ZW50cmFsYmFuay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMDc0ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9wL2RhZW1vbi96ZW50cmFsYmFuay5jCkBAIC0wLDAgKzEsMjM2IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gemVudHJhbGJhbmsuYyAtLSBaZW50cmFsZSBHZWxkLVZlcndhbHR1bmcgZGVyIEhhZW5kbGVyIGltIE1HCisvLyAkSWQ6IHplbnRyYWxiYW5rLmMgOTIyMyAyMDE1LTA1LTI3IDIxOjQ2OjU4WiBaZXNzdHJhICQKKy8vCisvKgorICogJExvZzogemVudHJhbGJhbmsuYyx2ICQKKyAqIFJldmlzaW9uIDEuNSAgMjAwMy8xMi8zMCAxMToxNzozNCAgVmFuaW9uCisgKiBxdWVyeV9wcmV2ZW50X3NoYWRvdyBmZWhsdGUuIERhbmtlIGZ1ZXIgZGVuIEhpbndlaXMgYW4gT2dvLgorICoKKyAqIFJldmlzaW9uIDEuNCAgMjAwMy8xMi8zMCAxMToxMjowMiAgSm9mCisgKiBJY2ggaGFiIERpciBkYXMgRmlsZSBtYWwgZ2VrbGF1dC4KKyAqIFZhbmlvbgorICoKKyAqIFJldmlzaW9uIDEuMyAgMTk5NS8wNy8xMCAgMDc6MzE6MDQgIEpvZgorICogdHlwbyBmaXhlZAorICoKKyAqIFJldmlzaW9uIDEuMiAgMTk5NS8wNy8xMCAgMDc6Mjc6NTkgIEpvZgorICogVXNlIGJhbmsuaAorICogX3F1ZXJ5X2N1cnJlbnRfbW9uZXkKKyAqCisgKiBSZXZpc2lvbiAxLjEgIDE5OTUvMDcvMDUgIDE2OjI5OjI2ICBKb2YKKyAqIEluaXRpYWwgcmV2aXNpb24KKyAqCisgKi8KKyNwcmFnbWEgbm9fc2hhZG93CisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIG5vX2luaGVyaXQKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHNhdmVfdHlwZXMKKworI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtb25leS5oPgorCisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPGJhbmsuaD4KKworI2RlZmluZSBUSU1FIHN0cmZ0aW1lKCIlSDolTSIsdGltZSgpKQorI2RlZmluZSBMUyAxMDAwMDAwCisKK2ludCBhbGxtb25leSxiYW5rX2RlZmF1bHRfcGVyY2VudCxzdG9yZV9kZWZhdWx0X3BlcmNlbnQsc2hvcF9kZWZhdWx0X3BlcmNlbnQ7CitpbnQgZmFsbGluZzsKKy8vIEdlbGRtZW5nZW46IGluIE5QQywgaW4gQm9lcnNlbiwgcnVtbGllZ2VuLCBhdWYgU2VoZXJrYXJ0ZW4sIEdlc2FtdHN1bW1lLAorLy8gWmVpdHB1bmt0IGRlciBCZXJlY2hudW5nLgoraW50ICpzdW1tZW4gPSAoezAsMCwwLDAsMCwwfSk7CisKK25vc2F2ZSBpbnQgbGFzdF9zYXZlOworbm9zYXZlIGludCBjb3VudGVyOworCit2b2lkIHNhdmVfbWUoKQoreworICBzYXZlX29iamVjdCgiL3AvZGFlbW9uL3NhdmUvemVudHJhbGJhbmsiKTsKKyAgbGFzdF9zYXZlPXRpbWUoKTsKK30KKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgc2V0ZXVpZChnZXR1aWQoKSk7CisgIGFsbG1vbmV5PTUwMDAwMDsKKyAgYmFua19kZWZhdWx0X3BlcmNlbnQ9QkFOS19ERUZBVUxUX1BFUkNFTlQ7CisgIHN0b3JlX2RlZmF1bHRfcGVyY2VudD1TVE9SRV9QRVJDRU5UX0xFRlQ7CisgIHNob3BfZGVmYXVsdF9wZXJjZW50PVNIT1BfUEVSQ0VOVF9MRUZUOworICByZXN0b3JlX29iamVjdCgiL3AvZGFlbW9uL3NhdmUvemVudHJhbGJhbmsiKTsKK30KKworcHJpdmF0ZSB2b2lkIGFkanVzdF9wZXJjZW50cygpCit7CisgIGlmIChhbGxtb25leTw1MDAwMCAgICYmIGZhbGxpbmc+PTApIGZhbGxpbmc9LTE7CisgIGlmIChhbGxtb25leT4xMDAwMDAwICYmIGZhbGxpbmc8PTApIGZhbGxpbmc9MTsKKyAgaWYgKGFsbG1vbmV5PDIwMDAwMCAmJiBmYWxsaW5nPjAgKSBmYWxsaW5nPTA7CisgIGlmIChhbGxtb25leT44MDAwMCAgJiYgZmFsbGluZzwwICkgZmFsbGluZz0wOworICBpZiAoZmFsbGluZzwwICYmICEoKCsrY291bnRlciklNSkpCisgIHsKKyAgICBiYW5rX2RlZmF1bHRfcGVyY2VudD1iYW5rX2RlZmF1bHRfcGVyY2VudCtyYW5kb20oMykrMTsKKyAgICBzdG9yZV9kZWZhdWx0X3BlcmNlbnQ9c3RvcmVfZGVmYXVsdF9wZXJjZW50K3JhbmRvbSgzKSsxOworICAgIHNob3BfZGVmYXVsdF9wZXJjZW50PXNob3BfZGVmYXVsdF9wZXJjZW50K3JhbmRvbSgzKSsxOworICAgIGxvZ19maWxlKCJaRU5UUkFMQkFOSyIsCisJc3ByaW50ZigiJXM6IFBFUkNFTlRTIFNFVCBUTyBCQU5LICVkIFNUT1JFICVkIFNIT1AgJWRcbiIsCisJICBUSU1FLGJhbmtfZGVmYXVsdF9wZXJjZW50LHN0b3JlX2RlZmF1bHRfcGVyY2VudCwKKwkgIHNob3BfZGVmYXVsdF9wZXJjZW50KSxMUyk7CisgIH0KKyAgaWYgKGZhbGxpbmc+MCkKKyAgeworICAgIGJhbmtfZGVmYXVsdF9wZXJjZW50Lz0yOworICAgIHN0b3JlX2RlZmF1bHRfcGVyY2VudC89MjsKKyAgICBzaG9wX2RlZmF1bHRfcGVyY2VudC89MjsKKyAgICBsb2dfZmlsZSgiWkVOVFJBTEJBTksiLAorCXNwcmludGYoIiVzOiBQRVJDRU5UUyBTRVQgVE8gQkFOSyAlZCBTVE9SRSAlZCBTSE9QICVkXG4iLAorCSAgVElNRSxiYW5rX2RlZmF1bHRfcGVyY2VudCxzdG9yZV9kZWZhdWx0X3BlcmNlbnQsCisJICBzaG9wX2RlZmF1bHRfcGVyY2VudCksTFMpOworICB9CisgIGlmIChiYW5rX2RlZmF1bHRfcGVyY2VudDwxKSBiYW5rX2RlZmF1bHRfcGVyY2VudD0xOworICBpZiAoYmFua19kZWZhdWx0X3BlcmNlbnQ+OTApIGJhbmtfZGVmYXVsdF9wZXJjZW50PTkwOworICBpZiAoc3RvcmVfZGVmYXVsdF9wZXJjZW50PDEpIHN0b3JlX2RlZmF1bHRfcGVyY2VudD0xOworICBpZiAoc3RvcmVfZGVmYXVsdF9wZXJjZW50PjkwKSBzdG9yZV9kZWZhdWx0X3BlcmNlbnQ9OTA7CisgIGlmIChzaG9wX2RlZmF1bHRfcGVyY2VudDwxKSBzaG9wX2RlZmF1bHRfcGVyY2VudD0xOworICBpZiAoc2hvcF9kZWZhdWx0X3BlcmNlbnQ+OTApIHNob3BfZGVmYXVsdF9wZXJjZW50PTkwOworICBzYXZlX21lKCk7Cit9CisKK3ZvaWQgcmVzZXQoKQoreworICBhZGp1c3RfcGVyY2VudHMoKTsKK30KKworcHJpdmF0ZSB2b2lkIHJlYWxfbG9nKCkKK3sKKyAgbG9nX2ZpbGUoIlpCQU5LU1RBVFVTIixzcHJpbnRmKCIlczogJWRcbiIsZHRpbWUodGltZSgpKSxhbGxtb25leSksTFMpOworfQorCitwcml2YXRlIHZvaWQgbG9nX3N0YXRlKCkKK3sKKyAgLy8gbnVyIGFsbGUgMTVtaW4gbmVuIFN0YXR1cy1Mb2dlaW50cmFnLiBSZWljaHQgdm9lbGxpZy4KKyAgaWYgKGZpbmRfY2FsbF9vdXQoIydyZWFsX2xvZykgPT0gLTEpCisgICAgY2FsbF9vdXQoIydyZWFsX2xvZyw5MDApOworfQorCitwdWJsaWMgdmFyYXJncyB2b2lkIFBheUluKGludCBhbW91bnQsIGludCBwZXJjZW50KQoreworICBpZiAoYW1vdW50PD0wKSByZXR1cm47CisgIHBlcmNlbnR8PWJhbmtfZGVmYXVsdF9wZXJjZW50OworICBhbGxtb25leSs9YW1vdW50KnBlcmNlbnQvMTAwOworICBsb2dfZmlsZSgiWkVOVFJBTEJBTksiLAorICAgICAgc3ByaW50ZigiJXM6IEVpbnphaGx1bmc6ICVkICglZCBicnV0dG8pIHZvbiAlT1xuIiwKKwlUSU1FLGFtb3VudCpwZXJjZW50LzEwMCxhbW91bnQscHJldmlvdXNfb2JqZWN0KCkpLExTKTsKKyAgbG9nX3N0YXRlKCk7Cit9CisKK3B1YmxpYyBpbnQgV2l0aERyYXcoaW50IGFtb3VudCkKK3sKKyAgaW50IGdvdDsKKworICBpZiAoYW1vdW50PD0wKSByZXR1cm4gMDsKKyAgaWYgKGFsbG1vbmV5PDApIGFsbG1vbmV5PTA7CisgIGlmICghYWxsbW9uZXkpCisgICAgZ290PTA7CisgIGVsc2UKKyAgeworICAgIGlmIChhbW91bnQqMzxhbGxtb25leSkKKyAgICAgIGdvdD1hbW91bnQ7CisgICAgZWxzZQorICAgIHsKKyAgICAgIGdvdD1hbGxtb25leS8zOworICAgICAgaWYgKCFnb3QpIGdvdD0xOworICAgIH0KKyAgICBhbGxtb25leS09Z290OworICB9CisgIGxvZ19maWxlKCJaRU5UUkFMQkFOSyIsc3ByaW50ZigiJXM6IEFiaGVidW5nOiAlNmQvJTZkIHZvbiAlT1xuIiwKKwlUSU1FLGdvdCwgYW1vdW50LHByZXZpb3VzX29iamVjdCgpKSxMUyk7CisgIGxvZ19zdGF0ZSgpOworICByZXR1cm4gZ290OworfQorCitpbnQgX3F1ZXJ5X2N1cnJlbnRfbW9uZXkoKQoreworICByZXR1cm4gYWxsbW9uZXk7Cit9CisKK2ludCBfcXVlcnlfYmFua19kZWZhdWx0X3BlcmNlbnQoKQoreworICByZXR1cm4gYmFua19kZWZhdWx0X3BlcmNlbnQ7Cit9CisKK2ludCBfcXVlcnlfc2hvcF9wZXJjZW50X2xlZnQoKQoreworICByZXR1cm4gc2hvcF9kZWZhdWx0X3BlcmNlbnQ7Cit9CisKK2ludCBfcXVlcnlfc3RvcmVfcGVyY2VudF9sZWZ0KCkKK3sKKyAgcmV0dXJuIHN0b3JlX2RlZmF1bHRfcGVyY2VudDsKK30KKworLy8gR2VsZG1lbmdlIGltIFNwaWVsCitwdWJsaWMgaW50ICpnZWxkbWVuZ2UoKSB7CisgIAorICBpZiAoc3VtbWVuWzVdID4gdGltZSgpLTM2MDAgfHwgIUlTX0VMREVSKHRoaXNfcGxheWVyKCkpKQorICAgICAgcmV0dXJuIHN1bW1lbjsKKworICBzdW1tZW4gPSBhbGxvY2F0ZSg2KTsKKyAgb2JqZWN0ICpnZWxkID0gY2xvbmVzKEdFTEQsMik7CisgIGZvcmVhY2gob2JqZWN0IG9iOiBnZWxkKSB7CisgICAgaWYgKCFlbnZpcm9ubWVudChvYikgfHwgSVNfTEVBUk5FUihlbnZpcm9ubWVudChvYikpKQorICAgICAgY29udGludWU7CisgICAgaWYgKGVudmlyb25tZW50KG9iKS0+UXVlcnlQcm9wKFBfTlBDKSkKKyAgICAgIC8vIGluIE5QQworICAgICAgc3VtbWVuWzBdKz1vYi0+UXVlcnlQcm9wKFBfQU1PVU5UKTsKKyAgICBlbHNlIGlmIChsb2FkX25hbWUoZW52aXJvbm1lbnQob2IpKSA9PSBCT0VSU0UpCisgICAgICAvLyBpbiBib2Vyc2VuCisgICAgICBzdW1tZW5bMV0rPW9iLT5RdWVyeVByb3AoUF9BTU9VTlQpOworICAgIGVsc2UKKyAgICAgIC8vIHNvbnN0IHJ1bWxpZWdlbmQKKyAgICAgIHN1bW1lblsyXSs9b2ItPlF1ZXJ5UHJvcChQX0FNT1VOVCk7CisgIH0KKyAgLy8gU2VoZXJrYXJ0ZW4KKyAgZ2VsZCA9IGNsb25lcyhTRUhFUktBUlRFLDIpOworICBtYXBwaW5nIGNhcmRzPW1fYWxsb2NhdGUoc2l6ZW9mKGdlbGQpLDEpOworICBmb3JlYWNoKG9iamVjdCBvYjogZ2VsZCkgeworICAgIGNhcmRzW29iLT5xdWVyeV9vd25lcigpXSA9IG9iLT5RdWVyeVByb3AoUF9BTU9VTlQpOworICB9CisgIGZvcmVhY2goc3RyaW5nIG93bmVyLCBpbnQgYW1vdW50OiBjYXJkcykKKyAgICBzdW1tZW5bM10rPWFtb3VudDsKKyAgc3VtbWVuWzRdPXN1bW1lblswXStzdW1tZW5bMV0rc3VtbWVuWzJdK3N1bW1lblszXTsKKyAgc3VtbWVuWzVdPXRpbWUoKTsKKyAgcmV0dXJuIHN1bW1lbjsKK30KKworcHVibGljIHZvaWQgUHJpbnRHZWxkbWVuZ2UoKSB7CisgIGludCAqc3VtID0gZ2VsZG1lbmdlKCk7CisgIHByaW50ZigiTlBDOiAlZFxuIgorICAgICAgICAgIkJvZXJzZW46ICVkXG4iCisgICAgICAgICAicnVtbGllZ2VuZDogJWRcbiIKKyAgICAgICAgICJTZWhlcmthcnRlbjogJWRcbiIKKyAgICAgICAgICJHZXNhbXQ6ICVkXG4iCisgICAgICAgICAiWmVpdDogJXNcbiIsCisgICAgICAgICBzdW1bMF0sc3VtWzFdLHN1bVsyXSxzdW1bM10sc3VtWzRdLHN0cmZ0aW1lKHN1bVs1XSkpOworfQorCit2b2lkIHNldF9wZXJjZW50cyhpbnQgc3RvcmUsaW50IHNob3AsaW50IGJhbmspCit7CisgIHN0b3JlX2RlZmF1bHRfcGVyY2VudD1zdG9yZTsKKyAgc2hvcF9kZWZhdWx0X3BlcmNlbnQ9c2hvcDsKKyAgYmFua19kZWZhdWx0X3BlcmNlbnQ9YmFuazsgCisgIGxvZ19maWxlKCJaRU5UUkFMQkFOSyIsCisgICAgICBzcHJpbnRmKCIlczogUEVSQ0VOVFMgU0VUIFRPIEJBTksgJWQgU1RPUkUgJWQgU0hPUCAlZFxuIiwKKwlUSU1FLGJhbmtfZGVmYXVsdF9wZXJjZW50LHN0b3JlX2RlZmF1bHRfcGVyY2VudCwKKwlzaG9wX2RlZmF1bHRfcGVyY2VudCksTFMpOworfQorCitpbnQgcmVtb3ZlKCkKK3sKKyAgc2F2ZV9tZSgpOworICBkZXN0cnVjdCh0aGlzX29iamVjdCgpKTsKKyAgcmV0dXJuIDE7Cit9CisgICAKZGlmZiAtLWdpdCBhL3Jvb20vY2h1cmNoLmMgYi9yb29tL2NodXJjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MzliMjMKLS0tIC9kZXYvbnVsbAorKysgYi9yb29tL2NodXJjaC5jCkBAIC0wLDAgKzEsNDEgQEAKK2luaGVyaXQgIi9zdGQvcm9vbSI7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisKK2NyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9MSUdIVCwxKTsKKyAgU2V0UHJvcChQX0lOVF9TSE9SVCwiVmlsbGFnZSBjaHVyY2giKTsKKyAgU2V0UHJvcChQX0lOVF9MT05HLAorICAgIllvdSBhcmUgaW4gdGhlIGxvY2FsIHZpbGxhZ2UgY2h1cmNoLlxuVGhlcmUgaXMgYSBodWdlIHBpdCBpbiB0aGUgY2VudGVyLFxuIiArCisJICJhbmQgYSBkb29yIGluIHRoZSB3ZXN0IHdhbGwuIFRoZXJlIGlzIGEgYnV0dG9uIGJlc2lkZSB0aGUgZG9vci5cbiIrCisgICAiVGhpcyBjaHVyY2ggaGFzIHRoZSBzZXJ2aWNlIG9mIHJldml2aW5nIGdob3N0cy4gRGVhZCBwZW9wbGUgY29tZVxuIisKKyAgICJ0byB0aGUgY2h1cmNoIGFuZCBwcmF5LlxuIisKKyAgICJUaGVyZSBpcyBhIGNsb2NrIG9uIHRoZSB3YWxsLlxuIisKKyAgICJUaGVyZSBpcyBhbiBleGl0IHRvIHNvdXRoLlxuIik7CisgIEFkZERldGFpbCgicGl0IiwiSW4gdGhlIG1pZGRsZSBvZiB0aGUgY2h1cmNoIGlzIGEgZGVlcCBwaXQuXG4iKworICAgICAgICAiSXQgd2FzIHVzZWQgZm9yIHNhY3JpZmljZSBpbiB0aGUgb2xkIHRpbWVzLCBidXQgbm93YWRheXNcbiIgKworICAgICAgICAiaXQgaXMgb25seSBsZWZ0IGZvciB0b3VyaXN0cyB0byBsb29rIGF0LlxuIik7CisgIEFkZERldGFpbCgoeyJlbGV2YXRvciIsImRvb3IiLCJidXR0b24ifSksCisgICAgICAgICAgICAiVGhlIGVsZXZhdG9yIGRvZXNuJ3Qgd29yayBhbnkgbW9yZS4gSXQgbXVzdCBiZSBhIHJlbGljdCBmcm9tIGFub3RoZXIgdGltZSxcbiIrCisgICAgICAgICAgICAiYSBsb25nLWdvbmUgdGltZSwgYXMgdGhpcyB3aG9sZSBidWlsZGluZy5cbiIpOworICBBZGREZXRhaWwoImNsb2NrIiwiVGhlIGNsb2NrIHNob3dzIHRoaXMgZ2FtZSBoYXNuJ3QgYmVlbiByZWJvb3RlZCBmb3IgY2VudHVyaWVzLiBUaW1lIGlzXG4iKworICAgICAgICAgICAgICAgICAgICAic3RhbmRpbmcgc3RpbGwgaW4gdGhpcyBzdHJhbmdlIHJvb20uXG4iKTsKKyAgQWRkQ21kKCJwcmF5IiwicHJheSIpOworICBBZGRDbWQoIm9wZW4iLCJvcGVuIik7CisgIEFkZENtZCgicHVzaCIsIm9wZW4iKTsKK30KKworb3BlbigpCit7CisgIG5vdGlmeV9mYWlsKCJUaGUgZWxldmF0b3IgZG9lc24ndCB3b3JrIGFueW1vcmUsIHNvcnJ5LlxuIik7CisgIHJldHVybiAwOworfQorCitwcmF5KCkKK3sKKyAgd3JpdGUoIlRoZSBnb2RzIHRoaXMgY2h1cmNoIHdhcyBidWlsdCBmb3IgaGF2ZSBkaWVkIGFuIGV4dHJlbWx5IGxvbmcgdGltZSBhZ28uXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL3Jvb20vZGVhdGgvZGVhdGhfbWFyay5jIGIvcm9vbS9kZWF0aC9kZWF0aF9tYXJrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIxOTAxNgotLS0gL2Rldi9udWxsCisrKyBiL3Jvb20vZGVhdGgvZGVhdGhfbWFyay5jCkBAIC0wLDAgKzEsNjcgQEAKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisKKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKworaW5oZXJpdCAic3RkL3RoaW5nIjsKKwordm9pZCBjcmVhdGUoKQoreworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKCBQX05BTUUsICJTdGVtcGVsIGRlcyBUb2RlcyIgKTsKKyAgU2V0UHJvcCggUF9HRU5ERVIsIE1BTEUgKTsKKyAgU2V0UHJvcCggUF9TSE9SVCwgMCApOworICBTZXRQcm9wKCBQX0lOVklTLCAxICk7CisgIFNldFByb3AoIFBfTkVWRVJEUk9QLCAxICk7CisgIFNldFByb3AoIFBfV0VJR0hULCAwKTsKKyAgQWRkSWQoKHsiZGVhdGhfbWFyayIsIlxuZGVhdGhfbWFyayJ9KSk7Cit9CisKK3ZvaWQgcmVzZXQoKQoreworICA6OnJlc2V0KCk7CisgIGlmIChlbnZpcm9ubWVudCgpICYmICFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKGVudmlyb25tZW50KCkpKQorICAgIHJlbW92ZSgpOworfQorCisKKy8qCisgKiBGdW5jdGlvbiBuYW1lOiBzdGFydF9kZWF0aAorICogRGVzY3JpcHRpb246ICAgU3RhcnQgdGhlIGRlYXRoIHNlcXVlbmNlLgorICovCit2b2lkIHN0YXJ0X2RlYXRoKCkKK3sKKyAgaWYgKCAhZW52aXJvbm1lbnQoKSB8fCAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShlbnZpcm9ubWVudCgpKQorICAgICAgIHx8ICFlbnZpcm9ubWVudCgpLT5RdWVyeVByb3AoUF9HSE9TVCkgKQorICB7CisgICAgICBkZXN0cnVjdCh0aGlzX29iamVjdCgpKTsKKyAgICAgIHJldHVybjsKKyAgfQorCisgIHNheSgiRHUgc2llaHN0IGVpbmUgZHVua2xlIEdlc3RhbHQsIGRpZSBldHdhcyBEdW5zdCBlaW5zYW1tZWx0IC4uLiBvZGVyIHZpZWxsZWljaHRcbiIrCisgICAgICAiYmlsZGVzdCBkdSBEaXIgZGFzIGF1Y2ggbnVyIGVpbiAuLi5cbiIpOworIGVudmlyb25tZW50KCktPm1vdmUoIi9yb29tL2RlYXRoL3ZpcnR1YWwvZGVhdGhfcm9vbV8iK2dldHVpZChlbnZpcm9ubWVudCgpKSwKKwkJICAgICBNX0dPfE1fU0lMRU5UfE1fTk9fU0hPV3xNX05PQ0hFQ0spOworIC8vIGRpcmVrdCBpbiB2aXJ0dWVsbGVuIFRvZGVzcmF1bSBtb3ZlbgorfQorCitwcm90ZWN0ZWQgaW50IFByZXZlbnRNb3ZlKG9iamVjdCBkZXN0LCBvYmplY3Qgb2xkZW52LCBpbnQgbWV0aG9kKSB7CisgIC8vIHdlbm4gZGllIG1hcmtlIHNjaG9uIGVpbiBFbnYgaGF0IG9kZXIgZGVyIG1vdmUgbmljaHQgaW4gZWluZW4gU3BpZWxlcgorICAvLyBnZWh0LCBnZWh0cyBudXIgbWl0IE1fTk9DSEVDSy4KKyAgaWYgKCAoZW52aXJvbm1lbnQodGhpc19vYmplY3QoKSkgfHwgIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoZGVzdCkpIAorICAgICAgJiYgIShtZXRob2QgJiBNX05PQ0hFQ0spKSB7CisgICAgcmV0dXJuIE1FX0NBTlRfQkVfRFJPUFBFRDsKKyAgfQorCisgIHJldHVybiA6OlByZXZlbnRNb3ZlKGRlc3QsIG9sZGVudiwgbWV0aG9kKTsKK30KKworaW50IF9xdWVyeV9hdXRvbG9hZG9iaigpIHsgcmV0dXJuIDE7IH0KKwordm9pZCBpbml0KCkKK3sKKyAgOjppbml0KCk7CisgIGlmICh0aGlzX3BsYXllcigpID09IGVudmlyb25tZW50KCkpCisgICAgc3RhcnRfZGVhdGgoKTsKK30KZGlmZiAtLWdpdCBhL3Jvb20vZGVhdGgvZGVhdGhfbWFya19ob29rZWQuYyBiL3Jvb20vZGVhdGgvZGVhdGhfbWFya19ob29rZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTA5ZThmCi0tLSAvZGV2L251bGwKKysrIGIvcm9vbS9kZWF0aC9kZWF0aF9tYXJrX2hvb2tlZC5jCkBAIC0wLDAgKzEsNjYgQEAKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisKKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxuZXdfc2tpbGxzLmg+CisKK2luaGVyaXQgInN0ZC90aGluZyI7CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcCggUF9OQU1FLCAiU3RlbXBlbCBkZXMgVG9kZXMiICk7CisgIFNldFByb3AoIFBfR0VOREVSLCBNQUxFICk7CisgIFNldFByb3AoIFBfU0hPUlQsIDAgKTsKKyAgU2V0UHJvcCggUF9JTlZJUywgMSApOworICBTZXRQcm9wKCBQX05FVkVSRFJPUCwgMSApOworICBBZGRJZCgoeyJkZWF0aF9tYXJrIiwiXG5kZWF0aF9tYXJrIn0pKTsKK30KKwordm9pZCByZXNldCgpCit7CisgIDo6cmVzZXQoKTsKKyAgaWYgKGVudmlyb25tZW50KCkgJiYgIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoZW52aXJvbm1lbnQoKSkpCisgICAgcmVtb3ZlKCk7Cit9CisKKworLyoKKyAqIEZ1bmN0aW9uIG5hbWU6IHN0YXJ0X2RlYXRoCisgKiBEZXNjcmlwdGlvbjogICBTdGFydCB0aGUgZGVhdGggc2VxdWVuY2UuCisgKi8KK3ZvaWQgc3RhcnRfZGVhdGgoKQoreworICBpZiAoICFlbnZpcm9ubWVudCgpIHx8ICFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKGVudmlyb25tZW50KCkpCisgICAgICAgfHwgIWVudmlyb25tZW50KCktPlF1ZXJ5UHJvcChQX0dIT1NUKSApCisgIHsKKyAgICAgIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOworICAgICAgcmV0dXJuOworICB9CisKKyAgc2F5KCJEdSBzaWVoc3QgZWluZSBkdW5rbGUgR2VzdGFsdCwgZGllIGV0d2FzIER1bnN0IGVpbnNhbW1lbHQgLi4uIG9kZXIgdmllbGxlaWNodFxuIisKKyAgICAgICJiaWxkZXN0IGR1IERpciBkYXMgYXVjaCBudXIgZWluIC4uLlxuIik7CisgIGVudmlyb25tZW50KCktPm1vdmUoIi9yb29tL2RlYXRoL3ZpcnR1YWwvZGVhdGhfcm9vbV8iK2dldHVpZChlbnZpcm9ubWVudCgpKSwKKwkJICAgICBNX0dPfE1fU0lMRU5UfE1fTk9fU0hPV3xNX05PQ0hFQ0spOworICAvLyBEZXIgZm9sZ2VuZGUgQ29kZSB2ZXJoaW5kZXJ0LCBkYXNzIGVpbiB1bmJlZGFjaHRlciBNYWdpZXIgaW0gaW5pdAorICAvLyBvZGVyIGV4aXQgZWluZW4gU3BpZWxlciB09nRldCwgdW5kIGlobiBkaXJrZXQgZGFuYWNoIG1vdmV0LgorICBlbnZpcm9ubWVudCgpLT5TZXRQcm9wKFBfVE1QX01PVkVfSE9PSywoe3RpbWUoKSsxMCx0aGlzX29iamVjdCgpLCJjYXRjaF9kaWVfbW92ZSJ9KSk7ICAKK30KKwordmFyYXJncyBpbnQgbW92ZShtaXhlZCBkZXN0LG1peGVkIG1ldGhvZCkKK3sJCisgIGlmICghbWV0aG9kICYgTV9OT0NIRUNLKSByZXR1cm4gTUVfQ0FOVF9CRV9EUk9QUEVEOworICByZXR1cm4gOjptb3ZlKGRlc3QsbWV0aG9kKTsKK30KKworaW50IF9xdWVyeV9hdXRvbG9hZG9iaigpIHsgcmV0dXJuIDE7IH0KKworaW50IGNhdGNoX2RpZV9tb3ZlKCkgeyByZXR1cm4gLTE7IH0KKwordm9pZCBpbml0KCkKK3sKKyAgOjppbml0KCk7CisgIGlmICh0aGlzX3BsYXllcigpID09IGVudmlyb25tZW50KCkpCisgICAgc3RhcnRfZGVhdGgoKTsKK30KZGlmZiAtLWdpdCBhL3Jvb20vZGVhdGgvZGVhdGhfcm9vbS5jIGIvcm9vbS9kZWF0aC9kZWF0aF9yb29tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU1OWYyMAotLS0gL2Rldi9udWxsCisrKyBiL3Jvb20vZGVhdGgvZGVhdGhfcm9vbS5jCkBAIC0wLDAgKzEsNjY5IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gZGVhdGhfcm9vbS5jIC0tIERlciBUb2Rlc3JhdW0KKy8vCisvLyAkSWQ6IGRlYXRoX3Jvb20uYyA5MTM4IDIwMTUtMDItMDMgMjE6NDY6NTZaIFplc3N0cmEgJAorCisKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisKKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8ZGFlbW9uLmg+CisjaW5jbHVkZSA8bmV3X3NraWxscy5oPgorCitpbmhlcml0ICIvc3RkL3Jvb20iOworCittaXhlZCAqcGxheWVyczsKK21hcHBpbmcgbXNnQ2FjaGU7CisKKworcHJpdmF0ZSB2b2lkIGZsdXNoKCBpbnQgdW51c2VkT25seSApOworcHJpdmF0ZSBzdHJpbmcgZXhwYW5kKCBzdHJpbmcgdGFibGUsIGludCB2YWx1ZSApOworcHJpdmF0ZSBzdHJpbmcgcGFyc2VUZXh0KCBzdHJpbmcgbXNnLCBvYmplY3QgcGwgKTsKK3ByaXZhdGUgdm9pZCBkb19yZW1vdmUoKTsKK3ByaXZhdGUgdmFyYXJncyBtaXhlZCBnZXRfc2VxdWVuY2UoIHN0cmluZyBzdHIgKTsKK3ZvaWQgYWRkX3BsYXllciggb2JqZWN0IHBsICk7CitzdGF0aWMgaW50IGZpbHRlcl9sZGZpZWQoIHN0cmluZyBzdHIgKTsKK3B1YmxpYyBpbnQgU21hcnRMb2coIHN0cmluZyBjcmVhdCwgc3RyaW5nIG15bmFtZSwgc3RyaW5nIHN0ciwgc3RyaW5nIGRhdGUgKTsKK3B1YmxpYyBtaXhlZCBoaWVyX2dlYmxpZWJlbiggbWl4ZWQgZGVzdCwgaW50IG1ldGhvZHMsIHN0cmluZyBkaXJlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0ZXh0b3V0LCBzdHJpbmcgdGV4dGluICk7CitwdWJsaWMgdm9pZCBpbml0KCkKK3sKKyAgdGhpc19wbGF5ZXIoKS0+bW92ZSgiL3Jvb20vZGVhdGgvdmlydHVhbC9kZWF0aF9yb29tXyIrZ2V0dWlkKHRoaXNfcGxheWVyKCkpLAorCSAgICAgTV9OT0NIRUNLfE1fU0lMRU5UfE1fTk9fU0hPVyk7CisgIHJldHVybjsKK30KKworcHVibGljIHZvaWQgY3JlYXRlKCkKK3sKKyAgaWYgKElTX0NMT05FKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgICAgOjpjcmVhdGUoKTsKKyAgICAKKyAgICBwbGF5ZXJzID0gKHt9KTsKKyAgICBmbHVzaCgwKTsKKworICAgIFNldFByb3AoIFBfTkFNRSwgIkxhcnMiICk7CisgICAgU2V0UHJvcCggUF9HRU5ERVIsIE1BTEUgKTsKKyAgICBTZXRQcm9wKCBQX0FSVElDTEUsIDAgKTsKKyAgICBTZXRQcm9wKCBQX0xJR0hULDEgKTsKKyAgICBTZXRQcm9wKCBQX05PX1RQT1JULCBOT19UUE9SVF9PVVQgKTsKKyAgICBTZXRQcm9wKCBQX0xPR19GSUxFLCAiVE9EL1RvZGVzcmF1bSIgKTsKKyAgICBTZXRQcm9wKCBQX0lOVF9TSE9SVCwgIkFyYmVpdHN6aW1tZXIgZGVzIFRvZGVzIiApOworICAgIFNldFByb3AoIFBfSU5UX0xPTkcsIGJyZWFrX3N0cmluZygKKyAgICAgICAgICAgICAiRWluIGR1bmtsZXIgUmF1bSwgZXJsZXVjaHRldCB2b24gZHVua2xlbSBMaWNodCwgZGFzIHNpY2ggZGVyICIKKyAgICAgICAgICAgICAiRHVua2VsaGVpdCBuaWNodCBzbyBzZWhyIHp1IHdpZGVyc2V0emVuIHNjaGVpbnQsIGluZGVtIGVzICIKKyAgICAgICAgICAgICAibGV1Y2h0ZXQsIGFscyBkYXNzIGVzIGRlciBkdW5rZWxzdGUgUHVua3QgaW4gZWluZXIgd2VuaWdlciAiCisgICAgICAgICAgICAgImR1bmtsZW4gVW1nZWJ1bmcgaXN0LiBJbSBzZWx0c2FtZW4gTGljaHQgZXJrZW5uc3QgRHUgZWluZW4gIisKKyAgICAgICAgICAgICAiemVudHJhbCBhdWZnZXN0ZWxsdGVuIFNjaHJlaWJ0aXNjaCwgZGVyIG1pdCBEaWFncmFtbWVuIHVuZCAiCisgICAgICAgICAgICAgIkJ1ZWNoZXJuIGJlZGVja3QgaXN0LiBEaWUgV2FlbmRlIHZlcnNjaHdpbmRlbiBoaW50ZXIgUmVnYWxlbiwgIgorICAgICAgICAgICAgICJkaWUgZ2VmdWVsbHQgc2luZCBtaXQgaW4gTGVkZXIgZ2VidW5kZW5lbiwgZHVua2xlbiBXYWVsemVybiwgIgorICAgICAgICAgICAgICJ2b24gZGVuZW4gZ2VoZWltbmlzdm9sbGUgUnVuZW4gbGV1Y2h0ZW4uXG5Ub2QuIiwgNzgsIDAsIDEgKSApOworfQorCisKK3B1YmxpYyB2b2lkIHJlc2V0KCkKK3sKKyAgICA6OnJlc2V0KCk7CisgICAgZmx1c2goMSk7Cit9CisKK3ByaXZhdGUgdm9pZCBmbHVzaCggaW50IHVudXNlZE9ubHkgKQoreworICAgIHN0cmluZyAqbWk7CisgICAgaW50IGk7CisKKyAgICBpZiAoIHVudXNlZE9ubHkgKXsKKyAgICAgICAgaWYgKCBpID0gc2l6ZW9mKG1pID0gbV9pbmRpY2VzKG1zZ0NhY2hlKSkgKXsKKyAgICAgICAgICAgIGZvciAoIDsgaS0tOyApCisgICAgICAgICAgICAgICAgaWYgKCBtc2dDYWNoZVttaVtpXSwgMV0gKQorICAgICAgICAgICAgICAgICAgICBtc2dDYWNoZVttaVtpXSwgMV0gPSAwOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgbXNnQ2FjaGUgPSBtX2NvcHlfZGVsZXRlKCBtc2dDYWNoZSwgbWlbaV0gKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgICAgIG1zZ0NhY2hlID0gKFtdKTsKK30KKworCitwcml2YXRlIHN0cmluZyBleHBhbmQoIHN0cmluZyB0YWJsZSwgaW50IHZhbHVlICkKK3sKKyAgICBpbnQgc3osIHdlcnQsIGk7CisgICAgc3RyaW5nICp0ZXh0ZTsKKworICAgIHN6ID0gc2l6ZW9mKCB0ZXh0ZSA9IGV4cGxvZGUoIHRhYmxlLCAiIyMiICkgLSAoeyIifSkgKTsKKyAgICAKKyAgICBmb3IgKCBpID0gMDsgaSA8IHN6OyBpKysgKQorICAgICAgICBpZiAoIGklMiApeworICAgICAgICAgICAgc3NjYW5mKCB0ZXh0ZVtpXSwgIiVkIiwgd2VydCApOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIHZhbHVlIDwgd2VydCApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGFibGUgPSB0ZXh0ZVtpXTsKKworICAgIHJldHVybiB0YWJsZTsKK30KKworCisjZGVmaW5lIFRPUyhzKSBzWzwxXQorI2RlZmluZSBTVE9TKHMpIHNbPDJdCisjZGVmaW5lIFBVU0goeCxzKSAocys9ICh7IHggfSkpCisjZGVmaW5lIFBPUChzKQkocz1zWzAuLjwyXSkKKworLy8gemllbWxpY2ggdm9tIGh0bWxkIGFiZ2VrdXBmZXJ0IDspCitwcml2YXRlIHN0cmluZworcGFyc2VUZXh0KCBzdHJpbmcgbXNnLCBvYmplY3QgcGwgKSAKK3sKKyAgc3RyaW5nICp3b3JkcywgKnRleHRlLCAqdG9kbywgKmRvbmU7CisgIGludCBlbmRGbGFnOworCisgIGludCBzeiA9IHNpemVvZiggd29yZHMgPSByZWdleHBsb2RlKG1zZywgIls8XVtePl0qWz5dIikgKTsKKyAgdG9kbyA9ICh7IH0pOworICBkb25lID0gKHsiIn0pOworCisgIGZvciAoIGludCBpPTE7IGk8c3o7IGkrPTIgKXsKKyAgICAgIHN0cmluZyBjbWQgPSB3b3Jkc1tpXVsxLi48Ml07CisgICAgICBUT1MoZG9uZSkgKz0gd29yZHNbaS0xXTsKKworICAgICAgaWYgKCBjbWRbMF0gPT0gJy8nICl7CisgICAgICAgICAgZW5kRmxhZyA9IDE7CisgICAgICAgICAgY21kID0gY21kWzEuLl07CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgICAgZW5kRmxhZyA9IDA7CisgICAgICAKKyAgICAgIHN3aXRjaCggY21kWzBdICl7CisgICAgICBjYXNlICdBJzogLyoqKiBBbGlnbm1lbnQgZXJzZXR6ZW4gKioqLworICAgICAgICAgIGlmICghZW5kRmxhZyl7CisgICAgICAgICAgICAgIFBVU0goIGNtZCwgdG9kbyApOworICAgICAgICAgICAgICBQVVNIKCAiIiwgZG9uZSApOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGlmICggdG9kb1s8MV0gPT0gIkEiICl7CisgICAgICAgICAgICAgICAgICBTVE9TKGRvbmUpICs9IGV4cGFuZChUT1MoZG9uZSksIChpbnQpIHBsLT5RdWVyeVByb3AoUF9BTElHTikpOworICAgICAgICAgICAgICAgICAgZG9uZSA9IGRvbmVbMC4uPDJdOworICAgICAgICAgICAgICAgICAgdG9kbyA9IHRvZG9bMC4uPDJdOworICAgICAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgCisgICAgICBjYXNlICdEJzogLyoqKiBUb2RlIGVyc2V0emVuICoqKi8KKyAgICAgICAgICBpZiAoICFlbmRGbGFnICl7CisgICAgICAgICAgICAgIFBVU0goIGNtZCwgdG9kbyApOworICAgICAgICAgICAgICBQVVNIKCAiIiwgZG9uZSApOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGlmICggdG9kb1s8MV0gPT0gIkQiICl7CisgICAgICAgICAgICAgICAgICBTVE9TKGRvbmUpICs9IGV4cGFuZChUT1MoZG9uZSksIChpbnQpIHBsLT5RdWVyeVByb3AoUF9ERUFEUykpOworICAgICAgICAgICAgICAgICAgUE9QKGRvbmUpOworICAgICAgICAgICAgICAgICAgUE9QKHRvZG8pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgCisgICAgICBjYXNlICdMJzogLyoqKiBMZXZlbCBlcnNldHplbiAqKiovCisgICAgICAgICAgaWYgKCAhZW5kRmxhZyApeworICAgICAgICAgICAgICBQVVNIKCBjbWQsIHRvZG8gKTsKKyAgICAgICAgICAgICAgUFVTSCggIiIsIGRvbmUgKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBpZiAoIHRvZG9bPDFdID09ICJMIiApeworICAgICAgICAgICAgICAgICAgU1RPUyhkb25lKSArPSBleHBhbmQoVE9TKGRvbmUpLCAoaW50KSBwbC0+UXVlcnlQcm9wKFBfTEVWRUwpKTsKKyAgICAgICAgICAgICAgICAgIFBPUChkb25lKTsKKyAgICAgICAgICAgICAgICAgIFBPUCh0b2RvKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICAgIAorICAgICAgY2FzZSAnWic6IC8qKiogWnVmYWxsIGVyc2V0emVuICoqKi8KKyAgICAgICAgICBpZiAoICFlbmRGbGFnICl7CisgICAgICAgICAgICAgIFBVU0goIGNtZCwgdG9kbyApOworICAgICAgICAgICAgICBQVVNIKCAiIiwgZG9uZSApOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNleworICAgICAgICAgICAgICBpZiAoIHRvZG9bPDFdWzBdID09ICdaJyl7CisgICAgICAgICAgICAgICAgICBpbnQgY250LCBybmQsIHdlcnQsIHN6MjsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgaWYgKCAhc3NjYW5mKHRvZG9bPDFdLCAiWj0lZCIsIHJuZCkgKQorICAgICAgICAgICAgICAgICAgICAgIFNUT1MoZG9uZSkgKz0gIlxuIyMjXG4jIyMgU3ludGF4IEVycm9yIGluIDxaPiFcbiMjI1xuXG4iOworICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgcm5kID0gcmFuZG9tKHJuZCk7CisgICAgICAgICAgICAgICAgICAgICAgc3oyID0gc2l6ZW9mKCB0ZXh0ZSA9IGV4cGxvZGUoVE9TKGRvbmUpLCAiIyMiKSApOworICAgICAgICAgICAgICAgICAgICAgIHdlcnQ9MDsKKyAgICAgICAgICAgICAgICAgICAgICBjbnQ9MDsKKyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICBmb3IgKCBpbnQgayA9IDE7IGsgPCBzejI7IGsgKz0gMiApeworICAgICAgICAgICAgICAgICAgICAgICAgICBzc2NhbmYoIHRleHRlW2tdLCAiJWQiLCB3ZXJ0ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNudCArPSB3ZXJ0OworICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHJuZCA8IGNudCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUT1MoZG9uZSkgKz0gdGV4dGVbaysxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgUE9QKGRvbmUpOworICAgICAgICAgICAgICAgICAgUE9QKHRvZG8pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICdHJzogLyoqKiBHZW5kZXIgZXJzZXR6ZW4gKioqLworICAgICAgICAgIGlmICggIWVuZEZsYWcgKXsKKyAgICAgICAgICAgICAgUFVTSCggY21kLCB0b2RvICk7CisgICAgICAgICAgICAgIFBVU0goICIiLCBkb25lICk7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgIGlmKCBzaXplb2YoIHRleHRlID0gcmVnZXhwbG9kZShUT1MoZG9uZSksICI6IikgKSA9PSAzICkKKyAgICAgICAgICAgICAgICAgIFNUT1MoZG9uZSkgKz0gdGV4dGVbMiooKGludCkgcGwtPlF1ZXJ5UHJvcChQX0dFTkRFUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gRkVNQUxFKV07CisgICAgICAgICAgICAgIFBPUChkb25lKTsKKyAgICAgICAgICAgICAgUE9QKHRvZG8pOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAnUic6IC8qKiogUmFzc2UgZXJzZXR6ZW4gKioqLworICAgICAgICAgIGlmICggIWVuZEZsYWcgKXsKKyAgICAgICAgICAgICAgUFVTSCggY21kLCB0b2RvICk7CisgICAgICAgICAgICAgIFBVU0goICIiLCBkb25lICk7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgIGludCByYWNlOworCisgICAgICAgICAgICAgIHRleHRlID0gcmVnZXhwbG9kZSggVE9TKGRvbmUpLCAiXFx8IiApOworICAgICAgICAgICAgICByYWNlID0gMiAqIChtZW1iZXIoICh7ICJNZW5zY2giLCAiRWxmIiwgIlp3ZXJnIiwgIkhvYmJpdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGZWxpbmUiLCAiRHVua2VsZWxmIiB9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nKSBwbC0+UXVlcnlQcm9wKFBfUkFDRSkgKSArIDEpOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgaWYgKCByYWNlID49IHNpemVvZih0ZXh0ZSkgKQorICAgICAgICAgICAgICAgICAgcmFjZSA9IDA7CisKKyAgICAgICAgICAgICAgU1RPUyhkb25lKSArPSB0ZXh0ZVtyYWNlXTsKKyAgICAgICAgICAgICAgUE9QKGRvbmUpOworICAgICAgICAgICAgICBQT1AodG9kbyk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICduJzogLyoqKiBOYW1lLCBub3JtYWwgZ2VzY2hyaWViZW4gKioqLworICAgICAgICAgIFRPUyhkb25lKSArPSAoc3RyaW5nKSAocGwtPm5hbWUoUkFXKSk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgJ04nOiAvKioqIE5hbWUsIGluIEdyb3NzYnVjaHN0YWJlbiAqKiovCisgICAgICAgICAgVE9TKGRvbmUpICs9IHVwcGVyc3RyaW5nKHBsLT5uYW1lKFJBVykpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICB9CisgIFBVU0goIHdvcmRzWzwxXSwgZG9uZSApOworICByZXR1cm4gaW1wbG9kZSggZG9uZSwgIiIgKTsKK30KKworCitwdWJsaWMgdm9pZCBoZWFydF9iZWF0KCkKK3sKKyAgICBmb3IgKCBpbnQgaiA9IHNpemVvZihwbGF5ZXJzKTsgai0tOyApCisgICAgICAgIGlmICggIW9iamVjdHAocGxheWVyc1tqXVswXSkgfHwKKyAgICAgICAgICAgICBlbnZpcm9ubWVudChwbGF5ZXJzW2pdWzBdKSAhPSAKKwkgICAgIGZpbmRfb2JqZWN0KCIvcm9vbS9kZWF0aC92aXJ0dWFsL2RlYXRoX3Jvb21fIitnZXR1aWQocGxheWVyc1tqXVswXSkpICkKKyAgICAgICAgICAgIHBsYXllcnNbal0gPSAwOworCisgICAgcGxheWVycyAtPSAoezB9KTsKKworICAgIGlmICggIXNpemVvZihwbGF5ZXJzKSApIHsKKyAgICAgICAgc2V0X2hlYXJ0X2JlYXQoMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgZm9yICggaW50IGogPSBzaXplb2YocGxheWVycyk7IGotLTsgKSB7CisgICAgICBpbnQgbnI7CisgICAgICBzdHJpbmcgbXNnOworCisgICAgICBuciA9ICsrcGxheWVyc1tqXVsxXTsKKworICAgICAgaWYgKCBtYXBwaW5ncChwbGF5ZXJzW2pdWzJdKSApCisgICAgICAgICAgbXNnID0gcGxheWVyc1tqXVsyXVtucl07CisgICAgICBlbHNlCisgICAgICAgICAgbXNnID0gMDsKKyAgICAgIAorICAgICAgaWYgKCAhbXNnICkKKyAgICAgICAgICBtc2cgPSBwbGF5ZXJzW2pdWzNdWzFdW25yXTsKKyAgICAgIAorICAgICAgaWYgKCBtc2cgKQorICAgICAgICAgIHRlbGxfb2JqZWN0KCBwbGF5ZXJzW2pdWzBdLCBwYXJzZVRleHQoIG1zZywgcGxheWVyc1tqXVswXSApICk7CisgIH0KKyAgCisgIGRvX3JlbW92ZSgpOworfQorCitwcml2YXRlIHZvaWQKK2RvX3JlbW92ZSgpCit7CisgICAgaW50IHJlczsKKyAgICBzdHJpbmcgcHJheXJvb207CisgICAgb2JqZWN0IHBsb2JqLCBwbDsKKyAgICAKKyAgICBmb3IgKCBpbnQgaiA9IHNpemVvZihwbGF5ZXJzKTsgai0tOyApeworICAgICAgICBpZiAoIHBsYXllcnNbal1bMV0gPj0gcGxheWVyc1tqXVszXVswXSl7CisgICAgICAgICAgICBwbCA9IHBsYXllcnNbal1bMF07CisgICAgICAgICAgICB3aGlsZSAoIHBsb2JqID0gcHJlc2VudCgiXG5kZWF0aF9tYXJrIiwgcGwpICkKKyAgICAgICAgICAgICAgICBwbG9iai0+cmVtb3ZlKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICggIShwcmF5cm9vbSA9IChzdHJpbmcpIHBsLT5RdWVyeVByYXlSb29tKCkpICkKKyAgICAgICAgICAgICAgICBwcmF5cm9vbT0iL3Jvb20vcHJheV9yb29tIjsKKworICAgICAgICAgICAgcGwtPlNldCggUF9UTVBfTU9WRV9IT09LLCAwICk7CisgICAgICAgICAgICBwbC0+U2V0KCBQX05PX0FUVEFDSywgMCwgRl9RVUVSWV9NRVRIT0QgKTsKKyAgICAgICAgICAgIHBsLT5TZXQoIFBfTEFTVF9LSUxMRVIsIDAgKTsKKyAgICAgICAgICAgIHBsLT5TZXQoIFBfS0lMTEVSLCAwICk7CisgICAgICAgICAgICBwbC0+U2V0KCBQX0VORU1ZX0RFQVRIX1NFUVVFTkNFLCAwICk7CisgICAgICAgICAgICBwbC0+U2V0KCBQX05FWFRfREVBVEhfU0VRVUVOQ0UsIDAgKTsKKyAgICAgICAgICAgIHBsLT5TZXQoIFBfUE9JU09OLCAwLCBGX1FVRVJZX01FVEhPRCApOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIGNhdGNoKCByZXMgPSAoaW50KSBwbC0+bW92ZShwcmF5cm9vbSwgTV9HT3xNX1NJTEVOVHxNX05PQ0hFQ0spICkKKyAgICAgICAgICAgICAgICAgfHwgcmVzIDwgMSApCisgICAgICAgICAgICAgICAgcGwtPm1vdmUoICIvcm9vbS9wcmF5X3Jvb20iLCBNX0dPfE1fTk9DSEVDSyApOworCisgICAgICAgICAgICBwbGF5ZXJzW2pdID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBsYXllcnMgLT0gKHswfSk7CisKKyAgICBpZiAoICFzaXplb2YocGxheWVycykgKQorICAgICAgICBzZXRfaGVhcnRfYmVhdCgwKTsKK30KKworcHJpdmF0ZSB2YXJhcmdzIG1peGVkCitnZXRfc2VxdWVuY2UoIHN0cmluZyBzdHIgKQoreworICAgIHN0cmluZyAqc2VxdWVuY2VzOworICAgIGludCBpLCBsZW4sIGNhY2hlYWJsZTsKKyAgICAKKyAgICBpZiAoICFzdHJpbmdwKHN0cikgfHwgY2F0Y2goIGxlbiA9IGZpbGVfc2l6ZShzdHIpICkgfHwgbGVuIDw9IDAgKXsKKyAgICAgICAgc2VxdWVuY2VzID0gZ2V0X2RpciggIi9yb29tL2RlYXRoL3NlcXVlbmNlcy8qIiApIC0gKHsgIi4iLCAiLi4iLCAiLnN2biIgfSk7CisgICAgICAgIHN0ciA9ICIvcm9vbS9kZWF0aC9zZXF1ZW5jZXMvIiArIHNlcXVlbmNlc1tyYW5kb20oIHNpemVvZihzZXF1ZW5jZXMpICldOworICAgIH0KKworICAgIGlmICggY2FjaGVhYmxlID0gKChzaXplb2Yoc3RyKSA+IDIxKSAmJgorICAgICAgICAgICAgICAgICAgICAgIChzdHJbMC4uMjFdID09ICIvcm9vbS9kZWF0aC9zZXF1ZW5jZXMvIikpICl7CisgICAgICAgIGlmICggbWVtYmVyKG1zZ0NhY2hlLCBzdHIpICl7CisgICAgICAgICAgICBtc2dDYWNoZVtzdHIsIDFdID0gMTsgIC8vIFRvdWNoIGl0IQorICAgICAgICAgICAgcmV0dXJuICh7IG1zZ0NhY2hlW3N0cl0sIHN0ciB9KTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBzZXF1ZW5jZXMgPSBleHBsb2RlKCByZWFkX2ZpbGUoc3RyKSwgIlxuIiApOworICAgIHNzY2FuZiggc2VxdWVuY2VzWzBdLCAiJWQiLCBsZW4gKTsKKyAgICBzdHJpbmcgc2VxID0gaW1wbG9kZSggc2VxdWVuY2VzWzEuLl0sICJcbiIgKTsKKyAgICBzZXF1ZW5jZXMgPSByZWdleHBsb2RlKCBzZXEsICJbMC05XVswLTldKjoiICk7CisgICAgbWFwcGluZyBtID0gKFtdKTsKKyAgICAKKyAgICBmb3IgKCBpID0gMTsgaSA8IHNpemVvZihzZXF1ZW5jZXMpLTE7IGkgKz0gMiApCisgICAgICAgIG1bKGludCkgc2VxdWVuY2VzW2ldXSA9IHNlcXVlbmNlc1tpKzFdOworCisgICAgaWYgKCBjYWNoZWFibGUgKQorICAgICAgICBtc2dDYWNoZSArPSAoWyBzdHI6ICh7IGxlbiwgbSB9KTsgMSBdKTsKKworICAgIHJldHVybiAoeyAoeyBsZW4sIG0gfSksIHN0ciB9KTsKK30KKworLy8gRGVzY3JpcHRpb246ICAgQWRkcyBhIHBsYXllciB0byB0aGUgbGlzdAordm9pZCBhZGRfcGxheWVyKCBvYmplY3QgcGwgKQoreworICAgIGludCBrYXJ0LCBrZ2VuOworICAgIGludCBlc2NhcGVkOworICAgIG9iamVjdCBraWxsX2xpdiwga2lsbF9vYjsKKyAgICBtaXhlZCBkc2VxLCBhY3Rfc2VxLCBraWxsZXJfbmFtZSwga2lsbGVyX21zZzsKKyAKKyAgICBzZXRfaGVhcnRfYmVhdCgxKTsKKyAgICBrZ2VuID0gTUFMRTsKKworICAgIGZvcmVhY2gob2JqZWN0IHByZXYgOiBjYWxsZXJfc3RhY2soMSkpIHsgCisgICAgICAgIGlmICggIW9iamVjdHAocHJldikgfHwgcHJldiA9PSBwbCApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBzdHJpbmcgZm4gPSBvYmplY3RfbmFtZShwcmV2KTsKKworICAgICAgICBpZiAoIGZuWzAuLjEyXSA9PSAiL3NlY3VyZS9sb2dpbiIgJiYgIWtpbGxfbGl2ICl7CisgICAgICAgICAgICBlc2NhcGVkID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBmblswLi43XSA9PSAiL3NlY3VyZS8iICYmIGZuWzAuLjEzXSAhPSAiL3NlY3VyZS9tZXJsaW4iICkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmICggZm5bMC4uMjFdID09ICIvcm9vbS9kZWF0aC9kZWF0aF9tYXJrIiApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAoIGxpdmluZyhwcmV2KSApeworICAgICAgICAgICAga2lsbF9saXYgPSBwcmV2OyAvLyBLaWxsZXIKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAga2lsbF9vYiA9IHByZXY7IC8vIGtpbGxlbmRlcyBPYmpla3QKKyAgICB9CisKKyAgICBvYmplY3QgcHJlID0gKG9iamVjdCkgcGwtPlF1ZXJ5UHJvcChQX0tJTExFUik7CisgICAgaWYgKCBvYmplY3RwKHByZSkgKSB7CisgICAgICAgIGRzZXEgPSAobWl4ZWQpIHByZS0+UXVlcnlQcm9wKFBfRU5FTVlfREVBVEhfU0VRVUVOQ0UpOworCisgICAgICAgIGlmKCAhKGtpbGxlcl9uYW1lID0gKG1peGVkKSBwcmUtPlF1ZXJ5UHJvcChQX0tJTExfTkFNRSkpICl7CisgICAgICAgICAgICBraWxsZXJfbmFtZSA9IChtaXhlZCkgcHJlLT5RdWVyeVByb3AoUF9OQU1FKTsKKyAgICAgICAgICAgIGthcnQgPSAoaW50KSBwcmUtPlF1ZXJ5UHJvcChQX0FSVElDTEUpOworICAgICAgICAgICAga2dlbiA9IChpbnQpIHByZS0+UXVlcnlQcm9wKFBfR0VOREVSKTsKKyAgICAgICAgfQorCisgICAgICAgIGtpbGxlcl9tc2cgPSAobWl4ZWQpcHJlLT5RdWVyeVByb3AoUF9LSUxMX01TRyk7ICAKKyAgICB9CisKKyAgICBpZiAoICFraWxsZXJfbmFtZSAmJiBraWxsX2xpdiAmJiBmdW5jdGlvbl9leGlzdHMoICJRdWVyeVByb3AiLCBraWxsX2xpdiApICl7CisgICAgICAgIGRzZXEgPSAobWl4ZWQpIGtpbGxfbGl2LT5RdWVyeVByb3AoUF9FTkVNWV9ERUFUSF9TRVFVRU5DRSk7CisKKyAgICAgICAgaWYoICEoa2lsbGVyX25hbWUgPSAobWl4ZWQpIGtpbGxfbGl2LT5RdWVyeVByb3AoUF9LSUxMX05BTUUpKSApeworICAgICAgICAgICAga2lsbGVyX25hbWUgPSAobWl4ZWQpIGtpbGxfbGl2LT5RdWVyeVByb3AoUF9OQU1FKTsKKyAgICAgICAgICAgIGthcnQgPSAoaW50KSBraWxsX2xpdi0+UXVlcnlQcm9wKFBfQVJUSUNMRSk7CisgICAgICAgICAgICBrZ2VuID0gKGludCkga2lsbF9saXYtPlF1ZXJ5UHJvcChQX0dFTkRFUik7CisgICAgICAgIH0KKworICAgICAgICBraWxsZXJfbXNnID0gKG1peGVkKSBraWxsX2xpdi0+UXVlcnlQcm9wKFBfS0lMTF9NU0cpOworICAgICAgICBwcmUgPSBraWxsX2xpdjsKKyAgICB9CisKKyAgICBpZiAoICFraWxsZXJfbmFtZSAmJiBraWxsX29iICYmIGZ1bmN0aW9uX2V4aXN0cyggIlF1ZXJ5UHJvcCIsIGtpbGxfb2IgKSApeworICAgICAgICBkc2VxID0gKG1peGVkKSBraWxsX29iLT5RdWVyeVByb3AoUF9FTkVNWV9ERUFUSF9TRVFVRU5DRSk7CisKKyAgICAgICAgaWYoICEoa2lsbGVyX25hbWUgPSAobWl4ZWQpIGtpbGxfb2ItPlF1ZXJ5UHJvcChQX0tJTExfTkFNRSkpICl7CisgICAgICAgICAgICBraWxsZXJfbmFtZSA9IChtaXhlZCkga2lsbF9vYi0+UXVlcnlQcm9wKFBfTkFNRSk7CisgICAgICAgICAgICBrYXJ0ID0gKGludCkga2lsbF9vYi0+UXVlcnlQcm9wKFBfQVJUSUNMRSk7CisgICAgICAgICAgICBrZ2VuID0gKGludCkga2lsbF9vYi0+UXVlcnlQcm9wKFBfR0VOREVSKTsKKyAgICAgICAgfQorCisgICAgICAgIGtpbGxlcl9tc2cgPSAobWl4ZWQpIGtpbGxfb2ItPlF1ZXJ5UHJvcChQX0tJTExfTVNHKTsKKyAgICAgICAgcHJlID0ga2lsbF9vYjsKKyAgICB9CisgICAgCisgICAgLy8gZmFsbHMga2VpbmUgU2VxdWVueiBnZXNldHp0LCBldmVudHVlbGxlIGVpZ2VuZSBUb2Rlc3NlcXVlbnogbmVobWVuCisgICAgaWYgKCFkc2VxKQorICAgICAgZHNlcSA9IChtaXhlZClwbC0+UXVlcnlQcm9wKFBfTkVYVF9ERUFUSF9TRVFVRU5DRSk7CisKKyAgICBhY3Rfc2VxID0gMDsKKworICAgIGlmICggbWFwcGluZ3AoZHNlcSkgKQorICAgICAgICBhY3Rfc2VxID0gZ2V0X3NlcXVlbmNlKCAiL3Jvb20vZGVhdGgvc2VxdWVuY2VzL2xhcnMiICk7CisgICAgZWxzZSBpZiAoIHBvaW50ZXJwKGRzZXEpICkgIC8vIGdhbnplIFRvZGVzc2VxdWVuei4uLgorICAgICAgICBhY3Rfc2VxID0gKHsgZHNlcSwgMCB9KTsKKyAgICBlbHNlIGlmICggc3RyaW5ncChkc2VxKSApCisgICAgICAgIGFjdF9zZXEgPSBnZXRfc2VxdWVuY2UoZHNlcSk7CisKKyAgICBpZihwbC0+cXVlcnlfaGNfcGxheSgpPjEpCisgICAgeworICAgICAgICBhY3Rfc2VxPSh7KHsyMiwoWzE6IkR1IGZhZWxsc3QgdW5kIGZhZWxsc3QuLi5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICA1OiJ1bmQgZmFlbGxzdC4uLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwOiJ1bmQgZmFlbGxzdC4uLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEyOiJkaXJla3QgaW4gZGllIEFybWUgdm9uIFRPRC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAxNDoiVHJpdW1waGllcmVuZCBsYWVjaGVsdCBlciBEaWNoIGFuLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDE2OiJOVU4gR0VIT0VSU1QgRFUgRlVFUiBJTU1FUiBNSVIhXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgMTg6IkhBSEhIQUhBSEFBQUFBQUFBQUFIQUFBQUFBQUFBIVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDIwOiJUT0Qgc2NobGFlZ3QgRGlyIG1pdCBzZWluZXIgU2Vuc2UgZGVuIEtvcGYgYWIuXG4iXSl9KSwwfSk7CisgICAgfQorICAgIGlmICggIWFjdF9zZXEgKQorICAgICAgICBhY3Rfc2VxID0gZ2V0X3NlcXVlbmNlKCk7CisKKyAgICBpZiAoICFtYXBwaW5ncChkc2VxKSApCisgICAgICAgIGRzZXEgPSAwOworCisgICAgaW50IGk7CisgICAgZm9yICggaSA9IHNpemVvZihwbGF5ZXJzKTsgaS0tOyApCisgICAgICAgIGlmICggcGxheWVyc1tpXVswXSA9PSBwbCApCisgICAgICAgICAgICBicmVhazsKKworICAgIGlmICggaSA9PSAtMSApCisgICAgICAgIHBsYXllcnMgKz0gKHsgKHsgcGwsIDAsIGRzZXEsIGFjdF9zZXFbMF0sIGFjdF9zZXFbMV0sIHByZSB9KSB9KTsKKyAgICBlbHNlCisgICAgICAgIHBsYXllcnNbaV1bNV0gPSBwcmU7CisKKworICAgICAgICBpZiAoIGVzY2FwZWQgKXsKKyAgICAgICAgICAgIGtpbGxlcl9uYW1lID0gIiI7CisgICAgICAgICAgICBraWxsZXJfbXNnID0gdXBwZXJzdHJpbmcoZ2V0dWlkKHBsKSkgKyAiIFZFUlNVQ0hURSwgTUlSIFpVICIKKyAgICAgICAgICAgICAgICAiRU5US09NTUVOIC0gSkVUWlQgSEFCRSBJQ0ggV0lFREVSIEVYVFJBLUFSQkVJVCBNSVQgIisKKyAgICAgICAgICAgICAgICAoKGludCkgcGwtPlF1ZXJ5UHJvcChQX0dFTkRFUikgIT0gMiA/ICJJSE0iIDogIklIUiIpICsKKyAgICAgICAgICAgICAgICAiIC4uLiI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoICFraWxsZXJfbmFtZSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIChzdHJpbmcpIHBsLT5RdWVyeVByb3AoUF9LSUxMRVIpID09ICJnaWZ0IiApeworICAgICAgICAgICAgICAgICAgICBraWxsZXJfbmFtZSA9ICJWZXJnaWZ0dW5nIjsKKyAgICAgICAgICAgICAgICAgICAga2dlbiA9IEZFTUFMRTsKKyAgICAgICAgICAgICAgICAgICAga2FydCA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgICAgIGtpbGxlcl9uYW1lID0gIkV0d2FzIEdlaGVpbW5pc3ZvbGxlcyB1bmQgVW5iZWthbm50ZXMiOworICAgICAgICAgICAgICAgICAgICBrZ2VuID0gTkVVVEVSOworICAgICAgICAgICAgICAgICAgICBrYXJ0ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoICFwb2ludGVycChraWxsZXJfbXNnKSApCisgICAgICAgICAgICBraWxsZXJfbXNnID0gKHsga2lsbGVyX21zZywgMCwgMCB9KTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemVvZihraWxsZXJfbXNnKSA8IDMgKQorICAgICAgICAgICAga2lsbGVyX21zZyArPSAoeyAwLCAwLCAwIH0pOworCisgICAgICAgIGlmICggc3RyaW5ncChraWxsZXJfbXNnWzBdKSApCisgICAgICAgICAgICBraWxsZXJfbXNnWzBdID0gc3ByaW50Zigga2lsbGVyX21zZ1swXSwgY2FwaXRhbGl6ZShnZXR1aWQocGwpKSApOworCisgICAgICAgIFNldFByb3AoIFBfTkFNRSwga2lsbGVyX25hbWUgKTsKKyAgICAgICAgU2V0UHJvcCggUF9BUlRJQ0xFLCBrYXJ0ICk7CisgICAgICAgIFNldFByb3AoIFBfR0VOREVSLCBrZ2VuICk7CisgICAgICAgIHN0cmluZyBraWxsbmFtZSA9IE5hbWUoV0VSKTsKKyAgICAgICAgU2V0UHJvcCggUF9OQU1FLCAiTGFycyIgKTsKKyAgICAgICAgU2V0UHJvcCggUF9BUlRJQ0xFLCAwICk7CisgICAgICAgIFNldFByb3AoIFBfR0VOREVSLE1BTEUgKTsKKworICAgICAgICBpbnQgbWFnaWVydGVzdGllOworICAgICAgICBzdHJpbmcgdGVzdHBsYXllciA9IChzdHJpbmcpIHBsLT5RdWVyeVByb3AoUF9URVNUUExBWUVSKTsKKyAgICAgICAgaWYgKHNpemVvZih0ZXN0cGxheWVyKSkKKyAgICAgICAgeworICAgICAgICAgIGlmICh0ZXN0cGxheWVyWzw1Li48MV0hPSJHaWxkZSIpCisgICAgICAgICAgICBtYWdpZXJ0ZXN0aWUgPSAxOworICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgIHN0cmluZyBrYW5hbDsKKyAgICAgICAgaWYgIChtYWdpZXJ0ZXN0aWUgfHwgSVNfTEVBUk5JTkcocGwpKQorICAgICAgICAgICAga2FuYWwgPSAiVGRUIjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAga2FuYWwgPSAiVG9kIjsKKworICAgICAgICBDSE1BU1RFUi0+am9pbigga2FuYWwsIHRoaXNfb2JqZWN0KCkgKTsKKworICAgICAgICBpZiAoICghc3RyaW5ncChraWxsZXJfbmFtZSkgfHwga2lsbGVyX25hbWUgIT0gIiIpICYmCisgICAgICAgICAgICAgKHNpemVvZihraWxsZXJfbXNnKSA8IDQgfHwgIWtpbGxlcl9tc2dbM10pICl7CisgICAgICAgICAgICBpZiAoIGtpbGxlcl9tc2dbMl0gPT0gUExVUkFMICkKKyAgICAgICAgICAgICAgICBDSE1BU1RFUi0+c2VuZCgga2FuYWwsIHRoaXNfb2JqZWN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbGxuYW1lICsgIiBoYWJlbiBnZXJhZGUgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHBsKSkgKyAiIHVtZ2VicmFjaHQuIiApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIENITUFTVEVSLT5zZW5kKCBrYW5hbCwgdGhpc19vYmplY3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2lsbG5hbWUgKyAiIGhhdCBnZXJhZGUgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHBsKSkgKyAiIHVtZ2VicmFjaHQuIiApOworICAgICAgICB9CisKKyAgICAgICAgaSA9IChpbnQpIHBsLT5RdWVyeVByb3AoUF9ERUFEUyk7CisgICAgICAgIGlmICggaSAmJiAoZ2V0dWlkKHBsKSA9PSAia2V5IiB8fCBpJTEwMCA9PSAwIHx8IGklMjUwID09IDApICl7CisgICAgICAgICAgICBTZXRQcm9wKCBQX05BTUUsICJUb2QiICk7CisgICAgICAgICAgICBDSE1BU1RFUi0+c2VuZCgga2FuYWwsIHRoaXNfb2JqZWN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggIkRBUyBXQVIgU0NIT04gREFTICVkVEUgTUFMISIsIGkgKSApOworICAgICAgICAgICAgU2V0UHJvcCggUF9OQU1FLCAiTGFycyIgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBraWxsZXJfbXNnWzBdICl7CisgICAgICAgICAgICBpZiAoIHN0cmluZ3Aoa2lsbGVyX25hbWUpICYmIGtpbGxlcl9uYW1lID09ICIiICl7CisgICAgICAgICAgICAgICAgQ0hNQVNURVItPnNlbmQoIGthbmFsLCB0aGlzX29iamVjdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha19zdHJpbmcoIGZ1bmNhbGwoa2lsbGVyX21zZ1swXSksIDc4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbIitrYW5hbCsiOl0gIiApWzAuLjwyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVNHX0VNUFRZICk7CisgICAgICAgICAgICAgICAgcmV0dXJuOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmICggKGtpbGxlcl9tc2dbMV0gPCBNU0dfU0FZKSB8fCAoa2lsbGVyX21zZ1sxXSA+IE1TR19HRU1PVEUpICkKKyAgICAgICAgICAgICAgICAgICAga2lsbGVyX21zZ1sxXSA9IE1TR19TQVk7CisKKyAgICAgICAgICAgICAgICBTZXRQcm9wKCBQX05BTUUsIGtpbGxlcl9uYW1lICk7CisgICAgICAgICAgICAgICAgU2V0UHJvcCggUF9BUlRJQ0xFLCBrYXJ0ICk7CisgICAgICAgICAgICAgICAgU2V0UHJvcCggUF9HRU5ERVIsIGtnZW4gKTsKKyAgICAgICAgICAgICAgICBDSE1BU1RFUi0+c2VuZCgga2FuYWwsIHRoaXNfb2JqZWN0KCksIGZ1bmNhbGwoa2lsbGVyX21zZ1swXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbGxlcl9tc2dbMV0gKTsKKyAgICAgICAgICAgICAgICBTZXRQcm9wKCBQX05BTUUsICJMYXJzIiApOworICAgICAgICAgICAgICAgIFNldFByb3AoIFBfQVJUSUNMRSwgMCApOworICAgICAgICAgICAgICAgIFNldFByb3AoIFBfR0VOREVSLCBNQUxFICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIHBvaW50ZXJwKGtpbGxlcl9tc2cgPSAobWl4ZWQpIHBsLT5RdWVyeVByb3AoUF9ERUFUSF9NU0cpKSAmJgorICAgICAgICAgICAgIHNpemVvZihraWxsZXJfbXNnKSA9PSAyICYmIHN0cmluZ3Aoa2lsbGVyX21zZ1swXSkgJiYKKyAgICAgICAgICAgICBpbnRwKGtpbGxlcl9tc2dbMV0pICl7CisgICAgICAgICAgICBTZXRQcm9wKCBQX05BTUUsIGNhcGl0YWxpemUoZ2V0dWlkKHBsKSkgKTsKKyAgICAgICAgICAgIFNldFByb3AoIFBfQVJUSUNMRSwgMCApOworICAgICAgICAgICAgU2V0UHJvcCggUF9HRU5ERVIsIHBsLT5RdWVyeVByb3AoUF9HRU5ERVIpICk7CisgICAgICAgICAgICBDSE1BU1RFUi0+c2VuZCgga2FuYWwsIHRoaXNfb2JqZWN0KCksIGtpbGxlcl9tc2dbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga2lsbGVyX21zZ1sxXSApOworICAgICAgICAgICAgU2V0UHJvcCggUF9OQU1FLCAiTGFycyIgKTsKKyAgICAgICAgICAgIFNldFByb3AoIFBfQVJUSUNMRSwgMCApOworICAgICAgICAgICAgU2V0UHJvcCggUF9HRU5ERVIsIE1BTEUgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwbC0+cXVlcnlfaGNfcGxheSgpPjEpeworICAgICAgICAgICAgU2V0UHJvcCggUF9OQU1FLCAiVG9kIiApOworICAgICAgICAgICAgQ0hNQVNURVItPnNlbmQoIGthbmFsLCB0aGlzX29iamVjdCgpLCJOVU4gR0VIT0VSU1QgRFUgRlVFUiBFV0lHIE1JUiEiICk7CisgICAgICAgICAgICBTZXRQcm9wKCBQX05BTUUsICJMYXJzIiApOworICAgICAgICB9Cit9CisKK3B1YmxpYyBpbnQKK1NtYXJ0TG9nKCBzdHJpbmcgY3JlYXQsIHN0cmluZyBteW5hbWUsIHN0cmluZyBzdHIsIHN0cmluZyBkYXRlICkKK3sKKyAgICBpbnQgaTsKKyAgICBzdHJpbmcgZm47CisgICAgCisgICAgZm9yICggaSA9IHNpemVvZihwbGF5ZXJzKTsgaS0tOyApCisgICAgICAgIGlmICggcGxheWVyc1tpXVswXSA9PSB0aGlzX3BsYXllcigpICkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgLy8gU3BpZWxlciAoTWFnaWVyPykgaXN0IGluIGtlaW5lciBUb2Rlc3NlcXVlbnogLT4gbm9ybWFsZXMgUmVwZmlsZQorICAgIGlmICggaSA9PSAtMSApCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCAhKGZuID0gcGxheWVyc1tpXVs0XSkgKXsKKyAgICAgICAgLy8gU3BpZWxlciBoYXQgZWluZSB1bmJla2FubnRlIFRvZGVzc2VxdWVueiAoa2VpbiBGaWxlbmFtZSwgU2VxdWVuegorICAgICAgICAvLyB3dXJkZSBrb21wbGV0dCBpbiBQX0VORU1ZX0RFQVRIX1NFUVVFTkNFIGFiZ2VsZWd0KQorICAgICAgICBjcmVhdCA9ICJUT0QvdW5iZWthbm50LnJlcCI7CisgICAgICAgIGZuID0gInVuYmVrYW5udGUgVG9kZXNzZXF1ZW56IjsKKyAgICB9CisgICAgZWxzZQorICAgICAgICAvLyBKZWRlIFNlcXVlbnogbWl0IG5lbSBlaWdlbmVuIFJlcGZpbGUKKyAgICAgICAgY3JlYXQgPSAiVE9ELyIgKyBleHBsb2RlKCBmbiwgIi8iIClbPDFdICsgIi5yZXAiOworCisgICAgbG9nX2ZpbGUoIGNyZWF0LCBteW5hbWUgKyAiIHZvbiAiICsgZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSkKKyAgICAgICAgICAgICAgKyAiIFsiK2ZuKyJdICgiICsgZGF0ZSArICIpOlxuIiArIHN0ciArICJcbiIgKTsKKworICAgIHJldHVybiAxOworfQorCitwdWJsaWMgbWl4ZWQgaGllcl9nZWJsaWViZW4oIG1peGVkIGRlc3QsIGludCBtZXRob2RzLCBzdHJpbmcgZGlyZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGV4dG91dCwgc3RyaW5nIHRleHRpbiApIAoreworICAgIC8vIE1hZ2llciBkdWVyZmVuIFNwaWVsZXIgaGVyYXVzdHJhbnNlbgorICAgIGlmICggdGhpc19pbnRlcmFjdGl2ZSgpICYmIElTX0xFQVJORVIodGhpc19pbnRlcmFjdGl2ZSgpKSAmJgorICAgICAgICAgKHRoaXNfaW50ZXJhY3RpdmUoKSAhPSBwcmV2aW91c19vYmplY3QoKSB8fAorICAgICAgICAgIElTX0RFUFVUWSh0aGlzX2ludGVyYWN0aXZlKCkpKSApeworICAgICAgICBwcmV2aW91c19vYmplY3QoKS0+U2V0KCBQX1RNUF9NT1ZFX0hPT0ssIDAgKTsKKyAgICAgICAgcmV0dXJuICh7IGRlc3QsIG1ldGhvZHMsIGRpcmVjdGlvbiwgdGV4dG91dCwgdGV4dGluIH0pOworICAgIH0KKworICAgIC8vIFNwaWVsZXIgaGFlbmd0IG5vY2ggaW4gZGVyIFRvZGVzc2VxdWVuegorICAgIGZvciAoIGludCBpID0gc2l6ZW9mKHBsYXllcnMpOyBpLS07ICkKKyAgICAgICAgaWYgKCBvYmplY3RwKHBsYXllcnNbaV1bMF0pICYmIHByZXZpb3VzX29iamVjdCgpID09IHBsYXllcnNbaV1bMF0gJiYKKyAgICAgICAgICAgICBlbnZpcm9ubWVudChwcmV2aW91c19vYmplY3QoKSkgPT0gZmluZF9vYmplY3QoCisJICAiL3Jvb20vZGVhdGgvdmlydHVhbC9yb29tX2RlYXRoXyIgKyBnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpKSYmCisgICAgICAgICAgICAgaW50ZXJhY3RpdmUocHJldmlvdXNfb2JqZWN0KCkpICkgeworCSAgICAvLyBNb3ZlIG51ciBlcmxhdWJ0LCB3ZW5uIGRhcyBaaWVsIHdpZWRlciBkZXIgVG9kZXNyYXVtIGlzdC4KKwkgICAgLy8gd2VubiBtYWwgZnVlciBuZW4gYmVzdGltbXRlbiBad2Vja3MgQmV3ZWd1bmdlbiByYXVzIGF1cyBkZW0KKwkgICAgLy8gVG9kZXNyYXVtIGVyZm9yZGVybGljaCBzaW5kLCBzb2xsdGVuIGhpZXIgZW50c3ByZWNoZW5kZQorCSAgICAvLyBBdXNuYWhtZW4gZWluZ2ViYXV0IHdlcmRlbi4KKwkgICAgaWYgKCAoc3RyaW5ncChkZXN0KSAmJiAKKwkJICBkZXN0ID09IG9iamVjdF9uYW1lKGVudmlyb25tZW50KHByZXZpb3VzX29iamVjdCgpKSkpIHx8CisJCSAob2JqZWN0cChkZXN0KSAmJgorCQkgIGRlc3QgPT0gZW52aXJvbm1lbnQocHJldmlvdXNfb2JqZWN0KCkpKSApIHsKKwkJcHJldmlvdXNfb2JqZWN0KCktPlNldCggUF9UTVBfTU9WRV9IT09LLCAwICk7CisJCXJldHVybiAoeyBkZXN0LCBtZXRob2RzLCBkaXJlY3Rpb24sIHRleHRvdXQsIHRleHRpbiB9KTsKKwkgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgLy8gU3BpZWxlciBpc3QgbmljaHQgbWVociBpbSBSYXVtIG9kZXIgZWluZ2VzY2hsYWZlbgorICAgIGlmICggcHJldmlvdXNfb2JqZWN0KCkgKQorICAgICAgICBwcmV2aW91c19vYmplY3QoKS0+U2V0KCBQX1RNUF9NT1ZFX0hPT0ssIDAgKTsKKyAgICAKKyAgICByZXR1cm4gKHsgZGVzdCwgbWV0aG9kcywgZGlyZWN0aW9uLCB0ZXh0b3V0LCB0ZXh0aW4gfSk7Cit9CmRpZmYgLS1naXQgYS9yb29tL2RlYXRoL2RlYXRoX3Jvb21fdmMuYyBiL3Jvb20vZGVhdGgvZGVhdGhfcm9vbV92Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMDM4ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9yb29tL2RlYXRoL2RlYXRoX3Jvb21fdmMuYwpAQCAtMCwwICsxLDE2OCBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGRlYXRoX3Jvb21fdmMuYyAtLSBEYXMgU3RhbmRhcmRvYmpla3QgZnVlciBkZW4gVkMtVG9kZXNyYXVtCisvLworLy8gJElkOiBkZWF0aF9yb29tX3ZjLmMgODk4OCAyMDE0LTEyLTMxIDEzOjEwOjE5WiBaZXNzdHJhICQKKworCisjcHJhZ21hIHN0cmljdF90eXBlcworCisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPGRhZW1vbi5oPgorI2luY2x1ZGUgPG5ld19za2lsbHMuaD4KKworaW5oZXJpdCAiL3N0ZC9yb29tIjsKKworcHVibGljIGludCBub19hdHRhY2soKTsKK3B1YmxpYyBpbnQgbm9fcG9pc29uKGludCB2YWwpOworCitwdWJsaWMgdm9pZCBjcmVhdGUoKQoreworICBpZiAoSVNfQkxVRSh0aGlzX29iamVjdCgpKSkgcmV0dXJuOworICAgIDo6Y3JlYXRlKCk7CisgICAgCisgICAgU2V0UHJvcCggUF9HRU5ERVIsIE1BTEUgKTsKKyAgICBTZXRQcm9wKCBQX0FSVElDTEUsIDAgKTsKKyAgICBTZXRQcm9wKCBQX0xJR0hULDEgKTsKKyAgICBTZXRQcm9wKCBQX05PX1RQT1JULCBOT19UUE9SVF9PVVQgKTsKKyAgICBTZXRQcm9wKCBQX0xPR19GSUxFLCAiVE9EL1RvZGVzcmF1bSIgKTsKKyAgICBTZXRQcm9wKCBQX0lOVF9TSE9SVCwgIkFyYmVpdHN6aW1tZXIgZGVzIFRvZGVzIiApOworICAgIFNldFByb3AoIFBfSU5UX0xPTkcsIGJyZWFrX3N0cmluZygKKyAgICAgICAgICAgICAiRWluIGR1bmtsZXIgUmF1bSwgZXJsZXVjaHRldCB2b24gZHVua2xlbSBMaWNodCwgZGFzIHNpY2ggZGVyICIKKyAgICAgICAgICAgICAiRHVua2VsaGVpdCBuaWNodCBzbyBzZWhyIHp1IHdpZGVyc2V0emVuIHNjaGVpbnQsIGluZGVtIGVzICIKKyAgICAgICAgICAgICAibGV1Y2h0ZXQsIGFscyBkYXNzIGVzIGRlciBkdW5rZWxzdGUgUHVua3QgaW4gZWluZXIgd2VuaWdlciAiCisgICAgICAgICAgICAgImR1bmtsZW4gVW1nZWJ1bmcgaXN0LiBJbSBzZWx0c2FtZW4gTGljaHQgZXJrZW5uc3QgRHUgZWluZW4gIisKKyAgICAgICAgICAgICAiemVudHJhbCBhdWZnZXN0ZWxsdGVuIFNjaHJlaWJ0aXNjaCwgZGVyIG1pdCBEaWFncmFtbWVuIHVuZCAiCisgICAgICAgICAgICAgIkJ1ZWNoZXJuIGJlZGVja3QgaXN0LiBEaWUgV2FlbmRlIHZlcnNjaHdpbmRlbiBoaW50ZXIgUmVnYWxlbiwgIgorICAgICAgICAgICAgICJkaWUgZ2VmdWVsbHQgc2luZCBtaXQgaW4gTGVkZXIgZ2VidW5kZW5lbiwgZHVua2xlbiBXYWVsemVybiwgIgorICAgICAgICAgICAgICJ2b24gZGVuZW4gZ2VoZWltbmlzdm9sbGUgUnVuZW4gbGV1Y2h0ZW4uXG5Ub2QuIiwgNzgsIDAsIDEgKSApOworICAgIHByZXZpb3VzX29iamVjdCgpLT5DdXN0b21pemVPYmplY3QoKTsKKyAgICBjYWxsX290aGVyKCIvcm9vbS9kZWF0aC9kZWF0aF9yb29tIiwiPz8/Iik7Cit9CisKK3ZvaWQgdGVzdF9yZW1vdmUoKQoreworICBpZiAoIXNpemVvZihhbGxfaW52ZW50b3J5KHRoaXNfb2JqZWN0KCkpJnVzZXJzKCkpKQorICAgIGlmICghdGhpc19vYmplY3QoKS0+cmVtb3ZlKCkpIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOworfQorCitwdWJsaWMgdm9pZCByZXNldCgpCit7CisgIDo6cmVzZXQoKTsKKyAgdGVzdF9yZW1vdmUoKTsKKyAgcmV0dXJuOworfQorCitwdWJsaWMgdm9pZCBleGl0KG9iamVjdCBsaXYpCit7CisgIGNhbGxfb3V0KCJ0ZXN0X3JlbW92ZSIsMik7CisgIHJldHVybjsKK30KKworCitzdGF0aWMgdm9pZCBkZWVwX2Rlc3RydWN0KCBvYmplY3Qgb2IgKQoreworICAgIGlmICggb2JqZWN0cChvYikgJiYgZW52aXJvbm1lbnQob2IpID09IHRoaXNfb2JqZWN0KCkgKQorICAgICAgICBmaWx0ZXIoIGRlZXBfaW52ZW50b3J5KG9iKSArICh7IG9iIH0pLAorICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYSggKHsneC8qJyovfSksICh7IydkZXN0cnVjdCwgJ3h9KSApICk7Cit9CisKK3B1YmxpYyB2b2lkIGluaXQoKQoreyAgCisgIHN0cmluZyBwcmF5cm9vbTsKKyAgaW50IHJlczsKKworICA6OmluaXQoKTsKKyAgaWYgKCAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZSh0aGlzX3BsYXllcigpKSApeworICAgICAgY2FsbF9vdXQoICJkZWVwX2Rlc3RydWN0IiwgMCwgdGhpc19wbGF5ZXIoKSApOworICAgICAgcmV0dXJuOworICB9CisKKyAgaWYgKCAhKHByYXlyb29tID0gKHN0cmluZykgdGhpc19wbGF5ZXIoKS0+UXVlcnlQcmF5Um9vbSgpKSApCisgICAgICBwcmF5cm9vbSA9ICIvcm9vbS9wcmF5X3Jvb20iOworICAKKyAgaWYgKCAhdGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKFBfR0hPU1QpICkKKyAgICB7CisgICAgICBpZiAoIElTX1dJWkFSRCh0aGlzX3BsYXllcigpKSAmJgorICAgICAgICAgICB0aGlzX3BsYXllcigpLT5RdWVyeVByb3AoUF9XQU5UU19UT19MRUFSTikgKQorCXsKKyAgICAgICAgICBpZiAoICF0aGlzX3BsYXllcigpLT5RdWVyeVByb3AoUF9JTlZJUykgKQorICAgICAgICAgICAgICB0ZWxsX3Jvb20oIHRoaXNfb2JqZWN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIkRlciBUb2Qgc2FndDogV0FTIFdJTExTVCBEVSBISUVSLCAiKworICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyc3RyaW5nKChzdHJpbmcpIHRoaXNfcGxheWVyKCktPm5hbWUoKSkrIj9cbiIrCisgICAgICAgICAgICAgICAgICAgICAgICAgIkRlciBUb2Qgc2FndDogRFUgQklTVCBVTlNURVJCTElDSCwgRFUgSEFTVCBISUVSICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiTklDSFRTIFpVIFNVQ0hFTiFcblxuIiApOworCX0KKyAgICAgIGVsc2UgCisJeworICAgICAgICAgIHdyaXRlKCJEZXIgVG9kIHNhZ3Q6IFdBUyBUVVNUIERVIEhJRVI/IERFSU5FIFpFSVQgSVNUIE5PQ0ggIgorICAgICAgICAgICAgICAgICJOSUNIVCBSRUlGIVxuXG4iKTsKKyAgICAgICAgICAKKwkgIGlmICggY2F0Y2gocmVzID0gKGludCkgdGhpc19wbGF5ZXIoKS0+bW92ZSggcHJheXJvb20sTV9HT3xNX1NJTEVOVHxNX05PQ0hFQ0sgKSkKKyAgICAgICAgICAgICAgIHx8IHJlcyA8IDEgJiYgZW52aXJvbm1lbnQodGhpc19wbGF5ZXIoKSkgPT0gdGhpc19vYmplY3QoKSApCisgICAgICAgICAgICAgIHRoaXNfcGxheWVyKCktPm1vdmUoICIvcm9vbS9wcmF5X3Jvb20iLCBNX0dPfE1fU0lMRU5UfE1fTk9DSEVDSyApOworCX0KKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKCAhSVNfREVQVVRZKHRoaXNfcGxheWVyKCkpICl7CisgICAgYWRkX2FjdGlvbiggImZpbHRlcl9sZGZpZWQiLCAiIiwgMSApOworICAgIHRoaXNfcGxheWVyKCktPlNldCggUF9UTVBfTU9WRV9IT09LLAorICAgICAgICAgICAgICAgICAgICAgICAgKHsgdGltZSgpKzMxNTM2MDAwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRfb2JqZWN0KCIvcm9vbS9kZWF0aC9kZWF0aF9yb29tIiksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImhpZXJfZ2VibGllYmVuIiB9KSApOworICB9CisKKyAgdGhpc19wbGF5ZXIoKS0+U2V0KCBQX05PX0FUVEFDSywgIydub19hdHRhY2ssIEZfUVVFUllfTUVUSE9EICk7CisgIHRoaXNfcGxheWVyKCktPlNldCggUF9QT0lTT04sICMnbm9fcG9pc29uLCBGX1NFVF9NRVRIT0QgKTsKKyAgCisgICIvcm9vbS9kZWF0aC9kZWF0aF9yb29tIi0+YWRkX3BsYXllcih0aGlzX3BsYXllcigpKTsKK30KKworLy8gcHVibGljLCBkYSBjb21tYW5kX21lKCkgc29uc3QgYnVnZ3QgKFd1cnplbHMgU3BlZWR5IG8uYWUuKQorcHVibGljIGludCBmaWx0ZXJfbGRmaWVkKCBzdHJpbmcgc3RyICkKK3sKKyAgICAvLyBEZXNjcmlwdGlvbjogICBGaWx0ZXIgb3V0IHJlbGV2YW50IGNvbW1hbmRzLgorICAgIHN0cmluZyB2ZXJiOworICAgIAorICAgIHZlcmI9cXVlcnlfdmVyYigpOworICAgIAorICAgIGlmICggKHZlcmIgPT0gInNjaGxhZmUiIHx8IHZlcmIgPT0gInNjaGxhZiIpICYmIHN0ciA9PSAiZWluIiApeworICAgICAgICB3cml0ZSgiRFUgS0FOTlNUIERFTSBUT0QgTklDSFQgRU5UUklOTkVOIVxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAKKyAgICBpZiAoIHZlcmIgPT0gInR5cG8iIHx8IHZlcmIgPT0gImZlaGxlciIgfHwgdmVyYiA9PSAiYnVnIiB8fCB2ZXJiID09ICJpZGVlIiApCisgICAgICAgIHJldHVybiAwOworCisgICAgd3JpdGUoICJEZWluIEtvZXJwZXIgZ2Vob3JjaHQgRGlyIG5pY2h0ICFcbiIgKTsKKyAgICByZXR1cm4gMTsKK30KKworcHVibGljIGludCBub19hdHRhY2soKQoreworICBpbnQgaTsKKworICAvLyBTcGllbGVyIGhhZW5ndCBub2NoIGluIGRlciBUb2Rlc3NlcXVlbnoKKyAgaWYoIHByZXNlbnQocHJldmlvdXNfb2JqZWN0KCkpICkKKyAgICByZXR1cm4gMTsKKyAgZWxzZQorICAgIHByZXZpb3VzX29iamVjdCgpLT5TZXQoIFBfTk9fQVRUQUNLLCAwLCBGX1FVRVJZX01FVEhPRCApOworCisgIHJldHVybiAwOworfQorCitwdWJsaWMgaW50IG5vX3BvaXNvbihpbnQgdmFsKQoreworICBpZiAoIHZhbCAhPSAwICkKKyAgeworICAgIGNhdGNoKCByYWlzZV9lcnJvcigiUG9pc29uaW5nIGRlYWQgcGxheWVycyBpcyBpbGxlZ2FsLiBDYWxsaW5nIG9iamVjdCAiCisgICAgICAid2FzICIrb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KDEpKSsiXG4iKTtwdWJsaXNoICk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL3Jvb20vZGVhdGgvdmlydHVhbC92aXJ0dWFsX2NvbXBpbGVyLmMgYi9yb29tL2RlYXRoL3ZpcnR1YWwvdmlydHVhbF9jb21waWxlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwZDg4NmUKLS0tIC9kZXYvbnVsbAorKysgYi9yb29tL2RlYXRoL3ZpcnR1YWwvdmlydHVhbF9jb21waWxlci5jCkBAIC0wLDAgKzEsNDQgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyB2aXJ0dWFsX2NvbXBpbGVyLmMgLS0gVmlydHVlbGxlciBDb21waWxlciBmdWVyIGRpZSBUb2Rlc3JhZXVtZQorLy8KKy8vICRJZC4kCisKKworI3ByYWdtYSBzdHJvbmdfdHlwZXMKKworaW5oZXJpdCAiL3N0ZC92aXJ0dWFsL3ZfY29tcGlsZXIiOworCisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPHZfY29tcGlsZXIuaD4KKworaW50IE5vUGFyYU9iamVjdHMoKSB7cmV0dXJuIDE7fQorCit2b2lkIGNyZWF0ZSgpIAoreworICBpZiAoSVNfQ0xPTkUodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyA6OmNyZWF0ZSgpOworIFNldFByb3AoUF9TVERfT0JKRUNULCAiL3Jvb20vZGVhdGgvZGVhdGhfcm9vbV92YyIpOworIHNldGV1aWQoZ2V0dWlkKCkpOworIHJldHVybjsKK30KKworc3RyaW5nIFZhbGlkYXRlKHN0cmluZyBmaWxlKSB7CisgIHN0cmluZyBiYXNlLCByb29tLCB3aG87CisKKyBmaWxlID0gOjpWYWxpZGF0ZShmaWxlKTsKKyBpZihzc2NhbmYoZmlsZSwgImRlYXRoX3Jvb21fJXMiLHdobykhPTEgfHwKKyAgICAoKHdob1swLi4zXSE9Imdhc3QiKSAmJgorICAgICghIi9zZWN1cmUvbWFzdGVyIi0+Z2V0X3VzZXJpbmZvKHdobykpKSkgcmV0dXJuIDA7CisgcmV0dXJuIGZpbGU7Cit9CisKK21peGVkIEN1c3RvbWl6ZU9iamVjdCgpCit7Cisgc3RyaW5nIGJhc2Uscm9vbSx3aG8sZmlsZSxmdW47CisKKyBpZighKGZpbGUgPSA6OkN1c3RvbWl6ZU9iamVjdCgpKSB8fAorICAgICFWYWxpZGF0ZShmaWxlKSkgcmV0dXJuIDA7CisgcmV0dXJuIGZpbGU7Cit9CisKZGlmZiAtLWdpdCBhL3Jvb20vamFpbC5jIGIvcm9vbS9qYWlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMzMTIyMwotLS0gL2Rldi9udWxsCisrKyBiL3Jvb20vamFpbC5jCkBAIC0wLDAgKzEsMTkxIEBACisjcHJhZ21hIHN0cm9uZ190eXBlcyxydHRfY2hlY2tzCisKK2luaGVyaXQgIi9zdGQvcm9vbSI7Citpbmhlcml0ICIvc3RkL2hvb2tfY29uc3VtZXIiOworCisjZGVmaW5lIE9GRklDRSAiL2Qvd3Vlc3RlL2NhdHdlYXpsZS9yb29tL29mZmljZSIKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxob29rLmg+CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9MSUdIVCwgMSApOworICBTZXRQcm9wKFBfSU5UX1NIT1JULCJFaW5lIEdlZmFlbmduaXN6ZWxsZSIpOworICBTZXRQcm9wKFBfSU5UX0xPTkcsIGJyZWFrX3N0cmluZygKKyAgICAgICJEaWUgWmVsbGUgaXN0IGFic29sdXQgZWludG9lbmlnIHVuZCBoYXQga2VpbmUgRmVuc3Rlci4gTGFuZ2UgaGllciBkcmluIgorICAgICAgInp1IHNpdHplbiBpc3QgYmVzdGltbXQgbmljaHQgYW5nZW5laG0uIFdlbm4gZHUgaGllciBoZXJhdXMgd2lsbHN0LCAiCisgICAgICAia2FubnN0IER1IHdvaGwgbnVyIGRlbiBTaGVyaWZmLCBzZWluZW4gU3RlbGx2ZXJ0cmV0ZXIgb2RlciBlaW5lbiAiCisgICAgICAiRXJ6bWFnaWVyIGRhcnVtIGJpdHRlbi4iLDc4KSk7CisgIFNldFByb3AoUF9JTkRPT1JTLDEpOworfQorCit2b2lkIGluaXQoKQoreworICA6OmluaXQoKTsKKyAgaWYgKCFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHRoaXNfcGxheWVyKCkpKQorICAgIHJldHVybjsKKyAgaWYgKCBJU19ERVBVVFkodGhpc19wbGF5ZXIoKSkgKSAvLyBFTSsgc2luZCBzb3dpZXNvIERlcHV0aWVzCisgICAgcmV0dXJuOworICBhZGRfYWN0aW9uKCJibGEiLCIiLDEpOworICBpbnB1dF90bygibXVya3MiLDApOworCisgIC8vIE1vdmUtSG9vayBhbmhhZW5nZW4KKyAgaW50IHJldCA9IHRoaXNfcGxheWVyKCktPkhSZWdpc3RlclRvSG9vayhIX0hPT0tfTU9WRSwgdGhpc19vYmplY3QoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIX0hPT0tfTElCUFJJTygxKSxIX0hPT0tfU1VSVkVZT1IsCisJCQkJIC0xKTsKKyAgaWYgKCByZXQgPD0wICkKKyAgICAgIHJhaXNlX2Vycm9yKCJGZWhsZXI6IE1vdmUtSG9vayBrb25udGUgbmljaHQgcmVnaXN0cmllcnQgd2VyZGVuLiAiCisgICAgICAgICAgICAgICAgICAiSFJlZ2lzdGVyVG9Ib29rLUVyZ2VibmlzOiAiICsgcmV0ICsgIlxuIik7Cit9CisKKy8vIE1vdmUtSG9vayBhdXN0cmFnZW4uCit2b2lkIGV4aXQob2JqZWN0IGxpdikgeworICBpZiAob2JqZWN0cChsaXYpICYmICFJU19ERVBVVFkobGl2KSkKKyAgICBsaXYtPkhVbnJlZ2lzdGVyRnJvbUhvb2soSF9IT09LX01PVkUsdGhpc19vYmplY3QoKSk7Cit9CisKK2ludCBibGEoKQoreworICBzdHJpbmcgdjsKKworICB2PXF1ZXJ5X3ZlcmIoKTsKKyAgaW5wdXRfdG8oIm11cmtzIiwwKTsKKyAgLy8gc2FnZW4gdW5kIHNjaGxhZmVuIGVybGF1YnQuCisgIGlmIChzdHJpbmdwKHYpICYmICh2PT0ic2FnInx8dj09InNhZ2UifHx2WzBdPT0nXCcnCisgICAgICAgIHx8dj09InNjaGxhZmUifHx2PT0ic2NobGFmIikpCisgICAgICByZXR1cm4gMDsKKyAgd3JpdGUoIk5peCBkYS5cbiIpOworICByZXR1cm4gMTsKK30KKworaW50IG11cmtzKHN0cmluZyBzdHIpCit7CisgIGlmICghdGhpc19wbGF5ZXIoKSB8fCBlbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKSE9dGhpc19vYmplY3QoKSkgCisgICAgICByZXR1cm4gMDsKKworICBpbnB1dF90bygibXVya3MiLDApOworCisgIGlmICghc3RyfHxzdHI9PSIiKSByZXR1cm4gMTsKKyAgLy8gRWluc2NobGFmZW4gZXJsYXVidC4KKyAgaWYgKHN0ciA9PSAic2NobGFmZSBlaW4iKSB7CisgICAgICB0aGlzX3BsYXllcigpLT5jb21tYW5kKCJzY2hsYWZlIGVpbiIpOworICAgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKHN0clswXT09J1wnJykgc3RyPSJzYWcgIitzdHJbMS4uXTsKKyAgaWYoc3RyWzAuLjNdPT0ic2FnICJ8fHN0clswLi40XT09InNhZ2UgIikKKyAgeworICAgICAgIHN0cj1pbXBsb2RlKG9sZF9leHBsb2RlKHN0ciwiICIpWzEuLl0sIiAiKTsKKyAgICAgd3JpdGUoYnJlYWtfc3RyaW5nKHN0ciwgNzgsICJEdSBzYWdzdDogIikpOworICAgICB0ZWxsX3Jvb20odGhpc19vYmplY3QoKSxicmVha19zdHJpbmcoc3RyLDc4LAorICAgICAgICAgY2FwaXRhbGl6ZSh0aGlzX3BsYXllcigpLT5uYW1lKCkpKyIgc2FndDogIiksKHt0aGlzX3BsYXllcigpfSkpOworICAgICByZXR1cm4gMTsKKyAgfQorICB3cml0ZSgiTml4IGRhLlxuIik7CisgIHJldHVybiAxOworfQorCitwdWJsaWMgdmFyYXJncyBpbnQgcmVtb3ZlKGludCBzaWxlbnQpIHsKKyAgLy8ga2VpbmUgWmVyc3RvZXJ1bmcsIHdlbm4gU3BpZWxlciBkcmluIHNpbmQuCisgIGlmIChzaXplb2YoZmlsdGVyKGFsbF9pbnZlbnRvcnkoKSwjJ3F1ZXJ5X29uY2VfaW50ZXJhY3RpdmUpKSkKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gOjpyZW1vdmUoMSk7Cit9CisKK3B1YmxpYyBzdHJpbmcgTm90aWZ5RGVzdHJ1Y3Qob2JqZWN0IGNhbGxlcikgeworCisgIGlmIChwcmV2aW91c19vYmplY3QoKSAhPSBtYXN0ZXIoKQorICAgICAgfHwgY2FsbGVyID09IHRoaXNfb2JqZWN0KCkpCisgICAgcmV0dXJuIDA7CisKKyAgLy8gd2VubiBrZWluZXIgaGllciBpc3QsIGlzdHMgZWdhbC4KKyAgaWYgKCFzaXplb2YoZmlsdGVyKGFsbF9pbnZlbnRvcnkoKSwjJ3F1ZXJ5X29uY2VfaW50ZXJhY3RpdmUpKSkKKyAgICByZXR1cm4gMDsKKworICAvLyBEaXJla3RlciBEZXN0cnVjdCBtaXQgQW53ZXNlbmRlbiBudXIgZnVlciBFTSsKKyAgaWYgKCFwcm9jZXNzX2NhbGwoKSAmJiB0aGlzX2ludGVyYWN0aXZlKCkKKyAgICAgICYmIElTX0FSQ0godGhpc19pbnRlcmFjdGl2ZSgpKSkKKyAgICByZXR1cm4gMDsKKyAgICAgIAorICByZXR1cm4gIkRpcmVrdGUgWmVyc3RvZXJ1bmcgZGVzIEphaWxzIG51ciBmdWVyIEVNKyBlcmxhdWJ0LlxuIjsKK30KKworCisvLyBrZWluZSBhbmRlcmVuIE1vdmUtSG9va3MgZXJsYXVidCBhdXNzZXIgZGllc2VtLi4uCitzdGF0dXMgSG9va1JlZ2lzdHJhdGlvbkNhbGxiYWNrKG9iamVjdCByZWdpc3RyaW5nT2JqZWN0LCBpbnQgaG9va2lkLCBvYmplY3QKKyAgICBob29rU291cmNlLCBpbnQgcmVnaXN0cmluZ09iamVjdHNQcmlvcml0eSwgaW50IHJlZ2lzdHJpbmdPYmplY3RzVHlwZSkKK3sKKyAgICBpZiAoaG9va2lkPT1IX0hPT0tfTU9WRSkKKyAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIDE7Cit9CitzdGF0dXMgSG9va0NhbmNlbEFsbG93YW5jZUNhbGxiYWNrKG9iamVjdCBjYW5jZWxsaW5nT2JqZWN0LCBpbnQgaG9va2lkLCBvYmplY3QKKyAgICBob29rU291cmNlLCBpbnQgY2FuY2VsbGluZ09iamVjdHNQcmlvcml0eSwgbWl4ZWQgaG9va0RhdGEpCit7CisgICAgaWYgKGhvb2tpZD09SF9IT09LX01PVkUgJiYgY2FuY2VsbGluZ09iamVjdCAhPSB0aGlzX29iamVjdCgpCisgICAgICAgICYmIHByZXNlbnQoaG9va1NvdXJjZSx0aGlzX29iamVjdCgpKSkKKyAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXR1cyBIb29rTW9kaWZpY2F0aW9uQWxsb3dhbmNlQ2FsbGJhY2sob2JqZWN0IG1vZGlmeWluZ09iamVjdCwgaW50IGhvb2tpZCwKKyAgICBvYmplY3QgaG9va1NvdXJjZSwgaW50IG1vZGlmeWluZ09iamVjdHNQcmlvcml0eSwgbWl4ZWQgaG9va0RhdGEpCit7CisgICAgaWYgKGhvb2tpZD09SF9IT09LX01PVkUgJiYgbW9kaWZ5aW5nT2JqZWN0ICE9IHRoaXNfb2JqZWN0KCkKKyAgICAgICAgJiYgcHJlc2VudChob29rU291cmNlLHRoaXNfb2JqZWN0KCkpKQorICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gMTsKK30KKworbWl4ZWQgSG9va0NhbGxiYWNrKG9iamVjdCBob29rU291cmNlLCBpbnQgaG9va2lkLCBtaXhlZCBob29rRGF0YSkKK3sKKyAgLy8gbnVyIG1vdmUgaG9va3Mgc2luZCBpbnRlcmVzc2FudCBoaWVyLgorICBpZiAoaG9va2lkICE9IEhfSE9PS19NT1ZFKQorICAgIHJldHVybiAoe0hfTk9fTU9ELCBob29rRGF0YX0pOworCisgIC8vIGRhcyBkdWVyZnRlIGVpZ2VudGxpY2ggbmljaHQgdm9ya29tbWVuLCBkYSBkZXIgSG9vayBpbSBleGl0KCkgZ2Vsb2VzY2h0CisgIC8vIHdpcmQuLi4KKyAgaWYgKGVudmlyb25tZW50KGhvb2tTb3VyY2UpICE9IHRoaXNfb2JqZWN0KCkpIHsKKyAgICBob29rU291cmNlLT5IVW5yZWdpc3RlckZyb21Ib29rKEhfSE9PS19NT1ZFLHRoaXNfb2JqZWN0KCkpOworICAgIHJldHVybiAoe0hfTk9fTU9ELCBob29rRGF0YX0pOworICB9CisKKyAgLy8gQmV3ZWd1bmdlbiBpbiBkZW4gTmV0enRvdGVucmF1bSBzaW5kIG9rLgorICBpZiAoIWludGVyYWN0aXZlKGhvb2tTb3VyY2UpCisgICAgICAmJiBwb2ludGVycChob29rRGF0YSkgJiYgc2l6ZW9mKGhvb2tEYXRhKSA+PSAxKQorICB7CisgICAgaWYgKChvYmplY3RwKGhvb2tEYXRhWzBdKQorICAgICAgICAgICYmIG9iamVjdF9uYW1lKGhvb2tEYXRhWzBdKSA9PSAiL3Jvb20vbmV0enRvdCIpCisgICAgICAgIHx8IChzdHJpbmdwKGhvb2tEYXRhWzBdKSAmJiBob29rRGF0YVswXT09Ii9yb29tL25ldHp0b3QiKQorICAgICAgICApCisgICAgeworICAgICAgcmV0dXJuICh7SF9OT19NT0QsIGhvb2tEYXRhfSk7CisgICAgfQorICB9CisKKyAgLy8gRGVwdXR5IChvZGVyIGhvZWhlciksIGtlaW4gcHJvY2Vzc19jYWxsKCkuIFNvbnN0IHdpcmQgZGllIEJld2VndW5nCisgIC8vIGFiZ2Vicm9jaGVuLgorICBpZiAoIXRoaXNfaW50ZXJhY3RpdmUoKSB8fCAhSVNfREVQVVRZKHRoaXNfaW50ZXJhY3RpdmUoKSkpCisgIHsKKyAgICAgIHJldHVybiAoe0hfQ0FOQ0VMTEVELCBob29rRGF0YX0pOworICB9CisKKyAgcmV0dXJuICh7SF9OT19NT0QsIGhvb2tEYXRhfSk7Cit9CisKKy8vIHdlbm4gaGllciBqZW1hbmQgZHVyY2ggWmVyc3RvZXJ1bmcgZGVzIE9iamVrdGVzIHJhdXNrb21tZW4gd2lsbCwgZ2VodCBkYXMKKy8vIHNjaGllZi4KK3ZhcmFyZ3Mgdm9pZCBOb3RpZnlSZW1vdmUob2JqZWN0IG9iKSB7CisgIGlmIChvYmplY3RwKG9iKSAmJiBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iKSAmJiAhSVNfREVQVVRZKG9iKSkKKyAgeworICAgIG9iLT5TZXRQcm9wKFBfU1RBUlRfSE9NRSwiL3Jvb20vamFpbCIpOworICAgIG9iLT5zYXZlX21lKDApOworICB9Cit9CisKZGlmZiAtLWdpdCBhL3Jvb20vbXVlbGxyYXVtLmMgYi9yb29tL211ZWxscmF1bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYzRkMjIKLS0tIC9kZXYvbnVsbAorKysgYi9yb29tL211ZWxscmF1bS5jCkBAIC0wLDAgKzEsNjcgQEAKK2luaGVyaXQgInN0ZC9yb29tIjsKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX0xJR0hULCAxICk7CisgIFNldFByb3AoUF9JTlRfU0hPUlQsICJEZXIgTXVlbGxyYXVtIiApOworICBTZXRQcm9wKFBfSU5ET09SUywgMSk7CisgIFNldFByb3AoUF9ORVZFUl9DTEVBTiwgMSk7CisgIFNldFByb3AoUF9JTlRfTE9ORyxicmVha19zdHJpbmcoCisgICAgIkRpZXNlciBSYXVtIGlzdCB2b2xsa29tbWVuIGxlZXIgdW5kIGFuc2NoZWluZW5kIHJpaWlpaWllc2lnIGdyb3NzLiAiCisgICAgIkR1IGthbm5zdCBzZWluZSBBdXNzbWFzc2UgbmljaHRtYWxzIGFic2NoYWV0emVuLiBOYWphLiBNdXNzIHdvaGwgYXVjaCAiCisgICAgInNvIHNlaW4sIGRlbm4gaGllciBrb21tZW4gYWxsZSBDbG9uZXMgcmVpbiwgZGllIGVpbmlnZSBTZWt1bmRlbiAiCisgICAgIm5hY2ggaWhyZXIgRXJzdGVsbHVuZyBub2NoIGtlaW4gWnVoYXVzZSAoRW52aXJvbm1lbnQpIGdlZnVuZGVuIGhhYmVuLiAiCisgICAgIldlbm4gRHUgZGFzIG1hZ2lzY2hlIEtvbW1hbmRvICd3ZWx0JyBnaWJzdCwgd2lyc3QgRHUgd2llZGVyIGluIERlaW5lIFdlbHRcbiIKKyAgICAienVydWVja3ZlcnNldHp0IHdlcmRlbi4iKSk7CisgIEFkZEV4aXQoIndlbHQiLCAiL2dpbGRlbi9hYmVudGV1cmVyIik7Cit9CisKKy8vIHJla3Vyc2l2IHplcnN0b2VyZW4KK3ByaXZhdGUgdm9pZCByZWNfcmVtb3ZlKG9iamVjdCBvYikgeworICBvYmplY3QgKmludj1hbGxfaW52ZW50b3J5KG9iKTsKKyAgaWYgKHNpemVvZihpbnYpKSB7CisgICAgZmlsdGVyKGludiwgIydyZWNfcmVtb3ZlKTsKKyAgfQorICBvYi0+cmVtb3ZlKDEpOworICBpZiAob2JqZWN0cChvYikpIGRlc3RydWN0KG9iKTsKK30KKworaW50IGNsZWFuX21lKCkgeworICBvYmplY3QgKmludj1hbGxfaW52ZW50b3J5KHRoaXNfb2JqZWN0KCkpOworICBpbnQgaXNpemU9c2l6ZW9mKGludik7CisgIGlmIChpc2l6ZT4xMDApIHsKKyAgICAvL2FlbHRlc3RlcyBPYmpla3QsIHdhcyBrZWluIFNwaWVsZXIgaXN0LCB6ZXJzdG9lcmVuLiBQcnVlZnVuZyBhdWYgU3BpZWxlcgorICAgIC8vaXN0IFBhcmFub2lhLCBlaWdlbnRsaWNoIHNvbGx0ZSBoaWVyIG5pZSBlaW5lciBoaW5rb21tZW4ga29lbm5lbiwgYXVzc2VyCisgICAgLy9tYWdpZXIsIHVuZCB1bSBkaWUgd2FlcnMgZGFubiBuaWNodCBzY2hhZGUuICpnKgorICAgIGZvciAoaXNpemUtLTsgaXNpemUtLTsgKSB7CisgICAgICBpZiAoIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoaW52W2lzaXplXSkpIHsKKwlyZWNfcmVtb3ZlKGludltpc2l6ZV0pOworCXJldHVybigxKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3ZhcmFyZ3MgaW50IFByZXZlbnRJbnNlcnQob2JqZWN0IHBsKSB7CisKKyAgaWYgKCFvYmplY3RwKHBsKSkKKyAgICByZXR1cm4gMTsKKyAgY2xlYW5fbWUoKTsKKyAgcmV0dXJuIDA7Cit9CisKK3ZhcmFyZ3MgaW50IFByZXZlbnRJbnNlcnRMaXZpbmcob2JqZWN0IHBsKSB7CisKKyAgLy8ga2VpbmUgU3BpZWxlci4gOy0pCisgIGlmICghb2JqZWN0cChwbCkgfHwgCisgICAgICAocXVlcnlfb25jZV9pbnRlcmFjdGl2ZShwbCkgJiYgIUlTX0xFQVJORVIocGwpKSkKKyAgICByZXR1cm4gMTsKKworICBjbGVhbl9tZSgpOworICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvcm9vbS9uZXR6dG90LmMgYi9yb29tL25ldHp0b3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDFjNDZiCi0tLSAvZGV2L251bGwKKysrIGIvcm9vbS9uZXR6dG90LmMKQEAgLTAsMCArMSw5MiBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vICRJZDogbmV0enRvdC5jIDg3NDcgMjAxNC0wNC0yNiAxMzowODo0N1ogWmVzc3RyYSAkCisKKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKworY3JlYXRlKCkKK3sKKyAgY2FsbF9vdXQoImludmNoZWNrIiwxMjApOworICAiL29iai9zcGVycmVyIi0+Tml4R2lidHMoKTsKK30KKword2VnKG9iKQoreworICBpZiAoIW9iamVjdHAob2IpKQorICAgIHJldHVybjsKKyAgb2ItPnJlbW92ZSgpOworICBpZiAob2IpCisgICAgZGVzdHJ1Y3Qob2IpOworfQorCit3ZWdyYWV1bWVuKG9iKQoreworICBvYmplY3QgKng7CisgIAorICBpZiAoIW9iamVjdHAob2IpKQorICAgIHJldHVybjsKKyAgZm9yICh4PWRlZXBfaW52ZW50b3J5KG9iKTtzaXplb2YoeCk7eD14WzEuLl0pCisgICAgd2VnKHhbMF0pOworICBvYi0+bW92ZSgiL3Jvb20vdm9pZCIsTV9OT0NIRUNLfE1fU0lMRU5UKTsKKyAgd2VnKG9iKTsKK30KKworaW52Y2hlY2soKQoreyAKKyAgd2hpbGUocmVtb3ZlX2NhbGxfb3V0KCJpbnZjaGVjayIpIT0tMSk7CisgIGZvcmVhY2gob2JqZWN0IG9iOiBhbGxfaW52ZW50b3J5KHRoaXNfb2JqZWN0KCkpKQorICB7CisgICAgaWYgKGludGVyYWN0aXZlKG9iKSkKKyAgICB7CisgICAgICBjYXRjaCh0aGlzX3BsYXllcigpLT5tb3ZlKCIvcm9vbS92b2lkIixNX0dPKSk7CisgICAgICBzZXRfb2JqZWN0X2hlYXJ0X2JlYXQob2IsMSk7CisgICAgfQorICAgIGVsc2UgaWYgKCFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iKSAmJiBvYmplY3RfbmFtZShvYikhPSIvb2JqL3NwZXJyZXIiKQorICAgICAgY2FsbF9vdXQoIndlZ3JhZXVtZW4iLDEsb2IpOworICB9CisgIGNhbGxfb3V0KCJpbnZjaGVjayIsMTIwKTsKKyAgIi9vYmovc3BlcnJlciItPnVwZCgpOworfQorCitpbml0KCkKK3sKKyAgaWYgKCF0aGlzX3BsYXllcigpKQorICAgIHJldHVybjsKKyAgY2F0Y2godGhpc19wbGF5ZXIoKS0+U3RvcEh1bnRpbmdNb2RlKCkpOworICBpZiAoaW50ZXJhY3RpdmUodGhpc19wbGF5ZXIoKSkpCisgICAgY2F0Y2godGhpc19wbGF5ZXIoKS0+bW92ZSgiL3Jvb20vdm9pZCIsTV9HTykpOworICBpZiAoIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUodGhpc19wbGF5ZXIoKSkpCisgIHsKKyAgICB0aGlzX3BsYXllcigpLT5yZW1vdmUoKTsKKyAgICBpZih0aGlzX3BsYXllcigpKQorICAgICAgZGVzdHJ1Y3QodGhpc19wbGF5ZXIoKSk7CisgIH0KKyAgc2V0X29iamVjdF9oZWFydF9iZWF0KHRoaXNfcGxheWVyKCksMCk7Cit9CisKK2ludF9sb25nKCkKK3sKKyAgcmV0dXJuICJEaWVzIGlzdCBkZXIgTmV0enRvdGVucmF1bS4gRXMgaXN0IGR1bmtlbC4gRHUgc2llaHN0IG5pY2h0cy5cbiI7Cit9CisKK2ludF9zaG9ydCgpCit7CisgIHJldHVybiAiTmljaHRzIHp1IHNlaGVuLlxuIjsKK30KKworUXVlcnlQcm9wKHN0cmluZyBzdHIpCit7CisgIHN3aXRjaCAoc3RyKSB7CisgICAgY2FzZSAiaW50X2xvbmciOiByZXR1cm4gaW50X2xvbmcoKTsKKyAgICBjYXNlICJpbnRfc2hvcnQiOiByZXR1cm4gaW50X3Nob3J0KCk7CisgIH0KK30KKworLy8gTmljaHQgamVkZXIgTWFnaWVyIGRhcmYgZGVuIE5ldHp0b3RlbnJhdW0gZW50c29yZ2VuLgorc3RyaW5nIE5vdGlmeURlc3RydWN0KG9iamVjdCBjYWxsZXIpIHsKKyAgICBpZiggKGNhbGxlciE9dGhpc19vYmplY3QoKSAmJiAhQVJDSF9TRUNVUklUWSkgfHwgcHJvY2Vzc19jYWxsKCkgKSB7CisgICAgICByZXR1cm4gIkR1IGRhcmZzdCBkZW4gTmV0enRvdGVucmF1bSBuaWNodCB6ZXJzdG9lcmVuIVxuIjsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3Jvb20vbmlydmFuYS5jIGIvcm9vbS9uaXJ2YW5hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE2NjA3NAotLS0gL2Rldi9udWxsCisrKyBiL3Jvb20vbmlydmFuYS5jCkBAIC0wLDAgKzEsMTMyIEBACisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorCitpbmhlcml0ICJzdGQvcm9vbSI7CisKK2NyZWF0ZSgpIHsKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX0lORE9PUlMsIDEpOworICBTZXRQcm9wKFBfTElHSFQsMSk7CisgIFNldFByb3AoUF9JTlRfTE9ORywKKyJEdSBiZWZpbmRlc3QgRGljaCBpbSBOaXJ2YW5hIVxuIisKKyJFcyBzaWVodCBhbmRlcnMgYXVzIGFscyBEdSBlcyBEaXIgdm9yZ2VzdGVsbHQgaGFzdC4gRWluZSByaWVzaWdlIEhhbGxlIFxuIisKKyJtaXQgV2FlbmRlbiBhdXMgTmViZWwsIGVpbmVtIEJvZGVuIGF1cyBXYXNzZXIgdW5kIGVpbmVyIERlY2tlIGF1cyBGZXVlclxuIisKKyJiaWxkZXQgZGFzIEhlaW0gZGVyIGV3aWcgVmVyc3RvcmJlbmVuLlxuIisKKyJTdGlsbGUgaGVycnNjaHQgaGllci4gR3Jvc3NlIFN0aWxsZS4gU1RJTExFIHNvenVzYWdlbi5cbiIrCisiUmF1Y2ggZHVyY2h6aWVodCBkaWUgTHVmdC4gRXIgZW50c3ByaW5ndCBlaW5lciBSYWV1Y2hlcnNjaGFsZSwgd2VsY2hlIGF1ZlxuIisKKyJlaW5lbSByaWVzaWdlbiBBbHRhciBtaXR0ZW4gaW0gTmlydmFuYSBzdGVodC5cbiIrCisiRHUgYmlzdCBudW4gd29obCB3aXJrbGljaCB0b3QuXG4iKTsKKyAgU2V0UHJvcChQX0lOVF9TSE9SVCwiSW0gTmlydmFuYSIpOworICBTZXRQcm9wKFBfTk9fVFBPUlQsTk9fVFBPUlQpOworICBTZXRQcm9wKFBfTk9fUEFSQV9UUkFOUyk7CisgIAorICBBZGREZXRhaWwoImFsdGFyIiwKKyJEZXIgQWx0YXIgZGVyIHZlcnp3ZWlmZWx0ZW4gVG90ZW4uIEVyIGJlc3RlaHQgdm9sbHN0YWVuZGlnIGF1cyBncmluc2VuZGVuICIrCisiVG90ZW5zY2hhZWRlbG4gdW5kIGJpZXRldCBrZWluZXJsZWkgSG9mZm51bmcuXG5FaW5lIFJhZXVjaGVyc2NoYWxlIHN0ZWh0IGF1ZiBkZW0gQWx0YXIuXG4iKTsKKworICBBZGREZXRhaWwoKHsidG90ZSIsInRvdGVuIiwidmVyc3RvcmJlbmUifSksCisiRGllcyBoaWVyIGlzdCBkYXMgSGVpbSBkZXIgVG90ZW4uXG5EdSB3b2huc3QgaGllci5cbiIpOworCisgIEFkZERldGFpbCgoeyJob2ZmbnVuZyJ9KSwKKyJIQUhBLCBLRUlORSBIT0ZGTlVORyFcbiIpOworCisgIEFkZERldGFpbCgoeyJzY2hhZWRlbCIsInRvdGVuc2NoYWVkZWwifSksCisiU2llIGdyaW5zZW4gRGljaCBoYWVtaXNjaCBhbiBhbHMgd29sbHRlbiBzaWUgZGljaCB2ZXJzcG90dGVuLlxuIisKKyJBdWYgZWluZW0gU2NoYWRlbCBlcmtlbm5zdCBEdSBlaW5lIEluc2NocmlmdC5cbiIpOworCisgIEFkZERldGFpbCgoeyJpbnNjaHJpZnQifSksCisiRHUga2FubnN0IHNpZSBsZXNlbi5cbiIpOworCisgIEFkZFJlYWREZXRhaWwoKHsiaW5zY2hyaWZ0In0pLAorIkRJRVMgSVNUIEtFSU4gQVBSSUxTQ0hFUlouXG4iKTsKKworICBBZGREZXRhaWwoKHsic2NoYWxlIiwicmFldWNoZXJzY2hhbGUifSksCisiQXVzIGRlciBTY2hhbGUgZW50c3RlaWd0IGR1bmtsZXIgUmF1Y2gsIGRlciBkaWUgTHVmdCB1bmhlaWx2b2xsIHNjaHdhZW5nZXJ0LlxuIik7CisKKworICBBZGREZXRhaWwoKHsibHVmdCJ9KSwKKyJMdWZ0IHdhciBlaW5tYWwgbGViZW5zbm90d2VuZGlnLiBEdSBicmF1Y2hzdCBzaWUgbmljaHQgbWVoci5cbiIpOworCisgIEFkZERldGFpbCgoeyJyYXVjaCJ9KSwKKyJEZXIgUmF1Y2ggdmVyZHVua2VsdCBkaWUgTHVmdC4gRXIgd3VlcmRlIGplZGVuIExlYmVuZGVuIGVyc3RpY2tlbiwgYWJlciBkYXMgc2NocmVja3QgRGljaCBuaWNodCBtZWhyLlxuIik7CisKKyAgQWRkRGV0YWlsKCh7InN0aWxsZSJ9KSwKKyJTaWUgaG9lcnQgc2ljaCBpcmdlbmR3aWUgdG90IHVuZCBlbmRndWVsdGlnIGFuLlxuIik7CisKKyAgQWRkRGV0YWlsKCh7Im5pcnZhbmEiLCJyYXVtIn0pLAorIlNjaGF1IERpY2ggbnVyIHVtLlxuIik7CisKKyAgQWRkRGV0YWlsKCh7ImxlYmVuZGUifSksCisiWnUgZGVuZW4gZ2Vob2Vyc3QgRHUgbmljaHQgbWVoci5cbiIpOworCisgIEFkZERldGFpbCgoeyJuZWJlbCJ9KSwKKyJEZXIgTmViZWwgYmVncmVuenQgZGFzIE5pcnZhbmEgc2VpdGxpY2guIEVyIGZvcm10IGRpZSBXYWVuZGUuXG4iKTsKKworICBBZGREZXRhaWwoKHsid2Fzc2VyIn0pLAorIkRlciBCb2RlbiBkZXMgTmlydmFuYXMgc2NoZWludCBhdXMgV2Fzc2VyIHp1IGJlc3RlaGVuLiBEdSBiaXN0IHRvdCB1bmQgZ2Voc3QgZGFoZXIgbmljaHQgdW50ZXIuXG4iKTsKKworICBBZGREZXRhaWwoKHsiZmV1ZXIifSksCisiRGllIERlY2tlIGRlcyBOaXJ2YW5hcyBsb2RlcnQgRGlyIGZldXJpZyBlbnRnZWdlbi4gV2FlcmVzdCBEdSBhbSBMZWJlbiwgd3VlcmRlIERpY2ggZGFzIGJldW5ydWhpZ2VuLlxuIik7CisKKyAgQWRkRGV0YWlsKCh7ImhhbGxlIn0pLAorIkRpZSBIYWxsZSBkZXIgVG90ZW4uIERhcyBOaXJ2YW5hLlxuIik7CisKKyAgQWRkRGV0YWlsKCh7ImhlaW0ifSksCisiRGFzIEhlaW0gZGVyIFRvdGVuIGlzdCBkYXMgTmlydmFuYS4gRGVpbiBIZWltLlxuIik7CisKKworICBBZGREZXRhaWwoKHsiYm9kZW4ifSksCisiRGVyIEJvZGVuIHdhYmVydCB1bnRlciBEaXIuIE1hbmNobWFsIG1laW5zdCBEdSBkYXMgR2VzaWNodCBKb2ZzIHp1IGVya2VubmVuLlxuIik7CisKKyAgQWRkRGV0YWlsKCh7Imdlc2ljaHQifSksCisiR2VzaWNodGVyIHNpbmQgZnVlciBEaWNoIG5pY2h0IG1laHIgd2ljaHRpZy5cbiIpOworCisgIEFkZERldGFpbCgoeyJqb2YifSksCisiRXIgc2NobGFlZnQuXG4iKTsKKworCisgIEFkZERldGFpbCgoeyJkZWNrZSJ9KSwKKyJEaWUgRGVja2UgbG9kZXJ0IERpciBlbnRnZWdlbi4gQWJ1bmR6dSBtZWluc3QgRHUgUnVtYXRhIHp1IGVya2VubmVuLlxuIik7CisKKyAgQWRkRGV0YWlsKCh7InJ1bWF0YSJ9KSwKKyJFciBpc3Qgd29obCBkb2NoIG5pY2h0IGRhLiBOaWVtYW5kIHdpcmQgRGlyIGhlbGZlbi4gRXMgaXN0IGF1cy5cbiIpOworCisgIEFkZERldGFpbCgoeyJ3YW5kIiwid2FlbmRlIn0pLAorIkRlciBOZWJlbCB3YWJlcnQgYXVmIHVuZCBhYi4gTWFuY2htYWwgc2NoZWludCBlcyBzbywgYWxzIHdhbmRlcmUgWm9vayBkdXJjaCBkZW4gTmViZWwuXG4iKTsKKworCisgIEFkZERldGFpbCgoeyJ6b29rIn0pLAorIkVyIGdyaW5zdCBEaWNoIGFuLiBEYXMgaXN0IHdvaGwgZGFzIEVuZGUgZGVyIEhvZmZudW5nLlxuV2VpdCBoaW50ZXIgWm9vayBlcmtlbm5zdCBEdSBlaW5lIHdlaXRlcmUgR2VzdGFsdC5cbiIpOworCisgIEFkZERldGFpbCgoeyJnZXN0YWx0In0pLAorIkVzIHNjaGVpbnQgc2ljaCB1bSBCb2luZyB6dSBoYW5kZWxuLlxuIik7CisKKyAgQWRkRGV0YWlsKCh7ImJvaW5nIn0pLAorIkJvaW5nIHNjaGF1dCBEaWNoIHRyYXVyaWcgYW4uXG4iKTsKKworCisgIEFkZERldGFpbCgoeyJlbmRlIn0pLAorIkR1IGhhc3QgRGVpbiBFbmRlIGVycmVpY2h0LiBEdSBiaXN0IHRvdC5cbiIpOworCisgIEFkZERldGFpbCgoeyJsZWJlbiJ9KSwKKyJEZWluIExlYmVuIGlzdCB6dSBFbmRlLiBEdSBiaXN0IHRvdC5cbiIpOworCisgIEFkZENtZCgiYmV0ZSIsImJldGUiKTsKKyAgQWRkSXRlbSgiL29iai96ZWl0dW5nc2F1dG9tYXQiLCBSRUZSRVNIX1JFTU9WRSk7Cit9CisKK2JldGUoKSB7CisgIHdyaXRlKCJEdSBoYWVsdHN0IGVpbmUga3VyemUgQW5kYWNodC5cbiIpOworICBpZiAodGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKFBfR0hPU1QpICYmIHRoaXNfcGxheWVyKCktPnF1ZXJ5X2hjX3BsYXkoKT4xKSB7CisJd3JpdGUoIkVpbmUgc2VociBzdGFya2UgS3JhZnQgc2F1Z3QgRGljaCBhdWYgdW5kIHNwdWNrdCBEaWNoIHdpZWRlciBhdXMuXG5FcyBzY2hlaW50IHNpY2ggYWJlciBuaWNodHMgdmVyYWVuZGVydCB6dSBoYWJlbi5cbiIpOworCXNheSh0aGlzX3BsYXllcigpLT5uYW1lKCkrIiBlcnNjaGVpbnQgbmljaHQgaW4ga29lcnBlcmxpY2hlciBGb3JtLlxuIik7CisJdGhpc19wbGF5ZXIoKS0+U2V0UHJvcChQX0dIT1NULDApOworICB9CisgIGVsc2UKKyAgeworICAgICAgICB3cml0ZSgiRnVlciBEaWNoIGlzdCBkaWVzZXIgQWx0YXIgbmljaHQgZ2VkYWNodCFcbiIpOworICB9CisgIHJldHVybiAxOworfQorCisKZGlmZiAtLWdpdCBhL3Jvb20vbm9zY3JpcHQuYyBiL3Jvb20vbm9zY3JpcHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2ZmMjhlCi0tLSAvZGV2L251bGwKKysrIGIvcm9vbS9ub3NjcmlwdC5jCkBAIC0wLDAgKzEsNDIgQEAKK2luaGVyaXQgIi9zdGQvcm9vbSI7CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorCitzdGF0aWMgc3RyaW5nIHg7CitzdGF0aWMgc3RyaW5nICp4eDsKKwordm9pZCBjcmVhdGUoKSB7CisgIDo6Y3JlYXRlKCk7CisgIHg9Ii0tLS0tLS0tLS0iOworICB4eD0oeworICAgICIvZC9lYmVuZS9yb29tL2FrX3N0cjciLAorICAgICIvZC9lYmVuZS9yb29tL2RyYV9zdHIzIiwKKyAgICAiL2QvZWJlbmUvcm9vbS9ocF9zdHIyYyIsCisgICAgIi9kL2ViZW5lL3Jvb20vb193YTFkIiwKKyAgICAiL2QvZWJlbmUvcm9vbS93YWxkd2VnOCIKKyAgfSk7CisgIFNldFByb3AoUF9MSUdIVCwxKTsKKyAgU2V0UHJvcChQX0lOVF9MT05HLAorIkRpZXNlciBSYXVtIGlzdCBmdWVyIExldXRlLCBkaWUgVEYgc3BpZWxlbiBsYXNzZW4uXG5cCitFcyBnaWJ0IG51ciBlaW5lbiBXZWcgaGVyYXVzLi4uXG4iKTsKKyAgQWRkQ21kKCIiLCJyYXVzIiwxKTsKK30KKwordm9pZCBpbml0KCkgeworICBpbnQgaTsKKyAgCisgIDo6aW5pdCgpOworICBmb3IgKGk9MDtpPDEwO2krKykKKyAgICB4W2ldPSdhJytyYW5kb20oMjYpOworfQorCit2YXJhcmdzIHN0cmluZyBHZXRFeGl0cyhvYmplY3Qgdmlld2VyKSB7CisgIHJldHVybiBzcHJpbnRmKCJFcyBnaWJ0IGVpbmVuIHNpY2h0YmFyZW4gQXVzZ2FuZzogJXMuXG4iLHgpOworfQorCit2YXJhcmdzIGludCByYXVzKHN0cmluZyBzKSB7CisgIGlmIChxdWVyeV92ZXJiKCkhPXgpCisgICAgcmV0dXJuIDA7CisgIG5vdGlmeV9mYWlsKCJFdHdhcyBoYXQgbmljaHQgZnVua3Rpb25pZXJ0LiBCaXR0ZSB2ZXJzdGFlbmRpZ2UgZWluZW4gTWFnaWVyLlxuIik7CisgIHJldHVybiAoKHRoaXNfcGxheWVyKCktPm1vdmUoeHhbcmFuZG9tKHNpemVvZih4eCkpXSxNX0dPKSk+MCk7Cit9CmRpZmYgLS1naXQgYS9yb29tL25vd2hlcmUuYyBiL3Jvb20vbm93aGVyZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNTVmMmIKLS0tIC9kZXYvbnVsbAorKysgYi9yb29tL25vd2hlcmUuYwpAQCAtMCwwICsxLDI4IEBACitpbmhlcml0ICJzdGQvcm9vbSI7CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorCit2b2lkIGNyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9MSUdIVCwgMSApOworICBTZXRQcm9wKFBfSU5UX1NIT1JULCAiQmVpIGRlbiBpbmFrdGl2ZW4gU3BpZWxlcm4gOikiICk7CisgIFNldFByb3AoUF9JTlRfTE9ORywKKyAgICAiSGllciBpc3QgYWJzb2x1dCBuaWNodHMgenUgc2VoZW4sIGRpZSwgZGllIHNpY2ggaGllciBub3JtYWxlcndlaXNlXG4iCisgICArImF1ZmhhbHRlbiwgc2luZCBlaCBub25pbnRlcmFjdGl2ZS4uLlxuIik7CisgIEFkZENtZCggIiIsICJvbmx5d2VsdCIsIDEgKTsKK30KKworaW50IG9ubHl3ZWx0KCBzdHJpbmcgcyApIHsKKyAgaWYoIHF1ZXJ5X3ZlcmIoKT09IndlbHQiICkgeworICAgIHRoaXNfcGxheWVyKCktPm1vdmUoIi9naWxkZW4vYWJlbnRldXJlciIsIE1fVFBPUlQpOworICAgIHJldHVybiAxOworICB9CisgIGlmKCBJU19MRUFSTkVSKHRoaXNfcGxheWVyKCkpICkgcmV0dXJuIDA7CisgIHdyaXRlKAorICAgIldlbm4gRHUgZGFzIG1hZ2lzY2hlIEtvbW1hbmRvICd3ZWx0JyBnaWJzdCwgd2lyc3QgRHUgd2llZGVyIGluIERlaW5lIFdlbHRcbiIKKyAgICsienVydWVja3ZlcnNldHp0IHdlcmRlbi5cbiIKKyAgKTsKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9yb29tL29yYWtlbC5jIGIvcm9vbS9vcmFrZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGExNTA4Ci0tLSAvZGV2L251bGwKKysrIGIvcm9vbS9vcmFrZWwuYwpAQCAtMCwwICsxLDIzMSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIG9yYWtlbC5jIC0tIERlciBSYXVtLCBpbiBkZW0gbWFuIHNpY2ggbmV1ZSBaVC1TcHJ1ZWNoZSBob2xlbiBrYW5uCisvLworLy8gJElkOiBvcmFrZWwuYyA5MzcxIDIwMTUtMTAtMjIgMTk6MDE6NDhaIFplc3N0cmEgJAorCisjZGVmaW5lIFRJUFMoeCkgIi9zZWN1cmUvQVJDSC9aVC8iK3gKKworI2RlZmluZSBQT1RJT05NQVNURVIgIi9zZWN1cmUvcG90aW9ubWFzdGVyIgorCitpbmhlcml0ICIvc3RkL3Jvb20iOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCisvLyBXQU5OV0lFVklFTCB6ZWlndCBhbiwgbWl0IHdpZXZpZWwgU3R1ZmVucHVua3RlbiBtYW4gd2lldmllbGUgWmF1YmVydHJhZW5rZQorLy8gaGFiZW4ga2Fubiwgc28gaXN0IHp1bSBCZWlzcGllbCBhbiBmdWVuZnRlciBTdGVsbGUgZGllIFphaGwgMjUgZWluZ2UtCisvLyB0cmFnZW4sIGFsc28ga2FubiBtYW4gbWl0IDI1IFN0dWZlbnB1bmt0ZW4gNSBaYXViZXJ0cmFlbmtlIGJla29tbWVuLgorI2RlZmluZSBXQU5OV0lFVklFTCAoeyAwLCAwLCAwLCAwLFwKKyAgIDI1LCA1MCwgNzUsIDEwMCwgMTI1LCAxNTAsIDE3NSwgMjAwLCAyMjUsIDI1MCwgMjc1LCAzMDAsIDMyNSwgMzUwLCAzNzUsXAorICAgNDAwLCA0MjUsIDQ1MCwgNDc1LCA1MDAsIDUyNSwgNTUwLCA1NzUsIDYwMCwgNjI1LCA2NTAsIDY3NSwgNzAwLCA3MjUsXAorICAgNzUwLFwKKyAgIDc5MCwgODMwLCA4NzAsIDkxMCwgOTUwLCA5OTAsIDEwMzAsIDEwNzAsIDExMTAsIDExNTAsIDExOTAsIDEyMzAsIDEyNzAsXAorICAgMTMxMCwgMTM1MCwgMTM5MCwgMTQzMCwgMTQ3MCwgMTUxMCwgMTU1MCwgMTU5MCwgMTYzMCwgMTY3MCwgMTcxMCwgMTc1MCxcCisgICAxNzkwLFwKKyAgIDE4NjAsIDE5MzAsIDIwMDAsIDIwNzAsIDIxNDAsIDIyMTAsIDIyODAsIDIzNTAsIDI0MjAsIDI0OTAsXAorICAgMjU5MCwgMjY5MCwgMjc5MCwgMjg5MCwgMjk5MCwgMzA5MCwgMzE5MCwgMzI5MCwgMzM5MCwgMzQ5MCB9KQorI2RlZmluZSBLRUlOVElQVEVYVCAiRGVyIE5lYmVsIHVlYmVyIGRlciBLdWdlbCBydWVocnQgc2ljaCBuaWNodC5cbiIKKworCisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgICA6OmNyZWF0ZSgpOworICAgU2V0UHJvcChQX0lORE9PUlMsIDEpOworICAgU2V0UHJvcChQX0xJR0hULCAxKTsKKyAgIFNldFByb3AoUF9JTlRfU0hPUlQsICJEYXMgaGVpbGlnZSBPcmFrZWwgdm9uIFRpbmdhbiIpOworICAgU2V0UHJvcChQX0lOVF9MT05HLAorICAgIkR1IGJlZmluZGVzdCBEaWNoIGluIGVpbmVyIG1pdHRlbGdyb3NzZW4gSG9laGxlLCBkaWUgc2ljaCBoYWxia3VnZWwtXG4iKworICAgImZvZXJtaWcgdWViZXIgRGVpbmVtIEtvcGYgZXJoZWJ0LiBEaWUgSG9laGxlIHdpcmQgZmFzdCBrb21wbGV0dCB2b21cbiIrCisgICAiZ3J1ZW5saWNoIHNjaGltbWVybmRlbiBRdWVsbHNlZSBkZXMgT3N0ZXJiYWNocyBhdXNnZWZ1ZWxsdC4gVWViZXIgZGVtXG4iKworICAgIlNlZSBzY2h3ZWJ0IGVpbmdlaHVlbGx0IGluIGxhbmdzYW0gemllaGVuZGUgTmViZWxzY2h3YWRlbiBlaW5lIG1hZ2lzY2hcbiIrCisgICAibGV1Y2h0ZW5kZSBLdWdlbCwgZGFzIGhlaWxpZ2UgT3Jha2VsIHZvbiBUaW5nYW4uIEltIE9zdGVuIGZsaWVzc3QgZGFzXG4iKworICAgIldhc3NlciBkZXMgU2VlcyBkdXJjaCBlaW5lbiBzY2htYWxlbiBHYW5nIGFiLCBkZW0gRHUgZm9sZ2VuIGtvZW5udGVzdC5cbiIpOworICAgQWRkRGV0YWlsKCJib2RlbiIsICJEZXIgQm9kZW4gaXN0IGdyb2Vzc3RlbnRlaWxzIG1pdCBXYXNzZXIgYmVkZWNrdC5cbiIpOworICAgQWRkRGV0YWlsKCJkZWNrZSIsICJEaWUgRGVja2UgaXN0IGF1cyBtYXNzaXZlbSBGZWxzZ2VzdGVpbiwgRHUgd2lsbHN0IGdhciBuaWNodCB3aXNzZW4sXG53aWV2aWVsZSBUb25uZW4gZGF2b24gdWViZXIgRGVpbmVtIEtvcGYgbGFzdGVuLlxuIik7CisgICBBZGREZXRhaWwoKHsiZmVscyIsICJnZXN0ZWluIiwgImZlbHNnZXN0ZWluIn0pLCAiU293YXMgaXN0IGltIEdlYmlyZ2UgcmVjaHQgaGFldWZpZy5cbiIpOworICAgQWRkRGV0YWlsKCh7IndhbmQiLCAid2FlbmRlIn0pLCAiRGllIFdhZW5kZSBzaW5kIGZldWNodC5cbiIpOworICAgQWRkRGV0YWlsKCh7InF1ZWxsc2VlIiwgInNlZSJ9KSwgIkVyIGlzdCBkaWUgUXVlbGxlIGRlcyBPc3RlcmJhY2hzLlxuIik7CisgICBBZGREZXRhaWwoInF1ZWxsZSIsICJEYXMgaGVpc3N0LCBkZXIgQmFjaCBlbnRzcHJpbmd0IGhpZXIuXG4iKTsKKyAgIEFkZERldGFpbCgoeyJiYWNoIiwgIm9zdGVyYmFjaCJ9KSwgIkVyIGZsaWVzc3QgbmFjaCBPc3RlbiBhYi5cbiIpOworICAgQWRkRGV0YWlsKCJ3YXNzZXIiLCAiRXMgaXN0IGtsYXIgdW5kIGZyaXNjaC5cbiIpOworICAgQWRkRGV0YWlsKCJnYW5nIiwgIkVyIGZ1ZWhydCBuYWNoIE9zdGVuLlxuIik7CisgICBBZGREZXRhaWwoIm9yYWtlbCIsICJEdSBmdWVobHN0IGdyb3NzZXMgV2lzc2VuIGluIERlaW5lciBVbWdlYnVuZy5cbiIpOworICAgQWRkRGV0YWlsKCJ1bWdlYnVuZyIsICJEaWUgVW1nZWJ1bmcgaXN0IGRhcywgd2FzIERpY2ggdW1naWJ0LlxuIik7CisgICBBZGREZXRhaWwoIndpc3NlbiIsICJWaWVsbGVpY2h0IG51ZXR6dCBlcyBEaXIgamEgd2FzLlxuIik7CisgICBBZGREZXRhaWwoKHsibmViZWwiLCAic2Nod2FkZW4iLCAibmViZWxzY2h3YWRlbiJ9KSwgIlNpZSB6aWVoZW4gbGFuZ3NhbSB1ZWJlciBkZW4gU2VlLlxuIik7CisgICBBZGREZXRhaWwoImt1Z2VsIiwgIkRpZSBLdWdlbCBsZXVjaHRldCBpbiBtYWdpc2NoZW0gTGljaHQgdW5kIGxhZWR0IERpY2ggZmFzdCB6dW0gTWVkaXRpZXJlbiBlaW4uXG4iKTsKKyAgIEFkZERldGFpbCgibGljaHQiLCAiTWFnaXNjaGVzIExpY2h0IGVyaGVsbHQgZGVuIFJhdW0uXG4iKTsKKyAgIEFkZERldGFpbCgicmF1bSIsICJTY2hhdSBEaWNoIGVpbmZhY2ggbWFsIHVtLlxuIik7CisgICBBZGREZXRhaWwoImhvZWhsZSIsICJEdSBiZWZpbmRlc3QgRGljaCB0YXRzYWVjaGxpY2ggaW4gZWluZXIgSG9laGxlLlxuIik7CisgICBBZGREZXRhaWwoImtvcGYiLCAiRGFzIGFuenVzY2hhdWVuIGR1ZXJmdGUgRGlyIHNjaHdlciBmYWxsZW4uXG4iKTsKKyAgIEFkZENtZCgoeyJ0cmluayIsICJ0cmlua2UifSksICJ0cmlua2VuIik7CisgICBBZGRDbWQoIm1lZGl0aWVyZSIsICJtZWRpdGllcmVuIik7CisgICBBZGRDbWQoKHsid2lyZiIsICJ3ZXJmZSJ9KSwgIndlcmZlbiIpOworICAgQWRkRXhpdCgib3N0ZW4iLCAiL3BsYXllcnMvYm9pbmcvb3Jha2VsL29yZ2FuZzIiKTsKK30KKworLy8gRXMgd2lyZCBiZXJlY2huZXQgb2IgZGVyIFNwaWVsZXIgZWluZW4gbmV1ZW4gVGlwIGJla29tbWVuIGthbm4uCitpbnQgTmV1ZXJUaXAoKQoreworICAgbWFwcGluZyBwbGF0dDsgICAvLyBBdHRyaWJ1dG1hcHBpbmcgZGVzIFNwaWVsZXJzCisgICBpbnQJICAgc3VtbWU7ICAgLy8gU3VtbWUgZGVyIEF0dHJpYnV0ZSBkZXMgU3BpZWxlcnMgKyBkZXIgbm9jaCB6dSBmaW5kZW5lbgorCQkgICAgLy8gYWJlciBiZWthbm50ZW4gWmF1YmVydHJhbmtzdGVsbGVuCisgICBpbnQJICAgc3BzOyAgICAgLy8gU3R1ZmVucHVua3RlIGRlcyBTcGllbGVycworCisgICBwbGF0dCAgPSB0aGlzX3BsYXllcigpLT5RdWVyeVByb3AoUF9BVFRSSUJVVEVTKTsKKyAgIHN1bW1lICA9IChpbnQpcGxhdHRbImludCJdICsgKGludClwbGF0dFsiY29uIl0gKyAKKwkgICAgKGludClwbGF0dFsiZGV4Il0gKyAoaW50KXBsYXR0WyJzdHIiXSAtIDQ7IAorICAgc3VtbWUgICs9IHNpemVvZih0aGlzX3BsYXllcigpLT5RdWVyeVByb3AoUF9LTk9XTl9QT1RJT05ST09NUykpOworICAgc3BzCSAgPSB0aGlzX3BsYXllcigpLT5RdWVyeVByb3AoUF9MRVApOworCisvLyBXZW5uIGdlbnVnIFN0dWZlbnB1bmt0ZSBkYSBzaW5kLCBkYW5uIHdpcmQgMSB6dXJ1ZWNrZ2VnZWJlbiwgc29uc3QgMAorICBpZiAoc3VtbWU+NzkpCisgICAgcmV0dXJuIDA7CisgIGlmIChzcHMgPiBXQU5OV0lFVklFTFtzdW1tZV0pCisgICAgcmV0dXJuIDE7CisgICByZXR1cm4gMDsKK30KKworLy8gR2lidCBkaWUgTnVtbWVyIGRlcyBhdXNnZXdhZWhsdGVuIFphdWJlcnRyYW5rcyB6dXJ1ZWNrIG9kZXIgMCwgd2VubiBrZWluZXIKKy8vIG1laHIgdWVicmlnIGlzdC4KK2ludCBaVEF1c3dhaGwoKQoreworICAgaW50KiBwbGxpc3Q7CisgICBpbnQJcGxsc2l6ZTsKKyAgIGludCBpOworICAgbWl4ZWQgc29ydGVkX2xpc3Q7IC8vICh7ICh7bGlzdGUxfSksICh7bGlzdGUyfSksIC4uLiwgKHtsaXN0ZTh9KSB9KQorCisvLyBJbml0aWFsaXNpZXJ1bmcKKyAgIHNvcnRlZF9saXN0ID0gKHsgKHsgfSksICh7IH0pLCAoeyB9KSwgKHsgfSksICh7IH0pLCAoeyB9KSwgKHsgfSksICh7IH0pIH0pOworICAgcGxsaXN0ICAgICAgPSB0aGlzX3BsYXllcigpLT5RdWVyeVByb3AoUF9QT1RJT05ST09NUyk7CisgICBwbGxzaXplICAgICA9IHNpemVvZihwbGxpc3QpOworCisvLyBaYXViZXJ0cmFlbmtlIHdlcmRlbiBnZW1hZXNzIGlocmVyIExpc3RlIGluIGRlbiBuZXVlbiBBcnJheSBlaW5nZXRyYWdlbi4KKyAgIGZvciAoaT0wOyBpPHBsbHNpemU7IGkrKykKKyAgICAgIHNvcnRlZF9saXN0W1BPVElPTk1BU1RFUi0+R2V0TGlzdEJ5TnVtYmVyKHBsbGlzdFtpXSldICs9ICh7IHBsbGlzdFtpXSB9KTsKKworLy8gQWxsZSBVbnRlcmFycmF5cyB3ZXJkZW4gYW5laW5hbmRlcmdlaGFlbmd0LgorICAgcGxsaXN0ID0gKHsgfSk7CisgICBmb3IgKGk9MDsgaTw4OyBpKyspCisgICAgICBwbGxpc3QgKz0gc29ydGVkX2xpc3RbaV07CisgICBwbGxpc3QgLT0gdGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKFBfS05PV05fUE9USU9OUk9PTVMpOworCisvLyBKZXR6dCBzaW5kIGFsbGUgWmF1YmVydHJhZW5rZSB3aWVkZXIgaW4gZGVyIExpc3RlLCBzb3J0aWVydCBuYWNoIGRlbQorLy8gU2Nod2llcmlna2VpdHNncmFkLCBiaXMgYXVmIGRpZSBaYXViZXJ0cmFlbmtlLCBkaWUgZGVyIFNwaWVsZXIgYmVyZWl0cworLy8ga2VubnQgKGQuaC4gd28gZXIgc2Nob24gZGVuIFRpcCBiZWtvbW1lbiBoYXQsIHNpZSBhYmVyIG5vY2ggbmljaHQKKy8vIGdlZnVuZGVuIGhhdCkuCisKKworLy8gRWluZXIgZGVyIGxlaWNodGVzdGVuIFphdWJlcnRyYWVua2Ugd2lyZCBhdXNnZXdhZWhsdCB1bmQgenVydWVja2dlZ2ViZW4uCisgICBwbGxzaXplID0gc2l6ZW9mKHBsbGlzdCk7CisgICBpZiAoIXBsbHNpemUpCisgICAgICByZXR1cm4gLTE7CisgICBpZiAocGxsc2l6ZT4xMCkKKyAgICAgIHJldHVybiBwbGxpc3RbcmFuZG9tKDEwKV07CisgICBlbHNlCisgICAgICByZXR1cm4gcGxsaXN0W3JhbmRvbShwbGxzaXplKV07Cit9CisKKworc3RyaW5nIFZpc2lvbigpCit7CisgIGludAkgIG5yOworICBzdHJpbmcqIHRleHQ7CisgIGludCoJICBsaXN0ZTsKKworICBpZiAoIU5ldWVyVGlwKCkpCisgICAgcmV0dXJuIEtFSU5USVBURVhUICsgIkR1IGhhc3Qgd2FocnNjaGVpbmxpY2ggenUgd2VuaWcgU3R1ZmVucHVua3RlLlxuIjsKKworICBuciA9IFpUQXVzd2FobCgpOworICBpZiAobnIgPT0gLTEpCisgICAgcmV0dXJuIEtFSU5USVBURVhUICsgIkR1IGhhc3Qgc2Nob24gYWxsZSBaYXViZXJ0cmFlbmtlIGdlZnVuZGVuLlxuIjsKKworICB0ZXh0ID0gUE9USU9OTUFTVEVSLT5UaXBMZXNlbihucik7CisvLyBEYXMgRm9sZ2VuZGUga2FubiBwYXNzaWVyZW4sIHdlbm4gZW50d2VkZXIgZGllIERhdGVpIHp1IGVpbmVtIFpUIG5pY2h0CisvLyBleGlzdGllcnQgb2RlciBkYXMgRWlubGVzZW4gc29uc3R3aWUgZmVobHNjaGxhZWd0LiBadXIgQmVoZWJ1bmcgZGVzCisvLyBGZWhsZXJzIHNvbGx0ZSBtYW4gc2ljaCBhbHMgZXJzdGVzIGRpZSBEYXRlaSA8bnI+Lnp0IGFuc2NoYXVlbi4KKyAgaWYgKGludHAodGV4dCkgfHwgIXNpemVvZih0ZXh0KSkgCisgICAgcmV0dXJuIAorICAiUGxvZXR6bGljaCB3aXJkIGVzIHRvdGVuc3RpbGwgaW0gUmF1bSwgZGllIE5lYmVsc2Nod2FkZW4gYmVnaW5uZW4gc2ljaFxuIisKKyAgInVtIGRpZSBLdWdlbCB6dSBkcmVoZW4uIEltbWVyIHNjaG5lbGxlciB3aXJkIGRlciB3aXJiZWxuZGUgVGFueiwgYmlzXG4iKworICAic2ljaCBkYXMgR2FuemUgdW5tZXJrbGljaCB6dSBlaW5lciBTY2hyaWZ0IGZvcm10OlxuIisKKyAgIiAgIEZlaGxlciBpbSBSYXVtLVplaXQtR2VmdWVnZSwgYml0dGUgd2VuZGUgRGljaCBhbiBSaWt1c1xuIisKKyAgIiAgIHVuZCBtZWxkZSBpaG0gZGllIFphaGwgJyIrbnIrIichXG4iKworICAiRGFubiB6ZXJmbGllc3N0IGRlciBOZWJlbCB1bmQgYWxsZXMgaXN0IGJlaW0gQWx0ZW4uXG4iOworCisgIGxpc3RlID0gdGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKFBfS05PV05fUE9USU9OUk9PTVMpOworICB0aGlzX3BsYXllcigpLT5BZGRLbm93blBvdGlvbihucik7CisKKy8vYmlzIG5hY2ggUmVib290IG5vZXRpZyEhISBSaWt1cworLy8gICIvcGxheWVycy9ib2luZy9vcmFrZWwvb3Jha2VsIi0+QWRkS25vd25Qb3Rpb24obnIpOworCisgIHJldHVybiAiRGVyIE5lYmVsIHVlYmVyIGRlciBLdWdlbCBiZWdpbm50IHNpY2ggenUgYmV3ZWdlbiwgZGFubiBob2Vyc3QgRHUgZWluZVxudGllZmUgU3RpbW1lIGluIERlaW5lbSBLb3BmIGVya2xpbmdlbjpcblxuIit0ZXh0W3JhbmRvbShzaXplb2YodGV4dCkpXTsKK30KKworc3RyaW5nIFRpcExpc3RlKCkKK3sKKyAgaW50KgkgIHBsbDsKKyAgc3RyaW5nKiB0aXA7CisgIHN0cmluZyAgcmV0OworICBpbnQJICBwbHNpemUsIGk7CisKKyAgcmV0CSA9ICIiOworICBwbGwJID0gdGhpc19pbnRlcmFjdGl2ZSgpLT5RdWVyeVByb3AoUF9LTk9XTl9QT1RJT05ST09NUyk7CisgIHBsc2l6ZSA9IHNpemVvZihwbGwpOworCisgIGZvciAoaT0wOyBpPHBsc2l6ZTsgaSsrKQorICB7CisgICAgdGlwID0gUE9USU9OTUFTVEVSLT5UaXBMZXNlbihwbGxbaV0pOworICAgIGlmIChzaXplb2YodGlwKSkKKyAgICB7CisgICAgICByZXQgKz0gdGlwW3JhbmRvbShzaXplb2YodGlwKSldOworICAgICAgcmV0ICs9ICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIjsKKyAgICB9CisgIH0KKworICBpZiAocmV0PT0iIikKKyAgICByZXR1cm4gIkR1IGtlbm5zdCBtb21lbnRhbiBrZWluZSBUaXBzIHp1IFphdWJlcnRyYWVua2VuLlxuIjsKKyAgZWxzZQorICAgIHJldHVybiAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIrcmV0OworfQorCitpbnQgdHJpbmtlbihzdHJpbmcgc3RyKQoreworICBub3RpZnlfZmFpbCgiV2FzIG1vZWNodGVzdCBEdSB0cmlua2VuP1xuIik7CisgIGlmICghc3RyIHx8IHN0cj09IiIpIHJldHVybiAwOworICBub3RpZnlfZmFpbCgiRGFzIGthbm5zdCBEdSBoaWVyIG5pY2h0IHRyaW5rZW4hXG4iKTsKKyAgaWYgKHN0ciE9Indhc3NlciIpCisgICAgcmV0dXJuIDA7CisgIHdyaXRlKCJEdSB0cmlua3N0IGVpbmVuIFNjaGx1Y2sgUXVlbGx3YXNzZXIgdW5kIGZ1ZWhsc3QgRGljaCBrb2VzdGxpY2ggZXJmcmlzY2h0LlxuIik7CisgIHJldHVybiAxOworfQorCittZWRpdGllcmVuKCkKK3sKKyAgd3JpdGUoCisgICJEdSBzYW1tZWxzdCBEZWluZSBnZWlzdGlnZW4gS3JhZWZ0ZSB1bmQgdmVyZmFlbGxzdCBzY2hvbiBzY2huZWxsIGluIGVpbmVuXG4iKworICAidHJhbmNlYXJ0aWdlbiBadXN0YW5kLiBFaW5lIFZpc2lvbiBlaW5lcyBIZWxkZW4sIGRlciBlaW5lIE11ZW56ZSBpbiBkZW5cbiIrCisgICJTZWUgd2lyZnQgZXJzY2hlaW50IHZvciBEZWluZW4gQXVnZW4sIHZlcnNjaHdpbmRldCBhYmVyIHNjaG9uIHNjaG5lbGxcbiIrCisgICJ3aWVkZXIuIEFscyBEdSB3aWVkZXIgYXVmd2FjaHN0LCBpc3QgYWxsZXMgd2llIHZvcmhlci5cbiIpOworICByZXR1cm4gMTsKK30KKworaW50IHdlcmZlbihzdHJpbmcgc3RyKQoreworICBpZiAoc3RyPT0ibXVlbnplIGluIHNlZSIgfHwgc3RyPT0ibXVlbnplIGluIHdhc3NlciIgfHwKKyAgICAgIHN0cj09Im11ZW56ZSBpbiBxdWVsbHNlZSIpCisgIHsKKyAgICBpZiAodGhpc19wbGF5ZXIoKS0+UXVlcnlNb25leSgpPDEpCisgICAgeworICAgICAgd3JpdGUoIkR1IGhhc3Qga2VpbmUgTXVlbnplLlxuIik7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgdGhpc19wbGF5ZXIoKS0+QWRkTW9uZXkoLTEpOworICAgIHdyaXRlKCJEdSB3aXJmc3QgZWluZSBNdWVuemUgaW5zIFdhc3Nlci5cbiIpOworICAgIHNheShjYXBpdGFsaXplKHRoaXNfcGxheWVyKCktPm5hbWUoKSkrIiB3aXJmdCBlaW5lIE11ZW56ZSBpbnMgV2Fzc2VyLlxuIik7CisgICAgd3JpdGUoVmlzaW9uKCkpOworICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvcm9vbS9wb3N0LmMgYi9yb29tL3Bvc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDExN2RlCi0tLSAvZGV2L251bGwKKysrIGIvcm9vbS9wb3N0LmMKQEAgLTAsMCArMSwxMiBAQAoraW5oZXJpdCAiL3N0ZC9wb3N0IjsKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisKK2NyZWF0ZSgpCit7CisJOjpjcmVhdGUoKTsKKyAgICAgICAgQWRkRXhpdCgib3N0ZW4iLCIvZ2lsZGVuL2FiZW50ZXVyZXIiKTsKKwlTZXRQcm9wKFBfSU5UX0xPTkcsIkRpZXMgaXN0IGRhcyBIYXVwdHBvc3RhbXQgdm9uIE1vcmdlbkdyYXVlbi5cbiIrCisgICAgICAgICAgICAgICAiVm9uIGhpZXIgYXVzIGthbm5zdCBEdSBCcmllZmUgYW4gRGVpbmUgTWl0c3BpZWxlciBzY2hpY2tlbiB1bmQgQnJpZWZlIHZvblxuIisKKyAgICAgICAgICAgICAgICJpaG5lbiBsZXNlbi4gV2VubiBEdSBkYXMgd2lsbHN0LCB0aXBwZSBcInBvc3RcIi5cbiIrCisgICAgICAgICAgICAgICAiRGVyIGVpbnppZ2Ugc2ljaHRiYXJlIEF1c2dhbmcgZnVlaHJ0IG5hY2ggT3N0ZW4gaW4gZGllIEdpbGRlLlxuIik7Cit9ICAgICAgICAgICAgIApkaWZmIC0tZ2l0IGEvcm9vbS9wcmF5X3Jvb20uYyBiL3Jvb20vcHJheV9yb29tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA1NmQyMgotLS0gL2Rldi9udWxsCisrKyBiL3Jvb20vcHJheV9yb29tLmMKQEAgLTAsMCArMSwzNyBAQAoraW5oZXJpdCAic3RkL3Jvb20iOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCit2b2lkIGNyZWF0ZSgpCit7CisJOjpjcmVhdGUoKTsKKwlTZXRQcm9wKFBfTElHSFQsMSk7CisJU2V0UHJvcChQX0lOVF9MT05HLAorICAgIkR1IGJlZmluZGVzdCBEaWNoIGluIGVpbmVyIGtsZWluZW4gS2FwZWxsZSwgaW4gZGVyIER1IGJldGVuIGthbm5zdCwgdW1cbiIrCisgICAid2llZGVyIERlaW5lIG5hdHVlcmxpY2hlIEdlc3RhbHQgenUgZXJoYWx0ZW4uIEFtIHN1ZWRsaWNoZW4gRW5kZSBzdGVodFxuIisKKyAgICJlaW4gQWx0YXIsIGF1ZiBkZW0gc2ljaCBlaW4gZ3Jvc3NlcyBLcmV1eiBiZWZpbmRldC4gSW4gZGVuIFdhZW5kZW4gc2llaHN0XG4iKworICAgIkR1IGhlcnJsaWNoZSBGZW5zdGVyLCBkdXJjaCBkaWUgdGFnc3VlYmVyIGRhcyBMaWNodCBidW50IGhlcmVpbnNjaGVpbnQuXG4iKworICAgIkltIE5vcmRlbiBiZWZpbmRldCBzaWNoIGVpbmUgVHVlciwgZGllIHp1ciBHaWxkZSBmdWVocnQuXG4iKTsKKyAgU2V0UHJvcChQX0lOVF9TSE9SVCwiS2FwZWxsZSIpOworICBBZGREZXRhaWwoImFsdGFyIiwgIkVyIGlzdCBhdXMgU3RlaW4gdW5kIG5pY2h0IGJlc29uZGVycyBzY2hvZW4uXG4iKTsKKyAgQWRkRGV0YWlsKCJrcmV1eiIsICJFaW4gc2NobGljaHRlcyBIb2x6a3JldXouXG4iKTsKKyAgQWRkRGV0YWlsKCJmZW5zdGVyIiwgIkRpZSBGZW5zdGVyIHNpbmQgd3VuZGVyc2Nob2VuLlxuIik7CisgIEFkZERldGFpbCgoeyJ3YW5kIiwgIndhZW5kZSJ9KSwgIkFuIGRlbiBXYWVuZGVuIHNpZWhzdCBEdSBuaWNodHMgYmVzb25kZXJlcy5cbiIpOworICBBZGRDbWQoImJldGUiLCJiZXRlIik7CisgIEFkZEV4aXQoIm5vcmRlbiIsIi9naWxkZW4vYWJlbnRldXJlciIpOworfQorCitzdGF0aWMgaW50IGJldGUoKSB7CisgICBpZiAodGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKFBfR0hPU1QpKQorICAgeworICAgICAgICB3cml0ZSgiRHUgaGFlbHRzdCBlaW5lIGt1cnplIEFuZGFjaHQuXG4iKTsKKwl3cml0ZSgiRWluZSBzZWhyIHN0YXJrZSBLcmFmdCBzYXVndCBEaWNoIGF1ZiB1bmQgc3B1Y2t0IERpY2ggd2llZGVyIGF1cy5cbiIpOworCXNheSh0aGlzX3BsYXllcigpLT5uYW1lKCkrIiBlcnNjaGVpbnQgaW4ga29lcnBlcmxpY2hlciBGb3JtLlxuIik7CisJdGhpc19wbGF5ZXIoKS0+U2V0UHJvcChQX0dIT1NULDApOworCXJldHVybiAxOworICAgfQorICAgbm90aWZ5X2ZhaWwoIkR1IGhhZWx0c3QgZWluZSBrdXJ6ZSBBbmRhY2h0LlxuIik7CisgICByZXR1cm4gMDsKK30KKworCmRpZmYgLS1naXQgYS9yb29tL3B1YjIuYyBiL3Jvb20vcHViMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNTExNDQKLS0tIC9kZXYvbnVsbAorKysgYi9yb29tL3B1YjIuYwpAQCAtMCwwICsxLDQ0IEBACitpbmhlcml0ICIvc3RkL3B1YiI7CisjaW5jbHVkZSA8cm9vbXMuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisKK2NyZWF0ZSgpeworICAgcmVwbGFjZV9wcm9ncmFtKCJzdGQvcHViLmMiKTsKKyAgIDo6Y3JlYXRlKCk7CisKKyAgIEFkZERyaW5rKCJCaWVyIG5hY2ggZGVtIFJlaW5oZWl0c2dlYm90IiwiYmllciIsMTIsMCwyLDEsCisgICAgICAgICAgICAoeyJEZXIgS2VsbG5lciBicmluZ3QgRGVpbiBCaWVyLiBEdSBmdWVobHN0IERpY2ggZ3V0LiIsCisgICAgICAgICAgICAgICImJiB0cmlua3QgZWluIGVpc2thbHRlcyBCaWVyLiJ9KSk7CisKKyAgIEFkZERyaW5rKCJGcmFua3MgU3BlemlhbC1TY2huYXBzIiwKKyAgICAgICAgICAgICh7InNjaG5hcHMiLCJzcGV6aWFsIiwic3BlemlhbC1zY2huYXBzIn0pLAorICAgICAgICAgICAgNTAsMTAsOCwwLAorICAgICAgICAgICAgKHsiRGVyIEtlbGxuZXIgYnJpbmd0IERlaW5lbiBTY2huYXBzLlxuIisKKyAgICAgICAgICAgICAgIkR1IGZ1ZWhsc3QgZWluIEtyaWJiZWxuIGltIGdhbnplbiBLb2VycGVyLiIsCisgICAgICAgICAgICAgICImJiBzY2h1ZXR0ZXQgZWluZW4gU3BlemlhbC1TY2huYXBzIGhlcnVudGVyLiJ9KSk7CisKKyAgIEFkZERyaW5rKCJFaW4gYmVydWVobXRlciBSYWNoZW5wdXR6ZXIiLCh7InB1dHplciIsInJhY2hlbnB1dHplciJ9KSwKKyAgICAgICAgICAgIDE1MCwyNSwxMiwwLAorICAgICAgICAgICAgKHsiRHUgYmVrb21tc3QgRGVpbmVuIHdlbHRiZXJ1ZWhtdGVuIFJhY2hlbnB1dHplci5cbiIrCisgICAgICAgICAgICAgICJFaW5lIFNjaG9ja3dlbGxlIHJhc3QgbWl0IGRlciBHZXdhbHQgZWluZXMgQmFzZWJhbGwtU2NobGFlZ2VycyBkdXJjaFxuIisKKyAgICAgICAgICAgICAgIkRlaW5lbiBLb2VycGVyIHVuZCB0cmlmZnQgbWl0IHZvbGxlciBXdWNodCBEZWluIEdlaGlybi4iLAorICAgICAgICAgICAgICAiJiYgdG9ya2VsdCwgYWxzICYhIGVpbmVuIFJhY2hlbnB1dHplciBzYWV1ZnQuIn0pKTsKKworICAgQWRkRHJpbmsoIkVpbmUgVGFzc2UgS2FmZmVlIiwoeyJrYWZmZWUiLCJ0YXNzZSIsInRhc3NlIGthZmZlZSJ9KSwKKyAgICAgICAgICAgIDIwLDAsLTIsMywKKyAgICAgICAgICAgICh7IkJhZWghIFNjaG1lY2t0IGphIHdpZGVybGljaCEiLAorICAgICAgICAgICAgICAiJiYgdmVyemllaHQgYW5nZXdpZGVydCBkYXMgR2VzaWNodCwgYWxzICYhIGVpbmVuIEthZmZlZSBzY2hsdWNrdC4ifSkpOworCisgICBBZGRFeGl0KCJ3ZXN0ZW4iLCJyb29tL2dpbGRlIik7CisKKyAgIFNldFByb3AoUF9JTlRfU0hPUlQsIkZyYW5rcyBBYmVudGV1cmVyLUtuZWlwZSIpOworICAgU2V0UHJvcChQX0lOVF9MT05HLCJEdSBiaXN0IGluIEZyYW5rcyBBYmVudGV1cmVyLUtuZWlwZS5cbiIrCisgICAgICAgICAgICAgICAiV2llIGltbWVyIGlzdCBoaWVyIG1hbCB3aWVkZXIgZGllIEhvZWxsZSBsb3MuIEZsYXNjaGVuIHVuZCBHbGFlc2VyXG4iKworICAgICAgICAgICAgICAgImZsaWVnZW4gZHVyY2ggZGVuIFJhdW0sIHVuZCBkdSBtdXNzdCBhdWZwYXNzZW4sIGRhc3MgRHUgbmljaHQgaW5cbiIrCisgICAgICAgICAgICAgICAiZGllIFNjaGxhZWdlcmVpIHp3aXNjaGVuIGVpbmVtIEtlcmwsIGRlciBhdXNzaWVodCB3aWUgU3lsdmVzdGVyXG4iKworICAgICAgICAgICAgICAgIlN0YWxsb25lIHVuZCBlaW5lbSBhdWNoIG5pY2h0IGdlcmFkZSBoYXJtbG9zZW4gWmF1YmVyZXIgaGluZWluLVxuIisKKyAgICAgICAgICAgICAgICJnZXpvZ2VuIHdpcnN0LlxuXG4iKworICAgICAgICAgICAgICAgIldlbm4gRHUgd2lzc2VuIHdpbGxzdCwgd2FzIER1IGhpZXIgdHJpbmtlbiBrYW5uc3QsIHRpcHBlOiAnbWVudWUnLlxuIik7CQorICAgU2V0UHJvcChQX0xJR0hULDEpOworfQorCmRpZmYgLS1naXQgYS9yb29tL3RyZWZmLmMgYi9yb29tL3RyZWZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdkMGJlOAotLS0gL2Rldi9udWxsCisrKyBiL3Jvb20vdHJlZmYuYwpAQCAtMCwwICsxLDQwIEBACisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHJvb21zLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KK2luaGVyaXQgIi9zdGQvcm9vbSI7CitjcmVhdGUoKXsKKyAgIDo6Y3JlYXRlKCk7CisgICBTZXRQcm9wKFBfSU5UX1NIT1JULCJEYXMganVlbmdzdGUgR2VydWVjaHQiKTsKKyAgIFNldFByb3AoUF9JTlRfTE9ORywKKwkgICAiRGllcyBpc3QgZWluIFJhdW0sIGRlbiBkaWUgU3BpZWxlciBnZXJuZSB1bmQgb2Z0IGFscyBcbiIKKwkgICArIidkYXMganVlbmdzdGUgR2VydWVjaHQnIGJlemVpY2huZW4uIEhpZXIgd2VyZGVuIG5hZW0tXG4iCisJICAgKyJsaWNoIHdpY2h0aWdlIEVudHNjaGVpZHVuZ2VuIGltIE1vcmdlbmdyYXVlbiBkaXNrdS1cbiIKKwkgICArInRpZXJ0IHVuZCBiZXNjaGxvc3Nlbi4gRGVtenVmb2xnZSBpc3QgZGllcyBlaW4gcmVpbmVyXG4iCisJICAgKyJNYWdpZXJyYXVtLiBNYW4ga2FubiBzaWNoIGhpZXIgdHJlZmZlbiwgcmVkZW4gb2RlclxuIgorCSAgICsiZWluZmFjaCBoZXJ1bWlkbGVuLlxuIik7CisgICBBZGRFeGl0KCJ1bnRlbiIsICIvZ2lsZGVuL2FiZW50ZXVyZXIiKTsKKyAgIFNldFByb3AoUF9MSUdIVCwxMDApOworICAgU2V0UHJvcChQX0lORE9PUlMsMSk7Cit9CisKK2V4aXQoKSAvLyBXYXIgc2Nob24gb2VmdGVyIHNvLCBkYXMgTWFnaWVyIGhpZXIgd2Fsa2luZyBtb25zdGVycyBlcnpldWd0CisgICAgICAgLy8gaGFiZW4sIGRpZSBkYW5uIGluIGRpZSBHaWxkZSBnZWhvcHN0IHNpbmQgLi4uIGRpZSBleGl0cworCQkJIC8vIHp1IHNwZXJyZW4gaGF0IGF1Y2gga2VpbmVuIFNpbm4gLSBTaXJzIE1OUEMgbW92ZWQgc2ljaCBkYW5uCisJCQkgLy8gZG9jaCBhbiBzZWluZW4gU3RhcnRwdW5rdC4gTmFqYSwgbWFjaGVuIHdpciBlcyBlYmVuIFNPIC0gTW9uc3RlcgorCQkJIC8vIGhhYmVuIGhpZXIgZWggbml4IHZlcmxvcmVuLgoreworCW9iamVjdCB0cDsKKworCXRwPXByZXZpb3VzX29iamVjdCgpOworCWlmICghcXVlcnlfb25jZV9pbnRlcmFjdGl2ZSh0cCkpCisJCWNhbGxfb3V0KCJkb19kZXN0cnVjdCIsMSx0cCk7Cit9CisKK2RvX2Rlc3RydWN0KG9iKQoreworCWlmIChvYikKKwkgIG9iLT5yZW1vdmUoKTsKKwlpZiAob2IpCisJCWRlc3RydWN0KG9iKTsKK30KZGlmZiAtLWdpdCBhL3Jvb20vdm9pZC5jIGIvcm9vbS92b2lkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYxZTYyYQotLS0gL2Rldi9udWxsCisrKyBiL3Jvb20vdm9pZC5jCkBAIC0wLDAgKzEsNTEgQEAKK2luaGVyaXQgInN0ZC9yb29tIjsKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bW92aW5nLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX0xJR0hULCAxICk7CisgIFNldFByb3AoUF9JTlRfU0hPUlQsICJEYXMgTmljaHRzIiApOworICBTZXRQcm9wKFBfSU5ET09SUywgMSk7CisgIFNldFByb3AoUF9JTlRfTE9ORywKKyAgICAiRHUgc2Nod2Vic3QgaW0gYWJzb2x1dGVuLCBld2lnZW4gdW5kIGxlZXJlbiBOaWNodHMgdW1oZXIuIEhpZXIga29tbWVuXG4iCisgICArImFsbCBkaWUgaGluLCBkZXJlbiBXZWx0LCBpbiBkZXIgc2llIHNpY2ggYmVmYW5kZW4sIHplcnN0b2VydCB3b3JkZW4gaXN0LlxuIgorICAgKyJXZW5uIER1IGRhcyBtYWdpc2NoZSBLb21tYW5kbyAnd2VsdCcgZ2lic3QsIHdpcnN0IER1IHdpZWRlciBpbiBEZWluZSBXZWx0XG4iCisgICArInp1cnVlY2t2ZXJzZXR6dCB3ZXJkZW4uXG4iCisgICk7CisgIEFkZENtZCggIiIsICJvbmx5d2VsdCIsIDEgKTsKK30KKworaW50IG9ubHl3ZWx0KCBzdHJpbmcgcyApIHsKKyAgaWYoIHF1ZXJ5X3ZlcmIoKT09IndlbHQiICkgeworICAgIHRoaXNfcGxheWVyKCktPm1vdmUoIi9naWxkZW4vYWJlbnRldXJlciIsIE1fVFBPUlQpOworICAgIHJldHVybiAxOworICB9CisgIGlmKCBJU19MRUFSTkVSKHRoaXNfcGxheWVyKCkpICkgcmV0dXJuIDA7CisgIHdyaXRlKAorICAgICJEdSBzY2h3ZWJzdCBpbSBhYnNvbHV0ZW4sIGV3aWdlbiB1bmQgbGVlcmVtIE5pY2h0cyB1bWhlci4gSGllciBrb21tZW5cbiIKKyAgICsiYWxsIGRpZSBoaW4sIGRlcmVuIFdlbHQsIGluIGRlciBzaWUgc2ljaCBiZWZhbmRlbiwgemVyc3RvZXJ0IHdvcmRlbiBpc3QuXG4iCisgICArIldlbm4gRHUgZGFzIG1hZ2lzY2hlIEtvbW1hbmRvICd3ZWx0JyBnaWJzdCwgd2lyc3QgRHUgd2llZGVyIGluIERlaW5lIFdlbHRcbiIKKyAgICsienVydWVja3ZlcnNldHp0IHdlcmRlbi5cbiIKKyAgKTsKKyAgcmV0dXJuIDE7Cit9CisKKworLy8gU29uc3QgemVyc3RvZXJ0IHNpY2ggZGFzIFZvaWQgYnJhdiBzZWxic3QgLSBhbiBOb3RpZnlEZXN0cnVjdCB2b3JiZWkuIAorcHVibGljIHZhcmFyZ3MgaW50IHJlbW92ZSgpCit7CisgIGlmICghQVJDSF9TRUNVUklUWSB8fCBwcm9jZXNzX2NhbGwoKSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIDo6cmVtb3ZlKCk7Cit9CisKKy8vIE5pY2h0IGplZGVyIE1hZ2llciBtdXNzIGRhcyBWb2lkIGVudHNvcmdlbiBrb2VubmVuLgorc3RyaW5nIE5vdGlmeURlc3RydWN0KG9iamVjdCBjYWxsZXIpIHsKKyAgICBpZiggKGNhbGxlciE9dGhpc19vYmplY3QoKSAmJiAhQVJDSF9TRUNVUklUWSkgfHwgcHJvY2Vzc19jYWxsKCkgKSB7CisgICAgICByZXR1cm4gIkR1IGRhcmZzdCBkYXMgVm9pZCBuaWNodCB6ZXJzdG9lcmVuIVxuIjsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3Jvb20vd2VsY29tZS9zdGQuYyBiL3Jvb20vd2VsY29tZS9zdGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWUzY2VlCi0tLSAvZGV2L251bGwKKysrIGIvcm9vbS93ZWxjb21lL3N0ZC5jCkBAIC0wLDAgKzEsMTUxIEBACisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKworaW5oZXJpdCAgIi9zdGQvcm9vbSI7CisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisjcHJhZ21hIHJ0dF9jaGVja3MKKyNwcmFnbWEgbm9fc2hhZG93CisjcHJhZ21hIG5vX2luaGVyaXQKKyNwcmFnbWEgcGVkYW50aWMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKworI2RlZmluZSBCUyh4KSBicmVha19zdHJpbmcoeCwgNzgsIDAsIEJTX0xFQVZFX01ZX0xGU3xCU19TSU5HTEVfU1BBQ0UpCisjZGVmaW5lIFRVVFNUQVJUICIvZC9hbmZhZW5nZXIvYXJhdGhvcm4vbWluaXR1dC9yb29tL2h1ZXR0ZV8iCisKK3ZvaWQgY3JlYXRlKCkgeworICA6OmNyZWF0ZSgpOworCisgIFNldFByb3AoUF9MSUdIVCwxKTsKKyAgU2V0UHJvcChQX0xJR0hUX1RZUEUsIExUX1NUQVJTfExUX01PT04pOworICBTZXRQcm9wKFBfTUFQX1JFU1RSSUNUSU9OUywgTVJfTk9VSUR8TVJfTk9JTkZPKTsKKyAgU2V0UHJvcChQX0lORE9PUlMsMCk7CisgIFNldFByb3AoUF9OT19UUE9SVCwgTk9fVFBPUlQpOworCisgIFNldFByb3AoUF9JTlRfU0hPUlQsICJJcmdlbmR3byBpbSBOaXJnZW5kd28iKTsKKyAgU2V0UHJvcChQX0lOVF9MT05HLCBCUygKKyAgICAiRHUgc2Nod2Vic3QgaW0gTmlyZ2VuZHdvLiBTdGVybmUgdW1nZWJlbiBEaWNoLCB1bmQgRHUgZ2xhdWJzdCAiCisgICAgInp1IGZhbGxlbiwgb2J3b2hsIER1IERpY2ggdm9sbGtvbW1lbiBzY2h3ZXJlbG9zIGZ1ZWhsc3QuIEVpbiBoYXVjaCIKKyAgICAiZHVlbm5lciBTY2hsZWllciBhdXMgU3RhdWIgdW1mYWVuZ3QgRGljaCwgYWxzIER1IGxhbmdzYW0gYWJlciBzaWNoZXIgIgorICAgICJEZWluZXMgS29lcnBlcnMgZ2V3YWhyIHdpcnN0LiIpKTsKKyAgQWRkU3BlY2lhbEV4aXQoIndlbHQiLCBmdW5jdGlvbiBpbnQgKCkgeworICAgIGlmICggUEwtPlF1ZXJ5R3Vlc3QoKSApIAorICAgICAgcmV0dXJuIFBMLT5tb3ZlKCIvZ2lsZGVuL2FiZW50ZXVyZXIiLCBNX0dPKTsKKyAgICBlbHNlIHJldHVybiAwOyAKKyAgfSk7CisgIFNldChQX0hJREVfRVhJVFMsIGZ1bmN0aW9uIG1peGVkICgpIHsKKyAgICByZXR1cm4gIShQTCAmJiBQTC0+UXVlcnlHdWVzdCgpKTsKKyAgfSwgRl9RVUVSWV9NRVRIT0QpOworfQorCit2b2lkIGluaXQoKSB7CisgIHNldF9uZXh0X3Jlc2V0KDMwMCk7CisgIGlmICggb2JqZWN0cChQTCkgKQorICAgIGNhbGxfb3V0KCJTZXF1ZW56IiwgMCwgMCk7CisgIHJldHVybiA6OmluaXQoKTsKK30KKworLy8gTml4IHJlc2V0dGVuLCBhYmVyIFJhdW0gZW50c29yZ2VuLCB3ZW5uIGtlaW4gU3BpZWxlciBkcmluLgorLy8gTm90ZmFsbHMgZ2lidCBlcyBhdWNoIG5vY2ggbmVuIGNsZWFudXAoKSBhdXMgZGVtIFN0YW5kYXJkcmF1bS4uLgorcHJvdGVjdGVkIHZvaWQgcmVzZXQoKSB7CisgIGlmICghc2l6ZW9mKGZpbHRlcihhbGxfaW52ZW50b3J5KHRoaXNfb2JqZWN0KCkpLCAjJ3F1ZXJ5X29uY2VfaW50ZXJhY3RpdmUpKQorICAgICAgKQorICAgIHJlbW92ZSgxKTsKK30KKworLy9UT0RPOiBEZWxheXMgYW5wYXNzZW4gYnp3LiBhdXNrbGFtbWVybiwgd2VubiBpbW1lciA9NSBhdXNzZXIgYW0gRW5kZS4KK3ZvaWQgU2VxdWVueihpbnQgY291bnQpIHsKKyAgaW50IGRlbGF5OworCisgIGlmICggIW9iamVjdHAoUEwpIHx8IGVudmlyb25tZW50KFBMKSAhPSBNRSApCisgICAgcmV0dXJuOworCisgIHN3aXRjaChjb3VudCkgeworICAgIGNhc2UgMDoKKyAgICAgIHRlbGxfb2JqZWN0KFBMLCBCUyhRdWVyeVByb3AoUF9JTlRfTE9ORykpKTsKKyAgICAgIGRlbGF5ID0gNDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgIHRlbGxfb2JqZWN0KFBMLCBCUygKKyAgICAgICAgIlxuRHUgc2NoYXVzdCBEaWNoIGVyc3RhdW50IHVtLiBEdSBiZWZpbmRlc3QgRGljaCBhbnNjaGVpbmVuZCBpbSAiCisgICAgICAgICJXZWx0YWxsLCBhYmVyIHdpZSBiaXN0IER1IGhpZXJoZXJnZWtvbW1lbj8gSXN0IGRhcyBzY2hvbiBkYXMgIgorICAgICAgICAiTW9yZ2VuR3JhdWVuLCBvZGVyIGJpc3QgRHUgd29obCBlcnN0IG5vY2ggYXVmIGRlbSBXZWcgZG9ydGhpbj8iKSk7CisgICAgICBkZWxheSA9IDg7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICB0ZWxsX29iamVjdChQTCwgQlMoCisgICAgICAgICJcbk1pdCBlaW5lbSBCbGljayBhdWYgRGVpbmUgVW1nZWJ1bmcgYmVtZXJrc3QgRHUsIGRhc3MgZGVyIFN0YXViLCAiCisgICAgICAgICJkZXIgRGljaCB1bWdpYnQsIHNpY2ggbGFuZ3NhbSBhdWYgRGljaCB6dXp1YmV3ZWdlbiBzY2hlaW50LiAiCisgICAgICAgICJEdSB3aWxsc3QgbmV1Z2llcmlnIGRhbmFjaCBncmVpZmVuLCBhYmVyIGVzIHdpbGwgRGlyIG5pY2h0ICIKKyAgICAgICAgImdlbGluZ2VuLiBWZXJ3dW5kZXJ0IHN0ZWxsc3QgRHUgZmVzdCwgZGFzcyBEdSBrZWluZSBIYWVuZGUgIgorICAgICAgICAiYmVzaXR6dCwgdW5kIGJlaSBuYWVoZXJlciBCZXRyYWNodHVuZyB3aXJkIERpciBrbGFyLCBkYXNzIER1ICIKKyAgICAgICAgImF1Y2ggc29uc3Qgbm9jaCB6aWVtbGljaCBrb2VycGVybG9zIGJpc3QhICIpKTsKKyAgICAgIGRlbGF5ID0gMTI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICB0ZWxsX29iamVjdChQTCwgQlMoCisgICAgICAgICJcbkRhcyBhZW5kZXJ0IHNpY2ggYWJlciBiYWxkLCBhbHMgZGVyIGdsaXR6ZXJuZGUgU3RhdWIgYWxsbWFlaGxpY2ggIgorICAgICAgICAidW0gRGljaCBoZXJ1bSBlaW5lIGR1cmNoc2NoZWluZW5kZSBHZXN0YWx0IHp1IGJpbGRlbiBiZWdpbm50LCAiCisgICAgICAgICJkaWUgc2ljaCB6dWVnaWcgdmVyZGljaHRldC4iKSk7CisgICAgICBkZWxheSA9IDg7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICBpbnQgZyA9IFBMLT5RdWVyeVByb3AoUF9HRU5ERVIpOworICAgICAgc3RyaW5nIGRlc2MgPSBQTC0+UXVlcnlQcm9wKFBfUkFDRVNUUklORylbMF07CisgICAgICBzdHJpbmcgbXNnID0gKGc9PU1BTEU/ImVpbiByaWNodGlnZXIgIjoiZWluZSByaWNodGlnZSAiKStkZXNjOworICAgICAgdGVsbF9vYmplY3QoUEwsIEJTKAorICAgICAgICAiXG5TY2hvbiBrdXJ6IGRhcmF1ZiBoYXQgc2ljaCBlaW4gZWxlZ2FudGVyIEtvZXJwZXIgZ2Vmb3JtdCwgZGVyICIKKyAgICAgICAgIm51biB2b2xsa29tbWVuIERpciBnZWhvZXJ0LiBEYXNzIER1IG5vY2ggbmFja3QgYmlzdCwgc3RvZXJ0IERpY2ggIgorICAgICAgICAibmljaHQgaW0gZ2VyaW5nc3RlbiwgZGVubiBlbmRsaWNoLCBlbmRsaWNoIGZ1ZWhsc3QgRHUgRGljaCAiCisgICAgICAgICJ3aWUgIittc2crIiEiKSk7CisgICAgICBkZWxheSA9IDEwOworICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgdGVsbF9vYmplY3QoUEwsIEJTKAorICAgICAgICAiXG5EZWluZSBCZWdlaXN0ZXJ1bmcgdWViZXIgRGVpbmVuIG1ha2VsbG9zZW4gS29lcnBlciB3aXJkIGphZWggIgorICAgICAgICAidW50ZXJicm9jaGVuLCBhbHMgcGxvZXR6bGljaCBkaWUgU3Rlcm5lIHZlcmJsYXNzZW4gdW5kIHNpY2ggbWl0ICIKKyAgICAgICAgInVuZmFzc2JhcmVtIFRlbXBvIHZvbiBEaXIgenUgZW50ZmVybmVuIHNjaGVpbmVuLiBEYW5uIHdpcmQgZXMgIgorICAgICAgICAia3VyeiBzY2h3YXJ6IHVtIERpY2ggaGVydW0gdW5kIGt1cnogZGFyYXVmIHdpZWRlciBoZWxsLiIpKTsKKyAgICAgIGRlbGF5ID0gODsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNjoKKyAgICAgIHRlbGxfb2JqZWN0KFBMLCAiXG4iK2JyZWFrX3N0cmluZygKKyAgICAgICAgIkhlcnpsaWNoIFdpbGxrb21tZW4hIFVlYnJpZ2Vucywgd2VubiBEdSBhdWYgZGVyICIKKyAgICAgICAgIkViZW5lIEFuZmFlbmdlciBtaXQgYW5kZXJlbiByZWRlbiB3aWxsc3QsIGZvbGdlbmRlciBUaXA6IFByb2JpZXJlICIKKyAgICAgICAgIm1hbCAnLWFuZiBIYWxsbyBNb3JnZW5ncmF1ZW4nIChuYXR1ZXJsaWNoIG9obmUgZGllICcgbWl0ICIKKyAgICAgICAgImVpbnp1Z2ViZW4pIGF1cy4iLCA3OCwgIk1lcmxpbiB0ZWlsdCBEaXIgbWl0OiAiKSk7CisgICAgICBkZWxheSA9IDY7CisgICAgICBicmVhazsKKyAgICBjYXNlIDc6CisgICAgICBpZiAoUEwtPlF1ZXJ5R3Vlc3QoKSApIHsKKyAgICAgICAgUEwtPm1vdmUoIi9naWxkZW4vYWJlbnRldXJlciIsIE1fR08pOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHRlbGxfb2JqZWN0KFBMLCAiXG4iK2JyZWFrX3N0cmluZygKKyAgICAgICAgICAiSWNoIHdlcmRlIERpY2ggamV0enQgaW4gZGFzIFR1dG9yaWFsIGZ1ZXIgQW5mYWVuZ2VyIGJld2VnZW4sIHdvICIKKyAgICAgICAgICAiRHUgRGVpbmUgZXJzdGVuIFNjaHJpdHRlIG1hY2hlbiBrYW5uc3QuLi4iLAorICAgICAgICAgIDc4LCAiTWVybGluIHRlaWx0IERpciBtaXQ6ICIpKyJcbiIpOworICAgICAgZGVsYXkgPSA0OworICAgICAgYnJlYWs7CisgICAgY2FzZSA4OgorICAgICAgUEwtPm1vdmUoVFVUU1RBUlQrZ2V0dWlkKFBMKSwgTV9HTyk7CisgICAgICByZXR1cm47IC8vIGNhbGxfb3V0IG5pY2h0IHdpZWRlciBhbndlcmZlbi4KKyAgIH0KKyAgICsrY291bnQ7CisgICBjYWxsX291dCgiU2VxdWVueiIsIGRlbGF5LCBjb3VudCk7Cit9CisKKy8vIEJlaSBEaXNjb25uZWN0IFNlcXVlbnogYWJicmVjaGVuLCBiZWkgUmUtTG9naW4gd2llZGVyIHN0YXJ0ZW4gbWl0CisvLyBjb3VudCA9PSA1IGQuaC4gU3BpZWxlciBmbGllZ3QgYWxzbyBxdWFzaSAiaW0gU2NobGFmIiB3ZWl0ZXIuLi4KK3ZvaWQgQmVjb21lc05ldERlYWQob2JqZWN0IHBsKSB7CisgIHdoaWxlKHJlbW92ZV9jYWxsX291dCgiU2VxdWVueiIpIT0tMSkKKyAgIDsKK30KKwordm9pZCBCZWNvbWVzTmV0QWxpdmUob2JqZWN0IHBsKSB7CisgIGlmIChpbnRlcmFjdGl2ZShwbCkpCisgICAgY2FsbF9vdXQoIlNlcXVlbnoiLCA2LCA1KTsKK30KKwpkaWZmIC0tZ2l0IGEvcm9vbS93ZWxjb21lL3ZpcnR1YWxfY29tcGlsZXIuYyBiL3Jvb20vd2VsY29tZS92aXJ0dWFsX2NvbXBpbGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNlZWEyYwotLS0gL2Rldi9udWxsCisrKyBiL3Jvb20vd2VsY29tZS92aXJ0dWFsX2NvbXBpbGVyLmMKQEAgLTAsMCArMSwyNyBAQAorI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDx2X2NvbXBpbGVyLmg+Citpbmhlcml0ICIvc3RkL3ZpcnR1YWwvdl9jb21waWxlciI7CisKK3ZvaWQgY3JlYXRlKCkgeworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfU1REX09CSkVDVCwgIi9yb29tL3dlbGNvbWUvc3RkIik7Cit9CisKK3N0cmluZyBWYWxpZGF0ZShzdHJpbmcgZmlsZSkgeworCisgIGZpbGU9OjpWYWxpZGF0ZShmaWxlKTsKKworICAvLyBrZWluZSBVbnRlcnZlcnplaWNobmlzc2UsIGd1ZWx0aWdlIENoYXJuYW1lbgorICBpZiAoc3Ryc3RyKGZpbGUsIi8iKSA9PSAtMQorICAgICAgJiYgc2l6ZW9mKGZpbGUpIDw9IDExIC8vIGNoYXJuYW1lbiA8PTExIHplaWNoZW4KKyAgICAgICYmIChyZWdtYXRjaChmaWxlLCJbYS16QS1aXSsiKSA9PSBmaWxlIC8vIG51ciBBLVosYS16CisgICAgICAgICAgfHwgc3Ryc3RyKGZpbGUsImdhc3QiKSA9PSAwIC8vIG9kZXIgR2Flc3RlCisgICAgICAgICAgKQorICAgICApCisgIHsKKyAgICAvLyBFaWdlbnRsaWNoIFBfQ09NUElMRVJfUEFUSCwgYWJlciBoaWVyIGdlaHQgamV0enQgYXVjaCBfX0RJUl9fCisgICAgcmV0dXJuIF9fRElSX18gKyBmaWxlOworICB9CisgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9zZWN1cmUvUGxheWVyRGVsZXRlci5jIGIvc2VjdXJlL1BsYXllckRlbGV0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjFjZTJlCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL1BsYXllckRlbGV0ZXIuYwpAQCAtMCwwICsxLDg3IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gbWFzdGVyLmMgLS0gbWFzdGVyIG9iamVjdAorLy8KKy8vICRJZDogbWFzdGVyLmMgNzMzNiAyMDA5LTExLTE5IDIwOjM3OjMxWiBaZXNzdHJhICQKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIG5vX3NoYWRvdworI3ByYWdtYSBub19pbmhlcml0CisjcHJhZ21hIHZlcmJvc2VfZXJyb3JzCisjcHJhZ21hIGNvbWJpbmVfc3RyaW5ncworI3ByYWdtYSBwZWRhbnRpYworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSB3YXJuX2RlcHJlY2F0ZWQKKworI2luY2x1ZGUgPGZpbGVzLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8ZXZlbnRzLmg+CisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSB7CisgIHNldGV1aWQoZ2V0dWlkKHRoaXNfb2JqZWN0KCkpKTsKK30KKworcHVibGljIHZhcmFyZ3MgaW50IERlbGV0ZShzdHJpbmcgcGxuYW1lLCBpbnQgbm9iYW5pc2gsIGludCBub2Nsb25lKSB7CisgIC8vIGRlZmluaXRpdiBudXIgZnVlciBFTSsgdW5kIG51ciBPYmpla3QgbWl0IExldmVsIDY2KyBpbiBkZXIgQ2FsbGNoYWluLgorICBpZiAoIUFSQ0hfU0VDVVJJVFkgfHwgcHJvY2Vzc19jYWxsKCkpCisgICAgcmV0dXJuIC0xOworCisgIC8vIGV4aXN0aWVydCBkZXIgU3BpZWxlcj8KKyAgaWYgKCFzdHJpbmdwKHBsbmFtZSkKKyAgICAgIHx8ICFtYXN0ZXIoKS0+ZmluZF91c2VyaW5mbyhwbG5hbWUpKQorICAgIHJldHVybiAtMjsKKyAgLy8gZ2lidCBlcyBkYXMgU3BpZWxlcm9iamVrdD8KKyAgb2JqZWN0IHBsb2IgPSBmaW5kX3BsYXllcihwbG5hbWUpIHx8IGZpbmRfbmV0ZGVhZChwbG5hbWUpOworICAvLyB3ZW5uIGtlaW4gT2JqZWt0OiBEdW1teW9iamVrdCBlcnpldWdlbgorICBpZiAoIW9iamVjdHAocGxvYikgJiYgIW5vY2xvbmUpIHsKKyAgICBjYXRjaChwbG9iID0gX19jcmVhdGVfcGxheWVyX2R1bW15KHBsbmFtZSkpOworICB9CisKKyAgaW50IHdsZXZlbCA9IHF1ZXJ5X3dpel9sZXZlbChwbG5hbWUpOworICBzdHJpbmcgcGFydF9maWxlbmFtZT0iLyIrcGxuYW1lWzAuLjBdKyIvIitwbG5hbWUrIi5vIjsKKworICAvLyBnZ2YuIGJhbmlzaGVuCisgIGlmICghbm9iYW5pc2ggJiYgd2xldmVsID49IExFQVJORVJfTFZMKQorICAgIG1hc3RlcigpLT5CYW5pc2hOYW1lKHBsbmFtZSwgIlNvIGhpZXNzIG1hbCBlaW4gTWFnaWVyIGhpZXIiLCAxKTsKKyAgZWxzZSBpZiAoIW5vYmFuaXNoICYmIHdsZXZlbCA+PSBTRUVSX0xWTCkKKyAgICBtYXN0ZXIoKS0+QmFuaXNoTmFtZShwbG5hbWUsICJTbyBoaWVzcyBtYWwgZWluIFNlaGVyIGhpZXIiLCAxKTsKKworICAvLyBTcGllbHBhdXNlbiBhdWZoZWJlbgorICBtYXN0ZXIoKS0+VEJhbmlzaE5hbWUocGxuYW1lLCAwKTsKKworICAvLyBsb2dnZW4KKyAgbG9nX2ZpbGUoIkFSQ0gvQURNSU5fVVNFUkRFTEVURSIsCisgICAgICBzcHJpbnRmKCIlczogJXMgZ2Vsb2VzY2h0IGR1cmNoICVzICglcylcbiIsCisgICAgICAgICAgICAgc3RyZnRpbWUoIiV5JW0lZC0lSCVNJVMiKSwKKyAgICAgICAgICAgICBwbG5hbWUsCisgICAgICAgICAgICAgc2VjdXJlX2V1aWQoKSwKKyAgICAgICAgICAgICB0b19zdHJpbmcocXVlcnlfaXBfbnVtYmVyKHRoaXNfaW50ZXJhY3RpdmUoKSkpICkpOworCisKKyAgLy8gTG9lc2NoLUV2ZW50IGF1c2xvZXNlbgorICBpZiAocGxvYikgeworICAgIEVWRU5URC0+VHJpZ2dlckV2ZW50KEVWVF9MSUJfUExBWUVSX0RFTEVUSU9OLCAoWworICAgICAgICAgICAgRV9QTE5BTUU6IHBsbmFtZSwKKyAgICAgICAgICAgIEVfRU5WSVJPTk1FTlQ6IGVudmlyb25tZW50KHBsb2IpLAorICAgICAgICAgICAgRV9HVUlMRE5BTUU6IHBsb2ItPlF1ZXJ5UHJvcChQX0dVSUxEKSBdKSApOworCisgICAgLy8gU3BpZWxlcm9iamVrdCB6ZXJzdG9lcmVuCisgICAgcGxvYi0+bW92ZSgiL3Jvb20vdm9pZCIsIE1fTk9DSEVDSyk7CisgICAgcGxvYi0+cmVtb3ZlKDEpOworICB9CisKKyAgLy8gRmlsZXMgbG9lc2NoZW4KKyAgaWYgKGZpbGVfc2l6ZSgiLyJTRUNVUkVESVIiL3NhdmUiK3BhcnRfZmlsZW5hbWUpID4gRlNJWkVfTk9GSUxFKQorICAgIHJtKCIvIlNFQ1VSRURJUiIvc2F2ZSIrcGFydF9maWxlbmFtZSk7CisgIGlmIChmaWxlX3NpemUoIi8iTElCU0FWRURJUiArIHBhcnRfZmlsZW5hbWUpID4gRlNJWkVfTk9GSUxFKQorICAgIHJtKCIvIkxJQlNBVkVESVIgKyBwYXJ0X2ZpbGVuYW1lKTsKKyAgaWYgKGZpbGVfc2l6ZSgiLyJNQUlMRElSICsgcGFydF9maWxlbmFtZSkgPiBGU0laRV9OT0ZJTEUpCisgICAgcm0oIi8iTUFJTERJUiArIHBhcnRfZmlsZW5hbWUpOworCisgIG1hc3RlcigpLT5SZW1vdmVGcm9tQ2FjaGUocGxuYW1lKTsKKworICByZXR1cm4gMTsKK30KKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL2F3bWFzdGVyLmMgYi9zZWN1cmUvYXdtYXN0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2NkYjFkCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL2F3bWFzdGVyLmMKQEAgLTAsMCArMSw0MzMgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBhd21hc3Rlci5jIC0tIEFybW91cnMtIGFuZCBXZWFwb25zLU1hc3RlcgorLy8KKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIG5vX3NoYWRvdworI3ByYWdtYSBub19pbmhlcml0CisjcHJhZ21hIHZlcmJvc2VfZXJyb3JzCisjcHJhZ21hIGNvbWJpbmVfc3RyaW5ncworI3ByYWdtYSBwZWRhbnRpYworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSB3YXJuX2RlcHJlY2F0ZWQKKworI2luY2x1ZGUgPGNvbWJhdC5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorCisjZGVmaW5lIFNBVkVGSUxFICAiL3NlY3VyZS9BUkNIL2F3bWFzdGVyIgorI2RlZmluZSBBRFVNUEZJTEUgIi9sb2cvQVJDSC9SVUVTVFVOR0VOIgorI2RlZmluZSBERFVNUEZJTEUgIi9sb2cvQVJDSC9EQU1BR0VSUyIKKyNkZWZpbmUgV0RVTVBGSUxFICIvbG9nL0FSQ0gvV0FGRkVOIgorCisjZGVmaW5lIEFXRl9QVVRPTiAgMQorI2RlZmluZSBBV0ZfUFVUT0ZGIDIKKyNkZWZpbmUgQVdGX0JPT1NUICA0CisjZGVmaW5lIEFXRl9aQVVCRVIgOAorI2RlZmluZSBBV0ZfUkVTSVNUIDE2CisKKyNkZWZpbmUgQVdNX1RZUEUgICAgICAwCisjZGVmaW5lIEFXTV9DTEFTUyAgICAgMQorI2RlZmluZSBBV01fRUZGX0NMQVNTIDIKKyNkZWZpbmUgQVdNX0ZMQUdTICAgICAzCisjZGVmaW5lIEFXTV9XRUlHSFQgICAgNAorI2RlZmluZSBBV01fVkFMVUUgICAgIDUKKyNkZWZpbmUgQVdNX0hBTkRTICAgICA2CisjZGVmaW5lIEFXTV9EX1RZUEUgICAgNworI2RlZmluZSBBV01fWF9DTEFTUyAgIDgKKyNkZWZpbmUgQVdNX1RJTUUgICAgICA5CisKK21hcHBpbmcgYXJtb3Vycyx3ZWFwb25zLGRhbWFnZXJzOworcHJpdmF0ZSBpbnQgc2F2ZV9tZV9zb29uOworCitwcml2YXRlIGludCBhbGxvd2VkKCkKK3sKKyAgaWYgKHByZXZpb3VzX29iamVjdCgpICYmIGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpPT1ST09USUQpCisgICAgcmV0dXJuIDE7CisgIGlmICghcHJvY2Vzc19jYWxsKCkgJiYgcHJldmlvdXNfb2JqZWN0KCkgJiYgdGhpc19pbnRlcmFjdGl2ZSgpICYmIEFSQ0hfU0VDVVJJVFkpCisgICAgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCit2b2lkIGNyZWF0ZSgpCit7CisgICAgc2V0ZXVpZChnZXR1aWQodGhpc19vYmplY3QoKSkpOworCisgICAgaWYgKCFyZXN0b3JlX29iamVjdChTQVZFRklMRSkpCisgICAgeworICAgICAgICBhcm1vdXJzID0gKFtdKTsKKyAgICAgICAgd2VhcG9ucyA9IChbXSk7CisgICAgICAgIGRhbWFnZXJzID0gKFtdKTsKKyAgICB9CisgICAgaWYgKHdpZHRob2YoZGFtYWdlcnMpID09IDEpIHsKKyAgICAgIG1hcHBpbmcgdG1wID0gZGFtYWdlcnM7CisgICAgICBkYW1hZ2VycyA9IG1fYWxsb2NhdGUoc2l6ZW9mKHRtcCksMik7CisgICAgICBmb3JlYWNoKHN0cmluZyByLCBpbnQgZmxhZzogdG1wKSB7CisgICAgICAgIGRhbWFnZXJzW3IsMF09ZmxhZzsKKyAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgc2F2ZV9tZShpbnQgbm93KQoreworICBpZiAobm93KQorICAgIHNhdmVfb2JqZWN0KFNBVkVGSUxFKTsKKyAgZWxzZQorICAgIHNhdmVfbWVfc29vbj0xOworfQorCit2b2lkIHJlc2V0KCkgeworICBpZiAoc2F2ZV9tZV9zb29uKQorICB7CisgICAgc2F2ZV9tZV9zb29uPTA7CisgICAgc2F2ZV9tZSgxKTsKKyAgfQorfQorCitwdWJsaWMgdmFyYXJncyBpbnQgcmVtb3ZlKGludCBzaWxlbnQpIHsKKyAgc2F2ZV9tZSgxKTsKKyAgZGVzdHJ1Y3QodGhpc19vYmplY3QoKSk7CisgIHJldHVybiAxOworfQorCitpbnQgeGZsYWdzKG9iamVjdCBvYil7CisgICAgaW50IHJlOworICAgIG1hcHBpbmcgbTsKKyAgICBpZiAoIW9iIHx8ICFvYmplY3RwKG9iKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmU9MDsKKyAgICBpZiAoKChvYmplY3Qpb2ItPlF1ZXJ5UHJvcChQX1dFQVJfRlVOQykpPT1vYiAgfHwKKyAgICAgICAgKChvYmplY3Qpb2ItPlF1ZXJ5UHJvcChQX1dJRUxEX0ZVTkMpKT09b2IgKQorICAgICAgICByZSArPSBBV0ZfUFVUT047CisgICAgaWYgKCgob2JqZWN0KW9iLT5RdWVyeVByb3AoUF9SRU1PVkVfRlVOQykpPT1vYiAgfHwKKyAgICAgICAgKChvYmplY3Qpb2ItPlF1ZXJ5UHJvcChQX1VOV0lFTERfRlVOQykpPT1vYiApCisgICAgICAgIHJlICs9IEFXRl9QVVRPRkY7CisgICAgaWYgKCgob2JqZWN0KW9iLT5RdWVyeVByb3AoUF9ERUZFTkRfRlVOQykpPT1vYiB8fAorICAgICAgICAoKG9iamVjdClvYi0+UXVlcnlQcm9wKFBfSElUX0ZVTkMpKT09b2IgICAgKQorICAgICAgICByZSArPSBBV0ZfQk9PU1Q7CisgICAgLy8gaXN0cyBuZW4gTWFwcGluZyB1bmQgbmljaHQgbGVlcj8KKyAgICBpZiAobWFwcGluZ3AobT0obWFwcGluZylvYi0+UXVlcnlQcm9wKFBfUkVTSVNUQU5DRV9TVFJFTkdUSFMpKQorICAgICAgICAmJiBzaXplb2YobSkpCisgICAgICAgIHJlICs9IEFXRl9SRVNJU1Q7CisgICAgcmV0dXJuIHJlOworfQorCit2b2lkIFJlZ2lzdGVyQXJtb3VyKCkKK3sgICBvYmplY3QgIG9iOworICAgIHN0cmluZyAgaWQ7CisgICAgaW50ICAgICBmbGFnLGg7CisKKyAgICBpZiAoIW9iamVjdHAob2I9cHJldmlvdXNfb2JqZWN0KCkpIHx8IAorICAgICAgbWVtYmVyKGluaGVyaXRfbGlzdChvYiksIi9zdGQvYXJtb3VyLmMiKT09LTEpCisgICAgICByZXR1cm47CisgICAgaWQgPSBleHBsb2RlKG9iamVjdF9uYW1lKG9iKSwiIyIpWzBdOworICAgIGlmIChtZW1iZXIoYXJtb3VycyxpZCkpCisgICAgeworICAgICAgICBhcm1vdXJzW2lkXVtBV01fVElNRV09dGltZSgpOworICAgICAgICBmbGFnPTA7CisgICAgICAgIGlmICgoaD0oaW50KW9iLT5RdWVyeVByb3AoUF9BQykpID4gYXJtb3Vyc1tpZF1bQVdNX0NMQVNTXSkKKyAgICAgICAgeworICAgICAgICAgICAgYXJtb3Vyc1tpZF1bQVdNX0NMQVNTXT1oOworICAgICAgICAgICAgZmxhZz0xOworICAgICAgICB9CisgICAgICAgIGlmICgoaD0oaW50KW9iLT5RdWVyeVByb3AoUF9FRkZFQ1RJVkVfQUMpKSA+IGFybW91cnNbaWRdW0FXTV9FRkZfQ0xBU1NdKQorICAgICAgICB7CisgICAgICAgICAgICBhcm1vdXJzW2lkXVtBV01fRUZGX0NMQVNTXT1oOworICAgICAgICAgICAgZmxhZz0xOworICAgICAgICB9CisgICAgICAgIGlmICgoaD0oaW50KW9iLT5RdWVyeVByb3AoUF9OUl9IQU5EUykpIDwgYXJtb3Vyc1tpZF1bQVdNX0hBTkRTXSkKKyAgICAgICAgeworICAgICAgICAgICAgYXJtb3Vyc1tpZF1bQVdNX0hBTkRTXT1oOworICAgICAgICAgICAgZmxhZz0xOworICAgICAgICB9CisgICAgICAgIGlmICgoaD14ZmxhZ3Mob2IpKSAhPSBhcm1vdXJzW2lkXVtBV01fRkxBR1NdKQorICAgICAgICB7CisgICAgICAgICAgICBhcm1vdXJzW2lkXVtBV01fRkxBR1NdPWg7CisgICAgICAgICAgICBmbGFnPTE7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGFybW91cnMgKz0gKFsgaWQgOiAKKyAgICAgICAgKFsKKyAgICAgICAgICAgIEFXTV9UWVBFICAgICAgOiBvYi0+UXVlcnlQcm9wKFBfQVJNT1VSX1RZUEUpICwKKyAgICAgICAgICAgIEFXTV9DTEFTUyAgICAgOiBvYi0+UXVlcnlQcm9wKFBfQUMpICwKKyAgICAgICAgICAgIEFXTV9FRkZfQ0xBU1MgOiBvYi0+UXVlcnlQcm9wKFBfRUZGRUNUSVZFX0FDKSAsCisgICAgICAgICAgICBBV01fRkxBR1MgICAgIDogeGZsYWdzKG9iKSwKKyAgICAgICAgICAgIEFXTV9XRUlHSFQgICAgOiBvYi0+UXVlcnlQcm9wKFBfV0VJR0hUKSAsCisgICAgICAgICAgICBBV01fVkFMVUUgICAgIDogb2ItPlF1ZXJ5UHJvcChQX1ZBTFVFKSAsCisgICAgICAgICAgICBBV01fSEFORFMgICAgIDogb2ItPlF1ZXJ5UHJvcChQX05SX0hBTkRTKSAsIC8vIEZ1ZXIgU2NoaWxkZQorICAgICAgICAgICAgQVdNX0RfVFlQRSAgICA6IG9iLT5RdWVyeVByb3AoUF9EQU1fVFlQRSkgLAorICAgICAgICAgICAgQVdNX1hfQ0xBU1MgICA6IG9iLT5RdWVyeVByb3AoUF9FRkZFQ1RJVkVfV0MpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ItPlF1ZXJ5UHJvcChQX1dDKSwKKyAgICAgICAgICAgIEFXTV9USU1FICAgICAgOiB0aW1lKCkKKyAgICAgICAgXSkgXSk7CisgICAgfQorICAgIHNhdmVfbWUoMCk7Cit9CisKK3ZvaWQgUmVnaXN0ZXJXZWFwb24oKQoreyAgIG9iamVjdCAgb2I7CisgICAgc3RyaW5nICBpZDsKKyAgICBpbnQgICAgIGZsYWcsaDsKKworICAgIGlmICghb2JqZWN0cChvYj1wcmV2aW91c19vYmplY3QoKSkgfHwKKyAgICAgIG1lbWJlcihpbmhlcml0X2xpc3Qob2IpLCIvc3RkL3dlYXBvbi5jIik9PS0xKQorICAgICAgcmV0dXJuOworICAgIGlkID0gZXhwbG9kZShvYmplY3RfbmFtZShvYiksIiMiKVswXTsKKyAgICBpZiAobWVtYmVyKHdlYXBvbnMsaWQpKQorICAgIHsKKyAgICAgICAgd2VhcG9uc1tpZF1bQVdNX1RJTUVdID0gdGltZSgpOworICAgICAgICBmbGFnPTA7CisgICAgICAgIGlmICgoaD0oaW50KW9iLT5RdWVyeVByb3AoUF9XQykpID4gd2VhcG9uc1tpZF1bQVdNX0NMQVNTXSkKKyAgICAgICAgeworICAgICAgICAgICAgd2VhcG9uc1tpZF1bQVdNX0NMQVNTXT1oOworICAgICAgICAgICAgZmxhZz0xOworICAgICAgICB9CisgICAgICAgIGlmICgoaD0oaW50KW9iLT5RdWVyeVByb3AoUF9FRkZFQ1RJVkVfV0MpKSA+IHdlYXBvbnNbaWRdW0FXTV9FRkZfQ0xBU1NdKQorICAgICAgICB7CisgICAgICAgICAgICB3ZWFwb25zW2lkXVtBV01fRUZGX0NMQVNTXT1oOworICAgICAgICAgICAgZmxhZz0xOworICAgICAgICB9CisgICAgICAgIGlmICgoaD0oaW50KW9iLT5RdWVyeVByb3AoUF9OUl9IQU5EUykpIDwgd2VhcG9uc1tpZF1bQVdNX0hBTkRTXSkKKyAgICAgICAgeworICAgICAgICAgICAgd2VhcG9uc1tpZF1bQVdNX0hBTkRTXT1oOworICAgICAgICAgICAgZmxhZz0xOworICAgICAgICB9CisgICAgICAgIGlmICgoaD14ZmxhZ3Mob2IpKSAhPSB3ZWFwb25zW2lkXVtBV01fRkxBR1NdKQorICAgICAgICB7CisgICAgICAgICAgICB3ZWFwb25zW2lkXVtBV01fRkxBR1NdPWg7CisgICAgICAgICAgICBmbGFnPTE7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHdlYXBvbnMgKz0gKFsgaWQgOgorICAgICAgICAoWworICAgICAgICAgICAgQVdNX1RZUEUgICAgICA6IG9iLT5RdWVyeVByb3AoUF9XRUFQT05fVFlQRSkgLAorICAgICAgICAgICAgQVdNX0NMQVNTICAgICA6IG9iLT5RdWVyeVByb3AoUF9XQykgLAorICAgICAgICAgICAgQVdNX0VGRl9DTEFTUyA6IG9iLT5RdWVyeVByb3AoUF9FRkZFQ1RJVkVfV0MpICwKKyAgICAgICAgICAgIEFXTV9GTEFHUyAgICAgOiB4ZmxhZ3Mob2IpLAorICAgICAgICAgICAgQVdNX1dFSUdIVCAgICA6IG9iLT5RdWVyeVByb3AoUF9XRUlHSFQpICwKKyAgICAgICAgICAgIEFXTV9WQUxVRSAgICAgOiBvYi0+UXVlcnlQcm9wKFBfVkFMVUUpICwKKyAgICAgICAgICAgIEFXTV9IQU5EUyAgICAgOiBvYi0+UXVlcnlQcm9wKFBfTlJfSEFORFMpICwKKyAgICAgICAgICAgIEFXTV9EX1RZUEUgICAgOiBvYi0+UXVlcnlQcm9wKFBfREFNX1RZUEUpICwKKyAgICAgICAgICAgIEFXTV9YX0NMQVNTICAgOiBvYi0+UXVlcnlQcm9wKFBfRUZGRUNUSVZFX0FDKSB8fCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYi0+UXVlcnlQcm9wKFBfQUMpLAorICAgICAgICAgICAgQVdNX1RJTUUgICAgICA6IHRpbWUoKQorICAgICAgICBdKSBdKTsKKyAgICB9CisgICAgc2F2ZV9tZSgwKTsKK30KKwordm9pZCBSZWdpc3RlckRhbWFnZXIob2JqZWN0IGRhbV9vYixpbnQgb2xkX2RhbSwgaW50IG5ld19kYW0pCit7ICAgb2JqZWN0IG9iOworICAgIGludCBmbGFnOworICAgIHN0cmluZyBmbjsKKworICAgIGlmICghb2JqZWN0cChvYj1wcmV2aW91c19vYmplY3QoKSkgfHwKKyAgICAgIChtZW1iZXIoaW5oZXJpdF9saXN0KG9iKSwiL3N0ZC93ZWFwb24uYyIpPT0tMSAmJgorICAgICAgIG1lbWJlcihpbmhlcml0X2xpc3Qob2IpLCIvc3RkL2FybW91ci5jIik9PS0xICkpCisgICAgICByZXR1cm47CisgICAgaWYgKG9sZF9kYW0+bmV3X2RhbSkgLy8gUmVwYWlyCisgICAgICAgIGZsYWc9MjsKKyAgICBlbHNlIGlmIChuZXdfZGFtPm9sZF9kYW0pIC8vIERhbWFnZQorICAgICAgICBmbGFnPTE7CisgICAgZWxzZQorICAgICAgICByZXR1cm47CisgICAgaWYgKCFvYmplY3RwKGRhbV9vYikpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoIShmbj1vbGRfZXhwbG9kZShvYmplY3RfbmFtZShkYW1fb2IpLCIjIilbMF0pIHx8ICFzdHJpbmdwKGZuKSkKKyAgICAgICAgcmV0dXJuOworICAgIGRhbWFnZXJzW2ZuLDBdPWRhbWFnZXJzW2ZuLDBdfGZsYWc7CisgICAgZGFtYWdlcnNbZm4sMV09dGltZSgpOyAKKyAgICBzYXZlX21lKDApOworfQorCitzdHJpbmcgZHRkdW1wKG1peGVkIGFyZykKK3sgICBzdHJpbmcgcmU7CisgICAgaW50IGksdzsKKworICAgIGlmIChzdHJpbmdwKGFyZykpCisgICAgICAgIHJldHVybiBjYXBpdGFsaXplKGFyZyk7CisgICAgaWYgKCFwb2ludGVycChhcmcpIHx8ICFzdHJpbmdwKGFyZ1swXSkpCisgICAgICAgIHJldHVybiAiPE5PTkU+IjsKKyAgICBpZiAoKGk9c2l6ZW9mKGFyZykpPT0xKQorICAgICAgICByZXR1cm4gY2FwaXRhbGl6ZShhcmdbMF0pOworICAgIHcgPSAoMzEtaSkvaTsKKyAgICBpZiAody0tPDEpCisgICAgICAgIHJldHVybiAiPE1BTlk+IjsKKyAgICBmb3IgKHJlPSIiLC0taTtpPj0wO2ktLSkKKyAgICB7CisgICAgICAgIGlmICghc3RyaW5ncChhcmdbaV0pKQorICAgICAgICAgICAgcmUgKz0gIi0iOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZSArPSBjYXBpdGFsaXplKGFyZ1tpXVswLi53XSk7CisgICAgICAgIGlmIChpKQorICAgICAgICAgICAgcmUgKz0gInwiOworICAgIH0KKyAgICByZXR1cm4gcmU7Cit9CisKK2ludCBEdW1wKG1peGVkIHdoYXQsIGludCBzb3J0aWR4KQoreyAgIHN0cmluZyAgZmlsZSwqaW5kOworICAgIG1hcHBpbmcgZHVtcDsKKworICAgIGlmICghYWxsb3dlZCgpKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBpZiAoIXdoYXQpCisgICAgeworICAgICAgICB3cml0ZSgiTmltbSBkb2NoIG1hbCBlaW5lbiByaWNodGlnZW4gUGFyYW1ldGVyIVxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoc3RyaW5ncCh3aGF0KSAmJiBzaXplb2Yod2hhdCk+MCkKKyAgICB7CisgICAgICAgIHdoYXQ9PXdoYXRbMC4uMF07CisgICAgICAgIGlmICh3aGF0PT0iYSIpCisgICAgICAgICAgICB3aGF0PTE7CisgICAgICAgIGVsc2UgaWYgKHdoYXQ9PSJ3IikKKyAgICAgICAgICAgIHdoYXQ9MjsKKyAgICAgICAgZWxzZSBpZiAod2hhdD09ImQiKQorICAgICAgICAgICAgd2hhdD0zOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHdyaXRlKCJOaW1tIGRvY2ggbWFsIGVpbmVuIHJpY2h0aWdlbiBQYXJhbWV0ZXIhXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIGlmICghaW50cCh3aGF0KSB8fCB3aGF0PDEgfHwgd2hhdD4zKQorICAgIHsKKyAgICAgICAgd3JpdGUoIk5pbW0gZG9jaCBtYWwgZWluZW4gcmljaHRpZ2VuIFBhcmFtZXRlciFcbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKHdoYXQ9PTMpIC8vIERpZSAnZGFtYWdlcnMnIGhhYmVuIGVpbiBhbmRlcmVzIEF1c2dhYmVmb3JtYXQKKyAgICB7CisgICAgICAgIHByaW50ZigiQVdNOiBEdW1waW5nICdkYW1hZ2VycycgdG8gJyVzJ1xuIixERFVNUEZJTEUpOworICAgICAgICBpZiAoc2l6ZW9mKGRhbWFnZXJzKSA8IDEpIHsKKyAgICAgICAgICAgIHdyaXRlKCJBV006IER1bXAgYWJvcnRlZCwgbWFwcGluZyBlbXB0eS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZpbGVfc2l6ZShERFVNUEZJTEUpPjEpCisgICAgICAgICAgICBybShERFVNUEZJTEUpOworICAgICAgICAKKyAgICAgICAgLy8gbmFjaCBsZXR6dGVyIEFrdHVhbGlzaWVydW5nIHNvcnRpZXJlbi4KKyAgICAgICAgbWl4ZWQgc29ydGVkID0gc29ydF9hcnJheShtX2luZGljZXMoZGFtYWdlcnMpLAorICAgICAgICAgICAgZnVuY3Rpb24gaW50IChzdHJpbmcgYSwgc3RyaW5nIGIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGFtYWdlcnNbYSwxXSA8IGRhbWFnZXJzW2IsMV07CisgICAgICAgICAgICB9ICk7CisKKyAgICAgICAgc3RyaW5nIGF1c2dhYmUgPSBzcHJpbnRmKAorICAgICAgICAgICAgIi0tLSBEYW1hZ2Vycy1EdW1wIC0tLSAlcyAtLS0gJXMgLS0tXG5cbiIrCisgICAgICAgICAgICAiJToxNXMgRCBSIFtGaWxlbmFtZV1cbiIsCisgICAgICAgICAgICBkdGltZSh0aW1lKCkpLGNhcGl0YWxpemUoZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSkpLAorICAgICAgICAgICAgIkRhdHVtL1plaXQiKTsKKyAgICAgICAgZm9yZWFjaChzdHJpbmcgcnVlIDogc29ydGVkKSB7CisgICAgICAgICAgICBhdXNnYWJlICs9IHNwcmludGYoIiU6MTVzICUxcyAlMXMgJXNcbiIsCisgICAgICAgICAgICAgICAgc3RyZnRpbWUoIiV5JW0lZC0lSDolTTolUyIsZGFtYWdlcnNbcnVlLDFdKSwKKyAgICAgICAgICAgICAgICAoZGFtYWdlcnNbcnVlLDBdJjE/IisiOiItIiksCisgICAgICAgICAgICAgICAgKGRhbWFnZXJzW3J1ZSwwXSYyPyIrIjoiLSIpLAorICAgICAgICAgICAgICAgIHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHdyaXRlX2ZpbGUoRERVTVBGSUxFLCBhdXNnYWJlKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmICh3aGF0PT0yKQorICAgICAgICB3aGF0PTA7CisgICAgZmlsZT0od2hhdD9BRFVNUEZJTEU6V0RVTVBGSUxFKTsKKworICAgIHByaW50ZigiQVdNOiBEdW1waW5nICclcycgdG8gJyVzJ1xuIiwKKyAgICAgICAgKHdoYXQ/ImFybW91cnMiOiJ3ZWFwb25zIiksZmlsZSk7CisgICAgCisgICAgZHVtcD0od2hhdD9hcm1vdXJzOndlYXBvbnMpOworICAgIAorICAgIGlmIChzb3J0aWR4KSB7CisgICAgICBpbmQgPSBzb3J0X2FycmF5KG1faW5kaWNlcyhkdW1wKSwKKyAgICAgICAgICBmdW5jdGlvbiBpbnQgKHN0cmluZyBhLCBzdHJpbmcgYikKKyAgICAgICAgICB7cmV0dXJuIGR1bXBbYV1bc29ydGlkeF0gPCBkdW1wW2JdW3NvcnRpZHhdO30gKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgaW5kID0gc29ydF9hcnJheShtX2luZGljZXMoZHVtcCksIyc+KTsKKyAgICAKKyAgICBpZiAoc2l6ZW9mKGluZCkgPCAxKQorICAgIHsKKyAgICAgICAgd3JpdGUoIkFXTTogRHVtcCBhYm9ydGVkLCBtYXBwaW5nIGVtcHR5LlxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGlmIChmaWxlX3NpemUoZmlsZSk+MSkKKyAgICAgICAgcm0oZmlsZSk7CisgICAgCisgICAgc3RyaW5nIGF1c2dhYmUgPSBzcHJpbnRmKAorICAgICAgICAiLS0tICVzLUR1bXAgLS0tICVzIC0tLSAlcyAtLS1cblxuIisKKyAgICAgICAgIltGaWxlbmFtZV0sIERhdHVtL1plaXRcbiIrCisgICAgICAgICIgICAgX19fX1R5cF9fXyBDTFMgRUNMIFhDTCBORkJSIFdHSFQuIFZBTFVFIEggJTMwLjMwJ18nfHNcbiIsCisgICAgICAgICh3aGF0PyJSdWVzdHVuZ3MiOiJXYWZmZW4iKSxkdGltZSh0aW1lKCkpLAorICAgICAgICBjYXBpdGFsaXplKGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpKSwiRGFtVHlwZShzKSIpOworCisgICAgZm9yZWFjaChzdHJpbmcgaW5kZXggOiBpbmQpCisgICAgeworICAgICAgICBhdXNnYWJlICs9IHNwcmludGYoCisgICAgICAgICAgICAiWyVzXSAlc1xuICAgICUxMHMgJTNkICUzZCAlM2QgJTFzJTFzJTFzJTFzICU1ZCAlNWQgJTFkICUtMzAuMzBzXG4iLAorICAgICAgICAgICAgaW5kZXgsIHN0cmZ0aW1lKCIleSVtJWQtJUg6JU06JVMiLGR1bXBbaW5kZXhdW0FXTV9USU1FXSksCisgICAgICAgICAgICBkdW1wW2luZGV4XVtBV01fVFlQRV0sCisgICAgICAgICAgICBkdW1wW2luZGV4XVtBV01fQ0xBU1NdLAorICAgICAgICAgICAgZHVtcFtpbmRleF1bQVdNX0VGRl9DTEFTU10sCisgICAgICAgICAgICBkdW1wW2luZGV4XVtBV01fWF9DTEFTU10sCisgICAgICAgICAgIChkdW1wW2luZGV4XVtBV01fRkxBR1NdJkFXRl9QVVRPTj8iKyI6Ii0iKSwKKyAgICAgICAgICAgKGR1bXBbaW5kZXhdW0FXTV9GTEFHU10mQVdGX1BVVE9GRj8iKyI6Ii0iKSwKKyAgICAgICAgICAgKGR1bXBbaW5kZXhdW0FXTV9GTEFHU10mQVdGX0JPT1NUPyIrIjoiLSIpLAorICAgICAgICAgICAoZHVtcFtpbmRleF1bQVdNX0ZMQUdTXSZBV0ZfUkVTSVNUPyIrIjoiLSIpLAorICAgICAgICAgICAgZHVtcFtpbmRleF1bQVdNX1dFSUdIVF0sCisgICAgICAgICAgICBkdW1wW2luZGV4XVtBV01fVkFMVUVdLAorICAgICAgICAgICAgZHVtcFtpbmRleF1bQVdNX0hBTkRTXSwKKyAgICAgICAgICAgIGR0ZHVtcChkdW1wW2luZGV4XVtBV01fRF9UWVBFXSkgKTsKKyAgICB9CisgICAgd3JpdGVfZmlsZShmaWxlLGF1c2dhYmUpOworICAgIHdyaXRlKCJBV006IERvbmUuXG4iKTsKKyAgICByZXR1cm4gMTsKK30KKworaW50IFVucmVnaXN0ZXIoc3RyaW5nIHdoYXQpCit7CisgICAgaWYgKCFhbGxvd2VkKCkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoIXdoYXQpCisgICAgeworICAgICAgICB3cml0ZSgiRHUgc29sbHRlc3Qgc2Nob24gZWluZW4gRmlsZW5hbWVuIGFuZ2ViZW4hXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSAKKyAgICBpZiAobWVtYmVyKGFybW91cnMsd2hhdCkpCisgICAgeworICAgICAgICBtX2RlbGV0ZShhcm1vdXJzLHdoYXQpOworICAgICAgICB3cml0ZSgiVW5yZWdpc3RlcmVkICIrd2hhdCsiIGZyb20gJ2FybW91cnMnLlxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAobWVtYmVyKHdlYXBvbnMsd2hhdCkpCisgICAgeworICAgICAgICBtX2RlbGV0ZSh3ZWFwb25zLHdoYXQpOworICAgICAgICB3cml0ZSgiVW5yZWdpc3RlcmVkICIrd2hhdCsiIGZyb20gJ3dlYXBvbnMnLlxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAobWVtYmVyKGRhbWFnZXJzLHdoYXQpKQorICAgIHsKKyAgICAgICAgbV9kZWxldGUoZGFtYWdlcnMsd2hhdCk7CisgICAgICAgIHdyaXRlKCJVbnJlZ2lzdGVyZWQgIit3aGF0KyIgZnJvbSAnZGFtYWdlcnMnLlxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBzYXZlX21lKDApOworICAgIHJldHVybiAwOworfQorCitpbnQgUmVzZXREYW1hZ2VycygpCit7CisgICAgaWYgKCFhbGxvd2VkKCkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBkYW1hZ2VycyA9IG1fYWxsb2NhdGUoMCwyKTsKKyAgICBzYXZlX21lKDEpOworICAgIHJldHVybiAxOworfQorCmRpZmYgLS1naXQgYS9zZWN1cmUvYmJtYXN0ZXIuYyBiL3NlY3VyZS9iYm1hc3Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NzdmN2YKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvYmJtYXN0ZXIuYwpAQCAtMCwwICsxLDM5MyBAQAorI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgbm9fc2hhZG93CisjcHJhZ21hIG5vX2luaGVyaXQKKy8vI3ByYWdtYSBwZWRhbnRpYworLy8jcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIHdhcm5fZGVwcmVjYXRlZAorCisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8ZGFlbW9uLmg+CisjaW5jbHVkZSA8ZXZlbnRzLmg+CisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2luY2x1ZGUgPGZpbGVzLmg+CisKKyNkZWZpbmUgRlRQU0FWRSAiL3NlY3VyZS9BUkNIL2Z0cGQiCisKKyNkZWZpbmUgTUFYTE9HU0laRSAyMDAwMDAwCisjZGVmaW5lIFNNQUxMTE9HU0laRSAyMDAwMDAKKyNkZWZpbmUgTE9HVElNRSAxMjAKKyNkZWZpbmUgTUFYQlVGRlNJWkUgMjAwMAorCisjZGVmaW5lIERFQlVHKHgpICBpZiAoZmluZF9wbGF5ZXIoInplc3N0cmEiKSlcCisgICAgICAgICAgICB0ZWxsX29iamVjdChmaW5kX3BsYXllcigiemVzc3RyYSIpLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVEQkc6ICIreCsiXG4iKQorCisvLyBmdWVyIEZUUC4KK3ByaXZhdGUgbWFwcGluZyBtb25pdG9yZWQ7CisKKworI2RlZmluZSBEX0xPR1RJTUUgICAgMCAgLy8gTG9nZW5kZXplaXQsIDxpbnQ+CisjZGVmaW5lIERfRkxBR1MgICAgICAxICAvLyBGbGFncworI2RlZmluZSBEX0VSU1RJRSAgICAgMiAgLy8gTmFtZSBkZXMgRXJzdGllcy4KKyNkZWZpbmUgRF9JUFNUUklORyAgIDMKKyNkZWZpbmUgRF9JTkRFWCAgICAgIDQgIC8vIEluZGV4IGZ1ZXIgRF9MT0csIG5hZWNoc3RlciBmcmVpZXIgaW5kZXguCisjZGVmaW5lIERfTE9HICAgICAgICA1ICAvLyBMb2dkYXRlbiwgPG1peGVkPiAoQXJyYXkpCisvKiBEYXRlbnN0cnVrdHVyIHZvbiBEX0xPRzoKKyAgICh7ICh7PHplaXQ+LCA8a29tbWFuZG8+LCA8ZW52aXJvbm1lbnQ+fSksIC4uLi4gfSkKKyAgICovCisjZGVmaW5lIERMX1RJTUUgIDAgIC8vIGludAorI2RlZmluZSBETF9DTUQgICAxICAvLyBzdHJpbmcKKyNkZWZpbmUgRExfRU5WICAgMiAgLy8gc3RyaW5nCitwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIGxkYXRhID0gbV9hbGxvY2F0ZSgwLERfTE9HKTsKKworLy8gRmxhZ3M6CisjZGVmaW5lIEZMX1BFUk1BTkVOVCAgICAxIC8vICdwZXJtYW5lbnQnLCBkLmguIG5pY2h0IG51ciBrdXJ6IG5hY2ggRWlubG9nZ2VuCisjZGVmaW5lIEZMX1NZTkMgICAgICAgICAyIC8vIG5pY2h0IHB1ZmZlcm4sIHN5bmNocm9uIGF1ZiBQbGF0dGUgc2NocmVpYmVuLgorCisvLyBKYS4gTWFjaHQgZGFzIGJsb3NzIG5pY2h0IG5hY2guCisjZGVmaW5lIFBfU0VDT05EICJzZWNvbmQiCisKK3B1YmxpYyBpbnQgcXVlcnlfYmIoKTsKK3B1YmxpYyB2b2lkIHdyaXRlYmIoIHN0cmluZyBtc2cgKTsKK3B1YmxpYyB2YXJhcmdzIHZvaWQgQkJXcml0ZShzdHJpbmcgbXNnLCBpbnQgY2F0bW9kZSk7CisKK3B1YmxpYyBpbnQgYWRkKCBzdHJpbmcgdXNlciwgaW50IHRpbWVvdXQgKTsKK3B1YmxpYyBpbnQgc3ViKCBzdHJpbmcgdXNlciApOworcHVibGljIHZvaWQgZnRwYmIoIHN0cmluZyB1c2VyLCBzdHJpbmcgbXNnICk7CisKK3ByaXZhdGUgdm9pZCBzY2FuX2JiX29wZmVyKCk7Citwcml2YXRlIHZvaWQgRHVtcERhdGEoc3RyaW5nIHVpZCwgc3RyaW5nIGVyc3RpZSwgc3RyaW5nIGlwLCBpbnQgZmxhZ3MsIG1peGVkIGxvZ2RhdGEpOworcHJpdmF0ZSB2b2lkIFByb2Nlc3NCdWZmZXIoc3RyaW5nIHVpZCk7Citwcml2YXRlIHZvaWQgUmVtb3ZlVGVtcG9yYXJ5UGxheWVyKHN0cmluZyB1aWQpOworCitwdWJsaWMgdm9pZCBjcmVhdGUoKQoreworICAgIHNldGV1aWQoIGdldHVpZCh0aGlzX29iamVjdCgpKSApOworICAgIHJlc3RvcmVfb2JqZWN0KCBGVFBTQVZFICk7CisgICAgc2Nhbl9iYl9vcGZlcigpOworICAgIEVWRU5URC0+UmVnaXN0ZXJFdmVudChFVlRfTElCX0xPR0lOLCAiRXZlbnRoYW5kbGVyIiwgdGhpc19vYmplY3QoKSk7CisgICAgRVZFTlRELT5SZWdpc3RlckV2ZW50KEVWVF9MSUJfTE9HT1VULCAiRXZlbnRoYW5kbGVyIiwgdGhpc19vYmplY3QoKSk7CisgICAgbG9nX2ZpbGUoIkFSQ0gvYmJtYXN0ZXIubG9nIiwgc3RyZnRpbWUoIiVjOiBiYm1hc3RlciB3dXJkZSBnZWxhZGVuLlxuIikpOworfQorCisvLyBBdWYgZGVuIGFzeW5jaHJvbmVuIExvZ291dC1ldmVudCB6dSB3YXJ0ZW4gZXJtb2VnbGljaHQgZXMgdGhlb3JldGlzY2gsIDEtMnMKKy8vIGRhcyBMb2cgenUgdW1nZWhlbi4gQW5kZXJlcnNlaXRzIGdlaHQgZGFzIG9obmVoaW4gbnVyIGRhbm4sIHdlbm4gZGllCisvLyBMb2d6ZWl0IGVoIGFiZ2VsYXVmZW4gaXN0LgorcHVibGljIHZvaWQgRXZlbnRoYW5kbGVyKHN0cmluZyBlaWQsIG9iamVjdCB0cmlnb2IsIG1peGVkIGRhdGEpIHsKKyAgaWYgKHByZXZpb3VzX29iamVjdCgpID09IGZpbmRfb2JqZWN0KEVWRU5URCkpIHsKKyAgICBzdHJpbmcgdWlkOworICAgIGlmIChvYmplY3RwKHRyaWdvYikKKyAgICAgICAgJiYgc3Ryc3RyKGxvYWRfbmFtZSh0cmlnb2IpLCIvc3RkL3NoZWxscy8iKSA9PSAwCisgICAgICAgICYmICF0cmlnb2ItPlF1ZXJ5R3Vlc3QoKSkgeworICAgICAgLy8gQmVpIExvZ2luIHVuZCBMb2dvdXQgZGVuIEJCTW9kZSBlaW5zY2hhbHRlbiAod2VpbCBkZXIgTG9naW5ldmVudCBqYQorICAgICAgLy8gZXJzdCAxLTJzIG5hY2ggRWlubG9nZ2VuIGFiZ2VhcmJlaXRldCB3aXJkLgorICAgICAgdHJpZ29iLT5fX3NldF9iYigxKTsKKyAgICAgIHVpZD1nZXR1aWQodHJpZ29iKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAvLyBrZWluIE9iamVrdCBtZWhyIGRhLiBWZXJtdXRsaWNoIGhhdCBlaW4gU3BpZWxlciAnZW5kZScgZ2VtYWNodCwgYWJlcgorICAgICAgLy8gZXMga29lbm50ZSBhdWNoIHNlaW4sIGRhc3MgamVtYW5kIG1pdCBuZW0gU2VsYnN0emVyc3RvZXJlciBkZW4gRXZlbnQKKyAgICAgIC8vIGdlZmFrdCBoYXQuIEFiZXIgc2VsYnN0IHdlbm4sIHZpZWwga2FubiBtYW4gZGFtaXQgbmljaHQgZXJyZWljaGVuLgorICAgICAgdWlkID0gZGF0YVtFX1BMTkFNRV07CisgICAgICBpZiAoIXN0cmluZ3AodWlkKSkgcmV0dXJuOworICAgICAgLy8gUHJ1ZWZ1bmcgYXVmIG5pY2h0LUFud2VzZW5oZWl0IHZvbiB1aWQgd2FlcmUgbm9jaCBtb2VnbGljaCwgaGF0IGFiZXIKKyAgICAgIC8vIFByb2JsZW1lLCB3ZW5uIGVpbiBTcGllbGVyIHNlaHIgc2NobmVsbCB3aWVkZXIgZWlubG9nZ3QuCisgICAgfQorCisgICAgaWYgKGVpZCA9PSBFVlRfTElCX0xPR09VVCAmJiBtZW1iZXIobGRhdGEsdWlkKSkgeworICAgICAgLy8gV2VubiBMb2dvdXQgdW5kIGVzIGdpYnQgRGF0ZW4gaW0gUHVmZmVyLCBrb2VubnRlIG1hbiBkaWUgZXZ0bC4KKyAgICAgIC8vIHdlZ3NjaHJlaWJlbiBvZGVyIGxvZXNjaGVuLgorICAgICAgUHJvY2Vzc0J1ZmZlcih1aWQpOworICAgICAgLy8gYXVmIGplZGVuIEZhbGwgdGVtcG9yYWVyZSBTcGllbGVyIGVudGZlcm5lbi4gKFdpY2h0aWchKQorICAgICAgUmVtb3ZlVGVtcG9yYXJ5UGxheWVyKHVpZCk7CisgICAgfQorICB9Cit9CisKKy8vIHNjaHJlaWJ0IGFsbGUgUHVmZmVyIHN5bmNocm9uLCBvaG5lIENhbGxvdXQuLi4gS2FubiBsYWdnZW4uCitwdWJsaWMgaW50IFByb2Nlc3NBbGxCdWZmZXJzKCkgeworICAKKyAgICBpZiAoZXh0ZXJuX2NhbGwoKSAmJiAhQVJDSF9TRUNVUklUWSkKKyAgICByZXR1cm4gLTE7CisKKyAgZm9yZWFjaChzdHJpbmcgdWlkLCBpbnQgbG9ndGltZSwgaW50IGZsYWdzLCBzdHJpbmcgZXJzdGllLCBzdHJpbmcgaXAsCisgICAgICAgICAgaW50IGluZGV4LCBtaXhlZCBkYXRhOiBsZGF0YSkgeworICAgIGlmIChpbmRleCkgeworICAgICAgRHVtcERhdGEodWlkLCBlcnN0aWUsIGlwLCBmbGFncywgZGF0YSk7CisgICAgICBsZGF0YVt1aWQsRF9MT0ddPSh7fSk7CisgICAgICBsZGF0YVt1aWQsRF9JTkRFWF09MDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3ByaXZhdGUgdm9pZCBQcm9jZXNzQnVmZmVyKHN0cmluZyB1aWQpIHsKKyAgICAKKyAgaWYgKHRpbWUoKSA8PSBsZGF0YVt1aWQsRF9MT0dUSU1FXQorICAgICAgJiYgbGRhdGFbdWlkLERfSU5ERVhdKSB7CisgICAgLy8gRGF0ZW4gd2Vnc2NocmVpYmVuLCB3ZW5uIExvZ3plaXQgbmljaHQgYWJnZWxhdWZlbi4gU29uc3QgbmljaHQuCisgICAgY2FsbF9vdXQoIydEdW1wRGF0YSwgMiwgdWlkLCBsZGF0YVt1aWQsRF9FUlNUSUVdLCBsZGF0YVt1aWQsRF9JUFNUUklOR10sCisJICAgICAgICAgICAgICAgICAgICBsZGF0YVt1aWQsRF9GTEFHU10sIGxkYXRhW3VpZCxEX0xPR10pOworICB9CisgIGxkYXRhW3VpZCxEX0xPR10gPSAoe30pOworICBsZGF0YVt1aWQsRF9JTkRFWF0gPSAwOworfQorCitwcml2YXRlIHZvaWQgRHVtcERhdGEoc3RyaW5nIHVpZCwgc3RyaW5nIGVyc3RpZSwgc3RyaW5nIGlwLCBpbnQgZmxhZ3MsIG1peGVkIGxvZ2RhdGEpIHsKKyAgc3RyaW5nIHJlcyA9IHNwcmludGYoIlxuJXMlcywgSVA6ICVzXG4iLCBjYXBpdGFsaXplKHVpZCksCisgICAgICAgICAgICAgICAgICAgICAgKHN0cmluZ3AoZXJzdGllKSA/ICIgKCIrY2FwaXRhbGl6ZShlcnN0aWUpKyIpIiA6ICIiKSwKKwkJICAgICAgKHN0cmluZ3AoaXApID8gaXAgOiAiVW5iZWthbm50IikpOworICBsb2dkYXRhLT0oezB9KTsKKyAgZm9yZWFjaChtaXhlZCBhcnIgOiBsb2dkYXRhKSB7CisgICAgcmVzKz1zcHJpbnRmKCIlTzogJU8gWyVzXVxuIiwgCisgICAgICAgIHN0cmZ0aW1lKCIleSVtJWQtJUglTSVTIixhcnJbRExfVElNRV0pLAorICAgICAgICBhcnJbRExfQ01EXSwgYXJyW0RMX0VOVl0gfHwgIjx1bmJla2FubnQ+Iik7CisgIH0KKworICAvL0RFQlVHKCJEdW1wRGF0YTogIityZXMpOworICBpZiAoZmxhZ3MgJiBGTF9QRVJNQU5FTlQpCisgICAgY2F0Y2gobG9nX2ZpbGUoIkFSQ0gvYmIuIit1aWQsIHJlcywgTUFYTE9HU0laRSkpOworICBlbHNlIGlmIChmaWxlX3NpemUoTElCTE9HRElSIi9BUkNIL2JibWFzdGVyIikgPT0gRlNJWkVfRElSKQorICAgIGNhdGNoKGxvZ19maWxlKCJBUkNIL2JibWFzdGVyLyIrdWlkLCByZXMsIFNNQUxMTE9HU0laRSkpOworICAvLyBrZWluIGVsc2UsIGluIGFuZGVyZW4gRmFlbGxlbiB3ZXJkZW4gZGllIERhdGVuIHZlcndvcmZlbi4KK30KKworcHJpdmF0ZSB2b2lkIEFkZFRlbXBvcmFyeVBsYXllcihzdHJpbmcgdWlkKSB7CisgICAgLy8gbmF0dWVybGljaCBudXIsIHdlbm4gbm9jaCBuaXggZWluZ2V0cmFnZW4uCisgICAgaWYgKCFtZW1iZXIobGRhdGEsIHVpZCkpIHsKKyAgICAgIG9iamVjdCBvYiA9IGZpbmRfcGxheWVyKHVpZCkgfHwgZmluZF9uZXRkZWFkKHVpZCk7CisgICAgICAKKyAgICAgIG1peGVkIGVyc3RpZTsKKyAgICAgIGlmIChvYikKKyAgICAgICAgZXJzdGllID0gKHN0cmluZylvYi0+UXVlcnlQcm9wKFBfU0VDT05EKTsKKworICAgICAgbGRhdGEgKz0gKFt1aWQ6IHRpbWUoKSArIExPR1RJTUUgKyByYW5kb20oTE9HVElNRS8yKTsgCisJICAgICAgICAgICAgICAwOworCQkgICAgICAoc3RyaW5ncChlcnN0aWUpID8gZXJzdGllIDogMCk7CisJCSAgICAgIHF1ZXJ5X2lwX251bWJlcihvYik7CisJCSAgICAgIDA7ICh7fSkKKwkgICAgICAgIF0pOworICAgIH0KK30KKworcHJpdmF0ZSB2b2lkIFJlbW92ZVRlbXBvcmFyeVBsYXllcihzdHJpbmcgdWlkKSB7IAorICBpZiAoIShsZGF0YVt1aWQsRF9GTEFHU10gJiBGTF9QRVJNQU5FTlQpKSB7CisgICAgbV9kZWxldGUobGRhdGEsIHVpZCk7CisgIH0KK30KKworCisvLyBWb20gU3BpZWxlcmVyb2JqZWt0IGJlaSBFcnNjaGFmZnVuZyBpbiBJbml0UGxheWVyKCkgZ2VydWZlbi4KK3B1YmxpYyBpbnQgcXVlcnlfYmIoKQoreworICAgIAorICAgIGlmIChsb2FkX25hbWUocHJldmlvdXNfb2JqZWN0KCkpWzAuLjExXSAhPSAiL3N0ZC9zaGVsbHMvIikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvLyBpbiBqZWRlbSBGYWxsIHdpcmQgbnVuICh0ZW1wb3JhZXIpIGRlciBCQi1Nb2R1cyBha3RpdmllcnQuCisgICAgaWYgKCFwcmV2aW91c19vYmplY3QoKS0+UXVlcnlHdWVzdCgpKQorICAgICAgcHJldmlvdXNfb2JqZWN0KCktPl9fc2V0X2JiKDEpOworCisgICAgLy8gbnVyIGZ1ZXIgJ3Blcm1hbmVudGUnIGF1Y2ggMSB6dXJ1ZWNrZ2ViZW4uCisgICAgcmV0dXJuIGxkYXRhW2dldHVpZChwcmV2aW91c19vYmplY3QoKSksRF9GTEFHU10gJiBGTF9QRVJNQU5FTlQ7Cit9CisKKworCisvLyBuZXVlIEZ1bmt0aW9uLiBLcmllZ3QgbnVyIEtvbW1hbmRvc3N0cmluZyB1ZWJlcmdlZ2VuLCB3ZXJkZW4gZ2dmLiBnZXB1ZmZlcnQKKy8vIHVuZCBkYW5uIHdlZ2dlc2NocmllYmVuLgorcHVibGljIHZhcmFyZ3Mgdm9pZCBCQldyaXRlKHN0cmluZyBtc2csIGludCBjYXRtb2RlKSB7CisgIAorICBpZiAoICF0aGlzX2ludGVyYWN0aXZlKCkgfHwKKyAgICAgIChleHRlcm5fY2FsbCgpICYmIAorICAgICAgIHN0cnN0cihsb2FkX25hbWUocHJldmlvdXNfb2JqZWN0KCkpLCAiL3N0ZC9zaGVsbHMvIikgIT0gMCApICkKKyAgICByZXR1cm47CisKKyAgc3RyaW5nIHVpZCA9IGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpOworCisgIGlmICghbWVtYmVyKGxkYXRhLCB1aWQpKQorICAgIEFkZFRlbXBvcmFyeVBsYXllcih1aWQpOyAgCisgIGVsc2UgaWYgKGxkYXRhW3VpZCxEX0xPR1RJTUVdIDwgdGltZSgpKSB7CisgICAgLy8gTG9nemVpdCBhYmdlbGF1ZmVuLiAtPiBFTkRFLgorICAgIGlmIChsZGF0YVt1aWQsRF9JTkRFWF0pIHsKKyAgICAgIHRoaXNfaW50ZXJhY3RpdmUoKS0+X19zZXRfYmIoMCk7CisgICAgICAvLyBlcyBrYW5uIHZvcmtvbW1lbiwgZGFzcyBoaWVyIG5lbiBQcm9jZXNzQnVmZmVyIG1pdCBhbmRlcmVyIHVpZAorICAgICAgLy8gZHJpbmhhZW5ndC4gSXN0IGFiZXIgZWdhbCwgZGFubiB3aXJkIGRlciBQdWZmZXIgaGFsdCBuYWVjaHN0ZXNtYWwKKyAgICAgIC8vIGdlc2NocmllYmVuLgorICAgICAgaWYgKGZpbmRfY2FsbF9vdXQoIydQcm9jZXNzQnVmZmVyKSA9PSAtMSkKKyAgICAgICAgICBjYWxsX291dCgjJ1Byb2Nlc3NCdWZmZXIsIDIsIHVpZCk7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorCisgIC8vIGltIHN5bmNocm9uZW4gTW9kdXMgZGlyZWt0IGF1ZiBQbGF0dGUgc2NocmVpYmVuLgorICAvL0RFQlVHKCJCQldyaXRlOiBGbGFncyB2b24gKyIrdWlkKyI6ICIrdG9fc3RyaW5nKGxkYXRhW3VpZCxEX0ZMQUdTXSkKKyAgLy8gICAgKyJcbiIpOworICBpZiAobGRhdGFbdWlkLERfRkxBR1NdICYgRkxfU1lOQykgeworICAgIC8vREVCVUcoIkJCV3JpdGU6IFN5bmNtb2R1c1xuIik7CisgICAgaWYgKCFjYXRtb2RlKSB7CisgICAgICBtc2cgPSBzcHJpbnRmKCIlczogJXMgWyVPXVxuIiwgc3RyZnRpbWUoIiV5JW0lZC0lSCVNJVMiKSwKKwkgIG1zZywgZW52aXJvbm1lbnQodGhpc19pbnRlcmFjdGl2ZSgpKSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIG1zZyA9IG1zZyArICJcbiI7CisgICAgbG9nX2ZpbGUoICJBUkNIL2JiLiIrdWlkLCBtc2csIE1BWExPR1NJWkUgKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBhbGxlIGFuZGVyZW4gd2VyZGVuIGVyc3RtYWwgZ2VwdWZmZXJ0LiAKKworICAvLyB3ZW5uIGNhdG1vZGUgdW5kIG5lbiBJbmRleCA+IDAgd2lyZCBkZXIgS3JhbSBhbiBkZW4gdm9yaGVyaWdlbiBFaW50cmFnZW4KKyAgLy8gYW5nZWhhZW5ndC4KKyAgaW50IGluZGV4ID0gbGRhdGFbdWlkLERfSU5ERVhdOworICBpZiAoY2F0bW9kZSAmJiBpbmRleCA+IDApIHsKKyAgICAtLWluZGV4OworICAgIGxkYXRhW3VpZCxEX0xPR11baW5kZXhdW0RMX0NNRF0gKz0gbXNnOworICB9CisgIGVsc2UgeworICAgIC8vIFB1ZmZlciB2ZXJncm9lc3Nlcm4/CisgICAgaWYgKGluZGV4ID49IHNpemVvZihsZGF0YVt1aWQsRF9MT0ddKSkKKyAgICAgIGxkYXRhW3VpZCxEX0xPR10rPWFsbG9jYXRlKDEwMCk7CisgICAgbGRhdGFbdWlkLERfTE9HXVtpbmRleF0gPSAoeyB0aW1lKCksIG1zZywgCisJICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF9uYW1lKGVudmlyb25tZW50KHRoaXNfaW50ZXJhY3RpdmUoKSkpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgIGxkYXRhW3VpZCxEX0lOREVYXSsrOworICAgIC8vIGVzIGthbm4gdm9ya29tbWVuLCBkYXNzIGhpZXIgbmVuIFByb2Nlc3NCdWZmZXIgbWl0IGFuZGVyZXIgdWlkCisgICAgLy8gZHJpbmhhZW5ndC4gSXN0IGFiZXIgZWdhbCwgZGFubiB3aXJkIGRlciBQdWZmZXIgaGFsdCBuYWVjaHN0ZXNtYWwKKyAgICAvLyBnZXNjaHJpZWJlbi4KKyAgICBpZiAoaW5kZXggPiBNQVhCVUZGU0laRSAKKyAgICAgICAgJiYgZmluZF9jYWxsX291dCgjJ1Byb2Nlc3NCdWZmZXIpID09IC0xKQorICAgICAgY2FsbF9vdXQoIydQcm9jZXNzQnVmZmVyLCAyLCB1aWQpOworICB9Cit9CisKKy8vIEFsdGUgRnVua3Rpb24sIGtyaWVndCBTdHJpbmdzLCB0ZWlsd2Vpc2UgbWl0IERhdHVtLCB0ZWlsd2Vpc2Ugb2huZSwKKy8vIHNjaHJpZWIgZnJ1ZWhlciBudXIgd2VnLiBtc2cgZmFlbmd0IGVudHdlZGVyIG1pdCBlaW5lbSBEYXR1bS9aZWl0LVN0cmluZworLy8gb2RlciBtaXQgZWluZW0gIi0+IiBhbi4KK3B1YmxpYyB2b2lkIHdyaXRlYmIoIHN0cmluZyBtc2cgKQoreworICBpbnQgY2F0bW9kZTsgCisgCisgIGlmICggIXRoaXNfaW50ZXJhY3RpdmUoKSB8fAorICAgICAgKGV4dGVybl9jYWxsKCkgJiYgCisgICAgICAgc3Ryc3RyKGxvYWRfbmFtZShwcmV2aW91c19vYmplY3QoKSksICIvc3RkL3NoZWxscy8iKSAhPSAwICkgKQorICAgIHJldHVybjsKKyAKKyAgLy8gZXJzdG1hbCBTdHJpbmcgYmVyZWluaWdlbi4KKyAgbXNnID0gdHJpbShtc2csVFJJTV9SSUdIVCwiXG4iKTsKKyAgaWYgKHN0cnN0cihtc2csIi0+IikgPT0gMCkgeworICAgIGNhdG1vZGU9MTsKKyAgICBtc2c9ICIgLT4gIiArIG1zZ1syLi5dOworICB9CisgIGVsc2UgeworICAgIC8vIGZhZW5ndCBtaXQgRGF0dW1zc3RyaW5nIGFuLCBlcnN0ZXMgTGVlcnplaWNoZW4gYWIgZGVtIHplaG50ZW4gWmVpY2hlbgorICAgIC8vIHN1Y2hlbiB1bmQgdm9uIGRvcnQgYWJzY2huZWlkZW4uCisgICAgbXNnID0gbXNnW3N0cnN0cihtc2csIiAiLDEwKSsxIC4uXTsKKyAgfQorCisgIC8vIERhbm4gd2VpdGVyZ2ViZW4KKyAgQkJXcml0ZShtc2csIGNhdG1vZGUpOworfQorCitwcml2YXRlIHZvaWQgc2Nhbl9iYl9vcGZlcigpCit7CisgICAgc3RyaW5nKiBsaW5lczsKKyAgICBvYmplY3QgcGw7CisgICAgc3RyaW5nIHVpZDsKKworICAgIC8vIGRpZXNlIHVzZXIgd2VyZGVuICdwZXJtYW5lbnQnIHVlYmVyd2FjaHQsIG5pY2h0IG51ciBkaXJla3QgbmFjaCBkZW0KKyAgICAvLyBFaW5sb2dnZW4uCisgICAgbGluZXMgPSBleHBsb2RlKCBsb3dlcl9jYXNlKCByZWFkX2ZpbGUoIi9zZWN1cmUvQVJDSC9CQl9PUEZFUi5kdW1wIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICIiICksICJcbiIgKVsyLi5dOworICAgIAorICAgIGZvcmVhY2goc3RyaW5nIGxpbmUgOiBsaW5lcykgeworICAgICAgICBpZiggc2l6ZW9mKGxpbmUpICYmIGxpbmVbMF0gIT0gJyMnICkgeworCSAgICB1aWQ9bGluZVswIC4uIG1lbWJlcihsaW5lLCcgJyktMV07CisJICAgIEFkZFRlbXBvcmFyeVBsYXllcih1aWQpOworCSAgICBsZGF0YVt1aWQsRF9MT0dUSU1FXSA9IF9fSU5UX01BWF9fOworCSAgICBsZGF0YVt1aWQsRF9GTEFHU10gPSBGTF9QRVJNQU5FTlQ7CisJICAgIHBsID0gZmluZF9wbGF5ZXIodWlkKSB8fCBmaW5kX25ldGRlYWQodWlkKTsKKwkgICAgaWYgKHBsKQorCSAgICAgIHBsLT5fX3NldF9iYigxKTsKKwl9CisgICAgfQorfQorCisvLyBOZXVsYWRlbiBpc3Qga2VpbiBncm9zc2VzIFByb2JsZW0sIHdlaWwgZGVyIGJibWFzdGVyIGphIGF1dG9tYXRpc2NoCisvLyBuZXVnZWxhZGVuIHdpcmQuIE5lYmVuZWZmZWt0IGlzdCBsZWRpZ2xpY2gsIGRhc3MgZnVlciBhbGxlIGxhdWZlbmRlbiBMb2dzCisvLyBkaWUgTG9nemVpdCB3aWVkZXIgdm9uIHZvcm5lIGFuZmFlbmd0LiBEYSBkYXMgU2NocmVpYmVuIGRlciBQdWZmZXIgYWJlciBMYWcKKy8vIHZlcnVyc2FjaGVuIGthbm4sIGR1ZXJmZW4gZXMgbnVyIEVNKy4KK3B1YmxpYyB2YXJhcmdzIGludCByZW1vdmUoaW50IHNpbGVudCkgeworIAorICBpZiAoIUFSQ0hfU0VDVVJJVFkpCisgICAgcmV0dXJuIDA7CisKKyAgbG9nX2ZpbGUoIkFSQ0gvYmJtYXN0ZXIubG9nIiwgc3RyZnRpbWUoIiVjOiByZW1vdmUoKSBjYWxsZWQuXG4iKSk7CisKKyAgLy8gYWxsZSBQdWZmZXIgbGVlcmVuLi4uCisgIC8vIFByb2Nlc3NBbGxCdWZmZXJzKCkgd2lyZCBoaWVyYmVpIF9vaG5lXyBMaW1pdHMgYXVmZ2VydWZlbiEgS2FubiBmaWVzZXMKKyAgLy8gTGFnIGVyemV1Z2VuLCBhYmVyIHNvbnN0IHd1cmRlIGRlciBLcmFtIGV2dGwuIG5pY2h0IG9yZGVudGxpY2gKKyAgLy8gZ2VzY2hyaWViZW4uCisgIGxpbWl0ZWQoIydQcm9jZXNzQWxsQnVmZmVycyk7CisgIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOworICByZXR1cm4gMTsKK30KKworCisvLyBBbGxlcyBhYiBoaWVyIG51ciB6dW0gVWViZXJ3YWNoZW4gdm9uIEZUUC1Ba3Rpdml0YWV0ZW4uCitwcml2YXRlIGludCBwbGF5ZXJfZXhpc3RzKCBzdHJpbmcgdXNlciApCit7CisgICAgaWYgKCAhc3RyaW5ncCggdXNlciApIHx8IHNpemVvZiggdXNlciApIDwgMiApCisgICAgICAgIHJldHVybiAwOworICAgIAorICByZXR1cm4gZmlsZV9zaXplKCAiL3NhdmUvIiArIHVzZXJbMC4uMF0gKyAiLyIgKyB1c2VyICsgIi5vIiApID4gMDsKK30KKworcHVibGljIGludCBhZGQoIHN0cmluZyB1c2VyLCBpbnQgdGltZW91dCApCit7CisgICAgaWYgKCAhQVJDSF9TRUNVUklUWSB8fCBwcm9jZXNzX2NhbGwoKSApCisgICAgICAgIHJldHVybiAtMTsKKyAgICAKKyAgICBpZiggIXN0cmluZ3AodXNlcikgfHwgIXBsYXllcl9leGlzdHMobG93ZXJfY2FzZSh1c2VyKSkgfHwgIWludHAodGltZW91dCkgfHwKKyAgICAgICAgIXRpbWVvdXQgKQorICAgICAgICByZXR1cm4gLTI7CisgICAgCisgICAgbW9uaXRvcmVkW2xvd2VyX2Nhc2UodXNlcildID0gdGltZW91dDsKKyAgICBzYXZlX29iamVjdCggRlRQU0FWRSApOworICAgIAorICAgIHJldHVybiAxOworfQorCisKK3B1YmxpYyBpbnQgc3ViKCBzdHJpbmcgdXNlciApCit7CisgICAgaWYgKCAhQVJDSF9TRUNVUklUWSB8fCBwcm9jZXNzX2NhbGwoKSApCisgICAgICAgIHJldHVybiAtMTsKKyAgICAKKyAgICBpZiggIXN0cmluZ3AodXNlcikgfHwgIW1lbWJlciggbW9uaXRvcmVkLCBsb3dlcl9jYXNlKHVzZXIpICkgKQorICAgICAgICByZXR1cm4gLTI7CisgICAgCisgICAgbV9kZWxldGUoIG1vbml0b3JlZCwgbG93ZXJfY2FzZSh1c2VyKSApOworICAgIHNhdmVfb2JqZWN0KCBGVFBTQVZFICk7CisgICAgCisgICAgcmV0dXJuIDE7Cit9CisKKworcHVibGljIHZvaWQgZnRwYmIoIHN0cmluZyB1c2VyLCBzdHJpbmcgbXNnICkKK3sKKyAgICBpZiggZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKSAhPSBST09USUQgKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIGxkYXRhW3VzZXIsRF9GTEFHU10gJiBGTF9QRVJNQU5FTlQgKQorICAgICAgICBsb2dfZmlsZSggIkFSQ0gvYmIuIit1c2VyLCBtc2csIDIwMDAwMDAgKTsKKworICAgIGlmICggbW9uaXRvcmVkW3VzZXJdICl7CisgICAgICAgIGlmICggbW9uaXRvcmVkW3VzZXJdID4gMCAmJiBtb25pdG9yZWRbdXNlcl0gPCB0aW1lKCkgKQorICAgICAgICAgICAgc3ViKCB1c2VyICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIENITUFTVEVSLT5zZW5kKCAiRlRQIiwgY2FwaXRhbGl6ZSh1c2VyKSwgbXNnICk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9zZWN1cmUvY29tYmF0LmMgYi9zZWN1cmUvY29tYmF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYwMzFhNAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9jb21iYXQuYwpAQCAtMCwwICsxLDg3IEBACisvKgorICogc2VjdXJlL2NvbWJhdC5jCisgKgorICogdGhlIGNvbWJhdCBtYXN0ZXIgb2JqZWN0LiBJdCBkZWZpbmVzIHNvbWUgdXNlZnVsIGZ1bmN0aW9ucyB0byBiZQorICogdXNlZCBieSB3ZWFwb25zLCBhcm1vdXIgYW5kIGxpdmluZ3MuCisgKi8KKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIG5vX3NoYWRvdworLy8jcHJhZ21hIG5vX2luaGVyaXQKKyNwcmFnbWEgdmVyYm9zZV9lcnJvcnMKKyNwcmFnbWEgY29tYmluZV9zdHJpbmdzCisvLyNwcmFnbWEgcGVkYW50aWMKKy8vI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSB3YXJuX2RlcHJlY2F0ZWQKKworI2luY2x1ZGUgPGNvbWJhdC5oPgorCitpbnQgZGVmYXVsdF93ZWFwb25fY2xhc3Moc3RyaW5nIHR5cGUpIHsKKwlzd2l0Y2godHlwZSkgeworCQljYXNlICJrbmlmZSI6CisJCQlyZXR1cm4gNTA7CisJCWNhc2UgImNsdWIiOgorCQkJcmV0dXJuIDcwOworCQljYXNlICJzd29yZCI6CisJCQlyZXR1cm4gMTAwOworCQljYXNlICJheGUiOgorCQkJcmV0dXJuIDkwOworCX0KKwlyZXR1cm4gMzA7Cit9CisKK2ludCBkZWZhdWx0X3dlYXBvbl93ZWlnaHQoc3RyaW5nIHR5cGUpIHsKKwlzd2l0Y2godHlwZSkgeworCQljYXNlICJrbmlmZSI6CisJCQlyZXR1cm4gMTAwOworCQljYXNlICJjbHViIjoKKwkJCXJldHVybiAxNTAwOworCQljYXNlICJzd29yZCI6CisJCQlyZXR1cm4gMjAwMDsKKwkJY2FzZSAiYXhlIjoKKwkJCXJldHVybiAxNTAwOworCX0KKwlyZXR1cm4gMTAwMDsKK30KKworaW50IGRlZmF1bHRfd2VhcG9uX3ZhbHVlKHN0cmluZyB0eXBlKSB7CisJc3dpdGNoKHR5cGUpIHsKKwkJY2FzZSAia25pZmUiOgorCQkJcmV0dXJuIDEwOworCQljYXNlICJjbHViIjoKKwkJCXJldHVybiA1MDsKKwkJY2FzZSAic3dvcmQiOgorCQkJcmV0dXJuIDUwMDsKKwkJY2FzZSAiYXhlIjoKKwkJCXJldHVybiAzMDA7CisJfQorCXJldHVybigwKTsKK30KKworaW50IHZhbGlkX3dlYXBvbl90eXBlKG1peGVkIHQpIHsKKwlpZiAobWVtYmVyKCh7V1RfU1dPUkQsIFdUX0FYRSwgV1RfQ0xVQiwgV1RfU1BFQVIsIFdUX1NUQUZGLAorICAgICAgICAgICAgICAgV1RfS05JRkV9KSwgdCApICE9IC0xKSB7CisJCSByZXR1cm4gMTsKKwl9CisJZWxzZSB7CisJCWxvZ19maWxlKCJDT01CQVQiLCJJbnZhbGlkIHdlYXBvbiB0eXBlOiAiK3QrIiwgb2JqZWN0OiAiKworCQkJCW9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSsiXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorfQorCisKK2ludCB2YWxpZF9hcm1vdXJfdHlwZShtaXhlZCB0KSB7CisJaWYgKFZBTElEX0FSTU9VUl9UWVBFKHQpKSB7CisJCSByZXR1cm4gMTsKKwl9CisJZWxzZSB7CisJCWxvZ19maWxlKCJDT01CQVQiLCJJbnZhbGlkIGFybW91ciB0eXBlOiAiK3QrIiwgb2JqZWN0OiAiKworCQkJCW9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSsiXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorfQorCisKK2ludCBxdWVyeV9wcmV2ZW50X3NoYWRvdygpIHsgcmV0dXJuIDE7IH0KKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL2NvbmZpZy5oIGIvc2VjdXJlL2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MGM4ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvY29uZmlnLmgKQEAgLTAsMCArMSwxNTEgQEAKKyNpZm5kZWYgX0NPTkZJR18KKyNkZWZpbmUgX0NPTkZJR18KKworLyoKKyAqIGNvbmZpZy5oCisgKgorICogZ2VuZXJhbCBjb25maWd1cmF0aW9uIGlzIGRvbmUgaGVyZSwgdGhlIHNlbGVjdGlvbiBvZiBnYW1lZHJpdmVyIG1vZGUKKyAqIGFuZCB0aGUgbGFuZ3VhZ2UgdG8gdXNlLgorICovCisKKyNkZWZpbmUgTVVESE9TVCAibWciCisjZGVmaW5lIEZUUERfSVAgIjg3Ljc5LjI0LjYwIgorI2RlZmluZSBVRFBTRVJWICI4Ny43OS4yNC42MCIKKworLy8gR3Vlc3MgYSBNVUROQU1FIGlmIG5vbmUgaXMgc2V0LgorI2lmbmRlZiBNVUROQU1FCisvLyBzZXQgbXVkbmFtZSB0byBNb3JnZW5HcmF1ZW4gaWYgTXVkIHN0YXJ0ZWQgb24gdGhlIE1HIHNlcnZlcgorIyAgaWYgTVVESE9TVCA9PSBfX0hPU1RfTkFNRV9fICYmICFkZWZpbmVkKF9fVEVTVE1VRF9fKQorIyAgICBkZWZpbmUgTVVETkFNRSAiTW9yZ2VuR3JhdWVuIgorIyAgZWxzZQorIyAgICBkZWZpbmUgTVVETkFNRSAiTUctSG9tZW11ZCIKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIE1VRE5BTUUgPT0gIk1vcmdlbkdyYXVlbiIKKyMgIGRlZmluZSBTU0xQT1JUIDQ3MTIKKyNlbHNlCisjICBkZWZpbmUgU1NMUE9SVCA0NzE0CisjZW5kaWYKKworLy8gdW5kZWYgdG8gZGlzYWJsZSBNU1NQIHN1cHBvcnQuCisjZGVmaW5lIE1TU1BfU1VQUE9SVCAiTVNTUC1QbGFpbnRleHQiCisKKy8vIHVuZGVmIHRvIGRpc2FibGUgc3VwcG9ydCBmb3IgcHVyZS1mdHBkIHZpcnR1YWwgdXNlcnMKKyNkZWZpbmUgX1BVUkVGVFBEXworCisjZGVmaW5lIF9NVURMSUJfTkFNRV8gIk1vcmdlbkdyYXVlbiIKKyNkZWZpbmUgX01VRExJQl9WRVJTSU9OXyAiMy4zLjUiCisKKy8qIGRlZmluZSBnZW5lcmFsIHBhdGhuYW1lcyAqLworI2RlZmluZSBNQVNURVIgICAgICAgICAgInNlY3VyZS9tYXN0ZXIiCisjZGVmaW5lIE1BSUxQQVRIICAgICAgICAibWFpbC8iCisjZGVmaW5lIFNBVkVQQVRIICAgICAgICAic2F2ZS8iCisjZGVmaW5lIE5FV1NQQVRIICAgICAgICAibmV3cy8iCisjZGVmaW5lIE5FV1NTRVJWRVIgICAgICAic2VjdXJlL25ld3MiCisjZGVmaW5lIFNFQ1VSRVNBVkVQQVRIICAic2VjdXJlL3NhdmUvIgorI2RlZmluZSBDT01CQVRfTUFTVEVSICAgInNlY3VyZS9jb21iYXQiCisKKyNkZWZpbmUgV0laQVJERElSICAgICAgICJwbGF5ZXJzIgorI2RlZmluZSBET01BSU5ESVIgICAgICAgImQiCisjZGVmaW5lIFBST0pFQ1RESVIgICAgICAicCIKKyNkZWZpbmUgRE9DRElSICAgICAgICAgICJkb2MiCisjZGVmaW5lIEdVSUxERElSICAgICAgICAiZ2lsZGVuIgorI2RlZmluZSBTUEVMTEJPT0tESVIgICAgInNwZWxsYm9va3MiCisjZGVmaW5lIE1BSUxESVIgICAgICAgICAibWFpbCIKKyNkZWZpbmUgTElCU0FWRURJUiAgICAgICJzYXZlIgorI2RlZmluZSBGVFBESVIgICAgICAgICAgIm9wZW4iCisjZGVmaW5lIFRNUERJUiAgICAgICAgICAidG1wIgorI2RlZmluZSBTVERESVIgICAgICAgICAgInN0ZCIKKyNkZWZpbmUgU1lTRElSICAgICAgICAgICJzeXMiCisjZGVmaW5lIExJQk9CSkRJUiAgICAgICAib2JqIgorI2RlZmluZSBMSUJST09NRElSICAgICAgInJvb20iCisjZGVmaW5lIEVUQ0RJUiAgICAgICAgICAiZXRjIgorI2RlZmluZSBMSUJMT0dESVIgICAgICAgImxvZyIKKyNkZWZpbmUgTkVXU0RJUiAgICAgICAgICJuZXdzIgorI2RlZmluZSBTRUNVUkVESVIgICAgICAgInNlY3VyZSIKKyNkZWZpbmUgTElCREFUQURJUiAgICAgICJkYXRhIgorI2RlZmluZSBMSUJJVEVNRElSICAgICAgIml0ZW1zIgorCisjZGVmaW5lIE5FVERFQURfUk9PTSAiL3Jvb20vbmV0enRvdCIKKyNkZWZpbmUgTkVUREVBRF9DSEVDS19USU1FIDUKKworLyogZGVmaW5lIHNwZWNpYWwgdXNlcmlkcyAqLyAKKyNkZWZpbmUgQkFDS0JPTkVJRCAiIFMgVCBEICIKKyNkZWZpbmUgUk9PVElEICAgICAiIFIgTyBPIFQgIgkJCS8qIHVwcGVyY2FzZSAhISAqLworI2RlZmluZSBNQUlMSUQgICAgICIgTSBBIEkgTCAiCisjZGVmaW5lIE5FV1NJRCAgICAgIiBOIEUgVyBTICIKKyNkZWZpbmUgTk9CT0RZICAgICAiTk9CT0RZIgorI2RlZmluZSBST09NSUQgICAgICJyb29tIgorI2RlZmluZSBQT0xJWkVJSUQgICJwb2xpemVpIgorI2RlZmluZSBET0NJRCAgICAgICJET0MiCisjZGVmaW5lIEdVSUxESUQgICAgIkdVSUxEIgorI2RlZmluZSBJVEVNSUQgICAgICJJVEVNUyIKKworLy8gIkJlc29uZGVyZSIgTWFnaWVybGV2ZWwKKyNkZWZpbmUgV0laTFZMUyAoWyBST09USUQ6IDEwMCxcCisgICAgICAgICAgICAgICAgICAgUk9PTUlEOiAyMSxcCisgICAgICAgICAgICAgICAgICAgUE9MSVpFSUlEOiAyMSxcCisgICAgICAgICAgICAgICAgICAgImFsbGUiOiAyNSxcCisgICAgICAgICAgICAgICAgICAgTk9CT0RZOiAwLFwKKyAgICAgICAgICAgICAgICAgICBET0NJRDogMCxcCisgICAgICAgICAgICAgICAgICAgR1VJTERJRDogMzAsXAorICAgICAgICAgICAgICAgICAgIElURU1JRDogMCxcCisgICAgICAgICAgICAgICAgIF0pCisKKyNkZWZpbmUgTUFYX0xPR19TSVpFIDUwMDAwCisKKyNpZm5kZWYgVEVTVE1VRAorIyAgZGVmaW5lIENBTExfT1VUX0hBUkQgMTIwMAorIyAgZGVmaW5lIENBTExfT1VUX1NPRlQgMTAwMAorI2Vsc2UgLy8gIVRFU1RNVUQKKyMgIGlmZGVmIE1JTl9DQUxMX09VVAorIyAgICBkZWZpbmUgQ0FMTF9PVVRfSEFSRCAxMjAKKyMgICAgZGVmaW5lIENBTExfT1VUX1NPRlQgMTAwCisjICBlbHNlCisjICAgIGRlZmluZSBDQUxMX09VVF9IQVJEIDEyMDAwMAorIyAgICBkZWZpbmUgQ0FMTF9PVVRfU09GVCAxMDAwMDAKKyMgIGVuZGlmCisjZW5kaWYgLy8gVEVTVE1VRAorCisjZGVmaW5lIEJBQ0tCT05FX1dJWklORk9fU0laRSA4CisjZGVmaW5lIExJVklOR19OQU1FIDMKKyNkZWZpbmUgTkFNRV9MSVZJTkcgNAorI2RlZmluZSBNRU1PUllfQlVGRiA1CisjZGVmaW5lIE5FVERFQURfTUFQIDYKKyNkZWZpbmUgSVBfTkFNRVMgICAgNworCisKKyNpZm5kZWYgU0lNVUxfRUZVTl9GSUxFCisjZGVmaW5lIFNJTVVMX0VGVU5fRklMRSAgICAgICAic2VjdXJlL3NpbXVsX2VmdW4vc2ltdWxfZWZ1biIKKyNlbmRpZgorI2lmbmRlZiBTUEFSRV9TSU1VTF9FRlVOX0ZJTEUKKyNkZWZpbmUgU1BBUkVfU0lNVUxfRUZVTl9GSUxFICJzZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zaW11bF9lZnVuIgorI2VuZGlmCisKKyNkZWZpbmUgTUFYX01BSUxTX1BFUl9IT1VSIDIwMAorCisvL21heC4gZ3JvZXNzZSB2b24gTWFwcGluZ3MgdW5kIEFycmF5cyBzb2xsdGVuIHZvbSBEcml2ZXIgb2RlciBkZXIKKy8vS29tbWFuZG96ZWlsZSB2b3JkZWZpbmllcnQgc2Vpbi4gV2VubiBuaWNodDoKKyNpZm5kZWYgX19NQVhfTUFQUElOR19LRVlTX18KKyNkZWZpbmUgX19NQVhfTUFQUElOR19LRVlTX18gMzAwMDAKKyNlbmRpZgorI2lmbmRlZiBfX01BWF9NQVBQSU5HX1NJWkVfXworI2RlZmluZSBfX01BWF9NQVBQSU5HX1NJWkVfXyA2MDAwMAorI2VuZGlmCisjaWZuZGVmIF9fTUFYX0FSUkFZX1NJWkVfXworI2RlZmluZSBfX01BWF9BUlJBWV9TSVpFX18gMTAwMDAKKyNlbmRpZgorCisvLyBIYWJlbiB3aXIgZWluZW4gRmVobGVyZGFlbW9uZW4genUgU3BlaWNoZXIgZGVyIERhdGVuPyBXZW5uIGphLCB3ZWxjaGVuPworLy8gRGVyIG5vcm1hbGUgYnJhdWNodCBTdXBwb3J0IGZ1ZXIgc3FsaXRlLiBXZW5uIGRlciBuaWNodCBleGlzdGllcnQsIGxhc3NlbgorLy8gd2lyIGRhcyBtaXQgZGVtIEVycm9yZCBzZWluLgorI2lmZGVmIF9fU1FMSVRFX18KKyNkZWZpbmUgRVJST1JEICIvc2VjdXJlL2Vycm9yZC5jIgorI2VuZGlmCisKKy8vIFNhdmVmaWxlLVZlcnNpb24KKyNkZWZpbmUgX19MSUJfX1NBVkVfRk9STUFUX1ZFUlNJT05fXyAxCisKKyNlbmRpZiAvLyBfQ09ORklHXworCmRpZmYgLS1naXQgYS9zZWN1cmUvZGVidWcuYyBiL3NlY3VyZS9kZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YTA3ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvZGVidWcuYwpAQCAtMCwwICsxLDg2IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvKiogXGZpbGUgL2ZpbGUuYworKiBLdXJ6YmVzY2hyZWlidW5nLgorKiBMYW5nYmVzY2hyZWlidW5nLi4uCisqIFxhdXRob3IgPEF1dG9yPgorKiBcZGF0ZSA8ZGF0ZT4KKyogXHZlcnNpb24gJElkJAorKi8KKy8qIENoYW5nZWxvZzoKKyovCisjcHJhZ21hIHN0cmljdF90eXBlcyxzYXZlX3R5cGVzLHJ0dF9jaGVja3MKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgbm9faW5oZXJpdAorI3ByYWdtYSBub19zaGFkb3cKKyNwcmFnbWEgcGVkYW50aWMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKworI2luY2x1ZGUgPGZ1bmN0aW9ubGlzdC5oPgorI2luY2x1ZGUgPGxwY3R5cGVzLmg+CisKKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisKKy8qKiBcZGVmIERFQlVHCisgIE91dHB1dHMgZGVidWcgbWVzc2FnZSB0byBNYWludGFpbmVyLCBpZiBNYWludGVpbmVyIGlzIGxvZ2dlZCBpbi4gCisqLworI2lmbmRlZiBERUJVRworI2RlZmluZSBERUJVRyh4KSAgaWYgKGZpbmRfcGxheWVyKCJ6ZXNzdHJhIikpXAorICAgICAgICAgICAgdGVsbF9vYmplY3QoZmluZF9wbGF5ZXIoInplc3N0cmEiKSxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEREJHOiAiK3grIlxuIikKKyNlbmRpZgorCisvKiogXGZuIHNldF9vYmplY3RfbmV4dF9yZXNldChvYix6ZWl0KQorICBcYnJpZWYgc2V0enQgZGVuIG5hZWNoc3RlbiBSZXNldCBhdWYgJ3plaXQnCisgIFxkZXRhaWxzIHNldHp0IGluIE9iamVrdGVuIGRlbiBuYWVjaHN0ZW4gUmVzZXQgLSBudXIgZnVlciBFTSsKKyAgXHBhcmFtW2luXSBvYgorICAob2JqZWN0KSBPYmpla3QgZGVzIFJlc2V0IGdlYWVuZGVydCB3aXJkLgorICBccGFyYW1baW5dIHplaXQKKyAgKGludCkgWmVpdCBiaXMgenVtIG5hZWNoc3RlbiBSZXNldC4KKyAgXHJldHVybiAoc3RyaW5nKSBHaWJ0IGRpZSB1ZWJlcmdlYmVuZSBaZWl0IGJpcyB6dW0gYmlzaGVyaWdlbiBSZXNldC4KKyAgXGF1dGhvciBaZXNzdHJhCisgIFxkYXRlIDA2LjEwLjIwMDcKKyAgXHNhIHNldF9vYmplY3RfaGVhcnRfYmVhdCgpCisqLworLy8gKiBSZXNldCBlaW5lcyBPYmpla3RlcyBlaW4vYXVzc2NoYWx0ZW4KK2ludCBzZXRfb2JqZWN0X25leHRfcmVzZXQobWl4ZWQgb2IsIGludCB6ZWl0KSB7CisKKyAgaWYgKHN0cmluZ3Aob2IpKQorICAgIG9iPWZpbmRfb2JqZWN0KG9iKTsKKworICBpZiAob2JqZWN0cChvYikgJiYgRUxERVJfU0VDVVJJVFkpCisgIC8vaWYgKG9iamVjdHAob2IpICYmIFNQRUNJQUxfU0VDVVJJVFkgJiYgIWNsb25lcChvYikpCisgICAgICByZXR1cm4gZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46OnNldF9uZXh0X3Jlc2V0LG9iKSx6ZWl0KTsKKworICByZXR1cm4gLTI7Cit9CisKK21peGVkIHF1ZXJ5X3ZhcmlhYmxlKG9iamVjdCBvYiwgc3RyaW5nIHZhcikKK3sKKyAgaWYgKCFwcmV2aW91c19vYmplY3QoKSB8fCAhSVNfQVJDSChnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSkgCisgICAgICB8fCAhdGhpc19pbnRlcmFjdGl2ZSgpIHx8ICFJU19BUkNIKHRoaXNfaW50ZXJhY3RpdmUoKSkKKyAgICAgIHx8IGdldHVpZChvYik9PVJPT1RJRCApCisgIHsKKyAgICB3cml0ZSgiRHUgYmlzdCBrZWluIEVNIG9kZXIgR290dCFcbiIpOworICAgIHJldHVybiAwOworICB9CisKKyAgbG9nX2ZpbGUoIkFSQ0gvUVYiLCBzcHJpbnRmKCIlczogJU8gaW5xdWlyZXMgdmFyICVzIGluICVPXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RpbWUodGltZSgpKSx0aGlzX2ludGVyYWN0aXZlKCksdmFyLG9iKSk7CisgIAorICBtaXhlZCByZXMgPSB2YXJpYWJsZV9saXN0KG9iLCBSRVRVUk5fRlVOQ1RJT05fTkFNRXxSRVRVUk5fRlVOQ1RJT05fRkxBR1N8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFVFVSTl9GVU5DVElPTl9UWVBFfFJFVFVSTl9WQVJJQUJMRV9WQUxVRSk7CisgIGludCBpbmRleCA9IG1lbWJlcihyZXMsdmFyKTsKKyAgaWYgKGluZGV4ID4gLTEpCisgIHsKKyAgICByZXR1cm4gKHtyZXNbaW5kZXhdLHJlc1tpbmRleCsxXSxyZXNbaW5kZXgrMl0scmVzW2luZGV4KzNdfSk7CisgIH0KKworICByZXR1cm4gMDsKK30KKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkgeworICAvLyBzZWN1cmVfbGV2ZWwoKSBpbiAqX1NFQ1VSSVRZKCkgcHJ1ZWZ0IGF1ZiBkaWUgRVVJRAorICBzZXRldWlkKGdldHVpZChNRSkpOworfQorCmRpZmYgLS1naXQgYS9zZWN1cmUvZHJvcG1hc3Rlci5jIGIvc2VjdXJlL2Ryb3BtYXN0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2QwOWMxCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL2Ryb3BtYXN0ZXIuYwpAQCAtMCwwICsxLDIwMiBAQAorI3ByYWdtYSBzdHJpY3RfdHlwZXMsc2F2ZV90eXBlcyxydHRfY2hlY2tzCisjcHJhZ21hIHBlZGFudGljLHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2luaGVyaXQsbm9fY2xvbmUKKyNwcmFnbWEgbm9fc2hhZG93CisKKyNkZWZpbmUgX05FRURfRFJPUE1BU1RFUl9JTVBMRU1FTlRBVElPTl8KKyNpbmNsdWRlIDxkcm9wbWFzdGVyLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorCitzdHJ1Y3QgcmFuZG9tX2V2ZW50X3MgeworICBzdHJpbmcgKm5hbWVzOworICBpbnQgcmVkdWN0aW9uOworICBpbnQgKnJuZF92YWx1ZXM7CisgIGludCAqZGVmYXVsdF9ybmRfdmFsdWVzOworICBzdHJpbmcgY3JlYXRvcjsKK307CisKKy8vIE1hcHBpbmcgbWl0IGVpbmVtIHJhbmRvbV9ldmVudF9zIGFscyBXZXJ0IHBybyBTY2hsdWVzc2VsCisvLyBTY2hsdWVzc2VsOiAwOiBnbG9iYWxlciBFaW50cmFnLCBhbnNvbnN0ZW4gQlAtTmFtZW4gb2RlciBUZWlsZSB2b24gUGZhZGVuCisvLyAoL2QvPGViZW4+LzxtYWdpZXI+LzxnZWJpZXQ+LykKK3ByaXZhdGUgbWFwcGluZyByYW5kb21FdmVudHM7CisKK3ByaXZhdGUgc3RydWN0IHJhbmRvbV9ldmVudF9zIFNhbml0aXplUkUoc3RydWN0IHJhbmRvbV9ldmVudF9zIHJlKQoreworICAgIC8vIHJuZF92YWx1ZXMsIGRlZmF1bHRfcm5kX3ZhbHVlcyB1bmQgbmFtZXMgbXVlc3NlbiBnbGVpY2ggbGFuZyBzZWluIC0+IGF1ZgorICAgIC8vIGRhcyBrdWVyemVzdGUga3Vlcnplbi4gQWNodHVuZzogbWFjaHQgaW1wbGl6aXQgZWluZSBLb3BpZSAtIFdJQ0hUSUchCisgICAgaW50IHNpemUgPSBzaXplb2YocmUtPnJuZF92YWx1ZXMpOworICAgIGlmIChwb2ludGVycChyZS0+bmFtZXMpKQorICAgICAgICBzaXplID0gbWluKHNpemUsIHNpemVvZihyZS0+bmFtZXMpKTsKKyAgICBpZiAocG9pbnRlcnAocmUtPmRlZmF1bHRfcm5kX3ZhbHVlcykpIHsKKyAgICAgIHNpemUgPSBtaW4oc2l6ZSwgc2l6ZW9mKHJlLT5kZWZhdWx0X3JuZF92YWx1ZXMpKTsKKyAgICAgIHJlLT5kZWZhdWx0X3JuZF92YWx1ZXMgPSByZS0+ZGVmYXVsdF9ybmRfdmFsdWVzWzAuLnNpemUtMV07CisgICAgfQorICAgIGlmIChwb2ludGVycChyZS0+bmFtZXMpKQorICAgICAgcmUtPm5hbWVzID0gcmUtPm5hbWVzWzAuLnNpemUtMV07CisKKyAgICByZS0+cm5kX3ZhbHVlcyA9IHJlLT5ybmRfdmFsdWVzWzAuLnNpemUtMV07CisKKyAgICByZXR1cm4gcmU7Cit9CisKKy8vIGtleT09MCBzaWduaWZpZXMgdGhlIGdsb2JhbCBrZXkKK3B1YmxpYyB2YXJhcmdzIHZvaWQgQ3JlYXRlUmFuZG9tRXZlbnQoc3RyaW5nIGtleSwgaW50ICpybmRfdmFsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nICpybmRfbmFtZXMsIGludCByZWQpCit7CisgIHN0cnVjdCByYW5kb21fZXZlbnRfcyByZSA9ICg8cmFuZG9tX2V2ZW50X3M+KTsKKyAgCisgIGlmICghbWVtYmVyKHJhbmRvbUV2ZW50cyxrZXkpKSB7CisgICAgcmUtPnJuZF92YWx1ZXMgPSBjb3B5KHJuZF92YWwpIHx8IERGTFRfUk5EX1ZBTFVFUzsKKyAgICAvLyB3ZW5uIHJuZF92YWwgPT0gMCBpc3QsIGlzdCBkYXMgT0ssIGRhbm4gd2lyZCBzcGFldGVyIGltbWVyCisgICAgLy8gREZMVF9STkRfVkFMVUVTIGdlbm9tbWVuLgorICAgIHJlLT5kZWZhdWx0X3JuZF92YWx1ZXMgPSBjb3B5KHJuZF92YWwpOworICAgIC8vIG5hbWVzIGRhcmYgYXVjaCAwIHNlaW4sIHdlbm4gRGVmYXVsdHdlcnRlIGdlbm9tbWVuIHdlcmRlbiBzb2xsZW4uCisgICAgcmUtPm5hbWVzID0gY29weShybmRfbmFtZXMpOworICAgIHJlLT5yZWR1Y3Rpb24gPSByZWQgfHwgUk5EX1JFRFVDVElPTjsKKyAgICByZS0+Y3JlYXRvciA9IG9iamVjdF9uYW1lKGV4dGVybl9jYWxsKCkgPyBwcmV2aW91c19vYmplY3QoKSA6IHRoaXNfb2JqZWN0KCkpOworCisgICAgcmFuZG9tRXZlbnRzW2tleV0gPSBTYW5pdGl6ZVJFKHJlKTsKKyAgfQorfQorCitwdWJsaWMgdmFyYXJncyBpbnQgQ2hhbmdlUmFuZG9tRXZlbnQoc3RyaW5nIGtleSwgaW50ICpybmRfdmFsLCBpbnQgKnJuZF92YWxfZGZsdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyAqcm5kX25hbWVzLCBpbnQgcmVkKQoreworICBpZiAocHJvY2Vzc19jYWxsKCkpIHJldHVybiAtMTsKKyAgaWYgKCFtZW1iZXIocmFuZG9tRXZlbnRzLCBrZXkpKSByZXR1cm4gLTI7CisgIHN0cnVjdCByYW5kb21fZXZlbnRfcyByZSA9IHJhbmRvbUV2ZW50c1trZXldOworICAvLyBTY2hyZWlienVncmlmZiBlcmxhdWJlbj8gTnVyIGZ1ZXIgRXJzY2hhZmZlcm9iamVrdGUgdW5kIEVNLgorICAvLyBCZW1lcmt1bmc6IFJNKyBoYWJlbiBadWdyaWZmLCB3ZWlsIHNpZSBTY2hyZWlienVncmlmZiBhdWYgZGFzCisgIC8vIEVyc2NoYWZmZXJvYmpla3QgaGFiZW4uCisgIGlmIChleHRlcm5fY2FsbCgpCisgICAgICAmJiByZS0+Y3JlYXRvciAhPSBvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSkKKyAgICAgICYmICFBUkNIX1NFQ1VSSVRZKQorICAgIHJldHVybiAtMTsKKworICBpZiAocG9pbnRlcnAocm5kX3ZhbCkpCisgICAgcmUtPnJuZF92YWx1ZXMgPSBybmRfdmFsOworICBpZiAocG9pbnRlcnAocm5kX3ZhbF9kZmx0KSkKKyAgICByZS0+ZGVmYXVsdF9ybmRfdmFsdWVzID0gcm5kX3ZhbF9kZmx0OworICBpZiAocG9pbnRlcnAocm5kX25hbWVzKSkKKyAgICByZS0+bmFtZXMgPSBybmRfbmFtZXM7CisgIGlmIChyZWQpCisgICAgcmUtPnJlZHVjdGlvbiA9IHJlZDsKKworICBTYW5pdGl6ZVJFKHJlKTsKKworICByZXR1cm4gMTsKK30KKworcHVibGljIGludCBEZWxldGVSYW5kb21FdmVudChzdHJpbmcga2V5KQoreworICBpZiAocHJvY2Vzc19jYWxsKCkpIHJldHVybiAtMTsKKyAgaWYgKCFtZW1iZXIocmFuZG9tRXZlbnRzLCBrZXkpKSByZXR1cm4gLTI7CisgIHN0cnVjdCByYW5kb21fZXZlbnRfcyByZSA9IHJhbmRvbUV2ZW50c1trZXldOworICAvLyBTY2hyZWlienVncmlmZiBlcmxhdWJlbj8gTnVyIGZ1ZXIgRXJzY2hhZmZlcm9iamVrdGUgdW5kIEVNLgorICAvLyBCZW1lcmt1bmc6IFJNcyBoYWJlbiBadWdyaWZmLCB3ZWlsIHNpZSBTY2hyZWlienVncmlmZiBhdWYgZGFzCisgIC8vIEVyc2NoYWZmZXJvYmpla3QgaGFiZW4uCisgIGlmIChleHRlcm5fY2FsbCgpCisgICAgICAmJiByZS0+Y3JlYXRvciAhPSBvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSkKKyAgICAgICYmICFBUkNIX1NFQ1VSSVRZKQorICAgIHJldHVybiAtMTsKKworICBtX2RlbGV0ZShyYW5kb21FdmVudHMsIGtleSk7CisgIHJldHVybiAxOworfQorCit2b2lkIGNyZWF0ZSgpCit7CisgIHNldGV1aWQoZ2V0dWlkKHRoaXNfb2JqZWN0KCkpKTsKKyAgcmVzdG9yZV9vYmplY3QoRFJPUFNBVkUpOworICBpZighcmFuZG9tRXZlbnRzIHx8ICFtYXBwaW5ncChyYW5kb21FdmVudHMpKQorICB7CisgICAgcmFuZG9tRXZlbnRzID0gKFtdKTsKKyAgfQorICBpZiAoIW1lbWJlcihyYW5kb21FdmVudHMsIEdMT0JBTF9LRVkpKQorICAgIENyZWF0ZVJhbmRvbUV2ZW50KEdMT0JBTF9LRVksIERGTFRfUk5EX1ZBTFVFUywgREZMVF9STkRfTkFNRVMsIFJORF9SRURVQ1RJT04pOworICBzZXRfbmV4dF9yZXNldCgzNjAwICsgcmFuZG9tKDEwODAwKSk7Cit9CisKK3ZvaWQgc2F2ZW1lKCl7CisgIHNhdmVfb2JqZWN0KERST1BTQVZFKTsKK30KKwordmFyYXJncyBpbnQgcmVtb3ZlKCkKK3sKKyAgc2F2ZW1lKCk7CisgIGRlc3RydWN0KE1FKTsKKyAgcmV0dXJuIDE7Cit9CisKK3B1YmxpYyB2YXJhcmdzIGludCBkcm9wUmFyZShpbnQgcmFyZWxldmVsLCBzdHJpbmcga2V5KSB7CisgIGlmICghbWVtYmVyKHJhbmRvbUV2ZW50cywga2V5KSkKKyAgICByZXR1cm4gMDsKKyAgCisgIHN0cnVjdCByYW5kb21fZXZlbnRfcyByZSA9IHJhbmRvbUV2ZW50c1trZXldOworICBpZiAocmFyZWxldmVsIDwgMCB8fCByYXJlbGV2ZWwgPj0gc2l6ZW9mKHJlLT5ybmRfdmFsdWVzKSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKHJhbmRvbShyZS0+cm5kX3ZhbHVlc1tyYXJlbGV2ZWxdKSA9PSAwKQorICB7CisgICAgLy8gRGVmYXVsdHdlcnQgd2llZGVyaGVyc3RlbGxlbi4KKyAgICBpZiAocG9pbnRlcnAocmUtPmRlZmF1bHRfcm5kX3ZhbHVlcykpCisgICAgICByZS0+cm5kX3ZhbHVlc1tyYXJlbGV2ZWxdID0gcmUtPmRlZmF1bHRfcm5kX3ZhbHVlc1tyYXJlbGV2ZWxdOworICAgIGVsc2UKKyAgICAgIHJlLT5ybmRfdmFsdWVzW3JhcmVsZXZlbF0gPSBERkxUX1JORF9WQUxVRVNbcmFyZWxldmVsXTsKKyAgICAvLyB1bmQgZHJvcHBlbi4KKyAgICByZXR1cm4gMTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvLyBXYWhyc2NoZWlubGljaGtlaXQgZXJob2VoZW4sIGluZGVtIHJuZF92YWx1ZXMgcmVkdXppZXJ0IHdpcmQuCisgICAgcmUtPnJuZF92YWx1ZXNbcmFyZWxldmVsXSAtPSByZS0+cmVkdWN0aW9uOworICAgIC8vIG5lZ2F0aXZlIHJuZF92YWx1ZXMgc2luZCBvaywgcmFuZG9tKCkgaXN0IGRhbm4gaW1tZXIgMC4KKyAgfQorICAvLyBmYWxsLXRocm91Z2gKKyAgcmV0dXJuIDA7Cit9CisKKy8vIERyb3BwdCBnZW5hdSAxIG9kZXIgMCBJdGVtcyBhdXMgZGVtIGdlZ2ViZW5lbiBTZXQuIEJlbnV0enQgaGllcmJlaSBkYXMKKy8vIG1pdHRlbHMgPGtleT4gZGVmaW5pZXJ0ZSBSYW5kb21ldmVudCB1bmQgZGVuIHp1ciBqZXdlaWxpZ2VuIElEIGdlZ2ViZW5lbgorLy8gPHJhcmVsZXZlbD4uCisvLyA8c2V0PiBtdXNzIGluIGRlciBGb3JtCisvLyB7IHtJRCxSQVJFTEVWRUx9LCB7SUQsUkFSRUxFVkVMfSwgLi4uIH0KKy8vIGdlZ2ViZW4gd2VyZGVuLiA8SUQ+IG11c3MgZGFiZWkgIT0gMCBzZWluIHVuZCB3aXJkIGltIEVyZm9sZ3NmYWxsCisvLyB6dXJ1ZWNrZ2ViZW4uCittaXhlZCBkcm9wU2V0SXRlbShtaXhlZCBzZXQsIHN0cmluZyBrZXkpIHsKKyAgCisgIGlmIChwb2ludGVycChzZXQpKQorICB7CisgICAgc2V0PWZpbHRlcihzZXQsIGZ1bmN0aW9uIGludCAobWl4ZWQgZWwpIHsKKyAgICAgIHJldHVybiBwb2ludGVycChlbCkgJiYgc2l6ZW9mKGVsKT49MiAmJiBpbnRwKGVsWzFdKTsKKyAgICB9ICk7CisgICAgc2V0PXNvcnRfYXJyYXkoc2V0LCBmdW5jdGlvbiBpbnQgKG1peGVkIGEsIG1peGVkIGIpIHsKKyAgICAgIHJldHVybiBhWzFdPmJbMV07CisgICAgfSk7CisgICAgCisgICAgZm9yZWFjaChtaXhlZCBlbDogc2V0KSB7CisgICAgICBpZihkcm9wUmFyZShlbFsxXSwga2V5KSl7CisgICAgICAgIHJldHVybiBlbFswXTsKKyAgICAgIH0KKyAgICB9ICAgICAgCisgIH0KKyAgCisgIHJldHVybiAwOworfQorCit2b2lkIHJlc2V0KCkKK3sKKyAgc2V0X25leHRfcmVzZXQoMzYwMCo3Mik7CisgIC8vIGVpbiB3ZW5pZyBhdWZyYWV1bWVuCisKKyAgLy8gQWxsZSBFdmVudHMgcmF1c3dlcmZlbiwgZGVyZW4gRXJzY2hhZmZlcm9iamVrdCBuaWNodCBtZWhyIGV4aXNpZXJ0CisgIC8vIChOYWNodGVpbDogbmljaHQtZ2VsYWRlbmUgVkMtT2JqZWt0ZSB3ZXJkZW4gbmljaHQgYmVydWVja3NpY2h0aWd0KS4KKyAgZm9yZWFjaChzdHJpbmcga2V5LCBzdHJ1Y3QgcmFuZG9tX2V2ZW50X3MgcmU6IHJhbmRvbUV2ZW50cykgeworICAgIGlmICghZmluZF9vYmplY3QocmUtPmNyZWF0b3IpCisgICAgICAgICYmIGZpbGVfc2l6ZShyZS0+Y3JlYXRvciArICIuYyIpIDw9IDApCisgICAgICBtX2RlbGV0ZShyYW5kb21FdmVudHMsIGtleSk7CisgIH0KKworICBzYXZlbWUoKTsKK30KKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL2Ryb3BtYXN0ZXIuaCBiL3NlY3VyZS9kcm9wbWFzdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ViMmJmZgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9kcm9wbWFzdGVyLmgKQEAgLTAsMCArMSwyOCBAQAorI2lmbmRlZiBfRFJPUE1BU1RFUl8KKyNkZWZpbmUgX0RST1BNQVNURVJfCisKKy8vIHBhdGggdG8gZHJvcG1hc3RlcgorI2RlZmluZSBEUk9QTUFTVEVSICIvc2VjdXJlL2Ryb3BtYXN0ZXIiCisjZGVmaW5lIERST1BTQVZFICIvc2VjdXJlL0FSQ0gvRFJPUE1BU1RFUiIKKworLy8gcmFyZWxldmVscworI2RlZmluZSBDT01NT04JCQkJCSAgICAgIDAKKyNkZWZpbmUgVU5DT01NT04JCQkJICAgICAgMQorI2RlZmluZSBSQVJFCQkJCQkgICAgICAgIDIKKyNkZWZpbmUgVkVSWV9SQVJFCQkJCSAgICAgIDMKKyNkZWZpbmUgVUxUUkFfUkFSRQkJCQkgICAgNAorI2RlZmluZSBSQVRIRVJfTk9UX1BST0JBQkxFCQk1CisjZGVmaW5lIERGTFRfUk5EX05BTUVTCSh7Imdld29laG5saWNoIiwidW5nZXdvZWhubGljaCIsXAorICAgICAgICAgICAgICAgICAgICAgICAgICAic2VsdGVuIiwic2VociBzZWx0ZW4iLCJhdXNzZXJnZXdvZWhubGljaCBzZWx0ZW4iLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInByYWt0aXNjaCBuaWUifSkKKworI2lmIGRlZmluZWQoX05FRURfRFJPUE1BU1RFUl9JTVBMRU1FTlRBVElPTl8pICYmICFkZWZpbmVkKF9EUk9QTUFTVEVSX0lNUExFTUVOVEFUSU9OXykKKyNkZWZpbmUgX0RST1BNQVNURVJfSU1QTEVNRU5UQVRJT05fCisvLyByYW5kb20gaGVscGVyCisjZGVmaW5lIEdMT0JBTF9LRVkJMAorI2RlZmluZSBERkxUX1JORF9WQUxVRVMgICh7MTAwLDEwMDAsMTAwMDAsMTAwMDAwLDIwMDAwMCwxMDAwMDAwfSkKKyNkZWZpbmUgUk5EX1JFRFVDVElPTgkxMAorCisjZW5kaWYgLy8gX0RST1BNQVNURVJfSU1QTEVNRU5UQVRJT05fCisKKyNlbmRpZiAvLyBfRFJPUE1BU1RFUl8KZGlmZiAtLWdpdCBhL3NlY3VyZS9lcnJvcmQtc3RydWN0cy5jIGIvc2VjdXJlL2Vycm9yZC1zdHJ1Y3RzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg1ZGE5OQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9lcnJvcmQtc3RydWN0cy5jCkBAIC0wLDAgKzEsNjIgQEAKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHJ0dF9jaGVja3Msc2F2ZV90eXBlcworCitzdHJ1Y3QgZnJhbWVfcyB7CisgIGludCAgICBpZDsKKyAgaW50ICAgIHR5cGU7CisgIHN0cmluZyBuYW1lOworICBzdHJpbmcgcHJvZzsKKyAgc3RyaW5nIG9iajsKKyAgaW50ICAgIGxvYzsKKyAgaW50ICAgIHRpY2tzOworfTsKKworc3RydWN0IG5vdGVfcyB7CisgIGludCAgICBpZDsKKyAgaW50ICAgIHRpbWU7CisgIHN0cmluZyB1c2VyOworICBzdHJpbmcgdHh0OworfTsKKworc3RydWN0IGJhc2VfaXNzdWVfcyB7CisgIGludCAgICBpZDsKKyAgc3RyaW5nIGhhc2hrZXk7CisgIHN0cmluZyB1aWQ7CisgIGludCAgICB0eXBlOworICBpbnQgICAgbXRpbWU7CisgIGludCAgICBjdGltZTsKKyAgaW50ICAgIGF0aW1lOworICBpbnQgICAgY291bnQ7CisgIGludCAgICBkZWxldGVkOworICBpbnQgICAgcmVzb2x2ZWQ7CisgIGludCAgICBsb2NrZWQ7CisgIHN0cmluZyBsb2NrZWRfYnk7CisgIGludCAgICBsb2NrZWRfdGltZTsKKyAgc3RyaW5nIHJlc29sdmVyOworICBzdHJpbmcgbWVzc2FnZTsKKyAgc3RyaW5nIGxvYWRuYW1lOworfTsKKworc3RydWN0IGN0aXNzdWVfcyAoYmFzZV9pc3N1ZV9zKSB7Cit9OworCitzdHJ1Y3QgdXNlcmlzc3VlX3MgKGN0aXNzdWVfcykgeworICBzdHJpbmcgb2JqOworICBzdHJpbmcgcHJvZzsKKyAgaW50ICAgIGxvYzsKKyAgc3RyaW5nIHRpdHA7CisgIHN0cmluZyB0aWVudjsKK307CisKK3N0cnVjdCBydGlzc3VlX3MgKHVzZXJpc3N1ZV9zKSB7CisgIHN0cmluZyBoYm9iajsKKyAgaW50ICAgIGNhdWdodDsKKyAgc3RyaW5nIGNvbW1hbmQ7CisgIHN0cmluZyB2ZXJiOworfTsKKworLy8gYWxsIHBvc3NpYmxlIGRhdGEgaW5jbHVkaW5nIHN0YWNrIHRyYWNlIGFuZCBub3Rlcy4KK3N0cnVjdCBmdWxsaXNzdWVfcyAocnRpc3N1ZV9zKSB7CisgIG1peGVkICogbm90ZXM7IC8vc3RydWN0IG5vdGVfcyAqCisgIG1peGVkICogc3RhY2s7IC8vc3RydWN0IGZyYW1lX3MgKgorfTsKKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL2Vycm9yZC5jIGIvc2VjdXJlL2Vycm9yZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjOWM0ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvZXJyb3JkLmMKQEAgLTAsMCArMSwxNDgyIEBACisvKiAgTW9yZ2VuR3JhdWVuIE1VRGxpYgorICAgIC9wL2RhZW1vbi9lcnJvcmQuYworICAgIHNwZWljaGVydCBGZWhsZXIgdW5kIFdhcm51bmdlbgorICAgIEF1dG9yOiBaZXNzdHJhCisgICAgJElkOiBlcnJvcmQuYyA5NDM5IDIwMTYtMDEtMjAgMDk6NDg6MjhaIFplc3N0cmEgJAorICAgIGdnZi4gQ2hhbmdlbG9nOgorKi8KKworI3ByYWdtYSBzdHJpY3RfdHlwZXMsc2F2ZV90eXBlcyxydHRfY2hlY2tzCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIG5vX3NoYWRvdworI3ByYWdtYSBub19pbmhlcml0CisjcHJhZ21hIHBlZGFudGljCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIHdhcm5fZGVwcmVjYXRlZAorCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPGRlYnVnX2luZm8uaD4KKyNpbmNsdWRlIDxjb21tYW5kcy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPG1haWwuaD4KKyNpbmNsdWRlIDx0bHMuaD4KKyNpbmNsdWRlIDxldmVudHMuaD4KKworaW5oZXJpdCAiL3NlY3VyZS9lcnJvcmQtc3RydWN0cyI7CisKKyNkZWZpbmUgX19ORUVEX0lNUExFTUVOVEFUSU9OX18KKyNpbmNsdWRlICJlcnJvcmQuaCIKKyN1bmRlZiBfX05FRURfSU1QTEVNRU5UQVRJT05fXworCisjZGVmaW5lIFNBVkVGSUxFICAoX19ESVJfXysiQVJDSC9lcnJvcmQiKQorCisjZGVmaW5lIFRJIHRoaXNfaW50ZXJhY3RpdmUoKQorCitwcml2YXRlIGludCAgICAgICBhY2Nlc3NfY2hlY2soc3RyaW5nIHVpZCxpbnQgbW9kZSk7Citwcml2YXRlIHZhcmFyZ3MgaW50IHNldF9sb2NrKGludCBpc3N1ZWlkLCBpbnQgbG9jaywgc3RyaW5nIG5vdGUpOworcHJpdmF0ZSB2YXJhcmdzIGludCBzZXRfcmVzb2x1dGlvbihpbnQgaXNzdWVpZCwgaW50IHJlc29sdXRpb24sIHN0cmluZyBub3RlKTsKKworcHJpdmF0ZSBpbnQgdmVyc2VuZGVfbWFpbChzdHJ1Y3QgZnVsbGlzc3VlX3MgZmVobGVyKTsKKworbm9zYXZlIG1hcHBpbmcgbGFzdGVycm9yOyAgIC8vIGRpZSBsZXR6ZW4gNSBqZWRlciBBcnQuCisKKworLyogKioqKioqKioqKioqKioqKioqKiBIZWxmZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitwdWJsaWMgaW50IGdldEVycm9ySUQoc3RyaW5nIGhhc2hrZXkpCit7CisgIGludCoqIHJvdz1zbF9leGVjKCJTRUxFQ1QgaWQgZnJvbSBpc3N1ZXMgV0hFUkUgaGFzaGtleT0/MTsiLAorICAgICAgICAgICAgICAgICAgICBoYXNoa2V5KTsKKyAgLy9ERUJVRyhzcHJpbnRmKCJnZXRFSUQ6ICVzOiAlT1xuIixoYXNoa2V5LHJvdykpOworICBpZiAocG9pbnRlcnAocm93KSkKKyAgeworICAgIHJldHVybiByb3dbMF1bMF07CisgIH0KKyAgcmV0dXJuIC0xOworfQorCisvLyBub3RlLT5pZCBtdXNzIGF1ZiBlaW5lbiBFaW50cmFnIGluIGlzc3VlcyB2ZXJ3ZWlzZW4sIGVzIGVyZm9sZ3Qga2VpbmUKKy8vIFBydWVmdW5nLgoraW50IGRiX2FkZF9ub3RlKHN0cnVjdCBub3RlX3Mgbm90ZSkKK3sKKyAgc2xfZXhlYygiSU5TRVJUIElOVE8gbm90ZXMoaXNzdWVpZCx0aW1lLHVzZXIsdHh0KSAiCisgICAgICAgICAgIlZBTFVFUyg/MSw/Miw/Myw/NCk7IiwKKyAgICAgICAgICB0b19hcnJheShub3RlKS4uLik7CisgIHJldHVybiBzbF9pbnNlcnRfaWQoKTsKK30KKworcHJpdmF0ZSBzdHJ1Y3QgZnJhbWVfcyogZGJfZ2V0X3N0YWNrKGludCBpc3N1ZWlkKQoreworICBtaXhlZCByb3dzID0gc2xfZXhlYygiU0VMRUNUICogRlJPTSBzdGFja3RyYWNlcyBXSEVSRSBpc3N1ZWlkPT8xICIKKyAgICAgICAgICAgICAgICAgICAgICAgIk9SREVSIEJZIHJvd2lkOyIsIGlzc3VlaWQpOworICBpZiAocG9pbnRlcnAocm93cykpCisgIHsKKyAgICBzdHJ1Y3QgZnJhbWVfcyogc3RhY2sgPSBhbGxvY2F0ZShzaXplb2Yocm93cykpOworICAgIGludCBpOworICAgIGZvcmVhY2gobWl4ZWQgcm93IDogcm93cykKKyAgICB7CisgICAgICBzdGFja1tpXSA9IHRvX3N0cnVjdChyb3csICg8ZnJhbWVfcz4pKTsKKyAgICAgICsraTsKKyAgICB9CisgICAgcmV0dXJuIHN0YWNrOworICB9CisgIHJldHVybiAwOworfQorCitwcml2YXRlIHN0cnVjdCBub3RlX3MqIGRiX2dldF9ub3RlcyhpbnQgaXNzdWVpZCkKK3sKKyAgbWl4ZWQgcm93cyA9IHNsX2V4ZWMoIlNFTEVDVCAqIEZST00gbm90ZXMgV0hFUkUgaXNzdWVpZD0/MSAiCisgICAgICAgICAgICAgICAgICAgICAgICJPUkRFUiBCWSByb3dpZDsiLCBpc3N1ZWlkKTsKKyAgaWYgKHBvaW50ZXJwKHJvd3MpKQorICB7CisgICAgc3RydWN0IG5vdGVfcyogbm90ZXMgPSBhbGxvY2F0ZShzaXplb2Yocm93cykpOworICAgIGludCBpOworICAgIGZvcmVhY2gobWl4ZWQgcm93IDogcm93cykKKyAgICB7CisgICAgICBub3Rlc1tpXSA9IHRvX3N0cnVjdChyb3csICg8bm90ZV9zPikpOworICAgICAgKytpOworICAgIH0KKyAgICByZXR1cm4gbm90ZXM7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vIGVpbmVuIGR1cmNoIGlkIG9kZXIgaGFzaGtleSBiZXplaWNobmV0ZW4gRWludHJhZyBhbHMgZnVsbGlzc3VlX3MgbGllZmVybi4KK3ByaXZhdGUgc3RydWN0IGZ1bGxpc3N1ZV9zIGRiX2dldF9pc3N1ZShpbnQgaXNzdWVpZCwgc3RyaW5nIGhhc2hrZXkpCit7CisgIG1peGVkIHJvd3MgPSBzbF9leGVjKCJTRUxFQ1QgKiBGUk9NIGlzc3VlcyBXSEVSRSBpZD0/MSBPUiBoYXNoa2V5PT8yOyIsCisgICAgICAgICAgICAgICAgICAgICAgIGlzc3VlaWQsIGhhc2hrZXkpOworICBpZiAocG9pbnRlcnAocm93cykpCisgIHsKKyAgICAvLyBFaW5mYWNoc3RlciBXZWcgLSBmdW5rdGlvbmllcnQgYWJlciBudXIsIHNvbGFuZ2UgZGllIEZlbGRlciBpbiBkZXIgREIKKyAgICAvLyBkaWUgZ2xlaWNoZSBSZWloZW5mb2xnZSB3aWUgaW4gZGVyIHN0cnVjdCBoYWJlbiEgRW50d2VkZXIgaW1tZXIKKyAgICAvLyBzaWNoZXJzdGVsbGVuIG9kZXIgRXJnZWJuaXNyZWloZW5mb2xnZSBvYmVuIGltIHNlbGVjdCBmZXN0bGVnZW4hCisgICAgc3RydWN0IGZ1bGxpc3N1ZV9zIGlzc3VlID0gdG9fc3RydWN0KCByb3dzWzBdLCAoPGZ1bGxpc3N1ZV9zPikgKTsKKyAgICBpZiAoaXNzdWUtPnR5cGUgPT0gVF9SVEVSUk9SKQorICAgICAgICBpc3N1ZS0+c3RhY2sgPSBkYl9nZXRfc3RhY2soaXNzdWUtPmlkKTsKKyAgICBpc3N1ZS0+bm90ZXMgPSBkYl9nZXRfbm90ZXMoaXNzdWUtPmlkKTsKKyAgICByZXR1cm4gaXNzdWU7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3ByaXZhdGUgc3RydWN0IGZ1bGxpc3N1ZV9zIGZpbHRlcl9wcml2YXRlKHN0cnVjdCBmdWxsaXNzdWVfcyBpc3N1ZSkKK3sKKyAgICAvL21vbWVudGFuIHdpcmQgRl9DTEksIGFsc28gZGllIFNwaWVsZXJlaW5nYWJlIHZvciBkZW0gRmVobGVyCisgICAgLy9hdXNnZWZpbHRlcnQsIHdlbm4gVEkga2VpbiBFTSBvZGVyIG1hbiBpbiBwcm9jZXNzX3N0cmluZygpIGlzdC4KKworICAgIC8vV2VubiBFTSB1bmQgbmljaHQgaW4gcHJvY2Vzc19zdHJpbmcoKSBvZGVyIGRpZSBTcGllbGVyZWluZ2FiZSBnYXIgbmljaHQKKyAgICAvL2ltIEZlaGxlcmVpbnRyYWcgZHJpbnN0ZWh0OiB1bmdlZmlsdGVydCB6dXJ1ZWNrCisgICAgaWYgKCFpc3N1ZS0+Y29tbWFuZCB8fAorICAgICAgICAoIXByb2Nlc3NfY2FsbCgpICYmIEFSQ0hfU0VDVVJJVFkpICkKKyAgICAgICAgcmV0dXJuIGlzc3VlOworCisgICAgLy9zb25zdCBGX0NMSSByYXVzZmlsdGVybiwgYWxzbyBLb3BpZSB1bmQgaW4gZGVyIEtvcGllIGFlbmRlcm4uCisgICAgaXNzdWUtPmNvbW1hbmQ9IkJpdHRlIEVNIGZyYWdlbiI7CisgICAgcmV0dXJuIGlzc3VlOworfQorCisvLyBzZXR6dCBvZGVyIGxvZXNjaHQgZGllIExvZXNjaHNwZXJyZS4KKy8vIFBydWVmdCwgb2IgPGlzc3VlaWQ+IGV4aXN0aWVydCB1bmQgYWVuZGVydCBkZW4gWnVzdGFuZCBudXIsIHdlbm4gbm9ldGlnLgorLy8gUnVlY2tnYWJlOiAtMSwgd2VubiBJc3N1ZSBuaWNodCBleGlzdGllcnQsIC0yIHdlbm4gYmVyZWl0cyByZXNvbHZlZCwgLTMKKy8vICAgICAgICAgICAgd2VubiBrZWluZSBBZW5kZXJ1bmcgbm9ldGlnLCBzb25zdCBkZW4gbmV1ZW4gU3BlcnJ6dXN0YW5kCitpbnQgZGJfc2V0X2xvY2soaW50IGlzc3VlaWQsIGludCBsb2Nrc3RhdGUsIHN0cmluZyBub3RlKQoreworICBpbnQqKiByb3dzID0gc2xfZXhlYygiU0VMRUNUIGxvY2tlZCxyZXNvbHZlZCBGUk9NIGlzc3VlcyBXSEVSRSBpZD0/MTsiLAorICAgICAgICAgICAgICAgICAgICAgICBpc3N1ZWlkKTsKKyAgaWYgKCFyb3dzKQorICAgIHJldHVybiAtMTsgIC8vIG5pY2h0IHZvcmhhbmRlbi4KKworICBpZiAocm93c1swXVsxXSkKKyAgICAgIHJldHVybiAtMjsgLy8gYmVyZWl0cyByZXNvbHZlZCAtPiBTcGVycmUgbmljaHQgbW9lZ2xpY2guCisKKworICBpZiAobG9ja3N0YXRlICYmICFyb3dzWzBdWzBdKQorICB7CisgICAgLy8gU3BlcnJlbgorLy8gICAgc2xfZXhlYygiQkVHSU4gVFJBTlNBQ1RJT047Iik7CisgICAgc2xfZXhlYygiVVBEQVRFIGlzc3VlcyBTRVQgbG9ja2VkPTEsbG9ja2VkX2J5PT8yLGxvY2tlZF90aW1lPT8zLG10aW1lPT8zICIKKyAgICAgICAgICAgICJXSEVSRSBpZD0/MTsiLAorICAgICAgICAgICAgaXNzdWVpZCwgZ2V0dWlkKFRJKSwgdGltZSgpKTsKKyAgICBkYl9hZGRfbm90ZSggKDxub3RlX3M+IGlkOiBpc3N1ZWlkLCB0aW1lOiB0aW1lKCksIHVzZXI6IGdldHVpZChUSSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0eHQ6IHNwcmludGYoIkxvY2sgZ2VzZXR6dDogJXMiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RlID8gbm90ZSA6ICI8a2VpbiBLb21tZW50YXI+IikpICk7CisvLyAgICBzbF9leGVjKCJDT01NSVQ7Iik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgZWxzZSBpZiAoIWxvY2tzdGF0ZSAmJiByb3dzWzBdWzBdKQorICB7CisgICAgLy8gZW50c3BlcnJlbgorLy8gICAgc2xfZXhlYygiQkVHSU4gVFJBTlNBQ1RJT047Iik7CisgICAgc2xfZXhlYygiVVBEQVRFIGlzc3VlcyBTRVQgbG9ja2VkPTAsbG9ja2VkX2J5PTAsbG9ja2VkX3RpbWU9MCxtdGltZT0/MiAiCisgICAgICAgICAgICAiV0hFUkUgaWQ9PzE7IiwgaXNzdWVpZCwgdGltZSgpKTsKKyAgICBkYl9hZGRfbm90ZSggKDxub3RlX3M+IGlkOiBpc3N1ZWlkLCB0aW1lOiB0aW1lKCksIHVzZXI6IGdldHVpZChUSSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0eHQ6IHNwcmludGYoIkxvY2sgZ2Vsb2VzY2h0OiAlcyIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGUgPyBub3RlIDogIjxrZWluIEtvbW1lbnRhcj4iKSkgKTsKKy8vICAgIHNsX2V4ZWMoIkNPTU1JVDsiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICAvLyBuaXggYWVuZGVybi4KKyAgcmV0dXJuIC0zOworfQorCisvLyBtYXJraWVydCBlaW4gSXNzdWUgYWxzIGdlZml4dCBvZGVyIG5pY2h0IGdlZml4dC4KKy8vIFBydWVmdCwgb2IgPGlzc3VlaWQ+IGV4aXN0aWVydCB1bmQgYWVuZGVydCBkZW4gWnVzdGFuZCBudXIsIHdlbm4gbm9ldGlnLgorLy8gUnVlY2tnYWJlOiAtMSwgd2VubiBJc3N1ZSBuaWNodCBleGlzdGllcnQsIC0zIHdlbm4ga2VpbmUgQWVuZGVydW5nIG5vZXRpZywKKy8vICAgICAgICAgICAgc29uc3QgZGVuIG5ldWVuIFNwZXJyenVzdGFuZAoraW50IGRiX3NldF9yZXNvbHV0aW9uKGludCBpc3N1ZWlkLCBpbnQgcmVzb2x2ZWQsIHN0cmluZyBub3RlKQoreworICBpbnQqKiByb3dzID0gc2xfZXhlYygiU0VMRUNUIHJlc29sdmVkIEZST00gaXNzdWVzIFdIRVJFIGlkPT8xOyIsCisgICAgICAgICAgICAgICAgICAgICAgIGlzc3VlaWQpOworICBpZiAoIXJvd3MpCisgICAgcmV0dXJuIC0xOyAgLy8gbmljaHQgdm9yaGFuZGVuLgorCisgIGlmIChyZXNvbHZlZCAmJiAhcm93c1swXVswXSkKKyAgeworICAgIC8vIEFscyBnZWZpeHQgbWFya2llcmVuLgorLy8gICAgc2xfZXhlYygiQkVHSU4gVFJBTlNBQ1RJT047Iik7CisgICAgc2xfZXhlYygiVVBEQVRFIGlzc3VlcyBTRVQgcmVzb2x2ZWQ9MSxyZXNvbHZlcj0/MixtdGltZT0/MyAiCisgICAgICAgICAgICAiV0hFUkUgaWQ9PzE7IiwKKyAgICAgICAgICAgIGlzc3VlaWQsIGdldHVpZChUSSksdGltZSgpKTsKKyAgICBkYl9hZGRfbm90ZSggKDxub3RlX3M+IGlkOiBpc3N1ZWlkLCB0aW1lOiB0aW1lKCksIHVzZXI6IGdldHVpZChUSSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0eHQ6IHNwcmludGYoIkZlaGxlciBnZWZpeHQ6ICVzIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90ZSA/IG5vdGUgOiAiPGtlaW4gS29tbWVudGFyPiIpKSApOworLy8gICAgc2xfZXhlYygiQ09NTUlUOyIpOworICAgIHJldHVybiAxOworICB9CisgIGVsc2UgaWYgKCFyZXNvbHZlZCAmJiByb3dzWzBdWzBdKQorICB7CisgICAgLy8gYWxzIG5pY2h0IGdlZml4dCBtYXJraWVyZW4uCisvLyAgICBzbF9leGVjKCJCRUdJTiBUUkFOU0FDVElPTjsiKTsKKyAgICBzbF9leGVjKCJVUERBVEUgaXNzdWVzIFNFVCByZXNvbHZlZD0wLHJlc29sdmVyPTAsbXRpbWU9PzIgIgorICAgICAgICAgICAgIldIRVJFIGlkPT8xOyIsIGlzc3VlaWQsIHRpbWUoKSk7CisgICAgZGJfYWRkX25vdGUoICg8bm90ZV9zPiBpZDogaXNzdWVpZCwgdGltZTogdGltZSgpLCB1c2VyOiBnZXR1aWQoVEkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHh0OiBzcHJpbnRmKCJGaXggenVydWVja2dlem9nZW46ICVzIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90ZSA/IG5vdGUgOiAiPGtlaW4gS29tbWVudGFyPiIpKSApOworLy8gICAgc2xfZXhlYygiQ09NTUlUOyIpOworICAgIHJldHVybiAwOworICB9CisgIC8vIG5peCBhZW5kZXJuLgorICByZXR1cm4gLTM7CisKK30KKworLy8gVHJhbnNmZXJpZXJ0IGVpbiBJc3N1ZSB6dSBlaW5lciBuZXVlbiB6dXN0YWVuZGlnZW4gVUlECisvLyBQcnVlZnQsIG9iIDxpc3N1ZWlkPiBleGlzdGllcnQgdW5kIGFlbmRlcnQgZGVuIFp1c3RhbmQgbnVyLCB3ZW5uIG5vZXRpZy4KKy8vIFJ1ZWNrZ2FiZTogLTEsIHdlbm4gSXNzdWUgbmljaHQgZXhpc3RpZXJ0LCAtMyB3ZW5uIGtlaW5lIEFlbmRlcnVuZyBub2V0aWcsCisvLyAgICAgICAgICAgIDEsIHdlbm4gZXJmb2xncmVpY2ggbmV1IHp1Z2V3aWVzZW4KK2ludCBkYl9yZWFzc2lnbl9pc3N1ZShpbnQgaXNzdWVpZCwgc3RyaW5nIG5ld3VpZCwgc3RyaW5nIG5vdGUpCit7CisgIHN0cmluZyoqIHJvd3MgPSBzbF9leGVjKCJTRUxFQ1QgdWlkIEZST00gaXNzdWVzIFdIRVJFIGlkPT8xOyIsCisgICAgICAgICAgICAgICAgICAgICAgIGlzc3VlaWQpOworICBpZiAoIXJvd3MpCisgICAgcmV0dXJuIC0xOyAgLy8gbmljaHQgdm9yaGFuZGVuLgorCisgIGlmICghc3RyaW5ncChuZXd1aWQpKQorICAgIHJldHVybigtMik7CisKKyAgaWYgKG5ld3VpZCAhPSByb3dzWzBdWzBdKQorICB7CisvLyAgICBzbF9leGVjKCJCRUdJTiBUUkFOU0FDVElPTjsiKTsKKyAgICBzbF9leGVjKCJVUERBVEUgaXNzdWVzIFNFVCB1aWQ9PzIsbXRpbWU9PzMgV0hFUkUgaWQ9PzE7IiwKKyAgICAgICAgICAgIGlzc3VlaWQsIG5ld3VpZCx0aW1lKCkpOworICAgIGRiX2FkZF9ub3RlKCAoPG5vdGVfcz4gaWQ6IGlzc3VlaWQsIHRpbWU6IHRpbWUoKSwgdXNlcjogZ2V0dWlkKFRJKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4dDogc3ByaW50ZigiRmVobGVyIHZvbiAlcyBhbiAlcyB1ZWJlcnRyYWdlbi4gKCVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93c1swXVswXSwgbmV3dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGUgPyBub3RlIDogIjxrZWluIEtvbW1lbnRhcj4iKSkgKTsKKy8vICAgIHNsX2V4ZWMoIkNPTU1JVDsiKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHJldHVybiAtMzsKK30KKworLy8gaW5rcmVtZW50aWVydCBjb3VudCB1bmQgYWt0dWFsaXNpZXJ0IG10aW1lLCBhdGltZS4KKy8vIEF1c3NlcmRlbSB3aXJkIGdnZi4gZGFzIExvZXNjaGZsYWcgZ2VudWxsdCAtIGVpbiBlcm5ldXQgYXVmZ2V0cmV0ZW5lcgorLy8gRmVobGVyIHNvbGx0ZSBhbnNjaGxpZXNzZW5kIG5pY2h0IG1laHIgZ2Vsb2VzY2h0IHNlaW4uIEdlbG9lc3RlCisvLyAocmVzb2x2ZWQpIEVpbnRyYWVnZSB3ZXJkZW4gTklDSFQgYXVmIHVuZ2Vsb2VzdCBnZXNldHp0LiBWZXJtdXRsaWNoIHRyYXQKKy8vIGRlciBGZWhsZXIgaW4gZWluZW0gYWx0ZW4gT2JqZWt0ZSBhdWYuLi4KKy8vIElzc3VlIG11c3MgaW4gZGVyIERCIGV4aXN0aWVyZW4uCitpbnQgZGJfY291bnR1cF9pc3N1ZShpbnQgaXNzdWVpZCkKK3sKKyAgc2xfZXhlYygiVVBEQVRFIGlzc3VlcyBTRVQgY291bnQ9Y291bnQrMSxtdGltZT0/MixhdGltZT0/MixkZWxldGVkPTAgV0hFUkUgaWQ9PzE7IiwKKyAgICAgICAgICBpc3N1ZWlkLHRpbWUoKSk7CisgIHJldHVybiAxOworfQorCisvLyBEYXMgSXNzdWUgd2lyZCBnZ2YuIGVudC1sb2VzY2h0IHVuZCBhbHMgbmljaHQgcmVzdm9sdmVkIG1hcmtpZXJ0LgorLy8gU2luZCBwbCB1bmQgbXNnICE9IDAsIHdpcmQgZWluZSBOb3RpeiBhbmdlaGFlbmd0LgorLy8gYWt0dWFsaXNpZXJ0IG10aW1lLCBhdGltZS4KKy8vIElzc3VlIG11c3MgaW4gZGVyIERCIGV4aXN0aWVyZW4uCitpbnQgZGJfcmVvcGVuX2lzc3VlKGludCBpc3N1ZWlkLCBzdHJpbmcgcGwsIHN0cmluZyBtc2cpCit7CisgIGludCoqIHJvdz1zbF9leGVjKCJTRUxFQ1QgZGVsZXRlZCxyZXNvbHZlZCBmcm9tIGlzc3VlcyBXSEVSRSBpZD0/MTsiLAorICAgICAgICAgICAgICAgICAgICBpc3N1ZWlkKTsKKyAgaWYgKHBvaW50ZXJwKHJvdykKKyAgICAgICYmIChyb3dbMF1bMF0gfHwgcm93WzBdWzFdKSApCisgIHsKKy8vICAgIHNsX2V4ZWMoIkJFR0lOIFRSQU5TQUNUSU9OOyIpOworICAgIGlmIChwbCAmJiBtc2cpCisgICAgeworICAgICAgZGJfYWRkX25vdGUoICg8bm90ZV9zPiBpZDogaXNzdWVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZTogdGltZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyOiBwbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHh0OiBtc2cpICk7CisgICAgfQorICAgIHNsX2V4ZWMoIlVQREFURSBpc3N1ZXMgU0VUICIKKyAgICAgICAgImRlbGV0ZWQ9MCxyZXNvbHZlZD0wLHJlc29sdmVyPTAsbXRpbWU9PzIsYXRpbWU9PzIgV0hFUkUgaWQ9PzE7IiwKKyAgICAgICAgaXNzdWVpZCx0aW1lKCkpOworLy8gICAgc2xfZXhlYygiQ09NTUlUOyIpOworICB9CisgIHJldHVybiAxOworfQorCitpbnQgZGJfaW5zZXJ0X2lzc3VlKHN0cnVjdCBmdWxsaXNzdWVfcyBpc3N1ZSkKK3sKKyAgLy9ERUJVRyhzcHJpbnRmKCJkYl9pbnNlcnQ6ICVPXG4iLCBpc3N1ZSkpOworCisgIG1peGVkIHJvdz1zbF9leGVjKCJTRUxFQ1QgaWQgZnJvbSBpc3N1ZXMgV0hFUkUgaGFzaGtleT0/MTsiLAorICAgICAgICAgICAgICAgICAgICBpc3N1ZS0+aGFzaGtleSk7CisgIC8vREVCVUcoc3ByaW50ZigiaW5zZXJ0OiAlczogJU9cbiIsaXNzdWUtPmhhc2hrZXkscm93KSk7CisgIGlmIChwb2ludGVycChyb3cpKQorICB7CisgICAgaXNzdWUtPmlkPXJvd1swXVswXTsKKyAgICByZXR1cm4gZGJfY291bnR1cF9pc3N1ZShpc3N1ZS0+aWQpOworICB9CisvLyAgc2xfZXhlYygiQkVHSU4gVFJBTlNBQ1RJT047Iik7CisgIHNsX2V4ZWMoIklOU0VSVCBJTlRPIGlzc3VlcyhoYXNoa2V5LHVpZCx0eXBlLG10aW1lLGN0aW1lLGF0aW1lLGNvdW50LCIKKyAgICAgICAgICAiZGVsZXRlZCxyZXNvbHZlZCxsb2NrZWQsbG9ja2VkX2J5LGxvY2tlZF90aW1lLHJlc29sdmVyLG1lc3NhZ2UsIgorICAgICAgICAgICJsb2FkbmFtZSxvYmoscHJvZyxsb2MsdGl0cCx0aWVudixoYm9iaixjYXVnaHQsY29tbWFuZCx2ZXJiKSAiCisgICAgICAgICAgIlZBTFVFUyg/MSw/Miw/Myw/NCw/NSw/Niw/Nyw/OCw/OSw/MTAsPzExLD8xMiw/MTMsPzE0LD8xNSwiCisgICAgICAgICAgIj8xNiw/MTcsPzE4LD8xOSw/MjAsPzIxLD8yMiw/MjMsPzI0KTsiLAorICAgICAgICAgICh0b19hcnJheShpc3N1ZSlbMS4uMjRdKS4uLik7IAorICBpc3N1ZS0+aWQ9c2xfaW5zZXJ0X2lkKCk7CisKKyAgaWYgKHBvaW50ZXJwKGlzc3VlLT5zdGFjaykpCisgIHsKKyAgICBmb3JlYWNoKHN0cnVjdCBmcmFtZV9zIGVudHJ5IDogaXNzdWUtPnN0YWNrKQorICAgIHsKKyAgICAgIGVudHJ5LT5pZCA9IGlzc3VlLT5pZDsKKyAgICAgIHNsX2V4ZWMoIklOU0VSVCBJTlRPIHN0YWNrdHJhY2VzKGlzc3VlaWQsdHlwZSxuYW1lLHByb2csb2JqLGxvYyx0aWNrcykgIgorICAgICAgICAgICAgICAiVkFMVUVTKD8xLD8yLD8zLD80LD81LD82LD83KTsiLAorICAgICAgICAgICAgICB0b19hcnJheShlbnRyeSkuLi4pOworICAgIH0KKyAgfQorICBpZiAocG9pbnRlcnAoaXNzdWUtPm5vdGVzKSkKKyAgeworICAgIGZvcmVhY2goc3RydWN0IG5vdGVfcyBlbnRyeSA6IGlzc3VlLT5ub3RlcykKKyAgICB7CisgICAgICBlbnRyeS0+aWQgPSBpc3N1ZS0+aWQ7CisgICAgICBzbF9leGVjKCJJTlNFUlQgSU5UTyBub3Rlcyhpc3N1ZWlkLHRpbWUsdXNlcix0eHQpICIKKyAgICAgICAgICAgICAgIlZBTFVFUyg/MSw/Miw/Myw/NCk7IiwKKyAgICAgICAgICAgICAgdG9fYXJyYXkoZW50cnkpLi4uKTsKKyAgICB9CisgIH0KKy8vICBzbF9leGVjKCJDT01NSVQ7Iik7CisKKyAgcmV0dXJuIGlzc3VlLT5pZDsKK30KKworCisvLyBsb2dndCBlaW5lbiBUX1JFUE9SVEVEX0VSUiwgVF9SRVBPUlRFRF9JREVBLCBUX1JFUE9SVEVEX1RZUE8sIFRfUkVQT1JURURfTUQKK3B1YmxpYyBzdHJpbmcgTG9nUmVwb3J0ZWRFcnJvcihtYXBwaW5nIGVycikKK3sKKyAgICAvL2RhcmYgbnVyIHZvbiBTcGllbGVyc2hlbGxzIG9kZXIgRmVobGVydGV1ZmVsIGdlcnVmZW4gd2VyZGVuLgorICAgIGlmIChleHRlcm5fY2FsbCgpICYmICFwcmV2aW91c19vYmplY3QoKQorICAgICAgICB8fCAoc3Ryc3RyKGxvYWRfbmFtZShwcmV2aW91c19vYmplY3QoKSksIi9zdGQvc2hlbGxzLyIpID09IC0xCisgICAgICAgICAgICYmIGxvYWRfbmFtZShwcmV2aW91c19vYmplY3QoKSkgIT0gIi9vYmovdG9vbHMvZmVobGVydGV1ZmVsIikpCisgICAgICAgIHJldHVybiAwOworCisgICAgLy9ERUJVRygiTG9nUmVwb3J0ZWRFcnJvclxuIik7CisgICAgLy8gREVCVUcoc3ByaW50ZigiJU9cbiIsZXJyKSk7CisgICAgc3RyaW5nIHVpZCA9IChzdHJpbmcpbWFzdGVyKCktPmNyZWF0b3JfZmlsZShlcnJbRl9PQkpdKTsKKworICAgIC8vIGRlZmF1bHQtVHlwCisgICAgaWYgKCFtZW1iZXIoZXJyLCBGX1RZUEUpKSBlcnJbRl9UWVBFXSA9IFRfUkVQT1JURURfRVJSOworCisgICAgLy8gZGl2LiBLZXlzIGR1ZXJmZW4gbmljaHQgZ2VzZXR6dCBzZWluLgorICAgIGVyciAtPSAoW0ZfU1RBVEUsIEZfUkVBRFNUQU1QLCBGX0NBVUdIVCwgRl9TVEFDSywgRl9DTEksIEZfVkVSQiwKKyAgICAgICAgICAgICBGX0xPQ0ssIEZfUkVTT0xWRVIsIEZfTk9URVNdKTsKKworICAgIC8vIEVycm9ybWFwcGluZyBpbiBpc3N1ZS1zdHJ1Y3QgdW13YW5kZWxuIHVuZCBiZWZ1ZWxsZW4uCisgICAgc3RydWN0IGZ1bGxpc3N1ZV9zIGlzc3VlID0gKDxmdWxsaXNzdWVfcz4pOworICAgIGlzc3VlLT50eXBlID0gZXJyW0ZfVFlQRV07CisgICAgaXNzdWUtPnVpZCA9IHVpZDsKKyAgICBpc3N1ZS0+bXRpbWUgPSBpc3N1ZS0+Y3RpbWUgPSBpc3N1ZS0+YXRpbWUgPSB0aW1lKCk7CisgICAgaXNzdWUtPmNvdW50PTE7CisgICAgaXNzdWUtPmxvYWRuYW1lID0gbG9hZF9uYW1lKGVycltGX09CSl0pOworICAgIGlzc3VlLT5tZXNzYWdlID0gZXJyW0ZfTVNHXTsKKyAgICBpc3N1ZS0+b2JqID0gb2JqZWN0X25hbWUoZXJyW0ZfT0JKXSk7CisgICAgLy8gTm9ybWFsaXNpZXJlbiBhdWYgZnVlaHJlbmRlbiAvIHVuZCBrZWluIC5jCisgICAgaWYgKGVycltGX1BST0ddIT0idW5iZWthbm50IikKKyAgICAgICAgaXNzdWUtPnByb2cgPSBsb2FkX25hbWUoZXJyW0ZfUFJPR10pOworICAgIGVsc2UKKyAgICAgICAgaXNzdWUtPnByb2cgPSAidW5iZWthbm50IjsKKyAgICBpc3N1ZS0+dGl0cCA9IGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkgfHwgdGhpc19wbGF5ZXIoKSk7CisgICAgaWYgKG9iamVjdHAoZXJyW0ZfT0JKXSkpCisgICAgICBpc3N1ZS0+dGllbnYgPSBvYmplY3RfbmFtZShlbnZpcm9ubWVudChlcnJbRl9PQkpdKSk7CisKKyAgICAvL0RFQlVHKHNwcmludGYoIiVPXG4iLGlzc3VlKSk7CisgICAgaXNzdWUtPmhhc2hrZXkgPSBoYXNoKFRMU19IQVNIX01ENSwKKyAgICAgICAgc3ByaW50ZigiJWQlcyVzIiwgaXNzdWUtPnR5cGUsIGlzc3VlLT5sb2FkbmFtZSwgaXNzdWUtPm1lc3NhZ2UpKTsKKworICAgIC8vIGdnZi4gdm9yaGFuZGVuZW4gRmVobGVyIHN1Y2hlbiAtIHp1Z2VnZWJlbjogc29sbHRlIGJlaSB2b24gU3BpZWxlcm4KKyAgICAvLyBnZW1lbGRldGVuIERpbmdlbiB2ZXJtdXRsaWNoIG5pZSB2b3Jrb21tZW4uLi4KKyAgICBpbnQgb2xkaWQgPSBnZXRFcnJvcklEKGlzc3VlLT5oYXNoa2V5KTsKKyAgICBpZiAob2xkaWQgPj0gMCkKKyAgICB7CisgICAgICAvLyBnZ2YuIHNpY2hlcnN0ZWxsZW4sIGRhc3MgZXIgd2llZGVyIGVyb2VmZm5ldCB3aXJkLgorICAgICAgZGJfcmVvcGVuX2lzc3VlKG9sZGlkLCAiPEVycm9yRD4iLAorICAgICAgICAgICAgICAgICAgICAgICJBdXRvbWF0aXNjaCB3aWVkZXJlcm9lZmZuZXQgd2VnZW4gZXJuZXV0ZW0gQXVmdHJldGVuLiIpOworICAgICAgZGJfY291bnR1cF9pc3N1ZShvbGRpZCk7CisgICAgICByZXR1cm4gaXNzdWUtPmhhc2hrZXk7CisgICAgfQorCisgICAgLy8gc29uc3QgZnVlZ2VuIHdpciBlaW5lbiBuZXVlbiBFaW50cmFnIGhpbnp1CisgICAgLy8gU3BpZWxlcmdlbWVsZGV0ZSBCdWdzIHdlcmRlbiBlcnN0bWFsIHZvciBhdXRvbWF0aXNjaGVtIExvZXNjaGVuCisgICAgLy8gZ2VzY2h1ZXR6dCwgYmlzIGVpbiB6dXN0YWVuZGlnZXIgTWFnaWVyIGlobiB6dXIgS2VubnRuaXMgbmltbXQgdW5kCisgICAgLy8gZW50c3BlcnJ0LgorICAgIGlzc3VlLT5sb2NrZWQgPSAxOworICAgIGlzc3VlLT5sb2NrZWRfYnkgPSBnZXR1aWQoVEkgfHwgUEwpOworICAgIGlzc3VlLT5sb2NrZWRfdGltZSA9IHRpbWUoKTsKKworICAgIC8vIEluIERCIGVpbnRyYWdlbi4KKyAgICBpc3N1ZS0+aWQgPSBkYl9pbnNlcnRfaXNzdWUoaXNzdWUpOworCisgICAgbGFzdGVycm9yW2lzc3VlLT50eXBlXT1pc3N1ZS0+aWQ7CisKKyAgICAvLyBFdmVudCB0cmlnZ2VybiwgYWJlciBudXIgZWluZSBUZWlsbWVuZ2UgZGVyIERhdGVuIGRpcmVrdCBtaXRsaWVmZXJuLgorICAgIEVWRU5URC0+VHJpZ2dlckV2ZW50KEVWVF9MSUJfTkVXX0VSUk9SLAorICAgICAgICAgICAgICAoW0ZfVFlQRTogaXNzdWUtPnR5cGUsIEZfSEFTSEtFWTppc3N1ZS0+aGFzaGtleSwKKyAgICAgICAgICAgICAgIEZfVUlEOmlzc3VlLT51aWQsIEZfSUQ6IGlzc3VlLT5pZF0pKTsKKworICAgIERFQlVHKHNwcmludGYoIkxvZ1JlcG9ydGVkRXJyb3I6ICVzXG4iLGlzc3VlLT5oYXNoa2V5KSk7CisKKyAgICByZXR1cm4gaXNzdWUtPmhhc2hrZXk7Cit9CisKKy8vRmVobGVyIHJlZ2lzdHJpZXJlbgorLy9EaWVzZSBGdW5rdGlvbiBkYXJmIG5pY2h0IG1laHIgYWxzIDIwMGsgVGlja3MgdmVyYnJhdWNoZW4gdW5kIHdpcmQgbnVyIHZvbQorLy9NYXN0ZXIgZ2VydWZlbiEKK3B1YmxpYyBpbnQgTG9nRXJyb3Ioc3RyaW5nIG1zZyxzdHJpbmcgcHJnLHN0cmluZyBjdXJvYmosaW50IGxpbmUsbWl4ZWQgY3VscHJpdCwKKyAgICBpbnQgY2F1Z2h0KQoreworICAgIC8vREVCVUcoc3ByaW50ZigiTG9nRXJyb3I6IFByb2c6ICVPLCBPYmo6ICVPLFxuIixwcmcsY3Vyb2JqKSk7CisKKyAgICAvL2RhcmYgbnVyIHZvbSBNYXN0ZXIgZ2VydWZlbiB3ZXJkZW4KKyAgICBpZiAoIWV4dGVybl9jYWxsKCkgfHwgCisgICAgICAgIChwcmV2aW91c19vYmplY3QoKSAmJiBwcmV2aW91c19vYmplY3QoKSAhPSBtYXN0ZXIoKSkpCisgICAgICAgIHJldHVybiAwOworCisgICAgc3RydWN0IGZ1bGxpc3N1ZV9zIGlzc3VlID0gKDxmdWxsaXNzdWVfcz4pOworCisgICAgLy9VSUQgYmVzdGltbWVuCisgICAgaXNzdWUtPnVpZD0oc3RyaW5nKW1hc3RlcigpLT5jcmVhdG9yX2ZpbGUoY3Vyb2JqKTsKKyAgICAvL0RFQlVHKHNwcmludGYoIkxvZ0Vycm9yOiBVSUQ6ICVzXG4iLHVpZCkpOworCisgICAgLy9Mb2FkbmFtZSAoYmVzc2VyIGFscyBCUCwgZmFsbHMgcmVuYW1lX29iamVjdCgpIGJlbnV0enQgd3VyZGUpIGJlc3RpbW1lbgorICAgIGlmICghc3RyaW5ncChjdXJvYmopIHx8ICFzaXplb2YoY3Vyb2JqKSkKKyAgICAgICAgaXNzdWUtPmxvYWRuYW1lID0gY3Vyb2JqID0gIjxVbmJla2FubnQ+IjsKKyAgICBlbHNlCisgICAgeworICAgICAgICAvL2xvYWRfbmFtZSBuaW1tdCBTdHJpbmdzIHVuZCBPYmplY3RzIHVuZCBrb25zdHJ1aWVydCBkZW4gbG9hZG5hbWUsCisgICAgICAgIC8vd2llIGVyIHNlaW4gc29sbHRlLCB3ZW5uIGRhcyBPYmpla3QgbmljaHQgbWVociBleGlzdGllcnQuCisgICAgICAgIGlzc3VlLT5sb2FkbmFtZT1sb2FkX25hbWUoY3Vyb2JqKTsKKyAgICB9CisgICAgaWYgKCFzdHJpbmdwKGlzc3VlLT5sb2FkbmFtZSkpCisgICAgeworICAgICAgICAvL2hpZXIga29tbXQgbWFuIHJlaW4sIGZhbGxzIGN1cm9iaiBlaW4gJ2thcHV0dGVyJyBOYW1lIGlzdCwKKyAgICAgICAgLy9kLmguIGxvYWRfbmFtZSgpIDAgbGllZmVydC4KKyAgICAgICAgaXNzdWUtPmxvYWRuYW1lPSI8SWxsZWdhbCBvYmplY3QgbmFtZT4iOworICAgIH0KKworICAgIC8vIFdlbm4gY3Vyb2JqIGluIC9wbGF5ZXJzLyBsaWVndCwgZXMgZWluZW4gVEkgZ2lidCwgd2VsY2hlciBlaW4gTWFnaWVyCisgICAgLy8gaXN0IHVuZCBkaWVzZXIgZGllIFByb3AgUF9ET05UX0xPR19FUlJPUlMgZ2VzZXR6dCBoYXQsIHdpcmQgZGVyIEZFaGxlcgorICAgIC8vIG5pY2h0IGdlc3BlaWNoZXJ0LgorICAgIGlmICh0aGlzX2ludGVyYWN0aXZlKCkgJiYgSVNfTEVBUk5FUih0aGlzX2ludGVyYWN0aXZlKCkpCisgICAgICAgICYmIHN0cnN0cihpc3N1ZS0+bG9hZG5hbWUsV0laQVJERElSKT09MAorICAgICAgICAmJiB0aGlzX2ludGVyYWN0aXZlKCktPlF1ZXJ5UHJvcChQX0RPTlRfTE9HX0VSUk9SUykpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBwcmcgdW5kIGN1cm9iaiBhdWYgZnVlaHJlbmRlbiAvIHVuZCBvaG5lIC5jIGFtIEVuZGUgbm9ybWllcmVuLgorICAgIGlmIChzdHJpbmdwKHByZykpCisgICAgICAgIGlzc3VlLT5wcm9nID0gbG9hZF9uYW1lKHByZyk7CisgICAgaWYgKHN0cmluZ3AoY3Vyb2JqKSAmJiBjdXJvYmpbMF0hPScvJykKKyAgICB7CisgICAgICBjdXJvYmo9Ii8iK2N1cm9iajsKKyAgICB9CisKKyAgICBpc3N1ZS0+b2JqID0gY3Vyb2JqOworICAgIGlzc3VlLT5sb2MgPSBsaW5lOworICAgIGlzc3VlLT5tZXNzYWdlID0gbXNnOworICAgIGlzc3VlLT5jdGltZSA9IGlzc3VlLT5tdGltZSA9IGlzc3VlLT5hdGltZSA9IHRpbWUoKTsKKyAgICBpc3N1ZS0+dHlwZSA9IFRfUlRFUlJPUjsKKyAgICBpc3N1ZS0+Y291bnQgPSAxOworICAgIGlzc3VlLT5jYXVnaHQgPSBjYXVnaHQ7CisKKyAgICAvL0hhc2hrZXkgYmVzdGltbWVuOiBUeXAsIE5hbWUgZGVyIEJsdWVwcmludCBkZXMgYnVnZ2VuZGVuIE9iamVrdHMsCisgICAgLy9Qcm9ncmFtbW5hbWUsIFplaWxlbm5yLiwgRmVobGVybWVsZHVuZworICAgIC8vVE9ETzogZXZ0bC4gc2hhMSgpIHN0YXR0IG1kNSgpPworICAgIGlzc3VlLT5oYXNoa2V5PWhhc2goVExTX0hBU0hfTUQ1LAorICAgICAgICBzcHJpbnRmKCIlZCVzJXMlZCVzIiwgVF9SVEVSUk9SLCBpc3N1ZS0+bG9hZG5hbWV8fCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzc3VlLT5wcm9nIHx8ICIiLCBpc3N1ZS0+bG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzc3VlLT5tZXNzYWdlfHwiPE5vIGVycm9yIG1lc3NhZ2UgZ2l2ZW4uPiIpKTsKKyAgICBERUJVRyhzcHJpbnRmKCJMb2dFcnJvcjogSGFzaGtleTogJXMiLCBpc3N1ZS0+aGFzaGtleSkpOworCisgICAgLy8gZ2dmLiB2b3JoYW5kZW5lbiBGZWhsZXIgc3VjaGVuCisgICAgaW50IG9sZGlkID0gZ2V0RXJyb3JJRChpc3N1ZS0+aGFzaGtleSk7CisgICAgaWYgKG9sZGlkID49IDApCisgICAgeworICAgICAgZGJfcmVvcGVuX2lzc3VlKG9sZGlkLCAiPEVycm9yRD4iLAorICAgICAgICAgICAgICAgICAgICAgICJBdXRvbWF0aXNjaCB3aWVkZXJlcm9lZmZuZXQgd2VnZW4gZXJuZXV0ZW0gQXVmdHJldGVuLiIpOworICAgICAgZGJfY291bnR1cF9pc3N1ZShvbGRpZCk7CisgICAgICByZXR1cm4gb2xkaWQ7CisgICAgfQorCisgICAgLy9zb25zdCBmdWVnZW4gd2lyIGVpbmVuIG5ldWVuIEVpbnRyYWcgaGluenUKKyAgICAvL0RFQlVHKHNwcmludGYoIkxvZ0Vycm9yOiBPQko6ICVzLCBCUDogJXMiLGN1cm9iaixsb2FkbmFtZSkpOworICAgIC8vIFdlbm4gRmVobGVyIGltIEhCLCBPYmpla3RuYW1lbiBlcm1pdHRlbG4KKyAgICBpZiAob2JqZWN0cChjdWxwcml0KSkKKyAgICAgICAgaXNzdWUtPmhib2JqID0gb2JqZWN0X25hbWUoY3VscHJpdCk7CisKKyAgICAvL2dpYnQgZXMgZWluZW4gVEkvVFA/IE5hbWUgbWl0IGVyZmFzc2VuCisgICAgbWl4ZWQgdGllbnY7CisgICAgaWYob2JqZWN0cCh0aGlzX2ludGVyYWN0aXZlKCkpKQorICAgIHsKKyAgICAgICAgaXNzdWUtPnRpdHA9Z2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSk7CisgICAgICAgIHRpZW52PWVudmlyb25tZW50KHRoaXNfaW50ZXJhY3RpdmUoKSk7CisgICAgfQorICAgIGVsc2UgaWYgKG9iamVjdHAoUEwpICYmIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoUEwpKQorICAgIHsKKyAgICAgICAgaXNzdWUtPnRpdHA9Z2V0dWlkKFBMKTsKKyAgICAgICAgdGllbnY9ZW52aXJvbm1lbnQoUEwpOworICAgIH0KKyAgICBlbHNlIGlmIChvYmplY3RwKFBMKSkKKyAgICB7CisgICAgICAgIGlzc3VlLT50aXRwPW9iamVjdF9uYW1lKFBMKTsKKyAgICAgICAgdGllbnY9ZW52aXJvbm1lbnQoUEwpOworICAgIH0KKyAgICBpZiAob2JqZWN0cCh0aWVudikpCisgICAgICAgIGlzc3VlLT50aWVudj1vYmplY3RfbmFtZSh0aWVudik7CisKKyAgICAvLyBNYWwgc2NoYXVlbiwgb2IgZGVyIENvbW1hbmRzdGFjayBhdWNoIHdhcyBmdWVyIHVucyBoYXQuIDstKQorICAgIG1peGVkIGNsaTsKKyAgICBpZiAocG9pbnRlcnAoY2xpPWNvbW1hbmRfc3RhY2soKSkgJiYgc2l6ZW9mKGNsaSkpCisgICAgeworICAgICAgICBpc3N1ZS0+dmVyYj1jbGlbMF1bQ01EX1ZFUkJdOworICAgICAgICBpc3N1ZS0+Y29tbWFuZD1jbGlbMF1bQ01EX1RFWFRdOworICAgIH0KKworICAgIC8vc3RhY2t0cmFjZSBob2xlbgorICAgIG1peGVkIHN0YWNrdHJhY2U7CisgICAgaWYgKGNhdWdodCkKKyAgICAgICAgc3RhY2t0cmFjZT1kZWJ1Z19pbmZvKERJTkZPX1RSQUNFLERJVF9FUlJPUik7CisgICAgZWxzZQorICAgICAgICBzdGFja3RyYWNlPWRlYnVnX2luZm8oRElORk9fVFJBQ0UsRElUX1VOQ0FVR0hUX0VSUk9SKTsKKyAgICAvLyBndWVsdGlnZSBTdGFja3RyYWNlcyBoYWJlbiBtaW4uIDIgRWxlbWVudGUuCisgICAgLy8gKGxlZXJlciBUcmFjZTogKHsiTm8gdHJhY2UuIn0pKQorICAgIGlmIChzaXplb2Yoc3RhY2t0cmFjZSkgPiAxKQorICAgIHsKKyAgICAgIGludCBpOworICAgICAgaXNzdWUtPnN0YWNrID0gYWxsb2NhdGUoc2l6ZW9mKHN0YWNrdHJhY2UpLTEpOworICAgICAgLy8gZXJzdGVzIEVsZW1lbnQgaXN0IDAgb2RlciBIQi1PYmpla3Q6IGtlaW4gZnJhbWUsIGRhaGVyIHVlYmVyc3ByaW5nZW4KKyAgICAgIGZvcmVhY2gobWl4ZWQgZW50cnkgOiBzdGFja3RyYWNlWzEuLl0pCisgICAgICB7CisgICAgICAgIC8vIGZyYW1lLT5pZCB3aWxsIGJlIHNldCBsYXRlciBieSBkYl9pbnNlcnRfaXNzdWUoKS4KKyAgICAgICAgc3RydWN0IGZyYW1lX3MgZnJhbWUgPSAoPGZyYW1lX3M+IHR5cGUgOiBlbnRyeVtUUkFDRV9UWVBFXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICBlbnRyeVtUUkFDRV9OQU1FXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2c6ICBlbnRyeVtUUkFDRV9QUk9HUkFNXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iajogICBlbnRyeVtUUkFDRV9PQkpFQ1RdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jOiAgIGVudHJ5W1RSQUNFX0xPQ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWNrczogZW50cnlbVFJBQ0VfRVZBTENPU1RdKTsKKyAgICAgICAgaXNzdWUtPnN0YWNrW2ldID0gZnJhbWU7CisgICAgICAgICsraTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpc3N1ZS0+aWQgPSBkYl9pbnNlcnRfaXNzdWUoaXNzdWUpOworCisgICAgbGFzdGVycm9yW1RfUlRFUlJPUl09aXNzdWUtPmlkOworCisgICAgLy8gRXZlbnQgdHJpZ2dlcm4sIGFiZXIgbnVyIGVpbmUgVGVpbG1lbmdlIGRlciBEYXRlbiBkaXJla3QgbWl0bGllZmVybi4KKyAgICBFVkVOVEQtPlRyaWdnZXJFdmVudChFVlRfTElCX05FV19FUlJPUiwKKyAgICAgICAgICAgICAgKFsgRl9UWVBFOiBUX1JURVJST1IsIEZfSEFTSEtFWTogaXNzdWUtPmhhc2hrZXksIEZfVUlEOgorICAgICAgICAgICAgICAgaXNzdWUtPnVpZCwgRl9JRDogaXNzdWUtPmlkIF0pKTsKKworLy8gICAgREVCVUcoc3ByaW50ZigiTG9nRXJyb3I6IEZlaGxlcmVpbnRyYWc6XG4lT1xuIiwKKy8vICAgICAgICAgIGVycm9yc1t1aWRdW2hhc2hrZXldKSk7CisvLyAgICBERUJVRyhzcHJpbnRmKCJMb2dFcnJvcjogVmVyYnJhdWNodGUgVGlja3M6ICVkXG4iLAorLy8gICAgICAgICAgMjAwMDAwLWdldF9ldmFsX2Nvc3QoKSkpOworICAgIHJldHVybiBpc3N1ZS0+aWQ7Cit9CisKKy8vV2FybnVuZ2VuIHJlZ2lzdHJpZXJlbgorLy9EaWVzZSBGdW5rdGlvbiBkYXJmIG5pY2h0IG1laHIgYWxzIDIwMGsgVGlja3MgdmVyYnJhdWNoZW4gdW5kIHdpcmQgbnVyIHZvbQorLy9NYXN0ZXIgZ2VydWZlbiEKK3B1YmxpYyBpbnQgTG9nV2FybmluZyhzdHJpbmcgbXNnLHN0cmluZyBwcmcsc3RyaW5nIGN1cm9iaixpbnQgbGluZSwgaW50IGluX2NhdGNoKQoreworICAgIC8vREVCVUcoc3ByaW50ZigiTG9nV2FybmluZzogUHJvZzogJU8sIE9iajogJU8sXG4iLHByZyxjdXJvYmopKTsKKworICAgIC8vZGFyZiBudXIgdm9tIE1hc3RlciBnZXJ1ZmVuIHdlcmRlbgorICAgIGlmICghZXh0ZXJuX2NhbGwoKSB8fCAKKyAgICAgICAgKHByZXZpb3VzX29iamVjdCgpICYmIHByZXZpb3VzX29iamVjdCgpICE9IG1hc3RlcigpKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzdHJ1Y3QgZnVsbGlzc3VlX3MgaXNzdWUgPSAoPGZ1bGxpc3N1ZV9zPik7CisKKyAgICAvL1VJRCBiZXN0aW1tZW4KKyAgICBpc3N1ZS0+dWlkPShzdHJpbmcpbWFzdGVyKCktPmNyZWF0b3JfZmlsZShjdXJvYmopOworICAgIC8vREVCVUcoc3ByaW50ZigiTG9nV2FybmluZyBVSUQ6ICVzXG4iLHVpZCkpOworCisgICAgLy9Mb2FkbmFtZSAoYmVzc2VyIGFscyBCUCwgZmFsbHMgcmVuYW1lX29iamVjdCgpIGJlbnV0enQgd3VyZGUpIGJlc3RpbW1lbgorICAgIGlmICghc3RyaW5ncChjdXJvYmopIHx8ICFzaXplb2YoY3Vyb2JqKSkKKyAgICAgICAgaXNzdWUtPmxvYWRuYW1lID0gY3Vyb2JqID0gIjxVbmJla2FubnQ+IjsKKyAgICBlbHNlCisgICAgeworICAgICAgICAvL2xvYWRfbmFtZSBuaW1tdCBTdHJpbmdzIHVuZCBPYmplY3RzIHVuZCBrb25zdHJ1aWVydCBkZW4gbG9hZG5hbWUsCisgICAgICAgIC8vd2llIGVyIHNlaW4gc29sbHRlLCB3ZW5uIGRhcyBPYmpla3QgbmljaHQgbWVociBleGlzdGllcnQuCisgICAgICAgIGlzc3VlLT5sb2FkbmFtZT1sb2FkX25hbWUoY3Vyb2JqKTsKKyAgICB9CisKKyAgICBpZiAoIXN0cmluZ3AoaXNzdWUtPmxvYWRuYW1lKSkKKyAgICAgICAgLy9oaWVyIHNvbGx0ZSBtYW4gcmVpbmtvbW1lbiwgZmFsbHMgY3Vyb2JqIGVpbiAna2FwdXR0ZXInIE5hbWUgaXN0LAorICAgICAgICAvL2QuaC4gbG9hZF9uYW1lKCkgMCBsaWVmZXJ0LgorICAgICAgICBpc3N1ZS0+bG9hZG5hbWU9IjxJbGxlZ2FsIG9iamVjdCBuYW1lPiI7CisKKyAgICAvLyBwcmcgdW5kIGN1cm9iaiBhdWYgYWJzLiBQZmFkZSBub3JtYWxpc2llcmVuLgorICAgIGlmIChzdHJpbmdwKHByZykpCisgICAgICAgIGlzc3VlLT5wcm9nPWxvYWRfbmFtZShwcmcpOworICAgIGlmIChzdHJpbmdwKGN1cm9iaikgJiYgY3Vyb2JqWzBdIT0nLycpCisgICAgeworICAgICAgY3Vyb2JqPSIvIitjdXJvYmo7CisgICAgfQorCisgICAgLy9ERUJVRyhzcHJpbnRmKCJMb2dXYXJuaW5nOiBPQko6ICVzLCBCUDogJXNcbiIsY3Vyb2JqLGJsdWUpKTsKKworICAgIC8vIFdlbm4gY3Vyb2JqIGluIC9wbGF5ZXJzLyBsaWVndCwgZXMgZWluZW4gVEkgZ2lidCwgd2VsY2hlciBlaW4gTWFnaWVyCisgICAgLy8gaXN0IHVuZCBkaWVzZXIgZGllIFByb3AgUF9ET05UX0xPR19FUlJPUlMgZ2VzZXR6dCBoYXQsIHdpcmQgZGVyIEZFaGxlcgorICAgIC8vIG5pY2h0IGdlc3BlaWNoZXJ0LgorICAgIGlmICh0aGlzX2ludGVyYWN0aXZlKCkgJiYgSVNfTEVBUk5FUih0aGlzX2ludGVyYWN0aXZlKCkpCisgICAgICAgICYmIHN0cnN0cihpc3N1ZS0+bG9hZG5hbWUsV0laQVJERElSKT09MAorICAgICAgICAmJiB0aGlzX2ludGVyYWN0aXZlKCktPlF1ZXJ5UHJvcChQX0RPTlRfTE9HX0VSUk9SUykpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy9IYXNoa2V5IGJlc3RpbW1lbiwgVHlwLCBOYW1lIGRlciBCbHVlcHJpbnQgZGVzIGJ1Z2dlbmRlbiBPYmpla3RzLCBQcm9ncmFtbQorICAgIC8vWmVpbGVubnIuLCBXYXJudW5nc21lbGR1bmcKKyAgICBpc3N1ZS0+aGFzaGtleT1oYXNoKFRMU19IQVNIX01ENSwKKyAgICAgICAgc3ByaW50ZigiJWQlcyVzJWQlcyIsIFRfUlRXQVJOLCBpc3N1ZS0+bG9hZG5hbWUsIGlzc3VlLT5wcm9nLCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnKSk7CisgICAgLy9ERUJVRyhzcHJpbnRmKCJMb2dXYXJuaW5nOiBIYXNoa2V5OiAlcyIsaGFzaGtleSkpOworCisKKyAgICAvLyBnZ2YuIHZvcmhhbmRlbmVuIEZlaGxlciBzdWNoZW4KKyAgICBpbnQgb2xkaWQgPSBnZXRFcnJvcklEKGlzc3VlLT5oYXNoa2V5KTsKKyAgICBpZiAob2xkaWQgPj0gMCkKKyAgICB7CisgICAgICBkYl9yZW9wZW5faXNzdWUob2xkaWQsICI8RXJyb3JEPiIsCisgICAgICAgICAgICAgICAgICAgICAgIkF1dG9tYXRpc2NoIHdpZWRlcmVyb2VmZm5ldCB3ZWdlbiBlcm5ldXRlbSBBdWZ0cmV0ZW4uIik7CisgICAgICBkYl9jb3VudHVwX2lzc3VlKG9sZGlkKTsKKyAgICAgIHJldHVybiBvbGRpZDsKKyAgICB9CisKKyAgICAvL3NvbnN0IGZ1ZWdlbiB3aXIgZWluZW4gbmV1ZW4gRWludHJhZyBoaW56dQorICAgIC8vIGVyc3RtYWwgdmVydm9sbHN0YWVuZGlnZW4KKyAgICBpc3N1ZS0+b2JqID0gY3Vyb2JqOworICAgIGlzc3VlLT5tZXNzYWdlID0gbXNnOworICAgIGlzc3VlLT5jdGltZSA9IGlzc3VlLT5tdGltZSA9IGlzc3VlLT5hdGltZSA9IHRpbWUoKTsKKyAgICBpc3N1ZS0+bG9jID0gbGluZTsKKyAgICBpc3N1ZS0+Y291bnQgPSAxOworICAgIGlzc3VlLT50eXBlID0gVF9SVFdBUk47CisgICAgaXNzdWUtPmNhdWdodCA9IGluX2NhdGNoOworCisgICAgLy9naWJ0IGVzIGVpbmVuIFRJL1RQPyBOYW1lIG1pdCBlcmZhc3NlbgorICAgIG1peGVkIHRpZW52OworICAgIGlmKG9iamVjdHAodGhpc19pbnRlcmFjdGl2ZSgpKSkKKyAgICB7CisgICAgICAgIGlzc3VlLT50aXRwPWdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpOworICAgICAgICB0aWVudj1lbnZpcm9ubWVudCh0aGlzX2ludGVyYWN0aXZlKCkpOworICAgIH0KKyAgICBlbHNlIGlmIChvYmplY3RwKFBMKSAmJiBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKFBMKSkKKyAgICB7CisgICAgICAgIGlzc3VlLT50aXRwPWdldHVpZChQTCk7CisgICAgICAgIHRpZW52PWVudmlyb25tZW50KFBMKTsKKyAgICB9CisgICAgZWxzZSBpZiAob2JqZWN0cChQTCkpCisgICAgeworICAgICAgICBpc3N1ZS0+dGl0cD1vYmplY3RfbmFtZShQTCk7CisgICAgICAgIHRpZW52PWVudmlyb25tZW50KFBMKTsKKyAgICB9CisgICAgaWYgKG9iamVjdHAodGllbnYpKQorICAgICAgICBpc3N1ZS0+dGllbnY9b2JqZWN0X25hbWUodGllbnYpOworCisgICAgLy8gTWFsIHNjaGF1ZW4sIG9iIGRlciBDb21tYW5kc3RhY2sgYXVjaCB3YXMgZnVlciB1bnMgaGF0LiA7LSkKKyAgICBtaXhlZCBjbGk7CisgICAgaWYgKHBvaW50ZXJwKGNsaT1jb21tYW5kX3N0YWNrKCkpICYmIHNpemVvZihjbGkpKQorICAgIHsKKyAgICAgICAgaXNzdWUtPnZlcmI9Y2xpWzBdW0NNRF9WRVJCXTsKKyAgICAgICAgaXNzdWUtPmNvbW1hbmQ9Y2xpWzBdW0NNRF9URVhUXTsKKyAgICB9CisKKyAgICBpc3N1ZS0+aWQgPSBkYl9pbnNlcnRfaXNzdWUoaXNzdWUpOworCisgICAgbGFzdGVycm9yW1RfUlRXQVJOXT1pc3N1ZS0+aWQ7CisgICAgLy8gRXZlbnQgdHJpZ2dlcm4sIGFiZXIgbnVyIGVpbmUgVGVpbG1lbmdlIGRlciBEYXRlbiBkaXJla3QgbWl0bGllZmVybi4KKyAgICBFVkVOVEQtPlRyaWdnZXJFdmVudChFVlRfTElCX05FV19FUlJPUiwKKyAgICAgICAgKFtGX1RZUEU6IGlzc3VlLT50eXBlLCBGX0lEOiBpc3N1ZS0+aWQsCisgICAgICAgICAgRl9VSUQ6IGlzc3VlLT51aWQsIEZfSEFTSEtFWTogaXNzdWUtPmhhc2hrZXldKSApOworCisvLyAgICBERUJVRyhzcHJpbnRmKCJMb2dXYXJuaW5nOiBXYXJudW5nc2VpbnRyYWc6XG4lT1xuIiwKKy8vICAgICAgICAgIHdhcm5pbmdzW3VpZF1baGFzaGtleV0pKTsKKy8vICAgIERFQlVHKHNwcmludGYoIkxvZ1dhcm5pbmc6IFZlcmJyYXVjaHRlIFRpY2tzOiAlZFxuIiwKKy8vICAgICAgICAgIDIwMDAwMC1nZXRfZXZhbF9jb3N0KCkpKTsKKyAgICByZXR1cm4gaXNzdWUtPmlkOworfQorCisvL1dhcm51bmdlbiB1bmQgRmVobGVyIGJlaW0gS29tcGlsaWVyZW4gIHJlZ2lzdHJpZXJlbgorLy9EaWVzZSBGdW5rdGlvbiBkYXJmIG5pY2h0IG1laHIgYWxzIDIwMGsgVGlja3MgdmVyYnJhdWNoZW4gdW5kIHdpcmQgbnVyIHZvbQorLy9NYXN0ZXIgZ2VydWZlbiEKK3B1YmxpYyBpbnQgTG9nQ29tcGlsZVByb2JsZW0oc3RyaW5nIGZpbGUsc3RyaW5nIG1zZyxpbnQgd2FybikgeworCisgICAgLy9ERUJVRyhzcHJpbnRmKCJMb2dDb21waWxlUHJvYmxlbTogUHJvZzogJU8sIE9iajogJU8sXG4iLGZpbGUsbXNnKSk7CisKKyAgICAvL2RhcmYgbnVyIHZvbSBNYXN0ZXIgZ2VydWZlbiB3ZXJkZW4KKyAgICBpZiAoIWV4dGVybl9jYWxsKCkgfHwgCisgICAgICAgIChwcmV2aW91c19vYmplY3QoKSAmJiBwcmV2aW91c19vYmplY3QoKSAhPSBtYXN0ZXIoKSkpCisgICAgICAgIHJldHVybiAwOworCisgICAgc3RydWN0IGZ1bGxpc3N1ZV9zIGlzc3VlID0gKDxmdWxsaXNzdWVfcz4pOworCisgICAgLy9VSUQgYmVzdGltbWVuCisgICAgaXNzdWUtPnVpZD0oc3RyaW5nKW1hc3RlcigpLT5jcmVhdG9yX2ZpbGUoZmlsZSk7CisgICAgLy9ERUJVRyhzcHJpbnRmKCJMb2dDb21waWxlUHJvYmxlbSBVSUQ6ICVzXG4iLHVpZCkpOworCisgICAgLy8gQW4gRmlsZSBhKSBmdWVocmVuZGVuIC8gYW5oYWVuZ2VuIHVuZCBiKSBlbmRlbmRlcyAuYyBhYnNjaG5laWRlbi4gTWFjaHQKKyAgICAvLyBiZWlkZXMgbmV0dGVyd2Vpc2UgbG9hZF9uYW1lKCkuCisgICAgaXNzdWUtPmxvYWRuYW1lID0gbG9hZF9uYW1lKGZpbGUpOworICAgIGlzc3VlLT50eXBlID0gd2FybiA/IFRfQ1RXQVJOIDogVF9DVEVSUk9SOworCisgICAgLy9sb2dnZW4gd2lyIGZ1ZXIgZGFzIEZpbGUgdWViZXJoYXVwdD8KKyAgICBpZiAobWVtYmVyKEJMQUNLTElTVCxleHBsb2RlKGlzc3VlLT5sb2FkbmFtZSwiLyIpWzwxXSk+PTApCisgICAgICAgIHJldHVybiAwOworCisgICAgLy9IYXNoa2V5IGJlc3RpbW1lbiwgaW4gZGllc2VtIEZhbGwgZWluZmFjaCwgd2lyIGtvZW5uZW4gZGllCisgICAgLy9GZWhsZXJtZWxkdW5nZSBzZWxiZXIgbmVobWVuLgorICAgIGlzc3VlLT5oYXNoa2V5PWhhc2goVExTX0hBU0hfTUQ1LHNwcmludGYoCisgICAgICAgICAgIiVkJXMlcyIsaXNzdWUtPnR5cGUsaXNzdWUtPmxvYWRuYW1lLCBtc2cpKTsKKyAgICAvL0RFQlVHKHNwcmludGYoIkxvZ0NvbXBpbGVQcm9ibGVtOiBIYXNoa2V5OiAlcyIsaGFzaGtleSkpOworCisgICAgLy8gZ2dmLiB2b3JoYW5kZW5lbiBGZWhsZXIgc3VjaGVuCisgICAgaW50IG9sZGlkID0gZ2V0RXJyb3JJRChpc3N1ZS0+aGFzaGtleSk7CisgICAgaWYgKG9sZGlkID49IDApCisgICAgeworICAgICAgZGJfcmVvcGVuX2lzc3VlKG9sZGlkLCAiPEVycm9yRD4iLAorICAgICAgICAgICAgICAgICAgICAgICJBdXRvbWF0aXNjaCB3aWVkZXJlcm9lZmZuZXQgd2VnZW4gZXJuZXV0ZW0gQXVmdHJldGVuLiIpOworICAgICAgZGJfY291bnR1cF9pc3N1ZShvbGRpZCk7CisgICAgICByZXR1cm4gb2xkaWQ7CisgICAgfQorCisgICAgLy8gbmV1ZW4gRWludHJhZworICAgIGlzc3VlLT5tZXNzYWdlID0gbXNnOworICAgIGlzc3VlLT5jb3VudCA9IDE7CisgICAgaXNzdWUtPmN0aW1lID0gaXNzdWUtPm10aW1lID0gaXNzdWUtPmF0aW1lID0gdGltZSgpOworCisgICAgaXNzdWUtPmlkID0gZGJfaW5zZXJ0X2lzc3VlKGlzc3VlKTsKKworICAgIGlmICh3YXJuKSBsYXN0ZXJyb3JbVF9DVFdBUk5dPWlzc3VlLT5pZDsKKyAgICBlbHNlIGxhc3RlcnJvcltUX0NURVJST1JdPWlzc3VlLT5pZDsKKworLy8gICAgREVCVUcoc3ByaW50ZigiTG9nQ29tcGlsZVByb2JsZW06IEVpbnRyYWc6XG4lT1xuIiwKKy8vICAgICAgICAgICh3YXJuID8gY3R3YXJuaW5nc1t1aWRdW2hhc2hrZXldIDogY3RlcnJvcnNbdWlkXVtoYXNoa2V5XSkpKTsKKy8vICAgREVCVUcoc3ByaW50ZigiTG9nQ29tcGlsZVByb2JsZW06IFZlcmJyYXVjaHRlIFRpY2tzOiAlZFxuIiwKKy8vICAgICAgICAgIDIwMDAwMC1nZXRfZXZhbF9jb3N0KCkpKTsKKyAgIHJldHVybiBpc3N1ZS0+aWQ7Cit9CisKKy8qICoqKioqKioqKioqKioqKiogIFB1YmxpYyBJbnRlcmZhY2UgKioqKioqKioqKioqKioqKioqICovCisKKy8vRWluZW4gYmVzdGltbXRlbiBGZWhsZXIgbmFjaCBIYXNoa2V5IHN1Y2hlbiB1bmQgYWxzIGZ1bGxpc3N1ZV9zIGlua2wuIE5vdGVzCisvL3VuZCBTdGFja3RyYWNlIGxpZWZlcm4uCitzdHJ1Y3QgZnVsbGlzc3VlX3MgUXVlcnlJc3N1ZUJ5SGFzaChzdHJpbmcgaGFzaGtleSkKK3sKKyAgc3RydWN0IGZ1bGxpc3N1ZV9zIGlzc3VlID0gZGJfZ2V0X2lzc3VlKDAsIGhhc2hrZXkpOworICBpZiAoc3RydWN0cChpc3N1ZSkpCisgICAgcmV0dXJuIGZpbHRlcl9wcml2YXRlKGlzc3VlKTsKKyAgcmV0dXJuIDA7Cit9CisvL0VpbmVuIGJlc3RpbW10ZW4gRmVobGVyIG5hY2ggSUQgc3VjaGVuIHVuZCBhbHMgZnVsbGlzc3VlX3MgaW5rbC4gTm90ZXMKKy8vdW5kIFN0YWNrdHJhY2UgbGllZmVybi4KK3N0cnVjdCBmdWxsaXNzdWVfcyBRdWVyeUlzc3VlQnlJRChpbnQgaXNzdWVpZCkKK3sKKyAgc3RydWN0IGZ1bGxpc3N1ZV9zIGlzc3VlID0gZGJfZ2V0X2lzc3VlKGlzc3VlaWQsIDApOworICBpZiAoc3RydWN0cChpc3N1ZSkpCisgICAgcmV0dXJuIGZpbHRlcl9wcml2YXRlKGlzc3VlKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vIGRlbiBsZXR6dGVuIEVpbnRyYWcgZGVuIGpld2VpbGlnZW4gVHlwIGxpZWZlcm4uCitzdHJ1Y3QgZnVsbGlzc3VlX3MgUXVlcnlMYXN0SXNzdWUoaW50IHR5cGUpCit7CisgICAgaWYgKCFtZW1iZXIobGFzdGVycm9yLHR5cGUpKQorICAgICAgICByZXR1cm4gMDsKKyAgICAvL2VpbmZhY2ggZGVuIGtvbXBsZXR0ZW4gbGV0enRlbiBFaW50cmFnIHp1cnVlY2tsaWVmZXJuCisgICAgcmV0dXJuKFF1ZXJ5SXNzdWVCeUlEKGxhc3RlcnJvclt0eXBlXSkpOworfQorCisvLyBMaWVmZXJ0IGFsbGUgSXNzdWVzLCBkZXJlbiBvYmoscHJvZyBvZGVyIGxvYWRuYW1lIGdsZWljaCA8ZmlsZT4gaXN0LgorcHVibGljIHN0cnVjdCBmdWxsaXNzdWVfcyogUXVlcnlJc3N1ZXNCeUZpbGUoc3RyaW5nIGZpbGUsIGludCB0eXBlKQoreworICBtaXhlZCByb3dzID0gc2xfZXhlYygiU0VMRUNUICogRlJPTSBpc3N1ZXMgIgorICAgICAgICAgICAgICAgICAgICAgICAiV0hFUkUgKGxvYWRuYW1lPT8xIE9SIHByb2c9PzEgT1Igb2JqPT8xKSAiCisgICAgICAgICAgICAgICAgICAgICAgICJBTkQgZGVsZXRlZD0wIEFORCByZXNvbHZlZD0wIEFORCB0eXBlPT8yIgorICAgICAgICAgICAgICAgICAgICAgICAiT1JERVIgQlkgdHlwZSxtdGltZTsiLCBmaWxlLCB0eXBlKTsKKyAgaWYgKHBvaW50ZXJwKHJvd3MpKQorICB7CisgICAgc3RydWN0IGZ1bGxpc3N1ZV9zKiBpbGlzdCA9IGFsbG9jYXRlKHNpemVvZihyb3dzKSk7CisgICAgaW50IGk7CisgICAgZm9yZWFjaChtaXhlZCByb3cgOiByb3dzKQorICAgIHsKKyAgICAgIC8vIEVpbmZhY2hzdGVyIFdlZyAtIGZ1bmt0aW9uaWVydCBhYmVyIG51ciwgc29sYW5nZSBkaWUgRmVsZGVyIGluIGRlciBEQgorICAgICAgLy8gZGllIGdsZWljaGUgUmVpaGVuZm9sZ2Ugd2llIGluIGRlciBzdHJ1Y3QgaGFiZW4hIEVudHdlZGVyIGltbWVyCisgICAgICAvLyBzaWNoZXJzdGVsbGVuIG9kZXIgRXJnZWJuaXNyZWloZW5mb2xnZSBvYmVuIGltIHNlbGVjdCBmZXN0bGVnZW4hCisgICAgICBzdHJ1Y3QgZnVsbGlzc3VlX3MgaXNzdWUgPSB0b19zdHJ1Y3QoIHJvdywgKDxmdWxsaXNzdWVfcz4pICk7CisgICAgICBpZiAoaXNzdWUtPnR5cGUgPT0gVF9SVEVSUk9SKQorICAgICAgICAgIGlzc3VlLT5zdGFjayA9IGRiX2dldF9zdGFjayhpc3N1ZS0+aWQpOworICAgICAgaXNzdWUtPm5vdGVzID0gZGJfZ2V0X25vdGVzKGlzc3VlLT5pZCk7CisgICAgICBpbGlzdFtpXSA9IGZpbHRlcl9wcml2YXRlKGlzc3VlKTsKKyAgICAgICsraTsKKyAgICB9CisgICAgcmV0dXJuIGlsaXN0OworICB9CisgIHJldHVybiAwOworfQorCisvLyBMaWVmZXJ0IGVpbmUgTGlzdGUgdm9uIGFsbGVuIElEcywgTG9hZG5hbWVzLCBVSURzIHVuZCBUeXBlbiBmdWVyIGRpZQorLy8gYW5nZWJlbmVuIDx0eXBlPiB1bmQgPHVpZD4uCit2YXJhcmdzIDwgPGludHxzdHJpbmc+KiA+KiBRdWVyeUlzc3VlTGlzdEJ5RmlsZShzdHJpbmcgZmlsZSkKK3sKKyAgbWl4ZWQgcm93cyA9IHNsX2V4ZWMoIlNFTEVDVCBpZCxsb2FkbmFtZSxvYmoscHJvZyxsb2MgRlJPTSBpc3N1ZXMgIgorICAgICAgICAgICAgICAgICAgICAgICAiV0hFUkUgKGxvYWRuYW1lPT8xIE9SIHByb2c9PzEgT1Igb2JqPT8xKSAiCisgICAgICAgICAgICAgICAgICAgICAgICJBTkQgZGVsZXRlZD0wIEFORCByZXNvbHZlZD0wICIKKyAgICAgICAgICAgICAgICAgICAgICAgIk9SREVSIEJZIHR5cGUsbXRpbWU7IiwgZmlsZSk7CisgIHJldHVybiByb3dzOworfQorCisvLyBMaWVmZXJ0IGVpbmUgTGlzdGUgdm9uIGFsbGVuIElEcywgTG9hZG5hbWVzLCBVSURzIHVuZCBUeXBlbiBmdWVyIGRpZQorLy8gYW5nZWJlbmVuIDx0eXBlPiB1bmQgPHVpZD4uCit2YXJhcmdzIDwgPGludHxzdHJpbmc+KiA+KiBRdWVyeUlzc3VlTGlzdEJ5TG9hZG5hbWUoc3RyaW5nIGZpbGUsIGludCB0eXBlKQoreworICBtaXhlZCByb3dzOworICBpZiAodHlwZSAmJiBmaWxlKQorICB7CisgICAgIHJvd3MgPSBzbF9leGVjKCJTRUxFQ1QgaWQsbG9hZG5hbWUsdWlkLHR5cGUgRlJPTSBpc3N1ZXMgIgorICAgICAgICAgICAgICAgICAgICAgICAiV0hFUkUgbG9hZG5hbWU9PzEgQU5EIHR5cGU9PzIgQU5EIGRlbGV0ZWQ9MCAiCisgICAgICAgICAgICAgICAgICAgICAgICJBTkQgcmVzb2x2ZWQ9MCAiCisgICAgICAgICAgICAgICAgICAgICAgICJPUkRFUiBCWSB0eXBlLG10aW1lOyIsIGZpbGUsIHR5cGUpOworICB9CisgIGVsc2UgaWYgKHR5cGUpCisgIHsKKyAgICAgcm93cyA9IHNsX2V4ZWMoIlNFTEVDVCBpZCxsb2FkbmFtZSx1aWQsdHlwZSBGUk9NIGlzc3VlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICJXSEVSRSB0eXBlPT8xIEFORCBkZWxldGVkPTAgQU5EIHJlc29sdmVkPTAgIgorICAgICAgICAgICAgICAgICAgICAgICAiT1JERVIgQlkgdHlwZSxtdGltZTsiLCB0eXBlKTsKKyAgfQorICBlbHNlIGlmIChmaWxlKQorICB7CisgICAgcm93cyA9IHNsX2V4ZWMoIlNFTEVDVCBpZCxsb2FkbmFtZSx1aWQsdHlwZSBGUk9NIGlzc3VlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICJXSEVSRSBsb2FkbmFtZT0/MSBBTkQgZGVsZXRlZD0wIEFORCByZXNvbHZlZD0wICIKKyAgICAgICAgICAgICAgICAgICAgICAgIk9SREVSIEJZIHR5cGUsbXRpbWU7IiwgZmlsZSk7CisgIH0KKyAgcmV0dXJuIHJvd3M7Cit9CisKKworLy8gTGllZmVydCBlaW5lIExpc3RlIHZvbiBhbGxlbiBJRHMsIExvYWRuYW1lcywgVUlEcyB1bmQgVHlwZW4gZnVlciBkaWUKKy8vIGFuZ2ViZW5lbiA8dHlwZT4gdW5kIDx1aWQ+LgordmFyYXJncyA8IDxpbnR8c3RyaW5nPiogPiogUXVlcnlJc3N1ZUxpc3QoaW50IHR5cGUsIHN0cmluZyB1aWQpCit7CisgIG1peGVkIHJvd3M7CisgIGlmICh0eXBlICYmIHVpZCkKKyAgeworICAgIHJvd3MgPSBzbF9leGVjKCJTRUxFQ1QgaWQsbG9hZG5hbWUsdWlkLHR5cGUgRlJPTSBpc3N1ZXMgIgorICAgICAgICAgICAgICAgICAgICJXSEVSRSB0eXBlPT8xIEFORCB1aWQ9PzIgQU5EIGRlbGV0ZWQ9MCAiCisgICAgICAgICAgICAgICAgICAgIkFORCByZXNvbHZlZD0wICIKKyAgICAgICAgICAgICAgICAgICAiT1JERVIgQlkgdHlwZSxyb3dpZDsiLCB0eXBlLHVpZCk7CisgIH0KKyAgZWxzZSBpZiAodHlwZSkKKyAgeworICAgIHJvd3MgPSBzbF9leGVjKCJTRUxFQ1QgaWQsbG9hZG5hbWUsdWlkLHR5cGUgRlJPTSBpc3N1ZXMgIgorICAgICAgICAgICAgICAgICAgICJXSEVSRSB0eXBlPT8xIEFORCBkZWxldGVkPTAgQU5EIHJlc29sdmVkPTAgIgorICAgICAgICAgICAgICAgICAgICJPUkRFUiBCWSB0eXBlLHJvd2lkOyIsIHR5cGUpOworICB9CisgIGVsc2UgaWYgKHVpZCkKKyAgeworICAgIHJvd3MgPSBzbF9leGVjKCJTRUxFQ1QgaWQsbG9hZG5hbWUsdWlkLHR5cGUgRlJPTSBpc3N1ZXMgIgorICAgICAgICAgICAgICAgICAgICJXSEVSRSB1aWQ9PzEgQU5EIGRlbGV0ZWQ9MCBBTkQgcmVzb2x2ZWQ9MCAiCisgICAgICAgICAgICAgICAgICAgIk9SREVSIEJZIHR5cGUscm93aWQ7IiwgdWlkKTsKKyAgfQorICByZXR1cm4gcm93czsKK30KKwordmFyYXJncyBzdHJpbmcqIFF1ZXJ5VUlEc0ZvclR5cGUoaW50IHR5cGUpIHsKKyAgICAvL2xpZWZlcnQgYWxsZSBVSURzIGZ1ZXIgZWluZW4gRmVobGVydHlwIG9kZXIgZnVlciBhbGxlIEZlaGxlcnR5cGVuCisgICAgc3RyaW5nKiogcm93czsKKworICAgIGlmICh0eXBlKQorICAgIHsKKyAgICAgIHJvd3MgPSBzbF9leGVjKCJTRUxFQ1QgdWlkIEZST00gaXNzdWVzICIKKyAgICAgICAgICAgICAgICAgICAgICJXSEVSRSB0eXBlPT8xIEFORCBkZWxldGVkPTAgQU5EIHJlc3ZvbGVkPTA7IiwgdHlwZSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHJvd3MgPSBzbF9leGVjKCJTRUxFQ1QgdWlkIEZST00gaXNzdWVzIFdIRVJFIGRlbGV0ZWQ9MCAiCisgICAgICAgICAgICAgICAgICAgICAiQU5EIHJlc29sdmVkPTA7Iik7CisKKyAgICByZXR1cm4gbWFwKHJvd3MsIGZ1bmN0aW9uIHN0cmluZyAoc3RyaW5nKiBpdGVtKQorICAgICAgICAgICAgICAgICAgICAge3JldHVybiBpdGVtWzBdO30gKTsKK30KKworLy9XaWV2aWVsZSB1bnRlcnNjaGllZGxpY2hlIEZlaGxlciBpbiBkaWVzZW0gVHlwPwordmFyYXJncyBpbnQgUXVlcnlVbmlxdWVJc3N1ZUNvdW50KGludCB0eXBlLCBzdHJpbmcgdWlkKQoreworICBpbnQqKiByb3dzOworCisgIGlmICh0eXBlICYmIHVpZCkKKyAgeworICAgIHJvd3MgPSBzbF9leGVjKCJTRUxFQ1QgY291bnQoKikgRlJPTSBpc3N1ZXMgIgorICAgICAgICAgICAgICAgICAgICJXSEVSRSB0eXBlPT8xIEFORCB1aWQ9PzIgQU5EIGRlbGV0ZWQ9MCBBTkQgcmVzb2x2ZWQ9MDsiLAorICAgICAgICAgICAgICAgICAgIHR5cGUsIHVpZCk7CisgIH0KKyAgZWxzZSBpZiAodHlwZSkKKyAgeworICAgIHJvd3MgPSBzbF9leGVjKCJTRUxFQ1QgY291bnQoKikgRlJPTSBpc3N1ZXMgIgorICAgICAgICAgICAgICAgICAgICJXSEVSRSB0eXBlPT8xIEFORCBkZWxldGVkPTAgQU5EIHJlc29sdmVkPTA7IiwKKyAgICAgICAgICAgICAgICAgICB0eXBlKTsKKyAgfQorICBlbHNlIGlmICh1aWQpCisgIHsKKyAgICByb3dzID0gc2xfZXhlYygiU0VMRUNUIGNvdW50KCopIEZST00gaXNzdWVzICIKKyAgICAgICAgICAgICAgICAgICAiV0hFUkUgdWlkPT8xIEFORCBkZWxldGVkPTAgQU5EIHJlc29sdmVkPTA7IiwKKyAgICAgICAgICAgICAgICAgICB1aWQpOworICB9CisgIGVsc2UKKyAgICByb3dzID0gc2xfZXhlYygiU0VMRUNUIGNvdW50KCopIEZST00gaXNzdWVzICIKKyAgICAgICAgICAgICAgICAgICAiV0hFUkUgZGVsZXRlZD0wIEFORCByZXNvbHZlZD0wOyIpOworCisgIHJldHVybiByb3dzWzBdWzBdOworfQorCisvL0VpbmVuIGJlc3RpbW10ZW4gRmVobGVyIGxvZXNjaGVuCit2YXJhcmdzIGludCBUb2dnbGVEZWxldGVFcnJvcihpbnQgaXNzdWVpZCwgc3RyaW5nIG5vdGUpCit7CisgIG1peGVkIHJvd3MgPSBzbF9leGVjKCJTRUxFQ1QgdWlkLGRlbGV0ZWQgZnJvbSBpc3N1ZXMgV0hFUkUgaWQ9PzE7IiwKKyAgICAgICAgICAgICAgICAgICAgICAgaXNzdWVpZCk7CisgIGlmICghcG9pbnRlcnAocm93cykpCisgICAgcmV0dXJuIC0xOworICAKKyAgaWYgKCFhY2Nlc3NfY2hlY2socm93c1swXVswXSwgTV9ERUxFVEUpKQorICAgIC8venVncmlmZiB6dW0gU2NocmVpYmVuIG5pY2h0IGdlc3RhdHRldAorICAgIHJldHVybiAtMTA7CisKKy8vICBzbF9leGVjKCJCRUdJTiBUUkFOU0FDVElPTjsiKTsKKyAgaWYgKHJvd3NbMF1bMV0pCisgIHsKKyAgICAvLyB3YXMgZGVsZXRlZCAtPiB1bmRlbGV0ZSBpdAorICAgIHNsX2V4ZWMoIlVQREFURSBpc3N1ZXMgU0VUIGRlbGV0ZWQ9MCxtdGltZT0/MiBXSEVSRSBpZD0/MTsiLAorICAgICAgICAgICAgaXNzdWVpZCx0aW1lKCkpOworICAgIGRiX2FkZF9ub3RlKCg8bm90ZV9zPiBpZDogaXNzdWVpZCwgdGltZTogdGltZSgpLCB1c2VyOiBnZXR1aWQoVEkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0eHQ6IHNwcmludGYoIkxvZXNjaG1hcmtpZXJ1bmcgZW50ZmVybnQuICglcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90ZSA/IG5vdGU6ICI8a2VpbiBLb21tZW50YXI+IikKKyAgICAgICAgICAgICAgICApKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvLyB3YXMgbm90IGRlbGV0ZWQgLT4gZGVsZXRlIGl0LgorICAgIHNsX2V4ZWMoIlVQREFURSBpc3N1ZXMgU0VUIGRlbGV0ZWQ9MSxtdGltZT0/MiBXSEVSRSBpZD0/MTsiLAorICAgICAgICAgICAgaXNzdWVpZCwgdGltZSgpKTsKKyAgICBkYl9hZGRfbm90ZSgoPG5vdGVfcz4gaWQ6IGlzc3VlaWQsIHRpbWU6IHRpbWUoKSwgdXNlcjogZ2V0dWlkKFRJKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHh0OiBzcHJpbnRmKCJMb2VzY2htYXJraWVydW5nIGdlc2V0enQuICglcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90ZSA/IG5vdGU6ICI8a2VpbiBLb21tZW50YXI+IikKKyAgICAgICAgICAgICAgICApKTsKKyAgfQorLy8gIHNsX2V4ZWMoIkNPTU1JVDsiKTsKKyAgcmV0dXJuICFyb3dzWzBdWzFdOworfQorCisKKy8vIHNwZXJydCBkZW4gRWludHJhZyBvZGVyIGVudHNwZXJydCBpaG4uCisvLyBTcGVycmUgaGVpc3N0IGhpZXIsIGRhc3MgZGVyIEZlaGxlciB2b20gRXhwaXJlIG5pY2h0IGF1dG9tYXRpc2NoIGdlbG9lc2NodAorLy8gd2lyZC4KK3ZhcmFyZ3MgaW50IExvY2tJc3N1ZShpbnQgaXNzdWVpZCwgc3RyaW5nIG5vdGUpIHsKKyAgICByZXR1cm4gc2V0X2xvY2soaXNzdWVpZCwgMSwgbm90ZSk7Cit9CisKK3ZhcmFyZ3MgaW50IFVubG9ja0lzc3VlKGludCBpc3N1ZWlkLCBzdHJpbmcgbm90ZSkgeworICAgIHJldHVybiBzZXRfbG9jayhpc3N1ZWlkLCAwLCBub3RlKTsKK30KKworLy8gZWluZW4gRmVobGVyIGFscyBnZWZpeHQgbWFya2llcmVuCit2YXJhcmdzIGludCBSZXNvbHZlSXNzdWUoaW50IGlzc3VlaWQsIHN0cmluZyBub3RlKSB7CisgICAgcmV0dXJuIHNldF9yZXNvbHV0aW9uKGlzc3VlaWQsIDEsIG5vdGUpOworfQorLy8gZWluZW4gRmVobGVyIGFscyBuaWNodCBnZWZpeHQgbWFya2llcmVuCit2YXJhcmdzIGludCBSZU9wZW5Jc3N1ZShpbnQgaXNzdWVpZCwgc3RyaW5nIG5vdGUpIHsKKyAgICByZXR1cm4gc2V0X3Jlc29sdXRpb24oaXNzdWVpZCwgMCwgbm90ZSk7Cit9CisKK3ZhcmFyZ3MgaW50IEFkZE5vdGUoaW50IGlzc3VlaWQsIHN0cmluZyBub3RlKQoreworCisgICAgaWYgKCFzdHJpbmdwKG5vdGUpIHx8ICFzaXplb2Yobm90ZSkpCisgICAgICByZXR1cm4oLTMpOworCisgICAgLy8gZXhpc3RpZXJ0IGRpZSBJRCBpbiBkZXIgREI/CisgICAgc3RydWN0IGZ1bGxpc3N1ZV9zIGlzc3VlID0gZGJfZ2V0X2lzc3VlKGlzc3VlaWQsMCk7CisgICAgaWYgKCFpc3N1ZSkKKyAgICAgIHJldHVybiAtMTsKKworICAgIGlmICghYWNjZXNzX2NoZWNrKGlzc3VlLT51aWQsIE1fV1JJVEUpKQorICAgICAgICAvL3p1Z3JpZmYgenVtIFNjaHJlaWJlbiBuaWNodCBnZXN0YXR0ZXQKKyAgICAgICAgcmV0dXJuKC0xMCk7CisKKyAgICByZXR1cm4gZGJfYWRkX25vdGUoKDxub3RlX3M+IGlkOiBpc3N1ZWlkLCB0aW1lOiB0aW1lKCksIHVzZXI6IGdldHVpZChUSSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eHQ6IG5vdGUpKTsKK30KKworLy9FaW5lbiBiZXN0aW1tdGVuIEZlaGxlciBlaW5lciBhbmRlcmVuIFVJRCB6dXdlaXNlbi4KKy8vSGFzaGtleSBpc3QgendhciBlaW5kZXV0aWcsIGFiZXIgQW5nYWJlIGRlcgorLy9kZXIgVUlEIGlzdCBkZXV0bGljaCBzY2huZWxsZXIuIFdlZ2xhc3NlbiBkZXMgVHlwcyBub2NobWFsIGxhbmdzYW1lci4gOy0pCisvL1BvdGVudGllbGwgYWxzbyBzZWhyIHRldWVyLCB3ZW5uIG1hbiBVSUQgb2RlciBVSUQrVHlwIHdlZ2xhZXNzdC4KK3ZhcmFyZ3MgaW50IFJlYXNzaWduSXNzdWUoaW50IGlzc3VlaWQsIHN0cmluZyBuZXd1aWQsIHN0cmluZyBub3RlKQoreworICAgIHN0cnVjdCBmdWxsaXNzdWVfcyBpc3N1ZSA9IGRiX2dldF9pc3N1ZShpc3N1ZWlkLDApOworICAgIGlmICghaXNzdWUpCisgICAgICByZXR1cm4gLTE7CisKKyAgICBpZiAoIWFjY2Vzc19jaGVjayhpc3N1ZS0+dWlkLCBNX1JFQVNTSUdOKSkKKyAgICAgICAgLy96dWdyaWZmIHp1bSBTY2hyZWliZW4gbmljaHQgZ2VzdGF0dGV0CisgICAgICAgIHJldHVybigtMTApOworCisgICAgcmV0dXJuIGRiX3JlYXNzaWduX2lzc3VlKGlzc3VlaWQsIG5ld3VpZCwgbm90ZSk7Cit9CisKKy8qICoqKioqKioqKioqIEVoZXIgZnVlciBEZWJ1Zy1ad2Vja2UgKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qCittaXhlZCBRdWVyeUFsbChpbnQgdHlwZSkgeworICAgIC8vZGFzIGtvZW5udGUgZWluIHNlaHIgc2VociBncm9zc2VzIE1hcHBpbmcgc2VpbiwgYXVzc2VyZGVtIHdpcmQga2VpbmUKKyAgICAvL0tvcGllIHp1cnVlY2tnZWdlYmVuLCBkYWhlciBlcnN0bWFsIG51ciBpY2guLi4KKyAgICBpZiAoIXRoaXNfaW50ZXJhY3RpdmUoKSB8fCAKKyAgICAgICAgbWVtYmVyKE1BSU5UQUlORVIsZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSkpPDApCisgICAgICAgIHJldHVybigtMSk7CisgICAgaWYgKHByb2Nlc3NfY2FsbCgpKSByZXR1cm4oLTIpOworICAgIGlmICghdHlwZSkgcmV0dXJuKC0zKTsKKyAgICByZXR1cm4oZXJyb3JzW3R5cGVdKTsKK30KKworbWl4ZWQgUXVlcnlSZXNvbHZlZCgpCit7CisgICAgLy9kYXMga29lbm50ZSBlaW4gc2VociBzZWhyIGdyb3NzZXMgTWFwcGluZyBzZWluLCBhdXNzZXJkZW0gd2lyZCBrZWluZQorICAgIC8vS29waWUgenVydWVja2dlZ2ViZW4sIGRhaGVyIGVyc3RtYWwgbnVyIGljaC4uLgorICAgIGlmICghdGhpc19pbnRlcmFjdGl2ZSgpIHx8IAorICAgICAgICBtZW1iZXIoTUFJTlRBSU5FUixnZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpKSk8MCkKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICBpZiAocHJvY2Vzc19jYWxsKCkpIHJldHVybigtMik7CisgICAgcmV0dXJuKHJlc29sdmVkKTsKK30KKyovCisKKy8qICoqKioqKioqKioqKioqKioqICBJbnRlcm5hbCBTdHVmZiAgICoqKioqKioqKioqKioqKioqKioqICovCit2b2lkIGNyZWF0ZSgpIHsKKyAgICBzZXRldWlkKGdldHVpZChNRSkpOworCisgICAgaWYgKHNsX29wZW4oIi9zZWN1cmUvQVJDSC9lcnJvcmQuc3FsaXRlIikgIT0gMSkKKyAgICAvL2lmIChzbF9vcGVuKCIvZXJyb3JkLnNxbGl0ZSIpICE9IDEpCisgICAgeworICAgICAgcmFpc2VfZXJyb3IoIkRhdGVuYmFuayBrb25udGUgbmljaHQgZ2VvZWZmbmV0IHdlcmRlbi5cbiIpOworICAgIH0KKyAgICBzbF9leGVjKCJQUkFHTUEgZm9yZWlnbl9rZXlzID0gT047IFBSQUdNQSB0ZW1wX3N0b3JlID0gMjsgIik7CisgICAgLy9zdHJpbmcqIHJlcz1zbF9leGVjKCJQUkFHTUEgcXVpY2tfY2hlY2soTik7Iik7CisgICAgLy9pZiAocG9pbnRlcnAocmVzKSkKKyAgICAvL3sKKyAgICAvLyAgcmFpc2VfZXJyb3IoIiIpOworICAgIC8vfQorICAgIC8vc2xfZXhlYygiQ1JFQVRFIFRBQkxFIGlzc3VlKGlkIElOVEVHRVIsaGFza2V5IFRFWFQpOyIpOworICAgIGZvcmVhY2ggKHN0cmluZyBjbWQgOgorICAgICAgICBleHBsb2RlKHJlYWRfZmlsZSgiL3NlY3VyZS9BUkNIL2Vycm9yZC5zcWwuaW5pdCIpLCI7XG4iKSkKKyAgICB7CisgICAgICBpZiAoc2l6ZW9mKGNtZCkgJiYgY21kICE9ICJcbiIpCisgICAgICB7CisgICAgICAgIHNsX2V4ZWMoY21kKTsKKyAgICAgIH0KKyAgICB9CisgICAgc2xfZXhlYygiQU5BTFlaRSBtYWluOyIpOworCisgICAgbGFzdGVycm9yPShbXSk7Cit9CisKK3N0cmluZyBuYW1lKCkge3JldHVybigiPEVycm9yLURhZW1vbj4iKTt9CisKK3ZvaWQgc2F2ZV9tZShpbnQgbm93KSB7CisgIGlmIChub3cpCisgICAgc2F2ZV9vYmplY3QoU0FWRUZJTEUpOworICBlbHNlIGlmIChmaW5kX2NhbGxfb3V0KCMnc2F2ZV9vYmplY3QpPT0tMSkgeworICAgIGNhbGxfb3V0KCMnc2F2ZV9vYmplY3QsIDMwLCBTQVZFRklMRSk7CisgIH0KK30KKwordmFyYXJncyBpbnQgcmVtb3ZlKGludCBzaWxlbnQpIHsKKyAgICBzYXZlX21lKDEpOworICAgIGRlc3RydWN0KE1FKTsKKyAgICByZXR1cm4oMSk7Cit9CisKKworLy8gc3BlcnJ0IGRlbiBFaW50cmFnIChsb2NrIT0wKSBvZGVyIGVudHNwZXJydCBpaG4gKGxvY2s9PTApLiAKKy8vIFNwZXJyZSBoZWlzc3QgaGllciwgZGFzcyBkZXIgRmVobGVyIHZvbSBFeHBpcmUgbmljaHQgYXV0b21hdGlzY2ggZ2Vsb2VzY2h0CisvLyB3aXJkLgorLy8gbGllZmVydCA8MCBpbSBGZWhsZXJmYWxsLCBzb25zdCBBcnJheSBtaXQgTG9ja2RhdGVuCitwcml2YXRlIHZhcmFyZ3MgaW50IHNldF9sb2NrKGludCBpc3N1ZWlkLCBpbnQgbG9jaywgc3RyaW5nIG5vdGUpCit7CisgICAgc3RydWN0IGZ1bGxpc3N1ZV9zIGlzc3VlID0gZGJfZ2V0X2lzc3VlKGlzc3VlaWQsMCk7CisgICAgaWYgKCFpc3N1ZSkKKyAgICAgIHJldHVybiAtMTsKKworICAgIGlmICghYWNjZXNzX2NoZWNrKGlzc3VlLT51aWQsIE1fV1JJVEUpKQorICAgICAgICAvL3p1Z3JpZmYgenVtIFNjaHJlaWJlbiBuaWNodCBnZXN0YXR0ZXQKKyAgICAgICAgcmV0dXJuKC0xMCk7CisKKyAgICByZXR1cm4gZGJfc2V0X2xvY2soaXNzdWVpZCwgbG9jaywgbm90ZSk7Cit9CisKKy8vbWFya2llcnQgZWluZW4gRmVobGVyIGFscyBnZWZpeHQsIG1pdCAnbm90ZScgYWxzIEJlbWVya3VuZyAocmVzIT0wKSBvZGVyCisvL21hcmtpZXJ0IGVpbmVuIEZlaGxlciB3aWVkZXIgYWxzIG5pY2h0LWdlZml4dCAocmVzb2x1dGlvbj09MCkKKy8vbGllZmVydCA8IDAgaW0gRmVobGVyZmFsbCwgc29uc3QgZGVuIG5ldWVuIFp1c3RhbmQuCitwcml2YXRlIHZhcmFyZ3MgaW50IHNldF9yZXNvbHV0aW9uKGludCBpc3N1ZWlkLCBpbnQgcmVzb2x1dGlvbiwgc3RyaW5nIG5vdGUpCit7CisgICAgc3RydWN0IGZ1bGxpc3N1ZV9zIGlzc3VlID0gZGJfZ2V0X2lzc3VlKGlzc3VlaWQsMCk7CisgICAgaWYgKCFpc3N1ZSkKKyAgICAgIHJldHVybiAtMTsKKworICAgIC8vIEZpeGVuIGR1ZXJmZW4gbnVyIHp1c3RhZW5kaWdlCisgICAgaWYgKHJlc29sdXRpb24KKyAgICAgICAgJiYgIWFjY2Vzc19jaGVjayhpc3N1ZS0+dWlkLCBNX0ZJWCkpCisgICAgICByZXR1cm4gLTEwOworICAgIC8vIGdnZi4gRml4IHp1cnVlY2t6aWVoZW4gZGFyZiBqZWRlciBtaXQgTV9XUklURQorICAgIGlmICghcmVzb2x1dGlvbiAmJgorICAgICAgICAhYWNjZXNzX2NoZWNrKGlzc3VlLT51aWQsIE1fV1JJVEUpKQorICAgICAgcmV0dXJuIC0xMDsKKworICAgIGludCByZXMgPSBkYl9zZXRfcmVzb2x1dGlvbihpc3N1ZWlkLCByZXNvbHV0aW9uLCBub3RlKTsKKworICAgIGlmIChyZXMgPT0gMSkKKyAgICB7CisgICAgICAvLyBGZWhsZXIgamV0enQgZ2VmaXh0LgorICAgICAgdmVyc2VuZGVfbWFpbChkYl9nZXRfaXNzdWUoaXNzdWVpZCwwKSk7ICAvLyBwZXIgTWFpbCB2ZXJzY2hpY2tlbgorICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKKy8vaXN0IGRlciBadWdyaWZmIGF1ZiB1aWQgZXJsYXVidD8gR2VwcnVlZnQgd2lyZCBUSSAod2VubiBrZWluIFRJLCBhdWNoIGtlaW4KKy8vU2NocmVpYnp1Z3JpZmYpCisvL21vZGUgZ2lidCBhbiwgb2IgbGVzZW5kIG9kZXIgc2NocmVpYmVuZAorcHJpdmF0ZSBpbnQgYWNjZXNzX2NoZWNrKHN0cmluZyB1aWQsIGludCBtb2RlKSB7CisKKyAgICBpZiAobW9kZT09TV9SRUFEKQorICAgICAgICByZXR1cm4gTEVBUk5FUl9TRUNVUklUWTsgIC8vbGVzZW4gZGFyZiBqZWRlciBNYWdpZXIKKworICAgIC8vIEluIHByb2Nlc3Nfc3RyaW5nKCkgc2Nob25tYWwgZ2FyIG5pY2h0LgorICAgIGlmIChwcm9jZXNzX2NhbGwoKSkgcmV0dXJuKDApOworICAgIC8vIEVNKyBkdWVyZmVuIGFsbGVzIGxvZXNjaGVuLgorICAgIGlmIChBUkNIX1NFQ1VSSVRZKSByZXR1cm4oMSk7CisgICAgLy8gZWlnZW5lIFVJRHMgZGFyZiBtYW4gYXVjaCB2b2xsdW1mYWVuZ2xpY2ggYmVhcmJlaXRlbi4KKyAgICBpZiAoc2VjdXJlX2V1aWQoKT09dWlkKSByZXR1cm4oMSk7CisKKyAgICAvLyBhbGxlcyBhbmRlcmUgd2lyZCBzcGV6aWVsbCBnZXBydWVmdAorICAgIHN3aXRjaChtb2RlKQorICAgIHsKKyAgICAgIC8vIE1fV1JJVEUgaXN0IHp1ciB6ZWl0IGVpZ2VudGxpY2ggaW1tZXIgbmVuIEFwcGVuZCAtIGRhcyBkdWVyZmVuIHp1cgorICAgICAgLy8gWmVpdCBhbGxlIGFiIFZvbGxtYWdpZXIKKyAgICAgIGNhc2UgTV9XUklURToKKyAgICAgICAgcmV0dXJuIExFQVJORVJfU0VDVVJJVFk7CisgICAgICAgIGJyZWFrOworICAgICAgLy8gTG9lc2NoZW4gdW5kIEZpeGVuIGR1ZXJmZW4genVyIFplaXQgbnVyIFp1c3RhZW5kaWdlLgorICAgICAgY2FzZSBNX0RFTEVURToKKyAgICAgIGNhc2UgTV9SRUFTU0lHTjoKKyAgICAgIGNhc2UgTV9GSVg6CisgICAgICAgIC8vIE1hc3RlciBuYWNoIFVJRHMgZnJhZ2VuLCBmdWVyIGRpZSBkZXIgamV3LiBNYWdpZXIKKyAgICAgICAgLy8genVzdGFlbmRpZyBpc3QuCisgICAgICAgIGlmIChtZW1iZXIoKHN0cmluZyAqKW1hc3RlcigpLT5RdWVyeVVJRHNGb3JXaXphcmQoc2VjdXJlX2V1aWQoKSksdWlkKSA+PSAwKQorICAgICAgICAgIHJldHVybiAxOworCisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybigwKTsgICAgICAgIC8vRmFsbC10aHJvdWdoLCBuZWluUk5FUl9TRUNVUklUWQorfQorCitwdWJsaWMgc3RyaW5nIGZvcm1hdF9zdGFja3RyYWNlKHN0cnVjdCBmcmFtZV9zKiBzdGFja3RyYWNlKSB7CisgICAgc3RyaW5nICpsaW5lczsKKworICAgIGlmICghcG9pbnRlcnAoc3RhY2t0cmFjZSkgfHwgIXNpemVvZihzdGFja3RyYWNlKSkKKyAgICAgICAgcmV0dXJuKCIiKTsKKworICAgIGxpbmVzPWFsbG9jYXRlKHNpemVvZihzdGFja3RyYWNlKSk7CisgICAgaW50IGk7CisgICAgZm9yZWFjaChzdHJ1Y3QgZnJhbWVfcyBmcmFtZTogc3RhY2t0cmFjZSkKKyAgICB7CisgICAgICBsaW5lc1tpXT1zcHJpbnRmKCJGdW46ICUuMjBPIGluIFByb2c6ICUuNDBzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICIgICBaZWlsZTogJS44ZCBbJS41MHNdXG4iCisgICAgICAgICAgICAgICAgICAgICAgICIgICBFdmFsY29zdHM6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPm5hbWUsZnJhbWUtPnByb2csCisgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5sb2MsZnJhbWUtPm9iaixmcmFtZS0+dGlja3MpOworICAgICAgKytpOworICAgIH0KKyAgICByZXR1cm4oaW1wbG9kZShsaW5lcywiXG4iKSk7Cit9CisKK3B1YmxpYyBzdHJpbmcgZm9ybWF0X25vdGVzKHN0cnVjdCBub3RlX3MqIG5vdGVzKQoreworICBpbnQgaTsKKyAgc3RyaW5nIHRleHQ9IiI7CisgIGZvcmVhY2goc3RydWN0IG5vdGVfcyBub3RlOiBub3RlcykKKyAgeworICAgIHRleHQrPXNwcmludGYoIk5vdGl6ICVkIHZvbiAlLjEwcyBhbSAlLjMwc1xuJXMiLAorICAgICAgICArK2ksY2FwaXRhbGl6ZShub3RlLT51c2VyKSxkdGltZShub3RlLT50aW1lKSwKKyAgICAgICAgYnJlYWtfc3RyaW5nKG5vdGUtPnR4dCwgNzgsIiAgIikpOworICB9CisgIHJldHVybiB0ZXh0OworfQorCitwdWJsaWMgc3RyaW5nIGZvcm1hdF9lcnJvcl9zcGllbGVyKHN0cnVjdCBmdWxsaXNzdWVfcyBpc3N1ZSkKK3sKKyAgc3RyaW5nIHR4dDsKKyAgc3RyaW5nICpsYWJlbDsKKworICBpZiAoIWlzc3VlKQorICAgIHJldHVybiAwOworCisgIHN3aXRjaChpc3N1ZS0+dHlwZSkKKyAgeworICAgIGNhc2UgVF9SVEVSUk9SOgorICAgICAgbGFiZWw9KHsiTGF1ZnplaXRmZWhsZXIiLCJEaWVzZXIgTGF1ZnplaXRmZWhsZXIifSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRfUkVQT1JURURfRVJSOgorICAgICAgbGFiZWw9KHsiRmVobGVyaGlud2VpcyIsIkRpZXNlciBGZWhsZXJoaW53ZWlzIn0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUX1JFUE9SVEVEX1RZUE86CisgICAgICBsYWJlbD0oeyJUeXBvIiwiRGllc2VyIFR5cG8ifSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRfUkVQT1JURURfSURFQToKKyAgICAgIGxhYmVsPSh7IklkZWUiLCJEaWVzZSBJZGVlIn0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUX1JFUE9SVEVEX01EOgorICAgICAgbGFiZWw9KHsiRmVobGVuZGVzIERldGFpbCIsIkRpZXNlcyBmZWhsZW5kZSBEZXRhaWwifSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRfUlRXQVJOOgorICAgICAgbGFiZWw9KHsiTGF1ZnplaXR3YXJudW5nIiwiRGllc2UgTGF1ZnplaXR3YXJudW5nIn0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUX0NUV0FSTjoKKyAgICAgIGxhYmVsPSh7IkxhZGV6ZWl0d2FybnVuZyIsIkRpZXNlIExhZGV6ZWl0d2FybnVuZyJ9KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVF9DVEVSUk9SOgorICAgICAgbGFiZWw9KHsiTGFkZXplaXRmZWhsZXIiLCJEaWVzZXIgTGFkZXplaXRmZWhsZXIifSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiByZXR1cm4gMDsKKyAgfQorCisgIHR4dD1zcHJpbnRmKCAiXG5EYXRlbiBmdWVyICVzIG1pdCBJRCAnJXMnOlxuIgorICAgICAgICAgICAgICAgIlplaXQ6ICUyNXNcbiIsCisgICAgICAgICAgICAgICBsYWJlbFswXSwgaXNzdWUtPmhhc2hrZXksCisgICAgICAgICAgICAgICBkdGltZShpc3N1ZS0+Y3RpbWUpCisgICAgICAgICAgICAgICk7CisKKyAgdHh0Kz1zcHJpbnRmKCIlcyIsYnJlYWtfc3RyaW5nKGlzc3VlLT5tZXNzYWdlLDc4LAorICAgICAgICAgICAgICAgICAgIk1lbGR1bmc6ICAgICIsQlNfSU5ERU5UX09OQ0UpKTsKKworICBpZiAocG9pbnRlcnAoaXNzdWUtPm5vdGVzKSkKKyAgICAgIHR4dCs9IkJlbWVya3VuZ2VuOlxuIitmb3JtYXRfbm90ZXMoaXNzdWUtPm5vdGVzKSsiXG4iOworCisgIHJldHVybiB0eHQ7Cit9CisKK3B1YmxpYyBzdHJpbmcgZm9ybWF0X2Vycm9yKHN0cnVjdCBmdWxsaXNzdWVfcyBpc3N1ZSwgaW50IG9ubHlfZXNzZW50aWFsKQoreworICBzdHJpbmcgdHh0OworICBzdHJpbmcgKmxhYmVsOworCisgIGlmICghaXNzdWUpCisgICAgcmV0dXJuIDA7CisKKyAgc3dpdGNoKGlzc3VlLT50eXBlKQorICB7CisgICAgY2FzZSBUX1JURVJST1I6CisgICAgICBsYWJlbD0oeyJMYXVmemVpdGZlaGxlciIsIkRpZXNlciBMYXVmemVpdGZlaGxlciJ9KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVF9SRVBPUlRFRF9FUlI6CisgICAgICBsYWJlbD0oeyJGZWhsZXJoaW53ZWlzIiwiRGllc2VyIEZlaGxlcmhpbndlaXMifSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRfUkVQT1JURURfVFlQTzoKKyAgICAgIGxhYmVsPSh7IlR5cG8iLCJEaWVzZXIgVHlwbyJ9KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVF9SRVBPUlRFRF9JREVBOgorICAgICAgbGFiZWw9KHsiSWRlZSIsIkRpZXNlIElkZWUifSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRfUkVQT1JURURfTUQ6CisgICAgICBsYWJlbD0oeyJGZWhsZW5kZXMgRGV0YWlsIiwiRGllc2VzIGZlaGxlbmRlIERldGFpbCJ9KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVF9SVFdBUk46CisgICAgICBsYWJlbD0oeyJMYXVmemVpdHdhcm51bmciLCJEaWVzZSBMYXVmemVpdHdhcm51bmcifSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRfQ1RXQVJOOgorICAgICAgbGFiZWw9KHsiTGFkZXplaXR3YXJudW5nIiwiRGllc2UgTGFkZXplaXR3YXJudW5nIn0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUX0NURVJST1I6CisgICAgICBsYWJlbD0oeyJMYWRlemVpdGZlaGxlciIsIkRpZXNlciBMYWRlemVpdGZlaGxlciJ9KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6IHJldHVybiAwOworICB9CisKKyAgdHh0PXNwcmludGYoICJcbkRhdGVuIGZ1ZXIgJXMgbWl0IElEICVkOlxuIgorICAgICAgICAgICAgICAgIkhhc2hrZXk6ICVzXG4iCisgICAgICAgICAgICAgICAiWmVpdDogJTI1cyAoRXJzdG1hbGlnOiAlMjVzKVxuIiwKKyAgICAgICAgICAgICAgIGxhYmVsWzBdLCBpc3N1ZS0+aWQsIGlzc3VlLT5oYXNoa2V5LAorICAgICAgICAgICAgICAgZHRpbWUoYWJzKGlzc3VlLT5tdGltZSkpLGR0aW1lKGlzc3VlLT5jdGltZSkKKyAgICAgICAgICAgICAgKTsKKworICBpZiAoc3RyaW5ncChpc3N1ZS0+cHJvZykpCisgICAgICB0eHQgKz0gc3ByaW50ZigKKyAgICAgICAgICAgICAgICJQcm9ncmFtbTogICAlLjYwc1xuIgorICAgICAgICAgICAgICAgIlplaWxlOiAgICAgICUuNjBkXG4iLAorICAgICAgICAgICAgICAgaXNzdWUtPnByb2csIGlzc3VlLT5sb2MKKyAgICAgICAgICAgICAgICk7CisKKyAgaWYgKHN0cmluZ3AoaXNzdWUtPm9iaikpCisgICAgICB0eHQrPXNwcmludGYoIk9iamVrdDogICAgICUuNjBzXG4iLAorICAgICAgICAgICAgICAgaXNzdWUtPm9iaik7CisKKyAgdHh0ICs9IHNwcmludGYoIkxvYWRuYW1lOiAgICUuNjBzXG4iCisgICAgICAgICAgICAgICAgICJVSUQ6ICAgICAgICAlLjYwc1xuIiwKKyAgICAgICAgICAgICAgICAgaXNzdWUtPmxvYWRuYW1lLCBpc3N1ZS0+dWlkKTsKKworICB0eHQrPXNwcmludGYoIiVzIixicmVha19zdHJpbmcoaXNzdWUtPm1lc3NhZ2UsNzgsCisgICAgICAgICAgICAgICAgICAiTWVsZHVuZzogICAgIixCU19JTkRFTlRfT05DRSkpOworICBpZiAoc3RyaW5ncChpc3N1ZS0+aGJvYmopKQorICAgICAgdHh0Kz1zcHJpbnRmKAorICAgICAgICAgICAgICAgIkhCLU9iajogICAgICUuNjBzXG4iLGlzc3VlLT5oYm9iaik7CisKKyAgaWYgKHN0cmluZ3AoaXNzdWUtPnRpdHApKSB7CisgICAgICB0eHQrPXNwcmludGYoCisgICAgICAgICAgICAgICAiVEkvVFA6ICAgICAgJS42MHNcbiIsaXNzdWUtPnRpdHApOworICAgICAgaWYgKHN0cmluZ3AoaXNzdWUtPnRpZW52KSkKKyAgICAgICAgICB0eHQrPXNwcmludGYoCisgICAgICAgICAgICAgICAiRW52aXJvbm0uOiAgJS42MHNcbiIsaXNzdWUtPnRpZW52KTsKKyAgfQorCisgIGlmICghc3RyaW5ncChpc3N1ZS0+Y29tbWFuZCkgfHwKKyAgICAgICFBUkNIX1NFQ1VSSVRZIHx8IHByb2Nlc3NfY2FsbCgpKQorICB7CisgICAgICAvLyBLb21tYW5kb2VpbmdhYmUgaXN0IFByaXZhdHNwaGFlcmUgdW5kIGRhcmYgbmljaHQgdm9uIGplZGVtIGVpbnNlaGJhcgorICAgICAgLy8gc2Vpbi4KKyAgICAgIC8vIGluIGRpZXNlbSBGYWxsIGFiZXIgenVtaW5kZXN0IGRhcyBWZXJiIGF1c2dlYmVuLCBzbyB2b3JoYW5kZW4KKyAgICAgIGlmIChpc3N1ZS0+dmVyYikKKyAgICAgICAgICB0eHQrPXNwcmludGYoCisgICAgICAgICAgICAgICJWZXJiOiAgICAgICAgJS42MHNcbiIsaXNzdWUtPnZlcmIpOworICB9CisgIC8vICFwcm9jZXNzX2NhbGwoKSAmJiBBUkNIX1NFQ1VSSVRZIGVyZnVlbGx0Li4uCisgIGVsc2UgaWYgKHN0cmluZ3AoaXNzdWUtPmNvbW1hbmQpKQorICAgICAgdHh0Kz1zcHJpbnRmKAorICAgICAgICAgICJCZWZlaGw6ICAgICAlLjYwc1xuIixpc3N1ZS0+Y29tbWFuZCk7CisKKyAgaWYgKGlzc3VlLT5jYXVnaHQpCisgICAgICB0eHQrPWxhYmVsWzFdKyIgdHJhdCBpbiBlaW5lbSAnY2F0Y2goKScgYXVmLlxuIjsKKworICBpZiAoIW9ubHlfZXNzZW50aWFsKQorICB7CisgICAgaWYgKGlzc3VlLT5kZWxldGVkKQorICAgICAgICB0eHQrPWxhYmVsWzFdKyIgd3VyZGUgYWxzIGdlbG9lc2NodCBtYXJraWVydC5cbiI7CisKKyAgICBpZiAoaXNzdWUtPmxvY2tlZCkKKyAgICAgICAgdHh0Kz1icmVha19zdHJpbmcoCisgICAgICAgICAgICBzcHJpbnRmKCIlcyB3dXJkZSB2b24gJXMgYW0gJXMgdm9yIGF1dG9tYXRpc2NoZW0gTG9lc2NoZW4gIgorICAgICAgICAgICAgImdlc2NodWV0enQgKGxvY2tlZCkuXG4iLAorICAgICAgICAgICAgbGFiZWxbMV0saXNzdWUtPmxvY2tlZF9ieSwgZHRpbWUoaXNzdWUtPmxvY2tlZF90aW1lKSksNzgpOworICAgIGlmIChpc3N1ZS0+cmVzb2x2ZWQpCisgICAgICAgIHR4dCs9bGFiZWxbMV0rIiB3dXJkZSBhbHMgZXJsZWRpZ3QgbWFya2llcnQuXG4iOworICB9CisKKyAgdHh0Kz1zcHJpbnRmKCIlcyB0cmF0IGJpc2hlciAlZCBNYWwgYXVmLlxuIiwKKyAgICAgICAgICAgICAgIGxhYmVsWzFdLGlzc3VlLT5jb3VudCk7CisKKyAgaWYgKHBvaW50ZXJwKGlzc3VlLT5zdGFjaykpCisgICAgICB0eHQrPSJTdGFja3RyYWNlOlxuIitmb3JtYXRfc3RhY2t0cmFjZShpc3N1ZS0+c3RhY2spKyJcbiI7CisKKyAgaWYgKHBvaW50ZXJwKGlzc3VlLT5ub3RlcykpCisgICAgICB0eHQrPSJCZW1lcmt1bmdlbjpcbiIrZm9ybWF0X25vdGVzKGlzc3VlLT5ub3RlcykrIlxuIjsKKworICByZXR1cm4gdHh0OworfQorCisvLyBsZXR6dGVyIEFlbmRlcnVuZyBlaW5lcyBTcGllbGVyLS9NYWdpZXJzYXZlZmlsZXMuIE5hZWhlcnVuZyBmdWVyIGxldHp0ZW4KKy8vIExvZ291dCBvaG5lIGRhcyBTYXZlZmlsZSBlaW56dWxlc2VuIHVuZCBQX0xBU1RfTE9HT1VUIHp1IHBydWVmZW4uCitwcml2YXRlIGludCByZWNlbnRfbGFzdGxvZ291dChzdHJpbmcgbmFtLCBpbnQgdmFsaWR0aW1lKQoreworICBpZiAoIW5hbSB8fCBzaXplb2YobmFtKTwyKSByZXR1cm4gMDsKKyAgcmV0dXJuIGZpbGVfdGltZSgiLyJMSUJTQVZFRElSIi8iICsgbmFtWzAuLjBdICsgIi8iICsgbmFtICsgIi5vIikgPj0gdmFsaWR0aW1lOworfQorCisvLyBWZXJzZW5kZXQgTWFpbCBhbiB6dXN0YWVuZGlnZW4gTWFnaWVyIHVuZCBnZ2YuIFNwaWVsZXIsIGRlciBkZW4gRWludHJhZworLy8gZXJzdGVsbHQgaGF0LgorLy8gQUNIVFVORzogbG9lc2NodCBpc3N1ZS0+Y29tbWFuZC4KK3ByaXZhdGUgaW50IHZlcnNlbmRlX21haWwoc3RydWN0IGZ1bGxpc3N1ZV9zIGlzc3VlKQoreworICAvLyBWZXJzZW5kZXQgZWluZSBtYWlsIG1pdCBkZW0gZ2VmaXh0ZW4gRmVobGVyLgorICBtaXhlZCAqbWFpbDsKKyAgc3RyaW5nIHRleHQsICplbXBmOworICBpbnQgcmVzID0gLTE7CisKKyAgbWFpbCA9IGFsbG9jYXRlKDkpOworICBtYWlsW01TR19GUk9NXSA9ICI8RmVobGVyLURhZW1vbj4iOworICBtYWlsW01TR19TRU5ERVJdID0gZ2V0dWlkKFRJKTsKKyAgbWFpbFtNU0dfQkNDXSA9IDA7CisgIG1haWxbTVNHX1NVQkpFQ1RdID0gc3ByaW50ZigiRmVobGVyL1dhcm51bmcgaW4gJXMgYmVob2JlbiIsIGlzc3VlLT5sb2FkbmFtZSk7CisgIG1haWxbTVNHX0RBVEVdID0gZHRpbWUodGltZSgpKTsKKworICAvLyBhdWNoIHdlbm4gZWluIEVNIGZpeHQsIHNvbGxlbiBkaWUgRW1wZmFlbmdlciBuaWNodCBhdXRvbWF0aXNjaCBkaWUKKyAgLy8gU3BpZWxlcmVpbmdhYmUgZXJoYWx0ZW4sIGFsc28gY29tbWFuZCBsb2VzY2hlbi4KKyAgaXNzdWUtPmNvbW1hbmQgPSAwOworCisgIC8vIGVyc3RtYWwgZWluZSBNYWlsIGFuIHp1c3RhZW5kaWdlIE1hZ2llci4KKyAgZW1wZiA9IChzdHJpbmcqKW1hc3RlcigpLT5RdWVyeVdpemFyZHNGb3JVSUQoaXNzdWUtPnVpZCk7CisgIC8vIGxhbmcgKDE4MCBUYWdlKSBuaWNodCBlaW5nZWxvZ2d0ZSBNYWdpZXIgYXVzZmlsdGVybgorICBlbXBmID0gZmlsdGVyKGVtcGYsICMncmVjZW50X2xhc3Rsb2dvdXQsIHRpbWUoKSAtIDE1NTUyMDAwKTsKKyAgaWYgKHNpemVvZihlbXBmKSkKKyAgeworCisgICAgdGV4dCA9IGJyZWFrX3N0cmluZygKKyAgICAgIHNwcmludGYoU1RBTkRBUkRNQUlMVEVYVCxjYXBpdGFsaXplKGdldHVpZChUSSkpKQorICAgICAgK2Zvcm1hdF9lcnJvcihpc3N1ZSwgMSksNzgsIiIsQlNfTEVBVkVfTVlfTEZTKTsKKworICAgIG1haWxbTVNHX1JFQ0lQSUVOVF0gPSBlbXBmWzBdOworICAgIGlmIChzaXplb2YoZW1wZik+MSkKKyAgICAgIG1haWxbTVNHX0NDXSA9IGVtcGZbMS4uXTsKKyAgICBlbHNlCisgICAgICBtYWlsW01TR19DQ10gPSAwOworICAgIG1haWxbTVNHX0JPRFldPXRleHQ7CisgICAgbWFpbFtNU0dfSURdPXNwcmludGYoTVVETkFNRSI6ICVkLiVkIix0aW1lKCkscmFuZG9tKF9fSU5UX01BWF9fKSk7CisKKyAgICBpZiAoIXNpemVvZigiL3NlY3VyZS9tYWlsZXIiLT5EZWxpdmVyTWFpbChtYWlsLDApKSkKKyAgICAgIHJlcyA9IC0xOyAvLyBhbiBuaWVtYW5kZW4gZXJmb2xncmVpY2ggenVnZXN0ZWxsdC4gOi0oCisgICAgZWxzZQorICAgICAgcmVzID0gMTsKKyAgfQorCisgIC8vIEJlaSB2b24gU3BpZWxlcm4gZ2VtZWxkZXRlbiBGZWhsZXIgd2VyZGVuIFNwaWVsZXIgYmVpCisgIC8vIEVybGVkaWd1bmcgaW5mb3JtaWVydCwgd2VubiBkZXJlbiBsZXR6dGVyIExvZ291dCB3ZW5pZ2VyIGFscyAxODAgVGFnZSBoZXIKKyAgLy8gaXN0LgorICBpZiAoIChpc3N1ZS0+dHlwZSAmCisgICAgICAgIChUX1JFUE9SVEVEX0VSUnxUX1JFUE9SVEVEX1RZUE98VF9SRVBPUlRFRF9JREVBfFRfUkVQT1JURURfTUQpKQorICAgICAgJiYgaXNzdWUtPnRpdHAKKyAgICAgICYmIHJlY2VudF9sYXN0bG9nb3V0KGlzc3VlLT50aXRwLCB0aW1lKCkgLSAxNTU1MjAwMCkgKQorICB7CisgICAgdGV4dCA9IGJyZWFrX3N0cmluZygKKyAgICAgIHNwcmludGYoU1RBTkRBUkRNQUlMVEVYVF9FUlJPUkhJTlQsCisgICAgICAgIGNhcGl0YWxpemUoaXNzdWUtPnRpdHApLCBjYXBpdGFsaXplKGdldHVpZChUSSkpKQorICAgICAgK2Zvcm1hdF9lcnJvcl9zcGllbGVyKGlzc3VlKSwgNzgsIiIsQlNfTEVBVkVfTVlfTEZTKTsKKworICAgIG1haWxbTVNHX0lEXT1zcHJpbnRmKE1VRE5BTUUiOiAlZC4lZCIsdGltZSgpLHJhbmRvbShfX0lOVF9NQVhfXykpOworICAgIG1haWxbTVNHX1JFQ0lQSUVOVF0gPSBpc3N1ZS0+dGl0cDsKKyAgICBtYWlsW01TR19DQ10gPSAwOworICAgIG1haWxbTVNHX1NVQkpFQ1RdID0gc3ByaW50ZigiRmVobGVyL0lkZWUvVHlwbyB3dXJkZSB2b24gJXMgYmVob2JlbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldHVpZChUSSkpOworICAgIG1haWxbTVNHX0JPRFldID0gdGV4dDsKKworICAgIGlmICghc2l6ZW9mKCIvc2VjdXJlL21haWxlciItPkRlbGl2ZXJNYWlsKG1haWwsMCkpKQorICAgICAgcmVzIHw9IC0xOworICAgIGVsc2UKKyAgICAgIHJlcyB8PSAxOworICB9CisKKyAgcmV0dXJuIHJlczsKK30KKwordm9pZCByZXNldCgpCit7CisgIC8vIGdlbG9lc2NodGUgSXNzdWVzIHNvZm9ydCwgZ2VmaXh0ZSAzMCBUYWdlIG5hY2ggbGV0enRlciBBZW5kZXJ1bmcKKyAgLy8gbG9lc2NoZW4uCisgIHNsX2V4ZWMoIkRFTEVURSBGUk9NIGlzc3VlcyBXSEVSRSBkZWxldGVkPTE7Iik7CisgIHNsX2V4ZWMoIkRFTEVURSBGUk9NIGlzc3VlcyBXSEVSRSByZXNvbHZlZD0xIEFORCBtdGltZTw/MTsiLAorICAgICAgICAgIHRpbWUoKS0zMCoyNCozNjAwKTsKKyAgc2V0X25leHRfcmVzZXQoMzYwMCoyNCk7Cit9CisKKy8vIE5pY2h0IGplZGVyIE1hZ2llciBtdXNzIGRlbiBFcnJvckQgZGlyZWt0IHplcnN0b2VyZW4ga29lbm5lbi4KK3B1YmxpYyBzdHJpbmcgTm90aWZ5RGVzdHJ1Y3Qob2JqZWN0IGNhbGxlcikgeworICBpZiggKGNhbGxlciE9dGhpc19vYmplY3QoKSAmJiAhQVJDSF9TRUNVUklUWSkgfHwgcHJvY2Vzc19jYWxsKCkgKSB7CisgICAgcmV0dXJuICJEdSBkYXJmc3QgZGVuIEVycm9yLURhZW1vbiBuaWNodCB6ZXJzdG9lcmVuIVxuIjsKKyAgfQorICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL2Vycm9yZC5oIGIvc2VjdXJlL2Vycm9yZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkODIzMDEKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvZXJyb3JkLmgKQEAgLTAsMCArMSwxMTIgQEAKKy8qICBNb3JnZW5HcmF1ZW4gTVVEbGliCisgICAgL3N5cy9lcnJvcmQuaAorICAgIEhlYWRlcmZpbGUgZnVlciBkZW4gRXJyb3ItRGFlbW9uZW4KKyAgICBBdXRvcjogWmVzc3RyYQorICAgICRJZDogZXJyb3JkLmggOTQzOSAyMDE2LTAxLTIwIDA5OjQ4OjI4WiBaZXNzdHJhICQKKyAgICBnZ2YuIENoYW5nZWxvZzoKKyovCisKKyNpZm5kZWYgX19FUlJPUkRfSF9fCisjZGVmaW5lIF9fRVJST1JEX0hfXworCisvLyBUeXBlbgorI2RlZmluZSBUX1JURVJST1IgICAxCSAgIC8vUnVudGltZSBFcnJvciAvIExhdWZ6ZWl0ZmVobGVyCisjZGVmaW5lIFRfUlRXQVJOICAgIDIgICAgLy9SdW50aW1lIFdhcm5pbmcgLyBMYXVmemVpdHdhcm51bmcKKyNkZWZpbmUgVF9DVEVSUk9SICAgNCAgICAvL0NvbXBpbGV0aW1lIEVycm9yIC8gRmVobGVyIGJlaW0gVWViZXJzZXR6ZW4KKyNkZWZpbmUgVF9DVFdBUk4gICAgOCAgICAvL0NvbXBpbGV0aW1lIFdhcm5pbmcgLyBXYXJudW5nIGJlaW0gVWViZXJzZXR6ZW4KKyNkZWZpbmUgVF9SRVBPUlRFRF9FUlIgICAxNiAgIC8vIHZvbiBTcGllbGVybiBnZW1lbGRldGUgQnVncworI2RlZmluZSBUX1JFUE9SVEVEX1RZUE8gIDMyICAgLy8gdm9uIFNwaWVsZXJuIGdlbWVsZGV0ZSBUeXBvcworI2RlZmluZSBUX1JFUE9SVEVEX0lERUEgIDY0ICAgLy8gdm9uIFNwaWVsZXJuIGdlbWVsZGV0ZSBJZGVlbiAKKyNkZWZpbmUgVF9SRVBPUlRFRF9NRCAgICAxMjggIC8vIHZvbiBTcGllbGVybiBnZW1lbGRldGUgZmVobGVuZGUgRGV0YWlscworI2RlZmluZSBBTExfRVJSX1RZUEVTICh7VF9SVEVSUk9SLCBUX1JUV0FSTiwgVF9DVEVSUk9SLCBUX0NUV0FSTiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgVF9SRVBPUlRFRF9FUlIsIFRfUkVQT1JURURfVFlQTywgVF9SRVBPUlRFRF9JREVBLCBcCisgICAgICAgICAgICAgICAgICAgICAgICBUX1JFUE9SVEVEX01EIH0pCisKKy8vIFN0YXR1cworI2RlZmluZSBTVEFUX0RFTEVURUQgIDB4MQorI2RlZmluZSBTVEFUX0xPQ0tFRCAgIDB4MgorI2RlZmluZSBTVEFUX1JFU09MVkVEIDB4NAorCisvLyBBY2h0dW5nOiB2aWVsZSBLZXlzIGtvZW5uZW4gbmljaHQgdm9yaGFuZGVuIG9kZXIgV2VydGUgMCBzZWluIQorI2RlZmluZSBGX0lEICAgICAgICAgICJpZCIgICAgICAgICAgLy9pbnQ6IChyb3cpIElEIGluIGRlciBEQgorI2RlZmluZSBGX1RZUEUgICAgICAgICJ0eXBlIiAgICAgICAgLy9pbnQ6IFR5cC1XZXJ0ZSwgcy5vLgorI2RlZmluZSBGX0hBU0hLRVkgICAgICJoYXNoa2V5IiAgICAgLy9zdHJpbmc6IEhhc2hrZXkgZGVzIEZlaGxlcnMKKyNkZWZpbmUgRl9VSUQgICAgICAgICAidWlkIiAgICAgICAgIC8vc3RyaW5nOiAiVUlEIGRlcyBGZWhsZXJzIgorI2RlZmluZSBGX1NUQVRFICAgICAgICJzdGF0ZSIgICAgICAgLy9pbnQ6IFN0YXR1cy1XZXJ0ZSwgcy5vLgorI2RlZmluZSBGX01PRFNUQU1QICAgICJtdGltZSIgICAgICAgLy9pbnQKKyNkZWZpbmUgRl9DUkVBVEVTVEFNUCAiY3RpbWUiICAgICAgIC8vaW50CisjZGVmaW5lIEZfUkVBRFNUQU1QICAgImF0aW1lIiAgICAgICAvL2ludCAKKyNkZWZpbmUgRl9QUk9HICAgICAgICAicHJvZyIgICAgICAgIC8vc3RyaW5nID09IEJsdWVuYW1lLCBmYWxscyBrZWluIHJlcGxhY2VfcHJvZ3JhbSgpCisjZGVmaW5lIEZfT0JKICAgICAgICAgIm9iaiIgICAgICAgICAvL3N0cmluZworI2RlZmluZSBGX0xPQUROQU1FICAgICJsb2FkbmFtZSIgICAgLy9zdHJpbmcgPT0gQmx1ZW5hbWUsIGZhbGxzIGtlaW4gcmVuYW1lX29iamVjdCgpCisjZGVmaW5lIEZfTElORSAgICAgICAgImxvYyIgICAgICAgICAvL2ludAorI2RlZmluZSBGX01TRyAgICAgICAgICJtZXNzYWdlIiAgICAgLy9zdHJpbmcKKyNkZWZpbmUgRl9IQl9PQkogICAgICAiaGJvYmoiICAgICAgIC8vc3RyaW5nCisjZGVmaW5lIEZfQ0FVR0hUICAgICAgImNhdWdodCIgICAgICAvL2ludAorI2RlZmluZSBGX1RJVFAgICAgICAgICJ0aXRwIiAgICAgICAgLy9zdHJpbmcKKyNkZWZpbmUgRl9TVEFDSyAgICAgICAic3RhY2siICAgICAgIC8vQXJyYXkgdm9uIG1peGVkIChtaXhlZCkKKyNkZWZpbmUgRl9DTEkgICAgICAgICAiY29tbWFuZCIgICAgIC8vc3RyaW5nIChTcGllbGVyZWluZ2FiZSkKKyNkZWZpbmUgRl9WRVJCICAgICAgICAidmVyYiIgICAgICAgIC8vc3RyaW5nIChLb21tYW5kb3ZlcmIpCisjZGVmaW5lIEZfQ09VTlQgICAgICAgImNvdW50IiAgICAgICAvL2ludAorI2RlZmluZSBGX1RJRU5WICAgICAgICJ0aWVudiIgICAgICAgLy9zdHJpbmcsIG9iamVjdF9uYW1lKCkgdm9tIEVudiB2b24gVEkvVFAKKyNkZWZpbmUgRl9MT0NLICAgICAgICAibG9ja2VkIiAgICAgIC8vbWl4ZWQgKEFycmF5IHZvbiAyIEVsZW1lbnRlbikKKyNkZWZpbmUgRl9SRVNPTFZFUiAgICAicmVzb2x2ZXIiICAgIC8vc3RyaW5nICh3ZXIgaGF0IGdlZml4dD8pCisjZGVmaW5lIEZfTk9URVMgICAgICAgIm5vdGVzIiAgICAgICAvL0JlbWVya3VuZ2VuLCBBcnJheSB2b24gMy1lbGVtZW50aWdlbiBBcnJheXMKKworLy8gUHJvcCwgd2VsY2hlIGluIC9wbGF5ZXJzLyBkYXMgTG9nZ2VuIHZvbiBGZWhsZXJuIGltIGVycm9yZCB1bnRlcmJpbmRldC4KKyNkZWZpbmUgUF9ET05UX0xPR19FUlJPUlMgICAgInBfbGliX2Vycm9yZF9kb250X2xvZyIKKworI2lmZGVmIF9fTkVFRF9JTVBMRU1FTlRBVElPTl9fCisKKyNpZmRlZiBERUJVRworI3VuZGVmIERFQlVHCisjZW5kaWYKKy8vI2RlZmluZSBERUJVRyh4KQorI2RlZmluZSBERUJVRyh4KSAgaWYgKGZ1bmNhbGwoc3ltYm9sX2Z1bmN0aW9uKCdmaW5kX3BsYXllciksInplc3N0cmEiKSlcCisgICAgICAgIHRlbGxfb2JqZWN0KGZ1bmNhbGwoc3ltYm9sX2Z1bmN0aW9uKCdmaW5kX3BsYXllciksInplc3N0cmEiKSxcCisgICAgICAgICJFREJHOiAiK3grIlxuIikKKworLy9XZXIgcGZsZWd0IGRhcyBEaW5nIGhpZXIgZ2VyYWRlPworI2RlZmluZSBNQUlOVEFJTkVSICh7Inplc3N0cmEifSkKKworLy9TdGFuYXJkLUV4cGlyZQorI2RlZmluZSBTVERFWFBJUkUgMjY3ODQwMCAvLzMxIFRhZ2UKKworLy9CbGFja2xpc3QgZnVlciBGaWxlcywgZGllIG5pY2h0IGVyZmFzc3Qgd2VyZGVuIHNvbGxlbiAobnVyCisvL1VlYmVyc2V0enVuZ3Nwcm9ibGVtZSBtb21lbnRhbikKKyNkZWZpbmUgQkxBQ0tMSVNUICh7Ii50b29sLmxwYyIsIi54dG9vbC5oIn0pCisKKy8vWnVncmlmZnNhcnRlbgorI2RlZmluZSBNX1JFQUQgICAxCisjZGVmaW5lIE1fV1JJVEUgIDIgIC8vIGFjdHVhbGx5OiBhcHBlbmQtb25seQorI2RlZmluZSBNX0ZJWCAgICA0CisjZGVmaW5lIE1fUkVBU1NJR04gOAorI2RlZmluZSBNX0RFTEVURSAxNgorCisvLyBDaGFuZ2Vsb2cKKyNkZWZpbmUgQ0hBTkdFTE9HICIvbG9nL0NIQU5HRUxPRyIKKworLy8gTG9nCisvLyNkZWZpbmUgTUFJTExPRyAgICAgICAic2VudC5sb2ciCisKKy8vIFN0YW5kYXJkbWFpbHRleHQ6IFRPRE8gCisvLyNkZWZpbmUgU1RBTkRBUkRURVhUICBIT01FKCJtYWlsdGV4dC50eHQiKQorCisjZGVmaW5lIFNUQU5EQVJETUFJTFRFWFQgIkh1aHUgbGllYmVyIE1pdG1hZ2llcixcblxuIiBcCisgICAgImRlciB1bnRlbiBhbmdlZ2ViZW5lIEZlaGxlciBpbiBlaW5lbSBPYmpla3QsIGZ1ZXIgd2VsY2hlcyBEdSAiIFwKKyAgICAiKGFscyBwcm9ncmFtbWllcmVuZGVyIE1hZ2llciBvZGVyIFJNKSB6dXN0YWVuZGlnIGJpc3QsIHd1cmRlIHNvZWJlbiAiIFwKKyAgICAidm9uICVzIGFscyBnZWZpeHQgbWFya2llcnQuIEJpdHRlIGJlYWNodGUgZ2dmLiBkaWUgdW50ZW4gYW5nZWJlbmVuICIgXAorICAgICJCZW1lcmt1bmdlbiB6dW0gRml4LlxuXG4tLS0gRmVobGVyLURhdGVuIC0tLVxuIgorCisjZGVmaW5lIFNUQU5EQVJETUFJTFRFWFRfRVJST1JISU5UICJIdWh1ICVzLFxuXG4iIFwKKyAgICAiZWluIHZvbiBEaXIgYWJnZXNldHp0ZXIgRmVobGVyIChzLnUuKSB3dXJkZSB2b24gJXMgYmVhcmJlaXRldCB1bmQgYWxzICIgXAorICAgICJlcmxlZGlndCBtYXJraWVydC4gQmVpIEZyYWdlbiB3ZW5kZSBEaWNoIERpY2ggYml0dGUgYW4gZGVuICIgXAorICAgICJiZWFyYmVpdGVuZGVuIE1hZ2llci5cbiIgXAorICAgICJWaWVsZW4gRGFuayBmdWVyIERlaW5lIE1pdGhpbGZlIVxuXG4iIFwKKyAgICAiLS0tIEZlaGxlci1EYXRlbiAtLS1cbiIKKworCisjZW5kaWYgLy8gX19ORUVEX0lNUExFTUVOVEFUSU9OX18KKworI2VuZGlmIC8vIF9fRVJST1JEX0hfXworCmRpZmYgLS1naXQgYS9zZWN1cmUvZXhwbG9yYXRpb24uaCBiL3NlY3VyZS9leHBsb3JhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YWZiNDAKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvZXhwbG9yYXRpb24uaApAQCAtMCwwICsxLDc1IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gZXhwbG9yYXRpb24uaCAtLSBEZWZpbml0aW9uZW4gZnVlciBkZW4gZXhwbG9yYXRpb25tYXN0ZXIKKy8vCisvLyAkSWQ6IGV4cGxvcmF0aW9uLmggODgzNSAyMDE0LTA2LTA5IDIwOjI0OjAwWiBaZXNzdHJhICQKKworI2lmbmRlZiBfX0VYUExPUkFUSU9OX0hfXworI2RlZmluZSBfX0VYUExPUkFUSU9OX0hfXworCisvKiBEYXRlaW5hbWVuICovCisjZGVmaW5lIEVQTUFTVEVSICAgICIvc2VjdXJlL2V4cGxvcmF0aW9ubWFzdGVyIgorI2RlZmluZSBFUFNBVkVGSUxFICAiL3NlY3VyZS9BUkNIL2V4cGxvcmF0aW9uIgorI2RlZmluZSBEVU1QRklMRSAgICAiL3NlY3VyZS9BUkNIL0VQUk9PTVMuZHVtcCIKKyNkZWZpbmUgTUFLRV9FUFNUQVQgIi9zZWN1cmUvQVJDSC9lcHN0YXQiCisjZGVmaW5lIEVQU1RBVF9JTkZPICIvc2VjdXJlL0FSQ0gvZXBzdGF0Lm8iCisKKy8qIFppZWxlIHZvbiBDaGFuZ2VFUE9iamVjdCgpICovCisjZGVmaW5lIENIQU5HRV9PQiAgIDAgLy8gZGFzIE9iamVrdCBzZWxic3QKKyNkZWZpbmUgQ0hBTkdFX0tFWSAgMSAvLyBTY2hsdWVzc2VsCisjZGVmaW5lIENIQU5HRV9UWVBFIDIgLy8gZGVyIFR5cAorI2RlZmluZSBDSEFOR0VfQk9OVVMgMyAvLyBpc3QgZXMgZWluIEJvbnVzLUVQPworCisvKiBQb3NpdGlvbmVuIGltIE1hcHBpbmcgKi8KKyNkZWZpbmUgTVBPU19LRVkgIDAgICAvLyBEaWUgU2NobHVlc3NlbAorI2RlZmluZSBNUE9TX05VTSAgMSAgIC8vIE51bW1lciBkZXMgRVAKKyNkZWZpbmUgTVBPU19UWVBFIDIgICAvLyBUeXAgKHMudS4pCisKKy8qIFR5cGVuIHZvbiBFUC1TcGVuZGVybiAqLworI2RlZmluZSBFUF9ERVRBSUwgMCAgIC8vIERldGFpbHMsIFNwZWNpYWxEZXRhaWxzCisjZGVmaW5lIEVQX0VYSVQgICAxICAgLy8gRXhpdHMgdW5kIFNwZWNpYWxFeGl0cworI2RlZmluZSBFUF9DTUQJICAyICAgLy8gQWRkQ21kKCktS29tbWFuZG9zCisjZGVmaW5lIEVQX0lORk8gICAzICAgLy8gSW5mb3Mgdm9uIE5QQ3MKKyNkZWZpbmUgRVBfTUlTQyAgIDQgICAvLyBlaWdlbmUgR2l2ZUV4cGxvcmF0aW9uUG9pbnQoKS1BdWZydWZlCisjZGVmaW5lIEVQX1JERVQgICA1ICAgLy8gUmVhZERldGFpbHMKKyNkZWZpbmUgRVBfUFVCICAgIDYgICAvLyBTcGVpc2VuIHVuZCBHZXRyYWVua2UgaW4gS25laXBlbgorI2RlZmluZSBFUF9TTUVMTCAgNyAgIC8vIEdlcnVlY2hlCisjZGVmaW5lIEVQX1NPVU5EICA4ICAgLy8gR2VyYWV1c2NoZQorI2RlZmluZSBFUF9UT1VDSCAgOSAgIC8vIGVydGFzdGJhcmUgRGV0YWlscworI2RlZmluZSBFUF9NQVggICAgOSAgIC8vIG1heC4gQW56YWhsIHZvbiBUeXBlbgorCisjZGVmaW5lIEVQX1RZUEVTICh7ICJkZXQgIiwgImV4aXQiLCAiY21kICIsICJpbmZvIiwgIm1pc2MiLFwKKyAgICAgICAgICAgICAgICAgICAgInJkZXQiLCAicHViICIsICJzbWUgIiwgInNvbmQiLCAidGFzdGRldCIgfSkKKworLyogRmVobGVyIGJlaSBGdW5rdGlvbnNhdWZydWZlbiAqLworI2RlZmluZSBFUEVSUl9OT1RfQVJDSAkgIC0xICAvLyB0aGlzX2ludGVyYWN0aXZlKCkgd2FyIGtlaW4gRXJ6bWFnaWVyCisjZGVmaW5lIEVQRVJSX0lOVkFMSURfT0IgIC0yICAvLyB1bmd1ZWx0aWdlcyBPYmpla3QgKHpCLiBWQy1SYXVtKQorI2RlZmluZSBFUEVSUl9OT19FTlRSWQkgIC0zICAvLyBFaW50cmFnIG5pY2h0IGdlZnVuZGVuCisjZGVmaW5lIEVQRVJSX0lOVkFMSURfQVJHIC00ICAvLyBVbmd1ZWx0aWdlcyBBcmd1bWVudAorCisvKiB1bmQgaGllciB3YXMgZnVlciBkaWUgU3RhdGlzdGlrLi4uICovCisjZGVmaW5lIE1JTl9FUCAgMTAKKworLyogRlAtU2NyaXB0ZS4uLiAqLworI2RlZmluZSBMRl9MT0cgIkFSQ0gvRlBTX1RPT19GQVNUIgorI2RlZmluZSBMRl9USU1FIDkwMAorI2RlZmluZSBMRl9XQVJOIDMKKworLyogRlAtTG9nZmlsZSAqLworI2RlZmluZSBGUF9MT0cgIkFSQ0gvRlBTX0ZPVU5EIgorCisjZW5kaWYKKworCisjaWZkZWYgTkVFRF9QUk9UT1RZUEVTCisKKyNpZm5kZWYgX19FWFBMT1JBVElPTl9IX1BST1RPX18KKyNkZWZpbmUgX19FWFBMT1JBVElPTl9IX1BST1RPX18KKworLyogcHJvdG90eXBlcyAqLworc3RhdGljIHZvaWQgR2l2ZUVQKGludCB0eXBlLCBzdHJpbmcga2V5KTsgLy8gaW4gL3N0ZC90aGluZy9kZXNjcmlwdGlvbi5jCisKKyNlbmRpZiAvLyBfX0VYUExPUkFUSU9OX0hfUFJPVE9fXworCisjZW5kaWYJLy8gTkVFRF9QUk9UT1lQRVMKKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL2V4cGxvcmF0aW9ubWFzdGVyLmMgYi9zZWN1cmUvZXhwbG9yYXRpb25tYXN0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDYwOWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL2V4cGxvcmF0aW9ubWFzdGVyLmMKQEAgLTAsMCArMSwxMDI0IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gZXhwbG9yYXRpb25tYXN0ZXIuYyAtLSBWZXJ3YWx0dW5nIGRlciBFeHBsb3JhdGlvblBvaW50cyAoRlApCisvLworLy8gJElkOiBleHBsb3JhdGlvbm1hc3Rlci5jIDk1NjkgMjAxNi0wNi0wNSAyMToyODoyM1ogWmVzc3RyYSAkCisvLworI3ByYWdtYSBzdHJpY3RfdHlwZXMscnR0X2NoZWNrcworI3ByYWdtYSBub19jbG9uZSxub19zaGFkb3csbm9faW5oZXJpdAorLy8jcHJhZ21hIHBlZGFudGljCisvLyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgd2Fybl9kZXByZWNhdGVkCisKKyNkZWZpbmUgQllfRVAgIi9zZWN1cmUvQVJDSC9FUFNUQVRfQllfRVAiCisjZGVmaW5lIEJZX1BMICIvc2VjdXJlL0FSQ0gvRVBTVEFUX0JZX1BMIgorI2RlZmluZSBCWV9QTiAiL3NlY3VyZS9BUkNIL0VQU1RBVF9CWV9QTiIKKyNkZWZpbmUgQVZHTE9HICIvc2VjdXJlL0FSQ0gvRVBTVEFUX0FWRyIKKworaW5oZXJpdCAiL3N0ZC91dGlsL3BsX2l0ZXJhdG9yIjsKKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPHVzZXJpbmZvLmg+CisjaW5jbHVkZSA8ZXhwbG9yYXRpb24uaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bmV3X3NraWxscy5oPgorCisjZGVmaW5lIERPTUFJTl9JTkZPIDEKKworI2luY2x1ZGUgPGxpdmluZy9jb21tLmg+CisjZGVmaW5lIFpERUJVRyh4KSBpZiAoZmluZF9wbGF5ZXIoInplc3N0cmEiKSkgXAorICBmaW5kX3BsYXllcigiemVzc3RyYSIpLT5SZWNlaXZlTXNnKHgsTVRfREVCVUcsMCxvYmplY3RfbmFtZSgpKyI6Iix0aGlzX29iamVjdCgpKQorLy8jZGVmaW5lIFpERUJVRyh4KQorCisvLyBTdHJ1a3R1cjogKFsgc3RyaW5nIGZpbGVuYW1lIDogc3RyaW5nKiBhY3Rpb24sIGludCBudW1iZXIsIGludCB0eXBlIF0pIAorcHJpdmF0ZSBtYXBwaW5nIG9iczsKK3ByaXZhdGUgaW50IGVwY291bnQ7ICAvLyBBbnphaGwgRlAKK3ByaXZhdGUgaW50IGVwYXZnOyAgICAvLyBEdXJjaHNjaG5pdHRsaWNoZSBGUC9TcGllbGVyCisvLyBCaXRzdHJpbmdzIGZ1ZXIgbm9ybWFsZSAoYWxsb2MpIHVuZCBCb251cy1GUCAoYm9udXMpCitwcml2YXRlIHN0cmluZyBhbGxvYyxib251czsKKworcHJpdmF0ZSBub3NhdmUgc3RyaW5nIHZjX29iOworcHJpdmF0ZSBub3NhdmUgc3RyaW5nIG91dHB1dDsKKworcHJpdmF0ZSBub3NhdmUgaW50IGNoYW5nZWQ7Citwcml2YXRlIG5vc2F2ZSBpbnQgZHVtcGluZzsKK3ByaXZhdGUgbm9zYXZlIG1hcHBpbmcgZHVtcE1hcCwgbGFzdGZvdW5kLCBxdWVyeXRpbWU7CisKK3ByaXZhdGUgbm9zYXZlIGludCBzdGF0X2RvbmU7CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgIHNldGV1aWQoZ2V0dWlkKHRoaXNfb2JqZWN0KCkpKTsKKyAgaWYgKCFyZXN0b3JlX29iamVjdChFUFNBVkVGSUxFKSkgeworICAgIG9icyA9IChbXSk7CisgICAgZXBjb3VudCA9IGVwYXZnID0gMDsKKyAgICBhbGxvYyA9ICIgIjsKKyAgICBib251cyA9ICIgIjsKKyAgICBzYXZlX29iamVjdChFUFNBVkVGSUxFKTsKKyAgfQorICBpZiAoIWJvbnVzKSBib251cz0iICI7CisgIGxhc3Rmb3VuZD0oW10pOworICBxdWVyeXRpbWU9KFtdKTsKK30KKworcHVibGljIHZhcmFyZ3MgaW50IHJlbW92ZShpbnQgc2lsZW50KQoreworICBzYXZlX29iamVjdChFUFNBVkVGSUxFKTsKKyAgZGVzdHJ1Y3QodGhpc19vYmplY3QoKSk7CisgIHJldHVybiAxOworfQorCisvLyBTdGF0aXN0aWsgZXJzdGVsbGVuCitwcml2YXRlIGludCBTZXRBdmVyYWdlKGludCBuZXdhdmcpCit7CisgIGlmIChlcGF2ZyAhPSBuZXdhdmcpCisgIHsKKyAgICBlcGF2ZyA9IG5ld2F2ZzsKKyAgICB3cml0ZV9maWxlKEFWR0xPRywgc3ByaW50ZigiJXMgOiAlZFxuIixkdGltZSh0aW1lKCkpLG5ld2F2ZykpOworICAgIHNhdmVfb2JqZWN0KEVQU0FWRUZJTEUpOworICB9CisgIHJldHVybiBlcGF2ZzsKK30KKworcHJpdmF0ZSB2b2lkIGNoZWNrX3BsYXllcihzdHJpbmcgcGwsIG1peGVkIGV4dHJhKQoreworICBpbnQgKmZwX2ZvdW5kID0gZXh0cmFbMF07CisgIG1hcHBpbmcgcGxzdGF0ID0gZXh0cmFbMV07CisgIG1hcHBpbmcgcG5zdGF0ID0gZXh0cmFbMl07CisgIG9iamVjdCBwbGRhdGEgPSBleHRyYVszXTsKKyAgaWYgKCFwbGRhdGEpCisgIHsKKyAgICBwbGRhdGE9Y2xvbmVfb2JqZWN0KCIvb2JqL3BsYXllcmRhdGEiKTsKKyAgICBleHRyYVszXT1wbGRhdGE7CisgIH0KKyAgLy8gTGV0enRlIExvZ2luemVpdCBlcm1pdHRlbG4sIHdlbm4gbGFlbmdlciBhbHMgOTAgVGFnZSBoZXIgdW5kIG5pY2h0CisgIC8vIGVpbmdlbG9nZ3QsIHdpcmQgZGVyIFNwaWVsZXIgdWViZXJzcHJ1bmdlbi4KKyAgLy8gRGVyIHBsYXllcmRhdGEgYnJhdWNodCBlaW5lIFVJRCwgbWl0IGRlciBlciBkYXMgU3BpZWxlcnNhdmVmaWxlIGxhZGVuCisgIC8vIGthbm4uIEhpZXJ6dSBzZXR6ZW4gd2lyIGlobSBkaWUgZGVzIHp1IGxhZGVuZGVuIFNwaWVsZXJzLi4uCisgIHBsZGF0YS0+UmVsZWFzZVBsYXllcigpOworICBzZXRldWlkKHBsKTsKKyAgZWZ1bjo6ZXhwb3J0X3VpZChwbGRhdGEpOworICBzZXRldWlkKGdldHVpZCh0aGlzX29iamVjdCgpKSk7CisgIChpbnQpcGxkYXRhLT5Mb2FkUGxheWVyKHBsKTsKKyAgLy8gVGVzdHNwaWVsZXIgYXVzbmVobWVuLCBTcGllbGVyLCBkaWUgOTAgVGFnZSBuaWNodCBkYSB3YXJlbi4KKyAgaWYgKCAoKGludClwbGRhdGEtPlF1ZXJ5UHJvcChQX0xBU1RfTE9HSU4pIDwgdGltZSgpIC0gNzc3NjAwMAorICAgICAgICAmJiAhZmluZF9wbGF5ZXIocGwpKQorICAgICAgfHwgKG1peGVkKXBsZGF0YS0+UXVlcnlQcm9wKFBfVEVTVFBMQVlFUikpCisgICAgcmV0dXJuOworICAvLyBXZW5uIGtlaW4gU1BpZWxlci9TZWhlciwgc29uZGVybiBNYWdpZXI6IGF1Y2ggdWViZXJzcHJpbmdlbgorICBtaXhlZCogdWluZm8gPSAobWl4ZWQqKW1hc3RlcigpLT5nZXRfdXNlcmluZm8ocGwpOworICBpZiAodWluZm9bVVNFUl9MRVZFTCsxXSA+PSBMRUFSTkVSX0xWTCkKKyAgICByZXR1cm47CisKKyAgc3RyaW5nIGVwcz0oc3RyaW5nKW1hc3RlcigpLT5xdWVyeV9lcChwbCkgfHwgIiI7CisgIGludCBwPS0xOworICBpbnQgY291bnQsIGF2Z2NvdW50OworICB3aGlsZSAoKHA9bmV4dF9iaXQoZXBzLHApKSAhPSAtMSkKKyAgeworICAgIGlmIChwPHNpemVvZihmcF9mb3VuZCkpCisgICAgeworICAgICAgKytjb3VudDsKKyAgICAgICsrZnBfZm91bmRbcF07CisgICAgICAvLyBlcyB0cmFnZW4gbnVyIG5vcm1hbGUgRVBzIHp1bSBEdXJjaHNjaG5pdHQgYmVpCisgICAgICBpZiAoIXRlc3RfYml0KGJvbnVzLHApKQorICAgICAgICArK2F2Z2NvdW50OworICAgIH0KKyAgfQorCisgIC8vIFNwaWVsZXIgbWl0IHdlbmlnZXIgYWxzIE1JTl9FUCBpZ25vcmllcmVuLgorICBpZiAoYXZnY291bnQgPj0gTUlOX0VQKQorICB7CisgICAgZXh0cmFbNF0gKz0gYXZnY291bnQ7ICAgLy8gU3VtbWUgZGVyIGdlZnVuZGVuZW4gRlAKKyAgICArK2V4dHJhWzVdOyAgICAgICAgICAvLyBBbnphaGwgYmVydWVja3NpY2h0aWd0ZXIgU3BpZWxlcgorICB9CisgIHBsc3RhdCArPSAoWyBwbCA6IGNvdW50IF0pOworICBpZiAoIW1lbWJlcihwbnN0YXQsIGNvdW50KSkKKyAgICBwbnN0YXQgKz0gKFsgY291bnQgOiAoeyBwbCB9KSBdKTsKKyAgZWxzZQorICAgIHBuc3RhdFtjb3VudF0gPSAoeyBwbCB9KStwbnN0YXRbY291bnRdOworfQorCisvLyBNaXQgYWxsZW4gU3BpZWxlcm4gZmVydGlnLCBhdWZyYWV1bWVuLgorI2RlZmluZSBCQVIgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIKK3ByaXZhdGUgdm9pZCBwbGNoZWNrX2ZpbmlzaGVkKG1peGVkIGV4dHJhKQoreworICBaREVCVUcoInBsY2hlY2tfZmluaXNoZWQgZW50cnlcbiIpOworICBpZiAoZ2V0X2V2YWxfY29zdCgpIDwgMTAwMDAwMCkKKyAgeworICAgIGNhbGxfb3V0KCMncGxjaGVja19maW5pc2hlZCwgNCtyYW5kb20oNiksIGV4dHJhKTsKKyAgICByZXR1cm47CisgIH0KKworICBpbnQgKmZwX2ZvdW5kID0gZXh0cmFbMF07CisgIG1hcHBpbmcgcGxzdGF0ID0gZXh0cmFbMV07CisgIG1hcHBpbmcgcG5zdGF0ID0gZXh0cmFbMl07CisgIG9iamVjdCBwbGRhdGEgPSBleHRyYVszXTsKKyAgaW50IGF2Z2NvdW50ID0gZXh0cmFbNF07CisgIGludCBhdmdzcGllbGVyID0gZXh0cmFbNV07CisKKyAgaWYgKG9iamVjdHAocGxkYXRhKSkKKyAgICBwbGRhdGEtPnJlbW92ZSgxKTsKKworICBpZiAoZmlsZV9zaXplKEJZX0VQKSA+PSAwKQorICAgIHJtKEJZX0VQKTsKKyAgaWYgKGZpbGVfc2l6ZShCWV9QTCkgPj0gMCkKKyAgICBybShCWV9QTCk7CisgIGlmIChmaWxlX3NpemUoQllfUE4pID49IDApCisgICAgcm0oQllfUE4pOworCisgIC8vIE5ldWVuIER1cmNoc2Nobml0dHN3ZXJ0IGZ1ZXIgZ2VmdW5kZW5lIEZQIHNldHplbi4KKyAgaWYgKGF2Z3NwaWVsZXIpCisgIHsKKyAgICBTZXRBdmVyYWdlKHRvX2ludChhdmdjb3VudC9hdmdzcGllbGVyKSk7CisgIH0KKworICAvLyBIaXN0b2dyYW1tIHVlYmVyIGFsbGUgRlAgc2NocmVpYmVuOiB3aWUgb2Z0IHd1cmRlIGplZGVyIGdlZnVuZGVuPworICBpbnQgbWF4dmFsID0gbWF4KGZwX2ZvdW5kKTsKKyAgaW50IGZwX2luZGV4OworICBmb3JlYWNoKGludCBmb3VuZCA6IGZwX2ZvdW5kKQorICB7CisgICAgd3JpdGVfZmlsZShCWV9FUCwgc3ByaW50ZigiJTVkOiU1ZCAlc1xuIiwgZnBfaW5kZXgsIGZvdW5kLAorICAgICAgICAgICAgICAgQkFSWzAuLig2MCpmb3VuZCkvbWF4dmFsXSkpOworICAgICsrZnBfaW5kZXg7CisgIH0KKyAgLy8gc29ydGllcnRlIExpc3RlIGRlciBTcGllbGVyIChzb3J0aWVydCBuYWNoIGdlZnVuZGVuZW4gRlApIGVyemV1Z2VuCisgIGZvcmVhY2goaW50IGZwIDogc29ydF9hcnJheShtX2luZGljZXMocG5zdGF0KSwjJzwpICkKKyAgeworICAgIGZvcmVhY2goc3RyaW5nIHBsIDogcG5zdGF0W2ZwXSkKKyAgICAgIHdyaXRlX2ZpbGUoQllfUE4sIHNwcmludGYoIiUtMTRzOiAlNWRcbiIsIHBsLCBmcCkpOworICB9CisgIC8vIGFscGhhYmV0aXNjaCBzb3J0aWVydGUgTGlzdGUgZGVyIFNwaWVsZXIgZXJ6ZXVnZW4KKyAgZm9yZWFjaChzdHJpbmcgcGwgOiBzb3J0X2FycmF5KG1faW5kaWNlcyhwbHN0YXQpLCMnPikgKQorICB7CisgICAgd3JpdGVfZmlsZShCWV9QTCwgc3ByaW50ZigiJS0xNHM6ICU1ZFxuIiwgcGwsIHBsc3RhdFtwbF0pKTsKKyAgfQorfQorI3VuZGVmIEJBUgorCitwcml2YXRlIHZvaWQgbWFrZV9zdGF0KCkKK3sKKyAgc3RhdF9kb25lID0gdGltZSgpOworICAvLyBMZWlkZXIgbGFlc3N0IHNpY2ggZXBjb3VudCBuaWNodCBudXR6ZW4gQmVpbSBMb2VzY2hlbiB2b24gRlAgd2lyZAorICAvLyA8ZXBjb3VudD4gZGVrcmVtZW50aWVydCwgc28gZGFzcyBoaWVyIG5pY2h0IG1laHIgYWxsZSBGUHMgYXVzZ2V3ZXJ0ZXQKKyAgLy8gd2VyZGVuLiBEYWhlciBtdXNzIHN0YXR0ZGVzc2VuIGJpcyB6dXIgR2VzYW10Z3JvZXNzZSB2b24gPG9icz4gZ2V6YWVobHQKKyAgLy8gd2VyZGVuLgorICBpbnQqIGZwX2ZvdW5kID0gYWxsb2NhdGUoc2l6ZW9mKG9icykpOworICBtYXBwaW5nIHBsc3RhdCA9IG1fYWxsb2NhdGUoNTAwKTsKKyAgbWFwcGluZyBwbnN0YXQgPSBtX2FsbG9jYXRlKDUwMCk7CisgIHN0YXJ0X3BsYXllcl9jaGVjaygjJ2NoZWNrX3BsYXllciwgIydwbGNoZWNrX2ZpbmlzaGVkLCAxMjAwMDAwLAorICAgICAgICAgICAgICAgICAgICAgKHtmcF9mb3VuZCxwbHN0YXQscG5zdGF0LAorICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwfSkgKTsKK30KKwordm9pZCByZXNldCgpCit7CisgIGlmIChjaGFuZ2VkICYmICFkdW1waW5nKQorICB7CisgICAgY2F0Y2gocm0oRFVNUEZJTEUpO3B1Ymxpc2gpOworICAgIGR1bXBpbmcgPSAxOworICAgIGNhbGxfb3V0KCJkdW1wRVBPYmplY3RzIiwgMCwgc29ydF9hcnJheShtX2luZGljZXMob2JzKSwjJz4gLyonKi8pKTsKKyAgICBjaGFuZ2VkID0gMDsKKyAgfQorICAvLyBudXIgZWlubWFsIGFtIHRhZyBzdGF0aXN0aWtlbiBlcnN0ZWxsZW4KKyAgaWYgKHRpbWUoKSU4NjQwMCA8IDQwMDAKKyAgICAgICYmIHN0YXRfZG9uZSA8IHRpbWUoKS04MDAwMCkKKyAgICBtYWtlX3N0YXQoKTsKK30KKworcHJpdmF0ZSBzdHJpbmcgc3RyQXJyKHN0cmluZyAqcykKK3sKKyAgc3RyaW5nIHJldDsKKyAgaW50IGk7CisKKyAgcmV0ID0gKCJcIiIrc1s8MV0rIlwiIik7CisgIGZvciAoaT1zaXplb2YocyktMjsgaT49MDsgaS0tKQorICAgIHJldCArPSAoIiwgXCIiK3NbaV0rIlwiIik7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZHVtcEVQT2JqZWN0cyhzdHJpbmcgKmRvaXQpCit7CisgIHN0cmluZyAqdG9HbywgaWQ7CisgIGludCBpLGo7CisKKyAgaWYgKCFtYXBwaW5ncChkdW1wTWFwKSkKKyAgICBkdW1wTWFwID0gKFtdKTsKKworICB0b0dvID0gMDsKKyAgaWYgKHNpemVvZihkb2l0KSA+IDIwMCkgeworICAgIHRvR28gPSBkb2l0WzIwMC4uXTsKKyAgICBkb2l0ID0gZG9pdFswLi4xOTldOworICB9CisKKyAgaiA9IHNpemVvZihkb2l0KTsKKworICBmb3IgKGk9MDsgaTxqOyBpKyspIHsKKyAgICBpZCA9IChzdHJpbmcpbWFzdGVyKCktPmNyZWF0b3JfZmlsZShkb2l0W2ldKTsKKyAgICBpZiAobWVtYmVyKGR1bXBNYXAsIGlkKSkKKyAgICAgIGR1bXBNYXBbaWRdICs9ICh7IGRvaXRbaV0gfSk7CisgICAgZWxzZQorICAgICAgZHVtcE1hcCArPSAoWyBpZCA6ICh7IGRvaXRbaV0gfSkgXSk7CisgIH0KKyAgaWYgKHRvR28pCisgICAgY2FsbF9vdXQoImR1bXBFUE9iamVjdHMiLCAxLCB0b0dvKTsKKyAgZWxzZSB7CisgICAgaW50IHN0ZXA7CisKKyAgICBzdGVwID0gMDsKKyAgICBpZCA9ICIiOworICAgIHRvR28gPSBzb3J0X2FycmF5KG1faW5kaWNlcyhkdW1wTWFwKSwjJz4gLyonKi8gKTsKKyAgICBmb3IgKGk9MCwgaj1zaXplb2YodG9Hbyk7IGk8ajsgaSsrKSB7CisgICAgICBpbnQgayxsOworICAgICAgZG9pdCA9IGR1bXBNYXBbdG9Hb1tpXV07CisgICAgICBpZCArPSBzcHJpbnRmKCIjIyMgJXMgJXNcbiIsIHRvR29baV0sICIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIltzaXplb2YodG9Hb1tpXSkuLl0pOworICAgICAgZm9yIChrPTAsIGw9c2l6ZW9mKGRvaXQpOyBrPGw7IGsrKykgeworICAgICAgICBpZCArPSBzcHJpbnRmKCIlcyAlNGQgJXMgJXMuYyAoeyAlcyB9KVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBFUF9UWVBFU1tvYnNbZG9pdFtrXSwgTVBPU19UWVBFXV0sCisgICAgICAgICAgICAgICAgICAgICAgb2JzW2RvaXRba10sIE1QT1NfTlVNXSwKKyAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2JpdChib251cyxvYnNbZG9pdFtrXSwgTVBPU19OVU1dKT8iYiI6Im4iLAorICAgICAgICAgICAgICAgICAgICAgIGRvaXRba10sCisgICAgICAgICAgICAgICAgICAgICAgc3RyQXJyKG9ic1tkb2l0W2tdXSkpOworICAgICAgICBpZiAoISgrK3N0ZXAgJSA1MCkpIHsKKyAgICAgICAgICB3cml0ZV9maWxlKERVTVBGSUxFLCBpZCk7CisgICAgICAgICAgaWQgPSAiIjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWQgKz0gIlxuIjsKKyAgICB9CisgICAgd3JpdGVfZmlsZShEVU1QRklMRSxpZCk7CisgICAgaWYgKGR1bXBpbmcgPT0gMikKKyAgICAgIHdyaXRlKCJGZXJ0aWchIEFuZnJhZ2UgYml0dGUgd2llZGVyaG9sZW4uXG4iKTsKKyAgICBkdW1waW5nID0gMDsKKyAgICBjaGFuZ2VkID0gMDsKKyAgICBkdW1wTWFwID0gMDsKKyAgfQorfQorCitwcml2YXRlIHN0cmluZyB2YWxpZE9iKG1peGVkIG9iKQoreworICBzdHJpbmcgZm4sIGZwYXJ0OworCisgIGlmICghb2JqZWN0cChvYikpCisgICAgcmV0dXJuIDA7CisKKyAgZm4gPSBvbGRfZXhwbG9kZShvYmplY3RfbmFtZShvYiksIiMiKVswXTsKKyAgZnBhcnQgPSBvbGRfZXhwbG9kZShmbiwiLyIpWzwxXTsKKyAvKgorICBpZiAocXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYikpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKChmaWxlX3NpemUoZm4rIi5jIikgPD0gMCkgJiYKKyAgICAgIHRoaXNfcGxheWVyKCkgJiYKKyAgICAgIChzdHJzdHIoZnBhcnQsIGdldHVpZCh0aGlzX3BsYXllcigpKSkgPj0gMCkpCisgICAgcmV0dXJuIDA7CisgKi8KKyAgcmV0dXJuIGZuOworfQorCitwcml2YXRlIGludCBhbGxvd2VkKCkKK3sKKyAgaWYgKHByZXZpb3VzX29iamVjdCgpICYmIGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpPT1ST09USUQpCisgICAgcmV0dXJuIDE7CisgIGlmICggIXByb2Nlc3NfY2FsbCgpICYmIHByZXZpb3VzX29iamVjdCgpICYmIHRoaXNfaW50ZXJhY3RpdmUoKQorICAgICAgICAmJiBBUkNIX1NFQ1VSSVRZICkKKyAgICByZXR1cm4gMTsKKworICByZXR1cm4gMDsKK30KKworbm9tYXNrIHZhcmFyZ3MgaW50IEFkZEVQT2JqZWN0KG9iamVjdCBvYiwgbWl4ZWQga2V5cywgaW50IHR5cGUsIGludCBib251c2ZsYWcpCit7CisgIHN0cmluZyBmbjsKKworICBpZiAoIWFsbG93ZWQoKSkKKyAgICByZXR1cm4gRVBFUlJfTk9UX0FSQ0g7CisKKyAgaWYgKCEoZm4gPSB2YWxpZE9iKG9iKSkpCisgICAgcmV0dXJuIEVQRVJSX0lOVkFMSURfT0I7CisKKyAgaWYgKHN0cmluZ3Aoa2V5cykpCisgICAga2V5cyA9ICh7IGtleXMgfSk7CisKKyAgaWYgKG1lbWJlcihvYnMsIGZuKSkgeworICAgIGlmICh0eXBlID09IG9ic1tmbiwgTVBPU19UWVBFXSkKKyAgICAgIG9ic1tmbl0gPSBrZXlzOworICAgIGVsc2UKKyAgICAgIG9icyArPSAoWyBmbiA6IGtleXM7IG9ic1tmbiwgTVBPU19OVU1dOyB0eXBlIF0pOworICAgIGlmIChib251c2ZsYWcpIGJvbnVzID0gc2V0X2JpdChib251cywgb2JzW2ZuLCBNUE9TX05VTV0pOworICAgICAgIGVsc2UgYm9udXMgPSBjbGVhcl9iaXQoYm9udXMsIG9ic1tmbiwgTVBPU19OVU1dKTsKKyAgfQorICBlbHNlIHsKKyAgICBpbnQgbnIsIGk7CisKKyAgICBuciA9IDA7CisgICAgd2hpbGUgKHRlc3RfYml0KGFsbG9jLG5yKSkKKyAgICAgIG5yKys7CisKKyAgICBvYnMgKz0gKFsgZm4gOiBrZXlzOyBucjsgdHlwZSBdKTsKKyAgICArK2VwY291bnQ7CisgICAgYWxsb2MgPSBzZXRfYml0KGFsbG9jLG5yKTsKKyAgICBpZiAoYm9udXNmbGFnKSBib251cyA9IHNldF9iaXQoYm9udXMsbnIpOworICAgICAgIGVsc2UgYm9udXMgPSBjbGVhcl9iaXQoYm9udXMsbnIpOworICB9CisKKyAgY2hhbmdlZCA9IDE7CisgIHNhdmVfb2JqZWN0KEVQU0FWRUZJTEUpOworICByZXR1cm4gZXBjb3VudDsKK30KKworbm9tYXNrIGludCBSZW1vdmVFUE9iamVjdChzdHJpbmd8b2JqZWN0IG9iKQoreworICBzdHJpbmcgZm47CisKKyAgaWYgKCFhbGxvd2VkKCkpCisgICAgcmV0dXJuIEVQRVJSX05PVF9BUkNIOworICAKKyAgaWYgKG9iamVjdHAob2IpKQorICAgIG9iPW9iamVjdF9uYW1lKG9iKTsKKworICBmbiA9IGV4cGxvZGUob2IsIiMiKVswXTsKKyAgaWYgKCFtZW1iZXIob2JzLGZuKSkKKyAgICByZXR1cm4gRVBFUlJfTk9fRU5UUlk7CisKKyAgYWxsb2MgPSBjbGVhcl9iaXQoYWxsb2MsIG9ic1tmbiwgTVBPU19OVU1dKTsKKyAgYm9udXMgPSBjbGVhcl9iaXQoYm9udXMsIG9ic1tmbiwgTVBPU19OVU1dKTsKKworICBtX2RlbGV0ZShvYnMsIGZuKTsKKworICBjaGFuZ2VkID0gMTsKKyAgLS1lcGNvdW50OworICBzYXZlX29iamVjdChFUFNBVkVGSUxFKTsKKyAgcmV0dXJuIGVwY291bnQ7Cit9CisKK25vbWFzayBpbnQgQ2hhbmdlRVBPYmplY3Qob2JqZWN0IG9iLCBpbnQgd2hhdCwgbWl4ZWQgbmV3KQoreworICBzdHJpbmcgZm4sIGZuMjsKKyAgbWFwcGluZyBlbnRyeTsKKworICBpZiAoIWFsbG93ZWQoKSkKKyAgICByZXR1cm4gRVBFUlJfTk9UX0FSQ0g7CisKKyAgaWYgKCEoZm4gPSB2YWxpZE9iKG9iKSkpCisgICAgcmV0dXJuIEVQRVJSX0lOVkFMSURfT0I7CisKKyAgaWYgKCFtZW1iZXIob2JzLGZuKSkKKyAgICByZXR1cm4gRVBFUlJfTk9fRU5UUlk7CisKKyAgc3dpdGNoKHdoYXQpIHsKKyAgY2FzZSBDSEFOR0VfT0I6CisgICAgaWYgKCEoZm4yID0gdmFsaWRPYihuZXcpKSkKKyAgICAgIHJldHVybiBFUEVSUl9JTlZBTElEX0FSRzsKKyAgICBlbnRyeSA9IChbIGZuMjogb2JzW2ZuXTsgb2JzW2ZuLE1QT1NfTlVNXTsgb2JzW2ZuLE1QT1NfVFlQRV0gXSk7CisgICAgb2JzID0gbV9jb3B5X2RlbGV0ZShvYnMsIGZuKTsKKyAgICBvYnMgKz0gZW50cnk7CisgICAgYnJlYWs7CisgIGNhc2UgQ0hBTkdFX0JPTlVTOgorICAgIGlmICghKGludHAobmV3KSkpCisgICAgICByZXR1cm4gRVBFUlJfSU5WQUxJRF9BUkc7CisgICAgaWYgKG5ldykgYm9udXM9c2V0X2JpdChib251cyxvYnNbZm4sTVBPU19OVU1dKTsKKyAgICAgICBlbHNlIGJvbnVzPWNsZWFyX2JpdChib251cyxvYnNbZm4sTVBPU19OVU1dKTsKKyAgICBicmVhazsKKyAgY2FzZSBDSEFOR0VfS0VZOgorICAgIGlmICghc3RyaW5ncChuZXcpICYmICFwb2ludGVycChuZXcpKQorICAgICAgcmV0dXJuIEVQRVJSX0lOVkFMSURfQVJHOworICAgICAgIAorICAgIGlmIChzdHJpbmdwKG5ldykpCisgICAgICBuZXcgPSAoeyBuZXcgfSk7CisKKyAgICBvYnNbZm5dID0gbmV3OworICAgIGJyZWFrOworICBjYXNlIENIQU5HRV9UWVBFOgorICAgIGlmICghaW50cChuZXcpIHx8IG5ldyA8IDAgfHwgbmV3ID4gRVBfTUFYKQorICAgICAgcmV0dXJuIEVQRVJSX0lOVkFMSURfQVJHOworCisgICAgb2JzW2ZuLCBNUE9TX1RZUEVdID0gbmV3OworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIHJldHVybiBFUEVSUl9JTlZBTElEX0FSRzsKKyAgfQorICBjaGFuZ2VkID0gMTsKKyAgc2F2ZV9vYmplY3QoRVBTQVZFRklMRSk7CisgIHJldHVybiAxOworfQorCitub21hc2sgbWl4ZWQgUXVlcnlFUE9iamVjdChvYmplY3Qgb2IpCit7CisgIHN0cmluZyBmbjsKKworICBpZiAoIWFsbG93ZWQoKSkKKyAgICByZXR1cm4gRVBFUlJfTk9UX0FSQ0g7CisKKyAgaWYgKCEoZm4gPSB2YWxpZE9iKG9iKSkpCisgICAgcmV0dXJuIEVQRVJSX0lOVkFMSURfT0I7CisKKyAgaWYgKCFtZW1iZXIob2JzLCBmbikpCisgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuICh7IG9ic1tmbl0sIG9ic1tmbixNUE9TX05VTV0sIG9ic1tmbiwgTVBPU19UWVBFXSwgdGVzdF9iaXQoYm9udXMsb2JzW2ZuLCBNUE9TX05VTV0pIH0pOworfQorCitwcml2YXRlIHN0cmluZyBnZXRNYXRjaChzdHJpbmcgbSkKK3sKKyAgc3RyaW5nICpyZXM7CisgIGludCBpOworCisgIHJlcyA9IHJlZ2V4cChzb3J0X2FycmF5KG1faW5kaWNlcyhvYnMpLCAjJz4gLyonKi8pLCBtKTsKKyAgZm9yIChpPXNpemVvZihyZXMpLTE7IGk+PTA7IGktLSkKKyAgICByZXNbaV0gPSBzcHJpbnRmKCIlcyAlcyAlcy5jICh7ICVzIH0pIiwKKyAgICAgICAgICAgICAgICAgICAgIEVQX1RZUEVTW29ic1tyZXNbaV0sIE1QT1NfVFlQRV1dLAorICAgICAgICAgICAgICAgICAgICAgdGVzdF9iaXQoYm9udXMsb2JzW3Jlc1tpXSwgTVBPU19OVU1dKT8iYiI6Im4iLAorICAgICAgICAgICAgICAgICAgICAgcmVzW2ldLAorICAgICAgICAgICAgICAgICAgICAgc3RyQXJyKG9ic1tyZXNbaV1dKSk7CisgIHJldHVybiBpbXBsb2RlKHJlcywgIlxuIik7Cit9CisKK3ByaXZhdGUgc3RyaW5nIGdldE1hdGNoQXJjaChzdHJpbmcgbSkKK3sKKyAgc3RyaW5nICpyZXM7CisgIGludCBpOworCisgIHJlcyA9IHJlZ2V4cChzb3J0X2FycmF5KG1faW5kaWNlcyhvYnMpLCAjJz4gLyonKi8pLCBtKTsKKyAgZm9yIChpPXNpemVvZihyZXMpLTE7IGk+PTA7IGktLSkKKyAgICByZXNbaV0gPSBzcHJpbnRmKCIlcyAlNGQgJXMgJXMuYyAoeyAlcyB9KSIsCisgICAgICAgICAgICAgICAgICAgICBFUF9UWVBFU1tvYnNbcmVzW2ldLCBNUE9TX1RZUEVdXSwKKyAgICAgICAgICAgICAgICAgICAgIG9ic1tyZXNbaV0sIE1QT1NfTlVNXSwKKyAgICAgICAgICAgICAgICAgICAgIHRlc3RfYml0KGJvbnVzLG9ic1tyZXNbaV0sIE1QT1NfTlVNXSk/ImIiOiJuIiwKKyAgICAgICAgICAgICAgICAgICAgIHJlc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgIHN0ckFycihvYnNbcmVzW2ldXSkpOworICByZXR1cm4gaW1wbG9kZShyZXMsICJcbiIpOworfQorCisvKgorICogIEFubGVpdHVuZyBmdWVyID49RU1zOgorICogICAgU2hvd0VQT2JqZWN0cygpIHplaWd0IGRhcyBnZXNhbXRlIER1bXBmaWxlIGFuCisgKiAgICBTaG93RVBPYmplY3RzKCJkdW1wIikgZXJ6ZXVndCBlaW4gbmV1ZXMgRHVtcGZpbGUKKyAqICAgIFNob3dFUE9iamVjdHMoInN0cmluZyIpIGxpZWZlcnQgYWxsZSBFUHMsIGRpZSAiL3N0cmluZy8iCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbSBGaWxlbmFtZW4gZW50aGFsdGVuCisgKiAgICBTaG93RVBPYmplY3RzKCJzdHJpbmcxIiwic3RyaW5nMiIpIGxpZWZlcnQgYWxsZSBFUHMsIGRpZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9zdHJpbmcxL3N0cmluZzIvIiBpbSBGaWxlbmFtZW4gZW50aGFsdGVuCisgKiAgQW5sZWl0dW5nIGZ1ZXIgUk1zOgorICogICAgU2hvd0VQT2JqZWN0cygpIGxpZWZlcnQgYWxsIERlaW5lIEVQcworICogICAgU2hvd0VQT2JqZWN0cygiZG9tYWlubmFtZSIpIGxpZWZlcnQgRGVpbmUgRVBzIGluIERlaW5lciBEb21hbmluCisgKiAgICBTaG93RVBPYmplY3RzKCJkb21haW5uYW1lIiwibWFnaWVybmFtZSIpIGxpZWZlcnQgZGllIEVQcyBkZXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaXRhcmJlaXRlcnMgaW4gRGVpbmVyIFJlZ2lvbgorICoKKyAqICBBbmxlaXR1bmcgZnVlciA8Uk1zOgorICogICAgU2hvd0VQT2JqZWN0cygpIGxpZWZlcnQgRGVpbmUgRVBzCisgKgorICogIEFsbGUgRVBPYmplY3RzIGVpbmVyIGdhbnplbiBEb21haW4ga2FubiBtYW4gbmljaHQgbWVociBhdWYgZWlubWFsCisgKiAgemllaGVuIHVuZCBzb2xsdGUgbWFuIGF1Y2ggbmljaHQuIEFsbGUgWnVncmlmZmUgYXVmIGRpZXNlIEZ1bmt0aW9uCisgKiAgd2VyZGVuIGdlbG9nZ3QuIEF1Y2ggZGllIGRlciBFTXMhCisgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSaWt1cworICovCisKK25vbWFzayB2YXJhcmdzIHZvaWQgU2hvd0VQT2JqZWN0cyhzdHJpbmcgd2hhdCwgc3RyaW5nIG1hZ25hbWUpCit7CisgIGlmIChhbGxvd2VkKCkpIHsKKyAgICBpZiAod2hhdCA9PSAiZHVtcCIpIHsKKyAgICAgIGlmICghZHVtcGluZykgeworICAgICAgICBkdW1waW5nID0gMjsKKyAgICAgICAgY2F0Y2gocm0oRFVNUEZJTEUpO3B1Ymxpc2gpOworICAgICAgICBjYWxsX291dCgiZHVtcEVQT2JqZWN0cyIsIDAsIHNvcnRfYXJyYXkobV9pbmRpY2VzKG9icyksIyc+LyonKi8pKTsKKyAgICAgIH0KKyAgICAgIHByaW50ZigiTGlzdGUgd2lyZCBlcnN0ZWxsdCB1bmQgaW4gJyVzJyBhYmdlbGVndCFcbiIsIERVTVBGSUxFKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCF3aGF0IHx8IHdoYXQgPT0gIiIpIHsKKyAgICAgIHRoaXNfaW50ZXJhY3RpdmUoKS0+TW9yZShEVU1QRklMRSwgMSk7CisgICAgICBsb2dfZmlsZSgiQVJDSC9FUFp1Z3JpZmZlIiwgY3RpbWUodGltZSgpKSsiOiAiKworICAgICAgICBjYXBpdGFsaXplKGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpKSsiIHNjaGF1dGUgc2ljaCBkYXMgRFVNUEZJTEUgYW4uXG4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgd2hhdD0iLyIrd2hhdCsiLyI7CisgICAgaWYgKG1hZ25hbWUpIHdoYXQrPW1hZ25hbWUrIi8iOworICB9CisgIGVsc2UKKyNpZmRlZiBET01BSU5fSU5GTworICAgIGlmIChJU19MT1JEKHRoaXNfaW50ZXJhY3RpdmUoKSkpIHsKKyAgICAgIGlmICghd2hhdCB8fCB3aGF0ID09ICIiKQorICAgICAgIHdoYXQgPSAiLyIrZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSkrIi8iOworICAgICAgZWxzZSB7CisgICAgICAgaWYgKCFtYXN0ZXIoKS0+ZG9tYWluX21hc3RlcihnZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpKSwgd2hhdCkpIHsKKyAgICAgICAgIHdyaXRlKCJTb3JyeSwgRHUga2FubnN0IG51ciBPYmpla3RlIGluIERlaW5lciBlaWdlbmVuIFJlZ2lvbiBhYmZyYWdlbiFcbiIpOworICAgICAgICAgcmV0dXJuOworICAgICAgIH0KKyAgICAgICBpZiAoIW1hZ25hbWUgfHwgbWFnbmFtZT09IiIpCisgICAgICAgICBtYWduYW1lID0gZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSk7CisvLyAgICAgICAgaWYgKCFtYXN0ZXIoKS0+ZG9tYWluX21lbWJlcihtYWduYW1lLCB3aGF0KSkgeworLy8gICAgICAgICB3cml0ZShjYXBpdGFsaXplKG1hZ25hbWUpKyIgaXN0IGdhciBrZWluIE1pdGFyYmVpdGVyIGluIERlaW5lciBSZWdpb24hXG4iKTsKKy8vICAgICAgICAgIHJldHVybjsKKy8vICAgICAgIH0KKyAgICAgICB3aGF0ID0gIi9kLyIrd2hhdCsiLyIrbWFnbmFtZSsiLyI7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgICAgeworICAgICAgIGlmICghd2hhdCB8fCB3aGF0ID09ICIiKQorICAgICAgICAgd2hhdCA9IGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpOworICAgICAgIGVsc2UgaWYgKHdoYXQgIT0gZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSkpIHsKKyAgICAgICAgIHdyaXRlKCJTb3JyeSwgRHUga2FubnN0IG51ciBEZWluZSBlaWdlbmVuIE9iamVrdGUgYWJmcmFnZW4hXG4iKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgICB9CisgICAgICAgd2hhdD0iLyIrd2hhdCsiLyI7CisgICAgICB9CisgIGlmIChhbGxvd2VkKCkpCisgICAgdGhpc19pbnRlcmFjdGl2ZSgpLT5Nb3JlKGdldE1hdGNoQXJjaCh3aGF0KSk7CisgIGVsc2UKKyAgICB0aGlzX2ludGVyYWN0aXZlKCktPk1vcmUoZ2V0TWF0Y2god2hhdCkpOworICBsb2dfZmlsZSgiQVJDSC9FUFp1Z3JpZmZlIiwgY3RpbWUodGltZSgpKSsiOiAiKworICAgIGNhcGl0YWxpemUoZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSkpKyIgc2NoYXV0ZSBzaWNoICIrd2hhdCsiIGFuLlxuIik7CisgIHJldHVybjsKK30KKworbm9tYXNrIHZvaWQgUHJlcGFyZVZDUXVlcnkoc3RyaW5nIGZpbGUpCit7CisgIHN0cmluZyBwYXRoLCAqcGFydHM7CisKKyAgdmNfb2IgPSAwOworCisgIGlmICghcHJldmlvdXNfb2JqZWN0KCkgfHwgIXN0cmluZ3AoZmlsZSkpCisgICAgcmV0dXJuOworCisgIHBhcnRzID0gZXhwbG9kZShvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSksIi8iKTsKKworICBpZiAocGFydHNbPDFdID09ICJ2aXJ0dWFsX2NvbXBpbGVyIikgeworICAgIHBhdGggPSBpbXBsb2RlKHBhcnRzWzAuLjwyXSsoeyBmaWxlIH0pLCAiLyIpOworICAgIGlmIChmaWxlX3NpemUocGF0aCsiLmMiKSA8IDApCisgICAgICB2Y19vYiA9IHBhdGg7CisgIH0KK30KKworbm9tYXNrIG1peGVkICpRdWVyeUV4cGxvcmUoKQoreworICBzdHJpbmcgZm47CisKKyAgaWYgKCFwcmV2aW91c19vYmplY3QoKSkKKyAgICByZXR1cm4gMDsKKworICBpZiAoIW1lbWJlcihvYnMsIGZuID0gb2xkX2V4cGxvZGUob2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpLCIjIilbMF0pKQorICAgIGlmICghdmNfb2IgfHwgIW1lbWJlcihvYnMsIGZuID0gdmNfb2IpKSB7CisgICAgICB2Y19vYiA9IDA7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgdmNfb2IgPSAwOworICByZXR1cm4gKHsgb2JzW2ZuLCBNUE9TX1RZUEVdLCBvYnNbZm5dIH0pOworfQorCitub21hc2sgaW50IFF1ZXJ5TWF4RVAoKQoreworICByZXR1cm4gKGVwY291bnR8fDEpOworfQorCitub21hc2sgaW50IFF1ZXJ5QXZlcmFnZSgpCit7CisgIHJldHVybiAoZXBhdmd8fDEpOworfQorCitzdGF0aWMgaW50IGNoZWNrX2FyY2gob2JqZWN0IHUpCit7CisgICByZXR1cm4gcXVlcnlfd2l6X2xldmVsKHUpPj1BUkNIX0xWTDsKK30KKworcHJpdmF0ZSBpbnQgY2hlY2tfdG9fZmFzdChzdHJpbmcgbmFtZSwgc3RyaW5nIGZuLCBpbnQgZ2VzZXR6dCkKK3sKKyAgICBpZiAoZ2VzZXR6dCkgcmV0dXJuIDE7IC8vIFJpa3VzLCBzb25zdCBhcmdlciBzY3JvbGwgOikKKworICAgIGxvZ19maWxlKEZQX0xPRyxzcHJpbnRmKCIlcyA6ICVzIDogJXNcbiIsbmFtZSxmbixkdGltZSh0aW1lKCkpKSw1MDAwMDApOworCisgICAgaWYgKCAhbWVtYmVyKCBsYXN0Zm91bmQsIG5hbWUgKSApCisgICAgICAgIGxhc3Rmb3VuZCArPSAoWyBuYW1lOiB0aW1lKCk7IDE7ICh7IGZuICsgIiMqIyIgKyBkdGltZSh0aW1lKCkpICsgIiMqIyIgK2dlc2V0enQgfSkgXSk7CisgICAgZWxzZSBpZiAoIHRpbWUoKSA8PSBsYXN0Zm91bmRbbmFtZSwgMF0gKyBMRl9USU1FICl7CisgICAgICAgIGxhc3Rmb3VuZFtuYW1lLCAxXSsrOworICAgICAgICBsYXN0Zm91bmRbbmFtZSwgMl0gPSAoeyBmbiArICIjKiMiICsgZHRpbWUodGltZSgpKSArICIjKiMiICtnZXNldHp0IH0pCisgICAgICAgICAgICArIGxhc3Rmb3VuZFtuYW1lLDJdOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbGFzdGZvdW5kW25hbWUsIDFdID0gMTsKKyAgICAgICAgbGFzdGZvdW5kW25hbWUsIDJdID0gKHsgZm4gKyAiIyojIiArIGR0aW1lKHRpbWUoKSkgKyAiIyojIiArZ2VzZXR6dCB9KTsKKyAgICB9CisKKyAgICBsYXN0Zm91bmRbbmFtZSwgMF0gPSB0aW1lKCk7CisKKyAgICBpZiAoIGxhc3Rmb3VuZFtuYW1lLCAxXSA+PSBMRl9XQVJOICl7CisgICAgICAgIG9iamVjdCAqdTsKKyAgICAgICAgaW50IGk7CisgICAgICAgIHN0cmluZyAqdG1wOworCisvLyAgICAgICAgdSA9IGZpbHRlciggdXNlcnMoKSwgImNoZWNrX2FyY2giICk7CisvLyAgICAgICAgbWFwKCB1LCAjJ3RlbGxfb2JqZWN0LyonKi8sICIqKioqIEZQLUxpc3RlL1NjcmlwdCAiICsKKy8vICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUobmFtZSkgKyAiICgiICsgZHRpbWUodGltZSgpKSArICIpICoqKipcbiIgKTsKKworICAgICAgICBmb3IgKCBpID0gc2l6ZW9mKGxhc3Rmb3VuZFtuYW1lLCAyXSk7IGktLTsgKXsKKyAgICAgICAgICAgIHRtcCA9IGV4cGxvZGUoIGxhc3Rmb3VuZFtuYW1lLCAyXVtpXSwgIiMqIyIgKTsKKyAgICAgICAgICAgIGxvZ19maWxlKCBMRl9MT0csIHNwcmludGYoICIlcyA6ICVzIDogJXMgOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wWzFdLCBuYW1lLCB0bXBbMl0sIHRtcFswXSApLCA1MDAwMDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIGxhc3Rmb3VuZFtuYW1lLCAyXSA9ICh7fSk7CisgICAgfQorICAgIHJldHVybiAxOworfQorCitub21hc2sgaW50IEdpdmVFeHBsb3JhdGlvblBvaW50KHN0cmluZyBrZXkpCit7CisgIHN0cmluZyBmbjsKKyAgc3RyaW5nIGVwOworICBpbnQgZ2VzZXR6dDsKKworICBpZiAoIXByZXZpb3VzX29iamVjdCgpIHx8ICF0aGlzX2ludGVyYWN0aXZlKCkgfHwgIXRoaXNfcGxheWVyKCkgfHwKKyAgICAgICB0aGlzX3BsYXllcigpICE9IHRoaXNfaW50ZXJhY3RpdmUoKSB8fAorICAgICAgIHRoaXNfcGxheWVyKCktPlF1ZXJ5UHJvcChQX0tJTExTKSB8fAorICAgICAgIHRoaXNfcGxheWVyKCktPlF1ZXJ5R3Vlc3QoKSAgICAgICApCisgICAgcmV0dXJuIDA7CisKKyAgZm4gPSBvbGRfZXhwbG9kZShvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSksICIjIilbMF07CisKKyAgaWYgKCFtZW1iZXIob2JzLCBmbikpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKG1lbWJlcihvYnNbZm5dLGtleSkgPCAwKQorICAgIHJldHVybiAwOworCisgIGVwID0gKE1BU1RFUi0+cXVlcnlfZXAoZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSkpIHx8ICIiKTsKKworICBnZXNldHp0PXRlc3RfYml0KGVwLG9ic1tmbiwxXSk7CisgIGNoZWNrX3RvX2Zhc3QoZ2V0dWlkKHRoaXNfcGxheWVyKCkpLGZuLGdlc2V0enQpOworICBpZiAoZ2VzZXR6dCkgcmV0dXJuIDA7CisgIAorICBjYXRjaChlcCA9IHNldF9iaXQoZXAsIG9ic1tmbiwxXSkpOworCisgIHJldHVybiAoaW50KU1BU1RFUi0+dXBkYXRlX2VwKGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpLGVwKTsKK30KKworbm9tYXNrIGludCBHaXZlRXhwbG9yYXRpb25Qb2ludE9iamVjdChzdHJpbmcga2V5LCBvYmplY3Qgb2IpCit7CisgIHN0cmluZyBmbjsKKyAgc3RyaW5nIGVwOworICBpbnQgZ2VzZXR6dDsKKyAgCisgIGlmICghb2JqZWN0cChvYikgfHwgb2ItPlF1ZXJ5UHJvcChQX0tJTExTICkpCisgICAgcmV0dXJuIDA7CisKKyAgZm4gPSBvbGRfZXhwbG9kZShvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSksICIjIilbMF07CisKKyAgaWYgKCFtZW1iZXIob2JzLCBmbikpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKG1lbWJlcihvYnNbZm5dLGtleSkgPCAwKQorICAgIHJldHVybiAwOworCisgIGVwID0gKE1BU1RFUi0+cXVlcnlfZXAoZ2V0dWlkKG9iKSkgfHwgIiIpOworCisgIGdlc2V0enQ9dGVzdF9iaXQoZXAsb2JzW2ZuLDFdKTsKKyAgY2hlY2tfdG9fZmFzdChnZXR1aWQodGhpc19wbGF5ZXIoKSksZm4sZ2VzZXR6dCk7CisgIGlmIChnZXNldHp0KSByZXR1cm4gMDsKKworICBjYXRjaChlcCA9IHNldF9iaXQoZXAsIG9ic1tmbiwxXSkpOworCisgIHJldHVybiAoaW50KU1BU1RFUi0+dXBkYXRlX2VwKGdldHVpZChvYiksZXApOworfQorCisKK3ByaXZhdGUgaW50IFF1ZXJ5UmVhbEV4cGxvcmF0aW9uUG9pbnRzKHN0cmluZyBwbCkKK3sKKyAgcmV0dXJuIGNvdW50X2JpdHMoTUFTVEVSLT5xdWVyeV9lcChwbCkgfHwgIiAiKTsKK30KKworbm9tYXNrIGludCBRdWVyeUV4cGxvcmF0aW9uUG9pbnRzKG1peGVkIHBsKQoreworICBtaXhlZCB2YWw7CisgIGludCBlcDsKKworICBpZiAoIXN0cmluZ3AocGwpKSBwbD1nZXR1aWQocGwpOworICBlcD1RdWVyeVJlYWxFeHBsb3JhdGlvblBvaW50cyhwbCk7CisKKyAgaWYgKGFsbG93ZWQoKSB8fCAhZXApIHJldHVybiBlcDsKKworICB2YWw9cXVlcnl0aW1lW3BsXTsKKworICBpZiAoIXBvaW50ZXJwKHZhbCkgfHwgc2l6ZW9mKHZhbCk8MikKKyAgICB2YWw9KHswLHRpbWUoKX0pOworCisgIGlmICh0aW1lKCk+PXZhbFsxXSkgeworICAgIHZhbCA9ICh7IGVwICsgcmFuZG9tKDYpLTMsIHRpbWUoKSszMDArcmFuZG9tKDMwMCkgfSk7CisgICAgaWYgKHZhbFswXTwwKSB2YWxbMF09MDsKKyAgICBxdWVyeXRpbWUrPShbcGw6dmFsXSk7CisgIH0KKyAgcmV0dXJuIHZhbFswXTsKK30KKworcHJpdmF0ZSBpbnQgcmVtb3ZlX2ZwKGludCBudW0sIHN0cmluZyBwbCkKK3sKKyAgaW50IGksaixrLHQsbWF4RVA7CisgIHN0cmluZyBlcDsKKyAgZXAgPSAoTUFTVEVSLT5xdWVyeV9lcChwbCkgfHwgIiIpOworCisgIG1heEVQID0gUXVlcnlNYXhFUCgpOworICBmb3IoIGk9MDsgaTxudW07IGkrKykKKyAgeworICAgIHQgPSByYW5kb20obWF4RVApOworICAgIGZvciggaj0wOyBqPG1heEVQOyBqKysgKSB7CisgICAgICBpZiggdGVzdF9iaXQoZXAsIGs9KHQraiklbWF4RVAgKSApIGJyZWFrOworICAgIH0KKyAgICBpZiggaj09bWF4RVAgKSBicmVhazsKKyAgICBlcCA9IGNsZWFyX2JpdChlcCwgayk7CisgIH0KKyAgTUFTVEVSLT51cGRhdGVfZXAocGwsZXApOworICByZXR1cm4gaTsKK30KKworLyogKi8KKworLy8gcXVvdGVkIGZyb20gL3N5cy9tYWlsLmgKKyNkZWZpbmUgTVNHX0ZST00gMAorI2RlZmluZSBNU0dfU0VOREVSIDEKKyNkZWZpbmUgTVNHX1JFQ0lQSUVOVCAyCisjZGVmaW5lIE1TR19DQyAzCisjZGVmaW5lIE1TR19CQ0MgNAorI2RlZmluZSBNU0dfU1VCSkVDVCA1CisjZGVmaW5lIE1TR19EQVRFIDYKKyNkZWZpbmUgTVNHX0lEIDcKKyNkZWZpbmUgTVNHX0JPRFkgOAorCitub21hc2sgaW50IFJlbW92ZUZQKGludCBudW0sIHN0cmluZyBwbCwgc3RyaW5nIGdydW5kKQoreworICBpbnQgaTsKKyAgc3RyaW5nIHRleHQ7CisgIG1peGVkKiBtYWlsOworCisgIGlmICghYWxsb3dlZCgpKSByZXR1cm4gLTE7CisgIGlmKCBudW08MCApIHJldHVybiAtMzsKKyAgaWYgKCFncnVuZCB8fCBncnVuZD09IiIpIGdydW5kPSI8dW5iZWthbm50PiI7CisgIGlmICghcGwpIHJldHVybiAtMjsKKyAgaT1yZW1vdmVfZnAobnVtLCBwbCk7CisgIGxvZ19maWxlKCJBUkNIL2ZwX3N0cmFmZW4iLCBjdGltZSh0aW1lKCkpKyI6ICIKKyAgICArdGhpc19pbnRlcmFjdGl2ZSgpLT5OYW1lKFdFUikrIiBsb2VzY2h0ICIrcGwrIiAiK2kKKyAgICArIiBGUHNcbkdydW5kOiIrZ3J1bmQrIlxuIik7CisgIGlmKCBpPjAgKSB7CisgICAgIHRleHQgPQorICAgICAiSGFsbG8gIitjYXBpdGFsaXplKHBsKSsiLFxuXG4iKworICAgICBicmVha19zdHJpbmcoCisgICAgICB0aGlzX2ludGVyYWN0aXZlKCktPk5hbWUoV0VSKSsiIGhhdCBzb2ViZW4gdmVyYW5sYXNzdCwgZGFzcyBEaXIgIitpCisgICAgICArIiBGUHMgYWJnZXpvZ2VuIHd1cmRlbi5cbkdydW5kOiIrZ3J1bmQrIlxuIiwgNzggKTsKKworICAgICBtYWlsID0gYWxsb2NhdGUoOSk7CisgICAgIG1haWxbTVNHX0ZST01dID0gZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSk7CisgICAgIG1haWxbTVNHX1NFTkRFUl0gPSBNVUROQU1FOworICAgICBtYWlsW01TR19SRUNJUElFTlRdID0gcGw7CisgICAgIG1haWxbTVNHX0NDXT0wOworICAgICBtYWlsW01TR19CQ0NdPTA7CisgICAgIG1haWxbTVNHX1NVQkpFQ1RdPSJGUC1SZWR1a3Rpb24iOworICAgICBtYWlsW01TR19EQVRFXT1kdGltZSh0aW1lKCkpOworICAgICBtYWlsW01TR19JRF09TVVETkFNRSI6Iit0aW1lKCk7CisgICAgIG1haWxbTVNHX0JPRFldPXRleHQ7CisKKyAgICAgIi9zZWN1cmUvbWFpbGVyIi0+RGVsaXZlck1haWwobWFpbCwxKTsKKyAgfQorICByZXR1cm4gaTsKK30KKy8qICovCisKK3ByaXZhdGUgaW50IGFkZF9mcChpbnQgbnVtLCBzdHJpbmcgcGwpCit7CisgIGludCBpLGosayx0LG1heEVQOworICBzdHJpbmcgZXA7CisgIGVwID0gKE1BU1RFUi0+cXVlcnlfZXAocGwpIHx8ICIiKTsKKworICBtYXhFUCA9IFF1ZXJ5TWF4RVAoKTsKKyAgZm9yKCBpPTA7IGk8bnVtOyBpKyspCisgIHsKKyAgICB0ID0gcmFuZG9tKG1heEVQKTsKKyAgICBmb3IoIGo9MDsgajxtYXhFUDsgaisrICkgeworICAgICAgaWYoICF0ZXN0X2JpdChlcCwgaz0odCtqKSVtYXhFUCApICkgYnJlYWs7CisgICAgfQorICAgIGlmKCBqPT1tYXhFUCApIGJyZWFrOworICAgIGVwID0gc2V0X2JpdChlcCwgayk7CisgIH0KKyAgTUFTVEVSLT51cGRhdGVfZXAocGwsZXApOworICByZXR1cm4gaTsKK30KKworbm9tYXNrIGludCBBZGRGUChpbnQgbnVtLCBzdHJpbmcgcGwpCit7CisgIGludCBpOworICBpZiAoIWFsbG93ZWQoKSkgcmV0dXJuIC0xOworICBpZiAoIG51bTwwICkgcmV0dXJuIC0zOworICBpZiAoIXBsKSByZXR1cm4gLTI7CisgIGk9YWRkX2ZwKG51bSwgcGwpOworICBsb2dfZmlsZSgiQVJDSC9mcF9zdHJhZmVuIiwgY3RpbWUodGltZSgpKSsiOiAiCisgICAgK3RoaXNfaW50ZXJhY3RpdmUoKS0+TmFtZShXRVIpKyIgZ2lidCAiK3BsKyIgIitpCisgICAgKyIgRlBzXG4iKTsKKworICByZXR1cm4gaTsKK30KKworbm9tYXNrIGludCBTZXRGUChpbnQgbnVtLCBzdHJpbmcgcGwpCit7CisgIGludCBtYXhFUDsKKyAgc3RyaW5nIGVwOworICBpZiAoIWFsbG93ZWQoKSkgcmV0dXJuIC0xOworICBpZiAoIG51bTwwICkgcmV0dXJuIC0zOworICBpZiAoIXBsKSByZXR1cm4gLTI7CisgIGVwID0gKE1BU1RFUi0+cXVlcnlfZXAocGwpIHx8ICIiKTsKKworICBtYXhFUCA9IFF1ZXJ5TWF4RVAoKTsKKyAgaWYgKG51bTwwIHx8IG51bT49bWF4RVApIHJldHVybiAtNDsKKyAgZXAgPSBzZXRfYml0KGVwLCBudW0pOworICBNQVNURVItPnVwZGF0ZV9lcChwbCxlcCk7CisgIHJldHVybiBudW07Cit9CisKK25vbWFzayBpbnQgQ2xlYXJGUChpbnQgbnVtLCBzdHJpbmcgcGwpCit7CisgIGludCBtYXhFUDsKKyAgc3RyaW5nIGVwOworICBpZiAoIWFsbG93ZWQoKSkgcmV0dXJuIC0xOworICBpZiAoIG51bTwwICkgcmV0dXJuIC0zOworICBpZiAoIXBsKSByZXR1cm4gLTI7CisgIGVwID0gKE1BU1RFUi0+cXVlcnlfZXAocGwpIHx8ICIiKTsKKworICBtYXhFUCA9IFF1ZXJ5TWF4RVAoKTsKKyAgaWYgKG51bTwwIHx8IG51bT49bWF4RVApIHJldHVybiAtNDsKKyAgZXAgPSBjbGVhcl9iaXQoZXAsIG51bSk7CisgIE1BU1RFUi0+dXBkYXRlX2VwKHBsLGVwKTsKKyAgcmV0dXJuIG51bTsKK30KKworcHJpdmF0ZSB2b2lkIHByaW50ZXAoIGludCBuciwgc3RyaW5nIGtleSwgaW50IGtpbmQsIHN0cmluZyogZGV0ICkKK3sKKyAgb3V0cHV0Kz1zcHJpbnRmKCIlNGQgJXMgJXMuYyAlcyAoeyAlcyB9KVxuIixucix0ZXN0X2JpdChib251cyxucik/ImIiOiJuIixrZXksRVBfVFlQRVNba2luZF0sCisgICAgICAgICAgICAgICAgc3RyQXJyKGRldCkpOworfQorCitub21hc2sgdmFyYXJncyBpbnQgU2hvd1BsYXllckVQcyhzdHJpbmcgcGwsc3RyaW5nIHBhdHRlcm4pCit7CisgIHN0cmluZyBlcCx0ZXN0c3RyaW5nOworICBpZiAoIWFsbG93ZWQoKSkgcmV0dXJuIC0xOworICBlcCA9IChNQVNURVItPnF1ZXJ5X2VwKHBsKSB8fCAiIik7CisKKyAgb3V0cHV0PSIiOworICBpZiAoIXBhdHRlcm4gfHwgcGF0dGVybj09IiIpCisgICAgdGVzdHN0cmluZz0iJXMiOworICBlbHNlIHRlc3RzdHJpbmc9IiVzIitwYXR0ZXJuKyIlcyI7CisgIHdhbGtfbWFwcGluZyggb2JzLCBsYW1iZGEoICh7ICdrZXksICd2MSwgJ3YyLCAndjMgfSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHYxIC0tIGRldGFpbHMsIHYyIC0tIE51bW1lciwgdjMgLS0gYXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtleSAtLSBGaWxlbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAoeyAjJ2lmLCAoeyAjJ3Rlc3RfYml0LCBlcCwgJ3YyIH0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoeyMnaWYsKHsjJ3NzY2FuZiwna2V5LHRlc3RzdHJpbmcsJ3Y0LCd2NX0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoeyAjJ3ByaW50ZXAsICd2MiwgJ2tleSwgJ3YzLCAndjEgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgfSkgKSk7CisgIHRoaXNfaW50ZXJhY3RpdmUoKS0+TW9yZShvdXRwdXQpOworICByZXR1cm4gMTsKK30KKworLy8gSGllciBrb21tZW4gRnVua3Rpb25lbiBmdWVyIGRpZSBMZXZlbHB1bmt0ZQorLy8gRnVua3Rpb24gZnVlciBMZXZlbHB1bmt0ZSBzdGVodCBpbSBMRVBNQVNURVIhCisKK25vbWFzayBpbnQgUXVlcnlMRVAoaW50IGxlcCkgeworICAgIHJhaXNlX2Vycm9yKCJCaXR0ZSBRdWVyeUxFUCgpIGltIExFUE1BU1RFUiBhYmZyYWdlbiwgbmljaHQgaW0gIgorICAgICAgICJFUE1BU1RFUiEiKTsKKyAgICByZXR1cm4oLTEpOyAvL25ldmVyIHJlYWNoZWQKK30KKworc3RyaW5nIFF1ZXJ5Rm9yc2NodW5nKCkKK3sKKyAgaW50IG15OworICBzdHJpbmcgcmV0OworCisgIGlmICgobXk9UXVlcnlSZWFsRXhwbG9yYXRpb25Qb2ludHMoZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKSkpIDwgTUlOX0VQKQorICAgIHJldHVybiAiRHUga2VubnN0IERpY2ggaW0gIk1VRE5BTUUiIHNvIGd1dCB3aWUgZ2FyIG5pY2h0IGF1cy5cbiI7CisKKyAgbXkgKj0gMTAwOworICBpbnQgYWJzb2x1dGUgPSBteS9RdWVyeU1heEVQKCk7CisgIGludCByZWxhdGl2ZSA9IG15L1F1ZXJ5QXZlcmFnZSgpOworCisgIHJldCA9ICJWZXJnbGljaGVuIG1pdCBEZWluZW4gTWl0c3BpZWxlcm4sIGtlbm5zdCBEdSBEaWNoIGltICJNVUROQU1FIiAiOworICBzd2l0Y2gocmVsYXRpdmUpIHsKKyAgY2FzZSAwLi4xMDoKKyAgICByZXQgKz0gImthdW0iOworICAgIGJyZWFrOworICBjYXNlIDExLi40MDoKKyAgICByZXQgKz0gImFldXNzZXJzdCBzY2hsZWNodCI7CisgICAgYnJlYWs7CisgIGNhc2UgNDEuLjU2OgorICAgIHJldCArPSAic2VociBzY2hsZWNodCI7CisgICAgYnJlYWs7CisgIGNhc2UgNTcuLjcyOgorICAgIHJldCArPSAic2NobGVjaHQiOworICAgIGJyZWFrOworICBjYXNlIDczLi45MzoKKyAgICByZXQgKz0gInVudGVyZHVyY2hzY2huaXR0bGljaCI7CisgICAgYnJlYWs7CisgIGNhc2UgOTQuLjEwOToKKyAgICByZXQgKz0gImR1cmNoc2Nobml0dGxpY2ggZ3V0IjsKKyAgICBicmVhazsKKyAgY2FzZSAxMTAuLjEyNToKKyAgICByZXQgKz0gImJlc3NlciBhbHMgZGVyIER1cmNoc2Nobml0dCI7CisgICAgYnJlYWs7CisgIGNhc2UgMTI2Li4xNDU6CisgICAgcmV0ICs9ICJyZWNodCBndXQiOworICAgIGJyZWFrOworICBjYXNlIDE0Ni4uMTcwOgorICAgIHJldCArPSAiemllbWxpY2ggZ3V0IjsKKyAgICBicmVhazsKKyAgY2FzZSAxNzEuLjIxMDoKKyAgICByZXQgKz0gImd1dCI7CisgICAgYnJlYWs7CisgIGNhc2UgMjExLi4zMDA6CisgICAgcmV0ICs9ICJzZWhyIGd1dCI7CisgICAgYnJlYWs7CisgIGNhc2UgMzAxLi40MDA6CisgICAgcmV0ICs9ICJhdXNzZXJvcmRlbnRsaWNoIGd1dCI7CisgICAgYnJlYWs7CisgIGNhc2UgNDAxLi41MDA6CisgICAgcmV0ICs9ICJ1bmhlaW1saWNoIGd1dCI7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgcmV0ICs9ICJlaW5mYWNoIGhlcnZvcnJhZ2VuZCI7CisgICAgYnJlYWs7CisgIH0KKyAgcmV0ICs9ICIgYXVzLlxuQWJzb2x1dCBnZXNlaGVuICI7CisKKyAgc3dpdGNoKGFic29sdXRlKSB7CisgIGNhc2UgMC4uNToKKyAgICByZXQgKz0gImtlbm5zdCBEdSBudXIgd2VuaWcgdm9tICJNVUROQU1FIi4iOworICAgIGJyZWFrOworICBjYXNlIDYuLjEwOgorICAgIHJldCArPSAic29sbHRlc3QgRHUgRGljaCB2aWVsbGVpY2h0IG5vY2ggZ2VuYXVlciB1bXNlaGVuLiI7CisgICAgYnJlYWs7CisgIGNhc2UgMTEuLjE3OgorICAgIHJldCArPSAiYmlzdCBEdSBkdXJjaGF1cyBzY2hvbiBoZXJ1bWdla29tbWVuLiI7CisgICAgYnJlYWs7CisgIGNhc2UgMTguLjI1OgorICAgIHJldCArPSAiaGFzdCBEdSBzY2hvbiBlaW5pZ2VzIGdlc2VoZW4uIjsKKyAgICBicmVhazsKKyAgY2FzZSAyNi4uMzU6CisgICAgcmV0ICs9ICJiaXN0IER1IHNjaG9uIHdlaXQgaGVydW1nZWtvbW1lbi4iOworICAgIGJyZWFrOworICBjYXNlIDM2Li41MDoKKyAgICByZXQgKz0gImtvZW5udGVzdCBEdSBlaWdlbnRsaWNoIGVpbmVuIFJlaXNlZnVlaHJlciBoZXJhdXNicmluZ2VuLiI7CisgICAgYnJlYWs7CisgIGNhc2UgNTEuLjc1OgorICAgIHJldCArPSAiaGFzdCBEdSBzY2hvbiBzZWhyIHZpZWwgZ2VzZWhlbi4iOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIHJldCArPSAiYmVzaXR6dCBEdSBlaW5lIGhlcnZvcnJhZ2VuZGUgT3J0c2tlbm50bmlzLiI7CisgIH0KKyAgcmV0dXJuIGJyZWFrX3N0cmluZyhyZXQsIDc4LCAwLCAxKTsKK30KKworLy8gTmljaHQgamVkZXIgTWFnaWVyIG11c3MgZGVuIEVQTUFTVEVSIGVudHNvcmdlbiBrb2VubmVuLgorc3RyaW5nIE5vdGlmeURlc3RydWN0KG9iamVjdCBjYWxsZXIpIHsKKyAgaWYoIChjYWxsZXIhPXRoaXNfb2JqZWN0KCkgJiYgIUFSQ0hfU0VDVVJJVFkpIHx8IHByb2Nlc3NfY2FsbCgpICkKKyAgeworICAgIHJldHVybiAiRHUgZGFyZnN0IGRlbiBFeHBsb3JhdGlvbiBNYXN0ZXIgbmljaHQgemVyc3RvZXJlbiFcbiI7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL3NlY3VyZS9mdHBkLmMgYi9zZWN1cmUvZnRwZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0OWNmMDMKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvZnRwZC5jCkBAIC0wLDAgKzEsMTc4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIGZ0cGQuYworKiogUnVtYXRhQG1nCisqKiAxMy42LjE5OTkKKyoqCisqKiBFcm1pdHRsdW5nIGRlciBadWdyaWZmc3JlY2h0ZSBhdXMgZGVuIFVzZXJkYXRlbi4KKyoqCisqKiBEaWVzZXMgT2JqZWt0IHdpcmQgdm9tIGZ0cGltcCBhdXMgYXVmZ2VydWZlbiwgZGVyIHdpZWRlcnVtIHZvbSBtYXN0ZXIKKyoqIGF1ZmdlcnVmZW4gd2lyZCwgdW0gZGllIFp1Z3JpZmZzcmVjaHRlIHp1IHBydWVmZW4uCisqKgorKiogRnVrdGlvbnN3ZWlzZToKKyoqICsgSW0gTWFzdGVyIHdpcmQgdm9tIFVOSVgtZnRwZCBhdXMgRnRwQWNjZXNzICgvc2VjdXJlL21hc3Rlci9uZXR3b3JrKQorKiogICBhdWZnZXJ1ZmVuLgorKiogKyBEaWVzZXMgcnVmdCBkYW5uLCBzb2JhbGQgZWluIFp1Z3JpZmYgZXJrYW5udCB3aXJkCisqKiAgIFF1ZXJ5UmVhZCwgUXVlcnlXcml0ZSBvZGVyIFF1ZXJ5RGlyIGF1Zi4KKyoqICsgRGllc2UgZnJhZ2VuIGRlbiBNYXN0ZXIsIG9iIGRlciBadWdyaWZmIGxlZ2FsIGlzdC4KKyoqICsgUXVlcnlEaXIgbGllZmVydCBhdWNoIGdsZWljaCBkYXMgRXJnZWJuaXMgbWl0LgorKioKKyoqIFVtIGZ0cC16dWdyaWZmZSD8YmVyd2FjaGVuIHp1IGv2bm5lbiwga2FubiBkZXIgZnRwZCBlaW5lIGxpc3RlIGRlcgorKiogdWViZXJ3YWNodGVuIHNwaWVsZXIgbGllZmVybiB1bmQgZGVyZW4gWnVncmlmZmUgYXVmIGRlbSBGVFAgS2FuYWwgYXVzZ2ViZW4uCisqKgorKiogYWRkKCBuYW1lLCB6ZWl0ICkgLSBGVFAgWnVncmlmZmUgZGVzIFNwaWVsZXJzICduYW1lJyB3ZXJkZW4gcHJvdG9rb2xsaWVydC4KKyoqICAgICAgICAgICAgICAgICAgICAgTmFjaCAnemVpdCcgd2lyZCBkaWVzZXIgWnVncmlmZiBhdXRvbWF0aXNjaCBiZWVuZGV0LgorKiogICAgICAgICAgICAgICAgICAgICBJc3QgJ3plaXQnIDw9IDAsIHdpciBhdWYgZXdpZyB1ZWJlcndhY2h0LiAKKyoqIHN1YiggbmFtZSApICAgICAgIC0gRlRQIFNub29wIGZ1ZXIgU3BpZWxlciAnbmFtZScgZGlyZWt0IGF1ZmhlYmVuLgorKiogbGlzdCgpICAgICAgICAgICAgLSBNYXBwaW5nIGRlciB1ZWJlcndhY2h0ZW4gU3BpZWxlciB6dXJ1ZWNrZ2ViZW4uCisqKgorKiogRklMRVM6CisqKiAgIC9zZWN1cmUvbWFzdGVyL25ldHdvcmsuYworKiogICAvc2VjdXJlL2Z0cGQuYworKiogICAvc3RkL3NoZWxscy9maWxlc3lzL2Z0cGltcC5jCisqKiAgIC9zZWN1cmUvQVJDSC9mdHBkLm8KKyoqICAgL3AvZGFlbW9uL2NoYW5uZWxkLmluaXQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICIvc2VjdXJlL3dpemxldmVscy5oIgorI2luY2x1ZGUgIi9zeXMvZGFlbW9uLmgiCisKKyNkZWZpbmUgRlRQRFNBVkUgIi9zZWN1cmUvQVJDSC9mdHBkIgorI2RlZmluZSBGVFBEX0NIICJGVFAiCisjZGVmaW5lIEJCTUFTVEVSICIvc2VjdXJlL2JibWFzdGVyIgorCittYXBwaW5nIG1vbml0b3JlZDsKKy8vIFp1IGplZGVtIFNwaWVsZXJuYW1lbiB3aXJkIHZlcm1lcmt0LCB3aWUgbGFuZ2UgZGllIFVlYmVyd2FjaHVuZyBkYXVlcm4gc29sbC4KKy8vIFphaGxlbiA8PSAwIGJlZGV1dGVuIGZ1ZXIgaW1tZXIuCisKK25vbWFzayB2b2lkIGNyZWF0ZSgpIHsKKyAgaWYoIGNsb25lcCh0aGlzX29iamVjdCgpKSApIHsKKyAgICBkZXN0cnVjdCggdGhpc19vYmplY3QoKSApOworICAgIHJldHVybjsKKyAgfQorICBzZXRldWlkKCBnZXR1aWQoKSApOworICBpZiggIXJlc3RvcmVfb2JqZWN0KEZUUERTQVZFKSApCisgICAgbW9uaXRvcmVkID0gKFtdKTsKK30KKworbm9tYXNrIGludCBwbGF5ZXJfZXhpc3RzKCBzdHJpbmcgdXNlciApIHsKKyAgdXNlciA9IGxvd2VyX2Nhc2UodXNlcik7CisgIGlmKCAhc3RyaW5ncCggdXNlciApIHx8IHNpemVvZiggdXNlciApIDwgMSApIHJldHVybiAwOworICByZXR1cm4gZmlsZV9zaXplKCAiL3NhdmUvIit1c2VyWzAuLjBdKyIvIit1c2VyKyIubyIgKSA+IDA7Cit9CisKK25vbWFzayB2YXJhcmdzIGludCBhZGQoIHN0cmluZyB1c2VyLCBpbnQgdGltZW91dCApIHsKKyAgaWYoICFBUkNIX1NFQ1VSSVRZICkgcmV0dXJuIC0xOworICBpZiggIXBsYXllcl9leGlzdHModXNlcikgKSByZXR1cm4gLTI7CisgIG1vbml0b3JlZFt1c2VyXSA9IHRpbWVvdXQ7CisgIHNhdmVfb2JqZWN0KCBGVFBEU0FWRSApOworICByZXR1cm4gMDsKK30KKworbm9tYXNrIGludCBzdWIoIHN0cmluZyB1c2VyICkgeworICBpZiggIUFSQ0hfU0VDVVJJVFkgKSByZXR1cm4gLTE7CisgIGlmKCAhcGxheWVyX2V4aXN0cyh1c2VyKSApIHJldHVybiAtMjsKKyAgbW9uaXRvcmVkIC09IChbIHVzZXIgXSk7CisgIHNhdmVfb2JqZWN0KCBGVFBEU0FWRSApOworICByZXR1cm4gMDsKK30KKworbm9tYXNrIG1peGVkIGxpc3QoKSB7CisgIGlmKCAhQVJDSF9TRUNVUklUWSApIHJldHVybiAtMTsKKyAgcmV0dXJuIGRlZXBfY29weShtb25pdG9yZWQpOworfQorCisjZGVmaW5lIE5FV0lNUCAieWVzIgorCitwcml2YXRlIG9iamVjdCBmaW5kRnRwSW1wRm9yKCBzdHJpbmcgdXNlciApIHsKKyNpZmRlZiBORVdJTVAKKyAgcmV0dXJuICIvc2VjdXJlL2ltcGZldGNoIi0+aW1wRm9yKCBsb3dlcl9jYXNlKHVzZXIpICk7CisjZWxzZQorICBvYmplY3QgaW1wOworICBzdHJpbmcgZm5hbWU7CisKKyAgdXNlciA9IGxvd2VyX2Nhc2UoIHVzZXIgKTsKKyAgZm5hbWUgPSAiL2Z0cGltcDoiICsgdXNlcjsKKyAgaW1wID0gZmluZF9vYmplY3QoIGZuYW1lICk7CisgIGlmKCAhb2JqZWN0cChpbXApICkgeworICAgIGltcCA9IGNsb25lX29iamVjdCggInNlY3VyZS9mdHBpbXAiICk7CisgICAgaW1wLT5TZXRVc2VyKHVzZXIpOworICAgIHJlbmFtZV9vYmplY3QoIGltcCwgZm5hbWUgKTsKKyAgfQorICByZXR1cm4gaW1wOworI2VuZGlmCit9CisKK3ByaXZhdGUgbm9tYXNrIHZvaWQgbXNnKCBzdHJpbmcgdXNlciwgc3RyaW5nIG0gKSB7CisgIGludCB0aW1lb3V0OworICBvYmplY3QgcjsKKworICBpZiggIXN0cmluZ3AodXNlcikgKSByZXR1cm47CisgIG0gKz0gIlxuIjsKKyAgaWYoIChyPWZpbmRfcGxheWVyKCJydW1hdGEiKSkgJiYgdXNlcj09ImF0YW11ciIgKSB7CisgICAgIHRpbWVvdXQgPSBDSE1BU1RFUi0+c2VuZChGVFBEX0NILGZpbmRGdHBJbXBGb3IodXNlciksIG0gKTsKKyAgICAgdGVsbF9vYmplY3QoIHIsIHNwcmludGYoIiVPXG4iLCBmaW5kRnRwSW1wRm9yKHVzZXIpICkgKTsKKyAgfQorICBCQk1BU1RFUi0+ZnRwYmIodXNlcixtKTsKKyAgaWYoICFtZW1iZXIobW9uaXRvcmVkLHVzZXIpICkgcmV0dXJuOworICB0aW1lb3V0ID0gbW9uaXRvcmVkW3VzZXJdOworICBpZiggdGltZW91dCA+IDAgJiYgdGltZW91dCA8IHRpbWUoKSApIHsKKyAgICBzdWIoIHVzZXIgKTsKKyAgICByZXR1cm47CisgIH0KKyAgQ0hNQVNURVItPnNlbmQoRlRQRF9DSCxmaW5kRnRwSW1wRm9yKHVzZXIpLCBtICk7Cit9CisKK25vbWFzayBpbnQgc2VjdXJlKCkgeworICByZXR1cm4gcHJldmlvdXNfb2JqZWN0KCk9PWZpbmRfb2JqZWN0KE1BU1RFUik7Cit9CisKK25vbWFzayBtaXhlZCBRdWVyeVJlYWQoIHN0cmluZyB1c2VyLCBzdHJpbmcgZmlsZSApIHsKKyAgaWYoICFzZWN1cmUoKSApIHJldHVybiAtMTsKKyAgaWYoIChJU19XSVpBUkQodXNlcikgfHwgZmlsZVswLi40XT09Ii9vcGVuIikKKyAgICAgICYmIGZpbGVbMF0gPT0gJy8nCisgICAgICAmJiBNQVNURVItPnZhbGlkX3JlYWQoZmlsZSwgdXNlciwgInJlYWRfZmlsZSIsIDApCisgICAgICApIHsKKyAgICBtc2coIHVzZXIsICJyZWFkICIgKyBmaWxlICk7CisgICAgcmV0dXJuICJPSyI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuICJGQUlMIjsKKyAgfQorfQorCitub21hc2sgbWl4ZWQgUXVlcnlXcml0ZSggc3RyaW5nIHVzZXIsIHN0cmluZyBmaWxlICkgeworICBpZiggIXNlY3VyZSgpICkgcmV0dXJuIC0xOworICBpZiggZmlsZVswXSA9PSAnLycKKyAgICAgICYmIE1BU1RFUi0+dmFsaWRfd3JpdGUoIGZpbGUsIHVzZXIsICJ3cml0ZV9maWxlIiwgMCkKKyAgICAgICkgeworICAgIG1zZyggdXNlciwgIndyaXRlICIgKyBmaWxlICk7CisgICAgcmV0dXJuICJPSyI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuICJGQUlMIjsKKyAgfQorfQorCisjZGVmaW5lIERCRyh4KSBpZihmaW5kX3BsYXllcigicnVtYXRhIikpe3RlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJydW1hdGEiKSwiRlRQRDoiK3grIlxuIik7fQorCisvL25vbWFzayBtaXhlZCBRdWVyeURpciggc3RyaW5nIHVzZXIsIHN0cmluZyBmaWxlICkgeworLy8gIHN0cmluZyByZXBseTsKKy8vICBvYmplY3QgaW1wOworLy8KKy8vICBpZiggIXNlY3VyZSgpICkgcmV0dXJuIC0xOworLy8gIHJlcGx5ID0gUXVlcnlSZWFkKCB1c2VyLCBmaWxlICk7CisvLyAgaWYoIHJlcGx5PT0iRkFJTCIgKSByZXR1cm4gLTE7CisvLworLy8gIGltcCA9IGZpbmRGdHBJbXBGb3IoIHVzZXIgKTsKKy8vICBpZiggIW9iamVjdHAoaW1wKSApIHJldHVybiAtMTsgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbgorLy8KKy8vICByZXR1cm4gaW1wLT5HZXREaXIoIGZpbGUgKTsKKy8vfQorCitub21hc2sgbWl4ZWQgUXVlcnlEaXIoIHN0cmluZyB1c2VyLCBzdHJpbmcgZmlsZSApIHsKKyAgaWYoICFzZWN1cmUoKSApIHJldHVybiAtMTsKKyAgaWYoIGZpbGVbMF0gPT0gJy8nCisgICAgICAmJiBNQVNURVItPnZhbGlkX3JlYWQoIGZpbGUrIi8qIiwgdXNlciwgImdldF9kaXIiLCAwKSkKKyAgICAgIHJldHVybiAiT0siOworICBlbHNlIAorICAgIHJldHVybiAiRkFJTCI7Cit9CmRpZmYgLS1naXQgYS9zZWN1cmUvZnRwaW1wLmMgYi9zZWN1cmUvZnRwaW1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFlZTM0YwotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9mdHBpbXAuYwpAQCAtMCwwICsxLDc1IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gbWFzdGVyL2Z0cGltcC5jIC0tIEZUUCBBdmF0YXIKKy8vCisvLyAkSWQ6IGZ0cGltcC5jIDY0NDAgMjAwNy0wOC0xOCAyMzowMDo0OVogWmVzc3RyYSAkCisvLworLy8gc2llaGUgL3NlY3VyZS9mdHBkCisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisKKyNpbmNsdWRlICIvc2VjdXJlL21hc3Rlci5oIgorI2RlZmluZSBGVFBEICIvc2VjdXJlL2Z0cGQiCisKKy8vcHJpdmF0ZSBpbmhlcml0ICIvc3RkL3NoZWxscy9maWxlc3lzL2ZpbGVzeXMiOworcHJpdmF0ZSBpbmhlcml0ICIvc2VjdXJlL21pc2MvZmlsZXN5cy9maWxlc3lzIjsKKworc3RhdGljIHN0cmluZyB1c2VyOyAvLyBOYW1lIGRlcyB6dWdlaG9lcmlnZW4gVXNlcnMKKworbm9tYXNrIHByaXZhdGUgaW50IHNlY3VyZV9pbXBjYWxsKCkgeworICByZXR1cm4KKyAgICBnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpID09IFJPT1RJRCAmJgorICAgIGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpID09IFJPT1RJRDsKKworfQorCisvLyBOYWNoIGRlbSBBdWZydWYgdm9uIFNldFVzZXIgd2lyZCBkZXIgRmlsZW5hbWUgZ2VhZWRuZXJ0LCBzb2Rhc3MKKy8vIGRhcyBub3JtYWxlIGNsb25lcCBpbiBnZXRfZGlyIG5pY2h0IG1laHIgZ2VodC4gSGllciBlaW4gZXJzYXR6LgorcHJpdmF0ZSBub21hc2sgaW50IG15X2lzX2Nsb25lKCkgeworICByZXR1cm4gbWVtYmVyKG9iamVjdF9uYW1lKHRoaXNfb2JqZWN0KCkpLCc6Jyk+PTA7Cit9CisKK25vbWFzayB2b2lkIGNyZWF0ZSgpIHsKKyAgaWYoICFjbG9uZXAodGhpc19vYmplY3QoKSkgKSB7CisgICAgc2V0X25leHRfcmVzZXQoIC0xICk7IC8vIGJsdWVwcmludCBzb2xsIG5pY2h0IHN0ZXJiZW4KKyAgICByZXR1cm47CisgIH0KKyAgLy9pZiggc2VjdXJlX2ltcGNhbGwoKSApIDo6Y3JlYXRlKCk7Cit9CisKK25vbWFzayBpbnQgU2V0VXNlciggc3RyaW5nIG5hbWUgKSB7CisgIGlmKCAhc2VjdXJlX2ltcGNhbGwoKSB8fCAhY2xvbmVwKHRoaXNfb2JqZWN0KCkpICkgcmV0dXJuIC0yOworICBpZiggc3RyaW5ncCh1c2VyKSAmJiB1c2VyICE9ICIiICkgeworICAgIC8vd3JpdGUoICJVc2VyPSIrdXNlcisiXG4iICk7CisgICAgcmV0dXJuIC0xOyAvLyBzY2hvbiBlaW4gbmFtZSBkYSEKKyAgfQorICB1c2VyID0gbG93ZXJfY2FzZShuYW1lKTsKKyAgc2V0ZXVpZCggdXNlciApOworICBzZXRfbmV4dF9yZXNldCggMTgwMCApOworfQorCisvLyBHaWJ0IGVpbmVuIG5lZ2F0aXZlbiBXZXJ0IHp1cvxjaywgd2VubiBkaWUgRGF0ZWkgbmljaHQgZ2VsZXNlbiB3ZXJkZW4KKy8vIGthbm4gb2RlciBlaW5lbiBzdHJpbmcsIGRlciBkaWUgZ2VzYW10ZW4gRGF0ZW4gZGVzIFZlcnplaWNobmlzc2VzCisvLyBlbnRo5Gx0Lgorbm9tYXNrIG1peGVkIEdldERpcihzdHJpbmcgZGlyKQoreworICBtaXhlZCByZXQ7IHJldCA9ICIiOworICBpZiggIXNlY3VyZV9pbXBjYWxsKCkgfHwgIW15X2lzX2Nsb25lKCkpIHJldHVybiAtMjsKKyAgaWYoICFzdHJpbmdwKHVzZXIpIHx8IHVzZXI9PSIiICkgcmV0dXJuIC0xOworICBfbHNfb3V0cHV0KCBkaXIsICZyZXQsIHVzZXIsIDB4ODMgKTsKKyAgc2V0X25leHRfcmVzZXQoIDE4MDAgKTsKKyAgcmV0dXJuIHJldDsKK30KKworbm9tYXNrIHZvaWQgcmVzZXQoKSB7CisgIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOworfQorCit2YXJhcmdzIG1peGVkIG1vdmUoKSB7CisgIHJldHVybiAtMTsKK30KKworLy8gRnVlciBkaWUgTWVsZHVuZyBhdWYgRlRQCitub21hc2sgc3RyaW5nIG5hbWUoKSB7CisgIHJldHVybiBjYXBpdGFsaXplKHVzZXIpOworfQpkaWZmIC0tZ2l0IGEvc2VjdXJlL2dpbGRlbm1hc3Rlci5jIGIvc2VjdXJlL2dpbGRlbm1hc3Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YzVlM2QKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvZ2lsZGVubWFzdGVyLmMKQEAgLTAsMCArMSwxNjUgQEAKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIG5vX3NoYWRvdworI3ByYWdtYSBub19pbmhlcml0CisjcHJhZ21hIHZlcmJvc2VfZXJyb3JzCisjcHJhZ21hIGNvbWJpbmVfc3RyaW5ncworLy8jcHJhZ21hIHBlZGFudGljCisvLyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgd2Fybl9kZXByZWNhdGVkCisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxuZXdfc2tpbGxzLmg+CisjaW5jbHVkZSA8ZXZlbnRzLmg+CisKK3N0cmluZyAqdmFsaWRfZ3VpbGRzID0gKHt9KTsKKwordm9pZCBjcmVhdGUoKSB7CisgIHNldGV1aWQoZ2V0dWlkKHRoaXNfb2JqZWN0KCkpKTsKKyAgcmVzdG9yZV9vYmplY3QoR1VJTERfU0FWRUZJTEUpOworICBpZiAoIXBvaW50ZXJwKHZhbGlkX2d1aWxkcykpIAorICAgIHZhbGlkX2d1aWxkcz0oe30pOworfQorCisvL25vZXRpZywgZGEgbnVuIHZhbGlkX2d1aWxkcyBlaW5lIFZhcmlhYmxlIGlzdAorcHVibGljIG1peGVkIFF1ZXJ5UHJvcCggc3RyaW5nIG5hbWUgKQoreworICBpZiAobmFtZT09UF9WQUxJRF9HVUlMRFMpIAorICAgICAgcmV0dXJuIGNvcHkodmFsaWRfZ3VpbGRzKTsKKyAgcmV0dXJuIDA7Cit9CisKK25vbWFzayBpbnQgYmVpdHJldGVuKCkgeworICBvYmplY3QgcGwsZ2lsZGU7CisgIHN0cmluZyBnbmFtZSxvZ25hbWU7CisKKyAgaWYgKCEocGw9dGhpc19wbGF5ZXIoKSkgfHwgIShnaWxkZT1wcmV2aW91c19vYmplY3QoKSkpCisgICAgICByZXR1cm4gMDsKKyAgLy8gR2lsZGVuIHNpbmQgQmx1ZXByaW50cy4KKyAgZ25hbWU9b2JqZWN0X25hbWUoZ2lsZGUpOworCisgIGlmICgoR1VJTERfRElSK29nbmFtZSk9PWduYW1lKSB7CisgICAgd3JpdGUoIkR1IGJpc3Qgc2Nob24gaW4gZGllc2VyIEdpbGRlLlxuIik7CisgICAgcmV0dXJuIC00OworICB9CisKKyAgaWYgKChvZ25hbWU9KHN0cmluZylwbC0+UXVlcnlQcm9wKFBfR1VJTEQpKSAmJiAKKyAgICAgIChvZ25hbWUhPSgoKHN0cmluZylwbC0+UXVlcnlQcm9wKFBfREVGQVVMVF9HVUlMRCkpIHx8IERFRkFVTFRfR1VJTEQpKSkgeworICAgIHdyaXRlKCJEdSBiaXN0IG5vY2ggaW4gZWluZXIgYW5kZXJlbiBHaWxkZS5cbiIpOworICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAoZ25hbWVbMC4uN10hPUdVSUxEX0RJUiB8fAorICAgICAgICBtZW1iZXIodmFsaWRfZ3VpbGRzLChnbmFtZT1nbmFtZVs4Li5dKSk8MCkgeworICAgICAgd3JpdGUoIkRpZXNlIEdpbGRlIGlzdCBsZWlkZXIgbmljaHQgenVnZWxhc3Nlbi5cbiIrCisgICAgICAgICAgICAgICJCaXR0ZSB2ZXJzdGFlbmRpZ2UgZWluZW4gRXJ6bWFnaWVyLlxuIik7CisgICAgICByZXR1cm4gLTI7CisgIH0KKyAgcGwtPlNldFByb3AoUF9HVUlMRCxnbmFtZSk7CisgIC8vIEV2ZW50IEdpbGRlbndlY2hzZWwgdHJpZ2dlcm4KKyAgRVZFTlRELT5UcmlnZ2VyRXZlbnQoRVZUX0dVSUxEX0NIQU5HRSwgKFsKKyAgICAgIEVfT0JKRUNUOiBwbCwgRV9QTE5BTUU6IGdldHVpZChwbCksCisgICAgICBFX0VOVklST05NRU5UOiBlbnZpcm9ubWVudChwbCksCisgICAgICBFX0dVSUxETkFNRTogZ25hbWUsCisgICAgICBFX0xBU1RfR1VJTEROQU1FOiBvZ25hbWUgXSkgKTsKKworICByZXR1cm4gMTsKK30KKworc3RhdGljIG5vbWFzayB2b2lkIGxvb3NlX2FiaWxpdHkobWl4ZWQga2V5LCBtaXhlZCBkYXQsIGludCBsb3NzKSB7CisgIG1peGVkIHZhbDsKKworICB2YWw9bWFwcGluZ3AoZGF0KT9kYXRbU0lfU0tJTExBQklMSVRZXTpkYXQ7CisgIGlmICghaW50cCh2YWwpIHx8IHZhbDw9MCkgcmV0dXJuOworICB2YWwtPSh2YWwqbG9zcykvMTAwO2lmICh2YWw8PTApIHZhbD0xOworICBpZiAobWFwcGluZ3AoZGF0KSkKKyAgICAgIGRhdFtTSV9TS0lMTEFCSUxJVFldPXZhbDsKKyAgZWxzZQorICAgICAgZGF0PXZhbDsKK30KKwordmFyYXJncyBub21hc2sgaW50IGF1c3RyZXRlbihpbnQgbG9zcykgeworICBvYmplY3QgcGwsZ2lsZGU7CisgIHN0cmluZyBnbmFtZTsKKyAgbWFwcGluZyBza2lsbHM7CisKKyAgaWYgKCEocGw9dGhpc19wbGF5ZXIoKSkgfHwgIShnaWxkZT1wcmV2aW91c19vYmplY3QoKSkpCisgICAgICByZXR1cm4gMDsKKyAgLy8gR2lsZGVuIG11ZXNzZW4gQmx1ZXByaW50cyBzZWluLCBzby4gOy0pCisgIGduYW1lPW9iamVjdF9uYW1lKGdpbGRlKTsKKyAgaWYgKGduYW1lWzAuLjddIT1HVUlMRF9ESVIgfHwKKyAgICAgICgoc3RyaW5nKXBsLT5RdWVyeVByb3AoUF9HVUlMRCkpIT1nbmFtZVs4Li5dKSB7CisgICAgICB3cml0ZSgiRHUga2FubnN0IGhpZXIgbmljaHQgYXVzIGVpbmVyIGFuZGVyZW4gR2lsZGUgYXVzdHJldGVuLlxuIik7CisgICAgICByZXR1cm4gLTE7CisgIH0KKyAgaWYgKGduYW1lWzguLl09PShwbC0+UXVlcnlQcm9wKFBfREVGQVVMVF9HVUlMRCl8fERFRkFVTFRfR1VJTEQpKQorICB7CisgICAgICAgIHdyaXRlKCJBdXMgZGllc2VyIEdpbGRlIGthbm5zdCBEdSBuaWNodCBhdXN0cmV0ZW4uXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICB9CisgIGlmIChsb3NzPD0wKSBsb3NzPTIwOworICBza2lsbHM9KG1hcHBpbmcpcGwtPlF1ZXJ5UHJvcChQX05FV1NLSUxMUyk7CisgIHdhbGtfbWFwcGluZyhza2lsbHMsImxvb3NlX2FiaWxpdHkiLHRoaXNfb2JqZWN0KCksbG9zcyk7CisgIHBsLT5TZXRQcm9wKFBfTkVXU0tJTExTLHNraWxscyk7CisgIHBsLT5TZXRQcm9wKFBfR1VJTEQsMCk7CisgIC8vIEV2ZW50IEdpbGRlbndlY2hzZWwgdHJpZ2dlcm4KKyAgRVZFTlRELT5UcmlnZ2VyRXZlbnQoRVZUX0dVSUxEX0NIQU5HRSwgKFsKKyAgICAgIEVfT0JKRUNUOiBwbCwgRV9QTE5BTUU6IGdldHVpZChwbCksCisgICAgICBFX0VOVklST05NRU5UOiBlbnZpcm9ubWVudChwbCksCisgICAgICBFX0dVSUxETkFNRTogcGwtPlF1ZXJ5UHJvcChQX0dVSUxEKSwKKyAgICAgIEVfTEFTVF9HVUlMRE5BTUU6IGduYW1lIF0pICk7CisKKyAgLy8gRGVmYXVsdGdpbGRlIGdnZi4gbmV1ZW4gVGl0ZWwgc2V0emVuIGxhc3Nlbi4KKyAgZ25hbWUgPSAoc3RyaW5nKXBsLT5RdWVyeVByb3AoUF9HVUlMRCk7CisgIChHVUlMRF9ESVIrIi8iK2duYW1lKS0+YWRqdXN0X3RpdGxlKHBsKTsKKworICByZXR1cm4gMTsKK30KKworbm9tYXNrIHN0YXRpYyBpbnQgc2VjdXJpdHlfY2hlY2soKQoreworICBpZiAocHJldmlvdXNfb2JqZWN0KCkgJiYgZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSk9PVJPT1RJRCkKKyAgICByZXR1cm4gMTsKKyAgaWYgKCFwcm9jZXNzX2NhbGwoKSAmJiBwcmV2aW91c19vYmplY3QoKSAmJiBBUkNIX1NFQ1VSSVRZKQorICAgIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworbm9tYXNrIGludCBBZGRHdWlsZChzdHJpbmcgZ2lsZG9iKSB7CisgIG9iamVjdCB0cDsKKworICBpZiAoIXN0cmluZ3AoZ2lsZG9iKSB8fCAhc2l6ZW9mKGdpbGRvYikgfHwgIXNlY3VyaXR5X2NoZWNrKCkgCisgICAgICB8fCBmaWxlX3NpemUoR1VJTERfRElSK2dpbGRvYisiLmMiKTwwKQorICAgICAgcmV0dXJuIDA7CisgIGlmIChtZW1iZXIodmFsaWRfZ3VpbGRzLCBnaWxkb2IpICE9IC0xKQorICAgICAgcmV0dXJuIDA7CisgIHZhbGlkX2d1aWxkcys9KHtnaWxkb2J9KTsKKyAgc2F2ZV9vYmplY3QoR1VJTERfU0FWRUZJTEUpOworICByZXR1cm4gMTsKK30KKworbm9tYXNrIGludCBSZW1vdmVHdWlsZChzdHJpbmcgZ2lsZG9iKSB7CisgIG9iamVjdCB0cDsKKworICBpZiAoIXN0cmluZ3AoZ2lsZG9iKSB8fCAhc2l6ZW9mKGdpbGRvYikgCisgICAgICB8fCAhc2VjdXJpdHlfY2hlY2soKSkKKyAgICAgIHJldHVybiAwOworICBpZiAobWVtYmVyKHZhbGlkX2d1aWxkcywgZ2lsZG9iKSA9PSAtMSkKKyAgICAgIHJldHVybiAwOworICB2YWxpZF9ndWlsZHMtPSh7Z2lsZG9ifSk7CisgIAorICBzYXZlX29iamVjdChHVUlMRF9TQVZFRklMRSk7CisgIHJldHVybiAxOworfQorCitub21hc2sgaW50IFZhbGlkR3VpbGQoc3RyaW5nIGdpbGRlbm9iKSB7CisgIGlmICghc3RyaW5ncChnaWxkZW5vYikpIAorICAgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIChtZW1iZXIodmFsaWRfZ3VpbGRzLGdpbGRlbm9iKT49MCk7Cit9CisKK25vbWFzayBzdHJpbmcgKl9xdWVyeV92YWxpZF9ndWlsZHMoKSB7cmV0dXJuIGNvcHkodmFsaWRfZ3VpbGRzKTsgfQorCmRpZmYgLS1naXQgYS9zZWN1cmUvZ3Vlc3RtYXN0ZXIuYyBiL3NlY3VyZS9ndWVzdG1hc3Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMDRkOGQKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvZ3Vlc3RtYXN0ZXIuYwpAQCAtMCwwICsxLDYwIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gZ3Vlc3RtYXN0ZXIuYyAtLSBWZXJ3YWx0ZXIgdm9uIEdhc3QtTG9naW5zCisvLworLy8gJElkOiBndWVzdG1hc3Rlci5jIDg5MDkgMjAxNC0wOC0yMCAyMTozMzo1NVogWmVzc3RyYSAkCisjcHJhZ21hIG5vX2Nsb25lLG5vX2luaGVyaXQsbm9fc2hhZG93CisjcHJhZ21hIHN0cmljdF90eXBlcyxzYXZlX3R5cGVzLHJ0dF9jaGVja3MKKworI2luY2x1ZGUgPHdpemxldmVscy5oPgorCitub3NhdmUgaW50IG1heF9ndWVzdHMgPSAxMDsgLyogTWF4IG5vLiBvZiBndWVzdHMuIC0xIGlzICd1bmxpbWl0ZWQnICovCitub3NhdmUgb2JqZWN0ICpndWVzdHMgPSAoe30pOworbm9zYXZlIGludCAgICAqbHRpbWUgPSAoe30pOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICBzZXRldWlkKGdldHVpZCgpKTsKK30KKworbm9tYXNrIGludCBuZXdfZ3Vlc3QgKCkgeworICBpbnQgaXg7CisKKyAgaWYgKCFtYXhfZ3Vlc3RzKSByZXR1cm4gMDsKKyAgaWYgKGxvYWRfbmFtZShwcmV2aW91c19vYmplY3QoKSkgIT0gIi9zZWN1cmUvbG9naW4iKQorICAgIHJldHVybiAwOworIAorICBpZiAoKGl4ID0gbWVtYmVyKGd1ZXN0cywwKSkgPT0gLTEpIHsKKyAgICBpeCA9IHNpemVvZihndWVzdHMpOworICAgIGlmIChtYXhfZ3Vlc3RzIDwgMCB8fCBpeCA8IG1heF9ndWVzdHMpIAorICAgIHsKKyAgICAgIGd1ZXN0cyArPSAoeyAwIH0pLCBsdGltZSArPSAoeyAwIH0pOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGludCBtaW50aW1lLCBtaW5peDsKKyAgICAgIG1pbnRpbWUgPSB0aW1lKCk7CisgICAgICBmb3IgKGl4ID0gMDsgaXggPCBzaXplb2YoZ3Vlc3RzKTsgaXgrKykgeworICAgICAgICBpZiAoZ3Vlc3RzW2l4XSAmJiBsdGltZVtpeF0gPCBtaW50aW1lKSB7CisgICAgICAgICAgbWludGltZT1sdGltZVtpeF07CisgICAgICAgICAgbWluaXg9aXg7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGl4ID0gbWluaXg7CisgICAgfQorICB9CisgIHJldHVybiBpeCsxOworfQorCitub21hc2sgdm9pZCBzZXRfZ3Vlc3QgKGludCBpeCwgb2JqZWN0IHBsKSB7CisgIGlmIChsb2FkX25hbWUocHJldmlvdXNfb2JqZWN0KCkpICE9ICIvc2VjdXJlL2xvZ2luIikgcmV0dXJuOworICBndWVzdHNbaXgtMV0gPSBwbDsKKyAgbHRpbWVbaXgtMV0gPSB0aW1lKCk7Cit9CisKK25vbWFzayBpbnQgcXVlcnlfbWF4X2d1ZXN0cygpIHsgcmV0dXJuIG1heF9ndWVzdHM7IH0KK25vbWFzayBpbnQgc2V0X21heF9ndWVzdHMoaW50IHYpIHsKKyAgaWYgKCFwcm9jZXNzX2NhbGwoKSAmJiBMT1JEX1NFQ1VSSVRZKQorICAgIG1heF9ndWVzdHMgPSB2OworICByZXR1cm4gbWF4X2d1ZXN0czsKK30KKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL2ltcGZldGNoLmMgYi9zZWN1cmUvaW1wZmV0Y2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzU1NmJmCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL2ltcGZldGNoLmMKQEAgLTAsMCArMSwyNCBAQAorLy8gSW1wIEZldGNoZXIKKworI2RlZmluZSBGVFBEICJzZWN1cmUvZnRwZCIKKyNkZWZpbmUgRlRQSU1QICJzdGQvc2hlbGxzL2ZpbGVzeXMvZnRwaW1wIgorCisjZGVmaW5lIEQobXNnKSBpZihmaW5kX3BsYXllcigicnVtYXRhIikpdGVsbF9vYmplY3QoZmluZF9wbGF5ZXIoInJ1bWF0YSIpLG1zZykKKwordm9pZCBjcmVhdGUoKSB7fQorCitub21hc2sgbWl4ZWQgaW1wRm9yKCBzdHJpbmcgbmFtZSApIHsKKyAgICBvYmplY3QgaW1wOworICAgIHN0cmluZyBmbmFtZTsKKworICAgIGZuYW1lID0gIi9mdHBpbXA6IiArIG5hbWU7CisgICAgaW1wID0gZmluZF9vYmplY3QoIGZuYW1lICk7CisgICAgaWYoICFvYmplY3RwKGltcCkgKSB7CisJc2V0ZXVpZCggbmFtZSApOworCWltcCA9IGNsb25lX29iamVjdCggRlRQSU1QICk7CisJaW1wLT5TZXRVc2VyKCBuYW1lICk7CisJcmVuYW1lX29iamVjdCggaW1wLCBmbmFtZSApOworICAgICAgICBkZXN0cnVjdCggdGhpc19vYmplY3QoKSApOyAvLyBuZXh0IGltcCBtdXN0IGhhdmUgcm9vdGlkIGFnYWluCisgICAgfQorICAgIHJldHVybiBpbXA7Cit9CmRpZmYgLS1naXQgYS9zZWN1cmUvaW5ldGQuYyBiL3NlY3VyZS9pbmV0ZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYjkxNDUKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvaW5ldGQuYwpAQCAtMCwwICsxLDgwOCBAQAorLyoKKyAqIFVEUCBwb3J0IGhhbmRsaW5nIGNvZGUuIFZlcnNpb24gMC43YQorICogV3JpdHRlbiBieSBOb3N0cmFkYW11cyBmb3IgWmViZWRlZS4KKyAqIERldmVsb3BlZCBmcm9tIGFuIG9yaWdpbmFsIGNvbmNlcHQgYnkgQWx2aW5AU3VzaGkuCisgKi8KKworI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgbm9fc2hhZG93CisjcHJhZ21hIG5vX2luaGVyaXQKKyNwcmFnbWEgdmVyYm9zZV9lcnJvcnMKKy8vI3ByYWdtYSBwZWRhbnRpYworI3ByYWdtYSBub19yYW5nZV9jaGVjaworI3ByYWdtYSBub193YXJuX2RlcHJlY2F0ZWQKKworCisjaW5jbHVkZSA8bGl2aW5nL2NvbW0uaD4KKyNkZWZpbmUgWkRFQlVHKHgpICAgICAgICBpZiAoZmluZF9wbGF5ZXIoInplc3N0cmEiKSlcCisgICAgICAgICAgICBmaW5kX3BsYXllcigiemVzc3RyYSIpLT5SZWNlaXZlTXNnKHgsIFwKKyAgICAgICAgICAgICAgICBNVF9ERUJVR3xNU0dfRE9OVF9TVE9SRSwwLCJJTTogIix0aGlzX29iamVjdCgpKQorCisvLyNkZWZpbmUgWkRFQlVHKHgpCisKKyNpbmNsdWRlIDx1ZHAuaD4KKworLyogLS0tIENvbmZpZ3VyYWJsZSBkZWZpbml0aW9ucy4gLS0tICovCisKKy8qIENEIG11ZHMgd2lsbCBwcm9iYWJseSBuZWVkIHRoZXNlIGluY2x1ZGUgZmlsZS4gKi8KKy8qICNpbmNsdWRlIDxzdGQuaD4gKi8KKy8qICNpbmNsdWRlICIvY29uZmlnL3N5cy9sb2NhbC5oIiAqLworCisvKiBQdWJsaWMgY29tbWFuZHMgd2hpY2ggd2lsbCBiZSBhY2Nlc3NpYmxlIHRvIGFueSB1bmxpc3RlZCBtdWRzLgorICogUElORywgUVVFUlkgYW5kIFJFUExZIGFyZSBpbmNsdWRlZCBieSBkZWZhdWx0LiAqLworI2RlZmluZSBDT01NQU5EUyBcCisoeyAiY2hhbm5lbCIsICJmaW5nZXIiLCAidGVsbCIsICJ3aG8iLCAibWFpbCIsICJ3d3ciLCAiaHRtbHdobyIsICJsb2NhdGUiIH0pCisKKy8vKHsgImNoYW5uZWwiLCAiZmluZ2VyIiwgImZ0cCIsICJsb2NhdGUiLCAibWFuIiwgInRlbGwiLCAid2hvIiB9KQorCisvKiBEZWZpbmUgdGhpcyB0byB0aGUgb2JqZWN0IHRoYXQgcmVjZWl2ZXMgaW5jb21pbmcgcGFja2V0cyBhbmQgcGFzc2VzCisgKiB0aGVtIHRvIHRoZSBpbmV0ZC4gVW5kZWZpbmUgZm9yIG5vIF9yZWNlaXZlX3VkcCgpIHNlY3VyaXR5LgorICogTk9URTogVGhlIHN0cmluZyBtdXN0IGJlIG9mIHRoZSBmb3JtYXQgdGhhdCBvYmplY3RfbmFtZSgpIHJldHVybnMuICovCisjZGVmaW5lIFVEUF9NQVNURVIgICAgICAgICAgICAgICAgX19NQVNURVJfT0JKRUNUX18KKworLyogSG93IHRvIHNldCB0aGUgZXVpZCBmb3IgdGhpcyBvYmplY3QgaWYgdXNpbmcgbmF0aXZlIG1vZGUuCisgKiBFbnN1cmUgdGhhdCBpdCBjYW4gcmVhZCB0aGUgSU5FVERfSE9TVFMgZmlsZS4gKi8KKyNkZWZpbmUgU0VUX0VVSUQgICAgICAgICAgICAgICAgc2V0ZXVpZChnZXR1aWQoKSkKKworLyogRGVmaW5lIHRoaXMgaWYgeW91IGFyZSBydW5uaW5nIGFub3RoZXIgaW50ZXJtdWQgcGFja2FnZSBjb25jdXJyZW50bHkuICovCisvKiAjZGVmaW5lIFJFQ0VJVkVfVURQX0NPTVBBVChzZW5kZXIsIHBhY2tldCkgXAorICAgICAgICAgICAgICAgIFVEUF9NQU5BR0VSLT5pbmNvbWluZ191ZHAoc2VuZGVyLCBwYWNrZXQpICAgICAgICAvLyBDRCAqLworCisvKiBEZWZpbmUgdGhpcyBpZiB5b3UgYXJlIHJ1bm5pbmcgYW5vdGhlciBpbnRlcm11ZCBwYWNrYWdlIGNvbmN1cnJlbnRseSBhbmQKKyAqIGhhdmUgYSBjb21wYXRhYmlsaXR5IG1vZHVsZSBmb3IgaXQuICovCisvKiAjZGVmaW5lIFNFTkRfVURQX0NPTVBBVChtdWRuYW1lLCBkYXRhLCBleHBlY3RfcmVwbHkpIFwKKyAgICAgICAgICAgICAgICAiL3NlY3VyZS91ZHBfY29tcGF0Ii0+X3NlbmRfdWRwKG11ZG5hbWUsIGRhdGEsIGV4cGVjdF9yZXBseSkgKi8KKworLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgd2UgY2FuIHNlbmQgaW4gb25lIHBhY2tldC4KKyAqIFlvdSBtYXkgbmVlZCB0byByZWR1Y2UgdGhpcywgYnV0IDUxMiBzaG91bGQgYmUgc2FmZS4gKi8KKyNkZWZpbmUgTUFYX1BBQ0tFVF9MRU4gICAgICAgIDEwMjQKKworLyogWW91IHNob3VsZG4ndCBuZWVkIHRvIGNoYW5nZSBhbnl0aGluZyBiZWxvdy4gKi8KKworI2RlZmluZSBVU0VfT0xEX0RFTElNSVRFUgorLy8jZGVmaW5lIERFTElNSVRFUl9DT01QQVQKKyNkZWZpbmUgVVNFX09MRF9EQVRBX0ZPUk1BVAorCisjaWZkZWYgWkVCRURFRQorI2luY2x1ZGUgPGRlZnMuaD4KKyNlbmRpZgorCisjaWZuZGVmIERBVEUKKyNkZWZpbmUgREFURSAgICAgICAgICAgICAgICBjdGltZSh0aW1lKCkpWzQuLjE1XQorI2VuZGlmCisKKy8qIC0tLSBFbmQgb2YgQ29uZmlnLiBEbyBub3QgYWx0ZXIgYW55dGhpbmcgYmVsb3cuIC0tLSAqLworCisjZGVmaW5lIFVOS05PV04gICAgICAgICAgICAgICAgMAorI2RlZmluZSBVUCAgICAgICAgICAgICAgICB0aW1lKCkKKyNkZWZpbmUgRE9XTiAgICAgICAgICAgICAgICAoLXRpbWUoKSkKKworI2RlZmluZSBORVdfREVMSU1JVEVSICAgICAgICAiXG4iCisjaWZkZWYgVVNFX09MRF9ERUxJTUlURVIKKyNkZWZpbmUgREVMSU1JVEVSICAgICAgICAifCIKKyNlbHNlCisjZGVmaW5lIERFTElNSVRFUiAgICAgICAgIlxuIgorI2VuZGlmCisjZGVmaW5lIE9MRF9ERUxJTUlURVIgICAgICAgICJ8IgorI2RlZmluZSBIT1NURklMRV9ERUwgICAgICAgICI6IgorI2RlZmluZSBIT1NURklMRV9ERUwyICAgICAgICAiLCIKKyNkZWZpbmUgUkVUUlkgICAgICAgICAgICAgICAgIl9SRVRSWSIKKworcHJpdmF0ZSBub3NhdmUgbWFwcGluZyBob3N0cywgcGVuZGluZ19kYXRhLCBpbmNvbWluZ19wYWNrZXRzOworcHJpdmF0ZSBub3NhdmUgbWFwcGluZyBzdGF0aWNfaG9zdF9saXN0OworcHJpdmF0ZSBub3NhdmUgc3RyaW5nICpyZWNlaXZlZF9pZHM7Citwcml2YXRlIG5vc2F2ZSBpbnQgcGFja2V0X2lkOworCit2b2lkIHNldF9ob3N0X2xpc3QoKTsKK3ZhcmFyZ3Mgc3RyaW5nIF9zZW5kX3VkcChzdHJpbmcgbXVkbmFtZSwgbWFwcGluZyBkYXRhLCBpbnQgZXhwZWN0X3JlcGx5KTsKKworI2RlZmluZSBERUJVRyhtc2cpCisKK3ZvaWQgbXlfY3JlYXRlKCkgeworI2lmbmRlZiBDT01QQVRfRkxBRworICAgIFNFVF9FVUlEOworI2VuZGlmCisgICAgcGFja2V0X2lkID0gMDsKKyAgICBwZW5kaW5nX2RhdGEgPSAoWyBdKTsKKyAgICBpbmNvbWluZ19wYWNrZXRzID0gKFsgXSk7CisgICAgaG9zdHMgPSAoWyBdKTsKKyAgICByZWNlaXZlZF9pZHMgPSAoeyB9KTsKKyAgICBzZXRfaG9zdF9saXN0KCk7CisgICAgaWYgKCF0aGlzX3BsYXllcigpKQorICAgICAgICBjYWxsX291dCgic3RhcnR1cCIsIDEsIDApOworfQorCisjaWZkZWYgQ1JFQVRFX0ZVTgorQ1JFQVRFX0ZVTigpIHsKKyNlbGlmICFkZWZpbmVkKENPTVBBVF9GTEFHKSB8fCBkZWZpbmVkKFpFQkVERUUpCit2b2lkIGNyZWF0ZSgpIHsKKyNlbHNlCit2b2lkIHJlc2V0KGFyZykgeworICAgIGlmIChhcmcpCisgICAgICAgIHJldHVybjsKKyNlbmRpZgorICAgIG15X2NyZWF0ZSgpOworfQorCitzdGF0dXMgY2hlY2tfc3lzdGVtX2ZpZWxkKG1hcHBpbmcgZGF0YSwgc3RyaW5nIGZpZWxkKSB7CisgICAgcmV0dXJuIGRhdGFbU1lTVEVNXSAmJiBtZW1iZXIoZGF0YVtTWVNURU1dLCBmaWVsZCkgIT0gLTE7Cit9CisKK21hcHBpbmcgYWRkX3N5c3RlbV9maWVsZChtYXBwaW5nIGRhdGEsIHN0cmluZyBmaWVsZCkgeworICAgIGlmIChkYXRhW1NZU1RFTV0pIHsKKyAgICAgICAgaWYgKCFjaGVja19zeXN0ZW1fZmllbGQoZGF0YSwgZmllbGQpKQorICAgICAgICAgICAgZGF0YVtTWVNURU1dICs9ICh7IGZpZWxkIH0pOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGRhdGFbU1lTVEVNXSA9ICh7IGZpZWxkIH0pOworICAgIHJldHVybiBkYXRhOworfQorCitwcml2YXRlIG1hcHBpbmcgcmVhZF9ob3N0X2xpc3Qoc3RyaW5nIGZpbGUpIHsKKworICBtaXhlZCBkYXRhID0gKHJlYWRfZmlsZShmaWxlKSk7CisgIGlmICghZGF0YSkgeworICAgIGxvZ19maWxlKElORVREX0xPR19GSUxFLCAiKkVycm9yIGluIHJlYWRpbmcgaG9zdCBmaWxlOiAiCisgICAgICAgICsgZmlsZSArIlxuXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGRhdGEgPSBvbGRfZXhwbG9kZShkYXRhLCAiXG4iKTsKKyAgbWFwcGluZyBuZXdfaG9zdHMgPSBtX2FsbG9jYXRlKHNpemVvZihkYXRhKSwxKTsKKworICBmb3JlYWNoKHN0cmluZyBsaW5lOiBkYXRhKSB7CisgICAgaWYgKGxpbmUgPT0gIiIgfHwgbGluZVswXSA9PSAnIycpCisgICAgICBjb250aW51ZTsKKyAgICBtaXhlZCBmaWVsZHMgPSBvbGRfZXhwbG9kZShsaW5lLCBIT1NURklMRV9ERUwpOworICAgIGlmIChzaXplb2YoZmllbGRzKSA8IDUpIHsKKyAgICAgIGxvZ19maWxlKElORVREX0xPR19GSUxFLCBzcHJpbnRmKAorICAgICAgICAgICAgIipQYXJzZSBlcnJvciBpbiBob3N0cyBmaWxlOiAlcywgTGluZTogJXNcbiIsIGZpbGUsIGxpbmUpKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIHN0cmluZyBuYW1lID0gbG93ZXJfY2FzZShmaWVsZHNbSE9TVF9OQU1FXSk7CisgICAgaWYgKG1lbWJlcihuZXdfaG9zdHMsIG5hbWUpKQorICAgICAgY29udGludWU7IC8vIG11ZCBhbHJlYWR5IGluIGxpc3QKKworICAgIHN0cmluZyAqbG9jYWxfY21kcyA9IG9sZF9leHBsb2RlKGZpZWxkc1tMT0NBTF9DT01NQU5EU10sSE9TVEZJTEVfREVMMik7CisgICAgaWYgKG1lbWJlcihsb2NhbF9jbWRzLCIqIikgIT0gLTEpCisgICAgICAgIGxvY2FsX2NtZHMgPSBsb2NhbF9jbWRzIC0gKHsgIioiIH0pICsgQ09NTUFORFM7CisgICAgCisgICAgbmV3X2hvc3RzW25hbWVdID0gKHsgY2FwaXRhbGl6ZShmaWVsZHNbSE9TVF9OQU1FXSksCisgICAgICAgICAgICAgICAgICAgICBmaWVsZHNbSE9TVF9JUF0sCisgICAgICAgICAgICAgICAgICAgICB0b19pbnQoZmllbGRzW0hPU1RfVURQX1BPUlRdKSwKKyAgICAgICAgICAgICAgICAgICAgIGxvY2FsX2NtZHMsCisgICAgICAgICAgICAgICAgICAgICBvbGRfZXhwbG9kZShmaWVsZHNbSE9TVF9DT01NQU5EU10sIEhPU1RGSUxFX0RFTDIpLAorICAgICAgICAgICAgICAgICAgICAgVU5LTk9XTgorICAgICAgICAgICAgICAgICAgIH0pOworICAgIC8qCisgICAgICogR2V0IGV4aXN0aW5nIGhvc3Qgc3RhdHVzIGZyb20gY3VycmVudCBhY3RpdmUgaG9zdCBsb3N0IGFzIGxvbmcgYXMgdGhlCisgICAgICogSVAgYW5kIFVEUCBwb3J0cyBhcmUgdGhlIHNhbWUuCisgICAgICovCisgICAgaWYgKGhvc3RzW25hbWVdICYmCisgICAgICAgIGhvc3RzW25hbWVdW0hPU1RfSVBdID09IG5ld19ob3N0c1tuYW1lXVtIT1NUX0lQXSAmJgorICAgICAgICBob3N0c1tuYW1lXVtIT1NUX1VEUF9QT1JUXSA9PSBuZXdfaG9zdHNbbmFtZV1bSE9TVF9VRFBfUE9SVF0pCisgICAgICAgIG5ld19ob3N0c1tuYW1lXVtIT1NUX1NUQVRVU10gPSBob3N0c1tuYW1lXVtIT1NUX1NUQVRVU107CisgIH0KKyAgcmV0dXJuIG5ld19ob3N0czsKK30KKworLyoKKyAqIFJlYWQgdGhlIElORVREX0hPU1RTIGZpbGUgYW5kIHNldCB0aGUgImhvc3RzIiBtYXBwaW5nIGZyb20gaXQuCisgKiBSZXRhaW4gZXhpc3RpbmcgSE9TVF9TVEFUVVMgZmllbGRzLgorICogUmVhZHMgSU5FVERfSE9TVFNTIGFuZCBJTkVURF9IT1NUUy5kdW1wCisgKiBIb3N0cyBmcm9tIElORVREX0hPU1RTIGFyZSBpbmNsdWRlZCBpbiB0aGUgc3RhdGljIGhvc3QgbGlzdC4KKyAqLwordm9pZCBzZXRfaG9zdF9saXN0KCkgeworCisgIC8vIHJlYWQgdGhlIHN0YXRpYyBob3N0IGZpbGUgYW5kIHRoZSBsYXN0IGhvc3QgZmlsZSBkdW1wLgorICBtYXBwaW5nIHN0YXRpY19ob3N0cyA9IHJlYWRfaG9zdF9saXN0KEhPU1RfRklMRSk7CisgIGlmICghc3RhdGljX2hvc3RzKQorICAgICAgcmV0dXJuOyAvLyByZXRhaW4gdGhlIG9sZCBsaXN0KHMpCisKKyAgLy8gcmVtZW1iZXIgdGhlIHN0YXRpYyBob3N0cworICBzdGF0aWNfaG9zdF9saXN0ID0gbV9yZWFsbG9jYXRlKHN0YXRpY19ob3N0cywwKTsKKyAgCisgIC8vIHJlYWQgdGhlIGxhc3QgaG9zdCBmaWxlIGR1bXAgYW5kIGFkZCB0aGUgc3RhdGljIGhvc3RzLiBUaGVuIHRoZSBzdGF0aWMKKyAgLy8gaG9zdHMgaGF2ZSBwcmVjZWRlbmNlIG92ZXIgdGhlIG9uZXMgZnJvbSB0aGUgZHVtcC4KKyAgaG9zdHMgPSAocmVhZF9ob3N0X2xpc3QoSE9TVF9GSUxFIi5kdW1wIikgfHwgKFtdKSkgKyBzdGF0aWNfaG9zdHM7CisKK30KKworbWl4ZWQgZ2V0X2hvc3RzKCkge3JldHVybiBjb3B5KGhvc3RzKTt9CisKK2ludCAgZHVtcF9ob3N0c19saXN0KCkgeworICAKKyAgd3JpdGVfZmlsZShIT1NUX0ZJTEUrIi5kdW1wIiwgc3ByaW50ZigKKyAgICAiI0hvc3RsaXN0IGR1bXAgZnJvbSAiTVVETkFNRSIsIGNyZWF0ZWQgJXNcbiIsIHN0cmZ0aW1lKCkpLCAxKTsKKworICBmb3JlYWNoKHN0cmluZyBtdWRuYW1lLCBtaXhlZCB0bXAgOiBob3N0cykgeworICAgIC8vIHNraXAgbXVkcyB3ZSBkaWQgbm90IGhlYXIgZnJvbSBmb3IgMiBkYXlzLgorLy8gICAgaWYgKHRtcFtIT1NUX1NUQVRVU10gKyAxNzI4MDAgPCB0aW1lKCkpCisvLyAgICAgIGNvbnRpbnVlOworICAgIHdyaXRlX2ZpbGUoSE9TVF9GSUxFKyIuZHVtcCIsCisgICAgICAgIHNwcmludGYoIiVzOiVzOiVkOiVzOiVzXG4iLHRtcFswXSx0bXBbMV0sdG1wWzJdLGltcGxvZGUodG1wWzNdLCIsIiksCisgICAgICAgICAgaW1wbG9kZSh0bXBbNF0sIiwiKSkpOworICB9CisgIHJldHVybiAxOworfQorCisvKgorICogTWFrZSBhIFBJTkcgcmVxdWVzdCB0byBhbGwgbXVkcyBpbiB0aGUgImhvc3RzIiBtYXBwaW5nIHRvIHNldAorICogSE9TVF9TVEFUVVMgaW5mb3JtYXRpb24uCisgKiBCdXQgZG9uJ3QgcGluZyBhbGwgbXVkcyBhdCBvbmNlLCBiZWNhdXNlIHRoYXQgbWF5IG92ZXJmbG93IHRoZSBjYWxsb3V0CisgKiB0YWJsZSBkdXJpbmcgbXVkIHN0YXJ0dXAsIHdoZW4gaHVuZHJlZHMgb2Ygb2JqZWN0cyBtYWtlIGNhbGxvdXRzLgorICovCit2b2lkIHN0YXJ0dXAoc3RyaW5nICptdWRzKSB7CisKKyAgICBpZiAoIXBvaW50ZXJwKG11ZHMpKQorICAgICAgbXVkcz1tX2luZGljZXMoaG9zdHMpOworICAgIGlmICghc2l6ZW9mKG11ZHMpKQorICAgICAgcmV0dXJuOworICAgIHN0cmluZyAqcGFydDsKKyAgICBpZiAoc2l6ZW9mKG11ZHMpID4gOSkKKyAgICAgIHBhcnQ9bXVkc1swLi45XTsKKyAgICBlbHNlCisgICAgICBwYXJ0PW11ZHM7CisgICAgZm9yZWFjaChzdHJpbmcgbXVkOiBwYXJ0KSAKKyAgICAgIF9zZW5kX3VkcChtdWQsIChbIFJFUVVFU1Q6IFBJTkcgXSksIDEpOworICAgIG11ZHMgLT0gcGFydDsKKyAgICBpZiAoc2l6ZW9mKG11ZHMpKQorICAgICAgY2FsbF9vdXQoIydzdGFydHVwLCA0LCBtdWRzKTsKK30KKworLyoKKyAqIFJlbW92ZSBhIGJ1ZmZlcmVkIHBhY2tldCBmcm9tIHRoZSAiaW5jb21pbmdfcGFja2V0cyIgbWFwcGluZy4KKyAqLwordm9pZCByZW1vdmVfaW5jb21pbmcoc3RyaW5nIGlkKSB7CisgICAgbV9kZWxldGUoaW5jb21pbmdfcGFja2V0cywgaWQpOworfQorCisvKgorICogRGVjb2RlIGEgc3RyaW5nIGZyb20gYSBVRFAgcGFja2V0LgorICogUmV0dXJuczogICBUaGUgYWN0dWFsIHZhbHVlIG9mIHRoZSBhcmd1bWVudCAoZWl0aGVyIGludCBvciBzdHJpbmcpCisgKi8KK21peGVkIGRlY29kZShzdHJpbmcgYXJnKSB7CisKKyAgICBpZiAoc2l6ZW9mKGFyZykgJiYgYXJnWzBdID09ICckJykKKyAgICAgICAgcmV0dXJuIGFyZ1sxLi5dOworI2lmZGVmIFJFU1RSSUNURURfQ0FTVFMKKyAgICBpZiAodG9fc3RyaW5nKHRvX2ludChhcmcpKSA9PSBhcmcpCisgICAgICAgIHJldHVybiB0b19pbnQoYXJnKTsKKyNlbHNlCisgICAgaWYgKChzdHJpbmcpKChpbnQpYXJnKSA9PSBhcmcpCisgICAgICAgIHJldHVybiAoaW50KWFyZzsKKyNlbmRpZgorICAgIHJldHVybiBhcmc7Cit9CisKKy8qCisgKiBEZWNvZGUgYSBVRFAgcGFja2V0LgorICogQXJndW1lbnRzOiBVRFAgcGFja2V0IGFzIGEgc3RyaW5nLgorICogUmV0dXJuczogICBUaGUgZGVjb2RlZCBpbmZvcm1hdGlvbiBhcyBhIG1hcHBpbmcsIDEgZm9yIHN1Y2NlcyBidXQgbm8KKyAqICAgICAgICAgICAgb3V0cHV0IChidWZmZXJlZCBwYWNrZXQpLCBvciAwIG9uIGVycm9yLgorICovCittaXhlZCBkZWNvZGVfcGFja2V0KHN0cmluZyBwYWNrZXQsIHN0cmluZyBkZWxpbWl0ZXIpIHsKKyAgICBzdHJpbmcgKmRhdGE7CisgICAgbWFwcGluZyByZXQ7CisgICAgc3RyaW5nIGluZm8sIHRtcDsKKyAgICBtaXhlZCBjbGFzczsKKyAgICBpbnQgaSwgaWQsIG47CisKKyAgICAvKiBJZiB0aGlzIHBhY2tldCBoYXMgYmVlbiBzcGxpdCwgaGFuZGxlIGJ1ZmZlcmluZy4gKi8KKyAgICBpZiAocGFja2V0WzAuLnNpemVvZihQQUNLRVQpXSA9PSBQQUNLRVQgKyAiOiIpIHsKKyAgICAgICAgaWYgKHNzY2FuZihwYWNrZXQsIFBBQ0tFVCArICI6JXM6JWQ6JWQvJWQiICsgZGVsaW1pdGVyICsgIiVzIiwKKyAgICAgICAgY2xhc3MsIGlkLCBpLCBuLCB0bXApICE9IDUpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY2xhc3MgPSBsb3dlcl9jYXNlKGNsYXNzKSArICI6IiArIGlkOworICAgICAgICBpZiAocG9pbnRlcnAoaW5jb21pbmdfcGFja2V0c1tjbGFzc10pKSB7CisgICAgICAgICAgICBpbmNvbWluZ19wYWNrZXRzW2NsYXNzXVtpLTFdID0gdG1wOworICAgICAgICAgICAgaWYgKG1lbWJlcihpbmNvbWluZ19wYWNrZXRzW2NsYXNzXSwgMCkgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICByZXQgPQorICAgICAgICAgICAgICAgIGRlY29kZV9wYWNrZXQoaW1wbG9kZShpbmNvbWluZ19wYWNrZXRzW2NsYXNzXSwgIiIpLCBkZWxpbWl0ZXIpOworICAgICAgICAgICAgICAgIHJlbW92ZV9pbmNvbWluZyhjbGFzcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGluY29taW5nX3BhY2tldHNbY2xhc3NdID0gYWxsb2NhdGUobik7CisgICAgICAgICAgICBpbmNvbWluZ19wYWNrZXRzW2NsYXNzXVtpLTFdID0gdG1wOworLyogSXMgaXQgcG9zc2libGUgdG8gYWxyZWFkeSBoYXZlIGEgdGltZW91dCBydW5uaW5nIGhlcmUgPyE/ICovCisgICAgICAgICAgICAvKiBJZiBubyB0aW1lb3V0IGlzIHJ1bm5pbmcgdGhlbiBzdGFydCBvbmUuICovCisgICAgICAgICAgICBpZiAoIXBlbmRpbmdfZGF0YVtjbGFzc10pIHsKKyAgICAgICAgICAgICAgICBjYWxsX291dCgicmVtb3ZlX2luY29taW5nIiwKKyAgICAgICAgICAgICAgICBSRVBMWV9USU1FX09VVCArIFJFUExZX1RJTUVfT1VUICogUkVUUklFUywgY2xhc3MpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBERUJVRygiXG5JTkVURDogKioqIEJ1ZmZlcmVkIHBhY2tldCBUaW1lb3V0IGFscmVhZHkgcnVubmluZyEgKioqXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0ID0gKFsgXSk7CisgICAgZm9yKGkgPSAwLCBuID0gc2l6ZW9mKGRhdGEgPSBvbGRfZXhwbG9kZShwYWNrZXQsIGRlbGltaXRlcikpOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIC8qIERBVEEgZmllbGRzIGNhbiBiZSBkZW5vdGVkIGJ5IGEgcHJlY2VlZGluZyBibGFuayBmaWVsZC4gKi8KKyAgICAgICAgaWYgKGRhdGFbaV0gPT0gIiIpIHsKKyAgICAgICAgICAgIHRtcCA9IERBVEE7CisgICAgICAgICAgICAvKiBUZXN0IGZvciBpbGxlZ2FsIHBhY2tldCBsZW5ndGggKG5vIERBVEEpICovCisgICAgICAgICAgICBpZiAoKytpID49IG4pCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBpbmZvID0gZGF0YVtpXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzc2NhbmYoZGF0YVtpXSwgIiVzOiVzIiwgdG1wLCBpbmZvKSAhPSAyKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHN3aXRjaCgoc3RyaW5nKShjbGFzcyA9IGRlY29kZSh0bXApKSkgeworICAgICAgICAgICAgY2FzZSBEQVRBOgorI2lmZGVmIFVTRV9FWFRSQUNUCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldCArIChbIERBVEE6IGRlY29kZShpbXBsb2RlKAorICAgICAgICAgICAgICAgICAgICAoeyBpbmZvIH0pICsgZXh0cmFjdChkYXRhLCBpKzEpLCBkZWxpbWl0ZXIpKSBdKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldCArIChbIERBVEE6IGRlY29kZShpbXBsb2RlKAorICAgICAgICAgICAgICAgICAgICAoeyBpbmZvIH0pICsgZGF0YVtpKzEuLl0sIGRlbGltaXRlcikpIF0pOworI2VuZGlmCisgICAgICAgICAgICBjYXNlIFNZU1RFTToKKyAgICAgICAgICAgICAgICByZXRbY2xhc3NdID0gb2xkX2V4cGxvZGUoaW5mbywgIjoiKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0W2NsYXNzXSA9IGRlY29kZShpbmZvKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCisvKiBDaGVjayB3ZXRoZXIgYSBVRFAgcGFja2V0IHdhcyB2YWxpZC4KKyAqIExvZ3MgYXJlIG1hZGUgYW5kICJob3N0IiBpbmZvcm1hdGlvbiBpcyB1cGRhdGVkIGFzIGFwcHJvcHJpYXRlLgorICogQXJndW1lbnRzOiBEZWNvZGVkIFVEUCBwYWNrZXQgKG1hcHBpbmcpCisgKiBSZXR1cm5zOiAgIDAgZm9yIHZhbGlkIHBhY2tldHMsIGFuIGVycm9yIHN0cmluZyBvdGhlcndpc2UuCisgKi8KK3N0cmluZyB2YWxpZF9yZXF1ZXN0KG1hcHBpbmcgZGF0YSkgeworICAgIG1peGVkIGhvc3RfZGF0YTsKKyAgICBzdHJpbmcgKm11ZHM7CisgICAgc3RyaW5nIHJlcTsKKyAgICBpbnQgaTsKKyAgICAKKyAgICBpZiAoIWRhdGFbTkFNRV0gfHwgIWRhdGFbVURQX1BPUlRdKQorICAgICAgICByZXR1cm4gREFURSArICI6IElsbGVnYWwgcGFja2V0LlxuIjsKKyAgICBpZiAoaG9zdF9kYXRhID0gaG9zdHNbbG93ZXJfY2FzZShkYXRhW05BTUVdKV0pIHsKKyAgICAgICAgaWYgKGRhdGFbSE9TVF0gIT0gaG9zdF9kYXRhW0hPU1RfSVBdKSB7CisgICAgICAgICAgICBpZiAoZGF0YVtOQU1FXSA9PSBMT0NBTF9OQU1FKQorICAgICAgICAgICAgICAgIHJldHVybiBEQVRFICsgIjogKioqIEZBS0UgTVVEICoqKlxuIjsKKyAgICAgICAgICAgIGxvZ19maWxlKElORVREX0xPR19GSUxFLCBEQVRFICsgIjogSG9zdCBjaGFuZ2U6XG4iICsKKyAgICAgICAgICAgIGhvc3RfZGF0YVtIT1NUX05BTUVdICsgIjogIiArIGhvc3RfZGF0YVtIT1NUX0lQXSArICIgLT4gIiArCisgICAgICAgICAgICBkYXRhW0hPU1RdICsgIlxuXG4iKTsKKyAgICAgICAgICAgIGhvc3RfZGF0YVtIT1NUX0lQXSA9IGRhdGFbSE9TVF07CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRhdGFbVURQX1BPUlRdICE9IGhvc3RfZGF0YVtIT1NUX1VEUF9QT1JUXSkgeworICAgICAgICAgICAgaWYgKGRhdGFbTkFNRV0gPT0gTE9DQUxfTkFNRSkKKyAgICAgICAgICAgICAgICByZXR1cm4gREFURSArICI6ICoqKiBGQUtFIE1VRCAqKipcbiI7CisgICAgICAgICAgICBsb2dfZmlsZShJTkVURF9MT0dfRklMRSwgREFURSArICI6IFBvcnQgY2hhbmdlOlxuIiArCisgICAgICAgICAgICAgICAgaG9zdF9kYXRhW0hPU1RfTkFNRV0gKyAiICgiICsgaG9zdF9kYXRhW0hPU1RfSVBdICsgIik6ICIgKworICAgICAgICAgICAgICAgIGhvc3RfZGF0YVtIT1NUX1VEUF9QT1JUXSArICIgLT4gIiArIGRhdGFbVURQX1BPUlRdICsgIlxuXG4iKTsKKyAgICAgICAgICAgIGhvc3RfZGF0YVtIT1NUX1VEUF9QT1JUXSA9IGRhdGFbVURQX1BPUlRdOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGxvd2VyX2Nhc2UoZGF0YVtOQU1FXSkgPT0gbG93ZXJfY2FzZShMT0NBTF9OQU1FKSkKKyAgICAgICAgICAgIHJldHVybiBEQVRFICsgIjogKioqIEZBS0UgTVVEICoqKlxuIjsKKyAgICAgICAgZm9yKGkgPSBzaXplb2YobXVkcyA9IG1faW5kaWNlcyhob3N0cykpOyBpLS07ICkgeworICAgICAgICAgICAgaG9zdF9kYXRhID0gaG9zdHNbbXVkc1tpXV07CisgICAgICAgICAgICBpZiAoZGF0YVtIT1NUXSA9PSBob3N0X2RhdGFbSE9TVF9JUF0gJiYKKyAgICAgICAgICAgIGRhdGFbVURQX1BPUlRdID09IGhvc3RfZGF0YVtIT1NUX1VEUF9QT1JUXSkgeworICAgICAgICAgICAgICAgIGxvZ19maWxlKElORVREX0xPR19GSUxFLCBEQVRFICsgIjogTmFtZSBjaGFuZ2U6XG4iICsKKyAgICAgICAgICAgICAgICAgICAgaG9zdF9kYXRhW0hPU1RfTkFNRV0gKyAiICgiICsgaG9zdF9kYXRhW0hPU1RfSVBdICsKKyAgICAgICAgICAgICAgICAgICAgIikgLT4gIiArIGRhdGFbTkFNRV0gKyAiXG5cbiIpOworICAgICAgICAgICAgICAgIGhvc3RfZGF0YVtIT1NUX05BTUVdID0gZGF0YVtOQU1FXTsKKyAgICAgICAgICAgICAgICBob3N0c1tsb3dlcl9jYXNlKGRhdGFbTkFNRV0pXSA9IGhvc3RfZGF0YTsKKyAgICAgICAgICAgICAgICBtX2RlbGV0ZShob3N0cywgbXVkc1tpXSk7CisgICAgICAgICAgICAgICAgaSA9IC0yOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpICE9IC0yKSB7CisgICAgICAgICAgICBob3N0X2RhdGEgPSBob3N0c1tsb3dlcl9jYXNlKGRhdGFbTkFNRV0pXSA9ICh7CisgICAgICAgICAgICAgICAgZGF0YVtOQU1FXSwKKyAgICAgICAgICAgICAgICBkYXRhW0hPU1RdLAorICAgICAgICAgICAgICAgIGRhdGFbVURQX1BPUlRdLAorICAgICAgICAgICAgICAgIENPTU1BTkRTLAorICAgICAgICAgICAgICAgICh7ICIqIiB9KSwKKyAgICAgICAgICAgICAgICBVUAorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBsb2dfZmlsZShJTkVURF9MT0dfRklMRSwgREFURSArICI6IE5ldyBtdWQuXG4iICsgZGF0YVtOQU1FXSArICI6IiArCisgICAgICAgICAgICBkYXRhW0hPU1RdICsgIjoiICsgZGF0YVtVRFBfUE9SVF0gKyAiXG5cbiIpOworICAgICAgICB9CisgICAgfQorICAgIGlmICghKHJlcSA9IGRhdGFbUkVRVUVTVF0pKQorICAgICAgICByZXR1cm4gREFURSArICI6IFN5c3RlbSBtZXNzYWdlLlxuIjsKKyAgICBpZiAocmVxICE9IFBJTkcgJiYKKyAgICAgICAgcmVxICE9IFFVRVJZICYmCisgICAgICAgIHJlcSAhPSBSRVBMWSAmJgorICAgICAgICBtZW1iZXIoaG9zdF9kYXRhW0xPQ0FMX0NPTU1BTkRTXSwgcmVxKSA9PSAtMSkKKyAgICB7CisgICAgICAgIC8qIFRoaXMgc2hvdWxkIHByb2JhYmx5IHNlbmQgYSBzeXN0ZW0gbWVzc2FnZSB0b28uICovCisgICAgICAgIF9zZW5kX3VkcChob3N0X2RhdGFbSE9TVF9OQU1FXSwgKFsKKyAgICAgICAgICAgIFJFUVVFU1Q6IFJFUExZLAorICAgICAgICAgICAgUkVDSVBJRU5UOiBkYXRhW1NFTkRFUl0sCisgICAgICAgICAgICBJRDogZGF0YVtJRF0sCisgICAgICAgICAgICBEQVRBOiAiSW52YWxpZCByZXF1ZXN0IEAiICsgTE9DQUxfTkFNRSArICI6ICIgKworICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZGF0YVtSRVFVRVNUXSkgKyAiXG4iCisgICAgICAgIF0pICk7CisgICAgICAgIHJldHVybiBEQVRFICsgIjogSW52YWxpZCByZXF1ZXN0LlxuIjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJbmNvbWluZyBVRFAgcGFja2V0cyBhcmUgc2VudCB0byB0aGlzIGZ1bmN0aW9uIHRvIGJlIGludGVycHJldHRlZC4KKyAqIFRoZSBwYWNrZXQgaXMgZGVjb2RlZCwgY2hlY2tlZCBmb3IgdmFsaWRpdHksIEhPU1RfU1RBVFVTIGlzIHVwZGF0ZWQKKyAqIGFuZCB0aGUgYXBwcm9wcmlhdGUgdWRwIG1vZHVsZSBjYWxsZWQuCisgKiBBcmd1bWVudHM6IFNlbmRlcnMgSVAgYWRkcmVzcyAoc3RyaW5nKQorICogICAgICAgICAgICBVRFAgcGFja2V0IChzdHJpbmcpCisgKi8KK3ZvaWQgX3JlY2VpdmVfdWRwKHN0cmluZyBzZW5kZXIsIHN0cmluZyBwYWNrZXQpIHsKKyAgICBtYXBwaW5nIGRhdGE7CisgICAgc3RyaW5nIHJlcSwgZXJyLCBpZDsKKworI2lmZGVmIFVEUF9NQVNURVIKKyAgICBpZiAoIXByZXZpb3VzX29iamVjdCgpIHx8CisgICAgb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpICE9IFVEUF9NQVNURVIpIHsKKyAgICAgICAgbG9nX2ZpbGUoSU5FVERfTE9HX0ZJTEUsIERBVEUgKyAiOiBJbGxlZ2FsIGNhbGwgb2YgX3JlY2VpdmVfdWRwKCkgYnkgIiArCisgICAgICAgIG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSArICJcblxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKworICAgIFpERUJVRyhzcHJpbnRmKCIlTyAtPiAlLjUwME9cbiIsc2VuZGVyLCBwYWNrZXQpKTsKKyAgICBpZiAoCisjaWZkZWYgREVMSU1JVEVSX0NPTVBBVAorI2lmZGVmIFVTRV9FWFRSQUNUCisgICAgICAgICghKGRhdGEgPSBkZWNvZGVfcGFja2V0KHBhY2tldCwgTkVXX0RFTElNSVRFUikpCisjZWxzZQorICAgICAgICAoIShkYXRhID0gZGVjb2RlX3BhY2tldChwYWNrZXQsIE5FV19ERUxJTUlURVIpKQorI2VuZGlmCisgICAgICAgIHx8IChkYXRhW0hPU1RdID0gc2VuZGVyKSAmJiAoZXJyID0gdmFsaWRfcmVxdWVzdChkYXRhKSkpICYmCisgICAgICAgICghKGRhdGEgPSBkZWNvZGVfcGFja2V0KHBhY2tldCwgT0xEX0RFTElNSVRFUikpIHx8CisgICAgICAgIChkYXRhW0hPU1RdID0gc2VuZGVyKSAmJiAoZXJyID0gdmFsaWRfcmVxdWVzdChkYXRhKSkpCisjZWxzZQorI2lmZGVmIFVTRV9FWFRSQUNUCisgICAgICAgICEoZGF0YSA9IGRlY29kZV9wYWNrZXQocGFja2V0LCBERUxJTUlURVIpKQorI2Vsc2UKKyAgICAgICAgIShkYXRhID0gZGVjb2RlX3BhY2tldChwYWNrZXQsIERFTElNSVRFUikpCisjZW5kaWYKKyNlbmRpZgorICAgICkgeworICAgICAgICBpZiAoIWRhdGEpCisjaWZkZWYgUkVDRUlWRV9VRFBfQ09NUEFUCisgICAgICAgICAgICBSRUNFSVZFX1VEUF9DT01QQVQoc2VuZGVyLCBwYWNrZXQpOworI2Vsc2UKKyAgICAgICAgICAgIGxvZ19maWxlKElORVREX0xPR19GSUxFLCBEQVRFICsgIjogUmVjZWl2ZWQgaW52YWxpZCBwYWNrZXQuXG5TZW5kZXI6ICIgKworICAgICAgICAgICAgc2VuZGVyICsgIlxuUGFja2V0OlxuIiArIHBhY2tldCArICJcblxuIik7CisjZW5kaWYKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNpZmRlZiBERUxJTUlURVJfQ09NUEFUCisgICAgaWYgKCFtYXBwaW5ncChkYXRhKSkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChlcnIpCisjZWxzZQorICAgICAgICAgIGlmICghbWFwcGluZ3AoZGF0YSkpCisgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgZGF0YVtIT1NUXSA9IHNlbmRlcjsKKyAgICBpZiAoZXJyID0gdmFsaWRfcmVxdWVzdChkYXRhKSkKKyNlbmRpZgorICAgIHsKKyAgICAgICAgbG9nX2ZpbGUoSU5FVERfTE9HX0ZJTEUsIGVyciArICJTZW5kZXI6ICIgKyBzZW5kZXIgKyAiXG5QYWNrZXQ6XG4iICsKKyAgICAgICAgcGFja2V0ICsgIlxuXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBob3N0c1tsb3dlcl9jYXNlKGRhdGFbTkFNRV0pXVtIT1NUX1NUQVRVU10gPSBVUDsKKyAgICBpZiAoKHJlcSA9IGRhdGFbUkVRVUVTVF0pID09IFJFUExZKSB7CisgICAgICAgICAgICBtYXBwaW5nIHBlbmRpbmc7CisKKyAgICAgICAgLyogSWYgd2UgY2FuJ3QgZmluZCB0aGUgcmVwbHkgaW4gdGhlIHBlbmRpbmcgbGlzdCB0aGVuIGJpbiBpdC4gKi8KKyAgICAgICAgaWYgKCEocGVuZGluZyA9IHBlbmRpbmdfZGF0YVtsb3dlcl9jYXNlKGRhdGFbTkFNRV0pICsgIjoiICsgZGF0YVtJRF1dKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgLyogU2V0IGRhdGFbUkVRVUVTVF0gY29ycmVjdGx5LCBidXQgc3RpbGwgc2VuZCB0byAocmVxID0gUkVQTFkpICovCisgICAgICAgIGRhdGFbUkVRVUVTVF0gPSBwZW5kaW5nW1JFUVVFU1RdOworI2lmZGVmIElORVREX0RJQUdOT1NUSUNTCisgICAgICAgIGRhdGFbUEFDS0VUX0xPU1NdID0gcGVuZGluZ1tQQUNLRVRfTE9TU107CisgICAgICAgIGRhdGFbUkVTUE9OU0VfVElNRV0gPSB0aW1lKCkgLSBwZW5kaW5nW1JFU1BPTlNFX1RJTUVdICsgMTsKKyNlbmRpZgorI2lmIDAKKy8qIGNoYW5uZWwgcmVwbGllcyBtYXkgbm90IGluY2x1ZGUgYSByZWNpcGllbnQsIGFuZCBzaG91bGRuJ3QgaGF2ZSBvbmUgc2V0ICovCisgICAgICAgIC8qIFJlc3RvcmUgdGhlIFJFQ0lQSUVOVCBpbiByZXBsaWVzIGlmIG5vbmUgZ2l2ZW4gYW5kIGl0IGlzIGtub3duLiAqLworICAgICAgICBpZiAoIWRhdGFbUkVDSVBJRU5UXSAmJiBwZW5kaW5nW1NFTkRFUl0pCisgICAgICAgICAgICBkYXRhW1JFQ0lQSUVOVF0gPSBwZW5kaW5nW1NFTkRFUl07CisjZW5kaWYKKyAgICAgICAgbV9kZWxldGUocGVuZGluZ19kYXRhLCBsb3dlcl9jYXNlKGRhdGFbTkFNRV0pICsgIjoiICsgZGF0YVtJRF0pOworICAgIH0KKyAgICBlbHNlIGlmIChkYXRhW0lEXSkgeworICAgICAgaWQgPSBsb3dlcl9jYXNlKGRhdGFbTkFNRV0pICsgIjoiICsgZGF0YVtJRF07CisgICAgICBpZiAobWVtYmVyKHJlY2VpdmVkX2lkcywgaWQpID09IC0xKQorICAgICAgeworICAgICAgICByZWNlaXZlZF9pZHMgKz0gKHsgaWQgfSk7CisgICAgICAgIGNhbGxfb3V0KCJyZW1vdmVfcmVjZWl2ZWRfaWQiLAorICAgICAgICAgICAgICBSRVBMWV9USU1FX09VVCArIFJFUExZX1RJTUVfT1VUICogKFJFVFJJRVMgKyAxKSwgaWQpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICAgICAgYWRkX3N5c3RlbV9maWVsZChkYXRhLCBSRVBFQVQpOworICAgIH0KKyAgICBpZiAoZXJyID0gY2F0Y2goCisgICAgICAgIGNhbGxfb3RoZXIoVURQX0NNRF9ESVIgKyByZXEsICJ1ZHBfIiArIHJlcSwgZGVlcF9jb3B5KGRhdGEpKTtwdWJsaXNoKSkKKyAgICB7CisgICAgICAgIF9zZW5kX3VkcChkYXRhW05BTUVdLCAoWworICAgICAgICAgICAgUkVRVUVTVDogUkVQTFksCisgICAgICAgICAgICBSRUNJUElFTlQ6IGRhdGFbU0VOREVSXSwKKyAgICAgICAgICAgIElEOiBkYXRhW0lEXSwKKyAgICAgICAgICAgIERBVEE6IGNhcGl0YWxpemUocmVxKSsgIiByZXF1ZXN0IGZhaWxlZCBAIiArIExPQ0FMX05BTUUgKyAiLlxuIgorICAgICAgICBdKSApOworICAgICAgICBsb2dfZmlsZShJTkVURF9MT0dfRklMRSwgREFURSArICI6ICIgKyBkYXRhW1JFUVVFU1RdICsgIiBmcm9tICIgKworICAgICAgICBkYXRhW05BTUVdICsgIiBmYWlsZWQuXG4iICsgZXJyICsgcGFja2V0ICsgIlxuXG4iKTsKKyAgICB9Cit9CisKK2ludCBkb19tYXRjaChzdHJpbmcgbXVkbmFtZSwgc3RyaW5nIG1hdGNoX3N0cikgeworICAgIHJldHVybiBtdWRuYW1lWzAuLnNpemVvZihtYXRjaF9zdHIpLTFdID09IG1hdGNoX3N0cjsKK30KKworI2lmZGVmIE5PX0NMT1NVUkVTCisKK3N0YXR1cyBncmVhdGVyKG1peGVkIGEsIG1peGVkIGIpIHsKKyAgICByZXR1cm4gYSA+IGI7Cit9CisKK3N0cmluZyAqZXhwYW5kX211ZF9uYW1lKHN0cmluZyBuYW1lKSB7CisgICAgcmV0dXJuIHNvcnRfYXJyYXkoCisgICAgICAgIGZpbHRlcihtX2luZGljZXMoaG9zdHMpLCAiZG9fbWF0Y2giLCB0aGlzX29iamVjdCgpLCBuYW1lKSwKKyAgICAgICAgImdyZWF0ZXIiLAorICAgICAgICB0aGlzX29iamVjdCgpCisgICAgKTsKK30KKworI2Vsc2UKKworc3RyaW5nICpleHBhbmRfbXVkX25hbWUoc3RyaW5nIG5hbWUpIHsKKyAgICByZXR1cm4gc29ydF9hcnJheSgKKyAgICAgICAgZmlsdGVyKG1faW5kaWNlcyhob3N0cyksICMnZG9fbWF0Y2gsIG5hbWUpLAorICAgICAgICAjJz4KKyAgICApOworfQorCisjZW5kaWYKKworc3RyaW5nIGVuY29kZShtaXhlZCBhcmcpIHsKKyAgICBpZiAob2JqZWN0cChhcmcpKQorICAgICAgICByZXR1cm4gb2JqZWN0X25hbWUoYXJnKTsKKyAgICBpZiAoc3RyaW5ncChhcmcpICYmIHNpemVvZihhcmcpICYmCisgICAgICAgIChhcmdbMF0gPT0gJyQnIHx8CisjaWZkZWYgUkVTVFJJQ1RFRF9DQVNUUworICAgIHRvX3N0cmluZyh0b19pbnQoYXJnKSkgPT0gKHN0cmluZylhcmcpKQorI2Vsc2UKKyAgICAoc3RyaW5nKXRvX2ludChhcmcpID09IChzdHJpbmcpYXJnKSkKKyNlbmRpZgorICAgICAgICByZXR1cm4gIiQiICsgYXJnOworICAgIHJldHVybiB0b19zdHJpbmcoYXJnKTsKK30KKworc3RyaW5nIGVuY29kZV9wYWNrZXQobWFwcGluZyBkYXRhKSB7CisgICAgaW50IGk7CisgICAgbWl4ZWQgaW5kaWNlczsKKyAgICBzdHJpbmcgaGVhZGVyLCBib2R5LCB0MSwgdDI7CisgICAgc3RyaW5nICpyZXQ7CisgICAgc3RhdHVzIGRhdGFfZmxhZzsKKworICAgIGZvcihyZXQgPSAoeyB9KSwgaSA9IHNpemVvZihpbmRpY2VzID0gbV9pbmRpY2VzKGRhdGEpKTsgaS0tOyApIHsKKyAgICAgICAgaWYgKGluZGljZXNbaV0gPT0gREFUQSkgeworICAgICAgICAgICAgZGF0YV9mbGFnID0gMTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGhlYWRlciA9IGVuY29kZShpbmRpY2VzW2ldKTsKKyAgICAgICAgYm9keSA9IGVuY29kZShkYXRhW2luZGljZXNbaV1dKTsKKyAgICAgICAgaWYgKHNzY2FuZihoZWFkZXIsICIlczolcyIsIHQxLCB0MikgfHwKKyAgICAgICAgICAgIHNzY2FuZihoZWFkZXIgKyBib2R5LCAiJXMiICsgREVMSU1JVEVSICsgIiVzIiwgdDEsIHQyKQorICAgICAgICApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgCisgICAgICAgIHJldCArPSAoeyBoZWFkZXIgKyAiOiIgKyBib2R5IH0pOworICAgIH0KKyAgICBpZiAoZGF0YV9mbGFnKQorI2lmZGVmIFVTRV9PTERfREFUQV9GT1JNQVQKKyAgICAgICAgcmV0ICs9ICh7IERBVEEgKyAiOiIgKyBlbmNvZGUoZGF0YVtEQVRBXSkgfSk7CisjZWxzZQorICAgICAgICByZXQgKz0gKHsgIiIsIGVuY29kZShkYXRhW0RBVEFdKSB9KTsKKyNlbmRpZgorICAgIHJldHVybiBpbXBsb2RlKHJldCwgREVMSU1JVEVSKTsKK30KKworLy8gRnVua3Rpb24gZXhwbG9kZV8KKy8vIERpZSBGdW5rdGlvbiB6ZXJsZWd0IGRlbiBTdHJpbmcgcGFja2V0IGluIGdsZWljaCBsYW5nZSBUZWlsc3RyaW5ncworLy8gZGVyIExhZW5nZSBsZW4gdW5kIGdpYnQgZGllIFRlaWxzdHJpbmdzIGFscyBBcnJheSB6dXJ1ZWNrLiBEZXIgbGV0enRlCisvLyBUZWlsc3RyaW5nIGthbm4ga3VlcnplciBzZWluIGFscyBkaWUgYW5kZXJlbi4KK3N0cmluZyAqZXhwbG9kZV9wYWNrZXQoc3RyaW5nIHBhY2tldCwgaW50IGxlbikgeworCisgIGludCBwdHIsIG1fcHRyLHNpemU7CisgIHN0cmluZyAqcmVzdWx0OworCisgIC8vIFZhcmlhYmxlbiBpbml0aWFsaXNpZXJlbgorICBtX3B0cj1wdHI9MDsKKyAgc2l6ZT1zaXplb2YocGFja2V0KTsKKyAgcmVzdWx0PSh7fSk7CisKKyAgLy8gVW0gQXJyYXlhZGRpdGlvbmVuIHp1IHZlcm1laWRlbiB3aXJkIHZvcmhlciBhbGxva2llcnQuIERpZSBEaXZpc2lvbiAKKyAgLy8gZHVyY2ggMCBpc3QgbmljaHQgYWJnZWZhbmdlbiwgZGEgYmVpIGxlbj0wIHdhcyBpbSBBdWZydWYgZmFsY2ggaXN0LgorICByZXN1bHQ9YWxsb2NhdGUoKHNpemUvbGVuKzEpKTsKKworICB3aGlsZSAocHRyPHNpemUpIHsKKyAgICByZXN1bHRbbV9wdHJdID0gLy8gQWt0dWVsbGVuIFRlaWxzdHJpbmcgc3BlaWNoZXJuCisjaWZkZWYgVVNFX0VYVFJBQ1QKKyAgICAgICAgICAgIGV4dHJhY3QocGFja2V0LHB0cixwdHIrbGVuLTEpOworI2Vsc2UKKyAgICAgICAgICAgIHBhY2tldFtwdHIuLnB0citsZW4tMV07IAorI2VuZGlmCisgICAgcHRyKz1sZW47Ly8gTmV1ZW4gUG9pbnRlciBpbSBTdHJpbmcgYmVyZWNobmVuCisgICAgbV9wdHIrKzsgLy8gTmV1ZW4gUG9pbnRlciBpbSBNYXBwaW5nIGJlcmVjaG5lbi4gSGllciBudXR6ZSBpY2ggZWluZQorICAgICAgICAgICAgIC8vIFZhcmlhYmxlIG1laHIgYWxzIG5vZXRpZywgd2VpbCBkYXMgYmlsbGlnZXIgaXN0LCBhbHMgamVkZXMKKyAgICAgICAgICAgICAvLyBtYWwgcHRyPW1fcHRyKmxlbiBhdXN6dXJlY2huZW4uIExpZWJlciB6d2VpIEFkZGl0aW9uZW4gYWxzIAorICAgICAgICAgICAgIC8vIGVpbmUgTXVsdGlwbGlrYXRpb24gdW5kIGVpbmUgQWRkdGlvbi4KKyAgfQorCisgIC8vIFdlbm4gc2l6ZS9sZW4gYXVmZ2VodCwgaXN0IGRhcyBSZXN1bHQtRmVsZCB6dSBncm9zcy4gRGFubiBibGVpYnQgCisgIC8vIGVpbiBFbGVtZW50IGxlZXIsIGRhcyB3aXJkIGhpZXIgZ2VzdHJpcHB0LiBEYXMgaXN0IGJpbGxpZ2VyIGFscworICAvLyBqZWRlc21hbCBhdXN6dXJlY2huZW4sIG9iIHNpemUvbGVuIGF1ZmdlaHQuCisgIHJldHVybiByZXN1bHQtKHswfSk7CisgCit9CisKK3ZhcmFyZ3Mgc3RyaW5nIF9zZW5kX3VkcChzdHJpbmcgbXVkbmFtZSwgbWFwcGluZyBkYXRhLCBpbnQgZXhwZWN0X3JlcGx5KSB7CisgICAgbWl4ZWQgaG9zdF9kYXRhOworICAgIHN0cmluZyAqcGFja2V0X2FycjsKKyAgICBzdHJpbmcgcGFja2V0OworICAgIGludCBpOworCisgICAgbXVkbmFtZSA9IGxvd2VyX2Nhc2UobXVkbmFtZSk7CisgICAgaWYgKCEoaG9zdF9kYXRhID0gaG9zdHNbbXVkbmFtZV0pKSB7CisgICAgICAgIHN0cmluZyAqbmFtZXM7CisKKyAgICAgICAgaWYgKHNpemVvZihuYW1lcyA9IGV4cGFuZF9tdWRfbmFtZShtdWRuYW1lKSkgPT0gMSkKKyAgICAgICAgICAgIGhvc3RfZGF0YSA9IGhvc3RzW211ZG5hbWUgPSBuYW1lc1swXV07CisgICAgICAgIGVsc2UKKyNpZmRlZiBTRU5EX1VEUF9DT01QQVQKKyAgICAgICAgICAgIHJldHVybiAoc3RyaW5nKVNFTkRfVURQX0NPTVBBVChtdWRuYW1lLCBkYXRhLCBleHBlY3RfcmVwbHkpOworI2Vsc2UKKyAgICAgICAgaWYgKCFzaXplb2YobmFtZXMpKQorICAgICAgICAgICAgcmV0dXJuICJVbmJla2FubnRlciBNdWRuYW1lOiAiICsgY2FwaXRhbGl6ZShtdWRuYW1lKSArICJcbiI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBicmVha19zdHJpbmcoIk11ZG5hbWUgKCIrY2FwaXRhbGl6ZShtdWRuYW1lKSsKKyAgICAgICAgICAgICIpIG5pY2h0IGVpbmRldXRpZywgZXMgcGFzc2VuOiAiK2ltcGxvZGUobWFwKG5hbWVzLCMnY2FwaXRhbGl6ZSksIiwgIikrCisgICAgICAgICAgICAiLlxuIiw3OCk7CisjZW5kaWYKKyAgICB9CisgICAgCisgICAgaWYgKGRhdGFbUkVRVUVTVF0gIT0gUElORyAmJgorICAgICAgICBkYXRhW1JFUVVFU1RdICE9IFFVRVJZICYmCisgICAgICAgIGRhdGFbUkVRVUVTVF0gIT0gUkVQTFkgJiYKKyAgICAgICAgbWVtYmVyKGhvc3RfZGF0YVtIT1NUX0NPTU1BTkRTXSwgIioiKSA9PSAtMSAmJgorICAgICAgICBtZW1iZXIoaG9zdF9kYXRhW0hPU1RfQ09NTUFORFNdLCBkYXRhW1JFUVVFU1RdKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIGNhcGl0YWxpemUoZGF0YVtSRVFVRVNUXSkgKyAiOiBDb21tYW5kIHVuYXZhaWxhYmxlIEAiICsKKyAgICAgICAgICAgICAgICAgICBob3N0X2RhdGFbSE9TVF9OQU1FXSArICJcbiI7CisgICAgCisgICAgZGF0YVtOQU1FXSA9IExPQ0FMX05BTUU7CisgICAgZGF0YVtVRFBfUE9SVF0gPSBMT0NBTF9VRFBfUE9SVDsKKyAgICAKKyAgICBpZiAoZXhwZWN0X3JlcGx5KSB7CisgICAgICAgIC8qIERvbid0IHVzZSB6ZXJvLiAqLworICAgICAgICBkYXRhW0lEXSA9ICsrcGFja2V0X2lkOworICAgICAgICAvKiBEb24ndCBuZWVkIGRlZXBfY29weSgpIGFzIHdlIGFyZSBjaGFuZ2luZyB0aGUgbWFwcGluZyBzaXplLiAqLworICAgICAgICBwZW5kaW5nX2RhdGFbbXVkbmFtZSArICI6IiArIHBhY2tldF9pZF0gPQorI2lmZGVmIElORVREX0RJQUdOT1NUSUNTCisgICAgICAgIGRhdGEgKyAoWyBOQU1FOiBob3N0X2RhdGFbSE9TVF9OQU1FXSwgUkVTUE9OU0VfVElNRTogdGltZSgpIF0pOworI2Vsc2UKKyAgICAgICAgZGF0YSArIChbIE5BTUU6IGhvc3RfZGF0YVtIT1NUX05BTUVdIF0pOworI2VuZGlmCisgICAgfQorICAgIGlmICghKHBhY2tldCA9IGVuY29kZV9wYWNrZXQoZGF0YSkpKSB7CisgICAgICAgIGlmIChleHBlY3RfcmVwbHkpCisgICAgICAgICAgICBwZW5kaW5nX2RhdGEgPSBtX2NvcHlfZGVsZXRlKHBlbmRpbmdfZGF0YSwgbXVkbmFtZSArICI6IiArIHBhY2tldF9pZCk7CisgICAgICAgIGxvZ19maWxlKElORVREX0xPR19GSUxFLCBEQVRFICsgIjogSWxsZWdhbCBwYWNrZXQgc2VudCBieSAiICsKKyAgICAgICAgb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpICsgIlxuXG4iKTsKKyAgICAgICAgcmV0dXJuICJpbmV0ZDogSWxsZWdhbCBwYWNrZXQuXG4iOworICAgIH0KKyAgICBpZiAoZXhwZWN0X3JlcGx5KQorICAgICAgICBjYWxsX291dCgicmVwbHlfdGltZV9vdXQiLCBSRVBMWV9USU1FX09VVCwgbXVkbmFtZSArICI6IiArIHBhY2tldF9pZCk7CisKKyAgICBpZiAoc2l6ZW9mKHBhY2tldCkgPD0gTUFYX1BBQ0tFVF9MRU4pCisgICAgICAgIHBhY2tldF9hcnIgPSAoeyBwYWNrZXQgfSk7CisgICAgZWxzZSB7CisgICAgICAgIHN0cmluZyBoZWFkZXI7CisgICAgICAgIGludCBtYXg7CisKKyAgICAgICAgLyogQmUgY2FyZWZ1bCB3aXRoIHRoZSBJRC4gIGRhdGFbSURdIGNvdWxkIGhhdmUgYmVlbiBzZXQgdXAgYnkgUkVUUlkgKi8KKyAgICAgICAgaGVhZGVyID0KKyAgICAgICAgICAgIFBBQ0tFVCArICI6IiArIGxvd2VyX2Nhc2UoTE9DQUxfTkFNRSkgKyAiOiIgKworICAgICAgICAgICAgKChleHBlY3RfcmVwbHkgfHwgZGF0YVtSRVFVRVNUXSAhPSBSRVBMWSkmJiBkYXRhW0lEXSA/CisgICAgICAgICAgICBkYXRhW0lEXSA6ICsrcGFja2V0X2lkKSArICI6IjsKKyAgICAgICAgCisgICAgICAgIC8qIEFsbG93IDggZXh0cmEgY2hhcnM6IDMgZGlnaXRzICsgIi8iICsgMyBkaWdpdHMgKyBERUxJTUlURVIgKi8KKyAgICAgICAgcGFja2V0X2FyciA9IGV4cGxvZGVfcGFja2V0KHBhY2tldCwKKyAgICAgICAgICAgIE1BWF9QQUNLRVRfTEVOIC0gKHNpemVvZihoZWFkZXIpICsgOCkpOworCisgICAgICAgIGZvcihpID0gbWF4ID0gc2l6ZW9mKHBhY2tldF9hcnIpOyBpLS07ICkKKyAgICAgICAgICAgIHBhY2tldF9hcnJbaV0gPQorICAgICAgICAgICAgaGVhZGVyICsgKGkrMSkgKyAiLyIgKyBtYXggKyBERUxJTUlURVIgKyBwYWNrZXRfYXJyW2ldOworICAgIH0KKyAgICAKKyAgICBmb3IoaSA9IHNpemVvZihwYWNrZXRfYXJyKTsgaS0tOyApCisgICAgeworICAgICAgWkRFQlVHKHNwcmludGYoIiVPIDwtICUuNTAwT1xuIixob3N0X2RhdGFbSE9TVF9JUF0sIHBhY2tldF9hcnJbaV0pKTsKKyAgICAgIGlmICghc2VuZF91ZHAoCisgICAgICAgIGhvc3RfZGF0YVtIT1NUX0lQXSwgaG9zdF9kYXRhW0hPU1RfVURQX1BPUlRdLCBwYWNrZXRfYXJyW2ldKSkKKyAgICAgICAgICAgIHJldHVybiAiaW5ldGQ6IEVycm9yIGluIHNlbmRpbmcgcGFja2V0LlxuIjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgcmVwbHlfdGltZV9vdXQoc3RyaW5nIGlkKSB7CisgICAgbWFwcGluZyBkYXRhOworCisgICAgaWYgKGRhdGEgPSBwZW5kaW5nX2RhdGFbaWRdKSB7CisgICAgICAgIG9iamVjdCBvYjsKKworI2lmZGVmIElORVREX0RJQUdOT1NUSUNTCisgICAgICAgIGRhdGFbUEFDS0VUX0xPU1NdKys7CisjZW5kaWYKKyAgICAgICAgaWYgKGRhdGFbUkVUUlldIDwgUkVUUklFUykgeworICAgICAgICAgICAgbWFwcGluZyBzZW5kOworCisgICAgICAgICAgICBkYXRhW1JFVFJZXSsrOworICAgICAgICAgICAgLyogV2UgbXVzdCB1c2UgYSBjb3B5IHNvIHRoZSBOQU1FIGZpZWxkIGluIHBlbmRpbmdfZGF0YVtpZF0KKyAgICAgICAgICAgICAqIGlzbid0IGNvcnJ1cHRlZCBieSBfc2VuZF91ZHAoKS4gKi8KKyAgICAgICAgICAgIHNlbmQgPSBkZWVwX2NvcHkoZGF0YSk7CisgICAgICAgICAgICBzZW5kID0gbV9jb3B5X2RlbGV0ZShzZW5kLCBSRVRSWSk7CisjaWZkZWYgSU5FVERfRElBR05PU1RJQ1MKKyAgICAgICAgICAgIHNlbmQgPSBtX2NvcHlfZGVsZXRlKHNlbmQsIFBBQ0tFVF9MT1NTKTsKKyAgICAgICAgICAgIHNlbmQgPSBtX2NvcHlfZGVsZXRlKHNlbmQsIFJFU1BPTlNFX1RJTUUpOworI2VuZGlmCisgICAgICAgICAgICBjYWxsX291dCgicmVwbHlfdGltZV9vdXQiLCBSRVBMWV9USU1FX09VVCwgaWQpOworICAgICAgICAgICAgX3NlbmRfdWRwKGRhdGFbTkFNRV0sIHNlbmQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGRhdGEgPSBtX2NvcHlfZGVsZXRlKGRhdGEsIFJFVFJZKTsKKyNpZmRlZiBJTkVURF9ESUFHTk9TVElDUworICAgICAgICBkYXRhID0gbV9jb3B5X2RlbGV0ZShkYXRhLCBSRVNQT05TRV9USU1FKTsKKyNlbmRpZgorICAgICAgICBjYXRjaChjYWxsX290aGVyKFVEUF9DTURfRElSICsgUkVQTFksICJ1ZHBfIiArIFJFUExZLAorICAgICAgICBhZGRfc3lzdGVtX2ZpZWxkKGRhdGEsIFRJTUVfT1VUKSk7cHVibGlzaCk7CisgICAgICAgIC8qIEl0J3MganVzdCBwb3NzaWJsZSB0aGlzIHdhcyByZW1vdmVkIGZyb20gdGhlIGhvc3QgbGlzdC4gKi8KKyAgICAgICAgaWYgKGhvc3RzW2xvd2VyX2Nhc2UoZGF0YVtOQU1FXSldKQorICAgICAgICAgICAgaG9zdHNbbG93ZXJfY2FzZShkYXRhW05BTUVdKV1bSE9TVF9TVEFUVVNdID0gRE9XTjsKKyAgICAgICAgcmVtb3ZlX2luY29taW5nKGxvd2VyX2Nhc2UoZGF0YVtOQU1FXSkgKyAiOiIgKyBpZCk7CisgICAgfQorICAgIHBlbmRpbmdfZGF0YSA9IG1fY29weV9kZWxldGUocGVuZGluZ19kYXRhLCBpZCk7Cit9CisKK3ZvaWQgcmVtb3ZlX3JlY2VpdmVkX2lkKHN0cmluZyBpZCkgeworICAgIHJlY2VpdmVkX2lkcyAtPSAoeyBpZCB9KTsKK30KKwordmFyYXJncyBtaXhlZCBxdWVyeShzdHJpbmcgd2hhdCwgbWl4ZWQgZXh0cmExLCBtaXhlZCBleHRyYTIpIHsKKyAgICBtaXhlZCBkYXRhOworCisgICAgc3dpdGNoKHdoYXQpIHsKKyAgICAgICAgY2FzZSAiY29tbWFuZHMiOgorICAgICAgICAgICAgcmV0dXJuIENPTU1BTkRTOworICAgICAgICBjYXNlICJob3N0cyI6CisgICAgICAgICAgICByZXR1cm4gZGVlcF9jb3B5KGhvc3RzKTsKKyAgICAgICAgY2FzZSAicGVuZGluZyI6CisgICAgICAgICAgICByZXR1cm4gZGVlcF9jb3B5KHBlbmRpbmdfZGF0YSk7CisgICAgICAgIGNhc2UgImluY29taW5nIjoKKyAgICAgICAgICAgIHJldHVybiBkZWVwX2NvcHkoaW5jb21pbmdfcGFja2V0cyk7CisgICAgICAgIGNhc2UgInJlY2VpdmVkIjoKKyAgICAgICAgICAgIHJldHVybiAoeyB9KSArIHJlY2VpdmVkX2lkczsKKyAgICAgICAgLyogYXJnczogInZhbGlkX3JlcXVlc3QiLCByZXF1ZXN0LCBtdWRuYW1lICovCisgICAgICAgIGNhc2UgInZhbGlkX3JlcXVlc3QiOgorICAgICAgICAgICAgaWYgKGRhdGEgPSBob3N0c1tleHRyYTJdKQorICAgICAgICAgICAgICAgIHJldHVybiBtZW1iZXIoZGF0YVtIT1NUX0NPTU1BTkRTXSwgIioiKSAhPSAtMSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyKGRhdGFbSE9TVF9DT01NQU5EU10sIGV4dHJhMSkgIT0gLTE7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuKDApOworfQorCmRpZmYgLS1naXQgYS9zZWN1cmUva3JhdXRtYXN0ZXIuYyBiL3NlY3VyZS9rcmF1dG1hc3Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMGFiMDYKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUva3JhdXRtYXN0ZXIuYwpAQCAtMCwwICsxLDEyODkgQEAKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLCBzYXZlX3R5cGVzLCBydHRfY2hlY2tzCisjcHJhZ21hIG5vX2luaGVyaXQsIG5vX2Nsb25lLCBub19zaGFkb3cKKworI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8aXRlbXMva3JhZXV0ZXIva3JhZXV0ZXIuaD4KKyNpbmNsdWRlIDxpdGVtcy9rcmFldXRlci90cmFua2F0dHJpYnV0ZS5oPgorI2luY2x1ZGUgPGxpdmluZy9jb21tLmg+CisKKworI2lmbmRlZiBCUworI2RlZmluZSBCUyh4KSAgICAgICAgICAgICBicmVha19zdHJpbmcoeCwgNzgpCisjZW5kaWYKKworLy8gV2VpdGVyIHVudGVuIGJlaW0gUGFyc2VuIGRlcyBEYXRlbmZpbGVzIHdlcmRlbiBTZXRQcm9wKCkgdW5kIE5hbWUoKQorLy8gdmVyd2VuZGV0LCBkYWhlciBlcmJlbiB3aXIgdGhpbmcuCitpbmhlcml0ICIvc3RkL3NlY3VyZV90aGluZyI7CisKKy8vIExpc3RlIGFsbGVyIG1vZWdsaWNoZW4gWnV0YXRlbiwgZ2VtYXBwdCB1ZWJlciBlaW5lbiBrZXkKKy8vIEFOOiBpcnJpdGllcmVuZGVyIE5hbWUsIGRlbm4gZXMgc2luZCBuaWNodCBkaXJla3QgZGllIFp1dGF0ZW4gZW50aGFsdGVuCisvLyBzb25kZXJuIGRpZSB1ZWJlciBlaW5lbiBLZXkgaWRlbnRpZml6aWVydGVuIEtyYWV1dGVyZ3J1cHBlbiwgZGllIGRpZQorLy8gV2lya3VuZ2VuL0Z1bmt0aW9uZW4gZmVzdGxlZ2VuLgorLy8gRm9ybWF0OgorLy8gKFsga2V5IDogKHsgYXR0cl9wb3MsIGF0dHJfbmVnMSwgYXR0cl9uZWcyLCBIYWx0YmFyay4sIFdpcmtkYXVlciwgCisvLyAgICAgICAgICAgICBVbnRlcnN0dWV0enVuZywgU3RvZXJ1bmcsIEhhZXVmaWdrZWl0ICB9KSBdKQorLy8gQmVpc3BpZWw6IFsoICJhNyI6KHsoezIsNDAwfSksKHsxMSwxNTB9KSwwLDE3MjgwMCwwLCh7Im4qIn0pLDAsMX0pIF0pCisvLyBIVTogV2FyIGVpbiBNYXBwaW5nLCBibGVpYnQgZWluIE1hcHBpbmcsIHVuZCBuZXU6IERpZSBFaW50cmFlZ2Ugd2VyZGVuIAorLy8gYXVjaCBNYXBwaW5ncyEKK3ByaXZhdGUgbWFwcGluZyBpbmdyZWRpZW50czsKKworLy8gTWFwcGluZyB2b24gaWQgenVtIEtleSBkZXIgWnV0YXRlbiBpbSBpbmdyZWRpZW50cy1tYXBwaW5nOiBpZDJrZXlbaWRdPWtleQorLy8gRGllIGJlaWRlbiBMaXN0ZW4gd2VyZGVuIGJlbm9ldGlndCwgdW0genUgZGVuIEtyYXV0LUlEcyBkaWUgamV3ZWlsaWdlbgorLy8gS2V5cyB6dSBmaW5kZW4uCisvLyBIVTogS0VJTiBNQVBQSU5HLiBFaW4gQXJyYXkgdm9uIFN0cmluZ3MuIEFiZXIgZGFzIGdlaHQgbmF0dWVybGljaC4KK3ByaXZhdGUgc3RyaW5nICppZDJrZXk7CisKKy8vIE1hcHBpbmcgdm9uIGtleSB6dSBLcmFldXRlci1JRCBkZXIgWnV0YXRlbi4KK3ByaXZhdGUgbWFwcGluZyBrZXkyaWQ7CisKKy8vIEVpZ2Vuc2NoYWZ0ZW4gZGVyIEtyYWV1dGVyOgorLy8ga3JhdXRwcm9wc1tpZF09KHtJRCwgRGVtb24sIEdlbmRlciwgTmFtZSwgQWRqZWt0aXYoZSksIFBfTE9ORywgUmF1bWRldGFpbH0pCisvLyBrcmF1dHByb3BzWzBdID0gMDsgSUQgMCBkYXJmIG5pY2h0IGV4aXN0aWVyZW4KK3ByaXZhdGUgbWl4ZWQgKmtyYXV0cHJvcHM7CisKKy8vIGhpZXIgd2lyZCBnZXNwZWljaGVydCB3ZWxjaGUgVmVyc2lvbiBlaW5lciBadXRhdCBmdWVyIGVpbmVuIFNwaWVsZXIgaXN0LgorLy8gQU4vVE9ETzogV2VubiBkYXMgZnVlciBOaWNodHNlaGVyIG51dHpiYXIgc2VpbiBzb2xsLCBzb2xsdGUgaGllciBiZXNzZXIKKy8vIG1pdCBnZXR1dWlkKCkgZ2VhcmJlaXRldCB3ZXJkZW4sIHN0YXR0IGdldHVpZCgpIHp1IHZlcndlbmRlbi4KKy8vIHBsYXllciBlbnRoYWVsdCBmdWVyIGplZGUgU3BpZWxlci1VSUQgZWluZW4gQml0c3RyaW5nLiBHZXNldHp0ZXMgQml0CisvLyBiZWRldXRldCwgZGFzcyBkZXIgU3BpZWxlciB1ZWJlciBkYXMgS3JhdXQgbWl0IGRpZXNlciBJRCBldHdhcyB1ZWJlcgorLy8gZGllIFZlcndlbmR1bmcgdW5kIFdpcmt1bmcgd2Vpc3MuIEVzIGdpYnQgamVkb2NoIG5vY2gga2VpbmUgTGVybm1vZWdsaWNoLQorLy8ga2VpdCB1bmQgSU5TQkVTT05ERVJFIGtlaW5lIEZ1bmt0aW9uYWxpdGFldCBpbSBNYXN0ZXIsIHVlYmVyIGRpZSBtYW4gCisvLyBkaWUgQml0cyBzZXR6ZW4ga29lbm50ZS4KK3ByaXZhdGUgbWFwcGluZyBwbGF5ZXI7CisKKy8vIHZlcnN0dWVtbWVsdGVzIG1hcHBpbmcgZnVlciBkZW4gVkMgaW4gc2VydmljZSAoU2F2ZS1EdW1teSkKK3ByaXZhdGUgbWFwcGluZyBtYXBfbGRmaWVkOworCisvLyByb29tcyBlbnRoYWVsdCBkaWUgVGVpbGVpbnRyYWVnZSBkZXMgbWFwX2xkZmllZCBtYXBwaW5nIHZvbSBWQworcHJpdmF0ZSBtYXBwaW5nIHJvb21zOworCisvLyBFbnRoYWVsdCBEYXRlbiB6dSBkZW4gUmFldW1lbiwgaW4gZGVuZW4gZGFzIFRyb2NrbmVuIHZvbiBLcmFldXRlcm4KKy8vIG1vZWdsaWNoIGlzdC4KK3ByaXZhdGUgbWFwcGluZyBkcnlpbmdfZGF0YSA9IChbOjRdKTsKKworc3RyaW5nIGJ1aWxkX3BsYW50bmFtZShtaXhlZCAqcHJvcHMpOworCisvLyBzdHJ1Y3QtVGVtcGxhdCBmdWVyIFRyYW5rYXR0cmlidXRlCisvLyBGdWVyIGRhcyBTUUwtTG9nIE1VU1MgZGllIFJlaWhlbmZvbGdlIGRlciBUcmFua2F0dHJpYnV0ZSBoaWVyIGdlbmF1IGRpZQorLy8gc2Vpbiwgd2llIGRpZSBTcGFsdGVuIGluIGRlciBUYWJlbGxlLgorLyogQ3VycmVudGx5IG5vdCB1c2VkLgorc3RydWN0IHRyYW5rX2F0dHJpYl9zIHsKKyAgICBpbnQgY2FyOworICAgIGludCBkYTsKKyAgICBpbnQgZG07CisgICAgaW50IGR1OworICAgIGludCBkbjsKKyAgICBpbnQgZmx0OworICAgIGludCBmcm87CisgICAgaW50IGhJOworICAgIGludCBoUDsKKyAgICBpbnQgaEs7CisgICAgaW50IGhMOworICAgIGludCBwYTsKKyAgICBpbnQgcG07CisgICAgaW50IHB1OworICAgIGludCBzczsKKyAgICBpbnQgc3A7CisgICAgaW50IHNkOworfTsKKyovCisKKyNkZWZpbmUgYWxsb3dlZCgpICghcHJvY2Vzc19jYWxsKCkgJiYgXAorICAgICAgICBJU19BUkNIKFJQTCkgJiYgSVNfQVJDSCh0aGlzX2ludGVyYWN0aXZlKCkpICkKKworI2RlZmluZSBQT1RJT05GSUxFUyAoeyBUUkFOS0lURU0gfSkKKworLy8gZWlnZW5zY2hhZnRlbiBpbSBrcmF1dHByb3BzLWFycmF5CisjZGVmaW5lIFBST1BfSUQgICAgICAgICAgIElOR1JFRElFTlRfSUQKKyNkZWZpbmUgUFJPUF9ERU1PTiAgICAgICAgSU5HUkVESUVOVF9ERU1PTgorI2RlZmluZSBQUk9QX0dFTkRFUiAgICAgICBJTkdSRURJRU5UX0dFTkRFUgorI2RlZmluZSBQUk9QX05BTUUgICAgICAgICBJTkdSRURJRU5UX05BTUUKKyNkZWZpbmUgUFJPUF9BREogICAgICAgICAgSU5HUkVESUVOVF9BREoKKyNkZWZpbmUgUFJPUF9MT05HICAgICAgICAgSU5HUkVESUVOVF9MT05HCisjZGVmaW5lIFBST1BfUk9PTURFVEFJTCAgIElOR1JFRElFTlRfUk9PTURFVEFJTAorCisvLyBBVFRSXyBpcyBpbW1lciBlaW4gYXJyYXkgKHsgYXR0cmlidXQsIGFiaWxpdHkgfSkKKyNkZWZpbmUgQVRUUl9BUlJfQVRUUklCICAgICAgMAorI2RlZmluZSBBVFRSX0FSUl9BQklMSVRZICAgICAxCisKKy8vIG1heGltYWwgZXJsYXVidGVyIFdlcnQgZnVlciBlaW5lIEVpZ2Vuc2NoYWZ0CisjZGVmaW5lIE1BWF9BVFRSX0FCSUxJVFkgICAgICA5OTkKKwordm9pZCBkZWJ1ZyhzdHJpbmcgc3RyKQoreworICAvL3dyaXRlKCJkZWJ1ZzogIitzdHIrIlxuIik7CisgIGlmICh0aGlzX3BsYXllcigpICYmIElTX0FSQ0godGhpc19wbGF5ZXIoKSkpCisgICAgdGhpc19wbGF5ZXIoKS0+UmVjZWl2ZU1zZyhzdHIsNTM2ODcwOTEyKTsKK30KKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgIHNldGV1aWQoZ2V0dWlkKCkpOworICAgLy8gQU4vVE9ETzogVmFyaWFibGVuIG9iZW4gZGlyZWt0IGluaXRpYWxpc2llcmVuLiBQcnVlZmVuLCBvYiBkYXZvbgorICAgLy8gaXJnZW5kd2FzIG5vc2F2ZSBzZWluIGthbm4uCisgICBpZiAoIXJlc3RvcmVfb2JqZWN0KF9fRElSX18iL0FSQ0gva3JhdXRtYXN0ZXIiKSkKKyAgIHsKKyAgICAgIGluZ3JlZGllbnRzPShbXSk7CisgICAgICBpZDJrZXk9KHt9KTsKKyAgICAgIGtleTJpZD0oW10pOworICAgICAga3JhdXRwcm9wcz0oe30pOworICAgICAgcGxheWVyPShbXSk7CisgICAgICBtYXBfbGRmaWVkPShbXSk7CisgICAgICByb29tcz0oW10pOworICAgfQorICAgaWYgKHNsX29wZW4oIi9sb2cvQVJDSC9rcmF1dHRyYW5rLnNxbGl0ZSIpICE9IDEpCisgICB7CisgICAgIHJhaXNlX2Vycm9yKCJEYXRlbmJhbmsga29ubnRlIG5pY2h0IGdlb2VmZm5ldCB3ZXJkZW4uXG4iKTsKKyAgIH0KKyAgIHNsX2V4ZWMoIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIHRyYWVua2UoaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgIgorICAgICAgICAgICAidWlkIFRFWFQgTk9UIE5VTEwsIHJuZCBJTlRFR0VSLCAiCisgICAgICAgICAgICJ0aW1lIElOVEVHRVIgREVGQVVMVCBDVVJSRU5UX1RJTUVTVEFNUCwgIgorICAgICAgICAgICAicmVjZWlwZSBURVhUIE5PVCBOVUxMLCAiCisgICAgICAgICAgICJxdWFsaXR5IFRFWFQgTk9UIE5VTEwsICIKKyAgICAgICAgICAgImNhciBJTlRFR0VSLCAiCisgICAgICAgICAgICJkYSBJTlRFR0VSLCAiCisgICAgICAgICAgICJkbSBJTlRFR0VSLCAiCisgICAgICAgICAgICJkdSBJTlRFR0VSLCAiCisgICAgICAgICAgICJkbiBJTlRFR0VSLCAiCisgICAgICAgICAgICJmbHQgSU5URUdFUiwgIgorICAgICAgICAgICAiZnJvIElOVEVHRVIsICIKKyAgICAgICAgICAgImhJIElOVEVHRVIsICIKKyAgICAgICAgICAgImhQIElOVEVHRVIsICIKKyAgICAgICAgICAgImhLIElOVEVHRVIsICIKKyAgICAgICAgICAgImhMIElOVEVHRVIsICIKKyAgICAgICAgICAgInBhIElOVEVHRVIsICIKKyAgICAgICAgICAgInBtIElOVEVHRVIsICIKKyAgICAgICAgICAgInB1IElOVEVHRVIsICIKKyAgICAgICAgICAgInNzIElOVEVHRVIsICIKKyAgICAgICAgICAgInNwIElOVEVHRVIsICIKKyAgICAgICAgICAgInNkIElOVEVHRVIpOyIKKyAgICAgICAgICAgKTsKKyAgIHNsX2V4ZWMoIkNSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGlkeF91aWQgT04gdHJhZW5rZSh1aWQpOyIpOworICAgc2xfZXhlYygiQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgaWR4X3JlY2VpcGUgT04gdHJhZW5rZShyZWNlaXBlKTsiKTsKKyAgIHNsX2V4ZWMoIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIHJvaGRhdGVuKGlkIElOVEVHRVIgUFJJTUFSWSBLRVksICIKKyAgICAgICAgICAgInVpZCBURVhUIE5PVCBOVUxMLCBybmQgSU5URUdFUiwgIgorICAgICAgICAgICAidGltZSBJTlRFR0VSIERFRkFVTFQgQ1VSUkVOVF9USU1FU1RBTVAsICIKKyAgICAgICAgICAgInJlY2VpcGUgVEVYVCBOT1QgTlVMTCwgIgorICAgICAgICAgICAicXVhbGl0eSBURVhUIE5PVCBOVUxMLCAiCisgICAgICAgICAgICJjYXIgSU5URUdFUiwgIgorICAgICAgICAgICAiZGEgSU5URUdFUiwgIgorICAgICAgICAgICAiZG0gSU5URUdFUiwgIgorICAgICAgICAgICAiZHUgSU5URUdFUiwgIgorICAgICAgICAgICAiZG4gSU5URUdFUiwgIgorICAgICAgICAgICAiZmx0IElOVEVHRVIsICIKKyAgICAgICAgICAgImZybyBJTlRFR0VSLCAiCisgICAgICAgICAgICJoSSBJTlRFR0VSLCAiCisgICAgICAgICAgICJoUCBJTlRFR0VSLCAiCisgICAgICAgICAgICJoSyBJTlRFR0VSLCAiCisgICAgICAgICAgICJoTCBJTlRFR0VSLCAiCisgICAgICAgICAgICJwYSBJTlRFR0VSLCAiCisgICAgICAgICAgICJwbSBJTlRFR0VSLCAiCisgICAgICAgICAgICJwdSBJTlRFR0VSLCAiCisgICAgICAgICAgICJzcyBJTlRFR0VSLCAiCisgICAgICAgICAgICJzcCBJTlRFR0VSLCAiCisgICAgICAgICAgICJzZCBJTlRFR0VSKTsiCisgICAgICAgICAgICk7CisgICBzbF9leGVjKCJDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBpZHhfdWlkX3IgT04gcm9oZGF0ZW4odWlkKTsiKTsKK30KKworcHVibGljIHN0cmluZyBRdWVyeVBsYW50RmlsZShpbnQgaWQpCit7CisgIGlmIChtZW1iZXIoa3JhdXRwcm9wcywgaWQpKQorICAgIHJldHVybiBidWlsZF9wbGFudG5hbWUoa3JhdXRwcm9wc1tpZF0pOworICByZXR1cm4gMDsKK30KKworLy8gQU46IEZ1bmt0aW9uIGVybWl0dGVsdCwgb2IgZWluIFNwaWVsZXIgcGwgZGFzIEtyYXV0IG1pdCBkZXIgSUQgaWQKKy8vIHZlcndlbmRlbiBrYW5uLiBMYXV0IEtvbW1lbnRhciB1bnRlbiBtdXNzIG1hbiBkYWZ1ZXIgd29obCB3YXMgdWViZXIgZGFzCisvLyBLcmF1dCBnZWxlcm50IGhhYmVuLCB2b24gd2VtIGlzdCBtaXIgZ2VyYWRlIG5vY2ggbmljaHQga2xhci4KKy8vIEFOL1RPRE86IEVzIGlzdCBiaXNoZXIga2VpbmUgRnVua3Rpb25hbGl0YWV0IHZvcmhhbmRlbiwgdW0gZGllIElEcyBmdWVyCisvLyBkZW4gU3BpZWxlciBmcmVpenVzY2hhbHRlbi4gRGllIEZ1bmt0aW9uc3dlaXNlIG11c3MgYXVzIGRlbSBCZWlzcGllbGNvZGUKKy8vIHVudGVuIGZ1ZXIgZGFzIExlYXJuLU9uLURlbWFuZCBhYmdlbGVzZW4gd2VyZGVuLgorbm9tYXNrIGludCBDYW5Vc2VJbmdyZWRpZW50KG9iamVjdCBwbCwgaW50IGlkKQoreworICAvLyBJY2ggbWFjaCBtYWwgZGVuIGhhcnRlbiBXZWcuIC0tIEh1bW5pCisgIHJldHVybiAxOworICAvLyBCaXRzdHJpbmcgZGVzIFNwaWVsZXJzIGF1cyBkZXIgTGlzdGUgYXVzbGVzZW4uCisgICBzdHJpbmcgc3RyPXBsYXllcltnZXR1aWQocGwpXTsKKyAgIGlmICghc3RyaW5ncChzdHIpKSBzdHI9IiI7CisgICBpZiAodGVzdF9iaXQoc3RyLCBpZCkpCisgICAgICByZXR1cm4gMTsgLy8gbWFrZSB0aGUgY29tbW9uIGNhc2UgZmFzdAorICAgZWxzZSB7CisgICAgIC8vIGxldHp0ZW5lbmRlcyBoYWJlIGljaCBtaWNoIGVudHNjaGxvc3NlbiBlaW56dWJhdWVuLCBkYXMgbWFuIG51ciBkaWUKKyAgICAgLy8gS3JhZXV0ZXIgdmVyd2VuZGVuIGthbm4sIHVlYmVyIGRpZSBtYW4gc2Nob25tYWwgZXR3YXMgZ2VsZXNlbi9nZWxlcm50CisgICAgIC8vIGhhdCwgYXVzIGRpZXNlbSBHcnVuZCwgaXN0IGZvbGdlbmRlciBCbG9jayBhdXNrb21tZW50aWVydC4KKyAgICAgLy8gRGllc2VyIEJsb2NrIGJlZGV1dGV0IHF1YXNpIGVpbiAiYXV0byBsZWFybmluZyBvbiBkZW1hbmQiIGQuaC4KKyAgICAgLy8gd2lyZCBlaW4gS3JhdXQgdmVyd2VuZGV0IHdpcmQgZ2VwcnVlZnQgb2IgZnVlciBkaWVzZSBHcnVwcGUgYmVyZWl0cworICAgICAvLyBlaW5lIElEIGZyZWlnZXNjaGFsdGV0IHd1cmRlIC0gYW5zb25zdGVuIHdpcmQgZWluZSBmcmVpZ2VzY2hhbHRldC4KKyAgICAgLyoKKyAgICAgICAgIC8vIHBydWVmZW4gb2IgZnVlciBkZW4gS2V5IGJlcmVpdHMgZWluIEJpdCBnZXNldHp0IGlzdCwgZ2dmLiBzZXR6ZW4KKyAgICAgICAgIGlmIChpZD49c2l6ZW9mKGlkMmtleSkpIHJldHVybiAwOyAvLyBpbGxlZ2FsZSBJZAorICAgICAgICAgaW50IGlkbGlzdD1rZXkyaWRbaWQya2V5W2lkXV07CisgICAgICAgICBpbnQgaTsKKyAgICAgICAgIGZvciAoaT1zaXplb2YoaWRsaXN0KS0xOyBpPj0wOyBpLS0pIHsKKyAgICAgICAgICAgaWYgKHRlc3RfYml0KHN0ciwgaWRsaXN0W2ldKSkgcmV0dXJuIDA7IC8vIEtleSBiZXJlaXRzIHZvcmhhbmRlbgorICAgICAgICAgfQorICAgICAgICAgLy8gWnVmYWVsbGlnIGVpbiBCaXQgZnVlciBkZW4gS2V5IHNldHplbgorICAgICAgICAgaT1yYW5kb20oc2l6ZW9mKGlkbGlzdCkpOworICAgICAgICAgcGxheWVyW2dldHVpZChwbCldPXNldF9iaXQoc3RyLCBpZGxpc3RbaV0pOworICAgICAgICAgc2F2ZV9vYmplY3Qob2JqZWN0X25hbWUoKSk7CisgICAgICAgICByZXR1cm4gKGk9PWlkKTsKKyAgICAgKi8KKyAgICAgcmV0dXJuIDA7CisgICB9Cit9CisKKy8vIERpZXNlIEZ1bmt0aW9uIHdpcmQgdm9tIE1ldHplbG9yYWtlbCBhdWZnZXJ1ZmVuLCB1bSBkaWUgQmVsb2hudW5nZW4genUKKy8vIGVyemV1Z2VuLCBkaWUgbWFuIGRvcnQgZnVlciBlcmZvbGdyZWljaCBhYnNvbHZpZXJ0ZSBNZXR6ZWxhdWZ0cmFlZ2UgZXJoYWVsdAorI2RlZmluZSBBTExPV0VEX0NBTExFUiAoeyAiL2QvZWJlbmUvYXJhdGhvcm4vb3Jha2VsL3NlY3VyZS9zY2hhbWFuZSIgfSkKK29iamVjdCBnZXRfcGxhbnRfYnlfY2F0ZWdvcnkoaW50IG5wY19jbGFzcykKK3sKKyAgaWYgKCBtZW1iZXIoQUxMT1dFRF9DQUxMRVIsIGxvYWRfbmFtZShwcmV2aW91c19vYmplY3QoKSkpPDAgKQorICAgIHJhaXNlX2Vycm9yKCJ1bmF1dGhvcmlzZWQgY2FsbCB0byBnZXRfcGxhbnRfYnlfY2F0ZWdvcnkoKVxuIik7CisKKyAgLy8gVWViZXJnZWJlbmUgTlBDLUtsYXNzZSBpbiBLcmF1dC1LYXRlZ29yaWUgdW1zZXR6ZW4uCisgIC8vIEthdGVnb3JpZSA3IHdpcmQgYWxzIDctOSBpbnRlcnByZXRpZXJ0IChzaWVoZSB1bnRlbikuCisgIGludCBjYXRlZ29yeTsKKyAgc3dpdGNoKG5wY19jbGFzcykgeworICAgIGNhc2UgMTogY2FzZSAyOiAgICAgICAgIGNhdGVnb3J5PTQ7IGJyZWFrOworICAgIGNhc2UgMzogY2FzZSA0OiAgICAgICAgIGNhdGVnb3J5PTU7IGJyZWFrOworICAgIGNhc2UgNTogY2FzZSA2OiBjYXNlIDc6IGNhdGVnb3J5PTY7IGJyZWFrOworICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgIGNhdGVnb3J5PTc7IGJyZWFrOworICB9CisKKyAgLy8gQWxsZSBLcmFldXRlciBkZXIgZXJtaXR0ZWx0ZW4gS2F0ZWdvcmllIHJhdXNzdWNoZW4uIEJlaSBLYXRlZ29yaWUgNworICAvLyB3ZXJkZW4gYXVjaCBhbGxlIGF1cyA4IHVuZCA5IGRhenVnZW5vbW1lbi4KKyAgaW50ICplbGlnaWJsZV9wbGFudF9pZHM9KHt9KTsKKyAgZm9yZWFjaCggc3RyaW5nIGdycCwgbWFwcGluZyBncnBkYXRhIDogaW5ncmVkaWVudHMgKSB7CisgICAgaWYgKCBjYXRlZ29yeSA9PSA3ICYmIGdycGRhdGFbVF9BQlVOREFOQ0VdPj03IHx8IAorICAgICAgICAgIGNhdGVnb3J5ID09IGdycGRhdGFbVF9BQlVOREFOQ0VdICkKKyAgICAgIGVsaWdpYmxlX3BsYW50X2lkcyArPSBrZXkyaWRbZ3JwXTsKKyAgfQorCisgIC8vIEtyYXV0bmFtZW4genUgZGVuIEtyYXV0LUlEcyBlcm1pdHRlbG4uCisgIHN0cmluZyAqcGxhbnRmaWxlcz1tYXAoZWxpZ2libGVfcGxhbnRfaWRzLCBmdW5jdGlvbiBzdHJpbmcgKGludCBwbGFudGlkKSB7CisgICAgcmV0dXJuIGJ1aWxkX3BsYW50bmFtZShrcmF1dHByb3BzW3BsYW50aWRdKTt9KTsKKworICAvLyBFaW4gS3JhdXQgenVmYWVsbGlnIGF1c3dhZWhsZW4sIGNsb25lbiB1bmQgZGFzIE9iamVrdCB6dXJ1ZWNrZ2ViZW4uCisgIG9iamVjdCBwbGFudD1jbG9uZV9vYmplY3QoUExBTlRESVIrcGxhbnRmaWxlc1tyYW5kb20oc2l6ZW9mKHBsYW50ZmlsZXMpKV0pOworICBwbGFudC0+RHJ5UGxhbnQoODArcmFuZG9tKDExKSk7CisgIC8vIEF1ZnNjaHJlaWJlbiwgd2VyIHdlbGNoZXMgS3JhdXQgbWl0IHdlbGNoZXIgUXVhbGl0YWV0IHJhdXNiZWtvbW10LgorICBsb2dfZmlsZSgiQVJDSC9wbGFudF9ieV9jYXRlZ29yeSIsCisgICAgc3ByaW50ZigiJXMgJS0xMnMgJS1zIFF1YWwgJWQgS2F0ICVkIENsYXNzICVkXG4iLCAKKyAgICAgIHN0cmZ0aW1lKCIleCAlWCIsdGltZSgpKSwgZ2V0dWlkKFBMKSwKKyAgICAgIG9iamVjdF9uYW1lKHBsYW50KVtzaXplb2YoUExBTlRESVIpLi5dLAorICAgICAgcGxhbnQtPlF1ZXJ5UHJvcChQX1FVQUxJVFkpLCBjYXRlZ29yeSwgbnBjX2NsYXNzKSk7CisvLyBzcHJpbnRmKCIlMjRzOiBjYWxsIGZyb20gJU8sIHBsYXllcjogJXMgKFBMOiAlTyksIGthdGVnb3J5OiAlZFxuIiwgY3RpbWUoKSwKKy8vIHByZXZpb3VzX29iamVjdCgpLCBnZXR1aWQocGxheWVyKSwgUEwsIGthdGVnb3J5KSkKKyAgcmV0dXJuIHBsYW50OworfQorCitwcml2YXRlIG5vc2F2ZSBvYmplY3Qgc2ltdWxfZWZ1biwgcGxhbnR2YzsKKworLy8gZnVlciBTSU1VTF9FRlVOX0ZJTEUKKyNpbmNsdWRlIDxjb25maWcuaD4KKworLy8gQU4vVE9ETzogS2xhZXJlbiwgd2FydW0gaGllciBlaW5lIGVpZ2VuZSBGdW5rdGlvbiBnZXRfY2xvbmVyKCkgZXhpc3RpZXJ0LAorLy8gd28gZG9jaCBkZXIgS3JhZXV0ZXItVkMgc2Nob24gZWluZSBoYXQuCitub21hc2sgcHJpdmF0ZSBzdHJpbmcgZ2V0X2Nsb25lcigpCit7CisgICBpbnQgaTsKKyAgIG9iamVjdCBwbzsKKyAgIGlmICghc2ltdWxfZWZ1bikgeworICAgICAgaWYgKCEoc2ltdWxfZWZ1bj1maW5kX29iamVjdChTSU1VTF9FRlVOX0ZJTEUpKSkKKyAgICAgICAgIHNpbXVsX2VmdW49ZmluZF9vYmplY3QoU1BBUkVfU0lNVUxfRUZVTl9GSUxFKTsKKyAgIH0KKyAgIC8vIHdlbm4gc2llIGpldHp0IG5pY2h0IGV4aXN0aWVydCAtIGF1Y2ggZ3V0LCBkYW5uIGdpYnQgZXMgaGFsdCBrZWluZQorICAgLy8gc2VmdW5zLgorCisgICBpZiAoIXBsYW50dmMpIHBsYW50dmM9ZmluZF9vYmplY3QoS1JBRVVURVJWQyk7CisgICAKKyAgIGZvciAoaT0wOyBwbz1wcmV2aW91c19vYmplY3QoaSk7IGkrKykgeworICAgICAgaWYgKHBvPT1tYXN0ZXIoKSB8fCBwbz09c2ltdWxfZWZ1biB8fCBwbz09TUUgfHwKKyAgICAgICAgICBwbz09cHJldmlvdXNfb2JqZWN0KCkgfHwgcG89PXBsYW50dmMpCisgICAgICAgICBjb250aW51ZTsKKyAgICAgIGVsc2UgcmV0dXJuIG9iamVjdF9uYW1lKHBvKTsKKyAgIH0KKyAgIHJldHVybiAwOworfQorCisvLyBBTjogCitub21hc2sgc3RyaW5nIENoZWNrUGxhbnQoaW50IGlkKQoreworICAgaWYgKGlkPD0wIHx8IGlkPj1zaXplb2YoaWQya2V5KSkgcmV0dXJuIDA7CisgICBpZiAoIXN0cmluZ3AoaWQya2V5W2lkXSkpIHJldHVybiAwOworICAgcmV0dXJuIGdldF9jbG9uZXIoKTsKK30KKworLy8gdWViZXIgZGllc2UgRnVua3Rpb24ga2FubiBkaWUgTGlzdGUgZGVyIElkJ3MgdXBkYXRldCB3ZXJkZW4KKy8vIGVzIHdpcmQgPGZpbGVuYW1lPiBlaW5nZWxlc2VuIHVuZCBkdXJjaGdlcGFyc3QuCisvLyBEaWVzZSBEYXRlaSBtdXNzIGluIGplZGVyIFplaWxlIGZvbGdlbmRlcyBGb3JtYXQgZWluaGFsdGVuIHVuZCBkYXJmIGtlaW5lCisvLyBsZWVyemVpbGVuIGVudGhhbHRlbiEgPiBJZCxrZXksR2VuZGVyLE5hbWUsQWRqZWt0aXYKKy8vIEFOOiBEYXMgaXN0IFF1YXRzY2guIERhcyBGb3JtYXQgbXVzcyBzbyBhdXNzZWhlbjoKKy8vIFN0cmluZy1JRDtLcmF1dC1JRDtkZW1vbjtnZW5kZXI7UF9OQU1FO2FkamVrdGl2O1BfTE9ORztyb29tZGV0YWlsOworLy8gSFU6IERpZXNlIEZ1bmt0aW9uIGxhc3MgaWNoIHNvLiBIYXJoYXIuCisvLyBVcGRhdGU6IE5hIGd1dC4gRmFzdC4KK25vbWFzayBwcml2YXRlIGludCBMb2FkSWRMaXN0KHN0cmluZyBmaWxlbmFtZSkKK3sKKyAgIGludCBpLCBpZCwgc2ksIGRlbW9uOworICAgc3RyaW5nICpsaW5lcywgZmlsZTsKKyAgIG1peGVkICpkYXRhOworICAgZmlsZT1yZWFkX2ZpbGUoZmlsZW5hbWUpOworICAgaWYgKCFzdHJpbmdwKGZpbGUpKSByYWlzZV9lcnJvcigiTWlzc2luZyBGaWxlOiAiK2ZpbGVuYW1lKyJcbiIpOworICAgbGluZXM9ZXhwbG9kZShyZWFkX2ZpbGUoZmlsZW5hbWUpLCAiXG4iKTsKKyAgIHNpPXNpemVvZihsaW5lcyktMTsKKyAgIC8vIEFOL1RPRE86IFdhcnVtIHZlcndlbmRldCBtYW4gaGllciBuaWNodCBhdWNoIGVpbmZhY2ggZXhwbG9kZSgpPworICAgLy8gV2VubiAiIyNlbmRlIyMiIGFscyBUcmVubnplaWNoZW4gZW50aGFsdGVuIGlzdCwgbGllZmVydCBleHBsb2RlKCkKKyAgIC8vIGFscyBsZXR6dGVuIEVpbnRyYWcgZWluZW4gTGVlcnN0cmluZywgZGFyYXVmIGthbm4gbWFuIHBydWVmZW4uCisgICAvLyBBbGxlcmRpbmdzIG11ZXNzdGUgZGFzIHZvciBkZW0gZXhwbG9kZSgpIHp1ciBaZWlsZW50cmVubnVuZyBwYXNzaWVyZW4uCisgICBmb3IgKCA7c2k+PTA7IHNpLS0pIAorICAgeworICAgICBzdHJpbmcgbGlsaT1saW5lc1tzaV07CisgICAgIGlmIChzdHJzdHIobGluZXNbc2ldLCIjI2VuZGUjIyIpPj0wKSBicmVhazsKKyAgIH0KKyAgIHNpLS07CisgICBpZiAoc2k8MCkgcmFpc2VfZXJyb3IoIiMjZW5kZSMjIG5vdCBmb3VuZCBpbiBpZC1saXN0LlxuIik7CisgICBpZDJrZXk9YWxsb2NhdGUoc2krMik7CisgICBrcmF1dHByb3BzPWFsbG9jYXRlKHNpKzIpOworICAgLy8gQU46IEZ1ZXIgZGFzIEF1c2xlc2VuIGRlciBXZXJ0ZSBhdXMgZGVtIEFycmF5ICJkYXRhIiBtdWVzc2VuIGRpZSAKKyAgIC8vIEluZGl6aWVydW5ncy1EZWZpbmVzIGpld2VpbHMgKzEgdmVyd2VuZGV0IHdlcmRlbiwgd2VpbCBpbSBEYXRlbmZpbGUKKyAgIC8vIHNjaGxhdWVyd2Vpc2UgZWluIERhdGVuZmVsZCAqdm9ybmUqIGFuZ2VmdWVndCB3dXJkZS4KKyAgIC8vIEFOL1RPRE86IHZpZWxsZWljaHQgc29sbHRlIG1hbiBiZXNzZXIgRWxlbWVudCAwIHp1ZXJzdCBhdXNsZXNlbiB1bmQKKyAgIC8vIGRhbm4gZGFzIEFycmF5IGFyciB1bSBlaW4gRWxlbWVudCBrdWVyemVuOiBhcnIgPSBhcnJbMS4uXTsKKyAgIGZvciAoaT1zaTsgaT49MDsgaS0tKSB7CisgICAgICBkYXRhPWV4cGxvZGUobGluZXNbaV0sICI7Iik7CisgICAgICBpZiAoc2l6ZW9mKGRhdGEpIT04KSByYWlzZV9lcnJvcigiV3JvbmcgaWQtbGlzdCBmb3JtYXQgaW4gbGluZSAiKyhpKzEpKyJcbiIpOworICAgICAgaWQ9dG9faW50KGRhdGFbUFJPUF9JRCsxXSk7CisgICAgICBkYXRhW1BST1BfSUQrMV09aWQ7CisgICAgICBpZiAoaWQ+c2krMSkgcmFpc2VfZXJyb3Ioc3ByaW50ZigiTGluZSAlZDogaWQgJWQgZ3JlYXRlciB0aGFuIGFycmF5IHNpemUgJWQuXG4iLCBpLCBpZCwgc2kpKTsKKyAgICAgIGlkMmtleVtpZF09ZGF0YVswXTsKKyAgICAgIC8vIEFOOiBJY2ggc2VoZSBub2NoIG5pY2h0IHNvIGdhbnosIHdhcnVtIG1hbiB2b24gZGVtIERhdGVuZmVsZAorICAgICAgLy8gUFJPUF9ERU1PTiBudXIgZGFzIGxldHp0ZSBaZWljaGVuIGFscyBMaXRlcmFsIHBydWVmZW4gc29sbHRlLgorICAgICAgLy8gS29tcGxldHQgZ2VodCBkb2NoIGdlbmF1c29ndXQ/CisgICAgICBzd2l0Y2goZGF0YVtQUk9QX0RFTU9OKzFdWzwxXSkgeworICAgICAgICBjYXNlICdSJzogZGF0YVtQUk9QX0RFTU9OKzFdPVJBVzsgYnJlYWs7CisgICAgICAgIGNhc2UgJzAnOiBkYXRhW1BST1BfREVNT04rMV09MDsgICBicmVhazsKKyAgICAgICAgY2FzZSAnMSc6IGRhdGFbUFJPUF9ERU1PTisxXT0xOyAgIGJyZWFrOworICAgICAgICBjYXNlICcyJzogZGF0YVtQUk9QX0RFTU9OKzFdPTI7ICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IHJhaXNlX2Vycm9yKCJVbmtub3duIGRlbW9uZm9ybWF0ICciK2RhdGFbUFJPUF9ERU1PTisxXSsKKyAgICAgICAgICAgICAgICAgICAiJyBpbiBpZGxpc3QgbGluZSAiKyhpKzEpKyJcbiIpOworICAgICAgfQorICAgICAgc3dpdGNoKGRhdGFbUFJPUF9HRU5ERVIrMV1bPDFdKSB7CisgICAgICAgIGNhc2UgJ04nOiBkYXRhW1BST1BfR0VOREVSKzFdPU5FVVRFUjsgYnJlYWs7CisgICAgICAgIGNhc2UgJ0YnOiBkYXRhW1BST1BfR0VOREVSKzFdPUZFTUFMRTsgYnJlYWs7CisgICAgICAgIGNhc2UgJ00nOiBkYXRhW1BST1BfR0VOREVSKzFdPU1BTEU7ICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IHJhaXNlX2Vycm9yKCJVbmtub3duIGdlbmRlcmZvcm1hdCAnIitkYXRhW1BST1BfR0VOREVSKzFdKworICAgICAgICAgICAgICAgICAgICInIGluIGlkbGlzdCBsaW5lICIrKGkrMSkrIlxuIik7CisgICAgICB9CisgICAgICBTZXRQcm9wKFBfR0VOREVSLCBkYXRhW1BST1BfR0VOREVSKzFdKTsKKyAgICAgIFNldFByb3AoUF9OQU1FLCBkYXRhW1BST1BfTkFNRSsxXSk7CisgICAgICAvLyBBTi9UT0RPOiBkYXRhW1BST1BfQURKXSBtdXNzIG1hbiBuaWNodCB1bmJlZGluZ3Qgdm9yaGVyIGF1ZiAwIHNldHplbgorICAgICAgaWYgKCFzaXplb2YoZGF0YVtQUk9QX0FESisxXSkpIGRhdGFbUFJPUF9BREorMV09MDsKKyAgICAgIGlmIChkYXRhW1BST1BfQURKKzFdKQorICAgICAgICAgU2V0UHJvcChQX05BTUVfQURKLCAoeyJnYW56IG5vcm1hbCIsIGRhdGFbUFJPUF9BREorMV19KSk7CisgICAgICBlbHNlIFNldFByb3AoUF9OQU1FX0FESiwgImdhbnogbm9ybWFsIik7CisgICAgICBTZXRQcm9wKFBfQVJUSUNMRSwgZGF0YVtQUk9QX0RFTU9OKzFdIT1SQVcpOworICAgICAgZGVtb249KGRhdGFbUFJPUF9ERU1PTisxXT09UkFXID8gMCA6IGRhdGFbUFJPUF9ERU1PTisxXSk7CisgICAgICAvLyBBTjogV2VubiBrZWluZSBMYW5nYmVzY2hyZWlidW5nIGhpbnRlcmxlZ3Qgd3VyZGUsIHdpcmQgZGVyIE5hbWUKKyAgICAgIC8vIGRlcyBLcmF1dGVzIGFscyBzb2xjaGUgdmVyd2VuZGV0LiBFYmVuc28gZnVlciBkYXMgUmF1bWRldGFpbCwgZGFzCisgICAgICAvLyBiZWltIEJldHJhY2h0ZW4gZGVzIEtyYXV0ZXMgaW0gUmF1bSBhdXNnZWdlYmVuIHdpcmQuCisgICAgICBpZiAoIXNpemVvZihkYXRhW1BST1BfTE9ORysxXSkpIHsKKyAgICAgICAgIGRhdGFbUFJPUF9MT05HKzFdID0gTmFtZShXRVIsIGRlbW9uKSsiLlxuIjsKKyAgICAgIH0KKyAgICAgIGVsc2UgZGF0YVtQUk9QX0xPTkcrMV0gPSBCUyhkYXRhW1BST1BfTE9ORysxXSk7CisvLyBIdW1uaTogT2ZmZW5iYXIga29tbWVuIGFtIFplaWxlbmVuZGUgbWFuY2htYWwgWmVpY2hlbiBkYXp1LiBJY2ggZ2VoZSBkYXZvbgorLy8gYXVzLCBkYXNzIGtlaW5lIEJlc2NocmVpYnVuZyBrdWVyemVyIGFscyAyIFplaWNoZW4gaXN0LgorICAgICAgaWYgKHNpemVvZihkYXRhW1BST1BfUk9PTURFVEFJTCsxXSk8MikgeworICAgICAgICAgZGF0YVtQUk9QX1JPT01ERVRBSUwrMV0gPSBOYW1lKFdFUiwgZGVtb24pKyIuXG4iOworICAgICAgfQorICAgICAgZWxzZSBkYXRhW1BST1BfUk9PTURFVEFJTCsxXSA9IEJTKGRhdGFbUFJPUF9ST09NREVUQUlMKzFdKTsKKyAgICAgIGtyYXV0cHJvcHNbaWRdPWRhdGFbMS4uXTsKKyAgIH0KKyAgIFNldFByb3AoUF9OQU1FLCAwKTsKKyAgIFNldFByb3AoUF9OQU1FX0FESiwgIiIpOworICAgCisgICAvLyBrZXkyaWQtQ2FjaGUgbmV1IGF1ZmJhdWVuLgorICAga2V5MmlkPShbXSk7CisgICBmb3IgKGk9c2l6ZW9mKGlkMmtleSktMTsgaT49MDsgaS0tKSB7CisgICAgICBpZiAobWVtYmVyKGtleTJpZCwgaWQya2V5W2ldKSkKKyAgICAgICAgIGtleTJpZFtpZDJrZXlbaV1dKz0oeyBpIH0pOworICAgICAgZWxzZSBrZXkyaWRbaWQya2V5W2ldXT0oeyBpIH0pOworICAgfQorICAgcmV0dXJuIDE7Cit9CisKKy8vIEhpbGZzZnVua3Rpb24gd2lyZCB6dW0gZWlucGFyc2VuIGJlbvZ0aWd0CisvLyB3YW5kZWx0IHouQi4gZGVuIHN0cmluZyB2b24gImggNTAwIiBpbiAoeyAzLCA1MDAgfSkgdW0KK3ByaXZhdGUgbm9tYXNrIDxzdHJpbmd8aW50PiogYnVpbGRBdHRyQXJyKHN0cmluZyBhdHRyKQoreworICAgaWYgKCFhdHRyKSByZXR1cm4gMDsKKyAgIGF0dHI9dHJpbShhdHRyKTsKKyAgIDxzdHJpbmd8aW50PiogcmVzPWV4cGxvZGUoYXR0ciwgIiAiKS0oeyIifSk7CisgICAvL2RlYnVnKHNwcmludGYoIiBidWlsZCBBdHRyICVPIixyZXMpKTsKKyAgIGlmIChzaXplb2YocmVzKSE9MikgcmFpc2VfZXJyb3IoIldyb25nIGF0dHJpYiBmb3JtYXQhXG4iKTsKKyAgIC8vZGVidWcoc3ByaW50ZigiJU8iLFRfS1JBVVRfTUFQKSk7CisgICByZXR1cm4gKHtUX0tSQVVUX01BUFtyZXNbMF1dLChpbnQpcmVzWzFdfSk7Cit9CisKKy8vIEFOOiBIaWxmc2Z1bmt0aW9uIHp1bSBFaW5sZXNlbiBkZXIgVHJhZW5rZWxpc3RlLgorbm9tYXNrIHByaXZhdGUgdm9pZCBMb2FkSW5kZXgoc3RyaW5nIGZpbGVuYW1lKQoreworICAgaW50IGksIGosIHNpOworICAgc3RyaW5nICpsaW5lcywgZmlsZTsKKyAgIG1peGVkICAqZGF0YTsKKworICAgZmlsZT1yZWFkX2ZpbGUoZmlsZW5hbWUpOworICAgaWYgKCFzdHJpbmdwKGZpbGUpKSByYWlzZV9lcnJvcigiTWlzc2luZyBGaWxlOiAiK2ZpbGVuYW1lKyJcbiIpOworICAgCisgICAvLyBBTi9UT0RPOiBBdWNoIGhpZXIgd2FlcmUgd2llZGVyIGRpZSBWZXJ3ZW5kdW5nIHZvbiBleHBsb2RlKCkgenUKKyAgIC8vIGVyd2FlZ2VuLgorICAgbGluZXM9ZXhwbG9kZShmaWxlLCAiXG4iKS0oeyIifSk7CisgICBzaT1zaXplb2YobGluZXMpOworICAgZm9yIChpPTA7IGk8c2k7IGkrKykgaWYgKGxpbmVzW2ldPT0iIyNzdGFydCMjIikgYnJlYWs7CisgICBpKys7CisgICBpZiAoaT49c2kpIHJhaXNlX2Vycm9yKCJtaXNzaW5nICMjc3RhcnQjIyBpbiBJbmRleC5cbiIpOworICAgaW5ncmVkaWVudHM9KFtdKTsKKyAgIGZvciAoOyBpPHNpOyBpKyspIHsgLy8gYWxsZSB6ZWlsZW4gZHVyY2hsYXVmZW4uLi4KKyAgICAgLy8gQU4vVE9ETzogVGFidWxhdG9yZW4gYWxzIFRyZW5uemVpY2hlbiBmaW5kZSBpY2ggaXJnZW5kd2llIGJsb2VkLgorICAgICAvLyBIVTogRGFydW0gbnVuIFNlbWlrb2xvbnMKKyAgICAgLy8gZGVidWcoIlplaWxlICIrbGluZXNbaV0pOworICAgICBkYXRhPW9sZF9leHBsb2RlKGxpbmVzW2ldLCAiOyIpOyAvLyBhbiBTZW1pa29sb25zIHRyZW5uZW4uLi4KKyAgICAgLy8gZGVidWcoc3ByaW50ZigiJU8iLGRhdGEpKTsKKyAgICAgaWYgKHNpemVvZihkYXRhKSE9OSkgCisgICAgICAgeworICAgICAgICAgLy9kZWJ1ZyhzcHJpbnRmKCIlTyIsZGF0YSkpOworICAgICAgICAgcmFpc2VfZXJyb3IoIldyb25nIGluZGV4bGlzdCBmb3JtYXQgaW4gbGluZSAiKyhpKzEpKyJcbiIpOworICAgICAgIH0KKyAgICAgZm9yIChqPTg7IGo+PTA7IGotLSkgeworICAgICAgIC8vIEFOL1RPRE86IGlmKGRhdGFbal09PSIiIHx8IGRhdGFbal09PSItIikgZGF0YVtqXT0wOworICAgICAgIC8vIGVzIHNpbmQgb2huZWhpbiB1ZWJlcmFsbCBTdHJpbmdzIGVudGhhbHRlbi4KKyAgICAgICAvLyBXaXIgbWFjaGVuIGF1cyAiLSIgb2RlciAiMCIgZWluZSBlY2h0ZSBpbnQtTnVsbC4KKyAgICAgICBpZiAoc2l6ZW9mKGRhdGFbal0pPT0wIHx8IGRhdGFbal1bMF09PSctJykgZGF0YVtqXT0wOworICAgICB9CisgICAgIC8vIEhVOiBBYiBoaWVyIGJhdSBpY2ggbWFsIG5ldS4gRGVuIFJlc3QgcGFjayBpY2ggYXVza29tbWVudGllcnQgZGFydW50ZXIsIHdlbm4gamVtYW5kIGRlbiBhbHRlbiBDb2RlCisgICAgIC8vIG5hY2hzY2hhdWVuIHdpbGwuCisgICAgIC8vIEljaCB3aWxsIGVpbiBNYXBwaW5nIHZvbiBkaWVzZXIgS3JhZXV0ZXJncnVwcGUuCisgICAgIG1hcHBpbmcgbWs9KFtdKTsKKyAgICAgLy8gRGllc2VzIE1hcHBpbmcgc29sbCBkaWUgRWludHJhZWdlIG51biBlbnRoYWx0ZW4uCisgICAgIG1rW1RfRUZGRUNUX0RVUkFUSU9OXT10b19pbnQoZGF0YVs1XSk7CisgICAgIG1rW1RfQUJVTkRBTkNFXT10b19pbnQoZGF0YVs4XSk7CisgICAgIC8vIHBvc2l0aXZlIEVmZmVrdGUgYXVmdGVpbGVuCisgICAgIC8vZGVidWcoc3ByaW50ZigiVm9ycG9zaXMgJU8gLSAlTyIsbWssZGF0YSkpOworICAgICBpZiAoc3RyaW5ncChkYXRhWzFdKSkKKyAgICAgICB7CisgICAgICAgICBzdHJpbmcqIHBvc2lzPWV4cGxvZGUoZGF0YVsxXSwiLCIpOworICAgICAgICAgLy9kZWJ1ZyhzcHJpbnRmKCIlTyAtICVPIixtayxwb3NpcykpOworICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIHE6cG9zaXMpIHsKKyAgICAgICAgICAgLy9kZWJ1ZyhxKTsKKyAgICAgICAgICAgPHN0cmluZ3xpbnQ+KiBhcnI9YnVpbGRBdHRyQXJyKHEpOworICAgICAgICAgICAvL2RlYnVnKHNwcmludGYoIiVPIixhcnIpKTsKKyAgICAgICAgICAgbWtbYXJyWzBdXT1ta1thcnJbMF1dK2FyclsxXTsKKyAgICAgICAgIH0KKyAgICAgICB9CisgICAgIC8vZGVidWcoc3ByaW50ZigiJU8iLG1rKSk7CisgICAgIC8vIEVyc3RlciBOZWdhdGl2ZXIgRWZmZWt0CisgICAgIGlmIChkYXRhWzJdIT0wKQorICAgICAgIHsKKyAgICAgICAgIDxzdHJpbmd8aW50PiogYXJyPWJ1aWxkQXR0ckFycihkYXRhWzJdKTsKKyAgICAgICAgIG1rW2FyclswXV09bWtbYXJyWzBdXS1hcnJbMV07CisgICAgICAgfQorICAgICAvL2RlYnVnKHNwcmludGYoInZvcm5lZyAlTyIsbWspKTsKKyAgICAgLy8gWmVpdGVyIG5lZ2F0aXZlciBFZmZla3QKKyAgICAgaWYgKGRhdGFbM10hPTApCisgICAgICAgeworICAgICAgICAgPHN0cmluZ3xpbnQ+KiBhcnI9YnVpbGRBdHRyQXJyKGRhdGFbM10pOworICAgICAgICAgbWtbYXJyWzBdXT1ta1thcnJbMF1dLWFyclsxXTsKKyAgICAgICB9CisgICAgIC8vIEhhbHRiYXJrZWl0IHdpcmQgdW1nZXJlY2huZXQKKyAgICAgc3RyaW5nKiBzdGk9ZXhwbG9kZShkYXRhWzRdLCIgIiktKHsiIn0pOworICAgICAvL2RlYnVnKCJoYWx0YmFyICIrc3RpWzBdKTsKKyAgICAgc3RyaW5nIHN0dD10cmltKHN0aVswXSk7CisgICAgIGludCBkdXI7CisgICAgIGlmIChzdHRbPDEuLl09PSJkIikgLy8gVGFnZQorICAgICAgIHsKKyAgICAgICAgIC8vZGVidWcoIlRhZ2UiKTsKKyAgICAgICAgIC8vIERlciBlcnN0ZSBUZWlsIGlzdCBkaWUgRGF1ZXIgaW4gVGFnZW4uCisgICAgICAgICBkdXI9dG9faW50KHN0aVswXVsuLjwyXSk7CisgICAgICAgICBkdXI9ZHVyKjI0KjYwKjYwOyAvLyBTZWt1bmRlbgorICAgICAgICAgbWtbVF9FWFBJUkVdPWR1cjsKKyAgICAgICB9CisgICAgIGlmIChzdHRbPDEuLl09PSJoIikgLy8gU3R1bmRlbgorICAgICAgIHsKKyAgICAgICAgIC8vZGVidWcoIlN0dW5kZW4iKTsKKyAgICAgICAgIC8vIFNvbnN0IGlzdCBlcyBoYWx0IGRpZSBEYXVlciBpbiBTdHVuZGVuLgorICAgICAgICAgZHVyPXRvX2ludChzdGlbMF1bLi48Ml0pOworICAgICAgICAgZHVyPWR1cio2MCo2MDsKKyAgICAgICAgIG1rW1RfRVhQSVJFXT1kdXI7CisgICAgICAgfQorICAgICAvL2RlYnVnKCJlcmdpYnQgIitkdXIpOworICAgICAvLyBOdW4gZGllIGx1c3RpZ2VuIFVudGVyc3R1ZXR6dW5nZW4uIERhenUgYmVudXR6ZW4gd2lyIHVuc2VyZW4gbHVzdGlnZW4gR2x1ZWNrc2hhc2VuLgorICAgICAvLyBVbmQgZWluIFJlaC4KKyAgICAgc3RyaW5nKiBnbHVlY2tzaGFzZTsKKyAgICAgc3RyaW5nIHJlaDsKKyAgICAgLy8gQWxsZSBMZWVyemVpY2hlbiByYXVzIQorICAgICAvL2RlYnVnKCJSZWhlIik7CisgICAgIC8vZGVidWcoc3ByaW50ZigiRGF0YTogJU8iLGRhdGEpKTsKKyAgICAgaWYgKHN0cmluZ3AoZGF0YVs2XSkpCisgICAgICAgeworICAgICAgICAgcmVoPShleHBsb2RlKGRhdGFbNl0sIiAiKS0oeyIifSkpWzBdOworICAgICAKKyAgICAgICAgIGdsdWVja3NoYXNlPWV4cGxvZGUocmVoLCIsIiktKHt9KTsKKyAgICAgICAgIG1rW1RfU1VQUE9SVEVSXT1nbHVlY2tzaGFzZTsKKyAgICAgICB9CisgICAgIGVsc2UKKyAgICAgICB7CisgICAgICAgICBta1tUX1NVUFBPUlRFUl09MDsKKyAgICAgICB9CisgICAgIC8vIE51biBtYWNoZW4gd2lyIGdlbmF1c28gZGllIEJsb2NrYWRlbi4KKyAgICAgLy8gRGFzIHRvbGxlIGlzdDogUmVoIHVuZCBHbHVlY2tzaGFzZSBrb2VubmVuIHdpciB3aWVkZXJ2ZXJ3ZW5kZW4hIERhcyBmcmV1dC4KKyAgICAgaWYgKHN0cmluZ3AoZGF0YVs3XSkpCisgICAgICAgeworICAgICAgICAgcmVoPShleHBsb2RlKGRhdGFbN10sIiAiKS0oeyIifSkpWzBdOworICAgICAgICAgZ2x1ZWNrc2hhc2U9ZXhwbG9kZShyZWgsIiwiKS0oe30pOworICAgICAgICAgbWtbVF9CTE9DS0lOR109Z2x1ZWNrc2hhc2U7CisgICAgICAgfQorICAgICBlbHNlCisgICAgICAgeworICAgICAgICAgbWtbVF9CTE9DS0lOR109MDsKKyAgICAgICB9CisgICAgIGluZ3JlZGllbnRzW3RyaW0oZGF0YVswXSldPW1rOworICAgfQorICAgLy9kZWJ1ZygiV3VmZiIpOworICAgLy9kZWJ1ZyhzcHJpbnRmKCIlTyIsaW5ncmVkaWVudHMpKTsKK30KKworbm9tYXNrIHByaXZhdGUgdm9pZCBzYXZlKCkKK3sKKyAgc2F2ZV9vYmplY3QoX19ESVJfXyIvQVJDSC9rcmF1dG1hc3RlciIpOworfQorCisvLyBBTjogZXJ6ZXVndCBhdXMgTmFtZW4gKyBBZGpla3RpdiBkZXIgUGZsYW56ZW5kYXRlbiBkZW4gT2JqZWt0bmFtZW4sCisvLyB6LkIuIHdhbGRyZWJlX2dlbWVpbiBvZGVyIGFja2Vya2xlZV9nZWxiLCB3b2JlaSBCaW5kZXN0cmljaGUgYXVjaAorLy8gZHVyY2ggVW50ZXJzdHJpY2hlIGVyc2V0enQgd2VyZGVuIChhY2tlcl9yZXR0aWNoKS4KK3N0cmluZyBidWlsZF9wbGFudG5hbWUobWl4ZWQgKnByb3BzKQoreworICAgc3RyaW5nIGtleTsKKyAgIC8vIEFOL1RPRE86IGVyc3QgUFJPUF9OQU1FIGluIGtleSBzY2hyZWliZW4sIGRhbm4gZ2dmLiBQUk9QX0FESiBkYXp1CisgICBpZiAoc2l6ZW9mKHByb3BzW1BST1BfQURKXSk+MCkKKyAgICAgIGtleT1sb3dlcnN0cmluZyhwcm9wc1tQUk9QX05BTUVdKyJfIitwcm9wc1tQUk9QX0FESl0pOworICAgZWxzZSBrZXk9bG93ZXJzdHJpbmcocHJvcHNbUFJPUF9OQU1FXSk7CisgICAvLyBBTi9UT0RPOiBlcnNldHplbiBkdXJjaCByZWdyZXBsYWNlKCk7CisgICBrZXk9aW1wbG9kZShvbGRfZXhwbG9kZShrZXksICIgIiksICJfIik7CisgICBrZXk9aW1wbG9kZShvbGRfZXhwbG9kZShrZXksICItIiksICJfIik7CisgICByZXR1cm4ga2V5OworfQorCitwdWJsaWMgdm9pZCBVcGRhdGVWQygpCit7CisgIEtSQUVVVEVSVkMtPnVwZGF0ZShtYXBfbGRmaWVkKTsKK30KKworLy8gQU46IERhdGVuIG5ldSBwYXJzZW4KKy8vIE5hY2ggZGVtIFNjaHJlaWJlbiBkZXMgU2F2ZWZpbGVzIG1pdHRlbHMgc2F2ZSgpIHdpcmQgYXVjaCBkYXMKKy8vIEtyYWV1dGVyLUhlYWRlcmZpbGUgdm9tIEtyYWV1dGVyLVZDIG5ldSBnZXNjaHJpZWJlbi4KK2ludCBfcmVmcmVzaCgpCit7CisgICBpbnQgaTsKKyAgIHN0cmluZyBrZXk7CisgICBpZiAoZXh0ZXJuX2NhbGwoKSAmJiAhYWxsb3dlZCgpKQorICAgICByZXR1cm4gMDsKKyAgIAorICAgTG9hZElkTGlzdChfX0RJUl9fIkFSQ0gva3JhZXV0ZXJsaXN0ZS5kdW1wIik7CisgICBMb2FkSW5kZXgoX19ESVJfXyJBUkNIL2tyYWV1dGVyaW5kZXguZHVtcCIpOworICAgbWFwX2xkZmllZD0oW10pOworICAgZm9yIChpPXNpemVvZihrcmF1dHByb3BzKS0xOyBpPj0wOyBpLS0pCisgICB7CisgICAgICBpZiAoc2l6ZW9mKGtyYXV0cHJvcHNbaV0pPD1QUk9QX1JPT01ERVRBSUwpIGNvbnRpbnVlOworICAgICAga2V5ID0gYnVpbGRfcGxhbnRuYW1lKGtyYXV0cHJvcHNbaV0pOworICAgICAgbWFwX2xkZmllZFtrZXldPSh7IGtyYXV0cHJvcHNbaV0sIHJvb21zW2tleV18fChbXSkgfSk7CisgICB9CisgICBzYXZlKCk7CisgICBVcGRhdGVWQygpOworICAgCisgICAvLyBVcGRhdGUgSGVhZGVyZmlsZSBtaXQgS3JhZXV0ZXJsaXN0ZQorICAgc3RyaW5nICprZXlzID0gc29ydF9hcnJheShtX2luZGljZXMobWFwX2xkZmllZCksICMnPCk7CisgICBzdHJpbmcgaGVhZGVyZmlsZSA9CisgICAgICIvLyBBdXRvbWF0aXNjaCBnZW5lcmllcnRlcyBGaWxlLCBuaWNodCB2b24gSGFuZCBlZGl0aWVyZW4hXG4iCisgICAgICIvLyBFcnpldWdlbmRlcyBGaWxlOiAiK29iamVjdF9uYW1lKCkrIlxuXG4iCisgICAgICIjZGVmaW5lIFBMQU5UQ09VTlQgIit0b19zdHJpbmcoc2l6ZW9mKGtleXMpKSsiXG5cbiIKKyAgICAgKyIjZGVmaW5lIFBMQU5UKHgpIFwiL2l0ZW1zL2tyYWV1dGVyL1wiK3hcblxuIjsKKyAgIGZvcmVhY2goa2V5OiBrZXlzKQorICAgeworICAgICBoZWFkZXJmaWxlICs9IHNwcmludGYoIiNkZWZpbmUgJS0zMHMgUExBTlQoXCIlc1wiKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIHVwcGVyc3RyaW5nKGtleSksIGtleSk7CisgICB9CisgICB3cml0ZV9maWxlKEtSQUVVVEVSTElTVEUsIGhlYWRlcmZpbGUsIDEpOworCisgICB3cml0ZSgiSW5wdXRmaWxlcyBwYXJzZWQuIFNhdmUgJiBIZWFkZXJmaWxlcyB1cGRhdGVkIVxuIik7CisgICByZXR1cm4gMTsKK30KKworaW50IF9jbG9uZXBsYW50KHN0cmluZyBzdHIpCit7CisgIGlmIChhbGxvd2VkKCkpCisgIHsKKyAgICBpZiAodG9fc3RyaW5nKHRvX2ludChzdHIpKSA9PSBzdHIpCisgICAgICBzdHIgPSBRdWVyeVBsYW50RmlsZSh0b19pbnQoc3RyKSk7CisgICAgY2xvbmVfb2JqZWN0KFBMQU5URElSK3N0ciktPm1vdmUodGhpc19wbGF5ZXIoKSwgTV9OT0NIRUNLKTsKKyAgICB3cml0ZSgiS3JhdXQgIiArIHN0ciArICIgZ2VjbG9udC5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQorCisjZGVmaW5lIE1BWF9ST09NUyAxMCAgLyoga2VpbiBLcmF1dCBpc3QgaW4gbWVociBhbHMgMTAgUmFldW1lbiAqLworLy8gQU46IEF1c2dhYmUgZGVyIEthdGVnb3JpZW5saXN0ZSB1ZWJlciBkYXMgUGxhbnR0b29sLgoraW50IF9zaG93cGxhbnQoc3RyaW5nIHN0cikKK3sKKyAgIGludCBpLCBzaSwga2F0LCBzZWN1cmU7CisgICBzdHJpbmcgKmxpc3QsIGtleTsKKyAgIG1peGVkICpyZXMsICphcnI7CisgICBtYXBwaW5nIHByb3BzOworCisgICBzZWN1cmU9YWxsb3dlZCgpOworICAgbm90aWZ5X2ZhaWwoIkVzIGdpYnQgZm9sZ2VuZGUgS3JhZXV0ZXJrYXRlZ29yaWVuOlxuIgorICAgICsiIDAgLSBoYWV1ZmlnIHVuZCBhbiB2aWVsZW4gU3RlbGxlbiBpbSBNdWQgYW56dWZpbmRlblxuIgorICAgICsiIDEgLSBldHdhcyBzZWx0ZW5lciB6dSBmaW5kZW4sIGFiZXIgaW1tZXIgbm9jaCBsZWljaHRcbiIKKyAgICArIiAyIC0gYW4gd2VuaWdlbiBndXQgdmVyc3RlY2t0ZW4gU3RlbGxlbiBpbiBhYmdlbGVnZW5lbiBHZWJpZXRlblxuIgorICAgICsiIDMgLSBkaXRvLCBqZWRvY2ggbXVzcyBkYXMgS3JhdXQgZHVyY2ggZWluZW4gTlBDIChYUCA+PSA1MDAwMDApIGJld2FjaHQgc2Vpbi5cbiIKKyAgICArIiA0IC0gYWV1c3NlcnN0IHNlbHRlbiB1bmQgWFAgPj0gMSBtaW9cbiIKKyAgICArIiA1IC0gYWV1c3NlcnN0IHNlbHRlbiB1bmQgWFAgPj0gMiBtaW9cbiIKKyAgICArIiA2IC0gYWV1c3NlcnN0IHNlbHRlbiB1bmQgTlBDIGJyaW5ndCA+PSA1ICBTdHVwc2VcbiIKKyAgICArIiA3IC0gYWV1c3NlcnN0IHNlbHRlbiB1bmQgTlBDIGJyaW5ndCA+PSAxMCBTdHVwc2VcbiIKKyAgICArIiA4IC0gYWV1c3NlcnN0IHNlbHRlbiB1bmQgTlBDIGJyaW5ndCA+PSAyMCBTdHVwc2VcbiIKKyAgICArIiA5IC0gYWV1c3NlcnN0IHNlbHRlbiB1bmQgTlBDIGJyaW5ndCA+PSA1MCBTdHVwc2VcbiIKKyAgICArIlxuU3ludGF4OiBzaG93cGxhbnQgPGthdGVnb3JpZT4uXG4iKTsKKyAgIGthdD10b19pbnQoc3RyKTsKKyAgIGlmIChrYXQ8MCB8fCBrYXQ+OSkgcmV0dXJuIDA7CisgICBpZiAodG9fc3RyaW5nKGthdCkhPXN0cikgcmV0dXJuIDA7CisgICBsaXN0PW1faW5kaWNlcyhtYXBfbGRmaWVkKTsKKyAgIC8vIEFOOiAqZ3J1bW1lbCoKKyAgIC8vIHJlcyA9IGFsbG9jYXRlKE1BWF9ST09NUywgKHt9KSk7CisgICByZXM9bWFwKGFsbG9jYXRlKE1BWF9ST09NUyksICMnYWxsb2NhdGUpOyAvLyAoeyAoe30pIC4uLiAoe30pIH0pCisgICBmb3IgKGk9c2l6ZW9mKGxpc3QpLTE7IGk+PTA7IGktLSkgeworICAgICAgYXJyPW1hcF9sZGZpZWRbbGlzdFtpXV07CisgICAgICBpZiAoc2l6ZW9mKGFycikhPTIpIHJhaXNlX2Vycm9yKCJXcm9uZyBtYXBfbGRmaWVkLUZvcm1hdCBieSAiK2xpc3RbaV0rIlxuIik7CisgICAgICBrZXk9aWQya2V5W2FyclswXVtQUk9QX0lEXV07CisgICAgICBpZiAoIWtleSkgcmFpc2VfZXJyb3IoIk1pc3NpbmcgS2V5IGZvciBpZCAiK2FyclswXVtQUk9QX0lEXSsiXG4iKTsKKyAgICAgIHByb3BzPWluZ3JlZGllbnRzW2tleV07CisgICAgICAvL2lmICghcG9pbnRlcnAocHJvcHMpKSBjb250aW51ZTsgLy8gbm9jaCBuaWNodCBlaW5nZXRyYWdlbgorICAgICAgLy9pZiAoc2l6ZW9mKHByb3BzKSE9OCkKKyAgICAgIC8vIHByaW50ZigiV2FybmluZzogV3JvbmcgaW5ncmVkaWVudC1jb250ZW50IGJ5ICIra2V5KyJcbiIpOworICAgICAgLy9kZWJ1ZyhzcHJpbnRmKCIlTyIscHJvcHMpKTsKKyAgICAgIGlmIChwcm9wcz09MCkKKyAgICAgIHsKKyAgICAgICAgZGVidWcoIkZhbHNjaGVyIEtleTogIitrZXkpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBpZiAocHJvcHNbVF9BQlVOREFOQ0VdPT1rYXQpCisgICAgICAgIHsKKyAgICAgICAgICBzaT1zaXplb2YoYXJyWzFdKTsKKyAgICAgICAgICBpZiAoc2k8TUFYX1JPT01TKSB7CisgICAgICAgICAgICBpZiAoc3RyaW5ncChhcnJbMF1bUFJPUF9BREpdKSkgeworICAgICAgICAgICAgICBTZXRQcm9wKFBfQVJUSUNMRSwgMCk7CisgICAgICAgICAgICAgIFNldFByb3AoUF9OQU1FLCBhcnJbMF1bUFJPUF9OQU1FXSk7CisgICAgICAgICAgICAgIFNldFByb3AoUF9OQU1FX0FESiwgYXJyWzBdW1BST1BfQURKXSk7CisgICAgICAgICAgICAgIFNldFByb3AoUF9HRU5ERVIsIGFyclswXVtQUk9QX0dFTkRFUl0pOworICAgICAgICAgICAgICBrZXk9TmFtZShXRVIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBrZXk9YXJyWzBdW1BST1BfTkFNRV07CisgICAgICAgICAgICBpZiAoc2VjdXJlKQorICAgICAgICAgICAgICByZXNbc2ldKz0oeyBzcHJpbnRmKCIlM2QgJS00MHM6ICVkXG4iLCBhcnJbMF1bUFJPUF9JRF0sIGtleSwgc2kpIH0pOworICAgICAgICAgICAgZWxzZSByZXNbc2ldKz0oeyBzcHJpbnRmKCIlLTQwczogJWRcbiIsIGtleSwgc2kpIH0pOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgfQorICAgZm9yIChpPTA7IGk8TUFYX1JPT01TOyBpKyspIHsKKyAgICAgIHNvcnRfYXJyYXkocmVzW2ldLCAjJz4pOworICAgICAgZmlsdGVyKHJlc1tpXSwgIyd3cml0ZSk7CisgICB9CisgICByZXR1cm4gMTsKK30KKworLy8gQU46IEF1c2dhYmUgZGVyIFJhZXVtZSwgaW4gZGVuZW4gZGllIEtyYWV1dGVyIHp1IGZpbmRlbiBzaW5kLgorLy8gYW5nZXN0ZXVlcnQgdWViZXIgZGFzIFBsYW50dG9vbC4KK2ludCBfc2hvd3Jvb21zKHN0cmluZyBzdHIpCit7CisgICBpbnQgaSwgaiwgaWQ7CisgICBzdHJpbmcgKmxpc3QsIGR1bW15OworICAgbWl4ZWQgKmFycjsKKyAgIGlmICghYWxsb3dlZCgpKSByZXR1cm4gMDsKKyAgIG5vdGlmeV9mYWlsKCJTeW50YXg6IHNob3dyb29tcyA8aWQ+IG9kZXIgc2hvd3Jvb21zIGFsbFxuIik7CisgICBpZiAoc3RyIT0iYWxsIikgeworICAgICBpZD10b19pbnQoc3RyKTsKKyAgICAgaWYgKHRvX3N0cmluZyhpZCkhPXN0cikgcmV0dXJuIDA7CisgICB9CisgICBlbHNlIGlkPS0xOworICAgbGlzdD1tX2luZGljZXMobWFwX2xkZmllZCk7CisgICBmb3IgKGk9c2l6ZW9mKGxpc3QpLTE7IGk+PTA7IGktLSkgeworICAgICAgYXJyPW1hcF9sZGZpZWRbbGlzdFtpXV07CisgICAgICBpZiAoc2l6ZW9mKGFycikhPTIpIHJhaXNlX2Vycm9yKCJXcm9uZyBtYXBfbGRmaWVkLUZvcm1hdCBieSAiK2xpc3RbaV0rIlxuIik7CisgICAgICBpZiAoYXJyWzBdW1BST1BfSURdPT1pZCB8fCBpZDwwKSB7CisgICAgICAgICBpZiAoIXNpemVvZihtX2luZGljZXMoYXJyWzFdKSkpIHsKKyAgICAgICAgICAgIGlmIChpZD49MCkgd3JpdGUoIkZ1ZXIgZGllc2UgSWQgc2luZCBrZWluZSBSYWV1bWUgZWluZ2V0cmFnZW4uXG4iKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UgaWYgKGlkPj0wKSB7CisgICAgICAgICAgICB3cml0ZSgiRm9sZ2VuZGUgUmFldW1lIHNpbmQgZnVlciAiK2FyclswXVtQUk9QX0lEXSsiIGVpbmdldHJhZ2VuLlxuIik7CisgICAgICAgICAgICBmaWx0ZXIobWFwKG1faW5kaWNlcyhhcnJbMV0pLCAjJyssICJcbiIpLCAjJ3dyaXRlKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgfQorICAgICAgICAgZWxzZSBmaWx0ZXIobWFwKG1faW5kaWNlcyhhcnJbMV0pLCAjJyssICI6ICIrYXJyWzBdW1BST1BfSURdKyIsICIrYXJyWzBdW1BST1BfTkFNRV0rIlxuIiksICMnd3JpdGUpOworICAgICAgICAgaWYgKGlkPj0wKSByZXR1cm4gMTsKKyAgICAgIH0KKyAgIH0KKyAgIHdyaXRlKCJGdWVyIGRpZXNlIElkIHNpbmQgYmlzaGVyIGtlaW5lIEtyYWV1dGVyIGVpbmdldHJhZ2VuLlxuIik7CisgICByZXR1cm4gMTsKK30KKworLy8gTnV0enVuZyBkZXIgS3JhZXV0ZXIgaW4gIEdlYmlldGVuIGxpZWZlcnQgbnVyIGRhbm4gZ3VlbHRpZ2UgS3JhZXV0ZXIsCisvLyB3ZW5uIGRlciBSYXVtIGVpbmdldHJhZ2VuIGlzdC4KK2ludCBfYWRkcm9vbShzdHJpbmcgc3RyKQoreworICAgaW50IGlkLCBpOworICAgc3RyaW5nICpsaXN0LCB2YzsKKworICAgaWYgKCFhbGxvd2VkKCkpIHsKKyAgICAgIHdyaXRlKCJGdWVyIGRhcyBFaW50cmFnZW4gZGVyIFJhZXVtZSB3ZW5kZSBEaWNoIGRvY2ggYml0dGUgIgorICAgICAgICAgICAgImFuIGVpbmVuIEVNLlxuIik7CisgICAgICByZXR1cm4gMTsKKyAgIH0KKyAgIG5vdGlmeV9mYWlsKCJTeW50YXg6IGFkZHJvb20gPGtyYXV0bnVtbWVyPiA8ZmlsZW5hbWU+XG4iKTsKKyAgIHN0cj1QTC0+X3VucGFyc2VkX2FyZ3MoKTsKKyAgIGlmICghc3RyIHx8IHNzY2FuZihzdHIsICIlZCAlcyIsIGlkLCBzdHIpIT0yKSByZXR1cm4gMDsKKyAgIGlmIChzdHI9PSJoaWVyIiB8fCBzdHI9PSJoZXJlIikKKyAgIHsKKyAgICAgaWYgKCF0aGlzX3BsYXllcigpKQorICAgICB7CisgICAgICAgbm90aWZ5X2ZhaWwoIktlaW4gU3BpZWxlcm9iamVrdCwga2FubiAiCisgICAgICAgICAgICJSYXVtIG5pY2h0IGlkZW50aWZpemllcmVuLlxuIik7CisgICAgICAgcmV0dXJuIDA7CisgICAgIH0KKyAgICAgc3RyPXRvX3N0cmluZyhlbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKSk7CisgICB9CisgICBpZiAoc3RyWzwyLi5dPT0iLmMiKSBzdHI9c3RyWzAuLjwzXTsgLy8gLmMgYWJzY2huZWlkZW4KKyAgIGlmIChmaWxlX3NpemUoc3RyKyIuYyIpPD0wKSB7CisgICAgICBsaXN0PWV4cGxvZGUoc3RyLCAiLyIpOworICAgICAgdmM9aW1wbG9kZShsaXN0WzAuLjwyXSwgIi8iKSsiL3ZpcnR1YWxfY29tcGlsZXIuYyI7CisgICAgICBpZiAoZmlsZV9zaXplKHZjKTw9MCB8fCAhY2FsbF9vdGhlcih2YywgIlZhbGlkYXRlIiwgbGlzdFs8MV0pKSB7CisgICAgICAgICB3cml0ZSgiTm8gc3VjaCBmaWxlIFwiIitzdHIrIlwiLlxuIik7CisgICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgIH0KKyAgIGlmIChpZDw9MCB8fCBpZD49c2l6ZW9mKGlkMmtleSkpIHsKKyAgICAgIHdyaXRlKCJJbGxlZ2FsIHBsYW50aWQgIitpZCsiLlxuIik7CisgICAgICByZXR1cm4gMTsKKyAgIH0KKyAgIGxpc3Q9bV9pbmRpY2VzKG1hcF9sZGZpZWQpOworICAgZm9yIChpPXNpemVvZihsaXN0KS0xOyBpPj0wOyBpLS0pIHsKKyAgICAgIGlmIChtYXBfbGRmaWVkW2xpc3RbaV1dWzBdW1BST1BfSURdPT1pZCkgeworICAgICAgICAgaWYgKCFtZW1iZXIobWFwX2xkZmllZFtsaXN0W2ldXVsxXSwgc3RyKSkgeworICAgICAgICAgICAgbWFwX2xkZmllZFtsaXN0W2ldXVsxXSs9KFsgc3RyIF0pOworICAgICAgICAgICAgcm9vbXNbbGlzdFtpXV09KHJvb21zW2xpc3RbaV1dfHwoW10pKSsoWyBzdHIgXSk7CisgICAgICAgICAgICB3cml0ZSgiUmF1bSBFcmZvbGdyZWljaCBlaW5nZXRyYWdlbiFcbiIpOworICAgICAgICAgfQorICAgICAgICAgZWxzZSB3cml0ZSgiUmF1bSBiZXJlaXRzIGVpbmdldHJhZ2VuLlxuIik7CisgICAgICAgICBzYXZlKCk7CisgICAgICAgICBfcmVmcmVzaCgpOworICAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICB9CisgICB3cml0ZSgiS3JhdXQgbWl0IGlkICIraWQrIiBuaWNodCBnZWZ1bmRlbi5cbiIpOworICAgcmV0dXJuIDE7Cit9CisKK2ludCBfZGVscm9vbShzdHJpbmcgc3RyKQoreworICAgaW50IGksIGRvbmU7CisgICBzdHJpbmcgKmxpc3Q7CisKKyAgIGlmICghYWxsb3dlZCgpKSB7CisgICAgICB3cml0ZSgiRnVlciBkYXMgTG9lc2NoZW4gdm9uIFJhZXVtZW4gd2VuZGUgRGljaCBkb2NoIGJpdHRlICIKKyAgICAgICAgICAgICJhbiBlaW5lbiBFTS5cbiIpOworICAgICAgcmV0dXJuIDE7CisgICB9CisgICBub3RpZnlfZmFpbCgiU3ludGF4OiBkZWxyb29tIDxmaWxlbmFtZT4uXG4iKTsKKyAgIHN0cj1QTC0+X3VucGFyc2VkX2FyZ3MoKTsKKyAgIGlmICghc3RyKSByZXR1cm4gMDsKKyAgIGlmIChzdHJbPDIuLl09PSIuYyIpIHN0cj1zdHJbMC4uPDNdOworICAgbGlzdD1tX2luZGljZXMobWFwX2xkZmllZCk7IGRvbmU9MDsKKyAgIGZvciAoaT1zaXplb2YobGlzdCktMTsgaT49MDsgaS0tKQorICAgeworICAgICAgaWYgKG1lbWJlcihtYXBfbGRmaWVkW2xpc3RbaV1dWzFdLCBzdHIpKSB7CisgICAgICAgICBtX2RlbGV0ZShtYXBfbGRmaWVkW2xpc3RbaV1dWzFdLCBzdHIpOworICAgICAgICAgbV9kZWxldGUocm9vbXNbbGlzdFtpXV0sIHN0cik7CisgICAgICAgICB3cml0ZSgiUmF1bSBiZWkgaWQgIittYXBfbGRmaWVkW2xpc3RbaV1dWzBdW1BST1BfSURdCisgICAgICAgICAgICAgICArIiBhdXNnZXRyYWdlbi5cbiIpOworICAgICAgICAgZG9uZT0xOworICAgICAgfQorICAgfQorICAgaWYgKCFkb25lKSB7CisgICAgICBpZiAoZmlsZV9zaXplKHN0cisiLmMiKTwwKQorICAgICAgICAgd3JpdGUoIk5vIHN1Y2ggZmlsZSBcIiIrc3RyKyJcIi5cbiIpOworICAgICAgZWxzZSB3cml0ZSgiRnVlciAiK3N0cisiIHNpbmQga2VpbmUgS3JhZXV0ZXIgZWluZ2V0cmFnZW4hXG4iKTsKKyAgIH0KKyAgIGVsc2UgeworICAgICAgc2F2ZSgpOworICAgICAgX3JlZnJlc2goKTsKKyAgIH0KKyAgIHJldHVybiAxOworfQorCisvLyBWZXJhbmxhc3N0IGRlbiBLcmFldXRlci1WQywgZWluZSBwaHlzLiBEYXRlaSBhdXMgZGVuIEtyYWV1dGVyZGF0ZW4gZWluZXMKKy8vIEtyYXV0ZXMgenUgZXJ6ZXVnZW4sIGZhbGxzIG1hbiBkaWVzZSBhdXNiZXNjaHJlaWJlbiB3aWxsLgoraW50IF9jcmVhdGVmaWxlKHN0cmluZyBzdHIpCit7CisgIGludCBpZDsKKyAgaWYgKCFhbGxvd2VkKCkpIHsKKyAgICB3cml0ZSgiRGllc2UgRnVua3Rpb24gd3VyZGUgZnVlciBEaWNoIG5pY2h0IGZyZWlnZWdlYmVuIVxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWQ9dG9faW50KHN0cik7CisgIGlmICh0b19zdHJpbmcoaWQpIT1zdHIgfHwgaWQ8PTAgfHwgaWQ+PXNpemVvZihpZDJrZXkpKSB7CisgICAgd3JpdGUoIklsbGVnYWwgcGxhbnRpZCAnIitzdHIrIicuXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBub3RpZnlfZmFpbCgiVW5rbm93biBGdW5jdGlvbiBpbSBrcmFldXRlclZDOiBfY3JlYXRlZmlsZSgpXG4iKTsKKyAgcmV0dXJuIGNhbGxfb3RoZXIoS1JBRVVURVJWQywgIl9jcmVhdGVmaWxlIiwgYnVpbGRfcGxhbnRuYW1lKGtyYXV0cHJvcHNbaWRdKSk7Cit9CisKKy8vIEFOOiBIaWxmc2Z1bmt0aW9uZW4sIGRlcnplaXQgZWJlbmZhbGxzIGRlYWt0aXZpZXJ0LgorLy8gaSA9IDAuLjcsIFBvc2l0aW9uIGRlcyBLcmF1dGVzLCBmdWVyIGRhcyBkZXIgQXVmcnVmIGVyZm9sZ3QsIGluIGRlciAKKy8vIExpc3RlIGRlciBpbiBkZW4gS2Vzc2VsIGVpbmZ1ZWxsdGVuIEtyYWV1dGVyLgorLy8ga2V5THN0IGlzdCBkaWUgTGlzdGUgZGVyIEtyYWV1dGVyZ3J1cHBlbiwgZGVyIGRpZSBLcmFldXRlciB6dWdlb3JkbmV0CisvLyBzaW5kLgorLy8gQW4gZGllc2VyIFN0ZWxsZSBrYW5uIGFsc28gZGllIFdpcmt1bmcgdm9uIEtyYWV1dGVyZ3J1cHBlbiBhYmdlaGFlbmd0CisvLyB3ZXJkZW4uIFVua2xhciBpc3QgbWlyIGFrdHVlbGwgbnVyLCB3YXJ1bSBkaWVzZSBGdW5rdGlvbiBkZW4gUGFyYW1ldGVyCisvLyAiaSIgYmVub2V0aWdlbiB3dWVyZGUuCisvLyBJZGVlOiBFcyBzb2xsIGRpZSBFbnRzY2hlaWR1bmcgZGF2b24gYWJoYWVuZ2lnIGdlbWFjaHQgd2VyZGVuIGtvZW5uZW4sCisvLyB3aWUgZGllIEdlc2FtdGtvbWJpbmF0aW9uIGF1c3NpZWh0LCB1bmQgenVzYWV0emxpY2ggZGF2b24sIGF1cyB3ZWxjaGVyCisvLyBHcnVwcGUgZGFzIGVpbnplbG5lIEtyYXV0IHN0YW1tdC4KK25vbWFzayBwcml2YXRlIGludCBJc0Jsb2NrZWQoaW50IGksIHN0cmluZyAqa2V5THN0KQoreworICByZXR1cm4gMDsKK30KKworLy8gQU46IERpZXNlIEZ1bmt0aW9uIG11ZXNzdGUgbmFjaCBkZW0gQ29kZSBpbiBtYWtlX3BvdGlvbigpIHp1IHVydGVpbGVuCisvLyAwIG9kZXIgMSB6dXJ1ZWNrZ2ViZW4sIGRhbm4gd2lyZCBkZXIgRWlnZW5zY2hhZnRzd2VydCBkZXIgS3JhZXV0ZXJncnVwcGUKKy8vIHVtIGRlbiBGYWt0b3IgMS41IHZlcnN0YWVya3QuCitub21hc2sgcHJpdmF0ZSBpbnQgSXNCb29zdGVkKGludCBpLCBzdHJpbmcgKmtleUxzdCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgUFJORyAiL3N0ZC91dGlsL3JhbmQtZ2xmc3IiCisvLyBJbmRpdmlkdWVsbGUgQm9uaS9NYWxpIGZ1ZXIgU3BpZWxlci4gcGxvZmZzZXQgc29sbCB2aWEgUmVmZXJlbnogdWViZXJnZWJlbgorLy8gd2VyZGVuIHVuZCB3aXJkIHZvbiBkZXIgRnVua3Rpb24gZ2VzZXR6dC4KK2ludCBjYWxjdWxhdGVfbW9kKGludCBrcmF1dGluZGV4LCBzdHJpbmcgcGxuYW1lLCBpbnQgcGxvZmZzZXQpCit7CisgIC8vIFN0YXJ0b2Zmc2V0IHp1ZmFlbGxpZyBlcm1pdHRlbHQsIGFiZXIgaW1tZXIgZ2xlaWNoCisgIC8vIGZ1ZXIgamVkZW4gU3BpZWxlcm5hbWVuCisgIFBSTkctPkluaXRXaXRoVVVJRChwbG5hbWUpOworICBwbG9mZnNldCA9IFBSTkctPnJhbmRvbSgxNik7CisgIC8vIEplZGVzIEtyYXV0IGhhdCBhdWNoIGVpbmVuIGlPZmZzZXQgKGRlciBrb25zdGFudCBibGVpYnQgdW5kIHNpY2ggbmljaHQKKyAgLy8gYWVuZGVydCkuIERlciB3aXJkIGF1Y2ggYWRkaWVydC4gQmVpIFVlYmVyc2NocmVpdGVuIHZvbiAzMCB3aXJkIG5hY2ggMAorICAvLyBnZXdyYXBwdC4KKyAgLy8gRGVyIE9mZnNldCBpc3QgZGFubiAoc3BpZWxlcm9mZnNldCArIGtyYXV0aW5kZXgpICUgMTYsIGQuaC4gYWxsZSBNb2RpZmlrYXRvcmVuIHdlcmRlbgorICAvLyBkZXIgUmVpaGUgbmFjaCBkdXJjaGxhdWZlbi4gU28ga3JpZWd0IGplZGVyIFNwaWVsZXIgLSBmYXN0IGVnYWwsIGJlaSB3ZWxjaGVtCisgIC8vIE9mZnNldCBlciBzdGFydGV0IC0gYXVjaCBkZXIgUmVpaGUgbmFjaCBhbGxlIEJvbmkrTWFsaS4KKyAgaW50IG9mZnNldCA9ICgocGxvZmZzZXQgKyBrcmF1dGluZGV4KSAlIDE2KSAqIDI7CisgIC8vIEFtIEVuZGUgd2lyZCBkYXMgZ2FuemUgbm9jaCBuYWNoIDg1IGJpcyAxMTUgdmVybGVndC4KKyAgcmV0dXJuIG9mZnNldCArIDg1OworfQorCisjZGVmaW5lIFpXRUlUSUVTICIvc2VjdXJlL3p3ZWl0aWVzIgorCittYXBwaW5nIGNhbGN1bGF0ZV9wb3Rpb24oaW50KiBwbGFudGlkcywgaW50KiBxdWFsaXRpZXMsIHN0cmluZyBmYW1pbGllKQoreworICAvLyBNYW4gc29sbHRlIG9obmUgZGllIEtyYWV1dGVyIG5pY2h0IHNvIGVpbmZhY2ggV2lya3VuZ2VuIGJlbGllYmlnCisgIC8vIGJlcmVjaG5lbiBrb2VubmVuLgorICBpZiAoZXh0ZXJuX2NhbGwoKSAmJiAhQVJDSF9TRUNVUklUWSkKKyAgICByZXR1cm4gMDsKKworICAvLyBIaWVyIHNwZWljaGVybiB3aXIgdW5zZXIgRXJnZWJuaXMgYnp3LiB1bnNlciBad2lzY2hlbmVyZ2VibmlzLgorICBtYXBwaW5nIGF0dHJpYjsKKyAgLy8gSGllciBzcGVpY2hlcm4gd2lyIGRpZSBXaXJrZ3J1cHBlbiwgZGllIGF1cyBkZW4gUGxhbnRzIGdlem9nZW4gd2VyZGVuLgorICBtYXBwaW5nKiB3aXJrdW5nZW49KHt9KTsKKyAgLy8gSGllciBzcGVpY2hlcm4gd2lyIGdsZWljaCBzY2hvbiBiZWltIEVyemV1Z2VuIGRpZSB3aWNodGlnc3RlbiBCbG9ja2FkZW4uCisgIHN0cmluZyogdW50ZXJzdHVldHp1bmdlbj0oe30pOworICBzdHJpbmcqIGJsb2NrYWRlbj0oe30pOworICBpbnQgenVmYWxsOworICAvLyBEaWUgU29ydGllcnVuZyBuYWNoIFBsYW50SUQgaXN0IG51ciBmdWVyIGRhcyBUcmFua2xvZyB3aWNodGlnLgorICBwbGFudGlkcyA9IHNvcnRfYXJyYXkocGxhbnRpZHMsICMnPD0pOworCisgIC8vIFBBU1MgMTogUGZsYW56ZW4gZHVyY2ggV2lya3VuZ2VuIGVyc2V0emVuLCBkYWJlaSBVbnRlcnN0dWV0emVyCisgIC8vIHVuZCBCbG9ja2VyIG1lcmtlbi4KKyAgZm9yZWFjaCAoaW50IGlkLCBpbnQgcXVhbCA6IG1rbWFwcGluZyhwbGFudGlkcyxxdWFsaXRpZXMpKQorICAgIHsKKyAgICAgIC8vZGVidWcoc3ByaW50ZigiR2VoZSBkdXJjaCBQbGFudDogJWQiLGlkKSk7CisgICAgICBzdHJpbmcga2V5PWlkMmtleVtpZF07CisgICAgICAvLyBXaXJrdW5nZW4gZGllc2VzIEtyYXV0cyBrb3BpZXJlbgorICAgICAgbWFwcGluZyBpbmc9Y29weShpbmdyZWRpZW50c1trZXldKTsKKyAgICAgIC8vZGVidWcoc3ByaW50ZigiJU8iLGluZykpOworICAgICAgLy8gWnUgZGVuIFdpcmt1bmdlbiBub2NoIGRlbiBLZXkgaGluenVmdWVnZW4uCisgICAgICBpbmdbImtleSJdPWtleTsKKyAgICAgIC8vIERpZSBRdWFsaXRhZXQgZGVzIEtyYXV0ZXMgd2lyZCBub2NoIG1pdCBkZW0gc3BpZWxlcmluZGl2aWR1ZWxsZW4KKyAgICAgIC8vIE1vZGlmaWthdG9yIHNrYWxpZXJ0LgorICAgICAgaW5nWyJxdWFsaXR5Il09KHF1YWwgKiBjYWxjdWxhdGVfbW9kKGlkLCBmYW1pbGllLCAmenVmYWxsKSkgLyAxMDA7CisgICAgICB3aXJrdW5nZW4rPSh7aW5nfSk7CisgICAgICBpZiAocG9pbnRlcnAoaW5nW1RfU1VQUE9SVEVSXSkpCisgICAgICAgIHsKKyAgICAgICAgICBmb3JlYWNoIChzdHJpbmcgcGk6aW5nW1RfU1VQUE9SVEVSXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgdW50ZXJzdHVldHp1bmdlbis9KHtwaX0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBpZiAocG9pbnRlcnAoaW5nW1RfQkxPQ0tJTkddKSkKKyAgICAgICAgeworICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBwaTppbmdbVF9CTE9DS0lOR10pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGJsb2NrYWRlbis9KHtwaX0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBkZWJ1ZyhzcHJpbnRmKCJLcmF1dCAlcyBlcmdpYnQgV2VydGUgJU8uIixrZXksd2lya3VuZ2VuKSk7CisgICAgfQorICAvLyBQQVNTIDI6IEpldHp0IGRpZSBVbnRlcnN0dWV0enVuZ2VuIGF1c3dlcnRlbgorICBmb3JlYWNoIChtYXBwaW5nIG1hcjp3aXJrdW5nZW4pCisgICAgeworICAgICAgZm9yZWFjaCAoc3RyaW5nIHBpOnVudGVyc3R1ZXR6dW5nZW4pCisgICAgICAgIHsKKyAgICAgICAgICAvLyBIYWJlbiB3aXIgZWluZSBVbnRlcnN0dWV0enVuZz8KKyAgICAgICAgICBpZiAobWFyWyJrZXkiXT09cGkgfHwgKChwaVsxXT09JyonKSAmJiAocGlbMF09PW1hclsia2V5Il1bMF0pKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGVidWcgKHNwcmludGYoIm1hcj0lTywgcGk9JU8iLG1hcixwaSkpOworICAgICAgICAgICAgICAvLyBBTExFIFpBSExFTiBtYWwgMS41IG5laG1lbi4gTWlyIGlzdCBrbGFyLCBkYXNzIGRhcyBudW4gYXVjaAorICAgICAgICAgICAgICAvLyBtaXQgaXJnZW5kd2VsY2hlbiBIYWV1Zmlna2VpdGVuIHBhc3NpZXJ0LCBhYmVyIG1hbCBlaHJsaWNoLAorICAgICAgICAgICAgICAvLyBkYXMgaXN0IHp1ciBCZXJlY2hudW5nIGVnYWwuCisgICAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBraywgbWl4ZWQgdmFsIDogJm1hcikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAoaW50cCh2YWwpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgdmFsPTE1KnZhbC8xMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgLy8gUEFTUyAzOiBKZXR6dCBkaWUgQmxvY2thZGVuIGF1c3dlcnRlbgorICBmb3JlYWNoIChtYXBwaW5nIG1hcjp3aXJrdW5nZW4pCisgICAgeworICAgICAgZm9yZWFjaCAoc3RyaW5nIHBpOmJsb2NrYWRlbikKKyAgICAgICAgeworICAgICAgICAgIC8vIEhhYmVuIHdpciBlaW5lIEJsb2NrYWRlPworICAgICAgICAgIGlmIChtYXJbImtleSJdPT1waSB8fCAoKHBpWzFdPT0nKicpICYmIChwaVswXT09bWFyWyJrZXkiXVswXSkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkZWJ1ZyAoc3ByaW50ZigibWFyPSVPLCBwaT0lTyIsbWFyLHBpKSk7CisgICAgICAgICAgICAgIC8vIEhpZXIgd2VyZGVuIGFsbGUgWmFobGVuIGF1ZiBOdWxsIGdlc2V0enQuCisgICAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBraywgbWl4ZWQgdmFsIDogJm1hcikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAoaW50cCh2YWwpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgdmFsPTA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgLy8gUEFTUyAzLjU6IFF1YWxpdGFldCBkZXIgS3JhZXV0ZXIgc2thbGllcmVuLgorICBmb3JlYWNoIChtYXBwaW5nIG1hcjp3aXJrdW5nZW4pCisgICAgeworICAgICAgZm9yZWFjaCAoc3RyaW5nIGtrLCBtaXhlZCB2YWwgOiAmbWFyKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGludHAodmFsKSAmJiBrayE9InF1YWxpdHkiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICB2YWw9dmFsKm1hclsicXVhbGl0eSJdLzEwMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAvLyBQQVNTIDQ6IE51biBhZGRpZXJlbiB3aXIgYWxsZXMgYXVmIGluIGRhcyBNYXBwaW5nIGF0dHJpYi4KKyAgYXR0cmliPShbXSk7CisgIGZvcmVhY2ggKG1hcHBpbmcgbWFyOndpcmt1bmdlbikKKyAgICB7CisgICAgICBmb3JlYWNoIChzdHJpbmcga2s6bWFyKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGludHAobWFyW2trXSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGF0dHJpYltra109YXR0cmliW2trXSttYXJba2tdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgIC8vIERpZSBXaXJrdW5nc2RhdWVyIGlzdCBkZXIgRHVyY2hzY2huaXR0IGRlciBXaXJrdW5nc2RhdWVybgorICBhdHRyaWJbVF9FRkZFQ1RfRFVSQVRJT05dIC89IHNpemVvZihwbGFudGlkcyk7CisgIGRlYnVnKHNwcmludGYoIkR1cmF0aW9uOiAlZFxuIixhdHRyaWJbVF9FRkZFQ1RfRFVSQVRJT05dKSk7CisKKyAgLy8gRGllIEhhbHRiYXJrZWl0IGRlcyBUcmFua3MgaXN0IGRpZSBIYWx0YmFya2VpdCBkZXMga2xlaW5zdGVuIEtyYXV0ZXMuCisgIGludCBkdXI9MTAwMDAwMDA7CisgIGZvcmVhY2ggKG1hcHBpbmcgbWFyOndpcmt1bmdlbikKKyAgICB7CisgICAgICBpZiAobWFyW1RfRVhQSVJFXT4wICYmIGR1cj5tYXJbVF9FWFBJUkVdKQorICAgICAgICB7CisgICAgICAgICAgZHVyPW1hcltUX0VYUElSRV07CisgICAgICAgIH0KKyAgICB9CisgIGlmIChkdXI9PTEwMDAwMDAwKQorICAgIHsKKyAgICAgIGR1cj0wOworICAgIH0KKyAgYXR0cmliW1RfRVhQSVJFXT1kdXI7CisgIGRlYnVnKHNwcmludGYoIkV4cGlyZTogJWRcbiIsZHVyKSk7CisKKyAgaW50IG1heGltdW09MDsKKyAgLy8gRWZmZWt0ZSByYXVzcmVjaG5lbiwgZGllIG5pY2h0IG1heGltYWwgc2luZAorICBmb3JlYWNoIChzdHJpbmcga2ssIG1peGVkIHZhbDphdHRyaWIpCisgIHsKKyAgICBpZiAobWVtYmVyKFRfS1JBVVRfRUZGRUNUUyxrayk+PTApCisgICAgeworICAgICAgaWYgKHZhbD4wICYmIG1heGltdW08dmFsKQorICAgICAgeworICAgICAgICBtYXhpbXVtPXZhbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLy8gTG9nZWludHJhZyBlcnN0ZWxsZW4uCisgIHNsX2V4ZWMoIklOU0VSVCBJTlRPIHJvaGRhdGVuKHVpZCwgcm5kLCByZWNlaXBlLCBxdWFsaXR5LCBjYXIsIGRhLCBkbSwgZHUsICIKKyAgICAgICAgICAiZG4sIGZsdCwgZnJvLCBoSSwgaFAsIGhLLCBoTCwgcGEsIHBtLCBwdSwgc3MsIHNwLCBzZCkgIgorICAgICAgICAgICJWQUxVRVMoPzEsPzIsPzMsPzQsPzUsPzYsPzcsPzgsPzksPzEwLD8xMSwgPzEyLCA/MTMsID8xNCwgIgorICAgICAgICAgICI/MTUsID8xNiwgPzE3LCA/MTgsID8xOSwgPzIwLCA/MjEpOyIsCisgICAgICAgICAgdGhpc19wbGF5ZXIoKSA/IGdldHVpZCh0aGlzX3BsYXllcigpKSA6ICI8dW5rbm93bj4iLAorICAgICAgICAgIHp1ZmFsbCwKKyAgICAgICAgICBpbXBsb2RlKG1hcChwbGFudGlkcywgIyd0b19zdHJpbmcpLCAiLCAiKSwKKyAgICAgICAgICBpbXBsb2RlKG1hcChxdWFsaXRpZXMsICMndG9fc3RyaW5nKSwgIiwgIiksCisgICAgICAgICAgYXR0cmliW1RfQ0FSUlldLCBhdHRyaWJbVF9EQU1BR0VfQU5JTUFMU10sCisgICAgICAgICAgYXR0cmliW1RfREFNQUdFX01BR0lDXSwgYXR0cmliW1RfREFNQUdFX1VOREVBRF0sCisgICAgICAgICAgYXR0cmliW1RfRUZGRUNUX0RVUkFUSU9OXSwgYXR0cmliW1RfRkxFRV9UUE9SVF0sCisgICAgICAgICAgYXR0cmliW1RfRlJPR10sIGF0dHJpYltUX0hFQUxfRElTRUFTRV0sCisgICAgICAgICAgYXR0cmliW1RfSEVBTF9QT0lTT05dLCBhdHRyaWJbVF9IRUFMX1NQXSwKKyAgICAgICAgICBhdHRyaWJbVF9IRUFMX0xQXSwgYXR0cmliW1RfUFJPVEVDVElPTl9BTklNQUxTXSwKKyAgICAgICAgICBhdHRyaWJbVF9QUk9URUNUSU9OX01BR0lDXSwgYXR0cmliW1RfUFJPVEVDVElPTl9VTkRFQURdLAorICAgICAgICAgIGF0dHJpYltUX1NBX1NQRUVEXSwgYXR0cmliW1RfU0FfU1BFTExfUEVORVRSQVRJT05dLAorICAgICAgICAgIGF0dHJpYltUX1NBX0RVUkFUSU9OXSk7CisKKyAgLy8gTWF4aW1hbCB6d2VpIHBvc2l0aXZlIEVmZmVrdGUuCisgIGludCBjdGVmZj0wOworICBmb3JlYWNoIChzdHJpbmcga2ssIG1peGVkIHZhbCA6ICZhdHRyaWIpCisgIHsKKyAgICAgIGlmIChtZW1iZXIoVF9LUkFVVF9FRkZFQ1RTLGtrKT49MCkKKyAgICAgIHsKKyAgICAgICAgLy8gTnVyIGRpZSAyIHN0YWVya3N0ZW4gcG9zaXRpdmVuIFdpcmt1bmdlbiBibGVpYmVuIHVlYmVyIChkYXp1CisgICAgICAgIC8vIG11ZXNzZW4gc2llIHdpcmtsaWNoIGRlbiBnbGVpY2hlbiBaYWhsZW53ZXJ0IGhhYmVuLCBrYW5uIGJlaQorICAgICAgICAvLyBIZWlsdW5nZW4gdm9ya29tbWVuLCBzb25zdCBlaGVyIHVud2FocnNjaGVpbmxpY2gpLgorICAgICAgICBpZiAodmFsPjAgJiYgbWF4aW11bT52YWwpCisgICAgICAgIHsKKyAgICAgICAgICB2YWw9MDsKKyAgICAgICAgfQorICAgICAgICAvLyBUaHJlc2hvbGRzLiBadSB6dSBncm9zc2UgV2lya3VuZ2VuIGhhYmVuIGRpZSBHcmVuemUgYWxzCisgICAgICAgIC8vIEF1c3dpcmt1bmcuIE5lZ2F0aXZlIFdpcmt1bmdlbiwgZGllIC1UX01JTklNVU1fVEhSRVNIT0xEIG5pY2h0CisgICAgICAgIC8vIHVlYmVyc2NocmVpYmVuLCBmYWxsZW4gd2VnLiBCZWkgZGVuIHBvc2l0aXZlbiBibGVpYnQgamEgb2huZWhpbiBudXIKKyAgICAgICAgLy8gZGllIHN0YWVya3N0ZSBXaXJrdW5nIHVlYmVyLCBkYSBnaWJ0IGVzIGVyc3RtYWwga2VpbmUKKyAgICAgICAgLy8gTWluZGVzdGdyb2Vzc2UgbWVoci4KKyAgICAgICAgaWYgKHZhbD5UX01BWElNVU1fVEhSRVNIT0xEKQorICAgICAgICB7CisgICAgICAgICAgdmFsPVRfTUFYSU1VTV9USFJFU0hPTEQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbCA8IDAgJiYgdmFsID4gLVRfTUlOSU1VTV9USFJFU0hPTEQpCisgICAgICAgIHsKKyAgICAgICAgICB2YWw9MDsKKyAgICAgICAgfQorICAgICAgICBpZiAobWF4aW11bT09dmFsICYmIHZhbD4wKQorICAgICAgICB7CisgICAgICAgICAgY3RlZmYrKzsKKyAgICAgICAgICAvLyBWb2VsbGlnIHdpbGxrdWVybGljaCwgd2FzIGhpZXIgZ2V0cm9mZmVuIHdpcmQuIE9iIHJlcHJvZHV6aWVyYmFyLAorICAgICAgICAgIC8vIHZlcm11dGxpY2ggamEsIGFiZXIgaGFlbmd0IG1pdCBkZXIgTWFwcGluZ3N0cnVrdHVyIHp1c2FtbWVuLgorICAgICAgICAgIC8vIEhhcmhhci4KKyAgICAgICAgICBpZiAoY3RlZmY+MikKKyAgICAgICAgICB7CisgICAgICAgICAgICB2YWw9MDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgfQorICBkZWJ1ZyhzcHJpbnRmKCIgVFJBTktFUkdFQk5JUzogJU8iLGF0dHJpYikpOworICAvLyBMb2dlaW50cmFnIGVyc3RlbGxlbi4KKyAgc2xfZXhlYygiSU5TRVJUIElOVE8gdHJhZW5rZSh1aWQsIHJuZCwgcmVjZWlwZSwgcXVhbGl0eSwgY2FyLCBkYSwgZG0sIGR1LCAiCisgICAgICAgICAgImRuLCBmbHQsIGZybywgaEksIGhQLCBoSywgaEwsIHBhLCBwbSwgcHUsIHNzLCBzcCwgc2QpICIKKyAgICAgICAgICAiVkFMVUVTKD8xLD8yLD8zLD80LD81LD82LD83LD84LD85LD8xMCw/MTEsID8xMiwgPzEzLCA/MTQsICIKKyAgICAgICAgICAiPzE1LCA/MTYsID8xNywgPzE4LCA/MTksID8yMCwgPzIxKTsiLAorICAgICAgICAgIHRoaXNfcGxheWVyKCkgPyBnZXR1aWQodGhpc19wbGF5ZXIoKSkgOiAiPHVua25vd24+IiwKKyAgICAgICAgICB6dWZhbGwsCisgICAgICAgICAgaW1wbG9kZShtYXAocGxhbnRpZHMsICMndG9fc3RyaW5nKSwgIiwgIiksCisgICAgICAgICAgaW1wbG9kZShtYXAocXVhbGl0aWVzLCAjJ3RvX3N0cmluZyksICIsICIpLAorICAgICAgICAgIGF0dHJpYltUX0NBUlJZXSwgYXR0cmliW1RfREFNQUdFX0FOSU1BTFNdLAorICAgICAgICAgIGF0dHJpYltUX0RBTUFHRV9NQUdJQ10sIGF0dHJpYltUX0RBTUFHRV9VTkRFQURdLAorICAgICAgICAgIGF0dHJpYltUX0VGRkVDVF9EVVJBVElPTl0sIGF0dHJpYltUX0ZMRUVfVFBPUlRdLAorICAgICAgICAgIGF0dHJpYltUX0ZST0ddLCBhdHRyaWJbVF9IRUFMX0RJU0VBU0VdLAorICAgICAgICAgIGF0dHJpYltUX0hFQUxfUE9JU09OXSwgYXR0cmliW1RfSEVBTF9TUF0sCisgICAgICAgICAgYXR0cmliW1RfSEVBTF9MUF0sIGF0dHJpYltUX1BST1RFQ1RJT05fQU5JTUFMU10sCisgICAgICAgICAgYXR0cmliW1RfUFJPVEVDVElPTl9NQUdJQ10sIGF0dHJpYltUX1BST1RFQ1RJT05fVU5ERUFEXSwKKyAgICAgICAgICBhdHRyaWJbVF9TQV9TUEVFRF0sIGF0dHJpYltUX1NBX1NQRUxMX1BFTkVUUkFUSU9OXSwKKyAgICAgICAgICBhdHRyaWJbVF9TQV9EVVJBVElPTl0pOworCisgIHJldHVybiBhdHRyaWI7Cit9CisKK21hcHBpbmcgbWFrZV9wb3Rpb24ob2JqZWN0KiBwbGFudHMpCit7CisgIC8vIC0+IG1hcHB0IG5pY2h0LU9iamVrdCB6dSAwLCBhYmVyIDAgaXN0IGF1Y2ggbmUgZ3VlbHRpZ2UgUGxhbnRJRC4gRGFoZXIKKyAgLy8gbfxzc2VuIHplcnN0b2VydGVuIE9iamVrdGUgdm9yaGVyIHJhdXMuCisgIC8vIFRPRE86IGRyYXVmIHZlcmxhc3NlbiwgZGFzcyBudXIgaW50YWt0ZSBPYmpla3QgZW50aGFsdGVuIHNpbmQ/CisgIGlmIChtZW1iZXIocGxhbnRzLCAwKSA+PSAwKQorICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIm1ha2VfcG90aW9uKCkgZ290IGludmFsaWQgb2JqZWN0IGluIHBsYW50IGFycmF5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIlLjUwT1xuIixwbGFudHMpKTsKKworICBpbnQqIHBsYW50aWRzID0gKGludCopcGxhbnRzLT5RdWVyeVBsYW50SWQoKTsKKyAgaW50KiBxdWFsaXRpZXMgPSAoaW50KilwbGFudHMtPlF1ZXJ5UHJvcChQX1FVQUxJVFkpOworCisgIHJldHVybiBjYWxjdWxhdGVfcG90aW9uKHBsYW50aWRzLCBxdWFsaXRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFpXRUlUSUVTLT5RdWVyeUZhbWlsaWUodGhpc19wbGF5ZXIoKSkpOworfQorCisvLyBBTjogU3VjaHQgYWxsZSBQZmxhbnplbiByYXVzLCBpbiBkZXJlbiBOYW1lbiBkZXIgU3VjaGJlZ3JpZmYgInN0ciIKKy8vIHZvcmtvbW10IHVuZCBsaXN0ZXQgZGllc2UgYXVmLiBMYWV1ZnQgYWxsZXJkaW5ncyBtb21lbnRhbiBub2NoIGluIGVpbmVuCisvLyBGZWhsZXIgImluZGV4IG91dCBvZiBib3VuZHMiLCBhYmVyIG1hbiBtdWVzc3RlIGhpZXIgKFRPRE8pIHNvd2llc28gbWFsCisvLyB2b24gZXhwbG9kZSgpIGF1ZiBzdHJzdHIoKSB1bWJhdWVuLCBkZW5rZSBpY2guCitzdHJpbmcgX2ZpbmRwbGFudChzdHJpbmcgc3RyKSB7CisgIGludCBpLCBrOworICBzdHJpbmcgKmluZCwgKnRtcDsKKworICBpZighc3RyKSByZXR1cm4gIiI7CisgIHdyaXRlKCJTdWNoZSBuYWNoICciK3N0cisiJzpcblxuIik7CisgIGluZCA9IG1faW5kaWNlcyhtYXBfbGRmaWVkKTsKKyAgZm9yKGk9MDtpPHNpemVvZihpbmQpO2krKykgeworICAgIHRtcCA9IG1hcF9sZGZpZWRbaW5kW2ldXVswXTsKKyAgICBpZiggc3RyaW5ncCh0bXBbM10pICYmIAorICAgICAgICBvbGRfZXhwbG9kZShsb3dlcl9jYXNlKHRtcFszXSksc3RyKVswXSAhPSBsb3dlcl9jYXNlKHRtcFszXSkgCisgICAgICAgIHx8CisgICAgICAgIHN0cmluZ3AodG1wWzRdKSAmJiAKKyAgICAgICAgb2xkX2V4cGxvZGUobG93ZXJfY2FzZSh0bXBbNF0pLHN0cilbMF0gIT0gbG93ZXJfY2FzZSh0bXBbNF0pKQorICAgICAgd3JpdGUoIiAtICAiK3RtcFszXSsKKyAgICAgICAgICAoc3RyaW5ncCh0bXBbNF0pPyIgKCIrdG1wWzRdKyIpIjoiIikrIiAgICAgICAtICIrdG1wWzBdKyJcbiIpOworICB9CisKKyAgcmV0dXJuICIiOworfQorCisvLyBBTjogRnVua3Rpb24gbGllZmVydCBkYXMgRXJnZWJuaXNhcnJheSBhdXMgbWFrZV9wb3Rpb24oKSBmdWVyIGVpbmUgTGlzdGUKKy8vIHZvbiBLcmFldXRlcm4sIGRpZSBhbHMgIiwgIi1nZXRyZW5udGUgS3JhdXQtSURzIHVlYmVyZ2ViZW4gd2VyZGVuIG11ZXNzZW4uCittaXhlZCBfY2hlY2tUcmFuayhzdHJpbmcgc3RyKQoreworICBpZiAoZXh0ZXJuX2NhbGwoKSAmJiAhYWxsb3dlZCgpKQorICAgIHJldHVybiAwOworCisgIHN0cmluZyAqaW5kLCAqYXJncywgbmFtZTsKKyAgb2JqZWN0ICpvYmpzOworICBpbnQgaywgbDsKKworICBvYmpzID0gKHt9KTsKKyAgaWYoIXN0cikgcmV0dXJuICJLZWluZSBLcmFldXRlciB1ZWJlcmdlYmVuISI7CisgIGluZCA9IG9sZF9leHBsb2RlKHN0ciwiLCIpOworLy8gIGluZCA9ICh7IjE4MCIsIjExIiwiNTMifSk7CisgIGZvcihpbnQgaT0wO2k8c2l6ZW9mKGluZCk7aSsrKQorICB7CisgICAgbmFtZSA9IGJ1aWxkX3BsYW50bmFtZShrcmF1dHByb3BzW3RvX2ludChpbmRbaV0pXSk7CisgICAgd3JpdGUoIklucHV0OiAnIituYW1lKyInICgiK2luZFtpXSsiKVxuIik7CisgICAgb2JqcyArPSAoe2Nsb25lX29iamVjdChQTEFOVERJUituYW1lKX0pOworICB9CisgIG1hcHBpbmcgcmFndGVzdCA9IG1ha2VfcG90aW9uKG9ianMpOworICBvYmpzLT5yZW1vdmUoKTsKKy8qICBuYW1lPSIiOworICBmb3IoaW50IGk9MDtpPHNpemVvZihyYWd0ZXN0KTtpKyspCisgICAgICAgbmFtZSA9IG5hbWUgKyByYWd0ZXN0W2ldKyIsIjsKKyAgd3JpdGUoIlJlc3VsdDogKHsgIituYW1lKyIgfSlcbiIpOyovCisgIHJldHVybiBzcHJpbnRmKCIlT1xuIixyYWd0ZXN0KTsKK30KKworI2RlZmluZSBRVUFMX0JBU0UgIDAKKyNkZWZpbmUgUVVBTF9STkQgICAxCisjZGVmaW5lIERFTEFZX0JBU0UgMgorI2RlZmluZSBERUxBWV9STkQgIDMKKworI2RlZmluZSBBTExPV0VEX0RSSUVSICIvaXRlbXMva3JhZXV0ZXIvdHJvY2tuZXIiCisKKy8vIExpZWZlcnQgZGllIFRyb2NrbnVuZ3NkYXRlbiBlaW5lcyBSYXVtZXMgYXVzLCBtaXQgZGVuZW4gZGVyIEtyYWV1dGVyLQorLy8gdHJvY2tuZXIgZGFubiBkYXMgS3JhdXQgYmVhcmJlaXRlbiBrYW5uLgoraW50ICpRdWVyeURyeWluZ0RhdGEoKSB7CisgIC8vIEVzIG11c3MgYWxsZXJkaW5ncyBkYXMgYXVmcnVmZW5kZSBPYmpla3QgZWluIFRyb2NrbmVyLUNsb25lIHNlaW4sIAorICAvLyBkZXIgaW4gZWluZW0gZGVyIHp1Z2VsYXNzZW5lbiBSYWV1bWUgc3RlaGVuIG11c3MuCisgIC8vIFdlbm4gZGFzIG5pY2h0IGRlciBGYWxsIGlzdCwgd2lyZCBkZXIgVHJvY2tuZXIgZGFzIGxlZXJlIEFycmF5LCBkYXMgCisgIC8vIHp1cnVlY2tnZWdlYmVuIHdpcmQsIGFscyBJbmRpeiB3ZXJ0ZW4sIGRhc3MgZXIgaW0gZmFsc2NoZW4gUmF1bSBzdGVodC4KKyAgaWYgKCBvYmplY3RwKHByZXZpb3VzX29iamVjdCgpKSAmJgorICAgICAgIGxvYWRfbmFtZShwcmV2aW91c19vYmplY3QoKSkgPT0gQUxMT1dFRF9EUklFUiAmJgorICAgICAgIG1lbWJlcihkcnlpbmdfZGF0YSwgbG9hZF9uYW1lKGVudmlyb25tZW50KHByZXZpb3VzX29iamVjdCgpKSkpICYmCisgICAgICAgY2xvbmVwKHByZXZpb3VzX29iamVjdCgpKSApCisgIHsKKyAgICAvLyBSYXVtIGVybWl0dGVsbiwgRGVsYXkvUXVhbGkgZXJyZWNobmVuLCBFcmdlYm5pc2FycmF5IHp1cnVlY2tnZWJlbi4KKyAgICBzdHJpbmcgd2hlcmUgPSBsb2FkX25hbWUoZW52aXJvbm1lbnQocHJldmlvdXNfb2JqZWN0KCkpKTsKKyAgICBpbnQgZGVsYXkgPSBkcnlpbmdfZGF0YVt3aGVyZSxERUxBWV9CQVNFXSsKKyAgICAgICAgICAgICAgICByYW5kb20oZHJ5aW5nX2RhdGFbd2hlcmUsREVMQVlfUk5EXSk7CisgICAgaW50IHF1YWwgID0gZHJ5aW5nX2RhdGFbd2hlcmUsUVVBTF9CQVNFXSsKKyAgICAgICAgICAgICAgICByYW5kb20oZHJ5aW5nX2RhdGFbd2hlcmUsUVVBTF9STkRdKTsKKyAgICByZXR1cm4gKHsgZGVsYXksIHF1YWwgfSk7CisgIH0KKyAgcmV0dXJuICh7fSk7Cit9CisKKy8vIE1vZGlmaXppZXJlbiBkZXIgVHJvY2tudW5nc2RhdGVuLgorLy8gPHJvb20+IG11c3MgZGVyIHZvbGxlIERhdGVpbmFtZSBkZXMgUmF1bWVzIHNlaW4sIG9obmUgLmMgYW0gRW5kZS4KKy8vIDx2YWx1ZXM+IGVudGhhZWx0IGRpZSB2aWVyIFBhcmFtZXRlciB6dSBkZW0gUmF1bSBpbiBmb2xnZW5kZXIgUmVpaGVuZm9sZ2U6CisvLyAoeyBRdWFsaS1CYXNpcywgUXVhbGktWnVmYWxsc2FudGVpbCwgRGVsYXktQmFzaXMsIERlbGF5LVp1ZmFsbHNhbnRlaWwgfSkKKy8vIFdlbm4gPHZhbHVlcz4gbmljaHQgYW5nZWJlbiB3aXJkIG9kZXIgMCBpc3QsIHdlcmRlbiBkaWUgRGF0ZW4genUgPHJvb20+CisvLyBnZWxvZXNjaHQuCitpbnR8bWFwcGluZyBTZXREcnlpbmdEYXRhKHN0cmluZyByb29tLCBpbnQqIHZhbHVlcykgCit7CisgIC8vIGtlaW5lIFp1Z3JpZmZzcmVjaHRlCisgIGlmICggIWFsbG93ZWQoKSApCisgICAgcmV0dXJuIC0xOworICAKKyAgLy8gPHZhbHVlcz4gd3VyZGUgbmljaHQgdWViZXJnZWJlbj8gRGFubiBEYXRlbiBsb2VzY2hlbi4KKyAgaWYgKCAhdmFsdWVzICkgCisgIHsKKyAgICBtX2RlbGV0ZShkcnlpbmdfZGF0YSwgcm9vbSk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICAvLyBBbnNvbnN0ZW4gbXVlc3NlbiA0IEludGVnZXItV2VydGUgYWxzIDx2YWx1ZXM+IHVlYmVyZ2ViZW4gd2VyZGVuLgorICBpZiAoIHNpemVvZih2YWx1ZXMpICE9IDQgKSAKKyAgICByZXR1cm4gLTI7CisKKyAgaWYgKCByb29tWzwyLi48MV0gPT0gIi5jIiApCisgICAgcm9vbSA9IHJvb21bLi48M107CisKKyAgLy8gVWViZXJnZWJlbmUgRGF0ZW4gYWVuZGVybiBkaXJla3QgZGFzIE1hcHBpbmcgZGVyIFRyb2NrbnVuZ3NkYXRlbi4KKyAgbV9hZGQoZHJ5aW5nX2RhdGEsIHJvb20sIHZhbHVlcy4uLik7CisgIHNhdmUoKTsKKyAgcmV0dXJuIChbIHJvb20gOiBkcnlpbmdfZGF0YVtyb29tLDBdOyBkcnlpbmdfZGF0YVtyb29tLDFdOyAKKyAgICAgICAgICAgICAgICAgICBkcnlpbmdfZGF0YVtyb29tLDJdOyBkcnlpbmdfZGF0YVtyb29tLDNdXSk7Cit9CisKK3ZhcmFyZ3MgbWFwcGluZyBRdWVyeURyeWluZygpCit7CisgIHJldHVybiAoYWxsb3dlZCgpID8gZHJ5aW5nX2RhdGEgOiAoW10pICk7Cit9CisKK3ZhcmFyZ3MgaW50IHJlbW92ZShpbnQgc2lsZW50KSAKK3sKKyAgc2F2ZSgpOworICByZXR1cm4gOjpyZW1vdmUoc2lsZW50KTsKK30KKworLyoKKyNkZWZpbmUgRFJZSU5HREFUQSAiL3NlY3VyZS9BUkNIL2tyYWV1dGVydHJvY2tudW5nc2RhdGVuIgorCitwcml2YXRlIHZvaWQgUmVhZERyeWluZ0RhdGEoKSAKK3sKKyAgbWl4ZWQgZGF0YSA9IGV4cGxvZGUocmVhZF9maWxlKERSWUlOR0RBVEEpLCAiXG4iKS0oeyIifSk7CisgIGZvcmVhY2goc3RyaW5nIGxpbmUgOiBkYXRhKSAKKyAgeworICAgIGlmICggbGluZVswXSA9PSAnIycgKQorICAgICAgY29udGludWU7CisgICAgc3RyaW5nICpmaWVsZHMgPSBleHBsb2RlKGxpbmUsIjsiKTsKKyAgICBmaWVsZHNbMS4uXSA9IG1hcChmaWVsZHNbMS4uXSwgIyd0b19pbnQpOworICAgIG1fYWRkKHRtcF9kcnlpbmdfZGF0YSwgZmllbGRzLi4uKTsKKyAgfQorfSovCisKZGlmZiAtLWdpdCBhL3NlY3VyZS9sZXBtYXN0ZXIuYyBiL3NlY3VyZS9sZXBtYXN0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDdjYjc5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL2xlcG1hc3Rlci5jCkBAIC0wLDAgKzEsNDA4IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gbGVwbWFzdGVyLmMgLS0gTWFzdGVyLCB3ZWxjaGVyIGF1cyBzY29yZW1hc3RlciwgZXhwbG9yYXRpb25tYXN0ZXIsCisvLyAgICAgICAgICAgICAgICBxdWVzdG1hc3RlciB1bmQgZGVtIFNwaWVsZXJvYmpla3QgSW5mb3JtYXRpb25lbgorLy8gICAgICAgICAgICAgICAgYXVzbGllc3QgdW5kIGF1cyBkaWVzZW4gZGllIExldmVscHVua3RlIGRlcyBTcGllbGVyCisvLyAgICAgICAgICAgICAgICBiZXJlY2huZXQKKy8vICAgICAgICAgICAgICAgIFdlaXRlcnMgZGVyamVuaWdlLCBkZXIgZGllIFNlaGVyYW5mb3JkZXJ1bmdlbiAKKy8vICAgICAgICAgICAgICAgIHBydWVmdC4gCisvLworLy8gJElkOiBsZXBtYXN0ZXIuYyA5MTY4IDIwMTUtMDMtMDUgMDA6MDQ6MjJaIFplc3N0cmEgJAorCisvLyBIaWVyIGtvbW1lbiBGdW5rdGlvbmVuIGZ1ZXIgZGllIExldmVscHVua3RlCisjcHJhZ21hIHN0cmljdF90eXBlcworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBub19zaGFkb3cKKyNwcmFnbWEgbm9faW5oZXJpdAorI3ByYWdtYSB2ZXJib3NlX2Vycm9ycworI3ByYWdtYSBjb21iaW5lX3N0cmluZ3MKKy8vI3ByYWdtYSBwZWRhbnRpYworLy8jcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIHdhcm5fZGVwcmVjYXRlZAorCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG5ld19za2lsbHMuaD4KKyNpbmNsdWRlIDxleHBsb3JhdGlvbi5oPgorI2luY2x1ZGUgPHF1ZXN0bWFzdGVyLmg+CisjaW5jbHVkZSA8c2NvcmVtYXN0ZXIuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKworI2luY2x1ZGUgImxlcG1hc3Rlci5oIgorCisvLyBEYXMgUHJvZ3JhbW0genVyIEZvZXJkZXJ1bmcgZGVyIGtsZWluZW4gTGV2ZWwgYWt0aXZpZXJlbi4gOy0pCisjZGVmaW5lIF9fUEZPRVJLTF9fIDEKKworLy8gZGllIGVyc3RlbiA4IExldmVsLCBkLmguIExldmVsIDEgYmlzIDggZW50c3ByZWNoZW4gZGllc2VuIExFUHMuCitpbnQgKkxPV19MRVZFTF9MRVBfTElTVCA9ICh7MTAwLDEyMCwxNDAsMTgwLDIyMCwzMDAsMzYwLDQyMH0pOyAvLyA5LiBMZXZlbDogNTAwIExFUAorCisjZGVmaW5lIFJFUV9URVhUMSAgKFswOiJ1bmdsYXVibGljaCB2aWVsIiwgXAorICAgICAgICAgICAgICAgICAgMToidW5nbGF1YmxpY2ggdmllbCIsIFwKKwkJICAyOiJlbm9ybSB2aWVsIiwgXAorCQkgIDM6InNlaHIgdmllbCIsIFwKKwkJICA0OiJ2aWVsIiwgXAorCQkgIDU6ImVpbmlnZXMiLCBcCisJCSAgNjoiZXR3YXMiLCBcCisJCSAgNzoid2VuaWciLCBcCisgICAgICAgICAgICAgICAgICA4OiJzZWhyIHdlbmlnIiwgXAorICAgICAgICAgICAgICAgICAgOToia2F1bSBldHdhcyIgXSkKKworI2RlZmluZSBSRVFfVEVYVDIgIChbMDoidW5nbGF1YmxpY2ggdmllbGUiLCBcCisgICAgICAgICAgICAgICAgICAxOiJ1bmdsYXVibGljaCB2aWVsZSIsIFwKKwkJICAyOiJlbm9ybSB2aWVsZSIsIFwKKwkJICAzOiJzZWhyIHZpZWxlIiwgXAorCQkgIDQ6InZpZWxlIiwgXAorCQkgIDU6ImVpbmlnZSIsIFwKKwkJICA2OiJlaW4gcGFhciIsIFwKKwkJICA3OiJ3ZW5pZ2UiLCBcCisgICAgICAgICAgICAgICAgICA4OiJzZWhyIHdlbmlnZSIsIFwKKyAgICAgICAgICAgICAgICAgIDk6ImthdW0iIF0pCisKKyNkZWZpbmUgREVCVUcoeCx5KQorLy8jZGVmaW5lIERFQlVHKHgseSkgaWYgKGZpbmRfcGxheWVyKCJ6b29rIikpIHRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJ6b29rIiksc3ByaW50Zih4LHkpKQorCisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgc2V0ZXVpZChnZXR1aWQoKSk7Cit9CisKK2ludCBRdWVyeUxFUEZvclBsYXllcihvYmplY3QgcGwpCit7CisgIGludCByZXQsIHZhbCwgaSwgbDsKKworICBpZiAoZXh0ZXJuX2NhbGwoKSAmJiAhSVNfQVJDSChnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSkpCisgICAgcmV0dXJuIC0xOworICBpZiAoIXBsIHx8ICFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHBsKSkKKyAgICByZXR1cm4gLTI7CisKKyAgLy8gIEdydW5kb2Zmc2V0IDEwMCwgZGEgbWFuIG1pdCBMZXZlbCAxIHN0YXR0IDAgc3RhcnRldAorICByZXQgPSAxMDA7CisKKyAgLy8gQmVpdHJhZyBBOiBTdHVwc2Ugdm9uIE5QQy1FcnN0a2lsbHMKKyAgcmV0ICs9IChpbnQpU0NPUkVNQVNURVItPlF1ZXJ5S2lsbFBvaW50cyhwbCk7CisKKyAgREVCVUcoIk5hY2ggS1A6IHJldCA9ICVkXG4iLCByZXQpOworCisgIC8vIEJlaXRyYWcgQjogU3R1cHNlIHZvbiBnZWxvZXN0ZW4gTWluaXF1ZXN0cworICByZXQgKz0gKGludClRTS0+UXVlcnlNaW5pUXVlc3RQb2ludHMocGwpOworCisgIERFQlVHKCJOYWNoIE1RUDogcmV0ID0gJWRcbiIsIHJldCk7CisKKyAgLy8gQmVpdHJhZyBDOiBRdWVzdHB1bmt0ZQorICAvLyAgd2VyZGVuIDE6MSB1ZWJlcm5vbW1lbjsKKyAgcmV0ICs9IChpbnQpcGwtPlF1ZXJ5UHJvcChQX1FQKTsKKworICBERUJVRygiTmFjaCBRUDogcmV0ID0gJWRcbiIsIHJldCk7CisKKyAgLy8gQmVpdHJhZyBEOiBFcmZhaHJ1bmdzcHVua3RlCisgIC8vICBTdHVwc2UgPSBYUHMgXiAwLjMyCisgIHZhbCA9IChpbnQpcGwtPlF1ZXJ5UHJvcChQX1hQKTsKKworICBpZiAodmFsPDEpIGw9MDsKKyAgZWxzZSBsPXRvX2ludChleHAobG9nKHRvX2Zsb2F0KHZhbCkpKjAuMzIpKTsKKworICByZXQgKz0gbDsKKworICBERUJVRygiTmFjaCBYUDogcmV0ID0gJWRcbiIsIHJldCk7CisKKyAgLy8gQmVpdHJhZyBFOiBaYXViZXJ0cmFlbmtlCisgIC8vICBHZWZ1bmRlbmUgVHJhZW5rZSBnZWJlbiA1IExFUAorICAvLyAgRGllIEhlaWx0cmFlbmtlIGdlYmVuIHp1c2FldHpsaWNoIDEwKzIwKzMwKzQwIExFUAorICBpID0gODAgLSAodmFsID0gc2l6ZW9mKChpbnQgKilwbC0+UXVlcnlQcm9wKFBfUE9USU9OUk9PTVMpKSk7CisKKyAgcmV0ICs9IDUqaSArIChbIDA6IDEwMCwgMTogNjAsIDI6IDMwLCAzOiAxMF0pW3ZhbF07CisKKyAgLy8gQmVpdHJhZyBGOiBGb3JzY2hlcnB1bmt0ZQorICAvLyAgUHJvIEZQIGdpYnQgZXMgNiBTdHVmZW5wdW5rdGUKKyAgcmV0ICs9IDYgKiAoaW50KUVQTUFTVEVSLT5RdWVyeUV4cGxvcmF0aW9uUG9pbnRzKHBsKTsKKworICBERUJVRygiTmFjaCBGUDogcmV0ID0gJWRcbiIsIHJldCk7CisKKyAgLy8gQmVpdHJhZyBHOiBHaWxkZW5laW5zdHVmdW5nCisgIC8vICBNYXhpbWFsZSBHaWxkZW5laW5zdHVmdW5nICgxMDAwMCkgZW50c3ByaWNodCB2aWVyIExldmVsbgorICByZXQgKz0gKChpbnQpcGwtPlF1ZXJ5UHJvcChQX0dVSUxEX1JBVElORykpLzI1OworCisgIERFQlVHKCJOYWNoIEdSOiByZXQgPSAlZFxuIiwgcmV0KTsKKworICAvLyBBdXNnYWJlIGdpYnQgZXMgbnVyIGluIDIwZXItU2Nocml0dGVuCisgIHJldCAtPSByZXQlMjA7CisKKyAgcmV0dXJuIChyZXQgPiAxMDApID8gcmV0IDogMTAwOworCit9CisKK25vbWFzayBpbnQgUXVlcnlMRVAoKQoreworICBpZiAoIXByZXZpb3VzX29iamVjdCgpKQorICAgIHJldHVybiAwOworICByZXR1cm4gUXVlcnlMRVBGb3JQbGF5ZXIocHJldmlvdXNfb2JqZWN0KCkpOworfQorCitub21hc2sgaW50IFF1ZXJ5TGV2ZWwoaW50IGxlcCkgeworICBpZiAobGVwPD0wKQorICAgIGxlcD1RdWVyeUxFUCgpOworCisgIGlmIChsZXA8PTApCisgICAgcmV0dXJuIDA7CisKKyNpZmRlZiBfX1BGT0VSS0xfXworICAvLyBub3JtYWxlIExldmVsIGFsbGUgMTAwIExFUAorICBpZiAobGVwID49IDUwMCkKKyAgICByZXR1cm4gbGVwLzEwMCArIDQ7CisgIGVsc2UgeworICAgIC8vIGxldmVsIG1pdCB3ZW5pZ2VyIExFUCBhbSBBbmZhbmcgKDEtOCkKKyAgICAvLyBMZXZlbCBhdXMgZGVyIExPV19MRVZFTF9MRVBfTElTVCByYXVzc3VjaGVuLgorICAgIGludCBsZXYgPSBzaXplb2YoTE9XX0xFVkVMX0xFUF9MSVNUKSAtIDE7CisgICAgZm9yICggOyBsZXYgPj0gMDsgLS1sZXYpIHsKKyAgICAgIGlmIChMT1dfTEVWRUxfTEVQX0xJU1RbbGV2XSA8PSBsZXApCisgICAgICAgIGJyZWFrOyAgLy8gZ2VmdW5kZW4KKyAgICB9CisgICAgcmV0dXJuIGxldisxOworICB9CisjZWxzZQorICByZXR1cm4gbGVwLzEwMDsKKyNlbmRpZiAvLyBfX1BGT0VSS0xfXworICByZXR1cm4gMDsKK30KKworLy8gV2lldmllbGUgTEVQIGZlaGxlbiB6dW0gbmFlY2hzdGVuIExldmVsPworbm9tYXNrIGludCBRdWVyeU5leHRMZXZlbExFUChpbnQgbHZsLCBpbnQgbGVwKSB7CisgIGludCBuZWVkZWQ7CisKKyAgaWYgKFF1ZXJ5TGV2ZWwobGVwKSA+IGx2bCkKKyAgICByZXR1cm4gMDsKKworI2lmZGVmIF9fUEZPRVJLTF9fCisgIGlmIChsdmwgPCBzaXplb2YoTE9XX0xFVkVMX0xFUF9MSVNUKSkKKyAgICBuZWVkZWQgPSBMT1dfTEVWRUxfTEVQX0xJU1RbbHZsXTsKKyAgZWxzZQorICAgIG5lZWRlZCA9IChsdmwtMykgKiAxMDA7IC8vIChsdmwgKyAxIC0gNCkgKiAxMDAKKyNlbHNlCisgIG5lZWRlZCA9IChsdmwrMSkgKiAxMDA7CisjZW5kaWYgLy8gX19QRk9FUktMX18KKworICAvLyBuZWVkZWQgc2luZCBqZXR6dCBkaWUgaW5zZ2VzYW10IGJlbm9ldGlndGVuIExFUC4gVm9yaGFuZGVuZSBhYnppZWhlbi4KKyAgbmVlZGVkIC09IGxlcDsKKyAgLy8gbml4IDwgMCB6dXJ1ZWNrbGllZmVybgorICByZXR1cm4gbWF4KG5lZWRlZCwwKTsKK30KKworc3RyaW5nIFF1ZXJ5Rm9yc2NodW5nKCkKK3sKKyAgaW50IG1heCwgbXksIGF2ZzsKKyAgc3RyaW5nIHJldDsKKworICBpZiAoKG15PShpbnQpRVBNQVNURVItPlF1ZXJ5RXhwbG9yYXRpb25Qb2ludHMoZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKSkpIDwgTUlOX0VQKQorICAgIHJldHVybiAiRHUga2VubnN0IERpY2ggaW0gIk1VRE5BTUUiIHNvIGd1dCB3aWUgZ2FyIG5pY2h0IGF1cy5cbiI7CisKKyAgbXkgKj0gMTAwOworICBtYXggPSBteS8oaW50KUVQTUFTVEVSLT5RdWVyeU1heEVQKCk7CisgIGF2ZyA9IG15LyhpbnQpRVBNQVNURVItPlF1ZXJ5QXZlcmFnZSgpOworCisgIHJldCA9ICJWZXJnbGljaGVuIG1pdCBEZWluZW4gTWl0c3BpZWxlcm4sIGtlbm5zdCBEdSBEaWNoIGltICJNVUROQU1FIiAiOworICBzd2l0Y2goYXZnKSB7CisgIGNhc2UgMC4uMTA6CisgICAgcmV0ICs9ICJrYXVtIjsKKyAgICBicmVhazsKKyAgY2FzZSAxMS4uNDA6CisgICAgcmV0ICs9ICJhZXVzc2Vyc3Qgc2NobGVjaHQiOworICAgIGJyZWFrOworICBjYXNlIDQxLi41NjoKKyAgICByZXQgKz0gInNlaHIgc2NobGVjaHQiOworICAgIGJyZWFrOworICBjYXNlIDU3Li43MjoKKyAgICByZXQgKz0gInNjaGxlY2h0IjsKKyAgICBicmVhazsKKyAgY2FzZSA3My4uOTM6CisgICAgcmV0ICs9ICJ1bnRlcmR1cmNoc2Nobml0dGxpY2giOworICAgIGJyZWFrOworICBjYXNlIDk0Li4xMDk6CisgICAgcmV0ICs9ICJkdXJjaHNjaG5pdHRsaWNoIGd1dCI7CisgICAgYnJlYWs7CisgIGNhc2UgMTEwLi4xMjU6CisgICAgcmV0ICs9ICJiZXNzZXIgYWxzIGRlciBEdXJjaHNjaG5pdHQiOworICAgIGJyZWFrOworICBjYXNlIDEyNi4uMTQ1OgorICAgIHJldCArPSAicmVjaHQgZ3V0IjsKKyAgICBicmVhazsKKyAgY2FzZSAxNDYuLjE3MDoKKyAgICByZXQgKz0gInppZW1saWNoIGd1dCI7CisgICAgYnJlYWs7CisgIGNhc2UgMTcxLi4yMTA6CisgICAgcmV0ICs9ICJndXQiOworICAgIGJyZWFrOworICBjYXNlIDIxMS4uMzAwOgorICAgIHJldCArPSAic2VociBndXQiOworICAgIGJyZWFrOworICBjYXNlIDMwMS4uNDAwOgorICAgIHJldCArPSAiYXVzc2Vyb3JkZW50bGljaCBndXQiOworICAgIGJyZWFrOworICBjYXNlIDQwMS4uNTAwOgorICAgIHJldCArPSAidW5oZWltbGljaCBndXQiOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIHJldCArPSAiZWluZmFjaCBoZXJ2b3JyYWdlbmQiOworICAgIGJyZWFrOworICB9CisgIHJldCArPSAiIGF1cy5cbkFic29sdXQgZ2VzZWhlbiAiOworCisgIHN3aXRjaChtYXgpIHsKKyAgY2FzZSAwLi41OgorICAgIHJldCArPSAia2VubnN0IER1IG51ciB3ZW5pZyB2b20gIk1VRE5BTUUiLiI7CisgICAgYnJlYWs7CisgIGNhc2UgNi4uMTA6CisgICAgcmV0ICs9ICJzb2xsdGVzdCBEdSBEaWNoIHZpZWxsZWljaHQgbm9jaCBnZW5hdWVyIHVtc2VoZW4uIjsKKyAgICBicmVhazsKKyAgY2FzZSAxMS4uMTc6CisgICAgcmV0ICs9ICJiaXN0IER1IGR1cmNoYXVzIHNjaG9uIGhlcnVtZ2Vrb21tZW4uIjsKKyAgICBicmVhazsKKyAgY2FzZSAxOC4uMjU6CisgICAgcmV0ICs9ICJoYXN0IER1IHNjaG9uIGVpbmlnZXMgZ2VzZWhlbi4iOworICAgIGJyZWFrOworICBjYXNlIDI2Li4zNToKKyAgICByZXQgKz0gImJpc3QgRHUgc2Nob24gd2VpdCBoZXJ1bWdla29tbWVuLiI7CisgICAgYnJlYWs7CisgIGNhc2UgMzYuLjUwOgorICAgIHJldCArPSAia29lbm50ZXN0IER1IGVpZ2VudGxpY2ggZWluZW4gUmVpc2VmdWVocmVyIGhlcmF1c2JyaW5nZW4uIjsKKyAgICBicmVhazsKKyAgY2FzZSA1MS4uNzU6CisgICAgcmV0ICs9ICJoYXN0IER1IHNjaG9uIHNlaHIgdmllbCBnZXNlaGVuLiI7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgcmV0ICs9ICJiZXNpdHp0IER1IGVpbmUgaGVydm9ycmFnZW5kZSBPcnRza2VubnRuaXMuIjsKKyAgfQorICByZXR1cm4gYnJlYWtfc3RyaW5nKHJldCwgNzgsIDAsIDEpOworfQorCisKK25vbWFzayBtaXhlZCBRdWVyeVdpemFyZFJlcXVpcmVtZW50cyhvYmplY3QgcGxheWVyKQoreworICAvLyBEaWVzZSBGdW5rdGlvbiBnaWJ0IGVpbiAyLWVsZW1lbnRpZ2VzIEFycmF5IHp1cnVlY2ssIGluIGRlbSBpbSBlcnN0ZW4KKyAgLy8gRWxlbWVudCBzdGVodCwgb2IgZGVyIFNwaWVsZXIgU2VoZXIgd2VyZGVuIGthbm4gKDEpIG9kZXIKKyAgLy8gbmljaHQgKDApIHVuZCBpbSB6d2VpdGVuIEVsZW1lbnQgc3RlaHQsIHdhcyBnZW5hdSBpaG0gbm9jaCAKKyAgLy8gZmVobHQuIAorICAvLyBGZWhsZXJjb2RlIGlzdCAoey0xLCAiIn0pCisKKyAgLy8gRGllIFVtcmVjaG51bmdzZmFrdG9yZW4gd3VyZGVuIGVpbmZhY2ggYXVzIFF1ZXJ5TEVQIHVlYmVybm9tbWVuOyBnZ2YuCisgIC8vIGthbm4gbWFuIGRhcyBlaW5tYWwgaW4gVW50ZXJmdW5rdGlvbmVuIGF1c2xhZ2Vybi4gCisKKyAgbWl4ZWQgcmV0OworICBzdHJpbmcgczsgCisgIGludCBpLHosdmFsOyAKKworICByZXQgPSAoey0xLCAiSGllciBpc3QgZXR3YXMgc2NoaWVmIGdlbGF1ZmVuLiBCaXR0ZSBlaW5lbiBFcnptYWdpZXJcbiIKKwkgICAgKyJiZW5hY2hyaWNodGlnZW4uXG4ifSk7CisgIHMgPSAiIjsKKyAgaSA9IDA7IAorCisgIGlmKCFwbGF5ZXIgfHwgIW9iamVjdHAocGxheWVyKSkKKyAgICBwbGF5ZXI9KHRoaXNfcGxheWVyKCk/dGhpc19wbGF5ZXIoKTp0aGlzX2ludGVyYWN0aXZlKCkpOworCisgIGlmKCFwbGF5ZXIpCisgICAgcmV0dXJuICh7LTEsIiJ9KTsKKworICBERUJVRygiRXMgZ2VodCB1bTogJU9cbiIsIHBsYXllcik7CisKKyAgLy8gQWJlbnRldWVycHVua3RlCisgIERFQlVHKCJBYmVudGV1ZXJwdW5rdGU6ICVkICgiK1JFUV9RUCsiKVxuIiwgcGxheWVyLT5RdWVyeVByb3AoUF9RUCkpOworICBpZiAocGxheWVyLT5RdWVyeVByb3AoUF9RUCkgPCBSRVFfUVApIHsKKyAgICBzICs9IHNwcmludGYoIiAqIERpciBmZWhsZW4gbm9jaCBtaW5kZXN0ZW5zICVkIEFiZW50ZXVlcnB1bmt0ZS5cbiIsIAorCQkgUkVRX1FQIC0gKGludClwbGF5ZXItPlF1ZXJ5UHJvcChQX1FQKSk7CisgICAgaS0tOworICB9CisKKyAgLy8gRm9yc2NoZXJwdW5rdGUKKyAgeiA9IDYgKiAoaW50KUVQTUFTVEVSLT5RdWVyeUV4cGxvcmF0aW9uUG9pbnRzKHBsYXllcik7CisgIERFQlVHKCJGb3JzY2hlcnB1bmt0ZTogJWQgKCIrUkVRX0VQKyIpXG4iLCB6KTsKKyAgaWYgKHogPCBSRVFfRVApIHsKKyAgICBzICs9IHNwcmludGYoIiAqIER1IGtlbm5zdCBEaWNoIGltICJNVUROQU1FIiBub2NoIG5pY2h0IGdlbnVnIGF1cywgIgorCQkgKyJnZW5hdSBnZW5vbW1lblxuICAgbXVzc3QgRHUgRGlyIG5vY2ggJXMgYW5zZWhlbi5cbiIsIAorCQkgUkVRX1RFWFQxWyh6KjEwL1JFUV9FUCldICk7CisgICAgaS0tOworICB9CisKKyAgLy8gWmF1YmVydHJhZW5rZQorICB6ID0gODAgLSAodmFsID0gc2l6ZW9mKChpbnQqKXBsYXllci0+UXVlcnlQcm9wKFBfUE9USU9OUk9PTVMpKSk7CisgIHogPSB6KjUgKyAoWzA6MTAwLCAxOjYwLCAyOjMwLCAzOjEwXSlbdmFsXTsKKyAgREVCVUcoIlphdWJlcnRyYWVua2U6ICVkICgiK1JFUV9QKyIpXG4iLCB6KTsKKyAgaWYgKHogPCBSRVFfUCkgeworICAgIHMgKz0gc3ByaW50ZigiICogRHUgbXVzc3Qgbm9jaCBlaW5pZ2UgWmF1YmVydHJhZW5rZSAoY2EuICVkKSBzdWNoZW4uXG4iLAorCQkgKFJFUV9QIC0geikvNSApOworICAgIGktLTsKKyAgfQorCisgIC8vIEVyc3RraWxscworICB6ID0gKGludClTQ09SRU1BU1RFUi0+UXVlcnlLaWxsUG9pbnRzKHBsYXllcik7CisgIERFQlVHKCJFcnN0a2lsbHM6ICVkICgiK1JFUV9LKyIpXG4iLCB6KTsKKyAgaWYgKHogPCBSRVFfSykgeworICAgICAgICBzICs9IHNwcmludGYoIiAqIER1IGhhc3Qgbm9jaCBuaWNodCBnZW51ZWdlbmQgd3VlcmRpZ2UgR2VnbmVyIGVybGVndCwgZ2VuYXUgIgorICAgIAkgKyJnZW5vbW1lblxuICAgbXVzc3QgRHUgbm9jaCAlcyB3dWVyZGlnZSBNb25zdGVyIHRvZXRlbi5cbiIsCisgICAgCSBSRVFfVEVYVDJbKHoqMTAvUkVRX0spXSApOzsKKyAgICBpLS07CisgIH0KKworICBpbnQgbWlubGV2ZWwgPSBRdWVyeUxldmVsKFJFUV9MRVApOworCisgIC8vIFJlc3RsaWNoZSBTdHVmZW5wdW5rdGUgCisgIERFQlVHKCJTdHVmZW5wdW5rdGU6ICVkICgiK1JFUV9MRVArIilcbiIsIHBsYXllci0+UXVlcnlQcm9wKFBfTEVQKSk7CisgIGlmICgoaW50KShwbGF5ZXItPlF1ZXJ5UHJvcChQX0xFUCkpIDwgUkVRX0xFUCkgeworICAgIHMgKz0gc3ByaW50ZigiICogRHUgbXVzc3QgbWluZGVzdGVucyAlZCBTdHVmZW5wdW5rdGUsIGVudHNwcmljaHQgU3R1ZmUgJWQsICIKKyAgICAgICAgImVycmVpY2hlbi5cbiIsIFJFUV9MRVAsIG1pbmxldmVsKTsKKyAgICBpLS07CisgIH0KKyAgCisgIC8vIERlbW5hY2ggbWluZGVzdGVucyBSRVEvMTAwLUxldmVsIAorICBERUJVRygiTGV2ZWw6ICVkICgiK1JFUV9MRVAvMTAwKyIpXG4iLCBwbGF5ZXItPlF1ZXJ5UHJvcChQX0xFVkVMKSk7CisgIGlmICgoaW50KXBsYXllci0+UXVlcnlQcm9wKFBfTEVWRUwpIDwgbWlubGV2ZWwpIHsKKyAgICBzICs9IHNwcmludGYoIiAqIER1IG11c3N0IG1pbmRlc3RlbnMgU3R1ZmUgJWQgZXJyZWljaGVuLlxuIiwgbWlubGV2ZWwpOworICAgIGktLTsKKyAgfQorICAKKyAgaWYoaTwwKSB7CisgICAgcmV0ID0gKHstMSwgCisJIHNwcmludGYoIkR1IGhhc3Qgbm9jaCBuaWNodCBhbGxlIFNlaGVyLUFuZm9yZGVydW5nZW4gZXJmdWVsbHQuXG4iCisJCSsiSW0gZWluemVsbmVuIGZlaGx0IERpciBmb2xnZW5kZXM6XG5cbiVzXG4iCisJCSArYnJlYWtfc3RyaW5nKCJGYWxscyBEdSBEaXIgbnVuIGRlbm5vY2ggdW5zaWNoZXIgYmlzdCwgIgorICArIndlbGNoZSBBbmZvcmRlcnVuZ2VuIER1IGVyZnVlbGxlbiBtdXNzdCwgZGFubiAiCisgICsic2NoYXVlIGJlaSAnaGlsZmUgc2VoZXInIHVuZCAnaGlsZmUgc3R1ZmVucHVua3RlJyBkb2NoIGVpbmZhY2ggbm9jaCAiCisgICsiZWlubWFsIG5hY2guIFNpbmQgZGFubiAiCisgICsiaW1tZXIgbm9jaCBEaW5nZSBvZmZlbiBvZGVyIHVua2xhciwgc28gc3ByaWNoIGVpbmZhY2ggZWluZW4gIgorCQkJCSAgKyJkZXIgRXJ6bWFnaWVyIGFuLiIsIDc4LDAsMSkscykgfSk7CisgIH0gCisgICAgCisgIGlmIChpPT0wKSB7CisgICAgcmV0ID0gKHsxLCBicmVha19zdHJpbmcoCisJICAgICAgICJEdSBoYXN0IGFsbGUgU2VoZXItQW5mb3JkZXJ1bmdlbiBlcmZ1ZWxsdC4gV2VuZGUgRGljaCBkb2NoICIKKwkgICAgICAgKyJlaW5tYWwgYW4gTWVybGluIHVuZCBmcmFnZSBpaG4sIG9iIGVyIERpY2ggYmVmb2VyZGVydC4iLCAKKwkgICAgICAgNzgsMCwxKSB9KTsKKyAgfQorCisgIHJldHVybiByZXQ7IAorfQorCitub21hc2sgaW50IFF1ZXJ5UmVhZHlGb3JXaXoob2JqZWN0IHBsYXllcikKK3sKKyAgbWl4ZWQgcjsKKyAgCisgIHIgPSBRdWVyeVdpemFyZFJlcXVpcmVtZW50cyhwbGF5ZXIpOworICAKKyAgaWYgKCFwb2ludGVycChyKSAmJiBzaXplb2YocikhPTIgJiYgIWludHAoclswXSkpCisgICAgcmV0dXJuIC0xOworCisgIHJldHVybiByWzBdOworfQorCitub21hc2sgc3RyaW5nIFF1ZXJ5UmVhZHlGb3JXaXpUZXh0KG9iamVjdCBwbGF5ZXIpCit7CisgIG1peGVkIHI7CisKKyAgciA9IFF1ZXJ5V2l6YXJkUmVxdWlyZW1lbnRzKHBsYXllcik7CisKKyAgaWYgKCFwb2ludGVycChyKSAmJiBzaXplb2YocikhPTIgJiYgIXN0cmluZ3AoclsxXSkpCisgICAgcmV0dXJuICJIaWVyIGlzdCBldHdhcyBzY2hpZWYgZ2VnYW5nZW4sIGJpdHRlIHZlcnN0YWVuZGlnZSBlaW5lbiAiCisgICAgICArIkVyem1hZ2llci4iOworCisgIHJldHVybiByWzFdOworfQorCmRpZmYgLS1naXQgYS9zZWN1cmUvbGVwbWFzdGVyLmggYi9zZWN1cmUvbGVwbWFzdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFlNzI0NwotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9sZXBtYXN0ZXIuaApAQCAtMCwwICsxLDIyIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gbGVwbWFzdGVyLmggLS0gRGVmaW5pdGlvbmVuIGZ1ZXIgZGVuIGxlcG1hc3RlcgorLy8KKy8vICRJZDogbGVwbWFzdGVyLmgsdiAxLjMgMjAwNi8wMi8yMiAwODo1Nzo0OCBab29rIEV4cCAkCisKKyNpZm5kZWYgX19MRVBNQVNURVJfSF9fCisjZGVmaW5lIF9fTEVQTUFTVEVSX0hfXworCisvKiBEYXRlaW5hbWVuICovCisKKy8vIHRvIGNoYW5nZToKKyNkZWZpbmUgTEVQTUFTVEVSICAgIi9zZWN1cmUvbGVwbWFzdGVyIgorCisvLyBBbmZvcmRlcnVuZ2VuOiAKKyNkZWZpbmUgUkVRX1FQICAxNjEwICAgICAvLyBTdHVwc2UgYXVzIFF1ZXN0cworI2RlZmluZSBSRVFfRVAgICA2MDAgICAgIC8vIFN0dXBzZSBhdXMgRm9yc2NoZXJwdW5rdGVuCisjZGVmaW5lIFJFUV9QICAgIDIwMCAgICAgLy8gU3R1cHNlIGF1cyBaYXViZXJ0cmFlbmtlbgorI2RlZmluZSBSRVFfSyAgICAxNTAgICAgIC8vIFN0dXBzZSBhdXMgRXJzdGtpbGxzCisjZGVmaW5lIFJFUV9MRVAgMzgwMCAgICAgLy8gTWluZGVzdGVucyAzODAwIFN0dXBzZSB1bmQgTHZsLiAzOAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9sb2dpbi5jIGIvc2VjdXJlL2xvZ2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UxNDY0NgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9sb2dpbi5jCkBAIC0wLDAgKzEsMTEzOCBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGxvZ2luLmMgLS0gT2JqZWN0IGZvciBwbGF5ZXJzIGp1c3QgbG9nZ2luZyBpbgorLy8KKy8vICRJZDogbG9naW4uYyA5MjQ1IDIwMTUtMDYtMDQgMTM6MDQ6MzlaIEFyYXRob3JuICQKKworIC8qCisgKiBzZWN1cmUvbG9naW4uYworICoKKyAqIFRoaXMgb2JqZWN0IGlzIGNsb25lZCBmb3IgZXZlcnkgdXNlciB0cnlpbmcgdG8gbG9nIGluCisgKiBXZSBhcmUgc3RpbGwgcnVubmluZyByb290LgorICoKKyAqIGxvZ2luLmMgbG9va3MgdXAgdGhlIHVzZXJuYW1lIGluIHRoZSBzZWN1cmUvUEFTU1dEIGZpbGUuIElmIGl0IGlzCisgKiBmb3VuZCwgdGhlIHBhc3N3b3JkIGlzIGNoZWNrZWQuIElmIHRoZSB1c2VyIGlzIGFscmVhZHkgbG9nZ2VkIGluLAorICogaGUgd2lsbCBiZSByZWNvbm5lY3RlZCB0byB0aGUgcnVubmluZyBvYmplY3QuIElmIHRoZSBvdGhlciBvYmplY3QKKyAqIGlzIHN0aWxsIGludGVyYWN0aXZlLCB0aGF0IHdpbGwgYmUgZGlzY29ubmVjdGVkIGJlZm9yZSB0aGUgdXNlciBpcworICogcmVjb25uZWN0ZWQgdG8gdGhhdCBvYmplY3QuCisgKgorICogSWYgdGhlIHVzZXIgaXMgbm90IGluIFBBU1NXRCwgYSBuZXcgZW50cnkgd2l0aCBsZXZlbCAwIGlzIGNyZWF0ZWQuCisgKiBBbGwgUEFTU1dEIHdyaXRpbmcgaXMgZG9uZSBpbiBzZWN1cmUvbWFzdGVyLmMuCisgKgorICovCisjcHJhZ21hIHN0cmljdF90eXBlcworI3ByYWdtYSBub19zaGFkb3cKKyNwcmFnbWEgbm9faW5oZXJpdAorI3ByYWdtYSB2ZXJib3NlX2Vycm9ycworI3ByYWdtYSBjb21iaW5lX3N0cmluZ3MKKy8vI3ByYWdtYSBwZWRhbnRpYworLy8jcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIHdhcm5fZGVwcmVjYXRlZAorCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgIi9zZWN1cmUvd2l6bGV2ZWxzLmgiCisjaW5jbHVkZSA8dGVsbmV0Lmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPGlucHV0X3RvLmg+CisKK2luaGVyaXQgIi9zZWN1cmUvbWluaV9wcm9wcy5jIjsKK2luaGVyaXQgIi9zZWN1cmUvdGVsbmV0bmVnLmMiOworCisjZGVmaW5lIFNTTF9HUlJFVElORyAiUkVNT1RFX0hPU1Q9IgorI2RlZmluZSBQUk9YSUVTICh7IjEyNy4wLjAuMSIsIjg3Ljc5LjI0LjYwIn0pCisjZGVmaW5lIEdVRVNUTUFTVEVSICIvc2VjdXJlL2d1ZXN0bWFzdGVyIgorCisjaWZuZGVmIERFQlVHCisjZGVmaW5lIERFQlVHKHgpIGlmKGZpbmRfcGxheWVyKCJ0aWFtYWsiKSkgdGVsbF9vYmplY3QoZmluZF9wbGF5ZXIoInRpYW1hayIpLHgpCisjZGVmaW5lIERFQlVHTSh4KSBpZihmaW5kX3BsYXllcigibXVhZGliIikpIHRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJtdWFkaWIiKSx4KQorI2VuZGlmCisKKy8qIFZhcmlhYmxlcyBvZiB0aGUgc2VjdXJlIHNhdmUgZmlsZSAqLworaW50IGxldmVsLCBsb2dpbmZhaWxzLCBjcmVhdGlvbl9kYXRlOworc3RyaW5nIHBhc3N3b3JkLCBuYW1lLCBzaGVsbCwgZXAsIGVrLCBtcTsKK3N0cmluZyBla3RpcHM7CitzdHJpbmcgZnB0aXBzOworc3RyaW5nICpkb21haW5zLCAqZ3VpbGRzLCAqdWlkc3RvdGFrZWNhcmU7CisKK3N0YXRpYyBpbnQgaW52aXMsIG5ldTsKK3N0YXRpYyBzdHJpbmcgbG9naW5uYW1lOworc3RhdGljIHN0cmluZyBjYXBfbmFtZTsKK3N0YXRpYyBzdHJpbmcgKnVzZXJlbnRyeTsKK3N0YXRpYyBzdHJpbmcgYmFuaXNoOworc3RhdGljIG1peGVkICpyYWNlczsKK3N0YXRpYyBpbnQgbmV3YmllOworc3RhdGljIHN0cmluZyByZWFsaXA7CisKKy8vIFByb3RvdHlwZXMKK3N0YXRpYyB2b2lkIFNlbmRUZWxvcHRzKCk7CitwdWJsaWMgbm9tYXNrIHN0cmluZyBsb2dpbm5hbWUoKTsKKy8vIHRoZSBmb2xsb3dpbmcgNCBsZnVucyBkZWFsIHdpdGggcmVhbCBsb2dpbnMKK3B1YmxpYyBub21hc2sgaW50IGxvZ29uKCk7CitzdGF0aWMgaW50IGxvZ29uMiggc3RyaW5nIHN0ciApOworc3RhdGljIGludCBsb2FkX3BsYXllcl9vYmplY3QoIGludCBndWVzdGZsYWcgKTsKK3N0YXRpYyB2b2lkIGxvYWRfcGxheWVyX29iXzIoIHN0cmluZyBvYm5hbWUsIGludCBndWVzdGZsYWcgKTsKK3N0YXRpYyBpbnQgY2hlY2tfaWxsZWdhbCggc3RyaW5nIHN0ciApOworc3RhdGljIGludCB2YWxpZF9uYW1lKCBzdHJpbmcgc3RyICk7CitzdGF0aWMgaW50IG5ld19wYXNzd29yZCggc3RyaW5nIHN0ciApOworc3RhdGljIGludCBhZ2Fpbl9wYXNzd29yZCggc3RyaW5nIHN0ciApOworc3RhdGljIGludCBjaGVja19wYXNzd29yZCggc3RyaW5nIHN0ciApOworc3RhdGljIHZvaWQgc2VsZWN0X3JhY2UoKTsKK3N0YXRpYyB2b2lkIGFza19yYWNlX3F1ZXN0aW9uKCk7CitzdGF0aWMgdm9pZCBnZXRfcmFjZV9hbnN3ZXIoIHN0cmluZyBzdHIgKTsKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCk7CitwdWJsaWMgc3RyaW5nIHNob3J0KCk7CitwdWJsaWMgc3RyaW5nIHF1ZXJ5X3JlYWxfbmFtZSgpOworcHVibGljIG5vbWFzayBpbnQgcXVlcnlfcHJldmVudF9zaGFkb3coKTsKK3N0YXRpYyB2b2lkIHRpbWVfb3V0KCk7CitwdWJsaWMgaW50IHJlbW92ZSgpOworLy8gdGhlIGZvbGxvd2luZyAzIGxmdW5zIGRlYWwgd2l0aCBkdW1teSBwbGF5ZXIgY3JlYXRpb24KK3B1YmxpYyBtaXhlZCBuZXdfbG9nb24oIHN0cmluZyBzdHIpOworc3RhdGljIG1peGVkIG5ld19sb2FkX3BsYXllcl9vYmplY3QoKTsKK3N0YXRpYyBtaXhlZCBuZXdfbG9hZF9wbGF5ZXJfb2JfMiggc3RyaW5nIG9ibmFtZSApOworc3RhdGljIHZvaWQgYXNrX211ZF9wbGF5ZWRfcXVlc3Rpb24oKTsKK3N0YXRpYyB2b2lkIGdldF9tdWRfcGxheWVkX2Fuc3dlcihzdHJpbmcgc3RyKTsKKworCitwdWJsaWMgbm9tYXNrIHN0cmluZyBsb2dpbm5hbWUoKQoreworICAgIHJldHVybiBsb2dpbm5hbWUgPyBsb2dpbm5hbWUgOiAiIjsKK30KKworCitwdWJsaWMgaW50IHJlbW92ZSgpCit7CisgICAgZGVzdHJ1Y3QoIHRoaXNfb2JqZWN0KCkgKTsKKyAgICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IGNoZWNrX3Rvb19tYW55X2xvZ29ucygpCit7CisgICAgb2JqZWN0ICp1OworICAgIHN0cmluZyBpcDsKKworICAgIGlwID0gcXVlcnlfaXBfbnVtYmVyKHRoaXNfb2JqZWN0KCkpOworICAgIC8vIHVzZXJzKCkgbmVobWVuLCBmYWxscyBuaWNodC1pbnRlcmFrdGl2ZSBDbG9uZXMgdm9uIGxvZ2luLmMgZXhpc3RpZXJlbi4KKyAgICB1ID0gZmlsdGVyKCB1c2VycygpLCBmdW5jdGlvbiBzdGF0dXMgKG9iamVjdCBvYiwgc3RyaW5nIGFkZHIpIHsKKyAgICAgICAgcmV0dXJuIG9iamVjdF9uYW1lKG9iKSA9PSAiL3NlY3VyZS9sb2dpbiIKKyAgICAgICAgICAgICAgICYmIHF1ZXJ5X2lwX251bWJlcihvYikgPT0gYWRkcjsKKyAgICB9LCBpcCApOworCisgICAgaWYgKCBzaXplb2YodSkgPiA1ICl7CisgICAgICAgIHdyaXRlKCAiXG5FcyBsYXVmZW4gc2Nob24genUgdmllbGUgQW5tZWxkdW5nZW4gdm9uIERlaW5lciBBZHJlc3NlICIKKyAgICAgICAgICAgICAgICJhdXMuXG5Qcm9iaWVyIGVzIGJpdHRlIGluIGVpbiBiaXMgendlaSBNaW51dGVuIG5vY2ggIgorICAgICAgICAgICAgICAgImVpbm1hbC5cbiIgKTsKKworICAgICAgICBsb2dfZmlsZSggIkxPR0lOX0RFTlkiLCBzcHJpbnRmKCAiJXM6ID41IExvZ29ucyB2b24gJS0xNXMgKCVzKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RpbWUodGltZSgpKVs0Li4xNV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5X2lwX251bWJlcih0aGlzX29iamVjdCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlfaXBfbmFtZSh0aGlzX29iamVjdCgpKSApICk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorCisKKy8qCisgKiBUaGlzIGlzIHRoZSBmdW5jdGlvbiB0aGF0IGdldHMgY2FsbGVkIGJ5IC9zZWN1cmUvbWFzdGVyIGZvciBldmVyeSB1c2VyCisgKi8KK3B1YmxpYyBub21hc2sgaW50IGxvZ29uKCkKK3sKKyAgICBsb2dpbm5hbWUgPSAibG9nb24iOworICAgIG5ld2JpZT0wOworICAgIHJlYWxpcD0iIjsKKworICAgIC8vIGFscyBlcnN0ZXMgd2lyZCBlaW4gTG9va3VwIGdlbWFjaHQsIG9iIGRpZSBRdWVsbGFkcmVzc2UgZWluCisgICAgLy8gVG9yLUV4aXRub2RlIGlzdCwgZGVyIGVybGF1YnQsIHp1IHVucyB6dSBrb21tdW5pemllcmVuLiBEYXMgTG9va3VwIGlzdAorICAgIC8vIGFzeW5jaHJvbiB1bmQgYnJhdWNodCBlaW5lIFdlaWxlLCB3ZW5uIGRhcyBFcmdlYm5pcyBub2NoIG5pY2h0IGdlY2FjaHQKKyAgICAvLyBpc3QuIEFuIGRpZXNlciBTdGVsbGUgd2lyZCBkYXMgRXJnZWJuaXMgbmljaHQgYXVzZ2V3ZXJ0ZXQuIEFjaGphLCB3aWUKKyAgICAvLyBtYWNoZW4gZGFzIG5hdHVlcmxpY2ggbmljaHQgZnVlciBkaWUgSVAgdm9tIE11ZHJlY2huZXIuLi4KKyAgICBpZiAocXVlcnlfaXBfbnVtYmVyKHRoaXNfb2JqZWN0KCkpICE9ICI4Ny43OS4yNC42MCIpCisgICAgeworICAgICAgIi9wL2RhZW1vbi9kbnNsb29rdXAiLT5jaGVja190b3IocXVlcnlfaXBfbnVtYmVyKHRoaXNfb2JqZWN0KCkpLHF1ZXJ5X211ZF9wb3J0KCkpOworICAgICAgIi9wL2RhZW1vbi9kbnNsb29rdXAiLT5jaGVja19kbnNibChxdWVyeV9pcF9udW1iZXIodGhpc19vYmplY3QoKSkpOworICAgIH0KKyAgICBwcmludGYoIkhUVFAvMS4wIDMwMiBGb3VuZFxuIgorICAgICAgICAgIkxvY2F0aW9uOiBodHRwOi8vbWcubXVkLmRlL1xuXG4iCisgICAgICAgICAiTmV0Q29sb2duZSwgS29lbG4sIEdlcm1hbnkuIExvY2FsIHRpbWU6ICVzXG5cbiIKKyAgICAgICAgIE1VRE5BTUUiIExEbXVkLCBOQVRJVkUgbW9kZSwgZHJpdmVyIHZlcnNpb24gJXNcblxuIiwKKyAgICAgICAgIHN0cmZ0aW1lKCIlYyIpLCBfX1ZFUlNJT05fXyk7CisKKyAgICBTZW5kVGVsb3B0cygpOworCisgICAgaWYgKCBjaGVja190b29fbWFueV9sb2dvbnMoKSApeworICAgICAgICBkZXN0cnVjdCh0aGlzX29iamVjdCgpKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gaXN0IGRpZSBWZXJiaW5kdW5nIHNjaG9uIHdpZWRlciB3ZWc/CisgICAgaWYgKG9iamVjdHAodGhpc19vYmplY3QoKSkgJiYgaW50ZXJhY3RpdmUodGhpc19vYmplY3QoKSkpIHsKKyAgICAgIGNhdCggIi9ldGMvV0VMQ09NRSIgKTsKKyAgICB9CisKKyAgICBpbnB1dF90byggImxvZ29uMiIsIElOUFVUX1BST01QVCwKKyAgICAgICAgIldpZSBoZWlzc3QgRHUgZGVubiAoXCJuZXVcIiBmdWVyIG5ldWVuIFNwaWVsZXIpPyAiKTsKKyAgICBjYWxsX291dCggInRpbWVfb3V0IiwgMzAwICk7CisgICAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBjaGVja190b29fbWFueV9mcm9tX3NhbWVfaXAoKQoreworICAgIG9iamVjdCAqdTsKKyAgICBzdHJpbmcgaXA7CisKKyAgICBpcCA9IHF1ZXJ5X2lwX251bWJlcih0aGlzX29iamVjdCgpKTsKKyAgICB1ID0gZmlsdGVyKHVzZXJzKCksIGZ1bmN0aW9uIHN0YXR1cyAob2JqZWN0IG9iLCBzdHJpbmcgYWRkciwgaW50IGEpIHsKKyAgICAgICAgcmV0dXJuIHF1ZXJ5X2lwX251bWJlcihvYikgPT0gYWRkcgorICAgICAgICAgICAgICAgJiYgb2ItPlF1ZXJ5UHJvcChQX0FHRSkgPCBhOworICAgIH0sIGlwLCAxMio2MCo2MCk7IC8vIDI0aCBpbiBoZWFydF9iZWF0cworCisgICAgaWYgKCBzaXplb2YodSkgPiAyNSApeworICAgICAgICB3cml0ZSggIlxuRGEgYW5zY2hlaW5lbmQgZ2VyYWRlIGplbWFuZCB2b24gRGVpbmVyIEFkcmVzc2UgYXVzICIKKyAgICAgICAgICAgICAgICJ2ZXJzdWNodCwgZGFzIFxuIk1VRE5BTUUiIG1pdCBuZXVlbiBDaGFyYWt0ZXJlbiB6dSAiCisgICAgICAgICAgICAgICAidWViZXJzY2h3ZW1tZW4sIHdlcmRlbiBtb21lbnRhbiBcbm51ciBhZWx0ZXJlIENoYXJha3RlcmUgIgorICAgICAgICAgICAgICAgInZvbiBkaWVzZXIgQWRyZXNzZSB6dWdlbGFzc2VuLlxuV2VubiBEdSBtZWluc3QsIGRhc3MgZXMgIgorICAgICAgICAgICAgICAgInNpY2ggdW0gZWluZW4gRmVobGVyIGhhbmRlbHQsIGxvZ2cgRGljaCBiaXR0ZSBhbHMgXG4iCisgICAgICAgICAgICAgICAiR2FzdCBlaW4gdW5kIHNwcmljaCBlaW5lbiBFcnptYWdpZXIgb2RlciBHb3R0IGFuLlxuIiApOworICAgICAgICAKKyAgICAgICAgbG9nX2ZpbGUoICJMT0dJTl9ERU5ZIiwgc3ByaW50ZiggIiVzOiA+MTAgU3BpZWxlciB2b24gJS0xNXMgKCVzKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RpbWUodGltZSgpKVs0Li4xNV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5X2lwX251bWJlcih0aGlzX29iamVjdCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlfaXBfbmFtZSh0aGlzX29iamVjdCgpKSApICk7CisgICAgICAgIAorICAgICAgICBkZXN0cnVjdCh0aGlzX29iamVjdCgpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBjaGVja19pbGxlZ2FsKCBzdHJpbmcgc3RyICkKK3sKKyAgICBzdHJpbmcgcmVzOworCisgICAgcmVzID0gKHN0cmluZyltYXN0ZXIoKS0+UXVlcnlTQmFuaXNoZWQocXVlcnlfaXBfbnVtYmVyKHRoaXNfb2JqZWN0KCkpKTsKKyAgICBpZiAoIXJlcykKKyAgICB7CisgICAgICAvLyBjaGVjayBjb25uZWN0aW9uIGZyb20gVG9yIGV4aXQgbm9kZQorICAgICAgc3RyaW5nIGVmZl9pcCA9IChyZWFsaXAhPSIiID8gcmVhbGlwIDogcXVlcnlfaXBfbnVtYmVyKHRoaXNfb2JqZWN0KCkpKTsKKyAgICAgIGlmICgiL3AvZGFlbW9uL2Ruc2xvb2t1cCItPmNoZWNrX3RvcihlZmZfaXAsIHF1ZXJ5X211ZF9wb3J0KCkpCisgICAgICAgICAgfHwgIi9wL2RhZW1vbi9kbnNsb29rdXAiLT5jaGVja19kbnNibChlZmZfaXApKQorICAgICAgICByZXMgPSAKKyAgICAgICAgICAgICJcblNvcnJ5LCB2b24gRGVpbmVyIEFkcmVzc2Uga2FtZW4gZWluIHBhYXIgSWRpb3RlbiwgZGllICIKKyAgICAgICAgICAgICJhdXNzY2hsaWVzc2xpY2hcbkFlcmdlciBtYWNoZW4gd29sbHRlbi4gRGVzaGFsYiBoYWJlbiB3aXIgIgorICAgICAgICAgICAgImRpZSBNb2VnbGljaGtlaXQsXG5laW5mYWNoIG5ldWUgQ2hhcmFrdGVyZSAiCisgICAgICAgICAgICAiYW56dWxlZ2VuLCBmdWVyIGRpZXNlIEFkcmVzc2UgZ2VzcGVycnQuXG5cbiIKKyAgICAgICAgICAgICJGYWxscyBEdSBiZWkgdW5zIHNwaWVsZW4gbW9lY2h0ZXN0LCBzY2hpY2tlIGJpdHRlIGVpbmUgRW1haWwgIgorICAgICAgICAgICAgImFuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICBtdWRAbWcubXVkLmRlXG5cbiIKKyAgICAgICAgICAgICJtaXQgZGVyIEJpdHRlLCBlaW5lbiBDaGFyYWt0ZXIgZnVlciBEaWNoIGFuenVsZWdlbi5cbiIgOworICAgIH0KKworICAgIGlmICggcmVzICkKKyAgICB7CisgICAgICAgIHdyaXRlKCByZXMgKTsKKyAgICAgICAgbG9nX2ZpbGUoICJMT0dJTl9ERU5ZIiwgc3ByaW50ZiggIiVzOiAlLTExcyAlLTE1cyAoJXMpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdGltZSh0aW1lKCkpWzQuLjE1XSwgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeV9pcF9udW1iZXIodGhpc19vYmplY3QoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5X2lwX25hbWUodGhpc19vYmplY3QoKSkgKSApOworICAgICAgICByZW1vdmUoKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIENoZWNrIHRoYXQgYSBwbGF5ZXIgbmFtZSBpcyB2YWxpZC4gT25seSBhbGxvdworICogbG93ZXJjYXNlIGxldHRlcnMuCisgKi8KK3N0YXRpYyBpbnQgdmFsaWRfbmFtZSggc3RyaW5nIHN0ciApCit7CisgICAgaW50IGk7CisKKyAgICBpZiAoIHN0ciA9PSAibG9nb24iICl7CisgICAgICAgIHdyaXRlKCAiRGVyIE5hbWUgd3VlcmRlIG51ciBWZXJ3aXJydW5nIHN0aWZ0ZW4uXG4iICk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGkgPSBzaXplb2Yoc3RyKTsKKworICAgIGlmICggaSA+IDExICl7CisgICAgICAgIHdyaXRlKCAiRGVpbiBOYW1lIGlzdCB6dSBsYW5nLCBuaW1tIGJpdHRlIGVpbmVuIGFuZGVyZW4uXG4iICk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGZvciAoIDsgaS0tOyApCisgICAgICAgIGlmICggc3RyW2ldIDwgJ2EnIHx8IHN0cltpXSA+ICd6JyApIHsKKyAgICAgICAgICAgIHdyaXRlKCAiVW5lcmxhdWJ0ZXMgWmVpY2hlbiAnIiArIHN0cltpLi5pXSArICInIGltIE5hbWVuOiAiICsgc3RyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXG4iICk7CisgICAgICAgICAgICB3cml0ZSggIkJlbnV0emUgYml0dGUgbnVyIEJ1Y2hzdGFiZW4gb2huZSBVbWxhdXRlLlxuIiApOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgbG9nb24yKCBzdHJpbmcgc3RyICkKK3sKKyAgICBpbnQgaSwgYXJnOworICAgIG1peGVkIHR4dDsKKworICAgIGlmICggIXN0ciB8fCBzdHIgPT0gIiIgKXsKKyAgICAgICAgd3JpdGUoICJBYmJydWNoIVxuIiApOworICAgICAgICBkZXN0cnVjdCggdGhpc19vYmplY3QoKSApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBVbnRlcnN0dWV0enVuZyBmdWVyIGRhcyBNdWQgU2VydmVyIFN0YXR1cyBQcm90b2NvbAorICAgIC8vIChodHRwOi8vdGludGluLnNvdXJjZWZvcmdlLm5ldC9tc3NwLykKKyNpZmRlZiBNU1NQX1NVUFBPUlQKKyAgICBpZiAoc3RyID09ICJNU1NQLVJFUVVFU1QiKSB7CisgICAgICAiL3NlY3VyZS9taXNjL21zc3AiLT5wcmludF9tc3NwX3Jlc3BvbnNlKCk7CisgICAgICBsb2dfZmlsZSggIk1TU1AubG9nIiwgc3ByaW50ZiggIiVzOiAlLTE1cyAoJXMpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJmdGltZSgiJWMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlfaXBfbnVtYmVyKHRoaXNfb2JqZWN0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeV9pcF9uYW1lKHRoaXNfb2JqZWN0KCkpfHwiTi9BIiApICk7CisgICAgICBpbnB1dF90bygibG9nb24yIiwgSU5QVVRfUFJPTVBULAorICAgICAgICAgICJXaWUgaGVpc3N0IER1IGRlbm4gKFwibmV1XCIgZnVlciBuZXVlbiBTcGllbGVyKT8gIik7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisjZW5kaWYKKworICAgIGlmKHN0cnN0cihzdHIsU1NMX0dSUkVUSU5HKT09MCkKKyAgICB7CisgICAgICBpZiggbWVtYmVyKFBST1hJRVMscXVlcnlfaXBfbnVtYmVyKHRoaXNfb2JqZWN0KCkpKT4tMSApCisgICAgICB7CisgICAgICAgIHJlYWxpcD1zdHJbc2l6ZW9mKFNTTF9HUlJFVElORykuLl07CisgICAgICB9IC8vIGFuZGVyZSBJUHMgd2VyZGVuIGVpbmZhY2ggaWdub3JpZXJ0LiAtPiBsb2cvUFJPWFkuUkVRID8KKyAgICAgIC8vIGdnZi4gTG9va3VwIGZ1ZXIgVG9yZXhpdHMgYW5zdG9zc2VuLgorICAgICAgIi9wL2RhZW1vbi9kbnNsb29rdXAiLT5jaGVja190b3IocmVhbGlwLHF1ZXJ5X211ZF9wb3J0KCkpOworICAgICAgIi9wL2RhZW1vbi9kbnNsb29rdXAiLT5jaGVja19kbnNibChyZWFsaXApOworCisgICAgICBpbnB1dF90byggImxvZ29uMiIsIElOUFVUX1BST01QVCwKKyAgICAgICAgICAiV2llIGhlaXNzdCBEdSBkZW5uIChcIm5ldVwiIGZ1ZXIgbmV1ZW4gU3BpZWxlcik/ICIpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIAorICAgIGlmICggbG9naW5uYW1lICE9ICJsb2dvbiIgKSB7CisgICAgICAgIGxvZ19maWxlKCAiSUxMRUdBTCIsIHNwcmludGYoICIlcyBJbGxlZ2FsIHBhdGNoIG9mIGxvZ2luOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2dpbm5hbWUgPSAlT1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHRpbWUodGltZSgpKSwgbG9naW5uYW1lICkgKTsKKyAgICAgICAgZGVzdHJ1Y3QoIHRoaXNfb2JqZWN0KCkgKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgc3RyID0gbG93ZXJfY2FzZShzdHIpOworICAgIGNhcF9uYW1lID0gY2FwaXRhbGl6ZShzdHIpOworCisgICAgaWYgKCBzdHIgPT0gIm5ldSIgJiYgIW5ldSApeworICAgICAgICBjYXQoICIvZXRjL1dFTENPTUVfTkVXIiApOworICAgICAgICBuZXUgPSAxOworICAgICAgICBpbnB1dF90byggImxvZ29uMiIsIElOUFVUX1BST01QVCwgIk5hbWU6ICIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAoICF2YWxpZF9uYW1lKHN0cikgKXsKKyAgICAgICAgc3RyaW5nIHByOworICAgICAgICBpZiAoICFuZXUgKQorICAgICAgICAgICAgcHI9ICJXaWUgaGVpc3N0IER1IGRlbm4gKFwibmV1XCIgZnVlciBuZXVlbiBTcGllbGVyKT8gIjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHI9ICJCaXR0ZSBnaWIgRGlyIGVpbmVuIGFuZGVyZW4gTmFtZW46ICI7CisKKyAgICAgICAgaW5wdXRfdG8oICJsb2dvbjIiLCBJTlBVVF9QUk9NUFQsIHByICk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGlmICggc3NjYW5mKCBzdHIsICJnYXN0JWQiLCBhcmcgKSA9PSAxICl7CisgICAgICAgIHdyaXRlKCAiRHUgbWVpbnN0IHdvaGwgJ0dhc3QnIC4uLlxuIiApOworICAgICAgICBzdHIgPSAiZ2FzdCI7CisgICAgfQorCisgICAgbG9naW5uYW1lID0gc3RyOworCisgICAgLyogcmVhZCB0aGUgc2VjdXJlIHNhdmUgZmlsZSB0byBzZWUgaWYgY2hhcmFjdGVyIGFscmVhZHkgZXhpc3RzICovCisgICAgaWYgKCBsb2dpbm5hbWUgIT0gImdhc3QiICYmCisgICAgICAgICAhcmVzdG9yZV9vYmplY3QoIG1hc3RlcigpLT5zZWN1cmVfc2F2ZWZpbGUobG9naW5uYW1lKSApICl7CisgICAgICAgIG9iamVjdCAqdXNlcjsKKworICAgICAgICBpZiAoICFuZXUgKQorICAgICAgICB7CisgICAgICAgICAgICB3cml0ZSggIkVzIGV4aXN0aWVydCBrZWluIENoYXJha3RlciBtaXQgZGllc2VtIE5hbWVuLlxuIiApOworICAgICAgICAgICAgd3JpdGUoICJGYWxscyBEdSBlaW5lbiBuZXVlbiBDaGFyYWt0ZXIgZXJzY2hhZmZlbiBtb2VjaHRlc3QsICIKKyAgICAgICAgICAgICAgICAgICAidGlwcGUgYml0dGUgXCJuZXVcIiBlaW4uXG4iICk7CisKKyAgICAgICAgICAgIGxvZ2lubmFtZSA9ICJsb2dvbiI7CisgICAgICAgICAgICBpbnB1dF90byggImxvZ29uMiIsIElOUFVUX1BST01QVCwKKyAgICAgICAgICAgICAgICAiV2llIGhlaXNzdCBEdSBkZW5uIChcIm5ldVwiIGZ1ZXIgbmV1ZW4gU3BpZWxlcik/ICIpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKCBpID0gc2l6ZW9mKHVzZXIgPSB1c2VycygpIC0gKHsgMCwgdGhpc19vYmplY3QoKSB9KSk7IGktLTsgKQorICAgICAgICAgICAgaWYgKCBvYmplY3RfbmFtZSh1c2VyW2ldKVswLi4xMl0gPT0gIi9zZWN1cmUvbG9naW4iICYmCisgICAgICAgICAgICAgICAgICgoc3RyaW5nKXVzZXJbaV0tPmxvZ2lubmFtZSgpKSA9PSBsb2dpbm5hbWUgKXsKKyAgICAgICAgICAgICAgICB3cml0ZSggIkVpbmUgQW5tZWxkdW5nIGZ1ZXIgZGllc2VuIE5hbWVuIGxhZXVmdCBiZXJlaXRzLlxuIiApOworICAgICAgICAgICAgICAgIGRlc3RydWN0KCB0aGlzX29iamVjdCgpICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgLy8gU2l0ZS1CYW5pc2ggY2hlY2tlbgorICAgICAgICBpZiAoIGNoZWNrX2lsbGVnYWwobG9naW5uYW1lKSkKKyAgICAgICAgICAgIHJldHVybiAxOworCisgICAgICAgIGlmICggY2hlY2tfdG9vX21hbnlfZnJvbV9zYW1lX2lwKCkgKQorICAgICAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgICAgLyogbmV3IGNoYXJhY3RlciAqLworICAgICAgICBpZiAoIHNpemVvZihsb2dpbm5hbWUpIDwgMyApeworICAgICAgICAgICAgd3JpdGUoICJEZXIgTmFtZSBpc3QgenUga3Vyei5cbiIgKTsKKyAgICAgICAgICAgIGxvZ2lubmFtZSA9ICJsb2dvbiI7CisgICAgICAgICAgICBpbnB1dF90byggImxvZ29uMiIsIElOUFVUX1BST01QVCwKKyAgICAgICAgICAgICAgICAiVmVyc3VjaCBlaW5lbiBhbmRlcmVuIE5hbWVuOiAiKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisKKyAgICAgICAgCisgICAgICAgIGlmICggKHR4dCA9IChzdHJpbmcpbWFzdGVyKCktPlF1ZXJ5QmFuaXNoZWQobG9naW5uYW1lKSkgKXsKKyAgICAgICAgICAgIGlmICggdHh0ICE9ICJEaWVzZXIgTmFtZSBpc3QgZ2VzcGVycnQuIiApCisgICAgICAgICAgICAgICAgdHh0ID0gc3ByaW50ZigiSG9wcGxhIC0gZGllc2VyIE5hbWUgaXN0IHJlc2VydmllcnQgb2RlciBnZXNwZXJydCAiCisgICAgICAgICAgICAgICAgICAgICIoXCJnZWJhbmlzaHRcIikhXG5HcnVuZDogJXNcbiIsdHh0KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0eHQgPSAiSG9wcGxhIC0gZGllc2VyIE5hbWUgaXN0IHJlc2VydmllcnQgb2RlciBnZXNwZXJydCAiCisgICAgICAgICAgICAgICAgICAgICIoXCJnZWJhbmlzaHRcIikhXG4iOworICAgICAgICAgICAgd3JpdGUodHh0KTsKKyAgICAgICAgICAgIGxvZ2lubmFtZSA9ICJsb2dvbiI7CisgICAgICAgICAgICBpbnB1dF90byggImxvZ29uMiIsIElOUFVUX1BST01QVCwKKyAgICAgICAgICAgICAgICAiQml0dGUgZ2liIERpciBlaW5lbiBhbmRlcmVuIE5hbWVuOiAiKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisKKyAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgbmV3IHNlY3VyZSBzYXZlZmlsZSAqLworICAgICAgICBuYW1lID0gbG9naW5uYW1lOworICAgICAgICBwYXNzd29yZCA9ICIiOworICAgICAgICBsZXZlbCA9IDA7CisgICAgICAgIGRvbWFpbnMgPSAoeyB9KTsKKyAgICAgICAgZ3VpbGRzID0gKHsgfSk7IAorICAgICAgICBzaGVsbCA9ICIiOworICAgICAgICBlcCA9ICIiOworICAgICAgICBlayA9ICIiOworICAgICAgICBtcSA9ICIiOworICAgICAgICBla3RpcHM9IiI7CisgICAgICAgIGZwdGlwcz0iIjsKKyAgICAgICAgY3JlYXRpb25fZGF0ZSA9IHRpbWUoKTsKKworICAgICAgICBpbnB1dF90byggIm5ld19wYXNzd29yZCIsIElOUFVUX05PRUNIT3xJTlBVVF9QUk9NUFQsCisgICAgICAgICAgICAiV2FlaGxlIGVpbiBQYXNzd29ydDogIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKCBsb2dpbm5hbWUgPT0gImdhc3QiICl7CisgICAgICAgICAgICBpZiAoIGNoZWNrX2lsbGVnYWwobG9naW5uYW1lKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgICAgICAgIGxvYWRfcGxheWVyX29iamVjdCgxKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBuZXUgKXsKKyAgICAgICAgICAgIHdyaXRlKCAiRXMgZXhpc3RpZXJ0IGJlcmVpdHMgZWluIENoYXJha3RlciBkaWVzZXMgTmFtZW5zLlxuIiApOworICAgICAgICAgICAgbG9naW5uYW1lID0gImxvZ29uIjsKKyAgICAgICAgICAgIGlucHV0X3RvKCAibG9nb24yIiwgSU5QVVRfUFJPTVBULAorICAgICAgICAgICAgICAgICJHaWIgRGlyIGVpbmVuIGFuZGVyZW4gTmFtZW46ICIpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIChpbnQpbWFzdGVyKCktPmNoZWNrX2xhdGVfcGxheWVyKGxvZ2lubmFtZSkgKQorICAgICAgICB7CisgICAgICAgICAgICB3cml0ZSggIkRpZXNlciBTcGllbGVyIGhhdCB1bnMgbGVpZGVyIGZ1ZXIgaW1tZXIgdmVybGFzc2VuLlxuIiApOworICAgICAgICAgICAgbG9naW5uYW1lID0gImxvZ29uIjsKKyAgICAgICAgICAgIGlucHV0X3RvKCAibG9nb24yIiwgSU5QVVRfUFJPTVBULAorICAgICAgICAgICAgICAgICJXaWUgaGVpc3N0IER1IGRlbm4gKFwibmV1XCIgZnVlciBuZXVlbiBTcGllbGVyKT8gIik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggdHh0ID0gKHN0cmluZyltYXN0ZXIoKS0+UXVlcnlUQmFuaXNoZWQobG9naW5uYW1lKSApeworICAgICAgICAgICAgd3JpdGUoIHR4dCApOworICAgICAgICAgICAgbG9naW5uYW1lID0gImxvZ29uIjsKKyAgICAgICAgICAgIGlucHV0X3RvKCAibG9nb24yIiwgSU5QVVRfUFJPTVBULAorICAgICAgICAgICAgICAgICJXaWUgaGVpc3N0IER1IGRlbm4gKFwibmV1XCIgZnVlciBuZXVlbiBTcGllbGVyKT8gIik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggY3JlYXRpb25fZGF0ZSA+ICh0aW1lKCkgLSAzMCoyNCo2MCo2MCkKKyAgICAgICAgICAgICAmJiBjaGVja190b29fbWFueV9mcm9tX3NhbWVfaXAoKSApCisgICAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICB3cml0ZSggIlNjaG9lbiwgZGFzcyBEdSB3aWVkZXIgZGEgYmlzdCwgIitjYXBpdGFsaXplKGxvZ2lubmFtZSkrIiFcbiIgKTsKKworICAgICAgICBpZiAoICFzdHJpbmdwKHBhc3N3b3JkKSB8fCBwYXNzd29yZCA9PSAiIiApIHsKKyAgICAgICAgICAgIHdyaXRlKCAiRHUgaGFzdCBLRUlOIFBBU1NXT1JEIVxuIiApOworICAgICAgICAgICAgd3JpdGUoICJCZW51dHplIGRlbiBcInBhc3N3b3JkXCItQmVmZWhsLCB1bSBkYXMgenUgYWVuZGVybiAhXG4iICk7CisgICAgICAgICAgICBsb2FkX3BsYXllcl9vYmplY3QoMCk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlucHV0X3RvKCAiY2hlY2tfcGFzc3dvcmQiLCBJTlBVVF9OT0VDSE98SU5QVVRfUFJPTVBULAorICAgICAgICAgICAgIlBhc3N3b3J0OiAiKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorfQorCisKK3N0YXRpYyBpbnQgbmV3X3Bhc3N3b3JkKCBzdHJpbmcgc3RyICkKK3sKKyAgICB3cml0ZSggIlxuIiApOworCisgICAgaWYgKCAhc3RyIHx8IHN0ciA9PSAiIiApCisgICAgICAgIHJldHVybiByZW1vdmUoKTsKKworICAgIHBhc3N3b3JkID0gc3RyOworCisgICAgaWYgKCAhbWFzdGVyKCktPmdvb2RfcGFzc3dvcmQoIHN0ciwgbG9naW5uYW1lICkgKSB7CisgICAgICAgIGlucHV0X3RvKCAibmV3X3Bhc3N3b3JkIiwgSU5QVVRfTk9FQ0hPfElOUFVUX1BST01QVCwKKyAgICAgICAgICAgICJCaXR0ZSBnaWIgZWluIFBhc3N3b3J0IGFuOiAiKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgd3JpdGUoICJcblp1ciBFcmlubmVydW5nOiBFcyBpc3QgIHYgZSByIGIgbyB0IGUgbiwgYW5kZXJlIFNwaWVsZXIgIgorICAgICAgICAgICAiYW56dWdyZWlmZW4hXG4iICk7CisgICAgd3JpdGUoICJEYXMgZ2lsdCBhdWNoIGZ1ZXIgRnJvZXNjaGUsIGJlaSBkZW5lbiBcIkVpbiBGcm9zY2ggbmFtZW5zICIKKyAgICAgICAgICAgIlhYWFhYXCIgc3RlaHQuXG5cbiIgKTsKKyAgICBpbnB1dF90byggImFnYWluX3Bhc3N3b3JkIiwgSU5QVVRfTk9FQ0hPfElOUFVUX1BST01QVCwKKyAgICAgICAgIlBhc3N3b3J0IGJpdHRlIG5vY2htYWwgZWluZ2ViZW46ICIpOworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGFnYWluX3Bhc3N3b3JkKCBzdHJpbmcgc3RyICkKK3sKKyAgICB3cml0ZSggIlxuIiApOworCisgICAgaWYgKCBzdHIgIT0gcGFzc3dvcmQgKXsKKyAgICAgICAgd3JpdGUoICJEaWUgUGFzc3dvZXJ0ZXIgc3RpbW10ZW4gbmljaHQgdWViZXJlaW4hXG4iICk7CisgICAgICAgIGRlc3RydWN0KCB0aGlzX29iamVjdCgpICk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHdoaWxlICggcmVtb3ZlX2NhbGxfb3V0KCAidGltZV9vdXQiICkgIT0gLTEgKQorICAgICAgICA7CisgICAgY2FsbF9vdXQoICJ0aW1lX291dCIsIDYwMCApOworCisgICAgcGFzc3dvcmQgPSBtZDVfY3J5cHQoIHBhc3N3b3JkLCAwICk7CisgICAgc2F2ZV9vYmplY3QoIFNFQ1VSRVNBVkVQQVRIICsgbG9naW5uYW1lWzAuLjBdICsgIi8iICsgbG9naW5uYW1lICk7CisgICAgbWFzdGVyKCktPlJlbW92ZUZyb21DYWNoZSggbG9naW5uYW1lICk7CisKKyAgICBsb2FkX3BsYXllcl9vYmplY3QoMCk7CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfcGFzc3dvcmQoIHN0cmluZyBzdHIgKQoreworICAgIHdyaXRlKCAiXG4iICk7CisKKyAgICAvLyBJbnZpcyBlaW5sb2dnZW4/CisgICAgaWYgKHNpemVvZihzdHIpID4gMSAmJiBzdHJbMF0gPT0gJy0nKSB7CisgICAgICAgIGludmlzID0gMTsKKyAgICAgICAgc3RyID0gc3RyWzEuLl07CisgICAgfQorCisgICAgLy8gd2VsY2hlciBIYXNoIGlzdHMgZGVubj8KKyAgICBpZiAoc2l6ZW9mKHBhc3N3b3JkKSA+IDEzKSB7CisgICAgICAgIC8vIE1ENS1IYXNoCisgICAgICAgIHN0ciA9IG1kNV9jcnlwdChzdHIsIHBhc3N3b3JkKTsKKyAgICB9CisgICAgZWxzZSBpZiAoc2l6ZW9mKHBhc3N3b3JkKSA+IDIpIHsKKyAgICAgICAgLy8gQ3J5cHQtSGFzaAorICAgICAgICBzdHIgPSBjcnlwdChzdHIsIHBhc3N3b3JkWzAuLjFdKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8vIGtlaW5lciB2b24gYmVpZGVuIEhhc2hlcyAtPiB1bmd1ZWx0aWdlcyBQVworICAgICAgICBzdHIgPSAwOworICAgIH0KKworICAgIGlmICggIXN0cmluZ3Aoc3RyKSB8fCBzdHIgIT0gcGFzc3dvcmQgKSB7CisgICAgICAvLyBIYXNoZXMgc3RpbW1lbiBuaWNodCB1ZWJlcmVpbiAtPiB1bmQgc2NobHVzcy4uLgorICAgICAgd3JpdGUoICJGYWxzY2hlcyBQYXNzd29ydCFcbiIpOworICAgICAgaWYgKCBsb2dpbmZhaWxzID4gMiApCisgICAgICAgIHdyaXRlKGJyZWFrX3N0cmluZygKKyAgICAgICAgICAiU29sbHRlc3QgRHUgd2VpdGVyaGluIFByb2JsZW1lIG1pdCBkZW0gRWlubG9nZ2VuIGhhYmVuLCBrYW5uc3QgIgorICAgICAgICAgICJEdSBEZWluIFBhc3N3b3J0IHp1cnVlY2tzZXR6ZW4gbGFzc2VuLCBpbmRlbSBEdSBEaWNoIGFscyBHYXN0ICIKKyAgICAgICAgICAiYW5tZWxkZXN0IHVuZCBlaW5lbiBFcnptYWdpZXIgYW5zcHJpY2hzdCwgb2RlciBpbmRlbSBEdSBEaWNoICIKKyAgICAgICAgICAibWl0dGVscyBlaW5lciBFLU1haWwgYW4gbXVkQG1kLm11ZC5kZSBtaXQgdW5zIGluIFZlcmJpbmR1bmcgIgorICAgICAgICAgICJzZXR6dC4iLDc4KSk7CisgICAgCisgICAgICBsb2dfZmlsZSggKGxldmVsIDwgNjAgPyAiTE9HSU5GQUlMIiA6ICJBUkNIL0xPR0lORkFJTCIpLAorICAgICAgICBzcHJpbnRmKCAiUEFTU1dPUkQ6ICUtMTFzICVzLCAlLTE1cyAoJXMpXG4iLCAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICBsb2dpbm5hbWUsIGN0aW1lKHRpbWUoKSlbNC4uMTVdLAorICAgICAgICAgICAgICAgICAgcXVlcnlfaXBfbnVtYmVyKHRoaXNfb2JqZWN0KCkpLCAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICBxdWVyeV9pcF9uYW1lKHRoaXNfb2JqZWN0KCkpICksIDIwMDAwMCApOworICAgICAgCisgICAgICBsb2dpbmZhaWxzKys7CisgICAgICBzYXZlX29iamVjdCggU0VDVVJFU0FWRVBBVEggKyBsb2dpbm5hbWVbMC4uMF0gKyAiLyIgKyBsb2dpbm5hbWUgKTsKKyAgICAgIG1hc3RlcigpLT5SZW1vdmVGcm9tQ2FjaGUoIGxvZ2lubmFtZSApOworICAgICAgZGVzdHJ1Y3QoIHRoaXNfb2JqZWN0KCkgKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGlmICggbG9naW5mYWlscyApIHsKKyAgICAgICAgd3JpdGUoIGxvZ2luZmFpbHMgKyAiIGZlaGxnZXNjaGxhZ2VuZSIgKyAobG9naW5mYWlscyA9PSAxID8gInIiIDogIiIpICsKKyAgICAgICAgICAgICAgICIgTG9naW4tVmVyc3VjaCIgKyAobG9naW5mYWlscyA9PSAxID8gIiIgOiAiZSIpICsKKyAgICAgICAgICAgICAgICIgc2VpdCBkZW0gbGV0enRlbiBlcmZvbGdyZWljaGVuIExvZ2luLlxuIiApOworICAgICAgICBsb2dpbmZhaWxzID0gMDsKKyAgICB9CisKKyAgICBzYXZlX29iamVjdCggU0VDVVJFU0FWRVBBVEggKyBsb2dpbm5hbWVbMC4uMF0gKyAiLyIgKyBsb2dpbm5hbWUgKTsKKyAgICBtYXN0ZXIoKS0+UmVtb3ZlRnJvbUNhY2hlKCBsb2dpbm5hbWUgKTsKKworICAgIGxvYWRfcGxheWVyX29iamVjdCgwKTsKKyAgICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgdm9pZCBzZWxlY3RfcmFjZSgpCit7CisgICAgaW50IGk7CisgICAgc3RyaW5nIHM7CisKKyAgICByYWNlcyA9IGdldF9kaXIoICIvc3RkL3NoZWxscy8qLmMiICk7CisKKyAgICAvLyBNZW5zY2ggc29sbCBpbW1lciBhbHMgZXJzdGVzIGluIGRlciBBdXN3YWhsbGlzdGUgc3RlaGVuLgorICAgIGlmIChtZW1iZXIocmFjZXMsImh1bWFuLmMiKSE9LTEpCisgICAgICAgICAgICByYWNlcz0oeyJodW1hbi5jIn0pKyhyYWNlcy0oeyJodW1hbi5jIn0pKTsKKyAgICAKKyAgICBmb3IgKCBpID0gc2l6ZW9mKHJhY2VzKTsgaS0tOyApeworICAgICAgICByYWNlc1tpXSA9ICIvc3RkL3NoZWxscy8iICsgcmFjZXNbaV1bMC4uPDNdOworICAgICAgICBzID0gMDsKKworICAgICAgICBpZiAoIGNhdGNoKHMgPSAoc3RyaW5nKWNhbGxfb3RoZXIoIHJhY2VzW2ldLCAiUXVlcnlBbGxvd1NlbGVjdCIgKTsgcHVibGlzaCkgCisgICAgICAgICAgICB8fCAhcykKKyAgICAgICAgICAgIHMgPSAwOworICAgICAgICBlbHNlIGlmICggY2F0Y2gocyA9IChzdHJpbmcpY2FsbF9vdGhlciggcmFjZXNbaV0sICJRdWVyeVByb3AiLCBQX1JBQ0UgKTtwdWJsaXNoKSApCisgICAgICAgICAgICBzID0gMDsKKworICAgICAgICBpZiAoICFzaXplb2YocykgKQorICAgICAgICAgICAgcmFjZXNbaS4uaV0gPSAoe30pOworICAgICAgICBlbHNlCisgICAgICAgICAgICByYWNlc1tpXSA9ICh7IHJhY2VzW2ldLCBzIH0pOworICAgIH0KKworICAgIGlmICggc2l6ZW9mKHJhY2VzKSA9PSAxICl7CisgICAgICAgIHdyaXRlKCAiRXMgZ2lidCBudXIgZWluZSBSYXNzZSwgRHUgaGFzdCBhbHNvIGtlaW5lIFdhaGwuXG4iICk7CisKKyAgICAgICAgc2hlbGwgPSByYWNlc1swXVswXTsKKyAgICAgICAgbWFzdGVyKCktPnNldF9wbGF5ZXJfb2JqZWN0KCBsb2dpbm5hbWUsIHNoZWxsICk7CisKKyAgICAgICAgcmV0dXJuIGxvYWRfcGxheWVyX29iXzIoIHNoZWxsLCAwICk7CisgICAgfQorCisgICAgcmV0dXJuIGFza19tdWRfcGxheWVkX3F1ZXN0aW9uKCk7Cit9CisKK3N0YXRpYyB2b2lkIGFza19tdWRfcGxheWVkX3F1ZXN0aW9uKCkKK3sKKyAgICAgICAgd3JpdGUoYnJlYWtfc3RyaW5nKAorICAgICAgICAgICAgICAgICJcbldlbm4gRHUgZWluIGFic29sdXRlciBOZXVsaW5nIGluIGRpZXNlbSBTcGllbCBiaXN0IG1vZWNodGVuICIKKyAgICAgICAgICAgICAgICAid2lyIERpciBtaXQgZWluaWdlbiBUaXBzIHp1IEJlZ2lubiBiZWlzZWl0ZSBzdGVoZW4uXG5cbiIsNzgsCisgICAgICAgICAgICAgICAgMCxCU19MRUFWRV9NWV9MRlMpKTsKKyAgICAgICAgaW5wdXRfdG8oICJnZXRfbXVkX3BsYXllZF9hbnN3ZXIiLCBJTlBVVF9QUk9NUFQsCisgICAgICAgICAgICAiSGFzdCBEdSBzY2hvbiBlaW5tYWwgaW4gZWluZW0gTVVEIGdlc3BpZWx0PyAoamEsbmVpbik6ICIpOworICAgICAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGFza19yYWNlX3F1ZXN0aW9uKCkKK3sKKyAgICBpbnQgaSwgajsKKworICAgIHdyaXRlKCBicmVha19zdHJpbmcoICJEdSBtdXNzdCBEaWNoIGpldHp0IGVudHNjaGVpZGVuLCB3ZWxjaGVyIFJhc3NlIER1ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gZGllc2VyIFdlbHQgYW5nZWhvZXJlbiBtb2VjaHRlc3QuIEFsbGUgUmFzc2VuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaGFiZW4gdmVyc2NoaWVkZW5lIFZvci0gdW5kIE5hY2h0ZWlsZSwgaW5zZ2VzYW10ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiYWJlciBnbGVpY2ggZ3V0ZSBDaGFuY2VuLiBBdWNoIGRhcyBTdGFydGdlYmlldCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImhhZW5ndCB2b24gZGVyIGF1c2dld2FlaGx0ZW4gUmFzc2UgYWIuIEltICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiTm9ybWFsZmFsbCBrYW5uIGRpZSBSYXNzZSBuaWNodCBtZWhyIGdld2VjaHNlbHQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZXJkZW4sIG5hY2hkZW0gc2llIGVpbm1hbCBhdXNnZXdhZWhsdCB3dXJkZS4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICJVZWJlcmxlZ2UgRGlyIERlaW5lIEVudHNjaGVpZHVuZyBhbHNvIGd1dC4gRGVyemVpdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgInN0ZWhlbiBmb2xnZW5kZSBSYXNzZW4genVyIEF1c3dhaGw6XG5cbiIsIDc4ICkgKTsKKworICAgIGZvciAoIGkgPSAwLCBqID0gc2l6ZW9mKHJhY2VzKTsgaSA8IGo7IGkrKyApCisgICAgICAgIHByaW50ZiggIiUgMmQuICUtMzBzICAgJXMiLCBpKzEsIGNhcGl0YWxpemUocmFjZXNbaV1bMV0pLAorICAgICAgICAgICAgICAgIChpICUgMiA/ICJcbiIgOiAifCAiKSApOworCisgICAgaWYgKCBzaXplb2YocmFjZXMpICUgMiApCisgICAgICAgIHdyaXRlKCAiXG4iICk7CisKKyAgICB3cml0ZSggYnJlYWtfc3RyaW5nKCAiXG5EdXJjaCBFaW5nYWJlIGVpbmVyIFppZmZlciB3YWVobHN0IER1IGRpZSBSYXNzZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImF1cywgZHVyY2ggRWluZ2FiZSBlaW5lcyBcIlw/XCIgZ2Vmb2xndCB2b24gZWluZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJaaWZmZXIgZXJoYWVsdHN0IER1IG5hZWhlcmUgSW5mb3JtYXRpb25lbiB1ZWJlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImVpbmUgUmFzc2UuIEVpbiBcIlw/XCIgYWxsZWluIHdpZWRlcmhvbHQgZGllc2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJMaXN0ZS4iLCA3OCwgMCwgMSApICk7CisKKyAgICBpZiAobmV3YmllKQorICAgIHsKKyAgICAgICAgICAgIHdyaXRlKGJyZWFrX3N0cmluZygiXG5BbHMgTmV1bGluZyBzb2xsdGVzdCBEdSBEaWNoIE5JQ0hUIGZ1ZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpZSBEdW5rZWxlbGZlbiBlbnRzY2hlaWRlbi4gRGllc2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJhc3NlIGhhdCBlaW5pZ2UgUHJvYmxlbWUgaW0gVW1nYW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtaXQgZGVuIGFuZGVyZW4gUmFzc2VuIHVuZCBtaXQgZGVtICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTb25uZW5saWNodC4iLDc4LDAsQlNfTEVBVkVfTVlfTEZTKSk7CisgICAgfQorCisgICAgaW5wdXRfdG8oICJnZXRfcmFjZV9hbnN3ZXIiLCBJTlBVVF9QUk9NUFQsCisgICAgICAgICJcbldhcyB3aWxsc3QgRHUgdHVuOiAiKTsKKyAgICByZXR1cm47Cit9CisKKworc3RhdGljIHZvaWQgZ2V0X3JhY2VfYW5zd2VyKCBzdHJpbmcgc3RyICkKK3sKKyAgICBpbnQgbnVtOworCisgICAgaWYgKCBzdHIgPT0gIj8iICkKKyAgICAgICAgcmV0dXJuIGFza19yYWNlX3F1ZXN0aW9uKCk7CisKKyAgICBpZiAoIHNzY2FuZiggc3RyLCAiPyVkIiwgbnVtICkgKXsKKyAgICAgICAgaWYgKCBudW0gPCAxIHx8IG51bSA+IHNpemVvZihyYWNlcykgKXsKKyAgICAgICAgICAgIHdyaXRlKCAiRGFzIGdlaHQgbmljaHQuXG5cbiIpOworICAgICAgICAgICAgaW5wdXRfdG8oICJnZXRfcmFjZV9hbnN3ZXIiLCBJTlBVVF9QUk9NUFQsCisgICAgICAgICAgICAgICAgIldhcyB3aWxsc3QgRHUgdHVuOiAiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHdyaXRlKCBjYWxsX290aGVyKCByYWNlc1tudW0gLSAxXVswXSwgIlF1ZXJ5UHJvcCIsIFBfUkFDRV9ERVNDUklQVElPTiApKTsKKyAgICAgICAgaW5wdXRfdG8oICJnZXRfcmFjZV9hbnN3ZXIiLCBJTlBVVF9QUk9NUFQsCisgICAgICAgICAgICAiXG5XYXMgd2lsbHN0IER1IHR1bjogIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIHNzY2FuZiggc3RyLCAiJWQiLCBudW0gKSAmJiBudW0gPj0gMSAmJiBudW0gPD0gc2l6ZW9mKHJhY2VzKSApeworICAgICAgICB3cml0ZSggIk9rLCBEdSBiaXN0IGpldHp0IGVpbiAiCisgICAgICAgICAgICArIGNhcGl0YWxpemUocmFjZXNbbnVtLTFdWzFdKSArICIuXG4iICk7CisKKyAgICAgICAgc2hlbGwgPSByYWNlc1tudW0tMV1bMF07CisgICAgICAgIG1hc3RlcigpLT5zZXRfcGxheWVyX29iamVjdCggbG9naW5uYW1lLCBzaGVsbCApOworICAgICAgICByZXR1cm4gbG9hZF9wbGF5ZXJfb2JfMiggc2hlbGwsIDAgKTsKKyAgICB9CisKKyAgICB3cml0ZSgiV2llIGJpdHRlP1xuXG4iICk7CisgICAgaW5wdXRfdG8oICJnZXRfcmFjZV9hbnN3ZXIiLCBJTlBVVF9QUk9NUFQsCisgICAgICAgICJXYXMgd2lsbHN0IER1IHR1bjogIik7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9tdWRfcGxheWVkX2Fuc3dlciAoc3RyaW5nIHN0cikKK3sKKyAgICAgICAgaWYgKCBzdHIgPT0gImphIiB8fCBzdHI9PSJqIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3YmllPTA7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFza19yYWNlX3F1ZXN0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICBpZiAoIHN0ciAhPSAibmVpbiIgJiYgc3RyIT0ibiIpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3cml0ZSgiXG5cbkFudHdvcnRlIGJpdHRlIG1pdCBqYSBvZGVyIG5laW4uXG5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICByZXR1cm4gYXNrX211ZF9wbGF5ZWRfcXVlc3Rpb24oKTsKKyAgICAgICAgfQorICAgICAgICBuZXdiaWU9MTsKKyAgICAgICAgd3JpdGUoIlxuXG5FaW5lIGtsZWluZSBFaW5mdWVocnVuZyBpbiBkYXMgIk1VRE5BTUUiIGJla29tbXN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJEdSBhdWNoIGhpZXI6XG5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vbWcubXVkLmRlL25ld3dlYi9oaWxmZS90dXRvcmlhbC9pbmhhbHQuc2h0bWxcblxuIik7CisgICAgICAgIHJldHVybiBhc2tfcmFjZV9xdWVzdGlvbigpOworICAgICAgICAKK30KKworc3RhdGljIGludCBsb2FkX3BsYXllcl9vYmplY3QoIGludCBndWVzdGZsYWcgKQoreworICAgIG9iamVjdCBvYjsKKyAgICBzdHJpbmcgZm5hbWU7CisgICAgaW50IHdhc19pbnRlcmFjdGl2ZTsKKworICAgIGlmICggc2l6ZW9mKHVzZXJzKCkpID49IDE5NSAmJiAhSVNfV0laQVJEKGxvZ2lubmFtZSkgKXsKKyAgICAgICAgd3JpdGUoICJEaWUgbWF4aW1hbGUgU3BpZWxlcnphaGwgd3VyZGUgYmVyZWl0cyBlcnJlaWNodCEhIVxuIgorICAgICAgICAgICAgICAgIkF1cyB0ZWNobmlzY2hlbiBHcnVlbmRlbiBkdWVyZmVuIHNpY2ggbnVyIG5vY2ggTWFnaWVyICIKKyAgICAgICAgICAgICAgICJlaW5sb2dnZW4uXG5WZXJzdWNoIGVzIHNwYWV0ZXIgbm9jaCBlaW5tYWwgLi4uXG4iICk7CisgICAgICAgIGRlc3RydWN0KCB0aGlzX29iamVjdCgpICk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlIGlmICggc2l6ZW9mKHVzZXJzKCkpID49IDE5OCAmJiAhSVNfQVJDSChsb2dpbm5hbWUpICl7CisgICAgICAgIHdyaXRlKCAiRGllIG1heGltYWxlIFNwaWVsZXItIHVuZCBNYWdpZXJ6YWhsIHd1cmRlIGJlcmVpdHMgZXJyZWljaHQhISEiCisgICAgICAgICAgICAgICAiXG5BdXMgdGVjaG5pc2NoZW4gR3J1ZW5kZW4gZHVlcmZlbiBzaWNoIG51ciBub2NoIEVyem1hZ2llciAiCisgICAgICAgICAgICAgICAiZWlubG9nZ2VuLlxuVmVyc3VjaCBlcyBzcGFldGVyIG5vY2ggZWlubWFsIC4uLlxuIiApOworICAgICAgICBkZXN0cnVjdCggdGhpc19vYmplY3QoKSApOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAoIGZpbGVfc2l6ZSgiL2V0Yy9OT0xPR0lOIik+PTAgKQorICAgIHsKKyAgICAgIGlmIChmaWxlX3NpemUoIi9ldGMvTk9MT0dJTi5pbmZvIik+MCkgeworICAgICAgICAvL05PTE9HSU4uaW5mbyBlbnRoYWVsdCBldnRsLiB3ZWl0ZXJnZWhlbmRlIEluZm9ybWF0aW9uZW4gZnVlciAKKyAgICAgICAgLy9TcGllbGVyLCB6LkIuIHZvcnJhdXNzLiBXaWVkZXJ2ZXJmdWVnYmFya2VpdC4KKyAgICAgICAgd3JpdGUoYnJlYWtfc3RyaW5nKHJlYWRfZmlsZSgiL2V0Yy9OT0xPR0lOLmluZm8iKSw3OCwiIiwKKyAgICAgICAgICAgICAgQlNfTEVBVkVfTVlfTEZTfEJTX1NJTkdMRV9TUEFDRSkpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIC8vc29uc3QgU3RhbmRhcmRtZWxkdW5nIGF1c2dlYmVuLgorICAgICAgICB3cml0ZSAoIlxuQXVmZ3J1bmQgdm9uIHRlY2huaXNjaGVuIFByb2JsZW1lbiBpc3QgZGFzIEVpbmxvZ2dlbiBpbnMgIgorICAgICAgICAgICAgICAgIE1VRE5BTUUiIHp1ciBcblplaXQgbmljaHQgbW9lZ2xpY2guIEJpdHRlIHZlcnN1Y2ggZXMgIgorICAgICAgICAgICAgICAgICAgICAgICJzcGFldGVyIG5vY2ggZWlubWFsLlxuXG4iKTsKKyAgICAgIH0KKyAgICAgIGlmICggSVNfQVJDSChsb2dpbm5hbWUpIHx8IAorICAgICAgICAgICBtZW1iZXIoZXhwbG9kZShyZWFkX2ZpbGUoIi9ldGMvTk9MT0dJTiIpfHwiIiwiXG4iKSwKKyAgICAgICAgICAgICAgICAgIGxvZ2lubmFtZSkhPS0xICkKKyAgICAgIHsKKyAgICAgICAgd3JpdGUoIkltIE1vbWVudCBrb2VubmVuIG51ciBFcnptYWdpZXIgZWlubG9nZ2VuLiBVbSBTcGllbGVyICIKKyAgICAgICAgICAgICAgIndpZWRlciBpbnMgU3BpZWwgenUgbGFzc2VuLCBtdXNzIGRpZSBEYXRlaSAnL2V0Yy9OT0xPR0lOJyAiCisgICAgICAgICAgICAgICJnZWxvZXNjaHQgd2VyZGVuLlxuXG4gIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBkZXN0cnVjdCggdGhpc19vYmplY3QoKSApOworICAgICAgICByZXR1cm4gMTsgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIGd1ZXN0ZmxhZyApeworICAgICAgICBpZiAoIGNhdGNoKGd1ZXN0ZmxhZyA9IChpbnQpR1VFU1RNQVNURVItPm5ld19ndWVzdCgpO3B1Ymxpc2gpIAorICAgICAgICAgICAgIHx8ICFndWVzdGZsYWcgKXsKKyAgICAgICAgICAgIHdyaXRlKCAiRGVyemVpdCBpc3Qga2VpbiBHYXN0bG9naW4gbW9lZ2xpY2ghXG4iICk7CisgICAgICAgICAgICBkZXN0cnVjdCggdGhpc19vYmplY3QoKSApOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICBsb2dpbm5hbWUgPSAiZ2FzdCIgKyBndWVzdGZsYWc7CisgICAgICAgIGNhcF9uYW1lID0gY2FwaXRhbGl6ZShsb2dpbm5hbWUpOworICAgICAgICBuYW1lID0gY2FwX25hbWU7CisKKyAgICAgICAgaWYgKCAhKG9iID0gZmluZF9wbGF5ZXIobG9naW5uYW1lKSB8fCBmaW5kX25ldGRlYWQobG9naW5uYW1lKSkgKXsKKyAgICAgICAgICAgIG9iamVjdCAqdXNlcjsKKyAgICAgICAgICAgIGludCBpOworCisgICAgICAgICAgICAvLyBnZWdlbiBIb3JkZW4gdm9uIEdhc3QxIC0gd2VubiBlaW4gR2FzdCBub2NoIGFtIFByb21wdCBmdWVyCisgICAgICAgICAgICAvLyBkYXMgR2VzY2hsZWNodCBoYWVuZ3QsIGlzdCBlciB1ZWJlciBmaW5kX3BsYXllcigpIG5vY2ggbmljaHQKKyAgICAgICAgICAgIC8vIHp1IGZpbmRlbiAuLi4KKyAgICAgICAgICAgIGZvciAoIGkgPSBzaXplb2YodXNlciA9IHVzZXJzKCkgLSAoeyAwLCB0aGlzX29iamVjdCgpIH0pKTsgaS0tOyApCisgICAgICAgICAgICAgICAgaWYgKCBvYmplY3RfbmFtZSh1c2VyW2ldKVswLi4xMV0gPT0gIi9zdGQvc2hlbGxzLyIgJiYKKyAgICAgICAgICAgICAgICAgICAgIGdldHVpZCh1c2VyW2ldKSA9PSBsb2dpbm5hbWUgKXsKKyAgICAgICAgICAgICAgICAgICAgb2IgPSB1c2VyW2ldOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIG9iICl7CisgICAgICAgICAgICB0ZWxsX29iamVjdCggb2IsICJFaW4gYW5kZXJlciBTcGllbGVyIG1vZWNodGUgZGllc2VuIEdhc3R6dWdhbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJqZXR6dCBiZW51dHplbi4gV2VubiBlcyBEaXIgaGllclxuZ2VmYWxsZW4gaGF0LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgInVlYmVybGVnIERpciBkb2NoIGVpbmVuIENoYXJha3Rlcm5hbWVuIHVuZCBrb21tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAidW50ZXIgZGllc2VtXG5OYW1lbiB3aWVkZXIhXG4iICk7CisgICAgICAgICAgICBkZXN0cnVjdChvYik7CisgICAgICAgIH0KKworICAgICAgICBsb2FkX3BsYXllcl9vYl8yKCAic3RkL3NoZWxscy9odW1hbiIsIGd1ZXN0ZmxhZyApOworCisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogVGVzdCBpZiB3ZSBhcmUgYWxyZWFkeSBwbGF5aW5nICovCisgICAgICAgIHdhc19pbnRlcmFjdGl2ZSA9IDA7CisgICAgICAgIG9iID0gZmluZF9wbGF5ZXIobG9naW5uYW1lKSB8fCBmaW5kX25ldGRlYWQobG9naW5uYW1lKTsKKworICAgICAgICBpZiAob2IpIHsKKyAgICAgICAgICAgIHdyaXRlKCAiRHUgbmltbXN0IHNjaG9uIGFtIFNwaWVsIHRlaWwhXG4iICk7CisgICAgICAgICAgICB3cml0ZSggIlZlcndlbmRlIERlaW5lIGFsdGUgc3RlcmJsaWNoZSBIdWVsbGUgLi4uXG4iICk7CisKKyAgICAgICAgICAgIGlmICggaW50ZXJhY3RpdmUob2IpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBUaGUgb3RoZXIgb2JqZWN0IGlzIHN0aWxsIGludGVyYWN0aXZlOyByZWNvbm5lY3QgdGhhdCAic291bCIKKyAgICAgICAgICAgICAgICAgICB0byBhIGR1bW15IG9iamVjdCBhbmQgZGVzdHJ1Y3QgdGhhdCwgdGh1cyBkaXNjb25uZWN0aW5nIHRoZQorICAgICAgICAgICAgICAgICAgIG90aGVyIHByb2JhYmx5IGxpbmtkZWFkIHVzZXIuIFRoZSByZWFsICJib2R5IiBpcyBzdGlsbAorICAgICAgICAgICAgICAgICAgIHRoZXJlIGZvciByZWNvbm5lY3RpbmcgYnkgbG9naW4uYyAqLworICAgICAgICAgICAgICAgIHJlbW92ZV9pbnRlcmFjdGl2ZShvYik7CisgICAgICAgICAgICAgICAgd2FzX2ludGVyYWN0aXZlID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFdlbm4gSW52aXNsb2dpbiwgUF9JTlZJUyBzZXR6ZW4uCisgICAgICAgICAgICBpZiAoIGludmlzICYmIElTX1dJWkFSRChvYikgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9iLT5TZXRQcm9wKCBQX0lOVklTLCBvYi0+UXVlcnlQcm9wKFBfQUdFKSApOworICAgICAgICAgICAgICAgIHRlbGxfb2JqZWN0KCBvYiwgIkRVIEJJU1QgVU5TSUNIVEJBUiFcbiIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIE5vdyByZWNvbm5lY3QgdG8gdGhlIG9sZCBib2R5ICovCisgICAgICAgICAgICBleGVjKCBvYiwgdGhpc19vYmplY3QoKSApOworICAgICAgICAgICAgb2ItPnNldF9yZWFsaXAocmVhbGlwKTsKKyAgICAgICAgICAgIGlmICggKChpbnQpb2ItPlF1ZXJ5UHJvcChQX0xFVkVMKSkgPT0gLTEgKQorICAgICAgICAgICAgICAgIG9iLT5zdGFydF9wbGF5ZXIoIGNhcF9uYW1lICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgb2ItPlJlY29ubmVjdCggd2FzX2ludGVyYWN0aXZlICk7CisKKyAgICAgICAgICAgIGNhbGxfb3V0KCAicmVtb3ZlIiwgMiApOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiByZWFkIHBsYXllciBvYmplY3QgZnJvbSBwYXNzd2QgZmlsZSAqLworICAgIGlmICggc3RyaW5ncChzaGVsbCkgJiYgc2hlbGwgIT0gIiIgKQorICAgICAgICBsb2FkX3BsYXllcl9vYl8yICggc2hlbGwsIDAgKTsKKyAgICBlbHNlCisgICAgICAgIHNlbGVjdF9yYWNlKCk7CisKKyAgICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgdm9pZCBsb2FkX3BsYXllcl9vYl8yKCBzdHJpbmcgb2JuYW1lLCBpbnQgZ3Vlc3RmbGFnICkKK3sKKyAgICBvYmplY3QgYmx1ZXByaW50OworICAgIHN0cmluZyBlcnIsIG9iX25hbWU7CisgICAgb2JqZWN0IG9iLCBvbGRfb2I7CisKKyAgICBpZiAoIWludGVyYWN0aXZlKCkpIHsKKyAgICAgIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvKiBzdGFydCBwbGF5ZXIgYWN0aXZpdHkgKi8KKyAgICBsb2dfZmlsZSggIkVOVEVSIiwgc3ByaW50ZiggIiUtMTFzICVzLCAlLTE1cyAoJXMpLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShuYW1lKSwgY3RpbWUodGltZSgpKVs0Li4xNV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5X2lwX251bWJlcih0aGlzX29iamVjdCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlfaXBfbmFtZSh0aGlzX29iamVjdCgpKSApLCAyMDAwMDAgKTsKKworICAgIHNldGV1aWQobG9naW5uYW1lKTsKKworICAgIC8qIGxvYWQgdGhlICJyZWFsIiBwbGF5ZXIgb2JqZWN0ICovCisgICAgLyogSWYgc29tZSBhc3Nob2xlIGhhcyBtb3ZlZCB0aGUgYmx1ZXByaW50ICovCisgICAgaWYgKCBvYmplY3RwKGJsdWVwcmludCA9IGZpbmRfb2JqZWN0KG9ibmFtZSkpICAmJiBlbnZpcm9ubWVudChibHVlcHJpbnQpICkKKyAgICAgICAgZGVzdHJ1Y3QoYmx1ZXByaW50KTsKKworICAgIGlmICggZXJyID0gY2F0Y2gob2IgPSBjbG9uZV9vYmplY3Qob2JuYW1lKTtwdWJsaXNoKSApeworICAgICAgICBsb2dfZmlsZSggIlNIRUxMUyIsICJGYWlsZWQgdG8gbG9hZCBzaGVsbCAiICsgb2JuYW1lICsgIiwgIiArCisgICAgICAgICAgICAgICAgICBkdGltZSh0aW1lKCkpICsgIiwgIiArIGxvZ2lubmFtZSArICJcbiIgKyBlcnIgKyAiXG5cbiIgKTsKKworICAgICAgICB3cml0ZSggIktvbm50ZSBkYXMgcGFzc2VuZGUgUGxheWVyb2JqZWt0IG5pY2h0IGxhZGVuLiBMYWRlICIKKyAgICAgICAgICAgICAgICJzdGF0dGRlc3NlblxuZGFzIE9iamVrdCBNZW5zY2guIEJJVFRFIEVSWk1BR0lFUiAiCisgICAgICAgICAgICAgICAiQkVOQUNIUklDSFRJR0VOICFcbiIgKTsKKyAgICAgICAgZXJyID0gY2F0Y2gob2IgPSBjbG9uZV9vYmplY3QoIi9zdGQvc2hlbGxzL2h1bWFuIik7cHVibGlzaCk7CisgICAgfQorCisgICAgaWYgKCAhb2IgfHwgZXJyICkgeworICAgICAgICB3cml0ZSggIkVycm9yIG9uIGxvYWRpbmcgIiArIHNoZWxsICsgIlxuRXJyb3IgPSAiICsgZXJyICsgIlxuIiApOworICAgICAgICBkZXN0cnVjdCggdGhpc19vYmplY3QoKSApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCBndWVzdGZsYWcgKQorICAgICAgICBjYXRjaCggR1VFU1RNQVNURVItPnNldF9ndWVzdCggZ3Vlc3RmbGFnLCBvYiApO3B1Ymxpc2ggKTsKKworICAgIG9iX25hbWUgPSBleHBsb2RlKCBvYmplY3RfbmFtZShvYiksICIjIiApWzBdOworCisgICAgaWYgKCBzaXplb2Yob2JfbmFtZSkgPiAxMSAmJiBvYl9uYW1lWzAuLjExXSA9PSAiL3N0ZC9zaGVsbHMvIiApCisgICAgICAgIG9iX25hbWUgPSBvYl9uYW1lWzExLi5dOworCisgICAgb2JfbmFtZSA9IG9iX25hbWUgKyAiOiIgKyBsb2dpbm5hbWU7CisKKyAgaWYoICFndWVzdGZsYWcgKQorICB7CisgICAgICBpZiAoIG9sZF9vYiA9IGZpbmRfb2JqZWN0KG9iX25hbWUpICkKKyAgICAgIHsKKyAgICAgICAgICBjYXRjaChvbGRfb2ItPnJlbW92ZSgpO3B1Ymxpc2gpOworCisgICAgICAgICAgaWYgKCBvbGRfb2IgKQorICAgICAgICAgICAgICBkZXN0cnVjdCggb2xkX29iICk7CisgICAgICB9CisgICAgICByZW5hbWVfb2JqZWN0KCBvYiwgb2JfbmFtZSApOworICAgICAgb2ItPl9fcmVsb2FkX2V4cGxvcmUoKTsKKyAgfQorICBleGVjKCBvYiwgdGhpc19vYmplY3QoKSApOworICBvYi0+c2V0X3JlYWxpcChyZWFsaXApOworICBvYi0+c3RhcnRfcGxheWVyKCBjYXBfbmFtZSApOworICAvL0hpbndlaXM6IERhcyBTcGllbGVyb2JqZWt0IGhvbHQgc2ljaCBpbiB1cGRhdGVzX2FmdGVyX3Jlc3RvcmUoKSB2b24gaGllcgorICAvL2RlbiBTdGF0dXMgdm9uIGludmlzIHVuZCBzZXR6dCBnZ2YuIFBfSU5WSVMKKworICAvLyBUT0RPOiBQcm9wIHJhdXN3ZXJmZW4gdW5kIGluIFNwaWVsZXJuIFNBVkUgZW50ZmVybmVuLCB3ZW5uIGRpZSBmb2xnZW5kZW4KKyAgLy8gVmVyd2VuZHVuZ2VuIGVudHNvcmd0IHNpbmQ6CisgIC8vIC9kL3d1ZXN0ZS9oaXJ1ZG8vZ29sZHN0cmFuZC9yb29tcy9nZWZhZW5nbmlzLmMKKyAgLy8gL2QvaW5zZWxuL3RpbGx5L2ZldWVyaW5zZWwvb2JqL2Zvcm11bGFyLmMKKyAgLy8gL2QvcG9sYXIvZmlsZXMuY2hhb3MvdGlsbHkvb2JqL2Rvc2Vfb2JqLmMKKyAgb2ItPlNldFByb3AoICJjcmVhdGlvbl9kYXRlIiwgY3JlYXRpb25fZGF0ZSApOworICBvYi0+U2V0KCAiY3JlYXRpb25fZGF0ZSIsIFNBVkV8U0VDVVJFRHxQUk9URUNURUQsIEZfTU9ERV9BUyApOworICAvLyB3ZW5uIGRlciBTcGllbGVyIG5vY2ggbmljaHQgaW0gTXVkIGdlc3BpZWx0IGhhdCwgd2lyZCBkaWUgYWt0dWVsbGUgWmVpdAorICAvLyBpbiBkaWUgZW50c3ByZWNoZW5kZSBQcm9wIGdlc2NocmllYmVuLiBEaWUgUHJvcCBpc3QgdHJhbnNpZW50IHVuZCB3aXJkCisgIC8vIGFic2ljaHRsaWNoIG5pY2h0IGdlc3BlaWNoZXJ0LgorICBpZiAobmV3YmllKQorICAgIG9iLT5TZXRQcm9wKCJfbGliX211ZF9uZXdiaWUiLCBjcmVhdGlvbl9kYXRlKTsKKworICBkZXN0cnVjdCggdGhpc19vYmplY3QoKSApOworfQorCisKKy8qCisgKiAgIFdpdGggYXJnID0gMCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGVudGVyZWQgb25jZSEKKyAqLworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgICBsb2dpbm5hbWUgPSAibG9nb24iOworICAgIGNyZWF0aW9uX2RhdGUgPSAtMTsKKyAgICBjYXRjaCggbG9hZF9vYmplY3QoICIvc2VjdXJlL21lcmxpbiIpO3B1Ymxpc2ggKTsKKyAgICBsb2dpbmZhaWxzID0gMDsKKyAgICByZWFsaXA9IiI7CisgICAgaWYgKGNsb25lcCgpKQorICAgICAgc2V0X25leHRfcmVzZXQoOTAwKTsKKyAgICBlbHNlCisgICAgICBzZXRfbmV4dF9yZXNldCgtMSk7Cit9CisKK3ZvaWQgcmVzZXQoKQoreworICBpZiAoY2xvbmVwKCkpCisgICAgcmVtb3ZlKCk7Cit9CisKK3B1YmxpYyBzdHJpbmcgc2hvcnQoKQoreworICAgIHJldHVybiAiPEVpbmxvZ2dlbmRlciBUZWlsbmVobWVyPi5cbiI7Cit9CisKKworcHVibGljIHN0cmluZyBxdWVyeV9yZWFsX25hbWUoKQoreworICAgIHJldHVybiAiPGxvZ29uPiI7Cit9CisKKworcHVibGljIG5vbWFzayBpbnQgcXVlcnlfcHJldmVudF9zaGFkb3coKQoreworICAgIHJldHVybiAxOworfQorCisKK3N0YXRpYyB2b2lkIHRpbWVfb3V0KCkKK3sKKyAgICBpZiAodGhpc19wbGF5ZXIoKSkKKyAgICAgIHRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksIlRpbWUgb3V0ISIpOworICAgIGRlc3RydWN0KCB0aGlzX29iamVjdCgpICk7Cit9CisKKworLy8gV2lyZCB2b24gc2ltdWxfZWZ1bnMgYmVudXR6dCwgdW0gbmVuIGR1bW15LVNwaWVsZXJvYmpla3QgenUgZXJ6ZXVnZW4uIE5pY2h0CisvLyBpbSBMb2dpbnByb3plc3MgaW52b2x2aWVydC4KK3B1YmxpYyBtaXhlZCBuZXdfbG9nb24oIHN0cmluZyBzdHIpCit7CisgICAgc2V0ZXVpZChnZXR1aWQoKSk7IC8vIHNvbnN0IGZ1bmt0IEFSQ0hfU0VDVVJJVFkgbmljaHQKKworICAgIGlmICggIUFSQ0hfU0VDVVJJVFkgfHwgcHJvY2Vzc19jYWxsKCkgKXsKKyAgICAgICAgd3JpdGUoICJOdXIgZnVlciBFcnptYWdpZXIgZXJsYXVidCFcbiIgKTsKKyAgICAgICAgZGVzdHJ1Y3QoIHRoaXNfb2JqZWN0KCkgKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmICggIXN0ciB8fCBzdHIgPT0gIiIgKXsKKyAgICAgICAgd3JpdGUoICJLZWluIE5hbWUgYW5nZWdlYmVuIVxuIiApOworICAgICAgICBkZXN0cnVjdCggdGhpc19vYmplY3QoKSApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBzdHIgPSBsb3dlcl9jYXNlKHN0cik7CisgICAgY2FwX25hbWUgPSBjYXBpdGFsaXplKHN0cik7CisKKyAgICBsb2dpbm5hbWUgPSBzdHI7CisgICAgc2V0ZXVpZChST09USUQpOworCisgICAgLyogcmVhZCB0aGUgc2VjdXJlIHNhdmUgZmlsZSB0byBzZWUgaWYgY2hhcmFjdGVyIGFscmVhZHkgZXhpc3RzICovCisgICAgaWYgKCAhcmVzdG9yZV9vYmplY3QoIG1hc3RlcigpLT5zZWN1cmVfc2F2ZWZpbGUobG9naW5uYW1lKSApICl7CisgICAgICAgIHdyaXRlKCAiS2VpbiBzb2xjaGVyIFNwaWVsZXIhXG4iICk7CisgICAgICAgIGRlc3RydWN0KCB0aGlzX29iamVjdCgpICk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgd3JpdGUoICJPaywgZGVyIFNwaWVsZXIgIiArIGNhcGl0YWxpemUoc3RyKSArICIgZXhpc3RpZXJ0IVxuIiApOworICAgICAgICByZXR1cm4gbmV3X2xvYWRfcGxheWVyX29iamVjdCgpOworICAgIH0KK30KKworLy8gV2lyZCB2b24gc2ltdWxfZWZ1bnMgYmVudXR6dCwgdW0gbmVuIGR1bW15LVNwaWVsZXJvYmpla3QgenUgZXJ6ZXVnZW4uIE5pY2h0CisvLyBpbSBMb2dpbnByb3plc3MgaW52b2x2aWVydC4KK3N0YXRpYyBtaXhlZCBuZXdfbG9hZF9wbGF5ZXJfb2JqZWN0KCkKK3sKKyAgICBpZiAoIGZpbmRfcGxheWVyKGxvZ2lubmFtZSkgfHwgZmluZF9uZXRkZWFkKGxvZ2lubmFtZSkgKXsKKyAgICAgICAgd3JpdGUoICJEZXIgU3BpZWxlciBpc3QgYmVyZWl0cyBvbmxpbmUgb2RlciBuZXR6dG90IVxuIiApOworICAgICAgICBkZXN0cnVjdCggdGhpc19vYmplY3QoKSApOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisKKyAgICAvKiByZWFkIHBsYXllciBvYmplY3QgZnJvbSBwYXNzd2QgZmlsZSAqLworICAgIGlmICggc3RyaW5ncChzaGVsbCkgJiYgc2hlbGwgIT0gIiIgKQorICAgICAgICByZXR1cm4gbmV3X2xvYWRfcGxheWVyX29iXzIoIHNoZWxsICk7CisgICAgZWxzZSB7CisgICAgICAgIHdyaXRlKCAiS2VpbmUgU2hlbGwgYW5nZWdlYmVuIVxuIiApOworICAgICAgICBkZXN0cnVjdCggdGhpc19vYmplY3QoKSApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKKy8vIFdpcmQgdm9uIHNpbXVsX2VmdW5zIGJlbnV0enQsIHVtIG5lbiBkdW1teS1TcGllbGVyb2JqZWt0IHp1IGVyemV1Z2VuLiBOaWNodAorLy8gaW0gTG9naW5wcm96ZXNzIGludm9sdmllcnQuCitzdGF0aWMgbWl4ZWQgbmV3X2xvYWRfcGxheWVyX29iXzIoIHN0cmluZyBvYm5hbWUgKQoreworICAgIG9iamVjdCBibHVlcHJpbnQ7CisgICAgc3RyaW5nIGVyciwgb2JfbmFtZTsKKyAgICBvYmplY3Qgb2IsIG9sZF9vYjsKKworICAgIHNldGV1aWQobG9naW5uYW1lKTsKKworICAgIC8qIGxvYWQgdGhlICJyZWFsIiBwbGF5ZXIgb2JqZWN0ICovCisgICAgLyogSWYgc29tZSBhc3Nob2xlIGhhcyBtb3ZlZCB0aGUgYmx1ZXByaW50ICovCisgICAgaWYgKCBvYmplY3RwKGJsdWVwcmludCA9IGZpbmRfb2JqZWN0KG9ibmFtZSkpICYmIGVudmlyb25tZW50KGJsdWVwcmludCkgKQorICAgICAgICBkZXN0cnVjdCggYmx1ZXByaW50ICk7CisKKyAgICBlcnIgPSBjYXRjaChvYiA9IGNsb25lX29iamVjdChvYm5hbWUpO3B1Ymxpc2gpOworCisgICAgaWYgKCBlcnIgKXsKKyAgICAgICAgbG9nX2ZpbGUoICJTSEVMTFMiLCAiRmFpbGVkIHRvIGxvYWQgc2hlbGwgIiArIG9ibmFtZSArICIsICIgKworICAgICAgICAgICAgICAgICAgZHRpbWUodGltZSgpKSArICIsICIgKyBsb2dpbm5hbWUgKyAiXG4iICsgZXJyICsgIlxuXG4iICk7CisKKyAgICAgICAgd3JpdGUoICJLb25udGUgZGFzIHBhc3NlbmRlIFBsYXllcm9iamVrdCBuaWNodCBsYWRlbi4gIgorICAgICAgICAgICAgICAgIkxhZGUgc3RhdHRkZXNzZW5cbmRhcyBPYmpla3QgTWVuc2NoIVxuIiApOworCisgICAgICAgIGVyciA9IGNhdGNoKG9iID0gY2xvbmVfb2JqZWN0KCAic3RkL3NoZWxscy9odW1hbiIgKTtwdWJsaXNoICk7CisgICAgfQorCisgICAgaWYgKCAhb2IgfHwgZXJyICl7CisgICAgICAgIHdyaXRlKCAiRXJyb3Igb24gbG9hZGluZyAiICsgc2hlbGwgKyAiXG5FcnJvciA9ICIgKyBlcnIgKyAiXG4iICk7CisgICAgICAgIGRlc3RydWN0KCB0aGlzX29iamVjdCgpICk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIG9iX25hbWUgPSBleHBsb2RlKCBvYmplY3RfbmFtZShvYiksICIjIiApWzBdOworCisgICAgaWYgKCBzaXplb2Yob2JfbmFtZSkgPiAxMSAmJiBvYl9uYW1lWzAuLjExXSA9PSAiL3N0ZC9zaGVsbHMvIiApCisgICAgICAgIG9iX25hbWUgPSBvYl9uYW1lWzExLi5dOworCisgICAgb2JfbmFtZSA9IG9iX25hbWUgKyAiOiIgKyBsb2dpbm5hbWU7CisKKyAgICBpZiAoIG9sZF9vYiA9IGZpbmRfb2JqZWN0KG9iX25hbWUpICl7CisgICAgICAgIGNhdGNoKCBvbGRfb2ItPnJlbW92ZSgpOyBwdWJsaXNoICk7CisKKyAgICAgICAgaWYgKCBvbGRfb2IgKQorICAgICAgICAgICAgZGVzdHJ1Y3QoIG9sZF9vYiApOworICAgIH0KKworICAgIHJlbmFtZV9vYmplY3QoIG9iLCBvYl9uYW1lICk7CisgICAgb2ItPl9fcmVsb2FkX2V4cGxvcmUoKTsKKyAgICBvYi0+c2V0X3JlYWxpcChyZWFsaXApOworICAgIG9iLT5zdGFydF9wbGF5ZXIoY2FwX25hbWUpOworICAgIG9iLT5TZXRQcm9wKCAiY3JlYXRpb25fZGF0ZSIsIGNyZWF0aW9uX2RhdGUgKTsKKyAgICBvYi0+U2V0KCAiY3JlYXRpb25fZGF0ZSIsIFNBVkV8U0VDVVJFRHxQUk9URUNURUQsIEZfTU9ERV9BUyApOworCisgICAgb2ItPm1vdmUoICIvcm9vbS9ub3doZXJlIiwgTV9OT0NIRUNLICk7CisgICAgc2V0X29iamVjdF9oZWFydF9iZWF0KCBvYiwgMCApOworICAgIGRlc3RydWN0KCB0aGlzX29iamVjdCgpICk7CisKKyAgICByZXR1cm4gb2I7Cit9CisKK3N0cmluZyBxdWVyeV9yZWFsaXAoKQoreworICByZXR1cm4gcmVhbGlwID8gcmVhbGlwIDogIiI7Cit9CisKK2ludCBxdWVyeV9pbnZpcygpCit7CisgIHJldHVybiBpbnZpczsKK30KKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL21haWxlci5jIGIvc2VjdXJlL21haWxlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MDFmYWMKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvbWFpbGVyLmMKQEAgLTAsMCArMSw2MzIgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBtYWlsZXIuYworLy8KKy8vICRJZDogbWFpbGVyLmMgOTU0NyAyMDE2LTA0LTE3IDE5OjI3OjQ3WiBaZXNzdHJhICQKKworLyoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUaGUgbWFpbCBkZW1vbi4gUmVjZWl2ZXMgbWFpbCBmcm9tIHVzZXJzIGFuZCBkZWxpdmVycyBpdCBpbnRvCisgKiB0aGUgbWFpbCBkaXJlY3RvcnkuCisgKgorICogRGVlcHRob3VnaHQsIE5pZ2h0ZmFsbCwgMjUtTWF5LTkyCisgKiBSZW1vdmUtRnVuY3Rpb25zIDogSm9mLCAyOS1KdW5lLTkyCisgKiBDYWNoaW5nLCBEZWxldGVVbnJlYWRGb2xkZXIsIHNtYWxsIGNoYW5nZXM6IExvY28sIDA4LUZlYi05NworICogR2VuZXJhbCBjbGVhbi11cCBhbmQgc3BlZWQtdXA6IFRpYW1haywgMTgtSmFuLTIwMDAKKyAqICAgRE9OJ1QgVVNFIHJlc3RvcmVfb2JqZWN0IGFueSBtb3JlLCB1c2UgR2V0Rm9sZGVycyBpbnN0ZWFkIQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgICAgU2F2ZSBmaWxlIGZvcm1hdCAoc29ydCBvZiBmb3JtYWwgbm90YXRpb24pOgorICoKKyAqICAgICBtaXhlZCAqZm9sZGVycyA9ICh7CisgKiAgICAgICAgKHsgc3RyaW5nIG5hbWUxOyBzdHJpbmcgbmFtZTI7IC4uLiBzdHJpbmcgbmFtZU47IH0pCisgKiAgICAgICAgKHsgbWl4ZWQgKm1zZ3MxOyBtaXhlZCAqbXNnczI7IC4uLiBtaXhlZCAqbXNnc047IH0pCisgKiAgICAgfSkKKyAqCisgKiAgICAgRWFjaCBtc2dzIGZpZWxkIGlzIGFuIGFycmF5IG9mIG1lc3NhZ2VzOgorICoKKyAqICAgICBtaXhlZCAqbXNncyA9ICh7IG1peGVkICptZXNzYWdlMTsgLi4uIG1peGVkICptZXNzYWdlTSB9KQorICoKKyAqICAgICBBIG1lc3NhZ2UgaXMgcmVwcmVzZW50ZWQgYXMgYW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIGZpZWxkczoKKyAqCisgKiAgICAgbWl4ZWQgKm1lc3NhZ2UgPSAoeworICogICAgICAgIHN0cmluZyBmcm9tOworICogICAgICAgIHN0cmluZyBzZW5kZXI7CisgKiAgICAgICAgc3RyaW5nIHJlY2lwaWVudDsKKyAqICAgICAgICBzdHJpbmcgKmNjOworICogICAgICAgIHN0cmluZyAqYmNjOworICogICAgICAgIHN0cmluZyBzdWJqZWN0OworICogICAgICAgIHN0cmluZyBkYXRlOworICogICAgICAgIHN0cmluZyBpZDsKKyAqICAgICAgICBzdHJpbmcgYm9keTsKKyAqICAgICB9KQorICoKKyAqICAgICBUaGUgbWFpbGVyIGRlbW9uICgvc2VjdXJlL21haWxlcikgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6CisgKgorICogICAgIHN0cmluZyAqRGVsaXZlck1haWwobWl4ZWQgKm1lc3NhZ2UpCisgKiAgICAgICBIYW5kIGEgbWFpbCBtZXNzYWdlIG92ZXIgdG8gdGhlIG1haWxlciBkZW1vbi4gVGhlIG1haWxlcgorICogICAgICAgZGVtb24gZXh0cmFjdHMgcmVjaXBpZW50cyBmcm9tIHRoZSByZWNpcGllbnQsIGNjIGFuZCBiY2MKKyAqICAgICAgIGZpZWxkcyBhbmQgcmVtb3ZlcyB0aGUgYmNjIGluZm9ybWF0aW9uLiBJdCB0aGVuIGRlcG9zaXRzCisgKiAgICAgICB0aGUgbWVzc2FnZSB0byB0aGUgbWFpbCBmaWxlcyBvZiBhbGwgcmVjaXBpZW50cy4gQSB2YWxpZAorICogICAgICAgbWVzc2FnZSBpcyBzaG93biBhYm92ZS4gUmV0dXJucyBhIGxpc3Qgb2Ygc3VjY2Vzc2Z1bGx5CisgKiAgICAgICBkZWxpdmVyZWQgcmVjaXBpZW50cy4KKyAqCisgKiAgICAgaW50IEZpbmdlck1haWwoc3RyaW5nIHVzZXIpCisgKiAgICAgICBHaXZlcyB0aGUgbnVtYmVyIG9mIHVucmVhZCBtZXNzYWdlcyBhIHVzZXIgaGFzLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgbm9fc2hhZG93CisjcHJhZ21hIG5vX2luaGVyaXQKKyNwcmFnbWEgdmVyYm9zZV9lcnJvcnMKKyNwcmFnbWEgcGVkYW50aWMKKyNwcmFnbWEgd2Fybl9kZXByZWNhdGVkCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxtYWlsLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisKKy8vIGRlYnVnZ2luZworI2RlZmluZSBERUJVRyhtc2cpIGlmICggZmluZF9wbGF5ZXIoInplc3N0cmEiKSApIFwKKyAgICAgICAgICAgICAgICAgICAgICB0ZWxsX29iamVjdCggZmluZF9wbGF5ZXIoInplc3N0cmEiKSwgIk1BSUxFUjogIittc2cgKQorI3VuZGVmIERFQlVHCisjZGVmaW5lIERFQlVHKHgpCisKKy8vIHdyaXRlIG91dCBhIG1lc3NhZ2UgdG8gdGhlIHJlY2lwaWVudAorI2RlZmluZSBOT1RJRllfUkVDSVBJRU5UCisvLyB3aG8gZ2V0cyB1bmRlbGl2ZXJhYmxlIG1haWw/CisjZGVmaW5lIEJPVU5DRV9BRERSICAgIm11ZEBtZy5tdWQuZGUiCisjZGVmaW5lIFNFQ1VSSVRZKHgpICAgKGdldGV1aWQoeCkgPT0gUk9PVElEIHx8IGdldGV1aWQoeCkgPT0gTUFJTElEKQorLy8gZmxhZyBmb3IgX0RlbGl2ZXJNYWlsCisjZGVmaW5lIE1BSUxfREVMQVlFRCAgIDQwOTYKKworLy8gcHJvdG90eXBlcworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCk7CitzdGF0aWMgaW50IEdldEZvbGRlcnMoIHN0cmluZyB1c2VyICk7CitzdGF0aWMgc3RyaW5nIF91bmlmeSggc3RyaW5nIHN0ciApOworc3RhdGljIHN0cmluZyAqdW5pZnkoIHN0cmluZyAqc3RyICk7CitzdGF0aWMgc3RyaW5nICpleHBhbmQoIHN0cmluZyAqYWRkciwgaW50IGV4cGEgKTsKK3N0YXRpYyBzdHJpbmcgX2ZpbHRlcl9hZGRyKCBzdHJpbmcgYWRkciApOworcHVibGljIHN0cmluZyAqRGVsaXZlck1haWwoIG1peGVkIG1zZywgaW50IGV4cGEgKTsKK3B1YmxpYyBpbnQgRmluZ2VyTWFpbCggc3RyaW5nIHVzZXIgKTsKK3N0YXRpYyB2b2lkIHNhdmVfbXNnKCBtaXhlZCBtc2csIHN0cmluZyB1c2VyICk7CitwdWJsaWMgaW50IFJlbW92ZU1zZyggaW50IG1zZywgaW50IGZvbGRlciwgc3RyaW5nIHVzZXIgKTsKK3B1YmxpYyBpbnQgTW92ZU1zZyggaW50IG1zZywgaW50IGZvbGRlciwgc3RyaW5nIG5ld2ZvbGRlciwgc3RyaW5nIHVzZXIgKTsKK3B1YmxpYyBpbnQgRGVsZXRlVW5yZWFkRm9sZGVyKCBzdHJpbmcgdXNlciApOworcHVibGljIGludCBSZW1vdmVGb2xkZXIoIHN0cmluZyBmb2xkZXIsIHN0cmluZyB1c2VyICk7CitwdWJsaWMgaW50IE1ha2VGb2xkZXIoIHN0cmluZyBmb2xkZXIsIHN0cmluZyB1c2VyICk7CitwdWJsaWMgaW50IHF1ZXJ5X3JlY2lwaWVudF9vayggc3RyaW5nIG5hbWUgKTsKK3B1YmxpYyB2b2lkIGRlbGl2ZXJfbWFpbCggc3RyaW5nIHJlY2lwaWVudCwgc3RyaW5nIGZyb20sIHN0cmluZyBzdWJqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbWFpbF9ib2R5ICk7CisKKworbWl4ZWQgKmZvbGRlcnM7ICAgICAgICAgICAgICAgIC8qIHVzZWQgZm9yIHNhdmUgYW5kIHJlc3RvcmUgb2YgbWFpbCBmaWxlcyAqLworc3RhdGljIG1hcHBpbmcgYWxpYXM7CitzdGF0aWMgc3RyaW5nIGNhY2hlZG5hbWU7IC8qIHdob3NlIGZvbGRlciBpcyBzdGlsbCBpbiBtZW1vcnk/ICovCisKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgICBtaXhlZCB0bXA7CisgICAgaW50IGk7CisgICAgc3RyaW5nIHMxLCBzMjsKKyAgCisgICAgc2V0ZXVpZChST09USUQpOworICAgIGFsaWFzPShbXSk7CisgICAgCisgICAgaWYgKCB0bXAgPSByZWFkX2ZpbGUoIi9tYWlsL3N5c3RlbS5tYWlscmMiKSApeworICAgICAgICB0bXAgPSBleHBsb2RlKCB0bXAsICJcbiIgKTsKKyAgICAgICAgCisgICAgICAgIGZvciAoIGkgPSBzaXplb2YodG1wKTsgaS0tOyApCisgICAgICAgICAgICBpZiAoIHNzY2FuZiggdG1wW2ldLCAiJXMgJXMiLCBzMSwgczIgKSA9PSAyICkKKyAgICAgICAgICAgICAgICBhbGlhc1tzMV0gPSBzMjsKKyAgICB9Cit9CisKKworLy8gR2V0Rm9sZGVycyBsYWVkdCBlaW5lbiBmb2xkZXIsIHdlbm4gZXIgbmljaHQgaW0gY2FjaGUgaXN0LCB1bmQgZ2lidAorLy8gMCB6dXJ1ZWNrLCB3ZW5uIGRlciBmb2xkZXIgbmljaHQgdm9yaGFuZGVuIG9kZXIgZXZ0bCBhdWNoIGxlZXIgaXN0LgorLy8gU2lubjogVm9yIGFsbGVtIGJlaSBMaXN0ZW5hcmd1bWVudGVuIGltIG1haWxlciBrYW5uIGVzIGxlaWNodCB2b3Jrb21tZW4sCisvLyBkYXNzIGRhc3NlbGJlIG1haWxmaWxlIGVpbmlnZSBNYWxlIGhpbnRlcmVpbmFuZGVyIGdlYnJhdWNodCB3aXJkLgorCitzdGF0aWMgaW50IEdldEZvbGRlcnMoIHN0cmluZyB1c2VyICkKK3sKKyAgICBpZiAoIHVzZXIgPT0gY2FjaGVkbmFtZSApeworICAgICAgICBERUJVRyggIlVzaW5nIGNhY2hlZCBmb2xkZXIgZm9yICIgKyB1c2VyICsgIlxuIiApOworICAgICAgICByZXR1cm4gc2l6ZW9mKGZvbGRlcnNbMV0pOworICAgIH0KKyAgICAKKyAgICBjYWNoZWRuYW1lID0gdXNlcjsKKyAgICAKKyAgICBpZiAoICFyZXN0b3JlX29iamVjdCggTUFJTFBBVEggKyAiLyIgKyB1c2VyWzAuLjBdICsgIi8iICsgdXNlciApICl7CisgICAgICAgIERFQlVHKCAiTG9hZGluZyBmb2xkZXI6ICIgKyB1c2VyICsgIiAoZW1wdHkpXG4iICk7CisgICAgICAgIGZvbGRlcnMgPSAoeyAoe30pLCAoe30pIH0pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgCisgICAgREVCVUcoICJMb2FkaW5nIGZvbGRlcjoiICsgdXNlciArICJcbiIgKTsKKyAgICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgc3RyaW5nIF91bmlmeSggc3RyaW5nIHN0ciApCit7CisgICAgcmV0dXJuIHN0clswXSA9PSAnXFwnID8gc3RyWzEuLl0gOiBzdHI7Cit9CisKKworc3RhdGljIHN0cmluZyAqdW5pZnkoIHN0cmluZyAqc3RyICkKK3sKKyAgICBpZiAoICFwb2ludGVycChzdHIpICkKKyAgICAgICAgcmV0dXJuICh7fSk7CisgICAgCisgICAgc3RyID0gbWFwKCBmaWx0ZXIoIHN0ciwgIydzdHJpbmdwLyonKi8gKSwgIydsb3dlcl9jYXNlLyonKi8gKTsKKyAgICBzdHIgPSBtYXAoIHN0ciwgIl91bmlmeSIsIHRoaXNfb2JqZWN0KCkgKTsKKworICAgIHJldHVybiBtX2luZGljZXMoIG1rbWFwcGluZyhzdHIpICk7Cit9CisKKworI2RlZmluZSBNR19OQU1FUyAoeyBNVUROQU1FLCAibWciLCAibW9yZ2VuZ3JhdWVuIiwgIm11ZCIsICJtZy5tdWQuZGUiIH0pCisKK3N0cmluZyBleHBhbmRTeXN0ZW1SZWN1cnNpdmUoc3RyaW5nIGFkZHIsaW50IG1heHJlYyl7CisgIHN0cmluZyAqbGlzdCwqdGxpc3Q7CisgIHN0cmluZyByZXQsdG1wOworICBpbnQgaSxzaXplOworICAKKyAgaWYobWF4cmVjPjggfHwgIWFkZHIpeworICAgIHJldHVybiBhZGRyOworICB9CisgIG1heHJlYysrOworICAKKyAgdGxpc3Q9KHt9KTsKKyAgcmV0PSIiOworCisgIGxpc3Q9ZXhwbG9kZShhZGRyLCIsIik7CisgIGxpc3QtPSh7IiJ9KTsKKyAgc2l6ZT1zaXplb2YobGlzdCk7CisgIGZvcihpPTA7aTxzaXplO2krKyl7CisgICAgaWYodG1wPWFsaWFzW2xpc3RbaV1dKXsKKyAgICAgIHRsaXN0Kz1leHBsb2RlKHRtcCwiLCIpOworICAgIH0KKyAgICBlbHNleworICAgICAgdGxpc3QrPSh7bGlzdFtpXX0pOworICAgIH0KKyAgfQorICB0bGlzdC09KHsiIn0pOyAgCisgIHJldD1pbXBsb2RlKHRsaXN0LCIsIik7CisKKyAgaWYoKHJldCE9YWRkcikhPTApeworICAgIHJldD1leHBhbmRTeXN0ZW1SZWN1cnNpdmUocmV0LG1heHJlYyk7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworLy8gZXhwYTogYWxzbyBkbyBhbGlhcyBhbmQgZm9yd2FyZC1leHBhbnNpb24/IChmb3IgaW5ib3VuZCBleHRlcm5hbCBtYWlsKQorLy8gZXhwYSA9PSAwIG1lYW5zIGZ1bGwgZXhwYW5zaW9uLCBrbm93biBmbGFncyBhcmUgTk9fU1lTVEVNX0FMSUFTRVMKKy8vIGFuZCBOT19VU0VSX0FMSUFTRVMKK3N0YXRpYyBzdHJpbmcgKmV4cGFuZCggc3RyaW5nICphZGRyLCBpbnQgZXhwYSApCit7CisgICAgc3RyaW5nIHRtcCwgKm5ldywgKnJldDsKKyAgICBpbnQgaTsKKyAgICBjbG9zdXJlIHFmOworCisgICAgcmV0ID0gKHt9KTsKKyAgICBhZGRyIC09ICh7IiJ9KTsKKyAgICBxZiA9IHN5bWJvbF9mdW5jdGlvbiggIlF1ZXJ5Rm9yd2FyZCIsIEZXU0VSViApOworCisgICAgZm9yICggaSA9IHNpemVvZihhZGRyKTsgaS0tOyApeworICAgICAgICBhZGRyW2ldID0gbG93ZXJfY2FzZSggYWRkcltpXSApOworICAgICAgICAvLyBAbW9yZ2VuZ3JhdWVuLW5hbWVuIHdlcmRlbiBsb2thbCB6dWdlc3RlbGx0LgorICAgICAgICBpZiAoIHNpemVvZihuZXcgPSBleHBsb2RlKCBhZGRyW2ldLCAiQCIgKSkgPT0gMiAgJiYKKyAgICAgICAgICAgICBtZW1iZXIoIE1HX05BTUVTLCBuZXdbMV0gKSAhPSAtMSApCisgICAgICAgICAgICBhZGRyW2ldID0gbmV3WzBdOworCisgICAgICAgIGlmICggIShleHBhICYgTk9fU1lTVEVNX0FMSUFTRVMpICYmIHRtcCA9IGV4cGFuZFN5c3RlbVJlY3Vyc2l2ZShhZGRyW2ldLDApICl7CisgICAgICAgICAgICByZXQgKz0gZXhwbG9kZSggdG1wLCAiLCIgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXQgKz0gKHsgYWRkcltpXSB9KTsKKyAgICB9CisgICAgCisgICAgZm9yICggaSA9IHNpemVvZihyZXQpOyBpLS07ICl7CisgICAgICAgIGlmICggcmV0W2ldWzBdID09ICdcXCcgKQorICAgICAgICAgICAgcmV0W2ldID0gcmV0W2ldWzEuLl07CisgICAgICAgIGVsc2UgaWYgKCAhKGV4cGEgJiBOT19VU0VSX0FMSUFTRVMpICkKKyAgICAgICAgICAgIHJldCA9IHJldCAtICh7IHJldFtpXSB9KSArCisgICAgICAgICAgICAgICAgZXhwbG9kZSggZnVuY2FsbCggcWYsIHJldFtpXSApLCAiLCIgKTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgc3RyaW5nIF9maWx0ZXJfYWRkciggc3RyaW5nIGFkZHIgKQoreworICAgIGFkZHIgPSByZWdyZXBsYWNlKCBhZGRyLCAiW148XSo8KC4qKT5bXj5dKiIsICJcXDEiLCAwKTsKKyAgICByZXR1cm4gcmVncmVwbGFjZSggYWRkciwgIiAqKFteIF1bXiBdKikuKiIsICJcXDEiLCAwKTsKK30KKworI2lmZGVmIElOVEVSTkVUX01BSUxfRU5BQkxFRAorI2RlZmluZSBGT09URVIgXAorICAgICJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iIFwKKyAgICAiKiBNb3JnZW5HcmF1ZW4gTWFpbFJlbGF5IHYxLjAgLSBQcm9jZXNzZWQgJXMsICVzICpcbiIgXAorICAgICIqIE1vcmdlbkdyYXVlbiAtIG1nLm11ZC5kZSAyMyAtICAgICAgICAgICAgICAgICAgODcuNzkuMjQuNjAgMjMgKlxuIiBcCisgICAgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIgorI2VuZGlmCisKK3B1YmxpYyBzdHJpbmcgKkRlbGl2ZXJNYWlsKCBtaXhlZCBtc2csIGludCBleHBhICkKK3sKKyAgICBzdHJpbmcgc2VuZGVyLCAqcmVjaXBpZW50cywgKnJlY29rLCB0LCAqdG1wOworICAgIG1peGVkICpuZXdtc2c7CisgICAgaW50IGk7CisjaWZkZWYgSU5URVJORVRfTUFJTF9FTkFCTEVECisgICAgaW50IGV4dDsKKyNlbmRpZgorCisgICAgaWYgKCAhcG9pbnRlcnAobXNnKSB8fCBzaXplb2YobXNnKSAhPSA5ICkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBERUJVRyggc3ByaW50ZiggIkRlbGl2ZXJNYWlsOiAlTyAlT1xuIiwgbXNnWzAuLjRdICsoezB9KSsgbXNnWzYuLjddLCBleHBhICkgKTsKKyAgICB0ID0gY3RpbWUodGltZSgpKTsKKworICAgIC8vIE9obmUgRW1wZmFlbmdlciB3aXJkIGFiZ2Vicm9jaGVuCisgICAgaWYgKCFzdHJpbmdwKG1zZ1tNU0dfUkVDSVBJRU5UXSkpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCAhKGV4cGEgJiBNQUlMX0RFTEFZRUQpICl7CisgICAgICAgIC8qIGRldGVybWluZSB0aGUgcmVhbCBzZW5kZXIgKi8KKyAgICAgICAgaWYgKCBleHRlcm5fY2FsbCgpICYmIG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKVswLi43XSAhPSAiL3NlY3VyZS8iICkKKyAgICAgICAgICAgIHNlbmRlciA9IGdldHVpZCggdGhpc19pbnRlcmFjdGl2ZSgpIHx8IHByZXZpb3VzX29iamVjdCgpICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNlbmRlciA9IG1zZ1tNU0dfU0VOREVSXTsgICAgICAgIAorCisgICAgICAgIC8qIG1ha2UgYSBsaXN0IG9mIGFsbCByZWNpcGllbnRzICovCisgICAgICAgIHJlY2lwaWVudHMgPSAoeyBtc2dbTVNHX1JFQ0lQSUVOVF0gfSk7CisgICAgICAgIAorICAgICAgICBpZiAoICEoZXhwYSAmIE5PX0NBUkJPTl9DT1BJRVMpICl7CisgICAgICAgICAgICBpZiAoIHBvaW50ZXJwKG1zZ1tNU0dfQ0NdKSApCisgICAgICAgICAgICAgICAgcmVjaXBpZW50cyArPSBtc2dbTVNHX0NDXTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCBwb2ludGVycChtc2dbTVNHX0JDQ10pICkKKyAgICAgICAgICAgICAgICByZWNpcGllbnRzICs9IG1zZ1tNU0dfQkNDXTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE1haWwtQWxpYXNlIGVyc2V0emVuCisgICAgICAgIHJlY2lwaWVudHMgPSBleHBhbmQoIHJlY2lwaWVudHMsIGV4cGEgKTsKKyAgICAKKyAgICAgICAgLy8gZG9wcGVsdGUgQWRyZXNzZW4gbG9lc2NoZW4gKG5lYmVuYmVpOiBhdWYgS2xlaW5zY2hyZWlidW5nIHdhbmRlbG4pCisgICAgICAgIHJlY2lwaWVudHMgPSB1bmlmeSggcmVjaXBpZW50cyApOworICAgIAorICAgICAgICAvLyBSZWFsbmFtZW4gdW5kIEtvbW1lbnRhcmUgZW50ZmVybmVuCisgICAgICAgIHJlY2lwaWVudHMgPSBtYXAoIHJlY2lwaWVudHMsICJfZmlsdGVyX2FkZHIiLCB0aGlzX29iamVjdCgpICk7CisgICAgCisgICAgICAgIC8vIGF1ZiB1bmd1ZWx0aWdlIFplaWNoZW4gY2hlY2tlbgorICAgICAgICBpZiAoIHNpemVvZih0bXAgPSByZWdleHAoIHJlY2lwaWVudHMsICJeWy1fLkBhLXowLTldKiQiICkpCisgICAgICAgICAgICAgIT0gc2l6ZW9mKHJlY2lwaWVudHMpICl7CisgICAgICAgICAgICB0bXAgPSByZWNpcGllbnRzIC0gdG1wOworICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgKCBpID0gc2l6ZW9mKHRtcCk7IGktLTsgKQorICAgICAgICAgICAgICAgIGxvZ19maWxlKCAiTUFJTF9JTlZBTElEIiwgc3ByaW50ZiggIiVzOiBNYWlsIHZvbiAlTyAoJU8pIGFuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInJU8nLlxuIiwgZHRpbWUodGltZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ1tNU0dfRlJPTV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXIsIHRtcFtpXSApICk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJlY2lwaWVudHMgLT0gdG1wOworICAgICAgICB9CisKKyAgICAgLy8gY2hlY2sgZm9yIHZhbGlkIFN1YmplY3QgYW5kIEJvZHkKKyAgICAgaWYgKCFzdHJpbmdwKG1zZ1tNU0dfU1VCSkVDVF0pKQorICAgICAgICAgbXNnW01TR19TVUJKRUNUXSA9ICIobm8gc3ViamVjdCBnaXZlbikiOworICAgICBpZiAoIXN0cmluZ3AobXNnW01TR19CT0RZXSkpCisgICAgICAgICBtc2dbTVNHX0JPRFldID0KKyAgICAgICAgICAgIlxuXG5Tb3JyeSAtIFRoaXMgbWFpbCB3YXMgZGVsaXZlcmVkIHdpdGhvdXQgYSBtYWlsIGJvZHlcblxuIjsKKworICAgICAgICBERUJVRyggc3ByaW50ZiggIk5FRUQgVE8gREVMSVZFUiBUTyAlT1xuIiwgcmVjaXBpZW50cyApICk7CisKKyAgICAgICAgLyogYnVpbGQgdGhlIG5ldyBtZXNzYWdlICovCisgICAgICAgIG5ld21zZyA9ICh7IG1zZ1tNU0dfRlJPTV0sIHNlbmRlciwgbXNnW01TR19SRUNJUElFTlRdLAorICAgICAgICAgICAgICAgICAgICAgICAgbXNnW01TR19DQ10sICIiLCBtc2dbTVNHX1NVQkpFQ1RdLAorICAgICAgICAgICAgICAgICAgICAgICAgZHRpbWUodGltZSgpKSwgTVVETkFNRSArICI6IiArIHRpbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZ1tNU0dfQk9EWV0gfSk7CisgICAgfQorICAgIAorICAgIC8qIFNlbmQgaXQgb2ZmIC4uLiAqLworICAgIHJlY29rID0gKHsgfSk7CisKKyAgICAvLyBBQ0hUVU5HOiBkdXJjaCBleHBhbmQoKSBnZWFlbmRlcnRlIEFkcmVzc2VuIHdlcmRlbiB6dWdlc3RlbGx0LAorICAgIC8vIGFiZXIgZHVyY2ggL21haWwvbWFpbGVyLmMgenVzYWV0emxpY2ggYWxzIHVuenVzdGVsbGJhciBnZW5hbm50IQorICAgIAorICAgIGZvciAoIGkgPSBzaXplb2YocmVjaXBpZW50cyk7IGktLSAvKiYmIGdldF9ldmFsX2Nvc3QoKSA+IDUwMDAwMCovOyApeworICAgICAgICBERUJVRyggc3ByaW50ZiggIkJlZ2luIGRlbGl2ZXJpbmcgdG8gJXMuIEV2YWxjb3N0cyBsZWZ0OiAlZC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICByZWNpcGllbnRzW2ldLCBnZXRfZXZhbF9jb3N0KCkgKSApOworICAgICAgICBpZiAoIG1lbWJlciggcmVjaXBpZW50c1tpXSwgJ0AnICkgPiAwICYmCisgICAgICAgICAgICAgc3Ryc3RyKCByZWNpcGllbnRzW2ldLCAiZGFlbW9uIiApIDwgMCApIHsKKyAgICAgICAgICAgIHN0cmluZyByZWMsIG11ZDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgdG1wID0gZXhwbG9kZSggcmVjaXBpZW50c1tpXSwgIkAiICk7CisgICAgICAgICAgICBtdWQgPSB0bXBbMV07CisgICAgICAgICAgICByZWMgPSB0bXBbMF07CisgICAgICAgICAgICBzZW5kZXIgPSByZWdyZXBsYWNlKCBzZW5kZXIsICJAIiwgIiUiLCAxICk7CisgICAgICAgICAgICAvLyBadXN0ZWxsdW5nIHZpYSBJbnRlcm11ZC1NYWlsIGFuIGFuZGVyZSBNdWRzLgorICAgICAgICAgICAgaWYgKCBtZW1iZXIoIG11ZCwgJy4nICkgPT0gLTEgKSB7CisgICAgICAgICAgICAgICAgIi9zZWN1cmUvdWRwX21haWwiLT5kZWxpdmVyX21haWwoIHJlYywgbXVkLCBzZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ1tNU0dfU1VCSkVDVF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ1tNU0dfQk9EWV0gKTsKKyAgICAgICAgICAgICAgICByZWNvayArPSAoeyByZWNpcGllbnRzW2ldIH0pOworICAgICAgICAgICAgfQorI2lmZGVmIElOVEVSTkVUX01BSUxfRU5BQkxFRAorICAgICAgICAgICAgLy8gWnVzdGVsbHVuZyBpbiBkZW4gUmVzdCBkZXMgSW50ZXJuZXRzLgorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgZXh0ID0gMTsKKyAgICAgICAgICAgICAgICBzZW5kZXIgPSBleHBsb2RlKCBzZW5kZXIsICIlIiApWzBdOworICAgICAgICAgICAgICAgIHJlYyA9IGV4cGxvZGUoIHJlZ3JlcGxhY2UoIHJlYywgIkAiLCAiJSIsIDEgKSwgIiUiIClbMF07CisgICAgICAgICAgICAgICAgbXVkID0gZXhwbG9kZSggcmVncmVwbGFjZSggbXVkLCAiQCIsICIlIiwgMSApLCAiJSIgKVswXTsKKworICAgICAgICAgICAgICAgIHdyaXRlX2ZpbGUoIHNwcmludGYoICIvbWFpbC9vdXRib3VuZC8lcy4lZC0lZC0lZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZGVyLCB0aW1lKCksIGksIHJhbmRvbSgxMjM0NTYpICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggIiVzXG4lc0Alc1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdWJqZWN0OiAlc1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICJYLU1VRC1Gcm9tOiAlc1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICJYLU1VRC1UbzogJXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiWC1NVUQtQ2M6ICVzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgIlgtTVUtU3ViamVjdDogJXNcblxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXIsIHJlYywgbXVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ1tNU0dfU1VCSkVDVF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZGVyLCByZWNpcGllbnRzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJwKG1zZ1tNU0dfQ0NdKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbG9kZSggbXNnW01TR19DQ10sICIsIiApIDogIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnW01TR19TVUJKRUNUXSApICsgbXNnW01TR19CT0RZXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggRk9PVEVSLCB0WzQuLjEwXSArIHRbMjAuLl0sIHRbMTEuLjE4XSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXG4iICk7CisgICAgICAgICAgICAgICAgcmVjb2sgKz0gKHsgcmVjaXBpZW50c1tpXSB9KTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBJTlRFUk5FVF9NQUlMX0VOQUJMRUQKKworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlmICggZmlsZV9zaXplKCBTQVZFUEFUSCArIHJlY2lwaWVudHNbaV1bMC4uMF0gKyAiLyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2lwaWVudHNbaV0gKyAiLm8iICkgPj0wICl7CisgICAgICAgICAgICAgICAgc2F2ZV9tc2coIG5ld21zZywgcmVjaXBpZW50c1tpXSApOworICAgICAgICAgICAgICAgIHJlY29rICs9ICh7IHJlY2lwaWVudHNbaV0gfSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgKnRtcG1zZyA9IGNvcHkobmV3bXNnKTsKKyAgICAgICAgICAgICAgICB0bXBtc2dbTVNHX0JPRFldID0gIi0tLSBUZXh0IGRlciBNYWlsIGdlbG9lc2NodC4gLS0tXG4iOworICAgICAgICAgICAgICAgIHdyaXRlX2ZpbGUoIHNwcmludGYoICIvbWFpbC9vdXRib3VuZC9wb3N0bWFzdGVyLiVkLSVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lKCksIHJhbmRvbSh0aW1lKCkpICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggInBvc3RtYXN0ZXJcbiIgKyBCT1VOQ0VfQUREUiArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcblN1YmplY3Q6IFVuZGVsaXZlcmFibGUgTWFpbFxuJU9cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wbXNnKSApOworICAgICAgICAgICAgfQorICAgICAgICBERUJVRyggc3ByaW50ZiggIkVuZCBkZWxpdmVyaW5nIHRvICVzLiBFdmFsY29zdHMgbGVmdDogJWQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVjaXBpZW50c1tpXSwgZ2V0X2V2YWxfY29zdCgpICkgKTsKKyAgICB9CisjaWZkZWYgSU5URVJORVRfTUFJTF9FTkFCTEVECisgICAgaWYgKCBleHQgKQorICAgICAgICBzZW5kX3VkcCggVURQU0VSViwgNDEyMywgIkRFTElWRVJNQUlMIiApOworI2VuZGlmCisgICAgcmV0dXJuIHJlY29rOworfQorCisKK3B1YmxpYyBpbnQgRmluZ2VyTWFpbCggc3RyaW5nIHVzZXIgKQoreworICAgIGludCBuZXdmb2xkZXIsIGk7CisKKyAgICAvL1p1Z3JpZmYgYmVzY2hyYWVua2VuLCBaYWhsIGRlciBnZWxlc2VuZW4gTWFpbHMgaXN0IFByaXZhdHNwaGFlcmUKKyAgICBpZiAoIW9iamVjdHAodGhpc19pbnRlcmFjdGl2ZSgpKSB8fCAhc3RyaW5ncCh1c2VyKSB8fCAhc2l6ZW9mKHVzZXIpKSAKKyAgICAgcmV0dXJuKC0xKTsKKyAgICBpZiAoKGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpIT11c2VyKSAmJgorICAgICAocHJvY2Vzc19jYWxsKCkgfHwgIUFSQ0hfU0VDVVJJVFkpKSByZXR1cm4oLTEpOworCisgICAgaWYgKCAhR2V0Rm9sZGVycyh1c2VyKSApCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCAobmV3Zm9sZGVyID0gbWVtYmVyKGZvbGRlcnNbMF0sInVucmVhZCIpKSAhPSAtMSApCisgICAgICAgIHJldHVybiBzaXplb2YoZm9sZGVyc1sxXVtuZXdmb2xkZXJdKTsKKworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIHNhdmVfbXNnKCBtaXhlZCBtc2csIHN0cmluZyB1c2VyICkKK3sKKyAgICBpbnQgbmV3Zm9sZGVyOworICAgIG9iamVjdCBwOworICAKKyAgICBHZXRGb2xkZXJzKCB1c2VyICk7CisKKyAgICAvKiBpZiBmb2xkZXIgJ3VucmVhZCcgZG9lc24ndCBleGlzdCwgY3JlYXRlIGl0ICovCisgICAgbmV3Zm9sZGVyID0gbWVtYmVyKCBmb2xkZXJzWzBdLCAidW5yZWFkIik7CisgICAgCisgICAgaWYgKCBuZXdmb2xkZXIgPT0gLTEgKXsKKyAgICAgICAgZm9sZGVyc1swXSArPSAoeyAidW5yZWFkIiB9KTsKKyAgICAgICAgZm9sZGVyc1sxXSArPSAoeyAoeyB9KSB9KTsKKyAgICAgICAgbmV3Zm9sZGVyID0gbWVtYmVyKCBmb2xkZXJzWzBdLCAidW5yZWFkIik7CisgICAgfQorICAgIAorICAgIGZvbGRlcnNbMV1bbmV3Zm9sZGVyXSArPSAoeyBtc2cgfSk7CisgICAgc2F2ZV9vYmplY3QoIE1BSUxQQVRIICsgdXNlclswLi4wXSArICIvIiArIHVzZXIgKTsKKyNpZmRlZiBOT1RJRllfUkVDSVBJRU5UCisgICAgaWYgKCBwID0gZmluZF9wbGF5ZXIodXNlcikgKQorICAgICAgICB0ZWxsX29iamVjdCggcCwgIkVpbiBQb3N0cmVpdGVyIHJ1ZnQgRGlyIGF1cyBlaW5pZ2VyIEVudGZlcm51bmcgenUsICIKKyAgICAgICAgICAgICAgICAgICAgICJkYXNzIER1IG5ldWUgUG9zdCBoYXN0IVxuIiApOworI2VuZGlmCit9CisKKworLyogUmVtb3ZlIGEgbWVzc2FnZSBmcm9tIGEgZm9sZGVyICovCitwdWJsaWMgaW50IFJlbW92ZU1zZyggaW50IG1zZywgaW50IGZvbGRlciwgc3RyaW5nIHVzZXIgKQoreworICAgIGlmICggIVNFQ1VSSVRZKHByZXZpb3VzX29iamVjdCgpKSApCisgICAgICAgIHJldHVybiAtMjsKKworICAgIGlmICggIUdldEZvbGRlcnModXNlcikgKSAKKyAgICAgICAgcmV0dXJuIC0xOyAvKiBObyBzdWNoIGZvbGRlciAqLworCisgICAgaWYgKCAhcG9pbnRlcnAoZm9sZGVycykgfHwgIXBvaW50ZXJwKGZvbGRlcnNbMF0pIHx8IAorICAgICAgICAgZm9sZGVyID49IHNpemVvZihmb2xkZXJzWzBdKSApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGlmICggbXNnIDwgMCB8fCBzaXplb2YoZm9sZGVyc1sxXVtmb2xkZXJdKSA8PSBtc2cgKQorICAgICAgICByZXR1cm4gMDsgLyogTm8gc3VjaCBtc2cgKi8KKworICAgIGZvbGRlcnNbMV1bZm9sZGVyXVttc2cuLm1zZ10gPSAoe30pOworICAgIAorICAgIHNhdmVfb2JqZWN0KCBNQUlMUEFUSCArIHVzZXJbMC4uMF0gKyAiLyIgKyB1c2VyICk7CisgICAgcmV0dXJuIDE7IC8qIFN1Y2Nlc3MgKi8KK30KKworCisvKiBNb3ZlIG1lc3NhZ2UgaW50byBhbm90aGVyIGZvbGRlciAqLworcHVibGljIGludCBNb3ZlTXNnKCBpbnQgbXNnLCBpbnQgZm9sZGVyLCBzdHJpbmcgbmV3Zm9sZGVyLCBzdHJpbmcgdXNlciApCit7CisgICAgaW50IHRhcmdldDsKKworICAgIGlmICggIVNFQ1VSSVRZKHByZXZpb3VzX29iamVjdCgpKSApCisgICAgICAgIHJldHVybiAtMjsKKworICAgIGlmICggIUdldEZvbGRlcnModXNlcikgKQorICAgICAgICByZXR1cm4gLTE7IC8qIFNvdXJjZSBmb2xkZXIgbm90IGZvdW5kICovCisKKyAgICBpZiAoICFwb2ludGVycChmb2xkZXJzKSB8fCAhcG9pbnRlcnAoZm9sZGVyc1swXSkgfHwgCisgICAgICAgICBmb2xkZXIgPj0gc2l6ZW9mKGZvbGRlcnNbMF0pICkKKyAgICAgICAgcmV0dXJuIC0xOworICAKKyAgICBpZiAoIG1zZyA8IDAgfHwgc2l6ZW9mKGZvbGRlcnNbMV1bZm9sZGVyXSkgPD0gbXNnICkKKyAgICAgICAgcmV0dXJuIDA7IC8qIE5vIHN1Y2ggbXNnICovCisKKyAgICBpZiAoICh0YXJnZXQgPSBtZW1iZXIoZm9sZGVyc1swXSwgbmV3Zm9sZGVyKSkgPT0gLTEgKQorICAgICAgICByZXR1cm4gLTM7CisKKyAgICBpZiAoIHRhcmdldCA9PSBmb2xkZXIgKQorICAgICAgICByZXR1cm4gMTsKKworICAgIGlmICggIXBvaW50ZXJwKGZvbGRlcnNbMV1bdGFyZ2V0XSkgKSAKKyAgICAgICAgZm9sZGVyc1sxXVt0YXJnZXRdID0gKHsgZm9sZGVyc1sxXVtmb2xkZXJdW21zZ10gfSk7CisgICAgZWxzZSAKKyAgICAgICAgZm9sZGVyc1sxXVt0YXJnZXRdICs9ICh7IGZvbGRlcnNbMV1bZm9sZGVyXVttc2ddIH0pOworCisgICAgcmV0dXJuIFJlbW92ZU1zZyggbXNnLCBmb2xkZXIsIHVzZXIgKTsKK30KKworCitwdWJsaWMgaW50IERlbGV0ZVVucmVhZEZvbGRlciggc3RyaW5nIHVzZXIgKQoreworICAgIGludCB1bnJlYWQsIG5ld21haWw7CisKKyAgICBpZiAoICFTRUNVUklUWShwcmV2aW91c19vYmplY3QoKSkgKQorICAgICAgICByZXR1cm4gLTI7CisKKyAgICBpZiAoICFHZXRGb2xkZXJzKHVzZXIpICkKKyAgICAgICAgcmV0dXJuIC0xOyAvKiBTb3VyY2UgZm9sZGVyIG5vdCBmb3VuZCAqLworCisgICAgaWYgKCAodW5yZWFkID0gbWVtYmVyKCBmb2xkZXJzWzBdLCAidW5yZWFkIikpID09IC0xICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgCisgICAgaWYgKCAobmV3bWFpbCA9IG1lbWJlciggZm9sZGVyc1swXSwgIm5ld21haWwiKSkgPT0gLTEgKXsKKyAgICAgICAgZm9sZGVyc1swXSArPSAoeyAibmV3bWFpbCIgfSk7CisgICAgICAgIGZvbGRlcnNbMV0gKz0gKHsoe30pfSk7IAorICAgICAgICBuZXdtYWlsID0gc2l6ZW9mKGZvbGRlcnNbMV0pIC0gMTsKKyAgICB9CisgICAgCisgICAgaWYgKCAhcG9pbnRlcnAoZm9sZGVyc1sxXVtuZXdtYWlsXSkgKQorICAgICAgICBmb2xkZXJzWzFdW25ld21haWxdID0gKHt9KTsKKyAgICAKKyAgICBpZiAoIHBvaW50ZXJwKGZvbGRlcnNbMV1bdW5yZWFkXSkgKQorICAgICAgICBmb2xkZXJzWzFdW25ld21haWxdICs9IGZvbGRlcnNbMV1bdW5yZWFkXTsKKyAgICAKKyAgICBmb2xkZXJzWzBdW3VucmVhZC4udW5yZWFkXSA9ICh7fSk7CisgICAgZm9sZGVyc1sxXVt1bnJlYWQuLnVucmVhZF0gPSAoe30pOworCisgICAgc2F2ZV9vYmplY3QoIE1BSUxQQVRIICsgdXNlclswLi4wXSArICIvIiArIHVzZXIgKTsKKyAgICByZXR1cm4gMDsKK30KKworCitwdWJsaWMgaW50IFJlbW92ZUZvbGRlciggc3RyaW5nIGZvbGRlciwgc3RyaW5nIHVzZXIgKQoreworICAgIGludCBpOworCisgICAgaWYgKCAhU0VDVVJJVFkocHJldmlvdXNfb2JqZWN0KCkpICkKKyAgICAgICAgcmV0dXJuIC0yOworCisgICAgaWYgKCAhR2V0Rm9sZGVycyh1c2VyKSApCisgICAgICAgIHJldHVybiAtMTsgLyogTm8gc3VjaCBmb2xkZXIgKi8KKworICAgIGlmICggKGkgPSBtZW1iZXIoIGZvbGRlcnNbMF0sIGZvbGRlcikpID09IC0xICkKKyAgICAgICAgcmV0dXJuIC0xOyAvKiBObyBzdWNoIGZvbGRlciAqLworCisgICAgaWYgKCBzaXplb2YoZm9sZGVyc1sxXVtpXSkgPiAwICkKKyAgICAgICAgcmV0dXJuIDA7IC8qIEZvbGRlciBub3QgZW1wdHkgKi8KKworICAgIGZvbGRlcnNbMF1baS4uaV0gPSAoe30pOworICAgIGZvbGRlcnNbMV1baS4uaV0gPSAoe30pOworCisgICAgc2F2ZV9vYmplY3QoIE1BSUxQQVRIICsgdXNlclswLi4wXSArICIvIiArIHVzZXIgKTsKKyAgICByZXR1cm4gMTsKK30KKworCitwdWJsaWMgaW50IE1ha2VGb2xkZXIoIHN0cmluZyBmb2xkZXIsIHN0cmluZyB1c2VyICkKK3sKKyAgICBpZiAoICFTRUNVUklUWShwcmV2aW91c19vYmplY3QoKSkgKQorICAgICAgICByZXR1cm4gLTI7CisgICAgCisgICAgaWYgKCAhZm9sZGVyIHx8ICFzdHJpbmdwKGZvbGRlcikgKQorICAgICAgICByZXR1cm4gLTE7IC8qIEh1aCA/ICovCisKKyAgICBpZiAoIGZvbGRlciA9PSAidW5yZWFkIiApCisgICAgICAgIHJldHVybiAwOyAvKiBGb2xkZXIgZXhpc3RzIHZpcnR1YWxseSA6KSAqLworCisgICAgR2V0Rm9sZGVycyggdXNlciApOworCisgICAgaWYgKCBtZW1iZXIoIGZvbGRlcnNbMF0sIGZvbGRlcikgIT0gLTEgKQorICAgICAgICByZXR1cm4gMDsgLyogRm9sZGVyIGV4aXN0cyAqLworCisgICAgZm9sZGVyc1swXSA9IGZvbGRlcnNbMF0gKyAoeyBmb2xkZXIgfSk7CisgICAgZm9sZGVyc1sxXSA9IGZvbGRlcnNbMV0gKyAoeyAoe30pIH0pOworICAgIAorICAgIHNhdmVfb2JqZWN0KCBNQUlMUEFUSCArIHVzZXJbMC4uMF0gKyAiLyIgKyB1c2VyICk7CisgICAgcmV0dXJuIDE7Cit9CisKKworcHVibGljIGludCBxdWVyeV9yZWNpcGllbnRfb2soIHN0cmluZyBuYW1lICkKK3sKKyNpZiBJTlRFUk5FVF9NQUlMX0VOQUJMRUQKKyAgICByZXR1cm4gIChmaWxlX3NpemUoICJzZWN1cmUvc2F2ZS8iICsgbmFtZVswLi4wXSArICIvIiArIG5hbWUgKyAiLm8iICkgPiAwCisgICAgICAgIHx8IG1lbWJlciggbmFtZSwgJyUnICkgPiAwIHx8IG1lbWJlciggbmFtZSwgJ0AnICkgPiAwICk7CisjZWxzZQorICAgIC8vIGVzIGRhcmYgendhciBlaW4gQCBpbiBkZXIgQWRyZXNzZSB2b3Jrb21tZW4sIGRhaGludGVyIGFiZXIga2VpbiAuIG1laHIKKyAgICAvLyAoZGFubiBpc3QgZXMgbmUgTWFpbCB2aWEgSW50ZXJtdWQtTWFpbCwgbmljaHQgaW5zIEludGVybmV0KS4KKyAgICBzdHJpbmcgKnRtcDsKKyAgICByZXR1cm4gIChmaWxlX3NpemUoICJzZWN1cmUvc2F2ZS8iICsgbmFtZVswLi4wXSArICIvIiArIG5hbWUgKyAiLm8iICkgPiAwCisgICAgICAgIHx8IG1lbWJlciggbmFtZSwgJyUnICkgPiAwCisgICAgICAgIHx8IChzaXplb2YodG1wPWV4cGxvZGUobmFtZSwiQCIpKSA9PSAyICYmIHN0cnN0cih0bXBbMV0sIi4iKSA9PSAtMSkpOworI2VuZGlmCit9CisKKworcHVibGljIHZvaWQgZGVsaXZlcl9tYWlsKAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyByZWNpcGllbnQsIC8qIHRoZSBsb2NhbCBwbGF5ZXJzIHJlYWwgbmFtZSovCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZyb20sICAgICAgLyogQSBzdHJpbmcgZGVwaWN0aW5nIHRoZSBzZW5kZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3ViamVjdCwgICAvKiBUaGUgbWFpbCBzdWJqZWN0L2hlYWRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtYWlsX2JvZHkgIC8qIFRoZSBhY3R1YWwgbWFpbCBtZXNzYWdlICovICkKK3sKKyAgICBERUJVRyggc3ByaW50ZigiREVMSVZFUiAlT1xuIiwKKyAgICAgICAgICAgICAgICAgICAoeyBmcm9tLCBmcm9tLCByZWNpcGllbnQsICh7fSksICh7fSksIHN1YmplY3QsIHRpbWUoKSB9KSkgKTsKKworICAgIC8vIEdlbG9nZ3Qgd2lyZCwgd2VubiBlaW4gYXVmcnVmZW5kZXMgT2JqZWt0IG5pY2h0IHNpY2hlciBpc3QuCisgICAgaWYgKG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKVswLi43XSE9Ii9zZWN1cmUvIikKKyAgICAgIHdyaXRlX2ZpbGUoIi9zZWN1cmUvQVJDSC9ERUxJVkVSX01BSUwiLAorICAgICBzcHJpbnRmKCIlcyA6IEF1ZnJ1ZiB2b24gL3NlY3VyZS9tYWlsZXItPmRlbGl2ZXJfbWFpbCgpXG4iCisgICAgICAgICAgIiAgU2VuZGVyOiAlTyBFbXBmYWVuZ2VyOiAlT1xuICBQTzogJU8gVEk6ICVPIFRQOiVPXG5cbiIsCisgICAgICAgICAgY3RpbWUodGltZSgpKSxmcm9tLCByZWNpcGllbnQsCisgICAgICAgICAgcHJldmlvdXNfb2JqZWN0KCksIHRoaXNfaW50ZXJhY3RpdmUoKSwgdGhpc19wbGF5ZXIoKSkpOworICAgIAorICAgIERlbGl2ZXJNYWlsKCAoeyBmcm9tLCBmcm9tLCByZWNpcGllbnQsICh7fSksICh7fSksIHN1YmplY3QsIHRpbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgIkVYVEVSTkFMIiwgbWFpbF9ib2R5IH0pLCAwICk7Cit9CmRpZmYgLS1naXQgYS9zZWN1cmUvbWFzdGVyLmMgYi9zZWN1cmUvbWFzdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU3NGNkZgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9tYXN0ZXIuYwpAQCAtMCwwICsxLDEyNTQgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBtYXN0ZXIuYyAtLSBtYXN0ZXIgb2JqZWN0CisvLworLy8gJElkOiBtYXN0ZXIuYyA5NTMwIDIwMTYtMDMtMTcgMTk6NTk6MDFaIFplc3N0cmEgJAorI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgbm9fc2hhZG93CisjcHJhZ21hIG5vX2luaGVyaXQKKyNwcmFnbWEgdmVyYm9zZV9lcnJvcnMKKyNwcmFnbWEgY29tYmluZV9zdHJpbmdzCisjcHJhZ21hIHBlZGFudGljCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIHdhcm5fZGVwcmVjYXRlZAorCisjaW5jbHVkZSAiL3N5cy9maWxlcy5oIgorI2luY2x1ZGUgIi9zeXMvaW50ZXJhY3RpdmVfaW5mby5oIgorI2luY2x1ZGUgIi9zeXMvZHJpdmVyX2luZm8uaCIKKworaW5oZXJpdCAiL3NlY3VyZS9tYXN0ZXIvbWlzYyI7Citpbmhlcml0ICIvc2VjdXJlL21hc3Rlci91c2VyaW5mbyI7Citpbmhlcml0ICIvc2VjdXJlL21hc3Rlci9uZXR3b3JrIjsKK2luaGVyaXQgIi9zZWN1cmUvbWFzdGVyL2RvbWFpbiI7Citpbmhlcml0ICIvc2VjdXJlL21hc3Rlci9ndWlsZCI7Citpbmhlcml0ICIvc2VjdXJlL21hc3Rlci9maWxlX2FjY2VzcyI7Citpbmhlcml0ICIvc2VjdXJlL21hc3Rlci9wbGF5ZXJzX2RlbnkiOworCisjaW5jbHVkZSAiL3NlY3VyZS9tYXN0ZXIuaCIKKworLy9mb3IgbGltaXRlZCwgc2V0X2xpbWl0KCksIGV0Yy4gQWJzLiBQZmFkIG5vZXRpZywgZGEgbm9jaCBrZWluIEluY2x1ZGUtSG9vaworI2luY2x1ZGUgIi9zeXMvcnRsaW1pdHMuaCIKKyNpbmNsdWRlICIvc3lzL2RlYnVnX2luZm8uaCIKKyNpbmNsdWRlICIvc3lzL2RlYnVnX21lc3NhZ2UuaCIKKyNpbmNsdWRlICIvc3lzL2NvbmZpZ3VyYXRpb24uaCIKKyNpbmNsdWRlICIvc3lzL3JlZ2V4cC5oIgorCisvLyBNb2R1bGUgZGVzIE1hc3RlciBlaW5mdWVnZW4uIFBlciAjaW5jbHVkZSwgZGFtaXRzIGdlcmluZ2Z1ZWdpZyBzY2huZWxsZXIuCisvLyBEYSBkaWUgTW9kdWxlIGphIG5pcmdlbmR3byBzb25zdCBnZWVyYnQgd2VyZGVuIGtvZW5udGVuLCBpc3QgZGllcworLy8gYXVzbmFobXN3ZWlzZSBPSy4gOykKKyNpbmNsdWRlICIvc2VjdXJlL21hc3Rlci9kZXN0cnVjdC5jIgorI2luY2x1ZGUgIi9zZWN1cmUvbWFzdGVyL2F1dG9pbmNsdWRlLmMiCisKKy8vIEZ1ZXIgTG9nZmlsZSgtUm90YXRpb24pCisjZGVmaW5lIFJFU0VUSU5UICAgMzYwMCAgICAgICAgICAgICAgICAgICAgICAvLyBqZWRlIFN0dW5kZQorI2RlZmluZSBMT0dST1RBVEUgICgyNCoyKSAgICAgICAgICAgICAgICAgICAgLy8gYWxsZSA0OGgKKyNkZWZpbmUgTE9HRklMRUFHRSAoUkVTRVRJTlQqTE9HUk9UQVRFKSAgICAgIC8vIGFsbGUgMiB0YWdlIHdlY2hzZWxuCisjZGVmaW5lIExPR05VTSAgICAgMyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbnphaGwgZGVyIExvZ2ZpbGVzCisKK3ByaXZhdGUgbm9zYXZlIGludCBsb2dyb3RhdGVfY291bnRlcjsgLy9SRUFEX0ZJTEUgYWxsZSBMT0dST1RBVEUgUmVzZXRzIHJvdGllcmVuCisvLyBXaXJkIGdlcmFkZSB2ZXJzdWNodCwgZGllIHNpbXVsX2VmdW5zIHp1IGxhZGVuPyBXZW5uIGphLCBkdWVyZmVuIGtlaW5lCisvLyBzZWZ1bnMgZ2VydWZlbiB3ZXJkZW4uCitwcml2YXRlIG5vc2F2ZSBpbnQgbG9hZGluZ19zaW11bF9lZnVuczsKKy8vIHdpcmQgZ2VyYWRlIGVpbiBGZWhsZXIgYmVhcmJlaXRldD8gRGllbnQgenVyIEVya2VubnVuZyB2b24gUmVrdXJzaW9uZW4gaW4KKy8vIGRlciBGZWhsZXJiZWhhbmRsdW5nCitwcml2YXRlIG5vc2F2ZSBpbnQgaGFuZGxpbmdfZXJyb3I7CisKKy8vICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFN0YXJ0IGRlcyBNYXN0ZXJzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworLy8gSW5pdGlhbGlzaWVydW5nIGRlcyBNYXN0ZXJzCisvL2FyZz09MDogTXVkIHN0YXJ0ZXQgZ2VyYWRlLCBhcmc9PTE6IE1hc3RlciB3dXJkZSByZWFrdGl2aWVydCwKKy8vYXJnPT0yOiBNYXN0ZXIgcmVha3RpdmllcnQgKFZhcmlhYmxlbiB3ZWcpLCBhcmc9PTM6IE1hc3RlciB3dXJkZQorLy9uZXVnZWxhZGVuLgorcHJvdGVjdGVkIHZvaWQgaW5hdWd1cmF0ZV9tYXN0ZXIoaW50IGFyZykgeworCisgIHNldF9kcml2ZXJfaG9vayhIX1JFR0VYUF9QQUNLQUdFLCBSRV9UUkFESVRJT05BTCk7CisgIAorICBzZXRldWlkKFJPT1RJRCk7CisgIHVzZXJpbmZvOjpjcmVhdGUoKTsKKyAgTG9hZFBMRGVueWxpc3RzKCk7CisKKyAgLy8gV2FzIHNvbGwgdm9yIGplZGUgRGF0ZWkgZ2VzY2hyaWViZW4gd2VyZGVuPworICBzZXRfZHJpdmVyX2hvb2soSF9BVVRPX0lOQ0xVREUsICMnYXV0b2luY2x1ZGVob29rKTsKKworICAvL2Rpdi4gTGlzdGVuIGVpbmxlc2VuCisgIFJlbG9hZEJhbmlzaEZpbGUoKTsKKyAgUmVsb2FkRGVwdXR5RmlsZSgpOworICBSZWxvYWRJbnNlY3VyZUZpbGUoKTsKKyAKKyAgLy8gQmVpIE5ldXN0YXJ0IHdpemluZm8gaW5pdGlhbGlzaWVyZW4KKyAgaWYgKCFhcmcpCisgICAgc2V0X2V4dHJhX3dpemluZm8oMCwgYWxsb2NhdGUoQkFDS0JPTkVfV0laSU5GT19TSVpFKSk7CisgIAorICAvL3NpbXVsX2VmdW4uYyBuYWNoIGluYXVndXJhdGVfbWFzdGVyKCkgc3RhcnRlbiB1bmQgaW5pdGlhbGlzaWVyZW4sIAorICAvLyhzbyByaWNodGlnIHNlaCBpY2ggZGVuIFNpbm4gaGllciBtb21lbnRhbiBuaWNodCBlaW4uLi4KKyAgLy9jYWxsX291dCgic3RhcnRfc2ltdWxfZWZ1biIsMCk7CisKKyAgLy8gUmVzZXQgZmVzdHNldHplbiAoMWgpCisgIHNldF9uZXh0X3Jlc2V0KFJFU0VUSU5UKTsKKworICAvLyBEcml2ZXIga29uZmlndXJpZXJlbgorICAvLyBMYWdlcmtlbm51bmcgZXJzdCBuZSBNaW51dGUgc3BhZXRlciwgd2FlaHJlbmQgcHJlbG9hZCBkYXJmcyBtb21lbnRhbgorICAvLyBydWhpZyBsYWdnZW4gKFplaXQ6IHZvcmxhZXVmaWcgMW1pbikKKyAgY2FsbF9vdXQoIydjb25maWd1cmVfZHJpdmVyLCA2MCwgRENfTE9OR19FWEVDX1RJTUUsIDEwMDAwMCk7CisgIAorICAvLyBIb29rcyBzZXR6ZW4gCisgIAorICAvLyBTdGFuZGFyZGluY2x1ZGV2ZXJ6ZWljaG5pc3NlIGZ1ZXIgI2luY2x1ZGUgPD4KKyAgc2V0X2RyaXZlcl9ob29rKEhfSU5DTFVERV9ESVJTLCAoeyIvc2VjdXJlLyIsIi9zeXMvIn0pICk7CisgIAorICAvL05hY2ggZGVtIExhZGVuL0Nsb25lbiBjcmVhdGUoKSBpbSBPYmpla3QgcnVmZW4KKyAgc2V0X2RyaXZlcl9ob29rKEhfQ1JFQVRFX0NMT05FLCAgICAgICAiY3JlYXRlIik7CisgIHNldF9kcml2ZXJfaG9vayhIX0NSRUFURV9PQiwgICAgICAgICAgImNyZWF0ZSIpOworICBzZXRfZHJpdmVyX2hvb2soSF9DUkVBVEVfU1VQRVIsICAgICAgICJjcmVhdGVfc3VwZXIiKTsKKworICAvLyBCZWkgUmVzZXQgcmVzZXQoKSBpbSBPYmpla3QgYXVmcnVmZW4KKyAgc2V0X2RyaXZlcl9ob29rKEhfUkVTRVQsICAgICAgICAgICAgICAicmVzZXQiKTsKKyAgCisgIC8vIFp1bSBBdWZyYWV1bWVuIGNsZWFuX3VwKCkgaW0gT2JqZWt0IGF1ZnJ1ZmVuICAKKyAgc2V0X2RyaXZlcl9ob29rKEhfQ0xFQU5fVVAsICAgICAgICAgICAiY2xlYW5fdXAiKTsKKworICAvLyBKZWRlIEVpbmdhYmUgd2lyZCB1ZWJlciBtb2RpZnlfY29tbWFuZCBnZWxlbmt0CisgIHNldF9kcml2ZXJfaG9vayhIX01PRElGWV9DT01NQU5ELCAgICAgICAibW9kaWZ5X2NvbW1hbmQiKTsKKyAgLy8gRGllc2VyIEhvb2sgaXN0IG1hbmRhdG9yeSwgYWJlciB3aXJkIG51ciBiZW51dHp0LCB3ZW5uIHZpYQorICAvLyBzZXRfbW9kaWZ5X2NvbW1hbmQoKSBha3RpdmllcnQgLSB3YXMgd2lyIG5pY2h0IChtZWhyKSB0dW4uIEluc29mZXJuIGlzdAorICAvLyBkYXMgUmVsaWt0IGF1cyBhbHRlbiBaZWl0ZW4uCisgIC8vc2V0X2RyaXZlcl9ob29rKEhfTU9ESUZZX0NPTU1BTkRfRk5BTUUsICJtb2RpZnlfY29tbWFuZCIpOworCisgIC8vIFN0YW5kYXJkLUZlaGxlcm1lbGR1bmcKKyAgLy9zZXRfZHJpdmVyX2hvb2soSF9OT1RJRllfRkFJTCwgICAgICAgICJXaWUgYml0dGU/XG4iKTsKKyAgc2V0X2RyaXZlcl9ob29rKEhfTk9USUZZX0ZBSUwsIGZ1bmN0aW9uIHN0cmluZyAoc3RyaW5nIGNtZCwgb2JqZWN0IHRwKQorICAgICAge2lmIChzdHJpbmdwKGNtZD0oc3RyaW5nKXRwLT5RdWVyeVByb3AoUF9ERUZBVUxUX05PVElGWV9GQUlMKSkpCisgICAgICAgICByZXR1cm4oY21kKTsKKyAgICAgICByZXR1cm4oIldpZSBiaXR0ZT9cbiIpO30pOworCisgIC8vIFdhcyBtYWNoZW4gYmVpIHRlbG5ldF9uZWcKKyAgc2V0X2RyaXZlcl9ob29rKEhfVEVMTkVUX05FRywidGVsbmV0X25lZyIpOworICAvLyAgc2V0X2RyaXZlcl9ob29rKEhfVEVMTkVUX05FRywwKTsKKworICAvLyBQcm9tcHRiZWhhbmRsdW5nOiBEZWZhdWx0cHJvbXB0IHNldHplbiB1bmQgZGFmdWVyIHNvcmdlbiwgZGFzcyBhbGxlCisgIC8vIFByb21wdGF1c2dhYmVuIGR1cmNoIHByaW50X3Byb21wdCBpbSBJbnRlcmFjdGl2ZSBsYXVmZW4sIGRhbWl0IGRhcyBFT1IKKyAgLy8gYW5nZWhhZW5ndCB3aXJkLgorICBzZXRfZHJpdmVyX2hvb2soSF9QUklOVF9QUk9NUFQsICJwcmludF9wcm9tcHQiKTsKKyAgc2V0X2RyaXZlcl9ob29rKEhfREVGQVVMVF9QUk9NUFQsICI+ICIpOworCisgIC8vIEVVSUQgdW5kIFVJRCBtdWVzc2VuIG5ldWUgT2JqZWt0ZSBhdWNoIG5vY2gga3JpZWdlbiwgSG9va3MgZGFmdWVyIHNldHplbgorICBzZXRfZHJpdmVyX2hvb2soSF9MT0FEX1VJRFMsICMnbG9hZF91aWRfaG9vayk7CisgIHNldF9kcml2ZXJfaG9vayhIX0NMT05FX1VJRFMsICMnY2xvbmVfdWlkX2hvb2spOworCisgIC8vIE1lbGR1bmcgYmVpIHZvbGxlbSBNdWQKKyAgc2V0X2RyaXZlcl9ob29rKEhfTk9fSVBDX1NMT1QsICJNb21lbnRhbiBzaW5kIGxlaWRlciB6dXZpZWxlIFNwaWVsZXIgaW0gIgorICAgICAgK01VRE5BTUUrIiBlaW5nZWxvZ2d0LlxuQml0dGUga29tbSBkb2NoIGV0d2FzIHNwYWV0ZXIgbm9jaG1hbCAiCisgICAgICAidm9yYmVpIVxuIik7CisKKyAgLy8gTnVuIGRlciBiZXJ1ZWNodGlndGUgTW92ZS1Ib29rIC4uLgorICAvLyAoYmV3ZWd0IG9iamVrdCB1bmQgcnVmdCBhbGxlIG5vdHdlbmRpZ2VuIGluaXRzIGF1ZikKKyAgLy8gSGllciB3aXJkIEhfTU9WRV9PQkpFQ1QwIGJlbnV0enQsIGQuaC4gZGllIGxhbWJkYSB3aXJkIGFuIGRhcyBha3R1ZWxsZQorICAvLyBPYmpla3Qgdm9yIEF1c2Z1ZWhydW5nIGdlYnVuZGVuLCBuaWNodCBhbiAnaXRlbScsIHdhcyBtb3ZlX29iamV0KCkKKyAgLy8gdWViZXJnZWJlbiB3dXJkZS4KKyAgc2V0X2RyaXZlcl9ob29rKEhfTU9WRV9PQkpFQ1QwLAorICAgICB1bmJvdW5kX2xhbWJkYSgoeydpdGVtLCdkZXN0fSksCisgICAgICAgKHsjJywsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdGVtIT10aGlzX29iamVjdD8KKyAgICAgICAgICh7Iyc/LCh7IychPSwnaXRlbSwoeyMndGhpc19vYmplY3R9KX0pLAorICAgICAgICAgICAoeyMncmFpc2VfZXJyb3IsICAgICAgICAgICAgICAgICAgICAgICAgLy8gLT5GZWhsZXIhCisgICAgICAgICAgICAgIklsbGVnYWwgdG8gbW92ZSBvdGhlciBvYmplY3QgdGhhbiB0aGlzX29iamVjdCgpXG4ifSkgfSksCisgICAgICAgICAoeyMnZWZ1bjo6c2V0X2Vudmlyb25tZW50LCdpdGVtLCdkZXN0fSksICAvLyBpdGVtIG5hY2ggZGVzdCBiZXdlZ2VuCisgICAgICAgICAoeyMnPywKKyAgICAgICAgICAgKHsjJ2xpdmluZywnaXRlbX0pLCAgICAgICAgICAgICAgICAgICAgIC8vIGxpdmluZyhpdGVtKT8KKyAgICAgICAgICAgKHsjJywsCisgICAgICAgICAgICAgKHsjJ2VmdW46OnNldF90aGlzX3BsYXllciwnaXRlbX0pLCAgICAvLyBzZXRfdGhpc19wbGF5ZXIoaXRlbSkKKyAgICAgICAgICAgICAoeyMnY2FsbF9vdGhlciwnZGVzdCwiaW5pdCJ9KSwgICAgICAgIC8vIGRlc3QtPmluaXQoKQorICAgICAgICAgICAgICh7Iyc/ISwgCisgICAgICAgICAgICAgICAoeyMnJiYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAhb2JqZWN0cChpdGVtKXx8CisgICAgICAgICAgICAgICAgICh7IydvYmplY3RwLCAnaXRlbX0pLCAgICAgICAgICAgICAvLyBlbnYoaXRlbSkhPWRlc3Q/CisgICAgICAgICAgICAgICAgICh7Iyc9PSwoeyMnZW52aXJvbm1lbnQsICdpdGVtfSksJ2Rlc3R9KX0pLAorICAgICAgICAgICAgICAgKHsjJ3JldHVybn0pfSl9KX0pLCAgICAgICAgICAgICAgICAgLy8gLT4gZmVydGlnCisgICAgICAgICAoeyMnPSwnb3RoZXJzLCh7IyctLCh7IydhbGxfaW52ZW50b3J5LCdkZXN0fSksKHsjJyh7LCdpdGVtfSl9KX0pLAorI2lmZGVmIEVNQUNTX05FUlYgCisgICAgICAgICB9KSAgIC8vIEVtYWNzIGthbm4gKHsjJyh7IG5pY2h0IHBhcnNlbiAgICAvLyBvdGhlcnM9YWxsX2ludihkZXN0KS0KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAoe2l0ZW19KQorICAgICAgICAgKHsjJ2ZpbHRlciwnb3RoZXJzLGxhbWJkYSgoeydvYiwnaXRlbX0pLAorICAgICAgICAgICAgKHsjJz8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAoeyMnJiYsCisgICAgICAgICAgICAgICAgKHsjJ29iamVjdHAsJ2l0ZW19KSwgICAgICAgICAgICAgICAvLyBvYmplY3RwKGl0ZW0pJiYKKyAgICAgICAgICAgICAgICAoeyMnbGl2aW5nLCdvYn0pLCAgICAgICAgICAgICAgICAgIC8vIGxpdmluZyhvYikmJgorICAgICAgICAgICAgICAgICh7Iyc9PSwoeyMnZW52aXJvbm1lbnQsJ2l0ZW19KSwoeyMnZW52aXJvbm1lbnQsJ29ifSl9KX0pLAorICAgICAgICAgICAgICAoeyMnLCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW52KGl0ZW0pPT1lbnYob2IpPworICAgICAgICAgICAgICAgICh7IydlZnVuOjpzZXRfdGhpc19wbGF5ZXIsICdvYn0pLCAgLy8gc2V0X3RoaXNfcGxheWVyKG9iKQorICAgICAgICAgICAgICAgICh7IydjYWxsX290aGVyLCdpdGVtLCAiaW5pdCJ9KSAgICAgLy8gaXRlbS0+aW5pdCgpCisgICAgICAgICAgICAgIH0pfSkpLCdpdGVtfSksCisgICAgICAgICAoeyMnPywKKyAgICAgICAgICAgKHsjJ2xpdmluZywnaXRlbX0pLCAgICAgICAgICAgICAgICAgICAgIC8vIGxpdmluZyhpdGVtKT8KKyAgICAgICAgICAgICAgKHsjJywsCisgICAgICAgICAgICAgICAgKHsjJ2VmdW46OnNldF90aGlzX3BsYXllciwnaXRlbX0pLCAvLyBzZXRfdGhpc19wbGF5ZXIoaXRlbSkKKyAgICAgICAgICAgICAgICAoeyMnZmlsdGVyLCdvdGhlcnMsbGFtYmRhKCh7J29iLCdpdGVtfSksCisgICAgICAgICAgICAgICAgICAgICh7Iyc/LCAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgKHsjJyYmLCAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAoeyMnb2JqZWN0cCwnaXRlbX0pLCAgICAgICAvLyBvYmplY3RwKGl0ZW0pJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICh7IydvYmplY3RwLCdvYn0pLCAgICAgICAgIC8vIG9iamVjdHAob2IpJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICh7Iyc9PSwoeyMnZW52aXJvbm1lbnQsJ2l0ZW19KSwoeyMnZW52aXJvbm1lbnQsJ29ifSl9KQorICAgICAgICAgICAgICAgICAgICAgIH0pLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW52KGl0ZW0pPT1lbnYob2IpPworICAgICAgICAgICAgICAgICAgICAgICh7IydjYWxsX290aGVyLCdvYiwiaW5pdCJ9KSAgLy8gb2ItPmluaXQoKQorICAgICAgICAgICAgICAgICAgICB9KSksJ2l0ZW19KX0pfSksCisgICAgICAgICAoeyMnPywKKyAgICAgICAgICAgKHsjJyYmLAorICAgICAgICAgICAgICh7IydvYmplY3RwLCdpdGVtfSksICAgICAgICAgICAgICAgICAgLy8gb2JqZWN0cChpdGVtKSYmCisgICAgICAgICAgICAgKHsjJ2xpdmluZywnZGVzdH0pLCAgICAgICAgICAgICAgICAgICAvLyBsaXZpbmcoZGVzdCkmJgorICAgICAgICAgICAgICh7Iyc9PSwoeyMnZW52aXJvbm1lbnQsJ2l0ZW19KSwnZGVzdH0pLy8gZW52KGl0ZW0pPT1kZXN0PworICAgICAgICAgICB9KSwKKyAgICAgICAgICAgKHsjJywsCisgICAgICAgICAgICAgKHsjJ2VmdW46OnNldF90aGlzX3BsYXllciwnZGVzdH0pLCAgICAvLyBzZXRfdGhpc19wbGF5ZXIoZGVzdCkKKyAgICAgICAgICAgICAoeyMnY2FsbF9vdGhlciwnaXRlbSwiaW5pdCJ9KX0pfSl9KSkpOy8vIGl0ZW0tPmluaXQoKQorICBERUJVRygiTWFzdGVyIGluYXVndXJhdGVkIik7CisgIHJldHVybjsKK30KKworLy8gZXBpbG9nKCkgZ2lidCBkaWUgRGF0ZWllbiB6dXJ1ZWNrLCBkaWUgdm9yZ2VsYWRlbiB3ZXJkZW4gbXVlc3NlbgorcHJvdGVjdGVkIHN0cmluZyAqZXBpbG9nKGludCBlZmxhZykgeworICBzdHJpbmcgKmZpbGVzLCAqZG9tYWluczsKKyAgaW50IGk7CisKKyAgc2V0ZXVpZChST09USUQpOworICBSZWxvYWRCYW5pc2hGaWxlKCk7CisgIFJlbG9hZERlcHV0eUZpbGUoKTsKKyAgUmVsb2FkSW5zZWN1cmVGaWxlKCk7CisKKyAgaWYgKGVmbGFnKSB7CisgICAgd3JpdGUoIi1lIGFuZ2VnZWJlbiAtPiBQcmVsb2FkaW5nIHVudGVyZHJ1ZWNrdCAuLi5cbiIpOworICAgIHJldHVybiAwOworICB9CisKKyAgcHJpbnRmKCJQcmVsb2FkaW5nIGdlc3RhcnRldDogJXNcblxuIixjdGltZSh0aW1lKCkpKTsKKworICAvL0ZpbGVzIGZ1ZXJzIFByZWxvYWRpbmcgdW5kIFJlZ2lvbmVuIGhvbGVuCisgIGZpbGVzPWV4cGxvZGVfZmlsZXMoIi9zdGQvcHJlbG9hZF9maWxlIikgKyBleHBsb2RlX2ZpbGVzKCIvZC9wcmVsb2FkX2ZpbGUiKTsKKyAgZG9tYWlucz1nZXRfZG9tYWlucygpICsgKHsiZXJ6bWFnaWVyIn0pOyAvLyBFTSBoYWJlbiBhdWNoIGVpbiBQcmVsb2FkIEZpbGUKKworICBmb3IgKGk9c2l6ZW9mKGRvbWFpbnMpO2ktLTspCisgICAgZmlsZXMrPWV4cGxvZGVfZmlsZXMoIi9kLyIrZG9tYWluc1tpXSsiL3ByZWxvYWRfZmlsZSIpOworICAKKyAgd3JpdGUoIlxuIik7CisgCisgIHJldHVybiBmaWxlczsKK30KKworLy8gcHJlbG9hZCgpIHdpcmQgZnVlciBqZWRlciBEYXRlaSBpbSBQcmVsb2FkIGVpbm1hbCBkdXJjaGxhdWZlbgorcHJvdGVjdGVkIHZvaWQgcHJlbG9hZChzdHJpbmcgZmlsZSkgeworICBzdHJpbmcgZXJyOworICBzdHJpbmcgbmFtZTsKKyAgaW50ICpyZXMsIHplaXQ7CisKKyAgLy8gS2VpbiByaWNodGlnZXIgRGF0ZWluYW1lOiBmZXJ0aWcKKyAgaWYoIWZpbGUgfHwgIWZpbGVbMF0gfHwgZmlsZVswXSA9PSAnOycgfHwgZmlsZV9zaXplKGZpbGUrIi5jIikgPCAwKSByZXR1cm47CisKKyAgLy8gS2VpbiBCZXNpdHplciAtPiBNZWxkdW5nIGF1c2dlYmVuLCBmZXJ0aWcKKyAgaWYgKCEobmFtZT1jcmVhdG9yX2ZpbGUoZmlsZSkpKQorICB7CisgICAgcHJpbnRmKCJLZWluIEJlc2l0emVyIGdlZnVuZGVuIGZ1ZXIgRGF0ZWkgJXMuXG4iLGZpbGUpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIERhdGVpIHVuZCBCZXNpdHplciBhdXNnZWJlbgorICBwcmludGYoIiUtNTBzJS0xNXMiLGZpbGUsbmFtZSk7CisKKyAgLy8gRXVpZCBrYW5uIG5pY2h0IGdlYWVuZGVydCB3ZXJkZW4gLT4gTWVsZHVuZywgZmVydGlnCisgIGlmICghc2V0ZXVpZChuYW1lKSkKKyAgeworICAgIHByaW50ZigiXG5FdWlkIGtvbm50ZSBuaWNodCBhdWYgJXMgZ2VzZXR6dCB3ZXJkZW5cbiIrCisgICAgICAgICAgICAgIlNpZSBpc3QgbnVuICVzLlxuIixuYW1lLGdldGV1aWQoVE8pKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBEYW5uIG1hbCBsYWRlbiAuLiBkYWJlaSBaZWl0IG1lc3NlbgorICB6ZWl0ID0gYXBwbHkoIycrLHJ1c2FnZSgpWzAuLjFdKTsKKworICAvLyBXYWVocmVuZCBkZXMgUHJlbG9hZHMgc2luZCAxLjVNVGlja3MgbGVpZGVyIG5pY2h0IHNvdmllbCwgaW5zYi4gd2VubgorICAvLyBzb3dhcyB3aWUgZGVyIGNoYW5uZWxkIGplZGUgbWVuZ2UgT2JqZWt0ZSBsYWRlbiBtdXNzLCBkaWUgd2llZGVydW0gZXJzdAorICAvLyBkYXMgZ2FuemUgR2VyYWZmZWwgYXVzIC9zdGQvIGxhZGVuLiBEYWhlciBoaWVyIGVpbmZhY2ggbWFsIGZ1ZXJzIFByZWxvYWQKKyAgLy8gZGllIEdyZW56ZSBob2NoLgorICBlcnIgPSBjYXRjaChsaW1pdGVkKCMnbG9hZF9vYmplY3QsKHs1MDAwMDAwfSksZmlsZSkpOworCisgIGlmIChlcnIgIT0gMCkKKyAgICBwcmludGYoIlxuRmVobGVyIGJlaW0gTGFkZW4gdm9uICVzOlxuJXNcbiIsZmlsZSxlcnIpOworICBlbHNlCisgIHsKKyAgICB6ZWl0PWFwcGx5KCMnKyxydXNhZ2UoKVswLi4xXSktemVpdDsKKyAgICBwcmludGYoIiglMmQuJTowMmQgcylcbiIsemVpdC8xMDAwLHplaXQlMTAwMCk7CisgIH0KKworICAvLyBOb2NoIEVVSUQgenVydWVja3NldHplbgorICBzZXRldWlkKFJPT1RJRCk7CisKKyAgcmV0dXJuOworfQorCisvL3NpbXVsX2VmdW4uYyBsYWRlbiBvZGVyIGRpZSBzcGFyZV9zaW11bF9lZnVuLmMgYWxzIEZhbGxiYWNrCisvL2VzIGlzdCBtb2VnbGljaCwgaGllciBlaW4gQXJyYXkgdm9uIHN0cmluZ3MgenVydWVja3p1Z2ViZW4uIERpZQorLy9uYWNoZm9sZ2VuZGVuIGdlbHRlbiBhbHMgQmFja3VwLU9iamVrdGUsIGZhbGxzIGVpbmUgc2VmdW4gaW0gSGF1cHRvYmpla3QKKy8vbmljaHQgZ2VmdW5kZW4gd2lyZC4KK3Byb3RlY3RlZCBzdHJpbmcgKmdldF9zaW11bF9lZnVuKCkgeworICBzdHJpbmcgZXJyOworCisgICsrbG9hZGluZ19zaW11bF9lZnVuczsKKworICBpZiAoIShlcnI9Y2F0Y2goU0lNVUxfRUZVTl9GSUxFLT5zdGFydF9zaW11bF9lZnVuKCkpKSApIHsKKyAgICAtLWxvYWRpbmdfc2ltdWxfZWZ1bnM7CisgICAgcmV0dXJuICh7U0lNVUxfRUZVTl9GSUxFfSk7CisgIH0KKyAgCisgIHdyaXRlKCJGYWlsZWQgdG8gbG9hZCBzaW11bCBlZnVuICIgKyBTSU1VTF9FRlVOX0ZJTEUgKyAiXG4iKTsKKyAgZGVidWdfbWVzc2FnZSgiRmFpbGVkIHRvIGxvYWQgc2ltdWwgZWZ1biAiICsgU0lNVUxfRUZVTl9GSUxFICsKKyAgICAgICIgIiArIGVyciwgRE1TR19TVERPVVQgfCBETVNHX0xPR0ZJTEUpOworCisgIGlmICghKGVycj1jYXRjaChTUEFSRV9TSU1VTF9FRlVOX0ZJTEUtPnN0YXJ0X3NpbXVsX2VmdW4oKSkpICkgeworICAgIC0tbG9hZGluZ19zaW11bF9lZnVuczsKKyAgICByZXR1cm4gKHtTUEFSRV9TSU1VTF9FRlVOX0ZJTEV9KTsKKyAgfQorICAKKyAgd3JpdGUoIkZhaWxlZCB0byBsb2FkIHNwYXJlIHNpbXVsIGVmdW4iICsgU1BBUkVfU0lNVUxfRUZVTl9GSUxFICsgIlxuIik7CisgIGRlYnVnX21lc3NhZ2UoIkZhaWxlZCB0byBsb2FkIHNwYXJlIHNpbXVsIGVmdW4gIiArIFNQQVJFX1NJTVVMX0VGVU5fRklMRSArCisgICAgICAiICIgKyBlcnIsIERNU0dfU1RET1VUIHwgRE1TR19MT0dGSUxFKTsKKworIAorICBlZnVuOjpzaHV0ZG93bigpOworICAKKyAgcmV0dXJuIDA7Cit9CisKK3Byb3RlY3RlZCBtaXhlZCBjYWxsX3NlZnVuKHN0cmluZyBzZWZ1biwgdmFyYXJncyBtaXhlZCBhcmdzKSB7CisgIGlmICghbG9hZGluZ19zaW11bF9lZnVucykKKyAgICByZXR1cm4gYXBwbHkoc3ltYm9sX2Z1bmN0aW9uKHNlZnVuKSwgYXJncyk7CisgIGVsc2UgeworICAgIHN3aXRjaChzZWZ1bikgeworICAgICAgY2FzZSAibG9nX2ZpbGUiOgorICAgICAgY2FzZSAic2VjdXJlX2xldmVsIjoKKyAgICAgIGNhc2UgInNlY3VyZV9ldWlkIjoKKyAgICAgIGNhc2UgImZpbmRfcGxheWVyIjoKKyAgICAgIGNhc2UgImZpbmRfbmV0ZGVhZCI6CisgICAgICBjYXNlICJmaW5kX2xpdmluZyI6CisgICAgICBjYXNlICJwcm9jZXNzX2NhbGwiOgorICAgICAgY2FzZSAicmVwbGFjZV9wZXJzb25hbCI6CisgICAgICBjYXNlICJmaWxlX3RpbWUiOgorICAgICAgICByZXR1cm4gMDsKKyAgICAgIGNhc2UgImR0aW1lIjoKKyAgICAgICAgaWYgKHBvaW50ZXJwKGFyZ3MpICYmIHNpemVvZihhcmdzKSkKKyAgICAgICAgICByZXR1cm4gc3RyZnRpbWUoIiVhICVkLiAlYiAlWSwgJUg6JU06JVMiLGFyZ3NbMF0pOworICAgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuIHN0cmZ0aW1lKCIlYSAlZC4gJWIgJVksICVIOiVNOiVTIik7CisgICAgICBjYXNlICJ1cHRpbWUiOgorICAgICAgICByZXR1cm4gdG9fc3RyaW5nKHRpbWUoKS1fX0JPT1RfVElNRV9fKSArICIgU2VrdW5kZW4iOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworCisvLyBQcmVsb2FkIG1hbnVlbGwgd2llZGVyaG9sZW47IEtlaW5lIEdELUZ1bmt0aW9uCit2b2lkIHJlZG9fcHJlbG9hZCgpCit7CisgIHN0cmluZyAqdG9fcHJlbG9hZDsKKyAgaW50IGksajsKKworICB0b19wcmVsb2FkPWVwaWxvZygwKTsKKyAgaj1zaXplb2YodG9fcHJlbG9hZCk7CisgIGZvciAoaT0wO2k8ajtpKyspIAorICAgICAgY2F0Y2gocHJlbG9hZCh0b19wcmVsb2FkW2ldKSk7CisgIHJldHVybjsKK30KKworLy8gICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFN0YW5kYXJkLUxmdW5zICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMKKworLy8gS2VpbmUgR0QtRnVua3Rpb24sIGFiZXIgc2lubnZvbGwuCitwdWJsaWMgdmFyYXJncyBpbnQgcmVtb3ZlKGludCBzaWxlbnQpCit7CisgIHdyaXRlKCJEZXIgTWFzdGVyIHdpbGwgYWJlciBuaWNodCB6ZXJzdG9lcnQgd2VyZGVuIVxuIik7CisgIHJldHVybiAwOworfQorCisvLyBFaW5pZ2UgcmVwZXRpdGl2ZW4gVGFldGlna2VpdGVuIGthbm4gZGVyIFJlc2V0IGVybGVkaWdlbgorcHJvdGVjdGVkIHZvaWQgcmVzZXQoKQoreworICBpbnQgaSwgKmRhdGU7CisgIG1peGVkICp3bDsKKworICAvL0RhcmYgbmljaHQgdm9uIEhhbmQgYXVmZ2VydWZlbiB3ZXJkZW4hCisgIGlmIChUSXx8VFApIHJldHVybjsKKyAgCisgIC8vIE5hZWNoc3RlbiBSZXNldCBzZXR6ZW4KKyAgc2V0X25leHRfcmVzZXQoUkVTRVRJTlQpOworCisgIC8vIFVzZXJpbmZvIGF1ZnJhZXVtZW4KKyAgX2NsZWFudXBfdWluZm8oKTsKKworICAvLyBQcm9qZWt0LUNhY2hlIGxvZXNjaGVuCisgIF9jbGVhbnVwX3Byb2plY3RzKCk7CisKKyAgLy8gV2VubiBaZWl0IGFiZ2VsYXVmZW4sIGRhbm4gUkVBRF9GSUxFLUxvZyByb3RpZXJlbgorICBpZiAoIWxvZ3JvdGF0ZV9jb3VudGVyLS0pCisgIHsKKyAgICBpPXRpbWUoKS9MT0dGSUxFQUdFOworICAgIGRhdGU9Z2V0X2RpcihzcHJpbnRmKCIlcy4lZCIsIFJFQURfRklMRSxpJUxPR05VTSksIEdFVERJUl9EQVRFUyk7CisgICAgaWYgKHBvaW50ZXJwKGRhdGUpJiZzaXplb2YoZGF0ZSkmJgorICAgICAgICAoZGF0ZVswXS9MT0dGSUxFQUdFKT09aSkgcmV0dXJuOworICAgIGlmIChmaWxlX3NpemUoUkVBRF9GSUxFKT4wKQorICAgICAgcmVuYW1lKFJFQURfRklMRSwgc3ByaW50ZigiJXMuJWQiLCBSRUFEX0ZJTEUsaSVMT0dOVU0pKTsKKyAgICBsb2dyb3RhdGVfY291bnRlcj1MT0dST1RBVEU7CisgIH0KKyAgLy8gZWlubWFsIGFtIFRhZyBkaWUgVUlEQWxpYXNlIHJlc2V0dGVuLiBIaWVyenUgd2lyZCBkZXIgbG9ncm90YXRlX2NvdW50ZXIKKyAgLy8gbWlzc2JyYXVjaHQuCisgIGlmICghKGxvZ3JvdGF0ZV9jb3VudGVyJTI0KSkgeworICAgIFJlc2V0VUlEQWxpYXNlKCk7CisjaWZkZWYgX1BVUkVGVFBEXworICAgIGV4cGlyZV9mdHBfdXNlcigpOworI2VuZGlmCisgIH0KKworICAvLyBXaXpsaXN0IGFsdGVydAorICB3bCA9IHdpemxpc3RfaW5mbygpOworICBmb3IgKGk9c2l6ZW9mKHdsKTsgaS0tOyApCisgICAgc2V0X2V4dHJhX3dpemluZm8od2xbaV1bV0xfTkFNRV0sIHdsW2ldW1dMX0VYVFJBXSAqIDk5IC8gMTAwKTsKKworICAvLyBEYW5uIG5vY2ggTWFpbHMgYmVhcmJlaXRlbgorICBtYWlsc19sYXN0X2hvdXI9MDsKKyAgbWFpbHJlYWQoKTsKKworICByZXR1cm47Cit9CisKKworLy8gICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgSUQtTWFuYWdlbWVudCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjCisKKy8vIE1hZ2llci1JRCBmdWVyIERhdGVpIHN0ciAoYWxzIE9iamVrdCBvZGVyIGFscyBTdHJpbmcpIGVybWl0dGVsbgorc3RyaW5nIGNyZWF0b3JfZmlsZShtaXhlZCBzdHIpIHsKKyAgc3RyaW5nICpzdHJzLHRtcDsKKyAgaW50IHM7CisKKyAgLy8gZnVsbF9wYXRoX2FycmF5IG5hY2ggc3RycworICAvLyBUT0RPOiB3YXMgaXN0IG1pdCBjbG9uZXM/CisgIGlmKG9iamVjdHAoc3RyKSkKKyAgICBzdHJzPWZ1bGxfcGF0aF9hcnJheShvYmplY3RfbmFtZShzdHIpLCAwKTsKKyAgZWxzZSBpZihzdHJpbmdwKHN0cikpCisgICAgc3Rycz1mdWxsX3BhdGhfYXJyYXkoc3RyLCAwKTsKKyAgZWxzZSByZXR1cm4gTk9CT0RZOworCisgIC8vIGFic29sdXRlIFBmYWRlIGludGVyZXNzaWVyZW4gaGllciBnZXJhZGUgbmljaHQuCisgIHN0cnMgLT0gKHsiIn0pOworCisgIHM9c2l6ZW9mKHN0cnMpOworICBpZihzPDIpIHJldHVybiBOT0JPRFk7CisKKyAgc3dpdGNoKHN0cnNbMF0pIHsKKyAgICBjYXNlIERPTUFJTkRJUjoKKyAgICAgIC8vIEZ1ZXIgTmljaHQtTWFnaWVyIGJ6dy4gIlBzZXVkby0iTWFnaWVyIGRpZSBSZWdpb25za2VubnVuZworICAgICAgaWYoIHM9PTIgfHwgV0laTFZMU1tzdHJzWzJdXSB8fCAhSVNfTEVBUk5FUihzdHJzWzJdKSApCisgICAgICAgIHJldHVybiBzdHJzWzFdOworCisgICAgICAvLyBpbiAvZC9lcnptYWdpZXIgZ2lidCBlcyBNYWdpZXItSURzCisgICAgICBpZiAoc3Ryc1sxXT09ImVyem1hZ2llciIpIHJldHVybiBzdHJzWzJdOworCisgICAgICAvLyBBbnNvbnN0ZW4gZC5yZWdpb24ubWFnaWVybmFtZQorICAgICAgcmV0dXJuIHNwcmludGYoImQuJXMuJXMiLCBzdHJzWzFdLCBzdHJzWzJdKTsKKyAKKyAgICBjYXNlIFBST0pFQ1RESVI6CisgICAgICAvLyBJbiBwLnNlcnZpY2UgZ2lidCBlcyBpZHMgbWl0IHVpZAorICAgICAgaWYgKHM+MiAmJiBzdHJzWzFdPT0ic2VydmljZSIpIHJldHVybiAicC5zZXJ2aWNlLiIrc3Ryc1syXTsKKworICAgICAgLy8gQW5zb25zdGVuIG51ciBwLnByb2pla3QgKHAuc2VydmljZSBpc3QgYXVjaCBoaWVyIGRyaW4pCisgICAgICByZXR1cm4gInAuIitzdHJzWzFdOworCisgICAgY2FzZSBXSVpBUkRESVI6CisgICAgICBpZiAocz4yKQorICAgICAgICByZXR1cm4gc3Ryc1sxXTsKKyAgICAgIGlmIChzPT0yICYmIGZpbGVfc2l6ZShzdHJzWzBdKyIvIitzdHJzWzFdKT09RlNJWkVfRElSKQorICAgICAgICByZXR1cm4gc3Ryc1sxXTsKKyAgICAgIHJldHVybiBOT0JPRFk7CisKKyAgICBjYXNlIFNFQ1VSRURJUjoKKyAgICAgIHJldHVybiBST09USUQ7CisKKyAgICBjYXNlIEdVSUxERElSOgorICAgIGNhc2UgU1BFTExCT09LRElSOgorICAgICAgdG1wPXN0cnNbMV07CisgICAgICBpZiAodG1wWzwyLi48Ml09PSIuIikgdG1wPXRtcFswLi48M107CisgICAgICBpZiAoKHM9bWVtYmVyKHRtcCwnLicpKT4wKSB0bXA9dG1wW3MrMS4uXTsKKyAgICAgIHJldHVybiAiR1VJTEQuIit0bXA7CisKKyAgICBjYXNlIExJQlJPT01ESVI6CisgICAgICByZXR1cm4gUk9PTUlEOworCisgICAgY2FzZSBTVERESVI6CisgICAgY2FzZSBMSUJPQkpESVI6CisgICAgICByZXR1cm4gQkFDS0JPTkVJRDsKKworICAgIGNhc2UgRE9DRElSOgorICAgICAgcmV0dXJuIERPQ0lEOworCisgICAgY2FzZSBNQUlMRElSOgorICAgICAgcmV0dXJuIE1BSUxJRDsKKyAgICBjYXNlIE5FV1NESVI6CisgICAgICByZXR1cm4gTkVXU0lEOworCisgICAgY2FzZSBMSUJJVEVNRElSOgorICAgICAgcmV0dXJuIElURU1JRDsKKworICAgIC8qIEZhbGwtVGhyb3VnaCAqLworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gTk9CT0RZOworCisgfQorIHJldHVybiBOT0JPRFk7ICAvL3Nob3VsZCBuZXZlciBiZSByZWFjaGVkLgorfQorCisvLyBVSUQgdW5kIEVVSUQgYW4gT2JqZWt0IGdlYmVuIChvZGVyIGViZW4gbmljaHQpCisvLyBLZWluZSBHRC1GdW5rdGlvbiwgYWJlciB2b24gSG9va3MgYXVmZ2VydWZlbgorcHJvdGVjdGVkIG1peGVkIGdpdmVfdWlkX3RvX29iamVjdChzdHJpbmcgZGF0ZWksb2JqZWN0IHBvKQoreworICBzdHJpbmcgY3JlYXRvcixwb3VpZDsKKworICAvLyBQYXJhbWV0ZXIgdGVzdGVuCisgIGlmICghc3RyaW5ncChkYXRlaSl8fCFvYmplY3RwKHBvKSkgIHJldHVybiAxOworCisgIC8vIEtlaW5lIE9iamVrdGUgaW4gL2xvZywgL29wZW4gb2RlciAvZGF0YQorICBpZiAoc3Ryc3RyKGRhdGVpLCAiLyJMSUJEQVRBRElSIi8iKSA9PSAwCisgICAgICB8fCBzdHJzdHIoZGF0ZWksICIvIkxJQkxPR0RJUiIvIikgPT0gMAorICAgICAgfHwgc3Ryc3RyKGRhdGVpLCAiLyJGVFBESVIiLyIpID09IDAKKyAgICAgICkKKyAgICAgIHJldHVybiAxOworCisgIC8vIERhdGVpIG11c3MgQmVzaXR6ZXIgaGFiZW4KKyAgaWYgKCEoY3JlYXRvcj1jcmVhdG9yX2ZpbGUoZGF0ZWkpKSkgcmV0dXJuIDE7CisKKyAgLy8gSGFjaywgZGFtaXQgc2ltdWxfZWZ1biBnZWxhZGVuIHdlcmRlbiBrYW5uCisgIGlmIChjcmVhdG9yPT1ST09USUQgJiYgcG89PVRPKSByZXR1cm4gUk9PVElEOworCisgIC8vIEtlaW5lIGV1aWQsIGtlaW4gTGFkZW4gLi4uCisgIGlmICghKHBvdWlkPWdldGV1aWQocG8pKSkgcmV0dXJuIDE7IC8vIERpc2FsbG93IGlmIG5vIGV1aWQgaW4gcG8KKworICAvLyBSb290IGdlbmVyaWVydCBrZWluZSBSb290LU9iamVrdGUgOy0pCisgIC8vIE51ciBVSUQgc2V0emVuCisgIGlmIChwb3VpZD09Uk9PVElEKQorICAgIHJldHVybiAoe2NyZWF0b3IsTk9CT0RZfSk7IC8vIHJvb3QgZG9lcyBub3QgY3JlYXRlIHJvb3Qgb2JqZWN0cyEKKworICAvLyBFVUlEIG1pdHNldHplbiwgd2VubiBQTz09Y3JlYXRvciBvZGVyIGNyZWF0b3I9PUJBQ0tCT05FSUQKKyAgaWYgKGNyZWF0b3I9PXBvdWlkIHx8IGNyZWF0b3I9PUJBQ0tCT05FSUQpCisgICAgcmV0dXJuIHBvdWlkOworCisgIHJldHVybiAoe2NyZWF0b3IsTk9CT0RZfSk7Cit9CisKKy8vIERpZSBTeXN0ZW0tSURzIG11ZXNzZW4gYmVrYW5udCBzZWluCitzdHJpbmcgZ2V0X21hc3Rlcl91aWQoKSAgICAgICAgICB7IHJldHVybiBST09USUQ7fQorc3RyaW5nIGdldF9iYl91aWQoKSAgICAgICAgICAgICAgeyByZXR1cm4gQkFDS0JPTkVJRDsgfQorLy8gVE9ETzogQmVpIGdldF93aXpfbmFtZSBrb2VubnRlIG1hbiAtIHNvIG1vZWdsaWNoIC0gYXVmICd3aXJrbGljaGUnCisvLyAgICAgICBNYWdpZXJuYW1lbiBnZWhlbiAoSWRlZSB2b24gbWFuZHJhZ29uKQorc3RyaW5nIGdldF93aXpfbmFtZShzdHJpbmcgZmlsZSkgeyByZXR1cm4gY3JlYXRvcl9maWxlKGZpbGUpO30KKworLy8gICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFNvbnN0aWdlIEdELUZ1bmt0aW9uZW4gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisvLyBTcGllbGVyIGhhdCBzaWNoIGVpbmdlbG9nZ3QKK3Byb3RlY3RlZCBvYmplY3QgY29ubmVjdCgpCit7CisgIHN0cmluZyBlcnI7CisgIGludCBlcnJubzsKKyAgb2JqZWN0IG9iLGJwOworCisjaWYgZGVmaW5lZChTU0xQT1JUKSAmJiBfX0VGVU5fREVGSU5FRF9fKHRsc19hdmFpbGFibGUpCisgIGlmIChlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKHRoaXNfcGxheWVyKCksIElJX01VRF9QT1JUKSA9PSBTU0xQT1JUKSB7CisgICAgLy8gcmVqZWN0IGNvbm5lY3Rpb24gb2YgVExTIGlzIG5vdCBhdmFpbGFibGUKKyAgICBpZiAoIXRsc19hdmFpbGFibGUoKSkKKyAgICAgIHJldHVybiAwOworICAgIC8vIGVzdGFibGlzaCBUTFMKKyAgICBlcnJubz10bHNfaW5pdF9jb25uZWN0aW9uKCk7CisgICAgaWYgKGVycm5vIDwgMCkgeworICAgICAgLy8gRmVobGVyIGltIFZlYmluZHVuZ3NhdWZiYXUKKyAgICAgIHByaW50ZigiQ2FuJ3QgZXN0YWJsaXNoIGEgVExTL1NTTCBlbmNyeXB0ZWQgY29ubmVjdGlvbjogJXNcbiIsCisgICAgICAgICAgdGxzX2Vycm9yKGVycm5vKSk7CisgICAgICByZXR1cm4gMDsgLy8gdGhpcyB3aWxsIGNsb3NlIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBjbGllbnQuCisgICAgfQorICB9CisjZW5kaWYKKworICAvLyBCbHVlcHJpbnQgaW0gRW52aXJvbm1lbnQ/IERhcyBnZWh0IG51biB3aXJrbGljaCBuaWNodCAuLi4KKyAgaWYgKChicD1maW5kX29iamVjdCgiL3NlY3VyZS9sb2dpbiIpKSAmJiBlbnZpcm9ubWVudChicCkpIAorICAgICAgY2F0Y2goZGVzdHJ1Y3QoYnApO3B1Ymxpc2gpOworCisgIC8vIExvZ2luLVNoZWxsIGNsb25lbgorICBlcnIgPSBjYXRjaChvYiA9IGNsb25lX29iamVjdCgic2VjdXJlL2xvZ2luIik7IHB1Ymxpc2gpOworCisgIGlmIChlcnJubyA9PSAwICYmIGVycikKKyAgICAgIHdyaXRlKCJGZWhsZXIgYmVpbSBMYWRlbiB2b24gL3NlY3VyZS9sb2dpbi5jXG4iK2VycisiXG4iKTsKKworICByZXR1cm4gb2I7Cit9CisKKy8vIFdhcyBtYWNoZW4gYmVpIGRpc2Nvbm5lY3Q/Citwcm90ZWN0ZWQgdm9pZCBkaXNjb25uZWN0KG9iamVjdCB3aG8sIHN0cmluZyByZW1haW5pbmcpIHsKKyAgICB3aG8tPk5ldERlYWQoKTsgcmV0dXJuOworfQorCisvLyBFcyBnaWJ0IGtlaW4gRmlsZSAnZmlsZW5hbWUnLiBWQyBha3RpdmllcmVuIHNvIHZvcmhhbmRlbiAuLi4KK3Byb3RlY3RlZCBvYmplY3QgY29tcGlsZV9vYmplY3Qoc3RyaW5nIGZpbGVuYW1lKQoreworICBvYmplY3QgcmV0OworICBzdHJpbmcgKnN0cjsKKyAgc3RyaW5nIGNvbXBpbGVyOworCisgIGlmICghc2l6ZW9mKGZpbGVuYW1lKSkgcmV0dXJuIDA7CisgIHN0cj1lZnVuOjpleHBsb2RlKGZpbGVuYW1lLCIvIik7CisKKyAgaWYoc2l6ZW9mKHN0cik8MikgcmV0dXJuIDA7CisgIGNvbXBpbGVyPWltcGxvZGUoc3RyWzAuLjwyXSwiLyIpKyIvdmlydHVhbF9jb21waWxlciI7CisgCisgIGlmIChmaW5kX29iamVjdChjb21waWxlcikKKyAgICAgIHx8IGZpbGVfc2l6ZShjb21waWxlcisiLmMiKT4wKQorICB7CisgICAgaWYoY2F0Y2goCisgICAgICAgICAgcmV0PShvYmplY3QpY2FsbF9vdGhlcihjb21waWxlciwiY29tcGlsZV9vYmplY3QiLHN0cls8MV0pOyBwdWJsaXNoKSkKKyAgICAgIHJldHVybiAwOworICB9CisgIGVsc2UKKyAgICAgIHJldHVybigwKTsKKworICBpZiAoIG9iamVjdHAocmV0KSAmJiBlZnVuOjpleHBsb2RlKGNyZWF0b3JfZmlsZShmaWxlbmFtZSksICIuIilbPDFdICE9CisgICAgICAgUkVBTF9FVUlEKHJldCkgKXsKKyAgICAgIGZ1bmNhbGwoIHN5bWJvbF9mdW5jdGlvbignbG9nX2ZpbGUvKicqLyksICJBUkNIL1ZDX01JU1NCUkFVQ0giLAorICAgICAgICAgICAgICAgc3ByaW50ZiggIiVzOiAlcyB2ZXJzdWNodCBwZXIgVkMgJXMgenUgJXMgdW16dWJlbmVubmVuIVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNhbGwoIHN5bWJvbF9mdW5jdGlvbignZHRpbWUvKicqLyksIHRpbWUoKSApLAorICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXNfaW50ZXJhY3RpdmUoKSA/IGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpOgorICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSksIG9iamVjdF9uYW1lKHJldCksCisgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUpICk7CisKKyAgICAgIHJldHVybiAwOworICB9CisgIHJldHVybiByZXQ7Cit9CisKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgU2h1dGRvd24gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIworCisvLyBTcGllbGVyIGJlaSBTaHV0ZG93biBlbnRmZXJuZW4KK3Byb3RlY3RlZCB2b2lkIHJlbW92ZV9wbGF5ZXIob2JqZWN0IHZpY3RpbSkKK3sKKyAgY2F0Y2godmljdGltLT5xdWl0KCkpOworICBpZiAodmljdGltKSBjYXRjaCh2aWN0aW0tPnJlbW92ZSgpKTsKKyAgaWYgKHZpY3RpbSkgZGVzdHJ1Y3QodmljdGltKTsKKyAgcmV0dXJuOworfQorCisvLyBMYW5nc2FtZXIgU2h1dGRvd24gCitwcm90ZWN0ZWQgdm9pZCBzbG93X3NodXRfZG93bihpbnQgbWludXRlcykKK3sKKyAgLy9zb2xsdGUgbnVyIHZvbSBHRCBnZXJ1ZmVuIHdlcmRlbi4gT2RlciBhbGxlbmZhbGxzIE1hc3RlciBzZWxic3QKKyAgZmlsdGVyKHVzZXJzKCksIyd0ZWxsX29iamVjdCwKKyAgIkRlciBHYW1lZHJpdmVyIHJ1ZnQ6IERlciBTcGVpY2hlciB3aXJkIGtuYXBwICEgQmVyZWl0ZXQgZXVjaCBhdWYgZGFzIEVuZGUgdm9yICFcbiIpOworICAiL29iai9zaHV0Ii0+c2h1dChtaW51dGVzKTsKKyAgcmV0dXJuOworfQorCisKKy8vIEluIExEIHZhcmFyZ3Mgdm9pZCBub3RpZnlfc2h1dGRvd24oc3RyaW5nIGNyYXNoX3JlYXNvbikKK3Byb3RlY3RlZCB2YXJhcmdzIHZvaWQgbm90aWZ5X3NodXRkb3duIChzdHJpbmcgY3Jhc2hfcmVhc29uKSB7CisKKyAgaWYgKFBPICYmIFBPICE9IFRPKQorICAgIHJldHVybjsKKyAgaWYgKGNyYXNoX3JlYXNvbikgeworICAgICAgLy9VaG9oLi4uIFZlcmRhbW10ZXIgQ3Jhc2guIDotKCBadW1pbmRlc3QgbWFsIG1pdGxvZ2dlbiwKKyAgICAgIC8vd2FzIGRlciBEcml2ZXIgc2FndC4uLgorICAgICAgd3JpdGVfZmlsZShDUkFTSF9MT0csc3ByaW50ZigKKyAgICAgICAgICAgICJcbiVzOiBUaGUgZHJpdmVyIGNyYXNoZWQhIFJlYXNvbjogJXNcbiIsCisgICAgICAgICAgICBjdGltZSh0aW1lKCkpLGNyYXNoX3JlYXNvbikpOworICB9CisKKyAgZmlsdGVyKHVzZXJzKCksICMndGVsbF9vYmplY3QsCisgICAgICAgICAgICAgICAiR2FtZSBkcml2ZXIgc2hvdXRzOiBMRG11ZCBzaHV0dGluZyBkb3duIGltbWVkaWF0ZWx5LlxuIik7CisgIHNhdmVfd2l6X2ZpbGUoKTsKKyAgcmV0dXJuOworfQorCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQmVyZWNodGlndW5nZW4gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIworCisvLyBEYXJmIFZlcmJpbmR1bmcgZHVyY2ggbmFtZSB2b24gb2Jmcm9tIG5hY2ggb2IgZ2VsZWd0IHdlcmRlbj8KKworLy9pbnQgdmFsaWRfZXhlYyhzdHJpbmcgbmFtZSkge3JldHVybiAxO30KKworaW50IHZhbGlkX2V4ZWMoc3RyaW5nIG5hbWUsIG9iamVjdCBvYiwgb2JqZWN0IG9iZnJvbSkKK3sKKyAgLy8gVW5ndWVsdGlnZSBQYXJhbWV0ZXIgb2RlciBBdWZydWYgZHVyY2ggcHJvY2Vzc19zdHJpbmcgLT4gQWJicnVjaAorICBpZiAoIW9iamVjdHAob2IpIHx8ICFvYmplY3RwKG9iZnJvbSkgCisgICAgICB8fCAhc3RyaW5ncChuYW1lKSB8fCAhc2l6ZW9mKG5hbWUpCisgICAgICB8fCBmdW5jYWxsKHN5bWJvbF9mdW5jdGlvbigncHJvY2Vzc19jYWxsKSkgKQorICAgIHJldHVybiAwOworCisgIC8vIHJlbmV3X3BsYXllcl9vYmplY3QoKSBkYXJmIC4uLgorICBpZiAobmFtZT09Ii9zZWN1cmUvbWFzdGVyL21pc2MuYyIKKyAgICAgIHx8IG5hbWU9PSJzZWN1cmUvbWFzdGVyL21pc2MuYyIpCisgICAgcmV0dXJuIDE7CisKKyAgLy8gQW5zb25zdGVuIGRhcmYgc2ljaCBudXIgZGllIFNoZWxsIHNlbGJlciBhZW5kZXJuIC4uLgorICBpZiAocHJldmlvdXNfb2JqZWN0KCkgIT0gb2Jmcm9tKSByZXR1cm4gMDsKKworICAvLyBEaWUgTG9naW4tU2hlbGwgenUgamVkZW0gT2JqZWt0IC4uLgorICBpZiAobmFtZT09Ii9zZWN1cmUvbG9naW4uYyIKKyAgICAgIHx8IG5hbWU9PSJzZWN1cmUvbG9naW4uYyIpCisgICAgcmV0dXJuIDE7CisKKyAgLy8gTWFnaWVyIHBlciBleGVjIG51ciwgd2VubiBzaWUgZGFtaXQga2VpbmUgRnJlbWRlIHVpZC9ldWlkIGJla29tbWVuCisgIGlmICh0aGlzX2ludGVyYWN0aXZlKCkgPT0gb2Jmcm9tICYmIGdldHVpZChvYmZyb20pID09IGdldHVpZChvYikgCisgICAgICAmJiBnZXRldWlkKG9iZnJvbSkgPT0gZ2V0ZXVpZChvYikpIAorICAgICAgcmV0dXJuIDE7CisKKyAgLy8gU29uc3QgZGFyZiBuaWVtYW5kIHdhcworICByZXR1cm4gMDsKK30KKworCisvLyBEYXJmIG1lIHlvdSBzbm9vcGVuPworaW50IHZhbGlkX3Nub29wKG9iamVjdCBtZSwgb2JqZWN0IHlvdSkgeyAKKyAgICByZXR1cm4gZ2V0dWlkKFBPKSA9PSBST09USUQ7IAorfQorCisvLyBEYXJmIHdpeiB3aXNzZW4sIG9iIGVyIGdlc25vb3B0IHdpcmQ/CitpbnQgdmFsaWRfcXVlcnlfc25vb3Aob2JqZWN0IHdpeikgeworICAgIHJldHVybiBnZXR1aWQoUE8pID09IFJPT1RJRDsgCit9CisKKy8vIERhcmYgb2Igc2VpbmUgRVVJRCBhdWYgbmV3ZXVpZCBzZXR6ZW4/CitpbnQgdmFsaWRfc2V0ZXVpZChvYmplY3Qgb2IsIHN0cmluZyBuZXdldWlkKQoreworICByZXR1cm4gKG9iPT10aGlzX29iamVjdCgpIHx8CisgICAgICAgICAgZ2V0dWlkKG9iKSA9PSBST09USUQgfHwKKyAgICAgICAgICBnZXR1aWQob2IpID09IG5ld2V1aWQgfHwKKyAgICAgICAgICBjcmVhdG9yX2ZpbGUob2JqZWN0X25hbWUob2IpKSA9PSBuZXdldWlkKTsKK30KKworLy8gRGFyZiBnZXRyYWNlZCB3ZXJkZW4/CitpbnQgdmFsaWRfdHJhY2Uoc3RyaW5nIHdoYXQsIG1peGVkIGFyZykgeyAKKyAgICByZXR1cm4gSVNfQVJDSChUSSk7Cit9CisKKworLy8gdmFsaWRfd3JpdGUoKSB1bmQKKy8vIHZhbGlkX3JlYWQoKSBiZWZpbmRlbiBzaWNoIGluIGZpbGVfYWNjZXNzLmMKKworCisvLyBEYXJmIFBPIG9iIHNoYWRvd2VuPworaW50IHF1ZXJ5X2FsbG93X3NoYWRvdyhvYmplY3Qgb2IpCit7CisgIC8vIFJPT1QgZGFyZiBuaWNodCBnZXNoYWRvd2VkIHdlcmRlbgorICBpZihnZXR1aWQob2IpID09IFJPT1RJRCkKKyAgICByZXR1cm4gMDsKKyAgCisgIC8vIEFjY2Vzcy1SaWdodHMgYXVjaCBuaWNodAorICBpZiAoZWZ1bjo6ZXhwbG9kZShvYmplY3RfbmFtZShvYiksIiMiKVswXVs8MTQuLl09PSIvYWNjZXNzX3JpZ2h0cyIpCisgICAgcmV0dXJuIDA7CisgIAorICAvLyBBbnNvbnN0ZW4gcXVlcnlfcHJldmVudF9zaGFkb3cgZnJhZ2VuIC4uLgorICByZXR1cm4gIShpbnQpb2ItPnF1ZXJ5X3ByZXZlbnRfc2hhZG93KFBPKTsKK30KKworCisvKiBwcml2aWxlZ2VfdmlvbGF0aW9uIGlzIGNhbGxlZCB3aGVuIG9iamVjdHMgdHJ5IHRvIGRvIGlsbGVnYWwgdGhpbmdzLAorICogb3IgZmlsZXMgYmVpbmcgY29tcGlsZWQgcmVxdWVzdCBhIHByaXZpbGVnZWQgZWZ1bi4KKyAqCisgKiByZXR1cm4gdmFsdWVzOgorICogICAxOiBUaGUgY2FsbGVyL2ZpbGUgaXMgYWxsb3dlZCB0byB1c2UgdGhlIHByaXZpbGVnZS4KKyAqICAgMDogVGhlIGNhbGxlciB3YXMgcHJvYmFibHkgbWlzbGVhZGVkOyB0cnkgdG8gZml4IHRoZSBlcnJvci4KKyAqICAtMTogQSByZWFsIHByaXZpbGVnZSB2aW9sYXRpb24uIEhhbmRsZSBpdCBhcyBlcnJvci4KKyAqLworaW50IHByaXZpbGVnZV92aW9sYXRpb24oc3RyaW5nIG9wLCBtaXhlZCB3aG8sIG1peGVkIGFyZzEsIG1peGVkIGFyZzIpCit7CisKKyAgaWYgKG9iamVjdHAod2hvKSAmJiAKKyAgICAgICh3aG89PXRoaXNfb2JqZWN0KCkgfHwgZ2V0ZXVpZCh3aG8pPT1ST09USUQpKQorICAgIHJldHVybiAxOyAKKworICBzd2l0Y2gob3ApCisgIHsKKyAgICBjYXNlICJjYWxsX291dF9pbmZvIjoKKyAgICAgIHJldHVybiAtMTsKKyAgICBjYXNlICJzZW5kX3VkcCI6CisgICAgICByZXR1cm4gMTsKKworICAgIGNhc2UgIm5vbWFzayBzaW11bF9lZnVuIjoKKyAgICAgIC8vIDx3aG8+IGlzdCBpbiBkaWVzZW0gRmFsbCBlaW4gc3RyaW5nIChGaWxlbmFtZSkgdW5kIGRhbWl0IHZvbiBkZW0KKyAgICAgIC8vIENoZWNrIGRhIG9iZW4gbmljaHQgYWJnZWRlY2t0LiBEYWhlciBleHBsaXppdGUgQmVoYW5kbHVuZyBoaWVyLgorICAgICAgLy8gQXVzc2VyZGVtIGhhdCBkZXIgUGZhZCAoenVyIFplaXQgbm9jaCkga2VpbmVuIGZ1ZWhyZW5kZW4gJy8nLgorICAgICAgLy8gRmFsbHMgZGFzIGplbWFuZCBlaW5zY2hyYWVua2VuIHdpbGw6IGRlciBLcmFtIGZ1ZXIgZGllIHNpbXVsX2VmdW5zCisgICAgICAvLyBtdXNzIGRhcyBkdWVyZmVuIQorICAgICAgaWYgKHN0cmluZ3Aod2hvKQorICAgICAgICAgICYmIHN0cnN0cih3aG8sInNlY3VyZS8iKSA9PSAwKQorICAgICAgICByZXR1cm4gMTsKKyAgICAgIHJldHVybiAwOyAvLyBhbGxlIGFuZGVyZSBuaWNodC4KKworICAgIGNhc2UgImdldF9leHRyYV93aXppbmZvIjoKKyAgICAgIC8vIGJlbnV0enQgdm9uIC9zZWN1cmUvbWVtb3J5LmMgdW5kIC9zZWN1cmUvc2ltdWxfZWZ1bi5jCisgICAgY2FzZSAic2V0X2V4dHJhX3dpemluZm8iOgorICAgICAgLy8gd2lyZCBiZW51dHp0IHZvbiBzaW11bF9lZnVuLmMsIHdlbGNoZSBhYmVyIGFscyBST09ULU9iamVrdCBpbXBsaXppdAorICAgICAgLy8gZXJsYXVidCBpc3QgKHMuby4pCisgICAgICByZXR1cm4gLTE7IC8vIGZ1ZXIgYWxsZW4gbmljaHQgZXJsYXVidC4KKworICAgIGNhc2UgInJlbmFtZV9vYmplY3QiOgorICAgICAgaWYgKG9iamVjdF9uYW1lKHdobyk9PSIvc2VjdXJlL2ltcGZldGNoIiB8fAorICAgICAgICAgIEJMVUVfTkFNRSh3aG8pPT0iL3NlY3VyZS9sb2dpbiIpCisgICAgICAgIHJldHVybiAxOworICAgICAgcmV0dXJuKC0xKTsKKworICAgIGNhc2UgImNvbmZpZ3VyZV9kcml2ZXIiOiAKKyAgICAgIHJldHVybiBjYWxsX3NlZnVuKCJzZWN1cmVfbGV2ZWwiKSA+PSBBUkNIX0xWTDsKKworICAgIGNhc2UgImxpbWl0ZWQiOgorICAgICAgLy8gU3BpZWxlcnNoZWxscyBkdWVyZmVuIHNpY2ggenVzYWV0emxpY2hlIFRpY2tzIGZ1ZXIgZGVuIEF1ZnJ1ZiB2b24KKyAgICAgIC8vIDo6ZGllKCkgYmVzY2hhZmZlbiwgZGFtaXQgZGVyIFRvZCBuaWNodCB3ZWdlbiB3ZW5pZyBUaWNrcyBidWdndC4KKyAgICAgIGlmIChzdHJzdHIobG9hZF9uYW1lKHdobyksICIvc3RkL3NoZWxscy8iKSA9PSAwCisgICAgICAgICAgJiYgZ2V0X3R5cGVfaW5mbyhhcmcxLCAyKSA9PSB3aG8KKyAgICAgICAgICAmJiBnZXRfdHlwZV9pbmZvKGFyZzEsIDMpID09ICIvc3RkL2xpdmluZy9saWZlIgorLy8gICAgICAgICAgJiYgZ2V0X3R5cGVfaW5mbyhhcmcxLCA0KSA9PSAiZGllIgorICAgICAgICAgICYmIGFyZzJbTElNSVRfRVZBTF0gPD0gMTAwMDAwMDAgKSB7CisgICAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgICAvL0RFQlVHKHNwcmludGYoIiVPLCAlTywgJU8iLCB3aG8sIGFyZzEsIGFyZzIpKTsKKyAgICAgIGludCAqbGltaXRzPWVmdW46OmRyaXZlcl9pbmZvKERJX0NVUlJFTlRfUlVOVElNRV9MSU1JVFMpOworICAgICAgLy8gTElNSVRfRVZBTCBkYXJmIHZlcnJpbmdlcnQgd2VyZGVuLiBBbGxlIGFuZGVyZW4gTGltaXRzIGR1ZXJmZW4gbmljaHQKKyAgICAgIC8vIGdlYWVuZGVydCB3ZXJkZW4uIEFjaGphLCBMSU1JVF9FVkFMIGRhcmYgbmljaHQgMCAoTElNSVRfVU5MSU1JVEVEKQorICAgICAgLy8gc2Vpbi4gKmcqCisgICAgICAvLyBMSU1JVF9DT1NUIGRhcmYgZW50d2VkZXIgMCBvZGVyIC0xMDAgc2Vpbi4KKyAgICAgIGlmIChhcmcyW0xJTUlUX0VWQUxdPjEwMDAgJiYgKGFyZzJbTElNSVRfRVZBTF0gPCBnZXRfZXZhbF9jb3N0KCkpLTUwMAorICAgICAgICAgICYmIGFyZzJbTElNSVRfQVJSQVldID09IGxpbWl0c1tMSU1JVF9BUlJBWV0KKyAgICAgICAgICAmJiBhcmcyW0xJTUlUX01BUFBJTkdfS0VZU10gPT0gbGltaXRzW0xJTUlUX01BUFBJTkdfS0VZU10KKyAgICAgICAgICAmJiBhcmcyW0xJTUlUX01BUFBJTkdfU0laRV0gPT0gbGltaXRzW0xJTUlUX01BUFBJTkdfU0laRV0KKyAgICAgICAgICAmJiBhcmcyW0xJTUlUX0JZVEVdID09IGxpbWl0c1tMSU1JVF9CWVRFXQorICAgICAgICAgICYmIGFyZzJbTElNSVRfRklMRV0gPT0gbGltaXRzW0xJTUlUX0ZJTEVdCisgICAgICAgICAgJiYgYXJnMltMSU1JVF9DQUxMT1VUU10gPT0gbGltaXRzW0xJTUlUX0NBTExPVVRTXQorICAgICAgICAgICYmIChhcmcyW0xJTUlUX0NPU1RdID09IDAgfHwgYXJnMltMSU1JVF9DT1NUXSA9PSAtMTAwKSApCisgICAgICAgICAgICByZXR1cm4oMSk7CisgICAgICAvL3NvbnN0IHZlcndlaWdlcm4uCisgICAgICByZXR1cm4oLTEpOworCisgICAgY2FzZSAic3FsaXRlX3ByYWdtYSI6CisgICAgICByZXR1cm4gMTsKKyAgICBjYXNlICJhdHRhY2hfZXJxX2RlbW9uIjoKKyAgICBjYXNlICJiaW5kX2xhbWJkYSI6IAorICAgIGNhc2UgImNvbmZpZ3VyZV9pbnRlcmFjdGl2ZSI6CisgICAgY2FzZSAiY29uZmlndXJlX29iamVjdCI6CisgICAgY2FzZSAiZXhlY3V0ZV9jb21tYW5kIjoKKyAgICBjYXNlICJlcnEiOiAKKyAgICBjYXNlICJpbnB1dF90byI6CisgICAgY2FzZSAibXlzcWwiOgorICAgIGNhc2UgIm5ldF9jb25uZWN0IjoKKyAgICBjYXNlICJwZ3NxbCI6CisgICAgY2FzZSAic2V0X2RyaXZlcl9ob29rIjoKKyAgICBjYXNlICJzZXRfdGhpc19vYmplY3QiOgorICAgIGNhc2UgInNoYWRvd19hZGRfYWN0aW9uIjoKKyAgICBjYXNlICJzeW1ib2xfdmFyaWFibGUiOgorICAgIGNhc2UgInZhcmlhYmxlX2xpc3QiOgorICAgIGNhc2UgIndpemxpc3RfaW5mbyI6CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybigtMSk7CisgIH0KKyAgcmV0dXJuIC0xOworfQorCisvLyAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEZlaGxlcmJlaGFuZGx1bmcgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIworCisvLyBCZWhhbmRsdW5nIHZvbiBGZWhsZXIgaW0gSGVhcnRfQmVhdAorcHJvdGVjdGVkIGludCBoZWFydF9iZWF0X2Vycm9yKCBvYmplY3QgY3VscHJpdCwgc3RyaW5nIGVycm9yLCBzdHJpbmcgcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjdXJyZW50X29iamVjdCwgaW50IGxpbmUsIGludCBjYXVnaHQpCit7CisgIGlmICghb2JqZWN0cChjdWxwcml0KSkgcmV0dXJuIDA7CisgIGlmIChpbnRlcmFjdGl2ZShjdWxwcml0KSkKKyAgeworICAgIHRlbGxfb2JqZWN0KGN1bHByaXQsIkRlciBHYW1lRHJpdmVyIHRlaWx0IERpciBtaXQ6ICIKKyAgICAgICAgICAgICAgICAiRGVpbiBIZXJ6c2NobGFnIGhhdCBhdXNnZXNldHp0IVxuIik7CisgICAgaWYgKElTX0xFQVJORVIoY3VscHJpdCkpCisgICAgICB0ZWxsX29iamVjdChjdWxwcml0LAorICAgICAgICAgICAgICAgICAgc3ByaW50ZigiRmVobGVyOiAlc1Byb2dhbW06ICVzLCBDdXJyT2JqOiAlcywgWmVpbGU6ICVkLCAiCisgICAgICAgICAgICAgICAgICAgICJ0aGUgZXJyb3Igd2FzICVzY2F1Z2h0IGF0IGhpZ2hlciBsZXZlbC5cbiIsCisgICAgICAgICAgICAgICAgICAgIGVycm9yLHByb2dyYW0sY3VycmVudF9vYmplY3QsbGluZSwKKyAgICAgICAgICAgICAgICAgICAgY2F1Z2h0ID8gIiIgOiAibm90IikpOworICB9CisKKyAgaWYgKGVmdW46Om9iamVjdF9pbmZvKGN1bHByaXQsIE9JX09OQ0VfSU5URVJBQ1RJVkUpKQorICAgIGNhbGxfb3V0KCJyZXN0YXJ0X2hlYXJ0X2JlYXQiLCA1LCBjdWxwcml0KTsKKyAgZWxzZQorICAgIGNhdGNoKGN1bHByaXQtPm1ha2VfaW1tb3J0YWwoKTsgcHVibGlzaCk7CisgIHJldHVybiAwOworfQorCisvLyBBdXNnYWJlIGVpbmVyIE1lbGR1bmcgYW4gU3BpZWxlciBtaXQgTGV2ZWwgPj0gbWlubGV2ZWwuIFdpcmQgZ2VudXR6dCwgdW0KKy8vIE1hZ2llciB1ZWJlciBGZWhsZXIgenUgaW5mb3JtaWVyZW4sIGRpZSBuaWNodCBub3JtYWwgYmVoYW5kZWx0IHdlcmRlbgorLy8gKHouQi4gcmVrdXJzaXZlIEZlaGxlciwgZC5oLiBGZWhsZXIgaW4gZGVyIEZlaGxlcmJlaGFuZGx1bmcpCitwcml2YXRlIHZvaWQgdGVsbF9wbGF5ZXJzKHN0cmluZyBtc2csIGludCBtaW5sZXZlbCkgeworICBtc2cgPSBlZnVuOjpzcHJpbnRmKCIlPS03OHMiLCJNYXN0ZXI6ICIgKyBtc2cpOyAvLyB1bWJyZWNoZW4KKyAgZWZ1bjo6ZmlsdGVyKGVmdW46OnVzZXJzKCksIGZ1bmN0aW9uIGludCAob2JqZWN0IHBsKQorICAgICAgeworICAgICAgICBpZiAocXVlcnlfd2l6X2xldmVsKHBsKSA+PSBtaW5sZXZlbCkKKyAgICAgICAgICBlZnVuOjp0ZWxsX29iamVjdChwbCwgbXNnKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9ICk7Cit9CisKKy8qKgorICogXGJyaWVmIEVycm9yIGhhbmRsaW5nIGZ1ZXIgRmVobGVyIGJlaW0gQ29tcGlsaWVyZW4uCisgKgorICogbG9nX2Vycm9yKCkgd2lyZCB2b20gR2FtZURyaXZlciBhdWZnZXJ1ZmVuLCB3ZW5uIHp1ciBDb21waWxlLVplaXQgZWluCisgKiBGZWhsZXIgYXVmdHJhdC4gRGllIEZlaGxlcm1lbGR1bmcgd2lyZCB1bnRlciAvbG9nL2Vycm9yIGdlbG9nZ3QuCisgKiBGYWxscyB0aGlzX2ludGVyYWN0aXZlKCkgZWluIE1hZ2llciBpc3QsIGJla29tbXQgZXIgZGllIEZlaGxlcm1lbGR1bmcKKyAqIGRpcmVrdCBhbmdlemVpZ3QuCisgKiBTb2xsdGUgZGFzIExvZ2ZpbGUgNTBrQiB1ZWJlcnNjaHJlaXRlbiwgd2lyZCBlcyByb3RpZXJ0LiBBdWYgW0VudHdpY2tsdW5nXQorICogd2lyZCBkYW5uIGVpbmUgRmVobGVybWVsZHVuZyBhYmdlc2V0enQuCisgKgorICogQHBhcmFtIGZpbGUgRGllIERhdGVpLCBpbiBkZXIgZGVyIEZlaGxlciBhdWZ0cmF0LgorICogQHBhcmFtIG1lc3NhZ2UgRGllIEZlaGxlcm1lbGR1bmcuCisgKiBAcGFyYW0gd2FybiBXYXJudW5nICh3YXJuIT0wKSBvZGVyIEZlaGxlciAod2Fybj09MCk/CisgKiAqLworCitwcm90ZWN0ZWQgdm9pZCBsb2dfZXJyb3Ioc3RyaW5nIGZpbGUsIHN0cmluZyBtZXNzYWdlLCBpbnQgd2FybikgeworICBzdHJpbmcgbGZpbGU7CisgIHN0cmluZyBjcjsKKyAgbWl4ZWQgKmxmaWxlX3NpemU7CisKKyAgaWYgKGhhbmRsaW5nX2Vycm9yID09IGVmdW46OnRpbWUoKSkgeworICAgIC8vIEZlaGxlciBpbSBWZXJsYXVmIGVpbmVyIEZlaGxlcmJlaGFuZGx1bmc6IEZlaGxlcmJlaGFuZGx1bmcgbWluaW1pZXJlbiwKKyAgICAvLyBudXIgTWVsZHVuZyBhbiBlaW5nZWxvZ2d0ZSBFcnptYWdpZXIuCisgICAgdGVsbF9wbGF5ZXJzKCJsb2dfZXJyb3IoKTogUmVrdXJzaXZlciBGZWhsZXIgaW4gRmVobGVyYmVoYW5kbHVuZy4gIgorICAgICAgICAiQml0dGUgRGVidWdsb2cgYmVhY2h0ZW4uIEFrdHVlbGxlciBGZWhsZXIgaW4gIiArIGZpbGUgKyAiOiAiCisgICAgICAgICsgbWVzc2FnZSwgQVJDSF9MVkwpOworICAgIHJldHVybjsKKyAgfQorICBoYW5kbGluZ19lcnJvciA9IGVmdW46OnRpbWUoKTsKKworIC8vRmVobGVyZGF0ZW4gYW4gZGVuIEVycm9yZCB6dXIgU3BlaWNoZXJ1bmcgd2VpdGVyZ2ViZW4sIGZhbGxzIHdpciBzb3dhcworIC8vaGFiZW4uCisjaWZkZWYgRVJST1JECisgIC8vIE9ubHkgY2FsbCB0aGUgZXJyb3JkIGlmIHdlIGFyZSBfbm90XyBjb21waWxpbmcgdGhlIHNlZnVucy4gSXQgdXNlcyBzZWZ1bnMKKyAgLy8gYW5kIGl0IHdpbGwgY2F1c2UgYSByZWN1cnNpbmcgY2FsbCB0byBnZXRfc2ltdWxfZWZ1bnMoKSB3aGljaCBpcyBib3VuZCB0bworICAvLyBmYWlsLgorICBpZiAoIWxvYWRpbmdfc2ltdWxfZWZ1bnMpIHsKKyAgICBjYXRjaChsaW1pdGVkKCMnY2FsbF9vdGhlciwoezIwMDAwMH0pLEVSUk9SRCwiTG9nQ29tcGlsZVByb2JsZW0iLAorICAgICAgICAgIGZpbGUsbWVzc2FnZSx3YXJuKTtwdWJsaXNoICk7CisgIH0KKyNlbmRpZiAvLyBFUlJPUkQKKworIC8vIExvZ2ZpbGUgYmVzdGltbWVuCisgIGNyPWNyZWF0b3JfZmlsZShmaWxlKTsKKyAgaWYgKCFjcikgICAgICAgICAgICAgICAgICAgICBsZmlsZT0iTk9CT0RZLmVyciI7CisgIGVsc2UgaWYgKGNyPT1ST09USUQpICAgICAgICAgbGZpbGU9IlJPT1QiOworICBlbHNlIGlmIChlZnVuOjptZW1iZXIoY3IsJyAnKSE9LTEpIGxmaWxlPSJTVEQiOworICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgIGxmaWxlPWNyOworICAvL2plIG5hY2ggV2FybnVuZyBvZGVyIEZlaGxlciBWZXJ6ZWljaG5pcyB1bmQgU3VmZml4IGJlc3RpbW1lbgorICBpZiAod2FybikgeworICAgICAgbGZpbGU9Ii9sb2cvd2FybmluZy8iICsgbGZpbGUgKyAiLndhcm4iOworICB9CisgIGVsc2UgeworICAgICAgbGZpbGU9Ii9sb2cvZXJyb3IvIiArIGxmaWxlICsgIi5lcnIiOworICB9CisKKyAgLy8gQmVpIEJlZGFyZiBSb3RpZXJlbiBkZXMgTG9nZmlsZXMKKyAgaWYgKCAhbG9hZGluZ19zaW11bF9lZnVucworICAgICAgJiYgc2l6ZW9mKGxmaWxlX3NpemUgPSBnZXRfZGlyKGxmaWxlLDIpKQorICAgICAgJiYgbGZpbGVfc2l6ZVswXSA+PSBNQVhfRVJSTE9HX1NJWkUgKQorICB7CisgICAgY2F0Y2gocmVuYW1lKGxmaWxlLCBsZmlsZSArICIub2xkIik7IHB1Ymxpc2gpOyAvKiBObyBwYW5pYyBpZiBmYWlsdXJlICovCisgICAgaWYgKCFsb2FkaW5nX3NpbXVsX2VmdW5zKQorICAgIHsKKyAgICAgIGNhdGNoKHNlbmRfY2hhbm5lbF9tc2coIkVudHdpY2tsdW5nIiwiPE1hc3RlUj4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxvZ2ZpbGUgcm90aWVydDogIitsZmlsZSsiLiIpKTsKKyAgICB9CisgIH0KKworICBlZnVuOjp3cml0ZV9maWxlKGxmaWxlLG1lc3NhZ2UpOworCisgIC8vIE1hZ2llciBiZWtvbW1lbiBkaWUgRmVobGVybWVsZHVuZyBhbmdlemVpZ3QKKyAgaWYgKElTX0xFQVJORVIoVEkpKSBlZnVuOjp0ZWxsX29iamVjdChUSSwgbWVzc2FnZSk7CisKKyAgaGFuZGxpbmdfZXJyb3IgPSAwOworfQorCisvKiBHZWdlbm1hc3NuYWhtZSBnZWdlbiAndG9vIGxvbmcgZXZhbCcgaW0gSGFuZGxlciB2b20gcnVudGltZSBlcnJvcjoKKyAgIEF1ZnNwbGl0dGVuIGRlcyBIYW5kbGVycyB1bmQgTnV0enVuZyB2b24gbGltaXRlZCgpICovCisvL2tlaW5lIEdELUZ1bmt0aW9uCitwcml2YXRlIHZvaWQgaGFuZGxlX3J1bnRpbWVfZXJyb3Ioc3RyaW5nIGVyciwgc3RyaW5nIHByZywgc3RyaW5nIGN1cm9iaiwKKyAgICBpbnQgbGluZSwgbWl4ZWQgY3VscHJpdCwgaW50IGNhdWdodCwgb2JqZWN0IHBvLCBpbnQgaXNzdWVpZCkKK3sKKyAgc3RyaW5nIGNvZGU7CisgIHN0cmluZyBkZWJ1Z190eHQ7CisgIG9iamVjdCBvYiwgdGl0cDsgCisKKyAgLy9ERUJVRyhzcHJpbnRmKCJDYWxsZXJzdGFjazogKGhhbmRsZV9ydW50aW1lX2Vycm9yKCkpOiAlT1xuIiwKKyAgLy8gICAgICAgIGNhbGxlcl9zdGFjaygxKSkpOworICAvLyBGZWhsZXJtZWxkdW5nIGJhdWVuCisgIGlmICghc3RyaW5ncChlcnIpKSAgICBlcnI9IjxOVUxMPiI7CisgIGlmICghc3RyaW5ncChwcmcpKSAgICBwcmc9IjxOVUxMPiI7CisgIGlmICghc3RyaW5ncChjdXJvYmopKSBjdXJvYmo9IjxOVUxMPiI7CisgIGRlYnVnX3R4dD1lZnVuOjpzcHJpbnRmKCJGZWhsZXI6ICVPLCBPYmpla3Q6ICVzLCBQcm9ncmFtbTogJU8sIFplaWxlICVPICglcyksICIKKyAgICAgICAgICAgICAgICAgICAgIklEOiAlZCIsCisgICAgICAgICAgICAgICAgICAgIGVyclswLi48Ml0sIGN1cm9iaiwgKHByZ1swXSE9JzwnPyIvIjoiIikrcHJnLCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAoVEk/ZWZ1bjo6Y2FwaXRhbGl6ZShlZnVuOjpnZXR1aWQoVEkpKToiPFVuYmVrYW5udD4iKSwKKyAgICAgICAgICAgICAgICAgICAgaXNzdWVpZCk7CisKKyAgdGl0cCA9IFRJIHx8IFRQOworICAvLyBGZWhsZXJtZWxkdW5nIGFuIEthbmFlbGUgc2NoaWNrZW4sIGFiZXIgbnVyIHdlbm4gZGVyIGFrdHVlbGxlIEZlaGxlcgorICAvLyBuaWNodCB3YWVocmVuZCBkZXMgbGFkZW5zIGRlciBzaW11bGVmdW5zIGF1ZnRyYXQsIGJlaSBkZXIgQXVzZ2FiZSBkZXIKKyAgLy8gTWVsZHVuZyB1ZWJlciBkaWUgS2FlbmFlbGUgd2llZGVyIHNlZnVucyBnZW51dHp0IHdlcmRlbi4KKyAgaWYgKCFsb2FkaW5nX3NpbXVsX2VmdW5zKSB7CisgICAgaWYgKHRpdHAgJiYgKElTX0xFQVJORVIodGl0cCkgfHwgKHRpdHAtPlF1ZXJ5UHJvcChQX1RFU1RQTEFZRVIpKSkpCisgICAgeworICAgICAgY2F0Y2goc2VuZF9jaGFubmVsX21zZygiRW50d2lja2x1bmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKG9iamVjdHAocG8pID8gUkVBTF9VSUQocG8pIDogIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z190eHQpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGNhdGNoKHNlbmRfY2hhbm5lbF9tc2coIkRlYnVnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShvYmplY3RwKHBvKSA/IFJFQUxfVUlEKHBvKSA6ICIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdfdHh0KSk7CisgICAgfQorICB9CisKKyAgaWYgKCF0aXRwKSByZXR1cm47CisKKyAgLy8gRmVobGVybWVsZHVuZyBhbiBCZW51dHplcgorICBpZiAoSVNfTEVBUk5FUih0aXRwKSkKKyAgICBlZnVuOjp0ZWxsX29iamVjdCh0aXRwLAorICAgICAgICAgICAgICAgIGVmdW46OnNwcmludGYoIiUnLSc3OC43OHNcbmZpbGU6ICVzIGxpbmU6ICVkIG9iamVjdDogJXNcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgIiVzZXJyb3I6ICVzJSctJzc4Ljc4c1xuIiwiIixwcmcsbGluZSxjdXJvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAocHJnJiYoY29kZT1lZnVuOjpyZWFkX2ZpbGUoIi8iK3ByZyxsaW5lLDEpKT8KKyAgICAgICAgICAgICAgICAgICAgICAgICAiXG4iK2NvZGUrIlxuIjoiIiksZXJyLCIiKSk7CisgIGVsc2UKKyAgICBlZnVuOjp0ZWxsX29iamVjdCh0aXRwLCAiRHUgc2llaHN0IGVpbmVuIEZlaGxlciBpbSBSYXVtLVplaXQtR2VmdWVnZS5cbiIpOworfQorCisvL0tlaW5lIEdELUZ1bmt0aW9uLCBsaW1pdGllcnQgZGllIEtvc3RlbiBmdWVyIGRlbiBoYW5kbGVyCitwcml2YXRlIHZvaWQgY2FsbF9ydW50aW1lX2Vycm9yKHN0cmluZyBlcnIsIHN0cmluZyBwcmcsIHN0cmluZyBjdXJvYmosCisgICAgaW50IGxpbmUsIG1peGVkIGN1bHByaXQsIGludCBjYXVnaHQsIG9iamVjdCBwbykKK3sKKyAgaWYgKGhhbmRsaW5nX2Vycm9yID09IGVmdW46OnRpbWUoKSkKKyAgeworICAgIC8vIEZlaGxlciBpbSBWZXJsYXVmIGVpbmVyIEZlaGxlcmJlaGFuZGx1bmc6IEZlaGxlcmJlaGFuZGx1bmcgbWluaW1pZXJlbiwKKyAgICAvLyBudXIgTWVsZHVuZyBhbiBlaW5nZWxvZ2d0ZSBSZWdpb25zbWFnaWVyLgorICAgIHRlbGxfcGxheWVycygiY2FsbF9ydW50aW1lX2Vycm9yKCk6IFJla3Vyc2l2ZXIgRmVobGVyIGluICIKKyAgICAgICAgIkZlaGxlcmJlaGFuZGx1bmcuIEJpdHRlIERlYnVnbG9nIGJlYWNodGVuLiBBa3R1ZWxsZXIgRmVobGVyIGluICIKKyAgICAgICAgKyBjdXJvYmogKyAiOiAiICsgZXJyLCBMT1JEX0xWTCk7CisgICAgcmV0dXJuOworICB9CisgIGhhbmRsaW5nX2Vycm9yID0gZWZ1bjo6dGltZSgpOworCisgIC8vRmVobGVyZGF0ZW4gYW4gZGVuIEVycm9yZCB6dXIgU3BlaWNoZXJ1bmcgd2VpdGVyZ2ViZW4sIGZhbGxzIHdpciBzb3dhcworICAvL2hhYmVuLgorI2lmZGVmIEVSUk9SRAorICBpbnQgaXNzdWVpZDsKKyAgLy8gV2VubiBkaWUgc2VmdW5zIGdlcmFkZSBnZWxhZGVuIHdlcmRlbiwgZXJmb2xndCBrZWluZSBXZWl0ZXJnYWJlIGFuIGRlbgorICAvLyBFcnJvckQsIGRhIGRhYmVpIHdpZWRlciBzZWZ1bnMgZ2VydWZlbiB3ZXJkZW4sIHdhcyB6dSBlaW5lciBSZWt1cnNpb24KKyAgLy8gZnVlaHJ0LgorICBpZiAoIWxvYWRpbmdfc2ltdWxfZWZ1bnMpIHsKKyAgICBjYXRjaChpc3N1ZWlkPWVmdW46OmxpbWl0ZWQoIydjYWxsX290aGVyLCh7MjAwMDAwfSksRVJST1JELCJMb2dFcnJvciIsCisgICAgICAgICAgZXJyLHByZyxjdXJvYmosbGluZSxjdWxwcml0LGNhdWdodCk7cHVibGlzaCk7CisgIH0KKyNlbmRpZiAvLyBFUlJPUkQKKworICAvL2VpZ2VuZW4gRXJyb3JoYW5kbGVyIGxhdWZ6ZWl0YmVncmVuenQgcnVmZW4KKyAgZWZ1bjo6bGltaXRlZCgjJ2hhbmRsZV9ydW50aW1lX2Vycm9yLCAoeyAyMDAwMDAgfSksIGVyciwgcHJnLCBjdXJvYmosCisgICAgICAgIGxpbmUsY3VscHJpdCxjYXVnaHQsIHBvLCBpc3N1ZWlkKTsKKworICBoYW5kbGluZ19lcnJvciA9IDA7Cit9CisKKy8vIExhdWZ6ZWl0ZmVobGVyYmVoYW5kbHVuZywgaGVidCBFdmFsY29zdC1CZXNjaHJhZW5rdW5nIGF1ZiB1bmQgcmVpY2h0IHdlaXRlcgorLy8gYW4gY2FsbF9ydW50aW1lX2Vycm9yLCBkaWUgZGllIEdyZW56ZSB3aWVkZXIgYXVmIGVpbmVuIGJlc3RpbW10ZW4gV2VydAorLy8gZmVzdGxlZ3QuCitwcm90ZWN0ZWQgdm9pZCBydW50aW1lX2Vycm9yKHN0cmluZyBlcnIgLHN0cmluZyBwcmcsIHN0cmluZyBjdXJvYmosIGludCBsaW5lLAorICAgICBtaXhlZCBjdWxwcml0LCBpbnQgY2F1Z2h0KSB7CisKKyAgICAvL0RFQlVHKHNwcmludGYoIkNhbGxlcnN0YWNrOiAocnVudGltZV9lcnJvcigpKTogJU9cblBPOiAlT1xuUE8oMCk6ICVPXG4iLAorICAgIC8vICAgICAgICAgIGNhbGxlcl9zdGFjaygxKSxwcmV2aW91c19vYmplY3QoKSxwcmV2aW91c19vYmplY3QoMCkpKTsKKworICAgIGxpbWl0ZWQoIydjYWxsX3J1bnRpbWVfZXJyb3IsICh7IExJTUlUX1VOTElNSVRFRCB9KSwKKyAgICAgICAgZXJyLHByZyxjdXJvYmosbGluZSxjdWxwcml0LGNhdWdodCxwcmV2aW91c19vYmplY3QoKSk7Cit9CisKKy8vV2FybnVuZ2VuIG1pdGxvZ2dlbgorcHJvdGVjdGVkIHZvaWQgcnVudGltZV93YXJuaW5nKCBzdHJpbmcgbXNnLCBzdHJpbmcgY3Vyb2JqLCBzdHJpbmcgcHJvZywgaW50IGxpbmUsCisgICAgaW50IGluc2lkZV9jYXRjaCkKK3sKKyAgc3RyaW5nIGNvZGU7CisgIHN0cmluZyBkZWJ1Z190eHQ7CisgIG9iamVjdCB0aXRwOworCisgIC8vREVCVUcoc3ByaW50ZigiQ2FsbGVyc3RhY2s6IGluIHJ1bnRpbWVfd2FybmluZygpOiAlT1xuUE8oMCk6ICVPXG4iLAorICAvLyAgICAgICAgY2FsbGVyX3N0YWNrKDEpLHByZXZpb3VzX29iamVjdCgwKSkpOworCisgIC8vRGF0ZW4gZGVyIFdhcm51bmcgYW4gZGVuIEVycm9yZCB6dXIgU3BlaWNoZXJ1bmcgd2VpdGVyZ2ViZW4sIGZhbGxzIHdpciAKKyAgLy9zb3dhcyBoYWJlbi4KKyAgaW50IGlzc3VlaWQ7CisjaWZkZWYgRVJST1JECisgIGNhdGNoKGlzc3VlaWQ9bGltaXRlZCgjJ2NhbGxfb3RoZXIsKHsyMDAwMDB9KSxFUlJPUkQsIkxvZ1dhcm5pbmciLAorICAgICAgICBtc2cscHJvZyxjdXJvYmosbGluZSxpbnNpZGVfY2F0Y2gpOyBwdWJsaXNoKTsKKyNlbmRpZiAvLyBFUlJPUkQKKworICAvLyBGZWhsZXJtZWxkdW5nIGJhdWVuCisgIGlmICghc3RyaW5ncChtc2cpKSAgICBtc2c9IjxOVUxMPiI7CisgIGlmICghc3RyaW5ncChwcm9nKSkgICAgcHJvZz0iPE5VTEw+IjsKKyAgaWYgKCFzdHJpbmdwKGN1cm9iaikpIGN1cm9iaj0iPE5VTEw+IjsKKyAgZGVidWdfdHh0PXNwcmludGYoIldhcm51bmc6ICVPLCBPYmpla3Q6ICVzLCBQcm9ncmFtbTogJU8sIFplaWxlICVPICglcykgIgorICAgICAgICAgICAgICAgICAgICAiSUQ6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgbXNnWzAuLjwyXSwgY3Vyb2JqLCAocHJvZ1swXSE9JzwnPyIvIjoiIikrcHJvZywgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgKFRJP2NhcGl0YWxpemUoZ2V0dWlkKFRJKSk6IjxVbmJla2FubnQ+IiksCisgICAgICAgICAgICAgICAgICAgIGlzc3VlaWQpOworCisgIC8vRmVobGVybWVsZHVuZ2VuIGFuIC13YXJudW5nZW4gc2NoaWNrZW4KKyAgY2F0Y2goc2VuZF9jaGFubmVsX21zZygiV2FybnVuZ2VuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKG9iamVjdHAocHJldmlvdXNfb2JqZWN0KCkpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQUxfVUlEKHByZXZpb3VzX29iamVjdCgpKSA6ICIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z190eHQpKTsKKworICB0aXRwID0gVEkgfHwgVFA7CisKKyAgaWYgKCF0aXRwKSByZXR1cm47CisKKyAgLy8gRmVobGVybWVsZHVuZyBhbiBCZW51dHplcgorICBpZiAoSVNfTEVBUk5FUih0aXRwKSkKKyAgICB0ZWxsX29iamVjdCh0aXRwLAorICAgICAgICAgICAgICAgIHNwcmludGYoIiUnLSc3OC43OHNcbmZpbGU6ICVzIGxpbmU6ICVkIG9iamVjdDogJXNcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgIiVzV2FybnVuZzogJXMlJy0nNzguNzhzXG4iLCIiLHByb2csbGluZSxjdXJvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAocHJvZyYmKGNvZGU9cmVhZF9maWxlKCIvIitwcm9nLGxpbmUsMSkpPworICAgICAgICAgICAgICAgICAgICAgICAgICJcbiIrY29kZSsiXG4iOiIiKSxtc2csIiIpKTsKKyAgcmV0dXJuOworfQorCisKKy8vICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVpbnJpY2h0ZW4gZGVzIEVEICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworLy8gU2V0dXAgc3BlaWNoZXJuCitwcm90ZWN0ZWQgaW50IHNhdmVfZWRfc2V0dXAob2JqZWN0IHdobywgaW50IGNvZGUpCit7CisgIHN0cmluZyBmaWxlOworCisgIGlmICghaW50cChjb2RlKSkgcmV0dXJuIDA7CisgIGZpbGUgPSBzcHJpbnRmKCIvcGxheWVycy8lcy8uZWRyYyIsZ2V0ZXVpZCh3aG8pKTsKKyAgcm0oZmlsZSk7CisgIHJldHVybiB3cml0ZV9maWxlKGZpbGUsKHN0cmluZyljb2RlKTsKK30KKworLy8gU2V0dXAgZWlubGFkZW4KK3Byb3RlY3RlZCBpbnQgcmV0cmlldmVfZWRfc2V0dXAob2JqZWN0IHdobykKK3sKKyAgc3RyaW5nIGZpbGU7CisKKyAgZmlsZSA9IHNwcmludGYoIi9wbGF5ZXJzLyVzLy5lZHJjIixnZXR1aWQod2hvKSk7CisgIGlmIChmaWxlX3NpemUoZmlsZSk8MSkgcmV0dXJuIDA7CisgIHJldHVybiAoaW50KXJlYWRfZmlsZShmaWxlKTsKK30KKworLy8gV28gd2VyZGVuIERhdGVpZW4gZ2VzcGVpY2hlcnQ/CitzdHJpbmcgZ2V0X2VkX2J1ZmZlcl9zYXZlX2ZpbGVfbmFtZShzdHJpbmcgZmlsZSkKK3sKKyAgcmV0dXJuIHNwcmludGYoIi9wbGF5ZXJzLyVzLy5kZWFkX2VkX2ZpbGVzLyVzIiwKKyAgICAgICAgICAgICAgICAgZ2V0dWlkKHRoaXNfcGxheWVyKCkpLGVmdW46OmV4cGxvZGUoZmlsZSwgIi8iKVs8MV0pOyAgCit9CisKKy8vICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyBVbmdlbnV0enRlIFBmbGljaHRmdW5rdGlvbmVuICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworLy8gTmljaHRzIHp1IHR1biBiZWltIE1hc3Rlci1OZXVzdGFydAorcHJvdGVjdGVkIHZvaWQgZXh0ZXJuYWxfbWFzdGVyX3JlbG9hZCgpICB7IHJldHVybjsgfQorCisvLyBLZWluZSBleHRlcm5lbiBNYXN0ZXItRmxhZ3MKK3Byb3RlY3RlZCB2b2lkIGZsYWcoc3RyaW5nIHN0cikgeyByZXR1cm47IH0KKworLy8gV2lyZCBiZW5vZXRpZ3QsIGZhbGxzIEVSUSBhbmdlc2NobG9zc2VuIGlzdAorcHJvdGVjdGVkIHZvaWQgc3RhbGVfZXJxKGNsb3N1cmUgY2FsbGJhY2spIHsgcmV0dXJuOyB9CisKKy8vIFplcnN0b2VydGVuIE1hc3RlciB3aWVkZXJiZWxlYmVuIC4uLgorLy8gbmljaHQgdmllbCB6dSB0dW4sIHdlbm4gZmxhZyBnZXNldHp0IGlzdC4gV2VubiBhYmVyIG5pY2h0LCBzaW5kIGFsbGUKKy8vIFZhcmlhYmxlbiBhdWYgMC4gTmFjaCBkaWVzZXIgRnVua3Rpb24gd2lyZCB3aWVkZXIgaW5hdWd1cmF0ZV9tYXN0ZXIoKQorLy8gZ2VydWZlbi4KK3Byb3RlY3RlZCB2b2lkIHJlYWN0aXZhdGVfZGVzdHJ1Y3RlZF9tYXN0ZXIoaW50IGZsYWcpIHsKKyAgICBpZiAoZmxhZykgeworICAgICAgICAvL3JlLWluaXQKKyAgICAgICAgLy93YXMgbWFjaGVuPyBUT0RPCisgICAgfQorICAgIHJldHVybjsKK30KKworLy8gS2VpbiBRdW90YS1EZW1vbiAocG90ZW50aWVsbGVzIFRPRE8pCisvL0hhbmRsZSBxdW90YXMgaW4gdGltZXMgb2YgbWVtb3J5IHNob3J0YWdlLgorLy9pcyBjYWxsZWQgZHVyaW5nIHRoZSBmaW5hbCBwaGFzZSBvZiBhIGdhcmJhZ2UgY29sbGVjdGlvbiwgaWYgdGhlIHVzZXIKKy8vcmVzZXJ2ZSBjb3VsZCBub3QgYmUgcmUtYWxsb2NhdGVkLiBMYXN0ICghKSBDaGFuY2UgdG8gZnJlZSAoYWN0aXZlKSBvYmplY3RzIAorLy9mcm9tIHRoZSBzeXN0ZW0gYW5kIHByZXZlbnQgY2FsbCB0byBzbG93X3NodXRfZG93bigpIQorcHJvdGVjdGVkIHZvaWQgcXVvdGFfZGVtb24oKSB7CisgICAgLy93YXMga2FubiBtYW4gbWFjaGVuPworICAgIC8vdWViZXJ2b2xsZSBTZWhlcmhhZXVzZXIgbGVlcmVuPyAKKyAgICByZXR1cm47Cit9CisKKy8vIEtlaW5lIFByZXBvc2l0aW9uZW4gaW4gcGFyc2VfY29tbWFuZAorLy9zdHJpbmcgKnBhcnNlX2NvbW1hbmRfcHJlcG9zX2xpc3QoKSB7IHJldHVybiAoe30pOyB9CisKKy8vIFdpZSBsYXV0ZXQgZGFzIFdvcnQgZnVlciAnYWxsZScgPworLy9zdHJpbmcgKnBhcnNlX2NvbW1hbmRfYWxsX3dvcmQoKSB7IHJldHVybiAoe30pOyB9CisKKworLy8gS2VpbmUgQmVzb25kZXJlbiBPYmpla3RuYW1lbgorc3RyaW5nIHByaW50Zl9vYmpfbmFtZShvYmplY3Qgb2IpIHsgcmV0dXJuIDA7IH0KKworLy8gICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgU29uc3RpZ2VzL0hvb2tzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMKKworLy9UT0RPOiBzYXZlX3dpel9maWxlIGluIHNodXRkb3duKCkgaW50ZWdyaWVyZW4/CisvLyBXaXpsaXN0ZSBzcGVpY2hlcm46IFplaWxlIGdlbmVyaWVyZW4KK3N0YXRpYyBzdHJpbmcgX3NhdmVfd2l6X2ZpbGVfbG9vcChtaXhlZCAqYSkKK3sKKyAgcmV0dXJuIHNwcmludGYoIiVzICVkICVkXG4iLGFbV0xfTkFNRV0sYVtXTF9DT01NQU5EU10sYVtXTF9FWFRSQV0pOworfQorCisvLyBXaXpsaXN0ZSBzcGVpY2hlcm4KK3Byb3RlY3RlZCB2b2lkIHNhdmVfd2l6X2ZpbGUoKQoreworICBybSgiL1dJWkxJU1QiKTsKKyAgd3JpdGVfZmlsZSgiL1dJWkxJU1QiLGltcGxvZGUoCisgICAgIG1hcCh3aXpsaXN0X2luZm8oKSwjJ19zYXZlX3dpel9maWxlX2xvb3ApLCIiKSk7Cit9CisKKy8vIFRPRE86IG1hY2h0IGRlciB0ZWxuZXRfbmVnLWhvb2sgdWViZXJoYXVwdCB3YXM/Cit2b2lkIHRlbG5ldF9uZWcobWl4ZWQgY21kLG1peGVkIG9wdCxtaXhlZCBhcmdzKQoreworICBpZiAob3B0PT0zNCAmJiBjbWQ9PTI1MSkKKyAgICAgICAgYmluYXJ5X21lc3NhZ2UoKHsyNTUsMjUwLDM0LDEsMSwyNTUsMjQwfSkpOworfQorICAKKy8vIEVVSUQgdW5kIFVJRCB3ZXJkZW4gdm9uIGdpdmVfdWlkX3RvX29iamVjdCgpIHZlcmdlYmVuLCBkaWVzZSBzaW5kIGluCisvLyBpbmF1Z3VyYXRlX21hc3RlcigpIGFscyBkcml2ZXIgaG9va3MgYW5nZW1lbGRldC4KKworLypsb2FkX3VpZF9ob29rKCkgc29sbHRlIG1hY2hlbiwgd2FzIGRpZXNlIExhbWJkYSBtYWNodGUuLi4KKyAgdW5ib3VuZF9sYW1iZGEoICh7J3ByaW50Zl9vYmpfbmFtZX0pLAorICAgICAgICAgICAgICAgKHsjJ2dpdmVfdWlkX3RvX29iamVjdCwncHJpbnRmX29ial9uYW1lLAorICAgICAgICAgICAgICAgICAgICh7IydwcmV2aW91c19vYmplY3R9KSwwfSkpKTsgICAqLworcHJvdGVjdGVkIG1peGVkIGxvYWRfdWlkX2hvb2soc3RyaW5nIGRhdGVpKSB7CisgICAgcmV0dXJuKGdpdmVfdWlkX3RvX29iamVjdChkYXRlaSxwcmV2aW91c19vYmplY3QoKSkpOworfQorCisvKiBjbG9uZV91aWRfaG9vayBzb2xsdGUgbWFjaGVuLCB3YXMgZGllc2UgTGFtYmRhIG1hY2h0ZS4uLgorICAgICAgICAgICAgdW5ib3VuZF9sYW1iZGEoICh7J2JsdWVwcmludCwgJ25ld19uYW1lfSksIAorICAgICAgICAgICAgICAoeyMnZ2l2ZV91aWRfdG9fb2JqZWN0LCduZXdfbmFtZSwKKyAgICAgICAgICAgICAgICAgICh7IydwcmV2aW91c19vYmplY3R9KSwxfSkpKTsgICAgICAqLworcHJvdGVjdGVkIG1peGVkIGNsb25lX3VpZF9ob29rKHN0cmluZyBibHVlcHJpbnQsc3RyaW5nIG5ld19uYW1lKSB7CisgICAgcmV0dXJuKGdpdmVfdWlkX3RvX29iamVjdChuZXdfbmFtZSxwcmV2aW91c19vYmplY3QoKSkpOworfQorCmRpZmYgLS1naXQgYS9zZWN1cmUvbWFzdGVyLmggYi9zZWN1cmUvbWFzdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk3YjBkMAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9tYXN0ZXIuaApAQCAtMCwwICsxLDEyNiBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIG1hc3Rlci5oIC0tIGRlZmluaXRpb25zIGZvciB0aGUgbWFzdGVyIG9iamVjdAorLy8KKy8vICRJZDogbWFzdGVyLmggODgwOSAyMDE0LTA1LTA4IDE5OjUyOjQ4WiBaZXNzdHJhICQKKworI2lmbmRlZiBfX01BU1RFUl9IX18KKyNkZWZpbmUgX19NQVNURVJfSF9fCisKKworI2lmZGVmIFBfQVJNT1VSUworI3VuZGVmIFBfQVJNT1VSUworI2VuZGlmCisjZGVmaW5lIFBfQVJNT1VSUyAiYXJtb3VycyIKKworI2lmZGVmIFBfV0VBUE9OCisjdW5kZWYgUF9XRUFQT04KKyNlbmRpZgorI2RlZmluZSBQX1dFQVBPTiAid2VhcG9uIgorCisvL2Z1ZXIgZGVuIG5vdGlmeV9mYWlsLUhvb2sKKyNpZm5kZWYgUF9ERUZBVUxUX05PVElGWV9GQUlMCisjZGVmaW5lIFBfREVGQVVMVF9OT1RJRllfRkFJTCAiZGVmYXVsdF9ub3RpZnlfZmFpbCIKKyNlbmRpZgorCisjaW5jbHVkZSAiL3NlY3VyZS9jb25maWcuaCIKKworI2luY2x1ZGUgIi9zeXMvdXNlcmluZm8uaCIKKyNpbmNsdWRlICIvc3lzL3NoZWxscy5oIgorI2luY2x1ZGUgIi9zeXMvcGxheWVyL2Jhc2UuaCIKKyNpbmNsdWRlICIvc3lzL21vdmluZy5oIgorI2luY2x1ZGUgIi9zeXMvZGVmaW5lcy5oIgorI2luY2x1ZGUgIi9zeXMvd2l6bGlzdC5oIgorI2luY2x1ZGUgIi9zeXMvZGFlbW9uLmgiCisjaW5jbHVkZSAiL3N5cy9tYWlsLmgiCisjaW5jbHVkZSAiL3N5cy9kcml2ZXJfaG9vay5oIgorI2luY2x1ZGUgIi9zeXMvZnVuY3Rpb25saXN0LmgiCisKKyNpbmNsdWRlICIvc2VjdXJlL3dpemxldmVscy5oIgorCisvLyNkZWZpbmUgREVCVUcoeCkKKyNpZm5kZWYgREVCVUcKKyNkZWZpbmUgREVCVUcoeCkJaWYgKGZ1bmNhbGwoc3ltYm9sX2Z1bmN0aW9uKCdmaW5kX3BsYXllciksInplc3N0cmEiKSlcCisgICAgICAgIHRlbGxfb2JqZWN0KGZ1bmNhbGwoc3ltYm9sX2Z1bmN0aW9uKCdmaW5kX3BsYXllciksInplc3N0cmEiKSxcCisgICAgICAgICJNREJHOiAiK3grIlxuIikKKyNlbmRpZgorCisvL0xvZ2ZpbGUgZnVlciBMZXNlenVncmlmZmUKKyNkZWZpbmUgUkVBRF9GSUxFICAiL2xvZy9BUkNIL1JFQURfRklMRSIKKworLy9Mb2dmaWxlIGZ1ZXIgQ3Jhc2hlcworI2RlZmluZSBDUkFTSF9MT0cgICIvbG9nL0NSQVNIX0xPRyIKKworLy8gTUFYX0VSUkxPR19TSVpFIGRlZmluaWVydCwgYWIgd2VsY2hlciBHcm9lc3NlIGVpbiBMb2cgaW4KKy8vIC9sb2cvZXJyb3Igcm90aWVydC4KKyNkZWZpbmUgTUFYX0VSUkxPR19TSVpFIDUxMjAwIAorCisjZGVmaW5lIGxvZ19maWxlKGZpbGUsc3RyKSB3cml0ZV9maWxlKCIvbG9nLyIrZmlsZSwgc3RyKQorI2RlZmluZSBOQU1FKHgpICAgICAgICAgICAgZ2V0dWlkKHgpCisjZGVmaW5lIENBUF9OQU1FKHgpICAgICAgICBjYXBpdGFsaXplKE5BTUUoeCkpCisjZGVmaW5lIFRQICAgICAgICAgICAgICAgICBlZnVuOjp0aGlzX3BsYXllcigpCisjZGVmaW5lIFRJICAgICAgICAgICAgICAgICBlZnVuOjp0aGlzX2ludGVyYWN0aXZlKCkKKyNkZWZpbmUgUE8gICAgICAgICAgICAgICAgIGVmdW46OnByZXZpb3VzX29iamVjdCgpCisjZGVmaW5lIFRPICAgICAgICAgICAgICAgICBlZnVuOjp0aGlzX29iamVjdCgpCisKKy8vIFZlcnplaWNobmlzIG1pdCBJbmZvbWFpbHMgZnVlciBNYWdpZXJiZWZvZXJkZXJ1bmdlbgorI2RlZmluZSBXSVpfSEVMUF9NQUlMX0RJUiAiL2RvYy9pbmZvbWFpbHMvIgorCisvLyBhdXMgbWFzdGVyLmMKK3N0cmluZyAgICAgICAgY3JlYXRvcl9maWxlKG1peGVkIHN0cik7CittaXhlZCAgICAgICAgIGdpdmVfdWlkX3RvX29iamVjdChzdHJpbmcgZGF0ZWksb2JqZWN0IHBvKTsKK3ZvaWQgICAgICAgICAgc2F2ZV93aXpfZmlsZSgpOworbWl4ZWQgICAgICAgICBsb2FkX3VpZF9ob29rKHN0cmluZyBkYXRlaSk7CittaXhlZCAgICAgICAgIGNsb25lX3VpZF9ob29rKHN0cmluZyBibHVlcHJpbnQsc3RyaW5nIG5ld19uYW1lKTsKK3Byb3RlY3RlZCBtaXhlZCBjYWxsX3NlZnVuKHN0cmluZyBzZWZ1biwgdmFyYXJncyBtaXhlZCBhcmdzKTsKKworLy8gYXVzIGRvbWFpbnMuYworaW50ICAgICAgICAgICAgZG9tYWluX21hc3RlcihzdHJpbmcgdXNlciwgc3RyaW5nIGRvbWFpbik7CitpbnQgICAgICAgICAgICBkb21haW5fbWVtYmVyKHN0cmluZyB1c2VyLCBzdHJpbmcgZG9tYWluKTsKK3N0cmluZyAgICAgICAgICpnZXRfZG9tYWluX2hvbWVzKHN0cmluZyB3aXopOworCisvLyBhdXMgZ3VpbGQuYworaW50ICAgICAgICAgICBndWlsZF9tYXN0ZXIoc3RyaW5nIHVzZXIsIHN0cmluZyBndWlsZCk7CisKKy8vIGF1cyBmaWxlX2FjY2Vzcy5jCit2b2lkICAgICAgICAgIExvYWREZXB1dHlGaWxlTGlzdCgpOworbWl4ZWQgICAgICAgICB2YWxpZF9yZWFkKHN0cmluZyBwYXRoLCBzdHJpbmcgZXVpZCwgc3RyaW5nIGZ1biwgb2JqZWN0IG9iaik7CittaXhlZCAgICAgICAgIHZhbGlkX3dyaXRlKHN0cmluZyBwYXRoLCBzdHJpbmcgZXVpZCwgc3RyaW5nIGZ1biwgb2JqZWN0IG9iaik7CisKKy8vIGF1cyBtaXNjLmMKK3N0cmluZyAgICAgICAgIF9nZXRfcGF0aChzdHJpbmcgcGF0aCwgc3RyaW5nIHVzZXIpOworbWl4ZWQgICAgICAgICAgUXVlcnlCYW5pc2hlZChzdHJpbmcgc3RyKTsKK2ludCAgICAgICAgICAgIFRCYW5pc2hOYW1lKHN0cmluZyBuYW1lLCBpbnQgZGF5cyk7CisKKy8vIHNlbmRldCBiZWkgQmVmb2VyZGVydW5nZW4gSW5mb21haWwgYW4gTWFnaWVyCitwcm90ZWN0ZWQgdm9pZCBTZW5kV2l6YXJkSGVscE1haWwoc3RyaW5nIG5hbWUsIGludCBsZXZlbCk7CisKKy8vIGF1cyB1c2VyaW5mby5jCitwdWJsaWMgaW50ICAgICAgIGZpbmRfdXNlcmluZm8oc3RyaW5nIHVzZXIpOworcHJvdGVjdGVkIG1peGVkICpnZXRfZnVsbF91c2VyaW5mbyhzdHJpbmcgdXNlcik7CitwdWJsaWMgbWl4ZWQgICAgKmdldF91c2VyaW5mbyhzdHJpbmcgdXNlcik7CitwdWJsaWMgaW50ICAgICAgIGdldF93aXpfbGV2ZWwoc3RyaW5nIHVzZXIpOworcHVibGljIHN0cmluZyAgICBxdWVyeV9wbGF5ZXJfb2JqZWN0KCBzdHJpbmcgbmFtZSApOworcHVibGljIGludCAgICAgICBxdWVyeV93aXpfbGV2ZWwobWl4ZWQgcGxheWVyKTsKK2ludCAgICAgICAgICAgICAgdXBkYXRlX3dpel9sZXZlbChzdHJpbmcgdXNlcixpbnQgbGV2KTsKK3Byb3RlY3RlZCB2b2lkICAgc2V0X2d1aWxkcyhzdHJpbmcgcGxheWVyLCBzdHJpbmcgKmd1aWxkcyk7Citwcm90ZWN0ZWQgdm9pZCAgIHNldF9kb21haW5zKHN0cmluZyBwbGF5ZXIsIHN0cmluZyAqZG9tYWlucyk7Cit2b2lkICAgICAgICAgICAgIHVwZGF0ZV9sYXRlX3BsYXllcnMoKTsKK3B1YmxpYyBzdHJpbmcgICAgc2VjdXJlX3NhdmVmaWxlKHN0cmluZyBuYW1lKTsKK3Byb3RlY3RlZCB2b2lkICAgc2F2ZV91c2VyaW5mbyhzdHJpbmcgdXNlcik7Citwcm90ZWN0ZWQgc3RyaW5nIHF1ZXJ5X3NlY3VyZV9ldWlkKCk7Citwcm90ZWN0ZWQgaW50ICAgIHF1ZXJ5X3NlY3VyZV9sZXZlbCgpOworcHVibGljIHZhcmFyZ3Mgc3RyaW5nKiBRdWVyeVVJREFsaWFzKHN0cmluZyBhbGlhcywgaW50IHJlYyk7CisKKy8vRWluZW4gTWFnaWVyIGFscyB2ZXJhbnR3b3J0bGljaCBmdWVyIGVpbmUgYmVzdGltbXRlIFVJRCBlaW50cmFnZW4KK3B1YmxpYyBzdHJpbmcqICAgQWRkV2l6YXJkRm9yVUlEKHN0cmluZyB1aWQsIHN0cmluZyB3aXp1aWQpOworLy9FaW5lbiBNYWdpZXIgd2llZGVyIGF1c3RyYWdlbiwgd2VubiBlciBuaWNodCBtZWhyIHp1c3RhZW5kaWcgaXN0LgorcHVibGljIHN0cmluZyogICBSZW1vdmVXaXphcmRGcm9tVUlEKHN0cmluZyB1aWQsIHN0cmluZyB3aXp1aWQpOworLy9WZXJhbnR3b3J0bGljaGUgTWFnaWVyIGZ1ZXIgZWluZSBVSUQgYXVzZ2ViZW4KK3B1YmxpYyB2YXJhcmdzIHN0cmluZyogUXVlcnlXaXphcmRzRm9yVUlEKHN0cmluZyB1aWQsIGludCByZWN1cnNpdmUpOworLy9XZWxjaGUgVUlEcyBpc3QgZWluIE1hZ2llciBpbXBsaXppdCB2ZXJhbnR3b3J0bGljaD8gKElzdCBlciBSTSwKKy8vR2lsZGVubWFnaWVyLCBpbiB3ZWxjaGVuIFJlZ2lvbmVuIGhhdCBlciBlaW4gVmVyemVpY2huaXMsIGV0Yy4pCitwdWJsaWMgdmFyYXJncyBzdHJpbmcqIFF1ZXJ5VUlEc0ZvcldpemFyZChzdHJpbmcgd2l6dWlkLCBpbnQgcmVjdXJzaXZlKTsKKworCisjZW5kaWYgLy9fX01BU1RFUl9IX18KZGlmZiAtLWdpdCBhL3NlY3VyZS9tYXN0ZXIvYXV0b2luY2x1ZGUuYyBiL3NlY3VyZS9tYXN0ZXIvYXV0b2luY2x1ZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDAwMmZhCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL21hc3Rlci9hdXRvaW5jbHVkZS5jCkBAIC0wLDAgKzEsMTAxIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gc2VjdXJlL21hc3Rlci9hdXRvaW5jbHVkZS5jIC0tIG1vZHVsZSBvZiB0aGUgbWFzdGVyIG9iamVjdDogQXV0b2luY2x1ZGVzCisvLworLy8gJElkOiBtYXN0ZXIuYyA3MDQxIDIwMDgtMTAtMTMgMTg6MTg6MjdaIFplc3N0cmEgJAorCisjZGVmaW5lIFBSQUdNQSh4KSAiI3ByYWdtYSAieCJcbiIKKworLy8gZnVlciBhbHRlIEhvbWVtdWRzLi4uCisjaWYgX19WRVJTSU9OX18gPj0gIjMuNS4wIgorI2RlZmluZSBSVFRDSEVDS1MgUFJBR01BKCJydHRfY2hlY2tzIikKKyNkZWZpbmUgREVGQVVMVFMgUFJBR01BKCJzYXZlX3R5cGVzIikKKyNlbHNlCisjZGVmaW5lIFJUVENIRUNLUyAiIgorI2RlZmluZSBERUZBVUxUUyBQUkFHTUEoImNvbWJpbmVfc3RyaW5ncywgdmVyYm9zZV9lcnJvcnMsIHdhcm5fZGVwcmVjYXRlZCIpCisjZW5kaWYKKworLy8gZ2VzY2hhY2h0ZWx0ZXMgTWFwcGluZyBpbiB0b3BsZXZlbC5yZWdpb24ubWFnaWVyIEhpZXJhcmNoaWUuCisvLyBXaWNodGlnOiBqZWRlIEhpZXJhcmNoaWViZW5lIF9tdXNzXyBlaW4gTWFwcGluZyBzZWluLCB3ZWxjaGVzIGVpbmVuIEVpbnRyYWcKKy8vICAgICAgICAgIDAgYWxzIERlZmF1bHQgZW50aGFlbHQsIHdlbGNoZXIgZWluZW4gU3RyaW5ncyBhbHMgV2VydCBoYXQuCisvLyAgICAgICAgICBBdXNuYWhtZTogZGllIGxldHp0ZSBFYmVuZSAoTWFnaWVyZWJlbmUpLCBkaWUgbXVzcyBlaW4gU3RyaW5nIGVpbi4KK3ByaXZhdGUgbm9zYXZlIG1hcHBpbmcgYXV0b2luY2x1ZGVzID0gKFsKKyAgICAiZCI6ICAgICAgKFsKKyAgICAgICAgICAgICAgICAgImluc2VsbiI6IChbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA6ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiemVzc3RyYSI6IFBSQUdNQSgic3Ryb25nX3R5cGVzIikgUlRUQ0hFQ0tTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLAorICAgICAgICAgICAgICAgICAwOiAiIiwKKyAgICAgICAgICAgICAgIF0pLAorICAgICJzdGQiOiAgICAoWworICAgICAgICAgICAgICAgICAwOiBQUkFHTUEoInN0cm9uZ190eXBlcyxwZWRhbnRpYyIpIFJUVENIRUNLUywKKyAgICAgICAgICAgICAgIF0pLAorICAgICJpdGVtcyI6ICAgIChbCisgICAgICAgICAgICAgICAgIDA6IFBSQUdNQSgic3Ryb25nX3R5cGVzLHBlZGFudGljIikgUlRUQ0hFQ0tTLAorICAgICAgICAgICAgICAgXSksCisgICAgInNlY3VyZSI6IChbCisgICAgICAgICAgICAgICAgIDA6IFBSQUdNQSgic3Ryb25nX3R5cGVzLHJhbmdlX2NoZWNrLHBlZGFudGljIikgUlRUQ0hFQ0tTLAorICAgICAgICAgICAgICAgXSksCisgICAgInAiOiAgICAgIChbCisgICAgICAgICAgICAgICAgIDA6ICIiLAorICAgICAgICAgICAgICAgICAiZGFlbW9uIjogKFsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDogUFJBR01BKCJzdHJvbmdfdHlwZXMiKSBSVFRDSEVDS1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwKKyAgICAgICAgICAgICAgICAgInNlcnZpY2UiOiAoWworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDogIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwKKyAgICAgICAgICAgICAgIF0pLAorICAgIDA6IERFRkFVTFRTLAorXSk7CisKK3N0cmluZyBhdXRvaW5jbHVkZWhvb2soc3RyaW5nIGJhc2VfZmlsZSwgc3RyaW5nIGN1cnJlbnRfZmlsZSwgaW50IHN5c19pbmNsdWRlKQoreworICBtYXBwaW5nIHRvcGxldmVsZGlyLCByZWdpb247IC8vIG1hcHBpbmdzIGZvciBzcGV6aWFsaXNpZXJ0ZXJlIFBmYWRlCisgIHN0cmluZyBhaW5jX3N0cmluZzsKKworICAvLyBXZW5uIGN1cnJlbnRfZmlsZSAhPSAwIGlzdCwgd2lyZCBnZXJhZGUgdm9tIGtvbXBpbGllcnRlbiBPYmpla3QKKyAgLy8gPGJhc2VfZmlsZT4gZXR3YXMgKGluZGlyZWt0KSBpbmtsdWRpZXJ0LiBEb3J0IGR1ZXJmZW4gZGllIFByYWdtYXMKKyAgLy8ga2VpbmVzZmFsbHMgcmVpbmdlc2NocmllYmVuIHdlcmRlbi4KKyAgaWYgKGN1cnJlbnRfZmlsZSkKKyAgICByZXR1cm4gMDsKKworICBzdHJpbmcgcmVzPWF1dG9pbmNsdWRlc1swXTsgLy8gZ2xvYmFsIGRlZmF1bHQuCisKKyAgc3RyaW5nICpwX2FyciA9IGV4cGxvZGUoYmFzZV9maWxlLCIvIiktKHsiIn0pOworICAvL0RFQlVHKHNwcmludGYoIkFJTkM6IEZpbGU6ICVPLCBQZmFkOiAlT1xuIixiYXNlX2ZpbGUsIHBfYXJyKSk7CisKKyAgaWYgKHNpemVvZihwX2FycikgJiYgbV9jb250YWlucygmdG9wbGV2ZWxkaXIsIGF1dG9pbmNsdWRlcywgcF9hcnJbMF0pKSB7CisgICAgLy8gcF9hcnJbMF06IGQsIHAsIHN0ZCwgZXRjLiAKKyAgICAvLyBlcnN0IHdpcmQgZGVyIERlZmF1bHRlaW50cmFnIDAgZ2Vub21tZW4KKyAgICByZXMgKz0gdG9wbGV2ZWxkaXJbMF07CisgICAgaWYgKHNpemVvZihwX2FycikgPiAxICYmIG1fY29udGFpbnMoJnJlZ2lvbiwgdG9wbGV2ZWxkaXIsIHBfYXJyWzFdKSkgeworICAgICAgLy8gcF9hcnJbMV0gZWJlbmUsIHBvbGFyLCB1bnRlcndlbHQsIHNlcnZpY2UsIC4uLgorICAgICAgLy8gZXJzdCBkZW4gRGVmYXVsdGVpbnRyYWcgZGVyIFJlZ2lvbiBuZWhtZW4KKyAgICAgIHJlcyArPSByZWdpb25bMF07CisgICAgICBpZiAoc2l6ZW9mKHBfYXJyKSA+IDIgJiYgbV9jb250YWlucygmYWluY19zdHJpbmcsIHJlZ2lvbiwgcF9hcnJbMl0pKSB7CisgICAgICAgIC8vIHBfYXJyWzJdOiBtYWdpZXJuYW1lLiBGdWVyIGRlbiBNYWdpZXIgd2FzIGhpbnRlcmxlZ3QuCisgICAgICAgIHJlcyArPSBhaW5jX3N0cmluZzsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLy8gRnVlciBhZWx0ZXJlIEZpbGVzIHNjaGFsdGVuIHdpciBlaW5pZ2UgV2FybnVuZ2VuIGV4cGxpeml0IGF1cy4gOi0oCisgIC8vICgxNDA3MTc5NjgwID09ICJNb24sICA0LiBBdWcgMjAxNCwgMjE6MTQ6NDAiKQorI2lmIE1VREhPU1QgPT0gX19IT1NUX05BTUVfXworICBpZiAoY2FsbF9zZWZ1bigiZmlsZV90aW1lIiwgYmFzZV9maWxlKSA8IDE0MDcxNzk2ODApIHsKKyAgICAgIHJlcyArPSBQUkFHTUEoIm5vX3dhcm5fbWlzc2luZ19yZXR1cm4iKTsKKyAgfQorI2Vsc2UKKyAgLy8gQXVmIGFuZGVyZW4gUmVjaG5lcm4gYWxzIGRlbSBNdWRyZWNobmVyIHdlcmRlbiBkaWUgV2FybnVuZ2VuIHVuYWJoYWVuZ2lnCisgIC8vIHZvbSBaZWl0cHVudCBkZXIgbGV0enRlcyBBZW5kZXJ1bmcgYWJnZXNjaGFsdGV0LCB3ZWlsIGJlaSBrb3BpZXJ0ZW4KKyAgLy8gTXVkbGlicyBvZnQgZGllIG10aW1lcyBnZWFlbmRlcnQgd2VyZGVuIHVuZCBkYW5uIGF1ZiBlaW5tYWwgYWxsZXMgc2Nyb2xsdC4KKyAgcmVzICs9IFBSQUdNQSgibm9fd2Fybl9taXNzaW5nX3JldHVybiIpOworCisjZW5kaWYKKyAgLy9ERUJVRyhyZXMpOworICByZXR1cm4gcmVzOworfQorI3VuZGVmIFJUVENIRUNLUworI3VuZGVmIERFRkFVTFRTCisjdW5kZWYgUFJBR01BCisKKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL21hc3Rlci9jaWRyLmMgYi9zZWN1cmUvbWFzdGVyL2NpZHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzViYTIxCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL21hc3Rlci9jaWRyLmMKQEAgLTAsMCArMSwxMTEgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8qKiBcZmlsZSAvc2VjdXJlL21hc3Rlci9jaWRyLmMKKyogRnVua3Rpb25lbiB6dXIgSW50ZXJwcmV0YXRpb24gdW5kIFVtcmVjaG51bmcgdm9uIElQLUFkcmVzc2VuIGluIENJRFItTm90YXRpb24uCisqIFxhdXRob3IgWmVzc3RyYQorKiBcZGF0ZSAwNS4wMi4yMDEwCisqIFx2ZXJzaW9uICRJZCQKKyovCisvKiBDaGFuZ2Vsb2c6CisqLworCitwcml2YXRlIGludCBJUHY0X2FkZHIyaW50KHN0cmluZyBhZGRyKSB7CisgICAgaW50IG1hc2s7CisKKyAgICBpZiAoIXN0cmluZ3AoYWRkcikgfHwgIXNpemVvZihhZGRyKSkKKyAgICAgIHJldHVybiAwOworICAgIC8vIGlyZ2VuZHdlbGNoZSBaZWljaGVuIGF1c3NlciAwLTksIC4gdW5kIC8gZHJpbj8KKyAgICBpZiAoc2l6ZW9mKGFkZHItIjAxMjM0NTY3ODkuLyIpKQorICAgICAgcmV0dXJuIDA7CisKKyAgICBzdHJpbmcgKnBhcnRzID0gZXhwbG9kZShhZGRyLCAiLyIpIC0gKHsiIn0pOworICAgIC8vIE5ldHptYXNrZSBnZWdlYmVuPyAtPiBOZXR6d2Vya2FkcmVzc2UgYmVzdGltbWVuCisgICAgaWYgKHNpemVvZihwYXJ0cykgPT0gMikgeworICAgICAgICAvLyBhLmIuYy5kL3ggb2RlciBhLmIuYy5kL3cueC55LnoKKyAgICAgICAgaW50IHJlcyA9IElQdjRfYWRkcjJpbnQocGFydHNbMF0pOyAvLyBlcnN0bWFsIFdlcnQgdm9uIGEuYi5jLmQuLi4KKyAgICAgICAgaWYgKHN0cnN0cihwYXJ0c1sxXSwgIi4iKSA+IC0xCisgICAgICAgICAgICAmJiBzaXplb2YoZXhwbG9kZShwYXJ0c1sxXSwiLiIpKSA9PSA0KQorICAgICAgICAgICAgLy8gYS5iLmMuZC93LngueS56IC0+IFdlcnQgdm9uIHcueC55LnogYmVzdGltbWVuCisgICAgICAgICAgbWFzayA9IElQdjRfYWRkcjJpbnQocGFydHNbMV0pOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICBtYXNrID0gdG9faW50KHBhcnRzWzFdKTsKKyAgICAgICAgICAvLyBXZXJ0IHZvbiAveAorICAgICAgICAgIG1hc2sgPSAweGZmZmZmZmZmIC0gKHRvX2ludChwb3coMiwgMzItbWFzaykpLTEpOworICAgICAgICB9CisgICAgICAgIC8vIHZlcnVuZGVuIHVuZCBFbmRlLgorICAgICAgICByZXR1cm4gcmVzICYgbWFzazsKKyAgICB9CisKKyAgICBwYXJ0cyA9IGV4cGxvZGUocGFydHNbMF0sICIuIik7CisgICAgLy8gQWJncmVrdWVyenRlIEFkcmVzc2UgYSBsYSBhLmIuPyBSZXN0IG1pdCAwIGVyZ2Flbnplbi4KKyAgICBzd2l0Y2goc2l6ZW9mKHBhcnRzIC0gKHsiIn0pKSApIHsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgcGFydHMgKz0gKHsiMCIsIjAiLCIwIn0pOworICAgICAgY2FzZSAyOgorICAgICAgICBwYXJ0cyArPSAoeyIwIiwiMCJ9KTsKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgcGFydHMgKz0gKHsiMCJ9KTsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgIHJldHVybiggdG9faW50KHBhcnRzWzBdKSA8PCAyNCkKKyAgICAgICAgICsgKCB0b19pbnQocGFydHNbMV0pIDw8IDE2KQorICAgICAgICAgKyAoIHRvX2ludChwYXJ0c1syXSkgPDwgOCApCisgICAgICAgICArIHRvX2ludChwYXJ0c1szXSk7Cit9CisKK3ByaXZhdGUgaW50IElQdjRfbmV0X3NpemUoc3RyaW5nIGFkZHIpIHsKKyAgICBpZiAoIXN0cmluZ3AoYWRkcikgfHwgIXNpemVvZihhZGRyKSkKKyAgICAgIHJldHVybiAwOworICAgIC8vIGlyZ2VuZHdlbGNoZSBaZWljaGVuIGF1c3NlciAwLTksIC4gdW5kIC8gZHJpbj8KKyAgICBpZiAoc2l6ZW9mKGFkZHItIjAxMjM0NTY3ODkuLyIpKQorICAgICAgcmV0dXJuIDA7CisKKyAgICBzdHJpbmcgKnBhcnRzID0gZXhwbG9kZShhZGRyLCAiLyIpIC0gKHsiIn0pOworICAgIC8vIE5ldHptYXNrZSBnZWdlYmVuPyAtPiBOZXR6d2Vya2FkcmVzc2UgYmVzdGltbWVuCisgICAgaWYgKHNpemVvZihwYXJ0cykgPT0gMikgeworICAgICAgICAvLyBhLmIuYy5kL3ggb2RlciBhLmIuYy5kL3cueC55LnoKKyAgICAgICAgaWYgKHN0cnN0cihwYXJ0c1sxXSwgIi4iKSA+IC0xCisgICAgICAgICAgICAmJiBzaXplb2YoZXhwbG9kZShwYXJ0c1sxXSwiLiIpKSA9PSA0KQorICAgICAgICAgICAgLy8gYS5iLmMuZC93LngueS56IAorICAgICAgICAgIHJldHVybiAweGZmZmZmZmZmIC0gKElQdjRfYWRkcjJpbnQocGFydHNbMV0pIHx8IDEpICsgMTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgLy8gRWluZmFjaCAyXigzMi1tYXNrKSBBZHJlc3Nlbi4KKyAgICAgICAgICByZXR1cm4gdG9faW50KHBvdygyLCAzMiAtIHRvX2ludChwYXJ0c1sxXSkgKSApOworICAgICAgICB9CisgICAgfQorCisgICAgcGFydHMgPSBleHBsb2RlKHBhcnRzWzBdLCAiLiIpOworICAgIHN3aXRjaChzaXplb2YocGFydHMgLSAoeyIifSkpICkgeworICAgICAgY2FzZSAxOiAvLyBDbGFzcyBBCisgICAgICAgIHJldHVybiAyNTYqMjU2KjI1NjsKKyAgICAgIGNhc2UgMjogLy8gQ2xhc3MgQgorICAgICAgICByZXR1cm4gMjU2KjI1NjsKKyAgICAgIGNhc2UgMzogLy8gQ2xhc3MgQworICAgICAgICByZXR1cm4gMjU2OworICAgICAgY2FzZSA0OiAvLyBlaW56ZWxuZSBBZHJlc3NlCisgICAgICAgIHJldHVybiAxOworICAgICAgZGVmYXVsdDogLy8gdW5ndWVsdGlnZSBBZHJlc3NlCisgICAgICAgIHJldHVybiBfX0lOVF9NQVhfXzsKKyAgICB9CisKKyAgICAvLyBoaWVyIHNvbGx0ZSBtYW4gZ2FyIG5pY2h0IGFua29tbWVuLgorICAgIHJldHVybiBfX0lOVF9NQVhfXzsKK30KKworc3RyaW5nIElQdjRfaW50MmFkZHIoaW50IGlwKSB7CisgICAgaW50ICpwYXJ0cz1hbGxvY2F0ZSg0KTsKKyAgICBwYXJ0c1swXSA9IChpcCAmIDB4ZmYwMDAwMDApID4+IDI0OworICAgIHBhcnRzWzFdID0gKGlwICYgMHgwMGZmMDAwMCkgPj4gMTY7CisgICAgcGFydHNbMl0gPSAoaXAgJiAweDAwMDBmZjAwKSA+PiA4OworICAgIHBhcnRzWzNdID0gKGlwICYgMHgwMDAwMDBmZik7CisgICAgLy8gaW50IGlzIHNpZ25lZC4gQW55dGhpbmcgPiAxMjcgd291bGQgd3JhcCBhcm91bmQgdG8gLTEyOCBpZiB3ZSBhcmUgb24gYQorICAgIC8vIG1hY2hpbmUgd2l0aCAzMi1iaXQgd2lkZSBpbnRzLgorICAgIGlmIChwYXJ0c1swXSA8IDApCisgICAgICAgIHBhcnRzWzBdID0gMTI4ICsgKDEyOC1hYnMocGFydHNbMF0pKTsKKworICAgIHJldHVybiBpbXBsb2RlKG1hcChwYXJ0cywjJ3RvX3N0cmluZyksICIuIik7Cit9CisKZGlmZiAtLWdpdCBhL3NlY3VyZS9tYXN0ZXIvZGVzdHJ1Y3QuYyBiL3NlY3VyZS9tYXN0ZXIvZGVzdHJ1Y3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTc2YTExCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL21hc3Rlci9kZXN0cnVjdC5jCkBAIC0wLDAgKzEsMTA1IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gc2VjdXJlL21hc3Rlci9kZXN0cnVjdC5pbmMgLS0gbW9kdWxlIG9mIHRoZSBtYXN0ZXIgb2JqZWN0OiBzdHVmZiBmb3IgZGVzdHJ1Y3QuCisvLworLy8gJElkOiBtYXN0ZXIuYyA3MDQxIDIwMDgtMTAtMTMgMTg6MTg6MjdaIFplc3N0cmEgJAorCisjaW5jbHVkZSAiL3N5cy9vYmplY3RfaW5mby5oIgorCisvLyBwcml2aWxlZ2llcnRlIE9iamVrdGUsIGRpZSBkYXMgZGVzdHJ1Y3QoKSBhYmJyZWNoZW4gZHVlcmZlbiAocm9vdCBvYmpla3RlCisvLyBkdWVyZmVuIGF1Y2ggb2huZSwgZGFzcyBzaWUgaW4gZGllc2VyIExpc3RlIGVyZmFzc3Qgc2luZCk6Citwcml2YXRlIG5vc2F2ZSBzdHJpbmcgKmRlbnlfZGVzdHJ1Y3RfbGlzdCA9ICh7CisgICAgIi9vYmovc2h1dCIsICIvcm9vbS92b2lkIiwgIi9yb29tL25ldHp0b3QiLCAiL3Jvb20vamFpbCIgfSk7CisKKy8vIEhlbGZlcmZ1bmt0aW9uIGZ1ZXIgcHJlcGFyZV9kZXN0cnVjdCgpCitwcml2YXRlIHZvaWQgcmVjdXJzaXZlX3JlbW92ZShvYmplY3Qgb2IsIGludCBpbW1lZGlhdGVfZGVzdHJ1Y3QpIHsKKworICBpZiAoZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09OQ0VfSU5URVJBQ1RJVkUpKSB7CisgICAgLy8gU3BpZWxlciB3ZXJkZW4gaW5zIFZvaWQgYmV3ZWd0LgorICAgIGludCByZXM7CisgICAgdGVsbF9vYmplY3Qob2IsICJQbG9ldHpsaWNoIGxvZXN0IHNpY2ggZGVpbmUgV2VsdCBpbiBpaHJlICIgKworICAgICAgICAgICAgICAgICAgIkJlc3RhbmR0ZWlsZSBhdWYuIFp1bSBHbHVlY2sgd2lyc3RcbkR1IGlyZ2VuZHdvICIgKworICAgICAgICAgICAgICAgICAgImhpbiBnZXNjaGxldWRlcnQgLi4uXG4iKTsKKyAgICAvLyB3ZW5uIEJld2VndW5nIGJ1Z2d0IG9kZXIgbmljaHQgZnVua3Rpb25pZXJ0IHVuZCBvYiBub2NoIGV4aXN0aWVydCwKKyAgICAvLyByZWt1cnNpdiB6ZXJzdG9lcmVuLgorICAgIG9iamVjdCBvbGRlbnY9ZW52aXJvbm1lbnQob2IpOworICAgIGlmICggKGNhdGNoKHJlcz0oaW50KW9iLT5tb3ZlKCIvcm9vbS92b2lkIixNX1RQT1JUfE1fTk9DSEVDSywwLCJmYWVsbHQiKTsKKyAgICAgICAgICAgcHVibGlzaCkgfHwgKG9iICYmIGVudmlyb25tZW50KG9iKSA9PSBvbGRlbnYpICkKKyAgICAgICAgICAmJiBvYikgeworICAgICAgICAgICAgLy8gU3BpZWxlciBzcGVpY2hlcm4sIGRhbm4gZXJzdCBJbnZlbnRhciBlbnRsZWVyZW4sIGRhbm4gcmVtb3ZlKCkgdW5kCisgICAgICAgIC8vIHVuZCBkZXN0cnVjdCgpIGFud2VuZGVuLgorICAgICAgICBjYXRjaChvYi0+c2F2ZV9tZSgxKTsgcHVibGlzaCk7CisgICAgICAgIGZpbHRlcihhbGxfaW52ZW50b3J5KG9iKSwgIydyZWN1cnNpdmVfcmVtb3ZlLCBpbW1lZGlhdGVfZGVzdHJ1Y3QpOworICAgICAgICBpZiAoIWltbWVkaWF0ZV9kZXN0cnVjdCkgCisgICAgICAgICAgY2F0Y2gob2ItPnJlbW92ZSgwKTtwdWJsaXNoKTsKKyAgICAgICAgaWYgKG9iKSAKKyAgICAgICAgICBkZXN0cnVjdChvYik7CisgICAgfQorICB9CisgIGVsc2UgeworICAgIC8vIGtlaW4gU3BpZWxlci4gUmVrdXJzaXYgZW50ZmVybmVuLiBIaWVyYmVpIF96dWVyc3RfIHJla3Vyc2l2IGRhcworICAgIC8vIEludmVudGFyIGVudGZlcm5lbiB1bmQgZGFubiBvYiBzZWxiZXIsIGRhbWl0IG5pY2h0IGVyc3QgZGFzIEludmVudGFyIGluCisgICAgLy8gZGFzIEVudmlyb25tZW50IGJld2VndCB3aXJkIChzb2xsIGphIGVoIHplcnN0b2VydCB3ZXJkZW4pLgorICAgIGZpbHRlcihhbGxfaW52ZW50b3J5KG9iKSwgIydyZWN1cnNpdmVfcmVtb3ZlLCBpbW1lZGlhdGVfZGVzdHJ1Y3QpOworICAgIC8vIGdnZi4genVlcnN0IHJlbW92ZSB2ZXJzdWNoZW4KKyAgICBpZiAoIWltbWVkaWF0ZV9kZXN0cnVjdCkKKyAgICAgIGNhdGNoKG9iLT5yZW1vdmUoMSk7cHVibGlzaCk7CisgICAgaWYgKG9iKQorICAgICAgZGVzdHJ1Y3Qob2IpOworICB9Cit9CisKKy8vIFplcnN0b2VydW5nIHZvbiBvYiB2b3JiZXJlaXRlbgorcHJvdGVjdGVkIG1peGVkIHByZXBhcmVfZGVzdHJ1Y3Qob2JqZWN0IG9iKQoreworICBvYmplY3Qgb2xkX2VudixlbnYsaXRlbTsKKyAgbWl4ZWQgcmVzOworCisgIC8vIHp1ZXJzdCBkYXMgbm90aWZ5X2Rlc3RydWN0KCkgcnVmZW4gdW5kIGdnZi4gYWJicmVjaGVuLCBmYWxscyBvYgorICAvLyBwcml2aWxlZ2llcnQgaXN0LgorICBjYXRjaChyZXMgPSAobWl4ZWQpb2ItPk5vdGlmeURlc3RydWN0KHByZXZpb3VzX29iamVjdCgpKTsgcHVibGlzaCk7CisgIGlmIChyZXMgJiYKKyAgICAgIChnZXR1aWQob2IpID09IFJPT1RJRCB8fAorICAgICAgIChJU19BUkNIKG9iKSkgfHwKKyAgICAgICBtZW1iZXIoZGVueV9kZXN0cnVjdF9saXN0LCBvYmplY3RfbmFtZShvYikpID49IDApKSB7CisgICAgaWYgKHN0cmluZ3AocmVzKSAmJiBzaXplb2YocmVzKSkKKyAgICAgIHJldHVybiByZXM7CisgICAgZWxzZQorICAgICAgcmV0dXJuIHNwcmludGYoIiVPIHZlcndlaWdlcnQgZGllIFplcnN0b2VydW5nIG1pdHRlbHMgZGVzdHJ1Y3QoKS4gIgorICAgICAgICAgICJGZWhsZW5kZSBSZWNodGUgdm9uICVPP1xuIixvYiwgcHJldmlvdXNfb2JqZWN0KCkpOworICB9CisgIAorICBlbnYgPSBlbnZpcm9ubWVudChvYik7CisKKyAgLy8gT2JqZWt0IGhhdCBrZWluIEVudjogQWxsZXMgemVyc3RvZXJlbiwgU3BpZWxlciBpbnMgVm9pZAorICBpZiAoIWVudikgeworICAgIGZpbHRlcihhbGxfaW52ZW50b3J5KG9iKSwgIydyZWN1cnNpdmVfcmVtb3ZlLCAxKTsKKyAgfQorICBlbHNlIHsKKyAgICAvLyBBbnNvbnN0ZW4gYWxsZXMgaW5zIEVudmlyb25tZW50IAorICAgIGZvcmVhY2goaXRlbSA6IGFsbF9pbnZlbnRvcnkob2IpKQorICAgIHsKKyAgICAgIG9sZF9lbnY9ZW52aXJvbm1lbnQoaXRlbSk7CisgICAgICAvLyBNX01PVkVfQUxMLCBmYWxscyBpdGVtIG5lbiBVbml0b2JqZWt0IGlzdC4gU29uc3QgY2xvbmVuIGRpZSB1LlUuIG5vY2gKKyAgICAgIC8vIHdpZWRlciBuZW4gbmV1ZXMgT2JqZWt0IGltIGFsdGVuIEVudi4KKyAgICAgIGlmKGNhdGNoKGl0ZW0tPm1vdmUoZW52LCBNX05PQ0hFQ0t8TV9NT1ZFX0FMTCk7cHVibGlzaCkpCisgICAgICAgIHJlY3Vyc2l2ZV9yZW1vdmUoaXRlbSwgMSk7CisgICAgICBlbHNlIGlmIChpdGVtICYmIGVudmlyb25tZW50KGl0ZW0pID09IG9sZF9lbnYpCisgICAgICAgIHJlY3Vyc2l2ZV9yZW1vdmUoaXRlbSwgMSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIDA7IC8vIEVyZm9sZworfQorCisvLyBBbm1lcmt1bmc6IGxpZWZlcnQgMCB6dXJ1ZWNrLCB3ZW5uIGRpZSBzZWZ1bnMgZ2VyYWRlIGdlbGFkZW4gd2VyZGVuLgorc3RyaW5nIE5vdGlmeURlc3RydWN0KG9iamVjdCBjYWxsZXIpIHsKKyAgLy8gTmljaHQgamVkZXIgTWFnaWVyIG11c3MgZGVuIE1hc3RlciBlbnRzb3JnZW4ga29lbm5lbi4KKyAgaWYgKChjYWxsZXIgIT0gdGhpc19vYmplY3QoKSAmJiAKKyAgICAgICAgY2FsbF9zZWZ1bigic2VjdXJlX2xldmVsIikgPCBBUkNIX0xWTCkKKyAgICAgIHx8IGNhbGxfc2VmdW4oInByb2Nlc3NfY2FsbCIpICkgeworICAgIHJldHVybiAiRHUgZGFyZnN0IGRlbiBNdWRsaWItTWFzdGVyIG5pY2h0IHplcnN0b2VyZW4hXG4iOworICB9CisgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9zZWN1cmUvbWFzdGVyL2RvbWFpbi5jIGIvc2VjdXJlL21hc3Rlci9kb21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWVjNmY2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL21hc3Rlci9kb21haW4uYwpAQCAtMCwwICsxLDk1IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gbWFzdGVyL2RvbWFpbi5jIC0tIFJlZ2lvbmVuIHVuZCBSZWdpb25zbWFnaWVyCisvLworLy8gJElkOiBkb21haW4uYyA3MTYyIDIwMDktMDItMjYgMjE6MTQ6NDNaIFplc3N0cmEgJAorCisjcHJhZ21hIHN0cmljdF90eXBlcworCisjaW5jbHVkZSAiL3NlY3VyZS9tYXN0ZXIuaCIKKyNpbmNsdWRlICIvc3lzL2ZpbGVzLmgiCisKK2ludCBkb21haW5fbWFzdGVyKHN0cmluZyB1c2VyLCBzdHJpbmcgZG9tYWluKQoreworICBzdHJpbmcgKmRvbWFpbnM7CisgIGludCBpOworICAKKyAgaWYgKCFmaW5kX3VzZXJpbmZvKHVzZXIpfHwKKyAgICAgICFwb2ludGVycChkb21haW5zPWdldF91c2VyaW5mbyh1c2VyKVtVU0VSX0RPTUFJTisxXSkpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiAobWVtYmVyKGRvbWFpbnMsZG9tYWluKSAhPSAtMSk7Cit9CisKK2ludCBkb21haW5fbWVtYmVyKHN0cmluZyB1c2VyLCBzdHJpbmcgZG9tYWluKQoreworICBpZiAoZG9tYWluPT0iZXJ6bWFnaWVyIikgcmV0dXJuIDA7CisgIHJldHVybiAoSVNfRE9NQUlOTUVNQkVSKHVzZXIpJiZmaWxlX3NpemUoIi9kLyIrZG9tYWluKyIvIit1c2VyKT09LTIpOworfQorCitpbnQgYWRkX2RvbWFpbl9tYXN0ZXIoc3RyaW5nIHVzZXIsc3RyaW5nIGRvbSkKK3sKKyAgc3RyaW5nICpkb21haW5zOworICAKKyAgaWYgKChjYWxsX290aGVyKFNJTVVMX0VGVU5fRklMRSwgInByb2Nlc3NfY2FsbCIpIHx8CisgICAgICAgIGNhbGxfb3RoZXIoU0lNVUxfRUZVTl9GSUxFLCAic2VjdXJlX2xldmVsIikgPCBHT0RfTFZMKSB8fAorICAgICAgICAhZmluZF91c2VyaW5mbyh1c2VyKSkKKyAgICByZXR1cm4gMDsKKyAgZG9tYWlucz1nZXRfdXNlcmluZm8odXNlcilbVVNFUl9ET01BSU4rMV07CisgIGlmICghZG9tYWlucykgCisgICAgc2V0X2RvbWFpbnModXNlciwoe2RvbX0pKTsKKyAgZWxzZQorICB7CisgICAgLy8gRG9wcGVsdGUgRWludHJhZWdlIHZlcm1laWRlbgorICAgIGRvbWFpbnM9ZG9tYWlucy0oe2RvbX0pKyh7ZG9tfSk7CisgICAgc2V0X2RvbWFpbnModXNlciwgZG9tYWlucyk7CisgIH0KKyAgaWYgKGdldF93aXpfbGV2ZWwodXNlcikgPCBMT1JEX0xWTCs1KSB7CisgICAgdXBkYXRlX3dpel9sZXZlbCh1c2VyLExPUkRfTFZMKzUpOworICAgIFNlbmRXaXphcmRIZWxwTWFpbCh1c2VyLCBMT1JEX0xWTCs1KTsKKyAgfQorICByZXR1cm4gMTsKK30KKworaW50IHJlbW92ZV9kb21haW5fbWFzdGVyKHN0cmluZyB1c2VyLHN0cmluZyBkb20pCit7CisgIHN0cmluZyAqZG9tYWluczsKKworICBpZiAoIUlTX0dPRChnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSkKKyAgICAgIHx8IWZpbmRfdXNlcmluZm8odXNlcikKKyAgICAgIHx8IShkb21haW5zPWdldF91c2VyaW5mbyh1c2VyKVtVU0VSX0RPTUFJTisxXSkKKyAgICAgIHx8IG1lbWJlcihkb21haW5zLGRvbSk9PS0xKQorICAgIHJldHVybiAwOworICBkb21haW5zLT0oe2RvbX0pOworICBzZXRfZG9tYWlucyh1c2VyLGRvbWFpbnMpOworICByZXR1cm4gMTsKK30KKworc3RyaW5nICpnZXRfZG9tYWlucygpIHsKKyAgc3RyaW5nICpyZWdpb25zPSh7fSk7CisgIC8vIGFsbGUgVmVyemVpY2huaXNzZSBpbiAvZC8gZXJtaXR0ZWxuCisgIGZvcmVhY2goc3RyaW5nIHJlZ2lvbjogKGdldF9kaXIoIi8iRE9NQUlORElSIi8qIikgCisgICAgICAgIHx8ICh7fSkpLSh7Ii4iLCIuLiIsImVyem1hZ2llciJ9KSkgeworICAgIGlmIChyZWdpb25bMF0hPScuJyAmJiBmaWxlX3NpemUoIi9kLyIrcmVnaW9uKSA9PSBGU0laRV9ESVIpCisgICAgICAgIC8vVmVyemVpY2huaXMsIGtlaW4gRmlsZSB1bmQgZmFlbmd0IG5pY2h0IG1pdCAiLiIgYW46IGF1Zm5laG1lbi4KKyAgICAgICAgcmVnaW9ucys9KHtyZWdpb259KTsKKyAgfQorICByZXR1cm4gcmVnaW9uczsKK30KKworLy8gaW4gd2VsY2hlbiBSZWdpb25lbiBoYXQgJ3dpeicgZWluIFZlcnplaWNobmlzPworc3RyaW5nICpnZXRfZG9tYWluX2hvbWVzKHN0cmluZyB3aXopCit7CisgIHN0cmluZyAqaG9tZXM9KHt9KTsKKyAgc3RyaW5nIHRtcDsKKyAgCisgIGlmIChxdWVyeV93aXpfbGV2ZWwod2l6KTw9V0laQVJEX0xWTCkgcmV0dXJuICh7fSk7CisKKyAgdG1wID0gIi9kLyVzLyIrd2l6OworICBmb3JlYWNoKHN0cmluZyBkaXI6IGdldF9kb21haW5zKCkpIHsKKyAgICAgIGlmIChkaXJbMF0hPScuJyAmJiBmaWxlX3NpemUoc3ByaW50Zih0bXAsZGlyKSkgPT0gRlNJWkVfRElSKQorICAgICAgICAgIC8vTWFnaWVydmVyemVpY2huaXMgZGEgdW5kIGZhZW5ndCBuaWNodCBtaXQgIi4iIGFuOiBhdWZuZWhtZW4uCisgICAgICAgICAgaG9tZXMrPSh7ZGlyfSk7CisgIH0KKyAgcmV0dXJuIGhvbWVzOworfQorCmRpZmYgLS1naXQgYS9zZWN1cmUvbWFzdGVyL2ZpbGVfYWNjZXNzLmMgYi9zZWN1cmUvbWFzdGVyL2ZpbGVfYWNjZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI3ZTNlNAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9tYXN0ZXIvZmlsZV9hY2Nlc3MuYwpAQCAtMCwwICsxLDYxNyBAQAorI3ByYWdtYSBzdHJpY3RfdHlwZXMsIG5vX3dhcm5fZGVwcmVjYXRlZAorCisjaW5jbHVkZSAiL3NlY3VyZS9tYXN0ZXIuaCIKKworc3RhdGljIG1hcHBpbmcgcHJvamVjdHM9KFtdKTsKK3N0YXRpYyBzdHJpbmcgKmluc2VjdXJlLCpkZXB1dHlfZmlsZXM7CisKK2ludCBSZWxvYWRJbnNlY3VyZUZpbGUoKQoreworICAgIGluc2VjdXJlID0gZWZ1bjo6ZXhwbG9kZSggcmVhZF9maWxlKCIvc2VjdXJlL0lOU0VDVVJFIikgfHwgIiIsICJcbiIgKTsKKyAgICBpbnNlY3VyZSAtPSAoeyIifSk7CisgICAgaW5zZWN1cmUgPSBtYXAoIGluc2VjdXJlLCAjJ2xvd2VyX2Nhc2UvKicqLyApOworICAgIHJldHVybigxKTsKK30KKwordm9pZCBMb2FkRGVwdXR5RmlsZUxpc3QoKQoreworICAvLyBMZXNlYmVyZWNodGlndW5nZW4gZnVlciAvbG9nL0FSQ0gvKiBzZXR6ZW4KKyAgZGVwdXR5X2ZpbGVzID0gZWZ1bjo6ZXhwbG9kZSggcmVhZF9maWxlKCIvbG9nL0FSQ0gvREVQVVRZX0ZJTEVMSVNUIikgfHwgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiIgKSAtICh7IiJ9KTsKKyAgcmV0dXJuOworfQorCisjZGVmaW5lIFBBVEhfQVJSQVkoeCkgKGV4cGxvZGUoeCwgIi8iKS0oeyIuIn0pKQorc3RyaW5nICpmdWxsX3BhdGhfYXJyYXkoc3RyaW5nIHBhdGgsIHN0cmluZyB1c2VyKSB7CisgIHN0cmluZyAqc3RyczsKKyAgc3RyaW5nIGN3ZDsKKworICBpZighcGF0aCkKKyAgICByZXR1cm4gKHsiIiwiIn0pOyAvLyBhZGRpdGlvbmFsICIiIHRvIHlpZWxkICIvIiBsYXRlci4KKworICAvLyByZW1vdmUgbXVsdGlwbGUgJy8nCisgIHBhdGggPSByZWdyZXBsYWNlKHBhdGgsICIvKyIsICIvIiwgMSk7CisKKyAgc3dpdGNoKHBhdGhbMF0pIHsKKyAgICBjYXNlICcvJzoKKyAgICAgIGlmKCFwYXRoWzFdKSByZXR1cm4gKHsiIiwiIn0pOyAvL2FkZGl0aW9uYWwgIiIgdG8geWllbGQgIi8iIGxhdGVyCisgICAgICBzdHJzPVBBVEhfQVJSQVkocGF0aCk7CisgICAgICBpZiAoIXNpemVvZihzdHJzKSkKKyAgICAgICAgICBzdHJzID0gKHsiIiwiIn0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnKyc6CisgICAgICBpZighcGF0aFsxXSkgcmV0dXJuICh7IiIsImQifSk7CisgICAgICBzdHJzPSh7IiIsImQifSkrUEFUSF9BUlJBWShwYXRoWzEuLjwxXSk7CisgICAgICBicmVhazsKKyAgICBjYXNlICd+JzoKKyAgICAgIGlmKHVzZXIgJiYgIXBhdGhbMV0pCisgICAgICAgIHJldHVybiAoeyIiLCJwbGF5ZXJzIix1c2VyfSk7CisgICAgICBpZih1c2VyICYmIHBhdGhbMV09PScvJykKKyAgICAgICAgc3Rycz0oeyIiLCJwbGF5ZXJzIix1c2VyfSkrUEFUSF9BUlJBWShwYXRoWzIuLjwxXSk7CisgICAgICBlbHNlCisgICAgICAgIHN0cnM9KHsiIiwicGxheWVycyJ9KStQQVRIX0FSUkFZKHBhdGhbMS4uPDFdKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBpZih1c2VyICYmIFRQICYmIGdldHVpZChUUCkgPT0gdXNlcgorICAgICAgICAgICYmIChjd2Q9KHN0cmluZylUUC0+UXVlcnlQcm9wKFBfQ1VSUkVOVERJUikpKQorICAgICAgICBzdHJzPVBBVEhfQVJSQVkoY3dkICsgIi8iICsgcGF0aCk7CisgICAgICBlbHNlCisgICAgICAgIHN0cnM9UEFUSF9BUlJBWShwYXRoKTsKKyAgfQorICAvLyAvLi4vIGJlaGFuZGVsbi4gRWluc2NocmFlbmt1bmdlbiBkZXIgUmVnRXhwOgorICAvLyAvYS9iLy4uLy4uL2Qgd3VlcmRlIG51ciBkdXJjaCBXaWVkZXJob2x1bmcgYXVmZ2Vsb2VzdC4KKyAgLy8gLy4uL2Qgd2lyZCBuaWNodCByaWNodGlnIGF1ZmdlbG9lc3QuCisgIC8vcmVncmVwbGFjZSgiL2QvaW5zZWxuL3RvZXRlci9yb29tL2hvZWhsZS8uLi93YWxkL2JsYS5jIiwiKC4qKVwvW14vXSsvXC5cLgorICAvLyAgICAvKC4qKSIsICJcXDFcL1xcMiIsIFJFX0dMT0JBTCkKKyAgCisgIC8vIGRpZXMgc2llaHQgc2NobGltbWVyIGF1cyBhbHMgZXMgaXN0IChtZW1iZXIgaXN0IE8obikpLCBzb2xhbmdlIGRhcyBBcnJheQorICAvLyBuaWNodCBncm9zcyB3aXJkLgorICBpbnQgcDsKKyAgd2hpbGUoKHA9bWVtYmVyKHN0cnMsICIuLiIpKSAhPSAtMSkKKyAgICAgIHN0cnMgPSBzdHJzWzAuLnAtMl0rc3Ryc1twKzEuLl07CisKKyAgcmV0dXJuIHN0cnM7Cit9CisjdW5kZWYgUEFUSF9BUlJBWQorCitzdHJpbmcgX2dldF9wYXRoKHN0cmluZyBwYXRoLCBzdHJpbmcgdXNlcikgeworICBzdHJpbmcgKnBfYXJyID0gZnVsbF9wYXRoX2FycmF5KHBhdGgsIHVzZXIpOworICAvLyBtYWtlIHBhdGggYWJzb2x1dGUKKyAgaWYgKHBfYXJyWzBdICE9ICIiKQorICAgICAgcF9hcnIgPSAoeyIifSkgKyBwX2FycjsKKworICByZXR1cm4gaW1wbG9kZShwX2FyciwiLyIpOworfQorCitzdGF0aWMgaW50IHByb2plY3RfYWNjZXNzKHN0cmluZyB1c2VyLCBzdHJpbmcgcHJvamVjdCkKK3sKKyAgbWl4ZWQgKmxpbmVzOworICBzdHJpbmcgczsKKyAgbWFwcGluZyB0bXA7CisKKyAgaWYgKCFtZW1iZXIocHJvamVjdHMscHJvamVjdCkpCisgIHsKKyAgICBzPXJlYWRfZmlsZShQUk9KRUNURElSKyIvIitwcm9qZWN0KyIvQUNDRVNTX1JJR0hUUyIpOworICAgIGlmKCFzfHxzPT0iIikKKyAgICAgIHJldHVybiAwOworICAgIHRtcD0oW10pOworICAgIGZvciAobGluZXM9ZXhwbG9kZShzLCJcbiIpLSh7IiJ9KTtzaXplb2YobGluZXMpO2xpbmVzPWxpbmVzWzEuLl0pCisgICAgeworICAgICAgaWYgKGxpbmVzWzBdWzBdPT0nKicpCisgICAgICAgIHRtcFtsaW5lc1swXVsxLi5dXT0yOworICAgICAgZWxzZQorICAgICAgICB0bXBbbGluZXNbMF1dPTE7CisgICAgfQorICAgIHByb2plY3RzW3Byb2plY3RdPSh7dG1wLHRpbWUoKX0pOworICAgIHJldHVybiB0bXBbdXNlcl07CisgIH0KKyAgcHJvamVjdHNbcHJvamVjdF1bMV09dGltZSgpOworICByZXR1cm4gcHJvamVjdHNbcHJvamVjdF1bMF1bdXNlcl07Cit9CisKK3ZvaWQgT3V0ZGF0ZVByb2plY3RDYWNoZShzdHJpbmcgcHJvamVjdCkKK3sKKyAgbV9kZWxldGUocHJvamVjdHMscHJvamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkIF9jbGVhbnVwX3Byb2plY3RzKCkgeworICBpbnQgaTsKKyAgbWl4ZWQgKnVzZXJzOworCisgIGZvciAodXNlcnM9bV9pbmRpY2VzKHByb2plY3RzKSxpPXNpemVvZih1c2VycyktMTtpPj0wO2ktLSkKKyAgICBpZigodGltZSgpLXByb2plY3RzW3VzZXJzW2ldXVsxXSk+MTgwMCkKKyAgICAgIG1fZGVsZXRlKHByb2plY3RzLHVzZXJzW2ldKTsKK30KKworaW50IGFjY2Vzc19yaWdodHMoc3RyaW5nICpwX2Fyciwgc3RyaW5nIGV1aWQpCit7CisgIGludCBpOworCisgIGkgPSBzaXplb2YocF9hcnIpIC0gMjsKKworICB3aGlsZSAoIGkgPj0gMCAmJgorICAgICAgICAgIGZpbGVfc2l6ZSggaW1wbG9kZShwX2FyclswLi5pXSwgIi8iKSArICIvYWNjZXNzX3JpZ2h0cy5jIiApIDwgMCApCisgICAgICBpLS07CisKKyAgaWYgKCBpIDwgMCApCisgICAgICByZXR1cm4gMDsKKworICBpZiAoICFjYXRjaChpID0gKGludCljYWxsX290aGVyKCAKKyAgICAgICAgICBpbXBsb2RlKHBfYXJyWzAuLmldLCAiLyIpICsgIi9hY2Nlc3NfcmlnaHRzIiwKKyAgICAgICAgICAiYWNjZXNzX3JpZ2h0cyIsIGV1aWQsCisgICAgICAgICAgaW1wbG9kZShwX2FycltpKzEuLl0sICIvIikgKTsgcHVibGlzaCkgKQorICAgICAgcmV0dXJuIGk7CisKKyAgcmV0dXJuIDA7Cit9CisKK3N0cmluZyBtYWtlX3BhdGhfYWJzb2x1dGUoc3RyaW5nIHN0cikgeworICByZXR1cm4gX2dldF9wYXRoKHN0ciwgZ2V0dWlkKFRQKSk7Cit9CisKKworbWl4ZWQgdmFsaWRfd3JpdGUoc3RyaW5nIHBhdGgsIHN0cmluZyBldWlkLCBzdHJpbmcgZnVuLCBvYmplY3Qgb2JqKQoreworICBpbnQgcyxsdmw7CisgIHN0cmluZyAqc3RyczsKKyAgaW50ICpkYXRlOworCisgIGlmIChtZW1iZXIocGF0aCwnICcpIT0tMSkgcmV0dXJuIDA7CisKKyAgLy8gVW50ZXIgTElCREFUQURJUiAoL2RhdGEpIHNvbGxlbiBrb21wbGV0dCBpZGVudGlzY2hlIFNjaHJlaWJyZWNodGUKKyAgLy8gdmVyZ2ViZW4gd2VyZGVuLgorICBpZiAoc2l6ZW9mKHBhdGgpID4gNgorICAgICAgJiYgcGF0aFswLi41XSA9PSAiLyJMSUJEQVRBRElSIi8iKQorICAgIHJldHVybiB2YWxpZF93cml0ZShwYXRoWzUuLl0sIGV1aWQsIGZ1biwgb2JqKSAhPSAwOworCisgIHN3aXRjaChmdW4pIHsKKyAgICBjYXNlICJsb2dfZmlsZSI6CisgICAgICBzdHJzPWZ1bGxfcGF0aF9hcnJheSgiLyIrcGF0aCwgMCk7CisgICAgICBwYXRoID0gaW1wbG9kZShzdHJzLCAiLyIpOworICAgICAgc3RycyAtPSAoeyIifSk7IC8vIHJlbW92ZSB0cmFpbGluZyBhbmQgbGVhZGluZyAiLyIuCisgICAgICBpZiAoc2l6ZW9mKHN0cnMpPjEgJiYgc3Ryc1swXT09ImxvZyIpIHJldHVybiBwYXRoOworICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSAic2F2ZV9vYmplY3QiOgorICAgICAgaWYgKCFwYXRoKSByZXR1cm4gMDsKKyAgICAgIHN0cnM9ZnVsbF9wYXRoX2FycmF5KCIvIitwYXRoLCAwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgImVkX3N0YXJ0IjoKKyAgICAgIGlmIChwYXRoICYmIHBhdGhbMF0pCisgICAgICAgIHN0cnM9ZnVsbF9wYXRoX2FycmF5KHBhdGgsIGV1aWQpOworICAgICAgZWxzZSBzdHJzPSh7InBsYXllcnMiLGV1aWQsIi5lcnIifSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgc3Rycz1mdWxsX3BhdGhfYXJyYXkocGF0aCwgZXVpZCk7CisgIH0KKworICBpZiAoIWV1aWQgfHwgZXVpZD09Ik5PQk9EWSIgfHwgZXVpZD09ImZ0cCIgfHwgZXVpZD09ImFub255bW91cyIpIHJldHVybiAwOworCisgIC8vIFBmYWQgc29sbCBhYiBqZXR6dCBhdWYgamVkZW4gRmFsbCBhYnNvbHV0IHNlaW4uCisgIGlmIChzdHJzWzBdICE9ICIiKQorICAgICAgcGF0aCA9ICIvIiArIGltcGxvZGUoc3RycywgIi8iKTsKKyAgZWxzZQorICAgICAgcGF0aD1pbXBsb2RlKHN0cnMsICIvIik7CisKKyAgLy8gZnVlciBkaWUgUmVjaHRlYmVzdGltbXVuZyAiLyIgYW4gQW5mYW5nIHVuZCBFbmRlIGVudGZlcm5lbgorICBzdHJzIC09ICh7IiJ9KTsKKworICAvL1Jvb3QtT2JqZWt0ZSB1bmQgTWFzdGVyIGR1ZXJmZW4gaW1tZXIuCisgIGlmIChldWlkID09IFJPT1RJRCB8fCBvYmo9PVRPKSByZXR1cm4gcGF0aDsKKworICBsdmw9cXVlcnlfd2l6X2xldmVsKGV1aWQpOworCisgIC8vVG9wbGV2ZWw6IG51ciBFTSsKKyAgaWYgKChzPXNpemVvZihzdHJzKSk8PTEpIHJldHVybiBsdmw+PUFSQ0hfTFZMOworCisgIHN3aXRjaChzdHJzWzBdKSB7CisgICAgY2FzZSBUTVBESVI6CisgICAgICByZXR1cm4gMTsKKworICAgIGNhc2UgU1RERElSOgorICAgIGNhc2UgU1lTRElSOgorICAgIGNhc2UgTElCT0JKRElSOgorICAgIGNhc2UgRVRDRElSOgorICAgIGNhc2UgTElCUk9PTURJUjoKKyAgICAgIHJldHVybiBsdmw+PUFSQ0hfTFZMOworICAgIAorICAgIGNhc2UgTElCSVRFTURJUjoKKyAgICAgIHJldHVybiBsdmw+PUVMREVSX0xWTDsKKworICAgIGNhc2UgU1BFTExCT09LRElSOgorICAgICAgLy8gd2VubiB1bnRlcmhhbGIgZWluZXMgdW50ZXJ2ZXJ6ZWljaG5pc3NlcyBkZXMgU3RpbHMgImdpbGRlIiwgZGFubiBpc3RzCisgICAgICAvLyBlaW5mYWNoCisgICAgICBpZiAoc2l6ZW9mKHN0cnMpID4gMgorICAgICAgICAgICYmIGd1aWxkX21hc3RlcihldWlkLCBzdHJzWzFdKSkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgIC8vIHNvbnN0IG51ciBFTXMgYnp3LiBhY2Nlc3NfcmlnaHRzLmMgZnJhZ2VuLgorICAgICAgcmV0dXJuICgobHZsPj1BUkNIX0xWTCkgfHwgYWNjZXNzX3JpZ2h0cyhzdHJzLGV1aWQpKTsKKworICAgIGNhc2UgR1VJTERESVI6CisgICAgICAvLyB3ZW5uIHVudGVyaGFsYiBlaW5lcyB1bnRlcnZlcnplaWNobmlzc2VzIGRlcyBTdGlscyAiZmlsZGUuZ2lsZGUiLAorICAgICAgLy8gZGFubiBpc3RzIGVpbmZhY2gKKyAgICAgIGlmIChzaXplb2Yoc3RycykgPiAyKSB7CisgICAgICAgIHN0cmluZyAqdG1wID0gZXhwbG9kZShzdHJzWzFdLCJmaWxlcy4iKTsKKyAgICAgICAgaWYgKHNpemVvZih0bXApID09IDIpIHsKKyAgICAgICAgICBpZiAoZ3VpbGRfbWFzdGVyKGV1aWQsIHRtcFsxXSkpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgLy8gT2JqZWt0ZSBkb3J0IHNvbGxlbiBhdWNoIHNjaHJlaWJlbiBkdWVyZmVuLgorICAgICAgICAgIGlmIChldWlkID09ICgiR1VJTEQuIit0bXBbMV0pKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8vIHNvbnN0IG51ciBFTXMgYnp3LiBhY2Nlc3NfcmlnaHRzLmMgZnJhZ2VuLgorICAgICAgcmV0dXJuICgobHZsPj1BUkNIX0xWTCkgfHwgYWNjZXNzX3JpZ2h0cyhzdHJzLGV1aWQpKTsKKworICAgIGNhc2UgRE9DRElSOgorICAgICAgaWYgKCBzID4gMSAmJiAoc3Ryc1sxXSA9PSAiYmFsYW5jZSIpICkKKyAgICAgICAgcmV0dXJuICgobHZsPj1BUkNIX0xWTCkgfHwgYWNjZXNzX3JpZ2h0cyhzdHJzLGV1aWQpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuICgobHZsPj1TUEVDSUFMX0xWTCkgfHwgYWNjZXNzX3JpZ2h0cyhzdHJzLGV1aWQpKTsKKworICAgIGNhc2UgRlRQRElSOgorICAgICAgICBpZiAoIHMgPiAxICYmIChzdHJzWzFdID09ICJpbmNvbWluZyIgfHwgc3Ryc1sxXSA9PSAidG1wIiB8fAorICAgICAgICAgICAgICAgICAgICAgICBzID09IDMgJiYgc3Ryc1sxXSA9PSAiTmV3cyIgJiYgc3Ryc1syXSA9PSBldWlkKyIubmV3cyIpICkKKyAgICAgICAgICAgIHJldHVybiAxOworCisgICAgICAgIGlmIChsdmw+PUVMREVSX0xWTCkKKyAgICAgICAgICAgIHJldHVybiAxOworCisgICAgICAgIHJldHVybiAwOworCisgICAgY2FzZSBNQUlMRElSOgorICAgICAgaWYgKGV1aWQ9PU1BSUxJRCB8fCBzdHJzWzFdPT0ic3Bvb2wiKSBicmVhazsKKyAgICAgIHJldHVybiAwOworCisgICAgY2FzZSBMSUJTQVZFRElSOgorICAgICAgaWYgKGx2bD49QVJDSF9MVkwpIHJldHVybiAxOworICAgICAgaWYgKHM9PTMgJiYgc3Ryc1sxXSA9PSBldWlkWzAuLjBdICYmCisgICAgICAgICAgKHN0cnNbMl09PWV1aWQrIi5vIiB8fCBzdHJzWzJdPT1ldWlkKSkgYnJlYWs7CisgICAgICByZXR1cm4gMDsKKworICAgIGNhc2UgTElCTE9HRElSOgorICAgICAgLyogYXVmIC9sb2cvQVJDSC8gaGFiZW4gd2lya2xpY2ggbnVyIEVNcyBadWdyaWZmICovCisgICAgICBpZiAoc3Ryc1sxXT09IkFSQ0giICYmIGx2bDxBUkNIX0xWTCkgcmV0dXJuIDA7CisKKyAgICAgIC8qIGFsbGVzIGFuZGVyZSBkdWVyZmVuIGF1Y2ggV2Vpc2UuLi4gKi8KKyAgICAgIGlmIChsdmw+PUVMREVSX0xWTCkgcmV0dXJuIDE7CisKKyAgICAgIC8qIEFsbGdlbWVpbmUgbG9nZmlsZXMgaW4gL2xvZyBkdWVyZmVuIHdpcmtsaWNoIG51ciBnZXNjaHJpZWJlbiB3ZXJkZW4gKi8KKyAgICAgIGlmIChzPT0yICYmIHN0cnNbMV1bMF0+PSdBJyAmJiBzdHJzWzFdWzBdPD0nWicgJiYgZnVuICE9ICJ3cml0ZV9maWxlIikKKyAgICAgICAgIHJldHVybiAwOworCisgICAgICAvKiBVbnRlcmhhbGIgdm9uIC9sb2cvc3lzbG9nIGRhcmYgbnVyIGdlc2NocmllYmVuIHdlcmRlbiAqLworICAgICAgaWYgKHM+MSAmJiBzdHJzWzFdPT0ic3lzbG9nIiAmJiBmdW4gIT0gIndyaXRlX2ZpbGUiKQorICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgIC8qIGxvZ2dlbiBpbnMgZWlnZW5lIHJlcGZpbGUgaW1tZXIgZXJsYXViZW4gKi8KKyAgICAgIGlmIChzPT0zICYmIHN0cnNbMV09PSJyZXBvcnQiICYmCisgICAgICAgICAgc3Ryc1syXT09ZXhwbG9kZShldWlkLCAiLiIpWzwxXSsiLnJlcCIpIGJyZWFrOworCisgICAgICAvKiBpbiBmcmVtZGVuIFZlcnplaWNobmlzc2VuIGhhdCBuaWVtYW5kIHdhcyB6dSBsb2dnZW4gKi8KKyAgICAgIGlmIChnZXRfd2l6X2xldmVsKHN0cnNbMV0pID49IFdJWkFSRF9MVkwgJiYKKyAgICAgICAgICBzdHJzWzFdICE9IGVmdW46OmV4cGxvZGUoZXVpZCwgIi4iKVs8MV0pCisgICAgICAgICByZXR1cm4gMDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBXSVpBUkRESVI6CisgICAgICAvKiBrZWluIFp1Z3JpZmYgYXVmIE9iamVrdGUgbWl0IGhvZWhlcmVuIFJlY2h0ZW4gKi8KKyAgICAgIGlmIChxdWVyeV93aXpfbGV2ZWwoc3Ryc1sxXSkgPiBsdmwpIHJldHVybiAwOworCisgICAgICAvKiBNYWdpZXIgc2VsYnN0IG9kZXIgV2Vpc2UgZHVlcmZlbiBoaWVyIHNjaHJlaWJlbiAqLworICAgICAgaWYgKChJU19XSVpBUkQoZXVpZCkgJiYgZXVpZD09c3Ryc1sxXSl8fChsdmw+PUVMREVSX0xWTCkpIGJyZWFrOworCisgICAgICAvKiBFcyBzdGVodCBqZWRvY2ggZnJlaSwgYXVjaCBhbmRlcmVuIFNjaHJlaWJyZWNodGUgenUgZ2ViZW4uLi4gKi8KKyAgICAgIHJldHVybiBhY2Nlc3NfcmlnaHRzKHN0cnMsZXVpZCk7CisgICAgICAKKyAgICBjYXNlIERPTUFJTkRJUjoKKyAgICAgIC8qIG5ldWUgUmVnaW9uZW4gZHVlcmZlbiBudXIgRXJ6bWFnaWVyIGFubGVnZW4gKi8KKyAgICAgIGlmIChzPDIgJiYgbHZsPEFSQ0hfTFZMKSByZXR1cm4gMDsKKworICAgICAgLyoga2VpbiBadWdyaWZmIGF1ZiBPYmpla3RlIG1pdCBob2VoZXJlbiBSZWNodGVuICovCisgICAgICBpZiAocz4yICYmIHF1ZXJ5X3dpel9sZXZlbChjcmVhdG9yX2ZpbGUocGF0aCkpID4gbHZsKQorICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgIC8qIEF1ZiBSZWdpb25maWxlcyB2b24gZXJ6bWFnaWVyIGhhYmVuIG51ciBFTXMgWnVncmlmZiAqLworICAgICAgaWYgKGNyZWF0b3JfZmlsZShwYXRoKT09ImVyem1hZ2llciIgJiYgbHZsPEFSQ0hfTFZMKSByZXR1cm4gMDsKKworICAgICAgLyogaW5uZXJoYWxiIGRlciBSZWdpb24gaGFiZW4gUk1zIHVuZCBXZWlzZSB2b2xsZSBTY2hyZWlicmVjaHRlICovCisgICAgICBpZiAobHZsPj1FTERFUl9MVkwgfHwgZG9tYWluX21hc3RlcihldWlkLHN0cnNbMV0pKSBicmVhazsKKworICAgICAgLyogbmV1ZSBWZXJ6ZWljaG5pc3NlIGluIGRlciBSZWdpb24ga2FubiBudXIgUk0rIGFubGVnZW4gKi8KKyAgICAgIGlmIChzPD0zICYmIChmdW49PSJta2RpciIgfHwgZnVuPT0icm1kaXIiKSkgcmV0dXJuIDA7CisKKyAgICAgIC8qIE1hZ2llciBhdWYgaWhyZSBlaWdlbmVuIEZpbGVzLi4uICovCisgICAgICBpZiAocz4yICYmIHN0cnNbMl09PWV1aWQpIGJyZWFrOworCisgICAgICAvKiBGaWxlcyBkZXIgTWFnaWVyIGluIGRlciBSZWdpb24gaW4gaWhyZSBlaWdlbmVuIFZlcnplaWNobmlzc2UuLi4gKi8KKyAgICAgIGlmIChzPjIgJiYgZXVpZD09c3ByaW50ZigiZC4lcy4lcyIsIHN0cnNbMV0sIHN0cnNbMl0pKSBicmVhazsKKworICAgICAgLyogRmlsZXMgbWl0IFJlZ2lvbnN1aWQgKi8KKyAgICAgIGlmIChldWlkPT1zdHJzWzFdKSBicmVhazsKKworICAgICAgLyogRXMgaXN0IG1vZWdsaWNoIGFuZGVyZW4gTWFnaWVybiBSZWNodGUgYmVpIHNpY2ggZWluenVyYWV1bWVuLiAqLworICAgICAgaWYgKGFjY2Vzc19yaWdodHMoc3RycyxldWlkKT4wKSBicmVhazsKKworICAgICAgLyogQXVmIGRhcyBWZXJ6ZWljaG5pc3MgJ2FsbGUnIGhhYmVuIGFsbGUgUmVnaW9uc21pdGdsaWVkZXIgWnVncmlmZi4KKyAgICAgICAgIEF1c3Nlciwgd2VubiBzaWUgdWViZXIgYWNjZXNzX3JpZ2h0cy5jIGV4cGxpeml0IGF1c2dlc2NobG9zc2VuCisgICAgICAgICB3ZXJkZW4gKFJldHVybmNvZGUgPCAwKS4gKi8KKyAgICAgIGlmIChzPjIgJiYgc3Ryc1syXT09ImFsbGUiICYmIGRvbWFpbl9tZW1iZXIoZXVpZCwgc3Ryc1sxXSkgJiYKKyAgICAgICAgICBhY2Nlc3NfcmlnaHRzKHN0cnMsZXVpZCk+PTApIGJyZWFrOworICAgICAgcmV0dXJuIDA7CisKKyAgICBjYXNlIFBST0pFQ1RESVI6CisgICAgICAvKiBOdXIgRXJ6bWFnaWVyIGR1ZXJmZW4gbmV1ZSBQcm9qZWt0dmVyemVpY2huaXNzZSBhbmxlZ2VuLi4uICovCisgICAgICBpZiAoczwzICYmIGx2bDxBUkNIX0xWTCkgcmV0dXJuIDA7CisKKyAgICAgIC8qIGFsbGVzIHdlaXRlcmUgZHVlcmZlbiBhdWNoIFdlaXNlIHR1biAqLworICAgICAgaWYgKGx2bD49RUxERVJfTFZMKSBicmVhazsKKworICAgICAgLyogaW4gZGVuIFNlcnZpY2V2ZXJ6ZWljaG5pc3NlbiBtdXNzIGxlZGlnbGljaCBkZXIgTmFtZSBzdGltbWVuICovCisgICAgICBpZiAocz4zICYmIHN0cnNbMV09PSJzZXJ2aWNlIiAmJiBldWlkPT1zdHJzWzJdKSBicmVhazsKKworICAgICAgLyogT2JqZWt0ZSBlaW5lcyBQcm9qZWt0ZXMgaGFiZW4gU2NocmVpYnp1Z3JpZmZlIGF1ZiBpaHIgUHJvamVrdCAqLworICAgICAgaWYgKHM+MyAmJiAoaW1wbG9kZShzdHJzWzAuLjFdLCAiLiIpID09IGV1aWQKKyAgICAgICAgICAgICAgICAgIHx8IGltcGxvZGUoc3Ryc1swLi4yXSwgIi4iKSA9PSBldWlkKSApIHJldHVybiAxOworCisgICAgICAvKiBTY2hyZWlicmVjaHRlIGtvZW5uZW4gbmF0dWVybGljaCBhdWNoIHZlcmdlYmVuIHdlcmRlbi4uLiAqLworICAgICAgaWYgKHByb2plY3RfYWNjZXNzKGV1aWQsc3Ryc1sxXSkpIGJyZWFrOworICAgICAgLy8gQWx0ZXJuYXRpdiBiZXN0ZWh0IG5lYmVuIGRlbSBBQ0NFU1NfUklHSFRTIGF1Y2ggbm9jaCBkaWUKKyAgICAgIC8vIE1vZWdsaWNoa2VpdCwgcGVyIGFjY2Vzc19yaWdodHMuYyBSZWNodGUgZWluenVyYWV1bWVuLgorICAgICAgaWYgKGFjY2Vzc19yaWdodHMoc3RycyxldWlkKT4wKSBicmVhazsKKworICAgICByZXR1cm4gMDsKKworICAgIGRlZmF1bHQ6IHJldHVybiAwOworICB9CisgIHJldHVybiBwYXRoOworfQorCittaXhlZCB2YWxpZF9yZWFkKHN0cmluZyBwYXRoLCBzdHJpbmcgZXVpZCwgc3RyaW5nIGZ1biwgb2JqZWN0IG9iaikKK3sKKyAgaW50IHMsIGxldjsKKyAgc3RyaW5nICpzdHJzLCBzdWY7CisKKyAgaWYgKG1lbWJlcihwYXRoLCcgJykhPS0xKSByZXR1cm4gMDsKKworICAvLyBVbnRlciBMSUJEQVRBRElSICgvZGF0YSkgc29sbGVuIGtvbXBsZXR0IGlkZW50aXNjaGUgTGVzZXJlY2h0ZQorICAvLyB2ZXJnZWJlbiB3ZXJkZW4uCisgIGlmIChzaXplb2YocGF0aCkgPiA2CisgICAgICAmJiBwYXRoWzAuLjVdID09ICIvIkxJQkRBVEFESVIiLyIpCisgICAgcmV0dXJuIHZhbGlkX3JlYWQocGF0aFs1Li5dLCBldWlkLCBmdW4sIG9iaikgIT0gMDsKKworICBpZiAoIWV1aWQpIGV1aWQ9Ii0iOworCisgIHN0cnM9ZnVsbF9wYXRoX2FycmF5KHBhdGgsIGV1aWQpOworICAvLyBQZmFkIHNvbGwgYWIgamV0enQgYXVmIGplZGVuIEZhbGwgYWJzb2x1dCBzZWluLgorICBpZiAoc3Ryc1swXSAhPSAiIikKKyAgICAgIHBhdGggPSAiLyIgKyBpbXBsb2RlKHN0cnMsICIvIik7CisgIGVsc2UKKyAgICAgIHBhdGg9aW1wbG9kZShzdHJzLCAiLyIpOworCisgIC8vIGZ1ZXIgZGllIFJlY2h0ZWJlc3RpbW11bmcgIi8iIGFuIEFuZmFuZyB1bmQgRW5kZSBlbnRmZXJuZW4KKyAgc3RycyAtPSAoeyIifSk7CisKKyAgaWYgKCFzaXplb2Yoc3RycykgfHwgIXNpemVvZihwYXRoKSB8fCBldWlkID09IFJPT1RJRCB8fCBvYmo9PVRPKSByZXR1cm4gcGF0aDsKKworICBpZiAoKHM9c2l6ZW9mKHN0cnMpKSA8PSAxKSByZXR1cm4gcGF0aDsKKworICBsZXY9cXVlcnlfd2l6X2xldmVsKGV1aWQpOworCisgIHN3aXRjaChzdHJzWzBdKSB7CisgICAgY2FzZSAiY29yZSI6CisgICAgY2FzZSAid2FobCI6CisgICAgICByZXR1cm4gMDsKKworICAgIGNhc2UgTkVXU0RJUjoKKyAgICAgIGlmIChzdHJzWzFdID09ICJhcmNoaXYucHViIikgLy8gb2VmZmVudGxpY2hlcyBhcmNoaXYKKyAgICAgICAgcmV0dXJuIHBhdGg7CisgICAgICBlbHNlIGlmIChzdHJzWzFdID09ICJhcmNoaXYubWFnaWVyIiAvLyBNYWdpZXItQXJjaGl2CisgICAgICAgICAgICAgICAmJiBsZXYgPj0gV0laQVJEX0xWTCkKKyAgICAgICAgcmV0dXJuIHBhdGg7CisKKyAgICAgIHJldHVybiAwOyAvLyBrZWluIFp1Z3JpZmYgYXVmIC9uZXdzLyBvZGVyIGFsbGVzIGFuZGVyZS4KKworICAgIGNhc2UgIm1hcHMiOgorICAgICAgaWYgKGxldjw9V0laQVJEX0xWTCkgcmV0dXJuIDA7CisKKyAgICBjYXNlICIiOgorICAgIGNhc2UgRVRDRElSOgorICAgIGNhc2UgU1RERElSOgorICAgIGNhc2UgU1lTRElSOgorICAgIGNhc2UgRE9DRElSOgorICAgIGNhc2UgTElCT0JKRElSOgorICAgIGNhc2UgTElCUk9PTURJUjoKKyAgICBjYXNlIExJQklURU1ESVI6CisgICAgY2FzZSBGVFBESVI6CisgICAgICByZXR1cm4gcGF0aDsKKworICAgIGNhc2UgTUFJTERJUjoKKyAgICAgIHJldHVybiAoZXVpZD09TUFJTElEKTsKKworICAgIGNhc2UgU0VDVVJFRElSOgorICAgICAgaWYgKHN0cnNbMV09PSJzYXZlIikgcmV0dXJuIDA7CisgICAgICBpZiAocGF0aFs8Mi4uXT09Ii5vIiB8fCBwYXRoWzw1Li5dPT0iLmR1bXAiKSByZXR1cm4gMDsKKyAgICAgIGlmIChzdHJzWzFdIT0iQVJDSCIgfHwgbGV2Pj1BUkNIX0xWTCkgcmV0dXJuIHBhdGg7CisKKyAgICBjYXNlIExJQkxPR0RJUjoKKyAgICAgIGlmICggc3Ryc1sxXSA9PSAiQVJDSCIgJiYgIUlTX0RFUFVUWShldWlkKSApCisgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgIGlmICggc3Ryc1sxXSA9PSAiQVJDSCIgJiYgbGV2IDwgQVJDSF9MVkwgJiYgcyA9PSAzICYmCisgICAgICAgICAgIHN0cnNbMl0gIT0gIioiICYmIHN0cnNbMl1bMC4uMl0gIT0gImJiLiIgJiYKKyAgICAgICAgICAgbWVtYmVyKCBkZXB1dHlfZmlsZXMsIHN0cnNbMl0gKSA8IDAgKQorICAgICAgICAgIHJldHVybiAwOworCisgICAgICBpZiAoIGxldiA+IFdJWkFSRF9MVkwgKQorICAgICAgICAgIHJldHVybiBwYXRoOworCisgICAgICBpZiAoIHMgPT0gMiAmJiAoc3Ryc1sxXSA9PSAicmVwb3J0IiB8fCBzdHJzWzFdID09ICJlcnJvciIpICkKKyAgICAgICAgICByZXR1cm4gcGF0aDsgLy8gZnVlciAnY2QnCisKKyAgICAgIC8vIC9sb2cgc29sbHRlIGplZGVyIGF1Zmxpc3RlbiBrb2VubmVuCisgICAgICBpZiAoIHMgPT0gMiAmJiBzdHJzWzFdPT0iKiIgJiYgZnVuPT0iZ2V0X2RpciIpCisgICAgICAgICAgcmV0dXJuIHBhdGg7CisKKyAgICAgIC8vIHVudGVyIC9sb2cvcmVwb3J0LywgL2xvZy9lcnJvciB1bmQgL2xvZy93YXJuaW5nLyBkdWVyZmVuIGFsbGUgbGVzZW4KKyAgICAgIGlmICggcz09MyAmJiAKKyAgICAgICAgICAoc3Ryc1sxXSA9PSAicmVwb3J0IiB8fCBzdHJzWzFdID09ICJlcnJvciIgIAorICAgICAgICAgICB8fCBzdHJzWzFdID09Indhcm5pbmciKSkKKyAgICAgICAgICByZXR1cm4gcGF0aDsKKworICAgICAgLy8gL2xvZy88TWFnaWVybmFtZT4gZGFyZiB2b24gPE1hZ2llcm5hbWU+IG5hdHVlcmxpY2ggYXVjaAorICAgICAgLy8gZ2VsZXNlbiB3ZXJkZW4KKyAgICAgIGlmICggcyA+PSAyICYmIHN0cnNbMV0gPT0gZXVpZCApCisgICAgICAgICAgcmV0dXJuIHBhdGg7CisKKyAgICAgIHJldHVybiAwOworCisgICAgY2FzZSAiYmFja3VwIjoKKyAgICBjYXNlIExJQlNBVkVESVI6CisgICAgICBpZiAobGV2PldJWkFSRF9MVkwpIHJldHVybiBwYXRoOworCisgICAgICAvKiBPYmpla3RlIGluIC9wLyogaGFiZW4gYmlzaGVyIGxlaWRlciB3aXpsZXZlbCAwICovCisgICAgICAvL2lmIChsZXY9PTApIHJldHVybiBwYXRoOworCisgICAgICBpZiAoZnVuPT0iZmlsZV9zaXplIikgcmV0dXJuIHBhdGg7CisKKyAgICAgIC8vIGRhcyBlaWdlbmUgU2F2ZWZpbGUgZGFyZiBtYW4gbmF0dWVybGljaCBpbW1lci4gOy0pCisgICAgICBpZiAocz09MyAmJiAoc3Ryc1syXT09ZXVpZCsiLm8iIHx8IHN0cnNbMl09PWV1aWQpKQorICAgICAgICByZXR1cm4gcGF0aDsKKyAgICAgIHJldHVybiAwOworCisgICAgY2FzZSBQUk9KRUNURElSOgorICAgICAgLyogUHJ1ZWZlbiBvYiBlaW4gRmlsZSBleGlzdGllcnQgZGFyZiBqZWRlci4uLiAqLworICAgICAgaWYgKGZ1bj09ImZpbGVfc2l6ZSIpIHJldHVybiBwYXRoOworCisgICAgICAvKiBEaWUgU2VydmljZS1WZXJ6ZWljaG5pc3NlIGRhcmYgamVkZXIgbGVzZW4gKi8KKyAgICAgIGlmIChzPjMgJiYgc3Ryc1sxXT09InNlcnZpY2UiKSByZXR1cm4gcGF0aDsKKworICAgICAgLy9XZWlzZSBkdWVyZmVuIGluIC9wLyBzY2hyZWliZW4sIGFsc28gYXVjaCBsZXNlbi4gKFplc3N0cmEsIDA0LjExLjA2KQorICAgICAgaWYgKGxldj49RUxERVJfTFZMKSByZXR1cm4gcGF0aDsKKworICAgICAgLyogd2VyIGhpZXIgc2NocmVpYmVuIGRhcmYsIGRhcmYgbmF0dWVybGljaCBhdWYgamVkZW4gRmFsbCBsZXNlbiAqLworICAgICAgLy9Bbm1lcmt1bmcgdi4gWmVzc3RyYTogZGFzIHBydWVmdCBudXIsIG9iIGplbWFuZCBpbiBBQ0NFU1NfUklHSFRTCisgICAgICAvL3N0ZWh0LCBuaWNodCBvYiBqZW1hbmQgKGdnZi4gYXVzIGFuZGVyZW4gR3J1ZW5kZW4gc2NocmVpYmVuIGRhcmYpCisgICAgICBpZiAocHJvamVjdF9hY2Nlc3MoZXVpZCxzdHJzWzFdKSkgcmV0dXJuIHBhdGg7CisgICAgICAvL0FsdGVybmF0aXYga2FubiBtYW4gZXhwbGl6aXRlIFNjaHJlaWJyZWNodGUgYXVjaCB2aWEgYWNjZXNzX3JpZ2h0cy5jCisgICAgICAvL3ZlcmdlYmVuLiAodW5kIGRhbWl0IG5hdHVlcmxpY2ggYXVjaCBMZXNlcmVjaHRlKQorICAgICAgaWYgKGFjY2Vzc19yaWdodHMoc3RycyxldWlkKT4wKSByZXR1cm4gcGF0aDsKKworICAgICAgLyogT2JqZWt0ZSBlaW5lcyBQcm9qZWt0ZXMgaGFiZW4gTGVzZXp1Z3JpZmYgYXVmIGlociBQcm9qZWt0ICovCisgICAgICBpZiAocz4zICYmIChpbXBsb2RlKHN0cnNbMC4uMV0sICIuIikgPT0gZXVpZAorICAgICAgICAgICAgICAgICAgfHwgaW1wbG9kZShzdHJzWzAuLjJdLCAiLiIpID09IGV1aWQpICkgcmV0dXJuIHBhdGg7CisKKyAgICAgIC8qIEZhbGwtVGhyb3VnaCAqLworCisgICAgY2FzZSBHVUlMRERJUjoKKyAgICAgIC8qICJzZWN1cmUiLVZlcnplaWNobmlzc2UgZGFyZiBudXIgbGVzZW4sIHdlciBkYSBhdWNoIHNjaHJlaWJlbiBkYXJmICovCisgICAgICBpZiAoIHMgPiAzICYmIHN0cnNbPDJdID09ICJzZWN1cmUiICYmIG1lbWJlciggaW5zZWN1cmUsIHN0cnNbMV0gKSA8IDAKKyAgICAgICAgICAgJiYgbGV2IDwgQVJDSF9MVkwgJiYgIWFjY2Vzc19yaWdodHMoc3RycywgZXVpZCkgKQorICAgICAgICAgIHJldHVybiAwOworCisgICAgICAvKiBQcnVlZmVuIG9iIGVpbiBGaWxlIGV4aXN0aWVydCBkYXJmIGplZGVyLi4uICovCisgICAgICBpZiAoZnVuPT0iZmlsZV9zaXplIikgcmV0dXJuIHBhdGg7CisKKyAgICAgIC8qIEZhbGwtVGhyb3VnaCAqLworCisgICAgY2FzZSBTUEVMTEJPT0tESVI6CisgICAgICAvLyBHaWxkZW5wYmpla3RlIGtvZW5uZW4gaGllciBsZXNlbgorICAgICAgaWYgKGxldj09MCAmJiBldWlkWzAuLjRdPT0iR1VJTEQiKSByZXR1cm4gcGF0aDsKKworICAgICAgLy8gTWl0IExldmVsIDw9IDIwIGRhcmYgbWFuIGhpZXIgbmljaHRzIGxlc2VuCisgICAgICBpZiAoIGxldjw9V0laQVJEX0xWTCAmJiBzaXplb2YocmVnZXhwKCAoe3N0cnNbPDFdfSksICJcXC5bb2NoXSIgKSkgKQorICAgICAgICByZXR1cm4gMDsKKworICAgICAgcmV0dXJuIHBhdGg7CisKKyAgICBjYXNlIFdJWkFSRERJUjoKKyAgICAgIGlmIChzPT0yKSByZXR1cm4gcGF0aDsKKyAgICAgIC8qIGRhcyBlaWdlbmUgVmVyemVpY2huaXNzIGRhcmYgbWFuIG5hdHVlcmxpY2ggaW1tZXIgbGVzZW4uLi4gKi8KKyAgICAgIGlmIChzdHJzWzFdPT1ldWlkICYmIGxldj49V0laQVJEX0xWTCkgcmV0dXJuIHBhdGg7CisKKyAgICAgIC8qIFBydWVmZW4gb2IgZWluIEZpbGUgZXhpc3RpZXJ0IGRhcmYgamVkZXIuLi4gKi8KKyAgICAgIGlmIChmdW49PSJmaWxlX3NpemUiKSByZXR1cm4gcGF0aDsKKworICAgICAgLyogZnJlbWRlIFZlcnplaWNobmlzc2UgbWl0IDw9IExldmVsIDIwIG5vY2ggbmljaHQgKi8KKyAgICAgIGlmIChsZXY8PVdJWkFSRF9MVkwpIHJldHVybiAwOworCisgICAgICAvKiB3byBtYW4gc2NocmVpYmVuIGRhcmYsIGRhcmYgbWFuIG5hdHVlcmxpY2ggYXVjaCBsZXNlbi4uLiAqLworICAgICAgaWYgKGxldj49RUxERVJfTFZMKSByZXR1cm4gcGF0aDsKKworICAgICAgLy8ga2VpbiBadWdyaWZmIGF1ZiBhcmNoaXZpZXJ0ZW4gQ29kZSAod28gei5CLiBzZWN1cmUvIGRyaW4gc2VpbgorICAgICAgLy8ga29lbm5lbikKKyAgICAgIGlmIChtZW1iZXIoKHsiYnoyIiwiZ3oiLCJ6aXAifSksIGV4cGxvZGUoc3Ryc1s8MV0sIi4iKVs8MV0pID4gLTEpCisgICAgICAgIHJldHVybiAwOworCisgICAgICAvKiBGaWxlcyBvaG5lIENvZGUgc2luZCBuaWNodCB3ZWl0ZXIgaW50ZXJlc3NhbnQuLi4gKi8KKyAgICAgIGlmICggIXNpemVvZihyZWdleHAoICh7c3Ryc1s8MV19KSwgIlxcLltvY2hdIiApKSApCisgICAgICAgICAgcmV0dXJuIHBhdGg7CisKKyAgICAgIC8qIGZvbGdlbmRlIEZ1bmt0aW9uZW4gc2luZCBuYXR1ZXJsaWNoIHZvZWxsaWcgdW5pbnRlcmVzc2FudCAqLworICAgICAgaWYgKG1lbWJlcigoeyJnZXRfZGlyIiwgInJlc3RvcmVfb2JqZWN0In0pLCBmdW4pIT0tMSkKKyAgICAgICAgICByZXR1cm4gcGF0aDsKKworICAgICAgLyogWnVncmlmZiBlcmxhdWJ0LCBhYmVyIG1pdGxvZ2dlbiAqLworICAgICAgd3JpdGVfZmlsZSggUkVBRF9GSUxFLCBzcHJpbnRmKCIlTyAlcyAlczogJXNcbiIsIGZ1biwgY3RpbWUoKVs0Li5dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV1aWQsIHBhdGgpICk7CisgICAgICByZXR1cm4gcGF0aDsKKworICAgIGNhc2UgRE9NQUlORElSOgorICAgICAgLyogTWl0IExldmVsIDE1IGRhcmYgbWFuIGhpZXIgX25pY2h0c18gbGVzZW4gKi8KKyAgICAgIGlmICggZnVuIT0iZmlsZV9zaXplIiAmJiBsZXY8V0laQVJEX0xWTCAmJgorICAgICAgICAgICBzaXplb2YocmVnZXhwKCAoe3N0cnNbPDFdfSksICJcXC5bb2NoXSIgKSkgKSByZXR1cm4gMDsKKworICAgICAgLyogZGVuIFZlcnplaWNobmlzYmF1bSB2b24gL2QvIGRhcmYgbWFuIG5hdHVlcmxpY2ggc29uc3QgbGVzZW4gKi8KKyAgICAgIGlmIChzPD0yKSByZXR1cm4gcGF0aDsKKworICAgICAgLyogZWlnZW5lbiBDb2RlIGRhcmYgbWFuIG5hdHVlcmxpY2ggYXVjaCBsZXNlbiAqLworICAgICAgaWYgKGV1aWQ9PXN0cnNbMl0gfHwgZXVpZD09c3ByaW50ZigiZC4lcy4lcyIsIHN0cnNbMV0sIHN0cnNbMl0pKQorICAgICAgICAgcmV0dXJuIHBhdGg7CisKKyAgICAgIC8qIERlcHV0aWVzIGhhYmVuIGVpbiBnZW1laW5zYW1lcyBWZXJ6ZWljaG5pcyB1bnRlciAvZC9lcnptYWdpZXIgKi8KKyAgICAgIGlmIChzdHJzWzFdPT0iZXJ6bWFnaWVyIiAmJiBzdHJzWzJdPT0icG9saXplaSIgJiYgSVNfREVQVVRZKGV1aWQpKQorICAgICAgICAgIHJldHVybiBwYXRoOworCisgICAgICAvKiBkL2Vyem1hZ2llciBkYXJmIG1hbiBudXIgYWxzIEVyem1hZ2llciBsZXNlbiAqLworICAgICAgaWYgKHN0cnNbMV09PSJlcnptYWdpZXIiICYmIGxldjxBUkNIX0xWTCkgcmV0dXJuIDA7CisKKyAgICAgIC8qIGVpbmlnZSBSZWdpb25lbiBoYWJlbiBzdGQtdmVyemVpY2huaXNzZSwgZGllIGRhcmYgbWFuIG5hdHVlcmxpY2gKKyAgICAgICAgIGF1Y2ggbWl0IExldmVsIDIwIGJlcmVpdHMga29tcGxldHQgbGVzZW4hICovCisgICAgICBpZiAoc3Ryc1syXT09InN0ZCIpIHJldHVybiBwYXRoOworCisgICAgICAvKiAic2VjdXJlIi1WZXJ6ZWljaG5pc3NlIGRhcmYgbnVyIGxlc2VuLCB3ZXIgZGEgYXVjaCBzY2hyZWliZW4gZGFyZiAqLworICAgICAgaWYgKCBzID4gNCAmJiBzdHJzWzwyXSA9PSAic2VjdXJlIiAmJiBtZW1iZXIoIGluc2VjdXJlLCBzdHJzWzJdICkgPCAwICl7CisgICAgICAgICAgaWYgKCBsZXYgPCBFTERFUl9MVkwgJiYgIWRvbWFpbl9tYXN0ZXIoZXVpZCwgc3Ryc1sxXSkKKyAgICAgICAgICAgICAgICYmICFhY2Nlc3NfcmlnaHRzKHN0cnMsIGV1aWQpICkKKyAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICByZXR1cm4gcGF0aDsKKyAgICAgIH0KKworICAgICAgLyogRG9rdXMsIEluZm9zIHVuZCAucmVhZG1lIGRhcmYgbWFuIGltbWVyIGxlc2VuLi4uICovCisgICAgICBpZiAoIGZ1bj09ImZpbGVfc2l6ZSIgfHwgIXNpemVvZihyZWdleHAoICh7c3Ryc1s8MV19KSwgIlxcLltvY2hdIiApKSApCisgICAgICAgICAgcmV0dXJuIHBhdGg7CisKKyAgICAgIC8qIE1pdCBMZXZlbCAyMCBkYXJmIG1hbiBub2NoIGtlaW5lbiBmcmVtZGVuIENvZGUgbGVzZW4hICovCisgICAgICBpZiAobGV2PD1XSVpBUkRfTFZMKSByZXR1cm4gMDsKKworICAgICAgLyogV2Vpc2UgZHVlcmZlbiBuYXR1ZXJsaWNoIGFsbGVzIHdlaXRlcmUgbGVzZW4gKi8KKyAgICAgIGlmIChsZXY+PUVMREVSX0xWTCkgcmV0dXJuIHBhdGg7CisKKyAgICAgIC8qIFJlZ2lvbnNtYWdpZXIgaW4gaWhyZW4gUmVnaW9uZW4gbmF0dWVybGljaCBhdWNoICovCisgICAgICBpZiAobGV2Pj1MT1JEX0xWTCAmJiBkb21haW5fbWFzdGVyKGV1aWQsIHN0cnNbMV0pKSByZXR1cm4gcGF0aDsKKworICAgICAgLyogZm9sZ2VuZGUgRnVua3Rpb25lbiBzaW5kIG5hdHVlcmxpY2ggdm9lbGxpZyB1bmludGVyZXNzYW50ICovCisgICAgICBpZiAobWVtYmVyKCh7ImdldF9kaXIiLCAicmVzdG9yZV9vYmplY3QifSksIGZ1bikhPS0xKQorICAgICAgICAgIHJldHVybiBwYXRoOworCisgICAgICAvKiBadWdyaWZmIGVybGF1YnQsIGFiZXIgbWl0bG9nZ2VuICovCisgICAgICB3cml0ZV9maWxlKCBSRUFEX0ZJTEUsIHNwcmludGYoIiVPICVzICVzOiAlc1xuIiwgZnVuLCBjdGltZSgpWzQuLl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXVpZCwgcGF0aCkgKTsKKyAgICAgIHJldHVybiBwYXRoOworICB9CisgIGlmIChsZXY8QVJDSF9MVkwpIHJldHVybiAwOworICByZXR1cm4gcGF0aDsKK30KKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL21hc3Rlci9ndWlsZC5jIGIvc2VjdXJlL21hc3Rlci9ndWlsZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYWFhOGIKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvbWFzdGVyL2d1aWxkLmMKQEAgLTAsMCArMSw2MiBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIG1hc3Rlci9ndWlsZC5jIC0tIEdpbGRlbiB1bmQgR2lsZGVubWFnaWVyCisvLworLy8gJElkOiBndWlsZC5jIDYxNDIgMjAwNy0wMS0zMSAyMDozNDozOVogWmVzc3RyYSAkCisKKy8qCisgKiBEaWVzIGthbm4gaXJnZW5kd2FubiBhdWNoIGhpbnNpY2h0bGljaCBlaW5lciBhdXRvbWF0aXNjaGVuIAorICogUmVjaHRldmVyZ2FiZSBhdWYgR2lsZGVuLVZlcnplaWNobmlzc2UgZXJ3ZWl0ZXJ0IHdlcmRlbi4KKyAqIEJpc2hlciB3ZXJkZW4gbnVyIEdpbGRlbm1hZ2llciB2ZXJ3YWx0ZXQuCisgKi8KKworI3ByYWdtYSBzdHJpY3RfdHlwZXMKKworI2luY2x1ZGUgIi9zZWN1cmUvbWFzdGVyLmgiCisKKworaW50IGd1aWxkX21hc3RlcihzdHJpbmcgdXNlciwgc3RyaW5nIGd1aWxkKQoreworICBzdHJpbmcgKmd1aWxkczsKKyAgaW50IGk7CisKKyAgaWYgKCFmaW5kX3VzZXJpbmZvKHVzZXIpfHwKKyAgICAgICFwb2ludGVycChndWlsZHM9Z2V0X3VzZXJpbmZvKHVzZXIpW1VTRVJfR1VJTEQtMV0pKQorICAgIHJldHVybiAwOworICAKKyAgcmV0dXJuIChtZW1iZXIoZ3VpbGRzLGd1aWxkKSAhPSAtMSk7Cit9CisKK2ludCBhZGRfZ3VpbGRfbWFzdGVyKHN0cmluZyB1c2VyLCBzdHJpbmcgZ3VpbGQpCit7CisgIHN0cmluZyAqZ3VpbGRzOworICAKKyAgaWYgKChjYWxsX290aGVyKFNJTVVMX0VGVU5fRklMRSwgInByb2Nlc3NfY2FsbCIpIHx8CisgICAgICAgY2FsbF9vdGhlcihTSU1VTF9FRlVOX0ZJTEUsICJzZWN1cmVfbGV2ZWwiKSA8IEdPRF9MVkwpIHx8CisgICAgICAhZmluZF91c2VyaW5mbyh1c2VyKSkKKyAgICByZXR1cm4gMDsKKworICBndWlsZHM9Z2V0X3VzZXJpbmZvKHVzZXIpW1VTRVJfR1VJTEQtMV07CisgIGlmICghZ3VpbGRzKQorICAgIHNldF9ndWlsZHModXNlciwgKHsgZ3VpbGQgfSkgKTsKKyAgZWxzZSB7CisgICAgZ3VpbGRzID0gZ3VpbGRzIC0gKHtndWlsZH0pICsgKHtndWlsZH0pOworICAgIHNldF9ndWlsZHModXNlciwgZ3VpbGRzKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworaW50IHJlbW92ZV9ndWlsZF9tYXN0ZXIoc3RyaW5nIHVzZXIsIHN0cmluZyBndWlsZCkKK3sKKyAgc3RyaW5nICpndWlsZHM7CisKKyAgaWYgKCFJU19HT0QoZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSkpCisgICAgICB8fCFmaW5kX3VzZXJpbmZvKHVzZXIpCisgICAgICB8fCEoZ3VpbGRzPWdldF91c2VyaW5mbyh1c2VyKVtVU0VSX0dVSUxELTFdKQorICAgICAgfHwgbWVtYmVyKGd1aWxkcyxndWlsZCk9PS0xKQorICAgIHJldHVybiAwOworICBndWlsZHMgLT0gKHsgZ3VpbGQgfSk7CisgIHNldF9ndWlsZHModXNlciwgZ3VpbGRzKTsKKyAgcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL3NlY3VyZS9tYXN0ZXIvbWlzYy5jIGIvc2VjdXJlL21hc3Rlci9taXNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJiMGZjYwotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9tYXN0ZXIvbWlzYy5jCkBAIC0wLDAgKzEsNzcyIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gbWFzdGVyL21pc2MuYyAtLSBEaXZlcnNlczogKFQpQmFuaXNoLCBQcm9qZWt0dmVyd2FsdHVuZywgTGV2ZWxhdWZzdGllZywgLi4uCisvLworLy8gJElkOiBtaXNjLmMgOTQ2NyAyMDE2LTAyLTE5IDE5OjQ4OjI0WiBaZXNzdHJhICQKKworI3ByYWdtYSBzdHJpY3RfdHlwZXMscnR0X2NoZWNrcworCisjaW5jbHVkZSAiL3N5cy9mdW5jdGlvbmxpc3QuaCIKKyNpbmNsdWRlICIvc3lzL2xwY3R5cGVzLmgiCisjaW5jbHVkZSAiL3N5cy9vYmplY3RfaW5mby5oIgorI2luY2x1ZGUgIi9zeXMvaW50ZXJhY3RpdmVfaW5mby5oIgorCisjaW5jbHVkZSAiL3NlY3VyZS9tYXN0ZXIuaCIKKyNpbmNsdWRlICIvbWFpbC9wb3N0LmgiCisjaW5jbHVkZSAiL3N5cy90aGluZy9sYW5ndWFnZS5oIgorI2luY2x1ZGUgIi9zeXMvdGhpbmcvZGVzY3JpcHRpb24uaCIKKworLy8gRnVlciBDSURSLU5vdGF0aW8gaW0gc2JhbmlzaAorI2luY2x1ZGUgIi9zZWN1cmUvbWFzdGVyL2NpZHIuYyIKKworc3RhdGljIG1peGVkICpiYW5pc2hlZDsKK3N0YXRpYyBtYXBwaW5nIHRiYW5pc2hlZCwgc2JhbmlzaGVkOworc3RhdGljIHN0cmluZyAqZGVwdXRpZXM7CisKKy8vIFRPRE86IG11c3MgZ2dmLiBGYWtlb2JqZWt0IGVyemV1Z2VuK3VlYmVyZ2ViZW4sIHdlbm4gc2VuZGVyIGtlaW4gb2JqZWN0Citwcm90ZWN0ZWQgdm9pZCBzZW5kX2NoYW5uZWxfbXNnKHN0cmluZyBjaGFubmVsLG1peGVkIHNlbmRlcm5hbWUsc3RyaW5nIG1zZykKK3sKKyAgb2JqZWN0IHNlbmRlcjsKKyAgaWYgKG9iamVjdHAoc2VuZGVybmFtZSkpCisgICAgc2VuZGVyPXNlbmRlcm5hbWU7CisgIGVsc2UKKyAgeworICAgIC8vIHdlbm4ga2VpbiBPYmpla3QgdWViZXJnZWJlbiwgZXJzdG1hbCBzY2hhdWVuLCBvYiBlaW4gU3BpZWxlcm9iamVjdAorICAgIC8vIGV4aXN0aWVydC4uLiBXZW5uIGphLCBkYXMgbmVobWVuLgorICAgIHNlbmRlciA9IGNhbGxfc2VmdW4oImZpbmRfcGxheWVyIiwgc2VuZGVybmFtZSkKKyAgICAgICAgICAgICB8fCBjYWxsX3NlZnVuKCJmaW5kX25ldGRlYWQiLCBzZW5kZXJuYW1lKTsKKyAgICBpZiAoIW9iamVjdHAoc2VuZGVyKSkKKyAgICB7CisgICAgICAvLyBzb25zdCBmYWtlbiB3aXIgZWlucy4gKnNldWZ6KgorICAgICAgc2VuZGVyPWNsb25lX29iamVjdCgiL3AvZGFlbW9uL25hbWVmYWtlIik7CisgICAgICBzZW5kZXItPlNldFByb3AoUF9OQU1FLCBzZW5kZXJuYW1lKTsgCisgICAgICBzZW5kZXItPlNldFByb3AoUF9BUlRJQ0xFLDApOworICAgICAgLy8gRGllc2VzIE9iamVrdCB6ZXJzdG9lcnQgc2ljaCBuYWNoIDNzIGF1dG9tYXRpc2NoLgorICAgIH0KKyAgfQorICBDSE1BU1RFUi0+c2VuZChjaGFubmVsLCBzZW5kZXIsIG1zZyk7Cit9CisKK3N0YXRpYyBzdHJpbmcgKmV4cGxvZGVfZmlsZXMoc3RyaW5nIGZpbGUpIHsKKyAgc3RyaW5nIGRhdGE7CisgIG1peGVkICpleHBsb2RlZDsKKyAgaW50IGk7CisKKyAgZGF0YT1yZWFkX2ZpbGUoZmlsZSk7CisgIGlmICghZGF0YSB8fCAhc3RyaW5ncChkYXRhKSB8fCBkYXRhID09ICIiKSByZXR1cm4gKHt9KTsKKyAgZXhwbG9kZWQgPSBlZnVuOjpleHBsb2RlKGRhdGEsIlxuIik7CisgIGZvciAoaT1zaXplb2YoZXhwbG9kZWQpO2ktLTspCisgICAgaWYgKCFzdHJpbmdwKGV4cGxvZGVkW2ldKSB8fCBleHBsb2RlZFtpXT09IiIgfHwgZXhwbG9kZWRbaV1bMF09PScjJykKKyAgICAgIGV4cGxvZGVkW2ldPTA7CisgIGV4cGxvZGVkLT0oezB9KTsKKyAgcHJpbnRmKCIlLTMwczogJTNkIE9iamVrdCVzXG4iLGZpbGUsaT1zaXplb2YoZXhwbG9kZWQpLChpPT0xPyIiOiJlIikpOworICByZXR1cm4gZXhwbG9kZWQ7Cit9CisKK3ZvaWQgVXBkYXRlVEJhbmlzaCgpOworCittaXhlZCBRdWVyeUJhbmlzaGVkKHN0cmluZyBzdHIpeworICBpbnQgaTsKKworICBpZiAoIXN0cikgcmV0dXJuIDA7CisgIGlmICghcG9pbnRlcnAoYmFuaXNoZWQpKSByZXR1cm4gMDsKKyAgZm9yIChpPXNpemVvZihiYW5pc2hlZCktMTtpPj0wO2ktLSkKKyAgICBpZiAoc2l6ZW9mKHJlZ2V4cCgoe3N0cn0pLCJeIitiYW5pc2hlZFtpXVswXSsiJCIpKSkKKyAgICB7CisgICAgICBpZiAoIWJhbmlzaGVkW2ldWzFdIHx8IGJhbmlzaGVkW2ldWzFdPT0iIikKKyAgICAgICAgcmV0dXJuICJEaWVzZXIgTmFtZSBpc3QgZ2VzcGVycnQuIjsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGJhbmlzaGVkW2ldWzFdOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKK21peGVkIFF1ZXJ5VEJhbmlzaGVkKHN0cmluZyBzdHIpIHsKKyAgaW50IGk7CisKKyAgaWYgKCFzdHIgfHwgIW1hcHBpbmdwKHRiYW5pc2hlZCkgfHwgIShpPXRiYW5pc2hlZFtzdHJdKSkKKyAgICByZXR1cm4gMDsKKworICBpZiAoaSA9PSAtMSB8fCBpID4gdGltZSgpKQorICAgIHJldHVybiBzcHJpbnRmKCJFcyBnaWJ0IHNjaG9uIGVpbmVuIFNwaWVsZXIgZGllc2VuIE5hbWVucy5cbiIKKyAgICAgICAgKyJBbGxlcmRpbmdzIGthbm4gZXIvc2llIGVyc3QgYW0gJXMgd2llZGVyIGlucyBNdWQga29tbWVuLlxuIiwKKyAgICAgICAgICAoaSA9PSAtMSA/ICJTdC4gTmltbWVybGVpbnN0YWciIDoKKyAgICAgICAgICAgY2FsbF9zZWZ1bigiZHRpbWUiLGkpWzAuLjE2XSkpOworCisvLyBBbnNvbnN0ZW46IGRpZSBaZWl0IGlzdCBhYmdlbGF1ZmVuLCBTcGllbGVyIGRhcmYgd2llZGVyLi4uCisgIG1fZGVsZXRlKHRiYW5pc2hlZCwgc3RyKTsKKyAgVXBkYXRlVEJhbmlzaCgpOworICByZXR1cm4gMDsKK30KKwordm9pZCBSZWxvYWRCYW5pc2hGaWxlKCl7CisgICAgaW50IGksIHQ7CisgICAgc3RyaW5nIHMxLCBzMiwgKnM7CisKKyAgICBiYW5pc2hlZCA9IGVmdW46OmV4cGxvZGUoIHJlYWRfZmlsZSgiL3NlY3VyZS9CQU5JU0giKSB8fCAiIiwgIlxuIiApOworICAgIGJhbmlzaGVkID0gYmFuaXNoZWQgLSAoeyIifSk7CisgICAgZm9yICggaSA9IHNpemVvZihiYW5pc2hlZCk7IGktLTsgKXsKKyAgICAgICAgcyA9IGVmdW46OmV4cGxvZGUoIGJhbmlzaGVkW2ldLCAiICIgKTsKKyAgICAgICAgczEgPSBzWzBdOworICAgICAgICBzMiA9IGltcGxvZGUoIHNbMS4uXSwgIiAiICk7CisgICAgICAgIGJhbmlzaGVkW2ldID0gKHsgczEsIHMyIH0pOworICAgIH0KKworICAgIGlmICggIW1hcHBpbmdwKHRiYW5pc2hlZCkgKXsKKyAgICAgICAgdGJhbmlzaGVkID0gKFtdKTsKKworICAgICAgICBzID0gZWZ1bjo6ZXhwbG9kZSggcmVhZF9maWxlKCIvc2VjdXJlL1RCQU5JU0giKSB8fCAiIiwgIlxuIiApOworICAgICAgICBzIC09ICh7IiJ9KTsKKworICAgICAgICBmb3IgKCBpID0gc2l6ZW9mKHMpOyBpLS07ICl7CisgICAgICAgICAgICBzc2NhbmYoIHNbaV0sICIlczolZCIsIHMxLCB0ICk7CisgICAgICAgICAgICB0YmFuaXNoZWQgKz0gKFsgczEgOiB0IF0pOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCAhbWFwcGluZ3Aoc2JhbmlzaGVkKSApeworICAgICAgICBzYmFuaXNoZWQgPSBtX2FsbG9jYXRlKDMsIDIpOworCisgICAgICAgIHMgPSBlZnVuOjpleHBsb2RlKCByZWFkX2ZpbGUoIi9zZWN1cmUvU0lURUJBTklTSCIpIHx8ICIiLCAiXG4iICk7CisgICAgICAgIHMgLT0gKHsiIn0pOworCisgICAgICAgIGZvciAoIGkgPSBzaXplb2Yocyk7IGktLTsgKSB7CisgICAgICAgICAgICBpbnQgaW50X2lwOworICAgICAgICAgICAgc3NjYW5mKCBzW2ldLCAiJXM6JWQ6JXMiLCBzMSwgdCwgczIgKTsKKyAgICAgICAgICAgIGludF9pcCA9IElQdjRfYWRkcjJpbnQoczEpOworICAgICAgICAgICAgbV9hZGQoc2JhbmlzaGVkLCBpbnRfaXAsIHQsIHMyKTsKKyAgICAgICAgfQorICAgIH0KK30KKworaW50IElzRGVwdXR5KG1peGVkIG5hbWUpCit7CisgICAgaWYgKCBJU19BUkNIKG5hbWUpICkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBpZiAoIG9iamVjdHAobmFtZSkgKQorICAgICAgICBuYW1lID0gZ2V0dWlkKG5hbWUpOworCisgICAgaWYgKCBtZW1iZXIoIGRlcHV0aWVzIHx8ICh7fSksIG5hbWUgKSA+PSAwICkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICByZXR1cm4gMDsKK30KKworCit2YXJhcmdzIHZvaWQgQmFuaXNoTmFtZSggc3RyaW5nIG5hbWUsIHN0cmluZyByZWFzb24sIGludCBmb3JjZSApCit7CisgIHN0cmluZyAqbmFtZXM7CisgIGludCBpOworCisgIGlmICggUE8gIT0gVE8gJiYgY2FsbF9zZWZ1bigic2VjdXJlX2xldmVsIikgPCBMT1JEX0xWTAorICAgICAgICAgICAmJiAhSXNEZXB1dHkoIGNhbGxfc2VmdW4oInNlY3VyZV9ldWlkIikgKSApCisgICAgICByZXR1cm47CisKKyAgaWYgKCAhc3RyaW5ncChuYW1lKSB8fCAhc2l6ZW9mKG5hbWUpICkKKyAgICAgIHJldHVybjsKKworICBuYW1lID0gbG93ZXJfY2FzZShuYW1lKTsKKworICBpZiAoICFyZWFzb24gfHwgIXN0cmluZ3AocmVhc29uKSApCisgICAgICByZWFzb24gPSAiIjsKKworICBpZiAoIFF1ZXJ5QmFuaXNoZWQobmFtZSkgJiYgbG93ZXJfY2FzZShyZWFzb24pICE9ICJsb2VzY2hlbiIgKXsKKyAgICAgIHdyaXRlKCJEZXIgTmFtZSBpc3Qgc2Nob24gZ2ViYW5udC5cbiIpOworICAgICAgcmV0dXJuOworICB9CisKKyAgaWYgKCAhZm9yY2UgJiYgZmlsZV9zaXplKFNBVkVQQVRIK25hbWVbMC4uMF0rIi8iK25hbWUrIi5vIikgPiAwICl7CisgICAgICB3cml0ZSgiRXMgZXhpc3RpZXJ0IGJlcmVpdHMgZWluIFNwaWVsZXIgZGllc2VzIE5hbWVucy5cbiIpOworICAgICAgcmV0dXJuOworICB9CisKKy8qICBpZiAoISgiL3NlY3VyZS9sb2dpbiItPnZhbGlkX25hbWUobmFtZSkpKSByZXR1cm47Ki8KKyAgaWYgKCBsb3dlcl9jYXNlKHJlYXNvbikgIT0gImxvZXNjaGVuIiApeworICAgICAgbmFtZXMgPSAoeyBuYW1lICsgIiAiICsgcmVhc29uIH0pOworCisgICAgICBmb3IgKCBpID0gc2l6ZW9mKGJhbmlzaGVkKTsgaS0tOyApCisgICAgICAgICAgbmFtZXMgKz0gKHsgYmFuaXNoZWRbaV1bMF0gKyAiICIgKyBiYW5pc2hlZFtpXVsxXSB9KTsKKyAgfQorICBlbHNleworICAgICAgbmFtZXMgPSAoe30pOworCisgICAgICBmb3IgKCBpID0gc2l6ZW9mKGJhbmlzaGVkKTsgaS0tOyApCisgICAgICAgICAgaWYgKCBiYW5pc2hlZFtpXVswXSAhPSBuYW1lICkKKyAgICAgICAgICAgICAgbmFtZXMgKz0gKHsgYmFuaXNoZWRbaV1bMF0gKyAiICIgKyBiYW5pc2hlZFtpXVsxXSB9KTsKKyAgfQorCisgIG5hbWVzID0gc29ydF9hcnJheSggbmFtZXMsICMnPiApOworICBybSgiL3NlY3VyZS9CQU5JU0giKTsKKyAgd3JpdGVfZmlsZSggIi9zZWN1cmUvQkFOSVNIIiwgaW1wbG9kZShuYW1lcywgIlxuIikgKTsKKyAgd3JpdGUoICJPa2F5LCAnIitjYXBpdGFsaXplKG5hbWUpKyInIGlzdCBqZXR6dCAiKworICAgICAgKGxvd2VyX2Nhc2UocmVhc29uKSA9PSAibG9lc2NoZW4iID8gIm5pY2h0IG1laHIgIiA6ICIiKSsiZ2ViYW5pc2h0LlxuIiApOworICBSZWxvYWRCYW5pc2hGaWxlKCk7Cit9CisKK3ZvaWQgVXBkYXRlVEJhbmlzaCgpCit7CisgIGludCBpOworICBzdHJpbmcgKm5hbWVzOworCisgIGZvciAoaT1zaXplb2YobmFtZXMgPSBzb3J0X2FycmF5KG1faW5kaWNlcyh0YmFuaXNoZWQpLCAjJzwvKicqLykpLTE7aT49MDtpLS0pCisgICAgbmFtZXNbaV0gPSBzcHJpbnRmKCIlczolZCIsIG5hbWVzW2ldLCB0YmFuaXNoZWRbbmFtZXNbaV1dKTsKKworICBybSgiL3NlY3VyZS9UQkFOSVNIIik7CisgIHdyaXRlX2ZpbGUoIi9zZWN1cmUvVEJBTklTSCIsIGltcGxvZGUobmFtZXMsICJcbiIpKTsKK30KKwordm9pZCBVcGRhdGVTQmFuaXNoKCkKK3sKKyAgICBpbnQgaTsKKyAgICBtYXBwaW5nIGxpbmVzID0gbV9hbGxvY2F0ZShzaXplb2Yoc2JhbmlzaGVkKSwwKTsKKworICAgIGZvcmVhY2goaW50IGlwLCBpbnQgdHN0YW1wLCBzdHJpbmcgdXNlciA6IHNiYW5pc2hlZCkgeworICAgICAgbV9hZGQobGluZXMsIHNwcmludGYoIiVzOiVkOiVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElQdjRfaW50MmFkZHIoaXApLCB0c3RhbXAsIHVzZXIpKTsKKyAgICB9CisKKyAgICB3cml0ZV9maWxlKCAiL3NlY3VyZS9TSVRFQkFOSVNIIiwgCisgICAgICAgIGltcGxvZGUoIHNvcnRfYXJyYXkgKG1faW5kaWNlcyhsaW5lcyksICMnPCksICJcbiIgKSwgMSk7Cit9CisKK2ludCBUQmFuaXNoTmFtZShzdHJpbmcgbmFtZSwgaW50IGRheXMpCit7CisgIGludCB0OworCisgIGlmICggKGdldHVpZChUSSkgIT0gbmFtZSkgJiYKKyAgICAgICAhSXNEZXB1dHkoIGNhbGxfc2VmdW4oInNlY3VyZV9ldWlkIikgKSApCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKGRheXMgJiYgUXVlcnlUQmFuaXNoZWQobmFtZSkpeworICAgIHdyaXRlKCJEZXIgTmFtZSBpc3Qgc2Nob24gZ2ViYW5udC5cbiIpOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKGZpbGVfc2l6ZShTQVZFUEFUSCtuYW1lWzAuLjBdKyIvIituYW1lKyIubyIpPD0wKXsKKyAgICB3cml0ZSgiRXMgZXhpc3RpZXJ0IGtlaW4gU3BpZWxlciBkaWVzZXMgTmFtZW5zIVxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoIWRheXMgJiYgbWVtYmVyKHRiYW5pc2hlZCwgbmFtZSkpCisgICAgbV9kZWxldGUodGJhbmlzaGVkLCBuYW1lKTsKKyAgZWxzZSB7CisgICAgaWYgKCFtYXBwaW5ncCh0YmFuaXNoZWQpKQorICAgICAgdGJhbmlzaGVkID0gKFtdKTsKKyAgICBpZiAoZGF5cyA8PSAtMSkKKyAgICAgIHQgPSAtMTsKKyAgICBlbHNlCisgICAgICB0ID0gKHRpbWUoKS84NjQwMCkqODY0MDAgKyBkYXlzKjg2NDAwOworICAgIHRiYW5pc2hlZCArPSAoWyBuYW1lIDogdCBdKTsKKyAgfQorCisgIFVwZGF0ZVRCYW5pc2goKTsKKyAgcmV0dXJuIDE7Cit9CisKKworbWl4ZWQgUXVlcnlTQmFuaXNoZWQoIHN0cmluZyBpcCApCit7CisgICAgaW50IHNhdmVfbWUsIHNpdGU7CisgICAgc3RyaW5nIGJhbmlzaGVkX21lbGR1bmcgPQorICAgICAgIlxuU29ycnksIHZvbiBEZWluZXIgQWRyZXNzZSBrYW1lbiBlaW4gcGFhciBJZGlvdGVuLCBkaWUgIgorICAgICAgICAgICAgImF1c3NjaGxpZXNzbGljaFxuQWVyZ2VyIG1hY2hlbiB3b2xsdGVuLiBEZXNoYWxiIGhhYmVuIHdpciAiCisgICAgICAgICAgICAiZGllIE1vZWdsaWNoa2VpdCxcbmVpbmZhY2ggbmV1ZSBDaGFyYWt0ZXJlICIKKyAgICAgICAgICAgICJhbnp1bGVnZW4sIGt1cnp6ZWl0aWcgZnVlciBkaWVzZSBBZHJlc3NlIGdlc3BlcnJ0LlxuXG4iCisgICAgICAgICAgICAiRmFsbHMgRHUgYmVpIHVucyBzcGllbGVuIG1vZWNodGVzdCwgc2NoaWNrZSBiaXR0ZSBlaW5lIEVtYWlsICIKKyAgICAgICAgICAgICJhblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgbXVkQG1nLm11ZC5kZVxuXG4iCisgICAgICAgICAgICAibWl0IGRlciBCaXR0ZSwgZWluZW4gQ2hhcmFrdGVyIGZ1ZXIgRGljaCBhbnp1bGVnZW4uXG4iIDsKKworICAgIGlmICggIWlwIHx8ICFzdHJpbmdwKGlwKSB8fCAhbWFwcGluZ3Aoc2JhbmlzaGVkKSB8fCAhc2l6ZW9mKHNiYW5pc2hlZCkgKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGZvcmVhY2goc2l0ZSwgaW50IHRzdGFtcDogc2JhbmlzaGVkKSB7CisgICAgICAgIGlmICggdHN0YW1wID4gMCAmJiB0c3RhbXAgPCB0aW1lKCkgKSB7CisgICAgICAgICAgICBtX2RlbGV0ZSggc2JhbmlzaGVkLCBzaXRlICk7CisgICAgICAgICAgICBzYXZlX21lPTE7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHNhdmVfbWUpCisgICAgICAgIFVwZGF0ZVNCYW5pc2goKTsKKworICAgIGlmICggIXNpemVvZihzYmFuaXNoZWQpICkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzaXRlID0gSVB2NF9hZGRyMmludChpcCk7CisgICAgaWYgKCFzaXRlKQorICAgICAgICByZXR1cm4gMDsKKyAgICAvLyBkaXJla3QgZHJpbj8KKyAgICBpZiAobWVtYmVyKHNiYW5pc2hlZCwgc2l0ZSkpCisgICAgICAgIHJldHVybiBiYW5pc2hlZF9tZWxkdW5nOworICAgIC8vIG9kZXIgTmV0eiBkaWVzZXIgSVAgZ2VzcGVycnQ/CisgICAgZm9yZWFjaChpbnQgbG9ja2VkX3NpdGUgOiBzYmFuaXNoZWQpIHsKKyAgICAgICAgaWYgKChsb2NrZWRfc2l0ZSAmIHNpdGUpID09IGxvY2tlZF9zaXRlKQorICAgICAgICAgICAgcmV0dXJuIGJhbmlzaGVkX21lbGR1bmc7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKworcHJpdmF0ZSBpbnQgX3NiYW5pc2hlZF9ieSggaW50IGtleSwgc3RyaW5nIG5hbWUgKQoreworICAgIHJldHVybiBzYmFuaXNoZWRba2V5LCAxXSA9PSBuYW1lOworfQorCisKK21peGVkIFNpdGVCYW5pc2goIHN0cmluZyBpcCwgaW50IGRheXMgKQoreworICAgIHN0cmluZyAqcywgdG1wLCBldWlkOworICAgIGludCB0LCBsZXZlbDsKKworICAgIGV1aWQgPSBjYWxsX3NlZnVuKCJzZWN1cmVfZXVpZCIpOworICAgIGxldmVsID0gY2FsbF9zZWZ1bigic2VjdXJlX2xldmVsIik7CisKKyAgICAvLyBVbnRlciBMMjYgZ2lidCdzIGdhciBuaXguCisgICAgaWYgKCBsZXZlbCA8PSBET01BSU5NRU1CRVJfTFZMICkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLy8gRGllIExpc3RlIGRlciBnZXNwZXJydGVuIElQcyBhbnNjaGF1ZW4gZGFyZiBqZWRlciBhYiBMMjYuCisgICAgaWYgKCAhaXAgJiYgIWRheXMgKQorICAgICAgICByZXR1cm4gY29weShzYmFuaXNoZWQpOworCisKKyAgICBpZiAoICFzdHJpbmdwKGlwKSB8fCAhaW50cChkYXlzKSApCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCBkYXlzICYmIFF1ZXJ5U0JhbmlzaGVkKGlwKSApeworICAgICAgICB3cml0ZSggIkRpZXNlIEFkcmVzc2UgaXN0IHNjaG9uIGdlYmFubnQuXG4iICk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICggIWRheXMgKSB7CisgICAgICAgIGludCBpbnRfaXAgPSBJUHY0X2FkZHIyaW50KGlwKTsKKworICAgICAgICBpZiggbWVtYmVyKHNiYW5pc2hlZCwgaW50X2lwKSApeworICAgICAgICAgICAgLy8gRnJlbWRlIFNpdGViYW5pc2hzIGR1ZXJmZW4gbnVyIERlcHV0aWVzIGxvZXNjaGVuLgorICAgICAgICAgICAgaWYgKCBzYmFuaXNoZWRbaW50X2lwLCAxXSAhPSBldWlkICYmICFJc0RlcHV0eShldWlkKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgICAgICBjYWxsX3NlZnVuKCJsb2dfZmlsZSIsICJBUkNIL1NCQU5JU0giLAorICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCAiJXM6ICVzIGhlYnQgZGllIFNwZXJydW5nIGRlciBBZHJlc3NlICVzIHZvbiAlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImF1Zi5cbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdGltZSh0aW1lKCkpLCBjYXBpdGFsaXplKGV1aWQpLCBpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShzYmFuaXNoZWRbaW50X2lwLCAxXSkgKSApOworCisgICAgICAgICAgICBtX2RlbGV0ZSggc2JhbmlzaGVkLCBpbnRfaXAgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8vIEFsbGVzLCB3YXMgbmljaHQgRGVwdXR5IGlzdCwgZGFyZiBudXIgZnVlciBlaW5lbiBUYWcgc2JhbmlzaGVuLgorICAgICAgICBpZiAoIGRheXMgIT0gMSAmJiAhSXNEZXB1dHkoZXVpZCkgKQorICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIC8vIE51ciBEZXB1dGllcyBkdWVyZmVuIG1laHIgYWxzIDEwIFNwZXJydW5nZW4gdm9ybmVobWVuLgorICAgICAgICBpZiAoIHNpemVvZihmaWx0ZXJfaW5kaWNlcyhzYmFuaXNoZWQsICMnX3NiYW5pc2hlZF9ieSwgZXVpZCkpID49IDEwCisgICAgICAgICAgICAgJiYgIUlzRGVwdXR5KGV1aWQpICkKKyAgICAgICAgICAgIHJldHVybiAtMjsKKworICAgICAgICBpbnQgaW50X2lwID0gSVB2NF9hZGRyMmludChpcCk7CisKKyAgICAgICAgaWYoIWludF9pcCkgeworICAgICAgICAgICAgd3JpdGUoICJVbmd1ZWx0aWdlIEFkcmVzc2UhXG4iICk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEwyNiBkdWVyZmVuIGV4YWt0IGVpbmUgSVAgc3BlcnJlbiwgUk1zIGdhbnplIENsYXNzIEMtU3VibmV0emUKKyAgICAgICAgLy8gdW5kIERlcHV0aWVzIGF1Y2ggQ2xhc3MgQi1TdWJuZXR6ZS4KKyAgICAgICAgaW50IG5zaXplPUlQdjRfbmV0X3NpemUoaXApOworICAgICAgICBpZiAoIG5zaXplID4gMSAmJiBsZXZlbCA8IExPUkRfTFZMCisgICAgICAgICAgICAgfHwgbnNpemUgPiAyNTUgJiYgIUlzRGVwdXR5KGV1aWQpICkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICBpZiAoICFtYXBwaW5ncChzYmFuaXNoZWQpICkKKyAgICAgICAgICAgIHNiYW5pc2hlZCA9IG1fYWxsb2NhdGUoMSwgMik7CisKKyAgICAgICAgaWYgKCBkYXlzIDwgMCApCisgICAgICAgICAgICB0ID0gLTE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHQgPSAodGltZSgpIC8gODY0MDApICogODY0MDAgKyBkYXlzICogODY0MDA7CisKKyAgICAgICAgbV9hZGQoc2JhbmlzaGVkLCBpbnRfaXAsIHQsIGV1aWQpOworCisgICAgICAgIGNhbGxfc2VmdW4oImxvZ19maWxlIiwgIkFSQ0gvU0JBTklTSCIsCisgICAgICAgICAgICAgICAgc3ByaW50ZiggIiVzOiAlcyBzcGVycnQgZGllIEFkcmVzc2UgJXMgJXMuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGN0aW1lKHRpbWUoKSksIGNhcGl0YWxpemUoZXVpZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF5cyA+IDAgPyAoZGF5cyA+IDEgPyAiZnVlciAiICsgZGF5cyArICIgVGFnZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJmdWVyIGVpbmVuIFRhZyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgOiAiYmlzIHp1bSBTdC4gTmltbWVybGVpbnN0YWciICkgKTsKKyAgICB9CisKKyAgICBVcGRhdGVTQmFuaXNoKCk7CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIENoZWNrRGVwdXR5UmlnaHRzKCkKK3sKKyAgICBvYmplY3Qgb2I7CisgICAgbWl4ZWQgKmdpbmZvOworCisgICAgLy8gTGVzZS0gdW5kIFNjaHJlaWJiZXJlY2h0aWd1bmdlbiBmdWVyIGRpZSBSdWJyaWsgJ3BvbGl6ZWknIHNldHplbgorICAgIGNhbGxfb3RoZXIoICIvc2VjdXJlL25ld3MiLCAiPz8/IiApOworICAgIG9iID0gZmluZF9vYmplY3QoInNlY3VyZS9uZXdzIik7CisgICAgZ2luZm8gPSAoKG1peGVkKW9iLT5HZXRHcm91cCgicG9saXplaSIpKVs1Li42XTsKKyAgICBvYi0+UmVtb3ZlQWxsb3dlZCggInBvbGl6ZWkiLCAwLCBnaW5mb1swXSwgZ2luZm9bMV0gKTsKKyAgICBvYi0+QWRkQWxsb3dlZCggInBvbGl6ZWkiLCAwLCBkZXB1dGllcywgZGVwdXRpZXMgKTsKKyAgICBMb2FkRGVwdXR5RmlsZUxpc3QoKTsKK30KKworaW50IFJlbG9hZERlcHV0eUZpbGUoKQoreworICAgIGRlcHV0aWVzID0gZWZ1bjo6ZXhwbG9kZSggcmVhZF9maWxlKCIvc2VjdXJlL0RFUFVUSUVTIikgfHwgIiIsICJcbiIgKTsKKyAgICBkZXB1dGllcyAtPSAoeyIifSk7CisgICAgZGVwdXRpZXMgPSBtYXAoIGRlcHV0aWVzLCAjJ2xvd2VyX2Nhc2UvKicqLyApOworICAgIGNhbGxfb3V0KCAiQ2hlY2tEZXB1dHlSaWdodHMiLCAyICk7CisgICAgcmV0dXJuKDEpOworfQorCisKK3N0YXRpYyBpbnQgY3JlYXRlX2hvbWUoc3RyaW5nIG93bmVyLCBpbnQgbGV2ZWwpCit7CisgIHN0cmluZyBkZWZfY2FzdGxlOworICBzdHJpbmcgZGVzdCwgY2FzdGxlLCB3aXphcmQ7CisgIG9iamVjdCBwbGF5ZXI7CisgIHN0cmluZyAqZG9tYWluczsKKyAgaW50IGk7CisKKyAgcGxheWVyID0gY2FsbF9zZWZ1bigiZmluZF9wbGF5ZXIiLG93bmVyKTsKKyAgaWYgKCFwbGF5ZXIpCisgICAgcmV0dXJuIC01OworICBkb21haW5zPWdldF9kb21haW5faG9tZXMob3duZXIpOworICBpZiAoIXNpemVvZihkb21haW5zKSAmJiBsZXZlbCA+PSBET01BSU5NRU1CRVJfTFZMKQorICB7CisgICAgdGVsbF9vYmplY3QocGxheWVyLCJEdSBnZWhvZXJzdCBub2NoIGtlaW5lciBSZWdpb24gYW4gIVxuIik7CisgICAgcmV0dXJuIC02OworICB9CisgIHRlbGxfb2JqZWN0KHBsYXllciwiRHUgYmlzdCBNaXRhcmJlaXRlciBkZXIgZm9sZ2VuZGVuIFJlZ2lvbmVuOlxuIik7CisgIGZvciAoaT0wO2k8c2l6ZW9mKGRvbWFpbnMpO2krKykKKyAgeworICAgIGlmIChpKSB0ZWxsX29iamVjdChwbGF5ZXIsIiwgIik7CisgICAgdGVsbF9vYmplY3QocGxheWVyLGRvbWFpbnNbaV0pOworICB9CisgIHRlbGxfb2JqZWN0KHBsYXllciwiLlxuIik7CisgIHVwZGF0ZV93aXpfbGV2ZWwob3duZXIsIGxldmVsKTsKKyAgd2l6YXJkID0gIi9wbGF5ZXJzLyIgKyBvd25lcjsKKyAgY2FzdGxlID0gIi9wbGF5ZXJzLyIgKyBvd25lciArICIvd29ya3Jvb20uYyI7CisgIGlmIChmaWxlX3NpemUod2l6YXJkKSA9PSAtMSkgeworICAgIHRlbGxfb2JqZWN0KHBsYXllciwgIlZlcnplaWNobmlzICIgKyB3aXphcmQgKyAiIGFuZ2VsZWd0XG4iKTsKKyAgICBta2Rpcih3aXphcmQpOworICB9CisgIGRlc3QgPSBvYmplY3RfbmFtZShlbnZpcm9ubWVudChwbGF5ZXIpKTsKKyAgZGVmX2Nhc3RsZSA9IHJlYWRfZmlsZSgiL3N0ZC9kZWZfd29ya3Jvb20uYyIpOworICBpZiAoZmlsZV9zaXplKGNhc3RsZSkgPiAwKSB7CisgICAgdGVsbF9vYmplY3QocGxheWVyLCAiRHUgSEFUVEVTVCBqYSBzY2hvbiBlaW4gQXJiZWl0c3ppbW1lciAhXG4iKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAod3JpdGVfZmlsZShjYXN0bGUsIGRlZl9jYXN0bGUpKQorICAgIHsKKyAgICAgIHRlbGxfb2JqZWN0KHBsYXllciwgIkFyYmVpdHN6aW1tZXIgIiArIGNhc3RsZSArICIgZXJ6ZXVndC5cbiIpOworICAgICAgLy8gQXJiZWl0c3ppbW1lciBhbHMgSG9tZSBzZXR6ZW4KKyAgICAgIHBsYXllci0+U2V0UHJvcChQX1NUQVJUX0hPTUUsY2FzdGxlWzAuLjwzXSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHRlbGxfb2JqZWN0KHBsYXllciwgIkFyYmVpdHN6aW1tZXIga29ubnRlIG5pY2h0IGVyemV1Z3Qgd2VyZGVuICFcbiIpOworICB9CisgIHJldHVybiAxOworfQorCisvLyBTZW5kZXQgZGVtIGJlZm9lcmRlcnRlbiBNYWdpZXIgZWluZSBIaWxmZW1haWwgenUuCitwcm90ZWN0ZWQgdm9pZCBTZW5kV2l6YXJkSGVscE1haWwoc3RyaW5nIG5hbWUsIGludCBsZXZlbCkgeworICAKKyAgb2JqZWN0IHBsPWNhbGxfc2VmdW4oImZpbmRfcGxheWVyIixuYW1lKTsKKyAgaWYgKCFvYmplY3RwKHBsKSkgcmV0dXJuOworCisgIHN0cmluZyBmaWxlPXNwcmludGYoIiVzaW5mb19tbCVkIiwgV0laX0hFTFBfTUFJTF9ESVIsIGxldmVsKTsKKyAgLy8gd2VubiBrZWluIEhpbGZldGV4dCBmdWVyIGRlbiBMZXZlbCBkYSBpc3Q6IHJhdXMKKyAgaWYgKGZpbGVfc2l6ZShmaWxlKSA8PSAwKQorICAgIHJldHVybjsKKworICBzdHJpbmcgc3ViamVjdCA9IHJlYWRfZmlsZShmaWxlLDEsMSk7CisgIHN0cmluZyB0ZXh0ID0gY2FsbF9zZWZ1bigicmVwbGFjZV9wZXJzb25hbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9maWxlKGZpbGUsMiksICh7cGx9KSk7CisKKyAgbWl4ZWQgbWFpbCA9ICh7Ik1lcmxpbiIsICI8TWFzdGVyPiIsIG5hbWUsIDAsIDAsIHN1YmplY3QsCisgICAgICAgICAgICAgICAgIGNhbGxfc2VmdW4oImR0aW1lIix0aW1lKCkpLAorICAgICAgICAgICAgICAgICBNVUROQU1FK3RpbWUoKSwgdGV4dCB9KTsKKyAgTUFJTERFTU9OLT5EZWxpdmVyTWFpbChtYWlsLCAwKTsKK30KKworaW50IGFsbG93ZWRfYWR2YW5jZV93aXpsZXZlbChtaXhlZCBvYikKK3sKKyAgc3RyaW5nIHdoYXQ7CisKKyAgaWYgKG9iamVjdHAob2IpICYmIGdldGV1aWQob2IpPT1ST09USUQpIHJldHVybiAxOworCisgIGlmICghc3RyaW5ncChvYikpCisgICAgd2hhdD1lZnVuOjpleHBsb2RlKG9iamVjdF9uYW1lKG9iKSwiIyIpWzBdOworICBlbHNlCisgICAgd2hhdD1vYjsKKworICBpZiAod2hhdD09Ii9zZWN1cmUvbWVybGluIikgcmV0dXJuIDE7CisKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBhZHZhbmNlX3dpemxldmVsKHN0cmluZyBuYW1lLCBpbnQgbGV2ZWwpCit7CisgIGludCBhbnN3ZXI7CisgIG1peGVkICp1c2VyOworCisgIGlmICghYWxsb3dlZF9hZHZhbmNlX3dpemxldmVsKFBPKSkKKyAgICByZXR1cm4gLTE7CisKKyAgaWYgKGxldmVsPjgwKSByZXR1cm4gLTI7CisKKyAgaWYgKCFmaW5kX3VzZXJpbmZvKG5hbWUpKSByZXR1cm4gLTM7CisKKyAgdXNlcj1nZXRfZnVsbF91c2VyaW5mbyhuYW1lKTsKKworICBpZiAodXNlcltVU0VSX0xFVkVMKzFdPmxldmVsKSByZXR1cm4gLTQ7CisKKyAgaWYgKHVzZXJbVVNFUl9MRVZFTCsxXT09bGV2ZWwpIHJldHVybiAxOworCisgIGlmIChsZXZlbD49MTAgJiYgbGV2ZWw8MjApCisgIHsKKyAgICB1cGRhdGVfd2l6X2xldmVsKG5hbWUsIGxldmVsKTsKKyAgICBTZW5kV2l6YXJkSGVscE1haWwobmFtZSwgbGV2ZWwpOworICAgIHJldHVybiAxOworICB9CisgIGlmIChsZXZlbD49MjAgJiYgdXNlcltVU0VSX0xFVkVMKzFdPDIxKQorICB7CisgICAgYW5zd2VyID0gY3JlYXRlX2hvbWUobmFtZSwgbGV2ZWwpOworICAgIGlmICggYW5zd2VyID4gMCApIHsKKyAgICAgIGFuc3dlciA9IHVwZGF0ZV93aXpfbGV2ZWwobmFtZSwgbGV2ZWwpOworICAgICAgU2VuZFdpemFyZEhlbHBNYWlsKG5hbWUsIGxldmVsKTsKKyAgICB9CisgICAgcmV0dXJuIGFuc3dlcjsKKyAgfQorCisgIHVwZGF0ZV93aXpfbGV2ZWwobmFtZSwgbGV2ZWwpOworICBTZW5kV2l6YXJkSGVscE1haWwobmFtZSwgbGV2ZWwpOworCisgIHJldHVybiAxOworfQorCit2b2lkIHJlc3RhcnRfaGVhcnRfYmVhdChvYmplY3QgaGVhcnRfYmVhdCkKK3sKKyAgaWYgKGhlYXJ0X2JlYXQpIGhlYXJ0X2JlYXQtPl9yZXN0YXJ0X2JlYXQoKTsKK30KKworaW50IHJlbmV3X3BsYXllcl9vYmplY3QobWl4ZWQgd2hvKQoreworICBvYmplY3QgbmV3b2I7CisgIG9iamVjdCAqb2JzLCAqb2JzMjsKKyAgbWl4ZWQgZXJyOworICBzdHJpbmcgb2JfbmFtZTsKKyAgb2JqZWN0ICphcm1vdXJzLCB3ZWFwb247CisgIG9iamVjdCB0cDsKKyAgaW50IGksYWN0aXZlLGo7CisKKyAgaWYgKHN0cmluZ3Aod2hvKSkKKyAgeworICAgIHdobz1jYWxsX3NlZnVuKCJmaW5kX3BsYXllciIsd2hvKTsKKyAgICBpZiAoIXdobykKKyAgICB7CisgICAgICB3aG89Y2FsbF9zZWZ1bigiZmluZF9uZXRkZWFkIix3aG8pOworICAgICAgaWYgKCF3aG8pCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKyAgaWYgKCFvYmplY3RwKHdobykpCisgICAgcmV0dXJuIC0yOworICBpZiAoIW9iamVjdF9pbmZvKHdobywgT0lfT05DRV9JTlRFUkFDVElWRSkpCisgICAgcmV0dXJuIC0zOworICBpZiAod2hvLT5RdWVyeUd1ZXN0KCkpCisgIHsKKyAgICBwcmludGYoIkNhbid0IHJlbmV3IGd1ZXN0cyFcbiIpOworICAgIHJldHVybiAtNjsKKyAgfQorICBhY3RpdmU9aW50ZXJhY3RpdmUod2hvKTsKKyAgcHJpbnRmKCJPSywgcmVuZXdpbmcgJU9cbiIsd2hvKTsKKyAgc2V0ZXVpZChnZXRldWlkKHdobykpOworICBlcnI9Y2F0Y2gobmV3b2I9Y2xvbmVfb2JqZWN0KHF1ZXJ5X3BsYXllcl9vYmplY3QoZ2V0dWlkKHdobykpKTsgcHVibGlzaCk7CisgIHNldGV1aWQoZ2V0dWlkKFRPKSk7CisgIGlmIChlcnIpCisgIHsKKyAgICBwcmludGYoIiVPXG4iLGVycik7CisgICAgcmV0dXJuIC00OworICB9CisgIGlmICghbmV3b2IpCisgICAgcmV0dXJuIC01OworICAvKiBPaywgdGhlIG9iamVjdCBpcyBoZXJlIG5vdyAuLi4gbGV0cyBnbyBmb3IgaXQgLi4uICovCisgIHdoby0+c2F2ZV9tZSgwKTsKKyAgLyogU1NMIGlwIHdlaXRlcnJlaWNoZW4gKi8KKyAgaWYoIGNhbGxfc2VmdW4oInF1ZXJ5X2lwX251bWJlciIsIHdobykgIT0gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyh3aG8sSUlfSVBfTlVNQkVSKSApCisgIHsKKyAgICBuZXdvYi0+c2V0X3JlYWxpcCggY2FsbF9zZWZ1bigicXVlcnlfaXBfbnVtYmVyIix3aG8pICk7CisgIH0KKyAgZWZ1bjo6Y29uZmlndXJlX29iamVjdChwcmV2aW91c19vYmplY3QoKSwgT0NfQ09NTUFORFNfRU5BQkxFRCwgMCk7CisgIGVmdW46OnNldF90aGlzX3BsYXllcigwKTsKKyAgYXJtb3Vycz0ob2JqZWN0ICopd2hvLT5RdWVyeVByb3AoUF9BUk1PVVJTKTsKKyAgd2VhcG9uPShvYmplY3Qpd2hvLT5RdWVyeVByb3AoUF9XRUFQT04pOworCisgIGlmICggcHJldmlvdXNfb2JqZWN0KCkgJiYgb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpID09ICIvc2VjdXJlL21lcmxpbiIgKQorICAgICAgc2VuZF9jaGFubmVsX21zZygiRGVidWciLAorICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c19vYmplY3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZigiUkVORVdJTkc6ICVPICVPXG4iLG5ld29iLHdobykpOworICBlbHNlCisgICAgICBzZW5kX2NoYW5uZWxfbXNnKCJFbnR3aWNrbHVuZyIsCisgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzX29iamVjdCgpLAorICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCJSRU5FV0lORzogJU8gJU9cbiIsbmV3b2Isd2hvKSk7CisKKyAgb2JfbmFtZT1leHBsb2RlKG9iamVjdF9uYW1lKG5ld29iKSwiIyIpWzBdOworICBpZiAoc2l6ZW9mKG9iX25hbWUpPjExICYmIG9iX25hbWVbMC4uMTFdPT0iL3N0ZC9zaGVsbHMvIikKKyAgICBvYl9uYW1lPW9iX25hbWVbMTEuLl07CisgIG9iX25hbWU9b2JfbmFtZSsiOiIrZ2V0dWlkKChvYmplY3Qpd2hvKTsKKyAgaWYgKGFjdGl2ZSkKKyAgICBleGVjKG5ld29iLHdobyk7CisgIGlmIChhY3RpdmUgJiYgKGludGVyYWN0aXZlKHdobyl8fCFpbnRlcmFjdGl2ZShuZXdvYikpKQorICB7CisgICAgc2VuZF9jaGFubmVsX21zZygiRGVidWciLHByZXZpb3VzX29iamVjdCgpLAorICAgICAgICAgICAgICAgICAgICAgIkVSUk9SOiBzdGlsbCBhY3RpdmUgIVxuIik7CisgICAgbmV3b2ItPnJlbW92ZSgpOworICAgIHJldHVybiAwOworICB9CisvLyAgIG5ld29iLT5zdGFydF9wbGF5ZXIoY2FwaXRhbGl6ZShnZXR1aWQod2hvKSksd2hvLT5fcXVlcnlfbXlfaXAoKSk7CisgIGZ1bmNhbGwoCisgICAgICAgICAgYmluZF9sYW1iZGEoCisgICAgICAgICAgICAgICAgICAgICAgdW5ib3VuZF9sYW1iZGEoICh7J3gsICd5fSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7IydjYWxsX290aGVyLyonKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdGFydF9wbGF5ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3gsICd5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLCB3aG8KKyAgICAgICAgICAgICAgICAgICAgICApLAorICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHdobykpLCB3aG8tPl9xdWVyeV9teV9pcCgpICk7CisKKyAgbmV3b2ItPm1vdmUoZW52aXJvbm1lbnQod2hvKSxNX1RQT1JUfE1fTk9DSEVDS3xNX05PX1NIT1d8TV9TSUxFTlQKKyAgICAgICAgICAgICAgfE1fTk9fQVRUQUNLKTsKKyAgb2JzPWFsbF9pbnZlbnRvcnkod2hvKTsKKyAgZm9yZWFjaChvYmplY3QgdG9iOiBhbGxfaW52ZW50b3J5KHdobykpIHsKKyAgICBpZiAoIXRvYi0+UXVlcnlQcm9wKFBfQVVUT0xPQURPQkopKQorICAgIHsKKyAgICAgIC8vIGtlaW4gQXV0b2xvYWRlci4uLgorICAgICAgZm9yZWFjaChvYmplY3Qgb2I6IGRlZXBfaW52ZW50b3J5KHRvYikpCisgICAgICB7CisgICAgICAgIC8vIGFiZXIgZW50aGFsdGVuZSBBdXRvbG9hZGVyIGVudHNvcmdlbi4uLgorICAgICAgICBpZiAob2ItPlF1ZXJ5UHJvcChQX0FVVE9MT0FET0JKKSkKKyAgICAgICAgeworICAgICAgICAgIGNhdGNoKG9iLT5yZW1vdmUoKTtwdWJsaXNoKTsKKyAgICAgICAgICBpZiAob2IpIGRlc3RydWN0KG9iKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLy8gb2JqZWt0IG9obmUgZGllIEFMIGJld2VnZW4uCisgICAgICBjYXRjaCh0b2ItPm1vdmUobmV3b2IsTV9OT0NIRUNLKTtwdWJsaXNoKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAvLyBJbmhhbHQgdm9uIEF1dG9sb2FkZXJuIHJldHRlbi4KKyAgICAgIC8vIG5ldWUgaW5zdGFueiBkZXMgQUxzIGltIG5ldWVuIE9iamVrdC4KKyAgICAgIG9iamVjdCBuZXdfYWxfaW5zdGFuY2UgPSBwcmVzZW50X2Nsb25lKHRvYiwgbmV3b2IpOworICAgICAgZm9yZWFjaChvYmplY3Qgb2I6IGRlZXBfaW52ZW50b3J5KHRvYikpIHsKKyAgICAgICAgaWYgKG9iLT5RdWVyeVByb3AoUF9BVVRPTE9BRE9CSikpIHsKKyAgICAgICAgICAgIC8vIGF1dG9sb2FkZXIgaW4gQXV0b2xvYWRlcm4gemVyc3RvZXJlbi4uLgorICAgICAgICAgICAgY2F0Y2gob2ItPnJlbW92ZSgxKTtwdWJsaXNoKTsKKyAgICAgICAgICAgIGlmIChvYikgZGVzdHJ1Y3Qob2IpOworICAgICAgICB9CisgICAgICAgIC8vIGFsbGUgbmljaHQgYXV0b2xvYWRlciBpbiBkaWUgQUwtSW5zdGFueiBpbSBuZXVlbiBPYmpla3Qgb2RlcgorICAgICAgICAvLyBub3RmYWxscyBpbnMgSW52LgorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBpZiAob2JqZWN0cChuZXdfYWxfaW5zdGFuY2UpKQorICAgICAgICAgICAgY2F0Y2gob2ItPm1vdmUobmV3X2FsX2luc3RhbmNlLCBNX05PQ0hFQ0spO3B1Ymxpc2gpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNhdGNoKG9iLT5tb3ZlKG5ld29iLCBNX05PQ0hFQ0spO3B1Ymxpc2gpOworICAgICAgICB9CisgICAgICB9CisgICAgICAvLyBBdXRvbG9hZGVyIHplcnN0b2VyZW4uIFdpcmQgbmljaHQgdm9tIFNwaWVsZXJvYmpla3QgaW0gcmVtb3ZlKCkKKyAgICAgIC8vIGdlbWFjaHQsIHdlbm4gbmljaHQgTk9EUk9QLgorICAgICAgY2F0Y2godG9iLT5yZW1vdmUoMSk7cHVibGlzaCk7CisgICAgICBpZiAodG9iKSBkZXN0cnVjdCh0b2IpOworICAgIH0KKyAgfQorICB3aG8tPnJlbW92ZSgpOworICBpZiAoIG9iamVjdHAod2hvKSApCisgICAgICBkZXN0cnVjdCh3aG8pOworICByZW5hbWVfb2JqZWN0KG5ld29iLG9iX25hbWUpOworICBuZXdvYi0+X19yZWxvYWRfZXhwbG9yZSgpOworICB0cD10aGlzX3BsYXllcigpOworICBlZnVuOjpzZXRfdGhpc19wbGF5ZXIobmV3b2IpOworICBpZiAob2JqZWN0cCh3ZWFwb24pKQorICAgIHdlYXBvbi0+RG9XaWVsZCgpOworICBpZiAocG9pbnRlcnAoYXJtb3VycykpCisgICAgZm9yIChpPXNpemVvZihhcm1vdXJzKS0xO2k+PTA7aS0tKQorICAgICAgaWYgKG9iamVjdHAoYXJtb3Vyc1tpXSkpCisgICAgICAgIGFybW91cnNbaV0tPmRvX3dlYXIoImFsbGVzIik7CisgIGVmdW46OnNldF90aGlzX3BsYXllcih0cCk7CisgIC8vUnVlY2tnYWJld2VydCBub2V0aWcsIHdlaWwgRnVua3Rpb24gdm9tIFR5cCAnaW50JworICByZXR1cm4oMSk7Cit9CisKK21peGVkIF9fcXVlcnlfdmFyaWFibGUob2JqZWN0IG9iLCBzdHJpbmcgdmFyKQoreworICBpZiAoIVBPIHx8ICFJU19BUkNIKGdldGV1aWQoUE8pKSB8fCAhdGhpc19pbnRlcmFjdGl2ZSgpIHx8CisgICAgICAhSVNfQVJDSCh0aGlzX2ludGVyYWN0aXZlKCkpIHx8IGdldHVpZChvYik9PVJPT1RJRCApCisgIHsKKyAgICB3cml0ZSgiRHUgYmlzdCBrZWluIEVNIG9kZXIgR290dCFcbiIpOworICAgIHJldHVybiAwOworICB9CisgIGlmIChlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT05DRV9JTlRFUkFDVElWRSkgJiYgKFBPIT1vYikgJiYKKyAgICAgKHZhcj09Imhpc3RvcnkiIHx8IHZhcj09Imhpc3QyIikpCisgICAgIHNlbmRfY2hhbm5lbF9tc2coIlNub29wIiwgcHJldmlvdXNfb2JqZWN0KCksCisgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZigiJXMgLT4gJXMgKGhpc3RvcnkpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChQTykpLGNhcGl0YWxpemUoZ2V0dWlkKG9iKSkpKTsKKworICBjYWxsX3NlZnVuKCJsb2dfZmlsZSIsICJBUkNIL1FWIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZigiJXM6ICVPIGlucXVpcmVzIHZhciAlcyBpbiAlT1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdGltZSh0aW1lKCkpLHRoaXNfaW50ZXJhY3RpdmUoKSx2YXIsb2IpICk7CisgIG1peGVkIHJlcyA9IHZhcmlhYmxlX2xpc3Qob2IsIFJFVFVSTl9GVU5DVElPTl9OQU1FfFJFVFVSTl9GVU5DVElPTl9GTEFHU3wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVUVVJOX0ZVTkNUSU9OX1RZUEV8UkVUVVJOX1ZBUklBQkxFX1ZBTFVFKTsKKyAgaW50IGluZGV4ID0gbWVtYmVyKHJlcyx2YXIpOworICBpZiAoaW5kZXggPiAtMSkKKyAgeworICAgIHJldHVybiAoe3Jlc1tpbmRleF0scmVzW2luZGV4KzFdLHJlc1tpbmRleCsyXSxyZXNbaW5kZXgrM119KTsKKyAgfQorICByZXR1cm4gMDsKK30KKwordm9pZCBSZXN0YXJ0QmVhdHMoKQoreworICBpbnQgaSxzaXplLGNvdW50ZXI7CisgIG9iamVjdCBvYjsKKyAgbWl4ZWQgKmxpc3Q7CisgIHN0cmluZyBmaWxlLG9ibmFtZSxmdW47CisKKyAgIi9zZWN1cmUvc2ltdWxfZWZ1biItPlN0b3BDYWxsT3V0KDApOworICB3cml0ZSgiQ0FMTF9PVVQtUmVzdGFydCBpbiBwcm9ncmVzcyAhXG4iKTsKKyAgZmlsdGVyKHVzZXJzKCksIyd0ZWxsX29iamVjdCwiQ0FMTF9PVVQtUmVzdGFydCBpbiBwcm9ncmVzcyAhXG4iKTsKKyAgc2l6ZT1maWxlX3NpemUoImxvZy9jYWxsX291dF9zdG9wIik7CisgIGlmIChzaXplPD0wKQorICAgIHJldHVybjsKKyAgZmlsZT0iIjsKKyAgY291bnRlcj0wOworICB3aGlsZSAoY291bnRlcjxzaXplKQorICB7CisgICAgZmlsZSs9cmVhZF9ieXRlcygibG9nL2NhbGxfb3V0X3N0b3AiLGNvdW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAoc2l6ZS0oY291bnRlcis9NDAwMDApPjA/Y291bnRlcjpzaXplKSk7CisgIH0KKyAgbGlzdD1leHBsb2RlKGZpbGUsIl9fKENVVCBIRVJFKV9fXG4iKTsKKyAgbGlzdD1saXN0WzwxLi5dOworICBsaXN0PWV4cGxvZGUobGlzdFswXSwiXG4iKS0oeyIifSk7CisgIGZvciAoaT1zaXplb2YobGlzdCktMTtpPj0wO2ktLSkKKyAgICBpZiAoc3NjYW5mKGxpc3RbaV0sIiVzIFwiJXNcIiIsb2JuYW1lLGZ1bik9PTIgJiYgb2I9ZmluZF9vYmplY3Qob2JuYW1lKSkKKyAgICB7CisgICAgICB3cml0ZShzcHJpbnRmKCIlTyAtPiAlc1xuIixvYixmdW4pKTsKKyAgICAgIGNhdGNoKG9iLT5fX3Jlc3RhcnQoZnVuKTtwdWJsaXNoKTsKKyAgICB9CisgIHdyaXRlKCJDQUxMX09VVC1SZXN0YXJ0IGNvbXBsZXRlZCAhXG4iKTsKKyAgZmlsdGVyKHVzZXJzKCksIyd0ZWxsX29iamVjdCwiQ0FMTF9PVVQtUmVzdGFydCBjb21wbGV0ZWQgIVxuIik7CisgIHJlbmFtZSgibG9nL2NhbGxfb3V0X3N0b3AiLCJsb2cvY2FsbF9vdXRfc3RvcC5vbGQiKTsKK30KKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL21hc3Rlci9uZXR3b3JrLmMgYi9zZWN1cmUvbWFzdGVyL25ldHdvcmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjgxZjgyCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL21hc3Rlci9uZXR3b3JrLmMKQEAgLTAsMCArMSw0MzEgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBtYXN0ZXIvbmV0d29yay5jIC0gVURQLUhhbmRsaW5nCisvLworLy8gJElkOiBuZXR3b3JrLmMgODkzNCAyMDE0LTA5LTEwIDIxOjU3OjEyWiBaZXNzdHJhICQKKworI3ByYWdtYSBzdHJpY3RfdHlwZXMKKworI2luY2x1ZGUgIi9zZWN1cmUvbWFzdGVyLmgiCisjZGVmaW5lIEJCTUFTVEVSICIvc2VjdXJlL2JibWFzdGVyIgorCisvKgorI3VuZGVmIERFQlVHCisjZGVmaW5lIERFQlVHKHgpIGlmIChjYWxsX3NlZnVuKCJmaW5kX3BsYXllciIsInplc3N0cmEiKSkgXAorICAgICAgICAgICAgICAgICB0ZWxsX29iamVjdChjYWxsX3NlZnVuKCJmaW5kX3BsYXllciIsInplc3N0cmEiKSx4KTsKKyovCisKKy8vaWNoIHdpbGwgaGllcmF1cyBtb21lbnRhbiBrZWluIERlYnVnLCBpc3QgenV2aWVsLiBaZXNzdHJhCisKKyNpZmRlZiBERUJVRworI3VuZGVmIERFQlVHCisjZW5kaWYKKyNkZWZpbmUgREVCVUcoeCkKKworbm9zYXZlIGludCBtYWlsc19sYXN0X2hvdXI7CisKK3N0YXRpYyBzdHJpbmcgbWFpbF9ub3JtYWxpemUoIHN0cmluZyBzdHIgKQoreworICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgIltePF0qPCguKik+W14+XSoiLCAiXFwxIiwgMCk7CisgICAgcmV0dXJuIHJlZ3JlcGxhY2UoIHN0ciwgIiAqKFteIF1bXiBdKikuKiIsICJcXDEiLCAwKTsKK30KKworCitzdGF0aWMgc3RyaW5nICpta19yZWNfbGlzdCggc3RyaW5nIHN0ciApCit7CisgICAgcmV0dXJuIG1hcCggZXhwbG9kZSggbG93ZXJfY2FzZShzdHIpLCAiLCIgKSAtICh7IiJ9KSwKKyAgICAgICAgICAgICAgICAgICAgICAibWFpbF9ub3JtYWxpemUiLCB0aGlzX29iamVjdCgpICk7Cit9CisKKworc3RhdGljIGludCBDaGVja1Bhc3N3ZCggc3RyaW5nIG5hbWUsIHN0cmluZyBwYXNzd2QgKSB7CisgICAgbWl4ZWQgKnVpbmY7CisKKyAgICBpZiAoIXN0cmluZ3AocGFzc3dkKSB8fCAhc2l6ZW9mKHBhc3N3ZCkpCisgcmV0dXJuIDA7CisgICAgaWYgKCBzaXplb2YodWluZiA9IGdldF9mdWxsX3VzZXJpbmZvKG5hbWUpKSA8IDIgKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHN0cmluZyBwd2hhc2ggPSB1aW5mW1VTRVJfUEFTU1dPUkQrMV07CisgICAgaWYgKHNpemVvZihwd2hhc2gpID4gMTMpIHsKKyAvLyBNRDUtSGFzaAorIHBhc3N3ZCA9IG1kNV9jcnlwdChwYXNzd2QsIHB3aGFzaCk7CisgICAgfQorICAgIGVsc2UgaWYgKHNpemVvZihwd2hhc2gpID4gMikgeworIC8vIENyeXB0LUhhc2gKKyBwYXNzd2QgPSBjcnlwdChwYXNzd2QsIHB3aGFzaFswLi4xXSk7CisgICAgfQorICAgIGVsc2UgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gKHBhc3N3ZCA9PSBwd2hhc2gpOworfQorCisKK3N0YXRpYyB2b2lkIEZ0cEFjY2Vzcyggc3RyaW5nIGhvc3QsIHN0cmluZyBtZXNzYWdlLCBpbnQgcG9ydCApCit7CisgICAgc3RyaW5nICpjb21wLCByZXBseSwgaGVhZDsKKyNpZiBfX0VGVU5fREVGSU5FRF9fKHNlbmRfdWRwKQorICAgIGNvbXAgPSBlZnVuOjpleHBsb2RlKCBtZXNzYWdlLCAiXHQiICk7CisjZGVmaW5lIEZUUF9JRCAgIDAKKyNkZWZpbmUgRlRQX1NFUSAgMQorI2RlZmluZSBGVFBfVEFHICAyCisjZGVmaW5lIEZUUF9DTUQgIDMKKyNkZWZpbmUgRlRQX0FSRzEgNAorI2RlZmluZSBGVFBfQVJHMiA1CisjZGVmaW5lIEZUUF9BUkczIDYKKworICBpZiAoIHNpemVvZihjb21wKSA8PSBGVFBfQ01EIHx8IGxvd2VyX2Nhc2UoY29tcFtGVFBfVEFHXSkgIT0gInJlcSIgKXsKKyAgICAgIGxvZ19maWxlKCAiSU1QX01TR1MiLCAiSG9zdDogIiArIGhvc3QgKyAiOiIgKyBwb3J0ICsgIiAtICciICsKKyAgICAgICAgICAgICAgICBtZXNzYWdlICsgIidcbiIgKTsKKyAgICAgIHJldHVybjsKKyAgfQorCisgIHJlcGx5ID0gIklOVkFMSUQiOworCisgIGhlYWQgPSBzcHJpbnRmKCAiJXNcdCVzXHRSUExZXHQlc1x0IiwKKyAgICAgICAgICAgICAgICAgIGNvbXBbRlRQX0lEXSwgY29tcFtGVFBfU0VRXSwgY29tcFtGVFBfQ01EXSApOworCisgIHN3aXRjaCAoIGxvd2VyX2Nhc2UoY29tcFtGVFBfQ01EXSkgKXsKKyAgY2FzZSAidXNlciI6CisgICAgICBpZiAoIHNpemVvZihjb21wKSA8PSBGVFBfQVJHMSApCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgIGlmICggSVNfTEVBUk5FUihsb3dlcl9jYXNlKGNvbXBbRlRQX0FSRzFdKSkgKQorICAgICAgICAgIHJlcGx5ID0gIi9wbGF5ZXJzLyIgKyBsb3dlcl9jYXNlKGNvbXBbRlRQX0FSRzFdKTsKKyAgICAgIGVsc2UKKyAgICAgICAgICByZXBseSA9ICJOT05FIjsKKyAgICAgIGJyZWFrOworCisgIGNhc2UgInBhc3MiOgorICAgICAgaWYgKCBzaXplb2YoY29tcCkgPD0gRlRQX0FSRzIgKQorICAgICAgICAgIGJyZWFrOworCisgICAgICBjb21wW0ZUUF9BUkcxXSA9IGxvd2VyX2Nhc2UoY29tcFtGVFBfQVJHMV0pOworCisgICAgICBpZiAoIElTX0xFQVJORVIoY29tcFtGVFBfQVJHMV0pICYmCisgICAgICAgICAgICEiL3NlY3VyZS9tYXN0ZXIiLT5RdWVyeVRCYW5pc2hlZChjb21wW0ZUUF9BUkcxXSkgKXsKKyAgICAgICAgICBpZiAoIENoZWNrUGFzc3dkKCBjb21wW0ZUUF9BUkcxXSwgY29tcFtGVFBfQVJHMl0gKSApCisgICAgICAgICAgICAgIHJlcGx5ID0gIk9LIjsKKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgaWYgKCBnZXRfd2l6X2xldmVsKCBjb21wW0ZUUF9BUkcxXSApIDwgQVJDSF9MVkwgKQorICAgICAgICAgICAgICAgICAgbG9nX2ZpbGUoICJMT0dJTkZBSUwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoICJQQVNTV09SRDogICAgICAoRlRQKSAgICAgJXMgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcFtGVFBfQVJHMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RpbWUodGltZSgpKSApICk7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIGxvZ19maWxlKCAiQVJDSC9MT0dJTkZBSUwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoICJQQVNTV09SRDogICAgICAoRlRQKSAgICAgJXMgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcFtGVFBfQVJHMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RpbWUodGltZSgpKSApICk7CisgICAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgICAgIHJlcGx5ID0gIkZBSUwiOworICAgICAgYnJlYWs7CisKKyAgY2FzZSAicmVhZCI6CitERUJVRygiLUZ0cEFjY2Vzcy0tLS1cbkhvc3Q6Iitob3N0KyJNZXNzYWdlOlxuIittZXNzYWdlKyJcbi0tLS0tLS0tLS0tLS0tXG4iKTsKKyAgICAgIGlmICggc2l6ZW9mKGNvbXApIDw9IEZUUF9BUkcyICkKKyAgICAgICAgICBicmVhazsKKworICAgICAgaWYgKCBjb21wW0ZUUF9BUkcyXVswXSA9PSAnLycgJiYKKyAgICAgICAgICAgdmFsaWRfcmVhZCggY29tcFtGVFBfQVJHMl0sIGxvd2VyX2Nhc2UoY29tcFtGVFBfQVJHMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAicmVhZF9maWxlIiwgMCApICl7CisKKyAgICAgICAgICBCQk1BU1RFUi0+ZnRwYmIoIGxvd2VyX2Nhc2UoY29tcFtGVFBfQVJHMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlYWQgIiArIGNvbXBbRlRQX0FSRzJdICsgIlxuIiApOworICAgICAgICAgIHJlcGx5ID0gIk9LIjsKKyAgICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgICAgcmVwbHkgPSAiRkFJTCI7CisgICAgICBicmVhazsKKworICBjYXNlICJ3cml0IjoKK0RFQlVHKCItRnRwQWNjZXNzLS0tLVxuSG9zdDoiK2hvc3QrIk1lc3NhZ2U6XG4iK21lc3NhZ2UrIlxuLS0tLS0tLS0tLS0tLS1cbiIpOworICAgICAgaWYgKCBzaXplb2YoY29tcCkgPD0gRlRQX0FSRzIgKQorICAgICAgICAgIGJyZWFrOworCisgICAgICBpZiAoIGNvbXBbRlRQX0FSRzJdWzBdID09ICcvJyAmJgorICAgICAgICAgICB2YWxpZF93cml0ZSggY29tcFtGVFBfQVJHMl0sIGxvd2VyX2Nhc2UoY29tcFtGVFBfQVJHMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAid3JpdGVfZmlsZSIsIDAgKSApeworCisgICAgICAgICAgQkJNQVNURVItPmZ0cGJiKCBsb3dlcl9jYXNlKGNvbXBbRlRQX0FSRzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSAiICsgY29tcFtGVFBfQVJHMl0gKyAiXG4iICk7CisgICAgICAgICAgcmVwbHkgPSAiT0siOworICAgICAgICAgIH0KKyAgICAgICBlbHNlCisgICAgICAgICAgcmVwbHkgPSAiRkFJTCI7CisgICAgICBicmVhazsKKworICBjYXNlICJsaXN0IjoKK0RFQlVHKCItRnRwQWNjZXNzLS0tLVxuSG9zdDoiK2hvc3QrIk1lc3NhZ2U6XG4iK21lc3NhZ2UrIlxuLS0tLS0tLS0tLS0tLS1cbiIpOworICAgICAgaWYgKCBzaXplb2YoY29tcCkgPD0gRlRQX0FSRzIgKQorICAgICAgICAgIGJyZWFrOworCisgICAgICBpZiAoIGNvbXBbRlRQX0FSRzJdWzBdID09ICcvJyAmJgorICAgICAgICAgICB2YWxpZF9yZWFkKCBjb21wW0ZUUF9BUkcyXSwgbG93ZXJfY2FzZShjb21wW0ZUUF9BUkcxXSksCisgICAgICAgICAgICAgICAgICAgICAgICJyZWFkX2ZpbGUiLCAwICkgKQorICAgICAgICAgIHJlcGx5ID0gIk9LIjsKKyAgICAgIGVsc2UKKyAgICAgICAgICByZXBseSA9ICJGQUlMIjsKKyAgICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CitERUJVRygiLUZ0cEFjY2Vzcy0tLS1cbkhvc3Q6Iitob3N0KyJNZXNzYWdlOlxuIittZXNzYWdlKyJcbi0tLS0tLS0tLS0tLS0tXG4iKTsKKyAgICAgIGxvZ19maWxlKCAiSU1QX01TR1MiLCAiSG9zdDogIiArIGhvc3QgKyAiOiIgKyBwb3J0ICsgIiAtICciICsKKyAgICAgICAgICAgICAgICBtZXNzYWdlICsgIidcbiIgKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgc2VuZF91ZHAoIGhvc3QsIHBvcnQsIGhlYWQrcmVwbHkgKTsKKyNlbmRpZgorfQorCisKK3N0YXRpYyBpbnQgZG9SZWFkTWFpbCggc3RyaW5nIGZpbGUgKQoreworICAgIHN0cmluZyBzdHIsICpsaW5lcywgKnBhcnRzLCAqdG1wOworICAgIG1peGVkICptZXNzYWdlOworICAgIGludCBpLCBqOworCisgICAgaWYgKCAoaSA9IGZpbGVfc2l6ZShmaWxlKSkgPiA1MDAwMCB8fCBpIDwgNSApeworICAgICAgICBybShmaWxlKTsKKyAgICAgICAgREVCVUcoICJNYWlsIHNpemUgaW52YWxpZFxuIiApOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKCAhKHN0ciA9IHJlYWRfYnl0ZXMoIGZpbGUsIDAsIDUwMDAwICkpICkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaWYgKCAhKGogPSBzaXplb2YobGluZXMgPSBleHBsb2RlKCBzdHIsICJcbiIgKSkpICkKKyAgICAgICAgcmV0dXJuIC0yOworCisgICAgaSA9IDA7CisKKyAgICB3aGlsZSAoIGkgPCBqICYmIGxpbmVzW2ldICE9ICIiICkKKyAgICAgICAgaSsrOworCisgICAgaWYgKCBpID09IGogKQorICAgICAgICByZXR1cm4gLTI7CisKKyBERUJVRyggc3ByaW50ZiggIkhhdmUgJWQgaGVhZGVybGluZXM6XG4iLCBpICkgKTsKKworICAgIG1lc3NhZ2U9IGFsbG9jYXRlKDkpOworICAgIG1lc3NhZ2VbTVNHX0NDXSA9ICh7fSk7CisgICAgbWVzc2FnZVtNU0dfQkNDXSA9ICh7fSk7CisgICAgbWVzc2FnZVtNU0dfQk9EWV0gPSBpbXBsb2RlKCBsaW5lc1tpLi5dLCAiXG4iICk7CisKKyAgICBmb3IgKCBqID0gMDsgaiA8IGk7IGorKyApeworICAgICAgICBwYXJ0cyA9IGV4cGxvZGUoIGxpbmVzW2pdLCAiOiIgKTsKKworICAgICAgICBpZiAoIHNpemVvZihwYXJ0cykgPiAxICl7CisgICAgICAgICAgICBzdHIgPSBsb3dlcl9jYXNlKHBhcnRzWzBdKTsKKyAgICAgICAgICAgIHBhcnRzWzBdID0gaW1wbG9kZSggcGFydHNbMS4uXSwgIjoiICk7CisKKyAgICAgICAgICAgIHN3aXRjaCAoc3RyKXsKKyAgICAgICAgICAgIGNhc2UgInN1YmplY3QiOgorICAgICAgICAgICAgICAgIG1lc3NhZ2VbTVNHX1NVQkpFQ1RdID0gcGFydHNbMF07CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgImZyb20iOgorICAgICAgICAgICAgICAgIERFQlVHKCAiRm91bmQgZnJvbVxuIiApOworICAgICAgICAgICAgICAgIERFQlVHKCBzcHJpbnRmKCAiUEFSVFNbMF09JXNcbiIsIHBhcnRzWzBdICkgKTsKKyAgICAgICAgICAgICAgICBtZXNzYWdlW01TR19GUk9NXSA9IG1haWxfbm9ybWFsaXplKHBhcnRzWzBdKTsKKyAgICAgICAgICAgICAgICBtZXNzYWdlW01TR19TRU5ERVJdID0gcGFydHNbMF07CisgICAgICAgICAgICAgICAgREVCVUcoIHNwcmludGYoICJGUk9NOiAlc1xuU0VOREVSOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVtNU0dfRlJPTV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VbTVNHX1NFTkRFUl0gKSApOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICJjYyI6CisgICAgICAgICAgICAgICAgREVCVUcoIHNwcmludGYoIkZPVU5EIENDOiAlT1xuIiwgcGFydHNbMF0pICk7CisgICAgICAgICAgICAgICAgbWVzc2FnZVtNU0dfQ0NdICs9IG1rX3JlY19saXN0KHBhcnRzWzBdKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAiYmNjIjoKKyAgICAgICAgICAgICAgICBERUJVRyggc3ByaW50ZigiRk9VTkQgQkNDOiAlT1xuIiwgcGFydHNbMF0pICk7CisgICAgICAgICAgICAgICAgbWVzc2FnZVtNU0dfQkNDXSArPSBta19yZWNfbGlzdChwYXJ0c1swXSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgInRvIjoKKyAgICAgICAgICAgICAgICBERUJVRyggc3ByaW50ZigiRk9VTkQgVE86ICVPXG4iLCBwYXJ0c1swXSkgKTsKKyAgICAgICAgICAgICAgICB0bXAgPSBta19yZWNfbGlzdChwYXJ0c1swXSk7CisKKyAgICAgICAgICAgICAgICBpZiAoICFtZXNzYWdlW01TR19SRUNJUElFTlRdICkKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVtNU0dfUkVDSVBJRU5UXSA9IHRtcFswXTsKKworICAgICAgICAgICAgICAgIG1lc3NhZ2VbTVNHX0NDXSArPSB0bXA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8vIERhcyBNVUQtVE86IHdpcmQgdm9tIFBlcmxza3JpcHQgYWxzIGVyc3RlIEhlYWRlcnplaWxlIGVpbmdlZnVlZ3QKKyAgICAgICAgICAgIGNhc2UgIm11ZC10byI6CisgICAgICAgICAgICAgICAgREVCVUcoIHNwcmludGYoIkZPVU5EIE1VRC1UTzogJU9cbiIsIHBhcnRzWzBdKSApOworICAgICAgICAgICAgICAgIG1lc3NhZ2VbTVNHX1JFQ0lQSUVOVF0gPSBtYWlsX25vcm1hbGl6ZShsb3dlcl9jYXNlKHBhcnRzWzBdKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBFaWdlbnRsaWNoZW4gRW1wZmFlbmdlciBhdXMgQ0M6IGxvZXNjaGVuCisgICAgbWVzc2FnZVtNU0dfQ0NdIC09ICh7IG1lc3NhZ2VbTVNHX1JFQ0lQSUVOVF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VbTVNHX1JFQ0lQSUVOVF0rIkBtZy5tdWQuZGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlW01TR19SRUNJUElFTlRdKyJAbW9yZ2VuZ3JhdWVuLm11ZC5kZSIgfSk7CisKKworIERFQlVHKCBzcHJpbnRmKCAiVE86ICVPXG4iLCBtZXNzYWdlW01TR19SRUNJUElFTlRdICkgKTsKKyAgICBERUJVRyggc3ByaW50ZiggIkNDOiAlT1xuIiwgbWVzc2FnZVtNU0dfQ0NdICkgKTsKKyAgICBERUJVRyggc3ByaW50ZiggIkJDQzogJU9cbiIsIG1lc3NhZ2VbTVNHX0JDQ10gKSApOworCisgICAgaWYgKCAhc3RyaW5ncChtZXNzYWdlW01TR19GUk9NXSkgKQorICAgICAgICByZXR1cm4gLTI7CisKKyAgICBpZiAoICFzdHJpbmdwKG1lc3NhZ2VbTVNHX1JFQ0lQSUVOVF0pICl7CisgICAgICAgIHN0ciA9IGV4cGxvZGUoIGZpbGUsICIvIiApWzwxXTsKKyAgICAgICAgaSA9IDA7CisgICAgICAgIGogPSBzaXplb2Yoc3RyKTsKKworICAgICAgICB3aGlsZSAoIGkgPCBqICYmIHN0cltpXSA8PSAnOScgJiYgc3RyW2ldID49ICcwJyApCisgICAgICAgICAgICBpKys7CisKKyAgICAgICAgaWYgKCBpID49IGogKQorICAgICAgICAgICAgcmV0dXJuIC0yOworICAgICAgICAKKyAgICAgICAgbWVzc2FnZVtNU0dfUkVDSVBJRU5UXSA9IHN0cltpLi5dOworICBERUJVRyggc3ByaW50ZiggIkVNRVJHRU5DWSBSRUNJUElFTlQ9JXNcbiIsIHN0cltpLi5dICkgKTsKKyAgICB9CisKKyAgICBybShmaWxlKTsKKworICAgIC8vIERhIHZvbSBNYXN0ZXIgYmVzc2VyIG5pY2h0cyB2b24gYXVzc2VyaGFsYiAvc2VjdXJlICNpbmNsdWRlJ3Qgd2lyZCwKKyAgICAvLyBkaXJla3QgZGllICc1Jy4gTm9ybWFsZXJ3ZWlzZSBoaWVzc2UgZGVyIEF1ZnJ1ZjoKKyAgICAvLyBEZWxpdmVyTWFpbCggbWVzc2FnZSwgTk9fVVNFUl9BTElBU0VTfE5PX0NBUkJPTl9DT1BJRVMgKTsKKyAgICAiL3NlY3VyZS9tYWlsZXIiLT5EZWxpdmVyTWFpbCggbWVzc2FnZSwgNSApOworICAgIHJldHVybiAxOworfQorCisKK3B1YmxpYyB2b2lkIG1haWxyZWFkKCkKK3sKKyAgICBzdHJpbmcgKmZpbGVzOworICAgIGludCBpOworCisgICAgREVCVUcoICJtYWlscmVhZCBjYWxsZWRcbiIgKTsKKworICAgIGlmICggbWFpbHNfbGFzdF9ob3VyID49IE1BWF9NQUlMU19QRVJfSE9VUiApCisgICAgICAgIHJldHVybjsKKworICAgIGZpbGVzID0gKGdldF9kaXIoICIvbWFpbC9pbmJvdW5kLyoiICl8fCh7fSkpIC0gKHsgIi4uIiwgIi4iIH0pOworICAgIGkgPSBzaXplb2YoZmlsZXMpOworCisgICAgd2hpbGUgKCBpLS0gJiYgbWFpbHNfbGFzdF9ob3VyIDwgTUFYX01BSUxTX1BFUl9IT1VSICl7CisgICAgICAgIERFQlVHKCAiRk9VTkQgRklMRSBcIiIgKyBmaWxlc1tpXSArICJcIiAuLi5cbiIgKTsKKyAgICAgICAgbWFpbHNfbGFzdF9ob3VyKys7CisKKyAgICAgICAgaWYgKCBkb1JlYWRNYWlsKCAiL21haWwvaW5ib3VuZC8iICsgZmlsZXNbaV0pIDwgLTEgKXsKKyAgICAgICAgICAgIG1peGVkIG1lc3NhZ2U7CisKKyAgICAgICAgICAgIG1lc3NhZ2UgPSBhbGxvY2F0ZSg5KTsKKyAgICAgICAgICAgIG1haWxzX2xhc3RfaG91cisrOworICAgICAgICAgICAgcmVuYW1lKCAiL21haWwvaW5ib3VuZC8iICsgZmlsZXNbaV0sCisgICAgICAgICAgICAgICAgICAgICIvc2VjdXJlL0FSQ0gvTUFJTC8iICsgZmlsZXNbaV0gKTsKKyAgICAgICAgICAgIG1lc3NhZ2VbTVNHX1NFTkRFUl0gPSBnZXRldWlkKCk7CisgICAgICAgICAgICBtZXNzYWdlW01TR19GUk9NXSA9IGdldHVpZCgpOworICAgICAgICAgICAgbWVzc2FnZVtNU0dfU1VCSkVDVF0gPSAiRmVobGVyaGFmdGUgTWFpbDogL3NlY3VyZS9BUkNIL01BSUwvIiArCisgICAgICAgICAgICAgICAgZmlsZXNbaV07CisgICAgICAgICAgICBtZXNzYWdlW01TR19SRUNJUElFTlRdID0gIm11ZEBtZy5tdWQuZGUiOworICAgICAgICAgICAgbWVzc2FnZVtNU0dfQk9EWV0gPSAiQml0dGUgVWViZXJwcnVlZmVuIVxuIjsKKyAgICAgICAgICAgIC8vIE5PX1NZU1RFTV9BTElBU0VTfE5PX1VTRVJfQUxJQVNFUyA9PSAzCisgICAgICAgICAgICAiL3NlY3VyZS9tYWlsZXIiLT5EZWxpdmVyTWFpbCggbWVzc2FnZSwgMyApOworICAgICAgICB9CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkIHVkcF9xdWVyeSggc3RyaW5nIHF1ZXJ5LCBzdHJpbmcgaG9zdCwgaW50IHBvcnQgKQoreworI2lmIF9fRUZVTl9ERUZJTkVEX18oc2VuZF91ZHApCisgICAgc3RyaW5nICptZXNzOworICAgIG1peGVkICpkYXRhOworICAgIGludCBpLCBqOworCisgICAgbWVzcyA9IGV4cGxvZGUoIHF1ZXJ5LCAiICIgKTsKKyAgICAKKyAgICBzd2l0Y2ggKCBtZXNzWzFdICl7CisgICAgY2FzZSAid2hvbGlzdCI6CisgICAgY2FzZSAid2hvIjoKKyAgICAgICAgZGF0YSA9IChzdHJpbmcgKikiL29iai93ZXJsaXN0ZSItPlF1ZXJ5V2hvTGlzdGUoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlICJ1cHRpbWUiOgorICAgICAgICBkYXRhID0gKHsgY2FsbF9zZWZ1bigidXB0aW1lIikgfSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAiZmluZ2VyIjoKKyAgICAgICAgaWYgKCBzaXplb2YobWVzcykgPCAzICkKKyAgICAgICAgICAgIGRhdGEgPSAoeyAiRXJyb3I6IFdlbiBzb2xsIGljaCBmaW5nZXJuID8iIH0pOworICAgICAgICBlbHNlCisgICAgICAgICAgICBkYXRhID0gZXhwbG9kZSggKHN0cmluZykicC9kYWVtb24vZmluZ2VyIi0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluZ2VyX3NpbmdsZSggbG93ZXJfY2FzZShtZXNzWzJdKSwgMCApLCAiXG4iICk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAibWFpbHJlYWQiOgorICAgICAgICBkYXRhID0gKHsgIk9rYXkiIH0pOworICAgICAgICBtYWlscmVhZCgpOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIGRhdGEgPSAoeyAiRXJyb3I6IHVua25vd24gcmVxdWVzdCAiICsgbWVzc1sxXSArICJcbiIgfSk7CisgICAgfQorCisKKyAgICBzZW5kX3VkcCggaG9zdCwgcG9ydCwgc3ByaW50ZiggIiVzIDAgJWQiLCBtZXNzWzBdLCBzaXplb2YoZGF0YSkgKSApOworCisgICAgZm9yICggaSA9IDAsIGogPSBzaXplb2YoZGF0YSk7IGkgPCBqOyBpKysgKQorICAgICAgICBzZW5kX3VkcCggaG9zdCwgcG9ydCwgc3ByaW50ZiggIiVzICVkICVzIiwgbWVzc1swXSwgaSsxLCBkYXRhW2ldICkgKTsKKyNlbmRpZgorfQorCisjZGVmaW5lIFVEUF9ERUJVRyh4KSAKKy8vI2RlZmluZSBVRFBfREVCVUcoeCkgKHdyaXRlX2ZpbGUoIi9sb2cvQVJDSC91ZHAubG9nIiwoeCkpKQorCit2b2lkIHJlY2VpdmVfdWRwKHN0cmluZyBob3N0LCBzdHJpbmcgbWVzc2FnZSwgaW50IHBvcnQpCit7CisgIG1peGVkICp0bXA7CisgIFVEUF9ERUJVRyhzcHJpbnRmKCIlcyAlczolZDogJXNcbiIsc3RyZnRpbWUoKSxob3N0LHBvcnQsbWVzc2FnZSkpOworCisgIGlmIChtZXNzYWdlWzAuLjZdPT0iRVhUUkVROiIKKyAgCXx8IG1lc3NhZ2VbMC4uNV09PSJJUE5BTUUiCisgIAl8fCBtZXNzYWdlWzAuLjNdPT0iQVVUSCIKKyAgKSB7CQorICAgIHJldHVybjsKKyAgfQorCisgIGlmKCBtZXNzYWdlWzAuLjhdPT0iSVBMT09LVVBcbiIgKSB7CisgICAgIi9wL2RhZW1vbi9pcGxvb2t1cCItPnVwZGF0ZSggbWVzc2FnZSApOworICAgIHJldHVybjsKKyAgfQorCisgIGlmKCBtZXNzYWdlWzAuLjldPT0iRE5TTE9PS1VQXG4iICkgeworICAgICIvcC9kYWVtb24vZG5zbG9va3VwIi0+dXBkYXRlKCBtZXNzYWdlICk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKG1lc3NhZ2VbMC4uNF09PSJORlRQRCIpIHsKKyNpZiBfX0hPU1RfTkFNRV9fPT1NVURIT1NUCisgICAgaWYgKGhvc3QhPUZUUERfSVApIHsKKyAgICAgIERFQlVHKHNwcmludGYoIklOVkFMSUQgSE9TVDogJXNcbiIsaG9zdCkpOworICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorICAgIEZ0cEFjY2Vzcyhob3N0LG1lc3NhZ2UscG9ydCk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKG1lc3NhZ2VbMC4uOV09PSJ1ZHBfcXVlcnk6IikgeworICAgIHJldHVybiB1ZHBfcXVlcnkobWVzc2FnZVsxMC4uXSxob3N0LHBvcnQpOworICB9CisKKyAgInNlY3VyZS9pbmV0ZCItPl9yZWNlaXZlX3VkcChob3N0LCBtZXNzYWdlKTsKK30KKworCmRpZmYgLS1naXQgYS9zZWN1cmUvbWFzdGVyL3BsYXllcnNfZGVueS5jIGIvc2VjdXJlL21hc3Rlci9wbGF5ZXJzX2RlbnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDU3MDRjCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL21hc3Rlci9wbGF5ZXJzX2RlbnkuYwpAQCAtMCwwICsxLDE1MSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIG1hc3Rlci5jIC0tIG1hc3RlciBvYmplY3QKKy8vCisvLyAkSWQ6IG1hc3Rlci5jIDcwNDEgMjAwOC0xMC0xMyAxODoxODoyN1ogWmVzc3RyYSAkCisjcHJhZ21hIHN0cmljdF90eXBlcworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBub19zaGFkb3cKKyNwcmFnbWEgdmVyYm9zZV9lcnJvcnMKKyNwcmFnbWEgY29tYmluZV9zdHJpbmdzCisjcHJhZ21hIHBlZGFudGljCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIHdhcm5fZGVwcmVjYXRlZAorCisjZGVmaW5lIFdISVRFTElTVCAiL3NlY3VyZS9BUkNIL3BsYXllcnNfZGVueV93aGl0ZWxpc3QubyIKKyNkZWZpbmUgVEFSR0VUTElTVCAiL3NlY3VyZS9BUkNIL3BsYXllcnNfZGVueV90YXJnZXRzLm8iCisjZGVmaW5lIFdISVRFTElTVERVTVAgIi9zZWN1cmUvQVJDSC9wbGF5ZXJzX2Rlbnlfd2hpdGVsaXN0LmR1bXAiCisjZGVmaW5lIFRBUkdFVExJU1REVU1QICIvc2VjdXJlL0FSQ0gvcGxheWVyc19kZW55X3RhcmdldHMuZHVtcCIKKworLy8jZGVmaW5lIFBMREVOWV9MRUFSTk1PREUKKworI2luY2x1ZGUgIi9zZWN1cmUvd2l6bGV2ZWxzLmgiCisjaW5jbHVkZSAiL3NlY3VyZS9tYXN0ZXIuaCIKKworLyogRGllc2UgT2JqZWt0ZSBkdWVyZmVuIGF1cyAvcGxheWVycy8gaW5jbHVkaWVyZW4vZXJiZW4gKi8KK25vc2F2ZSBwcml2YXRlIG1hcHBpbmcgd2hpdGVsaXN0OworLyogRGllc2UgRGluZ2Ugd2VyZGVuIHZvbiBPYmpla3RuIGluIHdoaXRlbGlzdCBhdXMgL3BsYXllcnMvIGlua2x1ZGllcnQvZ2VlcmJ0LiAqLworbm9zYXZlIHByaXZhdGUgbWFwcGluZyB0YXJnZXRzOworCitwcml2YXRlIG1hcHBpbmcgUGFyc2VMaXN0KHN0cmluZyBsaXN0KSB7CisgIG1peGVkIGRhdGE7CisKKyAgaWYgKCFzdHJpbmdwKGxpc3QpKSByZXR1cm4gKFs6MCBdKTsKKyAgaWYgKCFzdHJpbmdwKGRhdGEgPSByZWFkX2ZpbGUobGlzdCkpKSByZXR1cm4gKFs6MCBdKTsKKyAgZGF0YSA9IGV4cGxvZGUoZGF0YSwgIlxuIikgfHwgKHt9KTsKKworICByZXR1cm4gbWttYXBwaW5nKGRhdGEpOworfQorCitwcml2YXRlIHZvaWQgUGFyc2VXaGl0ZUxpc3QoKSB7CisgIERFQlVHKCJQYXJzaW5nIFdoaXRlbGlzdFxuIik7CisgIHdoaXRlbGlzdD1QYXJzZUxpc3QoV0hJVEVMSVNURFVNUCk7Cit9Citwcml2YXRlIHZvaWQgUGFyc2VUYXJnZXRMaXN0KCkgeworICBERUJVRygiUGFyc2luZyBUYXJnZXRsaXN0XG4iKTsKKyAgdGFyZ2V0cz1QYXJzZUxpc3QoVEFSR0VUTElTVERVTVApOworfQorCitwcml2YXRlIHZvaWQgRHVtcExpc3QobWFwcGluZyBsaXN0LCBzdHJpbmcgZmlsZSkgeworICBpZiAoIXN0cmluZ3AoZmlsZSkgfHwgIW1hcHBpbmdwKGxpc3QpCisgICAgICB8fCAhc2l6ZW9mKGZpbGUpIHx8ICFzaXplb2YobGlzdCkpCisgICAgcmV0dXJuOworICAKKyAgd3JpdGVfZmlsZShmaWxlLCBpbXBsb2RlKG1faW5kaWNlcyhsaXN0KSwiXG4iKSwgMSk7Cit9CisKK3ByaXZhdGUgdm9pZCBEdW1wV2hpdGVMaXN0KCkgeworICBERUJVRygiRHVtcGluZyBXaGl0ZWxpc3RcbiIpOworICBEdW1wTGlzdCh3aGl0ZWxpc3QsIFdISVRFTElTVERVTVApOworfQorcHJpdmF0ZSB2b2lkIER1bXBUYXJnZXRMaXN0KCkgeworICBERUJVRygiRHVtcGluZyBUYXJnZXRsaXN0XG4iKTsKKyAgRHVtcExpc3QodGFyZ2V0cywgVEFSR0VUTElTVERVTVApOworfQorCitwdWJsaWMgdm9pZCBEdW1wUExEZW55TGlzdHMoKSB7CisgIGlmICggZXh0ZXJuX2NhbGwoKSAmJiBjYWxsX3NlZnVuKCJzZWN1cmVfbGV2ZWwiKSA8IEFSQ0hfTFZMICkKKyAgICByZXR1cm47CisgIERFQlVHKCJEdW1waW5nIFBMRGVueWxpc3RzXG4iKTsKKyAgbGltaXRlZCgjJ0R1bXBXaGl0ZUxpc3QpOworICBsaW1pdGVkKCMnRHVtcFRhcmdldExpc3QpOworfQorCitwdWJsaWMgdm9pZCBTYXZlUExEZW55TGlzdHMoKSB7CisgIGlmICggZXh0ZXJuX2NhbGwoKSAmJiBjYWxsX3NlZnVuKCJzZWN1cmVfbGV2ZWwiKSA8IEFSQ0hfTFZMICkKKyAgICByZXR1cm47CisgIERFQlVHKCJTYXZpbmcgUExEZW55TGlzdHNcbiIpOworICB3cml0ZV9maWxlKFdISVRFTElTVCwKKyAgICAgIHNhdmVfdmFsdWUod2hpdGVsaXN0KSwgMSk7CisgIHdyaXRlX2ZpbGUoVEFSR0VUTElTVCwKKyAgICAgIHNhdmVfdmFsdWUodGFyZ2V0cyksIDEpOworfQorCitwdWJsaWMgdm9pZCBMb2FkUExEZW55bGlzdHMoKSB7CisgIG1peGVkIHRtcDsKKworICBpZiAoIGV4dGVybl9jYWxsKCkgJiYgY2FsbF9zZWZ1bigic2VjdXJlX2xldmVsIikgPCBBUkNIX0xWTCApCisgICAgcmV0dXJuOworCisgIHdyaXRlKCJMb2FkaW5nIFBMRGVueWxpc3RzXG4iKTsKKworICBpZiAoc3RyaW5ncCh0bXA9cmVhZF9maWxlKFdISVRFTElTVCkpKSB7CisgICAgLy8gc2F2ZWZpbGUgZXhpc3RzCisgICAgd2hpdGVsaXN0ID0gcmVzdG9yZV92YWx1ZSh0bXApOworICB9CisgIGVsc2UgeworICAgICAgbGltaXRlZCgjJ1BhcnNlV2hpdGVMaXN0KTsKKyAgfQorICBpZiAoc3RyaW5ncCh0bXA9cmVhZF9maWxlKFRBUkdFVExJU1QpKSkgeworICAgIHRhcmdldHMgPSByZXN0b3JlX3ZhbHVlKHRtcCk7CisgIH0KKyAgZWxzZSB7CisgICAgICBsaW1pdGVkKCMnUGFyc2VUYXJnZXRMaXN0KTsKKyAgfQorfQorCittaXhlZCBpbmNsdWRlX2ZpbGUoc3RyaW5nIGZpbGUsIHN0cmluZyBjb21waWxlZF9maWxlLCBpbnQgc3lzX2luY2x1ZGUpIHsKKyAgCisgIGlmIChzeXNfaW5jbHVkZSkgcmV0dXJuIDA7CisgIC8vIExvZ2dlbiwgd2VubiBGaWxlcyBhdXNzZXJoYWxiIC9wbGF5ZXJzLyBLcmFtIGF1cyAvcGxheWVycy8KKyAgLy8gaW5rbHVkaWVyZW4vZXJiZW4uCisgIGlmIChzdHJzdHIoZmlsZSwgIi9wbGF5ZXJzLyIpID09IDAKKyAgICAgICYmIChzdHJzdHIoY29tcGlsZWRfZmlsZSwiL3BsYXllcnMvIikgPT0gLTEKKyAgICAgICYmICFtZW1iZXIod2hpdGVsaXN0LCBjb21waWxlZF9maWxlKSApKSB7CisjaWZkZWYgUExERU5ZX0xFQVJOTU9ERQorICAgIERFQlVHKCJpbmNsdWRlX2ZpbGUoKTogV2hpdGVsaXN0aW5nOiAiK2NvbXBpbGVkX2ZpbGUrIlxuIik7CisgICAgbV9hZGQod2hpdGVsaXN0LCBjb21waWxlZF9maWxlKTsKKyAgICBtX2FkZCh0YXJnZXRzLCBmaWxlKTsKKyAgICBjYWxsX3NlZnVuKCJsb2dfZmlsZSIsICJQTEFZRVJTV0hJVEVMSVNUIiwKKyAgICAgICAgc3ByaW50ZigiJXMgKGlua2x1ZGllcnQgJXMpXG4iLGNvbXBpbGVkX2ZpbGUsIGZpbGUpLAorICAgICAgICAxMDAwMDAwKTsKKyNlbHNlCisgICAgLy8gdmVyd2VpZ2Vybi4KKyAgICByZXR1cm4gLTE7CisjZW5kaWYKKyAgfQorICByZXR1cm4gMDsKK30KKworbWl4ZWQgaW5oZXJpdF9maWxlKHN0cmluZyBmaWxlLCBzdHJpbmcgY29tcGlsZWRfZmlsZSkgeworCisgIC8vIExvZ2dlbiwgd2VubiBGaWxlcyBhdXNzZXJoYWxiIC9wbGF5ZXJzLyBLcmFtIGF1cyAvcGxheWVycy8KKyAgLy8gaW5rbHVkaWVyZW4vZXJiZW4uCisgIGlmIChzdHJzdHIoZmlsZSwgIi9wbGF5ZXJzLyIpID09IDAKKyAgICAgICYmIChzdHJzdHIoY29tcGlsZWRfZmlsZSwiL3BsYXllcnMvIikgPT0gLTEKKyAgICAgICYmICFtZW1iZXIod2hpdGVsaXN0LCBjb21waWxlZF9maWxlKSApKSB7CisjaWZkZWYgUExERU5ZX0xFQVJOTU9ERQorICAgIERFQlVHKCJpbmNsdWRlX2ZpbGUoKTogV2hpdGVsaXN0aW5nOiAiK2NvbXBpbGVkX2ZpbGUrIlxuIik7CisgICAgbV9hZGQod2hpdGVsaXN0LCBjb21waWxlZF9maWxlKTsKKyAgICBtX2FkZCh0YXJnZXRzLCBmaWxlKTsKKyAgICBjYWxsX3NlZnVuKCJsb2dfZmlsZSIsICJQTEFZRVJTV0hJVEVMSVNUIiwgCisgICAgICAgIHNwcmludGYoIiVzIChlcmJ0ICVzKVxuIixjb21waWxlZF9maWxlLCBmaWxlKSwKKyAgICAgICAgMTAwMDAwMCk7CisjZWxzZQorICAgIC8vIHZlcndlaWdlcm4uCisgICAgcmV0dXJuIC0xOworI2VuZGlmCisgIH0KKyAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL3NlY3VyZS9tYXN0ZXIvdXNlcmluZm8uYyBiL3NlY3VyZS9tYXN0ZXIvdXNlcmluZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDhmNGZmCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL21hc3Rlci91c2VyaW5mby5jCkBAIC0wLDAgKzEsMTExOSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIG1hc3Rlci91c2VyaW5mby5jIC0tIENhY2hlIG1pdCBTcGllbGVyaW5mb3MKKy8vCisvLyAkSWQ6IHVzZXJpbmZvLmMgOTQ2NyAyMDE2LTAyLTE5IDE5OjQ4OjI0WiBaZXNzdHJhICQKKworI3ByYWdtYSBzdHJpY3RfdHlwZXMKKworI2luY2x1ZGUgIi9zZWN1cmUvbWFzdGVyLmgiCisjaW5jbHVkZSAiL3N5cy9maWxlcy5oIgorI2luY2x1ZGUgIi9zeXMvb2JqZWN0X2luZm8uaCIKKworLy8gTWFrcm8gYXVzIHdpemxldmVscy5oIGVyc2V0emVuLCBkYSBzZWN1cmVfbGV2ZWwgbmUgc2VmdW4gaXN0LiAqc2V1ZnoqCisjdW5kZWYgQVJDSF9TRUNVUklUWQorI2RlZmluZSBBUkNIX1NFQ1VSSVRZIChjYWxsX3NlZnVuKCJzZWN1cmVfbGV2ZWwiKSA+PSBBUkNIX0xWTCkKKworcHJpdmF0ZSBzdHJpbmcqICBFeHBhbmRVSURBbGlhcyhzdHJpbmcgYWxpYXMsIGludCByZWMpOworCitub3NhdmUgbWFwcGluZyB1c2VybGlzdDsKK3N0cmluZyBuYW1lLCBwYXNzd29yZDsKK3N0cmluZyBla3RpcHM7CitzdHJpbmcgZnB0aXBzOworaW50IGxldmVsOworc3RyaW5nIHNoZWxsOworaW50IGNyZWF0aW9uX2RhdGU7CitzdHJpbmcgZXAsIGVrLCBtcTsKK3N0cmluZyAqZG9tYWlucywqZ3VpbGRzLCAqdWlkc3RvdGFrZWNhcmU7Citub3NhdmUgc3RyaW5nKiBsYXRlcGxheWVyczsKKy8vIGhpZXIgd2lyZCBlaW4gTWFwcGluZyB2b24gVUlELXp1LU1hZ2llci1adW9yZG51bmdlbiBnZXNwZWljaGVydC4gQWxzIEtleXMKKy8vIHdlcmRlbiBVSURzIHZlcndlbmRldCwgZGVyIFZhbHVlIGlzdCBqZXdlaWxzIGVpbiBBcnJheSBtaXQgZGVuIG1hZ2llcm4sIGRpZQorLy8gZGFmdWVyIHp1c3RhZW5kaWcgc2luZC4KK25vc2F2ZSBwcml2YXRlIG1hcHBpbmcgdXNlcmlkcyA9IChbXSk7CisvLyBFaW4gQ2FjaGUgZnVlciBVSUQtQWxpYXNlLCBkYW1pdCBFeHBhbmRVSURBbGlhcygpIG5pY2h0IHN0YWVuZGlnIGdhbnplCisvLyBWZXJ6ZWljaG5pc3NlIGVpbmxlc2VuIG11c3MsIHNvbmRlcm4gZGVyIE1hc3RlciBkYXMgbnVyIGltIFJlc2V0IG1hY2hlbgorLy8gbXVzcy4KK25vc2F2ZSBwcml2YXRlIG1hcHBpbmcgdWlkYWxpYXNlID0gKFtdKTsKKworI2lmZGVmIF9QVVJFRlRQRF8KKy8vIExpc3RlIHZvbiBGVFAtYmVyZWNodGlndGVuIFVzZXJuCitub3NhdmUgcHJpdmF0ZSBtYXBwaW5nIGZ0cHVzZXIgPSAoW10pOworCitwdWJsaWMgdm9pZCByZWFkX2Z0cF91c2VycygpIHsKKyAgc3RyaW5nIHN0ciA9IHJlYWRfZmlsZSgiLyJTRUNVUkVESVIiL0FSQ0gvcHVyZWZ0cGQucGFzc3dkIikgfHwgIiI7CisgIHN0cmluZyAqZGF0YSA9IGV4cGxvZGUoc3RyLCAiXG4iKTsKKyAgaWYgKCFzaXplb2YoZGF0YSkpIHJldHVybjsKKyAgZnRwdXNlciA9IG1fYWxsb2NhdGUoc2l6ZW9mKGRhdGEpLCAxKTsKKyAgZm9yZWFjaChzdHIgOiBkYXRhKSB7CisgICAgc3RyaW5nICp0bXA9ZXhwbG9kZShzdHIsICI6Iik7CisgICAgaWYoc2l6ZW9mKHRtcCkgPj0gMikKKyAgICAgIG1fYWRkKGZ0cHVzZXIsIHRtcFswXSwgdG1wWzFdKTsKKyAgfQorfQorCitwdWJsaWMgaW50IHdyaXRlX2Z0cF91c2VycygpIHsKKyAgc3RyaW5nICpyZWNvcmQgPSBhbGxvY2F0ZSgxOCwiIik7CisgIG1hcHBpbmcgdG1wID0gbV9hbGxvY2F0ZShzaXplb2YoZnRwdXNlcikpOworICAvLyBzZXQgVUlEL0dJRCBvZiBzeXN0ZW0gdXNlcgorICByZWNvcmRbMl0gPSAiMTAwMCI7CisgIHJlY29yZFszXSA9ICIxMDAwIjsKKyAgZm9yZWFjaChzdHJpbmcgdSwgc3RyaW5nIHB3aGFzaCA6IGZ0cHVzZXIpIHsKKyAgICByZWNvcmRbMF0gPSB1OyAgLy8gVUlECisgICAgcmVjb3JkWzFdID0gcHdoYXNoOworICAgIHJlY29yZFs1XSA9ICIvaG9tZS9tdWQvbXVkbGliLyJXSVpBUkRESVIiLyIgKyB1ICsgIi8uLyI7CisgICAgbV9hZGQodG1wLCBpbXBsb2RlKHJlY29yZCwgIjoiKSk7CisgIH0KKyAgd3JpdGVfZmlsZSgiLyJTRUNVUkVESVIiL0FSQ0gvcHVyZWZ0cGQucGFzc3dkIiwgaW1wbG9kZShtX2luZGljZXModG1wKSwiXG4iKSwxKTsKKyAgcmV0dXJuIHNpemVvZih0bXApOworfQorCisvLyBnZWxvZXNjaHRlIE1hZ2llciBvZGVyIE1hZ2llciwgZGllIDIgV29jaGVuIG5pY2h0IGRhIHdhcmVuLCBleHBpcmVuCitwdWJsaWMgdm9pZCBleHBpcmVfZnRwX3VzZXIoKSB7CisgIGZvcmVhY2goc3RyaW5nIHUgOiBmdHB1c2VyKSB7CisgICAgbWl4ZWQgdWluZm8gPSBnZXRfZnVsbF91c2VyaW5mbyh1KTsKKyAgICBpZiAoIXVpbmZvKSB7CisgICAgICBtX2RlbGV0ZShmdHB1c2VyLHUpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGludCB6ZWl0ID0gY2FsbF9zZWZ1bigiZmlsZV90aW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICIvIlNFQ1VSRVNBVkVQQVRIICsgdVswLi4wXSArICIvIiArIHUgKyAiLm8iKTsKKyAgICBpZiAoemVpdCA8IHRpbWUoKS0xMjA5NjAwKSB7CisgICAgICBtX2RlbGV0ZShmdHB1c2VyLHUpOworICAgICAgY29udGludWU7CisgICAgfQorICB9CisgIGNhbGxfb3V0KCMnd3JpdGVfZnRwX3VzZXJzLCAyKTsKK30KKworI2VuZGlmIC8vIF9QVVJFRlRQRF8KKworLy8gKioqKioqKioqKiBvZWZmZW50bGljaGUgRnVua3Rpb25lbiAqKioqKioqKioqKioqKioqKioqKioqKgorCisvL1ZlcmFudHdvcnRsaWNoZSBNYWdpZXIgZnVlciBlaW5lIFVJRCBhdXNnZWJlbgorcHVibGljIHZhcmFyZ3Mgc3RyaW5nKiBRdWVyeVdpemFyZHNGb3JVSUQoc3RyaW5nIHVpZCwgaW50IHJlY3Vyc2l2ZSkgeworCisgICAgaWYgKCFzdHJpbmdwKHVpZCkgfHwgIXNpemVvZih1aWQpKQorICAgICAgICByZXR1cm4oKHt9KSk7CisKKyAgICBzdHJpbmcgKnRvbG9va3VwPSh7dWlkfSk7IC8vZGllc2Ugc3BhZXRlciBpbiB1c2VyaWRzIG5hY2hndWNrZW4uCisgICAgc3RyaW5nICp3aXphcmRzPSh7fSk7CisgICAgLy8gU2NoYXVlbiwgd2FzIGF1dG9tYXRpc2NoIGVybWl0dGVsdCB3ZXJkZW4ga2Fubi4KKyAgICBzdHJpbmcgKnBhcnRzPWV4cGxvZGUodWlkLCIuIik7CisgICAgc3dpdGNoKHNpemVvZihwYXJ0cykpIHsKKyAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAvLyB6LkIuIGQucmVnaW9uLm1hZ2llciB1bmQgcC5zZXJ2aWNlLm1hZ2llcgorICAgICAgICAgIGlmIChmaW5kX3VzZXJpbmZvKHBhcnRzWzJdKSkKKyAgICAgICAgICAgICAgLy9NYWdpZXIgZXhpc3RpZXJ0LCByZWluc2NocmVpYmVuLgorICAgICAgICAgICAgICB3aXphcmRzKz0oe3BhcnRzWzJdfSk7CisgICAgICAgICAgaWYgKHBhcnRzWzBdPT0iZCIpCisgICAgICAgICAgICAgIC8vIGQucmVnaW9uIG5vY2ggbmFjaGd1Y2tlbiAoUk1zKQorICAgICAgICAgICAgICB0b2xvb2t1cD0oe2ltcGxvZGUocGFydHNbMC4uMV0sIi4iKX0pOworICAgICAgICAgIGJyZWFrOworICAgICAgICAvL2Nhc2UgMjoKKyAgICAgICAgICAvLyBHVUlMRC5naWxkZSwgcC5wcm9qZWN0LCBkLnJlZ2lvbgorICAgICAgICAgIC8vIGtvZW5uZW4gbnVyIGluIHVzZXJpZHMgbmFjaGdlZ3Vja3Qgd2VyZGVuIChzLnUuIHRvbG9va3VwKQorICAgICAgICAgIC8vIG11ZXNzZW4gZGEgYWxzIEdVSUxELiosIGQuKiB1bmQgcC4qIGRyaW5zdGVoZW4hCisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAvLyBrZWluIFB1bmt0IGRyaW4uIEVudHdlZGVyIE1hZ2llci1JRCBvZGVyIHNwZXppZWxsZSBJRAorICAgICAgICAgIC8vIChsZXR6dGVyZSB3aXJkIHVudGVuIG5vY2ggcGVyIHRvbG9va3VwIG5hY2hnZWd1Y2t0KQorICAgICAgICAgIGlmIChmaW5kX3VzZXJpbmZvKHBhcnRzWzBdKSkKKyAgICAgICAgICAgICAgd2l6YXJkcys9KHtwYXJ0c1swXX0pOworICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAvLyBqZXR6dCBpbiB1c2VyaWRzIG5hY2hzY2hsYWdlbgorICAgIGZvcmVhY2godWlkOiB0b2xvb2t1cCkgeworICAgICAgICBpZiAobWVtYmVyKHVzZXJpZHMsdWlkKSkKKyAgICAgICAgICAgIHdpemFyZHMrPXVzZXJpZHNbdWlkXTsKKyAgICB9CisgICAgLy8gc28uIE51biBrYW5uIGVzIGFiZXIgbm9jaCBzZWluLCBkYXNzIGluIHVzZXJpZHMgc293YXMgd2llCisgICAgLy8gImQud2FsZC5hdGFtdXIiOih7YXRhbXVyfSkgdW5kICJhdGFtdXIiOih7InJ1bWF0YSJ9KSBkcmluc3RlaHQsIGFsc28KKyAgICAvLyBlaW4gTWFnaWVyIHNvenVzYWdlbiBmdWVyIEtyYW0gZWluZXMgYW5kZXJlbiB2ZXJhbnR3b3J0bGljaCBpc3QuIEQuaC4KKyAgICAvLyBub2NobWFsIGR1cmNoIFF1ZXJ5V2l6YXJkc0ZvclVJRCgpIHNjaGlja2VuIChkYXMgaXN0IGRhbm4gYWxsZXJkaW5ncyBuaWNodAorICAgIC8vIHdlaXRlciByZWt1cnNpdikuCisgICAgaWYgKCFyZWN1cnNpdmUpIHsKKyAgICAgIGZvcmVhY2godWlkOiB3aXphcmRzKSB7CisgICAgICAgIC8vZXMgaXN0IG1vZWdsaWNoLCBpbiBkZXIgU2NobGVpZmUgd2l6YXJkcyB6dSB2ZXJncm9lc3Nlcm4sIG9obmUgZGFzcworICAgICAgICAvL2VzIEVpbmZsdXNzIGF1ZiBkaWUgU2NobGVpZmUgaGF0LiAgICAgICAgCisgICAgICAgIHdpemFyZHMgKz0gUXVlcnlXaXphcmRzRm9yVUlEKHVpZCwgMSkgLSAoe3VpZH0pOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4obV9pbmRpY2VzKG1rbWFwcGluZyh3aXphcmRzKSkpOworfQorCisvL2RhcyBEZWZpbmUgaXN0IG5pY2h0IHNvbmRlcmxpY2ggZWxlZ2FudCwgYWJlciBpY2gga2FubiBoaWVyIG5pY2h0IGRhcworLy9uZXdza2lsbHMuaCBoaWVyIGluY2x1ZGVuICgxLiB6dSB2aWVsLCAyLiBpc3RzIG5lbiBTaWNoZXJoZWl0c3Byb2JsZW0pCisjZGVmaW5lIFBfR1VJTERfREVGQVVMVF9TUEVMTEJPT0sgICAgICAgImd1aWxkX3NiIgorLy8gZGl0byBmdWVyIGRlbiBHaWxkZW5tYXN0ZXIKKyNkZWZpbmUgR1VJTERNQVNURVIgICAgICAgICAgICAgICAgICIvc2VjdXJlL2dpbGRlbm1hc3RlciIKKworLy8gRGVuIEFsaWFzLUNhY2hlIGxvZXNjaGVuIChub3JtYWxlcndlaXNlIGVpbm1hbCBhbSBUYWcpCitwdWJsaWMgdm9pZCBSZXNldFVJREFsaWFzZSgpIHsKKyAgLy8gUk0rIGR1ZXJmZW4gZGVuIENhY2hlIGxvZXNjaGVuICh3ZW5uIHNpZSB6LkIuIG5lbiBuZXVlcyBWZXJ6ZWljaG5pcworICAvLyBhbmdlbGVndCBoYWJlbi4pCisgIGlmIChleHRlcm5fY2FsbCgpIAorICAgICAgJiYgY2FsbF9zZWZ1bigic2VjdXJlX2xldmVsIikgPCBMT1JEX0xWTCkKKyAgICAgIHJldHVybjsKKworICB1aWRhbGlhc2U9KFtdKTsKK30KKworLy8gZXhwYW5kaWVydCBlaW5pZ2UgJ0FsaWFzZScgaW4gZWluIEFycmF5IHZvbiBhbGxlbiBVSURzLCBmdWVyIGRpZSBzaWUKKy8vIHN0ZWhlbi4gQnNwOiAicmVnaW9uIiAtPiBkLnJlZ2lvbi4qICsgcmVnaW9uICsgZC5yZWdpb24sCisvLyAiemF1YmVyZXIiIC0+IEdVSUxELnphdWJlcmVyLCAicC5zZXJ2aWNlIiAtPiBwLnNlcnZpY2UuKgorLy8gTnV0enQgRWludHJhZyBhdXMgZGVtIHVpZGFsaWFzLUNhY2hlLCBzb2Zlcm4gdm9yaGFuZGVuLiAKK3B1YmxpYyB2YXJhcmdzIHN0cmluZyogUXVlcnlVSURBbGlhcyhzdHJpbmcgYWxpYXMsIGludCByZWMpIHsKKyAgc3RyaW5nICp1aWRzOworICBpZiAoIXN0cmluZ3AoYWxpYXMpIHx8ICFzaXplb2YoYWxpYXMpKQorICAgICAgcmV0dXJuICh7fSk7CisgIC8vIFdlbiBpbSBjYWNoZSwgZ2VodHMgc2NobmVsbC4KKyAgaWYgKG1lbWJlcih1aWRhbGlhc2UsIGFsaWFzKSkKKyAgICAgIHVpZHMgPSB1aWRhbGlhc2VbYWxpYXNdOworICBlbHNlCisgICAgICB1aWRzID0gRXhwYW5kVUlEQWxpYXMoYWxpYXMsIHJlYyk7CisKKyAgaWYgKGV4dGVybl9jYWxsKCkpCisgICAgcmV0dXJuIGNvcHkodWlkcyk7CisgIAorICByZXR1cm4odWlkcyk7Cit9CisKKy8vIEZ1ZXIgd2VsY2hlIFVJRHMgaXN0IGVpbiBNYWdpZXIgdmVyYW50d29ydGxpY2g/IChJc3QgZXIgUk0sCisvLyBHaWxkZW5tYWdpZXIsIGluIHdlbGNoZW4gUmVnaW9uZW4gaGF0IGVyIGVpbiBWZXJ6ZWljaG5pcywgZXRjLikKKy8vIHJlY3Vyc2l2ZSAhPSAwIGJlZGV1dGV0LCBkYXNzIGRlciBBdWZydWYgaW5kaXJla3QgYXVzIGVpbmVtIGxhdWZlbmRlbgorLy8gUXVlcnlVSURzRm9yV2l6YXJkKCkgZXJmb2xndC4gSW4gZGVtIEZhbGwgc29sbCBRdWVyeVVJREFsaWFzKCkga2VpbmUKKy8vIHdlaXRlcmUgUmVrdXJzaW9uIGR1cmNoZnVlaHJlbi4gV2lyZCBlaW5mYWNoIGR1cmNoZ2VyZWljaHQuCitwdWJsaWMgdmFyYXJncyBzdHJpbmcqIFF1ZXJ5VUlEc0ZvcldpemFyZChzdHJpbmcgd2l6dWlkLCBpbnQgcmVjdXJzaXZlKSB7CisgICAgc3RyaW5nICp1aWRzLCAqdG1wLCAqdWlkc3RvYWRkOworICAgIGludCBpOworCisgICAgaWYgKCFzdHJpbmdwKHdpenVpZCkgfHwgIXNpemVvZih3aXp1aWQpIHx8ICFJU19MRUFSTkVSKHdpenVpZCkpCisgICAgICAgIHJldHVybigoe30pKTsKKworICAgIGlmICghZmluZF91c2VyaW5mbyh3aXp1aWQpKQorICAgICAgICByZXR1cm4oKHt9KSk7CisKKyAgICB1aWRzdG9hZGQ9KHt9KTsgLy9kaWVzZSB3ZXJkZW4gaGludGVyaGVyIGluIHVzZXJpZHMgZ2VzcGVpY2hlcnQuCisKKyAgICAvLyBhbHMgZXJzdGVzIGRpZSByYXRlYmFyZW4gVUlEcy4gOy0pCisgICAgdWlkcz0oe3dpenVpZH0pOworICAgIC8vIFJlZ2lvbmVuIGVybWl0dGVsbiwgd28gd2l6dWlkIGVpbiBWZXJ6ZWljaG5pcyBoYXQgdW5kIGVudHNwcmVjaGVuZGUKKyAgICAvLyBVSURzIGFuaGFlbmdlbjoKKyAgICBmb3JlYWNoKHN0cmluZyByZWdpb246IGdldF9kb21haW5faG9tZXMod2l6dWlkKSkgeworICAgICAgICB1aWRzKz0oeyBzcHJpbnRmKERPTUFJTkRJUiIuJXMuJXMiLHJlZ2lvbix3aXp1aWQpIH0pOworICAgIH0KKyAgICAvLyBWZXJ6ZWljaG5pcyBpbiAvcC9zZXJ2aWNlPworICAgIGlmIChmaWxlX3NpemUoUFJPSkVDVERJUiIvc2VydmljZS8iK3dpenVpZCkgPT0gRlNJWkVfRElSKQorICAgICAgICB1aWRzKz0oe1BST0pFQ1RESVIiLnNlcnZpY2UuIit3aXp1aWR9KTsKKworICAgIC8vIEdpbGRlbmNoZWY/CisgICAgaWYgKHBvaW50ZXJwKHVzZXJsaXN0W3dpenVpZCxVU0VSX0dVSUxEXSkpIHsKKyAgICAgICAgZm9yZWFjaChzdHJpbmcgZ2lsZGU6IHVzZXJsaXN0W3dpenVpZCxVU0VSX0dVSUxEXSkgeworICAgICAgICAgIHVpZHN0b2FkZCArPSBRdWVyeVVJREFsaWFzKGdpbGRlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBSZWdpb25zbWFnaWVyPworICAgIGlmIChwb2ludGVycCh1c2VybGlzdFt3aXp1aWQsVVNFUl9ET01BSU5dKSkgeworICAgICAgICBmb3JlYWNoKHN0cmluZyBkb21haW46IHVzZXJsaXN0W3dpenVpZCxVU0VSX0RPTUFJTl0pIHsKKyAgICAgICAgICAgIC8vZ2VuZXJlbGxlIFBzZXVkby1VSUQgJ2QucmVnaW9uJyB1bmQgJ3JlZ2lvbicgZnVlciBnZWxvZXNjaHRlCisgICAgICAgICAgICAvL01hZ2llciBkaWVzZXIgUmVnaW9uIHZvcm1lcmtlbiwgdW0gc2llIGhpbnRlcmhlciBmdWVycworICAgICAgICAgICAgLy9SZXZlcnNlLUxvb2t1cCBpbnMgdWlkLU1hcHBpbmcgenUgc2NocmVpYmVuLgorICAgICAgICAgICAgc3RyaW5nICpwc2V1ZG89KHtET01BSU5ESVIiLiIrZG9tYWluLCBkb21haW59KTsKKyAgICAgICAgICAgIHVpZHN0b2FkZCArPSBwc2V1ZG87CisgICAgICAgICAgICAvLyBSZXN0IG1hY2h0IFF1ZXJ5VUlEQWxpYXMsIGRhYmVpIGFiZXIgZGllIHZvbiBkZXIgRnVua3Rpb24KKyAgICAgICAgICAgIC8vIGViZW5mYWxscyBnZWxpZWZlcnRlbiBQc2V1ZG8tVUlEcyB3aWVkZXIgYWJ6aWVoZW4uCisgICAgICAgICAgICB1aWRzICs9IFF1ZXJ5VUlEQWxpYXMoZG9tYWluKSAtIHBzZXVkbzsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBqZXR6dCBub2NoIG5hY2hndWNrZW4sIGZ1ZXIgd2VsY2hlIFVJRHMgZGllc2VyIE1hZ2llciBleHBsaXppdCBub2NoCisgICAgLy8genVzdGFlbmRpZyBpc3QuCisgICAgaWYgKHBvaW50ZXJwKHVzZXJsaXN0W3dpenVpZCxVU0VSX1VJRFNfVE9fVEFLRV9DQVJFXSkpIHsKKyAgICAvLyBkaWVzIGtvZW5udGUgZXR3YXMgYSBsYSAicmVnaW9uIiBvZGVyICJhbmRlcmVybWFnaWVyIiBzZWluLCBkLmguIGRpZXNlcgorICAgIC8vIE1hZ2llciBpc3QgZnVlciBhbGxlIFVJRHMgdm9uICdhbmRlcm1hZ2llcicgYXVjaCB6dXN0YWVuZGlnLiBEYWhlciBtdXNzCisgICAgLy8gamVkZXMgZGF2b24gZHVyY2ggUXVlcnlVSURBbGlhcygpICh3YXMgaW0gRmFsbGUgdm9uIFNwaWVsZXJuIHdpZWRlcnVtCisgICAgLy8gUXVlcnlVSURzRm9yV2l6YXJkKCkgcnVmdCwgYWJlciBkaWUgUmVrdXJzaW9uIGltIEZhbGxlIHZvbiBTcGllbGVybiBpc3QKKyAgICAvLyBhdWYgMSBiZWdyZW56dCkuCisgICAgICAgIGZvcmVhY2goc3RyaW5nIHVpZDI6IHVzZXJsaXN0W3dpenVpZCxVU0VSX1VJRFNfVE9fVEFLRV9DQVJFXSkgeyAgICAgICAgCisgICAgICAgICAgICB1aWRzdG9hZGQgKz0gUXVlcnlVSURBbGlhcyh1aWQyLCByZWN1cnNpdmUpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gc28sIGluIHVpZHN0b2FkZCBzdGVoZW4gVUlEcyBkcmluLCBkaWUgbmljaHQgTWFnaWVybmFtZSBzZWxiZXIsCisgICAgLy8gZC5yZWdpb24ubWFnaWVyIG9kZXIgcC5zZXJ2aWNlLm1hZ2llciBzaW5kIHVuZCBiZWkgd2VsY2hlbiBmb2xnbGljaCBkYXMKKyAgICAvLyBNYXBwaW5nIFVJRHMtbmFjaC1NYWdpZXIgbnVyIG1pdCBlaW5lciBMaXN0ZSBtb2VnbGljaCBpc3QuIEluIGRpZQorICAgIC8vIHdlcmRlbiBkaWUgdWlkcyBudW4gZWluZ2V0cmFnZW4uICh6LkIuIGQucmVnaW9uKQorICAgIGlmIChzaXplb2YodWlkc3RvYWRkKSkgeworICAgICAgICAvLyBnZW51ZyBQbGF0eiBpbiB1c2VyaWRzPyBTb25zdCB3ZWxjaGUgcmF1c3dlcmZlbi4gOi0vIAorICAgICAgICAvLyAoYmVzc2VyIGFscyBidWcpIFRPRE86IEF1ZiAxMGsgYmVncmVuemVuIC0+IG1heCBBcnJheWdyb2Vzc2UhCisgICAgICAgIGlmICggc2l6ZW9mKHVzZXJpZHMpKyhpPXNpemVvZih1aWRzdG9hZGQpKSAgICAgICAgICAgICAgIAorICAgICAgICAgICAgPj0gX19NQVhfTUFQUElOR19LRVlTX18pIHsKKyAgICAgICAgICAgIGZvcmVhY2goc3RyaW5nIHRtcHVpZDogbV9pbmRpY2VzKHVzZXJpZHMpWzAuLmldKSAgICAgICAgCisgICAgICAgICAgICAgIG1fZGVsZXRlKHVzZXJpZHMsdG1wdWlkKTsgIAorICAgICAgICB9CisgICAgICAgIGZvcmVhY2goc3RyaW5nIHRtcHVpZDogdWlkc3RvYWRkKSB7ICAKKyAgICAgICAgICAgIGlmIChtZW1iZXIodXNlcmlkcyx0bXB1aWQpKSB7ICAKKyAgICAgICAgICAgICAgICAvL1VzZXIgZGVtIEFycmF5IGhpbnp1ZnVlZ2VuLCB3ZW5uIG5vY2ggbmljaHQgZHJpbi4KKyAgICAgICAgICAgICAgICBpZiAobWVtYmVyKHVzZXJpZHNbdG1wdWlkXSx3aXp1aWQpPT0tMSkKKyAgICAgICAgICAgICAgICAgICAgdXNlcmlkc1t0bXB1aWRdPXVzZXJpZHNbdG1wdWlkXSsoe3dpenVpZH0pOyAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL3NvbnN0IG5ldWVuIEVpbnRyYWdlbiBoaW56dWZ1ZWdlbiAgICAgICAgICAgIAorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1fYWRkKHVzZXJpZHMsdG1wdWlkLCh7d2l6dWlkfSkpOyAgICAgICAgICAKKyAgICAgICAgfQorICAgIH0gLy8gRW5kZSBzcGV6LiB1aWRzIHNwZWljaGVybgorICAgIAorICAgIHJldHVybih1aWRzK3VpZHN0b2FkZCk7Cit9CisKKy8vRWluZW4gTWFnaWVyIGFscyB2ZXJhbnR3b3J0bGljaCBmdWVyIGVpbmUgYmVzdGltbXRlIFVJRCBlaW50cmFnZW4KK3B1YmxpYyBzdHJpbmcqIEFkZFdpemFyZEZvclVJRChzdHJpbmcgdWlkLCBzdHJpbmcgd2l6dWlkKSB7CisgICAgaWYgKCFzdHJpbmdwKHdpenVpZCkgfHwgIXNpemVvZih3aXp1aWQpCisgICAgICAgIHx8ICFJU19MRUFSTkVSKHdpenVpZCkpCisgICAgICAgIHJldHVybigoe30pKTsKKworICAgIC8vWnVncmlmZiBudXIgYWxzIEVNIG9kZXIgamVtYW5kLCBkZXIgZnVlciBkaWUgVUlEIHp1c3RhZW5kaWcgaXN0LgorICAgIGlmICggIUFSQ0hfU0VDVVJJVFkKKyAgICAgICAgJiYgbWVtYmVyKAorICAgICAgICAgICAgUXVlcnlVSURzRm9yV2l6YXJkKGNhbGxfc2VmdW4oInNlY3VyZV9ldWlkIikpLAorICAgICAgICAgICAgdWlkKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuKHVzZXJsaXN0W3dpenVpZCxVU0VSX1VJRFNfVE9fVEFLRV9DQVJFXSk7CisKKyAgICBpZiAoIXBvaW50ZXJwKHVzZXJsaXN0W3dpenVpZCxVU0VSX1VJRFNfVE9fVEFLRV9DQVJFXSkpCisgICAgICAgIC8vQXJyYXkgbmV1IGFubGVnZW4KKyAgICAgICAgdXNlcmxpc3Rbd2l6dWlkLFVTRVJfVUlEU19UT19UQUtFX0NBUkVdPSh7dWlkfSk7CisgICAgZWxzZSB7CisgICAgICAgIC8vRWluIEFycmF5IHNjaG9uIHZvcmhhbmRlbgorICAgICAgICBpZiAobWVtYmVyKHVzZXJsaXN0W3dpenVpZCxVU0VSX1VJRFNfVE9fVEFLRV9DQVJFXSx1aWQpPT0tMSkKKyAgICAgICAgICAgIC8vdWlkIG5pY2h0IGRyaW4KKyAgICAgICAgICAgIHVzZXJsaXN0W3dpenVpZCxVU0VSX1VJRFNfVE9fVEFLRV9DQVJFXT0KKyAgICAgICAgICAgICAgdXNlcmxpc3Rbd2l6dWlkLFVTRVJfVUlEU19UT19UQUtFX0NBUkVdKyh7dWlkfSk7CisgICAgfQorICAgIHNhdmVfdXNlcmluZm8od2l6dWlkKTsKKyAgICAvLyBhdXMgZGVtIFVJRC1BbGlhcy1DYWNoZSB3ZXJmZW4KKyAgICBtX2RlbGV0ZSh1aWRhbGlhc2UsIHdpenVpZCk7CisgICAgLy8gQXVmcnVmLCB1bSB1c2VyaWRzIHVuZCB1aWRhbGlhc2UgenUgYWt0dWFsaXNpZXJlbgorICAgIFF1ZXJ5VUlEc0ZvcldpemFyZCh3aXp1aWQpOworICAgIHJldHVybih1c2VybGlzdFt3aXp1aWQsVVNFUl9VSURTX1RPX1RBS0VfQ0FSRV0pOworfQorCisvLyBFaW5lbiBNYWdpZXIgd2llZGVyIGF1c3RyYWdlbiwgd2VubiBlciBuaWNodCBtZWhyIHp1c3RhZW5kaWcgaXN0LgorcHVibGljIHN0cmluZyogUmVtb3ZlV2l6YXJkRnJvbVVJRChzdHJpbmcgdWlkLCBzdHJpbmcgd2l6dWlkKSB7CisgICAgaWYgKCFzdHJpbmdwKHdpenVpZCkgfHwgIXNpemVvZih3aXp1aWQpCisgICAgICAgIHx8ICFmaW5kX3VzZXJpbmZvKHdpenVpZCkpCisgICAgICAgIHJldHVybigoe30pKTsKKworICAgIC8vWnVncmlmZiBudXIgYWxzIEVNIG9kZXIgamVtYW5kLCBkZXIgZnVlciBkaWUgVUlEIHp1c3RhZW5kaWcgaXN0LgorICAgIGlmICggIUFSQ0hfU0VDVVJJVFkKKyAgICAgICAgJiYgbWVtYmVyKAorICAgICAgICAgICAgUXVlcnlVSURzRm9yV2l6YXJkKGNhbGxfc2VmdW4oInNlY3VyZV9ldWlkIikpLAorICAgICAgICAgICAgdWlkKT09LTEpCisgICAgICAgIHJldHVybiBjb3B5KHVzZXJsaXN0W3dpenVpZCxVU0VSX1VJRFNfVE9fVEFLRV9DQVJFXSk7CisKKyAgICAvLyBqZXR6dCBtdXNzIGRpZXNlIHdpenVpZCBhdXMgYWxsZW4gVUlEcyBpbiB1c2VyaWRzIGdlbG9lc2NodCB3ZXJkZW4sIGRpZQorICAgIC8vIHNpZSBiaXNoZXIgZW50aGFsdGVuLiBIaWVyenUgc29sbHRlIFF1ZXJ5VUlEQWxpYXMgZGllIHBvdGVudGllbGwKKyAgICAvLyBkcmluc3RlaGVuZGVuIFVJRHMgbGllZmVybi4KKyAgICBmb3JlYWNoKHN0cmluZyB0dWlkOiBRdWVyeVVJREFsaWFzKHdpenVpZCwwKSkgeworICAgICAgICBpZiAobWVtYmVyKHVzZXJpZHMsIHR1aWQpICYmCisgICAgICAgICAgICBtZW1iZXIodXNlcmlkc1t0dWlkXSx3aXp1aWQpIT0tMSApCisgICAgICAgICAgICB1c2VyaWRzW3R1aWRdIC09ICh7d2l6dWlkfSk7CisgICAgfQorICAgIC8vIHdlbm4gZXMgZWluZSBVSUQgd2FyLCBmdWVyIGRpZSBkZXIgTWFnaWVyIGV4cGxpeml0IHp1c3RhZW5kaWcgd2FyLAorICAgIC8vIGVudHNwcmVjaGVuZCBsb2VzY2hlbi4gU29uc3QgaXN0IGhpZXIgRW5kZS4KKyAgICBpZiAoIXBvaW50ZXJwKHVzZXJsaXN0W3dpenVpZCxVU0VSX1VJRFNfVE9fVEFLRV9DQVJFXSkpCisgICAgICAgIHJldHVybiAoe30pOworICAgIGlmIChtZW1iZXIodXNlcmxpc3Rbd2l6dWlkLFVTRVJfVUlEU19UT19UQUtFX0NBUkVdLHVpZCk9PS0xKQorICAgICAgICByZXR1cm4gY29weSh1c2VybGlzdFt3aXp1aWQsVVNFUl9VSURTX1RPX1RBS0VfQ0FSRV0pOworCisgICAgLy8gSmV0enQgYXVzIHVzZXJsaXN0IGxvZXNjaGVuLgorICAgIHVzZXJsaXN0W3dpenVpZCxVU0VSX1VJRFNfVE9fVEFLRV9DQVJFXSAtPSAoe3VpZH0pOworICAgIHNhdmVfdXNlcmluZm8od2l6dWlkKTsKKyAgICAvLyB1bmQgdXNlcmlkcy91aWRhbGlhc2UgYWt0dWFsaXNpZXJlbi4KKyAgICBRdWVyeVVJRHNGb3JXaXphcmQod2l6dWlkKTsKKyAgICByZXR1cm4gY29weSh1c2VybGlzdFt3aXp1aWQsVVNFUl9VSURTX1RPX1RBS0VfQ0FSRV0pOworfQorCisvL2VudGZlcm50IGVpbmVuIHVzZXIgYXVzIGRlbSB1c2VyY2FjaGUKK3ZvaWQgUmVtb3ZlRnJvbUNhY2hlKHN0cmluZyB1c2VyKSB7CisgIG1fZGVsZXRlKHVzZXJsaXN0LHVzZXIpOworfQorCisvL2xvZXNjaHQgZGVuIGdlc2FtdGVuIFVzZXJjYWNoZQoraW50IGNsZWFyX2NhY2hlKCkgeworICB1c2VybGlzdD1tX2FsbG9jYXRlKDAsd2lkdGhvZih1c2VybGlzdCkpOworICB1cGRhdGVfbGF0ZV9wbGF5ZXJzKCk7CisgIHJldHVybiAxOworfQorCisvLyBMb2VzY2h0IFVJRC0+TWFnaWVyIExvb2t1cHRhYmVsbGUuIFNvbGx0ZSBuaWNodCBnZXJ1ZmVuIHdlcmRlbiwgd2VubiBtYW4gCisvLyBuaWNodCBnZW5hdSB3ZWlzcywgd2FzIG1hbiBkYW1pdCBrYXB1dHRtYWNodC4KKy8vIGFscyBOZWJlbmVmZmVrdCB3aXJkIGNsZWFyX2NhY2hlKCkgZ2VydWZlbi4KK2ludCBSZXNldFVJRENhY2hlKCkgeworICAvLyBkYSBkaWVzZSBGdW5rdGlvbiBhdWNoIGRhcyBVSUQ8LT5NYWdpZXItTG9va3VwIGxvZXNjaHQsIGRhcmYgZGFzIG5pY2h0CisgIC8vIGplZGVyIHJ1ZmVuLgorICBpZiAoZXh0ZXJuX2NhbGwoKSAmJgorICAgICAgY2FsbF9zZWZ1bigic2VjdXJlX2xldmVsIikgPCBFTERFUl9MVkwpCisgICAgICByZXR1cm4gLTE7CisgIHVzZXJpZHM9KFtdKTsKKyAgY2xlYXJfY2FjaGUoKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vdmVyc3RvcmJlbmUgU3BpZWxlciBhdWZsaXN0ZW4KK3N0cmluZyBsaXN0X2xhdGVfcGxheWVycygpCit7CisgIHN0cmluZyByZXQ7CisgIGludCBzaXplLGk7CisgIAorICByZXQ9ICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiI7CisgIHJldCs9IiogICAgICAgVmVyc3RvcmJlbmUgU3BpZWxlciAgICAgICAgKlxuIjsKKyAgcmV0Kz0iKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iOworICAKKyAgaWYoIWxhdGVwbGF5ZXJzIHx8IChzaXplPXNpemVvZihsYXRlcGxheWVycykpPT0wKQorICB7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICAKKyAgZm9yKGk9MDtpPHNpemU7aSsrKQorICB7CisgICAgcmV0Kz1sYXRlcGxheWVyc1tpXSsiXG4iOworICB9CisgIAorICByZXR1cm4gcmV0OworfQorCisvLyBpc3QgZGVyIFNwaWVsZXIgZ2VzdG9yYmVuPworaW50IGNoZWNrX2xhdGVfcGxheWVyKHN0cmluZyBzdHIpCit7CisgIGlmKCFsYXRlcGxheWVycyB8fCAhc3RyIHx8IHN0cj09IiIpCisgIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICAKKyAgaWYobWVtYmVyKGxhdGVwbGF5ZXJzLHN0cikhPS0xKQorICB7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgCisgIHJldHVybiAwOworfQorCisvLyBhbGxlIEVpbnRyYWVnZSBpbSB1c2VyY2FjaGUgYXVzZ2ViZW4KK3B1YmxpYyBtaXhlZCAqc2hvd19jYWNoZSgpIHsKKyAgICByZXR1cm4gbV9pbmRpY2VzKHVzZXJsaXN0KTsKK30KKworLy8gZ2lidCBlcyBzbyBlaW5lbiBVc2VyPyBBbmZyYWdlIGF1c3NlcmRlbSBpbW1lciBpbiBkZW4gQ2FjaGUgZWludHJhZ2VuCitwdWJsaWMgaW50IGZpbmRfdXNlcmluZm8oc3RyaW5nIHVzZXIpIHsKKyAgc3RyaW5nIGZpbGU7CisgIGludCBpOworICBpZiAoIXN0cmluZ3AodXNlcikgfHwgIXNpemVvZih1c2VyKSAKKyAgICAgIHx8IG1lbWJlcih1c2VyLCcgJykhPS0xIHx8IG1lbWJlcih1c2VyLCc6JykhPS0xKQorICAgIHJldHVybiAwOworICBpZiAoIW1lbWJlcih1c2VybGlzdCx1c2VyKSkgeworICAgICAgLy9lcnN0bWFsIHNjaGF1ZW4sIG9iIHdpciBtaXQgZWluZW0gbmV1ZW4gRWludHJhZyBuaWNodCBkaWUgbWF4LgorICAgICAgLy9NYXBwaW5nLUdyb2Vzc2VuIHVlYmVyc2NocmVpdGVuLCB3ZW5uIGphLCBlaW5lbiBFaW50cmFnIGxvZXNjaGVuCisgICAgICAvL0JUVzogd2lkdGhvZigpKzEgaXN0IHJpY2h0aWcgc28uCisgICAgICAvL0JUVzI6IEljaCBob2ZmZSwgZGllIG1heC4gQXJyYXlncm9lc3NlIGlzdCBpbW1lciBncm9zcyBnZW51Zywgc29sbHRlIAorICAgICAgLy9zaWUgYWJlciBzZWluIGJlaSBuZXIgTWFwcGluZ2JyZWl0ZSB2b24gMTAuCisgICAgICAvLyBCVFczOiBEaWVzZXMgUmF1c2xvZXNjaGVuIHZvbiBlaW5lbSBFaW50cmFnIGJlaSBFcnJlaWNoZW4gZGVyIEdyZW56ZQorICAgICAgLy8gZXJob2VodCBkaWUgYmVub2V0aWd0ZW4gVGlja3MgZnVlciBkaWVzZSBGdW5rdGlvbiB1bSBkYXMgNS02ZmFjaGUgdW5kCisgICAgICAvLyBkaWUgbm9ldGlnZSBaZWl0IHVtIGRhcyA3MGZhY2hlLiBEYWhlciB3aXJkIGRlciBDYWNoZSBiZWkgRXJyZWljaGVuCisgICAgICAvLyBkZXIgR3JlbnplIGpldHp0IGVpbmZhY2ggZ2Vsb2VzY2h0LgorICAgICAgaWYgKCAoIChpPXNpemVvZih1c2VybGlzdCkrMSkgPj0gX19NQVhfTUFQUElOR19LRVlTX18pIAorICAgICAgICAgIHx8ICgoIGkgKiAod2lkdGhvZih1c2VybGlzdCkrMSkpID4KKyAgICAgICAgICAgICAgICAgX19NQVhfTUFQUElOR19TSVpFX18pKSAgICAKKyAgICAgICAgICAvL21fZGVsZXRlKHVzZXJsaXN0LG1faW5kaWNlcyh1c2VybGlzdClbMF0pOworICAgICAgICAgIHVzZXJsaXN0PW1fYWxsb2NhdGUoMSx3aWR0aG9mKHVzZXJsaXN0KSk7CisKKyAgICAgIC8vIFVzZXJzYXZlZmlsZSBmaW5kZW4KKyAgICAgIGlmICgoZmlsZT1zZWN1cmVfc2F2ZWZpbGUodXNlcikpPT0iIikgeworICAgICAgICAvLyBVc2VyIGdpYnQgZXMgbmljaHQsIGFiZXIgQW5mcmFnZSBjYWNoZW4KKyAgICAgICAgICB1c2VybGlzdCs9KFt1c2VyOiAiTlAiOyAtMTsgKHt9KTsgIkxPQ0tFRCI7IC0xOyB0aW1lKCk7ICIiOyAiIjsgIiI7CisgICAgICAgICAgKHt9KTsiIjsiIjsgMCBdKTsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIHBhc3N3b3JkPSIiOworICAgICAgZXA9IiI7CisgICAgICBlaz0iIjsKKyAgICAgIG1xPSIiOworICAgICAgZ3VpbGRzPSh7fSk7CisgICAgICBla3RpcHM9IiI7CisgICAgICBmcHRpcHM9IiI7CisgICAgICB1aWRzdG90YWtlY2FyZT0wOworICAgICAgaWYgKCFyZXN0b3JlX29iamVjdChmaWxlKSkgcmV0dXJuIDA7CisgICAgICB1c2VybGlzdCs9KFt1c2VyOiBwYXNzd29yZDsgbGV2ZWw7IGRvbWFpbnM7IHNoZWxsOyBjcmVhdGlvbl9kYXRlOyAKKyAgICAgICAgICB0aW1lKCk7ZXA7IGVrOyBtcTsgZ3VpbGRzOyBla3RpcHM7IGZwdGlwczsgdWlkc3RvdGFrZWNhcmVdKTsKKyAgICAgIC8vIGRpZSBzcGV6aWVsbGVuIFVJRHMsIGZ1ZXIgZGllIGRpZXNlciBNYWdpZXIgenVzdGFlbmRpZyBpc3QsIGVybWl0dGVuCisgICAgICAvLyB1bmQgZ2xlaWNoemVpdGlnIGltIGVudHNwcmVjaGVuZGVuIE1hcHBpbmcgZnVlcnMgUmV2ZXJzZS1Mb29wdXAKKyAgICAgIC8vIHNwZWljaGVybi4KKyAgICAgIGlmIChsZXZlbCA+PSBMRUFSTkVSX0xWTCkKKyAgICAgICAgUXVlcnlVSURzRm9yV2l6YXJkKHVzZXIpOworICB9CisgIHVzZXJsaXN0W3VzZXIsVVNFUl9UT1VDSF09dGltZSgpOworICBpZiAodXNlcmxpc3RbdXNlcixVU0VSX0xFVkVMXT09LTEpIHJldHVybiAwOworICByZXR1cm4gMTsKK30KKworLy8gRGF0ZW4gYXVzIGRlciBVc2VybGlzdCBmdWVyIGRpZXNlbiBVc2VyIGxpZWZlcm4uIE1hY2h0IGdnZi4gZmluZF91c2VyaW5mbygpCitwdWJsaWMgbWl4ZWQgKmdldF91c2VyaW5mbyhzdHJpbmcgdXNlcikgeworICBpZighdXNlcnx8dXNlcj09IiIpCisgICAgcmV0dXJuIDA7CisgIHVzZXI9ZXhwbG9kZSh1c2VyLCIuIilbMF07CisgIGlmICghbWVtYmVyKHVzZXJsaXN0LHVzZXIpICYmICFmaW5kX3VzZXJpbmZvKHVzZXIpKQorICAgIHJldHVybiAwOworCisgIGlmICh1c2VybGlzdFt1c2VyLFVTRVJfTEVWRUxdPT0tMSkgcmV0dXJuIDA7CisKKyAgcmV0dXJuKHt1c2VyLCIjIyIrdXNlcix1c2VybGlzdFt1c2VyLFVTRVJfTEVWRUxdLAorICAgICAgdXNlcmxpc3RbdXNlcixVU0VSX0RPTUFJTl0sIHVzZXJsaXN0W3VzZXIsVVNFUl9PQkpFQ1RdLAorICAgICAgdXNlcmxpc3RbdXNlcixVU0VSX0NSRUFUSU9OX0RBVEVdLCAwLCAwLAorICAgICAgdXNlcmxpc3RbdXNlcixVU0VSX0dVSUxEXSwKKyAgICAgIHVzZXJsaXN0W3VzZXIsVVNFUl9FS1RJUFNdLHVzZXJsaXN0W3VzZXIsVVNFUl9GUFRJUFNdLAorICAgICAgdXNlcmxpc3RbdXNlcixVU0VSX1VJRFNfVE9fVEFLRV9DQVJFXX0pOworfQorCisvLyBsaWVmZXJ0IGRhcyBPYmpla3QgZGVzIHVzZXJzIGF1cyBkZXIgVXNlcmxpc3QgenVydWVjay4KK3B1YmxpYyBzdHJpbmcgcXVlcnlfcGxheWVyX29iamVjdCggc3RyaW5nIG5hbWUgKQoreworICBtaXhlZCAqdXNlcmVudHJ5OworICBpZiggIWZpbmRfdXNlcmluZm8obmFtZSkgKSByZXR1cm4gIiI7CisgIHJldHVybiB1c2VybGlzdFtuYW1lLFVTRVJfT0JKRUNUXTsKK30KKworLy8gUGFzc3dvcnQgb2s/CitwdWJsaWMgaW50IGdvb2RfcGFzc3dvcmQoIHN0cmluZyBzdHIsIHN0cmluZyBuYW1lICkKK3sKKyAgICBzdHJpbmcgcnRzOworICAgIGludCBpLCBuOworCisgICAgaWYgKCBzdHJbMF0gPT0gJyEnICl7CisgICAgICAgIHRlbGxfb2JqZWN0KCB0aGlzX3BsYXllcigpIHx8IHRoaXNfb2JqZWN0KCksICJFaW4gQXVzcnVmdW5nc3plaWNoZW4gIgorICAgICAgICAgICAgICAgICAgICAgIignIScpIGFscyBlcnN0ZXIgQnVjaHN0YWJlIGRlcyBQYXNzd29ydGVzIHd1ZXJkZSB6dVxuIgorICAgICAgICAgICAgICAgICAgICAgIlByb2JsZW1lbiBmdWVocmVuLiBTdWNoIERpciBiaXR0ZSBlaW4gYW5kZXJlcyBQYXNzd29ydCAiCisgICAgICAgICAgICAgICAgICAgICAiYXVzLlxuIiApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoIHNpemVvZihzdHIpIDwgNiApeworICAgICAgICB0ZWxsX29iamVjdCggdGhpc19wbGF5ZXIoKSB8fCB0aGlzX29iamVjdCgpLAorICAgICAgICAgICAgICAgICAgICAgIkRhcyBQYXNzd29ydCBtdXNzIHdlbmlnc3RlbnMgNiBaZWljaGVuIGxhbmcgc2Vpbi5cbiIgKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgc3RyID0gbG93ZXJfY2FzZShzdHIpOworICAgIHJ0cyA9ICIiOworCisgICAgLy8gWmFobGVuL1NvbmRlcnplaWNoZW4gYW0gQW5mYW5nIG9kZXIgRW5kZSBkZXMgUGFzc3dvcnRlcworICAgIC8vICh6LkIuICJtZXJsaW45OSIpIHNpbmQgbmljaHQgd2lya2xpY2ggZWluZmFsbHNyZWljaC4KKyAgICB3aGlsZSAoIHNpemVvZihzdHIpICYmIChzdHJbMF0gPiAneicgfHwgc3RyWzBdIDwgJ2EnKSApeworICAgICAgICBydHMgKz0gc3RyWzAuLjBdOworICAgICAgICBzdHIgPSBzdHJbMS4uXTsKKyAgICB9CisKKyAgICB3aGlsZSAoIHNpemVvZihzdHIpICYmIChzdHJbPDFdID4gJ3onIHx8IHN0cls8MV0gPCAnYScpICl7CisgICAgICAgIHJ0cyArPSBzdHJbPDEuLl07CisgICAgICAgIHN0ciA9IHN0clswLi48Ml07CisgICAgfQorCisgICAgLy8gQW56YWhsIHVudGVyc2NoaWVkbGljaGVyIFplaWNoZW4gbWVya2VuLCBkaWUgaGVyYXVzZ2VzY2huaXR0ZW4gd3VyZGVuCisgICAgbiA9IHNpemVvZiggbWttYXBwaW5nKGVmdW46OmV4cGxvZGUoIHJ0cywgIiIgKSkgKTsKKyAgICBydHMgPSAiIjsKKworICAgIGZvciAoIGkgPSBzaXplb2Yoc3RyKTsgaS0tOyApCisgICAgICAgIHJ0cyArPSBzdHJbaS4uaV07CisKKyAgICAvLyBFaWdlbmVyIE5hbWUgYWxzIFBhc3N3b3J0IGJ6dy4gZWlnZW5lciBOYW1lIHJ1ZWNrd2FlcnRzCisgICAgaWYgKCBzdHIgPT0gbG93ZXJfY2FzZShuYW1lKSB8fCBydHMgPT0gbG93ZXJfY2FzZShuYW1lKSB8fAorICAgICAgICAgLy8gTmFtZSBlaW5lcyBhbmRlcmVuIE11ZGRlcnMgKEVyc3RpZT8pCisgICAgICAgICBzZWN1cmVfc2F2ZWZpbGUoc3RyKSAhPSAiIiB8fCBzZWN1cmVfc2F2ZWZpbGUocnRzKSAhPSAiIiB8fAorICAgICAgICAgLy8gTmFtZSB2b24gZGVyIEJhbmlzaC1MaXN0ZQorICAgICAgICAgUXVlcnlCYW5pc2hlZChzdHIpIHx8IFF1ZXJ5QmFuaXNoZWQocnRzKSB8fAorICAgICAgICAgLy8gTmFtZSBlaW5lcyB2b3JoYW5kZW5lbiBOUEMgby5hZS4KKyAgICAgICAgIGNhbGxfc2VmdW4oImZpbmRfbGl2aW5nIiwgc3RyICkgfHwKKyAgICAgICAgIGNhbGxfc2VmdW4oImZpbmRfbGl2aW5nIiwgcnRzICkgfHwKKyAgICAgICAgIC8vIFp1d2VuaWcgdmVyc2NoaWVkZW5lIFplaWNoZW4KKyAgICAgICAgIHNpemVvZiggbWttYXBwaW5nKGVmdW46OmV4cGxvZGUoIHN0ciwgIiIgKSkgKSArIG4gPCA0ICl7CisgICAgICAgIHRlbGxfb2JqZWN0KCB0aGlzX3BsYXllcigpIHx8IHRoaXNfb2JqZWN0KCksCisgICAgICAgICAgICAgICAgICAgICAiRGFzIFBhc3N3b3J0IHdhZXJlIHp1IGVpbmZhY2ggenUgZXJyYXRlbi4gTmltbSBiaXR0ZSAiCisgICAgICAgICAgICAgICAgICAgICAiZWluIGFuZGVyZXMuXG4iICk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiAxOworfQorCisvLyBVc2VyLUlEIGZ1ZXIgZWluIEZpbGUgZXJtaXR0ZWxuLgorcHVibGljIHN0cmluZyBnZXRfd2l6X25hbWUoc3RyaW5nIGZpbGUpIHsKKyAgICByZXR1cm4gY3JlYXRvcl9maWxlKGZpbGUpOworfQorCisvLyBXaXpsZXZlbCBhdXMgZGVtIFVzZXJpbmZvLUNhY2hlIGhvbGVuCitwdWJsaWMgaW50IGdldF93aXpfbGV2ZWwoc3RyaW5nIHVzZXIpIHsKKyAgaWYgKHVzZXIgJiYgZmluZF91c2VyaW5mbyh1c2VyKSkgCisgICAgcmV0dXJuIHVzZXJsaXN0W3VzZXIsVVNFUl9MRVZFTF07CisgIC8vcmV0dXJuIDAgaWYgbm8gdXNlciBnaXZlbiAocmV0dXJuIHR5cGUgbmVlZGVkKQorICByZXR1cm4oMCk7Cit9CisKKy8vIFdpemxldmVsIGZ1ZXIgZWluZSBVSUQgZXJtaXR0ZWxuLgorcHVibGljIGludCBxdWVyeV93aXpfbGV2ZWwoIG1peGVkIHBsYXllciApCit7CisgICAgaWYgKCBvYmplY3RwKHBsYXllcikgJiYgZWZ1bjo6b2JqZWN0X2luZm8ocGxheWVyLCBPSV9PTkNFX0lOVEVSQUNUSVZFKSApCisgICAgICAgIHJldHVybiBnZXRfd2l6X2xldmVsKCBnZXR1aWQocGxheWVyKSApOworICAgIGVsc2UgeworICAgICAgICAvLyBlcnN0bWFsIFVJRCBlcm1pdHRlbG4sIGZhbGxzIE9iamVrdAorICAgICAgICAvL2lmIChvYmplY3RwKHBsYXllcikpCisgICAgICAgIC8vICAgIHBsYXllcj1nZXR1aWQocGxheWVyKTsKKyAgICAgICAgaWYgKCBzdHJpbmdwKHBsYXllcikgKSB7CisgICAgICAgICAgICBpZiggcGxheWVyWzAuLjFdPT1ET01BSU5ESVIiLiIgKSByZXR1cm4gMjU7CisgICAgICAgICAgICBpZiggcGxheWVyWzAuLjVdPT1HVUlMRElEIi4iICkgCisgICAgICAgICAgICAgICAgcmV0dXJuIFdJWkxWTFNbR1VJTERJRF07CisgICAgICAgICAgICBpZiggcGxheWVyWzAuLjFdPT1QUk9KRUNURElSIi4iICkgcmV0dXJuIDIxOworICAgICAgICAgICAgLy8gZGllIGFsdGUgTG9lc3VuZyBtaXQgfHwgdmVyaGFlbHQgc2ljaCBmYWxzY2gsIHdlbm4gZWluIFVJRCBuZQorICAgICAgICAgICAgLy8gc3BlemllbGxlIGlzdCwgZGVyIExldmVsIDAgenVnZW9yZG5ldCB3dXJkZSB1bmQgZXMgZWluZW4KKyAgICAgICAgICAgIC8vIFNwaWVsZXIgbWl0IGRpZXNlbSBuYW1lbiBnaWJ0LgorICAgICAgICAgICAgaWYgKG1lbWJlcihXSVpMVkxTLHBsYXllcikpIAorICAgICAgICAgICAgICAgIHJldHVybihXSVpMVkxTW3BsYXllcl0pOworICAgICAgICAgICAgcmV0dXJuIGdldF93aXpfbGV2ZWwocGxheWVyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLy8gU2F2ZWZpbGUgYXVzIC9zZWN1cmUvc2F2ZSogenVydWVja2xpZWZlcm4KK3B1YmxpYyBzdHJpbmcgc2VjdXJlX3NhdmVmaWxlKHN0cmluZyBuYW1lKQoreworICBpZighbmFtZXx8bmFtZT09IiIpCisgICAgcmV0dXJuICIiOworICBuYW1lPWV4cGxvZGUobmFtZSwiLiIpWzBdOworICBpZiAoZmlsZV9zaXplKFNFQ1VSRVNBVkVQQVRIK25hbWVbMC4uMF0rIi8iK25hbWUrIi5vIik+PTApCisgICAgcmV0dXJuIFNFQ1VSRVNBVkVQQVRIK25hbWVbMC4uMF0rIi8iK25hbWU7CisKKyAgcmV0dXJuICIiOworfQorCisvLyAqKioqKioqKioqKioqKiogJ2hhbGItb2VmZmVudGxpY2hlIEZ1bmt0aW9uZW4gKioqKioqKioqKioqKioqKioqKioqCisjaWZkZWYgX1BVUkVGVFBEXworLy8gRlRQLUJlcmVjaHRpZ3VuZyBmdWVyIE1hZ2llcgoraW50IHVwZGF0ZV9mdHBfYWNjZXNzKHN0cmluZyB1c2VyLCBpbnQgc3RhdGUpIHsKKyAgLy8gd2VubiBuaWNodCBFTSsgb2RlciBST09ULCBkYXJmIG51ciBmdWVyIHRoaXNfaW50ZXJhY3RpdmUgZ2VhZW5kZXJ0CisgIC8vIHdlcmRlbi4KKyAgaWYgKGdldHVpZChQTykgIT0gUk9PVElEICYmIGV4dGVybl9jYWxsKCkKKyAgICAgICYmICFBUkNIX1NFQ1VSSVRZKSB7CisgICAgaWYgKHRoaXNfaW50ZXJhY3RpdmUoKSkKKyAgICAgIHVzZXIgPSBnZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpKTsKKyAgICBlbHNlCisgICAgICB1c2VyID0gMDsKKyAgfQorICBpZiAoIXVzZXIgfHwgIXNpemVvZih1c2VyKSkKKyAgICByZXR1cm4gLTE7CisKKyAgaWYgKCFmaW5kX3VzZXJpbmZvKHVzZXIpKQorICAgIHJldHVybiAwOworCisgIC8vIFBhc3N3b3J0IG11c3MgbWFudWVsbCB2b20gTWFnaWVyIG5ldSBnZXNldHp0IHdlcmRlbiwgZGEgZXMga2VpbmUKKyAgLy8gTW9lZ2xpY2hrZWl0IGdpYnQsIGFuIGRhcyBha3R1ZWxsZSBpbSBLbGFydGV4dCBoZXJhbnp1a29tbWVuLgorICBpZiAoc3RhdGUpIHsKKyAgICBpZiAoIW1lbWJlcihmdHB1c2VyLHVzZXIpKQorICAgICAgbV9hZGQoZnRwdXNlciwgdXNlciwgIioiKTsKKyAgfQorICBlbHNlCisgICAgbV9kZWxldGUoZnRwdXNlciwgdXNlcik7CisgIAorICBjYWxsX291dCgjJ3dyaXRlX2Z0cF91c2VycywgNCk7CisgIHJldHVybiBzdGF0ZTsKK30KKyNlbmRpZgorCisvLyBTcGllbGVyIGVpbiBuZXVlcyBXaXpsZXZlbCB2ZXJwYXNzZW4uCitpbnQgdXBkYXRlX3dpel9sZXZlbChzdHJpbmcgdXNlcixpbnQgbGV2KSB7CisgIG9iamVjdCBvYjsKKworICBpZiAoZ2V0dWlkKFBPKSAhPSBST09USUQgJiYgZXh0ZXJuX2NhbGwoKSkgcmV0dXJuIDA7CisgIGlmICghZmluZF91c2VyaW5mbyh1c2VyKSkgcmV0dXJuIDA7CisgIHVzZXJsaXN0W3VzZXIsVVNFUl9MRVZFTF0gPSBsZXY7CisgIHNhdmVfdXNlcmluZm8odXNlcik7CisgIHJldHVybiAxOworfQorCisvLyBuZXVlIEZvcnNjaGVycHVua3RlIGZ1ZXIgZGVuIFVzZXIgYWJzcGVpY2hlcm4uCitpbnQgdXBkYXRlX2VwKHN0cmluZyB1c2VyLHN0cmluZyBlcF9uZXUpIHsKKyAgaWYgKGdldHVpZChQTykgIT0gUk9PVElEKSByZXR1cm4gMDsKKyAgaWYgKCFmaW5kX3VzZXJpbmZvKHVzZXIpKSByZXR1cm4gMDsKKyAgdXNlcmxpc3RbdXNlcixVU0VSX0VQXSA9IGVwX25ldTsKKyAgc2F2ZV91c2VyaW5mbyh1c2VyKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIG5ldWUgRXJzdGtpbGxzIGZ1ZXIgZGVuIFVzZXIgYWJzcGVpY2hlcm4uCitpbnQgdXBkYXRlX2VrKHN0cmluZyB1c2VyLHN0cmluZyBla19uZXUpIHsKKyAgaWYgKGdldHVpZChQTykgIT0gUk9PVElEKSByZXR1cm4gMDsKKyAgaWYgKCFmaW5kX3VzZXJpbmZvKHVzZXIpKSByZXR1cm4gMDsKKyAgdXNlcmxpc3RbdXNlcixVU0VSX0VLXSA9IGVrX25ldTsKKyAgc2F2ZV91c2VyaW5mbyh1c2VyKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIE1pbmlxdWVzdGRhdGVuIHNwZWljaGVybi4KK2ludCB1cGRhdGVfbXEoc3RyaW5nIHVzZXIsc3RyaW5nIG1xX25ldSkgeworICBpZiAoZ2V0dWlkKFBPKSAhPSBST09USUQpIHJldHVybiAwOworICBpZiAoIWZpbmRfdXNlcmluZm8odXNlcikpIHJldHVybiAwOworICB1c2VybGlzdFt1c2VyLFVTRVJfTVFdID0gbXFfbmV1OworICBzYXZlX3VzZXJpbmZvKHVzZXIpOworICByZXR1cm4gMTsKK30KKworLy8gRXJzdGtpbGxwdW5rdC1UaXBzIHNwZWljaGVybi4KK2ludCB1cGRhdGVfZWt0aXBzKHN0cmluZyB1c2VyLHN0cmluZyBla19uZXUpIHsKKyAgaWYgKGdldHVpZChQTykgIT0gUk9PVElEKSByZXR1cm4gMDsKKyAgaWYgKCFmaW5kX3VzZXJpbmZvKHVzZXIpKSByZXR1cm4gMDsKKyAgdXNlcmxpc3RbdXNlcixVU0VSX0VLVElQU10gPSBla19uZXU7CisgIHNhdmVfdXNlcmluZm8odXNlcik7CisgIHJldHVybiAxOworfQorCisvLyBGb3JzY2hlcnB1bmt0dGlwcyBhYnNwZWljaGVybi4KK2ludCB1cGRhdGVfZnB0aXBzKHN0cmluZyB1c2VyLHN0cmluZyBmcF9uZXUpIHsKKyAgaWYgKGdldHVpZChQTykgIT0gUk9PVElEKSByZXR1cm4gMDsKKyAgaWYgKCFmaW5kX3VzZXJpbmZvKHVzZXIpKSByZXR1cm4gMDsKKyAgdXNlcmxpc3RbdXNlcixVU0VSX0ZQVElQU10gPSBmcF9uZXU7CisgIHNhdmVfdXNlcmluZm8odXNlcik7CisgIHJldHVybiAxOworfQorCisvLyBmb3JzY2hlcnB1bmt0ZSBhYmZyYWdlbi4KK3N0cmluZyBxdWVyeV9lcChzdHJpbmcgdXNlcikgeworICBpZiAoZ2V0dWlkKFBPKSAhPSBST09USUQpIHJldHVybiAwOworICBpZiAoIWZpbmRfdXNlcmluZm8odXNlcikpIHJldHVybiAwOworICByZXR1cm4gdXNlcmxpc3RbdXNlcixVU0VSX0VQXTsKK30KKworLy8gRXJzdGtpbGxzIGFiZnJhZ2VuCitzdHJpbmcgcXVlcnlfZWsoc3RyaW5nIHVzZXIpIHsKKyAgaWYgKGdldHVpZChQTykgIT0gUk9PVElEKSByZXR1cm4gMDsKKyAgaWYgKCFmaW5kX3VzZXJpbmZvKHVzZXIpKSByZXR1cm4gMDsKKyAgcmV0dXJuIHVzZXJsaXN0W3VzZXIsVVNFUl9FS107Cit9CisKKy8vIE1pbmlxdWVzdHMgYWJmcmFnZW4uCitzdHJpbmcgcXVlcnlfbXEoc3RyaW5nIHVzZXIpIHsKKyAgaWYgKGdldHVpZChQTykgIT0gUk9PVElEKSByZXR1cm4gMDsKKyAgaWYgKCFmaW5kX3VzZXJpbmZvKHVzZXIpKSByZXR1cm4gMDsKKyAgcmV0dXJuIHVzZXJsaXN0W3VzZXIsVVNFUl9NUV07Cit9CisKKy8vIEVLLVRpcHMgYWJmcmFnZW4uCitzdHJpbmcgcXVlcnlfZWt0aXBzKHN0cmluZyB1c2VyKSB7CisgIGlmIChnZXR1aWQoUE8pICE9IFJPT1RJRCkgcmV0dXJuIDA7CisgIGlmICghZmluZF91c2VyaW5mbyh1c2VyKSkgcmV0dXJuIDA7CisgIHJldHVybiB1c2VybGlzdFt1c2VyLFVTRVJfRUtUSVBTXTsKK30KKworLy8gRlAtVGlwcyBhYmZyYWdlbi4KK3N0cmluZyBxdWVyeV9mcHRpcHMoc3RyaW5nIHVzZXIpIHsKKyAgaWYgKGdldHVpZChQTykgIT0gUk9PVElEKSByZXR1cm4gMDsKKyAgaWYgKCFmaW5kX3VzZXJpbmZvKHVzZXIpKSByZXR1cm4gMDsKKyAgcmV0dXJuIHVzZXJsaXN0W3VzZXIsVVNFUl9GUFRJUFNdOworfQorCisjZGVmaW5lIFBMQVlFUlNIRUxMUyAoeyIvc3RkL3NoZWxscy9kYXJrZWxmIiwgIi9zdGQvc2hlbGxzL2R3YXJmIiwgXAorICAgICIvc3RkL3NoZWxscy9lbGYiLCAiL3N0ZC9zaGVsbHMvZmVsaW5lIiwgIi9zdGQvc2hlbGxzL2hvYmJpdCIsIFwKKyAgICAiL3N0ZC9zaGVsbHMvaHVtYW4iIH0pCisKKy8vIEFlbmRlcnQgZGllIFNoZWxscyBlaW5lcyBVc2Vycy4KK2ludCBzZXRfcGxheWVyX29iamVjdCggc3RyaW5nIHVzZXIsIHN0cmluZyBvYmplY3RuYW1lICkKK3sKKyAgICBtaXhlZCAqcGF0aDsKKyAgICBzdHJpbmcgcHJldjsKKworICAgIC8vIG51ciBFTSB1bmQgUk9PVCBkdWVyZmVuIGRpZSBTaGVsbCBlaW5lcyBDaGFyYWt0ZXJzIGFlbmRlcm4KKyAgICBpZiAoICFBUkNIX1NFQ1VSSVRZICYmCisgICAgICAgICAoIXByZXZpb3VzX29iamVjdCgpIHx8IGdldHVpZChwcmV2aW91c19vYmplY3QoKSkgIT0gUk9PVElEKSApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmICggb2JqZWN0bmFtZSA9PSAiIiApCisgICAgICAgIG9iamVjdG5hbWUgPSAwOworCisgICAgaWYgKCAhc3RyaW5ncCh1c2VyKSB8fCB1c2VyID09ICIiICkKKyAgICAgICAgcmV0dXJuIC02OworCisgICAgaWYgKCAhc3RyaW5ncChvYmplY3RuYW1lKSApeworICAgICAgICBpZiAoICFmaW5kX3VzZXJpbmZvKHVzZXIpICkKKyAgICAgICAgICAgIHJldHVybiAtNDsKKworICAgICAgICB1c2VybGlzdFt1c2VyLCBVU0VSX09CSkVDVF0gPSAwOworICAgICAgICBzYXZlX3VzZXJpbmZvKHVzZXIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAoIGNhdGNoKGxvYWRfb2JqZWN0KG9iamVjdG5hbWUpO3B1Ymxpc2gpICkgeworICAgICAgICB3cml0ZSggIkZlaGxlciBpbiAiICsgb2JqZWN0bmFtZSArICIhXG4iICk7CisgICAgICAgIHJldHVybiAtMjsKKyAgICB9CisKKyAgICBvYmplY3RuYW1lID0gX2dldF9wYXRoKCBvYmplY3RuYW1lLCAwICk7CisgICAgcGF0aCA9IChlZnVuOjpleHBsb2RlKCBvYmplY3RuYW1lLCAiLyIgKSAtICh7ICIiLCAwIH0pKTsKKworICAgIGlmICggc2l6ZW9mKHBhdGgpIDwgMyB8fCBwYXRoWzBdICE9ICJzdGQiIHx8IHBhdGhbMV0gIT0gInNoZWxscyIgKQorICAgICAgICByZXR1cm4gLTM7CisKKyAgICBpZiAoICFmaW5kX3VzZXJpbmZvKHVzZXIpICkKKyAgICAgICAgcmV0dXJuIC00OworCisgICAgcHJldiA9IHVzZXJsaXN0W3VzZXIsIFVTRVJfT0JKRUNUXTsKKyAgICB1c2VybGlzdFt1c2VyLCBVU0VSX09CSkVDVF0gPSBvYmplY3RuYW1lOworICAgIHNhdmVfdXNlcmluZm8odXNlcik7CisKKyAgICAvLyBMb2dnZW4sIGZhbGxzIGRpZSBBZW5kZXJ1bmcgbmljaHQgdm9uIExvZ2luIGJlaW0gQW5sZWdlbiBkZXMgQ2hhcnMKKyAgICAvLyBlcmZvbGd0LgorICAgIGlmIChsb2FkX25hbWUodGhpc19pbnRlcmFjdGl2ZSgpKSAhPSAiL3NlY3VyZS9sb2dpbiIKKyAgICAgICAgfHwgcHJldiAhPSAiIikgeworICAgICAgaWYgKHByZXYgPT0gIiIpIHByZXYgPSI8a2VpbmU+IjsKKyAgICAgIGNhbGxfc2VmdW4oImxvZ19maWxlIiwgIkFSQ0gvU0hFTExfQUVOREVSVU5HRU4iLAorICAgICAgICBzcHJpbnRmKCAiJXM6ICVPIGFlbmRlcnQgZGllIFNoZWxsIHZvbiAlcyB2b24gJXMgYXVmICVzIChQTzogJU8pXG4iLAorICAgICAgICAgIHN0cmZ0aW1lKCIlWSVtJWQtJUglTSVTIiksIAorICAgICAgICAgIHRoaXNfaW50ZXJhY3RpdmUoKSwgY2FwaXRhbGl6ZSh1c2VyKSwgcHJldiwgb2JqZWN0bmFtZSwKKyAgICAgICAgICBwcmV2aW91c19vYmplY3QoKSkgKTsKKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKworLy8gUGFzc3dvcnQgYWt0dWFsaXNpZXJlbi4KK2ludCB1cGRhdGVfcGFzc3dvcmQoIHN0cmluZyBvbGQsIHN0cmluZyBuZXcgKQoreworICAgIHN0cmluZyB1c2VyOworCisgICAgLy8gbmFudSwga2VpbiB1c2VyPworICAgIGlmICggIWZpbmRfdXNlcmluZm8odXNlciA9IGdldHVpZChQTykpICkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvLyB3ZW5uIGRhcyBuZXVlIFBXIHVudGVyc2NoaWVkbGljaCBpc3QsIHNjaGF1ZW4sIG9iIGRhcyBuZXVlIFBXIG9rIGlzdC4KKyAgICBpZiAoIG9sZCAhPSBuZXcgJiYgIWdvb2RfcGFzc3dvcmQoIG5ldywgdXNlciApICkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzdHJpbmcgcHdoYXNoID0gdXNlcmxpc3RbdXNlciwgVVNFUl9QQVNTV09SRF07CisgICAgc3RyaW5nIG9sZHB3aGFzaDsKKyAgICBpZiAoc2l6ZW9mKHB3aGFzaCkgPiAxMykgeworICAgICAgICAvLyBNRDUtSGFzaAorICAgICAgICBvbGRwd2hhc2ggPSBtZDVfY3J5cHQob2xkLCBwd2hhc2gpOworICAgIH0KKyAgICBlbHNlIGlmIChzaXplb2YocHdoYXNoKSA+IDIpIHsKKyAgICAgICAgLy8gQ3J5cHQtSGFzaAorICAgICAgICBvbGRwd2hhc2ggPSBjcnlwdChvbGQsIHB3aGFzaFswLi4xXSk7CisgICAgfQorCisgICAgLy8gd2VubiBlcyBlaW5lbiBQVy1oYXNoIGdpYnQsIGFsc28gZWluIFBXIGdlc2V0enQgd2lyZCwgbXVzcyBkZXIgSGFzaCB2b24KKyAgICAvLyBvbGQgbWl0IGRlbSBwd2hhc2ggdWViZXJlaW5zdGltbWVuLiBMZWVyZXIgSGFzaCBvZGVyIGdhciBrZWluIEhhc2gKKyAgICAvLyBlcmxhdWJ0IGplZGVzIGJlbGllYmlnZSBQVy4KKyAgICBpZiAoIHN0cmluZ3AocHdoYXNoKSAmJiBzaXplb2YocHdoYXNoKSAmJiBwd2hhc2ggIT0gb2xkcHdoYXNoKQorICAgICAgICByZXR1cm4gMDsKKyAgICAvLyBhbiBkaWVzZXIgU3RlbGxlIHN0aW1tdCAnb2xkJyB3b2hsIG1pdCBkZW0gZ2VzZXR6dGVuIFBhc3N3b3J0IHVlYmVyZWluLgorICAgIC8vIFdlbm4gYWxsZXJkaW5ncyBkaWUgRnVua3Rpb24gbWl0IG9sZD09bmV3IGF1ZmdlcnVmZW4gd3VyZGUsIHdpcmQgaGllcgorICAgIC8vIG51ciAxIHp1cnVlY2tnZWJlbiB1bmQgc29uc3QgYW4gc2ljaCBuaXggZ2VtYWNodC4gS2FubiBuaWNodCB3ZWl0ZXIKKyAgICAvLyBvYmVuIHNjaG9uIGdlbWFjaHQgd2VyZGVuLCBkaWUgU2hlbGxzIGRpZXMgYWxzIFBXLVBydWVmdW5nIG51dHplbi4KKyAgICAvLyAqc2V1ZnoqCisgICAgaWYgKG9sZCA9PSBuZXcpIHJldHVybiAxOworCisgICAgLy8gZGFubiBtYWwgbmV1IHNldHplbgorICAgIHVzZXJsaXN0WyB1c2VyLCBVU0VSX1BBU1NXT1JEIF0gPSBtZDVfY3J5cHQoIG5ldywgMCApOworICAgIHNhdmVfdXNlcmluZm8odXNlcik7CisjaWZkZWYgX1BVUkVGVFBEXworICAgIC8vIEJlZGF1ZXJsaWNoZXJ3ZWlzZSB2ZXJzdGVodCBwdXJlZnRwZCB1bnNlciBtZDVfY3J5cHQgbmljaHQuIDotKAorICAgIGlmIChtZW1iZXIoZnRwdXNlcix1c2VyKSkgeworICAgICAgZnRwdXNlclt1c2VyXSA9IGNyeXB0KG5ldyk7CisgICAgICBpZiAoZmluZF9jYWxsX291dCgjJ3dyaXRlX2Z0cF91c2VycykgPT0gLTEpCisgICAgICAgIGNhbGxfb3V0KCMnd3JpdGVfZnRwX3VzZXJzLDQpOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiAxOworfQorCisvLyBTcGllbGVyIGxvZXNjaGVuLgoraW50IGRlbGV0ZV9wbGF5ZXIoc3RyaW5nIHBhc3N3ZCwgc3RyaW5nIHJlYWxfbmFtZSkKK3sKKyAgaW50IHdsZXZlbDsKKyAgc3RyaW5nIHBhcnRfZmlsZW5hbWU7CisKKyAgaWYgKCFQTyB8fCBQTyE9VFAgfHwgUE8hPVRJIHx8IHJlYWxfbmFtZSAhPSBnZXR1aWQoUE8pIHx8CisgICAgICAhZmluZF91c2VyaW5mbyhyZWFsX25hbWUpKQorICAgIHJldHVybiAwOworICBtaXhlZCBlcnN0aWU9KG1peGVkKXRoaXNfaW50ZXJhY3RpdmUoKS0+UXVlcnlQcm9wKFBfU0VDT05EKTsKKyAgcGFzc3dvcmQgPSB1c2VybGlzdFtyZWFsX25hbWUsVVNFUl9QQVNTV09SRF07CisgIHdsZXZlbCA9IGdldF93aXpfbGV2ZWwocmVhbF9uYW1lKTsKKyAgaWYgKCF1cGRhdGVfcGFzc3dvcmQocGFzc3dkLCBwYXNzd2QpKSByZXR1cm4gMDsKKworICAvLyBTcGllbHBhdXNlbiBhdWZoZWJlbiAoc29uc3Qga2FubiBtYW4gYWxzIFNwaWVsZXIgbmVuIE5hbWVuIHNwZXJyZW4pLgorICBUQmFuaXNoTmFtZShyZWFsX25hbWUsIDApOworCisgIHBhcnRfZmlsZW5hbWU9Ii8iK3JlYWxfbmFtZVswLi4wXSsiLyIrcmVhbF9uYW1lKyIubyI7CisgIHJtKCIvIlNFQ1VSRURJUiIvc2F2ZSIrcGFydF9maWxlbmFtZSk7CisgIHJtKCIvIkxJQlNBVkVESVIiLyIrcGFydF9maWxlbmFtZSk7CisgIHJtKCIvIk1BSUxESVIiLyIrcGFydF9maWxlbmFtZSk7CisgIAorICBtX2RlbGV0ZSh1c2VybGlzdCxyZWFsX25hbWUpOworICAKKyAgaWYgKHdsZXZlbCA+PSBMRUFSTkVSX0xWTCkKKyAgICBUTy0+QmFuaXNoTmFtZShyZWFsX25hbWUsICJTbyBoaWVzcyBtYWwgZWluIE1hZ2llciBoaWVyIik7CisgIGVsc2UgaWYgKHdsZXZlbCA+PSBTRUVSX0xWTCkKKyAgICBUTy0+QmFuaXNoTmFtZShyZWFsX25hbWUsICJTbyBoaWVzcyBtYWwgZWluIFNlaGVyIGhpZXIiKTsKKworI2lmZGVmIF9QVVJFRlRQRF8KKyAgICBpZiAobWVtYmVyKGZ0cHVzZXIscmVhbF9uYW1lKSkgeworICAgICAgbV9kZWxldGUoZnRwdXNlcixyZWFsX25hbWUpOworICAgICAgY2FsbF9vdXQoIyd3cml0ZV9mdHBfdXNlcnMsNCk7CisgICAgfQorI2VuZGlmCisKKyAgY2FsbF9zZWZ1bigibG9nX2ZpbGUiLCAiVVNFUkRFTEVURSIsCisgICAgICAgICAgIHNwcmludGYoIiVzOiAlcyAlcyglcylcbiIsCisgICAgICAgICAgICAgICAgICAgY3RpbWUodGltZSgpKSxyZWFsX25hbWUsCisgICAgICAgICAgICAgICAgICAgKHN0cmluZ3AoZXJzdGllKT9zcHJpbnRmKCJbRXJzdGllOiAlc10gIixlcnN0aWUpOiIiKSwKKyAgICAgICAgICAgICAgICAgICBjYWxsX3NlZnVuKCJxdWVyeV9pcF9udW1iZXIiLFRJKSkpOworCisgIHJldHVybiAxOworfQorCisvLyBlcm1pdHRlbHQgYWxsZSBleGlzdGllcmVuZGVuIFNwaWVsZXIsIGRpZSBlaW4gU2F2ZWZpbGUgaW4gL3NlY3VyZS9zYXZlCisvLyBoYWJlbi4KKy8vIChbICJhIjogKHsuLi5uYW1lbi4uLn0pLCAiYiI6ICh7Li4ubmFtZW4uLi59KSwgLi4uIF0pIAorcHVibGljIG1hcHBpbmcgZ2V0X2FsbF9wbGF5ZXJzKCkgeworICBzdHJpbmcgKmRpcnM9KHsiYSIsImIiLCJjIiwiZCIsImUiLCJmIiwiZyIsImgiLCJpIiwiaiIsImsiLCJsIiwibSIsIm4iLCJvIiwKKyAgICAgICJwIiwicSIsInIiLCJzIiwidCIsInUiLCJ2IiwidyIsIngiLCJ5IiwieiJ9KTsKKyAgbWFwcGluZyBhbGxwbGF5ZXI9KFtdKTsKKyAgc3RyaW5nICp0bXA7CisgIGZvcmVhY2goc3RyaW5nIGRpcjogZGlycykgeworICAgIHRtcD1nZXRfZGlyKCIvc2VjdXJlL3NhdmUvIitkaXIrIi8qIikKKyAgICAgIC0gKHsiLiIsIi4uIiwiLktFRVAiLCIuc3ZuIn0pOworICAgIGFsbHBsYXllcltkaXJdID0gbWFwKHRtcCxmdW5jdGlvbiBzdHJpbmcgKHN0cmluZyBmbikgCisgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBleHBsb2RlKGZuLCIuIilbMF07IH0gKTsKKyAgfQorICByZXR1cm4gYWxscGxheWVyOworfQorCisvLyAqKioqKioqKioqKioqKiogaW50ZXJuZSBGdW5rdGlvbmVuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICB1c2VybGlzdD1tX2FsbG9jYXRlKDAsMTIpOworICB1cGRhdGVfbGF0ZV9wbGF5ZXJzKCk7CisjaWZkZWYgX1BVUkVGVFBEXworICByZWFkX2Z0cF91c2VycygpOworI2VuZGlmCit9CisKKy8vdmVyc3RvcmJlbmUgU3BpZWxlciBlaW5sZXNlbgordm9pZCB1cGRhdGVfbGF0ZV9wbGF5ZXJzKCkgeworICBzdHJpbmcgcmVhZDsKKyAgc3RyaW5nICp0bXA7CisgIAorICBsYXRlcGxheWVycz0wOworICAKKyAgcmVhZD1yZWFkX2ZpbGUoIi8iU0VDVVJFRElSIi9MQVRFX1BMQVlFUlMiKTsKKyAgaWYoIXJlYWQgfHwgcmVhZD09IiIpCisgIHsKKyAgICByZXR1cm47CisgIH0KKyAgCisgIHRtcD1leHBsb2RlKHJlYWQsIlxuIik7CisgIGlmKCFzaXplb2YodG1wKSkKKyAgeworICAgIHJldHVybjsKKyAgfSAgICAgICAgIAorICAKKyAgbGF0ZXBsYXllcnM9dG1wOyAKK30KKworCisvLyBEYXRlbiBhdXMgZGVyIFVzZXJsaXN0IGlua2wuIFBhc3N3b3J0aGFzaCB6dXJ1ZWNrbGllZmVybi4gTWFjaHQgZ2dmLgorLy8gZmluZF91c2VyaW5mbygpLiBOdXIgbWFzdGVyaW50ZXJuIGF1ZnJ1ZmJhci4KK3Byb3RlY3RlZCBtaXhlZCAqZ2V0X2Z1bGxfdXNlcmluZm8oc3RyaW5nIHVzZXIpIHsKKyAgaWYoIXVzZXJ8fHVzZXI9PSIiKQorICAgIHJldHVybiAwOworICB1c2VyPWV4cGxvZGUodXNlciwiLiIpWzBdOworICBpZiAoIW1lbWJlcih1c2VybGlzdCx1c2VyKSAmJiAhZmluZF91c2VyaW5mbyh1c2VyKSkKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4oe3VzZXIsdXNlcmxpc3RbdXNlcixVU0VSX1BBU1NXT1JEXSx1c2VybGlzdFt1c2VyLFVTRVJfTEVWRUxdLAorICAgICAgdXNlcmxpc3RbdXNlcixVU0VSX0RPTUFJTl0sIHVzZXJsaXN0W3VzZXIsVVNFUl9PQkpFQ1RdLAorICAgICAgdXNlcmxpc3RbdXNlcixVU0VSX0NSRUFUSU9OX0RBVEVdLCAwLCAwLCB1c2VybGlzdFt1c2VyLFVTRVJfR1VJTERdLAorICAgICAgdXNlcmxpc3RbdXNlcixVU0VSX0VLVElQU10sdXNlcmxpc3RbdXNlcixVU0VSX0ZQVElQU10sCisgICAgICB1c2VybGlzdFt1c2VyLFVTRVJfVUlEU19UT19UQUtFX0NBUkVdfSk7Cit9CisKKy8vIFVzZXJkYXRlbiBhdXMgZGVyIFVzZXJsaXN0IGltIFNhdmVmaWxlIGluIC9zZWN1cmUvc2F2ZS8gc3BlaWNoZXJuLgorcHJvdGVjdGVkIHZvaWQgc2F2ZV91c2VyaW5mbyhzdHJpbmcgdXNlcikgeworICBpZighdXNlcnx8dXNlcj09IiIpCisgICAgcmV0dXJuOworICB1c2VyPWV4cGxvZGUodXNlciwiLiIpWzBdOworICBpZiAoIW1lbWJlcih1c2VybGlzdCx1c2VyKSkgcmV0dXJuOworICBuYW1lID0gdXNlcjsKKyAgbGV2ZWwgPSB1c2VybGlzdFtuYW1lLFVTRVJfTEVWRUxdOworICBkb21haW5zID0gdXNlcmxpc3RbbmFtZSxVU0VSX0RPTUFJTl07CisgIHNoZWxsID0gdXNlcmxpc3RbbmFtZSxVU0VSX09CSkVDVF07CisgIHBhc3N3b3JkID0gdXNlcmxpc3RbbmFtZSxVU0VSX1BBU1NXT1JEXTsKKyAgY3JlYXRpb25fZGF0ZSA9IHVzZXJsaXN0W25hbWUsVVNFUl9DUkVBVElPTl9EQVRFXTsKKyAgaWYgKCFjcmVhdGlvbl9kYXRlKSBjcmVhdGlvbl9kYXRlID0gLTE7CisgIGVwID0gdXNlcmxpc3RbbmFtZSxVU0VSX0VQXTsKKyAgaWYgKCFlcCkgZXA9IiI7CisgIGVrID0gdXNlcmxpc3RbbmFtZSxVU0VSX0VLXTsKKyAgaWYgKCFlaykgZWs9IiI7CisgIG1xID0gdXNlcmxpc3RbbmFtZSxVU0VSX01RXTsKKyAgaWYgKCFtcSkgbXE9IiI7CisgIGd1aWxkcyA9IHVzZXJsaXN0W25hbWUsVVNFUl9HVUlMRF07CisgIGVrdGlwcz11c2VybGlzdFtuYW1lLFVTRVJfRUtUSVBTXTsKKyAgaWYoIWVrdGlwcykgZWt0aXBzPSIiOworICBmcHRpcHM9dXNlcmxpc3RbbmFtZSxVU0VSX0ZQVElQU107CisgIGlmKCFmcHRpcHMpIGZwdGlwcz0iIjsKKyAgdWlkc3RvdGFrZWNhcmU9dXNlcmxpc3RbbmFtZSxVU0VSX1VJRFNfVE9fVEFLRV9DQVJFXTsKKworICBpZiAoc2F2ZV9vYmplY3QoU0VDVVJFU0FWRVBBVEgrbmFtZVswLi4wXSsiLyIrbmFtZSkgIT0gMCkgeworICAgIC8vIGF1dHNjaC4gQnVnZ2VuIGRhbWl0IGRpZXNlciBtb2VnbGljaHN0IHNjaG5lbGwgYXVmZmFlbGx0LCBkYXNzIGhpZXIKKyAgICAvLyBTYXZlZmlsZXMgaW4gL3NlY3VyZS9zYXZlLyBuaWNodCBnZXNjaHJpZWJlbiB3dXJkZW4uCisgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigKKyAgICAgICAgICAiU2F2ZWZpbGUgJU8ga29ubnRlIG5pY2h0IGVyc3RlbGx0IHdlcmRlbiFcbiIsCisgICAgICAgICAgU0VDVVJFU0FWRVBBVEgrbmFtZVswLi4wXSsiLyIrbmFtZSkpOworICB9Cit9CisKKy8vIEluIHdlbGNoZW4gUmVnaW9uZW4gaXN0IGRlciBTcGllbGVyIFJlZ2lvbnNtYWdpZXI/Citwcm90ZWN0ZWQgdm9pZCBzZXRfZG9tYWlucyhzdHJpbmcgcGxheWVyLCBzdHJpbmcgKmRvbWFpbnMpCit7CisgIC8vIHdlbm4gZGVyIE1hZ2llciBqZXR6dCBEb21haW5zIG5pY2h0IG1laHIgaGF0LCBtdWVzc2VuIGRpZSBhdXMgJ3VzZXJpZHMnCisgIC8vIGVudGZlcm50IHdlcmRlbiwgZGFzIHVlYmVybmltbXQgUmVtb3ZlV2l6YXJkRnJvbVVJRCgpLgorICBpZiAocG9pbnRlcnAodXNlcmxpc3RbcGxheWVyLCBVU0VSX0RPTUFJTl0pKSB7CisgICAgc3RyaW5nICpyZW1vdmVkdWlkcz0KKyAgICAgICgoc3RyaW5nKil1c2VybGlzdFtwbGF5ZXIsIFVTRVJfRE9NQUlOXSB8IGRvbWFpbnMpIC0gZG9tYWluczsKKyAgICBmb3JlYWNoKHN0cmluZyB1aWQ6IHJlbW92ZWR1aWRzKQorICAgICAgUmVtb3ZlV2l6YXJkRnJvbVVJRCh1aWQsIHBsYXllcik7CisgIH0KKyAgLy8gZ2VjYWNodGVzIEFsaWFzIGZ1ZXIgcGxheWVyIGxvZXNjaGVuCisgIG1fZGVsZXRlKHVpZGFsaWFzZSxwbGF5ZXIpOworICB1c2VybGlzdFtwbGF5ZXIsIFVTRVJfRE9NQUlOXT1kb21haW5zOworICBzYXZlX3VzZXJpbmZvKHBsYXllcik7CisgIC8vIFVJRC16dS1NYWdpZXItTWFwcGluZyBha3R1YWxpc2llcmVuCisgIFF1ZXJ5VUlEc0ZvcldpemFyZChwbGF5ZXIpOworfQorCisvLyBJbiB3ZWxjaGUgR2lsZGVuIGlzdCBkZXIgU3BpZWxlciBHaWxkZW5tYWdpZXI/Citwcm90ZWN0ZWQgdm9pZCBzZXRfZ3VpbGRzKHN0cmluZyBwbGF5ZXIsIHN0cmluZyAqZ3VpbGRzKQoreworICAvLyB3ZW5uIGRlciBNYWdpZXIgamV0enQgR2lsZGVuIG5pY2h0IG1laHIgaGF0LCBtdWVzc2VuIGRpZSBhdXMgJ3VzZXJpZHMnCisgIC8vIGVudGZlcm50IHdlcmRlbiwgZGFzIHVlYmVybmltbXQgUmVtb3ZlV2l6YXJkRnJvbVVJRCgpLgorICBpZiAocG9pbnRlcnAodXNlcmxpc3RbcGxheWVyLCBVU0VSX0dVSUxEXSkpIHsKKyAgICBzdHJpbmcgKnJlbW92ZWR1aWRzPQorICAgICAgKChzdHJpbmcqKXVzZXJsaXN0W3BsYXllciwgVVNFUl9HVUlMRF0gfCBndWlsZHMpIC0gZ3VpbGRzOworICAgIGZvcmVhY2goc3RyaW5nIHVpZDogcmVtb3ZlZHVpZHMpCisgICAgICBSZW1vdmVXaXphcmRGcm9tVUlEKHVpZCwgcGxheWVyKTsKKyAgfQorICAvLyBnZWNhY2h0ZXMgQWxpYXMgZnVlciBwbGF5ZXIgbG9lc2NoZW4KKyAgbV9kZWxldGUodWlkYWxpYXNlLHBsYXllcik7CisgIHVzZXJsaXN0W3BsYXllciwgVVNFUl9HVUlMRF09Z3VpbGRzOworICBzYXZlX3VzZXJpbmZvKHBsYXllcik7CisgIC8vIFVJRC16dS1NYWdpZXItTWFwcGluZyBha3R1YWxpc2llcmVuCisgIFF1ZXJ5VUlEc0ZvcldpemFyZChwbGF5ZXIpOworfQorCisvLyBVc2VyaW5mby1DYWNoZSBleHBpcmVuLi4uCitwcm90ZWN0ZWQgdm9pZCBfY2xlYW51cF91aW5mbygpCit7CisgICAgZm9yZWFjaChzdHJpbmcgdXNlcjogdXNlcmxpc3QpIHsKKyAgICAgICAgaWYgKCh0aW1lKCkgLSB1c2VybGlzdFt1c2VyLFVTRVJfVE9VQ0hdKSA+IDE4MDAKKyAgICAgICAgICAgICYmICFjYWxsX3NlZnVuKCJmaW5kX3BsYXllciIsdXNlcikpCisgICAgICAgICAgbV9kZWxldGUodXNlcmxpc3QsdXNlcik7CisgICAgfQorfQorCisvLyBleHBhbmRpZXJ0IGVpbmlnZSAnQWxpYXNlJyBpbiBlaW4gQXJyYXkgdm9uIGFsbGVuIFVJRHMsIGZ1ZXIgZGllIHNpZQorLy8gc3RlaGVuLiBCc3A6ICJyZWdpb24iIC0+IGQucmVnaW9uLiogKyByZWdpb24gKyBkLnJlZ2lvbiwKKy8vICJ6YXViZXJlciIgLT4gR1VJTEQuemF1YmVyZXIsICJwLnNlcnZpY2UiIC0+IHAuc2VydmljZS4qIG9kZXIgYXVjaAorLy8gIm1hZ2llciIgLT4gUXVlcnlVSURzRm9yV2l6YXJkKCkuCisvLyBEYXMgZXJmb2xndCB1ZWJlciBMb29rdXAgZGVyIGVudHNwcmVjaGVuZGVuIFZlcnplaWNobmlzc2UgYXVmIGRlciBQTGF0dGUuCisvLyBEYSB6dXNhZXR6bGljaCBhdWNoIG5vY2ggamVkZSBNZW5nZSBmaW5kX3VzZXJpbmZvKCkgZGF6dSBrb21tZW4sIGlzdCBkYXMKKy8vIHJlY2h0IGF1ZndhZW5kaWcuIERhbWl0IGRhcyBnYW56ZSBuaWNodCBqZWRlc21hbCBlcmZvbGdlbiBtdXNzLCB3aXJkIGRhcworLy8gRXJnZWJuaXMgZ2VjYWNodCB1bmQgUXVlcnlVSURBbGlhcygpIG51dHp0IGRlbiBDYWNoZS4KK3ByaXZhdGUgc3RyaW5nKiBFeHBhbmRVSURBbGlhcyhzdHJpbmcgYWxpYXMsIGludCByZWMpIHsKKworICBzdHJpbmcgKnVpZHM9KHt9KTsKKworICAvLyBSZWdpb25zbmFtZT8KKyAgaWYgKGZpbGVfc2l6ZSgiLyJET01BSU5ESVIiLyIrYWxpYXMpID09IEZTSVpFX0RJUikgeworICAgIC8vZ2VuZXJlbGxlIFBzZXVkby1VSUQgJ2QucmVnaW9uJyB1bmQgJ3JlZ2lvbicgZnVlciBnZWxvZXNjaHRlCisgICAgLy9NYWdpZXIgZGllc2VyIFJlZ2lvbgorICAgIHVpZHMgKz0gKHtET01BSU5ESVIiLiIrYWxpYXMsIGFsaWFzfSk7CisgICAgLy9hbGxlIE1hZ2llci1WZXJ6ZWljaG5pc3NlIGVybWl0dGVsbjoKKyAgICBzdHJpbmcgdG1wZGlyPSIvIkRPTUFJTkRJUiIvIithbGlhcysiLyI7CisgICAgZm9yZWFjaChzdHJpbmcgZGlyOiAoZ2V0X2Rpcih0bXBkaXIrIioiKSB8fCAoe30pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAtICh7Ii4iLCIuLiIsIi5zdm4ifSkpIHsKKyAgICAgIC8vIHNjaGF1ZW4sIG9icyBuZW4gKHNpY2h0YmFyZXMpIFZlcnplaWNobmlzIGlzdCB1bmQgb2IgZGVyIE1hZ2llcgorICAgICAgLy8gZXhpc3RpZXJ0LiBMZXR6dGVyZXMgYWJlciBudXIsIGZhbGxzIGRpZSBSZWt1cnNpb25zdGllZmUgbWluLiAxMDAKKyAgICAgIC8vIGlzdCwgZGEgYmVpbSBOYWNoc2NoYXVlbiBlaW5lcyBNYWdpZXJzIG1pdCAobWVocmVyZW4pCisgICAgICAvLyBSTS1Qb3N0ZW4sIGRlciBpbiBkZXIgUmVnaW9uIFJNcyBhdXMgYW5kZXJlbiBSZWdpb25lbiBoYXQsIGxlaWNodAorICAgICAgLy8gUmVrdXJzaW9uc3RpZWZlbiB2b24gMjAgKCo0KSBhdWZ0cmV0ZW4ga29lbm5lbiwgd2VubiBub2NoIGdhcgorICAgICAgLy8ga2VpbmUgVUlEcyBpbSBDYWNoZSBzaW5kIChmaW5kX3VzZXJpbmZvKCkgcnVmdCBpbmRpcmVrdCBkaWVzZQorICAgICAgLy8gRnVua3Rpb24pLgorICAgICAgaWYgKGRpclswXSE9Jy4nIAorICAgICAgICAgICYmIGZpbGVfc2l6ZSh0bXBkaXIrZGlyKSA9PSBGU0laRV9ESVIKKyNpZiBfX01BWF9SRUNVUlNJT05fXyA+IDk5CisgICAgICAgICAgJiYgZmluZF91c2VyaW5mbyhkaXIpCisjZW5kaWYKKyAgICAgICAgICApCisgICAgICAgICAgdWlkcyArPSAoe0RPTUFJTkRJUiIuIithbGlhcysiLiIrZGlyfSk7CisgICAgfQorICB9CisgIC8vIEdpbGRlbm5hbWU/CisgIGVsc2UgaWYgKEdVSUxETUFTVEVSLT5WYWxpZEd1aWxkKGFsaWFzKSkgeworICAgICAgdWlkcyArPSAoe0dVSUxESUQiLiIrYWxpYXN9KTsKKyAgICAgIC8vaGF0IGRpZSBHaWxkZSBlaW4gUHJvamVrdHZlcnplaWNobmlzPworICAgICAgaWYgKGZpbGVfc2l6ZSgiLyJQUk9KRUNURElSIi8iK2FsaWFzKSA9PSBGU0laRV9ESVIpIHsKKyAgICAgICAgICB1aWRzICs9ICh7UFJPSkVDVERJUiIuIithbGlhc30pOworICAgICAgfQorICAgICAgLy8gamV0enQgaGFiZW4gZHVtbWVyd2Vpc2UgZGllIFNwZWxsYm9va3MgbWVpc3QgbmljaHQgZGVuIGdsZWljaGVuCisgICAgICAvLyBOYW1lbiB3aWUgZGllIEdpbGRlLiBELmguIGRpZSBHaWxkZSBtdXNzIG51biBub2NoIG5hY2ggZGVtCisgICAgICAvLyBOYW1lbiBkZXMgU3BlbGxib29rcyBnZWZyYWd0IHdlcmRlbiwgd2VpbCBkZXNzZW4gVUlEIG5pY2h0CisgICAgICAvLyB1bmJlZGluZ3QgZ2xlaWNoIGRlbSBkZXIgR2lsZGUgaXN0LiAqc2V1ZnoqCisgICAgICBzdHJpbmcgc3Bib29rOworICAgICAgb2JqZWN0IGd1aWxkOworICAgICAgY2F0Y2goZ3VpbGQ9bG9hZF9vYmplY3QoR1VJTERESVIiLyIrYWxpYXMpKTsKKyAgICAgIGlmIChvYmplY3RwKGd1aWxkKSAKKyAgICAgICAgICAmJiAoc2l6ZW9mKHNwYm9vaz0oc3RyaW5nKQorICAgICAgICAgICAgICAgICBndWlsZC0+UXVlcnlQcm9wKFBfR1VJTERfREVGQVVMVF9TUEVMTEJPT0spKSkKKyAgICAgICAgICAgICAgICAmJiBzcGJvb2shPWFsaWFzKQorICAgICAgICAgIHVpZHMgKz0gKHtHVUlMRElEIi4iK3NwYm9va30pOworICB9CisgIC8vIFNwaWVsZXIvTWFnaWVyLVVJRD8KKyAgZWxzZSBpZiAoZmluZF91c2VyaW5mbyhhbGlhcykpIHsKKyAgICAvLyB3ZW5uIHJlYyA+IDAsIHdpcmQgZWluZSBTcGllbGVyLVVJRCBhbHMgQWxpYXMgYXVmZ2VmYXNzdCB1bmQgenUgc2VpbmVuCisgICAgLy8gVUlEcyBleHBhbmRpZXJ0LiBIaWVyYmVpIGVyZm9sZ3QgYWJlciBudXIgZWluZSBSZWt1cnNpb24uCisgICAgaWYgKCFyZWMpIHVpZHMgPSBRdWVyeVVJRHNGb3JXaXphcmQoYWxpYXMsIDEpOworICAgIGVsc2UgdWlkcyA9ICh7YWxpYXN9KTsKKyAgfQorICAvLyBQcm9qZWt0a3JhbXM/IC0+IGFsbGUgU3ViZGlycyB2b24gL3AvIGF1c3NlciAvcC9zZXJ2aWNlIHNlbGJlci4KKyAgZWxzZSBpZiAoYWxpYXM9PVBST0pFQ1RESVIpIHsKKyAgICBmb3JlYWNoKHN0cmluZyBkaXI6IChnZXRfZGlyKCIvIlBST0pFQ1RESVIiLyoiKSB8fCAoe30pKQorICAgICAgICAgICAgICAgICAgICAgICAgIC0gKHsiLiIsIi4uIiwiLnN2biIsInNlcnZpY2UifSkpIHsKKyAgICAgIGlmIChkaXJbMF0hPScuJyAmJgorICAgICAgICAgIGZpbGVfc2l6ZSgiLyJQUk9KRUNURElSIi8iK2RpcikgPT0gRlNJWkVfRElSKQorICAgICAgICAgIHVpZHMgKz0gKHtQUk9KRUNURElSIi4iK2Rpcn0pOworICAgIH0KKyAgfQorICAvLyBwLnNlcnZpY2U/IC0+IEFsbGUgU3ViZGlycyB2b24gL3Avc2VydmljZS4KKyAgZWxzZSBpZiAoYWxpYXM9PVBST0pFQ1RESVIiLnNlcnZpY2UiKSB7CisgICAgZm9yZWFjaChzdHJpbmcgZGlyOiAoZ2V0X2RpcigiLyJQUk9KRUNURElSIi9zZXJ2aWNlLyoiKSB8fCAoe30pKQorICAgICAgICAgICAgICAgICAgICAgICAgIC0gKHsiLiIsIi4uIiwiLnN2biJ9KSkgeworICAgICAgaWYgKGRpclswXSE9Jy4nICYmCisgICAgICAgICAgZmlsZV9zaXplKCIvIlBST0pFQ1RESVIiL3NlcnZpY2UvIitkaXIpID09IEZTSVpFX0RJUikKKyAgICAgICAgICB1aWRzICs9ICh7UFJPSkVDVERJUiIuc2VydmljZS4iK2Rpcn0pOworICAgIH0KKyAgfQorICAvLyB3ZW5uIG5peCB6dXRyaWZmdCAtPiB1bmV4cGFuZGllcnQgenVydWVja2dlYmVuCisgIGVsc2UKKyAgICB1aWRzID0gKHthbGlhc30pOworCisgIC8vIGltIENhY2hlIHZlcm1lcmtlbgorICBpZiAoc2l6ZW9mKHVpZGFsaWFzZSkgPj0gX19NQVhfTUFQUElOR19LRVlTX18pCisgICAgICB1aWRhbGlhc2U9bV9hbGxvY2F0ZSgxKTsKKyAgLy8gYXVjaCB2ZXJtZXJrZW4sIHdlbm4ga2VpbmUgVUlEcyBlcm1pdHRlbHQgd3VyZGVuLgorICB1aWRhbGlhc2UgKz0gKFthbGlhczogdWlkc10pOworICByZXR1cm4gdWlkczsKK30KKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL21hdGVyaWFsZGIuYyBiL3NlY3VyZS9tYXRlcmlhbGRiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y3MWJjNAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9tYXRlcmlhbGRiLmMKQEAgLTAsMCArMSw5MzYgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyAtIFByb3RvdHlwZW4gdW5kIFByb3BlcnRpZXMgaW4gdGhpbmcvbWF0ZXJpYWwuaAorLy8gLSBMaXN0ZSBpbiBtYXRlcmlhbHMuaAorLy8KKy8vIFRPRE86IHByb3BlcnRpZXMuaCB1bSBtYXRlcmlhbHMuaCBlcndlaXRlcm4KKy8vCisvLyAtIGltcGxpeml0ZSBHcnVwcGVuenVvcmRudW5nIGVudGZlcm5lbiwgZGEgamV0enQgZXhwbGl6aXQgaW4KKy8vICAgRGVmaW5pdGlvbnNkYXRlaWVuIHZvcmhhbmRlbgorLy8gLSBNYXRlcmlhbGRva3UgdWViZXJhcmJlaXRlbiwgZGFiZWkgSGlud2VpcyBhdWYgbmljaHQgbWVociBpbXBsaXppdGUKKy8vICAgR3J1cHBlbnp1b3JkbnVuZworLy8gL3AvZGFlbW9uL21hdGVyaWFsZGIuYyAtLSBNYXRlcmlhbGRhdGVuYmFuaworLy8KKy8vICRJZDogbWF0ZXJpYWxkYi5jIDg3NTUgMjAxNC0wNC0yNiAxMzoxMzo0MFogWmVzc3RyYSAkCisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIG5vX2luaGVyaXQKKyNwcmFnbWEgbm9fc2hhZG93CisjcHJhZ21hIHBlZGFudGljCisKKy8vIERpZSBQcm9wZXJ0eWRlZmluaXRpb24gcmVpbmhvbGVuCisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDx0aGluZy9kZXNjcmlwdGlvbi5oPgorLy8gTWF0ZXJpYWxsaXN0ZSBuaWNodCBtaXQgcmVpbnppZWhlbgorI2RlZmluZSBfU0tJUF9NQVRFUklBTFNfCisjaW5jbHVkZSA8dGhpbmcvbWF0ZXJpYWwuaD4KKyNpbmNsdWRlIDxwbGF5ZXIvZGVzY3JpcHRpb24uaD4KKyNpbmNsdWRlIDxydGxpbWl0cy5oPgorCisvLyBCYXNpc3ZlcnplaWNobmlzIGRlciBNYXRlcmlhbGllbgorI2RlZmluZSBNQVRfRElSICIvZG9jL21hdGVyaWFscyIKKworLy8gQXVzZ2FiZXZlcnplaWNobmlzIGZ1ZXIgRG9rdQorI2RlZmluZSBET0NfRElSKHgpICgiL2RvYy9tYXRlcmlhbHMvIit4KQorCisvLyBEYXRlaW5hbWUgZGVzIEhlYWRlcnMgbWl0IE1hdGVyaWFsZGVmaW5pdGlvbmVuCisjZGVmaW5lIEhFQURFUkZJTEUgIi9zeXMvbWF0ZXJpYWxzLmgiCisKKy8vIFNhdmVmaWxlLgorI2RlZmluZSBTQVZFRklMRSBET0NfRElSKCJtYXRlcmlhbGRiIikKKworLy8gUmVpbiBpbnRlcm4gdmVyd2VuZGV0ZSBOYW1lbgorI2RlZmluZSBQX1JFQ09DICJyZWNvZ25pemFiaWxpdHkiCisjZGVmaW5lIFBfSUQgICAgImlkIgorI2RlZmluZSBQX0RFRlNUUiAiZGVmc3RyIgorI2RlZmluZSBQX01FTUJFUlMgIm1lbWJlcnMiCisjZGVmaW5lIFBfTUdfRlJBQ1RJT05TICJtZ19mcmFjdGlvbnMiCisKKyNkZWZpbmUgTE9HX0VSUk9SKHgpIGlmKGZpbmRfcGxheWVyKCJyYXNjaGF1YSIpJiZmaW5kX3BsYXllcigicmFzY2hhdWEiKS0+UXVlcnlQcm9wKCJtZGItZGVidWciKSl0ZWxsX29iamVjdChmaW5kX3BsYXllcigicmFzY2hhdWEiKSwiTURCLUVycm9yOiIreCkKKyNkZWZpbmUgTE9HX1dBUk4oeCkgaWYoZmluZF9wbGF5ZXIoInJhc2NoYXVhIikmJmZpbmRfcGxheWVyKCJyYXNjaGF1YSIpLT5RdWVyeVByb3AoIm1kYi1kZWJ1ZyIpKXRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJyYXNjaGF1YSIpLCJNREItV2FybjoiK3gpCisKKy8vIFByb3RvdHlwZXM6CisvLyAoTGllZmVydCBkZW4gQW50ZWlsIGRlciBNYXRlcmlhbGdydXBwZSBncnAgYW4gbWF0cykKK2ludCBNYXRlcmlhbEdyb3VwKG1hcHBpbmcgbWF0cywgc3RyaW5nIGdycCk7CisvLyBLb252ZXJ0aWVydCBlaW5lIExpc3RlIHZvbiBNYXRlcmlhbGllbiB6dSBpaHJlbiBOYW1lbiwgZGFiZWkgd2lyZCBkaWUKKy8vIEVya2VubnVuZ3NmYWVoaWdrZWl0IGJlcnVlY2tzaWNodGlndCB1bmQgZXZ0bC4gZmFsc2NoIGVya2FubnQKK3ZhcmFyZ3Mgc3RyaW5nIENvbnZNYXRlcmlhbExpc3QobWl4ZWQgbWF0cywgaW50IGNhc3VzLCBtaXhlZCBpZGluZik7Cit2YXJhcmdzIHN0cmluZyBNYXRlcmlhbE5hbWUoc3RyaW5nIG1hdCwgaW50IGNhc3VzLCBtaXhlZCBpZGluZik7CisvLyBHaWJ0IGRlbiBOYW1lbiBlaW5lciBNYXRlcmlhbGdydXBwZSB6dXJ1ZWNrCitzdHJpbmcgR3JvdXBOYW1lKHN0cmluZyBncnApOworLy8gR2lidCBhbGxlIE1hdGVyaWFsaWVuIHp1cnVlY2sKK3N0cmluZyAqQWxsTWF0ZXJpYWxzKCk7CisvLyBHaWJ0IGFsbGUgR3J1cHBlbiB6dXJ1ZWNrCitzdHJpbmcgKkFsbEdyb3VwcygpOworLy8gR2lidCBhbGxlIEdydXBwZW4genVydWVjaywgaW4gZGVuZW4gbWF0IGVudGhhbHRlbiBpc3QKK3N0cmluZyAqR2V0TWF0TWVtYmVyc2hpcChzdHJpbmcgbWF0KTsKKy8vIEdpYnQgYWxsZSBNYXRlcmlhbGllbiB6dXJ1ZWNrLCBkaWUgaW4gZ3JwIGVudGhhbHRlbiBzaW5kCitzdHJpbmcgKkdldEdyb3VwTWVtYmVycyhzdHJpbmcgZ3JwKTsKKy8vIEVybmV1ZXJ0IGRpZSBNYXRlcmlhbGllbiBkdXJjaCBTY2FubmVuIGRlcyBNYXRlcmlhbHZlcnplaWNobmlzc2VzCit2b2lkIFVwZGF0ZSgpOworLy8gZ2VuZXJpZXJ0IEhlYWRlcmZpbGUgYXVzIGRlbiBEYXRlbgordmFyYXJncyB2b2lkIEdlbkhlYWRlckZpbGUoc3RyaW5nIGZuKTsKKworbWFwcGluZyBtYXRlcmlhbHM7CittYXBwaW5nIG1hdGVyaWFsX2dyb3VwczsKK3ByaXZhdGUgc3RhdHVzIGluaXRpYWxpemVkOworbWFwcGluZyBvbGRfbWF0X2tleXM7ICAgICAvLyBBbHRlciBNYXRlcmlhbGtleSAtPiBuZXVlciBLZXkgKEtvbXBhdGliaWxpdGFldCkKK25vc2F2ZSBtYXBwaW5nIG5ld19tYXRlcmlhbHM7ICAgICAgIC8vIE1hdGVyaWFsaWVuIHdhZWhyZW5kIGRlcyBTY2FubmVucworbm9zYXZlIG1hcHBpbmcgbmV3X21hdGVyaWFsX2dyb3VwczsgLy8gTWF0ZXJpYWxncnVwcGVuIHdhZWhyZW5kIGRlcyBTY2FubmVucworcHJpdmF0ZSBub3NhdmUgc3RhdHVzIGlzU2Nhbm5pbmc7Citwcml2YXRlIG5vc2F2ZSBpbnQgdXBkYXRlVGlja3M7CisKK3ZvaWQgY3JlYXRlKCkgeworICBzZXRldWlkKGdldHVpZCgpKTsKKyAgLy8gU2F2ZWZpbGUgZWlubGVzZW4sIGZhbGxzIG1vZWdsaWNoLCBkYW1pdCBkaWUgREIgZGlyZWt0IGluaXRpYWxpc2VydCBpc3QsCisgIC8vIHdlbm4gYXVjaCBnZ2YuIG1pdCBhbHRlbiBEYXRlbi4KKyAgcmVzdG9yZV9vYmplY3QoU0FWRUZJTEUpOworICBpZiAoaW5pdGlhbGl6ZWQpIHsKKyAgICAvLyBmYWxscyBlcmZvbGdyZWljaCwgZGlyZWt0IEhlYWRlciBmdWVyIGRpZSBNdWRsaWIgc2NocmVpYmVuCisgICAgR2VuSGVhZGVyRmlsZSgpOworICB9CisgIC8vIGpldHp0IFVwZGF0ZSBkZXIgRGF0ZW4gZHVyY2hmdWVocmVuLgorICBVcGRhdGUoKTsKK30KKworLy89PT09PT09PT09PT09PT09PT09PSBVbXdhbmRlbG4gZGVyIFN0cmluZ3MgYXVzIGRlciB0aGluZy9tYXRlcmlhbC5oCitwcml2YXRlIHN0cmluZyBnZXRNYXRJZChzdHJpbmcga2V5KSB7CisgIC8vIEFsdGUgQmV6ZWljaG5lciB1bXdhbmRlbG4KKyAgaWYgKCFtZW1iZXIobWF0ZXJpYWxzLCBrZXkpKQorICAgIGtleSA9IG9sZF9tYXRfa2V5c1trZXldOworICByZXR1cm4ga2V5OworfQorcHJpdmF0ZSBzdHJpbmcgZ2V0TWF0R3JvdXBJZChzdHJpbmcga2V5KSB7CisgIC8vIEFsdGUgQmV6ZWljaG5lciB1bXdhbmRlbG4KKyAgaWYgKCFtZW1iZXIobWF0ZXJpYWxfZ3JvdXBzLCBrZXkpKQorICAgIGtleSA9ICJNQVRHUk9VUF8iK3VwcGVyc3RyaW5nKGtleVszLi5dKTsKKyAgcmV0dXJuIGtleTsKK30KK3ByaXZhdGUgc3RyaW5nIG1hdEtleTJEZWZzdHIoc3RyaW5nIGtleSwgbWFwcGluZyBtYXRzKSB7CisgIHN0cmluZyBpZDsKKyAgaWYgKG1lbWJlcihtYXRzW2tleV0sIFBfREVGU1RSKSkKKyAgICBpZCA9IG1hdHNba2V5XVtQX0RFRlNUUl07CisgIGVsc2UKKyAgICBpZCA9IGtleTsKKyAgcmV0dXJuIGlkOworfQorcHJpdmF0ZSBzdHJpbmcgZ3JvdXBLZXkyRGVmc3RyKHN0cmluZyBrZXkpIHsKKyAgaWYgKHNpemVvZihrZXkpID4gOSkKKyAgICBrZXkgPSAibWdfIitsb3dlcnN0cmluZyhrZXlbOS4uXSk7CisgIGVsc2UKKyAgICBrZXkgPSAiIjsKKyAgcmV0dXJuIGtleTsKK30KKworLy89PT09PT09PT09PT09PT09PT09PSBTY2huaXR0c3RlbGxlbmZ1bmt0aW9uZW4genVyIFZlcndlbmR1bmcgZGVyIERCCit2YXJhcmdzIHN0cmluZyBNYXRlcmlhbE5hbWUoc3RyaW5nIG1hdCwgaW50IGNhc3VzLCBtaXhlZCBpZGluZikgeworICBpZiAoaW5pdGlhbGl6ZWQpIHsKKyAgICBzdHJpbmcgKm5hbWVzOworICAgIG1hcHBpbmcgcHJvcHM7CisgICAgbWl4ZWQgKmRpZjsKKyAgICAvLyBBbnBhc3NlbiBkZXIgTWF0ZXJpYWxpZAorICAgIG1hdCA9IGdldE1hdElkKG1hdCk7CisKKyAgICBpZiAoIW1hcHBpbmdwKHByb3BzPW1hdGVyaWFsc1ttYXRdKSkKKyAgICAgIHByb3BzPShbXSk7CisKKyAgICAvLyBKZSBuYWNoIEtvZW5uZW4gZGVzIFNwaWVsZXJzIGthbm4gbWFuIGRhcyBleGFrdGUgTWF0ZXJpYWwKKyAgICAvLyBtZWhyIG9kZXIgd2VuaWdlciBndXQgZXJrZW5uZW46CisgICAgaWYgKHBvaW50ZXJwKGRpZj1wcm9wc1tQX1JFQ09DXSkKKyYmICghaW50cChpZGluZil8fGlkaW5mPDEwMCkgKSB7IC8vIDEwMD1leGFrdGUgRXJrZW5udW5nCisgICAgICBpbnQgaSwgbiwgcmVjdmFsOworICAgICAgbWl4ZWQgKmdycHMsIHRtcCwgeDsKKworICAgICAgcmVjdmFsPTA7CisgICAgICBncnBzPXByb3BzW1BfTUdfRlJBQ1RJT05TXTsKKyAgICAgIGlmICghcG9pbnRlcnAoaWRpbmYpKQorICAgICAgICBpZGluZj0oe2lkaW5mfSk7CisKKyAgICAgIC8vIFp1bmFlY2hzdCBkaWUgRmFlaGlna2VpdCBkZXMgU3BpZWxlcnMgKGRhIGtvZW5uZW4gbm9jaAorICAgICAgLy8gR2lsZGVuZmFlaGlna2VpdGVuIGhpbnp1IGtvbW1lbikgZXJtaXR0ZWxuLCBkaWVzZXMKKyAgICAgIC8vIE1hdGVyaWFsIHp1IGVya2VubmVuOgorICAgICAgaT1zaXplb2YoaWRpbmYpOworICAgICAgd2hpbGUoaS0tKSB7CisgICAgICAgIHRtcD1pZGluZltpXTsKKyAgICAgICAgaWYgKG9iamVjdHAodG1wKSkgLy8gRGllc2UgUHJvcGVydHkgaXN0IGhhdXB0c2FlY2hsaWNoIGZ1ZXIgUmFzc2VuOgorICAgICAgICAgIHRtcD10bXAtPlF1ZXJ5UHJvcChQX01BVEVSSUFMX0tOT1dMRURHRSk7CisgICAgICAgIGlmIChpbnRwKHRtcCkpIHsKKyAgICAgICAgICByZWN2YWwrPXRtcDsgLy8gQWxsZ2VtZWluZSBFcmtlbm51bmdzZmFlaGlna2VpdAorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChjbG9zdXJlcCh0bXApICYmIGludHAoeD1mdW5jYWxsKHRtcCxtYXQsZ3JwcykpKSB7CisgICAgICAgICAgcmVjdmFsKz14OworICAgICAgICAgIGJyZWFrOyAvLyBDbG9zdXJlcyBrb2VubmVuIGltbWVyIG51ZXR6bGljaCBzZWluIDopCisgICAgICAgIH0KKyAgICAgICAgaWYgKG1hcHBpbmdwKHRtcCkpIHsKKyAgICAgICAgICBpbnQgajsKKyAgICAgICAgICBpZiAoKHg9dG1wW21hdF0pICYmIGludHAoeCkpeworICAgICAgICAgICAgLy8gRXJrZW5udW5nIHZvbiBzcGV6aWVsbCBkaWVzZW0gTWF0ZXJpYWwKKyAgICAgICAgICAgIHJlY3ZhbCs9eDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICAvLyBFcmtlbm51bmcgdm9uIEdydXBwZW4KKyAgICAgICAgICBqPXNpemVvZihncnBzKTsKKyAgICAgICAgICB3aGlsZShqLS0pCisgICAgICAgICAgICBpZigoeD10bXBbZ3Jwc1tqXV0pICYmIGludHAoeCkpCisgICAgICAgICAgICAgIHJlY3ZhbCs9eDsKKyAgICAgICAgICBpZiAocG9pbnRlcnAodG1wPXRtcFtNQVRFUklBTF9TWU1NRVRSSUNfUkVDT0dOSVpBQklMSVRZXSkpIHsKKyAgICAgICAgICAgIGZvciAoaj1zaXplb2YodG1wKS0yO2o+PTA7ai09MikgeworICAgICAgICAgICAgICBpZiAoIWludHAoeD10bXBbaisxXSkpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoIm1hdGVyaWFsZGI6IGlsbGVnYWwgc3ltLnJlY29jLiBmb3JtYXRcbiIpOworICAgICAgICAgICAgICBpZiAocHJvcHNbdG1wW2pdXSkKKyAgICAgICAgICAgICAgICByZWN2YWwrPXg7CisgICAgICAgICAgICAgIGVsc2UgLy8gYmVpIHBhc3NlbmRlbiBHcnVwcGVuICssIGJlaSBhbmRlcmVuIC0KKyAgICAgICAgICAgICAgICByZWN2YWwtPXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIEpldHp0IHdpcmQgZXJtaXR0ZWx0LCBvYiB2aWVsbGVpY2h0IGVpbmUgdW5nZW5hdWVyZQorICAgICAgLy8gQmVzY2hyZWlidW5nIGdlZ2ViZW4gd2VyZGVuIHNvbGw6CisgICAgICB4PWRpZlswXTsKKyAgICAgIG4gPSBzaXplb2YoZGlmKS0xOworICAgICAgZm9yIChpPTI7aTw9bjtpKz0yKSB7CisgICAgICAgIGlmIChyZWN2YWw+PWRpZltpLTFdKQorICAgICAgICAgIHg9ZGlmW2ldOworICAgICAgfQorICAgICAgLy8gV2VubiBkaWUgRmFlaGlna2VpdGVuIGRlcyBTcGllbGVycyBuaWNodCBmdWVyIGRlbiBlY2h0ZW4gS2xhcm5hbWVuCisgICAgICAvLyBhdXNyZWljaGVuLCBnaWIgZGllIEFsdGVybmF0aXZlIHp1cnVlY2s6CisgICAgICBpZiAoeCE9bWF0KQorICAgICAgICByZXR1cm4gTWF0ZXJpYWxOYW1lKHgsIGNhc3VzLCAxMDApOworICAgIH0KKworICAgIGlmICghcG9pbnRlcnAobmFtZXM9cHJvcHNbUF9OQU1FXSkgfHwgc2l6ZW9mKG5hbWVzKTw0KQorICAgICAgbmFtZXM9KHsidW5iZWthbm50ZXMgTWF0ZXJpYWwiLCAidW5iZWthbm50ZW4gTWF0ZXJpYWxzIiwKKyAgICAgICAgICAgICAgInVuYmVrYW5udGVtIE1hdGVyaWFsIiwgInVuYmVrYW5udGVuIE1hdGVyaWFsIn0pOworICAgIGlmIChjYXN1czwwIHx8IGNhc3VzPjMpCisgICAgICBjYXN1cz0wOworICAgIHJldHVybiBuYW1lc1tjYXN1c107CisgIH0KK30KKwordmFyYXJncyBzdHJpbmcgQ29udk1hdGVyaWFsTGlzdChtaXhlZCBtYXRzLCBpbnQgY2FzdXMsIG1peGVkIGlkaW5mKSB7CisgIGlmIChpbml0aWFsaXplZCkgeworICAgIHN0cmluZyAqbXMsbWw7CisgICAgaW50IGk7CisKKyAgICBtbD0iIjsKKyAgICBpZiAobWFwcGluZ3AobWF0cykpCisgICAgICBtcz1tX2luZGljZXMobWF0cyk7CisgICAgZWxzZSBpZiAoc3RyaW5ncChtYXRzKSkKKyAgICAgIG1zPSh7bWF0c30pOworICAgIGVsc2UgaWYgKHBvaW50ZXJwKG1hdHMpKQorICAgICAgbXM9bWF0czsKKyAgICBlbHNlCisgICAgICBtcz0oe30pOworICAgIGk9c2l6ZW9mKG1zKTsKKyAgICB3aGlsZShpKSB7CisgICAgICBtbCs9TWF0ZXJpYWxOYW1lKG1zWy0taV0sY2FzdXMsaWRpbmYpOworICAgICAgaWYgKGkpCisgICAgICAgIG1sKz0oKGk+MSk/IiwgIjoiIHVuZCAiKTsKKyAgICB9CisgICAgcmV0dXJuIG1sOworICB9Cit9CisKK2ludCBNYXRlcmlhbEdyb3VwKG1hcHBpbmcgbWF0cywgc3RyaW5nIGdycCkgeworICAgaWYgKGluaXRpYWxpemVkKSB7CisgICAgIHN0cmluZyAqbXM7CisgICAgIGludCBpLHJlczsKKworICAgICByZXM9MDsKKyAgICAgaWYgKCFtYXBwaW5ncChtYXRzKSB8fCAhc3RyaW5ncChncnApKQorICAgICAgIHJldHVybiByZXM7CisgICAgIG1zPW1faW5kaWNlcyhtYXRzKTsKKyAgICAgaT1zaXplb2YobXMpOworICAgICB3aGlsZShpLS0pIHsKKyAgICAgICBzdHJpbmcgbWF0OworICAgICAgIG1hcHBpbmcgcHJvcHM7CisgICAgICAgbWF0PW1zW2ldOworICAgICAgIGlmIChtYXBwaW5ncChwcm9wcz1tYXRlcmlhbHNbZ2V0TWF0SWQobWF0KV0pKQorICAgICAgICAgcmVzKz0obWF0c1ttYXRdKnByb3BzW1BfTUdfRlJBQ1RJT05TXVtnZXRNYXRHcm91cElkKGdycCldKS8xMDA7CisgICAgIH0KKyAgICAgaWYgKHJlczwtMTAwKSAvLyBWaWVsbGVpY2h0IG5vY2ggQW50aW1hdGVyaWUgenVsYXNzZW4KKyAgICAgICByZXM9LTEwMDsgICAvLyAobm9jaCBuaWNodCBzaWNoZXIgb2IgZGFzIHNvIGJsZWliZW4gd2lyZCBvZGVyIDAgc2VpbiB3aXJkKQorICAgICBpZiAocmVzPjEwMCkKKyAgICAgICByZXM9MTAwOworICAgICByZXR1cm4gcmVzOworICAgfQorfQorCitzdHJpbmcgKkFsbE1hdGVyaWFscygpIHsKKyAgaWYgKGluaXRpYWxpemVkKSB7CisgICAgLy8gQXVzIEtvbXBhdGliaWxpdGFldHNncnVlbmRlbiBkaWUgYWx0ZW4gU2NobHVlc3NlbCAoI2RlZmluZS1TdHJpbmcpCisgICAgLy8genVydWVja2dlYmVuCisgICAgcmV0dXJuIG1faW5kaWNlcyhvbGRfbWF0X2tleXMpOworICB9CisgIHJldHVybiAwOworfQorCitzdHJpbmcgKkFsbEdyb3VwcygpIHsKKyAgaWYgKGluaXRpYWxpemVkKSB7CisgICAgLy8gQXVzIEtvbXBhdGliaWxpdGFldHNncnVlbmRlbiBkaWUgYWx0ZW4gU2NobHVlc3NlbCAoI2RlZmluZS1TdHJpbmcpCisgICAgLy8genVydWVja2dlYmVuCisgICAgcmV0dXJuIG1hcChtX2luZGljZXMobWF0ZXJpYWxfZ3JvdXBzKSwgIydncm91cEtleTJEZWZzdHIpOworICB9CisgIHJldHVybiAwOworfQorCitzdHJpbmcgKkdldE1hdE1lbWJlcnNoaXAoc3RyaW5nIG1hdCkgeworICBpZiAoaW5pdGlhbGl6ZWQpIHsKKyAgICBtYXBwaW5nIHByb3BzOworICAgIC8vIEFucGFzc2VuIGRlciBNYXRlcmlhbGlkCisgICAgbWF0ID0gZ2V0TWF0SWQobWF0KTsKKworICAgIGlmICghbWFwcGluZ3AocHJvcHM9bWF0ZXJpYWxzW21hdF0pKQorICAgICAgcmV0dXJuICh7fSk7CisgICAgcmV0dXJuIG1hcChtX2luZGljZXMocHJvcHNbUF9NR19GUkFDVElPTlNdKSwgIydncm91cEtleTJEZWZzdHIpOworICB9CisgIHJldHVybiAwOworfQorCitzdHJpbmcgKkdldEdyb3VwTWVtYmVycyhzdHJpbmcgZ3JwKSB7CisgIGlmIChpbml0aWFsaXplZCkgeworICAgIHN0cmluZyAqbWF0czsKKyAgICAvLyBBbnBhc3NlbiBkZXIgTWF0ZXJpYWxpZAorICAgIGdycCA9IGdldE1hdEdyb3VwSWQoZ3JwKTsKKyAgICBpZiAoIW1lbWJlcihtYXRlcmlhbF9ncm91cHMsIGdycCkgfHwKKwkhcG9pbnRlcnAobWF0cz1tYXRlcmlhbF9ncm91cHNbZ3JwXVtQX01FTUJFUlNdKSkKKyAgICAgIHJldHVybiAoe30pOworICAgIHJldHVybiBtYXAobWF0cywgIydtYXRLZXkyRGVmc3RyLCBtYXRlcmlhbHMpOworICB9CisgIHJldHVybiAwOworfQorCitzdHJpbmcgR3JvdXBOYW1lKHN0cmluZyBncnApIHsKKyAgaWYgKGluaXRpYWxpemVkKSB7CisgICAgaWYgKG1lbWJlcihtYXRlcmlhbF9ncm91cHMsIGdldE1hdEdyb3VwSWQoZ3JwKSkpCisgICAgICByZXR1cm4gbWF0ZXJpYWxfZ3JvdXBzW2dldE1hdEdyb3VwSWQoZ3JwKV1bUF9OQU1FXTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gIlVuYmVrYW5udGVzIjsKKyAgfQorfQorCitzdHJpbmcgR3JvdXBEZXNjcmlwdGlvbihzdHJpbmcgZ3JwKSB7CisgIGlmIChpbml0aWFsaXplZCkgeworICAgIGlmIChtZW1iZXIobWF0ZXJpYWxfZ3JvdXBzLCBnZXRNYXRHcm91cElkKGdycCkpKQorICAgICAgcmV0dXJuIG1hdGVyaWFsX2dyb3Vwc1tnZXRNYXRHcm91cElkKGdycCldW1BfREVTQ1JJUFRJT05dOworICAgIGVsc2UKKyAgICAgIHJldHVybiAiR3J1cHBlIHVuYmVrYW5udCI7CisgIH0KK30KKworLy89PT09PT09PT09PT09PT09PT09PSBHZW5lcmllcmVuIHZvbiBIZWFkZXJmaWxlIHVuZCBNYW5wYWdlcworcHJpdmF0ZSBzdHJpbmcgKmdldF9vcmRlcmVkX2dyb3VwcygpCit7CisgIHJldHVybiAoeyJNQVRHUk9VUF9XT09EIiwgIk1BVEdST1VQX0pFV0VMIiwgIk1BVEdST1VQX1NUT05FIiwgIk1BVEdST1VQX01BR05FVElDIiwKKyAgICAgICAgICAgIk1BVEdST1VQX01FVEFMIiwgIk1BVEdST1VQX0RSVUciLCAiTUFUR1JPVVBfSEVSQkFMIiwgIk1BVEdST1VQX0ZMRVhJQkxFIiwKKyAgICAgICAgICAgIk1BVEdST1VQX0JJTyIsICJNQVRHUk9VUF9BQ0lESUMiLCAiTUFUR1JPVVBfQkFTSUMiLCAiTUFUR1JPVVBfUE9JU09OT1VTIiwKKyAgICAgICAgICAgIk1BVEdST1VQX0VYUExPU0lWRSIsICJNQVRHUk9VUF9JTkZMQU1NQUJMRSIsCisgICAgICAgICAgICJNQVRHUk9VUF9FTEVNRU5UQUwiLCAiTUFUR1JPVVBfRUxFQ1RSSUNBTCIsICJNQVRHUk9VUF9NQUdJQyIsCisgICAgICAgICAgICJNQVRHUk9VUF9IT0xZIiwgIk1BVEdST1VQX1VOSE9MWSIsICJNQVRHUk9VUF9JTlZJUyIsCisgICAgICAgICAgICJNQVRHUk9VUF9TT0xJRCIsICJNQVRHUk9VUF9GTFVJRCIsICJNQVRHUk9VUF9HQVMifSk7Cit9Citwcml2YXRlIHN0cmluZyBnZW5fbWF0ZXJpYWxfaF9oZWFkKCkKK3sKKyAgcmV0dXJuCisgICAgIi8vIE1vcmdlbkdyYXVlbiBNVURsaWJcbi8vXG4iCisgICAgIi8vIG1hdGVyaWFscy5oIC0tIG1hdGVyaWFsIGRlZmluaXRpb25zXG4vL1xuIgorICAgICIvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IC9zZWN1cmUvbWF0ZXJpYWxkYi5jXG4vL1xuIgorICAgICIvLyBETyBOT1QgRURJVCFcbi8vXG4iCisgICAgIi8vICRJZDogbWF0ZXJpYWxkYi5jIDg3NTUgMjAxNC0wNC0yNiAxMzoxMzo0MFogWmVzc3RyYSAkXG5cbiIKKyAgICAiI2lmbmRlZiBfX01BVEVSSUFMU19IX19cbiIKKyAgICAiI2RlZmluZSBfX01BVEVSSUFMU19IX19cblxuIjsKK30KK3ByaXZhdGUgc3RyaW5nIGdlbl9tYXRlcmlhbF9oX21hdGVyaWFsKHN0cmluZyBtYXQsIHN0cmluZyBsYXN0X2dycCkKK3sKKyAgbWF0ID0gb2xkX21hdF9rZXlzW21hdF07CisgIHJldHVybiBzcHJpbnRmKCIjZGVmaW5lICUtMjRzXCIlLTIwcyAvLyAlc1xuIiwgbWF0LAorICAgICAgICAgICAgICAgIChtZW1iZXIobWF0ZXJpYWxzW21hdF0sIFBfREVGU1RSKT9tYXRlcmlhbHNbbWF0XVtQX0RFRlNUUl06bWF0KSsiXCIiLAorICAgICAgICAgICAgICAgIG1hdGVyaWFsc1ttYXRdW1BfREVTQ1JJUFRJT05dfHxtYXRlcmlhbHNbbWF0XVtQX05BTUVdW1dFUl0pOworfQorcHJpdmF0ZSBzdHJpbmcgZ2VuX21hdGVyaWFsX2hfbWF0ZXJpYWxzX2dycChzdHJpbmcgZ3JwLCBzdHJpbmcgKmxlZnQpCit7CisgIHN0cmluZyB0eHQsICptYXRzOworICB0eHQgPSBzcHJpbnRmKCJcbi8vIEdydXBwZTogJXNcbiIsIEdyb3VwTmFtZShncnApKTsKKyAgbWF0cyA9IEdldEdyb3VwTWVtYmVycyhncnApIC0gKEdldEdyb3VwTWVtYmVycyhncnApIC0gbGVmdCk7CisgIHR4dCArPSBzcHJpbnRmKCIlQHMiLCBtYXAoc29ydF9hcnJheShtYXRzLCAjJz4pLCAjJ2dlbl9tYXRlcmlhbF9oX21hdGVyaWFsKSk7CisgIGxlZnQgLT0gR2V0R3JvdXBNZW1iZXJzKGdycCk7CisgIHJldHVybiB0eHQ7Cit9Citwcml2YXRlIHN0cmluZyBnZW5fbWF0ZXJpYWxfaF9tYXRlcmlhbHMoKQoreworICBzdHJpbmcgdHh0LCBsYXN0X2dycDsKKyAgc3RyaW5nICpncnBzLCAqbWF0czsKKyAgdHh0ID0gIi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNYXRlcmlhbGllbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiI7CisgIC8vIEdydXBwZW53ZWlzZSBvcmRuZW4KKyAgZ3JwcyA9IGdldF9vcmRlcmVkX2dyb3VwcygpOworICBtYXRzID0gQWxsTWF0ZXJpYWxzKCk7CisgIHR4dCArPSBzcHJpbnRmKCIlQHMiLCBtYXAoZ3JwcywgIydnZW5fbWF0ZXJpYWxfaF9tYXRlcmlhbHNfZ3JwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXRzKSk7CisgIC8vINxicmlnZ2VibGllbmUgTWF0ZXJpYWxpZW4gYXVzZ2ViZW4KKyAgdHh0ICs9ICIvLyBzb25zdGlnZSBNYXRlcmlhbGllbjpcbiI7CisgIHR4dCArPSBzcHJpbnRmKCIlQHMiLCBtYXAobWF0cywgIydnZW5fbWF0ZXJpYWxfaF9tYXRlcmlhbCkpOworICByZXR1cm4gdHh0OworfQorcHJpdmF0ZSBzdHJpbmcgZ2VuX21hdGVyaWFsX2hfZ3JvdXAoc3RyaW5nIGdycCkKK3sKKyAgcmV0dXJuIHNwcmludGYoIiNkZWZpbmUgJS0yN3NcIiUtMThzIC8vICVzXG4iLAorICAgICAgICAgICAgICAgICBncnAsIGdyb3VwS2V5MkRlZnN0cihncnApKyJcIiIsIEdyb3VwTmFtZShncnApKTsKK30KK3ByaXZhdGUgc3RyaW5nIGdlbl9tYXRlcmlhbF9oX2dyb3VwcygpCit7CisgIHN0cmluZyB0eHQ7CisgIHR4dCA9ICJcbi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKiogTWF0ZXJpYWxncnVwcGVuICoqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuIgorICAgICIjaWZuZGVmIF9JU19NQVRFUklBTERCX1xuIjsKKyAgdHh0ICs9IHNwcmludGYoIiVAc1xuIiwgbWFwKHNvcnRfYXJyYXkobV9pbmRpY2VzKG1hdGVyaWFsX2dyb3VwcyksICMnPiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjJ2dlbl9tYXRlcmlhbF9oX2dyb3VwKSk7CisgIHR4dCArPSAiXG4jZW5kaWYgLy8gX0lTX01BVEVSSUFMREJfXG4iOworICByZXR1cm4gdHh0OworfQorcHJpdmF0ZSBzdHJpbmcgZ2VuX21hdGVyaWFsX2hfZm9vdCgpCit7CisgIHJldHVybgorICAgICIjZW5kaWYgLy8gX19USElOR19NQVRFUklBTF9IX19cbiI7Cit9Citwcml2YXRlIGludCBkdW1wX21hdGVyaWFsX2goc3RyaW5nIGZuKQoreworICByZXR1cm4gKHdyaXRlX2ZpbGUoZm4sIGdlbl9tYXRlcmlhbF9oX2hlYWQoKSkgJiYKKyAgICAgICAgICB3cml0ZV9maWxlKGZuLCBnZW5fbWF0ZXJpYWxfaF9tYXRlcmlhbHMoKSkgJiYKKyAgICAgICAgICB3cml0ZV9maWxlKGZuLCBnZW5fbWF0ZXJpYWxfaF9ncm91cHMoKSkgJiYKKyAgICAgICAgICB3cml0ZV9maWxlKGZuLCBnZW5fbWF0ZXJpYWxfaF9mb290KCkpKTsKK30KK3ByaXZhdGUgc3RyaW5nIGdlbl9tYXRlcmlhbF9saXN0X21hdGVyaWFsKHN0cmluZyBtYXQpCit7CisgIG1hdCA9IG9sZF9tYXRfa2V5c1ttYXRdOworICByZXR1cm4gc3ByaW50ZigiICAlLTI4cyU9LTQ1c1xuIiwgbWF0LAorICAgICAgICAgICAgICAgICBtYXRlcmlhbHNbbWF0XVtQX0RFU0NSSVBUSU9OXXx8bWF0ZXJpYWxzW21hdF1bUF9OQU1FXVtXRVJdKTsKK30KK3ByaXZhdGUgc3RyaW5nIGdlbl9tYXRlcmlhbF9saXN0X21hdGVyaWFsc19ncnAoc3RyaW5nIGdycCwgc3RyaW5nICpsZWZ0KQoreworICBzdHJpbmcgdHh0LCAqbWF0czsKKyAgdHh0ID0gc3ByaW50ZigiJXM6XG4iLCBjYXBpdGFsaXplKEdyb3VwTmFtZShncnApKSk7CisgIG1hdHMgPSBzb3J0X2FycmF5KEdldEdyb3VwTWVtYmVycyhncnApIC0gKEdldEdyb3VwTWVtYmVycyhncnApIC0gbGVmdCksICMnPik7CisgIHR4dCArPSBzcHJpbnRmKCIlQHNcbiIsIG1hcChtYXRzLCAjJ2dlbl9tYXRlcmlhbF9saXN0X21hdGVyaWFsKSk7CisgIGxlZnQgLT0gR2V0R3JvdXBNZW1iZXJzKGdycCk7CisgIHJldHVybiB0eHQ7Cit9Citwcml2YXRlIHZvaWQgZHVtcF9tYXRlcmlhbChzdHJpbmcgZm4pCit7CisgIHN0cmluZyB0eHQ7CisgIHN0cmluZyAqZ3JwcywgKm1hdHM7CisgIC8vIEdydXBwZW53ZWlzZSBvcmRuZW4KKyAgZ3JwcyA9IGdldF9vcmRlcmVkX2dyb3VwcygpOworICBtYXRzID0gQWxsTWF0ZXJpYWxzKCk7CisgIHR4dCA9IHNwcmludGYoIiVAcyIsIG1hcChncnBzLCAjJ2dlbl9tYXRlcmlhbF9saXN0X21hdGVyaWFsc19ncnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF0cykpOworICAvLyDcYnJpZ2dlYmxpZW5lIE1hdGVyaWFsaWVuIGF1c2dlYmVuCisgIHR4dCArPSAic29uc3RpZ2UgTWF0ZXJpYWxpZW46XG4iOworICB0eHQgKz0gc3ByaW50ZigiJUBzIiwgbWFwKG1hdHMsICMnZ2VuX21hdGVyaWFsX2xpc3RfbWF0ZXJpYWwpKTsKKyAgd3JpdGVfZmlsZShmbiwgdHh0KSB8fAorICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIktvbm50ZSBMaXN0ZSBuaWNodCB3ZWl0ZXIgaW4gRGF0ZWkgJXMgc2NocmVpYmVuLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgQWJicnVjaFxuIiwgZm4pKTsKK30KK3ByaXZhdGUgdm9pZCBkdW1wX2dyb3VwKHN0cmluZyBncnAsIHN0cmluZyBmbikKK3sKKyAgLy8gdXBwZXJzdHJpbmcgbGFuZ3NhbWUgc2ltdWxfZWZ1biwgd2FydW0/CisgIHdyaXRlX2ZpbGUoZm4sIHNwcmludGYoIiAgJS0yOHMlPS00OHNcbiIsIChncnApLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwTmFtZShncnApKSkgfHwKKyAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJLb25udGUgTGlzdGUgbmljaHQgd2VpdGVyIGluIERhdGVpICVzIHNjaHJlaWJlbiwiCisgICAgICAgICAgICAgICAgICAgICAgICAiIEFiYnJ1Y2hcbiIsIGZuKSk7Cit9Citwcml2YXRlIHN0cmluZyBnZW5fZG9jX2Zvb3Qoc3RyaW5nIG90aGVyKQoreworICByZXR1cm4gc3ByaW50ZigiXG5TSUVIRSBBVUNIOlxuIgorICAgICAgICAgICAgICAgICAiICAgICBLb256ZXB0ZTogICAgbWF0ZXJpYWwsIG1hdGVyaWFsZXJrZW5udW5nXG4iCisgICAgICAgICAgICAgICAgICIgICAgIEdydW5kbGVnZW5kOiBQX01BVEVSSUFMLCAvc3lzL21hdGVyaWFscy5oLCAvc3lzL3RoaW5nL21hdGVyaWFsLmhcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAgTWV0aG9kZW46ICAgIFF1ZXJ5TWF0ZXJpYWwoKSwgUXVlcnlNYXRlcmlhbEdyb3VwKCksIE1hdGVyaWFsTGlzdCgpLFxuIgorICAgICAgICAgICAgICAgICAiICAgICBMaXN0ZW46ICAgICAgQWxsTWF0ZXJpYWxzKCksIEFsbEdyb3VwcygpXG4iCisgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAlc1xuIgorICAgICAgICAgICAgICAgICAiICAgICBNYXN0ZXI6ICAgICAgQ29udk1hdGVyaWFsTGlzdCgpLCBNYXRlcmlhbEdyb3VwKCksXG4iCisgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICBHcm91cE5hbWUoKSwgTWF0ZXJpYWxOYW1lKCksXG4iCisgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICBHZXRHcm91cE1lbWJlcnMoKSwgR2V0TWF0TWVtYmVyc2hpcCgpXG4iCisgICAgICAgICAgICAgICAgICIgICAgIFNvbnN0aWdlczogICBQX01BVEVSSUFMX0tOT1dMRURHRVxuXG4iCisgICAgICAgICAgICAgICAgICIlcyBnZW5lcmllcnQgYXVzIC9zZWN1cmUvbWF0ZXJpYWxkYlxuIiwgb3RoZXIsIGR0aW1lKHRpbWUoKSkpOworfQorCisvKiBHZW5NYXRMaXN0CisgKgorICogR2VuZXJpZXJ0IERhdGVpIG1pdCByZWdpc3RyaWVydGVuIE1hdGVyaWFsaWVuIGZ1ZXIgZGllIERva3VtZW50YXRpb24sCisgKi8KK3ZhcmFyZ3Mgdm9pZCBHZW5NYXRMaXN0KHN0cmluZyBmbikKK3sKKyAgaWYgKGluaXRpYWxpemVkKSB7CisgICAgc3RyaW5nIHR4dDsKKyAgICBpZiAoIXN0cmluZ3AoZm4pIHx8ICFzaXplb2YoZm4pKQorICAgICAgZm4gPSBET0NfRElSKCJtYXRlcmlhbGxpc3RlIik7CisgICAgaWYgKGZpbGVfc2l6ZShmbikgPj0gMCkgeworICAgICAgcHJpbnRmKCJEYXRlaSAlcyBleGlzdGllcnQgYmVyZWl0cywgbG9lc2NoZSBzaWVcbiIsIGZuKTsKKyAgICAgIHJtKGZuKTsKKyAgICB9CisgICAgaWYgKHdyaXRlX2ZpbGUoZm4sICJNYXRlcmlhbCBMaXN0ZVxuPT09PT09PT09PT09PT1cblxuIikpIHsKKyAgICAgIGR1bXBfbWF0ZXJpYWwoZm4pOworICAgICAgd3JpdGVfZmlsZShmbiwgZ2VuX2RvY19mb290KCJtYXRlcmlhbGdydXBwZW4iKSk7CisgICAgICBwcmludGYoIk1hdGVyaWFsbGlzdGUgZXJmb2xncmVpY2ggaW4gRGF0ZWkgJXMgZ2VzY2hyaWViZW5cbiIsIGZuKTsKKyAgICB9IGVsc2UKKyAgICAgIHByaW50ZigiS29ubnRlIExpc3RlIG5pY2h0IGluIERhdGVpICVzIHNjaHJlaWJlbiwgQWJicnVjaFxuIiwgZm4pOworICB9Cit9CisKKy8qIEdlbk1hdEdyb3VwTGlzdAorICoKKyAqIEdlbmVyaWVydCBEYXRlaSBtaXQgcmVnaXN0cmllcnRlbiBNYXRlcmlhbGdydXBwZW4gZnVlciBkaWUgRG9rdW1lbnRhdGlvbiwKKyAqLwordmFyYXJncyB2b2lkIEdlbk1hdEdyb3VwTGlzdChzdHJpbmcgZm4pCit7CisgIGlmIChpbml0aWFsaXplZCkgeworICAgIHN0cmluZyB0eHQ7CisgICAgaWYgKCFzdHJpbmdwKGZuKSB8fCAhc2l6ZW9mKGZuKSkKKyAgICAgIGZuID0gRE9DX0RJUigibWF0ZXJpYWxncnVwcGVuIik7CisgICAgaWYgKGZpbGVfc2l6ZShmbikgPj0gMCkgeworICAgICAgcHJpbnRmKCJEYXRlaSAlcyBleGlzdGllcnQgYmVyZWl0cywgbG9lc2NoZSBzaWVcbiIsIGZuKTsKKyAgICAgIHJtKGZuKTsKKyAgICB9CisgICAgaWYgKHdyaXRlX2ZpbGUoZm4sICJNYXRlcmlhbGdydXBwZW5cbj09PT09PT09PT09PT09PVxuIikpIHsKKyAgICAgIG1hcChzb3J0X2FycmF5KG1faW5kaWNlcyhtYXRlcmlhbF9ncm91cHMpLCAjJz4pLCAjJ2R1bXBfZ3JvdXAsIGZuKTsKKyAgICAgIHdyaXRlX2ZpbGUoZm4sIGdlbl9kb2NfZm9vdCgibWF0ZXJpYWxsaXN0ZSIpKTsKKyAgICAgIHByaW50ZigiTWF0ZXJpYWxsaXN0ZSBlcmZvbGdyZWljaCBpbiBEYXRlaSAlcyBnZXNjaHJpZWJlblxuIiwgZm4pOworICAgIH0gZWxzZQorICAgICAgcHJpbnRmKCJLb25udGUgTGlzdGUgbmljaHQgaW4gRGF0ZWkgJXMgc2NocmVpYmVuLCBBYmJydWNoXG4iLCBmbik7CisgIH0KK30KKworLyogR2VuSGVhZGVyRmlsZQorICoKKyAqIEdlbmVyaWVydCBIZWFkZXJmaWxlIG1pdCBEZWZpbml0aW9uZW4gZGVyIG1vZWdsaWNoZW4gTWF0ZXJpYWxpZW4gdW5kCisgKiBHcnVwcGVuCisgKi8KK3ZhcmFyZ3Mgdm9pZCBHZW5IZWFkZXJGaWxlKHN0cmluZyBmbikKK3sKKyAgaWYgKGluaXRpYWxpemVkKSB7CisgICAgc3RyaW5nIHR4dDsKKyAgICBpZiAoIXN0cmluZ3AoZm4pIHx8ICFzaXplb2YoZm4pKQorICAgICAgZm4gPSBIRUFERVJGSUxFOworICAgIGlmIChmaWxlX3NpemUoZm4pID49IDApIHsKKyAgICAgIHByaW50ZigiRGF0ZWkgJXMgZXhpc3RpZXJ0IGJlcmVpdHMsIGxvZXNjaGUgc2llXG4iLCBmbik7CisgICAgICBybShmbik7CisgICAgfQorICAgIGlmIChkdW1wX21hdGVyaWFsX2goZm4pKQorICAgICAgcHJpbnRmKCJIZWFkZXJkYXRlaSBlcmZvbGdyZWljaCBpbiAlcyBnZXNjaHJpZWJlblxuIiwgZm4pOworICAgIGVsc2UKKyAgICAgIHByaW50ZigiS29ubnRlIEhlYWRlcmRhdGVpIG5pY2h0IGluIERhdGVpICVzIHNjaHJlaWJlbiwgQWJicnVjaFxuIiwgZm4pOworICB9Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT0gUHJ1ZWYtIHVuZCBIaWxmc2Z1bmt0aW9uZW4gZnVlciBNYXRlcmlhbGllbgorcHJpdmF0ZSB2b2lkIHVwZGF0ZUdyb3VwTWVtYmVycyhtYXBwaW5nIGdyb3Vwcywgc3RyaW5nIG1hdF9pZCwgbWFwcGluZyBtYXQpIHsKKyAgbWl4ZWQgKmFkZGdycHM7IC8vIEFycmF5IHp1bSBBYmxlaXRlbiB2b24gR3J1cHBlbnp1Z2Vob2VyaWdrZWl0ZW4KKyAgc3RyaW5nICpoOworICBpbnQgaSwgdmFsOworICBtYXBwaW5nIGZyYWN0aW9uczsgLy8gTWFwcGluZyBtaXQgQW50ZWlsZW4gYW4gR3J1cHBlbgorICBmcmFjdGlvbnMgPSBtYXRbUF9NR19GUkFDVElPTlNdOworICBpZiAoIW1hcHBpbmdwKGZyYWN0aW9ucykpCisgICAgZnJhY3Rpb25zID0gKFtdKTsKKyAgYWRkZ3Jwcz0oeyAvLyBSZWloZW5mb2xnZSB3aXJkIHJ1ZWNrd2FlcnRzIGFiZ2VhcmJlaXRldAorICAgIC8vIEFibGVpdHVuZ2VuIHNpbmQgei5ULiBhYmVudGV1ZXJsaWNoIGdld2VzZW4sIG1hbCBvcmRlbnRsaWNoCisgICAgLy8gYXVzbWlzdGVuLiBEaWUgWnVnZWhvZXJpZ2tlaXQgZ2Vob2VydCBleHBsaXppdCBpbiBkaWUKKyAgICAvLyBNYXRlcmlhbGRlZmluaXRpb24KKyAgICAvLyBHYXNlIHNpZWh0IG1hbiBub3JtYWxlcndlaXNlIG5pY2h0OgorICAgICh7Ik1BVEdST1VQX0lOVklTIiwgIk1BVEdST1VQX0dBUyJ9KSwKKyAgICAvLyBNaW5lcmFsaWVuIHNpbmQgYXVjaCBTdGVpbmUKKyAgICAoeyJNQVRHUk9VUF9TVE9ORSIsIk1BVEdST1VQX01JTkVSQUwifSksCisgICAgLy8gRWRlbG1ldGFsbGUgc2luZCBNZXRhbGxlOgorICAgICh7Ik1BVEdST1VQX01FVEFMIiwiTUFUR1JPVVBfUFJFQ0lPVVNfTUVUQUwifSksCisgICAgLy8gTGViZXdlc2VuIHVuZCBkZXJlbiBVZWJlcnJlc3RlLCBQYWllcmUgdW5kIFN0b2ZmZSBzaW5kIGJpb2xvZ2lzY2gKKyAgICAoeyJNQVRHUk9VUF9CSU8iLCJNQVRHUk9VUF9MSVZJTkciLCJNQVRHUk9VUF9ERUFEIiwKKyAgICAgICJNQVRHUk9VUF9QQVBFUiJ9KSwKKyAgICAvLyBIb2x6IGlzdCBwZmxhbnpsaWNoOgorICAgICh7Ik1BVEdST1VQX0hFUkJBTCIsICJNQVRHUk9VUF9XT09EIn0pLAorICAgIC8vIEhvbHogaXN0IG1laXN0ZW5zIHRvdDoKKyAgICAoeyJNQVRHUk9VUF9ERUFEIiwiTUFUR1JPVVBfV09PRCJ9KSwKKyAgICAvLyBIb2x6LCBQYXBpZXIgdW5kIFN0b2ZmZSBicmVubmVuOgorICAgICh7Ik1BVEdST1VQX0lORkxBTU1BQkxFIiwiTUFUR1JPVVBfV09PRCIsIk1BVEdST1VQX1BBUEVSIn0pLAorICAgIC8vIExhdWJob2VsemVyLCBOYWRlbGhvZWx6ZXIgdW5kIFRyb3BlbmhvZWx6ZXIgc2luZCBIb2x6CisgICAgKHsiTUFUR1JPVVBfV09PRCIsIk1BVEdST1VQX1RST1BJQ0FMX1dPT0QiLCJNQVRHUk9VUF9ERUNJRFVPVVNfV09PRCIsCisgICAgICAiTUFUR1JPVVBfQ09OSUZFUl9XT09EIn0pLAorICAgIC8vIEV4cGxvc2l2ZSBEaW5nZSBzaW5kIGltbWVyIGVudHp1ZW5kbGljaDoKKyAgICAoeyJNQVRHUk9VUF9JTkZMQU1NQUJMRSIsIk1BVEdST1VQX0VYUExPU0lWRSJ9KQorICB9KTsKKyAgaT1zaXplb2YoYWRkZ3Jwcyk7CisgIHdoaWxlKGktLSkgeworICAgIGludCBqOworICAgIGg9YWRkZ3Jwc1tpXTsKKyAgICBpZiAobWVtYmVyKGZyYWN0aW9ucyxoWzBdKSkgLy8gRXhpc3RpZXJ0IHNjaG9uIGVpZ2VuZXIgRWludHJhZz8KKyAgICAgIGNvbnRpbnVlOyAvLyBBdXRvbWF0aXNjaGUgRWludHJhZ3VuZyB1bm5vZXRpZworICAgIHZhbD0wOworICAgIGZvciAoaj1zaXplb2YoaCktMTtqPj0xO2otLSkKKyAgICAgIHZhbCs9ZnJhY3Rpb25zW2hbal1dOworICAgIGlmICghdmFsKQorICAgICAgY29udGludWU7CisgICAgaWYgKHZhbD4xMDApCisgICAgICB2YWw9MTAwOworICAgIGVsc2UgaWYgKHZhbDwtMTAwKQorICAgICAgdmFsPS0xMDA7CisgICAgZnJhY3Rpb25zW2hbMF1dPXZhbDsKKyAgfQorICBpZiAoZnJhY3Rpb25zWyJNQVRHUk9VUF9MSVZJTkciXSkgLy8gSW0gRmFsbGUgdm9uIGxlYmVuZGVtIEhvbHosIHRvdCBsb2VzY2hlbgorICAgIG1fZGVsZXRlKGZyYWN0aW9ucywiTUFUR1JPVVBfREVBRCIpOworICAvLyBBbGxlcywgd2FzIG5pY2h0IGFscyBnYXNmb2VybWluZywgZmx1ZXNzaWcgb2RlciBmZXN0IGVpbmdlb3JkbmV0IGlzdCwgaXN0CisgIC8vIHNvbnN0d2FzOgorICBpZiAoIW1lbWJlcihmcmFjdGlvbnMsICJNQVRHUk9VUF9GTFVJRCIpCisgICAgICAmJiAhbWVtYmVyKGZyYWN0aW9ucywgIk1BVEdST1VQX0dBUyIpCisgICAgICAmJiAhbWVtYmVyKGZyYWN0aW9ucywgIk1BVEdST1VQX1NPTElEIikpCisgICAgZnJhY3Rpb25zWyJNQVRHUk9VUF9NSVNDIl09MTAwOworICAvLyBNYXRlcmlhbGllbiBhbHMgTWl0Z2xpZWRlciBpbiBkaWUgR3J1cHBlbiBlaW50cmFnZW4KKyAgYWRkZ3Jwcz1tX2luZGljZXMoZnJhY3Rpb25zKTsKKyAgaT1zaXplb2YoYWRkZ3Jwcyk7CisgIHdoaWxlKGktLSkgeworICAgIG1peGVkIGluZDsKKyAgICBpbmQ9YWRkZ3Jwc1tpXTsKKyAgICBpZiAoIWZyYWN0aW9uc1tpbmRdIHx8ICFtZW1iZXIoZ3JvdXBzLCBpbmQpKSB7CisgICAgICAvLyBVbmJla2FubnRlIEdydXBwZSB1bmQgR3J1cHBlIG9obmUgQW50ZWlsIGF1cyBNYXBwaW5nIGxvZXNjaGVuCisgICAgICBtX2RlbGV0ZShmcmFjdGlvbnMsaW5kKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoIXBvaW50ZXJwKGg9Z3JvdXBzW2luZF1bUF9NRU1CRVJTXSkpCisgICAgICBoPSh7fSk7CisgICAgaCs9KHttYXRfaWR9KTsKKyAgICBncm91cHNbaW5kXVtQX01FTUJFUlNdPWg7CisgIH0KKyAgbWF0W1BfTUdfRlJBQ1RJT05TXSA9IGZyYWN0aW9uczsKK30KKworLy89PT09PT09PT09PT09PT09PT09PSBFaW5sZXNlbiBkZXIgTWFwcGluZ3MgYXVzIERhdGVpZW4KKworI2RlZmluZSBNREVTQ19FUlJPUih4LCB5KSBMT0dfRVJST1Ioc3ByaW50ZigiTWF0ZXJpYWxiZXNjaHJlaWJ1bmcgJyVzJzogJXNcbiIsIHgsIHkpKQorI2RlZmluZSBNREVTQ19XQVJOKHgsIHkpIC8vTE9HX1dBUk4oc3ByaW50ZigiTWF0ZXJpYWxiZXNjaHJlaWJ1bmcgJyVzJzogJXNcbiIsIHgsIHkpKQorCitwcml2YXRlIG1hcHBpbmcgZ2V0RGVzY1BhcnRzKHN0cmluZyBzKSB7CisgIHN0cmluZyogbGluZXM7CisgIHN0cmluZyBrZXksIHZhbDsKKyAgaW50IGksIG47CisgIG1hcHBpbmcgbTsKKyAgbSA9IChbXSk7CisgIHZhbCA9ICIiOworICBsaW5lcyA9IGV4cGxvZGUocywgIlxuIik7CisgIG4gPSBzaXplb2YobGluZXMpOworICBpZiAobiA+IDApIHsKKyAgICB3aGlsZSAoaSA8IG4pIHsKKyAgICAgIGlmIChzc2NhbmYobGluZXNbaV0sICIlczoiLCBrZXkpKSB7CisgICAgICAgIHN0YXR1cyBtdWx0aWxpbmU7CisgICAgICAgIG11bHRpbGluZSA9IDA7CisgICAgICAgIC8vIFNjaGx1ZXNzZWwgZ2VmdW5kZW4sIFdlcnQgYXVzbGVzZW4KKyAgICAgICAgd2hpbGUgKCAoKytpIDwgbikgJiYgc2l6ZW9mKGxpbmVzW2ldKSkgeworICAgICAgICAgIC8vIE1laHJ6ZWlsaWdlIFdlcnRlIG1pdCBuZXdsaW5lIHZlcmtldHRlbgorICAgICAgICAgIGlmIChtdWx0aWxpbmUpIHsKKyAgICAgICAgICAgIHZhbCArPSAiXG4iOworICAgICAgICAgIH0KKyAgICAgICAgICB2YWwgKz0gbGluZXNbaV07CisgICAgICAgICAgbXVsdGlsaW5lID0gMTsKKyAgICAgICAgfQorICAgICAgICBtICs9IChba2V5OnZhbF0pOworICAgICAgICB2YWwgPSAiIjsKKyAgICAgIH0KKyAgICAgIGkrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG07Cit9Citwcml2YXRlIHZhcmFyZ3MgaW50IGlzRmlsZShzdHJpbmcgZm4sIHN0cmluZyBwYXRoKSB7CisgIGlmIChzdHJpbmdwKHBhdGgpICYmIHNpemVvZihwYXRoKSkKKyAgICBmbiA9IHBhdGgrIi8iK2ZuOworICByZXR1cm4gKGZpbGVfc2l6ZShmbikgPj0gMCk7Cit9CisKK3ByaXZhdGUgdmFyYXJncyBtaXhlZCByZWFkR3JvdXBEZXNjKHN0cmluZyBpZCkgeworICBtaXhlZCBtOworICBzdHJpbmcgZm47CisgIGZuID0gTUFUX0RJUisiL2dyb3Vwcy8iK2lkOworICBpZiAoZmlsZV9zaXplKGZuKSA+IDApIHsKKyAgICBtYXBwaW5nIHBhcnRzOworICAgIHN0cmluZyBkZXNjOworICAgIHBhcnRzID0gZ2V0RGVzY1BhcnRzKHJlYWRfZmlsZShmbikpOworICAgIG0gPSAoW1BfTkFNRTpwYXJ0c1siTmFtZSJdLAorICAgICAgICAgIFBfTUVNQkVSUzooe30pXSk7CisgICAgaWYgKG1lbWJlcihwYXJ0cywiQmVzY2hyZWlidW5nIikpCisgICAgICBtICs9IChbUF9ERVNDUklQVElPTjpwYXJ0c1siQmVzY2hyZWlidW5nIl1dKTsKKyAgICBpZiAocGFydHNbIkdydXBwZW5pZCJdICE9IGlkKQorICAgICAgTE9HX1dBUk4oc3ByaW50ZigiVW5zdGltbWlna2VpdCBHcnVwcGVuaWQgYmVpICclcydcbiIsIGlkKSk7CisgIH0gZWxzZSB7CisgICAgTE9HX0VSUk9SKHNwcmludGYoIkthbm4gR3J1cHBlbmJlc2NocmVpYnVuZyAlcyBuaWNodCBsYWRlblxuIiwgZm4pKTsKKyAgfQorICByZXR1cm4gbTsKK30KKworcHJpdmF0ZSBtYXBwaW5nIGNvbnZNYXRJZChzdHJpbmcgcykgeworICBtYXBwaW5nIG07CisgIHN0cmluZyogcGFydHM7CisgIHBhcnRzID0gZXhwbG9kZShzLCAiXCIiKTsKKyAgaWYgKHNpemVvZihwYXJ0cykpIHsKKyAgICBpbnQgZW5kZTsKKyAgICBlbmRlID0gc3Ryc3RyKHBhcnRzWzBdLCIgIiktMTsKKyAgICBpZiAoZW5kZSA8IDApCisgICAgICBlbmRlID0gc2l6ZW9mKHBhcnRzWzBdKTsKKyAgICBtID0gKFtQX0lEOnBhcnRzWzBdWzAuLmVuZGVdXSk7CisgICAgaWYgKHNpemVvZihwYXJ0cykgPiAxKQorICAgICAgbSArPSAoW1BfREVGU1RSOnBhcnRzWzFdXSk7CisgIH0KKyAgcmV0dXJuIG07Cit9Citwcml2YXRlIHN0cmluZyogY29udk1hdE5hbWVzKHN0cmluZyBzKSB7CisgIHN0cmluZyogbmFtZXM7CisgIG5hbWVzID0gZmlsdGVyKGV4cGxvZGUocywgIlwiIiksCisgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYSggKHsneH0pLCAoeyMnPiwgKHsjJ3NpemVvZiwgJ3h9KSwgMX0pICkpOworICBpZiAoc2l6ZW9mKG5hbWVzKTwxKQorICAgIG5hbWVzPTA7CisgIGVsc2UgeworICAgIGlmIChzaXplb2YobmFtZXMpPDIpCisgICAgICBuYW1lcys9KHtuYW1lc1swXSsicyJ9KTsKKyAgICBpZiAoc2l6ZW9mKG5hbWVzKTwzKQorICAgICAgbmFtZXMrPSh7bmFtZXNbMF19KTsKKyAgICBpZiAoc2l6ZW9mKG5hbWVzKTw0KQorICAgICAgbmFtZXMrPSh7bmFtZXNbMF19KTsKKyAgfQorICByZXR1cm4gbmFtZXM7Cit9Citwcml2YXRlIGludCBjb252TWF0R2VuZGVyKHN0cmluZyBzKSB7CisgIGludCBnZW5kZXI7CisgIHMgPSBsb3dlcnN0cmluZyhzKTsKKyAgLy8gRWluIEJ1Y2hzdGFiZSByZWljaHQgenVyIEJlc3RpbW11bmcuIFdlbm4gbnVyIHdlaWJsaWNofGZlbWFsZQorICAvLyBiencuIG1hZW5ubGljaHxtYWxlIHZlcndlbmRldCB3aXJkLiBEYWJlaSBpc3QgZGFubiBhbGxlcmRpbmdzIGRpZQorICAvLyBSZWloZW5mb2xnZSBkZXIgQXVzd2VydHVuZyB3aWNodGlnLCBkYW1pdCBkYXMgbSBiZWkgTUFMRSBuaWNodCBtZWhyIGJlaQorICAvLyBmZW1hbGUgcGFzc3QuCisgIGlmIChzaXplb2YocmVnZXhwKCAoe3N9KSwgImZ8dyIpKSkgeworICAgIGdlbmRlciA9IEZFTUFMRTsKKyAgfSBlbHNlIGlmIChzaXplb2YocmVnZXhwKCAoe3N9KSwgIm0iKSkpIHsKKyAgICBnZW5kZXIgPSBNQUxFOworICB9IGVsc2UgeworICAgIGdlbmRlciA9IE5FVVRFUjsKKyAgfQorICByZXR1cm4gZ2VuZGVyOworfQorcHJpdmF0ZSBzdHJpbmcgY29udk1hdERlc2Moc3RyaW5nIHMpIHsKKyAgaWYgKHNpemVvZihyZWdleHAoICh7c30pLCAiLSBuaWNodCB2b3JoYW5kZW4gLSIpKSkgeworICAgIHMgPSAwOworICB9IGVsc2UgeworICAgIC8vIE1laHJ6ZWlsaWdlIEJlc2NocmVpYnVuZ2VuIHp1IGVpbmVyIFplaWxlIHp1c2FtbWVuZmFzc2VuCisgICAgcyA9IGltcGxvZGUoZXhwbG9kZShzLCAiXG4iKSwgIiAiKTsKKyAgfQorICByZXR1cm4gczsKK30KK3ByaXZhdGUgdm9pZCBhZGRSZWNvY0xpbmUoc3RyaW5nIHMsIG1peGVkKiByKSB7CisgIC8vIERpZSB3ZWl0ZXJlIEJld2VydHVuZyBkZXIgU2Nod2llcmlna2VpdCBrYW5uIGVyc3Qgdm9yZ2Vub21tZW4gd2VyZGVuLAorICAvLyB3ZW5uIGFsbGUgTWF0ZXJpYWxpZW4gYmVrYW5udCBzaW5kIHVuZCBwYXNzaWVydCBzcGFldGVyLiBadWVyc3Qgd2VyZGVuCisgIC8vIG51ciBkaWUgRWxlbWVudGUgZGVzIEFycmF5cyBrb252ZXJ0aWVydCB1bmQgZWluZ2V0cmFnZW4KKyAgc3RyaW5nIG1hdDsKKyAgaW50IHZhbDsKKyAgaWYgKHNzY2FuZihzLCAiJXM6JWQiLCBtYXQsIHZhbCkpIHsKKyAgICByICs9ICh7bWF0LHZhbH0pOworICB9IGVsc2UgaWYgKHNzY2FuZihzLCAiJWQiLCB2YWwpKSB7CisgICAgciArPSAoe3ZhbH0pOworICB9IGVsc2UgeworICAgIHIgKz0gKHtzfSk7CisgIH0KK30KK3ByaXZhdGUgbWl4ZWQgY29udk1hdFJlYyhzdHJpbmcgcykgeworICBtaXhlZCBkaWZmaWN1bHRpZXM7CisgIGlmIChzaXplb2YocmVnZXhwKCAoe3N9KSwgIi0ga2VpbmUgRWluc2NocmFlbmt1bmcgLSIpKSkgeworICAgIGRpZmZpY3VsdGllcyA9IDA7CisgIH0gZWxzZSB7CisgICAgZGlmZmljdWx0aWVzID0gKHt9KTsKKyAgICAvLyBKZWRlIFplaWxlIGVudGhhZWx0IGVpbmUgQmVkaW5ndW5nCisgICAgbWFwKGV4cGxvZGUocywgIlxuIiksICMnYWRkUmVjb2NMaW5lLCAmZGlmZmljdWx0aWVzKTsKKyAgfQorICByZXR1cm4gZGlmZmljdWx0aWVzOworfQorcHJpdmF0ZSB2b2lkIGFkZEdyb3VwTGluZShzdHJpbmcgcywgbWFwcGluZyBnKSB7CisgIC8vIERpZSB3ZWl0ZXJlIEJld2VydHVuZyBkZXIgWnVnZWhvZXJpZ2tlaXQgcGFzc2llcnQgc3BhZXRlci4KKyAgc3RyaW5nIGdycDsKKyAgaW50IHZhbDsKKyAgaWYgKHNzY2FuZihzLCAiJXM6JWQiLCBncnAsIHZhbCkpIHsKKyAgICBnICs9IChbZ3JwOnZhbF0pOworICB9IGVsc2UgeworICAgIGcgKz0gKFtncnA6MTAwXSk7CisgIH0KK30KK3ByaXZhdGUgbWFwcGluZyBjb252TWF0R3JvdXBzKHN0cmluZyBzKSB7CisgIG1hcHBpbmcgZ3JvdXBzOworICBpZiAoIXNpemVvZihyZWdleHAoICh7c30pLCAiLSBrZWluZSAtIikpKSB7CisgICAgZ3JvdXBzID0gKFtdKTsKKyAgICAvLyBKZWRlIFplaWxlIGVudGhhZWx0IGVpbmUgQmVkaW5ndW5nCisgICAgbWFwKGV4cGxvZGUocywgIlxuIiksICMnYWRkR3JvdXBMaW5lLCBncm91cHMpOworICB9CisgIHJldHVybiBncm91cHM7Cit9Citwcml2YXRlIG1hcHBpbmcgY29udk1hdGVyaWFsRGVzYyhzdHJpbmcgaWQsIG1hcHBpbmcgZGVzYykgeworICAvKiBTdHJ1a3R1ciBNYXRlcmlhbG1hcHBpbmc6CisgICAgIFBfR0VOREVSLAorICAgICBQX05BTUU6KHtuYW1lX25vbSwgbmFtZV9nZW4sIG5hbWVfZGF0aXYsIG5hbWVfYWtrdXNhdGl2fSksCisgICAgIChQX1JFQ09DOih7bWF0MSxmYWVoaWdrZWl0MSxtYXQyLGZhZWhpZ2tlaXQyLC4uLn0pLCkKKyAgICAgKFBfREVGU1RSOiBiZWkgYmVkYXJmKSwKKyAgICAgUF9ERVNDUklQVElPTiwKKyAgICAgKGdydXBwMTphbnRlaWwxLAorICAgICBncnVwcGUyOmFudGVpbDIsCisgICAgIC4uLikKKyAgKi8KKyAgbWFwcGluZyBtOworICBtaXhlZCB2YWwsIHZhbDI7CisgIG0gPSAoW10pOworICAvLyBEZXIgc3RyaW5nIGZ1ZXIgZGFzICNkZWZpbmUgenVlcnN0OgorICB2YWwgPSBjb252TWF0SWQoZGVzY1siTWF0ZXJpYWxpZCJdKTsKKyAgaWYgKG1hcHBpbmdwKHZhbCkpIHsKKyAgICBpZiAodmFsW1BfSURdICE9IGlkKQorICAgICAgTE9HX1dBUk4oc3ByaW50ZigiVW5zdGltbWlna2VpdCBNYXRlcmlhbGlkIGJlaSAnJXMnOiVPXG4iLCBpZCwgdmFsW1BfSURdKSk7CisgICAgaWYgKG1lbWJlcih2YWwsIFBfREVGU1RSKSkgeworICAgICAgbSArPSAoW1BfREVGU1RSOnZhbFtQX0RFRlNUUl1dKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gV2VubiBrZWluIFN0cmluZyBmdWVycyAjZGVmaW5lIGFuZ2VnZWJlbiB3dXJkZSwgZGFubiBkaXJla3QgSUQgdmVyd2VuZGVuCisgICAgICAvL20gKz0gKFtQX0RFRlNUUjpsb3dlcnN0cmluZyhpZClbNC4uXV0pOworICAgIH0KKyAgfQorICAvLyBEaWUgTmFtZW4KKyAgaWYgKHZhbCA9IGNvbnZNYXROYW1lcyhkZXNjWyJOYW1lIl0pKSB7CisgICAgbSArPSAoW1BfTkFNRTp2YWxdKTsKKyAgfSBlbHNlIHsKKyAgICBNREVTQ19XQVJOKGlkLCAia2VpbmUgTmFtZW4iKTsKKyAgICBtICs9IChbUF9OQU1FOih7IiIsICIiLCAiIiwgIiJ9KV0pOworICB9CisgIC8vIERhcyBHZXNjaGxlY2h0LCBzdGFuZGFyZCBpc3QgTkVVVEVSCisgIG0gKz0gKFtQX0dFTkRFUjpjb252TWF0R2VuZGVyKGRlc2NbIkdlc2NobGVjaHQiXSkgXSk7CisgIC8vIERpZSBCZXNjaHJlaWJ1bmcKKyAgdmFsID0gY29udk1hdERlc2MoZGVzY1siQmVzY2hyZWlidW5nIl0pOworICBpZiAoc2l6ZW9mKHZhbCkpIHsKKyAgICBtICs9IChbUF9ERVNDUklQVElPTjp2YWxdKTsKKyAgfSBlbHNlIHsKKyAgICBNREVTQ19XQVJOKGlkLCAia2VpbmUgQmVzY2hyZWlidW5nIik7CisgIH0KKyAgLy8gRGllIEVya2VubmJhcmtlaXQKKyAgdmFsID0gY29udk1hdFJlYyhkZXNjWyJFcmtlbm5iYXJrZWl0Il0pOworICBpZiAoc2l6ZW9mKHZhbCkpIHsKKyAgICBtICs9IChbUF9SRUNPQzp2YWxdKTsKKyAgfQorICAvLyB1bmQgenVtIFNjaGx1c3MgZGllIEdydXBwZW56dWdlaG9lcmlna2VpdAorICB2YWwgPSBjb252TWF0R3JvdXBzKGRlc2NbIkdydXBwZW56dWdlaG9lcmlna2VpdCJdKTsKKyAgaWYgKG1hcHBpbmdwKHZhbCkgJiYgc2l6ZW9mKHZhbCkpIHsKKyAgICBtICs9IChbUF9NR19GUkFDVElPTlM6dmFsXSk7CisgIH0KKyAgcmV0dXJuIG07Cit9Citwcml2YXRlIHZhcmFyZ3MgbWl4ZWQgcmVhZE1hdGVyaWFsRGVzYyhzdHJpbmcgaWQpIHsKKyAgbWl4ZWQgbTsKKyAgc3RyaW5nIGZuOworICBmbiA9IE1BVF9ESVIrIi9tYXRlcmlhbHMvIitpZDsKKyAgaWYgKGZpbGVfc2l6ZShmbikgPiAwKSB7CisgICAgbWFwcGluZyBwYXJ0czsKKyAgICBzdHJpbmcgZGVzYzsKKyAgICBwYXJ0cyA9IGdldERlc2NQYXJ0cyhyZWFkX2ZpbGUoZm4pKTsKKyAgICBtID0gY29udk1hdGVyaWFsRGVzYyhpZCwgcGFydHMpOworICB9IGVsc2UgeworICAgIExPR19FUlJPUihzcHJpbnRmKCJNREI6S2FubiBNYXRlcmlhbGJlc2NocmVpYnVuZyAlcyBuaWNodCBsYWRlblxuIiwgZm4pKTsKKyAgfQorICByZXR1cm4gbTsKK30KKworcHVibGljIGludCBHZXRVcGRhdGVUaWNrcygpIHsKKyAgcmV0dXJuIHVwZGF0ZVRpY2tzOworfQorCitwcml2YXRlIHZvaWQgc2NhbkZpbmlzaGVkKCkgeworICBpc1NjYW5uaW5nID0gMDsKKyAgaW5pdGlhbGl6ZWQgPSAxOworICAvLyBNYXBwaW5ncyB1bWtvcGllcmVuCisgIG1hdGVyaWFscyA9IG5ld19tYXRlcmlhbHM7CisgIG1hdGVyaWFsX2dyb3VwcyA9IG5ld19tYXRlcmlhbF9ncm91cHM7CisgIC8vIExldHp0ZXIgU2Nocml0dDogTWFwcGluZyBtaXQgYWx0ZW4gU2NobHVlc3NlbG4gYW5sZWdlbgorICBvbGRfbWF0X2tleXMgPSBta21hcHBpbmcobWFwKG1faW5kaWNlcyhtYXRlcmlhbHMpLCAjJ21hdEtleTJEZWZzdHIsIG1hdGVyaWFscyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luZGljZXMobWF0ZXJpYWxzKSk7CisgIC8vIEdlbmVyaWVyZW4gZGVyIERva3UgdW5kIGRlcyBNYXRlcmlhbGhlYWRlcnMKKyAgR2VuSGVhZGVyRmlsZSgpOworICBHZW5NYXRMaXN0KCk7CisgIEdlbk1hdEdyb3VwTGlzdCgpOworICAvLyBTYXZlZmlsZSBzY2hyZWliZW4KKyAgc2F2ZV9vYmplY3QoU0FWRUZJTEUpOworfQorCitwdWJsaWMgaW50IElzU2Nhbm5pbmcoKSB7CisgIHJldHVybiBpc1NjYW5uaW5nOworfQorCitwcml2YXRlIHZhcmFyZ3Mgdm9pZCBkb1NjYW5NYXRlcmlhbHMoc3RyaW5nKiBtYXRzLCBpbnQgaSwgaW50IHN0ZXApIHsKKyAgaW50IHRpY2tzLCBzdGFydDsKKyAgc3RyaW5nIG1hdGlkOworICBzdGFydCA9IGdldF9ldmFsX2Nvc3QoKTsKKyAgaWYgKHN0ZXAgPCAyKSB7CisgICAgd2hpbGUgKCAoaSA8IHNpemVvZihtYXRzKSkgJiYKKyAgICAgICAgICAgICgoc3RhcnQgLSBnZXRfZXZhbF9jb3N0KCkpIDwgcXVlcnlfbGltaXRzKClbTElNSVRfRVZBTF0vMyApICkgeworICAgICAgbWF0aWQgPSBtYXRzW2ldOworICAgICAgc3dpdGNoIChzdGVwKSB7CisgICAgICBjYXNlIDA6CisgICAgICAgIC8vIEVyc3RlciBTY2hyaXR0OiBFaW5sZXNlbiBkZXIgRGF0ZWllbgorICAgICAgICBuZXdfbWF0ZXJpYWxzW21hdGlkXSA9IHJlYWRNYXRlcmlhbERlc2MobWF0aWQpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgLy8gWndlaXRlciBTY2hyaXR0OiBCZWFyYmVpdGVuIGRlciBFcmtlbm51bmcgdW5kIEdydXBwZW56dWdlaG9lcmlna2VpdAorICAgICAgICB1cGRhdGVHcm91cE1lbWJlcnMobmV3X21hdGVyaWFsX2dyb3VwcywgbWF0aWQsIG5ld19tYXRlcmlhbHNbbWF0aWRdKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGkrKzsKKyAgICB9CisgIH0KKyAgaWYgKGkgPCBzaXplb2YobWF0cykpIHsKKyAgICBjYXRjaChyYWlzZV9lcnJvcihzcHJpbnRmKCJNYXRlcmlhbERCOiBJbml0aWFsaXNpZXJ1bmcgbm9jaCBuaWNodCBiZWVuZGV0LCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZmVobGVuZGUgTWF0ZXJpYWxiZXNjaHJlaWJ1bmdlbiBtb2VnbGljaCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKFBoYXNlICVkOiVkLyVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXAsIGksIHNpemVvZihtYXRzKSkpO3B1Ymxpc2gpOworICAgIGNhbGxfb3V0KCMnZG9TY2FuTWF0ZXJpYWxzLCAyLCBtYXRzLCBpLCBzdGVwKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBad2VpdGUgU3R1ZmUgYXVzbG9lc2VuIG9kZXIgYmVlbmRlbgorICAgIGlmIChzdGVwIDwgMSkgeworICAgICAgaWYgKChzdGFydCAtIGdldF9ldmFsX2Nvc3QoKSkgPCBxdWVyeV9saW1pdHMoKVtMSU1JVF9FVkFMXS8yICkKKyAgICAgICAgICBkb1NjYW5NYXRlcmlhbHMobWF0cywgMCwgc3RlcCsxKTsKKyAgICAgIGVsc2UKKyAgICAgICAgICBjYWxsX291dCgjJ2RvU2Nhbk1hdGVyaWFscywgMiwgbWF0cywgMCwgc3RlcCsxKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgc2NhbkZpbmlzaGVkKCk7CisgIH0KKyAgdXBkYXRlVGlja3MgKz0gc3RhcnQgLSBnZXRfZXZhbF9jb3N0KCk7Cit9CisKK3ByaXZhdGUgbWFwcGluZyBTY2FuR3JvdXBzKCkgeworICBtYXBwaW5nIGdyb3VwczsKKyAgc3RyaW5nKiBncnBmaWxlczsKKyAgZ3JvdXBzID0gKFtdKTsKKyAgZ3JwZmlsZXMgPSBmaWx0ZXIoZ2V0X2RpcihNQVRfRElSKyIvZ3JvdXBzL01BVEdST1VQXyoiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIydpc0ZpbGUsIE1BVF9ESVIrIi9ncm91cHMiKTsKKyAgZ3JvdXBzID0gbWttYXBwaW5nKGdycGZpbGVzLCBtYXAoZ3JwZmlsZXMsICMncmVhZEdyb3VwRGVzYywgMSkpOworICByZXR1cm4gZ3JvdXBzOworfQorCitwcml2YXRlIHZvaWQgU2Nhbk1hdGVyaWFscygpIHsKKyAgc3RyaW5nICptYXRmaWxlczsKKyAgbWF0ZmlsZXMgPSBmaWx0ZXIoZ2V0X2RpcihNQVRfRElSKyIvbWF0ZXJpYWxzL01BVF8qIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICMnaXNGaWxlLCBNQVRfRElSKyIvbWF0ZXJpYWxzIik7CisgIGRvU2Nhbk1hdGVyaWFscyhtYXRmaWxlcyk7Cit9CisKK3ZvaWQgVXBkYXRlKCkgeworICBpbnQgc3RhcnQ7CisgIHVwZGF0ZVRpY2tzID0gMDsKKyAgc3RhcnQgPSBnZXRfZXZhbF9jb3N0KCk7CisgIGlmICghaXNTY2FubmluZykgeworICAgIGlmIChzaXplb2YoZ2V0X2RpcihNQVRfRElSKSkpIHsKKyAgICAgIGlzU2Nhbm5pbmcgPSAxOworICAgICAgbmV3X21hdGVyaWFsX2dyb3VwcyA9IFNjYW5Hcm91cHMoKTsKKyAgICAgIG5ld19tYXRlcmlhbHMgPSAoW10pOworICAgICAgdXBkYXRlVGlja3MgPSBzdGFydCAtIGdldF9ldmFsX2Nvc3QoKTsKKyAgICAgIFNjYW5NYXRlcmlhbHMoKTsKKyAgICB9IGVsc2UgeworICAgICAgTE9HX0VSUk9SKCJLYW5uIE1hdGVyaWFsdmVyemVpY2huaXMgbmljaHQgZmluZGVuLCBrZWluZSBNYXRlcmlhbGllbiBhbmdlbGVndCFcbiIpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc2VjdXJlL21lbW9yeS5jIGIvc2VjdXJlL21lbW9yeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5N2FkMWMKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvbWVtb3J5LmMKQEAgLTAsMCArMSwyOTkgQEAKKy8qIQorLy8gTW9yZ2VuR3JhdWVuIE11ZGxpYgorLy8KKy8vIHNlY3VyZS9tZW1vcnkuYyAgLS0genVtIFNwZWljaGVybiB2b24gRGF0ZW4gdWViZXIgZGllIGdlc2FtdGUgTXVkLVVwdGltZQorLy8KKy8vIE1lbW9yeSBzcGVpY2hlcnQgc2VpbmUgRGF0ZW4gYWxzIFBvaW50ZXIgaW4gZGVyIGV4dHJhLXdpemluZm8uIEFuZGVyZSAKKy8vIFByb2dyYW1tZSBrb2VubmVuIElocmUgRGF0ZW4gaW0gTWVtb3J5IGFibGVnZW4uIERpZSBEYXRlbiBibGVpYmVuIGRhZHVyY2ggCisvLyBhdWNoIHVlYmVyIGVpbiBVcGRhdGUvUmVsb2FkIGRlciBCbHVlcHJpbnQgZXJoYWx0ZW4uCisvLworLy8gRGllIERhdGVuIHdlcmRlbiBhdWYgS2xhc3NlbmViZW5lIGJlaGFuZGVsdC4gSmVkZXIgQ2xvbmUgZWluZXMgUHJvZ3JhbW1zCisvLyAoQmx1ZXByaW50KSBkYXJmIGF1ZiBkaWUgZ2VzcGVpY2hlcnRlbiBEYXRlbiBkZXMgUHJvZ3JhbW1zIHNjaHJlaWJlbmQgdW5kCisvLyBsZXNlbmQgenVncmVpZmVuLiBBbmRlcmUgUHJvZ3JhbW1lIGhhYmVuIGtlaW5lbiBadWdyaWZmIGF1ZiBkaWVzZSBEYXRlbi4KKy8vCisvLyBOdXIgT2JqZWt0ZSBpbiAvc2VjdXJlL21lbW9yeV9saWIgYnp3LiAvc2VjdXJlL21lbW9yeV9ub2xpYiBlaW5nZXRyYWdlbiAKKy8vIHNpbmQsIGhhYmVuIFJlY2h0ZSBkZW4gTWVtb3J5IHp1IG51dHplbi4KKy8vCisvLyBEaWUgSWRlZSwgc2Vuc2libGUgRGF0ZW4gaW4gZGVyIGV4dHJhX3dpemluZm8gYWJ6dXNwZWljaGVybiBlbnRzdGFtbXQgCisvLyAvc2VjdXJlL21lbW9yeS5jIGF1cyBkZXIgV3VuZGVybGFuZCBNdWRsaWIgdm9uIEhvbGdlckBXdW5kZXJsYW5kCisqLworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPGZpbGVzLmg+CisKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIG5vX3NoYWRvdworI3ByYWdtYSBub19pbmhlcml0CisjcHJhZ21hIHZlcmJvc2VfZXJyb3JzCisjcHJhZ21hIGNvbWJpbmVfc3RyaW5ncworI3ByYWdtYSBwZWRhbnRpYworLy8jcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIHdhcm5fZGVwcmVjYXRlZAorCisKKy8qIEdsb2JhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbiAqLworLyohIFxicmllZiBMaXN0ZSBtaXQgUHJvZ3JhbW1lbiwgZGllIGRlbiBNZW1vcnkgbnV0emVuIGR1ZXJmZW4gCisgRGllIFZhcmlhYmxlIHdpcmQgZW50d2VkZXIgaW0gY3JlYXRlKCkgb2RlciBkdXJjaCBtYW51ZWxsZW4gQXVmcnVmIAorIHZvbiBSZXJlYWRQcm9ncmFtTGlzdHMoKSBhdXMgL3NlY3VyZS9tZW1vcnlfbGliIHVuZCAvc2VjdXJlL21lbW9yeV9ub2xpYgorIGJlZnVlbGx0LgorICovCitzdHJpbmcgKmtub3duX3Byb2dyYW1zOworCisvKiBGdW5jdGlvbiBkZWNsYXJhdGlvbiAtIHB1YmxpYyBpbnRlcmZhY2UgKi8KK3ZvaWQgY3JlYXRlKCk7CisKKy8vIFBheWxvYWQgSW50ZXJmYWNlCitpbnQgICBTYXZlICAoc3RyaW5nIGtleSwgbWl4ZWQgZGF0YSk7CittaXhlZCBMb2FkICAoc3RyaW5nIGtleSk7CitpbnQgICBSZW1vdmUoc3RyaW5nIGtleSk7CitpbnQgICBIYXZlUmlnaHRzKCk7CisKKy8vIEFkbWluaXN0cmF0aXZlIEludGVyZmFjZQordmFyYXJncyBpbnQgUmVyZWFkUHJvZ3JhbUxpc3RzKGludCBzaWxlbnQpOworCisvLyBEZWJ1Z2dpbmcgSW50ZXJmYWNlCit2YXJhcmdzIHZvaWQgU2hvd0RhdGEoc3RyaW5nIHVzZXIsIHN0cmluZyBrZXkpOworCisvKiBGdW5jdGlvbiBkZWZpbml0aW9uICovIAorLyohIE9iamVrdCBpbml0aWFsaXNpZXJlbiAqLwordm9pZCBjcmVhdGUoKSB7CisgIG1hcHBpbmcgaW5mbzsKKyAgc2V0ZXVpZChnZXR1aWQodGhpc19vYmplY3QoKSkpOworCisgIC8vIFdpemluZm8tUG9pbnRlciBob2xlbgorICBpZighcG9pbnRlcnAoaW5mbz1nZXRfZXh0cmFfd2l6aW5mbygwKSkpCisgICAgcmFpc2VfZXJyb3IoIldJWklORk8gbmljaHQgbGVzYmFyLiBzZWN1cmUvc2ltdWxfZWZ1biBtdXNzIG5ldSBnZWxhZGVuIHdlcmRlbi4hXG4iKTsKKworICAvLyBNZWluIEZlbGQgZGVyIFdpemluZm8gYmVpIEJlZGFyZiBpbml0aWFsaXNpZXJlbgorICBpZighbWFwcGluZ3AoaW5mb1tNRU1PUllfQlVGRl0pKQorICAgIGluZm9bTUVNT1JZX0JVRkZdPShbXSk7CisKKyAgUmVyZWFkUHJvZ3JhbUxpc3RzKDEpOworfQorCisvKiEKKyBXZW5uIGRhcyBhdWZydWZlbmRlIFByb2dyYW1tIGZ1ZXIgZGllIFNwZWljaGVybnV0enVuZyB6dWdlbGFzc2VuIGlzdCwKKyB3aXJkIGhpZXIgZGVyIEhhc2ggenVydWVja2dlZ2ViZW4gdW50ZXIgZGVtIHNlaW5lIERhdGVuIGFiZ2VzcGVpY2hlcnQKKyBzaW5kLiBEZXIgSGFzaCBpc3QgZGVyemVpdCBkZXIgRmlsZW5hbWUgZGVzIEJsdWVwcmludC4KKyovCitwcml2YXRlIHN0cmluZyBnZXRfY2FsbGVyX2hhc2goKSB7CisgIGlmIChtZW1iZXIoa25vd25fcHJvZ3JhbXMsIHByb2dyYW1fbmFtZShwcmV2aW91c19vYmplY3QoKSlbLi48M10pICE9IC0xKSAKKyAgICByZXR1cm4gcHJvZ3JhbV9uYW1lKHByZXZpb3VzX29iamVjdCgpKVsuLjwzXTsKKyAgZWxzZSAKKyAgICByZXR1cm4gMDsKK30KKworLyohIAorIERpZSBIaWxmc2Z1bmt0aW9uIGxpZXN0IGVpbmUgTGlzdGUgbWl0IERhdGVpbmFtZW4gdW5kIGdpYnQgZGllIFByb2dyYW1tZSAKKyBhbHMgQXJyYXkgb2YgU3RyaW5ncyB6dXJ1ZWNrLiBBbGxlIFplaWxlbiBkaWUgbmljaHQgbWl0IGVpbmVtIFNsYXNoIAorIGFuZmFuZ2VuLCB3ZXJkZW4gZGFiZWkgaWdub3JpZXJ0LgorIFxwYXJhbSBmaWxlIERpZSBhdXN6dWxlc2VuZGUgRGF0ZWkuCisqLworcHJpdmF0ZSBtaXhlZCByZWFkX2xpc3Qoc3RyaW5nIGZpbGUpCit7CisgIG1peGVkIGRhdGE7CisgIGlmICghc3RyaW5ncChmaWxlKSB8fCBmaWxlX3NpemUoZmlsZSkgPT0gRlNJWkVfTk9GSUxFICkKKyAgICByZXR1cm4gKHt9KTsKKworICAvLyBEYXRlbiBsYWRlbgorICBkYXRhID0gZXhwbG9kZShyZWFkX2ZpbGUoZmlsZSl8fCIiLCAiXG4iKTsKKworICAvLyBBbGxlIFplaWxlbiBkaWUgbmljaHQgbWl0IC8gYmVnaW5uZW4gZW50ZmVybmVuIC4uLgorICBkYXRhPXJlZ2V4cChkYXRhLCJeLy4rIik7CisKKyAgLy8gIi5jIiB1bmQgZXZlbnR1ZWxsZSBMZWVyemVpY2hlbiBpbiBqZWRlciBaZWlsZSB3ZXJkZW4gZW50ZmVybnQKKyAgZGF0YT0gbWFwKGRhdGEsIAorICAgICBmdW5jdGlvbiBzdHJpbmcgKHN0cmluZyB4KSB7cmV0dXJuIHJlZ3JlcGxhY2UoeCwiKC5jKSogKiQiLCIiLDEpO30pOworICByZXR1cm4gZGF0YTsKK30KKworLyohIAorIFdlbm4gZGllIExpc3RlIG1pdCBQcm9ncmFtbWVuIGdlYWVuZGVydCB3dXJkZSwga2FubiBzaWUgaGllciBwZXIgSGFuZAorIG5ldSBlaW5nZWxlc2VuIHdlcmRlbi4KKyBccGFyYW0gc2lsZW50IFZhcmFyZ3MgRmxhZywgdW0gQmlsZHNjaGlybWF1c2dhYmUgenUgdW50ZXJkcnVlY2tlbgorKi8KK3ZhcmFyZ3MgaW50IFJlcmVhZFByb2dyYW1MaXN0cyhpbnQgc2lsZW50KQoreworICAvLyBPYmpla3RlIGxhZGVuLCBkaWUgenVyIE11ZGxpYiBnZWhvZXJlbgorICBrbm93bl9wcm9ncmFtcyA9IHJlYWRfbGlzdCgiL3NlY3VyZS9tZW1vcnlfbGliIik7CisKKyAgLy8gT2JqZWt0ZSBsYWRlbiwgZGllIG5pY2h0IHp1ciBNdWRsaWIgZ2Vob2VyZW4KKyAga25vd25fcHJvZ3JhbXMrPXJlYWRfbGlzdCgiL3NlY3VyZS9tZW1vcnlfbm9saWIiKTsKKworICBpZighc2lsZW50KSBwcmludGYgKCIlT1xuIiwga25vd25fcHJvZ3JhbXMpOworCisgIHJldHVybiBzaXplb2Yoa25vd25fcHJvZ3JhbXMpOworfQorCisvKiEgWmVpZ2VyIGF1ZiBkZW4gU3BlaWNoZXIgaG9sZW4gKi8KK3ByaXZhdGUgbWFwcGluZyBnZXRfbWVtb3J5X3BvaW50ZXIoKXsKKyAgbWl4ZWQgaW5mbzsKKworICAvLyBEaWUgRmVobGVybWVsZHVuZ2VuIHNpbmQgZXR3YXMgYXVzZnVlaHJsaWNoZXIsIHVtIGRlbSBEZWJ1Z2dlcgorICAvLyBlaW5lbiBIaW53ZWlzIGF1ZiBSZXBhcmF0dXJtb2VnbGljaGtlaXRlbiB6dSBnZWJlbgorICBpZighcG9pbnRlcnAoaW5mbz1nZXRfZXh0cmFfd2l6aW5mbygwKSkpCisgICAgcmFpc2VfZXJyb3IoIldpemluZm8gbmljaHQgbGFkYmFyLiBFbnR3ZWRlciBpY2ggaGFiIGtlaW5lIFJlY2h0ZSAiCisgICAgICAgICAgICAgICAgIm9kZXIgZGFzIE11ZCBoYXQgZWluIGVjaHRlcyBQcm9ibGVtIVxuIik7CisKKyAgaWYoIW1hcHBpbmdwKGluZm9bTUVNT1JZX0JVRkZdKSkKKyAgICByYWlzZV9lcnJvcigiSWNoIGZpbmRlIG1laW5lIERhdGVuIGluIGRlciBXaXppbmZvIG5pY2h0LiBFaW4gRU0ga2FubiAiCisgICAgICAgICAgICAgICAgInZlcnN1Y2hlbiwgbWljaCBuZXUgenUgbGFkZW4sIGFiZXIgd2FzIGRpZSBhbHRlbiBEYXRlbiAiCisgICAgICAgICAgICAgICAgImJldHJpZmZ0LCBmcmVpIG5hY2ggQ2F0dHk6IEtlaW5lIEFybWUsIGtlaW5lIEtla3NlIVxuIik7CisgIC8vIERhIGluZm9bTUVNT1JZX0JVRkZdIGltbWVyIGVpbiBNYXBwaW5nIGlzdCAoc2llaGUgQ3JlYXRlKSwgd2lyZCBoaWVyIGVpbiAKKyAgLy8gUG9pbnRlciB1ZWJlcmdlYmVuLiBEYWR1cmNoIHdlcmRlbiBEZXRhaWxzIHp1bSBBdWZiYXUgZGVyIGV4dHJhX3dpemluZm8KKyAgLy8gbnVyIGluIGRpZXNlciBGdW5rdGlvbiBiZW5vZXRpZ3QuCisgIHJldHVybiBpbmZvW01FTU9SWV9CVUZGXTsgCit9CisKKy8qIQorICBQcnVlZmVuLCBvYiBwcmV2aW91c19vYmplY3QoKSBOdXR6dW5nc3JlY2h0ZSBmdWVyIGRlbiBNZW1vcnkgaGF0LgorICBccmV0dXJuIEdpYnQgMSB6dXJ1ZWNrLCB3ZW5uIGRlciBBdWZydWZlbmRlIGJlcmVjaHRpZ3QgaXN0LCBkYXMgCisgICAgICAgICAgT2JqZWt0IHp1IG51dHplbiwgc29uc3QgMAorKi8KK2ludCBIYXZlUmlnaHRzKCl7CisgIHJldHVybiBzdHJpbmdwKGdldF9jYWxsZXJfaGFzaCgpKTsKK30KKworLyohCisgRGF0ZW4gaW0gTWVtb3J5IGFibGVnZW4KKyBccGFyYW0ga2V5IElEIHVudGVyIGRlciBkaWUgRGF0ZW4gZ2VzcGVpY2hlcnQgd2VyZGVuCisgXHBhcmFtIHZhciBadSBzcGVpY2hlcm5kZXMgRGF0dW0KKyovCitpbnQgU2F2ZShzdHJpbmcga2V5LCBtaXhlZCB2YXIpIHsKKyAgc3RyaW5nIHdobzsKKyAgbWFwcGluZyBtZW1vcnk7CisKKyAgLy8gSGFzaCBkZXMgQXVmcnVmZXJzIGhvbGVuLiBIYXQgZGVyIGtlaW5lbiwgaXN0IGVyIG5pY2h0IGJlZnVndCwKKyAgLy8gZGVuIE1lbW9yeSB6dSBudXR6ZW4uCisgIGlmKCFzdHJpbmdwKHdobz1nZXRfY2FsbGVyX2hhc2goKSkpIHJldHVybiAwOworCisgIC8vIFdlbm4ga2VpbiBLZXkgdWViZXJnZWJlbiB3aXJkLCBrYW5uIGF1Y2ggbmljaHRzIGdlc3BlaWNoZXJ0IHdlcmRlbi4KKyAgaWYoIXN0cmluZ3Aoa2V5KSkgcmV0dXJuIDA7CisKKyAgLy8gKGhvZmZlbnRsaWNoKSBnbG9iYWxlbiBtZW1vcnlfcG9pbnRlciBob2xlbgorICBtZW1vcnkgPSBnZXRfbWVtb3J5X3BvaW50ZXIoKTsKKworICAvLyBXZW5uIGtlaW5lIERhdGVuIGRhIHNpbmQsIG11c3MgbWFuIGF1Y2ggbmljaHRzIGFubGVnZW4uIFJ1ZWNrZ2FiZXdlcnQKKyAgLy8gaXN0IGRlbm5vY2ggMSwgd2VpbCBMb2FkIGJlaSB1bmJla2FubnRlbiBLZXlzIGF1Y2ggMCBsaWVmZXJ0LCBkaWUgCisgIC8vIE51bGwgd2lyZCBhbHNvIGtvcnJla3QgZ2VzcGVpY2hlcnQsIGlyZ2VuZHdpZS4gRGFzIG11c3MgYWJlciBuYWNoIGRlbQorICAvLyBnZXRfbWVtb3J5X3BvaW50ZXIoKSBwYXNzaWVyZW4sIGRhIHNvbnN0IGRhcyBLb3JyZWt0ZSBGdW5rdGlvbmllcmVuIHZvbgorICAvLyBMb2FkIG5pY2h0IHNpY2hlcmdlc3RlbGx0IGlzdC4KKyAgaWYodmFyPT0wKSByZXR1cm4gMTsKKworICAvLyBFcnN0ZXIgQXVmcnVmIGR1cmNoIFBPPyBEYW5uIG11c3Mgc2VpbiBTcGVpY2hlcmJlcmVpY2ggaW5pdGlhbGlzaWVydCAKKyAgLy8gd2VyZGVuCisgIGlmKCFtZW1iZXIobWVtb3J5LHdobykpCisgICAgbWVtb3J5W3dob109KFtdKTsKKworICAvLyBFbmRsaWNoISBEYXRlbiBrb2VubmVuIGdlc3BlaWNoZXJ0IHdlcmRlbi4KKyAgbWVtb3J5W3dob11ba2V5XT12YXI7CisKKyAgcmV0dXJuIDE7Cit9CisKKy8qIQorIERhdGVuIGF1c2dlYmVuL3JlZmVyZW56aWVyZW4KKyBccGFyYW0ga2V5IElkIHVudGVyIGRlciBkaWUgRGF0ZW4gZ2VzcGVpY2hlcnQgc2luZC4KKyovCittaXhlZCBMb2FkKHN0cmluZyBrZXkpIHsKKyAgc3RyaW5nIHdobzsKKyAgbWFwcGluZyBtZW1vcnk7CisKKyAgLy8gSGFzaCBkZXMgQXVmcnVmZXJzIGhvbGVuLiBIYXQgZGVyIGtlaW5lbiwgaXN0IGVyIG5pY2h0IGJlZnVndCwKKyAgLy8gZGVuIE1lbW9yeSB6dSBudXR6ZW4uCisgIGlmKCFzdHJpbmdwKHdobz1nZXRfY2FsbGVyX2hhc2goKSkpIHJldHVybiAwOworCisgIC8vIFdlbm4ga2VpbiBLZXkgdWViZXJnZWJlbiB3aXJkLCBrYW5uIGF1Y2ggbmljaHRzIGdlc3BlaWNoZXJ0IHdlcmRlbi4KKyAgaWYoIXN0cmluZ3Aoa2V5KSkgcmV0dXJuIDA7CisKKyAgLy8gKGhvZmZlbnRsaWNoKSBnbG9iYWxlbiBtZW1vcnlfcG9pbnRlciBob2xlbgorICBtZW1vcnkgPSBnZXRfbWVtb3J5X3BvaW50ZXIoKTsKKworICAvLyBEYXMgT2JqZWt0IGhhdCBub2NoIG5pZSBTYXZlKCkgYXVmZ2VydWZlbi4KKyAgaWYoIW1lbWJlcihtZW1vcnksd2hvKSkKKyAgICByZXR1cm4gMDsKKworICAvLyBVbnRlciBkaWVzZW0gS2V5IGlzdCBub2NoIG5pY2h0cyBnZXNwZWljaGVydC4KKyAgaWYoIW1lbWJlcihtZW1vcnlbd2hvXSxrZXkpKQorICAgIHJldHVybiAwOworCisgIC8vIEdlc3BlaWNoZXJ0ZW4gV2VydCB6dXJ1ZWNrZ2ViZW4KKyAgcmV0dXJuIG1lbW9yeVt3aG9dW2tleV07Cit9CisKKy8qISAKKyBFaW4gRWludHJhZyBvZGVyIGFsbGUgRWludHJhZWdlIHdlcmRlbiBnZWxvZXNjaHQKKyBccGFyYW0ga2V5IElkIHVudGVyIGRlciBkaWUgRGF0ZW4gZ2VzcGVpY2hlcnQgc2luZC4gCisgICAgICAgICAgICBXaXJkIGtlaW4gS2V5IHVlYmVyZ2ViZW4sIHdlcmRlbiBhbGxlIERhdGVuIGRlcyBPYmpla3RzIAorICAgICAgICAgICAgZ2Vsb2VzY2h0LgorKi8KK3ZhcmFyZ3MgaW50IFJlbW92ZShzdHJpbmcga2V5KSB7CisgIHN0cmluZyB3aG87CisgIG1hcHBpbmcgbWVtb3J5OworCisgIC8vIEhhc2ggZGVzIEF1ZnJ1ZmVycyBob2xlbi4gSGF0IGRlciBrZWluZW4sIGlzdCBlciBuaWNodCBiZWZ1Z3QsCisgIC8vIGRlbiBNZW1vcnkgenUgbnV0emVuLgorICBpZighc3RyaW5ncCh3aG89Z2V0X2NhbGxlcl9oYXNoKCkpKSByZXR1cm4gMDsKKworICAvLyAoaG9mZmVudGxpY2gpIGdsb2JhbGVuIG1lbW9yeV9wb2ludGVyIGhvbGVuCisgIG1lbW9yeSA9IGdldF9tZW1vcnlfcG9pbnRlcigpOworCisgIC8vIERhcyBPYmpla3QgaGF0IG5vY2ggbmllIFNhdmUoKSBhdWZnZXJ1ZmVuLgorICBpZighbWVtYmVyKG1lbW9yeSx3aG8pKSByZXR1cm4gMDsKKworICAvLyBXZW5uIGtlaW4gS2V5IHVlYmVyZ2ViZW4gd2lyZCwgd2lyZCBhbGxlcyB6dW0gT2JqZWt0IGdlaG9lcmVuZGUgZ2Vsb2VzY2h0LgorICBpZihzdHJpbmdwKGtleSkpeworICAgIC8vIFVudGVyIGRpZXNlbSBLZXkgaXN0IG5pY2h0cyBnZXNwZWljaGVydC4KKyAgICBpZighbWVtYmVyKG1lbW9yeVt3aG9dLGtleSkpIHJldHVybiAwOworCisgICAgLy8gV2VydCB1bnRlciBLZXkgZnVlciBkYXMgRmlsZSBsb2VzY2hlbgorICAgIG1fZGVsZXRlKG1lbW9yeVt3aG9dLCBrZXkpOworCisgIH0gZWxzZSB7CisgICAgLy8gQWxsZXMgZnVlciBkYXMgRmlsZSBsb2VzY2hlbgorICAgIG1fZGVsZXRlKG1lbW9yeSwgd2hvKTsKKyAgfQorCisgIHJldHVybiAxOyAKK30KKwordmFyYXJncyB2b2lkIFNob3dEYXRhKHN0cmluZyB1c2VyLCBzdHJpbmcga2V5KQoreworICAvLyBCZWthbm50ZSBPYmpla3RlCisgIGlmICghRUxERVJfU0VDVVJJVFkgKQorICAgIHByaW50ZigiSSdtIGZpbmUuIFRoYW5rcyBmb3IgYXNraW5nLlxuIik7CisgIGVsc2UgeworICAgIHByaW50Zigia25vd25fcHJvZ3JhbXM6XG4lT1xuXG4iLCBrbm93bl9wcm9ncmFtcyk7CisgICAgLy8gRU0gZHVlcmZlbiBzaWNoIGF1Y2ggbm9jaCB6dXNjcm9sbGVuIGxhc3Nlbiwgd2VubiBzaWUgd29sbGVuCisgICAgaWYgKEFSQ0hfU0VDVVJJVFkgJiYgdXNlcikKKyAgICB7CisgICAgICBtYXBwaW5nIGRhdGEgPSBnZXRfbWVtb3J5X3BvaW50ZXIoKTsKKyAgICAgIGlmICghbWVtYmVyKGRhdGEsdXNlcikpCisgICAgICAgIHByaW50ZigibWVtb3J5OiBLZWluZSBEYXRlbiBmdWVyICVzIHZvcmhhbmRlbi5cbiIsdXNlcik7CisgICAgICBlbHNlIGlmICh1c2VyICYmIGtleSkKKyAgICAgICAgcHJpbnRmKCJtZW1vcnk6IERhdGVuIGZ1ZXIgVXNlciAlcywgS2V5ICVzOlxuJU9cbiIsdXNlciwga2V5LAorICAgICAgICAgICAgICAgICAgZGF0YVt1c2VyXVtrZXldKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcHJpbnRmKCJtZW1vcnk6IERhdGVuIGZ1ZXIgVXNlciAlczpcbiVPXG4iLHVzZXIsZGF0YVt1c2VyXSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBtYXBwaW5nIG1lbW9yeTsKKyAgICAgIG1lbW9yeSA9IGdldF9tZW1vcnlfcG9pbnRlcigpOworICAgICAgLy8gQW5kZXJlIGJla29tbWVuIGVpbmUgYW5vbnltaXNpZXJ0ZSBWZXJzaW9uCisgICAgICBwcmludGYoIm1lbW9yeTogKE51ciBGZWxkbmFtZW4sIGtlaW5lIERhdGVuKVxuIik7CisgICAgICBmb3JlYWNoIChzdHJpbmcgcHJvZ3JhbSwgbWFwcGluZyBkYXRhOiBtZW1vcnkgKSB7CisgICAgICAgIGlmICggbWFwcGluZ3AoZGF0YSkgJiYgc2l6ZW9mKGRhdGEpICl7CisgICAgICAgICAgcHJpbnRmKGJyZWFrX3N0cmluZygKKyAgICAgICAgICAgICAgICAgICBpbXBsb2RlKG1faW5kaWNlcyhkYXRhKSwiO1xuIiksIDc4LCAgCisgICAgICAgICAgICAgICAgICAgc3ByaW50ZigiICAlLTUwczogIixwcm9ncmFtKSksMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICBwcmludGYoIiAgJS01MHM6IC0gbGVlciAtXG4iLCBwcm9ncmFtKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuOworfQorCmRpZmYgLS1naXQgYS9zZWN1cmUvbWVtb3J5X2xpYiBiL3NlY3VyZS9tZW1vcnlfbGliCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NTM5YjEKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvbWVtb3J5X2xpYgpAQCAtMCwwICsxLDkgQEAKKyMgT2JqZWt0ZSBkaWUgaW4gZGllc2VyIERhdGVpIHN0ZWhlbiwgaGFiZW4gZGllIEJlcmVjaHRpZ3VuZyAKKyMgL3NlY3VyZS9tZW1vcnkuYyB6dSBudXR6ZW4uCisjCisjIERpZXNlIERhdGVpIHdpcmQgbWl0IGRlbSBNdWRsaWItUmVsZWFzZSB2ZXJ0ZWlsdCwgZGFoZXIgZHVlcmZlbgorIyBoaWVyIG51ciBPYmpla3RlIGF1Zmdlbm9tbWVuIHdlcmRlbiBkaWUgenVyIFN0YW5kYXJkLU11ZGxpYgorIyBnZWhvZXJlbgorL3AvZGFlbW9uL2NoYW5uZWxkCisvcC9kYWVtb24vdHJhdmVsZAorL3NlY3VyZS9zaGFkb3dtYXN0ZXIKZGlmZiAtLWdpdCBhL3NlY3VyZS9tZXJsaW4uYyBiL3NlY3VyZS9tZXJsaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDc1YmVjCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL21lcmxpbi5jCkBAIC0wLDAgKzEsMTM0NSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIG1lcmxpbi5jIC0tIFVuc2VyIGdlbGllYnRlciBNZXJsaW4KKy8vCisvLyAkSWQ6IG1lcmxpbi5jIDk0MDUgMjAxNS0xMi0xMyAwMDoyMjowMVogWmVzc3RyYSAkCisjcHJhZ21hIHN0cmljdF90eXBlcworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBub19zaGFkb3cKKyNwcmFnbWEgbm9faW5oZXJpdAorI3ByYWdtYSB2ZXJib3NlX2Vycm9ycworI3ByYWdtYSBjb21iaW5lX3N0cmluZ3MKKy8vI3ByYWdtYSBwZWRhbnRpYworLy8jcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIHdhcm5fZGVwcmVjYXRlZAorCisvLyAyMDE0LU1haS0xMCwgQXJhdGhvcm46IEVyIHNvbGwgamEgd2VpdGVyaGluIGF1ZiB0bSByZWFnaWVyZW4uCitpbmhlcml0ICJzdGQvbnBjL2NvbW0uYyI7CisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8ZXhwbG9yYXRpb24uaD4KKyNpbmNsdWRlIDxuZXdzLmg+CisjaW5jbHVkZSA8ZXhwbG9yYXRpb24uaD4KKyNpbmNsdWRlIDxldmVudHMuaD4KKyNpbmNsdWRlIDxkYWVtb24vY2hhbm5lbC5oPgorI2luY2x1ZGUgIi9zZWN1cmUvd2l6bGV2ZWxzLmgiCisjaW5jbHVkZSAiL3NlY3VyZS9jb25maWcuaCIKKyNpbmNsdWRlICIvc2VjdXJlL3F1ZXN0bWFzdGVyLmgiCisjaW5jbHVkZSAiL3NlY3VyZS9sZXBtYXN0ZXIuaCIKKworI2lmbmRlZiBERUJVRworI2RlZmluZSBERUJVRyh4KSBpZiAoZmluZF9wbGF5ZXIoInpvb2siKSkgdGVsbF9vYmplY3QoZmluZF9wbGF5ZXIoInpvb2siKSx4KQorI2VuZGlmCisKKyNkZWZpbmUgU0FWRUZJTEUgIi9zZWN1cmUvQVJDSC9tZXJsaW4iCisjZGVmaW5lIEJTKHgpIGJyZWFrX3N0cmluZygoeCksNzgpCisjZGVmaW5lIEZFSExFUlRFVUZFTCAiL29iai90b29scy9mZWhsZXJ0ZXVmZWwiCisKK21peGVkIFF1ZXJ5UHJvcChzdHJpbmcgcHJvcCk7CitpbnQgbW92ZShtaXhlZCBkZXN0LCBpbnQgbWV0aG9kKTsKK3N0cmluZyBxdWVyeV9nX3N1ZmZpeChpbnQgZ2VuLCBpbnQgY2FzdXMsIGludCBhbnphaGwpOworc3RyaW5nIG1ha2VfaW52bGlzdChvYmplY3Qgdmlld2VyLG9iamVjdCAqaW52KTsKK3N0YXRpYyBpbnQgZGV0ZXJtaW5lX2FjdGlvbihzdHJpbmcgbWVzcywgc3RyaW5nIG5hbWUpOworc3RhdGljIGludCBjcmVhdGVfd2l6YXJkKG1peGVkIHdobywgbWl4ZWQgcHJvbW90ZXIpOworc3RhdGljIGludCBjcmVhdGVfc2VlcihtaXhlZCB3aG8pOworc3RhdGljIHZvaWQgZ2l2ZV9oZWxwKG1peGVkIHdobyk7CitpbnQgZ290byhtaXhlZCBkZXN0KTsKKworbm9zYXZlIHN0cmluZyAqd2hpdGVzcGFjZXM9KHsiLCIsIi4iLCI/IiwiOyIsIjoiLCItIiwiISIsIlxuIiwiXHQifSk7Citub3NhdmUgb2JqZWN0IHByZXZfcm9vbTsKK25vc2F2ZSBpbnQgZGVsYXksbWF4dXNlcnMsYnVzeTsKK25vc2F2ZSBzdHJpbmcgZmxhZzsKKworbWFwcGluZyBNQmFuaXNoTGlzdGU7CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgc3RyaW5nIHM7CisgIHNldGV1aWQoUk9PVElEKTsKKyAgaWYgKGZpbGVfc2l6ZSgiL2V0Yy9tYXh1c2VycyIpPD0wKQorICAgIG1heHVzZXJzPTA7CisgIGVsc2UKKyAgeworICAgIHM9cmVhZF9maWxlKCIvZXRjL21heHVzZXJzIiwwLDEpOworICAgIHNzY2FuZihzLCIlZCIsbWF4dXNlcnMpOworICB9CisgIHNldF9saXZpbmdfbmFtZSgibWVybGluIik7CisgIGVuYWJsZV9jb21tYW5kcygpOworICBjYWxsX291dCgid2FuZGVybiIsMjUpOworICBtb3ZlKCIvZ2lsZGVuL2FiZW50ZXVyZXIiLDApOworICBNQmFuaXNoTGlzdGUgPSBtX2FsbG9jYXRlKDAsMik7CisgIHJlc3RvcmVfb2JqZWN0KFNBVkVGSUxFKTsKKyAgRVZFTlRELT5SZWdpc3RlckV2ZW50KEVWVF9MSUJfUExBWUVSX0NSRUFUSU9OLCAicGxheWVyX2NoYW5nZSIsIE1FKTsKKyAgRVZFTlRELT5SZWdpc3RlckV2ZW50KEVWVF9MSUJfTE9HSU4sICJwbGF5ZXJfY2hhbmdlIiwgTUUpOworICAvLyBhYnNpY2h0bGljaCBrZWluIEVWVF9MSUJfTE9HT1VULCBzLiBLb21tZW50YXIgenUgbm90aWZ5X3BsYXllcl9sZWF2ZSgpLgorfQorCitzdHJpbmcgX3F1ZXJ5X2tpbGxfbmFtZSgpCit7CisgIHJldHVybiAiRWluIGdlbmVydnRlciBNZXJsaW4iOworfQorCitpbnQgbW92ZShtaXhlZCBvYixpbnQgbWV0aG9kcykKK3sKKyAgb2JqZWN0IHRtcDsKKworICBpZiAobWV0aG9kcyZNX0dFVCkKKyAgICByZXR1cm4gTUVfQ0FOVF9CRV9UQUtFTjsKKworICBpZiAoc3RyaW5ncChvYikpCisgIHsKKyAgICBpZiAoISh0bXA9ZmluZF9vYmplY3Qob2IpKSkKKyAgICB7CisgICAgICBjYWxsX290aGVyKG9iLCI/Iik7CisgICAgICB0bXA9ZmluZF9vYmplY3Qob2IpOworICAgIH0KKyAgICBvYj10bXA7CisgIH0KKyAgaWYgKCFvYmplY3RwKG9iKSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKGVudmlyb25tZW50KCkpCisgICAgdGVsbF9yb29tKGVudmlyb25tZW50KCksIk1lcmxpbiB6aWVodCB3ZWl0ZXIuXG4iKTsKKyAgdGVsbF9yb29tKG9iLCJNZXJsaW4ga29tbXQgYW4uXG4iKTsKKyAgbW92ZV9vYmplY3Qob2IpOworICByZXR1cm4gMTsKK30KKworbWl4ZWQgUXVlcnlQcm9wKHN0cmluZyBzdHIpCit7CisgIGlmICghc3RyaW5ncChzdHIpfHxzdHI9PSIiKQorICAgIHJldHVybiAwOworICByZXR1cm4gY2FsbF9vdGhlcih0aGlzX29iamVjdCgpLCJfcXVlcnlfIitzdHIpOworfQorCit2YXJhcmdzIGludCBpZChzdHJpbmcgc3RyKQoreworICByZXR1cm4gKHN0cj09Im1lcmxpbiIpOworfQorCit2YXJhcmdzIHN0cmluZyBuYW1lKGludCBjYXN1cywgaW50IGRlbW9uKQoreworICBpZiAoY2FzdXMhPVdFU1NFTikKKyAgICByZXR1cm4gIk1lcmxpbiI7CisgIHJldHVybiAiTWVybGlucyI7Cit9CisKK3ZhcmFyZ3Mgc3RyaW5nIE5hbWUoaW50IGNhc3VzLCBpbnQgZGFlbW9uKQoreworICByZXR1cm4gbmFtZShjYXN1cyxkYWVtb24pOworfQorCitzdHJpbmcgUXVlcnlEdShpbnQgY2FzdXMsIGludCBnZW5kZXIsIGludCB6YWhsKQoreworICByZXR1cm4KKyAgICAoeyAoeyAoeyAiZHUiLCAiaWhyIn0pLCAoeyAiZHUiLCAiaWhyIn0pLCAoeyAiZHUiLCAiaWhyIn0pIH0pLAorICAgICAgICAgKHsoeyJkZWluZXMiLCJkZWluZXIifSksKHsiZGVpbmVzIiwiZGVpbmVyIn0pLCh7ImRlaW5lciIsImRlaW5lciJ9KX0pLAorICAgICAgICAgKHsoeyJkaXIiLCJldWNoIn0pLCh7ImRpciIsImV1Y2gifSksKHsiZGlyIiwiZXVjaCJ9KX0pLAorICAgICAgICAgKHsoeyJkaWNoIiwiZXVjaCJ9KSwoeyJkaWNoIiwiZXVjaCJ9KSwoeyJkaWNoIiwiZXVjaCJ9KX0pCisgICAgICAgfSlbY2FzdXNdW2dlbmRlcl1bemFobF07Cit9CisKK3N0cmluZyBsb25nKCkKK3sKKyAgRVBNQVNURVItPkdpdmVFeHBsb3JhdGlvblBvaW50KCJtZXJsaW4iKTsKKyAgcmV0dXJuIGJyZWFrX3N0cmluZygKKyAgICAgICJNZXJsaW4gLSBkZXIgbWFlY2h0aWdlIFVydmF0ZXIgYWxsZXIgTWFnaWVyIC0gaXN0IGVpbiBoYWdlcmVyICIKKyAgICAgICJNYW5uLCBkZXIgZWluZW4gYmxhdWVuLCBtaXQgTW9uZGVuIHVuZCBTdGVybmVuIHVlYmVyc2FldGVuIFVtaGFuZyAiCisgICAgICAidHJhZWd0IHVuZCBzaWNoIGF1ZiBlaW5lbiBrbm9ycmlnZW4gU3RvY2sgc3R1ZXR6dC4gU2VpbiBsYW5nZXIgd2Vpc3NlciAiCisgICAgICAiQmFydCByZWljaHQgaWhtIGZhc3QgYmlzIHp1ciBHdWVydGVsc2NobmFsbGUsIHNlaW4gSGF1cHRoYWFyIGlzdCBmYXN0ICIKKyAgICAgICJlYmVuc28gbGFuZy4gQXVmIHNlaW5lbSBLb3BmIHRyYWVndCBlciBlaW5lbiBzcGl0emVuIEh1dCwgZGVyIGlobiBub2NoICIKKyAgICAgICJncm9lc3NlciBtYWNodCwgYWxzIGVyIG9obmVoaW4gc2Nob24gaXN0LlxuRXIgaXN0IHVuYW5ncmVpZmJhciwgZGVubiAiCisgICAgICAiZXIgc3RlaHQgdWViZXIgc29sY2hlbiBEaW5nZW4uIiw3OCxCU19MRUFWRV9NWV9MRlMpOworfQorCitzdHJpbmcgR2V0RGV0YWlsKHN0cmluZyBrZXksbWl4ZWQgcmFjZSxpbnQgc2Vuc2UpIHsKKyAgc3dpdGNoKCBzZW5zZSApIHsKKyAgY2FzZSBTRU5TRV9TTUVMTDogcmV0dXJuIDA7CisgIGNhc2UgU0VOU0VfU09VTkQ6IHJldHVybiAwOworICB9CisgIHN3aXRjaCgga2V5ICkgeworICBjYXNlICJuYXNlIjogY2FzZSAibmFzZW5oYWFyZSI6IGNhc2UgImhha2VubmFzZSI6CisgICAgICAgICAgcmV0dXJuIEJTKCJNZXJsaW4gaGF0IGVpbmUgbGFuZ2UsIGtydW1tZSBIYWtlbm5hc2UsIGF1cyBkZXJlbiBOYXNlbmxvZWNoZXJuIHdlaXNzZSBIYWFyZSBzcHJpZXNzZW4uIEF1ZiBzZWluZXIgTmFzZSBzaXR6dCBlaW5lIEJyaWxsZSBtaXQgR2xhZXNlcm4gaW4gRm9ybSBlaW5lcyBIYWxibW9uZGVzLiIpOworICBjYXNlICJicmlsbGUiOiBjYXNlICJnbGFlc2VyIjogY2FzZSAiZm9ybSI6IGNhc2UgImhhbGJtb25kIjoKKyAgICAgICAgICByZXR1cm4gIk1lcmxpbnMgQnJpbGxlIGJlc2l0enQgR2xhZXNlciBpbiBGb3JtIGVpbmVzIEhhbGJtb25kZXMuXG4iOworICBjYXNlICJiYXJ0IjoKKyAgICAgICAgICByZXR1cm4gIk1lcmxpbnMgQmFydCBpc3Qgc2VociBsYW5nIC0gRXIgcmVpY2h0IGZhc3QgYmlzIHVlYmVyIGRpZSBHdWVydGVsc2NobmFsbGUuXG4iOworICBjYXNlICJoYWFyZSIgOgorICAgICAgICAgIHJldHVybiAiU2llIHJlaWNoZW4gaWhtIGJpcyB6d2lzY2hlbiBkaWUgU2NodWx0ZXJibGFldHRlci5cbiI7CisgIGNhc2UgInNjaHVsdGVyYmxhZXR0ZXIiOiBjYXNlICJzY2h1bHRlcmJsYXR0IjoKKyAgICAgICAgICByZXR1cm4gIlNlaW5lIGxhbmdlbiBIYWFyZSBiZWRlY2tlbiBkaWUgU2NodWx0ZXJibGFldHRlci5cbiI7CisgIGNhc2UgImdld2FuZCI6IGNhc2UgInJvYmUiOgorICAgICAgICAgIHJldHVybiBCUygiRGFzIEdld2FuZCBpc3QgYmxhdSB1bmQgbWl0IHNpbGJlcm5lbiBNb25kZW4gdW5kIFN0ZXJuZW4gYmVzdGlja3QuIEVzIGlzdCB1cmFsdCB1bmQgc2Nob24gZXR3YXMgYWJnZXRyYWdlbiwgYWJlciBlcyBlcmZ1ZWxsdCBpbW1lciBub2NoIHNlaW5lbiBad2Vjay4iKTsKKyAgY2FzZSAiendlY2siOgorICAgICAgICAgIHJldHVybiBCUygiRGVyIFp3ZWNrIGRlcyBHZXdhbmRlcyBiZXN0ZWh0IGRhcm4sIE1lcmxpbiBzdGFuZGVzZ2VtYWVzcyB6dSBiZWtsZWlkZW4uIERpZXNlbSBad2VjayBrb21tdCBkYXMgR2V3YW5kIGluIFZvbGxlbmR1bmcgbmFjaC4iKTsKKyAgY2FzZSAidm9sbGVuZHVuZyI6CisgICAgICAgICAgcmV0dXJuICJOaWNodHMgaXN0IHZvbGxrb21tZW4uXG4iOworICBjYXNlICJodXQiOgorICAgICAgICAgIHJldHVybiBCUygiRWluIGxhbmdlciwgc3BpdHplciBIdXQsIGRlciBpbiBkZXIgZ2xlaWNoZW4gV2Vpc2Ugd2llIHNlaW5lIFJvYmUgbWl0IE1vbmRlbiB1bmQgU3Rlcm5lbiBiZXN0aWNrdCBpc3QuIik7CisgIGNhc2UgIm1vbmQiOiBjYXNlICJtb25kZSI6IGNhc2UgInN0ZXJuIjogY2FzZSAic3Rlcm5lIjoKKyAgICAgICAgICByZXR1cm4gQlMoIkRpZSBNb25kZSB1bmQgZGllIFN0ZXJuZSBzaW5kIG1pdCBzaWxicmlnZW4gRmFlZGVuIGdlc3RpY2t0LCBkaWUgZGFzIExpY2h0IGZ1bmtlbG5kIHp1cnVlY2t3ZXJmZW4uIik7CisgIGNhc2UgImZhZGVuIjogY2FzZSAiZmFlZGVuIjoKKyAgICAgICAgICByZXR1cm4gQlMoIlNjaHdlciB6dSBzYWdlbiwgd29yYXVzIGRpZSBGYWVkZW4gc2luZC4gTWl0aHJpbD8gIgorICAgICAgICAgICAgICAiTW9uZHNpbGJlcj8iKTsKKyAgY2FzZSAibGljaHQiOiBjYXNlICJtb25kc2lsYmVyIjogY2FzZSAibWl0aHJpbCI6CisgICAgICAgICAgcmV0dXJuIEJTKCJEdSBzdHJlY2t0IHNjaG9uIERlaW5lIEhhbmQgYXVzLCB1bSBNZXJsaW5zIEdld2FuZCBuYWVoZXIgenUgdW50ZXJzdWNoZW4sIGFiZXIgZGEgdHJpZmZ0IERpY2ggc2VpbiBzdHJlbmdlciBCbGljay4gU2NodWVjaHRlcm4gbmltbXN0IER1IHZvbiBEZWluZW0gVm9yaGFiZW4gQWJzdGFuZC4iKTsKKyAgY2FzZSAiYWJzdGFuZCI6CisgICAgICAgICAgcmV0dXJuIEJTKCJWb24gc28gZWluZW0gTWFnaWVyIHNvbGx0ZSBtYW4gYXVzIFJlc3Bla3QgZWluZW4gU2Nocml0dCBBYnN0YW5kIGhhbHRlbi4iKTsKKyAgY2FzZSAicmVzcGVrdCI6CisgICAgICAgICAgcmV0dXJuICJEdSBoYXN0IHNpY2hlciBtZWhyIFJlc3Bla3Qgdm9yIE1lcmxpbiwgYWxzIGVyIHZvciBEaXIuXG4iOworICBjYXNlICJzY2hyaXR0IjoKKyAgICAgICAgICByZXR1cm4gIldlc3NlbiBTY2hyaXR0Pz9cbiI7CisgIGNhc2UgImhhbmQiOiBjYXNlICJoYWVuZGUiOgorICAgICAgICAgIHJldHVybiBCUygiTWVybGlucyBIYWVuZGUgaGFiZW4gbGFuZ2UsIGdpY2h0Z2VwbGFndGUgRmluZ2VyIHVuZCBnZWxiZSBsYW5nZSBGaW5nZXJuYWVnZWwuIFNlaW5lIGxpbmtlIEhhbmQgc3R1ZXR6dCBzaWNoIGF1ZiBzZWluZW4ga25vcnJpZ2VuIEdlaHN0b2NrLiBEaWUgcmVjaHRlIEhhbmQgaXN0IHVudGVyIHNlaW5lbSBHZXdhbmQgdmVyYm9yZ2VuLiIpOworICBjYXNlICJnaWNodGtub3RlbiI6IGNhc2UgImdpY2h0IjoKKyAgICAgICAgICByZXR1cm4gQlMoIkR1cmNoIGRpZSBHaWNodGtub3RlbiBzZWhlbiBzZWluZSBIYWVuZGUgZmFzdCBzbyBrbm9ycmlnIHdpZSBzZWluIEdlaHN0b2NrIGF1cy4iKTsKKyAgY2FzZSAiZmluZ2VyIjogY2FzZSAiZmluZ2VybmFlZ2VsIjogY2FzZSAiZmluZ2VybmFnZWwiOgorICAgICAgICAgIHJldHVybiBCUygiU2VpbmUgRmluZ2VyIHNpbmQgdm9sbGVyIEdpY2h0a25vdGVuIHVuZCBzZWluZSBnZWxiZW4gRmluZ2VybmFlZ2VsIGtvZW5udGUgTWVybGluIGF1Y2ggbWFsIHdpZWRlciBzY2huZWlkZW4uIik7CisgIGNhc2UgImdlaHN0b2NrIjogY2FzZSAic3RvY2siOgorICAgICAgICAgIHJldHVybiBCUygiTWVybGluIHN0dWV0enQgc2ljaCBhdWYgZWluZW4gR2Voc3RvY2suIERlciBrbm9ycmlnZSBTdG9jayBzY2hlaW50IHNjaG9uIGZhc3QgRWlucyBtaXQgc2VpbmVyIGdpY2h0a25vdGlnZW4gSGFuZCBnZXdvcmRlbiB6dSBzZWluLiBPYiBlcyBzaWNoIGJlaSBkZW0gU3RvY2sgdW0gZWluZW4gTWFnaWVyc3RhYiBoYW5kZWx0PyIpOworICBjYXNlICJ6YXViZXJzdGFiIjogY2FzZSAibWFnaWVyc3RhYiI6CisgICAgICAgICAgcmV0dXJuIEJTKCJNZXJsaW4gc3R1ZXR6dCBzaWNoIGF1ZiBlaW5lbiBrbm9ycmlnZW4gR2Voc3RvY2suIERhcyBrb2VubnRlIHNlaW4gWmF1YmVyc3RhYiBzZWluIC0gYWJlciB2aWVsbGVpY2h0IGlzdCBlcyBhdWNoIG51ciBlaW4gR2Voc3RvY2suIik7CisgIGNhc2UgImd1ZXJ0ZWwiOiBjYXNlICJndWVydGVsc2NobmFsbGUiOgorICAgICAgICAgIHJldHVybiBCUygiU2VpbiBHZXdhbmQgd2lyZCB2b24gZWluZW0gd2Vpc3NlbiBHdWVydGVsIGdlaGFsdGVuLiBWb3JuZSwgdW50ZXIgc2VpbmVtIEJhcnQsIGthbm5zdCBEdSBkaWUgR3VlcnRlbHNjaG5hbGxlIHNlaGVuLiBBdWYgZGVyIEd1ZXJ0ZWxzY2huYWxsZSBzdGVodDogJ0ljaCBrb2VubnRlIGplZGVyemVpdCBhdWZob2VyZW4uJyIpOworICB9CisgIHJldHVybiAwOworfQorCisKK3N0cmluZyBzaG9ydCgpCit7CisgIHJldHVybiAiTWVybGluLCBkZXIgVXJ2YXRlciBhbGxlciBNYWdpZXIuXG4iOworfQorCitzdHJpbmcgX3F1ZXJ5X3JhY2UoKQoreworICByZXR1cm4gIk1hZ2llciI7Cit9CisKK2ludCBfcXVlcnlfZ2VuZGVyKCkKK3sKKyAgcmV0dXJuIDE7Cit9CisKK3N0cmluZyBRdWVyeVBvc3NQcm9ub3VuKCBtaXhlZCB3aGF0LCBpbnQgY2FzdXMsIGludCBudW1iZXIgKQoreworICBpbnQgZ2VuMjsKKyAgZ2VuMiA9ICggaW50cCggd2hhdCApICkgPyB3aGF0IDogd2hhdC0+UXVlcnlQcm9wKFBfR0VOREVSKTsKKyAgcmV0dXJuICJzZWluIiArIHF1ZXJ5X2dfc3VmZml4KCBnZW4yLCBjYXN1cywgbnVtYmVyICk7Cit9CisKK3N0cmluZyBxdWVyeV9nX3N1ZmZpeCggaW50IGdlbiwgaW50IGNhc3VzLCBpbnQgYW56YWhsICkKK3sKKyAgcmV0dXJuICh7ICh7ICh7IiIsImUifSksICh7ImVzIiwiZXIifSksICh7ImVtIiwiZW4ifSksICh7IiIsImUifSkgfSksCisgICAgICAgICAgICAgICh7ICh7IiIsImUifSksICh7ImVzIiwiZXIifSksICh7ImVtIiwiZW4ifSksICh7ImVuIiwiZSJ9KSB9KSwKKyAgICAgICAgICAgICAgKHsgKHsiZSIsImUifSksICh7ImVyIiwiZXIifSksICh7ImVyIiwiZW4ifSksICh7ImUiLCJlIn0pIH0pIH0pCisgICAgW2dlbl1bY2FzdXNdW2FuemFobF07Cit9CisKK3N0cmluZyBRdWVyeVByb25vdW4oaW50IGNhc3VzKQoreworICBzd2l0Y2goY2FzdXMpIHsKKyAgICBjYXNlIFdFUjogcmV0dXJuICJlciI7ICBicmVhazsKKyAgICBjYXNlIFdFTTogcmV0dXJuICJpaG0iOworICB9CisgIHJldHVybiAiaWhuIjsKK30KKworc3RyaW5nIF9xdWVyeV9zaG9ydCgpCit7CisgIHJldHVybiBzaG9ydCgpOworfQorCitzdHJpbmcgX3F1ZXJ5X2xvbmcoKQoreworICByZXR1cm4gbG9uZygpOworfQorCitzdHJpbmcgX3F1ZXJ5X25hbWUoKQoreworICByZXR1cm4gIk1lcmxpbiI7Cit9CisKK2ludCBfcXVlcnlfd2VpZ2h0KCkKK3sKKyAgcmV0dXJuIDc1MDAwOworfQorCitzdGF0aWMgdm9pZCBQb3N0U2VoZXIoc3RyaW5nIHdobywgaW50IGcpCit7CisgIG1peGVkICphcnQ7CisKKyAgYXJ0PSh7InN0dWZlbiIsIk1lcmxpbiIsMCwwLHNwcmludGYoIiVzIGlzdCBqZXR6dCBlaW4lcyBTZWhlciVzISIsd2hvLChnPT0yPyJlIjoiIiksKGc9PTI/ImluIjoiIikpLHNwcmludGYoIlxuQW0gJXMgaGF0ICVzIGRpZSBub2V0aWdlbiBCZWRpbmd1bmdlblxuZXJmdWVsbHQgdW5kIGlzdCB2b20gU3BpZWxlcnN0YXR1cyB6dW0gU2VoZXJzdGF0dXMgYXVmZ2VzdGllZ2VuLiBcblxuIEhlcnpsaWNoZW4gR2x1ZWNrd3Vuc2NoLCAlcyFcbiIsZHRpbWUodGltZSgpKSx3aG8sd2hvKX0pOworICAiL3NlY3VyZS9uZXdzIi0+V3JpdGVOb3RlKGFydCwxKTsKK30KKworc3RhdGljIHZvaWQgUG9zdE1hZ2llcihzdHJpbmcgd2hvLCBzdHJpbmcgcHJvbSwgaW50IGdlbmRlcikKK3sKKyAgbWl4ZWQgKmFydDsKKworICBhcnQ9KHsic3R1ZmVuIiwiTWVybGluIiwwLDAsc3ByaW50ZigiJXMgaXN0IGpldHp0IGVpbiVzIE1hZ2llciVzISIsd2hvLChnZW5kZXI9PTI/ImUiOiIiKSwoZ2VuZGVyPT0yPyJpbiI6IiIpKSxzcHJpbnRmKCJcbkFtICVzIGhhdCAlcyAlcyB6dSVzIE1hZ2llciVzXG5iZXJ1ZmVuLiBIZXJ6bGljaGVuIEdsdWVja3d1bnNjaCwgJXMuIEdsdWVja3d1ZW5zY2hlIGF1Y2ggYW4gRGljaCxcbiAlcywgenUgRGVpbmUlcyBuZXVlbiAlcyFcbiIsZHRpbWUodGltZSgpKSxwcm9tLHdobywoZ2VuZGVyPT0yPyJyIjoibSIpLChnZW5kZXI9PTI/ImluIjoiIiksd2hvLHByb20sCisoZ2VuZGVyPT0yPyJyIjoibSIpLChnZW5kZXI9PTI/IlRvY2h0ZXIiOiJTb2huIikpfSk7CisgICIvc2VjdXJlL25ld3MiLT5Xcml0ZU5vdGUoYXJ0LDEpOworfQorCisKK3ByaXZhdGUgdm9pZCBHaWJGZWhsZXJ0ZXVmZWwob2JqZWN0IHdpeikgeworICBpZiAoIW9iamVjdHAod2l6KSkKKyAgICAgIHJldHVybjsKKworICBjbG9uZV9vYmplY3QoRkVITEVSVEVVRkVMKS0+bW92ZSh3aXosIE1fTk9DSEVDS3xNX0dFVCk7CisgIHRlbGxfb2JqZWN0KHdpeiwgYnJlYWtfc3RyaW5nKAorICAgICJIdWh1ICIrd2l6LT5OYW1lKFdFUikgKyAiISBJY2ggaGFiZSBnZXNlaGVuLCBkYXNzIER1IGtlaW5lbiAiCisgICAgIkZlaGxlcnRldWZlbCBoYXN0LiBEaWVzZXMgVG9vbCBpc3QgenVtIERlYnVnZ2VuIHZvbiBGZWhsZXJuIGltICIKKyAgICAiTXVkIHNlaHIgcHJha3Rpc2NoLiBCaXR0ZSBzY2hhdSBpaG4gRGlyIG1hbCBhbi4gOi0pIERpZSBIaWxmZSB6dW0gIgorICAgICJGZWhsZXJ0ZXVmZWwga2FubnN0IER1IG1pdCAnbWFuIGZlaGxlcnRldWZlbCcgbGVzZW4uIEJUVzogV2VubiAiCisgICAgIkR1IGRlbiBGZWhsZXJ0ZXVmZWwgbmljaHQgd2lsbHN0LCBrYW5uc3QgRHUgaWhuIHplcnN0b2VyZW4sIGljaCAiCisgICAgIndlcmRlIERpY2gga2VpbiB6d2VpdGVzIE1hbCBkYW1pdCBiZWxhZXN0aWdlbi4iLDc4LAorICAgICJNZXJsaW4gdGVpbHQgRGlyIG1pdDogIikKKyAgICArICJNZXJsaW4gdWViZXJyZWljaHQgRGlyIGF1cyBkZXIgRmVybmUgZWluZW4ga251c3ByaWcgZ2VicmF0ZW5lbiAiCisgICAgIkZlaGxlcnRldWZlbC5cblxuIik7Cit9CisKK3ByaXZhdGUgdm9pZCBub3RpZnlfcGxheWVyX2NoYW5nZShzdHJpbmcgd2hvLGludCByZWluKQoreworICBpZiAoIXN0cmluZ3Aod2hvKSkKKyAgICByZXR1cm47CisKKyAgLy8gTWF4LXVzZXIgZmVzdGhhbHRlbgorICBpZiAoZmlsZV9zaXplKCIvZXRjL21heHVzZXJzIik8PTApCisgICAgbWF4dXNlcnM9MDsKKyAgaWYgKHNpemVvZih1c2VycygpKT49bWF4dXNlcnMpCisgIHsKKyAgICBtYXh1c2Vycz1zaXplb2YodXNlcnMoKSk7CisgICAgd3JpdGVfZmlsZSgiZXRjL21heHVzZXJzIixzcHJpbnRmKCIlZCB1c2VyOiAlcyAoJXMpXG4iLAorICAgICAgICAgIG1heHVzZXJzLGR0aW1lKHRpbWUoKSkscXVlcnlfbG9hZF9hdmVyYWdlKCkpLDEpOworICB9CisKKyAgLy8gYWxsZW4gTWFnaWVybiBhYiBMZXZlbCAyMCwgZGllIGtlaW5lbiBGZWhsZXJ0ZXVmZWwgaGFiZW4gdW5kIGRlcmVuCisgIC8vIGxldHp0ZXIgTG9nb3V0IHZvciAiRGllLCAxNy4gTWFyIDIwMDksIDIzOjQwOjA0IiA9PiAxMjM3MzI5NjA0IHdhciwKKyAgLy8gZWluZW4gRmVobGVydGV1ZmVsIGNsb25lbiB1bmQgbmVuIEhpd25laXMgbWl0dGVpbGVuLgorICBvYmplY3Qgb2IgPSBmaW5kX3BsYXllcih3aG8pOworICBpZiAob2IgJiYgcmVpbiAmJiBJU19XSVpBUkQob2IpCisgICAgICAmJiAhcHJlc2VudF9jbG9uZShGRUhMRVJURVVGRUwsb2IpCisgICAgICAmJiBvYi0+UXVlcnlQcm9wKFBfTEFTVF9MT0dPVVQpIDwgMTIzNzMyOTYwNCApCisgICAgR2liRmVobGVydGV1ZmVsKG9iKTsKK30KKworcHJpdmF0ZSB2b2lkIEFubm91bmNlTmV3UGxheWVyKG9iamVjdCBwbCkgeworCisgIGlmICghcGwgfHwgIWludGVyYWN0aXZlKHBsKSkKKyAgICByZXR1cm47CisKKyAgLy8gdmVyem9lZ2VybiwgYmlzIGRlciBTcGllbGVyIHdpcmtsaWNoIGZlcnRpZyBpc3QuCisgIGlmIChwbC0+UXVlcnlQcm9wKFBfTEVWRUwpIDwgMCkgeworICAgIGNhbGxfb3V0KCMnQW5ub3VuY2VOZXdQbGF5ZXIsMTAscGwpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmICghKGludClwbC0+UXVlcnlHdWVzdCgpKSB7CisgIHN0cmluZyBwbG5hbWUgPSAoc3RyaW5nKXBsLT5OYW1lKFdFUik7CisgICAgQ0hNQVNURVItPnNlbmQoIkFuZmFlbmdlciIsIHRoaXNfb2JqZWN0KCksCisgICAgICBzcHJpbnRmKCIlcyBtYWNodCBudW4gZWJlbmZhbGxzIGRhcyBNb3JnZW5ncmF1ZW4gdW5zaWNoZXIuICIKKyAgICAgICAgICAgICAgIkhlcnpsaWNoIFdpbGxrb21tZW4gJXMhIiwgcGxuYW1lLCBwbG5hbWUpCisgICAgICApOworICB9Cit9CisKKy8vIEthbm4gYmVpIHJlYm9vdCB3aWVkZXIgcmF1cy4uLiB6ZXNzdHJhLCAxNi4wMy4yMDA3CisjaWYgX19CT09UX1RJTUVfXyA8IDEzMTgxMTA3MjMKKyNkZWZpbmUgQlVHVElNRSAxMzE4MDAzMjAwIAorI2RlZmluZSBCVUdGSVhUSU1FIDEzMTgxMDk0MjEKK3ZvaWQgcmVuZXdfcGxheWVyKHN0cmluZyBwbG5hbWUsIGludCBmb3JjZSkgeworICAgIG9iamVjdCBwbDsKKyAgICBtaXhlZCBlcnI7CisKKyAgICBwbCA9IGZpbmRfcGxheWVyKHBsbmFtZSk7CisgICAgaWYgKCFvYmplY3RwKHBsKSB8fCAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShwbCkpIHJldHVybjsKKworICAgIC8vIGp1bmcgb2RlciBhbHQgZ2VudWcsIEFiYnJ1Y2guIDstKQorICAgIGlmICgob2JqZWN0X3RpbWUocGwpID4gQlVHRklYVElNRSkKKyAgICAgICAgfHwgb2JqZWN0X3RpbWUocGwpIDwgQlVHVElNRSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGdldF9ldmFsX2Nvc3QoKSA8IDEwMDAwMDAgfHwgIWZvcmNlICkgeworICAgICAgICBjYWxsX291dCgicmVuZXdfcGxheWVyIiw4LHBsbmFtZSwxKTsKKyAgICAgICAgdGVsbF9vYmplY3QocGwsYnJlYWtfc3RyaW5nKHNwcmludGYoIkh1aHUgJXMsIHVtIGVpbmVuIEJ1ZyBpbiAiCisgICAgICAgICAgICAgICAgIkRlaW5lbSBTcGllbGVyb2JqZWt0IHp1IGJlaGViZW4sIHdpcnN0IER1IGluIGNhLiA4cyAiCisgICAgICAgICAgICAgICAgIm5ldWdlbGFkZW4uIEJpdHRlIHdhcnRlIGJpcyBkYWhpbiBhYiB1bmQgYmxlaWJlLCB3byAiCisgICAgICAgICAgICAgICAgIkR1IGdlcmFkZSBiaXN0LiIscGwtPk5hbWUoKSksNzgsIk1lcmxpbiB0ZWlsdCBEaXIgbWl0OiAiKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwbG5hbWU9Z2V0dWlkKHBsKTsKKyAgICB0ZWxsX29iamVjdChwbCxicmVha19zdHJpbmcoc3ByaW50ZigiSHVodSAlcywgdW0gZWluZW4gQnVnIGluICIKKyAgICAgICAgICAgICJEZWluZW0gU3BpZWxlcm9iamVrdCB6dSBiZWhlYmVuLCB3aXJzdCBEdSBqZXR6dCAiCisgICAgICAgICAgICAibmV1Z2VsYWRlbi4iLHBsLT5OYW1lKCkpLDc4LCJNZXJsaW4gdGVpbHQgRGlyIG1pdDogIikpOworCisgICAgaWYgKGVycj1jYXRjaChtYXN0ZXIoKS0+cmVuZXdfcGxheWVyX29iamVjdChwbCk7cHVibGlzaCkpIHsKKyAgICAgICAgbG9nX2ZpbGUoInplc3N0cmEvZmFpbGVkX3Jld2V3LmxvZyIsc3ByaW50ZigiJXM6IEZlaGxlciAlTyBiZWltICIKKyAgICAgICAgICAgICAgIlJlbmV3IHZvbiAlc1xuIixkdGltZSh0aW1lKCkpLGVycixwbG5hbWUpKTsKKyAgICAgICAgdGVsbF9vYmplY3QocGwsYnJlYWtfc3RyaW5nKCJCZWltIE5ldWxhZGVuIERlaW5lcyBTcGllbGVyb2JqZWt0cyAiCisgICAgICAgICAgICAgICJnYWIgZXMgZWluZW4gRmVobGVyLiBCaXR0ZSB3ZW5kZSBEaWNoIGFuIGVpbmVuIEVNLiIsNzgsCisgICAgICAgICAgIk1lcmxpbiB0ZWlsdCBEaXIgbWl0OiAiKSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgbG9nX2ZpbGUoInplc3N0cmEvcmVuZXdlZC5sb2ciLHNwcmludGYoIiVzOiAlcyB3dXJkZSByZW5ld2VkLlxuIiwKKyAgICAgICAgICAgIGR0aW1lKHRpbWUoKSkscGxuYW1lKSk7CisgICAgICBpZiAob2JqZWN0cChmaW5kX3BsYXllcihwbG5hbWUpKSkKKyAgICAgICAgICB0ZWxsX29iamVjdChmaW5kX3BsYXllcihwbG5hbWUpLAorICAgICAgICAgICAgYnJlYWtfc3RyaW5nKCJEZWluIFNwaWVsZXJvYmpla3Qgd3VyZGUgbmV1Z2VsYWRlbi4gRHUgIgorICAgICAgICAgICJrYW5uc3QgamV0enQgbm9ybWFsIHdlaXRlcnNwaWVsZW4uIEZhbGxzIER1IGV0d2FzIHVuZ2V3b2VobmxpY2hlcyAiCisgICAgICAgICAgImJlbWVya3N0LCBtZWxkZSBEaWNoIGJpdHRlIGJlaSBlaW5lbSBFcnptYWdpZXIuIFZpZWwgU3Bhc3MgaW0gIgorICAgICAgICAgICJTcGllbCEiLDc4LCAiTWVybGluIHRlaWx0IERpciBtaXQ6ICIpKTsKKyAgICB9Cit9CisjZW5kaWYKKwordm9pZCBwbGF5ZXJfY2hhbmdlKHN0cmluZyBlaWQsIG9iamVjdCB0cmlnb2IsIG1peGVkIGRhdGEpIHsKKworICBpZiAoIXRyaWdvYiB8fCAhaW50ZXJhY3RpdmUodHJpZ29iKSkKKyAgICByZXR1cm47CisKKyAgc3dpdGNoKGVpZCkgeworICAgIGNhc2UgRVZUX0xJQl9QTEFZRVJfQ1JFQVRJT046CisgICAgICBjYWxsX291dCgjJ0Fubm91bmNlTmV3UGxheWVyLCA1LCB0cmlnb2IpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBFVlRfTElCX0xPR0lOOgorICAgICAgbm90aWZ5X3BsYXllcl9jaGFuZ2UoZGF0YVtFX1BMTkFNRV0sMSk7CisjaWYgX19CT09UX1RJTUVfXyA8IDEzMTgxMTA3MjMKKyAgICAgIC8vIFNwaWVsZXIgZXZ0bC4gcmVuZXdlbj8gQmVpIHJlYm9vdCByYXVzICgwOC4xMC4yMDExKQorICAgICAgcmVuZXdfcGxheWVyKGRhdGFbRV9QTE5BTUVdLDApOworI2VuZGlmCisgICAgICBicmVhazsKKyAgfQorfQorCisKKy8vYmVzc2VyIFBfTk9fQVRUQUNLIGFscyBEZWZlbmQoKS4uLgorbWl4ZWQgX3F1ZXJ5X25vX2F0dGFjaygpIHsKKyAgaWYgKCFsaXZpbmcoUEwpIHx8ICFvYmplY3RwKGVudmlyb25tZW50KFBMKSkgKSByZXR1cm4oMSk7CisKKyAgdGVsbF9yb29tKGVudmlyb25tZW50KCksICJNZXJsaW4gc2NoaW1wZnQ6IExhc3MgZGFzISEhXG4iLCh7UEx9KSk7CisgIHRlbGxfcm9vbShlbnZpcm9ubWVudCgpLHNwcmludGYoCisgICAgICAgICJNZXJsaW4gZ2lidCAlcyBlaW5lIHNjaGFsbGVuZGUgT2hyZmVpZ2UuXG4iLCAgICAgIAorICAgICAgICBjYXBpdGFsaXplKChzdHJpbmcpdGhpc19wbGF5ZXIoKS0+bmFtZShXRU0pKSksICh7dGhpc19wbGF5ZXIoKX0pKTsKKyAgcmV0dXJuKCJNZXJsaW4gc2NoaW1wZnQ6IExhc3MgZGFzISEhXG4iCisgICAgICAiTWVybGluIGdpYnQgRGlyIGVpbmUgc2NoYWxsZW5kZSBPaHJmZWlnZS5cbiIpOworfQorCisvKgoraW50IERlZmVuZChpbnQgZGFtLCBzdHJpbmcgZGFtX3R5cGUsIGludCBzcGVsbCwgb2JqZWN0IGVuZW15KQoreworICBvYmplY3QgZW47CisgIGlmICghZW49cHJldmlvdXNfb2JqZWN0KCkgfHwgIWxpdmluZyhlbikpCisgICAgZW4gPSB0aGlzX3BsYXllcigpOworICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSwgIk1lcmxpbiBzY2hpbXBmdDogTGFzcyBkYXMhISFcbiIpOworICB3cml0ZSgiTWVybGluIGdpYnQgRGlyIGVpbmUgc2NoYWxsZW5kZSBPaHJmZWlnZS5cbiIpOworICBzYXkoc3ByaW50ZigiTWVybGluIGdpYnQgJXMgZWluZSBzY2hhbGxlbmRlIE9ocmZlaWdlLlxuIiwKKyAgICAgICAgICAgICAgY2FwaXRhbGl6ZSgoc3RyaW5nKXRoaXNfcGxheWVyKCktPm5hbWUoV0VNKSkpLCB0aGlzX3BsYXllcigpKTsKKyAgZW4tPlN0b3BIdW50Rm9yKHRoaXNfb2JqZWN0KCksIDEpOworfQorKi8KK3ZvaWQgc2hvdXRhbnN3KCkKK3sKKyAgb2JqZWN0IGVudix0aTsKKyAgc3RyaW5nICpwYXRoOworICBzdHJpbmcgYW5zOworCisgIGlmICghKGVudj1lbnZpcm9ubWVudCgpKSkKKyAgICByZXR1cm47CisgIGlmICghKHRpPXRoaXNfaW50ZXJhY3RpdmUoKSl8fChpbnQpdGktPlF1ZXJ5UHJvcChQX0xFVkVMKTwxOXx8dGktPlF1ZXJ5UHJvcChQX0dIT1NUKSkKKyAgICByZXR1cm47CisgIHRlbGxfb2JqZWN0KHRpLCJEdSBzcHVlcnN0IGVpbmVuIHNlbmdlbmRlbiBTY2htZXJ6LlxuIik7CisgIHRpLT5kb19kYW1hZ2UoICgoaW50KXRpLT5RdWVyeVByb3AoUF9IUCkpIC8gMiArIDUpOworICBpZigoaW50KXRpLT5RdWVyeVByb3AoUF9HSE9TVCkpIHJldHVybjsKKyAgYW5zPSJpY2ggaGFiIG5pY2h0IGRpZSBsZWlzZXN0ZSBJZGVlLCB3byBpY2ggaGllciBiaW4gLi4uXG4iOworICBwYXRoPW9sZF9leHBsb2RlKG9iamVjdF9uYW1lKGVudiksIi8iKTsKKyAgaWYgKHBhdGhbMF09PSJkIikKKyAgeworICAgIGFucz0id2Vyd2Vpc3N3byAuLiI7CisgICAgc3dpdGNoKHBhdGhbMV0pCisgICAgeworICAgICAgY2FzZSAiZ2ViaXJnZSI6CisgICAgICBjYXNlICJ3YWxkIjoKKyAgICAgIGNhc2UgImRzY2h1bmdlbCI6CisgICAgICBhbnM9ImltICIrY2FwaXRhbGl6ZShwYXRoWzFdKTsKKyAgICAgIGJyZWFrOworICAgICAgY2FzZSAiaW5zZWxuIjoKKyAgICAgIGFucz0iYXVmIGRlbiBJbnNlbG4iOworICAgICAgYnJlYWs7CisgICAgICBjYXNlICJwb2xhciI6CisgICAgICBhbnM9ImltIFBvbGFyZ2ViaWV0IjsKKyAgICAgIGJyZWFrOworICAgICAgY2FzZSAidW50ZXJ3ZWx0IjoKKyAgICAgIGNhc2UgImViZW5lIjoKKyAgICAgIGNhc2UgInd1ZXN0ZSI6CisgICAgICBhbnM9ImluIGRlciAiK2NhcGl0YWxpemUocGF0aFsxXSk7CisgICAgICBicmVhazsKKyAgICAgIGNhc2UgInZsYW5kIjoKKyAgICAgIGFucz0iaW0gVmVybG9yZW5lbiBMYW5kIjsKKyAgICAgIGJyZWFrOworICAgICAgY2FzZSAiZmVybndlc3QiOgorICAgICAgYW5zPSJpbiBGZXJud2VzdCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgYW5zPSJpY2ggYmluICIrYW5zKyIuXG4iOworICB9CisgIGlmIChwYXRoWzBdPT0icGxheWVycyIpCisgICAgYW5zPSJpY2ggaGFiIG1pY2ggdmVybGF1ZmVuIC0gaWNoIHNjaGFldHplLCAiK2NhcGl0YWxpemUocGF0aFsxXSkrCisgICAgICAiIGhhdCB3YXMgZGFtaXQgenUgdHVuLi4uXG4iOworICBpZiAocGF0aFswXT09ImdpbGRlbiIpIHsKKyAgICBzd2l0Y2gocGF0aFsxXSkgeworICAgICAgY2FzZSAiYWJlbnRldXJlciI6CisgICAgICBhbnM9ImRlciBBYmVudGV1cmVyZ2lsZGUiOworICAgICAgYnJlYWs7CisgICAgICBjYXNlICJiaWVyc2NodWV0dGxlciI6CisgICAgICBhbnM9ImRlciBCaWVyc2NodWV0dGxlcmdpbGRlIjsKKyAgICAgIGJyZWFrOworICAgICAgY2FzZSAiY2hhb3MiOgorICAgICAgYW5zPSJkZXIgR2lsZGUgZGVyIENoYW90ZW4iOworICAgICAgYnJlYWs7CisgICAgICBjYXNlICJrYWVtcGZlciI6CisgICAgICBhbnM9ImRlciBLYWVtcGZlcmdpbGRlIjsKKyAgICAgIGJyZWFrOworICAgICAgY2FzZSAia2FyYXRlIjoKKyAgICAgIGFucz0iZWluZW0gS2FyYXRlZG9qbyI7CisgICAgICBicmVhazsKKyAgICAgIGNhc2UgImtsZXJ1cyI6CisgICAgICBhbnM9ImVpbmVtIFRlbXBlbCBkZXIgS2xlcmlrZXIiOworICAgICAgYnJlYWs7CisgICAgICBjYXNlICJ6YXViZXJlciI6CisgICAgICBhbnM9ImRlciBBa2FkZW1pZSBkZXIgWmF1YmVyZXIiOworICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgYW5zPSJpcmdlbmRlaW5lciBHaWxkZSI7CisgICAgfQorICAgIGFucz0iaWNoIHN0ZWhlIGluICIrYW5zKyIuXG4iOworICB9CisgICAgICAgICAgICAgICAgaWYoIHBhdGhbMF09PSJwIiAmJiBwYXRoWzFdPT0idmVyZWluIiApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFucz0iaWNoIHN0ZWhlIGluIFBvcnQgVmFpbi4iOworICAgICAgICAgICAgICAgIH0KKyAgaWYgKCF0aGlzX2ludGVyYWN0aXZlKCktPlF1ZXJ5UHJvcChQX0lOVklTKSkKKyAgICBhbnM9dGhpc19pbnRlcmFjdGl2ZSgpLT5OYW1lKFdFUikrIiwgIithbnM7CisgIGVsc2UgYW5zPWNhcGl0YWxpemUoYW5zKTsKKyAgY2FsbF9vdXQoIm15c2hvdXQiLDAsYnJlYWtfc3RyaW5nKGFucywgNzgsICJNZXJsaW4gcnVmdDogIikpOworfQorCit2b2lkIG15c2hvdXQoc3RyaW5nIHMpCit7CisgIHdyaXRlKHMpOworICBzaG91dChzKTsKK30KKwordm9pZCBjYXRjaF90ZWxsKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyBuYW1lLCBkdW1teTsgbWl4ZWQgbWVzc2FnZTsKKyAgaW50IGksczsKKworICBpZiAoIXRoaXNfcGxheWVyKCkpCisgICAgcmV0dXJuOworCisgIGlmIChlbnZpcm9ubWVudCgpPT1lbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKSAmJiBwcmV2aW91c19vYmplY3QoKSE9TUUpCisgICAgdGVsbF9yb29tKHRoaXNfb2JqZWN0KCksIioiK3N0cik7CisKKyAgaWYgKHRoaXNfcGxheWVyKCkgIT0gdGhpc19pbnRlcmFjdGl2ZSgpKQorICAgIHJldHVybjsKKworICBpZiAoYnVzeSkgeworICAgIHRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksIAorICAgICAgICJNZXJsaW4gdGVpbHQgRGlyIG1pdDogSWNoIGJpbiBiZXNjaGFlZnRpZ3QuXG4iKTsKKyAgICByZXR1cm47CisgIH0KKyAgICAKKyAgc3RyPWxvd2VyX2Nhc2Uoc3RyKTsKKworICBpZiAoKHN0cnN0cihzdHIsICJ0ZWlsdCBkaXIgbWl0OiIpICE9IC0xKSAKKyAgICAgICYmIChzdHJzdHIoc3RyLCAid28gYmlzdCBkdSIpICE9LTEpKSB7CisgICAgc2hvdXRhbnN3KCk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKChzdHJzdHIoc3RyLCAidGVpbHQgZGlyIG1pdDoiKSAhPSAtMSkgJiYgCisgICAgICAoKHN0cnN0cihzdHIsICJzZWhlciIpICE9IC0xIHx8IHN0cnN0cihzdHIsICJzZWhlcmluIikgIT0gLTEpKSkKKyAgICB7CisgICAgICBjcmVhdGVfc2Vlcih0aGlzX3BsYXllcigpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKHNzY2FuZihzdHIsIiVzICVzIHNhZ3Q6ICVzIixkdW1teSxuYW1lLG1lc3NhZ2UpIT0zKQorICAgIGlmIChzc2NhbmYoc3RyLCIlcyBzYWd0OiAlcyIsbmFtZSxtZXNzYWdlKSE9MikKKyAgICAgIHJldHVybjsKKworICBpZiAoIW5hbWUgfHwgbmFtZT09IiIgfHwgICAgICAgICAgICAKKyAgICAgIGNhdGNoKHM9ZmlsZV9zaXplKCJzYXZlLyIrbmFtZVswLi4wXSsiLyIrbmFtZSsiLm8iKTtwdWJsaXNoKSAgICAgICAgICAgIAorICAgICAgfHwgczw9MCApCisgICAgcmV0dXJuOworCisgIGlmIChuYW1lIT1nZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpKSAmJiAhQVJDSF9TRUNVUklUWSkKKyAgeworICAgIGlmIChmbGFnPT1nZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpKSsiIyMiK25hbWUpCisgICAgICByZXR1cm47CisgICAgY2FsbF9vdXQoImRvX3NheSIsMCwiTWVybGluIHNhZ3Q6ICIrY2FwaXRhbGl6ZShnZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpKSkrIiBoYXQgZ2VyYWRlIHNvIGdldGFuLCBhbHMgd3VlcmRlICIrY2FwaXRhbGl6ZShuYW1lKSsiIGV0d2FzIHNhZ2VuIVxuIik7CisgICAgZmxhZz1nZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpKSsiIyMiK25hbWU7CisgICAgY2FsbF9vdXQoImNsZWFyX2ZsYWciLDApOworICAgIHJldHVybjsKKyAgfQorICBmbGFnPTA7CisgIGZvciAoaT0wO2k8c2l6ZW9mKHdoaXRlc3BhY2VzKTtpKyspCisgIHsKKyAgICBtZXNzYWdlPW9sZF9leHBsb2RlKG1lc3NhZ2Usd2hpdGVzcGFjZXNbaV0pOworICAgIGlmICghcG9pbnRlcnAobWVzc2FnZSl8fHNpemVvZihtZXNzYWdlKT09MCkKKyAgICAgIHJldHVybjsKKyAgICBtZXNzYWdlPWltcGxvZGUobWVzc2FnZSwiICIpOworICB9CisKKyAgbWVzc2FnZT1vbGRfZXhwbG9kZShtZXNzYWdlLCIgIik7CisKKyAgaWYgKCFwb2ludGVycChtZXNzYWdlKSB8fCAhc2l6ZW9mKG1lc3NhZ2UpKQorICAgIHJldHVybjsKKworICBtZXNzYWdlLT0oezB9KS0oeyIifSk7CisKKyAgaWYgKCFtZXNzYWdlIHx8IHNpemVvZihtZXNzYWdlKT09MCkKKyAgICByZXR1cm47CisKKyAgaWYgKG1lbWJlcihtZXNzYWdlLCAibWVybGluIik9PS0xKQorICAgIHJldHVybjsKKworICBtZXNzYWdlLT0oeyJtZXJsaW4ifSk7CisKKyAgbWVzc2FnZT1pbXBsb2RlKG1lc3NhZ2UsIiAiKTsKKworICBpZiAoIW1lc3NhZ2UgfHwgbWVzc2FnZT09IiIpCisgICAgcmV0dXJuOworCisgIGRldGVybWluZV9hY3Rpb24obWVzc2FnZSwgbmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgZGV0ZXJtaW5lX2FjdGlvbihzdHJpbmcgbWVzcywgc3RyaW5nIG5hbWUpCit7CisgIHN0cmluZyBzdHI7CisKKyAgaWYgKG1lc3M9PSJtYWNoIG1pY2ggenVtIG1hZ2llciIgfHwgbWVzcz09Im1hY2ggbWljaCB6dXIgbWFnaWVyaW4iKQorICAgIHJldHVybiBjcmVhdGVfd2l6YXJkKG5hbWUsbmFtZSk7CisKKyAgaWYgKHNzY2FuZihtZXNzLCJtYWNoICVzIHp1bSBtYWdpZXIiLHN0cik9PTF8fHNzY2FuZihtZXNzLCJtYWNoICVzIHp1ciBtYWdpZXJpbiIsc3RyKT09MSkKKyAgICByZXR1cm4gY3JlYXRlX3dpemFyZChsb3dlcl9jYXNlKHN0ciksbmFtZSk7CisKKyAgZ2l2ZV9oZWxwKG5hbWUpOworICByZXR1cm4gMDsKK30KKworI2RlZmluZSBTYXkoc3RyKSBzYXkoc3RyLHdobykKKyNkZWZpbmUgV3JpdGUoc3RyKSB0ZWxsX29iamVjdCh3aG8sc3RyKQorCitpbnQgUXVlcnlCZWRpbmd1bmdlbihvYmplY3QgcGwsc3RyaW5nIHdhcykKK3sKKyAgaW50IHJldCxpLGdlbjsKKyAgc3RyaW5nIHM7CisKKyAgaWYgKElTX1NFRVIocGwpKQorICAgIHJldHVybiAxOworICAKKyAgaWYgKChpbnQpTEVQTUFTVEVSLT5RdWVyeVJlYWR5Rm9yV2l6KHBsKT09MSkKKyAgICByZXR1cm4gMTsKKworICBzPShzdHJpbmcpTEVQTUFTVEVSLT5RdWVyeVJlYWR5Rm9yV2l6VGV4dChwbCk7IAorCisgIHRlbGxfb2JqZWN0KHBsLCBicmVha19zdHJpbmcoIk1lcmxpbiBncnVlYmVsdCBlaW4gd2VuaWcgdW5kIHRlaWx0IERpciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hY2ggZWluaWdlbSBVZWJlcmxlZ2VuIG1pdDpcblxuIiwgNzgsMCwxKSk7CisgIAorICB0ZWxsX29iamVjdChwbCwgcysiXG4iKTsKKworICB0ZWxsX29iamVjdChwbCwgYnJlYWtfc3RyaW5nKCJEYSBpc3Qgd29obCBmdWVyIERpY2ggbm9jaCBldHdhcyB6dSB0dW4uLi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc4LCAiTWVybGluIHRlaWx0IERpciBtaXQ6ICIpKTsKKworICBpZiAoZW52aXJvbm1lbnQoKSA9PSBlbnZpcm9ubWVudChwbCkpCisgICAgc2F5KChzdHJpbmcpcGwtPm5hbWUoV0VSKQorICAgICAgICArIiBlcmZ1ZWxsdCBub2NoIG5pY2h0IGFsbGUgQW5mb3JkZXJ1bmdlbiBmdWVyIGRlbiAiK3dhcysic3RhdHVzLlxuIixwbCk7CisgIAorICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjcmVhdGVfd2l6YXJkKG1peGVkIHdobywgbWl4ZWQgcHJvbW90ZXIpCit7CisgIG1peGVkICpkb21haW5zOworICBvYmplY3QgdmVydHJhZzsKKyAgaW50IHJldDsKKyAgc3RyaW5nIGdlbjsKKworICB3aG89ZmluZF9wbGF5ZXIod2hvKTsKKyAgcHJvbW90ZXI9ZmluZF9wbGF5ZXIocHJvbW90ZXIpOworICBpZiAoIXdobyB8fCAhcHJvbW90ZXIpCisgICAgcmV0dXJuIDA7CisgIC8vCisgIC8vIHBsYXllciBub3QgaW50ZXJhY3RpdmU/CisgIC8vCisgIGlmICghaW50ZXJhY3RpdmUod2hvKSkKKyAgeworICAgIHdyaXRlKGNhcGl0YWxpemUoZ2V0dWlkKHdobykpKyIgaXN0IG5pY2h0IGFrdGl2LlxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgLy8KKyAgLy8gcGxheWVyIGlzIHNlY29uZD8KKyAgLy8KKyAgaWYgKHdoby0+UXVlcnlQcm9wKFBfU0VDT05EKSkKKyAgeworICAgICB0ZWxsX29iamVjdCh3aG8sIkR1IGJpc3QgZWluIFp3ZWl0c3BpZWxlciB1bmQga2FubnN0IGFscyBzb2xjaGVyIGtlaW4gTWFnaWVyIHdlcmRlbi5cbiIKKyAgICAgICAgICArIlZlcnN1Y2hzIERvY2ggbWFsIG1pdCBEZWluZW0gRXJzdGllLlxuIik7CisgICAgIHdyaXRlKCJEdSBrYW5uc3QgIit3aG8tPm5hbWUoKSsiIG5pY2h0IHp1bSBNYWdpZXIgbWFjaGVuLiBEYXMgZ2VodCBiZWkgIgorICAgICAgICAgICsiWndlaXRpZXNcbmxlaWRlciBuaWNodC4gRnJhZyBkb2NoIG1hbCBuYWNoIGRlbSBFcnN0aWUuXG4iKTsKKyAgICAgcmV0dXJuIDE7CisgIH0KKyAgLy8KKyAgLy8gd2FudHMgdG8gYWR2YW5jZSBoaW1zZWxmPworICAvLworICBpZiAod2hvPT1wcm9tb3RlcikKKyAgeworICAgIHdyaXRlKCJEdSBrYW5uc3QgRGljaCBuaWNodCBzZWxiZXIgYmVmb2VyZGVybi4gU3VjaCBEaXIgZGF6dSBiaXR0ZSBlaW5lbiAiKworICAgICAgICAgICAgICAiVm9sbG1hZ2llcixcbmRlciBEaXIgZWluZW4gVmVydHJhZyBnaWJ0LlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgLy8KKyAgLy8gYmFuaXNoZWQ/CisgIC8vCisgIGlmIChNQmFuaXNoTGlzdGVbd2hvLDFdKQorICB7CisgICAgdGVsbF9vYmplY3QocHJvbW90ZXIsY2FwaXRhbGl6ZSh3aG8pKyIgZGFyZiBudXIgdm9uIGVpbmVtIEVyem1hZ2llciB6dW0gIisKKyAgICAgICAgICAgICAgICAgICAgIk1hZ2llciBnZW1hY2h0IHdlcmRlbi5cbiIpOworICAgIHNheShwcm9tb3Rlci0+bmFtZShXRVIpKyIgaXN0IGtlaW4gRXJ6bWFnaWVyIHVuZCBkYXJmICIrY2FwaXRhbGl6ZSh3aG8pKworICAgICAgICAgICAgIiBuaWNodCB6dW0gTWFnaWVyIG1hY2hlbi5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIC8vCisgIC8vIHBsYXllciBoYXMgUEs/CisgIC8vCisgIGlmICh3aG8tPlF1ZXJ5UHJvcCgicGxheWVya2lsbHMiKSkgeworICAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQod2hvKSx3aG8tPm5hbWUoKSsiIGhhdCBub2NoIGVpbmVuIFBsYXllcmtpbGwgdW5kIGthbm4gc29taXQga2VpbiBNYWdpZXIgd2VyZGVuLlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFtIGJlc3RlbiBkZW4gU2hlcmlmZiBvZGVyIGVpbmVuIEVyem1hZ2llciB2ZXJzdGFlbmRpZ2VuLlxuIik7CisgICAgICAgICByZXR1cm4gMTsKKyAgfQorICAvLworICAvLyBhbHJlYWR5IGRvbV9tZW1iZXI/CisgIC8vCisgIGlmIChJU19ET01BSU5NRU1CRVIod2hvKSkKKyAgeworICAgIFdyaXRlKCJGdWVyIERpY2gga2FubiBpY2ggbmljaHRzIG1laHIgdHVuLiBEdSBiaXN0IGRvY2ggc2Nob24gTWFnaWVyIVxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKworICAvLworICAvLyAiYWR2YW5jZWQgbGVhcm5lciI/CisgIC8vCisgIGlmIChxdWVyeV93aXpfbGV2ZWwod2hvKSA9PSAyMCkKKyAgeworICAgIGlmICghQVJDSF9TRUNVUklUWSkgeworICAgICAgV3JpdGUoIkRpY2gga2FubiBudXIgZWluIEVyem1hZ2llciB6dW0gXCJyaWNodGlnZW5cIiBNYWdpZXIgbWFjaGVuIVxuIik7CisgICAgICBTYXkoIk51ciBlaW4gRXJ6bWFnaWVyIGthbm4gIit3aG8tPm5hbWUoV0VOKSsiIHp1bSBcInJpY2h0aWdlblwiIE1hZ2llciBtYWNoZW4hXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXQ9KGludCkic2VjdXJlL21hc3RlciItPmFkdmFuY2Vfd2l6bGV2ZWwoZ2V0ZXVpZCh3aG8pLDIxKTsKKyAgICBpZiAocmV0PD0wKQorICAgIHsKKyAgICAgIHNheSgiTWVybGluOiBlcnJvciAiK3JldCsiXG4iKTsKKyAgICAgIHdyaXRlKCJNZXJsaW46IGVycm9yICIrcmV0KyJcbiIpOworICAgIH0KKyAgICB3cml0ZSgiTWVybGluIHJ1ZnQ6ICIrKHN0cmluZyl3aG8tPm5hbWUoV0VSKSsiIGlzdCBpbiBkZW4gS3JlaXMgZGVyIE1hZ2llciAiKworICAgICAgICAgICAgICAiYXVmZ2Vub21tZW4gd29yZGVuIVxuIik7CisgICAgc2hvdXQoIk1lcmxpbiBydWZ0OiAiKyhzdHJpbmcpd2hvLT5uYW1lKFdFUikrIiBpc3QgaW4gZGVuIEtyZWlzIGRlciBNYWdpZXIgIisKKyAgICAgICAgICAgICAgImF1Zmdlbm9tbWVuIHdvcmRlbiFcbiIpOworICAgICJzZWN1cmUvbWFzdGVyIi0+cmVuZXdfcGxheWVyX29iamVjdCh3aG8pOworICAgIHJldHVybiAxOworICB9CisKKyAgLy8KKyAgLy8gYWxyZWFkeSB3aXphcmQ/CisgIC8vCisgIGlmIChJU19XSVpBUkQod2hvKSkKKyAgeworICAgIGRvbWFpbnM9KHN0cmluZyopInNlY3VyZS9tYXN0ZXIiLT5nZXRfZG9tYWluX2hvbWVzKGdldHVpZCh3aG8pKTsKKyAgICBpZiAoIWRvbWFpbnMgfHwgIXBvaW50ZXJwKGRvbWFpbnMpIHx8ICFzaXplb2YoZG9tYWlucykpCisgICAgeworICAgICAgU2F5KHdoby0+bmFtZShXRVIpKyIgZ2Vob2VydCBub2NoIGtlaW5lciBSZWdpb24gYW4gdW5kIGthbm4gZGFoZXIgbm9jaCAiKworICAgICAgICAgICAgICAia2VpbiBWb2xsLVxubWFnaWVyIHdlcmRlbi5cbiIpOworICAgICAgV3JpdGUoIkR1IGdlaG9lcnN0IG5vY2gga2VpbmVyIFJlZ2lvbiBhbi4gU2NobGllc3MgRGljaCB6dW5hZWNoc3QgZWluZXIgIisKKyAgICAgICAgICAgICAgICAiYW4gdW5kIGtvbW1cbmRhbm4gd2llZGVyIVxuIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0PShpbnQpInNlY3VyZS9tYXN0ZXIiLT5hZHZhbmNlX3dpemxldmVsKGdldGV1aWQod2hvKSwyNSk7CisgICAgaWYocmV0PjApCisgICAgeworICAgICAgc2hvdXQod2hvLT5uYW1lKFdFUikrIiBhcmJlaXRldCBqZXR6dCBhbiBlaW5lciBSZWdpb24gbWl0IVxuIik7CisgICAgICAic2VjdXJlL21hc3RlciItPnJlbmV3X3BsYXllcl9vYmplY3Qod2hvKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICB3cml0ZSgiUkVUVVJOVkFMVUUgIityZXQrIlxuIik7CisgICAgc2F5KCJSRVRVUk5WQUxVRSAiK3JldCsiXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vCisgIC8vIHN0aWxsIGxlYXJuZXI/CisgIC8vCisgIGlmIChJU19MRUFSTkVSKHdobykpCisgIHsKKyAgICBpZiAoIUFSQ0hfU0VDVVJJVFkpIHsKKyAgICAgIFdyaXRlKCJEaWNoIGthbm4gbnVyIGVpbiBFcnptYWdpZXIgenVtIFwicmljaHRpZ2VuXCIgTWFnaWVyIG1hY2hlbiFcbiIpOworICAgICAgU2F5KCJOdXIgZWluIEVyem1hZ2llciBrYW5uICIrd2hvLT5uYW1lKFdFTikrIiB6dW0gXCJyaWNodGlnZW5cIiBNYWdpZXIgbWFjaGVuIVxuIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0PShpbnQpInNlY3VyZS9tYXN0ZXIiLT5hZHZhbmNlX3dpemxldmVsKGdldGV1aWQod2hvKSwyMCk7CisgICAgaWYgKHJldDw9MCkKKyAgICB7CisgICAgICBzYXkoIk1lcmxpbjogZXJyb3IgIityZXQrIlxuIik7CisgICAgICB3cml0ZSgiTWVybGluOiBlcnJvciAiK3JldCsiXG4iKTsKKyAgICB9CisgICAgc3RyaW5nIHdpem5hbWUgPSAoc3RyaW5nKXdoby0+cXVlcnlfcmVhbF9uYW1lKCk7CisgICAgInNlY3VyZS9tYXN0ZXIiLT5yZW5ld19wbGF5ZXJfb2JqZWN0KHdobyk7CisgICAgLy8gRmVobGVydGV1ZmVsIGdlYmVuCisgICAgY2FsbF9vdXQoIydHaWJGZWhsZXJ0ZXVmZWwsNCxmaW5kX3BsYXllcih3aXpuYW1lKSk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICAvLworICAvLyBwcm9tb3RlcidzIGxldmVsIGlzIG5vdCA+RE9NQUlOTUVNQkVSX0xWTCsxCisgIC8vCisgIGlmIChzZWN1cmVfbGV2ZWwoKTw9RE9NQUlOTUVNQkVSX0xWTCkKKyAgeworICAgIHRlbGxfb2JqZWN0KHByb21vdGVyLCJEdSBtdXNzdCBkZXJ6ZWl0IG1pbmRlc3RlbnMgTGV2ZWwgIisKKyAgICAgICAgICAgICAgICAgICAgKERPTUFJTk1FTUJFUl9MVkwrMSkrIiBoYWJlbiwgdW0gamVtYW5kZW4gYmVmb2VyZGVuIHp1ICIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrb2VubmVuLlxuIik7CisgICAgc2F5KHByb21vdGVyLT5uYW1lKFdFUikrIiBpc3Qga2VpbiBWb2xsbWFnaWVyIHVuZCBkYXJmIGRhaGVyIG5pZW1hbmRlbiAiKworICAgICAgICAgICAgInp1bSBWb2xsbWFnaWVyIG1hY2hlbi5cbiIpOworICAgIHJldHVybiAxOworICB9CisKKyAgLy8gZGVyIENoZWNrIGF1ZiBkZW4gQmx1dHByaW50bmFtZW4gaXN0IGZhc3QgdWViZXJmbHVlc3NpZywgYWJlciBudXIgZmFzdC4KKyAgLy8gRXIgc2NobGFlZ3QgZmVobCwgd2VubiBkZXIgVmVydHJhZyBkZXIgQ2xvbmUgZWluZXIgYWx0ZW4gQlAgaXN0LgorICBpZiAoISh2ZXJ0cmFnPXByZXNlbnRfY2xvbmUoIi9vYmovdmVydHJhZyIsd2hvKSkgfHwKKyAgICAgIG9iamVjdF9uYW1lKGJsdWVwcmludCh2ZXJ0cmFnKSkhPSIvb2JqL3ZlcnRyYWciIHx8CisgICAgICAhKChpbnQpdmVydHJhZy0+aXNfdW50ZXJzY2hyaWViZW4oKSkgKQorICB7CisgICAgV3JpdGUoIkR1IGhhc3QgamEgZ2FyIGtlaW5lbiB1bnRlcnNjaHJpZWJlbmVuIFZlcnRyYWcgYmVpIERpci4gQmVzb3JnIERpciAiKworICAgICAgICAgICAgICAiZWluZW4gVmVyLVxudHJhZywgdW50ZXJzY2hyZWliZSBpaG4gdW5kIGtvbW0gZGFubiB3aWVkZXIhXG4iKTsKKyAgICBTYXkod2hvLT5uYW1lKFdFUikrIiBoYXQga2VpbmVuIHVudGVyc2NocmllYmVuZW4gVmVydHJhZy5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIGlmIChnZXRldWlkKHZlcnRyYWcpIT1zZWN1cmVfZXVpZCgpKQorICB7CisgICAgdGVsbF9vYmplY3QocHJvbW90ZXIsIkRhcyBnZWh0IG5pY2h0LCBlciBoYXQgZWluZW4gVmVydHJhZyB2b24gIisKKyAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXRldWlkKHZlcnRyYWcpKSsiIGJlaSBzaWNoLlxuIik7CisgICAgc2F5KHByb21vdGVyLT5uYW1lKFdFUikrIiB2ZXJzdWNodCwgIit3aG8tPm5hbWUoV0VSKSsiIHp1bSBNYWdpZXIgenUgIisKKyAgICAgICAgICAgICJtYWNoZW4sIGRvY2ggIit3aG8tPm5hbWUoV0VSKSsiIGhhdCBlaW5lbiBWZXJ0cmFnXG52b24gIisKKyAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldGV1aWQodmVydHJhZykpKyIgYmVpIHNpY2guXG4iLHByb21vdGVyKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoIVF1ZXJ5QmVkaW5ndW5nZW4od2hvLCJNYWdpZXIiKSkKKyAgICByZXR1cm4gMDsKKyAgcmV0PShpbnQpInNlY3VyZS9tYXN0ZXIiLT5hZHZhbmNlX3dpemxldmVsKGdldGV1aWQod2hvKSwxNSk7CisgIGlmIChyZXQ+MCkKKyAgeworICAgIFBvc3RNYWdpZXIoY2FwaXRhbGl6ZShnZXR1aWQod2hvKSksCisgICAgICAgIGNhcGl0YWxpemUoc2VjdXJlX2V1aWQoKSksKGludCl3aG8tPlF1ZXJ5UHJvcChQX0dFTkRFUikpOworICAgIHdyaXRlX2ZpbGUoIi9sb2cvU1BPTlNPUiIsZHRpbWUodGltZSgpKSsiOiAiK2NhcGl0YWxpemUoZ2V0dWlkKHByb21vdGVyKSkrIiBtYWNodCAiKworICAgICAgICAgICAgIHdoby0+bmFtZShXRVIpKyIgenVtIExlYXJuZXIuXG4iKTsKKyAgICB3cml0ZSh3aG8tPm5hbWUoV0VSKSsiIGlzdCBpbiBkZW4gS3JlaXMgZGVyIE1hZ2llciBhdWZnZW5vbW1lbiB3b3JkZW4hXG4iKTsKKyAgICBzaG91dCh3aG8tPm5hbWUoV0VSKSsiIGlzdCBpbiBkZW4gS3JlaXMgZGVyIE1hZ2llciBhdWZnZW5vbW1lbiB3b3JkZW4hXG4iKTsKKyAgICBpZiAoInNlY3VyZS9tYXN0ZXIiLT5zZXRfcGxheWVyX29iamVjdChnZXRldWlkKHdobyksIi9zdGQvc2hlbGxzL21hZ2llciIpCisgICAgICAgICAgICA8PTApCisgICAgeworICAgICAgc2F5KCJNRVJMSU46IGtvbm50ZSBNYWdpZXJzaGVsbCBuaWNodCBlaW5zdGVsbGVuLlxuIik7CisgICAgICB3cml0ZSgiTUVSTElOOiBrb25udGUgTWFnaWVyc2hlbGwgbmljaHQgZWluc3RlbGxlbi5cbiIpOworICAgIH0KKyAgICAic2VjdXJlL21hc3RlciItPnJlbmV3X3BsYXllcl9vYmplY3Qod2hvKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICB3cml0ZSgiIC0tUkVUVVJOVkFMVUUgSVMgIityZXQrIlxuIik7CisgIHNheSgiIC0tUkVUVVJOVkFMVUUgSVMgIityZXQrIlxuIik7CisKKyAgcmV0dXJuKHJldCk7IC8vbm9uLXZvaWQgZnVua3Rpb24KK30KKwordm9pZCBjbGVhcl9mbGFnKCkKK3sKKyAgZmxhZz0wOworfQorCit2b2lkIGRvX3NheShzdHJpbmcgc3RyKQoreworICBzYXkoc3RyKTsKK30KKworCisKK3ZvaWQgc2Vlcl9zZXF1ZW56MyhtaXhlZCBwbGF5ZXIsIHN0cmluZyBwbG5hbWUpCit7CisgIHN0cmluZyBwbGF5ZXJuYW1lOyAKKyAgb2JqZWN0IGZhcTsKKyAgc3RyaW5nIHRleHQ7CisKKyAgaWYgKCFvYmplY3RwKHBsYXllcikpIHsKKyAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSwgc3ByaW50ZigiTWVybGluIHNhZ3Q6IE5hLCB3byBpc3QgZGVubiAlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhpbj9cbiIsIHBsbmFtZSkpOworICAgIGJ1c3kgPSAwOworICAgIHJldHVybjsKKyAgfQorICBpZiAoZW52aXJvbm1lbnQoKSAhPSBlbnZpcm9ubWVudChwbGF5ZXIpKQorICAgIG1vdmUoZW52aXJvbm1lbnQocGxheWVyKSwgTV9UUE9SVCk7CisgIAorICB0ZWxsX29iamVjdChwbGF5ZXIsYnJlYWtfc3RyaW5nKCJcblxuRXMgbWFjaHQgKlBVRkYqIHVuZCBlaW5lIFNjaHdlZmVsd29sa2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsic3RlaWd0IHVtIERpY2ggaGVydW0gYXVmLlxuXG5EaWUgQXVyYSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyJ2ZXJzY2h3aW5kZXQgbGFuZ3NhbSB1bmQgRHUgZnVlaGxzdCBEaWNoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIm51biB2aWVsIGVyZmFocmVuZXIuIiwgNzgsMCwxKSk7CisgIHRlbGxfcm9vbShlbnZpcm9ubWVudCgpLAorICAgICAgICAgICBicmVha19zdHJpbmcoc3ByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgICAgIlxuXG5FcyBtYWNodCAqUFVGRiogdW5kIGVpbmUgU2Nod2VmZWx3b2xrZSBzdGVpZ3QgIgorICAgICAgICAgICAgICAgICAgICAgICArInVtICVzIGhlcnVtIGF1Zi5cblxuRGllIEF1cmEgdmVyc2Nod2luZGV0IGxhbmdzYW0uXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBwbG5hbWUpLDc4LDAsMSksICh7cGxheWVyfSkpOworIAorICBpZiAoInNlY3VyZS9tYXN0ZXIiLT5hZHZhbmNlX3dpemxldmVsKGdldGV1aWQocGxheWVyKSwxKTw9MCkKKyAgeworICAgIHdyaXRlKCJNZXJsaW4gc2FndDogRGEgZ2VodCB3YXMgc2NoaWVmIC4uLiBzYWcgbWFsIFpvb2sgQmVzY2hlaWQuXG4iKTsKKyAgICBzYXkoIk1lcmxpbiBzYWd0OiBEYSBnZWh0IHdhcyBzY2hpZWYgLi4uIHNhZyBtYWwgWm9vayBCZXNjaGVpZC5cbiIpOworICAgIGJ1c3kgPSAwOworICAgIHJldHVybjsKKyAgfQorICBwbGF5ZXJuYW1lID0gZ2V0ZXVpZChwbGF5ZXIpOworICAic2VjdXJlL21hc3RlciItPnJlbmV3X3BsYXllcl9vYmplY3QocGxheWVyKTsKKyAgcGxheWVyID0gZmluZF9wbGF5ZXIocGxheWVybmFtZSk7CisgIHRleHQgPSBzcHJpbnRmKCIgaXN0IGpldHp0IGVpbiVzIFNlaGVyJXMhXG4iLAorICAgICgoKGludClwbGF5ZXItPlF1ZXJ5UHJvcChQX0dFTkRFUikpPT0yPyJlIjoiIiksCisgICAgKCgoaW50KXBsYXllci0+UXVlcnlQcm9wKFBfR0VOREVSKSk9PTI/ImluIjoiIikpOworICB3cml0ZSgiTWVybGluIHJ1ZnQ6ICIrY2FwaXRhbGl6ZShwbGF5ZXJuYW1lKSt0ZXh0KTsKKyAgc2hvdXQoIk1lcmxpbiBydWZ0OiAiK2NhcGl0YWxpemUocGxheWVybmFtZSkrdGV4dCk7CisgIFBvc3RTZWhlcihjYXBpdGFsaXplKHBsYXllcm5hbWUpLChpbnQpcGxheWVyLT5RdWVyeVByb3AoUF9HRU5ERVIpKTsKKyAgaWYoIWNhdGNoKAorICAgICAgICBmYXE9Y2xvbmVfb2JqZWN0KCIvZC9zZWhlci9oYWV1c2VyL3NwZWNpYWwvc2VoZXJmYXFtb2JpbCIpIDtwdWJsaXNoKSkKKyAgeworICAgIGZhcS0+bW92ZShwbGF5ZXIsTV9OT0NIRUNLKTsKKyAgICB0ZWxsX29iamVjdChwbGF5ZXIsICJBdXMgZGVtIE5pY2h0cyBlcnNjaGVpbnQgZWluZSBrbGVpbmUgQmVsb2hudW5nIGZ1ZXIgRGljaC5cbiIpOworICB9CisgIAorICB0ZWxsX29iamVjdChwbGF5ZXIsICJcblxuRHUgbGFlY2hlbHN0IGdsdWVja2xpY2ggaW4gZGllIFJ1bmRlLlxuXG4iKTsKKyAgdGVsbF9yb29tKGVudmlyb25tZW50KCksIHNwcmludGYoIlxuXG4lcyBsYWVjaGVsdCBnbHVlY2tsaWNoIGluIGRpZSBSdW5kZS5cblxuIiwgcGxuYW1lKSwgKHtwbGF5ZXJ9KSk7CisKKyBidXN5PTA7Cit9CisKK3ZvaWQgc2Vlcl9zZXF1ZW56MihtaXhlZCBwbGF5ZXIsIHN0cmluZyBwbG5hbWUpCit7CisgIGlmICghb2JqZWN0cChwbGF5ZXIpKSB7CisgICAgdGVsbF9yb29tKGVudmlyb25tZW50KCksIHNwcmludGYoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lcmxpbiBzYWd0OiBOYSwgd28gaXN0IGRlbm4gJXMgaGluP1xuIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxuYW1lKSk7CisgICAgYnVzeSA9IDA7CisgICAgcmV0dXJuOworICB9CisgIGlmIChlbnZpcm9ubWVudCgpICE9IGVudmlyb25tZW50KHBsYXllcikpCisgICAgbW92ZShlbnZpcm9ubWVudChwbGF5ZXIpLCBNX1RQT1JUKTsKKworICB0ZWxsX29iamVjdChwbGF5ZXIsIGJyZWFrX3N0cmluZygiXG5NZXJsaW4gaGVidCBkaWUgQXJtZSB1bmQgIgorICAgICAgICsidW5kIG1hY2h0IGVpbmlnZSBiZXNjaHdvZXJlbmRlIEdlc3Rlbi4gVW0gRGljaCBoZXJ1bSBlcnNjaGVpbnQgIgorICAgICAgICsiZWluZSBnZWxibGljaGUgQXVyYSwgZGllIGltbWVyIGhlbGxlciB3aXJkLCBiaXMgRHUgRGVpbmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIlVtd2VsdCBrYXVtIG1laHIgZXJrZW5uZW4ga2FubnN0LlxuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3OCwwLDEpKTsKKyAgdGVsbF9yb29tKGVudmlyb25tZW50KCksCisgICAgICAgICAgICBicmVha19zdHJpbmcoc3ByaW50ZigiXG5NZXJsaW4gaGVidCBkaWUgQXJtZSB1bmQgbWFjaHQgZWluaWdlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICArImJlc2Nod29lcmVuZGUgR2VzdGVuLiBVbSAlcyBlcnNjaGVpbnQgZWluZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgKyJnZWxibGljaGUgQXVyYSwgZGllIGltbWVyIGhlbGxlciB3aXJkLCBiaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyJtYW4gJXMga2F1bSBtZWhyIGVya2VubmVuIGthbm4uXG5cbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxuYW1lLCBwbG5hbWUpLDc4LDAsMSksICh7cGxheWVyfSkpOworCisgIGNhbGxfb3V0KCJzZWVyX3NlcXVlbnozIiwgNywgcGxheWVyLCBwbG5hbWUpOworfQorCit2b2lkIHNlZXJfc2VxdWVuejEobWl4ZWQgcGxheWVyLCBzdHJpbmcgcGxuYW1lKQoreworICBpZiAoIW9iamVjdHAocGxheWVyKSkKKyAgICByZXR1cm47CisKKyAgbW92ZShlbnZpcm9ubWVudChwbGF5ZXIpLCBNX1RQT1JUKTsKKworICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSwKKyAgICAgICAgICAgIGJyZWFrX3N0cmluZyhzcHJpbnRmKCJEYXMgaXN0IGVpbmUgZ3Jvc3NlIEZyZXVkZS4gJXMgaGF0IHNpY2ggIgorICAgICAidGFwZmVyIGR1cmNoIGRhcyAiTVVETkFNRSIgZ2VzY2hsYWdlbiB1bmQgbWl0dGxlcndlaWxlIGFsbGUgIgorICAgICAiQW5mb3JkZXJ1bmdlbiBlcmZ1ZWxsdCwgdW0gJXMgenUgd2VyZGVuLiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICBwbG5hbWUsICgoaW50KXBsYXllci0+UXVlcnlQcm9wKFBfR0VOREVSKSk9PTE/IlNlaGVyIjoiU2VoZXJpbiIpLAorICAgICAgICAgICAgICA3OCwgIk1lcmxpbiBzYWd0OiAiKSk7CisKKyAgY2FsbF9vdXQoInNlZXJfc2VxdWVuejIiLCA0LCBwbGF5ZXIsIHBsbmFtZSk7Cit9CisKKyAgCitzdGF0aWMgaW50IGNyZWF0ZV9zZWVyKG1peGVkIHBsYXllcikKK3sKKyAgaWYgKCFvYmplY3RwKHBsYXllcikpCisgICAgcmV0dXJuIDA7CisgIGlmIChJU19TRUVSKHBsYXllcikpCisgIHsKKyAgICB3cml0ZShicmVha19zdHJpbmcoIkR1IGJpc3QgZG9jaCBzY2hvbiBrZWluIG5vcm1hbGVyIFNwaWVsZXIgbWVociwgIgorICAgICAgICAgICAgICAgICAgICAgICArIndhcyBzb2xsIGVzIGFsc28/IiwgNzgsICJNZXJsaW4gdGVpbHQgRGlyIG1pdDogIikpOworICAgIHJldHVybiAxOworICB9CisKKyAgaWYgKCFRdWVyeUJlZGluZ3VuZ2VuKHBsYXllciwiU2VoZXIiKSkKKyAgICByZXR1cm4gLTE7CisKKworICB3cml0ZShicmVha19zdHJpbmcoIkdyb3NzZSBGcmV1ZGUhIER1IGhhc3QgYWxsZSBBbmZvcmRlcnVuZ2VuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVyZnVlbGx0LiBXYXJ0ZSBlaW5lbiBNb21lbnQuLi4iLCA3OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lcmxpbiB0ZWlsdCBEaXIgbWl0OiAiKSk7CisgIGJ1c3k9MTsKKyAgY2FsbF9vdXQoInNlZXJfc2VxdWVuejEiLDQscGxheWVyLCBwbGF5ZXItPk5hbWUoKSk7CisgIHJldHVybigwKTsgLy9ub24tdm9pZCBmdW5rdGlvbgorfQorCitzdGF0aWMgdm9pZCBnaXZlX2hlbHAobWl4ZWQgcGxheWVyKQoreworICBpZiAoIW9iamVjdHAocGxheWVyKSkKKyAgICByZXR1cm47CisKKyAgdGVsbF9vYmplY3QocGxheWVyLAorICAgICAgICAgICAgICBicmVha19zdHJpbmcoIkljaCB3ZWlzcyBuaWNodCwgd2FzIGljaCBmdWVyIERpY2ggdHVuIGthbm4uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsiSWNoIGthbm4gRGljaCB6dW0gU2VoZXIgb2RlciB6dW0gTWFnaWVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsibWFjaGVuLCB3ZW5uIER1IG1pY2ggZGFydW0gYml0dGVzdC4iLCA3OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJNZXJsaW4gdGVpbHQgRGlyIG1pdDogIikpOworfQorICAgICAgICAgICAgICAKKwordm9pZCByZXNldCgpCit7Cit9CisKK3B1YmxpYyBpbnQgcmVtb3ZlKGludCBzaWxlbnQpIHsKKyAgRVZFTlRELT5VbnJlZ2lzdGVyRXZlbnQoRVZUX0xJQl9MT0dJTiwgTUUpOworICBFVkVOVEQtPlVucmVnaXN0ZXJFdmVudChFVlRfTElCX1BMQVlFUl9DUkVBVElPTiwgTUUpOworICBkZXN0cnVjdCh0aGlzX29iamVjdCgpKTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgd2FuZGVybigpCit7CisgIG1hcHBpbmcgZXgscm9vbXM7CisgIG1peGVkIHppZWw7CisgIG9iamVjdCAqcmFldW1lLCpsYWVkZW4sZW52LG9iOworICBzdHJpbmcgKmluZCxmbjsKKyAgaW50IGk7CisKKyAgd2hpbGUgKHJlbW92ZV9jYWxsX291dCgid2FuZGVybiIpPj0wKTsKKyAgY2FsbF9vdXQoIndhbmRlcm4iLDQ1K3JhbmRvbSgxMDApKTsKKyAgaWYgKGJ1c3kpIHJldHVybjsKKyAgaWYgKGRlbGF5KQorICB7CisgICAgZGVsYXk9MDsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCEoZW52PWVudmlyb25tZW50KCkpKQorICB7CisgICAgbW92ZSgiL2dpbGRlbi9hYmVudGV1cmVyIiwwKTsKKyAgICAgICAgZW52PWVudmlyb25tZW50KCk7CisgIH0KKyAgLy91ZWJlciBJbnYgaXRlcmllcmVuLCBvYiBkYSBlaW4gbmljaHQtaWRlbG5kZXIgU3BpZWxlciBtaXQgZ2VudWcgWFAKKyAgLy9ydW1oYWVuZ3QuCisgIHJhZXVtZT1hbGxfaW52ZW50b3J5KGVudik7CisgIGZvcihpPXNpemVvZihyYWV1bWUpOyBpLS0gOyApIHsKKyAgICBpZiAoaW50ZXJhY3RpdmUocmFldW1lW2ldKSAmJiBxdWVyeV9pZGxlKHJhZXVtZVtpXSk8MTgwICYmCisgICAgICAgIHJhZXVtZVtpXS0+UXVlcnlQcm9wKFBfWFApPjk5OTk5OSkKKyAgICAgIHJldHVybjsKKyAgfQorICBleD0obWFwcGluZyllbnYtPlF1ZXJ5UHJvcChQX0VYSVRTKTsKKyAgaWYgKCFtYXBwaW5ncChleCkpCisgICAgcmV0dXJuOworICBpbmQ9bV9pbmRpY2VzKGV4KTtyb29tcz0oW10pO2xhZWRlbj0oe30pOworICBmb3IgKGk9c2l6ZW9mKGluZCktMTtpPj0wO2ktLSkKKyAgeworICAgIGlmICghc3RyaW5ncCh6aWVsPWV4W2luZFtpXV0pKQorICAgICAgY29udGludWU7CisgICAgaWYgKCFvYj1maW5kX29iamVjdCh6aWVsKSkKKyAgICAgIGNvbnRpbnVlOworICAgIHJvb21zKz0oW29iXSk7CisgIH0KKyAgcm9vbXMtPShbZW52XSk7CisgIGlmIChwcmV2X3Jvb20gJiYgc2l6ZW9mKG1faW5kaWNlcyhyb29tcykpPjEpCisgICAgcm9vbXMtPShbcHJldl9yb29tXSk7CisgIHByZXZfcm9vbT1lbnY7CisgIHJhZXVtZT1tX2luZGljZXMocm9vbXMpOworICBpZiAoIWk9c2l6ZW9mKHJhZXVtZSkpCisgICAgcmV0dXJuOworICBvYj1yYWV1bWVbcmFuZG9tKGkpXTsKKyAgbW92ZShvYiwwKTsKK30KKworc3RyaW5nIGludF9zaG9ydCgpCit7CisgIHJldHVybiAiRHUgYmlzdCBpbSBhbGxzZWl0cyBiZWxpZWJ0ZW4gV2l6Y2x1YiBcIlp1bSBsdXN0aWdlbiBNZXJsaW5cIi5cbiI7Cit9CisKK3N0cmluZyBpbnRfbG9uZyhvYmplY3Qgd2hvLG1peGVkIHdoZXJlKQoreworICBzdHJpbmcgZGVzY3I7CisKKyAgaWYoIElTX0xFQVJORVIod2hvKSAmJiB3aG8tPlF1ZXJ5UHJvcCggUF9XQU5UU19UT19MRUFSTiApICkKKyAgICBkZXNjciA9ICJbIiArIG9iamVjdF9uYW1lKE1FKSArICJdXG4iOworICBlbHNlCisgICAgZGVzY3IgPSAiIjsKKyAgZGVzY3IrPSJEdSBiaXN0IGltIFdpemNsdWIgJ1p1bSBsdXN0aWdlbiBNZXJsaW4nLiBEaWVzZXIgV2l6Y2x1YiBpc3QgZXR3YXMgYmVzb25kZXJlcyAtXG5lciBoYXQga2VpbmVuIGZlc3RlbiBTdGFuZG9ydCwgc29uZGVybiB3YW5kZXJ0IGltIE11ZCBoZXJ1bS4gQXVzc2VyZGVtIGthbm4gZXJcblNwaWVsZXIgenUgTWFnaWVybiBtYWNoZW4gLSBhYmVyIG51ciwgd2VubiBtYW4gaWhuIHZvbiBhdXNzZW4gYXVzIGRhcmF1ZlxuYW5zcHJpY2h0LlxuIjsKKyAgaWYgKCB3aG8tPlF1ZXJ5UHJvcChQX1NIT1dfRVhJVFMpICkKKyAgICBkZXNjciArPSAiRXMgZ2lidCAyIHNpY2h0YmFyZSBBdXNnYWVuZ2U6IHJhdXMgdW5kIGdpbGRlLlxuIjsKKyAgZGVzY3IgKz0gbWFrZV9pbnZsaXN0KHdobywgYWxsX2ludmVudG9yeShNRSkgLSAoeyB3aG8gfSkpOworICBpZiggZW52aXJvbm1lbnQoKSkKKyAgICBkZXNjciArPSAiXG5BdXNzZXJoYWxiIHNpZWhzdCBEdTpcbiIKKyAgICAgICsgZW52aXJvbm1lbnQoKS0+aW50X3Nob3J0KHdobyxNRSk7CisgIHJldHVybiBkZXNjcjsKK30KKworc3RyaW5nIG1ha2VfaW52bGlzdChvYmplY3Qgdmlld2VyLG9iamVjdCAqaW52KQoreworICBpbnQgaSwgaXN3aXo7CisgIHN0cmluZyBkZXNjcjsKKworICBkZXNjciA9ICIiOworICBpc3dpeiA9IElTX0xFQVJORVIoIHZpZXdlciApICYmIHZpZXdlci0+UXVlcnlQcm9wKFBfV0FOVFNfVE9fTEVBUk4pOworCisgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YoaW52KTsgaSsrKQorICB7CisgICAgc3RyaW5nIHNoOworICAgIHNoID0gKHN0cmluZylpbnZbaV0tPnNob3J0KCk7CisgICAgaWYgKGlzd2l6KQorICAgIHsKKyAgICAgIGlmIChzaCkgc2ggPSBzaFswLi48Ml0gKyAiIFsiK29iamVjdF9uYW1lKGludltpXSkrIl1cbiI7CisgICAgICBlbHNlIHNoID0gIlsiK29iamVjdF9uYW1lKGludltpXSkrIl1cbiI7CisgICAgfQorICAgIGlmIChzaCkgZGVzY3IgKz0gc2g7CisgIH0KKyAgcmV0dXJuIGRlc2NyOworfQorCit2b2lkIGluaXQoKQoreworICBpZiAoaW50ZXJhY3RpdmUodGhpc19wbGF5ZXIoKSkgJiYgZW52aXJvbm1lbnQodGhpc19wbGF5ZXIoKSk9PU1FKQorICAgIGFkZF9hY3Rpb24oImdlaGVuIiwiIiwxKTsKKyAgYWRkX2FjdGlvbigiYmVmb2VyZGVyZSIsImJlZm9lcmRlciIsMSk7Cit9CisKK2ludCBiZWZvZXJkZXJlKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyB3ZW47CisgIGludCByZXQsc3R1ZmUsbDsKKworICBpZiAoIUxPUkRfU0VDVVJJVFkpIHJldHVybiAwOworICBpZiAoIXN0cnx8c3NjYW5mKHN0ciwiJXMgYXVmIHN0dWZlICVkIix3ZW4sc3R1ZmUpPDIpCisgIHsKKyAgICBub3RpZnlfZmFpbCgiU3ludGF4OiBiZWZvZXJkZXJlIDxuYW1lPiBhdWYgc3R1ZmUgPHN0dWZlPlxuIik7CisgICAgICAgIHJldHVybiAwOworICB9CisgIGlmIChzdHVmZT4yOSkKKyAgeworICAgIHdyaXRlKCJNYXhpbXVtIGlzdCBTdHVmZSAyOSFcbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgfQorICBsPXF1ZXJ5X3dpel9sZXZlbCh3ZW4pOworICBpZiAobDwyNSkKKyAgeworICAgIHByaW50ZigiJXMgbXVzcyBtaW5kZXN0ZW5zIHp3ZWNrcyBXZWl0ZXJiZWZvZXJkZXJ1bmcgbWluZGVzdGVucyBTdHVmZSAyNSBoYWJlbi5cbiIsCisgICAgICAgIGNhcGl0YWxpemUod2VuKSk7ICAgICAgICAKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAobD49c3R1ZmUpCisgIHsKKyAgICBwcmludGYoIiVzIGlzdCBzY2hvbiBTdHVmZSAlZC5cbiIsY2FwaXRhbGl6ZSh3ZW4pLGwpOworICAgICAgICByZXR1cm4gMTsKKyAgfQorICByZXQ9KGludCkic2VjdXJlL21hc3RlciItPmFkdmFuY2Vfd2l6bGV2ZWwod2VuLHN0dWZlKTsKKyAgaWYgKHJldDw9MCkKKyAgICBwcmludGYoIkVycm9yY29kZSAlZFxuIixyZXQpOworICBlbHNlCisgICAgd3JpdGUoIm9rXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBzYWcobWl4ZWQgc3RyKQoreworICBpbnQgaTsKKworICBpZiAoc3RyPT0wKQorICAgIHN0cj0iIjsKKyAgc3RyID0gb2xkX2V4cGxvZGUoYnJlYWtfc3RyaW5nKHN0ciwgNjAgKSwgIlxuIik7CisgIGlmIChidXN5KSB7CisgICAgdGVsbF9yb29tKE1FLCAiTWVybGluIG1hdWx0OiBJY2ggYmluIGJlc2NoYWVmdGlndC5cbiIpOworICAgIHJldHVybiAwOworICB9CisgIGZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc3RyKTsgaSsrKQorICB7CisgICAgaWYgKCFzdHJbaV0pCisgICAgICBzdHJbaV09IiI7CisgICAgdGVsbF9yb29tKGVudmlyb25tZW50KCksIk1lcmxpbiBzYWd0OiAiK3N0cltpXSsiXG4iKTsKKyAgICB0ZWxsX3Jvb20oTUUsIipNZXJsaW4gc2FndDogIitzdHJbaV0rIlxuIik7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgc2hvd19leGl0cygpCit7CisgIHByaW50ZigiJXMiLGVudmlyb25tZW50KCktPkdldEV4aXRzKCkpOworfQorCitpbnQgZ2VoZW4oc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIHZlcmI7CisgIGludCBpOworICBtYXBwaW5nIGV4aXRzOworICBzdHJpbmcgKmV4OworCisgIGlmIChidXN5KSB7CisgICAgd3JpdGUoIk1lcmxpbiBtYXVsdDogSWNoIGJpbiBiZXNjaGFlZnRpZ3QuXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHZlcmI9cXVlcnlfdmVyYigpOworICBzdHI9KHN0cmluZyl0aGlzX2ludGVyYWN0aXZlKCktPl91bnBhcnNlZF9hcmdzKCk7CisgIHN3aXRjaCAodmVyYikKKyAgeworICAgIGNhc2UgImdpbGRlIjoKKyAgICAgIHRoaXNfcGxheWVyKCktPm1vdmUoIi9naWxkZW4vYWJlbnRldXJlciIsTV9HTywiaW4gZGllIEdpbGRlIik7CisgICAgICByZXR1cm4gMTsKKyAgICBjYXNlICJyYXVzIjoKKyAgICAgIHRoaXNfcGxheWVyKCktPm1vdmUoZW52aXJvbm1lbnQoKSxNX0dPLCJyYXVzIik7CisgICAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoIUlTX1dJWkFSRCh0aGlzX2ludGVyYWN0aXZlKCkpKQorICAgIHJldHVybiAwOworICBpZiAodmVyYiE9Im1lcmxpbiIpCisgICAgcmV0dXJuIDA7CisgIGRlbGF5PTE7CisgIGV4aXRzPShtYXBwaW5nKWVudmlyb25tZW50KCktPlF1ZXJ5UHJvcChQX0VYSVRTKTsKKyAgaWYgKCFzdHJ8fHN0cj09IiIpCisgIHsKKyAgICBleD1tX2luZGljZXMoZXhpdHMpOworICAgIHByaW50ZihlbnZpcm9ubWVudCgpLT5pbnRfc2hvcnQoTUUsTUUpKTsKKyAgICBzaG93X2V4aXRzKCk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKG9sZF9leHBsb2RlKHN0ciwiICIpWzBdPT0ic2FnIikKKyAgICByZXR1cm4gc2FnKGltcGxvZGUob2xkX2V4cGxvZGUoc3RyLCIgIilbMS4uXSwiICIpKTsKKyAgaWYgKHN0clswXT09JzsnKQorICB7CisgICAgdGVsbF9yb29tKGVudmlyb25tZW50KE1FKSwiTWVybGlucyAiK3N0clsxLi5dKyJcbiIpOworICAgIHRlbGxfcm9vbShNRSwiKk1lcmxpbnMgIitzdHJbMS4uXSsiXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoc3RyWzBdPT0nOicpCisgIHsKKyAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoTUUpLCJNZXJsaW4gIitzdHJbMS4uXSsiXG4iKTsKKyAgICB0ZWxsX3Jvb20oTUUsIipNZXJsaW4gIitzdHJbMS4uXSsiXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoc3RyWzBdPT0nKicpCisgIHsKKyAgICBnb3RvKHN0clsxLi5dKTsKKyAgICBwcmludGYoZW52aXJvbm1lbnQoKS0+aW50X3Nob3J0KE1FLE1FKSk7CisgICAgc2hvd19leGl0cygpOworICAgIHJldHVybiAxOworICB9CisgIGlmICghZXhpdHNbc3RyXSkKKyAgICByZXR1cm4gMDsKKyAgbW92ZShleGl0c1tzdHJdLDApOworICB3cml0ZSgiTWVybGluIHNhZ3Q6IEphd29sbCwgQ2hlZi5cbiIpOworICBwcmludGYoZW52aXJvbm1lbnQoKS0+aW50X3Nob3J0KE1FLE1FKSk7CisgIHNob3dfZXhpdHMoKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBnb3RvKG1peGVkIGRlc3QpCit7CisgIG9iamVjdCBvYjsKKyAgc3RyaW5nIHBhdGg7CisgIG1peGVkIHJldDsKKworICBpZiAoYnVzeSkgeworICAgIHdyaXRlKCJNZXJsaW4gbWF1bHQ6IEljaCBiaW4gYmVzY2hhZWZ0aWd0LlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBpZiAoIWRlc3QpIHsKKyAgICB3cml0ZSgiV29oaW4gbW9lY2h0ZXN0IER1IE1lcmxpbiBicmluZ2VuID9cbiIpOworICAgIHJldHVybiAxOworICB9CisgIG9iID0gZmluZF9saXZpbmcoZGVzdCk7CisgIGlmIChvYikgeworICAgIG9iID0gZW52aXJvbm1lbnQob2IpOworICAgIG1vdmUob2JqZWN0X25hbWUob2IpLDApOworICAgIHJldHVybiAxOworICB9CisgIHBhdGg9KG1peGVkKSJzZWN1cmUvbWFzdGVyIi0+X2dldF9wYXRoKGRlc3QsZ2V0dWlkKHRoaXNfcGxheWVyKCkpKTsKKyAgcmV0PWNhdGNoKGxvYWRfb2JqZWN0KHBhdGgpO3B1Ymxpc2gpOworICBpZiAocmV0ICYmIGZpbGVfc2l6ZShwYXRoKTwwKQorICB7CisgICAgZGVzdD1tYXRjaF9saXZpbmcoZGVzdCwxKTsKKyAgICBpZiAoc3RyaW5ncChkZXN0KSkKKyAgICB7CisgICAgICBvYiA9IGVudmlyb25tZW50KGZpbmRfbGl2aW5nKGRlc3QpKTsKKyAgICAgIG1vdmUob2JqZWN0X25hbWUob2IpLE1fVFBPUlR8TV9OT0NIRUNLKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBwcmludGYoIkZlaGxlciBiZWltIFRlbGVwb3J0IG5hY2ggJU86IE5vIHN1Y2ggZmlsZS5cbiIscGF0aCk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKHJldCkKKyAgICBwcmludGYoIkZlaGxlciBiZWltIFRlbGVwb3J0IG5hY2ggJU86ICVPXG4iLGRlc3QscmV0KTsKKyAgcmV0PWNhdGNoKG1vdmUocGF0aCxNX1RQT1JUfE1fTk9DSEVDSyk7cHVibGlzaCk7CisgIGlmIChzdHJpbmdwKHJldCkpCisgICAgcmV0PWltcGxvZGUob2xkX2V4cGxvZGUocmV0LCJcbiIpLCIiKTsKKyAgaWYgKHJldCkKKyAgICBwcmludGYoIkZlaGxlciBiZWltIFRlbGVwb3J0IG5hY2ggJU86ICVPXG4iLGRlc3QscmV0KTsKKyAgcmV0dXJuIDE7Cit9CisKK21peGVkIGxvY2F0ZV9vYmplY3RzKHN0cmluZyBjb21wbGV4X2Rlc2MpCit7CisgIG9iamVjdCBvYjsKKworICBpZiAoY29tcGxleF9kZXNjPT0iYWxsZXMiIHx8IGNvbXBsZXhfZGVzYz09ImFsbGUiKQorICAgIHJldHVybiBmaWx0ZXJfb2JqZWN0cyhhbGxfaW52ZW50b3J5KHRoaXNfb2JqZWN0KCkpLCJzaG9ydCIpOworICBpZiAob2IgPSBwcmVzZW50KGNvbXBsZXhfZGVzYyx0aGlzX29iamVjdCgpKSApCisgICAgcmV0dXJuICh7IG9iIH0pOworICByZXR1cm4gKHt9KSA7Cit9CisKK3ZvaWQgTUJhbmlzaEluc2VydChzdHJpbmcgbmFtZSwgc3RyaW5nIGdydW5kLCBvYmplY3Qgd2VyKQoreworICBpZiAoICFuYW1lIHx8ICFzdHJpbmdwKG5hbWUpIHx8ICFzaXplb2YobmFtZSkgfHwKKyAgICAgICAhZ3J1bmQgfHwgIXN0cmluZ3AoZ3J1bmQpIHx8ICFzaXplb2YoZ3J1bmQpIHx8CisgICAgICAgIXdlciB8fCAhb2JqZWN0cCh3ZXIpIHx8IGdldHVpZCh3ZXIpICE9IHNlY3VyZV9ldWlkKCkgfHwKKyAgICAgICAhSVNfREVQVVRZKHdlcikgKQorICAgIHJldHVybjsKKworICBNQmFuaXNoTGlzdGUgKz0gKFtuYW1lOmdydW5kO2dldHVpZCh3ZXIpXSk7CisgIHNhdmVfb2JqZWN0KFNBVkVGSUxFKTsKK30KKworbWFwcGluZyBNQmFuaXNoTGlzdCgpCit7CisgICAgaWYgKCAhSVNfREVQVVRZKHNlY3VyZV9ldWlkKCkpICkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gZGVlcF9jb3B5KE1CYW5pc2hMaXN0ZSk7Cit9CisKK3ZvaWQgTUJhbmlzaERlbGV0ZShzdHJpbmcgbmFtZSkKK3sKKyAgaWYgKCAhbmFtZSB8fCAhc3RyaW5ncChuYW1lKSB8fCAhc2l6ZW9mKG5hbWUpIHx8ICFBUkNIX1NFQ1VSSVRZICkKKyAgICByZXR1cm4gMDsKKworICBNQmFuaXNoTGlzdGUgPSBtX2NvcHlfZGVsZXRlKCBNQmFuaXNoTGlzdGUsIG5hbWUgKTsKKyAgc2F2ZV9vYmplY3QoU0FWRUZJTEUpOworfQorCitzdHJpbmcgX3F1ZXJ5X25vZ2V0KCkKK3sKKyAgcmV0dXJuICJNZXJsaW4gbWFnIGRhcyBuaWNodCFcbiI7Cit9CisKZGlmZiAtLWdpdCBhL3NlY3VyZS9taW5pX3Byb3BzLmMgYi9zZWN1cmUvbWluaV9wcm9wcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMzQ1YTQKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvbWluaV9wcm9wcy5jCkBAIC0wLDAgKzEsNDAgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBtaW5pX3Byb3BzLmMgLS0gQWJnZXNwZWNrdGUgVmVyd2FsdHVuZyB2b24gUHJvcHMKKy8vICAgICAgICAgICAgICAgICBBdXMgU2ljaGVyaGVpdHNncnVlbmRlbiBkYXJmIGhpZXIgbmljaHQgZGllICJWb2xsdmVyc2lvbiIKKy8vICAgICAgICAgICAgICAgICBtaXQgZWNodGVuIFByb3BlcnRpZXMgc3RlaGVuCisvLworLy8gJElkJAorI3ByYWdtYSBzdHJpY3RfdHlwZXMsc2F2ZV90eXBlcworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBub19zaGFkb3cKKyNwcmFnbWEgcGVkYW50aWMscmFuZ2VfY2hlY2ssd2Fybl9kZXByZWNhdGVkCisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPgorI3VuZGVmIE5FRURfUFJPVE9UWVBFUworCitub3NhdmUgbWFwcGluZyBwcm9wOworCitwcml2YXRlIHZvaWQgSW5pdFByb3BzKCkKK3sKKyAgICBwcm9wID0gbV9hbGxvY2F0ZSgyLDEpOworfQorCisKK3B1YmxpYyB2YXJhcmdzIG1peGVkIFF1ZXJ5KCBzdHJpbmcgc3RyLCBpbnQgdHlwZSApCit7CisgICAgaWYgKCAhbWFwcGluZ3AocHJvcCkgKQorICAgICAgICBJbml0UHJvcHMoKTsKKworICAgIHJldHVybiBwcm9wW3N0cl07Cit9CisKK3B1YmxpYyB2YXJhcmdzIG1peGVkIFNldChzdHJpbmcgbmFtZSwgbWl4ZWQgdmFsdWUsIGludCB0eXBlLCBpbnQgZXh0ZXJuKQoreworICAgIGlmICggIW1hcHBpbmdwKHByb3ApICkKKyAgICAgICAgSW5pdFByb3BzKCk7CisKKyAgICByZXR1cm4gcHJvcFtuYW1lXSA9IHZhbHVlOworfQorCmRpZmYgLS1naXQgYS9zZWN1cmUvbWlzYy9tc3NwLmMgYi9zZWN1cmUvbWlzYy9tc3NwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM0NTM4OAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9taXNjL21zc3AuYwpAQCAtMCwwICsxLDIxNCBAQAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHRoaW5nL2Rlc2NyaXB0aW9uLmg+CisjaW5jbHVkZSA8c3RyaW5ncy5oPgorCisvLyBob3N0cyB3aG8gYXNrZWQgdXMgaW4gdGhlIHBhc3QgYW5kIHRpbWVzdGFtcCBvZiBsYXN0IGNvbm5lY3Rpb24gd2hpY2ggZ290CisvLyB0aGUgZnVsbCBkYXRhdHNldC4KK3ByaXZhdGUgbm9zYXZlIG1hcHBpbmcgcGVlcnMgPSAoWzoxXSk7CisKKy8qIEZvciBhIGxpc3Qgb2Ygb2ZmaWNpYWwgYW5kIGV4dGVuZGVkIGZpZWxkczoKKyAgIGh0dHA6Ly93d3cubXVkYnl0ZXMubmV0L2luZGV4LnBocD9hPWFydGljbGVzJnM9TVNTUF9GaWVsZHMKKyAgIEZvciBhIHByb3RvY2FsIGRlc2NyaXB0aW9uOgorICAgaHR0cDovL3RpbnRpbi5zb3VyY2Vmb3JnZS5uZXQvbXNzcC8KKyAgICovCisKKyNkZWZpbmUgTVNTUF9WQVIgMQorI2RlZmluZSBNU1NQX1ZBTCAyCisKK3B1YmxpYyBzdHJpbmcgY29udmVydF90bihtYXBwaW5nIGxkYXRhKTsKKworcHJvdGVjdGVkIHN0cmluZyBsaXN0X3BvcnRzKCkgeworICBpbnQgcG9ydHMgPSBxdWVyeV9tdWRfcG9ydCgtMSkgLSAxOworICBzdHJpbmcgcmVzPSIyMyI7CisgIGZvcig7IHBvcnRzPj0wIDsgLS1wb3J0cykKKyAgICByZXMgKz0gIlx0IiArIHRvX3N0cmluZyhxdWVyeV9tdWRfcG9ydChwb3J0cykpOworCisgIHJldHVybiByZXM7Cit9CisKKyNkZWZpbmUgREVTQ1JJUFRJT04gXAorICAgIE1VRE5BTUUiIGlzIGEgbmF0aXZlIEdlcm1hbiBMUG11ZC4gSXQgd2FzIGZvdW5kZWQgaW4gMTk5MiBhbmQgaGFzICJcCisgICAgImJlZW4gcHJvc3BlcmluZyBzaW5jZS4gVGhlIHdvcmxkIGZlYXR1cmVzIGFuIG9yaWdpbmFsIGZhbnRhc3kgc2V0dGluZyAiXAorICAgICJ3aXRoIG1hbnkgZmFjZXRzLiBUaGUgMTMgZG9tYWlucyBmb3JtIGEgYmlnIHdvcmxkIHdpdGggMTgwMDAgcm9vbXMgdG8gIlwKKyAgICAiZXhwbG9yZSBhbmQgc2V2ZXJhbCB0aG91c2FuZCBOUENzLiBZb3UgY2FuIGNob29zZSBiZXR3ZWVuIDcgcmFjZXMgYW5kICJcCisgICAgIjEwIGNsYXNzZXMgKGd1aWxkcykuIEFkdmFuY2luZyBpcyBkb25lIHRocm91Z2ggYSBjb21iaW5hdGlvbiBvZiAiXAorICAgICJleHBsb3JhdGlvbiBwb2ludHMsIGV4cGVyaWVuY2UgcG9pbnRzLCBjbGFzcyBza2lsbHMsIGZpbmlzaGVkICJcCisgICAgImFkdmVudHVyZXMgYW5kIHNvbWUgbW9yZS4gVGhlIGxldmVscyBhcmUgbm90IGxpbWl0ZWQsIGN1cnJlbnQgbWF4aW11bSAiXAorICAgICJpcyBhYm91dCAyMDAuIEFmdGVyIGJlY29taW5nIGEgaGlnaCBsZXZlbCBwbGF5ZXIgaXQncyBwb3NzaWJsZSB0byAiXAorICAgICJiZWNvbWUgYSB3aXphcmQgYW5kIGFkZCB5b3VyIG93biBpbWFnaW5hdGlvbiB0byB0aGUgZ2FtZS4gV2UgYXJlICJcCisgICAgImVzcGVjaWFsbHkgcHJvdWQgb2YgYXR0cmFjdGluZyBhIG51bWJlciBvZiB2aXN1YWxseSBpbXBhaXJlZCBwbGF5ZXJzICJcCisgICAgIndobyB2ZXJ5IG11Y2ggZW5qb3kgcGxheWluZyBhIHRleHQgYmFzZWQgb25saW5lIFJQRy4gVGhhdHMgd2h5IHdlIGhhdmUgIlwKKyAgICAiYW4gb3B0aW9uIHRvIHR1cm4gYXNjaWktZ3JhcGhpY3Mgb2ZmLiBNdWx0aXBsYXlpbmcgaXMgYSBiaXQgcmVzdHJpY3RlZCAiXAorICAgICJhbmQgc2NyaXB0aW5nIGlzIGRpc2NvdXJhZ2VkLiIKKworcHJpdmF0ZSBub3NhdmUgbWFwcGluZyBtaW5kYXRhID0gKFsKKyAgICAiTkFNRSIgICAgICAgICAgICAgOiBNVUROQU1FLAorICAgICJVUFRJTUUiICAgICAgICAgICA6IHRvX3N0cmluZyhfX0JPT1RfVElNRV9fKSwKKyAgICBdKTsKKworcHJpdmF0ZSBub3NhdmUgbWFwcGluZyBkYXRhID0gbWluZGF0YSArIChbCisgICAgIlBPUlQiICAgICAgICAgICAgIDogbGlzdF9wb3J0cygpLAorICAgICJDT0RFQkFTRSIgICAgICAgICA6IF9NVURMSUJfTkFNRV8rIi0iK19NVURMSUJfVkVSU0lPTl8sCisgICAgIkhPU1ROQU1FIiAgICAgICAgIDogX19IT1NUX05BTUVfXyArICIuIiArIF9fRE9NQUlOX05BTUVfXywKKyNpZiBNVURIT1NUID09IF9fSE9TVF9OQU1FX18KKy8vIGRpZXNlIEFuZ2FiZW4gc29sbGVuIG51ciBnZXNlbmRldCB3ZXJkZW4sIHdlbm4gZGFzIE11ZCB3aXJrbGljaCBhdWYgZGVtCisvLyBNRy1SZWNobmVyIGxhZXVmdCB1bmQga2VpbiBIb21lbXVkIGlzdC4KKyAgICAiQ1JBV0wgREVMQVkiICAgICAgOiAiMSIsCisgICAgIkRFU0NSSVBUSU9OIiAgICAgIDogREVTQ1JJUFRJT04sCisgICAgIkNSRUFURUQiICAgICAgICAgIDogIjE5OTIiLAorICAgICJJQ09OIiAgICAgICAgICAgICA6ICJodHRwOi8vbWcubXVkLmRlL25ld3dlYi9pbWcvaWNvbi5naWYiLAorICAgICJJUCIgICAgICAgICAgICAgICA6ICI4Ny43OS4yNC42MCIsCisgICAgIkNPTlRBQ1QiICAgICAgICAgIDogIm11ZEBtZy5tdWQuZGUiLAorICAgICJXRUJTSVRFIiAgICAgICAgICA6ICJodHRwOi8vbWcubXVkLmRlLyIsCisgICAgIkFSRUFTIiAgICAgICAgICAgIDogIjEzIiwKKyAgICAiTU9CSUxFUyIgICAgICAgICAgOiAiMjYwMCIsCisgICAgIk9CSkVDVFMiICAgICAgICAgIDogIjQwMDAiLAorICAgICJST09NUyIgICAgICAgICAgICA6ICIxODAwMCIsCisgICAgIkNMQVNTRVMiICAgICAgICAgIDogIjEwIiwKKyAgICAiTEVWRUxTIiAgICAgICAgICAgOiAiMjAwIiwKKyAgICAiUkFDRVMiICAgICAgICAgICAgOiAiNyIsCisgICAgIlNLSUxMUyIgICAgICAgICAgIDogIjE0MCIsCisgICAgIk1VTFRJQ0xBU1NJTkciICAgIDogIjAiLAorICAgICJQTEFZRVJLSUxMSU5HIiAgICA6ICJSZXN0cmljdGVkIiwKKyAgICAiTkVXQklFIEZSSUVORExZIiAgOiAiMSIsCisgICAgIlJPTEVQTEFZSU5HIiAgICAgIDogIkFjY2VwdGVkIiwKKyAgICAiV09STEQgT1JJR0lOQUxJVFkiOiAiTW9zdGx5IE9yaWdpbmFsIiwKKyAgICAiTUlOSU1VTSBBR0UiICAgICAgOiAiNiIsCisgICAgIlNTTCIgICAgICAgICAgICAgIDogIjQ3MTIiLAorICAgICJTVEFUVVMiICAgICAgICAgICA6ICJMaXZlIiwKKyAgICAiU1RBVFVTLU5PVEVTIiAgICAgOiAibGl2ZSBhbmQgcnVubmluZyIsCisgICAgIlBPUlQtTk9URVMiICAgICAgIDogInBsYXllciBwb3J0cyBhcmUgMjMgYW5kIDQ3MTEsIFNTTCBwb3J0IGlzIDQ3MTIiLAorICAgICJRVUVTVC1OT1RFUyIgICAgICA6ICJXZSBoYXZlIGFib3V0IDIwMCBRdWVzdHMgYW5kIE1pbmlRdWVzdHMgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAidGhleSBwbGF5IGFuIGltcG9ydGFudCByb2xlIGluIGdhaW5pbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJsZXZlbHMgYW5kIHNraWxscy4iLAorICAgICJNVUxUSVBMQVlJTkctTk9URVMiICAgICA6ICJmb3IgY29tYmF0IGFuZCBxdWVzdHMgb25seSAyIGNoYXJhY3RlcnMgbWF5IGJlIGFjdGl2ZSIsCisjZWxzZQorICAgICJTVEFUVVMiICAgICAgICAgICA6ICJBbHBoYSIsCisgICAgIlNUQVRVUy1OT1RFUyIgICAgIDogIkhvbWVtdWQgZm9yIHRlc3RpbmcgcHVwb3NlcyIsCisjZW5kaWYKKyAgICAiTEFOR1VBR0UiICAgICAgICAgOiAiR2VybWFuIiwKKyAgICAiTE9DQVRJT04iICAgICAgICAgOiAiR2VybWFueSIsCisgICAgIkZBTUlMWSIgICAgICAgICAgIDogIkxQTXVkIiwKKyAgICAiR0VOUkUiICAgICAgICAgICAgOiAiRmFudGFzeSIsCisgICAgIlNVQkdFTlJFIiAgICAgICAgIDogIk5vbmUiLAorICAgICJHQU1FUExBWSIgICAgICAgICA6ICJBZHZlbnR1cmUiLAorICAgICJHQU1FU1lTVEVNIiAgICAgICA6ICJDdXN0b20iLAorICAgICJJTlRFUk1VRCIgICAgICAgICA6ICJJTTItWmViZWRlZSIsCisgICAgIkhFTFBGSUxFUyIgICAgICAgIDogIk4vQSIsCisgICAgIk1VTFRJUExBWUlORyIgICAgIDogIlJlc3RyaWN0ZWQiLAorICAgICJFUVVJUE1FTlQgU1lTVEVNIiA6ICJCb3RoIiwKKyAgICAiVFJBSU5JTkcgU1lTVEVNIiAgOiAiQm90aCIsCisgICAgIlFVRVNUIFNZU1RFTSIgICAgIDogIkludGVncmF0ZWQiLAorICAgICJaTVAiICAgICAgICAgICAgICA6ICIwIiwKKyAgICAiQU5TSSIgICAgICAgICAgICAgOiAiMSIsCisgICAgIkdNQ1AiICAgICAgICAgICAgIDogIjEiLAorICAgICJNQ0NQIiAgICAgICAgICAgICA6ICIwIiwKKyAgICAiTUNQIiAgICAgICAgICAgICAgOiAiMCIsCisgICAgIk1TUCIgICAgICAgICAgICAgIDogIjAiLAorICAgICJNWFAiICAgICAgICAgICAgICA6ICIwIiwKKyAgICAiUFVFQkxPIiAgICAgICAgICAgOiAiMCIsCisgICAgIlZUMTAwIiAgICAgICAgICAgIDogIjEiLAorICAgICJYVEVSTSAyNTYgQ09MT1JTIiA6ICIwIiwKKyAgICAiUEFZIFRPIFBMQVkiICAgICAgOiAiMCIsCisgICAgIlBBWSBGT1IgUEVSS1MiICAgIDogIjAiLAorICAgICJISVJJTkcgQlVJTERFUlMiICA6ICIxIiwKKyAgICAiSElSSU5HIENPREVSUyIgICAgOiAiMSIsCisgICAgIkNPREVCQVNFLU5PVEVTIiAgICAgICAgIDogImRvd25sb2FkIGRhaWx5IHNuYXBzaG90IG9mIG91ciBwdWJsaWMgYmFzZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm11ZGxpYiBhdCBmdHA6Ly9tZy5tdWQuZGUvU29mdHdhcmUvTXVkTGliLywgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZXQgb3VyIGRyaXZlciBhdCBodHRwOi8vd3d3LmxkbXVkLmV1LyIsCisgICAgIkZBTUlMWS1OT1RFUyIgICAgICAgICAgIDogIkRlc2NlbmRhbnQgb2YgTmlnaHRmYWxsLCBiYXNlIGZvciBzZXZlcmFsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2VybWFuIE1VRHMsIHVzZXMgTERNdWQtMy41LngiLCAKKyAgICAiSEVMUEZJTEVTLU5PVEVTIiAgICAgICAgOiAiZWFjaCBiYXNpYyBjb21tYW5kLCBhbmQgaHVuZHJlZHMgb2Ygb3RoZXIgZG9jcyIsCisgICAgIk1PQklMRVMtTk9URVMiICAgICAgICAgIDogIm5wYydzIGNhbiBiZSBjbG9uZWQsIHNvIHRoZXJlIGNhbiBiZSB0aG91c2FuZHMiLAorICAgICJPQkpFQ1RTLU5PVEVTIiAgICAgICAgICA6ICJvYmplY3RzIGNhbiBiZSBjbG9uZWQsIHNvIHRoZXJlIGNhbiBiZSB0aG91c2FuZHMiLAorICAgICJSRVNFVFMtTk9URVMiICAgICAgICAgICA6ICJkb2Vzbid0IGFwcGx5LCBMUE11ZCIsCisgICAgIk1VRFBST0dTLU5PVEVTIiAgICAgICAgIDogImRvZXNuJ3QgYXBwbHksIExQTXVkIiwKKyAgICAiTVVEVFJJR1MtTk9URVMiICAgICAgICAgOiAiZG9lc24ndCBhcHBseSwgTFBNdWQiLAorICAgICJSQUNFUy1OT1RFUyIgICAgICAgICAgICA6ICJzb21lIGFkZGl0aW9uYWwgZm9yIG5vbiBwbGF5ZXIgY2hhcmFjdGVycyIsCisgICAgIlNLSUxMUy1OT1RFUyIgICAgICAgICAgIDogImVhY2ggY2xhc3MvZ3VpbGQgYW5kIHJhY2UgaGFzIGl0cyBvd24gc2V0IG9mIHNraWxscyIsCisgICAgIlBMQVlFUktJTExJTkctTk9URVMiICAgIDogInBsYXllcmtpbGxpbmcgaXMgbGltaXRlZCB0byBzcGVjaWZpYyByb29tcyIsCisvKgorICAgICJBRFVMVCBNQVRFUklBTCIgICA6ICIwIiwKKyAgICAiUExBWUVSIENJVElFUyIgICAgOiAiMCIsCisgICAgIlBMQVlFUiBDTEFOUyIgICAgIDogIjAiLAorICAgICJQTEFZRVIgQ1JBRlRJTkciICA6ICIwIiwKKyAgICAiUExBWUVSIEdVSUxEUyIgICAgOiAiMCIsCisgICAgIlJPT01TLU5PVEVTIiAgICAgICAgICAgIDogImFyZWFzIGhhdmUgZ2VuZXJhdGVkIHJvb21zLCBjb3VsZCBiZSBtaWxsaW9ucyIsCisgKi8KKyAgICBdKTsKKworCisvLyBjYWNoZSBmdWVyIGRpZSB0ZWxuZXRuZWctYmFzaWVydGUgdmFyaWFudGUKK3ByaXZhdGUgbm9zYXZlIHN0cmluZyB0bl9yZXN1bHRfbWluID0gY29udmVydF90bihtaW5kYXRhKTsKK3ByaXZhdGUgbm9zYXZlIHN0cmluZyB0bl9yZXN1bHQgPSBjb252ZXJ0X3RuKGRhdGEpOworCisKKy8vIGNvbnZlcnRzIGludG8gdGhlIGFycmF5IHRvIGJlIHNlbnQgdmlhIHRlbG5ldCBzdWJvcHRpb24gbmVnb3RpYXRpb24uCitwdWJsaWMgc3RyaW5nIGNvbnZlcnRfdG4obWFwcGluZyBsZGF0YSkgeworICBzdHJpbmcgcmVzPSIiOworICBmb3JlYWNoKHN0cmluZyBrZXksIHN0cmluZyB2YWx1ZTogbGRhdGEpIHsKKyAgICByZXMgKz0gc3ByaW50ZigiJWMlcyVjJXMiLCBNU1NQX1ZBUiwga2V5LCBNU1NQX1ZBTCwgdmFsdWUpOworICB9CisgIHJldHVybiByZXM7Cit9CisKKworcHVibGljIHZvaWQgcHJpbnRfbXNzcF9yZXNwb25zZSgpIHsKKyBzdHJpbmcgaXAgPSBxdWVyeV9pcF9udW1iZXIocHJldmlvdXNfb2JqZWN0KCkpOworIG1hcHBpbmcgbGRhdGE7CisgaWYgKHN0cmluZ3AoaXApKSB7CisgICAgIC8vIFZvbGxlbiBEYXRlbnNhdHogYWxsZSAoIkNSQVdMIERFTEFZIiAvIDIpIGgsIGRhaGVyICogMTgwMC4KKyAgIGlmIChwZWVyc1tpcF0gPiAodGltZSgpIC0gKHRvX2ludChkYXRhWyJDUkFXTCBERUxBWSJdKSB8fCAxKSAqIDE4MDApKSB7CisgICAgICAgLy8gdGhpcyBwZWVycyBhc2tzIHRvIG9mdGVuIGFuZCBnZXRzIG9ubHkgdGhlIG1pbmltYWwgZGF0YXNldAorICAgICAgIGxkYXRhID0gbWluZGF0YTsKKyAgIH0KKyAgIGVsc2UgeworICAgICAgIGxkYXRhID0gZGF0YTsKKyAgICAgICBwZWVyc1tpcF0gPSB0aW1lKCk7IC8vIHJlY29yZCB0aW1lc3RhbXAKKyAgIH0KKyB9CisgZWxzZQorICAgICBsZGF0YSA9IGRhdGE7CisKKyAvKiBkYXRhWyJXSE8iXSA9IGltcGxvZGUobWFwKGZpbHRlcih1c2VycygpLCAKKyAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBzdGF0dXMgKG9iamVjdCBvKQorICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuICFvLT5RdWVyeVByb3AoUF9JTlZJUyk7IH0gKSwKKyAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gc3RyaW5nIChvYmplY3QgbykKKyAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gY2FwaXRhbGl6ZShvLT5xdWVyeV9yZWFsX25hbWUoKSk7IH0gKSwKKyAgICAgICAgICAgICAgICAgICJcdCIgKTsKKyAgKi8KKyAgbGRhdGFbIlBMQVlFUlMiXSA9IHRvX3N0cmluZyhzaXplb2YodXNlcnMoKSktMSk7CisKKyAgc3RyaW5nIHJlcGx5ID0gIlxyXG5NU1NQLVJFUExZLVNUQVJUXHJcbiI7CisKKyAgZm9yZWFjaChzdHJpbmcga2V5LCBzdHJpbmcgdmFsdWU6IGxkYXRhKSB7CisgICAgcmVwbHkgKz0ga2V5ICsgIlx0IiArIHZhbHVlICsgIlxyXG4iOworICB9CisKKyAgcmVwbHkgKz0gIk1TU1AtUkVQTFktRU5EXHJcbiI7CisgIHdyaXRlKHJlcGx5KTsKK30KKworcHVibGljIHN0cmluZyBnZXRfdGVsbmVnc19zdHIoKSB7CisgIHN0cmluZyBpcCA9IHF1ZXJ5X2lwX251bWJlcihwcmV2aW91c19vYmplY3QoKSk7CisgIHN0cmluZyByZXM7CisKKyAgaWYgKHN0cmluZ3AoaXApKSB7CisgICAgLy8gVm9sbGVuIERhdGVuc2F0eiBhbGxlICgiQ1JBV0wgREVMQVkiIC8gMikgaCwgZGFoZXIgKiAxODAwLgorICAgIGlmIChwZWVyc1tpcF0gPiAodGltZSgpIC0gKHRvX2ludChkYXRhWyJDUkFXTCBERUxBWSJdKSB8fCAxKSAqIDE4MDApKSB7CisgICAgICAgLy8gdGhpcyBwZWVycyBhc2tzIHRvIG9mdGVuIGFuZCBnZXRzIG9ubHkgdGhlIG1pbmltYWwgZGF0YXNldAorICAgICAgIHJlcyA9IHRuX3Jlc3VsdF9taW47CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXMgPSB0bl9yZXN1bHQ7CisgICAgICAgIHBlZXJzW2lwXSA9IHRpbWUoKTsgLy8gcmVjb3JkIHRpbWVzdGFtcAorICAgIH0KKyAgfQorICBlbHNlCisgICAgcmVzID0gdG5fcmVzdWx0OworCisgIHJlcyArPSBjb252ZXJ0X3RuKCAoWyJQTEFZRVJTIjogdG9fc3RyaW5nKHNpemVvZih1c2VycygpKS0xKSBdKSApOworICAgCisgIHJldHVybiByZXM7Cit9CisKZGlmZiAtLWdpdCBhL3NlY3VyZS9taXNjL3R3aXR0ZXIuYyBiL3NlY3VyZS9taXNjL3R3aXR0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzQ1MTllCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL21pc2MvdHdpdHRlci5jCkBAIC0wLDAgKzEsMTMxIEBACisvKiBydW1hdGFzIHR3aXR0ZXIgY2xpZW50LCBzZW5kZXQgdGV4dAorICogYW4gZWluZW4gdHdpdHRlcnByb3h5cHJvemVzcywgZGVyIHNpZSBkYW5uIGFuIHR3aXR0ZXIKKyAqIHdlaXRlcnNjaGlja3QuCisgKgorICogdmVyc2lvbiAyCisgKiBtaXQgcGVyc2lzdGVudGVyIHZlcmJpbmR1bmcgenVtIHByb3h5IHVuZCBpbnB1dC1jaGFubmVsCisgKgorICogMjUuNS4yMDE2IHJ1bWF0YUBtZy5tdWQuZGUKKyAqLworCisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8ZGFlbW9uL2NoYW5uZWwuaD4KKworI2RlZmluZSBIT1NUICIxMjcuMC4wLjEiCisjZGVmaW5lIFBPUlQgNDkxMQorCisjZGVmaW5lIERFQlVHKHgpIHRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJydW1hdGEiKSx4KyJcbiIpCisKK3ZvaWQgY3JlYXRlKCkgeworCWlmKCBjbG9uZXAoKSApIHJldHVybjsKKwlzZXRldWlkKGdldHVpZCgpKTsKK30KKworb2JqZWN0IGNhbGxlcjsKK3N0cmluZyBtc2didWY7CisKK21hcHBpbmcgcmVnaXN0ZXJlZCA9IChbCisJInJ1bWF0YSI6ICJydSIsCisJImFyYXRob3JuIjogImFyYSIsCisJImFyayI6ICJhcmsiLAorCSJ6ZXNzdHJhIjogInplIiwKKwkiem9vayI6ICJ6byIsCisJImh1bW5pIjogImh1IiwKKwkibWlyaWwiOiAibWkiLAorCSJnbG9pbnNvbiI6ICJnbCIKK10pOworCitpbnQgYWxsb3dlZCgpIHsKKwlyZXR1cm4gSVNfQVJDSCh0aGlzX3BsYXllcigpKSB8fCBnZXR1aWQodGhpc19wbGF5ZXIoKSk9PSJnbG9pbnNvbiI7Cit9CisKK3N0cmluZyBzaWcoIG9iamVjdCBwbCApIHsKKwlzdHJpbmcgdWlkID0gZ2V0dWlkKHBsKTsKKwlpZiggIXVpZCApIHJldHVybiAiPz8iOworCXN0cmluZyBhYmJyID0gcmVnaXN0ZXJlZFt1aWRdOworCWlmKCAhYWJiciApIHJldHVybiB1aWQ7CisJcmV0dXJuIGFiYnI7Cit9CisKK3ZvaWQgZW1pdCggc3RyaW5nIG1zZyApIHsKKwlDSE1BU1RFUi0+c2VuZCgidHdpdHRlciIsdGhpc19vYmplY3QoKSxtc2csTVNHX1NBWSk7CisJLyoKKwlmb3JlYWNoKCBzdHJpbmcgdWlkOiBtX2luZGljZXMocmVnaXN0ZXJlZCkgKSB7CisJCW9iamVjdCBwbCA9IGZpbmRfcGxheWVyKHVpZCk7CisJCWlmKCBwbCApIHRlbGxfb2JqZWN0KHBsLG1zZyk7CisJfSovCit9CisKKy8qIE9mZml6aWVsbGUgQVBJIGZ1bmt0aW9uCisgKiB4ZXZhbCAiL3NlY3VyZS9taXNjL3R3aXR0ZXIiLT50d2l0dGVyKCJAX3plc3N0cmFfIHdlbGNvbWUgYmFjayIpCisgKi8KK3ZvaWQgdHdpdHRlcihzdHJpbmcgbXNnKSB7CisJaW50IGVyciA9IDA7CisJaWYoICFhbGxvd2VkKCkgKSB7CisJCXdyaXRlKCAiVHdpdHRlciBpc3QgQVJDSCtHbG9pbnNvbiBvbmx5LlxuIiApOworCQlyZXR1cm47CisJfQorCW1zZyA9IG1zZyArICJeIiArIHNpZyh0aGlzX3BsYXllcigpKSArICJcbiI7CisJaWYoaW50ZXJhY3RpdmUodGhpc19vYmplY3QoKSkpIHsKKwkJdGVsbF9vYmplY3QodGhpc19vYmplY3QoKSxtc2cpOworCX0gZWxzZSB7CisJCW1zZ2J1ZiA9IG1zZzsKKwkJY2FsbGVyID0gdGhpc19wbGF5ZXIoKTsKKwkJaWYoIChlcnI9bmV0X2Nvbm5lY3QoSE9TVCxQT1JUKSkhPTAgKSB7CisJCQl3cml0ZSggIktvbm50ZSBUd2VldCBuaWNodCBzZW5kZW4uIGVycj0iK2VycisiXG4iICk7CisJCX0KKwl9Cit9CisKKy8vIHNvbmRlcmZ1bmt0aW9uIGZ1ZXIgZGVuIGZhbGwsIGRhc3MgbWFuIGRpZSB2ZXJiaW5kdW5nCisvLyBhdWZiYXVlbiB3aWxsLCBvaG5lIGRhc3MgZXR3YXMgYXVmIHR3aXR0ZXIgZXJzY2hlaW50Cit2b2lkIGNvbm5lY3QoKSB7CisJaW50IGVyciA9IDA7CisJaWYoIGludGVyYWN0aXZlKHRoaXNfb2JqZWN0KCkpICkgcmV0dXJuOworCW1zZ2J1ZiA9ICIiOworCWNhbGxlciA9IHRoaXNfcGxheWVyKCk7CisJaWYoIChlcnI9bmV0X2Nvbm5lY3QoSE9TVCxQT1JUKSkhPTAgKSB7CisJCXdyaXRlKCAiS29ubnRlIFR3ZWV0IG5pY2h0IGNvbm5lY3RlZC4gZXJyPSIrZXJyKyJcbiIgKTsKKwl9Cit9CisKK3ZhcmFyZ3Mgdm9pZCBsb2dvbihpbnQgZmxhZykgeworCWlmKCBmbGFnPDAgKSB7CisJCXRlbGxfb2JqZWN0KGNhbGxlciwiVHdpdHRlcnByb3h5IGFudHdvcnRldCBuaWNodD9cbiIpOworICB9IGVsc2UgeworCQllbmFibGVfY29tbWFuZHMoKTsKKwkJYWRkX2FjdGlvbigiaW5wdXQiLCIiLDEpOworCQl3cml0ZShtc2didWYpOworCQlpZiggbXNnYnVmIT0iIiApIGVtaXQoIG1zZ2J1ZiApOworCQkvLyIvc2VjdXJlL21hc3RlciItPmRpc2Nvbm5lY3QodGhpc19vYmplY3QoKSk7CisJfQorfQorCit2b2lkIE5ldERlYWQoKSB7CisJZGlzYWJsZV9jb21tYW5kcygpOworfQorCitzdHJpbmcgcXVlcnlfcmVhbF9uYW1lKCkgeworCXJldHVybiAiKFR3aXR0ZXIpIjsKK30KKwordmFyYXJncyBzdHJpbmcgTmFtZSggaW50IGNhc3VzLCBpbnQgZGVtb24gKSB7CisJcmV0dXJuICJUd2l0dGVyIjsKK30KKworLy8gZGF0ZW4gd2VyZGVuIHZpYSB0ZWxsX29iamVjdCBhbiBkaWVzZXMgb2JqZWt0IGdlc2VuZGV0CisvLyB1bmQgZGFubiBuYWNoIGF1c3NlbiB3ZWl0ZXJnZWJlbgordm9pZCBjYXRjaF90ZWxsKCBzdHJpbmcgbXNnICkgeworCWlmKCBhbGxvd2VkKCkgJiYgaW50ZXJhY3RpdmUodGhpc19vYmplY3QoKSkgKSB7CisJCXdyaXRlKCBtc2cgKTsKKwl9Cit9CisKKy8vIGhpZXIgbGFuZGVuIGRhdGVuIHZvbiBhdXNzZW4KK2ludCBpbnB1dCggc3RyaW5nIHMgKSB7CisJc3RyaW5nIG1zZyA9IHF1ZXJ5X3ZlcmIoKTsKKwlpZiggcyApIG1zZyA9IG1zZyArICIgIiArIHM7CisJZW1pdCggbXNnICk7IC8vIlR3aXR0ZXIgdGVpbHQgZGlyIG1pdDogIittc2crIlxuIiApOworCXJldHVybiAxOworfQorCmRpZmYgLS1naXQgYS9zZWN1cmUvbmV3cy5jIGIvc2VjdXJlL25ld3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTFjODg3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL25ld3MuYwpAQCAtMCwwICsxLDU2NiBAQAorLy8gMTguRGV6ICAxOTk2IC0gTG9jb0BNb3JnZW5ncmF1ZW4KKy8vIDguIEZlYiAgMTk5NSAtIEpvZkBNb3JnZW5HcmF1ZW4KKy8vIDUuIEp1bGkgMTk5MiAtIEpvZkBNb3JnZW5HcmF1ZW4KKy8vIDYuIEp1bGkgMTk5MiAtIEpvZkBNb3JnZW5HcmF1ZW4KKy8vIENsZWFyLUdyb3Vwcy1NZWNoYW5pc211cyBlaW5nZWJhdXQuIERpZSAyIEtvbnN0YW50ZW4gVElNRV9UT19DTEVBUiB1bmQKKy8vIE1JTl9UT1VDSEVEIG11ZXNzZW4gZGVmLiBzZWluLiBBbGxlIFRJTUVfVE9fQ0xFQVIgU2VrdW5kZW4gd2VyZGVuIGRpZQorLy8gTmV3c2dyb3VwcywgZGllIHNlaXQgZGVtIGxldHp0ZW4gQ2xlYXIgc2VsdGVuZXIgYWxzIE1JTl9UT1VDSEVEIFNla3VuZGVuCisvLyBiZXJ1ZWhydCB3dXJkZW4sIGF1cyBkZW0gQ2FjaGUgZ2Vub21tZW4KKworLy8gMS4gRmVicnVhciAxOTk1IC0gSm9mQE1vcmdlbkdyYXVlbgorLy8gUmV3cml0ZSAoTWFwcGluZ3MgYmVudXR6ZW4sIEFjY2Vzc2luZm9zIGltIFNwZWljaGVyIGhhbHRlbikKKworCisvLyBEYXRlbnN0cnVrdHVyZW46CisKKy8vIE5ld3Nncm91cHM6ICBncm91cGxpc3QgaXN0IGVpbiBNYXBwaW5nIG1pdCBlaW5lbSBFaW50cmFnIHBybyBOZXdzZ3JvdXAuCisvLyAgICAgICAgICAgICAgRGllIEtleXMgc2luZCBkaWUgR3J1cHBlbm5hbWVuLCBEYXRlbjoKKy8vICAgICAgICAgICAgICAwIFplaXQgZGVzIGxldHplbiBBcnRpa2VscworLy8gICAgICAgICAgICAgIDEgQmVzaXR6ZXIgZGVyIEdydXBwZQorLy8gICAgICAgICAgICAgIDIgU2F2ZWZpbGxlLU5hbWUKKy8vICAgICAgICAgICAgICAzIEV4cGlyZS1aZWl0CisvLyAgICAgICAgICAgICAgNCBBcnJheSBtaXQgTG9lc2NoLUJlcmVjaHRpZ3RlbgorLy8gICAgICAgICAgICAgIDUgQXJyYXkgbWl0IFNjaGVpYi1CZXJlY2h0aWd0ZW4KKy8vICAgICAgICAgICAgICA2IEFycmF5IG1pdCBMZXNlYmVyZWNodGlndGVuCisvLyAgICAgICAgICAgICAgNyBNaW5kZXN0LUxldmVsLCB1bSBBcnRpa2VsIHp1IGxvZXNjaGVuCisvLyAgICAgICAgICAgICAgOCBNaW5kZXN0LUxldmVsLCB1bSBBcnRpa2VsIHp1IHBvc3RlbgorLy8gICAgICAgICAgICAgIDkgTWluZGVzdC1MZXZlbCwgdW0gQXJ0aWtlbCB6dSBsZXNlbgorLy8gICAgICAgICAgICAgMTAgTWF4LiBBbnphaGwgTmFjaHJpY2h0ZW4gaW4gZGVyIEdydXBwZQorCisvLyBEaWUgTmFjaHJpY2h0ZW4gc2VsYmVyIHN0ZWhlbiBpbiBlaW5lbSBBcnJheS4KKworLy8gRWluZSBuYWNocmljaHQgaXN0IGVpbiBBcnJheSBtaXQgZGVuIGZvbGdlbmRlbiBFbGVtZW50ZW46CisvLyAwICAgICAgICAgKCopIHN0cmluZyB3cml0ZXI7CisvLyAxICAgICAgICAgKCopIHN0cmluZyBpZDsgICAgTXVkbmFtZSsiOiIrdGltZSgpKyI6Iitncm91cCB6dXIgWmVpdAorLy8gMiAgICAgICAgICgqKSBzdHJpbmcgdGltZTsKKy8vIDMgICAgICAgICAgICAgc3RyaW5nIHRpdGxlOworLy8gNCAgICAgICAgICAgICBzdHJpbmcgbWVzc2FnZTsKKworLy8gRGllIG1pdCAoKikgZ2VrZW5uemVpY2huZXRlbiBFaW50cmFlZ2Ugc2V0enQgZGVyIERhZW1vbiBzZWxiZXIKKworLy8gRnVua3Rpb25lbjoKKy8vICAgIFJldHVybnZhbHVlczogIDAgPSBQYXJhbWV0ZXIgZXJyb3IKKy8vICAgICAgICAgICAgICAgICAgIDEgPSBPay4KKy8vICAgICAgICAgICAgICAgICAgLTEgPSBubyBwZXJtaXNzaW9uCisvLyAgICAgICAgICAgICAgICAgIC0yID0gbm8gc3VjaCBncm91cC9ncm91cCBhbHJlYWR5IGV4aXN0aW5nCisvLworLy8gICAgRGllc2UgUmV0dXJudmFsdWVzIHN0ZWhlbiBmdWVyIGFsbGUgRnVua3Rpb25lbgorCisvLyAgQWRkR3JvdXAoZ3JvdXBuYW1lLCBvd25lciwgc2F2ZWZpbGUpOworLy8gICBGdW5rdGlvbiBrbGFyLCBrYW5uIG51ciB2b24gRXJ6bWFnaWVybiBhdWZnZXJ1ZmVuIHdlcmRlbgorLy8gICAgLTMgPSBubyBvd25lciwgLTQgPSBzYXZlZmlsZSBhbHJlYWR5IGluIHVzZQorLy8KKy8vICBSZW1vdmVHcm91cChncm91cG5hbWUpOworLy8gICBFYmVuZmFsbHMgbnVyIGZ1ZXIgRXJ6bWFnaWVyCisvLworLy8gIFNldEdyb3VwKGdyb3VwbmFtZSwgZGxldmVsLCB3bGV2ZWwsIHJsZXZlbCwgbWF4bWVzc2FnZXMsIGV4cGlyZSk7CisvLyAgIEVyem1hZ2llciB1bmQgZGVyIEdyb3Vwb3duZXIga29lbm5lbiBkaWUgbnV0emVuLiBMZWd0IExldmVsLCBhYiBkZW0gamUtCisvLyAgIG1hbmQgYXVzIGRlciBHcnVwcGUgbG9lc2NoZW4ga2FubiAoZGxldmVsKSwgaW4gZGllIEdydXBwZSBzY2hyZWliZW4KKy8vICAga2FubiAod2xldmVsKSwgZGllIEdydXBwZSBsZXNlbiBrYW5uIChybGV2ZWwpIHVuZCBkaWUgbWF4LiBBbnphaGwgTmFjaC0KKy8vICAgcmljaHRlbiBpbiBkZXIgR3J1cHBlIGZlc3QuCisvLworLy8gIEFkZEFsbG93ZWQoZ3JvdXBuYW1lLCBkZWxldGVycywgd3JpdGVycywgcmVhZGVycyk7CisvLyAgIEVyem1hZ2llci9Pd25lciBrb2VubmVuIEFycmF5cyBtaXQgTmFtZW4gdm9uIGZ1ZXIgZGllIEdydXBwZSBsb2VzY2gvCisvLyAgIHNjaHJlaWIvbGVzZS1CZXJlY2h0aWd0ZW4gZnVlciBkaWUgR3J1cHBlIGFuZ2ViZW4uCisvLworLy8gIFJlbW92ZUFsbG93ZWQoZ3JvdXBuYW1lLCBkZWxldGVycywgd3JpdGVycywgcmVhZGVycyk7ICBhbmFsb2cKKy8vCisvLyAgV3JpdGVOb3RlKG1lc3NhZ2UpOyBrbGFyCisvLyAgIC0zID0gTWF4IG51bWJlciBvZiBtc2dzIGV4Y2VlZGVkCisvLworLy8gIFJlbW92ZU5vdGUoYm9hcmRuYW1lLCBub3RlbnVtbWVyKTsgbm90ZW51bW1lcj49MDsKKy8vICAgLTMgPSBObyBzdWNoIG5vdGUKKy8vCisvLyAgR2V0Tm90ZXMoYm9hcmRuYW1lKTsgZ2lidCBlaW5lbiBBcnJheSBtaXQgZGVuIE5vdGVzIHp1cnVlY2suCisvLworLy8gIEFza0FsbG93ZWRXcml0ZSgpOyByZXR1cm4gd2llIGJlaSBXcml0ZU5vdGUsIHN0ZWxsdCBmZXN0LCBvYiBlaW4gUGxheWVyCisvLyAgZWluZSBOb3RlIGF1ZmhhZW5nZW4gZGFyZiBvZGVyIG5pY2h0CisvLworLy8gIEdldE5ld3NUaW1lKFtib2FyZG5hbWVdKTsgZ2lidCB6dXJ1ZWNrLCB3YW5uIGFtIGVudHNwcmVjaGVuZGVuIEJyZXR0IHp1bQorLy8gIGxldHp0ZW4gTWFsIGVpbmUgTm90ZSBiZWZlc3RpZ3Qgd3VyZGUuIEZhbGxzIGtlaW4gYm9hcmRuYW1lIGFuZ2VnZWJlbgorLy8gIHdpcmQsIGxpZWZlcnQgR2V0TmV3c1RpbWUoKSBkZW4gWmVpdHB1bmt0LCB6dSBkZW0gdWViZXJoYXVwdCBlaW5lIG5ldWUKKy8vICBOb3RlIGF1ZmdlaGFlbmd0IHd1cmRlLgorLy8KKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIG5vX3NoYWRvdworI3ByYWdtYSBub19pbmhlcml0CisjcHJhZ21hIHZlcmJvc2VfZXJyb3JzCisjcHJhZ21hIGNvbWJpbmVfc3RyaW5ncworLy8jcHJhZ21hIHBlZGFudGljCisvLyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgd2Fybl9kZXByZWNhdGVkCisKKyNpbmNsdWRlICIvc2VjdXJlL3dpemxldmVscy5oIgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxuZXdzLmg+CisKKyNkZWZpbmUgV1RJTUUgMAorCitwcml2YXRlIGludCBzZWN1cml0eSggc3RyaW5nIG5hbWUgKTsKKworbWl4ZWQgc2F2ZWxvYWQ7IC8vIERpZXNlIFZhcmlhYmxlIGlzdCBhbHMgZWluemlnZSBuaWNodCBub3NhdmUgaXN0IHVuZCBkaWVudAorICAgICAgICAgICAgICAgICAvLyBVZWJlcnRyYWdlbiB2b24gRGF0ZW4gaW4vYXVzIHNhdmVmaWxlcworCitub3NhdmUgbWFwcGluZyBncm91cGxpc3Q7IC8vIEdyb3VwcyB1bmQgaWhyZSBzYXZlLUZpbGVzLCB6dWRlbSBMYXN0VGltZQorbm9zYXZlIGludCBsYXN0dGltZTsgLy8gVW0genUgdmVybWVpZGVuLCBkYXNzIDIgTm90ZXMgaWRlbnRpc2NoZSBVaHJ6ZWl0PT1pZAorICAgICAgICAgICAgICAgICAgICAgLy8gaGFiZW4sIHdpcmQgZGllIGpld2VpbHMgbGV0enRlIFplaXQgZ2VzcGVpY2hlcnQuCisKK25vc2F2ZSBtYXBwaW5nIGNhY2hlID0gKFtdKTsgLy8gY2FjaGUgZnVlciBkaWUgR3J1cHBlbmluaGFsdGUKKwordm9pZCBjcmVhdGUoKSB7CisgIHNldGV1aWQoZ2V0dWlkKHRoaXNfb2JqZWN0KCkpKTsKKyAgaWYgKCFyZXN0b3JlX29iamVjdChORVdTUEFUSCsiR3JvdXBMaXN0IikpCisgICAgZ3JvdXBsaXN0PW1fYWxsb2NhdGUoMCxHX01FU1NBR0VTKTsKKyAgZWxzZQorICAgIGdyb3VwbGlzdD1zYXZlbG9hZDsKKyAgLy8gZXJzdGVuIHJlc2V0IHNvYmFsZCB3aWUgbW9lZ2xpY2guIDstKQorICBzZXRfbmV4dF9yZXNldCgxKTsKK30KKworaW50IEFkZEdyb3VwKHN0cmluZyBuYW1lLCBzdHJpbmcgb3duZXIpCit7CisgIG1peGVkICpncm91cDsKKyAgc3RyaW5nIHNhdmVmaWxlLCAqc2F2ZWZpbGVhOworICBpbnQgaTsKKworICBpZiAoIW5hbWUgfHwgIW93bmVyKSByZXR1cm4gMDsKKyAgCisgIGlmICghQVJDSF9TRUNVUklUWSB8fCBwcm9jZXNzX2NhbGwoKSkgcmV0dXJuIC0xOyAvLyBEYXJmIG5pY2h0CisKKyAgaWYgKG1lbWJlcihncm91cGxpc3QsIG5hbWUpKSByZXR1cm4gLTI7IC8vIEdpYnQgZXMgc2Nob24KKworICBpZiAoZmlsZV9zaXplKCIvIitTQVZFUEFUSCtvd25lclswLi4wXSsiLyIrb3duZXIrIi5vIik8MCkgcmV0dXJuIC0zOworCisgIHNhdmVmaWxlYSA9IG9sZF9leHBsb2RlKG5hbWUsIi4iKTsKKyAgc2F2ZWZpbGUgPSBpbXBsb2RlKHNhdmVmaWxlYSwiLyIpOworICBpZiAoZmlsZV9zaXplKE5FV1NQQVRIK3NhdmVmaWxlKyIubyIpPj0wKSByZXR1cm4gLTQ7CisKKyAgLy8gTm90d2VuZGlnZSBEaXJlY3RvcmllcyBhbmxlZ2VuCisgIGZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc2F2ZWZpbGVhKS0xOyBpKyspIHsKKyAgICBta2RpcihORVdTUEFUSCtpbXBsb2RlKHNhdmVmaWxlYVswLi5pXSwiLyIpKTsKKyAgfQorCisgIGdyb3VwPSh7fSk7CisgIGdyb3VwbGlzdCs9KFtuYW1lOjA7b3duZXI7c2F2ZWZpbGU7LTE7KHt9KTsoe30pOyh7fSk7MjA7MDswOzgwXSk7CisgIHNhdmVfZ3JvdXBfbGlzdCgpOworICBzYXZlX2dyb3VwKG5hbWUsZ3JvdXApOworICByZXR1cm4gMTsKK30KKworaW50IFJlbW92ZUdyb3VwKHN0cmluZyBuYW1lKQoreworICBpbnQgbnVtOworCisgIGlmICghbmFtZSkgcmV0dXJuIDA7CisKKyAgaWYgKCFzZWN1cml0eShuYW1lKSB8fCBwcm9jZXNzX2NhbGwoKSkgcmV0dXJuIC0xOyAvLyBEYXJmIG5pY2h0CisKKyAgaWYgKCFtYXBwaW5ncChncm91cGxpc3QpIHx8ICFtZW1iZXIoZ3JvdXBsaXN0LG5hbWUpKQorICAgIHJldHVybiAtMjsgLy8gLTIgbm8gc3VjaCBncm91cAorCisgIGNhdGNoKHJtKE5FV1NQQVRIK2dyb3VwbGlzdFtuYW1lLEdfU0FWRUZJTEVdKyIubyIpO3B1Ymxpc2gpOworICBtX2RlbGV0ZShncm91cGxpc3QsbmFtZSk7CisKKyAgc2F2ZV9ncm91cF9saXN0KCk7CisKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBTZXRHcm91cChzdHJpbmcgbmFtZSxpbnQgZGxldmVsLGludCAgICAgICAgd2xldmVsLGludCBybGV2ZWwsaW50IG1heG1lc3NhZ2VzLGludCBleHBpcmUpCit7CisgIG1peGVkICpncm91cDsKKyAgCisgIGlmICghbWVtYmVyKGdyb3VwbGlzdCxuYW1lKSkgcmV0dXJuIC0yOworICBpZiAoZ3JvdXBsaXN0W25hbWUsR19PV05FUl0hPXVzZXJfZXVpZCgpICYmCisgICAgICAoIXNlY3VyaXR5KG5hbWUpIHx8IHByb2Nlc3NfY2FsbCgpKSkgcmV0dXJuIC0xOworICAKKyAgZ3JvdXBsaXN0W25hbWUsR19ETEVWRUxdPWRsZXZlbDsKKyAgZ3JvdXBsaXN0W25hbWUsR19XTEVWRUxdPXdsZXZlbDsKKyAgZ3JvdXBsaXN0W25hbWUsR19STEVWRUxdPXJsZXZlbDsKKyAgZ3JvdXBsaXN0W25hbWUsR19NQVhfTVNHXT1tYXhtZXNzYWdlczsKKyAgZ3JvdXBsaXN0W25hbWUsR19FWFBJUkVdPWV4cGlyZTsKKyAgCisgIHNhdmVfZ3JvdXBfbGlzdCgpOworICByZXR1cm4gMTsKK30KKworaW50IEFkZEFsbG93ZWQoc3RyaW5nIG5hbWUsbWl4ZWQgZGVsZXRlcnMsbWl4ZWQgd3JpdGVycyxtaXhlZCByZWFkZXJzKQoreworICBtaXhlZCAqZ3JvdXA7CisKKyAgaWYgKCFtZW1iZXIoZ3JvdXBsaXN0LG5hbWUpKSByZXR1cm4gLTI7CisKKyAgaWYgKCBncm91cGxpc3RbbmFtZSxHX09XTkVSXSE9dXNlcl9ldWlkKCkgJiYKKyAgICAgICAoIXNlY3VyaXR5KG5hbWUpIHx8IHByb2Nlc3NfY2FsbCgpKSAmJiB1c2VyX2V1aWQoKSAhPSBST09USUQgKQorICAgICAgcmV0dXJuIC0xOworCisgIGlmIChzdHJpbmdwKGRlbGV0ZXJzKSkgZGVsZXRlcnM9KHtkZWxldGVyc30pOworICBpZiAoc3RyaW5ncCh3cml0ZXJzKSkgd3JpdGVycz0oe3dyaXRlcnN9KTsKKyAgaWYgKHN0cmluZ3AocmVhZGVycykpIHJlYWRlcnM9KHtyZWFkZXJzfSk7CisKKyAgaWYgKCFkZWxldGVycykgZGVsZXRlcnM9KHt9KTsKKyAgaWYgKCF3cml0ZXJzKSB3cml0ZXJzPSh7fSk7CisgIGlmICghcmVhZGVycykgcmVhZGVycz0oe30pOworCisgIGdyb3VwbGlzdFtuYW1lLEdfREVMRVRFUlNdKz1kZWxldGVyczsKKyAgZ3JvdXBsaXN0W25hbWUsR19XUklURVJTXSs9d3JpdGVyczsKKyAgZ3JvdXBsaXN0W25hbWUsR19SRUFERVJTXSs9cmVhZGVyczsKKyAgICAgICAgCisgIHNhdmVfZ3JvdXBfbGlzdCgpOworICByZXR1cm4gMTsKK30KKworaW50IFJlbW92ZUFsbG93ZWQoc3RyaW5nIG5hbWUsbWl4ZWQgZGVsZXRlcnMsbWl4ZWQgd3JpdGVycyxtaXhlZCByZWFkZXJzKQoreworICBtaXhlZCAqZ3JvdXA7CisKKyAgaWYgKCFtZW1iZXIoZ3JvdXBsaXN0LG5hbWUpKSByZXR1cm4gLTI7CisKKyAgaWYgKGdyb3VwbGlzdFtuYW1lLEdfT1dORVJdIT11c2VyX2V1aWQoKSAmJgorICAgICAgKCFzZWN1cml0eShuYW1lKSB8fCBwcm9jZXNzX2NhbGwoKSkgJiYgdXNlcl9ldWlkKCkgIT0gUk9PVElEICkKKyAgICAgIHJldHVybiAtMTsKKworICBpZiAoc3RyaW5ncChkZWxldGVycykpIGRlbGV0ZXJzPSh7ZGVsZXRlcnN9KTsKKyAgaWYgKHN0cmluZ3Aod3JpdGVycykpIHdyaXRlcnM9KHt3cml0ZXJzfSk7CisgIGlmIChzdHJpbmdwKHJlYWRlcnMpKSByZWFkZXJzPSh7cmVhZGVyc30pOworCisgIGlmICghZGVsZXRlcnMpIGRlbGV0ZXJzPSh7fSk7CisgIGlmICghd3JpdGVycykgd3JpdGVycz0oe30pOworICBpZiAoIXJlYWRlcnMpIHJlYWRlcnM9KHt9KTsKKworICBncm91cGxpc3RbbmFtZSxHX0RFTEVURVJTXS09ZGVsZXRlcnM7CisgIGdyb3VwbGlzdFtuYW1lLEdfV1JJVEVSU10tPXdyaXRlcnM7CisgIGdyb3VwbGlzdFtuYW1lLEdfUkVBREVSU10tPXJlYWRlcnM7CisKKyAgc2F2ZV9ncm91cF9saXN0KCk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgc3RyaW5nIHVzZXJfZXVpZCgpCit7CisgIGlmIChwcmV2aW91c19vYmplY3QoKSkgeworICAgICBpZiAoZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSk9PVJPT1RJRCkgICAgICAgcmV0dXJuIFJPT1RJRDsKKyAgICAgaWYgKGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpPT0icC5kYWVtb24iKSAgIHJldHVybiAicC5kYWVtb24iOworICAgICBpZiAobG9hZF9uYW1lKHByZXZpb3VzX29iamVjdCgpKT09Ii9vYmovbXBhIikgcmV0dXJuIGdldGV1aWQoUlBMKTsKKyAgfQorICByZXR1cm4gc2VjdXJlX2V1aWQoKTsKK30KKworI2RlZmluZSBGX0RFTEVURSAgICAwCisjZGVmaW5lIEZfUkVBRCAgICAgIDEKKyNkZWZpbmUgRl9XUklURSAgICAgMgorI2RlZmluZSBGX0FETUlOICAgICAzCisjZGVmaW5lIEZfS0VFUE5BTUUgIDQKKworcHJpdmF0ZSBpbnQgc2VjdXJpdHkoIHN0cmluZyBuYW1lICkKK3sKKyAgICBpZiAoIGdyb3VwbGlzdFtuYW1lLEdfRExFVkVMXSA+PSBBUkNIX0xWTAorICAgICAgICAgfHwgZ3JvdXBsaXN0W25hbWUsR19XTEVWRUxdID49IEFSQ0hfTFZMCisgICAgICAgICB8fCBncm91cGxpc3RbbmFtZSxHX1JMRVZFTF0gPj0gQVJDSF9MVkwgKQorICAgICAgICByZXR1cm4gQVJDSF9TRUNVUklUWTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBFTERFUl9TRUNVUklUWTsKK30KKworc3RhdGljIGludCBhbGxvd2VkKHN0cmluZyBuYW1lLCBpbnQgbW9kZSkKK3sKKyAgc3RyaW5nIGV1aWQ7CisgIG1peGVkIGdfbGV2ZWwsIGdfbW9kZTsKKyAgCisgIGlmIChwcm9jZXNzX2NhbGwoKSkgcmV0dXJuIDA7CisKKyAgZXVpZD11c2VyX2V1aWQoKTsKKworICBpZiAoZXVpZD09Uk9PVElEKSByZXR1cm4gMTsKKworICBzd2l0Y2gobW9kZSkgeworICAgIGNhc2UgRl9LRUVQTkFNRTogcmV0dXJuIChldWlkPT0icC5kYWVtb24iKTsKKyAgICBjYXNlIEZfV1JJVEU6ICAgIGlmIChldWlkPT0icC5kYWVtb24iKSByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICAgICAgIGdfbGV2ZWw9R19XTEVWRUw7IGdfbW9kZT1HX1dSSVRFUlM7ICBicmVhazsKKyAgICBjYXNlIEZfQURNSU46ICAgIGlmICghKHNlY3VyaXR5KG5hbWUpfHxncm91cGxpc3RbbmFtZSxHX09XTkVSXT09ZXVpZCkpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgIGdfbGV2ZWw9R19ETEVWRUw7IGdfbW9kZT1HX0RFTEVURVJTOyBicmVhazsKKyAgICBjYXNlIEZfREVMRVRFOiAgIGlmIChldWlkPT0icC5kYWVtb24iKSByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICAgICAgIGdfbGV2ZWw9R19ETEVWRUw7IGdfbW9kZT1HX0RFTEVURVJTOyBicmVhazsKKyAgICBjYXNlIEZfUkVBRDogICAgIGdfbGV2ZWw9R19STEVWRUw7IGdfbW9kZT1HX1JFQURFUlM7ICBicmVhazsKKyAgICBkZWZhdWx0OiAgICAgICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKGdyb3VwbGlzdFtuYW1lLEdfT1dORVJdICE9IGV1aWQgJiYgIUFSQ0hfU0VDVVJJVFkgJiYKKyAgICAgIGdyb3VwbGlzdFtuYW1lLGdfbGV2ZWxdID4gcXVlcnlfd2l6X2xldmVsKGV1aWQpICYmCisgICAgICBtZW1iZXIoZ3JvdXBsaXN0W25hbWUsIGdfbW9kZV0sIGV1aWQpPT0tMSkKKyAgICByZXR1cm4gMDsgLy8gTm8gc3VjaCBncm91cCBmb3IgdGhlIHJlcXVlc3RvciA6KQorICByZXR1cm4gMTsKK30KKworaW50IFdyaXRlTm90ZShtaXhlZCBtZXNzYWdlLG1peGVkIGtlZXBuYW1lKQoreworICBtaXhlZCAqZ3JvdXA7CisgIGludCB1aWRvayx0bXA7CisgIHN0cmluZyBuYW1lOworCisgIGlmICghcG9pbnRlcnAobWVzc2FnZSkgfHwgc2l6ZW9mKG1lc3NhZ2UpIT02KSByZXR1cm4gMDsKKworICBpZiAoIXBvaW50ZXJwKGdyb3VwPWxvYWRfZ3JvdXAobmFtZT1tZXNzYWdlW01fQk9BUkRdKSkpIHJldHVybiAtMjsKKworICBpZiAoIWFsbG93ZWQobmFtZSwgRl9XUklURSkpIHJldHVybiAtMTsKKworICBpZiAoc2l6ZW9mKGdyb3VwKT49Z3JvdXBsaXN0W25hbWUsR19NQVhfTVNHXSkgcmV0dXJuIC0zOworCisgIGlmICgha2VlcG5hbWUgfHwgIWFsbG93ZWQobmFtZSwgRl9LRUVQTkFNRSkpCisgICAgIG1lc3NhZ2VbTV9XUklURVJdPWNhcGl0YWxpemUoZ2V0ZXVpZCh0aGlzX2ludGVyYWN0aXZlKCl8fHByZXZpb3VzX29iamVjdCgpKSk7CisKKyAgaWYgKGxhc3R0aW1lPj10aW1lKCkpIGxhc3R0aW1lKys7CisgICAgZWxzZSBsYXN0dGltZT10aW1lKCk7CisgIG1lc3NhZ2VbTV9USU1FXT1sYXN0dGltZTsKKyAgbWVzc2FnZVtNX0lEXT1NVUROQU1FKyI6IitsYXN0dGltZTsKKyAgZ3JvdXArPSh7bWVzc2FnZX0pOworICBncm91cGxpc3RbbmFtZSxXVElNRV09bGFzdHRpbWU7CisgIHNhdmVfZ3JvdXAobmFtZSxncm91cCk7CisgIHNhdmVfZ3JvdXBfbGlzdCgpOworICByZXR1cm4gMTsKK30KKworaW50IFJlbW92ZU5vdGUoc3RyaW5nIG5hbWUsIGludCBub3RlKQoreworICBpbnQgbnVtOworICBtaXhlZCAqZ3JvdXA7CisKKyAgaWYgKChub3RlPDApICYmIChuYW1lPT0iZHduZXdzIikpCisgIHsKKyAgICBncm91cD0oe30pOworICAgIGdyb3VwbGlzdFtuYW1lLFdUSU1FXT0wOworICAgIHNhdmVfZ3JvdXAobmFtZSxncm91cCk7CisgICAgc2F2ZV9ncm91cF9saXN0KCk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBpZiAobm90ZTwwKSByZXR1cm4gMDsKKworICBpZiAoIXBvaW50ZXJwKGdyb3VwPWxvYWRfZ3JvdXAobmFtZSkpKSByZXR1cm4gLTI7CisKKyAgaW50IGNvdW50PXNpemVvZihncm91cCk7CisgIGlmIChjb3VudDw9bm90ZSkKKyAgICByZXR1cm4gLTM7CisKKyAgaWYgKCFhbGxvd2VkKG5hbWUsIEZfREVMRVRFKSAmJgorICAgICAgbG93ZXJfY2FzZShncm91cFtub3RlXVtNX1dSSVRFUl0pIT11c2VyX2V1aWQoKSkgcmV0dXJuIC0xOworCisgIGlmIChjb3VudD09MSkKKyAgICBncm91cD0oe30pOworICBlbHNlIGlmICghbm90ZSkKKyAgICBncm91cCA9IGdyb3VwWzEuLl07CisgIGVsc2UgaWYgKG5vdGUgPT0gY291bnQtMSkKKyAgICBncm91cCA9IGdyb3VwWzAuLjwyXTsKKyAgZWxzZQorICAgIGdyb3VwPWdyb3VwWzAuLm5vdGUtMV0rZ3JvdXBbbm90ZSsxLi5dOworICAKKyAgaWYgKHNpemVvZihncm91cCkpCisgICAgZ3JvdXBsaXN0W25hbWUsV1RJTUVdPWdyb3VwWzwxXVtNX1RJTUVdOworICBlbHNlCisgICAgZ3JvdXBsaXN0W25hbWUsV1RJTUVdPTA7CisgIHNhdmVfZ3JvdXAobmFtZSxncm91cCk7CisgIHNhdmVfZ3JvdXBfbGlzdCgpOworICByZXR1cm4gMTsKK30KKworbWl4ZWQgR2V0Tm90ZXMoc3RyaW5nIG5hbWUpCit7CisgIG1peGVkICpncm91cDsKKyAgCisgIGlmICghcG9pbnRlcnAoZ3JvdXA9bG9hZF9ncm91cChuYW1lKSkpIHJldHVybiAtMjsKKyAgaWYgKCFhbGxvd2VkKG5hbWUsIEZfUkVBRCkpIHJldHVybiAtMjsKKyAgcmV0dXJuKGRlZXBfY29weShncm91cCkpOyAvLyBDT1BZIGl0Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfZmlsZShzdHJpbmcgZmlsZW5hbWUsbWl4ZWQgbmV3cykKK3sKKyAgaW50IGk7CisgIAorICBmb3IgKGk9MDtpPHNpemVvZihuZXdzKTtpKyspCisgICAgd3JpdGVfZmlsZShmaWxlbmFtZSxuZXdzW2ldW01fVElUTEVdKyIgKCIrbmV3c1tpXVtNX1dSSVRFUl0rIiwgIisKKyAgICAgICAgICAgICAgIGR0aW1lKG5ld3NbaV1bTV9USU1FXSlbNS4uMjZdKyIpOlxuIisKKyAgICAgICAgICAgICAgIG5ld3NbaV1bTV9NRVNTQUdFXSsiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cblxuIik7Cit9CisKK3Byb3RlY3RlZCB2YXJhcmdzIHZvaWQgZXhwaXJlKHN0cmluZyBncnAsaW50IGV0aW1lKQorLy8gZXRpbWUgaXN0IGFuZmFuZ3MgaW4gVGFnZW4gdW5kIGJlemVpY2huZXQgZGFzIG1heC4gQWx0ZXIsIHdhcyBBcnRpa2VsIGluCisvLyBkZXIgR3J1cHBlIGhhYmVuIGR1ZXJmZW4uCit7CisgIG1peGVkICpncm91cDsKKworICBpZiAoIXBvaW50ZXJwKGdyb3VwPWxvYWRfZ3JvdXAoZ3JwKSkpIHJldHVybjsKKyAgaWYgKGV0aW1lKQorICB7CisgICAgaWYgKGV0aW1lPjApCisgICAgICBldGltZT1ldGltZSo2MCo2MCoyNDsKKyAgfQorICBlbHNlCisgICAgZXRpbWU9Z3JvdXBsaXN0W2dycCxHX0VYUElSRV07IAorICBpZiAoZXRpbWU8PTApCisgICAgcmV0dXJuOworCisgIGludCB0b19leHBpcmU9dGltZSgpLWV0aW1lOworICBpbnQgc2l6ZT1zaXplb2YoZ3JvdXApOworICBpZiAoIXNpemUpIHJldHVybjsKKworICBpbnQgZmlyc3RfdG9fa2VlcCA9IHNpemU7ICAvLyBqYSwgaXN0IG5vY2ggZWlucyB6dSBob2NoCisgIC8vIHNvbGFuZ2UgcnVudGVybGF1ZmVuIGJpcyBtYW4gZWluIGVsZW1lbnQgZmluZGV0LCB3ZWxjaGVzIGdlbG9lc2NodCB3ZXJkZW4KKyAgLy8gc29sbC4gZmlyc3RfdG9fa2VlcCBibGVpYnQgZGFubiBlaW5zIGhvZWhlciBhbHMgZGFzLgorICB3aGlsZSAoIGZpcnN0X3RvX2tlZXAgJiYgZ3JvdXBbZmlyc3RfdG9fa2VlcC0xXVtNX1RJTUVdPnRvX2V4cGlyZSkKKyAgICAtLWZpcnN0X3RvX2tlZXA7CisgIC8vIGZpcnN0X3RvX2tlZXAga2FubiBqZXR6dCBhdWYgZWlucyBoaW50ZXIgZGVtIGxldHp0ZW4gRWxlbWVudCB6ZWlnZW4gKD09CisgIC8vIHNpemUpLiBEYXMgd2lyZCB1bnRlbiBiZXJ1ZWNrc2ljaHRpZ3QuCisKKyAgaWYgKCFmaXJzdF90b19rZWVwKSAvLyBhbGxlIGJlaGFsdGVuPworICAgIHJldHVybjsKKyAgLy8gWnUgbG9lc2NoZW5kZSBBcnRpa2VsIHdlZ3NjaHJlaWJlbi4KKyAgZHVtcF9maWxlKCJuZXdzL09MRC4iK2dycCxncm91cFswLi5maXJzdF90b19rZWVwLTFdKTsKKyAgLy8gZGFubiBsb2VzY2hlbgorICBpZiAoZmlyc3RfdG9fa2VlcCA9PSBzaXplKSAvLyBhbGxlIHdlZ3dlcmZlbj8KKyAgICBncm91cD0oe30pOworICBlbHNlCisgICAgZ3JvdXA9Z3JvdXBbZmlyc3RfdG9fa2VlcC4uc2l6ZS0xXTsKKyAgCisgIHNhdmVfZ3JvdXAoZ3JwLGdyb3VwKTsKK30KKwordm9pZCBkdW1wX2dyb3VwKHN0cmluZyBncnApCit7CisgIGludCB0b19leHBpcmUsc2l6ZSxsYXN0OworICBtaXhlZCAqZ3JvdXA7CisKKyAgaWYgKCFBUkNIX1NFQ1VSSVRZIHx8IHByb2Nlc3NfY2FsbCgpKSByZXR1cm47CisgIGlmICghcG9pbnRlcnAoZ3JvdXA9bG9hZF9ncm91cChncnApKSkgcmV0dXJuOworICBzaXplPXNpemVvZihncm91cCk7CisgIGxhc3Q9c2l6ZTsKKyAgaWYgKCFsYXN0KSByZXR1cm47CisgIGR1bXBfZmlsZSgibmV3cy9EVU1QLiIrZ3JwLGdyb3VwWzAuLmxhc3QtMV0pOworfQorCitwcm90ZWN0ZWQgdm9pZCBleHBpcmVfYWxsKHN0cmluZyAqa2V5cykgeworICAvLyBuZXVlbiBjYWxsX291dCBmdWVyIGRlbiBSZXN0IHNldHplbgorICBpZiAoc2l6ZW9mKGtleXMpID4gMSkKKyAgICBjYWxsX291dCgjJ2V4cGlyZV9hbGwsMTUsa2V5c1sxLi5dKTsKKyAgLy8gdW5kIGVyc3RlIEdydXBwZSBleHBpcmVuCisgIGV4cGlyZShrZXlzWzBdKTsKK30KKwordm9pZCByZXNldCgpIHsKKyAgLy8gbmFlY2hzdGVzIEV4cGlyZSB1bmQgZGFtaXQgUmVzZXQgaW4gZWluZW0gdGFnCisgIHNldF9uZXh0X3Jlc2V0KDg2NDAwKTsKKyAgLy8gYWx0ZSBjYWxsX291dHMgZ2dmLiBlbnRmZXJuZW4uCisgIHdoaWxlKHJlbW92ZV9jYWxsX291dCgjJ2V4cGlyZV9hbGwpPj0wKTsKKyAgLy8gZ3J1cHBlbmxpc3RlIGhvbGVuIHVuZCBjYWxsb3V0IGF1ZiBleHBpcmVfYWxsIHN0YXJ0ZW4KKyAgaWYgKHNpemVvZihncm91cGxpc3QpKSB7CisgICAgY2FsbF9vdXQoIydleHBpcmVfYWxsLDEwLG1faW5kaWNlcyhncm91cGxpc3QpKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBzYXZlX2dyb3VwKHN0cmluZyBncnAsbWl4ZWQgZ3JvdXApCit7CisgIHNhdmVsb2FkPWdyb3VwOyAvLyBEbyBOT1Qgc2F2ZSB0aGUgYWNjZXNzZWQtSW5mbworICBjYWNoZVtncnBdID0gZ3JvdXA7CisgIHNhdmVfb2JqZWN0KE5FV1NQQVRIK2dyb3VwbGlzdFtncnAsR19TQVZFRklMRV0pOworICBzYXZlbG9hZD0wOworfQorCitzdGF0aWMgdm9pZCBzYXZlX2dyb3VwX2xpc3QoKQoreworICBzYXZlbG9hZD1ncm91cGxpc3Q7CisgIHNhdmVfb2JqZWN0KE5FV1NQQVRIKyJHcm91cExpc3QiKTsKKyAgc2F2ZWxvYWQ9MDsKK30KKworc3RhdGljIG1peGVkIGxvYWRfZ3JvdXAoc3RyaW5nIG5hbWUpCit7CisgIGludCBudW07CisgIG1peGVkICpyZXQ7CisKKyAgaWYoIW1lbWJlcihncm91cGxpc3QsbmFtZSkpIHJldHVybiAtMTsKKworICBpZiAobWVtYmVyKGNhY2hlLCBuYW1lKSkgeworICAgIHJldCA9IGNhY2hlW25hbWVdOworICB9CisgIGVsc2UgeworICAgIHJlc3RvcmVfb2JqZWN0KE5FV1NQQVRIK2dyb3VwbGlzdFtuYW1lLEdfU0FWRUZJTEVdKTsKKyAgICBpZiAoIXBvaW50ZXJwKHNhdmVsb2FkKSkKKyAgICAgIHNhdmVsb2FkPSh7fSk7CisgICAgcmV0PXNhdmVsb2FkOworICAgIGNhY2hlW25hbWVdID0gc2F2ZWxvYWQ7CisgICAgc2F2ZWxvYWQ9MDsKKyAgfQorICByZXR1cm4gcmV0OworfQorCittaXhlZCBHZXRHcm91cHMoKQoreworICBtaXhlZCAqcmV0dXJubGlzdDsKKyAgaW50IGksZ3JvdXAsc2xldmVsOworICBzdHJpbmcgc2V1aWQ7CisKKyAgcmV0dXJubGlzdD1zb3J0X2FycmF5KG1faW5kaWNlcyhncm91cGxpc3QpLCMnPik7IC8vJyk7CisgIGlmIChBUkNIX1NFQ1VSSVRZICYmICFwcm9jZXNzX2NhbGwoKSkKKyAgICByZXR1cm4gcmV0dXJubGlzdDsKKworICBzZXVpZCA9IHVzZXJfZXVpZCgpOworICBzbGV2ZWwgPSBzZWN1cmVfbGV2ZWwoKTsKKworICBmb3IgKGk9c2l6ZW9mKHJldHVybmxpc3QpLTE7aT49MDtpLS0pCisgICAgaWYgKCEoZ3JvdXBsaXN0W3JldHVybmxpc3RbaV0sR19STEVWRUxdPD1zbGV2ZWwgfHwKKyAgICAgICAgICBncm91cGxpc3RbcmV0dXJubGlzdFtpXSxHX09XTkVSXT09c2V1aWQgfHwKKyAgICAgICAgICBtZW1iZXIoZ3JvdXBsaXN0W3JldHVybmxpc3RbaV0sR19SRUFERVJTXSwgc2V1aWQpIT0tMSkpCisgICAgICByZXR1cm5saXN0PXJldHVybmxpc3RbMC4uaS0xXStyZXR1cm5saXN0W2krMS4uXTsKKyAgcmV0dXJuIHJldHVybmxpc3Q7Cit9CisKK2ludCBBc2tBbGxvd2VkV3JpdGUoc3RyaW5nIG4pCit7CisgIG1peGVkICpncm91cDsKKworICBpZiAoIW1lbWJlcihncm91cGxpc3QsbikpIHJldHVybiAtMjsKKyAgaWYgKCFwb2ludGVycChncm91cD1sb2FkX2dyb3VwKG4pKSkgcmV0dXJuIC0yOworCisgIGlmIChncm91cGxpc3RbbixHX09XTkVSXSAhPSB1c2VyX2V1aWQoKSAmJgorICAgICAgIUFSQ0hfU0VDVVJJVFkgJiYKKyAgICAgIGdyb3VwbGlzdFtuLEdfV0xFVkVMXT5zZWN1cmVfbGV2ZWwoKSAmJgorICAgICAgbWVtYmVyKGdyb3VwbGlzdFtuLEdfV1JJVEVSU10sdXNlcl9ldWlkKCkpPT0tMSkKKyAgICByZXR1cm4gLTE7CisKKyAgaWYgKHNpemVvZihncm91cCk+PWdyb3VwbGlzdFtuLEdfTUFYX01TR10pIHJldHVybiAtMzsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIFdpY2h0aWcgLi4uCisKK2ludCBxdWVyeV9wcmV2ZW50X3NoYWRvdygpCit7CisgIHJldHVybiAxOworfQorCittaXhlZCBHZXROZXdzVGltZShzdHJpbmcgYm9hcmRuYW1lKQorCit7CisgIGludCBpLCBsdGltZSwgajsKKyAgbWl4ZWQgKmtleXM7CisKKyAgaWYgKCFib2FyZG5hbWUpCisgIHsKKyAgICBsdGltZT0tMTsKKyAgICBmb3IgKGk9c2l6ZW9mKGtleXM9bV9pbmRpY2VzKGdyb3VwbGlzdCkpLTE7aT49MDtpLS0pCisgICAgICBpZiAobHRpbWU8KGo9Z3JvdXBsaXN0W2tleXNbaV0sV1RJTUVdKSkgbHRpbWU9ajsKKyAgICByZXR1cm4gbHRpbWU7CisgIH0KKyAgaWYgKCFtZW1iZXIoZ3JvdXBsaXN0LGJvYXJkbmFtZSkpIHJldHVybiAtMTsKKyAgcmV0dXJuIGdyb3VwbGlzdFtib2FyZG5hbWUsV1RJTUVdOworfQorCittaXhlZCogR2V0R3JvdXAoc3RyaW5nIG5hbWUpCit7CisgIGlmIChwcm9jZXNzX2NhbGwoKSkgcmV0dXJuIDA7CisgIGlmIChleHRlcm5fY2FsbCgpICYmICFhbGxvd2VkKG5hbWUsIEZfQURNSU4pKSByZXR1cm4gMDsKKyNkZWZpbmUgZ2woeCkgZ3JvdXBsaXN0W25hbWUseF0KKyAgcmV0dXJuICh7bmFtZSxnbCgxKSxnbCgyKSxnbCgzKSxnbCg0KSxnbCg1KSxnbCg2KSxnbCg3KSxnbCg4KSxnbCg5KSxnbCgxMCksbG9hZF9ncm91cChuYW1lKX0pOworfQpkaWZmIC0tZ2l0IGEvc2VjdXJlL25wY21hc3Rlci5jIGIvc2VjdXJlL25wY21hc3Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZDhiZGMKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvbnBjbWFzdGVyLmMKQEAgLTAsMCArMSwxMjQgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBucGNtYXN0ZXIuYyAtIFZlcndhbHR1bmcgZGVyIGVpbmRldXRpZ2VuIE51bW1lcm52ZXJnYWJlIGZ1ZXIgTlBDcyB1bmQKKy8vICAgICAgICAgICAgICAgZGVyIFN0dWZlbnB1bmt0ZSwgZGllIHNpZSBnZWJlbgorLy8KKy8vICRJZDogbnBjbWFzdGVyLmMgOTE0MiAyMDE1LTAyLTA0IDIyOjE3OjI5WiBaZXNzdHJhICQKKy8vCisvKgorICogJExvZzogbnBjbWFzdGVyLmMsdiAkCisgKiBSZXZpc2lvbiAxLjYgIDE5OTYvMDkvMTggMDg6NTk6NDkgIFdhcmdvbgorICogR2xvYmFsZSBWYXJpYWJsZW4gcHJpdmF0ZSBnZW1hY2h0Li4uCisgKgorICogUmV2aXNpb24gMS41ICAxOTk2LzA0LzEwIDE3OjQ4OjM3ICBKb2YKKyAqIER1bXAtRnVua3Rpb24gZWluZ2ViYXV0LCBkYW1pdCBtYW4gYXVjaCB3YXMgenUgbGVzZW4gaGF0IDopCisgKiAsCisgKgorICogUmV2aXNpb24gMS40ICAxOTk2LzA0LzEwIDE0OjMyOjI0ICBXYXJnb24KKyAqIFF1ZXJ5TlBDKCk6IGludCAqIC0+IG1peGVkCisgKgorICogUmV2aXNpb24gMS4zICAxOTk2LzA0LzA0IDEyOjMzOjA2ICBXYXJnb24KKyAqIFF1ZXJ5TlBDYnlOdW1iZXIoKSBnaWJ0IGpldHp0IHdpcmtsaWNoIE51bW1lciB1bmQgU2NvcmUgenVydWVjay4uLgorICoKKyAqIFJldmlzaW9uIDEuMiAgMTk5Ni8wMy8wNiAxNDozNDo1MSAgSm9mCisgKiBRdWVyeU5QQ2J5TnVtYmVyIGVpbmdlYmF1dCwgVHlwb3MgZ2VmaXhlZAorICoKKyAqIFJldmlzaW9uIDEuMSAgMTk5Ni8wMy8wNiAxMzo0NTozNiAgSm9mCisgKiBJbml0aWFsIHJldmlzaW9uCisgKgorICovCisKKyNpbmNsdWRlICIvc2VjdXJlL25wY21hc3Rlci5oIgorI2luY2x1ZGUgIi9zZWN1cmUvd2l6bGV2ZWxzLmgiCisKK3ByaXZhdGUgaW50IGxhc3ROdW07Citwcml2YXRlIG1hcHBpbmcgbnBjczsKK3ByaXZhdGUgbm9zYXZlIG1hcHBpbmcgYnlfbnVtOworCit2b2lkIG1ha2VfbnVtKHN0cmluZyBrZXkpIHsKKyAgYnlfbnVtICs9IChbIG5wY3Nba2V5LE5QQ19OVU1CRVJdIDoga2V5OyBucGNzW2tleSxOUENfU0NPUkVdIF0pOworfQorCit2b2lkIGNyZWF0ZSgpCit7CisgIHNldGV1aWQoZ2V0dWlkKCkpOworICBpZiAoIXJlc3RvcmVfb2JqZWN0KE5QQ1NBVkVGSUxFKSkKKyAgeworICAgIGxhc3ROdW09MDsKKyAgICBucGNzPW1fYWxsb2NhdGUoMCwyKTsKKyAgfQorICBieV9udW0gPSBtX2FsbG9jYXRlKDAsMik7CisgIGZpbHRlcl9pbmRpY2VzKG5wY3MsICMnbWFrZV9udW0vKicqLyk7Cit9CisKK3N0YXRpYyBpbnQgRHVtcE5QQ3MoKTsKKwordmFyYXJncyBtaXhlZCBRdWVyeU5QQyhpbnQgc2NvcmUpCit7CisgIHN0cmluZyBrZXksIHZhbDsKKyAgCisgIGlmICghcHJldmlvdXNfb2JqZWN0KCkpCisgICAgcmV0dXJuIE5QQ19JTlZBTElEX0FSRzsKKyAga2V5PW9sZF9leHBsb2RlKG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSwiIyIpWzBdOworICBpZiAodmFsPW5wY3Nba2V5LE5QQ19OVU1CRVJdKQorICAgIHJldHVybiAoe3ZhbCxucGNzW2tleSxOUENfU0NPUkVdfSk7CisgIGlmIChzY29yZTw9MCB8fCBtZW1iZXIoaW5oZXJpdF9saXN0KHByZXZpb3VzX29iamVjdCgpKSwiL3N0ZC9saXZpbmcvbGlmZS5jIikgPCAwKQorICAgIHJldHVybiBOUENfSU5WQUxJRF9BUkc7CisgIG5wY3Nba2V5LE5QQ19TQ09SRV09c2NvcmU7CisgIG5wY3Nba2V5LE5QQ19OVU1CRVJdPSsrbGFzdE51bTsKKyAgYnlfbnVtICs9IChbbGFzdE51bTprZXk7c2NvcmVdKTsKKyAgIHNhdmVfb2JqZWN0KE5QQ1NBVkVGSUxFKTsKKyAgY2FsbF9vdXQoIkR1bXBOUENzIiwwKTsKKyAgcmV0dXJuICh7bGFzdE51bSxzY29yZX0pOworfQorCitpbnQgU2V0U2NvcmUoc3RyaW5nIGtleSxpbnQgc2NvcmUpCit7CisgIGlmICghSVNfQVJDSCh0aGlzX2ludGVyYWN0aXZlKCkpfHwhSVNfQVJDSChnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSkpCisgICAgcmV0dXJuIE5QQ19OT19QRVJNSVNTSU9OOworICBpZiAoIW5wY3Nba2V5LE5QQ19OVU1CRVJdKQorICAgIHJldHVybiBOUENfSU5WQUxJRF9BUkc7CisgIG5wY3Nba2V5LE5QQ19TQ09SRV09c2NvcmU7CisgIGJ5X251bSArPSAoW25wY3Nba2V5LE5QQ19OVU1CRVJdOmtleTtzY29yZV0pOworICBzYXZlX29iamVjdChOUENTQVZFRklMRSk7CisgIER1bXBOUENzKCk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IER1bXBOUENzKCkKK3sKKyAgbWl4ZWQgKmtleXM7CisgIGludCBpLCBtYXg7CisKKyAga2V5cz1tX2luZGljZXMobnBjcyk7CisgIHJtKE5QQ0RVTVBGSUxFKTsKKyAgZm9yIChpPXNpemVvZihrZXlzKS0xLCBtYXg9MDtpPj0wO2ktLSkgeworICAgIHdyaXRlX2ZpbGUoTlBDRFVNUEZJTEUsc3ByaW50ZigiJTVkICU0ZCAlc1xuIixucGNzW2tleXNbaV0sTlBDX05VTUJFUl0sCisJICAgbnBjc1trZXlzW2ldLE5QQ19TQ09SRV0sa2V5c1tpXSkpOworICAgIG1heCArPSBucGNzW2tleXNbaV0sTlBDX1NDT1JFXTsKKyAgfSAKKyAgd3JpdGVfZmlsZShOUENEVU1QRklMRSxzcHJpbnRmKCI9PT09PT09PT09PT09PT09PT09PVxuR2VzYW10OiAlZCBQdW5rdGVcbiIsbWF4KSk7IAorICByZXR1cm4gMTsKK30KKworbWl4ZWQgKlF1ZXJ5TlBDYnlOdW1iZXIoaW50IG51bSkKK3sKKyAgaWYgKGJ5X251bVtudW1dKQorICAgIHJldHVybiAoe251bSxieV9udW1bbnVtLE5QQ19TQ09SRV0sYnlfbnVtW251bSxOUENfTlVNQkVSXX0pOworCisgIHJldHVybiAwOworfQorCitpbnQgUmVjYWxjdWxhdGUoc3RyaW5nIHMpCit7CisgIGludCBpLCBqOworCisgIGlmICghcyB8fCAhc2l6ZW9mKHMpKQorICAgIHJldHVybiAwOworCisgIGZvciAoaj0wLCBpPTYqc2l6ZW9mKHMpLTE7IGk+MDsgaS0tKSB7CisgICAgaWYgKHRlc3RfYml0KHMsaSkpCisgICAgICBqKz1ieV9udW1baSxOUENfU0NPUkVdOworICB9CisgIHJldHVybiBqOworfQpkaWZmIC0tZ2l0IGEvc2VjdXJlL25wY21hc3Rlci5oIGIvc2VjdXJlL25wY21hc3Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZjdmNDEKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvbnBjbWFzdGVyLmgKQEAgLTAsMCArMSwyNCBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIEZpbGVOYW1lLmMgLS0gQmVzY2hyZWlidW5nCisvLyAkSWQ6IG5wY21hc3Rlci5oIDI2MzQgMjAwNi0wOS0yMyAwOTo0MzowN1ogcm9vdCAkCisvLworLyoKKyAqICRMb2c6IG5wY21hc3Rlci5oLHYgJAorICogUmV2aXNpb24gMS4xICAxOTk2LzAzLzA2IDEzOjQ1OjExICBKb2YKKyAqIEluaXRpYWwgcmV2aXNpb24KKyAqCisgKi8KKworI2lmbmRlZiBfTlBDTUFTVEVSX0hfCisjZGVmaW5lIF9OUENNQVNURVJfSF8gMQorCisjZGVmaW5lIE5QQ1NBVkVGSUxFICIvZXRjL25wY21hc3RlciIKKworI2RlZmluZSBOUENfTlVNQkVSCTAKKyNkZWZpbmUgTlBDX1NDT1JFCTEKKworI2RlZmluZSBOUENfSU5WQUxJRF9BUkcgLTEKKyNkZWZpbmUgTlBDX05PX1BFUk1JU1NJT04gLTIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvcG90aW9ubWFzdGVyLmMgYi9zZWN1cmUvcG90aW9ubWFzdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhhMDU2NQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9wb3Rpb25tYXN0ZXIuYwpAQCAtMCwwICsxLDUxNSBAQAorI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgbm9fc2hhZG93CisjcHJhZ21hIG5vX2luaGVyaXQKKyNwcmFnbWEgdmVyYm9zZV9lcnJvcnMKKyNwcmFnbWEgY29tYmluZV9zdHJpbmdzCisjcHJhZ21hIHJ0dF9jaGVja3MKKyNwcmFnbWEgcGVkYW50aWMKKyNwcmFnbWEgd2Fybl9kZXByZWNhdGVkCisKKyNpbmNsdWRlICIvc2VjdXJlL2NvbmZpZy5oIgorI2luY2x1ZGUgIi9zZWN1cmUvd2l6bGV2ZWxzLmgiCisKKyNkZWZpbmUgTUFYX1JPT01TX1BFUl9MSVNUIDEwCisKKy8vIGRpZSBkaXYuIFNwZWljaGVyb3J0ZSB1bmQgUGZhZGUKKyNkZWZpbmUgU0FWRUZJTEUgICAgIi9zZWN1cmUvQVJDSC9wb3Rpb25zIgorI2RlZmluZSBUSVBTKHgpICAgICAiL3NlY3VyZS9BUkNIL1pULyIreAorI2RlZmluZSBPUkFLRUwgICAgICAiL3Jvb20vb3Jha2VsIgorI2RlZmluZSBQT1RJT05UT09MICAiL29iai90b29scy9wdG9vbCIKKworLy8gRnVlciBkaWUgRHVtcC1GdW5rdGlvbgorI2RlZmluZSBQT1RJT05EVU1QICIvc2VjdXJlL0FSQ0gvUE9USU9OUy5kdW1wIgorI2RlZmluZSBEVU1QKHN0cikgICB3cml0ZV9maWxlKFBPVElPTkRVTVAsIHN0cikKKworLy8gTW9kaWZpa2F0aW9uZW4gbG9nZ2VuLiAiZXZlbnQiIGlzdCBlaW5zIGRlciBFdmVudHMgYXVzIGRlciBMaXN0ZToKKy8vIEFERF9QT1RJT04sIEFDVElWQVRFLCBERUFDVElWQVRFLCBNT0RJRllfUEFUSCwgTU9ESUZZX0xJU1ROTworI2RlZmluZSBMT0dGSUxFX01PRCAgICAgIi9sb2cvQVJDSC9QT1RJT05TX01PRC5sb2ciCisjZGVmaW5lIE1PRExPRyhldmVudCxudW0sZGF0YSkgd3JpdGVfZmlsZShMT0dGSUxFX01PRCwgXAorICBzcHJpbnRmKCIlMTdzICUtMTRzICUtM2Qgc0VVSUQgJXMgJXNcbiIsIFwKKyAgICBzdHJmdGltZSgiJVktJWItJWQgJVIiKSwgZXZlbnQsIG51bSwgc2VjdXJlX2V1aWQoKSwgZGF0YSkgKQorCisvLyBJbmRpemllcnVuZ3MtS29uc3RhbnRlbiBmdWVyIGRhcyBwb3Rpb25zLU1hcHBpbmcKKyNkZWZpbmUgUE9UX1JPT01OQU1FIDAKKyNkZWZpbmUgUE9UX0xJU1ROTyAgIDEKKworLy8gS29uc3RhbnRlbiBmdWVyIGRpdi4gUnVlY2tnYWJld2VydGUuIEtlaW5lIDAsIGRhIGRhcyBlaW5lIGd1ZWx0aWdlIFpULUlECisvLyBzZWluIGthbm4gdW5kIGFiZnJhZ2VuZGUgT2JqZWt0ZSB2ZXJ3aXJyZW4ga29lbm50ZS4KKyNkZWZpbmUgUE9UX0lTX0FDVElWRSAgICAgICAgICAgIDEKKyNkZWZpbmUgUE9UX0FDQ0VTU19ERU5JRUQgICAgICAgLTEKKyNkZWZpbmUgUE9UX1dST05HX0RBVEFUWVBFICAgICAgLTIKKyNkZWZpbmUgUE9UX05PX1NVQ0hfUk9PTSAgICAgICAgLTMKKyNkZWZpbmUgUE9UX0FMUkVBRFlfUkVHSVNURVJFRCAgLTQKKyNkZWZpbmUgUE9UX0lOVkFMSURfUE9USU9OICAgICAgLTUKKyNkZWZpbmUgUE9UX05PX1NVQ0hfRklMRSAgICAgICAgLTYKKyNkZWZpbmUgUE9UX0lOVkFMSURfTElTVF9OVU1CRVIgLTcKKyNkZWZpbmUgUE9UX0FMUkVBRFlfQUNUSVZFICAgICAgLTgKKyNkZWZpbmUgUE9UX0FMUkVBRFlfSU5BQ1RJVkUgICAgLTkKKyNkZWZpbmUgUE9UX05PVF9JTkFDVElWRSAgICAgICAtMTAKKyNkZWZpbmUgUE9UX05PVF9BQ1RJVkUgICAgICAgICAtMTEKKworLy8gWmFlaGxlciBmdWVyIGRlbiBhbHMgbmFlY2hzdGVuIGFuenVsZWdlbmRlbiBaVAorcHJpdmF0ZSBpbnQgbmV4dHJvb207CisKKy8vIExpc3RlIGFsbGVyIFpUcyBlaW5zY2hsLiBpbmFrdGl2ZSwgKFsgaW50IG51bSA6IHN0cmluZyByb29tOyBpbnQgbGlzdCBdKQorcHJpdmF0ZSBtYXBwaW5nIHBvdGlvbnMgPSAoW10pOworCisvLyBMaXN0ZSBkZXIgaW5ha3RpdmVuIFpUcywgKHsgaW50IG51bSB9KQorcHJpdmF0ZSBpbnQgKmluYWN0aXZlID0gKHt9KTsKKworLy8gQ2FjaGUgbWl0IGRlbiBlaW56ZWxuZW4gTGlzdGVuLCAoWyBpbnQgbGlzdCA6IGludCAqcG90aW9ubGlzdCBdKQorcHJpdmF0ZSBub3NhdmUgbWFwcGluZyBsaXN0czsKKworLy8gcmV2ZXJzZV90YWJsZSBMb29rdXAgQ2FjaGUsIChbc3RyaW5nIHJvb206IGludCBudW1iZXJdKQorcHJpdmF0ZSBub3NhdmUgbWFwcGluZyByZXZlcnNlX3RhYmxlID0gKFtdKTsKKworLy8gQ2FjaGUgZnVlciBkaWUgYmVyZWl0cyB2b24gZGVyIFBsYXR0ZSBlaW5nZWxlc2VuZW4gWlRzLCB1bSBQbGF0dGVuenVncmlmZmUKKy8vIGluc2Jlc29uZGVyZSBiZWltIEVyemV1Z2VuIGRlciBUaXBsaXN0ZSBkdXJjaCBkYXMgT3Jha2VsIHp1IHJlZHV6aWVyZW4uCitwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIHRpcG1hcCA9IChbXSk7CisKK2ludCBBY3RpdmF0ZVJvb20oc3RyaW5nIHJvb20pOworCitwcml2YXRlIGludCBzZWN1cmUoKSB7CisgIHJldHVybiAoIXByb2Nlc3NfY2FsbCgpICYmIEFSQ0hfU0VDVVJJVFkpOworfQorCittaXhlZCBRdWVyeVBvdGlvbkRhdGEoaW50IG51bSkgeworICBpZiAoICFzZWN1cmUoKSApCisgICAgcmV0dXJuIFBPVF9BQ0NFU1NfREVOSUVEOworICByZXR1cm4gKFtudW0gOiBwb3Rpb25zW251bSwwXTsgcG90aW9uc1tudW0sMV0gXSk7Cit9CisKK2ludCAqUXVlcnlJbmFjdGl2ZVBvdGlvbnMoKSB7CisgIHJldHVybiBjb3B5KGluYWN0aXZlKTsKK30KKworcHJpdmF0ZSB2b2lkIFJlYnVpbGRDYWNoZSgpIHsKKyAgLy8gQ2FjaGUgaW52YWxpZGllcmVuOyB2b3ItaW5pdGlhbGlzaWVydCB6dXIgQmVzY2hsZXVuaWd1bmcgZGVzIFJlYnVpbGRzLgorICBsaXN0cyA9IChbMDooe30pLDE6KHt9KSwyOih7fSksMzooe30pLDQ6KHt9KSw1Oih7fSksNjooe30pLDc6KHt9KV0pOworICBmb3JlYWNoIChpbnQgbnVtLCBzdHJpbmcgcm9vbSwgaW50IGxpc3QgOiBwb3Rpb25zKSB7CisgICAgcmV2ZXJzZV90YWJsZSArPSAoW3Jvb206bnVtXSk7CisgICAgbGlzdHNbbGlzdF0gKz0gKHtudW19KTsKKyAgfQorICByZXR1cm47Cit9CisKK2ludCBRdWVyeUFjdGl2ZShtaXhlZCBwb3Rpb24pIHsKKyAgaWYgKCBleHRlcm5fY2FsbCgpICYmICFzZWN1cmUoKSApCisgICAgcmV0dXJuIFBPVF9BQ0NFU1NfREVOSUVEOworICBpbnQgcmV0OworICAvLyBXZW5uIG5hY2ggZGVtIFBmYWQgZGVzIFpUcyBnZWZyYWd0IHdpcmQsIGRpZXNlbiB6dWVyc3QgaW4gZGllIE51bW1lcgorICAvLyB1bXdhbmRlbG4gZHVyY2ggTG9va3VwIGltIHJldmVyc2VfdGFibGUgQ2FjaGUKKyAgaWYgKCBzdHJpbmdwKHBvdGlvbikgKSB7CisgICAgcG90aW9uID0gcmV2ZXJzZV90YWJsZVtwb3Rpb25dOworICB9CisgIC8vIEVpbiBaVCBpc3QgYWt0aXYsIHdlbm4gZXIgaW4gZGVyIExpc3RlIHBvdGlvbnMgc3RlaHQgdW5kIG5pY2h0IGluIGRlcgorICAvLyBMaXN0ZSBkZXIgaW5ha3RpdmVuIFpUcyAoaW5hY3RpdmUpIHN0ZWh0LiBEYW5uIGRlc3NlbiBOdW1tZXIKKyAgLy8genVydWVja2dlYmVuOyBpbmFrdGl2ZSB6dWVyc3QgcHJ1ZWZlbiwgd2VpbCBkaWUgaW5ha3RpdmVuIGF1Y2ggaW4gCisgIC8vICJwb3Rpb25zIiBlbnRoYWx0ZW4gc2luZCB1bmQgc29taXQgYWxsZSBaVHMgYXVzc2VyIGRlbiB1bmd1ZWx0aWdlbgorICAvLyBhbHMgYWt0aXYgZ2VtZWxkZXQgd3VlcmRlbi4KKyAgaWYgKCBtZW1iZXIoaW5hY3RpdmUscG90aW9uKT4tMSApCisgICAgcmV0ID0gUE9UX05PVF9BQ1RJVkU7CisgIGVsc2UgaWYgKCBtZW1iZXIocG90aW9ucyxwb3Rpb24pICYmIHBvdGlvbnNbcG90aW9uLFBPVF9MSVNUTk9dIT0tMSApCisgICAgcmV0ID0gcG90aW9uOworICAvLyBhbnNvbnN0ZW4gaXN0IGRhcyBrZWluIGd1ZWx0aWdlciBaVAorICBlbHNlCisgICAgcmV0ID0gUE9UX0lOVkFMSURfUE9USU9OOworICByZXR1cm4gcmV0OworfQorCitwcml2YXRlIHZvaWQgc2F2ZV9pbmZvKCkgeworICBzYXZlX29iamVjdChTQVZFRklMRSk7Cit9CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpIHsKKyAgc2V0ZXVpZChnZXR1aWQodGhpc19vYmplY3QoKSkpOworICBpZiAoICFyZXN0b3JlX29iamVjdChTQVZFRklMRSkgKSB7CisgICAgLy8gRmVobGVyIGF1c2dlYmVuLCBkYW1pdCBlcyBqZW1hbmQgbWVya3QuIERlbm5vY2ggd2lyZCBqZXR6dCBpbSBBbnNjaGx1c3MKKyAgICAvLyBkZXIgQ2FjaGUgbmV1IGF1ZmdlYmF1dCAoZGFtaXQgZGllIERhdGVuc3RydWt0dXJlbiBndWVsdGlnIHNpbmQpLgorICAgIGNhdGNoKHJhaXNlX2Vycm9yKCJQb3Rpb25tYXN0ZXI6IG5vL2NvcnJ1cHQgc2F2ZWZpbGUhIFJlaW5pdGlhbGl6aW5nLlxuIik7IHB1Ymxpc2gpOworICB9CisgIFJlYnVpbGRDYWNoZSgpOworfQorCitpbnQgQWRkUG90aW9uUm9vbShzdHJpbmcgcm9vbSwgaW50IGxpc3QpIHsKKyAgaWYgKCAhc2VjdXJlKCkgKQorICAgIHJldHVybiBQT1RfQUNDRVNTX0RFTklFRDsKKyAgLy8gTmV1ZXIgUmF1bSBtdXNzIGVpbiBndWVsdGlnZXIgU3RyaW5nIHNlaW4uCisgIGlmICggIXN0cmluZ3Aocm9vbSkgKQorICAgIHJldHVybiBQT1RfV1JPTkdfREFUQVRZUEU7CisgIGlmICggIWludHAobGlzdCkgfHwgbGlzdDwwIHx8IGxpc3Q+NyApCisgICAgcmV0dXJuIFBPVF9XUk9OR19EQVRBVFlQRTsKKworICAvLyBQZmFkIG1pdCBIaWxmZSBkZXMgTWFzdGVycyB2ZXJ2b2xsc3RhZW5kaWdlbiAoKywgfiBldGMuIGVyc2V0emVuKQorICByb29tPShzdHJpbmcpbWFzdGVyKCktPl9nZXRfcGF0aChyb29tLDApOworCisgIC8vIERhdGVpIG1pdCBkZW0gWlQtU3BydWNoIG11c3MgZXhpc3RpZXJlbi4KKyAgaWYgKCBmaWxlX3NpemUoIFRJUFModG9fc3RyaW5nKG5leHRyb29tKSsiLnp0IikgKSA8IDAgKSB7CisgICAgcmFpc2VfZXJyb3IoIlBvdGlvbm1hc3RlcjogVGlwZmlsZSBtaXNzaW5nLCBwbGVhc2UgY3JlYXRlICIrCisgICAgICB0b19zdHJpbmcobmV4dHJvb20pKyIuenQiKTsKKyAgICByZXR1cm4gUE9UX05PX1NVQ0hfRklMRTsKKyAgfQorICAvLyBOZXVlciBSYXVtIGRhcmYgbm9jaCBuaWNodCBpbiBkZXIgTGlzdGUgZW50aGFsdGVuIHNlaW4uCisgIGlmICggbWVtYmVyKG1fdmFsdWVzKHBvdGlvbnMsUE9UX1JPT01OQU1FKSwgcm9vbSkhPS0xKQorICAgIHJldHVybiBQT1RfQUxSRUFEWV9SRUdJU1RFUkVEOworICAvLyBOZXVlciBSYXVtIG11c3MgbGFkYmFyIHNlaW4uCisgIGlmICggY2F0Y2gobG9hZF9vYmplY3Qocm9vbSk7IHB1Ymxpc2gpICkKKyAgICByZXR1cm4gUE9UX05PX1NVQ0hfUk9PTTsKKworICAvLyBKZXR6dCBrYW5uJ3MgZW5kbGljaCBsb3NnZWhlbiwgUmF1bSBlaW50cmFnZW4sIG5leHRyb29tIGhvY2h6YWVobGVuCisgIHBvdGlvbnMgKz0gKFtuZXh0cm9vbSA6IHJvb207IGxpc3RdKTsKKyAgTU9ETE9HKCJBRERfUE9USU9OIiwgbmV4dHJvb20sIHJvb20pOworICAvLyBOZXUgZWluZ2V0cmFnZW5lIFpUcyB3ZXJkZW4gYXVjaCBnbGVpY2ggYWt0aXZpZXJ0OyBBY3RpdmF0ZVJvb20oKQorICAvLyBiYXV0IGRlbiBDYWNoZSBzZWxic3QgbmV1IGF1ZiwgZGFoZXIga2FubiBkYXMgaGllciBlbnRmYWxsZW4uCisgIEFjdGl2YXRlUm9vbShyb29tKTsKKyAgbmV4dHJvb20rKzsKKyAgc2F2ZV9pbmZvKCk7CisgIHJldHVybiBuZXh0cm9vbTsKK30KKworaW50IENoYW5nZVJvb21QYXRoKHN0cmluZyBvbGQsIHN0cmluZyBuZXcpIHsKKyAgaWYgKCAhc2VjdXJlKCkgKQorICAgIHJldHVybiBQT1RfQUNDRVNTX0RFTklFRDsKKworICAvLyBiZWlkZSBQZmFkZSBtdWVzc2VuIGd1ZWx0aWdlIFN0cmluZ3Mgc2VpbgorICBpZiAoICFzdHJpbmdwKG9sZCkgfHwgIXN0cmluZ3AobmV3KSApCisgICAgcmV0dXJuIFBPVF9XUk9OR19EQVRBVFlQRTsKKworICAvLyBQZmFkIG1pdCBIaWxmZSBkZXMgTWFzdGVycyB2ZXJ2b2xsc3RhZW5kaWdlbiAoKywgfiBldGMuIGVyc2V0emVuKQorICBvbGQ9KHN0cmluZyltYXN0ZXIoKS0+X2dldF9wYXRoKG9sZCwwKTsKKyAgbmV3PShzdHJpbmcpbWFzdGVyKCktPl9nZXRfcGF0aChuZXcsMCk7CisKKyAgLy8gRGVyIG5ldWUgUmF1bSBkYXJmIG5pY2h0IGJlcmVpdHMgZWluZ2V0cmFnZW4gc2VpbiwgLi4uCisgIGlmICggbWVtYmVyKHJldmVyc2VfdGFibGUsbmV3KSApCisgICAgcmV0dXJuIFBPVF9BTFJFQURZX1JFR0lTVEVSRUQ7CisgIC8vIC4uLiB1bmQgZGVyIGFsdGUgUmF1bSBtdXNzIG5vY2ggZWluZ2V0cmFnZW4gc2Vpbi4KKyAgaWYgKCAhbWVtYmVyKHJldmVyc2VfdGFibGUsb2xkKSApCisgICAgcmV0dXJuIFBPVF9OT19TVUNIX1JPT007CisgIC8vIE5ldWVyIFJhdW0gbXVzcyBsYWRiYXIgc2Vpbi4KKyAgaWYgKGNhdGNoKGxvYWRfb2JqZWN0KG5ldyk7cHVibGlzaCkpCisgICAgcmV0dXJuIFBPVF9OT19TVUNIX1JPT007CisKKyAgLy8gQWt0dWVsbGUgWlQtTnVtbWVyIGRlcyBhbHRlbiBQZmFkZXMgZXJtaXR0ZWxuCisgIGludCBudW0gPSByZXZlcnNlX3RhYmxlW29sZF07CisgIC8vIFBmYWQgYWVuZGVybiwgQ2FjaGUgbmV1YmF1ZW4gdW5kIFNhdmVmaWxlIHNwZWljaGVybgorICBwb3Rpb25zW251bSxQT1RfUk9PTU5BTUVdID0gbmV3OworICBSZWJ1aWxkQ2FjaGUoKTsKKyAgc2F2ZV9pbmZvKCk7CisgIE1PRExPRygiTU9ESUZZX1BBVEgiLCBudW0sIG9sZCsiID0+ICIrbmV3KTsKKyAgcmV0dXJuIG51bTsKK30KKworaW50IEFjdGl2YXRlUm9vbShzdHJpbmcgcm9vbSkgeworICBpZiAoICFzZWN1cmUoKSApCisgICAgcmV0dXJuIFBPVF9BQ0NFU1NfREVOSUVEOworICAvLyBBa3R1ZWxsZSBaVC1OdW1tZXIgZXJtaXR0ZWxuLiBFdHdhcyB1bXN0YWVuZGxpY2gsIGRhIGltIEZlaGxlcmZhbGwgLTEKKyAgLy8gYmVub2V0aWd0IHdpcmQuCisgIGludCBudW0gPSBtZW1iZXIocmV2ZXJzZV90YWJsZSxyb29tKSA/IHJldmVyc2VfdGFibGVbcm9vbV0gOiAtMTsKKyAgLy8gTnVtbWVyIG11c3MgZXhpc3RpZXJlbgorICBpZiAoIG51bSA9PSAtMSApCisgICAgcmV0dXJuIFBPVF9JTlZBTElEX1BPVElPTjsKKyAgLy8gWlQgaXN0IG5pY2h0IGluYWt0aXYsIGRhbm4ga2FubiBtYW4gaWhuIGF1Y2ggbmljaHQgYWt0aXZpZXJlbi4KKyAgaWYgKCBtZW1iZXIoaW5hY3RpdmUsIG51bSk9PS0xICkKKyAgICByZXR1cm4gUE9UX0FMUkVBRFlfQUNUSVZFOworICBpbmFjdGl2ZSAtPSAoe251bX0pOworICBSZWJ1aWxkQ2FjaGUoKTsKKyAgc2F2ZV9pbmZvKCk7CisgIE1PRExPRygiQUNUSVZBVEUiLCBudW0sIHJvb20pOworICByZXR1cm4gbnVtOworfQorCitpbnQgU2V0TGlzdE5yKHN0cmluZyByb29tLCBpbnQgbGlzdCkgeworICBpZiAoICFzZWN1cmUoKSApCisgICAgcmV0dXJuIFBPVF9BQ0NFU1NfREVOSUVEOworICAvLyBBa3R1ZWxsZSBaVC1OdW1tZXIgZXJtaXR0ZWxuLiBFdHdhIHVtc3RhZW5kbGljaCwgZGEgaW0gRmVobGVyZmFsbCAtMQorICAvLyBiZW5vZXRpZ3Qgd2lyZC4KKyAgaW50IG51bSA9IG1lbWJlcihyZXZlcnNlX3RhYmxlLHJvb20pID8gcmV2ZXJzZV90YWJsZVtyb29tXSA6IC0xOworICAvLyBOdW1tZXIgbXVzcyBleGlzdGllcmVuCisgIGlmICggbnVtID09IC0xICkKKyAgICByZXR1cm4gUE9UX0lOVkFMSURfUE9USU9OOworICAvLyBMaXN0ZW5udW1tZXIgbXVzcyB6d2lzY2hlbiAwIHVuZCA3IGxpZWdlbi4KKyAgaWYgKCBsaXN0IDwgMCB8fCBsaXN0ID4gNyApCisgICAgcmV0dXJuIFBPVF9JTlZBTElEX0xJU1RfTlVNQkVSOworCisgIC8vIGFsdGUgTnVtbWVyIGF1ZnNjaHJlaWJlbiB6dW0gTG9nZ2VuLgorICBpbnQgb2xkbGlzdCA9IHBvdGlvbnNbbnVtLFBPVF9MSVNUTk9dOworICAvLyBMaXN0ZW5udW1tZXIgaW4gZGVyIFpULUxpc3RlIGFrdHVhbGlzaWVyZW4uCisgIHBvdGlvbnNbbnVtLFBPVF9MSVNUTk9dID0gbGlzdDsKKyAgUmVidWlsZENhY2hlKCk7CisgIHNhdmVfaW5mbygpOworICBNT0RMT0coIk1PRElGWV9MSVNUTk8iLCBudW0sIG9sZGxpc3QrIiAtPiAiK2xpc3QpOworICByZXR1cm4gbnVtOworfQorCitpbnQgRGVhY3RpdmF0ZVJvb20oc3RyaW5nIHJvb20pIHsKKyAgaWYgKCAhc2VjdXJlKCkgKQorICAgIHJldHVybiBQT1RfQUNDRVNTX0RFTklFRDsKKyAgLy8gQWt0dWVsbGUgWlQtTnVtbWVyIGVybWl0dGVsbi4gRXR3YSB1bXN0YWVuZGxpY2gsIGRhIGltIEZlaGxlcmZhbGwgLTEKKyAgLy8gYmVub2V0aWd0IHdpcmQuCisgIGludCBudW0gPSBtZW1iZXIocmV2ZXJzZV90YWJsZSxyb29tKSA/IHJldmVyc2VfdGFibGVbcm9vbV0gOiAtMTsKKyAgLy8gTnVtbWVyIG11c3MgZXhpc3RpZXJlbgorICBpZiAoIG51bSA9PSAtMSApCisgICAgcmV0dXJuIFBPVF9JTlZBTElEX1BPVElPTjsKKyAgLy8gWlQgZGFyZiBuaWNodCBiZXJlaXRzIGluYWt0aXYgc2VpbgorICBpZiAoIG1lbWJlcihpbmFjdGl2ZSxudW0pPi0xICkKKyAgICByZXR1cm4gUE9UX0FMUkVBRFlfSU5BQ1RJVkU7CisgIGluYWN0aXZlICs9ICh7bnVtfSk7CisgIFJlYnVpbGRDYWNoZSgpOworICBzYXZlX2luZm8oKTsKKyAgTU9ETE9HKCJERUFDVElWQVRFIiwgbnVtLCByb29tKTsKKyAgcmV0dXJuIG51bTsKK30KKworcHJpdmF0ZSBpbnQgKl9jcmVhdGVfbGlzdChpbnQgbGlzdG5vLCBpbnQgYW56KSB7CisgIGludCAqbGlzdCA9ICh7fSk7CisgIC8vIExpc3RlbmVyemV1Z3VuZyBsb2hudCBudXIgZGFubiwgd2VubiBtaW5kLiAxIEVpbnRyYWcgZ2Vmb3JkZXJ0IHdpcmQgdW5kCisgIC8vIGRpZSBMaXN0ZW5udW1tZXIgaW0gZ3VlbHRpZ2VuIEJlcmVpY2ggendpc2NoZW4gMCB1bmQgNyBpc3QuCisgIGlmICggYW56PjAgJiYgbGlzdG5vPj0wICYmIGxpc3Rubzw9NyApIHsKKyAgICBpbnQgKnRtcCA9IGxpc3RzW2xpc3Rub10gLSBpbmFjdGl2ZTsKKyAgICAvLyBXZW5uIGRpZSBMaXN0ZW5ncm9lc3NlIG1heGltYWwgZ2VuYXVzbyBncm9zcyBpc3Qgd2llIGRpZSBhbmdlZm9yZGVydGUKKyAgICAvLyBBbnphaGwsIGthbm4gZGllc2Ugdm9sbHN0YWVuZGlnIHVlYmVybm9tbWVuIHdlcmRlbi4KKyAgICBpZiAoIHNpemVvZih0bXApIDw9IGFueiApIHsKKyAgICAgIGxpc3QgPSB0bXA7CisgICAgfSBlbHNlIHsgLy8gYW5zb25zdGVuIHNvdmllbGUgRWludHJhZWdlIGVyemV1Z2VuIHdpZSBhbmdlZm9yZGVydAorICAgICAgZm9yZWFjaChpbnQgaTogYW56KSB7CisgICAgICAgIGludCBqPXJhbmRvbShzaXplb2YodG1wKSk7CisgICAgICAgIGxpc3QgKz0gKHt0bXBbal19KTsKKyAgICAgICAgdG1wIC09ICh7dG1wW2pdfSk7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBsaXN0OworfQorCittaXhlZCAqSW5pdGlhbExpc3QoKSB7CisgIG1peGVkICpsaXN0PSh7fSk7CisgIGZvcmVhY2goaW50IGkgOiA4KQorICAgIGxpc3QrPV9jcmVhdGVfbGlzdChpLE1BWF9ST09NU19QRVJfTElTVCk7CisgIHJldHVybiBsaXN0OworfQorCisvLyBBdWZydWZlIGF1cyBkZW4gU3BpZWxlcnNoZWxscyB1bmQgZGVtIFBvdGlvbnRvb2wgc2luZCBlcmxhdWJ0CitpbnQgSGFzUG90aW9uKG9iamVjdCByb29tKSB7CisgIGlmICggIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUocHJldmlvdXNfb2JqZWN0KCkpICYmIAorICAgICAgIGxvYWRfbmFtZShwcmV2aW91c19vYmplY3QoKSkgIT0gUE9USU9OVE9PTCApCisgICAgcmV0dXJuIFBPVF9BQ0NFU1NfREVOSUVEOworICByZXR1cm4gb2JqZWN0cChyb29tKSA/IHJldmVyc2VfdGFibGVbb2JqZWN0X25hbWUocm9vbSldIDogUE9UX05PX1NVQ0hfUk9PTTsKK30KKworLy8gTGlzdGVubnVtbWVyIGVybWl0dGVsbiwgaW4gZGVyIGRlciBaVCBudW0gZW50aGFsdGVuIGlzdC4KKy8vIEF1Y2ggaW5ha3RpdmUgWlRzIHdlcmRlbiBhbHMgenUgZWluZXIgTGlzdGUgZ2Vob2VyaWcgZ2VtZWxkZXQuCitpbnQgR2V0TGlzdEJ5TnVtYmVyKGludCBudW0pIHsKKyAgcmV0dXJuIG1lbWJlcihwb3Rpb25zLG51bSkgPyBwb3Rpb25zW251bSxQT1RfTElTVE5PXSA6IFBPVF9JTlZBTElEX1BPVElPTjsKK30KKworLy8gTGlzdGVubnVtbWVyIGVybWl0dGVsbiwgaW4gZGVyIGRlciBpbmFrdGl2ZSBaVCBudW0gZW50aGFsdGVuIGlzdC4KKy8vIERhIGFsbGUgWmF1YmVydHJhZW5rZSBpbiBlaW5lciBHZXNhbXRsaXN0ZSBlbnRoYWx0ZW4gc2luZCwga2FubiBkaXJla3QgZGFzCisvLyBSZXN1bHRhdCB2b24gR2V0TGlzdEJ5TnVtYmVyKCkgenVydWVja2dlZ2ViZW4gd2VyZGVuLgoraW50IEdldEluYWN0TGlzdEJ5TnVtYmVyKGludCBudW0pIHsKKyAgaWYgKCBtZW1iZXIoaW5hY3RpdmUsbnVtKSA+IC0xICkKKyAgICByZXR1cm4gR2V0TGlzdEJ5TnVtYmVyKG51bSk7CisgIGVsc2UKKyAgICByZXR1cm4gUE9UX05PVF9JTkFDVElWRTsKK30KKworLy8gV2lyZCBudXIgdm9uIC9vYmovdG9vbHMvcHRvb2wgYXVmZ2VydWZlbi4gV2VubiBkZXIgQXVmcnVmIHp1Z2VsYXNzZW4gd2lyZCwKKy8vIGVyZm9sZ3Qgdm9uIGRvcnQgYXVzIGVpbiBDaGFuZ2VSb29tUGF0aCgpLCB1bmQgZG9ydCB3aXJkIGJlcmVpdHMgZ2Vsb2dndC4KKy8vIEVyem1hZ2llciBkdWVyZmVuIGF1Y2ggYXVmcnVmZW4uCittaXhlZCBHZXRGaWxlbmFtZUJ5TnVtYmVyKGludCBudW0pIHsKKyAgaWYgKCBleHRlcm5fY2FsbCgpICYmIAorICAgICAgIG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSAhPSBQT1RJT05UT09MICYmCisgICAgICAgIUFSQ0hfU0VDVVJJVFkgKQorICAgIHJldHVybiBQT1RfQUNDRVNTX0RFTklFRDsKKyAgaWYgKCAhbWVtYmVyKHBvdGlvbnMsIG51bSkgKQorICAgIHJldHVybiBQT1RfSU5WQUxJRF9QT1RJT047CisgIHJldHVybiBwb3Rpb25zW251bSxQT1RfUk9PTU5BTUVdOworfQorCisvLyBXaXJkIHZvbSBTcGllbGVyb2JqZWt0IGdlcnVmZW47IHVlYmVyZ2ViZW4gd2VyZGVuIGRlciBSYXVtLCBkZXIgaW5pdGlhbAorLy8gRmluZFBvdGlvbigpIGF1ZnJpZWYsIGRpZSBaVC1MaXN0ZSBkZXMgU3BpZWxlcnMgc293aWUgZGllIExpc3RlIGJlcmVpdHMKKy8vIGdlZnVuZGVuZXIgWlRzLgorLy8KKy8vIEluIHN0ZC9wbGF5ZXIvcG90aW9uLmMgaXN0IHNpY2hlcmdlc3RlbGx0LCBkYXNzIHJvb20gZWluIE9iamVrdCBpc3QgdW5kCisvLyBkYXNzIGRpZSBMaXN0ZW4gYWxzIEludC1BcnJheXMgdWViZXJnZWJlbiB3ZXJkZW4uCisvLworLy8gRXMgd2VyZGVuIGF1cyBoaXN0b3Jpc2NoZW4gR3J1ZW5kZW4gKG5vY2gpIGJlaWRlIFpULUxpc3RlbiB1ZWJlcmdlYmVuLAorLy8gYWJlciBlcyBtdXNzIG51ciBrbm93bmxpc3QgdWViZXJwcnVlZnQgd2VyZGVuLCBkYSBkaWVzZSBlaW5lIFRlaWxtZW5nZQorLy8gdm9uIHBvdGlvbmxpc3QgaXN0IHVuZCBzb21pdCBqZWRlciBaVCBpbiBlcnN0ZXJlciBhdWYgamVkZW4gRmFsbCBhdWNoCisvLyBpbiBsZXR6dGVyZXIgZW50aGFsdGVuIHNlaW4gX211c3NfLgoraW50IEluTGlzdChvYmplY3Qgcm9vbSwgaW50ICpwb3Rpb25saXN0LCBpbnQgKmtub3dubGlzdCkgeworICBpZiAoICFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHByZXZpb3VzX29iamVjdCgpKSAmJiAhc2VjdXJlKCkgKQorICAgIHJldHVybiAwOyAvL1BPVF9BQ0NFU1NfREVOSUVEOworICBpbnQgbnVtID0gUXVlcnlBY3RpdmUob2JqZWN0X25hbWUocm9vbSkpOworICAKKyAgLy8gWnVuYWVjaHN0IGtlaW5lbiBGZWhsZXJjb2RlIHp1cnVlY2tnZWJlbiwgd2VpbCBkYXMgU3BpZWxlcm9iamVrdAorICAvLyBkYW1pdCBpbSBNb21lbnQgbm9jaCBuaWNodCB1bWdlaGVuIGthbm4uCisgIGlmICggbnVtIDwgMCApCisgICAgcmV0dXJuIDA7IC8vUE9UX0lOVkFMSURfUE9USU9OOworCisgIHJldHVybiAobWVtYmVyKGtub3dubGlzdCxudW0pPi0xKTsKK30KKworLy8gV2lyZCB2b20gU3BpZWxlcm9iamVrdCBnZXJ1ZmVuLCB1bSBlaW5lbiBnZWZ1bmRlbmVuIFpUIGF1cyBkZXNzZW4gWlQtCisvLyBMaXN0ZW4gYXVzdHJhZ2VuIHp1IGxhc3Nlbi4gRGFzIFNwaWVsZXJvYmpla3Qgc3RlbGx0IHNpY2hlciwgZGFzcyByb29tCisvLyBlaW4gT2JqZWt0IGlzdCwgdW5kIGRhc3MgW2tub3duX11wb3Rpb25yb29tcyBBcnJheXMgc2luZC4KKy8vCisvLyBBQ0hUVU5HISBTb3dvaGwgcG90aW9ucm9vbXMsIGFscyBhdWNoIGtub3duX3BvdGlvbnJvb21zIHNpbmQgZGllCisvLyAgICAgICAgICBPcmlnaW5hbGRhdGVuIGF1cyBkZW0gU3BpZWxlcm9iamVrdCwgZGllIGhpZXIgQUxTIFJFRkVSRU5aCisvLyAgICAgICAgICB1ZWJlcmdlYmVuIHdlcmRlbiEgVm9yc2ljaHQgYmVpIEFlbmRlcnVuZ2VuIGFuIGRlciBGdW5rdGlvbiEKKy8vCisvLyBXZW5uIHN0ZC9wbGF5ZXIvcG90aW9ucy5jIGdlYWVuZGVydCB3aXJkLCBpc3QgZGllc2UgRnVua3Rpb24gb2Jzb2xldAorLy8gPT4gZ2dmLiBrb21wbGV0dCByYXVzd2VyZmVuLiBEYW5uIGthbm4gYXVjaCBkZXIgRmVobGVyY29kZSBpbiBJbkxpc3QoKQorLy8gcmVha3RpdmllcnQgdW5kIGRlcmVuIFBhcmFtZXRlciBrb3JyaWdpZXJ0IHdlcmRlbgordm9pZCBSZW1vdmVMaXN0KG9iamVjdCByb29tLCBpbnQqIHBvdGlvbnJvb21zLCBpbnQqIGtub3duX3BvdGlvbnJvb21zKSB7CisgIC8vIFpUIGlzdCBha3RpdiwgZGFzIHd1cmRlIGJlcmVpdHMgaW4gSW5MaXN0KCkgZ2VwcnVlZnQsIGRhcyB2b3IgZGVtCisgIC8vIEF1ZnJ1ZiB2b24gUmVtb3ZlTGlzdCgpIGF1cyBkZW0gU3BpZWxlcm9iamVrdCBnZXJ1ZmVuIHdpcmQuIERhaGVyIHJlaWNodAorICAvLyBlcyBhdXMsIGRpZSBaVC1OdW1tZXIgYXVzIGRlbSByZXZlcnNlX3RhYmxlIExvb2t1cCB6dSBob2xlbi4KKyAgaW50IG51bSA9IHJldmVyc2VfdGFibGVbb2JqZWN0X25hbWUocm9vbSldOworICBpbnQgdG1wID0gbWVtYmVyKHBvdGlvbnJvb21zLCBudW0pOworICBwb3Rpb25yb29tc1t0bXBdID0gLTE7CisgIHRtcCA9IG1lbWJlcihrbm93bl9wb3Rpb25yb29tcywgbnVtKTsKKyAga25vd25fcG90aW9ucm9vbXNbdG1wXSA9IC0xOworICByZXR1cm47Cit9CisKKyNkZWZpbmUgTElTVEhFQURFUiAiIyMjIyMjIyMjIyMjIyMjIyMjIExpc3RlICVkICMjIyMjIyMjIyMjIyMjIyMjIyAoJWQpXG5cbiIKKyNkZWZpbmUgSU5BQ1RfSEVBREVSICIjIyMjIyMjIyMjIyMjIyMjIyMgSW5ha3RpdiAjIyMjIyMjIyMjIyMjIyMjIyMgKCVkKVxuXG4iCisKK2ludCBEdW1wTGlzdCgpIHsKKyAgaWYgKCAhc2VjdXJlKCkgKQorICAgIHJldHVybiBQT1RfQUNDRVNTX0RFTklFRDsKKyAgLy8gWnVlcnN0IGRpZSBDYWNoZXMgbmV1IGF1ZmJhdWVuLCB1bSBzaWNoZXJ6dXN0ZWxsZW4sIGRhc3MgZGllIExpc3RlbgorICAvLyBha3R1ZWxsIHNpbmQuCisgIFJlYnVpbGRDYWNoZSgpOworICAvLyBEdW1wZmlsZSBsb2VzY2hlbgorICBybShQT1RJT05EVU1QKTsKKyAgLy8gQWxsZSBMaXN0ZW4gZGVyIFJlaWhlIG5hY2ggYWJsYXVmZW4uIEVzIHdpcmQgaW4gamVkZW0gU2NobGVpZmVuZHVyY2hsYXVmCisgIC8vIGVpbm1hbCBhdWYgZGllIFBsYXR0ZSBnZXNjaHJpZWJlbi4gRGFzIGlzdCBBYnNpY2h0LCB3ZWlsIGVzIHNwZWljaGVyLQorICAvLyB0ZWNobmlzY2ggc2VociBhdWZ3ZW5kaWcgd2FlcmUsIGRpZSBBdXNnYWJlZGF0ZW4gc3RhdHRkZXNzZW4gZXJzdCBpbgorICAvLyBlaW5lciBWYXJpYWJsZW4genUgc2FtbWVsbiB1bmQgZGFubiB3ZWd6dXNjaHJlaWJlbi4KKyAgZm9yZWFjaChpbnQgKmxpc3RubyA6IHNvcnRfYXJyYXkobV9pbmRpY2VzKGxpc3RzKSwjJz4pKSB7CisgICAgLy8gWnVlcnN0IGRlbiBIZWFkZXIgZGVyIGVuc3ByZWNoZW5kZW4gTGlzdGUgc2NocmVpYmVuLgorICAgIERVTVAoc3ByaW50ZihMSVNUSEVBREVSLCBsaXN0bm8sIHNpemVvZihsaXN0c1tsaXN0bm9dKSkpOworICAgIC8vIERhbm4gYWxsZSBQb3Rpb25zIGRlciBMaXN0ZSBkdXJjaGdlaGVuCisgICAgZm9yZWFjaChpbnQgcG90aW9uIDogbGlzdHNbbGlzdG5vXSkgeworICAgICAgLy8gV2VubiBkZXIgWlQgaW5ha3RpdiBpc3QsIHVlYmVyc3ByaW5nZW4gd2lyIGRlbi4KKyAgICAgIGlmICggbWVtYmVyKGluYWN0aXZlLHBvdGlvbik+LTEgKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIFJhdW1wZmFkIGF1cyBkZXIgR2VzYW10bGlzdGUgaG9sZW4uCisgICAgICBzdHJpbmcgc3RyID0gcG90aW9uc1twb3Rpb24sUE9UX1JPT01OQU1FXTsKKyAgICAgIC8vIFdlbm4gZGVyIG5pY2h0IGV4aXN0aWVydCwgZW50c3ByZWNoZW5kZW4gSGlud2VpcyBkdW1wZW4sIGFuc29uc3RlbgorICAgICAgLy8gZGVuIFJhdW1uYW1lbi4KKyAgICAgIC8vWlo6IGljaCBmaW5kZSBqYSwgd2lyIHNvbGx0ZW4gc2ljaGVyc3RlbGxlbiwgZGFzcyBkYXMgbmljaHQgbWVocgorICAgICAgLy9wYXNzaWVydC4gSXN0IGRhcyBtaXQgZGVtIEFkZFBvdGlvblJvb20gb2JlbiBuaWNodCBzY2hvbiBzbz8KKyAgICAgIGlmICggIXN0cmluZ3Aoc3RyKSB8fCAhc2l6ZW9mKHN0cikgKQorICAgICAgICBzdHI9IktFSU4gUkFVTSBaVUdFT1JETkVUISEhIjsKKyAgICAgIERVTVAoc3ByaW50ZigiJTNkLiAlc1xuIiwgcG90aW9uLCBzdHIpKTsKKyAgICB9CisgICAgLy8gMiBMZWVyemVpbGVuIHp3aXNjaGVuIGplZGVyIEdydXBwZSBlaW5mdWVnZW4KKyAgICBEVU1QKCJcblxuIik7CisgIH0KKyAgLy8gWnVtIFNjaGx1c3MgZGVuIEhlYWRlciBkZXIgSW5ha3Rpdi1MaXN0ZSBzY2hyZWliZW4uCisgIERVTVAoc3ByaW50ZihJTkFDVF9IRUFERVIsIHNpemVvZihpbmFjdGl2ZSkpKTsKKyAgLy8gRGFubiBhbGxlIGluYWt0aXZlbiBQb3Rpb25zIGFibGF1ZmVuCisgIGZvcmVhY2goaW50IGkgOiBpbmFjdGl2ZSkgeworICAgIC8vWlo6IHNvbnN0IG11ZXNzdGUgbWFuIGhpZXIgd29obCBhdWNoIGF1ZiBkZW4gZmVobGVuZGVuIFJhdW0gcHJ1ZWZlbi4KKyAgICBEVU1QKHNwcmludGYoIiUzZC4gKExpc3RlICVkKSAlc1xuIiwgaSwgR2V0TGlzdEJ5TnVtYmVyKGkpLAorICAgICAgcG90aW9uc1tpLFBPVF9ST09NTkFNRV0pKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworLy9PUkFLRUwtUm91dGluZW4KKworLyogQXVmYmF1IGVpbmVzIFRpcHM6CisKKyAgIFRyYWxhbGEsIGxhbGFsYQorICAgRGlkZWxkYWRlbGR1bQorICAgSHVwcHNkaXd1cHBzCisgICBYWFhYWAorICAgTm9jaCBlaW4gendlaXRlciBUaXAKKyAgIERpbmdlbGRvbmcKKyAgICUlJSUlCisKKyAgIERpZSBQcm96ZW50emVpY2hlbiBzaW5kIGRhcyBFbmRlemVpY2hlbiwgYWIgaGllciBrb2VubmVuIGV2ZW50dWVsbGUKKyAgIEtvbW1lbnRhcmUgc3RlaGVuLiBEaWUgNSBYIHNpbmQgZGFzIFRyZW5uemVpY2hlbiB6d2lzY2hlbiB6d2VpIFRpcHMKKyAgIHp1bSBzZWxiZW4gWlQuCisqLworCisvLyBUSVBMT0coKSBkZXJ6ZWl0IHVuYmVudXR6dAorLy8jZGVmaW5lIExPR0ZJTEVfUkVBRCAgICAiQVJDSC9QT1RJT05TX1RJUF9SRUFELmxvZyIKKy8vI2RlZmluZSBUSVBMT0coeCkgICAgICBsb2dfZmlsZShMT0dGSUxFX1JFQUQsIHgpCisKK21peGVkIFRpcExlc2VuKGludCBudW0pIHsKKyAgc3RyaW5nICpyZXQgPSB0aXBtYXBbbnVtXTsKKyAgLy9GdW5rdGlvbiBkYXJmIG51ciB2b20gT3Jha2VsIHVuZCBFTSsgZ2VydWZlbiB3ZXJkZW4uCisgIGlmICggcHJldmlvdXNfb2JqZWN0KCkgIT0gZmluZF9vYmplY3QoT1JBS0VMKSAmJiAhc2VjdXJlKCkgKQorICAgIHJldHVybiBQT1RfQUNDRVNTX0RFTklFRDsKKyAgLy8gRGVyemVpdCBrZWluIExvZywgZGEgZGllc2UgSW5mb3JtYXRpb25lbiB0ZW5kZW50aWVsbCBlaGVyIAorICAvLyB1bmludGVyZXNzYW50IHNpbmQuCisgIC8vIFRpbWVzdGFtcCBpc3Qgdm9tIEZvcm1hdCAiMjAxMi1Pa3QtMDMgMTQ6MTgiCisgIC8qVElQTE9HKHNwcmludGYoIiVzIFpULVRpcCBnZWxlc2VuOiAlZCB2b24gVFA6ICVPLCBQTzogJU8sIFRJOiAlT1xuIiwKKyAgICBzdHJmdGltZSgiJVktJWItJWQgJVIiKSwgbnVtLCB0aGlzX3BsYXllcigpLCBwcmV2aW91c19vYmplY3QoKSwKKyAgICB0aGlzX2ludGVyYWN0aXZlKCkpKTsqLworCisgIC8vIFpULVNwcnVjaCBpc3QgYmVyZWl0cyBpbSBUaXAtQ2FjaGUgZW50aGFsdGVuLCBkYW5uIGRpcmVrdCBhdXNnZWJlbi4KKyAgaWYgKCBwb2ludGVycChyZXQpICkKKyAgICByZXR1cm4gcmV0OworICAKKyAgLy8gWlQtU3BydWNoIGF1ZiBncnVuZGxlZ2VuZGUgc3ludGFrdGlzY2hlIEtvcnJla3RoZWl0IHBydWVmZW46CisgIC8vIGV4cGxvZGUoKSBsaWVmZXJ0IGVpbiBBcnJheSBtaXQgMiBFbGVtZW50ZW4sIHdlbm4gZGllIEVuZGUtTWFya2llcnVuZworICAvLyB2b3JoYW5kZW4gdW5kIHNvbWl0IGRhcyBGaWxlIGRpZXNiZXp1ZWdsaWNoIGtvcnJla3QgYXVmZ2ViYXV0IGlzdC4KKyAgc3RyaW5nICp0aXA9ZXhwbG9kZSggcmVhZF9maWxlKFRJUFMobnVtKyIuenQiKSl8fCIiLCAiJSUlJSUiICk7CisgIGlmIChzaXplb2YodGlwKSA+PSAyKSB7CisgICAgLy8gRGVyIGVyc3RlIEVpbnRyYWcgaW4gZGVtIEFycmF5IGlzdCBkYW5uIGRlciBTcHJ1Y2guIFdlbm4gZGllc2VyCisgICAgLy8gZGllIFRyZW5uLU1hcmtpZXJ1bmcgZW50aGFlbHQsIGVudHN0ZWhlbiBoaWVyIDIgSGlud2Vpc2UsIGFuc29uc3RlbgorICAgIC8vIGJsZWlidCBlcyBiZWkgZWluZW0uCisgICAgdGlwbWFwW251bV0gPSBleHBsb2RlKHRpcFswXSwgIlhYWFhYXG4iKTsKKyAgICByZXR1cm4gdGlwbWFwW251bV07CisgIH0KKyAgcmV0dXJuIFBPVF9OT19TVUNIX0ZJTEU7Cit9CisKKy8vIERhdGVua29udmVydGllcnVuZyBhbHRlIEFsaXN0cyA9PiBNYXBwaW5ncworLyptYXBwaW5nIENvbnZlcnREYXRhKCkgeworICAvL2lmICggIXNlY3VyZSgpKSApIHJldHVybjsKKyAgLy8gYWxsX3Jvb21zIGlzdCBlaW5lIEFsaXN0IGRlciBGb3JtICh7IHN0cmluZyAqcm9vbSwgaW50ICpudW1iZXIgfSkKKyAgLy8gYWxzIDMuIEVpbnRyYWcgc2NocmVpYmVuIHdpciB1ZWJlcmFsbCAtMSByZWluLCBkYXMgd2lyZCBzcGFldGVyIGR1cmNoIGRpZQorICAvLyBMaXN0ZW5udW1tZXIgZGVzIGJldHJlZmZlbmRlbiBaVHMgZXJzZXR6dCB1bmQgZXJsYXVidCBlaW5lbiBlaW5mYWNoZW4KKyAgLy8gQ2hlY2sgYXVmIERhdGVua29uc2lzdGVuei4KKyAgcG90aW9ucyA9IG1rbWFwcGluZyggYWxsX3Jvb21zWzFdLAorICAgICAgICAgICAgICAgICAgICAgICBhbGxfcm9vbXNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlKHNpemVvZihhbGxfcm9vbXNbMF0pLCAtMSkgKTsKKyAgLy8gQWxsZSBMaXN0ZW4gYWJsYXVmZW4KKyAgZm9yZWFjaChpbnQgKmxpc3Q6IGFjdGl2ZV9yb29tcyApIHsKKyAgICAvLyBBbGxlIFpUcyBkaWVzZXIgTGlzdGUgYWJsYXVmZW4gdW5kIGRpZSBlbnRzcHJlY2hlbmRlIExpc3Rlbm51bW1lciBpbgorICAgIC8vIGRlciBuZXVlbiBEYXRlbnN0cnVrdHVyIHNldHplbi4KKyAgICBmb3JlYWNoKGludCBudW06IGxpc3QpIHsKKyAgICAgIHBvdGlvbnNbbnVtLFBPVF9MSVNUTk9dID0gbWVtYmVyKGFjdGl2ZV9yb29tcyxsaXN0KTsKKyAgICB9CisgIH0KKyAgLy8gaW5hY3RpdmVfcm9vbXMgaXN0IGVpbmUgQWxpc3QgZGVyIGdsZWljaGVuIEZvcm0uIERpZSBTY2hsZWlmZSBhZGRpZXJ0CisgIC8vIGVpbmZhY2ggYWxsZSBFaW50cmFlZ2UgZGFyaW4gYXVmLCBzbyBkYXNzIGVpbiBJbnQtQXJyYXkgZW50c3RlaHQsIGRhcworICAvLyBhbGxlIGluYWt0aXZlbiBaVC1OdW1tZXJuIGVudGhhZWx0OyBkYXMgYWxsZXJkaW5ncyBudXIgZnVlciBMaXN0ZW4gbWl0CisgIC8vIG1pbmRlc3RlbnMgZWluZW0gRWxlbWVudC4KKyAgZm9yZWFjaChpbnQgKmxpc3QgOiBpbmFjdGl2ZV9yb29tcyApIHsKKyAgICBpZiAoIHNpemVvZihsaXN0KSApIHsKKyAgICAgIGluYWN0aXZlICs9IGxpc3Q7CisgICAgICAvLyBBbGxlIFpUcyBkaWVzZXIgTGlzdGUgYWJsYXVmZW4gdW5kIGRpZSBlbnRzcHJlY2hlbmRlIExpc3Rlbm51bW1lciBpbgorICAgICAgLy8gZGVyIG5ldWVuIERhdGVuc3RydWt0dXIgc2V0emVuLgorICAgICAgZm9yZWFjaChpbnQgbnVtIDogbGlzdCkgeworICAgICAgICBwb3Rpb25zW251bSxQT1RfTElTVE5PXSA9IG1lbWJlcihpbmFjdGl2ZV9yb29tcyxsaXN0KTsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gdW5pZnkgYXJyYXkKKyAgICBpbmFjdGl2ZSA9IG1faW5kaWNlcyhta21hcHBpbmcoaW5hY3RpdmUpKTsKKyAgfQorICBtYXBwaW5nIGludmFsaWQgPSAoWyBQT1RfSU5WQUxJRF9MSVNUX05VTUJFUiA6ICh7fSkgXSk7CisgIHdhbGtfbWFwcGluZyhwb3Rpb25zLCBmdW5jdGlvbiB2b2lkIChpbnQgcG51bSwgc3RyaW5nIHBhdGgsIGludCBsaXN0bm8pIHsKKyAgICBpZiAoIGxpc3RubyA9PSAtMSApCisgICAgICBpbnZhbGlkW1BPVF9JTlZBTElEX0xJU1RfTlVNQkVSXSArPSAoe3BudW19KTsKKyAgfSk7CisgIHJldHVybiBzaXplb2YoaW52YWxpZFtQT1RfSU5WQUxJRF9MSVNUX05VTUJFUl0pID8gaW52YWxpZCA6IHBvdGlvbnM7Cit9Ki8KKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL3B1Ym1hc3Rlci5jIGIvc2VjdXJlL3B1Ym1hc3Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMjQ4ODkKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvcHVibWFzdGVyLmMKQEAgLTAsMCArMSwzMDcgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBQdWJtYXN0ZXIuYyAtLSBSZWdpc3RyYXRpbmcgdGhlIGhlYWwtdmFsdWVzIG9mIHB1YnMKKy8vCisvLyAkSWQ6IHB1Ym1hc3Rlci5jIDkzNzMgMjAxNS0xMC0yMiAxOTowMjo0MlogWmVzc3RyYSAkCisKKyNpbmNsdWRlIDxwdWIuaD4KKworI2RlZmluZSBTQVZFRklMRSAiL3NlY3VyZS9BUkNIL3B1YiIKKyNkZWZpbmUgQ0xPR0ZJTEUgIi9sb2cvQVJDSC9wdWJjaGFuZ2UiCisjZGVmaW5lIERVTVBGSUxFICIvbG9nL0FSQ0gvUFVCUyIKKyNkZWZpbmUgRFVNUExJU1QgIi9sb2cvQVJDSC9QVUJMSVNUIgorCisjZGVmaW5lIERVTVBGKHN0cikgd3JpdGVfZmlsZShEVU1QRklMRSxzdHIpCisjZGVmaW5lIERVTVBMKHN0cikgd3JpdGVfZmlsZShEVU1QTElTVCxzdHIpCisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8aGVhbHRoLmg+CisKK21hcHBpbmcgcHViczsKK25vc2F2ZSBzdHJpbmcgICp3YXRjaHByb3BzOworbm9zYXZlIGludCAgICAgd2F0Y2hzaXplOworCit2b2lkIGNyZWF0ZSgpCit7CisgICAgc2V0ZXVpZChnZXR1aWQodGhpc19vYmplY3QoKSkpOworICAgIGlmIChjbG9uZXAodGhpc19vYmplY3QoKSkpCisgICAgeworICAgICAgICBkZXN0cnVjdCh0aGlzX29iamVjdCgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIXJlc3RvcmVfb2JqZWN0KFNBVkVGSUxFKSkKKyAgICAgICAgcHVicyA9IChbXSk7CisKKyAgICB3YXRjaHByb3BzID0gKHsgUF9IUCwgUF9TUCwgUF9BTENPSE9MLCBQX0RSSU5LLCBQX0ZPT0QsIFBfVkFMVUUsCisgICAgICAgICAgICAgICAgICAgICJyYXRlIiwgImRlbGF5IiB9KTsKKyAgICB3YXRjaHNpemUgID0gc2l6ZW9mKHdhdGNocHJvcHMpOworfQorCit2b2lkIHNhdmVfZGF0YSgpCit7CisgICAgc2F2ZV9vYmplY3QoU0FWRUZJTEUpOworfQorCitpbnQgQ2FsY01heChtYXBwaW5nIGluZm8sIHN0cmluZyBmbikKK3sgICBmbG9hdCBoZWFsLGRlbGF5LGZhY3RvcjsKKworICAgIGlmICghaW5mbyB8fCAhbWFwcGluZ3AoaW5mbykpCisgICAgICAgIHJldHVybiAwOworICAgIGlmICggKGluZm9bUF9BTENPSE9MXStpbmZvW1BfRFJJTktdK2luZm9bUF9GT09EXSk8PTAgICAgIHx8CisgICAgICAgICAoaW5mb1tQX0FMQ09IT0xdICYmICEoaW5mb1tQX0RSSU5LXXx8aW5mb1tQX0ZPT0RdKSkgKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGRlbGF5ID0gdG9fZmxvYXQoaW5mb1siZGVsYXkiXSk7CisgICAgaWYgKGRlbGF5PlBVQl9NQVhERUxBWSkKKyAgICAgICAgZGVsYXk9UFVCX01BWERFTEFZOworCisgICAgaWYgKCFzdHJpbmdwKGZuKSB8fCAhbWVtYmVyKHB1YnMsZm4pKSAvLyBFeHRlcm5hbCBxdWVyeT8KKyAgICAgICAgZmFjdG9yPTEuMDsKKyAgICBlbHNlCisgICAgICAgIGZhY3Rvcj1wdWJzW2ZuLDFdOworCisgICAgaGVhbCA9IHRvX2Zsb2F0KCBpbmZvW1BfQUxDT0hPTF0qQUxDT0hPTF9ERUxBWSArCisgICAgICAgICAgICAgICAgICAgICBpbmZvW1BfRFJJTktdICAqRFJJTktfREVMQVkgICArCisgICAgICAgICAgICAgICAgICAgICBpbmZvW1BfRk9PRF0gICAqRk9PRF9ERUxBWSAgICApIAorICAgICAgICAgICAqIFBVQl9TT0FLTVVMVAorICAgICAgICAgICAvIHRvX2Zsb2F0KCBBTENPSE9MX0RFTEFZICsgRFJJTktfREVMQVkgKyBGT09EX0RFTEFZICk7CisgICAgaGVhbCA9IGhlYWwgKyAKKyAgICAgICAgICAgdG9fZmxvYXQoaW5mb1tQX1ZBTFVFXSkvKFBVQl9WQUxVRURJVit0b19mbG9hdChpbmZvWyJyYXRlIl0pKSAtCisgICAgICAgICAgIGV4cCh0b19mbG9hdChpbmZvWyJyYXRlIl0pL1BVQl9SQVRFRElWMSkvUFVCX1JBVEVESVYyOworICAgIGhlYWwgPSBoZWFsICogZmFjdG9yICoKKyAgICAgICAgICAgKFBVQl9XQUlUT0ZGUyArIChleHAoZGVsYXkvUFVCX1dBSVRESVYxKS9QVUJfV0FJVERJVjIpKTsKKworICAgIHJldHVybiB0b19pbnQoaGVhbCk7Cit9CisKK2ludCBSZWdpc3Rlckl0ZW0oc3RyaW5nIGl0ZW0sIG1hcHBpbmcgaW5mbykKK3sgICBvYmplY3QgcHViOworICAgIHN0cmluZyBmbjsKKyAgICBpbnQgICAgaSxjLGNtYXgsbWF4LGhlYWw7CisKKyAgICBpZiAoIW9iamVjdHAocHViPXByZXZpb3VzX29iamVjdCgpKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChtZW1iZXIoaW5oZXJpdF9saXN0KHB1YiksICIvc3RkL3Jvb20vcHViLmMiKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICghaXRlbSB8fCAhc3RyaW5ncChpdGVtKSB8fCAhaW5mbyB8fCAhbWFwcGluZ3AoaW5mbykpCisgICAgICAgIHJldHVybiAtMjsKKworICAgIGlmIChpbmZvWyJyYXRlIl08MSkKKyAgICAgICAgaW5mb1sicmF0ZSJdPTE7CisgICAgaWYgKGluZm9bImRlbGF5Il08MCkKKyAgICAgICAgaW5mb1siZGVsYXkiXT0wOworCisgICAgLy8gTG9hZG5hbWUsIHdlaWwgVkNzIGFscyBlaW4gUHViIHphZWhsZW4gc29sbGVuIChkYXMgVHV0b3JpYWwgaGF0IGVpbgorICAgIC8vIFZDLVB1YiBmdWVyIGplZGVuIFNwaWVsZXIuIERpZSBzb2xsZW4gbmljaHQgYWxsZSBlaW56ZWxuIGhpZXIgZXJmYXNzdAorICAgIC8vIHdlcmRlbi4KKyAgICBmbiA9IGxvYWRfbmFtZShwdWIpOworICAgIGMgPSAwOworCisgICAgaGVhbD1pbmZvW1BfSFBdK2luZm9bUF9TUF07CisKKyAgICBpZiAoIW1lbWJlcihwdWJzLGZuKSkKKyAgICAgICAgcHVicyArPSAoWyBmbiA6IChbXSk7IDEuMCBdKTsKKworICAgIGlmICghbWVtYmVyKHB1YnNbZm5dLGl0ZW0pKQorICAgIHsKKyAgICAgICAgbWF4PUNhbGNNYXgoaW5mbyxmbik7CisgICAgICAgIHB1YnNbZm5dICs9IChbIAorICAgICAgICAgICAgaXRlbSA6IChbCisgICAgICAgICAgICAgICAgUF9IUCAgICAgICAgICAgIDogaW5mb1tQX0hQXSwKKyAgICAgICAgICAgICAgICBQX1NQICAgICAgICAgICAgOiBpbmZvW1BfU1BdLAorICAgICAgICAgICAgICAgIFBfVkFMVUUgICAgICAgICA6IGluZm9bUF9WQUxVRV0sCisgICAgICAgICAgICAgICAgUF9EUklOSyAgICAgICAgIDogaW5mb1tQX0RSSU5LXSwKKyAgICAgICAgICAgICAgICBQX0FMQ09IT0wgICAgICAgOiBpbmZvW1BfQUxDT0hPTF0sCisgICAgICAgICAgICAgICAgUF9GT09EICAgICAgICAgIDogaW5mb1tQX0ZPT0RdLAorICAgICAgICAgICAgICAgICJyYXRlIiAgICAgICAgICA6IGluZm9bInJhdGUiXSwKKyAgICAgICAgICAgICAgICAiZGVsYXkiICAgICAgICAgOiBpbmZvWyJkZWxheSJdLAorICAgICAgICAgICAgICAgICJtYXhoZWFsIiAgICAgICA6IGhlYWwsCisgICAgICAgICAgICAgICAgIm1heHJhdGUiICAgICAgIDogMTAKKyAgICAgICAgICAgICAgICBdKQorICAgICAgICAgICAgXSk7CisgICAgICAgIGM9MTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yIChpPXdhdGNoc2l6ZS0xO2k+PTA7aS0tKQorICAgICAgICAgICAgaWYgKGluZm9bd2F0Y2hwcm9wc1tpXV0hPXB1YnNbZm5dW2l0ZW1dW3dhdGNocHJvcHNbaV1dKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHB1YnNbZm5dW2l0ZW1dW3dhdGNocHJvcHNbaV1dPWluZm9bd2F0Y2hwcm9wc1tpXV07CisgICAgICAgICAgICAgICAgYz0xOworICAgICAgICAgICAgfQorICAgICAgICBpZiAoaGVhbD5wdWJzW2ZuXVtpdGVtXVsibWF4aGVhbCJdKQorICAgICAgICB7CisgICAgICAgICAgICBwdWJzW2ZuXVtpdGVtXVsibWF4aGVhbCJdPWhlYWw7CisgICAgICAgICAgICBjPTE7CisgICAgICAgIH0KKyAgICAgICAgbWF4PXB1YnNbZm5dW2l0ZW1dWyJtYXhzZXQiXTsKKyAgICAgICAgY21heD1DYWxjTWF4KGluZm8sZm4pOworICAgICAgICBpZiAoY21heD5tYXgpCisgICAgICAgICAgICBtYXg9Y21heDsKKyAgICB9CisKKyAgICBpZiAoYykKKyAgICAgICAgc2F2ZV9kYXRhKCk7CisKKyAgICBpZiAoIGhlYWw+bWF4IHx8IGluZm9bInJhdGUiXT5wdWJzW2ZuXVtpdGVtXVsibWF4cmF0ZSJdICkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gMTsKK30KKworcHJpdmF0ZSBpbnQgYWxsb3dlZCgpCit7CisgIGlmIChwcmV2aW91c19vYmplY3QoKSAmJiBnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKT09Uk9PVElEKQorICAgIHJldHVybiAxOworICBpZiAoIXByb2Nlc3NfY2FsbCgpICYmIHByZXZpb3VzX29iamVjdCgpICYmIEFSQ0hfU0VDVVJJVFkpCisgICAgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCisKKworaW50IFNldE1heEhlYWwoc3RyaW5nIHB1Yiwgc3RyaW5nIGl0ZW0sIGludCBuZXcpCit7ICAgaW50IG9sZDsKKworICAgIGlmICghYWxsb3dlZCgpKQorICAgICAgICByZXR1cm4gLTI7CisgICAgaWYgKCFwdWIgfHwgIXN0cmluZ3AocHViKSB8fCAhaXRlbSB8fCAhc3RyaW5ncChpdGVtKSB8fCAhbmV3KQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKCFtZW1iZXIocHVicyxwdWIpIHx8ICFtZW1iZXIocHVic1twdWJdLGl0ZW0pKQorICAgICAgICByZXR1cm4gMDsKKyAgICBvbGQ9cHVic1twdWJdW2l0ZW1dWyJtYXhzZXQiXTsKKyAgICBwdWJzW3B1Yl1baXRlbV1bIm1heHNldCJdPW5ldzsKKyAgICB3cml0ZV9maWxlKENMT0dGSUxFLAorICAgICAgICBzcHJpbnRmKCIlcyAtICVzXG4lczolcyBIRUFMICVkID4gJWRcbiIsCisgICAgICAgICAgICBkdGltZSh0aW1lKCkpLAorICAgICAgICAgICAgKHRoaXNfaW50ZXJhY3RpdmUoKSA/IGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpIDogIj8/PyIpLAorICAgICAgICAgICAgcHViLGl0ZW0sb2xkLG5ldykpOworICAgIHNhdmVfZGF0YSgpOworICAgIHJldHVybiAxOworfQorCitpbnQgU2V0TWF4UmF0ZShzdHJpbmcgcHViLCBzdHJpbmcgaXRlbSwgaW50IG5ldykKK3sgICBpbnQgb2xkOworCisgICAgaWYgKCFhbGxvd2VkKCkpCisgICAgICAgIHJldHVybiAtMjsKKyAgICBpZiAoIXB1YiB8fCAhc3RyaW5ncChwdWIpIHx8ICFpdGVtIHx8ICFzdHJpbmdwKGl0ZW0pIHx8ICFuZXcpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoIW1lbWJlcihwdWJzLHB1YikgfHwgIW1lbWJlcihwdWJzW3B1Yl0saXRlbSkpCisgICAgICAgIHJldHVybiAwOworICAgIG9sZD1wdWJzW3B1Yl1baXRlbV1bIm1heHJhdGUiXTsKKyAgICBwdWJzW3B1Yl1baXRlbV1bIm1heHJhdGUiXT1uZXc7CisgICAgd3JpdGVfZmlsZShDTE9HRklMRSwKKyAgICAgICAgc3ByaW50ZigiJXMgLSAlc1xuJXM6JXMgUkFURSAlZCA+ICVkXG4iLAorICAgICAgICAgICAgZHRpbWUodGltZSgpKSwKKyAgICAgICAgICAgICh0aGlzX2ludGVyYWN0aXZlKCkgPyBnZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpKSA6ICI/Pz8iKSwKKyAgICAgICAgICAgIHB1YixpdGVtLG9sZCxuZXcpKTsKKyAgICBzYXZlX2RhdGEoKTsKKyAgICByZXR1cm4gMTsKK30KKworaW50IFNldFB1YkZhY3RvcihzdHJpbmcgcHViLCBmbG9hdCBuZXcpCit7ICAgZmxvYXQgb2xkOworCisgICAgaWYgKCFhbGxvd2VkKCkpCisgICAgICAgIHJldHVybiAtMjsKKyAgICBpZiAoIXB1YiB8fCAhc3RyaW5ncChwdWIpIHx8ICFuZXcgfHwgIWZsb2F0cChuZXcpIHx8IG5ldzwxLjAgfHwgbmV3PjEuNSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICghbWVtYmVyKHB1YnMscHViKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgb2xkPXB1YnNbcHViLDFdOworICAgIHB1YnNbcHViLDFdPW5ldzsKKyAgICB3cml0ZV9maWxlKENMT0dGSUxFLAorICAgICAgICBzcHJpbnRmKCIlcyAtICVzXG4lcyBGQUNUICU2LjRmID4gJTYuNGZcbiIsCisgICAgICAgICAgICBkdGltZSh0aW1lKCkpLAorICAgICAgICAgICAgKHRoaXNfaW50ZXJhY3RpdmUoKSA/IGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpIDogIj8/PyIpLAorICAgICAgICAgICAgcHViLG9sZCxuZXcpKTsKKyAgICBzYXZlX2RhdGEoKTsKKyAgICByZXR1cm4gMTsKK30KKwordmFyYXJncyBpbnQgQ2xlYXJQdWIoc3RyaW5nIHB1Yiwgc3RyaW5nIGl0ZW0pCit7CisgICAgaWYgKCFhbGxvd2VkKCkpCisgICAgICAgIHJldHVybiAtMjsKKyAgICBpZiAoIXB1YiB8fCAhc3RyaW5ncChwdWIpIHx8IChpdGVtICYmICFzdHJpbmdwKGl0ZW0pKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICghbWVtYmVyKHB1YnMscHViKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCFpdGVtKQorICAgICAgICBtX2RlbGV0ZShwdWJzLHB1Yik7CisgICAgZWxzZSBpZiAoIW1lbWJlcihwdWJzW3B1Yl0saXRlbSkpCisgICAgICAgIHJldHVybiAwOworICAgIGVsc2UKKyAgICAgIG1fZGVsZXRlKHB1YnNbcHViXSxpdGVtKTsKKyAgICBzYXZlX2RhdGEoKTsKKyAgICByZXR1cm4gMTsKK30KKworaW50IER1bXBQdWJzKCkKK3sgICBzdHJpbmcgKnB1Ymxpc3QsKml0ZW1saXN0OworICAgIGludCAgICBwdWJpLGl0ZW1pOworCisgICAgaWYgKCFhbGxvd2VkKCkpCisgICAgICAgIHJldHVybiAtMjsKKyAgICBpZiAoZmlsZV9zaXplKERVTVBGSUxFKT4xKQorICAgICAgICBybShEVU1QRklMRSk7CisgICAgaWYgKGZpbGVfc2l6ZShEVU1QTElTVCk+MSkKKyAgICAgICAgcm0oRFVNUExJU1QpOworICAgIERVTVBGKHNwcmludGYoIktuZWlwZW4tTWVudS1MaXN0ZSB2b20gJXM6XG5cbiIsZHRpbWUodGltZSgpKSkpOworICAgIERVTVBMKHNwcmludGYoIktuZWlwZW5saXN0ZSB2b20gJXM6XG5cbiIsZHRpbWUodGltZSgpKSkpOworICAgIHB1Ymxpc3Q9c29ydF9hcnJheShtX2luZGljZXMocHVicyksIyc8LyonKi8pOworICAgIGlmICgocHViaT1zaXplb2YocHVibGlzdCkpPDEpCisgICAgeworICAgICAgICBEVU1QRigiTm8gcHVicyBpbiBMaXN0XG4iKTsKKyAgICAgICAgRFVNUEwoIk5vIHB1YnMgaW4gTGlzdFxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZm9yICgtLXB1Ymk7cHViaT49MDtwdWJpLS0pCisgICAgeworICAgICAgICBEVU1QTChzcHJpbnRmKCIlLScuJzcwcyAlNi40ZlxuIiwKKyAgICAgICAgICAgIHB1Ymxpc3RbcHViaV0scHVic1twdWJsaXN0W3B1YmldLDFdKSk7CisgICAgICAgIERVTVBGKHNwcmludGYoIlBVQjogJXNcbkZBQzogJTYuNGZcblxuIiwKKyAgICAgICAgICAgIHB1Ymxpc3RbcHViaV0scHVic1twdWJsaXN0W3B1YmldLDFdKSk7CisgICAgICAgIGl0ZW1saXN0PXNvcnRfYXJyYXkobV9pbmRpY2VzKHB1YnNbcHVibGlzdFtwdWJpXV0pLCMnPC8qJyovKTsKKyAgICAgICAgaWYgKChpdGVtaT1zaXplb2YoaXRlbWxpc3QpKTwxKQorICAgICAgICB7CisgICAgICAgICAgICBEVU1QRigiICBObyBpdGVtcyBpbiBsaXN0XG5cbiIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgRFVNUEYoc3ByaW50ZigKKyAgICAgICAgICAgICIgICV8J18nMzAuMzBzICU1cyAlM3MgJTNzICUzcyAlM3MgJTNzICUycyAlMnMgJTNzICUzc1xuIiwKKyAgICAgICAgICAgICJJVEVNIiwiVkFMVUUiLCJIUEgiLCJTUEgiLCJEUkkiLCJBTEMiLCJGT08iLCJSQSIsIk1SIiwiTUFYIiwKKyAgICAgICAgICAgICJGTkQiKSk7CisgICAgICAgIGZvciAoLS1pdGVtaTtpdGVtaT49MDtpdGVtaS0tKQorICAgICAgICAgICAgRFVNUEYoc3ByaW50ZigKKyAgICAgICAgICAgICAgICAiICAlLScuJzMwLjMwcyAlNWQgJTNkICUzZCAlM2QgJTNkICUzZCAlMmQgJTJkICUzZCAlM2RcbiIsCisgICAgICAgICAgICAgICAgaXRlbWxpc3RbaXRlbWldLAorICAgICAgICAgICAgICAgIChpbnQpcHVic1twdWJsaXN0W3B1YmldXVtpdGVtbGlzdFtpdGVtaV1dW1BfVkFMVUVdLAorICAgICAgICAgICAgICAgIChpbnQpcHVic1twdWJsaXN0W3B1YmldXVtpdGVtbGlzdFtpdGVtaV1dW1BfSFBdLAorICAgICAgICAgICAgICAgIChpbnQpcHVic1twdWJsaXN0W3B1YmldXVtpdGVtbGlzdFtpdGVtaV1dW1BfU1BdLAorICAgICAgICAgICAgICAgIChpbnQpcHVic1twdWJsaXN0W3B1YmldXVtpdGVtbGlzdFtpdGVtaV1dW1BfRFJJTktdLAorICAgICAgICAgICAgICAgIChpbnQpcHVic1twdWJsaXN0W3B1YmldXVtpdGVtbGlzdFtpdGVtaV1dW1BfQUxDT0hPTF0sCisgICAgICAgICAgICAgICAgKGludClwdWJzW3B1Ymxpc3RbcHViaV1dW2l0ZW1saXN0W2l0ZW1pXV1bUF9GT09EXSwKKyAgICAgICAgICAgICAgICAoaW50KXB1YnNbcHVibGlzdFtwdWJpXV1baXRlbWxpc3RbaXRlbWldXVsicmF0ZSJdLAorICAgICAgICAgICAgICAgIChpbnQpcHVic1twdWJsaXN0W3B1YmldXVtpdGVtbGlzdFtpdGVtaV1dWyJtYXhyYXRlIl0sCisgICAgICAgICAgICAgICAgKGludClwdWJzW3B1Ymxpc3RbcHViaV1dW2l0ZW1saXN0W2l0ZW1pXV1bIm1heHNldCJdLAorICAgICAgICAgICAgICAgIChpbnQpcHVic1twdWJsaXN0W3B1YmldXVtpdGVtbGlzdFtpdGVtaV1dWyJtYXhoZWFsIl0gKSk7CisgICAgICAgIERVTVBGKCJcbiIpOworICAgIH0KKyAgICByZXR1cm4gc2l6ZW9mKHB1Ymxpc3QpOworfQorCisvLyBiZXJlaW5pZ3QgZGllIEtuZWlwZW5saXN0ZSB2b24gYWxsZW4gS25laXBlbiwgZGllIGF1ZiBkZXIgUGxhdHRlIG5pY2h0IG1laHIKKy8vIGV4aXN0aWVyZW4uCitwdWJsaWMgdm9pZCBDbGVhblB1Ymxpc3QoKSB7CisgIGZvcmVhY2goc3RyaW5nIHB1YjogcHVicykgeworICAgIGlmIChmaWxlX3NpemUocHViKyIuYyIpIDw9IDApCisgICAgICBtX2RlbGV0ZShwdWJzLHB1Yik7CisgIH0KKyAgc2F2ZV9kYXRhKCk7Cit9CisKZGlmZiAtLWdpdCBhL3NlY3VyZS9xdWVzdG1hc3Rlci5jIGIvc2VjdXJlL3F1ZXN0bWFzdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE0YTk3YgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9xdWVzdG1hc3Rlci5jCkBAIC0wLDAgKzEsMTE3NCBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHF1ZXN0bWFzdGVyLmMgLS0gUXVlc3RtYXN0ZXIsIHZlcndhbHRldCBkaWUgbm9ybWFsZW4gUXVlc3RzIHVuZAorLy8gICAgICAgICAgICAgICAgICBkaWUgTWluaVF1ZXN0cworLy8KKy8vICRJZDogcXVlc3RtYXN0ZXIuYyA5MTM2IDIwMTUtMDItMDMgMjE6Mzk6MTBaIFplc3N0cmEgJAorLy8KKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIG5vX3NoYWRvdworI3ByYWdtYSBub19pbmhlcml0CisjcHJhZ21hIHZlcmJvc2VfZXJyb3JzCisjcHJhZ21hIGNvbWJpbmVfc3RyaW5ncworLy8jcHJhZ21hIHBlZGFudGljCisvLyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgd2Fybl9kZXByZWNhdGVkCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICIvc2VjdXJlL3dpemxldmVscy5oIgorI2luY2x1ZGUgIi9zZWN1cmUvcXVlc3RtYXN0ZXIuaCIKKyNpbmNsdWRlICIvc2VjdXJlL2xlcG1hc3Rlci5oIgorI2luY2x1ZGUgIi9zZWN1cmUvdGVsbmV0bmVnLmgiIC8vIFBfVFRZCisjaW5jbHVkZSA8bGl2aW5nL2Rlc2NyaXB0aW9uLmg+IC8vIFBfTEVWRUwKKyNpbmNsdWRlIDxwbGF5ZXIvYmFzZS5oPiAvLyBQX1RFU1RQTEFZRVIKKyNpbmNsdWRlIDxkYWVtb24uaD4KKyNpbmNsdWRlIDxhbnNpLmg+CisjaW5jbHVkZSA8ZXZlbnRzLmg+CisKKyNkZWZpbmUgREVCVUcoeCkgaWYgKGZ1bmNhbGwoc3ltYm9sX2Z1bmN0aW9uKCdmaW5kX3BsYXllciksImFyYXRob3JuIikpXAorICAgICAgICAgIHRlbGxfb2JqZWN0KGZ1bmNhbGwoc3ltYm9sX2Z1bmN0aW9uKCdmaW5kX3BsYXllciksImFyYXRob3JuIiksXAorICAgICAgICAgICAgICAgICAgICAgICJRTTogIit4KyJcbiIpCisKKyNkZWZpbmUgTUUgdGhpc19vYmplY3QoKQorI2RlZmluZSBQTCB0aGlzX3BsYXllcigpCisKKyNkZWZpbmUgTVFfREFUQV9QT0lOVFMgMAorI2RlZmluZSBNUV9EQVRBX1FVRVNUTk8gMQorI2RlZmluZSBNUV9EQVRBX1RBU0tERVNDIDIKKyNkZWZpbmUgTVFfREFUQV9WSVNJQkxFIDMKKyNkZWZpbmUgTVFfREFUQV9BQ1RJVkUgNAorI2RlZmluZSBNUV9EQVRBX1RJVExFIDUKKyNkZWZpbmUgTVFfREFUQV9ESUFSWVRFWFQgNgorI2RlZmluZSBNUV9EQVRBX1JFU1RSSUNUSU9OUyA3CisjZGVmaW5lIE1RX0RBVEFfQVNTSUdORURfRE9NQUlOIDgKKyNkZWZpbmUgTVFfREFUQV9RVUVSWV9QRVJNSVRURUQgOQorCitwcml2YXRlIGludCBtYXhfUVAgPSAwOworcHJpdmF0ZSBpbnQgb3B0X1FQID0gMDsKKy8vIERpZSBRdWVzdGxpc3RlIG1pdCBhbGxlbiBEYXRlbgorcHJpdmF0ZSBtYXBwaW5nIHF1ZXN0cyA9IChbXSk7CisKKy8vIERhcyBNYXBwaW5nIG1pdCBkZXIgTVEtTGlzdGUgYW4gc2ljaCB1bmQgYWxsZSB6dWdlaG9lcmlnZW4gRGF0ZW4KK3ByaXZhdGUgbWFwcGluZyBtaW5pcXVlc3RzID0gKFtdKTsKKy8vIE5hY2ggTVEtTnVtbWVybiBpbmRpemllcnRlciBDYWNoZToKKy8vIFN0cnVrdHVyIChbaW50IG51bSA6ICh7IGludCBzdHVwc2UsIHN0cmluZyBtcS1vYmplY3QgfSkgXSkKK3ByaXZhdGUgbm9zYXZlIG1hcHBpbmcgYnlfbnVtID0gKFtdKTsKKy8vIENhY2hlIGRlciBPYmpla3RlLCBkaWUgZGllIE1RLUxpc3RlbiBkZXIgUmVnaW9uZW4gYWJmcmFnZW4gZHVlcmZlbgorLy8gU3RydWt0dXIgKFtzdHJpbmcgcGF0aCA6ICh7IHN0cmluZyBtcV9vYmplY3QgfSkgXSkKK3ByaXZhdGUgbm9zYXZlIG1hcHBpbmcgbXFfcXVlcnlfcGVybWl0dGVkID0gKFtdKTsKKy8vIENhY2hlIGZ1ZXIgZGllIE1RLVB1bmt0ZSB2b24gU3BpZWxlcm4sIHdpcmQgZnVlciBkZW4gamV3ZWlsaWdlbiBTcGllbGVyCisvLyBiZWltIEFiZnJhZ2VuIHZvbiBkZXNzZW4gTVEtUHVua3RlbiBnZWZ1ZWxsdC4gU3BpZWxlcm5hbWUgd2lyZCBiZWkKKy8vIEFlbmRlcnVuZ2VuIGFuIHNlaW5lbiBNUS1QdW5rdGVuIChCZXN0ZWhlbiBlaW5lciBNUSwgbWFudWVsbGVzIFNldHplbgorLy8gb2RlciBMb2VzY2hlbiBlaW5lciBzZWluZXIgTVFzKSBhdXMgZGVtIENhY2hlIGF1c2dldHJhZ2VuCitwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIHVzZXJzX21xID0gKFtdKTsKKy8vIGxldHp0ZSB2ZXJnZWJlbmUgTVEtSW5kZXhudW1tZXIuIEVzIGRhcmYgbmllbWFscyBlaW5lIE1RIGVpbmUgSW5kZXhudW1tZXIKKy8vIGtyaWVnZW4sIGRpZSBlaW5lIGFuZGVyZSBNUSBzY2hvbm1hbCBoYXR0ZSwgYXVjaCB3ZW5uIGRpZSBnZWxvZXNjaHQgd3VyZGUuCisvLyAoWnVtaW5kZXN0IG5pY2h0LCBvaG5lIGRpZSBlbnRzcHJlY2hlbmRlbiBCaXRzIGltIFNwaWVsZXIgenUgbG9lc2NoZW4sIHdhcworLy8gelogbmljaHQgcGFzc2llcnQuCitwcml2YXRlIGludCBsYXN0X251bSA9IDA7CisKKwordm9pZCBzYXZlX2luZm8oKSB7CisgIHNhdmVfb2JqZWN0KFFVRVNUUyk7Cit9CisKKy8vIENhY2hlcyBhdWZiYXVlbi4KK3N0YXRpYyB2b2lkIG1ha2VfbnVtKHN0cmluZyBtcW9iX25hbWUsIGludCBzdHVwc2UsIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0YXNrZGVzYywgaW50IHZpcywgaW50IGFjdGl2ZSwgc3RyaW5nIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGRvbmVkZXNjLCBtYXBwaW5nIHJlc3RyLCBzdHJpbmcgZG9tYWluLCAKKyAgICAgICAgICAgICAgICAgICAgIHN0cmluZyAqcGVybWl0dGVkX29ianMpIHsKKyAgYnlfbnVtICs9IChbIGluZGV4IDogKHtzdHVwc2UsIG1xb2JfbmFtZX0pXSk7CisgIGZvcmVhY2ggKCBzdHJpbmcgb2JqOiBwZXJtaXR0ZWRfb2JqcyApIHsKKyAgICBpZiAoIG1lbWJlcihtcV9xdWVyeV9wZXJtaXR0ZWQsIG9iaikgKQorICAgICAgbXFfcXVlcnlfcGVybWl0dGVkW29ial0gKz0gKHttcW9iX25hbWV9KTsKKyAgICBlbHNlCisgICAgICBtcV9xdWVyeV9wZXJtaXR0ZWRbb2JqXSA9ICh7bXFvYl9uYW1lfSk7CisgIH0KK30KKwordm9pZCBjcmVhdGUoKSB7CisgIHNldGV1aWQoZ2V0dWlkKE1FKSk7CisgIGlmICghcmVzdG9yZV9vYmplY3QoUVVFU1RTKSkgeworICAgIHNhdmVfaW5mbygpOworICB9CisKKyAgd2Fsa19tYXBwaW5nKG1pbmlxdWVzdHMsICMnbWFrZV9udW0gLyonKi8gKTsKKyAgc2V0X25leHRfcmVzZXQoNDMyMDApOyAvLyBSZXNldCBhbGxlIDEyIFN0dW5kZW4uCisgIEVWRU5URC0+UmVnaXN0ZXJFdmVudChFVlRfTElCX1FVRVNUX1NPTFZFRCwiSGFuZGxlUXVlc3RTb2x2ZWQiLAorICAgICAgTUUpOworfQorCitwdWJsaWMgaW50IHJlbW92ZShpbnQgc2lsZW50KSB7CisgIHNhdmVfaW5mbygpOworICBFVkVOVEQtPlVucmVnaXN0ZXJFdmVudChFVlRfTElCX1FVRVNUX1NPTFZFRCwgTUUpOworICBkZXN0cnVjdChNRSk7CisgIHJldHVybiAxOworfQorCisvLyBTY2hyZWlienVncmlmZiBudXIgZnVlciBpbnRlcmFrdGl2ZSBFTXMgdW5kIEFSQ0hfU0VDVVJJVFkuCitwcml2YXRlIGludCBhbGxvd2VkX3dyaXRlX2FjY2VzcygpIHsKKyAgaWYgKHByb2Nlc3NfY2FsbCgpKQorICAgIHJldHVybiAwOworICBpZiAoQVJDSF9TRUNVUklUWSkgIC8vIHBydWVmdCBhdWNoIHRoaXNfaW50ZXJhY3RpdmUoKSBtaXQuCisgICAgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCit2b2lkIHJlc2V0KCkgeworICBieV9udW0gPSAoW10pOworICBtcV9xdWVyeV9wZXJtaXR0ZWQgPSAoW10pOworICB3YWxrX21hcHBpbmcobWluaXF1ZXN0cywgIydtYWtlX251bSAvKicqLyApOworICBzZXRfbmV4dF9yZXNldCg0MzIwMCk7Cit9CisKKy8qCisgKiAoMSkgQUJTQ0hOSVRUICJOT1JNQUxFIFFVRVNUUyIKKyAqLworCisvKiBEaWUgUXVlc3RzIHdlcmRlbiBpbiBlaW5lbSBNYXBwaW5nIGdlc3BlaWNoZXJ0LiBEZXIgU2NobHVlc3NlbCBpc3QgZGFiZWkgZGVyCisgICBRdWVzdC1OYW1lLCBkaWUgRWludHJhZWdlIHNpbmQgQXJyYXlzIGRlciBmb2xnZW5kZW4gRm9ybToKKworICAgMS4gRWxlbWVudCBpc3QgZGllIFphaGwgZGVyIGR1cmNoIGRpZXNlIFF1ZXN0IHp1IGVyd2VyYmVuZGVuIFF1ZXN0cHVua3RlLgorICAgMi4gRWxlbWVudCBpc3QgZGllIFphaGwgZGVyIEVyZmFocnVuZ3NwdW5rdGUsIGRpZSBkZXIgU3BpZWxlciBiZWtvbW10LAorICAgICAgd2VubiBlciBkaWVzZSBRdWVzdCBsb2VzdC4KKyAgIDMuIEVsZW1lbnQgaXN0IGVpbiBBcnJheSBtaXQgZGVuIEZpbGVuYW1lbiBkZXIgT2JqZWt0ZSwgZGVuZW4gZXMgZ2VzdGF0dGV0CisgICAgICBpc3QsIGRpZXNlIFF1ZXN0IGJlaW0gUGxheWVyIGFscyBnZWxvZXN0IHp1IG1hcmtpZXJlbiAoRXJ6bWFnaWVyIGR1ZXJmZW4KKyAgICAgIGRhcyBhYmVyIHNvd2llc28gaW1tZXIpLgorICAgNC4gRWxlbWVudCBpc3QgZWluIFN0cmluZywgZGVyIGRpZSBRdWVzdCBrdXJ6IGJlc2NocmVpYnQuIERpZXNlciBTdHJpbmcgd2lyZAorICAgICAgZGVtIFNwaWVsZXIgdm9tIE9yYWtlbCBhbHMgSGlud2VpcyBnZWdlYmVuLgorICAgNS4gRWxlbWVudCBpc3QgZWluZSBaYWhsIHp3aXNjaGVuIC0xIHVuZCAxMDAsIGRpZSBkZW4gU2Nod2llcmlna2VpdHNncmFkIGRlcgorICAgICAgUXVlc3QgYW5naWJ0LCBuYWNoIEVpbnNjaGFldHp1bmcgZGVzIEVNIGZ1ZXIgUXVlc3RzLiBEYXMgT3Jha2VsIGthbm4gZGFubgorICAgICAgZXZ0bC4gc2lubmlnZSBTYWV0emUgd2llICJEaWVzZSBRdWVzdCBlcnNjaGVpbnQgbWlyIGFiZXIgbm9jaCByZWNodAorICAgICAgc2Nod2VyIGZ1ZXIgRGljaC4iLCBvZGVyICJIbSwgZGllIGhhZXR0ZXN0IER1IGphIHNjaG9uIHZpZWwgZWhlciBsb2VzZW4KKyAgICAgIGtvZW5uZW4uIiBhYnNvbmRlcm4uIDopCisKKyAgICAgIEVpbiBXZXJ0IHZvbiAtMSBiZWRldXRldCBlaW5lIFNlaGVycXVlc3QuIERpZXNlIHphZWhsdCBuaWNodCB6dSBkZW4KKyAgICAgIE1heGltYWxlbiBRdWVzdHB1bmt0ZW4sIHNvbmRlcm4gemFlaGx0IGFscyBvcHRpb25hbGUgUXVlc3QKKyAgIDYuIEVsZW1lbnQgaXN0IGVpbiBJbnRlZ2VyIHZvbiAwIGJpcyA1IHVuZCBnaWJ0IGRpZSAiS2xhc3NlIiBhbjsKKyAgICAgIGF1c2dlZ2ViZW4gd2VyZGVuIGRvcnQgU3Rlcm5jaGVuCisgICA3LiBFbGVtZW50IGlzdCBlaW4gSW50ZWdlciwgMCBvZGVyIDEuCisgICAgICAwOiBRdWVzdCB2b3J1ZWJlcmdlaGVuZCBkZWFrdGl2aWVydCAoc3VzcGVuZGllcnQpCisgICAgICAxOiBRdWVzdCBha3RpdmllcnQKKyAgIDguIEVsZW1lbnQgaXN0IGVpbiBTdHJpbmcgdW5kIGVudGhhZWx0IGRlbiBOYW1lbiBkZXMgTWFnaWVycywgZGVyIGRpZQorICAgICAgUXVlc3QgInZlcmJyb2NoZW4iIGhhdC4KKyAgIDkuIEVsZW1lbnQgaXN0IGVpbiBTdHJpbmcsIGRlciBkZW4gTmFtZW4gZWluZXMgTWFnaWVycyBlbnRoYWVsdCwgZGVyCisgICAgICBldnRsLiBmdWVyIGRpZSBXYXJ0dW5nIGRlciBRdWVzdCB6dXN0YWVuZGlnIGlzdC4KKyAgMTAuIEVsZW1lbnQgaXN0IGVpbmUgWmFobCB2b24gMCBiaXMgNCwgZGllIGRlciBRdWVzdCBlaW4gQXR0cmlidXQKKyAgICAgIGdpYnQgKDAgZnVlciBrZWluZXMpCisqLworCisvLyBnZWFlbmRlcnQ6CisvLyA1ICA9PSBkaWZmIGdlaHQgbnVuIHZvbiAtMSBiaXMgMTAwCisvLyA2ICA9PSBrbGFzc2UgZ2VodCBudW4gdm9uIDAgYmlzIDUKKy8vIDEwID09IGF0dHJpYnV0IGdlaHQgbnVuIHZvbiAwIGJpcyA0CisKK3ByaXZhdGUgaW50IFJlY2FsY3VsYXRlUVAoKSB7CisgIGludCBpOworICBtaXhlZCBxLG47CisKKyAgaWYgKCFhbGxvd2VkX3dyaXRlX2FjY2VzcygpKQorICAgIHJldHVybiAtMTsKKworICBtYXhfUVA9MDsKKyAgb3B0X1FQPTA7CisKKyAgbj1tX2luZGljZXMocXVlc3RzKTsKKyAgcT1tX3ZhbHVlcyhxdWVzdHMpOworICAgIGZvciAoaT1zaXplb2YocSktMTtpPj0wO2ktLSkKKyAgICAgIGlmIChxW2ldW1FfQUNUSVZFXSkgeworICAgICAgICBpZiAocVtpXVtRX0RJRkZdPj0wKQorICAgICAgICAgIG1heF9RUCs9cVtpXVtRX1FQXTsKKyAgICAgICAgaWYgKHFbaV1bUV9ESUZGXT09LTEpCisgICAgICAgICAgb3B0X1FQKz1xW2ldW1FfUVBdOworICAgICAgfQorCisgIHJldHVybiBtYXhfUVArb3B0X1FQOworfQorCitpbnQgQWRkUXVlc3Qoc3RyaW5nIG5hbWUsIGludCBxdWVzdHBvaW50cywgaW50IGV4cGVyaWVuY2UsCisgICAgICBzdHJpbmcgKmFsbG93ZWRvYmosIHN0cmluZyBoaW50LCBpbnQgZGlmZmljdWx0eSwgaW50IHF1ZXN0Y2xhc3MsCisgICAgICBpbnQgYWN0aXZlLCBzdHJpbmcgd2l6LCBzdHJpbmcgc2NuZHdpeiwgaW50IHF1ZXN0YXR0cmlidXRlKQoreworICBtaXhlZCAqcXVlc3Q7CisgIGludCBpOworCisgIGlmICghYWxsb3dlZF93cml0ZV9hY2Nlc3MoKSkgcmV0dXJuIDA7CisgIGlmICghc3RyaW5ncChuYW1lKSB8fCBzaXplb2YobmFtZSk8NSkgcmV0dXJuIC0xOworICBpZiAocXVlc3Rwb2ludHM8MSkgcmV0dXJuIC0yOworICBpZiAoIWludHAoZXhwZXJpZW5jZSkpIHJldHVybiAtMzsKKyAgaWYgKCFwb2ludGVycChhbGxvd2Vkb2JqKSkgcmV0dXJuIC00OworICBmb3IgKGk9c2l6ZW9mKGFsbG93ZWRvYmopLTE7aT49MDtpLS0pCisgICAgeworICAgICAgaWYgKCFzdHJpbmdwKGFsbG93ZWRvYmpbaV0pIHx8IGFsbG93ZWRvYmpbaV09PSIiKSByZXR1cm4gLTQ7CisgICAgICBhbGxvd2Vkb2JqW2ldPShzdHJpbmcpIi9zZWN1cmUvbWFzdGVyIi0+X2dldF9wYXRoKGFsbG93ZWRvYmpbaV0sMCk7CisgICAgfQorICBpZiAoIXN0cmluZ3AoaGludCkgfHwgaGludD09IiIpIHJldHVybiAtNTsKKyAgaWYgKGRpZmZpY3VsdHk8LTEgfHwgZGlmZmljdWx0eT4xMDApIHJldHVybiAtNjsKKyAgaWYgKHF1ZXN0Y2xhc3M8MCB8fCBxdWVzdGNsYXNzPjUpIHJldHVybiAtMTE7CisgIGlmIChhY3RpdmU8MCB8fCBhY3RpdmU+MSkgcmV0dXJuIC03OworICBpZiAoIXN0cmluZ3Aod2l6KSB8fCB3aXo9PSIiIHx8CisgICAgICBmaWxlX3NpemUoIi9wbGF5ZXJzLyIrKHdpej1sb3dlcl9jYXNlKHdpeikpKSAhPSAtMikgcmV0dXJuIC04OworICBpZiAoIXN0cmluZ3Aoc2NuZHdpeikpCisgICAgc2NuZHdpej0iIjsKKyAgZWxzZSBpZiAoZmlsZV9zaXplKCIvcGxheWVycy8iKyhzY25kd2l6PWxvd2VyX2Nhc2Uoc2NuZHdpeikpKSAhPSAtMikKKyAgICByZXR1cm4gLTk7CisgIGlmIChxdWVzdGF0dHJpYnV0ZTwwIHx8IHF1ZXN0YXR0cmlidXRlPjQpCisgICAgcmV0dXJuIC0xMDsKKworICBpZihxdWVzdHNbbmFtZV0mJihxdWVzdHNbbmFtZV1bNV09PTB8fHF1ZXN0c1tuYW1lXVs1XT09MSkmJnF1ZXN0c1tuYW1lXVs2XSkKKyAgICBtYXhfUVAtPXF1ZXN0c1tuYW1lXVswXTsKKworICBxdWVzdHMrPShbbmFtZTogKHtxdWVzdHBvaW50cyxleHBlcmllbmNlLGFsbG93ZWRvYmosaGludCxkaWZmaWN1bHR5LAorICAgICAgICAgICAgICAgICAgICBxdWVzdGNsYXNzLGFjdGl2ZSx3aXosIHNjbmR3aXoscXVlc3RhdHRyaWJ1dGUsCisgICAgICAgICAgICAgICAgICAgICh7MC4wLDB9KSB9KSBdKTsKKyAgUmVjYWxjdWxhdGVRUCgpOworICBzYXZlX2luZm8oKTsKKyAgUU1MT0coc3ByaW50ZigiYWRkOiAlcyAlTyAoJXMpIixuYW1lLHF1ZXN0c1tuYW1lXSwKKyAgICAgICAgICAgICAgICBnZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpKSkpOworICByZXR1cm4gMTsKK30KKworaW50IFJlbW92ZVF1ZXN0KHN0cmluZyBuYW1lKSB7CisgIG1peGVkICpxdWVzdDsKKworICBpZiAoIWFsbG93ZWRfd3JpdGVfYWNjZXNzKCkpIHJldHVybiAwOworICBpZiAoIXF1ZXN0c1tuYW1lXSkgcmV0dXJuIC0xOworICBRTUxPRyhzcHJpbnRmKCJyZW1vdmU6ICVzICVPICglcykiLG5hbWUscXVlc3RzW25hbWVdLAorICAgICAgICAgICAgICAgIGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpKSk7CisgIG1fZGVsZXRlKHF1ZXN0cyxuYW1lKTsKKyAgUmVjYWxjdWxhdGVRUCgpOworICBzYXZlX2luZm8oKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBRdWVyeU5lZWRlZFFQKCkgeworICByZXR1cm4gUkVRX1FQOworfQorCitpbnQgUXVlcnlNYXhRUCgpIHsKKyAgcmV0dXJuIG1heF9RUDsKK30KKworaW50IFF1ZXJ5T3B0UVAoKSB7CisgIHJldHVybiBvcHRfUVA7Cit9CisKK2ludCBRdWVyeVRvdGFsUVAoKSB7CisgIHJldHVybiBtYXhfUVArb3B0X1FQOworfQorCittaXhlZCAqUXVlcnlHcm91cGVkS2V5cygpIHsKKyAgc3RyaW5nICpxbGlzdGU7CisgIG1peGVkICAqcWdsaXN0ZTsKKyAgaW50IGksIGo7CisKKyAgcWdsaXN0ZSA9IGFsbG9jYXRlKHNpemVvZihRR1JPVVBTKSsxKTsgLy8gbGV0enRlIEdydXBwZSBzaW5kIGRpZSBTZWhlcnF1ZXN0cworICBxbGlzdGUgPSBtX2luZGljZXMocXVlc3RzKTsKKworICBmb3IgKGk9c2l6ZW9mKHFnbGlzdGUpLTE7aT49MDtpLS0pCisgICAgcWdsaXN0ZVtpXT0oe30pOworCisgIGZvciAoaT1zaXplb2YocWxpc3RlKS0xO2k+PTA7aS0tKQorICAgIHsKKyAgICAgIC8vIGluYWt0aXZlIHF1ZXN0PworICAgICAgaWYgKCFxdWVzdHNbcWxpc3RlW2ldXVtRX0FDVElWRV0pCisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gb3B0aW9uYWxlIHF1ZXN0PyBhbHNvIFNlaGVycXVlc3QKKyAgICAgICAgaWYgKHF1ZXN0c1txbGlzdGVbaV1dW1FfRElGRl09PS0xKQorICAgICAgICAgIHFnbGlzdGVbc2l6ZW9mKFFHUk9VUFMpXSArPSAoe3FsaXN0ZVtpXX0pOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAvLyBkYW5uIGhhYmVuIHdpciBhbHNvIGVpbmUgbm9ybWFsZSBRdWVzdCB1bmQgZGFoZXIgRWlub3JkbnVuZworICAgICAgICAgIC8vIG5hY2ggZGVtIFNjaHdpZXJpZ2tlaXRzd2VydAorICAgICAgICAgIGZvciAoaj1zaXplb2YoUUdST1VQUyktMTsKKyAgICAgICAgICAgICAgIGo+PTAgJiYgUUdST1VQU1tqXT49cXVlc3RzW3FsaXN0ZVtpXV1bUV9ESUZGXTtqLS0pCisgICAgICAgICAgICA7CisgICAgICAgICAgcWdsaXN0ZVtqXSArPSAoe3FsaXN0ZVtpXX0pOworICAgICAgICB9CisgICAgfQorICByZXR1cm4gcWdsaXN0ZTsKK30KKworCisvLyBmb2xnZW5kZSBmdW5rIGJyYXVjaCBpY2ggZ2xhdWJlIGljaCBuaWNodCBtZWhyOgoraW50IFF1ZXJ5RG9udG5lZWQob2JqZWN0IHBsKSB7CisgIHJhaXNlX2Vycm9yKCJJY2ggZ2xhdWIsIGRpZSBGdW5jIFF1ZXJ5RG9udG5lZWQoKSBicmF1Y2h0IGtlaW4gTWVuc2NoIG1laHIuICIKKyAgIihab29rKSIpOworfQorCisvLyBEaWUgZm9sZ2VuZGUgRnVuYyBicmF1Y2h0IG1hbiBuaWNodCBtZWhyCitpbnQgUXVlcnlSZWFkeUZvcldpeihvYmplY3QgcGxheWVyKSB7CisgIHJhaXNlX2Vycm9yKCJEaWUgRnVuYyBRdWVyeVJlYWR5Rm9yV2l6KCkgYnJhdWNodCBrZWluZXIgbWVoci4gKFpvb2spIik7Cit9CisKK21peGVkICpRdWVyeVF1ZXN0KHN0cmluZyBuYW1lKSB7CisgIGlmKCFxdWVzdHNbbmFtZV0pCisgICAgcmV0dXJuICh7fSk7CisgIGlmKCBleHRlcm5fY2FsbCgpICkKKyAgICByZXR1cm4gZGVlcF9jb3B5KCBxdWVzdHNbbmFtZV0gKTsKKyAgcmV0dXJuIHF1ZXN0c1tuYW1lXTsKK30KKworaW50IFF1ZXJ5UXVlc3RQb2ludHMoc3RyaW5nIG5hbWUpIHsKKyAgaWYoICFxdWVzdHNbbmFtZV0gKQorICAgIHJldHVybiAtMTsKKworICByZXR1cm4gcXVlc3RzW25hbWVdW1FfUVBdOworfQorCittaXhlZCAqUXVlcnlRdWVzdHMoKSB7CisgIGlmKCBleHRlcm5fY2FsbCgpICkKKyAgICByZXR1cm4gKHttX2luZGljZXMocXVlc3RzKSxtYXAobV92YWx1ZXMocXVlc3RzKSwjJ2RlZXBfY29weSAvKicqLyl9KTsKKyAgcmV0dXJuICh7IG1faW5kaWNlcyhxdWVzdHMpLCBtX3ZhbHVlcyhxdWVzdHMpIH0pOworfQorCitzdHJpbmcgKlF1ZXJ5QWxsS2V5cygpIHsKKyAgcmV0dXJuIG1faW5kaWNlcyhxdWVzdHMpOworfQorCitpbnQgU2V0QWN0aXZlKHN0cmluZyBuYW1lLCBpbnQgZmxhZykgeworICBtaXhlZCAqcXVlc3Q7CisKKyAgaWYgKCFhbGxvd2VkX3dyaXRlX2FjY2VzcygpKSByZXR1cm4gMDsKKyAgaWYgKCEocXVlc3Q9cXVlc3RzW25hbWVdKSkgcmV0dXJuIC0xOworICBzd2l0Y2goZmxhZykKKyAgICB7CisgICAgY2FzZSAwOgorICAgICAgaWYgKHF1ZXN0W1FfQUNUSVZFXSA9PSBmbGFnKQorICAgICAgICByZXR1cm4gLTI7CisgICAgICBxdWVzdFtRX0FDVElWRV0gPSBmbGFnOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgaWYgKHF1ZXN0W1FfQUNUSVZFXSA9PSBmbGFnKQorICAgICAgICByZXR1cm4gLTI7CisgICAgICBxdWVzdFtRX0FDVElWRV0gPSBmbGFnOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAtMzsKKyAgICB9CisgIHF1ZXN0c1tuYW1lXT1xdWVzdDsKKyAgUmVjYWxjdWxhdGVRUCgpOworICBzYXZlX2luZm8oKTsKKyAgUU1MT0coc3ByaW50ZigiJXM6ICVzICglcykiLChmbGFnPyJhY3RpdmF0ZSI6ImRlYWN0aXZhdGUiKSxuYW1lLAorICAgICAgICAgICAgICAgIGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpKSk7CisgIHJldHVybiAxOworfQorCitzdHJpbmcgbmFtZSgpIHsKKyAgcmV0dXJuICI8UXVlc3Q+IjsKK30KK3N0cmluZyBOYW1lKCkgeworICByZXR1cm4gIjxRdWVzdD4iOworfQorCit2b2lkIENoYW5uZWwoc3RyaW5nIG1zZykgeworICBpZighaW50ZXJhY3RpdmUocHJldmlvdXNfb2JqZWN0KCkpKQorICAgIHJldHVybjsKKyAgY2F0Y2goQ0hNQVNURVItPnNlbmQoIkFiZW50ZXVlciIsIE1FLCBtc2cpO3B1Ymxpc2gpOworfQorCisgLyogcXVvdGVkIGZyb20gL3N5cy9tYWlsLmg6ICovCisjZGVmaW5lIE1TR19GUk9NIDAKKyNkZWZpbmUgTVNHX1NFTkRFUiAxCisjZGVmaW5lIE1TR19SRUNJUElFTlQgMgorI2RlZmluZSBNU0dfQ0MgMworI2RlZmluZSBNU0dfQkNDIDQKKyNkZWZpbmUgTVNHX1NVQkpFQ1QgNQorI2RlZmluZSBNU0dfREFURSA2CisjZGVmaW5lIE1TR19JRCA3CisjZGVmaW5lIE1TR19CT0RZIDgKKwordm9pZCBTZW5kTWFpbChzdHJpbmcgcXVlc3RuYW1lLCBtaXhlZCAqcXVlc3QsIG9iamVjdCBwbGF5ZXIpIHsKKyAgbWl4ZWQqIG1haWw7CisgIHN0cmluZyB0ZXh0OworCisgIG1haWwgPSBhbGxvY2F0ZSg5KTsKKworICB0ZXh0ID0KKyAgICAiSGFsbG8gIitjYXBpdGFsaXplKGdldHVpZChwbGF5ZXIpKSsiLFxuXG4iKworICAgIGJyZWFrX3N0cmluZygiTmFjaGRlbSBEdSBnZXJhZGUgZWJlbiBkYXMgQWJlbnRldWVyICciKworICAgICAgICAgICAgICAgICBxdWVzdG5hbWUgKyInICgiK3F1ZXN0W1FfUVBdKyIgUHVua3RlKSwgZGFzICIrCisgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUocXVlc3RbUV9XSVpdKSsiIGZ1ZXIgZGFzICJNVUROQU1FIiBlbnR3b3JmZW4gaGF0LCAiCisgICAgICAgICAgICAgICAgICJtaXQgRXJmb2xnIGJlc3RhbmRlbiBoYXN0LCBzaW5kICIKKyAgICAgICAgICAgICAgICAgIndpciBudW4gYW4gRGVpbmVyIE1laW51bmcgZGF6dSBpbnRlcmVzc2llcnQ6IiwgNzgpKworICAgICJcbiAgSGF0IERpciBkYXMgQWJlbnRldWVyIGdlZmFsbGVuIHVuZCB3aWVzbyBiencuIHdpZXNvIG5pY2h0P1xuIgorICAgICIgIElzdCBkaWUgRWluc3R1ZnVuZyBEZWluZXIgTWVpbnVuZyBuYWNoIHJpY2h0aWc/IChBUCB1bmQgU3R1ZmUpXG4iCisgICAgIiAgR2FiIGVzIFByb2JsZW1lIG9kZXIgZ2FyIEZlaGxlcj9cbiIKKyAgICAiICBIYXN0IER1IFZlcmJlc3NlcnVuZ3N2b3JzY2hsYWVnZT9cblxuIjsKKworICB0ZXh0ICs9IGJyZWFrX3N0cmluZygiRGllc2UgTmFjaHJpY2h0IHd1cmRlIGF1dG9tYXRpc2NoIHZlcnNjaGlja3QsICIKKyAgICAgICAgIndlbm4gRHUgbWl0IGRlbSAncicgS29tbWFuZG8gZGFyYXVmIGFudHdvcnRlc3QsIGdlaHQgZGllIEFudHdvcnQgIgorICAgICAgICAiZGlyZWt0IGFuIEFyayBhbHMgenVzdGFlbmRpZ2VtIEVyem1hZ2llciBmdWVyIEFiZW50ZXVlci5cbiIsNzgpOworCisgIGlmIChxdWVzdFtRX1NDTkRXSVpdIT0iIikgeworICAgIHRleHQgKz0gYnJlYWtfc3RyaW5nKAorICAgICAgICAiRmFsbHMgRHUgbWl0IGRlbSBNYWdpZXIgc3ByZWNoZW4gd2lsbHN0LCBkZXIgenVyIFplaXQgZGFzICIKKyAgICAgICAgIkFiZW50ZXVlciB0ZWNobmlzY2ggYmV0cmV1dCwga2FubnN0IER1IERpY2ggYW4gIgorICAgICAgICArY2FwaXRhbGl6ZShxdWVzdFtRX1NDTkRXSVpdKSsgIiB3ZW5kZW4uIiw3OCk7CisgIH0KKworICBtYWlsW01TR19GUk9NXSA9ICJBcmsiOworICBtYWlsW01TR19TRU5ERVJdID0gIkFyayI7CisgIG1haWxbTVNHX1JFQ0lQSUVOVF0gPSBnZXR1aWQocGxheWVyKTsKKyAgbWFpbFtNU0dfQ0NdPTA7CisgIG1haWxbTVNHX0JDQ109MDsKKyAgbWFpbFtNU0dfU1VCSkVDVF09IkRhcyBBYmVudGV1ZXI6ICIrcXVlc3RuYW1lOworICBtYWlsW01TR19EQVRFXT1kdGltZSh0aW1lKCkpOworICBtYWlsW01TR19JRF09TVVETkFNRSI6Iit0aW1lKCk7CisgIG1haWxbTVNHX0JPRFldPXRleHQ7CisKKyAgIi9zZWN1cmUvbWFpbGVyIi0+RGVsaXZlck1haWwobWFpbCwwKTsKKyAgcmV0dXJuOworfQorCitzdGF0aWMgaW50IGNvbXBhcmUgKG1peGVkICppLCBtaXhlZCAqaikgeworICBpZiAoaVs0XSA9PSBqWzRdKQorICAgIHJldHVybiBpWzFdID4galsxXTsKKyAgZWxzZQorICAgIHJldHVybiBpWzRdID4gals0XTsKK30KKwordmFyYXJncyBzdHJpbmcgbGlzdGUobWl4ZWQgcGwpIHsKKyAgaW50IHFncm91cHMsIGksIGosIHFyZnc7CisgIG1peGVkICpxbGlzdHMsICpxZ3JvdXBlZCwgKnF0bXA7CisgIHN0cmluZyBzdHI7CisgIHN0cmluZyBqYSwgbmVpbiwgZm9ybWF0LCB1ZWJlcnNjaHJpZnQ7CisKKyAgaWYoIW9iamVjdHAocGwpKQorICAgIGlmKHN0cmluZ3AocGwpKQorICAgICAgcGw9ZmluZF9wbGF5ZXIocGwpIHx8IGZpbmRfbmV0ZGVhZChwbCk7CisgIGlmKCFvYmplY3RwKHBsKSkKKyAgICBwbD1QTDsKKyAgaWYoIW9iamVjdHAocGwpKQorICAgIHJldHVybiAiT2huZSBTcGllbGVybmFtZW4vU3BpZWxlcm9iamVrdCBnaWJ0IGVzIGF1Y2gga2VpbmUgTGlzdGUuXG4iOworCisgIGlmICggKChzdHJpbmcpcGwtPlF1ZXJ5UHJvcChQX1RUWSkpID09ICJhbnNpIikKKyAgeworICAgICAgamEgPSBBTlNJX0dSRUVOICsgImphIiArIEFOU0lfTk9STUFMOworICAgICAgbmVpbiA9IEFOU0lfUkVEICsgIm5laW4iICsgQU5TSV9OT1JNQUw7CisgIH0KKyAgZWxzZQorICB7CisgICAgICBqYSA9ICJqYSI7CisgICAgICBuZWluID0gIm5laW4iOworICB9CisKKyAgc3RyID0gIiI7CisgIC8vIEZlc3RsZWdlbiBkZXMgQXVzZ2FiZWZvcm1hdGVzCisgIGZvcm1hdCA9ICIlPS06MzBzICU6M2QgJS06NnMgICUtOjlzICU6MnMvJS06M3MgICUtOjEycyAlLXNcbiI7CisgIHVlYmVyc2NocmlmdCA9IHNwcmludGYoIiUtOjMwcyAlOjNzICUtOjZzICAlLTo5cyAlLTo2cyAgJS06MTJzICUtOjRzXG4iLAorICAgICAgICAgICAgICAgICAiQWJlbnRldWVyIiwgIkFQIiwgIktsYXNzZSIsICJBdHRyaWJ1dCIsCisgICAgICAgICAgICAgICAgICJTdHVmZSIsICJBdXRvciIsICJHZWw/Iik7CisKKyAgcWdyb3VwcyA9IHNpemVvZihRR1JPVVBTKTsKKyAgcWxpc3RzID0gYWxsb2NhdGUoIHFncm91cHMrMSApOworICBmb3IoIGk9cWdyb3VwczsgaT49MDsgaS0tICkKKyAgICBxbGlzdHNbaV0gPSAoe30pOworCisgIHFncm91cGVkID0gUXVlcnlHcm91cGVkS2V5cygpOworCisgIGZvciAoaT1zaXplb2YocWdyb3VwZWQpLTE7aT49MDsgaS0tKQorICAgIGZvciAoaj1zaXplb2YocWdyb3VwZWRbaV0pLTE7aj49MDsgai0tKSB7CisgICAgICBxdG1wID0gUXVlcnlRdWVzdChxZ3JvdXBlZFtpXVtqXSk7CisgICAgICBxbGlzdHNbaV0gKz0gKHsgKHsKKyAgICAgICAgcWdyb3VwZWRbaV1bal0sCisgICAgICAgIHF0bXBbUV9RUF0sCisgICAgICAgIFFDTEFTU19TVEFSUyhxdG1wW1FfQ0xBU1NdKSwKKyAgICAgICAgY2FwaXRhbGl6ZShRQVRUUl9TVFJJTkdTW3F0bXBbUV9BVFRSXV0pLAorICAgICAgICBxdG1wW1FfRElGRl0sCisgICAgICAgIChxdG1wW1FfQVZFUkFHRV1bMV0+MTAgLyomJiBJU19BUkNIKHRoaXNfcGxheWVyKCkpKi8KKyAgICAgICAgICAgICAgICAgID8gdG9fc3RyaW5nKHRvX2ludChxdG1wW1FfQVZFUkFHRV1bMF0pKQorICAgICAgICAgICAgICAgICAgOiAiLSIpLAorICAgICAgICBjYXBpdGFsaXplKHF0bXBbUV9XSVpdKSwKKyAgICAgICAgKGludClwbC0+UXVlcnlRdWVzdChxZ3JvdXBlZFtpXVtqXSkgPT0gT0sgPyBqYSA6IG5laW4KKyAgICAgIH0pIH0pOworICAgIH0KKworICBmb3IoIGk9MDsgaTxxZ3JvdXBzOyBpKysgKQorICB7CisgICAgaWYgKHNpemVvZihxbGlzdHNbaV0pKSB7CisgICAgICBzdHIgKz0gIlxuIiArIHVlYmVyc2NocmlmdDsKKyAgICAgIHN0ciArPSBzcHJpbnRmKCJTdHVmZW4gJWQlczpcbiIsCisgICAgICAgICAgICAgICAgICAgICBRR1JPVVBTW2ldKzEsCisgICAgICAgICAgICAgICAgICAgICBpPT1xZ3JvdXBzLTE/IisiOnNwcmludGYoIi0lZCIsIFFHUk9VUFNbaSsxXSkpOworICAgICAgcWxpc3RzW2ldID0gc29ydF9hcnJheSggcWxpc3RzW2ldLCAiY29tcGFyZSIsIE1FICk7CisgICAgICBmb3IoIGo9MDsgajxzaXplb2YocWxpc3RzW2ldKTsgaisrICkgeworICAgICAgICBpZihxbGlzdHNbaV1bal1bUV9ESUZGXT49MCkKKyAgICAgICAgICBzdHIgKz0gc3ByaW50ZiggZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBxbGlzdHNbaV1bal1bMF0sIHFsaXN0c1tpXVtqXVsxXSwgcWxpc3RzW2ldW2pdWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBxbGlzdHNbaV1bal1bM10sIHNwcmludGYoIiVkIixxbGlzdHNbaV1bal1bNF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICBxbGlzdHNbaV1bal1bNV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHFsaXN0c1tpXVtqXVs2XSwgcWxpc3RzW2ldW2pdWzddKTsKKyAgICAgIH0KKyAgICAgIHN0ciArPSAiXG5cbiI7CisgICAgfQorICB9CisKKyAgcWxpc3RzW3Fncm91cHNdID0gc29ydF9hcnJheShxbGlzdHNbcWdyb3Vwc10sICJjb21wYXJlIiwgTUUpOworICBpID0gcWdyb3VwczsKKyAgaWYgKHNpemVvZihxbGlzdHNbaV0pKSB7CisgICAgc3RyICs9ICJcbiIgKyB1ZWJlcnNjaHJpZnQ7CisgICAgc3RyICs9ICJOdXIgZnVlciBTZWhlcjpcbiI7CisgICAgZm9yKCBqPTA7IGo8c2l6ZW9mKHFsaXN0c1txZ3JvdXBzXSk7IGorKyApICB7CisgICAgICBpZihxbGlzdHNbaV1bal1bUV9ESUZGXT09LTEpCisgICAgICAgIHN0ciArPSBzcHJpbnRmKCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBxbGlzdHNbaV1bal1bMF0sIHFsaXN0c1tpXVtqXVsxXSwgcWxpc3RzW2ldW2pdWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgcWxpc3RzW2ldW2pdWzNdLCAiUyIsIHFsaXN0c1tpXVtqXVs1XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHFsaXN0c1tpXVtqXVs2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHFsaXN0c1tpXVtqXVs3XSk7CisgICAgfQorICB9CisKKyAgc3RyICs9CisgICAgIlxuRWluZSBFcmtsYWVydW5nIGRlciBlaW56ZWxuZW4gU3BhbHRlbiBmaW5kZXN0IER1IHVudGVyICIKKyAgICAiXCJoaWxmZSBhYmVudGV1ZXJsaXN0ZVwiLlxuIjsKKworICByZXR1cm4gc3RyOworfQorCisKKy8vIG1pdGxvZ2dlbiwgbWl0IHdlbGNoZW4gZHVyY2hzY2huaXR0bGljaGVuIExldmVsbiBRdWVzdHMgc28gZ2Vsb2VzdAorLy8gd2VyZGVuLi4uCit2b2lkIEhhbmRsZVF1ZXN0U29sdmVkKHN0cmluZyBlaWQsIG9iamVjdCB0cmlnb2IsIG1peGVkIGRhdGEpIHsKKyAgc3RyaW5nIHFuYW1lID0gZGF0YVtFX1FVRVNUTkFNRV07CisKKyAgaWYgKCFxdWVzdHNbcW5hbWVdIHx8ICFvYmplY3RwKHRyaWdvYikKKyAgICAgIHx8IHRyaWdvYi0+UXVlcnlQcm9wKFBfVEVTVFBMQVlFUikgfHwgSVNfTEVBUk5FUih0cmlnb2IpKQorICAgIHJldHVybjsKKworICBpbnQgbHZsID0gKGludCl0cmlnb2ItPlF1ZXJ5UHJvcChQX0xFVkVMKTsKKworICBpZiAobHZsIDw9IDApCisgICAgcmV0dXJuOworCisgIC8vIG5ldWVuIER1cmNoc2Nobml0dCBiZXJlY2hlbi4KKyAgbWl4ZWQgdG1wID0gcXVlc3RzW3FuYW1lXVtRX0FWRVJBR0VdOworICBmbG9hdCBhdmcgPSB0bXBbMF07CisgIGludCBjb3VudCA9IHRtcFsxXTsKKyAgYXZnICo9IGNvdW50OworICBhdmcgKz0gdG9fZmxvYXQobHZsKTsKKyAgdG1wWzFdID0gKytjb3VudDsKKyAgdG1wWzBdID0gYXZnIC8gY291bnQ7CisKKyAgREVCVUcoc3ByaW50ZigiJXM6ICVmICglZClcbiIscW5hbWUsCisgICAgICAgIHF1ZXN0c1txbmFtZV1bUV9BVkVSQUdFXVswXSwKKyAgICAgICAgcXVlc3RzW3FuYW1lXVtRX0FWRVJBR0VdWzFdKSk7Cit9CisKKy8qCisgKiAoMikgQUJTQ0hOSVRUICJNSU5JIiBRVUVTVFMKKyAqLworCitpbnQgQ2xlYXJVc2Vyc01RQ2FjaGUoKSB7CisgIGlmICghYWxsb3dlZF93cml0ZV9hY2Nlc3MoKSkKKyAgICByZXR1cm4gMDsKKworICB1c2Vyc19tcSA9IChbXSk7CisKKyAgcmV0dXJuIDE7Cit9CisKK21peGVkIFF1ZXJ5VXNlcnNNUUNhY2hlKCkgeworICBpZiAoIWFsbG93ZWRfd3JpdGVfYWNjZXNzKCkpCisgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIHVzZXJzX21xOworfQorCisvKiBCZXNjaHJlaWJ1bmcKKyAqCisgKiBEaWUgTWluaVF1ZXN0cyB3ZXJkZW4gaW4gZWluZW0gTWFwcGluZyBnZXNwZWljaGVydC4KKyAqCisgKiBEZXIgS2V5IGlzdCBkYWJlaSBkZXIgTmFtZSBkZXMgT2JqZWt0ZXMsIGRhcyBkaWUgUXVlc3QgaW0gU3BpZWxlcgorICogbWFya2llcmVuIGRhcmYuIERpZSBEYXRlbiB6dSBkZW4gTWluaXF1ZXN0cyBzdGVoZW4gaW4gZGVuIFZhbHVlLVNwYWx0ZW4KKyAqIGRlcyBNYXBwaW5ncy4KKyAqCisgKiAxLiBTcGFsdGUgaXN0IGRpZSBaYWhsIGRlciBkdXJjaCBkaWVzZSBRdWVzdCB6dSBlcndlcmJlbmRlbiBTdHVmZW5wdW5rdGUKKyAqIDIuIFNwYWx0ZSBpc3QgZGllIE51bW1lciB1bnRlciBkZXIgZGllIE1pbmlRdWVzdCBnZWZ1ZWhydCB3aXJkLgorICogMy4gU3BhbHRlIGlzdCBlaW4gU3RyaW5nLCBkZXIgZGllIFF1ZXN0KGF1ZmdhYmUpIGt1cnogYmVzY2hyZWlidC4KKyAqIDQuIFNwYWx0ZSBpc3QgZWluIEludGVnZXIsIDAgb2RlciAxOgorICogICAgIDAgOiBRdWVzdCBpc3QgZnVlciBTcGllbGVyIG5pY2h0IHNpY2h0YmFyCisgKiAgICAgMSA6IFF1ZXN0IGlzdCBmdWVyIFNwaWVsZXIgei5CLiBiZWkgZWluZXIgQW5zY2hsYWd0YWZlbCBzaWNodGJhcgorICogICAgIEZ1ZXIgU3BpZWxlciB1bnNpY2h0YmFyZSBNUXMgc29sbHRlIGVzIGFiZXIgbmljaHQgbWVociBnZWJlbiEKKyAqIDUuIFNwYWx0ZSBpc3QgZWluIEludGVnZXIsIDAgb2RlciAxOgorICogICAgIDAgOiBRdWVzdCB2b3J1ZWJlcmdlaGVuZCBkZWFrdGl2aWVydAorICogICAgIDEgOiBRdWVzdCBha3RpdmllcnQKKyAqIDYuIFNwYWx0ZSBpc3QgZWluIFN0cmluZywgZGVyIGRlbiBLdXJ6dGl0ZWwgZGVyIE1pbmlxdWVzdCBlbnRoYWVsdAorICogNy4gU3BhbHRlIGlzdCBlaW4gU3RyaW5nLCBkZXIgZWluZSBrdXJ6ZSBCZXNjaHJlaWJ1bmcgZGVzc2VuIGVudGhhZWx0LAorICogICAgIHdhcyBkZXIgU3BpZWxlciBpbSBWZXJsYXVmIGRlciBNaW5pcXVlc3QgZXJsZWJ0IGhhdC4KKyAqIDguIFNwYWx0ZSBpc3QgZWluIE1hcHBpbmcsIGRlc3NlbiBFaW50cmFlZ2UgYW5hbG9nIHp1IFBfUkVTVFJJQ1RJT05TCisgKiAgICAgZ2VzZXR6dCB3ZXJkZW4ga29lbm5lbiwgdW0gYW56dWdlYmVuLCB3ZWxjaGUgVm9yYXVzc2V0enVuZ2VuIGVyZnVlbGx0CisgKiAgICAgc2VpbiBtdWVzc2VuLCBiZXZvciBlaW4gU3BpZWxlciBkaWVzZSBRdWVzdCBiZWdpbm5lbiBrYW5uLgorICogOS4gU3BhbHRlIGlzdCBkaWUgWnVvcmRudW5nIGRlciBNUSB6dSBkZW4gUmVnaW9uZW4KKyAqMTAuIFNwYWx0ZSBpc3QgZWluIEFycmF5IGF1cyBTdHJpbmdzLCBkYXMgZGllIE9iamVrdGUgZW50aGFlbHQsIGRpZQorICogICAgZGllIERhdGVuIGRpZXNlciBRdWVzdCBhYmZyYWdlbiBkdWVyZmVuLCB1bSBzaWUgYW4gU3BpZWxlciBhdXN6dWdlYmVuLgorICovCisKK2ludCBEdW1wTWluaVF1ZXN0cyhvYmplY3Qgd2hvKSB7CisgIGludCBzdW1fcG9pbnRzOworCisgIGlmIChleHRlcm5fY2FsbCgpICYmICFhbGxvd2VkX3dyaXRlX2FjY2VzcygpKQorICAgIHJldHVybiAwOworCisgIGlmICggIW9iamVjdHAod2hvKSB8fCAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZSh3aG8pKQorICAgIHdobyA9IHRoaXNfaW50ZXJhY3RpdmUoKTsKKworICBNUU1MT0coc3ByaW50ZigiRHVtcE1pbmlRdWVzdHM6IFBPOiAlTywgVEk6ICVPIiwgcHJldmlvdXNfb2JqZWN0KCksIHdobykpOworICBybShNUV9EVU1QX0ZJTEUpOworCisgIHdyaXRlX2ZpbGUoTVFfRFVNUF9GSUxFLCAiTUlOSVFVRVNUUzogKCIrZHRpbWUodGltZSgpKSsiKVxuXG4iKworICAgICIgIE5yICBQa3QgIHZpcyBha3QgdmVyZ2ViZW5kZXMgT2JqZWt0XG4iKTsKKyAgc3RyaW5nICptc2cgPSAoe30pOworCisgIGZvcmVhY2goc3RyaW5nIG9ibmFtZSwgaW50IHN0dXBzZSwgaW50IG51bW1lciwgbWl4ZWQgZGVzY3IsIGludCB2aXMsCisgICAgICBpbnQgYWN0aXZlIC8qLCBzdHJpbmcgdGl0bGUsIHN0cmluZyBkb25lZGVzYywgbWFwcGluZyByZXN0cmljdGlvbnMsCisgICAgICBzdHJpbmcgZG9tYWluLCBzdHJpbmcgKnBlcm1pdHRlZF9vYmpzKi86IG1pbmlxdWVzdHMpCisgIHsKKyAgICBtc2cgKz0gKHsgc3ByaW50ZigiJTRkICU0ZCAlNGQgJTRkICVzIiwKKyAgICAgIG51bW1lciwgc3R1cHNlLCB2aXMsIGFjdGl2ZSwgb2JuYW1lKX0pOworICAgIHN1bV9wb2ludHMgKz0gc3R1cHNlOworICB9CisKKyAgd3JpdGVfZmlsZShNUV9EVU1QX0ZJTEUsIGltcGxvZGUoc29ydF9hcnJheShtc2csICMnPiAvKicqLyksICJcbiIpKTsKKyAgd3JpdGVfZmlsZShNUV9EVU1QX0ZJTEUsIHNwcmludGYoIlxuXG4iCisgICAgICAgICAgICAgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgorICAgICAgICAgICAgICsiTWluaVF1ZXN0czogJWQgTWluaXF1ZXN0cyBtaXQgJWQgUHVua3Rlbi5cblxuIiwKKyAgICAgICAgICAgICAgc2l6ZW9mKG1pbmlxdWVzdHMpLCBzdW1fcG9pbnRzKSk7CisgIHJldHVybiAxOworfQorCitwdWJsaWMgaW50IEFkZE1pbmlRdWVzdChpbnQgbXF1ZXN0cG9pbnRzLCBzdHJpbmcgYWxsb3dlZG9iaiwgc3RyaW5nIGRlc2NyLAorICAgICAgICAgICAgaW50IGFjdGl2ZSwgc3RyaW5nIHRpdGxlLCBzdHJpbmcgZG9uZWRlc2MsIG1hcHBpbmcgcmVzdHJpY3Rpb25zLAorICAgICAgICAgICAgc3RyaW5nIGRvbWFpbiwgc3RyaW5nICpwZXJtaXR0ZWRfb2JqcykgeworCisgIGlmICghYWxsb3dlZF93cml0ZV9hY2Nlc3MoKSkKKyAgICByZXR1cm4gMDsKKworICAvLyBQYXJhbWV0ZXJwcnVlZnVuZzogUXVlc3RnZWJlciwgUmVzdHJpY3Rpb25zLCBSZWdpb24sIFRpdGVsIHVuZAorICAvLyB6dWdlbGFzc2VuZSBBYmZyYWdlb2JqZWt0ZSBtdWVzc2VuIGd1ZWx0aWcgYW5nZWdlYmVuIHdlcmRlbiwgYWxsZXMKKyAgLy8gd2VpdGVyZSB3aXJkIHVudGVuIGdnZi4gYXVzZ2VudWxsdC9rb3JyaWdpZXJ0LgorICBpZiAoIXN0cmluZ3AoYWxsb3dlZG9iaikgfHwgIXNpemVvZihhbGxvd2Vkb2JqKSB8fCAhbWFwcGluZ3AocmVzdHJpY3Rpb25zKQorICAgICAgfHwgIXN0cmluZ3AoZG9tYWluKSB8fCAhc3RyaW5ncCh0aXRsZSkgfHwgIXBvaW50ZXJwKHBlcm1pdHRlZF9vYmpzKSkKKyAgICByZXR1cm4gLTE7CisKKyAgLy8gTWluaXF1ZXN0IG1pdCB3ZW5pZ2VyIGFscyAxIFN0dXBzIGVpbnp1dHJhZ2VuIGlzdCB3b2hsIHVuc2lubmlnLgorICBpZiAobXF1ZXN0cG9pbnRzPDEpCisgICAgcmV0dXJuIC0yOworCisgIC8vIE1pbmRlc3RlbnMgZWluIE9iamVrdCBtdXNzIGVpbmdldHJhZ2VuIHdlcmRlbiwgZGFzIFNwaWVsZXJuIEluZm9ybWF0aW9uZW4KKyAgLy8gdWViZXIgZGllIEF1ZmdhYmVuc3RlbGx1bmcgZGVyIE1RIGdlYmVuIGRhcmYuCisgIGlmICggIXNpemVvZihwZXJtaXR0ZWRfb2JqcykgKQorICAgIHJldHVybiAtMzsKKworICAvLyBQcnVlZmVuLCBvYiBkaWUgYWxzIFF1ZXN0Z2ViZXIgYW5nZWdlYmVuZSBEYXRlaSBleGlzdGllcnQuCisgIGlmIChhbGxvd2Vkb2JqWzwyLi5dID09ICIuYyIpCisgICAgYWxsb3dlZG9iaiA9IGFsbG93ZWRvYmpbMC4uPDNdOworICBhbGxvd2Vkb2JqID0gZXhwbG9kZShhbGxvd2Vkb2JqLCAiIyIpWzBdOworICBhbGxvd2Vkb2JqID0gKHN0cmluZylNQVNURVItPl9nZXRfcGF0aChhbGxvd2Vkb2JqLDApOworICBpZiAoZmlsZV9zaXplKGFsbG93ZWRvYmorIi5jIikgPD0wKQorICAgIHJldHVybiAtMzsKKworICAvLyBWZXJnaWJ0IGRhcyBhbmdlZ2ViZW5lIE9iamVrdCBzY2hvbiBlaW5lIE1RPyBEYW5uIGFiYnJlY2hlbi4KKyAgaWYgKG1lbWJlcihtaW5pcXVlc3RzLGFsbG93ZWRvYmopKQorICAgIHJldHVybiAtNDsKKworICBpZiAoIXN0cmluZ3AoZGVzY3IpIHx8ICFzaXplb2YoZGVzY3IpKQorICAgIGRlc2NyID0gMDsKKyAgaWYgKCFzdHJpbmdwKGRvbmVkZXNjKSB8fCAhc2l6ZW9mKGRvbmVkZXNjKSkKKyAgICBkb25lZGVzYyA9IDA7CisKKyAgLy8gRWludHJhZyBoaW56dWZ1ZWdlbiwgdmlzaWJsZSBpc3QgcGVyIERlZmF1bHQgaW1tZXIgMS4KKyAgLy8gTVEtTnVtbWVyIGhvY2h6YWVobGVuCisgIGludCBudW1tZXIgPSBsYXN0X251bSArIDE7CisgIG1fYWRkKG1pbmlxdWVzdHMsIGFsbG93ZWRvYmosIG1xdWVzdHBvaW50cywgbnVtbWVyLCBkZXNjciwgMSwgYWN0aXZlLAorICAgIHRpdGxlLCBkb25lZGVzYywgcmVzdHJpY3Rpb25zLCBkb21haW4sIHBlcm1pdHRlZF9vYmpzKTsKKyAgLy8gdW5kIG51bW1lciBhbHMgbGFzdF9udW0gbWVya2VuLgorICBsYXN0X251bSA9IG51bW1lcjsKKyAgc2F2ZV9pbmZvKCk7CisgIG1fYWRkKGJ5X251bSwgbnVtbWVyLCAoe21xdWVzdHBvaW50cywgYWxsb3dlZG9ian0pKTsKKyAgTVFNTE9HKHNwcmludGYoIkFkZE1pbmlRdWVzdDogJXMgJU8gKCVzKSIsIGFsbG93ZWRvYmosIG1pbmlxdWVzdHNbYWxsb3dlZG9ial0sCisgICAgICAgICAgICAgICAgIGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpKSk7CisKKyAgQ2xlYXJVc2Vyc01RQ2FjaGUoKTsKKyAgaWYgKGZpbmRfY2FsbF9vdXQoIydEdW1wTWluaVF1ZXN0cykgPT0gLTEpCisgICAgY2FsbF9vdXQoIydEdW1wTWluaVF1ZXN0cywgNjAsIHRoaXNfaW50ZXJhY3RpdmUoKSk7CisgIHJldHVybiAxOworfQorCitpbnQgUmVtb3ZlTWluaVF1ZXN0KHN0cmluZyBuYW1lKSB7CisgIGlmICghYWxsb3dlZF93cml0ZV9hY2Nlc3MoKSkKKyAgICByZXR1cm4gMDsKKyAgLy8gR2lidCBlcyBlaW5lbiBzb2xjaGVuIEVpbnRyYWcgdWViZXJoYXVwdD8KKyAgaWYgKCFtZW1iZXIobWluaXF1ZXN0cyxuYW1lKSkKKyAgICByZXR1cm4gLTE7CisKKyAgTVFNTE9HKHNwcmludGYoIlJlbW92ZU1pbmlRdWVzdDogJXMgJU8gKCVzKSIsCisgICAgbmFtZSwgbV9lbnRyeShtaW5pcXVlc3RzLCBuYW1lKSwgZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSkpKTsKKworICAvLyBNUSBhdXMgZGVtIE1RLUluZGV4bnVtbWVybi1DYWNoZSBsb2VzY2hlbi4KKyAgbV9kZWxldGUoYnlfbnVtLCBtaW5pcXVlc3RzW25hbWUsTVFfREFUQV9RVUVTVE5PXSk7CisgIC8vIE1RIGF1cyBkZXIgTWluaXF1ZXN0bGlzdGUgYXVzdHJhZ2VuLgorICBtX2RlbGV0ZShtaW5pcXVlc3RzLCBuYW1lKTsKKyAgc2F2ZV9pbmZvKCk7CisKKyAgLy8gTVEtUHVua3RlLUNhY2hlIGxvZXNjaGVuLCBkYSBuaWNodCBmZXN0c3RlbGxiYXIgaXN0LCB3ZWxjaGVyIGRlcgorICAvLyBkb3J0IGVpbmdldHJhZ2VuZW4gU3BpZWxlciBkaWUgZ2VyYWRlIGF1c2dldHJhZ2VuZSBNUSBnZWxvZXN0IGhhdHRlLgorICBDbGVhclVzZXJzTVFDYWNoZSgpOworICBpZiAoZmluZF9jYWxsX291dCgjJ0R1bXBNaW5pUXVlc3RzKSA9PSAtMSkKKyAgICBjYWxsX291dCgjJ0R1bXBNaW5pUXVlc3RzLCA2MCwgdGhpc19pbnRlcmFjdGl2ZSgpKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBDaGFuZ2VNaW5pUXVlc3QobWl4ZWQgbXFfb2JqLCBpbnQgcGFyYW0sIG1peGVkIG5ld3ZhbHVlKSB7CisgIGlmICghYWxsb3dlZF93cml0ZV9hY2Nlc3MoKSkKKyAgICByZXR1cm4gMDsKKworICAvLyBNUSB3ZWRlciBhbHMgUGZhZCwgbm9jaCBhbHMgSW5kZXhudW1tZXIgYW5nZWdlYmVuPworICBpZiAoICFzdHJpbmdwKG1xX29iaikgJiYgIWludHAobXFfb2JqKSAmJiAhaW50cChwYXJhbSkpCisgICAgcmV0dXJuIE1RX0tFWV9JTlZBTElEOworCisgIC8vIGdld2FlaGx0ZXIgUGFyYW1ldGVyIHVuZ3VlbHRpZz8KKyAgaWYgKCBwYXJhbSA8IE1RX0RBVEFfUE9JTlRTIHx8IHBhcmFtID4gTVFfREFUQV9RVUVSWV9QRVJNSVRURUQgKQorICAgIHJldHVybiBNUV9LRVlfSU5WQUxJRDsKKworICAvLyBJbmRleG51bW1lciBkZXIgTVEgaW4gZGVuIFBmYWQgdW13YW5kZWxuCisgIGlmICggaW50cChtcV9vYmopICkKKyAgICBtcV9vYmogPSBieV9udW1bbXFfb2JqXVsxXTsKKworICAvLyBWZXJnZWJlbmRlcyBPYmpla3QgbmljaHQgZ2VmdW5kZW4/IEJsb2VkLCBkYXMgYnJhdWNoZW4gd2lyIG5hZW1saWNoLgorICBpZiAoIXN0cmluZ3AobXFfb2JqKSkKKyAgICByZXR1cm4gTVFfS0VZX0lOVkFMSUQ7CisKKyAgaWYgKCAhbWVtYmVyKG1pbmlxdWVzdHMsIG1xX29iaikgKQorICAgIHJldHVybiBNUV9JTExFR0FMX09CSjsKKworICBzd2l0Y2gocGFyYW0pIHsKKyAgICAvLyBNUV9EQVRBX1FVRVNUTk8gaXN0IG5pY2h0IGFlbmRlcmJhciwgZGFoZXIgaGllciBuaWNodCBiZWhhbmRlbHQsIHNvCisgICAgLy8gZGFzcyBGYWxsYmFjayBhdWYgZGVmYXVsdCBlcmZvbGd0LgorICAgIC8vIFN0dWZlbnB1bmt0ZSBtdWVzc2VuIEludGVnZXJzIHNlaW4uCisgICAgY2FzZSBNUV9EQVRBX1BPSU5UUzoKKyAgICAgIGlmICggIWludHAobmV3dmFsdWUpIHx8IG5ld3ZhbHVlIDwgMSApCisgICAgICAgIHJldHVybiBNUV9LRVlfSU5WQUxJRDsKKyAgICAgIGJyZWFrOworICAgIC8vIEF1ZmdhYmVuYmVzY2hyZWlidW5nLCBUaXRlbCwgImdlc2NoYWZmdCItVGV4dCB1bmQgenVnZW9yZG5ldGUgUmVnaW9uCisgICAgLy8gbXVlc3NlbiBTdHJpbmdzIHNlaW4KKyAgICBjYXNlIE1RX0RBVEFfVEFTS0RFU0M6CisgICAgY2FzZSBNUV9EQVRBX1RJVExFOgorICAgIGNhc2UgTVFfREFUQV9ESUFSWVRFWFQ6CisgICAgY2FzZSBNUV9EQVRBX0FTU0lHTkVEX0RPTUFJTjoKKyAgICAgIGlmICggIXN0cmluZ3AobmV3dmFsdWUpIHx8ICFzaXplb2YobmV3dmFsdWUpICkgCisgICAgICAgIHJldHVybiBNUV9LRVlfSU5WQUxJRDsKKyAgICAgIGJyZWFrOworICAgIC8vIGRhcyBTaWNodGJhcmtlaXRzLSB1bmQgZGFzIGFrdGl2L2luYWt0aXYtRmxhZyBtdWVzc2VuIDAvMSBzZWluLgorICAgIGNhc2UgTVFfREFUQV9WSVNJQkxFOgorICAgIGNhc2UgTVFfREFUQV9BQ1RJVkU6CisgICAgICBpZiAoICFpbnRwKG5ld3ZhbHVlKSB8fCBuZXd2YWx1ZSA8IDAgfHwgbmV3dmFsdWUgPiAxICkKKyAgICAgICAgcmV0dXJuIE1RX0tFWV9JTlZBTElEOworICAgICAgYnJlYWs7CisgICAgLy8gRGllIFZvcmF1c3NldHp1bmdlbiBtdWVzc2VuIGFscyBNYXBwaW5nIGVpbmdldHJhZ2VuIHdlcmRlbiwgZGFzIGFiZXIKKyAgICAvLyBsZWVyIG9kZXIgTnVsbCBzZWluIGthbm4sIHdlbm4gZXMga2VpbmUgUmVzdHJpa3Rpb25lbiBnaWJ0LgorICAgIGNhc2UgTVFfREFUQV9SRVNUUklDVElPTlM6CisgICAgICBpZiAoICFtYXBwaW5ncChuZXd2YWx1ZSkgJiYgbmV3dmFsdWUgIT0gMCApCisgICAgICAgIHJldHVybiBNUV9LRVlfSU5WQUxJRDsKKyAgICAgIGJyZWFrOworICAgIC8vIFJlZ2lvbnN6dW9yZG51bmcgbXVzcyBlaW4gbmljaHQtbGVlcmVzIEFycmF5IHNlaW4sIGRhcyBudXIgYXVzIFN0cmluZ3MKKyAgICAvLyBiZXN0ZWhlbiBkYXJmLCBkaWUgbmljaHQgbGVlciBzZWluIGR1ZXJmZW4uCisgICAgY2FzZSBNUV9EQVRBX1FVRVJZX1BFUk1JVFRFRDoKKyAgICAgIGlmICggcG9pbnRlcnAobmV3dmFsdWUpICkgeworICAgICAgICBuZXd2YWx1ZSA9IGZpbHRlcihmaWx0ZXIobmV3dmFsdWUsICMnc3RyaW5ncCksICMnc2l6ZW9mKTsKKyAgICAgICAgaWYgKCFzaXplb2YobmV3dmFsdWUpKQorICAgICAgICAgIHJldHVybiBNUV9LRVlfSU5WQUxJRDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIE1RX0tFWV9JTlZBTElEOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBNUV9LRVlfSU5WQUxJRDsKKyAgfQorCisgIG1peGVkICphbHRlbXEgPSBtX2VudHJ5KG1pbmlxdWVzdHMsIG1xX29iaik7CisgIGludCBudW1tZXIgPSBtaW5pcXVlc3RzW21xX29iaixNUV9EQVRBX1FVRVNUTk9dOworICBtaW5pcXVlc3RzW21xX29iaiwgcGFyYW1dID0gbmV3dmFsdWU7CisgIGJ5X251bVtudW1tZXJdID0gKHttaW5pcXVlc3RzW21xX29iaixNUV9EQVRBX1BPSU5UU10sIG1xX29ian0pOworICBzYXZlX2luZm8oKTsKKworICBNUU1MT0coc3ByaW50ZigiQ2hhbmdlTWluaVF1ZXN0OiAlcyBmcm9tICVPIHRvICVPICglcykiLCBtcV9vYmosCisgICAgYWx0ZW1xLCBtX2VudHJ5KG1pbmlxdWVzdHMsIG1xX29iaiksIGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpKSk7CisKKyAgQ2xlYXJVc2Vyc01RQ2FjaGUoKTsKKyAgaWYgKGZpbmRfY2FsbF9vdXQoIydEdW1wTWluaVF1ZXN0cykgPT0gLTEpCisgICAgY2FsbF9vdXQoIydEdW1wTWluaVF1ZXN0cywgNjAsIHRoaXNfaW50ZXJhY3RpdmUoKSk7CisgIHJldHVybiAxOworfQorCittaXhlZCBRdWVyeU1pbmlRdWVzdEJ5TmFtZShzdHJpbmcgbmFtZSkgeworICBpZiAoIWFsbG93ZWRfd3JpdGVfYWNjZXNzKCkpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiBkZWVwX2NvcHkobWluaXF1ZXN0cyAmICh7bmFtZX0pKTsKK30KKworbWl4ZWQgUXVlcnlNaW5pUXVlc3RCeU51bWJlcihpbnQgbnVtbWVyKSB7CisgIC8vIFp1Z3JpZmZzYWJzaWNoZXJ1bmcgZXJmb2xndCBkb3J0IGF1Y2gsIGRhaGVyIGhpZXIgdW5ub2V0aWcKKyAgcmV0dXJuIChieV9udW1bbnVtbWVyXT9RdWVyeU1pbmlRdWVzdEJ5TmFtZShieV9udW1bbnVtbWVyXVsxXSk6MCk7Cit9CisKKy8vIERhcyB2b2xsc3RhZW5kaWdlIE1RLU1hcHBpbmcgbnVyIGFscyBLb3BpZSBhdXNsaWVmZXJuLgorbWl4ZWQgUXVlcnlNaW5pUXVlc3RzKCkgeworICByZXR1cm4gYWxsb3dlZF93cml0ZV9hY2Nlc3MoKSA/IGRlZXBfY29weShtaW5pcXVlc3RzKSA6IDA7Cit9CisKKy8vIERlLS9Ba3RpdmllcmVuIGVpbmVyIE1pbmlxdWVzdCwgd2lya3QgYWxzIFVtc2NoYWx0ZXIsIGQuaC4gZWluZSBha3RpdmUKKy8vIE1RIHdpcmQgZHVyY2ggQXVmcnVmIGRpZXNlciBGdW5rdGlvbiBhbHMgaW5ha3RpdiBtYXJraWVydCB1bmQgdW1nZWtlaHJ0LgoraW50IFN3aXRjaE1pbmlRdWVzdEFjdGl2ZShzdHJpbmcgbmFtZSkgeworICBpZiAoIWFsbG93ZWRfd3JpdGVfYWNjZXNzKCkpCisgICAgcmV0dXJuIC0xOworICAvLyBIYWJlbiB3aXIgZWluZSBzb2xjaGUgTVEgdWViZXJoYXVwdD8KKyAgaWYgKCFtZW1iZXIobWluaXF1ZXN0cywgbmFtZSkpCisgICAgcmV0dXJuIC0yOworCisgIC8vIGFjdGl2ZS1GbGFnIGludmVydGllcmVuCisgIG1pbmlxdWVzdHNbbmFtZSwgTVFfREFUQV9BQ1RJVkVdID0gIW1pbmlxdWVzdHNbbmFtZSwgTVFfREFUQV9BQ1RJVkVdOworICBzYXZlX2luZm8oKTsKKworICBNUU1MT0coc3ByaW50ZigiJXM6ICVzICglcykiLAorICAgIChtaW5pcXVlc3RzW25hbWUsTVFfREFUQV9BQ1RJVkVdPyJBY3RpdmF0ZSI6IkRlYWN0aXZhdGUiKSwgbmFtZSwKKyAgICBnZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpKSkKKyAgKTsKKyAgcmV0dXJuIG1pbmlxdWVzdHNbbmFtZSxNUV9EQVRBX0FDVElWRV07Cit9CisKK2ludCBHaXZlTWluaVF1ZXN0KG9iamVjdCB3aW5uZXIpIHsKKyAgLy8gU3BpZWxlciBtdXNzIGV4aXN0aWVyZW4gdW5kIGludGVyYWN0aXZlIHNlaW4uCisgIGlmICghd2lubmVyIHx8CisgICAgICAodGhpc19pbnRlcmFjdGl2ZSgpICYmICh0aGlzX2ludGVyYWN0aXZlKCkgIT0gd2lubmVyKSkgfHwKKyAgICAgICgodGhpc19wbGF5ZXIoKSA9PSB3aW5uZXIpICYmICFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHdpbm5lcikpKQorICAgIHJldHVybiBNUV9JTExFR0FMX09CSjsKKyAgLy8gR2Flc3RlIGtvZW5uZW4ga2VpbmUgTWluaXF1ZXN0cyBiZXN0ZWhlbi4KKyAgaWYgKHdpbm5lci0+UXVlcnlHdWVzdCgpKQorICAgIHJldHVybiBNUV9HVUVTVDsKKyAgLy8gQXVmcnVmZW5kZXMgT2JqZWt0IGV4aXN0aWVydCBnYXIgbmljaHQ/CisgIGlmICghcHJldmlvdXNfb2JqZWN0KCkpCisgICAgcmV0dXJuIE1RX0lMTEVHQUxfT0JKOworCisgIHN0cmluZyBvYmpuYW1lID0gbG9hZF9uYW1lKHByZXZpb3VzX29iamVjdCgpKTsKKyAgLy8gTWluaXF1ZXN0IG11c3MgZXhpc3RpZXJlbgorICBpZiAoIW1lbWJlcihtaW5pcXVlc3RzLG9iam5hbWUpKQorICAgIHJldHVybiBNUV9LRVlfSU5WQUxJRDsKKyAgLy8gSW5ha3RpdmUgTWluaXF1ZXN0cyBrb2VubmVuIG5pY2h0IHZlcmdlYmVuIHdlcmRlbi4KKyAgaWYgKCFtaW5pcXVlc3RzW29iam5hbWUsIE1RX0RBVEFfQUNUSVZFXSkKKyAgICByZXR1cm4gTVFfSVNfSU5BQ1RJVkU7CisKKyAgc3RyaW5nIG1xID0gKE1BU1RFUi0+cXVlcnlfbXEoZ2V0dWlkKHdpbm5lcikpIHx8ICIiKTsKKworICAvLyBTcGllbGVyIGhhdCBkaWUgTVEgc2Nob25tYWwgYmVzdGFuZGVuPyBEYW5uIGtlaW5lIHdlaXRlcmVuIEFrdGl2aXRhZXQKKyAgLy8gbm9ldGlnCisgIGlmICh0ZXN0X2JpdChtcSwgbWluaXF1ZXN0c1tvYmpuYW1lLCBNUV9EQVRBX1FVRVNUTk9dKSkKKyAgICByZXR1cm4gTVFfQUxSRUFEWV9TRVQ7CisKKyAgY2F0Y2gobXEgPSBzZXRfYml0KG1xLCBtaW5pcXVlc3RzW29iam5hbWUsTVFfREFUQV9RVUVTVE5PXSk7cHVibGlzaCk7CisgIE1BU1RFUi0+dXBkYXRlX21xKGdldHVpZCh3aW5uZXIpLCBtcSk7CisKKyAgTVFTT0xWRURMT0coc3ByaW50ZigiJXM6ICVzLCAoIyVkKSwgKFN0dXBzZSAlZCkiLAorICAgIG9iam5hbWUsIGdldGV1aWQod2lubmVyKSwgbWluaXF1ZXN0c1tvYmpuYW1lLCBNUV9EQVRBX1FVRVNUTk9dLAorICAgIG1pbmlxdWVzdHNbb2JqbmFtZSwgTVFfREFUQV9QT0lOVFNdKSk7CisKKyAgLy8gTWluaXF1ZXN0LUV2ZW50IGF1c2xvZXNlbgorICBFVkVOVEQtPlRyaWdnZXJFdmVudCggRVZUX0xJQl9NSU5JUVVFU1RfU09MVkVELCAoWworICAgICAgICAgICAgRV9PQkpFQ1Q6IHByZXZpb3VzX29iamVjdCgpLAorICAgICAgICAgICAgRV9PQk5BTUU6IG9iam5hbWUsCisgICAgICAgICAgICBFX1BMTkFNRTogZ2V0dWlkKHdpbm5lciksCisgICAgICAgICAgICBFX01JTklRVUVTVE5BTUU6IG1pbmlxdWVzdHNbb2JqbmFtZSwgTVFfREFUQV9USVRMRV0gXSkgKTsKKworICAvLyBTcGllbGVyZWludHJhZyBhdXMgZGVtIE1RLVB1bmt0ZS1DYWNoZSBsb2VzY2hlbgorICBtX2RlbGV0ZSh1c2Vyc19tcSwgZ2V0dWlkKHdpbm5lcikpOworCisgIHJldHVybiAxOworfQorCitpbnQgUXVlcnlNaW5pUXVlc3RQb2ludHMobWl4ZWQgcGwpIHsKKyAgc3RyaW5nIHNwaWVsZXI7CisKKyAgLy9pZiAoIWFsbG93ZWRfd3JpdGVfYWNjZXNzKCkpCisgIC8vICByZXR1cm4gMDsKKworICBpZiAoIXBsKQorICAgIHJldHVybiAtMTsKKworICBpZiAoIW9iamVjdHAocGwpICYmICFzdHJpbmdwKHBsKSkKKyAgICByZXR1cm4gLTI7CisKKyAgaWYgKG9iamVjdHAocGwpICYmICFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHBsKSkKKyAgICByZXR1cm4gLTM7CisKKyAgaWYgKG9iamVjdHAocGwpKQorICAgIHNwaWVsZXIgPSBnZXR1aWQocGwpOworICBlbHNlCisgICAgc3BpZWxlciA9IHBsOworCisgIGlmICghbWVtYmVyKHVzZXJzX21xLCBzcGllbGVyKSkgeworICAgIGludCBtcXBvaW50czsKKyAgICBpbnQgcD0tMTsKKyAgICBzdHJpbmcgcyA9IChNQVNURVItPnF1ZXJ5X21xKHNwaWVsZXIpIHx8ICIiKTsKKyAgICB3aGlsZSggKHA9bmV4dF9iaXQocywgcCkpICE9IC0xKSB7CisgICAgICBtcXBvaW50cys9YnlfbnVtW3BdWzBdOworICAgIH0KKyAgICB1c2Vyc19tcVtzcGllbGVyXSA9IG1xcG9pbnRzOworICB9CisgIHJldHVybiB1c2Vyc19tcVtzcGllbGVyXTsKK30KKworaW50IEhhc01pbmlRdWVzdChtaXhlZCBwbCwgbWl4ZWQgbmFtZSkgeworICBzdHJpbmcgbXEsIHNwaWVsZXI7CisKKyAgaWYgKCFwbCB8fCAhbmFtZSkKKyAgICByZXR1cm4gTVFfSUxMRUdBTF9PQko7CisKKyAgaWYgKCFvYmplY3RwKHBsKSAmJiAhc3RyaW5ncChwbCkpCisgICAgcmV0dXJuIE1RX0lMTEVHQUxfT0JKOworCisgIGlmIChvYmplY3RwKHBsKSAmJiAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShwbCkpCisgICAgcmV0dXJuIE1RX0lMTEVHQUxfT0JKOworCisgIGlmICghb2JqZWN0cChuYW1lKSAmJiAhc3RyaW5ncChuYW1lKSAmJiAhaW50cChuYW1lKSkKKyAgICByZXR1cm4gTVFfSUxMRUdBTF9PQko7CisKKyAgaWYgKG9iamVjdHAobmFtZSkpCisgICAgbmFtZSA9IGV4cGxvZGUob2JqZWN0X25hbWUobmFtZSksICIjIilbMF07CisKKyAgaWYgKCBpbnRwKG5hbWUpICkKKyAgICBuYW1lID0gYnlfbnVtW25hbWVdWzFdOworCisgIGlmIChvYmplY3RwKHBsKSkKKyAgICBzcGllbGVyID0gZ2V0dWlkKHBsKTsKKyAgZWxzZQorICAgIHNwaWVsZXIgPSBwbDsKKworICBpZiAoIW1lbWJlcihtaW5pcXVlc3RzLG5hbWUpKQorICAgIHJldHVybiBNUV9LRVlfSU5WQUxJRDsKKworICBtcSA9IChNQVNURVItPnF1ZXJ5X21xKHNwaWVsZXIpIHx8ICIiKTsKKworICByZXR1cm4gdGVzdF9iaXQobXEsIG1pbmlxdWVzdHNbbmFtZSwgTVFfREFUQV9RVUVTVE5PXSk7Cit9CisKKy8vIFp1bSBWb24tSGFuZC1TZXR6ZW4gZGVyIE1pbmlRdWVzdHMKK2ludCBTZXRQbGF5ZXJNaW5pUXVlc3Qoc3RyaW5nIHBsLCBzdHJpbmcgbmFtZSkgeworICBpZighYWxsb3dlZF93cml0ZV9hY2Nlc3MoKSkKKyAgICByZXR1cm4gMDsKKyAgaWYoIXBsKQorICAgIHJldHVybiBNUV9JTExFR0FMX09CSjsKKyAgaWYoIXByZXZpb3VzX29iamVjdCgpKQorICAgIHJldHVybiBNUV9JTExFR0FMX09CSjsKKworICBpZiAoIW1lbWJlcihtaW5pcXVlc3RzLG5hbWUpKQorICAgIHJldHVybiBNUV9LRVlfSU5WQUxJRDsKKworICBzdHJpbmcgbXEgPSAoTUFTVEVSLT5xdWVyeV9tcShwbCkgfHwgIiIpOworCisgIGlmICh0ZXN0X2JpdChtcSwgbWluaXF1ZXN0c1tuYW1lLE1RX0RBVEFfUVVFU1ROT10pKQorICAgIHJldHVybiBNUV9BTFJFQURZX1NFVDsKKworICBjYXRjaCAobXEgPSBzZXRfYml0KG1xLCBtaW5pcXVlc3RzW25hbWUsIE1RX0RBVEFfUVVFU1ROT10pO3B1Ymxpc2gpOworICBNQVNURVItPnVwZGF0ZV9tcShwbCwgbXEpOworCisgIE1RTUxPRyhzcHJpbnRmKCJTZXRQbGF5ZXJNaW5pUXVlc3Q6ICVzICVzICglcykiLAorICAgICAgICAgICAgICAgICBwbCwgbmFtZSwgZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSkpKTsKKyAgLy8gU3BpZWxlcmVpbnRyYWcgYXVzIGRlbSBNUS1QdW5rdGUtQ2FjaGUgbG9lc2NoZW4KKyAgbV9kZWxldGUodXNlcnNfbXEsIHBsKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBDbGVhclBsYXllck1pbmlRdWVzdChzdHJpbmcgcGwsIHN0cmluZyBuYW1lKSB7CisgIGlmICghYWxsb3dlZF93cml0ZV9hY2Nlc3MoKSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKCFwbCkKKyAgICByZXR1cm4gTVFfSUxMRUdBTF9PQko7CisgIGlmICghcHJldmlvdXNfb2JqZWN0KCkpCisgICAgcmV0dXJuIE1RX0lMTEVHQUxfT0JKOworCisgIGlmICghbWVtYmVyKG1pbmlxdWVzdHMsbmFtZSkpCisgICAgcmV0dXJuIE1RX0tFWV9JTlZBTElEOworCisgIHN0cmluZyBtcSA9IChNQVNURVItPnF1ZXJ5X21xKHBsKSB8fCAiIik7CisKKyAgaWYgKCF0ZXN0X2JpdChtcSwgbWluaXF1ZXN0c1tuYW1lLCBNUV9EQVRBX1FVRVNUTk9dKSkKKyAgICByZXR1cm4gTVFfQUxSRUFEWV9TRVQ7CisKKyAgY2F0Y2ggKG1xID0gY2xlYXJfYml0KG1xLCBtaW5pcXVlc3RzW25hbWUsIE1RX0RBVEFfUVVFU1ROT10pO3B1Ymxpc2gpOworICBNQVNURVItPnVwZGF0ZV9tcShwbCwgbXEpOworCisgIE1RTUxPRyhzcHJpbnRmKCJDbGVhclBsYXllck1pbmlRdWVzdDogJXMgJXMgKCVzKSIsCisgICAgICAgICAgICAgICAgIHBsLCBuYW1lLCBnZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpKSkpOworICAvLyBTcGllbGVyZWludHJhZyBhdXMgZGVtIE1RLVB1bmt0ZS1DYWNoZSBsb2VzY2hlbgorICBtX2RlbGV0ZSh1c2Vyc19tcSwgcGwpOworICByZXR1cm4gMTsKK30KKworLy8gVW10cmFnZW4gdm9uIE1pbmlxdWVzdHMgdm9uIE9iamVrdCA8b2xkPiBhdWYgT2JqZWt0IDxuZXc+CitpbnQgTW92ZU1pbmlRdWVzdChzdHJpbmcgb2xkX21xb2IsIHN0cmluZyBuZXdfbXFvYikgeworICBpZiAoICFhbGxvd2VkX3dyaXRlX2FjY2VzcygpICkKKyAgICByZXR1cm4gLTE7CisKKyAgLy8gSGFiZW4gd2lyIHVlYmVyaGF1cHQgZWluZW4gc29sY2hlbiBFaW50cmFnPworICBpZiAoICFtZW1iZXIobWluaXF1ZXN0cywgb2xkX21xb2IpICkKKyAgICByZXR1cm4gLTI7CisKKyAgLy8gUHJ1ZWZlbiwgb2IgZGllIGFscyA8bmV3X21xb2I+IGFuZ2VnZWJlbmUgRGF0ZWkgZXhpc3RpZXJ0LgorICBpZiAobmV3X21xb2JbPDIuLl0gPT0gIi5jIikKKyAgICBuZXdfbXFvYiA9IG5ld19tcW9iWzAuLjwzXTsKKyAgbmV3X21xb2IgPSBleHBsb2RlKG5ld19tcW9iLCAiIyIpWzBdOworICBuZXdfbXFvYiA9IChzdHJpbmcpIi9zZWN1cmUvbWFzdGVyIi0+X2dldF9wYXRoKG5ld19tcW9iLDApOworICBpZiAoZmlsZV9zaXplKG5ld19tcW9iKyIuYyIpIDw9IDApCisgICAgcmV0dXJuIC0zOworICAvLyBXZW5uIGRhcyBuZXVlIE9iamVrdCBzY2hvbiBlaW5lIE1RIHZlcmdpYnQsIGthbm4gZXMga2VpbmUgd2VpdGVyZQorICAvLyBhbm5laG1lbi4KKyAgaWYgKCBtZW1iZXIobWluaXF1ZXN0cywgbmV3X21xb2IpICkKKyAgICByZXR1cm4gLTQ7CisKKyAgLy8gRGVyIE1pbmlxdWVzdGxpc3RlIGVpbmVuIG5ldWVuIEtleSAibmV3IiBtaXQgZGVuIERhdGVuIGRlcyBhbHRlbiBLZXlzCisgIC8vIGhpbnp1ZnVlZ2VuLiBtX2VudHJ5KCkgbGllZmVydCBhbGxlIFZhbHVlcyBkYXp1IGFscyBBcnJheSwgdW5kIGRlcgorICAvLyBmbGF0dGVuLU9wZXJhdG9yICIuLi4iIHVlYmVyZ2lidCBkZXNzZW4gRWxlbWVudGUgYWxzIGVpbnplbG5lIFBhcmFtZXRlci4KKyAgbV9hZGQobWluaXF1ZXN0cywgbmV3X21xb2IsIG1fZW50cnkobWluaXF1ZXN0cywgb2xkX21xb2IpLi4uKTsKKyAgbV9kZWxldGUobWluaXF1ZXN0cywgb2xkX21xb2IpOworICAvLyBOdW1tZXJuLUluZGV4IGF1Y2ggdW10cmFnZW4sIHNvbnN0IGtvZW5uZW4gRnVua3Rpb25lbiB3aWUgekIKKyAgLy8gUXVlcnlNaW5pUXVlc3RCeU51bWJlcigpIGRpZSBuZXVlIG5pY2h0IGZpbmRlbi4KKyAgYnlfbnVtW21pbmlxdWVzdHNbbmV3X21xb2IsTVFfREFUQV9RVUVTVE5PXV1bMV0gPSBuZXdfbXFvYjsKKyAgcmV0dXJuIDE7Cit9CisKKyNkZWZpbmUgRlJBX0JJQiAiL2QvZWJlbmUvbWlyaWwvZnJhdGVybml0YXMvcm9vbS9iaWJsaW90aGVrIgorCisvLyBFcmxhdWJ0IGRpZSBBYmZyYWdlIGFsbGVyIE1RcyBlaW5lciBiZXN0aW1tdGVuIFJlZ2lvbiBmdWVyIGRpZSBCaWJsaW90aGVrCisvLyBkZXIga2xlaW5lbiB1bmQgZ3Jvc3NlbiBIZWxkZW50YXRlbiBpbiBkZXIgRnJhdGVybml0YXMuCisvLyBHaWJ0IGVpbiBNYXBwaW5nIGRlciBGb3JtIChbIGluZGV4bnVtbWVyIDogdGl0ZWw7IGVybGVkaWd0X0Jlc2NocmVpYnVuZyBdKQorLy8genVydWVjay4KK21hcHBpbmcgUXVlcnlTb2x2ZWRNUXNCeURvbWFpbihtaXhlZCBwbCwgc3RyaW5nIHJlZ2lvbikgeworICBpZiAoICFvYmplY3RwKHBsKSAmJiAhc3RyaW5ncChwbCkgJiYgCisgICAgICAgbG9hZF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSE9RlJBX0JJQikgLyp8fCAhYWxsb3dlZF93cml0ZV9hY2Nlc3MoKSkqLworICAgIHJldHVybiAoWzoyXSk7CisKKyAgbWFwcGluZyByZXMgPSBtX2FsbG9jYXRlKDMwLDIpOyAgIC8vIHJlaWNodCB2ZXJtdXRsaWNoCisgIC8vIERpZSBhbmdlZ2ViZW5lIFJlZ2lvbiBtdXNzIGluIGRlciBTcGFsdGUgTVFfREFUQV9BU1NJR05FRF9ET01BSU4KKyAgLy8gZW50aGFsdGVuIHNlaW4sIHVuZCBkYXMgYWJmcmFnZW5kZSBPYmpla3QgbXVzcyBkaWUgRnJhdGVybml0YXMtQmliIHNlaW4KKyAgZm9yZWFjaChzdHJpbmcgbXFvYmosIGludCBtcXAsIGludCBpbmRleCwgc3RyaW5nIHRhc2ssIGludCB2aXMsIGludCBhY3QsCisgICAgc3RyaW5nIHRpdGxlLCBzdHJpbmcgZG9uZWRlc2MsIG1hcHBpbmcgcmVzdHIsIHN0cmluZyBkb21haW46CisgICAgbWluaXF1ZXN0cykgeworICAgICAgLy8gYWt0aXZlIE1RcyBkZXIgYW5nZWZvcmRlcnRlbiBSZWdpb24genVzYW1tZW50cmFnZW4sIGRpZSBkZXIgU3BpZWxlcgorICAgICAgLy8gYmVzdGFuZGVuIGhhdC4KKyAgICAgIGlmICggZG9tYWluID09IHJlZ2lvbiAmJiBhY3QgJiYgSGFzTWluaVF1ZXN0KHBsLCBtcW9iaikgKQorICAgICAgICBtX2FkZChyZXMsIGluZGV4LCB0aXRsZSwgZG9uZWRlc2MpOworICB9CisgIC8vREVCVUcoc3ByaW50ZigiJU9cbiIscmVzKSk7CisgIHJldHVybiByZXM7Cit9CisjdW5kZWYgRlJBX0JJQgorCisvLyBBYmZyYWdlIGRlciBub2NoIG9mZmVuZW4gTVFzIGRlcyBhbmdlZ2ViZW5lbiBTcGllbGVycy4KKy8vIFp1cnVlY2tnZWdlYmVuIHdpcmQgZWluIE1hcHBpbmcgbWl0IGRlbiBNaW5pcXVlc3QtTnVtbWVybiBhbHMgS2V5cyB1bmQKKy8vIGRlbiBBdWZnYWJlbmJlc2NocmVpYnVuZ2VuIGFscyBWYWx1ZXMsIG9kZXIgZWluIGxlZXJlcyBNYXBwaW5nLCBmYWxscworLy8gZGFzIGFiZnJhZ2VuZGUgT2JqZWt0IGtlaW5lIFp1Z3JpZmZzYmVyZWNodGlndW5nIGhhdCwgb2RlciBkYXMgCisvLyB1ZWJlcmdlYmVuZSBTcGllbGVyb2JqZWt0IGtlaW5lIG9mZmVuZW4gTWluaXF1ZXN0cyBtZWhyIGhhdC4KK21hcHBpbmcgUXVlcnlPcGVuTWluaVF1ZXN0c0ZvclBsYXllcihvYmplY3Qgc3BpZWxlcikgeworICAvLyBtYXAoKSBldHdhcyBiZXNjaGxldW5pZ2VuCisgIGNsb3N1cmUgY2hrX3Jlc3RyID0gc3ltYm9sX2Z1bmN0aW9uKCJjaGVja19yZXN0cmljdGlvbnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL3N0ZC9yZXN0cmljdGlvbl9jaGVja2VyIik7CisgIC8vIENhY2hlLUVpbnRyYWcgZnVlciBkYXMgYWJmcmFnZW5kZSBPYmpla3QgaG9sZW4KKyAgc3RyaW5nICpsaXN0ID0gbXFfcXVlcnlfcGVybWl0dGVkW2xvYWRfbmFtZShwcmV2aW91c19vYmplY3QoKSldOworICBtYXBwaW5nIHJlcyA9IChbOjJdKTsgCisgIAorICBpZiAoIXBvaW50ZXJwKGxpc3QpIHx8ICFzaXplb2YobGlzdCkpCisgICAgcmV0dXJuIHJlczsKKyAgLy8gTGlzdGUgZGVyIE1RLU9iamVrdGUgdW13YW5kZWxuIGluIGRlcmVuIE1RLU51bW1lciBwbHVzIAorICAvLyBBdWZnYWJlbmJlc2NocmVpYnVuZywgc29mZXJuIGRlciBTcGllbGVyIGRpZSBNUSBub2NoIG5pY2h0IGJlc3RhbmRlbgorICAvLyBoYXQsIGFiZXIgZGllIFZvcmF1c3NldHp1bmdlbiBlcmZ1ZWxsdC4KKyAgZm9yZWFjaCAoIHN0cmluZyBtcV9vYmogOiBsaXN0ICkgCisgIHsKKyAgICAvLyBOdXIgd2VubiBkZXIgU3BpZWxlciBkaWUgTVEgbm9jaCBuaWNodCBoYXQsIGthbm4gZXIgdWViZXJoYXVwdCBlaW5lbgorICAgIC8vIFRpcCBkYXp1IGJla29tbWVuLgorICAgIGlmICggIUhhc01pbmlRdWVzdChzcGllbGVyLCBtcV9vYmopICkgeworICAgICAgLy8gUmVzdHJpY3Rpb24gQ2hlY2tlciBmcmFnZW4sIG9iIGRlciBTcGllbGVyIHN0YXR0IGRlcyBIaW53ZWlzZXMKKyAgICAgIC8vIGVpbmUgSW5mbyBiZWtvbW1lbiBtdXNzLCBkYXNzIGVyIGVpbmUgVm9yYmVkaW5ndW5nIG5pY2h0IGVyZnVlbGx0LgorICAgICAgc3RyaW5nIHJlc3RyX3Jlc3VsdCA9IGZ1bmNhbGwoY2hrX3Jlc3RyLCBzcGllbGVyLCBtaW5pcXVlc3RzW21xX29iaiwKKyAgICAgICAgTVFfREFUQV9SRVNUUklDVElPTlNdKTsKKyAgICAgIC8vIFdlbm4gc28gZWluZSBJbmZvIGRhYmVpIHJhdXNrb21tdCwgd2lyZCBkaWVzZSBpbiBkaWUgRXJnZWJuaXNsaXN0ZQorICAgICAgLy8gdWViZXJub21tZW4uIEluIGRpZXNlbSBGYWxsIHdpcmQgS0VJTiBNUS1IaW53ZWlzdGV4dCBhdXNnZWxpZWZlcnQuCisgICAgICBpZiAoIHN0cmluZ3AocmVzdHJfcmVzdWx0KSApCisgICAgICB7CisgICAgICAgIG1fYWRkKHJlcywgbWluaXF1ZXN0c1ttcV9vYmosTVFfREFUQV9RVUVTVE5PXSwgMCwgcmVzdHJfcmVzdWx0KTsKKyAgICAgIH0KKyAgICAgIC8vIEFuZGVyZW5mYWxscyB3aXJkIGRlciBIaW53ZWlzdGV4dCB1ZWJlcm5vbW1lbjsgZWluZW4gRWludHJhZyAKKyAgICAgIC8vIGJ6Z2wuIGVpbmVzIGV2ZW50dWVsbGVuIEhpbmRlcnVuZ3NncnVuZGVzIGdpYnQncyBkYW5uIG5pY2h0LgorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBtX2FkZChyZXMsIG1pbmlxdWVzdHNbbXFfb2JqLE1RX0RBVEFfUVVFU1ROT10sIAorICAgICAgICAgIG1pbmlxdWVzdHNbbXFfb2JqLE1RX0RBVEFfVEFTS0RFU0NdLCAwKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLy8gRXJnZWJuaXNsaXN0ZSB6dXJ1ZWNrZ2ViZW4uCisgIHJldHVybiByZXM7Cit9CisKKy8vIERhdGVua29udmVydGVyIGZ1ZXIgZGFzIGJpc2hlcmlnZSBNUS1NYXBwaW5nIHZvbgorLy8gKFsgb2JqIDogKHtkYXRlbjEuLmRhdGVuNX0pIF0pIG5hY2gKKy8vIChbIG9iaiA6IGRhdGVuMTsgZGF0ZW4yOyAuLi47IGRhdGVuOSBdKSwgd29iZWkgZGF0ZW42Li45IGFscyBMZWVyc3BhbHRlbgorLy8gZXJ6ZXVndCB3ZXJkZW4uCisvKnZvaWQgQ29udmVydE1RRGF0YSgpIHsKKyAgaWYgKCAhYWxsb3dlZF93cml0ZV9hY2Nlc3MoKSApCisgICAgcmV0dXJuOworCisgIGJ5X251bT0oW10pOworICAvLyBzcGFsdGVud2Vpc2UgYXVzIGRlbSBtaW5pcXVlc3RzLU1hcHBpbmcgZWluIEFycmF5IGF1cyBBcnJheXMgZXJ6ZXVnZW4KKyAgLy8gWnVuYWVjaHN0IGRpZSBLZXlzIGRlcyBNYXBwaW5ncyBhdWZuZWhtZW4uCisgIG1peGVkICptcWRhdGEgPSAoe21faW5kaWNlcyhtaW5pcXVlc3RzKX0pOworCisgIC8vIERhbm4gZGFzIERhdGVuYXJyYXkgc3BhbHRlbndlaXNlIGRhenUgKGplZGVzIEFycmF5IGlzdCBlaW5lIFNwYWx0ZSkuCisgIG1xZGF0YSArPSB0cmFuc3Bvc2VfYXJyYXkobV92YWx1ZXMobWluaXF1ZXN0cykpOworICAvLyAxLiBBcnJheTogS2V5cywgYWxsZSB3ZWl0ZXJlbiBqZXdlaWxzIGVpbmUgV2VydGVzcGFsdGUKKworICAvLyBBcnJheSBlcnpldWdlbiBhbHMgQXJyYXkgYXVzIDUgQXJyYXktRWxlbWVudGVuLCBkaWUgYWxsZSBzb3ZpZWxlCisgIC8vIE51bGxlbiBlbnRoYWx0ZW4sIHdpZSBlcyBNaW5pcXVlc3RzIGdpYnQsCisgIC8vICh7ICh7MCwwLC4uLn0pLCAoezAsMCwuLi59KSwgKHswLDAsLi4ufSksICh7MCwwLC4uLn0pLCAoezAsMCwuLi59KSB9KQorICAvLyBkaWVzZXMgaGluenVmdWVnZW4uIFNpbmQgZGllIGhpbnp1a29tbWVuZGVuIDUgU3BhbHRlbi4KKyAgbXFkYXRhICs9IGFsbG9jYXRlKDUsIGFsbG9jYXRlKHNpemVvZihtaW5pcXVlc3RzKSwwKSk7CisKKyAgLy8gTWFwcGluZyBlcnpldWdlbiwgaW5kZW0gbWl0IGRlbSBmbGF0dGVuLU9wZXJhdG9yICIuLi4iIGRpZSBFaW56ZWwtCisgIC8vIEFycmF5cyBkZXMgRGF0ZW5wYWtldHMgdWViZXJnZWJlbiB3ZXJkZW4uIEVyemV1Z3QgYXVmIGRpZXNlIFdlaXNlCisgIC8vIChbIGtleXMgOiBkYXRlbjE7IGRhdGVuMjsgZGF0ZW4zOyBkYXRlbjQ7IGRhdGVuNTsgMDsgMDsgMDsgMDsgMCxdKQorICBtaW5pcXVlc3RzPW1rbWFwcGluZyhtcWRhdGEuLi4pOworfQorCisvLyBOZXVlIERhdGVuIGVpbmxlc2VuLCBWaXNpYmxlLUZsYWcgYmVpIGFsbGVuIE1RcyBwZXIgRGVmYXVsdCBhdWYgMSBzZXR6ZW4uCisvLyBFcyBnaWJ0IGtlaW5lIHdpcmtsaWNoIHVuc2ljaHRiYXJlbiBNUXMgbWVoci4KK3ZvaWQgUmVhZE5ld0RhdGEoKSB7CisgIGlmICggIWFsbG93ZWRfd3JpdGVfYWNjZXNzKCkgKQorICAgIHJldHVybjsKKworICBzdHJpbmcgKmltcG9ydCA9IGV4cGxvZGUocmVhZF9maWxlKCIvcGxheWVycy9hcmF0aG9ybi9tcWRhdGEiKSwiXG4iKS0oeyIifSk7CisgIHN0cmluZyAqZmllbGRzOworICBmb3JlYWNoKHN0cmluZyBtcWRhdGEgOiBpbXBvcnQpIHsKKyAgICBmaWVsZHMgPSBleHBsb2RlKG1xZGF0YSwgIiMiKS0oeyIifSk7CisgICAgREVCVUcoc3ByaW50ZigiJU9cbiIsIGZpZWxkc1swXSkpOworICAgIGlmICggbWluaXF1ZXN0c1tmaWVsZHNbNF0sIE1RX0RBVEFfUVVFU1ROT10gIT0gdG9faW50KGZpZWxkc1swXSkgKSB7CisgICAgICByYWlzZV9lcnJvcigiTVEtTnVtbWVybiBzdGltbWVuIG5pY2h0IHVlYmVyZWluIVxuIik7CisgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIGZpZWxkc1s0XSBpc3QgZGVyIE1RLU9iamVrdHBmYWQKKyAgICBtaW5pcXVlc3RzW2ZpZWxkc1s0XSwgTVFfREFUQV9USVRMRV0gPSBmaWVsZHNbN107CisgICAgbWluaXF1ZXN0c1tmaWVsZHNbNF0sIE1RX0RBVEFfRElBUllURVhUXSA9IGZpZWxkc1s2XTsKKyAgICBtaW5pcXVlc3RzW2ZpZWxkc1s0XSwgTVFfREFUQV9UQVNLREVTQ10gPSBmaWVsZHNbNV07CisgICAgbWluaXF1ZXN0c1tmaWVsZHNbNF0sIE1RX0RBVEFfVklTSUJMRV0gPSAxOyAvLyBEZWZhdWx0OiB2aXNpYmxlCisgICAgbWluaXF1ZXN0c1tmaWVsZHNbNF0sIE1RX0RBVEFfQVNTSUdORURfRE9NQUlOXSA9IGZpZWxkc1s4XTsKKyAgICBtaW5pcXVlc3RzW2ZpZWxkc1s0XSwgTVFfREFUQV9RVUVSWV9QRVJNSVRURURdID0gZmllbGRzWzldOworICAgIGlmICggZmllbGRzWzNdICE9ICIwIiApIHsKKyAgICAgIG1pbmlxdWVzdHNbZmllbGRzWzRdLCBNUV9EQVRBX1JFU1RSSUNUSU9OU10gPQorICAgICAgICByZXN0b3JlX3ZhbHVlKGZpZWxkc1szXSsiXG4iKTsKKyAgICB9CisgICAgZWxzZSBtaW5pcXVlc3RzW2ZpZWxkc1s0XSwgTVFfREFUQV9SRVNUUklDVElPTlNdID0gMDsKKyAgICBpZiAoIGZpZWxkc1s5XSAhPSAiMCIgKQorICAgICAgbWluaXF1ZXN0c1tmaWVsZHNbNF0sIE1RX0RBVEFfUVVFUllfUEVSTUlUVEVEXSA9CisgICAgICAgIHJlc3RvcmVfdmFsdWUoZmllbGRzWzldKyJcbiIpOworICAgIGVsc2UgbWluaXF1ZXN0c1tmaWVsZHNbNF0sIE1RX0RBVEFfUVVFUllfUEVSTUlUVEVEXSA9IDA7CisgIH0KK30KKyovCmRpZmYgLS1naXQgYS9zZWN1cmUvcXVlc3RtYXN0ZXIuaCBiL3NlY3VyZS9xdWVzdG1hc3Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZjYxYWEKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvcXVlc3RtYXN0ZXIuaApAQCAtMCwwICsxLDEzMiBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHF1ZXN0bWFzdGVyLmggLS0gaGVhZGVyIGZpbGUgZm9yIHF1ZXN0bWFzdGVyIG9iamVjdAorLy8KKy8vICRJZDogcXVlc3RtYXN0ZXIuaCA4MjYxIDIwMTItMTItMDQgMjI6NTY6MjlaIFplc3N0cmEgJAorCisjaWZuZGVmIF9fUVVFU1RNQVNURVJfSF9fCisjZGVmaW5lIF9fUVVFU1RNQVNURVJfSF9fCisKKy8vWFAgdGhyZXNob2xkICAKKworI2RlZmluZSBYUF9ORUVERURfRk9SX1dJWiAxMDAwMDAwCisKKy8vIHRoZSBxdWVzdG1hc3RlcgorI2RlZmluZSBRTSAgICAgICAgICIvc2VjdXJlL3F1ZXN0bWFzdGVyIgorCisvLyB0aGUgcXVlc3RzIGZpbGUKKyNkZWZpbmUgUVVFU1RTICAgICAgICAiL3NlY3VyZS9BUkNIL3F1ZXN0bWFzdGVyIgorCisvLyBEdW1wZmlsZSBmb3IgTWluaVF1ZXN0cworI2RlZmluZSBNUV9EVU1QX0ZJTEUgICIvc2VjdXJlL0FSQ0gvTUlOSVFVRVNUUy5kdW1wIgorCisvLyBwZXJjZW50YWdlIG9mIG1heF9RUCB3aGljaCBpcyBuZWVkZWQgdG8gYmVjb21lIHdpemFyZAorI2RlZmluZSBRUF9QRVJDRU5UIDgwCisKKworLy8gbWluaW11bSBvZiBRUCB0byBiZWNvbWUgU2VlciBvciBXaXp6YXJkCisjZGVmaW5lIFFQX01JTiAxMTk2CisKKworLy8gbG9nIHRvIGZpbGUKKworI2RlZmluZSBRTUxPRyh4KSB3cml0ZV9maWxlKCIvbG9nL1FVRVNUTUFTVEVSIixkdGltZSh0aW1lKCkpKyI6ICIrXAorICAgICAgICBnZXRldWlkKHRoaXNfaW50ZXJhY3RpdmUoKSkrIiAtPiAiKyB4ICsiXG4iKQorCisjZGVmaW5lIE1RTUxPRyh4KSB3cml0ZV9maWxlKCIvbG9nL0FSQ0gvTVFVRVNUTUFTVEVSIiwgXAorICAgICAgICBkdGltZSh0aW1lKCkpKyI6ICIrKHRoaXNfaW50ZXJhY3RpdmUoKT9nZXRldWlkKHRoaXNfaW50ZXJhY3RpdmUoKSk6IlVOS05PV04iKStcCisJIiAtPiAiKyB4ICsiXG4iKQorCisjZGVmaW5lIE1RU09MVkVETE9HKHgpIHdyaXRlX2ZpbGUoIi9sb2cvQVJDSC9NUV9TT0xWRUQiLCBcCisgICAgICAgIGR0aW1lKHRpbWUoKSkrIiAiK3grIlxuIikKKworLy8gcXVlc3QgZ3JvdXBzCisKKyNkZWZpbmUgUUdST1VQXzEgOAorI2RlZmluZSBRR1JPVVBfMiAxOAorI2RlZmluZSBRR1JPVVBfMyAyOQorI2RlZmluZSBRR1JPVVBfUyAtMQorCisjZGVmaW5lIFFHUk9VUFMgKHswLFFHUk9VUF8xLFFHUk9VUF8yLCBRR1JPVVBfM30pCisKKworLy8gV2VsY2hlciBFaW50cmFnIGltIEFycmF5IHN0ZWh0IGZ1ZXIgd2FzPworI2RlZmluZSBRX1FQICAgICAgMAorI2RlZmluZSBRX1hQICAgICAgMQorI2RlZmluZSBRX0FMTE9XRUQgMgorI2RlZmluZSBRX0hJTlQgICAgMworI2RlZmluZSBRX0RJRkYgICAgNAorI2RlZmluZSBRX0NMQVNTICAgNQorI2RlZmluZSBRX0FDVElWRSAgNgorI2RlZmluZSBRX1dJWiAgICAgNworI2RlZmluZSBRX1NDTkRXSVogOAorI2RlZmluZSBRX0FUVFIgICAgOQorI2RlZmluZSBRX0FWRVJBR0UgMTAKKworLy8gU3Rlcm5jaGVuIGZ1ZXIgZGllIEtsYXNzZQorCisjZGVmaW5lIFFDTEFTU19TVEFSUyhuKSBmdW5jYWxsKGxhbWJkYSggICh7ICd4LCAncyB9KSwgIFwKKyAgKHsjJ3doaWxlLCAoeyMnPiwgJ3gsIDB9KSwgXAorICAgICAgICAgICAgICdzLCAoeyMnLCAsKHsjJz0sICd4LCAoeyMnLSwgJ3gsIDF9KSB9KSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICh7Iyc9LCAncywgKHsjJyssICdzLCAiKiIgfSkgfSkgXAorICAgICB9KSB9KSApLCBuLCAiIikgLyogJyAqLyAKKworCisvLyBBdHRyaWJ1dGUgZGVyIFF1ZXN0cworI2RlZmluZSBRQVRUUl9GTEVJU1NJRyAgMQorI2RlZmluZSBRQVRUUl9IRVJPSVNDSCAgMgorI2RlZmluZSBRQVRUUl9FUElTQ0ggICAgMworI2RlZmluZSBRQVRUUl9MRUdFTkRBRVIgNAorCisjZGVmaW5lIFFBVFRSX1NUUklOR1MgKFswOiAiIiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgUUFUVFJfRkxFSVNTSUc6ICJmbGVpc3NpZyIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFFBVFRSX0hFUk9JU0NIOiAgImhlcm9pc2NoIiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgUUFUVFJfRVBJU0NIOiAiZXBpc2NoIiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgUUFUVFJfTEVHRU5EQUVSOiAibGVnZW5kYWVyIl0pCisKKworCisvLyBSdWVja2dhYmV3ZXJ0ZSBRdWVzdHMKKworI2RlZmluZSBPSyAgICAgICAgICAgICAgMQorCisjZGVmaW5lIEdRX0FMUkVBRFlfU0VUIC0xCisjZGVmaW5lIEdRX0tFWV9JTlZBTElEIC0yCisjZGVmaW5lIEdRX0lMTEVHQUxfT0JKIC0zCisjZGVmaW5lIEdRX0lTX0lOQUNUSVZFIC00CisKKyNkZWZpbmUgRFFfTk9UX1NFVCAgICAgLTEKKyNkZWZpbmUgRFFfS0VZX0lOVkFMSUQgLTIKKyNkZWZpbmUgRFFfSUxMRUdBTF9PQkogLTMKKworI2RlZmluZSBRUV9HVUVTVCAgICAgICAyCisjZGVmaW5lIFFRX0tFWV9JTlZBTElEIDAKKworI2RlZmluZSBFUlJOT18yX1NUUklORyh4LHkpIChbIkdRMSIgOiAiT2suIixcCisJCQkgICAgICAiR1EtMSI6ICJEaWUgUXVlc3QgaXN0IGJlcmVpdHMgZ2Vsb2VzdCB3b3JkZW4uIixcCisJCQkgICAgICAiR1EtMiI6ICJVbmd1ZWx0aWdlciBRdWVzdG5hbWUuIixcCisJCQkgICAgICAiR1EtMyI6ICJVbmJlZnVndGVyIFp1Z3JpZmYuIixcCisJCQkgICAgICAiR1EtNCI6ICJEaWUgUXVlc3QgaXN0IGRlcnplaXQgaW5ha3Rpdi4iLFwKKwkJCSAgICAgICJEUTEiIDogIk9rLiIsXAorCQkJICAgICAgIkRRLTEiOiAiRGllIFF1ZXN0IHdhciBuaWNodCBnZXNldHp0LiIsXAorCQkJICAgICAgIkRRLTIiOiAiVW5ndWVsdGlnZXIgUXVlc3RuYW1lLiIsXAorCQkJICAgICAgIkRRLTMiOiAiVW5iZWZ1Z3RlciBadWdyaWZmLiIsXAorCQkJICAgICAgIlFRMSIgOiAiT2suIixcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUVEyIiA6ICJHYWVzdGUga29lbm5lbiBrZWluZSBRdWVzdCBsb2VzZW4uIixcCisJCQkgICAgICAiUVEwIiA6ICJVbmd1ZWx0aWdlciBRdWVzdG5hbWUuIixcCisJCQkgICAgICBdKVt4K3ldCisKKworLy8gTWluaXF1ZXN0cworCisjZGVmaW5lIE1RX0FMUkVBRFlfU0VUICAgLTEKKyNkZWZpbmUgTVFfS0VZX0lOVkFMSUQgICAtMgorI2RlZmluZSBNUV9JTExFR0FMX09CSiAgIC0zCisjZGVmaW5lIE1RX0lTX0lOQUNUSVZFICAgLTQKKyNkZWZpbmUgTVFfR1VFU1QgICAgICAgICAtNQorCisKKyNlbmRpZiAvKiBfX1FVRVNUTUFTVEVSX0hfXyAqLworCisKKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL3JlcG1hc3Rlci5jIGIvc2VjdXJlL3JlcG1hc3Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYzgxN2QKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvcmVwbWFzdGVyLmMKQEAgLTAsMCArMSwzMjkgQEAKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIG5vX3NoYWRvdworI3ByYWdtYSBub19pbmhlcml0CisjcHJhZ21hIHZlcmJvc2VfZXJyb3JzCisjcHJhZ21hIHdhcm5fZGVwcmVjYXRlZAorCisjaW5jbHVkZSA8cmVwdXRhdGlvbi5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorCisvKiBEYXRlbnN0cnVrdHVyIHJlcHV0YXRpb25zOgorICogKFsiaWQiOiAoWyJ1aWRzIjogKHsgInVpZDEiLCAidWlkMiIgfSksICJuYW1lIjoiIiwgImNoYW5nZW1zZyI6IiIsICAKKyAqICAgICAgICAgICAiZmxhZ3MiOnh8eHx4CisgKiAgICAgICAgIF0pIAorICogXSkKKyAqIEJzcDoKKyAqIChbInNjaGFlZGxzcGFsdGEiOiAoWyJ1aWRzIjogKHsiZC53YWxkLm5pYmVsIiwgImQud2FsZC5rZXNzYSJ9KSwKKyAqICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogIlNjaGFlZGxzcGFsdGEtS2xhbiIsICJhY3RpdmUiOiAxLAorICogICAgICAgICAgICAgICAgICAgICAgImNoYW5nZW1zZyI6ImJlaW0gU2NoYWVkbHNwYWx0YS1LbGFuIiAKKyAqICAgICAgICAgICAgICAgICAgICBdKQorICogXSkKKyAqLworCitwcml2YXRlIG1hcHBpbmcgcmVwdXRhdGlvbnM7CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpIHsKKyAgc2V0ZXVpZChnZXR1aWQodGhpc19vYmplY3QoKSkpOworCisgIGlmKCFyZXN0b3JlX29iamVjdChSRVBfU0FWRUZJTEUpIHx8ICFtYXBwaW5ncChyZXB1dGF0aW9ucykpIAorICAgIHJlcHV0YXRpb25zID0gKFsgXSk7Cit9CisKKy8vIFp1Z3JpZmYgYXVmIEhhbmRsaW5nbWV0aG9kZW4gZnVlciBST09ULCBFTXMrCitwcml2YXRlIGludCBTZWMoKSB7CisgIGlmKHByb2Nlc3NfY2FsbCgpKSByZXR1cm4gMDsKKyAgaWYocHJldmlvdXNfb2JqZWN0KCkgJiYgZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSkgPT0gUk9PVElEKSByZXR1cm4gMTsKKyAgcmV0dXJuIG9iamVjdHAocHJldmlvdXNfb2JqZWN0KCkpICYmIEFSQ0hfU0VDVVJJVFk7Cit9CisKKworLyogQXJndW1lbnRlOgorICogcmVwaWQgPSBpZCBpbSBtYXBwaW5nIHJlcHV0YXRpb25zCisgKiB2YWxpZHVpZHMgPSBVSURzIHdlbGNoZSBkaWUgUmVwdXRhdGlvbiB2ZXJhZW5kZXJuIGR1ZXJmZW4sIFN0cmluZworICogICAgICAgICAgICAgb2RlciBTdHJpbmctQXJyYXkKKyAqIG5hbWUgPSBOYW1lIGRlciBSZXB1dGF0aW9uc2ZyYWt0aW9uIAorICogY2hhbmdlbXNnID0gVGV4dCBkZXIgaW4gZGllIERlZmF1bHQtQ2hhbmdlbXNnIGVpbmdlZnVlZ3Qgd2lyZAorICogICAgICAgICAgICAgKERlaW4gQW5zZWhlbiAlcyBoYXQgc2ljaCAuLi4gdmVyYmVzc2VydC4pCisgKgorICogUmV0dXJuczoKKyAqICAxID0gUmVwdXRhdGlvbiBlcmZvbGdyZWljaCBoaW56dWdlZnVlZ3QKKyAqIC0xID0gS2VpbmUgWnVncmlmZnNyZWNodGUKKyAqIC0yID0gRmFsc2NoZSBBcmd1bWVudGUKKyAqIC0zID0gUmVwdXRhdGlvbiBiZXJlaXRzIHZvcmhhbmRlbgorICovCitwdWJsaWMgaW50IEFkZFJlcHV0YXRpb24oc3RyaW5nIHJlcGlkLCBtaXhlZCB2YWxpZHVpZHMsIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjaGFuZ2Vtc2cpIHsKKyAgaWYoIVNlYygpKSAKKyAgICByZXR1cm4gLTE7CisgIGlmKHN0cmluZ3AodmFsaWR1aWRzKSkgdmFsaWR1aWRzID0gKHsgdmFsaWR1aWRzIH0pOworICBpZighcG9pbnRlcnAodmFsaWR1aWRzKSkgdmFsaWR1aWRzID0gKHsgfSk7CisgIC8vIHZhbGlkdWlkcyArIGNoYW5nZW1zZ3Mga2FubiBhdWNoIGVyc3RtYWwgbGVlciBibGVpYmVuCisgIGlmKCFzdHJpbmdwKHJlcGlkKSB8fCAhc2l6ZW9mKHJlcGlkKSB8fCAhc3RyaW5ncChuYW1lKSB8fCAhc2l6ZW9mKG5hbWUpKQorICAgIHJldHVybiAtMjsKKyAgaWYobWVtYmVyKHJlcHV0YXRpb25zLCByZXBpZCkpCisgICAgcmV0dXJuIC0zOworICByZXB1dGF0aW9ucyArPSAoWyByZXBpZCA6IChbIAorICAgICJ1aWRzIjogdmFsaWR1aWRzLAorICAgICJuYW1lIjogbmFtZSwKKyAgICAiZmxhZ3MiOiBSRVBfRkxBR19BQ1RJVkUsCisgICAgImNoYW5nZW1zZyI6IGNoYW5nZW1zZworICBdKSBdKTsKKyAgc2F2ZV9vYmplY3QoUkVQX1NBVkVGSUxFKTsKKyAgdGVsbF9vYmplY3QodGhpc19pbnRlcmFjdGl2ZSgpLCBzcHJpbnRmKCJSZXB1dGF0aW9uIGVpbmdldHJhZ2VuOlxuIgorICAgICJOYW1lOiAlc1xuVmFsaWQgVUlEczogJU9cbkZsYWdzOiBSRVBfRkxBR19BQ1RJVkVcbkNoYW5nZW1zZzogJXNcbiIsCisgICAgcmVwdXRhdGlvbnNbcmVwaWRdWyJuYW1lIl0sIHJlcHV0YXRpb25zW3JlcGlkXVsidWlkcyJdLAorICAgIHJlcHV0YXRpb25zW3JlcGlkXVsiY2hhbmdlbXNnIl0pKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qIEFyZ3VtZW50ZToKKyAqIHJlcGlkID0gaWQgaW0gbWFwcGluZyByZXB1dGF0aW9ucworICoKKyAqIFJldHVybnM6CisgKiAgMSA9IHd1cmRlIGVyZm9sZ3JlaWNoIGRlYWt0aXZpZXJ0CisgKiAtMSA9IEtlaW5lIFp1Z3JpZmZzcmVjaHRlCisgKiAtMiA9IEZhbHNjaGUgQXJndW1lbnRlCisgKiAtMyA9IFJlcCBuaWNodCB2b3JoYW5kZW4KKyAqIC00ID0gSXN0IGJlcmVpdHMgZGVha3RpdmllcnQKKyAqLworcHVibGljIGludCBEZWFjdGl2YXRlUmVwdXRhdGlvbihzdHJpbmcgcmVwaWQpIHsKKyAgaWYoIVNlYygpKQorICAgIHJldHVybiAtMTsKKyAgaWYoIXN0cmluZ3AocmVwaWQpIHx8ICFzaXplb2YocmVwaWQpKQorICAgIHJldHVybiAtMjsKKyAgaWYoIW1lbWJlcihyZXB1dGF0aW9ucywgcmVwaWQpKQorICAgIHJldHVybiAtMzsKKyAgaWYoIShyZXB1dGF0aW9uc1tyZXBpZF1bImZsYWdzIl0gJiBSRVBfRkxBR19BQ1RJVkUpKSAKKyAgICByZXR1cm4gLTQ7CisgIHJlcHV0YXRpb25zW3JlcGlkXVsiZmxhZ3MiXSB8PSBSRVBfRkxBR19BQ1RJVkU7CisgIHNhdmVfb2JqZWN0KFJFUF9TQVZFRklMRSk7CisgIHJldHVybiAxOworfQorCisvKiBBcmd1bWVudGU6CisgKiByZXBpZCA9IGlkIGltIG1hcHBpbmcgcmVwdXRhdGlvbnMKKyAqCisgKiBSZXR1cm5zOgorICogIDEgPSB3dXJkZSBlcmZvbGdyZWljaCBha3RpdmllcnQKKyAqIC0xID0gS2VpbmUgWnVncmlmZnNyZWNodGUKKyAqIC0yID0gRmFsc2NoZSBBcmd1bWVudGUKKyAqIC0zID0gUmVwIG5pY2h0IHZvcmhhbmRlbgorICogLTQgPSBJc3QgYmVyZWl0cyBha3RpdmllcnQKKyAqLworcHVibGljIGludCBBY3RpdmF0ZVJlcHV0YXRpb24oc3RyaW5nIHJlcGlkKSB7CisgIGlmKCFTZWMoKSkKKyAgICByZXR1cm4gLTE7CisgIGlmKCFzdHJpbmdwKHJlcGlkKSB8fCAhc2l6ZW9mKHJlcGlkKSkKKyAgICByZXR1cm4gLTI7CisgIGlmKCFtZW1iZXIocmVwdXRhdGlvbnMsIHJlcGlkKSkKKyAgICByZXR1cm4gLTM7CisgIGlmKHJlcHV0YXRpb25zW3JlcGlkXVsiZmxhZ3MiXSAmIFJFUF9GTEFHX0FDVElWRSkgCisgICAgcmV0dXJuIC00OworICByZXB1dGF0aW9uc1tyZXBpZF1bImZsYWdzIl0gXj0gUkVQX0ZMQUdfQUNUSVZFOworICBzYXZlX29iamVjdChSRVBfU0FWRUZJTEUpOworICByZXR1cm4gMTsKK30KKworLyogQXJndW1lbnRlOgorICogcmVwaWQgPSBpZCBpbSBtYXBwaW5nIHJlcHV0YXRpb25zCisgKiB1aWQgPSBVSUQgd2VsY2hlIGRpZSBSZXB1dGF0aW9uIHZlcmFlbmRlcm4gZGFyZgorICoKKyAqIFJldHVybnM6CisgKiAgMSA9IFVJRCBlcmZvbGdyZWljaCBoaW56dWdlZnVlZ3QKKyAqIC0xID0gS2VpbmUgWnVncmlmZnNyZWNodGUKKyAqIC0yID0gRmFsc2NoZSBBcmd1bWVudGUKKyAqIC0zID0gUmVwIG5pY2h0IHZvcmhhbmRlbgorICogLTQgPSBVSUQgaXN0IGJlcmVpdHMgdm9yaGFuZGVuCisgKi8KK3B1YmxpYyBpbnQgQWRkUmVwdXRhdGlvblVpZChzdHJpbmcgcmVwaWQsIHN0cmluZyB1aWQpIHsKKyAgaWYoIVNlYygpKQorICAgIHJldHVybiAtMTsKKyAgaWYoIXN0cmluZ3AocmVwaWQpIHx8ICFzaXplb2YocmVwaWQpIHx8ICFzdHJpbmdwKHVpZCkgfHwgIXNpemVvZih1aWQpKQorICAgIHJldHVybiAtMjsKKyAgaWYoIW1lbWJlcihyZXB1dGF0aW9ucywgcmVwaWQpKQorICAgIHJldHVybiAtMzsKKyAgaWYobWVtYmVyKHJlcHV0YXRpb25zW3JlcGlkXVsidWlkcyJdLCB1aWQpICE9IC0xKSAKKyAgICByZXR1cm4gLTQ7CisgIHJlcHV0YXRpb25zW3JlcGlkXVsidWlkcyJdICs9ICh7IHVpZCB9KTsKKyAgc2F2ZV9vYmplY3QoUkVQX1NBVkVGSUxFKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qIEFyZ3VtZW50ZToKKyAqIHJlcGlkID0gaWQgaW0gbWFwcGluZyByZXB1dGF0aW9ucworICogdWlkID0gVUlEIHdlbGNoZSBkaWUgUmVwdXRhdGlvbiBuaWNodCBtZWhyIHZlcmFlbmRlcm4gZGFyZgorICoKKyAqIFJldHVybnM6CisgKiAgMSA9IFVJRCBlcmZvbGdyZWljaCBnZWxvZXNjaHQKKyAqIC0xID0gS2VpbmUgWnVncmlmZnNyZWNodGUKKyAqIC0yID0gRmFsc2NoZSBBcmd1bWVudGUKKyAqIC0zID0gUmVwIG5pY2h0IHZvcmhhbmRlbgorICogLTQgPSBVSUQgbmljaHQgdm9yaGFuZGVuCisgKi8KK3B1YmxpYyBpbnQgUmVtb3ZlUmVwdXRhdGlvblVpZChzdHJpbmcgcmVwaWQsIHN0cmluZyB1aWQpIHsKKyAgaWYoIVNlYygpKQorICAgIHJldHVybiAtMTsKKyAgaWYoIXN0cmluZ3AocmVwaWQpIHx8ICFzaXplb2YocmVwaWQpIHx8ICFzdHJpbmdwKHVpZCkgfHwgIXNpemVvZih1aWQpKQorICAgIHJldHVybiAtMjsKKyAgaWYoIW1lbWJlcihyZXB1dGF0aW9ucywgcmVwaWQpKQorICAgIHJldHVybiAtMzsKKyAgaWYobWVtYmVyKHJlcHV0YXRpb25zW3JlcGlkXVsidWlkcyJdLCB1aWQpID09IC0xKSAKKyAgICByZXR1cm4gLTQ7CisgIHJlcHV0YXRpb25zW3JlcGlkXVsidWlkcyJdIC09ICh7IHVpZCB9KTsKKyAgc2F2ZV9vYmplY3QoUkVQX1NBVkVGSUxFKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qIEFyZ3VtZW50ZToKKyAqIHJlcGlkID0gaWQgaW0gbWFwcGluZyByZXB1dGF0aW9ucworICogbmFtZSA9IE5ldWVyIE5hbWUgZGVyIFJlcAorICoKKyAqIFJldHVybnM6CisgKiAgMSA9IE5ldWVyIE5hbWUgZXJmb2xncmVpY2ggZ2VzZXR6dAorICogLTEgPSBLZWluZSBadWdyaWZmc3JlY2h0ZQorICogLTIgPSBGYWxzY2hlIEFyZ3VtZW50ZQorICogLTMgPSBSZXAgbmljaHQgdm9yaGFuZGVuCisgKiAtNCA9IE5hbWUgZW50c3ByaWNodCBkZW0gZGVyemVpdGlnZW4KKyAqLworcHVibGljIGludCBDaGFuZ2VSZXB1dGF0aW9uTmFtZShzdHJpbmcgcmVwaWQsIHN0cmluZyBuYW1lKSB7CisgIGlmKCFTZWMoKSkKKyAgICByZXR1cm4gLTE7CisgIGlmKCFzdHJpbmdwKHJlcGlkKSB8fCAhc2l6ZW9mKHJlcGlkKSB8fCAhc3RyaW5ncChuYW1lKSB8fCAhc2l6ZW9mKG5hbWUpKQorICAgIHJldHVybiAtMjsKKyAgaWYoIW1lbWJlcihyZXB1dGF0aW9ucywgcmVwaWQpKQorICAgIHJldHVybiAtMzsKKyAgaWYocmVwdXRhdGlvbnNbcmVwaWRdWyJuYW1lIl0gPT0gbmFtZSkgCisgICAgcmV0dXJuIC00OworICByZXB1dGF0aW9uc1tyZXBpZF1bIm5hbWUiXSA9IG5hbWU7CisgIHNhdmVfb2JqZWN0KFJFUF9TQVZFRklMRSk7CisgIHJldHVybiAxOworfQorCisvKiBBcmd1bWVudGU6CisgKiByZXBpZCA9IGlkIGltIG1hcHBpbmcgcmVwdXRhdGlvbnMKKyAqIG1zZyA9IE5ldWVyIFN0cmluZyBpbiBkZXIgRGVmYXVsdC1DaGFuZ2Vtc2cKKyAqCisgKiBSZXR1cm5zOgorICogIDEgPSBOZXVlIE1zZyBlcmZvbGdyZWljaCBnZXNldHp0CisgKiAtMSA9IEtlaW5lIFp1Z3JpZmZzcmVjaHRlCisgKiAtMiA9IEZhbHNjaGUgQXJndW1lbnRlCisgKiAtMyA9IFJlcCBuaWNodCB2b3JoYW5kZW4KKyAqIC00ID0gTXNnIGVudHNwcmljaHQgZGVyIGRlcnplaXRpZ2VuCisgKi8KK3B1YmxpYyBpbnQgQ2hhbmdlUmVwdXRhdGlvbk1zZyhzdHJpbmcgcmVwaWQsIHN0cmluZyBtc2cpIHsKKyAgaWYoIVNlYygpKQorICAgIHJldHVybiAtMTsKKyAgaWYoIXN0cmluZ3AocmVwaWQpIHx8ICFzaXplb2YocmVwaWQpIHx8ICFzdHJpbmdwKG1zZykgfHwgIXNpemVvZihtc2cpKQorICAgIHJldHVybiAtMjsKKyAgaWYoIW1lbWJlcihyZXB1dGF0aW9ucywgcmVwaWQpKQorICAgIHJldHVybiAtMzsKKyAgaWYocmVwdXRhdGlvbnNbcmVwaWRdWyJjaGFuZ2Vtc2ciXSA9PSBtc2cpIAorICAgIHJldHVybiAtNDsKKyAgcmVwdXRhdGlvbnNbcmVwaWRdWyJjaGFuZ2Vtc2ciXSA9IG1zZzsKKyAgc2F2ZV9vYmplY3QoUkVQX1NBVkVGSUxFKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qIEFyZ3VtZW50ZToKKyAqIHJlcGlkID0gaWQocykgaW0gbWFwcGluZyByZXB1dGF0aW9ucywgb2huZSBBcmd1bWVudCB3ZXJkZW4gYWxsZSBhdWZnZWxpc3RldCwKKyAqICAgICAgICAgU3RyaW5nIG9kZXIgU3RyaW5nLWFycmF5CisgKgorICogUmV0dXJuczoKKyAqICAxID0gTGlzdGUgYXVzZ2VnZWJlbgorICogLTEgPSBGYWxzY2hlIEFyZ3VtZW50ZQorICogLTIgPSBSZXAgbmljaHQgdm9yaGFuZGVuCisgKi8KK3B1YmxpYyB2YXJhcmdzIGludCBWaWV3UmVwdXRhdGlvbkRhdGEobWl4ZWQgcmVwaWRzKSB7CisgIC8vIEZ1ZXIgYWxsZSBzaWNodGJhciwgZGFtaXQgbWFuIGdnZi4gd2Vpc3MsIHdvIG1hbiBuYWNoZnJhZ2VuIG11c3MKKyAgaWYoIXJlcGlkcykgcmVwaWRzID0gbV9pbmRpY2VzKHJlcHV0YXRpb25zKTsKKyAgZWxzZSBpZihzdHJpbmdwKHJlcGlkcykpIHJlcGlkcyA9ICh7IHJlcGlkcyB9KTsKKyAgaWYoIXBvaW50ZXJwKHJlcGlkcykgfHwgIXNpemVvZihyZXBpZHMpKQorICAgIHJldHVybiAtMTsKKyAgLy8gVGV4dGF1c2dhYmUgZnVlciBhbGxlIHJpY2h0aWdlbiBJRHMKKyAgZm9yZWFjaChzdHJpbmcgcmVwaWQgOiByZXBpZHMpIHsKKyAgICBpZighbWVtYmVyKHJlcHV0YXRpb25zLCByZXBpZCkpIGNvbnRpbnVlOworICAgIHRlbGxfb2JqZWN0KHRoaXNfaW50ZXJhY3RpdmUoKSwgc3ByaW50ZigiJXMgJXNcbiAgTmFtZTogJXNcbiAgQ2hhbmdlbXNnOiAiCisgICAgICAiJXNcbiAgVmFsaWRVSURTOiAlT1xuXG4iLCByZXBpZCwgCisgICAgICAocmVwdXRhdGlvbnNbcmVwaWRdWyJmbGFncyJdICYgUkVQX0ZMQUdfQUNUSVZFID8gIiIgOgorICAgICAgIihJbmFrdGl2KSIpLCByZXB1dGF0aW9uc1tyZXBpZF1bIm5hbWUiXSwgCisgICAgICByZXB1dGF0aW9uc1tyZXBpZF1bImNoYW5nZW1zZyJdLCByZXB1dGF0aW9uc1tyZXBpZF1bInVpZHMiXSkpOworICB9CisgIC8vIE1pbi4gMSBuaWNodCB2b3JoYW5kZW46IHJldHVybiAtMiwgc29uc3QgMQorICByZXR1cm4gKHNpemVvZihyZXBpZHMgLSBtX2luZGljZXMocmVwdXRhdGlvbnMpKSA/IC0yIDogMSk7Cit9CisKKy8qIEFyZ3VtZW50ZToKKyAqIHJlcGlkID0gaWQgaW0gbWFwcGluZyByZXB1dGF0aW9ucworICoKKyAqIFJldHVybnM6CisgKiBtYXBwaW5nID0gRGF0ZW4gZGVyIFJlcHV0YXRpb24KKyAqIDAgPSBGYWxzY2hlcyBBcmd1bWVudCAvIFJlcHV0YXRpb24gbmljaHQgdm9yaGFuZGVuCisgKi8KK3B1YmxpYyBtYXBwaW5nIEdldFJlcHV0YXRpb25EYXRhKHN0cmluZyByZXBpZCkgeworICBpZighc3RyaW5ncChyZXBpZCkgfHwgIXNpemVvZihyZXBpZCkgfHwgIW1lbWJlcihyZXB1dGF0aW9ucywgcmVwaWQpKQorICAgIHJldHVybiAwOworICByZXR1cm4gZGVlcF9jb3B5KHJlcHV0YXRpb25zW3JlcGlkXSk7Cit9CisKKy8qIEFyZ3VtZW50ZToKKyAqIHJlcGlkID0gaWQgaW0gbWFwcGluZyByZXB1dGF0aW9ucworICogdmFsdWUgPSBXZXJ0IHVtIGRlbiBkaWUgUmVwIHZlcmFlbmRlcnQgd2lyZCAoKyAvIC0pCisgKgorICogUmV0dXJuczoKKyAqIHN0cmluZyA9ICJEZWluIEFuc2VoZW4gJXMgaGF0IHNpY2ggLi4uIC5cbiIKKyAqIDAgPSBGYWxzY2hlIEFyZ3VtZW50ZSAvIFJlcCBuaWNodCB2b3JoYW5kZW4KKyAqLworcHVibGljIHN0cmluZyBHZXREZWZhdWx0Q2hhbmdlTXNnKHN0cmluZyByZXBpZCwgaW50IHZhbHVlKSB7CisgIHN0cmluZyBzdHJlbmd0aDsKKyAgaWYoIXN0cmluZ3AocmVwaWQpIHx8ICFzaXplb2YocmVwaWQpIHx8ICFpbnRwKHZhbHVlKSB8fCAhdmFsdWUgfHwKKyAgICAgIW1lbWJlcihyZXB1dGF0aW9ucywgcmVwaWQpKQorICAgIHJldHVybiAwOworICBzd2l0Y2goYWJzKHZhbHVlKSkgeworICAgIGNhc2UgICAgMC4uMjUgIDogc3RyZW5ndGggPSAia2F1bSBtZXJrbGljaCI7IGJyZWFrOworICAgIGNhc2UgICAyNi4uNTAgIDogc3RyZW5ndGggPSAibGVpY2h0IjsgYnJlYWs7CisgICAgY2FzZSAgIDUxLi4xMDAgOiBzdHJlbmd0aCA9ICJkZXV0bGljaCI7IGJyZWFrOworICAgIGNhc2UgIDEwMS4uMjUwIDogc3RyZW5ndGggPSAiZXJoZWJsaWNoIjsgYnJlYWs7CisgICAgY2FzZSAgMjUxLi4xMDAwOiBzdHJlbmd0aCA9ICJzZWhyIHN0YXJrIjsgYnJlYWs7CisgICAgZGVmYXVsdDogICAgICAgICBzdHJlbmd0aCA9ICJhdXNzZXJvcmRlbnRsaWNoIHN0YXJrIjsgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHNwcmludGYoIkRlaW4gQW5zZWhlbiAlcyBoYXQgc2ljaCVzJXMuXG4iLCAKKyAgICByZXB1dGF0aW9uc1tyZXBpZF1bImNoYW5nZW1zZyJdLCAoIXN0cmVuZ3RoID8gIiAiIDogIiAiKyBzdHJlbmd0aCArIiAiKSwKKyAgICAodmFsdWUgPCAwID8gInZlcnNjaGxlY2h0ZXJ0IiA6ICJ2ZXJiZXNzZXJ0IikpOworfQorCisvKiBBcmd1bWVudGU6CisgKiByZXBpZCA9IGlkIGltIG1hcHBpbmcgcmVwdXRhdGlvbnMKKyAqIG9iID0gT2JqZWt0LCBkZXNzZW4gVUlEIGdlcHJ1ZWZ0IHdpcmQsIG9obmUgQXJndW1lbnQgLT4gcHJldl9vYigpCisgKgorICogUmV0dXJuczoKKyAqIDEgPSBVSUQgdmFsaWQKKyAqIDAgPSBVSUQgaW52YWxpZAorICogLTEgPSBGYWxzY2hlIEFyZ3VtZW50ZSAKKyAqIC0yID0gUmVwIG5pY2h0IHZvcmhhbmRlbiAKKyAqLworcHVibGljIGludCBDaGVja1ZhbGlkVWlkKHN0cmluZyByZXBpZCwgb2JqZWN0IG9iKSB7CisgIGlmKCFzdHJpbmdwKHJlcGlkKSB8fCAhc2l6ZW9mKHJlcGlkKSB8fCAhb2JqZWN0cChvYikpCisgICAgcmV0dXJuIC0xOworICBpZighbWVtYmVyKHJlcHV0YXRpb25zLCByZXBpZCkpCisgICAgcmV0dXJuIC0yOworICByZXR1cm4gKG1lbWJlcihyZXB1dGF0aW9uc1tyZXBpZF1bInVpZHMiXSwgZ2V0dWlkKG9iKSkgIT0gLTEpOworfQorCisvKiBBcmd1bWVudGU6CisgKiByZXBpZCA9IGlkIGltIG1hcHBpbmcgcmVwdXRhdGlvbnMKKyAqCisgKiBSZXR1cm5zOgorICogMSA9IFJlcCBha3RpdgorICogMCA9IFJlcCBpbmFrdGl2CisgKiAtMSA9IEZhbHNjaGUgQXJndW1lbnRlIAorICogLTIgPSBSZXAgbmljaHQgdm9yaGFuZGVuIAorICovCitwdWJsaWMgaW50IENoZWNrUmVwQWN0aXZlKHN0cmluZyByZXBpZCkgeworICBpZighc3RyaW5ncChyZXBpZCkgfHwgIXNpemVvZihyZXBpZCkpCisgICAgcmV0dXJuIC0xOworICBpZighbWVtYmVyKHJlcHV0YXRpb25zLCByZXBpZCkpCisgICAgcmV0dXJuIC0yOworICAvLyBWZXJib29sdW5nCisgIHJldHVybiAhIShyZXB1dGF0aW9uc1tyZXBpZF1bImZsYWdzIl0gJiBSRVBfRkxBR19BQ1RJVkUpOworfQpkaWZmIC0tZ2l0IGEvc2VjdXJlL3Njb3JlbWFzdGVyLmMgYi9zZWN1cmUvc2NvcmVtYXN0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzZhNGI5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3Njb3JlbWFzdGVyLmMKQEAgLTAsMCArMSwxNDY1IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gc2NvcmVtYXN0ZXIuYyAtIFZlcndhbHR1bmcgZGVyIGVpbmRldXRpZ2VuIE51bW1lcm52ZXJnYWJlIGZ1ZXIgTlBDcyB1bmQKKy8vICAgICAgIE1pbmlRdWVzdHMgc293aWUgZGVyIFN0dWZlbnB1bmt0ZSwgZGllIHNpZSBnZWJlbiAgCisvLworLy8gJElkOiBzY29yZW1hc3Rlci5jIDkxNzAgMjAxNS0wMy0wNSAyMDoxODo1NFogWmVzc3RyYSAkCisjcHJhZ21hIHN0cmljdF90eXBlcworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBub19zaGFkb3cKKyNwcmFnbWEgbm9faW5oZXJpdAorI3ByYWdtYSB2ZXJib3NlX2Vycm9ycworI3ByYWdtYSBjb21iaW5lX3N0cmluZ3MKKyNwcmFnbWEgcGVkYW50aWMKKy8vI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSB3YXJuX2RlcHJlY2F0ZWQKKworI2luY2x1ZGUgIi9zZWN1cmUvc2NvcmVtYXN0ZXIuaCIKKyNpbmNsdWRlICIvc2VjdXJlL3dpemxldmVscy5oIgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxmaWxlcy5oPgorCisjZGVmaW5lIFpERUJVRyh4KSBpZiAoZmluZF9wbGF5ZXIoInplc3N0cmEiKSkgXAorICB0ZWxsX29iamVjdChmaW5kX3BsYXllcigiemVzc3RyYSIpLHNwcmludGYoIlNDTTogJXNcbiIseCkpCisKKy8vIGhvZWNoc3RlIHZlcmdlYmVuZSBOci4KK3ByaXZhdGUgaW50IGxhc3ROdW07CisKKy8vIExpc3RlIGFsbGUgRUtzOiAoW29ibmFtZTogbnVtOyBzY29yZTsga2lsbGNvdW50XSkKK3ByaXZhdGUgbWFwcGluZyBucGNzID0gbV9hbGxvY2F0ZSgwLDMpOworCisvLyBMaXN0ZSB2b24gU3BpZWxlcm5hbWVuLVdlcnQtUGFhcmVuLCBkaWUgaW0gUmVzZXQgYWJnZWFyYmVpdGV0IHdpcmQ6CisvLyAoW3BsbmFtZTogKHt3ZXJ0MSwgd2VydDIsIHdlcnQzLCAuLi59KSBdKSAKKy8vIHdlcnQgPiAwIGJlZGV1dGV0IHNldHplbiBkZXMgZW50c3ByZWNoZW5kZW4gRUtzLCA8IDAgYmVkZXV0ZXQgbG9lc2NoZW4uCitwcml2YXRlIG1hcHBpbmcgdG9fY2hhbmdlID0gKFtdKTsKKworLy8gTGlzdGUgZGVyIEVLLVRpcHM6IChbb2JuYW1lOiBTcHJ1Y2hdKQorcHJpdmF0ZSBtYXBwaW5nIHRpcExpc3QgPSAoW10pOworCisvLyBCaXQtTnIuLCBkaWUgKHdpZWRlcikgdmVyZ2ViZW4gd2VyZGVuIGR1ZXJmZW4uCitwcml2YXRlIGludCAqZnJlZV9udW0gPSAoe30pOworCisvLyB6dSBlbnRmZXJuZW5kZSBFS3MsIExpc3RlIEJpdG51bW1lcm4sIGFsc28gaW50cworcHJpdmF0ZSBpbnQgKnRvX2JlX3JlbW92ZWQgPSAoe30pOworCisvLyBMaXN0ZSB2b24gdGVtcG9yYWVyZW4gRUtzLCBkaWUgbm9jaCBuaWNodCBiZXN0YWV0aWd0IHd1cmRlbjoKKy8vIChbb2JuYW1lOiAoe3BsbmFtZTEsIHBsbmFtZTJ9KSBdKQorcHJpdmF0ZSBtYXBwaW5nIHVuY29uZmlybWVkX3Njb3JlcyA9IChbXSk7CisKKy8vIGFsbGUgU3BpZWxlciBrcmllZ2VuIGRpZXNlbiAKKy8vIE5hY2ggTnIuIHNvcnRpZXJ0ZSBOUEMtTGlzdGU6IChbbnVtOiBrZXk7IHNjb3JlXSkKK3ByaXZhdGUgbm9zYXZlIG1hcHBpbmcgYnlfbnVtID0gbV9hbGxvY2F0ZSgwLDIpOworCisvLyBDYWNoZSBmdWVyIEVLcyB2b24gU3BpZWxlcm46IChbcGxuYW1lOiBzY29yZXN1bW1lXSkKK3ByaXZhdGUgbm9zYXZlIG1hcHBpbmcgdXNlcnNfZWsgPSAoW10pOworCisvLyBiaXRzdHJpbmcsIGRlciBhbGxlIGFrdGl2ZW4gRUtzIGFscyBnZXNldHp0ZXMgQml0IGVudGhhZWx0LgorcHJpdmF0ZSBub3NhdmUgc3RyaW5nIGFjdGl2ZV9la3M9IiI7CisKKy8vIFByb3RvdHlwZW4KK3B1YmxpYyBtYXBwaW5nIGdldEZyZWVFS3NGb3JQbGF5ZXIob2JqZWN0IHBsYXllcik7CitwdWJsaWMgaW50IGFkZFRpcChtaXhlZCBrZXksc3RyaW5nIHRpcCk7CitwdWJsaWMgaW50IGNoYW5nZVRpcChtaXhlZCBrZXksc3RyaW5nIHRpcCk7CitwdWJsaWMgaW50IHJlbW92ZVRpcChtaXhlZCBrZXkpOworcHJpdmF0ZSBzdHJpbmcgZ2V0VGlwRnJvbUxpc3QobWl4ZWQga2V5KTsKK3B1YmxpYyBzdHJpbmcgZ2V0VGlwKG1peGVkIGtleSk7CisKK3B1YmxpYyB2b2lkIENoZWNrTlBDcyhpbnQgbnVtKTsKK3B1YmxpYyB2b2lkIGNoZWNrX2FsbF9wbGF5ZXIobWFwcGluZyBhbGxwbGF5ZXIpOworcHVibGljIHZhcmFyZ3MgaW50IER1bXBOUENzKGludCBzb3J0a2V5KTsKKworcHJpdmF0ZSB2b2lkIG1ha2VfbnVtKHN0cmluZyBrZXksIGludCBudW0sIGludCBzY29yZSkgeworICBieV9udW0gKz0gKFsgbnVtIDoga2V5OyBzY29yZSBdKTsKKyAgLy8gZnVlciBha3RpdmUgRUtzLCBkaWUgYWxzbyBlaW5lbiBTY29yZXdlcnQgPiAwIGhhYmVuLCB3aXJkIGRhcyBqZXdlaWxpZ2UKKyAgLy8gQml0IGdlc2V0enQuIFdpcmQgc3BhZXRlciB6dW0gQXVzZmlsdGVybiBpbmFrdGl2ZXIgRUtzIGF1cyBkZW4gQml0c3RyaW5ncworICAvLyBpbiBkZW4gU3BpZWxlciBnZWJyYXVjaHQuCisgIGlmIChzY29yZT4wICYmICFtZW1iZXIodW5jb25maXJtZWRfc2NvcmVzLG51bSkpCisgICAgYWN0aXZlX2VrcyA9IHNldF9iaXQoYWN0aXZlX2VrcywgbnVtKTsKK30KKworcHJpdmF0ZSBpbnQgYWxsb3dlZCgpCit7CisgIGlmIChwcmV2aW91c19vYmplY3QoKSAmJiBnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKT09Uk9PVElEKQorICAgIHJldHVybiAxOworICBpZiAoIXByb2Nlc3NfY2FsbCgpICYmIHByZXZpb3VzX29iamVjdCgpICYmIHRoaXNfaW50ZXJhY3RpdmUoKSAmJiBBUkNIX1NFQ1VSSVRZKQorICAgIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgc2V0ZXVpZChnZXR1aWQoKSk7CisgIGlmICghcmVzdG9yZV9vYmplY3QoU0NPUkVTQVZFRklMRSkpCisgIHsKKyAgICBsYXN0TnVtPTA7CisgICAgbnBjcz1tX2FsbG9jYXRlKDAsMyk7CisgICAgdG9fY2hhbmdlPW1fYWxsb2NhdGUoMCwxKTsKKyAgICB0aXBMaXN0PShbXSk7CisgIH0KKyAgbnBjcy09KFswXSk7CisgIHdhbGtfbWFwcGluZyhucGNzLCAjJ21ha2VfbnVtKTsKK30KKworcHVibGljIGludCBDbGVhclVzZXJzRUtDYWNoZSgpCit7CisgIGlmICghYWxsb3dlZCgpKQorICAgIHJldHVybiBTQ09SRV9OT19QRVJNSVNTSU9OOworICB1c2Vyc19layA9IChbXSk7CisgIHJldHVybiAxOworfQorCitwdWJsaWMgbWl4ZWQgUXVlcnlVc2Vyc0VLQ2FjaGUoKQoreworICBpZiAoIWFsbG93ZWQoKSkKKyAgICByZXR1cm4gU0NPUkVfTk9fUEVSTUlTU0lPTjsKKyAgcmV0dXJuIHVzZXJzX2VrOworfQorCitwdWJsaWMgbWl4ZWQgUXVlcnlfZnJlZV9udW0oKQoreworICBpZiAoIWFsbG93ZWQoKSkKKyAgICByZXR1cm4gU0NPUkVfTk9fUEVSTUlTU0lPTjsKKyAgcmV0dXJuIGZyZWVfbnVtOworfQorCitwdWJsaWMgbWl4ZWQgQWRkX2ZyZWVfbnVtKGludCB3aGF0KQoreworICBpZiAoIWFsbG93ZWQoKSkKKyAgICByZXR1cm4gU0NPUkVfTk9fUEVSTUlTU0lPTjsKKyAgaWYgKCF3aGF0IHx8ICFpbnRwKHdoYXQpIHx8IGJ5X251bVt3aGF0XSkKKyAgICByZXR1cm4gU0NPUkVfSU5WQUxJRF9BUkc7CisgIGlmIChtZW1iZXIoZnJlZV9udW0sd2hhdCk9PS0xKQorICAgIGZyZWVfbnVtKz0oe3doYXR9KTsKKyAgc2F2ZV9vYmplY3QoU0NPUkVTQVZFRklMRSk7CisgIHdyaXRlX2ZpbGUoU0NPUkVMT0dGSUxFLHNwcmludGYoIkFEREZSRUVOVU06ICVzICU1ZCAoJXMsICVPKVxuIiwgICAgIAorICBzdHJmdGltZSgiJWQlbSVZLSVUIix0aW1lKCkpLHdoYXQsCisgIGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpLCB0aGlzX2ludGVyYWN0aXZlKCkpKTsKKworICByZXR1cm4gZnJlZV9udW07Cit9CisKK3B1YmxpYyBtaXhlZCBSZW1vdmVfZnJlZV9udW0oaW50IHdoYXQpCit7CisgIGlmICghYWxsb3dlZCgpKQorICAgIHJldHVybiBTQ09SRV9OT19QRVJNSVNTSU9OOworICBpZiAoIXdoYXQgfHwgIWludHAod2hhdCkpCisgICAgcmV0dXJuIFNDT1JFX0lOVkFMSURfQVJHOworICBmcmVlX251bS09KHt3aGF0fSk7CisgIHNhdmVfb2JqZWN0KFNDT1JFU0FWRUZJTEUpOworICB3cml0ZV9maWxlKFNDT1JFTE9HRklMRSxzcHJpbnRmKCJSRU1PVkVGUkVFTlVNOiAlcyAlNWQgKCVzLCAlTylcbiIsICAgICAKKyAgc3RyZnRpbWUoIiVkJW0lWS0lVCIsdGltZSgpKSx3aGF0LAorICBnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSx0aGlzX2ludGVyYWN0aXZlKCkpKTsKKyAgcmV0dXJuIGZyZWVfbnVtOworfQorCitwdWJsaWMgbWl4ZWQgUXVlcnlfdG9fY2hhbmdlKHN0cmluZyB3aG8pCit7CisgIGlmICghYWxsb3dlZCgpKQorICAgIHJldHVybiBTQ09SRV9OT19QRVJNSVNTSU9OOworICBpZiAoIXdobykKKyAgICByZXR1cm4gdG9fY2hhbmdlOworICBpZiAod2hvPT0iIikKKyAgICByZXR1cm4gbV9pbmRpY2VzKHRvX2NoYW5nZSk7CisgIHJldHVybiB0b19jaGFuZ2Vbd2hvXTsKK30KKworcHVibGljIG1peGVkIEFkZF90b19jaGFuZ2Uoc3RyaW5nIHdobywgaW50IHdoYXQpCit7CisgIGlmICghYWxsb3dlZCgpKQorICAgIHJldHVybiBTQ09SRV9OT19QRVJNSVNTSU9OOworICBpZiAoIXdobyB8fCAhc3RyaW5ncCh3aG8pIHx8ICF3aGF0IHx8ICFpbnRwKHdoYXQpKQorICAgIHJldHVybiBTQ09SRV9JTlZBTElEX0FSRzsKKyAgaWYgKG1lbWJlcih0b19jaGFuZ2Usd2hvKSkKKyAgeworICAgIHRvX2NoYW5nZVt3aG9dLT0oey13aGF0fSk7CisgICAgaWYgKG1lbWJlcih0b19jaGFuZ2Vbd2hvXSx3aGF0KT09LTEpCisgICAgICB0b19jaGFuZ2Vbd2hvXSs9KHt3aGF0fSk7CisgIH0KKyAgZWxzZQorICAgICB0b19jaGFuZ2Vbd2hvXT0oe3doYXR9KTsKKyAgc2F2ZV9vYmplY3QoU0NPUkVTQVZFRklMRSk7CisgIHdyaXRlX2ZpbGUoU0NPUkVMT0dGSUxFLHNwcmludGYoIkFERFRPQ0hBTkdFOiAlcyAlcyAlNWQgKCVzLCAlTylcbiIsCisgICAgICAgICBzdHJmdGltZSgiJWQlbSVZLSVUIix0aW1lKCkpLHdobyx3aGF0LAorICAgICAgICAgZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSksIHRoaXNfaW50ZXJhY3RpdmUoKSkpOworICByZXR1cm4gdG9fY2hhbmdlW3dob107Cit9CisKK3B1YmxpYyBtaXhlZCBSZW1vdmVfdG9fY2hhbmdlKHN0cmluZyB3aG8sIGludCB3aGF0KQoreworICBpZiAoIWFsbG93ZWQoKSkKKyAgICByZXR1cm4gU0NPUkVfTk9fUEVSTUlTU0lPTjsKKyAgaWYgKCF3aG8gfHwgIXN0cmluZ3Aod2hvKSB8fCAhd2hhdCB8fCAhaW50cCh3aGF0KSkKKyAgICByZXR1cm4gU0NPUkVfSU5WQUxJRF9BUkc7CisgIGlmIChtZW1iZXIodG9fY2hhbmdlLHdobykpCisgIHsKKyAgICAgdG9fY2hhbmdlW3dob10tPSh7d2hhdH0pOworICAgICBpZiAoIXNpemVvZih0b19jaGFuZ2Vbd2hvXSkpCisgICAgICAgIG1fZGVsZXRlKHRvX2NoYW5nZSx3aG8pOworICB9CisgIHNhdmVfb2JqZWN0KFNDT1JFU0FWRUZJTEUpOworICB3cml0ZV9maWxlKFNDT1JFTE9HRklMRSxzcHJpbnRmKCJSRU1PVkVUT0NIQU5HRTogJXMgJXMgJTVkICglcywgJU8pXG4iLAorICAgICAgICAgc3RyZnRpbWUoIiVkJW0lWS0lVCIsdGltZSgpKSx3aG8sd2hhdCwKKyAgICAgICAgIGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpLCB0aGlzX2ludGVyYWN0aXZlKCkpKTsKKyAgcmV0dXJuIHRvX2NoYW5nZVt3aG9dOworfQorCit2b2lkIHJlc2V0KCkKK3sKKyAgc3RyaW5nICp3aG9wLHdobyxlazsKKyAgbWl4ZWQgd2hhdDsKKyAgaW50IGksaix2YWx1ZSxjaGFuZ2VkOworCisgIC8vIGZhbGxzIEVLcyBnbG9iYWwgZW50ZmVybnQgd2VyZGVuIHNvbGxlbiwgc2Nob25tYWwgZGVuIG5vZXRpZ2VuIENhbGxvdXQKKyAgLy8gc3RhcnRlbi4KKyAgaWYgKHNpemVvZih0b19iZV9yZW1vdmVkKSAmJiBmaW5kX2NhbGxfb3V0KCMnY2hlY2tfYWxsX3BsYXllcikgPT0gLTEpCisgICAgICBjYWxsX291dCgjJ2NoZWNrX2FsbF9wbGF5ZXIsIDEwLCAwKTsKKyAgLy8gRUstTWFpbnRlaW5lciB1ZWJlciB1bmJlc3RhZXRpZ3RlIEVLcyBpbmZvcm1pZXJlbgorICBpZiAoc2l6ZW9mKHVuY29uZmlybWVkX3Njb3JlcykpIHsKKyAgICBmb3JlYWNoKHN0cmluZyBuOiBTQ09SRU1BSU5UQUlORVJTKSB7CisgICAgICBpZiAob2JqZWN0cChmaW5kX3BsYXllcihuKSkpCisgICAgICAgICAgdGVsbF9vYmplY3QoZmluZF9wbGF5ZXIobiksYnJlYWtfc3RyaW5nKAorICAgICAgIkVzIGdpYnQgdW5iZXN0YWV0aWd0ZSBFS3MgaW0gU2NvcmVtYXN0ZXIuIFNjaGF1IERpciBkaWUgZG9jaCAiCisgICAgICAibWFsIGFuLiA7LSkiLDc4LCAiRGVyIFNjb3JlbWFzdGVyIHRlaWx0IERpciBtaXQ6ICIpKTsKKyAgICB9CisgIH0KKworICBpPXNpemVvZih3aG9wPW1faW5kaWNlcyh0b19jaGFuZ2UpKS0xOworICB3aGlsZSAoaT49MCAmJiBnZXRfZXZhbF9jb3N0KCk+MTAwMDAwKQorICB7CisgICAgZWsgPSAoc3RyaW5nKShNQVNURVItPnF1ZXJ5X2VrKHdobz13aG9wW2ldKSB8fCAiIik7CisgICAgZm9yIChqPXNpemVvZih3aGF0PXRvX2NoYW5nZVt3aG9dKS0xO2o+PTA7ai0tKSB7CisgICAgICBpZiAoKHZhbHVlPXdoYXRbal0pPjApIHsKKyAgICAvLyBWZXJnYWJlc3RhdGlzdGlrIGhvY2h6YWVobGVuLgorICAgIG5wY3NbYnlfbnVtW3ZhbHVlLEJZTlVNX0tFWV0sTlBDX0NPVU5UXSsrOworICAgIGVrPXNldF9iaXQoZWssdmFsdWUpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgLy8gVmVyZ2FiZXN0YXRpc3RpayBob2NoemFlaGxlbi4KKyAgICBucGNzW2J5X251bVstdmFsdWUsQllOVU1fS0VZXSxOUENfQ09VTlRdKys7CisgICAgZWs9Y2xlYXJfYml0KGVrLC12YWx1ZSk7CisgICAgICB9CisgICAgICAvLyBpZiAoZmluZF9wbGF5ZXIoInJpa3VzIikpIAorICAgICAgLy90ZWxsX29iamVjdChmaW5kX3BsYXllcigicmlrdXMiKSwiU0NPUkVNQVNURVIgIit3aG8rIiAiK2VyZysiXG4iKTsKKworICAgICAgd3JpdGVfZmlsZShTQ09SRUFVVE9MT0csCisgIHNwcmludGYoIlNFVF9DTEVBUl9CSVQgKHJlc2V0KTogJXMgJTRkICVzXG4iLAorICAgIHdobywgaiwgc3RyZnRpbWUoIiVkJW0lWS0lVCIsdGltZSgpKSApKTsKKyAgICB9CisgICAgTUFTVEVSLT51cGRhdGVfZWsod2hvLCBlayk7CisKKyAgICBpZiAobWVtYmVyKHVzZXJzX2VrLCB3aG8pKQorICAgICAgbV9kZWxldGUodXNlcnNfZWssIHdobyk7CisgICAgCisgICAgbV9kZWxldGUodG9fY2hhbmdlLHdobyk7CisgICAgY2hhbmdlZD0xOworICAgIGktLTsKKyAgfQorICBpZiAoY2hhbmdlZCkgc2F2ZV9vYmplY3QoU0NPUkVTQVZFRklMRSk7Cit9CisKK3B1YmxpYyB2YXJhcmdzIG1peGVkIFF1ZXJ5TlBDKGludCBzY29yZSkKK3sKKyAgc3RyaW5nIGtleTsKKyAgaW50IHZhbDsKKworICBpZiAoIXByZXZpb3VzX29iamVjdCgpKQorICAgIHJldHVybiBTQ09SRV9JTlZBTElEX0FSRzsKKyAgCisgIGtleSA9IGxvYWRfbmFtZShwcmV2aW91c19vYmplY3QoKSk7CisKKyAgLy8gc2Nob24gYmVrYW5udGVyIEVLPworICBpZiAobWVtYmVyKG5wY3Msa2V5KSkKKyAgICByZXR1cm4gKHtucGNzW2tleSxOUENfTlVNQkVSXSxucGNzW2tleSxOUENfU0NPUkVdfSk7CisKKyAgaWYgKHNjb3JlPD0wIHx8IAorICAgICAgbWVtYmVyKGluaGVyaXRfbGlzdChwcmV2aW91c19vYmplY3QoKSksIi9zdGQvbGl2aW5nL2xpZmUuYyIpIDwgMCkKKyAgICByZXR1cm4gU0NPUkVfSU5WQUxJRF9BUkc7CisKKyAgaWYgKGtleVswLi44XT09Ii9wbGF5ZXJzLyIpIHJldHVybiBTQ09SRV9JTlZBTElEX0FSRzsKKworICBpZiAoc2NvcmU+Mikgc2NvcmU9MjsKKworICBpZiAoc2l6ZW9mKGZyZWVfbnVtKSkgeworICAgICAgdmFsID0gZnJlZV9udW1bMF07CisgICAgICBmcmVlX251bSAtPSAoe3ZhbH0pOworICB9CisgIGVsc2UgdmFsPSsrbGFzdE51bTsKKworICBucGNzW2tleSxOUENfU0NPUkVdID0gc2NvcmU7CisgIG5wY3Nba2V5LE5QQ19OVU1CRVJdID0gdmFsOworICBucGNzW2tleSxOUENfQ09VTlRdID0gMDsKKyAgYnlfbnVtICs9IChbdmFsOiBrZXk7IHNjb3JlXSk7CisgIC8vIHdlcmRlbiBub2NoIG5pY2h0IGFscyBha3RpdmUgRUtzIGdld2VydGV0LCBkYW1pdCBzaWUgbmljaHQgYWxzIEVrLVRpcHMKKyAgLy8gdmVyZ2JlbiB3ZXJkZW4uCisgIC8vYWN0aXZlX2VrcyA9IHNldF9iaXQoYWN0aXZlX2VrcywgdmFsKTsKKworICB1bmNvbmZpcm1lZF9zY29yZXMgKz0gKFsgdmFsOiAoe30pIF0pOworCisgIENsZWFyVXNlcnNFS0NhY2hlKCk7CisgIHNhdmVfb2JqZWN0KFNDT1JFU0FWRUZJTEUpOworICB3cml0ZV9maWxlKFNDT1JFQVVUT0xPRyxzcHJpbnRmKAorICAiQURETlBDOiAlcyAlNWQgJTRkICVzIChVSUQ6ICVzLCBUSTogJU8sIFRQOiAlTylcbiIsCisgIHN0cmZ0aW1lKCIlZCVtJVktJVQiLHRpbWUoKSksdmFsLHNjb3JlLGtleSwKKyAgZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKSwgdGhpc19pbnRlcmFjdGl2ZSgpLCB0aGlzX3BsYXllcigpKSk7CisKKyAgd2hpbGUocmVtb3ZlX2NhbGxfb3V0KCJEdW1wTlBDcyIpICE9IC0xKSA7CisgIGNhbGxfb3V0KCJEdW1wTlBDcyIsNjApOworICByZXR1cm4gKHt2YWwsc2NvcmV9KTsKK30KKworcHVibGljIHZhcmFyZ3MgbWl4ZWQgTmV3TlBDKHN0cmluZyBrZXksaW50IHNjb3JlKQoreworICBpbnQgdmFsOworCisgIGlmICghYWxsb3dlZCgpKQorICAgIHJldHVybiBTQ09SRV9OT19QRVJNSVNTSU9OOworICBpZiAoIWtleSB8fCAhc3RyaW5ncChrZXkpKQorICAgIHJldHVybiBTQ09SRV9JTlZBTElEX0FSRzsKKyAgCisgIGtleSA9IGxvYWRfbmFtZShrZXkpOworICBpZiAodmFsPW5wY3Nba2V5LE5QQ19OVU1CRVJdKQorICAgIHJldHVybiAoe3ZhbCxucGNzW2tleSxOUENfU0NPUkVdfSk7CisgIGlmIChzY29yZTw9MCkKKyAgICByZXR1cm4gU0NPUkVfSU5WQUxJRF9BUkc7CisKKyAgaWYgKHNpemVvZihmcmVlX251bSkpIHsKKyAgICAgIHZhbD1mcmVlX251bVswXTsKKyAgICAgIGZyZWVfbnVtPWZyZWVfbnVtWzEuLl07CisgIH0KKyAgZWxzZSB2YWw9KytsYXN0TnVtOworCisgIG5wY3Nba2V5LE5QQ19TQ09SRV0gPSBzY29yZTsKKyAgbnBjc1trZXksTlBDX05VTUJFUl0gPSB2YWw7CisgIG5wY3Nba2V5LE5QQ19DT1VOVF0gPSAwOworICBieV9udW0gKz0gKFt2YWw6IGtleTsgc2NvcmVdKTsKKyAgYWN0aXZlX2VrcyA9IHNldF9iaXQoYWN0aXZlX2VrcywgdmFsKTsKKworICBDbGVhclVzZXJzRUtDYWNoZSgpOworICBzYXZlX29iamVjdChTQ09SRVNBVkVGSUxFKTsKKyAgd3JpdGVfZmlsZShTQ09SRUxPR0ZJTEUsc3ByaW50ZigiTkVXTlBDOiAlcyAlNWQgJTRkICVzICglcywgJU8pXG4iLAorICAgICAgICAgc3RyZnRpbWUoIiVkJW0lWS0lVCIsdGltZSgpKSx2YWwsc2NvcmUsa2V5LAorICAgICAgICAgZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSksIHRoaXNfaW50ZXJhY3RpdmUoKSkpOworIHdoaWxlKHJlbW92ZV9jYWxsX291dCgiRHVtcE5QQ3MiKSAhPSAtMSkgOyAKKyAgY2FsbF9vdXQoIkR1bXBOUENzIiw2MCk7CisgIHJldHVybiAoe3ZhbCxzY29yZX0pOworfQorCitwdWJsaWMgdmFyYXJncyBtaXhlZCBBZGROUEMoc3RyaW5nIGtleSxpbnQgc2NvcmUpIHsgcmV0dXJuIE5ld05QQyhrZXksc2NvcmUpOyB9CisKKy8vIHJlc3RhdXJpZXJ0IGRpZSBEYXRlbiBlaW5lcyBmcnVlaGVyIGdlbG9lc2NodGVuLCBpbiBkZW4gU3BpZWxlcm4gbm9jaAorLy8gZW50aGFsdGVuZW4gRUtzLiBNb2VnbGljaCwgd2VubiBtYW4gUGZhZCwgTnIuIHVuZCBQdW5rdGUgbm9jaCBrZW5udC4KK3B1YmxpYyBpbnQgUmVzdG9yZUVLKHN0cmluZyBrZXksIGludCBiaXQsIGludCBzY29yZSkgeworICBpZiAoIWFsbG93ZWQoKSkKKyAgICByZXR1cm4gU0NPUkVfTk9fUEVSTUlTU0lPTjsKKyAgaWYgKCFzdHJpbmdwKGtleSkgfHwgIXNpemVvZihrZXkpIAorICAgICAgfHwgIWludHAoYml0KSB8fCBiaXQgPCAwCisgICAgICB8fCAhaW50cChzY29yZSkgfHwgc2NvcmUgPCAwKQorICAgICAgcmV0dXJuIFNDT1JFX0lOVkFMSURfQVJHOworCisgIGlmIChtZW1iZXIobnBjcyxrZXkpIHx8IG1lbWJlcihieV9udW0sYml0KSkKKyAgICAgIHJldHVybiBTQ09SRV9JTlZBTElEX0FSRzsKKworICBucGNzICs9IChba2V5OiBiaXQ7c2NvcmU7MCBdKTsKKyAgYnlfbnVtICs9IChbYml0OiBrZXk7c2NvcmUgXSk7CisKKyAgQ2xlYXJVc2Vyc0VLQ2FjaGUoKTsKKyAgc2F2ZV9vYmplY3QoU0NPUkVTQVZFRklMRSk7CisgIHdyaXRlX2ZpbGUoU0NPUkVMT0dGSUxFLHNwcmludGYoIlJFU1RPUkVFSzogJXMgJTVkICU0ZCAlcyAoJXMsICVPKVxuIiwKKyAgICAgICAgIHN0cmZ0aW1lKCIlZCVtJVktJVQiLHRpbWUoKSksIGJpdCwgc2NvcmUsIGtleSwKKyAgICAgICAgIGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpLCB0aGlzX2ludGVyYWN0aXZlKCkpKTsKKyAgd2hpbGUocmVtb3ZlX2NhbGxfb3V0KCJEdW1wTlBDcyIpICE9IC0xKSA7CisgIGNhbGxfb3V0KCJEdW1wTlBDcyIsNjApOworICByZXR1cm4gMTsKKworfQorCitwdWJsaWMgaW50IENvbmZpcm1TY29yZShtaXhlZCBrZXkpIHsKKyAgLy8gQml0cyBpbiBkZW4gU3BpZWxlcm4gaW4gdW5jb25maXJtZWRfc2NvcmVzIHNldHplbiB1bmQgU3RhdGlzdGlrCisgIC8vIGhvY2h6YWVobGVuCisgIC8vIEJpdCBpbiBhY3RpdmVfZWtzIHNldHplbgorICAvLyBFaW50cmFnIGF1cyB1bmNvbmZpcm1lZF9zY29yZXMgbG9lc2NoZW4KKyAgaW50IGJpdDsKKworICBpZiAoIWFsbG93ZWQoKSkgcmV0dXJuIFNDT1JFX05PX1BFUk1JU1NJT047CisgIGlmIChzdHJpbmdwKGtleSkgJiYgbWVtYmVyKG5wY3Msa2V5KSkgeworICAgICAgYml0ID0gbnBjc1trZXksIE5QQ19OVU1CRVJdOworICB9CisgIGVsc2UgaWYgKGludHAoa2V5KSAmJiBtZW1iZXIoYnlfbnVtLGtleSkpIHsKKyAgICAgIGJpdCA9IGtleTsKKyAgfQorICBlbHNlCisgICAgICByZXR1cm4gU0NPUkVfSU5WQUxJRF9BUkc7CisKKyAgaWYgKCFtZW1iZXIodW5jb25maXJtZWRfc2NvcmVzLCBiaXQpKSAKKyAgICAgIHJldHVybiBTQ09SRV9JTlZBTElEX0FSRzsKKworICBzdHJpbmcgb2JuYW1lID0gYnlfbnVtW2JpdCwgQllOVU1fS0VZXTsKKyAgaW50IHNjb3JlID0gYnlfbnVtW2JpdCxCWU5VTV9TQ09SRV07CisgIAorICBmb3JlYWNoKHN0cmluZyBwbDogdW5jb25maXJtZWRfc2NvcmVzW2JpdF0pIHsKKyAgICAgIHN0cmluZyBla3MgPSAoc3RyaW5nKW1hc3RlcigpLT5xdWVyeV9layhwbCk7CisgICAgICBla3MgPSBzZXRfYml0KGVrcywgYml0KTsKKyAgICAgIG1hc3RlcigpLT51cGRhdGVfZWsocGwsIGVrcyk7CisgICAgICB3cml0ZV9maWxlKFNDT1JFQVVUT0xPRywgc3ByaW50ZigKKyAgICAiU0VUQklUOiAlcyAlNWQgJXNcbiIsCisgICAgc3RyZnRpbWUoIiVkJW0lWS0lVCIsdGltZSgpKSwgYml0LCBwbCkpOworICB9CisgIC8vVmVyZ2FiZXN0YXRpc3RpayBob2NoemFlaGxlbi4uLgorICBucGNzW29ibmFtZSxOUENfQ09VTlRdKz1zaXplb2YodW5jb25maXJtZWRfc2NvcmVzW2JpdF0pOworCisgIG1fZGVsZXRlKHVuY29uZmlybWVkX3Njb3JlcywgYml0KTsKKyAgYWN0aXZlX2VrcyA9IHNldF9iaXQoYWN0aXZlX2VrcywgYml0KTsKKyAgc2F2ZV9vYmplY3QoU0NPUkVTQVZFRklMRSk7CisKKyAgd3JpdGVfZmlsZShTQ09SRUxPR0ZJTEUsc3ByaW50ZigKKyAgICAgICJDT05GSVJNTlBDOiAlcyAlNWQgU2NvcmUgJTNkICVzIFslcywgJU9dXG4iLAorICAgICAgIHN0cmZ0aW1lKCIlZCVtJVktJVQiLHRpbWUoKSksIGJpdCwgc2NvcmUsIG9ibmFtZSwKKyAgICAgICBnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpLHRoaXNfaW50ZXJhY3RpdmUoKSkpOworCisgIHJldHVybiAxOworfQorCitwdWJsaWMgaW50IFJlamVjdFNjb3JlKG1peGVkIGtleSkgeworICAvLyBFaW50cmFnIGF1cyB1bmNvbmZpcm1lZF9zY29yZXMsIG5wY3MsIGJ5X251bSBsb2VzY2hlbgorICAvLyBCaXQtTnIuIGluIGZyZWVfbnVtIGVpbnRyYWdlbgorICAvLyBldnRsLiBFSy1TcHJ1Y2ggZW50ZmVybmVuPworICBpbnQgYml0OworCisgIGlmICghYWxsb3dlZCgpKSByZXR1cm4gU0NPUkVfTk9fUEVSTUlTU0lPTjsKKyAgaWYgKHN0cmluZ3Aoa2V5KSAmJiBtZW1iZXIobnBjcyxrZXkpKSB7CisgICAgICBiaXQgPSBucGNzW2tleSwgTlBDX05VTUJFUl07CisgIH0KKyAgZWxzZSBpZiAoaW50cChrZXkpICYmIG1lbWJlcihieV9udW0sa2V5KSkgeworICAgICAgYml0ID0ga2V5OworICB9CisgIGVsc2UKKyAgICAgIHJldHVybiBTQ09SRV9JTlZBTElEX0FSRzsKKworICBpZiAoIW1lbWJlcih1bmNvbmZpcm1lZF9zY29yZXMsIGJpdCkpIAorICAgICAgcmV0dXJuIFNDT1JFX0lOVkFMSURfQVJHOworCisgIHN0cmluZyBvYm5hbWUgPSBieV9udW1bYml0LCBCWU5VTV9LRVldOworICBpbnQgc2NvcmUgPSBieV9udW1bYml0LEJZTlVNX1NDT1JFXTsKKworICBtX2RlbGV0ZShieV9udW0sIGJpdCk7CisgIG1fZGVsZXRlKG5wY3MsIG9ibmFtZSk7CisgIG1fZGVsZXRlKHVuY29uZmlybWVkX3Njb3JlcyxiaXQpOworICByZW1vdmVUaXAob2JuYW1lKTsKKyAgZnJlZV9udW0gKz0gKHtiaXR9KTsKKworICBzYXZlX29iamVjdChTQ09SRVNBVkVGSUxFKTsKKworICB3cml0ZV9maWxlKFNDT1JFTE9HRklMRSxzcHJpbnRmKAorICAgICAgIlJFSkVDVE5QQzogJXMgJTVkIFNjb3JlICUzZCAlcyBbJXMsICVPXVxuIiwKKyAgICAgICBzdHJmdGltZSgiJWQlbSVZLSVUIix0aW1lKCkpLCBiaXQsIHNjb3JlLCBvYm5hbWUsCisgICAgICAgZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKSx0aGlzX2ludGVyYWN0aXZlKCkpKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIHVuYmVzdGFldGlndGUgTlBDcyBpbiBlaW4gRmlsZSBhdXNnZWJlbgorcHVibGljIHZvaWQgRHVtcFVuY29uZmlybWVkU2NvcmVzKCkgeworICBpZiAoIW9iamVjdHAodGhpc19wbGF5ZXIoKSkpIHJldHVybjsKKyAKKyAgd3JpdGUoc3ByaW50ZigiJTVzICAlNXMgICU0cyAgICVzXG4iLAorICAiTnIuIiwgIkNudCIsICJTYyIsICJPYmpla3QiKSk7CisgIGZvcmVhY2goaW50IGJpdCwgc3RyaW5nICpwbHM6IHVuY29uZmlybWVkX3Njb3JlcykgeworICAgIHdyaXRlKHNwcmludGYoIiU1ZCAgJTVkICAlNGQgICAlc1xuIiwKKyAgYml0LCBzaXplb2YocGxzKSwgYnlfbnVtW2JpdCxCWU5VTV9TQ09SRV0sIGJ5X251bVtiaXQsQllOVU1fS0VZXSkpOworICB9Cit9CisKK3B1YmxpYyBtYXBwaW5nIF9xdWVyeV91bmNvbmZpcm1lZCgpIHsKKyAgaWYgKGFsbG93ZWQoKSkgcmV0dXJuIHVuY29uZmlybWVkX3Njb3JlczsKKyAgcmV0dXJuIDA7Cit9CisKK3B1YmxpYyB2YXJhcmdzIGludCBTZXRTY29yZShtaXhlZCBrZXksaW50IHNjb3JlKQoreworICBpbnQgbnVtOworICBzdHJpbmcgb2I7CisgIGludCBvbGRzY29yZTsKKworICBpZiAoIWFsbG93ZWQoKSkKKyAgICByZXR1cm4gU0NPUkVfTk9fUEVSTUlTU0lPTjsKKyAgaWYgKCFrZXkpIHJldHVybiBTQ09SRV9JTlZBTElEX0FSRzsKKworICBpZiAoc3RyaW5ncChrZXkpICYmIHNpemVvZihrZXkpKSB7CisgICAgb2IgPSBsb2FkX25hbWUoa2V5KTsKKyAgICBpZiAoIW1lbWJlcihucGNzLCBvYikpIHJldHVybiBTQ09SRV9JTlZBTElEX0FSRzsKKyAgICBudW0gPSBucGNzW29iLCBOUENfTlVNQkVSXTsKKyAgICBpZiAob2IgIT0gYnlfbnVtW251bSwgQllOVU1fS0VZXSkKKyAgcmV0dXJuIFNDT1JFX0lOVkFMSURfQVJHOworICB9CisgIGVsc2UgaWYgKGludHAoa2V5KSAmJiBtZW1iZXIoYnlfbnVtLGtleSkgKSB7CisgICAgbnVtID0ga2V5OworICAgIG9iID0gYnlfbnVtW251bSwgQllOVU1fS0VZXTsKKyAgICBpZiAoIW1lbWJlcihucGNzLCBvYikgfHwgKG5wY3Nbb2IsIE5QQ19OVU1CRVJdICE9IG51bSkpCisgIHJldHVybiBTQ09SRV9JTlZBTElEX0FSRzsKKyAgfQorICBlbHNlCisgICAgcmV0dXJuIFNDT1JFX0lOVkFMSURfQVJHOworCisgIG9sZHNjb3JlID0gYnlfbnVtW251bSxCWU5VTV9TQ09SRV07CisgIGJ5X251bVtudW0sQllOVU1fU0NPUkVdID0gc2NvcmU7CisgIG5wY3Nbb2IsIE5QQ19TQ09SRV0gPSBzY29yZTsKKworICBpZiAoc2NvcmUgPiAwKQorICAgICAgYWN0aXZlX2VrcyA9IHNldF9iaXQoYWN0aXZlX2VrcywgbnVtKTsKKyAgZWxzZQorICAgICAgYWN0aXZlX2VrcyA9IGNsZWFyX2JpdChhY3RpdmVfZWtzLCBudW0pOworCisgIENsZWFyVXNlcnNFS0NhY2hlKCk7CisgIHNhdmVfb2JqZWN0KFNDT1JFU0FWRUZJTEUpOworICB3cml0ZV9maWxlKFNDT1JFTE9HRklMRSxzcHJpbnRmKAorICAiU0VUU0NPUkU6ICVzICU1ZCAlLjNkIE9TYzogJS4zZCAlcyAoJXMsICVPKVxuIiwKKyAgICAgICAgIHN0cmZ0aW1lKCIlZCVtJVktJVQiLHRpbWUoKSksbnVtLHNjb3JlLG9sZHNjb3JlLCBvYiwKKyAgICAgICAgIGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpLCB0aGlzX2ludGVyYWN0aXZlKCkpKTsKKyB3aGlsZShyZW1vdmVfY2FsbF9vdXQoIkR1bXBOUENzIikgIT0gLTEpIDsgCisgIGNhbGxfb3V0KCJEdW1wTlBDcyIsNjApOworICByZXR1cm4gMTsKK30KKworLy8gZW50ZmVybnQgZWluZW4gRUsgZW5kZ3VlbHRpZyB1bmQgdW53aWRlcnJ1ZmxpY2ggdW5kIGdpYnQgZGllIE5yLiB3aWVkZXIKKy8vIGZyZWkuCisvLyBUZWNobmlzY2ggd2lyZCBkZXIgRUsgZXJzdG1hbCBpbiBlaW5lIExpc3RlIGVpbmdldHJhZ2VuLiBJbSBSZXNldCBpdGVyaWVydAorLy8gZGVyIE1hc3RlciB1ZWJlciBhbGxlIFNQaWVsZXItU2F2ZWZpbGVzIHVuZCBsb2VzY2h0IGRlbiBFayBhdXMgYWxsZQorLy8gU3BpZWxlcm4uIE5hY2ggQWJzY2hsdXNzIHdpcmQgZGVyIEVpbnRyYWcgaW4gbnBjcyBnZWxvZXNjaHQgdW5kIHNlaW5lIE5yLgorLy8gaW4gZGllIExpc3RlIGZyZWllciBOdW1tZXJuIGVpbmdldHJhZ2VuLgorcHVibGljIGludCogTWFya0VLRm9yTGlxdWlkYXRpb24obWl4ZWQga2V5KSB7CisgIGludCBiaXQ7CisgIGlmICghYWxsb3dlZCgpKQorICAgICAgcmV0dXJuIDA7CisgIC8vIG5pY2h0IGluIHRvX2JlX3JlbW92ZWQgYWVuZGVybiwgd2VubiBjaGVja19hbGxfcGxheWVyKCkgbGFldWZ0LgorICBpZiAoZmluZF9jYWxsX291dCgjJ2NoZWNrX2FsbF9wbGF5ZXIpICE9IC0xKQorICAgICAgcmV0dXJuIDA7CisKKyAgaWYgKHN0cmluZ3Aoa2V5KSAmJiBzaXplb2Yoa2V5KSkgeworICAgIGlmICghbWVtYmVyKG5wY3Msa2V5KSkgcmV0dXJuIDA7CisgICAgYml0ID0gbnBjc1trZXksTlBDX05VTUJFUl07CisgIH0KKyAgZWxzZSBpZiAoaW50cChrZXkpICYmIGtleT49MCkgeworICAgIGJpdCA9IGtleTsKKyAgfQorICBlbHNlCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKG1lbWJlcih0b19iZV9yZW1vdmVkLGJpdCkgPT0gLTEpCisgICAgdG9fYmVfcmVtb3ZlZCArPSAoe2JpdH0pOworICB3cml0ZV9maWxlKFNDT1JFTE9HRklMRSxzcHJpbnRmKCJERUxFVEVGTEFHOiAlcyAlNWQgJXMgKCVzLCAlTylcbiIsCisgIHN0cmZ0aW1lKCIlZCVtJVktJVQiLHRpbWUoKSksIGJpdCwgYnlfbnVtW2JpdCxCWU5VTV9LRVldIHx8ICJOb05hbWUiLAorICBnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSwgdGhpc19pbnRlcmFjdGl2ZSgpKSk7CisgIAorICBzYXZlX29iamVjdChTQ09SRVNBVkVGSUxFKTsKKyAgCisgIHJldHVybiB0b19iZV9yZW1vdmVkOworfQorCisvLyBnZWh0IG51ciwgc29sYW5nZSBuYWNoIGVpbmVtIFJlbW92ZUVLKCkgbm9jaCBrZWluIHJlc2V0KCkgZ2VsYXVmZW4gaXN0IQorcHVibGljIGludCogVW5tYXJrRUtGb3JMaXF1aWRhdGlvbihtaXhlZCBrZXkpIHsKKyAgaW50IGJpdDsKKyAgaWYgKCFhbGxvd2VkKCkpCisgICAgICByZXR1cm4gMDsKKyAgLy8gbmljaHQgaW4gdG9fYmVfcmVtb3ZlZCBhZW5kZXJuLCB3ZW5uIGNoZWNrX2FsbF9wbGF5ZXIoKSBsYWV1ZnQuCisgIGlmIChmaW5kX2NhbGxfb3V0KCMnY2hlY2tfYWxsX3BsYXllcikgIT0gLTEpCisgICAgICByZXR1cm4gMDsKKworICBpZiAoc3RyaW5ncChrZXkpICYmIHNpemVvZihrZXkpKSB7CisgICAgaWYgKCFtZW1iZXIobnBjcyxrZXkpKSByZXR1cm4gMDsKKyAgICBiaXQgPSBucGNzW2tleSxOUENfTlVNQkVSXTsKKyAgfQorICBlbHNlIGlmIChpbnRwKGtleSkgJiYga2V5Pj0wKSB7CisgICAgYml0ID0ga2V5OworICB9CisgIGVsc2UKKyAgICByZXR1cm4gMDsKKyAKKyAgdG9fYmVfcmVtb3ZlZCAtPSAoe2JpdH0pOworICB3cml0ZV9maWxlKFNDT1JFTE9HRklMRSxzcHJpbnRmKCJVTkRFTEVURUZMQUc6ICVzICU1ZCAlcyAoJXMsICVPXG4iLAorICBzdHJmdGltZSgiJWQlbSVZLSVUIix0aW1lKCkpLGJpdCwgYnlfbnVtW2JpdCwgQllOVU1fS0VZXSB8fCAiTm9OYW1lIiwKKyAgZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSksIHRoaXNfaW50ZXJhY3RpdmUoKSkpOworICAKKyAgc2F2ZV9vYmplY3QoU0NPUkVTQVZFRklMRSk7CisKKyAgcmV0dXJuIHRvX2JlX3JlbW92ZWQ7Cit9CisKK3B1YmxpYyBpbnQqIFF1ZXJ5TGlxdWlkYXRpb25NYXJrcygpIHsKKyAgaWYgKGFsbG93ZWQoKSkKKyAgICAgIHJldHVybiB0b19iZV9yZW1vdmVkOworICBlbHNlCisgICAgICByZXR1cm4gMDs7Cit9CisKKy8vIHNldHp0IG51ciBkZW4gU2NvcmV3ZXJ0IGF1ZiAwLCBzb25zdCBuaXguIFNvbGNoZSBFS3Mga29lbm5lbiBkYW5uIHNwYWV0ZXIKKy8vIGR1cmNoIEFuZ2FiZSBlaW5lcyBuZXVlcyBTY29yZXdlcnRlcyByZWFrdGl2aWVydCB3ZXJkZW4uCitwdWJsaWMgaW50IFJlbW92ZVNjb3JlKG1peGVkIGtleSkgeworICBpbnQgY2hhbmdlZDsKKyAgaW50IG9sZHNjb3JlOworCisgIGlmICghYWxsb3dlZCgpKQorICAgIHJldHVybiBTQ09SRV9OT19QRVJNSVNTSU9OOworCisgIGlmIChzdHJpbmdwKGtleSkgJiYgbWVtYmVyKG5wY3Msa2V5KSkgeworICAgIGludCBudW0gPSBucGNzW2tleSwgTlBDX05VTUJFUl07CisgICAgaWYgKCBrZXkgPT0gYnlfbnVtW251bSwgQllOVU1fS0VZXSkgeworICAgICAgb2xkc2NvcmUgPSBieV9udW1bbnVtLCBCWU5VTV9TQ09SRV07CisgICAgICBucGNzW2tleSwgTlBDX1NDT1JFXSA9IDA7CisgICAgICBieV9udW1bbnVtLCBCWU5VTV9TQ09SRV0gPSAwOworICAgICAgYWN0aXZlX2VrcyA9IGNsZWFyX2JpdChhY3RpdmVfZWtzLG51bSk7IAorICAgICAgd3JpdGVfZmlsZShTQ09SRUxPR0ZJTEUsc3ByaW50ZigKKyAgICAgICJSRU1PVkVTQ09SRTogJXMgJTVkIE9TYzogJS4zZCAlcyAoJXMsICVPKVxuIiwKKyAgICAgICAgc3RyZnRpbWUoIiVkJW0lWS0lVCIsdGltZSgpKSwgbnVtLCBvbGRzY29yZSwga2V5LCAKKyAgICAgICAgZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSksIHRoaXNfaW50ZXJhY3RpdmUoKSkpOworICAgICAgY2hhbmdlZCA9IDE7CisgICAgfQorICB9CisgIGVsc2UgaWYgKGludHAoa2V5KSAmJiBtZW1iZXIoYnlfbnVtLCBrZXkpKSB7CisgICAgc3RyaW5nIG9ibmFtZSA9IGJ5X251bVtrZXksIEJZTlVNX0tFWV07CisgICAgaWYgKGtleSA9PSBucGNzW29ibmFtZSwgTlBDX05VTUJFUl0pIHsKKyAgICAgIG9sZHNjb3JlID0gYnlfbnVtW2tleSwgQllOVU1fU0NPUkVdOworICAgICAgbnBjc1tvYm5hbWUsIE5QQ19TQ09SRV0gPSAwOworICAgICAgYnlfbnVtW2tleSwgQllOVU1fU0NPUkVdID0gMDsKKyAgICAgIGFjdGl2ZV9la3MgPSBjbGVhcl9iaXQoYWN0aXZlX2VrcyxrZXkpOyAKKyAgICAgIHdyaXRlX2ZpbGUoU0NPUkVMT0dGSUxFLHNwcmludGYoCisgICAgICAiUkVNT1ZFU0NPUkU6ICVzICU1ZCBPU2M6ICUuM2QgJXMgKCVzLCAlTylcbiIsCisgICAgICAgIHN0cmZ0aW1lKCIlZCVtJVktJVQiLHRpbWUoKSksa2V5LCBvbGRzY29yZSwgb2JuYW1lLAorICAgICAgICBnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSwgdGhpc19pbnRlcmFjdGl2ZSgpKSk7CisgICAgICBjaGFuZ2VkID0gMTsKKyAgICB9CisgIH0KKworICBpZiAoY2hhbmdlZCkgeworICAgIENsZWFyVXNlcnNFS0NhY2hlKCk7CisgICAgc2F2ZV9vYmplY3QoU0NPUkVTQVZFRklMRSk7CisgICAgd2hpbGUocmVtb3ZlX2NhbGxfb3V0KCJEdW1wTlBDcyIpICE9IC0xKSA7CisgICAgY2FsbF9vdXQoIkR1bXBOUENzIiw2MCk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIFNDT1JFX0lOVkFMSURfQVJHOworfQorCitwdWJsaWMgdmFyYXJncyBpbnQgTW92ZVNjb3JlKG1peGVkIG9sZGtleSwgc3RyaW5nIG5ld3BhdGgpCit7CisgIGludCBudW0sc2NvcmU7CisgIHN0cmluZyBvbGRwYXRoOworICBzdHJpbmcgdGlwOworICAKKyAgaWYgKCFhbGxvd2VkKCkpCisgICAgcmV0dXJuIFNDT1JFX05PX1BFUk1JU1NJT047CisgIGlmICghc3RyaW5ncChuZXdwYXRoKSkKKyAgICByZXR1cm4gU0NPUkVfSU5WQUxJRF9BUkc7CisKKyAgaWYgKHN0cmluZ3Aob2xka2V5KSkgeworICAgIG9sZGtleSA9IGxvYWRfbmFtZShvbGRrZXkpOyAKKyAgICBudW09bnBjc1tvbGRrZXksTlBDX05VTUJFUl07CisgIH0KKyAgZWxzZSBpZiAoaW50cChvbGRrZXkpKSBudW09b2xka2V5OworICBlbHNlIHJldHVybiBTQ09SRV9JTlZBTElEX0FSRzsKKworICBpZiAoIW1lbWJlcihieV9udW0sbnVtKSkgcmV0dXJuIFNDT1JFX0lOVkFMSURfQVJHOworICAKKyAgdGlwPWdldFRpcEZyb21MaXN0KG9sZGtleSk7CisgIG9sZHBhdGggPSBieV9udW1bbnVtLCBCWU5VTV9LRVldOworICBzY29yZSA9IGJ5X251bVtudW0sIEJZTlVNX1NDT1JFXTsKKworICBpZiAobWVtYmVyKG5wY3MsIG9sZHBhdGgpKSB7CisgICAgbV9kZWxldGUobnBjcywgb2xkcGF0aCk7CisgICAgcmVtb3ZlVGlwKG9sZGtleSk7CisgICAgaWYodGlwIT0iIikgYWRkVGlwKG5ld3BhdGgsdGlwKTsKKyAgICBucGNzW25ld3BhdGgsIE5QQ19TQ09SRV0gPSBzY29yZTsKKyAgICBucGNzW25ld3BhdGgsIE5QQ19OVU1CRVJdID0gbnVtOworICB9CisgIGVsc2UgcmV0dXJuIFNDT1JFX0lOVkFMSURfQVJHOworCisgIGJ5X251bSArPSAoW251bTogbmV3cGF0aDsgc2NvcmVdKTsKKworICBDbGVhclVzZXJzRUtDYWNoZSgpOworICBzYXZlX29iamVjdChTQ09SRVNBVkVGSUxFKTsKKyAgd3JpdGVfZmlsZShTQ09SRUxPR0ZJTEUsc3ByaW50ZigiTU9WRVNDT1JFOiAlcyAlcyAlcyAoJXMsICVPKVxuIiwKKyAgc3RyZnRpbWUoIiVkJW0lWS0lVCIsdGltZSgpKSxvbGRwYXRoLG5ld3BhdGgsCisgIGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpLHRoaXNfaW50ZXJhY3RpdmUoKSkpOworCisgIHdoaWxlKHJlbW92ZV9jYWxsX291dCgiRHVtcE5QQ3MiKSAhPSAtMSkgOworICBjYWxsX291dCgiRHVtcE5QQ3MiLDYwKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIGxpZWZlcnQgYWxsZSBLaWxscyBkZXMgU3BpZWxlcnMgenVydWVjaywgYXVjaCBzb2xjaGUsIGRpZSBtb21lbnRhbgorLy8gYXVzZ2V0cmFnZW4vZGVha3RpdmlldCBzaW5kLgorcHVibGljIHN0cmluZyBRdWVyeUFsbEtpbGxzKHN0cmluZyBwbCkKK3sKKyAgcmV0dXJuIChNQVNURVItPnF1ZXJ5X2VrKHBsKSB8fCAiIik7Cit9CisKKy8vIGZpbHRlcnQgYWxsZSBFaW50cmFlZ2UgYXVzIGRlbSBCaXRzdHJpbmcgaGVyYXVzLCBkaWUgZnVlcgorLy8gYXVzZ2V0cmFnZW5lL2luYWt0aXZlIEVLcyBzdGVoZW4uCitwdWJsaWMgc3RyaW5nIFF1ZXJ5S2lsbHMoc3RyaW5nIHBsKSB7CisgIHN0cmluZyByZXMgPSAoc3RyaW5nKU1BU1RFUi0+cXVlcnlfZWsocGwpIHx8ICIiOworICAvLyB2ZXJnbGVpY2hlbiBtaXQgZGVuIGFrdGl2ZW4gRUtzIGF1cyBhY3RpdmVfZWtzIHVuZCBudXIgamVuZSBCaXRzCisgIC8vIHp1cnVlY2tsaWVmZXJuLCBkaWUgaW4gYmVpZGVuIFN0cmluZ3MgZ2VzZXR6dCBzaW5kLgorICByZXR1cm4gYW5kX2JpdHMocmVzLGFjdGl2ZV9la3MpOworfQorCitwdWJsaWMgaW50IFF1ZXJ5S2lsbFBvaW50cyhtaXhlZCBwbCkgeworICAKKyAgaWYgKCFhbGxvd2VkKCkgJiYKKyAgICAgICghcHJldmlvdXNfb2JqZWN0KCkgCisgICAgICAgfHwgc3Ryc3RyKG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSwgIi9naWxkZW4vIikgIT0gMCkgKQorICAgICByZXR1cm4gMDsKKworICBpZiAoIXN0cmluZ3AocGwpKSBwbD1nZXR1aWQocGwpOworCisgIGlmIChtZW1iZXIodXNlcnNfZWsscGwpKSByZXR1cm4gdXNlcnNfZWtbcGxdOworCisgIHN0cmluZyBzID0gKE1BU1RFUi0+cXVlcnlfZWsocGwpIHx8ICIiKTsKKyAgCisgIGludCBwPS0xOworICBpbnQgc3VtbWU7CisgIHdoaWxlICgocD1uZXh0X2JpdChzLHApKSAhPSAtMSkgeworICAgICAgc3VtbWUrPWJ5X251bVtwLEJZTlVNX1NDT1JFXTsKKyAgfQorCisgIHVzZXJzX2VrICs9IChbcGw6c3VtbWVdKTsKKyAgcmV0dXJuIHN1bW1lOworfQorCitwdWJsaWMgbWl4ZWQgKlF1ZXJ5TlBDYnlOdW1iZXIoaW50IG51bSkKK3sKKyAgaWYgKCFhbGxvd2VkKCkpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKG1lbWJlcihieV9udW0sIG51bSkpCisgICAgcmV0dXJuICh7bnVtLCBieV9udW1bbnVtLCBCWU5VTV9TQ09SRV0sIGJ5X251bVtudW0sIEJZTlVNX0tFWV19KTsKKworICByZXR1cm4gMDsKK30KKworcHJvdGVjdGVkIG1peGVkICpTdGF0aWNRdWVyeU5QQ2J5TnVtYmVyKGludCBudW0pCit7CisgIGlmIChtZW1iZXIoYnlfbnVtLCBudW0pKQorICAgIHJldHVybiAoe251bSwgYnlfbnVtW251bSwgQllOVU1fU0NPUkVdLCBieV9udW1bbnVtLCBCWU5VTV9LRVldfSk7CisKKyAgcmV0dXJuIDA7Cit9CisKK3B1YmxpYyBtaXhlZCAqUXVlcnlOUENieU9iamVjdChvYmplY3QgbykKK3sKKyAgc3RyaW5nIGtleTsKKyAgaW50IHZhbDsKKworICBrZXk9bG9hZF9uYW1lKG8pOworICBpZiAobWVtYmVyKG5wY3Msa2V5KSkgeworICAgIHZhbCA9IG5wY3Nba2V5LE5QQ19OVU1CRVJdOworICAgIHJldHVybiAoe3ZhbCwgYnlfbnVtW3ZhbCwgQllOVU1fU0NPUkVdLCBieV9udW1bdmFsLCBCWU5VTV9LRVldfSk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3B1YmxpYyBpbnQgR2l2ZUtpbGwob2JqZWN0IHBsLCBpbnQgYml0KQoreworICBtaXhlZCBpbmZvOworICBvYmplY3QgcG87CisgIGludCBkcmluOworICBzdHJpbmcgcGxzLCBlazsKKworCisgIGlmICghcG9pbnRlcnAoaW5mbyA9IFN0YXRpY1F1ZXJ5TlBDYnlOdW1iZXIoYml0KSkpCisgICAgcmV0dXJuIC0xOworCisgIGlmICgoIXBvPXByZXZpb3VzX29iamVjdCgpKSAKKyAgICAgIHx8IGxvYWRfbmFtZShwbykgIT0gaW5mb1tTQ09SRV9LRVldKQorICAgIHJldHVybiAtMjsKKworICBwbHM9Z2V0dWlkKHBsKTsKKworICAvLyB3ZW5uIHVuYmVzdGFldGlndCwgU3BpZWxlciBmdWVyIHNwYWV0ZXIgbWVya2VuCisgIGlmIChtZW1iZXIodW5jb25maXJtZWRfc2NvcmVzLCBiaXQpKSB7CisgICAgaWYgKG1lbWJlcih1bmNvbmZpcm1lZF9zY29yZXNbYml0XSwgcGxzKSA9PSAtMSkKKyAgdW5jb25maXJtZWRfc2NvcmVzW2JpdF0gKz0gKHtwbHN9KTsKKyAgfQorICBlbHNlIHsKKyAgICAvLyBzb25zdCB3aXJkIGRhcyBCaXQgZGlyZWt0IGltIFNwaWVsZXIgZ2VzZXR6dC4KKyAgICBlayA9IChNQVNURVItPnF1ZXJ5X2VrKHBscykgfHwgIiIpOworICAgIGlmICh0ZXN0X2JpdChlaywgYml0KSkKKyAgICAgIHJldHVybiAtMzsKKyAgICBlayA9IHNldF9iaXQoZWssIGJpdCk7CisgICAgTUFTVEVSLT51cGRhdGVfZWsocGxzLCBlayk7CisgICAgLy8gVmVyZ2FiZXN0YXRpc3RpayBob2NoemFlaGxlbi4KKyAgICBucGNzW2J5X251bVtiaXQsQllOVU1fS0VZXSxOUENfQ09VTlRdKys7CisgIH0KKworICBpZiAobWVtYmVyKHVzZXJzX2VrLCBwbHMpKQorICAgIG1fZGVsZXRlKHVzZXJzX2VrLCBwbHMpOworCisgIEVLX0dJVkVOTE9HKHNwcmludGYoIiVzOiAlcyIsIGluZm9bU0NPUkVfS0VZXSwgcGxzKSk7IAorCisgIHJldHVybiBpbmZvW1NDT1JFX1NDT1JFXTsKK30KKworcHVibGljIGludCBIYXNLaWxsKG1peGVkIHBsLCBtaXhlZCBucGMpCit7CisgIHN0cmluZyBmbiwgKnBsczsKKworICBpZiAoIW9iamVjdHAocGwpICYmICFzdHJpbmdwKHBsKSAmJiAKKyAgICAgICFvYmplY3RwKG5wYykgJiYgIXN0cmluZ3AobnBjKSAmJiAhaW50cChucGMpKQorICAgIHJldHVybiAwOworICBpZiAoIXN0cmluZ3AocGwpKSAKKyAgICBwbD1nZXR1aWQocGwpOworCisgIGlmIChpbnRwKG5wYykpCisgICAgbnBjPWJ5X251bVtucGMsQllOVU1fS0VZXTsKKyAgZm49bG9hZF9uYW1lKG5wYyk7CisKKyAgaWYgKCFtZW1iZXIobnBjcywgZm4pKSByZXR1cm4gMDsKKyAgCisgIGludCBiaXQgPSBucGNzW2ZuLCBOUENfTlVNQkVSXTsKKyAgCisgIGlmIChwb2ludGVycChwbHM9dW5jb25maXJtZWRfc2NvcmVzW2JpdF0pICYmCisgICAgICBtZW1iZXIocGxzLHBsKSAhPSAtMSkKKyAgICByZXR1cm4gMTsKKworICBzdHJpbmcgZWtzID0gKE1BU1RFUi0+cXVlcnlfZWsocGwpIHx8ICIiKTsKKworICByZXR1cm4gdGVzdF9iaXQoZWtzLCBiaXQpOworfQorCitwcml2YXRlIHZvaWQgV3JpdGVEdW1wRmlsZShzdHJpbmcgKmtleXMpIHsKKyAgaW50IG1heG47CisKKyAgaWYgKCFwb2ludGVycChrZXlzKSkgcmV0dXJuOworCisgIHJtKFNDT1JFRFVNUEZJTEUpOworCisgIHdyaXRlX2ZpbGUoU0NPUkVEVU1QRklMRSxzcHJpbnRmKCIlNXMgICU1cyAgJTRzICAgJXNcbiIsCisgICJOci4iLCAiQ250IiwgIlNjIiwgIk9iamVrdCIpKTsKKyAgZm9yZWFjaChzdHJpbmcga2V5OiBrZXlzKSB7CisgICAgd3JpdGVfZmlsZShTQ09SRURVTVBGSUxFLHNwcmludGYoIiU1ZCAgJTVkICAlNGQgICAlT1xuIiwKKyAgICBucGNzW2tleSxOUENfTlVNQkVSXSwgbnBjc1trZXksTlBDX0NPVU5UXSwKKyAgICBucGNzW2tleSxOUENfU0NPUkVdLCBrZXkpKTsKKyAgICBtYXhuICs9IG5wY3Nba2V5LE5QQ19TQ09SRV07CisgIH0KKyAgd3JpdGVfZmlsZShTQ09SRURVTVBGSUxFLHNwcmludGYoCisgICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgorICAiTlBDcyBnZXNhbXQ6ICVkIFB1bmt0ZVxuXG4iLG1heG4pKTsKK30KKworcHVibGljIHZhcmFyZ3MgaW50IER1bXBOUENzKGludCBzb3J0a2V5KSB7CisKKyAgaWYgKGV4dGVybl9jYWxsKCkgJiYgIWFsbG93ZWQoKSkgcmV0dXJuIFNDT1JFX05PX1BFUk1JU1NJT047CisgIGlmICghaW50cChzb3J0a2V5KSkgcmV0dXJuIFNDT1JFX0lOVkFMSURfQVJHOworCisgIHJtKFNDT1JFRFVNUEZJTEUpOworCisgIC8vIHNvcnRpZXJlbgorICBzdHJpbmcgKmtleXM9c29ydF9hcnJheShtX2luZGljZXMobnBjcyksIGZ1bmN0aW9uIGludCAoc3RyaW5nIGEsIHN0cmluZyBiKSB7CisgICAgICAgIHJldHVybihucGNzW2Esc29ydGtleV0gPCBucGNzW2Isc29ydGtleV0pOyB9ICk7CisgIGNhbGxfb3V0KCMnV3JpdGVEdW1wRmlsZSwgMiwga2V5cyk7CisKKyAgcmV0dXJuIDE7Cit9CisKK3B1YmxpYyBpbnQgU2V0U2NvcmVCaXQoc3RyaW5nIHBsLCBpbnQgYml0KQoreworICBzdHJpbmcgZWs7CisKKyAgaWYgKCFhbGxvd2VkKCkpCisgICAgcmV0dXJuIFNDT1JFX05PX1BFUk1JU1NJT047CisKKyAgZWsgPSAoTUFTVEVSLT5xdWVyeV9layhwbCkgfHwgIiIpOworICBlayA9IHNldF9iaXQoZWssIGJpdCk7CisgIE1BU1RFUi0+dXBkYXRlX2VrKHBsLCBlayk7CisKKyAgLy8gVmVyZ2FiZXN0YXRpc3RpayBob2NoemFlaGxlbi4KKyAgbnBjc1tieV9udW1bYml0LEJZTlVNX0tFWV0sTlBDX0NPVU5UXSsrOworCisgIGlmIChtZW1iZXIodXNlcnNfZWssIHBsKSkKKyAgICBtX2RlbGV0ZSh1c2Vyc19laywgcGwpOworCisgIHdyaXRlX2ZpbGUoU0NPUkVMT0dGSUxFLHNwcmludGYoIlNFVEJJVDogJXMgJXMgJTVkIFNjOiAlLjNkICVzICglcywgJU8pXG4iLAorICAgICAgICAgc3RyZnRpbWUoIiVkJW0lWS0lVCIsdGltZSgpKSxwbCwgYml0LAorICAgICAgICAgYnlfbnVtW2JpdCxCWU5VTV9TQ09SRV0sIGJ5X251bVtiaXQsQllOVU1fS0VZXSwKKyAgICAgICAgIGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpLCB0aGlzX2ludGVyYWN0aXZlKCkpKTsKKyAgcmV0dXJuIDE7Cit9CisKK3B1YmxpYyBpbnQgQ2xlYXJTY29yZUJpdChzdHJpbmcgcGwsIGludCBiaXQpCit7CisgIHN0cmluZyBlazsKKworICBpZiAoIWFsbG93ZWQoKSkKKyAgICByZXR1cm4gU0NPUkVfTk9fUEVSTUlTU0lPTjsKKworICBlayA9IChNQVNURVItPnF1ZXJ5X2VrKHBsKSB8fCAiIik7CisgIGVrID0gY2xlYXJfYml0KGVrLCBiaXQpOworICBNQVNURVItPnVwZGF0ZV9layhwbCwgZWspOworCisgIC8vIFZlcmdhYmVzdGF0aXN0aWsgcnVudGVyemFlaGxlbi4KKyAgbnBjc1tieV9udW1bYml0LEJZTlVNX0tFWV0sTlBDX0NPVU5UXS0tOworCisgIGlmIChtZW1iZXIodXNlcnNfZWssIHBsKSkKKyAgICBtX2RlbGV0ZSh1c2Vyc19laywgcGwpOworCisgIHdyaXRlX2ZpbGUoU0NPUkVMT0dGSUxFLHNwcmludGYoCisgICJDTEVBUkJJVDogJXMgJXMgJTVkIFNjOiAlLjNkICVzICglcywgJU8pXG4iLCAgICAgICAKKyAgc3RyZnRpbWUoIiVkJW0lWS0lVCIsdGltZSgpKSxwbCxiaXQsCisgIGJ5X251bVtiaXQsQllOVU1fU0NPUkVdLGJ5X251bVtiaXQsQllOVU1fS0VZXSwKKyAgZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSksIHRoaXNfaW50ZXJhY3RpdmUoKSkpOworICByZXR1cm4gMTsKK30KKworcHJpdmF0ZSBzdGF0dXMgZWt0aXBBbGxvd2VkKCkKK3sgCisgIHN0YXR1cyBwb09LOworICBzdHJpbmcgcG9OYW1lOworICBzdGF0dXMgcmV0OworICAgICAgICAgICAgICAgIAorICBwb05hbWU9bG9hZF9uYW1lKHByZXZpb3VzX29iamVjdCgpKTsgICAgICAgIAorICBwb09LPXByZXZpb3VzX29iamVjdCgpICYmICAgICAKKyAgICAoKHByZXZpb3VzX29iamVjdCgpPT1maW5kX29iamVjdChFS1RJUEdJVkVSKSkgfHwgKHBvTmFtZT09RUtUSVBMSVNUKSApOworCisgIHJldD1hbGxvd2VkKCkgfHwgCisgICAgKHRoaXNfcGxheWVyKCkgJiYgdGhpc19pbnRlcmFjdGl2ZSgpICYmIHByZXZpb3VzX29iamVjdCgpICYmIAorICAgICB0aGlzX2ludGVyYWN0aXZlKCk9PXRoaXNfcGxheWVyKCkgJiYgcG9PSyk7CisgIHJldHVybiByZXQ7Cit9CisKKy8vIGxpZWZlcnQgYWxsZSBFS3MsIGRpZSBha3RpdiBzaW5kIHVuZCBkaWUgZGVyIFNwaWVsZXIgbm9jaCBuaWNodCBoYXQgaW4KKy8vIGVpbmVtIE1hcHBpbmcgZW50c3ByZWNoZW5kIG5wY3MgenVydWVjay4KK3B1YmxpYyBtYXBwaW5nIGdldEZyZWVFS3NGb3JQbGF5ZXIob2JqZWN0IHBsYXllcikKK3sKKyAgaWYoIWVrdGlwQWxsb3dlZCgpIHx8ICFvYmplY3RwKHBsYXllcikgfHwgIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUocGxheWVyKSl7CisgICAgICByZXR1cm4gKFtdKTsKKyAgfQorICAvLyBhbGxlIEVLcywgZGllIGRlciBTcGllbGVyIGhhdAorICBzdHJpbmcgZWtzID0gKHN0cmluZyltYXN0ZXIoKS0+cXVlcnlfZWsoZ2V0dWlkKHBsYXllcikpOworICAvLyBhbHMgVGlwcyBrb21tZW4gYWxsZSBpbiBGcmFnZSwgZGllIGVyIG5pY2h0IGhhdCwgdm9yIGRlbSBJbnZlcnRpZXJlbiBtdXNzCisgIC8vIGFiZXIgc2ljaGVyZ2VzdGVsbHQgd2VyZGVuLCBkYXNzIGVrcyBtaW4uIHNvIGxhbmcgaXN0IHdpZSBhY3RpdmVfZWtzLCBkYQorICAvLyBkaWUgSW52ZXJ0aWVydW5nIGphIHouQi4gbnVyIEVLcyAwLTE3MDAgYmVydWVja3NpY2h0aWd0LCB3ZW5uIDE3MDAgZGVyCisgIC8vIGhvZWNoc3RlIEVLIGltIFNwaWVsZXIgaXN0IHVuZCBkYW5uIGFscyBUaXBzIGFsbGUgRUtzIHVlYmVyCisgIC8vIDE3MDAgdmVybG9yZW5naW5nZW4uCisgIC8vIGhpZXIgd2lyZCBkYXMgbGV0enRlIEJpdCB2b24gYWN0aXZlX2VrcyBlcm1pdHRlbHQgdW5kIGRhcyBkYXJhdWYgZm9sZ2VuZGUKKyAgLy8gQml0IGltIFNwaWVsZXItRUstU3RyaW5nIGdlc2V0enQgdW5kIHdpZWRlciBnZWxvZXNjaHQsIHdvcmF1ZmhpbiBkZXIKKyAgLy8gRUstU3RyaW5nIG1pbi4gc28gbGFuZyB3aWUgYWN0aXZlX2VrcyBpc3QuIChlcyBpc3QgZWdhbCwgd2VubiBlcgorICAvLyBsYWVuZ2VyIGlzdCwgYXVjaCBlZ2FsLCB3ZW5uIG1hbiBlaW4gQml0IHVlYmVyc2NocmVpYnQsIGRhcyBmYWVsbHQgYWxsZXMKKyAgLy8gZ2xlaWNoIGJlaW0gYW5kX2JpdHMoKSByYXVzLgorICBpbnQgbGIgPSBsYXN0X2JpdChhY3RpdmVfZWtzKSArIDE7CisgIGVrcyA9IGNsZWFyX2JpdChzZXRfYml0KGVrcywgbGIpLCBsYik7CisgIC8vIGpldHp0IGludmVydGllcmVuCisgIHN0cmluZyBub25fZWtzID0gaW52ZXJ0X2JpdHMoZWtzKTsKKyAgLy8gamV0enQgdm9yaGFuZGUgRUstVGlwcyBhdXNmaWx0ZXJuLiBJbSBQcmluemlwIGdsZWljaGVzIFNwaWVsIHdpZSBvYmVuLgorICBzdHJpbmcgZWt0aXBzID0gKHN0cmluZyltYXN0ZXIoKS0+cXVlcnlfZWt0aXBzKGdldHVpZChwbGF5ZXIpKTsKKyAgLy8gamV0enQgYWxsZSBuaWNodCBhbHMgVGlwIHZlcmdlYmVuZW4gTlBDIGVybWl0dGVsbiwgdm9yIGRlbSBJbnZlcnRpZXJlbgorICAvLyB3aWVkZXIgTGFlbmdlIGFuZ2xlaWNoZW4uLi4KKyAgZWt0aXBzID0gaW52ZXJ0X2JpdHMoY2xlYXJfYml0KHNldF9iaXQoZWt0aXBzLCBsYiksIGxiKSk7CisgIC8vIHZlcnVuZGVuIGxpZWZlcnQgRUtzLCBkaWUgZGVyIFNwaWVsZXIgbmljaHQgaGF0IHVuZCBuaWNodCBhbHMgVGlwIGhhdAorICBla3RpcHMgPSBhbmRfYml0cyhla3RpcHMsIG5vbl9la3MpOworCisgIC8vIHVuZCBudW4gZGllIGluYWt0aXZlIEVLcyBhdXNmaWx0ZXJuLCBub2NobWFsIHZlcnVuZGVuCisgIGVrdGlwcyA9IGFuZF9iaXRzKGVrdGlwcywgYWN0aXZlX2Vrcyk7CisKKyAgLy8gbWFsIFBsYXR6IHJlc2VydmllcmVuLCBlbnRzcHJlY2hlbmQgZGVyIE1lbmdlIGFuIEJpdHMKKyAgbWFwcGluZyBmcmVlS2lsbHMgPSBtX2FsbG9jYXRlKCBjb3VudF9iaXRzKGVrdGlwcyksIDIpOworICAvLyBkdXJjaCBhbGxlIGpldHp0IGdlc2V0enRlbiBCaXRzIGxhdWZlbiwgZC5oLiBhbGxlIEVLcywgZGllIGRlciBTcGllbGVyCisgIC8vIG5pY2h0IGhhdCB1bmQgZWluIE1hcHBpbmcgYSBsYSBucGNzIGVyc3RlbGxlbi4KKyAgaW50IHA9LTE7CisgIHdoaWxlICggKHA9bmV4dF9iaXQoZWt0aXBzLCBwKSkgIT0gLTEpIHsKKyAgICBmcmVlS2lsbHMgKz0gKFsgYnlfbnVtW3AsMF06IHA7IGJ5X251bVtwLDFdIF0pOworICB9CisKKyAgcmV0dXJuIGZyZWVLaWxsczsKK30KKworcHVibGljIGludCBhZGRUaXAobWl4ZWQga2V5LHN0cmluZyB0aXApCit7CisgIHN0cmluZyBmbjsKKyAgCisgIGlmICghYWxsb3dlZCgpKQorICAgIHJldHVybiBTQ09SRV9OT19QRVJNSVNTSU9OOworCisgIGlmICghdGlwIHx8ICghb2JqZWN0cChrZXkpICYmICFzdHJpbmdwKGtleSkpKQorICAgIHJldHVybiBTQ09SRV9JTlZBTElEX0FSRzsKKworICBmbj1sb2FkX25hbWUoa2V5KTsKKworICBpZiAoIW1lbWJlcihucGNzLCBmbikpIHJldHVybiBTQ09SRV9JTlZBTElEX0FSRzsKKyAgdGlwTGlzdCs9KFtmbjp0aXBdKTsKKyAgc2F2ZV9vYmplY3QoU0NPUkVTQVZFRklMRSk7CisgICAgCisgIHJldHVybiAxOworfQorCitwdWJsaWMgaW50IGNoYW5nZVRpcChtaXhlZCBrZXksc3RyaW5nIHRpcCkKK3sKKyAgICByZXR1cm4gYWRkVGlwKGtleSx0aXApOworfQorCitwdWJsaWMgaW50IHJlbW92ZVRpcChtaXhlZCBrZXkpCit7CisgIHN0cmluZyBmbjsKKyAgCisgIGlmICghYWxsb3dlZCgpKQorICAgIHJldHVybiBTQ09SRV9OT19QRVJNSVNTSU9OOworICAKKyAgaWYgKCghb2JqZWN0cChrZXkpICYmICFzdHJpbmdwKGtleSkpKQorICAgIHJldHVybiBTQ09SRV9JTlZBTElEX0FSRzsKKworICBmbj1sb2FkX25hbWUoa2V5KTsKKyAgCisgIGlmICghbWVtYmVyKHRpcExpc3QsIGZuKSkgcmV0dXJuIFNDT1JFX0lOVkFMSURfQVJHOworICAgIAorICBtX2RlbGV0ZSh0aXBMaXN0LGZuKTsKKyAgc2F2ZV9vYmplY3QoU0NPUkVTQVZFRklMRSk7CisgICAgCisgIHJldHVybiAxOyAgCit9CisKK3ByaXZhdGUgc3RyaW5nIGdldFRpcEZyb21MaXN0KG1peGVkIGtleSkKK3sKKyAgc3RyaW5nIGZuOworICAKKyAgaWYgKCFla3RpcEFsbG93ZWQoKSkKKyAgICByZXR1cm4gIiI7CisgIAorICBpZiAoKCFvYmplY3RwKGtleSkgJiYgIXN0cmluZ3Aoa2V5KSkpCisgICAgcmV0dXJuICIiOworCisgIGZuPWxvYWRfbmFtZShrZXkpOworICAKKyAgaWYgKCFtZW1iZXIodGlwTGlzdCwgZm4pKSByZXR1cm4gIiI7CisgICAgICAgIAorICByZXR1cm4gdGlwTGlzdFtmbl07ICAKK30KKworcHJpdmF0ZSBzdHJpbmcgX2dldFRpcChtaXhlZCBrZXkpCit7CisgIHN0cmluZyBmbjsKKyAgc3RyaW5nIHRpcDsKKyAgc3RyaW5nKiBwYXRoOworICAgIAorICBpZiAoKCFvYmplY3RwKGtleSkgJiYgIXN0cmluZ3Aoa2V5KSkpCisgICAgcmV0dXJuICIiOworCisgIGZuPWxvYWRfbmFtZShrZXkpOworICAKKyAgaWYoIW1lbWJlcihucGNzLGZuKSkgcmV0dXJuICIiOworICAKKyAgdGlwPWdldFRpcEZyb21MaXN0KGZuKTsKKyAgaWYoIXRpcCB8fCB0aXA9PSIiKXsKKyAgICBwYXRoPWV4cGxvZGUoZm4sIi8iKS0oeyIifSk7CisgICAgaWYoc2l6ZW9mKHBhdGgpPDMpIHJldHVybiAiIjsKKyAgICBpZihwYXRoWzBdPT0icGxheWVycyIpIHsKKyAgICAgIHN0cmluZyB0aXB0ZXh0OworICAgICAgaWYgKCBwYXRoWzFdID09ICJrZXRvcyIgKQorICAgICAgICB0aXB0ZXh0ID0gIktldG9zIGltIEdlYmlyZ2UiOworICAgICAgZWxzZSBpZiAoIHBhdGhbMV0gPT0gImJvaW5nIiAmJiBwYXRoWzJdID09ICJmcmllZGhvZiIgKQorICAgICAgICB0aXB0ZXh0ID0gIkJvaW5nIGltIGVpc2lnZW4gUG9sYXIiOworICAgICAgZWxzZQorICAgICAgICB0aXB0ZXh0ID0gY2FwaXRhbGl6ZShwYXRoWzFdKTsKKyAgICAgIHJldHVybiAiU2NoYXUgRGljaCBkb2NoIG1hbCBiZWkgIit0aXB0ZXh0KyIgdW0uIjsKKyAgICB9CisgICAgCisgICAgaWYocGF0aFswXT09ImQiKQorICAgIHsKKyAgICAgIHRpcCs9IlNjaGF1IERpY2ggZG9jaCBtYWwgIjsKKyAgICAKKyAgICAgIGlmKGZpbGVfc2l6ZSgiL3BsYXllcnMvIitwYXRoWzJdKT09LTIpCisgICAgICB7CisgICAgICAgIHRpcCs9ImJlaSAiK2NhcGl0YWxpemUocGF0aFsyXSsiICIpOworICAgICAgfQorICAgICAgaWYgKCBwYXRoWzFdPT0icG9sYXIiICYmIGZpbGVfc2l6ZSgiL3BsYXllcnMvIitwYXRoWzNdKT09LTIgKQorICAgICAgeworICAgICAgICB0aXArPSJiZWkgIitjYXBpdGFsaXplKHBhdGhbM10pKyIgIjsKKyAgICAgIH0KKworICAgICAgaWYocGF0aFsxXT09ImFuZmFlbmdlciIpCisgICAgICAgIHRpcCs9ImluIGRlbiBBbmZhZW5nZXJnZWJpZXRlbiAiOworICAgICAgaWYocGF0aFsxXT09ImZlcm53ZXN0IikKKyAgICAgICAgdGlwKz0iaW4gRmVybndlc3QgIjsKKyAgICAgIGlmKHBhdGhbMV09PSJkc2NodW5nZWwiKQorICAgICAgICB0aXArPSJpbSBEc2NodW5nZWwgIjsKKyAgICAgIGlmKHBhdGhbMV09PSJzY2hhdHRlbndlbHQiKQorICAgICAgICB0aXArPSJpbiBkZXIgV2VsdCBkZXIgU2NoYXR0ZW4gIjsKKyAgICAgIGlmKHBhdGhbMV09PSJ1bnRlcndlbHQiKQorICAgICAgICB0aXArPSJpbiBkZXIgVW50ZXJ3ZWx0ICI7CisgICAgICBpZihwYXRoWzFdPT0iZ2ViaXJnZSIpCisgICAgICAgIHRpcCs9ImltIEdlYmlyZ2UgIjsKKyAgICAgIGlmKHBhdGhbMV09PSJzZWhlciIpCisgICAgICAgIHRpcCs9ImJlaSBkZW4gU2VoZXJnZWJpZXRlbiAiOworICAgICAgaWYocGF0aFsxXT09InZsYW5kIikKKyAgICAgICAgdGlwKz0iYXVmIGRlbSBWZXJsb3JlbmVuIExhbmQgIjsKKyAgICAgIGlmKHBhdGhbMV09PSJlYmVuZSIpCisgICAgICAgIHRpcCs9ImluIGRlciBFYmVuZSAiOworICAgICAgaWYocGF0aFsxXT09Imluc2VsbiIpCisgICAgICAgIHRpcCs9ImF1ZiBkZW4gSW5zZWxuICI7CisgICAgICBpZihwYXRoWzFdPT0id2FsZCIpCisgICAgICAgIHRpcCs9ImltIFdhbGQgIjsKKyAgICAgIGlmKHBhdGhbMV09PSJlcnptYWdpZXIiKQorICAgICAgICB0aXArPSJiZWkgZGVuIEVyem1hZ2llcm4gIjsKKyAgICAgIGlmKHBhdGhbMV09PSJwb2xhciIpCisgICAgICB7CisgICAgICAgIGlmIChwYXRoWzJdPT0iZmlsZXMuY2hhb3MiKQorICAgICAgICAgIHRpcCs9ImluIGRlbiBSYWV1bWVuIGRlciBDaGFvc2dpbGRlICI7CisgICAgICAgIHRpcCs9ImltIGVpc2lnZW4gUG9sYXIgIjsKKyAgICAgIH0KKyAgICAgIGlmKHBhdGhbMV09PSJ3dWVzdGUiKQorICAgICAgICB0aXArPSJpbiBkZXIgV3Vlc3RlICI7CisgICAgICB0aXArPSJ1bS4iOworICAgIH0KKyAgICBlbHNlIGlmICggcGF0aFswXT09ImdpbGRlbiIgKQorICAgIHsKKyAgICAgIHRpcCs9IlNjaGF1IERpY2ggZG9jaCBtYWwiOworICAgICAgc3dpdGNoKCBwYXRoWzFdICkKKyAgICAgIHsKKyAgICAgICAgY2FzZSAibW9uLmVsZW1lbnRhciI6IAorICAgICAgICAgIHRpcCs9IiB1bnRlciBkZW4gQW5mdWVocmVybiBkZXIgRWxlbWVudGFyZ2lsZGUiOyAKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiZmlsZXMuZHVua2VsZWxmZW4iOgorICAgICAgICAgIHRpcCs9IiB1bnRlciBkZW4gQW5mdWVocmVybiBkZXIgRHVua2VsZWxmZW5naWxkZSI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgImZpbGVzLmtsZXJ1cyI6CisgICAgICAgICAgdGlwKz0iIGJlaW0gS2xlcnVzIjsgCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgImZpbGVzLndlcndvZWxmZSI6IAorICAgICAgICAgIHRpcCs9IiB1bnRlciBkZW4gQW5mdWVocmVybiBkZXIgV2Vyd29lbGZlIjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiZmlsZXMuY2hhb3MiOiAKKyAgICAgICAgICB0aXArPSIgdW50ZXIgZGVuIEFuZnVlaHJlcm4gZGVyIENoYW9zZ2lsZGUiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAKKyAgICAgICAgICB0aXArPSIgaW4gZWluZXIgZGVyIEdpbGRlbiI7IAorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgdGlwKz0iIHVtLiI7CisgICAgfQorICAgIGVsc2UgaWYgKCBwYXRoWzBdID09ICJwIiApIAorICAgIHsKKyAgICAgIHRpcCs9IlNjaGF1IERpY2ggZG9jaCBtYWwgIjsKKyAgICAgIHN3aXRjaCggcGF0aFsxXSApIAorICAgICAgeworICAgICAgICBjYXNlICJ6YXViZXJlciI6CisgICAgICAgICAgdGlwKz0iaW4gZGVyIFphdWJlcmVyZ2lsZGUgenUgVGFyYW1pcyI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgImthZW1wZmVyIjoKKyAgICAgICAgICB0aXArPSJiZWkgZGVuIEFuZ2Vob2VyaWdlbiBkZXMgS29ydS1Uc2NoYWthci1TdHJ1dnMiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICJrYXR6ZW5rcmllZ2VyIjoKKyAgICAgICAgICB0aXArPSJiZWkgZGVyIEdpbGRlIGRlciBLYXR6ZW5rcmllZ2VyIjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAidGFuamlhbiI6CisgICAgICAgICAgdGlwKz0idW50ZXIgZGVuIE1laXN0ZXJuIGRlciBUYW5qaWFuZ2lsZGUiOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgdGlwKz0iIHVtLiI7CisgICAgfQorICB9CisgIHJldHVybiB0aXA7Cit9CisKKy8vIHJldHVybiB2YWxpZCB0aXBzIGZyb20gZGF0YWJhc2Ugb3IgZXhpc3RpbmcgCitwdWJsaWMgc3RyaW5nIGdldFRpcChtaXhlZCBrZXkpCit7CisgIHN0cmluZyBmbjsKKyAgc3RyaW5nIHRpcDsKKyAgc3RyaW5nKiBwYXRoOworICAKKyAgaWYgKCFla3RpcEFsbG93ZWQoKSkKKyAgICByZXR1cm4gIiI7CisgIAorICByZXR1cm4gX2dldFRpcChrZXkpOworfQorCisvLyBsaWVmZXJ0IGVpbiBBcnJheSBtaXQgYWxsZW4gT2JqZWt0ZW4genVydWVjaywgYXVmIGRpZSBiaXRzdHIgdmVyd2Vpc3QsIGFsc28KKy8vIGVpbmUgTGlzdGUgYWxsZXIgT2JqZWt0ZSwgZGllIGFscyBUaXAgdmVyZ2ViZW4gd3VyZGVuLgorcHJpdmF0ZSBzdHJpbmcqIG1ha2VUaXBsaXN0RnJvbUJpdFN0cmluZyhzdHJpbmcgYml0c3RyKQoreyAKKyAgc3RyaW5nICogcmV0PSBhbGxvY2F0ZShjb3VudF9iaXRzKGJpdHN0cikpOworICAvLyB1ZWJlciBhbGxlIGdlc2V0enRlbiBiaXRzIGxhdWZlbiB1bmQgQXJyYXkgenVzYW1tZW5zYW1tZWxuCisgIGludCBpOworICBpbnQgcD0tMTsKKyAgd2hpbGUgKChwPW5leHRfYml0KGJpdHN0cixwKSkgIT0gLTEpIHsKKyAgICByZXRbaV0gPSBieV9udW1bcCwgMF07CisgICAgaSsrOworICB9CisgIC8vIHp1ciBTaWNoZXJoZWl0CisgIHJldCAtPSAoezB9KTsKKworICByZXR1cm4gcmV0OworfQorCisvLyBnaWJ0IGRpZSBPYmpla3RuYW1lbiBkZXIgRUstVGlwcyB2b20gamV3ZWlsaWdlbiBTcGllbGVyIHp1cnVlY2suCitwdWJsaWMgc3RyaW5nICpRdWVyeVRpcE9iamVjdHMobWl4ZWQgcGxheWVyKSB7CisgIAorICBpZiAoZXh0ZXJuX2NhbGwoKSAmJiAhYWxsb3dlZCgpKQorICAgICAgcmV0dXJuIDA7CisgIGlmIChvYmplY3RwKHBsYXllcikgJiYgcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShwbGF5ZXIpKQorICAgICAgcGxheWVyPWdldHVpZChwbGF5ZXIpOworICBpZiAoIXN0cmluZ3AocGxheWVyKSkKKyAgICByZXR1cm4gMDsKKworICBzdHJpbmcgdGlwc3RyPShzdHJpbmcpbWFzdGVyKCktPnF1ZXJ5X2VrdGlwcyhwbGF5ZXIpOworICAvLyBqZXR6dCBFSy1UaXBzIGF1c2ZpbHRlcm4sIGRpZSBlcmxlZGlndCBzaW5kLiBEYXp1IEVLLUxpc3RlIGhvbGVuLi4uCisgIHN0cmluZyBla3M9KHN0cmluZyltYXN0ZXIoKS0+cXVlcnlfZWsocGxheWVyKTsKKyAgLy8gYWxzIFRpcHMga29tbWVuIGFsbGUgaW4gRnJhZ2UsIGRpZSBlciBuaWNodCBoYXQsIHZvciBkZW0gSW52ZXJ0aWVyZW4gbXVzcworICAvLyBhYmVyIHNpY2hlcmdlc3RlbGx0IHdlcmRlbiwgZGFzcyBla3MgbWluLiBzbyBsYW5nIGlzdCB3aWUgdGlwc3RyLCBkYQorICAvLyBkaWUgSW52ZXJ0aWVydW5nIGphIHouQi4gbnVyIEVLcyAwLTE3MDAgYmVydWVja3NpY2h0aWd0LCB3ZW5uIDE3MDAgZGVyCisgIC8vIGhvZWNoc3RlIEVLIGltIFNwaWVsZXIgaXN0IHVuZCBkYW5uIGFsbGUgVGlwcyB1ZWJlcgorICAvLyAxNzAwIHZlcmxvcmVuZ2luZ2VuLgorICAvLyBoaWVyIHdpcmQgZGFzIGxldHp0ZSBCaXQgdm9uIHRpcHN0ciBlcm1pdHRlbHQgdW5kIGRhcyBkYXJhdWYgZm9sZ2VuZGUKKyAgLy8gQml0IGltIFNwaWVsZXItRUstU3RyaW5nIGdlc2V0enQgdW5kIHdpZWRlciBnZWxvZXNjaHQsIHdvcmF1ZmhpbiBkZXIKKyAgLy8gRUstU3RyaW5nIG1pbi4gc28gbGFuZyB3aWUgZGVyIFRpcHN0cmluZyBpc3QuIChlcyBpc3QgZWdhbCwgd2VubiBlcgorICAvLyBsYWVuZ2VyIGlzdCwgYXVjaCBlZ2FsLCB3ZW5uIG1hbiBlaW4gQml0IHVlYmVyc2NocmVpYnQsIGRhcyBmYWVsbHQgYWxsZXMKKyAgLy8gZ2xlaWNoIGJlaW0gYW5kX2JpdHMoKSByYXVzLgorICBpbnQgbGIgPSBsYXN0X2JpdCh0aXBzdHIpICsgMTsKKyAgZWtzID0gY2xlYXJfYml0KHNldF9iaXQoZWtzLCBsYiksIGxiKTsKKyAgLy8gamV0enQgaW52ZXJ0aWVyZW4KKyAgc3RyaW5nIG5vbl9la3MgPSBpbnZlcnRfYml0cyhla3MpOworICAvLyBqZXR6dCB2ZXJ1bmRlbiB1bmQgbWFuIGhhdCBkaWUgVGlwcywgZGllIG5vY2ggbmljaHQgZ2VoYXVlbiB3dXJkZW4uCisgIHRpcHN0ciA9IGFuZF9iaXRzKHRpcHN0ciwgbm9uX2Vrcyk7CisgIC8vIG5vY2ggaW5ha3RpdmUgRUtzIGF1c2ZpbHRlcm4uLi4KKyAgdGlwc3RyID0gYW5kX2JpdHModGlwc3RyLCBhY3RpdmVfZWtzKTsKKworICByZXR1cm4gbWFrZVRpcGxpc3RGcm9tQml0U3RyaW5nKHRpcHN0cik7Cit9CisKK3B1YmxpYyBzdHJpbmcgYWxsVGlwc0ZvclBsYXllcihvYmplY3QgcGxheWVyKQoreworCisgIGlmKCFwbGF5ZXIgfHwgIXRoaXNfaW50ZXJhY3RpdmUoKSB8fCAKKyAgICAgICh0aGlzX2ludGVyYWN0aXZlKCkhPXBsYXllciAmJiAhSVNfQVJDSCh0aGlzX2ludGVyYWN0aXZlKCkpKSApCisgICAgcmV0dXJuICIiOyAgICAKKyAKKyAgc3RyaW5nICp0aXBzID0gUXVlcnlUaXBPYmplY3RzKHBsYXllcik7CisKKyAgdGlwcyA9IG1hcCh0aXBzLCAjJ19nZXRUaXApOworICB0aXBzIC09ICh7MCwiIn0pOworCisgIHJldHVybiBpbXBsb2RlKHRpcHMsICJcbiIpOworfQorCitwdWJsaWMgc3RhdHVzIHBsYXllck1heUdldFRpcChvYmplY3QgcGxheWVyKQoreworICBpbnQgbnVtRWxlZ2libGU7CisgIGludCBudW1SZWNlaXZlZDsKKyAgaW50IGx2bDsKKyAgaW50IGk7CisgIHN0cmluZyB0aXBzOworICAKKyAgaWYoIWVrdGlwQWxsb3dlZCgpIHx8ICFwbGF5ZXIgfHwgIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUocGxheWVyKSkgICAgICAKKyAgICAgIHJldHVybiAwOworCisgIGlmKCFwbGF5ZXIgfHwgIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUocGxheWVyKSkgICAgCisgICAgICByZXR1cm4gMDsKKyAgCisgIGx2bD0oaW50KXBsYXllci0+UXVlcnlQcm9wKFBfTEVWRUwpOworICBudW1FbGVnaWJsZT0wOworICBpPXNpemVvZihFS1RJUFNfTEVWRUxfTElNSVRTKS0xOworCisgIGlmKGx2bD5FS1RJUFNfTEVWRUxfTElNSVRTW2ldKSAgICAKKyAgICAgIG51bUVsZWdpYmxlKz0obHZsLUVLVElQU19MRVZFTF9MSU1JVFNbaV0pOworCisgIGZvcihpO2k+PTA7aS0tKXsKKyAgICAgIGlmKGx2bD49RUtUSVBTX0xFVkVMX0xJTUlUU1tpXSkgbnVtRWxlZ2libGUrKzsKKyAgfQorCisgIHRpcHM9KHN0cmluZylNQVNURVItPnF1ZXJ5X2VrdGlwcyhnZXR1aWQocGxheWVyKSkgfHwgIiI7CisgIC8vIGluYWt0aXZlIEVLcyBhdXNmaWx0ZXJuLgorICB0aXBzID0gYW5kX2JpdHModGlwcywgYWN0aXZlX2Vrcyk7CisgIC8vIHVuZCBHZXNhbXR6YWhsIGFuIFRpcHMgemFlaGxlbi4gSGllciB3ZXJkZW4gZXJsZWRpZ3RlIFRpcHMgZXhwbGl6aXQgbmljaHQKKyAgLy8gYXVzZ2VmaWx0ZXJ0IQorICBudW1SZWNlaXZlZD1jb3VudF9iaXRzKHRpcHMpOworCisgIHJldHVybiBudW1FbGVnaWJsZT5udW1SZWNlaXZlZDsKK30KKworcHVibGljIHN0cmluZyBnaXZlVGlwRm9yUGxheWVyKG9iamVjdCBwbGF5ZXIpCit7CisgIHN0cmluZyogdG1wOworICBtYXBwaW5nIGZyZWU7CisgIHN0cmluZyB0aXAscGwsZWt0aXA7CisgIGludCBpbmRleDsKKyAgCisgIGlmKCFla3RpcEFsbG93ZWQoKSB8fCAhcGxheWVyIHx8IAorICAgICAgIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUocGxheWVyKSB8fCAhcGxheWVyTWF5R2V0VGlwKHBsYXllcikpICAKKyAgICByZXR1cm4gIiI7CisgIAorICBwbD1nZXR1aWQocGxheWVyKTsKKyAgZnJlZT1nZXRGcmVlRUtzRm9yUGxheWVyKHBsYXllcik7CisKKyAgaWYoIW1hcHBpbmdwKGZyZWUpIHx8IHNpemVvZihmcmVlKT09MCkKKyAgICByZXR1cm4gIiI7CisKKyAgdG1wPW1faW5kaWNlcyhmcmVlKTsKKworICBla3RpcD0oc3RyaW5nKU1BU1RFUi0+cXVlcnlfZWt0aXBzKHBsKSB8fCAiIjsKKyAKKyAgZm9yZWFjaChpbnQgaTogRUtUSVBTX01BWF9SRVRSWSkgeworICAgICAgaW5kZXg9cmFuZG9tKHNpemVvZih0bXApKTsKKyAgICAgIHRpcD1nZXRUaXAodG1wW2luZGV4XSk7CisgICAgICBpZiAoc3RyaW5ncCh0aXApICYmIHNpemVvZih0aXApKSB7CisgICAgZWt0aXA9c2V0X2JpdChla3RpcCxucGNzW3RtcFtpbmRleF0sTlBDX05VTUJFUl0pOworICAgIE1BU1RFUi0+dXBkYXRlX2VrdGlwcyhwbCxla3RpcCk7CisgICAgYnJlYWs7IC8vZmVydGlnCisgICAgICB9CisgIH0KKworICByZXR1cm4gdGlwOyAgCit9CisKKy8vIGNoZWNrdCBOUENzIGF1ZiBFeGlzdGVueiB1bmQgTGFkYmFya2VpdAorcHVibGljIHZvaWQgQ2hlY2tOUENzKGludCBudW0pIHsKKyAgc3RyaW5nIGZuOworICBvYmplY3QgZWtvYjsKKyAgaWYgKCFudW0pIHJtKFNDT1JFQ0hFQ0tGSUxFKTsKKyAgd2hpbGUgKG51bSA8PSBsYXN0TnVtICYmIGdldF9ldmFsX2Nvc3QoKSA+IDE0ODAwMDApIHsKKyAgICBpZiAoIWJ5X251bVtudW0sMV0gfHwgIWJ5X251bVtudW0sMF0pIHsKKyAgICAgIG51bSsrOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGZuID0gYnlfbnVtW251bSwwXSArICIuYyI7CisgICAgaWYgKGZpbGVfc2l6ZShmbikgPD0gMCkgeworICAgICAgLy8gRmlsZSBuaWNodCBleGlzdGVudAorICAgICAgd3JpdGVfZmlsZShTQ09SRUNIRUNLRklMRSwgc3ByaW50ZigKKyAgICAiRUsgJS40ZCBpc3QgbmljaHQgZXhpc3RlbnQgKCVzKVxuIixudW0sZm4pKTsKKyAgICB9CisgICAgZWxzZSBpZiAoY2F0Y2goZWtvYj1sb2FkX29iamVjdChmbikpIHx8ICFvYmplY3RwKGVrb2IpICkgeworICAgICAgLy8gTlBDIG9mZmVuYmFyIG5pY2h0IGxhZGJhci4KKyAgICAgIHdyaXRlX2ZpbGUoU0NPUkVDSEVDS0ZJTEUsIHNwcmludGYoCisgICAgIkVLICUuNGQgaXN0IG5pY2h0IGxhZGJhciAoJXMpXG4iLG51bSxmbikpOworICAgIH0KKyAgICBudW0rKzsKKyAgfQorICBaREVCVUcoc3ByaW50ZigiJWQgTlBDIGNoZWNrZWQiLG51bSkpOworICBpZiAobnVtIDw9IGxhc3ROdW0pCisgICAgY2FsbF9vdXQoIydDaGVja05QQ3MsNCxudW0pOworICBlbHNlCisgICAgWkRFQlVHKCJGaW5pc2hlZCEiKTsKK30KKworLy8gbGlxdWlkaWVydCBlaW5lbiBFSyBlbmRndWVsdGlnLiBBbiBkaWVzZW0gUHVua3Qgd2lyZCBkYXZvbiBhdWdlZ2FuZ2VuLCBkYXNzCisvLyBrZWluIFNwaWVsZXIgZGVuIEVLIG1laHIgZ2VzZXR6dCBoYXQhCitwcml2YXRlIHZvaWQgTGlxdWlkYXRlRUsoaW50IGJpdCkgeworCisgIGlmICghaW50cChiaXQpIHx8IGJpdCA8IDApIHJldHVybjsKKworICBzdHJpbmcgb2JuYW1lID0gYnlfbnVtW2JpdCwgQllOVU1fS0VZXTsKKyAgaW50IHNjb3JlID0gYnlfbnVtW2JpdCwgQllOVU1fU0NPUkVdOworCisgIGlmIChtZW1iZXIobnBjcywgb2JuYW1lKSAmJiAobnBjc1tvYm5hbWUsIE5QQ19OVU1CRVJdID09IGJpdCkpIHsKKyAgICBtX2RlbGV0ZShieV9udW0sIGJpdCk7CisgICAgbV9kZWxldGUobnBjcywgb2JuYW1lKTsKKyAgICBpZiAobWVtYmVyKHVuY29uZmlybWVkX3Njb3JlcyxiaXQpKQorICAgICAgbV9kZWxldGUodW5jb25maXJtZWRfc2NvcmVzLGJpdCk7CisgICAgYWN0aXZlX2VrcyA9IGNsZWFyX2JpdChhY3RpdmVfZWtzLGJpdCk7CisgICAgcmVtb3ZlVGlwKG9ibmFtZSk7CisgICAgZnJlZV9udW0gKz0gKHtiaXR9KTsKKyAgICB3cml0ZV9maWxlKFNDT1JFQVVUT0xPRyxzcHJpbnRmKAorICAgICJMSVFVSURBVEVFSzogJXMgJTVkIFNjb3JlICUzZCAlc1xuIiwKKyAgICBzdHJmdGltZSgiJWQlbSVZLSVUIix0aW1lKCkpLCBiaXQsIHNjb3JlLCBvYm5hbWUpKTsKKyAgfQorfQorCitwcml2YXRlIHZvaWQgY2hlY2tfcGxheWVyKHN0cmluZyBwbCkgeworICBpbnQgY2hhbmdlZCwgY2hhbmdlZDI7IAorICAKKyAgLy8gRUtzIHBydWVmZW4KKyAgc3RyaW5nIGVrcz0oc3RyaW5nKW1hc3RlcigpLT5xdWVyeV9layhwbCkgfHwgIiI7CisgIHN0cmluZyAqb3BmZXI9YWxsb2NhdGUoIChzaXplb2YoZWtzKSo2KSsxLCAiIik7CisgIGludCBwPS0xOworICB3aGlsZSAoKHA9bmV4dF9iaXQoZWtzLHApKSAhPSAtMSkgeworICAgIGlmICghbWVtYmVyKGJ5X251bSwgcCkpIHsKKyAgd3JpdGVfZmlsZShTQ09SRUNIRUNLRklMRSwgc3ByaW50ZigKKyAgICJVTktOT1dORUsgJXMgJTVkIGluICVzIGdlZnVuZGVuLlxuIiwgCisgICAgc3RyZnRpbWUoIiVkJW0lWS0lVCIsdGltZSgpKSwgcCwgcGwpKTsKKyAgICB9CisgICAgLy8gd2VubiBkYXMgYWt0dWVsbGUgQml0IGdlbG9lc2NodCB3ZXJkZW4gc29sbCwgYWxzbyBpbiB0b19iZV9yZW1vdmVkCisgICAgLy8gc3RlaHQuLi4KKyAgICBpZiAobWVtYmVyKHRvX2JlX3JlbW92ZWQscCkgIT0gLTEpIHsKKyAgZWtzID0gY2xlYXJfYml0KGVrcyxwKTsKKyAgY2hhbmdlZD0xOworICB3cml0ZV9maWxlKEVLQ0xFQU5MT0csc3ByaW50ZigKKyAgICAgICAgIkNMRUFSQklUOiAlcyAlTyAlNWQgJXNcbiIsCisgICAgICAgIHN0cmZ0aW1lKCIlZCVtJVktJVQiLHRpbWUoKSksIHBsLCBwLCAKKyAgICAgICAgYnlfbnVtW3AsQllOVU1fS0VZXSB8fCAiTm9OYW1lIikpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIC8vIHNvbnN0IHN0YXRpc3Rpa3BmbGVnZQorICAgICAgbnBjc1tieV9udW1bcCxCWU5VTV9LRVldLE5QQ19DT1VOVF0rKzsKKyAgICAgIC8vIGxvZ2dlbiwgd2VsY2hlIE5QQyBkZXIgU3BpZWxlciBoYXQKKyAgICAgIG9wZmVyW3BdPXRvX3N0cmluZyhwKTsKKyAgICB9CisgIH0KKyAgLy8gdW5kIG5vY2ggZGllIEVrLVRpcHMuLi4KKyAgc3RyaW5nIGVrdGlwcyA9IChzdHJpbmcpbWFzdGVyKCktPnF1ZXJ5X2VrdGlwcyhwbCkgfHwgIiI7CisgIHAgPSAtMTsKKyAgd2hpbGUgKChwPW5leHRfYml0KGVrdGlwcyxwKSkgIT0gLTEpIHsKKyAgICBpZiAoIW1lbWJlcihieV9udW0sIHApKSB7CisgIHdyaXRlX2ZpbGUoRUtDTEVBTkxPRywgc3ByaW50ZigKKyAgICAiVU5LTk9XTkVLICVzICU1ZCBpbiAlcyAoRUtUaXBzKSBnZWZ1bmRlbiAtIGNsZWFyaW5nLlxuIiwgCisgICAgc3RyZnRpbWUoIiVkJW0lWS0lVCIsdGltZSgpKSwgcCwgcGwpKTsKKyAgZWt0aXBzID0gY2xlYXJfYml0KGVrdGlwcywgcCk7IC8vIGhpZXIgZGlyZWt0IGxvZXNjaGVuLgorICBjaGFuZ2VkMiA9IDE7CisgICAgfQorICAgIC8vIHdlbm4gZGFzIGFrdHVlbGxlIEJpdCBnZWxvZXNjaHQgd2VyZGVuIHNvbGwsIGFsc28gaW4gdG9fYmVfcmVtb3ZlZAorICAgIC8vIHN0ZWh0Li4uCisgICAgZWxzZSBpZiAobWVtYmVyKHRvX2JlX3JlbW92ZWQscCkgIT0gLTEpIHsKKyAgZWt0aXBzID0gY2xlYXJfYml0KGVrdGlwcyxwKTsKKyAgY2hhbmdlZDI9MTsKKyAgd3JpdGVfZmlsZShFS0NMRUFOTE9HLHNwcmludGYoCisgICAgICAgICJDTEVBUkVLVElQOiAlcyAlTyAlNWQgJXNcbiIsCisgICAgICAgIHN0cmZ0aW1lKCIlZCVtJVktJVQiLHRpbWUoKSksIHBsLCBwLCAKKyAgICAgICAgYnlfbnVtW3AsQllOVU1fS0VZXSB8fCAiTm9OYW1lIikpOworICAgIH0KKyAgfQorCisgIGlmIChjaGFuZ2VkKSB7CisgICAgICBtYXN0ZXIoKS0+dXBkYXRlX2VrKHBsLCBla3MpOworICB9CisgIGlmIChjaGFuZ2VkMikgeworICAgICAgbWFzdGVyKCktPnVwZGF0ZV9la3RpcHMocGwsIGVrdGlwcyk7CisgIH0KKyAgb3BmZXItPSh7IiJ9KTsKKyAgd3JpdGVfZmlsZShXRVJLSUxMVFdFTixzcHJpbnRmKCIlc1xuJT0tNzhzXG5cbiIscGwsQ291bnRVcChvcGZlcil8fCIiKSk7Cit9CisKK3B1YmxpYyB2b2lkIGNoZWNrX2FsbF9wbGF5ZXIobWFwcGluZyBhbGxwbGF5ZXIpIHsKKyAKKyAgaWYgKGV4dGVybl9jYWxsKCkgJiYgIWFsbG93ZWQoKSkKKyAgICAgIHJldHVybjsKKworICBpZiAoIW1hcHBpbmdwKGFsbHBsYXllcikpIHsKKyAgICAgIGZvcmVhY2goc3RyaW5nIGtleTogbnBjcykgeworICBucGNzW2tleSxOUENfQ09VTlRdPTA7CisgICAgICB9CisgICAgICBhbGxwbGF5ZXI9KG1hcHBpbmcpbWFzdGVyKCktPmdldF9hbGxfcGxheWVycygpOworICAgICAgcm0oV0VSS0lMTFRXRU4pOworICAgICAgY2FsbF9vdXQoIydjaGVja19hbGxfcGxheWVyLDIsYWxscGxheWVyKTsKKyAgICAgIHJldHVybjsKKyAgfQorCisgIC8vIG9mZmVuYmFyIGZlcnRpZyBtaXQgYWxsZW4gU3BpZWxlcm4sIGpldHp0IG5vY2ggZGVuIFJlc3QgZXJsZWRpZ2VuLgorICBpZiAoIXNpemVvZihhbGxwbGF5ZXIpKSB7CisgICAgZm9yZWFjaChpbnQgYml0OiB0b19iZV9yZW1vdmVkKSB7CisgICAgICBMaXF1aWRhdGVFSyhiaXQpOworICAgIH0KKyAgICB0b19iZV9yZW1vdmVkPSh7fSk7CisgICAgc2F2ZV9vYmplY3QoU0NPUkVTQVZFRklMRSk7IAorICAgIFpERUJVRygiU3BpZWxlcmNoZWNrcyB1bmQgRUstTGlxdWlkYXRpb24gZmVydGlnLlxuIik7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RyaW5nIGRpcj1tX2luZGljZXMoYWxscGxheWVyKVswXTsKKyAgc3RyaW5nICpwbHM9YWxscGxheWVyW2Rpcl07CisgIGZvcmVhY2goc3RyaW5nIHBsOiBwbHMpIHsKKyAgICBpZiAoZ2V0X2V2YWxfY29zdCgpIDwgMTI1MDAwMCkKKyAgICAgIGJyZWFrOyAvLyBzcGFldGVyIHdlaXRlcm1hY2hlbi4KKyAgICBjYXRjaChjaGVja19wbGF5ZXIocGwpIDsgcHVibGlzaCk7CisgICAgcGxzLT0oe3BsfSk7CisgIH0KKyAgYWxscGxheWVyW2Rpcl0gPSBwbHM7IAorIAorICBpZiAoIXNpemVvZihhbGxwbGF5ZXJbZGlyXSkpCisgICAgbV9kZWxldGUoYWxscGxheWVyLGRpcik7CisgCisgIGNhbGxfb3V0KCMnY2hlY2tfYWxsX3BsYXllciwyLGFsbHBsYXllcik7Cit9CisKZGlmZiAtLWdpdCBhL3NlY3VyZS9zY29yZW1hc3Rlci5oIGIvc2VjdXJlL3Njb3JlbWFzdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAwY2Y1ZgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zY29yZW1hc3Rlci5oCkBAIC0wLDAgKzEsNTggQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBzY29yZW1hc3Rlci5oIC0tIERlZmluaXRpb25lbiBmdWVyIGRlbiBTY29yZU1hc3RlcgorLy8KKy8vICRJZDogc2NvcmVtYXN0ZXIuaCA2NjMzIDIwMDctMTItMDYgMjE6NDk6MDJaIFplc3N0cmEgJAorCisjaWZuZGVmIF9TQ09SRU1BU1RFUl9IXworI2RlZmluZSBfU0NPUkVNQVNURVJfSF8gMQorCisjZGVmaW5lIFNDT1JFTUFTVEVSICIvc2VjdXJlL3Njb3JlbWFzdGVyIgorCisjZGVmaW5lIFNDT1JFU0FWRUZJTEUgICAgIi9zZWN1cmUvQVJDSC9ucGNtYXN0ZXIiCisjZGVmaW5lIFNDT1JFRFVNUEZJTEUgICAgIi9zZWN1cmUvQVJDSC9TQ09SRVMuZHVtcCIKKyNkZWZpbmUgU0NPUkVMT0dGSUxFICAgICAiL3NlY3VyZS9BUkNIL1NDT1JFUy5MT0ciCisjZGVmaW5lIFNDT1JFQVVUT0xPRyAgICAgIi9zZWN1cmUvQVJDSC9TQ09SRVNfQVVUTy5MT0ciCisjZGVmaW5lIFNDT1JFQ0hFQ0tGSUxFICAgIi9zZWN1cmUvQVJDSC9TQ09SRVMua2FwdXR0IgorI2RlZmluZSBFS0NMRUFOTE9HICAgICAgICIvc2VjdXJlL0FSQ0gvRUtDTEVBTkVSLkxPRyIKKyNkZWZpbmUgV0VSS0lMTFRXRU4gICAgICAiL3NlY3VyZS9BUkNIL1dFUktJTExUV0VOLkxPRyIKKworLy8gd2VyIGlzdCBmdWVyIGRpZSBFS3MgYWt0dWVsbCB6dXN0YWVuZGlnPworI2RlZmluZSBTQ09SRU1BSU5UQUlORVJTICh7ImFyYXRob3JuIiwgInplc3N0cmEifSkKKworLy8gRWxlbWVudGUgZGVzIHZvbiBRdWVyeVNjb3JlKCkgenVydWVja2dlZ2ViZW5lbiBBcnJheXMKKyNkZWZpbmUgU0NPUkVfTlVNQkVSCTAgICAvLyAoQml0LSlOdW1tZXIgZGVzIE9iamVrdHMKKyNkZWZpbmUgU0NPUkVfU0NPUkUJMSAgIC8vIFphaGwgZGVyIFN0dWZlbnB1bmt0ZQorI2RlZmluZSBTQ09SRV9LRVkJMiAgIC8vIEZpbGVuYW1lIGRlcyBPYmtla3RzCisKKy8vIEluZGl6ZXMgZnVlciBkYXMgTWFwcGluZyBucGNzCisjZGVmaW5lIE5QQ19OVU1CRVIgICAgICAwICAgLy8gKEJpdC0pTnVtbWVyIGRlcyBFS3MKKyNkZWZpbmUgTlBDX1NDT1JFICAgICAgIDEgICAvLyBaYWhsIGRlciBTdHVmZW5wdW5rdGUKKyNkZWZpbmUgTlBDX0NPVU5UICAgICAgIDIgICAvLyB3aWUgb2Z0IGRlciBFSyB2ZXJnZWJlbiB3dXJkZQorLy8gSW5kaXplcyBmdWVyIGRhcyBNYXBwaW5nIGJ5X251bQorI2RlZmluZSBCWU5VTV9LRVkgICAgICAgMCAgIC8vIEZpbGVuYW1lIGRlcyBPYmpla3RzCisjZGVmaW5lIEJZTlVNX1NDT1JFICAgICAxICAgLy8gWmFobCBkZXIgU3R1ZmVucHVua3RlCisKKyNkZWZpbmUgU0NPUkVfSU5WQUxJRF9BUkcgICAtMQorI2RlZmluZSBTQ09SRV9OT19QRVJNSVNTSU9OIC0yCisKKyNkZWZpbmUgU0NPUkVfTE9XX01BUksJMjAwMDAwCisjZGVmaW5lIFNDT1JFX0hJR0hfTUFSSyA2MDAwMDAKKworI2RlZmluZSBQX05PX1NDT1JFICJub19zY29yZSIKKworLy8gbW9lZ2xpY2hlIFdlcnRlIGZ1ZXIgJ2ZsYWcnIGJlaSBUZXN0U2NvcmUoKQorI2RlZmluZSBTQ09SRV9LSUxMICAweDAxCisjZGVmaW5lIFNDT1JFX1FVRVNUIDB4MDIKKworI2RlZmluZSBFS19HSVZFTkxPRyh4KSBsb2dfZmlsZSgiQVJDSC9FS19HSVZFTiIsIFwKKyAgICAgICAgZHRpbWUodGltZSgpKSsiICIreCsiXG4iLDEwMDAwMCkKKworLy8gZWluIHBhYXIgZGVmaW5lcyBmdWVyIGVrdGlwcworI2RlZmluZSBFS1RJUFNfTUFYX1JFVFJZCQkxMAorLy8gb25lIHRpcCBwZXIgbGV2ZWwgaW4gbGlzdCwgYWJvdmUgdG9wIGVudHJ5IG9uZSB0aXAgZXZlcnkgbGV2ZWwKKyNkZWZpbmUgRUtUSVBTX0xFVkVMX0xJTUlUUyAJKHs2MCw2NSw3MCw3NCw3OCw4Miw4NSw4OCw5MSw5Myw5NSw5N30pCisjZGVmaW5lIEVLVElQR0lWRVIgIi9kL2ViZW5lL211YWRpYi9kcmFnb24vbnBjL2JydW1uaSIKKyNkZWZpbmUgRUtUSVBMSVNUICAiL2QvZWJlbmUvbXVhZGliL2RyYWdvbi9vYmovZWtsaXN0IgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaGFkb3dtYXN0ZXIuYyBiL3NlY3VyZS9zaGFkb3dtYXN0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWZkNTFkCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NoYWRvd21hc3Rlci5jCkBAIC0wLDAgKzEsMjYyIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvKiogXGZpbGUgL3NlY3VyZS9zaGFkb3dtYXN0ZXIuYworKiBPYmpla3QsIHdlbGNoZXMgZWluZSBMaXN0ZSBtaXQgYWt0aXZlbiBTaGFkb3dzIGhhdC4KKyogRGllIHNpbXVsX2VmdW4gc2hhZG93KCkgbWVsZGV0IGRhcyBiZXNjaGF0dGVuZGUgT2JqZWt0IGhpZXIgYW4uIE51ZXR6bGljaCwKKyogZGFtaXQgbWFuIGFscyBNYWdpZXIgZW5kbGljaCBtYWwgcmF1c2tyaWVnZW4ga2Fubiwgd2VsY2hlIFNoYWRvd3MgZXMKKyogZWlnZW50bGljaCBnaWJ0LgorKiBcYXV0aG9yIFplc3N0cmEKKyogXGRhdGUgMDcuMDguMjAwOQorKiBcdmVyc2lvbiAkSWQkCisqLworLyogQ2hhbmdlbG9nOgorKi8KKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIG5vX2luaGVyaXQKKyNwcmFnbWEgbm9fc2hhZG93CisjcHJhZ21hIHBlZGFudGljCisKKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisKKyNkZWZpbmUgSE9NRSh4KSAoX19QQVRIX18oMCkreCkKKworLyoqIHNoYWRvd3MgaXN0IGVpbiBtYXBwaW5nLCB3ZWxjaGVzIGFsbGUgU2NoYXR0ZW4gdW5kIGlocmUgT3BmZXIgZW50aGFlbHQuCisgKgorICogU3RydWt0dXI6IFNjaGF0dGVuIGFscyBTY2hsdWVzc2VsIChvYmplY3QpIHVuZCBCZXNjaGF0dGV0ZXIgKG9iamVjdCkgYWxzCisgKiBXZXJ0LgorKi8KK3ByaXZhdGUgbWFwcGluZyBzaGFkb3dzID0gKFtdKTsKKworI2lmbmRlZiBERUJVRworI2RlZmluZSBERUJVRyh4KSAgaWYgKGZpbmRfcGxheWVyKCJ6ZXNzdHJhIikpXAorICAgICAgICAgICAgdGVsbF9vYmplY3QoZmluZF9wbGF5ZXIoInplc3N0cmEiKSxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTTURCRzogIit4KyJcbiIpCisjZW5kaWYKKworI2RlZmluZSBNRU1PUlkgIi9zZWN1cmUvbWVtb3J5IgorCisjZGVmaW5lIFNIQURPV19PSyAgICAgICAgICAgICAxCisjZGVmaW5lIFNIQURPV19BQ0NFU1NfREVOSUVEIC0xCisjZGVmaW5lIFNIQURPV19FWElTVFMgICAgICAgIC0yCisjZGVmaW5lIFNIQURPV19VTktOT1dOICAgICAgIC0zCisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpIHsKKyAgbWl4ZWQgdG1wOworICBzZXRldWlkKGdldHVpZCgpKTsKKyAgaWYgKG1hcHBpbmdwKHRtcD1NRU1PUlktPkxvYWQoIlNjaGF0dGVuIikpKSB7CisgICAgc2hhZG93cyA9IHRtcDsKKyAgICBERUJVRygiRGF0ZW4gYXVzIE1FTU9SWSBnZWxhZGVuLlxuIik7CisgIH0KKyAgZWxzZSB7CisgICAgREVCVUcoIktlaW5lIERhdGVuIGluIE1FTU9SWSB2b3JoYW5kZW4gLSByZWluaXRpYWxpc2llcmUuXG4iKTsKKyAgICBpZiAoTUVNT1JZLT5TYXZlKCJTY2hhdHRlbiIsIHNoYWRvd3MpICE9IDEpCisgICAgICByYWlzZV9lcnJvcigiS29ubnRlIERhdGVuIG5pY2h0IGltIE1lbW9yeSBhYmxlZ2VuLlxuIik7CisgIH0KK30KKworLyoqIExpZWZlcnQgZWluZW4gU3RyaW5nIG1pdCBhbGxlbiBTY2hhdHRlbiB1bmQgYmVzY2hhdHRldGVuIE9iamVrdGVuIHp1cnVlY2suCisgICogQHJldHVybiBzdHJpbmcgLSBMaXN0ZSB2b24gU2NoYXR0ZW4gdW5kIE9wZmVybgorICAqLworcHVibGljIHZvaWQgRHVtcFNoYWRvd3MoKSB7CisgIGlmIChleHRlcm5fY2FsbCgpICYmICFFTERFUl9TRUNVUklUWSApIHJldHVybiAwOworCisgIHN0cmluZyByZXMgPSAiIjsKKyAgZm9yZWFjaChvYmplY3Qgc2NoYXR0ZW4sIG9iamVjdCBvcGZlcjogc2hhZG93cykKKyAgICBpZiAoc2NoYXR0ZW4gJiYgb3BmZXIpCisgICAgICByZXMgKz0gc3ByaW50ZigiJU8gLT4gJU9cbiIsc2NoYXR0ZW4sb3BmZXIpOworCisgIHByaW50ZigiRm9sZ2VuZGUgU2hhZG93cyBzaW5kIGJla2FubnQ6IFxuXG4lc1xuIiwgcmVzKTsKK30KKworLyoqIEZpbmRldCB6dSBlaW5lbSBiZXNjaGF0dGV0ZW4gT2JqZWt0IGRlbiB6dWdlaG9lcmlnZW4gU2NoYXR0ZW4uCisgIEBwYXJhbVtpbl0gb2JqZWN0IC0gZWluIGJlc2NoYXR0ZXRlcyBPYmpla3QuCisgIEByZXR1cm4gb2JqZWN0IC0gRGVuIFNjaGF0dGVuIG9kZXIgMC4KKyAgQHNhIEZpbmRTaGFkb3dzT2JqZWN0KCksIFF1ZXJ5T2JqZWN0KCksIFF1ZXJ5SW5mbygpCisqLworcHVibGljIG9iamVjdCBGaW5kU2hhZG93KG9iamVjdCBvcGZlcikgeworICBpZiAoIW9iamVjdHAob3BmZXIpKQorICAgIHJldHVybiAwOworCisgIGZvcmVhY2gob2JqZWN0IHNjaGF0dGVuLCBvYmplY3QgdmljdGltOiBzaGFkb3dzKSB7CisgICAgaWYgKG9wZmVyID09IHZpY3RpbSkKKyAgICAgIC8vIFNjaGF0dGVuIGdlZnVuZGVuLgorICAgICAgcmV0dXJuIHNjaGF0dGVuOworICB9CisgIHJldHVybiAwOworfQorCisvKiogRmluZGV0IHp1IGVpbmVtIFNjaGF0dGVuIGRhcyBiZXNjaGF0dGV0ZSBPYmpla3QuCisgIEBwYXJhbVtpbl0gb2JqZWN0IC0gZWluIGJlc2NoYXR0ZW5kZXMgT2JqZWt0LgorICBAcmV0dXJuIG9iamVjdCAtIERhcyBiZXNjaGF0dGV0ZSBPYmpla3Qgb2RlciAwLgorICBAc2EgRmluZFNoYWRvdygpLCBRdWVyeU9iamVjdCgpLCBRdWVyeUluZm8oKQorKi8KK3B1YmxpYyBvYmplY3QgRmluZFNoYWRvd2VkT2JqZWN0KG9iamVjdCBzY2hhdHRlbikgeworICByZXR1cm4gc2hhZG93c1tzY2hhdHRlbl07Cit9CisKKy8qKiBHaWJ0IFNjaGF0dGVuIHVuZCBCZXNjaGF0dGV0ZW4genVydWVjaywgZmFsbHMgb2IgZWluZXMgdm9uIGJlaWRlbiBpc3QuCisgIElzdCBvYiBlaW4gU2NoYXR0ZW4gb2RlciBlaW4gYmVzY2hhdHRldGVzIE9iamVrdCwgd2lyZCBlaW4gQXJyYXkgYXVzCisgIE9iamVrdGVuIGdlbGllZmVydC4gSGllcmJlaSB3ZXJkZW4gZ2dmLiBhbGxlIE9iamVrdGUgaW4gZGVyCisgIEJlc2NoYXR0dW5nc2hpZXJhcmNoaWUgZ2VsaWVmZXJ0LCB2b24gZGVyIG9iIEJlc3RhbmR0ZWlsIGlzdC4KKyAgQHBhcmFtW2luXSBvYmplY3QgLSBlaW4gT2JqZWt0LgorICBAcmV0dXJuIG9iamVjdCogLSAoe2EsIGIsIGMsIGR9KSBvZGVyIDAuCisgIEBzYSBGaW5kU2hhZG93KCksIEZpbmRTaGFkb3dlZE9iamVjdCwgUXVlcnlJbmZvKCkKKyovCitwdWJsaWMgb2JqZWN0KiBRdWVyeU9iamVjdChvYmplY3Qgb2IpIHsKKworICBpZiAoIW9iamVjdHAob2IpKSByZXR1cm4gMDsKKyAKKyAgb2JqZWN0ICpyZXMgPSAoe29ifSk7CisgIG9iamVjdCBzaCA9IEZpbmRTaGFkb3cob2IpOworCisgIHdoaWxlKHNoKSB7CisgICAgLy8gZXMgZ2lidCBlaW5lbiBTY2hhdHRlbiwgYWxzbyBLZXR0ZSBuYWNoIG9iZW4gdmVyZm9sZ2VuLgorICAgIHJlcyA9ICh7c2h9KSArIHJlczsKKyAgICBzaCA9IEZpbmRTaGFkb3coc2gpOworICB9CisKKyAgb2JqZWN0IHZpYyA9IEZpbmRTaGFkb3dlZE9iamVjdChvYik7CisgIHdoaWxlKHZpYykgeworICAgIC8vIGVzIGdpYnQgZWluIGJlc2NoYXR0ZXRlcyBPYmpla3QsIEtldHRlIG5hY2ggdW50ZW4gdmVyZm9sZ2VuLgorICAgIHJlcyA9IHJlcyArICh7dmljfSk7CisgICAgdmljID0gRmluZFNoYWRvd2VkT2JqZWN0KHZpYyk7CisgIH0KKworICBpZiAoc2l6ZW9mKHJlcykgPCAyKSB7CisgICAgLy8gT2ZmZW5iYXIgd2lyZCBvYiB3ZWRlciBiZXNjaGF0dGV0IG5vY2ggYmVzY2hhdHRldCBzZWxiZXIuCisgICAgLy8gTW9lZ2xpY2hlcndlaXNlIHd1cmRlIGplZG9jaCBkdXJjaCB3aWxkZSBaZXJzdG9lcnVuZyBkaWUgSGllcmFyY2hpZQorICAgIC8vIGdldHJlbm50LiBGYWxscyBvYiBuZW4gU2NoYXR0ZW4gaXN0LCBsYWVzc3Qgc2ljaCBkYXMgcmVwYXJpZXJlbi4gRmFsbHMKKyAgICAvLyBvYiBiZXNjaGF0dGV0IHdpcmQsIGhpbGZ0IGVpZ2VudGxpY2ggbnVyIGVpbiByZXNldCgpLiBEZW4gbW9lY2h0ZSBpY2gKKyAgICAvLyBoaWVyIGFiZXIgbmljaHQgbWFjaGVuLCB3ZWlscyB1LlUuIHRldWVyIHNlaW4ga29lbm50ZS4KKyAgICBpZiAocXVlcnlfc2hhZG93aW5nKG9iKSkgeworICAgICAgc2hhZG93c1tvYl0gPSBxdWVyeV9zaGFkb3dpbmcob2IpOworICAgICAgLy8gbm9jaG1hbC4KKyAgICAgIHJldHVybiBRdWVyeU9iamVjdChvYik7CisgICAgfQorICAgIC8vIHNjaGVpbmJhciBuaWNodC4KKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiByZXM7Cit9CisKKy8qKiBHaWJ0IGVpbmVuIFN0cmluZyBtaXQgSW5mb3MgdWViZXIgb2IgenVydWVjay4KKyAgSXN0IG9iIGVpbiBiZXNjaGF0dGV0ZXMgT2JqZWt0IG9kZXIgZWluIFNjaGF0dGVuLCB3aXJkIGVpbiBiZXNjaHJlaWJlbmRlcgorICBTdHJpbmcgenVydWVja2dlbGllZmVydCAoc2NoYXR0ZW4gLT4gYmVzY2hhdHRldGVzIE9iamVrdCkuIEhpZXJiZWkgd2lyZCBnZ2YuCisgIGRpZSBnZXNhbXRlIEJlc2NoYXR0dW5nc2hpZXJhcmNoaWUgYW5nZWdlYmVuIChhIC0+IGIgLT4gYyAtPiBkKS4KKyAgQHBhcmFtW2luXSBvYmplY3QgLSBlaW4gT2JqZWt0LgorICBAcmV0dXJuIHN0cmluZyAtIFN0cmluZyBtaXQgSW5mb3MgdWViZXIgb2IuCisgIEBzYSBGaW5kU2hhZG93KCksIEZpbmRTaGFkb3dlZE9iamVjdCgpLCBRdWVyeU9iamVjdCgpCisqLworcHVibGljIHN0cmluZyBRdWVyeUluZm8ob2JqZWN0IG9iKSB7CisgIG9iamVjdCAqc2hzID0gUXVlcnlPYmplY3Qob2IpOworICBpZiAoIXNocykgcmV0dXJuIDA7CisKKyAgcmV0dXJuIENvdW50VXAobWFwKHNocywgIydvYmplY3RfbmFtZSksICIgLT4gIiwgIiAtPiAiKTsKK30KKworLyoqIFJlZ2lzdHJpZXJ0IGVpbmVuIFNjaGF0dGVuIHVuZCBzZWluIE9wZmVyLgorICBSZWdpc3RyaWVydCBkZW4gU2NoYXR0ZW4gdW5kIHNlaW4gT3BmZXIuIFNvbGx0ZSBhdXNzY2hsaWVzc2xpY2ggZHVyY2ggZGllCisgIHNpbXVsX2VmdW4gb2RlciBzcGFyZV9zaW11bF9mdW4gZ2VydWZlbiB3ZXJkZW4uCisgIEBzYSBVbnJlZ2lzdGVyU2hhZG93KCkKKyovCitwdWJsaWMgaW50IFJlZ2lzdGVyU2hhZG93KG9iamVjdCBzY2hhdHRlbikgeworICBvYmplY3Qgb3BmZXI7CisKKyAgLy9ERUJVRyhzcHJpbnRmKCJbJU9dICVPXG4iLCBzY2hhdHRlbiwgY2FsbGVyX3N0YWNrKCkpKTsKKworICAvLyBJcmdlbmRlaW4gU2ljaGVyaGVpdHNjaGVjayBpc3QgZWlnZW50bGljaCBuaWNodCBub2V0aWcgaGllciwgZGEgZGFzIE9wZmVyCisgIC8vIG9obmVoaW4gcGVyIGVmdW4gZXJtaXR0ZWx0IHdpcmQgdW5kIGtlaW4gRWludHJhZyBlcmZvbGd0LCB3ZW5uIGtlaW4KKyAgLy8gYmVzY2hhdHRldGVzIE9iamVrdCB6dSBmaW5kZW4gaXN0LgorCisgIC8vIGRhcyB2b24gc2NoYXR0ZW4gYmVzY2hhdHRldGUgT2JqZWt0IGVybWl0dGVsbiAKKyAgaWYgKG9iamVjdHAob3BmZXI9cXVlcnlfc2hhZG93aW5nKHNjaGF0dGVuKSkpIHsKKyAgICBpZiAoc2hhZG93c1tzY2hhdHRlbl0gPT0gb3BmZXIpCisgICAgICByZXR1cm4gU0hBRE9XX0VYSVNUUzsKKworICAgIC8vIE5ldWVpbnRyYWcgb2RlciBnZ2YuIGF1Y2ggQWVuZGVybi4KKyAgICBzaGFkb3dzW3NjaGF0dGVuXSA9IG9wZmVyOworICAgIC8vREVCVUcoRHVtcFNoYWRvd3MoKSk7CisgICAgcmV0dXJuIFNIQURPV19PSzsKKyAgfQorICByZXR1cm4gU0hBRE9XX0FDQ0VTU19ERU5JRUQ7Cit9CisKKy8qKiBUcmFlZ3QgZWluZW4gU2NoYXR0ZW4gd2llZGVyIGF1cy4KKyAgRGVyIFNjaGF0dGVuIHdpcmQgd2llZGVyIGF1c2dldHJhZ2VuLiBTb2xsdGUgYXVzc2NobGllc3NsaWNoIGR1cmNoIGRpZQorICBzaW11bF9lZnVuIG9kZXIgc3BhcmVfc2ltdWxfZnVuIGdlcnVmZW4gd2VyZGVuLgorICBXZXJkZW4gU2NoYXR0ZW4gb2RlciBiZXNjaGF0dGV0ZSBPYmpla3RlIHplcnN0b2VydCBvaG5lIHZvcmhlciBkaWUKKyAgU2NoYXR0aWVydW5nIHp1IGJlZW5kZW4sIGZ1ZWhydCBkaWVzIHp1IElua29uc2lzdGVuemVuIHVuZCB6ZXJicm9jaGVuZW4KKyAgQmVzY2hhdHR1bmdzaGllcmFyY2hpZW4uCisgIEBzYSBSZWdpc3RlclNoYWRvdygpLCBVbnJlZ2lzdGVyT3BmZXIoKQorKi8KK3B1YmxpYyBpbnQgVW5yZWdpc3RlclNoYWRvdyhvYmplY3QgY2FsbGVyKSB7CisgIG9iamVjdCBzY2hhdHRlbiwgb3BmZXI7CisKKyAgLy8gRWluIFNpY2hlcmhlaXRzY2hlY2sgZnVlciBkZW4gQXVmcnVmIGlzdCBlaWdlbnRsaWNoIG5pY2h0IG5vZXRpZywgZGEgZWluCisgIC8vIEVpbnRyYWcgbnVyIGVudGZlcm50IHdpcmQsIHdlbm4gZGllIEJlc2NoYXR0dW5nIG5hY2h3ZWlzbGljaCBiZWVuZGV0CisgIC8vIHd1cmRlLgorCisgIC8vREVCVUcoc3ByaW50ZigiWyVPXSAlT1xuIiwgY2FsbGVyLCBjYWxsZXJfc3RhY2soKSkpOworICBpZiAoIW9iamVjdHAoY2FsbGVyKSkgcmV0dXJuIFNIQURPV19VTktOT1dOOworCisgIC8vIFNjaGF0dGVuIHVuZCBiZXNjaGF0dGV0ZW4gYXVzIGRlbiBsb2thbGVuIERhdGVuIGVybWl0dGVsbi4KKyAgaWYgKG1lbWJlcihzaGFkb3dzLCBjYWxsZXIpKSB7CisgICAgc2NoYXR0ZW4gPSBjYWxsZXI7CisgICAgb3BmZXIgPSBzaGFkb3dzW3NjaGF0dGVuXTsKKyAgfQorICBlbHNlIGlmIChvYmplY3RwKHNjaGF0dGVuID0gRmluZFNoYWRvdyhjYWxsZXIpKSkgeworICAgIG9wZmVyID0gY2FsbGVyOworICB9CisgIC8vIHdlbm4gbmljaHQgYmVrYW5udCwgaXN0IGpldHp0IGVoIEVuZGUuCisgIGlmICghc2NoYXR0ZW4pIHJldHVybiBTSEFET1dfVU5LTk9XTjsKKworICAvL0RFQlVHKHNwcmludGYoIiVPIC0+ICVPICglTywgJU8pXG4iLAorICAvLyAgICAgIHNjaGF0dGVuLCBvcGZlciwgY2FsbGVyLCBxdWVyeV9zaGFkb3dpbmcoc2NoYXR0ZW4pKSk7CisKKyAgLy8gU2NoYXR0aWVydW5nIHdpcmtsaWNoIGJlZW5kZXQ/IFdlbm4gbmljaHQgLT4gRW5kZQorICBpZiAob3BmZXIgJiYgcXVlcnlfc2hhZG93aW5nKHNjaGF0dGVuKSA9PSBvcGZlcikKKyAgICByZXR1cm4gU0hBRE9XX0FDQ0VTU19ERU5JRUQ7CisKKyAgLy8gd2FyIHNjaGF0dGVuIGluIGVpbmVyIEJlc2NoYXR0dW5nc2hpZXJhcmNoaWU/CisgIG9iamVjdCB1cCA9IEZpbmRTaGFkb3coc2NoYXR0ZW4pOworICBpZiAodXAgJiYgcXVlcnlfc2hhZG93aW5nKHVwKSA9PSBvcGZlcikgeworICAgIHNoYWRvd3NbdXBdID0gb3BmZXI7IC8vIEtldHRlIG5ldSB2ZXJsaW5rZW4KKyAgfQorCisgIC8vIGpldHp0IGthbm4gZ2Vsb2VzY2h0IHdlcmRlbi4KKyAgbV9kZWxldGUoc2hhZG93cyxzY2hhdHRlbik7CisgIHJldHVybiBTSEFET1dfT0s7Cit9CisKK3B1YmxpYyBpbnQgUmVzZXRBbGwoKSB7CisgIGlmICghQVJDSF9TRUNVUklUWSkgcmV0dXJuIFNIQURPV19BQ0NFU1NfREVOSUVEOworCisgIERFQlVHKCJSZXNldEFsbCgpIGNhbGxlZC5cbiIpOworCisgIHNoYWRvd3MgPSAoW10pOworCisgIGlmIChNRU1PUlktPlNhdmUoIlNjaGF0dGVuIiwgc2hhZG93cykgIT0gMSkKKyAgICByYWlzZV9lcnJvcigiS29ubnRlIERhdGVuIG5pY2h0IGltIE1lbW9yeSBhYmxlZ2VuLlxuIik7CisKKyAgcmV0dXJuIFNIQURPV19PSzsKK30KKworLyoqIFJhZXVtdCBkaWUgRGF0ZW4gdWViZXIgZGllIFNjaGF0dGVuIGF1Zi4KKyAgICBaZXJzdG9lcmVuIHNpY2ggYmVzY2hhdHRldGUgT2JqZWt0ZSwgd2VyZGVuIGRpZSBTY2hhdHRlbiBuaWNodAorICAgIGF1c2dldHJhZ2VuLCBkYWhlciB3aXJkIGRhcyB2b24gemVpdCB6dSB6ZWl0IGhpZXIgZ2VtYWNodC4KKyovCitwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgZm9yZWFjaChvYmplY3Qgc2NoYXR0ZW4sIG9iamVjdCBvcGZlcjogc2hhZG93cykgeworICAgIGlmICghb2JqZWN0cChvcGZlcikpIHsKKyAgICAgIC8vIHdhciBzY2hhdHRlbiBldnRsLiBpbiBlaW5lciBIaWVyYXJjaGllIHVuZCBiZXNjaGF0dGV0IGpldHp0IHdhcworICAgICAgLy8gYW5kZXJlcz8KKyAgICAgIGlmIChxdWVyeV9zaGFkb3dpbmcoc2NoYXR0ZW4pKQorICAgICAgICBzaGFkb3dzW3NjaGF0dGVuXSA9IHF1ZXJ5X3NoYWRvd2luZyhzY2hhdHRlbik7CisgICAgICBlbHNlCisgICAgICAgIG1fZGVsZXRlKHNoYWRvd3MsIHNjaGF0dGVuKTsKKyAgICB9CisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vUkVBRE1FIGIvc2VjdXJlL3NpbXVsX2VmdW4vUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMzQyOWEKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9SRUFETUUKQEAgLTAsMCArMSwyMCBAQAorc2ltdWxfZWZ1biAKKy0tLS0tLS0tLS0gCitEYXMgc2ltdWxfZWZ1biBPYmpla3QgL3NlY3VyZS9zaW11bF9lZnVuL3NpbXVsX2VmdW4gYmVudXR6dCBkaWUgRGF0ZWllbgoraW4gL3NlY3VyZS9zaW11bF9lZnVuLgorSW0gVmVyemVpY2huaXMgL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlIGlzdCBlaW5lIFNpY2hlcmhlaXRza29waWUgdm9uIGFsbGVuIAorRGF0ZWllbiBpbiAvc2VjdXJlL3NpbXVsX2VmdW4uCisKK0ZhbGxzIC9zZWN1cmUvc2ltdWxfZWZ1bi9zaW11bF9lZnVuLmMgbmljaHQgbGFkYmFyIGlzdCwgd2lyZCAKKy9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zaW11bF9lZnVuLmMgYWxzIEVyc2F0eiB2ZXJzdWNodC4gV2VubiBhdWNoIGRhcworbmljaHQgbGFkYmFyIGlzdCwgZXJmb2xndCBlaW4gU2h1dGRvd24gZGVzIE11ZHMuCisKK0JlaSBBZW5kZXJ1bmdlbiBzb2xsdGUgX3p1ZXJzdF8gZGllIG5vcm1hbGUgc2ltdWwgZWZ1biBlZGl0aWVydCB1bmQKK2Fuc2NobGllc3NlbmQgemVyc3RvZXJ0L2VudGxhZGVuIHdlcmRlbiwgd29yYXVmaGluIHNpZSBpbXBsaXppdCBkdXJjaCBkZW4KK0RyaXZlciB1bmQgTWFzdGVyIG5ldWdlbGFkZW4gd2lyZC4gSXN0IGRpZXMgZXJmb2xncmVpY2ggdW5kIGRpZSBuZXVlCitzaW11bF9lZnVuIGxhZXVmdCAoZXJzdCBkYW5uISkga29waWVydCBtYW4gZGllIERhdGVpZW4gYXVzIAorL3NlY3VyZS9zaW11bF9lZnVuIG5hY2ggL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlLgorCitEaWUgRGF0ZWllbiBoaWVyIHNpbmQgbWl0IEF1c25haG1lIGRlciBzaW11bF9lZnVuLmMgc2VsYnN0IF9uaWNodF8gZGF6dSAKK2dlZGFjaHQsIGdlbGFkZW4genUgd2VyZGVuLgorCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9jb21tLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9jb21tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk1Yjg1MgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL2NvbW0uYwpAQCAtMCwwICsxLDEyNCBAQAorI2luY2x1ZGUgPGxpdmluZy9jb21tLmg+CisKKy8vIFNlbmRldCBhbiBhbGxlIE9iamVrdGUgaW4gcm9vbSB1bmQgcm9vbSBzZWxiZXIgZHVyY2ggQXVmcnVmIHZvbgorLy8gUmVjZWl2ZU1zZygpLgordmFyYXJncyB2b2lkIHNlbmRfcm9vbShvYmplY3R8c3RyaW5nIHJvb20sIHN0cmluZyBtc2csIGludCBtc2dfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1zZ19hY3Rpb24sIHN0cmluZyBtc2dfcHJlZml4LCBvYmplY3QgKmV4Y2x1ZGUsCisgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCBvcmlnaW4pCit7CisgIGlmIChzdHJpbmdwKHJvb20pKQorICAgIHJvb209bG9hZF9vYmplY3Qocm9vbSk7CisKKyAgb3JpZ2luIHx8PSBwcmV2aW91c19vYmplY3QoKTsKKyAgb2JqZWN0ICpkZXN0ID0gZXhjbHVkZSA/IGFsbF9pbnZlbnRvcnkocm9vbSkgLSBleGNsdWRlIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbF9pbnZlbnRvcnkocm9vbSk7CisKKyAgZGVzdC0+UmVjZWl2ZU1zZyhtc2csIG1zZ190eXBlLCBtc2dfYWN0aW9uLCBtc2dfcHJlZml4LCBvcmlnaW4pOworfQorCitzdGF0aWMgaW50IF9zaG91dF9maWx0ZXIoIG9iamVjdCBvYiwgc3RyaW5nIHBhdCApCit7CisgICAgc3RyaW5nICppZ25vcmU7CisKKyAgICBpZiAoICFlbnZpcm9ubWVudChvYikgKQorICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIHNpemVvZiggcmVnZXhwKCAoeyBvYmplY3RfbmFtZSggZW52aXJvbm1lbnQob2IpICkgfSksIHBhdCApICk7Cit9CisKK3ZhcmFyZ3Mgdm9pZCBzaG91dCggc3RyaW5nIHMsIG1peGVkIHdoZXJlICl7CisgICAgb2JqZWN0ICp1OworICAgIHN0cmluZyAqcGZhZGU7CisKKyAgICBpZiAoICFzaXplb2YoIHUgPSB1c2VycygpIC0gKHsgdGhpc19wbGF5ZXIoKSB9KSApICkKKyAgICAgICByZXR1cm47CisKKyAgICBpZiAoICF3aGVyZSApCisgICAgICAgcGZhZGUgPSAoeyAiLyIgfSk7CisgICAgZWxzZSBpZiAoIGludHAod2hlcmUpICkKKyAgICAgICBwZmFkZSA9CisgICAgICAgICAgICh7IGltcGxvZGUoIGVmdW46OmV4cGxvZGUoIG9iamVjdF9uYW1lKCBlbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLyIgKVswLi4yXSwgIi8iICkgKyAiLyIgfSk7CisgICAgZWxzZSBpZiAoIHN0cmluZ3Aod2hlcmUpICkKKyAgICAgICBwZmFkZSA9ICh7IHdoZXJlIH0pOworICAgIGVsc2UKKyAgICAgICBwZmFkZSA9IHdoZXJlOworCisgICAgdSA9IGZpbHRlciggdSwgIl9zaG91dF9maWx0ZXIiLCBNRSwgaW1wbG9kZSggcGZhZGUsICJ8IiApICk7CisgICAgdS0+UmVjZWl2ZU1zZyhzLCBNVF9DT01NfE1UX0ZBUnxNU0dfRE9OVF9XUkFQfE1TR19ET05UX1NUT1JFLAorICAgICAgICAgICAgICAgICAgTUFfU0hPVVRfU0VGVU4sIDAsIHByZXZpb3VzX29iamVjdCgpKTsKK30KKworCisjaWYgX19WRVJTSU9OX18gPiAiMy4zLjcxOCIKKy8vIFRoaXMgc2VmdW4gcmVwbGFjZXMgdGhlIGRlcHJlY2F0ZWQgZWZ1biBjYXQoKS4KKyNkZWZpbmUgQ0FUX01BWF9MSU5FUyA1MAordmFyYXJncyBpbnQgY2F0KHN0cmluZyBmaWxlLCBpbnQgc3RhcnQsIGludCBudW0pCit7CisgICAgaWYgKGV4dGVybl9jYWxsKCkpCisgICAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisKKyAgICBpbnQgbW9yZTsKKworICAgIGlmIChudW0gPCAwIHx8ICF0aGlzX3BsYXllcigpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICghc3RhcnQpCisgICAgICAgIHN0YXJ0ID0gMTsKKworICAgIGlmICghbnVtIHx8IG51bSA+IENBVF9NQVhfTElORVMpIHsKKyAgICAgICAgbnVtID0gQ0FUX01BWF9MSU5FUzsKKyAgICAgICAgbW9yZSA9IHNpemVvZihyZWFkX2ZpbGUoZmlsZSwgc3RhcnQrbnVtLCAxKSk7CisgICAgfQorCisgICAgc3RyaW5nIHR4dCA9IHJlYWRfZmlsZShmaWxlLCBzdGFydCwgbnVtKTsKKyAgICBpZiAoIXR4dCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBlZnVuOjp0ZWxsX29iamVjdCh0aGlzX3BsYXllcigpLCB0eHQpOworCisgICAgaWYgKG1vcmUpCisgICAgICAgIGVmdW46OnRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksICIqKioqKlRSVU5DQVRFRCoqKipcbiIpOworCisgICAgcmV0dXJuIHNpemVvZih0eHQgJiAiXG4iKTsKK30KKyN1bmRlZiBDQVRfTUFYX0xJTkVTCisjZW5kaWYgLy8gX19WRVJTSU9OX18gPiAiMy4zLjcxOCIKKworI2lmIF9fVkVSU0lPTl9fID4gIjMuMy43MTkiCisvLyBUaGlzIHNlZnVuIHJlcGxhY2VzIHRoZSBkZXByZWNhdGVkIGVmdW4gdGFpbCgpLgorI2RlZmluZSBUQUlMX01BWF9CWVRFUyAxMDAwCit2YXJhcmdzIGludCB0YWlsKHN0cmluZyBmaWxlKQoreworICAgIGlmIChleHRlcm5fY2FsbCgpKQorICAgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworCisgICAgaWYgKCFzdHJpbmdwKGZpbGUpIHx8ICF0aGlzX3BsYXllcigpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHN0cmluZyB0eHQgPSByZWFkX2J5dGVzKGZpbGUsIC0oVEFJTF9NQVhfQllURVMgKyA4MCksIChUQUlMX01BWF9CWVRFUyArIDgwKSk7CisgICAgLy8gcmVhZF9ieXRlcygpIHJldHVybnMgMCBpZiB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24gZ2l2ZW4gYnkKKyAgICAvLyBwYXJhbWV0ZXIgIzIgbGllcyBiZXlvbmQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4KKyAgICAvLyBJbiB0aGlzIGNhc2Ugd2Ugc2ltcGx5IHRyeSBhbmQgcmVhZCB0aGUgZW50aXJlIGZpbGUuCisgICAgaWYgKCFzdHJpbmdwKHR4dCkgJiYgZmlsZV9zaXplKGZpbGUpIDwgVEFJTF9NQVhfQllURVMrODApCisgICAgICB0eHQgPSByZWFkX2ZpbGUoZmlsZSk7CisgICAgLy8gRXhpdCBpZiBzdGlsbCBub3RoaW5nIGNvdWxkIGJlIHJlYWQuCisgICAgaWYgKCFzdHJpbmdwKHR4dCkpCisgICAgICByZXR1cm4gMDsKKworICAgIC8vIGN1dCBvZmYgZmlyc3QgKGluY29tcGxldGUpIGxpbmUKKyAgICBpbnQgaW5kZXggPSBzdHJzdHIodHh0LCAiXG4iKTsKKyAgICBpZiAoaW5kZXggPiAtMSkgeworICAgICAgICBpZiAoaW5kZXggKyAxIDwgc2l6ZW9mKHR4dCkpCisgICAgICAgICAgICB0eHQgPSB0eHRbaW5kZXgrMS4uXTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdHh0ID0gIiI7CisgICAgfQorCisgICAgZWZ1bjo6dGVsbF9vYmplY3QodGhpc19wbGF5ZXIoKSwgdHh0KTsKKworICAgIHJldHVybiAxOworfQorI3VuZGVmIFRBSUxfTUFYX0JZVEVTCisjZW5kaWYgLy8gX19WRVJTSU9OX18gPiAiMy4zLjcxOSIKKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vZGVidWdfaW5mby5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vZGVidWdfaW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MDdjMmYKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9kZWJ1Z19pbmZvLmMKQEAgLTAsMCArMSw0MzQgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBkZWJ1Z19pbmZvKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKGRlYnVnX2luZm8pCisKKyNpbmNsdWRlIDxkcml2ZXJfaW5mby5oPgorI2luY2x1ZGUgPGRlYnVnX2luZm8uaD4KKworbWl4ZWQgZGVidWdfaW5mbyhpbnQgd2hhdCwgdmFyYXJncyBtaXhlZCogYXJncykKK3sKKyAgICBpZiAoc2l6ZW9mKGFyZ3MpID4gMikKKyAgICAgICAgcmFpc2VfZXJyb3IoIlRvbyBtYW55IGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKKworICAgIHN3aXRjaCh3aGF0KQorICAgIHsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIklsbGVnYWwgdmFsdWUgJWQgZm9yIGRlYnVnX2luZm8oKS5cbiIsIHdoYXQpKTsKKworICAgICAgICBjYXNlIERJTkZPX09CSkVDVDoKKyAgICAgICAgeworICAgICAgICAgICAgb2JqZWN0IG9iOworCisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpICE9IDEpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOworICAgICAgICAgICAgaWYgKCFvYmplY3RwKGFyZ3NbMF0pKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWcgYXJnIDIgdG8gZGVidWdfaW5mbygpLlxuIik7CisKKyAgICAgICAgICAgIG9iID0gYXJnc1swXTsKKyAgICAgICAgICAgIHByaW50ZigiT19IRUFSVF9CRUFUICAgICAgOiAlc1xuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9DX0hFQVJUX0JFQVQpICAgICAgID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICAgICAgICBwcmludGYoIk9fRU5BQkxFX0NPTU1BTkRTIDogJXNcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPQ19DT01NQU5EU19FTkFCTEVEKSA/ICJUUlVFIiA6ICJGQUxTRSIpOworICAgICAgICAgICAgcHJpbnRmKCJPX0NMT05FICAgICAgICAgICA6ICVzXG4iLCBlZnVuOjpjbG9uZXAob2IpICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgICAgICAgIHByaW50ZigiT19ERVNUUlVDVEVEICAgICAgOiBGQUxTRVxuIik7CisgICAgICAgICAgICBwcmludGYoIk9fU1dBUFBFRCAgICAgICAgIDogJXNcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TV0FQUEVEKSAgICAgICAgICA/ICJUUlVFIiA6ICJGQUxTRSIpOworICAgICAgICAgICAgcHJpbnRmKCJPX09OQ0VfSU5URVJBQ1RJVkU6ICVzXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT05DRV9JTlRFUkFDVElWRSkgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgICAgICAgIHByaW50ZigiT19SRVNFVF9TVEFURSAgICAgOiAlc1xuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1JFU0VUX1NUQVRFKSAgICAgID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICAgICAgICBwcmludGYoIk9fV0lMTF9DTEVBTl9VUCAgIDogJXNcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9XSUxMX0NMRUFOX1VQKSAgICA/ICJUUlVFIiA6ICJGQUxTRSIpOworICAgICAgICAgICAgcHJpbnRmKCJPX1JFUExBQ0VEICAgICAgICA6ICVzXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUkVQTEFDRUQpICAgICAgICAgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgICAgICAgIHByaW50ZigidGltZV9yZXNldCAgOiAlZFxuIiwgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05FWFRfUkVTRVRfVElNRSkpOworICAgICAgICAgICAgcHJpbnRmKCJ0aW1lX29mX3JlZiA6ICVkXG4iLCAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTEFTVF9SRUZfVElNRSkpOworICAgICAgICAgICAgcHJpbnRmKCJyZWYgICAgICAgICA6ICVkXG4iLCAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX1JFRlMpKTsKKworICAgICAgICAgICAgaW50IGd0aWNrcyA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9HSUdBVElDS1MpOworICAgICAgICAgICAgaWYoZ3RpY2tzKQorICAgICAgICAgICAgICAgIHByaW50ZigiZXZhbGNvc3QgICA6ICAlZCUwOWRcbiIsIGd0aWNrcywgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1RJQ0tTKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHJpbnRmKCJldmFsY29zdCAgIDogICVkXG4iLCAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9USUNLUykpOworCisgICAgICAgICAgICBwcmludGYoInN3YXBfbnVtICAgIDogJWRcbiIsICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TV0FQX05VTSkpOworICAgICAgICAgICAgcHJpbnRmKCJuYW1lICAgICAgICA6ICclcydcbiIsICAgICBlZnVuOjpvYmplY3RfbmFtZShvYikpOworICAgICAgICAgICAgcHJpbnRmKCJsb2FkX25hbWUgICA6ICclcydcbiIsICAgICBlZnVuOjpsb2FkX25hbWUob2IpKTsKKworICAgICAgICAgICAgb2JqZWN0IG5leHRfb2IgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX05FWFQpOworICAgICAgICAgICAgaWYgKG5leHRfb2IpCisgICAgICAgICAgICAgICAgcHJpbnRmKCJuZXh0X2FsbCAgICA6IE9CSiglcylcbiIsIGVmdW46Om9iamVjdF9uYW1lKG5leHRfb2IpKTsKKworICAgICAgICAgICAgb2JqZWN0IHByZXZfb2IgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX1BSRVYpOworICAgICAgICAgICAgaWYgKHByZXZfb2IpCisgICAgICAgICAgICAgICAgcHJpbnRmKCJQcmV2aW91cyBvYmplY3QgaW4gb2JqZWN0IGxpc3Q6IE9CSiglcylcbiIsIGVmdW46Om9iamVjdF9uYW1lKHByZXZfb2IpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwcmludGYoIlRoaXMgb2JqZWN0IGlzIHRoZSBoZWFkIG9mIHRoZSBvYmplY3QgbGlzdC5cbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIERJTkZPX01FTU9SWToKKyAgICAgICAgeworICAgICAgICAgICAgb2JqZWN0IG9iOworCisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpICE9IDEpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOworICAgICAgICAgICAgaWYgKCFvYmplY3RwKGFyZ3NbMF0pKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWcgYXJnIDIgdG8gZGVidWdfaW5mbygpLlxuIik7CisKKyAgICAgICAgICAgIG9iID0gYXJnc1swXTsKKworICAgICAgICAgICAgcHJpbnRmKCJwcm9ncmFtIHJlZidzICUzZFxuIiwgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUFJPR19SRUZTKSk7CisgICAgICAgICAgICBwcmludGYoIk5hbWU6ICclcydcbiIsICAgICAgICAgIGVmdW46OnByb2dyYW1fbmFtZShvYikpOworICAgICAgICAgICAgcHJpbnRmKCJwcm9ncmFtIHNpemUgICAgJTZkXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUFJPR19TSVpFKSk7CisgICAgICAgICAgICBwcmludGYoIm51bSBmdW5jJ3M6ICAlM2QgKCU0ZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fRlVOQ1RJT05TKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfRlVOQ1RJT05TKSk7CisgICAgICAgICAgICBwcmludGYoIm51bSB2YXJzOiAgICAlM2QgKCU0ZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fVkFSSUFCTEVTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfVkFSSUFCTEVTKSk7CisKKyAgICAgICAgICAgIHByaW50ZigibnVtIHN0cmluZ3M6ICUzZCAoJTRkKSA6IG92ZXJoZWFkICVkICsgZGF0YSAlZCAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX1NUUklOR1MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTKSArIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1NUUklOR1NfREFUQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1NUUklOR1MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTX0RBVEEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTX0RBVEFfVE9UQUwpKTsKKworICAgICAgICAgICAgcHJpbnRmKCJudW0gaW5oZXJpdHMgJTNkICglNGQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX0lOSEVSSVRFRCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX0lOSEVSSVRFRCkpOworCisgICAgICAgICAgICBwcmludGYoInRvdGFsIHNpemUgICAgICAlNmRcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9QUk9HX1NJWkVfVE9UQUwpKTsKKworICAgICAgICAgICAgcHJpbnRmKCJkYXRhIHNpemUgICAgICAgJTZkICglNmRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9EQVRBX1NJWkUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfREFUQV9TSVpFX1RPVEFMKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRElORk9fT0JKTElTVDoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSA9PSAwKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKKworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9iamVjdCAqIG9icyA9IGVmdW46Om9iamVjdHMoYXJnc1swXSwgMSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG9ic1swXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gZWZ1bjo6b2JqZWN0cyhhcmdzWzBdLCBhcmdzWzFdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBESU5GT19NQUxMT0M6CisgICAgICAgICAgICB3cml0ZShkZWJ1Z19pbmZvKERJTkZPX1NUQVRVUywgIm1hbGxvYyIpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRElORk9fU1RBVFVTOgorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgd2hpY2g7CisgICAgICAgICAgICBpbnQgb3B0OworCisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpID4gMSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7CisKKyAgICAgICAgICAgIGlmICghc2l6ZW9mKGFyZ3MpIHx8ICFhcmdzWzBdKQorICAgICAgICAgICAgICAgIHdoaWNoID0gIiI7CisgICAgICAgICAgICBlbHNlIGlmKHN0cmluZ3AoYXJnc1swXSkpCisgICAgICAgICAgICAgICAgd2hpY2ggPSBhcmdzWzBdOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWcgYXJnIDIgdG8gZGVidWdfaW5mbygpLlxuIik7CisKKyAgICAgICAgICAgIHN3aXRjaCh3aGljaCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlICIiOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9NRU1PUlk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAidGFibGVzIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfVEFCTEVTOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgInN3YXAiOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9TV0FQOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgIm1hbGxvYyI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX01BTExPQzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICJtYWxsb2MgZXh0c3RhdHMiOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9NQUxMT0NfRVhURU5ERUQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhvcHQpOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBESU5GT19EVU1QOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgb3B0OworCisgICAgICAgICAgICBpZiAoIXNpemVvZihhcmdzKSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7CisKKyAgICAgICAgICAgIGlmKCFzdHJpbmdwKGFyZ3NbMF0pKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWcgYXJnIDIgdG8gZGVidWdfaW5mbygpLlxuIik7CisKKyAgICAgICAgICAgIHN3aXRjaChhcmdzWzBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgIm9iamVjdHMiOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBERElfT0JKRUNUUzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICJkZXN0cnVjdGVkIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRERJX09CSkVDVFNfREVTVFJVQ1RFRDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICJvcGNvZGVzIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRERJX09QQ09ERVM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAibWVtb3J5IjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRERJX01FTU9SWTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJCYWQgYXJndW1lbnQgJyVzJyB0byBkZWJ1Z19pbmZvKERJTkZPX0RVTVApLlxuIiwgYXJnc1swXSkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGVmdW46OmR1bXBfZHJpdmVyX2luZm8ob3B0LCBhcmdzWzEuLjFdLi4uKTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRElORk9fREFUQToKKyAgICAgICAgeworICAgICAgICAgICAgbWl4ZWQgKiByZXN1bHQ7CisKKyAgICAgICAgICAgIGlmICghc2l6ZW9mKGFyZ3MpKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKKworICAgICAgICAgICAgaWYgKCFpbnRwKGFyZ3NbMF0pKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWcgYXJnIDIgdG8gZGVidWdfaW5mbygpLlxuIik7CisKKyAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgPT0gMiAmJiAhaW50cChhcmdzWzFdKSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAzIHRvIGRlYnVnX2luZm8oKS5cbiIpOworCisgICAgICAgICAgICBzd2l0Y2goYXJnc1swXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIERJRF9TVEFUVVM6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGFsbG9jYXRlKERJRF9TVEFUVVNfTUFYKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0FDVElPTlNdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fQUNUSU9OUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQUNUSU9OU19TSVpFXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfQUNUSU9OUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU0hBRE9XU10gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TSEFET1dTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TSEFET1dTX1NJWkVdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TSEFET1dTKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19TSVpFXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfT0JKRUNUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19TV0FQUEVEXSAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RTX1NXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfU1dBUF9TSVpFXSAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX09CSkVDVFNfU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19MSVNUXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RTX0lOX0xJU1QpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfTkVXTFlfREVTVF0gICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19ORVdMWV9ERVNUUlVDVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX0RFU1RSVUNURURdICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFNfREVTVFJVQ1RFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19QUk9DRVNTRURdICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RTX0xBU1RfUFJPQ0VTU0VEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX0FWR19QUk9DXSAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTE9BRF9BVkVSQUdFX1BST0NFU1NFRF9PQkpFQ1RTX1JFTEFUSVZFKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09UQUJMRV0gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19JTl9UQUJMRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT1RBQkxFX1NMT1RTXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RfVEFCTEVfU0xPVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09UQUJMRV9TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX09CSkVDVF9UQUJMRSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQkVBVF9PQkpTXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hCRUFUX0NBTExTXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSEVBUlRCRUFUX0FDVElWRV9DWUNMRVMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hCRUFUX0NBTExTX1RPVEFMXSAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSEVBUlRCRUFUX1RPVEFMX0NZQ0xFUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEJFQVRfU0xPVFNdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9IRUFSVEJFQVRTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQkVBVF9TSVpFXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9IRUFSVEJFQVRTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQkVBVF9QUk9DRVNTRURdICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVFNfTEFTVF9QUk9DRVNTRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hCRUFUX0FWR19QUk9DXSAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9MT0FEX0FWRVJBR0VfUFJPQ0VTU0VEX0hFQVJUQkVBVFNfUkVMQVRJVkUpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQ0FMTE9VVFNdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9DQUxMT1VUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQ0FMTE9VVF9TSVpFXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfQ0FMTE9VVFMpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQVJSQVlTXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9BUlJBWVMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0FSUkFZU19TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0FSUkFZUyk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9NQVBQSU5HU10gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01BUFBJTkdTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9NQVBQSU5HU19TSVpFXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9NQVBQSU5HUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSFlCUklEX01BUFBJTkdTXSAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NQVBQSU5HU19IWUJSSUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hBU0hfTUFQUElOR1NdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUFQUElOR1NfSEFTSCk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJVQ1RTXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUlVDVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUlVDVFNfU0laRV0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUlVDVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUlVDVF9UWVBFU10gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSVUNUX1RZUEVTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJVQ1RfVFlQRVNfU0laRV0gICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TVFJVQ1RfVFlQRVMpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUFJPR1NdICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9QUk9HUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUFJPR1NfU0laRV0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUFJPR1MpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUFJPR1NfU1dBUFBFRF0gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9QUk9HU19TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9QUk9HU19TV0FQX1NJWkVdICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9QUk9HU19TV0FQUEVEKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1VTRVJfUkVTRVJWRV0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9NRU1PUllfUkVTRVJWRV9VU0VSKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9NQVNURVJfUkVTRVJWRV0gICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTUVNT1JZX1JFU0VSVkVfTUFTVEVSKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TWVNURU1fUkVTRVJWRV0gICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTUVNT1JZX1JFU0VSVkVfU1lTVEVNKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0FERF9NRVNTQUdFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVTU0FHRVNfT1VUKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9QQUNLRVRTXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1BBQ0tFVFNfT1VUKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9QQUNLRVRfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9QQUNLRVRTX09VVCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUEFDS0VUU19JTl0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9QQUNLRVRTX0lOKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9QQUNLRVRfU0laRV9JTl0gICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9QQUNLRVRTX0lOKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0FQUExZXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fRlVOQ1RJT05fTkFNRV9DQUxMUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQVBQTFlfSElUU10gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9GVU5DVElPTl9OQU1FX0NBTExfSElUUyk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJJTkdTXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1ZJUlRVQUxfU1RSSU5HUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSSU5HX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1RSSU5HUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX1RBQkxFX1NJWkVdICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1RSSU5HX1RBQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfT1ZFUkhFQURdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TVFJJTkdfT1ZFUkhFQUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1VOVEFCTEVEXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HU19VTlRBQkxFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfVU5UQUJMRURfU0laRV0gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1RSSU5HU19VTlRBQkxFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfVEFCTEVEXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdTX1RBQkxFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfVEFCTEVEX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1RSSU5HU19UQUJMRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9TRUFSQ0hFU10gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX0xPT0tVUFNfQllfSU5ERVgpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9TRUFSQ0hMRU5dICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX0xPT0tVUF9TVEVQU19CWV9JTkRFWCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX1NFQVJDSEVTX0JZVkFMVUVdICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfTE9PS1VQU19CWV9WQUxVRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX1NFQVJDSExFTl9CWVZBTFVFXSA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfTE9PS1VQX1NURVBTX0JZX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfQ0hBSU5TXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9TTE9UU19VU0VEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfQURERURdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9TVFJJTkdTX0FEREVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfREVMRVRFRF0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9TVFJJTkdTX1JFTU9WRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9DT0xMSVNJT05TXSAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX0NPTExJU0lPTlMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9GT1VORF0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX0hJVFNfQllfSU5ERVgpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9GT1VORF9CWVZBTFVFXSAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX0hJVFNfQllfVkFMVUUpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUlhfQ0FDSEVEXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9SRUdFWCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUlhfVEFCTEVdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9SRUdFWF9UQUJMRV9TTE9UUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUlhfVEFCTEVfU0laRV0gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUkVHRVgpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1JYX1JFUVVFU1RTXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUkVHRVhfTE9PS1VQUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUlhfUkVRX0ZPVU5EXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9SRUdFWF9MT09LVVBfSElUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUlhfUkVRX0NPTExdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9SRUdFWF9MT09LVVBfQ09MTElTSU9OUyk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9NQl9GSUxFXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9CVUZGRVJfRklMRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfTUJfU1dBUF0gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfQlVGRkVSX1NXQVApOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQk9PVF9USU1FXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX0JPT1RfVElNRSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBESURfU1dBUDoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYWxsb2NhdGUoRElEX1NXQVBfTUFYKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1BST0dTXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUFJPR1NfU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfUFJPR19TSVpFXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUFJPR1NfU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfUFJPR19VTlNXQVBQRURdICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9QUk9HU19VTlNXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1BST0dfVV9TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1BST0dTX1VOU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfVkFSU10gICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RTX1NXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1ZBUl9TSVpFXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX09CSkVDVFNfU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfRlJFRV0gICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TV0FQX0JMT0NLU19GUkVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19GUkVFX1NJWkVdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TV0FQX0JMT0NLU19GUkVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19GSUxFX1NJWkVdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TV0FQX0JMT0NLUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfUkVVU0VEXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1dBUF9CTE9DS1NfUkVVU0VEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19TRUFSQ0hFU10gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NXQVBfQkxPQ0tTX1JFVVNFX0xPT0tVUFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1NFQVJDSF9MRU5dICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1dBUF9CTE9DS1NfUkVVU0VfTE9PS1VQX1NURVBTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19GX1NFQVJDSEVTXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NXQVBfQkxPQ0tTX0ZSRUVfTE9PS1VQUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfRl9TRUFSQ0hfTEVOXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TV0FQX0JMT0NLU19GUkVFX0xPT0tVUF9TVEVQUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfQ09NUEFDVF0gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERDX1NXQVBfQ09NUEFDVF9NT0RFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19SRUNZQ0xFX0ZSRUVdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU1dBUF9SRUNZQ0xFX1BIQVNFKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIERJRF9NRU1PUlk6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGFsbG9jYXRlKERJRF9NRU1PUllfTUFYKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9OQU1FXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9NRU1PUllfQUxMT0NBVE9SX05BTUUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9TQlJLXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1lTX0FMTE9DQVRFRF9CTE9DS1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9TQlJLX1NJWkVdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NZU19BTExPQ0FURURfQkxPQ0tTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTEFSR0VdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0xBUkdFX0JMT0NLU19BTExPQ0FURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9MQVJHRV9TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0xBUkdFX0JMT0NLU19BTExPQ0FURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9MRlJFRV0gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTEFSR0VfQkxPQ0tTX0ZSRUUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9MRlJFRV9TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0xBUkdFX0JMT0NLU19GUkVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTFdBU1RFRF0gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0xBUkdFX0JMT0NLU19XQVNURSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0xXQVNURURfU0laRV0gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTEFSR0VfQkxPQ0tTX1dBU1RFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fQ0hVTktdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NNQUxMX0JMT0NLX0NIVU5LUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0NIVU5LX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU01BTExfQkxPQ0tfQ0hVTktTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU01BTExdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NNQUxMX0JMT0NLU19BTExPQ0FURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9TTUFMTF9TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NNQUxMX0JMT0NLU19BTExPQ0FURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9TRlJFRV0gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU01BTExfQkxPQ0tTX0ZSRUUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9TRlJFRV9TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NNQUxMX0JMT0NLU19GUkVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU1dBU1RFRF0gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NNQUxMX0JMT0NLU19XQVNURSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NXQVNURURfU0laRV0gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU01BTExfQkxPQ0tTX1dBU1RFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTUlOQ19DQUxMU10gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0lOQ1JFTUVOVF9TSVpFX0NBTExTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTUlOQ19TVUNDRVNTXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0lOQ1JFTUVOVF9TSVpFX0NBTExfU1VDQ0VTU0VTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTUlOQ19TSVpFXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9JTkNSRU1FTlRfU0laRV9DQUxMX0RJRkZTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fUEVSTV0gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1VOTUFOQUdFRF9CTE9DS1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9QRVJNX1NJWkVdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1VOTUFOQUdFRF9CTE9DS1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9DTElCXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUkVQTEFDRU1FTlRfTUFMTE9DX0NBTExTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fQ0xJQl9TSVpFXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9SRVBMQUNFTUVOVF9NQUxMT0NfQ0FMTFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9PVkVSSEVBRF0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NNQUxMX0JMT0NLX09WRVJIRUFEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fQUxMT0NBVEVEXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9NRU1PUllfVVNFRCkgKyBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX01FTU9SWV9PVkVSSEVBRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1VTRURdICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTUVNT1JZX1VTRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9UT1RBTF9VTlVTRURdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX01FTU9SWV9VTlVTRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9ERUZSQUdfQ0FMTFNdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVNT1JZX0RFRlJBR01FTlRBVElPTl9DQUxMU19GVUxMKSArIGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRU1PUllfREVGUkFHTUVOVEFUSU9OX0NBTExTX1RBUkdFVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fREVGUkFHX0NBTExTX1JFUV0gICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQ0FMTFNfVEFSR0VURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9ERUZSQUdfUkVRX1NVQ0NFU1NdICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVNT1JZX0RFRlJBR01FTlRBVElPTl9DQUxMX1RBUkdFVF9ISVRTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fREVGUkFHX0JMT0NLU19JTlNQRUNURURdID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQkxPQ0tTX0lOU1BFQ1RFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0RFRlJBR19CTE9DS1NfTUVSR0VEXSA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRU1PUllfREVGUkFHTUVOVEFUSU9OX0JMT0NLU19NRVJHRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9ERUZSQUdfQkxPQ0tTX1JFU1VMVF0gPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVNT1JZX0RFRlJBR01FTlRBVElPTl9CTE9DS1NfUkVTVUxUSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fQVZMX05PREVTXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0ZSRUVfQkxPQ0tTX0FWTF9OT0RFUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0VYVF9TVEFUSVNUSUNTXSAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX01FTU9SWV9FWFRFTkRFRF9TVEFUSVNUSUNTKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgPT0gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaWR4ID0gYXJnc1swXTsKKyAgICAgICAgICAgICAgICBpZiAoaWR4IDwgMCB8fCBpZHggPj0gc2l6ZW9mKHJlc3VsdCkpCisgICAgICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIklsbGVnYWwgaW5kZXggZm9yIGRlYnVnX2luZm8oKTogJWQsIGV4cGVjdGVkIDAuLiVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaWR4LCBzaXplb2YocmVzdWx0KS0xKSk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0W2lkeF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRElORk9fVFJBQ0U6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB3aGljaCA9IERJVF9DVVJSRU5UOworCisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpID4gMSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7CisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghaW50cChhcmdzWzBdKSkKKyAgICAgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZyBhcmcgMiB0byBkZWJ1Z19pbmZvKCkuXG4iKTsKKyAgICAgICAgICAgICAgICB3aGljaCA9IGFyZ3NbMF07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAod2hpY2gpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBESVRfQ1VSUkVOVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKERJX1RSQUNFX0NVUlJFTlQpOworCisgICAgICAgICAgICAgICAgY2FzZSBESVRfRVJST1I6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9UUkFDRV9MQVNUX0VSUk9SKSB8fCAoeyAiTm8gdHJhY2UuIiB9KTsKKworICAgICAgICAgICAgICAgIGNhc2UgRElUX1VOQ0FVR0hUX0VSUk9SOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfVFJBQ0VfTEFTVF9VTkNBVUdIVF9FUlJPUikgfHwgKHsgIk5vIHRyYWNlLiIgfSk7CisKKyAgICAgICAgICAgICAgICBjYXNlIERJVF9TVFJfQ1VSUkVOVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKERJX1RSQUNFX0NVUlJFTlRfQVNfU1RSSU5HKTsKKworICAgICAgICAgICAgICAgIGNhc2UgRElUX0NVUlJFTlRfREVQVEg6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9UUkFDRV9DVVJSRU5UX0RFUFRIKTsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgYXJnIDIgdG8gZGVidWdfaW5mbygpLlxuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRElORk9fRVZBTF9OVU1CRVI6CisgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfRVZBTF9OVU1CRVIpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9lbmFibGVfY29tbWFuZHMuYyBiL3NlY3VyZS9zaW11bF9lZnVuL2VuYWJsZV9jb21tYW5kcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMWM5NjMKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9lbmFibGVfY29tbWFuZHMuYwpAQCAtMCwwICsxLDMwIEBACisvKiBUaGVzZSBzZWZ1bnMgYXJlIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW5zIGVuYWJsZV9jb21tYW5kcygpCisgKiBhbmQgZGlzYWJsZV9jb21tYW5kcygpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZ3VyYXRpb24uaD4KKworI2lmICEgX19FRlVOX0RFRklORURfXyhlbmFibGVfY29tbWFuZHMpCisKK3ZvaWQgZW5hYmxlX2NvbW1hbmRzKCkKK3sKKyAgICBvYmplY3Qgb2IgPSBlZnVuOjpwcmV2aW91c19vYmplY3QoKTsKKworICAgIGVmdW46OmNvbmZpZ3VyZV9vYmplY3Qob2IsIE9DX0NPTU1BTkRTX0VOQUJMRUQsIDEpOworICAgIGVmdW46OnNldF90aGlzX3BsYXllcihvYik7Cit9CisKKyNlbmRpZgorCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKGRpc2FibGVfY29tbWFuZHMpCisKK3ZvaWQgZGlzYWJsZV9jb21tYW5kcygpCit7CisgICAgb2JqZWN0IG9iID0gZWZ1bjo6cHJldmlvdXNfb2JqZWN0KCk7CisKKyAgICBlZnVuOjpjb25maWd1cmVfb2JqZWN0KG9iLCBPQ19DT01NQU5EU19FTkFCTEVELCAwKTsKKyAgICBlZnVuOjpzZXRfdGhpc19wbGF5ZXIoMCk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vaGFzaC5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vaGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYmJmNjAKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9oYXNoLmMKQEAgLTAsMCArMSwxNyBAQAorI2luY2x1ZGUgIi9zeXMvdGxzLmgiCisKK2RlcHJlY2F0ZWQgc3RyaW5nIG1kNShtaXhlZCBhcmcsIHZhcmFyZ3MgbWl4ZWQqIGl0ZXJhdGlvbnMpCit7CisgICAgaWYgKGV4dGVybl9jYWxsKCkpCisgICAgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworCisgICAgcmV0dXJuIGhhc2goVExTX0hBU0hfTUQ1LCBhcmcsIGl0ZXJhdGlvbnMuLi4pOworfQorCitkZXByZWNhdGVkIHN0cmluZyBzaGExKG1peGVkIGFyZywgdmFyYXJncyBtaXhlZCogaXRlcmF0aW9ucykKK3sKKyAgICBpZiAoZXh0ZXJuX2NhbGwoKSkKKyAgICAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisKKyAgICByZXR1cm4gaGFzaChUTFNfSEFTSF9TSEExLCBhcmcsIGl0ZXJhdGlvbnMuLi4pOworfQpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vbGl2aW5ncy5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vbGl2aW5ncy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MGZjZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9saXZpbmdzLmMKQEAgLTAsMCArMSwzNDggQEAKKy8vICogbGl2aW5nX25hbWUtQmVoYW5kbHVuZworCisjZGVmaW5lIGNsZWFuX2xvZyhzKQorLy8jZGVmaW5lIGNsZWFuX2xvZyhzKSBsb2dfZmlsZSgiQ0xFQU5fU0lNIixjdGltZSh0aW1lKCkpWzQuLjE4XSsiOiAiKyhzKSk7CisKK3ByaXZhdGUgbm9zYXZlIG1hcHBpbmcgbGl2aW5nX25hbWVfbSwgbmFtZV9saXZpbmdfbSwgbmV0ZGVhZDsKKworcHJpdmF0ZSB2b2lkIEluaXRMaXZpbmdEYXRhKG1peGVkIHdpemluZm8pIHsKKyAgLy8gbGl2aW5nX25hbWUgaXN0IGVpbiBQb2ludGVyIGRlciBhdWNoIGluIGRlciBleHRyYV93aXppbmZvIGdlaGFsdGVuIAorICAvLyB3aXJkLCBzbyBrYW5uIGRpZSBzaW11bF9lZnVuIG5ldSBnZWxhZGVuIHdlcmRlbiwgb2huZSBkYXNzIGRpZXNlcworICAvLyBNYXBwaW5nIHZlcmxvcmVuIGdlaHQKKyAgaWYgKCFtYXBwaW5ncChsaXZpbmdfbmFtZV9tID0gd2l6aW5mb1tMSVZJTkdfTkFNRV0pKQorICAgIGxpdmluZ19uYW1lX20gPSB3aXppbmZvW0xJVklOR19OQU1FXSA9IG1fYWxsb2NhdGUoMCwgMSk7CisKKyAgLy8gR2xlaWNoZXMgZ2lsdCBmdWVyIGRhcyBNYXBwaW5nIE5hbWUtTGl2aW5nCisgIGlmICghbWFwcGluZ3AobmFtZV9saXZpbmdfbSA9IHdpemluZm9bTkFNRV9MSVZJTkddKSkKKyAgICBuYW1lX2xpdmluZ19tID0gd2l6aW5mb1tOQU1FX0xJVklOR10gPSBtX2FsbG9jYXRlKDAsIDEpOworCisgIC8vIE5ldHp0b3RlIHNpbmQgZWJlbmZhbGxzIGluIGRlciBleHRyYV93aXppbmZvCisgIGlmICghbWFwcGluZ3AobmV0ZGVhZCA9IHdpemluZm9bTkVUREVBRF9NQVBdKSkKKyAgICBuZXRkZWFkID0gd2l6aW5mb1tORVRERUFEX01BUF0gPSAoW10pOworfQorCitwdWJsaWMgdmFyYXJncyBzdHJpbmcgZ2V0dXVpZCggb2JqZWN0IG9iICkKK3sKKyAgICBtaXhlZCAqcmV0OworCisgICAgaWYgKCAhb2JqZWN0cChvYikgKQorICAgICAgIG9iID0gcHJldmlvdXNfb2JqZWN0KCk7CisKKyAgICBpZiAoICFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iKSApCisgICAgICAgcmV0dXJuIGdldHVpZChvYik7CisKKyAgICByZXQgPSAobWl4ZWQpbWFzdGVyKCktPmdldF91c2VyaW5mbyggZ2V0dWlkKG9iKSApOworCisgICAgaWYgKCAhcG9pbnRlcnAocmV0KSB8fCBzaXplb2YocmV0KSA8IDUgKQorICAgICAgIHJldHVybiBnZXR1aWQob2IpOworCisgICAgLy8gVXNlcm5hbWUgKyAiXyIgKyBDcmVhdGlvbkRhdGUKKyAgICByZXR1cm4gcmV0WzBdICsgIl8iICsgcmV0WzVdOworfQorCit2b2lkIHNldF9vYmplY3RfbGl2aW5nX25hbWUoc3RyaW5nIGxpdm5hbWUsIG9iamVjdCBvYmopCit7CisgIHN0cmluZyBvbGQ7CisgIG1peGVkIGE7CisgIGludCBpOworCisgIGlmIChwcmV2aW91c19vYmplY3QoKT09b2JqIHx8IHByZXZpb3VzX29iamVjdCgpPT10aGlzX29iamVjdCgpIHx8CisgICAgICBwcmV2aW91c19vYmplY3QoKT09bWFzdGVyKCkpCisgIHsKKyAgICBpZighbGl2bmFtZSB8fCAhc3RyaW5ncChsaXZuYW1lKSkgeworICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIiVPOiBpbGxlZ2FsIGxpdmluZyBuYW1lOiAlT1xuIiwgb2JqLCBsaXZuYW1lKSk7CisgICAgfQorICAgIGlmIChvbGQgPSBsaXZpbmdfbmFtZV9tW29ial0pIHsKKyAgICAgIGlmIChwb2ludGVycChhID0gbmFtZV9saXZpbmdfbVtvbGRdKSkgeworICAgICAgIGFbbWVtYmVyKGEsIG9iaildID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgbV9kZWxldGUobmFtZV9saXZpbmdfbSwgb2xkKTsKKyAgICAgIH0KKyAgICB9CisgICAgbGl2aW5nX25hbWVfbVtvYmpdID0gbGl2bmFtZTsKKyAgICBpZiAoYSA9IG5hbWVfbGl2aW5nX21bbGl2bmFtZV0pIHsKKyAgICAgIGlmICghcG9pbnRlcnAoYSkpIHsKKyAgICAgICBuYW1lX2xpdmluZ19tW2xpdm5hbWVdID0gKHthLCBvYmp9KTsKKyAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICAvKiBUcnkgdG8gcmVhbGxvY2F0ZSBlbnRyeSBmcm9tIGRlc3RydWN0ZWQgb2JqZWN0ICovCisgICAgICBpZiAoKGkgPSBtZW1iZXIoYSwgMCkpID49IDApIHsKKyAgICAgICBhW2ldID0gb2JqOworICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIG5hbWVfbGl2aW5nX21bbGl2bmFtZV0gPSBhICsgKHtvYmp9KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgbmFtZV9saXZpbmdfbVtsaXZuYW1lXSA9IG9iajsKKyAgfQorfQorCit2b2lkIHNldF9saXZpbmdfbmFtZShzdHJpbmcgbGl2bmFtZSkKK3sKKyAgc2V0X29iamVjdF9saXZpbmdfbmFtZShsaXZuYW1lLHByZXZpb3VzX29iamVjdCgpKTsKK30KKwordm9pZCByZW1vdmVfbGl2aW5nX25hbWUoKQoreworICBzdHJpbmcgbGl2bmFtZTsKKworICBpZiAoIXByZXZpb3VzX29iamVjdCgpKQorICAgIHJldHVybjsKKyAgaWYgKGxpdm5hbWU9bGl2aW5nX25hbWVfbVtwcmV2aW91c19vYmplY3QoKV0pCisgIHsKKyAgICBtX2RlbGV0ZShsaXZpbmdfbmFtZV9tLHByZXZpb3VzX29iamVjdCgpKTsKKyAgICBpZiAob2JqZWN0cChuYW1lX2xpdmluZ19tW2xpdm5hbWVdKSkKKyAgICB7CisgICAgICBpZiAobmFtZV9saXZpbmdfbVtsaXZuYW1lXT09cHJldmlvdXNfb2JqZWN0KCkpCisgICAgICAgbV9kZWxldGUobmFtZV9saXZpbmdfbSxsaXZuYW1lKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHBvaW50ZXJwKG5hbWVfbGl2aW5nX21bbGl2bmFtZV0pKQorICAgIHsKKyAgICAgIG5hbWVfbGl2aW5nX21bbGl2bmFtZV0tPSh7cHJldmlvdXNfb2JqZWN0KCl9KTsKKyAgICAgIGlmICghc2l6ZW9mKG5hbWVfbGl2aW5nX21bbGl2bmFtZV0pKQorICAgICAgIG1fZGVsZXRlKG5hbWVfbGl2aW5nX20sbGl2bmFtZSk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgX3NldF9uZXRkZWFkKCkKK3sKKyAgaWYgKHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUocHJldmlvdXNfb2JqZWN0KCkpKQorICAgIG5ldGRlYWRbZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKV09cHJldmlvdXNfb2JqZWN0KCk7Cit9CisKK3ZvaWQgX3JlbW92ZV9uZXRkZWFkKCkKK3sKKyAgbV9kZWxldGUobmV0ZGVhZCxnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpKTsKK30KKworb2JqZWN0IGZpbmRfbmV0ZGVhZChzdHJpbmcgdXVpZCkKK3sKKyAgaW50IGk7CisgIHN0cmluZyB1aWQ7CisgIC8vIFdlbm4gc3NjYW5mKCkgMiBsaWVmZXJ0LCBpc3QgdXVpZCBhdWNoIG5lIHV1aWQuCisgIGludCBpc191dWlkID0gc3NjYW5mKHV1aWQsICIlc18lZCIsIHVpZCwgaSkgPT0gMjsKKyAgaWYgKCFpc191dWlkKQorICAgIHVpZCA9IHV1aWQ7CisgCisgIGlmIChpc191dWlkICYmIGdldHV1aWQobmV0ZGVhZFt1aWRdKSAhPSB1dWlkKQorICAgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIG5ldGRlYWRbdWlkXTsKK30KKworc3RyaW5nICpkdW1wX25ldGRlYWQoKQoreworICByZXR1cm4gbV9pbmRpY2VzKG5ldGRlYWQpOworfQorCitvYmplY3QgZmluZF9saXZpbmcoc3RyaW5nIGxpdm5hbWUpIHsKKyAgbWl4ZWQgKmEsIHI7CisgIGludCBpOworCisgIGlmIChwb2ludGVycChyID0gbmFtZV9saXZpbmdfbVtsaXZuYW1lXSkpIHsKKyAgICBpZiAobWVtYmVyKHIsMCk+PTApCisgICAgICByLT0oezB9KTsKKyAgICBpZiAoIXNpemVvZihyKSl7CisgICAgICBtX2RlbGV0ZShuYW1lX2xpdmluZ19tLGxpdm5hbWUpOworICAgICAgY2xlYW5fbG9nKHNwcmludGYoImZpbmRfbGl2aW5nIGxvZXNjaHQgJXNcbiIsbGl2bmFtZSkpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICggIWxpdmluZyhyID0gKGEgPSByKVswXSkpIHsKKyAgICAgIGZvciAoaSA9IHNpemVvZihhKTsgLS1pOykgeworICAgICAgIGlmIChsaXZpbmcoYVs8aV0pKSB7CisgICAgICAgICByID0gYVs8aV07CisgICAgICAgICBhWzxpXSA9IGFbMF07CisgICAgICAgICByZXR1cm4gYVswXSA9IHI7CisgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcjsKKyAgfQorICByZXR1cm4gbGl2aW5nKHIpICYmIHI7Cit9CisKK29iamVjdCAqZmluZF9saXZpbmdzKHN0cmluZyBsaXZuYW1lKQoreworICBtaXhlZCByOworCisgIGlmIChwb2ludGVycChyPW5hbWVfbGl2aW5nX21bbGl2bmFtZV0pKQorICAgIHItPSh7MH0pOworICBlbHNlCisgICAgaWYgKG9iamVjdHAocikpCisgICAgICByPSh7cn0pOworICBpZiAoIXBvaW50ZXJwKHIpfHwhc2l6ZW9mKHIpKQorICAgIHJldHVybiAwOworICByZXR1cm4gcjsKK30KKworb2JqZWN0IGZpbmRfcGxheWVyKHN0cmluZyB1dWlkKSB7CisgIG9iamVjdCAqb2JqczsKKyAgbWl4ZWQgcmVzOworICBpbnQgaTsKKyAgc3RyaW5nIHVpZDsKKworICBpZiAoIXN0cmluZ3AodXVpZCkpCisgICAgcmV0dXJuIDA7CisgIC8vIFdlbm4gc3NjYW5mKCkgMiBsaWVmZXJ0LCBpc3QgdXVpZCBhdWNoIG5lIHV1aWQuCisgIGludCBpc191dWlkID0gc3NjYW5mKHV1aWQsICIlc18lZCIsIHVpZCwgaSkgPT0gMjsKKyAgaWYgKCFpc191dWlkKQorICAgIHVpZCA9IHV1aWQ7CisKKyAgaWYgKHBvaW50ZXJwKHJlcyA9IG5hbWVfbGl2aW5nX21bdWlkXSkpIHsKKyAgICAvLyB6ZXJzdG9lcnRlIE9iamVrdGUgZ2dmLiBlbnRmZXJuZW4KKyAgICBpZiAobWVtYmVyKHJlcywwKT49MCkgeworICAgICAgcmVzLT0oezB9KTsKKyAgICAgIG5hbWVfbGl2aW5nX21bdWlkXSA9IHJlczsKKyAgICB9CisgICAgLy8gZ2dmLiBOYW1lbiBvaG5lIE9iamVrdGUgZW50ZmVybmVuLgorICAgIGlmICghc2l6ZW9mKHJlcykpeworICAgICAgbV9kZWxldGUobmFtZV9saXZpbmdfbSx1aWQpOworICAgICAgY2xlYW5fbG9nKHNwcmludGYoImZpbmRfcGxheWVyIGxvZXNjaHQgJXNcbiIsdWlkKSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgb2JqcyA9IHJlczsKKyAgICByZXMgPSBvYmpzWzBdOworICAgIC8vIFdlbm4gZGFzIDAuIEVsZW1lbnQgZGVyIFNwaWVsZXIgaXN0LCBzaW5kIHdpciBmZXJ0aWcuIEFuc29uc3RlbiBzdWNoZW4KKyAgICAvLyB3aXIgZGVuIFNwaWVsZXIgdW5kIHNjaGllYmVuIGlobiBhbiBkaWUgMC4gU3RlbGxlIGltIEFycmF5LgorICAgIGlmICggIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUocmVzKSkgeworICAgICAgZm9yIChpID0gc2l6ZW9mKG9ianMpOyAtLWk7KSB7CisgICAgICAgaWYgKG9ianNbPGldICYmIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2Jqc1s8aV0pKSB7CisgICAgICAgICByZXMgPSBvYmpzWzxpXTsKKyAgICAgICAgIG9ianNbPGldID0gb2Jqc1swXTsKKyAgICAgICAgIG9ianNbMF0gPSByZXM7CisgICAgICAgICBicmVhazsKKyAgICAgICB9CisgICAgICB9CisgICAgICByZXMgPSAob2JqZWN0cChyZXMpICYmIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUocmVzKSkgPyByZXMgOiAwOworICAgIH0KKyAgICAvLyBlbHNlOiBpbiByZXMgc3RlaHQgZGVyIFNwaWVsZXIgc2Nob24uCisgIH0KKyAgZWxzZSBpZiAob2JqZWN0cChyZXMpKSAvLyByIGlzdCBuZW4gRWluemVsb2JqZWt0CisgICAgcmVzID0gcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShyZXMpID8gcmVzIDogMDsKKworICAvLyByZXMgaXN0IGpldHp0IGdnZi4gZGVyIFNwaWVsZXIuIEFiZXIgd2VubiBkZXIgbmUgYW5kZXJlIGFscyBkaWUgZ2VzdWNodGUKKyAgLy8gVVVJRCBoYXQsIGlzdCBkYXMgRXJnZWJuaXMgdHJvdHpkZW0gMC4KKyAgaWYgKGlzX3V1aWQgJiYgZ2V0dXVpZChyZXMpIT11dWlkKQorICAgICAgcmV0dXJuIDA7CisKKyAgLy8gZW5kbGljaCBnZWZ1bmRlbgorICByZXR1cm4gcmVzOworfQorCitwcml2YXRlIGludCBjaGVja19tYXRjaCggc3RyaW5nIHN0ciwgaW50IHBsYXllcnNfb25seSApCit7CisgICAgbWl4ZWQgbWF0Y2g7CisKKyAgICBpZiAoICEobWF0Y2ggPSBuYW1lX2xpdmluZ19tW3N0cl0pICkKKyAgICAgICByZXR1cm4gMDsKKworICAgIGlmICggIXBvaW50ZXJwKG1hdGNoKSApCisgICAgICAgbWF0Y2ggPSAoeyBtYXRjaCB9KTsKKworICAgIG1hdGNoIC09ICh7MH0pOworCisgICAgaWYgKCBzaXplb2YobWF0Y2gpICl7CisgICAgICAgaWYgKCBwbGF5ZXJzX29ubHkgKQorICAgICAgICAgICByZXR1cm4gc2l6ZW9mKGZpbHRlciggbWF0Y2gsICMncXVlcnlfb25jZV9pbnRlcmFjdGl2ZS8qJyovICkpCisgICAgICAgICAgICAgID4gMDsKKyAgICAgICBlbHNlCisgICAgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIG1fZGVsZXRlKCBuYW1lX2xpdmluZ19tLCBzdHIgKTsKKyAgICBjbGVhbl9sb2coIHNwcmludGYoImNoZWNrX21hdGNoIGxvZXNjaHQgJXNcbiIsIHN0cikgKTsKKyAgICByZXR1cm4gMDsKK30KKworLy9UT0RPOjogc3RyaW5nfHN0cmluZyogZXhjbHVkZQordmFyYXJncyBtaXhlZCBtYXRjaF9saXZpbmcoIHN0cmluZyBzdHIsIGludCBwbGF5ZXJzX29ubHksIG1peGVkIGV4Y2x1ZGUgKQoreworICAgIGludCBpLCBzOworICAgIG1peGVkIG1hdGNoLCAqdXNlcjsKKworICAgIGlmICggIXN0ciB8fCBzdHIgPT0gIiIgKQorICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCAhcG9pbnRlcnAoZXhjbHVkZSkgKQorICAgICAgIGV4Y2x1ZGUgPSAoeyBleGNsdWRlIH0pOworCisgICAgaWYgKCBtZW1iZXIoZXhjbHVkZSwgc3RyKSA8IDAgJiYgY2hlY2tfbWF0Y2goc3RyLCBwbGF5ZXJzX29ubHkpICkKKyAgICAgICByZXR1cm4gc3RyOworCisgICAgdXNlciA9IG1faW5kaWNlcyhuYW1lX2xpdmluZ19tKTsKKyAgICBzID0gc2l6ZW9mKHN0cik7CisgICAgbWF0Y2ggPSAwOworCisgICAgZm9yICggaSA9IHNpemVvZih1c2VyKTsgaS0tOyApCisgICAgICAgaWYgKCBzdHIgPT0gdXNlcltpXVswLi5zLTFdICYmIG1lbWJlciggZXhjbHVkZSwgdXNlcltpXSApIDwgMCApCisgICAgICAgICAgIGlmICggbWF0Y2ggKQorICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgaWYgKCBjaGVja19tYXRjaCh1c2VyW2ldLCBwbGF5ZXJzX29ubHkpICkKKyAgICAgICAgICAgICAgICAgIG1hdGNoID0gdXNlcltpXTsKKworICAgIGlmICggIW1hdGNoICkKKyAgICAgICByZXR1cm4gLTI7CisKKyAgICByZXR1cm4gbWF0Y2g7Cit9CisKK21peGVkICpkdW1wX2xpdmluZ3MoKQoreworICByZXR1cm4gc29ydF9hcnJheShtX2luZGljZXMobmFtZV9saXZpbmdfbSksIyc+KTsKK30KKworLy8gKiByZWdlbG1hZXNzaWcgTGlzdGVuIHZvbiBCYWxsYXN0IGJlZnJlaWVuCitwcml2YXRlIHZvaWQgY2xlYW5fbmFtZV9saXZpbmdfbShzdHJpbmcgKmtleXMsIGludCBsZWZ0LCBpbnQgbnVtKQoreworICBpbnQgaSwgajsKKyAgbWl4ZWQgYTsKKworICB3aGlsZSAobGVmdCAmJiBudW0tLSkKKyAgeworICAgIGlmIChwb2ludGVycChhID0gbmFtZV9saXZpbmdfbVtrZXlzWy0tbGVmdF1dKSAmJiBtZW1iZXIoYSwgMCk+PTApCisgICAgeworICAgICAgYS09KHswfSk7CisgICAgICBuYW1lX2xpdmluZ19tW2tleXNbbGVmdF1dID0gYTsKKyAgICB9CisgICAgaWYgKCFhIHx8IChwb2ludGVycChhKSAmJiAhc2l6ZW9mKGEpKSkKKyAgICB7CisgICAgICBjbGVhbl9sb2coIlRvYXN0aW5nICIra2V5c1tsZWZ0XSsiXG4iKTsKKyAgICAgIG1fZGVsZXRlKG5hbWVfbGl2aW5nX20sIGtleXNbbGVmdF0pOworICAgIH0gZWxzZSBjbGVhbl9sb2coc3ByaW50ZigiS0VFUElORyAlcyAoJU8pXG4iLGtleXNbbGVmdF0scG9pbnRlcnAoYSk/c2l6ZW9mKGEpOmEpKTsKKyAgfQorICBpZiAobGVmdCkKKyAgICBlZnVuOjpjYWxsX291dCgjJ2NsZWFuX25hbWVfbGl2aW5nX20sIDEsIGtleXMsIGxlZnQsIDgwKTsKKyAgZWxzZQorICAgIGNsZWFuX2xvZygiQ2xlYW4gcHJvY2VzcyBmaW5pc2hlZFxuIik7Cit9CisKK3ByaXZhdGUgdm9pZCBjbGVhbl9uZXRkZWFkKCkgeworICBpbnQgaTsKKyAgc3RyaW5nICpzOworICBvYmplY3Qgb2I7CisKKyAgcz1tX2luZGljZXMobmV0ZGVhZCk7CisgIGZvciAoaT1zaXplb2YocyktMTtpPj0wO2ktLSkKKyAgICBpZiAoIW9iamVjdHAob2I9bmV0ZGVhZFtzW2ldXSkgfHwgaW50ZXJhY3RpdmUob2IpKQorICAgICAgbV9kZWxldGUobmV0ZGVhZCxzW2ldKTsKK30KKworcHJpdmF0ZSB2b2lkIENsZWFuTGl2aW5nRGF0YSgpIHsKKyAgaWYgKGZpbmRfY2FsbF9vdXQoIydjbGVhbl9uYW1lX2xpdmluZ19tKSA8IDApIHsKKyAgICBjbGVhbl9sb2coIlN0YXJ0aW5nIGNsZWFuIHByb2Nlc3NcbiIpOworICAgIGVmdW46OmNhbGxfb3V0KCMnY2xlYW5fbmFtZV9saXZpbmdfbSwKKyAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgbV9pbmRpY2VzKG5hbWVfbGl2aW5nX20pLAorICAgICAgICAgICAgICAgICBzaXplb2YobmFtZV9saXZpbmdfbSksCisgICAgICAgICAgICAgICAgIDgwCisgICAgICAgICAgICAgICAgICk7CisgIH0KKyAgZWZ1bjo6Y2FsbF9vdXQoIydjbGVhbl9uZXRkZWFkLDIpOworfQorCisjdW5kZWYgY2xlYW5fbG9nCisKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL29iamVjdF9pbmZvLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9vYmplY3RfaW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkN2MwMDkKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9vYmplY3RfaW5mby5jCkBAIC0wLDAgKzEsMTA2IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgdGhlIG9sZCBzZW1hbnRpY3Mgb2YgdGhlIGVmdW4gb2JqZWN0X2luZm8oKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiBfX0VGVU5fREVGSU5FRF9fKGRyaXZlcl9pbmZvKSAvKiBOZXdlciB2ZXJzaW9uIGlzIHRoZXJlICovCisKKyNpbmNsdWRlIDxvYmplY3RpbmZvLmg+CisjaW5jbHVkZSA8b2JqZWN0X2luZm8uaD4KKworbWl4ZWQgb2JqZWN0X2luZm8ob2JqZWN0IG9iLCBpbnQgd2hhdCwgdmFyYXJncyBpbnQqIGluZGV4KQoreworICAgIG1peGVkICogcmVzdWx0OworCisgICAgaWYgKHNpemVvZihpbmRleCkgPiAxKQorICAgICAgICByYWlzZV9lcnJvcigiVG9vIG1hbnkgYXJndW1lbnRzIHRvIG9iamVjdF9pbmZvXG4iKTsKKworICAgIHN3aXRjaCh3aGF0KQorICAgIHsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIklsbGVnYWwgdmFsdWUgJWQgZm9yIG9iamVjdF9pbmZvKCkuXG4iLCB3aGF0KSk7CisKKyAgICAgICAgY2FzZSBPSU5GT19CQVNJQzoKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gYWxsb2NhdGUoT0lCX01BWCk7CisKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfSEVBUlRfQkVBVF0gICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9DX0hFQVJUX0JFQVQpOworICAgICAgICAgICAgcmVzdWx0W09JQl9JU19XSVpBUkRdICAgICAgICAgPSAwOyAgIC8qIE5vdCBzdXBwb3J0ZWQgYW55bW9yZS4gKi8KKyAgICAgICAgICAgIHJlc3VsdFtPSUJfRU5BQkxFX0NPTU1BTkRTXSAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9DX0NPTU1BTkRTX0VOQUJMRUQpOworICAgICAgICAgICAgcmVzdWx0W09JQl9DTE9ORV0gICAgICAgICAgICAgPSBlZnVuOjpjbG9uZXAob2IpOworICAgICAgICAgICAgcmVzdWx0W09JQl9ERVNUUlVDVEVEXSAgICAgICAgPSAwOyAgIC8qIE5vdCBwb3NzaWJsZSBhbnltb3JlLiAqLworICAgICAgICAgICAgcmVzdWx0W09JQl9TV0FQUEVEXSAgICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU1dBUFBFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lCX09OQ0VfSU5URVJBQ1RJVkVdICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PTkNFX0lOVEVSQUNUSVZFKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfUkVTRVRfU1RBVEVdICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1JFU0VUX1NUQVRFKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfV0lMTF9DTEVBTl9VUF0gICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1dJTExfQ0xFQU5fVVApOworICAgICAgICAgICAgcmVzdWx0W09JQl9MQU1CREFfUkVGRVJFTkNFRF0gPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTEFNQkRBX1JFRkVSRU5DRUQpOworICAgICAgICAgICAgcmVzdWx0W09JQl9TSEFET1ddICAgICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0hBRE9XX1BSRVYpICYmIDE7CisgICAgICAgICAgICByZXN1bHRbT0lCX1JFUExBQ0VEXSAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9SRVBMQUNFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lCX05FWFRfUkVTRVRdICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9ORVhUX1JFU0VUX1RJTUUpOworICAgICAgICAgICAgcmVzdWx0W09JQl9USU1FX09GX1JFRl0gICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTEFTVF9SRUZfVElNRSk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1JFRl0gICAgICAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfUkVGUyk7CisgICAgICAgICAgICByZXN1bHRbT0lCX0dJR0FUSUNLU10gICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9HSUdBVElDS1MpOworICAgICAgICAgICAgcmVzdWx0W09JQl9USUNLU10gICAgICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfVElDS1MpOworICAgICAgICAgICAgcmVzdWx0W09JQl9TV0FQX05VTV0gICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU1dBUF9OVU0pOworICAgICAgICAgICAgcmVzdWx0W09JQl9QUk9HX1NXQVBQRURdICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUFJPR19TV0FQUEVEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfVkFSX1NXQVBQRURdICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1ZBUl9TV0FQUEVEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfTkFNRV0gICAgICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X25hbWUob2IpOworICAgICAgICAgICAgcmVzdWx0W09JQl9MT0FEX05BTUVdICAgICAgICAgPSBlZnVuOjpsb2FkX25hbWUob2IpOworICAgICAgICAgICAgcmVzdWx0W09JQl9ORVhUX0FMTF0gICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX05FWFQpOworICAgICAgICAgICAgcmVzdWx0W09JQl9QUkVWX0FMTF0gICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX1BSRVYpOworICAgICAgICAgICAgcmVzdWx0W09JQl9ORVhUX0NMRUFOVVBdICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTkVYVF9DTEVBTlVQX1RJTUUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE9JTkZPX1BPU0lUSU9OOgorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBhbGxvY2F0ZShPSVBfTUFYKTsKKworICAgICAgICAgICAgcmVzdWx0W09JUF9ORVhUXSA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfTkVYVCk7CisgICAgICAgICAgICByZXN1bHRbT0lQX1BSRVZdID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9QUkVWKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSVBfUE9TXSAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX1BPUyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgT0lORk9fTUVNT1JZOgorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBhbGxvY2F0ZShPSU1fTUFYKTsKKworICAgICAgICAgICAgcmVzdWx0W09JTV9SRUZdICAgICAgICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1BST0dfUkVGUyk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05BTUVdICAgICAgICAgICAgICAgPSBlZnVuOjpwcm9ncmFtX25hbWUob2IpOworICAgICAgICAgICAgcmVzdWx0W09JTV9QUk9HX1NJWkVdICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1BST0dfU0laRSk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05VTV9GVU5DVElPTlNdICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX0ZVTkNUSU9OUyk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1NJWkVfRlVOQ1RJT05TXSAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9GVU5DVElPTlMpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OVU1fVkFSSUFCTEVTXSAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9WQVJJQUJMRVMpOworICAgICAgICAgICAgcmVzdWx0W09JTV9TSVpFX1ZBUklBQkxFU10gICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfVkFSSUFCTEVTKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTlVNX1NUUklOR1NdICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fU1RSSU5HUyk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1NJWkVfU1RSSU5HU10gICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fU0laRV9TVFJJTkdTX0RBVEFdICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1NUUklOR1NfREFUQSk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1NJWkVfU1RSSU5HU19UT1RBTF0gPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTX0RBVEFfVE9UQUwpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OVU1fSU5IRVJJVEVEXSAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9JTkhFUklURUQpOworICAgICAgICAgICAgcmVzdWx0W09JTV9TSVpFX0lOSEVSSVRFRF0gICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfSU5IRVJJVEVEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fVE9UQUxfU0laRV0gICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9QUk9HX1NJWkVfVE9UQUwpOworICAgICAgICAgICAgcmVzdWx0W09JTV9EQVRBX1NJWkVdICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0RBVEFfU0laRSk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1RPVEFMX0RBVEFfU0laRV0gICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfREFUQV9TSVpFX1RPVEFMKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTk9fSU5IRVJJVF0gICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OT19JTkhFUklUKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTk9fQ0xPTkVdICAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OT19DTE9ORSk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05PX1NIQURPV10gICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTk9fU0hBRE9XKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTlVNX0lOQ0xVREVTXSAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fSU5DTFVERUQpOworICAgICAgICAgICAgcmVzdWx0W09JTV9TSEFSRV9WQVJJQUJMRVNdICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NIQVJFX1ZBUklBQkxFUyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzaXplb2YoaW5kZXgpKQorICAgIHsKKyAgICAgICAgaW50IGlkeCA9IGluZGV4WzBdOworICAgICAgICBpZiAoaWR4IDwgMCB8fCBpZHggPj0gc2l6ZW9mKHJlc3VsdCkpCisgICAgICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJJbGxlZ2FsIGluZGV4IGZvciBvYmplY3RfaW5mbygpOiAlZCwgZXhwZWN0ZWQgMC4uJWRcbiIsCisgICAgICAgICAgICAgICAgaWR4LCBzaXplb2YocmVzdWx0KS0xKSk7CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdFtpZHhdOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiByZXN1bHQ7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vcXVlcnlfZWRpdGluZy5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vcXVlcnlfZWRpdGluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNDZkY2QKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9xdWVyeV9lZGl0aW5nLmMKQEAgLTAsMCArMSwxNyBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X2VkaXRpbmcoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfZWRpdGluZykKKworI2luY2x1ZGUgPGludGVyYWN0aXZlX2luZm8uaD4KKworaW50fG9iamVjdCBxdWVyeV9lZGl0aW5nKG9iamVjdCBvYikKK3sKKyAgICBpZighZWZ1bjo6aW50ZXJhY3RpdmUob2IpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9FRElUSU5HKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9xdWVyeV9pZGxlLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9xdWVyeV9pZGxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNhMzJhZQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3F1ZXJ5X2lkbGUuYwpAQCAtMCwwICsxLDE0IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfaWRsZSgpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9pZGxlKQorCisjaW5jbHVkZSA8aW50ZXJhY3RpdmVfaW5mby5oPgorCitpbnQgcXVlcnlfaWRsZShvYmplY3Qgb2IpCit7CisgICAgcmV0dXJuIGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX0lETEUpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3F1ZXJ5X2lucHV0X3BlbmRpbmcuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3F1ZXJ5X2lucHV0X3BlbmRpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDhjMzExCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vcXVlcnlfaW5wdXRfcGVuZGluZy5jCkBAIC0wLDAgKzEsMTcgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9pbnB1dF9wZW5kaW5nKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X2lucHV0X3BlbmRpbmcpCisKKyNpbmNsdWRlIDxpbnRlcmFjdGl2ZV9pbmZvLmg+CisKK29iamVjdCBxdWVyeV9pbnB1dF9wZW5kaW5nKG9iamVjdCBvYikKK3sKKyAgICBpZighZWZ1bjo6aW50ZXJhY3RpdmUob2IpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9JTlBVVF9QRU5ESU5HKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9xdWVyeV9pcF9uYW1lLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9xdWVyeV9pcF9uYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRhNmUwNwotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3F1ZXJ5X2lwX25hbWUuYwpAQCAtMCwwICsxLDQ4IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW5zIHF1ZXJ5X2lwX25hbWUoKSBhbmQKKyAqIHF1ZXJ5X2lwX251bWJlcigpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9pcF9uYW1lKQorCisjaW5jbHVkZSA8aW50ZXJhY3RpdmVfaW5mby5oPgorCitwcml2YXRlIHZhcmFyZ3Mgc3RyaW5nIF9xdWVyeV9pcF9uYW1lKG9iamVjdCBwbGF5ZXIpCit7CisgICAgb2JqZWN0IG9iID0gcGxheWVyOworICAgIG9iIHx8PSBlZnVuOjp0aGlzX3BsYXllcigpOworCisgICAgcGxheWVyID0gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfSVBfQUREUkVTUyk7CisgICAgcmV0dXJuIGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX0lQX05BTUUpOworfQorCitwcml2YXRlIHZhcmFyZ3Mgc3RyaW5nIF9xdWVyeV9pcF9udW1iZXIob2JqZWN0IHBsYXllcikKK3sKKyAgICBvYmplY3Qgb2IgPSBwbGF5ZXI7CisgICAgb2IgfHw9IGVmdW46OnRoaXNfcGxheWVyKCk7CisKKyAgICBwbGF5ZXIgPSBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9JUF9BRERSRVNTKTsKKyAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfSVBfTlVNQkVSKTsKK30KKworLy8gKiBIZXJrdW5mdHMtRXJtaXR0bHVuZworc3RyaW5nIHF1ZXJ5X2lwX251bWJlcihvYmplY3Qgb2IpCit7CisgIG9iPSBvYiB8fCB0aGlzX3BsYXllcigpOworICBpZiAoIW9iamVjdHAob2IpIHx8ICFpbnRlcmFjdGl2ZShvYikpIHJldHVybiAwOworICBpZihvYi0+cXVlcnlfcmVhbGlwKCkgJiYgKHN0cmluZylvYi0+cXVlcnlfcmVhbGlwKCkhPSIiKQorICB7CisgICAgcmV0dXJuIChzdHJpbmcpb2ItPnF1ZXJ5X3JlYWxpcCgpOworICB9CisgIHJldHVybiBfcXVlcnlfaXBfbnVtYmVyKG9iKTsKK30KKworc3RyaW5nIHF1ZXJ5X2lwX25hbWUobWl4ZWQgb2IpCit7CisgIGlmICggIW9iIHx8IG9iamVjdHAob2IpICkKKyAgICAgIG9iPXF1ZXJ5X2lwX251bWJlcihvYik7CisgIHJldHVybiAoc3RyaW5nKSIvcC9kYWVtb24vaXBsb29rdXAiLT5ob3N0KG9iKTsKK30KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3F1ZXJ5X2xpbWl0cy5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vcXVlcnlfbGltaXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNiZjM5MAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3F1ZXJ5X2xpbWl0cy5jCkBAIC0wLDAgKzEsMTQgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9saW1pdHMoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfbGltaXRzKQorCisjaW5jbHVkZSA8ZHJpdmVyX2luZm8uaD4KKwordmFyYXJncyBpbnQqIHF1ZXJ5X2xpbWl0cyhpbnQgZGVmKQoreworICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhkZWYgPyBEQ19ERUZBVUxUX1JVTlRJTUVfTElNSVRTIDogRElfQ1VSUkVOVF9SVU5USU1FX0xJTUlUUyk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vcXVlcnlfbG9hZF9hdmVyYWdlLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9xdWVyeV9sb2FkX2F2ZXJhZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjM2ZjBlCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vcXVlcnlfbG9hZF9hdmVyYWdlLmMKQEAgLTAsMCArMSwxNiBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X2xvYWRfYXZlcmFnZSgpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9sb2FkX2F2ZXJhZ2UpCisKKyNpbmNsdWRlIDxkcml2ZXJfaW5mby5oPgorCitzdHJpbmcgcXVlcnlfbG9hZF9hdmVyYWdlKCkKK3sKKyAgICByZXR1cm4gZWZ1bjo6c3ByaW50ZigiJS4yZiBjbWRzL3MsICUuMmYgY29tcCBsaW5lcy9zIiwKKyAgICAgICAgZWZ1bjo6ZHJpdmVyX2luZm8oRElfTE9BRF9BVkVSQUdFX0NPTU1BTkRTKSwKKyAgICAgICAgZWZ1bjo6ZHJpdmVyX2luZm8oRElfTE9BRF9BVkVSQUdFX0xJTkVTKSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vcXVlcnlfbXVkX3BvcnQuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3F1ZXJ5X211ZF9wb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZmMDA5ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3F1ZXJ5X211ZF9wb3J0LmMKQEAgLTAsMCArMSwzNSBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X211ZF9wb3J0KCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X211ZF9wb3J0KQorCisjaW5jbHVkZSA8aW50ZXJhY3RpdmVfaW5mby5oPgorI2luY2x1ZGUgPGRyaXZlcl9pbmZvLmg+CisKK2ludCBxdWVyeV9tdWRfcG9ydCh2YXJhcmdzIGludCp8b2JqZWN0KiBhcmdzKQoreworICAgIGlmKCFzaXplb2YoYXJncykgJiYgZWZ1bjo6dGhpc19wbGF5ZXIoKSAmJiBlZnVuOjppbnRlcmFjdGl2ZSh0aGlzX3BsYXllcigpKSkKKyAgICAgICAgcmV0dXJuIGVmdW46OmludGVyYWN0aXZlX2luZm8odGhpc19wbGF5ZXIoKSwgSUlfTVVEX1BPUlQpOworCisgICAgaWYoc2l6ZW9mKGFyZ3MpID4gMSkKKyAgICAgICAgcmFpc2VfZXJyb3IoIlRvbyBtYW55IGFyZ3VtZW50cyB0byBxdWVyeV9tdWRfcG9ydFxuIik7CisKKyAgICBpZihzaXplb2YoYXJncykgJiYgZWZ1bjo6b2JqZWN0cChhcmdzWzBdKSAmJiBlZnVuOjppbnRlcmFjdGl2ZShhcmdzWzBdKSkKKyAgICAgICAgcmV0dXJuIGVmdW46OmludGVyYWN0aXZlX2luZm8oYXJnc1swXSwgSUlfTVVEX1BPUlQpOworCisgICAgaWYoc2l6ZW9mKGFyZ3MpICYmIGludHAoYXJnc1swXSkpCisgICAgeworICAgICAgICBpbnQqIHBvcnRzID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTVVEX1BPUlRTKTsKKyAgICAgICAgaWYoYXJnc1swXSA8IC0xIHx8IGFyZ3NbMF0gPj0gc2l6ZW9mKHBvcnRzKSkKKyAgICAgICAgICAgIHJhaXNlX2Vycm9yKGVmdW46OnNwcmludGYoIkJhZCBhcmcgMSB0byBxdWVyeV9tdWRfcG9ydCgpOiB2YWx1ZSAlZCBvdXQgb2YgcmFuZ2UuXG4iLCBhcmdzWzBdKSk7CisgICAgICAgIGVsc2UgaWYoYXJnc1swXSA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiBzaXplb2YocG9ydHMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gcG9ydHNbYXJnc1swXV07CisgICAgfQorCisgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKERJX01VRF9QT1JUUylbMF07Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vcXVlcnlfb25jZV9pbnRlcmFjdGl2ZS5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vcXVlcnlfb25jZV9pbnRlcmFjdGl2ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNzgyOWYKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9xdWVyeV9vbmNlX2ludGVyYWN0aXZlLmMKQEAgLTAsMCArMSwxNCBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfb25jZV9pbnRlcmFjdGl2ZSkKKworI2luY2x1ZGUgPG9iamVjdF9pbmZvLmg+CisKK2ludCBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iamVjdCBvYikKK3sKKyAgICByZXR1cm4gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09OQ0VfSU5URVJBQ1RJVkUpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3F1ZXJ5X3Nub29wLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9xdWVyeV9zbm9vcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2YTY5YzAKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9xdWVyeV9zbm9vcC5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9zbm9vcCgpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworCisjaW5jbHVkZSA8aW50ZXJhY3RpdmVfaW5mby5oPgorCitwcml2YXRlIG9iamVjdCBfcXVlcnlfc25vb3Aob2JqZWN0IG9iKQoreworICAgIGlmKCFlZnVuOjppbnRlcmFjdGl2ZShvYikpCisgICAgICAgIHJldHVybiAwOworCisgICAgb2JqZWN0IHByZXYgPSBlZnVuOjpwcmV2aW91c19vYmplY3QoKTsKKyAgICBlZnVuOjpzZXRfdGhpc19vYmplY3QocHJldik7CisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X3Nub29wKQorICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9TTk9PUF9ORVhUKTsKKyNlbHNlCisgICAgcmV0dXJuIGVmdW46OnF1ZXJ5X3Nub29wKG9iKTsKKyNlbmRpZgorfQorCitub21hc2sgb2JqZWN0IHF1ZXJ5X3Nub29wKG9iamVjdCB3aG8pIHsKKyAgb2JqZWN0IHNub29wZXI7CisKKyAgc25vb3Blcj1fcXVlcnlfc25vb3Aod2hvKTsKKyAgaWYgKCFzbm9vcGVyKSByZXR1cm4gMDsKKyAgaWYgKHF1ZXJ5X3dpel9ncnAoc25vb3Blcik+cXVlcnlfd2l6X2dycChnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpKSAmJgorICAgICAgSVNfQVJDSChzbm9vcGVyKSkgcmV0dXJuIDA7CisgIHJldHVybiBzbm9vcGVyOworfQpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc2V0X2hlYXJ0X2JlYXQuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NldF9oZWFydF9iZWF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM5OTVlYgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NldF9oZWFydF9iZWF0LmMKQEAgLTAsMCArMSwyNCBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHNldF9oZWFydF9iZWF0KCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHNldF9oZWFydF9iZWF0KQorCisjaW5jbHVkZSA8Y29uZmlndXJhdGlvbi5oPgorCitpbnQgc2V0X2hlYXJ0X2JlYXQoaW50IGZsYWcpCit7CisgICAgb2JqZWN0IG9iID0gZWZ1bjo6cHJldmlvdXNfb2JqZWN0KCk7CisgICAgaW50IGhiID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9DX0hFQVJUX0JFQVQpOworCisgICAgaWYgKCFmbGFnID09ICFoYikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBlZnVuOjpjb25maWd1cmVfb2JqZWN0KG9iLCBPQ19IRUFSVF9CRUFULCBmbGFnKTsKKworICAgIHJldHVybiAxOworfQorCisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zZXRfaXNfd2l6YXJkLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zZXRfaXNfd2l6YXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAxY2NkYgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NldF9pc193aXphcmQuYwpAQCAtMCwwICsxLDEzNyBAQAorLyogVGhlc2UgYXJlIHRoZSBzcGVjaWFsIGNvbW1hbmRzIGZyb20gdGhlIGRyaXZlciB0aGF0IGFyZSBhY3RpdmF0ZWQgd2l0aAorICogc2V0X2lzX3dpemFyZCgpLiBUaGVzZSBmdW5jdGlvbnMgbXVzdCBiZSBhZGRlZCB0byB0aGUgcGxheWVyIG9iamVjdC4KKyAqIEFsc28gc2V0X2lzX3dpemFyZCgpIG11c3QgYmUgY2FsbGVkIGluIHRoZSBjb3JyZXNwb25kaW5nIHBsYXllciBvYmplY3QsCisgKiBub3QgYXMgYW4gKHNpbXVsLSllZnVuLgorICovCisKKyNpbmNsdWRlIDxjb21tYW5kcy5oPgorI2luY2x1ZGUgPGRyaXZlcl9pbmZvLmg+CisKKy8qIGlzX3dpemFyZDoKKyAqICAxOiBoYXMgYWN0aW9ucywKKyAqICAwOiBuZXZlciBoYWQgYWN0aW9ucywKKyAqIC0xOiBoYWQgYWN0aW9ucyBvbmNlLgorICovCitwcml2YXRlIG5vc2F2ZSBpbnQgaXNfd2l6YXJkOworCitwcml2YXRlIGludCBkcml2ZXJfbWFsbG9jKHN0cmluZyBzdHIpCit7CisgICAgaWYoaXNfd2l6YXJkIDw9IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYoIXNpemVvZihzdHIpKQorICAgIHsKKyAgICAgICAgd3JpdGUoZWZ1bjo6ZHJpdmVyX2luZm8oRElfU1RBVFVTX1RFWFRfTUFMTE9DKSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGlmKHN0ciA9PSAiZXh0c3RhdHMiKQorICAgIHsKKyAgICAgICAgd3JpdGUoZWZ1bjo6ZHJpdmVyX2luZm8oRElfU1RBVFVTX1RFWFRfTUFMTE9DX0VYVEVOREVEKSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitwcml2YXRlIGludCBkcml2ZXJfZHVtcGFsbG9iaihzdHJpbmcgc3RyKQoreworICAgIGlmKGlzX3dpemFyZCA8PSAwIHx8IHNpemVvZihzdHIpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHdyaXRlKCJEdW1waW5nIHRvIC9PQkpfRFVNUCAuLi4gIik7CisgICAgZWZ1bjo6ZHVtcF9kcml2ZXJfaW5mbyhERElfT0JKRUNUUyk7CisgICAgZWZ1bjo6ZHVtcF9kcml2ZXJfaW5mbyhERElfT0JKRUNUU19ERVNUUlVDVEVEKTsKKyAgICB3cml0ZSgiZG9uZVxuIik7CisgICAgcmV0dXJuIDE7Cit9CisKK3ByaXZhdGUgaW50IGRyaXZlcl9vcGNkdW1wKHN0cmluZyBzdHIpCit7CisgICAgaWYoaXNfd2l6YXJkIDw9IDAgfHwgc2l6ZW9mKHN0cikpCisgICAgICAgIHJldHVybiAwOworCisgICAgZWZ1bjo6ZHVtcF9kcml2ZXJfaW5mbyhERElfT1BDT0RFUyk7CisgICAgcmV0dXJuIDE7Cit9CisKK3ByaXZhdGUgaW50IGRyaXZlcl9zdGF0dXMoc3RyaW5nIHN0cikKK3sKKyAgICBpbnQgb3B0OworICAgIGlmKGlzX3dpemFyZCA8PSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHN3aXRjaChzdHIgfHwgIiIpCisgICAgeworICAgICAgICBjYXNlICIiOgorICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfTUVNT1JZOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAidGFibGVzIjoKKyAgICAgICAgY2FzZSAiIHRhYmxlcyI6CisgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9UQUJMRVM7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJzd2FwIjoKKyAgICAgICAgY2FzZSAiIHN3YXAiOgorICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfU1dBUDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgIm1hbGxvYyI6CisgICAgICAgIGNhc2UgIiBtYWxsb2MiOgorICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfTUFMTE9DOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAibWFsbG9jIGV4dHN0YXRzIjoKKyAgICAgICAgY2FzZSAiIG1hbGxvYyBleHRzdGF0cyI6CisgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9NQUxMT0NfRVhURU5ERUQ7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgd3JpdGUoZWZ1bjo6ZHJpdmVyX2luZm8ob3B0KSk7CisgICAgcmV0dXJuIDE7Cit9CisKK2ludCBzZXRfaXNfd2l6YXJkKHZhcmFyZ3MgPG9iamVjdHxpbnQ+KiBhcmdzKQoreworICAgIGludCBvbGR2YWwgPSBpc193aXphcmQ7CisKKyAgICBpZighc2l6ZW9mKGFyZ3MpKQorICAgICAgICByYWlzZV9lcnJvcigiVG9vIGZldyBhcmd1bWVudHMgdG8gc2V0X2lzX3dpemFyZFxuIik7CisgICAgaWYoc2l6ZW9mKGFyZ3MpID4gMikKKyAgICAgICAgcmFpc2VfZXJyb3IoIlRvbyBtYW55IGFyZ3VtZW50cyB0byBzZXRfaXNfd2l6YXJkXG4iKTsKKyAgICBpZighb2JqZWN0cChhcmdzWzBdKSkKKyAgICAgICAgcmFpc2VfZXJyb3IoIkJhZCBhcmcgMSB0byBzZXRfaXNfd2l6YXJkKClcbiIpOworICAgIGlmKGFyZ3NbMF0gIT0gdGhpc19vYmplY3QoKSkKKyAgICAgICAgcmFpc2VfZXJyb3IoIk9ubHkgc2V0X2lzX3dpemFyZCBmb3IgdGhlIGN1cnJlbnQgb2JqZWN0IHN1cHBvcnRlZFxuIik7CisgICAgaWYodGhpc19wbGF5ZXIoKSAhPSB0aGlzX29iamVjdCgpKQorICAgICAgICByYWlzZV9lcnJvcigiVGhlIGN1cnJlbnQgb2JqZWN0IG11c3QgYmUgdGhpc19wbGF5ZXIoKSBmb3Igc2V0X2lzX3dpemFyZCgpXG4iKTsKKyAgICBpZihzaXplb2YoYXJncykgPT0gMiAmJiAhaW50cChhcmdzWzFdKSkKKyAgICAgICAgcmFpc2VfZXJyb3IoIkJhZCBhcmcgMiB0byBzZXRfaXNfd2l6YXJkKClcbiIpOworCisgICAgaWYoc2l6ZW9mKGFyZ3MpID09IDIgJiYgIWFyZ3NbMV0pCisgICAgeworICAgICAgICBpZihpc193aXphcmQgPiAwKQorICAgICAgICAgICAgaXNfd2l6YXJkID0gLTE7CisgICAgfQorICAgIGVsc2UgaWYoc2l6ZW9mKGFyZ3MpID09IDIgJiYgYXJnc1sxXTwwKQorICAgIHsKKyAgICAgICAgIC8vIEp1c3QgcmV0dXJuIHRoZSBvbGQgdmFsdWUuCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKCFpc193aXphcmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFkZF9hY3Rpb24oIydkcml2ZXJfbWFsbG9jLCAibWFsbG9jIik7CisgICAgICAgICAgICBhZGRfYWN0aW9uKCMnZHJpdmVyX2R1bXBhbGxvYmosICJkdW1wYWxsb2JqIik7CisgICAgICAgICAgICBhZGRfYWN0aW9uKCMnZHJpdmVyX29wY2R1bXAsICJvcGNkdW1wIik7CisgICAgICAgICAgICBhZGRfYWN0aW9uKCMnZHJpdmVyX3N0YXR1cywgInN0YXR1cyIsIEFBX05PU1BBQ0UpOworICAgICAgICB9CisgICAgICAgIGlzX3dpemFyZCA9IDE7CisgICAgfQorCisgICAgcmV0dXJuIG9sZHZhbCA+IDA7Cit9CmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zZXRfcHJvbXB0LmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zZXRfcHJvbXB0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI1OTY5MgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NldF9wcm9tcHQuYwpAQCAtMCwwICsxLDIxIEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gc2V0X3Byb21wdCgpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhzZXRfcHJvbXB0KQorCisjaW5jbHVkZSA8Y29uZmlndXJhdGlvbi5oPgorCit2YXJhcmdzIHN0cmluZ3xjbG9zdXJlIHNldF9wcm9tcHQoc3RyaW5nfGNsb3N1cmV8aW50IHByb21wdCwgb2JqZWN0IG9iKQoreworICAgIG9iIHx8PSBlZnVuOjp0aGlzX3BsYXllcigpOworCisgICAgbWl4ZWQgb2xkcHJvbXB0ID0gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUNfUFJPTVBUKTsKKworICAgIGlmKCFpbnRwKHByb21wdCkpCisgICAgICAgIGVmdW46OmNvbmZpZ3VyZV9pbnRlcmFjdGl2ZShvYiwgSUNfUFJPTVBULCBwcm9tcHQpOworCisgICAgcmV0dXJuIG9sZHByb21wdDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zaGFkb3cuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NoYWRvdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MDhjNzMKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zaGFkb3cuYwpAQCAtMCwwICsxLDU1IEBACisvKiBUaGVzZSBzZWZ1bnMgYXJlIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfc2hhZG93aW5nKCkKKyAqIGFuZCB0aGUgb2xkIHNlbWFudGljcyBvZiB0aGUgZWZ1biBzaGFkb3coKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfc2hhZG93aW5nKQorCisjaW5jbHVkZSA8b2JqZWN0X2luZm8uaD4KKworb2JqZWN0IHF1ZXJ5X3NoYWRvd2luZyhvYmplY3Qgb2IpCit7CisgICAgcmV0dXJuIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSEFET1dfUFJFVik7Cit9CisKK3ByaXZhdGUgb2JqZWN0IF9zaGFkb3cob2JqZWN0IG9iLCBpbnQgZmxhZykKK3sKKyAgICBpZihmbGFnKQorICAgIHsKKyAgICAgICAgb2JqZWN0IHNoYWRvd2VyID0gZWZ1bjo6cHJldmlvdXNfb2JqZWN0KDEpOworICAgICAgICBlZnVuOjpzZXRfdGhpc19vYmplY3Qoc2hhZG93ZXIpOworCisgICAgICAgIGlmIChlZnVuOjpzaGFkb3cob2IpKQorICAgICAgICAgICAgcmV0dXJuIGVmdW46Om9iamVjdF9pbmZvKHNoYWRvd2VyLCBPSV9TSEFET1dfUFJFVik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0hBRE9XX05FWFQpOworfQorI2Vsc2UKK3ByaXZhdGUgb2JqZWN0IF9zaGFkb3cob2JqZWN0IG9iLCBpbnQgZmxhZykKK3sKKyAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgxKSk7CisgIHJldHVybiBlZnVuOjpzaGFkb3cob2IsIGZsYWcpOworfQorI2VuZGlmCisKKworcHVibGljIG9iamVjdCBzaGFkb3cob2JqZWN0IG9iLCBpbnQgZmxhZykKK3sKKyAgb2JqZWN0IHJlcyA9IGZ1bmNhbGwoIydfc2hhZG93LG9iLCBmbGFnKTsKKyAgaWYgKGZsYWcpCisgICAgIi9zZWN1cmUvc2hhZG93bWFzdGVyIi0+UmVnaXN0ZXJTaGFkb3cocHJldmlvdXNfb2JqZWN0KCkpOworICByZXR1cm4gcmVzOworfQorCitwcml2YXRlIHZvaWQgX3Vuc2hhZG93KCkgeworICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KDEpKTsKKyAgZWZ1bjo6dW5zaGFkb3coKTsKK30KKworcHVibGljIHZvaWQgdW5zaGFkb3coKSB7CisgIGZ1bmNhbGwoIydfdW5zaGFkb3cpOworICAiL3NlY3VyZS9zaGFkb3dtYXN0ZXIiLT5VbnJlZ2lzdGVyU2hhZG93KHByZXZpb3VzX29iamVjdCgpKTsKK30KZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NpbXVsX2VmdW4uYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NpbXVsX2VmdW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGUwYjc4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc2ltdWxfZWZ1bi5jCkBAIC0wLDAgKzEsMjAxNiBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHNpbXVsX2VmdW4uYyAtLSBzaW11bCBlZnVuJ3MKKy8vCisvLyAkSWQ6IHNpbXVsX2VmdW4uYyA3NDA4IDIwMTAtMDItMDYgMDA6Mjc6MjVaIFplc3N0cmEgJAorI3ByYWdtYSBzdHJpY3RfdHlwZXMsc2F2ZV90eXBlcyxydHRfY2hlY2tzCisjcHJhZ21hIG5vX2Nsb25lLG5vX3NoYWRvdyxub19pbmhlcml0CisjcHJhZ21hIHBlZGFudGljLHJhbmdlX2NoZWNrLHdhcm5fZGVwcmVjYXRlZAorI3ByYWdtYSB3YXJuX2VtcHR5X2Nhc3RzLHdhcm5fbWlzc2luZ19yZXR1cm4sd2Fybl9mdW5jdGlvbl9pbmNvbnNpc3RlbnQKKworLy8gQWJzb2x1dGUgUGZhZGUgZXJmb3JkZXJsaWNoIC0genVtIFplaXRwdW5rdCwgd28gZGVyIE1hc3RlciBnZWxhZGVuCisvLyB3aXJkLCBzaW5kIG5vY2gga2VpbmUgSW5jbHVkZS1QZmFkZSBkYSAuLi4KKworI2RlZmluZSBTTk9PUExPR0ZJTEUgIlNOT09QIgorI2RlZmluZSBBU05PT1BMT0dGSUxFICJBUkNIL1NOT09QIgorCisjaW5jbHVkZSAiL3NlY3VyZS9jb25maWcuaCIKKyNpbmNsdWRlICIvc2VjdXJlL3dpemxldmVscy5oIgorI2luY2x1ZGUgIi9zeXMvc25vb3BpbmcuaCIKKyNpbmNsdWRlICIvc3lzL2xhbmd1YWdlLmgiCisjaW5jbHVkZSAiL3N5cy90aGluZy9wcm9wZXJ0aWVzLmgiCisjaW5jbHVkZSAiL3N5cy93aXpsaXN0LmgiCisjaW5jbHVkZSAiL3N5cy9lcnEuaCIKKyNpbmNsdWRlICIvc3lzL2xwY3R5cGVzLmgiCisjaW5jbHVkZSAiL3N5cy9kYWVtb24uaCIKKyNpbmNsdWRlICIvc3lzL3BsYXllci9iYXNlLmgiCisjaW5jbHVkZSAiL3N5cy90aGluZy9kZXNjcmlwdGlvbi5oIgorI2luY2x1ZGUgIi9zeXMvY29udGFpbmVyLmgiCisjaW5jbHVkZSAiL3N5cy9kZWZpbmVzLmgiCisjaW5jbHVkZSAiL3N5cy90ZWxuZXQuaCIKKyNpbmNsdWRlICIvc3lzL29iamVjdGluZm8uaCIKKyNpbmNsdWRlICIvc3lzL2ZpbGVzLmgiCisjaW5jbHVkZSAiL3N5cy9zdHJpbmdzLmgiCisjaW5jbHVkZSAiL3N5cy90aW1lLmgiCisjaW5jbHVkZSAiL3N5cy9scGN0eXBlcy5oIgorI2luY2x1ZGUgIi9zeXMvbm90aWZ5X2ZhaWwuaCIKKyNpbmNsdWRlICIvc3lzL3Rscy5oIgorI2luY2x1ZGUgIi9zeXMvaW5wdXRfdG8uaCIKKyNpbmNsdWRlICIvc3lzL29iamVjdF9pbmZvLmgiCisKKy8qIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAqLworc3RyaW5nIGR0aW1lKGludCB3YW5uKTsKK3ZhcmFyZ3MgaW50IGxvZ19maWxlKHN0cmluZyBmaWxlLCBzdHJpbmcgdHh0LCBpbnQgc2l6ZV90b19icmVhayk7CitpbnQgcXVlcnlfd2l6X2xldmVsKG1peGVkIHBsYXllcik7Citub21hc2sgdmFyYXJncyBpbnQgc25vb3Aob2JqZWN0IG1lLCBvYmplY3QgeW91KTsKK3ZhcmFyZ3Mgc3RyaW5nIGNvdW50cnkobWl4ZWQgaXAsIHN0cmluZyBudW0pOworaW50IHF1ZXJ5X3dpel9ncnAobWl4ZWQgd2l6KTsKK3B1YmxpYyB2YXJhcmdzIG9iamVjdCBkZWVwX3ByZXNlbnQobWl4ZWQgd2hhdCwgb2JqZWN0IG9iKTsKK25vbWFzayBpbnQgc2VjdXJlX2xldmVsKCk7Citub21hc2sgc3RyaW5nIHNlY3VyZV9ldWlkKCk7CitwdWJsaWMgbm9tYXNrIGludCBwcm9jZXNzX2NhbGwoKTsKK25vbWFzayBtaXhlZCBfX2NyZWF0ZV9wbGF5ZXJfZHVtbXkoc3RyaW5nIG5hbWUpOwordmFyYXJncyBzdHJpbmcgcmVwbGFjZV9wZXJzb25hbChzdHJpbmcgc3RyLCBtaXhlZCAqb2JzLCBpbnQgY2Fwcyk7CisKKworLy9yZXBsYWNlbWVudHMgZm9yIGRyb3BwZWQgZWZ1bnMgaW4gTEQKKyNpZiAhX19FRlVOX0RFRklORURfXyhleHRyYWN0KQordmFyYXJncyBzdHJpbmcgZXh0cmFjdChzdHJpbmcgc3RyLCBpbnQgZnJvbSwgaW50IHRvKTsKKyNlbmRpZgorI2lmICFfX0VGVU5fREVGSU5FRF9fKHNsaWNlX2FycmF5KQordmFyYXJncyBtaXhlZCBzbGljZV9hcnJheShtaXhlZCBhcnJheSwgaW50IGZyb20sIGludCB0byk7CisjZW5kaWYKKyNpZiAhX19FRlVOX0RFRklORURfXyhtZW1iZXJfYXJyYXkpCitpbnQgbWVtYmVyX2FycmF5KG1peGVkIGl0ZW0sIG1peGVkIGFycmF5c3RyaW5nKTsKKyNlbmRpZgorCisvLyBJbmNsdWRlIHRoZSBkaWZmZXJlbnQgc3ViICdtb2R1bGVzJyBvZiB0aGUgc2ltdWxfZWZ1bgorI2luY2x1ZGUgX19ESVJfXyJkZWJ1Z19pbmZvLmMiCisjaW5jbHVkZSBfX0RJUl9fImVuYWJsZV9jb21tYW5kcy5jIgorI2luY2x1ZGUgX19ESVJfXyJoYXNoLmMiCisjaW5jbHVkZSBfX0RJUl9fIm9iamVjdF9pbmZvLmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X2VkaXRpbmcuYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfaWRsZS5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9pbnB1dF9wZW5kaW5nLmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X2lwX25hbWUuYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfbGltaXRzLmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X2xvYWRfYXZlcmFnZS5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9tdWRfcG9ydC5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9vbmNlX2ludGVyYWN0aXZlLmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X3Nub29wLmMiCisjaW5jbHVkZSBfX0RJUl9fInNldF9oZWFydF9iZWF0LmMiCisjaWYgX19CT09UX1RJTUVfXyA8IDE0NTYyNjE4NTkKKyNpbmNsdWRlIF9fRElSX18ic2V0X3Byb21wdC5jIgorI2VuZGlmCisjaW5jbHVkZSBfX0RJUl9fInNoYWRvdy5jIgorI2luY2x1ZGUgX19ESVJfXyJsaXZpbmdzLmMiCisjaW5jbHVkZSBfX0RJUl9fImNvbW0uYyIKKworI2RlZmluZSBUTyAgICAgICAgZWZ1bjo6dGhpc19vYmplY3QoKQorI2RlZmluZSBUSSAgICAgICAgZWZ1bjo6dGhpc19pbnRlcmFjdGl2ZSgpCisjZGVmaW5lIFRQICAgICAgICBlZnVuOjp0aGlzX3BsYXllcigpCisjZGVmaW5lIFBPICAgICAgICBlZnVuOjpwcmV2aW91c19vYmplY3QoMCkKKyNkZWZpbmUgTEVWRUwoeCkgcXVlcnlfd2l6X2xldmVsKHgpCisjZGVmaW5lIE5BTUUoeCkgIGNhcGl0YWxpemUoZ2V0dWlkKHgpKQorCisjZGVmaW5lIERFQlVHKHgpIGlmIChmaW5kX3BsYXllcigiemVzc3RyYSIpKSBcCisgIHRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJ6ZXNzdHJhIikseCkKKworbWl4ZWQgZHRpbWVfY2FjaGUgPSAoey0xLCIifSk7CisKKyNpZmRlZiBJT1NUQVRTCitzdHJ1Y3QgaW9zdGF0X3MgeworICBzdHJpbmcgb25hbWU7CisgIGludCB0aW1lOworICBpbnQgc2l6ZTsKK307CittaXhlZCBzYXZlb19zdGF0ID0gKHsgMCxhbGxvY2F0ZSgyMDAsIDApIH0pOworbWl4ZWQgcmVzdG9yZW9fc3RhdCA9ICh7IDAsYWxsb2NhdGUoMjAwLDApIH0pOworLy9taXhlZCB3cml0ZWZpbGVfc3RhdCA9ICh7IDAsYWxsb2NhdGUoMTAwLCg8aW9zdGF0X3M+KSkgfSk7CisvL21peGVkIHJlYWRmaWxlX3N0YXQgPSAoeyAwLGFsbG9jYXRlKDEwMCwoPGlvc3RhdF9zPikpIH0pOworLy9taXhlZCBsb2dfc3RhdCA9ICh7IDAsYWxsb2NhdGUoMTAwLCg8aW9zdGF0X3M+KSkgfSk7CisKK21peGVkIF9fX2lvc3RhdHMoaW50IHR5cGUpIHsKKyAgc3dpdGNoKHR5cGUpIHsKKyAgICBjYXNlIDE6CisgICAgICByZXR1cm4gc2F2ZW9fc3RhdDsKKyAgICBjYXNlIDI6CisgICAgICByZXR1cm4gcmVzdG9yZW9fc3RhdDsKKy8qICAgIGNhc2UgMzoKKyAgICAgIHJldHVybiB3cml0ZWZpbGVfc3RhdDsKKyAgICBjYXNlIDQ6CisgICAgICByZXR1cm4gcmVhZGZpbGVfc3RhdDsKKyAgICBjYXNlIDU6CisgICAgICByZXR1cm4gbG9nX3N0YXQ7CisgICAgICAqLworICB9CisgIHJldHVybiAwOworfQorI2VuZGlmCisKKy8vIE5pY2h0IGplZGVyIE1hZ2llciBtdXNzIGRpZSBzaW11bF9lZnVuIGVudHNvcmdlbiBrb2VubmVuLgorc3RyaW5nIE5vdGlmeURlc3RydWN0KG9iamVjdCBjYWxsZXIpIHsKKyAgICBpZiggKGNhbGxlciE9dGhpc19vYmplY3QoKSAmJiAhQVJDSF9TRUNVUklUWSkgfHwgcHJvY2Vzc19jYWxsKCkgKSB7CisgICAgICByZXR1cm4gIkR1IGRhcmZzdCBkYXMgc2ltdWxfZWZ1biBPYmpla3QgbmljaHQgemVyc3RvZXJlbiFcbiI7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitwdWJsaWMgbm9tYXNrIHZvaWQgcmVtb3ZlX2ludGVyYWN0aXZlKCBvYmplY3Qgb2IgKQoreworICAgIGlmICggb2JqZWN0cChvYikgJiYgcHJldmlvdXNfb2JqZWN0KCkKKyAgICAgICAgJiYgb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpWzAuLjddICE9ICIvc2VjdXJlLyIKKyAgICAgICAgJiYgKChwcmV2aW91c19vYmplY3QoKSAhPSBvYgorICAgICAgICAgICAgICYmIChvYiAhPSB0aGlzX3BsYXllcigpIHx8IG9iICE9IHRoaXNfaW50ZXJhY3RpdmUoKSkpCisgICAgICAgICAgICB8fCAocHJldmlvdXNfb2JqZWN0KCkgPT0gb2IKKyAgICAgICAgICAgICAgICYmICh0aGlzX3BsYXllcigpICYmIHRoaXNfcGxheWVyKCkgIT0gb2IKKyAgICAgICAgICAgICAgICAgICB8fCB0aGlzX2ludGVyYWN0aXZlKCkgJiYgdGhpc19pbnRlcmFjdGl2ZSgpICE9IG9iKSkgKSApCisKKyAgICAgICBsb2dfZmlsZSggIlBMQVlFUkRFU1QiLAorICAgICAgICAgICAgICAgIHNwcmludGYoICIlczogJU8gYXVzZ2Vsb2dndCB2b24gUE8gJU8sIFRJICVPLCBUUCAlT1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGR0aW1lKHRpbWUoKSksIG9iLCBwcmV2aW91c19vYmplY3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfaW50ZXJhY3RpdmUoKSwgdGhpc19wbGF5ZXIoKSApICk7CisKKyAgICBlZnVuOjpyZW1vdmVfaW50ZXJhY3RpdmUob2IpOworfQorCisKK3ZvaWQgX19fdXBkbWFzdGVyKCkKK3sKKyAgICBvYmplY3Qgb2I7CisKKyAgICAvL3NvbGx0ZSBuaWNodCBqZWRlciBkdWVyZmVuLgorICAgIGlmIChwcm9jZXNzX2NhbGwoKSB8fCAhQVJDSF9TRUNVUklUWSkKKyAgICAgIHJhaXNlX2Vycm9yKCJJbGxlZ2FsIHVzZSBvZiBfX191cGRtYXN0ZXIoKSEiKTsKKworICAgIHdyaXRlKCJSZW1vdmluZyBvbGQgbWFzdGVyIC4uLiAiKTsKKyAgICBmb3JlYWNoKHN0cmluZyBmaWxlOiAKKyAgICAgICAgZ2V0X2RpcigiL3NlY3VyZS9tYXN0ZXIvKi5jIixHRVRESVJfTkFNRVN8R0VURElSX1VOU09SVEVEfEdFVERJUl9QQVRIKSkgeworICAgICAgaWYgKG9iID0gZmluZF9vYmplY3QoZmlsZSkpCisgICAgICAgZWZ1bjo6ZGVzdHJ1Y3Qob2IpOworICAgIH0KKyAgICBlZnVuOjpkZXN0cnVjdChlZnVuOjpmaW5kX29iamVjdCgiL3NlY3VyZS9tYXN0ZXIiKSk7CisgICAgd3JpdGUoImRvbmUuXG5Mb2FkaW5nIGFnYWluIC4uLiAiKTsKKyAgICBsb2FkX29iamVjdCgiL3NlY3VyZS9tYXN0ZXIiKTsKKworICAgIHdyaXRlKCJkb25lLlxuIik7Cit9CisKK3ZhcmFyZ3Mgc3RyaW5nIGNvdW50cnkobWl4ZWQgaXAsIHN0cmluZyBudW0pIHsKKyAgbWl4ZWQgcmV0OworCisgIGlmKHJldCA9IChzdHJpbmcpIi9wL2RhZW1vbi9pcGxvb2t1cCItPmNvdW50cnkobnVtIHx8IGlwKSkgeworICAgIHJldHVybiByZXQ7CisgIH0gZWxzZSByZXR1cm4gIj8/PyI7Cit9CisKKworLy8gKiBTbm9vcGVuIHVuZCB3YXMgZGF6dWdlaG9lcnQKK3N0YXRpYyBvYmplY3QgZmluZF9zbm9vcGVkKG9iamVjdCB3aG8pCit7CisgIG9iamVjdCAqdTsKKyAgaW50IGk7CisKKyAgZm9yIChpPXNpemVvZih1PXVzZXJzKCkpLTE7aT49MDtpLS0pCisgICAgaWYgKHdobz09ZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyh1W2ldLCBJSV9TTk9PUF9ORVhUKSkKKyAgICAgIHJldHVybiB1W2ldOworICByZXR1cm4gMDsKK30KKworcHJpdmF0ZSBzdHJpbmcgTGN1dChzdHJpbmcgc3RyKSB7CisgIHJldHVybiBzdHJbNS4uMTFdK3N0clsxOC4uXTsKK30KKworbm9tYXNrIHZhcmFyZ3MgaW50IHNub29wKCBvYmplY3QgbWUsIG9iamVjdCB5b3UgKQoreworICAgIGludCByZXQ7CisgICAgb2JqZWN0IHNub29wZXIwLCBzbm9vcGVyLCBzbm9vcGVyMiwgc25vb3BlcjM7CisKKyAgICBpZiggIW9iamVjdHAobWUpIHx8IG1lID09IHlvdSB8fCAhUE8gKQorICAgICAgIHJldHVybiAwOworCisgICAgc25vb3BlcjAgPSBmaW5kX3Nub29wZWQobWUpOworCisgICAgIGlmKHlvdSl7CisgICAgICAgIGlmICggUE8gIT0gbWUgJiYgcXVlcnlfd2l6X2dycChtZSkgPj0gcXVlcnlfd2l6X2dycChnZXRldWlkKFBPKSkgKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgaWYgKCBxdWVyeV93aXpfZ3JwKG1lKSA8PSBxdWVyeV93aXpfZ3JwKHlvdSkgJiYKKyAgICAgICAgICAgICAhKHlvdS0+UXVlcnlBbGxvd1Nub29wKG1lKSkgKQorICAgICAgICAgICAgaWYgKCAhSVNfREVQVVRZKG1lKSB8fCBJU19BUkNIKHlvdSkgKQorICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgaWYgKCAoc25vb3BlciA9IGVmdW46OmludGVyYWN0aXZlX2luZm8oeW91LCBJSV9TTk9PUF9ORVhUKSkgJiYKKyAgICAgICAgICAgICBxdWVyeV93aXpfZ3JwKHNub29wZXIpID49IHF1ZXJ5X3dpel9ncnAobWUpICl7CisgICAgICAgICAgICBpZiAoIChpbnQpc25vb3Blci0+UXVlcnlQcm9wKFBfU05PT1BGTEFHUykgJiBTRl9MT0NLRUQgKQorICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgICAgIHRlbGxfb2JqZWN0KCBzbm9vcGVyLCBzcHJpbnRmKCAiJXMgc25vb3BlZCBqZXR6dCAlcy5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZS0+bmFtZShXRVIpLCB5b3UtPm5hbWUoV0VSKSApICk7CisKKyAgICAgICAgICAgIHNub29wZXIyID0gbWU7CisKKyAgICAgICAgICAgIHdoaWxlICggc25vb3BlcjMgPSBpbnRlcmFjdGl2ZV9pbmZvKHNub29wZXIyLCBJSV9TTk9PUF9ORVhUKSApeworICAgICAgICAgICAgICAgdGVsbF9vYmplY3QoIHNub29wZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCAiJXMgd2lyZCBzZWluZXJzZWl0cyB2b24gJXMgZ2Vzbm9vcGVkLlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsc25vb3BlcjItPm5hbWUoV0VSKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlcjMtPm5hbWUoV0VNKSApICk7CisgICAgICAgICAgICAgICBzbm9vcGVyMiA9IHNub29wZXIzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlZnVuOjpzbm9vcCggc25vb3Blciwgc25vb3BlcjIgKTsKKworICAgICAgICAgICAgaWYgKCBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKHNub29wZXIyLCBJSV9TTk9PUF9ORVhUKSAhPSBzbm9vcGVyICkKKyAgICAgICAgICAgICAgIHRlbGxfb2JqZWN0KCBzbm9vcGVyLCBzcHJpbnRmKCAiRHUga2FubnN0ICVzIG5pY2h0IHNub29wZW4uXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlcjItPm5hbWUoV0VOKSApICk7CisgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgdGVsbF9vYmplY3QoIHNub29wZXIsIHNwcmludGYoICJEdSBzbm9vcHN0IGpldHp0ICVzLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIyLT5uYW1lKFdFTikgKSApOworICAgICAgICAgICAgICAgaWYgKCAhSVNfREVQVVRZKHNub29wZXIpICl7CisgICAgICAgICAgICAgICAgICAgbG9nX2ZpbGUoIFNOT09QTE9HRklMRSwgc3ByaW50ZigiJXM6ICVPICVPICVPXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdGltZSh0aW1lKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjIpICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwICk7CisgICAgICAgICAgICAgICAgICAgaWYgKHNub29wZXIwKQorICAgICAgICAgICAgICAgICAgICAgIENITUFTVEVSLT5zZW5kKCAiU25vb3AiLCBzbm9vcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggIiVzICpPRkYqICVzICglTykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChzbm9vcGVyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHNub29wZXIwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIwKSApICk7CisKKyAgICAgICAgICAgICAgICAgICBDSE1BU1RFUi0+c2VuZCggIlNub29wIiwgc25vb3BlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoIiVzIC0+ICVzICglTykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHNub29wZXIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChzbm9vcGVyMikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIyKSkpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICAgICBsb2dfZmlsZSggQVNOT09QTE9HRklMRSwgc3ByaW50ZiggIiVzOiAlTyAlTyAlT1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdGltZSh0aW1lKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlcjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjIpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTAwMDAwICk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaWYgKHNub29wZXIpCisgICAgICAgICAgICAgICBpZiAoICFtZS0+UXVlcnlQcm9wKFBfU05PT1BGTEFHUykgJiBTRl9MT0NLRUQgKXsKKyAgICAgICAgICAgICAgICAgICBwcmludGYoICIlcyB3aXJkIGJlcmVpdHMgdm9uICVzIGdlc25vb3BlZC4gQmVudXR6ZSBkYXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJmXCItRmxhZywgd2VubiBkdSBkZW5ub2NoIHNub29wZW4gd2lsbHN0LlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeW91LT5uYW1lKFdFUiksIHNub29wZXItPm5hbWUoV0VNKSApOworICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgfQorCisgICAgICAgIHJldCA9IGVmdW46OnNub29wKCBtZSwgeW91ICk7CisKKyAgICAgICAgaWYgKCAhSVNfREVQVVRZKG1lKSAmJiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKHlvdSwgSUlfU05PT1BfTkVYVCkgPT0gbWUpeworICAgICAgICAgICAgbG9nX2ZpbGUoIFNOT09QTE9HRklMRSwgc3ByaW50ZiggIiVzOiAlTyAlTyAlT1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGN1dChkdGltZSh0aW1lKCkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWUsIHlvdSwgZW52aXJvbm1lbnQoeW91KSApLAorICAgICAgICAgICAgICAgICAgICAgMTAwMDAwICk7CisKKyAgICAgICAgICAgIGlmIChzbm9vcGVyMCkKKyAgICAgICAgICAgICAgIENITUFTVEVSLT5zZW5kKCAiU25vb3AiLCBtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggIiVzICpPRkYqICVzICglTykuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChtZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHNub29wZXIwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjApICkgKTsKKworICAgICAgICAgICAgQ0hNQVNURVItPnNlbmQoICJTbm9vcCIsIG1lLCBzcHJpbnRmKCAiJXMgLT4gJXMgKCVPKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQobWUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHlvdSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoeW91KSApICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZXsKKyAgICAgICAgICAgIGlmICggZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyh5b3UsIElJX1NOT09QX05FWFQpID09IG1lICl7CisgICAgICAgICAgICAgICBsb2dfZmlsZSggQVNOT09QTE9HRklMRSwgc3ByaW50ZiggIiVzOiAlTyAlTyAlT1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExjdXQoZHRpbWUodGltZSgpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZSwgeW91LCBlbnZpcm9ubWVudCh5b3UpICksCisgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggcmV0ICYmIHF1ZXJ5X3dpel9ncnAobWUpIDw9IHF1ZXJ5X3dpel9ncnAoeW91KSAmJgorICAgICAgICAgICAgICFJU19ERVBVVFkobWUpICkKKyAgICAgICAgICAgIHRlbGxfb2JqZWN0KCB5b3UsICIqKiogIiArIE5BTUUobWUpICsgIiBzbm9vcHQgRGljaCFcbiIgKTsKKworICAgICAgICByZXR1cm4gcmV0OworICAgICB9CisgICAgIGVsc2UgeworICAgICAgICBpZiAoIChtZSA9PSBQTyB8fAorICAgICAgICAgICAgICBxdWVyeV93aXpfZ3JwKGdldGV1aWQoUE8pKSA+IHF1ZXJ5X3dpel9ncnAobWUpIHx8CisgICAgICAgICAgICAgIChxdWVyeV93aXpfZ3JwKGdldGV1aWQoUE8pKSA9PSBxdWVyeV93aXpfZ3JwKG1lKSAmJgorICAgICAgICAgICAgICBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKFBPLCBJSV9TTk9PUF9ORVhUKSA9PSBtZSkpICYmIHNub29wZXIwICl7CisgICAgICAgICAgICBpZiAoICFJU19ERVBVVFkobWUpICl7CisgICAgICAgICAgICAgICBsb2dfZmlsZSggU05PT1BMT0dGSUxFLCBzcHJpbnRmKCAiJXM6ICVPICVPICVPICpPRkYqXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMY3V0KGR0aW1lKHRpbWUoKSkpLCBtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlcjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIwKSApLAorICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwICk7CisKKyAgICAgICAgICAgICAgICBDSE1BU1RFUi0+c2VuZCggIlNub29wIiwgbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCAiJXMgKk9GRiogJXMgKCVPKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChtZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChzbm9vcGVyMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMCkgKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgIGxvZ19maWxlKCBBU05PT1BMT0dGSUxFLCBzcHJpbnRmKCAiJXM6ICVPICVPICVPICpPRkYqXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGN1dChkdGltZSh0aW1lKCkpKSwgbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIwKSApLAorICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBlZnVuOjpzbm9vcChtZSk7CisgICAgICAgIH0KKyAgICAgfQorICAgICByZXR1cm4gMDsKK30KKworCisKKy8vICogRW11bGF0aW9uIGRlcyAnYWx0ZW4nIGV4cGxvZGUgZHVyY2ggZGFzIG5ldWUKK3N0cmluZyAqb2xkX2V4cGxvZGUoc3RyaW5nIHN0ciwgc3RyaW5nIGRlbCkgeworICBpbnQgcywgdDsKKyAgc3RyaW5nICpzdHJzOworCisgIGlmICghc3RyaW5ncChzdHIpKSB7CisgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigKKyAgICAgICAgICJJbnZhbGlkIGFyZ3VtZW50IDEgdG8gb2xkX2V4cGxvZGUoKSEgRXhwZWN0ZWQgPHN0cmluZz4sIGdvdDogIgorICAgICAgICAgIiUuMzBPXG4iLHN0cikpOworICB9CisgIGlmICghc3RyaW5ncChkZWwpKSB7CisgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigKKyAgICAgICAgICJJbnZhbGlkIGFyZ3VtZW50IDIgdG8gb2xkX2V4cGxvZGUoKSEgRXhwZWN0ZWQgPHN0cmluZz4sIGdvdDogIgorICAgICAgICAgIiUuMzBPXG4iLGRlbCkpOworICB9CisgIGlmKGRlbCA9PSAiIikKKyAgICByZXR1cm4gKHtzdHJ9KTsKKyAgc3Rycz1lZnVuOjpleHBsb2RlKHN0ciwgZGVsKTsKKyAgdD1zaXplb2Yoc3RycyktMTsKKyAgd2hpbGUoczw9dCAmJiBzdHJzW3MrK10gPT0gIiIpO3MtLTsKKyAgd2hpbGUodD49MCAmJiBzdHJzW3QtLV0gPT0gIiIpO3QrKzsKKyAgaWYoczw9dCkKKyAgICByZXR1cm4gc3Ryc1tzLi50XTsKKyAgcmV0dXJuICh7fSk7Cit9CisKK2ludCBmaWxlX3RpbWUoc3RyaW5nIHBhdGgpIHsKKyAgbWl4ZWQgKnY7CisKKyAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgaWYgKHNpemVvZih2PWdldF9kaXIocGF0aCxHRVRESVJfREFURVMpKSkgcmV0dXJuIHZbMF07CisgIHJldHVybigwKTsgLy9zb25zdAorfQorCisvLyAqIEJlaSA1MGsgR3JvZXNzZSBMb2ctRmlsZSByb3RpZXJlbgordmFyYXJncyBpbnQgbG9nX2ZpbGUoc3RyaW5nIGZpbGUsIHN0cmluZyB0eHQsIGludCBzaXplX3RvX2JyZWFrKSB7CisgIG1peGVkICpzdDsKKworICBmaWxlPSIvbG9nLyIrZmlsZTsKKyAgZmlsZT1pbXBsb2RlKChlZnVuOjpleHBsb2RlKGZpbGUsIi8iKS0oeyIuLiJ9KSksIi8iKTsKKy8vICB0ZWxsX29iamVjdChmaW5kX3BsYXllcigiam9mIiksc3ByaW50ZigiTE9HIEZJTEU6ICVPIC0+ICVPXG4iLHByZXZpb3VzX29iamVjdCgpLGZpbGUpKTsKKyAgaWYgKCFmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6Y2FsbF9vdGhlcixQTyksInNlY3VyZS9tYXN0ZXIiLC8vJykKKyAgICAgICAgICAgICAgInZhbGlkX3dyaXRlIixmaWxlLGdldGV1aWQoUE8pLCJsb2dfZmlsZSIsUE8pKQorICAgICAgcmV0dXJuIDA7CisgIGlmICggc2l6ZV90b19icmVhayA+PSAwICYgKAorICAgICAgc2l6ZW9mKHN0ID0gZ2V0X2RpcihmaWxlLDIpICkgJiYgc3RbMF0gPj0gKHNpemVfdG9fYnJlYWt8TUFYX0xPR19TSVpFKSkpCisgICAgICBjYXRjaChyZW5hbWUoZmlsZSwgZmlsZSArICIub2xkIik7cHVibGlzaCk7IC8qIE5vIHBhbmljIGlmIGZhaWx1cmUgKi8KKyAgcmV0dXJuKHdyaXRlX2ZpbGUoZmlsZSx0eHQpKTsKK30KKworLy8gKiBNYWdpZXItTGV2ZWwgYWJmcmFnZW4KK2ludCBxdWVyeV93aXpfbGV2ZWwobWl4ZWQgcGxheWVyKSB7CisgIHJldHVybiAoaW50KSIvc2VjdXJlL21hc3RlciItPnF1ZXJ5X3dpel9sZXZlbChwbGF5ZXIpOworfQorCisjaWZkZWYgX19BTElTVFNfXworLy8gKiBFbGVtZW50IGF1cyBBbGlzdCBsb2VzY2hlbiAoYnkga2V5KQorbWl4ZWQgKnJlbW92ZV9hbGlzdChtaXhlZCBrZXksbWl4ZWQgKmFsaXN0KQoreworICBpbnQgaSxqOworCisgIGlmICghcG9pbnRlcnAoYWxpc3QpIHx8ICFzaXplb2YoYWxpc3QpKQorICAgIHJldHVybiBhbGlzdDsKKyAgaWYgKCFwb2ludGVycChhbGlzdFswXSkpCisgIHsKKyAgICBpZiAoKGk9YXNzb2Moa2V5LGFsaXN0KSk8MCkKKyAgICAgIHJldHVybiBhbGlzdDsKKyAgICByZXR1cm4gYWxpc3RbMC4uaS0xXSthbGlzdFtpKzEuLl07CisgIH0KKyAgaSA9IGFzc29jKGtleSxhbGlzdFswXSk7CisgIGlmICgoaT1hc3NvYyhrZXksYWxpc3RbMF0pKTwwKQorICAgIHJldHVybiBhbGlzdDsKKyAgYWxpc3Q9YWxpc3RbMC4uXTsKKyAgZm9yIChqPXNpemVvZihhbGlzdCktMTtqPj0wO2otLSkKKyAgICBhbGlzdFtqXT1hbGlzdFtqXVswLi5pLTFdK2FsaXN0W2pdW2krMS4uXTsKKyAgcmV0dXJuIGFsaXN0OworfQorCisvLyAqIEVsZW1lbnQgYXVzIEFsaXN0IGxvZXNjaGVuIChieSBwb3MpCittaXhlZCAqZXhjbHVkZV9hbGlzdChpbnQgaSxtaXhlZCAqYWxpc3QpCit7CisgIGludCBqOworICBpZiAoIXBvaW50ZXJwKGFsaXN0KSB8fCAhc2l6ZW9mKGFsaXN0KSB8fCBpPDApCisgICAgcmV0dXJuIGFsaXN0OworICBpZiAoIXBvaW50ZXJwKGFsaXN0WzBdKSkKKyAgICByZXR1cm4gYWxpc3RbMC4uaS0xXSthbGlzdFtpKzEuLl07CisgIGFsaXN0PWFsaXN0WzAuLl07IC8qIENyZWF0ZSBQSFlTSUNBTCBjb3B5IG9mIGFsaXN0ICovCisgIGZvciAoaj1zaXplb2YoYWxpc3QpLTE7aj49MDtqLS0pCisgICAgYWxpc3Rbal09YWxpc3Rbal1bMC4uaS0xXSthbGlzdFtqXVtpKzEuLl07CisgIHJldHVybiBhbGlzdDsgLyogb3JkZXJfYWxpc3QgaXMgTk9UIG5lY2Vzc2FyeSAtIHNlZSAvZG9jL0xQQy9hbGlzdCAqLworfQorI2VuZGlmIC8vIF9fQUxJU1RTX18KKworLy8gKiBHZXJtYW4gdmVyc2lvbiBvZiBjdGltZSgpCisjZGVmaW5lIFRBR0UgKHsiU29uIiwiTW9uIiwiRGllIiwiTWl0IiwiRG9uIiwiRnJlIiwiU2FtIn0pCisjZGVmaW5lIE1PTkFURSAoeyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYWkiLCJKdW4iLCJKdWwiLCJBdWciLFwKKyAgICAgICAgICAgICAgICAgIlNlcCIsIk9rdCIsIk5vdiIsIkRleiJ9KQorc3RyaW5nIGR0aW1lKGludCB3YW5uKSB7CisgIAorICBpZiAod2FubiA9PSBkdGltZV9jYWNoZVswXSkKKyAgICByZXR1cm4oZHRpbWVfY2FjaGVbMV0pOworCisgIGludCAqbHQgPSBsb2NhbHRpbWUod2Fubik7CisgIHJldHVybiBzcHJpbnRmKCIlcywgJTJkLiAlcyAlZCwgJTAyZDolMDJkOiUwMmQiLAorICAgICAgVEFHRVtsdFtUTV9XREFZXV0sIGx0W1RNX01EQVldLCBNT05BVEVbbHRbVE1fTU9OXV0sIAorICAgICAgbHRbVE1fWUVBUl0sbHRbVE1fSE9VUl0sIGx0W1RNX01JTl0sIGx0W1RNX1NFQ10pOworfQorCisvLyB3ZW5uIHN0cmZ0aW1lIGltIERyaXZlciBuaWNodCBleGlzdGllcnQsIGlzdCBkaWVzIGhpZXIgZWluIEFsaWFzIGF1ZiBkdGltZSgpLAorLy8gendhciBzdGltbXQgZGFzIEZvcm1hdCBkYW5uIG5pY2h0LCBhYmVyIGRpZSBNdWRsaWIgYnVnZ3QgbmljaHQgdW5kIHNjaHJlaWJ0CisvLyBlaW4gb3JkZW50bGljaGVzIERhdHVtL1VocnplaXQuCisjaWYgIV9fRUZVTl9ERUZJTkVEX18oc3RyZnRpbWUpCit2YXJhcmdzIHN0cmluZyBzdHJmdGltZShtaXhlZCBmbXQsIGludCBjbG9jaywgaW50IGxvY2FsaXplZCkgeworICBpZiAoaW50cChjbG9jaykgJiYgY2xvY2sgPj0gMCkKKyAgICByZXR1cm4gZHRpbWUoY2xvY2spOworICBlbHNlIGlmIChpbnRwKGZtdCkgJiYgZm10ID49IDApCisgICAgcmV0dXJuIGR0aW1lKGZtdCk7CisgIAorICByZXR1cm4gZHRpbWUodGltZSgpKTsKK30KKyNlbmRpZiAvLyFfX0VGVU5fREVGSU5FRF9fKHN0cmZ0aW1lKQorCisvLyAqIFNodXRkb3duIG1pdCB6dXNhZXR6bGljaGVtIGxvZ2dpbmcKK25vbWFzayBpbnQgc2h1dGRvd24oc3RyaW5nIHJlYXNvbikKK3sKKyAgc3RyaW5nIG5hbWU7CisgIHN0cmluZyBvYm5hbWU7CisgIHN0cmluZyBvdXRwdXQ7CisKKyAgaWYgKCFyZWFzb24pCisgICAgcmV0dXJuIDA7CisgIGlmICggIUFSQ0hfU0VDVVJJVFkgJiYgZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKSE9Uk9PVElEICYmCisgICAgICAgICAgb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpIT0iL29iai9zaHV0IiApCisgIHsKKyAgICB3cml0ZSgiWW91IGhhdmUgbm8gcGVybWlzc2lvbiB0byBzaHV0IGRvd24gdGhlIGdhbWVkcml2ZXIhXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoKHRoaXNfaW50ZXJhY3RpdmUoKSkmJihuYW1lPWdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpKSkKKyAgeworICAgIG5hbWU9Y2FwaXRhbGl6ZShuYW1lKTsKKyAgICBmaWx0ZXIodXNlcnMoKSwjJ3RlbGxfb2JqZWN0LC8vJworICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShuYW1lKSsiIGZhZWhydCBkYXMgU3BpZWwgaGVydW50ZXIhXG4iKTsKKyAgfQorICBlbHNlCisgICAgbmFtZT0iQU5PTllNT1VTIjsKKyAgaWYgKHByZXZpb3VzX29iamVjdCgpKSBvYm5hbWU9Y2FwaXRhbGl6ZShnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpKTsKKyAgb3V0cHV0PW5hbWU7CisgIGlmIChvYm5hbWUgJiYgbmFtZSE9b2JuYW1lKSBvdXRwdXQ9b3V0cHV0KyIgKCIrb2JuYW1lKyIpIjsKKyAgaWYgKHByZXZpb3VzX29iamVjdCgpJiZvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSk9PSIvb2JqL3NodXQiKXsKKyAgICBvdXRwdXQrPSIgZmFlaHJ0IGRhcyBTcGllbCB2aWEgQXJtYWdlZGRvbiBoZXJ1bnRlci5cbiI7CisgICAgb3V0cHV0PWR0aW1lKHRpbWUoKSkrIjogIitvdXRwdXQ7CisgICAgbG9nX2ZpbGUoIkdBTUVfTE9HIixvdXRwdXQrIlxuIiwtMSk7CisgICAgZWZ1bjo6c2h1dGRvd24oKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBvdXRwdXQ9Y3RpbWUodGltZSgpKSsiOiAiK291dHB1dCsiIGZhZWhydCBkYXMgU3BpZWwgaGVydW50ZXIuXG4iOworICBvdXRwdXQrPSIgICAgR3J1bmQ6ICIrcmVhc29uOworICBsb2dfZmlsZSgiR0FNRV9MT0ciLG91dHB1dCsiXG4iLC0xKTsKKyAgZWZ1bjo6c2h1dGRvd24oKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vICogbG93ZXJjaGFyCisKK2ludCBsb3dlcmNoYXIoaW50IGNoYXIpIHsKKyAgaWYgKGNoYXI8J0EnIHx8IGNoYXI+J1onKSByZXR1cm4gY2hhcjsKKyAgcmV0dXJuIGNoYXIrMzI7Cit9CisKKy8vICogdXBwZXJzdHJpbmcKKworc3RyaW5nIHVwcGVyc3RyaW5nKHN0cmluZyBzKQoreworI2lmIF9fRUZVTl9ERUZJTkVEX18odXBwZXJfY2FzZSkKKyAgcmV0dXJuKHVwcGVyX2Nhc2UocykpOworI2Vsc2UKKyAgaW50IGk7CisgIGlmICghc3RyaW5ncChzKSkgcmV0dXJuIDA7CisgIGZvciAoaT1zaXplb2YocyktMTtpPj0wO2ktLSkgc1tpXT0oKHNbaV08J2EnfHxzW2ldPid6Jyk/c1tpXTpzW2ldLTMyKTsKKyAgcmV0dXJuIHM7CisjZW5kaWYKK30KKworLy8gKiBsb3dlcnN0cmluZworCitzdHJpbmcgbG93ZXJzdHJpbmcoc3RyaW5nIHMpCit7CisgIGlmICghc3RyaW5ncChzKSkgcmV0dXJuIDA7CisgIHJldHVybiBsb3dlcl9jYXNlKHMpOworfQorCisKKy8vICogR0QgdmVyc2lvbgorc3RyaW5nIHZlcnNpb24oKQoreworICByZXR1cm4gX19WRVJTSU9OX187Cit9CisKKy8vICogYnJlYWtfc3RyaW5nCisvLyBzdHJldGNoKCkgLS0gc3RyZXRjaCBhIGxpbmUgdG8gZmlsbCBhIGdpdmVuIHdpZHRoIAorcHJpdmF0ZSBzdHJpbmcgc3RyZXRjaChzdHJpbmcgcywgaW50IHdpZHRoKSB7CisgIGludCBsZW49c2l6ZW9mKHMpOworICBpZiAobGVuPT13aWR0aCkgcmV0dXJuIHM7CisKKyAgLy8gcmVpbmUgTGVlcnplaWxlbiwgZGlyZWt0IHp1cnVlY2tnZWJlbgorICBzdHJpbmcgdHJpbW1lZD10cmltKHMsVFJJTV9MRUZULCIgIik7CisgIGlmICh0cmltbWVkPT0iIikgcmV0dXJuIHM7IAorICBpbnQgc3RhcnRfc3BhY2VzID0gbGVuIC0gc2l6ZW9mKHRyaW1tZWQpOworCisgIHN0cmluZyogd29yZHMgPSBleHBsb2RlKHRyaW1tZWQsICIgIik7CisgIC8vIGRlciBsZXR6dGUga3JpZWd0IGtlaW5lIFNwYWNlcworICBpbnQgd29yZF9jb3VudD1zaXplb2Yod29yZHMpIC0gMTsKKyAgLy8gd2VubiBaZWlsZSBudXIgYXVzIGVpbmVtIFdvcnQsIHdpcmQgZGFzIFdvcnQgenVydWVja2dlZ2ViZW4KKyAgaWYgKCF3b3JkX2NvdW50KQorICAgIHJldHVybiAiICIqc3RhcnRfc3BhY2VzICsgd29yZHNbMF07CisKKyAgaW50IHNwYWNlX2NvdW50ID0gd2lkdGggLSBsZW47CisKKyAgaW50IHNwYWNlX3Blcl93b3JkPSh3b3JkX2NvdW50K3NwYWNlX2NvdW50KSAvIHdvcmRfY291bnQ7CisgIC8vIEFuei5Xb2VydGVyIG1pdCBadXNhdHotU3BhY2UKKyAgaW50IHJlc3Q9KHdvcmRfY291bnQrc3BhY2VfY291bnQpICUgd29yZF9jb3VudDsgCisgIC8vIFJlc3QtU3BhY2VzIFZlcnRlaWxlbgorICBmb3JlYWNoIChpbnQgcG9zIDogcmVzdCkgd29yZHNbcG9zXSs9IiAiOworICByZXR1cm4gKCIgIipzdGFydF9zcGFjZXMpICsgaW1wbG9kZSggd29yZHMsICIgIipzcGFjZV9wZXJfd29yZCApOworfQorCisvLyBhdXMgR2VzY2h3aW5kaWdrZWl0c2dydWVuZGVuIGhhdCBkZXIgQmxvY2tzYXR6IGZ1ZXIgYnJlYWtfc3RyaW5nIGVpbmUKKy8vIGVpZ2VuZSBGdW5rdGlvbiBiZWtvbW1lbjoKK3ByaXZhdGUgdmFyYXJncyBzdHJpbmcgYmxvY2tfc3RyaW5nKHN0cmluZyBzLCBpbnQgd2lkdGgsIGludCBmbGFncykgeworICAvLyB3ZW5uIEJTX0xFQVZFX01ZX0xGUywgYWJlciBrZWluIEJTX05PX1BBUklOREVOVCwgZGFubiB3ZXJkZW4gWmVpbGVuIG1pdAorICAvLyBlaW5lbSBMZWVyemVpY2hlbiBiZWdvbm5lbi4KKyAgLy8gQlRXOiBXZW5uICFCU19MRUFWRV9NWV9MRlMsIGhhdCBkZXIgQXVmcnVmZXIgYmVyZWl0cyBhbGxlIFxuIGR1cmNoICIgIgorICAvLyBlcnNldHp0LgorICBpZiAoIChmbGFncyAmIEJTX0xFQVZFX01ZX0xGUykKKyAgICAgICYmICEoZmxhZ3MgJiBCU19OT19QQVJJTkRFTlQpKQorICB7CisgICAgICBzID0gIiAiK3JlZ3JlcGxhY2UocywiXG4iLCJcbiAiLDEpOworICB9CisKKyAgLy8gc3ByaW50ZiBmdWVsbHQgZGllIGxldHp0ZSBaZWlsZSBhdWYgZGllIEZlbGRicmVpdGUgKGhpZXIgYWxzbworICAvLyBaZWlsZW5icmVpdGUpIG1pdCBGdWVsbHplaWNoZW4gYXVmLCB3ZW5uIHNpZSBOSUNIVCBtaXQgXG4gdW1nZWJyb2NoZW4KKyAgLy8gaXN0LiBFcyB3aXJkIGFuIGRpZSBsZXR6dGUgWmVpbGUgYWJlciBrZWluIFplaWxlbnVtYnJ1Y2ggYW5nZWhhZW5ndC4KKyAgLy8gRWlnZW50bGljaCBpc3QgZGFzIEF1ZmZ1ZWxsZW4gZG9vZiwgYWJlciB2ZXJtdXRsaWNoIGlzdCBlcyB1bm5vZXRpZywgZXMKKyAgLy8gd2llZGVyIHJ1ZWNrZ2FlbmdpZyB6dSBtYWNoZW4uCisgIHMgPSBzcHJpbnRmKCAiJS0qPXMiLCB3aWR0aCwgcyk7CisKKyAgc3RyaW5nICp0bXA9ZXhwbG9kZShzLCAiXG4iKTsKKyAgLy8gTnVyIHdlbm4gcyBtZWhyemVpbGlnIGlzdCwgQmxvY2tzYXR6IGRyYXVzIG1hY2hlbi4gRGllIGxldHp0ZSBaZWlsZSB3aXJkCisgIC8vIG5hdHVlcmxpY2ggbmljaHQgZ2VkZWhudC4gU2llIGlzdCBkYWZ1ZXIgc2Nob24gdm9uIHNwcmludGYoKSBhdWZnZWZ1ZWxsdAorICAvLyB3b3JkZW4uIEJUVzogRGllIGxldHp0ZSBaZWlsZSBlbmRldCB1LlUuIG5vY2ggbmljaHQgbWl0IGVpbmVtIFxuIChiencuCisgIC8vIG51ciBkYW5uLCB3ZW5uIEJTX0xFQVZFX01ZX0xGUyB1bmQgZGVyIHVlYmVyZ2ViZW5lIFRleHQgc2Nob24gbmVuIFxuIGFtCisgIC8vIEVuZGUgZGVyIGxldHp0ZW4gWmVpbGUgaGF0KSwgZGFzIG1hY2h0IGRlciBBdWZydWZlci4uLgorICBpZiAoc2l6ZW9mKHRtcCkgPiAxKQorICAgIHJldHVybiBpbXBsb2RlKCBtYXAoIHRtcFswLi48Ml0sICMnc3RyZXRjaC8qJyovLCB3aWR0aCApLCAiXG4iICkgCisgICAgICArICJcbiIgKyB0bXBbPDFdOworCisgIHJldHVybiBzOworfQorCitwdWJsaWMgdmFyYXJncyBzdHJpbmcgYnJlYWtfc3RyaW5nKHN0cmluZyBzLCBpbnQgdywgbWl4ZWQgaW5kZW50LCBpbnQgZmxhZ3MpCit7CisgICAgaWYgKCAhcyB8fCBzID09ICIiICkgcmV0dXJuICIiOworCisgICAgaWYgKCAhdyApIHc9Nzg7CisKKyAgICBpZiggaW50cChpbmRlbnQpICkKKyAgICAgICBpbmRlbnQgPSBpbmRlbnQgPyAiICIqaW5kZW50IDogIiI7CisKKyAgICBpbnQgaW5kZW50bGVuPXN0cmluZ3AoaW5kZW50KSA/IHNpemVvZihpbmRlbnQpIDogMDsKKworICAgIGlmIChpbmRlbnRsZW4+dykgeworICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoImJyZWFrX3N0cmluZzogaW5kZW50IGxvbmdlciAlZCB0aGFuIHdpZHRoICVkXG4iLAorICAgICAgICAgICAgICAgICAgaW5kZW50bGVuLHcpKTsKKyAgICAgIC8vIHc9KChpbmRlbnRsZW4vdykrMSkqdzsKKyAgICB9CisKKyAgICBpZiAoIShmbGFncyAmIEJTX0xFQVZFX01ZX0xGUykpIAorICAgICAgcz1yZWdyZXBsYWNlKCBzLCAiXG4iLCAiICIsIDEgKTsKKworICAgIGlmICggZmxhZ3MgJiBCU19TSU5HTEVfU1BBQ0UgKQorICAgICAgIHMgPSByZWdyZXBsYWNlKCBzLCAiKF58XG58ICkgICoiLCAiXFwxIiwgMSApOworIAorICAgIHN0cmluZyBwcmVmaXg9IiI7CisgICAgaWYgKGluZGVudGxlbiAmJiBmbGFncyAmIEJTX1BSRVBFTkRfSU5ERU5UKSB7CisgICAgICBpZiAoaW5kZW50bGVuK3NpemVvZihzKSA+IHcgfHwgCisgICAgICAgICAoZmxhZ3MgJiBCU19MRUFWRV9NWV9MRlMpICYmIHN0cnN0cihzLCJcbiIpPi0xKSB7CisgICAgICAgcHJlZml4PWluZGVudCsiXG4iOworICAgICAgIGluZGVudD0oZmxhZ3MgJiBCU19OT19QQVJJTkRFTlQpID8gIiIgOiAiICI7CisgICAgICAgaW5kZW50bGVuPXNpemVvZihpbmRlbnQpOworICAgICAgfQorICAgIH0KKworICAgIGlmICggZmxhZ3MgJiBCU19CTE9DSyApIHsKKyAgICAgIC8qCisgICAgICAgICAgIHMgPSBpbXBsb2RlKCBtYXAoIGV4cGxvZGUoIHMsICJcbiIgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjJ2Jsb2NrX3N0cmluZywgdywgaW5kZW50bGVuLCBmbGFncyksCisgICAgICAgICAgICAgICAgICAgICAgIiIgKTsKKyAgICAgICovCisgICAgICBzID0gYmxvY2tfc3RyaW5nKCBzICwgdyAtIGluZGVudGxlbiwgZmxhZ3MgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBzID0gc3ByaW50ZigiJS0xLio9cyIsdy1pbmRlbnRsZW4scyk7CisgICAgfQorICAgIGlmICggc1s8MV0gIT0gJ1xuJyApIHMgKz0gIlxuIjsKKworICAgIGlmICggIWluZGVudGxlbiApIHJldHVybiBwcmVmaXggKyBzOworICAgIAorICAgIHN0cmluZyBpbmRlbnQyID0gKCBmbGFncyAmIEJTX0lOREVOVF9PTkNFICkgPyAoIiAiKmluZGVudGxlbikgOmluZGVudDsKKyAgICAgIAorICAgIHJldHVybiBwcmVmaXggKyBpbmRlbnQgKyAKKyAgICAgIHJlZ3JlcGxhY2UoIHNbMC4uPDJdLCAiXG4iLCAiXG4iK2luZGVudDIsIDEgKSArICJcbiI7CisgICAgICAvKgorICAgICAgIHN0cmluZyAqYnVmOworCisgICAgICAgYnVmID0gZXhwbG9kZSggcywgIlxuIiApOworICAgICAgIHJldHVybiBwcmVmaXggKyBpbmRlbnQgKyBpbXBsb2RlKCBidWZbMC4uPDJdLCAiXG4iK2luZGVudDIgKSArIGJ1Zls8MV0gKyAiXG4iOworICAgICAgKi8KK30KKworLy8gKiBFbGVtZW50ZSBhdXMgbWFwcGluZyBsb2VzY2hlbiAtIG1hcHBpbmcgdm9yaGVyIGtvcGllcmVuCisKK21hcHBpbmcgbV9jb3B5X2RlbGV0ZShtYXBwaW5nIG0sIG1peGVkIGtleSkgeworICByZXR1cm4gbV9kZWxldGUoY29weShtKSwga2V5KTsKK30KKworLy8gKiB0aW1lcworaW50IGxhc3RfcmVib290X3RpbWUoKQoreworICByZXR1cm4gX19CT09UX1RJTUVfXzsKK30KKworaW50IGZpcnN0X2Jvb3RfdGltZSgpCit7CisgIHJldHVybiA3MDE1MTc2MDA7Cit9CisKK2ludCBleGlzdF9kYXlzKCkKK3sKKyAgcmV0dXJuICgoKHRpbWUoKS1maXJzdF9ib290X3RpbWUoKSkvODY0MCkrNSkvMTA7Cit9CisKKy8vICogdXB0aW1lIDopCitzdHJpbmcgdXB0aW1lKCkKK3sKKyAgaW50IHQ7CisgIGludCB0bXA7CisgIHN0cmluZyBzOworCisgIHQ9dGltZSgpLV9fQk9PVF9USU1FX187CisgIHM9IiI7CisgIGlmICh0Pj04NjQwMCkKKyAgICBzKz1zcHJpbnRmKCIlZCBUYWclcywgIix0bXA9dC84NjQwMCwodG1wPT0xPyIiOiJlIikpOworICBpZiAodD49MzYwMCkKKyAgICBzKz1zcHJpbnRmKCIlZCBTdHVuZGUlcywgIix0bXA9KHQ9dCU4NjQwMCkvMzYwMCwodG1wPT0xPyIiOiJuIikpOworICBpZiAodD42MCkKKyAgICBzKz1zcHJpbnRmKCIlZCBNaW51dGUlcyB1bmQgIix0bXA9KHQ9dCUzNjAwKS82MCwodG1wPT0xPyIiOiJuIikpOworICByZXR1cm4gcytzcHJpbnRmKCIlZCBTZWt1bmRlJXMiLHQ9dCU2MCwodD09MT8iIjoibiIpKTsKK30KKworLy8gKiBXYXMgdHVuIGJlaSAnZGFuZ2xpbmcnIGxmdW4tY2xvc3VyZXMgPwordm9pZCBkYW5nbGluZ19sZnVuX2Nsb3N1cmUoKSB7CisgIHJhaXNlX2Vycm9yKCJkYW5nbGluZyBsZnVuIGNsb3N1cmVcbiIpOworfQorCisvLyAqIFNwZXJyZW4gYXVzc2VyIGZ1ZXIgbWFzdGVyL3NpbXVsX2VmdW4KKworI2lmIF9fRUZVTl9ERUZJTkVEX18oc2V0X2Vudmlyb25tZW50KQorbm9tYXNrIHZvaWQgc2V0X2Vudmlyb25tZW50KG9iamVjdCBvMSwgb2JqZWN0IG8yKSB7CisgIHJhaXNlX2Vycm9yKCJBdmFpbGFibGUgb25seSBmb3Igcm9vdFxuIik7Cit9CisjZW5kaWYKKworbm9tYXNrIHZvaWQgc2V0X3RoaXNfcGxheWVyKG9iamVjdCBwbCkgeworICByYWlzZV9lcnJvcigiQXZhaWxhYmxlIG9ubHkgZm9yIHJvb3RcbiIpOworfQorCisjaWYgX19FRlVOX0RFRklORURfXyhleHBvcnRfdWlkKQorbm9tYXNrIHZvaWQgZXhwb3J0X3VpZChvYmplY3Qgb2IpIHsKKyAgcmFpc2VfZXJyb3IoIkF2YWlsYWJsZSBvbmx5IGZvciByb290XG4iKTsKK30KKyNlbmRpZgorCisvLyAqIEpldHp0IGF1Y2ggY2xvc3VyZXMKK2ludCBwcm9jZXNzX2ZsYWc7CisKK3B1YmxpYyBub21hc2sgaW50IHByb2Nlc3NfY2FsbCgpCit7CisgIGlmIChwcm9jZXNzX2ZsYWc+MCkKKyAgICByZXR1cm4gcHJvY2Vzc19mbGFnOworICBlbHNlIHJldHVybigwKTsKK30KKworcHJpdmF0ZSBub21hc2sgc3RyaW5nIF9wcm9jZXNzX3N0cmluZyhzdHJpbmcgc3RyLG9iamVjdCBwbykgeworICAgICAgICAgICAgICBzZXRfdGhpc19vYmplY3QocG8pOworICAgICAgICAgICAgICByZXR1cm4oZWZ1bjo6cHJvY2Vzc19zdHJpbmcoc3RyKSk7Cit9CisKK25vbWFzayBzdHJpbmcgcHJvY2Vzc19zdHJpbmcoIG1peGVkIHN0ciApCit7CisgIHN0cmluZyB0bXAsIGVycjsKKyAgaW50IGZsYWc7IAorCisgIGlmICggY2xvc3VyZXAoc3RyKSApIHsKKyAgICAgIHNldF90aGlzX29iamVjdCggcHJldmlvdXNfb2JqZWN0KCkgKTsKKyAgICAgIHJldHVybiBmdW5jYWxsKHN0cik7CisgIH0KKyAgZWxzZSBpZiAoc3RyPT0wKQorICAgICAgcmV0dXJuKChzdHJpbmcpc3RyKTsKKyAgZWxzZSBpZiAoICFzdHJpbmdwKHN0cikgKSB7CisgICAgICByZXR1cm4gdG9fc3RyaW5nKHN0cik7CisgIH0KKworICBpZiAoICEoZmxhZyA9IHByb2Nlc3NfZmxhZyA+IHRpbWUoKSAtIDYwKSkgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIHByb2Nlc3NfZmxhZz10aW1lKCk7CisKKyAgZXJyID0gY2F0Y2godG1wID0gZnVuY2FsbCgjJ19wcm9jZXNzX3N0cmluZyxzdHIscHJldmlvdXNfb2JqZWN0KCkpOyBwdWJsaXNoKTsKKworICBpZiAoICFmbGFnICkKKyAgICBwcm9jZXNzX2ZsYWc9MDsKKworICBpZiAoZXJyKSB7CisgICAgLy8gVmVyYXJiZWl0dW5nIGFiYnJlY2hlbgorICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgcmFpc2VfZXJyb3IoZXJyKTsKKyAgfQorICByZXR1cm4gdG1wOworfQorCisvLyAnbWtkaXIgLXAnIC0gZXJ6ZXVndCBlaW5lIGtvbXBsZXR0ZSBIaWVyYXJjaGllIHZvbiBWZXJ6ZWljaG5pc3Nlbi4KKy8vIHdlbm4gZGFzIFZlcnplaWNobmlzIGFuZ2VsZWd0IHd1cmRlIG9kZXIgc2Nob24gZXhpc3RpZXJ0LCB3aXJkIDEKKy8vIHp1cnVlY2tnZWxpZWZlcnQsIHNvbnN0IDAuCisvLyBXaXJmdCBlaW5lbiBGZWhsZXIsIHdlbm4gZGFzIGFuZ2ViZW5lIFZlcnplaWNobmlzIG5pY2h0IGFic29sdXQgaXN0IQorcHVibGljIGludCBta2RpcnAoc3RyaW5nIGRpcikgeworICAvLyB3ZW5uIGVzIG51ciBrZWluZW4gZnVlaHJlbmRlbiAvIGdpYnQsIGlzdCBkYXMgZWluIEZlaGxlci4KKyAgaWYgKHN0cnN0cihkaXIsICIvIikgIT0gMCkKKyAgICByYWlzZV9lcnJvcigibWtkaXJwKCk6IFBmYWQgaXN0IG5pY2h0IGFic29sdXRlLlxuIik7CisgIC8vIGN1dCBvZmYgdHJhaWxpbmcgLy4uLgorICBpZiAoZGlyWzwxXT09Jy8nKQorICAgICAgZGlyID0gZGlyWzAuLjwyXTsKKworICBpbnQgZnN0YXQgPSBmaWxlX3NpemUoZGlyKTsKKyAgLy8gd2VubiBlcyBzY2hvbiBleGlzdGllcnQsIHR1biB3aXIgZWluZmFjaCBzbywgYWxzIGhhZXR0ZW4gd2lyIGVzIGFuZ2VsZWd0LgorICBpZiAoZnN0YXQgPT0gRlNJWkVfRElSKQorICAgIHJldHVybiAxOworICAvLyB3ZW5uIHNjaG9uIG5lIERhdGVpIGV4aXN0aWVydCwgZ2VodCBlcyBuaWNodC4KKyAgaWYgKGZzdGF0ICE9IEZTSVpFX05PRklMRSkKKyAgICByZXR1cm4gMDsKKyAgLy8gd2VubiBlcyBudXIgZWluZW4gLyBnaWJ0IChkZW4gZnVlaHJlbmRlbiksIGRhbm4gaXN0IGVzIGVpbgorICAvLyB0b3BsZXZlbC12ZXJ6ZWljaG5pcywgd2FzIGRpcmVrdCBhbmdlbGVndCB3aXJkLgorICBpZiAoc3RycnN0cihkaXIsIi8iKT09MCkgeworICAgIHJldHVybiBmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6bWtkaXIsIHByZXZpb3VzX29iamVjdCgpKSwgZGlyKTsKKyAgfQorCisgIC8vIG1rZGlyKCkgbmljaHQgZGlyZWt0IHJ1ZmVuLCBzb25kZXJuIHZvcmhlciBhbHMgY2xvc3VyZSBhbnMgYXVmcnVmZW5kZQorICAvLyBPYmpla3QgYmluZGVuLiBTb25zdCBsYWV1ZnQgZGllIFJlY2h0ZXBydWVmdW5nIGluIHZhbGlkX3dyaXRlKCkgaW0gTWFzdGVyCisgIC8vIHVudGVyIGRlciBBbm5haG1lLCBkYXNzIGRpZSBzaW11bF9lZnVuLmMgbWl0IGlocmVyIHJvb3QgaWQgd2FzIHdpbGwuCisKKyAgLy8gamV0enQgcmVrdXJzaXYgZGllIFZlcnplaWNobmlzaGllcmFyY2hpZSBhbmxlZ2VuLiBXZW5uIGRhcyBlcmZvbGdyZWljaAorICAvLyBpc3QsIGRhbm4ga29lbm5lbiB3aXIgamV0enQgbWl0IG1rZGlyIGRhcyB0aWVmc3RlIFZlcnplaWNobmlzIGFubGVnZW4KKyAgaWYgKG1rZGlycChkaXJbMC4uc3RycnN0cihkaXIsIi8iKS0xXSkgPT0gMSkKKyAgICByZXR1cm4gZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46Om1rZGlyLCBwcmV2aW91c19vYmplY3QoKSksIGRpcik7Cit9CisKKworLy8gKiBQcm9wZXJ0aWVzIGdnZnMuIG1pdHNwZWljaGVybgorbWl4ZWQgc2F2ZV9vYmplY3QobWl4ZWQgbmFtZSkKK3sKKyAgbWFwcGluZyBwcm9wZXJ0aWVzOworICBtYXBwaW5nIHNhdmU7CisgIG1peGVkIGluZGV4LCByZXM7CisgIGludCBpOworCisgIC8vIG51ciBTdHJpbmdzIHVuZCAwIHp1bGFzc2VuCisgIGlmICgoIXN0cmluZ3AobmFtZSkgfHwgIXNpemVvZihuYW1lKSkgJiYgCisgICAgICAoIWludHAobmFtZSkgfHwgbmFtZSE9MCkpIHsKKyAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKAorICAgICAgICAgIk9ubHkgbm9uLWVtcHR5IHN0cmluZ3MgYW5kIDAgbWF5IGJlIHVzZWQgYXMgZmlsZW5hbWUgaW4gIgorICAgICAgICAgInNlZnVuOjpzYXZlX29iamVjdCgpISBBcmd1bWVudCB3YXMgJU9cbiIsbmFtZSkpOworICB9CisKKyAgc2F2ZSA9IG1fYWxsb2NhdGUoMCwgMik7CisgIHByb3BlcnRpZXMgPSAobWFwcGluZylwcmV2aW91c19vYmplY3QoKS0+UXVlcnlQcm9wZXJ0aWVzKCk7CisKKyAgaWYobWFwcGluZ3AocHJvcGVydGllcykpCisgIHsKKyAgICAvLyBkZWxldGUgYWxsIGVudHJpZXMgaW4gbWFwcGluZyBwcm9wZXJ0aWVzIHdpdGhvdXQgU0FWRSBmbGFnIQorICAgIGluZGV4ID0gbV9pbmRpY2VzKHByb3BlcnRpZXMpOworICAgIGZvcihpID0gc2l6ZW9mKGluZGV4KS0xOyBpPj0wO2ktLSkKKyAgICB7CisgICAgICBpZihwcm9wZXJ0aWVzW2luZGV4W2ldLCBGX01PREVdICYgU0FWRSkKKyAgICAgIHsKKyAgICAgICBzYXZlW2luZGV4W2ldXSA9IHByb3BlcnRpZXNbaW5kZXhbaV1dOworICAgICAgIHNhdmVbaW5kZXhbaV0sIEZfTU9ERV0gPQorICAgICAgIHByb3BlcnRpZXNbaW5kZXhbaV0sIEZfTU9ERV0gJgorICAgICAgICAgICAgICAgICAgICAofihTRVRNTk9URk9VTkR8UVVFUllNTk9URk9VTkR8UVVFUllDQUNIRUR8U0VUQ0FDSEVEKSk7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2Ugc2F2ZSA9IChbXSk7CisKKyAgLy8gc2F2ZSBvYmplY3QhCisgIHByZXZpb3VzX29iamVjdCgpLT5fc2V0X3NhdmVfZGF0YShzYXZlKTsKKyAgLy8gZm9ybWF0OiB3aWUgZGVmaW5pZXJ0IGluIGNvbmZpZy5oCisgIGlmIChzdHJpbmdwKG5hbWUpKQorICAgIHJlcyA9IGZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjpzYXZlX29iamVjdCwgcHJldmlvdXNfb2JqZWN0KCkpLCBuYW1lLAorICAgICAgIF9fTElCX19TQVZFX0ZPUk1BVF9WRVJTSU9OX18pOworICBlbHNlCisgICAgcmVzID0gZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46OnNhdmVfb2JqZWN0LCBwcmV2aW91c19vYmplY3QoKSksCisgICAgICAgX19MSUJfX1NBVkVfRk9STUFUX1ZFUlNJT05fXyk7CisgIHByZXZpb3VzX29iamVjdCgpLT5fc2V0X3NhdmVfZGF0YSgwKTsKKworI2lmZGVmIElPU1RBVFMKKyAgLy8gU3RhdHMuLi4KKyAgc3RydWN0IGlvc3RhdF9zIHN0YXQgPSAoPGlvc3RhdF9zPik7CisgIHN0YXQtPm9uYW1lID0gb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpOworICBzdGF0LT50aW1lID0gdGltZSgpOworICAvL3N0YXQtPnNpemUgPSAoaW50KW9iamVjdF9pbmZvKHByZXZpb3VzX29iamVjdCgpLE9JTkZPX01FTU9SWSwKKyAgLy8gICAgT0lNX1RPVEFMX0RBVEFfU0laRSk7CisgIGlmIChzdHJpbmdwKG5hbWUpKQorICAgICAgc3RhdC0+c2l6ZSA9IGZpbGVfc2l6ZShuYW1lICsgIi5vIik7CisgIGVsc2UKKyAgICAgIHN0YXQtPnNpemVvZihyZXMpOworICAvL2RlYnVnX21lc3NhZ2UoInNhdmVvOiAiK3NhdmVvX3N0YXRbMF0rIlxuIik7CisgIHNhdmVvX3N0YXRbMV1bc2F2ZW9fc3RhdFswXV0gPSBzdGF0OworICBzYXZlb19zdGF0WzBdID0gKHNhdmVvX3N0YXRbMF0gKyAxKSAlIHNpemVvZihzYXZlb19zdGF0WzFdKTsKKyAgLy9kZWJ1Z19tZXNzYWdlKCJzYXZlbyAyOiAiK3NhdmVvX3N0YXRbMF0rIlxuIik7CisjZW5kaWYKKworICByZXR1cm4gcmVzOworfQorCisvLyAqIEF1Y2ggUHJvcGVydGllcyBsYWRlbgoraW50IHJlc3RvcmVfb2JqZWN0KHN0cmluZyBuYW1lKQoreworICBpbnQgcmVzdWx0OworICBtaXhlZCBpbmRleDsKKyAgbWl4ZWQgc2F2ZTsKKyAgbWFwcGluZyBwcm9wZXJ0aWVzOworICBpbnQgaTsKKyAgY2xvc3VyZSBjbDsKKworICAvLyBnZXQgYWN0dWFsIHByb3BlcnR5IHNldHRpbmdzIChieSBjcmVhdGUoKSkKKyAgcHJvcGVydGllcyA9IChtYXBwaW5nKXByZXZpb3VzX29iamVjdCgpLT5RdWVyeVByb3BlcnRpZXMoKTsKKworLy8gIERFQlVHKHNwcmludGYoIlJFU1RPUkUgJU9cbiIsbmFtZSkpOworICAvLyByZXN0b3JlIG9iamVjdAorICByZXN1bHQ9ZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46OnJlc3RvcmVfb2JqZWN0LCBwcmV2aW91c19vYmplY3QoKSksIG5hbWUpOworICAvLycpKQorICAvL19nZXRfc2F2ZV9kYXRhIGxpZWZlcnQgdGF0c2FlY2hsaWNoIG1peGVkIHp1cnVlY2ssIHdlbm4gZGFzIGF1Y2ggaW1tZXIgZWluIAorICAvL21hcHBpbmcgc2VpbiBzb2xsdGUuCisgIHNhdmUgPSAobWl4ZWQpcHJldmlvdXNfb2JqZWN0KCktPl9nZXRfc2F2ZV9kYXRhKCk7CisgIGlmKG1hcHBpbmdwKHNhdmUpKQorICB7CisgICAgaW5kZXggPSBtX2luZGljZXMoc2F2ZSk7CisgICAgZm9yKGkgPSBzaXplb2YoaW5kZXgpLTE7IGk+PTA7IGktLSkKKyAgICB7CisgICAgICBwcm9wZXJ0aWVzW2luZGV4W2ldXSA9IHNhdmVbaW5kZXhbaV1dOworICAgICAgcHJvcGVydGllc1tpbmRleFtpXSwgRl9NT0RFXSA9IHNhdmVbaW5kZXhbaV0sIEZfTU9ERV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmfihTRVRDQUNIRUR8UVVFUllDQUNIRUQpOworICAgIH0KKyAgfQorICBlbHNlIHByb3BlcnRpZXMgPSAoW10pOworCisgIC8vIHJlc3RvcmUgcHJvcGVydGllcworICBmdW5jYWxsKAorICAgICAgICAgIGJpbmRfbGFtYmRhKAorICAgICAgICAgICAgICAgICAgICAgdW5ib3VuZF9sYW1iZGEoKHsnYXJnfSksIC8vJ30pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHsjJ2NhbGxfb3RoZXIsKHsjJ3RoaXNfb2JqZWN0fSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldFByb3BlcnRpZXMiLCdhcmd9KSksLy8nKQorICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNfb2JqZWN0KCkpLHByb3BlcnRpZXMpOworICBwcmV2aW91c19vYmplY3QoKS0+X3NldF9zYXZlX2RhdGEoMCk7CisKKyNpZmRlZiBJT1NUQVRTCisgIC8vIFN0YXRzLi4uCisgIC8vZGVidWdfbWVzc2FnZSgicmVzdG9yZW86ICIrcmVzdG9yZW9fc3RhdFswXSsiXG4iKTsKKyAgc3RydWN0IGlvc3RhdF9zIHN0YXQgPSAoPGlvc3RhdF9zPik7CisgIHN0YXQtPm9uYW1lID0gb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpOworICBzdGF0LT50aW1lID0gdGltZSgpOworICAvL3N0YXQtPnNpemUgPSAoaW50KW9iamVjdF9pbmZvKHByZXZpb3VzX29iamVjdCgpLE9JTkZPX01FTU9SWSwKKyAgLy8gICAgT0lNX1RPVEFMX0RBVEFfU0laRSk7CisgIHN0YXQtPnNpemUgPSBmaWxlX3NpemUobmFtZSArICIubyIpOworICByZXN0b3Jlb19zdGF0WzFdW3Jlc3RvcmVvX3N0YXRbMF1dID0gc3RhdDsKKworICByZXN0b3Jlb19zdGF0WzBdID0gKHJlc3RvcmVvX3N0YXRbMF0gKyAxKSAlIHNpemVvZihyZXN0b3Jlb19zdGF0WzFdKTsKKyNlbmRpZgorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vICogSEIgZWluZXMgT2JqZWt0ZXMgZWluL2F1c3NjaGFsdGVuCitpbnQgc2V0X29iamVjdF9oZWFydF9iZWF0KG9iamVjdCBvYiwgaW50IGZsYWcpCit7CisgIGlmIChvYmplY3RwKG9iKSkKKyAgICByZXR1cm4gZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46OmNvbmZpZ3VyZV9vYmplY3Qsb2IpLCBvYiwgT0NfSEVBUlRfQkVBVCwgZmxhZyk7Cit9CisKKy8vICogTWFnaWVybGV2ZWxncnVwcGVuIGVybWl0dGVsbgoraW50IHF1ZXJ5X3dpel9ncnAobWl4ZWQgd2l6KQoreworICBpbnQgbGV2OworCisgIGxldj1xdWVyeV93aXpfbGV2ZWwod2l6KTsKKyAgaWYgKGxldjxTRUVSX0xWTCkgcmV0dXJuIDA7CisgIGlmIChsZXY+PUdPRF9MVkwpIHJldHVybiBsZXY7CisgIGlmIChsZXY+PUFSQ0hfTFZMKSByZXR1cm4gQVJDSF9HUlA7CisgIGlmIChsZXY+PUVMREVSX0xWTCkgcmV0dXJuIEVMREVSX0dSUDsKKyAgaWYgKGxldj49TE9SRF9MVkwpIHJldHVybiBMT1JEX0dSUDsKKyAgaWYgKGxldj49U1BFQ0lBTF9MVkwpIHJldHVybiBTUEVDSUFMX0dSUDsKKyAgaWYgKGxldj49RE9NQUlOTUVNQkVSX0xWTCkgcmV0dXJuIERPTUFJTk1FTUJFUl9HUlA7CisgIGlmIChsZXY+PVdJWkFSRF9MVkwpIHJldHVybiBXSVpBUkRfR1JQOworICBpZiAobGV2Pj1MRUFSTkVSX0xWTCkgcmV0dXJuIExFQVJORVJfR1JQOworICByZXR1cm4gU0VFUl9HUlA7Cit9CisKK21peGVkICp3aXpsaXN0X2luZm8oKQoreworICBpZiAoQVJDSF9TRUNVUklUWSB8fCAhZXh0ZXJuX2NhbGwoKSkKKyAgICAgICAgICAgIHJldHVybiBlZnVuOjp3aXpsaXN0X2luZm8oKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vICogd2l6bGlzdCBhdXNnZWJlbgordmFyYXJncyB2b2lkIHdpemxpc3Qoc3RyaW5nIG5hbWUsIGludCBzb3J0a2V5ICkgeworCisgIGlmICghbmFtZSkKKyAgeworICAgIGlmICh0aGlzX3BsYXllcigpKQorICAgICAgbmFtZSA9IGdldHVpZCh0aGlzX3BsYXllcigpKTsKKyAgICBpZiAoIW5hbWUpCisgICAgICByZXR1cm47CisgIH0KKworICAvLyBTY2hsdWVzc2VsIGRhcmYgbnVyIGluIGVpbmVtIGd1ZWx0aWdlbiBCZXJlaWNoIHNlaW4KKyAgaWYgKHNvcnRrZXk8V0xfTkFNRSB8fCBzb3J0a2V5Pj1XTF9TSVpFKSBzb3J0a2V5PVdMX0NPU1Q7CisKKyAgbWl4ZWQqKiB3bCA9IGVmdW46Ondpemxpc3RfaW5mbygpOworICAvLyBuYWNoIDxzb3J0a2V5PiBzb3J0aWVyZW4KKyAgd2wgPSBzb3J0X2FycmF5KHdsLCBmdW5jdGlvbiBpbnQgKG1peGVkIGEsIG1peGVkIGIpCisgICAgICB7cmV0dXJuIGFbc29ydGtleV0gPCBiW3NvcnRrZXldOyB9ICk7CisKKyAgLy8gU3VtbWUgdWViZXIgYWxsZSBLb21tYW5kb3MgZXJtaXR0ZWxuLgorICBpbnQgdG90YWxfY21kLCBpOworICBpbnQgcG9zPS0xOworICBmb3JlYWNoKG1peGVkIGVudHJ5IDogd2wpCisgIHsKKyAgICB0b3RhbF9jbWQgKz0gZW50cnlbV0xfQ09NTUFORFNdOworICAgIGlmIChlbnRyeVtXTF9OQU1FXSA9PSBuYW1lKQorICAgICAgcG9zID0gaTsKKyAgICArK2k7CisgIH0KKworICBpZiAocG9zIDwgMCAmJiBuYW1lICE9ICJBTEwiICYmIG5hbWUgIT0gIlRPUDEwMCIpCisgICAgcmV0dXJuOworCisgIGlmIChuYW1lID09ICJUT1AxMDAiKQorICB7CisgICAgaWYgKHNpemVvZih3bCkgPiAxMDApCisgICAgICB3bCA9IHdsWzAuLjEwMF07CisgICAgZWxzZQorICAgICAgd2wgPSB3bDsKKyAgfQorICAvLyB1bSBuYW1lIGhlcnVtIHNjaG5laWRlbgorICBlbHNlIGlmIChuYW1lICE9ICJBTEwiKQorICB7CisgICAgaWYgKHNpemVvZih3bCkgPD0gMjEpCisgICAgICB3bCA9IHdsOworICAgIGVsc2UgaWYgKHBvcyArIDEwIDwgc2l6ZW9mKHdsKSAmJiBwb3MgLSAxMCA+IDApCisgICAgICB3bCA9IHdsW3Bvcy0xMC4ucG9zKzEwXTsKKyAgICBlbHNlIGlmIChwb3MgPD0yMSkKKyAgICAgIHdsID0gd2xbMC4uMjBdOworICAgIGVsc2UgaWYgKHBvcyA+PSBzaXplb2Yod2wpIC0gMjEpCisgICAgICB3bCA9IHdsWzwyMS4uXTsKKyAgICBlbHNlCisgICAgICB3bCA9IHdsOworICB9CisKKyAgd3JpdGUoIlxuV2l6YXJkIHRvcCBzY29yZSBsaXN0XG5cbiIpOworICBpZiAodG90YWxfY21kID09IDApCisgICAgdG90YWxfY21kID0gMTsKKyAgcHJpbnRmKCIlLTIwcyAlLTZzICUtM3MgJS0xN3MgJS02cyAlLTZzICUtNnNcbiIsCisgICAgICAgICAiRVVJRCIsICJjbWRzIiwgIiUiLCAiQ29zdHMiLCAiSEIiLCAiQXJyYXlzIiwiTWFwcC4iKTsKKyAgZm9yZWFjaChtaXhlZCBlOiB3bCkKKyAgeworICAgIHByaW50ZigiJS06MjBzICU6NmQgJToyZCUlIFslOjZkaywlOjZkR10gJTo2ZCAlOjZkICU6NmRcbiIsCisgICAgICAgICAgZVtXTF9OQU1FXSwgZVtXTF9DT01NQU5EU10sIGVbV0xfQ09NTUFORFNdICogMTAwIC8gdG90YWxfY21kLAorICAgICAgICAgIGVbV0xfQ09TVF0gLyAxMDAwLCBlW1dMX1RPVEFMX0dJR0FDT1NUXSwKKyAgICAgICAgICBlW1dMX0hFQVJUX0JFQVRTXSwgZVtXTF9BUlJBWV9UT1RBTF0sIGVbV0xfTUFQUElOR19UT1RBTF0KKyAgICAgICAgICApOworICB9CisgIHByaW50ZigiXG5Ub3RhbCAgICAgICAgICU3ZCAgICAgICAgICglZClcblxuIiwgdG90YWxfY21kLCBzaXplb2Yod2wpKTsKK30KKworCisvLyBBYiBoaWVyIGZvbGdlbiBIaWxmc2Z1bmt0aW9uZW4gZnVlciBjYWxsX291dCgpIGJ6dy4gZnVlciBkZXJlbiBCZWdyZW56dW5nCisKKy8vIGVybWl0dGVsdCBkYXMgT2JqZWt0IGRlcyBDYWxsb3V0cy4KK3ByaXZhdGUgb2JqZWN0IF9jYWxsX291dF9vYmooIG1peGVkIGNhbGxfb3V0ICkgeworICAgIHJldHVybiBwb2ludGVycChjYWxsX291dCkgPyBjYWxsX291dFswXSA6IDA7Cit9CisKK3ByaXZhdGUgdm9pZCBfc2FtZV9vYmplY3QoIG9iamVjdCBvYiwgbWFwcGluZyBtICkgeworICAvLyBpc3QgbmljaHQgc28gYmxvZWQsIHdpZSBlcyBhdXNzaWVodCwgcy4gbmFjaGZvbGdlZGUgVmVyd2VuZHVuZyB2b24gbQorICBpZiAoIG1bb2JdICkKKyAgICBtW29iXSArPSAoeyBvYiB9KTsKKyAgZWxzZQorICAgIG1bb2JdID0gKHsgb2IgfSk7IAorfQorCisvLyBhbGxlIE9iamVrdGUgaW0gTWFwcGluZyBtIHp1c2FtbWVuZmFzc2VuLCBkaWUgZGVuIGdsZWljaGVuIExvYWRuYW1lIChOYW1lIGRlcgorLy8gQmx1ZXByaW50KSBoYWJlbiwgYWxzbyBhbGxlIENsb25lcyBkZXIgQlAsIGRpZSBDYWxsb3V0cyBsYXVmZW4gaGFiZW4uCisvLyBPYmpla3RlIHdlcmRlbiBhdWNoIG1laHJmYWNoIGVyZmFzc3QsIGplIG5hY2ggQW56YWhsIGlocmVyIENhbGxvdXRzLgorcHJpdmF0ZSB2b2lkIF9zYW1lX3BhdGgoIG9iamVjdCBrZXksIG9iamVjdCAqb2JzLCBtYXBwaW5nIG0gKSB7CisgIHN0cmluZyBwYXRoOworICBpZiAoIW9iamVjdHAoa2V5KSB8fCAhcG9pbnRlcnAob2JzKSkgcmV0dXJuOworCisgIHBhdGggPSBsb2FkX25hbWUoa2V5KTsKKworICBpZiAoIG1bcGF0aF0gKQorICAgIG1bcGF0aF0gKz0gb2JzOworICBlbHNlCisgICAgbVtwYXRoXSA9IG9iczsKK30KKworLy8ga2V5IGthbm4gb2JqZWN0IG9kZXIgc3RyaW5nIHNlaW4uCitwcml2YXRlIGludCBfdG9vX21hbnkoIG1peGVkIGtleSwgbWFwcGluZyBtLCBpbnQgaSApIHsKKyAgICByZXR1cm4gc2l6ZW9mKG1ba2V5XSkgPj0gaTsKK30KKworLy8gYWxsZSBPYmpla3RlIGluIG9icyB6ZXJzdG9lcmVuIHVuZCBGZWhsZXJtZWxkdW5nIGF1c2dlYmVuLiBBQ0hUVU5HOiBEaWUKKy8vIE9iamVrdGUgd2VyZGVuIGlkUiB6dSBlaW5lciBCUCBnZWhvZXJlbiwgbXVlc3NlbiBhYmVyIG5pY2h0ISBJbiBkZW0gRmFsbAorLy8gd2lyZCBhdWYgZGVyIEViZW5lIGFiZXIgbnVyIGVpbiBPYmpla3QgaW4gZGVyIEZlaGxlcm1lbGR1bmcgZXJ3YWVobnQuCitwcml2YXRlIHZvaWQgX2Rlc3Ryb3koIG1peGVkIGtleSwgb2JqZWN0ICpvYnMsIHN0cmluZyB0ZXh0LCBpbnQgdWlkICkgeworICAgIGlmICghcG9pbnRlcnAob2JzKSkgcmV0dXJuOworICAgIC8vIEFycmF5IG1pdCB1bmlxdWUgRWludHJhZWdlIGVyemV1Z2VuLgorICAgIG9icyA9IG1faW5kaWNlcyggbWttYXBwaW5nKG9icykgKTsKKyAgICAvLyBGZWhsZXJtZWxkdW5nIGF1ZiBkZXIgRWJlbmUgYXVzZ2ViZW4sIGltIGNhdGNoKCkgbWl0IHB1Ymxpc2gsIGRhbWl0IGVzCisgICAgLy8gYXVmIGRlciBFYmVuZSBkaXJla3Qgc2Nyb2xsdCwgZGVyIGJhY2t0cmFjZSB2ZXJmdWVnYmFyIGlzdCAoaW0KKyAgICAvLyBnZWdlbnNhdHogenVyIExvZXN1bmcgbWl0dGVscyBDYWxsb3V0KSwgZGllIEF1c2Z1ZWhydW5nIGFiZXIgd2VpdGVyCisgICAgLy8gbGFldWZ0LgorICAgIGNhdGNoKCBlZnVuOjpyYWlzZV9lcnJvciggICAgICAgICAgIAorICAgICAgICAgc3ByaW50ZiggdGV4dCwgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgIHVpZCA/IChzdHJpbmcpbWFzdGVyKCktPmNyZWF0b3JfZmlsZShrZXkpIDoga2V5LCAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgc2l6ZW9mKG9icyksIG9iamVjdF9uYW1lKG9ic1s8MV0pICkgKTtwdWJsaXNoKTsKKyAgICAvLyBVbmQgd2VnIG1pdCBkZW0gS3JhbS4uLgorICAgIGZpbHRlciggb2JzLCAjJ2VmdW46OmRlc3RydWN0LyonKi8gKTsKK30KKworLy8gQWxsZSBPYmpla3QgZWluZXIgVUlEIGltIE1hcHBpbmcgbSBtaXQgVUlEIGFscyBLRXlzIHp1c2FtbWVuZmFzc2VuLiBPYmpla3QKKy8vIHNpbmQgZGFiZWkgbmljaHQgdW5pcXVlLgorcHJpdmF0ZSB2b2lkIF9zYW1lX3VpZCggc3RyaW5nIGtleSwgb2JqZWN0ICpvYnMsIG1hcHBpbmcgbSwgY2xvc3VyZSBjZiApIHsKKyAgc3RyaW5nIHVpZDsKKworICBpZiAoICFwb2ludGVycChvYnMpIHx8ICFzaXplb2Yob2JzKSApCisgICAgcmV0dXJuOworCisgIHVpZCA9IGZ1bmNhbGwoIGNmLCBrZXkgKTsKKworICBpZiAoIG1bdWlkXSApCisgICAgbVt1aWRdICs9IG9iczsgLy8gb2JzIGlzdCBuZW4gQXJyYXkKKyAgZWxzZQorICAgIG1bdWlkXSA9IG9iczsKK30KKworcHJpdmF0ZSBpbnQgX2xvZ19jYWxsX291dChtaXhlZCBjbykKK3sKKyAgbG9nX2ZpbGUoIlRPT19NQU5ZX0NBTExPVVRTIiwKKyAgICAgIHNwcmludGYoIiVzOjolTyAoJWQpXG4iLG9iamVjdF9uYW1lKGNvWzBdKSxjb1sxXSxjb1syXSksCisgICAgICAyMDAwMDApOworICByZXR1cm4gMDsKK30KKworcHJpdmF0ZSBpbnQgbGFzdF9jYWxsb3V0X2xvZz0wOworCitub21hc2sgdmFyYXJncyB2b2lkIGNhbGxfb3V0KCB2YXJhcmdzIG1peGVkICphcmdzICkKK3sKKyAgICBtaXhlZCB0bXAsICpjYWxsX291dHM7CisKKyAgICAvLyBCZWkgPjYwMCBDYWxsb3V0cyBhbGxlIE9iamVrdGUga2lsbGVuLCBkaWUgbWVociBhbHMgMzAgQ2FsbG91dHMgbGF1ZmVuCisgICAgLy8gaGFiZW4uCisgICAgaWYgKCBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fQ0FMTE9VVFMpID4gNjAwCisgICAgICAgICYmIGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpICE9IFJPT1RJRCApCisgICAgeworICAgICAgIC8vIExvZyBlcnpldWdlbi4uLgorICAgICAgIGlmIChsYXN0X2NhbGxvdXRfbG9nIDwKKyAgICAgICAgICAgZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVF9UT1RBTF9DWUNMRVMpIC0gMTAKKyAgICAgICAgICAgJiYgZ2V0X2V2YWxfY29zdCgpID4gMjAwMDAwKQorICAgICAgIHsKKyAgICAgICAgIGxhc3RfY2FsbG91dF9sb2cgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSEVBUlRCRUFUX1RPVEFMX0NZQ0xFUyk7CisgICAgICAgICBsb2dfZmlsZSgiVE9PX01BTllfQ0FMTE9VVFMiLAorICAgICAgICAgICAgIHNwcmludGYoIlxuJXM6ICMjIyMjIyMjIyMjIyBUb28gbWFueSBjYWxsb3V0czogJWQgIyMjIyMjIyMjIyMjIyNcbiIsCisgICAgICAgICAgICAgICAgICAgICBzdHJmdGltZSgiJXklbSVkLSVIJU0lUyIpLAorICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0NBTExPVVRTKSkpOworICAgICAgICAgZmlsdGVyKGVmdW46OmNhbGxfb3V0X2luZm8oKSwgIydfbG9nX2NhbGxfb3V0KTsKKyAgICAgICB9CisgICAgICAgLy8gT2JqZWt0ZSBhbGxlciBDYWxsb3V0cyBlcm1pdHRlbG4KKyAgICAgICBjYWxsX291dHMgPSBtYXAoIGVmdW46OmNhbGxfb3V0X2luZm8oKSwgIydfY2FsbF9vdXRfb2JqICk7CisgICAgICAgbWFwcGluZyBvYmplY3RtYXAgPSAoW10pOworICAgICAgIGZpbHRlciggY2FsbF9vdXRzLCAjJ19zYW1lX29iamVjdCwgJm9iamVjdG1hcCApOworICAgICAgIC8vIE1hc3RlciBuaWNodCBncmlsbGVuLi4uCisgICAgICAgZWZ1bjo6bV9kZWxldGUoIG9iamVjdG1hcCwgbWFzdGVyKDEpICk7CisgICAgICAgLy8gYWxsZSBPYmpla3RlIHJhdXNzdWNoZW4sIGRpZSB6dXZpZWxlIGhhYmVuLi4uCisgICAgICAgbWFwcGluZyByZXMgPSBmaWx0ZXJfaW5kaWNlcyggb2JqZWN0bWFwLCAjJ190b29fbWFueSwgb2JqZWN0bWFwLCAyOSApOworICAgICAgIC8vIHVuZCB1ZWJlciBhbGxlIEtleXMgZ2VoZW4sIGFuIF9kZXN0cm95KCkgd2VyZGVuIEtleSB1bmQgQXJyYXkgbWl0CisgICAgICAgLy8gT2JqZWt0ZW4gdWViZXJnZWJlbiAoaW4gZGllc2VtIEZhbGwgc2luZCBLZXlzIHVuZCBBcnJheSBtaXQKKyAgICAgICAvLyBPYmpla3RlbiBqZXdlaWxzIGRhcyBnbGVpY2hlIE9iamVrdCkuCisgICAgICAgaWYgKCBzaXplb2YocmVzKSApICAgICAgIAorICAgICAgICAgICB3YWxrX21hcHBpbmcocmVzLCAjJ19kZXN0cm95LCAiQ0FMTF9PVVQgb3ZlcmZsb3cgYnkgc2luZ2xlICIgICAgICAgICAgICAgCisgICAgICAgICAgICAgICJvYmplY3QgWyVPXS4gRGVzdHJ1Y3RlZCAlZCBvYmplY3RzLiBbJXNdXG4iLCAwICk7CisKKyAgICAgICAvLyBCZWkgKGF1Y2ggbmFjaCBkZW0gZXJzdGVuIEF1ZnJhZXVtZW4gbm9jaCkgPjgwMCBDYWxsb3V0cyBhbGxlCisgICAgICAgLy8gT2JqZWt0ZSBraWxsZW4sIGRpZSBtZWhyIGFscyA1MCBDYWxsb3V0cyBsYXVmZW4gaGFiZW4gLSB1bmQKKyAgICAgICAvLyBkaWVzbWFsIHphZWhsZW4gQ2xvbmVzIG5pY2h0IGVpZ2Vuc3RhZW5kaWchIEQuaC4gZXMgd2VyZGVuIGFsbGUKKyAgICAgICAvLyBDbG9uZXMgZWluZXIgQlAgZ2VraWxsdCwgZGllIENhbGxvdXRzIGxhdWZlbiBoYWJlbiwgZmFsbHMgYWxsZQorICAgICAgIC8vIGRpZXNlIE9iamVrdGUgX3p1c2FtbWVuXyBtZWhyIGFscyA1MCBDYWxsb3V0cyBoYWJlbiEKKyAgICAgICBpZiAoIGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9DQUxMT1VUUykgPiA4MDAgKSB7CisgICAgICAgICAgIC8vIHplcnN0b2VydGUgT2JqZWt0ZSB2b24gZGVyIGxldHp0ZW4gQWt0aW9uIHNpbmQgaW4gb2JqZWN0bWFwIG5pY2h0CisgICAgICAgICAgIC8vIG1laHIgZHJpbiwgZGEgc2llIGRvcnQgYWxzIEtleXMgdmVyd2VuZGV0IHd1cmRlbi4KKyAgICAgICAgICAgbWFwcGluZyBwYXRobWFwPShbXSk7CisgICAgICAgICAgIC8vIGFsbGUgT2JqZWt0IGVpbmVyIEJQIGluIHJlcyBzb3J0aWVyZW4sIEJQLU5hbWUgYWxzIEtleSwgQXJyYXlzCisgICAgICAgICAgIC8vIHZvbiBPYmpla3RlbiBhbHMgV2VydGUuCisgICAgICAgICAgIHdhbGtfbWFwcGluZyggb2JqZWN0bWFwLCAjJ19zYW1lX3BhdGgsICZwYXRobWFwKTsKKyAgICAgICAgICAgLy8gYWxsZSBCUHMgKHVuZCBpaHJlIE9iamVrdGUpIHJhdXNzdWNoZW4sIGRpZSB6dXZpZWxlIGhhYmVuLi4uCisgICAgICAgICAgIHJlcyA9IGZpbHRlcl9pbmRpY2VzKCBwYXRobWFwLCAjJ190b29fbWFueS8qJyovLCBwYXRobWFwLCA1MCApOworICAgICAgICAgICAvLyB1bmQgdWViZXIgYWxsZSBLZXlzIGdlaGVuLCBhbiBfZGVzdHJveSgpIHdlcmRlbiBkaWUgQ2xvbmVzCisgICAgICAgICAgIC8vIHVlYmVyZ2ViZW4sIGRpZSBDYWxsb3V0cyBoYWJlbi4KKyAgICAgICAgICAgaWYgKCBzaXplb2YocmVzKSApCisgICAgICAgICAgICAgIHdhbGtfbWFwcGluZyggcmVzLCAjJ19kZXN0cm95LyonKi8sICJDQUxMX09VVCBvdmVyZmxvdyBieSBmaWxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnLiBEZXN0cnVjdGVkICVkIG9iamVjdHMuIFslc11cbiIsIDAgKTsKKworICAgICAgICAgICAvLyBXZW5uIGJlaWRlIEF1ZnJhZXVtYXJiZWl0ZW4gbmljaHRzIGdlYnJhY2h0IGhhYmVuIHVuZCBpbW1lcgorICAgICAgICAgICAvLyBub2NoID4xMDAwIENhbGxvdXRzIGxhdWZlbiwgd2VyZGVuIGRpZXNtYWwgYWxsZSBDYWxsb3V0cworICAgICAgICAgICAvLyBlaW5lciBVSUQgenVzYW1tZW5nZXphZWhsdC4KKyAgICAgICAgICAgLy8gQWxsZSBPYmpla3RlIGVpbmVyIFVJRCwgZGllIGVzIGluIFN1bW1lIGFsbGVyIGlocmVyIE9iamVrdCBtaXQKKyAgICAgICAgICAgLy8gQ2FsbG91dHMgYXVmIG1laHIgYWxzIDEwMCBDYWxsb3V0cyBicmluZ3QsIHdlcmRlbiBnZXJvZXN0ZXQuCisgICAgICAgICAgIGlmIChlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fQ0FMTE9VVFMpID4gMTAwMCkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAvLyBkYXMgbmFjaCBCUC1OYW1lbiB2b3JnZWZpbHRlcnRlIE1hcHBpbmcgamV0enQgbmFjaCBVSURzCisgICAgICAgICAgICAgIC8vIHp1c2FtbWVuc29ydGllcmVuLiBaZXJzdG9lcnRlIENsb25lcyBmaWx0ZXIgX3NhbWVfdWlkKCkKKyAgICAgICAgICAgICAgLy8gcmF1cy4KKyAgICAgICAgICAgICAgbWFwcGluZyB1aWRtYXA9KFtdKTsKKyAgICAgICAgICAgICAgd2Fsa19tYXBwaW5nKCBwYXRobWFwLCAjJ19zYW1lX3VpZCwgJnVpZG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbF9mdW5jdGlvbiggImNyZWF0b3JfZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL3NlY3VyZS9tYXN0ZXIiICkgKTsKKyAgICAgICAgICAgICAgLy8gSW4gcmVzIG51biBVSURzIGFscyBLZXlzIHVuZCBBcnJheXMgdm9uIE9iamVrdGVuIGFscyBXZXJ0ZS4KKyAgICAgICAgICAgICAgLy8gRGllIHJhdXNmaWx0ZXJuLCBkaWUgbWVociBhbHMgMTAwIE9iamVrdGUgKG5vbi11bmlxdWUsIGQuaC4KKyAgICAgICAgICAgICAgLy8gMTAwIENhbGxvdXRzISkgaGFiZW4uCisgICAgICAgICAgICAgIHJlcyA9IGZpbHRlcl9pbmRpY2VzKCB1aWRtYXAsICMnX3Rvb19tYW55LCB1aWRtYXAsIDEwMCApOworICAgICAgICAgICAgICAvLyB1bmQgZXJuZXV0IHVlYmVyIGRpZSBLZXlzIGxhdWZlbiB1bmQgamV3ZWlscyBkaWUgQXJyYXlzIG1pdAorICAgICAgICAgICAgICAvLyBkZW4gT2JqZWt0ZW4genVyIFplcnN0b2VydW5nIGFuIF9kZXN0cm95KCkuLi4KKyAgICAgICAgICAgICAgaWYgKCBzaXplb2YocmVzKSApCisgICAgICAgICAgICAgICAgICB3YWxrX21hcHBpbmcoIHJlcywgIydfZGVzdHJveSwgIkNBTExfT1VUIG92ZXJmbG93IGJ5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVSUQgJyVzJy4gRGVzdHJ1Y3RlZCAlZCBvYmplY3RzLiBbJXNdXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSApOworICAgICAgICAgICB9CisgICAgICAgfQorICAgIH0KKworICAgIC8vIEZhbGxzIGRhcyBhdWZydWZlbmRlIE9iamVrdCB6ZXJzdG9lcnQgd3VyZGUgYmVpbSBBdWZyYWV1bWVuCisgICAgaWYgKCAhcHJldmlvdXNfb2JqZWN0KCkgKQorICAgICAgIHJldHVybjsKKworICAgIHNldF90aGlzX29iamVjdCggcHJldmlvdXNfb2JqZWN0KCkgKTsKKyAgICBhcHBseSggIydlZnVuOjpjYWxsX291dCwgYXJncyApOworICAgIHJldHVybjsKK30KKworbWl4ZWQgY2FsbF9vdXRfaW5mbygpIHsKKyAgCisgIG9iamVjdCBwbyA9IHByZXZpb3VzX29iamVjdCgpOworICBtaXhlZCBjb2kgPSBlZnVuOjpjYWxsX291dF9pbmZvKCk7CisKKyAgLy8gdW5nZWZpbHRlcnRlbiBPdXRwdXQgbnVyIGZ1ZXIgYmVzdGltbXRlIE9iamVrdGUsIE9iamVrdGUgaW4gL3N0ZCBvZGVyCisgIC8vIC9vYmogaGFiZW4gZGllIEJhY2tib25lSUQuCisgIGlmIChxdWVyeV93aXpfbGV2ZWwoZ2V0dWlkKHBvKSkgPj0gQVJDSF9MVkwKKyAgICAgICB8fCAoc3RyaW5nKW1hc3RlcigpLT5jcmVhdG9yX2ZpbGUobG9hZF9uYW1lKHBvKSkgPT0gQkFDS0JPTkVJRCApIHsKKyAgICAgIHJldHVybiBjb2k7CisgIH0KKyAgZWxzZSB7CisgICAgICByZXR1cm4gZmlsdGVyKGNvaSwgZnVuY3Rpb24gbWl4ZWQgKG1peGVkIGFycikgeworICAgICAgICAgICAgICBpZiAocG9pbnRlcnAoYXJyKSAmJiBhcnJbMF09PXBvKQorICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgZWxzZSByZXR1cm4gMDsgfSk7CisgIH0KK30KKworLy8gKiBadSBlaW5lciBjbG9zdXJlIGRhcyBPYmpla3QsIGFuIGRhcyBzaWUgZ2VidW5kZW4gaXN0LCBzdWNoZW4KKy8vIE5JQ0hUIGRhcyBPYmpla3QsIHdhcyBnZ2YuIGRpZSBsZnVuIGRlZmluaWVydCEKK21peGVkIHF1ZXJ5X2Nsb3N1cmVfb2JqZWN0KGNsb3N1cmUgYykgeworICByZXR1cm4KKyAgICBDTE9TVVJFX0lTX1VOQk9VTkRfTEFNQkRBKGdldF90eXBlX2luZm8oYywgMSkpID8KKyAgICAgIDAgOgorICAodG9fb2JqZWN0KGMpIHx8IC0xKTsKK30KKworLy8gKiBXaXIgd29sbGVuIG51ciBFSU4gQXJndW1lbnQgLi4uIGF1c3NlcmRlbSBjaGVja3MgZnVlciBkZW4gTmV0enRvdGVucmF1bQordmFyYXJncyB2b2lkIG1vdmVfb2JqZWN0KG1peGVkIHdoYXQsIG1peGVkIHdoZXJlKQoreworICBvYmplY3QgcG8sdG1wOworCisgIHBvPXByZXZpb3VzX29iamVjdCgpOworICBpZiAoIXdoZXJlKQorICB7CisgICAgd2hlcmU9d2hhdDsKKyAgICB3aGF0PXBvOworICB9CisgIGlmICgoKHN0cmluZ3Aod2hlcmUpICYmIHdoZXJlPT1ORVRERUFEX1JPT00gKSB8fAorICAgICAgIChvYmplY3RwKHdoZXJlKSAmJiB3aGVyZT09ZmluZF9vYmplY3QoTkVUREVBRF9ST09NKSkpICYmCisgICAgICAgb2JqZWN0cCh3aGF0KSAmJiBvYmplY3RfbmFtZSh3aGF0KSE9Ii9vYmovc3BlcnJlciIpCisgIHsKKyAgICBpZiAoIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUod2hhdCkpCisgICAgeworICAgICAgd2hhdC0+cmVtb3ZlKCk7CisgICAgICBpZiAod2hhdCkgZGVzdHJ1Y3Qod2hhdCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChsaXZpbmcod2hhdCkgfHwgaW50ZXJhY3RpdmUod2hhdCkpCisgICAgeworICAgICAgbG9nX2ZpbGUoIk5ERUFEMiIsc3ByaW50ZigiVFJZRUQgVE8gTU9WRSBUTyBORVRERUFEOiAlT1xuIix3aGF0KSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIHNldF9vYmplY3RfaGVhcnRfYmVhdCh3aGF0LDApOworICB9CisgIHRtcD13aGF0OworICB3aGlsZSAodG1wPWVudmlyb25tZW50KHRtcCkpCisgICAgICAvLyBKYS4gTWFuIHJ1ZnQgZGllIF9zZXRfeHh4KCktRnVua3Rpb25lbiBlaWdlbnRsaWNoIG5pY2h0IGRpcmVrdCBhdWYuCisgICAgICAvLyBBYmVyIGRhcyBMaWNodHN5c3RlbSBpc3Qgc2Nob24gKnNvKiByZWNoZW5pbnRlbnNpdiB1bmQgZ2VyYWRlIGRlcgorICAgICAgLy8gUF9MQVNUX0NPTlRFTlRfQ0hBTkdFLUNhY2hlIHdpcmQgKnNvKiBvZnQgYmVub2V0aWd0LCBkYXNzIGVzIG1pcgorICAgICAgLy8gZGEgdW0gamVkZXMgYmlzc2NoZW4gUmVjaGVuemVpdCBnZWh0LgorICAgICAgLy8gRGVyIFp3ZWNrIGhlaWxpZ3QgamEgYmVrYW5udGxpY2ggZGllIE1pdHRlbC4gOy0pCisgICAgICAvLworICAgICAgLy8gVGlhbWFrCisgICAgdG1wLT5fc2V0X2xhc3RfY29udGVudF9jaGFuZ2UoKTsKKyAgZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46Om1vdmVfb2JqZWN0LHBvKSx3aGF0LHdoZXJlKTsKKyAgaWYgKHRtcD13aGF0KQorICAgIHdoaWxlICh0bXA9ZW52aXJvbm1lbnQodG1wKSkKKyAgICAgIHRtcC0+X3NldF9sYXN0X2NvbnRlbnRfY2hhbmdlKCk7Cit9CisKKwordm9pZCBzdGFydF9zaW11bF9lZnVuKCkgeworICBtaXhlZCAqaW5mbzsKKworICAvLyBGYWxscyBub2NoIG5pY2h0IGdldGFuLCBleHRyYV93aXppbmZvIGluaXRpYWxpc2llcmVuCisgIGlmICggIXBvaW50ZXJwKGluZm8gPSBnZXRfZXh0cmFfd2l6aW5mbygwKSkgKQorICAgIHNldF9leHRyYV93aXppbmZvKDAsIGluZm8gPSBhbGxvY2F0ZShCQUNLQk9ORV9XSVpJTkZPX1NJWkUpKTsKKworICBJbml0TGl2aW5nRGF0YShpbmZvKTsKKworICBzZXRfbmV4dF9yZXNldCgxMCk7IC8vIGRpcmVrdCBtYWwgYXVmcmFldW1lbgorfQorCitwcm90ZWN0ZWQgdm9pZCByZXNldCgpIHsKKyAgc2V0X25leHRfcmVzZXQoNzIwMCk7CisgIENsZWFuTGl2aW5nRGF0YSgpOworfQorCisjaWYgIV9fRUZVTl9ERUZJTkVEX18oYWJzb2x1dGVfaGJfY291bnQpCitpbnQgYWJzb2x1dGVfaGJfY291bnQoKSB7CisgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSEVBUlRCRUFUX1RPVEFMX0NZQ0xFUyk7Cit9CisjZW5kaWYKKwordm9pZCBfX3NldF9lbnZpcm9ubWVudChvYmplY3Qgb2IsIG1peGVkIHRhcmdldCkKK3sKKyAgc3RyaW5nIHBhdGg7CisgIG9iamVjdCBvYmo7CisKKyAgaWYgKCFvYmplY3RwKG9iKSkKKyAgICByZXR1cm47CisgIGlmICghSVNfQVJDSChnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSkgfHwgIUFSQ0hfU0VDVVJJVFkgKQorICAgIHJldHVybjsKKyAgaWYgKG9iamVjdHAodGFyZ2V0KSkKKyAgeworICAgIGVmdW46OnNldF9lbnZpcm9ubWVudChvYix0YXJnZXQpOworICAgIHJldHVybjsKKyAgfQorICBwYXRoPShzdHJpbmcpTUFTVEVSLT5fZ2V0X3BhdGgodGFyZ2V0LHRoaXNfaW50ZXJhY3RpdmUoKSk7CisgIGlmIChzdHJpbmdwKHBhdGgpICYmIGZpbGVfc2l6ZShwYXRoKyIuYyIpPj0wICYmCisgICAgICAhY2F0Y2gobG9hZF9vYmplY3QocGF0aCk7cHVibGlzaCkgKQorICB7CisgICAgb2JqPWZpbmRfb2JqZWN0KHBhdGgpOworICAgIGVmdW46OnNldF9lbnZpcm9ubWVudChvYixvYmopOworICAgIHJldHVybjsKKyAgfQorfQorCit2b2lkIF9kdW1wX3dpemxpc3Qoc3RyaW5nIGZpbGUsIGludCBzb3J0YnkpIHsKKyAgaW50IGk7CisgIG1peGVkICphOworCisgIGlmICghTE9SRF9TRUNVUklUWSkKKyAgICByZXR1cm47CisgIGlmICghbWFzdGVyKCktPnZhbGlkX3dyaXRlKGZpbGUsZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSksIndyaXRlX2ZpbGUiKSkKKyAgeworICAgIHdyaXRlKCJOTyBXUklURSBQRVJNSVNTSU9OXG4iKTsKKyAgICByZXR1cm47CisgIH0KKyAgYSA9IHdpemxpc3RfaW5mbygpOworICBhID0gc29ydF9hcnJheShhLCBsYW1iZGEoICh7J2EsJ2J9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh7Iyc8LAorICAgICAgICAgICAgICAgICAgICAgICAgICAoeyMnWywnYSxzb3J0Ynl9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHsjJ1ssJ2Isc29ydGJ5fSkKKyAgICAgICAgICAgICAgICAgICAgICAgICB9KSkpOworICBybShmaWxlKTsKKyAgZm9yIChpPXNpemVvZihhKS0xO2k+PTA7aS0tKQorICAgIHdyaXRlX2ZpbGUoZmlsZSxzcHJpbnRmKCIlLTExczogZXZhbD0lLThkIGNtZHM9JS02ZCBIQnM9JS01ZCBhcnJheT0lLTVkIG1hcHBpbmc9JS03ZFxuIiwKKyAgICAgIGFbaV1bV0xfTkFNRV0sYVtpXVtXTF9UT1RBTF9DT1NUXSxhW2ldW1dMX0NPTU1BTkRTXSxhW2ldW1dMX0hFQVJUX0JFQVRTXSwKKyAgICAgIGFbaV1bV0xfQVJSQVlfVE9UQUxdLGFbaV1bV0xfQ0FMTF9PVVRdKSk7Cit9CisKK3B1YmxpYyB2YXJhcmdzIG9iamVjdCBkZWVwX3ByZXNlbnQobWl4ZWQgd2hhdCwgb2JqZWN0IG9iKSB7CisKKyAgaWYoIW9iamVjdHAob2IpKQorICAgIG9iPXByZXZpb3VzX29iamVjdCgpOworICAvLyBXZW5uIGVpbiBPYmpla3QgZ2VzdWNodCB3aXJkOiBBbGxlIEVudnMgZGllc2VzIE9iamVrdHMgZXJtaXR0ZWxuIHVuZAorICAvLyBzY2hhdWVuLCBvYiBpbiBkaWVzZW4gb2Igdm9ya29tbXQuIERhbm4gaXN0IHdoYXQgaW4gb2IgZW50aGFsdGVuLgorICBpZihvYmplY3RwKHdoYXQpKSB7CisgICAgb2JqZWN0ICplbnZzPWFsbF9lbnZpcm9ubWVudCh3aGF0KTsKKyAgICAvLyB3ZW5uIG9iIGtlaW4gRW52aXJvbm1lbnQgaGF0LCBpc3QgZXMgb2ZmZW5zaWNodGxpY2ggbmljaHQgaW4gd2hhdAorICAgIC8vIGVudGhhbHRlbi4KKyAgICBpZiAoIXBvaW50ZXJwKGVudnMpKSByZXR1cm4gMDsKKyAgICBpZiAobWVtYmVyKGVudnMsIG9iKSAhPSAtMSkgcmV0dXJuIHdoYXQ7CisgIH0KKyAgLy8gc29uc3Qgd2lyZHMgdGV1cmVyLCB1ZWJlciBhbGxlIE9iamVrdGUgaW0gKGRlZXApIEludiBsYXVmZW4gdW5kIHBlciBpZCgpCisgIC8vIHRlc3Rlbi4gRGFiZWkgbXVzcyBhYmVyIGRpZSBnZXd1ZW5zY2h0ZSBOci4gKCJmbGFzY2hlIDMiKSBhYmdlc2Nobml0dGVuCisgIC8vIHdlcmRlbiB1bmQgc2VsYmVyIGdlemFlaGx0IHdlcmRlbiwgd2VsY2hlIGRhcyBlbnRzcHJlY2hlbmRlIE9iamVrdCBpc3QuCisgIGVsc2UgaWYgKHN0cmluZ3Aod2hhdCkpIHsKKyAgICAgIGludCBjbnQ7CisgICAgICBzdHJpbmcgbmV3d2hhdDsKKyAgICAgIGlmKHNzY2FuZih3aGF0LCIlcyAlZCIsbmV3d2hhdCxjbnQpIT0yKQorICAgICAgIGNudD0xOworICAgICAgZWxzZQorICAgICAgIHdoYXQ9bmV3d2hhdDsKKyAgICAgIGZvcmVhY2gob2JqZWN0IGludm9iOiBkZWVwX2ludmVudG9yeShvYikpIHsKKyAgICAgICBpZiAoaW52b2ItPmlkKHdoYXQpICYmICEtLWNudCkKKyAgICAgICAgICAgcmV0dXJuIGludm9iOworICAgICAgfQorICB9CisgIGVsc2UgeworICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiV3JvbmcgYXJndW1lbnQgMSB0byBkZWVwX3ByZXNlbnQoKS4gIgorICAgICAgICAgIkV4cGVjdGVkIFwib2JqZWN0XCIgb3IgXCJzdHJpbmdcIiwgZ290ICUuNTBPLlxuIiwKKyAgICAgICAgIHdoYXQpKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworbWFwcGluZyBkdW1wX2lwX21hcHBpbmcoKQoreworICByZXR1cm4gMDsKK30KKworbm9tYXNrIHZvaWQgc3dhcChvYmplY3Qgb2JqKQoreworICB3cml0ZSgiWW91ciBhcmUgbm90IGFsbG93ZWQgdG8gc3dhcCBvYmplY3RzIGJ5IGhhbmQhXG4iKTsKKyAgcmV0dXJuOworfQorCitub21hc2sgdmFyYXJncyB2b2lkIGdhcmJhZ2VfY29sbGVjdGlvbihzdHJpbmcgc3RyKQoreworICBpZihwcmV2aW91c19vYmplY3QoKT09MCB8fCAhSVNfQVJDSChnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSkgCisgICAgICB8fCAhQVJDSF9TRUNVUklUWSkKKyAgeworICAgIHdyaXRlKCJDYWxsIEdDIG5vdyBhbmQgdGhlIG11ZCB3aWxsIGNyYXNoIGluIDUtNiBob3Vycy4gRE9OVCBETyBJVCFcbiIpOworICAgIHJldHVybjsKKyAgfQorICBlbHNlIGlmIChzdHJpbmdwKHN0cikpCisgIHsKKyAgICByZXR1cm4gZWZ1bjo6Z2FyYmFnZV9jb2xsZWN0aW9uKHN0cik7CisgIH0KKyAgZWxzZSAKKyAgICByZXR1cm4gZWZ1bjo6Z2FyYmFnZV9jb2xsZWN0aW9uKCk7Cit9CisKK3ZhcmFyZ3Mgdm9pZCBub3RpZnlfZmFpbChtaXhlZCBuZiwgaW50IHByaW8pIHsKKyAgb2JqZWN0IHBvLG9sZG87CisgIGludCBvbGRwcmlvOworICAKKyAgaWYgKCFQTCB8fCAhb2JqZWN0cChwbz1wcmV2aW91c19vYmplY3QoKSkpIHJldHVybjsKKyAgaWYgKCFzdHJpbmdwKG5mKSAmJiAhY2xvc3VyZXAobmYpKSB7CisgICAgICBzZXRfdGhpc19vYmplY3QocG8pOworICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigKKyAgICAgICAgICJPbmx5IHN0cmluZ3MgYW5kIGNsb3N1cmVzIGFsbG93ZWQgZm9yIG5vdGlmeV9mYWlsISAiCisgICAgICAgICAiQXJndW1lbnQgd2FzOiAlLjUwTy4uLlxuIixuZikpOworICB9CisKKyAgLy8gZmFsbHMgZWluIE9iamVrdCBiZXJlaXRzIG5lbiBub3RpZnlfZmFpbCgpIHNldHp0ZSwgUHJpb3JpdGFldGVuIGFic2NoYWV0emVuCisgIC8vIHVuZCB2ZXJnbGVpY2hlbi4KKyAgaWYgKG9iamVjdHAob2xkbz1xdWVyeV9ub3RpZnlfZmFpbCgxKSkgJiYgcG8hPW9sZG8pIHsKKyAgICBpZiAoIXByaW8pIHsgICAgICAgCisgICAgICAvL1ByaW9yaXRhZXQgZGllc2VzIG5vdGlmeV9mYWlsKCkgJ2Fic2NoYWV0emVuJworICAgICAgaWYgKHBvPT1QTCkgLy8gU3BpZWxlci1pbnRlcm5lIChzb3VsLWNtZHMpCisgICAgICAgIHByaW89TkZfTkxfT1dOOworICAgICAgZWxzZSBpZiAobGl2aW5nKHBvKSkKKyAgICAgICAgcHJpbz1ORl9OTF9MSVZJTkc7CisgICAgICBlbHNlIGlmICgoaW50KXBvLT5Jc1Jvb20oKSkKKyAgICAgICAgcHJpbz1ORl9OTF9ST09NOworICAgICAgZWxzZQorICAgICAgICBwcmlvPU5GX05MX1RISU5HOworICAgIH0KKyAgICAvL1ByaW9yaXRhZXQgZGVzIGFsdGVuIFNldHplcnMgYWJzY2hhZXR6ZW4KKyAgICBpZiAob2xkbz09UEwpCisgICAgICBvbGRwcmlvPU5GX05MX09XTjsKKyAgICBlbHNlIGlmIChsaXZpbmcob2xkbykpCisgICAgICBvbGRwcmlvPU5GX05MX0xJVklORzsKKyAgICBlbHNlIGlmICgoaW50KW9sZG8tPklzUm9vbSgpKQorICAgICAgb2xkcHJpbz1ORl9OTF9ST09NOworICAgIGVsc2UKKyAgICAgIG9sZHByaW89TkZfTkxfVEhJTkc7CisgIH0KKyAgZWxzZSAvLyB3ZW5uIGVzIG5vY2gga2VpbiBOb3RpZnlfZmFpbCBnaWJ0OgorICAgIG9sZHByaW89TkZfTkxfTk9ORTsKKworICAvL3ZlcmdsZWljaGVuIHVuZCBnZ2YuIHNldHplbgorICBpZiAocHJpbyA+PSBvbGRwcmlvKSB7IAorICAgIHNldF90aGlzX29iamVjdChwbyk7CisgICAgZWZ1bjo6bm90aWZ5X2ZhaWwobmYpOworICB9CisKKyAgcmV0dXJuOworfQorCit2b2lkIF9ub3RpZnlfZmFpbChzdHJpbmcgc3RyKQoreworICAvL3F1ZXJ5X25vdGlmeV9mYWlsKCkgYmVudXR6ZW4sIHVtIGRhcyBPYmpla3QKKyAgLy9kZXMgbGV0enRlbiBub3RpZnlfZmFpbCgpIHp1IGVybWl0dGVsbgorICBvYmplY3QgbzsKKyAgaWYgKChvPXF1ZXJ5X25vdGlmeV9mYWlsKDEpKSAmJiBvIT1wcmV2aW91c19vYmplY3QoKSkKKyAgICByZXR1cm47CisgIC8vbm9jaCBrZWluIG5vdGlmeV9mYWlsKCkgZnVlciBkaWVzZXMgS29tbWFuZG8gZ2VzZXR6dCwgYXVmIGdlaHRzLgorICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICBlZnVuOjpub3RpZnlfZmFpbChzdHIpOworICByZXR1cm47Cit9CisKK3N0cmluZyB0aW1lMnN0cmluZyggc3RyaW5nIGZvcm1hdCwgaW50IHplaXQgKQoreworICBpbnQgaSxjaCxtYXh1bml0LGR1bW15OworICBzdHJpbmcgKnBhcnRzLCBmbXQ7CisKKyAgaW50IHNlY3MgPSB6ZWl0OworICBpbnQgbWlucyA9ICh6ZWl0LzYwKTsKKyAgaW50IGhvdXJzID0gKHplaXQvMzYwMCk7CisgIGludCBkYXlzID0gKHplaXQvODY0MDApOworICBpbnQgd2Vla3MgPSAgKHplaXQvNjA0ODAwKTsKKyAgaW50IG1vbnRocyA9ICh6ZWl0LzI0MTkyMDApOworICBpbnQgYWJiciA9IDA7CisKKyAgcGFydHMgPSByZWdleHBsb2RlKCBmb3JtYXQsICJcKCVcKC18XClbMC05XSpbbndkaG1zeE5XREhNU1hdXCl8XCglJVwpIiApOworCisgIGZvciggaT0xOyBpPHNpemVvZihwYXJ0cyk7IGkrPTIgKQorICB7CisgICAgY2ggPSBwYXJ0c1tpXVs8MV07CisgICAgc3dpdGNoKCBwYXJ0c1tpXVs8MV0gKQorICAgIHsKKyAgICBjYXNlICd4JzogY2FzZSAnWCc6CisgICAgICAgYWJiciA9IHNzY2FuZiggcGFydHNbaV0sICIlJSVkIiwgZHVtbXkgKSAmJiBkdW1teT09MDsKKyAgICAgICAvLyBOTyBicmVhayAhCisgICAgY2FzZSAnbic6IGNhc2UgJ04nOgorICAgICAgIG1heHVuaXQgfD0gMzE7CisgICAgICAgYnJlYWs7CisgICAgY2FzZSAndyc6IGNhc2UgJ1cnOgorICAgICAgIG1heHVuaXQgfD0gMTU7CisgICAgICAgYnJlYWs7CisgICAgY2FzZSAnZCc6IGNhc2UgJ0QnOgorICAgICAgIG1heHVuaXQgfD0gNzsKKyAgICAgICBicmVhazsKKyAgICBjYXNlICdoJzogY2FzZSAnSCc6CisgICAgICAgbWF4dW5pdCB8PSAzOworICAgICAgIGJyZWFrOworICAgIGNhc2UgJ20nOiBjYXNlICdNJzoKKyAgICAgICBtYXh1bml0IHw9IDE7CisgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmKCBtYXh1bml0ICYgMTYgKSB3ZWVrcyAlPSA0OworICBpZiggbWF4dW5pdCAmIDggKSBkYXlzICU9IDc7CisgIGlmKCBtYXh1bml0ICYgNCApIGhvdXJzICU9IDI0OworICBpZiggbWF4dW5pdCAmIDIgKSBtaW5zICU9IDYwOworICBpZiggbWF4dW5pdCApIHNlY3MgJT0gNjA7CisKKyAgZm9yKCBpPTE7IGk8c2l6ZW9mKHBhcnRzKTsgaSs9MiApCisgIHsKKyAgICBmbXQgPSBwYXJ0c1tpXVswLi48Ml07CisgICAgY2ggPSBwYXJ0c1tpXVs8MV07CisgICAgaWYoIGNoPT0neCcgKQorICAgIHsKKyAgICAgIGlmIChtb250aHMgPiAwKSBjaD0nbic7CisgICAgICBlbHNlIGlmKCB3ZWVrcz4wICkgY2g9J3cnOworICAgICAgZWxzZSBpZiggZGF5cz4wICkgY2g9J2QnOworICAgICAgZWxzZSBpZiggaG91cnM+MCApIGNoPSdoJzsgCisgICAgICBlbHNlIGlmKG1pbnMgPiAwKSBjaCA9ICdtJzsKKyAgICAgIGVsc2UgY2ggPSAncyc7CisgICAgfQorICAgIGVsc2UgaWYoIGNoPT0nWCcgKQorICAgIHsKKyAgICAgIGlmIChtb250aHMgPiAwKSBjaD0nTic7CisgICAgICBlbHNlIGlmKCB3ZWVrcz4wICkgY2g9J1cnOworICAgICAgZWxzZSBpZiggZGF5cz4wICkgY2g9J0QnOworICAgICAgZWxzZSBpZiggaG91cnM+MCApIGNoPSdIJzsgCisgICAgICBlbHNlIGlmKG1pbnMgPiAwKSBjaCA9ICdNJzsKKyAgICAgIGVsc2UgY2ggPSAnUyc7CisgICAgfQorICAgIAorICAgIHN3aXRjaCggY2ggKQorICAgIHsKKyAgICAgIGNhc2UgJ24nOiBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsiZCIsIG1vbnRocyApOyBicmVhazsKKyAgICAgIGNhc2UgJ3cnOiBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsiZCIsIHdlZWtzICk7IGJyZWFrOworICAgICAgY2FzZSAnZCc6IHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJkIiwgZGF5cyApOyBicmVhazsKKyAgICAgIGNhc2UgJ2gnOiBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsiZCIsIGhvdXJzICk7IGJyZWFrOworICAgICAgY2FzZSAnbSc6IHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJkIiwgbWlucyApOyBicmVhazsKKyAgICAgIGNhc2UgJ3MnOiBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsiZCIsIHNlY3MgKTsgYnJlYWs7CisgICAgICBjYXNlICdOJzoKKyAgICAgICBpZihhYmJyKSBwYXJ0c1tpXSA9ICJNIjsKKyAgICAgICBlbHNlIHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJzIiwgKG1vbnRocz09MSkgPyAiTW9uYXQiIDogIk1vbmF0ZSIgKTsKKyAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ1cnOgorICAgICAgIGlmKGFiYnIpIHBhcnRzW2ldID0gInciOyBlbHNlCisgICAgICAgcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrInMiLCAod2Vla3M9PTEpID8gIldvY2hlIiA6ICJXb2NoZW4iICk7CisgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdEJzoKKyAgICAgICBpZihhYmJyKSBwYXJ0c1tpXSA9ICJkIjsgZWxzZQorICAgICAgIHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJzIiwgKGRheXM9PTEpID8gIlRhZyIgOiAiVGFnZSIgKTsKKyAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ0gnOgorICAgICAgIGlmKGFiYnIpIHBhcnRzW2ldID0gImgiOyBlbHNlCisgICAgICAgcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrInMiLCAoaG91cnM9PTEpID8gIlN0dW5kZSIgOiAiU3R1bmRlbiIgKTsKKyAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ00nOgorICAgICAgIGlmKGFiYnIpIHBhcnRzW2ldID0gIm0iOyBlbHNlCisgICAgICAgcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrInMiLCAobWlucz09MSkgPyAiTWludXRlIiA6ICJNaW51dGVuIiApOworICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnUyc6CisgICAgICAgaWYoYWJicikgcGFydHNbaV0gPSAicyI7IGVsc2UKKyAgICAgICBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsicyIsIChzZWNzPT0xKSA/ICJTZWt1bmRlIiA6ICJTZWt1bmRlbiIgKTsKKyAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJyUnOgorICAgICAgIHBhcnRzW2ldID0gIiUiOworICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaW1wbG9kZSggcGFydHMsICIiICk7Cit9CisKK25vbWFzayBtaXhlZCBfX2NyZWF0ZV9wbGF5ZXJfZHVtbXkoc3RyaW5nIG5hbWUpCit7CisgIHN0cmluZyBlcnI7CisgIG9iamVjdCBvYjsKKyAgbWl4ZWQgbTsKKyAgLy9oYXQgbmVuIFNjaGVyemtla3MgZGllIEJsdWVwcmludCBiZXdlZ3Q/CisgIGlmICgob2I9ZmluZF9vYmplY3QoIi9zZWN1cmUvbG9naW4iKSkgJiYgZW52aXJvbm1lbnQob2IpKQorICAgICAgY2F0Y2goZGVzdHJ1Y3Qob2IpO3B1Ymxpc2gpOworICBlcnIgPSBjYXRjaChvYiA9IGNsb25lX29iamVjdCgic2VjdXJlL2xvZ2luIik7cHVibGlzaCk7CisgIGlmIChlcnIpCisgIHsKKyAgICB3cml0ZSgiRmVobGVyIGJlaW0gTGFkZW4gdm9uIC9zZWN1cmUvbG9naW4uY1xuIitlcnIrIlxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKG9iamVjdHAobT0obWl4ZWQpb2ItPm5ld19sb2dvbihuYW1lKSkpIG5ldGRlYWRbbmFtZV09bTsKKyAgcmV0dXJuIG07Cit9CisKK25vbWFzayBpbnQgc2VjdXJlX2xldmVsKCkKK3sKKyAgaW50ICpsZXZlbDsKKyAgLy9rZXR0ZSBkZXIgQ2FsbGVyIGR1cmNobGF1ZmVuLCBkZW4gbmllZHJpZ3N0ZW4gTGV2ZWwgaW4gZGVyIEtldHRlCisgIC8venVydWVja2dlYmVuLiBaZXJzdG9lcnRlIE9iamVrdGUgKFNlbGJzdHplcnN0b2VyZXIpIGZ1ZWhyZW4genVyIFJ1ZWNrZ2FiZQorICAvL3ZvbiAwLgorICAvL2NhbGxlcl9zdGFjaygxKSBmdWVndCBkZW0gUnVlY2tnYWJlYXJyYXkgdGhpc19pbnRlcmFjdGl2ZSgpIGhpbnp1IGJ6dy4gMCwKKyAgLy93ZW5uIGVzIGtlaW5lbiBJbnRlcmFjdGl2ZSBnaWJ0LiBEaWUgMCBmdWVocnQgZGFubiB3aWUgYmVpIHplcnN0b2VydGVuCisgIC8vT2JqZWt0ZW4genVyIFJ1ZWNrZ2FiZSB2b24gMCwgd2FzIGdld3VlbnNjaHQgaXN0LCBkYSBlcyBoaWVyIGVpbmVuCisgIC8vSU50ZXJhY3RpdmUgZ2ViZW4gbXVzcy4KKyAgbGV2ZWw9bWFwKGNhbGxlcl9zdGFjaygxKSxmdW5jdGlvbiBpbnQgKG9iamVjdCBjYWxsZXIpCisgICAgICB7aWYgKG9iamVjdHAoY2FsbGVyKSkKKyAgICAgICByZXR1cm4ocXVlcnlfd2l6X2xldmVsKGdldGV1aWQoY2FsbGVyKSkpOworICAgICAgIHJldHVybigwKTsgLy8ga2VpbiBPYmpla3QgZGEsIDAuCisgICAgICB9ICk7CisgIHJldHVybihtaW4obGV2ZWwpKTsgLy9kZW4ga2xlaW5zdGVuIFdlcnQgaW0gQXJyYXkgenVydWVja2dlYmVuIChnZ2YuIDApCit9CisKK25vbWFzayBzdHJpbmcgc2VjdXJlX2V1aWQoKQoreworICBzdHJpbmcgZXVpZDsKKworICBpZiAoIXRoaXNfaW50ZXJhY3RpdmUoKSkgLy8gRXMgbXVzcyBlaW5lbiBpbnRlcmFjdGl2ZSBnZWJlbgorICAgICByZXR1cm4gMDsKKyAgZXVpZD1nZXRldWlkKHRoaXNfaW50ZXJhY3RpdmUoKSk7CisgIC8vIHVlYmVyIGFsbGUgQ2FsbGVyIGl0ZXJpZXJlbi4gV2VubiBlaW5lcyBkYXZvbiBlaW5lIGFuZGVyZSBldWlkIGhhdCBhbHMKKyAgLy8gZGVyIEludGVyYWN0aXZlIHVuZCBkaWVzZSBuaWNodCBkaWUgUk9PVElEIGlzdCwgd2lyZCAwIHp1cnVlY2tnZWJlbi4KKyAgLy8gRWJlbnNvLCBmYWxscyBlaW4gU2VsYnN0emVyc3RvZXJlciBpcmdlbmR3byBpbiBkZXIgS2V0dGUgaXN0LgorICBmb3JlYWNoKG9iamVjdCBjYWxsZXI6IGNhbGxlcl9zdGFjaygpKSB7CisgICAgICBpZiAoIW9iamVjdHAoY2FsbGVyKSB8fAorICAgICAgIChnZXRldWlkKGNhbGxlcikhPWV1aWQgJiYgZ2V0ZXVpZChjYWxsZXIpIT1ST09USUQpKQorICAgICAgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIGV1aWQ7IC8vICdzaWNoZXJlJyBldWlkIHp1cnVlY2tnZWJlbgorfQorCisvLyBJTlBVVF9QUk9NUFQgdW5kIG5lbiBMZWVycHJvbXB0IGhpbnp1ZnVlZ2VuLCB3ZW5uIGtlaW5zIHVlYmVyZ2ViZW4gd2lyZC4KKy8vIERhcyBzb2xsIGRhenUgZGllbmVuLCBkYXNzIGFsbGUgZ2dmLiBlaW4gRU9SIGFtIFByb21wdGVuZGUga3JpZWdlbi4uLgorLy8jaWYgX19CT09UX1RJTUVfXyA8IDEzNjAwMTcyMTMKK3ZhcmFyZ3Mgdm9pZCBpbnB1dF90byggbWl4ZWQgZnVuLCBpbnQgZmxhZ3MsIHZhcmFyZ3MgbWl4ZWQgKmFyZ3MgKQoreworICAgIG1peGVkICphcnI7CisgICAgaW50IGk7CisKKyAgICBpZiAoICF0aGlzX3BsYXllcigpIHx8ICFwcmV2aW91c19vYmplY3QoKSApCisgICAgICAgcmV0dXJuOworCisgICAgLy8gVE9ETzogaW5wdXRfdG8oLi4uLElOUFVUX1BST01QVCwgIiIsIC4uLiksIHdlbm4ga2VpbiBJTlBVVF9QUk9NUFQKKyAgICAvLyB2b3Jrb21tdC4uLgorICAgIGlmICggZmxhZ3MmSU5QVVRfUFJPTVBUICkgeyAgICAKKyAgICAgICAgYXJyID0gKHsgZnVuLCBmbGFncyB9KSArIGFyZ3M7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvLyBnZ2YuIGVpbiBJTlBVVF9QUk9NUFQgaGluenVmdWVnZW4gdW5kIG5lbiBMZWVyc3RyaW5nIGFscyBQcm9tcHQuCisgICAgICAgIGZsYWdzIHw9IElOUFVUX1BST01QVDsKKyAgICAgICAgYXJyID0gKHsgZnVuLCBmbGFncywgIiIgfSkgKyBhcmdzOworICAgIH0KKworICAgIC8vIEFycmF5cyBnZWdlbiBmbGF0dGVuIHF1b3Rlbi4KKyAgICBmb3IgKCBpID0gc2l6ZW9mKGFycikgLSAxOyBpID4gMTsgaS0tICkKKyAgICAgICBpZiAoIHBvaW50ZXJwKGFycltpXSkgKQorICAgICAgICAgICBhcnJbaV0gPSBxdW90ZShhcnJbaV0pOworCisgICAgYXBwbHkoIGJpbmRfbGFtYmRhKCB1bmJvdW5kX2xhbWJkYSggKHt9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeyAjJ2VmdW46OmlucHV0X3RvLyonKi8gfSkgKyBhcnIgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNfb2JqZWN0KCkgKSApOworfQorLy8jZW5kaWYKKworbm9tYXNrIGludCBzZXRfbGlnaHQoaW50IGkpCisvLyBlcmhvZWh0IGRhcyBMaWNodGxldmVsIGVpbmVzIE9iamVrdHMgdW0gaQorLy8gcmVzdWx0OiBkYXMgTGljaHRsZXZlbCBpbm5lcmhhbGIgZGVzIE9iamVrdHMKK3sKKyAgICBvYmplY3Qgb2IsICppbnY7CisgICAgaW50IGxhbGwsIGxpZ2h0LCBkYXJrLCB0bXA7CisKKyAgICBpZiAoIShvYj1wcmV2aW91c19vYmplY3QoKSkpIHJldHVybiAwOyAvLyBvaG5lIGRhcyBnZWh0cyBuaWNodC4KKworICAgIC8vIGF1cyBrb21wYXRpYmlsaXRhZXRzZ3J1ZW5kZW4ga2FubiBtYW4gYXVjaCBkZW4gTGljaHRsZXZlbCBub2NoIHNldHplbgorICAgIGlmIChpIT0wKSBvYi0+U2V0UHJvcChQX0xJR0hULCBvYi0+UXVlcnlQcm9wKFBfTElHSFQpK2kpOworCisgICAgLy8gTGljaHRiZXJlY2hudW5nIGZpbmRldCBlaWdlbnRsaWNoIGluIGRlciBNdWRsaWIgc3RhdHQuCisgICAgcmV0dXJuIChpbnQpb2ItPlF1ZXJ5UHJvcChQX0lOVF9MSUdIVCk7Cit9CisKKworcHVibGljIHN0cmluZyBpc28yYXNjaWkoIHN0cmluZyBzdHIgKQoreworICAgIGlmICggIXN0cmluZ3Aoc3RyKSB8fCAhc2l6ZW9mKHN0cikgKQorICAgICAgIHJldHVybiAiIjsKKworICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgIuQiLCAiYWUiLCAxICk7CisgICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAi9iIsICJvZSIsIDEgKTsKKyAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICL8IiwgInVlIiwgMSApOworICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgIsQiLCAiQWUiLCAxICk7CisgICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAi1iIsICJPZSIsIDEgKTsKKyAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICLcIiwgIlVlIiwgMSApOworICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgIt8iLCAic3MiLCAxICk7CisgICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAiW14gLX5dIiwgIj8iLCAxICk7CisKKyAgICByZXR1cm4gc3RyOworfQorCisKK3B1YmxpYyB2YXJhcmdzIHN0cmluZyBDb3VudFVwKCBzdHJpbmcgKnMsIHN0cmluZyBzZXAsIHN0cmluZyBsYXN0c2VwICkKK3sKKyAgICBzdHJpbmcgcmV0OworCisgICAgaWYgKCAhcG9pbnRlcnAocykgKQorICAgICAgIHJldHVybiAiIjsKKyAgICAKKyAgICBpZiAoIXNlcCkgc2VwID0gIiwgIjsKKyAgICBpZiAoIWxhc3RzZXApIGxhc3RzZXAgPSAiIHVuZCAiOworCisgICAgc3dpdGNoIChzaXplb2YocykpICB7CisgICAgICAgY2FzZSAwOiByZXQ9IiI7IGJyZWFrOworICAgICAgIGNhc2UgMTogcmV0PXNbMF07IGJyZWFrOworICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIHJldCA9IGltcGxvZGUoc1swLi48Ml0sIHNlcCk7CisgICAgICAgICAgICAgIHJldCArPSBsYXN0c2VwICsgc1s8MV07CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK25vbWFzayB2YXJhcmdzIGludCBxdWVyeV9uZXh0X3Jlc2V0KG9iamVjdCBvYikgeworCisgICAgLy8gVHlwcHJ1ZWZ1bmc6IGV0d2FzIGFuZGVyZXMgYWxzIE9iamVrdGUgb2RlciAwIHNvbGxlbiBGZWhsZXIgc2Vpbi4KKyAgICBpZiAob2IgJiYgIW9iamVjdHAob2IpKQorICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiQmFkIGFyZyAxIHRvIHF1ZXJ5X25leHRfcmVzZXQoKTogZ290ICUuMjBPLCAiCisgICAgICAgICAgICJleHBlY3RlZCBvYmplY3QuXG4iLG9iKSk7CisKKyAgICAvLyBEZWZhdWx0b2JqZWt0IFBPLCB3ZW5uIDAgdWViZXJnZWJlbi4KKyAgICBpZiAoICFvYmplY3RwKG9iKSApCisgICAgICBvYiA9IHByZXZpb3VzX29iamVjdCgpOworCisgICAgcmV0dXJuIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9ORVhUX1JFU0VUX1RJTUUpOworfQorCisKKyNpZiAhX19FRlVOX0RFRklORURfXyhjb3B5X2ZpbGUpCisjZGVmaW5lIE1BWExFTiA1MDAwMAorbm9tYXNrIGludCBjb3B5X2ZpbGUoc3RyaW5nIHNvdXJjZSwgc3RyaW5nIGRlc3QpCit7CisKKyAgaW50IHB0cjsKKyAgc3RyaW5nIGJ5dGVzOworCisgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgIGlmICghc2l6ZW9mKHNvdXJjZSl8fCFzaXplb2YoZGVzdCl8fHNvdXJjZT09ZGVzdHx8KGZpbGVfc2l6ZShzb3VyY2UpPT0tMSl8fAorICAgICAgKCFjYWxsX290aGVyKG1hc3RlcigpLCJ2YWxpZF9yZWFkIixzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKXx8CisgICAgICAgICAgICAgICAgIHByZXZpb3VzX29iamVjdCgpKSwicmVhZF9maWxlIixwcmV2aW91c19vYmplY3QoKSkpfHwKKyAgICAgICghY2FsbF9vdGhlcihtYXN0ZXIoKSwidmFsaWRfcmVhZCIsc291cmNlLAorICAgICAgICAgICAgICAgICAgIGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCl8fAorICAgICAgICAgICAgICAgICBwcmV2aW91c19vYmplY3QoKSksIndyaXRlX2ZpbGUiLHByZXZpb3VzX29iamVjdCgpKSkpCisgICAgcmV0dXJuIDE7CisgIHN3aXRjaCAoZmlsZV9zaXplKGRlc3QpKQorICB7CisgIGNhc2UgLTE6CisgICAgYnJlYWs7CisgIGNhc2UgLTI6CisgICAgaWYgKGRlc3RbPDFdIT0nLycpIGRlc3QrPSIvIjsKKyAgICBkZXN0Kz1lZnVuOjpleHBsb2RlKHNvdXJjZSwiLyIpWzwxXTsKKyAgICBpZiAoZmlsZV9zaXplKGRlc3QpPT0tMikgcmV0dXJuIDE7CisgICAgaWYgKGZpbGVfc2l6ZShkZXN0KSE9LTEpIGJyZWFrOworICBkZWZhdWx0OgorICAgIGlmICghcm0oZGVzdCkpIHJldHVybiAxOworICAgIGJyZWFrOworICB9CisgIGRvCisgIHsKKyAgICBieXRlcyA9IHJlYWRfYnl0ZXMoc291cmNlLCBwdHIsIE1BWExFTik7IHB0ciArPSBNQVhMRU47CisgICAgaWYgKCFieXRlcykgYnl0ZXM9IiI7CisgICAgd3JpdGVfZmlsZShkZXN0LCBieXRlcyk7CisgIH0KKyAgd2hpbGUoc2l6ZW9mKGJ5dGVzKSA9PSBNQVhMRU4pOworICByZXR1cm4gMDsKK30KKyNlbmRpZiAvLyFfX0VGVU5fREVGSU5FRF9fKGNvcHlfZmlsZSkKKworCisvLyAjIyMgRXJzYXR6YXVmbG9lc3VuZyBpbiBTdHJpbmdzICMjIwordmFyYXJncyBzdHJpbmcgcmVwbGFjZV9wZXJzb25hbChzdHJpbmcgc3RyLCBtaXhlZCAqb2JzLCBpbnQgY2FwcykgeworICBpbnQgaTsKKyAgc3RyaW5nICpwYXJ0czsKKworICBwYXJ0cyA9IHJlZ2V4cGxvZGUoc3RyLCAiQFdFW0EtU1VdKlswLTldIik7CisgIGkgPSBzaXplb2YocGFydHMpOworCisgIGlmIChpPjEpIHsKKyAgICBpbnQgaiwgdDsKKyAgICBjbG9zdXJlICpuYW1lX2NsczsKKworICAgIHQgPSBqID0gc2l6ZW9mKG9icyk7CisKKyAgICBuYW1lX2NscyAgPSAgYWxsb2NhdGUoaik7CisgICAgd2hpbGUgKGotLSkKKyAgICAgIGlmIChvYmplY3RwKG9ic1tqXSkpCisgICAgICAgIG5hbWVfY2xzW2pdID0gc3ltYm9sX2Z1bmN0aW9uKCJuYW1lIiwgb2JzW2pdKTsKKyAgICAgIGVsc2UgaWYgKHN0cmluZ3Aob2JzW2pdKSkKKyAgICAgICAgbmFtZV9jbHNbal0gPSBvYnNbal07CisKKyAgICB3aGlsZSAoKGktPSAyKT4wKSB7CisgICAgICBpbnQgb2JfbnI7CisgICAgICAvLyB6dSBlcnNldHplbmRlcyBUb2tlbiBpbiBGYWxsIHVuZCBPYmpla3RpbmRleCBhdWZzcGFsdGVuCisgICAgICBvYl9uciA9IHBhcnRzW2ldWzwxXS0nMSc7CisgICAgICBpZiAob2JfbnI8MCB8fCBvYl9ucj49dCkgeworICAgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJyZXBsYWNlX3BlcnNvbmFsOiB1c2luZyB3cm9uZyBvYmplY3QgaW5kZXggJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIG9iX25yKSk7CisgICAgICAgIHJldHVybiBpbXBsb2RlKHBhcnRzLCAiIik7CisgICAgICB9CisKKyAgICAgIC8vIGNhc3VzIGthbm4gbWFuIHNjaG9uIGhpZXIgZW50c2NoZWlkZW4KKyAgICAgIGludCBjYXN1czsKKyAgICAgIHN0cmluZyBwYXJ0ID0gcGFydHNbaV07CisgICAgICBzd2l0Y2ggKHBhcnRbM10pIHsKKyAgICAgICAgY2FzZSAnUic6IGNhc3VzID0gV0VSOyAgICBicmVhazsKKyAgICAgICAgY2FzZSAnUyc6IGNhc3VzID0gV0VTU0VOOyBicmVhazsKKyAgICAgICAgY2FzZSAnTSc6IGNhc3VzID0gV0VNOyAgICBicmVhazsKKyAgICAgICAgY2FzZSAnTic6IGNhc3VzID0gV0VOOyAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogIGNvbnRpbnVlOyAvLyBwYXNzdCBzY2hvbiBqZXR6dCBuaWNodCBpbiBkYXMgSGF1cHRtdXN0ZXIKKyAgICAgIH0KKworICAgICAgLy8gdW5kIGpldHp0IGRpZSBlaW56ZWxuZW4gS2V5d29yZHMgb2huZSBmdWVocmVuZGVzICJAV0UiLCBiZWVuZGVuZGUgSWQKKyAgICAgIG1peGVkIHRtcDsKKyAgICAgIHN3aXRjaCAocGFydFszLi48Ml0pIHsKKyAgICAgICAgY2FzZSAiUiI6IGNhc2UgIlNTRU4iOiBjYXNlICJNIjogY2FzZSAiTiI6ICAgICAgICAgICAgICAgLy8gTmFtZQorICAgICAgICAgIHBhcnRzW2ldID0gZnVuY2FsbChuYW1lX2Nsc1tvYl9ucl0sIGNhc3VzLCAxKTsgIGJyZWFrOworICAgICAgICBjYXNlICJSVSI6IGNhc2UgIlNTRU5VIjogY2FzZSAiTVUiOiBjYXNlICJOVSI6ICAgICAgICAgICAvLyB1bmJlc3RpbW10CisgICAgICAgICAgcGFydHNbaV0gPSBmdW5jYWxsKG5hbWVfY2xzW29iX25yXSwgY2FzdXMpOyAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgIlJRUCI6IGNhc2UgIlNTRU5RUCI6IGNhc2UgIk1RUCI6IGNhc2UgIk5RUCI6ICAgICAgIC8vIFByb25vdW4KKyAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKKyAgICAgICAgICAgIHBhcnRzW2ldID0gKHN0cmluZyl0bXAtPlF1ZXJ5UHJvbm91bihjYXN1cyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgIlJRQSI6IGNhc2UgIlNTRU5RQSI6IGNhc2UgIk1RQSI6IGNhc2UgIk5RQSI6ICAgICAgIC8vIEFydGljbGUKKyAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKKyAgICAgICAgICAgIHRtcCA9IChzdHJpbmcpdG1wLT5RdWVyeUFydGljbGUoY2FzdXMsIDEsIDEpOworICAgICAgICAgIGlmIChzdHJpbmdwKHRtcCkgJiYgISh0bXBbPDFdXicgJykpIAorICAgICAgICAgICAgdG1wID0gdG1wWzAuLjwyXTsgICAgICAgICAgICAgICAgLy8gRXh0cmEtU3BhY2Ugd2llZGVyIGxvZXNjaGVuCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgIlJRUFBNUyI6IGNhc2UgIlNTRU5RUFBNUyI6IGNhc2UgIk1RUFBNUyI6IGNhc2UgIk5RUFBNUyI6CisgICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCisgICAgICAgICAgICBwYXJ0c1tpXSA9IChzdHJpbmcpdG1wLT5RdWVyeVBvc3NQcm9ub3VuKE1BTEUsIGNhc3VzLCBTSU5HVUxBUik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgIlJRUFBGUyI6IGNhc2UgIlNTRU5RUFBGUyI6IGNhc2UgIk1RUFBGUyI6IGNhc2UgIk5RUFBGUyI6CisgICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCisgICAgICAgICAgICBwYXJ0c1tpXSA9IChzdHJpbmcpdG1wLT5RdWVyeVBvc3NQcm9ub3VuKEZFTUFMRSwgY2FzdXMsIFNJTkdVTEFSKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiUlFQUE5TIjogY2FzZSAiU1NFTlFQUE5TIjogY2FzZSAiTVFQUE5TIjogY2FzZSAiTlFQUE5TIjoKKyAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKKyAgICAgICAgICAgIHBhcnRzW2ldID0gKHN0cmluZyl0bXAtPlF1ZXJ5UG9zc1Byb25vdW4oTkVVVEVSLCBjYXN1cywgU0lOR1VMQVIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICJSUVBQTVAiOiBjYXNlICJTU0VOUVBQTVAiOiBjYXNlICJNUVBQTVAiOiBjYXNlICJOUVBQTVAiOgorICAgICAgICAgIGlmIChvYmplY3RwKHRtcCA9IG9ic1tvYl9ucl0pKQorICAgICAgICAgICAgcGFydHNbaV0gPSAoc3RyaW5nKXRtcC0+UXVlcnlQb3NzUHJvbm91bihNQUxFLCBjYXN1cywgUExVUkFMKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiUlFQUEZQIjogY2FzZSAiU1NFTlFQUEZQIjogY2FzZSAiTVFQUEZQIjogY2FzZSAiTlFQUEZQIjoKKyAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKKyAgICAgICAgICAgIHBhcnRzW2ldID0gKHN0cmluZyl0bXAtPlF1ZXJ5UG9zc1Byb25vdW4oRkVNQUxFLCBjYXN1cywgUExVUkFMKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiUlFQUE5QIjogY2FzZSAiU1NFTlFQUE5QIjogY2FzZSAiTVFQUE5QIjogY2FzZSAiTlFQUE5QIjoKKyAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKKyAgICAgICAgICAgIHBhcnRzW2ldID0gKHN0cmluZyl0bXAtPlF1ZXJ5UG9zc1Byb25vdW4oTkVVVEVSLCBjYXN1cywgUExVUkFMKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gd2VubiB0bXAgZWluIFN0cmluZyB3YXIsIHdlaXNlbiB3aXIgZXMgaGllciBwYXVzY2hhbCB6dQorICAgICAgaWYgKHN0cmluZ3AodG1wKSkKKyAgICAgICAgcGFydHNbaV0gPSB0bXA7CisKKyAgICAgIC8vIGF1ZiBXdW5zY2ggd2lyZCBuYWNoIFNhdHplbmRlbiBncm9zcyBnZXNjaHJpZWJlbgorICAgICAgaWYgKGNhcHMpCisgICAgICAgIHN3aXRjaCAocGFydHNbaS0xXVs8Mi4uXSkgeworICAgICAgICAgIGNhc2UgIi4gIjogIGNhc2UgIiEgIjogIGNhc2UgIj8gIjoKKyAgICAgICAgICBjYXNlICIuIjogICBjYXNlICIhIjogICBjYXNlICI/IjoKKyAgICAgICAgICBjYXNlICIuXG4iOiBjYXNlICIhXG4iOiBjYXNlICI/XG4iOgorICAgICAgICAgIGNhc2UgIlwiICI6IGNhc2UgIlwiXG4iOgorICAgICAgICAgICAgcGFydHNbaV0gPSBjYXBpdGFsaXplKHBhcnRzW2ldKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbXBsb2RlKHBhcnRzLCAiIik7CisgIH0KKyAgcmV0dXJuIHN0cjsKK30KKworCisvL3JlcGxhY2VtZW50cyBmb3IgZHJvcHBlZCBlZnVucyBpbiBMRAorI2lmICFfX0VGVU5fREVGSU5FRF9fKGV4dHJhY3QpCitkZXByZWNhdGVkIHZhcmFyZ3Mgc3RyaW5nIGV4dHJhY3Qoc3RyaW5nIHN0ciwgaW50IGZyb20sIGludCB0bykgeworCisgIGlmKCFzdHJpbmdwKHN0cikpIHsKKyAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIkJhZCBhcmd1bWVudCAxIHRvIGV4dHJhY3QoKTogJU8iLHN0cikpOworICB9CisgIGlmIChpbnRwKGZyb20pICYmIGludHAodG8pKSB7CisgICAgaWYgKGZyb20+PTAgJiYgdG8+PTApCisgICAgICByZXR1cm4oc3RyW2Zyb20gLi4gdG9dKTsKKyAgICBlbHNlIGlmIChmcm9tPj0wICYmIHRvPDApCisgICAgICByZXR1cm4oc3RyW2Zyb20gLi4gPGFicyh0byldKTsKKyAgICBlbHNlIGlmIChmcm9tPDAgJiYgdG8+PTApCisgICAgICByZXR1cm4oc3RyWzxhYnMoZnJvbSkgLi4gdG9dKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4oc3RyWzxhYnMoZnJvbSkgLi4gPGFicyh0byldKTsKKyAgfQorICBlbHNlIGlmIChpbnRwKGZyb20pKSB7CisgICAgaWYgKGZyb20+PTApCisgICAgICByZXR1cm4oc3RyW2Zyb20gLi4gXSk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKHN0cls8YWJzKGZyb20pIC4uIF0pOworICB9CisgIGVsc2UgeworICAgIHJldHVybihzdHIpOworICB9Cit9CisjZW5kaWYgLy8gIV9fRUZVTl9ERUZJTkVEX18oZXh0cmFjdCkKKworI2lmICFfX0VGVU5fREVGSU5FRF9fKHNsaWNlX2FycmF5KQorZGVwcmVjYXRlZCB2YXJhcmdzIG1peGVkIHNsaWNlX2FycmF5KG1peGVkIGFycmF5LCBpbnQgZnJvbSwgaW50IHRvKSB7CisKKyAgaWYoIXBvaW50ZXJwKGFycmF5KSkgeworICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiQmFkIGFyZ3VtZW50IDEgdG8gc2xpY2VfYXJyYXkoKTogJU8iLGFycmF5KSk7CisgIH0KKyAgaWYgKGludHAoZnJvbSkgJiYgaW50cCh0bykpIHsKKyAgICBpZiAoZnJvbT49MCAmJiB0bz49MCkKKyAgICAgIHJldHVybihhcnJheVtmcm9tIC4uIHRvXSk7CisgICAgZWxzZSBpZiAoZnJvbT49MCAmJiB0bzwwKQorICAgICAgcmV0dXJuKGFycmF5W2Zyb20gLi4gPGFicyh0byldKTsKKyAgICBlbHNlIGlmIChmcm9tPDAgJiYgdG8+PTApCisgICAgICByZXR1cm4oYXJyYXlbPGFicyhmcm9tKSAuLiB0b10pOworICAgIGVsc2UKKyAgICAgIHJldHVybihhcnJheVs8YWJzKGZyb20pIC4uIDxhYnModG8pXSk7CisgIH0KKyAgZWxzZSBpZiAoaW50cChmcm9tKSkgeworICAgIGlmIChmcm9tPj0wKQorICAgICAgcmV0dXJuKGFycmF5W2Zyb20gLi4gXSk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKGFycmF5WzxhYnMoZnJvbSkgLi4gXSk7CisgIH0KKyAgZWxzZSB7CisgICAgcmV0dXJuKGFycmF5KTsKKyAgfQorfQorI2VuZGlmIC8vICFfX0VGVU5fREVGSU5FRF9fKHNsaWNlX2FycmF5KQorCisjaWYgIV9fRUZVTl9ERUZJTkVEX18obWVtYmVyX2FycmF5KQorZGVwcmVjYXRlZCBpbnQgbWVtYmVyX2FycmF5KG1peGVkIGl0ZW0sIG1peGVkIGFycmF5c3RyaW5nKSB7CisKKyAgaWYgKHBvaW50ZXJwKGFycmF5c3RyaW5nKSkgeworICAgIHJldHVybihlZnVuOjptZW1iZXIoYXJyYXlzdHJpbmcsaXRlbSkpOworICB9CisgIGVsc2UgaWYgKHN0cmluZ3AoYXJyYXlzdHJpbmcpKSB7CisgICAgcmV0dXJuKGVmdW46Om1lbWJlcihhcnJheXN0cmluZyx0b19pbnQoaXRlbSkpKTsKKyAgfQorICBlbHNlIHsKKyAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIkJhZCBhcmd1bWVudCAxIHRvIG1lbWJlcl9hcnJheSgpOiAlTyIsYXJyYXlzdHJpbmcpKTsKKyAgfQorfQorI2VuZGlmIC8vICFfX0VGVU5fREVGSU5FRF9fKG1lbWJlcl9hcnJheSkKKworLy8gVGhlIGRpZ2l0IGF0IHRoZSBpJ3RoIHBvc2l0aW9uIGlzIHRoZSBudW1iZXIgb2YgYml0cyBzZXQgaW4gJ2knLgorc3RyaW5nIGNvdW50X3RhYmxlID0KKyAgICAiMDExMjEyMjMxMjIzMjMzNDEyMjMyMzM0MjMzNDM0NDUxMjIzMjMzNDIzMzQzNDQ1MjMzNDM0NDUzNDQ1NDU1NiI7CitpbnQgYnJva2VuX2NvdW50X2JpdHMoIHN0cmluZyBzICkgeworICAgIGludCBpLCByZXM7CisgICAgaWYoICFzdHJpbmdwKHMpIHx8ICEoaT1zaXplb2YocykpICkgcmV0dXJuIDA7CisgICAgZm9yKCA7IGktLT4wOyApIHsKKyAgICAgICAgLy8gV2UgYXJlIGNvdW50aW5nIDYgYml0cyBhdCBhIHRpbWUgdXNpbmcgYSBwcmVjb21waWxlZCB0YWJsZS4KKyAgICAgICAgcmVzICs9IGNvdW50X3RhYmxlWyhzW2ldLScgJykmNjNdLScwJzsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworI2lmICFfX0VGVU5fREVGSU5FRF9fKGNvdW50X2JpdHMpCitpbnQgY291bnRfYml0cyggc3RyaW5nIHMgKSB7CisgICAgcmV0dXJuKGJyb2tlbl9jb3VudF9iaXRzKHMpKTsKK30KKyNlbmRpZgorCisKKy8vICogVGVpbGUgYXVzIGVpbmVtIEFycmF5IGVudGZlcm5lbiAqKiogT0JTT0xFVEUKK2RlcHJlY2F0ZWQgbWl4ZWQgKmV4Y2x1ZGVfYXJyYXkobWl4ZWQgKmFycixpbnQgZnJvbSxpbnQgdG8pCit7CisgIGlmICh0bzxmcm9tKQorICAgIHRvID0gZnJvbTsKKyAgcmV0dXJuIGFyclswLi5mcm9tLTFdK2Fyclt0bysxLi5dOworfQorCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9SRUFETUUgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAzNDI5YQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL1JFQURNRQpAQCAtMCwwICsxLDIwIEBACitzaW11bF9lZnVuIAorLS0tLS0tLS0tLSAKK0RhcyBzaW11bF9lZnVuIE9iamVrdCAvc2VjdXJlL3NpbXVsX2VmdW4vc2ltdWxfZWZ1biBiZW51dHp0IGRpZSBEYXRlaWVuCitpbiAvc2VjdXJlL3NpbXVsX2VmdW4uCitJbSBWZXJ6ZWljaG5pcyAvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUgaXN0IGVpbmUgU2ljaGVyaGVpdHNrb3BpZSB2b24gYWxsZW4gCitEYXRlaWVuIGluIC9zZWN1cmUvc2ltdWxfZWZ1bi4KKworRmFsbHMgL3NlY3VyZS9zaW11bF9lZnVuL3NpbXVsX2VmdW4uYyBuaWNodCBsYWRiYXIgaXN0LCB3aXJkIAorL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NpbXVsX2VmdW4uYyBhbHMgRXJzYXR6IHZlcnN1Y2h0LiBXZW5uIGF1Y2ggZGFzCituaWNodCBsYWRiYXIgaXN0LCBlcmZvbGd0IGVpbiBTaHV0ZG93biBkZXMgTXVkcy4KKworQmVpIEFlbmRlcnVuZ2VuIHNvbGx0ZSBfenVlcnN0XyBkaWUgbm9ybWFsZSBzaW11bCBlZnVuIGVkaXRpZXJ0IHVuZAorYW5zY2hsaWVzc2VuZCB6ZXJzdG9lcnQvZW50bGFkZW4gd2VyZGVuLCB3b3JhdWZoaW4gc2llIGltcGxpeml0IGR1cmNoIGRlbgorRHJpdmVyIHVuZCBNYXN0ZXIgbmV1Z2VsYWRlbiB3aXJkLiBJc3QgZGllcyBlcmZvbGdyZWljaCB1bmQgZGllIG5ldWUKK3NpbXVsX2VmdW4gbGFldWZ0IChlcnN0IGRhbm4hKSBrb3BpZXJ0IG1hbiBkaWUgRGF0ZWllbiBhdXMgCisvc2VjdXJlL3NpbXVsX2VmdW4gbmFjaCAvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUuCisKK0RpZSBEYXRlaWVuIGhpZXIgc2luZCBtaXQgQXVzbmFobWUgZGVyIHNpbXVsX2VmdW4uYyBzZWxic3QgX25pY2h0XyBkYXp1IAorZ2VkYWNodCwgZ2VsYWRlbiB6dSB3ZXJkZW4uCisKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL2NvbW0uYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL2NvbW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTViODUyCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvY29tbS5jCkBAIC0wLDAgKzEsMTI0IEBACisjaW5jbHVkZSA8bGl2aW5nL2NvbW0uaD4KKworLy8gU2VuZGV0IGFuIGFsbGUgT2JqZWt0ZSBpbiByb29tIHVuZCByb29tIHNlbGJlciBkdXJjaCBBdWZydWYgdm9uCisvLyBSZWNlaXZlTXNnKCkuCit2YXJhcmdzIHZvaWQgc2VuZF9yb29tKG9iamVjdHxzdHJpbmcgcm9vbSwgc3RyaW5nIG1zZywgaW50IG1zZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbXNnX2FjdGlvbiwgc3RyaW5nIG1zZ19wcmVmaXgsIG9iamVjdCAqZXhjbHVkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IG9yaWdpbikKK3sKKyAgaWYgKHN0cmluZ3Aocm9vbSkpCisgICAgcm9vbT1sb2FkX29iamVjdChyb29tKTsKKworICBvcmlnaW4gfHw9IHByZXZpb3VzX29iamVjdCgpOworICBvYmplY3QgKmRlc3QgPSBleGNsdWRlID8gYWxsX2ludmVudG9yeShyb29tKSAtIGV4Y2x1ZGUgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsX2ludmVudG9yeShyb29tKTsKKworICBkZXN0LT5SZWNlaXZlTXNnKG1zZywgbXNnX3R5cGUsIG1zZ19hY3Rpb24sIG1zZ19wcmVmaXgsIG9yaWdpbik7Cit9CisKK3N0YXRpYyBpbnQgX3Nob3V0X2ZpbHRlciggb2JqZWN0IG9iLCBzdHJpbmcgcGF0ICkKK3sKKyAgICBzdHJpbmcgKmlnbm9yZTsKKworICAgIGlmICggIWVudmlyb25tZW50KG9iKSApCisgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gc2l6ZW9mKCByZWdleHAoICh7IG9iamVjdF9uYW1lKCBlbnZpcm9ubWVudChvYikgKSB9KSwgcGF0ICkgKTsKK30KKwordmFyYXJncyB2b2lkIHNob3V0KCBzdHJpbmcgcywgbWl4ZWQgd2hlcmUgKXsKKyAgICBvYmplY3QgKnU7CisgICAgc3RyaW5nICpwZmFkZTsKKworICAgIGlmICggIXNpemVvZiggdSA9IHVzZXJzKCkgLSAoeyB0aGlzX3BsYXllcigpIH0pICkgKQorICAgICAgIHJldHVybjsKKworICAgIGlmICggIXdoZXJlICkKKyAgICAgICBwZmFkZSA9ICh7ICIvIiB9KTsKKyAgICBlbHNlIGlmICggaW50cCh3aGVyZSkgKQorICAgICAgIHBmYWRlID0KKyAgICAgICAgICAgKHsgaW1wbG9kZSggZWZ1bjo6ZXhwbG9kZSggb2JqZWN0X25hbWUoIGVudmlyb25tZW50KHRoaXNfcGxheWVyKCkpICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvIiApWzAuLjJdLCAiLyIgKSArICIvIiB9KTsKKyAgICBlbHNlIGlmICggc3RyaW5ncCh3aGVyZSkgKQorICAgICAgIHBmYWRlID0gKHsgd2hlcmUgfSk7CisgICAgZWxzZQorICAgICAgIHBmYWRlID0gd2hlcmU7CisKKyAgICB1ID0gZmlsdGVyKCB1LCAiX3Nob3V0X2ZpbHRlciIsIE1FLCBpbXBsb2RlKCBwZmFkZSwgInwiICkgKTsKKyAgICB1LT5SZWNlaXZlTXNnKHMsIE1UX0NPTU18TVRfRkFSfE1TR19ET05UX1dSQVB8TVNHX0RPTlRfU1RPUkUsCisgICAgICAgICAgICAgICAgICBNQV9TSE9VVF9TRUZVTiwgMCwgcHJldmlvdXNfb2JqZWN0KCkpOworfQorCisKKyNpZiBfX1ZFUlNJT05fXyA+ICIzLjMuNzE4IgorLy8gVGhpcyBzZWZ1biByZXBsYWNlcyB0aGUgZGVwcmVjYXRlZCBlZnVuIGNhdCgpLgorI2RlZmluZSBDQVRfTUFYX0xJTkVTIDUwCit2YXJhcmdzIGludCBjYXQoc3RyaW5nIGZpbGUsIGludCBzdGFydCwgaW50IG51bSkKK3sKKyAgICBpZiAoZXh0ZXJuX2NhbGwoKSkKKyAgICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKworICAgIGludCBtb3JlOworCisgICAgaWYgKG51bSA8IDAgfHwgIXRoaXNfcGxheWVyKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCFzdGFydCkKKyAgICAgICAgc3RhcnQgPSAxOworCisgICAgaWYgKCFudW0gfHwgbnVtID4gQ0FUX01BWF9MSU5FUykgeworICAgICAgICBudW0gPSBDQVRfTUFYX0xJTkVTOworICAgICAgICBtb3JlID0gc2l6ZW9mKHJlYWRfZmlsZShmaWxlLCBzdGFydCtudW0sIDEpKTsKKyAgICB9CisKKyAgICBzdHJpbmcgdHh0ID0gcmVhZF9maWxlKGZpbGUsIHN0YXJ0LCBudW0pOworICAgIGlmICghdHh0KQorICAgICAgICByZXR1cm4gMDsKKworICAgIGVmdW46OnRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksIHR4dCk7CisKKyAgICBpZiAobW9yZSkKKyAgICAgICAgZWZ1bjo6dGVsbF9vYmplY3QodGhpc19wbGF5ZXIoKSwgIioqKioqVFJVTkNBVEVEKioqKlxuIik7CisKKyAgICByZXR1cm4gc2l6ZW9mKHR4dCAmICJcbiIpOworfQorI3VuZGVmIENBVF9NQVhfTElORVMKKyNlbmRpZiAvLyBfX1ZFUlNJT05fXyA+ICIzLjMuNzE4IgorCisjaWYgX19WRVJTSU9OX18gPiAiMy4zLjcxOSIKKy8vIFRoaXMgc2VmdW4gcmVwbGFjZXMgdGhlIGRlcHJlY2F0ZWQgZWZ1biB0YWlsKCkuCisjZGVmaW5lIFRBSUxfTUFYX0JZVEVTIDEwMDAKK3ZhcmFyZ3MgaW50IHRhaWwoc3RyaW5nIGZpbGUpCit7CisgICAgaWYgKGV4dGVybl9jYWxsKCkpCisgICAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisKKyAgICBpZiAoIXN0cmluZ3AoZmlsZSkgfHwgIXRoaXNfcGxheWVyKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgc3RyaW5nIHR4dCA9IHJlYWRfYnl0ZXMoZmlsZSwgLShUQUlMX01BWF9CWVRFUyArIDgwKSwgKFRBSUxfTUFYX0JZVEVTICsgODApKTsKKyAgICAvLyByZWFkX2J5dGVzKCkgcmV0dXJucyAwIGlmIHRoZSBzdGFydCBvZiB0aGUgc2VjdGlvbiBnaXZlbiBieQorICAgIC8vIHBhcmFtZXRlciAjMiBsaWVzIGJleW9uZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLgorICAgIC8vIEluIHRoaXMgY2FzZSB3ZSBzaW1wbHkgdHJ5IGFuZCByZWFkIHRoZSBlbnRpcmUgZmlsZS4KKyAgICBpZiAoIXN0cmluZ3AodHh0KSAmJiBmaWxlX3NpemUoZmlsZSkgPCBUQUlMX01BWF9CWVRFUys4MCkKKyAgICAgIHR4dCA9IHJlYWRfZmlsZShmaWxlKTsKKyAgICAvLyBFeGl0IGlmIHN0aWxsIG5vdGhpbmcgY291bGQgYmUgcmVhZC4KKyAgICBpZiAoIXN0cmluZ3AodHh0KSkKKyAgICAgIHJldHVybiAwOworCisgICAgLy8gY3V0IG9mZiBmaXJzdCAoaW5jb21wbGV0ZSkgbGluZQorICAgIGludCBpbmRleCA9IHN0cnN0cih0eHQsICJcbiIpOworICAgIGlmIChpbmRleCA+IC0xKSB7CisgICAgICAgIGlmIChpbmRleCArIDEgPCBzaXplb2YodHh0KSkKKyAgICAgICAgICAgIHR4dCA9IHR4dFtpbmRleCsxLi5dOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0eHQgPSAiIjsKKyAgICB9CisKKyAgICBlZnVuOjp0ZWxsX29iamVjdCh0aGlzX3BsYXllcigpLCB0eHQpOworCisgICAgcmV0dXJuIDE7Cit9CisjdW5kZWYgVEFJTF9NQVhfQllURVMKKyNlbmRpZiAvLyBfX1ZFUlNJT05fXyA+ICIzLjMuNzE5IgorCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9kZWJ1Z19pbmZvLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9kZWJ1Z19pbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYwN2MyZgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL2RlYnVnX2luZm8uYwpAQCAtMCwwICsxLDQzNCBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIGRlYnVnX2luZm8oKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18oZGVidWdfaW5mbykKKworI2luY2x1ZGUgPGRyaXZlcl9pbmZvLmg+CisjaW5jbHVkZSA8ZGVidWdfaW5mby5oPgorCittaXhlZCBkZWJ1Z19pbmZvKGludCB3aGF0LCB2YXJhcmdzIG1peGVkKiBhcmdzKQoreworICAgIGlmIChzaXplb2YoYXJncykgPiAyKQorICAgICAgICByYWlzZV9lcnJvcigiVG9vIG1hbnkgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOworCisgICAgc3dpdGNoKHdoYXQpCisgICAgeworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiSWxsZWdhbCB2YWx1ZSAlZCBmb3IgZGVidWdfaW5mbygpLlxuIiwgd2hhdCkpOworCisgICAgICAgIGNhc2UgRElORk9fT0JKRUNUOgorICAgICAgICB7CisgICAgICAgICAgICBvYmplY3Qgb2I7CisKKyAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgIT0gMSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7CisgICAgICAgICAgICBpZiAoIW9iamVjdHAoYXJnc1swXSkpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZyBhcmcgMiB0byBkZWJ1Z19pbmZvKCkuXG4iKTsKKworICAgICAgICAgICAgb2IgPSBhcmdzWzBdOworICAgICAgICAgICAgcHJpbnRmKCJPX0hFQVJUX0JFQVQgICAgICA6ICVzXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0NfSEVBUlRfQkVBVCkgICAgICAgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgICAgICAgIHByaW50ZigiT19FTkFCTEVfQ09NTUFORFMgOiAlc1xuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9DX0NPTU1BTkRTX0VOQUJMRUQpID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICAgICAgICBwcmludGYoIk9fQ0xPTkUgICAgICAgICAgIDogJXNcbiIsIGVmdW46OmNsb25lcChvYikgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICJUUlVFIiA6ICJGQUxTRSIpOworICAgICAgICAgICAgcHJpbnRmKCJPX0RFU1RSVUNURUQgICAgICA6IEZBTFNFXG4iKTsKKyAgICAgICAgICAgIHByaW50ZigiT19TV0FQUEVEICAgICAgICAgOiAlc1xuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NXQVBQRUQpICAgICAgICAgID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICAgICAgICBwcmludGYoIk9fT05DRV9JTlRFUkFDVElWRTogJXNcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PTkNFX0lOVEVSQUNUSVZFKSA/ICJUUlVFIiA6ICJGQUxTRSIpOworICAgICAgICAgICAgcHJpbnRmKCJPX1JFU0VUX1NUQVRFICAgICA6ICVzXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUkVTRVRfU1RBVEUpICAgICAgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgICAgICAgIHByaW50ZigiT19XSUxMX0NMRUFOX1VQICAgOiAlc1xuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1dJTExfQ0xFQU5fVVApICAgID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICAgICAgICBwcmludGYoIk9fUkVQTEFDRUQgICAgICAgIDogJXNcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9SRVBMQUNFRCkgICAgICAgICA/ICJUUlVFIiA6ICJGQUxTRSIpOworICAgICAgICAgICAgcHJpbnRmKCJ0aW1lX3Jlc2V0ICA6ICVkXG4iLCAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTkVYVF9SRVNFVF9USU1FKSk7CisgICAgICAgICAgICBwcmludGYoInRpbWVfb2ZfcmVmIDogJWRcbiIsICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9MQVNUX1JFRl9USU1FKSk7CisgICAgICAgICAgICBwcmludGYoInJlZiAgICAgICAgIDogJWRcbiIsICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfUkVGUykpOworCisgICAgICAgICAgICBpbnQgZ3RpY2tzID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0dJR0FUSUNLUyk7CisgICAgICAgICAgICBpZihndGlja3MpCisgICAgICAgICAgICAgICAgcHJpbnRmKCJldmFsY29zdCAgIDogICVkJTA5ZFxuIiwgZ3RpY2tzLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfVElDS1MpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwcmludGYoImV2YWxjb3N0ICAgOiAgJWRcbiIsICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1RJQ0tTKSk7CisKKyAgICAgICAgICAgIHByaW50Zigic3dhcF9udW0gICAgOiAlZFxuIiwgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NXQVBfTlVNKSk7CisgICAgICAgICAgICBwcmludGYoIm5hbWUgICAgICAgIDogJyVzJ1xuIiwgICAgIGVmdW46Om9iamVjdF9uYW1lKG9iKSk7CisgICAgICAgICAgICBwcmludGYoImxvYWRfbmFtZSAgIDogJyVzJ1xuIiwgICAgIGVmdW46OmxvYWRfbmFtZShvYikpOworCisgICAgICAgICAgICBvYmplY3QgbmV4dF9vYiA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfTkVYVCk7CisgICAgICAgICAgICBpZiAobmV4dF9vYikKKyAgICAgICAgICAgICAgICBwcmludGYoIm5leHRfYWxsICAgIDogT0JKKCVzKVxuIiwgZWZ1bjo6b2JqZWN0X25hbWUobmV4dF9vYikpOworCisgICAgICAgICAgICBvYmplY3QgcHJldl9vYiA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfUFJFVik7CisgICAgICAgICAgICBpZiAocHJldl9vYikKKyAgICAgICAgICAgICAgICBwcmludGYoIlByZXZpb3VzIG9iamVjdCBpbiBvYmplY3QgbGlzdDogT0JKKCVzKVxuIiwgZWZ1bjo6b2JqZWN0X25hbWUocHJldl9vYikpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHByaW50ZigiVGhpcyBvYmplY3QgaXMgdGhlIGhlYWQgb2YgdGhlIG9iamVjdCBsaXN0LlxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRElORk9fTUVNT1JZOgorICAgICAgICB7CisgICAgICAgICAgICBvYmplY3Qgb2I7CisKKyAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgIT0gMSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7CisgICAgICAgICAgICBpZiAoIW9iamVjdHAoYXJnc1swXSkpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZyBhcmcgMiB0byBkZWJ1Z19pbmZvKCkuXG4iKTsKKworICAgICAgICAgICAgb2IgPSBhcmdzWzBdOworCisgICAgICAgICAgICBwcmludGYoInByb2dyYW0gcmVmJ3MgJTNkXG4iLCAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9QUk9HX1JFRlMpKTsKKyAgICAgICAgICAgIHByaW50ZigiTmFtZTogJyVzJ1xuIiwgICAgICAgICAgZWZ1bjo6cHJvZ3JhbV9uYW1lKG9iKSk7CisgICAgICAgICAgICBwcmludGYoInByb2dyYW0gc2l6ZSAgICAlNmRcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9QUk9HX1NJWkUpKTsKKyAgICAgICAgICAgIHByaW50ZigibnVtIGZ1bmMnczogICUzZCAoJTRkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9GVU5DVElPTlMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9GVU5DVElPTlMpKTsKKyAgICAgICAgICAgIHByaW50ZigibnVtIHZhcnM6ICAgICUzZCAoJTRkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9WQVJJQUJMRVMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9WQVJJQUJMRVMpKTsKKworICAgICAgICAgICAgcHJpbnRmKCJudW0gc3RyaW5nczogJTNkICglNGQpIDogb3ZlcmhlYWQgJWQgKyBkYXRhICVkICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fU1RSSU5HUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1NUUklOR1MpICsgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HU19EQVRBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1NUUklOR1NfREFUQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1NUUklOR1NfREFUQV9UT1RBTCkpOworCisgICAgICAgICAgICBwcmludGYoIm51bSBpbmhlcml0cyAlM2QgKCU0ZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fSU5IRVJJVEVEKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfSU5IRVJJVEVEKSk7CisKKyAgICAgICAgICAgIHByaW50ZigidG90YWwgc2l6ZSAgICAgICU2ZFxuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1BST0dfU0laRV9UT1RBTCkpOworCisgICAgICAgICAgICBwcmludGYoImRhdGEgc2l6ZSAgICAgICAlNmQgKCU2ZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0RBVEFfU0laRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9EQVRBX1NJWkVfVE9UQUwpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBESU5GT19PQkpMSVNUOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpID09IDApCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOworCisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpID09IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb2JqZWN0ICogb2JzID0gZWZ1bjo6b2JqZWN0cyhhcmdzWzBdLCAxKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gb2JzWzBdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBlZnVuOjpvYmplY3RzKGFyZ3NbMF0sIGFyZ3NbMV0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIERJTkZPX01BTExPQzoKKyAgICAgICAgICAgIHdyaXRlKGRlYnVnX2luZm8oRElORk9fU1RBVFVTLCAibWFsbG9jIikpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBESU5GT19TVEFUVVM6CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyB3aGljaDsKKyAgICAgICAgICAgIGludCBvcHQ7CisKKyAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgPiAxKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKKworICAgICAgICAgICAgaWYgKCFzaXplb2YoYXJncykgfHwgIWFyZ3NbMF0pCisgICAgICAgICAgICAgICAgd2hpY2ggPSAiIjsKKyAgICAgICAgICAgIGVsc2UgaWYoc3RyaW5ncChhcmdzWzBdKSkKKyAgICAgICAgICAgICAgICB3aGljaCA9IGFyZ3NbMF07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZyBhcmcgMiB0byBkZWJ1Z19pbmZvKCkuXG4iKTsKKworICAgICAgICAgICAgc3dpdGNoKHdoaWNoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgIiI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX01FTU9SWTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICJ0YWJsZXMiOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9UQUJMRVM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAic3dhcCI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX1NXQVA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAibWFsbG9jIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfTUFMTE9DOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgIm1hbGxvYyBleHRzdGF0cyI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX01BTExPQ19FWFRFTkRFRDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKG9wdCk7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIERJTkZPX0RVTVA6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBvcHQ7CisKKyAgICAgICAgICAgIGlmICghc2l6ZW9mKGFyZ3MpKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKKworICAgICAgICAgICAgaWYoIXN0cmluZ3AoYXJnc1swXSkpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZyBhcmcgMiB0byBkZWJ1Z19pbmZvKCkuXG4iKTsKKworICAgICAgICAgICAgc3dpdGNoKGFyZ3NbMF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAib2JqZWN0cyI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERESV9PQkpFQ1RTOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgImRlc3RydWN0ZWQiOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBERElfT0JKRUNUU19ERVNUUlVDVEVEOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgIm9wY29kZXMiOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBERElfT1BDT0RFUzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICJtZW1vcnkiOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBERElfTUVNT1JZOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIkJhZCBhcmd1bWVudCAnJXMnIHRvIGRlYnVnX2luZm8oRElORk9fRFVNUCkuXG4iLCBhcmdzWzBdKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHVtcF9kcml2ZXJfaW5mbyhvcHQsIGFyZ3NbMS4uMV0uLi4pOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBESU5GT19EQVRBOgorICAgICAgICB7CisgICAgICAgICAgICBtaXhlZCAqIHJlc3VsdDsKKworICAgICAgICAgICAgaWYgKCFzaXplb2YoYXJncykpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOworCisgICAgICAgICAgICBpZiAoIWludHAoYXJnc1swXSkpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZyBhcmcgMiB0byBkZWJ1Z19pbmZvKCkuXG4iKTsKKworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSA9PSAyICYmICFpbnRwKGFyZ3NbMV0pKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWcgYXJnIDMgdG8gZGVidWdfaW5mbygpLlxuIik7CisKKyAgICAgICAgICAgIHN3aXRjaChhcmdzWzBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgRElEX1NUQVRVUzoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYWxsb2NhdGUoRElEX1NUQVRVU19NQVgpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQUNUSU9OU10gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9BQ1RJT05TKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BQ1RJT05TX1NJWkVdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9BQ1RJT05TKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TSEFET1dTXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NIQURPV1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NIQURPV1NfU0laRV0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NIQURPV1MpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU10gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX1NJWkVdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9PQkpFQ1RTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX1NXQVBQRURdICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFNfU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19TV0FQX1NJWkVdICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfT0JKRUNUU19TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX0xJU1RdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFNfSU5fTElTVCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19ORVdMWV9ERVNUXSAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RTX05FV0xZX0RFU1RSVUNURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfREVTVFJVQ1RFRF0gICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19ERVNUUlVDVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX1BST0NFU1NFRF0gICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFNfTEFTVF9QUk9DRVNTRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfQVZHX1BST0NdICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9MT0FEX0FWRVJBR0VfUFJPQ0VTU0VEX09CSkVDVFNfUkVMQVRJVkUpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT1RBQkxFXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RTX0lOX1RBQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PVEFCTEVfU0xPVFNdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVF9UQUJMRV9TTE9UUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT1RBQkxFX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfT0JKRUNUX1RBQkxFKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hCRUFUX09CSlNdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSEVBUlRCRUFUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEJFQVRfQ0FMTFNdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9IRUFSVEJFQVRfQUNUSVZFX0NZQ0xFUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEJFQVRfQ0FMTFNfVE9UQUxdICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9IRUFSVEJFQVRfVE9UQUxfQ1lDTEVTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQkVBVF9TTE9UU10gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hCRUFUX1NJWkVdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0hFQVJUQkVBVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hCRUFUX1BST0NFU1NFRF0gICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSEVBUlRCRUFUU19MQVNUX1BST0NFU1NFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEJFQVRfQVZHX1BST0NdICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX0xPQURfQVZFUkFHRV9QUk9DRVNTRURfSEVBUlRCRUFUU19SRUxBVElWRSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9DQUxMT1VUU10gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0NBTExPVVRTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9DQUxMT1VUX1NJWkVdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9DQUxMT1VUUyk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BUlJBWVNdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0FSUkFZUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQVJSQVlTX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfQVJSQVlTKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX01BUFBJTkdTXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUFQUElOR1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX01BUFBJTkdTX1NJWkVdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX01BUFBJTkdTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IWUJSSURfTUFQUElOR1NdICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01BUFBJTkdTX0hZQlJJRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEFTSF9NQVBQSU5HU10gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NQVBQSU5HU19IQVNIKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUlVDVFNdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSVUNUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSVUNUU19TSVpFXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1RSVUNUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSVUNUX1RZUEVTXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJVQ1RfVFlQRVMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUlVDVF9UWVBFU19TSVpFXSAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUlVDVF9UWVBFUyk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9QUk9HU10gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1BST0dTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9QUk9HU19TSVpFXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9QUk9HUyk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9QUk9HU19TV0FQUEVEXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1BST0dTX1NXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BST0dTX1NXQVBfU0laRV0gICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1BST0dTX1NXQVBQRUQpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfVVNFUl9SRVNFUlZFXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX01FTU9SWV9SRVNFUlZFX1VTRVIpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX01BU1RFUl9SRVNFUlZFXSAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9NRU1PUllfUkVTRVJWRV9NQVNURVIpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NZU1RFTV9SRVNFUlZFXSAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9NRU1PUllfUkVTRVJWRV9TWVNURU0pOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQUREX01FU1NBR0VdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRVNTQUdFU19PVVQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BBQ0tFVFNdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUEFDS0VUU19PVVQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BBQ0tFVF9TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1BBQ0tFVFNfT1VUKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9QQUNLRVRTX0lOXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1BBQ0tFVFNfSU4pOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BBQ0tFVF9TSVpFX0lOXSAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1BBQ0tFVFNfSU4pOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQVBQTFldICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9GVU5DVElPTl9OQU1FX0NBTExTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BUFBMWV9ISVRTXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0ZVTkNUSU9OX05BTUVfQ0FMTF9ISVRTKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUklOR1NdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fVklSVFVBTF9TVFJJTkdTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJJTkdfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TVFJJTkdTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfVEFCTEVfU0laRV0gICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TVFJJTkdfVEFCTEUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9PVkVSSEVBRF0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUklOR19PVkVSSEVBRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfVU5UQUJMRURdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdTX1VOVEFCTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9VTlRBQkxFRF9TSVpFXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TVFJJTkdTX1VOVEFCTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9UQUJMRURdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR1NfVEFCTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9UQUJMRURfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TVFJJTkdTX1RBQkxFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX1NFQVJDSEVTXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfTE9PS1VQU19CWV9JTkRFWCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX1NFQVJDSExFTl0gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfTE9PS1VQX1NURVBTX0JZX0lOREVYKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfU0VBUkNIRVNfQllWQUxVRV0gID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9MT09LVVBTX0JZX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfU0VBUkNITEVOX0JZVkFMVUVdID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9MT09LVVBfU1RFUFNfQllfVkFMVUUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9DSEFJTlNdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX1NMT1RTX1VTRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9BRERFRF0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX1NUUklOR1NfQURERUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9ERUxFVEVEXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX1NUUklOR1NfUkVNT1ZFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX0NPTExJU0lPTlNdICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfQ09MTElTSU9OUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX0ZPVU5EXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfSElUU19CWV9JTkRFWCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX0ZPVU5EX0JZVkFMVUVdICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfSElUU19CWV9WQUxVRSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9SWF9DQUNIRURdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1JFR0VYKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9SWF9UQUJMRV0gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1JFR0VYX1RBQkxFX1NMT1RTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9SWF9UQUJMRV9TSVpFXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9SRUdFWCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUlhfUkVRVUVTVFNdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9SRUdFWF9MT09LVVBTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9SWF9SRVFfRk9VTkRdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1JFR0VYX0xPT0tVUF9ISVRTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9SWF9SRVFfQ09MTF0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1JFR0VYX0xPT0tVUF9DT0xMSVNJT05TKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX01CX0ZJTEVdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0JVRkZFUl9GSUxFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9NQl9TV0FQXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9CVUZGRVJfU1dBUCk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9CT09UX1RJTUVdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfQk9PVF9USU1FKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIERJRF9TV0FQOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBhbGxvY2F0ZShESURfU1dBUF9NQVgpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfUFJPR1NdICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9QUk9HU19TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19QUk9HX1NJWkVdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9QUk9HU19TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19QUk9HX1VOU1dBUFBFRF0gICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1BST0dTX1VOU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfUFJPR19VX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUFJPR1NfVU5TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19WQVJTXSAgICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFNfU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfVkFSX1NJWkVdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfT0JKRUNUU19TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19GUkVFXSAgICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NXQVBfQkxPQ0tTX0ZSRUUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX0ZSRUVfU0laRV0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NXQVBfQkxPQ0tTX0ZSRUUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX0ZJTEVfU0laRV0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NXQVBfQkxPQ0tTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19SRVVTRURdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TV0FQX0JMT0NLU19SRVVTRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1NFQVJDSEVTXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1dBUF9CTE9DS1NfUkVVU0VfTE9PS1VQUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfU0VBUkNIX0xFTl0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TV0FQX0JMT0NLU19SRVVTRV9MT09LVVBfU1RFUFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX0ZfU0VBUkNIRVNdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1dBUF9CTE9DS1NfRlJFRV9MT09LVVBTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19GX1NFQVJDSF9MRU5dICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NXQVBfQkxPQ0tTX0ZSRUVfTE9PS1VQX1NURVBTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19DT01QQUNUXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRENfU1dBUF9DT01QQUNUX01PREUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1JFQ1lDTEVfRlJFRV0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TV0FQX1JFQ1lDTEVfUEhBU0UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgRElEX01FTU9SWToKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYWxsb2NhdGUoRElEX01FTU9SWV9NQVgpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX05BTUVdICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX01FTU9SWV9BTExPQ0FUT1JfTkFNRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NCUktdICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TWVNfQUxMT0NBVEVEX0JMT0NLUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NCUktfU0laRV0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1lTX0FMTE9DQVRFRF9CTE9DS1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9MQVJHRV0gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTEFSR0VfQkxPQ0tTX0FMTE9DQVRFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0xBUkdFX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTEFSR0VfQkxPQ0tTX0FMTE9DQVRFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0xGUkVFXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9MQVJHRV9CTE9DS1NfRlJFRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0xGUkVFX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTEFSR0VfQkxPQ0tTX0ZSRUUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9MV0FTVEVEXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTEFSR0VfQkxPQ0tTX1dBU1RFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTFdBU1RFRF9TSVpFXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9MQVJHRV9CTE9DS1NfV0FTVEUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9DSFVOS10gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU01BTExfQkxPQ0tfQ0hVTktTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fQ0hVTktfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TTUFMTF9CTE9DS19DSFVOS1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9TTUFMTF0gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU01BTExfQkxPQ0tTX0FMTE9DQVRFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NNQUxMX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU01BTExfQkxPQ0tTX0FMTE9DQVRFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NGUkVFXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TTUFMTF9CTE9DS1NfRlJFRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NGUkVFX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU01BTExfQkxPQ0tTX0ZSRUUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9TV0FTVEVEXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU01BTExfQkxPQ0tTX1dBU1RFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU1dBU1RFRF9TSVpFXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TTUFMTF9CTE9DS1NfV0FTVEUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9NSU5DX0NBTExTXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSU5DUkVNRU5UX1NJWkVfQ0FMTFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9NSU5DX1NVQ0NFU1NdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSU5DUkVNRU5UX1NJWkVfQ0FMTF9TVUNDRVNTRVMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9NSU5DX1NJWkVdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0lOQ1JFTUVOVF9TSVpFX0NBTExfRElGRlMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9QRVJNXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fVU5NQU5BR0VEX0JMT0NLUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1BFUk1fU0laRV0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfVU5NQU5BR0VEX0JMT0NLUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0NMSUJdICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9SRVBMQUNFTUVOVF9NQUxMT0NfQ0FMTFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9DTElCX1NJWkVdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1JFUExBQ0VNRU5UX01BTExPQ19DQUxMUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX09WRVJIRUFEXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU01BTExfQkxPQ0tfT1ZFUkhFQUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9BTExPQ0FURURdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX01FTU9SWV9VU0VEKSArIGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTUVNT1JZX09WRVJIRUFEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fVVNFRF0gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9NRU1PUllfVVNFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1RPVEFMX1VOVVNFRF0gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTUVNT1JZX1VOVVNFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0RFRlJBR19DQUxMU10gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRU1PUllfREVGUkFHTUVOVEFUSU9OX0NBTExTX0ZVTEwpICsgZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQ0FMTFNfVEFSR0VURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9ERUZSQUdfQ0FMTFNfUkVRXSAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVNT1JZX0RFRlJBR01FTlRBVElPTl9DQUxMU19UQVJHRVRFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0RFRlJBR19SRVFfU1VDQ0VTU10gICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRU1PUllfREVGUkFHTUVOVEFUSU9OX0NBTExfVEFSR0VUX0hJVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9ERUZSQUdfQkxPQ0tTX0lOU1BFQ1RFRF0gPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVNT1JZX0RFRlJBR01FTlRBVElPTl9CTE9DS1NfSU5TUEVDVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fREVGUkFHX0JMT0NLU19NRVJHRURdID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQkxPQ0tTX01FUkdFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0RFRlJBR19CTE9DS1NfUkVTVUxUXSA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRU1PUllfREVGUkFHTUVOVEFUSU9OX0JMT0NLU19SRVNVTFRJTkcpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9BVkxfTk9ERVNdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fRlJFRV9CTE9DS1NfQVZMX05PREVTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fRVhUX1NUQVRJU1RJQ1NdICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTUVNT1JZX0VYVEVOREVEX1NUQVRJU1RJQ1MpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSA9PSAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpZHggPSBhcmdzWzBdOworICAgICAgICAgICAgICAgIGlmIChpZHggPCAwIHx8IGlkeCA+PSBzaXplb2YocmVzdWx0KSkKKyAgICAgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiSWxsZWdhbCBpbmRleCBmb3IgZGVidWdfaW5mbygpOiAlZCwgZXhwZWN0ZWQgMC4uJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpZHgsIHNpemVvZihyZXN1bHQpLTEpKTsKKworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRbaWR4XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBESU5GT19UUkFDRToKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHdoaWNoID0gRElUX0NVUlJFTlQ7CisKKyAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgPiAxKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKKyAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFpbnRwKGFyZ3NbMF0pKQorICAgICAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOworICAgICAgICAgICAgICAgIHdoaWNoID0gYXJnc1swXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoICh3aGljaCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIERJVF9DVVJSRU5UOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfVFJBQ0VfQ1VSUkVOVCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIERJVF9FUlJPUjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKERJX1RSQUNFX0xBU1RfRVJST1IpIHx8ICh7ICJObyB0cmFjZS4iIH0pOworCisgICAgICAgICAgICAgICAgY2FzZSBESVRfVU5DQVVHSFRfRVJST1I6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9UUkFDRV9MQVNUX1VOQ0FVR0hUX0VSUk9SKSB8fCAoeyAiTm8gdHJhY2UuIiB9KTsKKworICAgICAgICAgICAgICAgIGNhc2UgRElUX1NUUl9DVVJSRU5UOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfVFJBQ0VfQ1VSUkVOVF9BU19TVFJJTkcpOworCisgICAgICAgICAgICAgICAgY2FzZSBESVRfQ1VSUkVOVF9ERVBUSDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKERJX1RSQUNFX0NVUlJFTlRfREVQVEgpOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBhcmcgMiB0byBkZWJ1Z19pbmZvKCkuXG4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBESU5GT19FVkFMX05VTUJFUjoKKyAgICAgICAgICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9FVkFMX05VTUJFUik7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL2VuYWJsZV9jb21tYW5kcy5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvZW5hYmxlX2NvbW1hbmRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQxYzk2MwotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL2VuYWJsZV9jb21tYW5kcy5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qIFRoZXNlIHNlZnVucyBhcmUgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1bnMgZW5hYmxlX2NvbW1hbmRzKCkKKyAqIGFuZCBkaXNhYmxlX2NvbW1hbmRzKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaW5jbHVkZSA8Y29uZmlndXJhdGlvbi5oPgorCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKGVuYWJsZV9jb21tYW5kcykKKwordm9pZCBlbmFibGVfY29tbWFuZHMoKQoreworICAgIG9iamVjdCBvYiA9IGVmdW46OnByZXZpb3VzX29iamVjdCgpOworCisgICAgZWZ1bjo6Y29uZmlndXJlX29iamVjdChvYiwgT0NfQ09NTUFORFNfRU5BQkxFRCwgMSk7CisgICAgZWZ1bjo6c2V0X3RoaXNfcGxheWVyKG9iKTsKK30KKworI2VuZGlmCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18oZGlzYWJsZV9jb21tYW5kcykKKwordm9pZCBkaXNhYmxlX2NvbW1hbmRzKCkKK3sKKyAgICBvYmplY3Qgb2IgPSBlZnVuOjpwcmV2aW91c19vYmplY3QoKTsKKworICAgIGVmdW46OmNvbmZpZ3VyZV9vYmplY3Qob2IsIE9DX0NPTU1BTkRTX0VOQUJMRUQsIDApOworICAgIGVmdW46OnNldF90aGlzX3BsYXllcigwKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9oYXNoLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9oYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFiYmY2MAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL2hhc2guYwpAQCAtMCwwICsxLDE3IEBACisjaW5jbHVkZSAiL3N5cy90bHMuaCIKKworZGVwcmVjYXRlZCBzdHJpbmcgbWQ1KG1peGVkIGFyZywgdmFyYXJncyBtaXhlZCogaXRlcmF0aW9ucykKK3sKKyAgICBpZiAoZXh0ZXJuX2NhbGwoKSkKKyAgICAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisKKyAgICByZXR1cm4gaGFzaChUTFNfSEFTSF9NRDUsIGFyZywgaXRlcmF0aW9ucy4uLik7Cit9CisKK2RlcHJlY2F0ZWQgc3RyaW5nIHNoYTEobWl4ZWQgYXJnLCB2YXJhcmdzIG1peGVkKiBpdGVyYXRpb25zKQoreworICAgIGlmIChleHRlcm5fY2FsbCgpKQorICAgICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKworICAgIHJldHVybiBoYXNoKFRMU19IQVNIX1NIQTEsIGFyZywgaXRlcmF0aW9ucy4uLik7Cit9CmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9saXZpbmdzLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9saXZpbmdzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYwZmNlZQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL2xpdmluZ3MuYwpAQCAtMCwwICsxLDM0OCBAQAorLy8gKiBsaXZpbmdfbmFtZS1CZWhhbmRsdW5nCisKKyNkZWZpbmUgY2xlYW5fbG9nKHMpCisvLyNkZWZpbmUgY2xlYW5fbG9nKHMpIGxvZ19maWxlKCJDTEVBTl9TSU0iLGN0aW1lKHRpbWUoKSlbNC4uMThdKyI6ICIrKHMpKTsKKworcHJpdmF0ZSBub3NhdmUgbWFwcGluZyBsaXZpbmdfbmFtZV9tLCBuYW1lX2xpdmluZ19tLCBuZXRkZWFkOworCitwcml2YXRlIHZvaWQgSW5pdExpdmluZ0RhdGEobWl4ZWQgd2l6aW5mbykgeworICAvLyBsaXZpbmdfbmFtZSBpc3QgZWluIFBvaW50ZXIgZGVyIGF1Y2ggaW4gZGVyIGV4dHJhX3dpemluZm8gZ2VoYWx0ZW4gCisgIC8vIHdpcmQsIHNvIGthbm4gZGllIHNpbXVsX2VmdW4gbmV1IGdlbGFkZW4gd2VyZGVuLCBvaG5lIGRhc3MgZGllc2VzCisgIC8vIE1hcHBpbmcgdmVybG9yZW4gZ2VodAorICBpZiAoIW1hcHBpbmdwKGxpdmluZ19uYW1lX20gPSB3aXppbmZvW0xJVklOR19OQU1FXSkpCisgICAgbGl2aW5nX25hbWVfbSA9IHdpemluZm9bTElWSU5HX05BTUVdID0gbV9hbGxvY2F0ZSgwLCAxKTsKKworICAvLyBHbGVpY2hlcyBnaWx0IGZ1ZXIgZGFzIE1hcHBpbmcgTmFtZS1MaXZpbmcKKyAgaWYgKCFtYXBwaW5ncChuYW1lX2xpdmluZ19tID0gd2l6aW5mb1tOQU1FX0xJVklOR10pKQorICAgIG5hbWVfbGl2aW5nX20gPSB3aXppbmZvW05BTUVfTElWSU5HXSA9IG1fYWxsb2NhdGUoMCwgMSk7CisKKyAgLy8gTmV0enRvdGUgc2luZCBlYmVuZmFsbHMgaW4gZGVyIGV4dHJhX3dpemluZm8KKyAgaWYgKCFtYXBwaW5ncChuZXRkZWFkID0gd2l6aW5mb1tORVRERUFEX01BUF0pKQorICAgIG5ldGRlYWQgPSB3aXppbmZvW05FVERFQURfTUFQXSA9IChbXSk7Cit9CisKK3B1YmxpYyB2YXJhcmdzIHN0cmluZyBnZXR1dWlkKCBvYmplY3Qgb2IgKQoreworICAgIG1peGVkICpyZXQ7CisKKyAgICBpZiAoICFvYmplY3RwKG9iKSApCisgICAgICAgb2IgPSBwcmV2aW91c19vYmplY3QoKTsKKworICAgIGlmICggIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2IpICkKKyAgICAgICByZXR1cm4gZ2V0dWlkKG9iKTsKKworICAgIHJldCA9IChtaXhlZCltYXN0ZXIoKS0+Z2V0X3VzZXJpbmZvKCBnZXR1aWQob2IpICk7CisKKyAgICBpZiAoICFwb2ludGVycChyZXQpIHx8IHNpemVvZihyZXQpIDwgNSApCisgICAgICAgcmV0dXJuIGdldHVpZChvYik7CisKKyAgICAvLyBVc2VybmFtZSArICJfIiArIENyZWF0aW9uRGF0ZQorICAgIHJldHVybiByZXRbMF0gKyAiXyIgKyByZXRbNV07Cit9CisKK3ZvaWQgc2V0X29iamVjdF9saXZpbmdfbmFtZShzdHJpbmcgbGl2bmFtZSwgb2JqZWN0IG9iaikKK3sKKyAgc3RyaW5nIG9sZDsKKyAgbWl4ZWQgYTsKKyAgaW50IGk7CisKKyAgaWYgKHByZXZpb3VzX29iamVjdCgpPT1vYmogfHwgcHJldmlvdXNfb2JqZWN0KCk9PXRoaXNfb2JqZWN0KCkgfHwKKyAgICAgIHByZXZpb3VzX29iamVjdCgpPT1tYXN0ZXIoKSkKKyAgeworICAgIGlmKCFsaXZuYW1lIHx8ICFzdHJpbmdwKGxpdm5hbWUpKSB7CisgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiJU86IGlsbGVnYWwgbGl2aW5nIG5hbWU6ICVPXG4iLCBvYmosIGxpdm5hbWUpKTsKKyAgICB9CisgICAgaWYgKG9sZCA9IGxpdmluZ19uYW1lX21bb2JqXSkgeworICAgICAgaWYgKHBvaW50ZXJwKGEgPSBuYW1lX2xpdmluZ19tW29sZF0pKSB7CisgICAgICAgYVttZW1iZXIoYSwgb2JqKV0gPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICBtX2RlbGV0ZShuYW1lX2xpdmluZ19tLCBvbGQpOworICAgICAgfQorICAgIH0KKyAgICBsaXZpbmdfbmFtZV9tW29ial0gPSBsaXZuYW1lOworICAgIGlmIChhID0gbmFtZV9saXZpbmdfbVtsaXZuYW1lXSkgeworICAgICAgaWYgKCFwb2ludGVycChhKSkgeworICAgICAgIG5hbWVfbGl2aW5nX21bbGl2bmFtZV0gPSAoe2EsIG9ian0pOworICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIC8qIFRyeSB0byByZWFsbG9jYXRlIGVudHJ5IGZyb20gZGVzdHJ1Y3RlZCBvYmplY3QgKi8KKyAgICAgIGlmICgoaSA9IG1lbWJlcihhLCAwKSkgPj0gMCkgeworICAgICAgIGFbaV0gPSBvYmo7CisgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgbmFtZV9saXZpbmdfbVtsaXZuYW1lXSA9IGEgKyAoe29ian0pOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBuYW1lX2xpdmluZ19tW2xpdm5hbWVdID0gb2JqOworICB9Cit9CisKK3ZvaWQgc2V0X2xpdmluZ19uYW1lKHN0cmluZyBsaXZuYW1lKQoreworICBzZXRfb2JqZWN0X2xpdmluZ19uYW1lKGxpdm5hbWUscHJldmlvdXNfb2JqZWN0KCkpOworfQorCit2b2lkIHJlbW92ZV9saXZpbmdfbmFtZSgpCit7CisgIHN0cmluZyBsaXZuYW1lOworCisgIGlmICghcHJldmlvdXNfb2JqZWN0KCkpCisgICAgcmV0dXJuOworICBpZiAobGl2bmFtZT1saXZpbmdfbmFtZV9tW3ByZXZpb3VzX29iamVjdCgpXSkKKyAgeworICAgIG1fZGVsZXRlKGxpdmluZ19uYW1lX20scHJldmlvdXNfb2JqZWN0KCkpOworICAgIGlmIChvYmplY3RwKG5hbWVfbGl2aW5nX21bbGl2bmFtZV0pKQorICAgIHsKKyAgICAgIGlmIChuYW1lX2xpdmluZ19tW2xpdm5hbWVdPT1wcmV2aW91c19vYmplY3QoKSkKKyAgICAgICBtX2RlbGV0ZShuYW1lX2xpdmluZ19tLGxpdm5hbWUpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAocG9pbnRlcnAobmFtZV9saXZpbmdfbVtsaXZuYW1lXSkpCisgICAgeworICAgICAgbmFtZV9saXZpbmdfbVtsaXZuYW1lXS09KHtwcmV2aW91c19vYmplY3QoKX0pOworICAgICAgaWYgKCFzaXplb2YobmFtZV9saXZpbmdfbVtsaXZuYW1lXSkpCisgICAgICAgbV9kZWxldGUobmFtZV9saXZpbmdfbSxsaXZuYW1lKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBfc2V0X25ldGRlYWQoKQoreworICBpZiAocXVlcnlfb25jZV9pbnRlcmFjdGl2ZShwcmV2aW91c19vYmplY3QoKSkpCisgICAgbmV0ZGVhZFtnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpXT1wcmV2aW91c19vYmplY3QoKTsKK30KKwordm9pZCBfcmVtb3ZlX25ldGRlYWQoKQoreworICBtX2RlbGV0ZShuZXRkZWFkLGdldHVpZChwcmV2aW91c19vYmplY3QoKSkpOworfQorCitvYmplY3QgZmluZF9uZXRkZWFkKHN0cmluZyB1dWlkKQoreworICBpbnQgaTsKKyAgc3RyaW5nIHVpZDsKKyAgLy8gV2VubiBzc2NhbmYoKSAyIGxpZWZlcnQsIGlzdCB1dWlkIGF1Y2ggbmUgdXVpZC4KKyAgaW50IGlzX3V1aWQgPSBzc2NhbmYodXVpZCwgIiVzXyVkIiwgdWlkLCBpKSA9PSAyOworICBpZiAoIWlzX3V1aWQpCisgICAgdWlkID0gdXVpZDsKKyAKKyAgaWYgKGlzX3V1aWQgJiYgZ2V0dXVpZChuZXRkZWFkW3VpZF0pICE9IHV1aWQpCisgICAgICByZXR1cm4gMDsKKworICByZXR1cm4gbmV0ZGVhZFt1aWRdOworfQorCitzdHJpbmcgKmR1bXBfbmV0ZGVhZCgpCit7CisgIHJldHVybiBtX2luZGljZXMobmV0ZGVhZCk7Cit9CisKK29iamVjdCBmaW5kX2xpdmluZyhzdHJpbmcgbGl2bmFtZSkgeworICBtaXhlZCAqYSwgcjsKKyAgaW50IGk7CisKKyAgaWYgKHBvaW50ZXJwKHIgPSBuYW1lX2xpdmluZ19tW2xpdm5hbWVdKSkgeworICAgIGlmIChtZW1iZXIociwwKT49MCkKKyAgICAgIHItPSh7MH0pOworICAgIGlmICghc2l6ZW9mKHIpKXsKKyAgICAgIG1fZGVsZXRlKG5hbWVfbGl2aW5nX20sbGl2bmFtZSk7CisgICAgICBjbGVhbl9sb2coc3ByaW50ZigiZmluZF9saXZpbmcgbG9lc2NodCAlc1xuIixsaXZuYW1lKSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCAhbGl2aW5nKHIgPSAoYSA9IHIpWzBdKSkgeworICAgICAgZm9yIChpID0gc2l6ZW9mKGEpOyAtLWk7KSB7CisgICAgICAgaWYgKGxpdmluZyhhWzxpXSkpIHsKKyAgICAgICAgIHIgPSBhWzxpXTsKKyAgICAgICAgIGFbPGldID0gYVswXTsKKyAgICAgICAgIHJldHVybiBhWzBdID0gcjsKKyAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByOworICB9CisgIHJldHVybiBsaXZpbmcocikgJiYgcjsKK30KKworb2JqZWN0ICpmaW5kX2xpdmluZ3Moc3RyaW5nIGxpdm5hbWUpCit7CisgIG1peGVkIHI7CisKKyAgaWYgKHBvaW50ZXJwKHI9bmFtZV9saXZpbmdfbVtsaXZuYW1lXSkpCisgICAgci09KHswfSk7CisgIGVsc2UKKyAgICBpZiAob2JqZWN0cChyKSkKKyAgICAgIHI9KHtyfSk7CisgIGlmICghcG9pbnRlcnAocil8fCFzaXplb2YocikpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiByOworfQorCitvYmplY3QgZmluZF9wbGF5ZXIoc3RyaW5nIHV1aWQpIHsKKyAgb2JqZWN0ICpvYmpzOworICBtaXhlZCByZXM7CisgIGludCBpOworICBzdHJpbmcgdWlkOworCisgIGlmICghc3RyaW5ncCh1dWlkKSkKKyAgICByZXR1cm4gMDsKKyAgLy8gV2VubiBzc2NhbmYoKSAyIGxpZWZlcnQsIGlzdCB1dWlkIGF1Y2ggbmUgdXVpZC4KKyAgaW50IGlzX3V1aWQgPSBzc2NhbmYodXVpZCwgIiVzXyVkIiwgdWlkLCBpKSA9PSAyOworICBpZiAoIWlzX3V1aWQpCisgICAgdWlkID0gdXVpZDsKKworICBpZiAocG9pbnRlcnAocmVzID0gbmFtZV9saXZpbmdfbVt1aWRdKSkgeworICAgIC8vIHplcnN0b2VydGUgT2JqZWt0ZSBnZ2YuIGVudGZlcm5lbgorICAgIGlmIChtZW1iZXIocmVzLDApPj0wKSB7CisgICAgICByZXMtPSh7MH0pOworICAgICAgbmFtZV9saXZpbmdfbVt1aWRdID0gcmVzOworICAgIH0KKyAgICAvLyBnZ2YuIE5hbWVuIG9obmUgT2JqZWt0ZSBlbnRmZXJuZW4uCisgICAgaWYgKCFzaXplb2YocmVzKSl7CisgICAgICBtX2RlbGV0ZShuYW1lX2xpdmluZ19tLHVpZCk7CisgICAgICBjbGVhbl9sb2coc3ByaW50ZigiZmluZF9wbGF5ZXIgbG9lc2NodCAlc1xuIix1aWQpKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBvYmpzID0gcmVzOworICAgIHJlcyA9IG9ianNbMF07CisgICAgLy8gV2VubiBkYXMgMC4gRWxlbWVudCBkZXIgU3BpZWxlciBpc3QsIHNpbmQgd2lyIGZlcnRpZy4gQW5zb25zdGVuIHN1Y2hlbgorICAgIC8vIHdpciBkZW4gU3BpZWxlciB1bmQgc2NoaWViZW4gaWhuIGFuIGRpZSAwLiBTdGVsbGUgaW0gQXJyYXkuCisgICAgaWYgKCAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShyZXMpKSB7CisgICAgICBmb3IgKGkgPSBzaXplb2Yob2Jqcyk7IC0taTspIHsKKyAgICAgICBpZiAob2Jqc1s8aV0gJiYgcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYmpzWzxpXSkpIHsKKyAgICAgICAgIHJlcyA9IG9ianNbPGldOworICAgICAgICAgb2Jqc1s8aV0gPSBvYmpzWzBdOworICAgICAgICAgb2Jqc1swXSA9IHJlczsKKyAgICAgICAgIGJyZWFrOworICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJlcyA9IChvYmplY3RwKHJlcykgJiYgcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShyZXMpKSA/IHJlcyA6IDA7CisgICAgfQorICAgIC8vIGVsc2U6IGluIHJlcyBzdGVodCBkZXIgU3BpZWxlciBzY2hvbi4KKyAgfQorICBlbHNlIGlmIChvYmplY3RwKHJlcykpIC8vIHIgaXN0IG5lbiBFaW56ZWxvYmpla3QKKyAgICByZXMgPSBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHJlcykgPyByZXMgOiAwOworCisgIC8vIHJlcyBpc3QgamV0enQgZ2dmLiBkZXIgU3BpZWxlci4gQWJlciB3ZW5uIGRlciBuZSBhbmRlcmUgYWxzIGRpZSBnZXN1Y2h0ZQorICAvLyBVVUlEIGhhdCwgaXN0IGRhcyBFcmdlYm5pcyB0cm90emRlbSAwLgorICBpZiAoaXNfdXVpZCAmJiBnZXR1dWlkKHJlcykhPXV1aWQpCisgICAgICByZXR1cm4gMDsKKworICAvLyBlbmRsaWNoIGdlZnVuZGVuCisgIHJldHVybiByZXM7Cit9CisKK3ByaXZhdGUgaW50IGNoZWNrX21hdGNoKCBzdHJpbmcgc3RyLCBpbnQgcGxheWVyc19vbmx5ICkKK3sKKyAgICBtaXhlZCBtYXRjaDsKKworICAgIGlmICggIShtYXRjaCA9IG5hbWVfbGl2aW5nX21bc3RyXSkgKQorICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCAhcG9pbnRlcnAobWF0Y2gpICkKKyAgICAgICBtYXRjaCA9ICh7IG1hdGNoIH0pOworCisgICAgbWF0Y2ggLT0gKHswfSk7CisKKyAgICBpZiAoIHNpemVvZihtYXRjaCkgKXsKKyAgICAgICBpZiAoIHBsYXllcnNfb25seSApCisgICAgICAgICAgIHJldHVybiBzaXplb2YoZmlsdGVyKCBtYXRjaCwgIydxdWVyeV9vbmNlX2ludGVyYWN0aXZlLyonKi8gKSkKKyAgICAgICAgICAgICAgPiAwOworICAgICAgIGVsc2UKKyAgICAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgbV9kZWxldGUoIG5hbWVfbGl2aW5nX20sIHN0ciApOworICAgIGNsZWFuX2xvZyggc3ByaW50ZigiY2hlY2tfbWF0Y2ggbG9lc2NodCAlc1xuIiwgc3RyKSApOworICAgIHJldHVybiAwOworfQorCisvL1RPRE86OiBzdHJpbmd8c3RyaW5nKiBleGNsdWRlCit2YXJhcmdzIG1peGVkIG1hdGNoX2xpdmluZyggc3RyaW5nIHN0ciwgaW50IHBsYXllcnNfb25seSwgbWl4ZWQgZXhjbHVkZSApCit7CisgICAgaW50IGksIHM7CisgICAgbWl4ZWQgbWF0Y2gsICp1c2VyOworCisgICAgaWYgKCAhc3RyIHx8IHN0ciA9PSAiIiApCisgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoICFwb2ludGVycChleGNsdWRlKSApCisgICAgICAgZXhjbHVkZSA9ICh7IGV4Y2x1ZGUgfSk7CisKKyAgICBpZiAoIG1lbWJlcihleGNsdWRlLCBzdHIpIDwgMCAmJiBjaGVja19tYXRjaChzdHIsIHBsYXllcnNfb25seSkgKQorICAgICAgIHJldHVybiBzdHI7CisKKyAgICB1c2VyID0gbV9pbmRpY2VzKG5hbWVfbGl2aW5nX20pOworICAgIHMgPSBzaXplb2Yoc3RyKTsKKyAgICBtYXRjaCA9IDA7CisKKyAgICBmb3IgKCBpID0gc2l6ZW9mKHVzZXIpOyBpLS07ICkKKyAgICAgICBpZiAoIHN0ciA9PSB1c2VyW2ldWzAuLnMtMV0gJiYgbWVtYmVyKCBleGNsdWRlLCB1c2VyW2ldICkgPCAwICkKKyAgICAgICAgICAgaWYgKCBtYXRjaCApCisgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBpZiAoIGNoZWNrX21hdGNoKHVzZXJbaV0sIHBsYXllcnNfb25seSkgKQorICAgICAgICAgICAgICAgICAgbWF0Y2ggPSB1c2VyW2ldOworCisgICAgaWYgKCAhbWF0Y2ggKQorICAgICAgIHJldHVybiAtMjsKKworICAgIHJldHVybiBtYXRjaDsKK30KKworbWl4ZWQgKmR1bXBfbGl2aW5ncygpCit7CisgIHJldHVybiBzb3J0X2FycmF5KG1faW5kaWNlcyhuYW1lX2xpdmluZ19tKSwjJz4pOworfQorCisvLyAqIHJlZ2VsbWFlc3NpZyBMaXN0ZW4gdm9uIEJhbGxhc3QgYmVmcmVpZW4KK3ByaXZhdGUgdm9pZCBjbGVhbl9uYW1lX2xpdmluZ19tKHN0cmluZyAqa2V5cywgaW50IGxlZnQsIGludCBudW0pCit7CisgIGludCBpLCBqOworICBtaXhlZCBhOworCisgIHdoaWxlIChsZWZ0ICYmIG51bS0tKQorICB7CisgICAgaWYgKHBvaW50ZXJwKGEgPSBuYW1lX2xpdmluZ19tW2tleXNbLS1sZWZ0XV0pICYmIG1lbWJlcihhLCAwKT49MCkKKyAgICB7CisgICAgICBhLT0oezB9KTsKKyAgICAgIG5hbWVfbGl2aW5nX21ba2V5c1tsZWZ0XV0gPSBhOworICAgIH0KKyAgICBpZiAoIWEgfHwgKHBvaW50ZXJwKGEpICYmICFzaXplb2YoYSkpKQorICAgIHsKKyAgICAgIGNsZWFuX2xvZygiVG9hc3RpbmcgIitrZXlzW2xlZnRdKyJcbiIpOworICAgICAgbV9kZWxldGUobmFtZV9saXZpbmdfbSwga2V5c1tsZWZ0XSk7CisgICAgfSBlbHNlIGNsZWFuX2xvZyhzcHJpbnRmKCJLRUVQSU5HICVzICglTylcbiIsa2V5c1tsZWZ0XSxwb2ludGVycChhKT9zaXplb2YoYSk6YSkpOworICB9CisgIGlmIChsZWZ0KQorICAgIGVmdW46OmNhbGxfb3V0KCMnY2xlYW5fbmFtZV9saXZpbmdfbSwgMSwga2V5cywgbGVmdCwgODApOworICBlbHNlCisgICAgY2xlYW5fbG9nKCJDbGVhbiBwcm9jZXNzIGZpbmlzaGVkXG4iKTsKK30KKworcHJpdmF0ZSB2b2lkIGNsZWFuX25ldGRlYWQoKSB7CisgIGludCBpOworICBzdHJpbmcgKnM7CisgIG9iamVjdCBvYjsKKworICBzPW1faW5kaWNlcyhuZXRkZWFkKTsKKyAgZm9yIChpPXNpemVvZihzKS0xO2k+PTA7aS0tKQorICAgIGlmICghb2JqZWN0cChvYj1uZXRkZWFkW3NbaV1dKSB8fCBpbnRlcmFjdGl2ZShvYikpCisgICAgICBtX2RlbGV0ZShuZXRkZWFkLHNbaV0pOworfQorCitwcml2YXRlIHZvaWQgQ2xlYW5MaXZpbmdEYXRhKCkgeworICBpZiAoZmluZF9jYWxsX291dCgjJ2NsZWFuX25hbWVfbGl2aW5nX20pIDwgMCkgeworICAgIGNsZWFuX2xvZygiU3RhcnRpbmcgY2xlYW4gcHJvY2Vzc1xuIik7CisgICAgZWZ1bjo6Y2FsbF9vdXQoIydjbGVhbl9uYW1lX2xpdmluZ19tLAorICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICBtX2luZGljZXMobmFtZV9saXZpbmdfbSksCisgICAgICAgICAgICAgICAgIHNpemVvZihuYW1lX2xpdmluZ19tKSwKKyAgICAgICAgICAgICAgICAgODAKKyAgICAgICAgICAgICAgICAgKTsKKyAgfQorICBlZnVuOjpjYWxsX291dCgjJ2NsZWFuX25ldGRlYWQsMik7Cit9CisKKyN1bmRlZiBjbGVhbl9sb2cKKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvb2JqZWN0X2luZm8uYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL29iamVjdF9pbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ3YzAwOQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL29iamVjdF9pbmZvLmMKQEAgLTAsMCArMSwxMDYgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSB0aGUgb2xkIHNlbWFudGljcyBvZiB0aGUgZWZ1biBvYmplY3RfaW5mbygpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmIF9fRUZVTl9ERUZJTkVEX18oZHJpdmVyX2luZm8pIC8qIE5ld2VyIHZlcnNpb24gaXMgdGhlcmUgKi8KKworI2luY2x1ZGUgPG9iamVjdGluZm8uaD4KKyNpbmNsdWRlIDxvYmplY3RfaW5mby5oPgorCittaXhlZCBvYmplY3RfaW5mbyhvYmplY3Qgb2IsIGludCB3aGF0LCB2YXJhcmdzIGludCogaW5kZXgpCit7CisgICAgbWl4ZWQgKiByZXN1bHQ7CisKKyAgICBpZiAoc2l6ZW9mKGluZGV4KSA+IDEpCisgICAgICAgIHJhaXNlX2Vycm9yKCJUb28gbWFueSBhcmd1bWVudHMgdG8gb2JqZWN0X2luZm9cbiIpOworCisgICAgc3dpdGNoKHdoYXQpCisgICAgeworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiSWxsZWdhbCB2YWx1ZSAlZCBmb3Igb2JqZWN0X2luZm8oKS5cbiIsIHdoYXQpKTsKKworICAgICAgICBjYXNlIE9JTkZPX0JBU0lDOgorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBhbGxvY2F0ZShPSUJfTUFYKTsKKworICAgICAgICAgICAgcmVzdWx0W09JQl9IRUFSVF9CRUFUXSAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0NfSEVBUlRfQkVBVCk7CisgICAgICAgICAgICByZXN1bHRbT0lCX0lTX1dJWkFSRF0gICAgICAgICA9IDA7ICAgLyogTm90IHN1cHBvcnRlZCBhbnltb3JlLiAqLworICAgICAgICAgICAgcmVzdWx0W09JQl9FTkFCTEVfQ09NTUFORFNdICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0NfQ09NTUFORFNfRU5BQkxFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lCX0NMT05FXSAgICAgICAgICAgICA9IGVmdW46OmNsb25lcChvYik7CisgICAgICAgICAgICByZXN1bHRbT0lCX0RFU1RSVUNURURdICAgICAgICA9IDA7ICAgLyogTm90IHBvc3NpYmxlIGFueW1vcmUuICovCisgICAgICAgICAgICByZXN1bHRbT0lCX1NXQVBQRURdICAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TV0FQUEVEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfT05DRV9JTlRFUkFDVElWRV0gID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09OQ0VfSU5URVJBQ1RJVkUpOworICAgICAgICAgICAgcmVzdWx0W09JQl9SRVNFVF9TVEFURV0gICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUkVTRVRfU1RBVEUpOworICAgICAgICAgICAgcmVzdWx0W09JQl9XSUxMX0NMRUFOX1VQXSAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfV0lMTF9DTEVBTl9VUCk7CisgICAgICAgICAgICByZXN1bHRbT0lCX0xBTUJEQV9SRUZFUkVOQ0VEXSA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9MQU1CREFfUkVGRVJFTkNFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1NIQURPV10gICAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSEFET1dfUFJFVikgJiYgMTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfUkVQTEFDRURdICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1JFUExBQ0VEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfTkVYVF9SRVNFVF0gICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05FWFRfUkVTRVRfVElNRSk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1RJTUVfT0ZfUkVGXSAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9MQVNUX1JFRl9USU1FKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfUkVGXSAgICAgICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9SRUZTKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfR0lHQVRJQ0tTXSAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0dJR0FUSUNLUyk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1RJQ0tTXSAgICAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9USUNLUyk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1NXQVBfTlVNXSAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TV0FQX05VTSk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1BST0dfU1dBUFBFRF0gICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9QUk9HX1NXQVBQRUQpOworICAgICAgICAgICAgcmVzdWx0W09JQl9WQVJfU1dBUFBFRF0gICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfVkFSX1NXQVBQRUQpOworICAgICAgICAgICAgcmVzdWx0W09JQl9OQU1FXSAgICAgICAgICAgICAgPSBlZnVuOjpvYmplY3RfbmFtZShvYik7CisgICAgICAgICAgICByZXN1bHRbT0lCX0xPQURfTkFNRV0gICAgICAgICA9IGVmdW46OmxvYWRfbmFtZShvYik7CisgICAgICAgICAgICByZXN1bHRbT0lCX05FWFRfQUxMXSAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfTkVYVCk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1BSRVZfQUxMXSAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfUFJFVik7CisgICAgICAgICAgICByZXN1bHRbT0lCX05FWFRfQ0xFQU5VUF0gICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9ORVhUX0NMRUFOVVBfVElNRSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgT0lORk9fUE9TSVRJT046CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGFsbG9jYXRlKE9JUF9NQVgpOworCisgICAgICAgICAgICByZXN1bHRbT0lQX05FWFRdID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9ORVhUKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSVBfUFJFVl0gPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX1BSRVYpOworICAgICAgICAgICAgcmVzdWx0W09JUF9QT1NdICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfUE9TKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBPSU5GT19NRU1PUlk6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGFsbG9jYXRlKE9JTV9NQVgpOworCisgICAgICAgICAgICByZXN1bHRbT0lNX1JFRl0gICAgICAgICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUFJPR19SRUZTKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTkFNRV0gICAgICAgICAgICAgICA9IGVmdW46OnByb2dyYW1fbmFtZShvYik7CisgICAgICAgICAgICByZXN1bHRbT0lNX1BST0dfU0laRV0gICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUFJPR19TSVpFKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTlVNX0ZVTkNUSU9OU10gICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fRlVOQ1RJT05TKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fU0laRV9GVU5DVElPTlNdICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX0ZVTkNUSU9OUyk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05VTV9WQVJJQUJMRVNdICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX1ZBUklBQkxFUyk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1NJWkVfVkFSSUFCTEVTXSAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9WQVJJQUJMRVMpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OVU1fU1RSSU5HU10gICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9TVFJJTkdTKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fU0laRV9TVFJJTkdTXSAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1NUUklOR1MpOworICAgICAgICAgICAgcmVzdWx0W09JTV9TSVpFX1NUUklOR1NfREFUQV0gID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HU19EQVRBKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fU0laRV9TVFJJTkdTX1RPVEFMXSA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1NUUklOR1NfREFUQV9UT1RBTCk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05VTV9JTkhFUklURURdICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX0lOSEVSSVRFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1NJWkVfSU5IRVJJVEVEXSAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9JTkhFUklURUQpOworICAgICAgICAgICAgcmVzdWx0W09JTV9UT1RBTF9TSVpFXSAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1BST0dfU0laRV9UT1RBTCk7CisgICAgICAgICAgICByZXN1bHRbT0lNX0RBVEFfU0laRV0gICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfREFUQV9TSVpFKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fVE9UQUxfREFUQV9TSVpFXSAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9EQVRBX1NJWkVfVE9UQUwpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OT19JTkhFUklUXSAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05PX0lOSEVSSVQpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OT19DTE9ORV0gICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05PX0NMT05FKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTk9fU0hBRE9XXSAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OT19TSEFET1cpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OVU1fSU5DTFVERVNdICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9JTkNMVURFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1NIQVJFX1ZBUklBQkxFU10gICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0hBUkVfVkFSSUFCTEVTKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNpemVvZihpbmRleCkpCisgICAgeworICAgICAgICBpbnQgaWR4ID0gaW5kZXhbMF07CisgICAgICAgIGlmIChpZHggPCAwIHx8IGlkeCA+PSBzaXplb2YocmVzdWx0KSkKKyAgICAgICAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIklsbGVnYWwgaW5kZXggZm9yIG9iamVjdF9pbmZvKCk6ICVkLCBleHBlY3RlZCAwLi4lZFxuIiwKKyAgICAgICAgICAgICAgICBpZHgsIHNpemVvZihyZXN1bHQpLTEpKTsKKworICAgICAgICByZXR1cm4gcmVzdWx0W2lkeF07CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9xdWVyeV9lZGl0aW5nLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9xdWVyeV9lZGl0aW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE0NmRjZAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3F1ZXJ5X2VkaXRpbmcuYwpAQCAtMCwwICsxLDE3IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfZWRpdGluZygpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9lZGl0aW5nKQorCisjaW5jbHVkZSA8aW50ZXJhY3RpdmVfaW5mby5oPgorCitpbnR8b2JqZWN0IHF1ZXJ5X2VkaXRpbmcob2JqZWN0IG9iKQoreworICAgIGlmKCFlZnVuOjppbnRlcmFjdGl2ZShvYikpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX0VESVRJTkcpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3F1ZXJ5X2lkbGUuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3F1ZXJ5X2lkbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2EzMmFlCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvcXVlcnlfaWRsZS5jCkBAIC0wLDAgKzEsMTQgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9pZGxlKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X2lkbGUpCisKKyNpbmNsdWRlIDxpbnRlcmFjdGl2ZV9pbmZvLmg+CisKK2ludCBxdWVyeV9pZGxlKG9iamVjdCBvYikKK3sKKyAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfSURMRSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvcXVlcnlfaW5wdXRfcGVuZGluZy5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvcXVlcnlfaW5wdXRfcGVuZGluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkOGMzMTEKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9xdWVyeV9pbnB1dF9wZW5kaW5nLmMKQEAgLTAsMCArMSwxNyBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X2lucHV0X3BlbmRpbmcoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfaW5wdXRfcGVuZGluZykKKworI2luY2x1ZGUgPGludGVyYWN0aXZlX2luZm8uaD4KKworb2JqZWN0IHF1ZXJ5X2lucHV0X3BlbmRpbmcob2JqZWN0IG9iKQoreworICAgIGlmKCFlZnVuOjppbnRlcmFjdGl2ZShvYikpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX0lOUFVUX1BFTkRJTkcpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3F1ZXJ5X2lwX25hbWUuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3F1ZXJ5X2lwX25hbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGE2ZTA3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvcXVlcnlfaXBfbmFtZS5jCkBAIC0wLDAgKzEsNDggQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1bnMgcXVlcnlfaXBfbmFtZSgpIGFuZAorICogcXVlcnlfaXBfbnVtYmVyKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X2lwX25hbWUpCisKKyNpbmNsdWRlIDxpbnRlcmFjdGl2ZV9pbmZvLmg+CisKK3ByaXZhdGUgdmFyYXJncyBzdHJpbmcgX3F1ZXJ5X2lwX25hbWUob2JqZWN0IHBsYXllcikKK3sKKyAgICBvYmplY3Qgb2IgPSBwbGF5ZXI7CisgICAgb2IgfHw9IGVmdW46OnRoaXNfcGxheWVyKCk7CisKKyAgICBwbGF5ZXIgPSBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9JUF9BRERSRVNTKTsKKyAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfSVBfTkFNRSk7Cit9CisKK3ByaXZhdGUgdmFyYXJncyBzdHJpbmcgX3F1ZXJ5X2lwX251bWJlcihvYmplY3QgcGxheWVyKQoreworICAgIG9iamVjdCBvYiA9IHBsYXllcjsKKyAgICBvYiB8fD0gZWZ1bjo6dGhpc19wbGF5ZXIoKTsKKworICAgIHBsYXllciA9IGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX0lQX0FERFJFU1MpOworICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9JUF9OVU1CRVIpOworfQorCisvLyAqIEhlcmt1bmZ0cy1Fcm1pdHRsdW5nCitzdHJpbmcgcXVlcnlfaXBfbnVtYmVyKG9iamVjdCBvYikKK3sKKyAgb2I9IG9iIHx8IHRoaXNfcGxheWVyKCk7CisgIGlmICghb2JqZWN0cChvYikgfHwgIWludGVyYWN0aXZlKG9iKSkgcmV0dXJuIDA7CisgIGlmKG9iLT5xdWVyeV9yZWFsaXAoKSAmJiAoc3RyaW5nKW9iLT5xdWVyeV9yZWFsaXAoKSE9IiIpCisgIHsKKyAgICByZXR1cm4gKHN0cmluZylvYi0+cXVlcnlfcmVhbGlwKCk7CisgIH0KKyAgcmV0dXJuIF9xdWVyeV9pcF9udW1iZXIob2IpOworfQorCitzdHJpbmcgcXVlcnlfaXBfbmFtZShtaXhlZCBvYikKK3sKKyAgaWYgKCAhb2IgfHwgb2JqZWN0cChvYikgKQorICAgICAgb2I9cXVlcnlfaXBfbnVtYmVyKG9iKTsKKyAgcmV0dXJuIChzdHJpbmcpIi9wL2RhZW1vbi9pcGxvb2t1cCItPmhvc3Qob2IpOworfQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvcXVlcnlfbGltaXRzLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9xdWVyeV9saW1pdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2JmMzkwCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvcXVlcnlfbGltaXRzLmMKQEAgLTAsMCArMSwxNCBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X2xpbWl0cygpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9saW1pdHMpCisKKyNpbmNsdWRlIDxkcml2ZXJfaW5mby5oPgorCit2YXJhcmdzIGludCogcXVlcnlfbGltaXRzKGludCBkZWYpCit7CisgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKGRlZiA/IERDX0RFRkFVTFRfUlVOVElNRV9MSU1JVFMgOiBESV9DVVJSRU5UX1JVTlRJTUVfTElNSVRTKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9xdWVyeV9sb2FkX2F2ZXJhZ2UuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3F1ZXJ5X2xvYWRfYXZlcmFnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMzZmMGUKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9xdWVyeV9sb2FkX2F2ZXJhZ2UuYwpAQCAtMCwwICsxLDE2IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfbG9hZF9hdmVyYWdlKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X2xvYWRfYXZlcmFnZSkKKworI2luY2x1ZGUgPGRyaXZlcl9pbmZvLmg+CisKK3N0cmluZyBxdWVyeV9sb2FkX2F2ZXJhZ2UoKQoreworICAgIHJldHVybiBlZnVuOjpzcHJpbnRmKCIlLjJmIGNtZHMvcywgJS4yZiBjb21wIGxpbmVzL3MiLAorICAgICAgICBlZnVuOjpkcml2ZXJfaW5mbyhESV9MT0FEX0FWRVJBR0VfQ09NTUFORFMpLAorICAgICAgICBlZnVuOjpkcml2ZXJfaW5mbyhESV9MT0FEX0FWRVJBR0VfTElORVMpKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9xdWVyeV9tdWRfcG9ydC5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvcXVlcnlfbXVkX3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmYwMDlkCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvcXVlcnlfbXVkX3BvcnQuYwpAQCAtMCwwICsxLDM1IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfbXVkX3BvcnQoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfbXVkX3BvcnQpCisKKyNpbmNsdWRlIDxpbnRlcmFjdGl2ZV9pbmZvLmg+CisjaW5jbHVkZSA8ZHJpdmVyX2luZm8uaD4KKworaW50IHF1ZXJ5X211ZF9wb3J0KHZhcmFyZ3MgaW50KnxvYmplY3QqIGFyZ3MpCit7CisgICAgaWYoIXNpemVvZihhcmdzKSAmJiBlZnVuOjp0aGlzX3BsYXllcigpICYmIGVmdW46OmludGVyYWN0aXZlKHRoaXNfcGxheWVyKCkpKQorICAgICAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyh0aGlzX3BsYXllcigpLCBJSV9NVURfUE9SVCk7CisKKyAgICBpZihzaXplb2YoYXJncykgPiAxKQorICAgICAgICByYWlzZV9lcnJvcigiVG9vIG1hbnkgYXJndW1lbnRzIHRvIHF1ZXJ5X211ZF9wb3J0XG4iKTsKKworICAgIGlmKHNpemVvZihhcmdzKSAmJiBlZnVuOjpvYmplY3RwKGFyZ3NbMF0pICYmIGVmdW46OmludGVyYWN0aXZlKGFyZ3NbMF0pKQorICAgICAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhhcmdzWzBdLCBJSV9NVURfUE9SVCk7CisKKyAgICBpZihzaXplb2YoYXJncykgJiYgaW50cChhcmdzWzBdKSkKKyAgICB7CisgICAgICAgIGludCogcG9ydHMgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9NVURfUE9SVFMpOworICAgICAgICBpZihhcmdzWzBdIDwgLTEgfHwgYXJnc1swXSA+PSBzaXplb2YocG9ydHMpKQorICAgICAgICAgICAgcmFpc2VfZXJyb3IoZWZ1bjo6c3ByaW50ZigiQmFkIGFyZyAxIHRvIHF1ZXJ5X211ZF9wb3J0KCk6IHZhbHVlICVkIG91dCBvZiByYW5nZS5cbiIsIGFyZ3NbMF0pKTsKKyAgICAgICAgZWxzZSBpZihhcmdzWzBdID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIHNpemVvZihwb3J0cyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBwb3J0c1thcmdzWzBdXTsKKyAgICB9CisKKyAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTVVEX1BPUlRTKVswXTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9xdWVyeV9vbmNlX2ludGVyYWN0aXZlLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9xdWVyeV9vbmNlX2ludGVyYWN0aXZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM3ODI5ZgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3F1ZXJ5X29uY2VfaW50ZXJhY3RpdmUuYwpAQCAtMCwwICsxLDE0IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfb25jZV9pbnRlcmFjdGl2ZSgpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9vbmNlX2ludGVyYWN0aXZlKQorCisjaW5jbHVkZSA8b2JqZWN0X2luZm8uaD4KKworaW50IHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2JqZWN0IG9iKQoreworICAgIHJldHVybiBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT05DRV9JTlRFUkFDVElWRSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvcXVlcnlfc25vb3AuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3F1ZXJ5X3Nub29wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZhNjljMAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3F1ZXJ5X3Nub29wLmMKQEAgLTAsMCArMSwzMCBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X3Nub29wKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisKKyNpbmNsdWRlIDxpbnRlcmFjdGl2ZV9pbmZvLmg+CisKK3ByaXZhdGUgb2JqZWN0IF9xdWVyeV9zbm9vcChvYmplY3Qgb2IpCit7CisgICAgaWYoIWVmdW46OmludGVyYWN0aXZlKG9iKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBvYmplY3QgcHJldiA9IGVmdW46OnByZXZpb3VzX29iamVjdCgpOworICAgIGVmdW46OnNldF90aGlzX29iamVjdChwcmV2KTsKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfc25vb3ApCisgICAgcmV0dXJuIGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX1NOT09QX05FWFQpOworI2Vsc2UKKyAgICByZXR1cm4gZWZ1bjo6cXVlcnlfc25vb3Aob2IpOworI2VuZGlmCit9CisKK25vbWFzayBvYmplY3QgcXVlcnlfc25vb3Aob2JqZWN0IHdobykgeworICBvYmplY3Qgc25vb3BlcjsKKworICBzbm9vcGVyPV9xdWVyeV9zbm9vcCh3aG8pOworICBpZiAoIXNub29wZXIpIHJldHVybiAwOworICBpZiAocXVlcnlfd2l6X2dycChzbm9vcGVyKT5xdWVyeV93aXpfZ3JwKGdldHVpZChwcmV2aW91c19vYmplY3QoKSkpICYmCisgICAgICBJU19BUkNIKHNub29wZXIpKSByZXR1cm4gMDsKKyAgcmV0dXJuIHNub29wZXI7Cit9CmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zZXRfaGVhcnRfYmVhdC5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc2V0X2hlYXJ0X2JlYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzk5NWViCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc2V0X2hlYXJ0X2JlYXQuYwpAQCAtMCwwICsxLDI0IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gc2V0X2hlYXJ0X2JlYXQoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18oc2V0X2hlYXJ0X2JlYXQpCisKKyNpbmNsdWRlIDxjb25maWd1cmF0aW9uLmg+CisKK2ludCBzZXRfaGVhcnRfYmVhdChpbnQgZmxhZykKK3sKKyAgICBvYmplY3Qgb2IgPSBlZnVuOjpwcmV2aW91c19vYmplY3QoKTsKKyAgICBpbnQgaGIgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0NfSEVBUlRfQkVBVCk7CisKKyAgICBpZiAoIWZsYWcgPT0gIWhiKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGVmdW46OmNvbmZpZ3VyZV9vYmplY3Qob2IsIE9DX0hFQVJUX0JFQVQsIGZsYWcpOworCisgICAgcmV0dXJuIDE7Cit9CisKKyNlbmRpZgorCisKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NldF9pc193aXphcmQuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NldF9pc193aXphcmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDFjY2RiCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc2V0X2lzX3dpemFyZC5jCkBAIC0wLDAgKzEsMTM3IEBACisvKiBUaGVzZSBhcmUgdGhlIHNwZWNpYWwgY29tbWFuZHMgZnJvbSB0aGUgZHJpdmVyIHRoYXQgYXJlIGFjdGl2YXRlZCB3aXRoCisgKiBzZXRfaXNfd2l6YXJkKCkuIFRoZXNlIGZ1bmN0aW9ucyBtdXN0IGJlIGFkZGVkIHRvIHRoZSBwbGF5ZXIgb2JqZWN0LgorICogQWxzbyBzZXRfaXNfd2l6YXJkKCkgbXVzdCBiZSBjYWxsZWQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgcGxheWVyIG9iamVjdCwKKyAqIG5vdCBhcyBhbiAoc2ltdWwtKWVmdW4uCisgKi8KKworI2luY2x1ZGUgPGNvbW1hbmRzLmg+CisjaW5jbHVkZSA8ZHJpdmVyX2luZm8uaD4KKworLyogaXNfd2l6YXJkOgorICogIDE6IGhhcyBhY3Rpb25zLAorICogIDA6IG5ldmVyIGhhZCBhY3Rpb25zLAorICogLTE6IGhhZCBhY3Rpb25zIG9uY2UuCisgKi8KK3ByaXZhdGUgbm9zYXZlIGludCBpc193aXphcmQ7CisKK3ByaXZhdGUgaW50IGRyaXZlcl9tYWxsb2Moc3RyaW5nIHN0cikKK3sKKyAgICBpZihpc193aXphcmQgPD0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZighc2l6ZW9mKHN0cikpCisgICAgeworICAgICAgICB3cml0ZShlZnVuOjpkcml2ZXJfaW5mbyhESV9TVEFUVVNfVEVYVF9NQUxMT0MpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYoc3RyID09ICJleHRzdGF0cyIpCisgICAgeworICAgICAgICB3cml0ZShlZnVuOjpkcml2ZXJfaW5mbyhESV9TVEFUVVNfVEVYVF9NQUxMT0NfRVhURU5ERUQpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3ByaXZhdGUgaW50IGRyaXZlcl9kdW1wYWxsb2JqKHN0cmluZyBzdHIpCit7CisgICAgaWYoaXNfd2l6YXJkIDw9IDAgfHwgc2l6ZW9mKHN0cikpCisgICAgICAgIHJldHVybiAwOworCisgICAgd3JpdGUoIkR1bXBpbmcgdG8gL09CSl9EVU1QIC4uLiAiKTsKKyAgICBlZnVuOjpkdW1wX2RyaXZlcl9pbmZvKERESV9PQkpFQ1RTKTsKKyAgICBlZnVuOjpkdW1wX2RyaXZlcl9pbmZvKERESV9PQkpFQ1RTX0RFU1RSVUNURUQpOworICAgIHdyaXRlKCJkb25lXG4iKTsKKyAgICByZXR1cm4gMTsKK30KKworcHJpdmF0ZSBpbnQgZHJpdmVyX29wY2R1bXAoc3RyaW5nIHN0cikKK3sKKyAgICBpZihpc193aXphcmQgPD0gMCB8fCBzaXplb2Yoc3RyKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBlZnVuOjpkdW1wX2RyaXZlcl9pbmZvKERESV9PUENPREVTKTsKKyAgICByZXR1cm4gMTsKK30KKworcHJpdmF0ZSBpbnQgZHJpdmVyX3N0YXR1cyhzdHJpbmcgc3RyKQoreworICAgIGludCBvcHQ7CisgICAgaWYoaXNfd2l6YXJkIDw9IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgc3dpdGNoKHN0ciB8fCAiIikKKyAgICB7CisgICAgICAgIGNhc2UgIiI6CisgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9NRU1PUlk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJ0YWJsZXMiOgorICAgICAgICBjYXNlICIgdGFibGVzIjoKKyAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX1RBQkxFUzsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgInN3YXAiOgorICAgICAgICBjYXNlICIgc3dhcCI6CisgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9TV0FQOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAibWFsbG9jIjoKKyAgICAgICAgY2FzZSAiIG1hbGxvYyI6CisgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9NQUxMT0M7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJtYWxsb2MgZXh0c3RhdHMiOgorICAgICAgICBjYXNlICIgbWFsbG9jIGV4dHN0YXRzIjoKKyAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX01BTExPQ19FWFRFTkRFRDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB3cml0ZShlZnVuOjpkcml2ZXJfaW5mbyhvcHQpKTsKKyAgICByZXR1cm4gMTsKK30KKworaW50IHNldF9pc193aXphcmQodmFyYXJncyA8b2JqZWN0fGludD4qIGFyZ3MpCit7CisgICAgaW50IG9sZHZhbCA9IGlzX3dpemFyZDsKKworICAgIGlmKCFzaXplb2YoYXJncykpCisgICAgICAgIHJhaXNlX2Vycm9yKCJUb28gZmV3IGFyZ3VtZW50cyB0byBzZXRfaXNfd2l6YXJkXG4iKTsKKyAgICBpZihzaXplb2YoYXJncykgPiAyKQorICAgICAgICByYWlzZV9lcnJvcigiVG9vIG1hbnkgYXJndW1lbnRzIHRvIHNldF9pc193aXphcmRcbiIpOworICAgIGlmKCFvYmplY3RwKGFyZ3NbMF0pKQorICAgICAgICByYWlzZV9lcnJvcigiQmFkIGFyZyAxIHRvIHNldF9pc193aXphcmQoKVxuIik7CisgICAgaWYoYXJnc1swXSAhPSB0aGlzX29iamVjdCgpKQorICAgICAgICByYWlzZV9lcnJvcigiT25seSBzZXRfaXNfd2l6YXJkIGZvciB0aGUgY3VycmVudCBvYmplY3Qgc3VwcG9ydGVkXG4iKTsKKyAgICBpZih0aGlzX3BsYXllcigpICE9IHRoaXNfb2JqZWN0KCkpCisgICAgICAgIHJhaXNlX2Vycm9yKCJUaGUgY3VycmVudCBvYmplY3QgbXVzdCBiZSB0aGlzX3BsYXllcigpIGZvciBzZXRfaXNfd2l6YXJkKClcbiIpOworICAgIGlmKHNpemVvZihhcmdzKSA9PSAyICYmICFpbnRwKGFyZ3NbMV0pKQorICAgICAgICByYWlzZV9lcnJvcigiQmFkIGFyZyAyIHRvIHNldF9pc193aXphcmQoKVxuIik7CisKKyAgICBpZihzaXplb2YoYXJncykgPT0gMiAmJiAhYXJnc1sxXSkKKyAgICB7CisgICAgICAgIGlmKGlzX3dpemFyZCA+IDApCisgICAgICAgICAgICBpc193aXphcmQgPSAtMTsKKyAgICB9CisgICAgZWxzZSBpZihzaXplb2YoYXJncykgPT0gMiAmJiBhcmdzWzFdPDApCisgICAgeworICAgICAgICAgLy8gSnVzdCByZXR1cm4gdGhlIG9sZCB2YWx1ZS4KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoIWlzX3dpemFyZCkKKyAgICAgICAgeworICAgICAgICAgICAgYWRkX2FjdGlvbigjJ2RyaXZlcl9tYWxsb2MsICJtYWxsb2MiKTsKKyAgICAgICAgICAgIGFkZF9hY3Rpb24oIydkcml2ZXJfZHVtcGFsbG9iaiwgImR1bXBhbGxvYmoiKTsKKyAgICAgICAgICAgIGFkZF9hY3Rpb24oIydkcml2ZXJfb3BjZHVtcCwgIm9wY2R1bXAiKTsKKyAgICAgICAgICAgIGFkZF9hY3Rpb24oIydkcml2ZXJfc3RhdHVzLCAic3RhdHVzIiwgQUFfTk9TUEFDRSk7CisgICAgICAgIH0KKyAgICAgICAgaXNfd2l6YXJkID0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gb2xkdmFsID4gMDsKK30KZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NldF9wcm9tcHQuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NldF9wcm9tcHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjU5NjkyCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc2V0X3Byb21wdC5jCkBAIC0wLDAgKzEsMjEgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBzZXRfcHJvbXB0KCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHNldF9wcm9tcHQpCisKKyNpbmNsdWRlIDxjb25maWd1cmF0aW9uLmg+CisKK3ZhcmFyZ3Mgc3RyaW5nfGNsb3N1cmUgc2V0X3Byb21wdChzdHJpbmd8Y2xvc3VyZXxpbnQgcHJvbXB0LCBvYmplY3Qgb2IpCit7CisgICAgb2IgfHw9IGVmdW46OnRoaXNfcGxheWVyKCk7CisKKyAgICBtaXhlZCBvbGRwcm9tcHQgPSBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJQ19QUk9NUFQpOworCisgICAgaWYoIWludHAocHJvbXB0KSkKKyAgICAgICAgZWZ1bjo6Y29uZmlndXJlX2ludGVyYWN0aXZlKG9iLCBJQ19QUk9NUFQsIHByb21wdCk7CisKKyAgICByZXR1cm4gb2xkcHJvbXB0OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NoYWRvdy5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc2hhZG93LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYwOGM3MwotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NoYWRvdy5jCkBAIC0wLDAgKzEsNTUgQEAKKy8qIFRoZXNlIHNlZnVucyBhcmUgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9zaGFkb3dpbmcoKQorICogYW5kIHRoZSBvbGQgc2VtYW50aWNzIG9mIHRoZSBlZnVuIHNoYWRvdygpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9zaGFkb3dpbmcpCisKKyNpbmNsdWRlIDxvYmplY3RfaW5mby5oPgorCitvYmplY3QgcXVlcnlfc2hhZG93aW5nKG9iamVjdCBvYikKK3sKKyAgICByZXR1cm4gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NIQURPV19QUkVWKTsKK30KKworcHJpdmF0ZSBvYmplY3QgX3NoYWRvdyhvYmplY3Qgb2IsIGludCBmbGFnKQoreworICAgIGlmKGZsYWcpCisgICAgeworICAgICAgICBvYmplY3Qgc2hhZG93ZXIgPSBlZnVuOjpwcmV2aW91c19vYmplY3QoMSk7CisgICAgICAgIGVmdW46OnNldF90aGlzX29iamVjdChzaGFkb3dlcik7CisKKyAgICAgICAgaWYgKGVmdW46OnNoYWRvdyhvYikpCisgICAgICAgICAgICByZXR1cm4gZWZ1bjo6b2JqZWN0X2luZm8oc2hhZG93ZXIsIE9JX1NIQURPV19QUkVWKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSEFET1dfTkVYVCk7Cit9CisjZWxzZQorcHJpdmF0ZSBvYmplY3QgX3NoYWRvdyhvYmplY3Qgb2IsIGludCBmbGFnKQoreworICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KDEpKTsKKyAgcmV0dXJuIGVmdW46OnNoYWRvdyhvYiwgZmxhZyk7Cit9CisjZW5kaWYKKworCitwdWJsaWMgb2JqZWN0IHNoYWRvdyhvYmplY3Qgb2IsIGludCBmbGFnKQoreworICBvYmplY3QgcmVzID0gZnVuY2FsbCgjJ19zaGFkb3csb2IsIGZsYWcpOworICBpZiAoZmxhZykKKyAgICAiL3NlY3VyZS9zaGFkb3dtYXN0ZXIiLT5SZWdpc3RlclNoYWRvdyhwcmV2aW91c19vYmplY3QoKSk7CisgIHJldHVybiByZXM7Cit9CisKK3ByaXZhdGUgdm9pZCBfdW5zaGFkb3coKSB7CisgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoMSkpOworICBlZnVuOjp1bnNoYWRvdygpOworfQorCitwdWJsaWMgdm9pZCB1bnNoYWRvdygpIHsKKyAgZnVuY2FsbCgjJ191bnNoYWRvdyk7CisgICIvc2VjdXJlL3NoYWRvd21hc3RlciItPlVucmVnaXN0ZXJTaGFkb3cocHJldmlvdXNfb2JqZWN0KCkpOworfQpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc2ltdWxfZWZ1bi5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc2ltdWxfZWZ1bi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZTBiNzgKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zaW11bF9lZnVuLmMKQEAgLTAsMCArMSwyMDE2IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gc2ltdWxfZWZ1bi5jIC0tIHNpbXVsIGVmdW4ncworLy8KKy8vICRJZDogc2ltdWxfZWZ1bi5jIDc0MDggMjAxMC0wMi0wNiAwMDoyNzoyNVogWmVzc3RyYSAkCisjcHJhZ21hIHN0cmljdF90eXBlcyxzYXZlX3R5cGVzLHJ0dF9jaGVja3MKKyNwcmFnbWEgbm9fY2xvbmUsbm9fc2hhZG93LG5vX2luaGVyaXQKKyNwcmFnbWEgcGVkYW50aWMscmFuZ2VfY2hlY2ssd2Fybl9kZXByZWNhdGVkCisjcHJhZ21hIHdhcm5fZW1wdHlfY2FzdHMsd2Fybl9taXNzaW5nX3JldHVybix3YXJuX2Z1bmN0aW9uX2luY29uc2lzdGVudAorCisvLyBBYnNvbHV0ZSBQZmFkZSBlcmZvcmRlcmxpY2ggLSB6dW0gWmVpdHB1bmt0LCB3byBkZXIgTWFzdGVyIGdlbGFkZW4KKy8vIHdpcmQsIHNpbmQgbm9jaCBrZWluZSBJbmNsdWRlLVBmYWRlIGRhIC4uLgorCisjZGVmaW5lIFNOT09QTE9HRklMRSAiU05PT1AiCisjZGVmaW5lIEFTTk9PUExPR0ZJTEUgIkFSQ0gvU05PT1AiCisKKyNpbmNsdWRlICIvc2VjdXJlL2NvbmZpZy5oIgorI2luY2x1ZGUgIi9zZWN1cmUvd2l6bGV2ZWxzLmgiCisjaW5jbHVkZSAiL3N5cy9zbm9vcGluZy5oIgorI2luY2x1ZGUgIi9zeXMvbGFuZ3VhZ2UuaCIKKyNpbmNsdWRlICIvc3lzL3RoaW5nL3Byb3BlcnRpZXMuaCIKKyNpbmNsdWRlICIvc3lzL3dpemxpc3QuaCIKKyNpbmNsdWRlICIvc3lzL2VycS5oIgorI2luY2x1ZGUgIi9zeXMvbHBjdHlwZXMuaCIKKyNpbmNsdWRlICIvc3lzL2RhZW1vbi5oIgorI2luY2x1ZGUgIi9zeXMvcGxheWVyL2Jhc2UuaCIKKyNpbmNsdWRlICIvc3lzL3RoaW5nL2Rlc2NyaXB0aW9uLmgiCisjaW5jbHVkZSAiL3N5cy9jb250YWluZXIuaCIKKyNpbmNsdWRlICIvc3lzL2RlZmluZXMuaCIKKyNpbmNsdWRlICIvc3lzL3RlbG5ldC5oIgorI2luY2x1ZGUgIi9zeXMvb2JqZWN0aW5mby5oIgorI2luY2x1ZGUgIi9zeXMvZmlsZXMuaCIKKyNpbmNsdWRlICIvc3lzL3N0cmluZ3MuaCIKKyNpbmNsdWRlICIvc3lzL3RpbWUuaCIKKyNpbmNsdWRlICIvc3lzL2xwY3R5cGVzLmgiCisjaW5jbHVkZSAiL3N5cy9ub3RpZnlfZmFpbC5oIgorI2luY2x1ZGUgIi9zeXMvdGxzLmgiCisjaW5jbHVkZSAiL3N5cy9pbnB1dF90by5oIgorI2luY2x1ZGUgIi9zeXMvb2JqZWN0X2luZm8uaCIKKworLyogZnVuY3Rpb24gcHJvdG90eXBlcworICovCitzdHJpbmcgZHRpbWUoaW50IHdhbm4pOwordmFyYXJncyBpbnQgbG9nX2ZpbGUoc3RyaW5nIGZpbGUsIHN0cmluZyB0eHQsIGludCBzaXplX3RvX2JyZWFrKTsKK2ludCBxdWVyeV93aXpfbGV2ZWwobWl4ZWQgcGxheWVyKTsKK25vbWFzayB2YXJhcmdzIGludCBzbm9vcChvYmplY3QgbWUsIG9iamVjdCB5b3UpOwordmFyYXJncyBzdHJpbmcgY291bnRyeShtaXhlZCBpcCwgc3RyaW5nIG51bSk7CitpbnQgcXVlcnlfd2l6X2dycChtaXhlZCB3aXopOworcHVibGljIHZhcmFyZ3Mgb2JqZWN0IGRlZXBfcHJlc2VudChtaXhlZCB3aGF0LCBvYmplY3Qgb2IpOworbm9tYXNrIGludCBzZWN1cmVfbGV2ZWwoKTsKK25vbWFzayBzdHJpbmcgc2VjdXJlX2V1aWQoKTsKK3B1YmxpYyBub21hc2sgaW50IHByb2Nlc3NfY2FsbCgpOworbm9tYXNrIG1peGVkIF9fY3JlYXRlX3BsYXllcl9kdW1teShzdHJpbmcgbmFtZSk7Cit2YXJhcmdzIHN0cmluZyByZXBsYWNlX3BlcnNvbmFsKHN0cmluZyBzdHIsIG1peGVkICpvYnMsIGludCBjYXBzKTsKKworCisvL3JlcGxhY2VtZW50cyBmb3IgZHJvcHBlZCBlZnVucyBpbiBMRAorI2lmICFfX0VGVU5fREVGSU5FRF9fKGV4dHJhY3QpCit2YXJhcmdzIHN0cmluZyBleHRyYWN0KHN0cmluZyBzdHIsIGludCBmcm9tLCBpbnQgdG8pOworI2VuZGlmCisjaWYgIV9fRUZVTl9ERUZJTkVEX18oc2xpY2VfYXJyYXkpCit2YXJhcmdzIG1peGVkIHNsaWNlX2FycmF5KG1peGVkIGFycmF5LCBpbnQgZnJvbSwgaW50IHRvKTsKKyNlbmRpZgorI2lmICFfX0VGVU5fREVGSU5FRF9fKG1lbWJlcl9hcnJheSkKK2ludCBtZW1iZXJfYXJyYXkobWl4ZWQgaXRlbSwgbWl4ZWQgYXJyYXlzdHJpbmcpOworI2VuZGlmCisKKy8vIEluY2x1ZGUgdGhlIGRpZmZlcmVudCBzdWIgJ21vZHVsZXMnIG9mIHRoZSBzaW11bF9lZnVuCisjaW5jbHVkZSBfX0RJUl9fImRlYnVnX2luZm8uYyIKKyNpbmNsdWRlIF9fRElSX18iZW5hYmxlX2NvbW1hbmRzLmMiCisjaW5jbHVkZSBfX0RJUl9fImhhc2guYyIKKyNpbmNsdWRlIF9fRElSX18ib2JqZWN0X2luZm8uYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfZWRpdGluZy5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9pZGxlLmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X2lucHV0X3BlbmRpbmcuYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfaXBfbmFtZS5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9saW1pdHMuYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfbG9hZF9hdmVyYWdlLmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X211ZF9wb3J0LmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUuYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfc25vb3AuYyIKKyNpbmNsdWRlIF9fRElSX18ic2V0X2hlYXJ0X2JlYXQuYyIKKyNpZiBfX0JPT1RfVElNRV9fIDwgMTQ1NjI2MTg1OQorI2luY2x1ZGUgX19ESVJfXyJzZXRfcHJvbXB0LmMiCisjZW5kaWYKKyNpbmNsdWRlIF9fRElSX18ic2hhZG93LmMiCisjaW5jbHVkZSBfX0RJUl9fImxpdmluZ3MuYyIKKyNpbmNsdWRlIF9fRElSX18iY29tbS5jIgorCisjZGVmaW5lIFRPICAgICAgICBlZnVuOjp0aGlzX29iamVjdCgpCisjZGVmaW5lIFRJICAgICAgICBlZnVuOjp0aGlzX2ludGVyYWN0aXZlKCkKKyNkZWZpbmUgVFAgICAgICAgIGVmdW46OnRoaXNfcGxheWVyKCkKKyNkZWZpbmUgUE8gICAgICAgIGVmdW46OnByZXZpb3VzX29iamVjdCgwKQorI2RlZmluZSBMRVZFTCh4KSBxdWVyeV93aXpfbGV2ZWwoeCkKKyNkZWZpbmUgTkFNRSh4KSAgY2FwaXRhbGl6ZShnZXR1aWQoeCkpCisKKyNkZWZpbmUgREVCVUcoeCkgaWYgKGZpbmRfcGxheWVyKCJ6ZXNzdHJhIikpIFwKKyAgdGVsbF9vYmplY3QoZmluZF9wbGF5ZXIoInplc3N0cmEiKSx4KQorCittaXhlZCBkdGltZV9jYWNoZSA9ICh7LTEsIiJ9KTsKKworI2lmZGVmIElPU1RBVFMKK3N0cnVjdCBpb3N0YXRfcyB7CisgIHN0cmluZyBvbmFtZTsKKyAgaW50IHRpbWU7CisgIGludCBzaXplOworfTsKK21peGVkIHNhdmVvX3N0YXQgPSAoeyAwLGFsbG9jYXRlKDIwMCwgMCkgfSk7CittaXhlZCByZXN0b3Jlb19zdGF0ID0gKHsgMCxhbGxvY2F0ZSgyMDAsMCkgfSk7CisvL21peGVkIHdyaXRlZmlsZV9zdGF0ID0gKHsgMCxhbGxvY2F0ZSgxMDAsKDxpb3N0YXRfcz4pKSB9KTsKKy8vbWl4ZWQgcmVhZGZpbGVfc3RhdCA9ICh7IDAsYWxsb2NhdGUoMTAwLCg8aW9zdGF0X3M+KSkgfSk7CisvL21peGVkIGxvZ19zdGF0ID0gKHsgMCxhbGxvY2F0ZSgxMDAsKDxpb3N0YXRfcz4pKSB9KTsKKworbWl4ZWQgX19faW9zdGF0cyhpbnQgdHlwZSkgeworICBzd2l0Y2godHlwZSkgeworICAgIGNhc2UgMToKKyAgICAgIHJldHVybiBzYXZlb19zdGF0OworICAgIGNhc2UgMjoKKyAgICAgIHJldHVybiByZXN0b3Jlb19zdGF0OworLyogICAgY2FzZSAzOgorICAgICAgcmV0dXJuIHdyaXRlZmlsZV9zdGF0OworICAgIGNhc2UgNDoKKyAgICAgIHJldHVybiByZWFkZmlsZV9zdGF0OworICAgIGNhc2UgNToKKyAgICAgIHJldHVybiBsb2dfc3RhdDsKKyAgICAgICovCisgIH0KKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworLy8gTmljaHQgamVkZXIgTWFnaWVyIG11c3MgZGllIHNpbXVsX2VmdW4gZW50c29yZ2VuIGtvZW5uZW4uCitzdHJpbmcgTm90aWZ5RGVzdHJ1Y3Qob2JqZWN0IGNhbGxlcikgeworICAgIGlmKCAoY2FsbGVyIT10aGlzX29iamVjdCgpICYmICFBUkNIX1NFQ1VSSVRZKSB8fCBwcm9jZXNzX2NhbGwoKSApIHsKKyAgICAgIHJldHVybiAiRHUgZGFyZnN0IGRhcyBzaW11bF9lZnVuIE9iamVrdCBuaWNodCB6ZXJzdG9lcmVuIVxuIjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3B1YmxpYyBub21hc2sgdm9pZCByZW1vdmVfaW50ZXJhY3RpdmUoIG9iamVjdCBvYiApCit7CisgICAgaWYgKCBvYmplY3RwKG9iKSAmJiBwcmV2aW91c19vYmplY3QoKQorICAgICAgICAmJiBvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSlbMC4uN10gIT0gIi9zZWN1cmUvIgorICAgICAgICAmJiAoKHByZXZpb3VzX29iamVjdCgpICE9IG9iCisgICAgICAgICAgICAgJiYgKG9iICE9IHRoaXNfcGxheWVyKCkgfHwgb2IgIT0gdGhpc19pbnRlcmFjdGl2ZSgpKSkKKyAgICAgICAgICAgIHx8IChwcmV2aW91c19vYmplY3QoKSA9PSBvYgorICAgICAgICAgICAgICAgJiYgKHRoaXNfcGxheWVyKCkgJiYgdGhpc19wbGF5ZXIoKSAhPSBvYgorICAgICAgICAgICAgICAgICAgIHx8IHRoaXNfaW50ZXJhY3RpdmUoKSAmJiB0aGlzX2ludGVyYWN0aXZlKCkgIT0gb2IpKSApICkKKworICAgICAgIGxvZ19maWxlKCAiUExBWUVSREVTVCIsCisgICAgICAgICAgICAgICAgc3ByaW50ZiggIiVzOiAlTyBhdXNnZWxvZ2d0IHZvbiBQTyAlTywgVEkgJU8sIFRQICVPXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZHRpbWUodGltZSgpKSwgb2IsIHByZXZpb3VzX29iamVjdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgdGhpc19pbnRlcmFjdGl2ZSgpLCB0aGlzX3BsYXllcigpICkgKTsKKworICAgIGVmdW46OnJlbW92ZV9pbnRlcmFjdGl2ZShvYik7Cit9CisKKwordm9pZCBfX191cGRtYXN0ZXIoKQoreworICAgIG9iamVjdCBvYjsKKworICAgIC8vc29sbHRlIG5pY2h0IGplZGVyIGR1ZXJmZW4uCisgICAgaWYgKHByb2Nlc3NfY2FsbCgpIHx8ICFBUkNIX1NFQ1VSSVRZKQorICAgICAgcmFpc2VfZXJyb3IoIklsbGVnYWwgdXNlIG9mIF9fX3VwZG1hc3RlcigpISIpOworCisgICAgd3JpdGUoIlJlbW92aW5nIG9sZCBtYXN0ZXIgLi4uICIpOworICAgIGZvcmVhY2goc3RyaW5nIGZpbGU6IAorICAgICAgICBnZXRfZGlyKCIvc2VjdXJlL21hc3Rlci8qLmMiLEdFVERJUl9OQU1FU3xHRVRESVJfVU5TT1JURUR8R0VURElSX1BBVEgpKSB7CisgICAgICBpZiAob2IgPSBmaW5kX29iamVjdChmaWxlKSkKKyAgICAgICBlZnVuOjpkZXN0cnVjdChvYik7CisgICAgfQorICAgIGVmdW46OmRlc3RydWN0KGVmdW46OmZpbmRfb2JqZWN0KCIvc2VjdXJlL21hc3RlciIpKTsKKyAgICB3cml0ZSgiZG9uZS5cbkxvYWRpbmcgYWdhaW4gLi4uICIpOworICAgIGxvYWRfb2JqZWN0KCIvc2VjdXJlL21hc3RlciIpOworCisgICAgd3JpdGUoImRvbmUuXG4iKTsKK30KKwordmFyYXJncyBzdHJpbmcgY291bnRyeShtaXhlZCBpcCwgc3RyaW5nIG51bSkgeworICBtaXhlZCByZXQ7CisKKyAgaWYocmV0ID0gKHN0cmluZykiL3AvZGFlbW9uL2lwbG9va3VwIi0+Y291bnRyeShudW0gfHwgaXApKSB7CisgICAgcmV0dXJuIHJldDsKKyAgfSBlbHNlIHJldHVybiAiPz8/IjsKK30KKworCisvLyAqIFNub29wZW4gdW5kIHdhcyBkYXp1Z2Vob2VydAorc3RhdGljIG9iamVjdCBmaW5kX3Nub29wZWQob2JqZWN0IHdobykKK3sKKyAgb2JqZWN0ICp1OworICBpbnQgaTsKKworICBmb3IgKGk9c2l6ZW9mKHU9dXNlcnMoKSktMTtpPj0wO2ktLSkKKyAgICBpZiAod2hvPT1lZnVuOjppbnRlcmFjdGl2ZV9pbmZvKHVbaV0sIElJX1NOT09QX05FWFQpKQorICAgICAgcmV0dXJuIHVbaV07CisgIHJldHVybiAwOworfQorCitwcml2YXRlIHN0cmluZyBMY3V0KHN0cmluZyBzdHIpIHsKKyAgcmV0dXJuIHN0cls1Li4xMV0rc3RyWzE4Li5dOworfQorCitub21hc2sgdmFyYXJncyBpbnQgc25vb3AoIG9iamVjdCBtZSwgb2JqZWN0IHlvdSApCit7CisgICAgaW50IHJldDsKKyAgICBvYmplY3Qgc25vb3BlcjAsIHNub29wZXIsIHNub29wZXIyLCBzbm9vcGVyMzsKKworICAgIGlmKCAhb2JqZWN0cChtZSkgfHwgbWUgPT0geW91IHx8ICFQTyApCisgICAgICAgcmV0dXJuIDA7CisKKyAgICBzbm9vcGVyMCA9IGZpbmRfc25vb3BlZChtZSk7CisKKyAgICAgaWYoeW91KXsKKyAgICAgICAgaWYgKCBQTyAhPSBtZSAmJiBxdWVyeV93aXpfZ3JwKG1lKSA+PSBxdWVyeV93aXpfZ3JwKGdldGV1aWQoUE8pKSApCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBpZiAoIHF1ZXJ5X3dpel9ncnAobWUpIDw9IHF1ZXJ5X3dpel9ncnAoeW91KSAmJgorICAgICAgICAgICAgICEoeW91LT5RdWVyeUFsbG93U25vb3AobWUpKSApCisgICAgICAgICAgICBpZiAoICFJU19ERVBVVFkobWUpIHx8IElTX0FSQ0goeW91KSApCisgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBpZiAoIChzbm9vcGVyID0gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyh5b3UsIElJX1NOT09QX05FWFQpKSAmJgorICAgICAgICAgICAgIHF1ZXJ5X3dpel9ncnAoc25vb3BlcikgPj0gcXVlcnlfd2l6X2dycChtZSkgKXsKKyAgICAgICAgICAgIGlmICggKGludClzbm9vcGVyLT5RdWVyeVByb3AoUF9TTk9PUEZMQUdTKSAmIFNGX0xPQ0tFRCApCisgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAgICAgdGVsbF9vYmplY3QoIHNub29wZXIsIHNwcmludGYoICIlcyBzbm9vcGVkIGpldHp0ICVzLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lLT5uYW1lKFdFUiksIHlvdS0+bmFtZShXRVIpICkgKTsKKworICAgICAgICAgICAgc25vb3BlcjIgPSBtZTsKKworICAgICAgICAgICAgd2hpbGUgKCBzbm9vcGVyMyA9IGludGVyYWN0aXZlX2luZm8oc25vb3BlcjIsIElJX1NOT09QX05FWFQpICl7CisgICAgICAgICAgICAgICB0ZWxsX29iamVjdCggc25vb3BlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoICIlcyB3aXJkIHNlaW5lcnNlaXRzIHZvbiAlcyBnZXNub29wZWQuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxzbm9vcGVyMi0+bmFtZShXRVIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMy0+bmFtZShXRU0pICkgKTsKKyAgICAgICAgICAgICAgIHNub29wZXIyID0gc25vb3BlcjM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVmdW46OnNub29wKCBzbm9vcGVyLCBzbm9vcGVyMiApOworCisgICAgICAgICAgICBpZiAoIGVmdW46OmludGVyYWN0aXZlX2luZm8oc25vb3BlcjIsIElJX1NOT09QX05FWFQpICE9IHNub29wZXIgKQorICAgICAgICAgICAgICAgdGVsbF9vYmplY3QoIHNub29wZXIsIHNwcmludGYoICJEdSBrYW5uc3QgJXMgbmljaHQgc25vb3Blbi5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMi0+bmFtZShXRU4pICkgKTsKKyAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICB0ZWxsX29iamVjdCggc25vb3Blciwgc3ByaW50ZiggIkR1IHNub29wc3QgamV0enQgJXMuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlcjItPm5hbWUoV0VOKSApICk7CisgICAgICAgICAgICAgICBpZiAoICFJU19ERVBVVFkoc25vb3BlcikgKXsKKyAgICAgICAgICAgICAgICAgICBsb2dfZmlsZSggU05PT1BMT0dGSUxFLCBzcHJpbnRmKCIlczogJU8gJU8gJU9cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0aW1lKHRpbWUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMikgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAgKTsKKyAgICAgICAgICAgICAgICAgICBpZiAoc25vb3BlcjApCisgICAgICAgICAgICAgICAgICAgICAgQ0hNQVNURVItPnNlbmQoICJTbm9vcCIsIHNub29wZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCAiJXMgKk9GRiogJXMgKCVPKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHNub29wZXIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoc25vb3BlcjApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjApICkgKTsKKworICAgICAgICAgICAgICAgICAgIENITUFTVEVSLT5zZW5kKCAiU25vb3AiLCBzbm9vcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZigiJXMgLT4gJXMgKCVPKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoc25vb3BlcikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHNub29wZXIyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjIpKSk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgICAgIGxvZ19maWxlKCBBU05PT1BMT0dGSUxFLCBzcHJpbnRmKCAiJXM6ICVPICVPICVPXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0aW1lKHRpbWUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMikgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxMDAwMDAgKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBpZiAoc25vb3BlcikKKyAgICAgICAgICAgICAgIGlmICggIW1lLT5RdWVyeVByb3AoUF9TTk9PUEZMQUdTKSAmIFNGX0xPQ0tFRCApeworICAgICAgICAgICAgICAgICAgIHByaW50ZiggIiVzIHdpcmQgYmVyZWl0cyB2b24gJXMgZ2Vzbm9vcGVkLiBCZW51dHplIGRhcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJcImZcIi1GbGFnLCB3ZW5uIGR1IGRlbm5vY2ggc25vb3BlbiB3aWxsc3QuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICB5b3UtPm5hbWUoV0VSKSwgc25vb3Blci0+bmFtZShXRU0pICk7CisgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gZWZ1bjo6c25vb3AoIG1lLCB5b3UgKTsKKworICAgICAgICBpZiAoICFJU19ERVBVVFkobWUpICYmIGVmdW46OmludGVyYWN0aXZlX2luZm8oeW91LCBJSV9TTk9PUF9ORVhUKSA9PSBtZSl7CisgICAgICAgICAgICBsb2dfZmlsZSggU05PT1BMT0dGSUxFLCBzcHJpbnRmKCAiJXM6ICVPICVPICVPXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMY3V0KGR0aW1lKHRpbWUoKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZSwgeW91LCBlbnZpcm9ubWVudCh5b3UpICksCisgICAgICAgICAgICAgICAgICAgICAxMDAwMDAgKTsKKworICAgICAgICAgICAgaWYgKHNub29wZXIwKQorICAgICAgICAgICAgICAgQ0hNQVNURVItPnNlbmQoICJTbm9vcCIsIG1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCAiJXMgKk9GRiogJXMgKCVPKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKG1lKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoc25vb3BlcjApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMCkgKSApOworCisgICAgICAgICAgICBDSE1BU1RFUi0+c2VuZCggIlNub29wIiwgbWUsIHNwcmludGYoICIlcyAtPiAlcyAoJU8pLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChtZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoeW91KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudCh5b3UpICkgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNleworICAgICAgICAgICAgaWYgKCBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKHlvdSwgSUlfU05PT1BfTkVYVCkgPT0gbWUgKXsKKyAgICAgICAgICAgICAgIGxvZ19maWxlKCBBU05PT1BMT0dGSUxFLCBzcHJpbnRmKCAiJXM6ICVPICVPICVPXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGN1dChkdGltZSh0aW1lKCkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lLCB5b3UsIGVudmlyb25tZW50KHlvdSkgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCByZXQgJiYgcXVlcnlfd2l6X2dycChtZSkgPD0gcXVlcnlfd2l6X2dycCh5b3UpICYmCisgICAgICAgICAgICAgIUlTX0RFUFVUWShtZSkgKQorICAgICAgICAgICAgdGVsbF9vYmplY3QoIHlvdSwgIioqKiAiICsgTkFNRShtZSkgKyAiIHNub29wdCBEaWNoIVxuIiApOworCisgICAgICAgIHJldHVybiByZXQ7CisgICAgIH0KKyAgICAgZWxzZSB7CisgICAgICAgIGlmICggKG1lID09IFBPIHx8CisgICAgICAgICAgICAgIHF1ZXJ5X3dpel9ncnAoZ2V0ZXVpZChQTykpID4gcXVlcnlfd2l6X2dycChtZSkgfHwKKyAgICAgICAgICAgICAgKHF1ZXJ5X3dpel9ncnAoZ2V0ZXVpZChQTykpID09IHF1ZXJ5X3dpel9ncnAobWUpICYmCisgICAgICAgICAgICAgIGVmdW46OmludGVyYWN0aXZlX2luZm8oUE8sIElJX1NOT09QX05FWFQpID09IG1lKSkgJiYgc25vb3BlcjAgKXsKKyAgICAgICAgICAgIGlmICggIUlTX0RFUFVUWShtZSkgKXsKKyAgICAgICAgICAgICAgIGxvZ19maWxlKCBTTk9PUExPR0ZJTEUsIHNwcmludGYoICIlczogJU8gJU8gJU8gKk9GRipcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExjdXQoZHRpbWUodGltZSgpKSksIG1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjApICksCisgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAgKTsKKworICAgICAgICAgICAgICAgIENITUFTVEVSLT5zZW5kKCAiU25vb3AiLCBtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoICIlcyAqT0ZGKiAlcyAoJU8pLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKG1lKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHNub29wZXIwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIwKSApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgbG9nX2ZpbGUoIEFTTk9PUExPR0ZJTEUsIHNwcmludGYoICIlczogJU8gJU8gJU8gKk9GRipcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMY3V0KGR0aW1lKHRpbWUoKSkpLCBtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjApICksCisgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGVmdW46OnNub29wKG1lKTsKKyAgICAgICAgfQorICAgICB9CisgICAgIHJldHVybiAwOworfQorCisKKworLy8gKiBFbXVsYXRpb24gZGVzICdhbHRlbicgZXhwbG9kZSBkdXJjaCBkYXMgbmV1ZQorc3RyaW5nICpvbGRfZXhwbG9kZShzdHJpbmcgc3RyLCBzdHJpbmcgZGVsKSB7CisgIGludCBzLCB0OworICBzdHJpbmcgKnN0cnM7CisKKyAgaWYgKCFzdHJpbmdwKHN0cikpIHsKKyAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKAorICAgICAgICAgIkludmFsaWQgYXJndW1lbnQgMSB0byBvbGRfZXhwbG9kZSgpISBFeHBlY3RlZCA8c3RyaW5nPiwgZ290OiAiCisgICAgICAgICAiJS4zME9cbiIsc3RyKSk7CisgIH0KKyAgaWYgKCFzdHJpbmdwKGRlbCkpIHsKKyAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKAorICAgICAgICAgIkludmFsaWQgYXJndW1lbnQgMiB0byBvbGRfZXhwbG9kZSgpISBFeHBlY3RlZCA8c3RyaW5nPiwgZ290OiAiCisgICAgICAgICAiJS4zME9cbiIsZGVsKSk7CisgIH0KKyAgaWYoZGVsID09ICIiKQorICAgIHJldHVybiAoe3N0cn0pOworICBzdHJzPWVmdW46OmV4cGxvZGUoc3RyLCBkZWwpOworICB0PXNpemVvZihzdHJzKS0xOworICB3aGlsZShzPD10ICYmIHN0cnNbcysrXSA9PSAiIik7cy0tOworICB3aGlsZSh0Pj0wICYmIHN0cnNbdC0tXSA9PSAiIik7dCsrOworICBpZihzPD10KQorICAgIHJldHVybiBzdHJzW3MuLnRdOworICByZXR1cm4gKHt9KTsKK30KKworaW50IGZpbGVfdGltZShzdHJpbmcgcGF0aCkgeworICBtaXhlZCAqdjsKKworICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICBpZiAoc2l6ZW9mKHY9Z2V0X2RpcihwYXRoLEdFVERJUl9EQVRFUykpKSByZXR1cm4gdlswXTsKKyAgcmV0dXJuKDApOyAvL3NvbnN0Cit9CisKKy8vICogQmVpIDUwayBHcm9lc3NlIExvZy1GaWxlIHJvdGllcmVuCit2YXJhcmdzIGludCBsb2dfZmlsZShzdHJpbmcgZmlsZSwgc3RyaW5nIHR4dCwgaW50IHNpemVfdG9fYnJlYWspIHsKKyAgbWl4ZWQgKnN0OworCisgIGZpbGU9Ii9sb2cvIitmaWxlOworICBmaWxlPWltcGxvZGUoKGVmdW46OmV4cGxvZGUoZmlsZSwiLyIpLSh7Ii4uIn0pKSwiLyIpOworLy8gIHRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJqb2YiKSxzcHJpbnRmKCJMT0cgRklMRTogJU8gLT4gJU9cbiIscHJldmlvdXNfb2JqZWN0KCksZmlsZSkpOworICBpZiAoIWZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjpjYWxsX290aGVyLFBPKSwic2VjdXJlL21hc3RlciIsLy8nKQorICAgICAgICAgICAgICAidmFsaWRfd3JpdGUiLGZpbGUsZ2V0ZXVpZChQTyksImxvZ19maWxlIixQTykpCisgICAgICByZXR1cm4gMDsKKyAgaWYgKCBzaXplX3RvX2JyZWFrID49IDAgJiAoCisgICAgICBzaXplb2Yoc3QgPSBnZXRfZGlyKGZpbGUsMikgKSAmJiBzdFswXSA+PSAoc2l6ZV90b19icmVha3xNQVhfTE9HX1NJWkUpKSkKKyAgICAgIGNhdGNoKHJlbmFtZShmaWxlLCBmaWxlICsgIi5vbGQiKTtwdWJsaXNoKTsgLyogTm8gcGFuaWMgaWYgZmFpbHVyZSAqLworICByZXR1cm4od3JpdGVfZmlsZShmaWxlLHR4dCkpOworfQorCisvLyAqIE1hZ2llci1MZXZlbCBhYmZyYWdlbgoraW50IHF1ZXJ5X3dpel9sZXZlbChtaXhlZCBwbGF5ZXIpIHsKKyAgcmV0dXJuIChpbnQpIi9zZWN1cmUvbWFzdGVyIi0+cXVlcnlfd2l6X2xldmVsKHBsYXllcik7Cit9CisKKyNpZmRlZiBfX0FMSVNUU19fCisvLyAqIEVsZW1lbnQgYXVzIEFsaXN0IGxvZXNjaGVuIChieSBrZXkpCittaXhlZCAqcmVtb3ZlX2FsaXN0KG1peGVkIGtleSxtaXhlZCAqYWxpc3QpCit7CisgIGludCBpLGo7CisKKyAgaWYgKCFwb2ludGVycChhbGlzdCkgfHwgIXNpemVvZihhbGlzdCkpCisgICAgcmV0dXJuIGFsaXN0OworICBpZiAoIXBvaW50ZXJwKGFsaXN0WzBdKSkKKyAgeworICAgIGlmICgoaT1hc3NvYyhrZXksYWxpc3QpKTwwKQorICAgICAgcmV0dXJuIGFsaXN0OworICAgIHJldHVybiBhbGlzdFswLi5pLTFdK2FsaXN0W2krMS4uXTsKKyAgfQorICBpID0gYXNzb2Moa2V5LGFsaXN0WzBdKTsKKyAgaWYgKChpPWFzc29jKGtleSxhbGlzdFswXSkpPDApCisgICAgcmV0dXJuIGFsaXN0OworICBhbGlzdD1hbGlzdFswLi5dOworICBmb3IgKGo9c2l6ZW9mKGFsaXN0KS0xO2o+PTA7ai0tKQorICAgIGFsaXN0W2pdPWFsaXN0W2pdWzAuLmktMV0rYWxpc3Rbal1baSsxLi5dOworICByZXR1cm4gYWxpc3Q7Cit9CisKKy8vICogRWxlbWVudCBhdXMgQWxpc3QgbG9lc2NoZW4gKGJ5IHBvcykKK21peGVkICpleGNsdWRlX2FsaXN0KGludCBpLG1peGVkICphbGlzdCkKK3sKKyAgaW50IGo7CisgIGlmICghcG9pbnRlcnAoYWxpc3QpIHx8ICFzaXplb2YoYWxpc3QpIHx8IGk8MCkKKyAgICByZXR1cm4gYWxpc3Q7CisgIGlmICghcG9pbnRlcnAoYWxpc3RbMF0pKQorICAgIHJldHVybiBhbGlzdFswLi5pLTFdK2FsaXN0W2krMS4uXTsKKyAgYWxpc3Q9YWxpc3RbMC4uXTsgLyogQ3JlYXRlIFBIWVNJQ0FMIGNvcHkgb2YgYWxpc3QgKi8KKyAgZm9yIChqPXNpemVvZihhbGlzdCktMTtqPj0wO2otLSkKKyAgICBhbGlzdFtqXT1hbGlzdFtqXVswLi5pLTFdK2FsaXN0W2pdW2krMS4uXTsKKyAgcmV0dXJuIGFsaXN0OyAvKiBvcmRlcl9hbGlzdCBpcyBOT1QgbmVjZXNzYXJ5IC0gc2VlIC9kb2MvTFBDL2FsaXN0ICovCit9CisjZW5kaWYgLy8gX19BTElTVFNfXworCisvLyAqIEdlcm1hbiB2ZXJzaW9uIG9mIGN0aW1lKCkKKyNkZWZpbmUgVEFHRSAoeyJTb24iLCJNb24iLCJEaWUiLCJNaXQiLCJEb24iLCJGcmUiLCJTYW0ifSkKKyNkZWZpbmUgTU9OQVRFICh7IkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1haSIsIkp1biIsIkp1bCIsIkF1ZyIsXAorICAgICAgICAgICAgICAgICAiU2VwIiwiT2t0IiwiTm92IiwiRGV6In0pCitzdHJpbmcgZHRpbWUoaW50IHdhbm4pIHsKKyAgCisgIGlmICh3YW5uID09IGR0aW1lX2NhY2hlWzBdKQorICAgIHJldHVybihkdGltZV9jYWNoZVsxXSk7CisKKyAgaW50ICpsdCA9IGxvY2FsdGltZSh3YW5uKTsKKyAgcmV0dXJuIHNwcmludGYoIiVzLCAlMmQuICVzICVkLCAlMDJkOiUwMmQ6JTAyZCIsCisgICAgICBUQUdFW2x0W1RNX1dEQVldXSwgbHRbVE1fTURBWV0sIE1PTkFURVtsdFtUTV9NT05dXSwgCisgICAgICBsdFtUTV9ZRUFSXSxsdFtUTV9IT1VSXSwgbHRbVE1fTUlOXSwgbHRbVE1fU0VDXSk7Cit9CisKKy8vIHdlbm4gc3RyZnRpbWUgaW0gRHJpdmVyIG5pY2h0IGV4aXN0aWVydCwgaXN0IGRpZXMgaGllciBlaW4gQWxpYXMgYXVmIGR0aW1lKCksCisvLyB6d2FyIHN0aW1tdCBkYXMgRm9ybWF0IGRhbm4gbmljaHQsIGFiZXIgZGllIE11ZGxpYiBidWdndCBuaWNodCB1bmQgc2NocmVpYnQKKy8vIGVpbiBvcmRlbnRsaWNoZXMgRGF0dW0vVWhyemVpdC4KKyNpZiAhX19FRlVOX0RFRklORURfXyhzdHJmdGltZSkKK3ZhcmFyZ3Mgc3RyaW5nIHN0cmZ0aW1lKG1peGVkIGZtdCwgaW50IGNsb2NrLCBpbnQgbG9jYWxpemVkKSB7CisgIGlmIChpbnRwKGNsb2NrKSAmJiBjbG9jayA+PSAwKQorICAgIHJldHVybiBkdGltZShjbG9jayk7CisgIGVsc2UgaWYgKGludHAoZm10KSAmJiBmbXQgPj0gMCkKKyAgICByZXR1cm4gZHRpbWUoZm10KTsKKyAgCisgIHJldHVybiBkdGltZSh0aW1lKCkpOworfQorI2VuZGlmIC8vIV9fRUZVTl9ERUZJTkVEX18oc3RyZnRpbWUpCisKKy8vICogU2h1dGRvd24gbWl0IHp1c2FldHpsaWNoZW0gbG9nZ2luZworbm9tYXNrIGludCBzaHV0ZG93bihzdHJpbmcgcmVhc29uKQoreworICBzdHJpbmcgbmFtZTsKKyAgc3RyaW5nIG9ibmFtZTsKKyAgc3RyaW5nIG91dHB1dDsKKworICBpZiAoIXJlYXNvbikKKyAgICByZXR1cm4gMDsKKyAgaWYgKCAhQVJDSF9TRUNVUklUWSAmJiBnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpIT1ST09USUQgJiYKKyAgICAgICAgICBvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSkhPSIvb2JqL3NodXQiICkKKyAgeworICAgIHdyaXRlKCJZb3UgaGF2ZSBubyBwZXJtaXNzaW9uIHRvIHNodXQgZG93biB0aGUgZ2FtZWRyaXZlciFcbiIpOworICAgIHJldHVybiAwOworICB9CisgIGlmICgodGhpc19pbnRlcmFjdGl2ZSgpKSYmKG5hbWU9Z2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSkpKQorICB7CisgICAgbmFtZT1jYXBpdGFsaXplKG5hbWUpOworICAgIGZpbHRlcih1c2VycygpLCMndGVsbF9vYmplY3QsLy8nCisgICAgICAgICAgICAgICBjYXBpdGFsaXplKG5hbWUpKyIgZmFlaHJ0IGRhcyBTcGllbCBoZXJ1bnRlciFcbiIpOworICB9CisgIGVsc2UKKyAgICBuYW1lPSJBTk9OWU1PVVMiOworICBpZiAocHJldmlvdXNfb2JqZWN0KCkpIG9ibmFtZT1jYXBpdGFsaXplKGdldHVpZChwcmV2aW91c19vYmplY3QoKSkpOworICBvdXRwdXQ9bmFtZTsKKyAgaWYgKG9ibmFtZSAmJiBuYW1lIT1vYm5hbWUpIG91dHB1dD1vdXRwdXQrIiAoIitvYm5hbWUrIikiOworICBpZiAocHJldmlvdXNfb2JqZWN0KCkmJm9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKT09Ii9vYmovc2h1dCIpeworICAgIG91dHB1dCs9IiBmYWVocnQgZGFzIFNwaWVsIHZpYSBBcm1hZ2VkZG9uIGhlcnVudGVyLlxuIjsKKyAgICBvdXRwdXQ9ZHRpbWUodGltZSgpKSsiOiAiK291dHB1dDsKKyAgICBsb2dfZmlsZSgiR0FNRV9MT0ciLG91dHB1dCsiXG4iLC0xKTsKKyAgICBlZnVuOjpzaHV0ZG93bigpOworICAgIHJldHVybiAxOworICB9CisgIG91dHB1dD1jdGltZSh0aW1lKCkpKyI6ICIrb3V0cHV0KyIgZmFlaHJ0IGRhcyBTcGllbCBoZXJ1bnRlci5cbiI7CisgIG91dHB1dCs9IiAgICBHcnVuZDogIityZWFzb247CisgIGxvZ19maWxlKCJHQU1FX0xPRyIsb3V0cHV0KyJcbiIsLTEpOworICBlZnVuOjpzaHV0ZG93bigpOworICByZXR1cm4gMTsKK30KKworLy8gKiBsb3dlcmNoYXIKKworaW50IGxvd2VyY2hhcihpbnQgY2hhcikgeworICBpZiAoY2hhcjwnQScgfHwgY2hhcj4nWicpIHJldHVybiBjaGFyOworICByZXR1cm4gY2hhciszMjsKK30KKworLy8gKiB1cHBlcnN0cmluZworCitzdHJpbmcgdXBwZXJzdHJpbmcoc3RyaW5nIHMpCit7CisjaWYgX19FRlVOX0RFRklORURfXyh1cHBlcl9jYXNlKQorICByZXR1cm4odXBwZXJfY2FzZShzKSk7CisjZWxzZQorICBpbnQgaTsKKyAgaWYgKCFzdHJpbmdwKHMpKSByZXR1cm4gMDsKKyAgZm9yIChpPXNpemVvZihzKS0xO2k+PTA7aS0tKSBzW2ldPSgoc1tpXTwnYSd8fHNbaV0+J3onKT9zW2ldOnNbaV0tMzIpOworICByZXR1cm4gczsKKyNlbmRpZgorfQorCisvLyAqIGxvd2Vyc3RyaW5nCisKK3N0cmluZyBsb3dlcnN0cmluZyhzdHJpbmcgcykKK3sKKyAgaWYgKCFzdHJpbmdwKHMpKSByZXR1cm4gMDsKKyAgcmV0dXJuIGxvd2VyX2Nhc2Uocyk7Cit9CisKKworLy8gKiBHRCB2ZXJzaW9uCitzdHJpbmcgdmVyc2lvbigpCit7CisgIHJldHVybiBfX1ZFUlNJT05fXzsKK30KKworLy8gKiBicmVha19zdHJpbmcKKy8vIHN0cmV0Y2goKSAtLSBzdHJldGNoIGEgbGluZSB0byBmaWxsIGEgZ2l2ZW4gd2lkdGggCitwcml2YXRlIHN0cmluZyBzdHJldGNoKHN0cmluZyBzLCBpbnQgd2lkdGgpIHsKKyAgaW50IGxlbj1zaXplb2Yocyk7CisgIGlmIChsZW49PXdpZHRoKSByZXR1cm4gczsKKworICAvLyByZWluZSBMZWVyemVpbGVuLCBkaXJla3QgenVydWVja2dlYmVuCisgIHN0cmluZyB0cmltbWVkPXRyaW0ocyxUUklNX0xFRlQsIiAiKTsKKyAgaWYgKHRyaW1tZWQ9PSIiKSByZXR1cm4gczsgCisgIGludCBzdGFydF9zcGFjZXMgPSBsZW4gLSBzaXplb2YodHJpbW1lZCk7CisKKyAgc3RyaW5nKiB3b3JkcyA9IGV4cGxvZGUodHJpbW1lZCwgIiAiKTsKKyAgLy8gZGVyIGxldHp0ZSBrcmllZ3Qga2VpbmUgU3BhY2VzCisgIGludCB3b3JkX2NvdW50PXNpemVvZih3b3JkcykgLSAxOworICAvLyB3ZW5uIFplaWxlIG51ciBhdXMgZWluZW0gV29ydCwgd2lyZCBkYXMgV29ydCB6dXJ1ZWNrZ2VnZWJlbgorICBpZiAoIXdvcmRfY291bnQpCisgICAgcmV0dXJuICIgIipzdGFydF9zcGFjZXMgKyB3b3Jkc1swXTsKKworICBpbnQgc3BhY2VfY291bnQgPSB3aWR0aCAtIGxlbjsKKworICBpbnQgc3BhY2VfcGVyX3dvcmQ9KHdvcmRfY291bnQrc3BhY2VfY291bnQpIC8gd29yZF9jb3VudDsKKyAgLy8gQW56LldvZXJ0ZXIgbWl0IFp1c2F0ei1TcGFjZQorICBpbnQgcmVzdD0od29yZF9jb3VudCtzcGFjZV9jb3VudCkgJSB3b3JkX2NvdW50OyAKKyAgLy8gUmVzdC1TcGFjZXMgVmVydGVpbGVuCisgIGZvcmVhY2ggKGludCBwb3MgOiByZXN0KSB3b3Jkc1twb3NdKz0iICI7CisgIHJldHVybiAoIiAiKnN0YXJ0X3NwYWNlcykgKyBpbXBsb2RlKCB3b3JkcywgIiAiKnNwYWNlX3Blcl93b3JkICk7Cit9CisKKy8vIGF1cyBHZXNjaHdpbmRpZ2tlaXRzZ3J1ZW5kZW4gaGF0IGRlciBCbG9ja3NhdHogZnVlciBicmVha19zdHJpbmcgZWluZQorLy8gZWlnZW5lIEZ1bmt0aW9uIGJla29tbWVuOgorcHJpdmF0ZSB2YXJhcmdzIHN0cmluZyBibG9ja19zdHJpbmcoc3RyaW5nIHMsIGludCB3aWR0aCwgaW50IGZsYWdzKSB7CisgIC8vIHdlbm4gQlNfTEVBVkVfTVlfTEZTLCBhYmVyIGtlaW4gQlNfTk9fUEFSSU5ERU5ULCBkYW5uIHdlcmRlbiBaZWlsZW4gbWl0CisgIC8vIGVpbmVtIExlZXJ6ZWljaGVuIGJlZ29ubmVuLgorICAvLyBCVFc6IFdlbm4gIUJTX0xFQVZFX01ZX0xGUywgaGF0IGRlciBBdWZydWZlciBiZXJlaXRzIGFsbGUgXG4gZHVyY2ggIiAiCisgIC8vIGVyc2V0enQuCisgIGlmICggKGZsYWdzICYgQlNfTEVBVkVfTVlfTEZTKQorICAgICAgJiYgIShmbGFncyAmIEJTX05PX1BBUklOREVOVCkpCisgIHsKKyAgICAgIHMgPSAiICIrcmVncmVwbGFjZShzLCJcbiIsIlxuICIsMSk7CisgIH0KKworICAvLyBzcHJpbnRmIGZ1ZWxsdCBkaWUgbGV0enRlIFplaWxlIGF1ZiBkaWUgRmVsZGJyZWl0ZSAoaGllciBhbHNvCisgIC8vIFplaWxlbmJyZWl0ZSkgbWl0IEZ1ZWxsemVpY2hlbiBhdWYsIHdlbm4gc2llIE5JQ0hUIG1pdCBcbiB1bWdlYnJvY2hlbgorICAvLyBpc3QuIEVzIHdpcmQgYW4gZGllIGxldHp0ZSBaZWlsZSBhYmVyIGtlaW4gWmVpbGVudW1icnVjaCBhbmdlaGFlbmd0LgorICAvLyBFaWdlbnRsaWNoIGlzdCBkYXMgQXVmZnVlbGxlbiBkb29mLCBhYmVyIHZlcm11dGxpY2ggaXN0IGVzIHVubm9ldGlnLCBlcworICAvLyB3aWVkZXIgcnVlY2tnYWVuZ2lnIHp1IG1hY2hlbi4KKyAgcyA9IHNwcmludGYoICIlLSo9cyIsIHdpZHRoLCBzKTsKKworICBzdHJpbmcgKnRtcD1leHBsb2RlKHMsICJcbiIpOworICAvLyBOdXIgd2VubiBzIG1laHJ6ZWlsaWcgaXN0LCBCbG9ja3NhdHogZHJhdXMgbWFjaGVuLiBEaWUgbGV0enRlIFplaWxlIHdpcmQKKyAgLy8gbmF0dWVybGljaCBuaWNodCBnZWRlaG50LiBTaWUgaXN0IGRhZnVlciBzY2hvbiB2b24gc3ByaW50ZigpIGF1ZmdlZnVlbGx0CisgIC8vIHdvcmRlbi4gQlRXOiBEaWUgbGV0enRlIFplaWxlIGVuZGV0IHUuVS4gbm9jaCBuaWNodCBtaXQgZWluZW0gXG4gKGJ6dy4KKyAgLy8gbnVyIGRhbm4sIHdlbm4gQlNfTEVBVkVfTVlfTEZTIHVuZCBkZXIgdWViZXJnZWJlbmUgVGV4dCBzY2hvbiBuZW4gXG4gYW0KKyAgLy8gRW5kZSBkZXIgbGV0enRlbiBaZWlsZSBoYXQpLCBkYXMgbWFjaHQgZGVyIEF1ZnJ1ZmVyLi4uCisgIGlmIChzaXplb2YodG1wKSA+IDEpCisgICAgcmV0dXJuIGltcGxvZGUoIG1hcCggdG1wWzAuLjwyXSwgIydzdHJldGNoLyonKi8sIHdpZHRoICksICJcbiIgKSAKKyAgICAgICsgIlxuIiArIHRtcFs8MV07CisKKyAgcmV0dXJuIHM7Cit9CisKK3B1YmxpYyB2YXJhcmdzIHN0cmluZyBicmVha19zdHJpbmcoc3RyaW5nIHMsIGludCB3LCBtaXhlZCBpbmRlbnQsIGludCBmbGFncykKK3sKKyAgICBpZiAoICFzIHx8IHMgPT0gIiIgKSByZXR1cm4gIiI7CisKKyAgICBpZiAoICF3ICkgdz03ODsKKworICAgIGlmKCBpbnRwKGluZGVudCkgKQorICAgICAgIGluZGVudCA9IGluZGVudCA/ICIgIippbmRlbnQgOiAiIjsKKworICAgIGludCBpbmRlbnRsZW49c3RyaW5ncChpbmRlbnQpID8gc2l6ZW9mKGluZGVudCkgOiAwOworCisgICAgaWYgKGluZGVudGxlbj53KSB7CisgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiYnJlYWtfc3RyaW5nOiBpbmRlbnQgbG9uZ2VyICVkIHRoYW4gd2lkdGggJWRcbiIsCisgICAgICAgICAgICAgICAgICBpbmRlbnRsZW4sdykpOworICAgICAgLy8gdz0oKGluZGVudGxlbi93KSsxKSp3OworICAgIH0KKworICAgIGlmICghKGZsYWdzICYgQlNfTEVBVkVfTVlfTEZTKSkgCisgICAgICBzPXJlZ3JlcGxhY2UoIHMsICJcbiIsICIgIiwgMSApOworCisgICAgaWYgKCBmbGFncyAmIEJTX1NJTkdMRV9TUEFDRSApCisgICAgICAgcyA9IHJlZ3JlcGxhY2UoIHMsICIoXnxcbnwgKSAgKiIsICJcXDEiLCAxICk7CisgCisgICAgc3RyaW5nIHByZWZpeD0iIjsKKyAgICBpZiAoaW5kZW50bGVuICYmIGZsYWdzICYgQlNfUFJFUEVORF9JTkRFTlQpIHsKKyAgICAgIGlmIChpbmRlbnRsZW4rc2l6ZW9mKHMpID4gdyB8fCAKKyAgICAgICAgIChmbGFncyAmIEJTX0xFQVZFX01ZX0xGUykgJiYgc3Ryc3RyKHMsIlxuIik+LTEpIHsKKyAgICAgICBwcmVmaXg9aW5kZW50KyJcbiI7CisgICAgICAgaW5kZW50PShmbGFncyAmIEJTX05PX1BBUklOREVOVCkgPyAiIiA6ICIgIjsKKyAgICAgICBpbmRlbnRsZW49c2l6ZW9mKGluZGVudCk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCBmbGFncyAmIEJTX0JMT0NLICkgeworICAgICAgLyoKKyAgICAgICAgICAgcyA9IGltcGxvZGUoIG1hcCggZXhwbG9kZSggcywgIlxuIiApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMnYmxvY2tfc3RyaW5nLCB3LCBpbmRlbnRsZW4sIGZsYWdzKSwKKyAgICAgICAgICAgICAgICAgICAgICAiIiApOworICAgICAgKi8KKyAgICAgIHMgPSBibG9ja19zdHJpbmcoIHMgLCB3IC0gaW5kZW50bGVuLCBmbGFncyApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHMgPSBzcHJpbnRmKCIlLTEuKj1zIix3LWluZGVudGxlbixzKTsKKyAgICB9CisgICAgaWYgKCBzWzwxXSAhPSAnXG4nICkgcyArPSAiXG4iOworCisgICAgaWYgKCAhaW5kZW50bGVuICkgcmV0dXJuIHByZWZpeCArIHM7CisgICAgCisgICAgc3RyaW5nIGluZGVudDIgPSAoIGZsYWdzICYgQlNfSU5ERU5UX09OQ0UgKSA/ICgiICIqaW5kZW50bGVuKSA6aW5kZW50OworICAgICAgCisgICAgcmV0dXJuIHByZWZpeCArIGluZGVudCArIAorICAgICAgcmVncmVwbGFjZSggc1swLi48Ml0sICJcbiIsICJcbiIraW5kZW50MiwgMSApICsgIlxuIjsKKyAgICAgIC8qCisgICAgICAgc3RyaW5nICpidWY7CisKKyAgICAgICBidWYgPSBleHBsb2RlKCBzLCAiXG4iICk7CisgICAgICAgcmV0dXJuIHByZWZpeCArIGluZGVudCArIGltcGxvZGUoIGJ1ZlswLi48Ml0sICJcbiIraW5kZW50MiApICsgYnVmWzwxXSArICJcbiI7CisgICAgICAqLworfQorCisvLyAqIEVsZW1lbnRlIGF1cyBtYXBwaW5nIGxvZXNjaGVuIC0gbWFwcGluZyB2b3JoZXIga29waWVyZW4KKworbWFwcGluZyBtX2NvcHlfZGVsZXRlKG1hcHBpbmcgbSwgbWl4ZWQga2V5KSB7CisgIHJldHVybiBtX2RlbGV0ZShjb3B5KG0pLCBrZXkpOworfQorCisvLyAqIHRpbWVzCitpbnQgbGFzdF9yZWJvb3RfdGltZSgpCit7CisgIHJldHVybiBfX0JPT1RfVElNRV9fOworfQorCitpbnQgZmlyc3RfYm9vdF90aW1lKCkKK3sKKyAgcmV0dXJuIDcwMTUxNzYwMDsKK30KKworaW50IGV4aXN0X2RheXMoKQoreworICByZXR1cm4gKCgodGltZSgpLWZpcnN0X2Jvb3RfdGltZSgpKS84NjQwKSs1KS8xMDsKK30KKworLy8gKiB1cHRpbWUgOikKK3N0cmluZyB1cHRpbWUoKQoreworICBpbnQgdDsKKyAgaW50IHRtcDsKKyAgc3RyaW5nIHM7CisKKyAgdD10aW1lKCktX19CT09UX1RJTUVfXzsKKyAgcz0iIjsKKyAgaWYgKHQ+PTg2NDAwKQorICAgIHMrPXNwcmludGYoIiVkIFRhZyVzLCAiLHRtcD10Lzg2NDAwLCh0bXA9PTE/IiI6ImUiKSk7CisgIGlmICh0Pj0zNjAwKQorICAgIHMrPXNwcmludGYoIiVkIFN0dW5kZSVzLCAiLHRtcD0odD10JTg2NDAwKS8zNjAwLCh0bXA9PTE/IiI6Im4iKSk7CisgIGlmICh0PjYwKQorICAgIHMrPXNwcmludGYoIiVkIE1pbnV0ZSVzIHVuZCAiLHRtcD0odD10JTM2MDApLzYwLCh0bXA9PTE/IiI6Im4iKSk7CisgIHJldHVybiBzK3NwcmludGYoIiVkIFNla3VuZGUlcyIsdD10JTYwLCh0PT0xPyIiOiJuIikpOworfQorCisvLyAqIFdhcyB0dW4gYmVpICdkYW5nbGluZycgbGZ1bi1jbG9zdXJlcyA/Cit2b2lkIGRhbmdsaW5nX2xmdW5fY2xvc3VyZSgpIHsKKyAgcmFpc2VfZXJyb3IoImRhbmdsaW5nIGxmdW4gY2xvc3VyZVxuIik7Cit9CisKKy8vICogU3BlcnJlbiBhdXNzZXIgZnVlciBtYXN0ZXIvc2ltdWxfZWZ1bgorCisjaWYgX19FRlVOX0RFRklORURfXyhzZXRfZW52aXJvbm1lbnQpCitub21hc2sgdm9pZCBzZXRfZW52aXJvbm1lbnQob2JqZWN0IG8xLCBvYmplY3QgbzIpIHsKKyAgcmFpc2VfZXJyb3IoIkF2YWlsYWJsZSBvbmx5IGZvciByb290XG4iKTsKK30KKyNlbmRpZgorCitub21hc2sgdm9pZCBzZXRfdGhpc19wbGF5ZXIob2JqZWN0IHBsKSB7CisgIHJhaXNlX2Vycm9yKCJBdmFpbGFibGUgb25seSBmb3Igcm9vdFxuIik7Cit9CisKKyNpZiBfX0VGVU5fREVGSU5FRF9fKGV4cG9ydF91aWQpCitub21hc2sgdm9pZCBleHBvcnRfdWlkKG9iamVjdCBvYikgeworICByYWlzZV9lcnJvcigiQXZhaWxhYmxlIG9ubHkgZm9yIHJvb3RcbiIpOworfQorI2VuZGlmCisKKy8vICogSmV0enQgYXVjaCBjbG9zdXJlcworaW50IHByb2Nlc3NfZmxhZzsKKworcHVibGljIG5vbWFzayBpbnQgcHJvY2Vzc19jYWxsKCkKK3sKKyAgaWYgKHByb2Nlc3NfZmxhZz4wKQorICAgIHJldHVybiBwcm9jZXNzX2ZsYWc7CisgIGVsc2UgcmV0dXJuKDApOworfQorCitwcml2YXRlIG5vbWFzayBzdHJpbmcgX3Byb2Nlc3Nfc3RyaW5nKHN0cmluZyBzdHIsb2JqZWN0IHBvKSB7CisgICAgICAgICAgICAgIHNldF90aGlzX29iamVjdChwbyk7CisgICAgICAgICAgICAgIHJldHVybihlZnVuOjpwcm9jZXNzX3N0cmluZyhzdHIpKTsKK30KKworbm9tYXNrIHN0cmluZyBwcm9jZXNzX3N0cmluZyggbWl4ZWQgc3RyICkKK3sKKyAgc3RyaW5nIHRtcCwgZXJyOworICBpbnQgZmxhZzsgCisKKyAgaWYgKCBjbG9zdXJlcChzdHIpICkgeworICAgICAgc2V0X3RoaXNfb2JqZWN0KCBwcmV2aW91c19vYmplY3QoKSApOworICAgICAgcmV0dXJuIGZ1bmNhbGwoc3RyKTsKKyAgfQorICBlbHNlIGlmIChzdHI9PTApCisgICAgICByZXR1cm4oKHN0cmluZylzdHIpOworICBlbHNlIGlmICggIXN0cmluZ3Aoc3RyKSApIHsKKyAgICAgIHJldHVybiB0b19zdHJpbmcoc3RyKTsKKyAgfQorCisgIGlmICggIShmbGFnID0gcHJvY2Vzc19mbGFnID4gdGltZSgpIC0gNjApKSAgICAgICAgICAgICAgICAgICAgIAorICAgICAgcHJvY2Vzc19mbGFnPXRpbWUoKTsKKworICBlcnIgPSBjYXRjaCh0bXAgPSBmdW5jYWxsKCMnX3Byb2Nlc3Nfc3RyaW5nLHN0cixwcmV2aW91c19vYmplY3QoKSk7IHB1Ymxpc2gpOworCisgIGlmICggIWZsYWcgKQorICAgIHByb2Nlc3NfZmxhZz0wOworCisgIGlmIChlcnIpIHsKKyAgICAvLyBWZXJhcmJlaXR1bmcgYWJicmVjaGVuCisgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICByYWlzZV9lcnJvcihlcnIpOworICB9CisgIHJldHVybiB0bXA7Cit9CisKKy8vICdta2RpciAtcCcgLSBlcnpldWd0IGVpbmUga29tcGxldHRlIEhpZXJhcmNoaWUgdm9uIFZlcnplaWNobmlzc2VuLgorLy8gd2VubiBkYXMgVmVyemVpY2huaXMgYW5nZWxlZ3Qgd3VyZGUgb2RlciBzY2hvbiBleGlzdGllcnQsIHdpcmQgMQorLy8genVydWVja2dlbGllZmVydCwgc29uc3QgMC4KKy8vIFdpcmZ0IGVpbmVuIEZlaGxlciwgd2VubiBkYXMgYW5nZWJlbmUgVmVyemVpY2huaXMgbmljaHQgYWJzb2x1dCBpc3QhCitwdWJsaWMgaW50IG1rZGlycChzdHJpbmcgZGlyKSB7CisgIC8vIHdlbm4gZXMgbnVyIGtlaW5lbiBmdWVocmVuZGVuIC8gZ2lidCwgaXN0IGRhcyBlaW4gRmVobGVyLgorICBpZiAoc3Ryc3RyKGRpciwgIi8iKSAhPSAwKQorICAgIHJhaXNlX2Vycm9yKCJta2RpcnAoKTogUGZhZCBpc3QgbmljaHQgYWJzb2x1dGUuXG4iKTsKKyAgLy8gY3V0IG9mZiB0cmFpbGluZyAvLi4uCisgIGlmIChkaXJbPDFdPT0nLycpCisgICAgICBkaXIgPSBkaXJbMC4uPDJdOworCisgIGludCBmc3RhdCA9IGZpbGVfc2l6ZShkaXIpOworICAvLyB3ZW5uIGVzIHNjaG9uIGV4aXN0aWVydCwgdHVuIHdpciBlaW5mYWNoIHNvLCBhbHMgaGFldHRlbiB3aXIgZXMgYW5nZWxlZ3QuCisgIGlmIChmc3RhdCA9PSBGU0laRV9ESVIpCisgICAgcmV0dXJuIDE7CisgIC8vIHdlbm4gc2Nob24gbmUgRGF0ZWkgZXhpc3RpZXJ0LCBnZWh0IGVzIG5pY2h0LgorICBpZiAoZnN0YXQgIT0gRlNJWkVfTk9GSUxFKQorICAgIHJldHVybiAwOworICAvLyB3ZW5uIGVzIG51ciBlaW5lbiAvIGdpYnQgKGRlbiBmdWVocmVuZGVuKSwgZGFubiBpc3QgZXMgZWluCisgIC8vIHRvcGxldmVsLXZlcnplaWNobmlzLCB3YXMgZGlyZWt0IGFuZ2VsZWd0IHdpcmQuCisgIGlmIChzdHJyc3RyKGRpciwiLyIpPT0wKSB7CisgICAgcmV0dXJuIGZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjpta2RpciwgcHJldmlvdXNfb2JqZWN0KCkpLCBkaXIpOworICB9CisKKyAgLy8gbWtkaXIoKSBuaWNodCBkaXJla3QgcnVmZW4sIHNvbmRlcm4gdm9yaGVyIGFscyBjbG9zdXJlIGFucyBhdWZydWZlbmRlCisgIC8vIE9iamVrdCBiaW5kZW4uIFNvbnN0IGxhZXVmdCBkaWUgUmVjaHRlcHJ1ZWZ1bmcgaW4gdmFsaWRfd3JpdGUoKSBpbSBNYXN0ZXIKKyAgLy8gdW50ZXIgZGVyIEFubmFobWUsIGRhc3MgZGllIHNpbXVsX2VmdW4uYyBtaXQgaWhyZXIgcm9vdCBpZCB3YXMgd2lsbC4KKworICAvLyBqZXR6dCByZWt1cnNpdiBkaWUgVmVyemVpY2huaXNoaWVyYXJjaGllIGFubGVnZW4uIFdlbm4gZGFzIGVyZm9sZ3JlaWNoCisgIC8vIGlzdCwgZGFubiBrb2VubmVuIHdpciBqZXR6dCBtaXQgbWtkaXIgZGFzIHRpZWZzdGUgVmVyemVpY2huaXMgYW5sZWdlbgorICBpZiAobWtkaXJwKGRpclswLi5zdHJyc3RyKGRpciwiLyIpLTFdKSA9PSAxKQorICAgIHJldHVybiBmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6bWtkaXIsIHByZXZpb3VzX29iamVjdCgpKSwgZGlyKTsKK30KKworCisvLyAqIFByb3BlcnRpZXMgZ2dmcy4gbWl0c3BlaWNoZXJuCittaXhlZCBzYXZlX29iamVjdChtaXhlZCBuYW1lKQoreworICBtYXBwaW5nIHByb3BlcnRpZXM7CisgIG1hcHBpbmcgc2F2ZTsKKyAgbWl4ZWQgaW5kZXgsIHJlczsKKyAgaW50IGk7CisKKyAgLy8gbnVyIFN0cmluZ3MgdW5kIDAgenVsYXNzZW4KKyAgaWYgKCghc3RyaW5ncChuYW1lKSB8fCAhc2l6ZW9mKG5hbWUpKSAmJiAKKyAgICAgICghaW50cChuYW1lKSB8fCBuYW1lIT0wKSkgeworICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoCisgICAgICAgICAiT25seSBub24tZW1wdHkgc3RyaW5ncyBhbmQgMCBtYXkgYmUgdXNlZCBhcyBmaWxlbmFtZSBpbiAiCisgICAgICAgICAic2VmdW46OnNhdmVfb2JqZWN0KCkhIEFyZ3VtZW50IHdhcyAlT1xuIixuYW1lKSk7CisgIH0KKworICBzYXZlID0gbV9hbGxvY2F0ZSgwLCAyKTsKKyAgcHJvcGVydGllcyA9IChtYXBwaW5nKXByZXZpb3VzX29iamVjdCgpLT5RdWVyeVByb3BlcnRpZXMoKTsKKworICBpZihtYXBwaW5ncChwcm9wZXJ0aWVzKSkKKyAgeworICAgIC8vIGRlbGV0ZSBhbGwgZW50cmllcyBpbiBtYXBwaW5nIHByb3BlcnRpZXMgd2l0aG91dCBTQVZFIGZsYWchCisgICAgaW5kZXggPSBtX2luZGljZXMocHJvcGVydGllcyk7CisgICAgZm9yKGkgPSBzaXplb2YoaW5kZXgpLTE7IGk+PTA7aS0tKQorICAgIHsKKyAgICAgIGlmKHByb3BlcnRpZXNbaW5kZXhbaV0sIEZfTU9ERV0gJiBTQVZFKQorICAgICAgeworICAgICAgIHNhdmVbaW5kZXhbaV1dID0gcHJvcGVydGllc1tpbmRleFtpXV07CisgICAgICAgc2F2ZVtpbmRleFtpXSwgRl9NT0RFXSA9CisgICAgICAgcHJvcGVydGllc1tpbmRleFtpXSwgRl9NT0RFXSAmCisgICAgICAgICAgICAgICAgICAgICh+KFNFVE1OT1RGT1VORHxRVUVSWU1OT1RGT1VORHxRVUVSWUNBQ0hFRHxTRVRDQUNIRUQpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZSBzYXZlID0gKFtdKTsKKworICAvLyBzYXZlIG9iamVjdCEKKyAgcHJldmlvdXNfb2JqZWN0KCktPl9zZXRfc2F2ZV9kYXRhKHNhdmUpOworICAvLyBmb3JtYXQ6IHdpZSBkZWZpbmllcnQgaW4gY29uZmlnLmgKKyAgaWYgKHN0cmluZ3AobmFtZSkpCisgICAgcmVzID0gZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46OnNhdmVfb2JqZWN0LCBwcmV2aW91c19vYmplY3QoKSksIG5hbWUsCisgICAgICAgX19MSUJfX1NBVkVfRk9STUFUX1ZFUlNJT05fXyk7CisgIGVsc2UKKyAgICByZXMgPSBmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6c2F2ZV9vYmplY3QsIHByZXZpb3VzX29iamVjdCgpKSwKKyAgICAgICBfX0xJQl9fU0FWRV9GT1JNQVRfVkVSU0lPTl9fKTsKKyAgcHJldmlvdXNfb2JqZWN0KCktPl9zZXRfc2F2ZV9kYXRhKDApOworCisjaWZkZWYgSU9TVEFUUworICAvLyBTdGF0cy4uLgorICBzdHJ1Y3QgaW9zdGF0X3Mgc3RhdCA9ICg8aW9zdGF0X3M+KTsKKyAgc3RhdC0+b25hbWUgPSBvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSk7CisgIHN0YXQtPnRpbWUgPSB0aW1lKCk7CisgIC8vc3RhdC0+c2l6ZSA9IChpbnQpb2JqZWN0X2luZm8ocHJldmlvdXNfb2JqZWN0KCksT0lORk9fTUVNT1JZLAorICAvLyAgICBPSU1fVE9UQUxfREFUQV9TSVpFKTsKKyAgaWYgKHN0cmluZ3AobmFtZSkpCisgICAgICBzdGF0LT5zaXplID0gZmlsZV9zaXplKG5hbWUgKyAiLm8iKTsKKyAgZWxzZQorICAgICAgc3RhdC0+c2l6ZW9mKHJlcyk7CisgIC8vZGVidWdfbWVzc2FnZSgic2F2ZW86ICIrc2F2ZW9fc3RhdFswXSsiXG4iKTsKKyAgc2F2ZW9fc3RhdFsxXVtzYXZlb19zdGF0WzBdXSA9IHN0YXQ7CisgIHNhdmVvX3N0YXRbMF0gPSAoc2F2ZW9fc3RhdFswXSArIDEpICUgc2l6ZW9mKHNhdmVvX3N0YXRbMV0pOworICAvL2RlYnVnX21lc3NhZ2UoInNhdmVvIDI6ICIrc2F2ZW9fc3RhdFswXSsiXG4iKTsKKyNlbmRpZgorCisgIHJldHVybiByZXM7Cit9CisKKy8vICogQXVjaCBQcm9wZXJ0aWVzIGxhZGVuCitpbnQgcmVzdG9yZV9vYmplY3Qoc3RyaW5nIG5hbWUpCit7CisgIGludCByZXN1bHQ7CisgIG1peGVkIGluZGV4OworICBtaXhlZCBzYXZlOworICBtYXBwaW5nIHByb3BlcnRpZXM7CisgIGludCBpOworICBjbG9zdXJlIGNsOworCisgIC8vIGdldCBhY3R1YWwgcHJvcGVydHkgc2V0dGluZ3MgKGJ5IGNyZWF0ZSgpKQorICBwcm9wZXJ0aWVzID0gKG1hcHBpbmcpcHJldmlvdXNfb2JqZWN0KCktPlF1ZXJ5UHJvcGVydGllcygpOworCisvLyAgREVCVUcoc3ByaW50ZigiUkVTVE9SRSAlT1xuIixuYW1lKSk7CisgIC8vIHJlc3RvcmUgb2JqZWN0CisgIHJlc3VsdD1mdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6cmVzdG9yZV9vYmplY3QsIHByZXZpb3VzX29iamVjdCgpKSwgbmFtZSk7CisgIC8vJykpCisgIC8vX2dldF9zYXZlX2RhdGEgbGllZmVydCB0YXRzYWVjaGxpY2ggbWl4ZWQgenVydWVjaywgd2VubiBkYXMgYXVjaCBpbW1lciBlaW4gCisgIC8vbWFwcGluZyBzZWluIHNvbGx0ZS4KKyAgc2F2ZSA9IChtaXhlZClwcmV2aW91c19vYmplY3QoKS0+X2dldF9zYXZlX2RhdGEoKTsKKyAgaWYobWFwcGluZ3Aoc2F2ZSkpCisgIHsKKyAgICBpbmRleCA9IG1faW5kaWNlcyhzYXZlKTsKKyAgICBmb3IoaSA9IHNpemVvZihpbmRleCktMTsgaT49MDsgaS0tKQorICAgIHsKKyAgICAgIHByb3BlcnRpZXNbaW5kZXhbaV1dID0gc2F2ZVtpbmRleFtpXV07CisgICAgICBwcm9wZXJ0aWVzW2luZGV4W2ldLCBGX01PREVdID0gc2F2ZVtpbmRleFtpXSwgRl9NT0RFXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ+KFNFVENBQ0hFRHxRVUVSWUNBQ0hFRCk7CisgICAgfQorICB9CisgIGVsc2UgcHJvcGVydGllcyA9IChbXSk7CisKKyAgLy8gcmVzdG9yZSBwcm9wZXJ0aWVzCisgIGZ1bmNhbGwoCisgICAgICAgICAgYmluZF9sYW1iZGEoCisgICAgICAgICAgICAgICAgICAgICB1bmJvdW5kX2xhbWJkYSgoeydhcmd9KSwgLy8nfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeyMnY2FsbF9vdGhlciwoeyMndGhpc19vYmplY3R9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0UHJvcGVydGllcyIsJ2FyZ30pKSwvLycpCisgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c19vYmplY3QoKSkscHJvcGVydGllcyk7CisgIHByZXZpb3VzX29iamVjdCgpLT5fc2V0X3NhdmVfZGF0YSgwKTsKKworI2lmZGVmIElPU1RBVFMKKyAgLy8gU3RhdHMuLi4KKyAgLy9kZWJ1Z19tZXNzYWdlKCJyZXN0b3JlbzogIityZXN0b3Jlb19zdGF0WzBdKyJcbiIpOworICBzdHJ1Y3QgaW9zdGF0X3Mgc3RhdCA9ICg8aW9zdGF0X3M+KTsKKyAgc3RhdC0+b25hbWUgPSBvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSk7CisgIHN0YXQtPnRpbWUgPSB0aW1lKCk7CisgIC8vc3RhdC0+c2l6ZSA9IChpbnQpb2JqZWN0X2luZm8ocHJldmlvdXNfb2JqZWN0KCksT0lORk9fTUVNT1JZLAorICAvLyAgICBPSU1fVE9UQUxfREFUQV9TSVpFKTsKKyAgc3RhdC0+c2l6ZSA9IGZpbGVfc2l6ZShuYW1lICsgIi5vIik7CisgIHJlc3RvcmVvX3N0YXRbMV1bcmVzdG9yZW9fc3RhdFswXV0gPSBzdGF0OworCisgIHJlc3RvcmVvX3N0YXRbMF0gPSAocmVzdG9yZW9fc3RhdFswXSArIDEpICUgc2l6ZW9mKHJlc3RvcmVvX3N0YXRbMV0pOworI2VuZGlmCisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gKiBIQiBlaW5lcyBPYmpla3RlcyBlaW4vYXVzc2NoYWx0ZW4KK2ludCBzZXRfb2JqZWN0X2hlYXJ0X2JlYXQob2JqZWN0IG9iLCBpbnQgZmxhZykKK3sKKyAgaWYgKG9iamVjdHAob2IpKQorICAgIHJldHVybiBmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6Y29uZmlndXJlX29iamVjdCxvYiksIG9iLCBPQ19IRUFSVF9CRUFULCBmbGFnKTsKK30KKworLy8gKiBNYWdpZXJsZXZlbGdydXBwZW4gZXJtaXR0ZWxuCitpbnQgcXVlcnlfd2l6X2dycChtaXhlZCB3aXopCit7CisgIGludCBsZXY7CisKKyAgbGV2PXF1ZXJ5X3dpel9sZXZlbCh3aXopOworICBpZiAobGV2PFNFRVJfTFZMKSByZXR1cm4gMDsKKyAgaWYgKGxldj49R09EX0xWTCkgcmV0dXJuIGxldjsKKyAgaWYgKGxldj49QVJDSF9MVkwpIHJldHVybiBBUkNIX0dSUDsKKyAgaWYgKGxldj49RUxERVJfTFZMKSByZXR1cm4gRUxERVJfR1JQOworICBpZiAobGV2Pj1MT1JEX0xWTCkgcmV0dXJuIExPUkRfR1JQOworICBpZiAobGV2Pj1TUEVDSUFMX0xWTCkgcmV0dXJuIFNQRUNJQUxfR1JQOworICBpZiAobGV2Pj1ET01BSU5NRU1CRVJfTFZMKSByZXR1cm4gRE9NQUlOTUVNQkVSX0dSUDsKKyAgaWYgKGxldj49V0laQVJEX0xWTCkgcmV0dXJuIFdJWkFSRF9HUlA7CisgIGlmIChsZXY+PUxFQVJORVJfTFZMKSByZXR1cm4gTEVBUk5FUl9HUlA7CisgIHJldHVybiBTRUVSX0dSUDsKK30KKworbWl4ZWQgKndpemxpc3RfaW5mbygpCit7CisgIGlmIChBUkNIX1NFQ1VSSVRZIHx8ICFleHRlcm5fY2FsbCgpKQorICAgICAgICAgICAgcmV0dXJuIGVmdW46Ondpemxpc3RfaW5mbygpOworICByZXR1cm4gMDsKK30KKworLy8gKiB3aXpsaXN0IGF1c2dlYmVuCit2YXJhcmdzIHZvaWQgd2l6bGlzdChzdHJpbmcgbmFtZSwgaW50IHNvcnRrZXkgKSB7CisKKyAgaWYgKCFuYW1lKQorICB7CisgICAgaWYgKHRoaXNfcGxheWVyKCkpCisgICAgICBuYW1lID0gZ2V0dWlkKHRoaXNfcGxheWVyKCkpOworICAgIGlmICghbmFtZSkKKyAgICAgIHJldHVybjsKKyAgfQorCisgIC8vIFNjaGx1ZXNzZWwgZGFyZiBudXIgaW4gZWluZW0gZ3VlbHRpZ2VuIEJlcmVpY2ggc2VpbgorICBpZiAoc29ydGtleTxXTF9OQU1FIHx8IHNvcnRrZXk+PVdMX1NJWkUpIHNvcnRrZXk9V0xfQ09TVDsKKworICBtaXhlZCoqIHdsID0gZWZ1bjo6d2l6bGlzdF9pbmZvKCk7CisgIC8vIG5hY2ggPHNvcnRrZXk+IHNvcnRpZXJlbgorICB3bCA9IHNvcnRfYXJyYXkod2wsIGZ1bmN0aW9uIGludCAobWl4ZWQgYSwgbWl4ZWQgYikKKyAgICAgIHtyZXR1cm4gYVtzb3J0a2V5XSA8IGJbc29ydGtleV07IH0gKTsKKworICAvLyBTdW1tZSB1ZWJlciBhbGxlIEtvbW1hbmRvcyBlcm1pdHRlbG4uCisgIGludCB0b3RhbF9jbWQsIGk7CisgIGludCBwb3M9LTE7CisgIGZvcmVhY2gobWl4ZWQgZW50cnkgOiB3bCkKKyAgeworICAgIHRvdGFsX2NtZCArPSBlbnRyeVtXTF9DT01NQU5EU107CisgICAgaWYgKGVudHJ5W1dMX05BTUVdID09IG5hbWUpCisgICAgICBwb3MgPSBpOworICAgICsraTsKKyAgfQorCisgIGlmIChwb3MgPCAwICYmIG5hbWUgIT0gIkFMTCIgJiYgbmFtZSAhPSAiVE9QMTAwIikKKyAgICByZXR1cm47CisKKyAgaWYgKG5hbWUgPT0gIlRPUDEwMCIpCisgIHsKKyAgICBpZiAoc2l6ZW9mKHdsKSA+IDEwMCkKKyAgICAgIHdsID0gd2xbMC4uMTAwXTsKKyAgICBlbHNlCisgICAgICB3bCA9IHdsOworICB9CisgIC8vIHVtIG5hbWUgaGVydW0gc2NobmVpZGVuCisgIGVsc2UgaWYgKG5hbWUgIT0gIkFMTCIpCisgIHsKKyAgICBpZiAoc2l6ZW9mKHdsKSA8PSAyMSkKKyAgICAgIHdsID0gd2w7CisgICAgZWxzZSBpZiAocG9zICsgMTAgPCBzaXplb2Yod2wpICYmIHBvcyAtIDEwID4gMCkKKyAgICAgIHdsID0gd2xbcG9zLTEwLi5wb3MrMTBdOworICAgIGVsc2UgaWYgKHBvcyA8PTIxKQorICAgICAgd2wgPSB3bFswLi4yMF07CisgICAgZWxzZSBpZiAocG9zID49IHNpemVvZih3bCkgLSAyMSkKKyAgICAgIHdsID0gd2xbPDIxLi5dOworICAgIGVsc2UKKyAgICAgIHdsID0gd2w7CisgIH0KKworICB3cml0ZSgiXG5XaXphcmQgdG9wIHNjb3JlIGxpc3RcblxuIik7CisgIGlmICh0b3RhbF9jbWQgPT0gMCkKKyAgICB0b3RhbF9jbWQgPSAxOworICBwcmludGYoIiUtMjBzICUtNnMgJS0zcyAlLTE3cyAlLTZzICUtNnMgJS02c1xuIiwKKyAgICAgICAgICJFVUlEIiwgImNtZHMiLCAiJSIsICJDb3N0cyIsICJIQiIsICJBcnJheXMiLCJNYXBwLiIpOworICBmb3JlYWNoKG1peGVkIGU6IHdsKQorICB7CisgICAgcHJpbnRmKCIlLToyMHMgJTo2ZCAlOjJkJSUgWyU6NmRrLCU6NmRHXSAlOjZkICU6NmQgJTo2ZFxuIiwKKyAgICAgICAgICBlW1dMX05BTUVdLCBlW1dMX0NPTU1BTkRTXSwgZVtXTF9DT01NQU5EU10gKiAxMDAgLyB0b3RhbF9jbWQsCisgICAgICAgICAgZVtXTF9DT1NUXSAvIDEwMDAsIGVbV0xfVE9UQUxfR0lHQUNPU1RdLAorICAgICAgICAgIGVbV0xfSEVBUlRfQkVBVFNdLCBlW1dMX0FSUkFZX1RPVEFMXSwgZVtXTF9NQVBQSU5HX1RPVEFMXQorICAgICAgICAgICk7CisgIH0KKyAgcHJpbnRmKCJcblRvdGFsICAgICAgICAgJTdkICAgICAgICAgKCVkKVxuXG4iLCB0b3RhbF9jbWQsIHNpemVvZih3bCkpOworfQorCisKKy8vIEFiIGhpZXIgZm9sZ2VuIEhpbGZzZnVua3Rpb25lbiBmdWVyIGNhbGxfb3V0KCkgYnp3LiBmdWVyIGRlcmVuIEJlZ3Jlbnp1bmcKKworLy8gZXJtaXR0ZWx0IGRhcyBPYmpla3QgZGVzIENhbGxvdXRzLgorcHJpdmF0ZSBvYmplY3QgX2NhbGxfb3V0X29iaiggbWl4ZWQgY2FsbF9vdXQgKSB7CisgICAgcmV0dXJuIHBvaW50ZXJwKGNhbGxfb3V0KSA/IGNhbGxfb3V0WzBdIDogMDsKK30KKworcHJpdmF0ZSB2b2lkIF9zYW1lX29iamVjdCggb2JqZWN0IG9iLCBtYXBwaW5nIG0gKSB7CisgIC8vIGlzdCBuaWNodCBzbyBibG9lZCwgd2llIGVzIGF1c3NpZWh0LCBzLiBuYWNoZm9sZ2VkZSBWZXJ3ZW5kdW5nIHZvbiBtCisgIGlmICggbVtvYl0gKQorICAgIG1bb2JdICs9ICh7IG9iIH0pOworICBlbHNlCisgICAgbVtvYl0gPSAoeyBvYiB9KTsgCit9CisKKy8vIGFsbGUgT2JqZWt0ZSBpbSBNYXBwaW5nIG0genVzYW1tZW5mYXNzZW4sIGRpZSBkZW4gZ2xlaWNoZW4gTG9hZG5hbWUgKE5hbWUgZGVyCisvLyBCbHVlcHJpbnQpIGhhYmVuLCBhbHNvIGFsbGUgQ2xvbmVzIGRlciBCUCwgZGllIENhbGxvdXRzIGxhdWZlbiBoYWJlbi4KKy8vIE9iamVrdGUgd2VyZGVuIGF1Y2ggbWVocmZhY2ggZXJmYXNzdCwgamUgbmFjaCBBbnphaGwgaWhyZXIgQ2FsbG91dHMuCitwcml2YXRlIHZvaWQgX3NhbWVfcGF0aCggb2JqZWN0IGtleSwgb2JqZWN0ICpvYnMsIG1hcHBpbmcgbSApIHsKKyAgc3RyaW5nIHBhdGg7CisgIGlmICghb2JqZWN0cChrZXkpIHx8ICFwb2ludGVycChvYnMpKSByZXR1cm47CisKKyAgcGF0aCA9IGxvYWRfbmFtZShrZXkpOworCisgIGlmICggbVtwYXRoXSApCisgICAgbVtwYXRoXSArPSBvYnM7CisgIGVsc2UKKyAgICBtW3BhdGhdID0gb2JzOworfQorCisvLyBrZXkga2FubiBvYmplY3Qgb2RlciBzdHJpbmcgc2Vpbi4KK3ByaXZhdGUgaW50IF90b29fbWFueSggbWl4ZWQga2V5LCBtYXBwaW5nIG0sIGludCBpICkgeworICAgIHJldHVybiBzaXplb2YobVtrZXldKSA+PSBpOworfQorCisvLyBhbGxlIE9iamVrdGUgaW4gb2JzIHplcnN0b2VyZW4gdW5kIEZlaGxlcm1lbGR1bmcgYXVzZ2ViZW4uIEFDSFRVTkc6IERpZQorLy8gT2JqZWt0ZSB3ZXJkZW4gaWRSIHp1IGVpbmVyIEJQIGdlaG9lcmVuLCBtdWVzc2VuIGFiZXIgbmljaHQhIEluIGRlbSBGYWxsCisvLyB3aXJkIGF1ZiBkZXIgRWJlbmUgYWJlciBudXIgZWluIE9iamVrdCBpbiBkZXIgRmVobGVybWVsZHVuZyBlcndhZWhudC4KK3ByaXZhdGUgdm9pZCBfZGVzdHJveSggbWl4ZWQga2V5LCBvYmplY3QgKm9icywgc3RyaW5nIHRleHQsIGludCB1aWQgKSB7CisgICAgaWYgKCFwb2ludGVycChvYnMpKSByZXR1cm47CisgICAgLy8gQXJyYXkgbWl0IHVuaXF1ZSBFaW50cmFlZ2UgZXJ6ZXVnZW4uCisgICAgb2JzID0gbV9pbmRpY2VzKCBta21hcHBpbmcob2JzKSApOworICAgIC8vIEZlaGxlcm1lbGR1bmcgYXVmIGRlciBFYmVuZSBhdXNnZWJlbiwgaW0gY2F0Y2goKSBtaXQgcHVibGlzaCwgZGFtaXQgZXMKKyAgICAvLyBhdWYgZGVyIEViZW5lIGRpcmVrdCBzY3JvbGx0LCBkZXIgYmFja3RyYWNlIHZlcmZ1ZWdiYXIgaXN0IChpbQorICAgIC8vIGdlZ2Vuc2F0eiB6dXIgTG9lc3VuZyBtaXR0ZWxzIENhbGxvdXQpLCBkaWUgQXVzZnVlaHJ1bmcgYWJlciB3ZWl0ZXIKKyAgICAvLyBsYWV1ZnQuCisgICAgY2F0Y2goIGVmdW46OnJhaXNlX2Vycm9yKCAgICAgICAgICAgCisgICAgICAgICBzcHJpbnRmKCB0ZXh0LCAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgdWlkID8gKHN0cmluZyltYXN0ZXIoKS0+Y3JlYXRvcl9maWxlKGtleSkgOiBrZXksICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICBzaXplb2Yob2JzKSwgb2JqZWN0X25hbWUob2JzWzwxXSkgKSApO3B1Ymxpc2gpOworICAgIC8vIFVuZCB3ZWcgbWl0IGRlbSBLcmFtLi4uCisgICAgZmlsdGVyKCBvYnMsICMnZWZ1bjo6ZGVzdHJ1Y3QvKicqLyApOworfQorCisvLyBBbGxlIE9iamVrdCBlaW5lciBVSUQgaW0gTWFwcGluZyBtIG1pdCBVSUQgYWxzIEtFeXMgenVzYW1tZW5mYXNzZW4uIE9iamVrdAorLy8gc2luZCBkYWJlaSBuaWNodCB1bmlxdWUuCitwcml2YXRlIHZvaWQgX3NhbWVfdWlkKCBzdHJpbmcga2V5LCBvYmplY3QgKm9icywgbWFwcGluZyBtLCBjbG9zdXJlIGNmICkgeworICBzdHJpbmcgdWlkOworCisgIGlmICggIXBvaW50ZXJwKG9icykgfHwgIXNpemVvZihvYnMpICkKKyAgICByZXR1cm47CisKKyAgdWlkID0gZnVuY2FsbCggY2YsIGtleSApOworCisgIGlmICggbVt1aWRdICkKKyAgICBtW3VpZF0gKz0gb2JzOyAvLyBvYnMgaXN0IG5lbiBBcnJheQorICBlbHNlCisgICAgbVt1aWRdID0gb2JzOworfQorCitwcml2YXRlIGludCBfbG9nX2NhbGxfb3V0KG1peGVkIGNvKQoreworICBsb2dfZmlsZSgiVE9PX01BTllfQ0FMTE9VVFMiLAorICAgICAgc3ByaW50ZigiJXM6OiVPICglZClcbiIsb2JqZWN0X25hbWUoY29bMF0pLGNvWzFdLGNvWzJdKSwKKyAgICAgIDIwMDAwMCk7CisgIHJldHVybiAwOworfQorCitwcml2YXRlIGludCBsYXN0X2NhbGxvdXRfbG9nPTA7CisKK25vbWFzayB2YXJhcmdzIHZvaWQgY2FsbF9vdXQoIHZhcmFyZ3MgbWl4ZWQgKmFyZ3MgKQoreworICAgIG1peGVkIHRtcCwgKmNhbGxfb3V0czsKKworICAgIC8vIEJlaSA+NjAwIENhbGxvdXRzIGFsbGUgT2JqZWt0ZSBraWxsZW4sIGRpZSBtZWhyIGFscyAzMCBDYWxsb3V0cyBsYXVmZW4KKyAgICAvLyBoYWJlbi4KKyAgICBpZiAoIGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9DQUxMT1VUUykgPiA2MDAKKyAgICAgICAgJiYgZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSkgIT0gUk9PVElEICkKKyAgICB7CisgICAgICAgLy8gTG9nIGVyemV1Z2VuLi4uCisgICAgICAgaWYgKGxhc3RfY2FsbG91dF9sb2cgPAorICAgICAgICAgICBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSEVBUlRCRUFUX1RPVEFMX0NZQ0xFUykgLSAxMAorICAgICAgICAgICAmJiBnZXRfZXZhbF9jb3N0KCkgPiAyMDAwMDApCisgICAgICAgeworICAgICAgICAgbGFzdF9jYWxsb3V0X2xvZyA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9IRUFSVEJFQVRfVE9UQUxfQ1lDTEVTKTsKKyAgICAgICAgIGxvZ19maWxlKCJUT09fTUFOWV9DQUxMT1VUUyIsCisgICAgICAgICAgICAgc3ByaW50ZigiXG4lczogIyMjIyMjIyMjIyMjIFRvbyBtYW55IGNhbGxvdXRzOiAlZCAjIyMjIyMjIyMjIyMjI1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIHN0cmZ0aW1lKCIleSVtJWQtJUglTSVTIiksCisgICAgICAgICAgICAgICAgICAgICBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fQ0FMTE9VVFMpKSk7CisgICAgICAgICBmaWx0ZXIoZWZ1bjo6Y2FsbF9vdXRfaW5mbygpLCAjJ19sb2dfY2FsbF9vdXQpOworICAgICAgIH0KKyAgICAgICAvLyBPYmpla3RlIGFsbGVyIENhbGxvdXRzIGVybWl0dGVsbgorICAgICAgIGNhbGxfb3V0cyA9IG1hcCggZWZ1bjo6Y2FsbF9vdXRfaW5mbygpLCAjJ19jYWxsX291dF9vYmogKTsKKyAgICAgICBtYXBwaW5nIG9iamVjdG1hcCA9IChbXSk7CisgICAgICAgZmlsdGVyKCBjYWxsX291dHMsICMnX3NhbWVfb2JqZWN0LCAmb2JqZWN0bWFwICk7CisgICAgICAgLy8gTWFzdGVyIG5pY2h0IGdyaWxsZW4uLi4KKyAgICAgICBlZnVuOjptX2RlbGV0ZSggb2JqZWN0bWFwLCBtYXN0ZXIoMSkgKTsKKyAgICAgICAvLyBhbGxlIE9iamVrdGUgcmF1c3N1Y2hlbiwgZGllIHp1dmllbGUgaGFiZW4uLi4KKyAgICAgICBtYXBwaW5nIHJlcyA9IGZpbHRlcl9pbmRpY2VzKCBvYmplY3RtYXAsICMnX3Rvb19tYW55LCBvYmplY3RtYXAsIDI5ICk7CisgICAgICAgLy8gdW5kIHVlYmVyIGFsbGUgS2V5cyBnZWhlbiwgYW4gX2Rlc3Ryb3koKSB3ZXJkZW4gS2V5IHVuZCBBcnJheSBtaXQKKyAgICAgICAvLyBPYmpla3RlbiB1ZWJlcmdlYmVuIChpbiBkaWVzZW0gRmFsbCBzaW5kIEtleXMgdW5kIEFycmF5IG1pdAorICAgICAgIC8vIE9iamVrdGVuIGpld2VpbHMgZGFzIGdsZWljaGUgT2JqZWt0KS4KKyAgICAgICBpZiAoIHNpemVvZihyZXMpICkgICAgICAgCisgICAgICAgICAgIHdhbGtfbWFwcGluZyhyZXMsICMnX2Rlc3Ryb3ksICJDQUxMX09VVCBvdmVyZmxvdyBieSBzaW5nbGUgIiAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIm9iamVjdCBbJU9dLiBEZXN0cnVjdGVkICVkIG9iamVjdHMuIFslc11cbiIsIDAgKTsKKworICAgICAgIC8vIEJlaSAoYXVjaCBuYWNoIGRlbSBlcnN0ZW4gQXVmcmFldW1lbiBub2NoKSA+ODAwIENhbGxvdXRzIGFsbGUKKyAgICAgICAvLyBPYmpla3RlIGtpbGxlbiwgZGllIG1laHIgYWxzIDUwIENhbGxvdXRzIGxhdWZlbiBoYWJlbiAtIHVuZAorICAgICAgIC8vIGRpZXNtYWwgemFlaGxlbiBDbG9uZXMgbmljaHQgZWlnZW5zdGFlbmRpZyEgRC5oLiBlcyB3ZXJkZW4gYWxsZQorICAgICAgIC8vIENsb25lcyBlaW5lciBCUCBnZWtpbGx0LCBkaWUgQ2FsbG91dHMgbGF1ZmVuIGhhYmVuLCBmYWxscyBhbGxlCisgICAgICAgLy8gZGllc2UgT2JqZWt0ZSBfenVzYW1tZW5fIG1laHIgYWxzIDUwIENhbGxvdXRzIGhhYmVuIQorICAgICAgIGlmICggZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0NBTExPVVRTKSA+IDgwMCApIHsKKyAgICAgICAgICAgLy8gemVyc3RvZXJ0ZSBPYmpla3RlIHZvbiBkZXIgbGV0enRlbiBBa3Rpb24gc2luZCBpbiBvYmplY3RtYXAgbmljaHQKKyAgICAgICAgICAgLy8gbWVociBkcmluLCBkYSBzaWUgZG9ydCBhbHMgS2V5cyB2ZXJ3ZW5kZXQgd3VyZGVuLgorICAgICAgICAgICBtYXBwaW5nIHBhdGhtYXA9KFtdKTsKKyAgICAgICAgICAgLy8gYWxsZSBPYmpla3QgZWluZXIgQlAgaW4gcmVzIHNvcnRpZXJlbiwgQlAtTmFtZSBhbHMgS2V5LCBBcnJheXMKKyAgICAgICAgICAgLy8gdm9uIE9iamVrdGVuIGFscyBXZXJ0ZS4KKyAgICAgICAgICAgd2Fsa19tYXBwaW5nKCBvYmplY3RtYXAsICMnX3NhbWVfcGF0aCwgJnBhdGhtYXApOworICAgICAgICAgICAvLyBhbGxlIEJQcyAodW5kIGlocmUgT2JqZWt0ZSkgcmF1c3N1Y2hlbiwgZGllIHp1dmllbGUgaGFiZW4uLi4KKyAgICAgICAgICAgcmVzID0gZmlsdGVyX2luZGljZXMoIHBhdGhtYXAsICMnX3Rvb19tYW55LyonKi8sIHBhdGhtYXAsIDUwICk7CisgICAgICAgICAgIC8vIHVuZCB1ZWJlciBhbGxlIEtleXMgZ2VoZW4sIGFuIF9kZXN0cm95KCkgd2VyZGVuIGRpZSBDbG9uZXMKKyAgICAgICAgICAgLy8gdWViZXJnZWJlbiwgZGllIENhbGxvdXRzIGhhYmVuLgorICAgICAgICAgICBpZiAoIHNpemVvZihyZXMpICkKKyAgICAgICAgICAgICAgd2Fsa19tYXBwaW5nKCByZXMsICMnX2Rlc3Ryb3kvKicqLywgIkNBTExfT1VUIG92ZXJmbG93IGJ5IGZpbGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiclcycuIERlc3RydWN0ZWQgJWQgb2JqZWN0cy4gWyVzXVxuIiwgMCApOworCisgICAgICAgICAgIC8vIFdlbm4gYmVpZGUgQXVmcmFldW1hcmJlaXRlbiBuaWNodHMgZ2VicmFjaHQgaGFiZW4gdW5kIGltbWVyCisgICAgICAgICAgIC8vIG5vY2ggPjEwMDAgQ2FsbG91dHMgbGF1ZmVuLCB3ZXJkZW4gZGllc21hbCBhbGxlIENhbGxvdXRzCisgICAgICAgICAgIC8vIGVpbmVyIFVJRCB6dXNhbW1lbmdlemFlaGx0LgorICAgICAgICAgICAvLyBBbGxlIE9iamVrdGUgZWluZXIgVUlELCBkaWUgZXMgaW4gU3VtbWUgYWxsZXIgaWhyZXIgT2JqZWt0IG1pdAorICAgICAgICAgICAvLyBDYWxsb3V0cyBhdWYgbWVociBhbHMgMTAwIENhbGxvdXRzIGJyaW5ndCwgd2VyZGVuIGdlcm9lc3RldC4KKyAgICAgICAgICAgaWYgKGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9DQUxMT1VUUykgPiAxMDAwKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8vIGRhcyBuYWNoIEJQLU5hbWVuIHZvcmdlZmlsdGVydGUgTWFwcGluZyBqZXR6dCBuYWNoIFVJRHMKKyAgICAgICAgICAgICAgLy8genVzYW1tZW5zb3J0aWVyZW4uIFplcnN0b2VydGUgQ2xvbmVzIGZpbHRlciBfc2FtZV91aWQoKQorICAgICAgICAgICAgICAvLyByYXVzLgorICAgICAgICAgICAgICBtYXBwaW5nIHVpZG1hcD0oW10pOworICAgICAgICAgICAgICB3YWxrX21hcHBpbmcoIHBhdGhtYXAsICMnX3NhbWVfdWlkLCAmdWlkbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sX2Z1bmN0aW9uKCAiY3JlYXRvcl9maWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvc2VjdXJlL21hc3RlciIgKSApOworICAgICAgICAgICAgICAvLyBJbiByZXMgbnVuIFVJRHMgYWxzIEtleXMgdW5kIEFycmF5cyB2b24gT2JqZWt0ZW4gYWxzIFdlcnRlLgorICAgICAgICAgICAgICAvLyBEaWUgcmF1c2ZpbHRlcm4sIGRpZSBtZWhyIGFscyAxMDAgT2JqZWt0ZSAobm9uLXVuaXF1ZSwgZC5oLgorICAgICAgICAgICAgICAvLyAxMDAgQ2FsbG91dHMhKSBoYWJlbi4KKyAgICAgICAgICAgICAgcmVzID0gZmlsdGVyX2luZGljZXMoIHVpZG1hcCwgIydfdG9vX21hbnksIHVpZG1hcCwgMTAwICk7CisgICAgICAgICAgICAgIC8vIHVuZCBlcm5ldXQgdWViZXIgZGllIEtleXMgbGF1ZmVuIHVuZCBqZXdlaWxzIGRpZSBBcnJheXMgbWl0CisgICAgICAgICAgICAgIC8vIGRlbiBPYmpla3RlbiB6dXIgWmVyc3RvZXJ1bmcgYW4gX2Rlc3Ryb3koKS4uLgorICAgICAgICAgICAgICBpZiAoIHNpemVvZihyZXMpICkKKyAgICAgICAgICAgICAgICAgIHdhbGtfbWFwcGluZyggcmVzLCAjJ19kZXN0cm95LCAiQ0FMTF9PVVQgb3ZlcmZsb3cgYnkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVJRCAnJXMnLiBEZXN0cnVjdGVkICVkIG9iamVjdHMuIFslc11cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICk7CisgICAgICAgICAgIH0KKyAgICAgICB9CisgICAgfQorCisgICAgLy8gRmFsbHMgZGFzIGF1ZnJ1ZmVuZGUgT2JqZWt0IHplcnN0b2VydCB3dXJkZSBiZWltIEF1ZnJhZXVtZW4KKyAgICBpZiAoICFwcmV2aW91c19vYmplY3QoKSApCisgICAgICAgcmV0dXJuOworCisgICAgc2V0X3RoaXNfb2JqZWN0KCBwcmV2aW91c19vYmplY3QoKSApOworICAgIGFwcGx5KCAjJ2VmdW46OmNhbGxfb3V0LCBhcmdzICk7CisgICAgcmV0dXJuOworfQorCittaXhlZCBjYWxsX291dF9pbmZvKCkgeworICAKKyAgb2JqZWN0IHBvID0gcHJldmlvdXNfb2JqZWN0KCk7CisgIG1peGVkIGNvaSA9IGVmdW46OmNhbGxfb3V0X2luZm8oKTsKKworICAvLyB1bmdlZmlsdGVydGVuIE91dHB1dCBudXIgZnVlciBiZXN0aW1tdGUgT2JqZWt0ZSwgT2JqZWt0ZSBpbiAvc3RkIG9kZXIKKyAgLy8gL29iaiBoYWJlbiBkaWUgQmFja2JvbmVJRC4KKyAgaWYgKHF1ZXJ5X3dpel9sZXZlbChnZXR1aWQocG8pKSA+PSBBUkNIX0xWTAorICAgICAgIHx8IChzdHJpbmcpbWFzdGVyKCktPmNyZWF0b3JfZmlsZShsb2FkX25hbWUocG8pKSA9PSBCQUNLQk9ORUlEICkgeworICAgICAgcmV0dXJuIGNvaTsKKyAgfQorICBlbHNlIHsKKyAgICAgIHJldHVybiBmaWx0ZXIoY29pLCBmdW5jdGlvbiBtaXhlZCAobWl4ZWQgYXJyKSB7CisgICAgICAgICAgICAgIGlmIChwb2ludGVycChhcnIpICYmIGFyclswXT09cG8pCisgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICBlbHNlIHJldHVybiAwOyB9KTsKKyAgfQorfQorCisvLyAqIFp1IGVpbmVyIGNsb3N1cmUgZGFzIE9iamVrdCwgYW4gZGFzIHNpZSBnZWJ1bmRlbiBpc3QsIHN1Y2hlbgorLy8gTklDSFQgZGFzIE9iamVrdCwgd2FzIGdnZi4gZGllIGxmdW4gZGVmaW5pZXJ0IQorbWl4ZWQgcXVlcnlfY2xvc3VyZV9vYmplY3QoY2xvc3VyZSBjKSB7CisgIHJldHVybgorICAgIENMT1NVUkVfSVNfVU5CT1VORF9MQU1CREEoZ2V0X3R5cGVfaW5mbyhjLCAxKSkgPworICAgICAgMCA6CisgICh0b19vYmplY3QoYykgfHwgLTEpOworfQorCisvLyAqIFdpciB3b2xsZW4gbnVyIEVJTiBBcmd1bWVudCAuLi4gYXVzc2VyZGVtIGNoZWNrcyBmdWVyIGRlbiBOZXR6dG90ZW5yYXVtCit2YXJhcmdzIHZvaWQgbW92ZV9vYmplY3QobWl4ZWQgd2hhdCwgbWl4ZWQgd2hlcmUpCit7CisgIG9iamVjdCBwbyx0bXA7CisKKyAgcG89cHJldmlvdXNfb2JqZWN0KCk7CisgIGlmICghd2hlcmUpCisgIHsKKyAgICB3aGVyZT13aGF0OworICAgIHdoYXQ9cG87CisgIH0KKyAgaWYgKCgoc3RyaW5ncCh3aGVyZSkgJiYgd2hlcmU9PU5FVERFQURfUk9PTSApIHx8CisgICAgICAgKG9iamVjdHAod2hlcmUpICYmIHdoZXJlPT1maW5kX29iamVjdChORVRERUFEX1JPT00pKSkgJiYKKyAgICAgICBvYmplY3RwKHdoYXQpICYmIG9iamVjdF9uYW1lKHdoYXQpIT0iL29iai9zcGVycmVyIikKKyAgeworICAgIGlmICghcXVlcnlfb25jZV9pbnRlcmFjdGl2ZSh3aGF0KSkKKyAgICB7CisgICAgICB3aGF0LT5yZW1vdmUoKTsKKyAgICAgIGlmICh3aGF0KSBkZXN0cnVjdCh3aGF0KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGxpdmluZyh3aGF0KSB8fCBpbnRlcmFjdGl2ZSh3aGF0KSkKKyAgICB7CisgICAgICBsb2dfZmlsZSgiTkRFQUQyIixzcHJpbnRmKCJUUllFRCBUTyBNT1ZFIFRPIE5FVERFQUQ6ICVPXG4iLHdoYXQpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2V0X29iamVjdF9oZWFydF9iZWF0KHdoYXQsMCk7CisgIH0KKyAgdG1wPXdoYXQ7CisgIHdoaWxlICh0bXA9ZW52aXJvbm1lbnQodG1wKSkKKyAgICAgIC8vIEphLiBNYW4gcnVmdCBkaWUgX3NldF94eHgoKS1GdW5rdGlvbmVuIGVpZ2VudGxpY2ggbmljaHQgZGlyZWt0IGF1Zi4KKyAgICAgIC8vIEFiZXIgZGFzIExpY2h0c3lzdGVtIGlzdCBzY2hvbiAqc28qIHJlY2hlbmludGVuc2l2IHVuZCBnZXJhZGUgZGVyCisgICAgICAvLyBQX0xBU1RfQ09OVEVOVF9DSEFOR0UtQ2FjaGUgd2lyZCAqc28qIG9mdCBiZW5vZXRpZ3QsIGRhc3MgZXMgbWlyCisgICAgICAvLyBkYSB1bSBqZWRlcyBiaXNzY2hlbiBSZWNoZW56ZWl0IGdlaHQuCisgICAgICAvLyBEZXIgWndlY2sgaGVpbGlndCBqYSBiZWthbm50bGljaCBkaWUgTWl0dGVsLiA7LSkKKyAgICAgIC8vCisgICAgICAvLyBUaWFtYWsKKyAgICB0bXAtPl9zZXRfbGFzdF9jb250ZW50X2NoYW5nZSgpOworICBmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6bW92ZV9vYmplY3QscG8pLHdoYXQsd2hlcmUpOworICBpZiAodG1wPXdoYXQpCisgICAgd2hpbGUgKHRtcD1lbnZpcm9ubWVudCh0bXApKQorICAgICAgdG1wLT5fc2V0X2xhc3RfY29udGVudF9jaGFuZ2UoKTsKK30KKworCit2b2lkIHN0YXJ0X3NpbXVsX2VmdW4oKSB7CisgIG1peGVkICppbmZvOworCisgIC8vIEZhbGxzIG5vY2ggbmljaHQgZ2V0YW4sIGV4dHJhX3dpemluZm8gaW5pdGlhbGlzaWVyZW4KKyAgaWYgKCAhcG9pbnRlcnAoaW5mbyA9IGdldF9leHRyYV93aXppbmZvKDApKSApCisgICAgc2V0X2V4dHJhX3dpemluZm8oMCwgaW5mbyA9IGFsbG9jYXRlKEJBQ0tCT05FX1dJWklORk9fU0laRSkpOworCisgIEluaXRMaXZpbmdEYXRhKGluZm8pOworCisgIHNldF9uZXh0X3Jlc2V0KDEwKTsgLy8gZGlyZWt0IG1hbCBhdWZyYWV1bWVuCit9CisKK3Byb3RlY3RlZCB2b2lkIHJlc2V0KCkgeworICBzZXRfbmV4dF9yZXNldCg3MjAwKTsKKyAgQ2xlYW5MaXZpbmdEYXRhKCk7Cit9CisKKyNpZiAhX19FRlVOX0RFRklORURfXyhhYnNvbHV0ZV9oYl9jb3VudCkKK2ludCBhYnNvbHV0ZV9oYl9jb3VudCgpIHsKKyAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9IRUFSVEJFQVRfVE9UQUxfQ1lDTEVTKTsKK30KKyNlbmRpZgorCit2b2lkIF9fc2V0X2Vudmlyb25tZW50KG9iamVjdCBvYiwgbWl4ZWQgdGFyZ2V0KQoreworICBzdHJpbmcgcGF0aDsKKyAgb2JqZWN0IG9iajsKKworICBpZiAoIW9iamVjdHAob2IpKQorICAgIHJldHVybjsKKyAgaWYgKCFJU19BUkNIKGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpKSB8fCAhQVJDSF9TRUNVUklUWSApCisgICAgcmV0dXJuOworICBpZiAob2JqZWN0cCh0YXJnZXQpKQorICB7CisgICAgZWZ1bjo6c2V0X2Vudmlyb25tZW50KG9iLHRhcmdldCk7CisgICAgcmV0dXJuOworICB9CisgIHBhdGg9KHN0cmluZylNQVNURVItPl9nZXRfcGF0aCh0YXJnZXQsdGhpc19pbnRlcmFjdGl2ZSgpKTsKKyAgaWYgKHN0cmluZ3AocGF0aCkgJiYgZmlsZV9zaXplKHBhdGgrIi5jIik+PTAgJiYKKyAgICAgICFjYXRjaChsb2FkX29iamVjdChwYXRoKTtwdWJsaXNoKSApCisgIHsKKyAgICBvYmo9ZmluZF9vYmplY3QocGF0aCk7CisgICAgZWZ1bjo6c2V0X2Vudmlyb25tZW50KG9iLG9iaik7CisgICAgcmV0dXJuOworICB9Cit9CisKK3ZvaWQgX2R1bXBfd2l6bGlzdChzdHJpbmcgZmlsZSwgaW50IHNvcnRieSkgeworICBpbnQgaTsKKyAgbWl4ZWQgKmE7CisKKyAgaWYgKCFMT1JEX1NFQ1VSSVRZKQorICAgIHJldHVybjsKKyAgaWYgKCFtYXN0ZXIoKS0+dmFsaWRfd3JpdGUoZmlsZSxnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSwid3JpdGVfZmlsZSIpKQorICB7CisgICAgd3JpdGUoIk5PIFdSSVRFIFBFUk1JU1NJT05cbiIpOworICAgIHJldHVybjsKKyAgfQorICBhID0gd2l6bGlzdF9pbmZvKCk7CisgIGEgPSBzb3J0X2FycmF5KGEsIGxhbWJkYSggKHsnYSwnYn0pLAorICAgICAgICAgICAgICAgICAgICAgICAgKHsjJzwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh7IydbLCdhLHNvcnRieX0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoeyMnWywnYixzb3J0Ynl9KQorICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSk7CisgIHJtKGZpbGUpOworICBmb3IgKGk9c2l6ZW9mKGEpLTE7aT49MDtpLS0pCisgICAgd3JpdGVfZmlsZShmaWxlLHNwcmludGYoIiUtMTFzOiBldmFsPSUtOGQgY21kcz0lLTZkIEhCcz0lLTVkIGFycmF5PSUtNWQgbWFwcGluZz0lLTdkXG4iLAorICAgICAgYVtpXVtXTF9OQU1FXSxhW2ldW1dMX1RPVEFMX0NPU1RdLGFbaV1bV0xfQ09NTUFORFNdLGFbaV1bV0xfSEVBUlRfQkVBVFNdLAorICAgICAgYVtpXVtXTF9BUlJBWV9UT1RBTF0sYVtpXVtXTF9DQUxMX09VVF0pKTsKK30KKworcHVibGljIHZhcmFyZ3Mgb2JqZWN0IGRlZXBfcHJlc2VudChtaXhlZCB3aGF0LCBvYmplY3Qgb2IpIHsKKworICBpZighb2JqZWN0cChvYikpCisgICAgb2I9cHJldmlvdXNfb2JqZWN0KCk7CisgIC8vIFdlbm4gZWluIE9iamVrdCBnZXN1Y2h0IHdpcmQ6IEFsbGUgRW52cyBkaWVzZXMgT2JqZWt0cyBlcm1pdHRlbG4gdW5kCisgIC8vIHNjaGF1ZW4sIG9iIGluIGRpZXNlbiBvYiB2b3Jrb21tdC4gRGFubiBpc3Qgd2hhdCBpbiBvYiBlbnRoYWx0ZW4uCisgIGlmKG9iamVjdHAod2hhdCkpIHsKKyAgICBvYmplY3QgKmVudnM9YWxsX2Vudmlyb25tZW50KHdoYXQpOworICAgIC8vIHdlbm4gb2Iga2VpbiBFbnZpcm9ubWVudCBoYXQsIGlzdCBlcyBvZmZlbnNpY2h0bGljaCBuaWNodCBpbiB3aGF0CisgICAgLy8gZW50aGFsdGVuLgorICAgIGlmICghcG9pbnRlcnAoZW52cykpIHJldHVybiAwOworICAgIGlmIChtZW1iZXIoZW52cywgb2IpICE9IC0xKSByZXR1cm4gd2hhdDsKKyAgfQorICAvLyBzb25zdCB3aXJkcyB0ZXVyZXIsIHVlYmVyIGFsbGUgT2JqZWt0ZSBpbSAoZGVlcCkgSW52IGxhdWZlbiB1bmQgcGVyIGlkKCkKKyAgLy8gdGVzdGVuLiBEYWJlaSBtdXNzIGFiZXIgZGllIGdld3VlbnNjaHRlIE5yLiAoImZsYXNjaGUgMyIpIGFiZ2VzY2huaXR0ZW4KKyAgLy8gd2VyZGVuIHVuZCBzZWxiZXIgZ2V6YWVobHQgd2VyZGVuLCB3ZWxjaGUgZGFzIGVudHNwcmVjaGVuZGUgT2JqZWt0IGlzdC4KKyAgZWxzZSBpZiAoc3RyaW5ncCh3aGF0KSkgeworICAgICAgaW50IGNudDsKKyAgICAgIHN0cmluZyBuZXd3aGF0OworICAgICAgaWYoc3NjYW5mKHdoYXQsIiVzICVkIixuZXd3aGF0LGNudCkhPTIpCisgICAgICAgY250PTE7CisgICAgICBlbHNlCisgICAgICAgd2hhdD1uZXd3aGF0OworICAgICAgZm9yZWFjaChvYmplY3QgaW52b2I6IGRlZXBfaW52ZW50b3J5KG9iKSkgeworICAgICAgIGlmIChpbnZvYi0+aWQod2hhdCkgJiYgIS0tY250KQorICAgICAgICAgICByZXR1cm4gaW52b2I7CisgICAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJXcm9uZyBhcmd1bWVudCAxIHRvIGRlZXBfcHJlc2VudCgpLiAiCisgICAgICAgICAiRXhwZWN0ZWQgXCJvYmplY3RcIiBvciBcInN0cmluZ1wiLCBnb3QgJS41ME8uXG4iLAorICAgICAgICAgd2hhdCkpOworICB9CisgIHJldHVybiAwOworfQorCittYXBwaW5nIGR1bXBfaXBfbWFwcGluZygpCit7CisgIHJldHVybiAwOworfQorCitub21hc2sgdm9pZCBzd2FwKG9iamVjdCBvYmopCit7CisgIHdyaXRlKCJZb3VyIGFyZSBub3QgYWxsb3dlZCB0byBzd2FwIG9iamVjdHMgYnkgaGFuZCFcbiIpOworICByZXR1cm47Cit9CisKK25vbWFzayB2YXJhcmdzIHZvaWQgZ2FyYmFnZV9jb2xsZWN0aW9uKHN0cmluZyBzdHIpCit7CisgIGlmKHByZXZpb3VzX29iamVjdCgpPT0wIHx8ICFJU19BUkNIKGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpKSAKKyAgICAgIHx8ICFBUkNIX1NFQ1VSSVRZKQorICB7CisgICAgd3JpdGUoIkNhbGwgR0Mgbm93IGFuZCB0aGUgbXVkIHdpbGwgY3Jhc2ggaW4gNS02IGhvdXJzLiBET05UIERPIElUIVxuIik7CisgICAgcmV0dXJuOworICB9CisgIGVsc2UgaWYgKHN0cmluZ3Aoc3RyKSkKKyAgeworICAgIHJldHVybiBlZnVuOjpnYXJiYWdlX2NvbGxlY3Rpb24oc3RyKTsKKyAgfQorICBlbHNlIAorICAgIHJldHVybiBlZnVuOjpnYXJiYWdlX2NvbGxlY3Rpb24oKTsKK30KKwordmFyYXJncyB2b2lkIG5vdGlmeV9mYWlsKG1peGVkIG5mLCBpbnQgcHJpbykgeworICBvYmplY3QgcG8sb2xkbzsKKyAgaW50IG9sZHByaW87CisgIAorICBpZiAoIVBMIHx8ICFvYmplY3RwKHBvPXByZXZpb3VzX29iamVjdCgpKSkgcmV0dXJuOworICBpZiAoIXN0cmluZ3AobmYpICYmICFjbG9zdXJlcChuZikpIHsKKyAgICAgIHNldF90aGlzX29iamVjdChwbyk7CisgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKAorICAgICAgICAgIk9ubHkgc3RyaW5ncyBhbmQgY2xvc3VyZXMgYWxsb3dlZCBmb3Igbm90aWZ5X2ZhaWwhICIKKyAgICAgICAgICJBcmd1bWVudCB3YXM6ICUuNTBPLi4uXG4iLG5mKSk7CisgIH0KKworICAvLyBmYWxscyBlaW4gT2JqZWt0IGJlcmVpdHMgbmVuIG5vdGlmeV9mYWlsKCkgc2V0enRlLCBQcmlvcml0YWV0ZW4gYWJzY2hhZXR6ZW4KKyAgLy8gdW5kIHZlcmdsZWljaGVuLgorICBpZiAob2JqZWN0cChvbGRvPXF1ZXJ5X25vdGlmeV9mYWlsKDEpKSAmJiBwbyE9b2xkbykgeworICAgIGlmICghcHJpbykgeyAgICAgICAKKyAgICAgIC8vUHJpb3JpdGFldCBkaWVzZXMgbm90aWZ5X2ZhaWwoKSAnYWJzY2hhZXR6ZW4nCisgICAgICBpZiAocG89PVBMKSAvLyBTcGllbGVyLWludGVybmUgKHNvdWwtY21kcykKKyAgICAgICAgcHJpbz1ORl9OTF9PV047CisgICAgICBlbHNlIGlmIChsaXZpbmcocG8pKQorICAgICAgICBwcmlvPU5GX05MX0xJVklORzsKKyAgICAgIGVsc2UgaWYgKChpbnQpcG8tPklzUm9vbSgpKQorICAgICAgICBwcmlvPU5GX05MX1JPT007CisgICAgICBlbHNlCisgICAgICAgIHByaW89TkZfTkxfVEhJTkc7CisgICAgfQorICAgIC8vUHJpb3JpdGFldCBkZXMgYWx0ZW4gU2V0emVycyBhYnNjaGFldHplbgorICAgIGlmIChvbGRvPT1QTCkKKyAgICAgIG9sZHByaW89TkZfTkxfT1dOOworICAgIGVsc2UgaWYgKGxpdmluZyhvbGRvKSkKKyAgICAgIG9sZHByaW89TkZfTkxfTElWSU5HOworICAgIGVsc2UgaWYgKChpbnQpb2xkby0+SXNSb29tKCkpCisgICAgICBvbGRwcmlvPU5GX05MX1JPT007CisgICAgZWxzZQorICAgICAgb2xkcHJpbz1ORl9OTF9USElORzsKKyAgfQorICBlbHNlIC8vIHdlbm4gZXMgbm9jaCBrZWluIE5vdGlmeV9mYWlsIGdpYnQ6CisgICAgb2xkcHJpbz1ORl9OTF9OT05FOworCisgIC8vdmVyZ2xlaWNoZW4gdW5kIGdnZi4gc2V0emVuCisgIGlmIChwcmlvID49IG9sZHByaW8pIHsgCisgICAgc2V0X3RoaXNfb2JqZWN0KHBvKTsKKyAgICBlZnVuOjpub3RpZnlfZmFpbChuZik7CisgIH0KKworICByZXR1cm47Cit9CisKK3ZvaWQgX25vdGlmeV9mYWlsKHN0cmluZyBzdHIpCit7CisgIC8vcXVlcnlfbm90aWZ5X2ZhaWwoKSBiZW51dHplbiwgdW0gZGFzIE9iamVrdAorICAvL2RlcyBsZXR6dGVuIG5vdGlmeV9mYWlsKCkgenUgZXJtaXR0ZWxuCisgIG9iamVjdCBvOworICBpZiAoKG89cXVlcnlfbm90aWZ5X2ZhaWwoMSkpICYmIG8hPXByZXZpb3VzX29iamVjdCgpKQorICAgIHJldHVybjsKKyAgLy9ub2NoIGtlaW4gbm90aWZ5X2ZhaWwoKSBmdWVyIGRpZXNlcyBLb21tYW5kbyBnZXNldHp0LCBhdWYgZ2VodHMuCisgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgIGVmdW46Om5vdGlmeV9mYWlsKHN0cik7CisgIHJldHVybjsKK30KKworc3RyaW5nIHRpbWUyc3RyaW5nKCBzdHJpbmcgZm9ybWF0LCBpbnQgemVpdCApCit7CisgIGludCBpLGNoLG1heHVuaXQsZHVtbXk7CisgIHN0cmluZyAqcGFydHMsIGZtdDsKKworICBpbnQgc2VjcyA9IHplaXQ7CisgIGludCBtaW5zID0gKHplaXQvNjApOworICBpbnQgaG91cnMgPSAoemVpdC8zNjAwKTsKKyAgaW50IGRheXMgPSAoemVpdC84NjQwMCk7CisgIGludCB3ZWVrcyA9ICAoemVpdC82MDQ4MDApOworICBpbnQgbW9udGhzID0gKHplaXQvMjQxOTIwMCk7CisgIGludCBhYmJyID0gMDsKKworICBwYXJ0cyA9IHJlZ2V4cGxvZGUoIGZvcm1hdCwgIlwoJVwoLXxcKVswLTldKltud2RobXN4TldESE1TWF1cKXxcKCUlXCkiICk7CisKKyAgZm9yKCBpPTE7IGk8c2l6ZW9mKHBhcnRzKTsgaSs9MiApCisgIHsKKyAgICBjaCA9IHBhcnRzW2ldWzwxXTsKKyAgICBzd2l0Y2goIHBhcnRzW2ldWzwxXSApCisgICAgeworICAgIGNhc2UgJ3gnOiBjYXNlICdYJzoKKyAgICAgICBhYmJyID0gc3NjYW5mKCBwYXJ0c1tpXSwgIiUlJWQiLCBkdW1teSApICYmIGR1bW15PT0wOworICAgICAgIC8vIE5PIGJyZWFrICEKKyAgICBjYXNlICduJzogY2FzZSAnTic6CisgICAgICAgbWF4dW5pdCB8PSAzMTsKKyAgICAgICBicmVhazsKKyAgICBjYXNlICd3JzogY2FzZSAnVyc6CisgICAgICAgbWF4dW5pdCB8PSAxNTsKKyAgICAgICBicmVhazsKKyAgICBjYXNlICdkJzogY2FzZSAnRCc6CisgICAgICAgbWF4dW5pdCB8PSA3OworICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2gnOiBjYXNlICdIJzoKKyAgICAgICBtYXh1bml0IHw9IDM7CisgICAgICAgYnJlYWs7CisgICAgY2FzZSAnbSc6IGNhc2UgJ00nOgorICAgICAgIG1heHVuaXQgfD0gMTsKKyAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYoIG1heHVuaXQgJiAxNiApIHdlZWtzICU9IDQ7CisgIGlmKCBtYXh1bml0ICYgOCApIGRheXMgJT0gNzsKKyAgaWYoIG1heHVuaXQgJiA0ICkgaG91cnMgJT0gMjQ7CisgIGlmKCBtYXh1bml0ICYgMiApIG1pbnMgJT0gNjA7CisgIGlmKCBtYXh1bml0ICkgc2VjcyAlPSA2MDsKKworICBmb3IoIGk9MTsgaTxzaXplb2YocGFydHMpOyBpKz0yICkKKyAgeworICAgIGZtdCA9IHBhcnRzW2ldWzAuLjwyXTsKKyAgICBjaCA9IHBhcnRzW2ldWzwxXTsKKyAgICBpZiggY2g9PSd4JyApCisgICAgeworICAgICAgaWYgKG1vbnRocyA+IDApIGNoPSduJzsKKyAgICAgIGVsc2UgaWYoIHdlZWtzPjAgKSBjaD0ndyc7CisgICAgICBlbHNlIGlmKCBkYXlzPjAgKSBjaD0nZCc7CisgICAgICBlbHNlIGlmKCBob3Vycz4wICkgY2g9J2gnOyAKKyAgICAgIGVsc2UgaWYobWlucyA+IDApIGNoID0gJ20nOworICAgICAgZWxzZSBjaCA9ICdzJzsKKyAgICB9CisgICAgZWxzZSBpZiggY2g9PSdYJyApCisgICAgeworICAgICAgaWYgKG1vbnRocyA+IDApIGNoPSdOJzsKKyAgICAgIGVsc2UgaWYoIHdlZWtzPjAgKSBjaD0nVyc7CisgICAgICBlbHNlIGlmKCBkYXlzPjAgKSBjaD0nRCc7CisgICAgICBlbHNlIGlmKCBob3Vycz4wICkgY2g9J0gnOyAKKyAgICAgIGVsc2UgaWYobWlucyA+IDApIGNoID0gJ00nOworICAgICAgZWxzZSBjaCA9ICdTJzsKKyAgICB9CisgICAgCisgICAgc3dpdGNoKCBjaCApCisgICAgeworICAgICAgY2FzZSAnbic6IHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJkIiwgbW9udGhzICk7IGJyZWFrOworICAgICAgY2FzZSAndyc6IHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJkIiwgd2Vla3MgKTsgYnJlYWs7CisgICAgICBjYXNlICdkJzogcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrImQiLCBkYXlzICk7IGJyZWFrOworICAgICAgY2FzZSAnaCc6IHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJkIiwgaG91cnMgKTsgYnJlYWs7CisgICAgICBjYXNlICdtJzogcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrImQiLCBtaW5zICk7IGJyZWFrOworICAgICAgY2FzZSAncyc6IHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJkIiwgc2VjcyApOyBicmVhazsKKyAgICAgIGNhc2UgJ04nOgorICAgICAgIGlmKGFiYnIpIHBhcnRzW2ldID0gIk0iOworICAgICAgIGVsc2UgcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrInMiLCAobW9udGhzPT0xKSA/ICJNb25hdCIgOiAiTW9uYXRlIiApOworICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnVyc6CisgICAgICAgaWYoYWJicikgcGFydHNbaV0gPSAidyI7IGVsc2UKKyAgICAgICBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsicyIsICh3ZWVrcz09MSkgPyAiV29jaGUiIDogIldvY2hlbiIgKTsKKyAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ0QnOgorICAgICAgIGlmKGFiYnIpIHBhcnRzW2ldID0gImQiOyBlbHNlCisgICAgICAgcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrInMiLCAoZGF5cz09MSkgPyAiVGFnIiA6ICJUYWdlIiApOworICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnSCc6CisgICAgICAgaWYoYWJicikgcGFydHNbaV0gPSAiaCI7IGVsc2UKKyAgICAgICBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsicyIsIChob3Vycz09MSkgPyAiU3R1bmRlIiA6ICJTdHVuZGVuIiApOworICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnTSc6CisgICAgICAgaWYoYWJicikgcGFydHNbaV0gPSAibSI7IGVsc2UKKyAgICAgICBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsicyIsIChtaW5zPT0xKSA/ICJNaW51dGUiIDogIk1pbnV0ZW4iICk7CisgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdTJzoKKyAgICAgICBpZihhYmJyKSBwYXJ0c1tpXSA9ICJzIjsgZWxzZQorICAgICAgIHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJzIiwgKHNlY3M9PTEpID8gIlNla3VuZGUiIDogIlNla3VuZGVuIiApOworICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnJSc6CisgICAgICAgcGFydHNbaV0gPSAiJSI7CisgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbXBsb2RlKCBwYXJ0cywgIiIgKTsKK30KKworbm9tYXNrIG1peGVkIF9fY3JlYXRlX3BsYXllcl9kdW1teShzdHJpbmcgbmFtZSkKK3sKKyAgc3RyaW5nIGVycjsKKyAgb2JqZWN0IG9iOworICBtaXhlZCBtOworICAvL2hhdCBuZW4gU2NoZXJ6a2VrcyBkaWUgQmx1ZXByaW50IGJld2VndD8KKyAgaWYgKChvYj1maW5kX29iamVjdCgiL3NlY3VyZS9sb2dpbiIpKSAmJiBlbnZpcm9ubWVudChvYikpCisgICAgICBjYXRjaChkZXN0cnVjdChvYik7cHVibGlzaCk7CisgIGVyciA9IGNhdGNoKG9iID0gY2xvbmVfb2JqZWN0KCJzZWN1cmUvbG9naW4iKTtwdWJsaXNoKTsKKyAgaWYgKGVycikKKyAgeworICAgIHdyaXRlKCJGZWhsZXIgYmVpbSBMYWRlbiB2b24gL3NlY3VyZS9sb2dpbi5jXG4iK2VycisiXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAob2JqZWN0cChtPShtaXhlZClvYi0+bmV3X2xvZ29uKG5hbWUpKSkgbmV0ZGVhZFtuYW1lXT1tOworICByZXR1cm4gbTsKK30KKworbm9tYXNrIGludCBzZWN1cmVfbGV2ZWwoKQoreworICBpbnQgKmxldmVsOworICAvL2tldHRlIGRlciBDYWxsZXIgZHVyY2hsYXVmZW4sIGRlbiBuaWVkcmlnc3RlbiBMZXZlbCBpbiBkZXIgS2V0dGUKKyAgLy96dXJ1ZWNrZ2ViZW4uIFplcnN0b2VydGUgT2JqZWt0ZSAoU2VsYnN0emVyc3RvZXJlcikgZnVlaHJlbiB6dXIgUnVlY2tnYWJlCisgIC8vdm9uIDAuCisgIC8vY2FsbGVyX3N0YWNrKDEpIGZ1ZWd0IGRlbSBSdWVja2dhYmVhcnJheSB0aGlzX2ludGVyYWN0aXZlKCkgaGluenUgYnp3LiAwLAorICAvL3dlbm4gZXMga2VpbmVuIEludGVyYWN0aXZlIGdpYnQuIERpZSAwIGZ1ZWhydCBkYW5uIHdpZSBiZWkgemVyc3RvZXJ0ZW4KKyAgLy9PYmpla3RlbiB6dXIgUnVlY2tnYWJlIHZvbiAwLCB3YXMgZ2V3dWVuc2NodCBpc3QsIGRhIGVzIGhpZXIgZWluZW4KKyAgLy9JTnRlcmFjdGl2ZSBnZWJlbiBtdXNzLgorICBsZXZlbD1tYXAoY2FsbGVyX3N0YWNrKDEpLGZ1bmN0aW9uIGludCAob2JqZWN0IGNhbGxlcikKKyAgICAgIHtpZiAob2JqZWN0cChjYWxsZXIpKQorICAgICAgIHJldHVybihxdWVyeV93aXpfbGV2ZWwoZ2V0ZXVpZChjYWxsZXIpKSk7CisgICAgICAgcmV0dXJuKDApOyAvLyBrZWluIE9iamVrdCBkYSwgMC4KKyAgICAgIH0gKTsKKyAgcmV0dXJuKG1pbihsZXZlbCkpOyAvL2RlbiBrbGVpbnN0ZW4gV2VydCBpbSBBcnJheSB6dXJ1ZWNrZ2ViZW4gKGdnZi4gMCkKK30KKworbm9tYXNrIHN0cmluZyBzZWN1cmVfZXVpZCgpCit7CisgIHN0cmluZyBldWlkOworCisgIGlmICghdGhpc19pbnRlcmFjdGl2ZSgpKSAvLyBFcyBtdXNzIGVpbmVuIGludGVyYWN0aXZlIGdlYmVuCisgICAgIHJldHVybiAwOworICBldWlkPWdldGV1aWQodGhpc19pbnRlcmFjdGl2ZSgpKTsKKyAgLy8gdWViZXIgYWxsZSBDYWxsZXIgaXRlcmllcmVuLiBXZW5uIGVpbmVzIGRhdm9uIGVpbmUgYW5kZXJlIGV1aWQgaGF0IGFscworICAvLyBkZXIgSW50ZXJhY3RpdmUgdW5kIGRpZXNlIG5pY2h0IGRpZSBST09USUQgaXN0LCB3aXJkIDAgenVydWVja2dlYmVuLgorICAvLyBFYmVuc28sIGZhbGxzIGVpbiBTZWxic3R6ZXJzdG9lcmVyIGlyZ2VuZHdvIGluIGRlciBLZXR0ZSBpc3QuCisgIGZvcmVhY2gob2JqZWN0IGNhbGxlcjogY2FsbGVyX3N0YWNrKCkpIHsKKyAgICAgIGlmICghb2JqZWN0cChjYWxsZXIpIHx8CisgICAgICAgKGdldGV1aWQoY2FsbGVyKSE9ZXVpZCAmJiBnZXRldWlkKGNhbGxlcikhPVJPT1RJRCkpCisgICAgICAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gZXVpZDsgLy8gJ3NpY2hlcmUnIGV1aWQgenVydWVja2dlYmVuCit9CisKKy8vIElOUFVUX1BST01QVCB1bmQgbmVuIExlZXJwcm9tcHQgaGluenVmdWVnZW4sIHdlbm4ga2VpbnMgdWViZXJnZWJlbiB3aXJkLgorLy8gRGFzIHNvbGwgZGF6dSBkaWVuZW4sIGRhc3MgYWxsZSBnZ2YuIGVpbiBFT1IgYW0gUHJvbXB0ZW5kZSBrcmllZ2VuLi4uCisvLyNpZiBfX0JPT1RfVElNRV9fIDwgMTM2MDAxNzIxMwordmFyYXJncyB2b2lkIGlucHV0X3RvKCBtaXhlZCBmdW4sIGludCBmbGFncywgdmFyYXJncyBtaXhlZCAqYXJncyApCit7CisgICAgbWl4ZWQgKmFycjsKKyAgICBpbnQgaTsKKworICAgIGlmICggIXRoaXNfcGxheWVyKCkgfHwgIXByZXZpb3VzX29iamVjdCgpICkKKyAgICAgICByZXR1cm47CisKKyAgICAvLyBUT0RPOiBpbnB1dF90byguLi4sSU5QVVRfUFJPTVBULCAiIiwgLi4uKSwgd2VubiBrZWluIElOUFVUX1BST01QVAorICAgIC8vIHZvcmtvbW10Li4uCisgICAgaWYgKCBmbGFncyZJTlBVVF9QUk9NUFQgKSB7ICAgIAorICAgICAgICBhcnIgPSAoeyBmdW4sIGZsYWdzIH0pICsgYXJnczsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8vIGdnZi4gZWluIElOUFVUX1BST01QVCBoaW56dWZ1ZWdlbiB1bmQgbmVuIExlZXJzdHJpbmcgYWxzIFByb21wdC4KKyAgICAgICAgZmxhZ3MgfD0gSU5QVVRfUFJPTVBUOworICAgICAgICBhcnIgPSAoeyBmdW4sIGZsYWdzLCAiIiB9KSArIGFyZ3M7CisgICAgfQorCisgICAgLy8gQXJyYXlzIGdlZ2VuIGZsYXR0ZW4gcXVvdGVuLgorICAgIGZvciAoIGkgPSBzaXplb2YoYXJyKSAtIDE7IGkgPiAxOyBpLS0gKQorICAgICAgIGlmICggcG9pbnRlcnAoYXJyW2ldKSApCisgICAgICAgICAgIGFycltpXSA9IHF1b3RlKGFycltpXSk7CisKKyAgICBhcHBseSggYmluZF9sYW1iZGEoIHVuYm91bmRfbGFtYmRhKCAoe30pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7ICMnZWZ1bjo6aW5wdXRfdG8vKicqLyB9KSArIGFyciApLAorICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c19vYmplY3QoKSApICk7Cit9CisvLyNlbmRpZgorCitub21hc2sgaW50IHNldF9saWdodChpbnQgaSkKKy8vIGVyaG9laHQgZGFzIExpY2h0bGV2ZWwgZWluZXMgT2JqZWt0cyB1bSBpCisvLyByZXN1bHQ6IGRhcyBMaWNodGxldmVsIGlubmVyaGFsYiBkZXMgT2JqZWt0cworeworICAgIG9iamVjdCBvYiwgKmludjsKKyAgICBpbnQgbGFsbCwgbGlnaHQsIGRhcmssIHRtcDsKKworICAgIGlmICghKG9iPXByZXZpb3VzX29iamVjdCgpKSkgcmV0dXJuIDA7IC8vIG9obmUgZGFzIGdlaHRzIG5pY2h0LgorCisgICAgLy8gYXVzIGtvbXBhdGliaWxpdGFldHNncnVlbmRlbiBrYW5uIG1hbiBhdWNoIGRlbiBMaWNodGxldmVsIG5vY2ggc2V0emVuCisgICAgaWYgKGkhPTApIG9iLT5TZXRQcm9wKFBfTElHSFQsIG9iLT5RdWVyeVByb3AoUF9MSUdIVCkraSk7CisKKyAgICAvLyBMaWNodGJlcmVjaG51bmcgZmluZGV0IGVpZ2VudGxpY2ggaW4gZGVyIE11ZGxpYiBzdGF0dC4KKyAgICByZXR1cm4gKGludClvYi0+UXVlcnlQcm9wKFBfSU5UX0xJR0hUKTsKK30KKworCitwdWJsaWMgc3RyaW5nIGlzbzJhc2NpaSggc3RyaW5nIHN0ciApCit7CisgICAgaWYgKCAhc3RyaW5ncChzdHIpIHx8ICFzaXplb2Yoc3RyKSApCisgICAgICAgcmV0dXJuICIiOworCisgICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAi5CIsICJhZSIsIDEgKTsKKyAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICL2IiwgIm9lIiwgMSApOworICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgIvwiLCAidWUiLCAxICk7CisgICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAixCIsICJBZSIsIDEgKTsKKyAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICLWIiwgIk9lIiwgMSApOworICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgItwiLCAiVWUiLCAxICk7CisgICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAi3yIsICJzcyIsIDEgKTsKKyAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICJbXiAtfl0iLCAiPyIsIDEgKTsKKworICAgIHJldHVybiBzdHI7Cit9CisKKworcHVibGljIHZhcmFyZ3Mgc3RyaW5nIENvdW50VXAoIHN0cmluZyAqcywgc3RyaW5nIHNlcCwgc3RyaW5nIGxhc3RzZXAgKQoreworICAgIHN0cmluZyByZXQ7CisKKyAgICBpZiAoICFwb2ludGVycChzKSApCisgICAgICAgcmV0dXJuICIiOworICAgIAorICAgIGlmICghc2VwKSBzZXAgPSAiLCAiOworICAgIGlmICghbGFzdHNlcCkgbGFzdHNlcCA9ICIgdW5kICI7CisKKyAgICBzd2l0Y2ggKHNpemVvZihzKSkgIHsKKyAgICAgICBjYXNlIDA6IHJldD0iIjsgYnJlYWs7CisgICAgICAgY2FzZSAxOiByZXQ9c1swXTsgYnJlYWs7CisgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgcmV0ID0gaW1wbG9kZShzWzAuLjwyXSwgc2VwKTsKKyAgICAgICAgICAgICAgcmV0ICs9IGxhc3RzZXAgKyBzWzwxXTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworbm9tYXNrIHZhcmFyZ3MgaW50IHF1ZXJ5X25leHRfcmVzZXQob2JqZWN0IG9iKSB7CisKKyAgICAvLyBUeXBwcnVlZnVuZzogZXR3YXMgYW5kZXJlcyBhbHMgT2JqZWt0ZSBvZGVyIDAgc29sbGVuIEZlaGxlciBzZWluLgorICAgIGlmIChvYiAmJiAhb2JqZWN0cChvYikpCisgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJCYWQgYXJnIDEgdG8gcXVlcnlfbmV4dF9yZXNldCgpOiBnb3QgJS4yME8sICIKKyAgICAgICAgICAgImV4cGVjdGVkIG9iamVjdC5cbiIsb2IpKTsKKworICAgIC8vIERlZmF1bHRvYmpla3QgUE8sIHdlbm4gMCB1ZWJlcmdlYmVuLgorICAgIGlmICggIW9iamVjdHAob2IpICkKKyAgICAgIG9iID0gcHJldmlvdXNfb2JqZWN0KCk7CisKKyAgICByZXR1cm4gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05FWFRfUkVTRVRfVElNRSk7Cit9CisKKworI2lmICFfX0VGVU5fREVGSU5FRF9fKGNvcHlfZmlsZSkKKyNkZWZpbmUgTUFYTEVOIDUwMDAwCitub21hc2sgaW50IGNvcHlfZmlsZShzdHJpbmcgc291cmNlLCBzdHJpbmcgZGVzdCkKK3sKKworICBpbnQgcHRyOworICBzdHJpbmcgYnl0ZXM7CisKKyAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgaWYgKCFzaXplb2Yoc291cmNlKXx8IXNpemVvZihkZXN0KXx8c291cmNlPT1kZXN0fHwoZmlsZV9zaXplKHNvdXJjZSk9PS0xKXx8CisgICAgICAoIWNhbGxfb3RoZXIobWFzdGVyKCksInZhbGlkX3JlYWQiLHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICBnZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpfHwKKyAgICAgICAgICAgICAgICAgcHJldmlvdXNfb2JqZWN0KCkpLCJyZWFkX2ZpbGUiLHByZXZpb3VzX29iamVjdCgpKSl8fAorICAgICAgKCFjYWxsX290aGVyKG1hc3RlcigpLCJ2YWxpZF9yZWFkIixzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKXx8CisgICAgICAgICAgICAgICAgIHByZXZpb3VzX29iamVjdCgpKSwid3JpdGVfZmlsZSIscHJldmlvdXNfb2JqZWN0KCkpKSkKKyAgICByZXR1cm4gMTsKKyAgc3dpdGNoIChmaWxlX3NpemUoZGVzdCkpCisgIHsKKyAgY2FzZSAtMToKKyAgICBicmVhazsKKyAgY2FzZSAtMjoKKyAgICBpZiAoZGVzdFs8MV0hPScvJykgZGVzdCs9Ii8iOworICAgIGRlc3QrPWVmdW46OmV4cGxvZGUoc291cmNlLCIvIilbPDFdOworICAgIGlmIChmaWxlX3NpemUoZGVzdCk9PS0yKSByZXR1cm4gMTsKKyAgICBpZiAoZmlsZV9zaXplKGRlc3QpIT0tMSkgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgaWYgKCFybShkZXN0KSkgcmV0dXJuIDE7CisgICAgYnJlYWs7CisgIH0KKyAgZG8KKyAgeworICAgIGJ5dGVzID0gcmVhZF9ieXRlcyhzb3VyY2UsIHB0ciwgTUFYTEVOKTsgcHRyICs9IE1BWExFTjsKKyAgICBpZiAoIWJ5dGVzKSBieXRlcz0iIjsKKyAgICB3cml0ZV9maWxlKGRlc3QsIGJ5dGVzKTsKKyAgfQorICB3aGlsZShzaXplb2YoYnl0ZXMpID09IE1BWExFTik7CisgIHJldHVybiAwOworfQorI2VuZGlmIC8vIV9fRUZVTl9ERUZJTkVEX18oY29weV9maWxlKQorCisKKy8vICMjIyBFcnNhdHphdWZsb2VzdW5nIGluIFN0cmluZ3MgIyMjCit2YXJhcmdzIHN0cmluZyByZXBsYWNlX3BlcnNvbmFsKHN0cmluZyBzdHIsIG1peGVkICpvYnMsIGludCBjYXBzKSB7CisgIGludCBpOworICBzdHJpbmcgKnBhcnRzOworCisgIHBhcnRzID0gcmVnZXhwbG9kZShzdHIsICJAV0VbQS1TVV0qWzAtOV0iKTsKKyAgaSA9IHNpemVvZihwYXJ0cyk7CisKKyAgaWYgKGk+MSkgeworICAgIGludCBqLCB0OworICAgIGNsb3N1cmUgKm5hbWVfY2xzOworCisgICAgdCA9IGogPSBzaXplb2Yob2JzKTsKKworICAgIG5hbWVfY2xzICA9ICBhbGxvY2F0ZShqKTsKKyAgICB3aGlsZSAoai0tKQorICAgICAgaWYgKG9iamVjdHAob2JzW2pdKSkKKyAgICAgICAgbmFtZV9jbHNbal0gPSBzeW1ib2xfZnVuY3Rpb24oIm5hbWUiLCBvYnNbal0pOworICAgICAgZWxzZSBpZiAoc3RyaW5ncChvYnNbal0pKQorICAgICAgICBuYW1lX2Nsc1tqXSA9IG9ic1tqXTsKKworICAgIHdoaWxlICgoaS09IDIpPjApIHsKKyAgICAgIGludCBvYl9ucjsKKyAgICAgIC8vIHp1IGVyc2V0emVuZGVzIFRva2VuIGluIEZhbGwgdW5kIE9iamVrdGluZGV4IGF1ZnNwYWx0ZW4KKyAgICAgIG9iX25yID0gcGFydHNbaV1bPDFdLScxJzsKKyAgICAgIGlmIChvYl9ucjwwIHx8IG9iX25yPj10KSB7CisgICAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoInJlcGxhY2VfcGVyc29uYWw6IHVzaW5nIHdyb25nIG9iamVjdCBpbmRleCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgb2JfbnIpKTsKKyAgICAgICAgcmV0dXJuIGltcGxvZGUocGFydHMsICIiKTsKKyAgICAgIH0KKworICAgICAgLy8gY2FzdXMga2FubiBtYW4gc2Nob24gaGllciBlbnRzY2hlaWRlbgorICAgICAgaW50IGNhc3VzOworICAgICAgc3RyaW5nIHBhcnQgPSBwYXJ0c1tpXTsKKyAgICAgIHN3aXRjaCAocGFydFszXSkgeworICAgICAgICBjYXNlICdSJzogY2FzdXMgPSBXRVI7ICAgIGJyZWFrOworICAgICAgICBjYXNlICdTJzogY2FzdXMgPSBXRVNTRU47IGJyZWFrOworICAgICAgICBjYXNlICdNJzogY2FzdXMgPSBXRU07ICAgIGJyZWFrOworICAgICAgICBjYXNlICdOJzogY2FzdXMgPSBXRU47ICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAgY29udGludWU7IC8vIHBhc3N0IHNjaG9uIGpldHp0IG5pY2h0IGluIGRhcyBIYXVwdG11c3RlcgorICAgICAgfQorCisgICAgICAvLyB1bmQgamV0enQgZGllIGVpbnplbG5lbiBLZXl3b3JkcyBvaG5lIGZ1ZWhyZW5kZXMgIkBXRSIsIGJlZW5kZW5kZSBJZAorICAgICAgbWl4ZWQgdG1wOworICAgICAgc3dpdGNoIChwYXJ0WzMuLjwyXSkgeworICAgICAgICBjYXNlICJSIjogY2FzZSAiU1NFTiI6IGNhc2UgIk0iOiBjYXNlICJOIjogICAgICAgICAgICAgICAvLyBOYW1lCisgICAgICAgICAgcGFydHNbaV0gPSBmdW5jYWxsKG5hbWVfY2xzW29iX25yXSwgY2FzdXMsIDEpOyAgYnJlYWs7CisgICAgICAgIGNhc2UgIlJVIjogY2FzZSAiU1NFTlUiOiBjYXNlICJNVSI6IGNhc2UgIk5VIjogICAgICAgICAgIC8vIHVuYmVzdGltbXQKKyAgICAgICAgICBwYXJ0c1tpXSA9IGZ1bmNhbGwobmFtZV9jbHNbb2JfbnJdLCBjYXN1cyk7ICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiUlFQIjogY2FzZSAiU1NFTlFQIjogY2FzZSAiTVFQIjogY2FzZSAiTlFQIjogICAgICAgLy8gUHJvbm91bgorICAgICAgICAgIGlmIChvYmplY3RwKHRtcCA9IG9ic1tvYl9ucl0pKQorICAgICAgICAgICAgcGFydHNbaV0gPSAoc3RyaW5nKXRtcC0+UXVlcnlQcm9ub3VuKGNhc3VzKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiUlFBIjogY2FzZSAiU1NFTlFBIjogY2FzZSAiTVFBIjogY2FzZSAiTlFBIjogICAgICAgLy8gQXJ0aWNsZQorICAgICAgICAgIGlmIChvYmplY3RwKHRtcCA9IG9ic1tvYl9ucl0pKQorICAgICAgICAgICAgdG1wID0gKHN0cmluZyl0bXAtPlF1ZXJ5QXJ0aWNsZShjYXN1cywgMSwgMSk7CisgICAgICAgICAgaWYgKHN0cmluZ3AodG1wKSAmJiAhKHRtcFs8MV1eJyAnKSkgCisgICAgICAgICAgICB0bXAgPSB0bXBbMC4uPDJdOyAgICAgICAgICAgICAgICAvLyBFeHRyYS1TcGFjZSB3aWVkZXIgbG9lc2NoZW4KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiUlFQUE1TIjogY2FzZSAiU1NFTlFQUE1TIjogY2FzZSAiTVFQUE1TIjogY2FzZSAiTlFQUE1TIjoKKyAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKKyAgICAgICAgICAgIHBhcnRzW2ldID0gKHN0cmluZyl0bXAtPlF1ZXJ5UG9zc1Byb25vdW4oTUFMRSwgY2FzdXMsIFNJTkdVTEFSKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiUlFQUEZTIjogY2FzZSAiU1NFTlFQUEZTIjogY2FzZSAiTVFQUEZTIjogY2FzZSAiTlFQUEZTIjoKKyAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKKyAgICAgICAgICAgIHBhcnRzW2ldID0gKHN0cmluZyl0bXAtPlF1ZXJ5UG9zc1Byb25vdW4oRkVNQUxFLCBjYXN1cywgU0lOR1VMQVIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICJSUVBQTlMiOiBjYXNlICJTU0VOUVBQTlMiOiBjYXNlICJNUVBQTlMiOiBjYXNlICJOUVBQTlMiOgorICAgICAgICAgIGlmIChvYmplY3RwKHRtcCA9IG9ic1tvYl9ucl0pKQorICAgICAgICAgICAgcGFydHNbaV0gPSAoc3RyaW5nKXRtcC0+UXVlcnlQb3NzUHJvbm91bihORVVURVIsIGNhc3VzLCBTSU5HVUxBUik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgIlJRUFBNUCI6IGNhc2UgIlNTRU5RUFBNUCI6IGNhc2UgIk1RUFBNUCI6IGNhc2UgIk5RUFBNUCI6CisgICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCisgICAgICAgICAgICBwYXJ0c1tpXSA9IChzdHJpbmcpdG1wLT5RdWVyeVBvc3NQcm9ub3VuKE1BTEUsIGNhc3VzLCBQTFVSQUwpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICJSUVBQRlAiOiBjYXNlICJTU0VOUVBQRlAiOiBjYXNlICJNUVBQRlAiOiBjYXNlICJOUVBQRlAiOgorICAgICAgICAgIGlmIChvYmplY3RwKHRtcCA9IG9ic1tvYl9ucl0pKQorICAgICAgICAgICAgcGFydHNbaV0gPSAoc3RyaW5nKXRtcC0+UXVlcnlQb3NzUHJvbm91bihGRU1BTEUsIGNhc3VzLCBQTFVSQUwpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICJSUVBQTlAiOiBjYXNlICJTU0VOUVBQTlAiOiBjYXNlICJNUVBQTlAiOiBjYXNlICJOUVBQTlAiOgorICAgICAgICAgIGlmIChvYmplY3RwKHRtcCA9IG9ic1tvYl9ucl0pKQorICAgICAgICAgICAgcGFydHNbaV0gPSAoc3RyaW5nKXRtcC0+UXVlcnlQb3NzUHJvbm91bihORVVURVIsIGNhc3VzLCBQTFVSQUwpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgCisgICAgICAvLyB3ZW5uIHRtcCBlaW4gU3RyaW5nIHdhciwgd2Vpc2VuIHdpciBlcyBoaWVyIHBhdXNjaGFsIHp1CisgICAgICBpZiAoc3RyaW5ncCh0bXApKQorICAgICAgICBwYXJ0c1tpXSA9IHRtcDsKKworICAgICAgLy8gYXVmIFd1bnNjaCB3aXJkIG5hY2ggU2F0emVuZGVuIGdyb3NzIGdlc2NocmllYmVuCisgICAgICBpZiAoY2FwcykKKyAgICAgICAgc3dpdGNoIChwYXJ0c1tpLTFdWzwyLi5dKSB7CisgICAgICAgICAgY2FzZSAiLiAiOiAgY2FzZSAiISAiOiAgY2FzZSAiPyAiOgorICAgICAgICAgIGNhc2UgIi4iOiAgIGNhc2UgIiEiOiAgIGNhc2UgIj8iOgorICAgICAgICAgIGNhc2UgIi5cbiI6IGNhc2UgIiFcbiI6IGNhc2UgIj9cbiI6CisgICAgICAgICAgY2FzZSAiXCIgIjogY2FzZSAiXCJcbiI6CisgICAgICAgICAgICBwYXJ0c1tpXSA9IGNhcGl0YWxpemUocGFydHNbaV0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGltcGxvZGUocGFydHMsICIiKTsKKyAgfQorICByZXR1cm4gc3RyOworfQorCisKKy8vcmVwbGFjZW1lbnRzIGZvciBkcm9wcGVkIGVmdW5zIGluIExECisjaWYgIV9fRUZVTl9ERUZJTkVEX18oZXh0cmFjdCkKK2RlcHJlY2F0ZWQgdmFyYXJncyBzdHJpbmcgZXh0cmFjdChzdHJpbmcgc3RyLCBpbnQgZnJvbSwgaW50IHRvKSB7CisKKyAgaWYoIXN0cmluZ3Aoc3RyKSkgeworICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiQmFkIGFyZ3VtZW50IDEgdG8gZXh0cmFjdCgpOiAlTyIsc3RyKSk7CisgIH0KKyAgaWYgKGludHAoZnJvbSkgJiYgaW50cCh0bykpIHsKKyAgICBpZiAoZnJvbT49MCAmJiB0bz49MCkKKyAgICAgIHJldHVybihzdHJbZnJvbSAuLiB0b10pOworICAgIGVsc2UgaWYgKGZyb20+PTAgJiYgdG88MCkKKyAgICAgIHJldHVybihzdHJbZnJvbSAuLiA8YWJzKHRvKV0pOworICAgIGVsc2UgaWYgKGZyb208MCAmJiB0bz49MCkKKyAgICAgIHJldHVybihzdHJbPGFicyhmcm9tKSAuLiB0b10pOworICAgIGVsc2UKKyAgICAgIHJldHVybihzdHJbPGFicyhmcm9tKSAuLiA8YWJzKHRvKV0pOworICB9CisgIGVsc2UgaWYgKGludHAoZnJvbSkpIHsKKyAgICBpZiAoZnJvbT49MCkKKyAgICAgIHJldHVybihzdHJbZnJvbSAuLiBdKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4oc3RyWzxhYnMoZnJvbSkgLi4gXSk7CisgIH0KKyAgZWxzZSB7CisgICAgcmV0dXJuKHN0cik7CisgIH0KK30KKyNlbmRpZiAvLyAhX19FRlVOX0RFRklORURfXyhleHRyYWN0KQorCisjaWYgIV9fRUZVTl9ERUZJTkVEX18oc2xpY2VfYXJyYXkpCitkZXByZWNhdGVkIHZhcmFyZ3MgbWl4ZWQgc2xpY2VfYXJyYXkobWl4ZWQgYXJyYXksIGludCBmcm9tLCBpbnQgdG8pIHsKKworICBpZighcG9pbnRlcnAoYXJyYXkpKSB7CisgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJCYWQgYXJndW1lbnQgMSB0byBzbGljZV9hcnJheSgpOiAlTyIsYXJyYXkpKTsKKyAgfQorICBpZiAoaW50cChmcm9tKSAmJiBpbnRwKHRvKSkgeworICAgIGlmIChmcm9tPj0wICYmIHRvPj0wKQorICAgICAgcmV0dXJuKGFycmF5W2Zyb20gLi4gdG9dKTsKKyAgICBlbHNlIGlmIChmcm9tPj0wICYmIHRvPDApCisgICAgICByZXR1cm4oYXJyYXlbZnJvbSAuLiA8YWJzKHRvKV0pOworICAgIGVsc2UgaWYgKGZyb208MCAmJiB0bz49MCkKKyAgICAgIHJldHVybihhcnJheVs8YWJzKGZyb20pIC4uIHRvXSk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKGFycmF5WzxhYnMoZnJvbSkgLi4gPGFicyh0byldKTsKKyAgfQorICBlbHNlIGlmIChpbnRwKGZyb20pKSB7CisgICAgaWYgKGZyb20+PTApCisgICAgICByZXR1cm4oYXJyYXlbZnJvbSAuLiBdKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4oYXJyYXlbPGFicyhmcm9tKSAuLiBdKTsKKyAgfQorICBlbHNlIHsKKyAgICByZXR1cm4oYXJyYXkpOworICB9Cit9CisjZW5kaWYgLy8gIV9fRUZVTl9ERUZJTkVEX18oc2xpY2VfYXJyYXkpCisKKyNpZiAhX19FRlVOX0RFRklORURfXyhtZW1iZXJfYXJyYXkpCitkZXByZWNhdGVkIGludCBtZW1iZXJfYXJyYXkobWl4ZWQgaXRlbSwgbWl4ZWQgYXJyYXlzdHJpbmcpIHsKKworICBpZiAocG9pbnRlcnAoYXJyYXlzdHJpbmcpKSB7CisgICAgcmV0dXJuKGVmdW46Om1lbWJlcihhcnJheXN0cmluZyxpdGVtKSk7CisgIH0KKyAgZWxzZSBpZiAoc3RyaW5ncChhcnJheXN0cmluZykpIHsKKyAgICByZXR1cm4oZWZ1bjo6bWVtYmVyKGFycmF5c3RyaW5nLHRvX2ludChpdGVtKSkpOworICB9CisgIGVsc2UgeworICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiQmFkIGFyZ3VtZW50IDEgdG8gbWVtYmVyX2FycmF5KCk6ICVPIixhcnJheXN0cmluZykpOworICB9Cit9CisjZW5kaWYgLy8gIV9fRUZVTl9ERUZJTkVEX18obWVtYmVyX2FycmF5KQorCisvLyBUaGUgZGlnaXQgYXQgdGhlIGkndGggcG9zaXRpb24gaXMgdGhlIG51bWJlciBvZiBiaXRzIHNldCBpbiAnaScuCitzdHJpbmcgY291bnRfdGFibGUgPQorICAgICIwMTEyMTIyMzEyMjMyMzM0MTIyMzIzMzQyMzM0MzQ0NTEyMjMyMzM0MjMzNDM0NDUyMzM0MzQ0NTM0NDU0NTU2IjsKK2ludCBicm9rZW5fY291bnRfYml0cyggc3RyaW5nIHMgKSB7CisgICAgaW50IGksIHJlczsKKyAgICBpZiggIXN0cmluZ3AocykgfHwgIShpPXNpemVvZihzKSkgKSByZXR1cm4gMDsKKyAgICBmb3IoIDsgaS0tPjA7ICkgeworICAgICAgICAvLyBXZSBhcmUgY291bnRpbmcgNiBiaXRzIGF0IGEgdGltZSB1c2luZyBhIHByZWNvbXBpbGVkIHRhYmxlLgorICAgICAgICByZXMgKz0gY291bnRfdGFibGVbKHNbaV0tJyAnKSY2M10tJzAnOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisjaWYgIV9fRUZVTl9ERUZJTkVEX18oY291bnRfYml0cykKK2ludCBjb3VudF9iaXRzKCBzdHJpbmcgcyApIHsKKyAgICByZXR1cm4oYnJva2VuX2NvdW50X2JpdHMocykpOworfQorI2VuZGlmCisKKworLy8gKiBUZWlsZSBhdXMgZWluZW0gQXJyYXkgZW50ZmVybmVuICoqKiBPQlNPTEVURQorZGVwcmVjYXRlZCBtaXhlZCAqZXhjbHVkZV9hcnJheShtaXhlZCAqYXJyLGludCBmcm9tLGludCB0bykKK3sKKyAgaWYgKHRvPGZyb20pCisgICAgdG8gPSBmcm9tOworICByZXR1cm4gYXJyWzAuLmZyb20tMV0rYXJyW3RvKzEuLl07Cit9CisKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL1JFQURNRSBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDM0MjlhCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvUkVBRE1FCkBAIC0wLDAgKzEsMjAgQEAKK3NpbXVsX2VmdW4gCistLS0tLS0tLS0tIAorRGFzIHNpbXVsX2VmdW4gT2JqZWt0IC9zZWN1cmUvc2ltdWxfZWZ1bi9zaW11bF9lZnVuIGJlbnV0enQgZGllIERhdGVpZW4KK2luIC9zZWN1cmUvc2ltdWxfZWZ1bi4KK0ltIFZlcnplaWNobmlzIC9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZSBpc3QgZWluZSBTaWNoZXJoZWl0c2tvcGllIHZvbiBhbGxlbiAKK0RhdGVpZW4gaW4gL3NlY3VyZS9zaW11bF9lZnVuLgorCitGYWxscyAvc2VjdXJlL3NpbXVsX2VmdW4vc2ltdWxfZWZ1bi5jIG5pY2h0IGxhZGJhciBpc3QsIHdpcmQgCisvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc2ltdWxfZWZ1bi5jIGFscyBFcnNhdHogdmVyc3VjaHQuIFdlbm4gYXVjaCBkYXMKK25pY2h0IGxhZGJhciBpc3QsIGVyZm9sZ3QgZWluIFNodXRkb3duIGRlcyBNdWRzLgorCitCZWkgQWVuZGVydW5nZW4gc29sbHRlIF96dWVyc3RfIGRpZSBub3JtYWxlIHNpbXVsIGVmdW4gZWRpdGllcnQgdW5kCithbnNjaGxpZXNzZW5kIHplcnN0b2VydC9lbnRsYWRlbiB3ZXJkZW4sIHdvcmF1ZmhpbiBzaWUgaW1wbGl6aXQgZHVyY2ggZGVuCitEcml2ZXIgdW5kIE1hc3RlciBuZXVnZWxhZGVuIHdpcmQuIElzdCBkaWVzIGVyZm9sZ3JlaWNoIHVuZCBkaWUgbmV1ZQorc2ltdWxfZWZ1biBsYWV1ZnQgKGVyc3QgZGFubiEpIGtvcGllcnQgbWFuIGRpZSBEYXRlaWVuIGF1cyAKKy9zZWN1cmUvc2ltdWxfZWZ1biBuYWNoIC9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS4KKworRGllIERhdGVpZW4gaGllciBzaW5kIG1pdCBBdXNuYWhtZSBkZXIgc2ltdWxfZWZ1bi5jIHNlbGJzdCBfbmljaHRfIGRhenUgCitnZWRhY2h0LCBnZWxhZGVuIHp1IHdlcmRlbi4KKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvY29tbS5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvY29tbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmYjU5OGMKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9jb21tLmMKQEAgLTAsMCArMSwxMjUgQEAKKyNpbmNsdWRlIDxsaXZpbmcvY29tbS5oPgorCisvLyBTZW5kZXQgYW4gYWxsZSBPYmpla3RlIGluIHJvb20gdW5kIHJvb20gc2VsYmVyIGR1cmNoIEF1ZnJ1ZiB2b24KKy8vIFJlY2VpdmVNc2coKS4KK3ZhcmFyZ3Mgdm9pZCBzZW5kX3Jvb20ob2JqZWN0fHN0cmluZyByb29tLCBzdHJpbmcgbXNnLCBpbnQgbXNnX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtc2dfYWN0aW9uLCBzdHJpbmcgbXNnX3ByZWZpeCwgb2JqZWN0ICpleGNsdWRlLAorICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Qgb3JpZ2luKQoreworICBpZiAoc3RyaW5ncChyb29tKSkKKyAgICByb29tPWxvYWRfb2JqZWN0KHJvb20pOworICAKKyAgb3JpZ2luIHx8PSBwcmV2aW91c19vYmplY3QoKTsKKyAgb2JqZWN0ICpkZXN0ID0gZXhjbHVkZSA/IGFsbF9pbnZlbnRvcnkocm9vbSkgLSBleGNsdWRlIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbF9pbnZlbnRvcnkocm9vbSk7CisKKyAgZGVzdC0+UmVjZWl2ZU1zZyhtc2csIG1zZ190eXBlLCBtc2dfYWN0aW9uLCBtc2dfcHJlZml4LCBvcmlnaW4pOworICByb29tLT5SZWNlaXZlTXNnKG1zZywgbXNnX3R5cGUsIG1zZ19hY3Rpb24sIG1zZ19wcmVmaXgsIG9yaWdpbik7Cit9CisKK3N0YXRpYyBpbnQgX3Nob3V0X2ZpbHRlciggb2JqZWN0IG9iLCBzdHJpbmcgcGF0ICkKK3sKKyAgICBzdHJpbmcgKmlnbm9yZTsKKworICAgIGlmICggIWVudmlyb25tZW50KG9iKSApCisgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gc2l6ZW9mKCByZWdleHAoICh7IG9iamVjdF9uYW1lKCBlbnZpcm9ubWVudChvYikgKSB9KSwgcGF0ICkgKTsKK30KKwordmFyYXJncyB2b2lkIHNob3V0KCBzdHJpbmcgcywgbWl4ZWQgd2hlcmUgKXsKKyAgICBvYmplY3QgKnU7CisgICAgc3RyaW5nICpwZmFkZTsKKworICAgIGlmICggIXNpemVvZiggdSA9IHVzZXJzKCkgLSAoeyB0aGlzX3BsYXllcigpIH0pICkgKQorICAgICAgIHJldHVybjsKKworICAgIGlmICggIXdoZXJlICkKKyAgICAgICBwZmFkZSA9ICh7ICIvIiB9KTsKKyAgICBlbHNlIGlmICggaW50cCh3aGVyZSkgKQorICAgICAgIHBmYWRlID0KKyAgICAgICAgICAgKHsgaW1wbG9kZSggZWZ1bjo6ZXhwbG9kZSggb2JqZWN0X25hbWUoIGVudmlyb25tZW50KHRoaXNfcGxheWVyKCkpICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvIiApWzAuLjJdLCAiLyIgKSArICIvIiB9KTsKKyAgICBlbHNlIGlmICggc3RyaW5ncCh3aGVyZSkgKQorICAgICAgIHBmYWRlID0gKHsgd2hlcmUgfSk7CisgICAgZWxzZQorICAgICAgIHBmYWRlID0gd2hlcmU7CisKKyAgICB1ID0gZmlsdGVyKCB1LCAiX3Nob3V0X2ZpbHRlciIsIE1FLCBpbXBsb2RlKCBwZmFkZSwgInwiICkgKTsKKyAgICB1LT5SZWNlaXZlTXNnKHMsIE1UX0NPTU18TVRfRkFSfE1TR19ET05UX1dSQVB8TVNHX0RPTlRfU1RPUkUsCisgICAgICAgICAgICAgICAgICBNQV9TSE9VVF9TRUZVTiwgMCwgcHJldmlvdXNfb2JqZWN0KCkpOworfQorCisKKyNpZiBfX1ZFUlNJT05fXyA+ICIzLjMuNzE4IgorLy8gVGhpcyBzZWZ1biByZXBsYWNlcyB0aGUgZGVwcmVjYXRlZCBlZnVuIGNhdCgpLgorI2RlZmluZSBDQVRfTUFYX0xJTkVTIDUwCit2YXJhcmdzIGludCBjYXQoc3RyaW5nIGZpbGUsIGludCBzdGFydCwgaW50IG51bSkKK3sKKyAgICBpZiAoZXh0ZXJuX2NhbGwoKSkKKyAgICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKworICAgIGludCBtb3JlOworCisgICAgaWYgKG51bSA8IDAgfHwgIXRoaXNfcGxheWVyKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCFzdGFydCkKKyAgICAgICAgc3RhcnQgPSAxOworCisgICAgaWYgKCFudW0gfHwgbnVtID4gQ0FUX01BWF9MSU5FUykgeworICAgICAgICBudW0gPSBDQVRfTUFYX0xJTkVTOworICAgICAgICBtb3JlID0gc2l6ZW9mKHJlYWRfZmlsZShmaWxlLCBzdGFydCtudW0sIDEpKTsKKyAgICB9CisKKyAgICBzdHJpbmcgdHh0ID0gcmVhZF9maWxlKGZpbGUsIHN0YXJ0LCBudW0pOworICAgIGlmICghdHh0KQorICAgICAgICByZXR1cm4gMDsKKworICAgIGVmdW46OnRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksIHR4dCk7CisKKyAgICBpZiAobW9yZSkKKyAgICAgICAgZWZ1bjo6dGVsbF9vYmplY3QodGhpc19wbGF5ZXIoKSwgIioqKioqVFJVTkNBVEVEKioqKlxuIik7CisKKyAgICByZXR1cm4gc2l6ZW9mKHR4dCAmICJcbiIpOworfQorI3VuZGVmIENBVF9NQVhfTElORVMKKyNlbmRpZiAvLyBfX1ZFUlNJT05fXyA+ICIzLjMuNzE4IgorCisjaWYgX19WRVJTSU9OX18gPiAiMy4zLjcxOSIKKy8vIFRoaXMgc2VmdW4gcmVwbGFjZXMgdGhlIGRlcHJlY2F0ZWQgZWZ1biB0YWlsKCkuCisjZGVmaW5lIFRBSUxfTUFYX0JZVEVTIDEwMDAKK3ZhcmFyZ3MgaW50IHRhaWwoc3RyaW5nIGZpbGUpCit7CisgICAgaWYgKGV4dGVybl9jYWxsKCkpCisgICAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisKKyAgICBpZiAoIXN0cmluZ3AoZmlsZSkgfHwgIXRoaXNfcGxheWVyKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgc3RyaW5nIHR4dCA9IHJlYWRfYnl0ZXMoZmlsZSwgLShUQUlMX01BWF9CWVRFUyArIDgwKSwgKFRBSUxfTUFYX0JZVEVTICsgODApKTsKKyAgICAvLyByZWFkX2J5dGVzKCkgcmV0dXJucyAwIGlmIHRoZSBzdGFydCBvZiB0aGUgc2VjdGlvbiBnaXZlbiBieQorICAgIC8vIHBhcmFtZXRlciAjMiBsaWVzIGJleW9uZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLgorICAgIC8vIEluIHRoaXMgY2FzZSB3ZSBzaW1wbHkgdHJ5IGFuZCByZWFkIHRoZSBlbnRpcmUgZmlsZS4KKyAgICBpZiAoIXN0cmluZ3AodHh0KSAmJiBmaWxlX3NpemUoZmlsZSkgPCBUQUlMX01BWF9CWVRFUys4MCkKKyAgICAgIHR4dCA9IHJlYWRfZmlsZShmaWxlKTsKKyAgICAvLyBFeGl0IGlmIHN0aWxsIG5vdGhpbmcgY291bGQgYmUgcmVhZC4KKyAgICBpZiAoIXN0cmluZ3AodHh0KSkKKyAgICAgIHJldHVybiAwOworCisgICAgLy8gY3V0IG9mZiBmaXJzdCAoaW5jb21wbGV0ZSkgbGluZQorICAgIGludCBpbmRleCA9IHN0cnN0cih0eHQsICJcbiIpOworICAgIGlmIChpbmRleCA+IC0xKSB7CisgICAgICAgIGlmIChpbmRleCArIDEgPCBzaXplb2YodHh0KSkKKyAgICAgICAgICAgIHR4dCA9IHR4dFtpbmRleCsxLi5dOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0eHQgPSAiIjsKKyAgICB9CisKKyAgICBlZnVuOjp0ZWxsX29iamVjdCh0aGlzX3BsYXllcigpLCB0eHQpOworCisgICAgcmV0dXJuIDE7Cit9CisjdW5kZWYgVEFJTF9NQVhfQllURVMKKyNlbmRpZiAvLyBfX1ZFUlNJT05fXyA+ICIzLjMuNzE5IgorCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9kZWJ1Z19pbmZvLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9kZWJ1Z19pbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYwN2MyZgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL2RlYnVnX2luZm8uYwpAQCAtMCwwICsxLDQzNCBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIGRlYnVnX2luZm8oKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18oZGVidWdfaW5mbykKKworI2luY2x1ZGUgPGRyaXZlcl9pbmZvLmg+CisjaW5jbHVkZSA8ZGVidWdfaW5mby5oPgorCittaXhlZCBkZWJ1Z19pbmZvKGludCB3aGF0LCB2YXJhcmdzIG1peGVkKiBhcmdzKQoreworICAgIGlmIChzaXplb2YoYXJncykgPiAyKQorICAgICAgICByYWlzZV9lcnJvcigiVG9vIG1hbnkgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOworCisgICAgc3dpdGNoKHdoYXQpCisgICAgeworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiSWxsZWdhbCB2YWx1ZSAlZCBmb3IgZGVidWdfaW5mbygpLlxuIiwgd2hhdCkpOworCisgICAgICAgIGNhc2UgRElORk9fT0JKRUNUOgorICAgICAgICB7CisgICAgICAgICAgICBvYmplY3Qgb2I7CisKKyAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgIT0gMSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7CisgICAgICAgICAgICBpZiAoIW9iamVjdHAoYXJnc1swXSkpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZyBhcmcgMiB0byBkZWJ1Z19pbmZvKCkuXG4iKTsKKworICAgICAgICAgICAgb2IgPSBhcmdzWzBdOworICAgICAgICAgICAgcHJpbnRmKCJPX0hFQVJUX0JFQVQgICAgICA6ICVzXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0NfSEVBUlRfQkVBVCkgICAgICAgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgICAgICAgIHByaW50ZigiT19FTkFCTEVfQ09NTUFORFMgOiAlc1xuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9DX0NPTU1BTkRTX0VOQUJMRUQpID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICAgICAgICBwcmludGYoIk9fQ0xPTkUgICAgICAgICAgIDogJXNcbiIsIGVmdW46OmNsb25lcChvYikgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICJUUlVFIiA6ICJGQUxTRSIpOworICAgICAgICAgICAgcHJpbnRmKCJPX0RFU1RSVUNURUQgICAgICA6IEZBTFNFXG4iKTsKKyAgICAgICAgICAgIHByaW50ZigiT19TV0FQUEVEICAgICAgICAgOiAlc1xuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NXQVBQRUQpICAgICAgICAgID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICAgICAgICBwcmludGYoIk9fT05DRV9JTlRFUkFDVElWRTogJXNcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PTkNFX0lOVEVSQUNUSVZFKSA/ICJUUlVFIiA6ICJGQUxTRSIpOworICAgICAgICAgICAgcHJpbnRmKCJPX1JFU0VUX1NUQVRFICAgICA6ICVzXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUkVTRVRfU1RBVEUpICAgICAgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgICAgICAgIHByaW50ZigiT19XSUxMX0NMRUFOX1VQICAgOiAlc1xuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1dJTExfQ0xFQU5fVVApICAgID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICAgICAgICBwcmludGYoIk9fUkVQTEFDRUQgICAgICAgIDogJXNcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9SRVBMQUNFRCkgICAgICAgICA/ICJUUlVFIiA6ICJGQUxTRSIpOworICAgICAgICAgICAgcHJpbnRmKCJ0aW1lX3Jlc2V0ICA6ICVkXG4iLCAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTkVYVF9SRVNFVF9USU1FKSk7CisgICAgICAgICAgICBwcmludGYoInRpbWVfb2ZfcmVmIDogJWRcbiIsICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9MQVNUX1JFRl9USU1FKSk7CisgICAgICAgICAgICBwcmludGYoInJlZiAgICAgICAgIDogJWRcbiIsICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfUkVGUykpOworCisgICAgICAgICAgICBpbnQgZ3RpY2tzID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0dJR0FUSUNLUyk7CisgICAgICAgICAgICBpZihndGlja3MpCisgICAgICAgICAgICAgICAgcHJpbnRmKCJldmFsY29zdCAgIDogICVkJTA5ZFxuIiwgZ3RpY2tzLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfVElDS1MpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwcmludGYoImV2YWxjb3N0ICAgOiAgJWRcbiIsICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1RJQ0tTKSk7CisKKyAgICAgICAgICAgIHByaW50Zigic3dhcF9udW0gICAgOiAlZFxuIiwgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NXQVBfTlVNKSk7CisgICAgICAgICAgICBwcmludGYoIm5hbWUgICAgICAgIDogJyVzJ1xuIiwgICAgIGVmdW46Om9iamVjdF9uYW1lKG9iKSk7CisgICAgICAgICAgICBwcmludGYoImxvYWRfbmFtZSAgIDogJyVzJ1xuIiwgICAgIGVmdW46OmxvYWRfbmFtZShvYikpOworCisgICAgICAgICAgICBvYmplY3QgbmV4dF9vYiA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfTkVYVCk7CisgICAgICAgICAgICBpZiAobmV4dF9vYikKKyAgICAgICAgICAgICAgICBwcmludGYoIm5leHRfYWxsICAgIDogT0JKKCVzKVxuIiwgZWZ1bjo6b2JqZWN0X25hbWUobmV4dF9vYikpOworCisgICAgICAgICAgICBvYmplY3QgcHJldl9vYiA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfUFJFVik7CisgICAgICAgICAgICBpZiAocHJldl9vYikKKyAgICAgICAgICAgICAgICBwcmludGYoIlByZXZpb3VzIG9iamVjdCBpbiBvYmplY3QgbGlzdDogT0JKKCVzKVxuIiwgZWZ1bjo6b2JqZWN0X25hbWUocHJldl9vYikpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHByaW50ZigiVGhpcyBvYmplY3QgaXMgdGhlIGhlYWQgb2YgdGhlIG9iamVjdCBsaXN0LlxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRElORk9fTUVNT1JZOgorICAgICAgICB7CisgICAgICAgICAgICBvYmplY3Qgb2I7CisKKyAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgIT0gMSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7CisgICAgICAgICAgICBpZiAoIW9iamVjdHAoYXJnc1swXSkpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZyBhcmcgMiB0byBkZWJ1Z19pbmZvKCkuXG4iKTsKKworICAgICAgICAgICAgb2IgPSBhcmdzWzBdOworCisgICAgICAgICAgICBwcmludGYoInByb2dyYW0gcmVmJ3MgJTNkXG4iLCAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9QUk9HX1JFRlMpKTsKKyAgICAgICAgICAgIHByaW50ZigiTmFtZTogJyVzJ1xuIiwgICAgICAgICAgZWZ1bjo6cHJvZ3JhbV9uYW1lKG9iKSk7CisgICAgICAgICAgICBwcmludGYoInByb2dyYW0gc2l6ZSAgICAlNmRcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9QUk9HX1NJWkUpKTsKKyAgICAgICAgICAgIHByaW50ZigibnVtIGZ1bmMnczogICUzZCAoJTRkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9GVU5DVElPTlMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9GVU5DVElPTlMpKTsKKyAgICAgICAgICAgIHByaW50ZigibnVtIHZhcnM6ICAgICUzZCAoJTRkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9WQVJJQUJMRVMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9WQVJJQUJMRVMpKTsKKworICAgICAgICAgICAgcHJpbnRmKCJudW0gc3RyaW5nczogJTNkICglNGQpIDogb3ZlcmhlYWQgJWQgKyBkYXRhICVkICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fU1RSSU5HUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1NUUklOR1MpICsgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HU19EQVRBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1NUUklOR1NfREFUQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1NUUklOR1NfREFUQV9UT1RBTCkpOworCisgICAgICAgICAgICBwcmludGYoIm51bSBpbmhlcml0cyAlM2QgKCU0ZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fSU5IRVJJVEVEKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfSU5IRVJJVEVEKSk7CisKKyAgICAgICAgICAgIHByaW50ZigidG90YWwgc2l6ZSAgICAgICU2ZFxuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1BST0dfU0laRV9UT1RBTCkpOworCisgICAgICAgICAgICBwcmludGYoImRhdGEgc2l6ZSAgICAgICAlNmQgKCU2ZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0RBVEFfU0laRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9EQVRBX1NJWkVfVE9UQUwpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBESU5GT19PQkpMSVNUOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpID09IDApCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOworCisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpID09IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb2JqZWN0ICogb2JzID0gZWZ1bjo6b2JqZWN0cyhhcmdzWzBdLCAxKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gb2JzWzBdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBlZnVuOjpvYmplY3RzKGFyZ3NbMF0sIGFyZ3NbMV0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIERJTkZPX01BTExPQzoKKyAgICAgICAgICAgIHdyaXRlKGRlYnVnX2luZm8oRElORk9fU1RBVFVTLCAibWFsbG9jIikpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBESU5GT19TVEFUVVM6CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyB3aGljaDsKKyAgICAgICAgICAgIGludCBvcHQ7CisKKyAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgPiAxKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKKworICAgICAgICAgICAgaWYgKCFzaXplb2YoYXJncykgfHwgIWFyZ3NbMF0pCisgICAgICAgICAgICAgICAgd2hpY2ggPSAiIjsKKyAgICAgICAgICAgIGVsc2UgaWYoc3RyaW5ncChhcmdzWzBdKSkKKyAgICAgICAgICAgICAgICB3aGljaCA9IGFyZ3NbMF07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZyBhcmcgMiB0byBkZWJ1Z19pbmZvKCkuXG4iKTsKKworICAgICAgICAgICAgc3dpdGNoKHdoaWNoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgIiI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX01FTU9SWTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICJ0YWJsZXMiOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9UQUJMRVM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAic3dhcCI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX1NXQVA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAibWFsbG9jIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfTUFMTE9DOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgIm1hbGxvYyBleHRzdGF0cyI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX01BTExPQ19FWFRFTkRFRDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKG9wdCk7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIERJTkZPX0RVTVA6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBvcHQ7CisKKyAgICAgICAgICAgIGlmICghc2l6ZW9mKGFyZ3MpKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKKworICAgICAgICAgICAgaWYoIXN0cmluZ3AoYXJnc1swXSkpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZyBhcmcgMiB0byBkZWJ1Z19pbmZvKCkuXG4iKTsKKworICAgICAgICAgICAgc3dpdGNoKGFyZ3NbMF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAib2JqZWN0cyI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERESV9PQkpFQ1RTOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgImRlc3RydWN0ZWQiOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBERElfT0JKRUNUU19ERVNUUlVDVEVEOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgIm9wY29kZXMiOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBERElfT1BDT0RFUzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICJtZW1vcnkiOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBERElfTUVNT1JZOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIkJhZCBhcmd1bWVudCAnJXMnIHRvIGRlYnVnX2luZm8oRElORk9fRFVNUCkuXG4iLCBhcmdzWzBdKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHVtcF9kcml2ZXJfaW5mbyhvcHQsIGFyZ3NbMS4uMV0uLi4pOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBESU5GT19EQVRBOgorICAgICAgICB7CisgICAgICAgICAgICBtaXhlZCAqIHJlc3VsdDsKKworICAgICAgICAgICAgaWYgKCFzaXplb2YoYXJncykpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOworCisgICAgICAgICAgICBpZiAoIWludHAoYXJnc1swXSkpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZyBhcmcgMiB0byBkZWJ1Z19pbmZvKCkuXG4iKTsKKworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSA9PSAyICYmICFpbnRwKGFyZ3NbMV0pKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWcgYXJnIDMgdG8gZGVidWdfaW5mbygpLlxuIik7CisKKyAgICAgICAgICAgIHN3aXRjaChhcmdzWzBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgRElEX1NUQVRVUzoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYWxsb2NhdGUoRElEX1NUQVRVU19NQVgpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQUNUSU9OU10gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9BQ1RJT05TKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BQ1RJT05TX1NJWkVdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9BQ1RJT05TKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TSEFET1dTXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NIQURPV1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NIQURPV1NfU0laRV0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NIQURPV1MpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU10gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX1NJWkVdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9PQkpFQ1RTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX1NXQVBQRURdICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFNfU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19TV0FQX1NJWkVdICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfT0JKRUNUU19TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX0xJU1RdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFNfSU5fTElTVCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19ORVdMWV9ERVNUXSAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RTX05FV0xZX0RFU1RSVUNURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfREVTVFJVQ1RFRF0gICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19ERVNUUlVDVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX1BST0NFU1NFRF0gICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFNfTEFTVF9QUk9DRVNTRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfQVZHX1BST0NdICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9MT0FEX0FWRVJBR0VfUFJPQ0VTU0VEX09CSkVDVFNfUkVMQVRJVkUpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT1RBQkxFXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RTX0lOX1RBQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PVEFCTEVfU0xPVFNdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVF9UQUJMRV9TTE9UUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT1RBQkxFX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfT0JKRUNUX1RBQkxFKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hCRUFUX09CSlNdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSEVBUlRCRUFUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEJFQVRfQ0FMTFNdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9IRUFSVEJFQVRfQUNUSVZFX0NZQ0xFUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEJFQVRfQ0FMTFNfVE9UQUxdICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9IRUFSVEJFQVRfVE9UQUxfQ1lDTEVTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQkVBVF9TTE9UU10gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hCRUFUX1NJWkVdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0hFQVJUQkVBVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hCRUFUX1BST0NFU1NFRF0gICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSEVBUlRCRUFUU19MQVNUX1BST0NFU1NFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEJFQVRfQVZHX1BST0NdICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX0xPQURfQVZFUkFHRV9QUk9DRVNTRURfSEVBUlRCRUFUU19SRUxBVElWRSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9DQUxMT1VUU10gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0NBTExPVVRTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9DQUxMT1VUX1NJWkVdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9DQUxMT1VUUyk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BUlJBWVNdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0FSUkFZUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQVJSQVlTX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfQVJSQVlTKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX01BUFBJTkdTXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUFQUElOR1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX01BUFBJTkdTX1NJWkVdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX01BUFBJTkdTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IWUJSSURfTUFQUElOR1NdICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01BUFBJTkdTX0hZQlJJRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEFTSF9NQVBQSU5HU10gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NQVBQSU5HU19IQVNIKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUlVDVFNdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSVUNUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSVUNUU19TSVpFXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1RSVUNUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSVUNUX1RZUEVTXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJVQ1RfVFlQRVMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUlVDVF9UWVBFU19TSVpFXSAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUlVDVF9UWVBFUyk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9QUk9HU10gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1BST0dTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9QUk9HU19TSVpFXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9QUk9HUyk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9QUk9HU19TV0FQUEVEXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1BST0dTX1NXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BST0dTX1NXQVBfU0laRV0gICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1BST0dTX1NXQVBQRUQpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfVVNFUl9SRVNFUlZFXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX01FTU9SWV9SRVNFUlZFX1VTRVIpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX01BU1RFUl9SRVNFUlZFXSAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9NRU1PUllfUkVTRVJWRV9NQVNURVIpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NZU1RFTV9SRVNFUlZFXSAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9NRU1PUllfUkVTRVJWRV9TWVNURU0pOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQUREX01FU1NBR0VdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRVNTQUdFU19PVVQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BBQ0tFVFNdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUEFDS0VUU19PVVQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BBQ0tFVF9TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1BBQ0tFVFNfT1VUKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9QQUNLRVRTX0lOXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1BBQ0tFVFNfSU4pOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BBQ0tFVF9TSVpFX0lOXSAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1BBQ0tFVFNfSU4pOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQVBQTFldICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9GVU5DVElPTl9OQU1FX0NBTExTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BUFBMWV9ISVRTXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0ZVTkNUSU9OX05BTUVfQ0FMTF9ISVRTKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUklOR1NdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fVklSVFVBTF9TVFJJTkdTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJJTkdfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TVFJJTkdTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfVEFCTEVfU0laRV0gICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TVFJJTkdfVEFCTEUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9PVkVSSEVBRF0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUklOR19PVkVSSEVBRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfVU5UQUJMRURdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdTX1VOVEFCTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9VTlRBQkxFRF9TSVpFXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TVFJJTkdTX1VOVEFCTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9UQUJMRURdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR1NfVEFCTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9UQUJMRURfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TVFJJTkdTX1RBQkxFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX1NFQVJDSEVTXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfTE9PS1VQU19CWV9JTkRFWCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX1NFQVJDSExFTl0gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfTE9PS1VQX1NURVBTX0JZX0lOREVYKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfU0VBUkNIRVNfQllWQUxVRV0gID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9MT09LVVBTX0JZX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfU0VBUkNITEVOX0JZVkFMVUVdID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9MT09LVVBfU1RFUFNfQllfVkFMVUUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9DSEFJTlNdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX1NMT1RTX1VTRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9BRERFRF0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX1NUUklOR1NfQURERUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9ERUxFVEVEXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX1NUUklOR1NfUkVNT1ZFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX0NPTExJU0lPTlNdICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfQ09MTElTSU9OUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX0ZPVU5EXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfSElUU19CWV9JTkRFWCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX0ZPVU5EX0JZVkFMVUVdICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfSElUU19CWV9WQUxVRSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9SWF9DQUNIRURdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1JFR0VYKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9SWF9UQUJMRV0gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1JFR0VYX1RBQkxFX1NMT1RTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9SWF9UQUJMRV9TSVpFXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9SRUdFWCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUlhfUkVRVUVTVFNdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9SRUdFWF9MT09LVVBTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9SWF9SRVFfRk9VTkRdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1JFR0VYX0xPT0tVUF9ISVRTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9SWF9SRVFfQ09MTF0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1JFR0VYX0xPT0tVUF9DT0xMSVNJT05TKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX01CX0ZJTEVdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0JVRkZFUl9GSUxFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9NQl9TV0FQXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9CVUZGRVJfU1dBUCk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9CT09UX1RJTUVdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfQk9PVF9USU1FKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIERJRF9TV0FQOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBhbGxvY2F0ZShESURfU1dBUF9NQVgpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfUFJPR1NdICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9QUk9HU19TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19QUk9HX1NJWkVdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9QUk9HU19TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19QUk9HX1VOU1dBUFBFRF0gICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1BST0dTX1VOU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfUFJPR19VX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUFJPR1NfVU5TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19WQVJTXSAgICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFNfU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfVkFSX1NJWkVdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfT0JKRUNUU19TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19GUkVFXSAgICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NXQVBfQkxPQ0tTX0ZSRUUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX0ZSRUVfU0laRV0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NXQVBfQkxPQ0tTX0ZSRUUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX0ZJTEVfU0laRV0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NXQVBfQkxPQ0tTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19SRVVTRURdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TV0FQX0JMT0NLU19SRVVTRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1NFQVJDSEVTXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1dBUF9CTE9DS1NfUkVVU0VfTE9PS1VQUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfU0VBUkNIX0xFTl0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TV0FQX0JMT0NLU19SRVVTRV9MT09LVVBfU1RFUFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX0ZfU0VBUkNIRVNdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1dBUF9CTE9DS1NfRlJFRV9MT09LVVBTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19GX1NFQVJDSF9MRU5dICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NXQVBfQkxPQ0tTX0ZSRUVfTE9PS1VQX1NURVBTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19DT01QQUNUXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRENfU1dBUF9DT01QQUNUX01PREUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1JFQ1lDTEVfRlJFRV0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TV0FQX1JFQ1lDTEVfUEhBU0UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgRElEX01FTU9SWToKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYWxsb2NhdGUoRElEX01FTU9SWV9NQVgpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX05BTUVdICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX01FTU9SWV9BTExPQ0FUT1JfTkFNRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NCUktdICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TWVNfQUxMT0NBVEVEX0JMT0NLUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NCUktfU0laRV0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1lTX0FMTE9DQVRFRF9CTE9DS1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9MQVJHRV0gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTEFSR0VfQkxPQ0tTX0FMTE9DQVRFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0xBUkdFX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTEFSR0VfQkxPQ0tTX0FMTE9DQVRFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0xGUkVFXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9MQVJHRV9CTE9DS1NfRlJFRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0xGUkVFX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTEFSR0VfQkxPQ0tTX0ZSRUUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9MV0FTVEVEXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTEFSR0VfQkxPQ0tTX1dBU1RFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTFdBU1RFRF9TSVpFXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9MQVJHRV9CTE9DS1NfV0FTVEUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9DSFVOS10gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU01BTExfQkxPQ0tfQ0hVTktTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fQ0hVTktfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TTUFMTF9CTE9DS19DSFVOS1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9TTUFMTF0gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU01BTExfQkxPQ0tTX0FMTE9DQVRFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NNQUxMX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU01BTExfQkxPQ0tTX0FMTE9DQVRFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NGUkVFXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TTUFMTF9CTE9DS1NfRlJFRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NGUkVFX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU01BTExfQkxPQ0tTX0ZSRUUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9TV0FTVEVEXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU01BTExfQkxPQ0tTX1dBU1RFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU1dBU1RFRF9TSVpFXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TTUFMTF9CTE9DS1NfV0FTVEUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9NSU5DX0NBTExTXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSU5DUkVNRU5UX1NJWkVfQ0FMTFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9NSU5DX1NVQ0NFU1NdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSU5DUkVNRU5UX1NJWkVfQ0FMTF9TVUNDRVNTRVMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9NSU5DX1NJWkVdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0lOQ1JFTUVOVF9TSVpFX0NBTExfRElGRlMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9QRVJNXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fVU5NQU5BR0VEX0JMT0NLUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1BFUk1fU0laRV0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfVU5NQU5BR0VEX0JMT0NLUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0NMSUJdICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9SRVBMQUNFTUVOVF9NQUxMT0NfQ0FMTFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9DTElCX1NJWkVdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1JFUExBQ0VNRU5UX01BTExPQ19DQUxMUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX09WRVJIRUFEXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU01BTExfQkxPQ0tfT1ZFUkhFQUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9BTExPQ0FURURdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX01FTU9SWV9VU0VEKSArIGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTUVNT1JZX09WRVJIRUFEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fVVNFRF0gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9NRU1PUllfVVNFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1RPVEFMX1VOVVNFRF0gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTUVNT1JZX1VOVVNFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0RFRlJBR19DQUxMU10gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRU1PUllfREVGUkFHTUVOVEFUSU9OX0NBTExTX0ZVTEwpICsgZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQ0FMTFNfVEFSR0VURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9ERUZSQUdfQ0FMTFNfUkVRXSAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVNT1JZX0RFRlJBR01FTlRBVElPTl9DQUxMU19UQVJHRVRFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0RFRlJBR19SRVFfU1VDQ0VTU10gICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRU1PUllfREVGUkFHTUVOVEFUSU9OX0NBTExfVEFSR0VUX0hJVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9ERUZSQUdfQkxPQ0tTX0lOU1BFQ1RFRF0gPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVNT1JZX0RFRlJBR01FTlRBVElPTl9CTE9DS1NfSU5TUEVDVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fREVGUkFHX0JMT0NLU19NRVJHRURdID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQkxPQ0tTX01FUkdFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0RFRlJBR19CTE9DS1NfUkVTVUxUXSA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRU1PUllfREVGUkFHTUVOVEFUSU9OX0JMT0NLU19SRVNVTFRJTkcpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9BVkxfTk9ERVNdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fRlJFRV9CTE9DS1NfQVZMX05PREVTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fRVhUX1NUQVRJU1RJQ1NdICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTUVNT1JZX0VYVEVOREVEX1NUQVRJU1RJQ1MpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSA9PSAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpZHggPSBhcmdzWzBdOworICAgICAgICAgICAgICAgIGlmIChpZHggPCAwIHx8IGlkeCA+PSBzaXplb2YocmVzdWx0KSkKKyAgICAgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiSWxsZWdhbCBpbmRleCBmb3IgZGVidWdfaW5mbygpOiAlZCwgZXhwZWN0ZWQgMC4uJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpZHgsIHNpemVvZihyZXN1bHQpLTEpKTsKKworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRbaWR4XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBESU5GT19UUkFDRToKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHdoaWNoID0gRElUX0NVUlJFTlQ7CisKKyAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgPiAxKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKKyAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFpbnRwKGFyZ3NbMF0pKQorICAgICAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOworICAgICAgICAgICAgICAgIHdoaWNoID0gYXJnc1swXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoICh3aGljaCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIERJVF9DVVJSRU5UOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfVFJBQ0VfQ1VSUkVOVCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIERJVF9FUlJPUjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKERJX1RSQUNFX0xBU1RfRVJST1IpIHx8ICh7ICJObyB0cmFjZS4iIH0pOworCisgICAgICAgICAgICAgICAgY2FzZSBESVRfVU5DQVVHSFRfRVJST1I6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9UUkFDRV9MQVNUX1VOQ0FVR0hUX0VSUk9SKSB8fCAoeyAiTm8gdHJhY2UuIiB9KTsKKworICAgICAgICAgICAgICAgIGNhc2UgRElUX1NUUl9DVVJSRU5UOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfVFJBQ0VfQ1VSUkVOVF9BU19TVFJJTkcpOworCisgICAgICAgICAgICAgICAgY2FzZSBESVRfQ1VSUkVOVF9ERVBUSDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKERJX1RSQUNFX0NVUlJFTlRfREVQVEgpOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBhcmcgMiB0byBkZWJ1Z19pbmZvKCkuXG4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBESU5GT19FVkFMX05VTUJFUjoKKyAgICAgICAgICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9FVkFMX05VTUJFUik7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL2VuYWJsZV9jb21tYW5kcy5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvZW5hYmxlX2NvbW1hbmRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQxYzk2MwotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL2VuYWJsZV9jb21tYW5kcy5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qIFRoZXNlIHNlZnVucyBhcmUgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1bnMgZW5hYmxlX2NvbW1hbmRzKCkKKyAqIGFuZCBkaXNhYmxlX2NvbW1hbmRzKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaW5jbHVkZSA8Y29uZmlndXJhdGlvbi5oPgorCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKGVuYWJsZV9jb21tYW5kcykKKwordm9pZCBlbmFibGVfY29tbWFuZHMoKQoreworICAgIG9iamVjdCBvYiA9IGVmdW46OnByZXZpb3VzX29iamVjdCgpOworCisgICAgZWZ1bjo6Y29uZmlndXJlX29iamVjdChvYiwgT0NfQ09NTUFORFNfRU5BQkxFRCwgMSk7CisgICAgZWZ1bjo6c2V0X3RoaXNfcGxheWVyKG9iKTsKK30KKworI2VuZGlmCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18oZGlzYWJsZV9jb21tYW5kcykKKwordm9pZCBkaXNhYmxlX2NvbW1hbmRzKCkKK3sKKyAgICBvYmplY3Qgb2IgPSBlZnVuOjpwcmV2aW91c19vYmplY3QoKTsKKworICAgIGVmdW46OmNvbmZpZ3VyZV9vYmplY3Qob2IsIE9DX0NPTU1BTkRTX0VOQUJMRUQsIDApOworICAgIGVmdW46OnNldF90aGlzX3BsYXllcigwKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9oYXNoLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9oYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFiYmY2MAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL2hhc2guYwpAQCAtMCwwICsxLDE3IEBACisjaW5jbHVkZSAiL3N5cy90bHMuaCIKKworZGVwcmVjYXRlZCBzdHJpbmcgbWQ1KG1peGVkIGFyZywgdmFyYXJncyBtaXhlZCogaXRlcmF0aW9ucykKK3sKKyAgICBpZiAoZXh0ZXJuX2NhbGwoKSkKKyAgICAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisKKyAgICByZXR1cm4gaGFzaChUTFNfSEFTSF9NRDUsIGFyZywgaXRlcmF0aW9ucy4uLik7Cit9CisKK2RlcHJlY2F0ZWQgc3RyaW5nIHNoYTEobWl4ZWQgYXJnLCB2YXJhcmdzIG1peGVkKiBpdGVyYXRpb25zKQoreworICAgIGlmIChleHRlcm5fY2FsbCgpKQorICAgICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKworICAgIHJldHVybiBoYXNoKFRMU19IQVNIX1NIQTEsIGFyZywgaXRlcmF0aW9ucy4uLik7Cit9CmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9saXZpbmdzLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9saXZpbmdzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYwZmNlZQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL2xpdmluZ3MuYwpAQCAtMCwwICsxLDM0OCBAQAorLy8gKiBsaXZpbmdfbmFtZS1CZWhhbmRsdW5nCisKKyNkZWZpbmUgY2xlYW5fbG9nKHMpCisvLyNkZWZpbmUgY2xlYW5fbG9nKHMpIGxvZ19maWxlKCJDTEVBTl9TSU0iLGN0aW1lKHRpbWUoKSlbNC4uMThdKyI6ICIrKHMpKTsKKworcHJpdmF0ZSBub3NhdmUgbWFwcGluZyBsaXZpbmdfbmFtZV9tLCBuYW1lX2xpdmluZ19tLCBuZXRkZWFkOworCitwcml2YXRlIHZvaWQgSW5pdExpdmluZ0RhdGEobWl4ZWQgd2l6aW5mbykgeworICAvLyBsaXZpbmdfbmFtZSBpc3QgZWluIFBvaW50ZXIgZGVyIGF1Y2ggaW4gZGVyIGV4dHJhX3dpemluZm8gZ2VoYWx0ZW4gCisgIC8vIHdpcmQsIHNvIGthbm4gZGllIHNpbXVsX2VmdW4gbmV1IGdlbGFkZW4gd2VyZGVuLCBvaG5lIGRhc3MgZGllc2VzCisgIC8vIE1hcHBpbmcgdmVybG9yZW4gZ2VodAorICBpZiAoIW1hcHBpbmdwKGxpdmluZ19uYW1lX20gPSB3aXppbmZvW0xJVklOR19OQU1FXSkpCisgICAgbGl2aW5nX25hbWVfbSA9IHdpemluZm9bTElWSU5HX05BTUVdID0gbV9hbGxvY2F0ZSgwLCAxKTsKKworICAvLyBHbGVpY2hlcyBnaWx0IGZ1ZXIgZGFzIE1hcHBpbmcgTmFtZS1MaXZpbmcKKyAgaWYgKCFtYXBwaW5ncChuYW1lX2xpdmluZ19tID0gd2l6aW5mb1tOQU1FX0xJVklOR10pKQorICAgIG5hbWVfbGl2aW5nX20gPSB3aXppbmZvW05BTUVfTElWSU5HXSA9IG1fYWxsb2NhdGUoMCwgMSk7CisKKyAgLy8gTmV0enRvdGUgc2luZCBlYmVuZmFsbHMgaW4gZGVyIGV4dHJhX3dpemluZm8KKyAgaWYgKCFtYXBwaW5ncChuZXRkZWFkID0gd2l6aW5mb1tORVRERUFEX01BUF0pKQorICAgIG5ldGRlYWQgPSB3aXppbmZvW05FVERFQURfTUFQXSA9IChbXSk7Cit9CisKK3B1YmxpYyB2YXJhcmdzIHN0cmluZyBnZXR1dWlkKCBvYmplY3Qgb2IgKQoreworICAgIG1peGVkICpyZXQ7CisKKyAgICBpZiAoICFvYmplY3RwKG9iKSApCisgICAgICAgb2IgPSBwcmV2aW91c19vYmplY3QoKTsKKworICAgIGlmICggIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2IpICkKKyAgICAgICByZXR1cm4gZ2V0dWlkKG9iKTsKKworICAgIHJldCA9IChtaXhlZCltYXN0ZXIoKS0+Z2V0X3VzZXJpbmZvKCBnZXR1aWQob2IpICk7CisKKyAgICBpZiAoICFwb2ludGVycChyZXQpIHx8IHNpemVvZihyZXQpIDwgNSApCisgICAgICAgcmV0dXJuIGdldHVpZChvYik7CisKKyAgICAvLyBVc2VybmFtZSArICJfIiArIENyZWF0aW9uRGF0ZQorICAgIHJldHVybiByZXRbMF0gKyAiXyIgKyByZXRbNV07Cit9CisKK3ZvaWQgc2V0X29iamVjdF9saXZpbmdfbmFtZShzdHJpbmcgbGl2bmFtZSwgb2JqZWN0IG9iaikKK3sKKyAgc3RyaW5nIG9sZDsKKyAgbWl4ZWQgYTsKKyAgaW50IGk7CisKKyAgaWYgKHByZXZpb3VzX29iamVjdCgpPT1vYmogfHwgcHJldmlvdXNfb2JqZWN0KCk9PXRoaXNfb2JqZWN0KCkgfHwKKyAgICAgIHByZXZpb3VzX29iamVjdCgpPT1tYXN0ZXIoKSkKKyAgeworICAgIGlmKCFsaXZuYW1lIHx8ICFzdHJpbmdwKGxpdm5hbWUpKSB7CisgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiJU86IGlsbGVnYWwgbGl2aW5nIG5hbWU6ICVPXG4iLCBvYmosIGxpdm5hbWUpKTsKKyAgICB9CisgICAgaWYgKG9sZCA9IGxpdmluZ19uYW1lX21bb2JqXSkgeworICAgICAgaWYgKHBvaW50ZXJwKGEgPSBuYW1lX2xpdmluZ19tW29sZF0pKSB7CisgICAgICAgYVttZW1iZXIoYSwgb2JqKV0gPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICBtX2RlbGV0ZShuYW1lX2xpdmluZ19tLCBvbGQpOworICAgICAgfQorICAgIH0KKyAgICBsaXZpbmdfbmFtZV9tW29ial0gPSBsaXZuYW1lOworICAgIGlmIChhID0gbmFtZV9saXZpbmdfbVtsaXZuYW1lXSkgeworICAgICAgaWYgKCFwb2ludGVycChhKSkgeworICAgICAgIG5hbWVfbGl2aW5nX21bbGl2bmFtZV0gPSAoe2EsIG9ian0pOworICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIC8qIFRyeSB0byByZWFsbG9jYXRlIGVudHJ5IGZyb20gZGVzdHJ1Y3RlZCBvYmplY3QgKi8KKyAgICAgIGlmICgoaSA9IG1lbWJlcihhLCAwKSkgPj0gMCkgeworICAgICAgIGFbaV0gPSBvYmo7CisgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgbmFtZV9saXZpbmdfbVtsaXZuYW1lXSA9IGEgKyAoe29ian0pOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBuYW1lX2xpdmluZ19tW2xpdm5hbWVdID0gb2JqOworICB9Cit9CisKK3ZvaWQgc2V0X2xpdmluZ19uYW1lKHN0cmluZyBsaXZuYW1lKQoreworICBzZXRfb2JqZWN0X2xpdmluZ19uYW1lKGxpdm5hbWUscHJldmlvdXNfb2JqZWN0KCkpOworfQorCit2b2lkIHJlbW92ZV9saXZpbmdfbmFtZSgpCit7CisgIHN0cmluZyBsaXZuYW1lOworCisgIGlmICghcHJldmlvdXNfb2JqZWN0KCkpCisgICAgcmV0dXJuOworICBpZiAobGl2bmFtZT1saXZpbmdfbmFtZV9tW3ByZXZpb3VzX29iamVjdCgpXSkKKyAgeworICAgIG1fZGVsZXRlKGxpdmluZ19uYW1lX20scHJldmlvdXNfb2JqZWN0KCkpOworICAgIGlmIChvYmplY3RwKG5hbWVfbGl2aW5nX21bbGl2bmFtZV0pKQorICAgIHsKKyAgICAgIGlmIChuYW1lX2xpdmluZ19tW2xpdm5hbWVdPT1wcmV2aW91c19vYmplY3QoKSkKKyAgICAgICBtX2RlbGV0ZShuYW1lX2xpdmluZ19tLGxpdm5hbWUpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAocG9pbnRlcnAobmFtZV9saXZpbmdfbVtsaXZuYW1lXSkpCisgICAgeworICAgICAgbmFtZV9saXZpbmdfbVtsaXZuYW1lXS09KHtwcmV2aW91c19vYmplY3QoKX0pOworICAgICAgaWYgKCFzaXplb2YobmFtZV9saXZpbmdfbVtsaXZuYW1lXSkpCisgICAgICAgbV9kZWxldGUobmFtZV9saXZpbmdfbSxsaXZuYW1lKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBfc2V0X25ldGRlYWQoKQoreworICBpZiAocXVlcnlfb25jZV9pbnRlcmFjdGl2ZShwcmV2aW91c19vYmplY3QoKSkpCisgICAgbmV0ZGVhZFtnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpXT1wcmV2aW91c19vYmplY3QoKTsKK30KKwordm9pZCBfcmVtb3ZlX25ldGRlYWQoKQoreworICBtX2RlbGV0ZShuZXRkZWFkLGdldHVpZChwcmV2aW91c19vYmplY3QoKSkpOworfQorCitvYmplY3QgZmluZF9uZXRkZWFkKHN0cmluZyB1dWlkKQoreworICBpbnQgaTsKKyAgc3RyaW5nIHVpZDsKKyAgLy8gV2VubiBzc2NhbmYoKSAyIGxpZWZlcnQsIGlzdCB1dWlkIGF1Y2ggbmUgdXVpZC4KKyAgaW50IGlzX3V1aWQgPSBzc2NhbmYodXVpZCwgIiVzXyVkIiwgdWlkLCBpKSA9PSAyOworICBpZiAoIWlzX3V1aWQpCisgICAgdWlkID0gdXVpZDsKKyAKKyAgaWYgKGlzX3V1aWQgJiYgZ2V0dXVpZChuZXRkZWFkW3VpZF0pICE9IHV1aWQpCisgICAgICByZXR1cm4gMDsKKworICByZXR1cm4gbmV0ZGVhZFt1aWRdOworfQorCitzdHJpbmcgKmR1bXBfbmV0ZGVhZCgpCit7CisgIHJldHVybiBtX2luZGljZXMobmV0ZGVhZCk7Cit9CisKK29iamVjdCBmaW5kX2xpdmluZyhzdHJpbmcgbGl2bmFtZSkgeworICBtaXhlZCAqYSwgcjsKKyAgaW50IGk7CisKKyAgaWYgKHBvaW50ZXJwKHIgPSBuYW1lX2xpdmluZ19tW2xpdm5hbWVdKSkgeworICAgIGlmIChtZW1iZXIociwwKT49MCkKKyAgICAgIHItPSh7MH0pOworICAgIGlmICghc2l6ZW9mKHIpKXsKKyAgICAgIG1fZGVsZXRlKG5hbWVfbGl2aW5nX20sbGl2bmFtZSk7CisgICAgICBjbGVhbl9sb2coc3ByaW50ZigiZmluZF9saXZpbmcgbG9lc2NodCAlc1xuIixsaXZuYW1lKSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCAhbGl2aW5nKHIgPSAoYSA9IHIpWzBdKSkgeworICAgICAgZm9yIChpID0gc2l6ZW9mKGEpOyAtLWk7KSB7CisgICAgICAgaWYgKGxpdmluZyhhWzxpXSkpIHsKKyAgICAgICAgIHIgPSBhWzxpXTsKKyAgICAgICAgIGFbPGldID0gYVswXTsKKyAgICAgICAgIHJldHVybiBhWzBdID0gcjsKKyAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByOworICB9CisgIHJldHVybiBsaXZpbmcocikgJiYgcjsKK30KKworb2JqZWN0ICpmaW5kX2xpdmluZ3Moc3RyaW5nIGxpdm5hbWUpCit7CisgIG1peGVkIHI7CisKKyAgaWYgKHBvaW50ZXJwKHI9bmFtZV9saXZpbmdfbVtsaXZuYW1lXSkpCisgICAgci09KHswfSk7CisgIGVsc2UKKyAgICBpZiAob2JqZWN0cChyKSkKKyAgICAgIHI9KHtyfSk7CisgIGlmICghcG9pbnRlcnAocil8fCFzaXplb2YocikpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiByOworfQorCitvYmplY3QgZmluZF9wbGF5ZXIoc3RyaW5nIHV1aWQpIHsKKyAgb2JqZWN0ICpvYmpzOworICBtaXhlZCByZXM7CisgIGludCBpOworICBzdHJpbmcgdWlkOworCisgIGlmICghc3RyaW5ncCh1dWlkKSkKKyAgICByZXR1cm4gMDsKKyAgLy8gV2VubiBzc2NhbmYoKSAyIGxpZWZlcnQsIGlzdCB1dWlkIGF1Y2ggbmUgdXVpZC4KKyAgaW50IGlzX3V1aWQgPSBzc2NhbmYodXVpZCwgIiVzXyVkIiwgdWlkLCBpKSA9PSAyOworICBpZiAoIWlzX3V1aWQpCisgICAgdWlkID0gdXVpZDsKKworICBpZiAocG9pbnRlcnAocmVzID0gbmFtZV9saXZpbmdfbVt1aWRdKSkgeworICAgIC8vIHplcnN0b2VydGUgT2JqZWt0ZSBnZ2YuIGVudGZlcm5lbgorICAgIGlmIChtZW1iZXIocmVzLDApPj0wKSB7CisgICAgICByZXMtPSh7MH0pOworICAgICAgbmFtZV9saXZpbmdfbVt1aWRdID0gcmVzOworICAgIH0KKyAgICAvLyBnZ2YuIE5hbWVuIG9obmUgT2JqZWt0ZSBlbnRmZXJuZW4uCisgICAgaWYgKCFzaXplb2YocmVzKSl7CisgICAgICBtX2RlbGV0ZShuYW1lX2xpdmluZ19tLHVpZCk7CisgICAgICBjbGVhbl9sb2coc3ByaW50ZigiZmluZF9wbGF5ZXIgbG9lc2NodCAlc1xuIix1aWQpKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBvYmpzID0gcmVzOworICAgIHJlcyA9IG9ianNbMF07CisgICAgLy8gV2VubiBkYXMgMC4gRWxlbWVudCBkZXIgU3BpZWxlciBpc3QsIHNpbmQgd2lyIGZlcnRpZy4gQW5zb25zdGVuIHN1Y2hlbgorICAgIC8vIHdpciBkZW4gU3BpZWxlciB1bmQgc2NoaWViZW4gaWhuIGFuIGRpZSAwLiBTdGVsbGUgaW0gQXJyYXkuCisgICAgaWYgKCAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShyZXMpKSB7CisgICAgICBmb3IgKGkgPSBzaXplb2Yob2Jqcyk7IC0taTspIHsKKyAgICAgICBpZiAob2Jqc1s8aV0gJiYgcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYmpzWzxpXSkpIHsKKyAgICAgICAgIHJlcyA9IG9ianNbPGldOworICAgICAgICAgb2Jqc1s8aV0gPSBvYmpzWzBdOworICAgICAgICAgb2Jqc1swXSA9IHJlczsKKyAgICAgICAgIGJyZWFrOworICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJlcyA9IChvYmplY3RwKHJlcykgJiYgcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShyZXMpKSA/IHJlcyA6IDA7CisgICAgfQorICAgIC8vIGVsc2U6IGluIHJlcyBzdGVodCBkZXIgU3BpZWxlciBzY2hvbi4KKyAgfQorICBlbHNlIGlmIChvYmplY3RwKHJlcykpIC8vIHIgaXN0IG5lbiBFaW56ZWxvYmpla3QKKyAgICByZXMgPSBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHJlcykgPyByZXMgOiAwOworCisgIC8vIHJlcyBpc3QgamV0enQgZ2dmLiBkZXIgU3BpZWxlci4gQWJlciB3ZW5uIGRlciBuZSBhbmRlcmUgYWxzIGRpZSBnZXN1Y2h0ZQorICAvLyBVVUlEIGhhdCwgaXN0IGRhcyBFcmdlYm5pcyB0cm90emRlbSAwLgorICBpZiAoaXNfdXVpZCAmJiBnZXR1dWlkKHJlcykhPXV1aWQpCisgICAgICByZXR1cm4gMDsKKworICAvLyBlbmRsaWNoIGdlZnVuZGVuCisgIHJldHVybiByZXM7Cit9CisKK3ByaXZhdGUgaW50IGNoZWNrX21hdGNoKCBzdHJpbmcgc3RyLCBpbnQgcGxheWVyc19vbmx5ICkKK3sKKyAgICBtaXhlZCBtYXRjaDsKKworICAgIGlmICggIShtYXRjaCA9IG5hbWVfbGl2aW5nX21bc3RyXSkgKQorICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCAhcG9pbnRlcnAobWF0Y2gpICkKKyAgICAgICBtYXRjaCA9ICh7IG1hdGNoIH0pOworCisgICAgbWF0Y2ggLT0gKHswfSk7CisKKyAgICBpZiAoIHNpemVvZihtYXRjaCkgKXsKKyAgICAgICBpZiAoIHBsYXllcnNfb25seSApCisgICAgICAgICAgIHJldHVybiBzaXplb2YoZmlsdGVyKCBtYXRjaCwgIydxdWVyeV9vbmNlX2ludGVyYWN0aXZlLyonKi8gKSkKKyAgICAgICAgICAgICAgPiAwOworICAgICAgIGVsc2UKKyAgICAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgbV9kZWxldGUoIG5hbWVfbGl2aW5nX20sIHN0ciApOworICAgIGNsZWFuX2xvZyggc3ByaW50ZigiY2hlY2tfbWF0Y2ggbG9lc2NodCAlc1xuIiwgc3RyKSApOworICAgIHJldHVybiAwOworfQorCisvL1RPRE86OiBzdHJpbmd8c3RyaW5nKiBleGNsdWRlCit2YXJhcmdzIG1peGVkIG1hdGNoX2xpdmluZyggc3RyaW5nIHN0ciwgaW50IHBsYXllcnNfb25seSwgbWl4ZWQgZXhjbHVkZSApCit7CisgICAgaW50IGksIHM7CisgICAgbWl4ZWQgbWF0Y2gsICp1c2VyOworCisgICAgaWYgKCAhc3RyIHx8IHN0ciA9PSAiIiApCisgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoICFwb2ludGVycChleGNsdWRlKSApCisgICAgICAgZXhjbHVkZSA9ICh7IGV4Y2x1ZGUgfSk7CisKKyAgICBpZiAoIG1lbWJlcihleGNsdWRlLCBzdHIpIDwgMCAmJiBjaGVja19tYXRjaChzdHIsIHBsYXllcnNfb25seSkgKQorICAgICAgIHJldHVybiBzdHI7CisKKyAgICB1c2VyID0gbV9pbmRpY2VzKG5hbWVfbGl2aW5nX20pOworICAgIHMgPSBzaXplb2Yoc3RyKTsKKyAgICBtYXRjaCA9IDA7CisKKyAgICBmb3IgKCBpID0gc2l6ZW9mKHVzZXIpOyBpLS07ICkKKyAgICAgICBpZiAoIHN0ciA9PSB1c2VyW2ldWzAuLnMtMV0gJiYgbWVtYmVyKCBleGNsdWRlLCB1c2VyW2ldICkgPCAwICkKKyAgICAgICAgICAgaWYgKCBtYXRjaCApCisgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBpZiAoIGNoZWNrX21hdGNoKHVzZXJbaV0sIHBsYXllcnNfb25seSkgKQorICAgICAgICAgICAgICAgICAgbWF0Y2ggPSB1c2VyW2ldOworCisgICAgaWYgKCAhbWF0Y2ggKQorICAgICAgIHJldHVybiAtMjsKKworICAgIHJldHVybiBtYXRjaDsKK30KKworbWl4ZWQgKmR1bXBfbGl2aW5ncygpCit7CisgIHJldHVybiBzb3J0X2FycmF5KG1faW5kaWNlcyhuYW1lX2xpdmluZ19tKSwjJz4pOworfQorCisvLyAqIHJlZ2VsbWFlc3NpZyBMaXN0ZW4gdm9uIEJhbGxhc3QgYmVmcmVpZW4KK3ByaXZhdGUgdm9pZCBjbGVhbl9uYW1lX2xpdmluZ19tKHN0cmluZyAqa2V5cywgaW50IGxlZnQsIGludCBudW0pCit7CisgIGludCBpLCBqOworICBtaXhlZCBhOworCisgIHdoaWxlIChsZWZ0ICYmIG51bS0tKQorICB7CisgICAgaWYgKHBvaW50ZXJwKGEgPSBuYW1lX2xpdmluZ19tW2tleXNbLS1sZWZ0XV0pICYmIG1lbWJlcihhLCAwKT49MCkKKyAgICB7CisgICAgICBhLT0oezB9KTsKKyAgICAgIG5hbWVfbGl2aW5nX21ba2V5c1tsZWZ0XV0gPSBhOworICAgIH0KKyAgICBpZiAoIWEgfHwgKHBvaW50ZXJwKGEpICYmICFzaXplb2YoYSkpKQorICAgIHsKKyAgICAgIGNsZWFuX2xvZygiVG9hc3RpbmcgIitrZXlzW2xlZnRdKyJcbiIpOworICAgICAgbV9kZWxldGUobmFtZV9saXZpbmdfbSwga2V5c1tsZWZ0XSk7CisgICAgfSBlbHNlIGNsZWFuX2xvZyhzcHJpbnRmKCJLRUVQSU5HICVzICglTylcbiIsa2V5c1tsZWZ0XSxwb2ludGVycChhKT9zaXplb2YoYSk6YSkpOworICB9CisgIGlmIChsZWZ0KQorICAgIGVmdW46OmNhbGxfb3V0KCMnY2xlYW5fbmFtZV9saXZpbmdfbSwgMSwga2V5cywgbGVmdCwgODApOworICBlbHNlCisgICAgY2xlYW5fbG9nKCJDbGVhbiBwcm9jZXNzIGZpbmlzaGVkXG4iKTsKK30KKworcHJpdmF0ZSB2b2lkIGNsZWFuX25ldGRlYWQoKSB7CisgIGludCBpOworICBzdHJpbmcgKnM7CisgIG9iamVjdCBvYjsKKworICBzPW1faW5kaWNlcyhuZXRkZWFkKTsKKyAgZm9yIChpPXNpemVvZihzKS0xO2k+PTA7aS0tKQorICAgIGlmICghb2JqZWN0cChvYj1uZXRkZWFkW3NbaV1dKSB8fCBpbnRlcmFjdGl2ZShvYikpCisgICAgICBtX2RlbGV0ZShuZXRkZWFkLHNbaV0pOworfQorCitwcml2YXRlIHZvaWQgQ2xlYW5MaXZpbmdEYXRhKCkgeworICBpZiAoZmluZF9jYWxsX291dCgjJ2NsZWFuX25hbWVfbGl2aW5nX20pIDwgMCkgeworICAgIGNsZWFuX2xvZygiU3RhcnRpbmcgY2xlYW4gcHJvY2Vzc1xuIik7CisgICAgZWZ1bjo6Y2FsbF9vdXQoIydjbGVhbl9uYW1lX2xpdmluZ19tLAorICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICBtX2luZGljZXMobmFtZV9saXZpbmdfbSksCisgICAgICAgICAgICAgICAgIHNpemVvZihuYW1lX2xpdmluZ19tKSwKKyAgICAgICAgICAgICAgICAgODAKKyAgICAgICAgICAgICAgICAgKTsKKyAgfQorICBlZnVuOjpjYWxsX291dCgjJ2NsZWFuX25ldGRlYWQsMik7Cit9CisKKyN1bmRlZiBjbGVhbl9sb2cKKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvb2JqZWN0X2luZm8uYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL29iamVjdF9pbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ3YzAwOQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL29iamVjdF9pbmZvLmMKQEAgLTAsMCArMSwxMDYgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSB0aGUgb2xkIHNlbWFudGljcyBvZiB0aGUgZWZ1biBvYmplY3RfaW5mbygpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmIF9fRUZVTl9ERUZJTkVEX18oZHJpdmVyX2luZm8pIC8qIE5ld2VyIHZlcnNpb24gaXMgdGhlcmUgKi8KKworI2luY2x1ZGUgPG9iamVjdGluZm8uaD4KKyNpbmNsdWRlIDxvYmplY3RfaW5mby5oPgorCittaXhlZCBvYmplY3RfaW5mbyhvYmplY3Qgb2IsIGludCB3aGF0LCB2YXJhcmdzIGludCogaW5kZXgpCit7CisgICAgbWl4ZWQgKiByZXN1bHQ7CisKKyAgICBpZiAoc2l6ZW9mKGluZGV4KSA+IDEpCisgICAgICAgIHJhaXNlX2Vycm9yKCJUb28gbWFueSBhcmd1bWVudHMgdG8gb2JqZWN0X2luZm9cbiIpOworCisgICAgc3dpdGNoKHdoYXQpCisgICAgeworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiSWxsZWdhbCB2YWx1ZSAlZCBmb3Igb2JqZWN0X2luZm8oKS5cbiIsIHdoYXQpKTsKKworICAgICAgICBjYXNlIE9JTkZPX0JBU0lDOgorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBhbGxvY2F0ZShPSUJfTUFYKTsKKworICAgICAgICAgICAgcmVzdWx0W09JQl9IRUFSVF9CRUFUXSAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0NfSEVBUlRfQkVBVCk7CisgICAgICAgICAgICByZXN1bHRbT0lCX0lTX1dJWkFSRF0gICAgICAgICA9IDA7ICAgLyogTm90IHN1cHBvcnRlZCBhbnltb3JlLiAqLworICAgICAgICAgICAgcmVzdWx0W09JQl9FTkFCTEVfQ09NTUFORFNdICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0NfQ09NTUFORFNfRU5BQkxFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lCX0NMT05FXSAgICAgICAgICAgICA9IGVmdW46OmNsb25lcChvYik7CisgICAgICAgICAgICByZXN1bHRbT0lCX0RFU1RSVUNURURdICAgICAgICA9IDA7ICAgLyogTm90IHBvc3NpYmxlIGFueW1vcmUuICovCisgICAgICAgICAgICByZXN1bHRbT0lCX1NXQVBQRURdICAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TV0FQUEVEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfT05DRV9JTlRFUkFDVElWRV0gID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09OQ0VfSU5URVJBQ1RJVkUpOworICAgICAgICAgICAgcmVzdWx0W09JQl9SRVNFVF9TVEFURV0gICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUkVTRVRfU1RBVEUpOworICAgICAgICAgICAgcmVzdWx0W09JQl9XSUxMX0NMRUFOX1VQXSAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfV0lMTF9DTEVBTl9VUCk7CisgICAgICAgICAgICByZXN1bHRbT0lCX0xBTUJEQV9SRUZFUkVOQ0VEXSA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9MQU1CREFfUkVGRVJFTkNFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1NIQURPV10gICAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSEFET1dfUFJFVikgJiYgMTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfUkVQTEFDRURdICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1JFUExBQ0VEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfTkVYVF9SRVNFVF0gICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05FWFRfUkVTRVRfVElNRSk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1RJTUVfT0ZfUkVGXSAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9MQVNUX1JFRl9USU1FKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfUkVGXSAgICAgICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9SRUZTKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfR0lHQVRJQ0tTXSAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0dJR0FUSUNLUyk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1RJQ0tTXSAgICAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9USUNLUyk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1NXQVBfTlVNXSAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TV0FQX05VTSk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1BST0dfU1dBUFBFRF0gICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9QUk9HX1NXQVBQRUQpOworICAgICAgICAgICAgcmVzdWx0W09JQl9WQVJfU1dBUFBFRF0gICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfVkFSX1NXQVBQRUQpOworICAgICAgICAgICAgcmVzdWx0W09JQl9OQU1FXSAgICAgICAgICAgICAgPSBlZnVuOjpvYmplY3RfbmFtZShvYik7CisgICAgICAgICAgICByZXN1bHRbT0lCX0xPQURfTkFNRV0gICAgICAgICA9IGVmdW46OmxvYWRfbmFtZShvYik7CisgICAgICAgICAgICByZXN1bHRbT0lCX05FWFRfQUxMXSAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfTkVYVCk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1BSRVZfQUxMXSAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfUFJFVik7CisgICAgICAgICAgICByZXN1bHRbT0lCX05FWFRfQ0xFQU5VUF0gICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9ORVhUX0NMRUFOVVBfVElNRSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgT0lORk9fUE9TSVRJT046CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGFsbG9jYXRlKE9JUF9NQVgpOworCisgICAgICAgICAgICByZXN1bHRbT0lQX05FWFRdID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9ORVhUKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSVBfUFJFVl0gPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX1BSRVYpOworICAgICAgICAgICAgcmVzdWx0W09JUF9QT1NdICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfUE9TKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBPSU5GT19NRU1PUlk6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGFsbG9jYXRlKE9JTV9NQVgpOworCisgICAgICAgICAgICByZXN1bHRbT0lNX1JFRl0gICAgICAgICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUFJPR19SRUZTKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTkFNRV0gICAgICAgICAgICAgICA9IGVmdW46OnByb2dyYW1fbmFtZShvYik7CisgICAgICAgICAgICByZXN1bHRbT0lNX1BST0dfU0laRV0gICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUFJPR19TSVpFKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTlVNX0ZVTkNUSU9OU10gICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fRlVOQ1RJT05TKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fU0laRV9GVU5DVElPTlNdICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX0ZVTkNUSU9OUyk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05VTV9WQVJJQUJMRVNdICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX1ZBUklBQkxFUyk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1NJWkVfVkFSSUFCTEVTXSAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9WQVJJQUJMRVMpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OVU1fU1RSSU5HU10gICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9TVFJJTkdTKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fU0laRV9TVFJJTkdTXSAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1NUUklOR1MpOworICAgICAgICAgICAgcmVzdWx0W09JTV9TSVpFX1NUUklOR1NfREFUQV0gID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HU19EQVRBKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fU0laRV9TVFJJTkdTX1RPVEFMXSA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1NUUklOR1NfREFUQV9UT1RBTCk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05VTV9JTkhFUklURURdICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX0lOSEVSSVRFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1NJWkVfSU5IRVJJVEVEXSAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9JTkhFUklURUQpOworICAgICAgICAgICAgcmVzdWx0W09JTV9UT1RBTF9TSVpFXSAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1BST0dfU0laRV9UT1RBTCk7CisgICAgICAgICAgICByZXN1bHRbT0lNX0RBVEFfU0laRV0gICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfREFUQV9TSVpFKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fVE9UQUxfREFUQV9TSVpFXSAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9EQVRBX1NJWkVfVE9UQUwpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OT19JTkhFUklUXSAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05PX0lOSEVSSVQpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OT19DTE9ORV0gICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05PX0NMT05FKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTk9fU0hBRE9XXSAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OT19TSEFET1cpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OVU1fSU5DTFVERVNdICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9JTkNMVURFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1NIQVJFX1ZBUklBQkxFU10gICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0hBUkVfVkFSSUFCTEVTKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNpemVvZihpbmRleCkpCisgICAgeworICAgICAgICBpbnQgaWR4ID0gaW5kZXhbMF07CisgICAgICAgIGlmIChpZHggPCAwIHx8IGlkeCA+PSBzaXplb2YocmVzdWx0KSkKKyAgICAgICAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIklsbGVnYWwgaW5kZXggZm9yIG9iamVjdF9pbmZvKCk6ICVkLCBleHBlY3RlZCAwLi4lZFxuIiwKKyAgICAgICAgICAgICAgICBpZHgsIHNpemVvZihyZXN1bHQpLTEpKTsKKworICAgICAgICByZXR1cm4gcmVzdWx0W2lkeF07CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9lZGl0aW5nLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9lZGl0aW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE0NmRjZAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3F1ZXJ5X2VkaXRpbmcuYwpAQCAtMCwwICsxLDE3IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfZWRpdGluZygpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9lZGl0aW5nKQorCisjaW5jbHVkZSA8aW50ZXJhY3RpdmVfaW5mby5oPgorCitpbnR8b2JqZWN0IHF1ZXJ5X2VkaXRpbmcob2JqZWN0IG9iKQoreworICAgIGlmKCFlZnVuOjppbnRlcmFjdGl2ZShvYikpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX0VESVRJTkcpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3F1ZXJ5X2lkbGUuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3F1ZXJ5X2lkbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2EzMmFlCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfaWRsZS5jCkBAIC0wLDAgKzEsMTQgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9pZGxlKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X2lkbGUpCisKKyNpbmNsdWRlIDxpbnRlcmFjdGl2ZV9pbmZvLmg+CisKK2ludCBxdWVyeV9pZGxlKG9iamVjdCBvYikKK3sKKyAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfSURMRSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfaW5wdXRfcGVuZGluZy5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfaW5wdXRfcGVuZGluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkOGMzMTEKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9pbnB1dF9wZW5kaW5nLmMKQEAgLTAsMCArMSwxNyBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X2lucHV0X3BlbmRpbmcoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfaW5wdXRfcGVuZGluZykKKworI2luY2x1ZGUgPGludGVyYWN0aXZlX2luZm8uaD4KKworb2JqZWN0IHF1ZXJ5X2lucHV0X3BlbmRpbmcob2JqZWN0IG9iKQoreworICAgIGlmKCFlZnVuOjppbnRlcmFjdGl2ZShvYikpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX0lOUFVUX1BFTkRJTkcpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3F1ZXJ5X2lwX25hbWUuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3F1ZXJ5X2lwX25hbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTc0ZWEwCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfaXBfbmFtZS5jCkBAIC0wLDAgKzEsNDggQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1bnMgcXVlcnlfaXBfbmFtZSgpIGFuZAorICogcXVlcnlfaXBfbnVtYmVyKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X2lwX25hbWUpCisKKyNpbmNsdWRlIDxpbnRlcmFjdGl2ZV9pbmZvLmg+CisKK3ByaXZhdGUgdmFyYXJncyBzdHJpbmcgX3F1ZXJ5X2lwX25hbWUob2JqZWN0IHBsYXllcikKK3sKKyAgICBvYmplY3Qgb2IgPSBwbGF5ZXI7CisgICAgb2IgfHw9IGVmdW46OnRoaXNfcGxheWVyKCk7CisKKyAgICBwbGF5ZXIgPSBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9JUF9BRERSRVNTKTsKKyAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfSVBfTkFNRSk7Cit9CisKK3ByaXZhdGUgdmFyYXJncyBzdHJpbmcgX3F1ZXJ5X2lwX251bWJlcihvYmplY3QgcGxheWVyKQoreworICAgIG9iamVjdCBvYiA9IHBsYXllcjsKKyAgICBvYiB8fD0gZWZ1bjo6dGhpc19wbGF5ZXIoKTsKKworICAgIHBsYXllciA9IGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX0lQX0FERFJFU1MpOworICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9JUF9OVU1CRVIpOworfQorCisvLyAqIEhlcmt1bmZ0cy1Fcm1pdHRsdW5nCitzdHJpbmcgcXVlcnlfaXBfbnVtYmVyKG9iamVjdCBvYikKK3sKKyAgb2I9IG9iIHx8IHRoaXNfcGxheWVyKCk7CisgIGlmICghb2JqZWN0cChvYikgfHwgIWludGVyYWN0aXZlKG9iKSkgcmV0dXJuIDA7CisgIGlmKG9iLT5xdWVyeV9yZWFsaXAoKSAmJiAoc3RyaW5nKW9iLT5xdWVyeV9yZWFsaXAoKSE9IiIpCisgIHsKKyAgICByZXR1cm4gKHN0cmluZylvYi0+cXVlcnlfcmVhbGlwKCk7CisgIH0KKyAgcmV0dXJuIF9xdWVyeV9pcF9udW1iZXIob2IpOworfQorCitzdHJpbmcgcXVlcnlfaXBfbmFtZShtaXhlZCBvYikKK3sKKyAgaWYgKCAhb2IgfHwgb2JqZWN0cChvYikgKQorICAgICAgb2I9X3F1ZXJ5X2lwX251bWJlcihvYik7CisgIHJldHVybiAoc3RyaW5nKSIvcC9kYWVtb24vaXBsb29rdXAiLT5ob3N0KG9iKTsKK30KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3F1ZXJ5X2xpbWl0cy5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfbGltaXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNiZjM5MAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3F1ZXJ5X2xpbWl0cy5jCkBAIC0wLDAgKzEsMTQgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9saW1pdHMoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfbGltaXRzKQorCisjaW5jbHVkZSA8ZHJpdmVyX2luZm8uaD4KKwordmFyYXJncyBpbnQqIHF1ZXJ5X2xpbWl0cyhpbnQgZGVmKQoreworICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhkZWYgPyBEQ19ERUZBVUxUX1JVTlRJTUVfTElNSVRTIDogRElfQ1VSUkVOVF9SVU5USU1FX0xJTUlUUyk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfbG9hZF9hdmVyYWdlLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9sb2FkX2F2ZXJhZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjM2ZjBlCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfbG9hZF9hdmVyYWdlLmMKQEAgLTAsMCArMSwxNiBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X2xvYWRfYXZlcmFnZSgpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9sb2FkX2F2ZXJhZ2UpCisKKyNpbmNsdWRlIDxkcml2ZXJfaW5mby5oPgorCitzdHJpbmcgcXVlcnlfbG9hZF9hdmVyYWdlKCkKK3sKKyAgICByZXR1cm4gZWZ1bjo6c3ByaW50ZigiJS4yZiBjbWRzL3MsICUuMmYgY29tcCBsaW5lcy9zIiwKKyAgICAgICAgZWZ1bjo6ZHJpdmVyX2luZm8oRElfTE9BRF9BVkVSQUdFX0NPTU1BTkRTKSwKKyAgICAgICAgZWZ1bjo6ZHJpdmVyX2luZm8oRElfTE9BRF9BVkVSQUdFX0xJTkVTKSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfbXVkX3BvcnQuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3F1ZXJ5X211ZF9wb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZmMDA5ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3F1ZXJ5X211ZF9wb3J0LmMKQEAgLTAsMCArMSwzNSBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X211ZF9wb3J0KCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X211ZF9wb3J0KQorCisjaW5jbHVkZSA8aW50ZXJhY3RpdmVfaW5mby5oPgorI2luY2x1ZGUgPGRyaXZlcl9pbmZvLmg+CisKK2ludCBxdWVyeV9tdWRfcG9ydCh2YXJhcmdzIGludCp8b2JqZWN0KiBhcmdzKQoreworICAgIGlmKCFzaXplb2YoYXJncykgJiYgZWZ1bjo6dGhpc19wbGF5ZXIoKSAmJiBlZnVuOjppbnRlcmFjdGl2ZSh0aGlzX3BsYXllcigpKSkKKyAgICAgICAgcmV0dXJuIGVmdW46OmludGVyYWN0aXZlX2luZm8odGhpc19wbGF5ZXIoKSwgSUlfTVVEX1BPUlQpOworCisgICAgaWYoc2l6ZW9mKGFyZ3MpID4gMSkKKyAgICAgICAgcmFpc2VfZXJyb3IoIlRvbyBtYW55IGFyZ3VtZW50cyB0byBxdWVyeV9tdWRfcG9ydFxuIik7CisKKyAgICBpZihzaXplb2YoYXJncykgJiYgZWZ1bjo6b2JqZWN0cChhcmdzWzBdKSAmJiBlZnVuOjppbnRlcmFjdGl2ZShhcmdzWzBdKSkKKyAgICAgICAgcmV0dXJuIGVmdW46OmludGVyYWN0aXZlX2luZm8oYXJnc1swXSwgSUlfTVVEX1BPUlQpOworCisgICAgaWYoc2l6ZW9mKGFyZ3MpICYmIGludHAoYXJnc1swXSkpCisgICAgeworICAgICAgICBpbnQqIHBvcnRzID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTVVEX1BPUlRTKTsKKyAgICAgICAgaWYoYXJnc1swXSA8IC0xIHx8IGFyZ3NbMF0gPj0gc2l6ZW9mKHBvcnRzKSkKKyAgICAgICAgICAgIHJhaXNlX2Vycm9yKGVmdW46OnNwcmludGYoIkJhZCBhcmcgMSB0byBxdWVyeV9tdWRfcG9ydCgpOiB2YWx1ZSAlZCBvdXQgb2YgcmFuZ2UuXG4iLCBhcmdzWzBdKSk7CisgICAgICAgIGVsc2UgaWYoYXJnc1swXSA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiBzaXplb2YocG9ydHMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gcG9ydHNbYXJnc1swXV07CisgICAgfQorCisgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKERJX01VRF9QT1JUUylbMF07Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfb25jZV9pbnRlcmFjdGl2ZS5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfb25jZV9pbnRlcmFjdGl2ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNzgyOWYKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9vbmNlX2ludGVyYWN0aXZlLmMKQEAgLTAsMCArMSwxNCBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfb25jZV9pbnRlcmFjdGl2ZSkKKworI2luY2x1ZGUgPG9iamVjdF9pbmZvLmg+CisKK2ludCBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iamVjdCBvYikKK3sKKyAgICByZXR1cm4gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09OQ0VfSU5URVJBQ1RJVkUpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3F1ZXJ5X3Nub29wLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9zbm9vcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2YTY5YzAKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9zbm9vcC5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9zbm9vcCgpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworCisjaW5jbHVkZSA8aW50ZXJhY3RpdmVfaW5mby5oPgorCitwcml2YXRlIG9iamVjdCBfcXVlcnlfc25vb3Aob2JqZWN0IG9iKQoreworICAgIGlmKCFlZnVuOjppbnRlcmFjdGl2ZShvYikpCisgICAgICAgIHJldHVybiAwOworCisgICAgb2JqZWN0IHByZXYgPSBlZnVuOjpwcmV2aW91c19vYmplY3QoKTsKKyAgICBlZnVuOjpzZXRfdGhpc19vYmplY3QocHJldik7CisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X3Nub29wKQorICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9TTk9PUF9ORVhUKTsKKyNlbHNlCisgICAgcmV0dXJuIGVmdW46OnF1ZXJ5X3Nub29wKG9iKTsKKyNlbmRpZgorfQorCitub21hc2sgb2JqZWN0IHF1ZXJ5X3Nub29wKG9iamVjdCB3aG8pIHsKKyAgb2JqZWN0IHNub29wZXI7CisKKyAgc25vb3Blcj1fcXVlcnlfc25vb3Aod2hvKTsKKyAgaWYgKCFzbm9vcGVyKSByZXR1cm4gMDsKKyAgaWYgKHF1ZXJ5X3dpel9ncnAoc25vb3Blcik+cXVlcnlfd2l6X2dycChnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpKSAmJgorICAgICAgSVNfQVJDSChzbm9vcGVyKSkgcmV0dXJuIDA7CisgIHJldHVybiBzbm9vcGVyOworfQpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc2V0X2hlYXJ0X2JlYXQuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NldF9oZWFydF9iZWF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM5OTVlYgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NldF9oZWFydF9iZWF0LmMKQEAgLTAsMCArMSwyNCBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHNldF9oZWFydF9iZWF0KCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHNldF9oZWFydF9iZWF0KQorCisjaW5jbHVkZSA8Y29uZmlndXJhdGlvbi5oPgorCitpbnQgc2V0X2hlYXJ0X2JlYXQoaW50IGZsYWcpCit7CisgICAgb2JqZWN0IG9iID0gZWZ1bjo6cHJldmlvdXNfb2JqZWN0KCk7CisgICAgaW50IGhiID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9DX0hFQVJUX0JFQVQpOworCisgICAgaWYgKCFmbGFnID09ICFoYikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBlZnVuOjpjb25maWd1cmVfb2JqZWN0KG9iLCBPQ19IRUFSVF9CRUFULCBmbGFnKTsKKworICAgIHJldHVybiAxOworfQorCisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zZXRfaXNfd2l6YXJkLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zZXRfaXNfd2l6YXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAxY2NkYgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NldF9pc193aXphcmQuYwpAQCAtMCwwICsxLDEzNyBAQAorLyogVGhlc2UgYXJlIHRoZSBzcGVjaWFsIGNvbW1hbmRzIGZyb20gdGhlIGRyaXZlciB0aGF0IGFyZSBhY3RpdmF0ZWQgd2l0aAorICogc2V0X2lzX3dpemFyZCgpLiBUaGVzZSBmdW5jdGlvbnMgbXVzdCBiZSBhZGRlZCB0byB0aGUgcGxheWVyIG9iamVjdC4KKyAqIEFsc28gc2V0X2lzX3dpemFyZCgpIG11c3QgYmUgY2FsbGVkIGluIHRoZSBjb3JyZXNwb25kaW5nIHBsYXllciBvYmplY3QsCisgKiBub3QgYXMgYW4gKHNpbXVsLSllZnVuLgorICovCisKKyNpbmNsdWRlIDxjb21tYW5kcy5oPgorI2luY2x1ZGUgPGRyaXZlcl9pbmZvLmg+CisKKy8qIGlzX3dpemFyZDoKKyAqICAxOiBoYXMgYWN0aW9ucywKKyAqICAwOiBuZXZlciBoYWQgYWN0aW9ucywKKyAqIC0xOiBoYWQgYWN0aW9ucyBvbmNlLgorICovCitwcml2YXRlIG5vc2F2ZSBpbnQgaXNfd2l6YXJkOworCitwcml2YXRlIGludCBkcml2ZXJfbWFsbG9jKHN0cmluZyBzdHIpCit7CisgICAgaWYoaXNfd2l6YXJkIDw9IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYoIXNpemVvZihzdHIpKQorICAgIHsKKyAgICAgICAgd3JpdGUoZWZ1bjo6ZHJpdmVyX2luZm8oRElfU1RBVFVTX1RFWFRfTUFMTE9DKSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGlmKHN0ciA9PSAiZXh0c3RhdHMiKQorICAgIHsKKyAgICAgICAgd3JpdGUoZWZ1bjo6ZHJpdmVyX2luZm8oRElfU1RBVFVTX1RFWFRfTUFMTE9DX0VYVEVOREVEKSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitwcml2YXRlIGludCBkcml2ZXJfZHVtcGFsbG9iaihzdHJpbmcgc3RyKQoreworICAgIGlmKGlzX3dpemFyZCA8PSAwIHx8IHNpemVvZihzdHIpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHdyaXRlKCJEdW1waW5nIHRvIC9PQkpfRFVNUCAuLi4gIik7CisgICAgZWZ1bjo6ZHVtcF9kcml2ZXJfaW5mbyhERElfT0JKRUNUUyk7CisgICAgZWZ1bjo6ZHVtcF9kcml2ZXJfaW5mbyhERElfT0JKRUNUU19ERVNUUlVDVEVEKTsKKyAgICB3cml0ZSgiZG9uZVxuIik7CisgICAgcmV0dXJuIDE7Cit9CisKK3ByaXZhdGUgaW50IGRyaXZlcl9vcGNkdW1wKHN0cmluZyBzdHIpCit7CisgICAgaWYoaXNfd2l6YXJkIDw9IDAgfHwgc2l6ZW9mKHN0cikpCisgICAgICAgIHJldHVybiAwOworCisgICAgZWZ1bjo6ZHVtcF9kcml2ZXJfaW5mbyhERElfT1BDT0RFUyk7CisgICAgcmV0dXJuIDE7Cit9CisKK3ByaXZhdGUgaW50IGRyaXZlcl9zdGF0dXMoc3RyaW5nIHN0cikKK3sKKyAgICBpbnQgb3B0OworICAgIGlmKGlzX3dpemFyZCA8PSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHN3aXRjaChzdHIgfHwgIiIpCisgICAgeworICAgICAgICBjYXNlICIiOgorICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfTUVNT1JZOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAidGFibGVzIjoKKyAgICAgICAgY2FzZSAiIHRhYmxlcyI6CisgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9UQUJMRVM7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJzd2FwIjoKKyAgICAgICAgY2FzZSAiIHN3YXAiOgorICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfU1dBUDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgIm1hbGxvYyI6CisgICAgICAgIGNhc2UgIiBtYWxsb2MiOgorICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfTUFMTE9DOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAibWFsbG9jIGV4dHN0YXRzIjoKKyAgICAgICAgY2FzZSAiIG1hbGxvYyBleHRzdGF0cyI6CisgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9NQUxMT0NfRVhURU5ERUQ7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgd3JpdGUoZWZ1bjo6ZHJpdmVyX2luZm8ob3B0KSk7CisgICAgcmV0dXJuIDE7Cit9CisKK2ludCBzZXRfaXNfd2l6YXJkKHZhcmFyZ3MgPG9iamVjdHxpbnQ+KiBhcmdzKQoreworICAgIGludCBvbGR2YWwgPSBpc193aXphcmQ7CisKKyAgICBpZighc2l6ZW9mKGFyZ3MpKQorICAgICAgICByYWlzZV9lcnJvcigiVG9vIGZldyBhcmd1bWVudHMgdG8gc2V0X2lzX3dpemFyZFxuIik7CisgICAgaWYoc2l6ZW9mKGFyZ3MpID4gMikKKyAgICAgICAgcmFpc2VfZXJyb3IoIlRvbyBtYW55IGFyZ3VtZW50cyB0byBzZXRfaXNfd2l6YXJkXG4iKTsKKyAgICBpZighb2JqZWN0cChhcmdzWzBdKSkKKyAgICAgICAgcmFpc2VfZXJyb3IoIkJhZCBhcmcgMSB0byBzZXRfaXNfd2l6YXJkKClcbiIpOworICAgIGlmKGFyZ3NbMF0gIT0gdGhpc19vYmplY3QoKSkKKyAgICAgICAgcmFpc2VfZXJyb3IoIk9ubHkgc2V0X2lzX3dpemFyZCBmb3IgdGhlIGN1cnJlbnQgb2JqZWN0IHN1cHBvcnRlZFxuIik7CisgICAgaWYodGhpc19wbGF5ZXIoKSAhPSB0aGlzX29iamVjdCgpKQorICAgICAgICByYWlzZV9lcnJvcigiVGhlIGN1cnJlbnQgb2JqZWN0IG11c3QgYmUgdGhpc19wbGF5ZXIoKSBmb3Igc2V0X2lzX3dpemFyZCgpXG4iKTsKKyAgICBpZihzaXplb2YoYXJncykgPT0gMiAmJiAhaW50cChhcmdzWzFdKSkKKyAgICAgICAgcmFpc2VfZXJyb3IoIkJhZCBhcmcgMiB0byBzZXRfaXNfd2l6YXJkKClcbiIpOworCisgICAgaWYoc2l6ZW9mKGFyZ3MpID09IDIgJiYgIWFyZ3NbMV0pCisgICAgeworICAgICAgICBpZihpc193aXphcmQgPiAwKQorICAgICAgICAgICAgaXNfd2l6YXJkID0gLTE7CisgICAgfQorICAgIGVsc2UgaWYoc2l6ZW9mKGFyZ3MpID09IDIgJiYgYXJnc1sxXTwwKQorICAgIHsKKyAgICAgICAgIC8vIEp1c3QgcmV0dXJuIHRoZSBvbGQgdmFsdWUuCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKCFpc193aXphcmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFkZF9hY3Rpb24oIydkcml2ZXJfbWFsbG9jLCAibWFsbG9jIik7CisgICAgICAgICAgICBhZGRfYWN0aW9uKCMnZHJpdmVyX2R1bXBhbGxvYmosICJkdW1wYWxsb2JqIik7CisgICAgICAgICAgICBhZGRfYWN0aW9uKCMnZHJpdmVyX29wY2R1bXAsICJvcGNkdW1wIik7CisgICAgICAgICAgICBhZGRfYWN0aW9uKCMnZHJpdmVyX3N0YXR1cywgInN0YXR1cyIsIEFBX05PU1BBQ0UpOworICAgICAgICB9CisgICAgICAgIGlzX3dpemFyZCA9IDE7CisgICAgfQorCisgICAgcmV0dXJuIG9sZHZhbCA+IDA7Cit9CmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zZXRfcHJvbXB0LmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zZXRfcHJvbXB0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI1OTY5MgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NldF9wcm9tcHQuYwpAQCAtMCwwICsxLDIxIEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gc2V0X3Byb21wdCgpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhzZXRfcHJvbXB0KQorCisjaW5jbHVkZSA8Y29uZmlndXJhdGlvbi5oPgorCit2YXJhcmdzIHN0cmluZ3xjbG9zdXJlIHNldF9wcm9tcHQoc3RyaW5nfGNsb3N1cmV8aW50IHByb21wdCwgb2JqZWN0IG9iKQoreworICAgIG9iIHx8PSBlZnVuOjp0aGlzX3BsYXllcigpOworCisgICAgbWl4ZWQgb2xkcHJvbXB0ID0gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUNfUFJPTVBUKTsKKworICAgIGlmKCFpbnRwKHByb21wdCkpCisgICAgICAgIGVmdW46OmNvbmZpZ3VyZV9pbnRlcmFjdGl2ZShvYiwgSUNfUFJPTVBULCBwcm9tcHQpOworCisgICAgcmV0dXJuIG9sZHByb21wdDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zaGFkb3cuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NoYWRvdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MDhjNzMKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zaGFkb3cuYwpAQCAtMCwwICsxLDU1IEBACisvKiBUaGVzZSBzZWZ1bnMgYXJlIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfc2hhZG93aW5nKCkKKyAqIGFuZCB0aGUgb2xkIHNlbWFudGljcyBvZiB0aGUgZWZ1biBzaGFkb3coKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfc2hhZG93aW5nKQorCisjaW5jbHVkZSA8b2JqZWN0X2luZm8uaD4KKworb2JqZWN0IHF1ZXJ5X3NoYWRvd2luZyhvYmplY3Qgb2IpCit7CisgICAgcmV0dXJuIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSEFET1dfUFJFVik7Cit9CisKK3ByaXZhdGUgb2JqZWN0IF9zaGFkb3cob2JqZWN0IG9iLCBpbnQgZmxhZykKK3sKKyAgICBpZihmbGFnKQorICAgIHsKKyAgICAgICAgb2JqZWN0IHNoYWRvd2VyID0gZWZ1bjo6cHJldmlvdXNfb2JqZWN0KDEpOworICAgICAgICBlZnVuOjpzZXRfdGhpc19vYmplY3Qoc2hhZG93ZXIpOworCisgICAgICAgIGlmIChlZnVuOjpzaGFkb3cob2IpKQorICAgICAgICAgICAgcmV0dXJuIGVmdW46Om9iamVjdF9pbmZvKHNoYWRvd2VyLCBPSV9TSEFET1dfUFJFVik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0hBRE9XX05FWFQpOworfQorI2Vsc2UKK3ByaXZhdGUgb2JqZWN0IF9zaGFkb3cob2JqZWN0IG9iLCBpbnQgZmxhZykKK3sKKyAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgxKSk7CisgIHJldHVybiBlZnVuOjpzaGFkb3cob2IsIGZsYWcpOworfQorI2VuZGlmCisKKworcHVibGljIG9iamVjdCBzaGFkb3cob2JqZWN0IG9iLCBpbnQgZmxhZykKK3sKKyAgb2JqZWN0IHJlcyA9IGZ1bmNhbGwoIydfc2hhZG93LG9iLCBmbGFnKTsKKyAgaWYgKGZsYWcpCisgICAgIi9zZWN1cmUvc2hhZG93bWFzdGVyIi0+UmVnaXN0ZXJTaGFkb3cocHJldmlvdXNfb2JqZWN0KCkpOworICByZXR1cm4gcmVzOworfQorCitwcml2YXRlIHZvaWQgX3Vuc2hhZG93KCkgeworICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KDEpKTsKKyAgZWZ1bjo6dW5zaGFkb3coKTsKK30KKworcHVibGljIHZvaWQgdW5zaGFkb3coKSB7CisgIGZ1bmNhbGwoIydfdW5zaGFkb3cpOworICAiL3NlY3VyZS9zaGFkb3dtYXN0ZXIiLT5VbnJlZ2lzdGVyU2hhZG93KHByZXZpb3VzX29iamVjdCgpKTsKK30KZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NpbXVsX2VmdW4uYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NpbXVsX2VmdW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjY4Nzg5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc2ltdWxfZWZ1bi5jCkBAIC0wLDAgKzEsMTk5NSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHNpbXVsX2VmdW4uYyAtLSBzaW11bCBlZnVuJ3MKKy8vCisvLyAkSWQ6IHNpbXVsX2VmdW4uYyA3NDA4IDIwMTAtMDItMDYgMDA6Mjc6MjVaIFplc3N0cmEgJAorI3ByYWdtYSBzdHJpY3RfdHlwZXMsc2F2ZV90eXBlcyxydHRfY2hlY2tzCisjcHJhZ21hIG5vX2Nsb25lLG5vX3NoYWRvdyxub19pbmhlcml0CisjcHJhZ21hIHBlZGFudGljLHJhbmdlX2NoZWNrLHdhcm5fZGVwcmVjYXRlZAorI3ByYWdtYSB3YXJuX2VtcHR5X2Nhc3RzLHdhcm5fbWlzc2luZ19yZXR1cm4sd2Fybl9mdW5jdGlvbl9pbmNvbnNpc3RlbnQKKworLy8gQWJzb2x1dGUgUGZhZGUgZXJmb3JkZXJsaWNoIC0genVtIFplaXRwdW5rdCwgd28gZGVyIE1hc3RlciBnZWxhZGVuCisvLyB3aXJkLCBzaW5kIG5vY2gga2VpbmUgSW5jbHVkZS1QZmFkZSBkYSAuLi4KKworI2RlZmluZSBTTk9PUExPR0ZJTEUgIlNOT09QIgorI2RlZmluZSBBU05PT1BMT0dGSUxFICJBUkNIL1NOT09QIgorCisjaW5jbHVkZSAiL3NlY3VyZS9jb25maWcuaCIKKyNpbmNsdWRlICIvc2VjdXJlL3dpemxldmVscy5oIgorI2luY2x1ZGUgIi9zeXMvc25vb3BpbmcuaCIKKyNpbmNsdWRlICIvc3lzL2xhbmd1YWdlLmgiCisjaW5jbHVkZSAiL3N5cy90aGluZy9wcm9wZXJ0aWVzLmgiCisjaW5jbHVkZSAiL3N5cy93aXpsaXN0LmgiCisjaW5jbHVkZSAiL3N5cy9lcnEuaCIKKyNpbmNsdWRlICIvc3lzL2xwY3R5cGVzLmgiCisjaW5jbHVkZSAiL3N5cy9kYWVtb24uaCIKKyNpbmNsdWRlICIvc3lzL3BsYXllci9iYXNlLmgiCisjaW5jbHVkZSAiL3N5cy90aGluZy9kZXNjcmlwdGlvbi5oIgorI2luY2x1ZGUgIi9zeXMvY29udGFpbmVyLmgiCisjaW5jbHVkZSAiL3N5cy9kZWZpbmVzLmgiCisjaW5jbHVkZSAiL3N5cy90ZWxuZXQuaCIKKyNpbmNsdWRlICIvc3lzL29iamVjdGluZm8uaCIKKyNpbmNsdWRlICIvc3lzL2ZpbGVzLmgiCisjaW5jbHVkZSAiL3N5cy9zdHJpbmdzLmgiCisjaW5jbHVkZSAiL3N5cy90aW1lLmgiCisjaW5jbHVkZSAiL3N5cy9scGN0eXBlcy5oIgorI2luY2x1ZGUgIi9zeXMvbm90aWZ5X2ZhaWwuaCIKKyNpbmNsdWRlICIvc3lzL3Rscy5oIgorI2luY2x1ZGUgIi9zeXMvaW5wdXRfdG8uaCIKKyNpbmNsdWRlICIvc3lzL29iamVjdF9pbmZvLmgiCisKKy8qIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAqLworc3RyaW5nIGR0aW1lKGludCB3YW5uKTsKK3ZhcmFyZ3MgaW50IGxvZ19maWxlKHN0cmluZyBmaWxlLCBzdHJpbmcgdHh0LCBpbnQgc2l6ZV90b19icmVhayk7CitpbnQgcXVlcnlfd2l6X2xldmVsKG1peGVkIHBsYXllcik7Citub21hc2sgdmFyYXJncyBpbnQgc25vb3Aob2JqZWN0IG1lLCBvYmplY3QgeW91KTsKK3ZhcmFyZ3Mgc3RyaW5nIGNvdW50cnkobWl4ZWQgaXAsIHN0cmluZyBudW0pOworaW50IHF1ZXJ5X3dpel9ncnAobWl4ZWQgd2l6KTsKK3B1YmxpYyB2YXJhcmdzIG9iamVjdCBkZWVwX3ByZXNlbnQobWl4ZWQgd2hhdCwgb2JqZWN0IG9iKTsKK25vbWFzayBpbnQgc2VjdXJlX2xldmVsKCk7Citub21hc2sgc3RyaW5nIHNlY3VyZV9ldWlkKCk7CitwdWJsaWMgbm9tYXNrIGludCBwcm9jZXNzX2NhbGwoKTsKK25vbWFzayBtaXhlZCBfX2NyZWF0ZV9wbGF5ZXJfZHVtbXkoc3RyaW5nIG5hbWUpOwordmFyYXJncyBzdHJpbmcgcmVwbGFjZV9wZXJzb25hbChzdHJpbmcgc3RyLCBtaXhlZCAqb2JzLCBpbnQgY2Fwcyk7CisKKworLy9yZXBsYWNlbWVudHMgZm9yIGRyb3BwZWQgZWZ1bnMgaW4gTEQKKyNpZiAhX19FRlVOX0RFRklORURfXyhleHRyYWN0KQordmFyYXJncyBzdHJpbmcgZXh0cmFjdChzdHJpbmcgc3RyLCBpbnQgZnJvbSwgaW50IHRvKTsKKyNlbmRpZgorI2lmICFfX0VGVU5fREVGSU5FRF9fKHNsaWNlX2FycmF5KQordmFyYXJncyBtaXhlZCBzbGljZV9hcnJheShtaXhlZCBhcnJheSwgaW50IGZyb20sIGludCB0byk7CisjZW5kaWYKKyNpZiAhX19FRlVOX0RFRklORURfXyhtZW1iZXJfYXJyYXkpCitpbnQgbWVtYmVyX2FycmF5KG1peGVkIGl0ZW0sIG1peGVkIGFycmF5c3RyaW5nKTsKKyNlbmRpZgorCisvLyBJbmNsdWRlIHRoZSBkaWZmZXJlbnQgc3ViICdtb2R1bGVzJyBvZiB0aGUgc2ltdWxfZWZ1bgorI2luY2x1ZGUgX19ESVJfXyJkZWJ1Z19pbmZvLmMiCisjaW5jbHVkZSBfX0RJUl9fImVuYWJsZV9jb21tYW5kcy5jIgorI2luY2x1ZGUgX19ESVJfXyJoYXNoLmMiCisjaW5jbHVkZSBfX0RJUl9fIm9iamVjdF9pbmZvLmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X2VkaXRpbmcuYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfaWRsZS5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9pbnB1dF9wZW5kaW5nLmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X2lwX25hbWUuYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfbGltaXRzLmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X2xvYWRfYXZlcmFnZS5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9tdWRfcG9ydC5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9vbmNlX2ludGVyYWN0aXZlLmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X3Nub29wLmMiCisjaW5jbHVkZSBfX0RJUl9fInNldF9oZWFydF9iZWF0LmMiCisjaWYgX19CT09UX1RJTUVfXyA8IDE0NTYyNjE4NTkKKyNpbmNsdWRlIF9fRElSX18ic2V0X3Byb21wdC5jIgorI2VuZGlmCisjaW5jbHVkZSBfX0RJUl9fInNoYWRvdy5jIgorI2luY2x1ZGUgX19ESVJfXyJsaXZpbmdzLmMiCisjaW5jbHVkZSBfX0RJUl9fImNvbW0uYyIKKworI2RlZmluZSBUTyAgICAgICAgZWZ1bjo6dGhpc19vYmplY3QoKQorI2RlZmluZSBUSSAgICAgICAgZWZ1bjo6dGhpc19pbnRlcmFjdGl2ZSgpCisjZGVmaW5lIFRQICAgICAgICBlZnVuOjp0aGlzX3BsYXllcigpCisjZGVmaW5lIFBPICAgICAgICBlZnVuOjpwcmV2aW91c19vYmplY3QoMCkKKyNkZWZpbmUgTEVWRUwoeCkgcXVlcnlfd2l6X2xldmVsKHgpCisjZGVmaW5lIE5BTUUoeCkgIGNhcGl0YWxpemUoZ2V0dWlkKHgpKQorCisjZGVmaW5lIERFQlVHKHgpIGlmIChmaW5kX3BsYXllcigiemVzc3RyYSIpKSBcCisgIHRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJ6ZXNzdHJhIikseCkKKworbWl4ZWQgZHRpbWVfY2FjaGUgPSAoey0xLCIifSk7CisKKyNpZmRlZiBJT1NUQVRTCitzdHJ1Y3QgaW9zdGF0X3MgeworICBzdHJpbmcgb25hbWU7CisgIGludCB0aW1lOworICBpbnQgc2l6ZTsKK307CittaXhlZCBzYXZlb19zdGF0ID0gKHsgMCxhbGxvY2F0ZSgyMDAsIDApIH0pOworbWl4ZWQgcmVzdG9yZW9fc3RhdCA9ICh7IDAsYWxsb2NhdGUoMjAwLDApIH0pOworLy9taXhlZCB3cml0ZWZpbGVfc3RhdCA9ICh7IDAsYWxsb2NhdGUoMTAwLCg8aW9zdGF0X3M+KSkgfSk7CisvL21peGVkIHJlYWRmaWxlX3N0YXQgPSAoeyAwLGFsbG9jYXRlKDEwMCwoPGlvc3RhdF9zPikpIH0pOworLy9taXhlZCBsb2dfc3RhdCA9ICh7IDAsYWxsb2NhdGUoMTAwLCg8aW9zdGF0X3M+KSkgfSk7CisKK21peGVkIF9fX2lvc3RhdHMoaW50IHR5cGUpIHsKKyAgc3dpdGNoKHR5cGUpIHsKKyAgICBjYXNlIDE6CisgICAgICByZXR1cm4gc2F2ZW9fc3RhdDsKKyAgICBjYXNlIDI6CisgICAgICByZXR1cm4gcmVzdG9yZW9fc3RhdDsKKy8qICAgIGNhc2UgMzoKKyAgICAgIHJldHVybiB3cml0ZWZpbGVfc3RhdDsKKyAgICBjYXNlIDQ6CisgICAgICByZXR1cm4gcmVhZGZpbGVfc3RhdDsKKyAgICBjYXNlIDU6CisgICAgICByZXR1cm4gbG9nX3N0YXQ7CisgICAgICAqLworICB9CisgIHJldHVybiAwOworfQorI2VuZGlmCisKKy8vIE5pY2h0IGplZGVyIE1hZ2llciBtdXNzIGRpZSBzaW11bF9lZnVuIGVudHNvcmdlbiBrb2VubmVuLgorc3RyaW5nIE5vdGlmeURlc3RydWN0KG9iamVjdCBjYWxsZXIpIHsKKyAgICBpZiggKGNhbGxlciE9dGhpc19vYmplY3QoKSAmJiAhQVJDSF9TRUNVUklUWSkgfHwgcHJvY2Vzc19jYWxsKCkgKSB7CisgICAgICByZXR1cm4gIkR1IGRhcmZzdCBkYXMgc2ltdWxfZWZ1biBPYmpla3QgbmljaHQgemVyc3RvZXJlbiFcbiI7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitwdWJsaWMgbm9tYXNrIHZvaWQgcmVtb3ZlX2ludGVyYWN0aXZlKCBvYmplY3Qgb2IgKQoreworICAgIGlmICggb2JqZWN0cChvYikgJiYgcHJldmlvdXNfb2JqZWN0KCkKKyAgICAgICAgJiYgb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpWzAuLjddICE9ICIvc2VjdXJlLyIKKyAgICAgICAgJiYgKChwcmV2aW91c19vYmplY3QoKSAhPSBvYgorICAgICAgICAgICAgICYmIChvYiAhPSB0aGlzX3BsYXllcigpIHx8IG9iICE9IHRoaXNfaW50ZXJhY3RpdmUoKSkpCisgICAgICAgICAgICB8fCAocHJldmlvdXNfb2JqZWN0KCkgPT0gb2IKKyAgICAgICAgICAgICAgICYmICh0aGlzX3BsYXllcigpICYmIHRoaXNfcGxheWVyKCkgIT0gb2IKKyAgICAgICAgICAgICAgICAgICB8fCB0aGlzX2ludGVyYWN0aXZlKCkgJiYgdGhpc19pbnRlcmFjdGl2ZSgpICE9IG9iKSkgKSApCisKKyAgICAgICBsb2dfZmlsZSggIlBMQVlFUkRFU1QiLAorICAgICAgICAgICAgICAgIHNwcmludGYoICIlczogJU8gYXVzZ2Vsb2dndCB2b24gUE8gJU8sIFRJICVPLCBUUCAlT1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGR0aW1lKHRpbWUoKSksIG9iLCBwcmV2aW91c19vYmplY3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfaW50ZXJhY3RpdmUoKSwgdGhpc19wbGF5ZXIoKSApICk7CisKKyAgICBlZnVuOjpyZW1vdmVfaW50ZXJhY3RpdmUob2IpOworfQorCisKK3ZvaWQgX19fdXBkbWFzdGVyKCkKK3sKKyAgICBvYmplY3Qgb2I7CisKKyAgICAvL3NvbGx0ZSBuaWNodCBqZWRlciBkdWVyZmVuLgorICAgIGlmIChwcm9jZXNzX2NhbGwoKSB8fCAhQVJDSF9TRUNVUklUWSkKKyAgICAgIHJhaXNlX2Vycm9yKCJJbGxlZ2FsIHVzZSBvZiBfX191cGRtYXN0ZXIoKSEiKTsKKworICAgIHdyaXRlKCJSZW1vdmluZyBvbGQgbWFzdGVyIC4uLiAiKTsKKyAgICBmb3JlYWNoKHN0cmluZyBmaWxlOiAKKyAgICAgICAgZ2V0X2RpcigiL3NlY3VyZS9tYXN0ZXIvKi5jIixHRVRESVJfTkFNRVN8R0VURElSX1VOU09SVEVEfEdFVERJUl9QQVRIKSkgeworICAgICAgaWYgKG9iID0gZmluZF9vYmplY3QoZmlsZSkpCisgICAgICAgZWZ1bjo6ZGVzdHJ1Y3Qob2IpOworICAgIH0KKyAgICBlZnVuOjpkZXN0cnVjdChlZnVuOjpmaW5kX29iamVjdCgiL3NlY3VyZS9tYXN0ZXIiKSk7CisgICAgd3JpdGUoImRvbmUuXG5Mb2FkaW5nIGFnYWluIC4uLiAiKTsKKyAgICBsb2FkX29iamVjdCgiL3NlY3VyZS9tYXN0ZXIiKTsKKworICAgIHdyaXRlKCJkb25lLlxuIik7Cit9CisKK3ZhcmFyZ3Mgc3RyaW5nIGNvdW50cnkobWl4ZWQgaXAsIHN0cmluZyBudW0pIHsKKyAgbWl4ZWQgcmV0OworCisgIGlmKHJldCA9IChzdHJpbmcpIi9wL2RhZW1vbi9pcGxvb2t1cCItPmNvdW50cnkobnVtIHx8IGlwKSkgeworICAgIHJldHVybiByZXQ7CisgIH0gZWxzZSByZXR1cm4gIj8/PyI7Cit9CisKKworLy8gKiBTbm9vcGVuIHVuZCB3YXMgZGF6dWdlaG9lcnQKK3N0YXRpYyBvYmplY3QgZmluZF9zbm9vcGVkKG9iamVjdCB3aG8pCit7CisgIG9iamVjdCAqdTsKKyAgaW50IGk7CisKKyAgZm9yIChpPXNpemVvZih1PXVzZXJzKCkpLTE7aT49MDtpLS0pCisgICAgaWYgKHdobz09ZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyh1W2ldLCBJSV9TTk9PUF9ORVhUKSkKKyAgICAgIHJldHVybiB1W2ldOworICByZXR1cm4gMDsKK30KKworcHJpdmF0ZSBzdHJpbmcgTGN1dChzdHJpbmcgc3RyKSB7CisgIHJldHVybiBzdHJbNS4uMTFdK3N0clsxOC4uXTsKK30KKworbm9tYXNrIHZhcmFyZ3MgaW50IHNub29wKCBvYmplY3QgbWUsIG9iamVjdCB5b3UgKQoreworICAgIGludCByZXQ7CisgICAgb2JqZWN0IHNub29wZXIwLCBzbm9vcGVyLCBzbm9vcGVyMiwgc25vb3BlcjM7CisKKyAgICBpZiggIW9iamVjdHAobWUpIHx8IG1lID09IHlvdSB8fCAhUE8gKQorICAgICAgIHJldHVybiAwOworCisgICAgc25vb3BlcjAgPSBmaW5kX3Nub29wZWQobWUpOworCisgICAgIGlmKHlvdSl7CisgICAgICAgIGlmICggUE8gIT0gbWUgJiYgcXVlcnlfd2l6X2dycChtZSkgPj0gcXVlcnlfd2l6X2dycChnZXRldWlkKFBPKSkgKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgaWYgKCBxdWVyeV93aXpfZ3JwKG1lKSA8PSBxdWVyeV93aXpfZ3JwKHlvdSkgJiYKKyAgICAgICAgICAgICAhKHlvdS0+UXVlcnlBbGxvd1Nub29wKG1lKSkgKQorICAgICAgICAgICAgaWYgKCAhSVNfREVQVVRZKG1lKSB8fCBJU19BUkNIKHlvdSkgKQorICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgaWYgKCAoc25vb3BlciA9IGVmdW46OmludGVyYWN0aXZlX2luZm8oeW91LCBJSV9TTk9PUF9ORVhUKSkgJiYKKyAgICAgICAgICAgICBxdWVyeV93aXpfZ3JwKHNub29wZXIpID49IHF1ZXJ5X3dpel9ncnAobWUpICl7CisgICAgICAgICAgICBpZiAoIChpbnQpc25vb3Blci0+UXVlcnlQcm9wKFBfU05PT1BGTEFHUykgJiBTRl9MT0NLRUQgKQorICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgICAgIHRlbGxfb2JqZWN0KCBzbm9vcGVyLCBzcHJpbnRmKCAiJXMgc25vb3BlZCBqZXR6dCAlcy5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZS0+bmFtZShXRVIpLCB5b3UtPm5hbWUoV0VSKSApICk7CisKKyAgICAgICAgICAgIHNub29wZXIyID0gbWU7CisKKyAgICAgICAgICAgIHdoaWxlICggc25vb3BlcjMgPSBpbnRlcmFjdGl2ZV9pbmZvKHNub29wZXIyLCBJSV9TTk9PUF9ORVhUKSApeworICAgICAgICAgICAgICAgdGVsbF9vYmplY3QoIHNub29wZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCAiJXMgd2lyZCBzZWluZXJzZWl0cyB2b24gJXMgZ2Vzbm9vcGVkLlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsc25vb3BlcjItPm5hbWUoV0VSKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlcjMtPm5hbWUoV0VNKSApICk7CisgICAgICAgICAgICAgICBzbm9vcGVyMiA9IHNub29wZXIzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlZnVuOjpzbm9vcCggc25vb3Blciwgc25vb3BlcjIgKTsKKworICAgICAgICAgICAgaWYgKCBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKHNub29wZXIyLCBJSV9TTk9PUF9ORVhUKSAhPSBzbm9vcGVyICkKKyAgICAgICAgICAgICAgIHRlbGxfb2JqZWN0KCBzbm9vcGVyLCBzcHJpbnRmKCAiRHUga2FubnN0ICVzIG5pY2h0IHNub29wZW4uXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlcjItPm5hbWUoV0VOKSApICk7CisgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgdGVsbF9vYmplY3QoIHNub29wZXIsIHNwcmludGYoICJEdSBzbm9vcHN0IGpldHp0ICVzLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIyLT5uYW1lKFdFTikgKSApOworICAgICAgICAgICAgICAgaWYgKCAhSVNfREVQVVRZKHNub29wZXIpICl7CisgICAgICAgICAgICAgICAgICAgbG9nX2ZpbGUoIFNOT09QTE9HRklMRSwgc3ByaW50ZigiJXM6ICVPICVPICVPXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdGltZSh0aW1lKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjIpICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwICk7CisgICAgICAgICAgICAgICAgICAgaWYgKHNub29wZXIwKQorICAgICAgICAgICAgICAgICAgICAgIENITUFTVEVSLT5zZW5kKCAiU25vb3AiLCBzbm9vcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggIiVzICpPRkYqICVzICglTykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChzbm9vcGVyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHNub29wZXIwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIwKSApICk7CisKKyAgICAgICAgICAgICAgICAgICBDSE1BU1RFUi0+c2VuZCggIlNub29wIiwgc25vb3BlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoIiVzIC0+ICVzICglTykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHNub29wZXIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChzbm9vcGVyMikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIyKSkpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICAgICBsb2dfZmlsZSggQVNOT09QTE9HRklMRSwgc3ByaW50ZiggIiVzOiAlTyAlTyAlT1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdGltZSh0aW1lKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlcjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjIpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTAwMDAwICk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaWYgKHNub29wZXIpCisgICAgICAgICAgICAgICBpZiAoICFtZS0+UXVlcnlQcm9wKFBfU05PT1BGTEFHUykgJiBTRl9MT0NLRUQgKXsKKyAgICAgICAgICAgICAgICAgICBwcmludGYoICIlcyB3aXJkIGJlcmVpdHMgdm9uICVzIGdlc25vb3BlZC4gQmVudXR6ZSBkYXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJmXCItRmxhZywgd2VubiBkdSBkZW5ub2NoIHNub29wZW4gd2lsbHN0LlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeW91LT5uYW1lKFdFUiksIHNub29wZXItPm5hbWUoV0VNKSApOworICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgfQorCisgICAgICAgIHJldCA9IGVmdW46OnNub29wKCBtZSwgeW91ICk7CisKKyAgICAgICAgaWYgKCAhSVNfREVQVVRZKG1lKSAmJiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKHlvdSwgSUlfU05PT1BfTkVYVCkgPT0gbWUpeworICAgICAgICAgICAgbG9nX2ZpbGUoIFNOT09QTE9HRklMRSwgc3ByaW50ZiggIiVzOiAlTyAlTyAlT1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGN1dChkdGltZSh0aW1lKCkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWUsIHlvdSwgZW52aXJvbm1lbnQoeW91KSApLAorICAgICAgICAgICAgICAgICAgICAgMTAwMDAwICk7CisKKyAgICAgICAgICAgIGlmIChzbm9vcGVyMCkKKyAgICAgICAgICAgICAgIENITUFTVEVSLT5zZW5kKCAiU25vb3AiLCBtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggIiVzICpPRkYqICVzICglTykuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChtZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHNub29wZXIwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjApICkgKTsKKworICAgICAgICAgICAgQ0hNQVNURVItPnNlbmQoICJTbm9vcCIsIG1lLCBzcHJpbnRmKCAiJXMgLT4gJXMgKCVPKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQobWUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHlvdSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoeW91KSApICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZXsKKyAgICAgICAgICAgIGlmICggZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyh5b3UsIElJX1NOT09QX05FWFQpID09IG1lICl7CisgICAgICAgICAgICAgICBsb2dfZmlsZSggQVNOT09QTE9HRklMRSwgc3ByaW50ZiggIiVzOiAlTyAlTyAlT1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExjdXQoZHRpbWUodGltZSgpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZSwgeW91LCBlbnZpcm9ubWVudCh5b3UpICksCisgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggcmV0ICYmIHF1ZXJ5X3dpel9ncnAobWUpIDw9IHF1ZXJ5X3dpel9ncnAoeW91KSAmJgorICAgICAgICAgICAgICFJU19ERVBVVFkobWUpICkKKyAgICAgICAgICAgIHRlbGxfb2JqZWN0KCB5b3UsICIqKiogIiArIE5BTUUobWUpICsgIiBzbm9vcHQgRGljaCFcbiIgKTsKKworICAgICAgICByZXR1cm4gcmV0OworICAgICB9CisgICAgIGVsc2UgeworICAgICAgICBpZiAoIChtZSA9PSBQTyB8fAorICAgICAgICAgICAgICBxdWVyeV93aXpfZ3JwKGdldGV1aWQoUE8pKSA+IHF1ZXJ5X3dpel9ncnAobWUpIHx8CisgICAgICAgICAgICAgIChxdWVyeV93aXpfZ3JwKGdldGV1aWQoUE8pKSA9PSBxdWVyeV93aXpfZ3JwKG1lKSAmJgorICAgICAgICAgICAgICBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKFBPLCBJSV9TTk9PUF9ORVhUKSA9PSBtZSkpICYmIHNub29wZXIwICl7CisgICAgICAgICAgICBpZiAoICFJU19ERVBVVFkobWUpICl7CisgICAgICAgICAgICAgICBsb2dfZmlsZSggU05PT1BMT0dGSUxFLCBzcHJpbnRmKCAiJXM6ICVPICVPICVPICpPRkYqXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMY3V0KGR0aW1lKHRpbWUoKSkpLCBtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlcjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIwKSApLAorICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwICk7CisKKyAgICAgICAgICAgICAgICBDSE1BU1RFUi0+c2VuZCggIlNub29wIiwgbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCAiJXMgKk9GRiogJXMgKCVPKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChtZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChzbm9vcGVyMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMCkgKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgIGxvZ19maWxlKCBBU05PT1BMT0dGSUxFLCBzcHJpbnRmKCAiJXM6ICVPICVPICVPICpPRkYqXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGN1dChkdGltZSh0aW1lKCkpKSwgbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIwKSApLAorICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBlZnVuOjpzbm9vcChtZSk7CisgICAgICAgIH0KKyAgICAgfQorICAgICByZXR1cm4gMDsKK30KKworCisKKy8vICogRW11bGF0aW9uIGRlcyAnYWx0ZW4nIGV4cGxvZGUgZHVyY2ggZGFzIG5ldWUKK3N0cmluZyAqb2xkX2V4cGxvZGUoc3RyaW5nIHN0ciwgc3RyaW5nIGRlbCkgeworICBpbnQgcywgdDsKKyAgc3RyaW5nICpzdHJzOworCisgIGlmICghc3RyaW5ncChzdHIpKSB7CisgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigKKyAgICAgICAgICJJbnZhbGlkIGFyZ3VtZW50IDEgdG8gb2xkX2V4cGxvZGUoKSEgRXhwZWN0ZWQgPHN0cmluZz4sIGdvdDogIgorICAgICAgICAgIiUuMzBPXG4iLHN0cikpOworICB9CisgIGlmICghc3RyaW5ncChkZWwpKSB7CisgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigKKyAgICAgICAgICJJbnZhbGlkIGFyZ3VtZW50IDIgdG8gb2xkX2V4cGxvZGUoKSEgRXhwZWN0ZWQgPHN0cmluZz4sIGdvdDogIgorICAgICAgICAgIiUuMzBPXG4iLGRlbCkpOworICB9CisgIGlmKGRlbCA9PSAiIikKKyAgICByZXR1cm4gKHtzdHJ9KTsKKyAgc3Rycz1lZnVuOjpleHBsb2RlKHN0ciwgZGVsKTsKKyAgdD1zaXplb2Yoc3RycyktMTsKKyAgd2hpbGUoczw9dCAmJiBzdHJzW3MrK10gPT0gIiIpO3MtLTsKKyAgd2hpbGUodD49MCAmJiBzdHJzW3QtLV0gPT0gIiIpO3QrKzsKKyAgaWYoczw9dCkKKyAgICByZXR1cm4gc3Ryc1tzLi50XTsKKyAgcmV0dXJuICh7fSk7Cit9CisKK2ludCBmaWxlX3RpbWUoc3RyaW5nIHBhdGgpIHsKKyAgbWl4ZWQgKnY7CisKKyAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgaWYgKHNpemVvZih2PWdldF9kaXIocGF0aCxHRVRESVJfREFURVMpKSkgcmV0dXJuIHZbMF07CisgIHJldHVybigwKTsgLy9zb25zdAorfQorCisvLyAqIEJlaSA1MGsgR3JvZXNzZSBMb2ctRmlsZSByb3RpZXJlbgordmFyYXJncyBpbnQgbG9nX2ZpbGUoc3RyaW5nIGZpbGUsIHN0cmluZyB0eHQsIGludCBzaXplX3RvX2JyZWFrKSB7CisgIG1peGVkICpzdDsKKworICBmaWxlPSIvbG9nLyIrZmlsZTsKKyAgZmlsZT1pbXBsb2RlKChlZnVuOjpleHBsb2RlKGZpbGUsIi8iKS0oeyIuLiJ9KSksIi8iKTsKKy8vICB0ZWxsX29iamVjdChmaW5kX3BsYXllcigiam9mIiksc3ByaW50ZigiTE9HIEZJTEU6ICVPIC0+ICVPXG4iLHByZXZpb3VzX29iamVjdCgpLGZpbGUpKTsKKyAgaWYgKCFmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6Y2FsbF9vdGhlcixQTyksInNlY3VyZS9tYXN0ZXIiLC8vJykKKyAgICAgICAgICAgICAgInZhbGlkX3dyaXRlIixmaWxlLGdldGV1aWQoUE8pLCJsb2dfZmlsZSIsUE8pKQorICAgICAgcmV0dXJuIDA7CisgIGlmICggc2l6ZV90b19icmVhayA+PSAwICYgKAorICAgICAgc2l6ZW9mKHN0ID0gZ2V0X2RpcihmaWxlLDIpICkgJiYgc3RbMF0gPj0gKHNpemVfdG9fYnJlYWt8TUFYX0xPR19TSVpFKSkpCisgICAgICBjYXRjaChyZW5hbWUoZmlsZSwgZmlsZSArICIub2xkIik7cHVibGlzaCk7IC8qIE5vIHBhbmljIGlmIGZhaWx1cmUgKi8KKyAgcmV0dXJuKHdyaXRlX2ZpbGUoZmlsZSx0eHQpKTsKK30KKworLy8gKiBNYWdpZXItTGV2ZWwgYWJmcmFnZW4KK2ludCBxdWVyeV93aXpfbGV2ZWwobWl4ZWQgcGxheWVyKSB7CisgIHJldHVybiAoaW50KSIvc2VjdXJlL21hc3RlciItPnF1ZXJ5X3dpel9sZXZlbChwbGF5ZXIpOworfQorCisjaWZkZWYgX19BTElTVFNfXworLy8gKiBFbGVtZW50IGF1cyBBbGlzdCBsb2VzY2hlbiAoYnkga2V5KQorbWl4ZWQgKnJlbW92ZV9hbGlzdChtaXhlZCBrZXksbWl4ZWQgKmFsaXN0KQoreworICBpbnQgaSxqOworCisgIGlmICghcG9pbnRlcnAoYWxpc3QpIHx8ICFzaXplb2YoYWxpc3QpKQorICAgIHJldHVybiBhbGlzdDsKKyAgaWYgKCFwb2ludGVycChhbGlzdFswXSkpCisgIHsKKyAgICBpZiAoKGk9YXNzb2Moa2V5LGFsaXN0KSk8MCkKKyAgICAgIHJldHVybiBhbGlzdDsKKyAgICByZXR1cm4gYWxpc3RbMC4uaS0xXSthbGlzdFtpKzEuLl07CisgIH0KKyAgaSA9IGFzc29jKGtleSxhbGlzdFswXSk7CisgIGlmICgoaT1hc3NvYyhrZXksYWxpc3RbMF0pKTwwKQorICAgIHJldHVybiBhbGlzdDsKKyAgYWxpc3Q9YWxpc3RbMC4uXTsKKyAgZm9yIChqPXNpemVvZihhbGlzdCktMTtqPj0wO2otLSkKKyAgICBhbGlzdFtqXT1hbGlzdFtqXVswLi5pLTFdK2FsaXN0W2pdW2krMS4uXTsKKyAgcmV0dXJuIGFsaXN0OworfQorCisvLyAqIEVsZW1lbnQgYXVzIEFsaXN0IGxvZXNjaGVuIChieSBwb3MpCittaXhlZCAqZXhjbHVkZV9hbGlzdChpbnQgaSxtaXhlZCAqYWxpc3QpCit7CisgIGludCBqOworICBpZiAoIXBvaW50ZXJwKGFsaXN0KSB8fCAhc2l6ZW9mKGFsaXN0KSB8fCBpPDApCisgICAgcmV0dXJuIGFsaXN0OworICBpZiAoIXBvaW50ZXJwKGFsaXN0WzBdKSkKKyAgICByZXR1cm4gYWxpc3RbMC4uaS0xXSthbGlzdFtpKzEuLl07CisgIGFsaXN0PWFsaXN0WzAuLl07IC8qIENyZWF0ZSBQSFlTSUNBTCBjb3B5IG9mIGFsaXN0ICovCisgIGZvciAoaj1zaXplb2YoYWxpc3QpLTE7aj49MDtqLS0pCisgICAgYWxpc3Rbal09YWxpc3Rbal1bMC4uaS0xXSthbGlzdFtqXVtpKzEuLl07CisgIHJldHVybiBhbGlzdDsgLyogb3JkZXJfYWxpc3QgaXMgTk9UIG5lY2Vzc2FyeSAtIHNlZSAvZG9jL0xQQy9hbGlzdCAqLworfQorI2VuZGlmIC8vIF9fQUxJU1RTX18KKworLy8gKiBHZXJtYW4gdmVyc2lvbiBvZiBjdGltZSgpCisjZGVmaW5lIFRBR0UgKHsiU29uIiwiTW9uIiwiRGllIiwiTWl0IiwiRG9uIiwiRnJlIiwiU2FtIn0pCisjZGVmaW5lIE1PTkFURSAoeyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYWkiLCJKdW4iLCJKdWwiLCJBdWciLFwKKyAgICAgICAgICAgICAgICAgIlNlcCIsIk9rdCIsIk5vdiIsIkRleiJ9KQorc3RyaW5nIGR0aW1lKGludCB3YW5uKSB7CisgIAorICBpZiAod2FubiA9PSBkdGltZV9jYWNoZVswXSkKKyAgICByZXR1cm4oZHRpbWVfY2FjaGVbMV0pOworCisgIGludCAqbHQgPSBsb2NhbHRpbWUod2Fubik7CisgIHJldHVybiBzcHJpbnRmKCIlcywgJTJkLiAlcyAlZCwgJTAyZDolMDJkOiUwMmQiLAorICAgICAgVEFHRVtsdFtUTV9XREFZXV0sIGx0W1RNX01EQVldLCBNT05BVEVbbHRbVE1fTU9OXV0sIAorICAgICAgbHRbVE1fWUVBUl0sbHRbVE1fSE9VUl0sIGx0W1RNX01JTl0sIGx0W1RNX1NFQ10pOworfQorCisvLyB3ZW5uIHN0cmZ0aW1lIGltIERyaXZlciBuaWNodCBleGlzdGllcnQsIGlzdCBkaWVzIGhpZXIgZWluIEFsaWFzIGF1ZiBkdGltZSgpLAorLy8gendhciBzdGltbXQgZGFzIEZvcm1hdCBkYW5uIG5pY2h0LCBhYmVyIGRpZSBNdWRsaWIgYnVnZ3QgbmljaHQgdW5kIHNjaHJlaWJ0CisvLyBlaW4gb3JkZW50bGljaGVzIERhdHVtL1VocnplaXQuCisjaWYgIV9fRUZVTl9ERUZJTkVEX18oc3RyZnRpbWUpCit2YXJhcmdzIHN0cmluZyBzdHJmdGltZShtaXhlZCBmbXQsIGludCBjbG9jaywgaW50IGxvY2FsaXplZCkgeworICBpZiAoaW50cChjbG9jaykgJiYgY2xvY2sgPj0gMCkKKyAgICByZXR1cm4gZHRpbWUoY2xvY2spOworICBlbHNlIGlmIChpbnRwKGZtdCkgJiYgZm10ID49IDApCisgICAgcmV0dXJuIGR0aW1lKGZtdCk7CisgIAorICByZXR1cm4gZHRpbWUodGltZSgpKTsKK30KKyNlbmRpZiAvLyFfX0VGVU5fREVGSU5FRF9fKHN0cmZ0aW1lKQorCisvLyAqIFNodXRkb3duIG1pdCB6dXNhZXR6bGljaGVtIGxvZ2dpbmcKK25vbWFzayBpbnQgc2h1dGRvd24oc3RyaW5nIHJlYXNvbikKK3sKKyAgc3RyaW5nIG5hbWU7CisgIHN0cmluZyBvYm5hbWU7CisgIHN0cmluZyBvdXRwdXQ7CisKKyAgaWYgKCFyZWFzb24pCisgICAgcmV0dXJuIDA7CisgIGlmICggIUFSQ0hfU0VDVVJJVFkgJiYgZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKSE9Uk9PVElEICYmCisgICAgICAgICAgb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpIT0iL29iai9zaHV0IiApCisgIHsKKyAgICB3cml0ZSgiWW91IGhhdmUgbm8gcGVybWlzc2lvbiB0byBzaHV0IGRvd24gdGhlIGdhbWVkcml2ZXIhXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoKHRoaXNfaW50ZXJhY3RpdmUoKSkmJihuYW1lPWdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpKSkKKyAgeworICAgIG5hbWU9Y2FwaXRhbGl6ZShuYW1lKTsKKyAgICBmaWx0ZXIodXNlcnMoKSwjJ3RlbGxfb2JqZWN0LC8vJworICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShuYW1lKSsiIGZhZWhydCBkYXMgU3BpZWwgaGVydW50ZXIhXG4iKTsKKyAgfQorICBlbHNlCisgICAgbmFtZT0iQU5PTllNT1VTIjsKKyAgaWYgKHByZXZpb3VzX29iamVjdCgpKSBvYm5hbWU9Y2FwaXRhbGl6ZShnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpKTsKKyAgb3V0cHV0PW5hbWU7CisgIGlmIChvYm5hbWUgJiYgbmFtZSE9b2JuYW1lKSBvdXRwdXQ9b3V0cHV0KyIgKCIrb2JuYW1lKyIpIjsKKyAgaWYgKHByZXZpb3VzX29iamVjdCgpJiZvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSk9PSIvb2JqL3NodXQiKXsKKyAgICBvdXRwdXQrPSIgZmFlaHJ0IGRhcyBTcGllbCB2aWEgQXJtYWdlZGRvbiBoZXJ1bnRlci5cbiI7CisgICAgb3V0cHV0PWR0aW1lKHRpbWUoKSkrIjogIitvdXRwdXQ7CisgICAgbG9nX2ZpbGUoIkdBTUVfTE9HIixvdXRwdXQrIlxuIiwtMSk7CisgICAgZWZ1bjo6c2h1dGRvd24oKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBvdXRwdXQ9Y3RpbWUodGltZSgpKSsiOiAiK291dHB1dCsiIGZhZWhydCBkYXMgU3BpZWwgaGVydW50ZXIuXG4iOworICBvdXRwdXQrPSIgICAgR3J1bmQ6ICIrcmVhc29uOworICBsb2dfZmlsZSgiR0FNRV9MT0ciLG91dHB1dCsiXG4iLC0xKTsKKyAgZWZ1bjo6c2h1dGRvd24oKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vICogbG93ZXJjaGFyCisKK2ludCBsb3dlcmNoYXIoaW50IGNoYXIpIHsKKyAgaWYgKGNoYXI8J0EnIHx8IGNoYXI+J1onKSByZXR1cm4gY2hhcjsKKyAgcmV0dXJuIGNoYXIrMzI7Cit9CisKKy8vICogdXBwZXJzdHJpbmcKKworc3RyaW5nIHVwcGVyc3RyaW5nKHN0cmluZyBzKQoreworI2lmIF9fRUZVTl9ERUZJTkVEX18odXBwZXJfY2FzZSkKKyAgcmV0dXJuKHVwcGVyX2Nhc2UocykpOworI2Vsc2UKKyAgaW50IGk7CisgIGlmICghc3RyaW5ncChzKSkgcmV0dXJuIDA7CisgIGZvciAoaT1zaXplb2YocyktMTtpPj0wO2ktLSkgc1tpXT0oKHNbaV08J2EnfHxzW2ldPid6Jyk/c1tpXTpzW2ldLTMyKTsKKyAgcmV0dXJuIHM7CisjZW5kaWYKK30KKworLy8gKiBsb3dlcnN0cmluZworCitzdHJpbmcgbG93ZXJzdHJpbmcoc3RyaW5nIHMpCit7CisgIGlmICghc3RyaW5ncChzKSkgcmV0dXJuIDA7CisgIHJldHVybiBsb3dlcl9jYXNlKHMpOworfQorCisKKy8vICogR0QgdmVyc2lvbgorc3RyaW5nIHZlcnNpb24oKQoreworICByZXR1cm4gX19WRVJTSU9OX187Cit9CisKKy8vICogYnJlYWtfc3RyaW5nCisvLyBzdHJldGNoKCkgLS0gc3RyZXRjaCBhIGxpbmUgdG8gZmlsbCBhIGdpdmVuIHdpZHRoIAorcHJpdmF0ZSBzdHJpbmcgc3RyZXRjaChzdHJpbmcgcywgaW50IHdpZHRoKSB7CisgIGludCBsZW49c2l6ZW9mKHMpOworICBpZiAobGVuPT13aWR0aCkgcmV0dXJuIHM7CisKKyAgLy8gcmVpbmUgTGVlcnplaWxlbiwgZGlyZWt0IHp1cnVlY2tnZWJlbgorICBzdHJpbmcgdHJpbW1lZD10cmltKHMsVFJJTV9MRUZULCIgIik7CisgIGlmICh0cmltbWVkPT0iIikgcmV0dXJuIHM7IAorICBpbnQgc3RhcnRfc3BhY2VzID0gbGVuIC0gc2l6ZW9mKHRyaW1tZWQpOworCisgIHN0cmluZyogd29yZHMgPSBleHBsb2RlKHRyaW1tZWQsICIgIik7CisgIC8vIGRlciBsZXR6dGUga3JpZWd0IGtlaW5lIFNwYWNlcworICBpbnQgd29yZF9jb3VudD1zaXplb2Yod29yZHMpIC0gMTsKKyAgLy8gd2VubiBaZWlsZSBudXIgYXVzIGVpbmVtIFdvcnQsIHdpcmQgZGFzIFdvcnQgenVydWVja2dlZ2ViZW4KKyAgaWYgKCF3b3JkX2NvdW50KQorICAgIHJldHVybiAiICIqc3RhcnRfc3BhY2VzICsgd29yZHNbMF07CisKKyAgaW50IHNwYWNlX2NvdW50ID0gd2lkdGggLSBsZW47CisKKyAgaW50IHNwYWNlX3Blcl93b3JkPSh3b3JkX2NvdW50K3NwYWNlX2NvdW50KSAvIHdvcmRfY291bnQ7CisgIC8vIEFuei5Xb2VydGVyIG1pdCBadXNhdHotU3BhY2UKKyAgaW50IHJlc3Q9KHdvcmRfY291bnQrc3BhY2VfY291bnQpICUgd29yZF9jb3VudDsgCisgIC8vIFJlc3QtU3BhY2VzIFZlcnRlaWxlbgorICBmb3JlYWNoIChpbnQgcG9zIDogcmVzdCkgd29yZHNbcG9zXSs9IiAiOworICByZXR1cm4gKCIgIipzdGFydF9zcGFjZXMpICsgaW1wbG9kZSggd29yZHMsICIgIipzcGFjZV9wZXJfd29yZCApOworfQorCisvLyBhdXMgR2VzY2h3aW5kaWdrZWl0c2dydWVuZGVuIGhhdCBkZXIgQmxvY2tzYXR6IGZ1ZXIgYnJlYWtfc3RyaW5nIGVpbmUKKy8vIGVpZ2VuZSBGdW5rdGlvbiBiZWtvbW1lbjoKK3ByaXZhdGUgdmFyYXJncyBzdHJpbmcgYmxvY2tfc3RyaW5nKHN0cmluZyBzLCBpbnQgd2lkdGgsIGludCBmbGFncykgeworICAvLyB3ZW5uIEJTX0xFQVZFX01ZX0xGUywgYWJlciBrZWluIEJTX05PX1BBUklOREVOVCwgZGFubiB3ZXJkZW4gWmVpbGVuIG1pdAorICAvLyBlaW5lbSBMZWVyemVpY2hlbiBiZWdvbm5lbi4KKyAgLy8gQlRXOiBXZW5uICFCU19MRUFWRV9NWV9MRlMsIGhhdCBkZXIgQXVmcnVmZXIgYmVyZWl0cyBhbGxlIFxuIGR1cmNoICIgIgorICAvLyBlcnNldHp0LgorICBpZiAoIChmbGFncyAmIEJTX0xFQVZFX01ZX0xGUykKKyAgICAgICYmICEoZmxhZ3MgJiBCU19OT19QQVJJTkRFTlQpKQorICB7CisgICAgICBzID0gIiAiK3JlZ3JlcGxhY2UocywiXG4iLCJcbiAiLDEpOworICB9CisKKyAgLy8gc3ByaW50ZiBmdWVsbHQgZGllIGxldHp0ZSBaZWlsZSBhdWYgZGllIEZlbGRicmVpdGUgKGhpZXIgYWxzbworICAvLyBaZWlsZW5icmVpdGUpIG1pdCBGdWVsbHplaWNoZW4gYXVmLCB3ZW5uIHNpZSBOSUNIVCBtaXQgXG4gdW1nZWJyb2NoZW4KKyAgLy8gaXN0LiBFcyB3aXJkIGFuIGRpZSBsZXR6dGUgWmVpbGUgYWJlciBrZWluIFplaWxlbnVtYnJ1Y2ggYW5nZWhhZW5ndC4KKyAgLy8gRWlnZW50bGljaCBpc3QgZGFzIEF1ZmZ1ZWxsZW4gZG9vZiwgYWJlciB2ZXJtdXRsaWNoIGlzdCBlcyB1bm5vZXRpZywgZXMKKyAgLy8gd2llZGVyIHJ1ZWNrZ2FlbmdpZyB6dSBtYWNoZW4uCisgIHMgPSBzcHJpbnRmKCAiJS0qPXMiLCB3aWR0aCwgcyk7CisKKyAgc3RyaW5nICp0bXA9ZXhwbG9kZShzLCAiXG4iKTsKKyAgLy8gTnVyIHdlbm4gcyBtZWhyemVpbGlnIGlzdCwgQmxvY2tzYXR6IGRyYXVzIG1hY2hlbi4gRGllIGxldHp0ZSBaZWlsZSB3aXJkCisgIC8vIG5hdHVlcmxpY2ggbmljaHQgZ2VkZWhudC4gU2llIGlzdCBkYWZ1ZXIgc2Nob24gdm9uIHNwcmludGYoKSBhdWZnZWZ1ZWxsdAorICAvLyB3b3JkZW4uIEJUVzogRGllIGxldHp0ZSBaZWlsZSBlbmRldCB1LlUuIG5vY2ggbmljaHQgbWl0IGVpbmVtIFxuIChiencuCisgIC8vIG51ciBkYW5uLCB3ZW5uIEJTX0xFQVZFX01ZX0xGUyB1bmQgZGVyIHVlYmVyZ2ViZW5lIFRleHQgc2Nob24gbmVuIFxuIGFtCisgIC8vIEVuZGUgZGVyIGxldHp0ZW4gWmVpbGUgaGF0KSwgZGFzIG1hY2h0IGRlciBBdWZydWZlci4uLgorICBpZiAoc2l6ZW9mKHRtcCkgPiAxKQorICAgIHJldHVybiBpbXBsb2RlKCBtYXAoIHRtcFswLi48Ml0sICMnc3RyZXRjaC8qJyovLCB3aWR0aCApLCAiXG4iICkgCisgICAgICArICJcbiIgKyB0bXBbPDFdOworCisgIHJldHVybiBzOworfQorCitwdWJsaWMgdmFyYXJncyBzdHJpbmcgYnJlYWtfc3RyaW5nKHN0cmluZyBzLCBpbnQgdywgbWl4ZWQgaW5kZW50LCBpbnQgZmxhZ3MpCit7CisgICAgaWYgKCAhcyB8fCBzID09ICIiICkgcmV0dXJuICIiOworCisgICAgaWYgKCAhdyApIHc9Nzg7CisKKyAgICBpZiggaW50cChpbmRlbnQpICkKKyAgICAgICBpbmRlbnQgPSBpbmRlbnQgPyAiICIqaW5kZW50IDogIiI7CisKKyAgICBpbnQgaW5kZW50bGVuPXN0cmluZ3AoaW5kZW50KSA/IHNpemVvZihpbmRlbnQpIDogMDsKKworICAgIGlmIChpbmRlbnRsZW4+dykgeworICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoImJyZWFrX3N0cmluZzogaW5kZW50IGxvbmdlciAlZCB0aGFuIHdpZHRoICVkXG4iLAorICAgICAgICAgICAgICAgICAgaW5kZW50bGVuLHcpKTsKKyAgICAgIC8vIHc9KChpbmRlbnRsZW4vdykrMSkqdzsKKyAgICB9CisKKyAgICBpZiAoIShmbGFncyAmIEJTX0xFQVZFX01ZX0xGUykpIAorICAgICAgcz1yZWdyZXBsYWNlKCBzLCAiXG4iLCAiICIsIDEgKTsKKworICAgIGlmICggZmxhZ3MgJiBCU19TSU5HTEVfU1BBQ0UgKQorICAgICAgIHMgPSByZWdyZXBsYWNlKCBzLCAiKF58XG58ICkgICoiLCAiXFwxIiwgMSApOworIAorICAgIHN0cmluZyBwcmVmaXg9IiI7CisgICAgaWYgKGluZGVudGxlbiAmJiBmbGFncyAmIEJTX1BSRVBFTkRfSU5ERU5UKSB7CisgICAgICBpZiAoaW5kZW50bGVuK3NpemVvZihzKSA+IHcgfHwgCisgICAgICAgICAoZmxhZ3MgJiBCU19MRUFWRV9NWV9MRlMpICYmIHN0cnN0cihzLCJcbiIpPi0xKSB7CisgICAgICAgcHJlZml4PWluZGVudCsiXG4iOworICAgICAgIGluZGVudD0oZmxhZ3MgJiBCU19OT19QQVJJTkRFTlQpID8gIiIgOiAiICI7CisgICAgICAgaW5kZW50bGVuPXNpemVvZihpbmRlbnQpOworICAgICAgfQorICAgIH0KKworICAgIGlmICggZmxhZ3MgJiBCU19CTE9DSyApIHsKKyAgICAgIC8qCisgICAgICAgICAgIHMgPSBpbXBsb2RlKCBtYXAoIGV4cGxvZGUoIHMsICJcbiIgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjJ2Jsb2NrX3N0cmluZywgdywgaW5kZW50bGVuLCBmbGFncyksCisgICAgICAgICAgICAgICAgICAgICAgIiIgKTsKKyAgICAgICovCisgICAgICBzID0gYmxvY2tfc3RyaW5nKCBzICwgdyAtIGluZGVudGxlbiwgZmxhZ3MgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBzID0gc3ByaW50ZigiJS0xLio9cyIsdy1pbmRlbnRsZW4scyk7CisgICAgfQorICAgIGlmICggc1s8MV0gIT0gJ1xuJyApIHMgKz0gIlxuIjsKKworICAgIGlmICggIWluZGVudGxlbiApIHJldHVybiBwcmVmaXggKyBzOworICAgIAorICAgIHN0cmluZyBpbmRlbnQyID0gKCBmbGFncyAmIEJTX0lOREVOVF9PTkNFICkgPyAoIiAiKmluZGVudGxlbikgOmluZGVudDsKKyAgICAgIAorICAgIHJldHVybiBwcmVmaXggKyBpbmRlbnQgKyAKKyAgICAgIHJlZ3JlcGxhY2UoIHNbMC4uPDJdLCAiXG4iLCAiXG4iK2luZGVudDIsIDEgKSArICJcbiI7CisgICAgICAvKgorICAgICAgIHN0cmluZyAqYnVmOworCisgICAgICAgYnVmID0gZXhwbG9kZSggcywgIlxuIiApOworICAgICAgIHJldHVybiBwcmVmaXggKyBpbmRlbnQgKyBpbXBsb2RlKCBidWZbMC4uPDJdLCAiXG4iK2luZGVudDIgKSArIGJ1Zls8MV0gKyAiXG4iOworICAgICAgKi8KK30KKworLy8gKiBFbGVtZW50ZSBhdXMgbWFwcGluZyBsb2VzY2hlbiAtIG1hcHBpbmcgdm9yaGVyIGtvcGllcmVuCisKK21hcHBpbmcgbV9jb3B5X2RlbGV0ZShtYXBwaW5nIG0sIG1peGVkIGtleSkgeworICByZXR1cm4gbV9kZWxldGUoY29weShtKSwga2V5KTsKK30KKworLy8gKiB0aW1lcworaW50IGxhc3RfcmVib290X3RpbWUoKQoreworICByZXR1cm4gX19CT09UX1RJTUVfXzsKK30KKworaW50IGZpcnN0X2Jvb3RfdGltZSgpCit7CisgIHJldHVybiA3MDE1MTc2MDA7Cit9CisKK2ludCBleGlzdF9kYXlzKCkKK3sKKyAgcmV0dXJuICgoKHRpbWUoKS1maXJzdF9ib290X3RpbWUoKSkvODY0MCkrNSkvMTA7Cit9CisKKy8vICogdXB0aW1lIDopCitzdHJpbmcgdXB0aW1lKCkKK3sKKyAgaW50IHQ7CisgIGludCB0bXA7CisgIHN0cmluZyBzOworCisgIHQ9dGltZSgpLV9fQk9PVF9USU1FX187CisgIHM9IiI7CisgIGlmICh0Pj04NjQwMCkKKyAgICBzKz1zcHJpbnRmKCIlZCBUYWclcywgIix0bXA9dC84NjQwMCwodG1wPT0xPyIiOiJlIikpOworICBpZiAodD49MzYwMCkKKyAgICBzKz1zcHJpbnRmKCIlZCBTdHVuZGUlcywgIix0bXA9KHQ9dCU4NjQwMCkvMzYwMCwodG1wPT0xPyIiOiJuIikpOworICBpZiAodD42MCkKKyAgICBzKz1zcHJpbnRmKCIlZCBNaW51dGUlcyB1bmQgIix0bXA9KHQ9dCUzNjAwKS82MCwodG1wPT0xPyIiOiJuIikpOworICByZXR1cm4gcytzcHJpbnRmKCIlZCBTZWt1bmRlJXMiLHQ9dCU2MCwodD09MT8iIjoibiIpKTsKK30KKworLy8gKiBXYXMgdHVuIGJlaSAnZGFuZ2xpbmcnIGxmdW4tY2xvc3VyZXMgPwordm9pZCBkYW5nbGluZ19sZnVuX2Nsb3N1cmUoKSB7CisgIHJhaXNlX2Vycm9yKCJkYW5nbGluZyBsZnVuIGNsb3N1cmVcbiIpOworfQorCisvLyAqIFNwZXJyZW4gYXVzc2VyIGZ1ZXIgbWFzdGVyL3NpbXVsX2VmdW4KKworI2lmIF9fRUZVTl9ERUZJTkVEX18oc2V0X2Vudmlyb25tZW50KQorbm9tYXNrIHZvaWQgc2V0X2Vudmlyb25tZW50KG9iamVjdCBvMSwgb2JqZWN0IG8yKSB7CisgIHJhaXNlX2Vycm9yKCJBdmFpbGFibGUgb25seSBmb3Igcm9vdFxuIik7Cit9CisjZW5kaWYKKworbm9tYXNrIHZvaWQgc2V0X3RoaXNfcGxheWVyKG9iamVjdCBwbCkgeworICByYWlzZV9lcnJvcigiQXZhaWxhYmxlIG9ubHkgZm9yIHJvb3RcbiIpOworfQorCisjaWYgX19FRlVOX0RFRklORURfXyhleHBvcnRfdWlkKQorbm9tYXNrIHZvaWQgZXhwb3J0X3VpZChvYmplY3Qgb2IpIHsKKyAgcmFpc2VfZXJyb3IoIkF2YWlsYWJsZSBvbmx5IGZvciByb290XG4iKTsKK30KKyNlbmRpZgorCisvLyAqIEpldHp0IGF1Y2ggY2xvc3VyZXMKK2ludCBwcm9jZXNzX2ZsYWc7CisKK3B1YmxpYyBub21hc2sgaW50IHByb2Nlc3NfY2FsbCgpCit7CisgIGlmIChwcm9jZXNzX2ZsYWc+MCkKKyAgICByZXR1cm4gcHJvY2Vzc19mbGFnOworICBlbHNlIHJldHVybigwKTsKK30KKworcHJpdmF0ZSBub21hc2sgc3RyaW5nIF9wcm9jZXNzX3N0cmluZyhzdHJpbmcgc3RyLG9iamVjdCBwbykgeworICAgICAgICAgICAgICBzZXRfdGhpc19vYmplY3QocG8pOworICAgICAgICAgICAgICByZXR1cm4oZWZ1bjo6cHJvY2Vzc19zdHJpbmcoc3RyKSk7Cit9CisKK25vbWFzayBzdHJpbmcgcHJvY2Vzc19zdHJpbmcoIG1peGVkIHN0ciApCit7CisgIHN0cmluZyB0bXAsIGVycjsKKyAgaW50IGZsYWc7IAorCisgIGlmICggY2xvc3VyZXAoc3RyKSApIHsKKyAgICAgIHNldF90aGlzX29iamVjdCggcHJldmlvdXNfb2JqZWN0KCkgKTsKKyAgICAgIHJldHVybiBmdW5jYWxsKHN0cik7CisgIH0KKyAgZWxzZSBpZiAoc3RyPT0wKQorICAgICAgcmV0dXJuKChzdHJpbmcpc3RyKTsKKyAgZWxzZSBpZiAoICFzdHJpbmdwKHN0cikgKSB7CisgICAgICByZXR1cm4gdG9fc3RyaW5nKHN0cik7CisgIH0KKworICBpZiAoICEoZmxhZyA9IHByb2Nlc3NfZmxhZyA+IHRpbWUoKSAtIDYwKSkgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIHByb2Nlc3NfZmxhZz10aW1lKCk7CisKKyAgZXJyID0gY2F0Y2godG1wID0gZnVuY2FsbCgjJ19wcm9jZXNzX3N0cmluZyxzdHIscHJldmlvdXNfb2JqZWN0KCkpOyBwdWJsaXNoKTsKKworICBpZiAoICFmbGFnICkKKyAgICBwcm9jZXNzX2ZsYWc9MDsKKworICBpZiAoZXJyKSB7CisgICAgLy8gVmVyYXJiZWl0dW5nIGFiYnJlY2hlbgorICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgcmFpc2VfZXJyb3IoZXJyKTsKKyAgfQorICByZXR1cm4gdG1wOworfQorCisvLyAnbWtkaXIgLXAnIC0gZXJ6ZXVndCBlaW5lIGtvbXBsZXR0ZSBIaWVyYXJjaGllIHZvbiBWZXJ6ZWljaG5pc3Nlbi4KKy8vIHdlbm4gZGFzIFZlcnplaWNobmlzIGFuZ2VsZWd0IHd1cmRlIG9kZXIgc2Nob24gZXhpc3RpZXJ0LCB3aXJkIDEKKy8vIHp1cnVlY2tnZWxpZWZlcnQsIHNvbnN0IDAuCisvLyBXaXJmdCBlaW5lbiBGZWhsZXIsIHdlbm4gZGFzIGFuZ2ViZW5lIFZlcnplaWNobmlzIG5pY2h0IGFic29sdXQgaXN0IQorcHVibGljIGludCBta2RpcnAoc3RyaW5nIGRpcikgeworICAvLyB3ZW5uIGVzIG51ciBrZWluZW4gZnVlaHJlbmRlbiAvIGdpYnQsIGlzdCBkYXMgZWluIEZlaGxlci4KKyAgaWYgKHN0cnN0cihkaXIsICIvIikgIT0gMCkKKyAgICByYWlzZV9lcnJvcigibWtkaXJwKCk6IFBmYWQgaXN0IG5pY2h0IGFic29sdXRlLlxuIik7CisgIC8vIGN1dCBvZmYgdHJhaWxpbmcgLy4uLgorICBpZiAoZGlyWzwxXT09Jy8nKQorICAgICAgZGlyID0gZGlyWzAuLjwyXTsKKworICBpbnQgZnN0YXQgPSBmaWxlX3NpemUoZGlyKTsKKyAgLy8gd2VubiBlcyBzY2hvbiBleGlzdGllcnQsIHR1biB3aXIgZWluZmFjaCBzbywgYWxzIGhhZXR0ZW4gd2lyIGVzIGFuZ2VsZWd0LgorICBpZiAoZnN0YXQgPT0gRlNJWkVfRElSKQorICAgIHJldHVybiAxOworICAvLyB3ZW5uIHNjaG9uIG5lIERhdGVpIGV4aXN0aWVydCwgZ2VodCBlcyBuaWNodC4KKyAgaWYgKGZzdGF0ICE9IEZTSVpFX05PRklMRSkKKyAgICByZXR1cm4gMDsKKyAgLy8gd2VubiBlcyBudXIgZWluZW4gLyBnaWJ0IChkZW4gZnVlaHJlbmRlbiksIGRhbm4gaXN0IGVzIGVpbgorICAvLyB0b3BsZXZlbC12ZXJ6ZWljaG5pcywgd2FzIGRpcmVrdCBhbmdlbGVndCB3aXJkLgorICBpZiAoc3RycnN0cihkaXIsIi8iKT09MCkgeworICAgIHJldHVybiBmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6bWtkaXIsIHByZXZpb3VzX29iamVjdCgpKSwgZGlyKTsKKyAgfQorCisgIC8vIG1rZGlyKCkgbmljaHQgZGlyZWt0IHJ1ZmVuLCBzb25kZXJuIHZvcmhlciBhbHMgY2xvc3VyZSBhbnMgYXVmcnVmZW5kZQorICAvLyBPYmpla3QgYmluZGVuLiBTb25zdCBsYWV1ZnQgZGllIFJlY2h0ZXBydWVmdW5nIGluIHZhbGlkX3dyaXRlKCkgaW0gTWFzdGVyCisgIC8vIHVudGVyIGRlciBBbm5haG1lLCBkYXNzIGRpZSBzaW11bF9lZnVuLmMgbWl0IGlocmVyIHJvb3QgaWQgd2FzIHdpbGwuCisKKyAgLy8gamV0enQgcmVrdXJzaXYgZGllIFZlcnplaWNobmlzaGllcmFyY2hpZSBhbmxlZ2VuLiBXZW5uIGRhcyBlcmZvbGdyZWljaAorICAvLyBpc3QsIGRhbm4ga29lbm5lbiB3aXIgamV0enQgbWl0IG1rZGlyIGRhcyB0aWVmc3RlIFZlcnplaWNobmlzIGFubGVnZW4KKyAgaWYgKG1rZGlycChkaXJbMC4uc3RycnN0cihkaXIsIi8iKS0xXSkgPT0gMSkKKyAgICByZXR1cm4gZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46Om1rZGlyLCBwcmV2aW91c19vYmplY3QoKSksIGRpcik7Cit9CisKKworLy8gKiBQcm9wZXJ0aWVzIGdnZnMuIG1pdHNwZWljaGVybgorbWl4ZWQgc2F2ZV9vYmplY3QobWl4ZWQgbmFtZSkKK3sKKyAgbWFwcGluZyBwcm9wZXJ0aWVzOworICBtYXBwaW5nIHNhdmU7CisgIG1peGVkIGluZGV4LCByZXM7CisgIGludCBpOworCisgIC8vIG51ciBTdHJpbmdzIHVuZCAwIHp1bGFzc2VuCisgIGlmICgoIXN0cmluZ3AobmFtZSkgfHwgIXNpemVvZihuYW1lKSkgJiYgCisgICAgICAoIWludHAobmFtZSkgfHwgbmFtZSE9MCkpIHsKKyAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKAorICAgICAgICAgIk9ubHkgbm9uLWVtcHR5IHN0cmluZ3MgYW5kIDAgbWF5IGJlIHVzZWQgYXMgZmlsZW5hbWUgaW4gIgorICAgICAgICAgInNlZnVuOjpzYXZlX29iamVjdCgpISBBcmd1bWVudCB3YXMgJU9cbiIsbmFtZSkpOworICB9CisKKyAgc2F2ZSA9IG1fYWxsb2NhdGUoMCwgMik7CisgIHByb3BlcnRpZXMgPSAobWFwcGluZylwcmV2aW91c19vYmplY3QoKS0+UXVlcnlQcm9wZXJ0aWVzKCk7CisKKyAgaWYobWFwcGluZ3AocHJvcGVydGllcykpCisgIHsKKyAgICAvLyBkZWxldGUgYWxsIGVudHJpZXMgaW4gbWFwcGluZyBwcm9wZXJ0aWVzIHdpdGhvdXQgU0FWRSBmbGFnIQorICAgIGluZGV4ID0gbV9pbmRpY2VzKHByb3BlcnRpZXMpOworICAgIGZvcihpID0gc2l6ZW9mKGluZGV4KS0xOyBpPj0wO2ktLSkKKyAgICB7CisgICAgICBpZihwcm9wZXJ0aWVzW2luZGV4W2ldLCBGX01PREVdICYgU0FWRSkKKyAgICAgIHsKKyAgICAgICBzYXZlW2luZGV4W2ldXSA9IHByb3BlcnRpZXNbaW5kZXhbaV1dOworICAgICAgIHNhdmVbaW5kZXhbaV0sIEZfTU9ERV0gPQorICAgICAgIHByb3BlcnRpZXNbaW5kZXhbaV0sIEZfTU9ERV0gJgorICAgICAgICAgICAgICAgICAgICAofihTRVRNTk9URk9VTkR8UVVFUllNTk9URk9VTkR8UVVFUllDQUNIRUR8U0VUQ0FDSEVEKSk7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2Ugc2F2ZSA9IChbXSk7CisKKyAgLy8gc2F2ZSBvYmplY3QhCisgIHByZXZpb3VzX29iamVjdCgpLT5fc2V0X3NhdmVfZGF0YShzYXZlKTsKKyAgLy8gZm9ybWF0OiB3aWUgZGVmaW5pZXJ0IGluIGNvbmZpZy5oCisgIGlmIChzdHJpbmdwKG5hbWUpKQorICAgIHJlcyA9IGZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjpzYXZlX29iamVjdCwgcHJldmlvdXNfb2JqZWN0KCkpLCBuYW1lLAorICAgICAgIF9fTElCX19TQVZFX0ZPUk1BVF9WRVJTSU9OX18pOworICBlbHNlCisgICAgcmVzID0gZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46OnNhdmVfb2JqZWN0LCBwcmV2aW91c19vYmplY3QoKSksCisgICAgICAgX19MSUJfX1NBVkVfRk9STUFUX1ZFUlNJT05fXyk7CisgIHByZXZpb3VzX29iamVjdCgpLT5fc2V0X3NhdmVfZGF0YSgwKTsKKworI2lmZGVmIElPU1RBVFMKKyAgLy8gU3RhdHMuLi4KKyAgc3RydWN0IGlvc3RhdF9zIHN0YXQgPSAoPGlvc3RhdF9zPik7CisgIHN0YXQtPm9uYW1lID0gb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpOworICBzdGF0LT50aW1lID0gdGltZSgpOworICAvL3N0YXQtPnNpemUgPSAoaW50KW9iamVjdF9pbmZvKHByZXZpb3VzX29iamVjdCgpLE9JTkZPX01FTU9SWSwKKyAgLy8gICAgT0lNX1RPVEFMX0RBVEFfU0laRSk7CisgIGlmIChzdHJpbmdwKG5hbWUpKQorICAgICAgc3RhdC0+c2l6ZSA9IGZpbGVfc2l6ZShuYW1lICsgIi5vIik7CisgIGVsc2UKKyAgICAgIHN0YXQtPnNpemVvZihyZXMpOworICAvL2RlYnVnX21lc3NhZ2UoInNhdmVvOiAiK3NhdmVvX3N0YXRbMF0rIlxuIik7CisgIHNhdmVvX3N0YXRbMV1bc2F2ZW9fc3RhdFswXV0gPSBzdGF0OworICBzYXZlb19zdGF0WzBdID0gKHNhdmVvX3N0YXRbMF0gKyAxKSAlIHNpemVvZihzYXZlb19zdGF0WzFdKTsKKyAgLy9kZWJ1Z19tZXNzYWdlKCJzYXZlbyAyOiAiK3NhdmVvX3N0YXRbMF0rIlxuIik7CisjZW5kaWYKKworICByZXR1cm4gcmVzOworfQorCisvLyAqIEF1Y2ggUHJvcGVydGllcyBsYWRlbgoraW50IHJlc3RvcmVfb2JqZWN0KHN0cmluZyBuYW1lKQoreworICBpbnQgcmVzdWx0OworICBtaXhlZCBpbmRleDsKKyAgbWl4ZWQgc2F2ZTsKKyAgbWFwcGluZyBwcm9wZXJ0aWVzOworICBpbnQgaTsKKyAgY2xvc3VyZSBjbDsKKworICAvLyBnZXQgYWN0dWFsIHByb3BlcnR5IHNldHRpbmdzIChieSBjcmVhdGUoKSkKKyAgcHJvcGVydGllcyA9IChtYXBwaW5nKXByZXZpb3VzX29iamVjdCgpLT5RdWVyeVByb3BlcnRpZXMoKTsKKworLy8gIERFQlVHKHNwcmludGYoIlJFU1RPUkUgJU9cbiIsbmFtZSkpOworICAvLyByZXN0b3JlIG9iamVjdAorICByZXN1bHQ9ZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46OnJlc3RvcmVfb2JqZWN0LCBwcmV2aW91c19vYmplY3QoKSksIG5hbWUpOworICAvLycpKQorICAvL19nZXRfc2F2ZV9kYXRhIGxpZWZlcnQgdGF0c2FlY2hsaWNoIG1peGVkIHp1cnVlY2ssIHdlbm4gZGFzIGF1Y2ggaW1tZXIgZWluIAorICAvL21hcHBpbmcgc2VpbiBzb2xsdGUuCisgIHNhdmUgPSAobWl4ZWQpcHJldmlvdXNfb2JqZWN0KCktPl9nZXRfc2F2ZV9kYXRhKCk7CisgIGlmKG1hcHBpbmdwKHNhdmUpKQorICB7CisgICAgaW5kZXggPSBtX2luZGljZXMoc2F2ZSk7CisgICAgZm9yKGkgPSBzaXplb2YoaW5kZXgpLTE7IGk+PTA7IGktLSkKKyAgICB7CisgICAgICBwcm9wZXJ0aWVzW2luZGV4W2ldXSA9IHNhdmVbaW5kZXhbaV1dOworICAgICAgcHJvcGVydGllc1tpbmRleFtpXSwgRl9NT0RFXSA9IHNhdmVbaW5kZXhbaV0sIEZfTU9ERV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmfihTRVRDQUNIRUR8UVVFUllDQUNIRUQpOworICAgIH0KKyAgfQorICBlbHNlIHByb3BlcnRpZXMgPSAoW10pOworCisgIC8vIHJlc3RvcmUgcHJvcGVydGllcworICBmdW5jYWxsKAorICAgICAgICAgIGJpbmRfbGFtYmRhKAorICAgICAgICAgICAgICAgICAgICAgdW5ib3VuZF9sYW1iZGEoKHsnYXJnfSksIC8vJ30pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHsjJ2NhbGxfb3RoZXIsKHsjJ3RoaXNfb2JqZWN0fSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldFByb3BlcnRpZXMiLCdhcmd9KSksLy8nKQorICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNfb2JqZWN0KCkpLHByb3BlcnRpZXMpOworICBwcmV2aW91c19vYmplY3QoKS0+X3NldF9zYXZlX2RhdGEoMCk7CisKKyNpZmRlZiBJT1NUQVRTCisgIC8vIFN0YXRzLi4uCisgIC8vZGVidWdfbWVzc2FnZSgicmVzdG9yZW86ICIrcmVzdG9yZW9fc3RhdFswXSsiXG4iKTsKKyAgc3RydWN0IGlvc3RhdF9zIHN0YXQgPSAoPGlvc3RhdF9zPik7CisgIHN0YXQtPm9uYW1lID0gb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpOworICBzdGF0LT50aW1lID0gdGltZSgpOworICAvL3N0YXQtPnNpemUgPSAoaW50KW9iamVjdF9pbmZvKHByZXZpb3VzX29iamVjdCgpLE9JTkZPX01FTU9SWSwKKyAgLy8gICAgT0lNX1RPVEFMX0RBVEFfU0laRSk7CisgIHN0YXQtPnNpemUgPSBmaWxlX3NpemUobmFtZSArICIubyIpOworICByZXN0b3Jlb19zdGF0WzFdW3Jlc3RvcmVvX3N0YXRbMF1dID0gc3RhdDsKKworICByZXN0b3Jlb19zdGF0WzBdID0gKHJlc3RvcmVvX3N0YXRbMF0gKyAxKSAlIHNpemVvZihyZXN0b3Jlb19zdGF0WzFdKTsKKyNlbmRpZgorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vICogSEIgZWluZXMgT2JqZWt0ZXMgZWluL2F1c3NjaGFsdGVuCitpbnQgc2V0X29iamVjdF9oZWFydF9iZWF0KG9iamVjdCBvYiwgaW50IGZsYWcpCit7CisgIGlmIChvYmplY3RwKG9iKSkKKyAgICByZXR1cm4gZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46OmNvbmZpZ3VyZV9vYmplY3Qsb2IpLCBvYiwgT0NfSEVBUlRfQkVBVCwgZmxhZyk7Cit9CisKKy8vICogTWFnaWVybGV2ZWxncnVwcGVuIGVybWl0dGVsbgoraW50IHF1ZXJ5X3dpel9ncnAobWl4ZWQgd2l6KQoreworICBpbnQgbGV2OworCisgIGxldj1xdWVyeV93aXpfbGV2ZWwod2l6KTsKKyAgaWYgKGxldjxTRUVSX0xWTCkgcmV0dXJuIDA7CisgIGlmIChsZXY+PUdPRF9MVkwpIHJldHVybiBsZXY7CisgIGlmIChsZXY+PUFSQ0hfTFZMKSByZXR1cm4gQVJDSF9HUlA7CisgIGlmIChsZXY+PUVMREVSX0xWTCkgcmV0dXJuIEVMREVSX0dSUDsKKyAgaWYgKGxldj49TE9SRF9MVkwpIHJldHVybiBMT1JEX0dSUDsKKyAgaWYgKGxldj49U1BFQ0lBTF9MVkwpIHJldHVybiBTUEVDSUFMX0dSUDsKKyAgaWYgKGxldj49RE9NQUlOTUVNQkVSX0xWTCkgcmV0dXJuIERPTUFJTk1FTUJFUl9HUlA7CisgIGlmIChsZXY+PVdJWkFSRF9MVkwpIHJldHVybiBXSVpBUkRfR1JQOworICBpZiAobGV2Pj1MRUFSTkVSX0xWTCkgcmV0dXJuIExFQVJORVJfR1JQOworICByZXR1cm4gU0VFUl9HUlA7Cit9CisKK21peGVkICp3aXpsaXN0X2luZm8oKQoreworICBpZiAoQVJDSF9TRUNVUklUWSB8fCAhZXh0ZXJuX2NhbGwoKSkKKyAgICAgICAgICAgIHJldHVybiBlZnVuOjp3aXpsaXN0X2luZm8oKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vICogd2l6bGlzdCBhdXNnZWJlbgordmFyYXJncyB2b2lkIHdpemxpc3Qoc3RyaW5nIG5hbWUsIGludCBzb3J0a2V5ICkgeworCisgIGlmICghbmFtZSkKKyAgeworICAgIGlmICh0aGlzX3BsYXllcigpKQorICAgICAgbmFtZSA9IGdldHVpZCh0aGlzX3BsYXllcigpKTsKKyAgICBpZiAoIW5hbWUpCisgICAgICByZXR1cm47CisgIH0KKworICAvLyBTY2hsdWVzc2VsIGRhcmYgbnVyIGluIGVpbmVtIGd1ZWx0aWdlbiBCZXJlaWNoIHNlaW4KKyAgaWYgKHNvcnRrZXk8V0xfTkFNRSB8fCBzb3J0a2V5Pj1XTF9TSVpFKSBzb3J0a2V5PVdMX0NPU1Q7CisKKyAgbWl4ZWQqKiB3bCA9IGVmdW46Ondpemxpc3RfaW5mbygpOworICAvLyBuYWNoIDxzb3J0a2V5PiBzb3J0aWVyZW4KKyAgd2wgPSBzb3J0X2FycmF5KHdsLCBmdW5jdGlvbiBpbnQgKG1peGVkIGEsIG1peGVkIGIpCisgICAgICB7cmV0dXJuIGFbc29ydGtleV0gPCBiW3NvcnRrZXldOyB9ICk7CisKKyAgLy8gU3VtbWUgdWViZXIgYWxsZSBLb21tYW5kb3MgZXJtaXR0ZWxuLgorICBpbnQgdG90YWxfY21kLCBpOworICBpbnQgcG9zPS0xOworICBmb3JlYWNoKG1peGVkIGVudHJ5IDogd2wpCisgIHsKKyAgICB0b3RhbF9jbWQgKz0gZW50cnlbV0xfQ09NTUFORFNdOworICAgIGlmIChlbnRyeVtXTF9OQU1FXSA9PSBuYW1lKQorICAgICAgcG9zID0gaTsKKyAgICArK2k7CisgIH0KKworICBpZiAocG9zIDwgMCAmJiBuYW1lICE9ICJBTEwiICYmIG5hbWUgIT0gIlRPUDEwMCIpCisgICAgcmV0dXJuOworCisgIGlmIChuYW1lID09ICJUT1AxMDAiKQorICB7CisgICAgaWYgKHNpemVvZih3bCkgPiAxMDApCisgICAgICB3bCA9IHdsWzAuLjEwMF07CisgICAgZWxzZQorICAgICAgd2wgPSB3bDsKKyAgfQorICAvLyB1bSBuYW1lIGhlcnVtIHNjaG5laWRlbgorICBlbHNlIGlmIChuYW1lICE9ICJBTEwiKQorICB7CisgICAgaWYgKHNpemVvZih3bCkgPD0gMjEpCisgICAgICB3bCA9IHdsOworICAgIGVsc2UgaWYgKHBvcyArIDEwIDwgc2l6ZW9mKHdsKSAmJiBwb3MgLSAxMCA+IDApCisgICAgICB3bCA9IHdsW3Bvcy0xMC4ucG9zKzEwXTsKKyAgICBlbHNlIGlmIChwb3MgPD0yMSkKKyAgICAgIHdsID0gd2xbMC4uMjBdOworICAgIGVsc2UgaWYgKHBvcyA+PSBzaXplb2Yod2wpIC0gMjEpCisgICAgICB3bCA9IHdsWzwyMS4uXTsKKyAgICBlbHNlCisgICAgICB3bCA9IHdsOworICB9CisKKyAgd3JpdGUoIlxuV2l6YXJkIHRvcCBzY29yZSBsaXN0XG5cbiIpOworICBpZiAodG90YWxfY21kID09IDApCisgICAgdG90YWxfY21kID0gMTsKKyAgcHJpbnRmKCIlLTIwcyAlLTZzICUtM3MgJS0xN3MgJS02cyAlLTZzICUtNnNcbiIsCisgICAgICAgICAiRVVJRCIsICJjbWRzIiwgIiUiLCAiQ29zdHMiLCAiSEIiLCAiQXJyYXlzIiwiTWFwcC4iKTsKKyAgZm9yZWFjaChtaXhlZCBlOiB3bCkKKyAgeworICAgIHByaW50ZigiJS06MjBzICU6NmQgJToyZCUlIFslOjZkaywlOjZkR10gJTo2ZCAlOjZkICU6NmRcbiIsCisgICAgICAgICAgZVtXTF9OQU1FXSwgZVtXTF9DT01NQU5EU10sIGVbV0xfQ09NTUFORFNdICogMTAwIC8gdG90YWxfY21kLAorICAgICAgICAgIGVbV0xfQ09TVF0gLyAxMDAwLCBlW1dMX1RPVEFMX0dJR0FDT1NUXSwKKyAgICAgICAgICBlW1dMX0hFQVJUX0JFQVRTXSwgZVtXTF9BUlJBWV9UT1RBTF0sIGVbV0xfTUFQUElOR19UT1RBTF0KKyAgICAgICAgICApOworICB9CisgIHByaW50ZigiXG5Ub3RhbCAgICAgICAgICU3ZCAgICAgICAgICglZClcblxuIiwgdG90YWxfY21kLCBzaXplb2Yod2wpKTsKK30KKworCisvLyBBYiBoaWVyIGZvbGdlbiBIaWxmc2Z1bmt0aW9uZW4gZnVlciBjYWxsX291dCgpIGJ6dy4gZnVlciBkZXJlbiBCZWdyZW56dW5nCisKKy8vIGVybWl0dGVsdCBkYXMgT2JqZWt0IGRlcyBDYWxsb3V0cy4KK3ByaXZhdGUgb2JqZWN0IF9jYWxsX291dF9vYmooIG1peGVkIGNhbGxfb3V0ICkgeworICAgIHJldHVybiBwb2ludGVycChjYWxsX291dCkgPyBjYWxsX291dFswXSA6IDA7Cit9CisKK3ByaXZhdGUgdm9pZCBfc2FtZV9vYmplY3QoIG9iamVjdCBvYiwgbWFwcGluZyBtICkgeworICAvLyBpc3QgbmljaHQgc28gYmxvZWQsIHdpZSBlcyBhdXNzaWVodCwgcy4gbmFjaGZvbGdlZGUgVmVyd2VuZHVuZyB2b24gbQorICBpZiAoIG1bb2JdICkKKyAgICBtW29iXSArPSAoeyBvYiB9KTsKKyAgZWxzZQorICAgIG1bb2JdID0gKHsgb2IgfSk7IAorfQorCisvLyBhbGxlIE9iamVrdGUgaW0gTWFwcGluZyBtIHp1c2FtbWVuZmFzc2VuLCBkaWUgZGVuIGdsZWljaGVuIExvYWRuYW1lIChOYW1lIGRlcgorLy8gQmx1ZXByaW50KSBoYWJlbiwgYWxzbyBhbGxlIENsb25lcyBkZXIgQlAsIGRpZSBDYWxsb3V0cyBsYXVmZW4gaGFiZW4uCisvLyBPYmpla3RlIHdlcmRlbiBhdWNoIG1laHJmYWNoIGVyZmFzc3QsIGplIG5hY2ggQW56YWhsIGlocmVyIENhbGxvdXRzLgorcHJpdmF0ZSB2b2lkIF9zYW1lX3BhdGgoIG9iamVjdCBrZXksIG9iamVjdCAqb2JzLCBtYXBwaW5nIG0gKSB7CisgIHN0cmluZyBwYXRoOworICBpZiAoIW9iamVjdHAoa2V5KSB8fCAhcG9pbnRlcnAob2JzKSkgcmV0dXJuOworCisgIHBhdGggPSBsb2FkX25hbWUoa2V5KTsKKworICBpZiAoIG1bcGF0aF0gKQorICAgIG1bcGF0aF0gKz0gb2JzOworICBlbHNlCisgICAgbVtwYXRoXSA9IG9iczsKK30KKworLy8ga2V5IGthbm4gb2JqZWN0IG9kZXIgc3RyaW5nIHNlaW4uCitwcml2YXRlIGludCBfdG9vX21hbnkoIG1peGVkIGtleSwgbWFwcGluZyBtLCBpbnQgaSApIHsKKyAgICByZXR1cm4gc2l6ZW9mKG1ba2V5XSkgPj0gaTsKK30KKworLy8gYWxsZSBPYmpla3RlIGluIG9icyB6ZXJzdG9lcmVuIHVuZCBGZWhsZXJtZWxkdW5nIGF1c2dlYmVuLiBBQ0hUVU5HOiBEaWUKKy8vIE9iamVrdGUgd2VyZGVuIGlkUiB6dSBlaW5lciBCUCBnZWhvZXJlbiwgbXVlc3NlbiBhYmVyIG5pY2h0ISBJbiBkZW0gRmFsbAorLy8gd2lyZCBhdWYgZGVyIEViZW5lIGFiZXIgbnVyIGVpbiBPYmpla3QgaW4gZGVyIEZlaGxlcm1lbGR1bmcgZXJ3YWVobnQuCitwcml2YXRlIHZvaWQgX2Rlc3Ryb3koIG1peGVkIGtleSwgb2JqZWN0ICpvYnMsIHN0cmluZyB0ZXh0LCBpbnQgdWlkICkgeworICAgIGlmICghcG9pbnRlcnAob2JzKSkgcmV0dXJuOworICAgIC8vIEFycmF5IG1pdCB1bmlxdWUgRWludHJhZWdlIGVyemV1Z2VuLgorICAgIG9icyA9IG1faW5kaWNlcyggbWttYXBwaW5nKG9icykgKTsKKyAgICAvLyBGZWhsZXJtZWxkdW5nIGF1ZiBkZXIgRWJlbmUgYXVzZ2ViZW4sIGltIGNhdGNoKCkgbWl0IHB1Ymxpc2gsIGRhbWl0IGVzCisgICAgLy8gYXVmIGRlciBFYmVuZSBkaXJla3Qgc2Nyb2xsdCwgZGVyIGJhY2t0cmFjZSB2ZXJmdWVnYmFyIGlzdCAoaW0KKyAgICAvLyBnZWdlbnNhdHogenVyIExvZXN1bmcgbWl0dGVscyBDYWxsb3V0KSwgZGllIEF1c2Z1ZWhydW5nIGFiZXIgd2VpdGVyCisgICAgLy8gbGFldWZ0LgorICAgIGNhdGNoKCBlZnVuOjpyYWlzZV9lcnJvciggICAgICAgICAgIAorICAgICAgICAgc3ByaW50ZiggdGV4dCwgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgIHVpZCA/IChzdHJpbmcpbWFzdGVyKCktPmNyZWF0b3JfZmlsZShrZXkpIDoga2V5LCAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgc2l6ZW9mKG9icyksIG9iamVjdF9uYW1lKG9ic1s8MV0pICkgKTtwdWJsaXNoKTsKKyAgICAvLyBVbmQgd2VnIG1pdCBkZW0gS3JhbS4uLgorICAgIGZpbHRlciggb2JzLCAjJ2VmdW46OmRlc3RydWN0LyonKi8gKTsKK30KKworLy8gQWxsZSBPYmpla3QgZWluZXIgVUlEIGltIE1hcHBpbmcgbSBtaXQgVUlEIGFscyBLRXlzIHp1c2FtbWVuZmFzc2VuLiBPYmpla3QKKy8vIHNpbmQgZGFiZWkgbmljaHQgdW5pcXVlLgorcHJpdmF0ZSB2b2lkIF9zYW1lX3VpZCggc3RyaW5nIGtleSwgb2JqZWN0ICpvYnMsIG1hcHBpbmcgbSwgY2xvc3VyZSBjZiApIHsKKyAgc3RyaW5nIHVpZDsKKworICBpZiAoICFwb2ludGVycChvYnMpIHx8ICFzaXplb2Yob2JzKSApCisgICAgcmV0dXJuOworCisgIHVpZCA9IGZ1bmNhbGwoIGNmLCBrZXkgKTsKKworICBpZiAoIG1bdWlkXSApCisgICAgbVt1aWRdICs9IG9iczsgLy8gb2JzIGlzdCBuZW4gQXJyYXkKKyAgZWxzZQorICAgIG1bdWlkXSA9IG9iczsKK30KKworbm9tYXNrIHZhcmFyZ3Mgdm9pZCBjYWxsX291dCggdmFyYXJncyBtaXhlZCAqYXJncyApCit7CisgICAgbWl4ZWQgdG1wLCAqY2FsbF9vdXRzOworCisgICAgLy8gQmVpID42MDAgQ2FsbG91dHMgYWxsZSBPYmpla3RlIGtpbGxlbiwgZGllIG1laHIgYWxzIDMwIENhbGxvdXRzIGxhdWZlbgorICAgIC8vIGhhYmVuLgorICAgIGlmICggZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0NBTExPVVRTKSA+IDYwMAorICAgICAgICAmJiBnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSAhPSBST09USUQgKQorICAgIHsKKyAgICAgICAvLyBMb2cgZXJ6ZXVnZW4uLi4KKyAgICAgIAorICAgICAgIC8vIE9iamVrdGUgYWxsZXIgQ2FsbG91dHMgZXJtaXR0ZWxuCisgICAgICAgY2FsbF9vdXRzID0gbWFwKCBlZnVuOjpjYWxsX291dF9pbmZvKCksICMnX2NhbGxfb3V0X29iaiApOworICAgICAgIG1hcHBpbmcgb2JqZWN0bWFwID0gKFtdKTsKKyAgICAgICBmaWx0ZXIoIGNhbGxfb3V0cywgIydfc2FtZV9vYmplY3QsICZvYmplY3RtYXAgKTsKKyAgICAgICAvLyBNYXN0ZXIgbmljaHQgZ3JpbGxlbi4uLgorICAgICAgIGVmdW46Om1fZGVsZXRlKCBvYmplY3RtYXAsIG1hc3RlcigxKSApOworICAgICAgIC8vIGFsbGUgT2JqZWt0ZSByYXVzc3VjaGVuLCBkaWUgenV2aWVsZSBoYWJlbi4uLgorICAgICAgIG1hcHBpbmcgcmVzID0gZmlsdGVyX2luZGljZXMoIG9iamVjdG1hcCwgIydfdG9vX21hbnksIG9iamVjdG1hcCwgMjkgKTsKKyAgICAgICAvLyB1bmQgdWViZXIgYWxsZSBLZXlzIGdlaGVuLCBhbiBfZGVzdHJveSgpIHdlcmRlbiBLZXkgdW5kIEFycmF5IG1pdAorICAgICAgIC8vIE9iamVrdGVuIHVlYmVyZ2ViZW4gKGluIGRpZXNlbSBGYWxsIHNpbmQgS2V5cyB1bmQgQXJyYXkgbWl0CisgICAgICAgLy8gT2JqZWt0ZW4gamV3ZWlscyBkYXMgZ2xlaWNoZSBPYmpla3QpLgorICAgICAgIGlmICggc2l6ZW9mKHJlcykgKSAgICAgICAKKyAgICAgICAgICAgd2Fsa19tYXBwaW5nKHJlcywgIydfZGVzdHJveSwgIkNBTExfT1VUIG92ZXJmbG93IGJ5IHNpbmdsZSAiICAgICAgICAgICAgIAorICAgICAgICAgICAgICAib2JqZWN0IFslT10uIERlc3RydWN0ZWQgJWQgb2JqZWN0cy4gWyVzXVxuIiwgMCApOworCisgICAgICAgLy8gQmVpIChhdWNoIG5hY2ggZGVtIGVyc3RlbiBBdWZyYWV1bWVuIG5vY2gpID44MDAgQ2FsbG91dHMgYWxsZQorICAgICAgIC8vIE9iamVrdGUga2lsbGVuLCBkaWUgbWVociBhbHMgNTAgQ2FsbG91dHMgbGF1ZmVuIGhhYmVuIC0gdW5kCisgICAgICAgLy8gZGllc21hbCB6YWVobGVuIENsb25lcyBuaWNodCBlaWdlbnN0YWVuZGlnISBELmguIGVzIHdlcmRlbiBhbGxlCisgICAgICAgLy8gQ2xvbmVzIGVpbmVyIEJQIGdla2lsbHQsIGRpZSBDYWxsb3V0cyBsYXVmZW4gaGFiZW4sIGZhbGxzIGFsbGUKKyAgICAgICAvLyBkaWVzZSBPYmpla3RlIF96dXNhbW1lbl8gbWVociBhbHMgNTAgQ2FsbG91dHMgaGFiZW4hCisgICAgICAgaWYgKCBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fQ0FMTE9VVFMpID4gODAwICkgeworICAgICAgICAgICAvLyB6ZXJzdG9lcnRlIE9iamVrdGUgdm9uIGRlciBsZXR6dGVuIEFrdGlvbiBzaW5kIGluIG9iamVjdG1hcCBuaWNodAorICAgICAgICAgICAvLyBtZWhyIGRyaW4sIGRhIHNpZSBkb3J0IGFscyBLZXlzIHZlcndlbmRldCB3dXJkZW4uCisgICAgICAgICAgIG1hcHBpbmcgcGF0aG1hcD0oW10pOworICAgICAgICAgICAvLyBhbGxlIE9iamVrdCBlaW5lciBCUCBpbiByZXMgc29ydGllcmVuLCBCUC1OYW1lIGFscyBLZXksIEFycmF5cworICAgICAgICAgICAvLyB2b24gT2JqZWt0ZW4gYWxzIFdlcnRlLgorICAgICAgICAgICB3YWxrX21hcHBpbmcoIG9iamVjdG1hcCwgIydfc2FtZV9wYXRoLCAmcGF0aG1hcCk7CisgICAgICAgICAgIC8vIGFsbGUgQlBzICh1bmQgaWhyZSBPYmpla3RlKSByYXVzc3VjaGVuLCBkaWUgenV2aWVsZSBoYWJlbi4uLgorICAgICAgICAgICByZXMgPSBmaWx0ZXJfaW5kaWNlcyggcGF0aG1hcCwgIydfdG9vX21hbnkvKicqLywgcGF0aG1hcCwgNTAgKTsKKyAgICAgICAgICAgLy8gdW5kIHVlYmVyIGFsbGUgS2V5cyBnZWhlbiwgYW4gX2Rlc3Ryb3koKSB3ZXJkZW4gZGllIENsb25lcworICAgICAgICAgICAvLyB1ZWJlcmdlYmVuLCBkaWUgQ2FsbG91dHMgaGFiZW4uCisgICAgICAgICAgIGlmICggc2l6ZW9mKHJlcykgKQorICAgICAgICAgICAgICB3YWxrX21hcHBpbmcoIHJlcywgIydfZGVzdHJveS8qJyovLCAiQ0FMTF9PVVQgb3ZlcmZsb3cgYnkgZmlsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyVzJy4gRGVzdHJ1Y3RlZCAlZCBvYmplY3RzLiBbJXNdXG4iLCAwICk7CisKKyAgICAgICAgICAgLy8gV2VubiBiZWlkZSBBdWZyYWV1bWFyYmVpdGVuIG5pY2h0cyBnZWJyYWNodCBoYWJlbiB1bmQgaW1tZXIKKyAgICAgICAgICAgLy8gbm9jaCA+MTAwMCBDYWxsb3V0cyBsYXVmZW4sIHdlcmRlbiBkaWVzbWFsIGFsbGUgQ2FsbG91dHMKKyAgICAgICAgICAgLy8gZWluZXIgVUlEIHp1c2FtbWVuZ2V6YWVobHQuCisgICAgICAgICAgIC8vIEFsbGUgT2JqZWt0ZSBlaW5lciBVSUQsIGRpZSBlcyBpbiBTdW1tZSBhbGxlciBpaHJlciBPYmpla3QgbWl0CisgICAgICAgICAgIC8vIENhbGxvdXRzIGF1ZiBtZWhyIGFscyAxMDAgQ2FsbG91dHMgYnJpbmd0LCB3ZXJkZW4gZ2Vyb2VzdGV0LgorICAgICAgICAgICBpZiAoZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0NBTExPVVRTKSA+IDEwMDApCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLy8gZGFzIG5hY2ggQlAtTmFtZW4gdm9yZ2VmaWx0ZXJ0ZSBNYXBwaW5nIGpldHp0IG5hY2ggVUlEcworICAgICAgICAgICAgICAvLyB6dXNhbW1lbnNvcnRpZXJlbi4gWmVyc3RvZXJ0ZSBDbG9uZXMgZmlsdGVyIF9zYW1lX3VpZCgpCisgICAgICAgICAgICAgIC8vIHJhdXMuCisgICAgICAgICAgICAgIG1hcHBpbmcgdWlkbWFwPShbXSk7CisgICAgICAgICAgICAgIHdhbGtfbWFwcGluZyggcGF0aG1hcCwgIydfc2FtZV91aWQsICZ1aWRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xfZnVuY3Rpb24oICJjcmVhdG9yX2ZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9zZWN1cmUvbWFzdGVyIiApICk7CisgICAgICAgICAgICAgIC8vIEluIHJlcyBudW4gVUlEcyBhbHMgS2V5cyB1bmQgQXJyYXlzIHZvbiBPYmpla3RlbiBhbHMgV2VydGUuCisgICAgICAgICAgICAgIC8vIERpZSByYXVzZmlsdGVybiwgZGllIG1laHIgYWxzIDEwMCBPYmpla3RlIChub24tdW5pcXVlLCBkLmguCisgICAgICAgICAgICAgIC8vIDEwMCBDYWxsb3V0cyEpIGhhYmVuLgorICAgICAgICAgICAgICByZXMgPSBmaWx0ZXJfaW5kaWNlcyggdWlkbWFwLCAjJ190b29fbWFueSwgdWlkbWFwLCAxMDAgKTsKKyAgICAgICAgICAgICAgLy8gdW5kIGVybmV1dCB1ZWJlciBkaWUgS2V5cyBsYXVmZW4gdW5kIGpld2VpbHMgZGllIEFycmF5cyBtaXQKKyAgICAgICAgICAgICAgLy8gZGVuIE9iamVrdGVuIHp1ciBaZXJzdG9lcnVuZyBhbiBfZGVzdHJveSgpLi4uCisgICAgICAgICAgICAgIGlmICggc2l6ZW9mKHJlcykgKQorICAgICAgICAgICAgICAgICAgd2Fsa19tYXBwaW5nKCByZXMsICMnX2Rlc3Ryb3ksICJDQUxMX09VVCBvdmVyZmxvdyBieSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVUlEICclcycuIERlc3RydWN0ZWQgJWQgb2JqZWN0cy4gWyVzXVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgKTsKKyAgICAgICAgICAgfQorICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBGYWxscyBkYXMgYXVmcnVmZW5kZSBPYmpla3QgemVyc3RvZXJ0IHd1cmRlIGJlaW0gQXVmcmFldW1lbgorICAgIGlmICggIXByZXZpb3VzX29iamVjdCgpICkKKyAgICAgICByZXR1cm47CisKKyAgICBzZXRfdGhpc19vYmplY3QoIHByZXZpb3VzX29iamVjdCgpICk7CisgICAgYXBwbHkoICMnZWZ1bjo6Y2FsbF9vdXQsIGFyZ3MgKTsKKyAgICByZXR1cm47Cit9CisKK21peGVkIGNhbGxfb3V0X2luZm8oKSB7CisgIAorICBvYmplY3QgcG8gPSBwcmV2aW91c19vYmplY3QoKTsKKyAgbWl4ZWQgY29pID0gZWZ1bjo6Y2FsbF9vdXRfaW5mbygpOworCisgIC8vIHVuZ2VmaWx0ZXJ0ZW4gT3V0cHV0IG51ciBmdWVyIGJlc3RpbW10ZSBPYmpla3RlLCBPYmpla3RlIGluIC9zdGQgb2RlcgorICAvLyAvb2JqIGhhYmVuIGRpZSBCYWNrYm9uZUlELgorICBpZiAocXVlcnlfd2l6X2xldmVsKGdldHVpZChwbykpID49IEFSQ0hfTFZMCisgICAgICAgfHwgKHN0cmluZyltYXN0ZXIoKS0+Y3JlYXRvcl9maWxlKGxvYWRfbmFtZShwbykpID09IEJBQ0tCT05FSUQgKSB7CisgICAgICByZXR1cm4gY29pOworICB9CisgIGVsc2UgeworICAgICAgcmV0dXJuIGZpbHRlcihjb2ksIGZ1bmN0aW9uIG1peGVkIChtaXhlZCBhcnIpIHsKKyAgICAgICAgICAgICAgaWYgKHBvaW50ZXJwKGFycikgJiYgYXJyWzBdPT1wbykKKyAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIDA7IH0pOworICB9Cit9CisKKy8vICogWnUgZWluZXIgY2xvc3VyZSBkYXMgT2JqZWt0LCBhbiBkYXMgc2llIGdlYnVuZGVuIGlzdCwgc3VjaGVuCittaXhlZCBxdWVyeV9jbG9zdXJlX29iamVjdChjbG9zdXJlIGMpIHsKKyAgcmV0dXJuCisgICAgQ0xPU1VSRV9JU19VTkJPVU5EX0xBTUJEQShnZXRfdHlwZV9pbmZvKGMsIDEpKSA/CisgICAgICAwIDoKKyAgKHRvX29iamVjdChjKSB8fCAtMSk7Cit9CisKKy8vICogV2lyIHdvbGxlbiBudXIgRUlOIEFyZ3VtZW50IC4uLiBhdXNzZXJkZW0gY2hlY2tzIGZ1ZXIgZGVuIE5ldHp0b3RlbnJhdW0KK3ZhcmFyZ3Mgdm9pZCBtb3ZlX29iamVjdChtaXhlZCB3aGF0LCBtaXhlZCB3aGVyZSkKK3sKKyAgb2JqZWN0IHBvLHRtcDsKKworICBwbz1wcmV2aW91c19vYmplY3QoKTsKKyAgaWYgKCF3aGVyZSkKKyAgeworICAgIHdoZXJlPXdoYXQ7CisgICAgd2hhdD1wbzsKKyAgfQorICBpZiAoKChzdHJpbmdwKHdoZXJlKSAmJiB3aGVyZT09TkVUREVBRF9ST09NICkgfHwKKyAgICAgICAob2JqZWN0cCh3aGVyZSkgJiYgd2hlcmU9PWZpbmRfb2JqZWN0KE5FVERFQURfUk9PTSkpKSAmJgorICAgICAgIG9iamVjdHAod2hhdCkgJiYgb2JqZWN0X25hbWUod2hhdCkhPSIvb2JqL3NwZXJyZXIiKQorICB7CisgICAgaWYgKCFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHdoYXQpKQorICAgIHsKKyAgICAgIHdoYXQtPnJlbW92ZSgpOworICAgICAgaWYgKHdoYXQpIGRlc3RydWN0KHdoYXQpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAobGl2aW5nKHdoYXQpIHx8IGludGVyYWN0aXZlKHdoYXQpKQorICAgIHsKKyAgICAgIGxvZ19maWxlKCJOREVBRDIiLHNwcmludGYoIlRSWUVEIFRPIE1PVkUgVE8gTkVUREVBRDogJU9cbiIsd2hhdCkpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzZXRfb2JqZWN0X2hlYXJ0X2JlYXQod2hhdCwwKTsKKyAgfQorICB0bXA9d2hhdDsKKyAgd2hpbGUgKHRtcD1lbnZpcm9ubWVudCh0bXApKQorICAgICAgLy8gSmEuIE1hbiBydWZ0IGRpZSBfc2V0X3h4eCgpLUZ1bmt0aW9uZW4gZWlnZW50bGljaCBuaWNodCBkaXJla3QgYXVmLgorICAgICAgLy8gQWJlciBkYXMgTGljaHRzeXN0ZW0gaXN0IHNjaG9uICpzbyogcmVjaGVuaW50ZW5zaXYgdW5kIGdlcmFkZSBkZXIKKyAgICAgIC8vIFBfTEFTVF9DT05URU5UX0NIQU5HRS1DYWNoZSB3aXJkICpzbyogb2Z0IGJlbm9ldGlndCwgZGFzcyBlcyBtaXIKKyAgICAgIC8vIGRhIHVtIGplZGVzIGJpc3NjaGVuIFJlY2hlbnplaXQgZ2VodC4KKyAgICAgIC8vIERlciBad2VjayBoZWlsaWd0IGphIGJla2FubnRsaWNoIGRpZSBNaXR0ZWwuIDstKQorICAgICAgLy8KKyAgICAgIC8vIFRpYW1haworICAgIHRtcC0+X3NldF9sYXN0X2NvbnRlbnRfY2hhbmdlKCk7CisgIGZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjptb3ZlX29iamVjdCxwbyksd2hhdCx3aGVyZSk7CisgIGlmICh0bXA9d2hhdCkKKyAgICB3aGlsZSAodG1wPWVudmlyb25tZW50KHRtcCkpCisgICAgICB0bXAtPl9zZXRfbGFzdF9jb250ZW50X2NoYW5nZSgpOworfQorCisKK3ZvaWQgc3RhcnRfc2ltdWxfZWZ1bigpIHsKKyAgbWl4ZWQgKmluZm87CisKKyAgLy8gRmFsbHMgbm9jaCBuaWNodCBnZXRhbiwgZXh0cmFfd2l6aW5mbyBpbml0aWFsaXNpZXJlbgorICBpZiAoICFwb2ludGVycChpbmZvID0gZ2V0X2V4dHJhX3dpemluZm8oMCkpICkKKyAgICBzZXRfZXh0cmFfd2l6aW5mbygwLCBpbmZvID0gYWxsb2NhdGUoQkFDS0JPTkVfV0laSU5GT19TSVpFKSk7CisKKyAgSW5pdExpdmluZ0RhdGEoaW5mbyk7CisKKyAgc2V0X25leHRfcmVzZXQoMTApOyAvLyBkaXJla3QgbWFsIGF1ZnJhZXVtZW4KK30KKworcHJvdGVjdGVkIHZvaWQgcmVzZXQoKSB7CisgIHNldF9uZXh0X3Jlc2V0KDcyMDApOworICBDbGVhbkxpdmluZ0RhdGEoKTsKK30KKworI2lmICFfX0VGVU5fREVGSU5FRF9fKGFic29sdXRlX2hiX2NvdW50KQoraW50IGFic29sdXRlX2hiX2NvdW50KCkgeworICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVF9UT1RBTF9DWUNMRVMpOworfQorI2VuZGlmCisKK3ZvaWQgX19zZXRfZW52aXJvbm1lbnQob2JqZWN0IG9iLCBtaXhlZCB0YXJnZXQpCit7CisgIHN0cmluZyBwYXRoOworICBvYmplY3Qgb2JqOworCisgIGlmICghb2JqZWN0cChvYikpCisgICAgcmV0dXJuOworICBpZiAoIUlTX0FSQ0goZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSkpIHx8ICFBUkNIX1NFQ1VSSVRZICkKKyAgICByZXR1cm47CisgIGlmIChvYmplY3RwKHRhcmdldCkpCisgIHsKKyAgICBlZnVuOjpzZXRfZW52aXJvbm1lbnQob2IsdGFyZ2V0KTsKKyAgICByZXR1cm47CisgIH0KKyAgcGF0aD0oc3RyaW5nKU1BU1RFUi0+X2dldF9wYXRoKHRhcmdldCx0aGlzX2ludGVyYWN0aXZlKCkpOworICBpZiAoc3RyaW5ncChwYXRoKSAmJiBmaWxlX3NpemUocGF0aCsiLmMiKT49MCAmJgorICAgICAgIWNhdGNoKGxvYWRfb2JqZWN0KHBhdGgpO3B1Ymxpc2gpICkKKyAgeworICAgIG9iaj1maW5kX29iamVjdChwYXRoKTsKKyAgICBlZnVuOjpzZXRfZW52aXJvbm1lbnQob2Isb2JqKTsKKyAgICByZXR1cm47CisgIH0KK30KKwordm9pZCBfZHVtcF93aXpsaXN0KHN0cmluZyBmaWxlLCBpbnQgc29ydGJ5KSB7CisgIGludCBpOworICBtaXhlZCAqYTsKKworICBpZiAoIUxPUkRfU0VDVVJJVFkpCisgICAgcmV0dXJuOworICBpZiAoIW1hc3RlcigpLT52YWxpZF93cml0ZShmaWxlLGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpLCJ3cml0ZV9maWxlIikpCisgIHsKKyAgICB3cml0ZSgiTk8gV1JJVEUgUEVSTUlTU0lPTlxuIik7CisgICAgcmV0dXJuOworICB9CisgIGEgPSB3aXpsaXN0X2luZm8oKTsKKyAgYSA9IHNvcnRfYXJyYXkoYSwgbGFtYmRhKCAoeydhLCdifSksCisgICAgICAgICAgICAgICAgICAgICAgICAoeyMnPCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHsjJ1ssJ2Esc29ydGJ5fSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICh7IydbLCdiLHNvcnRieX0pCisgICAgICAgICAgICAgICAgICAgICAgICAgfSkpKTsKKyAgcm0oZmlsZSk7CisgIGZvciAoaT1zaXplb2YoYSktMTtpPj0wO2ktLSkKKyAgICB3cml0ZV9maWxlKGZpbGUsc3ByaW50ZigiJS0xMXM6IGV2YWw9JS04ZCBjbWRzPSUtNmQgSEJzPSUtNWQgYXJyYXk9JS01ZCBtYXBwaW5nPSUtN2RcbiIsCisgICAgICBhW2ldW1dMX05BTUVdLGFbaV1bV0xfVE9UQUxfQ09TVF0sYVtpXVtXTF9DT01NQU5EU10sYVtpXVtXTF9IRUFSVF9CRUFUU10sCisgICAgICBhW2ldW1dMX0FSUkFZX1RPVEFMXSxhW2ldW1dMX0NBTExfT1VUXSkpOworfQorCitwdWJsaWMgdmFyYXJncyBvYmplY3QgZGVlcF9wcmVzZW50KG1peGVkIHdoYXQsIG9iamVjdCBvYikgeworCisgIGlmKCFvYmplY3RwKG9iKSkKKyAgICBvYj1wcmV2aW91c19vYmplY3QoKTsKKyAgLy8gV2VubiBlaW4gT2JqZWt0IGdlc3VjaHQgd2lyZDogQWxsZSBFbnZzIGRpZXNlcyBPYmpla3RzIGVybWl0dGVsbiB1bmQKKyAgLy8gc2NoYXVlbiwgb2IgaW4gZGllc2VuIG9iIHZvcmtvbW10LiBEYW5uIGlzdCB3aGF0IGluIG9iIGVudGhhbHRlbi4KKyAgaWYob2JqZWN0cCh3aGF0KSkgeworICAgIG9iamVjdCAqZW52cz1hbGxfZW52aXJvbm1lbnQod2hhdCk7CisgICAgLy8gd2VubiBvYiBrZWluIEVudmlyb25tZW50IGhhdCwgaXN0IGVzIG9mZmVuc2ljaHRsaWNoIG5pY2h0IGluIHdoYXQKKyAgICAvLyBlbnRoYWx0ZW4uCisgICAgaWYgKCFwb2ludGVycChlbnZzKSkgcmV0dXJuIDA7CisgICAgaWYgKG1lbWJlcihlbnZzLCBvYikgIT0gLTEpIHJldHVybiB3aGF0OworICB9CisgIC8vIHNvbnN0IHdpcmRzIHRldXJlciwgdWViZXIgYWxsZSBPYmpla3RlIGltIChkZWVwKSBJbnYgbGF1ZmVuIHVuZCBwZXIgaWQoKQorICAvLyB0ZXN0ZW4uIERhYmVpIG11c3MgYWJlciBkaWUgZ2V3dWVuc2NodGUgTnIuICgiZmxhc2NoZSAzIikgYWJnZXNjaG5pdHRlbgorICAvLyB3ZXJkZW4gdW5kIHNlbGJlciBnZXphZWhsdCB3ZXJkZW4sIHdlbGNoZSBkYXMgZW50c3ByZWNoZW5kZSBPYmpla3QgaXN0LgorICBlbHNlIGlmIChzdHJpbmdwKHdoYXQpKSB7CisgICAgICBpbnQgY250OworICAgICAgc3RyaW5nIG5ld3doYXQ7CisgICAgICBpZihzc2NhbmYod2hhdCwiJXMgJWQiLG5ld3doYXQsY250KSE9MikKKyAgICAgICBjbnQ9MTsKKyAgICAgIGVsc2UKKyAgICAgICB3aGF0PW5ld3doYXQ7CisgICAgICBmb3JlYWNoKG9iamVjdCBpbnZvYjogZGVlcF9pbnZlbnRvcnkob2IpKSB7CisgICAgICAgaWYgKGludm9iLT5pZCh3aGF0KSAmJiAhLS1jbnQpCisgICAgICAgICAgIHJldHVybiBpbnZvYjsKKyAgICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIldyb25nIGFyZ3VtZW50IDEgdG8gZGVlcF9wcmVzZW50KCkuICIKKyAgICAgICAgICJFeHBlY3RlZCBcIm9iamVjdFwiIG9yIFwic3RyaW5nXCIsIGdvdCAlLjUwTy5cbiIsCisgICAgICAgICB3aGF0KSk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK21hcHBpbmcgZHVtcF9pcF9tYXBwaW5nKCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK25vbWFzayB2b2lkIHN3YXAob2JqZWN0IG9iaikKK3sKKyAgd3JpdGUoIllvdXIgYXJlIG5vdCBhbGxvd2VkIHRvIHN3YXAgb2JqZWN0cyBieSBoYW5kIVxuIik7CisgIHJldHVybjsKK30KKworbm9tYXNrIHZhcmFyZ3Mgdm9pZCBnYXJiYWdlX2NvbGxlY3Rpb24oc3RyaW5nIHN0cikKK3sKKyAgaWYocHJldmlvdXNfb2JqZWN0KCk9PTAgfHwgIUlTX0FSQ0goZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSkpIAorICAgICAgfHwgIUFSQ0hfU0VDVVJJVFkpCisgIHsKKyAgICB3cml0ZSgiQ2FsbCBHQyBub3cgYW5kIHRoZSBtdWQgd2lsbCBjcmFzaCBpbiA1LTYgaG91cnMuIERPTlQgRE8gSVQhXG4iKTsKKyAgICByZXR1cm47CisgIH0KKyAgZWxzZSBpZiAoc3RyaW5ncChzdHIpKQorICB7CisgICAgcmV0dXJuIGVmdW46OmdhcmJhZ2VfY29sbGVjdGlvbihzdHIpOworICB9CisgIGVsc2UgCisgICAgcmV0dXJuIGVmdW46OmdhcmJhZ2VfY29sbGVjdGlvbigpOworfQorCit2YXJhcmdzIHZvaWQgbm90aWZ5X2ZhaWwobWl4ZWQgbmYsIGludCBwcmlvKSB7CisgIG9iamVjdCBwbyxvbGRvOworICBpbnQgb2xkcHJpbzsKKyAgCisgIGlmICghUEwgfHwgIW9iamVjdHAocG89cHJldmlvdXNfb2JqZWN0KCkpKSByZXR1cm47CisgIGlmICghc3RyaW5ncChuZikgJiYgIWNsb3N1cmVwKG5mKSkgeworICAgICAgc2V0X3RoaXNfb2JqZWN0KHBvKTsKKyAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoCisgICAgICAgICAiT25seSBzdHJpbmdzIGFuZCBjbG9zdXJlcyBhbGxvd2VkIGZvciBub3RpZnlfZmFpbCEgIgorICAgICAgICAgIkFyZ3VtZW50IHdhczogJS41ME8uLi5cbiIsbmYpKTsKKyAgfQorCisgIC8vIGZhbGxzIGVpbiBPYmpla3QgYmVyZWl0cyBuZW4gbm90aWZ5X2ZhaWwoKSBzZXR6dGUsIFByaW9yaXRhZXRlbiBhYnNjaGFldHplbgorICAvLyB1bmQgdmVyZ2xlaWNoZW4uCisgIGlmIChvYmplY3RwKG9sZG89cXVlcnlfbm90aWZ5X2ZhaWwoMSkpICYmIHBvIT1vbGRvKSB7CisgICAgaWYgKCFwcmlvKSB7ICAgICAgIAorICAgICAgLy9Qcmlvcml0YWV0IGRpZXNlcyBub3RpZnlfZmFpbCgpICdhYnNjaGFldHplbicKKyAgICAgIGlmIChwbz09UEwpIC8vIFNwaWVsZXItaW50ZXJuZSAoc291bC1jbWRzKQorICAgICAgICBwcmlvPU5GX05MX09XTjsKKyAgICAgIGVsc2UgaWYgKGxpdmluZyhwbykpCisgICAgICAgIHByaW89TkZfTkxfTElWSU5HOworICAgICAgZWxzZSBpZiAoKGludClwby0+SXNSb29tKCkpCisgICAgICAgIHByaW89TkZfTkxfUk9PTTsKKyAgICAgIGVsc2UKKyAgICAgICAgcHJpbz1ORl9OTF9USElORzsKKyAgICB9CisgICAgLy9Qcmlvcml0YWV0IGRlcyBhbHRlbiBTZXR6ZXJzIGFic2NoYWV0emVuCisgICAgaWYgKG9sZG89PVBMKQorICAgICAgb2xkcHJpbz1ORl9OTF9PV047CisgICAgZWxzZSBpZiAobGl2aW5nKG9sZG8pKQorICAgICAgb2xkcHJpbz1ORl9OTF9MSVZJTkc7CisgICAgZWxzZSBpZiAoKGludClvbGRvLT5Jc1Jvb20oKSkKKyAgICAgIG9sZHByaW89TkZfTkxfUk9PTTsKKyAgICBlbHNlCisgICAgICBvbGRwcmlvPU5GX05MX1RISU5HOworICB9CisgIGVsc2UgLy8gd2VubiBlcyBub2NoIGtlaW4gTm90aWZ5X2ZhaWwgZ2lidDoKKyAgICBvbGRwcmlvPU5GX05MX05PTkU7CisKKyAgLy92ZXJnbGVpY2hlbiB1bmQgZ2dmLiBzZXR6ZW4KKyAgaWYgKHByaW8gPj0gb2xkcHJpbykgeyAKKyAgICBzZXRfdGhpc19vYmplY3QocG8pOworICAgIGVmdW46Om5vdGlmeV9mYWlsKG5mKTsKKyAgfQorCisgIHJldHVybjsKK30KKwordm9pZCBfbm90aWZ5X2ZhaWwoc3RyaW5nIHN0cikKK3sKKyAgLy9xdWVyeV9ub3RpZnlfZmFpbCgpIGJlbnV0emVuLCB1bSBkYXMgT2JqZWt0CisgIC8vZGVzIGxldHp0ZW4gbm90aWZ5X2ZhaWwoKSB6dSBlcm1pdHRlbG4KKyAgb2JqZWN0IG87CisgIGlmICgobz1xdWVyeV9ub3RpZnlfZmFpbCgxKSkgJiYgbyE9cHJldmlvdXNfb2JqZWN0KCkpCisgICAgcmV0dXJuOworICAvL25vY2gga2VpbiBub3RpZnlfZmFpbCgpIGZ1ZXIgZGllc2VzIEtvbW1hbmRvIGdlc2V0enQsIGF1ZiBnZWh0cy4KKyAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgZWZ1bjo6bm90aWZ5X2ZhaWwoc3RyKTsKKyAgcmV0dXJuOworfQorCitzdHJpbmcgdGltZTJzdHJpbmcoIHN0cmluZyBmb3JtYXQsIGludCB6ZWl0ICkKK3sKKyAgaW50IGksY2gsbWF4dW5pdCxkdW1teTsKKyAgc3RyaW5nICpwYXJ0cywgZm10OworCisgIGludCBzZWNzID0gemVpdDsKKyAgaW50IG1pbnMgPSAoemVpdC82MCk7CisgIGludCBob3VycyA9ICh6ZWl0LzM2MDApOworICBpbnQgZGF5cyA9ICh6ZWl0Lzg2NDAwKTsKKyAgaW50IHdlZWtzID0gICh6ZWl0LzYwNDgwMCk7CisgIGludCBtb250aHMgPSAoemVpdC8yNDE5MjAwKTsKKyAgaW50IGFiYnIgPSAwOworCisgIHBhcnRzID0gcmVnZXhwbG9kZSggZm9ybWF0LCAiXCglXCgtfFwpWzAtOV0qW253ZGhtc3hOV0RITVNYXVwpfFwoJSVcKSIgKTsKKworICBmb3IoIGk9MTsgaTxzaXplb2YocGFydHMpOyBpKz0yICkKKyAgeworICAgIGNoID0gcGFydHNbaV1bPDFdOworICAgIHN3aXRjaCggcGFydHNbaV1bPDFdICkKKyAgICB7CisgICAgY2FzZSAneCc6IGNhc2UgJ1gnOgorICAgICAgIGFiYnIgPSBzc2NhbmYoIHBhcnRzW2ldLCAiJSUlZCIsIGR1bW15ICkgJiYgZHVtbXk9PTA7CisgICAgICAgLy8gTk8gYnJlYWsgIQorICAgIGNhc2UgJ24nOiBjYXNlICdOJzoKKyAgICAgICBtYXh1bml0IHw9IDMxOworICAgICAgIGJyZWFrOworICAgIGNhc2UgJ3cnOiBjYXNlICdXJzoKKyAgICAgICBtYXh1bml0IHw9IDE1OworICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2QnOiBjYXNlICdEJzoKKyAgICAgICBtYXh1bml0IHw9IDc7CisgICAgICAgYnJlYWs7CisgICAgY2FzZSAnaCc6IGNhc2UgJ0gnOgorICAgICAgIG1heHVuaXQgfD0gMzsKKyAgICAgICBicmVhazsKKyAgICBjYXNlICdtJzogY2FzZSAnTSc6CisgICAgICAgbWF4dW5pdCB8PSAxOworICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZiggbWF4dW5pdCAmIDE2ICkgd2Vla3MgJT0gNDsKKyAgaWYoIG1heHVuaXQgJiA4ICkgZGF5cyAlPSA3OworICBpZiggbWF4dW5pdCAmIDQgKSBob3VycyAlPSAyNDsKKyAgaWYoIG1heHVuaXQgJiAyICkgbWlucyAlPSA2MDsKKyAgaWYoIG1heHVuaXQgKSBzZWNzICU9IDYwOworCisgIGZvciggaT0xOyBpPHNpemVvZihwYXJ0cyk7IGkrPTIgKQorICB7CisgICAgZm10ID0gcGFydHNbaV1bMC4uPDJdOworICAgIGNoID0gcGFydHNbaV1bPDFdOworICAgIGlmKCBjaD09J3gnICkKKyAgICB7CisgICAgICBpZiAobW9udGhzID4gMCkgY2g9J24nOworICAgICAgZWxzZSBpZiggd2Vla3M+MCApIGNoPSd3JzsKKyAgICAgIGVsc2UgaWYoIGRheXM+MCApIGNoPSdkJzsKKyAgICAgIGVsc2UgaWYoIGhvdXJzPjAgKSBjaD0naCc7IAorICAgICAgZWxzZSBpZihtaW5zID4gMCkgY2ggPSAnbSc7CisgICAgICBlbHNlIGNoID0gJ3MnOworICAgIH0KKyAgICBlbHNlIGlmKCBjaD09J1gnICkKKyAgICB7CisgICAgICBpZiAobW9udGhzID4gMCkgY2g9J04nOworICAgICAgZWxzZSBpZiggd2Vla3M+MCApIGNoPSdXJzsKKyAgICAgIGVsc2UgaWYoIGRheXM+MCApIGNoPSdEJzsKKyAgICAgIGVsc2UgaWYoIGhvdXJzPjAgKSBjaD0nSCc7IAorICAgICAgZWxzZSBpZihtaW5zID4gMCkgY2ggPSAnTSc7CisgICAgICBlbHNlIGNoID0gJ1MnOworICAgIH0KKyAgICAKKyAgICBzd2l0Y2goIGNoICkKKyAgICB7CisgICAgICBjYXNlICduJzogcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrImQiLCBtb250aHMgKTsgYnJlYWs7CisgICAgICBjYXNlICd3JzogcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrImQiLCB3ZWVrcyApOyBicmVhazsKKyAgICAgIGNhc2UgJ2QnOiBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsiZCIsIGRheXMgKTsgYnJlYWs7CisgICAgICBjYXNlICdoJzogcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrImQiLCBob3VycyApOyBicmVhazsKKyAgICAgIGNhc2UgJ20nOiBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsiZCIsIG1pbnMgKTsgYnJlYWs7CisgICAgICBjYXNlICdzJzogcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrImQiLCBzZWNzICk7IGJyZWFrOworICAgICAgY2FzZSAnTic6CisgICAgICAgaWYoYWJicikgcGFydHNbaV0gPSAiTSI7CisgICAgICAgZWxzZSBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsicyIsIChtb250aHM9PTEpID8gIk1vbmF0IiA6ICJNb25hdGUiICk7CisgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdXJzoKKyAgICAgICBpZihhYmJyKSBwYXJ0c1tpXSA9ICJ3IjsgZWxzZQorICAgICAgIHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJzIiwgKHdlZWtzPT0xKSA/ICJXb2NoZSIgOiAiV29jaGVuIiApOworICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnRCc6CisgICAgICAgaWYoYWJicikgcGFydHNbaV0gPSAiZCI7IGVsc2UKKyAgICAgICBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsicyIsIChkYXlzPT0xKSA/ICJUYWciIDogIlRhZ2UiICk7CisgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdIJzoKKyAgICAgICBpZihhYmJyKSBwYXJ0c1tpXSA9ICJoIjsgZWxzZQorICAgICAgIHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJzIiwgKGhvdXJzPT0xKSA/ICJTdHVuZGUiIDogIlN0dW5kZW4iICk7CisgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdNJzoKKyAgICAgICBpZihhYmJyKSBwYXJ0c1tpXSA9ICJtIjsgZWxzZQorICAgICAgIHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJzIiwgKG1pbnM9PTEpID8gIk1pbnV0ZSIgOiAiTWludXRlbiIgKTsKKyAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ1MnOgorICAgICAgIGlmKGFiYnIpIHBhcnRzW2ldID0gInMiOyBlbHNlCisgICAgICAgcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrInMiLCAoc2Vjcz09MSkgPyAiU2VrdW5kZSIgOiAiU2VrdW5kZW4iICk7CisgICAgICAgYnJlYWs7CisgICAgICBjYXNlICclJzoKKyAgICAgICBwYXJ0c1tpXSA9ICIlIjsKKyAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGltcGxvZGUoIHBhcnRzLCAiIiApOworfQorCitub21hc2sgbWl4ZWQgX19jcmVhdGVfcGxheWVyX2R1bW15KHN0cmluZyBuYW1lKQoreworICBzdHJpbmcgZXJyOworICBvYmplY3Qgb2I7CisgIG1peGVkIG07CisgIC8vaGF0IG5lbiBTY2hlcnprZWtzIGRpZSBCbHVlcHJpbnQgYmV3ZWd0PworICBpZiAoKG9iPWZpbmRfb2JqZWN0KCIvc2VjdXJlL2xvZ2luIikpICYmIGVudmlyb25tZW50KG9iKSkKKyAgICAgIGNhdGNoKGRlc3RydWN0KG9iKTtwdWJsaXNoKTsKKyAgZXJyID0gY2F0Y2gob2IgPSBjbG9uZV9vYmplY3QoInNlY3VyZS9sb2dpbiIpO3B1Ymxpc2gpOworICBpZiAoZXJyKQorICB7CisgICAgd3JpdGUoIkZlaGxlciBiZWltIExhZGVuIHZvbiAvc2VjdXJlL2xvZ2luLmNcbiIrZXJyKyJcbiIpOworICAgIHJldHVybiAwOworICB9CisgIGlmIChvYmplY3RwKG09KG1peGVkKW9iLT5uZXdfbG9nb24obmFtZSkpKSBuZXRkZWFkW25hbWVdPW07CisgIHJldHVybiBtOworfQorCitub21hc2sgaW50IHNlY3VyZV9sZXZlbCgpCit7CisgIGludCAqbGV2ZWw7CisgIC8va2V0dGUgZGVyIENhbGxlciBkdXJjaGxhdWZlbiwgZGVuIG5pZWRyaWdzdGVuIExldmVsIGluIGRlciBLZXR0ZQorICAvL3p1cnVlY2tnZWJlbi4gWmVyc3RvZXJ0ZSBPYmpla3RlIChTZWxic3R6ZXJzdG9lcmVyKSBmdWVocmVuIHp1ciBSdWVja2dhYmUKKyAgLy92b24gMC4KKyAgLy9jYWxsZXJfc3RhY2soMSkgZnVlZ3QgZGVtIFJ1ZWNrZ2FiZWFycmF5IHRoaXNfaW50ZXJhY3RpdmUoKSBoaW56dSBiencuIDAsCisgIC8vd2VubiBlcyBrZWluZW4gSW50ZXJhY3RpdmUgZ2lidC4gRGllIDAgZnVlaHJ0IGRhbm4gd2llIGJlaSB6ZXJzdG9lcnRlbgorICAvL09iamVrdGVuIHp1ciBSdWVja2dhYmUgdm9uIDAsIHdhcyBnZXd1ZW5zY2h0IGlzdCwgZGEgZXMgaGllciBlaW5lbgorICAvL0lOdGVyYWN0aXZlIGdlYmVuIG11c3MuCisgIGxldmVsPW1hcChjYWxsZXJfc3RhY2soMSksZnVuY3Rpb24gaW50IChvYmplY3QgY2FsbGVyKQorICAgICAge2lmIChvYmplY3RwKGNhbGxlcikpCisgICAgICAgcmV0dXJuKHF1ZXJ5X3dpel9sZXZlbChnZXRldWlkKGNhbGxlcikpKTsKKyAgICAgICByZXR1cm4oMCk7IC8vIGtlaW4gT2JqZWt0IGRhLCAwLgorICAgICAgfSApOworICByZXR1cm4obWluKGxldmVsKSk7IC8vZGVuIGtsZWluc3RlbiBXZXJ0IGltIEFycmF5IHp1cnVlY2tnZWJlbiAoZ2dmLiAwKQorfQorCitub21hc2sgc3RyaW5nIHNlY3VyZV9ldWlkKCkKK3sKKyAgc3RyaW5nIGV1aWQ7CisKKyAgaWYgKCF0aGlzX2ludGVyYWN0aXZlKCkpIC8vIEVzIG11c3MgZWluZW4gaW50ZXJhY3RpdmUgZ2ViZW4KKyAgICAgcmV0dXJuIDA7CisgIGV1aWQ9Z2V0ZXVpZCh0aGlzX2ludGVyYWN0aXZlKCkpOworICAvLyB1ZWJlciBhbGxlIENhbGxlciBpdGVyaWVyZW4uIFdlbm4gZWluZXMgZGF2b24gZWluZSBhbmRlcmUgZXVpZCBoYXQgYWxzCisgIC8vIGRlciBJbnRlcmFjdGl2ZSB1bmQgZGllc2UgbmljaHQgZGllIFJPT1RJRCBpc3QsIHdpcmQgMCB6dXJ1ZWNrZ2ViZW4uCisgIC8vIEViZW5zbywgZmFsbHMgZWluIFNlbGJzdHplcnN0b2VyZXIgaXJnZW5kd28gaW4gZGVyIEtldHRlIGlzdC4KKyAgZm9yZWFjaChvYmplY3QgY2FsbGVyOiBjYWxsZXJfc3RhY2soKSkgeworICAgICAgaWYgKCFvYmplY3RwKGNhbGxlcikgfHwKKyAgICAgICAoZ2V0ZXVpZChjYWxsZXIpIT1ldWlkICYmIGdldGV1aWQoY2FsbGVyKSE9Uk9PVElEKSkKKyAgICAgICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBldWlkOyAvLyAnc2ljaGVyZScgZXVpZCB6dXJ1ZWNrZ2ViZW4KK30KKworLy8gSU5QVVRfUFJPTVBUIHVuZCBuZW4gTGVlcnByb21wdCBoaW56dWZ1ZWdlbiwgd2VubiBrZWlucyB1ZWJlcmdlYmVuIHdpcmQuCisvLyBEYXMgc29sbCBkYXp1IGRpZW5lbiwgZGFzcyBhbGxlIGdnZi4gZWluIEVPUiBhbSBQcm9tcHRlbmRlIGtyaWVnZW4uLi4KKy8vI2lmIF9fQk9PVF9USU1FX18gPCAxMzYwMDE3MjEzCit2YXJhcmdzIHZvaWQgaW5wdXRfdG8oIG1peGVkIGZ1biwgaW50IGZsYWdzLCB2YXJhcmdzIG1peGVkICphcmdzICkKK3sKKyAgICBtaXhlZCAqYXJyOworICAgIGludCBpOworCisgICAgaWYgKCAhdGhpc19wbGF5ZXIoKSB8fCAhcHJldmlvdXNfb2JqZWN0KCkgKQorICAgICAgIHJldHVybjsKKworICAgIC8vIFRPRE86IGlucHV0X3RvKC4uLixJTlBVVF9QUk9NUFQsICIiLCAuLi4pLCB3ZW5uIGtlaW4gSU5QVVRfUFJPTVBUCisgICAgLy8gdm9ya29tbXQuLi4KKyAgICBpZiAoIGZsYWdzJklOUFVUX1BST01QVCApIHsgICAgCisgICAgICAgIGFyciA9ICh7IGZ1biwgZmxhZ3MgfSkgKyBhcmdzOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy8gZ2dmLiBlaW4gSU5QVVRfUFJPTVBUIGhpbnp1ZnVlZ2VuIHVuZCBuZW4gTGVlcnN0cmluZyBhbHMgUHJvbXB0LgorICAgICAgICBmbGFncyB8PSBJTlBVVF9QUk9NUFQ7CisgICAgICAgIGFyciA9ICh7IGZ1biwgZmxhZ3MsICIiIH0pICsgYXJnczsKKyAgICB9CisKKyAgICAvLyBBcnJheXMgZ2VnZW4gZmxhdHRlbiBxdW90ZW4uCisgICAgZm9yICggaSA9IHNpemVvZihhcnIpIC0gMTsgaSA+IDE7IGktLSApCisgICAgICAgaWYgKCBwb2ludGVycChhcnJbaV0pICkKKyAgICAgICAgICAgYXJyW2ldID0gcXVvdGUoYXJyW2ldKTsKKworICAgIGFwcGx5KCBiaW5kX2xhbWJkYSggdW5ib3VuZF9sYW1iZGEoICh7fSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHsgIydlZnVuOjppbnB1dF90by8qJyovIH0pICsgYXJyICksCisgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzX29iamVjdCgpICkgKTsKK30KKy8vI2VuZGlmCisKK25vbWFzayBpbnQgc2V0X2xpZ2h0KGludCBpKQorLy8gZXJob2VodCBkYXMgTGljaHRsZXZlbCBlaW5lcyBPYmpla3RzIHVtIGkKKy8vIHJlc3VsdDogZGFzIExpY2h0bGV2ZWwgaW5uZXJoYWxiIGRlcyBPYmpla3RzCit7CisgICAgb2JqZWN0IG9iLCAqaW52OworICAgIGludCBsYWxsLCBsaWdodCwgZGFyaywgdG1wOworCisgICAgaWYgKCEob2I9cHJldmlvdXNfb2JqZWN0KCkpKSByZXR1cm4gMDsgLy8gb2huZSBkYXMgZ2VodHMgbmljaHQuCisKKyAgICAvLyBhdXMga29tcGF0aWJpbGl0YWV0c2dydWVuZGVuIGthbm4gbWFuIGF1Y2ggZGVuIExpY2h0bGV2ZWwgbm9jaCBzZXR6ZW4KKyAgICBpZiAoaSE9MCkgb2ItPlNldFByb3AoUF9MSUdIVCwgb2ItPlF1ZXJ5UHJvcChQX0xJR0hUKStpKTsKKworICAgIC8vIExpY2h0YmVyZWNobnVuZyBmaW5kZXQgZWlnZW50bGljaCBpbiBkZXIgTXVkbGliIHN0YXR0LgorICAgIHJldHVybiAoaW50KW9iLT5RdWVyeVByb3AoUF9JTlRfTElHSFQpOworfQorCisKK3B1YmxpYyBzdHJpbmcgaXNvMmFzY2lpKCBzdHJpbmcgc3RyICkKK3sKKyAgICBpZiAoICFzdHJpbmdwKHN0cikgfHwgIXNpemVvZihzdHIpICkKKyAgICAgICByZXR1cm4gIiI7CisKKyAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICLkIiwgImFlIiwgMSApOworICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgIvYiLCAib2UiLCAxICk7CisgICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAi/CIsICJ1ZSIsIDEgKTsKKyAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICLEIiwgIkFlIiwgMSApOworICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgItYiLCAiT2UiLCAxICk7CisgICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAi3CIsICJVZSIsIDEgKTsKKyAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICLfIiwgInNzIiwgMSApOworICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgIlteIC1+XSIsICI/IiwgMSApOworCisgICAgcmV0dXJuIHN0cjsKK30KKworCitwdWJsaWMgdmFyYXJncyBzdHJpbmcgQ291bnRVcCggc3RyaW5nICpzLCBzdHJpbmcgc2VwLCBzdHJpbmcgbGFzdHNlcCApCit7CisgICAgc3RyaW5nIHJldDsKKworICAgIGlmICggIXBvaW50ZXJwKHMpICkKKyAgICAgICByZXR1cm4gIiI7CisgICAgCisgICAgaWYgKCFzZXApIHNlcCA9ICIsICI7CisgICAgaWYgKCFsYXN0c2VwKSBsYXN0c2VwID0gIiB1bmQgIjsKKworICAgIHN3aXRjaCAoc2l6ZW9mKHMpKSAgeworICAgICAgIGNhc2UgMDogcmV0PSIiOyBicmVhazsKKyAgICAgICBjYXNlIDE6IHJldD1zWzBdOyBicmVhazsKKyAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICByZXQgPSBpbXBsb2RlKHNbMC4uPDJdLCBzZXApOworICAgICAgICAgICAgICByZXQgKz0gbGFzdHNlcCArIHNbPDFdOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitub21hc2sgdmFyYXJncyBpbnQgcXVlcnlfbmV4dF9yZXNldChvYmplY3Qgb2IpIHsKKworICAgIC8vIFR5cHBydWVmdW5nOiBldHdhcyBhbmRlcmVzIGFscyBPYmpla3RlIG9kZXIgMCBzb2xsZW4gRmVobGVyIHNlaW4uCisgICAgaWYgKG9iICYmICFvYmplY3RwKG9iKSkKKyAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIkJhZCBhcmcgMSB0byBxdWVyeV9uZXh0X3Jlc2V0KCk6IGdvdCAlLjIwTywgIgorICAgICAgICAgICAiZXhwZWN0ZWQgb2JqZWN0LlxuIixvYikpOworCisgICAgLy8gRGVmYXVsdG9iamVrdCBQTywgd2VubiAwIHVlYmVyZ2ViZW4uCisgICAgaWYgKCAhb2JqZWN0cChvYikgKQorICAgICAgb2IgPSBwcmV2aW91c19vYmplY3QoKTsKKworICAgIHJldHVybiBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTkVYVF9SRVNFVF9USU1FKTsKK30KKworCisjaWYgIV9fRUZVTl9ERUZJTkVEX18oY29weV9maWxlKQorI2RlZmluZSBNQVhMRU4gNTAwMDAKK25vbWFzayBpbnQgY29weV9maWxlKHN0cmluZyBzb3VyY2UsIHN0cmluZyBkZXN0KQoreworCisgIGludCBwdHI7CisgIHN0cmluZyBieXRlczsKKworICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICBpZiAoIXNpemVvZihzb3VyY2UpfHwhc2l6ZW9mKGRlc3QpfHxzb3VyY2U9PWRlc3R8fChmaWxlX3NpemUoc291cmNlKT09LTEpfHwKKyAgICAgICghY2FsbF9vdGhlcihtYXN0ZXIoKSwidmFsaWRfcmVhZCIsc291cmNlLAorICAgICAgICAgICAgICAgICAgIGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCl8fAorICAgICAgICAgICAgICAgICBwcmV2aW91c19vYmplY3QoKSksInJlYWRfZmlsZSIscHJldmlvdXNfb2JqZWN0KCkpKXx8CisgICAgICAoIWNhbGxfb3RoZXIobWFzdGVyKCksInZhbGlkX3JlYWQiLHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICBnZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpfHwKKyAgICAgICAgICAgICAgICAgcHJldmlvdXNfb2JqZWN0KCkpLCJ3cml0ZV9maWxlIixwcmV2aW91c19vYmplY3QoKSkpKQorICAgIHJldHVybiAxOworICBzd2l0Y2ggKGZpbGVfc2l6ZShkZXN0KSkKKyAgeworICBjYXNlIC0xOgorICAgIGJyZWFrOworICBjYXNlIC0yOgorICAgIGlmIChkZXN0WzwxXSE9Jy8nKSBkZXN0Kz0iLyI7CisgICAgZGVzdCs9ZWZ1bjo6ZXhwbG9kZShzb3VyY2UsIi8iKVs8MV07CisgICAgaWYgKGZpbGVfc2l6ZShkZXN0KT09LTIpIHJldHVybiAxOworICAgIGlmIChmaWxlX3NpemUoZGVzdCkhPS0xKSBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBpZiAoIXJtKGRlc3QpKSByZXR1cm4gMTsKKyAgICBicmVhazsKKyAgfQorICBkbworICB7CisgICAgYnl0ZXMgPSByZWFkX2J5dGVzKHNvdXJjZSwgcHRyLCBNQVhMRU4pOyBwdHIgKz0gTUFYTEVOOworICAgIGlmICghYnl0ZXMpIGJ5dGVzPSIiOworICAgIHdyaXRlX2ZpbGUoZGVzdCwgYnl0ZXMpOworICB9CisgIHdoaWxlKHNpemVvZihieXRlcykgPT0gTUFYTEVOKTsKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8hX19FRlVOX0RFRklORURfXyhjb3B5X2ZpbGUpCisKKworLy8gIyMjIEVyc2F0emF1ZmxvZXN1bmcgaW4gU3RyaW5ncyAjIyMKK3ZhcmFyZ3Mgc3RyaW5nIHJlcGxhY2VfcGVyc29uYWwoc3RyaW5nIHN0ciwgbWl4ZWQgKm9icywgaW50IGNhcHMpIHsKKyAgaW50IGk7CisgIHN0cmluZyAqcGFydHM7CisKKyAgcGFydHMgPSByZWdleHBsb2RlKHN0ciwgIkBXRVtBLVNVXSpbMC05XSIpOworICBpID0gc2l6ZW9mKHBhcnRzKTsKKworICBpZiAoaT4xKSB7CisgICAgaW50IGosIHQ7CisgICAgY2xvc3VyZSAqbmFtZV9jbHM7CisKKyAgICB0ID0gaiA9IHNpemVvZihvYnMpOworCisgICAgbmFtZV9jbHMgID0gIGFsbG9jYXRlKGopOworICAgIHdoaWxlIChqLS0pCisgICAgICBpZiAob2JqZWN0cChvYnNbal0pKQorICAgICAgICBuYW1lX2Nsc1tqXSA9IHN5bWJvbF9mdW5jdGlvbigibmFtZSIsIG9ic1tqXSk7CisgICAgICBlbHNlIGlmIChzdHJpbmdwKG9ic1tqXSkpCisgICAgICAgIG5hbWVfY2xzW2pdID0gb2JzW2pdOworCisgICAgd2hpbGUgKChpLT0gMik+MCkgeworICAgICAgaW50IG9iX25yOworICAgICAgLy8genUgZXJzZXR6ZW5kZXMgVG9rZW4gaW4gRmFsbCB1bmQgT2JqZWt0aW5kZXggYXVmc3BhbHRlbgorICAgICAgb2JfbnIgPSBwYXJ0c1tpXVs8MV0tJzEnOworICAgICAgaWYgKG9iX25yPDAgfHwgb2JfbnI+PXQpIHsKKyAgICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigicmVwbGFjZV9wZXJzb25hbDogdXNpbmcgd3Jvbmcgb2JqZWN0IGluZGV4ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICBvYl9ucikpOworICAgICAgICByZXR1cm4gaW1wbG9kZShwYXJ0cywgIiIpOworICAgICAgfQorCisgICAgICAvLyBjYXN1cyBrYW5uIG1hbiBzY2hvbiBoaWVyIGVudHNjaGVpZGVuCisgICAgICBpbnQgY2FzdXM7CisgICAgICBzdHJpbmcgcGFydCA9IHBhcnRzW2ldOworICAgICAgc3dpdGNoIChwYXJ0WzNdKSB7CisgICAgICAgIGNhc2UgJ1InOiBjYXN1cyA9IFdFUjsgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1MnOiBjYXN1cyA9IFdFU1NFTjsgYnJlYWs7CisgICAgICAgIGNhc2UgJ00nOiBjYXN1cyA9IFdFTTsgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ04nOiBjYXN1cyA9IFdFTjsgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6ICBjb250aW51ZTsgLy8gcGFzc3Qgc2Nob24gamV0enQgbmljaHQgaW4gZGFzIEhhdXB0bXVzdGVyCisgICAgICB9CisKKyAgICAgIC8vIHVuZCBqZXR6dCBkaWUgZWluemVsbmVuIEtleXdvcmRzIG9obmUgZnVlaHJlbmRlcyAiQFdFIiwgYmVlbmRlbmRlIElkCisgICAgICBtaXhlZCB0bXA7CisgICAgICBzd2l0Y2ggKHBhcnRbMy4uPDJdKSB7CisgICAgICAgIGNhc2UgIlIiOiBjYXNlICJTU0VOIjogY2FzZSAiTSI6IGNhc2UgIk4iOiAgICAgICAgICAgICAgIC8vIE5hbWUKKyAgICAgICAgICBwYXJ0c1tpXSA9IGZ1bmNhbGwobmFtZV9jbHNbb2JfbnJdLCBjYXN1cywgMSk7ICBicmVhazsKKyAgICAgICAgY2FzZSAiUlUiOiBjYXNlICJTU0VOVSI6IGNhc2UgIk1VIjogY2FzZSAiTlUiOiAgICAgICAgICAgLy8gdW5iZXN0aW1tdAorICAgICAgICAgIHBhcnRzW2ldID0gZnVuY2FsbChuYW1lX2Nsc1tvYl9ucl0sIGNhc3VzKTsgICAgIGJyZWFrOworICAgICAgICBjYXNlICJSUVAiOiBjYXNlICJTU0VOUVAiOiBjYXNlICJNUVAiOiBjYXNlICJOUVAiOiAgICAgICAvLyBQcm9ub3VuCisgICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCisgICAgICAgICAgICBwYXJ0c1tpXSA9IChzdHJpbmcpdG1wLT5RdWVyeVByb25vdW4oY2FzdXMpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICJSUUEiOiBjYXNlICJTU0VOUUEiOiBjYXNlICJNUUEiOiBjYXNlICJOUUEiOiAgICAgICAvLyBBcnRpY2xlCisgICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCisgICAgICAgICAgICB0bXAgPSAoc3RyaW5nKXRtcC0+UXVlcnlBcnRpY2xlKGNhc3VzLCAxLCAxKTsKKyAgICAgICAgICBpZiAoc3RyaW5ncCh0bXApICYmICEodG1wWzwxXV4nICcpKSAKKyAgICAgICAgICAgIHRtcCA9IHRtcFswLi48Ml07ICAgICAgICAgICAgICAgIC8vIEV4dHJhLVNwYWNlIHdpZWRlciBsb2VzY2hlbgorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICJSUVBQTVMiOiBjYXNlICJTU0VOUVBQTVMiOiBjYXNlICJNUVBQTVMiOiBjYXNlICJOUVBQTVMiOgorICAgICAgICAgIGlmIChvYmplY3RwKHRtcCA9IG9ic1tvYl9ucl0pKQorICAgICAgICAgICAgcGFydHNbaV0gPSAoc3RyaW5nKXRtcC0+UXVlcnlQb3NzUHJvbm91bihNQUxFLCBjYXN1cywgU0lOR1VMQVIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICJSUVBQRlMiOiBjYXNlICJTU0VOUVBQRlMiOiBjYXNlICJNUVBQRlMiOiBjYXNlICJOUVBQRlMiOgorICAgICAgICAgIGlmIChvYmplY3RwKHRtcCA9IG9ic1tvYl9ucl0pKQorICAgICAgICAgICAgcGFydHNbaV0gPSAoc3RyaW5nKXRtcC0+UXVlcnlQb3NzUHJvbm91bihGRU1BTEUsIGNhc3VzLCBTSU5HVUxBUik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgIlJRUFBOUyI6IGNhc2UgIlNTRU5RUFBOUyI6IGNhc2UgIk1RUFBOUyI6IGNhc2UgIk5RUFBOUyI6CisgICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCisgICAgICAgICAgICBwYXJ0c1tpXSA9IChzdHJpbmcpdG1wLT5RdWVyeVBvc3NQcm9ub3VuKE5FVVRFUiwgY2FzdXMsIFNJTkdVTEFSKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiUlFQUE1QIjogY2FzZSAiU1NFTlFQUE1QIjogY2FzZSAiTVFQUE1QIjogY2FzZSAiTlFQUE1QIjoKKyAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKKyAgICAgICAgICAgIHBhcnRzW2ldID0gKHN0cmluZyl0bXAtPlF1ZXJ5UG9zc1Byb25vdW4oTUFMRSwgY2FzdXMsIFBMVVJBTCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgIlJRUFBGUCI6IGNhc2UgIlNTRU5RUFBGUCI6IGNhc2UgIk1RUFBGUCI6IGNhc2UgIk5RUFBGUCI6CisgICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCisgICAgICAgICAgICBwYXJ0c1tpXSA9IChzdHJpbmcpdG1wLT5RdWVyeVBvc3NQcm9ub3VuKEZFTUFMRSwgY2FzdXMsIFBMVVJBTCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgIlJRUFBOUCI6IGNhc2UgIlNTRU5RUFBOUCI6IGNhc2UgIk1RUFBOUCI6IGNhc2UgIk5RUFBOUCI6CisgICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCisgICAgICAgICAgICBwYXJ0c1tpXSA9IChzdHJpbmcpdG1wLT5RdWVyeVBvc3NQcm9ub3VuKE5FVVRFUiwgY2FzdXMsIFBMVVJBTCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIHdlbm4gdG1wIGVpbiBTdHJpbmcgd2FyLCB3ZWlzZW4gd2lyIGVzIGhpZXIgcGF1c2NoYWwgenUKKyAgICAgIGlmIChzdHJpbmdwKHRtcCkpCisgICAgICAgIHBhcnRzW2ldID0gdG1wOworCisgICAgICAvLyBhdWYgV3Vuc2NoIHdpcmQgbmFjaCBTYXR6ZW5kZW4gZ3Jvc3MgZ2VzY2hyaWViZW4KKyAgICAgIGlmIChjYXBzKQorICAgICAgICBzd2l0Y2ggKHBhcnRzW2ktMV1bPDIuLl0pIHsKKyAgICAgICAgICBjYXNlICIuICI6ICBjYXNlICIhICI6ICBjYXNlICI/ICI6CisgICAgICAgICAgY2FzZSAiLiI6ICAgY2FzZSAiISI6ICAgY2FzZSAiPyI6CisgICAgICAgICAgY2FzZSAiLlxuIjogY2FzZSAiIVxuIjogY2FzZSAiP1xuIjoKKyAgICAgICAgICBjYXNlICJcIiAiOiBjYXNlICJcIlxuIjoKKyAgICAgICAgICAgIHBhcnRzW2ldID0gY2FwaXRhbGl6ZShwYXJ0c1tpXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaW1wbG9kZShwYXJ0cywgIiIpOworICB9CisgIHJldHVybiBzdHI7Cit9CisKKworLy9yZXBsYWNlbWVudHMgZm9yIGRyb3BwZWQgZWZ1bnMgaW4gTEQKKyNpZiAhX19FRlVOX0RFRklORURfXyhleHRyYWN0KQorZGVwcmVjYXRlZCB2YXJhcmdzIHN0cmluZyBleHRyYWN0KHN0cmluZyBzdHIsIGludCBmcm9tLCBpbnQgdG8pIHsKKworICBpZighc3RyaW5ncChzdHIpKSB7CisgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJCYWQgYXJndW1lbnQgMSB0byBleHRyYWN0KCk6ICVPIixzdHIpKTsKKyAgfQorICBpZiAoaW50cChmcm9tKSAmJiBpbnRwKHRvKSkgeworICAgIGlmIChmcm9tPj0wICYmIHRvPj0wKQorICAgICAgcmV0dXJuKHN0cltmcm9tIC4uIHRvXSk7CisgICAgZWxzZSBpZiAoZnJvbT49MCAmJiB0bzwwKQorICAgICAgcmV0dXJuKHN0cltmcm9tIC4uIDxhYnModG8pXSk7CisgICAgZWxzZSBpZiAoZnJvbTwwICYmIHRvPj0wKQorICAgICAgcmV0dXJuKHN0cls8YWJzKGZyb20pIC4uIHRvXSk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKHN0cls8YWJzKGZyb20pIC4uIDxhYnModG8pXSk7CisgIH0KKyAgZWxzZSBpZiAoaW50cChmcm9tKSkgeworICAgIGlmIChmcm9tPj0wKQorICAgICAgcmV0dXJuKHN0cltmcm9tIC4uIF0pOworICAgIGVsc2UKKyAgICAgIHJldHVybihzdHJbPGFicyhmcm9tKSAuLiBdKTsKKyAgfQorICBlbHNlIHsKKyAgICByZXR1cm4oc3RyKTsKKyAgfQorfQorI2VuZGlmIC8vICFfX0VGVU5fREVGSU5FRF9fKGV4dHJhY3QpCisKKyNpZiAhX19FRlVOX0RFRklORURfXyhzbGljZV9hcnJheSkKK2RlcHJlY2F0ZWQgdmFyYXJncyBtaXhlZCBzbGljZV9hcnJheShtaXhlZCBhcnJheSwgaW50IGZyb20sIGludCB0bykgeworCisgIGlmKCFwb2ludGVycChhcnJheSkpIHsKKyAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIkJhZCBhcmd1bWVudCAxIHRvIHNsaWNlX2FycmF5KCk6ICVPIixhcnJheSkpOworICB9CisgIGlmIChpbnRwKGZyb20pICYmIGludHAodG8pKSB7CisgICAgaWYgKGZyb20+PTAgJiYgdG8+PTApCisgICAgICByZXR1cm4oYXJyYXlbZnJvbSAuLiB0b10pOworICAgIGVsc2UgaWYgKGZyb20+PTAgJiYgdG88MCkKKyAgICAgIHJldHVybihhcnJheVtmcm9tIC4uIDxhYnModG8pXSk7CisgICAgZWxzZSBpZiAoZnJvbTwwICYmIHRvPj0wKQorICAgICAgcmV0dXJuKGFycmF5WzxhYnMoZnJvbSkgLi4gdG9dKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4oYXJyYXlbPGFicyhmcm9tKSAuLiA8YWJzKHRvKV0pOworICB9CisgIGVsc2UgaWYgKGludHAoZnJvbSkpIHsKKyAgICBpZiAoZnJvbT49MCkKKyAgICAgIHJldHVybihhcnJheVtmcm9tIC4uIF0pOworICAgIGVsc2UKKyAgICAgIHJldHVybihhcnJheVs8YWJzKGZyb20pIC4uIF0pOworICB9CisgIGVsc2UgeworICAgIHJldHVybihhcnJheSk7CisgIH0KK30KKyNlbmRpZiAvLyAhX19FRlVOX0RFRklORURfXyhzbGljZV9hcnJheSkKKworI2lmICFfX0VGVU5fREVGSU5FRF9fKG1lbWJlcl9hcnJheSkKK2RlcHJlY2F0ZWQgaW50IG1lbWJlcl9hcnJheShtaXhlZCBpdGVtLCBtaXhlZCBhcnJheXN0cmluZykgeworCisgIGlmIChwb2ludGVycChhcnJheXN0cmluZykpIHsKKyAgICByZXR1cm4oZWZ1bjo6bWVtYmVyKGFycmF5c3RyaW5nLGl0ZW0pKTsKKyAgfQorICBlbHNlIGlmIChzdHJpbmdwKGFycmF5c3RyaW5nKSkgeworICAgIHJldHVybihlZnVuOjptZW1iZXIoYXJyYXlzdHJpbmcsdG9faW50KGl0ZW0pKSk7CisgIH0KKyAgZWxzZSB7CisgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJCYWQgYXJndW1lbnQgMSB0byBtZW1iZXJfYXJyYXkoKTogJU8iLGFycmF5c3RyaW5nKSk7CisgIH0KK30KKyNlbmRpZiAvLyAhX19FRlVOX0RFRklORURfXyhtZW1iZXJfYXJyYXkpCisKKy8vIFRoZSBkaWdpdCBhdCB0aGUgaSd0aCBwb3NpdGlvbiBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgc2V0IGluICdpJy4KK3N0cmluZyBjb3VudF90YWJsZSA9CisgICAgIjAxMTIxMjIzMTIyMzIzMzQxMjIzMjMzNDIzMzQzNDQ1MTIyMzIzMzQyMzM0MzQ0NTIzMzQzNDQ1MzQ0NTQ1NTYiOworaW50IGJyb2tlbl9jb3VudF9iaXRzKCBzdHJpbmcgcyApIHsKKyAgICBpbnQgaSwgcmVzOworICAgIGlmKCAhc3RyaW5ncChzKSB8fCAhKGk9c2l6ZW9mKHMpKSApIHJldHVybiAwOworICAgIGZvciggOyBpLS0+MDsgKSB7CisgICAgICAgIC8vIFdlIGFyZSBjb3VudGluZyA2IGJpdHMgYXQgYSB0aW1lIHVzaW5nIGEgcHJlY29tcGlsZWQgdGFibGUuCisgICAgICAgIHJlcyArPSBjb3VudF90YWJsZVsoc1tpXS0nICcpJjYzXS0nMCc7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKKyNpZiAhX19FRlVOX0RFRklORURfXyhjb3VudF9iaXRzKQoraW50IGNvdW50X2JpdHMoIHN0cmluZyBzICkgeworICAgIHJldHVybihicm9rZW5fY291bnRfYml0cyhzKSk7Cit9CisjZW5kaWYKKworCisvLyAqIFRlaWxlIGF1cyBlaW5lbSBBcnJheSBlbnRmZXJuZW4gKioqIE9CU09MRVRFCitkZXByZWNhdGVkIG1peGVkICpleGNsdWRlX2FycmF5KG1peGVkICphcnIsaW50IGZyb20saW50IHRvKQoreworICBpZiAodG88ZnJvbSkKKyAgICB0byA9IGZyb207CisgIHJldHVybiBhcnJbMC4uZnJvbS0xXSthcnJbdG8rMS4uXTsKK30KKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvUkVBRE1FIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMzQyOWEKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9SRUFETUUKQEAgLTAsMCArMSwyMCBAQAorc2ltdWxfZWZ1biAKKy0tLS0tLS0tLS0gCitEYXMgc2ltdWxfZWZ1biBPYmpla3QgL3NlY3VyZS9zaW11bF9lZnVuL3NpbXVsX2VmdW4gYmVudXR6dCBkaWUgRGF0ZWllbgoraW4gL3NlY3VyZS9zaW11bF9lZnVuLgorSW0gVmVyemVpY2huaXMgL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlIGlzdCBlaW5lIFNpY2hlcmhlaXRza29waWUgdm9uIGFsbGVuIAorRGF0ZWllbiBpbiAvc2VjdXJlL3NpbXVsX2VmdW4uCisKK0ZhbGxzIC9zZWN1cmUvc2ltdWxfZWZ1bi9zaW11bF9lZnVuLmMgbmljaHQgbGFkYmFyIGlzdCwgd2lyZCAKKy9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zaW11bF9lZnVuLmMgYWxzIEVyc2F0eiB2ZXJzdWNodC4gV2VubiBhdWNoIGRhcworbmljaHQgbGFkYmFyIGlzdCwgZXJmb2xndCBlaW4gU2h1dGRvd24gZGVzIE11ZHMuCisKK0JlaSBBZW5kZXJ1bmdlbiBzb2xsdGUgX3p1ZXJzdF8gZGllIG5vcm1hbGUgc2ltdWwgZWZ1biBlZGl0aWVydCB1bmQKK2Fuc2NobGllc3NlbmQgemVyc3RvZXJ0L2VudGxhZGVuIHdlcmRlbiwgd29yYXVmaGluIHNpZSBpbXBsaXppdCBkdXJjaCBkZW4KK0RyaXZlciB1bmQgTWFzdGVyIG5ldWdlbGFkZW4gd2lyZC4gSXN0IGRpZXMgZXJmb2xncmVpY2ggdW5kIGRpZSBuZXVlCitzaW11bF9lZnVuIGxhZXVmdCAoZXJzdCBkYW5uISkga29waWVydCBtYW4gZGllIERhdGVpZW4gYXVzIAorL3NlY3VyZS9zaW11bF9lZnVuIG5hY2ggL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlLgorCitEaWUgRGF0ZWllbiBoaWVyIHNpbmQgbWl0IEF1c25haG1lIGRlciBzaW11bF9lZnVuLmMgc2VsYnN0IF9uaWNodF8gZGF6dSAKK2dlZGFjaHQsIGdlbGFkZW4genUgd2VyZGVuLgorCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9jb21tLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9jb21tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZiNTk4YwotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL2NvbW0uYwpAQCAtMCwwICsxLDEyNSBAQAorI2luY2x1ZGUgPGxpdmluZy9jb21tLmg+CisKKy8vIFNlbmRldCBhbiBhbGxlIE9iamVrdGUgaW4gcm9vbSB1bmQgcm9vbSBzZWxiZXIgZHVyY2ggQXVmcnVmIHZvbgorLy8gUmVjZWl2ZU1zZygpLgordmFyYXJncyB2b2lkIHNlbmRfcm9vbShvYmplY3R8c3RyaW5nIHJvb20sIHN0cmluZyBtc2csIGludCBtc2dfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1zZ19hY3Rpb24sIHN0cmluZyBtc2dfcHJlZml4LCBvYmplY3QgKmV4Y2x1ZGUsCisgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCBvcmlnaW4pCit7CisgIGlmIChzdHJpbmdwKHJvb20pKQorICAgIHJvb209bG9hZF9vYmplY3Qocm9vbSk7CisgIAorICBvcmlnaW4gfHw9IHByZXZpb3VzX29iamVjdCgpOworICBvYmplY3QgKmRlc3QgPSBleGNsdWRlID8gYWxsX2ludmVudG9yeShyb29tKSAtIGV4Y2x1ZGUgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsX2ludmVudG9yeShyb29tKTsKKworICBkZXN0LT5SZWNlaXZlTXNnKG1zZywgbXNnX3R5cGUsIG1zZ19hY3Rpb24sIG1zZ19wcmVmaXgsIG9yaWdpbik7CisgIHJvb20tPlJlY2VpdmVNc2cobXNnLCBtc2dfdHlwZSwgbXNnX2FjdGlvbiwgbXNnX3ByZWZpeCwgb3JpZ2luKTsKK30KKworc3RhdGljIGludCBfc2hvdXRfZmlsdGVyKCBvYmplY3Qgb2IsIHN0cmluZyBwYXQgKQoreworICAgIHN0cmluZyAqaWdub3JlOworCisgICAgaWYgKCAhZW52aXJvbm1lbnQob2IpICkKKyAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBzaXplb2YoIHJlZ2V4cCggKHsgb2JqZWN0X25hbWUoIGVudmlyb25tZW50KG9iKSApIH0pLCBwYXQgKSApOworfQorCit2YXJhcmdzIHZvaWQgc2hvdXQoIHN0cmluZyBzLCBtaXhlZCB3aGVyZSApeworICAgIG9iamVjdCAqdTsKKyAgICBzdHJpbmcgKnBmYWRlOworCisgICAgaWYgKCAhc2l6ZW9mKCB1ID0gdXNlcnMoKSAtICh7IHRoaXNfcGxheWVyKCkgfSkgKSApCisgICAgICAgcmV0dXJuOworCisgICAgaWYgKCAhd2hlcmUgKQorICAgICAgIHBmYWRlID0gKHsgIi8iIH0pOworICAgIGVsc2UgaWYgKCBpbnRwKHdoZXJlKSApCisgICAgICAgcGZhZGUgPQorICAgICAgICAgICAoeyBpbXBsb2RlKCBlZnVuOjpleHBsb2RlKCBvYmplY3RfbmFtZSggZW52aXJvbm1lbnQodGhpc19wbGF5ZXIoKSkgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8iIClbMC4uMl0sICIvIiApICsgIi8iIH0pOworICAgIGVsc2UgaWYgKCBzdHJpbmdwKHdoZXJlKSApCisgICAgICAgcGZhZGUgPSAoeyB3aGVyZSB9KTsKKyAgICBlbHNlCisgICAgICAgcGZhZGUgPSB3aGVyZTsKKworICAgIHUgPSBmaWx0ZXIoIHUsICJfc2hvdXRfZmlsdGVyIiwgTUUsIGltcGxvZGUoIHBmYWRlLCAifCIgKSApOworICAgIHUtPlJlY2VpdmVNc2cocywgTVRfQ09NTXxNVF9GQVJ8TVNHX0RPTlRfV1JBUHxNU0dfRE9OVF9TVE9SRSwKKyAgICAgICAgICAgICAgICAgIE1BX1NIT1VUX1NFRlVOLCAwLCBwcmV2aW91c19vYmplY3QoKSk7Cit9CisKKworI2lmIF9fVkVSU0lPTl9fID4gIjMuMy43MTgiCisvLyBUaGlzIHNlZnVuIHJlcGxhY2VzIHRoZSBkZXByZWNhdGVkIGVmdW4gY2F0KCkuCisjZGVmaW5lIENBVF9NQVhfTElORVMgNTAKK3ZhcmFyZ3MgaW50IGNhdChzdHJpbmcgZmlsZSwgaW50IHN0YXJ0LCBpbnQgbnVtKQoreworICAgIGlmIChleHRlcm5fY2FsbCgpKQorICAgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworCisgICAgaW50IG1vcmU7CisKKyAgICBpZiAobnVtIDwgMCB8fCAhdGhpc19wbGF5ZXIoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoIXN0YXJ0KQorICAgICAgICBzdGFydCA9IDE7CisKKyAgICBpZiAoIW51bSB8fCBudW0gPiBDQVRfTUFYX0xJTkVTKSB7CisgICAgICAgIG51bSA9IENBVF9NQVhfTElORVM7CisgICAgICAgIG1vcmUgPSBzaXplb2YocmVhZF9maWxlKGZpbGUsIHN0YXJ0K251bSwgMSkpOworICAgIH0KKworICAgIHN0cmluZyB0eHQgPSByZWFkX2ZpbGUoZmlsZSwgc3RhcnQsIG51bSk7CisgICAgaWYgKCF0eHQpCisgICAgICAgIHJldHVybiAwOworCisgICAgZWZ1bjo6dGVsbF9vYmplY3QodGhpc19wbGF5ZXIoKSwgdHh0KTsKKworICAgIGlmIChtb3JlKQorICAgICAgICBlZnVuOjp0ZWxsX29iamVjdCh0aGlzX3BsYXllcigpLCAiKioqKipUUlVOQ0FURUQqKioqXG4iKTsKKworICAgIHJldHVybiBzaXplb2YodHh0ICYgIlxuIik7Cit9CisjdW5kZWYgQ0FUX01BWF9MSU5FUworI2VuZGlmIC8vIF9fVkVSU0lPTl9fID4gIjMuMy43MTgiCisKKyNpZiBfX1ZFUlNJT05fXyA+ICIzLjMuNzE5IgorLy8gVGhpcyBzZWZ1biByZXBsYWNlcyB0aGUgZGVwcmVjYXRlZCBlZnVuIHRhaWwoKS4KKyNkZWZpbmUgVEFJTF9NQVhfQllURVMgMTAwMAordmFyYXJncyBpbnQgdGFpbChzdHJpbmcgZmlsZSkKK3sKKyAgICBpZiAoZXh0ZXJuX2NhbGwoKSkKKyAgICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKworICAgIGlmICghc3RyaW5ncChmaWxlKSB8fCAhdGhpc19wbGF5ZXIoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzdHJpbmcgdHh0ID0gcmVhZF9ieXRlcyhmaWxlLCAtKFRBSUxfTUFYX0JZVEVTICsgODApLCAoVEFJTF9NQVhfQllURVMgKyA4MCkpOworICAgIC8vIHJlYWRfYnl0ZXMoKSByZXR1cm5zIDAgaWYgdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uIGdpdmVuIGJ5CisgICAgLy8gcGFyYW1ldGVyICMyIGxpZXMgYmV5b25kIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCisgICAgLy8gSW4gdGhpcyBjYXNlIHdlIHNpbXBseSB0cnkgYW5kIHJlYWQgdGhlIGVudGlyZSBmaWxlLgorICAgIGlmICghc3RyaW5ncCh0eHQpICYmIGZpbGVfc2l6ZShmaWxlKSA8IFRBSUxfTUFYX0JZVEVTKzgwKQorICAgICAgdHh0ID0gcmVhZF9maWxlKGZpbGUpOworICAgIC8vIEV4aXQgaWYgc3RpbGwgbm90aGluZyBjb3VsZCBiZSByZWFkLgorICAgIGlmICghc3RyaW5ncCh0eHQpKQorICAgICAgcmV0dXJuIDA7CisKKyAgICAvLyBjdXQgb2ZmIGZpcnN0IChpbmNvbXBsZXRlKSBsaW5lCisgICAgaW50IGluZGV4ID0gc3Ryc3RyKHR4dCwgIlxuIik7CisgICAgaWYgKGluZGV4ID4gLTEpIHsKKyAgICAgICAgaWYgKGluZGV4ICsgMSA8IHNpemVvZih0eHQpKQorICAgICAgICAgICAgdHh0ID0gdHh0W2luZGV4KzEuLl07CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHR4dCA9ICIiOworICAgIH0KKworICAgIGVmdW46OnRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksIHR4dCk7CisKKyAgICByZXR1cm4gMTsKK30KKyN1bmRlZiBUQUlMX01BWF9CWVRFUworI2VuZGlmIC8vIF9fVkVSU0lPTl9fID4gIjMuMy43MTkiCisKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL2RlYnVnX2luZm8uYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL2RlYnVnX2luZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjA3YzJmCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvZGVidWdfaW5mby5jCkBAIC0wLDAgKzEsNDM0IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gZGVidWdfaW5mbygpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhkZWJ1Z19pbmZvKQorCisjaW5jbHVkZSA8ZHJpdmVyX2luZm8uaD4KKyNpbmNsdWRlIDxkZWJ1Z19pbmZvLmg+CisKK21peGVkIGRlYnVnX2luZm8oaW50IHdoYXQsIHZhcmFyZ3MgbWl4ZWQqIGFyZ3MpCit7CisgICAgaWYgKHNpemVvZihhcmdzKSA+IDIpCisgICAgICAgIHJhaXNlX2Vycm9yKCJUb28gbWFueSBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7CisKKyAgICBzd2l0Y2god2hhdCkKKyAgICB7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJJbGxlZ2FsIHZhbHVlICVkIGZvciBkZWJ1Z19pbmZvKCkuXG4iLCB3aGF0KSk7CisKKyAgICAgICAgY2FzZSBESU5GT19PQkpFQ1Q6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9iamVjdCBvYjsKKworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSAhPSAxKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKKyAgICAgICAgICAgIGlmICghb2JqZWN0cChhcmdzWzBdKSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOworCisgICAgICAgICAgICBvYiA9IGFyZ3NbMF07CisgICAgICAgICAgICBwcmludGYoIk9fSEVBUlRfQkVBVCAgICAgIDogJXNcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPQ19IRUFSVF9CRUFUKSAgICAgICA/ICJUUlVFIiA6ICJGQUxTRSIpOworICAgICAgICAgICAgcHJpbnRmKCJPX0VOQUJMRV9DT01NQU5EUyA6ICVzXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0NfQ09NTUFORFNfRU5BQkxFRCkgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgICAgICAgIHByaW50ZigiT19DTE9ORSAgICAgICAgICAgOiAlc1xuIiwgZWZ1bjo6Y2xvbmVwKG9iKSAgICAgICAgICAgICAgICAgICAgICAgICAgID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICAgICAgICBwcmludGYoIk9fREVTVFJVQ1RFRCAgICAgIDogRkFMU0VcbiIpOworICAgICAgICAgICAgcHJpbnRmKCJPX1NXQVBQRUQgICAgICAgICA6ICVzXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU1dBUFBFRCkgICAgICAgICAgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgICAgICAgIHByaW50ZigiT19PTkNFX0lOVEVSQUNUSVZFOiAlc1xuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09OQ0VfSU5URVJBQ1RJVkUpID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICAgICAgICBwcmludGYoIk9fUkVTRVRfU1RBVEUgICAgIDogJXNcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9SRVNFVF9TVEFURSkgICAgICA/ICJUUlVFIiA6ICJGQUxTRSIpOworICAgICAgICAgICAgcHJpbnRmKCJPX1dJTExfQ0xFQU5fVVAgICA6ICVzXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfV0lMTF9DTEVBTl9VUCkgICAgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgICAgICAgIHByaW50ZigiT19SRVBMQUNFRCAgICAgICAgOiAlc1xuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1JFUExBQ0VEKSAgICAgICAgID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICAgICAgICBwcmludGYoInRpbWVfcmVzZXQgIDogJWRcbiIsICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9ORVhUX1JFU0VUX1RJTUUpKTsKKyAgICAgICAgICAgIHByaW50ZigidGltZV9vZl9yZWYgOiAlZFxuIiwgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0xBU1RfUkVGX1RJTUUpKTsKKyAgICAgICAgICAgIHByaW50ZigicmVmICAgICAgICAgOiAlZFxuIiwgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9SRUZTKSk7CisKKyAgICAgICAgICAgIGludCBndGlja3MgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfR0lHQVRJQ0tTKTsKKyAgICAgICAgICAgIGlmKGd0aWNrcykKKyAgICAgICAgICAgICAgICBwcmludGYoImV2YWxjb3N0ICAgOiAgJWQlMDlkXG4iLCBndGlja3MsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9USUNLUykpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHByaW50ZigiZXZhbGNvc3QgICA6ICAlZFxuIiwgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfVElDS1MpKTsKKworICAgICAgICAgICAgcHJpbnRmKCJzd2FwX251bSAgICA6ICVkXG4iLCAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU1dBUF9OVU0pKTsKKyAgICAgICAgICAgIHByaW50ZigibmFtZSAgICAgICAgOiAnJXMnXG4iLCAgICAgZWZ1bjo6b2JqZWN0X25hbWUob2IpKTsKKyAgICAgICAgICAgIHByaW50ZigibG9hZF9uYW1lICAgOiAnJXMnXG4iLCAgICAgZWZ1bjo6bG9hZF9uYW1lKG9iKSk7CisKKyAgICAgICAgICAgIG9iamVjdCBuZXh0X29iID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9ORVhUKTsKKyAgICAgICAgICAgIGlmIChuZXh0X29iKQorICAgICAgICAgICAgICAgIHByaW50ZigibmV4dF9hbGwgICAgOiBPQkooJXMpXG4iLCBlZnVuOjpvYmplY3RfbmFtZShuZXh0X29iKSk7CisKKyAgICAgICAgICAgIG9iamVjdCBwcmV2X29iID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9QUkVWKTsKKyAgICAgICAgICAgIGlmIChwcmV2X29iKQorICAgICAgICAgICAgICAgIHByaW50ZigiUHJldmlvdXMgb2JqZWN0IGluIG9iamVjdCBsaXN0OiBPQkooJXMpXG4iLCBlZnVuOjpvYmplY3RfbmFtZShwcmV2X29iKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHJpbnRmKCJUaGlzIG9iamVjdCBpcyB0aGUgaGVhZCBvZiB0aGUgb2JqZWN0IGxpc3QuXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBESU5GT19NRU1PUlk6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9iamVjdCBvYjsKKworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSAhPSAxKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKKyAgICAgICAgICAgIGlmICghb2JqZWN0cChhcmdzWzBdKSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOworCisgICAgICAgICAgICBvYiA9IGFyZ3NbMF07CisKKyAgICAgICAgICAgIHByaW50ZigicHJvZ3JhbSByZWYncyAlM2RcbiIsICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1BST0dfUkVGUykpOworICAgICAgICAgICAgcHJpbnRmKCJOYW1lOiAnJXMnXG4iLCAgICAgICAgICBlZnVuOjpwcm9ncmFtX25hbWUob2IpKTsKKyAgICAgICAgICAgIHByaW50ZigicHJvZ3JhbSBzaXplICAgICU2ZFxuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1BST0dfU0laRSkpOworICAgICAgICAgICAgcHJpbnRmKCJudW0gZnVuYydzOiAgJTNkICglNGQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX0ZVTkNUSU9OUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX0ZVTkNUSU9OUykpOworICAgICAgICAgICAgcHJpbnRmKCJudW0gdmFyczogICAgJTNkICglNGQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX1ZBUklBQkxFUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1ZBUklBQkxFUykpOworCisgICAgICAgICAgICBwcmludGYoIm51bSBzdHJpbmdzOiAlM2QgKCU0ZCkgOiBvdmVyaGVhZCAlZCArIGRhdGEgJWQgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9TVFJJTkdTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HUykgKyBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTX0RBVEEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HU19EQVRBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HU19EQVRBX1RPVEFMKSk7CisKKyAgICAgICAgICAgIHByaW50ZigibnVtIGluaGVyaXRzICUzZCAoJTRkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9JTkhFUklURUQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9JTkhFUklURUQpKTsKKworICAgICAgICAgICAgcHJpbnRmKCJ0b3RhbCBzaXplICAgICAgJTZkXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUFJPR19TSVpFX1RPVEFMKSk7CisKKyAgICAgICAgICAgIHByaW50ZigiZGF0YSBzaXplICAgICAgICU2ZCAoJTZkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfREFUQV9TSVpFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0RBVEFfU0laRV9UT1RBTCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIERJTkZPX09CSkxJU1Q6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgPT0gMCkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7CisKKyAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgPT0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvYmplY3QgKiBvYnMgPSBlZnVuOjpvYmplY3RzKGFyZ3NbMF0sIDEpOworICAgICAgICAgICAgICAgIHJldHVybiBvYnNbMF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIGVmdW46Om9iamVjdHMoYXJnc1swXSwgYXJnc1sxXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRElORk9fTUFMTE9DOgorICAgICAgICAgICAgd3JpdGUoZGVidWdfaW5mbyhESU5GT19TVEFUVVMsICJtYWxsb2MiKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIERJTkZPX1NUQVRVUzoKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIHdoaWNoOworICAgICAgICAgICAgaW50IG9wdDsKKworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSA+IDEpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOworCisgICAgICAgICAgICBpZiAoIXNpemVvZihhcmdzKSB8fCAhYXJnc1swXSkKKyAgICAgICAgICAgICAgICB3aGljaCA9ICIiOworICAgICAgICAgICAgZWxzZSBpZihzdHJpbmdwKGFyZ3NbMF0pKQorICAgICAgICAgICAgICAgIHdoaWNoID0gYXJnc1swXTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOworCisgICAgICAgICAgICBzd2l0Y2god2hpY2gpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAiIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfTUVNT1JZOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgInRhYmxlcyI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX1RBQkxFUzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICJzd2FwIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfU1dBUDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICJtYWxsb2MiOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9NQUxMT0M7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAibWFsbG9jIGV4dHN0YXRzIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfTUFMTE9DX0VYVEVOREVEOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8ob3B0KTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRElORk9fRFVNUDoKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG9wdDsKKworICAgICAgICAgICAgaWYgKCFzaXplb2YoYXJncykpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOworCisgICAgICAgICAgICBpZighc3RyaW5ncChhcmdzWzBdKSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOworCisgICAgICAgICAgICBzd2l0Y2goYXJnc1swXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlICJvYmplY3RzIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRERJX09CSkVDVFM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAiZGVzdHJ1Y3RlZCI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERESV9PQkpFQ1RTX0RFU1RSVUNURUQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAib3Bjb2RlcyI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERESV9PUENPREVTOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgIm1lbW9yeSI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERESV9NRU1PUlk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiQmFkIGFyZ3VtZW50ICclcycgdG8gZGVidWdfaW5mbyhESU5GT19EVU1QKS5cbiIsIGFyZ3NbMF0pKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBlZnVuOjpkdW1wX2RyaXZlcl9pbmZvKG9wdCwgYXJnc1sxLi4xXS4uLik7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIERJTkZPX0RBVEE6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1peGVkICogcmVzdWx0OworCisgICAgICAgICAgICBpZiAoIXNpemVvZihhcmdzKSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7CisKKyAgICAgICAgICAgIGlmICghaW50cChhcmdzWzBdKSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOworCisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpID09IDIgJiYgIWludHAoYXJnc1sxXSkpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZyBhcmcgMyB0byBkZWJ1Z19pbmZvKCkuXG4iKTsKKworICAgICAgICAgICAgc3dpdGNoKGFyZ3NbMF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBESURfU1RBVFVTOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBhbGxvY2F0ZShESURfU1RBVFVTX01BWCk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BQ1RJT05TXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0FDVElPTlMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0FDVElPTlNfU0laRV0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0FDVElPTlMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NIQURPV1NdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU0hBRE9XUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU0hBRE9XU19TSVpFXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU0hBRE9XUyk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfU0laRV0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX09CSkVDVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfU1dBUFBFRF0gICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX1NXQVBfU0laRV0gICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9PQkpFQ1RTX1NXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfTElTVF0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19JTl9MSVNUKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX05FV0xZX0RFU1RdICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFNfTkVXTFlfREVTVFJVQ1RFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19ERVNUUlVDVEVEXSAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RTX0RFU1RSVUNURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfUFJPQ0VTU0VEXSAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19MQVNUX1BST0NFU1NFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19BVkdfUFJPQ10gICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX0xPQURfQVZFUkFHRV9QUk9DRVNTRURfT0JKRUNUU19SRUxBVElWRSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PVEFCTEVdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFNfSU5fVEFCTEUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09UQUJMRV9TTE9UU10gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUX1RBQkxFX1NMT1RTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PVEFCTEVfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9PQkpFQ1RfVEFCTEUpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEJFQVRfT0JKU10gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9IRUFSVEJFQVRTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQkVBVF9DQUxMU10gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVF9BQ1RJVkVfQ1lDTEVTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQkVBVF9DQUxMU19UT1RBTF0gICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVF9UT1RBTF9DWUNMRVMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hCRUFUX1NMT1RTXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSEVBUlRCRUFUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEJFQVRfU0laRV0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfSEVBUlRCRUFUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEJFQVRfUFJPQ0VTU0VEXSAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9IRUFSVEJFQVRTX0xBU1RfUFJPQ0VTU0VEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQkVBVF9BVkdfUFJPQ10gICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTE9BRF9BVkVSQUdFX1BST0NFU1NFRF9IRUFSVEJFQVRTX1JFTEFUSVZFKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0NBTExPVVRTXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fQ0FMTE9VVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0NBTExPVVRfU0laRV0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0NBTExPVVRTKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0FSUkFZU10gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fQVJSQVlTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BUlJBWVNfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9BUlJBWVMpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfTUFQUElOR1NdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NQVBQSU5HUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfTUFQUElOR1NfU0laRV0gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTUFQUElOR1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hZQlJJRF9NQVBQSU5HU10gICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUFQUElOR1NfSFlCUklEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQVNIX01BUFBJTkdTXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01BUFBJTkdTX0hBU0gpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSVUNUU10gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJVQ1RTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJVQ1RTX1NJWkVdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TVFJVQ1RTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJVQ1RfVFlQRVNdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUlVDVF9UWVBFUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSVUNUX1RZUEVTX1NJWkVdICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1RSVUNUX1RZUEVTKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BST0dTXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUFJPR1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BST0dTX1NJWkVdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1BST0dTKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BST0dTX1NXQVBQRURdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUFJPR1NfU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUFJPR1NfU1dBUF9TSVpFXSAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUFJPR1NfU1dBUFBFRCk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9VU0VSX1JFU0VSVkVdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTUVNT1JZX1JFU0VSVkVfVVNFUik7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfTUFTVEVSX1JFU0VSVkVdICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX01FTU9SWV9SRVNFUlZFX01BU1RFUik7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1lTVEVNX1JFU0VSVkVdICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX01FTU9SWV9SRVNFUlZFX1NZU1RFTSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BRERfTUVTU0FHRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FU1NBR0VTX09VVCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUEFDS0VUU10gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9QQUNLRVRTX09VVCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUEFDS0VUX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUEFDS0VUU19PVVQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BBQ0tFVFNfSU5dICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUEFDS0VUU19JTik7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUEFDS0VUX1NJWkVfSU5dICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUEFDS0VUU19JTik7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BUFBMWV0gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0ZVTkNUSU9OX05BTUVfQ0FMTFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0FQUExZX0hJVFNdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fRlVOQ1RJT05fTkFNRV9DQUxMX0hJVFMpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSSU5HU10gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9WSVJUVUFMX1NUUklOR1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUklOR19TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUklOR1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9UQUJMRV9TSVpFXSAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUklOR19UQUJMRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX09WRVJIRUFEXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1RSSU5HX09WRVJIRUFEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9VTlRBQkxFRF0gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR1NfVU5UQUJMRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1VOVEFCTEVEX1NJWkVdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUklOR1NfVU5UQUJMRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1RBQkxFRF0gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HU19UQUJMRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1RBQkxFRF9TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUklOR1NfVEFCTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfU0VBUkNIRVNdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9MT09LVVBTX0JZX0lOREVYKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfU0VBUkNITEVOXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9MT09LVVBfU1RFUFNfQllfSU5ERVgpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9TRUFSQ0hFU19CWVZBTFVFXSAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX0xPT0tVUFNfQllfVkFMVUUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9TRUFSQ0hMRU5fQllWQUxVRV0gPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX0xPT0tVUF9TVEVQU19CWV9WQUxVRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX0NIQUlOU10gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfU0xPVFNfVVNFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX0FEREVEXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfU1RSSU5HU19BRERFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX0RFTEVURURdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfU1RSSU5HU19SRU1PVkVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfQ09MTElTSU9OU10gICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9DT0xMSVNJT05TKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfRk9VTkRdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9ISVRTX0JZX0lOREVYKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfRk9VTkRfQllWQUxVRV0gICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9ISVRTX0JZX1ZBTFVFKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1JYX0NBQ0hFRF0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUkVHRVgpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1JYX1RBQkxFXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUkVHRVhfVEFCTEVfU0xPVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1JYX1RBQkxFX1NJWkVdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1JFR0VYKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9SWF9SRVFVRVNUU10gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1JFR0VYX0xPT0tVUFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1JYX1JFUV9GT1VORF0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUkVHRVhfTE9PS1VQX0hJVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1JYX1JFUV9DT0xMXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUkVHRVhfTE9PS1VQX0NPTExJU0lPTlMpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfTUJfRklMRV0gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfQlVGRkVSX0ZJTEUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX01CX1NXQVBdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0JVRkZFUl9TV0FQKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0JPT1RfVElNRV0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9CT09UX1RJTUUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgRElEX1NXQVA6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGFsbG9jYXRlKERJRF9TV0FQX01BWCk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19QUk9HU10gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1BST0dTX1NXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1BST0dfU0laRV0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1BST0dTX1NXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1BST0dfVU5TV0FQUEVEXSAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUFJPR1NfVU5TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19QUk9HX1VfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9QUk9HU19VTlNXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1ZBUlNdICAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19WQVJfU0laRV0gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9PQkpFQ1RTX1NXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX0ZSRUVdICAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1dBUF9CTE9DS1NfRlJFRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfRlJFRV9TSVpFXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1dBUF9CTE9DS1NfRlJFRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfRklMRV9TSVpFXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1dBUF9CTE9DS1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1JFVVNFRF0gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NXQVBfQkxPQ0tTX1JFVVNFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfU0VBUkNIRVNdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TV0FQX0JMT0NLU19SRVVTRV9MT09LVVBTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19TRUFSQ0hfTEVOXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NXQVBfQkxPQ0tTX1JFVVNFX0xPT0tVUF9TVEVQUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfRl9TRUFSQ0hFU10gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TV0FQX0JMT0NLU19GUkVFX0xPT0tVUFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX0ZfU0VBUkNIX0xFTl0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1dBUF9CTE9DS1NfRlJFRV9MT09LVVBfU1RFUFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX0NPTVBBQ1RdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhEQ19TV0FQX0NPTVBBQ1RfTU9ERSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfUkVDWUNMRV9GUkVFXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NXQVBfUkVDWUNMRV9QSEFTRSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBESURfTUVNT1JZOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBhbGxvY2F0ZShESURfTUVNT1JZX01BWCk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTkFNRV0gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTUVNT1JZX0FMTE9DQVRPUl9OQU1FKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU0JSS10gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NZU19BTExPQ0FURURfQkxPQ0tTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU0JSS19TSVpFXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TWVNfQUxMT0NBVEVEX0JMT0NLUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0xBUkdFXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9MQVJHRV9CTE9DS1NfQUxMT0NBVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTEFSR0VfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9MQVJHRV9CTE9DS1NfQUxMT0NBVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTEZSRUVdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0xBUkdFX0JMT0NLU19GUkVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTEZSRUVfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9MQVJHRV9CTE9DS1NfRlJFRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0xXQVNURURdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9MQVJHRV9CTE9DS1NfV0FTVEUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9MV0FTVEVEX1NJWkVdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0xBUkdFX0JMT0NLU19XQVNURSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0NIVU5LXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TTUFMTF9CTE9DS19DSFVOS1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9DSFVOS19TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NNQUxMX0JMT0NLX0NIVU5LUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NNQUxMXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TTUFMTF9CTE9DS1NfQUxMT0NBVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU01BTExfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TTUFMTF9CTE9DS1NfQUxMT0NBVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU0ZSRUVdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NNQUxMX0JMT0NLU19GUkVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU0ZSRUVfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TTUFMTF9CTE9DS1NfRlJFRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NXQVNURURdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TTUFMTF9CTE9DS1NfV0FTVEUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9TV0FTVEVEX1NJWkVdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NNQUxMX0JMT0NLU19XQVNURSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX01JTkNfQ0FMTFNdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9JTkNSRU1FTlRfU0laRV9DQUxMUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX01JTkNfU1VDQ0VTU10gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9JTkNSRU1FTlRfU0laRV9DQUxMX1NVQ0NFU1NFUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX01JTkNfU0laRV0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfSU5DUkVNRU5UX1NJWkVfQ0FMTF9ESUZGUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1BFUk1dICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9VTk1BTkFHRURfQkxPQ0tTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fUEVSTV9TSVpFXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9VTk1BTkFHRURfQkxPQ0tTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fQ0xJQl0gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1JFUExBQ0VNRU5UX01BTExPQ19DQUxMUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0NMSUJfU0laRV0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUkVQTEFDRU1FTlRfTUFMTE9DX0NBTExTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fT1ZFUkhFQURdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TTUFMTF9CTE9DS19PVkVSSEVBRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0FMTE9DQVRFRF0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTUVNT1JZX1VTRUQpICsgZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9NRU1PUllfT1ZFUkhFQUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9VU0VEXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX01FTU9SWV9VU0VEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fVE9UQUxfVU5VU0VEXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9NRU1PUllfVU5VU0VEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fREVGUkFHX0NBTExTXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQ0FMTFNfRlVMTCkgKyBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVNT1JZX0RFRlJBR01FTlRBVElPTl9DQUxMU19UQVJHRVRFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0RFRlJBR19DQUxMU19SRVFdICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRU1PUllfREVGUkFHTUVOVEFUSU9OX0NBTExTX1RBUkdFVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fREVGUkFHX1JFUV9TVUNDRVNTXSAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQ0FMTF9UQVJHRVRfSElUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0RFRlJBR19CTE9DS1NfSU5TUEVDVEVEXSA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRU1PUllfREVGUkFHTUVOVEFUSU9OX0JMT0NLU19JTlNQRUNURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9ERUZSQUdfQkxPQ0tTX01FUkdFRF0gPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVNT1JZX0RFRlJBR01FTlRBVElPTl9CTE9DS1NfTUVSR0VEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fREVGUkFHX0JMT0NLU19SRVNVTFRdID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQkxPQ0tTX1JFU1VMVElORyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0FWTF9OT0RFU10gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9GUkVFX0JMT0NLU19BVkxfTk9ERVMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9FWFRfU1RBVElTVElDU10gICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9NRU1PUllfRVhURU5ERURfU1RBVElTVElDUyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpID09IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGlkeCA9IGFyZ3NbMF07CisgICAgICAgICAgICAgICAgaWYgKGlkeCA8IDAgfHwgaWR4ID49IHNpemVvZihyZXN1bHQpKQorICAgICAgICAgICAgICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJJbGxlZ2FsIGluZGV4IGZvciBkZWJ1Z19pbmZvKCk6ICVkLCBleHBlY3RlZCAwLi4lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlkeCwgc2l6ZW9mKHJlc3VsdCktMSkpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFtpZHhdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIERJTkZPX1RSQUNFOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgd2hpY2ggPSBESVRfQ1VSUkVOVDsKKworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSA+IDEpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWludHAoYXJnc1swXSkpCisgICAgICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWcgYXJnIDIgdG8gZGVidWdfaW5mbygpLlxuIik7CisgICAgICAgICAgICAgICAgd2hpY2ggPSBhcmdzWzBdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHdoaWNoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgRElUX0NVUlJFTlQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9UUkFDRV9DVVJSRU5UKTsKKworICAgICAgICAgICAgICAgIGNhc2UgRElUX0VSUk9SOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfVFJBQ0VfTEFTVF9FUlJPUikgfHwgKHsgIk5vIHRyYWNlLiIgfSk7CisKKyAgICAgICAgICAgICAgICBjYXNlIERJVF9VTkNBVUdIVF9FUlJPUjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKERJX1RSQUNFX0xBU1RfVU5DQVVHSFRfRVJST1IpIHx8ICh7ICJObyB0cmFjZS4iIH0pOworCisgICAgICAgICAgICAgICAgY2FzZSBESVRfU1RSX0NVUlJFTlQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9UUkFDRV9DVVJSRU5UX0FTX1NUUklORyk7CisKKyAgICAgICAgICAgICAgICBjYXNlIERJVF9DVVJSRU5UX0RFUFRIOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfVFJBQ0VfQ1VSUkVOVF9ERVBUSCk7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBjYXNlIERJTkZPX0VWQUxfTlVNQkVSOgorICAgICAgICAgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKERJX0VWQUxfTlVNQkVSKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvZW5hYmxlX2NvbW1hbmRzLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9lbmFibGVfY29tbWFuZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDFjOTYzCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvZW5hYmxlX2NvbW1hbmRzLmMKQEAgLTAsMCArMSwzMCBAQAorLyogVGhlc2Ugc2VmdW5zIGFyZSB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVucyBlbmFibGVfY29tbWFuZHMoKQorICogYW5kIGRpc2FibGVfY29tbWFuZHMoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpbmNsdWRlIDxjb25maWd1cmF0aW9uLmg+CisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18oZW5hYmxlX2NvbW1hbmRzKQorCit2b2lkIGVuYWJsZV9jb21tYW5kcygpCit7CisgICAgb2JqZWN0IG9iID0gZWZ1bjo6cHJldmlvdXNfb2JqZWN0KCk7CisKKyAgICBlZnVuOjpjb25maWd1cmVfb2JqZWN0KG9iLCBPQ19DT01NQU5EU19FTkFCTEVELCAxKTsKKyAgICBlZnVuOjpzZXRfdGhpc19wbGF5ZXIob2IpOworfQorCisjZW5kaWYKKworI2lmICEgX19FRlVOX0RFRklORURfXyhkaXNhYmxlX2NvbW1hbmRzKQorCit2b2lkIGRpc2FibGVfY29tbWFuZHMoKQoreworICAgIG9iamVjdCBvYiA9IGVmdW46OnByZXZpb3VzX29iamVjdCgpOworCisgICAgZWZ1bjo6Y29uZmlndXJlX29iamVjdChvYiwgT0NfQ09NTUFORFNfRU5BQkxFRCwgMCk7CisgICAgZWZ1bjo6c2V0X3RoaXNfcGxheWVyKDApOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL2hhc2guYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL2hhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWJiZjYwCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvaGFzaC5jCkBAIC0wLDAgKzEsMTcgQEAKKyNpbmNsdWRlICIvc3lzL3Rscy5oIgorCitkZXByZWNhdGVkIHN0cmluZyBtZDUobWl4ZWQgYXJnLCB2YXJhcmdzIG1peGVkKiBpdGVyYXRpb25zKQoreworICAgIGlmIChleHRlcm5fY2FsbCgpKQorICAgICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKworICAgIHJldHVybiBoYXNoKFRMU19IQVNIX01ENSwgYXJnLCBpdGVyYXRpb25zLi4uKTsKK30KKworZGVwcmVjYXRlZCBzdHJpbmcgc2hhMShtaXhlZCBhcmcsIHZhcmFyZ3MgbWl4ZWQqIGl0ZXJhdGlvbnMpCit7CisgICAgaWYgKGV4dGVybl9jYWxsKCkpCisgICAgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworCisgICAgcmV0dXJuIGhhc2goVExTX0hBU0hfU0hBMSwgYXJnLCBpdGVyYXRpb25zLi4uKTsKK30KZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL2xpdmluZ3MuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL2xpdmluZ3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjBmY2VlCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvbGl2aW5ncy5jCkBAIC0wLDAgKzEsMzQ4IEBACisvLyAqIGxpdmluZ19uYW1lLUJlaGFuZGx1bmcKKworI2RlZmluZSBjbGVhbl9sb2cocykKKy8vI2RlZmluZSBjbGVhbl9sb2cocykgbG9nX2ZpbGUoIkNMRUFOX1NJTSIsY3RpbWUodGltZSgpKVs0Li4xOF0rIjogIisocykpOworCitwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIGxpdmluZ19uYW1lX20sIG5hbWVfbGl2aW5nX20sIG5ldGRlYWQ7CisKK3ByaXZhdGUgdm9pZCBJbml0TGl2aW5nRGF0YShtaXhlZCB3aXppbmZvKSB7CisgIC8vIGxpdmluZ19uYW1lIGlzdCBlaW4gUG9pbnRlciBkZXIgYXVjaCBpbiBkZXIgZXh0cmFfd2l6aW5mbyBnZWhhbHRlbiAKKyAgLy8gd2lyZCwgc28ga2FubiBkaWUgc2ltdWxfZWZ1biBuZXUgZ2VsYWRlbiB3ZXJkZW4sIG9obmUgZGFzcyBkaWVzZXMKKyAgLy8gTWFwcGluZyB2ZXJsb3JlbiBnZWh0CisgIGlmICghbWFwcGluZ3AobGl2aW5nX25hbWVfbSA9IHdpemluZm9bTElWSU5HX05BTUVdKSkKKyAgICBsaXZpbmdfbmFtZV9tID0gd2l6aW5mb1tMSVZJTkdfTkFNRV0gPSBtX2FsbG9jYXRlKDAsIDEpOworCisgIC8vIEdsZWljaGVzIGdpbHQgZnVlciBkYXMgTWFwcGluZyBOYW1lLUxpdmluZworICBpZiAoIW1hcHBpbmdwKG5hbWVfbGl2aW5nX20gPSB3aXppbmZvW05BTUVfTElWSU5HXSkpCisgICAgbmFtZV9saXZpbmdfbSA9IHdpemluZm9bTkFNRV9MSVZJTkddID0gbV9hbGxvY2F0ZSgwLCAxKTsKKworICAvLyBOZXR6dG90ZSBzaW5kIGViZW5mYWxscyBpbiBkZXIgZXh0cmFfd2l6aW5mbworICBpZiAoIW1hcHBpbmdwKG5ldGRlYWQgPSB3aXppbmZvW05FVERFQURfTUFQXSkpCisgICAgbmV0ZGVhZCA9IHdpemluZm9bTkVUREVBRF9NQVBdID0gKFtdKTsKK30KKworcHVibGljIHZhcmFyZ3Mgc3RyaW5nIGdldHV1aWQoIG9iamVjdCBvYiApCit7CisgICAgbWl4ZWQgKnJldDsKKworICAgIGlmICggIW9iamVjdHAob2IpICkKKyAgICAgICBvYiA9IHByZXZpb3VzX29iamVjdCgpOworCisgICAgaWYgKCAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYikgKQorICAgICAgIHJldHVybiBnZXR1aWQob2IpOworCisgICAgcmV0ID0gKG1peGVkKW1hc3RlcigpLT5nZXRfdXNlcmluZm8oIGdldHVpZChvYikgKTsKKworICAgIGlmICggIXBvaW50ZXJwKHJldCkgfHwgc2l6ZW9mKHJldCkgPCA1ICkKKyAgICAgICByZXR1cm4gZ2V0dWlkKG9iKTsKKworICAgIC8vIFVzZXJuYW1lICsgIl8iICsgQ3JlYXRpb25EYXRlCisgICAgcmV0dXJuIHJldFswXSArICJfIiArIHJldFs1XTsKK30KKwordm9pZCBzZXRfb2JqZWN0X2xpdmluZ19uYW1lKHN0cmluZyBsaXZuYW1lLCBvYmplY3Qgb2JqKQoreworICBzdHJpbmcgb2xkOworICBtaXhlZCBhOworICBpbnQgaTsKKworICBpZiAocHJldmlvdXNfb2JqZWN0KCk9PW9iaiB8fCBwcmV2aW91c19vYmplY3QoKT09dGhpc19vYmplY3QoKSB8fAorICAgICAgcHJldmlvdXNfb2JqZWN0KCk9PW1hc3RlcigpKQorICB7CisgICAgaWYoIWxpdm5hbWUgfHwgIXN0cmluZ3AobGl2bmFtZSkpIHsKKyAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCIlTzogaWxsZWdhbCBsaXZpbmcgbmFtZTogJU9cbiIsIG9iaiwgbGl2bmFtZSkpOworICAgIH0KKyAgICBpZiAob2xkID0gbGl2aW5nX25hbWVfbVtvYmpdKSB7CisgICAgICBpZiAocG9pbnRlcnAoYSA9IG5hbWVfbGl2aW5nX21bb2xkXSkpIHsKKyAgICAgICBhW21lbWJlcihhLCBvYmopXSA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgIG1fZGVsZXRlKG5hbWVfbGl2aW5nX20sIG9sZCk7CisgICAgICB9CisgICAgfQorICAgIGxpdmluZ19uYW1lX21bb2JqXSA9IGxpdm5hbWU7CisgICAgaWYgKGEgPSBuYW1lX2xpdmluZ19tW2xpdm5hbWVdKSB7CisgICAgICBpZiAoIXBvaW50ZXJwKGEpKSB7CisgICAgICAgbmFtZV9saXZpbmdfbVtsaXZuYW1lXSA9ICh7YSwgb2JqfSk7CisgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgLyogVHJ5IHRvIHJlYWxsb2NhdGUgZW50cnkgZnJvbSBkZXN0cnVjdGVkIG9iamVjdCAqLworICAgICAgaWYgKChpID0gbWVtYmVyKGEsIDApKSA+PSAwKSB7CisgICAgICAgYVtpXSA9IG9iajsKKyAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBuYW1lX2xpdmluZ19tW2xpdm5hbWVdID0gYSArICh7b2JqfSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIG5hbWVfbGl2aW5nX21bbGl2bmFtZV0gPSBvYmo7CisgIH0KK30KKwordm9pZCBzZXRfbGl2aW5nX25hbWUoc3RyaW5nIGxpdm5hbWUpCit7CisgIHNldF9vYmplY3RfbGl2aW5nX25hbWUobGl2bmFtZSxwcmV2aW91c19vYmplY3QoKSk7Cit9CisKK3ZvaWQgcmVtb3ZlX2xpdmluZ19uYW1lKCkKK3sKKyAgc3RyaW5nIGxpdm5hbWU7CisKKyAgaWYgKCFwcmV2aW91c19vYmplY3QoKSkKKyAgICByZXR1cm47CisgIGlmIChsaXZuYW1lPWxpdmluZ19uYW1lX21bcHJldmlvdXNfb2JqZWN0KCldKQorICB7CisgICAgbV9kZWxldGUobGl2aW5nX25hbWVfbSxwcmV2aW91c19vYmplY3QoKSk7CisgICAgaWYgKG9iamVjdHAobmFtZV9saXZpbmdfbVtsaXZuYW1lXSkpCisgICAgeworICAgICAgaWYgKG5hbWVfbGl2aW5nX21bbGl2bmFtZV09PXByZXZpb3VzX29iamVjdCgpKQorICAgICAgIG1fZGVsZXRlKG5hbWVfbGl2aW5nX20sbGl2bmFtZSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChwb2ludGVycChuYW1lX2xpdmluZ19tW2xpdm5hbWVdKSkKKyAgICB7CisgICAgICBuYW1lX2xpdmluZ19tW2xpdm5hbWVdLT0oe3ByZXZpb3VzX29iamVjdCgpfSk7CisgICAgICBpZiAoIXNpemVvZihuYW1lX2xpdmluZ19tW2xpdm5hbWVdKSkKKyAgICAgICBtX2RlbGV0ZShuYW1lX2xpdmluZ19tLGxpdm5hbWUpOworICAgIH0KKyAgfQorfQorCit2b2lkIF9zZXRfbmV0ZGVhZCgpCit7CisgIGlmIChxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHByZXZpb3VzX29iamVjdCgpKSkKKyAgICBuZXRkZWFkW2dldHVpZChwcmV2aW91c19vYmplY3QoKSldPXByZXZpb3VzX29iamVjdCgpOworfQorCit2b2lkIF9yZW1vdmVfbmV0ZGVhZCgpCit7CisgIG1fZGVsZXRlKG5ldGRlYWQsZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKSk7Cit9CisKK29iamVjdCBmaW5kX25ldGRlYWQoc3RyaW5nIHV1aWQpCit7CisgIGludCBpOworICBzdHJpbmcgdWlkOworICAvLyBXZW5uIHNzY2FuZigpIDIgbGllZmVydCwgaXN0IHV1aWQgYXVjaCBuZSB1dWlkLgorICBpbnQgaXNfdXVpZCA9IHNzY2FuZih1dWlkLCAiJXNfJWQiLCB1aWQsIGkpID09IDI7CisgIGlmICghaXNfdXVpZCkKKyAgICB1aWQgPSB1dWlkOworIAorICBpZiAoaXNfdXVpZCAmJiBnZXR1dWlkKG5ldGRlYWRbdWlkXSkgIT0gdXVpZCkKKyAgICAgIHJldHVybiAwOworCisgIHJldHVybiBuZXRkZWFkW3VpZF07Cit9CisKK3N0cmluZyAqZHVtcF9uZXRkZWFkKCkKK3sKKyAgcmV0dXJuIG1faW5kaWNlcyhuZXRkZWFkKTsKK30KKworb2JqZWN0IGZpbmRfbGl2aW5nKHN0cmluZyBsaXZuYW1lKSB7CisgIG1peGVkICphLCByOworICBpbnQgaTsKKworICBpZiAocG9pbnRlcnAociA9IG5hbWVfbGl2aW5nX21bbGl2bmFtZV0pKSB7CisgICAgaWYgKG1lbWJlcihyLDApPj0wKQorICAgICAgci09KHswfSk7CisgICAgaWYgKCFzaXplb2YocikpeworICAgICAgbV9kZWxldGUobmFtZV9saXZpbmdfbSxsaXZuYW1lKTsKKyAgICAgIGNsZWFuX2xvZyhzcHJpbnRmKCJmaW5kX2xpdmluZyBsb2VzY2h0ICVzXG4iLGxpdm5hbWUpKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoICFsaXZpbmcociA9IChhID0gcilbMF0pKSB7CisgICAgICBmb3IgKGkgPSBzaXplb2YoYSk7IC0taTspIHsKKyAgICAgICBpZiAobGl2aW5nKGFbPGldKSkgeworICAgICAgICAgciA9IGFbPGldOworICAgICAgICAgYVs8aV0gPSBhWzBdOworICAgICAgICAgcmV0dXJuIGFbMF0gPSByOworICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHI7CisgIH0KKyAgcmV0dXJuIGxpdmluZyhyKSAmJiByOworfQorCitvYmplY3QgKmZpbmRfbGl2aW5ncyhzdHJpbmcgbGl2bmFtZSkKK3sKKyAgbWl4ZWQgcjsKKworICBpZiAocG9pbnRlcnAocj1uYW1lX2xpdmluZ19tW2xpdm5hbWVdKSkKKyAgICByLT0oezB9KTsKKyAgZWxzZQorICAgIGlmIChvYmplY3RwKHIpKQorICAgICAgcj0oe3J9KTsKKyAgaWYgKCFwb2ludGVycChyKXx8IXNpemVvZihyKSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIHI7Cit9CisKK29iamVjdCBmaW5kX3BsYXllcihzdHJpbmcgdXVpZCkgeworICBvYmplY3QgKm9ianM7CisgIG1peGVkIHJlczsKKyAgaW50IGk7CisgIHN0cmluZyB1aWQ7CisKKyAgaWYgKCFzdHJpbmdwKHV1aWQpKQorICAgIHJldHVybiAwOworICAvLyBXZW5uIHNzY2FuZigpIDIgbGllZmVydCwgaXN0IHV1aWQgYXVjaCBuZSB1dWlkLgorICBpbnQgaXNfdXVpZCA9IHNzY2FuZih1dWlkLCAiJXNfJWQiLCB1aWQsIGkpID09IDI7CisgIGlmICghaXNfdXVpZCkKKyAgICB1aWQgPSB1dWlkOworCisgIGlmIChwb2ludGVycChyZXMgPSBuYW1lX2xpdmluZ19tW3VpZF0pKSB7CisgICAgLy8gemVyc3RvZXJ0ZSBPYmpla3RlIGdnZi4gZW50ZmVybmVuCisgICAgaWYgKG1lbWJlcihyZXMsMCk+PTApIHsKKyAgICAgIHJlcy09KHswfSk7CisgICAgICBuYW1lX2xpdmluZ19tW3VpZF0gPSByZXM7CisgICAgfQorICAgIC8vIGdnZi4gTmFtZW4gb2huZSBPYmpla3RlIGVudGZlcm5lbi4KKyAgICBpZiAoIXNpemVvZihyZXMpKXsKKyAgICAgIG1fZGVsZXRlKG5hbWVfbGl2aW5nX20sdWlkKTsKKyAgICAgIGNsZWFuX2xvZyhzcHJpbnRmKCJmaW5kX3BsYXllciBsb2VzY2h0ICVzXG4iLHVpZCkpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIG9ianMgPSByZXM7CisgICAgcmVzID0gb2Jqc1swXTsKKyAgICAvLyBXZW5uIGRhcyAwLiBFbGVtZW50IGRlciBTcGllbGVyIGlzdCwgc2luZCB3aXIgZmVydGlnLiBBbnNvbnN0ZW4gc3VjaGVuCisgICAgLy8gd2lyIGRlbiBTcGllbGVyIHVuZCBzY2hpZWJlbiBpaG4gYW4gZGllIDAuIFN0ZWxsZSBpbSBBcnJheS4KKyAgICBpZiAoICFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHJlcykpIHsKKyAgICAgIGZvciAoaSA9IHNpemVvZihvYmpzKTsgLS1pOykgeworICAgICAgIGlmIChvYmpzWzxpXSAmJiBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9ianNbPGldKSkgeworICAgICAgICAgcmVzID0gb2Jqc1s8aV07CisgICAgICAgICBvYmpzWzxpXSA9IG9ianNbMF07CisgICAgICAgICBvYmpzWzBdID0gcmVzOworICAgICAgICAgYnJlYWs7CisgICAgICAgfQorICAgICAgfQorICAgICAgcmVzID0gKG9iamVjdHAocmVzKSAmJiBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHJlcykpID8gcmVzIDogMDsKKyAgICB9CisgICAgLy8gZWxzZTogaW4gcmVzIHN0ZWh0IGRlciBTcGllbGVyIHNjaG9uLgorICB9CisgIGVsc2UgaWYgKG9iamVjdHAocmVzKSkgLy8gciBpc3QgbmVuIEVpbnplbG9iamVrdAorICAgIHJlcyA9IHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUocmVzKSA/IHJlcyA6IDA7CisKKyAgLy8gcmVzIGlzdCBqZXR6dCBnZ2YuIGRlciBTcGllbGVyLiBBYmVyIHdlbm4gZGVyIG5lIGFuZGVyZSBhbHMgZGllIGdlc3VjaHRlCisgIC8vIFVVSUQgaGF0LCBpc3QgZGFzIEVyZ2VibmlzIHRyb3R6ZGVtIDAuCisgIGlmIChpc191dWlkICYmIGdldHV1aWQocmVzKSE9dXVpZCkKKyAgICAgIHJldHVybiAwOworCisgIC8vIGVuZGxpY2ggZ2VmdW5kZW4KKyAgcmV0dXJuIHJlczsKK30KKworcHJpdmF0ZSBpbnQgY2hlY2tfbWF0Y2goIHN0cmluZyBzdHIsIGludCBwbGF5ZXJzX29ubHkgKQoreworICAgIG1peGVkIG1hdGNoOworCisgICAgaWYgKCAhKG1hdGNoID0gbmFtZV9saXZpbmdfbVtzdHJdKSApCisgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoICFwb2ludGVycChtYXRjaCkgKQorICAgICAgIG1hdGNoID0gKHsgbWF0Y2ggfSk7CisKKyAgICBtYXRjaCAtPSAoezB9KTsKKworICAgIGlmICggc2l6ZW9mKG1hdGNoKSApeworICAgICAgIGlmICggcGxheWVyc19vbmx5ICkKKyAgICAgICAgICAgcmV0dXJuIHNpemVvZihmaWx0ZXIoIG1hdGNoLCAjJ3F1ZXJ5X29uY2VfaW50ZXJhY3RpdmUvKicqLyApKQorICAgICAgICAgICAgICA+IDA7CisgICAgICAgZWxzZQorICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBtX2RlbGV0ZSggbmFtZV9saXZpbmdfbSwgc3RyICk7CisgICAgY2xlYW5fbG9nKCBzcHJpbnRmKCJjaGVja19tYXRjaCBsb2VzY2h0ICVzXG4iLCBzdHIpICk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8vVE9ETzo6IHN0cmluZ3xzdHJpbmcqIGV4Y2x1ZGUKK3ZhcmFyZ3MgbWl4ZWQgbWF0Y2hfbGl2aW5nKCBzdHJpbmcgc3RyLCBpbnQgcGxheWVyc19vbmx5LCBtaXhlZCBleGNsdWRlICkKK3sKKyAgICBpbnQgaSwgczsKKyAgICBtaXhlZCBtYXRjaCwgKnVzZXI7CisKKyAgICBpZiAoICFzdHIgfHwgc3RyID09ICIiICkKKyAgICAgICByZXR1cm4gMDsKKworICAgIGlmICggIXBvaW50ZXJwKGV4Y2x1ZGUpICkKKyAgICAgICBleGNsdWRlID0gKHsgZXhjbHVkZSB9KTsKKworICAgIGlmICggbWVtYmVyKGV4Y2x1ZGUsIHN0cikgPCAwICYmIGNoZWNrX21hdGNoKHN0ciwgcGxheWVyc19vbmx5KSApCisgICAgICAgcmV0dXJuIHN0cjsKKworICAgIHVzZXIgPSBtX2luZGljZXMobmFtZV9saXZpbmdfbSk7CisgICAgcyA9IHNpemVvZihzdHIpOworICAgIG1hdGNoID0gMDsKKworICAgIGZvciAoIGkgPSBzaXplb2YodXNlcik7IGktLTsgKQorICAgICAgIGlmICggc3RyID09IHVzZXJbaV1bMC4ucy0xXSAmJiBtZW1iZXIoIGV4Y2x1ZGUsIHVzZXJbaV0gKSA8IDAgKQorICAgICAgICAgICBpZiAoIG1hdGNoICkKKyAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGlmICggY2hlY2tfbWF0Y2godXNlcltpXSwgcGxheWVyc19vbmx5KSApCisgICAgICAgICAgICAgICAgICBtYXRjaCA9IHVzZXJbaV07CisKKyAgICBpZiAoICFtYXRjaCApCisgICAgICAgcmV0dXJuIC0yOworCisgICAgcmV0dXJuIG1hdGNoOworfQorCittaXhlZCAqZHVtcF9saXZpbmdzKCkKK3sKKyAgcmV0dXJuIHNvcnRfYXJyYXkobV9pbmRpY2VzKG5hbWVfbGl2aW5nX20pLCMnPik7Cit9CisKKy8vICogcmVnZWxtYWVzc2lnIExpc3RlbiB2b24gQmFsbGFzdCBiZWZyZWllbgorcHJpdmF0ZSB2b2lkIGNsZWFuX25hbWVfbGl2aW5nX20oc3RyaW5nICprZXlzLCBpbnQgbGVmdCwgaW50IG51bSkKK3sKKyAgaW50IGksIGo7CisgIG1peGVkIGE7CisKKyAgd2hpbGUgKGxlZnQgJiYgbnVtLS0pCisgIHsKKyAgICBpZiAocG9pbnRlcnAoYSA9IG5hbWVfbGl2aW5nX21ba2V5c1stLWxlZnRdXSkgJiYgbWVtYmVyKGEsIDApPj0wKQorICAgIHsKKyAgICAgIGEtPSh7MH0pOworICAgICAgbmFtZV9saXZpbmdfbVtrZXlzW2xlZnRdXSA9IGE7CisgICAgfQorICAgIGlmICghYSB8fCAocG9pbnRlcnAoYSkgJiYgIXNpemVvZihhKSkpCisgICAgeworICAgICAgY2xlYW5fbG9nKCJUb2FzdGluZyAiK2tleXNbbGVmdF0rIlxuIik7CisgICAgICBtX2RlbGV0ZShuYW1lX2xpdmluZ19tLCBrZXlzW2xlZnRdKTsKKyAgICB9IGVsc2UgY2xlYW5fbG9nKHNwcmludGYoIktFRVBJTkcgJXMgKCVPKVxuIixrZXlzW2xlZnRdLHBvaW50ZXJwKGEpP3NpemVvZihhKTphKSk7CisgIH0KKyAgaWYgKGxlZnQpCisgICAgZWZ1bjo6Y2FsbF9vdXQoIydjbGVhbl9uYW1lX2xpdmluZ19tLCAxLCBrZXlzLCBsZWZ0LCA4MCk7CisgIGVsc2UKKyAgICBjbGVhbl9sb2coIkNsZWFuIHByb2Nlc3MgZmluaXNoZWRcbiIpOworfQorCitwcml2YXRlIHZvaWQgY2xlYW5fbmV0ZGVhZCgpIHsKKyAgaW50IGk7CisgIHN0cmluZyAqczsKKyAgb2JqZWN0IG9iOworCisgIHM9bV9pbmRpY2VzKG5ldGRlYWQpOworICBmb3IgKGk9c2l6ZW9mKHMpLTE7aT49MDtpLS0pCisgICAgaWYgKCFvYmplY3RwKG9iPW5ldGRlYWRbc1tpXV0pIHx8IGludGVyYWN0aXZlKG9iKSkKKyAgICAgIG1fZGVsZXRlKG5ldGRlYWQsc1tpXSk7Cit9CisKK3ByaXZhdGUgdm9pZCBDbGVhbkxpdmluZ0RhdGEoKSB7CisgIGlmIChmaW5kX2NhbGxfb3V0KCMnY2xlYW5fbmFtZV9saXZpbmdfbSkgPCAwKSB7CisgICAgY2xlYW5fbG9nKCJTdGFydGluZyBjbGVhbiBwcm9jZXNzXG4iKTsKKyAgICBlZnVuOjpjYWxsX291dCgjJ2NsZWFuX25hbWVfbGl2aW5nX20sCisgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgIG1faW5kaWNlcyhuYW1lX2xpdmluZ19tKSwKKyAgICAgICAgICAgICAgICAgc2l6ZW9mKG5hbWVfbGl2aW5nX20pLAorICAgICAgICAgICAgICAgICA4MAorICAgICAgICAgICAgICAgICApOworICB9CisgIGVmdW46OmNhbGxfb3V0KCMnY2xlYW5fbmV0ZGVhZCwyKTsKK30KKworI3VuZGVmIGNsZWFuX2xvZworCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9vYmplY3RfaW5mby5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvb2JqZWN0X2luZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDdjMDA5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvb2JqZWN0X2luZm8uYwpAQCAtMCwwICsxLDEwNiBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIHRoZSBvbGQgc2VtYW50aWNzIG9mIHRoZSBlZnVuIG9iamVjdF9pbmZvKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgX19FRlVOX0RFRklORURfXyhkcml2ZXJfaW5mbykgLyogTmV3ZXIgdmVyc2lvbiBpcyB0aGVyZSAqLworCisjaW5jbHVkZSA8b2JqZWN0aW5mby5oPgorI2luY2x1ZGUgPG9iamVjdF9pbmZvLmg+CisKK21peGVkIG9iamVjdF9pbmZvKG9iamVjdCBvYiwgaW50IHdoYXQsIHZhcmFyZ3MgaW50KiBpbmRleCkKK3sKKyAgICBtaXhlZCAqIHJlc3VsdDsKKworICAgIGlmIChzaXplb2YoaW5kZXgpID4gMSkKKyAgICAgICAgcmFpc2VfZXJyb3IoIlRvbyBtYW55IGFyZ3VtZW50cyB0byBvYmplY3RfaW5mb1xuIik7CisKKyAgICBzd2l0Y2god2hhdCkKKyAgICB7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJJbGxlZ2FsIHZhbHVlICVkIGZvciBvYmplY3RfaW5mbygpLlxuIiwgd2hhdCkpOworCisgICAgICAgIGNhc2UgT0lORk9fQkFTSUM6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGFsbG9jYXRlKE9JQl9NQVgpOworCisgICAgICAgICAgICByZXN1bHRbT0lCX0hFQVJUX0JFQVRdICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPQ19IRUFSVF9CRUFUKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfSVNfV0laQVJEXSAgICAgICAgID0gMDsgICAvKiBOb3Qgc3VwcG9ydGVkIGFueW1vcmUuICovCisgICAgICAgICAgICByZXN1bHRbT0lCX0VOQUJMRV9DT01NQU5EU10gICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPQ19DT01NQU5EU19FTkFCTEVEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfQ0xPTkVdICAgICAgICAgICAgID0gZWZ1bjo6Y2xvbmVwKG9iKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfREVTVFJVQ1RFRF0gICAgICAgID0gMDsgICAvKiBOb3QgcG9zc2libGUgYW55bW9yZS4gKi8KKyAgICAgICAgICAgIHJlc3VsdFtPSUJfU1dBUFBFRF0gICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NXQVBQRUQpOworICAgICAgICAgICAgcmVzdWx0W09JQl9PTkNFX0lOVEVSQUNUSVZFXSAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT05DRV9JTlRFUkFDVElWRSk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1JFU0VUX1NUQVRFXSAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9SRVNFVF9TVEFURSk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1dJTExfQ0xFQU5fVVBdICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9XSUxMX0NMRUFOX1VQKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfTEFNQkRBX1JFRkVSRU5DRURdID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0xBTUJEQV9SRUZFUkVOQ0VEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfU0hBRE9XXSAgICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NIQURPV19QUkVWKSAmJiAxOworICAgICAgICAgICAgcmVzdWx0W09JQl9SRVBMQUNFRF0gICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUkVQTEFDRUQpOworICAgICAgICAgICAgcmVzdWx0W09JQl9ORVhUX1JFU0VUXSAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTkVYVF9SRVNFVF9USU1FKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfVElNRV9PRl9SRUZdICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0xBU1RfUkVGX1RJTUUpOworICAgICAgICAgICAgcmVzdWx0W09JQl9SRUZdICAgICAgICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX1JFRlMpOworICAgICAgICAgICAgcmVzdWx0W09JQl9HSUdBVElDS1NdICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfR0lHQVRJQ0tTKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfVElDS1NdICAgICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1RJQ0tTKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfU1dBUF9OVU1dICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NXQVBfTlVNKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfUFJPR19TV0FQUEVEXSAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1BST0dfU1dBUFBFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1ZBUl9TV0FQUEVEXSAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9WQVJfU1dBUFBFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lCX05BTUVdICAgICAgICAgICAgICA9IGVmdW46Om9iamVjdF9uYW1lKG9iKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfTE9BRF9OQU1FXSAgICAgICAgID0gZWZ1bjo6bG9hZF9uYW1lKG9iKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfTkVYVF9BTExdICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9ORVhUKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfUFJFVl9BTExdICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9QUkVWKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfTkVYVF9DTEVBTlVQXSAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05FWFRfQ0xFQU5VUF9USU1FKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBPSU5GT19QT1NJVElPTjoKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gYWxsb2NhdGUoT0lQX01BWCk7CisKKyAgICAgICAgICAgIHJlc3VsdFtPSVBfTkVYVF0gPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX05FWFQpOworICAgICAgICAgICAgcmVzdWx0W09JUF9QUkVWXSA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfUFJFVik7CisgICAgICAgICAgICByZXN1bHRbT0lQX1BPU10gID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9QT1MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE9JTkZPX01FTU9SWToKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gYWxsb2NhdGUoT0lNX01BWCk7CisKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fUkVGXSAgICAgICAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9QUk9HX1JFRlMpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OQU1FXSAgICAgICAgICAgICAgID0gZWZ1bjo6cHJvZ3JhbV9uYW1lKG9iKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fUFJPR19TSVpFXSAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9QUk9HX1NJWkUpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OVU1fRlVOQ1RJT05TXSAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9GVU5DVElPTlMpOworICAgICAgICAgICAgcmVzdWx0W09JTV9TSVpFX0ZVTkNUSU9OU10gICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfRlVOQ1RJT05TKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTlVNX1ZBUklBQkxFU10gICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fVkFSSUFCTEVTKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fU0laRV9WQVJJQUJMRVNdICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1ZBUklBQkxFUyk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05VTV9TVFJJTkdTXSAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX1NUUklOR1MpOworICAgICAgICAgICAgcmVzdWx0W09JTV9TSVpFX1NUUklOR1NdICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HUyk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1NJWkVfU1RSSU5HU19EQVRBXSAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTX0RBVEEpOworICAgICAgICAgICAgcmVzdWx0W09JTV9TSVpFX1NUUklOR1NfVE9UQUxdID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HU19EQVRBX1RPVEFMKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTlVNX0lOSEVSSVRFRF0gICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fSU5IRVJJVEVEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fU0laRV9JTkhFUklURURdICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX0lOSEVSSVRFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1RPVEFMX1NJWkVdICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUFJPR19TSVpFX1RPVEFMKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fREFUQV9TSVpFXSAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9EQVRBX1NJWkUpOworICAgICAgICAgICAgcmVzdWx0W09JTV9UT1RBTF9EQVRBX1NJWkVdICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0RBVEFfU0laRV9UT1RBTCk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05PX0lOSEVSSVRdICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTk9fSU5IRVJJVCk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05PX0NMT05FXSAgICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTk9fQ0xPTkUpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OT19TSEFET1ddICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05PX1NIQURPVyk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05VTV9JTkNMVURFU10gICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX0lOQ0xVREVEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fU0hBUkVfVkFSSUFCTEVTXSAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSEFSRV9WQVJJQUJMRVMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc2l6ZW9mKGluZGV4KSkKKyAgICB7CisgICAgICAgIGludCBpZHggPSBpbmRleFswXTsKKyAgICAgICAgaWYgKGlkeCA8IDAgfHwgaWR4ID49IHNpemVvZihyZXN1bHQpKQorICAgICAgICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiSWxsZWdhbCBpbmRleCBmb3Igb2JqZWN0X2luZm8oKTogJWQsIGV4cGVjdGVkIDAuLiVkXG4iLAorICAgICAgICAgICAgICAgIGlkeCwgc2l6ZW9mKHJlc3VsdCktMSkpOworCisgICAgICAgIHJldHVybiByZXN1bHRbaWR4XTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gcmVzdWx0OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X2VkaXRpbmcuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X2VkaXRpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTQ2ZGNkCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvcXVlcnlfZWRpdGluZy5jCkBAIC0wLDAgKzEsMTcgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9lZGl0aW5nKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X2VkaXRpbmcpCisKKyNpbmNsdWRlIDxpbnRlcmFjdGl2ZV9pbmZvLmg+CisKK2ludHxvYmplY3QgcXVlcnlfZWRpdGluZyhvYmplY3Qgb2IpCit7CisgICAgaWYoIWVmdW46OmludGVyYWN0aXZlKG9iKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfRURJVElORyk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvcXVlcnlfaWRsZS5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvcXVlcnlfaWRsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYTMyYWUKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9pZGxlLmMKQEAgLTAsMCArMSwxNCBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X2lkbGUoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfaWRsZSkKKworI2luY2x1ZGUgPGludGVyYWN0aXZlX2luZm8uaD4KKworaW50IHF1ZXJ5X2lkbGUob2JqZWN0IG9iKQoreworICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9JRExFKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9pbnB1dF9wZW5kaW5nLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9pbnB1dF9wZW5kaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ4YzMxMQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X2lucHV0X3BlbmRpbmcuYwpAQCAtMCwwICsxLDE3IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfaW5wdXRfcGVuZGluZygpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9pbnB1dF9wZW5kaW5nKQorCisjaW5jbHVkZSA8aW50ZXJhY3RpdmVfaW5mby5oPgorCitvYmplY3QgcXVlcnlfaW5wdXRfcGVuZGluZyhvYmplY3Qgb2IpCit7CisgICAgaWYoIWVmdW46OmludGVyYWN0aXZlKG9iKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfSU5QVVRfUEVORElORyk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvcXVlcnlfaXBfbmFtZS5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvcXVlcnlfaXBfbmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNzRlYTAKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9pcF9uYW1lLmMKQEAgLTAsMCArMSw0OCBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVucyBxdWVyeV9pcF9uYW1lKCkgYW5kCisgKiBxdWVyeV9pcF9udW1iZXIoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfaXBfbmFtZSkKKworI2luY2x1ZGUgPGludGVyYWN0aXZlX2luZm8uaD4KKworcHJpdmF0ZSB2YXJhcmdzIHN0cmluZyBfcXVlcnlfaXBfbmFtZShvYmplY3QgcGxheWVyKQoreworICAgIG9iamVjdCBvYiA9IHBsYXllcjsKKyAgICBvYiB8fD0gZWZ1bjo6dGhpc19wbGF5ZXIoKTsKKworICAgIHBsYXllciA9IGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX0lQX0FERFJFU1MpOworICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9JUF9OQU1FKTsKK30KKworcHJpdmF0ZSB2YXJhcmdzIHN0cmluZyBfcXVlcnlfaXBfbnVtYmVyKG9iamVjdCBwbGF5ZXIpCit7CisgICAgb2JqZWN0IG9iID0gcGxheWVyOworICAgIG9iIHx8PSBlZnVuOjp0aGlzX3BsYXllcigpOworCisgICAgcGxheWVyID0gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfSVBfQUREUkVTUyk7CisgICAgcmV0dXJuIGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX0lQX05VTUJFUik7Cit9CisKKy8vICogSGVya3VuZnRzLUVybWl0dGx1bmcKK3N0cmluZyBxdWVyeV9pcF9udW1iZXIob2JqZWN0IG9iKQoreworICBvYj0gb2IgfHwgdGhpc19wbGF5ZXIoKTsKKyAgaWYgKCFvYmplY3RwKG9iKSB8fCAhaW50ZXJhY3RpdmUob2IpKSByZXR1cm4gMDsKKyAgaWYob2ItPnF1ZXJ5X3JlYWxpcCgpICYmIChzdHJpbmcpb2ItPnF1ZXJ5X3JlYWxpcCgpIT0iIikKKyAgeworICAgIHJldHVybiAoc3RyaW5nKW9iLT5xdWVyeV9yZWFsaXAoKTsKKyAgfQorICByZXR1cm4gX3F1ZXJ5X2lwX251bWJlcihvYik7Cit9CisKK3N0cmluZyBxdWVyeV9pcF9uYW1lKG1peGVkIG9iKQoreworICBpZiAoICFvYiB8fCBvYmplY3RwKG9iKSApCisgICAgICBvYj1fcXVlcnlfaXBfbnVtYmVyKG9iKTsKKyAgcmV0dXJuIChzdHJpbmcpIi9wL2RhZW1vbi9pcGxvb2t1cCItPmhvc3Qob2IpOworfQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvcXVlcnlfbGltaXRzLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9saW1pdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2JmMzkwCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvcXVlcnlfbGltaXRzLmMKQEAgLTAsMCArMSwxNCBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X2xpbWl0cygpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9saW1pdHMpCisKKyNpbmNsdWRlIDxkcml2ZXJfaW5mby5oPgorCit2YXJhcmdzIGludCogcXVlcnlfbGltaXRzKGludCBkZWYpCit7CisgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKGRlZiA/IERDX0RFRkFVTFRfUlVOVElNRV9MSU1JVFMgOiBESV9DVVJSRU5UX1JVTlRJTUVfTElNSVRTKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9sb2FkX2F2ZXJhZ2UuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X2xvYWRfYXZlcmFnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMzZmMGUKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9sb2FkX2F2ZXJhZ2UuYwpAQCAtMCwwICsxLDE2IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfbG9hZF9hdmVyYWdlKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X2xvYWRfYXZlcmFnZSkKKworI2luY2x1ZGUgPGRyaXZlcl9pbmZvLmg+CisKK3N0cmluZyBxdWVyeV9sb2FkX2F2ZXJhZ2UoKQoreworICAgIHJldHVybiBlZnVuOjpzcHJpbnRmKCIlLjJmIGNtZHMvcywgJS4yZiBjb21wIGxpbmVzL3MiLAorICAgICAgICBlZnVuOjpkcml2ZXJfaW5mbyhESV9MT0FEX0FWRVJBR0VfQ09NTUFORFMpLAorICAgICAgICBlZnVuOjpkcml2ZXJfaW5mbyhESV9MT0FEX0FWRVJBR0VfTElORVMpKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9tdWRfcG9ydC5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvcXVlcnlfbXVkX3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmYwMDlkCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvcXVlcnlfbXVkX3BvcnQuYwpAQCAtMCwwICsxLDM1IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfbXVkX3BvcnQoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfbXVkX3BvcnQpCisKKyNpbmNsdWRlIDxpbnRlcmFjdGl2ZV9pbmZvLmg+CisjaW5jbHVkZSA8ZHJpdmVyX2luZm8uaD4KKworaW50IHF1ZXJ5X211ZF9wb3J0KHZhcmFyZ3MgaW50KnxvYmplY3QqIGFyZ3MpCit7CisgICAgaWYoIXNpemVvZihhcmdzKSAmJiBlZnVuOjp0aGlzX3BsYXllcigpICYmIGVmdW46OmludGVyYWN0aXZlKHRoaXNfcGxheWVyKCkpKQorICAgICAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyh0aGlzX3BsYXllcigpLCBJSV9NVURfUE9SVCk7CisKKyAgICBpZihzaXplb2YoYXJncykgPiAxKQorICAgICAgICByYWlzZV9lcnJvcigiVG9vIG1hbnkgYXJndW1lbnRzIHRvIHF1ZXJ5X211ZF9wb3J0XG4iKTsKKworICAgIGlmKHNpemVvZihhcmdzKSAmJiBlZnVuOjpvYmplY3RwKGFyZ3NbMF0pICYmIGVmdW46OmludGVyYWN0aXZlKGFyZ3NbMF0pKQorICAgICAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhhcmdzWzBdLCBJSV9NVURfUE9SVCk7CisKKyAgICBpZihzaXplb2YoYXJncykgJiYgaW50cChhcmdzWzBdKSkKKyAgICB7CisgICAgICAgIGludCogcG9ydHMgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9NVURfUE9SVFMpOworICAgICAgICBpZihhcmdzWzBdIDwgLTEgfHwgYXJnc1swXSA+PSBzaXplb2YocG9ydHMpKQorICAgICAgICAgICAgcmFpc2VfZXJyb3IoZWZ1bjo6c3ByaW50ZigiQmFkIGFyZyAxIHRvIHF1ZXJ5X211ZF9wb3J0KCk6IHZhbHVlICVkIG91dCBvZiByYW5nZS5cbiIsIGFyZ3NbMF0pKTsKKyAgICAgICAgZWxzZSBpZihhcmdzWzBdID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIHNpemVvZihwb3J0cyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBwb3J0c1thcmdzWzBdXTsKKyAgICB9CisKKyAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTVVEX1BPUlRTKVswXTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9vbmNlX2ludGVyYWN0aXZlLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9vbmNlX2ludGVyYWN0aXZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM3ODI5ZgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X29uY2VfaW50ZXJhY3RpdmUuYwpAQCAtMCwwICsxLDE0IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfb25jZV9pbnRlcmFjdGl2ZSgpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9vbmNlX2ludGVyYWN0aXZlKQorCisjaW5jbHVkZSA8b2JqZWN0X2luZm8uaD4KKworaW50IHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2JqZWN0IG9iKQoreworICAgIHJldHVybiBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT05DRV9JTlRFUkFDVElWRSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvcXVlcnlfc25vb3AuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X3Nub29wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZhNjljMAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X3Nub29wLmMKQEAgLTAsMCArMSwzMCBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X3Nub29wKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisKKyNpbmNsdWRlIDxpbnRlcmFjdGl2ZV9pbmZvLmg+CisKK3ByaXZhdGUgb2JqZWN0IF9xdWVyeV9zbm9vcChvYmplY3Qgb2IpCit7CisgICAgaWYoIWVmdW46OmludGVyYWN0aXZlKG9iKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBvYmplY3QgcHJldiA9IGVmdW46OnByZXZpb3VzX29iamVjdCgpOworICAgIGVmdW46OnNldF90aGlzX29iamVjdChwcmV2KTsKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfc25vb3ApCisgICAgcmV0dXJuIGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX1NOT09QX05FWFQpOworI2Vsc2UKKyAgICByZXR1cm4gZWZ1bjo6cXVlcnlfc25vb3Aob2IpOworI2VuZGlmCit9CisKK25vbWFzayBvYmplY3QgcXVlcnlfc25vb3Aob2JqZWN0IHdobykgeworICBvYmplY3Qgc25vb3BlcjsKKworICBzbm9vcGVyPV9xdWVyeV9zbm9vcCh3aG8pOworICBpZiAoIXNub29wZXIpIHJldHVybiAwOworICBpZiAocXVlcnlfd2l6X2dycChzbm9vcGVyKT5xdWVyeV93aXpfZ3JwKGdldHVpZChwcmV2aW91c19vYmplY3QoKSkpICYmCisgICAgICBJU19BUkNIKHNub29wZXIpKSByZXR1cm4gMDsKKyAgcmV0dXJuIHNub29wZXI7Cit9CmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9zZXRfaGVhcnRfYmVhdC5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvc2V0X2hlYXJ0X2JlYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzk5NWViCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvc2V0X2hlYXJ0X2JlYXQuYwpAQCAtMCwwICsxLDI0IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gc2V0X2hlYXJ0X2JlYXQoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18oc2V0X2hlYXJ0X2JlYXQpCisKKyNpbmNsdWRlIDxjb25maWd1cmF0aW9uLmg+CisKK2ludCBzZXRfaGVhcnRfYmVhdChpbnQgZmxhZykKK3sKKyAgICBvYmplY3Qgb2IgPSBlZnVuOjpwcmV2aW91c19vYmplY3QoKTsKKyAgICBpbnQgaGIgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0NfSEVBUlRfQkVBVCk7CisKKyAgICBpZiAoIWZsYWcgPT0gIWhiKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGVmdW46OmNvbmZpZ3VyZV9vYmplY3Qob2IsIE9DX0hFQVJUX0JFQVQsIGZsYWcpOworCisgICAgcmV0dXJuIDE7Cit9CisKKyNlbmRpZgorCisKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3NldF9pc193aXphcmQuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3NldF9pc193aXphcmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDFjY2RiCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvc2V0X2lzX3dpemFyZC5jCkBAIC0wLDAgKzEsMTM3IEBACisvKiBUaGVzZSBhcmUgdGhlIHNwZWNpYWwgY29tbWFuZHMgZnJvbSB0aGUgZHJpdmVyIHRoYXQgYXJlIGFjdGl2YXRlZCB3aXRoCisgKiBzZXRfaXNfd2l6YXJkKCkuIFRoZXNlIGZ1bmN0aW9ucyBtdXN0IGJlIGFkZGVkIHRvIHRoZSBwbGF5ZXIgb2JqZWN0LgorICogQWxzbyBzZXRfaXNfd2l6YXJkKCkgbXVzdCBiZSBjYWxsZWQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgcGxheWVyIG9iamVjdCwKKyAqIG5vdCBhcyBhbiAoc2ltdWwtKWVmdW4uCisgKi8KKworI2luY2x1ZGUgPGNvbW1hbmRzLmg+CisjaW5jbHVkZSA8ZHJpdmVyX2luZm8uaD4KKworLyogaXNfd2l6YXJkOgorICogIDE6IGhhcyBhY3Rpb25zLAorICogIDA6IG5ldmVyIGhhZCBhY3Rpb25zLAorICogLTE6IGhhZCBhY3Rpb25zIG9uY2UuCisgKi8KK3ByaXZhdGUgbm9zYXZlIGludCBpc193aXphcmQ7CisKK3ByaXZhdGUgaW50IGRyaXZlcl9tYWxsb2Moc3RyaW5nIHN0cikKK3sKKyAgICBpZihpc193aXphcmQgPD0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZighc2l6ZW9mKHN0cikpCisgICAgeworICAgICAgICB3cml0ZShlZnVuOjpkcml2ZXJfaW5mbyhESV9TVEFUVVNfVEVYVF9NQUxMT0MpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYoc3RyID09ICJleHRzdGF0cyIpCisgICAgeworICAgICAgICB3cml0ZShlZnVuOjpkcml2ZXJfaW5mbyhESV9TVEFUVVNfVEVYVF9NQUxMT0NfRVhURU5ERUQpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3ByaXZhdGUgaW50IGRyaXZlcl9kdW1wYWxsb2JqKHN0cmluZyBzdHIpCit7CisgICAgaWYoaXNfd2l6YXJkIDw9IDAgfHwgc2l6ZW9mKHN0cikpCisgICAgICAgIHJldHVybiAwOworCisgICAgd3JpdGUoIkR1bXBpbmcgdG8gL09CSl9EVU1QIC4uLiAiKTsKKyAgICBlZnVuOjpkdW1wX2RyaXZlcl9pbmZvKERESV9PQkpFQ1RTKTsKKyAgICBlZnVuOjpkdW1wX2RyaXZlcl9pbmZvKERESV9PQkpFQ1RTX0RFU1RSVUNURUQpOworICAgIHdyaXRlKCJkb25lXG4iKTsKKyAgICByZXR1cm4gMTsKK30KKworcHJpdmF0ZSBpbnQgZHJpdmVyX29wY2R1bXAoc3RyaW5nIHN0cikKK3sKKyAgICBpZihpc193aXphcmQgPD0gMCB8fCBzaXplb2Yoc3RyKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBlZnVuOjpkdW1wX2RyaXZlcl9pbmZvKERESV9PUENPREVTKTsKKyAgICByZXR1cm4gMTsKK30KKworcHJpdmF0ZSBpbnQgZHJpdmVyX3N0YXR1cyhzdHJpbmcgc3RyKQoreworICAgIGludCBvcHQ7CisgICAgaWYoaXNfd2l6YXJkIDw9IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgc3dpdGNoKHN0ciB8fCAiIikKKyAgICB7CisgICAgICAgIGNhc2UgIiI6CisgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9NRU1PUlk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJ0YWJsZXMiOgorICAgICAgICBjYXNlICIgdGFibGVzIjoKKyAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX1RBQkxFUzsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgInN3YXAiOgorICAgICAgICBjYXNlICIgc3dhcCI6CisgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9TV0FQOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAibWFsbG9jIjoKKyAgICAgICAgY2FzZSAiIG1hbGxvYyI6CisgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9NQUxMT0M7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJtYWxsb2MgZXh0c3RhdHMiOgorICAgICAgICBjYXNlICIgbWFsbG9jIGV4dHN0YXRzIjoKKyAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX01BTExPQ19FWFRFTkRFRDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB3cml0ZShlZnVuOjpkcml2ZXJfaW5mbyhvcHQpKTsKKyAgICByZXR1cm4gMTsKK30KKworaW50IHNldF9pc193aXphcmQodmFyYXJncyA8b2JqZWN0fGludD4qIGFyZ3MpCit7CisgICAgaW50IG9sZHZhbCA9IGlzX3dpemFyZDsKKworICAgIGlmKCFzaXplb2YoYXJncykpCisgICAgICAgIHJhaXNlX2Vycm9yKCJUb28gZmV3IGFyZ3VtZW50cyB0byBzZXRfaXNfd2l6YXJkXG4iKTsKKyAgICBpZihzaXplb2YoYXJncykgPiAyKQorICAgICAgICByYWlzZV9lcnJvcigiVG9vIG1hbnkgYXJndW1lbnRzIHRvIHNldF9pc193aXphcmRcbiIpOworICAgIGlmKCFvYmplY3RwKGFyZ3NbMF0pKQorICAgICAgICByYWlzZV9lcnJvcigiQmFkIGFyZyAxIHRvIHNldF9pc193aXphcmQoKVxuIik7CisgICAgaWYoYXJnc1swXSAhPSB0aGlzX29iamVjdCgpKQorICAgICAgICByYWlzZV9lcnJvcigiT25seSBzZXRfaXNfd2l6YXJkIGZvciB0aGUgY3VycmVudCBvYmplY3Qgc3VwcG9ydGVkXG4iKTsKKyAgICBpZih0aGlzX3BsYXllcigpICE9IHRoaXNfb2JqZWN0KCkpCisgICAgICAgIHJhaXNlX2Vycm9yKCJUaGUgY3VycmVudCBvYmplY3QgbXVzdCBiZSB0aGlzX3BsYXllcigpIGZvciBzZXRfaXNfd2l6YXJkKClcbiIpOworICAgIGlmKHNpemVvZihhcmdzKSA9PSAyICYmICFpbnRwKGFyZ3NbMV0pKQorICAgICAgICByYWlzZV9lcnJvcigiQmFkIGFyZyAyIHRvIHNldF9pc193aXphcmQoKVxuIik7CisKKyAgICBpZihzaXplb2YoYXJncykgPT0gMiAmJiAhYXJnc1sxXSkKKyAgICB7CisgICAgICAgIGlmKGlzX3dpemFyZCA+IDApCisgICAgICAgICAgICBpc193aXphcmQgPSAtMTsKKyAgICB9CisgICAgZWxzZSBpZihzaXplb2YoYXJncykgPT0gMiAmJiBhcmdzWzFdPDApCisgICAgeworICAgICAgICAgLy8gSnVzdCByZXR1cm4gdGhlIG9sZCB2YWx1ZS4KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoIWlzX3dpemFyZCkKKyAgICAgICAgeworICAgICAgICAgICAgYWRkX2FjdGlvbigjJ2RyaXZlcl9tYWxsb2MsICJtYWxsb2MiKTsKKyAgICAgICAgICAgIGFkZF9hY3Rpb24oIydkcml2ZXJfZHVtcGFsbG9iaiwgImR1bXBhbGxvYmoiKTsKKyAgICAgICAgICAgIGFkZF9hY3Rpb24oIydkcml2ZXJfb3BjZHVtcCwgIm9wY2R1bXAiKTsKKyAgICAgICAgICAgIGFkZF9hY3Rpb24oIydkcml2ZXJfc3RhdHVzLCAic3RhdHVzIiwgQUFfTk9TUEFDRSk7CisgICAgICAgIH0KKyAgICAgICAgaXNfd2l6YXJkID0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gb2xkdmFsID4gMDsKK30KZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3NldF9wcm9tcHQuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3NldF9wcm9tcHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjU5NjkyCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvc2V0X3Byb21wdC5jCkBAIC0wLDAgKzEsMjEgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBzZXRfcHJvbXB0KCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHNldF9wcm9tcHQpCisKKyNpbmNsdWRlIDxjb25maWd1cmF0aW9uLmg+CisKK3ZhcmFyZ3Mgc3RyaW5nfGNsb3N1cmUgc2V0X3Byb21wdChzdHJpbmd8Y2xvc3VyZXxpbnQgcHJvbXB0LCBvYmplY3Qgb2IpCit7CisgICAgb2IgfHw9IGVmdW46OnRoaXNfcGxheWVyKCk7CisKKyAgICBtaXhlZCBvbGRwcm9tcHQgPSBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJQ19QUk9NUFQpOworCisgICAgaWYoIWludHAocHJvbXB0KSkKKyAgICAgICAgZWZ1bjo6Y29uZmlndXJlX2ludGVyYWN0aXZlKG9iLCBJQ19QUk9NUFQsIHByb21wdCk7CisKKyAgICByZXR1cm4gb2xkcHJvbXB0OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3NoYWRvdy5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvc2hhZG93LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYwOGM3MwotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3NoYWRvdy5jCkBAIC0wLDAgKzEsNTUgQEAKKy8qIFRoZXNlIHNlZnVucyBhcmUgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9zaGFkb3dpbmcoKQorICogYW5kIHRoZSBvbGQgc2VtYW50aWNzIG9mIHRoZSBlZnVuIHNoYWRvdygpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9zaGFkb3dpbmcpCisKKyNpbmNsdWRlIDxvYmplY3RfaW5mby5oPgorCitvYmplY3QgcXVlcnlfc2hhZG93aW5nKG9iamVjdCBvYikKK3sKKyAgICByZXR1cm4gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NIQURPV19QUkVWKTsKK30KKworcHJpdmF0ZSBvYmplY3QgX3NoYWRvdyhvYmplY3Qgb2IsIGludCBmbGFnKQoreworICAgIGlmKGZsYWcpCisgICAgeworICAgICAgICBvYmplY3Qgc2hhZG93ZXIgPSBlZnVuOjpwcmV2aW91c19vYmplY3QoMSk7CisgICAgICAgIGVmdW46OnNldF90aGlzX29iamVjdChzaGFkb3dlcik7CisKKyAgICAgICAgaWYgKGVmdW46OnNoYWRvdyhvYikpCisgICAgICAgICAgICByZXR1cm4gZWZ1bjo6b2JqZWN0X2luZm8oc2hhZG93ZXIsIE9JX1NIQURPV19QUkVWKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSEFET1dfTkVYVCk7Cit9CisjZWxzZQorcHJpdmF0ZSBvYmplY3QgX3NoYWRvdyhvYmplY3Qgb2IsIGludCBmbGFnKQoreworICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KDEpKTsKKyAgcmV0dXJuIGVmdW46OnNoYWRvdyhvYiwgZmxhZyk7Cit9CisjZW5kaWYKKworCitwdWJsaWMgb2JqZWN0IHNoYWRvdyhvYmplY3Qgb2IsIGludCBmbGFnKQoreworICBvYmplY3QgcmVzID0gZnVuY2FsbCgjJ19zaGFkb3csb2IsIGZsYWcpOworICBpZiAoZmxhZykKKyAgICAiL3NlY3VyZS9zaGFkb3dtYXN0ZXIiLT5SZWdpc3RlclNoYWRvdyhwcmV2aW91c19vYmplY3QoKSk7CisgIHJldHVybiByZXM7Cit9CisKK3ByaXZhdGUgdm9pZCBfdW5zaGFkb3coKSB7CisgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoMSkpOworICBlZnVuOjp1bnNoYWRvdygpOworfQorCitwdWJsaWMgdm9pZCB1bnNoYWRvdygpIHsKKyAgZnVuY2FsbCgjJ191bnNoYWRvdyk7CisgICIvc2VjdXJlL3NoYWRvd21hc3RlciItPlVucmVnaXN0ZXJTaGFkb3cocHJldmlvdXNfb2JqZWN0KCkpOworfQpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvc2ltdWxfZWZ1bi5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvc2ltdWxfZWZ1bi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNjg3ODkKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9zaW11bF9lZnVuLmMKQEAgLTAsMCArMSwxOTk1IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gc2ltdWxfZWZ1bi5jIC0tIHNpbXVsIGVmdW4ncworLy8KKy8vICRJZDogc2ltdWxfZWZ1bi5jIDc0MDggMjAxMC0wMi0wNiAwMDoyNzoyNVogWmVzc3RyYSAkCisjcHJhZ21hIHN0cmljdF90eXBlcyxzYXZlX3R5cGVzLHJ0dF9jaGVja3MKKyNwcmFnbWEgbm9fY2xvbmUsbm9fc2hhZG93LG5vX2luaGVyaXQKKyNwcmFnbWEgcGVkYW50aWMscmFuZ2VfY2hlY2ssd2Fybl9kZXByZWNhdGVkCisjcHJhZ21hIHdhcm5fZW1wdHlfY2FzdHMsd2Fybl9taXNzaW5nX3JldHVybix3YXJuX2Z1bmN0aW9uX2luY29uc2lzdGVudAorCisvLyBBYnNvbHV0ZSBQZmFkZSBlcmZvcmRlcmxpY2ggLSB6dW0gWmVpdHB1bmt0LCB3byBkZXIgTWFzdGVyIGdlbGFkZW4KKy8vIHdpcmQsIHNpbmQgbm9jaCBrZWluZSBJbmNsdWRlLVBmYWRlIGRhIC4uLgorCisjZGVmaW5lIFNOT09QTE9HRklMRSAiU05PT1AiCisjZGVmaW5lIEFTTk9PUExPR0ZJTEUgIkFSQ0gvU05PT1AiCisKKyNpbmNsdWRlICIvc2VjdXJlL2NvbmZpZy5oIgorI2luY2x1ZGUgIi9zZWN1cmUvd2l6bGV2ZWxzLmgiCisjaW5jbHVkZSAiL3N5cy9zbm9vcGluZy5oIgorI2luY2x1ZGUgIi9zeXMvbGFuZ3VhZ2UuaCIKKyNpbmNsdWRlICIvc3lzL3RoaW5nL3Byb3BlcnRpZXMuaCIKKyNpbmNsdWRlICIvc3lzL3dpemxpc3QuaCIKKyNpbmNsdWRlICIvc3lzL2VycS5oIgorI2luY2x1ZGUgIi9zeXMvbHBjdHlwZXMuaCIKKyNpbmNsdWRlICIvc3lzL2RhZW1vbi5oIgorI2luY2x1ZGUgIi9zeXMvcGxheWVyL2Jhc2UuaCIKKyNpbmNsdWRlICIvc3lzL3RoaW5nL2Rlc2NyaXB0aW9uLmgiCisjaW5jbHVkZSAiL3N5cy9jb250YWluZXIuaCIKKyNpbmNsdWRlICIvc3lzL2RlZmluZXMuaCIKKyNpbmNsdWRlICIvc3lzL3RlbG5ldC5oIgorI2luY2x1ZGUgIi9zeXMvb2JqZWN0aW5mby5oIgorI2luY2x1ZGUgIi9zeXMvZmlsZXMuaCIKKyNpbmNsdWRlICIvc3lzL3N0cmluZ3MuaCIKKyNpbmNsdWRlICIvc3lzL3RpbWUuaCIKKyNpbmNsdWRlICIvc3lzL2xwY3R5cGVzLmgiCisjaW5jbHVkZSAiL3N5cy9ub3RpZnlfZmFpbC5oIgorI2luY2x1ZGUgIi9zeXMvdGxzLmgiCisjaW5jbHVkZSAiL3N5cy9pbnB1dF90by5oIgorI2luY2x1ZGUgIi9zeXMvb2JqZWN0X2luZm8uaCIKKworLyogZnVuY3Rpb24gcHJvdG90eXBlcworICovCitzdHJpbmcgZHRpbWUoaW50IHdhbm4pOwordmFyYXJncyBpbnQgbG9nX2ZpbGUoc3RyaW5nIGZpbGUsIHN0cmluZyB0eHQsIGludCBzaXplX3RvX2JyZWFrKTsKK2ludCBxdWVyeV93aXpfbGV2ZWwobWl4ZWQgcGxheWVyKTsKK25vbWFzayB2YXJhcmdzIGludCBzbm9vcChvYmplY3QgbWUsIG9iamVjdCB5b3UpOwordmFyYXJncyBzdHJpbmcgY291bnRyeShtaXhlZCBpcCwgc3RyaW5nIG51bSk7CitpbnQgcXVlcnlfd2l6X2dycChtaXhlZCB3aXopOworcHVibGljIHZhcmFyZ3Mgb2JqZWN0IGRlZXBfcHJlc2VudChtaXhlZCB3aGF0LCBvYmplY3Qgb2IpOworbm9tYXNrIGludCBzZWN1cmVfbGV2ZWwoKTsKK25vbWFzayBzdHJpbmcgc2VjdXJlX2V1aWQoKTsKK3B1YmxpYyBub21hc2sgaW50IHByb2Nlc3NfY2FsbCgpOworbm9tYXNrIG1peGVkIF9fY3JlYXRlX3BsYXllcl9kdW1teShzdHJpbmcgbmFtZSk7Cit2YXJhcmdzIHN0cmluZyByZXBsYWNlX3BlcnNvbmFsKHN0cmluZyBzdHIsIG1peGVkICpvYnMsIGludCBjYXBzKTsKKworCisvL3JlcGxhY2VtZW50cyBmb3IgZHJvcHBlZCBlZnVucyBpbiBMRAorI2lmICFfX0VGVU5fREVGSU5FRF9fKGV4dHJhY3QpCit2YXJhcmdzIHN0cmluZyBleHRyYWN0KHN0cmluZyBzdHIsIGludCBmcm9tLCBpbnQgdG8pOworI2VuZGlmCisjaWYgIV9fRUZVTl9ERUZJTkVEX18oc2xpY2VfYXJyYXkpCit2YXJhcmdzIG1peGVkIHNsaWNlX2FycmF5KG1peGVkIGFycmF5LCBpbnQgZnJvbSwgaW50IHRvKTsKKyNlbmRpZgorI2lmICFfX0VGVU5fREVGSU5FRF9fKG1lbWJlcl9hcnJheSkKK2ludCBtZW1iZXJfYXJyYXkobWl4ZWQgaXRlbSwgbWl4ZWQgYXJyYXlzdHJpbmcpOworI2VuZGlmCisKKy8vIEluY2x1ZGUgdGhlIGRpZmZlcmVudCBzdWIgJ21vZHVsZXMnIG9mIHRoZSBzaW11bF9lZnVuCisjaW5jbHVkZSBfX0RJUl9fImRlYnVnX2luZm8uYyIKKyNpbmNsdWRlIF9fRElSX18iZW5hYmxlX2NvbW1hbmRzLmMiCisjaW5jbHVkZSBfX0RJUl9fImhhc2guYyIKKyNpbmNsdWRlIF9fRElSX18ib2JqZWN0X2luZm8uYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfZWRpdGluZy5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9pZGxlLmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X2lucHV0X3BlbmRpbmcuYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfaXBfbmFtZS5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9saW1pdHMuYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfbG9hZF9hdmVyYWdlLmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X211ZF9wb3J0LmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUuYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfc25vb3AuYyIKKyNpbmNsdWRlIF9fRElSX18ic2V0X2hlYXJ0X2JlYXQuYyIKKyNpZiBfX0JPT1RfVElNRV9fIDwgMTQ1NjI2MTg1OQorI2luY2x1ZGUgX19ESVJfXyJzZXRfcHJvbXB0LmMiCisjZW5kaWYKKyNpbmNsdWRlIF9fRElSX18ic2hhZG93LmMiCisjaW5jbHVkZSBfX0RJUl9fImxpdmluZ3MuYyIKKyNpbmNsdWRlIF9fRElSX18iY29tbS5jIgorCisjZGVmaW5lIFRPICAgICAgICBlZnVuOjp0aGlzX29iamVjdCgpCisjZGVmaW5lIFRJICAgICAgICBlZnVuOjp0aGlzX2ludGVyYWN0aXZlKCkKKyNkZWZpbmUgVFAgICAgICAgIGVmdW46OnRoaXNfcGxheWVyKCkKKyNkZWZpbmUgUE8gICAgICAgIGVmdW46OnByZXZpb3VzX29iamVjdCgwKQorI2RlZmluZSBMRVZFTCh4KSBxdWVyeV93aXpfbGV2ZWwoeCkKKyNkZWZpbmUgTkFNRSh4KSAgY2FwaXRhbGl6ZShnZXR1aWQoeCkpCisKKyNkZWZpbmUgREVCVUcoeCkgaWYgKGZpbmRfcGxheWVyKCJ6ZXNzdHJhIikpIFwKKyAgdGVsbF9vYmplY3QoZmluZF9wbGF5ZXIoInplc3N0cmEiKSx4KQorCittaXhlZCBkdGltZV9jYWNoZSA9ICh7LTEsIiJ9KTsKKworI2lmZGVmIElPU1RBVFMKK3N0cnVjdCBpb3N0YXRfcyB7CisgIHN0cmluZyBvbmFtZTsKKyAgaW50IHRpbWU7CisgIGludCBzaXplOworfTsKK21peGVkIHNhdmVvX3N0YXQgPSAoeyAwLGFsbG9jYXRlKDIwMCwgMCkgfSk7CittaXhlZCByZXN0b3Jlb19zdGF0ID0gKHsgMCxhbGxvY2F0ZSgyMDAsMCkgfSk7CisvL21peGVkIHdyaXRlZmlsZV9zdGF0ID0gKHsgMCxhbGxvY2F0ZSgxMDAsKDxpb3N0YXRfcz4pKSB9KTsKKy8vbWl4ZWQgcmVhZGZpbGVfc3RhdCA9ICh7IDAsYWxsb2NhdGUoMTAwLCg8aW9zdGF0X3M+KSkgfSk7CisvL21peGVkIGxvZ19zdGF0ID0gKHsgMCxhbGxvY2F0ZSgxMDAsKDxpb3N0YXRfcz4pKSB9KTsKKworbWl4ZWQgX19faW9zdGF0cyhpbnQgdHlwZSkgeworICBzd2l0Y2godHlwZSkgeworICAgIGNhc2UgMToKKyAgICAgIHJldHVybiBzYXZlb19zdGF0OworICAgIGNhc2UgMjoKKyAgICAgIHJldHVybiByZXN0b3Jlb19zdGF0OworLyogICAgY2FzZSAzOgorICAgICAgcmV0dXJuIHdyaXRlZmlsZV9zdGF0OworICAgIGNhc2UgNDoKKyAgICAgIHJldHVybiByZWFkZmlsZV9zdGF0OworICAgIGNhc2UgNToKKyAgICAgIHJldHVybiBsb2dfc3RhdDsKKyAgICAgICovCisgIH0KKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworLy8gTmljaHQgamVkZXIgTWFnaWVyIG11c3MgZGllIHNpbXVsX2VmdW4gZW50c29yZ2VuIGtvZW5uZW4uCitzdHJpbmcgTm90aWZ5RGVzdHJ1Y3Qob2JqZWN0IGNhbGxlcikgeworICAgIGlmKCAoY2FsbGVyIT10aGlzX29iamVjdCgpICYmICFBUkNIX1NFQ1VSSVRZKSB8fCBwcm9jZXNzX2NhbGwoKSApIHsKKyAgICAgIHJldHVybiAiRHUgZGFyZnN0IGRhcyBzaW11bF9lZnVuIE9iamVrdCBuaWNodCB6ZXJzdG9lcmVuIVxuIjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3B1YmxpYyBub21hc2sgdm9pZCByZW1vdmVfaW50ZXJhY3RpdmUoIG9iamVjdCBvYiApCit7CisgICAgaWYgKCBvYmplY3RwKG9iKSAmJiBwcmV2aW91c19vYmplY3QoKQorICAgICAgICAmJiBvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSlbMC4uN10gIT0gIi9zZWN1cmUvIgorICAgICAgICAmJiAoKHByZXZpb3VzX29iamVjdCgpICE9IG9iCisgICAgICAgICAgICAgJiYgKG9iICE9IHRoaXNfcGxheWVyKCkgfHwgb2IgIT0gdGhpc19pbnRlcmFjdGl2ZSgpKSkKKyAgICAgICAgICAgIHx8IChwcmV2aW91c19vYmplY3QoKSA9PSBvYgorICAgICAgICAgICAgICAgJiYgKHRoaXNfcGxheWVyKCkgJiYgdGhpc19wbGF5ZXIoKSAhPSBvYgorICAgICAgICAgICAgICAgICAgIHx8IHRoaXNfaW50ZXJhY3RpdmUoKSAmJiB0aGlzX2ludGVyYWN0aXZlKCkgIT0gb2IpKSApICkKKworICAgICAgIGxvZ19maWxlKCAiUExBWUVSREVTVCIsCisgICAgICAgICAgICAgICAgc3ByaW50ZiggIiVzOiAlTyBhdXNnZWxvZ2d0IHZvbiBQTyAlTywgVEkgJU8sIFRQICVPXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZHRpbWUodGltZSgpKSwgb2IsIHByZXZpb3VzX29iamVjdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgdGhpc19pbnRlcmFjdGl2ZSgpLCB0aGlzX3BsYXllcigpICkgKTsKKworICAgIGVmdW46OnJlbW92ZV9pbnRlcmFjdGl2ZShvYik7Cit9CisKKwordm9pZCBfX191cGRtYXN0ZXIoKQoreworICAgIG9iamVjdCBvYjsKKworICAgIC8vc29sbHRlIG5pY2h0IGplZGVyIGR1ZXJmZW4uCisgICAgaWYgKHByb2Nlc3NfY2FsbCgpIHx8ICFBUkNIX1NFQ1VSSVRZKQorICAgICAgcmFpc2VfZXJyb3IoIklsbGVnYWwgdXNlIG9mIF9fX3VwZG1hc3RlcigpISIpOworCisgICAgd3JpdGUoIlJlbW92aW5nIG9sZCBtYXN0ZXIgLi4uICIpOworICAgIGZvcmVhY2goc3RyaW5nIGZpbGU6IAorICAgICAgICBnZXRfZGlyKCIvc2VjdXJlL21hc3Rlci8qLmMiLEdFVERJUl9OQU1FU3xHRVRESVJfVU5TT1JURUR8R0VURElSX1BBVEgpKSB7CisgICAgICBpZiAob2IgPSBmaW5kX29iamVjdChmaWxlKSkKKyAgICAgICBlZnVuOjpkZXN0cnVjdChvYik7CisgICAgfQorICAgIGVmdW46OmRlc3RydWN0KGVmdW46OmZpbmRfb2JqZWN0KCIvc2VjdXJlL21hc3RlciIpKTsKKyAgICB3cml0ZSgiZG9uZS5cbkxvYWRpbmcgYWdhaW4gLi4uICIpOworICAgIGxvYWRfb2JqZWN0KCIvc2VjdXJlL21hc3RlciIpOworCisgICAgd3JpdGUoImRvbmUuXG4iKTsKK30KKwordmFyYXJncyBzdHJpbmcgY291bnRyeShtaXhlZCBpcCwgc3RyaW5nIG51bSkgeworICBtaXhlZCByZXQ7CisKKyAgaWYocmV0ID0gKHN0cmluZykiL3AvZGFlbW9uL2lwbG9va3VwIi0+Y291bnRyeShudW0gfHwgaXApKSB7CisgICAgcmV0dXJuIHJldDsKKyAgfSBlbHNlIHJldHVybiAiPz8/IjsKK30KKworCisvLyAqIFNub29wZW4gdW5kIHdhcyBkYXp1Z2Vob2VydAorc3RhdGljIG9iamVjdCBmaW5kX3Nub29wZWQob2JqZWN0IHdobykKK3sKKyAgb2JqZWN0ICp1OworICBpbnQgaTsKKworICBmb3IgKGk9c2l6ZW9mKHU9dXNlcnMoKSktMTtpPj0wO2ktLSkKKyAgICBpZiAod2hvPT1lZnVuOjppbnRlcmFjdGl2ZV9pbmZvKHVbaV0sIElJX1NOT09QX05FWFQpKQorICAgICAgcmV0dXJuIHVbaV07CisgIHJldHVybiAwOworfQorCitwcml2YXRlIHN0cmluZyBMY3V0KHN0cmluZyBzdHIpIHsKKyAgcmV0dXJuIHN0cls1Li4xMV0rc3RyWzE4Li5dOworfQorCitub21hc2sgdmFyYXJncyBpbnQgc25vb3AoIG9iamVjdCBtZSwgb2JqZWN0IHlvdSApCit7CisgICAgaW50IHJldDsKKyAgICBvYmplY3Qgc25vb3BlcjAsIHNub29wZXIsIHNub29wZXIyLCBzbm9vcGVyMzsKKworICAgIGlmKCAhb2JqZWN0cChtZSkgfHwgbWUgPT0geW91IHx8ICFQTyApCisgICAgICAgcmV0dXJuIDA7CisKKyAgICBzbm9vcGVyMCA9IGZpbmRfc25vb3BlZChtZSk7CisKKyAgICAgaWYoeW91KXsKKyAgICAgICAgaWYgKCBQTyAhPSBtZSAmJiBxdWVyeV93aXpfZ3JwKG1lKSA+PSBxdWVyeV93aXpfZ3JwKGdldGV1aWQoUE8pKSApCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBpZiAoIHF1ZXJ5X3dpel9ncnAobWUpIDw9IHF1ZXJ5X3dpel9ncnAoeW91KSAmJgorICAgICAgICAgICAgICEoeW91LT5RdWVyeUFsbG93U25vb3AobWUpKSApCisgICAgICAgICAgICBpZiAoICFJU19ERVBVVFkobWUpIHx8IElTX0FSQ0goeW91KSApCisgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBpZiAoIChzbm9vcGVyID0gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyh5b3UsIElJX1NOT09QX05FWFQpKSAmJgorICAgICAgICAgICAgIHF1ZXJ5X3dpel9ncnAoc25vb3BlcikgPj0gcXVlcnlfd2l6X2dycChtZSkgKXsKKyAgICAgICAgICAgIGlmICggKGludClzbm9vcGVyLT5RdWVyeVByb3AoUF9TTk9PUEZMQUdTKSAmIFNGX0xPQ0tFRCApCisgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAgICAgdGVsbF9vYmplY3QoIHNub29wZXIsIHNwcmludGYoICIlcyBzbm9vcGVkIGpldHp0ICVzLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lLT5uYW1lKFdFUiksIHlvdS0+bmFtZShXRVIpICkgKTsKKworICAgICAgICAgICAgc25vb3BlcjIgPSBtZTsKKworICAgICAgICAgICAgd2hpbGUgKCBzbm9vcGVyMyA9IGludGVyYWN0aXZlX2luZm8oc25vb3BlcjIsIElJX1NOT09QX05FWFQpICl7CisgICAgICAgICAgICAgICB0ZWxsX29iamVjdCggc25vb3BlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoICIlcyB3aXJkIHNlaW5lcnNlaXRzIHZvbiAlcyBnZXNub29wZWQuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxzbm9vcGVyMi0+bmFtZShXRVIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMy0+bmFtZShXRU0pICkgKTsKKyAgICAgICAgICAgICAgIHNub29wZXIyID0gc25vb3BlcjM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVmdW46OnNub29wKCBzbm9vcGVyLCBzbm9vcGVyMiApOworCisgICAgICAgICAgICBpZiAoIGVmdW46OmludGVyYWN0aXZlX2luZm8oc25vb3BlcjIsIElJX1NOT09QX05FWFQpICE9IHNub29wZXIgKQorICAgICAgICAgICAgICAgdGVsbF9vYmplY3QoIHNub29wZXIsIHNwcmludGYoICJEdSBrYW5uc3QgJXMgbmljaHQgc25vb3Blbi5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMi0+bmFtZShXRU4pICkgKTsKKyAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICB0ZWxsX29iamVjdCggc25vb3Blciwgc3ByaW50ZiggIkR1IHNub29wc3QgamV0enQgJXMuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlcjItPm5hbWUoV0VOKSApICk7CisgICAgICAgICAgICAgICBpZiAoICFJU19ERVBVVFkoc25vb3BlcikgKXsKKyAgICAgICAgICAgICAgICAgICBsb2dfZmlsZSggU05PT1BMT0dGSUxFLCBzcHJpbnRmKCIlczogJU8gJU8gJU9cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0aW1lKHRpbWUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMikgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAgKTsKKyAgICAgICAgICAgICAgICAgICBpZiAoc25vb3BlcjApCisgICAgICAgICAgICAgICAgICAgICAgQ0hNQVNURVItPnNlbmQoICJTbm9vcCIsIHNub29wZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCAiJXMgKk9GRiogJXMgKCVPKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHNub29wZXIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoc25vb3BlcjApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjApICkgKTsKKworICAgICAgICAgICAgICAgICAgIENITUFTVEVSLT5zZW5kKCAiU25vb3AiLCBzbm9vcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZigiJXMgLT4gJXMgKCVPKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoc25vb3BlcikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHNub29wZXIyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjIpKSk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgICAgIGxvZ19maWxlKCBBU05PT1BMT0dGSUxFLCBzcHJpbnRmKCAiJXM6ICVPICVPICVPXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0aW1lKHRpbWUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMikgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxMDAwMDAgKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBpZiAoc25vb3BlcikKKyAgICAgICAgICAgICAgIGlmICggIW1lLT5RdWVyeVByb3AoUF9TTk9PUEZMQUdTKSAmIFNGX0xPQ0tFRCApeworICAgICAgICAgICAgICAgICAgIHByaW50ZiggIiVzIHdpcmQgYmVyZWl0cyB2b24gJXMgZ2Vzbm9vcGVkLiBCZW51dHplIGRhcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJcImZcIi1GbGFnLCB3ZW5uIGR1IGRlbm5vY2ggc25vb3BlbiB3aWxsc3QuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICB5b3UtPm5hbWUoV0VSKSwgc25vb3Blci0+bmFtZShXRU0pICk7CisgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gZWZ1bjo6c25vb3AoIG1lLCB5b3UgKTsKKworICAgICAgICBpZiAoICFJU19ERVBVVFkobWUpICYmIGVmdW46OmludGVyYWN0aXZlX2luZm8oeW91LCBJSV9TTk9PUF9ORVhUKSA9PSBtZSl7CisgICAgICAgICAgICBsb2dfZmlsZSggU05PT1BMT0dGSUxFLCBzcHJpbnRmKCAiJXM6ICVPICVPICVPXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMY3V0KGR0aW1lKHRpbWUoKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZSwgeW91LCBlbnZpcm9ubWVudCh5b3UpICksCisgICAgICAgICAgICAgICAgICAgICAxMDAwMDAgKTsKKworICAgICAgICAgICAgaWYgKHNub29wZXIwKQorICAgICAgICAgICAgICAgQ0hNQVNURVItPnNlbmQoICJTbm9vcCIsIG1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCAiJXMgKk9GRiogJXMgKCVPKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKG1lKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoc25vb3BlcjApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMCkgKSApOworCisgICAgICAgICAgICBDSE1BU1RFUi0+c2VuZCggIlNub29wIiwgbWUsIHNwcmludGYoICIlcyAtPiAlcyAoJU8pLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChtZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoeW91KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudCh5b3UpICkgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNleworICAgICAgICAgICAgaWYgKCBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKHlvdSwgSUlfU05PT1BfTkVYVCkgPT0gbWUgKXsKKyAgICAgICAgICAgICAgIGxvZ19maWxlKCBBU05PT1BMT0dGSUxFLCBzcHJpbnRmKCAiJXM6ICVPICVPICVPXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGN1dChkdGltZSh0aW1lKCkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lLCB5b3UsIGVudmlyb25tZW50KHlvdSkgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCByZXQgJiYgcXVlcnlfd2l6X2dycChtZSkgPD0gcXVlcnlfd2l6X2dycCh5b3UpICYmCisgICAgICAgICAgICAgIUlTX0RFUFVUWShtZSkgKQorICAgICAgICAgICAgdGVsbF9vYmplY3QoIHlvdSwgIioqKiAiICsgTkFNRShtZSkgKyAiIHNub29wdCBEaWNoIVxuIiApOworCisgICAgICAgIHJldHVybiByZXQ7CisgICAgIH0KKyAgICAgZWxzZSB7CisgICAgICAgIGlmICggKG1lID09IFBPIHx8CisgICAgICAgICAgICAgIHF1ZXJ5X3dpel9ncnAoZ2V0ZXVpZChQTykpID4gcXVlcnlfd2l6X2dycChtZSkgfHwKKyAgICAgICAgICAgICAgKHF1ZXJ5X3dpel9ncnAoZ2V0ZXVpZChQTykpID09IHF1ZXJ5X3dpel9ncnAobWUpICYmCisgICAgICAgICAgICAgIGVmdW46OmludGVyYWN0aXZlX2luZm8oUE8sIElJX1NOT09QX05FWFQpID09IG1lKSkgJiYgc25vb3BlcjAgKXsKKyAgICAgICAgICAgIGlmICggIUlTX0RFUFVUWShtZSkgKXsKKyAgICAgICAgICAgICAgIGxvZ19maWxlKCBTTk9PUExPR0ZJTEUsIHNwcmludGYoICIlczogJU8gJU8gJU8gKk9GRipcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExjdXQoZHRpbWUodGltZSgpKSksIG1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjApICksCisgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAgKTsKKworICAgICAgICAgICAgICAgIENITUFTVEVSLT5zZW5kKCAiU25vb3AiLCBtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoICIlcyAqT0ZGKiAlcyAoJU8pLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKG1lKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHNub29wZXIwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIwKSApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgbG9nX2ZpbGUoIEFTTk9PUExPR0ZJTEUsIHNwcmludGYoICIlczogJU8gJU8gJU8gKk9GRipcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMY3V0KGR0aW1lKHRpbWUoKSkpLCBtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjApICksCisgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGVmdW46OnNub29wKG1lKTsKKyAgICAgICAgfQorICAgICB9CisgICAgIHJldHVybiAwOworfQorCisKKworLy8gKiBFbXVsYXRpb24gZGVzICdhbHRlbicgZXhwbG9kZSBkdXJjaCBkYXMgbmV1ZQorc3RyaW5nICpvbGRfZXhwbG9kZShzdHJpbmcgc3RyLCBzdHJpbmcgZGVsKSB7CisgIGludCBzLCB0OworICBzdHJpbmcgKnN0cnM7CisKKyAgaWYgKCFzdHJpbmdwKHN0cikpIHsKKyAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKAorICAgICAgICAgIkludmFsaWQgYXJndW1lbnQgMSB0byBvbGRfZXhwbG9kZSgpISBFeHBlY3RlZCA8c3RyaW5nPiwgZ290OiAiCisgICAgICAgICAiJS4zME9cbiIsc3RyKSk7CisgIH0KKyAgaWYgKCFzdHJpbmdwKGRlbCkpIHsKKyAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKAorICAgICAgICAgIkludmFsaWQgYXJndW1lbnQgMiB0byBvbGRfZXhwbG9kZSgpISBFeHBlY3RlZCA8c3RyaW5nPiwgZ290OiAiCisgICAgICAgICAiJS4zME9cbiIsZGVsKSk7CisgIH0KKyAgaWYoZGVsID09ICIiKQorICAgIHJldHVybiAoe3N0cn0pOworICBzdHJzPWVmdW46OmV4cGxvZGUoc3RyLCBkZWwpOworICB0PXNpemVvZihzdHJzKS0xOworICB3aGlsZShzPD10ICYmIHN0cnNbcysrXSA9PSAiIik7cy0tOworICB3aGlsZSh0Pj0wICYmIHN0cnNbdC0tXSA9PSAiIik7dCsrOworICBpZihzPD10KQorICAgIHJldHVybiBzdHJzW3MuLnRdOworICByZXR1cm4gKHt9KTsKK30KKworaW50IGZpbGVfdGltZShzdHJpbmcgcGF0aCkgeworICBtaXhlZCAqdjsKKworICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICBpZiAoc2l6ZW9mKHY9Z2V0X2RpcihwYXRoLEdFVERJUl9EQVRFUykpKSByZXR1cm4gdlswXTsKKyAgcmV0dXJuKDApOyAvL3NvbnN0Cit9CisKKy8vICogQmVpIDUwayBHcm9lc3NlIExvZy1GaWxlIHJvdGllcmVuCit2YXJhcmdzIGludCBsb2dfZmlsZShzdHJpbmcgZmlsZSwgc3RyaW5nIHR4dCwgaW50IHNpemVfdG9fYnJlYWspIHsKKyAgbWl4ZWQgKnN0OworCisgIGZpbGU9Ii9sb2cvIitmaWxlOworICBmaWxlPWltcGxvZGUoKGVmdW46OmV4cGxvZGUoZmlsZSwiLyIpLSh7Ii4uIn0pKSwiLyIpOworLy8gIHRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJqb2YiKSxzcHJpbnRmKCJMT0cgRklMRTogJU8gLT4gJU9cbiIscHJldmlvdXNfb2JqZWN0KCksZmlsZSkpOworICBpZiAoIWZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjpjYWxsX290aGVyLFBPKSwic2VjdXJlL21hc3RlciIsLy8nKQorICAgICAgICAgICAgICAidmFsaWRfd3JpdGUiLGZpbGUsZ2V0ZXVpZChQTyksImxvZ19maWxlIixQTykpCisgICAgICByZXR1cm4gMDsKKyAgaWYgKCBzaXplX3RvX2JyZWFrID49IDAgJiAoCisgICAgICBzaXplb2Yoc3QgPSBnZXRfZGlyKGZpbGUsMikgKSAmJiBzdFswXSA+PSAoc2l6ZV90b19icmVha3xNQVhfTE9HX1NJWkUpKSkKKyAgICAgIGNhdGNoKHJlbmFtZShmaWxlLCBmaWxlICsgIi5vbGQiKTtwdWJsaXNoKTsgLyogTm8gcGFuaWMgaWYgZmFpbHVyZSAqLworICByZXR1cm4od3JpdGVfZmlsZShmaWxlLHR4dCkpOworfQorCisvLyAqIE1hZ2llci1MZXZlbCBhYmZyYWdlbgoraW50IHF1ZXJ5X3dpel9sZXZlbChtaXhlZCBwbGF5ZXIpIHsKKyAgcmV0dXJuIChpbnQpIi9zZWN1cmUvbWFzdGVyIi0+cXVlcnlfd2l6X2xldmVsKHBsYXllcik7Cit9CisKKyNpZmRlZiBfX0FMSVNUU19fCisvLyAqIEVsZW1lbnQgYXVzIEFsaXN0IGxvZXNjaGVuIChieSBrZXkpCittaXhlZCAqcmVtb3ZlX2FsaXN0KG1peGVkIGtleSxtaXhlZCAqYWxpc3QpCit7CisgIGludCBpLGo7CisKKyAgaWYgKCFwb2ludGVycChhbGlzdCkgfHwgIXNpemVvZihhbGlzdCkpCisgICAgcmV0dXJuIGFsaXN0OworICBpZiAoIXBvaW50ZXJwKGFsaXN0WzBdKSkKKyAgeworICAgIGlmICgoaT1hc3NvYyhrZXksYWxpc3QpKTwwKQorICAgICAgcmV0dXJuIGFsaXN0OworICAgIHJldHVybiBhbGlzdFswLi5pLTFdK2FsaXN0W2krMS4uXTsKKyAgfQorICBpID0gYXNzb2Moa2V5LGFsaXN0WzBdKTsKKyAgaWYgKChpPWFzc29jKGtleSxhbGlzdFswXSkpPDApCisgICAgcmV0dXJuIGFsaXN0OworICBhbGlzdD1hbGlzdFswLi5dOworICBmb3IgKGo9c2l6ZW9mKGFsaXN0KS0xO2o+PTA7ai0tKQorICAgIGFsaXN0W2pdPWFsaXN0W2pdWzAuLmktMV0rYWxpc3Rbal1baSsxLi5dOworICByZXR1cm4gYWxpc3Q7Cit9CisKKy8vICogRWxlbWVudCBhdXMgQWxpc3QgbG9lc2NoZW4gKGJ5IHBvcykKK21peGVkICpleGNsdWRlX2FsaXN0KGludCBpLG1peGVkICphbGlzdCkKK3sKKyAgaW50IGo7CisgIGlmICghcG9pbnRlcnAoYWxpc3QpIHx8ICFzaXplb2YoYWxpc3QpIHx8IGk8MCkKKyAgICByZXR1cm4gYWxpc3Q7CisgIGlmICghcG9pbnRlcnAoYWxpc3RbMF0pKQorICAgIHJldHVybiBhbGlzdFswLi5pLTFdK2FsaXN0W2krMS4uXTsKKyAgYWxpc3Q9YWxpc3RbMC4uXTsgLyogQ3JlYXRlIFBIWVNJQ0FMIGNvcHkgb2YgYWxpc3QgKi8KKyAgZm9yIChqPXNpemVvZihhbGlzdCktMTtqPj0wO2otLSkKKyAgICBhbGlzdFtqXT1hbGlzdFtqXVswLi5pLTFdK2FsaXN0W2pdW2krMS4uXTsKKyAgcmV0dXJuIGFsaXN0OyAvKiBvcmRlcl9hbGlzdCBpcyBOT1QgbmVjZXNzYXJ5IC0gc2VlIC9kb2MvTFBDL2FsaXN0ICovCit9CisjZW5kaWYgLy8gX19BTElTVFNfXworCisvLyAqIEdlcm1hbiB2ZXJzaW9uIG9mIGN0aW1lKCkKKyNkZWZpbmUgVEFHRSAoeyJTb24iLCJNb24iLCJEaWUiLCJNaXQiLCJEb24iLCJGcmUiLCJTYW0ifSkKKyNkZWZpbmUgTU9OQVRFICh7IkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1haSIsIkp1biIsIkp1bCIsIkF1ZyIsXAorICAgICAgICAgICAgICAgICAiU2VwIiwiT2t0IiwiTm92IiwiRGV6In0pCitzdHJpbmcgZHRpbWUoaW50IHdhbm4pIHsKKyAgCisgIGlmICh3YW5uID09IGR0aW1lX2NhY2hlWzBdKQorICAgIHJldHVybihkdGltZV9jYWNoZVsxXSk7CisKKyAgaW50ICpsdCA9IGxvY2FsdGltZSh3YW5uKTsKKyAgcmV0dXJuIHNwcmludGYoIiVzLCAlMmQuICVzICVkLCAlMDJkOiUwMmQ6JTAyZCIsCisgICAgICBUQUdFW2x0W1RNX1dEQVldXSwgbHRbVE1fTURBWV0sIE1PTkFURVtsdFtUTV9NT05dXSwgCisgICAgICBsdFtUTV9ZRUFSXSxsdFtUTV9IT1VSXSwgbHRbVE1fTUlOXSwgbHRbVE1fU0VDXSk7Cit9CisKKy8vIHdlbm4gc3RyZnRpbWUgaW0gRHJpdmVyIG5pY2h0IGV4aXN0aWVydCwgaXN0IGRpZXMgaGllciBlaW4gQWxpYXMgYXVmIGR0aW1lKCksCisvLyB6d2FyIHN0aW1tdCBkYXMgRm9ybWF0IGRhbm4gbmljaHQsIGFiZXIgZGllIE11ZGxpYiBidWdndCBuaWNodCB1bmQgc2NocmVpYnQKKy8vIGVpbiBvcmRlbnRsaWNoZXMgRGF0dW0vVWhyemVpdC4KKyNpZiAhX19FRlVOX0RFRklORURfXyhzdHJmdGltZSkKK3ZhcmFyZ3Mgc3RyaW5nIHN0cmZ0aW1lKG1peGVkIGZtdCwgaW50IGNsb2NrLCBpbnQgbG9jYWxpemVkKSB7CisgIGlmIChpbnRwKGNsb2NrKSAmJiBjbG9jayA+PSAwKQorICAgIHJldHVybiBkdGltZShjbG9jayk7CisgIGVsc2UgaWYgKGludHAoZm10KSAmJiBmbXQgPj0gMCkKKyAgICByZXR1cm4gZHRpbWUoZm10KTsKKyAgCisgIHJldHVybiBkdGltZSh0aW1lKCkpOworfQorI2VuZGlmIC8vIV9fRUZVTl9ERUZJTkVEX18oc3RyZnRpbWUpCisKKy8vICogU2h1dGRvd24gbWl0IHp1c2FldHpsaWNoZW0gbG9nZ2luZworbm9tYXNrIGludCBzaHV0ZG93bihzdHJpbmcgcmVhc29uKQoreworICBzdHJpbmcgbmFtZTsKKyAgc3RyaW5nIG9ibmFtZTsKKyAgc3RyaW5nIG91dHB1dDsKKworICBpZiAoIXJlYXNvbikKKyAgICByZXR1cm4gMDsKKyAgaWYgKCAhQVJDSF9TRUNVUklUWSAmJiBnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpIT1ST09USUQgJiYKKyAgICAgICAgICBvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSkhPSIvb2JqL3NodXQiICkKKyAgeworICAgIHdyaXRlKCJZb3UgaGF2ZSBubyBwZXJtaXNzaW9uIHRvIHNodXQgZG93biB0aGUgZ2FtZWRyaXZlciFcbiIpOworICAgIHJldHVybiAwOworICB9CisgIGlmICgodGhpc19pbnRlcmFjdGl2ZSgpKSYmKG5hbWU9Z2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSkpKQorICB7CisgICAgbmFtZT1jYXBpdGFsaXplKG5hbWUpOworICAgIGZpbHRlcih1c2VycygpLCMndGVsbF9vYmplY3QsLy8nCisgICAgICAgICAgICAgICBjYXBpdGFsaXplKG5hbWUpKyIgZmFlaHJ0IGRhcyBTcGllbCBoZXJ1bnRlciFcbiIpOworICB9CisgIGVsc2UKKyAgICBuYW1lPSJBTk9OWU1PVVMiOworICBpZiAocHJldmlvdXNfb2JqZWN0KCkpIG9ibmFtZT1jYXBpdGFsaXplKGdldHVpZChwcmV2aW91c19vYmplY3QoKSkpOworICBvdXRwdXQ9bmFtZTsKKyAgaWYgKG9ibmFtZSAmJiBuYW1lIT1vYm5hbWUpIG91dHB1dD1vdXRwdXQrIiAoIitvYm5hbWUrIikiOworICBpZiAocHJldmlvdXNfb2JqZWN0KCkmJm9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKT09Ii9vYmovc2h1dCIpeworICAgIG91dHB1dCs9IiBmYWVocnQgZGFzIFNwaWVsIHZpYSBBcm1hZ2VkZG9uIGhlcnVudGVyLlxuIjsKKyAgICBvdXRwdXQ9ZHRpbWUodGltZSgpKSsiOiAiK291dHB1dDsKKyAgICBsb2dfZmlsZSgiR0FNRV9MT0ciLG91dHB1dCsiXG4iLC0xKTsKKyAgICBlZnVuOjpzaHV0ZG93bigpOworICAgIHJldHVybiAxOworICB9CisgIG91dHB1dD1jdGltZSh0aW1lKCkpKyI6ICIrb3V0cHV0KyIgZmFlaHJ0IGRhcyBTcGllbCBoZXJ1bnRlci5cbiI7CisgIG91dHB1dCs9IiAgICBHcnVuZDogIityZWFzb247CisgIGxvZ19maWxlKCJHQU1FX0xPRyIsb3V0cHV0KyJcbiIsLTEpOworICBlZnVuOjpzaHV0ZG93bigpOworICByZXR1cm4gMTsKK30KKworLy8gKiBsb3dlcmNoYXIKKworaW50IGxvd2VyY2hhcihpbnQgY2hhcikgeworICBpZiAoY2hhcjwnQScgfHwgY2hhcj4nWicpIHJldHVybiBjaGFyOworICByZXR1cm4gY2hhciszMjsKK30KKworLy8gKiB1cHBlcnN0cmluZworCitzdHJpbmcgdXBwZXJzdHJpbmcoc3RyaW5nIHMpCit7CisjaWYgX19FRlVOX0RFRklORURfXyh1cHBlcl9jYXNlKQorICByZXR1cm4odXBwZXJfY2FzZShzKSk7CisjZWxzZQorICBpbnQgaTsKKyAgaWYgKCFzdHJpbmdwKHMpKSByZXR1cm4gMDsKKyAgZm9yIChpPXNpemVvZihzKS0xO2k+PTA7aS0tKSBzW2ldPSgoc1tpXTwnYSd8fHNbaV0+J3onKT9zW2ldOnNbaV0tMzIpOworICByZXR1cm4gczsKKyNlbmRpZgorfQorCisvLyAqIGxvd2Vyc3RyaW5nCisKK3N0cmluZyBsb3dlcnN0cmluZyhzdHJpbmcgcykKK3sKKyAgaWYgKCFzdHJpbmdwKHMpKSByZXR1cm4gMDsKKyAgcmV0dXJuIGxvd2VyX2Nhc2Uocyk7Cit9CisKKworLy8gKiBHRCB2ZXJzaW9uCitzdHJpbmcgdmVyc2lvbigpCit7CisgIHJldHVybiBfX1ZFUlNJT05fXzsKK30KKworLy8gKiBicmVha19zdHJpbmcKKy8vIHN0cmV0Y2goKSAtLSBzdHJldGNoIGEgbGluZSB0byBmaWxsIGEgZ2l2ZW4gd2lkdGggCitwcml2YXRlIHN0cmluZyBzdHJldGNoKHN0cmluZyBzLCBpbnQgd2lkdGgpIHsKKyAgaW50IGxlbj1zaXplb2Yocyk7CisgIGlmIChsZW49PXdpZHRoKSByZXR1cm4gczsKKworICAvLyByZWluZSBMZWVyemVpbGVuLCBkaXJla3QgenVydWVja2dlYmVuCisgIHN0cmluZyB0cmltbWVkPXRyaW0ocyxUUklNX0xFRlQsIiAiKTsKKyAgaWYgKHRyaW1tZWQ9PSIiKSByZXR1cm4gczsgCisgIGludCBzdGFydF9zcGFjZXMgPSBsZW4gLSBzaXplb2YodHJpbW1lZCk7CisKKyAgc3RyaW5nKiB3b3JkcyA9IGV4cGxvZGUodHJpbW1lZCwgIiAiKTsKKyAgLy8gZGVyIGxldHp0ZSBrcmllZ3Qga2VpbmUgU3BhY2VzCisgIGludCB3b3JkX2NvdW50PXNpemVvZih3b3JkcykgLSAxOworICAvLyB3ZW5uIFplaWxlIG51ciBhdXMgZWluZW0gV29ydCwgd2lyZCBkYXMgV29ydCB6dXJ1ZWNrZ2VnZWJlbgorICBpZiAoIXdvcmRfY291bnQpCisgICAgcmV0dXJuICIgIipzdGFydF9zcGFjZXMgKyB3b3Jkc1swXTsKKworICBpbnQgc3BhY2VfY291bnQgPSB3aWR0aCAtIGxlbjsKKworICBpbnQgc3BhY2VfcGVyX3dvcmQ9KHdvcmRfY291bnQrc3BhY2VfY291bnQpIC8gd29yZF9jb3VudDsKKyAgLy8gQW56LldvZXJ0ZXIgbWl0IFp1c2F0ei1TcGFjZQorICBpbnQgcmVzdD0od29yZF9jb3VudCtzcGFjZV9jb3VudCkgJSB3b3JkX2NvdW50OyAKKyAgLy8gUmVzdC1TcGFjZXMgVmVydGVpbGVuCisgIGZvcmVhY2ggKGludCBwb3MgOiByZXN0KSB3b3Jkc1twb3NdKz0iICI7CisgIHJldHVybiAoIiAiKnN0YXJ0X3NwYWNlcykgKyBpbXBsb2RlKCB3b3JkcywgIiAiKnNwYWNlX3Blcl93b3JkICk7Cit9CisKKy8vIGF1cyBHZXNjaHdpbmRpZ2tlaXRzZ3J1ZW5kZW4gaGF0IGRlciBCbG9ja3NhdHogZnVlciBicmVha19zdHJpbmcgZWluZQorLy8gZWlnZW5lIEZ1bmt0aW9uIGJla29tbWVuOgorcHJpdmF0ZSB2YXJhcmdzIHN0cmluZyBibG9ja19zdHJpbmcoc3RyaW5nIHMsIGludCB3aWR0aCwgaW50IGZsYWdzKSB7CisgIC8vIHdlbm4gQlNfTEVBVkVfTVlfTEZTLCBhYmVyIGtlaW4gQlNfTk9fUEFSSU5ERU5ULCBkYW5uIHdlcmRlbiBaZWlsZW4gbWl0CisgIC8vIGVpbmVtIExlZXJ6ZWljaGVuIGJlZ29ubmVuLgorICAvLyBCVFc6IFdlbm4gIUJTX0xFQVZFX01ZX0xGUywgaGF0IGRlciBBdWZydWZlciBiZXJlaXRzIGFsbGUgXG4gZHVyY2ggIiAiCisgIC8vIGVyc2V0enQuCisgIGlmICggKGZsYWdzICYgQlNfTEVBVkVfTVlfTEZTKQorICAgICAgJiYgIShmbGFncyAmIEJTX05PX1BBUklOREVOVCkpCisgIHsKKyAgICAgIHMgPSAiICIrcmVncmVwbGFjZShzLCJcbiIsIlxuICIsMSk7CisgIH0KKworICAvLyBzcHJpbnRmIGZ1ZWxsdCBkaWUgbGV0enRlIFplaWxlIGF1ZiBkaWUgRmVsZGJyZWl0ZSAoaGllciBhbHNvCisgIC8vIFplaWxlbmJyZWl0ZSkgbWl0IEZ1ZWxsemVpY2hlbiBhdWYsIHdlbm4gc2llIE5JQ0hUIG1pdCBcbiB1bWdlYnJvY2hlbgorICAvLyBpc3QuIEVzIHdpcmQgYW4gZGllIGxldHp0ZSBaZWlsZSBhYmVyIGtlaW4gWmVpbGVudW1icnVjaCBhbmdlaGFlbmd0LgorICAvLyBFaWdlbnRsaWNoIGlzdCBkYXMgQXVmZnVlbGxlbiBkb29mLCBhYmVyIHZlcm11dGxpY2ggaXN0IGVzIHVubm9ldGlnLCBlcworICAvLyB3aWVkZXIgcnVlY2tnYWVuZ2lnIHp1IG1hY2hlbi4KKyAgcyA9IHNwcmludGYoICIlLSo9cyIsIHdpZHRoLCBzKTsKKworICBzdHJpbmcgKnRtcD1leHBsb2RlKHMsICJcbiIpOworICAvLyBOdXIgd2VubiBzIG1laHJ6ZWlsaWcgaXN0LCBCbG9ja3NhdHogZHJhdXMgbWFjaGVuLiBEaWUgbGV0enRlIFplaWxlIHdpcmQKKyAgLy8gbmF0dWVybGljaCBuaWNodCBnZWRlaG50LiBTaWUgaXN0IGRhZnVlciBzY2hvbiB2b24gc3ByaW50ZigpIGF1ZmdlZnVlbGx0CisgIC8vIHdvcmRlbi4gQlRXOiBEaWUgbGV0enRlIFplaWxlIGVuZGV0IHUuVS4gbm9jaCBuaWNodCBtaXQgZWluZW0gXG4gKGJ6dy4KKyAgLy8gbnVyIGRhbm4sIHdlbm4gQlNfTEVBVkVfTVlfTEZTIHVuZCBkZXIgdWViZXJnZWJlbmUgVGV4dCBzY2hvbiBuZW4gXG4gYW0KKyAgLy8gRW5kZSBkZXIgbGV0enRlbiBaZWlsZSBoYXQpLCBkYXMgbWFjaHQgZGVyIEF1ZnJ1ZmVyLi4uCisgIGlmIChzaXplb2YodG1wKSA+IDEpCisgICAgcmV0dXJuIGltcGxvZGUoIG1hcCggdG1wWzAuLjwyXSwgIydzdHJldGNoLyonKi8sIHdpZHRoICksICJcbiIgKSAKKyAgICAgICsgIlxuIiArIHRtcFs8MV07CisKKyAgcmV0dXJuIHM7Cit9CisKK3B1YmxpYyB2YXJhcmdzIHN0cmluZyBicmVha19zdHJpbmcoc3RyaW5nIHMsIGludCB3LCBtaXhlZCBpbmRlbnQsIGludCBmbGFncykKK3sKKyAgICBpZiAoICFzIHx8IHMgPT0gIiIgKSByZXR1cm4gIiI7CisKKyAgICBpZiAoICF3ICkgdz03ODsKKworICAgIGlmKCBpbnRwKGluZGVudCkgKQorICAgICAgIGluZGVudCA9IGluZGVudCA/ICIgIippbmRlbnQgOiAiIjsKKworICAgIGludCBpbmRlbnRsZW49c3RyaW5ncChpbmRlbnQpID8gc2l6ZW9mKGluZGVudCkgOiAwOworCisgICAgaWYgKGluZGVudGxlbj53KSB7CisgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiYnJlYWtfc3RyaW5nOiBpbmRlbnQgbG9uZ2VyICVkIHRoYW4gd2lkdGggJWRcbiIsCisgICAgICAgICAgICAgICAgICBpbmRlbnRsZW4sdykpOworICAgICAgLy8gdz0oKGluZGVudGxlbi93KSsxKSp3OworICAgIH0KKworICAgIGlmICghKGZsYWdzICYgQlNfTEVBVkVfTVlfTEZTKSkgCisgICAgICBzPXJlZ3JlcGxhY2UoIHMsICJcbiIsICIgIiwgMSApOworCisgICAgaWYgKCBmbGFncyAmIEJTX1NJTkdMRV9TUEFDRSApCisgICAgICAgcyA9IHJlZ3JlcGxhY2UoIHMsICIoXnxcbnwgKSAgKiIsICJcXDEiLCAxICk7CisgCisgICAgc3RyaW5nIHByZWZpeD0iIjsKKyAgICBpZiAoaW5kZW50bGVuICYmIGZsYWdzICYgQlNfUFJFUEVORF9JTkRFTlQpIHsKKyAgICAgIGlmIChpbmRlbnRsZW4rc2l6ZW9mKHMpID4gdyB8fCAKKyAgICAgICAgIChmbGFncyAmIEJTX0xFQVZFX01ZX0xGUykgJiYgc3Ryc3RyKHMsIlxuIik+LTEpIHsKKyAgICAgICBwcmVmaXg9aW5kZW50KyJcbiI7CisgICAgICAgaW5kZW50PShmbGFncyAmIEJTX05PX1BBUklOREVOVCkgPyAiIiA6ICIgIjsKKyAgICAgICBpbmRlbnRsZW49c2l6ZW9mKGluZGVudCk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCBmbGFncyAmIEJTX0JMT0NLICkgeworICAgICAgLyoKKyAgICAgICAgICAgcyA9IGltcGxvZGUoIG1hcCggZXhwbG9kZSggcywgIlxuIiApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMnYmxvY2tfc3RyaW5nLCB3LCBpbmRlbnRsZW4sIGZsYWdzKSwKKyAgICAgICAgICAgICAgICAgICAgICAiIiApOworICAgICAgKi8KKyAgICAgIHMgPSBibG9ja19zdHJpbmcoIHMgLCB3IC0gaW5kZW50bGVuLCBmbGFncyApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHMgPSBzcHJpbnRmKCIlLTEuKj1zIix3LWluZGVudGxlbixzKTsKKyAgICB9CisgICAgaWYgKCBzWzwxXSAhPSAnXG4nICkgcyArPSAiXG4iOworCisgICAgaWYgKCAhaW5kZW50bGVuICkgcmV0dXJuIHByZWZpeCArIHM7CisgICAgCisgICAgc3RyaW5nIGluZGVudDIgPSAoIGZsYWdzICYgQlNfSU5ERU5UX09OQ0UgKSA/ICgiICIqaW5kZW50bGVuKSA6aW5kZW50OworICAgICAgCisgICAgcmV0dXJuIHByZWZpeCArIGluZGVudCArIAorICAgICAgcmVncmVwbGFjZSggc1swLi48Ml0sICJcbiIsICJcbiIraW5kZW50MiwgMSApICsgIlxuIjsKKyAgICAgIC8qCisgICAgICAgc3RyaW5nICpidWY7CisKKyAgICAgICBidWYgPSBleHBsb2RlKCBzLCAiXG4iICk7CisgICAgICAgcmV0dXJuIHByZWZpeCArIGluZGVudCArIGltcGxvZGUoIGJ1ZlswLi48Ml0sICJcbiIraW5kZW50MiApICsgYnVmWzwxXSArICJcbiI7CisgICAgICAqLworfQorCisvLyAqIEVsZW1lbnRlIGF1cyBtYXBwaW5nIGxvZXNjaGVuIC0gbWFwcGluZyB2b3JoZXIga29waWVyZW4KKworbWFwcGluZyBtX2NvcHlfZGVsZXRlKG1hcHBpbmcgbSwgbWl4ZWQga2V5KSB7CisgIHJldHVybiBtX2RlbGV0ZShjb3B5KG0pLCBrZXkpOworfQorCisvLyAqIHRpbWVzCitpbnQgbGFzdF9yZWJvb3RfdGltZSgpCit7CisgIHJldHVybiBfX0JPT1RfVElNRV9fOworfQorCitpbnQgZmlyc3RfYm9vdF90aW1lKCkKK3sKKyAgcmV0dXJuIDcwMTUxNzYwMDsKK30KKworaW50IGV4aXN0X2RheXMoKQoreworICByZXR1cm4gKCgodGltZSgpLWZpcnN0X2Jvb3RfdGltZSgpKS84NjQwKSs1KS8xMDsKK30KKworLy8gKiB1cHRpbWUgOikKK3N0cmluZyB1cHRpbWUoKQoreworICBpbnQgdDsKKyAgaW50IHRtcDsKKyAgc3RyaW5nIHM7CisKKyAgdD10aW1lKCktX19CT09UX1RJTUVfXzsKKyAgcz0iIjsKKyAgaWYgKHQ+PTg2NDAwKQorICAgIHMrPXNwcmludGYoIiVkIFRhZyVzLCAiLHRtcD10Lzg2NDAwLCh0bXA9PTE/IiI6ImUiKSk7CisgIGlmICh0Pj0zNjAwKQorICAgIHMrPXNwcmludGYoIiVkIFN0dW5kZSVzLCAiLHRtcD0odD10JTg2NDAwKS8zNjAwLCh0bXA9PTE/IiI6Im4iKSk7CisgIGlmICh0PjYwKQorICAgIHMrPXNwcmludGYoIiVkIE1pbnV0ZSVzIHVuZCAiLHRtcD0odD10JTM2MDApLzYwLCh0bXA9PTE/IiI6Im4iKSk7CisgIHJldHVybiBzK3NwcmludGYoIiVkIFNla3VuZGUlcyIsdD10JTYwLCh0PT0xPyIiOiJuIikpOworfQorCisvLyAqIFdhcyB0dW4gYmVpICdkYW5nbGluZycgbGZ1bi1jbG9zdXJlcyA/Cit2b2lkIGRhbmdsaW5nX2xmdW5fY2xvc3VyZSgpIHsKKyAgcmFpc2VfZXJyb3IoImRhbmdsaW5nIGxmdW4gY2xvc3VyZVxuIik7Cit9CisKKy8vICogU3BlcnJlbiBhdXNzZXIgZnVlciBtYXN0ZXIvc2ltdWxfZWZ1bgorCisjaWYgX19FRlVOX0RFRklORURfXyhzZXRfZW52aXJvbm1lbnQpCitub21hc2sgdm9pZCBzZXRfZW52aXJvbm1lbnQob2JqZWN0IG8xLCBvYmplY3QgbzIpIHsKKyAgcmFpc2VfZXJyb3IoIkF2YWlsYWJsZSBvbmx5IGZvciByb290XG4iKTsKK30KKyNlbmRpZgorCitub21hc2sgdm9pZCBzZXRfdGhpc19wbGF5ZXIob2JqZWN0IHBsKSB7CisgIHJhaXNlX2Vycm9yKCJBdmFpbGFibGUgb25seSBmb3Igcm9vdFxuIik7Cit9CisKKyNpZiBfX0VGVU5fREVGSU5FRF9fKGV4cG9ydF91aWQpCitub21hc2sgdm9pZCBleHBvcnRfdWlkKG9iamVjdCBvYikgeworICByYWlzZV9lcnJvcigiQXZhaWxhYmxlIG9ubHkgZm9yIHJvb3RcbiIpOworfQorI2VuZGlmCisKKy8vICogSmV0enQgYXVjaCBjbG9zdXJlcworaW50IHByb2Nlc3NfZmxhZzsKKworcHVibGljIG5vbWFzayBpbnQgcHJvY2Vzc19jYWxsKCkKK3sKKyAgaWYgKHByb2Nlc3NfZmxhZz4wKQorICAgIHJldHVybiBwcm9jZXNzX2ZsYWc7CisgIGVsc2UgcmV0dXJuKDApOworfQorCitwcml2YXRlIG5vbWFzayBzdHJpbmcgX3Byb2Nlc3Nfc3RyaW5nKHN0cmluZyBzdHIsb2JqZWN0IHBvKSB7CisgICAgICAgICAgICAgIHNldF90aGlzX29iamVjdChwbyk7CisgICAgICAgICAgICAgIHJldHVybihlZnVuOjpwcm9jZXNzX3N0cmluZyhzdHIpKTsKK30KKworbm9tYXNrIHN0cmluZyBwcm9jZXNzX3N0cmluZyggbWl4ZWQgc3RyICkKK3sKKyAgc3RyaW5nIHRtcCwgZXJyOworICBpbnQgZmxhZzsgCisKKyAgaWYgKCBjbG9zdXJlcChzdHIpICkgeworICAgICAgc2V0X3RoaXNfb2JqZWN0KCBwcmV2aW91c19vYmplY3QoKSApOworICAgICAgcmV0dXJuIGZ1bmNhbGwoc3RyKTsKKyAgfQorICBlbHNlIGlmIChzdHI9PTApCisgICAgICByZXR1cm4oKHN0cmluZylzdHIpOworICBlbHNlIGlmICggIXN0cmluZ3Aoc3RyKSApIHsKKyAgICAgIHJldHVybiB0b19zdHJpbmcoc3RyKTsKKyAgfQorCisgIGlmICggIShmbGFnID0gcHJvY2Vzc19mbGFnID4gdGltZSgpIC0gNjApKSAgICAgICAgICAgICAgICAgICAgIAorICAgICAgcHJvY2Vzc19mbGFnPXRpbWUoKTsKKworICBlcnIgPSBjYXRjaCh0bXAgPSBmdW5jYWxsKCMnX3Byb2Nlc3Nfc3RyaW5nLHN0cixwcmV2aW91c19vYmplY3QoKSk7IHB1Ymxpc2gpOworCisgIGlmICggIWZsYWcgKQorICAgIHByb2Nlc3NfZmxhZz0wOworCisgIGlmIChlcnIpIHsKKyAgICAvLyBWZXJhcmJlaXR1bmcgYWJicmVjaGVuCisgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICByYWlzZV9lcnJvcihlcnIpOworICB9CisgIHJldHVybiB0bXA7Cit9CisKKy8vICdta2RpciAtcCcgLSBlcnpldWd0IGVpbmUga29tcGxldHRlIEhpZXJhcmNoaWUgdm9uIFZlcnplaWNobmlzc2VuLgorLy8gd2VubiBkYXMgVmVyemVpY2huaXMgYW5nZWxlZ3Qgd3VyZGUgb2RlciBzY2hvbiBleGlzdGllcnQsIHdpcmQgMQorLy8genVydWVja2dlbGllZmVydCwgc29uc3QgMC4KKy8vIFdpcmZ0IGVpbmVuIEZlaGxlciwgd2VubiBkYXMgYW5nZWJlbmUgVmVyemVpY2huaXMgbmljaHQgYWJzb2x1dCBpc3QhCitwdWJsaWMgaW50IG1rZGlycChzdHJpbmcgZGlyKSB7CisgIC8vIHdlbm4gZXMgbnVyIGtlaW5lbiBmdWVocmVuZGVuIC8gZ2lidCwgaXN0IGRhcyBlaW4gRmVobGVyLgorICBpZiAoc3Ryc3RyKGRpciwgIi8iKSAhPSAwKQorICAgIHJhaXNlX2Vycm9yKCJta2RpcnAoKTogUGZhZCBpc3QgbmljaHQgYWJzb2x1dGUuXG4iKTsKKyAgLy8gY3V0IG9mZiB0cmFpbGluZyAvLi4uCisgIGlmIChkaXJbPDFdPT0nLycpCisgICAgICBkaXIgPSBkaXJbMC4uPDJdOworCisgIGludCBmc3RhdCA9IGZpbGVfc2l6ZShkaXIpOworICAvLyB3ZW5uIGVzIHNjaG9uIGV4aXN0aWVydCwgdHVuIHdpciBlaW5mYWNoIHNvLCBhbHMgaGFldHRlbiB3aXIgZXMgYW5nZWxlZ3QuCisgIGlmIChmc3RhdCA9PSBGU0laRV9ESVIpCisgICAgcmV0dXJuIDE7CisgIC8vIHdlbm4gc2Nob24gbmUgRGF0ZWkgZXhpc3RpZXJ0LCBnZWh0IGVzIG5pY2h0LgorICBpZiAoZnN0YXQgIT0gRlNJWkVfTk9GSUxFKQorICAgIHJldHVybiAwOworICAvLyB3ZW5uIGVzIG51ciBlaW5lbiAvIGdpYnQgKGRlbiBmdWVocmVuZGVuKSwgZGFubiBpc3QgZXMgZWluCisgIC8vIHRvcGxldmVsLXZlcnplaWNobmlzLCB3YXMgZGlyZWt0IGFuZ2VsZWd0IHdpcmQuCisgIGlmIChzdHJyc3RyKGRpciwiLyIpPT0wKSB7CisgICAgcmV0dXJuIGZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjpta2RpciwgcHJldmlvdXNfb2JqZWN0KCkpLCBkaXIpOworICB9CisKKyAgLy8gbWtkaXIoKSBuaWNodCBkaXJla3QgcnVmZW4sIHNvbmRlcm4gdm9yaGVyIGFscyBjbG9zdXJlIGFucyBhdWZydWZlbmRlCisgIC8vIE9iamVrdCBiaW5kZW4uIFNvbnN0IGxhZXVmdCBkaWUgUmVjaHRlcHJ1ZWZ1bmcgaW4gdmFsaWRfd3JpdGUoKSBpbSBNYXN0ZXIKKyAgLy8gdW50ZXIgZGVyIEFubmFobWUsIGRhc3MgZGllIHNpbXVsX2VmdW4uYyBtaXQgaWhyZXIgcm9vdCBpZCB3YXMgd2lsbC4KKworICAvLyBqZXR6dCByZWt1cnNpdiBkaWUgVmVyemVpY2huaXNoaWVyYXJjaGllIGFubGVnZW4uIFdlbm4gZGFzIGVyZm9sZ3JlaWNoCisgIC8vIGlzdCwgZGFubiBrb2VubmVuIHdpciBqZXR6dCBtaXQgbWtkaXIgZGFzIHRpZWZzdGUgVmVyemVpY2huaXMgYW5sZWdlbgorICBpZiAobWtkaXJwKGRpclswLi5zdHJyc3RyKGRpciwiLyIpLTFdKSA9PSAxKQorICAgIHJldHVybiBmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6bWtkaXIsIHByZXZpb3VzX29iamVjdCgpKSwgZGlyKTsKK30KKworCisvLyAqIFByb3BlcnRpZXMgZ2dmcy4gbWl0c3BlaWNoZXJuCittaXhlZCBzYXZlX29iamVjdChtaXhlZCBuYW1lKQoreworICBtYXBwaW5nIHByb3BlcnRpZXM7CisgIG1hcHBpbmcgc2F2ZTsKKyAgbWl4ZWQgaW5kZXgsIHJlczsKKyAgaW50IGk7CisKKyAgLy8gbnVyIFN0cmluZ3MgdW5kIDAgenVsYXNzZW4KKyAgaWYgKCghc3RyaW5ncChuYW1lKSB8fCAhc2l6ZW9mKG5hbWUpKSAmJiAKKyAgICAgICghaW50cChuYW1lKSB8fCBuYW1lIT0wKSkgeworICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoCisgICAgICAgICAiT25seSBub24tZW1wdHkgc3RyaW5ncyBhbmQgMCBtYXkgYmUgdXNlZCBhcyBmaWxlbmFtZSBpbiAiCisgICAgICAgICAic2VmdW46OnNhdmVfb2JqZWN0KCkhIEFyZ3VtZW50IHdhcyAlT1xuIixuYW1lKSk7CisgIH0KKworICBzYXZlID0gbV9hbGxvY2F0ZSgwLCAyKTsKKyAgcHJvcGVydGllcyA9IChtYXBwaW5nKXByZXZpb3VzX29iamVjdCgpLT5RdWVyeVByb3BlcnRpZXMoKTsKKworICBpZihtYXBwaW5ncChwcm9wZXJ0aWVzKSkKKyAgeworICAgIC8vIGRlbGV0ZSBhbGwgZW50cmllcyBpbiBtYXBwaW5nIHByb3BlcnRpZXMgd2l0aG91dCBTQVZFIGZsYWchCisgICAgaW5kZXggPSBtX2luZGljZXMocHJvcGVydGllcyk7CisgICAgZm9yKGkgPSBzaXplb2YoaW5kZXgpLTE7IGk+PTA7aS0tKQorICAgIHsKKyAgICAgIGlmKHByb3BlcnRpZXNbaW5kZXhbaV0sIEZfTU9ERV0gJiBTQVZFKQorICAgICAgeworICAgICAgIHNhdmVbaW5kZXhbaV1dID0gcHJvcGVydGllc1tpbmRleFtpXV07CisgICAgICAgc2F2ZVtpbmRleFtpXSwgRl9NT0RFXSA9CisgICAgICAgcHJvcGVydGllc1tpbmRleFtpXSwgRl9NT0RFXSAmCisgICAgICAgICAgICAgICAgICAgICh+KFNFVE1OT1RGT1VORHxRVUVSWU1OT1RGT1VORHxRVUVSWUNBQ0hFRHxTRVRDQUNIRUQpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZSBzYXZlID0gKFtdKTsKKworICAvLyBzYXZlIG9iamVjdCEKKyAgcHJldmlvdXNfb2JqZWN0KCktPl9zZXRfc2F2ZV9kYXRhKHNhdmUpOworICAvLyBmb3JtYXQ6IHdpZSBkZWZpbmllcnQgaW4gY29uZmlnLmgKKyAgaWYgKHN0cmluZ3AobmFtZSkpCisgICAgcmVzID0gZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46OnNhdmVfb2JqZWN0LCBwcmV2aW91c19vYmplY3QoKSksIG5hbWUsCisgICAgICAgX19MSUJfX1NBVkVfRk9STUFUX1ZFUlNJT05fXyk7CisgIGVsc2UKKyAgICByZXMgPSBmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6c2F2ZV9vYmplY3QsIHByZXZpb3VzX29iamVjdCgpKSwKKyAgICAgICBfX0xJQl9fU0FWRV9GT1JNQVRfVkVSU0lPTl9fKTsKKyAgcHJldmlvdXNfb2JqZWN0KCktPl9zZXRfc2F2ZV9kYXRhKDApOworCisjaWZkZWYgSU9TVEFUUworICAvLyBTdGF0cy4uLgorICBzdHJ1Y3QgaW9zdGF0X3Mgc3RhdCA9ICg8aW9zdGF0X3M+KTsKKyAgc3RhdC0+b25hbWUgPSBvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSk7CisgIHN0YXQtPnRpbWUgPSB0aW1lKCk7CisgIC8vc3RhdC0+c2l6ZSA9IChpbnQpb2JqZWN0X2luZm8ocHJldmlvdXNfb2JqZWN0KCksT0lORk9fTUVNT1JZLAorICAvLyAgICBPSU1fVE9UQUxfREFUQV9TSVpFKTsKKyAgaWYgKHN0cmluZ3AobmFtZSkpCisgICAgICBzdGF0LT5zaXplID0gZmlsZV9zaXplKG5hbWUgKyAiLm8iKTsKKyAgZWxzZQorICAgICAgc3RhdC0+c2l6ZW9mKHJlcyk7CisgIC8vZGVidWdfbWVzc2FnZSgic2F2ZW86ICIrc2F2ZW9fc3RhdFswXSsiXG4iKTsKKyAgc2F2ZW9fc3RhdFsxXVtzYXZlb19zdGF0WzBdXSA9IHN0YXQ7CisgIHNhdmVvX3N0YXRbMF0gPSAoc2F2ZW9fc3RhdFswXSArIDEpICUgc2l6ZW9mKHNhdmVvX3N0YXRbMV0pOworICAvL2RlYnVnX21lc3NhZ2UoInNhdmVvIDI6ICIrc2F2ZW9fc3RhdFswXSsiXG4iKTsKKyNlbmRpZgorCisgIHJldHVybiByZXM7Cit9CisKKy8vICogQXVjaCBQcm9wZXJ0aWVzIGxhZGVuCitpbnQgcmVzdG9yZV9vYmplY3Qoc3RyaW5nIG5hbWUpCit7CisgIGludCByZXN1bHQ7CisgIG1peGVkIGluZGV4OworICBtaXhlZCBzYXZlOworICBtYXBwaW5nIHByb3BlcnRpZXM7CisgIGludCBpOworICBjbG9zdXJlIGNsOworCisgIC8vIGdldCBhY3R1YWwgcHJvcGVydHkgc2V0dGluZ3MgKGJ5IGNyZWF0ZSgpKQorICBwcm9wZXJ0aWVzID0gKG1hcHBpbmcpcHJldmlvdXNfb2JqZWN0KCktPlF1ZXJ5UHJvcGVydGllcygpOworCisvLyAgREVCVUcoc3ByaW50ZigiUkVTVE9SRSAlT1xuIixuYW1lKSk7CisgIC8vIHJlc3RvcmUgb2JqZWN0CisgIHJlc3VsdD1mdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6cmVzdG9yZV9vYmplY3QsIHByZXZpb3VzX29iamVjdCgpKSwgbmFtZSk7CisgIC8vJykpCisgIC8vX2dldF9zYXZlX2RhdGEgbGllZmVydCB0YXRzYWVjaGxpY2ggbWl4ZWQgenVydWVjaywgd2VubiBkYXMgYXVjaCBpbW1lciBlaW4gCisgIC8vbWFwcGluZyBzZWluIHNvbGx0ZS4KKyAgc2F2ZSA9IChtaXhlZClwcmV2aW91c19vYmplY3QoKS0+X2dldF9zYXZlX2RhdGEoKTsKKyAgaWYobWFwcGluZ3Aoc2F2ZSkpCisgIHsKKyAgICBpbmRleCA9IG1faW5kaWNlcyhzYXZlKTsKKyAgICBmb3IoaSA9IHNpemVvZihpbmRleCktMTsgaT49MDsgaS0tKQorICAgIHsKKyAgICAgIHByb3BlcnRpZXNbaW5kZXhbaV1dID0gc2F2ZVtpbmRleFtpXV07CisgICAgICBwcm9wZXJ0aWVzW2luZGV4W2ldLCBGX01PREVdID0gc2F2ZVtpbmRleFtpXSwgRl9NT0RFXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ+KFNFVENBQ0hFRHxRVUVSWUNBQ0hFRCk7CisgICAgfQorICB9CisgIGVsc2UgcHJvcGVydGllcyA9IChbXSk7CisKKyAgLy8gcmVzdG9yZSBwcm9wZXJ0aWVzCisgIGZ1bmNhbGwoCisgICAgICAgICAgYmluZF9sYW1iZGEoCisgICAgICAgICAgICAgICAgICAgICB1bmJvdW5kX2xhbWJkYSgoeydhcmd9KSwgLy8nfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeyMnY2FsbF9vdGhlciwoeyMndGhpc19vYmplY3R9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0UHJvcGVydGllcyIsJ2FyZ30pKSwvLycpCisgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c19vYmplY3QoKSkscHJvcGVydGllcyk7CisgIHByZXZpb3VzX29iamVjdCgpLT5fc2V0X3NhdmVfZGF0YSgwKTsKKworI2lmZGVmIElPU1RBVFMKKyAgLy8gU3RhdHMuLi4KKyAgLy9kZWJ1Z19tZXNzYWdlKCJyZXN0b3JlbzogIityZXN0b3Jlb19zdGF0WzBdKyJcbiIpOworICBzdHJ1Y3QgaW9zdGF0X3Mgc3RhdCA9ICg8aW9zdGF0X3M+KTsKKyAgc3RhdC0+b25hbWUgPSBvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSk7CisgIHN0YXQtPnRpbWUgPSB0aW1lKCk7CisgIC8vc3RhdC0+c2l6ZSA9IChpbnQpb2JqZWN0X2luZm8ocHJldmlvdXNfb2JqZWN0KCksT0lORk9fTUVNT1JZLAorICAvLyAgICBPSU1fVE9UQUxfREFUQV9TSVpFKTsKKyAgc3RhdC0+c2l6ZSA9IGZpbGVfc2l6ZShuYW1lICsgIi5vIik7CisgIHJlc3RvcmVvX3N0YXRbMV1bcmVzdG9yZW9fc3RhdFswXV0gPSBzdGF0OworCisgIHJlc3RvcmVvX3N0YXRbMF0gPSAocmVzdG9yZW9fc3RhdFswXSArIDEpICUgc2l6ZW9mKHJlc3RvcmVvX3N0YXRbMV0pOworI2VuZGlmCisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gKiBIQiBlaW5lcyBPYmpla3RlcyBlaW4vYXVzc2NoYWx0ZW4KK2ludCBzZXRfb2JqZWN0X2hlYXJ0X2JlYXQob2JqZWN0IG9iLCBpbnQgZmxhZykKK3sKKyAgaWYgKG9iamVjdHAob2IpKQorICAgIHJldHVybiBmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6Y29uZmlndXJlX29iamVjdCxvYiksIG9iLCBPQ19IRUFSVF9CRUFULCBmbGFnKTsKK30KKworLy8gKiBNYWdpZXJsZXZlbGdydXBwZW4gZXJtaXR0ZWxuCitpbnQgcXVlcnlfd2l6X2dycChtaXhlZCB3aXopCit7CisgIGludCBsZXY7CisKKyAgbGV2PXF1ZXJ5X3dpel9sZXZlbCh3aXopOworICBpZiAobGV2PFNFRVJfTFZMKSByZXR1cm4gMDsKKyAgaWYgKGxldj49R09EX0xWTCkgcmV0dXJuIGxldjsKKyAgaWYgKGxldj49QVJDSF9MVkwpIHJldHVybiBBUkNIX0dSUDsKKyAgaWYgKGxldj49RUxERVJfTFZMKSByZXR1cm4gRUxERVJfR1JQOworICBpZiAobGV2Pj1MT1JEX0xWTCkgcmV0dXJuIExPUkRfR1JQOworICBpZiAobGV2Pj1TUEVDSUFMX0xWTCkgcmV0dXJuIFNQRUNJQUxfR1JQOworICBpZiAobGV2Pj1ET01BSU5NRU1CRVJfTFZMKSByZXR1cm4gRE9NQUlOTUVNQkVSX0dSUDsKKyAgaWYgKGxldj49V0laQVJEX0xWTCkgcmV0dXJuIFdJWkFSRF9HUlA7CisgIGlmIChsZXY+PUxFQVJORVJfTFZMKSByZXR1cm4gTEVBUk5FUl9HUlA7CisgIHJldHVybiBTRUVSX0dSUDsKK30KKworbWl4ZWQgKndpemxpc3RfaW5mbygpCit7CisgIGlmIChBUkNIX1NFQ1VSSVRZIHx8ICFleHRlcm5fY2FsbCgpKQorICAgICAgICAgICAgcmV0dXJuIGVmdW46Ondpemxpc3RfaW5mbygpOworICByZXR1cm4gMDsKK30KKworLy8gKiB3aXpsaXN0IGF1c2dlYmVuCit2YXJhcmdzIHZvaWQgd2l6bGlzdChzdHJpbmcgbmFtZSwgaW50IHNvcnRrZXkgKSB7CisKKyAgaWYgKCFuYW1lKQorICB7CisgICAgaWYgKHRoaXNfcGxheWVyKCkpCisgICAgICBuYW1lID0gZ2V0dWlkKHRoaXNfcGxheWVyKCkpOworICAgIGlmICghbmFtZSkKKyAgICAgIHJldHVybjsKKyAgfQorCisgIC8vIFNjaGx1ZXNzZWwgZGFyZiBudXIgaW4gZWluZW0gZ3VlbHRpZ2VuIEJlcmVpY2ggc2VpbgorICBpZiAoc29ydGtleTxXTF9OQU1FIHx8IHNvcnRrZXk+PVdMX1NJWkUpIHNvcnRrZXk9V0xfQ09TVDsKKworICBtaXhlZCoqIHdsID0gZWZ1bjo6d2l6bGlzdF9pbmZvKCk7CisgIC8vIG5hY2ggPHNvcnRrZXk+IHNvcnRpZXJlbgorICB3bCA9IHNvcnRfYXJyYXkod2wsIGZ1bmN0aW9uIGludCAobWl4ZWQgYSwgbWl4ZWQgYikKKyAgICAgIHtyZXR1cm4gYVtzb3J0a2V5XSA8IGJbc29ydGtleV07IH0gKTsKKworICAvLyBTdW1tZSB1ZWJlciBhbGxlIEtvbW1hbmRvcyBlcm1pdHRlbG4uCisgIGludCB0b3RhbF9jbWQsIGk7CisgIGludCBwb3M9LTE7CisgIGZvcmVhY2gobWl4ZWQgZW50cnkgOiB3bCkKKyAgeworICAgIHRvdGFsX2NtZCArPSBlbnRyeVtXTF9DT01NQU5EU107CisgICAgaWYgKGVudHJ5W1dMX05BTUVdID09IG5hbWUpCisgICAgICBwb3MgPSBpOworICAgICsraTsKKyAgfQorCisgIGlmIChwb3MgPCAwICYmIG5hbWUgIT0gIkFMTCIgJiYgbmFtZSAhPSAiVE9QMTAwIikKKyAgICByZXR1cm47CisKKyAgaWYgKG5hbWUgPT0gIlRPUDEwMCIpCisgIHsKKyAgICBpZiAoc2l6ZW9mKHdsKSA+IDEwMCkKKyAgICAgIHdsID0gd2xbMC4uMTAwXTsKKyAgICBlbHNlCisgICAgICB3bCA9IHdsOworICB9CisgIC8vIHVtIG5hbWUgaGVydW0gc2NobmVpZGVuCisgIGVsc2UgaWYgKG5hbWUgIT0gIkFMTCIpCisgIHsKKyAgICBpZiAoc2l6ZW9mKHdsKSA8PSAyMSkKKyAgICAgIHdsID0gd2w7CisgICAgZWxzZSBpZiAocG9zICsgMTAgPCBzaXplb2Yod2wpICYmIHBvcyAtIDEwID4gMCkKKyAgICAgIHdsID0gd2xbcG9zLTEwLi5wb3MrMTBdOworICAgIGVsc2UgaWYgKHBvcyA8PTIxKQorICAgICAgd2wgPSB3bFswLi4yMF07CisgICAgZWxzZSBpZiAocG9zID49IHNpemVvZih3bCkgLSAyMSkKKyAgICAgIHdsID0gd2xbPDIxLi5dOworICAgIGVsc2UKKyAgICAgIHdsID0gd2w7CisgIH0KKworICB3cml0ZSgiXG5XaXphcmQgdG9wIHNjb3JlIGxpc3RcblxuIik7CisgIGlmICh0b3RhbF9jbWQgPT0gMCkKKyAgICB0b3RhbF9jbWQgPSAxOworICBwcmludGYoIiUtMjBzICUtNnMgJS0zcyAlLTE3cyAlLTZzICUtNnMgJS02c1xuIiwKKyAgICAgICAgICJFVUlEIiwgImNtZHMiLCAiJSIsICJDb3N0cyIsICJIQiIsICJBcnJheXMiLCJNYXBwLiIpOworICBmb3JlYWNoKG1peGVkIGU6IHdsKQorICB7CisgICAgcHJpbnRmKCIlLToyMHMgJTo2ZCAlOjJkJSUgWyU6NmRrLCU6NmRHXSAlOjZkICU6NmQgJTo2ZFxuIiwKKyAgICAgICAgICBlW1dMX05BTUVdLCBlW1dMX0NPTU1BTkRTXSwgZVtXTF9DT01NQU5EU10gKiAxMDAgLyB0b3RhbF9jbWQsCisgICAgICAgICAgZVtXTF9DT1NUXSAvIDEwMDAsIGVbV0xfVE9UQUxfR0lHQUNPU1RdLAorICAgICAgICAgIGVbV0xfSEVBUlRfQkVBVFNdLCBlW1dMX0FSUkFZX1RPVEFMXSwgZVtXTF9NQVBQSU5HX1RPVEFMXQorICAgICAgICAgICk7CisgIH0KKyAgcHJpbnRmKCJcblRvdGFsICAgICAgICAgJTdkICAgICAgICAgKCVkKVxuXG4iLCB0b3RhbF9jbWQsIHNpemVvZih3bCkpOworfQorCisKKy8vIEFiIGhpZXIgZm9sZ2VuIEhpbGZzZnVua3Rpb25lbiBmdWVyIGNhbGxfb3V0KCkgYnp3LiBmdWVyIGRlcmVuIEJlZ3Jlbnp1bmcKKworLy8gZXJtaXR0ZWx0IGRhcyBPYmpla3QgZGVzIENhbGxvdXRzLgorcHJpdmF0ZSBvYmplY3QgX2NhbGxfb3V0X29iaiggbWl4ZWQgY2FsbF9vdXQgKSB7CisgICAgcmV0dXJuIHBvaW50ZXJwKGNhbGxfb3V0KSA/IGNhbGxfb3V0WzBdIDogMDsKK30KKworcHJpdmF0ZSB2b2lkIF9zYW1lX29iamVjdCggb2JqZWN0IG9iLCBtYXBwaW5nIG0gKSB7CisgIC8vIGlzdCBuaWNodCBzbyBibG9lZCwgd2llIGVzIGF1c3NpZWh0LCBzLiBuYWNoZm9sZ2VkZSBWZXJ3ZW5kdW5nIHZvbiBtCisgIGlmICggbVtvYl0gKQorICAgIG1bb2JdICs9ICh7IG9iIH0pOworICBlbHNlCisgICAgbVtvYl0gPSAoeyBvYiB9KTsgCit9CisKKy8vIGFsbGUgT2JqZWt0ZSBpbSBNYXBwaW5nIG0genVzYW1tZW5mYXNzZW4sIGRpZSBkZW4gZ2xlaWNoZW4gTG9hZG5hbWUgKE5hbWUgZGVyCisvLyBCbHVlcHJpbnQpIGhhYmVuLCBhbHNvIGFsbGUgQ2xvbmVzIGRlciBCUCwgZGllIENhbGxvdXRzIGxhdWZlbiBoYWJlbi4KKy8vIE9iamVrdGUgd2VyZGVuIGF1Y2ggbWVocmZhY2ggZXJmYXNzdCwgamUgbmFjaCBBbnphaGwgaWhyZXIgQ2FsbG91dHMuCitwcml2YXRlIHZvaWQgX3NhbWVfcGF0aCggb2JqZWN0IGtleSwgb2JqZWN0ICpvYnMsIG1hcHBpbmcgbSApIHsKKyAgc3RyaW5nIHBhdGg7CisgIGlmICghb2JqZWN0cChrZXkpIHx8ICFwb2ludGVycChvYnMpKSByZXR1cm47CisKKyAgcGF0aCA9IGxvYWRfbmFtZShrZXkpOworCisgIGlmICggbVtwYXRoXSApCisgICAgbVtwYXRoXSArPSBvYnM7CisgIGVsc2UKKyAgICBtW3BhdGhdID0gb2JzOworfQorCisvLyBrZXkga2FubiBvYmplY3Qgb2RlciBzdHJpbmcgc2Vpbi4KK3ByaXZhdGUgaW50IF90b29fbWFueSggbWl4ZWQga2V5LCBtYXBwaW5nIG0sIGludCBpICkgeworICAgIHJldHVybiBzaXplb2YobVtrZXldKSA+PSBpOworfQorCisvLyBhbGxlIE9iamVrdGUgaW4gb2JzIHplcnN0b2VyZW4gdW5kIEZlaGxlcm1lbGR1bmcgYXVzZ2ViZW4uIEFDSFRVTkc6IERpZQorLy8gT2JqZWt0ZSB3ZXJkZW4gaWRSIHp1IGVpbmVyIEJQIGdlaG9lcmVuLCBtdWVzc2VuIGFiZXIgbmljaHQhIEluIGRlbSBGYWxsCisvLyB3aXJkIGF1ZiBkZXIgRWJlbmUgYWJlciBudXIgZWluIE9iamVrdCBpbiBkZXIgRmVobGVybWVsZHVuZyBlcndhZWhudC4KK3ByaXZhdGUgdm9pZCBfZGVzdHJveSggbWl4ZWQga2V5LCBvYmplY3QgKm9icywgc3RyaW5nIHRleHQsIGludCB1aWQgKSB7CisgICAgaWYgKCFwb2ludGVycChvYnMpKSByZXR1cm47CisgICAgLy8gQXJyYXkgbWl0IHVuaXF1ZSBFaW50cmFlZ2UgZXJ6ZXVnZW4uCisgICAgb2JzID0gbV9pbmRpY2VzKCBta21hcHBpbmcob2JzKSApOworICAgIC8vIEZlaGxlcm1lbGR1bmcgYXVmIGRlciBFYmVuZSBhdXNnZWJlbiwgaW0gY2F0Y2goKSBtaXQgcHVibGlzaCwgZGFtaXQgZXMKKyAgICAvLyBhdWYgZGVyIEViZW5lIGRpcmVrdCBzY3JvbGx0LCBkZXIgYmFja3RyYWNlIHZlcmZ1ZWdiYXIgaXN0IChpbQorICAgIC8vIGdlZ2Vuc2F0eiB6dXIgTG9lc3VuZyBtaXR0ZWxzIENhbGxvdXQpLCBkaWUgQXVzZnVlaHJ1bmcgYWJlciB3ZWl0ZXIKKyAgICAvLyBsYWV1ZnQuCisgICAgY2F0Y2goIGVmdW46OnJhaXNlX2Vycm9yKCAgICAgICAgICAgCisgICAgICAgICBzcHJpbnRmKCB0ZXh0LCAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgdWlkID8gKHN0cmluZyltYXN0ZXIoKS0+Y3JlYXRvcl9maWxlKGtleSkgOiBrZXksICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICBzaXplb2Yob2JzKSwgb2JqZWN0X25hbWUob2JzWzwxXSkgKSApO3B1Ymxpc2gpOworICAgIC8vIFVuZCB3ZWcgbWl0IGRlbSBLcmFtLi4uCisgICAgZmlsdGVyKCBvYnMsICMnZWZ1bjo6ZGVzdHJ1Y3QvKicqLyApOworfQorCisvLyBBbGxlIE9iamVrdCBlaW5lciBVSUQgaW0gTWFwcGluZyBtIG1pdCBVSUQgYWxzIEtFeXMgenVzYW1tZW5mYXNzZW4uIE9iamVrdAorLy8gc2luZCBkYWJlaSBuaWNodCB1bmlxdWUuCitwcml2YXRlIHZvaWQgX3NhbWVfdWlkKCBzdHJpbmcga2V5LCBvYmplY3QgKm9icywgbWFwcGluZyBtLCBjbG9zdXJlIGNmICkgeworICBzdHJpbmcgdWlkOworCisgIGlmICggIXBvaW50ZXJwKG9icykgfHwgIXNpemVvZihvYnMpICkKKyAgICByZXR1cm47CisKKyAgdWlkID0gZnVuY2FsbCggY2YsIGtleSApOworCisgIGlmICggbVt1aWRdICkKKyAgICBtW3VpZF0gKz0gb2JzOyAvLyBvYnMgaXN0IG5lbiBBcnJheQorICBlbHNlCisgICAgbVt1aWRdID0gb2JzOworfQorCitub21hc2sgdmFyYXJncyB2b2lkIGNhbGxfb3V0KCB2YXJhcmdzIG1peGVkICphcmdzICkKK3sKKyAgICBtaXhlZCB0bXAsICpjYWxsX291dHM7CisKKyAgICAvLyBCZWkgPjYwMCBDYWxsb3V0cyBhbGxlIE9iamVrdGUga2lsbGVuLCBkaWUgbWVociBhbHMgMzAgQ2FsbG91dHMgbGF1ZmVuCisgICAgLy8gaGFiZW4uCisgICAgaWYgKCBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fQ0FMTE9VVFMpID4gNjAwCisgICAgICAgICYmIGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpICE9IFJPT1RJRCApCisgICAgeworICAgICAgIC8vIExvZyBlcnpldWdlbi4uLgorICAgICAgCisgICAgICAgLy8gT2JqZWt0ZSBhbGxlciBDYWxsb3V0cyBlcm1pdHRlbG4KKyAgICAgICBjYWxsX291dHMgPSBtYXAoIGVmdW46OmNhbGxfb3V0X2luZm8oKSwgIydfY2FsbF9vdXRfb2JqICk7CisgICAgICAgbWFwcGluZyBvYmplY3RtYXAgPSAoW10pOworICAgICAgIGZpbHRlciggY2FsbF9vdXRzLCAjJ19zYW1lX29iamVjdCwgJm9iamVjdG1hcCApOworICAgICAgIC8vIE1hc3RlciBuaWNodCBncmlsbGVuLi4uCisgICAgICAgZWZ1bjo6bV9kZWxldGUoIG9iamVjdG1hcCwgbWFzdGVyKDEpICk7CisgICAgICAgLy8gYWxsZSBPYmpla3RlIHJhdXNzdWNoZW4sIGRpZSB6dXZpZWxlIGhhYmVuLi4uCisgICAgICAgbWFwcGluZyByZXMgPSBmaWx0ZXJfaW5kaWNlcyggb2JqZWN0bWFwLCAjJ190b29fbWFueSwgb2JqZWN0bWFwLCAyOSApOworICAgICAgIC8vIHVuZCB1ZWJlciBhbGxlIEtleXMgZ2VoZW4sIGFuIF9kZXN0cm95KCkgd2VyZGVuIEtleSB1bmQgQXJyYXkgbWl0CisgICAgICAgLy8gT2JqZWt0ZW4gdWViZXJnZWJlbiAoaW4gZGllc2VtIEZhbGwgc2luZCBLZXlzIHVuZCBBcnJheSBtaXQKKyAgICAgICAvLyBPYmpla3RlbiBqZXdlaWxzIGRhcyBnbGVpY2hlIE9iamVrdCkuCisgICAgICAgaWYgKCBzaXplb2YocmVzKSApICAgICAgIAorICAgICAgICAgICB3YWxrX21hcHBpbmcocmVzLCAjJ19kZXN0cm95LCAiQ0FMTF9PVVQgb3ZlcmZsb3cgYnkgc2luZ2xlICIgICAgICAgICAgICAgCisgICAgICAgICAgICAgICJvYmplY3QgWyVPXS4gRGVzdHJ1Y3RlZCAlZCBvYmplY3RzLiBbJXNdXG4iLCAwICk7CisKKyAgICAgICAvLyBCZWkgKGF1Y2ggbmFjaCBkZW0gZXJzdGVuIEF1ZnJhZXVtZW4gbm9jaCkgPjgwMCBDYWxsb3V0cyBhbGxlCisgICAgICAgLy8gT2JqZWt0ZSBraWxsZW4sIGRpZSBtZWhyIGFscyA1MCBDYWxsb3V0cyBsYXVmZW4gaGFiZW4gLSB1bmQKKyAgICAgICAvLyBkaWVzbWFsIHphZWhsZW4gQ2xvbmVzIG5pY2h0IGVpZ2Vuc3RhZW5kaWchIEQuaC4gZXMgd2VyZGVuIGFsbGUKKyAgICAgICAvLyBDbG9uZXMgZWluZXIgQlAgZ2VraWxsdCwgZGllIENhbGxvdXRzIGxhdWZlbiBoYWJlbiwgZmFsbHMgYWxsZQorICAgICAgIC8vIGRpZXNlIE9iamVrdGUgX3p1c2FtbWVuXyBtZWhyIGFscyA1MCBDYWxsb3V0cyBoYWJlbiEKKyAgICAgICBpZiAoIGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9DQUxMT1VUUykgPiA4MDAgKSB7CisgICAgICAgICAgIC8vIHplcnN0b2VydGUgT2JqZWt0ZSB2b24gZGVyIGxldHp0ZW4gQWt0aW9uIHNpbmQgaW4gb2JqZWN0bWFwIG5pY2h0CisgICAgICAgICAgIC8vIG1laHIgZHJpbiwgZGEgc2llIGRvcnQgYWxzIEtleXMgdmVyd2VuZGV0IHd1cmRlbi4KKyAgICAgICAgICAgbWFwcGluZyBwYXRobWFwPShbXSk7CisgICAgICAgICAgIC8vIGFsbGUgT2JqZWt0IGVpbmVyIEJQIGluIHJlcyBzb3J0aWVyZW4sIEJQLU5hbWUgYWxzIEtleSwgQXJyYXlzCisgICAgICAgICAgIC8vIHZvbiBPYmpla3RlbiBhbHMgV2VydGUuCisgICAgICAgICAgIHdhbGtfbWFwcGluZyggb2JqZWN0bWFwLCAjJ19zYW1lX3BhdGgsICZwYXRobWFwKTsKKyAgICAgICAgICAgLy8gYWxsZSBCUHMgKHVuZCBpaHJlIE9iamVrdGUpIHJhdXNzdWNoZW4sIGRpZSB6dXZpZWxlIGhhYmVuLi4uCisgICAgICAgICAgIHJlcyA9IGZpbHRlcl9pbmRpY2VzKCBwYXRobWFwLCAjJ190b29fbWFueS8qJyovLCBwYXRobWFwLCA1MCApOworICAgICAgICAgICAvLyB1bmQgdWViZXIgYWxsZSBLZXlzIGdlaGVuLCBhbiBfZGVzdHJveSgpIHdlcmRlbiBkaWUgQ2xvbmVzCisgICAgICAgICAgIC8vIHVlYmVyZ2ViZW4sIGRpZSBDYWxsb3V0cyBoYWJlbi4KKyAgICAgICAgICAgaWYgKCBzaXplb2YocmVzKSApCisgICAgICAgICAgICAgIHdhbGtfbWFwcGluZyggcmVzLCAjJ19kZXN0cm95LyonKi8sICJDQUxMX09VVCBvdmVyZmxvdyBieSBmaWxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnLiBEZXN0cnVjdGVkICVkIG9iamVjdHMuIFslc11cbiIsIDAgKTsKKworICAgICAgICAgICAvLyBXZW5uIGJlaWRlIEF1ZnJhZXVtYXJiZWl0ZW4gbmljaHRzIGdlYnJhY2h0IGhhYmVuIHVuZCBpbW1lcgorICAgICAgICAgICAvLyBub2NoID4xMDAwIENhbGxvdXRzIGxhdWZlbiwgd2VyZGVuIGRpZXNtYWwgYWxsZSBDYWxsb3V0cworICAgICAgICAgICAvLyBlaW5lciBVSUQgenVzYW1tZW5nZXphZWhsdC4KKyAgICAgICAgICAgLy8gQWxsZSBPYmpla3RlIGVpbmVyIFVJRCwgZGllIGVzIGluIFN1bW1lIGFsbGVyIGlocmVyIE9iamVrdCBtaXQKKyAgICAgICAgICAgLy8gQ2FsbG91dHMgYXVmIG1laHIgYWxzIDEwMCBDYWxsb3V0cyBicmluZ3QsIHdlcmRlbiBnZXJvZXN0ZXQuCisgICAgICAgICAgIGlmIChlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fQ0FMTE9VVFMpID4gMTAwMCkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAvLyBkYXMgbmFjaCBCUC1OYW1lbiB2b3JnZWZpbHRlcnRlIE1hcHBpbmcgamV0enQgbmFjaCBVSURzCisgICAgICAgICAgICAgIC8vIHp1c2FtbWVuc29ydGllcmVuLiBaZXJzdG9lcnRlIENsb25lcyBmaWx0ZXIgX3NhbWVfdWlkKCkKKyAgICAgICAgICAgICAgLy8gcmF1cy4KKyAgICAgICAgICAgICAgbWFwcGluZyB1aWRtYXA9KFtdKTsKKyAgICAgICAgICAgICAgd2Fsa19tYXBwaW5nKCBwYXRobWFwLCAjJ19zYW1lX3VpZCwgJnVpZG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbF9mdW5jdGlvbiggImNyZWF0b3JfZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL3NlY3VyZS9tYXN0ZXIiICkgKTsKKyAgICAgICAgICAgICAgLy8gSW4gcmVzIG51biBVSURzIGFscyBLZXlzIHVuZCBBcnJheXMgdm9uIE9iamVrdGVuIGFscyBXZXJ0ZS4KKyAgICAgICAgICAgICAgLy8gRGllIHJhdXNmaWx0ZXJuLCBkaWUgbWVociBhbHMgMTAwIE9iamVrdGUgKG5vbi11bmlxdWUsIGQuaC4KKyAgICAgICAgICAgICAgLy8gMTAwIENhbGxvdXRzISkgaGFiZW4uCisgICAgICAgICAgICAgIHJlcyA9IGZpbHRlcl9pbmRpY2VzKCB1aWRtYXAsICMnX3Rvb19tYW55LCB1aWRtYXAsIDEwMCApOworICAgICAgICAgICAgICAvLyB1bmQgZXJuZXV0IHVlYmVyIGRpZSBLZXlzIGxhdWZlbiB1bmQgamV3ZWlscyBkaWUgQXJyYXlzIG1pdAorICAgICAgICAgICAgICAvLyBkZW4gT2JqZWt0ZW4genVyIFplcnN0b2VydW5nIGFuIF9kZXN0cm95KCkuLi4KKyAgICAgICAgICAgICAgaWYgKCBzaXplb2YocmVzKSApCisgICAgICAgICAgICAgICAgICB3YWxrX21hcHBpbmcoIHJlcywgIydfZGVzdHJveSwgIkNBTExfT1VUIG92ZXJmbG93IGJ5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVSUQgJyVzJy4gRGVzdHJ1Y3RlZCAlZCBvYmplY3RzLiBbJXNdXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSApOworICAgICAgICAgICB9CisgICAgICAgfQorICAgIH0KKworICAgIC8vIEZhbGxzIGRhcyBhdWZydWZlbmRlIE9iamVrdCB6ZXJzdG9lcnQgd3VyZGUgYmVpbSBBdWZyYWV1bWVuCisgICAgaWYgKCAhcHJldmlvdXNfb2JqZWN0KCkgKQorICAgICAgIHJldHVybjsKKworICAgIHNldF90aGlzX29iamVjdCggcHJldmlvdXNfb2JqZWN0KCkgKTsKKyAgICBhcHBseSggIydlZnVuOjpjYWxsX291dCwgYXJncyApOworICAgIHJldHVybjsKK30KKworbWl4ZWQgY2FsbF9vdXRfaW5mbygpIHsKKyAgCisgIG9iamVjdCBwbyA9IHByZXZpb3VzX29iamVjdCgpOworICBtaXhlZCBjb2kgPSBlZnVuOjpjYWxsX291dF9pbmZvKCk7CisKKyAgLy8gdW5nZWZpbHRlcnRlbiBPdXRwdXQgbnVyIGZ1ZXIgYmVzdGltbXRlIE9iamVrdGUsIE9iamVrdGUgaW4gL3N0ZCBvZGVyCisgIC8vIC9vYmogaGFiZW4gZGllIEJhY2tib25lSUQuCisgIGlmIChxdWVyeV93aXpfbGV2ZWwoZ2V0dWlkKHBvKSkgPj0gQVJDSF9MVkwKKyAgICAgICB8fCAoc3RyaW5nKW1hc3RlcigpLT5jcmVhdG9yX2ZpbGUobG9hZF9uYW1lKHBvKSkgPT0gQkFDS0JPTkVJRCApIHsKKyAgICAgIHJldHVybiBjb2k7CisgIH0KKyAgZWxzZSB7CisgICAgICByZXR1cm4gZmlsdGVyKGNvaSwgZnVuY3Rpb24gbWl4ZWQgKG1peGVkIGFycikgeworICAgICAgICAgICAgICBpZiAocG9pbnRlcnAoYXJyKSAmJiBhcnJbMF09PXBvKQorICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgZWxzZSByZXR1cm4gMDsgfSk7CisgIH0KK30KKworLy8gKiBadSBlaW5lciBjbG9zdXJlIGRhcyBPYmpla3QsIGFuIGRhcyBzaWUgZ2VidW5kZW4gaXN0LCBzdWNoZW4KK21peGVkIHF1ZXJ5X2Nsb3N1cmVfb2JqZWN0KGNsb3N1cmUgYykgeworICByZXR1cm4KKyAgICBDTE9TVVJFX0lTX1VOQk9VTkRfTEFNQkRBKGdldF90eXBlX2luZm8oYywgMSkpID8KKyAgICAgIDAgOgorICAodG9fb2JqZWN0KGMpIHx8IC0xKTsKK30KKworLy8gKiBXaXIgd29sbGVuIG51ciBFSU4gQXJndW1lbnQgLi4uIGF1c3NlcmRlbSBjaGVja3MgZnVlciBkZW4gTmV0enRvdGVucmF1bQordmFyYXJncyB2b2lkIG1vdmVfb2JqZWN0KG1peGVkIHdoYXQsIG1peGVkIHdoZXJlKQoreworICBvYmplY3QgcG8sdG1wOworCisgIHBvPXByZXZpb3VzX29iamVjdCgpOworICBpZiAoIXdoZXJlKQorICB7CisgICAgd2hlcmU9d2hhdDsKKyAgICB3aGF0PXBvOworICB9CisgIGlmICgoKHN0cmluZ3Aod2hlcmUpICYmIHdoZXJlPT1ORVRERUFEX1JPT00gKSB8fAorICAgICAgIChvYmplY3RwKHdoZXJlKSAmJiB3aGVyZT09ZmluZF9vYmplY3QoTkVUREVBRF9ST09NKSkpICYmCisgICAgICAgb2JqZWN0cCh3aGF0KSAmJiBvYmplY3RfbmFtZSh3aGF0KSE9Ii9vYmovc3BlcnJlciIpCisgIHsKKyAgICBpZiAoIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUod2hhdCkpCisgICAgeworICAgICAgd2hhdC0+cmVtb3ZlKCk7CisgICAgICBpZiAod2hhdCkgZGVzdHJ1Y3Qod2hhdCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChsaXZpbmcod2hhdCkgfHwgaW50ZXJhY3RpdmUod2hhdCkpCisgICAgeworICAgICAgbG9nX2ZpbGUoIk5ERUFEMiIsc3ByaW50ZigiVFJZRUQgVE8gTU9WRSBUTyBORVRERUFEOiAlT1xuIix3aGF0KSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIHNldF9vYmplY3RfaGVhcnRfYmVhdCh3aGF0LDApOworICB9CisgIHRtcD13aGF0OworICB3aGlsZSAodG1wPWVudmlyb25tZW50KHRtcCkpCisgICAgICAvLyBKYS4gTWFuIHJ1ZnQgZGllIF9zZXRfeHh4KCktRnVua3Rpb25lbiBlaWdlbnRsaWNoIG5pY2h0IGRpcmVrdCBhdWYuCisgICAgICAvLyBBYmVyIGRhcyBMaWNodHN5c3RlbSBpc3Qgc2Nob24gKnNvKiByZWNoZW5pbnRlbnNpdiB1bmQgZ2VyYWRlIGRlcgorICAgICAgLy8gUF9MQVNUX0NPTlRFTlRfQ0hBTkdFLUNhY2hlIHdpcmQgKnNvKiBvZnQgYmVub2V0aWd0LCBkYXNzIGVzIG1pcgorICAgICAgLy8gZGEgdW0gamVkZXMgYmlzc2NoZW4gUmVjaGVuemVpdCBnZWh0LgorICAgICAgLy8gRGVyIFp3ZWNrIGhlaWxpZ3QgamEgYmVrYW5udGxpY2ggZGllIE1pdHRlbC4gOy0pCisgICAgICAvLworICAgICAgLy8gVGlhbWFrCisgICAgdG1wLT5fc2V0X2xhc3RfY29udGVudF9jaGFuZ2UoKTsKKyAgZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46Om1vdmVfb2JqZWN0LHBvKSx3aGF0LHdoZXJlKTsKKyAgaWYgKHRtcD13aGF0KQorICAgIHdoaWxlICh0bXA9ZW52aXJvbm1lbnQodG1wKSkKKyAgICAgIHRtcC0+X3NldF9sYXN0X2NvbnRlbnRfY2hhbmdlKCk7Cit9CisKKwordm9pZCBzdGFydF9zaW11bF9lZnVuKCkgeworICBtaXhlZCAqaW5mbzsKKworICAvLyBGYWxscyBub2NoIG5pY2h0IGdldGFuLCBleHRyYV93aXppbmZvIGluaXRpYWxpc2llcmVuCisgIGlmICggIXBvaW50ZXJwKGluZm8gPSBnZXRfZXh0cmFfd2l6aW5mbygwKSkgKQorICAgIHNldF9leHRyYV93aXppbmZvKDAsIGluZm8gPSBhbGxvY2F0ZShCQUNLQk9ORV9XSVpJTkZPX1NJWkUpKTsKKworICBJbml0TGl2aW5nRGF0YShpbmZvKTsKKworICBzZXRfbmV4dF9yZXNldCgxMCk7IC8vIGRpcmVrdCBtYWwgYXVmcmFldW1lbgorfQorCitwcm90ZWN0ZWQgdm9pZCByZXNldCgpIHsKKyAgc2V0X25leHRfcmVzZXQoNzIwMCk7CisgIENsZWFuTGl2aW5nRGF0YSgpOworfQorCisjaWYgIV9fRUZVTl9ERUZJTkVEX18oYWJzb2x1dGVfaGJfY291bnQpCitpbnQgYWJzb2x1dGVfaGJfY291bnQoKSB7CisgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSEVBUlRCRUFUX1RPVEFMX0NZQ0xFUyk7Cit9CisjZW5kaWYKKwordm9pZCBfX3NldF9lbnZpcm9ubWVudChvYmplY3Qgb2IsIG1peGVkIHRhcmdldCkKK3sKKyAgc3RyaW5nIHBhdGg7CisgIG9iamVjdCBvYmo7CisKKyAgaWYgKCFvYmplY3RwKG9iKSkKKyAgICByZXR1cm47CisgIGlmICghSVNfQVJDSChnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSkgfHwgIUFSQ0hfU0VDVVJJVFkgKQorICAgIHJldHVybjsKKyAgaWYgKG9iamVjdHAodGFyZ2V0KSkKKyAgeworICAgIGVmdW46OnNldF9lbnZpcm9ubWVudChvYix0YXJnZXQpOworICAgIHJldHVybjsKKyAgfQorICBwYXRoPShzdHJpbmcpTUFTVEVSLT5fZ2V0X3BhdGgodGFyZ2V0LHRoaXNfaW50ZXJhY3RpdmUoKSk7CisgIGlmIChzdHJpbmdwKHBhdGgpICYmIGZpbGVfc2l6ZShwYXRoKyIuYyIpPj0wICYmCisgICAgICAhY2F0Y2gobG9hZF9vYmplY3QocGF0aCk7cHVibGlzaCkgKQorICB7CisgICAgb2JqPWZpbmRfb2JqZWN0KHBhdGgpOworICAgIGVmdW46OnNldF9lbnZpcm9ubWVudChvYixvYmopOworICAgIHJldHVybjsKKyAgfQorfQorCit2b2lkIF9kdW1wX3dpemxpc3Qoc3RyaW5nIGZpbGUsIGludCBzb3J0YnkpIHsKKyAgaW50IGk7CisgIG1peGVkICphOworCisgIGlmICghTE9SRF9TRUNVUklUWSkKKyAgICByZXR1cm47CisgIGlmICghbWFzdGVyKCktPnZhbGlkX3dyaXRlKGZpbGUsZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSksIndyaXRlX2ZpbGUiKSkKKyAgeworICAgIHdyaXRlKCJOTyBXUklURSBQRVJNSVNTSU9OXG4iKTsKKyAgICByZXR1cm47CisgIH0KKyAgYSA9IHdpemxpc3RfaW5mbygpOworICBhID0gc29ydF9hcnJheShhLCBsYW1iZGEoICh7J2EsJ2J9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh7Iyc8LAorICAgICAgICAgICAgICAgICAgICAgICAgICAoeyMnWywnYSxzb3J0Ynl9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHsjJ1ssJ2Isc29ydGJ5fSkKKyAgICAgICAgICAgICAgICAgICAgICAgICB9KSkpOworICBybShmaWxlKTsKKyAgZm9yIChpPXNpemVvZihhKS0xO2k+PTA7aS0tKQorICAgIHdyaXRlX2ZpbGUoZmlsZSxzcHJpbnRmKCIlLTExczogZXZhbD0lLThkIGNtZHM9JS02ZCBIQnM9JS01ZCBhcnJheT0lLTVkIG1hcHBpbmc9JS03ZFxuIiwKKyAgICAgIGFbaV1bV0xfTkFNRV0sYVtpXVtXTF9UT1RBTF9DT1NUXSxhW2ldW1dMX0NPTU1BTkRTXSxhW2ldW1dMX0hFQVJUX0JFQVRTXSwKKyAgICAgIGFbaV1bV0xfQVJSQVlfVE9UQUxdLGFbaV1bV0xfQ0FMTF9PVVRdKSk7Cit9CisKK3B1YmxpYyB2YXJhcmdzIG9iamVjdCBkZWVwX3ByZXNlbnQobWl4ZWQgd2hhdCwgb2JqZWN0IG9iKSB7CisKKyAgaWYoIW9iamVjdHAob2IpKQorICAgIG9iPXByZXZpb3VzX29iamVjdCgpOworICAvLyBXZW5uIGVpbiBPYmpla3QgZ2VzdWNodCB3aXJkOiBBbGxlIEVudnMgZGllc2VzIE9iamVrdHMgZXJtaXR0ZWxuIHVuZAorICAvLyBzY2hhdWVuLCBvYiBpbiBkaWVzZW4gb2Igdm9ya29tbXQuIERhbm4gaXN0IHdoYXQgaW4gb2IgZW50aGFsdGVuLgorICBpZihvYmplY3RwKHdoYXQpKSB7CisgICAgb2JqZWN0ICplbnZzPWFsbF9lbnZpcm9ubWVudCh3aGF0KTsKKyAgICAvLyB3ZW5uIG9iIGtlaW4gRW52aXJvbm1lbnQgaGF0LCBpc3QgZXMgb2ZmZW5zaWNodGxpY2ggbmljaHQgaW4gd2hhdAorICAgIC8vIGVudGhhbHRlbi4KKyAgICBpZiAoIXBvaW50ZXJwKGVudnMpKSByZXR1cm4gMDsKKyAgICBpZiAobWVtYmVyKGVudnMsIG9iKSAhPSAtMSkgcmV0dXJuIHdoYXQ7CisgIH0KKyAgLy8gc29uc3Qgd2lyZHMgdGV1cmVyLCB1ZWJlciBhbGxlIE9iamVrdGUgaW0gKGRlZXApIEludiBsYXVmZW4gdW5kIHBlciBpZCgpCisgIC8vIHRlc3Rlbi4gRGFiZWkgbXVzcyBhYmVyIGRpZSBnZXd1ZW5zY2h0ZSBOci4gKCJmbGFzY2hlIDMiKSBhYmdlc2Nobml0dGVuCisgIC8vIHdlcmRlbiB1bmQgc2VsYmVyIGdlemFlaGx0IHdlcmRlbiwgd2VsY2hlIGRhcyBlbnRzcHJlY2hlbmRlIE9iamVrdCBpc3QuCisgIGVsc2UgaWYgKHN0cmluZ3Aod2hhdCkpIHsKKyAgICAgIGludCBjbnQ7CisgICAgICBzdHJpbmcgbmV3d2hhdDsKKyAgICAgIGlmKHNzY2FuZih3aGF0LCIlcyAlZCIsbmV3d2hhdCxjbnQpIT0yKQorICAgICAgIGNudD0xOworICAgICAgZWxzZQorICAgICAgIHdoYXQ9bmV3d2hhdDsKKyAgICAgIGZvcmVhY2gob2JqZWN0IGludm9iOiBkZWVwX2ludmVudG9yeShvYikpIHsKKyAgICAgICBpZiAoaW52b2ItPmlkKHdoYXQpICYmICEtLWNudCkKKyAgICAgICAgICAgcmV0dXJuIGludm9iOworICAgICAgfQorICB9CisgIGVsc2UgeworICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiV3JvbmcgYXJndW1lbnQgMSB0byBkZWVwX3ByZXNlbnQoKS4gIgorICAgICAgICAgIkV4cGVjdGVkIFwib2JqZWN0XCIgb3IgXCJzdHJpbmdcIiwgZ290ICUuNTBPLlxuIiwKKyAgICAgICAgIHdoYXQpKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworbWFwcGluZyBkdW1wX2lwX21hcHBpbmcoKQoreworICByZXR1cm4gMDsKK30KKworbm9tYXNrIHZvaWQgc3dhcChvYmplY3Qgb2JqKQoreworICB3cml0ZSgiWW91ciBhcmUgbm90IGFsbG93ZWQgdG8gc3dhcCBvYmplY3RzIGJ5IGhhbmQhXG4iKTsKKyAgcmV0dXJuOworfQorCitub21hc2sgdmFyYXJncyB2b2lkIGdhcmJhZ2VfY29sbGVjdGlvbihzdHJpbmcgc3RyKQoreworICBpZihwcmV2aW91c19vYmplY3QoKT09MCB8fCAhSVNfQVJDSChnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSkgCisgICAgICB8fCAhQVJDSF9TRUNVUklUWSkKKyAgeworICAgIHdyaXRlKCJDYWxsIEdDIG5vdyBhbmQgdGhlIG11ZCB3aWxsIGNyYXNoIGluIDUtNiBob3Vycy4gRE9OVCBETyBJVCFcbiIpOworICAgIHJldHVybjsKKyAgfQorICBlbHNlIGlmIChzdHJpbmdwKHN0cikpCisgIHsKKyAgICByZXR1cm4gZWZ1bjo6Z2FyYmFnZV9jb2xsZWN0aW9uKHN0cik7CisgIH0KKyAgZWxzZSAKKyAgICByZXR1cm4gZWZ1bjo6Z2FyYmFnZV9jb2xsZWN0aW9uKCk7Cit9CisKK3ZhcmFyZ3Mgdm9pZCBub3RpZnlfZmFpbChtaXhlZCBuZiwgaW50IHByaW8pIHsKKyAgb2JqZWN0IHBvLG9sZG87CisgIGludCBvbGRwcmlvOworICAKKyAgaWYgKCFQTCB8fCAhb2JqZWN0cChwbz1wcmV2aW91c19vYmplY3QoKSkpIHJldHVybjsKKyAgaWYgKCFzdHJpbmdwKG5mKSAmJiAhY2xvc3VyZXAobmYpKSB7CisgICAgICBzZXRfdGhpc19vYmplY3QocG8pOworICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigKKyAgICAgICAgICJPbmx5IHN0cmluZ3MgYW5kIGNsb3N1cmVzIGFsbG93ZWQgZm9yIG5vdGlmeV9mYWlsISAiCisgICAgICAgICAiQXJndW1lbnQgd2FzOiAlLjUwTy4uLlxuIixuZikpOworICB9CisKKyAgLy8gZmFsbHMgZWluIE9iamVrdCBiZXJlaXRzIG5lbiBub3RpZnlfZmFpbCgpIHNldHp0ZSwgUHJpb3JpdGFldGVuIGFic2NoYWV0emVuCisgIC8vIHVuZCB2ZXJnbGVpY2hlbi4KKyAgaWYgKG9iamVjdHAob2xkbz1xdWVyeV9ub3RpZnlfZmFpbCgxKSkgJiYgcG8hPW9sZG8pIHsKKyAgICBpZiAoIXByaW8pIHsgICAgICAgCisgICAgICAvL1ByaW9yaXRhZXQgZGllc2VzIG5vdGlmeV9mYWlsKCkgJ2Fic2NoYWV0emVuJworICAgICAgaWYgKHBvPT1QTCkgLy8gU3BpZWxlci1pbnRlcm5lIChzb3VsLWNtZHMpCisgICAgICAgIHByaW89TkZfTkxfT1dOOworICAgICAgZWxzZSBpZiAobGl2aW5nKHBvKSkKKyAgICAgICAgcHJpbz1ORl9OTF9MSVZJTkc7CisgICAgICBlbHNlIGlmICgoaW50KXBvLT5Jc1Jvb20oKSkKKyAgICAgICAgcHJpbz1ORl9OTF9ST09NOworICAgICAgZWxzZQorICAgICAgICBwcmlvPU5GX05MX1RISU5HOworICAgIH0KKyAgICAvL1ByaW9yaXRhZXQgZGVzIGFsdGVuIFNldHplcnMgYWJzY2hhZXR6ZW4KKyAgICBpZiAob2xkbz09UEwpCisgICAgICBvbGRwcmlvPU5GX05MX09XTjsKKyAgICBlbHNlIGlmIChsaXZpbmcob2xkbykpCisgICAgICBvbGRwcmlvPU5GX05MX0xJVklORzsKKyAgICBlbHNlIGlmICgoaW50KW9sZG8tPklzUm9vbSgpKQorICAgICAgb2xkcHJpbz1ORl9OTF9ST09NOworICAgIGVsc2UKKyAgICAgIG9sZHByaW89TkZfTkxfVEhJTkc7CisgIH0KKyAgZWxzZSAvLyB3ZW5uIGVzIG5vY2gga2VpbiBOb3RpZnlfZmFpbCBnaWJ0OgorICAgIG9sZHByaW89TkZfTkxfTk9ORTsKKworICAvL3ZlcmdsZWljaGVuIHVuZCBnZ2YuIHNldHplbgorICBpZiAocHJpbyA+PSBvbGRwcmlvKSB7IAorICAgIHNldF90aGlzX29iamVjdChwbyk7CisgICAgZWZ1bjo6bm90aWZ5X2ZhaWwobmYpOworICB9CisKKyAgcmV0dXJuOworfQorCit2b2lkIF9ub3RpZnlfZmFpbChzdHJpbmcgc3RyKQoreworICAvL3F1ZXJ5X25vdGlmeV9mYWlsKCkgYmVudXR6ZW4sIHVtIGRhcyBPYmpla3QKKyAgLy9kZXMgbGV0enRlbiBub3RpZnlfZmFpbCgpIHp1IGVybWl0dGVsbgorICBvYmplY3QgbzsKKyAgaWYgKChvPXF1ZXJ5X25vdGlmeV9mYWlsKDEpKSAmJiBvIT1wcmV2aW91c19vYmplY3QoKSkKKyAgICByZXR1cm47CisgIC8vbm9jaCBrZWluIG5vdGlmeV9mYWlsKCkgZnVlciBkaWVzZXMgS29tbWFuZG8gZ2VzZXR6dCwgYXVmIGdlaHRzLgorICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICBlZnVuOjpub3RpZnlfZmFpbChzdHIpOworICByZXR1cm47Cit9CisKK3N0cmluZyB0aW1lMnN0cmluZyggc3RyaW5nIGZvcm1hdCwgaW50IHplaXQgKQoreworICBpbnQgaSxjaCxtYXh1bml0LGR1bW15OworICBzdHJpbmcgKnBhcnRzLCBmbXQ7CisKKyAgaW50IHNlY3MgPSB6ZWl0OworICBpbnQgbWlucyA9ICh6ZWl0LzYwKTsKKyAgaW50IGhvdXJzID0gKHplaXQvMzYwMCk7CisgIGludCBkYXlzID0gKHplaXQvODY0MDApOworICBpbnQgd2Vla3MgPSAgKHplaXQvNjA0ODAwKTsKKyAgaW50IG1vbnRocyA9ICh6ZWl0LzI0MTkyMDApOworICBpbnQgYWJiciA9IDA7CisKKyAgcGFydHMgPSByZWdleHBsb2RlKCBmb3JtYXQsICJcKCVcKC18XClbMC05XSpbbndkaG1zeE5XREhNU1hdXCl8XCglJVwpIiApOworCisgIGZvciggaT0xOyBpPHNpemVvZihwYXJ0cyk7IGkrPTIgKQorICB7CisgICAgY2ggPSBwYXJ0c1tpXVs8MV07CisgICAgc3dpdGNoKCBwYXJ0c1tpXVs8MV0gKQorICAgIHsKKyAgICBjYXNlICd4JzogY2FzZSAnWCc6CisgICAgICAgYWJiciA9IHNzY2FuZiggcGFydHNbaV0sICIlJSVkIiwgZHVtbXkgKSAmJiBkdW1teT09MDsKKyAgICAgICAvLyBOTyBicmVhayAhCisgICAgY2FzZSAnbic6IGNhc2UgJ04nOgorICAgICAgIG1heHVuaXQgfD0gMzE7CisgICAgICAgYnJlYWs7CisgICAgY2FzZSAndyc6IGNhc2UgJ1cnOgorICAgICAgIG1heHVuaXQgfD0gMTU7CisgICAgICAgYnJlYWs7CisgICAgY2FzZSAnZCc6IGNhc2UgJ0QnOgorICAgICAgIG1heHVuaXQgfD0gNzsKKyAgICAgICBicmVhazsKKyAgICBjYXNlICdoJzogY2FzZSAnSCc6CisgICAgICAgbWF4dW5pdCB8PSAzOworICAgICAgIGJyZWFrOworICAgIGNhc2UgJ20nOiBjYXNlICdNJzoKKyAgICAgICBtYXh1bml0IHw9IDE7CisgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmKCBtYXh1bml0ICYgMTYgKSB3ZWVrcyAlPSA0OworICBpZiggbWF4dW5pdCAmIDggKSBkYXlzICU9IDc7CisgIGlmKCBtYXh1bml0ICYgNCApIGhvdXJzICU9IDI0OworICBpZiggbWF4dW5pdCAmIDIgKSBtaW5zICU9IDYwOworICBpZiggbWF4dW5pdCApIHNlY3MgJT0gNjA7CisKKyAgZm9yKCBpPTE7IGk8c2l6ZW9mKHBhcnRzKTsgaSs9MiApCisgIHsKKyAgICBmbXQgPSBwYXJ0c1tpXVswLi48Ml07CisgICAgY2ggPSBwYXJ0c1tpXVs8MV07CisgICAgaWYoIGNoPT0neCcgKQorICAgIHsKKyAgICAgIGlmIChtb250aHMgPiAwKSBjaD0nbic7CisgICAgICBlbHNlIGlmKCB3ZWVrcz4wICkgY2g9J3cnOworICAgICAgZWxzZSBpZiggZGF5cz4wICkgY2g9J2QnOworICAgICAgZWxzZSBpZiggaG91cnM+MCApIGNoPSdoJzsgCisgICAgICBlbHNlIGlmKG1pbnMgPiAwKSBjaCA9ICdtJzsKKyAgICAgIGVsc2UgY2ggPSAncyc7CisgICAgfQorICAgIGVsc2UgaWYoIGNoPT0nWCcgKQorICAgIHsKKyAgICAgIGlmIChtb250aHMgPiAwKSBjaD0nTic7CisgICAgICBlbHNlIGlmKCB3ZWVrcz4wICkgY2g9J1cnOworICAgICAgZWxzZSBpZiggZGF5cz4wICkgY2g9J0QnOworICAgICAgZWxzZSBpZiggaG91cnM+MCApIGNoPSdIJzsgCisgICAgICBlbHNlIGlmKG1pbnMgPiAwKSBjaCA9ICdNJzsKKyAgICAgIGVsc2UgY2ggPSAnUyc7CisgICAgfQorICAgIAorICAgIHN3aXRjaCggY2ggKQorICAgIHsKKyAgICAgIGNhc2UgJ24nOiBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsiZCIsIG1vbnRocyApOyBicmVhazsKKyAgICAgIGNhc2UgJ3cnOiBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsiZCIsIHdlZWtzICk7IGJyZWFrOworICAgICAgY2FzZSAnZCc6IHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJkIiwgZGF5cyApOyBicmVhazsKKyAgICAgIGNhc2UgJ2gnOiBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsiZCIsIGhvdXJzICk7IGJyZWFrOworICAgICAgY2FzZSAnbSc6IHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJkIiwgbWlucyApOyBicmVhazsKKyAgICAgIGNhc2UgJ3MnOiBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsiZCIsIHNlY3MgKTsgYnJlYWs7CisgICAgICBjYXNlICdOJzoKKyAgICAgICBpZihhYmJyKSBwYXJ0c1tpXSA9ICJNIjsKKyAgICAgICBlbHNlIHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJzIiwgKG1vbnRocz09MSkgPyAiTW9uYXQiIDogIk1vbmF0ZSIgKTsKKyAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ1cnOgorICAgICAgIGlmKGFiYnIpIHBhcnRzW2ldID0gInciOyBlbHNlCisgICAgICAgcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrInMiLCAod2Vla3M9PTEpID8gIldvY2hlIiA6ICJXb2NoZW4iICk7CisgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdEJzoKKyAgICAgICBpZihhYmJyKSBwYXJ0c1tpXSA9ICJkIjsgZWxzZQorICAgICAgIHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJzIiwgKGRheXM9PTEpID8gIlRhZyIgOiAiVGFnZSIgKTsKKyAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ0gnOgorICAgICAgIGlmKGFiYnIpIHBhcnRzW2ldID0gImgiOyBlbHNlCisgICAgICAgcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrInMiLCAoaG91cnM9PTEpID8gIlN0dW5kZSIgOiAiU3R1bmRlbiIgKTsKKyAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ00nOgorICAgICAgIGlmKGFiYnIpIHBhcnRzW2ldID0gIm0iOyBlbHNlCisgICAgICAgcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrInMiLCAobWlucz09MSkgPyAiTWludXRlIiA6ICJNaW51dGVuIiApOworICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnUyc6CisgICAgICAgaWYoYWJicikgcGFydHNbaV0gPSAicyI7IGVsc2UKKyAgICAgICBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsicyIsIChzZWNzPT0xKSA/ICJTZWt1bmRlIiA6ICJTZWt1bmRlbiIgKTsKKyAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJyUnOgorICAgICAgIHBhcnRzW2ldID0gIiUiOworICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaW1wbG9kZSggcGFydHMsICIiICk7Cit9CisKK25vbWFzayBtaXhlZCBfX2NyZWF0ZV9wbGF5ZXJfZHVtbXkoc3RyaW5nIG5hbWUpCit7CisgIHN0cmluZyBlcnI7CisgIG9iamVjdCBvYjsKKyAgbWl4ZWQgbTsKKyAgLy9oYXQgbmVuIFNjaGVyemtla3MgZGllIEJsdWVwcmludCBiZXdlZ3Q/CisgIGlmICgob2I9ZmluZF9vYmplY3QoIi9zZWN1cmUvbG9naW4iKSkgJiYgZW52aXJvbm1lbnQob2IpKQorICAgICAgY2F0Y2goZGVzdHJ1Y3Qob2IpO3B1Ymxpc2gpOworICBlcnIgPSBjYXRjaChvYiA9IGNsb25lX29iamVjdCgic2VjdXJlL2xvZ2luIik7cHVibGlzaCk7CisgIGlmIChlcnIpCisgIHsKKyAgICB3cml0ZSgiRmVobGVyIGJlaW0gTGFkZW4gdm9uIC9zZWN1cmUvbG9naW4uY1xuIitlcnIrIlxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKG9iamVjdHAobT0obWl4ZWQpb2ItPm5ld19sb2dvbihuYW1lKSkpIG5ldGRlYWRbbmFtZV09bTsKKyAgcmV0dXJuIG07Cit9CisKK25vbWFzayBpbnQgc2VjdXJlX2xldmVsKCkKK3sKKyAgaW50ICpsZXZlbDsKKyAgLy9rZXR0ZSBkZXIgQ2FsbGVyIGR1cmNobGF1ZmVuLCBkZW4gbmllZHJpZ3N0ZW4gTGV2ZWwgaW4gZGVyIEtldHRlCisgIC8venVydWVja2dlYmVuLiBaZXJzdG9lcnRlIE9iamVrdGUgKFNlbGJzdHplcnN0b2VyZXIpIGZ1ZWhyZW4genVyIFJ1ZWNrZ2FiZQorICAvL3ZvbiAwLgorICAvL2NhbGxlcl9zdGFjaygxKSBmdWVndCBkZW0gUnVlY2tnYWJlYXJyYXkgdGhpc19pbnRlcmFjdGl2ZSgpIGhpbnp1IGJ6dy4gMCwKKyAgLy93ZW5uIGVzIGtlaW5lbiBJbnRlcmFjdGl2ZSBnaWJ0LiBEaWUgMCBmdWVocnQgZGFubiB3aWUgYmVpIHplcnN0b2VydGVuCisgIC8vT2JqZWt0ZW4genVyIFJ1ZWNrZ2FiZSB2b24gMCwgd2FzIGdld3VlbnNjaHQgaXN0LCBkYSBlcyBoaWVyIGVpbmVuCisgIC8vSU50ZXJhY3RpdmUgZ2ViZW4gbXVzcy4KKyAgbGV2ZWw9bWFwKGNhbGxlcl9zdGFjaygxKSxmdW5jdGlvbiBpbnQgKG9iamVjdCBjYWxsZXIpCisgICAgICB7aWYgKG9iamVjdHAoY2FsbGVyKSkKKyAgICAgICByZXR1cm4ocXVlcnlfd2l6X2xldmVsKGdldGV1aWQoY2FsbGVyKSkpOworICAgICAgIHJldHVybigwKTsgLy8ga2VpbiBPYmpla3QgZGEsIDAuCisgICAgICB9ICk7CisgIHJldHVybihtaW4obGV2ZWwpKTsgLy9kZW4ga2xlaW5zdGVuIFdlcnQgaW0gQXJyYXkgenVydWVja2dlYmVuIChnZ2YuIDApCit9CisKK25vbWFzayBzdHJpbmcgc2VjdXJlX2V1aWQoKQoreworICBzdHJpbmcgZXVpZDsKKworICBpZiAoIXRoaXNfaW50ZXJhY3RpdmUoKSkgLy8gRXMgbXVzcyBlaW5lbiBpbnRlcmFjdGl2ZSBnZWJlbgorICAgICByZXR1cm4gMDsKKyAgZXVpZD1nZXRldWlkKHRoaXNfaW50ZXJhY3RpdmUoKSk7CisgIC8vIHVlYmVyIGFsbGUgQ2FsbGVyIGl0ZXJpZXJlbi4gV2VubiBlaW5lcyBkYXZvbiBlaW5lIGFuZGVyZSBldWlkIGhhdCBhbHMKKyAgLy8gZGVyIEludGVyYWN0aXZlIHVuZCBkaWVzZSBuaWNodCBkaWUgUk9PVElEIGlzdCwgd2lyZCAwIHp1cnVlY2tnZWJlbi4KKyAgLy8gRWJlbnNvLCBmYWxscyBlaW4gU2VsYnN0emVyc3RvZXJlciBpcmdlbmR3byBpbiBkZXIgS2V0dGUgaXN0LgorICBmb3JlYWNoKG9iamVjdCBjYWxsZXI6IGNhbGxlcl9zdGFjaygpKSB7CisgICAgICBpZiAoIW9iamVjdHAoY2FsbGVyKSB8fAorICAgICAgIChnZXRldWlkKGNhbGxlcikhPWV1aWQgJiYgZ2V0ZXVpZChjYWxsZXIpIT1ST09USUQpKQorICAgICAgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIGV1aWQ7IC8vICdzaWNoZXJlJyBldWlkIHp1cnVlY2tnZWJlbgorfQorCisvLyBJTlBVVF9QUk9NUFQgdW5kIG5lbiBMZWVycHJvbXB0IGhpbnp1ZnVlZ2VuLCB3ZW5uIGtlaW5zIHVlYmVyZ2ViZW4gd2lyZC4KKy8vIERhcyBzb2xsIGRhenUgZGllbmVuLCBkYXNzIGFsbGUgZ2dmLiBlaW4gRU9SIGFtIFByb21wdGVuZGUga3JpZWdlbi4uLgorLy8jaWYgX19CT09UX1RJTUVfXyA8IDEzNjAwMTcyMTMKK3ZhcmFyZ3Mgdm9pZCBpbnB1dF90byggbWl4ZWQgZnVuLCBpbnQgZmxhZ3MsIHZhcmFyZ3MgbWl4ZWQgKmFyZ3MgKQoreworICAgIG1peGVkICphcnI7CisgICAgaW50IGk7CisKKyAgICBpZiAoICF0aGlzX3BsYXllcigpIHx8ICFwcmV2aW91c19vYmplY3QoKSApCisgICAgICAgcmV0dXJuOworCisgICAgLy8gVE9ETzogaW5wdXRfdG8oLi4uLElOUFVUX1BST01QVCwgIiIsIC4uLiksIHdlbm4ga2VpbiBJTlBVVF9QUk9NUFQKKyAgICAvLyB2b3Jrb21tdC4uLgorICAgIGlmICggZmxhZ3MmSU5QVVRfUFJPTVBUICkgeyAgICAKKyAgICAgICAgYXJyID0gKHsgZnVuLCBmbGFncyB9KSArIGFyZ3M7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvLyBnZ2YuIGVpbiBJTlBVVF9QUk9NUFQgaGluenVmdWVnZW4gdW5kIG5lbiBMZWVyc3RyaW5nIGFscyBQcm9tcHQuCisgICAgICAgIGZsYWdzIHw9IElOUFVUX1BST01QVDsKKyAgICAgICAgYXJyID0gKHsgZnVuLCBmbGFncywgIiIgfSkgKyBhcmdzOworICAgIH0KKworICAgIC8vIEFycmF5cyBnZWdlbiBmbGF0dGVuIHF1b3Rlbi4KKyAgICBmb3IgKCBpID0gc2l6ZW9mKGFycikgLSAxOyBpID4gMTsgaS0tICkKKyAgICAgICBpZiAoIHBvaW50ZXJwKGFycltpXSkgKQorICAgICAgICAgICBhcnJbaV0gPSBxdW90ZShhcnJbaV0pOworCisgICAgYXBwbHkoIGJpbmRfbGFtYmRhKCB1bmJvdW5kX2xhbWJkYSggKHt9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeyAjJ2VmdW46OmlucHV0X3RvLyonKi8gfSkgKyBhcnIgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNfb2JqZWN0KCkgKSApOworfQorLy8jZW5kaWYKKworbm9tYXNrIGludCBzZXRfbGlnaHQoaW50IGkpCisvLyBlcmhvZWh0IGRhcyBMaWNodGxldmVsIGVpbmVzIE9iamVrdHMgdW0gaQorLy8gcmVzdWx0OiBkYXMgTGljaHRsZXZlbCBpbm5lcmhhbGIgZGVzIE9iamVrdHMKK3sKKyAgICBvYmplY3Qgb2IsICppbnY7CisgICAgaW50IGxhbGwsIGxpZ2h0LCBkYXJrLCB0bXA7CisKKyAgICBpZiAoIShvYj1wcmV2aW91c19vYmplY3QoKSkpIHJldHVybiAwOyAvLyBvaG5lIGRhcyBnZWh0cyBuaWNodC4KKworICAgIC8vIGF1cyBrb21wYXRpYmlsaXRhZXRzZ3J1ZW5kZW4ga2FubiBtYW4gYXVjaCBkZW4gTGljaHRsZXZlbCBub2NoIHNldHplbgorICAgIGlmIChpIT0wKSBvYi0+U2V0UHJvcChQX0xJR0hULCBvYi0+UXVlcnlQcm9wKFBfTElHSFQpK2kpOworCisgICAgLy8gTGljaHRiZXJlY2hudW5nIGZpbmRldCBlaWdlbnRsaWNoIGluIGRlciBNdWRsaWIgc3RhdHQuCisgICAgcmV0dXJuIChpbnQpb2ItPlF1ZXJ5UHJvcChQX0lOVF9MSUdIVCk7Cit9CisKKworcHVibGljIHN0cmluZyBpc28yYXNjaWkoIHN0cmluZyBzdHIgKQoreworICAgIGlmICggIXN0cmluZ3Aoc3RyKSB8fCAhc2l6ZW9mKHN0cikgKQorICAgICAgIHJldHVybiAiIjsKKworICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgIuQiLCAiYWUiLCAxICk7CisgICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAi9iIsICJvZSIsIDEgKTsKKyAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICL8IiwgInVlIiwgMSApOworICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgIsQiLCAiQWUiLCAxICk7CisgICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAi1iIsICJPZSIsIDEgKTsKKyAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICLcIiwgIlVlIiwgMSApOworICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgIt8iLCAic3MiLCAxICk7CisgICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAiW14gLX5dIiwgIj8iLCAxICk7CisKKyAgICByZXR1cm4gc3RyOworfQorCisKK3B1YmxpYyB2YXJhcmdzIHN0cmluZyBDb3VudFVwKCBzdHJpbmcgKnMsIHN0cmluZyBzZXAsIHN0cmluZyBsYXN0c2VwICkKK3sKKyAgICBzdHJpbmcgcmV0OworCisgICAgaWYgKCAhcG9pbnRlcnAocykgKQorICAgICAgIHJldHVybiAiIjsKKyAgICAKKyAgICBpZiAoIXNlcCkgc2VwID0gIiwgIjsKKyAgICBpZiAoIWxhc3RzZXApIGxhc3RzZXAgPSAiIHVuZCAiOworCisgICAgc3dpdGNoIChzaXplb2YocykpICB7CisgICAgICAgY2FzZSAwOiByZXQ9IiI7IGJyZWFrOworICAgICAgIGNhc2UgMTogcmV0PXNbMF07IGJyZWFrOworICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIHJldCA9IGltcGxvZGUoc1swLi48Ml0sIHNlcCk7CisgICAgICAgICAgICAgIHJldCArPSBsYXN0c2VwICsgc1s8MV07CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK25vbWFzayB2YXJhcmdzIGludCBxdWVyeV9uZXh0X3Jlc2V0KG9iamVjdCBvYikgeworCisgICAgLy8gVHlwcHJ1ZWZ1bmc6IGV0d2FzIGFuZGVyZXMgYWxzIE9iamVrdGUgb2RlciAwIHNvbGxlbiBGZWhsZXIgc2Vpbi4KKyAgICBpZiAob2IgJiYgIW9iamVjdHAob2IpKQorICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiQmFkIGFyZyAxIHRvIHF1ZXJ5X25leHRfcmVzZXQoKTogZ290ICUuMjBPLCAiCisgICAgICAgICAgICJleHBlY3RlZCBvYmplY3QuXG4iLG9iKSk7CisKKyAgICAvLyBEZWZhdWx0b2JqZWt0IFBPLCB3ZW5uIDAgdWViZXJnZWJlbi4KKyAgICBpZiAoICFvYmplY3RwKG9iKSApCisgICAgICBvYiA9IHByZXZpb3VzX29iamVjdCgpOworCisgICAgcmV0dXJuIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9ORVhUX1JFU0VUX1RJTUUpOworfQorCisKKyNpZiAhX19FRlVOX0RFRklORURfXyhjb3B5X2ZpbGUpCisjZGVmaW5lIE1BWExFTiA1MDAwMAorbm9tYXNrIGludCBjb3B5X2ZpbGUoc3RyaW5nIHNvdXJjZSwgc3RyaW5nIGRlc3QpCit7CisKKyAgaW50IHB0cjsKKyAgc3RyaW5nIGJ5dGVzOworCisgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgIGlmICghc2l6ZW9mKHNvdXJjZSl8fCFzaXplb2YoZGVzdCl8fHNvdXJjZT09ZGVzdHx8KGZpbGVfc2l6ZShzb3VyY2UpPT0tMSl8fAorICAgICAgKCFjYWxsX290aGVyKG1hc3RlcigpLCJ2YWxpZF9yZWFkIixzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKXx8CisgICAgICAgICAgICAgICAgIHByZXZpb3VzX29iamVjdCgpKSwicmVhZF9maWxlIixwcmV2aW91c19vYmplY3QoKSkpfHwKKyAgICAgICghY2FsbF9vdGhlcihtYXN0ZXIoKSwidmFsaWRfcmVhZCIsc291cmNlLAorICAgICAgICAgICAgICAgICAgIGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCl8fAorICAgICAgICAgICAgICAgICBwcmV2aW91c19vYmplY3QoKSksIndyaXRlX2ZpbGUiLHByZXZpb3VzX29iamVjdCgpKSkpCisgICAgcmV0dXJuIDE7CisgIHN3aXRjaCAoZmlsZV9zaXplKGRlc3QpKQorICB7CisgIGNhc2UgLTE6CisgICAgYnJlYWs7CisgIGNhc2UgLTI6CisgICAgaWYgKGRlc3RbPDFdIT0nLycpIGRlc3QrPSIvIjsKKyAgICBkZXN0Kz1lZnVuOjpleHBsb2RlKHNvdXJjZSwiLyIpWzwxXTsKKyAgICBpZiAoZmlsZV9zaXplKGRlc3QpPT0tMikgcmV0dXJuIDE7CisgICAgaWYgKGZpbGVfc2l6ZShkZXN0KSE9LTEpIGJyZWFrOworICBkZWZhdWx0OgorICAgIGlmICghcm0oZGVzdCkpIHJldHVybiAxOworICAgIGJyZWFrOworICB9CisgIGRvCisgIHsKKyAgICBieXRlcyA9IHJlYWRfYnl0ZXMoc291cmNlLCBwdHIsIE1BWExFTik7IHB0ciArPSBNQVhMRU47CisgICAgaWYgKCFieXRlcykgYnl0ZXM9IiI7CisgICAgd3JpdGVfZmlsZShkZXN0LCBieXRlcyk7CisgIH0KKyAgd2hpbGUoc2l6ZW9mKGJ5dGVzKSA9PSBNQVhMRU4pOworICByZXR1cm4gMDsKK30KKyNlbmRpZiAvLyFfX0VGVU5fREVGSU5FRF9fKGNvcHlfZmlsZSkKKworCisvLyAjIyMgRXJzYXR6YXVmbG9lc3VuZyBpbiBTdHJpbmdzICMjIwordmFyYXJncyBzdHJpbmcgcmVwbGFjZV9wZXJzb25hbChzdHJpbmcgc3RyLCBtaXhlZCAqb2JzLCBpbnQgY2FwcykgeworICBpbnQgaTsKKyAgc3RyaW5nICpwYXJ0czsKKworICBwYXJ0cyA9IHJlZ2V4cGxvZGUoc3RyLCAiQFdFW0EtU1VdKlswLTldIik7CisgIGkgPSBzaXplb2YocGFydHMpOworCisgIGlmIChpPjEpIHsKKyAgICBpbnQgaiwgdDsKKyAgICBjbG9zdXJlICpuYW1lX2NsczsKKworICAgIHQgPSBqID0gc2l6ZW9mKG9icyk7CisKKyAgICBuYW1lX2NscyAgPSAgYWxsb2NhdGUoaik7CisgICAgd2hpbGUgKGotLSkKKyAgICAgIGlmIChvYmplY3RwKG9ic1tqXSkpCisgICAgICAgIG5hbWVfY2xzW2pdID0gc3ltYm9sX2Z1bmN0aW9uKCJuYW1lIiwgb2JzW2pdKTsKKyAgICAgIGVsc2UgaWYgKHN0cmluZ3Aob2JzW2pdKSkKKyAgICAgICAgbmFtZV9jbHNbal0gPSBvYnNbal07CisKKyAgICB3aGlsZSAoKGktPSAyKT4wKSB7CisgICAgICBpbnQgb2JfbnI7CisgICAgICAvLyB6dSBlcnNldHplbmRlcyBUb2tlbiBpbiBGYWxsIHVuZCBPYmpla3RpbmRleCBhdWZzcGFsdGVuCisgICAgICBvYl9uciA9IHBhcnRzW2ldWzwxXS0nMSc7CisgICAgICBpZiAob2JfbnI8MCB8fCBvYl9ucj49dCkgeworICAgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJyZXBsYWNlX3BlcnNvbmFsOiB1c2luZyB3cm9uZyBvYmplY3QgaW5kZXggJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIG9iX25yKSk7CisgICAgICAgIHJldHVybiBpbXBsb2RlKHBhcnRzLCAiIik7CisgICAgICB9CisKKyAgICAgIC8vIGNhc3VzIGthbm4gbWFuIHNjaG9uIGhpZXIgZW50c2NoZWlkZW4KKyAgICAgIGludCBjYXN1czsKKyAgICAgIHN0cmluZyBwYXJ0ID0gcGFydHNbaV07CisgICAgICBzd2l0Y2ggKHBhcnRbM10pIHsKKyAgICAgICAgY2FzZSAnUic6IGNhc3VzID0gV0VSOyAgICBicmVhazsKKyAgICAgICAgY2FzZSAnUyc6IGNhc3VzID0gV0VTU0VOOyBicmVhazsKKyAgICAgICAgY2FzZSAnTSc6IGNhc3VzID0gV0VNOyAgICBicmVhazsKKyAgICAgICAgY2FzZSAnTic6IGNhc3VzID0gV0VOOyAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogIGNvbnRpbnVlOyAvLyBwYXNzdCBzY2hvbiBqZXR6dCBuaWNodCBpbiBkYXMgSGF1cHRtdXN0ZXIKKyAgICAgIH0KKworICAgICAgLy8gdW5kIGpldHp0IGRpZSBlaW56ZWxuZW4gS2V5d29yZHMgb2huZSBmdWVocmVuZGVzICJAV0UiLCBiZWVuZGVuZGUgSWQKKyAgICAgIG1peGVkIHRtcDsKKyAgICAgIHN3aXRjaCAocGFydFszLi48Ml0pIHsKKyAgICAgICAgY2FzZSAiUiI6IGNhc2UgIlNTRU4iOiBjYXNlICJNIjogY2FzZSAiTiI6ICAgICAgICAgICAgICAgLy8gTmFtZQorICAgICAgICAgIHBhcnRzW2ldID0gZnVuY2FsbChuYW1lX2Nsc1tvYl9ucl0sIGNhc3VzLCAxKTsgIGJyZWFrOworICAgICAgICBjYXNlICJSVSI6IGNhc2UgIlNTRU5VIjogY2FzZSAiTVUiOiBjYXNlICJOVSI6ICAgICAgICAgICAvLyB1bmJlc3RpbW10CisgICAgICAgICAgcGFydHNbaV0gPSBmdW5jYWxsKG5hbWVfY2xzW29iX25yXSwgY2FzdXMpOyAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgIlJRUCI6IGNhc2UgIlNTRU5RUCI6IGNhc2UgIk1RUCI6IGNhc2UgIk5RUCI6ICAgICAgIC8vIFByb25vdW4KKyAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKKyAgICAgICAgICAgIHBhcnRzW2ldID0gKHN0cmluZyl0bXAtPlF1ZXJ5UHJvbm91bihjYXN1cyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgIlJRQSI6IGNhc2UgIlNTRU5RQSI6IGNhc2UgIk1RQSI6IGNhc2UgIk5RQSI6ICAgICAgIC8vIEFydGljbGUKKyAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKKyAgICAgICAgICAgIHRtcCA9IChzdHJpbmcpdG1wLT5RdWVyeUFydGljbGUoY2FzdXMsIDEsIDEpOworICAgICAgICAgIGlmIChzdHJpbmdwKHRtcCkgJiYgISh0bXBbPDFdXicgJykpIAorICAgICAgICAgICAgdG1wID0gdG1wWzAuLjwyXTsgICAgICAgICAgICAgICAgLy8gRXh0cmEtU3BhY2Ugd2llZGVyIGxvZXNjaGVuCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgIlJRUFBNUyI6IGNhc2UgIlNTRU5RUFBNUyI6IGNhc2UgIk1RUFBNUyI6IGNhc2UgIk5RUFBNUyI6CisgICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCisgICAgICAgICAgICBwYXJ0c1tpXSA9IChzdHJpbmcpdG1wLT5RdWVyeVBvc3NQcm9ub3VuKE1BTEUsIGNhc3VzLCBTSU5HVUxBUik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgIlJRUFBGUyI6IGNhc2UgIlNTRU5RUFBGUyI6IGNhc2UgIk1RUFBGUyI6IGNhc2UgIk5RUFBGUyI6CisgICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCisgICAgICAgICAgICBwYXJ0c1tpXSA9IChzdHJpbmcpdG1wLT5RdWVyeVBvc3NQcm9ub3VuKEZFTUFMRSwgY2FzdXMsIFNJTkdVTEFSKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiUlFQUE5TIjogY2FzZSAiU1NFTlFQUE5TIjogY2FzZSAiTVFQUE5TIjogY2FzZSAiTlFQUE5TIjoKKyAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKKyAgICAgICAgICAgIHBhcnRzW2ldID0gKHN0cmluZyl0bXAtPlF1ZXJ5UG9zc1Byb25vdW4oTkVVVEVSLCBjYXN1cywgU0lOR1VMQVIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICJSUVBQTVAiOiBjYXNlICJTU0VOUVBQTVAiOiBjYXNlICJNUVBQTVAiOiBjYXNlICJOUVBQTVAiOgorICAgICAgICAgIGlmIChvYmplY3RwKHRtcCA9IG9ic1tvYl9ucl0pKQorICAgICAgICAgICAgcGFydHNbaV0gPSAoc3RyaW5nKXRtcC0+UXVlcnlQb3NzUHJvbm91bihNQUxFLCBjYXN1cywgUExVUkFMKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiUlFQUEZQIjogY2FzZSAiU1NFTlFQUEZQIjogY2FzZSAiTVFQUEZQIjogY2FzZSAiTlFQUEZQIjoKKyAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKKyAgICAgICAgICAgIHBhcnRzW2ldID0gKHN0cmluZyl0bXAtPlF1ZXJ5UG9zc1Byb25vdW4oRkVNQUxFLCBjYXN1cywgUExVUkFMKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiUlFQUE5QIjogY2FzZSAiU1NFTlFQUE5QIjogY2FzZSAiTVFQUE5QIjogY2FzZSAiTlFQUE5QIjoKKyAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKKyAgICAgICAgICAgIHBhcnRzW2ldID0gKHN0cmluZyl0bXAtPlF1ZXJ5UG9zc1Byb25vdW4oTkVVVEVSLCBjYXN1cywgUExVUkFMKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gd2VubiB0bXAgZWluIFN0cmluZyB3YXIsIHdlaXNlbiB3aXIgZXMgaGllciBwYXVzY2hhbCB6dQorICAgICAgaWYgKHN0cmluZ3AodG1wKSkKKyAgICAgICAgcGFydHNbaV0gPSB0bXA7CisKKyAgICAgIC8vIGF1ZiBXdW5zY2ggd2lyZCBuYWNoIFNhdHplbmRlbiBncm9zcyBnZXNjaHJpZWJlbgorICAgICAgaWYgKGNhcHMpCisgICAgICAgIHN3aXRjaCAocGFydHNbaS0xXVs8Mi4uXSkgeworICAgICAgICAgIGNhc2UgIi4gIjogIGNhc2UgIiEgIjogIGNhc2UgIj8gIjoKKyAgICAgICAgICBjYXNlICIuIjogICBjYXNlICIhIjogICBjYXNlICI/IjoKKyAgICAgICAgICBjYXNlICIuXG4iOiBjYXNlICIhXG4iOiBjYXNlICI/XG4iOgorICAgICAgICAgIGNhc2UgIlwiICI6IGNhc2UgIlwiXG4iOgorICAgICAgICAgICAgcGFydHNbaV0gPSBjYXBpdGFsaXplKHBhcnRzW2ldKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbXBsb2RlKHBhcnRzLCAiIik7CisgIH0KKyAgcmV0dXJuIHN0cjsKK30KKworCisvL3JlcGxhY2VtZW50cyBmb3IgZHJvcHBlZCBlZnVucyBpbiBMRAorI2lmICFfX0VGVU5fREVGSU5FRF9fKGV4dHJhY3QpCitkZXByZWNhdGVkIHZhcmFyZ3Mgc3RyaW5nIGV4dHJhY3Qoc3RyaW5nIHN0ciwgaW50IGZyb20sIGludCB0bykgeworCisgIGlmKCFzdHJpbmdwKHN0cikpIHsKKyAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIkJhZCBhcmd1bWVudCAxIHRvIGV4dHJhY3QoKTogJU8iLHN0cikpOworICB9CisgIGlmIChpbnRwKGZyb20pICYmIGludHAodG8pKSB7CisgICAgaWYgKGZyb20+PTAgJiYgdG8+PTApCisgICAgICByZXR1cm4oc3RyW2Zyb20gLi4gdG9dKTsKKyAgICBlbHNlIGlmIChmcm9tPj0wICYmIHRvPDApCisgICAgICByZXR1cm4oc3RyW2Zyb20gLi4gPGFicyh0byldKTsKKyAgICBlbHNlIGlmIChmcm9tPDAgJiYgdG8+PTApCisgICAgICByZXR1cm4oc3RyWzxhYnMoZnJvbSkgLi4gdG9dKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4oc3RyWzxhYnMoZnJvbSkgLi4gPGFicyh0byldKTsKKyAgfQorICBlbHNlIGlmIChpbnRwKGZyb20pKSB7CisgICAgaWYgKGZyb20+PTApCisgICAgICByZXR1cm4oc3RyW2Zyb20gLi4gXSk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKHN0cls8YWJzKGZyb20pIC4uIF0pOworICB9CisgIGVsc2UgeworICAgIHJldHVybihzdHIpOworICB9Cit9CisjZW5kaWYgLy8gIV9fRUZVTl9ERUZJTkVEX18oZXh0cmFjdCkKKworI2lmICFfX0VGVU5fREVGSU5FRF9fKHNsaWNlX2FycmF5KQorZGVwcmVjYXRlZCB2YXJhcmdzIG1peGVkIHNsaWNlX2FycmF5KG1peGVkIGFycmF5LCBpbnQgZnJvbSwgaW50IHRvKSB7CisKKyAgaWYoIXBvaW50ZXJwKGFycmF5KSkgeworICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiQmFkIGFyZ3VtZW50IDEgdG8gc2xpY2VfYXJyYXkoKTogJU8iLGFycmF5KSk7CisgIH0KKyAgaWYgKGludHAoZnJvbSkgJiYgaW50cCh0bykpIHsKKyAgICBpZiAoZnJvbT49MCAmJiB0bz49MCkKKyAgICAgIHJldHVybihhcnJheVtmcm9tIC4uIHRvXSk7CisgICAgZWxzZSBpZiAoZnJvbT49MCAmJiB0bzwwKQorICAgICAgcmV0dXJuKGFycmF5W2Zyb20gLi4gPGFicyh0byldKTsKKyAgICBlbHNlIGlmIChmcm9tPDAgJiYgdG8+PTApCisgICAgICByZXR1cm4oYXJyYXlbPGFicyhmcm9tKSAuLiB0b10pOworICAgIGVsc2UKKyAgICAgIHJldHVybihhcnJheVs8YWJzKGZyb20pIC4uIDxhYnModG8pXSk7CisgIH0KKyAgZWxzZSBpZiAoaW50cChmcm9tKSkgeworICAgIGlmIChmcm9tPj0wKQorICAgICAgcmV0dXJuKGFycmF5W2Zyb20gLi4gXSk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKGFycmF5WzxhYnMoZnJvbSkgLi4gXSk7CisgIH0KKyAgZWxzZSB7CisgICAgcmV0dXJuKGFycmF5KTsKKyAgfQorfQorI2VuZGlmIC8vICFfX0VGVU5fREVGSU5FRF9fKHNsaWNlX2FycmF5KQorCisjaWYgIV9fRUZVTl9ERUZJTkVEX18obWVtYmVyX2FycmF5KQorZGVwcmVjYXRlZCBpbnQgbWVtYmVyX2FycmF5KG1peGVkIGl0ZW0sIG1peGVkIGFycmF5c3RyaW5nKSB7CisKKyAgaWYgKHBvaW50ZXJwKGFycmF5c3RyaW5nKSkgeworICAgIHJldHVybihlZnVuOjptZW1iZXIoYXJyYXlzdHJpbmcsaXRlbSkpOworICB9CisgIGVsc2UgaWYgKHN0cmluZ3AoYXJyYXlzdHJpbmcpKSB7CisgICAgcmV0dXJuKGVmdW46Om1lbWJlcihhcnJheXN0cmluZyx0b19pbnQoaXRlbSkpKTsKKyAgfQorICBlbHNlIHsKKyAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIkJhZCBhcmd1bWVudCAxIHRvIG1lbWJlcl9hcnJheSgpOiAlTyIsYXJyYXlzdHJpbmcpKTsKKyAgfQorfQorI2VuZGlmIC8vICFfX0VGVU5fREVGSU5FRF9fKG1lbWJlcl9hcnJheSkKKworLy8gVGhlIGRpZ2l0IGF0IHRoZSBpJ3RoIHBvc2l0aW9uIGlzIHRoZSBudW1iZXIgb2YgYml0cyBzZXQgaW4gJ2knLgorc3RyaW5nIGNvdW50X3RhYmxlID0KKyAgICAiMDExMjEyMjMxMjIzMjMzNDEyMjMyMzM0MjMzNDM0NDUxMjIzMjMzNDIzMzQzNDQ1MjMzNDM0NDUzNDQ1NDU1NiI7CitpbnQgYnJva2VuX2NvdW50X2JpdHMoIHN0cmluZyBzICkgeworICAgIGludCBpLCByZXM7CisgICAgaWYoICFzdHJpbmdwKHMpIHx8ICEoaT1zaXplb2YocykpICkgcmV0dXJuIDA7CisgICAgZm9yKCA7IGktLT4wOyApIHsKKyAgICAgICAgLy8gV2UgYXJlIGNvdW50aW5nIDYgYml0cyBhdCBhIHRpbWUgdXNpbmcgYSBwcmVjb21waWxlZCB0YWJsZS4KKyAgICAgICAgcmVzICs9IGNvdW50X3RhYmxlWyhzW2ldLScgJykmNjNdLScwJzsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworI2lmICFfX0VGVU5fREVGSU5FRF9fKGNvdW50X2JpdHMpCitpbnQgY291bnRfYml0cyggc3RyaW5nIHMgKSB7CisgICAgcmV0dXJuKGJyb2tlbl9jb3VudF9iaXRzKHMpKTsKK30KKyNlbmRpZgorCisKKy8vICogVGVpbGUgYXVzIGVpbmVtIEFycmF5IGVudGZlcm5lbiAqKiogT0JTT0xFVEUKK2RlcHJlY2F0ZWQgbWl4ZWQgKmV4Y2x1ZGVfYXJyYXkobWl4ZWQgKmFycixpbnQgZnJvbSxpbnQgdG8pCit7CisgIGlmICh0bzxmcm9tKQorICAgIHRvID0gZnJvbTsKKyAgcmV0dXJuIGFyclswLi5mcm9tLTFdK2Fyclt0bysxLi5dOworfQorCmRpZmYgLS1naXQgYS9zZWN1cmUvc2lubWFzdGVyLmMgYi9zZWN1cmUvc2lubWFzdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRiOGY5NAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW5tYXN0ZXIuYwpAQCAtMCwwICsxLDIxMyBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHNlY3VyZS9zaW5tYXN0ZXIuYyAtLSBEYXMgU3RyYWZyZWdpc3RlcgorLy8KKy8vICRJZDogc2lubWFzdGVyLmMgOTE0MiAyMDE1LTAyLTA0IDIyOjE3OjI5WiBaZXNzdHJhICQKKworI2RlZmluZSBTSU5fU0FWRSAiL3NlY3VyZS9BUkNIL3NpbnMiCisjZGVmaW5lIFNJTl9MT0cgICJBUkNIL3NpbnMiCisjZGVmaW5lIFNJTl9EVU1QICIvc2VjdXJlL0FSQ0gvc2lucy5kdW1wIgorCisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKworI3ByYWdtYSBzdHJpY3RfdHlwZXMKKworbWFwcGluZyBzaW5zOworCitwdWJsaWMgdm9pZCBjcmVhdGUoKQoreworICAgIHNldGV1aWQoZ2V0dWlkKE1FKSk7CisgICAgaWYgKCAhcmVzdG9yZV9vYmplY3QoU0lOX1NBVkUpICkKKyAgICAgICAgc2lucyA9IChbXSk7Cit9CisKK3N0YXRpYyB2b2lkIHNhdmVfbWUoKQoreworICAgIHNhdmVfb2JqZWN0KFNJTl9TQVZFKTsKK30KKworcHJpdmF0ZSB2YXJhcmdzIGludCBpc19hbGxvd2VkKGludCBhcmNob25seSkKK3sKKyAgaWYgKHByZXZpb3VzX29iamVjdCgpICYmIGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpPT1ST09USUQpCisgICAgcmV0dXJuIDE7CisgIGlmICghcHJvY2Vzc19jYWxsKCkgJiYgcHJldmlvdXNfb2JqZWN0KCkgJiYgdGhpc19pbnRlcmFjdGl2ZSgpICYmIChBUkNIX1NFQ1VSSVRZIHx8ICghYXJjaG9ubHkgJiYgSVNfREVQVVRZKHNlY3VyZV9ldWlkKCkpKSApICkKKyAgICByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9CisKK3B1YmxpYyBub21hc2sgaW50IHF1ZXJ5X3ByZXZlbnRfc2hhZG93KCkKK3sKKyAgICByZXR1cm4gMTsKK30KKworcHVibGljIHN0cmluZyBMaXN0U2lubmVycygpCit7ICAgc3RyaW5nICpuYW1lczsKKworICAgIGlmICggIWlzX2FsbG93ZWQoKSApCisgICAgICByZXR1cm4gIkFDQ0VTUyBERU5JRURcbiI7CisKKyAgICBpZiAoIHNpemVvZihuYW1lcz1tX2luZGljZXMoc2lucykpPDEgKQorICAgICAgcmV0dXJuICJFcyBzaW5kIGtlaW5lIEVpbnRyYWVnZSB2b3JoYW5kZW4uXG4iOworCisgICAgbmFtZXMgPSBzb3J0X2FycmF5KCBtYXAoIG5hbWVzLCAjJ2NhcGl0YWxpemUgKSwgIyc+ICk7CisKKyAgICByZXR1cm4gc3ByaW50ZigiTGlzdGUgZGVyIGVpbmdldHJhZ2VuZW4gU3VlbmRlcjpcbiUjNzguNnNcbiIsCisgICAgICAgICAgICAgICAgICAgaW1wbG9kZShuYW1lcywiXG4iKSk7Cit9CisKK3B1YmxpYyBzdHJpbmcgTGlzdFNpbnMoc3RyaW5nIHdobykKK3sgICBzdHJpbmcgcmU7CisgICAgaW50ICAgIGksajsKKworICAgIGlmICggIWlzX2FsbG93ZWQoKSApCisgICAgICByZXR1cm4gIkFDQ0VTUyBERU5JRURcbiI7CisKKyAgICBpZiAoICFzdHJpbmdwKHdobykgfHwgKHNpemVvZih3aG8pPDEpICkKKyAgICAgIHJldHVybiAiU1lOVEFYIEVSUk9SLlxuIjsKKworICAgIGlmICggIW1lbWJlcihzaW5zLHdobykgfHwgIXBvaW50ZXJwKHNpbnNbd2hvXSkgfHwgKChqPXNpemVvZihzaW5zW3dob10pKTwxKSApCisgICAgICByZXR1cm4gc3ByaW50ZigiRXMgbGllZ2VuIGtlaW5lIEVpbnRyYWVnZSBmdWVyICclcycgdm9yLlxuIixDQVAod2hvKSk7CisKKyAgICBmb3IgKCBpPTEsIHJlID0gKChzdHJpbmcpc2luc1t3aG9dWzBdKyJcbiIpIDsgaTxqIDsgaSsrICkKKyAgICAgIHJlICs9IHNwcmludGYoIiUzZDogJXNcbiIsaSwoc3RyaW5nKXNpbnNbd2hvXVtpXSk7CisKKyAgICByZXR1cm4gcmU7Cit9CisKK3N0YXRpYyB2b2lkIF9hZGRfZW50cnkoc3RyaW5nIHdobywgc3RyaW5nIGVudHJ5LCBvYmplY3QgcGwpCit7ICAgc3RyaW5nICphZGQ7CisKKyAgICBpZiAoIG1lbWJlcihzaW5zLHdobykgJiYgcG9pbnRlcnAoc2luc1t3aG9dKSAmJiAoc2l6ZW9mKHNpbnNbd2hvXSk+MCkgKQorICAgICAgICBhZGQgPSAoc3RyaW5nKilzaW5zW3dob107CisgICAgZWxzZQorICAgICAgICBhZGQgPSAoeyBzcHJpbnRmKCJFaW50cmFlZ2UgZnVlciAnJXMnOiIsQ0FQKHdobykpIH0pOworCisgICAgYWRkICs9ICh7IGVudHJ5IH0pOworCisgICAgc2luc1t3aG9dID0gYWRkOworCisgICAgc2F2ZV9tZSgpOworCisgICAgbG9nX2ZpbGUoU0lOX0xPRywKKyAgICAgICAgc3ByaW50ZigiJXMgRWludHJhZyBmdWVyICVzIHZvbiAlc1xuIiwKKyAgICAgICAgICAgIGR0aW1lKHRpbWUoKSksQ0FQKHdobyksQ0FQKGdldHVpZChwbCkpICkgKTsKK30KKworcHVibGljIHN0cmluZyBBZGRTaW4oc3RyaW5nIHdobywgc3RyaW5nIHRleHQpCit7ICAgb2JqZWN0IHBsOworICAgIHN0cmluZyBlcnN0aTsKKworICAgIGlmICggIWlzX2FsbG93ZWQoKSApCisgICAgICByZXR1cm4gIkFDQ0VTUyBERU5JRURcbiI7CisKKyAgICBpZiAoICFzdHJpbmdwKHdobykgfHwgKHNpemVvZih3aG8pPDEpCisgICAgICAgIHx8ICFzdHJpbmdwKHRleHQpIHx8IChzaXplb2YodGV4dCk8MSkgKQorICAgICAgcmV0dXJuICJTWU5UQVggRVJST1IuXG4iOworCisgICAgaWYgKCB0ZXh0WzAuLjJdPT0iLWYgIiApCisgICAgICB0ZXh0PXRleHRbMy4uXTsKKyAgICBlbHNlIGlmICggZmlsZV9zaXplKHNwcmludGYoIi9zYXZlLyVzLyVzLm8iLHdob1swLi4wXSx3aG8pKTwxKQorICAgICAgcmV0dXJuIHNwcmludGYoIkVzIGdpYnQga2VpbmVuIFNwaWVsZXIgbmFtZW5zICclcydcbiIsd2hvKTsKKworICAgIHRleHQgPSBkdGltZSh0aW1lKCkpICsgIiAoIitDQVAoZ2V0dWlkKFJQTCkpKyIpXG4iIAorICAgICAgICAgKyBicmVha19zdHJpbmcodGV4dCw3OCwiICAgICAiICk7CisKKyAgICBfYWRkX2VudHJ5KCB3aG8sIHRleHQsIFJQTCApOworCisgICAgaWYgKCBvYmplY3RwKHBsPShmaW5kX3BsYXllcih3aG8pfHxmaW5kX25ldGRlYWQod2hvKSkpCisgICAgICAgICYmICFJU19XSVpBUkQocGwpIC8vIE1hZ2llciBoYWJlbiBtYW5jaG1hbCBrb21pc2NoZSBFcnN0aWVzIC4uLgorICAgICAgICAmJiBzdHJpbmdwKGVyc3RpPShzdHJpbmcpcGwtPlF1ZXJ5UHJvcChQX1NFQ09ORCkpICkKKyAgICB7CisgICAgICAgIHJldHVybiAoIHNwcmludGYoIk9rLlxuRnVlZ2UgRWludHJhZyBiZWkgRXJzdGkgJyVzJyBoaW56dS5cbiIsZXJzdGkpCisgICAgICAgICAgICAgICAgKyBBZGRTaW4oIGxvd2VyX2Nhc2UoZXJzdGkpLCAoIi1mIHNpZWhlICIrd2hvKSApICk7CisgICAgfQorCisgICAgcmV0dXJuICJPSy5cbiI7Cit9CisKK3B1YmxpYyBzdHJpbmcgUmVtb3ZlU2luKHN0cmluZyB3aG8sIGludCBucikKK3sgICBzdHJpbmcgKnJlbTsKKworICAgIGlmICggIWlzX2FsbG93ZWQoMSkgKQorICAgICAgcmV0dXJuICJBQ0NFU1MgREVOSUVEXG4iOworCisgICAgaWYgKCAhaW50cChucikgfHwgKG5yPDEpIHx8ICFzdHJpbmdwKHdobykgfHwgKHNpemVvZih3aG8pPDEpICkKKyAgICAgIHJldHVybiAiU1lOVEFYIEVSUk9SLlxuIjsKKworICAgIGlmICggIW1lbWJlcihzaW5zLHdobykgfHwgIXBvaW50ZXJwKHNpbnNbd2hvXSkgfHwgKHNpemVvZihzaW5zW3dob10pPDEpICkKKyAgICAgIHJldHVybiBzcHJpbnRmKCJGRUhMRVI6IEtlaW5lIEVpbnRyYWVnZSBmdWVyICclcycgdm9yaGFuZGVuLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgIENBUCh3aG8pKTsKKworICAgIHJlbSA9IChzdHJpbmcqKXNpbnNbd2hvXTsKKworICAgIGlmICggc2l6ZW9mKHJlbSk8PW5yICkKKyAgICAgIHJldHVybiAiRkVITEVSOiBEaWVzZW4gRWludHJhZyBnaWJ0IGVzIG5pY2h0LlxuIjsKKworICAgIHJlbVtucl0gPSAwOworCisgICAgcmVtIC09ICh7IDAgfSk7CisKKyAgICBsb2dfZmlsZShTSU5fTE9HLAorICAgICAgICBzcHJpbnRmKCIlcyBMb2VzY2h1bmcgYmVpICVzIHZvbiAlc1xuIiwKKyAgICAgICAgICAgIGR0aW1lKHRpbWUoKSksQ0FQKHdobyksQ0FQKGdldHVpZChSUEwpKSApICk7CisKKworICAgIGlmICggc2l6ZW9mKHJlbSk8MiApCisgICAgeworICAgICAgICBtX2RlbGV0ZShzaW5zLHdobyk7CisgICAgICAgIHNhdmVfbWUoKTsKKyAgICAgICAgcmV0dXJuIHNwcmludGYoIkxldHp0ZW4gRWludHJhZyB2b24gJyVzJyBnZWxvZXNjaHQuXG4iLENBUCh3aG8pKTsKKyAgICB9CisKKyAgICBzaW5zW3dob10gPSByZW07CisgICAgc2F2ZV9tZSgpOworCisgICAgcmV0dXJuIHNwcmludGYoIkVpbnRyYWcgJWQgdm9uICclcycgZ2Vsb2VzY2h0LlxuIixucixDQVAod2hvKSk7Cit9CisKK3B1YmxpYyB2YXJhcmdzIHN0cmluZyBEdW1wKGludCBmbGFnKQoreyAgIHN0cmluZyAqc25yLCpzbnMsZHVtcDsKKyAgICBpbnQgICAgaSxqLGsscyx0OworCisgICAgaWYgKCAhaXNfYWxsb3dlZCgwKSApCisgICAgICByZXR1cm4gIkFDQ0VTUyBERU5JRURcbiI7CisKKyAgICBpZiAoICFmbGFnICYmIGZpbGVfc2l6ZShTSU5fRFVNUCk+MSApCisgICAgICBybSggU0lOX0RVTVAgKTsKKworICAgIHM9aT1zaXplb2Yoc25yPXNvcnRfYXJyYXkobV9pbmRpY2VzKHNpbnMpLCMnPCkpOworCisgICAgaWYgKCBpPDEgKQorICAgICAgcmV0dXJuICJLZWluZSBTdWVuZGVyIGRhLlxuIjsKKworICAgIGR1bXAgPSBzcHJpbnRmKCJcbiV8NzhzXG4lJz0nNzguNzhzXG5cbiIsCisgICAgICAgICAgICAgICBzcHJpbnRmKCJEdW1wIGRlciBTdWVuZGVuLUVpbnRyYWVnZSAoJXMpOiIsZHRpbWUodGltZSgpKSksCisgICAgICAgICAgICAgICAiIik7CisKKyAgICBmb3IgKCAtLWksdD0wIDsgaT49MCA7IGktLSApCisgICAgeworICAgICAgICBqID0gc2l6ZW9mKHNucz1zaW5zW3NucltpXV0pOworICAgICAgICB0ICs9IChqLTEpOworICAgICAgICBkdW1wICs9IChzbnNbMF0rIlxuXG4iKTsKKworICAgICAgICBmb3IgKCBrPTEgOyBrPGogOyBrKysgKQorICAgICAgICAgICAgZHVtcCArPSBzcHJpbnRmKCIlM2Q6ICVzXG4iLGssc25zW2tdKTsKKworICAgICAgICBkdW1wICs9IHNwcmludGYoIiUnPSc3OC43OHNcblxuIiwiIik7CisgICAgfQorCisgICAgZHVtcCArPSBzcHJpbnRmKCJTdGF0aXN0aWs6XG5cbiIrCisgICAgICAgICAgICAgICAgICAgICIgIEVzIHNpbmQgJWQgU3VlbmRlciBtaXQgaW5zZ2VzLiAlZCBFaW50cmFlZ2VuIHZvcmhhbmRlbi5cbiIrCisgICAgICAgICAgICAgICAgICAgICIgIERhcyBtYWNodCBlaW5lbiBTY2huaXR0IHZvbiAlLjZmIEVpbnRyYWVnZW4uXG5cbiIsCisgICAgICAgICAgICAgICAgICAgIHMsdCwoIHRvX2Zsb2F0KHQpL3RvX2Zsb2F0KHMpICkpOworCisgICAgaWYgKCAhZmxhZyApCisgICAgeworICAgICAgICB3cml0ZV9maWxlKFNJTl9EVU1QLGR1bXApOworICAgICAgICByZXR1cm4gc3ByaW50ZigiRXMgd3VyZGVuICVkIFN1ZW5kZXIgZ2VkdW1wZWQuXG4iLHMpOworICAgICAgICAKKyAgICB9CisgICAgcmV0dXJuIGR1bXA7Cit9CmRpZmYgLS1naXQgYS9zZWN1cmUvc3ludGF4ZGIuYyBiL3NlY3VyZS9zeW50YXhkYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MmVhZTYKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc3ludGF4ZGIuYwpAQCAtMCwwICsxLDIyMyBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLyoqIFxmaWxlIC9maWxlLmMKKyogbWVya3Qgc2ljaCBTeW50YXhlbiB1bmQgZGVyZW4gRXJmb2xnCisqIEtvbW10IGdhciBuaWNodCBtaXQgZ2VzY2hhY2h0ZWx0ZW4gQmVmZWhsZW4ga2xhci4uLgorKiBcYXV0aG9yIFplc3N0cmEKKyovCisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHNhdmVfdHlwZXMscnR0X2NoZWNrcworI3ByYWdtYSBub19jbG9uZSxub19pbmhlcml0LG5vX3NoYWRvdworI3ByYWdtYSBwZWRhbnRpYywgcmFuZ2VfY2hlY2sKKworI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxldmVudHMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxwbGF5ZXIvYmFzZS5oPgorI2luY2x1ZGUgPHVzZXJpbmZvLmg+CisjaW5jbHVkZSA8ZHJpdmVyX2luZm8uaD4KKyNpbmNsdWRlIDxyZWdleHAuaD4KKworI2RlZmluZSBIT01FKHgpIChfX1BBVEhfXygwKSt4KQorI2RlZmluZSBaREVCVUcoeCkgdGVsbF9yb29tKCIvcGxheWVycy96ZXNzdHJhL3dvcmtyb29tIixcCisgICAgICAgICAgICAgICAgICAgIHNwcmludGYoInN5bnRheDogJU9cbiIseCkpOworCittYXBwaW5nIGJsYWNrbGlzdDsKKworc3RydWN0IGNtZF9zIHsKKyAgICBzdHJpbmcgdmVyYjsKKyAgICBzdHJpbmcgY21kOworICAgIHN0cmluZyB1aWQ7CisgICAgaW50IHN1Y2Nlc3M7CisgICAgaW50IGZwOworICAgIGludCBldmFsbm87CisgICAgc3RyaW5nIHRwX3VpZDsKKyAgICBpbnQgZmluaXNoZWQ7Cit9OworCisvLyBMSXN0ZSBkZXIgbGV0enRlbiBLb21tYW5kb3MsIFF1ZXVlIHp1bSBzcGVpY2hlcm4gaW4gZGllIERCLgorLy8gRGFzIGxldHp0ZSBFbGVtZW50IGlzdCBkYXMgbGV0enRlIEtvbW1hbmRvIChnZ2YuIG5vY2ggbmljaHQgYWJnZXNjaGxvc3NlbikKK3ByaXZhdGUgc3RydWN0IGNtZF9zICpjb21tYW5kcyA9ICh7fSk7CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgIHNldGV1aWQoZ2V0dWlkKCkpOworICBpZiAoc2xfb3BlbihIT01FKCJBUkNIL3N5bnRheGVuLnNxbGl0ZSIpKSAhPSAxKQorICB7CisgICAgcmFpc2VfZXJyb3IoIkRhdGVuYmFuayBrb25udGUgbmljaHQgZ2VvZWZmbmV0IHdlcmRlbi5cbiIpOworICB9CisgIC8vIFRhYmVsbGVuIHVuZCBJbmRpY2VzIGFubGVnZW4sIGZhbGxzIGRpZSBuaWNodCBleGlzdGllcmVuLgorICBzbF9leGVjKCJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBzeW50YXhlbigiCisgICAgICAgICAgImNtZCBURVhUIFVOSVFVRSwgIgorICAgICAgICAgICJ2ZXJiIFRFWFQgTk9UIE5VTEwsIGVudnVpZCBURVhUIE5PVCBOVUxMLCAiCisgICAgICAgICAgInN1Y2Nlc3MgSU5URUdFUiwgY291bnQgSU5URUdFUiwgZnAgSU5URUdFUik7Iik7CisgIHNsX2V4ZWMoIkNSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGlkeF92ZXJiIE9OIHN5bnRheGVuKHZlcmIpOyIpOworICAvLyBkaWVzZXMgT2JqZWt0IGRhcmYgbnVyIHBlciBoYW5kIChtaXQgdGhpc19wbGF5ZXIoKSkgZ2VsYWRlbiB3ZXJkZW4sIHdlaWwKKyAgLy8gZGEgZWluIFRlaWwgZGVyIEJsYWNrbGlzdCBoZXJrb21tdC4uLiBNYW4gYmVhY2h0ZSwgZGFzcyBkaWVzIGF1Y2ggZGFzCisgIC8vIGlzdCwgd2FzIGRpZSB1ZWJsaWNoZW4gS29tbXVuaWthdGlvbnNiZWZlaGxlIGF1c2ZpbHRlcnQuCisgIHN0cmluZyAqdG1wID0gbWFwKHRoaXNfcGxheWVyKCktPlF1ZXJ5UHJvcChQX0xPQ0FMQ01EUyksCisgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHN0cmluZyAobWl4ZWQgdmFsKQorICAgICAgICAgICAgICAgICAgICB7cmV0dXJuIHZhbFswXTt9CisgICAgICAgICAgICAgICAgICAgKTsKKyAgYmxhY2tsaXN0ID0gbWttYXBwaW5nKHRtcAorICAgICAgICAgICAgICAgICAgLSAoeyAidG9ldGUiLCJzY2hudXBwZXIiLCAic2NobnVwcGVyZSIsICJzdWNoZSIsInN1Y2giLAorICAgICAgICAgICAgICAgICAgICAgICAidW50IiwgInVudGVyc3VjaGUiLCJ1bnRlcnN1Y2giLCAicmllY2giLAorICAgICAgICAgICAgICAgICAgICAgICAicmllY2hlIiwgImxhdXNjaCIsICJsYXVzY2hlIiwgInRhc3RlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgImZ1ZWhsIiwgImZ1ZWhsZSwgYmVydWVocmUiLCAic2NoYXUiLCAic2NoYXVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgImxlcyIsICJsaWVzIiwgImJldHJhY2h0ZSIsICJiZXRyIiwgImJldHJhY2h0IiwgCisgICAgICAgICAgICAgICAgICAgICAgICJ0ZWlsZSIgLy8gd2lyZCBwZXIgcmVnZXhwIGdlZmlsdGVydCEKKyAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICArICh7Im1haWwiLCJmcmFnZSIsImZyYWciLCAieGxvYWQiLCAieGV2YWwiLCAieGNhbGwiLAorICAgICAgICAgICAgICAgICAgICAgICJncnVwcGUiLCAiZyIsICJ0ZWFtIiwgImZydWZlIiwgImZydWYiLCAiZndlciIsCisgICAgICAgICAgICAgICAgICAgICAgImZlbW90ZSIsICJya251ZGRlbCIsICJrbnVkZGVsIiwgIm5pY2siLCAibmlja2UiLAorICAgICAgICAgICAgICAgICAgICAgICJybmljayIsICJybmlja2UiLCAia251ZGRlbCIsICJrbnVkZGVsZSIsCisgICAgICAgICAgICAgICAgICAgICAgInJrbnVkZGVsIiwgInJrbnVkZGVsZSIsImRlbmtlIiwiZGVuayIsCisgICAgICAgICAgICAgICAgICAgICAgImZmaXgiLCJmbm90aXoiLCJmdWViZXJ0cmFnZSIsICJjaGFvc2tvbnRyb2xsZSIsCisgICAgICAgICAgICAgICAgICAgICAgImtyZWlzIiwgLy8gTWF0cml4a3Jpc3RhbGwKKyAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICApOworfQorCitwcml2YXRlIHZvaWQgd3JpdGVfZGIoKQoreworICBmb3JlYWNoKHN0cnVjdCBjbWRfcyBjIDogY29tbWFuZHMpCisgIHsKKyAgICBpbnQqKiByb3c9c2xfZXhlYygiU0VMRUNUIHJvd2lkLCBzdWNjZXNzLCBjb3VudCwgZnAgZnJvbSBzeW50YXhlbiAiCisgICAgICAgICAgICAgICAgICAgICAgIldIRVJFIGNtZD0/MTsiLAorICAgICAgICAgICAgICAgICAgICAgIGMtPmNtZCk7CisgICAgaWYgKHJvdykKKyAgICB7CisgICAgICBzbF9leGVjKCJVUERBVEUgc3ludGF4ZW4gU0VUIHN1Y2Nlc3M9PzIsIGNvdW50PT8zLCBmcD0/NCIKKyAgICAgICAgICAgICAgIldIRVJFIHJvd2lkPT8xOyIsIHJvd1swXVswXSwKKyAgICAgICAgICAgICAgYy0+c3VjY2VzcyB8fCByb3dbMF1bMV0sCisgICAgICAgICAgICAgICsrcm93WzBdWzJdLCBjLT5mcCB8fCByb3dbMF1bM10gKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHNsX2V4ZWMoIklOU0VSVCBJTlRPIHN5bnRheGVuKHZlcmIsIGNtZCwgZW52dWlkLCBzdWNjZXNzLCBjb3VudCwgZnApICIKKyAgICAgICAgICAgICAgIlZBTFVFUyg/MSw/Miw/Myw/NCw/NSw/Nik7IiwKKyAgICAgICAgICAgICAgYy0+dmVyYiwgYy0+Y21kLCBjLT51aWQsIGMtPnN1Y2Nlc3MsIDEsIGMtPmZwKTsKKyAgICB9CisgIH0KKyAgY29tbWFuZHMgPSAoe30pOworfQorCisvLyBCZWVuZGV0IGVpbiBLb21tYW5kbywgd2lyZCBudXIgaW50ZXJuIGdlcnVmZW4KK3ByaXZhdGUgdm9pZCBjb21taXQoc3RydWN0IGNtZF9zIGMpCit7CisgIGMtPmZpbmlzaGVkID0gMTsKKyAgLy9wcmludGYoIktvbW1hbmRvIGFiZ2VzY2hsb3NzZW46ICVPXG4iLCBjKTsKKyAgaWYgKGdldF9ldmFsX2Nvc3QoKSA+IDEwMDAwMDAKKyAgICAgICYmIHNpemVvZihjb21tYW5kcykgPiA1CisgICAgICAmJiBmaW5kX2NhbGxfb3V0KCMnd3JpdGVfZGIpID09IC0xKQorICB7CisgICAgLy8gSW4gREIgd2Vnc2NocmVpYmVuCisgICAgY2FsbF9vdXQoIyd3cml0ZV9kYiwgMSk7CisgIH0KK30KKworcHVibGljIHZhcmFyZ3MgaW50IHJlbW92ZShpbnQgc2lsZW50KQoreworICB3cml0ZV9kYigpOworICBkZXN0cnVjdCh0aGlzX29iamVjdCgpKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIGdlcnVmZW4sIHdlbm4gZWluIFNwaWVsZXIgZWluIEtvbW1hbmRvIGVpbmdldGlwcHQgaGF0LCBhdXMgbW9kaWZ5X2NvbW1hbmQoKQorLy8gaGVyYXVzLiBOYWNoIFBhcnNlbiB1bmQgS29tbWFuZG9ibG9jaywgYWJlciB2b3IgYWxsZW0gYW5kZXJlbi4KKy8vIEFDSFRVTkc6IHdlbm4gZWluIEtvbW1hbmRvIGVyZm9sZ3JlaWNoIGlzdCwgd2lyZCBLRUlOIGVuZF9jbWQoKSB2b24gYXVzc2VuCisvLyBnZXJ1ZmVuLi4uCitwdWJsaWMgdm9pZCBzdGFydF9jbWQoc3RyaW5nIGNtZHN0cikKK3sKKyAgaWYgKCFpbnRlcmFjdGl2ZShwcmV2aW91c19vYmplY3QoKSkpCisgICAgICByZXR1cm47CisgIGNtZHN0ciA9IGxvd2VyX2Nhc2UoY21kc3RyKTsKKyAgLy8gbGV0enRlcyBLb21tYW5kbyBub3RmYWxscyBhYnNjaGxpZXNzZW4KKyAgc3RydWN0IGNtZF9zIGNtZDsKKyAgaWYgKHNpemVvZihjb21tYW5kcykpCisgIHsKKyAgICBjbWQgPSBjb21tYW5kc1s8MV07CisgICAgaWYgKCFjbWQtPmZpbmlzaGVkKQorICAgIHsKKyAgICAgIC8vIHdpciBiZXRyYWNodGVuIGVzIHVlYnJpZ2VucyBhbHMgZXJmb2xncmVpY2ghCisgICAgICBjb21taXQoY21kKTsKKyAgICB9CisgIH0KKyAgLy8gdGVpbGUtIG1pdCB1bmQgRWJlbmVuIHVuZCBhbGxlIEtvbW1hbmRvcywgZGllIG51ciBhdXMgdmVyYiB1bmQgZWluZW0gV29ydAorICAvLyBiZXN0ZWhlbiwgc2luZCBhdWNoIHVubnVldHouCisgIC8vcHJpbnRmKCIlT1xuIixjbWRzdHIpOworICBpZiAoc2l6ZW9mKGV4cGxvZGUoY21kc3RyLCAiICIpKSA8IDMKKyAgICAgIHx8IHNpemVvZihjbWRzdHIpID4gMTAwCisgICAgICB8fCByZWdtYXRjaChjbWRzdHIsIl50ZWlsZS4qbWl0IixSRV9QQ1JFKQorICAgICAgfHwgcmVnbWF0Y2goY21kc3RyLCJeLVtbOmFscGhhOl0tXSpbJyA6XXsxfSIsUkVfUENSRSkKKyAgICAgIHx8IHJlZ21hdGNoKGNtZHN0ciwiXlsuJ10iLCBSRV9QQ1JFKQorICAgICApCisgIHsKKyAgICAgIHJldHVybjsKKyAgfQorICBjbWQgPSAoPGNtZF9zPiB2ZXJiOiBleHBsb2RlKGNtZHN0ciwgIiAiKVswXSwKKyAgICAgICAgIGNtZDogY21kc3RyLAorICAgICAgICAgdWlkOiBnZXR1aWQoZW52aXJvbm1lbnQodGhpc19wbGF5ZXIoKSkpLAorICAgICAgICAgZXZhbG5vOiBkcml2ZXJfaW5mbyhESV9FVkFMX05VTUJFUiksCisgICAgICAgICBzdWNjZXNzOiAxLAorICAgICAgICAgdHBfdWlkOiBnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpLAorICAgICAgKTsKKyAgLy8gc29uc3RpZ2UgQmxhY2tsaXN0CisgIGlmIChtZW1iZXIoYmxhY2tsaXN0LCBjbWQtPnZlcmIpKQorICAgICAgcmV0dXJuOworCisgIGNvbW1hbmRzICs9ICh7Y21kfSk7CisgIC8vcHJpbnRmKCJLb21tYW5kb3N0YXJ0OiAlT1xuIiwgY21kKTsKK30KKworLy8gZ2VydWZlbiB2b24gX2F1c3dlcnRlbigpIGltIFNwaWVsZXJvYmpla3QgLSBkYXMga29tbXQgemllbWxpY2ggYW0gRW5kZSBkZXIKKy8vIEtvbW1hbmRvdmVyYXJiZWl0dW5nIC0gd2VubiBlcyBub2NoIGdlcnVmZW4gd2lyZCB1bmQgdW5zIHJ1ZnQsIGJldHJhY2h0ZW4KKy8vIHdpciBkYXMgS29tbWFuZG8gYWxzIE5JQ0hUIGVyZm9sZ3JlaWNoLgorcHVibGljIHZvaWQgY21kX3Vuc3VjY2Vzc2Z1bCgpCit7CisgIGlmICghc2l6ZW9mKGNvbW1hbmRzKSkKKyAgICByZXR1cm47CisgIHN0cnVjdCBjbWRfcyBjbWQgPSBjb21tYW5kc1s8MV07CisgIC8vIERhcmYgbnVyIHZvbSBTcGllbGVyb2JqZWt0IGdlcnVmZW4gd2VyZGVuLCB3ZWxjaGVzIGRhcyBsZXR6dGUgS29tbWFuZG8KKyAgLy8gYW5nZWZhbmdlbiBoYXQuCisgIGlmIChjbWQtPnRwX3VpZCAhPSBnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpKQorICAgIHJldHVybjsKKyAgLy8gdW5kIGRpZXMgZ2Vob2VydCBudXIgenVtIGxldHp0ZW4gS29tbWFuZG8sIHdlbm4gVmVyYiB1bmQgRXZhbC1ObworICAvLyB1ZWJlcmVpbnN0aW1tZW4uCisgIGlmIChjbWQtPnZlcmIgPT0gcXVlcnlfdmVyYigpCisgICAgICB8fCBjbWQtPmV2YWxubyA9PSBkcml2ZXJfaW5mbyhESV9FVkFMX05VTUJFUikpCisgIHsKKyAgICBjbWQtPnN1Y2Nlc3MgPSAwOworICAgIC8vcHJpbnRmKCJLb21tYW5kbyBuaWNodCBlcmZvbGdyZWljaDogJU9cbiIsIGNtZCk7CisgICAgY29tbWl0KGNtZCk7CisgIH0KKyAgLy8gV2VubiBuaWNodCwgd2FyIGRhcyBsZXR6dGUgS29tbWFuZG8gb2ZmZW5iYXIgZG9jaCBlcmZvbGdyZWljaC4gQXVzCisgIC8vIGlyZ2VuZG5lbSBHcnVuZCBoYWJlbiB3aXIgYWJlciBkZW4gU3RhcnQgZGVzIG5ldWVuIEtvbW1hbmRvcyB2ZXJwYXNzdC4KKyAgLy8gRGFoZXIgdmVyd2VyZmVuIHdpciBkYXMgamV0enQuIERhcyBhbHRlIEtvbW1hbmRvIHdhciBhYmVyIG9mZmVuYmFyCisgIC8vIGVyZm9sZ3JlaWNoLCBkYWhlciB3aXJkIGVzIGpldHp0IGFiZ2VzY2hsb3NzZW4uCisgIGVsc2UKKyAgeworICAgIGNvbW1pdChjbWQpOworICB9Cit9CisKK3B1YmxpYyB2b2lkIExvZ0VQKGludCB0eXBlKQoreworICBpZiAoIXNpemVvZihjb21tYW5kcykpCisgICAgcmV0dXJuOworICBzdHJ1Y3QgY21kX3MgY21kID0gY29tbWFuZHNbPDFdOworICAvLyBEYXJmIG51ciB2b20gU3BpZWxlcm9iamVrdCBnZXJ1ZmVuIHdlcmRlbiwgd2VsY2hlcyBkYXMgbGV0enRlIEtvbW1hbmRvCisgIC8vIGFuZ2VmYW5nZW4gaGF0LgorICBpZiAoY21kLT50cF91aWQgIT0gZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKSkKKyAgICByZXR1cm47CisgIC8vcHJpbnRmKCJGUCBnZWZ1bmRlbjogJU9cbiIsIGNtZCk7CisgIC8vIHVuZCBkaWVzIGdlaG9lcnQgbnVyIHp1bSBsZXR6dGVuIEtvbW1hbmRvLCB3ZW5uIFZlcmIgdW5kIEV2YWwtTm8KKyAgLy8gdWViZXJlaW5zdGltbWVuLgorICBpZiAoY21kLT52ZXJiID09IHF1ZXJ5X3ZlcmIoKQorICAgICAgfHwgY21kLT5ldmFsbm8gPT0gZHJpdmVyX2luZm8oRElfRVZBTF9OVU1CRVIpKQorICB7CisgICAgY21kLT5mcCA9IHR5cGUrMTsKKyAgICAvLyBVbmQgd2VubiBlcyBuZW4gRlAgZ2FiLCBpc3QgZGFzIEtvbW1hbmRvIGF1Y2ggZXJmb2xncmVpY2guCisgICAgY29tbWl0KGNtZCk7CisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL3RlbG5ldG5lZy1zdHJ1Y3RzLmMgYi9zZWN1cmUvdGVsbmV0bmVnLXN0cnVjdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWZlZWFlCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3RlbG5ldG5lZy1zdHJ1Y3RzLmMKQEAgLTAsMCArMSw0NyBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHRlbG5ldG5lZy1zdHJ1Y3RzLmMgLS0gU3RydWN0cyBmdWVyIGRpZSBUZWxuZXQgT3B0aW9uIGhhbmRsZXIKKy8vCisjcHJhZ21hIHN0cmljdF90eXBlcyxzYXZlX3R5cGVzCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIG5vX3NoYWRvdworI3ByYWdtYSBwZWRhbnRpYworCitzdHJ1Y3QgdG9fc3RhdGVfcyB7CisgIGludCBsb2NhbHNpZGU7ICAgICAgLy8gd2lzaCBmb3IgdGhlIGxvY2FsIHNpZGUgKE1VRCkKKyAgaW50IHJlbW90ZXNpZGU7ICAgICAvLyB3aXNoIGZvciB0aGUgcmVtb3RlIHNpZGUgKENMSUVOVCkKKyAgaW50ICpzYmRhdGE7ICAgICAgICAvLyBsYXN0IFNCIGRhdGEgc2VudC9yZWNlaXZlZCBieSB1cworfTsKKworc3RydWN0IHRlbG9wdF9zIHsKKyAgaW50IG9wdGlvbjsKKyAgIC8vIFJlY2VpdmVoYW5kbGVyLCB3aXJkIGdlcnVmZW4sIHdlbm4gd2lyIHZvbSBDbGllbnQgaXJnZW5kd2FzIGJ6Z2wuIGRpZXNlcgorICAgLy8gVGVsbmV0IE9wdGlvbiBlbXBmYW5nZW4uIFdlbm4gZ2VzZXR6dCwgZGFyZiBkZXIgQ2xpZW50IGRpZSBPcHRpb24KKyAgIC8vIGVpbnNjaGFsdGVuLgorICBjbG9zdXJlIHJlbW90ZWhhbmRsZXI7CisgIC8vIFdpcmQgZ2VydWZlbiwgd2VubiBkaWUgT3B0aW9uIGF1ZiB1bnNlcmVyIFNlaXRlIGVpbmdlc2NoYWx0ZXQgd3VyZGUuCisgIC8vIFdlbm4gZ2VzZXR6dCwgc29sbCB2ZXJzdWNodCB3ZXJkZW4sIGRpZSBPcHRpb24gYXVmIE11ZHNlaXRlCisgIC8vIGVpbnp1c2NoYWx0ZW4KKyAgY2xvc3VyZSBsb2NhbGhhbmRsZXI7CisgIC8vIERpZSBXdWVuc2NoZSBfd2FlaHJlbmRfIGVpbmVyIFZlcmhhbmRsdW5nIChiencuIGdlc2VuZGV0ZSAobG9fd2lzaGVzKSB1bmQKKyAgLy8gZW1wZmFuZ2VuZSAocmVfd2lzaGVzKSBTQi1EYXRlbiBhdWNoIGF1c3NlcmhhbGIgdm9uIFZlcmhhbmRsdW5nZW4pLgorICBzdHJ1Y3QgdG9fc3RhdGVfcyBsb193aXNoZXM7ICAgIC8vIG91ciB3aXNoZXMgKHNlbnQgYnkgdXMpCisgIHN0cnVjdCB0b19zdGF0ZV9zIHJlX3dpc2hlczsgICAgLy8gcmVtb3RlIHdpc2hlcyAocmVjZWl2ZWQgYnkgdXMpCisgIC8vIGN1cnJlbnRseSBlZmZlY3RpdmUvYWN0aXZlIHN0YXRlCisgIHN0cnVjdCB0b19zdGF0ZV9zIHN0YXRlOworICAvLyBkYXRhIHVzZWQgYnkgdGhlIGhhbmRsZXJzIC0gTk9UIFVTRUQgQlkgdGhpcyBwcm9ncmFtIQorICBtaXhlZCBkYXRhOworfTsKKy8qIGV4cGxhbmF0aW9uczoKKyAgIHRlbG9wdF9zLT5sb193aXNoZXMtPmxvY2Fsc2lkZTogdGhlIHN0YXRlIHdlIHdhbnQgdG8gYmUgaW4gIChXSUxML1dPTlQpCisgICB0ZWxvcHRfcy0+bG9fd2lzaGVzLT5yZW1vdGVzaWRlOiB0aGUgc3RhdGUgd2Ugd2FudCB0aGUgb3RoZXIgc2lkZSB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgaW4gIChETy9ET05UKQorICAgdGVsb3B0X3MtPnJlX3dpc2hlcy0+bG9jYWxzaWRlOiB0aGUgc3RhdGUgdGhlIG90aGVyIHNpZGUgd2FudHMgVVMgdG8gYmUgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERPL0RPTlQpCisgICB0ZWxvcHRfcy0+cmVfd2lzaGVzLT5yZW1vdGVzaWRlOiB0aGUgc3RhdGUgdGhlIG90aGVyIHNpZGUgd2FudHMgdG8gYmUgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXSUxML1dPTlQpCisgICB0ZWxvcHRfcy0+c3RhdGU6ICAgdGhlIGN1cnJlbnRseSBlZmZlY3RpdmUgc3RhdGUgb2YgdGhlIG9wdGlvbiBvbiB0aGUgdHdvCisgICAgICAgICAgICAgICAgICAgICAgc2lkZXMuCisgICAqLworCmRpZmYgLS1naXQgYS9zZWN1cmUvdGVsbmV0bmVnLmMgYi9zZWN1cmUvdGVsbmV0bmVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQxZTFhMAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS90ZWxuZXRuZWcuYwpAQCAtMCwwICsxLDg2MyBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHRlbG5ldG5lZy5jIC0tIFZlcndhbHR1bmcgdm9uIFRlbG5ldC1OZWdvdGlhdGlvbnMKKy8vCisvLyAkSWQkCisKKy8qIERhcyBPcmlnaW5hbCB3dXJkZSB2b24gTWFyY3VzQFRhcHAgenVyIFZlcmZ1ZWd1bmcgZ2VzdGVsbHQuICovCisvKiBBbmdlcGFzc3QgZnVlciBkaWUgTUctTXVkbGliIHZvbiBSaW5nb3JATUcgKi8KKy8qIFdlaXRnZWhlbmQgdWViZXJhcmJlaXRldCB2b24gWmVzc3RyYUBNRyAqLworCisjcHJhZ21hIHN0cmljdF90eXBlcyxzYXZlX3R5cGVzCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIG5vX3NoYWRvdworI3ByYWdtYSBwZWRhbnRpYworCitpbmhlcml0ICIvc2VjdXJlL3RlbG5ldG5lZy1zdHJ1Y3RzLmMiOworCisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgIi9zZWN1cmUvdGVsbmV0bmVnLmgiCisjdW5kZWYgTkVFRF9QUk9UT1RZUEVTCisKKy8vIHVudGVyc3R1ZXR6dGUgT3B0aW9uZW46CisvLyBURUxPUFRfRU9SLCBURUxPUFRfTkFXUywgVEVMT1BUX0xJTkVNT0RFLCBURUxPUFRfVFRZUEUKKworLy8jZGVmaW5lIF9fREVCVUdfXyAxCisKKyNpZmRlZiBfX0RFQlVHX18KKyNkZWZpbmUgREVCVUcoeCkgICAgICAgIGlmIChpbnRlcmFjdGl2ZSh0aGlzX29iamVjdCgpKSlcCisgICAgICAgICAgdGVsbF9vYmplY3QodGhpc19vYmplY3QoKSwiVE46ICIgKyB4ICsgIlxuIikKKyNkZWZpbmUgRFROKHgseSkgX2RlYnVnX3ByaW50KHgseSkKKyNlbHNlCisjIGRlZmluZSBERUJVRyh4KQorIyBkZWZpbmUgRFROKHgseSkKKyNlbmRpZgorCisKKworLy8gQXVzIG1pbmlfcHJvcHMuYzoKK3B1YmxpYyB2YXJhcmdzIG1peGVkIFF1ZXJ5KCBzdHJpbmcgc3RyLCBpbnQgdHlwZSApOworcHVibGljIHZhcmFyZ3MgbWl4ZWQgU2V0KCBzdHJpbmcgc3RyLCBtaXhlZCB2YWx1ZSwgaW50IHR5cGUgKTsKKworcHJpdmF0ZSBub3NhdmUgbWFwcGluZyBUTiA9IChbXSk7Citub3NhdmUgc3RyaW5nICpUZXJtaW5hbHM7CisKKy8vIFByb3RvdHlwZW4KK3ByaXZhdGUgdm9pZCBldmFsX25hd3MoaW50ICpvcHRhcmdzKTsKKworI2lmZGVmIF9fREVCVUdfXworLy8gR2lidHMgZWluaWdlIEtvbnN0YW50ZW4gbWl0IHN5bS4gTmFtZW4gYXVzLgorcHJpdmF0ZSBzdHJpbmcgZHRyYW5zbGF0ZShpbnQgaSkgeworICBzd2l0Y2goaSkgeworICAgIGNhc2UgSUFDOiByZXR1cm4gIklBQyI7CisgICAgY2FzZSBET05UOiByZXR1cm4gIkRPTlQiOworICAgIGNhc2UgRE86IHJldHVybiAiRE8iOworICAgIGNhc2UgV09OVDogcmV0dXJuICJXT05UIjsKKyAgICBjYXNlIFdJTEw6IHJldHVybiAiV0lMTCI7CisgICAgY2FzZSBTQjogcmV0dXJuICJTQiI7CisgICAgY2FzZSBTRTogcmV0dXJuICJTRSI7CisgICAgY2FzZSBFT1I6IHJldHVybiAiRU9SIjsKKyAgICBjYXNlIFRFTE9QVF9MSU5FTU9ERTogcmV0dXJuICJURUxPUFRfTElORU1PREUiOworICAgIGNhc2UgVEVMT1BUX1hESVNQTE9DOiByZXR1cm4gIlRFTE9QVF9YRElTUExPQyI7CisgICAgY2FzZSBURUxPUFRfRU5WSVJPTjogcmV0dXJuICJURUxPUFRfRU5WSVJPTiI7CisgICAgY2FzZSBURUxPUFRfTkVXRU5WOiByZXR1cm4gIlRFTE9QVF9ORVdFTlYiOworICAgIGNhc2UgVEVMT1BUX0VPUjogcmV0dXJuICJURUxPUFRfRU9SIjsKKyAgICBjYXNlIFRFTE9QVF9OQVdTOiByZXR1cm4gIlRFTE9QVF9OQVdTIjsKKyAgICBjYXNlIFRFTE9QVF9UU1BFRUQ6IHJldHVybiAiVEVMT1BUX1RTUEVFRCI7CisgICAgY2FzZSBURUxPUFRfVFRZUEU6IHJldHVybiAiVEVMT1BUX1RUWVBFIjsKKyAgICBjYXNlIFRFTE9QVF9FQ0hPOiByZXR1cm4gIlRFTE9QVF9FQ0hPIjsKKyAgICBjYXNlIFRFTE9QVF9TR0E6IHJldHVybiAiVEVMT1BUX1NHQSI7CisgICAgY2FzZSBURUxPUFRfTkFNUzogcmV0dXJuICJURUxPUFRfTkFNUyI7CisgICAgY2FzZSBURUxPUFRfU1RBVFVTOiByZXR1cm4gIlRFTE9QVF9TVEFUVVMiOworICAgIGNhc2UgVEVMT1BUX1RNOiByZXR1cm4gIlRFTE9QVF9UTSI7CisKKyAgICBjYXNlIFRFTE9QVF9NU0RQOiByZXR1cm4gIlRFTE9QVF9NU0RQIjsKKyAgICBjYXNlIFRFTE9QVF9DT01QUkVTUzI6IHJldHVybiAiVEVMT1BUX0NPTVBSRVNTMiI7CisgICAgY2FzZSBURUxPUFRfTVNQOiByZXR1cm4gIlRFTE9QVF9NU1AiOworICAgIGNhc2UgVEVMT1BUX01YUDogcmV0dXJuICJURUxPUFRfTVhQIjsKKyAgICBjYXNlIFRFTE9QVF9BVENQOiByZXR1cm4gIlRFTE9QVF9BVENQIjsKKyAgICBjYXNlIFRFTE9QVF9HTUNQOiByZXR1cm4gIlRFTE9QVF9HTUNQIjsKKyAgICBjYXNlIFRFTE9QVF9NU1NQOiByZXR1cm4gIlRFTE9QVF9NU1NQIjsKKyAgfQorICByZXR1cm4gdG9fc3RyaW5nKGkpOworfQorCisvLyBHaWJ0IDxhcnI+IGhhbGJ3ZWdzIGxlc2JhciBhbiB0aGlzX29iamVjdCgpIGF1cy4KK3ByaXZhdGUgdm9pZCBfZGVidWdfcHJpbnQoc3RyaW5nIHgsIGludCAqYXJyKSB7CisgIGlmIChhcnJbMV0gPT0gU0IgJiYgYXJyWzwxXSAhPSBTRSkKKyAgICBhcnIgKz0gKHtJQUMsIFNFfSk7CisgIGNsb3N1cmUgbWFwX2ludCA9IGZ1bmN0aW9uIHN0cmluZyAoaW50IGkpCisgICAgeyBpZiAoaSA+PSAzMiAmJiBpIDw9IDEyNikgcmV0dXJuIHNwcmludGYoIiVjIixpKTsKKyAgICAgIHJldHVybiAiWyIrdG9fc3RyaW5nKGkpKyJdIjsKKyAgICB9OworICBpZiAoc2l6ZW9mKGFycik8PTUpIHsKKyAgICBmb3JlYWNoKGludCBjIDogYXJyKQorICAgICAgeCArPSAiICIgKyBkdHJhbnNsYXRlKGMpOworICB9CisgIGVsc2UgeworICAgICAgeCArPSBkdHJhbnNsYXRlKGFyclswXSkgKyAiICIgKyBkdHJhbnNsYXRlKGFyclsxXSkgKyAiICIKKyAgICAgICAgICAgKyBkdHJhbnNsYXRlKGFyclsyXSkgKyAiICIKKyAgICAgICAgICAgKyBpbXBsb2RlKG1hcChhcnJbMy4uPDNdLCBtYXBfaW50KSwiICIpCisgICAgICAgICAgICsgIiAiICsgZHRyYW5zbGF0ZShhcnJbPDJdKSArICIgIiArIGR0cmFuc2xhdGUoYXJyWzwxXSk7CisgIH0KKyAgREVCVUcoeCk7Cit9CisjZW5kaWYKKworcHJvdGVjdGVkIHZhcmFyZ3MgaW50IHNlbmRfdGVsbmV0X25lZyhpbnQgKmFyciwgaW50IGJtX2ZsYWdzKQoreworICAgIGlmICggc2l6ZW9mKGFycikgPCAyICkKKyAgICAgICAgcmV0dXJuIGVmdW46OmJpbmFyeV9tZXNzYWdlKGFycixibV9mbGFncyk7CisKKyAgICBzdHJ1Y3QgdGVsb3B0X3Mgb3B0ID0gVE5bYXJyWzFdXTsKKworICAgIHN3aXRjaCAoYXJyWzBdKXsKKyAgICBjYXNlIERPOgorICAgIGNhc2UgRE9OVDoKKyAgICAgICAgKG9wdC0+bG9fd2lzaGVzKS0+cmVtb3Rlc2lkZSA9IGFyclswXTsKKyAgICAgICAgYXJyID0gKHtJQUN9KSArIGFycjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBXSUxMOgorICAgIGNhc2UgV09OVDoKKyAgICAgICAgKG9wdC0+bG9fd2lzaGVzKS0+bG9jYWxzaWRlID0gYXJyWzBdOworICAgICAgICBhcnIgPSAoe0lBQ30pICsgYXJyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNCOgorICAgICAgICAob3B0LT5sb193aXNoZXMpLT5zYmRhdGEgPSBhcnJbMC4uXTsKKyAgICAgICAgYXJyID0gKHtJQUN9KSArIGFyciArICh7SUFDLCBTRX0pOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgRFROKCJzZW5kX3RuOiAiLGFycik7CisgICAgcmV0dXJuIGVmdW46OmJpbmFyeV9tZXNzYWdlKGFyciwgYm1fZmxhZ3MpOworfQorCitwcm90ZWN0ZWQgdmFyYXJncyBpbnQgc2VuZF90ZWxuZXRfbmVnX3N0cihzdHJpbmcgc3RyLCBpbnQgYm1fZmxhZ3MpIHsKKyNpZmRlZiBfX0RFQlVHX18KKyAgICAvLyBEZWJ1Z2F1c2dhYmVuIHp1ciBaZWl0IG51ciBmdWVyIGFycmF5YmFzaWVydGUgVmFyaWFudGUKKyAgICByZXR1cm4gc2VuZF90ZWxuZXRfbmVnKHRvX2FycmF5KHN0ciksIGJtX2ZsYWdzKTsKKyNlbHNlCisgICAgaWYgKCBzaXplb2Yoc3RyKSA8IDIgKQorICAgICAgICByZXR1cm4gZWZ1bjo6YmluYXJ5X21lc3NhZ2Uoc3RyLCBibV9mbGFncyk7CisKKyAgICBzdHJ1Y3QgdGVsb3B0X3Mgb3B0ID0gVE5bc3RyWzFdXTsKKworICAgIHN3aXRjaCAoc3RyWzBdKSB7CisgICAgY2FzZSBETzoKKyAgICBjYXNlIERPTlQ6CisgICAgICAgIChvcHQtPmxvX3dpc2hlcyktPnJlbW90ZXNpZGUgPSBzdHJbMF07CisgICAgICAgIHN0cj1zcHJpbnRmKCIlYyVzIixJQUMsc3RyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBXSUxMOgorICAgIGNhc2UgV09OVDoKKyAgICAgICAgKG9wdC0+bG9fd2lzaGVzKS0+bG9jYWxzaWRlID0gc3RyWzBdOworICAgICAgICBzdHI9c3ByaW50ZigiJWMlcyIsSUFDLHN0cik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU0I6CisgICAgICAgIChvcHQtPmxvX3dpc2hlcyktPnNiZGF0YSA9IG1hcChleHBsb2RlKHN0clswLi5dLCIiKSwjJ3RvX2ludCk7CisgICAgICAgIHN0cj1zcHJpbnRmKCIlYyVzJWMlYyIsIElBQywgc3RyLCBJQUMsIFNFKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGVmdW46OmJpbmFyeV9tZXNzYWdlKHN0ciwgYm1fZmxhZ3MpOworI2VuZGlmIC8vIF9fREVCVUdfXworfQorCisvLyBTdGFydGV0IGVpbmUgVmVyaGFuZGx1bmcsIHVtIGRlbiBTdGF0dXMgZWluZXIgT3B0aW9uIHp1IGFlbmRlcm4uCisvLyBXZW5uIGJlcmVpdHMgZWluZSBWZXJoYW5kbHVuZyBsYWV1ZnQsIHdpcmQgbmljaHRzIGdlbWFjaHQgdW5kIC0xCisvLyB6dXJ1ZWNrZ2ViZW4uCisvLyBXZW5uIGRpZSBWZXJoYW5kbHVuZyBrZWluZSBBZW5kZXJ1bmcgdm9tIFN0YXR1cyBxdW8genVtIFppZWwgaGF0LCB3aXJkCisvLyBuaWNodHMgZ2VtYWNodCB1bmQgLTIgenVydWVja2dlZ2ViZW4uCisvLyBBbnNvbnN0ZW4gaXN0IGRpZSBSdWVja2dhYmUgZGllIEFuemFobCBkZXIgdWViZXJtaXR0ZWx0ZW4gWmVpY2hlbi4KKy8vIDxhY3Rpb24+OiBXSUxMOiBPcHRpb24gc29sbCBhdWYgZGllc2VyIFNlaXRlIGVpbmdlc2NoYWx0ZXQgd2VyZGVuLgorLy8gICAgICAgICAgIFdPTlQ6IE9wdGlvbiBzb2xsIGF1ZiBkaWVzZXIgU2VpdGUgYXVzZ2VzY2hhbHRldCB3ZXJkZW4uCisvLyAgICAgICAgICAgRE8gIDogT3B0aW9uIHNvbGwgYXVmIGRlciBhbmRlcmVuIFNlaXRlIGVpbmdlc2NoYWx0ZXQgd2VyZGVuLgorLy8gICAgICAgICAgIERPTlQ6IE9wdGlvbiBzb2xsIGF1ZiBkZXIgYW5kZXJlbiBTZWl0ZSBhdXNnZXNjaGFsdGV0IHdlcmRlbi4KK3Byb3RlY3RlZCBpbnQgZG9fdGVsbmV0X25lZyhpbnQgb3B0aW9uLCBpbnQgYWN0aW9uKSB7CisgIHN0cnVjdCB0ZWxvcHRfcyBvcHQgPSBUTltvcHRpb25dOworICBpZiAoIXN0cnVjdHAob3B0KSkKKyAgeworICAgIG9wdCA9ICg8dGVsb3B0X3M+IG9wdGlvbjogb3B0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIHJlX3dpc2hlczogKDx0b19zdGF0ZV9zPiksCisgICAgICAgICAgICAgICAgICAgICAgbG9fd2lzaGVzOiAoPHRvX3N0YXRlX3M+KSwKKyAgICAgICAgICAgICAgICAgICAgICBzdGF0ZTogKDx0b19zdGF0ZV9zPikKKyAgICAgICAgICApOworICAgIFROW29wdGlvbl0gPSBvcHQ7CisgIH0KKyAgLy8gZXMgd2lyZCBudXIgZ2VwcnVlZnQsIG9iIHdpciBiZXJlaXRzIGVpbmUgVmVyaGFuZGx1bmcgYmVnb25uZW4gaGFiZW4KKyAgLy8gKGxvX3dpc2hlcyksIHdlaWwgcmVpbmtvbW1lbmRlIHJlbW90ZSBXdWVuc2NoZSBsZXR6dGVuZGxpY2ggc29mb3J0IGR1cmNoCisgIC8vIHVuc2VyZSBBbnR3b3J0IGVybGVkaWd0IHNpbmQuCisgIHN3aXRjaChhY3Rpb24pCisgIHsKKyAgICBjYXNlIFdJTEw6CisgICAgICBpZiAob3B0LT5sb193aXNoZXMtPmxvY2Fsc2lkZSAhPSAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgICBpZiAob3B0LT5zdGF0ZS0+bG9jYWxzaWRlKQorICAgICAgICByZXR1cm4gLTI7CisgICAgICByZXR1cm4gc2VuZF90ZWxuZXRfbmVnKCAoeyBXSUxMLCBvcHRpb24gfSkgKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV09OVDoKKyAgICAgIGlmIChvcHQtPmxvX3dpc2hlcy0+bG9jYWxzaWRlICE9IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGlmICghb3B0LT5zdGF0ZS0+bG9jYWxzaWRlKQorICAgICAgICByZXR1cm4gLTI7CisgICAgICByZXR1cm4gc2VuZF90ZWxuZXRfbmVnKCAoeyBXT05ULCBvcHRpb24gfSkgKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRE86CisgICAgICBpZiAob3B0LT5sb193aXNoZXMtPnJlbW90ZXNpZGUgIT0gMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgaWYgKG9wdC0+c3RhdGUtPnJlbW90ZXNpZGUpCisgICAgICAgIHJldHVybiAtMjsKKyAgICAgIHJldHVybiBzZW5kX3RlbG5ldF9uZWcoICh7IERPLCBvcHRpb24gfSkgKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRE9OVDoKKyAgICAgIGlmIChvcHQtPmxvX3dpc2hlcy0+cmVtb3Rlc2lkZSAhPSAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgICBpZiAoIW9wdC0+c3RhdGUtPnJlbW90ZXNpZGUpCisgICAgICAgIHJldHVybiAtMjsKKyAgICAgIHJldHVybiBzZW5kX3RlbG5ldF9uZWcoICh7IERPTlQsIG9wdGlvbiB9KSApOworICAgICAgYnJlYWs7CisgIH0KKyAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiVW5zdXBwb3J0ZWQgdGVsbmV0IG5lZ290YXRpb24gYWN0aW9uIGluICIKKyAgICAgICJkb190ZWxuZXRfbmVnKCk6ICVkXG4iLGFjdGlvbikpOworfQorCisvLyBMT0NBTCBTdGFuZGFyZCBIYW5kbGVycyAvLworcHJpdmF0ZSB2b2lkIF9zdGRfbG9faGFuZGxlcl9lb3Ioc3RydWN0IHRlbG9wdF9zIG9wdCwgaW50IGFjdGlvbikgeworICAvLyB0YXRzYWVjaGxpY2ggbml4IHp1IHR1bi4gSGFuZGxlciBpc3QgbnVyIGRhLCBkYW1pdCBkaWUgT3B0aW9uIGF1ZiBkaWVzZXIKKyAgLy8gU2VpdGUgYWt0aXZpZXJ0IHdpcmQuIERpZSBBcmJlaXQgZXJsZWRpZ3QgcHJpbnRfcHJvbXB0LgorICByZXR1cm47Cit9CisKK3ByaXZhdGUgdm9pZCBfc3RkX2xvX2hhbmRsZXJfbXNzcChzdHJ1Y3QgdGVsb3B0X3Mgb3B0LCBpbnQgYWN0aW9uKSB7CisgIC8vIG51ciBlaW5zY2hhbHRlbiBpc3QgaW50ZXJlc3NhbnQuCisgIGlmIChhY3Rpb24gIT0gTE9DQUxPTikKKyAgICByZXR1cm47CisgIC8vIEtyYW1zIHNlbmRlbiwgd2VubiBPYmpla3QgZ2VsYWRlbi4gU29uc3Qgd2llZGVyIGFic2NoYWx0ZW4gKGtvbW10CisgIC8vIGhvZmZlbnRsaWNoIG5pY2h0IHZvcikuLi4KKyAgb2JqZWN0IG1zc3AgPSBmaW5kX29iamVjdCgiL3NlY3VyZS9taXNjL21zc3AiKTsKKyAgaWYgKCFtc3NwKQorICAgIHNlbmRfdGVsbmV0X25lZyggKHtXT05ULCBURUxPUFRfTVNTUCB9KSApOworICBlbHNlCisgIHsKKyAgICBzZW5kX3RlbG5ldF9uZWdfc3RyKHNwcmludGYoIiVjJWMlcyIsCisgICAgICAgICAgU0IsIFRFTE9QVF9NU1NQLCBtc3NwLT5nZXRfdGVsbmVnc19zdHIoKSkpOworICAgIC8vIGRpZSBEYXRlbiBicmF1Y2hlbiB3aXIgbmljaHQgbWVocgorICAgIG9wdC0+bG9fd2lzaGVzLT5zYmRhdGEgPSAwOworICB9Cit9CisKKworLy8gUkVNT1RFIFN0YW5kYXJkIEhhbmRsZXJzIC8vCitwcml2YXRlIHZvaWQgX3N0ZF9yZV9oYW5kbGVyX3RtKHN0cnVjdCB0ZWxvcHRfcyBvcHQsIGludCBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZGF0YSkKK3sKKyAgLy8gZWdhbCwgd2FzIGdlYW50d29ydGV0IHd1cmRlLCBlcyBnaWJ0IG5lbiBIaW53ZWlzIGF1ZiBkaWUgcm91bmQtdHJpcC10aW1lLgorICAvLyBXZW5uIGVpbiBBcnJheSBpbiBvcHQtPmRhdGFbMV0gc3RlaHQsIHJlY2huZW4gd2lyIGRhcyBhdXMgdW5kIHNjaHJlaWJlbiBlcworICAvLyBpbiBvcHQtPmRhdGFbMF0gYWxzIEVyZ2VibmlzIHJlaW4uCisgIGlmIChwb2ludGVycChvcHQtPmRhdGEpICYmIHBvaW50ZXJwKG9wdC0+ZGF0YVsxXSkpCisgIHsKKyAgICBpbnQgKnV0ID0gdXRpbWUoKTsKKyAgICBpbnQgKnN0YXJ0ID0gb3B0LT5kYXRhWzFdOworICAgIGludCByZXMgPSAodXRbMF0gLSBzdGFydFswXSkgKiAxMDAwMDAwOworICAgIHJlcyArPSB1dFsxXSAtIHN0YXJ0WzFdOworICAgIG9wdC0+ZGF0YVswXSA9IHJlczsKKyAgICBvcHQtPmRhdGFbMV0gPSAwOworICAgIERFQlVHKCJSVFQ6ICIrcmVzKTsKKyAgfQorICByZXR1cm47Cit9CisKK3ByaXZhdGUgdm9pZCBfc3RkX3JlX2hhbmRsZXJfbmF3cyhzdHJ1Y3QgdGVsb3B0X3Mgb3B0LCBpbnQgYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZGF0YSkKK3sKKyAgaWYgKGFjdGlvbiA9PSBTQikKKyAgeworICAgIGV2YWxfbmF3cyhkYXRhKTsKKyAgfQorfQorCitwcml2YXRlIHZvaWQgX3N0ZF9yZV9oYW5kbGVyX2xpbmVtb2RlKHN0cnVjdCB0ZWxvcHRfcyBvcHQsIGludCBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZGF0YSkKK3sKKyAgaWYgKGFjdGlvbiA9PSBSRU1PVEVPTikKKyAgeworICAgIC8vIHNlZSAvZG9jL2NvbmNlcHRzL25lZ290aWF0aW9ucy4gV2UgdXNlIG9ubHkgdGhlIG1pbmltdW0KKyAgICAvLyBuZWVkZWQgZm9yIGxpbmVtb2RlOiBzd2l0Y2hpbmcgb24gbG9jYWwgY29tbWFuZGxpbmUtZWRpdGluZworICAgIC8vIGZvciB0aGUgY2xpZW50LgorICAgIHNlbmRfdGVsbmV0X25lZygoeyBTQiwgVEVMT1BUX0xJTkVNT0RFLCBMTV9NT0RFLCBNT0RFX0VESVQgfSkpOworICAgIC8vIGZsdXNoIG9uIDBkIGFuZCAwYS4uLgorICAgIC8vIFRPRE86IHdoYXQgZG9lcyB0aGlzIGV4YWN0bHkgZG8/CisgICAgc2VuZF90ZWxuZXRfbmVnKCh7IFNCLCBURUxPUFRfTElORU1PREUsIERPLCBMTV9GT1JXQVJETUFTSywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MHwweDA4IH0pKTsKKyAgICAvL0duYS4uLgorICAgIG9wdC0+bG9fd2lzaGVzLT5zYmRhdGEgPSAoe01PREVfRURJVH0pOworICB9Cit9CisKK3ByaXZhdGUgdm9pZCBfc3RkX3JlX2hhbmRsZXJfdHR5cGUoc3RydWN0IHRlbG9wdF9zIG9wdCwgaW50IGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpkYXRhKQoreworICBpZiAoYWN0aW9uID09IFNCKQorICB7CisgICAgLy9UT0RPOiBnZXQgcmlkIG9mIHRoaXMgaHlzdGVyaWNhbCBzdHVmZi4uLgorICAgIC8vTk9URTogV2UgZG8gbm90IGRvIG11bHRpcGxlIFNCIFNFTkRzIGR1ZSB0byBzb21lIHdlaXJkCisgICAgLy9idWdzIGluIElCTTMyNzAgZW11bGF0aW5nIHRlbG5ldHMgd2hpY2ggY3Jhc2ggaWYgd2UKKyAgICAvL2RvIHRoYXQuCisgICAgaWYgKCBzaXplb2YoZGF0YSkgPCAxICkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCBkYXRhWzBdICE9IFRFTFFVQUxfSVMgKQorICAgICAgICByZXR1cm47CisKKyAgICBzdHJpbmcgdG1wdGVybWluYWwgPSBsb3dlcl9jYXNlKCB0b19zdHJpbmcoZGF0YVsxLi5dKSApOworICAgIGlmICggIVRlcm1pbmFscyApCisgICAgICAgIFRlcm1pbmFscyA9ICh7IHRtcHRlcm1pbmFsIH0pOworICAgIGVsc2UKKyAgICAgICAgVGVybWluYWxzICs9ICh7IHRtcHRlcm1pbmFsIH0pOworCisgICAgaWYgKCBRdWVyeShQX1RUWV9UWVBFKSApCisgICAgICAgICAgU2V0KCBQX1RUWV9UWVBFLCBUZXJtaW5hbHNbMF0gKTsKKyAgfQorICBlbHNlIGlmIChhY3Rpb24gPT0gUkVNT1RFT04pCisgIHsKKyAgICBzZW5kX3RlbG5ldF9uZWcoKHsgU0IsIFRFTE9QVF9UVFlQRSwgVEVMUVVBTF9TRU5EIH0pKTsKKyAgfQorfQorCisvLyBCaW5kZXQvcmVnaXN0cmllcnQgSGFuZGxlciBmdWVyIGRpZSBqZXcuIFRlbG5ldCBPcHRpb24uIChPZGVyIGxvZXNjaHQgc2llCisvLyBhdWNoIHdpZWRlci4pIEplIG5hY2ggPGluaXRuZWc+IHdpcmQgdmVyc3VjaHQsIGRpZSBPcHRpb24gbmV1IHp1CisvLyB2ZXJoYW5kZWxuLgorcHJvdGVjdGVkIGludCBiaW5kX3RlbG5lZ19oYW5kbGVyKGludCBvcHRpb24sIGNsb3N1cmUgcmUsIGNsb3N1cmUgbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluaXRuZWcpCit7CisgIHN0cnVjdCB0ZWxvcHRfcyBvcHQgPSBUTltvcHRpb25dOworICBpZiAoIXN0cnVjdHAob3B0KSkKKyAgeworICAgIG9wdCA9ICg8dGVsb3B0X3M+IG9wdGlvbjogb3B0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIHJlX3dpc2hlczogKDx0b19zdGF0ZV9zPiksCisgICAgICAgICAgICAgICAgICAgICAgbG9fd2lzaGVzOiAoPHRvX3N0YXRlX3M+KSwKKyAgICAgICAgICAgICAgICAgICAgICBzdGF0ZTogKDx0b19zdGF0ZV9zPikKKyAgICAgICAgICApOworICAgIFROW29wdGlvbl0gPSBvcHQ7CisgIH0KKworICBvcHQtPnJlbW90ZWhhbmRsZXIgPSByZTsKKyAgaWYgKGluaXRuZWcpCisgIHsKKyAgICBpZiAocmUpCisgICAgICBkb190ZWxuZXRfbmVnKG9wdGlvbiwgRE8pOworICAgIGVsc2UKKyAgICAgIGRvX3RlbG5ldF9uZWcob3B0aW9uLCBET05UICk7CisgIH0KKworICBvcHQtPmxvY2FsaGFuZGxlciA9IGxvOworICBpZiAoaW5pdG5lZykKKyAgeworICAgIGlmIChsbykKKyAgICAgIGRvX3RlbG5ldF9uZWcob3B0aW9uLCBXSUxMKTsKKyAgICBlbHNlCisgICAgICBkb190ZWxuZXRfbmVnKG9wdGlvbiwgV09OVCk7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKworLy8gTWFsIHVuc2VyZSBXdWVuc2NoZSBhbiBkZW4gQ2xpZW50IHNjaGlja2VuIHVuZCBkaWUgU3RhbmRhcmRoYW5kbGVyCisvLyByZWdpc3RyaWVyZW4uIEhpZXJiZWkgYmVpIEJlZGFyZiBuZXVlIFZlcmhhbmRsdW5nZW4gc3RhcnRlbi4KKy8vIEdlcnVmZW4gYXVzIGxvZ2luLmMgbmFjaCBWZXJiaW5kdW5nc2F1ZmJhdS4KKy8vIEJlbWVya3VuZzogZGFzIFNwaWVsZXJvYmpla3QgYmlldGV0IGV2dC4gbm9jaCB6dXNhZXR6bGljaGUgVGVsbmV0b3B0aW9uZW4KKy8vICAgICAgICAgICAgYW4sIGRpZSBkYW5uIHVlYmVyIHN0YXJ0dXBfdGVsbmV0X25lZ3MoKSAoaW0gU3BpZWxlcm9iamVrdCkKKy8vICAgICAgICAgICAgbGF1ZmVuLgorcHJvdGVjdGVkIHZvaWQgU2VuZFRlbG9wdHMoKQoreworICBiaW5kX3RlbG5lZ19oYW5kbGVyKFRFTE9QVF9FT1IsIDAsICMnX3N0ZF9sb19oYW5kbGVyX2VvciwgMSk7CisgIGlmIChmaW5kX29iamVjdCgiL3NlY3VyZS9taXNjL21zc3AiKSkKKyAgICBiaW5kX3RlbG5lZ19oYW5kbGVyKFRFTE9QVF9NU1NQLCAwLCAjJ19zdGRfbG9faGFuZGxlcl9tc3NwLCAxKTsKKworICBiaW5kX3RlbG5lZ19oYW5kbGVyKFRFTE9QVF9OQVdTLCAjJ19zdGRfcmVfaGFuZGxlcl9uYXdzLCAwLCAxKTsKKyAgYmluZF90ZWxuZWdfaGFuZGxlcihURUxPUFRfTElORU1PREUsICMnX3N0ZF9yZV9oYW5kbGVyX2xpbmVtb2RlLCAwLCAxKTsKKyAgYmluZF90ZWxuZWdfaGFuZGxlcihURUxPUFRfVFRZUEUsICMnX3N0ZF9yZV9oYW5kbGVyX3R0eXBlLCAwLCAxKTsKKyAgLy8gZnVlciBURUxPUFRfVE0gamV0enQga2VpbmUgVmVyaGFuZGx1bmcgYW5zdG9zc2VuLgorICBiaW5kX3RlbG5lZ19oYW5kbGVyKFRFTE9QVF9UTSwgIydfc3RkX3JlX2hhbmRsZXJfdG0sIDAsIDApOworfQorCisKKy8vIEJpbmRldCBkaWUgU3RhbmRhcmRoYW5kbGVyIF9hdXMgZGllc2VtXyBQcm9ncmFtbSAodW5kIHVlYmVyc2NocmVpYnQgZGFiZWkKKy8vIGdnZi4gYW5kZXJlKS4gSGllcmJlaSB3ZXJkZW4gbnVyIGRpZSBIYW5kbGVyIG5ldSBnZWJ1bmRlbiwga2VpbmUgbmV1ZW4KKy8vIFZlcmhhbmRsdW5nZW4gaW5pdGlpZXJ0LgorLy8gZ2VydWZlbiBhdXMgYmFzZS5jIGluZGlyZWt0IHZpYSBzdGFydHVwX3RlbG5ldF9uZWdzKCkuCitwcm90ZWN0ZWQgdm9pZCBfYmluZF90ZWxuZWdfc3RkX2hhbmRsZXJzKCkgeworICBiaW5kX3RlbG5lZ19oYW5kbGVyKFRFTE9QVF9FT1IsIDAsICMnX3N0ZF9sb19oYW5kbGVyX2VvciwgMCk7CisgIC8vIEJlc29uZGVyZSBTaXR1YXRpb246IE1TU1AgaXN0IG5hY2ggU3BpZWxlcmxvZ2luIGVpZ2VudGxpY2ggdW5pbnRlcmVzc2FudC4KKyAgLy8gRGFoZXIgc3BhcmVuIHdpciB1bnMgZGFzIGltIEtvbnRleHQgZGVzIFNwaWVsZXJvYmpla3RzIHVuZCBzY2hhbHRlbiBlcworICAvLyBlaW5mYWNoIHdpZWRlciBhdXMuCisgIGJpbmRfdGVsbmVnX2hhbmRsZXIoVEVMT1BUX01TU1AsIDAsIDAsIDApOworCisgIGJpbmRfdGVsbmVnX2hhbmRsZXIoVEVMT1BUX05BV1MsICMnX3N0ZF9yZV9oYW5kbGVyX25hd3MsIDAsIDApOworICBiaW5kX3RlbG5lZ19oYW5kbGVyKFRFTE9QVF9MSU5FTU9ERSwgIydfc3RkX3JlX2hhbmRsZXJfbGluZW1vZGUsIDAsIDApOworICBiaW5kX3RlbG5lZ19oYW5kbGVyKFRFTE9QVF9UVFlQRSwgIydfc3RkX3JlX2hhbmRsZXJfdHR5cGUsIDAsIDApOworICBiaW5kX3RlbG5lZ19oYW5kbGVyKFRFTE9QVF9UTSwgIydfc3RkX3JlX2hhbmRsZXJfdG0sIDAsIDApOworfQorCisKKy8vIFJ1ZnQgZGllIGVudHNwcmVjaGVuZGVuIGhhbmRsZXIgdm9uIGRlciBUZWxuZXQgT3B0aW9uLgorLy8gV2VubiBlcyBrZWluZW4gaGFuZGxlciAobWVocikgZ2lidCwgd2lyZCBkaWUgT3B0aW9uIGF1Y2ggYXVmIGRlciBqZXdlaWxpZ2VuCisvLyBTZWl0ZSBhdXNnZXNjaGFsdGV0LiBEZXNoYWxiIE1VU1MgbG9fd2lzaGVzIHVuZCByZV93aXNoZXMgdm9tIEF1ZnJ1ZmVyIFZPUgorLy8gREVNIEFVRlJVRiB6dXJ1ZWNrZ2VzZXR6dCB3b3JkZW4gc2VpbiEKKy8vIDxhY3Rpb24+OiAnTE9DQUxPTic6ICAgT3B0aW9uIHd1cmRlIGF1ZiB1bnNlcmVyIFNlaXRlIGVpbmdlc2NoYWx0ZXQKKy8vICAgICAgICAgICAnTE9DQUxPRkYnOiAgT3B0aW9uIHd1cmRlIGF1ZiB1bnNlcmVyIFNlaXRlIGF1c2dlc2NoYWx0ZXQKKy8vICAgICAgICAgICAnUkVNT1RFT04nOiAgT3B0aW9uIHd1cmRlIGF1ZiBDbGllbnRzZWl0ZSBlaW5nZXNjaGFsdGV0CisvLyAgICAgICAgICAgJ1JFTU9URU9GRic6IE9wdGlvbiB3dXJkZSBhdWYgQ2xpZW50c2VpdGUgYXVzZ2VzY2hhbHRldAorLy8gICAgICAgICAgICdTQic6ICAgICAgICBTdWJvcHRpb24gbmVnb3RpYXRpb24gRGF0ZW4gd3VyZGVuIGVtcGZhbmdlbgorLy8gPGRhdGE+OiBkaWUgcGVyIFNCIGVtcGZhbmdlbmVuIERhdGVuICh1bnZlcmFyYmVpdGV0KQorcHJpdmF0ZSB2b2lkIF9jYWxsX2hhbmRsZXIoc3RydWN0IHRlbG9wdF9zIG9wdCwgaW50IGFjdGlvbiwgaW50ICpkYXRhKSB7CisgIHN3aXRjaChhY3Rpb24pCisgIHsKKyAgICBjYXNlIFJFTU9URU9OOgorICAgIGNhc2UgUkVNT1RFT0ZGOgorICAgIGNhc2UgU0I6CisgICAgICBpZiAob3B0LT5yZW1vdGVoYW5kbGVyKQorICAgICAgeworICAgICAgICBmdW5jYWxsKG9wdC0+cmVtb3RlaGFuZGxlciwgb3B0LCBhY3Rpb24sIGRhdGEpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvLyBvaywgZ2VodCBuaWNodC4gR2dmLiBBYnNjaGFsdGVuIChkb190ZWxuZXRfbmVnIHBhc3N0IGF1ZiwKKyAgICAgICAgLy8gZGFzcyBudXIgdmVyaGFuZGVsdCB3aXJkLCB3ZW5uIGRpZSBPcHRpb24gYW4gaXN0LikKKyAgICAgICAgZG9fdGVsbmV0X25lZyggb3B0LT5vcHRpb24sIERPTlQgKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgTE9DQUxPTjoKKyAgICBjYXNlIExPQ0FMT0ZGOgorICAgICAgaWYgKG9wdC0+bG9jYWxoYW5kbGVyKQorICAgICAgeworICAgICAgICBmdW5jYWxsKG9wdC0+bG9jYWxoYW5kbGVyLCBvcHQsIGFjdGlvbik7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAvLyBvaywgZ2VodCBuaWNodC4gR2dmLiBBYnNjaGFsdGVuIChkb190ZWxuZXRfbmVnIHBhc3N0IGF1ZiwKKyAgICAgIC8vIGRhc3MgbnVyIHZlcmhhbmRlbHQgd2lyZCwgd2VubiBkaWUgT3B0aW9uIGFuIGlzdC4pCisgICAgICAgIGRvX3RlbG5ldF9uZWcoIG9wdC0+b3B0aW9uLCBXT05UICk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgfQorfQorCisvLyBHZXJ1ZmVuIHZvbSBEcml2ZXIsIHdlbm4gbmV1ZSB0ZWxuZXQgb3B0aW9ucyByZWlua29tbWVuLgordm9pZAordGVsbmV0X25lZyhpbnQgY29tbWFuZCwgaW50IG9wdGlvbiwgaW50ICpvcHRhcmdzKQoreworICAgIERUTigicmVjdl90bjogIiwgKHtJQUMsIGNvbW1hbmQsIG9wdGlvbn0pICsgKG9wdGFyZ3N8fCh7fSkpKTsKKworICAgIHN0cnVjdCB0ZWxvcHRfcyBvcHQgPSBUTltvcHRpb25dOworICAgIGlmICghc3RydWN0cChvcHQpKQorICAgIHsKKyAgICAgIG9wdCA9ICg8dGVsb3B0X3M+IG9wdGlvbjogb3B0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVfd2lzaGVzOiAoPHRvX3N0YXRlX3M+KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvX3dpc2hlczogKDx0b19zdGF0ZV9zPiksCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZTogKDx0b19zdGF0ZV9zPikKKyAgICAgICAgICAgICk7CisgICAgICBUTltvcHRpb25dID0gb3B0OworICAgIH0KKworICAgIC8vIFdhcyB3aWxsIGRlciBDbGllbnQgdHVuPworICAgIGlmIChjb21tYW5kID09IFdPTlQpCisgICAgeworICAgICAgICAvLyBDbGllbnQgd2lsbCBkaWUgT3B0aW9uIGF1ZiBzZWluZXIgU2VpdGUgYWJzY2hhbHRlbi4gV2lyIE1VRVNTRU4gZGFzCisgICAgICAgIC8vIGFremVwdGllcmVuLgorICAgICAgICAvLyBXaXIgbXVlc3NlbiBkYXMgYWxsZXJkaW5ncyBpZ25vcmllcmVuLCB3ZW5uIGRpZSBPcHRpb24gYmVyZWl0cyBhdXMKKyAgICAgICAgLy8gaXN0LgorICAgICAgICBpZiAob3B0LT5zdGF0ZS0+cmVtb3Rlc2lkZT09MCkKKyAgICAgICAgeworICAgICAgICAgIC8vIEF1c25haG1lIGZ1ZXIgVEVMT1BUX1RNLCBkYSBkYXMga2F1bSBlaW4gQ2xpZW50IGthbm4gdW5kIGZ1ZXIgUlRUCisgICAgICAgICAgLy8gZXMgZWlnZW50bGljaCBhdWNoIGVnYWwgaXN0LCB3YXMgenVydWVjayBrb21tdDogZGVyIGhhbmRsZXIgd2lyZAorICAgICAgICAgIC8vIHp1bWluZGVzdCBkb2NoIGdlcnVmZW4genVtIEF1c3JlY2huZW4gZGVyIFJUVAorICAgICAgICAgIGlmIChvcHRpb24gPT0gVEVMT1BUX1RNKQorICAgICAgICAgICAgX2NhbGxfaGFuZGxlcihvcHQsIFJFTU9URU9GRiwgMCk7CisgICAgICAgICAgLy8gYW5zb25zdGVuIGFiZXIgd2lya2xpY2ggaWdub3JpZXJlbi4gOykKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgb3B0LT5yZV93aXNoZXMtPnJlbW90ZXNpZGUgPSBjb21tYW5kOworICAgICAgICAvLyBCZXN0YWV0aWd1bmcgYXVmIGVpbiBXT05UIHNlbmRlbiwgd2VubiB3aXIgbmljaHQgc2VsYmVyIHNjaG9uIGVpbgorICAgICAgICAvLyBET05UIGdlc2NoaWNrdCBoYXR0ZW4uCisgICAgICAgIGlmIChvcHQtPmxvX3dpc2hlcy0+cmVtb3Rlc2lkZSAhPSBET05UKSB7CisgICAgICAgICAgc2VuZF90ZWxuZXRfbmVnKCAoe0RPTlQsIG9wdGlvbn0pICk7CisgICAgICAgIH0KKyAgICAgICAgLy8gV2lyIGhhYmVuIGpldHp0IGF1ZiBqZWRlbiBGYWxsIGVpbiBET05UIGdlc2VuZGV0IHVuZCBlaW4gV09OVAorICAgICAgICAvLyBlcmhhbHRlbi4gRGFtaXQgaXN0IGRpZSBPcHRpb24gamV0enQgYXVmIGRlciBjbGllbnRzZWl0ZSBhdXMuCisgICAgICAgIC8vIEF1c3NlcmRlbSBzZXR6ZW4gd2lyIGRpZSBXaXNoZXMgenVydWVjay4KKyAgICAgICAgb3B0LT5yZV93aXNoZXMtPnJlbW90ZXNpZGUgPSAwOworICAgICAgICBvcHQtPmxvX3dpc2hlcy0+cmVtb3Rlc2lkZSA9IDA7CisgICAgICAgIGlmIChvcHQtPnN0YXRlLT5yZW1vdGVzaWRlICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG9wdC0+c3RhdGUtPnJlbW90ZXNpZGUgPSAwOworICAgICAgICAgICAgX2NhbGxfaGFuZGxlcihvcHQsIFJFTU9URU9GRiwgMCk7CisgICAgICAgIH0KKyAgICB9IC8vIFdPTlQgdm9tIENsaWVudCB2ZXJhcmJlaXRldAorICAgIGVsc2UgaWYgKCBjb21tYW5kID09IFdJTEwpCisgICAgeworICAgICAgICAvLyBXZW5uIGRpZSBPcHRpb24gYmVyZWl0cyBhbiBpc3QsIG11ZXNzZW4gd2lyIGRpZXMgaWdub3JpZXJlbi4KKyAgICAgICAgaWYgKG9wdC0+c3RhdGUtPnJlbW90ZXNpZGUgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgIC8vIEF1c25haG1lIGZ1ZXIgVEVMT1BUX1RNLCBkZXIgaGFuZGxlciB3aXJkIHp1bWluZGVzdCBkb2NoIGdlcnVmZW4KKyAgICAgICAgICAvLyB6dW0gQXVzcmVjaG5lbiBkZXIgUlRULiBEaWVzZSBPcHRpb24gbGFlc3N0IHNpY2ggb2huZWhpbgorICAgICAgICAgIC8vIGFrdGl2aWVyZW4sIGF1Y2ggd2VubiBzaWUgc2Nob24gYW4gaXN0LgorICAgICAgICAgIGlmIChvcHRpb24gPT0gVEVMT1BUX1RNKQorICAgICAgICAgICAgX2NhbGxfaGFuZGxlcihvcHQsIFJFTU9URU9OLCAwKTsKKyAgICAgICAgICAvLyBzb25zdCBhYmVyIHdpcmtsaWNoIGlnbm9yaWVyZW4uIDstKQorICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBvcHQtPnJlX3dpc2hlcy0+cmVtb3Rlc2lkZSA9IGNvbW1hbmQ7CisgICAgICAgIGlmICggb3B0LT5sb193aXNoZXMtPnJlbW90ZXNpZGUgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIERlciBDbGllbnQgd2lsbCwgd2lyIGhhYmVuIG5vY2ggbml4IGRhenUgZ2VzYWd0LiAoTWl0IHVuc2VyZXIKKyAgICAgICAgICAgIC8vIEFudHdvcnQgaXN0IGRpZSBWZXJoYW5kbHVuZyB1ZWJyaWdlbnMgYmVlbmRldC4pCisgICAgICAgICAgICAvLyBXZW5uIGVzIGVpbmVuIHJlbW90ZWhhbmRsZXIgZnVlciBkaWUgT3B0aW9uIGdpYnQsIHNjaGFsdGVuIHdpcgorICAgICAgICAgICAgLy8gc2llIGVpbi4uLgorICAgICAgICAgICAgaWYgKG9wdC0+cmVtb3RlaGFuZGxlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZW5kX3RlbG5ldF9uZWcoKHtETywgb3B0aW9ufSkpOworICAgICAgICAgICAgICAgIC8vIE9wdGlvbiBqZXR6dCBhbiBkZXIgQ2xpZW50c2VpdGUgYW4uCisgICAgICAgICAgICAgICAgb3B0LT5yZV93aXNoZXMtPnJlbW90ZXNpZGUgPSAwOworICAgICAgICAgICAgICAgIG9wdC0+bG9fd2lzaGVzLT5yZW1vdGVzaWRlID0gMDsKKyAgICAgICAgICAgICAgICBpZiAob3B0LT5zdGF0ZS0+cmVtb3Rlc2lkZSAhPSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3B0LT5zdGF0ZS0+cmVtb3Rlc2lkZSA9IDE7CisgICAgICAgICAgICAgICAgICAgIF9jYWxsX2hhbmRsZXIob3B0LCBSRU1PVEVPTiwgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvLyBzb25zdCB2ZXJ3ZWlnZXJuIHdpciBkYXMgZWluc2NoYWx0ZW4gKGRpZSBtZWlzdGVuIE9wdGlvbmVuCisgICAgICAgICAgICAgIC8vIGF1ZiBDbGllbnRzZWl0ZSBzaW5kIGZ1ZXIgdW5zIGVoIGVnYWwpLgorICAgICAgICAgICAgICBzZW5kX3RlbG5ldF9uZWcoKHtET05ULCBvcHRpb259KSk7CisgICAgICAgICAgICAgIC8vIE9wdGlvbiBqZXR6dCBhbiBkZXIgQ2xpZW50c2VpdGUgYXVzLgorICAgICAgICAgICAgICBvcHQtPnJlX3dpc2hlcy0+cmVtb3Rlc2lkZSA9IDA7CisgICAgICAgICAgICAgIG9wdC0+bG9fd2lzaGVzLT5yZW1vdGVzaWRlID0gMDsKKyAgICAgICAgICAgICAgaWYgKG9wdC0+c3RhdGUtPnJlbW90ZXNpZGUgIT0gMCkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgb3B0LT5zdGF0ZS0+cmVtb3Rlc2lkZSA9IDA7CisgICAgICAgICAgICAgICAgICBfY2FsbF9oYW5kbGVyKG9wdCwgUkVNT1RFT0ZGLCAwKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBvcHQtPmxvX3dpc2hlcy0+cmVtb3Rlc2lkZSA9PSBETykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gV2lyIGhhYmVuIGhhYmVuIGJlcmVpdHMgcGVyIERPIGFuZ2Vmb3JkZXJ0LCBkLmguIGRhcyBpc3QgZGllCisgICAgICAgICAgICAvLyBDbGllbnRiZXN0YWV0aWd1bmcgLSB3aXIgZHVlcmZlbiBuaWNodCBiZXN0YWV0aWdlbiB1bmQgZGllCisgICAgICAgICAgICAvLyBPcHRpb24gaXN0IGpldHp0IGNsaWVudHNlaXRpZyBha3Rpdi4gVmVyaGFuZGx1bmcgYmVlbmRldC4KKyAgICAgICAgICAgIG9wdC0+cmVfd2lzaGVzLT5yZW1vdGVzaWRlID0gMDsKKyAgICAgICAgICAgIG9wdC0+bG9fd2lzaGVzLT5yZW1vdGVzaWRlID0gMDsKKyAgICAgICAgICAgIGlmIChvcHQtPnN0YXRlLT5yZW1vdGVzaWRlICE9IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3B0LT5zdGF0ZS0+cmVtb3Rlc2lkZSA9IDE7CisgICAgICAgICAgICAgICAgX2NhbGxfaGFuZGxlcihvcHQsIFJFTU9URU9OLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAvLyBpZiAoRE8pCisgICAgICAgIGVsc2UgeworICAgICAgICAgIC8vIE1obW0uIFdpciBoYXR0ZW4gZWluIERPTlQgZ2VzZW5kZXQsIGFiZXIgZGVyIENsaWVudCBoYXQgbWl0IFdJTEwKKyAgICAgICAgICAvLyBnZWFudHdvcnRldC4gRGFzIGRhcmYgZXIgZWlnZW50bGljaCBnYXIgbmljaHQuCisgICAgICAgICAgLy9UT0RPOiB3YXMgc29sbHRlIG1hbiBqZXR6dCBlaWdlbnRsaWNoIHR1bj8gRXJzdG1hbCB3aWVkZXJob2xlbiB3aXIKKyAgICAgICAgICAvL2RhcyBET05ULi4uCisgICAgICAgICAgc2VuZF90ZWxuZXRfbmVnKCAoe0RPTlQsIG9wdGlvbn0pICk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm47CisgICAgfSAvLyBXSUxMIHZvbSBDbGllbnQgdmVyYXJiZWl0ZXQKKyAgICAvLyBXYXMgc29sbGVuIHdpciAobmljaHQpIGZ1ZXIgZGVuIENsaWVudCB0dW4/CisgICAgZWxzZSBpZiAoIGNvbW1hbmQgPT0gRE9OVCkKKyAgICB7CisgICAgICAgIC8vIENsaWVudCB3aWxsLCBkYXNzIHdpciBldHdhcyBuaWNodCB0dW4uIFdpciBNVUVTU0VOIGRhcyBha3plcHRpZXJlbi4KKyAgICAgICAgLy8gd2VubiBkaWUgT3B0aW9uIGF1ZiB1bnNlcmVyIFNlaXRlIGFiZXIgc2Nob24gYXVzIGlzdCwgbXVlc3NlbiB3aXIKKyAgICAgICAgLy8gZGllcyBpZ25vcmllcmVuLgorICAgICAgICBpZiAob3B0LT5zdGF0ZS0+bG9jYWxzaWRlID09IDApCisgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIG9wdC0+cmVfd2lzaGVzLT5sb2NhbHNpZGUgPSBjb21tYW5kOworICAgICAgICAvLyBXZW5uIHdpciBub2NoIGtlaW4gV09OVCBnZXNlbmRldCBoYWJlbiwgc2VuZGVuIHdpciBkYXMgamV0enQgYWxzCisgICAgICAgIC8vIEJlc3RhZXRpZ3VuZy4KKyAgICAgICAgaWYgKG9wdC0+bG9fd2lzaGVzLT5sb2NhbHNpZGUgPSBXT05UKQorICAgICAgICAgICAgc2VuZF90ZWxuZXRfbmVnKCAoe1dPTlQsIG9wdGlvbn0pICk7CisgICAgICAgIC8vIFZlcmhhbmRsdW5nIGJlZW5kZXQsIE9wdGlvbiBpcyBhdWYgdW5zZXJlciBTZWl0ZSBqZXR6dCBhdXMuCisgICAgICAgIC8vIFd1ZW5zY2hlIGF1Y2ggd2llZGVyIHp1cnVlY2tzZXR6ZW4uCisgICAgICAgIG9wdC0+cmVfd2lzaGVzLT5sb2NhbHNpZGUgPSAwOworICAgICAgICBvcHQtPmxvX3dpc2hlcy0+bG9jYWxzaWRlID0gMDsKKyAgICAgICAgaWYgKG9wdC0+c3RhdGUtPmxvY2Fsc2lkZSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgb3B0LT5zdGF0ZS0+bG9jYWxzaWRlID0gMDsKKyAgICAgICAgICBfY2FsbF9oYW5kbGVyKG9wdCwgTE9DQUxPRkYsIDApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKCBjb21tYW5kID09IERPICkKKyAgICB7CisgICAgICAgIC8vIENsaWVudCB3aWxsLCBkYXNzIHdpciBvcHRpb24gdHVuLiBNYWwgc2NoYXVlbiwgd2llIHdpciBkYXp1IHN0ZWhlbi4KKyAgICAgICAgLy8gd2VubiBkaWUgT3B0aW9uIGF1ZiB1bnNlcmVyIFNlaXRlIGFiZXIgc2Nob24gYW4gaXN0LCBtdWVzc2VuIHdpcgorICAgICAgICAvLyBkaWVzIGlnbm9yaWVyZW4uCisgICAgICAgIGlmIChvcHQtPnN0YXRlLT5sb2NhbHNpZGUgPT0gMSkKKyAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgb3B0LT5yZV93aXNoZXMtPmxvY2Fsc2lkZSA9IGNvbW1hbmQ7CisKKyAgICAgICAgaWYgKCBvcHQtPmxvX3dpc2hlcy0+bG9jYWxzaWRlID09IDAgKSB7CisgICAgICAgICAgICAvLyB3aXIgaGFiZW4gdW5zZXJlIFd1ZW5zY2hlIG5vY2ggbmljaHQgZ2VhZXVzc2VydC4gU29iYWxkIHdpcgorICAgICAgICAgICAgLy8gYmVzdGFldGlnZW4sIGlzdCBkaWUgT3B0aW9uIGF1ZiB1bnNlcmVyIFNlaXRlIGFuL2F1cyB1bmQgZGllCisgICAgICAgICAgICAvLyBWZXJoYW5kbHVuZ2VuIGJlZW5kZXQuCisgICAgICAgICAgICAvLyBpbiBqZWRlbSBGYWxsIGRpZSBXdWVuc2NoZSB6dXJ1ZWNrc2V0emVuCisgICAgICAgICAgICBvcHQtPnJlX3dpc2hlcy0+bG9jYWxzaWRlID0gMDsKKyAgICAgICAgICAgIG9wdC0+bG9fd2lzaGVzLT5sb2NhbHNpZGUgPSAwOworICAgICAgICAgICAgaWYgKG9wdC0+bG9jYWxoYW5kbGVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlbmRfdGVsbmV0X25lZygoe1dJTEwsIG9wdGlvbn0pKTsKKyAgICAgICAgICAgICAgICBvcHQtPnN0YXRlLT5sb2NhbHNpZGUgPSAxOworICAgICAgICAgICAgICAgIF9jYWxsX2hhbmRsZXIob3B0LCBMT0NBTE9OLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZW5kX3RlbG5ldF9uZWcoKHtXT05ULCBvcHRpb259KSk7CisgICAgICAgICAgICAgICAgb3B0LT5zdGF0ZS0+bG9jYWxzaWRlID0gMDsKKyAgICAgICAgICAgICAgICBfY2FsbF9oYW5kbGVyKG9wdCwgTE9DQUxPRkYsIDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG9wdC0+bG9fd2lzaGVzLT5sb2NhbHNpZGUgPT0gV0lMTCApIHsKKyAgICAgICAgICAgIC8vIHdpciBoYWJlbiBzY2hvbiBXSUxMIGdlc2VuZGV0LCB3ZWxjaGVzIGRlciBDbGllbnQgamV0enQKKyAgICAgICAgICAgIC8vIGJlc3RhZXRpZ3QgaGF0IChkLmguIGRpZSBPcHRpb24gaXN0IGpldHp0IGF1ZiBkaWVzZXIgU2VpdGUgYW4pLAorICAgICAgICAgICAgLy8gd2lyIGJlc3RhZXRpZ2VuIGRhcyBhYmVyIG5pY2h0IChub2NobWFsKS4KKyAgICAgICAgICAgIG9wdC0+cmVfd2lzaGVzLT5sb2NhbHNpZGUgPSAwOworICAgICAgICAgICAgb3B0LT5sb193aXNoZXMtPmxvY2Fsc2lkZSA9IDA7CisgICAgICAgICAgICBpZiAob3B0LT5zdGF0ZS0+bG9jYWxzaWRlICE9IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIG9wdC0+c3RhdGUtPmxvY2Fsc2lkZSA9IDE7CisgICAgICAgICAgICAgIF9jYWxsX2hhbmRsZXIob3B0LCBMT0NBTE9OLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIE1obW0uIFdpciBoYWJlbiBlaW4gV09OVCBnZXNlbmRldCwgZGVyIENsaWVudCBoYXQgbWl0IERPCisgICAgICAgICAgICAvLyBnZWFudHdvcnRldC4gRGFzIGRhcmYgZXIgZWlnZW50bGljaCBuaWNodC4KKyAgICAgICAgICAgIC8vIFRPRE86IFdhcyB0dW4/CisgICAgICAgICAgICBzZW5kX3RlbG5ldF9uZWcgKCAoe1dPTlQsIG9wdGlvbn0pICk7CisgICAgICAgIH0KKyAgICAgICAgLy8gZmVydGlnIG1pdCBETworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIGJsZWlidCBub2NoIFNCIHVlYmVyCisgICAgZWxzZSBpZiAoIGNvbW1hbmQgPT0gU0IgKQorICAgIHsKKyAgICAgICAgb3B0LT5yZV93aXNoZXMtPnNiZGF0YSA9IG9wdGFyZ3M7CisgICAgICAgIF9jYWxsX2hhbmRsZXIob3B0LCBTQiwgb3B0YXJncyk7CisgICAgICAgIHJldHVybjsKKyAgICB9IC8vIGlmICggY29tbWFuZCA9PSBTQiApCit9CisKKy8vIHdpcmQgbnVyIGluIGJhc2UuYyBnZXJ1ZmVuLCB3ZW5uIGRpZSBWZXJiaW5kdW5nIGFuIGRhcyBTcGllbGVyb2JqZWt0CisvLyB1ZWJlcmdlYmVuIHd1cmRlLgorLy8gZXMgdWViZXJ0cmFlZ3QgdW50ZXIgYW5kZXJlbSBkZW4gVGVsbmV0IE9wdGlvbiBadXN0YW5kIGF1cyBsb2dpbi5jIChkYXMgaXN0CisvLyBkYW5uIHByZXZpb3VzX29iamVjdCgpKSBpbiBkYXMgU3BpZWxlcm9iamVrdCAod2VsY2hlcyBkYW5uIHRoaXNfb2JqZWN0KCkpCisvLyBpc3QhCitwcm90ZWN0ZWQgdm9pZAorc3RhcnR1cF90ZWxuZXRfbmVncygpCit7CisgIGludCogb3B0YXJnczsKKworICBTZXQoIFBfVFRZX1RZUEUsIDAgKTsgIC8vYXZvaWQgQU5ZIG1pc3Rha2VzLi4uIFdpcmQgdW50ZW4gbmV1IGdlc2V0enQuCisgIC8vIERhdGVuIGF1cyBkZW0gTG9naW5vYmpla3QgdWViZXJ0cmFnZW4uIERhcyBpc3Qgd2ljaHRpZyEgKERhYmVpIHdpcmQgZGFubgorICAvLyBhdWNoIGRlciBTdGF0dXMgdm9uIGRlciBsZXR6dGVuIFNlc3Npb24gdWViZXJzY2hyaWViZW4uKQorICBUTiA9IChtYXBwaW5nKSBwcmV2aW91c19vYmplY3QoKS0+cXVlcnlfdGVsbmV0X25lZygpOworICAvLyBiZXZvciBpcmdlbmR3YXMgYW5kZXJlcyBnZW1hY2h0IHdpcmQsIHdlcmRlbiBlcnN0bWFsIGRpZSBTdGFuZGFyZGhhbmRsZXIKKyAgLy8gZ2VzZXR6dC4gRGllIHNpbmQgbmFlbWxpY2ggaW4gZGllc2VtIE9iamVrdCBqZXR6dCBlcnN0bWFsIGthcHV0dCwgd2VpbAorICAvLyBzaWUgaW0gTG9naW5vYmpla3QgZ2VydWZlbiB3ZXJkZW4uCisgIF9iaW5kX3RlbG5lZ19zdGRfaGFuZGxlcnMoKTsKKyAgLy8gZGFubiByZXN0bGljaGUgRGF0ZW4gYXVzIGRlbSBMb2dpbm9iamVrdCBob2xlbi4KKyAgVGVybWluYWxzID0gKHN0cmluZyAqKSBwcmV2aW91c19vYmplY3QoKS0+cXVlcnlfdGVybWluYWxzKCk7CisgIFNldCggUF9UVFlfQ09MUywgcHJldmlvdXNfb2JqZWN0KCktPlF1ZXJ5KFBfVFRZX0NPTFMpICk7CisgIFNldCggUF9UVFlfUk9XUywgcHJldmlvdXNfb2JqZWN0KCktPlF1ZXJ5KFBfVFRZX1JPV1MpICk7CisKKyAgc3RydWN0IHRlbG9wdF9zIG9wdCA9IFROW1RFTE9QVF9OQVdTXTsKKyAgaWYgKG9wdGFyZ3MgPSAob3B0LT5yZV93aXNoZXMpLT5zYmRhdGEpIHsKKyAgICAgIGV2YWxfbmF3cyhvcHRhcmdzKTsKKyAgfQorCisgIGlmICggcG9pbnRlcnAoVGVybWluYWxzKSAmJiBzaXplb2YoVGVybWluYWxzKSkgeworICAgICAgaWYgKCBUZXJtaW5hbHNbMF1bMC4uM10gPT0gImRlYy0iICkKKyAgICAgICAgICBUZXJtaW5hbHNbMF0gPSBUZXJtaW5hbHNbMF1bNC4uXTsKKworICAgICAgaWYgKCBUZXJtaW5hbHNbMF0gPT0gImxpbnV4IiApCisgICAgICAgICAgVGVybWluYWxzWzBdID0gInZ0MTAwIjsKKworICAgICAgU2V0KCBQX1RUWV9UWVBFLCBUZXJtaW5hbHNbMF0gKTsKKyAgfQorfQorCisvLyBzb21laG93IGNvbXBsZXRlbHkgb3V0IG9mIHRoZSBvcmRpbmFyeSBvcHRpb25zIHByb2Nlc3NpbmcvbmVnb3RpYXRpb24uIEJ1dAorLy8gdGhlIG9ubHkgcHVycG9zZSBpcyB0byB0cmFuc21pdCBzb21ldGhpbmcgb3ZlciB0aGUgd2lyZSB3aGljaCBpcyBub3Qgc2hvd24sCisvLyBidXQgKGxpa2VseSkgYW5zd2VyZWQgYnkgdGhlIG90aGVyIGRldmljZS4KK3Byb3RlY3RlZCB2b2lkIHNlbmRfdGVsbmV0X3RpbWluZ19tYXJrKCkgeworICBzdHJ1Y3QgdGVsb3B0X3Mgb3B0ID0gVE5bVEVMT1BUX1RNXTsKKyAgaWYgKHBvaW50ZXJwKG9wdC0+ZGF0YSkpCisgICAgb3B0LT5kYXRhWzFdID0gdXRpbWUoKTsKKyAgZWxzZQorICAgIG9wdC0+ZGF0YSA9ICh7IDAsIHV0aW1lKCkgfSk7CisgIC8vIGFic2ljaHRsaWNoIG5pY2h0IGRvX3RlbG5ldF9uZSgpIHZlcndlbmRldCwgZGEgZGllcyBuaWNodCBzZW5kZW4gd3VlcmRlLAorICAvLyBoYWV0dGUgZGVyIENsaWVudCBzY2hvbm1hbCBtaXQgV0lMTCBnZWFudHdvcnRldC4gVEVMT1BUX1RNIGlzdCBhYmVyIGVpbmUKKyAgLy8gT3B0aW9uLCBiZWkgZGVyIG1hbiBkYXMgZGFyZi4uLgorICBzZW5kX3RlbG5ldF9uZWcoICh7RE8sIFRFTE9QVF9UTX0pICk7Cit9CisKKy8qIElzIGNhbGxlZCBmcm9tIHRoZSBIX1BSSU5UX1BST01QVCBkcml2ZXIgaG9vayBhbmQgYXBwZW5kcyB0aGUgSUFDIEVPUiBpZgorICogdGhlIGNsaWVudCBzdXBwb3J0cyBpdC4KKyAqLwordm9pZCBwcmludF9wcm9tcHQoc3RyaW5nIHByb21wdCkgeworLy8gICAgaWYgKGV4dGVybl9jYWxsKCkgJiYgcHJldmlvdXNfb2JqZWN0KCkhPXRoaXNfb2JqZWN0KCkpCisvLyAgICAgICAgcmV0dXJuOworCisgICAgLy8gZ2dmLiBVaHJ6ZWl0IGluIGRlbiBwcm9tcHQgcmVpbnNjaHJlaWJlbi4KKyAgICBwcm9tcHQgPSByZWdyZXBsYWNlKHByb21wdCwiXFx0IixzdHJmdGltZSgiJUg6JU0iKSwwKTsKKyAgICAvLyBQcm9tcHQgc2VuZGVuCisgICAgdGVsbF9vYmplY3QodGhpc19vYmplY3QoKSwgcHJvbXB0KTsKKyAgICAvLyBVbmQgRU9SIHNlbmRlbiwgZmFsbHMgdm9tIENsaWVudCBnZXd1ZW5zY2h0LgorICAgIHN0cnVjdCB0ZWxvcHRfcyBvcHQgPSBUTltURUxPUFRfRU9SXTsKKyAgICBpZiAob3B0LT5zdGF0ZS0+bG9jYWxzaWRlID09IDEpCisgICAgeworICAgICAgICBiaW5hcnlfbWVzc2FnZSgoe0lBQywgRU9SfSksIDEpOworICAgICAgICBEVE4oInRuX2VvciAiLCh7SUFDLEVPUn0pKTsKKyAgICB9Cit9CisKKy8vIEhlbHBlcgorcHJpdmF0ZSB2b2lkIGV2YWxfbmF3cyhpbnQgKm9wdGFyZ3MpIHsKKyAgaW50IGwsIGM7CisKKyAgaWYgKCBzaXplb2Yob3B0YXJncykgIT0gNCApCisgIHsKKyAgICAgIHRlbGxfb2JqZWN0KHRoaXNfb2JqZWN0KCksCisgICAgICAgICAgYnJlYWtfc3RyaW5nKCBzcHJpbnRmKCJEZWluIENsaWVudCBoYXQgZWluZW4gRmVobGVyIGJlaW0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyJBdXNoYW5kZWxuIGRlciBURUxPUFRfTkFXUyAtIGVyIGhhdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIklBQyBTQiAlTyBJQUMgU0UgZ2VzZW5kZXQhXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGFyZ3MpLCA3OCwKKyAgICAgICAgICAgICAgICAgICAgIkRlciBHYW1lRHJpdmVyIHRlaWx0IERpciBtaXQ6ICIgKSk7CisgICAgICAvLyB1bmQgZGVtIENsaWVudCBzYWdlbiwgZGFzcyBlciBkZW4gU2Nocm90dCBuaWNodCBtZWhyIHVlYmVydHJhZ2VuCisgICAgICAvLyBzb2xsIChmYWxscyB3aXIgZGFzIG5pY2h0IHNjaG9uIGdlbWFjaHQgaGFiZW4pLgorICAgICAgc3RydWN0IHRlbG9wdF9zIG9wdCA9IFROW1RFTE9QVF9OQVdTXTsKKyAgICAgIGlmIChvcHQtPnN0YXRlLT5yZW1vdGVzaWRlID09IFdJTEwKKyAgICAgICAgICAmJiBvcHQtPmxvX3dpc2hlcy0+cmVtb3Rlc2lkZSAhPSBET05UKQorICAgICAgICBzZW5kX3RlbG5ldF9uZWcoKCB7RE9OVCwgVEVMT1BUX05BV1N9KSApOworICAgICAgcmV0dXJuOworICB9CisKKyAgaWYgKCBpbnRlcmFjdGl2ZSh0aGlzX29iamVjdCgpKSApeworICAgICAgaWYgKCAhb3B0YXJnc1sxXSApCisgICAgICAgICAgYyA9IG9wdGFyZ3NbMF07CisgICAgICBlbHNlCisgICAgICAgICAgYyA9IG9wdGFyZ3NbMV0gKyBvcHRhcmdzWzBdICogMjU2OworCisgICAgICBpZiAoIGMgPCAzNSApeworICAgICAgICAgIGlmIChRdWVyeShQX1RUWV9TSE9XKSkKKyAgICAgICAgICAgICAgdGVsbF9vYmplY3QoIHRoaXNfb2JqZWN0KCksCisgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrX3N0cmluZygiRGVpbiBGZW5zdGVyIGlzdCBzY2htYWxlciBhbHMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIiAzNSBaZWljaGVuPyBEdSBzY2hlcnp0LiA7LSkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIiBJY2ggYmVudXR6ZSBkZW4gU3RhbmRhcmR3ZXJ0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyIgdm9uIDgwIFplaWNoZW4uXG4iLCA3OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZXIgR2FtZURyaXZlciB0ZWlsdCBEaXIgbWl0OiAiKQorICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgIGMgPSA4MDsKKyAgICAgIH0KKworICAgICAgaWYgKCAhb3B0YXJnc1szXSApCisgICAgICAgICAgbCA9IG9wdGFyZ3NbMl07CisgICAgICBlbHNlCisgICAgICAgICAgbCA9IDI1NiAqIG9wdGFyZ3NbMl0gKyBvcHRhcmdzWzNdOworCisgICAgICBpZiAoIGwgPiAxMDAgKXsKKyAgICAgICAgICAvL1RPRE86IHJlbW92ZQorICAgICAgICAgIGwgPSAxMDA7CisgICAgICAgICAgaWYgKFF1ZXJ5KFBfVFRZX1NIT1cpKQorICAgICAgICAgICAgICB0ZWxsX29iamVjdCggdGhpc19vYmplY3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtfc3RyaW5nKCJUdXQgbWlyIGxlaWQsIGFiZXIgaWNoIGthbm4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIiBudXIgYmlzIHp1IDEwMCBaZWlsZW4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIiB2ZXJ3YWx0ZW4uXG4iLCAoYyA/IGMtMiA6IDc4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZXIgR2FtZURyaXZlciB0ZWlsdCBEaXIgbWl0OiAiICkKKyAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgIH0KKworICAgICAgaWYgKCBsIDwgMyApeworICAgICAgICAgIGlmIChRdWVyeShQX1RUWV9TSE9XKSkKKyAgICAgICAgICAgICAgdGVsbF9vYmplY3QoIHRoaXNfb2JqZWN0KCksCisgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrX3N0cmluZygiRHUgd2lsbHN0IHdlbmlnZXIgYWxzIGRyZWkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIiBaZWlsZW4gYmVudXR6ZW4/IEdsYXViIGljaCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiIERpciBuaWNodCAtIGljaCBiZW51dHplIGRlbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiIFN0YW5kYXJkd2VydCB2b24gMjQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIiBaZWlsZW4uXG4iLCAoYyA/IGMtMiA6IDc4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZXIgR2FtZURyaXZlciB0ZWlsdCBEaXIgbWl0OiAiICkKKyAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICBsID0gMjQ7CisgICAgICB9CisKKyAgICAgIGlmICggKChpbnQpIFF1ZXJ5KFBfVFRZX1JPV1MpICE9IGwpIHx8CisgICAgICAgICAgICgoaW50KSBRdWVyeShQX1RUWV9DT0xTKSAhPSBjKSApeworICAgICAgICAgIFNldCggUF9UVFlfUk9XUywgbCApOworICAgICAgICAgIFNldCggUF9UVFlfQ09MUywgYyApOworCisgICAgICAgICAgaWYgKFF1ZXJ5KFBfVFRZX1NIT1cpKQorICAgICAgICAgICAgICB0ZWxsX29iamVjdCggdGhpc19vYmplY3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtfc3RyaW5nKCJEdSBoYXN0IERlaW5lIEZlbnN0ZXJncm9lc3NlIGF1ZiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiICIrbCsiIFplaWxlbiB1bmQgIitjKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBTcGFsdGVuIGdlYWVuZGVydC5cbiIsIGMtMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZXIgR2FtZURyaXZlciB0ZWlsdCBEaXIgbWl0OiAiKQorICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgfQorICB9Cit9CisKK3ByaXZhdGUgdm9pZCBfY2FsbF9vbGRfU2VuZFRlbE9wdHMob2JqZWN0IHBvKSB7CisgIGlmICghb2JqZWN0cChwbykgfHwgIWludGVyYWN0aXZlKHBvKSkgcmV0dXJuOworLyoKKyAgY2xvc3VyZSBjbD11bmJvdW5kX2xhbWJkYSggKHt9KSwKKyAgICAgICAgICAgICAgICh7ICMnZnVuY2FsbCwgKHsjJ3N5bWJvbF9mdW5jdGlvbiwgIlNlbmRUZWxvcHRzIn0pIH0pICk7CisKKyAgZnVuY2FsbChiaW5kX2xhbWJkYShjbCwgcG8pKTsKKyovICAKKyAgLy8gQmxvb2R5IHRlbXBvcmFyeSBIYWNrIHVudGlsIG5leHQgcmVib290Li4uCisKKyAgZnVuY2FsbCggYmluZF9sYW1iZGEoICMnZWZ1bjo6YmluYXJ5X21lc3NhZ2UsIHBvICksCisgICAgICAgICAgICh7IElBQywgV0lMTCwgVEVMT1BUX0VPUiwKKyAgICAgICAgICAgICAgSUFDLCBETywgVEVMT1BUX1RUWVBFLAorICAgICAgICAgICAgICBJQUMsIERPLCBURUxPUFRfTkFXUywKKyAgICAgICAgICAgICAgSUFDLCBETywgVEVMT1BUX0xJTkVNT0RFLAorICAgICAgICAgICB9KSwgMHgxICk7Cit9CisKKy8vIFF1ZXJ5LS9TZXQtTWV0aG9kZW4KKy8vIFVuZCB3ZW5uIGhpZXIgZWluZXIgdm9uIGF1c3NlbiBkcmFuIHJ1bXBmdXNjaHQsIHdlcmRlIGljaCBzYXVlci4KK21hcHBpbmcKK3F1ZXJ5X3RlbG5ldF9uZWcoKQoreworICAgaWYgKGludGVyYWN0aXZlKHByZXZpb3VzX29iamVjdCgpKQorICAgICAgJiYgcHJvZ3JhbV90aW1lKHByZXZpb3VzX29iamVjdCgpKSA8IDEzNTk5MjYwNzkKKyAgICAgICYmIGxvYWRfbmFtZSh0aGlzX29iamVjdCgpKSA9PSAiL3NlY3VyZS9sb2dpbiIgKQorICAgIHsKKyAgICAgIGNhbGxfb3V0KCMnX2NhbGxfb2xkX1NlbmRUZWxPcHRzLCAwLCBwcmV2aW91c19vYmplY3QoKSk7CisgICAgICAvLyBhbHRlIERhdGVuc3RydWt0dXIgenVydWVja2dlYmVuLi4uIExlaWRlciBsZWVyLi4uCisgICAgICByZXR1cm4gKFsic2VudCI6IG1fYWxsb2NhdGUoMywzKSwgInJlY2VpdmVkIjogbV9hbGxvY2F0ZSgzLDMpIF0pOworICAgIH0KKworICAgIHJldHVybiBUTjsKK30KKworLy8gc2llaGUgb2Jlbgorc3RyaW5nICoKK3F1ZXJ5X3Rlcm1pbmFscygpIHsKKyAgICByZXR1cm4gVGVybWluYWxzOworfQorCitwdWJsaWMgaW50IF9xdWVyeV9wX2xpYl90ZWxuZXRfcnR0aW1lKCkKK3sKKyAgc3RydWN0IHRlbG9wdF9zIG9wdCA9IFROW1RFTE9QVF9UTV07CisgIGlmIChvcHQgJiYgcG9pbnRlcnAob3B0LT5kYXRhKSkKKyAgICByZXR1cm4gKG9wdC0+ZGF0YSlbMF07CisgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9zZWN1cmUvdGVsbmV0bmVnLmggYi9zZWN1cmUvdGVsbmV0bmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdiNjcyMwotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS90ZWxuZXRuZWcuaApAQCAtMCwwICsxLDQ0IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gL3NlY3VyZS90ZWxuZXRuZWcuaCAtLSBEZWZpbml0aW9uZW4gdW5kIFByb3RvdHlwZXMgZnVlciBUZWxuZXQtTmVnb3RpYXRpb25zCisvLworLy8gJElkOiB0ZWxuZXRuZWcuaCx2IDEuMSAyMDAzLzAyLzE3IDExOjIwOjAyIFJpa3VzIEV4cCAkCisKKyNpZm5kZWYgX1NFQ1VSRV9URUxORVRORUdfSF8KKyNkZWZpbmUgX1NFQ1VSRV9URUxORVRORUdfSF8KKy8vIERpZXMgaXN0IHZlcm11dGxpY2ggZGVyIGVpbnppZ2UgVGVpbCwgZGVuIGFuZGVyZSAoei5CLiBwbGF5ZXIvYmFzZS5oKQorLy8gYnJhdWNoZW4uLi4KKy8vIFByb3BlcnRpZXMgZnVlciBkaWUgdGF0c2FlY2hsaWNoZSBGZW5zdGVyZ3JvZXNzZSBkZXMgVGVsbmV0Y2xpZW50cyBzb3dpZQorLy8gZGVuIGVpbmdlc3RlbGx0ZW4gVGVybWluYWx0eXAuIEZhbGxzIGRlciBDbGllbnQgZGllIERhdGVuIG5pY2h0CisvLyBoZXJhdXNydWVja3QsIGJsZWliZW4gZGllIFByb3BlcnRpZXMgbGVlci4KKyNkZWZpbmUgUF9UVFkgICAgICAgICAgICAgICAgInR0eSIKKyNkZWZpbmUgUF9UVFlfQ09MUyAgICAgICAgICAgInR0eV9jb2xzIgorI2RlZmluZSBQX1RUWV9ST1dTICAgICAgICAgICAidHR5X3Jvd3MiCisjZGVmaW5lIFBfVFRZX1RZUEUgICAgICAgICAgICJ0dHlfdHlwZSIKKyNkZWZpbmUgUF9UVFlfU0hPVyAgICAgICAgICAgInR0eV9zaG93IgorI2RlZmluZSBQX1RFTE5FVF9SVFRJTUUgICAgICAicF9saWJfdGVsbmV0X3J0dGltZSIKKworI2VuZGlmCisKKworI2lmZGVmIE5FRURfUFJPVE9UWVBFUworI2lmbmRlZiBfU0VDVVJFX1RFTE5FVE5FR19IX1BST1RPU18KKyNkZWZpbmUgX1NFQ1VSRV9URUxORVRORUdfSF9QUk9UT1NfCisvLyB3aXJkIGVpZ2VudGxpY2ggbnVyIGZ1ZXIgZGllIEltcGxlbWVudGF0aW9uIGdlYnJhdWNodAorI2luY2x1ZGUgIi9zeXMvdGVsbmV0LmgiCisKKy8vIEtvbnN0YW50ZW4gZnVlciBkaWUgamV3LiByZW1vdGUgdW5kIGxvY2FsIGhhbmRsZXIKKyNkZWZpbmUgTE9DQUxPTiAgIFdJTEwKKyNkZWZpbmUgTE9DQUxPRkYgIFdPTlQKKyNkZWZpbmUgUkVNT1RFT04gIERPCisjZGVmaW5lIFJFTU9URU9GRiBET05UCisKK3Byb3RlY3RlZCBpbnQgYmluZF90ZWxuZWdfaGFuZGxlcihpbnQgb3B0aW9uLCBjbG9zdXJlIHJlLCBjbG9zdXJlIGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbml0bmVnKTsKK3Byb3RlY3RlZCBpbnQgZG9fdGVsbmV0X25lZyhpbnQgb3B0aW9uLCBpbnQgYWN0aW9uKTsKK3Byb3RlY3RlZCB2YXJhcmdzIGludCBzZW5kX3RlbG5ldF9uZWcoaW50ICphcnIsIGludCBibV9mbGFncyk7Citwcm90ZWN0ZWQgdmFyYXJncyBpbnQgc2VuZF90ZWxuZXRfbmVnX3N0cihzdHJpbmcgc3RyLCBpbnQgYm1fZmxhZ3MpOworCisjZW5kaWYgLy8gX1NFQ1VSRV9URUxORVRORUdfSF9QUk9UT1NfCisjZW5kaWYgLy8gTkVFRF9QUk9UT1RZUEVTCisKZGlmZiAtLWdpdCBhL3NlY3VyZS90b3BsaXN0ZS5jIGIvc2VjdXJlL3RvcGxpc3RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI3NTdlNAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS90b3BsaXN0ZS5jCkBAIC0wLDAgKzEsMjgwIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvKiogXGZpbGUgL2ZpbGUuYworKiBLdXJ6YmVzY2hyZWlidW5nLgorKiBMYW5nYmVzY2hyZWlidW5nLi4uCisqIFxhdXRob3IgPEF1dG9yPgorKiBcZGF0ZSA8ZGF0ZT4KKyogXHZlcnNpb24gJElkJAorKi8KKy8qIENoYW5nZWxvZzoKKyovCisjcHJhZ21hIHN0cm9uZ190eXBlcyxzYXZlX3R5cGVzLHJ0dF9jaGVja3MKKyNwcmFnbWEgbm9fY2xvbmUsbm9faW5oZXJpdCxub19zaGFkb3cKKyNwcmFnbWEgcGVkYW50aWMsIHJhbmdlX2NoZWNrCisKKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8ZXZlbnRzLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8bGVwbWFzdGVyLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHVzZXJpbmZvLmg+CisKKyNkZWZpbmUgSE9NRSh4KSAoX19QQVRIX18oMCkreCkKKyNpbmNsdWRlIDxsaXZpbmcvY29tbS5oPgorI2RlZmluZSBaREVCVUcoeCkgaWYgKGZpbmRfcGxheWVyKCJ6ZXNzdHJhIikpIFwKKyAgZmluZF9wbGF5ZXIoInplc3N0cmEiKS0+UmVjZWl2ZU1zZyh4LE1UX0RFQlVHLDAsb2JqZWN0X25hbWUoKSsiOiIsdGhpc19vYmplY3QoKSkKKy8vI2RlZmluZSBaREVCVUcoeCkKKworb2JqZWN0ICpwbGF5ZXJzID0gKHt9KTsKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgc2V0ZXVpZChnZXR1aWQoKSk7CisgIGlmIChzbF9vcGVuKEhPTUUoIkFSQ0gvdG9wbGlzdGUuc3FsaXRlIikpICE9IDEpCisgIHsKKyAgICByYWlzZV9lcnJvcigiRGF0ZW5iYW5rIGtvbm50ZSBuaWNodCBnZW9lZmZuZXQgd2VyZGVuLlxuIik7CisgIH0KKyAgLy8gVGFiZWxsZW4gdW5kIEluZGljZXMgYW5sZWdlbiwgZmFsbHMgZGllIG5pY2h0IGV4aXN0aWVyZW4uCisgIHNsX2V4ZWMoIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIHRvcGxpc3RlKG5hbWUgVEVYVCBQUklNQVJZIEtFWSBBU0MsICIKKyAgICAgICAgICAiZ2lsZGUgVEVYVCBOT1QgTlVMTCwgcmFzc2UgVEVYVCBOT1QgTlVMTCwgIgorICAgICAgICAgICJhZ2UgREFURVRJTUUsIHdpemxldmVsIElOVEVHRVIsICIKKyAgICAgICAgICAibGFzdHVwZGF0ZSBEQVRFVElNRSBERUZBVUxUIGN1cnJlbnRfdGltZXN0YW1wLCAiCisgICAgICAgICAgImxlcCBJTlRFR0VSLCBxcCBJTlRFR0VSLCB4cCBJTlRFR0VSLCBsZXZlbCBJTlRFR0VSIgorICAgICAgICAgICJoYXJkY29yZSBJTlRFR0VSKTsiKTsKKyAgc2xfZXhlYygiQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgaWR4X2dpbGRlIE9OIHRvcGxpc3RlKGdpbGRlKTsiKTsKKyAgc2xfZXhlYygiQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgaWR4X3Jhc3NlIE9OIHRvcGxpc3RlKHJhc3NlKTsiKTsKKyAgc2xfZXhlYygiQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgaWR4X2hhcmRjb3JlIE9OIHRvcGxpc3RlKGhhcmRjb3JlKTsiKTsKKyAgCisgIC8vIExvZ2luLUV2ZW50IGFib25uaWVyZW4KKyAgaWYgKEVWRU5URC0+UmVnaXN0ZXJFdmVudChFVlRfTElCX0xPR0lOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaXN0ZW4iLCB0aGlzX29iamVjdCgpKSA8PSAwKQorICB7CisgICAgcmFpc2VfZXJyb3IoIkxvZ2luZXZlbnQga29ubnRlIG5pY2h0IGFib25uaWVydCB3ZXJkZW4uXG4iKTsKKyAgfQorICBpZiAoRVZFTlRELT5SZWdpc3RlckV2ZW50KEVWVF9MSUJfQURWQU5DRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGlzdGVuIiwgdGhpc19vYmplY3QoKSkgPD0gMCkKKyAgeworICAgIHJhaXNlX2Vycm9yKCJFVlRfTElCX0FEVkFOQ0Uga29ubnRlIG5pY2h0IGFib25uaWVydCB3ZXJkZW4uXG4iKTsKKyAgfQorICBpZiAoRVZFTlRELT5SZWdpc3RlckV2ZW50KEVWVF9MSUJfUVVFU1RfU09MVkVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaXN0ZW4iLCB0aGlzX29iamVjdCgpKSA8PSAwKQorICB7CisgICAgcmFpc2VfZXJyb3IoIkVWVF9MSUJfUVVFU1RfU09MVkVEIGtvbm50ZSBuaWNodCBhYm9ubmllcnQgd2VyZGVuLlxuIik7CisgIH0KKyAgaWYgKEVWRU5URC0+UmVnaXN0ZXJFdmVudChFVlRfTElCX01JTklRVUVTVF9TT0xWRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpc3RlbiIsIHRoaXNfb2JqZWN0KCkpIDw9IDApCisgIHsKKyAgICByYWlzZV9lcnJvcigiRVZUX0xJQl9NSU5JUVVFU1RfU09MVkVEIGtvbm50ZSBuaWNodCBhYm9ubmllcnQgd2VyZGVuLlxuIik7CisgIH0KK30KKworcHJpdmF0ZSB2b2lkIHByb2Nlc3MoKQoreworICBmb3JlYWNoKG9iamVjdCBwbCA6ICZwbGF5ZXJzKQorICB7CisgICAgaWYgKGdldF9ldmFsX2Nvc3QoKSA8IDIwMDAwMCkKKyAgICB7CisgICAgICBjYWxsX291dCgjJ3Byb2Nlc3MsIDIpOworICAgICAgcGxheWVycyAtPSAoezB9KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2xfZXhlYygiSU5TRVJUIE9SIFJFUExBQ0UgSU5UTyB0b3BsaXN0ZShuYW1lLCBnaWxkZSwgcmFzc2UsICIKKyAgICAgICAgICAgICAgICAiYWdlLCB3aXpsZXZlbCwgbGFzdHVwZGF0ZSwgbGVwLCBxcCwgeHAsIGxldmVsLCBoYXJkY29yZSkgIgorICAgICAgICAgICAgICAgICJWQUxVRVMoPzEsPzIsPzMsPzQsPzUsPzYsPzcsPzgsPzksPzEwLD8xMSk7IiwKKyAgICAgICAgICAgICAgICBwbC0+cXVlcnlfcmVhbF9uYW1lKCksCisgICAgICAgICAgICAgICAgcGwtPlF1ZXJ5UHJvcChQX0dVSUxEKSB8fCAidW5iZWthbm50IiwKKyAgICAgICAgICAgICAgICBwbC0+UXVlcnlQcm9wKFBfUkFDRSksCisgICAgICAgICAgICAgICAgcGwtPlF1ZXJ5UHJvcChQX0FHRSksCisgICAgICAgICAgICAgICAgcXVlcnlfd2l6X2xldmVsKHBsKSwKKyAgICAgICAgICAgICAgICB0aW1lKCksCisgICAgICAgICAgICAgICAgTEVQTUFTVEVSLT5RdWVyeUxFUEZvclBsYXllcihwbCksCisgICAgICAgICAgICAgICAgcGwtPlF1ZXJ5UHJvcChQX1FQKSwKKyAgICAgICAgICAgICAgICBwbC0+UXVlcnlQcm9wKFBfWFApLAorICAgICAgICAgICAgICAgIHBsLT5RdWVyeVByb3AoUF9MRVZFTCksCisgICAgICAgICAgICAgICAgcGwtPnF1ZXJ5X2hjX3BsYXkoKQorICAgICAgICAgICAgICAgKTsKKyAgICBwbD0wOworICB9CisgIHBsYXllcnMgLT0gKHswfSk7Cit9CisKK3B1YmxpYyB2b2lkIGxpc3RlbihzdHJpbmcgZWlkLCBvYmplY3QgdHJpZ29iLCBtaXhlZCBkYXRhKQoreworICBpZiAocHJldmlvdXNfb2JqZWN0KCkgIT0gZmluZF9vYmplY3QoRVZFTlREKQorICAgICAgfHwgIXRyaWdvYgorICAgICAgfHwgIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUodHJpZ29iKQorICAgICAgfHwgSVNfTEVBUk5FUih0cmlnb2IpCisgICAgICB8fCAobWl4ZWQpdHJpZ29iLT5RdWVyeVByb3AoUF9URVNUUExBWUVSKQorICAgICAgfHwgdHJpZ29iLT5RdWVyeUd1ZXN0KCkKKyAgICAgIHx8IHRyaWdvYi0+UXVlcnlQcm9wKFBfTk9fVE9QTElTVCkKKyAgICAgKQorICAgIHJldHVybjsKKworICAvLyBEaWVzZXIgaGFuZGxlciBoYXQgbnVyIDMwayBUaWNrcyB6dXIgVmVyZnVlZ3VuZywgZHVtbWVyd2Vpc2Uga2FubgorICAvLyBRdWVyeUxFUEZvclBsYXllcigpIGxvY2tlciB1ZWJlciAzMGsga29zdGVuLCB3ZW5uIGRlciBTcGllbGVyIG5pY2h0IGluCisgIC8vIENhY2hlcyBkcmluIGlzdC4gRGFoZXIgbXVzcyBkYXMgamV0enQgcGVyIGNhbGxfb3V0IGVudGtvcHBlbHQgd2VyZGVuLgorICAvLyAqc2V1ZnoqCisgIGlmIChtZW1iZXIocGxheWVycywgdHJpZ29iKSA9PSAtMSkKKyAgeworICAgIHBsYXllcnMgKz0gKHt0cmlnb2J9KTsKKyAgICBpZiAoZmluZF9jYWxsX291dCgjJ3Byb2Nlc3MpID09IC0xKQorICAgICAgY2FsbF9vdXQoIydwcm9jZXNzLCAyKTsKKyAgfQorfQorCitwdWJsaWMgdmFyYXJncyA8IDxzdHJpbmd8aW50PiogPiogTGlzdGUoc3RyaW5nIHJhc3NlLCBzdHJpbmcgZ2lsZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbWl0LCBzdHJpbmcgc29ydCkKK3sKKyAgLy8gRGVmYXVsdHM6CisgIHNvcnQgfHw9ICJsZXAiOworICBpZiAoIWxpbWl0IHx8IGxpbWl0ID4gMTAwKQorICAgIGxpbWl0PTEwMDsKKyAgZWxzZSBpZiAobGltaXQgPCAxKQorICAgIGxpbWl0PTE7CisgIGlmIChyYXNzZSAmJiBnaWxkZSkKKyAgICByZXR1cm4gc2xfZXhlYygKKyAgICAgICAgInNlbGVjdCBuYW1lLGxlcCxxcCx4cCxsZXZlbCxhZ2UscmFzc2UsZ2lsZGUsd2l6bGV2ZWwsaGFyZGNvcmUgZnJvbSB0b3BsaXN0ZSAiCisgICAgICAgICJXSEVSRSByYXNzZT0/MSBBTkQgZ2lsZGU9PzIgIgorICAgICAgICAiT1JERVIgQlkgIitzb3J0KyIgREVTQyBMSU1JVCAiK2xpbWl0KyI7IiwKKyAgICAgICAgcmFzc2UsIGdpbGRlKTsKKyAgZWxzZSBpZiAocmFzc2UpCisgICAgcmV0dXJuIHNsX2V4ZWMoCisgICAgICAgICJzZWxlY3QgbmFtZSxsZXAscXAseHAsbGV2ZWwsYWdlLHJhc3NlLGdpbGRlLHdpemxldmVsLGhhcmRjb3JlIGZyb20gdG9wbGlzdGUgIgorICAgICAgICAiV0hFUkUgcmFzc2U9PzEgIgorICAgICAgICAiT1JERVIgQlkgIitzb3J0KyIgREVTQyBMSU1JVCAiK2xpbWl0KyI7IiwKKyAgICAgICAgcmFzc2UpOworICBlbHNlIGlmIChnaWxkZSkKKyAgICByZXR1cm4gc2xfZXhlYygKKyAgICAgICAgInNlbGVjdCBuYW1lLGxlcCxxcCx4cCxsZXZlbCxhZ2UscmFzc2UsZ2lsZGUsd2l6bGV2ZWwsaGFyZGNvcmUgZnJvbSB0b3BsaXN0ZSAiCisgICAgICAgICJXSEVSRSBnaWxkZT0/MSAiCisgICAgICAgICJPUkRFUiBCWSAiK3NvcnQrIiBERVNDIExJTUlUICIrbGltaXQrIjsiLAorICAgICAgICBnaWxkZSk7CisgIHJldHVybiBzbF9leGVjKAorICAgICAgInNlbGVjdCBuYW1lLGxlcCxxcCx4cCxsZXZlbCxhZ2UscmFzc2UsZ2lsZGUsd2l6bGV2ZWwsaGFyZGNvcmUgZnJvbSB0b3BsaXN0ZSAiCisgICAgICAiT1JERVIgQlkgIitzb3J0KyIgREVTQyBMSU1JVCAiK2xpbWl0KyI7Iik7Cit9CisKK3B1YmxpYyB2YXJhcmdzIDwgPHN0cmluZ3xpbnQ+KiA+KiBTcGllbGVyTGlzdGUoc3RyaW5nIHJhc3NlLCBzdHJpbmcgZ2lsZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbWl0LCBzdHJpbmcgc29ydCkKK3sKKyAgLy8gRGVmYXVsdHM6CisgIHNvcnQgfHw9ICJsZXAiOworICBpZiAoIWxpbWl0IHx8IGxpbWl0ID4gMTAwKQorICAgIGxpbWl0PTEwMDsKKyAgZWxzZSBpZiAobGltaXQgPCAxKQorICAgIGxpbWl0PTE7CisgIGlmIChyYXNzZSAmJiBnaWxkZSkKKyAgICByZXR1cm4gc2xfZXhlYygKKyAgICAgICAgInNlbGVjdCBuYW1lLGxlcCxxcCx4cCxsZXZlbCxhZ2UscmFzc2UsZ2lsZGUsd2l6bGV2ZWwsaGFyZGNvcmUgZnJvbSB0b3BsaXN0ZSAiCisgICAgICAgICJXSEVSRSByYXNzZT0/MSBBTkQgZ2lsZGU9PzIgQU5EIHdpemxldmVsPTAgIgorICAgICAgICAiT1JERVIgQlkgIitzb3J0KyIgREVTQyBMSU1JVCAiK2xpbWl0KyI7IiwKKyAgICAgICAgcmFzc2UsIGdpbGRlKTsKKyAgZWxzZSBpZiAocmFzc2UpCisgICAgcmV0dXJuIHNsX2V4ZWMoCisgICAgICAgICJzZWxlY3QgbmFtZSxsZXAscXAseHAsbGV2ZWwsYWdlLHJhc3NlLGdpbGRlLHdpemxldmVsLGhhcmRjb3JlIGZyb20gdG9wbGlzdGUgIgorICAgICAgICAiV0hFUkUgcmFzc2U9PzEgQU5EIHdpemxldmVsPTAgIgorICAgICAgICAiT1JERVIgQlkgIitzb3J0KyIgREVTQyBMSU1JVCAiK2xpbWl0KyI7IiwKKyAgICAgICAgcmFzc2UpOworICBlbHNlIGlmIChnaWxkZSkKKyAgICByZXR1cm4gc2xfZXhlYygKKyAgICAgICAgInNlbGVjdCBuYW1lLGxlcCxxcCx4cCxsZXZlbCxhZ2UscmFzc2UsZ2lsZGUsd2l6bGV2ZWwsaGFyZGNvcmUgZnJvbSB0b3BsaXN0ZSAiCisgICAgICAgICJXSEVSRSBnaWxkZT0/MSBBTkQgd2l6bGV2ZWw9MCAiCisgICAgICAgICJPUkRFUiBCWSAiK3NvcnQrIiBERVNDIExJTUlUICIrbGltaXQrIjsiLAorICAgICAgICBnaWxkZSk7CisgIHJldHVybiBzbF9leGVjKAorICAgICAgInNlbGVjdCBuYW1lLGxlcCxxcCx4cCxsZXZlbCxhZ2UscmFzc2UsZ2lsZGUsd2l6bGV2ZWwsaGFyZGNvcmUgZnJvbSB0b3BsaXN0ZSAiCisgICAgICAiV0hFUkUgd2l6bGV2ZWw9MCAiCisgICAgICAiT1JERVIgQlkgIitzb3J0KyIgREVTQyBMSU1JVCAiK2xpbWl0KyI7Iik7Cit9CisKK3B1YmxpYyB2YXJhcmdzIDwgPHN0cmluZ3xpbnQ+KiA+KiBTZWhlckxpc3RlKHN0cmluZyByYXNzZSwgc3RyaW5nIGdpbGRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW1pdCwgc3RyaW5nIHNvcnQpCit7CisgIC8vIERlZmF1bHRzOgorICBzb3J0IHx8PSAibGVwIjsKKyAgaWYgKCFsaW1pdCB8fCBsaW1pdCA+IDEwMCkKKyAgICBsaW1pdD0xMDA7CisgIGVsc2UgaWYgKGxpbWl0IDwgMSkKKyAgICBsaW1pdD0xOworICBpZiAocmFzc2UgJiYgZ2lsZGUpCisgICAgcmV0dXJuIHNsX2V4ZWMoCisgICAgICAgICJzZWxlY3QgbmFtZSxsZXAscXAseHAsbGV2ZWwsYWdlLHJhc3NlLGdpbGRlLHdpemxldmVsLGhhcmRjb3JlIGZyb20gdG9wbGlzdGUgIgorICAgICAgICAiV0hFUkUgcmFzc2U9PzEgQU5EIGdpbGRlPT8yIEFORCB3aXpsZXZlbD0xICIKKyAgICAgICAgIk9SREVSIEJZICIrc29ydCsiIERFU0MgTElNSVQgIitsaW1pdCsiOyIsCisgICAgICAgIHJhc3NlLCBnaWxkZSk7CisgIGVsc2UgaWYgKHJhc3NlKQorICAgIHJldHVybiBzbF9leGVjKAorICAgICAgICAic2VsZWN0IG5hbWUsbGVwLHFwLHhwLGxldmVsLGFnZSxyYXNzZSxnaWxkZSx3aXpsZXZlbCxoYXJkY29yZSBmcm9tIHRvcGxpc3RlICIKKyAgICAgICAgIldIRVJFIHJhc3NlPT8xIEFORCB3aXpsZXZlbD0xICIKKyAgICAgICAgIk9SREVSIEJZICIrc29ydCsiIERFU0MgTElNSVQgIitsaW1pdCsiOyIsCisgICAgICAgIHJhc3NlKTsKKyAgZWxzZSBpZiAoZ2lsZGUpCisgICAgcmV0dXJuIHNsX2V4ZWMoCisgICAgICAgICJzZWxlY3QgbmFtZSxsZXAscXAseHAsbGV2ZWwsYWdlLHJhc3NlLGdpbGRlLHdpemxldmVsLGhhcmRjb3JlIGZyb20gdG9wbGlzdGUgIgorICAgICAgICAiV0hFUkUgZ2lsZGU9PzEgQU5EIHdpemxldmVsPTEgIgorICAgICAgICAiT1JERVIgQlkgIitzb3J0KyIgREVTQyBMSU1JVCAiK2xpbWl0KyI7IiwKKyAgICAgICAgZ2lsZGUpOworICByZXR1cm4gc2xfZXhlYygKKyAgICAgICJzZWxlY3QgbmFtZSxsZXAscXAseHAsbGV2ZWwsYWdlLHJhc3NlLGdpbGRlLHdpemxldmVsLGhhcmRjb3JlIGZyb20gdG9wbGlzdGUgIgorICAgICAgIldIRVJFIHdpemxldmVsPTEgIgorICAgICAgIk9SREVSIEJZICIrc29ydCsiIERFU0MgTElNSVQgIitsaW1pdCsiOyIpOworfQorCitwdWJsaWMgdmFyYXJncyA8IDxzdHJpbmd8aW50PiogPiogSGFyZGNvcmVMaXN0ZShzdHJpbmcgcmFzc2UsIHN0cmluZyBnaWxkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGltaXQsIHN0cmluZyBzb3J0KQoreworICAvLyBEZWZhdWx0czoKKyAgc29ydCB8fD0gImxlcCI7CisgIGlmICghbGltaXQgfHwgbGltaXQgPiAxMDApCisgICAgbGltaXQ9MTAwOworICBlbHNlIGlmIChsaW1pdCA8IDEpCisgICAgbGltaXQ9MTsKKyAgaWYgKHJhc3NlICYmIGdpbGRlKQorICAgIHJldHVybiBzbF9leGVjKAorICAgICAgICAic2VsZWN0IG5hbWUsbGVwLHFwLHhwLGxldmVsLGFnZSxyYXNzZSxnaWxkZSx3aXpsZXZlbCxoYXJkY29yZSBmcm9tIHRvcGxpc3RlICIKKyAgICAgICAgIldIRVJFIHJhc3NlPT8xIEFORCBnaWxkZT0/MiBBTkQgaGFyZGNvcmU+MCAiCisgICAgICAgICJPUkRFUiBCWSAiK3NvcnQrIiBERVNDIExJTUlUICIrbGltaXQrIjsiLAorICAgICAgICByYXNzZSwgZ2lsZGUpOworICBlbHNlIGlmIChyYXNzZSkKKyAgICByZXR1cm4gc2xfZXhlYygKKyAgICAgICAgInNlbGVjdCBuYW1lLGxlcCxxcCx4cCxsZXZlbCxhZ2UscmFzc2UsZ2lsZGUsd2l6bGV2ZWwsaGFyZGNvcmUgZnJvbSB0b3BsaXN0ZSAiCisgICAgICAgICJXSEVSRSByYXNzZT0/MSBBTkQgaGFyZGNvcmU+MCAiCisgICAgICAgICJPUkRFUiBCWSAiK3NvcnQrIiBERVNDIExJTUlUICIrbGltaXQrIjsiLAorICAgICAgICByYXNzZSk7CisgIGVsc2UgaWYgKGdpbGRlKQorICAgIHJldHVybiBzbF9leGVjKAorICAgICAgICAic2VsZWN0IG5hbWUsbGVwLHFwLHhwLGxldmVsLGFnZSxyYXNzZSxnaWxkZSx3aXpsZXZlbCxoYXJkY29yZSBmcm9tIHRvcGxpc3RlICIKKyAgICAgICAgIldIRVJFIGdpbGRlPT8xIEFORCBoYXJkY29yZT4wICIKKyAgICAgICAgIk9SREVSIEJZICIrc29ydCsiIERFU0MgTElNSVQgIitsaW1pdCsiOyIsCisgICAgICAgIGdpbGRlKTsKKyAgcmV0dXJuIHNsX2V4ZWMoCisgICAgICAic2VsZWN0IG5hbWUsbGVwLHFwLHhwLGxldmVsLGFnZSxyYXNzZSxnaWxkZSx3aXpsZXZlbCxoYXJkY29yZSBmcm9tIHRvcGxpc3RlICIKKyAgICAgICJXSEVSRSBoYXJkY29yZT4wICIKKyAgICAgICJPUkRFUiBCWSAiK3NvcnQrIiBERVNDIExJTUlUICIrbGltaXQrIjsiKTsKK30KKwordmFyYXJncyBpbnQgcmVtb3ZlKGludCBzaWxlbnQpCit7CisgIEVWRU5URC0+VW5yZWdpc3RlckV2ZW50KEVWVF9MSUJfTE9HSU4sIHRoaXNfb2JqZWN0KCkpOworICBzbF9jbG9zZSgpOworICBkZXN0cnVjdChNRSk7CisgIHJldHVybiAxOworfQorCitwdWJsaWMgbWl4ZWQgc3FsX3F1ZXJ5KHN0cmluZyBxdWVyeSkKK3sKKyAgaWYgKEFSQ0hfU0VDVVJJVFkpCisgICAgcmV0dXJuIHNsX2V4ZWMocXVlcnkpOworICByZXR1cm4gMDsKK30KKwordm9pZCByZXNldCgpCit7CisgIC8vIEFsbGUgRWludHJhZWdlIGxvZXNjaGVuLCBkaWUgc2VpdCA5MCBuaWNodCBtZWhyIGFrdHVhbGlzaWVydCB3dXJkZW4uCisvLyAgc2xfZXhlYygiREVMRVRFIEZST00gdG9wbGlzdGUgV0hFUkUgbGFzdHVwZGF0ZTw/MTsiLAorLy8gICAgICAgICAgICAgICAgdGltZSgpLTkwKjI0KjM2MDApOworICBzbF9leGVjKCJERUxFVEUgRlJPTSB0b3BsaXN0ZSBXSEVSRSBuYW1lIElOIChTRUxFQ1QgbmFtZSBGUk9NIHRvcGxpc3RlICIKKyAgICAgICAgICAiT1JERVIgQlkgbGVwIERFU0MgTElNSVQgMTAwMCwgLTEpOyIpOworICBzZXRfbmV4dF9yZXNldCg4NjQwMCk7Cit9CisKZGlmZiAtLWdpdCBhL3NlY3VyZS91ZHAvY2hhbm5lbC5jIGIvc2VjdXJlL3VkcC9jaGFubmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU5MmZmZQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS91ZHAvY2hhbm5lbC5jCkBAIC0wLDAgKzEsMTEwIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gY2hhbm5lbC5jCisvLworLy8gJElkOiBjaGFubmVsLmMgOTE0MiAyMDE1LTAyLTA0IDIyOjE3OjI5WiBaZXNzdHJhICQKKworI2luY2x1ZGUgPHVkcC5oPgorCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGRhZW1vbi5oPgorCisjaWZkZWYgWkVCRURFRQoraW5oZXJpdCAiL3N5cy9mb3JtYXQiOworI2VuZGlmCisKKyNkZWZpbmUgQ09NTUFORCAgICAgICAgICAgICAgICAiY21kIgorI2RlZmluZSBDSEFOTkVMICAgICAgICAgICAgICAgICJjaGFubmVsIgorCitwcml2YXRlIG5vc2F2ZSBtaXhlZCBfbmFtZV87CisKK2ludCBmaWx0ZXJfbGlzdGVuZXJzKG9iamVjdCBvYiwgc3RyaW5nIGNoYW5uZWwpIHsKKyAgICByZXR1cm4gb2ItPlF1ZXJ5UHJvcChQX0lOVEVSTVVEKTsKK30KKworaW50IHVkcF9jaGFubmVsKG1hcHBpbmcgZGF0YSkgeworICBvYmplY3QgKmxpc3Q7CisgIHN0cmluZyBtc2c7CisgIGludCBpLCB0eXBlOworCisgIC8qIENvbXBhdGFiaWxpdHkgd2l0aCBvbGRlciBzeXN0ZW1zLiAqLworICBpZiAoIWRhdGFbQ0hBTk5FTF0pCisgICAgZGF0YVtDSEFOTkVMXSA9IGRhdGFbIkNIQU5ORUwiXTsKKyAgaWYgKCFkYXRhW0NPTU1BTkRdKQorICAgIGRhdGFbQ09NTUFORF0gPSBkYXRhWyJDTUQiXTsKKyAgaWYgKCFkYXRhW0RBVEFdKQorICAgIGRhdGFbREFUQV09IiI7CisKKyAgaWYgKCFzdHJpbmdwKGRhdGFbQ0hBTk5FTF0pIHx8ICFzaXplb2YoZGF0YVtDSEFOTkVMXSkKKyAgICAgIHx8ICFzdHJpbmdwKGRhdGFbREFUQV0pIHx8ICFzaXplb2YoZGF0YVtEQVRBXSkKKyAgICAgIHx8ICFzdHJpbmdwKGRhdGFbTkFNRV0pIHx8ICFzaXplb2YoZGF0YVtOQU1FXSkKKyAgICAgIHx8ICFzdHJpbmdwKGRhdGFbU0VOREVSXSkgfHwgIXNpemVvZihkYXRhW1NFTkRFUl0pKQorICAgIHJldHVybiAwOworCisgIGRhdGFbREFUQV09CisgICAgaW1wbG9kZShmaWx0ZXIoZXhwbG9kZShkYXRhW0RBVEFdLCAiIiksICMnPj0sICIgIiksICIiKTsvLycpKQorICBkYXRhW05BTUVdPQorICAgIGltcGxvZGUoZmlsdGVyKGV4cGxvZGUoZGF0YVtOQU1FXSwgIiIpLCAjJz49LCAiICIpLCAiIik7Ly8nKSkKKyAgc3dpdGNoKGRhdGFbQ09NTUFORF0pIHsKKyAgY2FzZSAibGlzdCI6CisgICAgLyogUmVxdWVzdCBmb3IgYSBsaXN0IG9mIHBlb3BsZSBsaXN0ZW5pbmcgdG8gYSBjZXJ0YWluIGNoYW5uZWwuICovCisgICAgbGlzdCA9IGZpbHRlcih1c2VycygpLCAiZmlsdGVyX2xpc3RlbmVycyIsCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX29iamVjdCgpLCBkYXRhW0NIQU5ORUxdKTsKKyAgICBpZiAoaSA9IHNpemVvZihsaXN0KSkgeworICAgICAgbXNnID0gIlsiICsgY2FwaXRhbGl6ZShkYXRhW0NIQU5ORUxdKSArICJAIiArCisgICAgICAgIExPQ0FMX05BTUUgKyAiXSBMaXN0ZW5pbmc6XG4iOworICAgICAgd2hpbGUoaS0tKQorICAgICAgICBtc2cgKz0KKyAgICAgICAgICAiICAgICIgKyBjYXBpdGFsaXplKGxpc3RbaV0tPnF1ZXJ5X3JlYWxfbmFtZSgpKSArICJcbiI7CisgICAgfQorICAgIGVsc2UKKyAgICAgIG1zZyA9ICJbIiArIGNhcGl0YWxpemUoZGF0YVtDSEFOTkVMXSkgKyAiQCIgKyBMT0NBTF9OQU1FIAorICAgICAgKyAiXSBOb2JvZHkgTGlzdGVuaW5nLlxuIjsKKyAgICBJTkVURC0+X3NlbmRfdWRwKGRhdGFbTkFNRV0sIChbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVRVUVTVDogUkVQTFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVDSVBJRU5UOiBkYXRhW1NFTkRFUl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUQ6IGRhdGFbSURdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEE6IG1zZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSk7CisgICAgcmV0dXJuIDE7CisgIGNhc2UgImVtb3RlIjogLyogQSBjaGFubmVsIGVtb3RlLiAqLworICAgICAgdHlwZSA9IE1TR19FTU9URTsKKyAgICAgIGJyZWFrOworICBkZWZhdWx0OiAvKiBBIHJlZ3VsYXIgY2hhbm5lbCBtZXNzYWdlLiAqLworICAgIHR5cGUgPSBNU0dfU0FZOworICAgIGJyZWFrOworICB9CisgIF9uYW1lXyA9IGNhcGl0YWxpemUoZGF0YVtTRU5ERVJdKSsiQCIrY2FwaXRhbGl6ZShkYXRhW05BTUVdKTsKKyAgQ0hNQVNURVItPnNlbmQoY2FwaXRhbGl6ZShkYXRhW0NIQU5ORUxdKSwgdGhpc19vYmplY3QoKSwgCisgICAgICAgICAgICAgICAgIGRhdGFbREFUQV0sIHR5cGUpOworICBfbmFtZV8gPSAwOworICByZXR1cm4gMTsKK30KKworc3RyaW5nIG5hbWUoKSB7IHJldHVybiBfbmFtZV8gfHwgIjxJbnRlcm11ZD4iOyB9CitzdHJpbmcgTmFtZSgpIHtyZXR1cm4gY2FwaXRhbGl6ZShfbmFtZV8gfHwgIjxJbnRlcm11ZD4iKTt9CisKK3ByaXZhdGUgdm9pZCBfc2VuZChzdHJpbmcgbXVkLCBtaXhlZCBkYXRhLCBtYXBwaW5nIHJlcXVlc3QpCit7CisgIGlmKG1lbWJlcihkYXRhW0hPU1RfQ09NTUFORFNdLCAiY2hhbm5lbCIpICE9IC0xIHx8CisgICAgIG1lbWJlcihkYXRhW0hPU1RfQ09NTUFORFNdLCAiKiIpICE9IC0xKQorICAgIElORVRELT5fc2VuZF91ZHAoZGF0YVtIT1NUX05BTUVdLCByZXF1ZXN0KTsKK30KKwordm9pZCBDaGFubmVsTWVzc2FnZShtaXhlZCBtKQoreworICBtYXBwaW5nIHJlcXVlc3Q7CisgIGlmKG1bMV0gPT0gdGhpc19vYmplY3QoKSkgcmV0dXJuOworICByZXF1ZXN0ID0gKFsKKyAgICAgICAgICAgICAgUkVRVUVTVCA6ICJjaGFubmVsIiwKKyAgICAgICAgICAgICAgU0VOREVSICA6IG1bMV0tPm5hbWUoKSB8fCBjYXBpdGFsaXplKGdldHVpZChtWzFdKSksCisgICAgICAgICAgICAgICJDSEFOTkVMIjogbG93ZXJfY2FzZShtWzBdKSwKKyAgICAgICAgICAgICAgREFUQSAgICA6IGltcGxvZGUob2xkX2V4cGxvZGUobVsyXSwgIlxuIiksICIgIildKTsKKyAgaWYobVszXSA9PSBNU0dfR0VNT1RFIHx8IG1bM10gPT0gTVNHX0VNT1RFKQorICB7IAorICAgIHJlcXVlc3RbIkVNT1RFIl0gPSAxOworICAgIHJlcXVlc3RbIkNNRCJdID0gImVtb3RlIjsKKyAgfQorICB3YWxrX21hcHBpbmcoSU5FVEQtPnF1ZXJ5KCJob3N0cyIpIC0gKFtsb3dlcl9jYXNlKE1VRE5BTUUpXSksIAorICAgICAgICAgICAgICAgIydfc2VuZC8qJyovLCByZXF1ZXN0KTsKK30KZGlmZiAtLWdpdCBhL3NlY3VyZS91ZHAvZmluZ2VyLmMgYi9zZWN1cmUvdWRwL2Zpbmdlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZDRjNGQKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvdWRwL2Zpbmdlci5jCkBAIC0wLDAgKzEsMzEgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBmaW5nZXIuYworLy8KKy8vICRJZDogZmluZ2VyLmMgNjA4MSAyMDA2LTEwLTIzIDE0OjEyOjM0WiBaZXNzdHJhICQKKworI2luY2x1ZGUgPHVkcC5oPgorCitzdHJpbmcgbGFzdF9maW5nZXI7CisKKyNpZmRlZiBaRUJFREVFCisjaW5jbHVkZSA8c3lzdGVtLmg+CisjZWxpZiAhZGVmaW5lZChJTkVURCkKKyNkZWZpbmUgSU5FVEQJIi9zZWN1cmUvaW5ldGQiCisjZW5kaWYKKwordm9pZCB1ZHBfZmluZ2VyKG1hcHBpbmcgZGF0YSkKK3sKKyAgbGFzdF9maW5nZXI9Y2FwaXRhbGl6ZSh0b19zdHJpbmcoZGF0YVtTRU5ERVJdKSkrIkAiK2RhdGFbTkFNRV07CisgIElORVRELT5fc2VuZF91ZHAoZGF0YVtOQU1FXSwgKFsKKwlSRVFVRVNUOiBSRVBMWSwKKwlSRUNJUElFTlQ6IGRhdGFbU0VOREVSXSwKKwlJRDogZGF0YVtJRF0sCisJREFUQTogIi9wL2RhZW1vbi9maW5nZXIiLT5maW5nZXJfc2luZ2xlKGRhdGFbREFUQV0pCisgICAgXSkgKTsKK30KKworc3RyaW5nIFF1ZXJ5TGFzdEZpbmdlcigpCit7CisgIHJldHVybiBsYXN0X2ZpbmdlcjsKK30KZGlmZiAtLWdpdCBhL3NlY3VyZS91ZHAvaHRtbHdoby5jIGIvc2VjdXJlL3VkcC9odG1sd2hvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDljZDg5OQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS91ZHAvaHRtbHdoby5jCkBAIC0wLDAgKzEsNTMgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBodG1sd2hvLmMKKy8vCisvLyAkSWQ6IGh0bWx3aG8uYyA4NzU1IDIwMTQtMDQtMjYgMTM6MTM6NDBaIFplc3N0cmEgJAorCisjcHJhZ21hIHdlYWtfdHlwZXMKKworI2luY2x1ZGUgPHVkcC5oPgorCisjZGVmaW5lIFRKKHgpIGlmIChmaW5kX3BsYXllcigiam9mIikpIHRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJqb2YiKSx4KQorCitzdHJpbmcgYWRqdXN0KHN0cmluZyBzdHIsaW50IHdpZCkKK3sKKyAgaW50IHcyOworCisgIHcyPXdpZC8yOworICB3aWQ9d2lkLXcyOworICByZXR1cm4gZXh0cmFjdCgiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsMCx3aWQtMSkrc3RyKworICAgIGV4dHJhY3QoIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsMCx3Mi0xKTsKK30KKwordWRwX2h0bWx3aG8oZGF0YSkKK3sKKyAgaW50IGksbnVtOworICBzdHJpbmcgKm1kYXRhOworICBzdHJpbmcgd2hvbGlzdGUsdG1wLHRtcDI7CisgCisgIG1kYXRhPSIvb2JqL3dlcmxpc3RlIi0+UXVlcnlXaG9MaXN0ZSgwLDAsMSk7CisgIG51bT1zaXplb2YobWRhdGEpOworICBmb3IgKGk9bnVtLTE7aT49MDtpLS0pCisgIHsKKyAgICB0bXA9bWRhdGFbaV1bMF0tPm5hbWUoKTsKKyAgICBpZiAodG1wJiZzaXplb2YodG1wKSkKKyAgICB7CisgICAgICB0bXAyPWV4cGxvZGUobWRhdGFbaV1bMV0sdG1wKTsKKyAgICAgIGlmIChzaXplb2YodG1wMik+MSkKKyAgICAgIHsKKyAgICAgICAgdG1wMlswXT0iPEEgSFJFRj1cIi9odGJpbi9tdWR3d3c/ZmluZ2VyPyIrZ2V0dWlkKG1kYXRhW2ldWzBdKSsiXCI+PGI+IjsKKyAgICAgICAgdG1wMlsxXT0iPC9iPjwvQT4iK3RtcDJbMV07CisgICAgICAgIG1kYXRhW2ldWzFdPWltcGxvZGUodG1wMix0bXApOworICAgICAgfQorICAgICAgbWRhdGFbaV09IiA8TEk+ICIrbWRhdGFbaV1bMV07CisgICAgfQorICB9CisgIHdob2xpc3RlPWltcGxvZGUobWRhdGEsIlxuIik7CisgIElORVRELT5fc2VuZF91ZHAoZGF0YVtOQU1FXSwgKFsKKwkJCQlSRVFVRVNUOiBSRVBMWSwKKwkJCQlSRUNJUElFTlQ6IGRhdGFbU0VOREVSXSwKKwkJCQlJRDogZGF0YVtJRF0sCisJCQkJREFUQTogd2hvbGlzdGUKKwkJCQldKSApOworfQpkaWZmIC0tZ2l0IGEvc2VjdXJlL3VkcC9sb2NhdGUuYyBiL3NlY3VyZS91ZHAvbG9jYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc5M2QwNQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS91ZHAvbG9jYXRlLmMKQEAgLTAsMCArMSwzMyBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGxvY2F0ZS5jCisvLworLy8gJElkOiBsb2NhdGUuYyA2MDgxIDIwMDYtMTAtMjMgMTQ6MTI6MzRaIFplc3N0cmEgJAorCisjaW5jbHVkZSA8dWRwLmg+CisKKyNkZWZpbmUgRk9VTkQJCSJmbmQiCisjZGVmaW5lIFVTRVIJCSJ1c2VyIgorI2RlZmluZSBWRVJCT1NFCQkidmJzIgorCit2b2lkIHVkcF9sb2NhdGUobWFwcGluZyBkYXRhKSB7CisgICAgbWFwcGluZyByZXQ7CisgICAgb2JqZWN0IG9iOworCisgICAgcmV0ID0gKFsKKwlSRVFVRVNUOiBSRVBMWSwKKwlSRUNJUElFTlQ6IGRhdGFbU0VOREVSXSwKKwlJRDogZGF0YVtJRF0sCisJVVNFUjogZGF0YVtVU0VSXSwKKwlWRVJCT1NFOiBkYXRhW1ZFUkJPU0VdLAorICAgIF0pOworICAgIGlmIChkYXRhW0RBVEFdICYmIChvYiA9IGZpbmRfcGxheWVyKGRhdGFbREFUQV0pKSAmJgorICAgIGludGVyYWN0aXZlKG9iKSAmJiAhb2ItPnF1ZXJ5X2ludmlzKCkpIHsKKwlyZXRbRk9VTkRdID0gMTsKKwlyZXRbREFUQV0gPSAibG9jYXRlQCIgKyBMT0NBTF9OQU1FICsgIjogIiArIG9iLT5zaG9ydCgpOworICAgIH0KKyAgICBlbHNlCisJcmV0W0RBVEFdID0gImxvY2F0ZUAiICsgTE9DQUxfTkFNRSArICI6IE5vIHN1Y2ggcGxheWVyOiAiICsKKwlkYXRhW0RBVEFdICsgIlxuIjsKKyAgICBJTkVURC0+X3NlbmRfdWRwKGRhdGFbTkFNRV0sIHJldCk7Cit9CmRpZmYgLS1naXQgYS9zZWN1cmUvdWRwL21haWwuYyBiL3NlY3VyZS91ZHAvbWFpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0Zjg2NTEKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvdWRwL21haWwuYwpAQCAtMCwwICsxLDY0IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gbWFpbC5jCisvLworLy8gJElkOiBtYWlsLmMgNjA4MSAyMDA2LTEwLTIzIDE0OjEyOjM0WiBaZXNzdHJhICQKKworLyoKKyAqIFZFUlNJT04gMS4wCisgKiB1ZHAgbW9kdWxlIGZvciB0aGUgVURQIE1BSUwgc3lzdGVtIChBdXRob3I6IEFsdmluQFN1c2hpKQorICogUmVxdWlyZXMgSU5FVEQgVjAuNjAgb3IgaGlnaGVyIChJTkVURCBBdXRob3I6IE5vc3RyYWRhbXVzQFplYmVkZWUpCisgKi8KKworI2luY2x1ZGUgPHVkcC5oPgorI2luY2x1ZGUgPHVkcF9tYWlsLmg+CisKKy8qCisjZGVmaW5lIERFQlVHKG1zZykgaWYgKGZpbmRfcGxheWVyKCJoYXRlIikpIHRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJoYXRlIiksbXNnKQorKi8KKyN1bmRlZiBERUJVRworI2RlZmluZSBERUJVRyh4KQorCit2b2lkIHVkcF9tYWlsKG1hcHBpbmcgZGF0YSkKK3sKKyAgREVCVUcoc3ByaW50ZigiVURQTUFJTCAlT1xuIixkYXRhKSk7CisgIGlmKCFtZW1iZXIoZGF0YSxSRUNJUElFTlQpIHx8ICFkYXRhW1JFQ0lQSUVOVF0pCisgICAgeworICAgICAgbG9nX2ZpbGUoIklORVREIiwiSW52YWxpZCB1ZHBfbWFpbCBwYWNrZXQuIE5vIFJlY2lwaWVudC5cbiIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZighTE9DQUxfTUFJTEVSLT5xdWVyeV9yZWNpcGllbnRfb2soZGF0YVtSRUNJUElFTlRdKSkKKyAgICB7CisgICAgICBJTkVURC0+X3NlbmRfdWRwKGRhdGFbTkFNRV0sIChbCisJICAgIFJFUVVFU1Q6IFJFUExZLAorCSAgICBSRUNJUElFTlQ6IGRhdGFbU0VOREVSXSwKKwkgICAgVURQTV9TVEFUVVM6IFVEUE1fU1RBVFVTX1VOS05PV05fUExBWUVSLAorCSAgICBVRFBNX1dSSVRFUjogZGF0YVtVRFBNX1dSSVRFUl0sCisJICAgIFVEUE1fU1BPT0xfTkFNRTogZGF0YVtVRFBNX1NQT09MX05BTUVdLAorCSAgICBJRDogZGF0YVtJRF0sCisJICAgIERBVEE6ICJSZWFzb246IFVua25vd24gcGxheWVyIFwiIitjYXBpdGFsaXplKGRhdGFbUkVDSVBJRU5UXSkrCisJCSJcIlxuXG5JTkNMVURFRCBNRVNTQUdFIEZPTExPV1MgOi1cblxuIisKKwkJIlN1YmplY3Q6ICIrZGF0YVtVRFBNX1NVQkpFQ1RdKyJcbiIrZGF0YVtEQVRBXQorICAgICAgXSkgKTsKKworICAgICAgcmV0dXJuOworICAgIH0KKworICBMT0NBTF9NQUlMRVItPmRlbGl2ZXJfbWFpbCgKKwlkYXRhW1JFQ0lQSUVOVF0sCQkJLyogVG8gKi8KKwlkYXRhW1VEUE1fV1JJVEVSXSsiQCIrZGF0YVtOQU1FXSwJLyogRnJvbSAqLworCWRhdGFbVURQTV9TVUJKRUNUXSwJCQkvKiBTdWJqICovCisJZGF0YVtEQVRBXQkJCQkvKiBNYWlsIEJvZHkgKi8KKyAgKTsKKworICBJTkVURC0+X3NlbmRfdWRwKGRhdGFbTkFNRV0sIChbCisJICAgIFJFUVVFU1Q6IFJFUExZLAorCSAgICBSRUNJUElFTlQ6IGRhdGFbU0VOREVSXSwKKwkgICAgVURQTV9TVEFUVVM6IFVEUE1fU1RBVFVTX0RFTElWRVJFRF9PSywKKwkgICAgVURQTV9XUklURVI6IGRhdGFbVURQTV9XUklURVJdLAorCSAgICBVRFBNX1NQT09MX05BTUU6IGRhdGFbVURQTV9TUE9PTF9OQU1FXSwKKwkgICAgSUQ6IGRhdGFbSURdLAorCSAgICBEQVRBOiBkYXRhW1JFQ0lQSUVOVF0KKyAgXSkgKTsKK30KZGlmZiAtLWdpdCBhL3NlY3VyZS91ZHAvbWFuLmMgYi9zZWN1cmUvdWRwL21hbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YzRiNTcKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvdWRwL21hbi5jCkBAIC0wLDAgKzEsOTggQEAKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjaW5jbHVkZSA8dWRwLmg+CisjaW5jbHVkZSA8ZGFlbW9uLmg+CisKKyNkZWZpbmUgTUFYX1JFQURfRklMRV9MRU4gNTAwMDAKKworLy8gVEVNUE9SQVJZCisKKyNpbmNsdWRlIDx1ZHBfbGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxsb2dnaW5nLmg+CisKKyNpZm5kZWYgTE9DQUxfTkFNRQorI2RlZmluZSBMT0NBTF9OQU1FICJNb3JnZW5HcmF1ZW4iCisjZW5kaWYKKworI2lmbmRlZiBJTkVURF9JTlZBTElEX0FDQ0VTUworI2RlZmluZSBJTkVURF9JTlZBTElEX0FDQ0VTUyBJTlRFUk1VRExPRygiSU5WQUxJRF9BQ0NFU1MiKQorI2VuZGlmCisKKyNpZm5kZWYgSU5WQUxJRF9BQ0NFU1MKKyNkZWZpbmUgSU5WQUxJRF9BQ0NFU1MoeCkgXAorICAgICAgICAgICBsb2dfZmlsZShJTkVURF9JTlZBTElEX0FDQ0VTUywgXAorICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKElORVREX0lOVl9BQ0NFU1NfTVNHICJUSTogJU8gUE86ICVPXG4iLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RpbWUoKVs0Li4xNV0sdGhpc19pbnRlcmFjdGl2ZSgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNfb2JqZWN0KCkpKQorI2VuZGlmCisKKworLy8gRU5EIFRFTVBPUkFSWQorCit2b2lkIHVkcF9tYW4obWFwcGluZyBkYXRhKQoreworICBtYXBwaW5nIHBhZ2VzOworICBpbnQgaW5kZXg7CisgIHN0cmluZyBtYW5wYWdlLHJldDsKKyAgc3RyaW5nfHN0cmluZyogdG1wOworCisgIGlmIChwcmV2aW91c19vYmplY3QoKSE9ZmluZF9vYmplY3QoSU5FVEQpKQorICB7CisgICAgSU5WQUxJRF9BQ0NFU1MoTWFuKTsKKyAgICByZXR1cm47CisgIH0KKworICBtYW5wYWdlPWRhdGFbREFUQV07CisgIHRtcD1leHBsb2RlKG1hbnBhZ2UsIi8iKTsKKyAgaWYgKHNpemVvZih0bXApPjEpCisgIHsKKyAgICBpZiAoZmlsZV9zaXplKE1BTkRfRE9DRElSK21hbnBhZ2UpPj0wKQorICAgICAgdG1wPSh7dG1wWzwxXSxtYW5wYWdlfSk7CisgICAgZWxzZQorICAgICAgdG1wPSh7fSk7CisgIH0KKyAgZWxzZQorICAgIHRtcD0oc3RyaW5nICopY2FsbF9vdGhlcihNQU5ELCJsb2NhdGUiLGRhdGFbREFUQV0sMCk7CisgIHBhZ2VzPShbXSk7CisgIGluZGV4PXNpemVvZih0bXApOworICB3aGlsZShpbmRleC0tKQorICB7CisgICAgaWYgKHRtcFsxXVswLi4xXSE9ImcuIikgcGFnZXNbdG1wW2luZGV4XV09dG1wW2luZGV4LTFdOworICAgIGluZGV4LS07CisgIH0KKyAgc3dpdGNoKHNpemVvZihwYWdlcykpCisgIHsKKyAgICBjYXNlIDA6CisgICAgICByZXQ9c3ByaW50ZihJTkVURF9OT19NQU5QQUdFLExPQ0FMX05BTUUsbWFucGFnZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICB0bXA9bV9pbmRpY2VzKHBhZ2VzKVswXTsKKyAgICAgIHJldD1zcHJpbnRmKElORVREX01BTlBBR0VfRk9VTkQsTE9DQUxfTkFNRSxwYWdlc1t0bXBdKTsKKyAgICAgIGluZGV4PTA7CisgICAgICB3aGlsZShtYW5wYWdlPXJlYWRfZmlsZShNQU5EX0RPQ0RJUit0bXAsaW5kZXgpKQorICAgICAgeworICAgICAgICByZXQrPW1hbnBhZ2U7CisgICAgICAgIGluZGV4Kz1NQVhfUkVBRF9GSUxFX0xFTjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXQ9c3ByaW50ZihJTkVURF9NQU5QQUdFUyxMT0NBTF9OQU1FLCIiLAorICAgICAgICAgICAgICAgICAgYnJlYWtfc3RyaW5nKGltcGxvZGUobV92YWx1ZXMocGFnZXMpLCIgIiksNzgpLCIiKTsKKyAgICAgIGJyZWFrOworICB9CisgIElORVRELT5fc2VuZF91ZHAoZGF0YVtOQU1FXSwKKyAgICAgICAgICAgICAgICAgICAgIChbCisgICAgICAgICAgICAgICAgICAgICAgIFJFUVVFU1Q6IFJFUExZLAorICAgICAgICAgICAgICAgICAgICAgICBSRUNJUElFTlQ6IGRhdGFbU0VOREVSXSwKKyAgICAgICAgICAgICAgICAgICAgICAgSUQ6IGRhdGFbSURdLAorICAgICAgICAgICAgICAgICAgICAgICBEQVRBOiByZXQKKyAgICAgICAgICAgICAgICAgICAgIF0pKTsKK30KKworc3RyaW5nIHNlbmRfcmVxdWVzdChzdHJpbmcgbXVkbmFtZSwgc3RyaW5nIHBhZ2VuYW1lKQoreworICByZXR1cm4gKElORVRELT5fc2VuZF91ZHAobXVkbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFtSRVFVRVNUOiAibWFuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRBOiBwYWdlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRU5ERVI6IGdldHVpZChwcmV2aW91c19vYmplY3QoKSldKSwxKXx8CisgICAgICAgICAgc3ByaW50ZihJTkVURF9NQU5fUkVRVUVTVEVELHBhZ2VuYW1lLG11ZG5hbWUpKTsKK30KZGlmZiAtLWdpdCBhL3NlY3VyZS91ZHAvcGluZy5jIGIvc2VjdXJlL3VkcC9waW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ4MzI5ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS91ZHAvcGluZy5jCkBAIC0wLDAgKzEsMjIgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBwaW5nLmMKKy8vCisvLyAkSWQ6IHBpbmcuYyA2MDgxIDIwMDYtMTAtMjMgMTQ6MTI6MzRaIFplc3N0cmEgJAorCisjaW5jbHVkZSA8dWRwLmg+CisKKyNpZmRlZiBaRUJFREVFCisjaW5jbHVkZSA8c3lzdGVtLmg+CisjZWxpZiAhZGVmaW5lZChJTkVURCkKKyNkZWZpbmUgSU5FVEQJIi9zZWN1cmUvaW5ldGQiCisjZW5kaWYKKwordm9pZCB1ZHBfcGluZyhtYXBwaW5nIGRhdGEpIHsKKyAgICBJTkVURC0+X3NlbmRfdWRwKGRhdGFbTkFNRV0sIChbCisJUkVRVUVTVDogUkVQTFksCisJUkVDSVBJRU5UOiBkYXRhW1NFTkRFUl0sCisJSUQ6IGRhdGFbSURdLAorCURBVEE6IExPQ0FMX05BTUUgKyAiIGlzIGFsaXZlLlxuIgorICAgIF0pICk7Cit9CmRpZmYgLS1naXQgYS9zZWN1cmUvdWRwL3F1ZXJ5LmMgYi9zZWN1cmUvdWRwL3F1ZXJ5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjliYzdjZAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS91ZHAvcXVlcnkuYwpAQCAtMCwwICsxLDg4IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gcXVlcnkuYworLy8KKy8vICRJZDogcXVlcnkuYyA3Mzk3IDIwMTAtMDEtMjYgMjE6NDg6MTFaIFplc3N0cmEgJAorCisjaW5jbHVkZSA8dWRwLmg+CisjaW5jbHVkZSA8dWRwX2xhbmd1YWdlLmg+CisjaW5jbHVkZSA8c3RyaW5ncy5oPgorCisjaWZkZWYgWkVCRURFRQorI2luY2x1ZGUgPHN5c3RlbS5oPgorI2VsaWYgIWRlZmluZWQoSU5FVEQpCisjZGVmaW5lIElORVREICAgICAgICAiL3NlY3VyZS9pbmV0ZCIKKyNlbmRpZgorCisvKiBNdWQgLyBBZG1pbiBlbWFpbCBhZGRyZXNzLiAqLworI2RlZmluZSBFTUFJTCAgICAgICAgIm11ZEBtZy5tdWQuZGUiCisKK3ZvaWQgdWRwX3F1ZXJ5KG1hcHBpbmcgZGF0YSkgeworICAgIG1hcHBpbmcgcmV0OworCisgICAgc3dpdGNoKGRhdGFbREFUQV0pIHsKKyAgICAgICAgY2FzZSAiY29tbWFuZHMiOgorICAgICAgICAgICAgcmV0ID0gSU5FVEQtPnF1ZXJ5KCJob3N0cyIpOworICAgICAgICAgICAgaWYgKHJldFtsb3dlcl9jYXNlKGRhdGFbTkFNRV0pXSkKKyAgICAgICAgICAgICAgICByZXQgPSAoWworICAgICAgICAgICAgICAgIERBVEE6IGltcGxvZGUocmV0W2xvd2VyX2Nhc2UoZGF0YVtOQU1FXSldW0xPQ0FMX0NPTU1BTkRTXSwgIjoiKQorICAgICAgICAgICAgICAgIF0pOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldCA9IChbIERBVEE6IGltcGxvZGUoSU5FVEQtPnF1ZXJ5KCJjb21tYW5kcyIpLCAiOiIpIF0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgImVtYWlsIjoKKyAgICAgICAgICAgIHJldCA9IChbIERBVEE6IEVNQUlMIF0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgImhvc3RzIjoKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIHRtcCA9ICIiOworICAgICAgZm9yZWFjaChzdHJpbmcgbXVkbmFtZSwgbWl4ZWQgZmllbGRzOiBJTkVURC0+cXVlcnkoImhvc3RzIikpIHsKKyAgICAgICAgdG1wICs9IGZpZWxkc1tIT1NUX05BTUVdICsgIjoiICsKKyAgICAgICAgICAgICBmaWVsZHNbSE9TVF9JUF0gKyAiOiIgKworICAgICAgICAgICAgIGZpZWxkc1tIT1NUX1VEUF9QT1JUXSArICI6IiArCisgICAgICAgICAgICAgaW1wbG9kZShmaWVsZHNbTE9DQUxfQ09NTUFORFNdLCAiLCIpICsgIjoiICsKKyAgICAgICAgICAgICBpbXBsb2RlKGZpZWxkc1tIT1NUX0NPTU1BTkRTXSwgIiwiKSArICJcbiI7CisgICAgICB9CisgICAgICAgICAgICByZXQgPSAoWyBEQVRBOiB0cmltKHRtcCxUUklNX1JJR0hULCAiXG4iKSBdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgImluZXRkIjoKKyAgICAgICAgICAgIHJldCA9IChbIERBVEE6IElORVREX1ZFUlNJT04gXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAibGlzdCI6CisgICAgICAgICAgICAvKiBMaXN0IG9mIHRoaW5nc3RoYXQgY2FuIGJlIHF1ZXJpZWQuICovCisgICAgICAgICAgICByZXQgPSAoWyBEQVRBOiAiY29tbWFuZHM6ZW1haWw6aG9zdHM6aW5ldGQ6bXVkX3BvcnQ6dGltZTp2ZXJzaW9uIiBdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICJtdWRfcG9ydCI6CisgICAgICAgICAgICByZXQgPSAoWyBEQVRBOiBxdWVyeV9tdWRfcG9ydCgpIF0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgInRpbWUiOgorICAgICAgICAgICAgcmV0ID0gKFsgREFUQTogdGltZSgpIF0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgInZlcnNpb24iOgorICAgICAgICAgICAgcmV0ID0gKFsgREFUQTogdmVyc2lvbigpIF0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvKiBKdXN0IGlnbm9yZSBpdCBmb3IgdGhlIHRpbWUgYmVpbmcuICovCisgICAgICAgICAgICByZXR1cm47CisgICAgfQorICAgIElORVRELT5fc2VuZF91ZHAoZGF0YVtOQU1FXSwgcmV0ICsgKFsKKyAgICAgICAgUkVRVUVTVDogUkVQTFksCisgICAgICAgIFJFQ0lQSUVOVDogZGF0YVtTRU5ERVJdLAorICAgICAgICBJRDogZGF0YVtJRF0sCisgICAgICAgICJRVUVSWSI6IGRhdGFbREFUQV0KKyAgICBdKSApOworfQorCitzdHJpbmcgc2VuZF9yZXF1ZXN0KHN0cmluZyBtdWRuYW1lLCBzdHJpbmcgcHJvcCkKK3sKKyAgaWYgKCFzdHJpbmdwKG11ZG5hbWUpIHx8ICFzdHJpbmdwKHByb3ApKQorICAgIHJldHVybiAwOworICAKKyAgcmV0dXJuIChJTkVURC0+X3NlbmRfdWRwKG11ZG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChbUkVRVUVTVDogInF1ZXJ5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRBOiBwcm9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTkRFUjogZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKV0pLDEpfHwKKyAgICAgICAgICBzcHJpbnRmKElORVREX1FVRVJZX1JFUVVFU1RFRCwgcHJvcCwgbXVkbmFtZSkpOworfQorCmRpZmYgLS1naXQgYS9zZWN1cmUvdWRwL3JlcGx5LmMgYi9zZWN1cmUvdWRwL3JlcGx5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYwNjYxYQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS91ZHAvcmVwbHkuYwpAQCAtMCwwICsxLDU0IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gcmVwbHkuYworLy8KKy8vICRJZDogcmVwbHkuYyx2IDEuMiAyMDAzLzA0LzA4IDA5OjI4OjE3IFJpa3VzIEV4cCAkCisKKyNpbmNsdWRlIDx1ZHAuaD4KKworI2lmbmRlZiBEQVRFCisjZGVmaW5lIERBVEUJY3RpbWUoKVs0Li4xNV0KKyNlbmRpZgorCit2b2lkIHVkcF9yZXBseShtYXBwaW5nIGRhdGEpCit7CisgIHN0cmluZyBlcnIscmVjcHQsc2VydjsKKyAgb2JqZWN0IG9iOworICAKKyAgCisgIGlmIChwb2ludGVycChkYXRhW1NZU1RFTV0pJiZtZW1iZXIoZGF0YVtTWVNURU1dLFRJTUVfT1VUKT4tMSkKKyAgeworICAgIGlmIChkYXRhW1NFTkRFUl0pCisgICAgeworICAgICAgaWYgKHN0cmluZ3AoZGF0YVtTRU5ERVJdKSYmKG9iPWZpbmRfcGxheWVyKGRhdGFbU0VOREVSXSkpKQorICAgICAgeworICAgICAgICBzd2l0Y2goZGF0YVtSRVFVRVNUXSkKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgInRlbGwiOiBzZXJ2PSJ0ZWlsZSBtaXQ6ICI7YnJlYWs7CisgICAgICAgICAgY2FzZSAid2hvIjogIHNlcnY9IndlcjogIjticmVhazsKKyAgICAgICAgICBkZWZhdWx0OiBzZXJ2PWRhdGFbUkVRVUVTVF0rIjogIjsgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdGVsbF9vYmplY3Qob2IsIGJyZWFrX3N0cmluZygiRGFzIE11ZCBcJyIgKyBkYXRhW05BTUVdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCcga29ubnRlIG5pY2h0IGVycmVpY2h0IHdlcmRlbi5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzgsc2VydikpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBpZiAob2JqZWN0cChvYiA9IGRhdGFbU0VOREVSXSl8fChvYiA9IGZpbmRfb2JqZWN0KGRhdGFbU0VOREVSXSkpKQorICAgICAgICAgIG9iLT51ZHBfcmVwbHkoZGF0YSk7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorICBpZiAoZGF0YVtSRUNJUElFTlRdKQorICB7CisgICAgaWYgKHN0cmluZ3AoZGF0YVtSRUNJUElFTlRdKSYmKG9iID0gZmluZF9wbGF5ZXIoZGF0YVtSRUNJUElFTlRdKSkpCisgICAgICB0ZWxsX29iamVjdChvYiwgIlxuIiArIGRhdGFbREFUQV0pOworICAgIGVsc2UgaWYgKG9iPWZpbmRfb2JqZWN0KGRhdGFbUkVDSVBJRU5UXSkpCisgICAgICBvYi0+dWRwX3JlcGx5KGRhdGEpOworICAgIHJldHVybjsKKyAgfQorICBpZiAoZGF0YVtSRVFVRVNUXT09InBpbmciKXJldHVybjsKKyAgaWYgKGRhdGFbREFUQV0pCisgICAgbG9nX2ZpbGUoSU5FVERfTE9HX0ZJTEUsIERBVEUgKyAiOiBBbnR3b3J0IHZvbiAiICsgZGF0YVtOQU1FXSArCisgICAgICAgICAgICAgIlxuIiArIGRhdGFbREFUQV0gKyAiXG4iKTsKKyAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvc2VjdXJlL3VkcC90ZWxsLmMgYi9zZWN1cmUvdWRwL3RlbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjFhYjYxCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3VkcC90ZWxsLmMKQEAgLTAsMCArMSwxMTggQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyB0ZWxsLmMKKy8vCisvLyAkSWQ6IHRlbGwuYyA4NzU1IDIwMTQtMDQtMjYgMTM6MTM6NDBaIFplc3N0cmEgJAorCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8dWRwLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCisjaWZkZWYgWkVCRURFRQorI2luY2x1ZGUgPHN5c3RlbS5oPgoraW5oZXJpdCAiL3N5cy9mb3JtYXQiOworI2VsaWYgIWRlZmluZWQoSU5FVEQpCisjZGVmaW5lIElORVREICIvc2VjdXJlL2luZXRkIgorI2VuZGlmCisKKwordm9pZCB1ZHBfdGVsbChtYXBwaW5nIGRhdGEpIHsKKyAgb2JqZWN0IG9iOworICBzdHJpbmcgbWVzc2FnZV9zdHJpbmcsIG1lc3NhZ2VfcHJlZml4LCBhd2F5OworICBpbnQgaSxyZTsKKyAgc3RyaW5nICptZXNzYWdlX2FycmF5OworCisgIGlmIChkYXRhW1JFQ0lQSUVOVF0gJiYKKyAgICAgICAob2IgPSBmaW5kX3BsYXllcihsb3dlcl9jYXNlKGRhdGFbUkVDSVBJRU5UXSkpKSAmJgorICAgICAgIGludGVyYWN0aXZlKG9iKSkgeworICAgIAorICAgIGlmICghc3RyaW5ncChkYXRhW1NFTkRFUl0pIHx8ICFzaXplb2YoZGF0YVtTRU5ERVJdKSkKKwlkYXRhW1NFTkRFUl09IjxVbmtub3duPiI7CisgICAgaWYgKCFzdHJpbmdwKGRhdGFbREFUQV0pIHx8ICFzaXplb2YoZGF0YVtEQVRBXSkpCisJZGF0YVtEQVRBXT0iPE5pY2h0cz4iOworICAgCisgICAgZGF0YVtTRU5ERVJdPQorICAgICAgaW1wbG9kZShmaWx0ZXIoZXhwbG9kZShkYXRhW1NFTkRFUl0sICIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICMnPj0sLyonKi8gIiAiKSwgIiIpOworICAgIGRhdGFbREFUQV09CisgICAgICBpbXBsb2RlKGZpbHRlcihleHBsb2RlKGRhdGFbREFUQV0sICIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICMnPj0sLyonKi8gIiAiKSwgIiIpOworICAgIG1lc3NhZ2VfcHJlZml4PWNhcGl0YWxpemUoZGF0YVtTRU5ERVJdKSsiQCIrZGF0YVtOQU1FXSsKKyAgICAgICAgICAgICAgICAgICAiIHRlaWx0IERpciBtaXQ6ICI7CisgICAgbWVzc2FnZV9zdHJpbmc9YnJlYWtfc3RyaW5nKGRhdGFbREFUQV0sNzgsbWVzc2FnZV9wcmVmaXgsMCk7CisKKyAgICAvKiBEaWUgQW56YWhsIGRlciBMZWVyemVpbGVuIGFtIEVuZGUgZWluZXMgdG0ncyBzY2hlaW50IG5pY2h0IGdlbm9ybXQgKi8KKyAgICB3aGlsZShtZXNzYWdlX3N0cmluZ1s8MV09PSdcbicpbWVzc2FnZV9zdHJpbmc9bWVzc2FnZV9zdHJpbmdbMC4uPDJdOworICAgIG1lc3NhZ2Vfc3RyaW5nICs9ICJcbiI7CisKKyAgICByZSA9IG9iLT5NZXNzYWdlKCJcbiIrbWVzc2FnZV9zdHJpbmcsIE1TR0ZMQUdfUlRFTEwpOworCisgICAgaWYgKCFvYi0+UXVlcnlQcm9wKFBfSU5WSVMpKXsKKyAgICAgIC8qIEVyc3QgdGVzdGVuLCBvYiBkaWUgTWVsZHVuZyB1ZWJlcmhhdXB0IGFuZ2Vrb21tZW4gaXN0ISAqLworICAgICAgaWYocmU9PU1FU1NBR0VfREVBRikKKyAgICAgICAgbWVzc2FnZV9zdHJpbmc9c3ByaW50ZigiJXNAIk1VRE5BTUUiIGlzdCBtb21lbnRhbiBsZWlkZXIgdGF1Yi5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQob2IpKSk7CisgICAgICBlbHNlIGlmKHJlPT1NRVNTQUdFX0lHTk9SRV9ZT1UpCisgICAgICAgIG1lc3NhZ2Vfc3RyaW5nPXNwcmludGYoIiVzQCJNVUROQU1FIiBpZ25vcmllcnQgRGljaC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQob2IpKSk7CisgICAgICBlbHNlIGlmKHJlPT1NRVNTQUdFX0lHTk9SRV9NVUQpCisgICAgICAgIG1lc3NhZ2Vfc3RyaW5nPXNwcmludGYoIiVzQCJNVUROQU1FIiBpZ25vcmllcnQgZGFzIE11ZCAnJXMnLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChvYikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbTkFNRV0pOworICAgICAgZWxzZSB7CisgICAgICAgIC8qIEVyc3QgZGFubiBkaWUgRXJmb2xncy1SdWVja21lbGR1bmcgYWJzY2hpY2tlbiAqLworICAgICAgICBtZXNzYWdlX3ByZWZpeD0iRHUgdGVpbHN0ICIrY2FwaXRhbGl6ZShkYXRhW1JFQ0lQSUVOVF0pICsgIkAiIAorICAgICAgICAgICAgICAgICAgICAgICBMT0NBTF9OQU1FICsgIiBtaXQ6ICI7CisgICAgICAgIG1lc3NhZ2Vfc3RyaW5nPWJyZWFrX3N0cmluZyhkYXRhW0RBVEFdLDc4LG1lc3NhZ2VfcHJlZml4LDApOworICAgICAgICBpZihvYi0+UXVlcnlQcm9wKFBfQVdBWSkpCisgICAgICAgICAgbWVzc2FnZV9zdHJpbmc9c3ByaW50ZigiJXMlc0AiTVVETkFNRSIgaXN0IGdlcmFkZSBuaWNodCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGE6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYi0+bmFtZShXRVIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ItPlF1ZXJ5UHJvcChQX0FXQVkpKTsKKyAgICAgICAgZWxzZSBpZiAoKGk9cXVlcnlfaWRsZShvYikpPj02MDApeyAvLyAxMCBNaW5zCisgICAgICAgICAgaWYgKGk8MzYwMCkgYXdheT10aW1lMnN0cmluZygiJW0gJU0iLGkpOworICAgICAgICAgIGVsc2UgYXdheT10aW1lMnN0cmluZygiJWggJUggdW5kICVtICVNIixpKTsKKyAgICAgICAgICBtZXNzYWdlX3N0cmluZz0KKyAgICAgICAgICAgICBzcHJpbnRmKCIlcyVzQCJNVUROQU1FIiBpc3Qgc2VpdCAlcyB2b2VsbGlnIHVudGFldGlnLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Vfc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgb2ItPk5hbWUoV0VSKSwKKyAgICAgICAgICAgICAgICAgICAgIGF3YXkpOworICAgICAgICB9CisgICAgICAgIHN3aXRjaChyZSkgeworICAgICAgICBjYXNlIE1FU1NBR0VfQ0FDSEU6CisgICAgICAgICAgbWVzc2FnZV9zdHJpbmcgKz0KKyAgICAgICAgICAgIHNwcmludGYoIiVzQCJNVUROQU1FIiBtb2VjaHRlIGdlcmFkZSBuaWNodCBnZXN0b2VydCB3ZXJkZW4uXG4iKworICAgICAgICAgICAgICAgICAgICAiRGllIE1pdHRlbHVuZyB3dXJkZSB2b24gZWluZW0ga2xlaW5lbiBLb2JvbGQgaW4gRW1wZmFuZyIrCisgICAgICAgICAgICAgICAgICAgICJnZW5vbW1lbi5cbkVyIHdpcmQgc2llIHNwYWV0ZXIgd2VpdGVybGVpdGVuLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQob2IpKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUVTU0FHRV9DQUNIRV9GVUxMOgorICAgICAgICAgIG1lc3NhZ2Vfc3RyaW5nICs9CisgICAgICAgICAgICBzcHJpbnRmKCIlc0AiTVVETkFNRSIgbW9lY2h0ZSBnZXJhZGUgbmljaHQgZ2VzdG9lcnQgd2VyZGVuLlxuIisKKyAgICAgICAgICAgICAgICAgICAgIkRpZSBNaXR0ZWlsdW5nIGdpbmcgdmVybG9yZW4sIGRlbm4gZGVyIEtvYm9sZCBrYW5uIHNpY2ggIisKKyAgICAgICAgICAgICAgICAgICAgIm5pY2h0cyBtZWhyIG1lcmtlbi5cbiIsCisgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKG9iKSkpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UgbWVzc2FnZV9zdHJpbmc9IlxuUm9vdEAiTVVETkFNRSI6IFNwaWVsZXIgIisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZGF0YVtSRUNJUElFTlRdKSsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgZmluZGUgaWNoIGluICJNVUROQU1FIiBuaWNodCFcbiI7CisgICAgSU5FVEQtPl9zZW5kX3VkcChkYXRhW05BTUVdLAorICAgICAgICAgICAgICAgICAgICAoWyBSRVFVRVNUOiBSRVBMWSwKKyAgICAgICAgICAgICAgICAgICAgICAgUkVDSVBJRU5UOiBkYXRhW1NFTkRFUl0sCisgICAgICAgICAgICAgICAgICAgICAgIElEOiBkYXRhW0lEXSwKKyAgICAgICAgICAgICAgICAgICAgICAgREFUQTogIlxuIittZXNzYWdlX3N0cmluZyBdKSApOworICB9CisgIGVsc2UKKyAgICBJTkVURC0+X3NlbmRfdWRwKGRhdGFbTkFNRV0sCisgICAgICAgICAgICAgICAgICAgIChbIFJFUVVFU1Q6IFJFUExZLAorICAgICAgICAgICAgICAgICAgICAgICBSRUNJUElFTlQ6IGRhdGFbU0VOREVSXSwKKyAgICAgICAgICAgICAgICAgICAgICAgSUQ6IGRhdGFbSURdLAorICAgICAgICAgICAgICAgICAgICAgICBEQVRBOiBzcHJpbnRmKCJSb290QCJNVUROQU1FIjogU3BpZWxlciAlcyBmaW5kZSAiKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpY2ggaW4gIk1VRE5BTUUiIG5pY2h0IVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGRhdGFbUkVDSVBJRU5UXSkpCisgICAgICAgICAgICAgICAgICAgIF0pICk7Cit9CmRpZmYgLS1naXQgYS9zZWN1cmUvdWRwL3doby5jIGIvc2VjdXJlL3VkcC93aG8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmU5YmIzCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3VkcC93aG8uYwpAQCAtMCwwICsxLDU4IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gd2hvLmMKKy8vCisvLyAkSWQ6IHdoby5jIDg3NTUgMjAxNC0wNC0yNiAxMzoxMzo0MFogWmVzc3RyYSAkCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDx1ZHAuaD4KKworaW50IGxhc3Q7CitpbnQgbWF4dG9kYXksIG1heGV2ZXI7CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgc3RyaW5nIHRtcDEsIHRtcDIsIGR1bW15OworCisgIGlmICh0aW1lKCktbGFzdDwxODAwKSByZXR1cm47CisgIGxhc3Q9dGltZSgpOworICB0bXAxPXJlYWRfZmlsZSgiL2V0Yy9tYXh1c2Vycy5ldmVyIiwwLDEpOworICB0bXAyPXJlYWRfZmlsZSgiL2V0Yy9tYXh1c2VycyIsMCwxKTsKKyAgaWYgKHN0cmluZ3AodG1wMSkmJnNpemVvZih0bXAxKSkgc3NjYW5mKHRtcDEsIiVkICVzIixtYXhldmVyLGR1bW15KTsKKyAgaWYgKHN0cmluZ3AodG1wMikmJnNpemVvZih0bXAyKSkgc3NjYW5mKHRtcDIsIiVkICVzIixtYXh0b2RheSxkdW1teSk7Cit9CisKK3N0cmluZyBhZGp1c3Qoc3RyaW5nIHN0cixpbnQgd2lkKSB7CisgIHJldHVybiBzcHJpbnRmKCIlKnxzIix3aWQsc3RyKTsKK30KKwordm9pZCB1ZHBfd2hvKG1hcHBpbmcgZGF0YSkKK3sKKyAgaW50IGk7CisgIHN0cmluZyAqbGluZXM7CisgIHN0cmluZyB3aG9saXN0ZSxoZWFkZXI7CisKKyAgY3JlYXRlKCk7CisgIGxpbmVzPSIvb2JqL3dlcmxpc3RlIi0+UXVlcnlXaG9MaXN0ZSgwLCAxKTsKKyAgd2hvbGlzdGU9aW1wbG9kZShsaW5lcywiXG4iKTsKKyAgbGluZXM9KHsKKyAgICAiKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoiLAorICAgICIiLCIiLCIiLCIiLAorICAgICIqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKiJ9KTsKKyAgaGVhZGVyPU1VRE5BTUUiLCBMRE11ZCAiK19fVkVSU0lPTl9fOworICBsaW5lc1sxXT0ifCIrYWRqdXN0KGhlYWRlcixzaXplb2YobGluZXNbMF0pLTIpKyJ8IjsKKyAgaGVhZGVyPSJBZHJlc3NlOiBNRy5NdWQuREUgKDg3Ljc5LjI0LjYwKSAyMyAoYWx0ZXJuYXRpdiA0NzExKSI7CisgIGxpbmVzWzJdPSJ8IithZGp1c3QoaGVhZGVyLHNpemVvZihsaW5lc1swXSktMikrInwiOworICBoZWFkZXI9IlVwdGltZTogIit1cHRpbWUoKTsKKyAgbGluZXNbM109InwiK2FkanVzdChoZWFkZXIsc2l6ZW9mKGxpbmVzWzBdKS0yKSsifCI7CisgIGhlYWRlcj1fTVVETElCX05BTUVfIi1NdWRsaWIgIl9NVURMSUJfVkVSU0lPTl87CisgIGxpbmVzWzRdPSJ8IithZGp1c3QoaGVhZGVyLHNpemVvZihsaW5lc1swXSktMikrInwiOworICBoZWFkZXI9aW1wbG9kZShsaW5lcywiXG4iKTsKKyAgd2hvbGlzdGU9aGVhZGVyKyJcbiIrd2hvbGlzdGUrc3ByaW50ZigiXG4qKiogQW53ZXNlbmRlIGltICJNVUROQU1FIjogTWF4LiBoZXV0ZSAlZCwgUmVrb3JkICVkXG4iLG1heHRvZGF5LG1heGV2ZXIpOworICBJTkVURC0+X3NlbmRfdWRwKGRhdGFbTkFNRV0sIChbCisJCQkJUkVRVUVTVDogUkVQTFksCisJCQkJUkVDSVBJRU5UOiBkYXRhW1NFTkRFUl0sCisJCQkJSUQ6IGRhdGFbSURdLAorCQkJCURBVEE6IHdob2xpc3RlCisJCQkJXSkgKTsKK30KZGlmZiAtLWdpdCBhL3NlY3VyZS91ZHAvd3d3LmMgYi9zZWN1cmUvdWRwL3d3dy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZDRmZmMKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvdWRwL3d3dy5jCkBAIC0wLDAgKzEsMTMwIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gd3d3LmMgLS0gV1dXIEd1ZXN0IENsaWVudAorLy8KKy8vICRJZDogd3d3LmMgODc1NSAyMDE0LTA0LTI2IDEzOjEzOjQwWiBaZXNzdHJhICQKKworI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgY29tYmluZV9zdHJpbmdzCisKKyNpZmRlZiBNT1JHRU5HUkFVRU4KKyMgaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDx1ZHAuaD4KKyNpbmNsdWRlIDx3d3cuaD4KKworI3VuZGVmIERFQlVHIAorCitwcml2YXRlIG1peGVkIHBlbmRpbmc7IC8vIHBlbmRpbmcgdWRwIHJlcXVlc3RzCisKKy8vIEhUTUx1bmVzY2FwZSAtLSB0cnkgdG8gcmVzb2x2ZSAlPGhleD4gZXNjYXBlIGNvZGVzIGZyb20gSFRNTC9XV1cKK3ByaXZhdGUgc3RyaW5nIEhUTUx1bmVzY2FwZShzdHJpbmcgY2hhcikKK3sKKyAgaW50IGxlbjsKKyAgaWYoIWNoYXIgfHwgIShsZW4gPSBzaXplb2YoY2hhcikpKSByZXR1cm4gIiI7CisgIGlmKGNoYXJbMF0gPT0gJyUnICYmIGxlbiA9IDMpIHsKKyAgICBpbnQgdmFsLCBjaDsKKyAgICB3aGlsZSgtLWxlbikgeworICAgICAgc3dpdGNoKGNoYXJbbGVuXSkgeworICAgICAgY2FzZSAnMCcuLic5JzoKKyAgICAgICAgdmFsID0gKGludCljaGFyW2xlbi4ubGVuXTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdBJy4uJ0YnOgorICAgICAgICB2YWwgPSBjaGFyW2xlbl0tNTU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYobGVuIDwgMikgdmFsIDw8PSA0OworICAgICAgY2ggKz0gdmFsOworICAgIH0KKyAgICByZXR1cm4gc3ByaW50ZigiJWMiLCBjaCk7CisgIH0KKyAgcmV0dXJuIGNoYXI7Cit9CisKK3ByaXZhdGUgc3RyaW5nIHRyYW5zbGF0ZShzdHJpbmcgc3RyKQoreworICByZXR1cm4gaW1wbG9kZShtYXAocmVnZXhwbG9kZShzdHIsICJbJV0uLiIpLCAjJ0hUTUx1bmVzY2FwZS8qJyovKSwgIiIpOworfQorCisvLyBkZWNvZGUoKSAtLSBkZWNvZGUgdGhlIGlucHV0IGNtZHMgc3RyaW5nCitwcml2YXRlIG1hcHBpbmcgZGVjb2RlKHN0cmluZyBpbnB1dCkKK3sKKyAgbWl4ZWQgdG1wOyBpbnQgaTsKKyAgbWFwcGluZyBjbWRzOworICBjbWRzID0gKFtdKTsKKyAgaSA9IHNpemVvZih0bXAgPSBvbGRfZXhwbG9kZSh0cmFuc2xhdGUoaW5wdXQpLCAiJiIpKTsKKyAgd2hpbGUoaS0tKQorICB7CisgICAgaWYoc2l6ZW9mKHRtcFtpXSA9IG9sZF9leHBsb2RlKHRtcFtpXSwgIj0iKSkgPT0gMikKKyAgICAgIGNtZHNbdG1wW2ldWzBdXSA9IHRtcFtpXVsxXTsKKyAgfQorICByZXR1cm4gY21kczsKK30KKworLy8gcHV0KCkgLS0gcHV0IHRvZ2V0aGVyIGEga2V5IGFuZCBhIHZhbHVlCitwcml2YXRlIHN0cmluZyBwdXQoc3RyaW5nIGtleSwgbWFwcGluZyB2YWwpCit7CisgIHJldHVybiBrZXkrIj0iK3ZhbFtrZXldOworfQorLy8gZW5jb2RlKCkgLS0gZW5jb2RlIHRoZSBpbnB1dCBjbWRzIHN0cmluZworcHJpdmF0ZSBzdHJpbmcgZW5jb2RlKG1hcHBpbmcgaW5wdXQpCit7IHJldHVybiBpbXBsb2RlKG1hcChtX2luZGljZXMoaW5wdXQpLCAjJ3B1dC8qJyovLCBpbnB1dCksICImIik7IH0KKwordm9pZCBTZW5kKG1hcHBpbmcgZGF0YSwgc3RyaW5nIHRleHQsIG1peGVkIGJhY2spCit7CisgIGlmKHN0cnN0cigoc3RyaW5nKXByZXZpb3VzX29iamVjdCgpLCBVRFBQQVRIKyIvIikpIHJldHVybjsKKyAgaWYoIWRhdGEgJiYgIXBlbmRpbmcpIHJldHVybjsKKyAgZWxzZSBpZighZGF0YSAmJiBwZW5kaW5nKQorICB7CisgICAgZGF0YSA9IHBlbmRpbmdbMF07IGJhY2sgPSBwZW5kaW5nWzFdOyBwZW5kaW5nID0gMDsKKyAgfQorICBJTkVURC0+X3NlbmRfdWRwKGRhdGFbTkFNRV0sIChbCisgICAgICBSRVFVRVNUOiBSRVBMWSwKKyAgICAgIFJFQ0lQSUVOVDogZGF0YVtTRU5ERVJdLAorICAgICAgSUQ6IGRhdGFbSURdLAorICAgICAgIlVSTCI6ZGF0YVtEQVRBXSwKKyAgICAgIERBVEE6ICJcblxuIit0ZXh0KyJcbiIKKyAgICAgIF0pKTsKK30KKworcHJpdmF0ZSBzdHJpbmcgZXhjaChzdHJpbmcgc3RyLCBtYXBwaW5nIHRvKQoreworICBpZighdG9bc3RyXSkgcmV0dXJuIHN0cjsKKyAgcmV0dXJuIHRvW3N0cl07Cit9CisKK3ByaXZhdGUgc3RyaW5nIHhjb2RlKHN0cmluZyBzdHIsIG1hcHBpbmcgdG8pCit7CisgIHJldHVybiBpbXBsb2RlKG1hcChyZWdleHBsb2RlKHN0ciwgaW1wbG9kZShtX2luZGljZXModG8pLCAifCIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICMnZXhjaC8qJyovLCB0byksICIiKTsKK30KKwordm9pZCB1ZHBfd3d3KG1hcHBpbmcgZGF0YSkKK3sKKyAgc3RyaW5nIHRleHQsIGVycm9yOworICBzdHJpbmcgYmFjazsgaW50IHNpemU7CisgIG1hcHBpbmcgY21kczsKKyAgZXJyb3IgPSBjYXRjaChzaXplID0gc2l6ZW9mKGNtZHMgPSBkZWNvZGUoZGF0YVtEQVRBXSkpKTsKKyAgaWYoY21kc1tCQUNLXSkgYmFjayA9IHhjb2RlKGNtZHNbQkFDS10sIChbIlhhbXBYIjoiJiIsICJYZXFYIjoiPSJdKSk7CisgIGNtZHNbQkFDS10gPSB4Y29kZShlbmNvZGUoY21kcy0oW0JBQ0tdKSksIChbIiYiOiJYYW1wWCIsICI9IjoiWGVxWCJdKSk7CisgIGlmKGVycm9yIHx8CisgICAgIGVycm9yPWNhdGNoKHRleHQ9KCIvIitvYmplY3RfbmFtZSh0aGlzX29iamVjdCgpKSsiLiIrY21kc1tSRVFdKS0+UmVxdWVzdChjbWRzKSkpCisgIHsKKyNpZmRlZiBERUJVRworICAgIHRleHQgPSAiPEgxPkZlaGxlcjogIitlcnJvcisiPC9IMT48SFI+PEgzPktvbnRleHQ6PC9IMz4iCisgICArICI8UFJFPiIrc3ByaW50ZigiJU8iLCBkYXRhKSsiPC9QUkU+IjsKKyNlbHNlCisgICAgdGV4dCA9ICI8SDE+RmVobGVyOiBBbmZyYWdlIGtvbm50ZSBuaWNodCBiZWFyYmVpdGV0IHdlcmRlbiE8L0gxPiI7CisjZW5kaWYKKyAgICBsb2dfZmlsZShXV1dMT0csICJFUlJPUjogIitlcnJvclswLi48Ml0rIiwgREFUQSBGT0xMT1dTOlxuIik7CisgIH0KKyAgbG9nX2ZpbGUoV1dXTE9HLCBzcHJpbnRmKCJbJXNdICVzXG4iLCBjdGltZSh0aW1lKCkpWzQuLjE1XSwgZGF0YVtEQVRBXSkpOworICBpZihjbWRzW1JFUV0gPT0gUl9JTlRFUk1VRCAmJiAhdGV4dCkKKyAgeworICAgIHBlbmRpbmcgPSAoe2RhdGEsIGJhY2t9KTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBwZW5kaW5nID0gMDsKKyAgZnVuY2FsbCgjJ1NlbmQsIGRhdGEsIHRleHQsIGJhY2spOworfQpkaWZmIC0tZ2l0IGEvc2VjdXJlL3VkcC93d3cuZmluZ2VyLmMgYi9zZWN1cmUvdWRwL3d3dy5maW5nZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmJjY2FmCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3VkcC93d3cuZmluZ2VyLmMKQEAgLTAsMCArMSw3MiBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHd3dy5maW5nZXIuYworLy8KKy8vICRJZDogd3d3LmZpbmdlci5jIDg3NTUgMjAxNC0wNC0yNiAxMzoxMzo0MFogWmVzc3RyYSAkCisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisjcHJhZ21hIGNvbWJpbmVfc3RyaW5ncworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHd3dy5oPgorI2luY2x1ZGUgPHJlZ2V4cC5oPgorCitzdHJpbmcgUmVxdWVzdChtYXBwaW5nIGNtZHMpCit7CisgIGlmKCFzaXplb2YoY21kcykgfHwgIXN0cmluZ3AoY21kc1tVU0VSXSkpCisgICAgcmV0dXJuIEVSUk9SKCJLZWluIE51dHplciBhbmdlZ2ViZW4hIik7CisgIC8qCisgICAqIEthbm4gamEgc2VpbiwgZGFzcyBlaW4gU3BpZWxlciBhdWYgZGllIElkZWUga29tbXQsIEhUTUwtVGFncworICAgKiBpbiBzZWluZSBCZXNjaHJlaWJ1bmcgZWluenViYXVlbi4gVW5zZXJlIFNlaXRlIGlzdCBhYmVyIHNjaG9uCisgICAqIGludGVyYWt0aXYgZ2VudWcuIChBbm06IE51ciA8Lio+LVZvcmtvbW1uaXNzZSB6dSBlcnNldHplbiBudXR6dAorICAgKiBuaXgsIGRhIG1hbiBhdWNoIG1pdCBlaW56ZWxuZW4gWmVpY2hlbiBTY2hhZGVuIG1hY2hlbiBrYW5uLgorICAgKi8KKyAgc3RyaW5nIHJlc3VsdCA9IHJlZ3JlcGxhY2UoRklOR0VSKCItYSAiK2NtZHNbVVNFUl0pLCAiPCIsIlxcJmx0OyIsMSk7IAorICByZXN1bHQgPSByZWdyZXBsYWNlKHJlc3VsdCwgIj4iLCJcXCZndDsiLDEpOworICBzdHJpbmcgKnJlc2xpbmVzID0gZXhwbG9kZShyZXN1bHQsIlxuIik7CisgIC8qCisgICAqIEdydW5kIGRlcyBrb21tZW5kZW4gQ29kZWJsb2NrcyBpc3QgLCBkYXNzIG1hbmNoZSBTcGllbGVyIGlocmUKKyAgICogSG9tZXBhZ2UgbWl0ICJodHRwOi8vbWcubXVkLmRlIiBhbmdlYmVuLCBhbmRlcmUgbnVyIm1nLm11ZC5kZSIgCisgICAqIHNjaHJlaWJlbi4gRGFtaXQgYWJlciBkZXIgQnJvd3NlciBkZW4gTGluayBhbHMgYWJzb2x1dCBpbnRlcnByZXRpZXJ0LCAKKyAgICogbXVzcyBkYXMgaHR0cDovLyBkYXZvciBzdGVoZW4sIHVuZCB6d2FyIG51ciBlaW5tYWwuIAorICAgKi8KKyAgc3RyaW5nICp0bXAgPSByZWdleHAocmVzbGluZXMsIl5Ib21lcGFnZToiKTsKKyAgaWYgKHNpemVvZih0bXApJiZzdHJpbmdwKHRtcFswXSkmJnNpemVvZih0bXBbMF0pPjE2KSB7CisJICBzdHJpbmcgdG1wMjsKKyAgICBzdHJpbmcgcXVvdGVkID0gcmVncmVwbGFjZSh0bXBbMF0sIihbW1xcXSsqPy5cXFxcXSkiLCJcXFxcXFwxIiwgMSk7CisgICAgaWYgKHRtcFswXVsxMC4uMTZdPT0iaHR0cDovLyIpCisgICAgICB0bXAyPXNwcmludGYoIkhvbWVwYWdlOiA8QSBIUkVGPVwiJXNcIj4lczwvQT4iLAorCQkgICAgICB0bXBbMF1bMTAuLl0sdG1wWzBdWzEwLi5dKTsKKyAgICBlbHNlCisgICAgICB0bXAyPXNwcmludGYoIkhvbWVwYWdlOiA8QSBIUkVGPVwiaHR0cDovLyVzXCI+JXM8L0E+IiwKKwkJICAgICAgdG1wWzBdWzEwLi5dLHRtcFswXVsxMC4uXSk7CisgICAgcmVzdWx0ID0gcmVncmVwbGFjZShyZXN1bHQscXVvdGVkLHRtcDIsMSk7CisgIH0KKyAgdG1wID0gcmVnZXhwKHJlc2xpbmVzLCJeQXZhdGFyLVVSSToiKTsKKyAgaWYgKHNpemVvZih0bXApKSB7CisgICAgIHJlc3VsdCA9IHJlZ3JlcGxhY2UocmVzdWx0LAorICAgICAgICAgICAgICJBdmF0YXItVVJJOiAoW15cbl0qKSIsCisgICAgICAgICAgICAgIkF2YXRhci1VUkk6IDxhIGhyZWY9XFwxPlxcMTwvYT4iLDEpOyAKKyAgICBpZiAoc2l6ZW9mKHJlZ2V4cCgoe3RtcFswXX0pLCJodHRwW3NdezAsMX06Ly8iLFJFX1BDUkUpKSkgeworICAgICAgc3RyaW5nIHVyaSA9IHJlZ3JlcGxhY2UodG1wWzBdLCAiQXZhdGFyLVVSSTogKFteXG5dKikiLCAiXFwxIiwxKTsKKyAgICAgIHJlc3VsdCA9ICI8aW1nIHNyYz1cIiIrdXJpKyJcIiBoZWlnaHQ9MTUwIGFsdD1cIiIgKyBjYXBpdGFsaXplKGNtZHNbVVNFUl0pCisgICAgICAgICAgICAgICArICJcIiAvPjxicj4iCisgICAgICAgICAgICAgICArIHJlc3VsdDsKKyAgICB9CisgIH0KKworICByZXN1bHQgPSByZWdyZXBsYWNlKHJlc3VsdCwKKwkJICAgICAgIkUtTWFpbC1BZHJlc3NlOiAoW15cbl0qKSIsCisJCSAgICAgICJFLU1haWwtQWRyZXNzZTogQml0dGUgbmFjaGZyYWdlbi4uLiIsMSk7CisKKyAgcmVzdWx0ID0gcmVncmVwbGFjZShyZXN1bHQsCisJCSAgICAgICJNZXNzZW5nZXI6IChbXlxuXSopIiwKKwkJICAgICAgIk1lc3NlbmdlcjogQml0dGUgbmFjaGZyYWdlbi4uLiIsIDEpOworCisgIHJlc3VsdCA9IHJlZ3JlcGxhY2UocmVzdWx0LAorCQkgICAgICAiSUNROiAoW15cbl0qKSIsCisJCSAgICAgICJJQ1E6IEJpdHRlIG5hY2hmcmFnZW4uLi4iLCAxKTsKKworICByZXR1cm4gIjxIMj5XZXIgaXN0ICIrY2FwaXRhbGl6ZShjbWRzW1VTRVJdKSsiPzwvSDI+PEhSPiIKKyAgICArIjxQUkU+IityZXN1bHQrIjwvUFJFPiI7Cit9CmRpZmYgLS1naXQgYS9zZWN1cmUvdWRwL3d3dy5uZXdzLmMgYi9zZWN1cmUvdWRwL3d3dy5uZXdzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UwNjhkYgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS91ZHAvd3d3Lm5ld3MuYwpAQCAtMCwwICsxLDIxNCBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHd3dy5uZXdzLmMgLS0gV1dXIGZyb250ZW5kIGZvciByZWFkaW5nIG11ZCBuZXdzCisvLworLy8gJElkOiB3d3cubmV3cy5jIDg3NTUgMjAxNC0wNC0yNiAxMzoxMzo0MFogWmVzc3RyYSAkCisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisjcHJhZ21hIGNvbWJpbmVfc3RyaW5ncworCisjaW5jbHVkZSA8d3d3Lmg+CisKKyNkZWZpbmUgREJHKHgpICB0ZWxsX29iamVjdChmaW5kX3BsYXllcigiaGF0ZSIpLCBzcHJpbnRmKCJEQkc6ICVPXG4iLCB4KSkKKworI2RlZmluZSBORVdTRCAiL3NlY3VyZS9uZXdzIgorCisjZGVmaW5lIE5fR1JPVVAgMAorI2RlZmluZSBOX0FVVEhPUiAxCisjZGVmaW5lIE5fVElEIDIKKyNkZWZpbmUgTl9EQVRFIDMKKyNkZWZpbmUgTl9USVRMRSA0CisjZGVmaW5lIE5fQVJUSUNMRSA1CisKK3ZhcmFyZ3MgcHJpdmF0ZSBzdHJpbmcgdXJsKHN0cmluZyBncm91cCwgc3RyaW5nIGFydGljbGUpCit7CisgIHJldHVybiAiXCIiK01VRFdXVysiPyIrUkVRKyI9IitSX05FV1MKKyAgICArKGdyb3VwPyImIitHUk9VUCsiPSIrZ3JvdXA6IiIpCisgICAgKyhhcnRpY2xlPyImIitBUlRJQ0xFKyI9IithcnRpY2xlOiIiKSsiXCIiOworfQorCit2YXJhcmdzIHByaXZhdGUgc3RyaW5nIG1ha2VfbGluayhzdHJpbmcgdGV4dCwgc3RyaW5nIGdyb3VwLCBzdHJpbmcgYXJ0aWNsZSkKK3sKKyAgaWYoIXRleHQgfHwgIXNpemVvZih0ZXh0KSkgdGV4dCA9ICItVW5iZW5hbm50LSI7CisgIHJldHVybiAiPEEgSFJFRj0iK3VybChncm91cCwgYXJ0aWNsZSkrIj4iK3RleHQrIjwvQT4iOworfQorCitzdHJpbmcgR3JvdXBMaXN0KCkKK3sKKyAgc3RyaW5nICpsaXN0LCByZXQ7CisgIGludCBpLCB0OworCisgIGxpc3QgPSBORVdTRC0+R2V0R3JvdXBzKCk7CisgIGZvciAoaSA9IDAsIHJldCA9ICIiOyBpIDwgc2l6ZW9mKGxpc3QpOyBpKyspCisgICAgcmV0ICs9IHNwcmludGYoIlslM2QgQXJ0aWtlbCwgJS02c10gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE5FV1NELT5HZXROb3RlcyhsaXN0W2ldKSksCisgICAgICAgICAgICAgICAgICAgZHRpbWUodCA9IE5FV1NELT5HZXROZXdzVGltZShsaXN0W2ldKSlbNS4uMTFdLAorICAgICAgICAgICAgICAgICAgIG1ha2VfbGluayhsaXN0W2ldLGxpc3RbaV0rIjoiK3QpKTsKKyAgcmV0dXJuICI8SDI+JlV1bWw7YmVyc2ljaHQ8L0gyPiIKKyAgICAgICAgKyI8SDM+WyIrc2l6ZW9mKGxpc3QpKyIgR3J1cHBlbiwgIgorICAgICAgICArImxldHp0ZSAmQXVtbDtuZGVydW5nICIrZHRpbWUoTkVXU0QtPkdldE5ld3NUaW1lKCkpKyJdPC9IMz4iCisgICAgICAgICsiPFBSRT4iICsgcmV0ICsiPC9QUkU+IjsKK30KKworI2RlZmluZSBUSFJFQUQoYSkgKCJ+IyEgcm49IisoYVtOX0FVVEhPUl0pKyIgcnQ9IisoYVtOX0RBVEVdKSsgXAorICAgICAgICAgICAgICAgICAgICIgcmc9IisoYVtOX0dST1VQXSkpCisjZGVmaW5lIFRFWFBSICJybj1bXlxuIF0qfHJ0PVteXG4gXSp8cmc9W15cbiBdKiIKKworcHJpdmF0ZSBtaXhlZCB0aW5mbyhtaXhlZCBhcnRpY2xlKQoreworICBtaXhlZCB0bXAsIGluZm87CisgIHN0cmluZyBybiwgcnQsIHJnLCB0aWQ7CisgIGludCBqLCBrOworCisgIHRtcCA9IHJlZ2V4cChvbGRfZXhwbG9kZShhcnRpY2xlW05fQVJUSUNMRV0sICJcbiIpLCAiXn4jISIpOworICBmb3IoaiA9IHNpemVvZih0bXApOyBqLS07KSB7CisgICAgbWl4ZWQgbGluZTsKKyAgICBsaW5lID0gb2xkX2V4cGxvZGUodG1wW2pdLCAiICIpOworICAgIGZvcihrID0gc2l6ZW9mKGxpbmUpOyBrLS07KSB7CisgICAgICBpZihsaW5lW2tdWzAuLjFdPT0icm4iKSBybiA9IGxpbmVba11bMy4uXTsKKyAgICAgIGlmKGxpbmVba11bMC4uMV09PSJydCIpIHJ0ID0gbGluZVtrXVszLi5dOworICAgICAgaWYobGluZVtrXVswLi4xXT09InJnIikgcmcgPSBsaW5lW2tdWzMuLl07CisgICAgICBpZihsaW5lW2tdWzAuLjJdPT0idGlkIikgdGlkID0gbGluZVtrXVs0Li5dOworICAgIH0KKyAgfQorICBpZighdGlkKSB0aWQgPSAiIithcnRpY2xlW05fREFURV07CisgIHJldHVybiAoeyBybiwgcnQsIHJnLCB0aWQgfSk7Cit9CisKKyNkZWZpbmUgUk4gIDAKKyNkZWZpbmUgUlQgIDEKKyNkZWZpbmUgUkcgIDIKKyNkZWZpbmUgVElEIDMKKworcHJpdmF0ZSBpbnQgdGhyZWFkKG1peGVkIGFydGljbGUsIGludCBpLCBtYXBwaW5nIHQpCit7CisgIG1peGVkIGluZm87CisgIGluZm8gPSB0aW5mbyhhcnRpY2xlKTsKKworICBpZihpbmZvW1RJRF0pIHsKKyAgICB0W2luZm9bVElEXV0rKzsKKyAgICB0W2luZm9bVElEXSwgMV0gPSBzcHJpbnRmKCIlMy4zZCBbJS0xMnMgJS02c10lLTNzICVzXG4iLAorICAgICAgICAgICAgaSsxLAorICAgICAgICAgICAgYXJ0aWNsZVtOX0FVVEhPUl0rIjoiLAorICAgICAgICAgICAgZHRpbWUoYXJ0aWNsZVtOX0RBVEVdKVs1Li4xMV0sCisgICAgICAgICAgICAodFtpbmZvW1RJRF1dIC0gMSkgPyAiKyIrKHRbaW5mb1tUSURdXS0xKSA6ICIgLSAiLAorICAgICAgICAgICAgbWFrZV9saW5rKGFydGljbGVbTl9USVRMRV0sCisgICAgICAgICAgYXJ0aWNsZVtOX0dST1VQXSwgdG9fc3RyaW5nKGkpKSkKKyAgICAgICsgKHRbaW5mb1tUSURdLCAxXSA/IHRbaW5mb1tUSURdLCAxXSA6ICIiKTsKKyAgICB0W2luZm9bVElEXSwgMl0gPSBpbmZvOworICAgIGlmKGFydGljbGVbTl9EQVRFXSA+IHRvX2ludCh0W2luZm9bVElEXSwgM10pKQorICAgICAgdFtpbmZvW1RJRF0sIDNdID0gIiIrYXJ0aWNsZVtOX0RBVEVdOworICAgIHJldHVybiAxOworICB9Cit9CisKK3ByaXZhdGUgaW50IGV4cGlyZWQobWl4ZWQgKmxpc3QsIGludCBpKQoreworICBtaXhlZCBpbmZvOworICBpbmZvID0gdGluZm8obGlzdFtpXSk7CisgIGZvcihpLS07IGkgPj0gMDsgaS0tKQorICAgIGlmKGxpc3RbaV1bTl9BVVRIT1JdID09IGluZm9bUk5dICYmCisgICAgICAgbGlzdFtpXVtOX0RBVEVdID09IHRvX2ludChpbmZvW1JUXSkpCisgICAgICByZXR1cm4gMDsKKyAgcmV0dXJuIDE7Cit9CisKK3N0cmluZyBBcnRpY2xlTGlzdChzdHJpbmcgZ3JvdXApCit7CisgIHN0cmluZyAqbGlzdCwgcmV0OworICBtYXBwaW5nIHQ7CisgIGludCBpOworCisgIGxpc3QgPSBORVdTRC0+R2V0Tm90ZXMoZ3JvdXAgPSBvbGRfZXhwbG9kZShncm91cCwgIjoiKVswXSk7CisgIGlmICghcG9pbnRlcnAobGlzdCkpIHsKKyAgcmV0dXJuICI8SDI+R3J1cHBlOiAiK2dyb3VwKyI8L0gyPiIKKyAgICAiPEgzPmV4aXN0aWVydCBuaWNodC48L0gzPiIKKyAgICAiWyIrbWFrZV9saW5rKCJHcnVwcGVuJnV1bWw7YmVyc2ljaHQiKSsiXSI7CisgIH0KKyAgdCA9IG1fYWxsb2NhdGUoMCw0KTsKKyAgZm9yIChpID0gc2l6ZW9mKGxpc3QpLTEsIHJldCA9ICIiOyBpID49IDA7IGktLSkKKyAgICBpZighdGhyZWFkKGxpc3RbaV0sIGksIHQpIHx8IGV4cGlyZWQobGlzdCwgaSkpCisgICAgeworICAgICAgaW50IHR0bXA7CisgICAgICBzdHJpbmcgdGlkOworICAgICAgbWl4ZWQgdHQ7IHR0ID0gdGluZm8obGlzdFtpXSk7CisgICAgICB0dG1wID0gdFt0aWQgPSB0dFtUSURdXSAtIDE7CisgICAgICByZXQgPSBzcHJpbnRmKCIlMy4zZCBbJS0xMnMgJS02c10lLTNzICVzXG4iLAorCQkgICAgaSsxLAorICAgICAgICAgICAgICAgICAgICBsaXN0W2ldW05fQVVUSE9SXSsiOiIsCisgICAgICAgICAgICAgICAgICAgIGR0aW1lKGxpc3RbaV1bTl9EQVRFXSlbNS4uMTFdLAorICAgICAgICAgICAgICAgICAgICB0dG1wID4gMCA/ICIrIit0dG1wIDogIiAtICIsCisgICAgICAgICAgICAgICAgICAgIG1ha2VfbGluaygoc3RyaW5nKWxpc3RbaV1bTl9USVRMRV0KKyAgICAgICAgICAgICsodHRtcCA+IDAgPworICAgICAgICAiICgiK2R0aW1lKHRvX2ludCh0W3RpZCwgM10pKVs1Li4xMV0KKyAgICAgICAgK2R0aW1lKHRvX2ludCh0W3RpZCwgM10pKVsxNy4uXSsiKSIgOiAiIiksCisgICAgICAgICAgICBncm91cCwgdG9fc3RyaW5nKGkpKyI6Iit0W3RpZCwgM10pKSArIHJldDsKKyAgICB9CisKKyAgcmV0dXJuICI8SDI+R3J1cHBlOiAiK2dyb3VwKyI8L0gyPiIKKyAgICArIjxIMz5bIitzaXplb2YobGlzdCkrIiBBcnRpa2VsLCAiCisgICAgKyJsZXR6dGUgJkF1bWw7bmRlcnVuZyAiK2R0aW1lKE5FV1NELT5HZXROZXdzVGltZShncm91cCkpKyJdPC9IMz4iCisgICAgKyI8UFJFPiIgKyByZXQgKyAiPC9QUkU+IgorICAgICsiWyIrbWFrZV9saW5rKCJHcnVwcGVuJnV1bWw7YmVyc2ljaHQiKSsiXSI7Cit9CisKK3ByaXZhdGUgdmFyYXJncyBzdHJpbmcgTWVzc2FnZShzdHJpbmcgZ3JvdXAsIG1peGVkIGFydGljbGUpCit7CisgIG1peGVkIHRleHQsIHRtcCwgdHRtcCwgbmV4dCwgcHJldiwgaW5mbzsKKyAgc3RyaW5nIGFydDsKKyAgbWFwcGluZyB0OworICBpbnQgaTsKKworICBpZiAoIWFydGljbGUpIGFydGljbGUgPSAwOworICBlbHNlIGFydGljbGUgPSB0b19pbnQob2xkX2V4cGxvZGUoYXJ0aWNsZSwgIjoiKVswXSk7CisKKyAgdG1wID0gTkVXU0QtPkdldE5vdGVzKGdyb3VwID0gb2xkX2V4cGxvZGUoZ3JvdXAsICI6IilbMF0pOworICBpZiAocG9pbnRlcnAodG1wKSAmJiAoYXJ0aWNsZSA+PSBzaXplb2YodG1wKSkpCisgICAgICByZXR1cm4oIkFydGlrZWwgbmljaHQgZ2VmdW5kZW4sIHNvdmllbGUgQXJ0aWtlbCBoYXQgZGllc2UgUnVicmlrICIKKwkgICJuaWNodCFcbiIpOworCisgIHRleHQgPSB0bXBbYXJ0aWNsZV07CisKKyAgdCA9IG1fYWxsb2NhdGUoMCw0KTsKKyAgZm9yKGkgPSBzaXplb2YodG1wKS0xOyBpID4gYXJ0aWNsZTsgaS0tKQorICAgIHRocmVhZCh0bXBbaV0sIGksIHQpOworICBuZXh0ID0gIk4mYXVtbDtjaHN0ZXIgQXJ0aWtlbCI7CisgIHByZXYgPSAiVm9yaWdlciBBcnRpa2VsIjsKKworICBhcnQgPSBpbXBsb2RlKCh0dG1wID0gb2xkX2V4cGxvZGUodGV4dFtOX0FSVElDTEVdLCAiXG4iKSkKKyAgICAgICAgICAgICAgICAtIHJlZ2V4cCh0dG1wLCAiXn4jISIpLCAiXG4iKTsKKworICBhcnQgPSByZWdyZXBsYWNlKGFydCwgIjwiLCAiXFwmbHQ7IiwgMSk7CisgIGFydCA9IHJlZ3JlcGxhY2UoYXJ0LCAiPiIsICJcXCZndDsiLCAxKTsKKyAgYXJ0ID0gcmVncmVwbGFjZShhcnQsICIoW2EtekEtWl1bYS16QS1aXSo6Ly9bXiBcblx0XVteIFxuXHRdKikiLCAiPGEgaHJlZj1cIlxcMVwiPlxcMTwvYT4iLCAxKTsKKworICBpbmZvID0gdGluZm8odGV4dCk7CisKKyAgcmV0dXJuICI8SDE+IiArIHRleHRbTl9USVRMRV0gKyAiPC9IMT48SFI+XG4iCisgICAgICAgKyAiPEgzPiIgKyBncm91cCArICI6ICIgKyB0ZXh0W05fQVVUSE9SXQorICAgICAgICsgIiAoQXJ0aWtlbCAiICsgKGFydGljbGUgKyAxKSArICIsICIgKyBkdGltZSh0ZXh0W05fREFURV0pICsgIilcbjwvSDM+IgorICAgICAgICsgKGluZm9bUk5dID8gKCI8SDQ+QW50d29ydCBhdWYgIitpbmZvW1JOXSsKKyAgICAgICAgICAoZXhwaXJlZCh0bXAsIGFydGljbGUpID8gIiAodmVyZmFsbGVuKSIgOiAiIikrIjwvSDQ+IikKKyAgICA6ICIiKQorICAgICAgICsgIjxQUkU+IiArIGFydCArICI8L1BSRT5cbiIKKyAgICAgICArICh0W2luZm9bVElEXV0gPworICAgICAgICAgICI8SFI+V2VpdGVyZSBBcnRpa2VsIHp1IGRpZXNlbSBUaGVtYToiCisgICsgIjxQUkU+IiArIHRbaW5mb1tUSURdLCAxXSArICI8L1BSRT48SFI+IiA6ICIiKQorICAgICAgICsgIiBbIisoYXJ0aWNsZSA8IHNpemVvZih0bXApLTEgPyBtYWtlX2xpbmsobmV4dCwgZ3JvdXAsdG9fc3RyaW5nKGFydGljbGUrMSkpIDoKKyAgICAgICAgICAgICAgbmV4dCkrIl0iCisgICAgICAgKyAiIFsiKyhhcnRpY2xlID8gbWFrZV9saW5rKHByZXYsIGdyb3VwLCB0b19zdHJpbmcoYXJ0aWNsZS0xKSkgOiBwcmV2KSsiXSIKKyAgICAgICArICIgWyIrbWFrZV9saW5rKCJBcnRpa2VsJnV1bWw7YmVyc2ljaHQiLCBncm91cCkrIl0iCisgICAgICAgKyAiIFsiK21ha2VfbGluaygiR3J1cHBlbiZ1dW1sO2JlcnNpY2h0IikrIl0iOworfQorCitzdHJpbmcgUmVxdWVzdChtYXBwaW5nIGNtZHMpCit7CisgIHN0cmluZyB0ZXh0OworICBpZighY21kc1tHUk9VUF0pIHRleHQgPSBHcm91cExpc3QoKTsKKyAgZWxzZQorICAgIGlmKCFjbWRzW0FSVElDTEVdKSB0ZXh0ID0gQXJ0aWNsZUxpc3QoY21kc1tHUk9VUF0pOworICAgIGVsc2UgdGV4dCA9IE1lc3NhZ2UoY21kc1tHUk9VUF0sIGNtZHNbQVJUSUNMRV0pOworCisgIHJldHVybiAiPEgyPiIrTVVETkFNRSsiIFplaXR1bmc8L0gyPjxIUj4iCisgICAgICAgICt0ZXh0OworfQpkaWZmIC0tZ2l0IGEvc2VjdXJlL3VkcC93d3cud2hvLmMgYi9zZWN1cmUvdWRwL3d3dy53aG8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjQ2NTY5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3VkcC93d3cud2hvLmMKQEAgLTAsMCArMSw0MSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHd3dy53aG8uYworLy8KKy8vICRJZDogd3d3Lndoby5jIDg3NTUgMjAxNC0wNC0yNiAxMzoxMzo0MFogWmVzc3RyYSAkCisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisjcHJhZ21hIGNvbWJpbmVfc3RyaW5ncworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHd3dy5oPgorCitzdHJpbmcgTWFrZUxpbmsobWl4ZWQgZW50cnkpCit7CisgIHN0cmluZyBubTsKKyAgaW50IGlkeDsKKworICBlbnRyeVsxXSA9IHJlZ3JlcGxhY2UoZW50cnlbMV0sICI8IiwgIlxcJmx0OyIsIDEpOworICBlbnRyeVsxXSA9IHJlZ3JlcGxhY2UoZW50cnlbMV0sICI+IiwgIlxcJmd0OyIsIDEpOworICBubSA9IGdldHVpZChlbnRyeVswXSk7CisgIGlmKG5tID09ICIgUiBPIE8gVCAiKSByZXR1cm4gIjxUVD4iK2VudHJ5WzFdWzAuLjJdKyI8L1RUPiIrZW50cnlbMV1bMy4uXTsKKyAgaWR4ID0gc3Ryc3RyKGxvd2VyX2Nhc2UoZW50cnlbMV0pLCBubSk7CisgIHJldHVybiAiPFRUPiIrZW50cnlbMV1bMC4uMl0rIjwvVFQ+IitlbnRyeVsxXVszLi5pZHgtMV0KKyAgICAgICArICI8QSBIUkVGPVwiIitNVURXV1crIj8iK1JFUSsiPSIrUl9GSU5HRVIrIiYiK1VTRVIrIj0iK25tKyJcIj48Qj4iCisgICAgICAgKyBlbnRyeVsxXVtpZHguLmlkeCA9IGlkeCtzaXplb2Yobm0pXQorICAgICAgICsgIjwvQj48L0E+IgorICAgICAgICsgZW50cnlbMV1baWR4KzEuLl07Cit9CisKK3N0cmluZyBSZXF1ZXN0KG1hcHBpbmcgY21kcykKK3sKKyAgc3RyaW5nICp3aG8sICpsaXN0OyBpbnQgaSwgczsKKyAgaWYgKCFzaXplb2YoY21kcykpIHJldHVybiBFUlJPUigiQW5mcmFnZSB1bmcmdXVtbDtsdGlnISIpOworICB3aG8gPSBhbGxvY2F0ZShzID0gc2l6ZW9mKGxpc3QgPSBXSE8pKTsKKyAgZm9yKGkgPSBzOyBpLS07IGkgPiAwKSAKKyAgICB3aG9baV0gPSBNYWtlTGluayhsaXN0W3MgLSBpIC0gMV0pOworICAvLyB3aG8gPSBtYXAoV0hPLCAjJ01ha2VMaW5rLyonKi8pOworICByZXR1cm4gIjxIMj5XZXIgaXN0IGdlcmFkZSBpbiAiTVVETkFNRSI/PC9IMj48SFI+IgorICAgICAgICsgIjxPTD48TEk+IitpbXBsb2RlKHdobywgIlxuPExJPiIpKyI8L09MPiI7Cit9CmRpZmYgLS1naXQgYS9zZWN1cmUvdWRwX21haWwuYyBiL3NlY3VyZS91ZHBfbWFpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMDNmYjkKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvdWRwX21haWwuYwpAQCAtMCwwICsxLDI4NSBAQAorLyoKKyAqIFZFUlNJT04gMS4wCisgKiBVRFAgTUFJTCBzeXN0ZW0gKEF1dGhvcjogQWx2aW5AU3VzaGkpCisgKiBSZXF1aXJlcyBJTkVURCBWMC42MCBvciBoaWdoZXIgKElORVREIEF1dGhvcjogTm9zdHJhZGFtdXNAWmViZWRlZSkKKyAqLworI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgbm9fc2hhZG93CisjcHJhZ21hIG5vX2luaGVyaXQKKyNwcmFnbWEgdmVyYm9zZV9lcnJvcnMKKyNwcmFnbWEgY29tYmluZV9zdHJpbmdzCisvLyNwcmFnbWEgcGVkYW50aWMKKy8vI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSB3YXJuX2RlcHJlY2F0ZWQKKworI2luY2x1ZGUgPHVkcC5oPgorI2luY2x1ZGUgPHVkcF9tYWlsLmg+CisKKyNpZmRlZiBERUJVRworI3VuZGVmIERFQlVHCisjZW5kaWYKKyNkZWZpbmUgREVCVUcoeCkKKworbWFwcGluZyBzcG9vbF9pdGVtOworCitzdGF0aWMgc3RyaW5nICpzcG9vbDsKKworcHJpdmF0ZSBpbnQgbWF0Y2hfbXVkX25hbWUoc3RyaW5nIG11ZG5hbWUsIHN0cmluZyBtYXRjaF9zdHIpIHsKKyAgICByZXR1cm4gbXVkbmFtZVswLi5zaXplb2YobWF0Y2hfc3RyKS0xXSA9PSBtYXRjaF9zdHI7Cit9CisKK3N0YXRpYyB2b2lkIHNhdmVfc3Bvb2xfaXRlbSgpCit7CisgIHN0cmluZyBuYW1lOworICBpbnQgY291bnQ7CisKKyAgaWYoIXNwb29sX2l0ZW0gfHwgIW1hcHBpbmdwKHNwb29sX2l0ZW0pIHx8IHNwb29sX2l0ZW09PShbXSkpCisgICAgcmV0dXJuOworCisgIGRvIHsKKyAgICArK2NvdW50OworICAgIG5hbWU9c3Bvb2xfaXRlbVtVRFBNU19ERVNUXSsiLSIrdG9fc3RyaW5nKGNvdW50KTsKKyAgfSB3aGlsZShzcG9vbCAmJiBtZW1iZXIoc3Bvb2wsIG5hbWUpIT0tMSk7CisKKyAgc2F2ZV9vYmplY3QoVURQTV9TUE9PTF9ESVIrbmFtZSk7CisKKyAgaWYoIXNwb29sIHx8ICFzaXplb2Yoc3Bvb2wpKQorICAgIHNwb29sID0gKHsgbmFtZSB9KTsKKyAgZWxzZQorICAgIHNwb29sICs9ICh7IG5hbWUgfSk7Cit9CisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb24gKi8KK3ZvaWQgZGVsaXZlcl9tYWlsKHN0cmluZyByZWNpcGllbnQsc3RyaW5nIG11ZCxzdHJpbmcgZnJvbSwKKwlzdHJpbmcgc3ViaixzdHJpbmcgbWFpbF9ib2R5LGludCBzdGF0dXNfZmxhZyxzdHJpbmcgc3Bvb2xfbmFtZSk7CisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb24gKi8KK3N0YXRpYyB2b2lkIHN0YXJ0X3JldHJ5X2NhbGxvdXQoKTsKKworc3RhdGljIHZvaWQgcmVtb3ZlX2Zyb21fc3Bvb2woc3RyaW5nIHNwb29sX2ZpbGUpCit7CisgIGludCBpZHg7CisKKyAgaWYoc3Bvb2wgJiYgKGlkeD1tZW1iZXIoc3Bvb2wsc3Bvb2xfZmlsZSkpIT0tMSkKKyAgICB7CisgICAgICBzcG9vbCAtPSAoeyBzcG9vbF9maWxlIH0pOworICAgICAgaWYoIXNpemVvZihzcG9vbCkpCisgICAgICAgIHNwb29sPTA7CisgICAgfQorCisgIGlmKGZpbGVfc2l6ZSgiLyIrVURQTV9TUE9PTF9ESVIrc3Bvb2xfZmlsZSsiLm8iKT4wKQorICAgIGlmKCFybSgiLyIrVURQTV9TUE9PTF9ESVIrc3Bvb2xfZmlsZSsiLm8iKSkKKyAgICAgIGxvZ19maWxlKElORVREX0xPR19GSUxFLCJVUERfTUFJTDogQ2FuJ3QgZGVsZXRlIHNwb29sIGZpbGUgIisKKwkJIi8iK1VEUE1fU1BPT0xfRElSK3Nwb29sX2ZpbGUrIi5vIik7Cit9CisKK3N0YXRpYyB2b2lkIHJldHJ5X3NlbmQoKQoreworICBpbnQgaTsKKyAgc3RyaW5nIG1zZzsKKworICBpZighc3Bvb2wgfHwgIXNpemVvZihzcG9vbCkpIHJldHVybjsKKworICBmb3IoaT0wO2k8c2l6ZW9mKHNwb29sKTsrK2kpCisgICAgeworICAgICAgaWYoIXJlc3RvcmVfb2JqZWN0KFVEUE1fU1BPT0xfRElSK3Nwb29sW2ldKSkKKyAgICAgICAgeworICAgICAgICAgIGxvZ19maWxlKElORVREX0xPR19GSUxFLCJVRFBfTUFJTDogRmFsaWVkIHRvIHJlc3RvcmUgc3Bvb2wgZmlsZSAiKworCQlVRFBNX1NQT09MX0RJUitzcG9vbFtpXSk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgaWYodGltZSgpIC0gc3Bvb2xfaXRlbVtVRFBNU19USU1FXSA+IFVEUE1fU0VORF9GQUlMKjYwKQorICAgICAgICB7CisgICAgICAgICAgbXNnPSJSZWFzb246IFVuYWJsZSB0byBjb25uZWN0IHRvIHNpdGUgXCIiK3Nwb29sX2l0ZW1bVURQTVNfREVTVF0rCisJCSJcIlxuXG5JTkNMVURFRCBNRVNTQUdFIEZPTExPV1MgOi1cblxuIisKKwkJIlRvOiAiK3Nwb29sX2l0ZW1bVURQTVNfVE9dKyJcbiIrCisJCSJTdWJqZWN0OiAiK3Nwb29sX2l0ZW1bVURQTVNfU1VCSkVDVF0rIlxuIisKKwkJc3Bvb2xfaXRlbVtVRFBNU19CT0RZXTsKKworICAgICAgICAgIExPQ0FMX01BSUxFUi0+ZGVsaXZlcl9tYWlsKAorCQlzcG9vbF9pdGVtW1VEUE1TX0ZST01dLAkvKiBUTyAqLworCQkiTWFpbGVyQCIrTE9DQUxfTkFNRSwJLyogRlJPTSAqLworCQkiQm91bmNlZCBNYWlsIiwJCS8qIFNVQkpFQ1QgKi8KKwkJbXNnCQkJLyogTUFJTCBCT0RZICovCisJICApOworICAgICAgICAgIHJlbW92ZV9mcm9tX3Nwb29sKHNwb29sW2ldKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgZGVsaXZlcl9tYWlsKAorCXNwb29sX2l0ZW1bVURQTVNfVE9dLAorCXNwb29sX2l0ZW1bVURQTVNfREVTVF0sCisJc3Bvb2xfaXRlbVtVRFBNU19GUk9NXSwKKwlzcG9vbF9pdGVtW1VEUE1TX1NVQkpFQ1RdLAorCXNwb29sX2l0ZW1bVURQTVNfQk9EWV0sCisJVURQTV9TVEFUVVNfSU5fU1BPT0wsCisJc3Bvb2xbaV0pOworICAgIH0KKworICBzdGFydF9yZXRyeV9jYWxsb3V0KCk7Cit9CisKK3N0YXRpYyB2b2lkIHN0YXJ0X3JldHJ5X2NhbGxvdXQoKQoreworICBpZihmaW5kX2NhbGxfb3V0KCJyZXRyeV9zZW5kIikhPSAtMSApIHJldHVybjsKKworICBjYWxsX291dCgicmV0cnlfc2VuZCIsVURQTV9SRVRSWV9TRU5EKjYwKTsKK30KKworc3RhdGljIHZvaWQgZmFpbGVkX3RvX2RlbGl2ZXIobWFwcGluZyBkYXRhKQoreworICBzdHJpbmcgbXNnOworICBvYmplY3Qgb2JqOworCisgIGlmKCFkYXRhW1NZU1RFTV0gfHwgZGF0YVtTWVNURU1dICE9IFRJTUVfT1VUKQorICAgIHsKKyAgICAgIG1zZz0iUmVhc29uOiBFcnJvciBpbiBjb25uZWN0aW9uIHRvIHJlbW90ZSBzaXRlIFwiIitkYXRhW05BTUVdKyJcIlxuXG4iKworCSJJTkNMVURFRCBNRVNTQUdFIEZPTExPV1MgOi1cblxuIisKKwkiVG86ICIrZGF0YVtSRUNJUElFTlRdKyJcbiIrCisJIlN1YmplY3Q6ICIrZGF0YVtVRFBNX1NVQkpFQ1RdKyJcbiIrZGF0YVtEQVRBXTsKKworICAgICAgTE9DQUxfTUFJTEVSLT5kZWxpdmVyX21haWwoCisJCWRhdGFbVURQTV9XUklURVJdLAkvKiBUTyAqLworCQkiTWFpbGVyQCIrTE9DQUxfTkFNRSwJLyogRlJPTSAqLworCQkiQm91bmNlZCBNYWlsIiwJCS8qIFNVQkpFQ1QgKi8KKwkJbXNnCQkJLyogTUFJTCBCT0RZICovCisgICAgICApOworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBPSyB0cmFuc21pc3Npb24gdGltZWQgb3V0Li4gcGxhY2UgaW4gbWFpbCBzcG9vbCAqLworICAKKyAgaWYoKG9iaj1maW5kX3BsYXllcihkYXRhW1VEUE1fV1JJVEVSXSkpKQorICAgIHsKKyAgICAgIHRlbGxfb2JqZWN0KG9iaiwiTWFpbCBkZWxpdmVyeSB0byAiK2RhdGFbUkVDSVBJRU5UXSsiQCIrZGF0YVtOQU1FXSsKKwkiIFRpbWVkIE91dC4gUGxhY2luZyBtYWlsIGluIHNwb29sLlxuIik7CisgICAgfQorCisgIHNwb29sX2l0ZW09KFsKKwlVRFBNU19USU1FOgl0aW1lKCksCisJVURQTVNfVE86CWRhdGFbUkVDSVBJRU5UXSwKKwlVRFBNU19ERVNUOglkYXRhW05BTUVdLAorCVVEUE1TX0ZST006CWRhdGFbVURQTV9XUklURVJdLAorCVVEUE1TX1NVQkpFQ1Q6CWRhdGFbVURQTV9TVUJKRUNUXSwKKwlVRFBNU19CT0RZOglkYXRhW0RBVEFdCisgIF0pOworCisgIHNhdmVfc3Bvb2xfaXRlbSgpOworCisgIHN0YXJ0X3JldHJ5X2NhbGxvdXQoKTsKK30KKworc3RhdGljIHZvaWQgZ2V0X3BlbmRpbmdfZGVsaXZlcmllcygpCit7CisgIHN0cmluZyAqZW50cmllczsKKyAgaW50IGk7CisKKyAgZW50cmllcz1nZXRfZGlyKFVEUE1fU1BPT0xfRElSKyIqLm8iKTsKKyAgaWYoIWVudHJpZXMgfHwgIXNpemVvZihlbnRyaWVzKSkgcmV0dXJuOworCisgIHNwb29sPWFsbG9jYXRlKHNpemVvZihlbnRyaWVzKSk7CisgIGZvcihpPTA7aTxzaXplb2YoZW50cmllcyk7KytpKQorICAgIHNwb29sW2ldPWVudHJpZXNbaV1bMC4uPDNdOworCisgIHN0YXJ0X3JldHJ5X2NhbGxvdXQoKTsKK30KKwordm9pZCBjcmVhdGUoKQoreworCXNldGV1aWQoZ2V0dWlkKHRoaXNfb2JqZWN0KCkpKTsKKyAgZ2V0X3BlbmRpbmdfZGVsaXZlcmllcygpOworfQorCisvKgorICogUHVibGljIHJvdXRpbmVzCisgKi8KKworaW50IHF1ZXJ5X3ZhbGlkX21haWxfaG9zdChzdHJpbmcgaG9zdG5hbWUpCit7CisgIHN0cmluZyAqbWF0Y2g7CisKKyAgbWF0Y2g9ZmlsdGVyKG1faW5kaWNlcygobWFwcGluZylJTkVURC0+cXVlcnkoImhvc3RzIikpLAorCQkjJ21hdGNoX211ZF9uYW1lLGxvd2VyX2Nhc2UoaG9zdG5hbWUpKTsKKworICByZXR1cm4gKHNpemVvZihtYXRjaCk9PTEpOworfQorCit2b2lkIGRlbGl2ZXJfbWFpbChzdHJpbmcgcmVjaXBpZW50LHN0cmluZyBtdWQsc3RyaW5nIGZyb20sCisJc3RyaW5nIHN1Ymosc3RyaW5nIG1haWxfYm9keSxpbnQgc3RhdHVzX2ZsYWcsc3RyaW5nIHNwb29sX25hbWUpCit7CisgIG1hcHBpbmcgZGF0YTsKKworICAvLyBHZWxvZ2d0IHdpcmQsIHdlbm4gZWluIGF1ZnJ1ZmVuZGVzIE9iamVrdCBuaWNodCBzaWNoZXIgaXN0LgorICBpZiAob2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpWzAuLjddIT0iL3NlY3VyZS8iKQorICAgIHdyaXRlX2ZpbGUoIi9zZWN1cmUvQVJDSC9ERUxJVkVSX01BSUwiLAorICAgICAgc3ByaW50ZigiJXMgOiBBdWZydWYgdm9uIC9zZWN1cmUvdWRwX21haWwtPmRlbGl2ZXJfbWFpbCgpXG4iCisgICAgICAgICAgICAgICIgIFNlbmRlcjogJU8gRW1wZmFlbmdlcjogJU9AJU9cbiAgUE86ICVPIFRJOiAlTyBUUDolT1xuXG4iLAorICAgICAgICAgICAgICBjdGltZSh0aW1lKCkpLGZyb20sIHJlY2lwaWVudCwgbXVkLAorICAgICAgICAgICAgICBwcmV2aW91c19vYmplY3QoKSwgdGhpc19pbnRlcmFjdGl2ZSgpLCB0aGlzX3BsYXllcigpKSk7CisgIAorICBkYXRhPShbCisJUkVRVUVTVDogIm1haWwiLAorCVJFQ0lQSUVOVDogcmVjaXBpZW50LAorICAgICAgICBTRU5ERVI6IHRoaXNfb2JqZWN0KCksCisJVURQTV9TVEFUVVM6IHN0YXR1c19mbGFnLAorCVVEUE1fV1JJVEVSOiBsb3dlcl9jYXNlKGZyb20pLAorCVVEUE1fU1VCSkVDVDogc3ViaiwKKyAgICAgICAgVURQTV9TUE9PTF9OQU1FOiBzcG9vbF9uYW1lLAorCURBVEE6IG1haWxfYm9keQorICBdKTsKKworICBJTkVURC0+X3NlbmRfdWRwKG11ZCxkYXRhLDEpOworfQorCit2b2lkIHVkcF9yZXBseShtYXBwaW5nIGRhdGEpCit7CisgIG9iamVjdCBzZW5kZXI7CisKKyAgREVCVUcoc3ByaW50ZigiTUFJTEVSIFJFQ0VJVkVEICVPXG4iLGRhdGEpKTsKKyAgaWYgKCFtZW1iZXIoZGF0YSxVRFBNX1NUQVRVUykpCisgIHsKKyAgICAgREVCVUcoIkJPVU5DSU5HXG4iKTsKKyAgICAgTE9DQUxfTUFJTEVSLT5kZWxpdmVyX21haWwoCisgICAgICAgIGRhdGFbVURQTV9XUklURVJdLAkvKiBUTyAqLworCSJJTkVUREAiK2RhdGFbTkFNRV0sCS8qIEZST00gKi8KKwkiQm91bmNlZCBNYWlsKE5vIG1haWwgc3VwcG9ydCB5ZXQ/KSIsCQkvKiBTVUJKRUNUICovCisJZGF0YVtEQVRBXQkJLyogTUFJTCBCT0RZICovCisJKTsKKyAgICAgICAgaWYoZGF0YVtVRFBNX1NQT09MX05BTUVdKQorICAgICAgICAgIHJlbW92ZV9mcm9tX3Nwb29sKGRhdGFbVURQTV9TUE9PTF9OQU1FXSk7CisgIH0gZWxzZQorICBzd2l0Y2goZGF0YVtVRFBNX1NUQVRVU10pCisgICAgeworICAgICAgY2FzZSBVRFBNX1NUQVRVU19USU1FX09VVDoKKyAgICAgICAgZmFpbGVkX3RvX2RlbGl2ZXIoZGF0YSk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFVEUE1fU1RBVFVTX0RFTElWRVJFRF9PSzoKKyAgICAgICAgaWYoKHNlbmRlcj1maW5kX3BsYXllcihkYXRhW1VEUE1fV1JJVEVSXSkpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHRlbGxfb2JqZWN0KHNlbmRlciwiTWFpbGVyQCIrZGF0YVtOQU1FXSsiOiAiKworCQkiTWFpbCB0byAiK2NhcGl0YWxpemUoZGF0YVtEQVRBXSkrIiBkZWxpdmVyZWQgb2suXG4iKTsKKyAgICAgICAgICB9CisgICAgICAgIGlmKGRhdGFbVURQTV9TUE9PTF9OQU1FXSkKKyAgICAgICAgICByZW1vdmVfZnJvbV9zcG9vbChkYXRhW1VEUE1fU1BPT0xfTkFNRV0pOworCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFVEUE1fU1RBVFVTX1VOS05PV05fUExBWUVSOgorICAgICAgICBMT0NBTF9NQUlMRVItPmRlbGl2ZXJfbWFpbCgKKwkJZGF0YVtVRFBNX1dSSVRFUl0sCS8qIFRPICovCisJCSJNYWlsZXJAIitkYXRhW05BTUVdLAkvKiBGUk9NICovCisJCSJCb3VuY2VkIE1haWwiLAkJLyogU1VCSkVDVCAqLworCQlkYXRhW0RBVEFdCQkvKiBNQUlMIEJPRFkgKi8KKwkpOworICAgICAgICBpZihkYXRhW1VEUE1fU1BPT0xfTkFNRV0pCisgICAgICAgICAgcmVtb3ZlX2Zyb21fc3Bvb2woZGF0YVtVRFBNX1NQT09MX05BTUVdKTsKKyAgICAgICAgYnJlYWs7CisKKwljYXNlIFVEUE1fU1RBVFVTX0lOX1NQT09MOgorICAgICAgICAgIC8qIERvIG5vdGhpbmcgKi8KKyAgICAgICAgICBicmVhazsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZWN1cmUvd2FobG1hc2NoaW5lLmMgYi9zZWN1cmUvd2FobG1hc2NoaW5lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcwNWY4NwotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS93YWhsbWFzY2hpbmUuYwpAQCAtMCwwICsxLDI1MiBAQAorLy8gZGEgZGllc2VzIE9iamVrdCBpbiAvc2VjdXJlIGxpZWd0IHVuZCBST09USUQgaW5uZSBoYXQsIG11ZXNzZW4gYmVzb25kZXJlCisvLyBTaWNoZXJoZWl0c3ZvcmtlaHJ1bmdlbiBnZXRyb2ZmZW4gd2VyZGVuLiBJbnNiZXNvbmRlcmUgZHVlcmZlbiBrZWluZSBGaWxlcworLy8gYXVzIC9zdGQvIGluaGVyaXRldCB3ZXJkZW4sIGRhIGVzIGZ1ZXIgZGllc2UgRmlsZXMga2VpbmVyIFJPT1RJRCBiZWRhcmYuCisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgIi9zZWN1cmUvd2l6bGV2ZWxzLmgiCisKK3N0YXRpYyBzdHJpbmcgaW5fdXNlOworCitzdHJpbmcgdGhlbWE7CitzdHJpbmcgKm1vZWdsaWNoa2VpdGVuOworc3RyaW5nICplcmdlYm5pczsKKworI3VuZGVmIFNBWQorCitwcml2YXRlIHZvaWQgU0FZKCBzdHJpbmcgc3RyICkKK3sKKyAgd3JpdGUgKCBzdHIgKTsKKyAgd3JpdGVfZmlsZSgiL2xvZy9XQUhMIiwgc3RyKTsKK30KKwordm9pZCBjcmVhdGUoKQoreworICBpZiAoY2xvbmVwKE1FKSkgZGVzdHJ1Y3QoTUUpOworICBpZiAoZXJnZWJuaXMpIHJldHVybjsKKyAgc2V0ZXVpZChnZXR1aWQoKSk7CisgIGluX3VzZT0wOworICBlcmdlYm5pcz0oeyh7fSksKHt9KX0pOworICBtb2VnbGljaGtlaXRlbj0oe30pOworICByZXN0b3JlX29iamVjdCgid2FobC93YWhsIik7CisgIG1vdmVfb2JqZWN0KE1FLCAiL2dpbGRlbi9hYmVudGV1cmVyIik7Cit9CisKK3ZhcmFyZ3Mgc3RyaW5nIG5hbWUoaW50IGNhc3VzLCBpbnQgZGVtb24pCit7CisgIGlmIChkZW1vbj09UkFXKSByZXR1cm4gIldhaGxtYXNjaGluZSI7CisgIHN3aXRjaChjYXN1cykgeworICAgIGNhc2UgV0VNOgorICAgIGNhc2UgV0VTU0VOOgorICAgICAgaWYgKGRlbW9uPT0xKQorICAgICAgICByZXR1cm4gImRlciBXYWhsbWFzY2hpbmUiOworICAgICAgcmV0dXJuICJlaW5lciBXYWhsbWFzY2hpbmUiOworICAgIGRlZmF1bHQ6CisgICAgICBpZiAoZGVtb249PTEpCisgICAgICAgIHJldHVybiAiZGllIFdhaGxtYXNjaGluZSI7CisgICAgICByZXR1cm4gImVpbmUgV2FobG1hc2NoaW5lIjsKKyAgfQorfQorCit2YXJhcmdzIHN0cmluZyBOYW1lKGludCBjYXN1cywgaW50IGRlbW9uKQoreyAgIHJldHVybiBjYXBpdGFsaXplKG5hbWUoY2FzdXMsIGRlbW9uKSk7ICB9CisKKworcHVibGljIHN0cmluZyBRdWVyeVByb25vdW4oaW50IGNhc3VzKQoreworICBzd2l0Y2goY2FzdXMpCisgIHsKKyAgICBjYXNlIFdFUjoKKyAgICAgIHJldHVybiAic2llIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV0VNOiAKKyAgICAgIHJldHVybiAiaWhyIjsKKyAgfQorICByZXR1cm4gInNpZSI7Cit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCitzdHJpbmcgc2hvcnQoKQoreyAgcmV0dXJuICJFaW5lIFdhaGxtYXNjaGluZS5cbiI7ICB9CisKK3N0cmluZyBsb25nKCkKK3sKKyAgcmV0dXJuICJFaW5lIFdhaGxtYXNjaGluZS4gTWl0IGlociBrb2VubmVuIGdlaGVpbWUgV2FobGVuIGR1cmNoZ2VmdWVocnQgd2VyZGVuLlxuIisKKyAgICAiQWt0dWVsbGVzIFRoZW1hOiAiKyhzdHJpbmdwKHRoZW1hKSA/IHRoZW1hIDogImtlaW5lcyIpKyJcbiI7Cit9CisKK21peGVkIFF1ZXJ5KG1peGVkIHBhcmFtKQoreworICAgaWYgKCFzdHJpbmdwKHBhcmFtKSkgcmV0dXJuIDA7CisgICBzd2l0Y2ggKHBhcmFtKSB7CisgICAgIGNhc2UgUF9OT0dFVDogICByZXR1cm4gMTsKKyAgICAgY2FzZSBQX0dFTkRFUjogIHJldHVybiBGRU1BTEU7CisgICAgIGNhc2UgUF9OQU1FOiAgICByZXR1cm4gIldhaGxtYXNjaGluZSI7CisgICB9CisgICByZXR1cm4gMDsKK30KKworbWl4ZWQgUXVlcnlQcm9wKG1peGVkIHBhcmFtKQoreyAgcmV0dXJuIFF1ZXJ5KHBhcmFtKTsgIH0KKworaW50IFNldChtaXhlZCBwYXJhbSkKK3sgIHJldHVybiAtMTsgIH0KKworaW50IFNldFByb3AobWl4ZWQgcGFyYW0pCit7ICByZXR1cm4gLTE7ICB9CisKK3ZhcmFyZ3MgaW50IGlkKHN0cmluZyBzdHIsIGludCBsdmwpCit7ICByZXR1cm4gKG1lbWJlcigoeyJtYXNjaGluZSIsICJ3YWVobGVyIiwgIndhaGxtYXNjaGluZSJ9KSwgc3RyKSE9LTEpOyAgfQorCisvLyBhYiBoaWVyIGtvbW10IGRlciBlaWdlbnRsaWNoZSBDb2RlIGRlciBXYWhsbWFzY2hpbmUKKwordm9pZCBpbml0KCkKK3sKKyAgYWRkX2FjdGlvbigid2FlaGxlIiwgIndhZWhsIiwxKTsKKyAgYWRkX2FjdGlvbigiYXVzd2VydHVuZyIsImF1c3dlcnR1bmciKTsKKyAgYWRkX2FjdGlvbigid2FobHRoZW1hIiwgIndhaGx0aGVtYSIpOworICBhZGRfYWN0aW9uKCJtb2VnbGljaGtlaXQiLCJtb2VnbGljaGtlaXQiKTsKK30KKwordm9pZCBzYXZlX21lKCkKK3sgIHNhdmVfb2JqZWN0KCJ3YWhsL3dhaGwiKTsgIH0KKworc3RhdGljIGludCB3YWVobGUoKQoreworICBpbnQgaTsKKyAgbWl4ZWQgc2Vjb25kOworCisgIGlmICghUlBMKSByZXR1cm4gMDsKKyAgaWYgKFJQTC0+UXVlcnlQcm9wKFBfTEVWRUwpPDEwKSB7CisgICAgbm90aWZ5X2ZhaWwoIk1hbiBrYW5uIGVyc3QgYWIgU3R1ZmUgMTAgbWl0d2FlaGxlbiA6KFxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKFJQTC0+UXVlcnlQcm9wKFBfVEVTVFBMQVlFUikpIHsKKyAgICBub3RpZnlfZmFpbCgiVGVzdHNwaWVsZXIgc2luZCB2b24gZGVyIFdhaGwgYXVzZ2VzY2hsb3NzZW4uXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoKHNlY29uZD1SUEwtPlF1ZXJ5UHJvcChQX1NFQ09ORCkpICYmCisgICAgICAoIXN0cmluZ3Aoc2Vjb25kKSB8fCAoZmlsZV9zaXplKCIvc2F2ZS8iK2xvd2VyX2Nhc2Uoc2Vjb25kWzAuLjBdKSsiLyIrbG93ZXJfY2FzZShzZWNvbmQpKyIubyIpPD0wKSkpIHsKKyAgICBub3RpZnlfZmFpbCgiTmljaHQgcmljaHRpZyBtYXJraWVydGUgWndlaXRpZXMgc2luZCB2b24gZGVyIFdhaGwgYXVzZ2VzY2hsb3NzZW4uXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoaW5fdXNlKQorICB7CisgICAgd3JpdGUoaW5fdXNlKyIgd2FlaGx0IGdlcmFkZSwgd2FydGUgYWxzbyBiaXR0ZSBlaW5lbiBBdWdlbmJsaWNrLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaW5fdXNlPWNhcGl0YWxpemUoZ2V0dWlkKFJQTCkpOworICBzYXkoaW5fdXNlKyIgdHJpdHQgYW4gZGllIFdhaGxtYXNjaGluZS5cbiIpOworICB3cml0ZShsb25nKCkpOworICB3cml0ZSgiRGFzIHN0ZWh0IHp1ciBBdXN3YWhsOlxuIik7CisgIGZvciAoaT0wO2k8c2l6ZW9mKG1vZWdsaWNoa2VpdGVuKTtpKyspCisgICAgd3JpdGUoc3ByaW50ZigiIC0tICVkLikgJXNcbiIsaSsxLG1vZWdsaWNoa2VpdGVuW2ldKSk7CisgIHdyaXRlKCJUcmlmZiBudW4gRGVpbmUgV2FobCAoc2llIGlzdCBVTlNJQ0hUQkFSKTogIik7CisgIGlucHV0X3RvKCJ3YWVobGVfMiIsMSk7CisgIHJldHVybiAxOworfQorCitwcml2YXRlIGludCBmYWxzY2goKQoreworICB3cml0ZSgiRGllc2UgQXVzd2FobCBpc3QgdW5ndWVsdGlnLiBWZXJzdWNocyBiaXR0ZSBnbGVpY2ggbm9jaG1hbC5cbiIpOworICBzYXkoaW5fdXNlKyIgaGF0IGF1c2dld2FlaGx0LlxuIik7CisgIGluX3VzZT0wOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCB3YWVobGVfMihzdHJpbmcgc3RyKQoreworICBpbnQgaTsKKyAgbWl4ZWQgbmFtZTsKKworICBpZiAoIXN0cikgcmV0dXJuIGZhbHNjaCgpOworICAKKyAgbmFtZT1SUEwtPlF1ZXJ5UHJvcChQX1NFQ09ORCk7CisgIGlmICghc3RyaW5ncChuYW1lKSkKKyAgICBuYW1lPWdldHVpZChSUEwpOworICBlbHNlIG5hbWU9bG93ZXJfY2FzZShuYW1lKTsKKyAgICAgICAgICAgIAorICBpZiAobWVtYmVyX2FycmF5KHN0ciwgbW9lZ2xpY2hrZWl0ZW4pPT0tMSkgeworICAgIGlmICggIXNzY2FuZiggc3RyLCAiJWQiLCBpICkgKSByZXR1cm4gZmFsc2NoKCk7CisgICAgaWYgKCBpPDEgfHwgaT5zaXplb2YobW9lZ2xpY2hrZWl0ZW4pICkgcmV0dXJuIGZhbHNjaCgpOworICAgIGVyZ2VibmlzPWluc2VydF9hbGlzdChuYW1lLG1vZWdsaWNoa2VpdGVuW2ktMV0sZXJnZWJuaXMpOworICB9CisgIGVsc2UgZXJnZWJuaXM9aW5zZXJ0X2FsaXN0KG5hbWUsc3RyLGVyZ2VibmlzKTsKKyAgd3JpdGUoIk9rLlxuIik7CisgIHNhdmVfbWUoKTsKKyAgc2F5KGluX3VzZSsiIGhhdCBhdXNnZXdhZWhsdC5cbiIpOworICBpbl91c2U9MDsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgYXVzd2VydHVuZygpCit7CisgIGludCBpLGosbWF4LGFsbDsKKyAgbWFwcGluZyBzdGltbWVuLCBkYXRhOworICBtaXhlZCBuYW1lczsKKworICBpZiAoIUFSQ0hfU0VDVVJJVFkgfHwgcHJvY2Vzc19jYWxsKCkpIHJldHVybiAwOworCisgIHJtKCIvbG9nL1dBSEwiKTsKKworICBkYXRhID0gbWttYXBwaW5nKGVyZ2VibmlzWzBdLCBlcmdlYm5pc1sxXSk7CisgIG5hbWVzID0gbV9pbmRpY2VzKGRhdGEpOworICBzdGltbWVuID0gKFtdKTsKKworICBTQVkoIlxuXG5cbldhaGxlcmdlYm5pc3NlIHp1bSBUaGVtYTogIit0aGVtYSsiXG4iKTsKKyAgU0FZKCJcbkdld2FlaGx0IGhhYmVuIGZvbGdlbmRlIFBlcnNvbmVuOiBcbiIpOworICBTQVkoYnJlYWtfc3RyaW5nKENvdW50VXAobWFwKHNvcnRfYXJyYXkobmFtZXMsICMnPi8qJyovKSwgIydjYXBpdGFsaXplLyonKi8pKSwgNzgpKTsKKyAgU0FZKCJcbiIpOworCisgIHdoaWxlKHNpemVvZihuYW1lcykpIHsKKyAgICBzdGltbWVuW2RhdGFbbmFtZXNbMF1dXSsrOworICAgIG5hbWVzWzAuLjBdID0gKHt9KTsKKyAgICBhbGwrKzsKKyAgfQorCisgIFNBWSgiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpOworICBTQVkoIkVyZ2VibmlzOlxuIik7CisgIGZvciAoaT0wO2k8c2l6ZW9mKG1vZWdsaWNoa2VpdGVuKTtpKyspCisgICAgU0FZKHNwcmludGYoIiAtLSAlMmQuKSAlMjBzOiAlM2QgKCUnICczLjJmJSUpXG4iLCBpKzEsIG1vZWdsaWNoa2VpdGVuW2ldLAorICAgICAgICAgICAgICAgIHN0aW1tZW5bbW9lZ2xpY2hrZWl0ZW5baV1dLCAxLjAgKiBzdGltbWVuW21vZWdsaWNoa2VpdGVuW2ldXSAqIDEwMC4wIC8gKDEuMCAqIGFsbCkpKTsKKyAgU0FZKHNwcmludGYoIkdlc2FtdHN0aW1tZW46ICVkXG4iLCBzaXplb2YobV9pbmRpY2VzKGRhdGEpKSkpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCB3YWhsdGhlbWEoc3RyaW5nIHN0cikKK3sKKyAgaWYgKCFBUkNIX1NFQ1VSSVRZIHx8IHByb2Nlc3NfY2FsbCgpKSB7CisgICAgd3JpdGUoIk5PVCBhbGxvd2VkIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKCEoc3RyPXRoaXNfaW50ZXJhY3RpdmUoKS0+X3VucGFyc2VkX2FyZ3MoKSkpIHJldHVybiAwOworICB0aGVtYT1zdHI7CisgIHNheShSUEwtPm5hbWUoV0VSKSsiIHNldHp0IGVpbiBuZXVlcyBBYnN0aW1tdW5nc3RoZW1hIGZlc3QuXG4iKTsKKyAgZXJnZWJuaXM9KHsoe30pLCh7fSl9KTsKKyAgbW9lZ2xpY2hrZWl0ZW49KHt9KTsKKyAgd3JpdGUoIk9rLlxuIik7CisgIHNhdmVfbWUoKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbW9lZ2xpY2hrZWl0KHN0cmluZyBzdHIpCit7CisgIGlmICghQVJDSF9TRUNVUklUWSB8fCBwcm9jZXNzX2NhbGwoKSkgeworICAgIHdyaXRlKCJOT1QgYWxsb3dlZCIpOworICAgIHJldHVybiAwOworICB9CisgIGlmICghKHN0cj1SUEwtPl91bnBhcnNlZF9hcmdzKCkpKSByZXR1cm4gMDsKKyAgaWYgKG1lbWJlcl9hcnJheShzdHIsIG1vZWdsaWNoa2VpdGVuKSAhPSAtMSkgeworICAgIHdyaXRlKCJTY2hvbiBkcmluLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgbW9lZ2xpY2hrZWl0ZW4rPSh7c3RyfSk7CisgIHdyaXRlKCJPay5cbiIpOworICBzYXZlX21lKCk7CisgIHJldHVybiAxOworfQorCittaXhlZCBfaW50ZXJuYWwoKQoreworICBpZiAoIUFSQ0hfU0VDVVJJVFkgfHwgcHJvY2Vzc19jYWxsKCkpIHJldHVybiAwOworICByZXR1cm4gZXJnZWJuaXM7Cit9CmRpZmYgLS1naXQgYS9zZWN1cmUvd2l6bGV2ZWxzLmggYi9zZWN1cmUvd2l6bGV2ZWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc4NTE1OAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS93aXpsZXZlbHMuaApAQCAtMCwwICsxLDYzIEBACisjaWZuZGVmIF9XSVpMRVZFTFNfCisjZGVmaW5lIF9XSVpMRVZFTFNfCisvKgorICogd2l6bGV2ZWxzLmgKKyAqCisgKiBUaGlzIGZpbGUgZGVmaW5lcyBzb21lIHVzZWZ1bCBtYWNyb3MgdG8gZGV0ZXJtaW5lIHRoZSBsZXZlbCBvZgorICogYSB3aXphcmQgaW4gdGVybXMgb2YgYWJpbGl0eSB0byBkbyBjZXJ0YWluIHdpemFyZCB0aGluZ3MuCisgKiBTZWUgYWxzbyBkb2MvY29uY2VwdHMvbGV2ZWxzLiBUaGUgZ3JvdXBpbmcgYmVsb3cgaXMgdGFrZW4gZnJvbSB0aGVyZS4KKyAqCisgKi8KKyNpbmNsdWRlICIvc2VjdXJlL2NvbmZpZy5oIgorCisjZGVmaW5lCVNFRVJfTFZMIDEKKyNkZWZpbmUJTEVBUk5FUl9MVkwgMTAKKyNkZWZpbmUJV0laQVJEX0xWTCAyMAorI2RlZmluZSBET01BSU5NRU1CRVJfTFZMIDI1CisjZGVmaW5lIFNQRUNJQUxfTFZMIDMwCisjZGVmaW5lCUxPUkRfTFZMIDQwCisjZGVmaW5lIEVMREVSX0xWTCA1MAorI2RlZmluZQlBUkNIX0xWTCA2MAorI2RlZmluZSBHT0RfTFZMIDEwMAorCisjZGVmaW5lIFNFRVJfR1JQIDEKKyNkZWZpbmUgTEVBUk5FUl9HUlAgMgorI2RlZmluZSBXSVpBUkRfR1JQIDMKKyNkZWZpbmUgRE9NQUlOTUVNQkVSX0dSUCA0CisjZGVmaW5lIFNQRUNJQUxfR1JQIDUKKyNkZWZpbmUgTE9SRF9HUlAgNgorI2RlZmluZSBFTERFUl9HUlAgNworI2RlZmluZSBBUkNIX0dSUCA4CisKKy8qIHVzZXIgaXMgYW4gb2JqZWN0IHdoaWNoIGlzIHRvIGJlIGNoZWNrZWQgKi8KKy8qIGZvciBleGFtcGxlLCB1c2UgSVNfV0laQVJEKHRoaXNfcGxheWVyKCkpIHRvIGNoZWNrICovCisvKiBpZiBhIHBsYXllciBpcyBhIHdpemFyZC4gKi8KKyNkZWZpbmUgSVNfU0VFUih1c2VyKSAocXVlcnlfd2l6X2xldmVsKHVzZXIpID49IFNFRVJfTFZMKQorI2RlZmluZSBJU19MRUFSTkVSKHVzZXIpIChxdWVyeV93aXpfbGV2ZWwodXNlcikgPj0gTEVBUk5FUl9MVkwpCisjZGVmaW5lIElTX1NQRUNJQUwodXNlcikgKHF1ZXJ5X3dpel9sZXZlbCh1c2VyKSA+PSBTUEVDSUFMX0xWTCkKKyNkZWZpbmUgSVNfV0laQVJEKHVzZXIpIChxdWVyeV93aXpfbGV2ZWwodXNlcikgPj0gV0laQVJEX0xWTCkKKyNkZWZpbmUgSVNfRE9NQUlOTUVNQkVSKHVzZXIpIChxdWVyeV93aXpfbGV2ZWwodXNlcikgPj0gRE9NQUlOTUVNQkVSX0xWTCkKKyNkZWZpbmUgSVNfREVQVVRZKHVzZXIpIChtYXN0ZXIoKS0+SXNEZXB1dHkodXNlcikpCisjZGVmaW5lIElTX0xPUkQodXNlcikgKHF1ZXJ5X3dpel9sZXZlbCh1c2VyKSA+PSBMT1JEX0xWTCkKKyNkZWZpbmUgSVNfRUxERVIodXNlcikgKHF1ZXJ5X3dpel9sZXZlbCh1c2VyKSA+PSBFTERFUl9MVkwpCisjZGVmaW5lIElTX0FSQ0godXNlcikgKHF1ZXJ5X3dpel9sZXZlbCh1c2VyKSA+PSBBUkNIX0xWTCkKKyNkZWZpbmUgSVNfR09EKHVzZXIpIChxdWVyeV93aXpfbGV2ZWwodXNlcikgPj0gR09EX0xWTCkKKworI2RlZmluZSBJU19MRUFSTklORyh1c2VyKSAocXVlcnlfd2l6X2xldmVsKHVzZXIpID49IExFQVJORVJfTFZMICYmXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci0+UXVlcnlQcm9wKFBfV0FOVFNfVE9fTEVBUk4pKQorI2RlZmluZSBJU19MT1JEX0RPTUFJTih1c2VyLGRvbWFpbikgKG1hc3RlcigpLT5kb21haW5fbWFzdGVyKHVzZXIsZG9tYWluKSkKKworLyoKKyAqIEludGVyZmFjZSBmb3IgZW5oYW5jZWQgc2VjdXJpdHkgZnVuY3Rpb25zCisgKi8KKyNkZWZpbmUgU0VFUl9TRUNVUklUWSAoc2VjdXJlX2xldmVsKCkgPj0gU0VFUl9MVkwpCisjZGVmaW5lIExFQVJORVJfU0VDVVJJVFkgKHNlY3VyZV9sZXZlbCgpID49IExFQVJORVJfTFZMKQorI2RlZmluZSBXSVpBUkRfU0VDVVJJVFkgKHNlY3VyZV9sZXZlbCgpID49IFdJWkFSRF9MVkwpCisjZGVmaW5lIERPTUFJTk1FTUJFUl9TRUNVUklUWSAoc2VjdXJlX2xldmVsKCkgPj0gRE9NQUlOTUVNQkVSX0xWTCkKKyNkZWZpbmUgU1BFQ0lBTF9TRUNVUklUWSAoc2VjdXJlX2xldmVsKCkgPj0gU1BFQ0lBTF9MVkwpCisjZGVmaW5lIExPUkRfU0VDVVJJVFkgKHNlY3VyZV9sZXZlbCgpID49IExPUkRfTFZMKQorI2RlZmluZSBFTERFUl9TRUNVUklUWSAoc2VjdXJlX2xldmVsKCkgPj0gRUxERVJfTFZMKQorI2RlZmluZSBBUkNIX1NFQ1VSSVRZIChzZWN1cmVfbGV2ZWwoKSA+PSBBUkNIX0xWTCkKKyNkZWZpbmUgR09EX1NFQ1VSSVRZIChzZWN1cmVfbGV2ZWwoKSA+PSBHT0RfTFZMKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS96d2VpdGllcy5jIGIvc2VjdXJlL3p3ZWl0aWVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkzMDdjMgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS96d2VpdGllcy5jCkBAIC0wLDAgKzEsMTY0IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvKiogXGZpbGUgL2ZpbGUuYworKiBLdXJ6YmVzY2hyZWlidW5nLgorKiBMYW5nYmVzY2hyZWlidW5nLi4uCisqIFxhdXRob3IgPEF1dG9yPgorKiBcZGF0ZSA8ZGF0ZT4KKyogXHZlcnNpb24gJElkJAorKi8KKy8qIENoYW5nZWxvZzoKKyovCisjcHJhZ21hIHN0cm9uZ190eXBlcyxzYXZlX3R5cGVzLHJ0dF9jaGVja3MKKyNwcmFnbWEgbm9fY2xvbmUsbm9faW5oZXJpdCxub19zaGFkb3cKKyNwcmFnbWEgcGVkYW50aWMsIHJhbmdlX2NoZWNrCisKKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8ZXZlbnRzLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8cGxheWVyL2Jhc2UuaD4KKyNpbmNsdWRlIDx1c2VyaW5mby5oPgorCisjZGVmaW5lIEhPTUUoeCkgKF9fUEFUSF9fKDApK3gpCisjZGVmaW5lIFpERUJVRyh4KSB0ZWxsX3Jvb20oIi9wbGF5ZXJzL3plc3N0cmEvd29ya3Jvb20iLFwKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50Zigic2Vjb25kOiAlT1xuIix4KSk7CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgIHNldGV1aWQoZ2V0dWlkKCkpOworICBpZiAoc2xfb3BlbihIT01FKCJBUkNIL3NlY29uZC5zcWxpdGUiKSkgIT0gMSkKKyAgeworICAgIHJhaXNlX2Vycm9yKCJEYXRlbmJhbmsga29ubnRlIG5pY2h0IGdlb2VmZm5ldCB3ZXJkZW4uXG4iKTsKKyAgfQorICAvLyBUYWJlbGxlbiB1bmQgSW5kaWNlcyBhbmxlZ2VuLCBmYWxscyBkaWUgbmljaHQgZXhpc3RpZXJlbi4KKyAgc2xfZXhlYygiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgendlaXRpZXModXVpZCBURVhUIFBSSU1BUlkgS0VZIEFTQywgIgorICAgICAgICAgICJuYW1lIFRFWFQgTk9UIE5VTEwsIGVyc3RpZXV1aWQgVEVYVCBOT1QgTlVMTCwgIgorICAgICAgICAgICJlcnN0aWUgVEVYVCBOT1QgTlVMTCk7Iik7CisgIHNsX2V4ZWMoIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIHRlc3RpZXMobmFtZSBURVhUIFBSSU1BUlkgS0VZIEFTQywgIgorICAgICAgICAgICJtYWdpZXIgVEVYVCBOT1QgTlVMTCwgIgorICAgICAgICAgICJsYXN0bG9naW4gREFURVRJTUUgREVGQVVMVCBjdXJyZW50X3RpbWVzdGFtcCk7Iik7CisgIHNsX2V4ZWMoIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIGZhbWlsaWVuKCIKKyAgICAgICAgICAiZXJzdGlldXVpZCBURVhUIFBSSU1BUlkgS0VZIEFTQywgZmFtaWxpZSBURVhUIE5PVCBOVUxMKTsiKTsKKyAgc2xfZXhlYygiQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgaWR4X2Vyc3RpZSBPTiB6d2VpdGllcyhlcnN0aWUpOyIpOworICBzbF9leGVjKCJDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBpZHhfbmFtZSBPTiB6d2VpdGllcyhuYW1lKTsiKTsKKyAgc2xfZXhlYygiQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgaWR4X21hZ2llcm5hbWUgT04gdGVzdGllcyhtYWdpZXIpOyIpOworICBzbF9leGVjKCJDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBpZHhfZmFtaWxpZSBPTiBmYW1pbGllbihmYW1pbGllKTsiKTsKKworICAvLyBMb2dpbi1FdmVudCBhYm9ubmllcmVuCisgIGlmIChFVkVOVEQtPlJlZ2lzdGVyRXZlbnQoRVZUX0xJQl9MT0dJTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGlzdGVuIiwgdGhpc19vYmplY3QoKSkgPD0gMCkKKyAgeworICAgIHJhaXNlX2Vycm9yKCJMb2dpbmV2ZW50IGtvbm50ZSBuaWNodCBhYm9ubmllcnQgd2VyZGVuLlxuIik7CisgIH0KK30KKworcHVibGljIHZvaWQgbGlzdGVuKHN0cmluZyBlaWQsIG9iamVjdCB0cmlnb2IsIG1peGVkIGRhdGEpCit7CisgIGlmIChwcmV2aW91c19vYmplY3QoKSAhPSBmaW5kX29iamVjdChFVkVOVEQpCisgICAgICB8fCAhdHJpZ29iCisgICAgICB8fCAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZSh0cmlnb2IpCisgICAgICB8fCBJU19MRUFSTkVSKHRyaWdvYikpCisgICAgcmV0dXJuOworICAvLyB3ZW5uIHRlc3RpZSwgd2lyZCBkZXIgQ2hhciBhbHMgVGVzdGllIGJlaGFuZGVsdCB1bmQgUF9TRUNPTkQgaWdub3JpZXJ0LgorICBtaXhlZCB0ZXN0aWU9dHJpZ29iLT5RdWVyeVByb3AoUF9URVNUUExBWUVSKTsKKyAgaWYgKHN0cmluZ3AodGVzdGllKQorICAgICAgJiYgc3Ryc3RyKHRlc3RpZSwiR2lsZGUiKT09LTEpCisgIHsKKyAgICBtaXhlZCBwbGluZm8gPSBtYXN0ZXIoKS0+Z2V0X3VzZXJpbmZvKHRlc3RpZSk7CisgICAgaWYgKHBvaW50ZXJwKHBsaW5mbykpCisgICAgeworICAgICAgc2xfZXhlYygiSU5TRVJUIE9SIFJFUExBQ0UgSU5UTyB0ZXN0aWVzKG5hbWUsIG1hZ2llciwgbGFzdGxvZ2luKSAiCisgICAgICAgICAgICAgICJWQUxVRVMoPzEsPzIsPzMpOyIsCisgICAgICAgICAgICAgIHRyaWdvYi0+cXVlcnlfcmVhbF9uYW1lKCksCisgICAgICAgICAgICAgIHRlc3RpZSwgdGltZSgpKTsKKyAgICAgIHJldHVybjsgLy8gendlaXRpZSBqZXR6dCBhdWYgamVkZW4gRmFsbCBpZ25vcmllcmVuLgorICAgIH0KKyAgfQorCisgIG1peGVkIGVyc3RpZT10cmlnb2ItPlF1ZXJ5UHJvcChQX1NFQ09ORCk7CisgIGlmIChzdHJpbmdwKGVyc3RpZSkpCisgIHsKKyAgICBtaXhlZCBwbGluZm8gPSBtYXN0ZXIoKS0+Z2V0X3VzZXJpbmZvKGVyc3RpZSk7CisgICAgaWYgKHBvaW50ZXJwKHBsaW5mbykpCisgICAgeworICAgICAgc2xfZXhlYygiSU5TRVJUIE9SIFJFUExBQ0UgSU5UTyB6d2VpdGllcyh1dWlkLCBuYW1lLCBlcnN0aWV1dWlkLCBlcnN0aWUpICIKKyAgICAgICAgICAgICAgIlZBTFVFUyg/MSw/Miw/Myw/NCk7IiwKKyAgICAgICAgICAgICAgZ2V0dXVpZCh0cmlnb2IpLAorICAgICAgICAgICAgICB0cmlnb2ItPnF1ZXJ5X3JlYWxfbmFtZSgpLAorICAgICAgICAgICAgICBlcnN0aWUgKyAiXyIgKyBwbGluZm9bVVNFUl9DUkVBVElPTl9EQVRFKzFdLAorICAgICAgICAgICAgICBlcnN0aWUpOworICAgIH0KKyAgICAvL1pERUJVRyhzcHJpbnRmKCIlTywgJU8sICVPXG4iLGVpZCx0cmlnb2IsZGF0YSkpOworICB9Cit9CisKK3ZhcmFyZ3MgaW50IHJlbW92ZShpbnQgc2lsZW50KQoreworICBFVkVOVEQtPlVucmVnaXN0ZXJFdmVudChFVlRfTElCX0xPR0lOLCB0aGlzX29iamVjdCgpKTsKKyAgc2xfY2xvc2UoKTsKKyAgZGVzdHJ1Y3QoTUUpOworICByZXR1cm4gMTsKK30KKworcHVibGljIG1peGVkIHNxbF9xdWVyeShzdHJpbmcgcXVlcnkpCit7CisgIGlmIChBUkNIX1NFQ1VSSVRZKQorICAgIHJldHVybiBzbF9leGVjKHF1ZXJ5KTsKKyAgcmV0dXJuIDA7Cit9CisKK3ByaXZhdGUgc3RyaW5nIGdldF9lcnN0aWVfZGF0YShzdHJpbmcgZGF0dW0sIG9iamVjdCB6d2VpdGllKQoreworICBpZiAoIXp3ZWl0aWUpIHJldHVybiAwOworICBtaXhlZCByZXMgPSBzbF9leGVjKCJTRUxFQ1QgIiArIGRhdHVtICsgIiBGUk9NIHp3ZWl0aWVzIFdIRVJFIHV1aWQ9PzEiLAorICAgICAgICAgICAgICAgICAgICAgIGdldHV1aWQoendlaXRpZSkpOworICBpZiAoc2l6ZW9mKHJlcykpCisgICAgcmV0dXJuIHJlc1swXVswXTsKKworICByZXR1cm4gMDsKK30KKworcHVibGljIHZhcmFyZ3Mgc3RyaW5nIFF1ZXJ5RXJzdGllTmFtZShvYmplY3QgendlaXRpZSkKK3sKKyAgcmV0dXJuIGdldF9lcnN0aWVfZGF0YSgiZXJzdGllIiwgendlaXRpZSB8fCBwcmV2aW91c19vYmplY3QoKSk7Cit9CisKK3B1YmxpYyB2YXJhcmdzIHN0cmluZyBRdWVyeUVyc3RpZVVVSUQob2JqZWN0IHp3ZWl0aWUpCit7CisgIHJldHVybiBnZXRfZXJzdGllX2RhdGEoImVyc3RpZXV1aWQiLCB6d2VpdGllIHx8IHByZXZpb3VzX29iamVjdCgpKTsKK30KKworcHJpdmF0ZSBzdHJpbmcqIGdldF96d2VpdGllX2RhdGEoc3RyaW5nIGRhdHVtLCBvYmplY3QgZXJzdGllKQoreworICBpZiAoIWVyc3RpZSkgcmV0dXJuIDA7CisgIG1peGVkIHRtcCA9IHNsX2V4ZWMoIlNFTEVDVCAiICsgZGF0dW0gKyAiIEZST00gendlaXRpZXMgV0hFUkUgZXJzdGlldXVpZD0/MSIsCisgICAgICAgICAgICAgICAgICAgICAgZ2V0dXVpZChlcnN0aWUpKTsKKyAgaWYgKHNpemVvZih0bXApKQorICB7CisgICAgc3RyaW5nICpyZXM9KHt9KTsKKyAgICBmb3JlYWNoKHN0cmluZyAqcm93OiB0bXApCisgICAgICByZXMrPSh7cm93WzBdfSk7CisgICAgcmV0dXJuIHJlczsKKyAgfQorICByZXR1cm4gMDsKK30KKworcHVibGljIHZhcmFyZ3Mgc3RyaW5nKiBRdWVyeVp3ZWl0aWVzKG9iamVjdCBlcnN0aWUpCit7CisgIHJldHVybiBnZXRfendlaXRpZV9kYXRhKCJuYW1lIiwgZXJzdGllIHx8IHByZXZpb3VzX29iamVjdCgpKTsKK30KKworcHVibGljIHZhcmFyZ3Mgc3RyaW5nIFF1ZXJ5RmFtaWxpZShvYmplY3QgcGwpCit7CisgIHN0cmluZyBlcnN0aWUgPSBnZXRfZXJzdGllX2RhdGEoImVyc3RpZXV1aWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsIHx8IHByZXZpb3VzX29iamVjdCgpKTsKKyAgLy8gV2VubiAhZXJzdGllLCBkYW5uIGlzdCBwbCBrZWluIFp3ZWl0aWUsIGFsc28gaXN0IGVyIHNlbGJlciBlcnN0aWUKKyAgZXJzdGllIHx8PSBnZXR1dWlkKHBsKTsKKyAgLy8gamV0enQgbm9jaCBndWNrZW4sIG9iIG5lIGV4cGxpeml0ZSBGYW1pbGllIGZ1ZXIgZGVuIGVyc3RpZSBlcmZhc3N0IGlzdC4KKyAgbWl4ZWQgdG1wID0gc2xfZXhlYygiU0VMRUNUIGZhbWlsaWUgRlJPTSBmYW1pbGllbiBXSEVSRSAiCisgICAgICAgICAgICAgICAgICAgICAgImVyc3RpZXV1aWQ9PzEiLGVyc3RpZSk7CisgIGlmIChzaXplb2YodG1wKSkKKyAgICByZXR1cm4gdG1wWzBdWzBdOworICAvLyB3ZW5uIG5pY2h0LCBkYW5uIGlzdCBkaWUgRmFtaWxpZSBkaWUgWndlaXRpZXV1aWQgCisgIHJldHVybiBlcnN0aWU7Cit9CisKZGlmZiAtLWdpdCBhL3N0ZC8ucmVhZG1lIGIvc3RkLy5yZWFkbWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg5YzgwMwotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC8ucmVhZG1lCkBAIC0wLDAgKzEsMjQgQEAKK0hpZXIgZmluZGVzdCBkdSB2b3IgYWxsZW0gYWJzdHJha3RlIEJhc2lza2xhc3NlbiBmdWVyIGFsbGUgT2JqZWt0ZS4KKworYXJtb3VyWy5jXSAgICAgIC0gZGllIEJhc2lza2xhc3NlIGZ1ZXIgUnVlc3R1bmdlbgorY2xvdGhpbmdbLmNdICAgIC0gZGllIEJhc2lza2xhc3NlIGZ1ZXIgKEJlKUtsZWlkdW5nCitjb250YWluZXJbLmNdICAgLSBjb250YWluZXItQmFzaXNvYmpla3QKK2NvcnBzZS5jICAgICAgICAtIGRpZSBMZWljaGUgdm9uIFNwaWVsZXJuIHVuZCBOUENzCitnaWxkZS5jICAgICAgICAgLSBCYXNpc2tsYXNzZSBmdWVyIGRpZSBGaWxpYWxlbiBkZXIgQURWLUdpbGRlCitpbnBjWy5jXSAgICAgICAgLSBCYXNpc2tsYXNzZSBmdWVyIGludGVsbGlnZW50ZW4gTlBDIFtJTiBFTlRXSUNLTFVOR10KK2xhZGVuLmMgICAgICAgICAtIEJhc2lza2xhc3NlIGZ1ZXIgZGVuIExhZGVuCitsaXZpbmcgICAgICAgICAgLSBCYXNpc2tsYXNzZW4gZnVlciBMZWJld2VzZW4KK25wY1suY10gICAgICAgICAtIEJhc2lza2xhc3NlIGZ1ZXIgTm9uLVBsYXllci1DaGFyYWN0ZXJzCitwbGF5ZXIgICAgICAgICAgLSBCYXNpcyBmdWVyIFNwaWVsZXJvYmpla3RlLCBzaWVoZSBzaGVsbHMKK3B1Yi5jICAgICAgICAgICAtIEJhc2lza2xhc3NlIGZ1ZXIgS25laXBlbgorcm9vbVsuY10gICAgICAgIC0gZGF2b24gbGVpdGVuIHNpY2ggYWxsZSBSYWV1bWUgYWIKK3NoZWxscyAgICAgICAgICAtIGRhIHN0ZWhlbiBkaWUgUGxheWVyLU9iamVrdGUgZHJpbgorc3RvcmUuYyAgICAgICAgIC0gQmFzaXNrbGFzc2UgZnVlciBMYWdlcnJhZXVtZSAtIHBhc3N0IHp1IExhZGVuLmMKK3RoaW5nWy5jXSAgICAgICAtIEJhc2lza2xhc3NlIGZ1ZXIgQUxMRVMgT2JqZWt0ZQordW5pdC5jICAgICAgICAgIC0gS2xhc3NlIGZ1ZXIgTWVocmZhY2gtT2JqZWt0ZSB3aWUgZGFzIEdlbGQKK3dlYXBvblsuY10gICAgICAtIEJhc2lza2xhc3NlIGZ1ZXIgV2FmZmVuCisKK0JpdHRlIE9iamVrdCBoaWVyIG5pY2h0IG1pdCAndXBkIC1sJywgJ3hsb2FkJyBvLmFlLiBsYWRlbiEgWnVtICJOZXVsYWRlbiIgbnVyCitkaWUgQmx1ZXByaW50IGRlc3RydWN0ZW4gKHouQi4gcGVyIHVwZCksIHNpZSB3ZXJkZW4gYXV0b21hdGlzY2ggYmVpIEJlZGFyZgorbmV1Z2VsYWRlbi4KKwpkaWZmIC0tZ2l0IGEvc3RkL2FybW91ci5jIGIvc3RkL2FybW91ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZjRiOGYKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvYXJtb3VyLmMKQEAgLTAsMCArMSw1MyBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGFybW91ci5jIC0tIGFybW91ciBzdGFuZGFyZCBvYmplY3QKKy8vCisvLyAkSWQ6IGFybW91ci5jIDc4MDQgMjAxMS0wNy0xMCAyMDozNzo1MlogWmVzc3RyYSAkCisKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgcGVkYW50aWMKKworaW5oZXJpdCAiL3N0ZC90aGluZy9wcm9wZXJ0aWVzIjsKK2luaGVyaXQgIi9zdGQvdGhpbmcvY29tbWFuZHMiOworaW5oZXJpdCAiL3N0ZC90aGluZy9yZXN0cmljdGlvbnMiOworaW5oZXJpdCAiL3N0ZC90aGluZy9saWdodCI7Citpbmhlcml0ICIvc3RkL2FybW91ci9kZXNjcmlwdGlvbiI7Citpbmhlcml0ICIvc3RkL2Nsb3RoaW5nL21vdmluZyI7Citpbmhlcml0ICIvc3RkL2FybW91ci93ZWFyIjsKK2luaGVyaXQgIi9zdGQvYXJtb3VyL2NvbWJhdCI7Citpbmhlcml0ICIvc3RkL3RoaW5nL2xhbmd1YWdlIjsKK2luaGVyaXQgIi9zdGQvdGhpbmcvZW52Y2hrIjsKKworLy8jZGVmaW5lIE5FRURfUFJPVE9UWVBFUworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8Y29tYmF0Lmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSB7CisgIHByb3BlcnRpZXM6OmNyZWF0ZSgpOworICBjb21tYW5kczo6Y3JlYXRlKCk7CisgIGxpZ2h0OjpjcmVhdGUoKTsKKyAgcmVzdHJpY3Rpb25zOjpjcmVhdGUoKTsKKyAgZGVzY3JpcHRpb246OmNyZWF0ZSgpOworICB3ZWFyOjpjcmVhdGUoKTsKKyAgY29tYmF0OjpjcmVhdGUoKTsKKyAgZW52Y2hrOjpjcmVhdGUoKTsKKyAgQWRkSWQoIkRpbmciKTsKK30KKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlX3N1cGVyKCkgeworICBzZXRfbmV4dF9yZXNldCgtMSk7Cit9CisKKy8vIFp1bSBVZWJlcnNjaHJlaWJlbiwgZGFtaXQgZXMgbmljaHQgYnVnZ3QsIHdlbm4gZGllIExldXRlIGluIGlocmVuIE9iamVrdGVuICh3aWUKKy8vIGdld3VlbnNjaHQpIDo6cmVzZXQoKSBydWZlbi4KK3ZvaWQgcmVzZXQoKSB7Cit9CisKZGlmZiAtLWdpdCBhL3N0ZC9hcm1vdXIvY29tYmF0LmMgYi9zdGQvYXJtb3VyL2NvbWJhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ODgxMzEKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvYXJtb3VyL2NvbWJhdC5jCkBAIC0wLDAgKzEsMjI4IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gYXJtb3VyL2NvbWJhdC5jIC0tIGFybW91ciBzdGFuZGFyZCBvYmplY3QKKy8vCisvLyAkSWQ6IGNvbWJhdC5jIDkwOTIgMjAxNS0wMS0xOSAyMzo1Nzo1MFogWmVzc3RyYSAkCisKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKworI2luY2x1ZGUgPHRoaW5nL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx0aGluZy9jb21tYW5kcy5oPgorI2luY2x1ZGUgPHRoaW5nL2Rlc2NyaXB0aW9uLmg+CisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8Y29tYmF0Lmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8bmV3X3NraWxscy5oPgorCisKKy8vIEdsb2JhbGUgVmFyaWFibGVuCitwcml2YXRlIG5vc2F2ZSBjbG9zdXJlIGRlZmVuZF9jbDsKK3ByaXZhdGUgbm9zYXZlIG1hcHBpbmcgcmVzaXN0YW5jZV9zdHJlbmd0aHM9KFtdKTsKKwordm9pZCBjcmVhdGUoKSB7CisgICAgLy8gRWluaWdlIEdydW5kd2VydGUgc2V0emVuCisgICAgU2V0KFBfQVJNT1VSX1RZUEUsIEFUX0lMTEVHQUwsIEZfVkFMVUUpOworICAgIFNldChQX0xBU1RfVVNFLHRpbWUoKSxGX1ZBTFVFKTsKK30KKworLy8gRGllIEZ1bmt0aW9uLCBkaWUgZGVuIFNjaHV0endlcnQgYmVyZWNobmV0LCBkZW4gZGllIFJ1ZXN0dW5nIGJpZXRldAoraW50IFF1ZXJ5RGVmZW5kKHN0cmluZ3xzdHJpbmcqIGRhbV90eXBlLCBpbnR8bWFwcGluZyBzcGVsbCwgb2JqZWN0IGVuZW15KQoreworICAgIGludCAgICAgcHJvdDsKKyAgICBtaXhlZCAgIGRlZl9mdW5jOworICAgIG9iamVjdCAgcGw7CisgICAgLy8gWnVtIENhY2hlbiB2b24gc3BlbGxbRUlORk9fREVGRU5EXSwgaGFldWZpZ2VzIExvb2t1cCBhdXMgZGVtIE1hcHBpbmcKKyAgICAvLyBrb2VubnRlIHVubm9ldGlnIFplaXQga29zdGVuLgorICAgIG1hcHBpbmcgZWluZm87CisKKyAgICAvLyBBVF9NSVNDLVJ1ZXR1bmdlbiBzY2h1ZXR6ZW4gbm9ybWFsZXJ3ZWlzZSBnYXIgbmljaHQuLi4KKyAgICBpZiAoUXVlcnlQcm9wKFBfQVJNT1VSX1RZUEUpPT1BVF9NSVNDKSB7CisgICAgICAgIC8vIGVzIHNlaSBkZW5uLCBzaWUgaGFiZW4gZWluZSBzcGV6aWVsbGUgRGVmZW5kRnVuYworICAgICAgICBpZiAoIWNsb3N1cmVwKGRlZmVuZF9jbCkpIHJldHVybigwKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8vIGFuc29uc3RlbiBSdWVzdHVuZ3NzY2h1dHogZXJtaXR0ZWxuIHVuZCBpbiBFSU5GT19ERUZFTkQgdmVybWVya2VuLgorICAgICAgICAvLyAoQmVpZGVzIGZ1ZXIgQVRfTUlTQyBpbiBqZWRlbSBGYWxsIHVubm9ldGlnKQorCisgICAgICAgIC8vIFJ1ZXN0dW5nZW4gc2NodWV0emVuIG51ciBnZWdlbiBwaHlzaWthbGlzY2hlbiBTY2hhZGVuCisgICAgICAgIGlmICgoIXNwZWxsIHx8IChtYXBwaW5ncChzcGVsbCkgJiYgc3BlbGxbU1BfUEhZU0lDQUxfQVRUQUNLXSkpCisgICAgICAgICAgICAmJiBzaXplb2YoZmlsdGVyKGRhbV90eXBlLFBIWVNJQ0FMX0RBTUFHRV9UWVBFUykpKQorICAgICAgICB7IAorICAgICAgICAgIC8vIFNjaHV0eiBiZXN0aW1tZW4sIE1pbmltdW0gMSwgYWJlciBudXIgd2VubiBQX0FDID4gMAorICAgICAgICAgIGludCBwYWMgPSBRdWVyeVByb3AoUF9BQyk7CisgICAgICAgICAgaWYgKHBhYyA+IDApCisgICAgICAgICAgICBwcm90ID0gKHBhYy80ICsgcmFuZG9tKHBhYyozLzQgKyAxKSkgfHwgMSA7CisgICAgICAgICAgb2JqZWN0IHN0YXQgPSBmaW5kX29iamVjdCgiL2QvZXJ6bWFnaWVyL3plc3N0cmEvcGFjc3RhdCIpOworICAgICAgICAgIGlmIChzdGF0KQorICAgICAgICAgICAgc3RhdC0+YWNzdGF0KFF1ZXJ5UHJvcChQX0FSTU9VUl9UWVBFKSxwcm90LAorICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbShwYWMpKzEpOworCisgICAgICAgICAgLy8gcnVlc3R1bmdzY2h1dHogYW4gZGVmZW5kZnVuYyB3ZWl0ZXJtZWxkZW4KKyAgICAgICAgICBpZiAobWFwcGluZ3Aoc3BlbGwpICYmCisgICAgICAgICAgICAgIG1hcHBpbmdwKGVpbmZvPXNwZWxsW0VJTkZPX0RFRkVORF0pKSB7CisgICAgICAgICAgICAgIC8vIFNjaHV0eiBkLiBha3QuIFJ1ZXN0dW5nIHZlcm1lcmtlbi4KKyAgICAgICAgICAgICAgZWluZm9bREVGRU5EX0NVUl9BUk1PVVJfUFJPVF09cHJvdDsKKyAgICAgICAgICAgICAgLy8gZGF0ZW4gZGVyIFJ1ZXN0dW5nIHZlcm1lcmtlbi4KKyAgICAgICAgICAgICAgaWYgKG1hcHBpbmdwKGVpbmZvW0RFRkVORF9BUk1PVVJTXSkpIHsKKyAgICAgICAgICAgICAgICBlaW5mb1tERUZFTkRfQVJNT1VSU11bTUUsREVGX0FSTU9VUl9QUk9UXT1wcm90OworICAgICAgICAgICAgICB9CisgICAgICAgICAgfSAvLyBlbmRlIHZvbSBpZiAobWFwcGluZyhzcGVsbCkgLi4uKQorICAgICAgICB9IC8vIGVuZGUgdm9tIGlmIChwaHlzIFNjaGFkZW4pCisKKyAgICB9IC8vIGVuZGUgdm9tIGVsc2UgKHdlbm4ga2VpbiBBVF9NSVNDKSAKKworICAgIC8vIElzdCBlaW5lIERlZmVuZEZ1bmMgZ2VzZXR6dCwgd2lyZCBkaWVzZSBhdXNnZXdlcnRldAorICAgIGlmIChjbG9zdXJlcChkZWZlbmRfY2wpKSB7CisgICAgICAgIGlmICghb2JqZWN0cChnZXRfdHlwZV9pbmZvKGRlZmVuZF9jbCwyKSkpIHsKKyAgICAgICAgICAgIC8vIENsb3N1cmUgZ2VzZXR6dCwgYWJlciBuaWNodCBndWVsdGlnLCBzY2hhdWVuLCBvYiB3aXIgc2llIG5ldQorICAgICAgICAgICAgLy8gZXJzdGVsbGVuIGtvZW5uZW4uCisgICAgICAgICAgICBpZiAob2JqZWN0cChkZWZfZnVuYz1RdWVyeVByb3AoUF9ERUZFTkRfRlVOQykpKSB7CisgICAgICAgICAgICAgICAgZGVmZW5kX2NsPXN5bWJvbF9mdW5jdGlvbigiRGVmZW5kRnVuYyIsZGVmX2Z1bmMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gc29uc3QgbG9lc2NoZW4sIHVtIHNwYWV0ZXIgZGllc2VuIFp3ZWlnIGdhbnogenUgc3BhcmVuLgorICAgICAgICAgICAgZWxzZSBkZWZlbmRfY2w9MDsKKyAgICAgICAgfQorICAgICAgICAvLyBCVFc6IEVzIGlzdCBvaywgd2VubiBkZWZlbmRfY2wgamV0enQgMCBpc3QsIGRhbm4gbGllZmVydCBmdW5jYWxsKCkKKyAgICAgICAgLy8gYXVjaCAwLgorICAgICAgICAvLyBCZWkgTmV0enRvdGVuIGtlaW5lICh6dXJ1ZWNrc2NobGFnZW5kZSkgRGVmZW5kRnVuYworICAgICAgICBpZiAob2JqZWN0cChwbD1RdWVyeVByb3AoUF9XT1JOKSkgJiYgKCFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHBsKSB8fAorICAgICAgICAgICAgICAgIGludGVyYWN0aXZlKHBsKSkgKSB7CisgICAgICAgICAgLy8gRGVyIFJ1ZWNrZ2FiZXdlcnQgZGVyIERlZmVuZEZ1bmMgd2lyZCB6dW0gU2NodXR6IGFkZGllcnQKKyAgICAgICAgICBwcm90ICs9IGZ1bmNhbGwoZGVmZW5kX2NsLCBkYW1fdHlwZSwgc3BlbGwsIGVuZW15KTsKKyAgICAgICAgICAvLyBsZWlkZXIga2FubiBkaWUgRGVmZW5kRnVuYyBqZXR6dCBhdWNoIG5vY2ggZGFzIE9iamVrdCB6ZXJzdG9lcnQKKyAgICAgICAgICAvLyBoYWJlbi4uLgorICAgICAgICAgIGlmICghb2JqZWN0cCh0aGlzX29iamVjdCgpKSkKKyAgICAgICAgICAgIHJldHVybiBwcm90OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gWmVpdHB1bmt0IGRlciBsZXR6dGVuIEJlbnV0enVuZyBhdXNnZWJlbgorICAgIFNldFByb3AoUF9MQVNUX1VTRSx0aW1lKCkpOworCisgICAgLy8gQmVyZWNobmV0ZW4gU2NodXR6IHp1cnVlY2tnZWJlbgorICAgIHJldHVybiBwcm90OworfQorCisvLyBFcyBkdWVyZmVuIG51ciAibGVnYWxlIiBSdWVzdHVuZ3N0eXBlbiBnZXNldHp0IHdlcmRlbiwgYW5zb25zdGVuCisvLyB3aXJkIEFUX0lMTEVHQUwgZ2VzZXR6dC4KK3N0YXRpYyBtaXhlZCBfc2V0X2FybW91cl90eXBlKG1peGVkIHR5cGUgKSB7CisgICAgaWYgKCFDT01CQVRfTUFTVEVSLT52YWxpZF9hcm1vdXJfdHlwZSh0eXBlKSkKKyAgICB7CisgICAgICAgIFNldChQX0FSTU9VUl9UWVBFLCAodHlwZT1BVF9JTExFR0FMKSwgRl9WQUxVRSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFNldChQX0FSTU9VUl9UWVBFLCB0eXBlKTsKKyAgICB9CisgICAgQWRkSWQodHlwZSk7CisKKyAgICByZXNpc3RhbmNlX3N0cmVuZ3Rocz0oW10pOworICAgIHJldHVybiB0eXBlOworfQorCisKKy8vIFdpcmQgZXR3YXMgYW4gUF9ERUZFTkRfRlVOQyBnZWFlbmRlcnQsIG11c3MgZGllIHp1Z2Vob2VyaWdlIGNsb3N1cmUKKy8vIG5ldSBlcnN0ZWxsdCB3ZXJkZW4uCitzdGF0aWMgb2JqZWN0IF9zZXRfZGVmZW5kX2Z1bmMob2JqZWN0IGFyZykgeworICBpZiAob2JqZWN0cChhcmcpICYmCisgICAgICBjbG9zdXJlcChkZWZlbmRfY2w9c3ltYm9sX2Z1bmN0aW9uKCJEZWZlbmRGdW5jIixhcmcpKSkgeyAgCisgICAgcmV0dXJuIFNldChQX0RFRkVORF9GVU5DLCBhcmcsIEZfVkFMVUUpOworICB9CisgIGRlZmVuZF9jbD0wOworICByZXR1cm4oU2V0KFBfREVGRU5EX0ZVTkMsIDAsIEZfVkFMVUUpKTsKK30KKworLy8gQXVjaCBSdWVzdHVuZ2VuIGtvZW5uZW4gZWluZW4gU2NoYWRlbnN0eXAgaGFiZW4uIERpZXNlciBrYW5uIGFscyBzdHJpbmcKKy8vIG9kZXIgYXJyYXkgYW5nZWdlYmVuIHdlcmRlbiwgd2lyZCBhYmVyIGludGVybiBhdWYgamVkZW4gRmFsbCBhbHMKKy8vIGFycmF5IGdlc3BlaWNoZXJ0Lgorc3RhdGljIG1peGVkIF9zZXRfZGFtX3R5cGUobWl4ZWQgYXJnKSB7CisgICAgaWYgKHBvaW50ZXJwKGFyZykpCisgICAgeworICAgICAgICByZXR1cm4gU2V0KFBfREFNX1RZUEUsIGFyZywgRl9WQUxVRSk7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cmluZ3AoYXJnKSkKKyAgICB7CisgICAgICAgIHJldHVybiBTZXQoUF9EQU1fVFlQRSwgKHsgYXJnIH0pLCBGX1ZBTFVFKTsKKyAgICB9CisgICAgcmV0dXJuIFF1ZXJ5KFBfREFNX1RZUEUsIEZfVkFMVUUpOworfQorCisvLyBSdWVzdHVuZ2VuIGtvZW5uZW4gUmVzaXN0ZW56ZW4gc2V0emVuLiBEaWVzZSB3ZXJkZW4gamVkb2NoIG5pY2h0IHdpZQorLy8gIm5vcm1hbGUiIFJlc2lzdGVuemVuIGdlc2V0enQsIHNvbmRlcm4gYWxzIFByb3plbnR3ZXJ0ZSBkZXIgZnVlciBkaWVzZW4KKy8vIFR5cCBtYXhpbWFsIHp1bGFlc2lnZW4gUmVzaXN0ZW56LiBEaWUgQWVuZGVydW5nIGRlciBSZXNpc3RlbnplbiBkYXJmCisvLyBudXIgZHVyY2ggZGllIFJ1ZXN0dW5nIHNlbGJzdCBlcmZvbGdlbi4KKy8vIEJlaXNwaWVsOiAoW0RUX0ZJUkU6IDEwMCwgRFRfV0FURVI6IC0xNTBdKQorLy8gbWF4LiBGZXVlcnJlc2lzdGVueiwgMS41ZmFjaGUgQW5mYWVsbGlna2VpdAorc3RhdGljIG1peGVkIF9zZXRfcmVzaXN0YW5jZV9zdHJlbmd0aHMobWl4ZWQgcmVzbWFwKSB7CisgICAgZmxvYXQgIG1heF9yZXM7CisgICAgb2JqZWN0IHdvcm5fYnk7CisKKyAgICAvLyBFcyBkdWVyZmVuIG51ciBtYXBwaW5ncyBhbmdlZ2ViZW4gd2VyZGVuCisgICAgaWYgKCFtYXBwaW5ncChyZXNtYXApKQorICAgIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8vIGRpZSBNYXh3ZXJ0ZSBtdWVzc2VuIGpld2VpbHMgZHVyY2ggLTEwMCBnZXRlaWx0IHNlaW4sIGRhIGhpbnRlcmhlcgorICAgIC8vIG1pdCBkZXIgUHJvemVudHphaGwgbXVsdGlwbGl6aWVydCB3aXJkIHVuZCBkaWUgYW5nYWJlIGRlciBWb3J6ZWljaGVuCisgICAgLy8gaGllciB1bWdla2VocnQgd2llIGJlaSBkZW4gIm5vcm1hbGVuIiBSZXNpc3RlbnplbiBpc3QuIERlcgorICAgIC8vIE1heGltYWx3ZXJ0IGlzdCB2b20gUnVlc3R1bmdzdHlwIGFiaGFlbmdpZy4KKyAgICBzd2l0Y2ggKFF1ZXJ5UHJvcChQX0FSTU9VUl9UWVBFKSkKKyAgICB7CisgICAgICAgIGNhc2UgQVRfQ0xPQUsgIDoKKyAgICAgICAgY2FzZSBBVF9SSU5HICAgOgorICAgICAgICBjYXNlIEFUX0FNVUxFVCA6IG1heF9yZXM9LTAuMDAxMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVF9TSElFTEQgOgorICAgICAgICBjYXNlIEFUX0FSTU9VUiA6IG1heF9yZXM9LTAuMDAxNTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdCAgICAgICAgOiBtYXhfcmVzPS0wLjAwMDU7CisgICAgfQorCisgICAgLy8gUmVzaXN0ZW56LU1hcHBpbmcgYWt0dWFsaXNpZXJlbgorICAgIHJlc2lzdGFuY2Vfc3RyZW5ndGhzPShbXSk7CisgICAgZm9yZWFjaChzdHJpbmcgZGFtdHlwZSwgaW50IHJlczogcmVzbWFwKQorICAgIHsKKyAgICAgICAgaWYgKCFpbnRwKHJlcykpIHJlcz10b19pbnQocmVzKTsKKyAgICAgICAgLy8gTWVociBhbHMgMTAwIFByb3plbnQgaXN0IG5pY2h0IGVybGF1YnQKKyAgICAgICAgaWYgKHJlcz4xMDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlcz0xMDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocmVzPDApCisgICAgICAgIHsKKyAgICAgICAgICAgICByZXM9KHJlcy80KSo1OworICAgICAgICAgICAgIC8vIE1hbiBrYW5uIGF1Y2ggbmljaHQgYmVsaWViaWcgbmVnYXRpdiB3ZXJkZW4KKyAgICAgICAgICAgICBpZiAocmVzPC0xMDAwKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgcmVzPS0xMDAwOworICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBEZXIgUmVzaXN0ZW56d2VydCBiZXJlY2huZXQgc2ljaCBhdXMgZGVtIFByb2R1a3QgZGVzCisgICAgICAgIC8vIE1heGltYWx3ZXJ0ZXMgdW5kIGRlciBQcm96ZW50emFobAorICAgICAgICByZXNpc3RhbmNlX3N0cmVuZ3Roc1tkYW10eXBlXT1yZXMqbWF4X3JlczsKKyAgICB9CisKKyAgICAvLyBXZXJkZW4gZGllIFJlc2lzdGVuemVuIGJlaSBlaW5lciBnZXRyYWdlbmVuIFJ1ZXN0dW5nIGdlYWVuZGVydCwKKyAgICAvLyBtdXNzIGRlciBUcmFlZ2VyIGRhdm9uIG5hdHVlcmxpY2ggYmVlaW5mbHVzc3Qgd2VyZGVuLgorICAgIGlmIChvYmplY3RwKHdvcm5fYnk9UXVlcnlQcm9wKFBfV09STikpKQorICAgIHsKKyAgICAgICAgd29ybl9ieS0+QWRkUmVzaXN0YW5jZU1vZGlmaWVyKHJlc2lzdGFuY2Vfc3RyZW5ndGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVlcnlQcm9wKFBfQVJNT1VSX1RZUEUpKTsKKyAgICB9CisgICByZXR1cm4gcmVzaXN0YW5jZV9zdHJlbmd0aHM7Cit9CisKKy8vIEJlaSBlaW5lbSBRdWVyeVByb3AoUF9SRVNJU1RBTkNFX1NUUkVOR1RIUykgc29sbCBkYXMgYWt0dWVsbGUKKy8vIFJlc2lzdGVuemVuLU1hcHBpbmcgenVydWVja2dlZ2ViZW4gd2VyZGVuCitzdGF0aWMgbWFwcGluZyBfcXVlcnlfcmVzaXN0YW5jZV9zdHJlbmd0aHMoKSB7CisgIHJldHVybiAocmVzaXN0YW5jZV9zdHJlbmd0aHN8fChbXSkpOworfQorCmRpZmYgLS1naXQgYS9zdGQvYXJtb3VyL2NvbnRhaW5lcl9kZXNjcmlwdGlvbi5jIGIvc3RkL2FybW91ci9jb250YWluZXJfZGVzY3JpcHRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWU3M2FkCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL2FybW91ci9jb250YWluZXJfZGVzY3JpcHRpb24uYwpAQCAtMCwwICsxLDY3IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gYXJtb3VyL2NvbnRhaW5lcl9kZXNjcmlwdGlvbi5jIC0tIGFybW91cl9jb250YWluZXIgZGVzY3JpcHRpb24gaGFuZGxpbmcKKy8vCisvLyAkSWQ6IGNvbnRhaW5lcl9kZXNjcmlwdGlvbi5jIDYzMDYgMjAwNy0wNS0yMCAxMTozMjowM1ogWmVzc3RyYSAkCisKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgcGVkYW50aWMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKworaW5oZXJpdCAiL3N0ZC9jbG90aGluZy9jb250YWluZXJfZGVzY3JpcHRpb24iOworCisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworCisjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHRoaW5nL2Rlc2NyaXB0aW9uLmg+CisjaW5jbHVkZSA8dGhpbmcvbGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxjb250YWluZXIuaD4KKyNpbmNsdWRlIDxjb21iYXQuaD4KKyNpbmNsdWRlIDx0aGluZy9tYXRlcmlhbC5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxwbGF5ZXIvYmFzZS5oPgorCitzdHJpbmcgZGFtX2Rlc2NyKCkgeyAgIAorICAgIHN0cmluZyByZTsKKyAgICBtaXhlZCBkZXNjOworICAgIGludCBtYXhpbXVtLGRhbSxwb3M7CisKKyAgICBpZiAoIVF1ZXJ5UHJvcChQX05BTUUpIHx8ICFRdWVyeVByb3AoUF9EQU1BR0VEKSB8fCAhUXVlcnlQcm9wKFBfU0hPUlQpIHx8CisgICAgICAgICEoZGVzYz1RdWVyeVByb3AoUF9EQU1fREVTQykpIHx8ICghc3RyaW5ncChkZXNjKSAmJiAhcG9pbnRlcnAoZGVzYykpKQorICAgICAgICByZXR1cm4gIiI7CisgICAgcmUgPSBjYXBpdGFsaXplKG5hbWUoV0VSLDIpKSsiICI7CisgICAgbWF4aW11bSA9IFF1ZXJ5UHJvcChQX0FDKSsoZGFtPVF1ZXJ5UHJvcChQX0RBTUFHRUQpKTsKKyAgICBpZiAoc3RyaW5ncChkZXNjKSkKKyAgICAgICAgcmV0dXJuIChkYW0+KG1heGltdW0vMikpPyhyZStkZXNjKyIuXG4iKToiIjsKKyAgICBwb3MgPSAoc2l6ZW9mKGRlc2MpKmRhbS9tYXhpbXVtKTsKKyAgICBpZiAoc3RyaW5ncChkZXNjW3Bvc10pKQorICAgICAgICByZXR1cm4gKHJlK2Rlc2NbcG9zXSsiLlxuIik7CisgICAgcmV0dXJuICIiOworfQorCittYXBwaW5nIF9xdWVyeV9tYXRlcmlhbCgpIHsKKyAgbWl4ZWQgcmVzLGF0OworCisgIGlmIChtYXBwaW5ncChyZXM9UXVlcnkoUF9NQVRFUklBTCkpKQorICAgIHJldHVybiByZXM7CisgIGF0PVF1ZXJ5UHJvcChQX0FSTU9VUl9UWVBFKTsKKyAgc3dpdGNoKGF0KSB7CisgICAgY2FzZSBBVF9BUk1PVVI6CisgICAgY2FzZSBBVF9IRUxNRVQ6CisgICAgY2FzZSBBVF9SSU5HOgorICAgIGNhc2UgQVRfQU1VTEVUOgorICAgIGNhc2UgQVRfU0hJRUxEOgorICAgIHJldHVybiAoW01BVF9NSVNDX01FVEFMOjEwMF0pOworICAgIGNhc2UgQVRfQ0xPQUs6CisgICAgY2FzZSBBVF9UUk9VU0VSUzoKKyAgICByZXR1cm4gKFtNQVRfQ0xPVEg6MTAwXSk7CisgICAgY2FzZSBBVF9HTE9WRToKKyAgICBjYXNlIEFUX0JPT1Q6CisgICAgcmV0dXJuIChbTUFUX0xFQVRIRVI6MTAwXSk7CisgIH0KKyAgcmV0dXJuIChbTUFUX0xFQVRIRVI6MTAwXSk7Cit9CisKZGlmZiAtLWdpdCBhL3N0ZC9hcm1vdXIvZGVzY3JpcHRpb24uYyBiL3N0ZC9hcm1vdXIvZGVzY3JpcHRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTI2Mjk0Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkL2FybW91ci9kZXNjcmlwdGlvbi5jCkBAIC0wLDAgKzEsNjIgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBhcm1vdXIvZGVzY3JpcHRpb24uYyAtLSBhcm1vdXIgZGVzY3JpcHRpb24gaGFuZGxpbmcKKy8vCisvLyAkSWQ6IGRlc2NyaXB0aW9uLmMgNjMwNiAyMDA3LTA1LTIwIDExOjMyOjAzWiBaZXNzdHJhICQKKworI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworI3ByYWdtYSByYW5nZV9jaGVjaworCitpbmhlcml0ICIvc3RkL2Nsb3RoaW5nL2Rlc2NyaXB0aW9uIjsKKworLy8jZGVmaW5lIE5FRURfUFJPVE9UWVBFUworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCitzdHJpbmcgZGFtX2Rlc2NyKCkKK3sgICBzdHJpbmcgcmU7CisgICAgbWl4ZWQgZGVzYzsKKyAgICBpbnQgbWF4aW11bSxkYW0scG9zOworCisgICAgaWYgKCFRdWVyeVByb3AoUF9OQU1FKSB8fCAhUXVlcnlQcm9wKFBfREFNQUdFRCkgfHwgIVF1ZXJ5UHJvcChQX1NIT1JUKSB8fAorICAgICAgICAhKGRlc2M9UXVlcnlQcm9wKFBfREFNX0RFU0MpKSB8fCAoIXN0cmluZ3AoZGVzYykgJiYgIXBvaW50ZXJwKGRlc2MpKSkKKyAgICAgICAgcmV0dXJuICIiOworICAgIHJlID0gY2FwaXRhbGl6ZShuYW1lKFdFUiwyKSkrIiAiOworICAgIG1heGltdW0gPSBRdWVyeVByb3AoUF9BQykrKGRhbT1RdWVyeVByb3AoUF9EQU1BR0VEKSk7CisgICAgaWYgKHN0cmluZ3AoZGVzYykpCisgICAgICAgIHJldHVybiAoZGFtPihtYXhpbXVtLzIpKT8ocmUrZGVzYysiLlxuIik6IiI7CisgICAgaWYgKG1heGltdW09PWRhbSkKKyAgICAgICAgcG9zPXNpemVvZihkZXNjKS0xOworICAgIGVsc2UKKyAgICAgICAgcG9zID0gKHNpemVvZihkZXNjKSpkYW0vbWF4aW11bSk7CisgICAgaWYgKHN0cmluZ3AoZGVzY1twb3NdKSkKKyAgICAgICAgcmV0dXJuIChyZStkZXNjW3Bvc10rIi5cbiIpOworICAgIHJldHVybiAiIjsKK30KKworCittYXBwaW5nIF9xdWVyeV9tYXRlcmlhbCgpIHsKKyAgbWl4ZWQgcmVzLGF0OworCisgIGlmIChtYXBwaW5ncChyZXM9UXVlcnkoUF9NQVRFUklBTCkpKQorICAgIHJldHVybiByZXM7CisgIGF0PVF1ZXJ5UHJvcChQX0FSTU9VUl9UWVBFKTsKKyAgc3dpdGNoKGF0KSB7CisgICAgY2FzZSBBVF9BUk1PVVI6CisgICAgY2FzZSBBVF9IRUxNRVQ6CisgICAgY2FzZSBBVF9SSU5HOgorICAgIGNhc2UgQVRfQU1VTEVUOgorICAgIGNhc2UgQVRfU0hJRUxEOgorICAgIHJldHVybiAoW01BVF9NSVNDX01FVEFMOjEwMF0pOworICAgIGNhc2UgQVRfQ0xPQUs6CisgICAgY2FzZSBBVF9UUk9VU0VSUzoKKyAgICByZXR1cm4gKFtNQVRfQ0xPVEg6MTAwXSk7CisgICAgY2FzZSBBVF9HTE9WRToKKyAgICBjYXNlIEFUX0JPT1Q6CisgICAgcmV0dXJuIChbTUFUX0xFQVRIRVI6MTAwXSk7CisgIH0KKyAgcmV0dXJuIChbTUFUX0xFQVRIRVI6MTAwXSk7Cit9CmRpZmYgLS1naXQgYS9zdGQvYXJtb3VyL21vdmluZy5jIGIvc3RkL2FybW91ci9tb3ZpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTU5OGE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkL2FybW91ci9tb3ZpbmcuYwpAQCAtMCwwICsxLDE4IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gYXJtb3VyL21vdmluZy5jIC0tIGFybW91ciBtb3Zpbmcgb2JqZWN0CisvLworLy8gJElkOiBtb3ZpbmcuYyA2MzA2IDIwMDctMDUtMjAgMTE6MzI6MDNaIFplc3N0cmEgJAorCisjcHJhZ21hIHN0cmljdF90eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisjcHJhZ21hIHJhbmdlX2NoZWNrCisKKy8vIERpZXMgbXVzcyBlaWdlbnRsaWNoIG5peCB1ZWJlciBjbG90aGluZy9tb3ZpbmcgaGluYXVzZ2VoZW5kZXMga29lbm5lbi4KKy8vIERpZSBSdWVzdHVuZ2VuIGVyYmVuIGF1Y2ggYWxsZSBkaXJla3QgY2xvdGhpbmcvbW92aW5nLCBkaWVzZXMgRmlsZQorLy8gZXhpc3RpZXJ0IGVpZ2VudGxpY2ggbnVyIGZ1ZXIgZGVuIEZhbGwsIGRhc3MgTGV1dGUgYXVzc2VyaGFsYiB2b24gL3N0ZCB2b24KKy8vIGFybW91ci9tb3ZpbmcgZXJiZW4uCitpbmhlcml0ICIvc3RkL2Nsb3RoaW5nL21vdmluZyI7CisKZGlmZiAtLWdpdCBhL3N0ZC9hcm1vdXIvd2Vhci5jIGIvc3RkL2FybW91ci93ZWFyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVmODdjNQotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9hcm1vdXIvd2Vhci5jCkBAIC0wLDAgKzEsMjYwIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gYXJtb3VyL3dlYXIuYyAtLSBhcm1vdXIgc3RhbmRhcmQgb2JqZWN0CisvLworLy8gJElkOiBjb21iYXQuYyA2MjQzIDIwMDctMDMtMTUgMjE6MTA6MjFaIFplc3N0cmEgJAorCisjcHJhZ21hIHN0cmljdF90eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisjcHJhZ21hIHJhbmdlX2NoZWNrCisKK2luaGVyaXQgIi9zdGQvY2xvdGhpbmcvd2VhciI7CisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisKKyNpbmNsdWRlIDx0aGluZy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGl2aW5nL2NvbWJhdC5oPgorI2luY2x1ZGUgPGxpdmluZy9hdHRyaWJ1dGVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8YXJtb3VyLmg+CisKKy8vIFVlYmVybmltbXQgdmllbGUgd2VzZW50bGljaGUgRWlnZW5zY2hhZnRlbiBhdXMgZGVyIEtsZWlkdW5nLCBkYWhlciB3ZXJkZW4KKy8vIGhpZXIgYXVjaCBudXIgZGl2LiBGdW5rdGlvbmVuIHVlYmVyc2NocmllYmVuLCBkaWUgc2ljaCBsZWljaHQKKy8vIHVudGVyc2NoaWVkbGljaCB6dXIgS2xlaWR1bmcgdmVyaGFsdGVuLgorCisvLyBHbG9iYWxlIFZhcmlhYmxlbgorcHJpdmF0ZSBub3NhdmUgaW50ICAgICBsb2dnZWQ7CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpIHsKKyAgOjpjcmVhdGUoKTsKKyAgLy8gUF9EQU1BR0VEIGxhZXNzdCBzaWNoIHp3YXIgKG5vY2gpIHZvbiBhdXNzZW4gc2V0emVuLCBhYmVyIGJpdHRlIG51ciB1ZWJlcgorICAvLyBkaWUgaGllciBkZWZpbmllcnRlIFNldG1ldGhvZGUuCisgIC8vIFRPRE86IERpcmVrdGVzIFNldHplbiB2b24gUF9EQU1BR0VEIGVudGZlcm5lbi4KKyAgU2V0KFBfREFNQUdFRCwgUFJPVEVDVEVELCBGX01PREVfQVMpOworfQorCisvKiBXZW5uIGVpbmUgUnVlc3R1bmcgdm9tIGdsZWljaGVuIFR5cCBpbSBBcnJheSBpc3QsIGdlYmUgZGllc2UgenVydWVjay4gKi8KK3ByaXZhdGUgb2JqZWN0IFRlc3RUeXBlKG9iamVjdCAqYXJtb3VycykgeworICAgIG1peGVkIHR5cGU7CisKKyAgICAvLyBEZW4gZWlnZW5lbiBUeXAgZmVzdHN0ZWxsZW4KKyAgICB0eXBlID0gUXVlcnlQcm9wKFBfQVJNT1VSX1RZUEUpOworCisgICAgLy8gWmVyc3RvZXJ0ZSBPYmpla3RlIGF1c3NvcnRpZXJlbgorICAgIGFybW91cnMtPSh7MH0pOworCisgICAgZm9yZWFjaChvYmplY3QgYXJtb3VyOiBhcm1vdXJzKQorICAgIHsKKyAgICAgIGlmICh0eXBlPT0oYXJtb3VyLT5RdWVyeVByb3AoUF9BUk1PVVJfVFlQRSkpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBSdWVzdHVuZyB2b20gZ2xlaWNoZW4gVHlwIGdlZnVuZGVuIC0+IHp1cnVlY2tnZWJlbgorICAgICAgICAgICAgcmV0dXJuIGFybW91cjsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBLZWluZSBSdWVzdHVuZyB2b20gZ2xlaWNoZW4gVHlwIGdlZnVuZGVuLCBhbHNvIDAgenVydWVja2dlYmVuCisgICAgcmV0dXJuIDA7Cit9CisKKy8vIGxpZWZlcnQgMSB6dXJ1ZWNrLCB3ZW5uIGRlciBTcGllbGVyIGRpZSBydWVzdHVuZyBhbnppZWhlbiBkYXJmLCAwIHNvbnN0LgorcHJvdGVjdGVkIGludCBfY2hlY2tfd2Vhcl9yZXN0cmljdGlvbnMoaW50IHNpbGVudCwgaW50IGFsbCkgeworICBtaXhlZCAgIHR5cGUscmVzOworICBvYmplY3QgICphcm1vdXJzOworCisgIHR5cGUgPSBRdWVyeVByb3AoUF9BUk1PVVJfVFlQRSk7CisKKyAgLy8gRGFzIERvV2VhcigpIGRlciBLbGVpZHVuZyBwcnVlZnQgYXVmIGdlbnVlZ2VuZCBmcmVpZSBIYWVuZGUsCisgIC8vIHBydWVmdCBhYmVyIGRlbiBGYWxsIG5pY2h0IGFiLCBvYiBtYW4gaGllciBlaW4gU2NoaWxkIGhhdCwgd2FzIGxhdXQgUHJvcAorICAvLyB3ZW5pZ2VyIGFscyBlaW5lIEhhbmQgYmVsZWd0LiBEYWhlciBoaWVyIG5hY2hob2xlbiB1bmQga29ycmlnaWVyZW4uIFVuZAorICAvLyBkaXJla3QgbWFsIGxvZ2dlbiwgZGFtaXQgZGFzIGdlZml4dCB3aXJkLgorICBpZiAoICh0eXBlPT1BVF9TSElFTEQpICYmIFF1ZXJ5UHJvcChQX05SX0hBTkRTKTwxICkgeworICAgIFNldFByb3AoUF9OUl9IQU5EUywxKTsKKyAgICBsb2dfZmlsZSgiSU5WQUxJRF9TSElFTEQiLAorCXNwcmludGYoIkZpeG1lOiBBVF9TSElFTEQgaXRlbSB3aXRob3V0IHZhbGlkIFBfTlJfSEFORFM6ICVPXG4iLAorCSAgb2JqZWN0X25hbWUoKSkpOworICB9CisKKyAgYXJtb3Vycz0ob2JqZWN0KilQTC0+UXVlcnlQcm9wKFBfQVJNT1VSUykgLSAoezB9KTsKKworICAvLyBWb24gamVkZW0gUnVlc3R1bmdzdHlwIGF1c3NlciBBVF9NSVNDIGthbm4gbWFuIGltbWVyIG51ciBlaW4KKyAgLy8gVGVpbCB0cmFnZW4KKyAgaWYgKCAodHlwZSE9QVRfTUlTQykgJiYgKHJlcz1UZXN0VHlwZShhcm1vdXJzKSkgJiYgb2JqZWN0cChyZXMpKSB7CisgICAgbXNnKGJyZWFrX3N0cmluZyhzcHJpbnRmKAorCSAgIkR1IHRyYWVnc3QgYmVyZWl0cyAlcyBhbHMgU2NodXR6IGRlciBTb3J0ZSAlcy4iLAorCSAgcmVzLT5uYW1lKFdFTiwxKSwgdHlwZSksNzgsCisJICAoYWxsPyhOYW1lKFdFUikrIjogIik6MCkpLCBhbGwpOworICAgIHJldHVybigtMSk7CisgIH0KKworICAvLyBSdWVzdHVuZ2VuIHZvbSBUeXAgQVRfSUxMRUdBTCBvZGVyIHNvbGNoZSBtaXQgZWluZW0gZnVlciBpaHJlbgorICAvLyBSdWVzdHVuZ3N0eXAgenUgaG9oZW4gU2NodXR6d2VydCBrb2VubmVuIG5pY2h0IGFuZ2V6b2dlbiB3ZXJkZW4KKyAgaWYgKCAodHlwZT09QVRfSUxMRUdBTCkgfHwgKFF1ZXJ5UHJvcChQX0FDKT5WQUxJRF9BUk1PVVJfQ0xBU1NbdHlwZV0pKSB7CisgICAgd3JpdGUoIlVuZ3VlbHRpZ2VyIFJ1ZXN0dW5nc3R5cCwgYml0dGUgRXJ6bWFnaWVyIHZlcnN0YWVuZGlnZW4uXG4iKTsKKyAgICAgICAgIi9wL2RhZW1vbi9ydWVzdHVuZ2VuIi0+UmVnaXN0ZXJBcm1vdXIoKTsgICAgICAKKyAgICByZXR1cm4oLTIpOworICB9CisKKyAgLy8gUnVlc3R1bmdlbiwgZGllIGVpbiBvZGVyIG1laHJlcmUgQXR0cmlidXQgdmVyYWVuZGVybiB1bmQgZ2VnZW4KKyAgLy8gZGFzIGdlc2V0enRlIExpbWl0IHZlcnN0b3NzZW4sIGhhYmVuIGtlaW5lIFdpcmt1bmcgYmV6dWVnbGljaCBkZXIKKyAgLy8gQXR0cmlidXRlLiBEaWVzIGdpYnQgYWJlciBudXIgbmUgTWVsZHVuZyBhdXMsIGFuZ2V6b2dlbiB3ZXJkZW4gZGFyZiBzaWUKKyAgLy8gdHJvdHpkZW0uCisgIGlmIChtYXBwaW5ncChyZXM9UXVlcnlQcm9wKFBfTV9BVFRSX01PRCkpICYmIFBMLT5UZXN0TGltaXRWaW9sYXRpb24ocmVzKSApIHsKKyAgICB3cml0ZShicmVha19zdHJpbmcoc3ByaW50ZigKKyAgICAgICAgICAiSXJnZW5kZXR3YXMgYW4gRGVpbmVyIEF1c3J1ZXN0dW5nIHZlcmhpbmRlcnQsIGRhc3MgRHUgRGljaCBtaXQgIgorICAgICAgICAgICIlcyBzbyByaWNodGlnIHdvaGwgZnVlaGxzdC4iLG5hbWUoV0VNLDEpKSw3OCwKKyAgICAgICAgICAoYWxsPyhOYW1lKFdFUikrIjogIik6MCkpKTsKKyAgfQorCisgIC8vIGRhbm4gbWFsIGF1cyBkZXIgS2xlaWR1bmcgZ2VlcmJ0ZSBQcnVlZnVuZ2VuIGF1c2Z1ZWhyZW4gdW5kIEVyZ2VibmlzCisgIC8vIGxpZWZlcm4uCisgIHJldHVybiA6Ol9jaGVja193ZWFyX3Jlc3RyaWN0aW9ucyhzaWxlbnQsYWxsKTsKK30KKworcHJvdGVjdGVkIHZvaWQgX2luZm9ybXdlYXIoaW50IHNpbGVudCwgaW50IGFsbCkgeworCisgIC8vIFJ1ZXN0dW5nZW4ga29lbm5lbiBSZXNpc3RlbnplbiBiZWVpbmZsdXNzZW4KKyAgUEwtPkFkZFJlc2lzdGFuY2VNb2RpZmllcihRdWVyeVByb3AoUF9SRVNJU1RBTkNFX1NUUkVOR1RIUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVlcnlQcm9wKFBfQVJNT1VSX1RZUEUpKTsKKworICAvLyBSdWVzdHVuZ2VuIGtvZW5uZW4gQXR0cmlidXRlIGFlbmRlcm4vYmxvY2tpZXJlbi4gQWxzbyBtdWVzc2VuIGRpZXNlCisgIC8vIG5hY2ggZGVtIEFuemllaGVuIGFrdHVhbGlzaWVydCB3ZXJkZW4KKyAgUEwtPnJlZ2lzdGVyX21vZGlmaWVyKE1FKTsKKyAgUEwtPlVwZGF0ZUF0dHJpYnV0ZXMoKTsKKworICAvLyBQX1RPVEFMX0FDIGltIFRyYWVnZXIgdXBkYXRlbiAoZnVlciBRdWVyeSgpcykKKyAgUEwtPlF1ZXJ5UHJvcChQX1RPVEFMX0FDKTsKKworICAvLyBBbGxlIFJ1ZXN0dW5nZW4gd2VyZGVuIGltIGF3bWFzdGVyIHJlZ2lzdHJpZXJ0LCBzb2JhbGQgc2llIHZvbgorICAvLyBlaW5lbSBTcGllbGVyIGdlenVlY2t0IHdlcmRlbgorICBpZiAoIWxvZ2dlZCAmJiBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKFBMKSkgeworICAgIGNhbGxfb3RoZXIoIi9zZWN1cmUvYXdtYXN0ZXIiLCJSZWdpc3RlckFybW91ciIsTUUpOworICAgIGxvZ2dlZD0xOworICB9CisgIC8vIG5vY2ggZGFzIGF1cyBkZXIgS2xlaWR1bmcgcnVmZW4sIGRhbWl0IGRpZSBBbnppZWhtZWxkdW5nZW4gYXVjaCBrb21tZW4uCisgIC8vIGF1c3NlcmRlbSBsYWV1ZnQgZGFzIEFuc3Rvc3NlcyB2b24gSW5mb3JtV2VhcigpIHZvbiBkb3J0LgorICA6Ol9pbmZvcm13ZWFyKHNpbGVudCxhbGwpOworfQorCisKK3Byb3RlY3RlZCBpbnQgX2NoZWNrX3Vud2Vhcl9yZXN0cmljdGlvbnMob2JqZWN0IHdvcm5fYnksIGludCBzaWxlbnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsKSB7CisgIC8vIGxpZWZlcnQgPj0wIHp1cmVjaywgd2VubiBkaWUgS2xlaWR1bmcvUnVlc3R1bmcgYXVzZ2V6b2dlbiB3ZXJkZW4ga2FubiwgCisgIC8vIDwwIHNvbnN0LgorCisgIC8vIFNjaGlsZGUgYmVsZWdlbiAobWluZGVzdGVucykgZWluZSBIYW5kLiBIbmdsLiBXZW5uIG1hbiBkaWVzZW4gYmxvZWRlbgorICAvLyBDaGVjayBuaWNodCBtYWNoZW4gbXVlc3N0ZSwga29lbm50ZSBtYW4gc2ljaCBkaWUgZ2FuemUgRnVua3Rpb24gc3BhcmVuLgorICAvLyBIbXBmZ3JtcGZsLiBBY2hqYSwgcmFpc2VfZXJyb3IoKSwgd2VpbCBkYXMgZWlnZW50bGljaCBqYSBuaWNodCB2b3Jrb21tZW4KKyAgLy8gc29sbHRlIHVuZCBnZWZpeHQgd2VyZGVuIHNvbGwuIERhcyBnZWh0IG5hZW1saWNoIG51ciwgd2VubiBqZW1hbmQgZGllc2UKKyAgLy8gUHJvcCBnZWFlbmRlcnQsIHdhZWhyZW5kIGRlciBTcGllbGVyIGRhcyBTY2hpbGQgZ2V0cmFnZW4gaGF0dGUuCisgIGlmICggKFF1ZXJ5UHJvcChQX0FSTU9VUl9UWVBFKT09QVRfU0hJRUxEKSAmJiAKKyAgICAgIFF1ZXJ5UHJvcChQX05SX0hBTkRTKTwxICkgeworICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIkZpeG1lOiBBVF9TSElFTEQgYmVpbSBBdXN6aWVoZW4gb2huZSBQX05SX0hBTkRTOiAlTyIsCisJICBvYmplY3RfbmFtZSgpKSk7CisgIH0KKyAgCisgIC8vIEF1c3ppZWhjaGVjayBkZXIgS2xlaWR1bmcgbWFjaGVuCisgIHJldHVybiA6Ol9jaGVja191bndlYXJfcmVzdHJpY3Rpb25zKHdvcm5fYnksc2lsZW50LGFsbCk7Cit9CisKK3Byb3RlY3RlZCB2b2lkIF9pbmZvcm11bndlYXIob2JqZWN0IHdvcm5fYnksIGludCBzaWxlbnQsIGludCBhbGwpIHsKKyAgbWl4ZWQgcmVzOworICAvLyBHZXNldHp0ZSBSZXNpc3RlbnplbiBsb2VzY2hlbgorICB3b3JuX2J5LT5SZW1vdmVSZXNpc3RhbmNlTW9kaWZpZXIocmVzPVF1ZXJ5UHJvcChQX0FSTU9VUl9UWVBFKSk7CisgIAorICAvLyBSdWVzdHVuZ2VuIGtvZW5uZW4gQXR0cmlidXRlIGFlbmRlcm4vYmxvY2tpZXJlbi4gQWxzbyBtdWVzc2VuIGRpZXNlCisgIC8vIG5hY2ggZGVtIEF1c3ppZWhlbiBha3R1YWxpc2llcnQgd2VyZGVuCisgIHdvcm5fYnktPmRlcmVnaXN0ZXJfbW9kaWZpZXJzKE1FKTsKKyAgd29ybl9ieS0+VXBkYXRlQXR0cmlidXRlcygpOworCisgIC8vIFBfVE9UQUxfQUMgaW0gVHJhZWdlciB1cGRhdGVuCisgIHdvcm5fYnktPlF1ZXJ5UHJvcChQX1RPVEFMX0FDKTsKKworICAvLyBkaWUgZ2VlcmJ0ZSBGdW5rdGlvbiBhdXMgZGVyIEtsZWluZHVuZyBnaWJ0IG5vY2ggbWVsZHVuZ2VuIGF1cyB1bmQgcnVmdAorICAvLyBJbmZvcm11bndlYXIoKS4KKyAgOjpfaW5mb3JtdW53ZWFyKHdvcm5fYnksc2lsZW50LGFsbCk7Cit9CisKKy8vIEZ1bmt0aW9uLCBkaWUgZGFzICJ0cmFnZSIvInppZWhlICogYW4iLUtvbW1hbmRvIGF1c3dlcnRldAordmFyYXJncyBpbnQgZG9fd2VhcihzdHJpbmcgc3RyLCBpbnQgc2lsZW50KSB7ICAKKyAgaW50IGFsbDsgIAorCisgIC8vIEhhdCBkZXIgU3BpZWxlciAidHJhZ2UgYWxsZXMiIGVpbmdlZ2ViZW4/CisgIGFsbD0oc3RyPT0iYWxsZXMiIHx8IHN0cj09ImFsbGUgcnVlc3R1bmdlbiIpOworICAKKyAgcmV0dXJuKF9kb193ZWFyKHN0cixzaWxlbnQsYWxsKSk7Cit9CisKKy8vIERpZSBGdW5rdGlvbiwgZGllIGRhcyAiemllaGUgKiBhdXMiLUtvbW1hbmRvIGF1c3dlcnRldAordmFyYXJncyBpbnQgZG9fdW53ZWFyKHN0cmluZyBzdHIsIGludCBzaWxlbnQpIHsKKyAgaW50IGFsbDsKKworICBhbGw9KHN0cj09ImFsbGVzIiB8fCBzdHI9PSJhbGxlIHJ1ZXN0dW5nZW4iKTsKKyAgcmV0dXJuKF9kb191bndlYXIoc3RyLHNpbGVudCxhbGwpKTsKK30KKworCisvLyBPYmpla3RlLCBkaWUgZGllIEJlc2NoYWVkaWd1bmcgZWluZXIgUnVlc3R1bmcgZHVyY2ggZGlyZWt0ZXMgU2V0emVuIHZvbgorLy8gUF9EQU1BR0VEIGR1cmNoZnVlaHJlbiwgd2VyZGVuIGltIGF3bWFzdGVyIGdlbG9nZ3QKK3N0YXRpYyBtaXhlZCBfc2V0X2l0ZW1fZGFtYWdlZChtaXhlZCBhcmcpIHsKKyAgICBpZiAoYXJnICYmICFpbnRwKGFyZykpCisgICAgeworICAgICAgICByZXR1cm4gUXVlcnkoUF9EQU1BR0VELCBGX1ZBTFVFKTsKKyAgICB9CisKKyAgICBpZiAocHJldmlvdXNfb2JqZWN0KDEpKQorICAgICAgY2FsbF9vdGhlcigiL3NlY3VyZS9hd21hc3RlciIsIlJlZ2lzdGVyRGFtYWdlciIsCisgICAgICAgICAgICBwcmV2aW91c19vYmplY3QoMSksUXVlcnlQcm9wKFBfREFNQUdFRCksYXJnKTsgCisKKyAgICByZXR1cm4gU2V0KFBfREFNQUdFRCwgYXJnLCBGX1ZBTFVFKTsKK30KKworLy8gV2lsbCBtYW4gZWluZSBSdWVzdHVuZyBiZXNjaGFlZGlnZW4gb2RlciByZXBhcmllcmVuLCBzbyBtYWNodCBtYW4gZGFzCisvLyBhbSBiZXN0ZW4gdWViZXIgZGllIEZ1bmt0aW9uIERhbWFnZShhcmd1bWVudCkuIFBvc2l0aXZlIEFyZ3VtZW50ZQorLy8gYmVkZXV0ZW4gZWluZSBCZXNjaGFlZGlndW5nLCBuZWdhdGl2ZSBlaW5lIFJlcGFyYXR1ci4gRGVyIFJ1ZWNrZ2FiZXdlcnQKKy8vIGlzdCBkaWUgd2lya2xpY2ggZHVyY2hnZWZ1ZWhydGUgQWVuZGVydW5nIGRlcyBCZXNjaGFlZGlndW5nc3dlcnRlcworaW50IERhbWFnZShpbnQgbmV3X2RhbSkgeyAgIAorICBpbnQgICAgYWMsbWF4aW11bSxvbGRfZGFtOworICBvYmplY3QgdzsKKworICBpZiAoIW5ld19kYW0gfHwgIWludHAobmV3X2RhbSkpIHsgICAgICAKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmICggKGFjPVF1ZXJ5UHJvcChQX0FDKSk8PTAgJiYgKG5ld19kYW0+MCkgKSB7CisgICAgLy8gU29uc3Qgd3VlcmRlIEJlc2NoYWVkaWd1bmcgenVyIFJlcGFyYXR1ciBmdWVocmVuCisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLyBNaW4tQUMgdW5kIE1BWF9BQyBiZWFjaHRlbgorICBpZiAoKGFjLW5ld19kYW0pIDwgTUlOX0FSTU9VUl9DTEFTUykgeyAgICAgIAorICAgIG5ld19kYW0gPSBhYy1NSU5fQVJNT1VSX0NMQVNTOworICB9CisgIGVsc2UgaWYgKChhYy1uZXdfZGFtKSA+CisgICAgKG1heGltdW09VkFMSURfQVJNT1VSX0NMQVNTW1F1ZXJ5UHJvcChQX0FSTU9VUl9UWVBFKV0pKSB7ICAgICAgCisgICAgbmV3X2RhbSA9IGFjLW1heGltdW07CisgIH0KKworICAvLyBOaWUgbWVociBhbHMgMTAwJSByZXBhcmllcmVuCisgIGlmICggKChvbGRfZGFtPVF1ZXJ5UHJvcChQX0RBTUFHRUQpKTwtbmV3X2RhbSkgJiYgKG5ld19kYW08MCkgKSB7CisgICAgbmV3X2RhbT0tb2xkX2RhbTsKKyAgfQorCisgIC8vIEFlbmRlcnVuZ2VuIGFuIGRlciBSdWVzdHVuZ3NrbGFzc2UgdW5kIGRlbSBCZXNjaGFlZGlndW5nc3dlcnQKKyAgLy8gZHVyY2hmdWVocmVuCisgIFNldFByb3AoUF9BQywoYWMtbmV3X2RhbSkpOworICAvLyBlaWdlbmUgU2V0LU1ldGhvZGUgdW1nZWhlbgorICBTZXQoUF9EQU1BR0VELChvbGRfZGFtK25ld19kYW0pLEZfVkFMVUUpOworCisgIC8vIFBfVE9UQUxfQUMgaW0gVHJhZWdlciB1cGRhdGVuLCB3ZW5uIHZvcmhhbmRlbgorICBpZiAob2JqZWN0cCh3PVF1ZXJ5UHJvcChQX1dPUk4pKSkKKyAgICB3LT5RdWVyeVByb3AoUF9UT1RBTF9BQyk7CisKKyAgLy8gUnVlY2tnYWJld2VydDogRHVyY2hnZWZ1ZWhydGUgQWVuZGVydW5nIGFuIFBfREFNQUdFCisgIHJldHVybiBuZXdfZGFtOworfQorCitwdWJsaWMgc3RhdHVzIElzQXJtb3VyKCkge3JldHVybiAxO30KK3B1YmxpYyBzdGF0dXMgSXNDbG90aGluZygpIHtyZXR1cm4gMDt9CisKZGlmZiAtLWdpdCBhL3N0ZC9hcm1vdXJIRy5jIGIvc3RkL2FybW91ckhHLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUyZTc1YwotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9hcm1vdXJIRy5jCkBAIC0wLDAgKzEsNTkgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBhcm1vdXJIRy5jIC0tIGFybW91ciBzdGFuZGFyZCBvYmplY3QgZm9yIGhhdHMgYW5kIGdsYXNzZXMKKy8vCisvLyAkSWQ6IGFybW91ckhHLmMgNzgwNCAyMDExLTA3LTEwIDIwOjM3OjUyWiBaZXNzdHJhICQKKworI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworI3ByYWdtYSByYW5nZV9jaGVjaworCitpbmhlcml0ICIvc3RkL2FybW91ciI7CisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8dGhpbmcvY29tbWFuZHMuaD4KKyN1bmRlZiBORUVEX1BST1RPVFlQRVMKKworI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorCitpbnQgc2V0emVuKHN0cmluZyBzKTsKKwordm9pZCBjcmVhdGUoKSB7CisgICAgOjpjcmVhdGUoKTsKKyAgICBBZGRDbWQoKHsic2V0eiIsInNldHplIn0pLCJzZXR6ZW4iKTsKK30KKwordmFyYXJncyB2b2lkIGRvV2Vhck1lc3NhZ2UoIGludCBhbGwgKSB7CisgIGlmKCBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKFBMKSApIHsKKyAgICB3cml0ZSggIkR1IHNldHp0ICIgKyBuYW1lKFdFTiwxKSArICIgYXVmLlxuIiApOworICB9CisgIGlmIChvYmplY3RwKGVudmlyb25tZW50KCkpICYmIG9iamVjdHAoZW52aXJvbm1lbnQoZW52aXJvbm1lbnQoKSkpKQorICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudChlbnZpcm9ubWVudCgpKSwKKwljYXBpdGFsaXplKChzdHJpbmcpUEwtPm5hbWUoV0VSKSkgKyAiIHNldHp0ICIgKyBuYW1lKFdFTiwwKSArIAorCSIgYXVmLlxuIik7Cit9CisKK3ZhcmFyZ3Mgdm9pZCBkb1Vud2Vhck1lc3NhZ2UoIG9iamVjdCB3b3JuX2J5LCBpbnQgYWxsICkgeworICBpZiggcXVlcnlfb25jZV9pbnRlcmFjdGl2ZSh3b3JuX2J5KSApIHsKKyAgICB0ZWxsX29iamVjdCh3b3JuX2J5LCAgIkR1IHNldHp0ICIgKyBuYW1lKFdFTiwxKSArICIgYWIuXG4iICk7CisgIH0KKyAgdGVsbF9yb29tKGVudmlyb25tZW50KHdvcm5fYnkpLCAKKwkgICAgKGNhcGl0YWxpemUoKHN0cmluZyl3b3JuX2J5LT5uYW1lKFdFUikpKSArICIgc2V0enQgIiArCisJICAgIG5hbWUoV0VOLDApICsgIiBhYi5cbiIsICh7d29ybl9ieX0pKTsKK30KKworaW50IHNldHplbihzdHJpbmcgc3RyKSB7CisgIHN0cmluZyBvYjsKKworICBpZighc3RyKQorICAgIHJldHVybiAwOworICBpZihzc2NhbmYoc3RyLCAiJXMgYXVmIiwgb2IpPT0xICkKKyAgICByZXR1cm4gX2RvX3dlYXIob2IsIDAsIDApOworICBpZihzc2NhbmYoc3RyLCAiJXMgYWIiLCBvYik9PTEgKQorICAgIHJldHVybiBfZG9fdW53ZWFyKG9iLCAwLCAwKTsKKyAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL3N0ZC9hcm1vdXJfY29udGFpbmVyLmMgYi9zdGQvYXJtb3VyX2NvbnRhaW5lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYTIyZDIKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvYXJtb3VyX2NvbnRhaW5lci5jCkBAIC0wLDAgKzEsNTQgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vLAorLy8gYXJtb3VyX2NvbnRhaW5lci5jIC0tIFJ1ZXN0dW5nLCBpbiBkaWUgbWFuIHdhcyByZWluc3RlY2tlbiBrYW5uCisvLworLy8gJElkOiBhcm1vdXJfY29udGFpbmVyLmMgNzgwNCAyMDExLTA3LTEwIDIwOjM3OjUyWiBaZXNzdHJhICQKKworI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworI3ByYWdtYSByYW5nZV9jaGVjaworCitpbmhlcml0ICIvc3RkL3RoaW5nL3Byb3BlcnRpZXMiOworaW5oZXJpdCAiL3N0ZC90aGluZy9jb21tYW5kcyI7Citpbmhlcml0ICIvc3RkL3RoaW5nL2xhbmd1YWdlIjsKK2luaGVyaXQgIi9zdGQvdGhpbmcvZW52Y2hrIjsKK2luaGVyaXQgIi9zdGQvY29udGFpbmVyL2xpZ2h0IjsKK2luaGVyaXQgIi9zdGQvY29udGFpbmVyL3Jlc3RyaWN0aW9ucyI7Citpbmhlcml0ICIvc3RkL2NvbnRhaW5lci9pbnZlbnRvcnkiOworaW5oZXJpdCAiL3N0ZC9jb250YWluZXIvaXRlbXMiOworaW5oZXJpdCAiL3N0ZC9jbG90aGluZy9tb3ZpbmciOworaW5oZXJpdCAiL3N0ZC9hcm1vdXIvd2VhciI7Citpbmhlcml0ICIvc3RkL2FybW91ci9jb21iYXQiOworaW5oZXJpdCAiL3N0ZC9hcm1vdXIvY29udGFpbmVyX2Rlc2NyaXB0aW9uIjsKKworLy8jZGVmaW5lIE5FRURfUFJPVE9UWVBFUworCisjaW5jbHVkZSA8Y29udGFpbmVyLmg+CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpIHsKKyAgcHJvcGVydGllczo6Y3JlYXRlKCk7CisgIGNvbW1hbmRzOjpjcmVhdGUoKTsKKyAgbGlnaHQ6OmNyZWF0ZSgpOworICBjb250YWluZXJfZGVzY3JpcHRpb246OmNyZWF0ZSgpOworICByZXN0cmljdGlvbnM6OmNyZWF0ZSgpOworICBpdGVtczo6Y3JlYXRlKCk7CisgIHdlYXI6OmNyZWF0ZSgpOworICBjb21iYXQ6OmNyZWF0ZSgpOworICBlbnZjaGs6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfQ09OVEFJTkVSLDEpOworICBTZXRQcm9wKFBfUFJFUE9TSVRJT04sICJpbiIpOworICBTZXRQcm9wKFBfU09VUkNFX1BSRVBPU0lUSU9OLCAiYXVzIik7CisgIFNldFByb3AoUF9ERVNUX1BSRVBPU0lUSU9OLCAiaW4iKTsKKyAgQWRkSWQoIkRpbmciKTsKK30KKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlX3N1cGVyKCkgeworICBzZXRfbmV4dF9yZXNldCgtMSk7Cit9CisKK3ZvaWQgcmVzZXQoKSAgeworICBpdGVtczo6cmVzZXQoKTsKK30KKwpkaWZmIC0tZ2l0IGEvc3RkL2Nsb3RoaW5nLmMgYi9zdGQvY2xvdGhpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDI1OTg0Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkL2Nsb3RoaW5nLmMKQEAgLTAsMCArMSw1NCBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGFybW91ci5jIC0tIGFybW91ciBzdGFuZGFyZCBvYmplY3QKKy8vCisvLyAkSWQ6IGFybW91ci5jLHYgMy44IDIwMDMvMDgvMjUgMDk6MzY6MDQgUmlrdXMgRXhwICQKKworI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBwZWRhbnRpYworCitpbmhlcml0ICIvc3RkL3RoaW5nL3Byb3BlcnRpZXMiOworaW5oZXJpdCAiL3N0ZC90aGluZy9jb21tYW5kcyI7Citpbmhlcml0ICIvc3RkL3RoaW5nL3Jlc3RyaWN0aW9ucyI7Citpbmhlcml0ICIvc3RkL3RoaW5nL2xpZ2h0IjsKK2luaGVyaXQgIi9zdGQvY2xvdGhpbmcvZGVzY3JpcHRpb24iOworaW5oZXJpdCAiL3N0ZC9jbG90aGluZy9tb3ZpbmciOworaW5oZXJpdCAiL3N0ZC9jbG90aGluZy93ZWFyIjsKK2luaGVyaXQgIi9zdGQvdGhpbmcvbGFuZ3VhZ2UiOworaW5oZXJpdCAiL3N0ZC90aGluZy9lbnZjaGsiOworCisvLyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxjb21iYXQuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgIHByb3BlcnRpZXM6OmNyZWF0ZSgpOworICBjb21tYW5kczo6Y3JlYXRlKCk7CisgIGxpZ2h0OjpjcmVhdGUoKTsKKyAgcmVzdHJpY3Rpb25zOjpjcmVhdGUoKTsKKyAgZGVzY3JpcHRpb246OmNyZWF0ZSgpOworICB3ZWFyOjpjcmVhdGUoKTsKKyAgZW52Y2hrOjpjcmVhdGUoKTsKKyAgQWRkSWQoIkRpbmciKTsKK30KKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlX3N1cGVyKCkgeworICBzZXRfbmV4dF9yZXNldCgtMSk7Cit9CisKKy8vIHp1bSBVZWJlcnNjaHJlaWJlbiwgZGFtaXQgZXMgbmljaHQgYnVnZ3QsIHdlbm4gTGV1dGUgKHdpZSBnZXd1ZW5zY2h0KSBpbiAKKy8vIGlocmVuIE9iamVrdGVuIDo6cmVzZXQoKSBhdWZydWZlbi4KK3ZvaWQgcmVzZXQoKSB7Cit9CisKK2ludCBJc0Nsb3RoaW5nKCkge3JldHVybiAxO30KKwpkaWZmIC0tZ2l0IGEvc3RkL2Nsb3RoaW5nL2NvbnRhaW5lcl9kZXNjcmlwdGlvbi5jIGIvc3RkL2Nsb3RoaW5nL2NvbnRhaW5lcl9kZXNjcmlwdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3OTQyYmMKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvY2xvdGhpbmcvY29udGFpbmVyX2Rlc2NyaXB0aW9uLmMKQEAgLTAsMCArMSwxMzcgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBjbG90aGluZy9jb250YWluZXJfZGVzY3JpcHRpb24uYyAtLSBjbG90aGluZ19jb250YWluZXIgZGVzY3JpcHRpb24gaGFuZGxpbmcKKy8vCisvLyAkSWQ6IGNvbnRhaW5lcl9kZXNjcmlwdGlvbi5jIDYxOTggMjAwNy0wMi0xMyAyMzozOTo0M1ogWmVzc3RyYSAkCisKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKworaW5oZXJpdCAiL3N0ZC90aGluZy9kZXNjcmlwdGlvbiI7CisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisKKyNpbmNsdWRlIDx0aGluZy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8dGhpbmcvZGVzY3JpcHRpb24uaD4KKyNpbmNsdWRlIDx0aGluZy9sYW5ndWFnZS5oPgorI2luY2x1ZGUgPGNvbnRhaW5lci5oPgorI2luY2x1ZGUgPGNvbWJhdC5oPgorI2luY2x1ZGUgPHRoaW5nL21hdGVyaWFsLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPHBsYXllci9iYXNlLmg+CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX1RSQU5TUEFSRU5ULCAxKTsKKyAgQWRkSWQoIkNvbnRhaW5lciIpOworfQorCitzdHJpbmcgZGFtX2Rlc2NyKCkKK3sgICBzdHJpbmcgcmU7CisgICAgbWl4ZWQgZGVzYzsKKyAgICBpbnQgbWF4aW11bSxkYW0scG9zOworCisgICAgaWYgKCFRdWVyeVByb3AoUF9OQU1FKSB8fCAhUXVlcnlQcm9wKFBfREFNQUdFRCkgfHwgIVF1ZXJ5UHJvcChQX1NIT1JUKSB8fAorICAgICAgICAhKGRlc2M9UXVlcnlQcm9wKFBfREFNX0RFU0MpKSB8fCAoIXN0cmluZ3AoZGVzYykgJiYgIXBvaW50ZXJwKGRlc2MpKSkKKyAgICAgICAgcmV0dXJuICIiOworICAgIHJlID0gY2FwaXRhbGl6ZShuYW1lKFdFUiwyKSkrIiAiOworICAgIG1heGltdW0gPSBRdWVyeVByb3AoUF9BQykrKGRhbT1RdWVyeVByb3AoUF9EQU1BR0VEKSk7CisgICAgaWYgKHN0cmluZ3AoZGVzYykpCisgICAgICAgIHJldHVybiAoZGFtPihtYXhpbXVtLzIpKT8ocmUrZGVzYysiLlxuIik6IiI7CisgICAgcG9zID0gKHNpemVvZihkZXNjKSpkYW0vbWF4aW11bSk7CisgICAgaWYgKHN0cmluZ3AoZGVzY1twb3NdKSkKKyAgICAgICAgcmV0dXJuIChyZStkZXNjW3Bvc10rIi5cbiIpOworICAgIHJldHVybiAiIjsKK30KKworc3RyaW5nIHNob3J0KCkKK3sgICBzdHJpbmcgczsKKyAgICBpZighKHM9cHJvY2Vzc19zdHJpbmcoUXVlcnlQcm9wKFBfU0hPUlQpKSkpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBzKyhRdWVyeVByb3AoUF9XT1JOKT8iIChhbmdlem9nZW4pLlxuIjoiLlxuIik7Cit9CisKK3ZhcmFyZ3Mgc3RyaW5nIGxvbmcoaW50IG1vZGUpCit7ICAgc3RyaW5nIGRlc2NyLCBpbnZfZGVzY3I7CisKKyAgICBkZXNjcj0ocHJvY2Vzc19zdHJpbmcoUXVlcnlQcm9wKFBfTE9ORyl8fCIiKSArIChkYW1fZGVzY3IoKXx8IiIpKTsKKyAgICBpZiAoIVF1ZXJ5UHJvcChQX1RSQU5TUEFSRU5UKSkKKyAgICAgIHJldHVybiBkZXNjcjsKKworICAgIGludl9kZXNjciA9IG1ha2VfaW52bGlzdChQTCwgYWxsX2ludmVudG9yeShNRSksIG1vZGUgKTsKKyAgICBpZiAoIGludl9kZXNjciAhPSAiIiApCisgICAgICAgIGRlc2NyICs9IGNhcGl0YWxpemUoUXVlcnlQcm9ub3VuKFdFUikpICsgIiBlbnRoYWVsdDpcbiIgKyBpbnZfZGVzY3I7CisgICAgcmV0dXJuIGRlc2NyOworfQorCittYXBwaW5nIF9xdWVyeV9tYXRlcmlhbCgpIHsKKyAgbWl4ZWQgcmVzLGF0OworCisgIGlmIChtYXBwaW5ncChyZXM9UXVlcnkoUF9NQVRFUklBTCkpKQorICAgIHJldHVybiByZXM7CisgIGF0PVF1ZXJ5UHJvcChQX0FSTU9VUl9UWVBFKTsKKyAgc3dpdGNoKGF0KSB7CisgICAgY2FzZSBBVF9BUk1PVVI6CisgICAgY2FzZSBBVF9IRUxNRVQ6CisgICAgY2FzZSBBVF9SSU5HOgorICAgIGNhc2UgQVRfQU1VTEVUOgorICAgIGNhc2UgQVRfU0hJRUxEOgorICAgIHJldHVybiAoW01BVF9NSVNDX01FVEFMOjEwMF0pOworICAgIGNhc2UgQVRfQ0xPQUs6CisgICAgY2FzZSBBVF9UUk9VU0VSUzoKKyAgICByZXR1cm4gKFtNQVRfQ0xPVEg6MTAwXSk7CisgICAgY2FzZSBBVF9HTE9WRToKKyAgICBjYXNlIEFUX0JPT1Q6CisgICAgcmV0dXJuIChbTUFUX0NMT1RIOjEwMF0pOworICB9CisgIHJldHVybiAoW01BVF9DTE9USDoxMDBdKTsKK30KKworLy8gZmxhZ3M6IDEgLSB3aXphcmQsIDIgLSBkb24ndCBjb2xsZWN0IGVxdWFsIG9iamVjdHMgJworLy8gZmxhZ3M6IDQgLSBkb24ndCBhcHBlbmQgaW5mb3MgZm9yIHdpemFyZHMKK3ByaXZhdGUgdm9pZCBzdHJpbmdlbml6ZShtaXhlZCBvYmosIGludCBmbGFncywgbWl4ZWQgb2JqcywgbWl4ZWQgaW5mbykKK3sKKyAgc3RyaW5nIGlkLCB0bXA7CisgIGludCBpZHg7CisgIHRtcCA9IGNhcGl0YWxpemUob2JqLT5zaG9ydCgpfHwiIilbMC4uPDJdCisgICAgICArICghKGZsYWdzICYgNCkgJiYgKGZsYWdzICYgMSkgPyAiIFsiK29iamVjdF9uYW1lKG9iaikrIl0iIDogIiIpOworICBpZihmbGFncyAmIDMgfHwgbGl2aW5nKG9iaikpIGlkID0gb2JqZWN0X25hbWUob2JqKTsKKyAgZWxzZQorICAgIGlkID0gZXhwbG9kZShvYmplY3RfbmFtZShvYmopLCAiIyIpWzBdICsgdG1wOworICBpZigoaWR4ID0gbWVtYmVyKG9ianMsIGlkKSkgPT0gLTEpCisgIHsKKyAgICBvYmpzICs9ICh7IGlkIH0pOworICAgIGluZm8gKz0gKHsgKHsgdG1wLCAxLCBvYmp9KSB9KTsKKyAgfQorICBlbHNlCisgICAgaW5mb1tpZHhdWzFdKys7Cit9CisKK3ByaXZhdGUgc3RyaW5nIGNvbGxlY3QobWl4ZWQgb2JqKQoreworICBpZighc2l6ZW9mKG9ialswXSkpIHJldHVybiAwOworICByZXR1cm4gb2JqWzBdICsgKG9ialsxXSA+IDEgPyAiICgiK29ialsxXSsiKSIgOiAiIik7Cit9CisKKy8vIGZsYWdzOiAxIC0gcmV0dXJuIGFycmF5LCAyIC0gZG9uJ3QgY29sbGVjdCBlcXVhbCBvYmplY3RzICcKKy8vIGZsYWdzOiA0IC0gZG9uJ3QgYXBwZW5kIGluZm9zIGZvciB3aXphcmRzCit2YXJhcmdzIG1peGVkIG1ha2VfaW52bGlzdChvYmplY3Qgdmlld2VyLCBtaXhlZCBpbnYsIGludCBmbGFncykKK3sKKyAgaW50IGlzd2l6OworICBtaXhlZCBvYmpzLCBpbmZvOworICBzdHJpbmcgZGVzY3I7CisKKyAgaXN3aXogPSBJU19MRUFSTkVSKCB2aWV3ZXIgKSAmJiB2aWV3ZXItPlF1ZXJ5UHJvcChQX1dBTlRTX1RPX0xFQVJOKTsKKyAgZGVzY3IgPSAiIjsgb2JqcyA9ICh7fSk7IGluZm8gPSAoe30pOworICBtYXAoaW52LCAjJ3N0cmluZ2VuaXplLyonKi8sIGlzd2l6IHwgKGZsYWdzICYgMikgfCAoZmxhZ3MgJiA0KSwgJm9ianMsICZpbmZvKTsKKyAgaWYoZmxhZ3MgJiAxKSByZXR1cm4gaW5mbzsKKyAgaW52ID0gbWFwKGluZm8sICMnY29sbGVjdC8qJyovKSAtICh7IDAgfSk7CisgIGlmKCFzaXplb2YoaW52KSkgcmV0dXJuICIiOworICByZXR1cm4gc3ByaW50ZigiJSIrKHNpemVvZihpbnYpID4gNiA/ICIjIiA6ICI9IikrIi03OHMiLAorICAgICAgICAgICAgICAgICBpbXBsb2RlKGludiwgIlxuIikpICsgIlxuIjsKK30KZGlmZiAtLWdpdCBhL3N0ZC9jbG90aGluZy9kZXNjcmlwdGlvbi5jIGIvc3RkL2Nsb3RoaW5nL2Rlc2NyaXB0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEyMjZmZAotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9jbG90aGluZy9kZXNjcmlwdGlvbi5jCkBAIC0wLDAgKzEsNTggQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBhcm1vdXIvZGVzY3JpcHRpb24uYyAtLSBhcm1vdXIgZGVzY3JpcHRpb24gaGFuZGxpbmcKKy8vCisvLyAkSWQ6IGRlc2NyaXB0aW9uLmMsdiAxLjcgMjAwMi8wOC8xOSAxNDoyMTowNCBSaWt1cyBFeHAgJAorCisjcHJhZ21hIHN0cmljdF90eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIHdhcm5fZW1wdHlfY2FzdHMKKworaW5oZXJpdCAiL3N0ZC90aGluZy9kZXNjcmlwdGlvbiI7CisKKy8vI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKworc3RyaW5nIGRhbV9kZXNjcigpIHsKKyAgcmV0dXJuICIiOworfQorCitzdHJpbmcgc2hvcnQoKQoreyAgIHN0cmluZyBzOworICAgIGlmKCEocz1wcm9jZXNzX3N0cmluZyhRdWVyeVByb3AoUF9TSE9SVCkpKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIHMrKFF1ZXJ5UHJvcChQX1dPUk4pPyIgKGFuZ2V6b2dlbikuXG4iOiIuXG4iKTsKK30KKwordmFyYXJncyBzdHJpbmcgbG9uZygpCit7ICAgCisgICAgcmV0dXJuIChwcm9jZXNzX3N0cmluZyhRdWVyeVByb3AoUF9MT05HKXx8IiIpICsgKGRhbV9kZXNjcigpfHwiIikpOworfQorCittYXBwaW5nIF9xdWVyeV9tYXRlcmlhbCgpIHsKKyAgbWl4ZWQgcmVzLGF0OworCisgIGlmIChtYXBwaW5ncChyZXM9UXVlcnkoUF9NQVRFUklBTCkpKQorICAgcmV0dXJuIHJlczsKKyAgYXQ9UXVlcnlQcm9wKFBfQVJNT1VSX1RZUEUpOworICBzd2l0Y2goYXQpIHsKKyAgICBjYXNlIEFUX0FSTU9VUjoKKyAgICBjYXNlIEFUX0hFTE1FVDoKKyAgICBjYXNlIEFUX1JJTkc6CisgICAgY2FzZSBBVF9BTVVMRVQ6CisgICAgY2FzZSBBVF9TSElFTEQ6CisgICAgcmV0dXJuIChbTUFUX01JU0NfTUVUQUw6MTAwXSk7CisgICAgY2FzZSBBVF9DTE9BSzoKKyAgICBjYXNlIEFUX1RST1VTRVJTOgorICAgIHJldHVybiAoW01BVF9DTE9USDoxMDBdKTsKKyAgICBjYXNlIEFUX0dMT1ZFOgorICAgIGNhc2UgQVRfQk9PVDoKKyAgICByZXR1cm4gKFtNQVRfTEVBVEhFUjoxMDBdKTsKKyAgfQorICByZXR1cm4gKFtNQVRfQ0xPVEg6MTAwXSk7Cit9CisKZGlmZiAtLWdpdCBhL3N0ZC9jbG90aGluZy9tb3ZpbmcuYyBiL3N0ZC9jbG90aGluZy9tb3ZpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTJlMDVmCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL2Nsb3RoaW5nL21vdmluZy5jCkBAIC0wLDAgKzEsNDYgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBhcm1vdXIvbW92aW5nLmMgLS0gYXJtb3VyIG1vdmluZyBvYmplY3QKKy8vCisvLyAkSWQ6IG1vdmluZy5jLHYgMy4zIDE5OTgvMDMvMDIgMDg6MzQ6NTcgUGFyYWNlbHN1cyBFeHAgJAorCisjcHJhZ21hIHN0cmljdF90eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisjcHJhZ21hIHJhbmdlX2NoZWNrCisKK2luaGVyaXQgIi9zdGQvdGhpbmcvbW92aW5nIjsKKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMgMQorCisjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8Y2xvdGhpbmcuaD4KKworLyogQmVrbGVpZHVuZyBtdXNzIHZvciBCZXdlZ3VuZyB1bmQgWmVyc3RvZXJ1bmcgYXVzZ2V6b2dlbiB3ZXJkZW4gKi8KKwordmFyYXJncyBpbnQgbW92ZShtaXhlZCBkZXN0LCBpbnQgbWV0aG9kICkgeworICAvLyBnZ2YuIEF1c3ppZWhlbgorICBpZiAob2JqZWN0cChRdWVyeVByb3AoUF9XT1JOKSkpCisgICAgRG9VbndlYXIobWV0aG9kICYgKE1fU0lMRU5UfE1fTk9DSEVDSykpOworCisgIGlmICgobWV0aG9kJk1fTk9DSEVDSykgfHwgKCEob2JqZWN0KVF1ZXJ5UHJvcChQX1dPUk4pKSkKKyAgICByZXR1cm4gOjptb3ZlKGRlc3QsIG1ldGhvZCk7CisKKyAgcmV0dXJuIE1FX0NBTlRfQkVfRFJPUFBFRDsKK30KKwordmFyYXJncyBpbnQgcmVtb3ZlKGludCBzaWxlbnQpIHsKKyAgLy8gZ2dmLiBBdXN6aWVoZW4KKyAgaWYgKG9iamVjdHAoUXVlcnlQcm9wKFBfV09STikpKQorICAgIERvVW53ZWFyKE1fU0lMRU5UfE1fTk9DSEVDSyk7CisKKyAgaWYgKCEob2JqZWN0KVF1ZXJ5UHJvcChQX1dPUk4pKQorICAgIHJldHVybiA6OnJlbW92ZShzaWxlbnQpOworICAvLyBBdXN6aWVoZW4gaGF0IGlyZ2VuZHdpZSBuaWNodCBnZWtsYXBwdC4gOi0oCisgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9zdGQvY2xvdGhpbmcvd2Vhci5jIGIvc3RkL2Nsb3RoaW5nL3dlYXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2RlNGJkCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL2Nsb3RoaW5nL3dlYXIuYwpAQCAtMCwwICsxLDU5NCBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGNsb3RoaW5nL3dlYXIuYyAtLSBGdW5rdGlvbmVuIHJ1bmQgdW1zIEFuemllaGVuL1RyYWdlbiB2b24gS2xlaWR1bmcuCisvLworLy8gJElkOiBjb21iYXQuYyA2MjQzIDIwMDctMDMtMTUgMjE6MTA6MjFaIFplc3N0cmEgJAorCisjcHJhZ21hIHN0cmljdF90eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisjcHJhZ21hIHJhbmdlX2NoZWNrCisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisKKyNpbmNsdWRlIDx0aGluZy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8dGhpbmcvY29tbWFuZHMuaD4KKyNpbmNsdWRlIDx0aGluZy9kZXNjcmlwdGlvbi5oPgorI2luY2x1ZGUgPGxpdmluZy9jbG90aGluZy5oPgorI2luY2x1ZGUgPGNsb3RoaW5nLmg+CisjaW5jbHVkZSA8bGl2aW5nL2NvbWJhdC5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPG5ld19za2lsbHMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKworLy8gR2xvYmFsZSBWYXJpYWJsZW4KK25vc2F2ZSBpbnQgIGZsYXcsIGZ0aW1lOworCit2b2lkIGNyZWF0ZSgpCit7CisgIC8vIEVpbmlnZSBQcm9wZXJ0aWVzIHNvbGx0ZW4gbmljaHQgdm9uIGF1c3NlbiBnZXNldHp0IHdlcmRlbiBrb2VubmVuCisgIFNldChQX1dPUk4sIFBST1RFQ1RFRCwgRl9NT0RFKTsKKyAgU2V0KFBfTEFTVF9VU0UsIFBST1RFQ1RFRCwgRl9NT0RFX0FTKTsKKyAgU2V0KFBfUkVTVFJJQ1RJT05TLChbXSksRl9WQUxVRSk7CisKKyAgLy8gQmVrbGVpZHVuZyBiZW5vZXRpZ3QgS29tbWFuZG9zLCBtaXQgZGVuZW4gbWFuIHNpZSBhbi0gdW5kCisgIC8vIGF1c3ppZWhlbiBrYW5uCisgIEFkZENtZCggKHsiemllaCIsInppZWhlIn0pLCJ6aWVoZSIgKTsKKyAgQWRkQ21kKCAoeyJ0cmFnIiwidHJhZ2UifSksImRvX3dlYXIiICk7Cit9CisKKy8vIGFrdHVlbGxlcyBMZWJld2VzZW4sIHdhcyBkaWVzZSBLbGVpZHVuZyAob2RlciBhdWNoIFJ1ZXN0dW5nKSB6dXIgWmVpdAorLy8gdHJhZWd0LgorcHVibGljIG9iamVjdCBRdWVyeVVzZXIoKQoreworICByZXR1cm4gUXVlcnlQcm9wKFBfV09STik7Cit9CisKKworLy8gQXVzZ2FiZSB2b24gTWVsZHVuZ2VuIHVlYmVyIHdyaXRlKCkgb2RlciBfbm90aWZ5X2ZhaWwoKSwgamUgbmFjaGRlbSwgb2IgZGVyCisvLyBTcGllbGVyIGFsbGVzIGFuemllaHQgb2RlciB3YXMgYmVzdGltbXRlcy4KK3Byb3RlY3RlZCB2b2lkIG1zZyhzdHJpbmcgc3RyLCBtaXhlZCBmbCkgeworICBpZiAoIXN0cmluZ3Aoc3RyKSkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAoZmwpIHsKKyAgICB3cml0ZShzdHIpOworICB9CisgIGVsc2UgeworICAgIF9ub3RpZnlfZmFpbChzdHIpOworICB9Cit9CisKKy8qCisgKiBBdXNnYWJlIGVpbmVyIE1lbGR1bmcgYmVpbSBBbnppZWhlbiBnZWh0IG51ciBhbiBTcGllbGVyLCBuaWNodCBhbiBOUEMuCisgKiBEaWUgVW1nZWJ1bmcgYmVrb21tdCBpbW1lciBlaW5lIE1lbGR1bmcuCisgKi8KK3ZhcmFyZ3Mgdm9pZCBkb1dlYXJNZXNzYWdlKGludCBhbGwpIHsKKyAgc3RyaW5nICpzdHIsczE7CisgIG1peGVkIHdlYXJtc2c7CisKKyAgaWYod2Vhcm1zZz1RdWVyeVByb3AoUF9XRUFSX01TRykpIHsgLy8gSXN0IGVpbmUgV2Vhck1zZyBnZXNldHp0PworICAgIGlmKGNsb3N1cmVwKHdlYXJtc2cpKSB7IC8vIEV2dGwuIGdhciBhbHMgZXh0cmEgRmt0Lj8KKworICAgICAgc3RyID0gZnVuY2FsbCh3ZWFybXNnLCBQTCk7CisgICAgICBpZihpbnRlcmFjdGl2ZShQTCkpIHsKKyAgICAgICAgIC8vIEltIEZhbGxlLCBkYXNzIGFsbCBnZXNldHp0IGlzdCwgd2lyZCBhbHMgSW5kZW50IGRlciBOYW1lIGRlcworICAgICAgICAgLy8gYW5nZXpvZ2VuZW4gT2JqZWt0ZXMgZ2VzZXR6dC4gKHRyYWcgYWxsZXMpCisgICAgICAgICB3cml0ZShicmVha19zdHJpbmcoc3RyWzBdLDc4LAorICAgICAgICAgICAgICAgIChhbGw/KE5hbWUoV0VSKSsiOiAiKTowKSwgQlNfTEVBVkVfTVlfTEZTKSk7CisgICAgICB9CisgICAgICAvLyhaZXNzdHJhKTogc2F5KCkgaXN0IGhpZXIgYmxvZWQsIHdlaWwgZXMgYW4gZGFzIEVudiB2b20gdGhpc19wbGF5ZXIoKQorICAgICAgLy9hdXNnaWJ0LCBzb2Zlcm4gZGVyIGV4aXN0aWVydC4gU28ga29lbm5lbiBTcGllbGVyIGRpZSBtZWxkdW5nIGtyaWVnZW4sCisgICAgICAvL29id29obCBkaWUgbGFlbmdzdCB3b2FuZGVycyBzaW5kICh6LkIuIFNlcXVlbnplbikKKyAgICAgIC8vRGFoZXIgbnVuIEF1c2dhYmUgYW4gZGFzIEVudiB2b20gRW52ICh3ZW5uIGRhcyBrZWluIFJhdW0gc2VpbiBzb2xsdGUsCisgICAgICAvL3dhcyBkdXJjaGF1cyBzZWluIGtvZW5udGUsIG1hY2h0IHRlbGxfcm9vbSgpIG5peCkuIAorICAgICAgaWYgKCBvYmplY3RwKGVudmlyb25tZW50KCkpICYmIG9iamVjdHAoZW52aXJvbm1lbnQoZW52aXJvbm1lbnQoKSkpICkKKyAgICAgICAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoZW52aXJvbm1lbnQoKSksCisgICAgICAgICAgICBicmVha19zdHJpbmcoc3RyWzFdLCA3OCwgMCwgQlNfTEVBVkVfTVlfTEZTKSwoe1BMfSkgKTsKKworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlbHNlIGlmKGludGVyYWN0aXZlKFBMKSkgeworICAgICAgczEgPSByZXBsYWNlX3BlcnNvbmFsKHNwcmludGYod2Vhcm1zZ1swXSwiQFdFTjIiKSwgKHtQTCxNRX0pLCAxKTsKKworICAgICAgd3JpdGUoYnJlYWtfc3RyaW5nKHMxLDc4LChhbGw/KE5hbWUoV0VSKSsiOiAiKTowKSwgQlNfTEVBVkVfTVlfTEZTKSk7CisgICAgfQorCisgICAgczEgPSByZXBsYWNlX3BlcnNvbmFsKHNwcmludGYod2Vhcm1zZ1sxXSwiQFdFUjEiLCJAV0VOVTIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe1BMLCBNRX0pLCAxKTsKKyAKKyAgICBpZiAoIG9iamVjdHAoZW52aXJvbm1lbnQoKSkgJiYgb2JqZWN0cChlbnZpcm9ubWVudChlbnZpcm9ubWVudCgpKSkgKQorICAgICAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoZW52aXJvbm1lbnQoKSksCisgICAgICAgICAgICBicmVha19zdHJpbmcoczEsIDc4LCAwLCBCU19MRUFWRV9NWV9MRlMpLCh7IFBMIH0pICk7CisKKyAgICByZXR1cm47CisgIH0KKyAgLyoKKyAgICogS2VpbmUgV2Vhck1zZyBnZXNldHp0LiBBdXNnYWJlIGRlciBEZWZhdWx0LU1lbGR1bmdlbi4KKyAgICovCisgIGVsc2UgaWYoaW50ZXJhY3RpdmUoUEwpKSB7CisgICAgd3JpdGUoYnJlYWtfc3RyaW5nKCJEdSB6aWVoc3QgIiArIG5hbWUoV0VOLDEpICsgIiBhbi4iLDc4LAorICAgICAoYWxsPyhOYW1lKFdFUikrIjogIik6MCkpKTsKKyAgfQorICBpZiAoIG9iamVjdHAoZW52aXJvbm1lbnQoKSkgJiYgb2JqZWN0cChlbnZpcm9ubWVudChlbnZpcm9ubWVudCgpKSkgKQorICAgICAgdGVsbF9yb29tKGVudmlyb25tZW50KGVudmlyb25tZW50KCkpLGJyZWFrX3N0cmluZyhQTC0+TmFtZShXRVIpCisgICAgICAgICAgICArICIgemllaHQgIiArIG5hbWUoV0VOLDApICsiIGFuLiIsNzgpLCAoe1BMfSkpOworfQorCisvKgorICogQXVzZ2FiZSBlaW5lciBNZWxkdW5nIGJlaW0gQXVzemllaGVuIGdlaHQgbnVyIGFuIFNwaWVsZXIsIG5pY2h0IGFuIE5QQy4KKyAqIERpZSBVbWdlYnVuZyBiZWtvbW10IG5hdHVlcmxpY2ggaW1tZXIgZWluZSBNZWxkdW5nLgorICovCit2b2lkIGRvVW53ZWFyTWVzc2FnZShvYmplY3Qgd29ybl9ieSwgaW50IGFsbCkKK3sKKyAgc3RyaW5nICpzdHIsczE7CisgIG1peGVkIG1zZzsKKworICBpZighb2JqZWN0cCh3b3JuX2J5KSkgeyAvLyBOYSBodWNoLCBnYXIgbmljaHQgYW5nZXpvZ2VuPyBBYmJydWNoLgorICAgIHJldHVybjsKKyAgfQorCisgIGlmKG1zZz1RdWVyeVByb3AoUF9VTldFQVJfTVNHKSkgeyAvLyBJc3QgZWluZSBVbndlYXJNc2cgZ2VzZXR6dD8KKyAgICBpZihjbG9zdXJlcChtc2cpKSB7IC8vIE9obyEgR2FyIGdsZWljaCBhbHMgRmt0Lj8KKworICAgICAgc3RyID0gZnVuY2FsbChtc2csIHdvcm5fYnkpOworICAgICAgaWYoaW50ZXJhY3RpdmUod29ybl9ieSkpIHsKKyAgICAgICAgIHRlbGxfb2JqZWN0KHdvcm5fYnksYnJlYWtfc3RyaW5nKHN0clswXSwgNzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsPyhOYW1lKFdFUikrIjogIik6MCksQlNfTEVBVkVfTVlfTEZTKSk7CisgICAgICB9CisKKyAgICAgIC8vKFplc3N0cmEpOiBzYXkoKSBpc3QgaGllciBibG9lZCwgd2VpbCBlcyBhbiBkYXMgRW52IHZvbSB0aGlzX3BsYXllcigpCisgICAgICAvL2F1c2dpYnQsIHNvZmVybiBkZXIgZXhpc3RpZXJ0LiBTbyBrb2VubmVuIFNwaWVsZXIgZGllIG1lbGR1bmcga3JpZWdlbiwKKyAgICAgIC8vb2J3b2hsIGRpZSBsYWVuZ3N0IHdvYW5kZXJzIHNpbmQgKHouQi4gU2VxdWVuemVuKQorICAgICAgLy9EYWhlciBudW4gQXVzZ2FiZSBhbiBkYXMgRW52IHZvbSB3b3JuX2J5ICh3ZW5uIGRhcyBrZWluIFJhdW0gc2VpbiBzb2xsdGUsCisgICAgICAvL21hY2h0IHRlbGxfcm9vbSgpIG5peCkuIAorICAgICAgaWYgKCBvYmplY3RwKGVudmlyb25tZW50KHdvcm5fYnkpKSApCisgICAgICAgICAgdGVsbF9yb29tKGVudmlyb25tZW50KHdvcm5fYnkpLAorICAgICAgICAgICAgICBicmVha19zdHJpbmcoc3RyWzFdLDc4LCAwLCBCU19MRUFWRV9NWV9MRlMpLCh7IHdvcm5fYnkgfSkgKTsKKyAgICAgIAorICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlbHNlIGlmKGludGVyYWN0aXZlKHdvcm5fYnkpKSB7CisgICAgICBzMSA9IHJlcGxhY2VfcGVyc29uYWwoc3ByaW50Zihtc2dbMF0sIkBXRU4yIiksCisgICAgICAgICAgICAgICAgICAgICAgKHt3b3JuX2J5LE1FfSksIDEpOworCisgICAgICB0ZWxsX29iamVjdCh3b3JuX2J5LGJyZWFrX3N0cmluZyhzMSw3OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGw/KE5hbWUoV0VSKSsiOiAiKTowKSwgQlNfTEVBVkVfTVlfTEZTKSk7CisgICAgfQorCisgICAgczEgPSByZXBsYWNlX3BlcnNvbmFsKHNwcmludGYobXNnWzFdLCJAV0VSMSIsIkBXRU5VMiIpLAorICAgICAgICAgICAgICAgICAgICAoe3dvcm5fYnksIE1FIH0pLCAxKTsKKworICAgIGlmICggb2JqZWN0cChlbnZpcm9ubWVudCh3b3JuX2J5KSkgKQorICAgICAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoZW52aXJvbm1lbnQoKSksCisgICAgICAgICAgICBicmVha19zdHJpbmcoczEsNzgsIDAsIEJTX0xFQVZFX01ZX0xGUyksKHsgd29ybl9ieSB9KSApOworICAgIHJldHVybjsKKyAgfQorICAvKgorICAgKiBLZWluZSBVbndlYXJNc2cgZ2VzZXR6dC4gQXVzZ2FiZSBkZXIgRGVmYXVsdC1NZWxkdW5nZW4uCisgICAqLworICBlbHNlIGlmKGludGVyYWN0aXZlKHdvcm5fYnkpKSB7CisgICAgdGVsbF9vYmplY3Qod29ybl9ieSxicmVha19zdHJpbmcoIkR1IHppZWhzdCAiICsgbmFtZShXRU4sMSkgKyAiIGF1cy4iLDc4LAorICAgICAoYWxsPyhOYW1lKFdFUikrIjogIik6MCkpKTsKKyAgfQorICBpZiAoIG9iamVjdHAoZW52aXJvbm1lbnQod29ybl9ieSkpICkKKyAgICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudCh3b3JuX2J5KSwgYnJlYWtfc3RyaW5nKHdvcm5fYnktPk5hbWUoV0VSKQorICAgICAgICAgICAgKyAiIHppZWh0ICIgKyBuYW1lKFdFTiwwKSArICIgYXVzLiIsNzgpLCAoeyB3b3JuX2J5IH0pICk7Cit9CisKKy8vIERpZXNlIEZ1bmt0aW9uIHdpcmQgYXVmZ2VydWZlbiwgd2VubiBkaWUgUnVlc3R1bmcgd2lya2xpY2ggYW5nZXpvZ2VuCisvLyB3aXJkCitwcm90ZWN0ZWQgdm9pZCBJbmZvcm1XZWFyKG9iamVjdCBwbCwgaW50IHNpbGVudCwgaW50IGFsbCkgeworICAgIHJldHVybjsKK30KKworLy8gRGllc2UgRnVua3Rpb24gd2lyZCBhdWZnZXJ1ZmVuLCB3ZW5uIGRpZSBSdWVzdHVuZyB3aXJrbGljaCBhdXNnZXpvZ2VuCisvLyB3aXJkCitwcm90ZWN0ZWQgdm9pZCBJbmZvcm1VbndlYXIob2JqZWN0IHBsLCBpbnQgc2lsZW50LCBpbnQgYWxsKSB7CisgICAgcmV0dXJuOworfQorCisvLyBsaWVmZXJ0IFdlcnRlIDwwIHp1cnVlY2ssIHdlbm4gZGVyIFNwaWVsZXIgZGllIEtsZWlkdW5nIF9uaWNodF8gCisvLyBhbnppZWhlbiBkYXJmLgorLy8gSGllcmJlaSBzdGVodCAtMSBkYWZ1ZXIsIGRhc3MgZGVyIEF1ZnJ1ZmVyIHJldHVybiAwIG1hY2hlbiBzb2xsdGUsCisvLyA8PSAtMiBzb2xsdGUgenVyIGVpbmVtIHJldHVybiAhYWxsIGZ1ZWhyZW4uCitwcm90ZWN0ZWQgaW50IF9jaGVja193ZWFyX3Jlc3RyaWN0aW9ucyhpbnQgc2lsZW50LCBpbnQgYWxsKSB7CisgIG1peGVkICAgdHlwZSxyZXM7CisgIG9iamVjdCAgKmFybW91cnM7CisKKyAgLy8gTWFuIGthbm4gbnVyIEtyYW0gYW56aWVoZW4sIGRpZSBtYW4gYmVpIHNpY2ggdHJhZWd0CisgIGlmIChlbnZpcm9ubWVudCgpIT1QTCkgeyAgICAgICAgICAgIAorICAgIG1zZyhicmVha19zdHJpbmcoIkR1IG11c3N0ICIrbmFtZShXRU4sMSkrIiBlcnN0IG5laG1lbiEiLDc4LAorICAgICAgICAgICAgKGFsbD8oTmFtZShXRVIpKyI6ICIpOjApKSwgYWxsKTsKKyAgICByZXR1cm4oLTEpOworICB9CisKKyAgLy8gRWluZSBnZXRyYWdlbmUgUnVlc3R1bmcga2FubiBtYW4gbmljaHQgbm9jaG1hbCBhbnppZWhlbgorICBpZiAoUXVlcnlQcm9wKFBfV09STikpIHsKKyAgICBtc2coYnJlYWtfc3RyaW5nKCJEdSB0cmFlZ3N0ICIrbmFtZShXRU4sMSkrIiBiZXJlaXRzLiIsNzgsCisgICAgICAgICAgKGFsbD8oTmFtZShXRVIpKyI6ICIpOjApKSwgYWxsKTsKKyAgICByZXR1cm4oLTEpOworICB9CisKKyAgLy8gRGllc2UgRnVua3Rpb24gdmVyc3VjaHQgaW1tZXIsIFRQIGFuenV6aWVoZW4gKCphcmdzKikuIEVzIGdpYnQgYWJlciB2aWVsZQorICAvLyBNYWdpZXIsIGRpZSBvaG5lIFRQIG9kZXIgbWl0IGRlbSBmYWxzY2hlbiBUUCBhbnppZWhlbiB3b2xsZW4uIERhaGVyIG1hbAorICAvLyBwcnVlZmVuIHVuZCBnZ2YuIEZlaGxlciBhdXNsb2VzZW4uCisgIGlmICghdGhpc19wbGF5ZXIoKSkKKyAgICAgIHJhaXNlX2Vycm9yKCJLZWluIHRoaXNfcGxheWVyKCkgZXhpc3RlbnQgYmVpbSBBbnppZWhlbiFcbiIpOworICBlbHNlIGlmICh0aGlzX3BsYXllcigpICE9IGVudmlyb25tZW50KCkpCisgICAgICByYWlzZV9lcnJvcigiTWVpbmUgVW1nZWJ1bmcgYmVpbSBBbnppZWhlbiBpc3QgbmljaHQgdGhpc19wbGF5ZXIoKSFcbiIpOworCisgIC8vIFVlYmVyIFBfUkVTVFJJQ1RJT05TIGthbm4gbWFuIGVpbmlnZSBSZXN0cmlrdGlvbmVuIGRlZmluaWVyZW4sIG9obmUKKyAgLy8gZ2xlaWNoIGF1ZiBlaW5lIFdlYXJGdW5jIHp1cnVlY2tncmVpZmVuIHp1IG11ZXNzZW4uCisgIC8vIERpZSBBdXN3ZXJ0dW5nIGVyZm9sZ3QgdWViZXIgZGVuIFJlc3RyaWN0aW9uQ2hlY2tlcgorICBpZiAoKHJlcz1RdWVyeVByb3AoUF9SRVNUUklDVElPTlMpKSAmJiBtYXBwaW5ncChyZXMpICYmCisgICAgICAocmVzPShzdHJpbmcpIi9zdGQvcmVzdHJpY3Rpb25fY2hlY2tlciItPmNoZWNrX3Jlc3RyaWN0aW9ucyhQTCxyZXMpKQorICAgICAgJiYgc3RyaW5ncChyZXMpKSB7ICAKKyAgICBtc2coYnJlYWtfc3RyaW5nKHJlcyw3OCwoYWxsPyhOYW1lKFdFUikrIjogIik6MCkpLGFsbCk7CisgICAgcmV0dXJuKC0xKTsKKyAgfQorCisgIC8vIElzdCBlaW5lIFdlYXJGdW5jIGdlc2V0enQsIHdpcmQgZGllc2UgYXVmZ2VydWZlbi4KKyAgaWYgKG9iamVjdHAocmVzPVF1ZXJ5UHJvcChQX1dFQVJfRlVOQykpICYmIAorICAgICAgIShyZXMtPldlYXJGdW5jKE1FLCBzaWxlbnQsIGVudmlyb25tZW50KCkpKSkgeworICAgIC8vIEVpbmUgTWVsZHVuZyBtdXNzIHZvbiBkZXIgV2VhckZ1bmMgYXVzZ2VnZWJlbiB3ZXJkZW4KKyAgICByZXR1cm4oLTIpOworICB9CisKKyAgLy8gc2NoZWluYmFyIGRhcmYgbWFuIGRhcyBoaWVyIGFuemllaGVuLiA7LSkKKyAgcmV0dXJuIDA7Cit9CisKK3Byb3RlY3RlZCB2b2lkIF9pbmZvcm13ZWFyKGludCBzaWxlbnQsIGludCBhbGwpIHsKKworICAvLyBFaW5lIE1lbGR1bmcgYXVzZ2ViZW4sIHdlbm4gZGFzIHNpbGVudC1GbGFnIG5pY2h0IGdlc2V0enQgaXN0CisgIGlmICghc2lsZW50KSB7CisgICAgZG9XZWFyTWVzc2FnZShhbGwpOworICB9CisKKyAgLy8gSW5mb3JtLUZ1bmt0aW9uIGF1ZnJ1ZmVuCisgIEluZm9ybVdlYXIoUEwsIHNpbGVudCwgYWxsKTsKK30KKworLy8gRGllIEZ1bmt0aW9uLCBkaWUgZGFzIGVpZ2VudGxpY2hlIEFuemllaGVuIGR1cmNoZnVlaHJ0Cit2YXJhcmdzIGludCBEb1dlYXIoaW50IHNpbGVudCwgaW50IGFsbCkgeworICBpbnQgbmg7CisKKyAgLy8gQmVkaW5ndW5nZW4gcHJ1ZWZlbiwgX2NoZWNrX3Jlc3RyaWN0aW9ucygpIGdpYnQgZGllIG5vdHdlbmRpZ2VuIE1lbGR1bmdlbgorICAvLyBhbiBkZW4gU3BpZWxlciBhdXMuCisgIGludCByZXMgPSBfY2hlY2tfd2Vhcl9yZXN0cmljdGlvbnMoc2lsZW50LCBhbGwpOworICBpZiAocmVzID09IC0xKQorICAgIHJldHVybigwKTsKKyAgZWxzZSBpZiAocmVzIDw9IC0yKQorICAgIHJldHVybighYWxsKTsKKworICAvLyBEZXIgQ2hlY2sgYXVmIGZyZWllIEhhZW5kZSBtdXNzIG5hY2ggYWxsZW4gYW5kZXJlbiBDaGVja3MgYXVzIEtsZWlkdW5nCisgIC8vIHVuZCBSdWVzdHVuZyBlcmZvbGdlbiB1bmQgaXN0IGltIFByaW56aXAgaWRlbnRpc2NoIGZ1ZXIgYmVpZGUuIERhaGVyIHdpcmQKKyAgLy8gZGVyIGhpZXIgaW4gZGllc2VyIEZ1bmt0aW9uIGdlbWFjaHQuCisgIC8vIFNvbGwgZGFzIE9iamVrdCBIYWVuZGUgImJlbnV0emVuIj8gU3RlaHQgZGEgYXVjaCB3aXJrbGljaCBlaW4KKyAgLy8gSW50ZWdlci1XZXJ0IGRyaW4/IGljaCBtYWNoIGRhIGpldHp0IGVpbiByYWlzZV9lcnJvcigpLCBkYXMgc29sbAorICAvLyBzY2hsaWVzc2xpY2ggZ2VmaXh0IHdlcmRlbi4gQXVzc2VyZGVtIHNwYXJ0IGVzIG5lbiBXb3JrYXJvdW5kIGJlaW0KKyAgLy8gQXVzemllaGVuLgorICBpZiAoIWludHAobmg9UXVlcnlQcm9wKFBfTlJfSEFORFMpKSkgeworICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIkludmFsaWQgUF9OUl9IQU5EUyBpbiAlTyIsb2JqZWN0X25hbWUoKSkpOworICB9CisgIC8vIFdlbm4gSGFlbmRlIGJlbnV0enQgd2VyZGVuIHNvbGxlbiwgbXVzcyBuYXR1ZXJsaWNoIGF1Y2ggZ2V0ZXN0ZXQKKyAgLy8gd2VyZGVuLCBvYiBkYXMgdWViZXJoYXVwdCBnZWh0CisgIGlmIChuaD4wKSB7CisgICAgaWYgKCEoUEwtPlVzZUhhbmRzKE1FLCBuaCkpKSB7CisgICAgICAvLyBTY2hhZGUsIG5pY2h0IGdlbnVnIEhhZW5kZSBmcmVpIC0+IE1lbGR1bmcgYXVzZ2ViZW4KKyAgICAgIHdyaXRlKGJyZWFrX3N0cmluZygiRHUgaGFzdCBrZWluZSBIYW5kIG1laHIgZnJlaS4iLDc4LAorICAgICAgICAgICAgKGFsbD8oTmFtZShXRVIpKyI6ICIpOjApKSk7CisgICAgICByZXR1cm4oIWFsbCk7CisgICAgfQorICB9CisKKyAgLy8gT0ssIGRpZSBSdWVzdHVuZyBrYW5uIGFuZ2V6b2dlbiB3ZXJkZW4uCisgIC8vIEJlaGluZGVydW5nIGJlaW0gV2VjaHNlbCBudXIgZnVlciBTcGllbGVyCisgIGlmIChxdWVyeV9vbmNlX2ludGVyYWN0aXZlKFBMKSkKKyAgLy8gV2VubiBkYXMgR2FuemUgLCx3aXJrbGljaCcnIGVpbmUgS2xlaWR1bmcvUnVlc3R1bmcgaXN0IHVuZCBrZWluIFNNUworICAvLyBvZGVyIGFlaG5saWNoZXMuLi4KKyAgaWYgKCFRdWVyeVByb3AoUF9XRUFQT05fVFlQRSkpIHsKKyAgICAvLyBBa3Rpb24gbm9jaCBzZXR6ZW4sIFNwaWVsZXIgaGF0IGphIHdhcyBhbmdlem9nZW4KKyAgICBQTC0+U2V0UHJvcChQX0xBU1RfV0VBUl9BQ1RJT04sKHtXQV9XRUFSLHRpbWUoKX0pKTsKKyAgICAvLyBJbSBLYW1wZiB2ZXJsaWVydCBkZXIgU3BpZWxlciBkdXJjaCBLbGVpZHVuZ3N3ZWNoc2VsIGVpbmUgUnVuZGUuCisgICAgaWYgKFBMLT5JbkZpZ2h0KCkpIHsKKyAgICAgIFBMLT5TZXRQcm9wKFBfQVRUQUNLX0JVU1ksMSk7CisgICAgfQorICB9CisgIC8vIEVpbnRyYWdlbiBpbiBQX0NMT1RISU5HL1BfQVJNT1VSUworICBQTC0+V2Vhcih0aGlzX29iamVjdCgpKTsKKworICBQTC0+U2V0UHJvcChQX0VRVUlQX1RJTUUsdGltZSgpKTsKKyAgU2V0UHJvcChQX1dPUk4sIFBMKTsKKyAgU2V0UHJvcChQX0VRVUlQX1RJTUUsdGltZSgpKTsKKworICAvLyBnZ2YuIGFuZGVyZSBPYmpla3RlIGluZm9ybWllcmVuIGV0Yy4KKyAgX2luZm9ybXdlYXIoc2lsZW50LCBhbGwpOworCisgIC8vIEZlcnRpZyBtaXQgZGVtIEFuemllaGVuLiBWb3JnYW5nIGJlZW5kZW4gYnp3LiBtaXQgYW5kZXJlbgorICAvLyBSdWVzdHVuZ2VuIGZvcnRmYWhyZW4KKyAgcmV0dXJuICFhbGw7Cit9CisKKworLy8gbGllZmVydCAwIHp1cmVjaywgd2VubiBkaWUgS2xlaWR1bmcvUnVlc3R1bmcgYXVzZ2V6b2dlbiB3ZXJkZW4ga2FubgorLy8gYmVpIE1fTk9DSEVDSyBpc3QgZGFzIEF1c3ppZWhlbiBpbW1lciBlcmxhdWJ0LCBhbGxlcmRpbmdzIHdpcmQKKy8vIFBfUkVNT1ZFX0ZVTkMgYXVjaCBkYW5uIGdlcnVmZW4gKHdlbm4gYXVjaCBpZ25vcmllcnQpLgorLy8gPDAgdmVyYmlldGV0IGRhcyBBdXN6aWVoZW4KK3Byb3RlY3RlZCBpbnQgX2NoZWNrX3Vud2Vhcl9yZXN0cmljdGlvbnMob2JqZWN0IHdvcm5fYnksIGludCBzaWxlbnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsKQoreworICAvLyBOaWNodCBnZXRyYWdlbmUgUnVlc3R1bmdlbiBrYW5uIG1hbiBhdWNoIG5pY2h0IGF1c3ppZWhlbgorICBpZiAoIW9iamVjdHAod29ybl9ieSkpIHsKKyAgICAgIHJldHVybigtMik7CisgIH0KKworICAvLyBJc3QgZWluZSBSZW1vdmVGdW5jIGdlc2V0enQsIHdpcmQgZGllc2UgYXVmZ2VydWZlbgorICAvLyBJbSBGYWxsZSB2b24gTV9OT0NIRUNLIHdpcmQgZGFzIEVyZ2VibmlzIGFsbGVyZGluZ3MgaWdub3JpZXJ0LgorICBtaXhlZCByZXM9UXVlcnlQcm9wKFBfUkVNT1ZFX0ZVTkMpOworICBpZiAob2JqZWN0cChyZXMpCisgICAgICAmJiAhcmVzLT5SZW1vdmVGdW5jKE1FLHNpbGVudCx3b3JuX2J5KQorICAgICAgJiYgIShzaWxlbnQgJiBNX05PQ0hFQ0spCisgICAgICApCisgIHsKKyAgICAgIC8vIEVpbmUgTWVsZHVuZyBtdXNzIHZvbiBkZXIgUmVtb3ZlRnVuYyBhdXNnZWdlYmVuIHdlcmRlbgorICAgICAgcmV0dXJuKC0yKTsKKyAgfQorCisgIC8vIGdlbmVyZWxsIGhlYnQgTV9OT0NIRUNLIGRpZSBSZXN0cmlrdGlvbmVuIGF1ZiAtIHNvbnN0IGtvbW10IGVzIHp1CisgIC8vIG1hc3NpdmVuIElua29uc2lzdGVuemVuIGJlaW0gQmV3ZWdlbiBtaXQgTV9OT0NIRUNLLgorICBpZiAoc2lsZW50ICYgTV9OT0NIRUNLKQorICAgIHJldHVybiAxOworCisgIC8vIEVpbmUgdmVyZmx1Y2h0ZSBSdWVzdHVuZyBrYW5uIG1hbiBuYXR1ZXJsaWNoIG5pY2h0IGF1c3ppZWhlbgorICByZXM9UXVlcnlQcm9wKFBfQ1VSU0VEKTsKKyAgaWYgKHJlcyApIHsKKyAgICBpZiAoc3RyaW5ncChyZXMpKSB7CisgICAgICAvLyBTdGFuZCBpbiBQX0NVUlNFRCBlaW4gU3RyaW5nPyBEYW5uIGRpZXNlbiBhdXNnZWJlbgorICAgICAgdGVsbF9vYmplY3Qod29ybl9ieSwgICAgICAKKyAgICAgICAgICAocmVzWzwxXT09J1xuJyA/IHJlcyA6IGJyZWFrX3N0cmluZyhyZXMsNzgsCisgICAgICAgICAgICAoYWxsPyhOYW1lKFdFUikrIjogIik6MCkpKSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgLy8gU29uc3QgZWluZSBTdGFuZGFyZC1NZWxkdW5nIGF1c2dlYmVuCisgICAgICB0ZWxsX29iamVjdCh3b3JuX2J5LGJyZWFrX3N0cmluZygKKyAgICAgICAgICAiRHUga2FubnN0ICIgKyBuYW1lKFdFTikgKyAiIG5pY2h0IGF1c3ppZWhlbiwgIiArIFF1ZXJ5UHJvbm91bihXRVIpCisgICAgICAgICAgKyAiIGlzdCB2ZXJmbHVjaHQgd29yZGVuLlxuIiw3OCwoYWxsPyhOYW1lKFdFUikrIjogIik6MCkpKTsKKyAgICB9CisgICAgcmV0dXJuKC0yKTsKKyAgfQorCisgIC8vIEF1c3ppZWhlbiBtb2VnbGljaAorICByZXR1cm4oMSk7Cit9CisKK3Byb3RlY3RlZCB2b2lkIF9pbmZvcm11bndlYXIob2JqZWN0IHdvcm5fYnksIGludCBzaWxlbnQsIGludCBhbGwpIHsKKworICAvLyBJbmZvcm0tRnVua3Rpb24gYXVmcnVmZW4KKyAgSW5mb3JtVW53ZWFyKHdvcm5fYnksIHNpbGVudCwgYWxsKTsKKworICAvLyBNZWxkdW5nIGF1c2dlYmVuLCB3ZW5uIGRhcyBzaWxlbnQtRmxhZyBuaWNodCBnZXNldHp0IGlzdAorICBpZiAoIShzaWxlbnQmTV9TSUxFTlQpKSB7CisgICAgZG9VbndlYXJNZXNzYWdlKCB3b3JuX2J5LCBhbGwgKTsKKyAgfQorfQorCisvLyBEaWUgRnVua3Rpb24sIGRpZSBkYXMgZWlnZW50bGljaGUgQXVzemllaGVuIGR1cmNoZnVlaHJ0CisvLyBoaWVyIHN0ZWh0IG51ciBkcmluLCB3YXMgYXVmIGplZGVuIEZhbGwgZnVlciBLbGVpZHVuZ2VuIHVuZCBSdWVzdHVuZ2VuCisvLyBnbGVpY2ggaXN0LCBkYW1pdCBtYW4gYmVpIFJ1ZXN0dW5nZW4gZGllc2UgRnVua3Rpb24gbmljaHQgdWViZXJzY2hyZWliZW4KKy8vIG11c3MuCit2YXJhcmdzIGludCBEb1Vud2VhcihpbnQgc2lsZW50LCBpbnQgYWxsKSB7CisgIG9iamVjdCB3b3JuX2J5OworICBpbnQgbmg7CisKKyAgLy8gRGFzIEZsYWcgInNpbGVudCIgd2lyZCBpbiBkZXIgUmVtb3ZlRnVuYygpIGV0d2FzIGFuZGVycyBiZWhhbmRlbHQKKyAgLy8gYWxzIHVlYmVyYWxsIGFuZGVycy4gRGVzaGFsYiB3aXJkIE1fU0lMRU5UIGdlc2V0enQsIHNvZmVybiAic2lsZW50IgorICAvLyBfaXJnZW5kZWluZW5fIFdlcnQgYXVzc2VyIE1fTk9DSEVDSyBoYXR0ZS4KKyAgaWYgKCBzaWxlbnQgJiB+TV9OT0NIRUNLICkKKyAgICAgIHNpbGVudCB8PSBNX1NJTEVOVDsKKworICAvLyBTdGFuZGFyZC1Ob3RmaXlmYWlsIHNldHplbi4KKyAgaWYgKGFsbCkKKyAgICBub3RpZnlfZmFpbCgiQWxsZXMgYXVzZ2V6b2dlbiwgd2FzIGdpbmcuXG4iKTsKKworICAvLyBIYXQgZGFzIE9iamVrdCBIYWVuZGUgImJlbnV0enQiPyBTdGVodCBkYSBhdWNoIHdpcmtsaWNoIGVpbgorICAvLyBJbnRlZ2VyLVdlcnQgZHJpbj8gV2VubiBuaWNodCwgbWFjaCBpY2ggbmVuIHJhaXNlX2Vycm9yKCksIGRhcyBkdWVyZnRlCisgIC8vIGVpZ2VudGxpY2ggZ2FyIG5pY2h0IHBhc3NpZXJlbi4gUHJ1ZWZ1bmcgbWFsIGFtIEFuZmFuZyBtYWNoZW4sIGJldm9yCisgIC8vIGlyZ2VuZHdhcyBhbmRlcmVzIChSZW1vdmVGdW5jKCkpIHBhc3NpZXJ0IGlzdC4KKyAgaWYgKCFpbnRwKG5oPVF1ZXJ5UHJvcChQX05SX0hBTkRTKSkpIHsKKyAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJJbnZhbGlkIFBfTlJfSEFORFMgaW4gJU8iLG9iamVjdF9uYW1lKCkpKTsKKyAgfQorCisgIHdvcm5fYnk9UXVlcnlQcm9wKFBfV09STik7CisgIC8vIGRhcmYgYXVzZ2V6b2dlbiB3ZXJkZW4/IFdlbm4gbmljaHQsIEVuZGUuCisgIGludCByZXMgPSBfY2hlY2tfdW53ZWFyX3Jlc3RyaWN0aW9ucyh3b3JuX2J5LHNpbGVudCxhbGwpOworICBpZiAocmVzIDwgMCkKKyAgICByZXR1cm4oIWFsbCk7CisKKyAgLy8gT0ssIGFsbGVzIGtsYXIsIGRpZSBSdWVzdHVuZyB3aXJkIGF1c2dlem9nZW4KKyAgd29ybl9ieS0+VW53ZWFyKE1FKTsKKworICAvLyBCZW51dHp0ZSBIYWVuZGUgd2llZGVyIGZyZWlnZWJlbgorICBpZiAobmg+MCkgeworICAgIHdvcm5fYnktPkZyZWVIYW5kcyhNRSk7CisgIH0KKworICB3b3JuX2J5LT5TZXRQcm9wKFBfRVFVSVBfVElNRSwgdGltZSgpKTsKKyAgU2V0UHJvcChQX1dPUk4sIDApOworCisgIC8vIEZsYWcgbm9jaCBzZXR6ZW4sIFNwaWVsZXIgaGF0IGphIHdhcyBhdXNnZXpvZ2VuCisgIC8vIEFiZXIgbnVyIHdlbm5zIGF1Y2ggZGVyIFNwaWVsZXIgc2VsYnN0IGlzdC4KKyAgLy8gdW5kIHdlbm4gZGFzIHdpcmtsaWNoIGVpbmUgUnVlc3R1bmcgdW5kIGtlaW4gU01TIG8uYWUuIGlzdC4KKyAgaWYgKFBMICYmIFBMPT13b3JuX2J5ICYmICFRdWVyeVByb3AoUF9XRUFQT05fVFlQRSkpIHsKKyAgICAvL0JlaGluZGVydW5nIGJlaW0gV2VjaHNlbCBudXIgZnVlciBTcGllbGVyCisgICAgaWYgKHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoUEwpKSB7CisgICAgICBQTC0+U2V0UHJvcChQX0xBU1RfV0VBUl9BQ1RJT04sKHtXQV9VTldFQVIsdGltZSgpfSkpOworICAgICAgaWYgKFBMLT5JbkZpZ2h0KCkpIHsgCisgICAgICAgIFBMLT5TZXRQcm9wKFBfQVRUQUNLX0JVU1ksMSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gb2ssIG51biBub2NoIGFuZGVyZSBPYmpla3RlIGluZm9ybWllcmVuLgorICBfaW5mb3JtdW53ZWFyKHdvcm5fYnksc2lsZW50LGFsbCk7CisKKyAgLy8gRmVydGlnIG1pdCBkZW0gQW56aWVoZW4uIFZvcmdhbmcgYmVlbmRlbiBiencuIG1pdCBhbmRlcmVuCisgIC8vIFJ1ZXN0dW5nZW4gZm9ydGZhaHJlbgorICByZXR1cm4gIWFsbDsKK30KKworcHJvdGVjdGVkIGludCBfZG9fd2VhcihzdHJpbmcgc3RyLCBpbnQgc2lsZW50LCBpbnQgYWxsKSB7CisgIGludCAqbGFzdDsKKworICAvLyBTdGFuZGFyZC1Ob3RmaXktRmFpbCBzZXR6ZW4uCisgIGlmIChhbGwpCisgICAgbm90aWZ5X2ZhaWwoIkFsbGVzIGFuZ2V6b2dlbiwgd2FzIGdpbmcuXG4iKTsKKworICAvLyBJc3QgZGllc2UgUnVlc3R1bmcgdWViZXJoYXVwdCBnZW1laW50PyBCZWkgInRyYWdlIGFsbGVzIiBpc3QgZGllcworICAvLyBuYXR1ZXJsaWNoIGltbWVyIGRlciBGYWxsCisgIGlmICghc3RyIHx8ICghYWxsICYmICFpZChzdHIpKSkgeworICAgICAgcmV0dXJuIDA7CisgIH0KKworICAvLyBWaWVsbGVpY2h0IGRhcmYgZGVyIFNwaWVsZXIgamEgZ2FyIG5peCBtZWhyIGFuemllaGVuLgorICBpZiAoKG9iamVjdClQTC0+SW5GaWdodCgpKSB7ICAgICAgICAKKyAgICBsYXN0PShpbnQqKVBMLT5RdWVyeVByb3AoUF9MQVNUX1dFQVJfQUNUSU9OKTsKKyAgICAgIGlmIChwb2ludGVycChsYXN0KSAmJiAobGFzdFswXT09V0FfVU5XRUFSKSAmJiAoKHRpbWUoKS1sYXN0WzFdKTwyKSkgeworICAgICAgICBub3RpZnlfZmFpbCgiRHUgaGFzdCBkb2NoIGdlcmFkZSBlcnN0IGV0d2FzIGF1c2dlem9nZW4hXG4iCisgICAgICAgICAgICAiU28gc2NobmVsbCBiaXN0IER1IG5pY2h0IVxuIik7ICAgICAgICAKKyAgICAgICAgcmV0dXJuIDA7ICAgICAgICAKKyAgICAgIH0KKyAgfQorCisgIC8vIEF1ZiB6dW0gZWlnZW50bGljaGVuIEFuemllaGVuCisgIHJldHVybiBEb1dlYXIoc2lsZW50LCBhbGwpOworCit9CisKKy8vIEZ1bmt0aW9uLCBkaWUgZGFzICJ0cmFnZSIvInppZWhlICogYW4iLUtvbW1hbmRvIGF1c3dlcnRldAordmFyYXJncyBpbnQgZG9fd2VhcihzdHJpbmcgc3RyLCBpbnQgc2lsZW50KSB7ICAKKyAgaW50IGFsbDsgIAorCisgIC8vIEhhdCBkZXIgU3BpZWxlciAidHJhZ2UgYWxsZXMiIGVpbmdlZ2ViZW4/CisgIGFsbD0oc3RyPT0iYWxsZXMiIHx8IHN0cj09ImFsbGUga2xlaWR1bmciIHx8IHN0cj09ImFsbGUgYmVrbGVpZHVuZyIpOworICAKKyAgcmV0dXJuKF9kb193ZWFyKHN0cixzaWxlbnQsYWxsKSk7Cit9CisKK3Byb3RlY3RlZCBpbnQgX2RvX3Vud2VhcihzdHJpbmcgc3RyLCBpbnQgc2lsZW50LCBpbnQgYWxsKSB7CisgIGludCAqIGxhc3Q7CisKKyAgLy8gSXN0IGRpZXNlIFJ1ZXN0dW5nIHVlYmVyaGF1cHQgZ2VtZWludD8gVW5kIGhhdCBkaWVzZXIgU3BpZWxlciBzaWUKKyAgLy8gYXVjaCB3aXJrbGljaCBhbj8KKyAgaWYgKCFzdHJpbmdwKHN0cikgfHwgKCFhbGwgJiYgIWlkKHN0cikpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoIVF1ZXJ5UHJvcChQX1dPUk4pKSB7IAorICAgIGlmIChhbGwpIHsgIAorICAgICAgbm90aWZ5X2ZhaWwoIkFsbGVzIGF1c2dlem9nZW4sIHdhcyBnaW5nLlxuIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCFRdWVyeShQX0FSVElDTEUpIHx8IFF1ZXJ5UHJvcChQX1BMVVJBTCkpIHsKKyAgICAgIG5vdGlmeV9mYWlsKCBicmVha19zdHJpbmcoCisgICAgICAgICAgICAiRHUgdHJhZWdzdCBrIituYW1lKFdFTiwwKSsiLiIsNzgpICk7CisgICAgfQorICAgIGVsc2UgeyAgICAKKyAgICAgIG5vdGlmeV9mYWlsKCBicmVha19zdHJpbmcoCisgICAgICAgICAgICJEdSB0cmFlZ3N0ICIrbmFtZShXRU4sMSkrIiBuaWNodC4iLDc4KSApOyAgCisgICAgfQorICAgIHJldHVybiAwOworICB9CisKKyAgLy8gVmllbGxlaWNodCBkYXJmIGRlciBTcGllbGVyIGphIGdhciBuaWNodHMgbWVociBhdXN6aWVoZW4uCisgIGlmICgob2JqZWN0KVBMLT5JbkZpZ2h0KCkpIHsKKyAgICBsYXN0PShpbnQqKVBMLT5RdWVyeVByb3AoUF9MQVNUX1dFQVJfQUNUSU9OKTsKKyAgICBpZiAocG9pbnRlcnAobGFzdCkgJiYgKGxhc3RbMF09PVdBX1dFQVIpICYmICgodGltZSgpLWxhc3RbMV0pPDIpKSB7CisgICAgICBub3RpZnlfZmFpbCgiRHUgaGFzdCBkb2NoIGdlcmFkZSBlcnN0IGV0d2FzIGFuZ2V6b2dlbiFcbiIgICAgICAgICAgICAgIAorICAgICAgICAgICJTbyBzY2huZWxsIGJpc3QgRHUgbmljaHQhXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorICAvLyBBdWYgenVtIGVpZ2VudGxpY2hlbiBBdXN6aWVoZW4KKyAgcmV0dXJuIERvVW53ZWFyKHNpbGVudCwgYWxsKTsKK30KKworLy8gRGllIEZ1bmt0aW9uLCBkaWUgZGFzICJ6aWVoZSAqIGF1cyItS29tbWFuZG8gYXVzd2VydGV0Cit2YXJhcmdzIGludCBkb191bndlYXIoc3RyaW5nIHN0ciwgaW50IHNpbGVudCkgeworICBpbnQgYWxsOworCisgIGFsbD0oc3RyPT0iYWxsZXMiIHx8IHN0cj09ImFsbGUga2xlaWR1bmciIHx8IHN0cj09ImFsbGUgYmVrbGVpZHVuZyIpOworCisgIHJldHVybihfZG9fdW53ZWFyKHN0cixzaWxlbnQsYWxsKSk7Cit9CisKKy8vIEZ1bmt0aW9uLCBkaWUgZGFzICJ6aWVoZSItS29tbWFuZG8gYXVzd2VydGV0CitpbnQgemllaGUoc3RyaW5nIHN0cikgeyAgIAorICBzdHJpbmcgb2I7CisKKyAgLy8gVWViZXJnZWJlbmVzIEFyZ3VtZW50IHBydWVmZW4KKyAgaWYgKCFzdHJpbmdwKHN0cikpIHsKKyAgICByZXR1cm4gMDsgIAorICB9CisKKyAgLy8gSXN0IEFOemllaGVuIGdlbWVpbnQ/CisgIGlmIChzc2NhbmYoc3RyLCAiJXMgYW4iLCBvYik9PTEpIHsKKyAgICAgIHJldHVybiBkb193ZWFyKG9iICk7CisgIH0KKworICAvLyBPZGVyIGlzdCBBVVN6aWVoZW4gZ2VtZWludD8KKyAgaWYgKHNzY2FuZihzdHIsICIlcyBhdXMiLCBvYik9PTEgKSB7IAorICAgICAgcmV0dXJuIGRvX3Vud2VhcihvYik7CisgIH0KKworICAvLyBPaywgZXMgZ2VodCB3b2hsIHdlZGVyIHVtcyBhbi0gbm9jaCB1bXMgYXVzemllaGVuCisgIHJldHVybiAwOworfQorCisKKy8vIEJlc2NoYWVkaWdlbiBkZXMgS2xlaWR1bmdzc3R1ZWNrcworCisvLyBEaXJla3RlcyBCZXNjaGFlZGlnZW4gZGVyIEtsZWlkdW5nIGR1cmNoIFNldHplbiBkZXIgUHJvcCBnaWJ0cyBuaWNodC4gOy0pCisvLyBEYXMgZ2VodCBhdXMgS29tcGF0aWJpbGl0YWV0Z3J1ZW5kZW4gYmVpIFJ1ZXN0dW5nZW4sIGFiZXIgbmljaHQgbWVociBiZWkKKy8vIEtsZWlkdW5nLiBQdW5rdC4KK3N0YXRpYyBtaXhlZCBfc2V0X2l0ZW1fZGFtYWdlZChtaXhlZCBhcmcpIHsKKyAgcmV0dXJuKFF1ZXJ5UHJvcChQX0RBTUFHRUQpKTsKK30KKworLy8gV2lsbCBtYW4gZWluZSBLbGVpZHVuZyBiZXNjaGFlZGlnZW4gb2RlciByZXBhcmllcmVuLCBzbyBtYWNodCBtYW4gZGFzCisvLyBhbSBiZXN0ZW4gdWViZXIgZGllIEZ1bmt0aW9uIERhbWFnZShhcmd1bWVudCkuIFBvc2l0aXZlIEFyZ3VtZW50ZQorLy8gYmVkZXV0ZW4gZWluZSBCZXNjaGFlZGlndW5nLCBuZWdhdGl2ZSBlaW5lIFJlcGFyYXR1ci4gRGVyIFJ1ZWNrZ2FiZXdlcnQKKy8vIGlzdCBkaWUgd2lya2xpY2ggZHVyY2hnZWZ1ZWhydGUgQWVuZGVydW5nIGRlcyBCZXNjaGFlZGlndW5nc3dlcnRlcworaW50IERhbWFnZShpbnQgbmV3X2RhbSkgeworICByZXR1cm4gMDsKK30KKworLy8gV2lyZCBkaWUgS2xlaWR1bmcgZWluZXIgQmVsYXN0dW5nIGF1c2dlc2V0enQgKGJlaSBSdWVzdHVuZ2VuIHouQi4gYmVpIGVpbmVtCisvLyBBbmdyaWZmIGVpbmVzIEdlZ25lcnMpLCBkYW5uIHdpcmQgVGFrZUZsYXcoKSBhdWZnZXJ1ZmVuLiBCZWkgS2xlaWR1bmdlbgorLy8ga29lbm50ZSBtYW4gamEgcGVyIFBfU0VOU0lUSVZFIGFyYmVpdGVuIG9kZXIgZWluIE1hZ2llciBydWZ0IGJlaSBBa3Rpb25lbgorLy8gVGFrZUZsYXcoKSBhdWYuCit2YXJhcmdzIHZvaWQgVGFrZUZsYXcobWl4ZWQgZGFtX3R5cGVzLG1hcHBpbmcgZWluZm9zKSB7ICAgCisgIGludCBxdWFsaXR5OworCisgIC8vIElzdCBkZXIgUnVlc3R1bmcgZWluZSBRdWFsaXRhZXQgZ2VzZXR6dCB3b3JkZW4sIHNvIGthbm4gZXMgenUgZWluZXIKKyAgLy8gYWxsbWFlaGxpY2hlbiBCZXNjaGFlZGlndW5nIGRlciBSdWVzdHVuZyBrb21tZW4uIEltIGlmKCkgZmxhdyBnbGVpY2gKKyAgLy8gaG9jaHphZWhsZW4uCisgIGlmICgocXVhbGl0eT1RdWVyeVByb3AoUF9RVUFMSVRZKSkgJiYgISgoKytmbGF3KSAlIHF1YWxpdHkpKSB7ICAgICAgCisgICAgRGFtYWdlKDEpOworICB9CisKKyAgLy8gWmVpdHB1bmt0IGRlcyBlcnN0ZW4gQXVmcnVmZXMgZmVzdGhhbHRlbgorICBpZiAoIWZ0aW1lKSAgIAorICAgIGZ0aW1lPXRpbWUoKTsKK30KKworLy8gRGllIEZsYXctRGF0ZW4ga29lbm5lbiBuYXR1ZXJsaWNoIGF1Y2ggYWJnZXJ1ZmVuIHdlcmRlbgorbWl4ZWQgKlF1ZXJ5RmxhdygpIHsKKyAgcmV0dXJuICh7ZmxhdyxmdGltZSxkdGltZShmdGltZSl9KTsKK30KKworcHVibGljIHN0YXR1cyBJc0Nsb3RoaW5nKCkge3JldHVybiAxO30KKwpkaWZmIC0tZ2l0IGEvc3RkL2Nsb3RoaW5nSEcuYyBiL3N0ZC9jbG90aGluZ0hHLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJkMjY1YQotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9jbG90aGluZ0hHLmMKQEAgLTAsMCArMSw1OSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGFybW91ckhHLmMgLS0gYXJtb3VyIHN0YW5kYXJkIG9iamVjdCBmb3IgaGF0cyBhbmQgZ2xhc3NlcworLy8KKy8vICRJZDogYXJtb3VySEcuYyx2IDEuNCAyMDAyLzA4LzE5IDE0OjIxOjMxIFJpa3VzIEV4cCAkCisKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKworaW5oZXJpdCAiL3N0ZC9jbG90aGluZyI7CisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8dGhpbmcvY29tbWFuZHMuaD4KKyN1bmRlZiBORUVEX1BST1RPVFlQRVMKKworI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorCitpbnQgc2V0emVuKHN0cmluZyBzKTsKKwordm9pZCBjcmVhdGUoKSB7CisgICAgOjpjcmVhdGUoKTsKKyAgICBBZGRDbWQoKHsic2V0eiIsInNldHplIn0pLCJzZXR6ZW4iKTsKK30KKwordmFyYXJncyB2b2lkIGRvV2Vhck1lc3NhZ2UoIGludCBhbGwgKSB7CisgIGlmKCBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKFBMKSApIHsKKyAgICB3cml0ZSggIkR1IHNldHp0ICIgKyBuYW1lKFdFTiwxKSArICIgYXVmLlxuIiApOworICB9CisgIGlmIChvYmplY3RwKGVudmlyb25tZW50KCkpICYmIG9iamVjdHAoZW52aXJvbm1lbnQoZW52aXJvbm1lbnQoKSkpKQorICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudChlbnZpcm9ubWVudCgpKSwKKwljYXBpdGFsaXplKChzdHJpbmcpUEwtPm5hbWUoV0VSKSkgKyAiIHNldHp0ICIgKyBuYW1lKFdFTiwwKSArIAorCSIgYXVmLlxuIik7Cit9CisKK3ZhcmFyZ3Mgdm9pZCBkb1Vud2Vhck1lc3NhZ2UoIG9iamVjdCB3b3JuX2J5LCBpbnQgYWxsICkgeworICBpZiggcXVlcnlfb25jZV9pbnRlcmFjdGl2ZSh3b3JuX2J5KSApIHsKKyAgICB0ZWxsX29iamVjdCh3b3JuX2J5LCAgIkR1IHNldHp0ICIgKyBuYW1lKFdFTiwxKSArICIgYWIuXG4iICk7CisgIH0KKyAgdGVsbF9yb29tKGVudmlyb25tZW50KHdvcm5fYnkpLCAKKwkgICAgKGNhcGl0YWxpemUoKHN0cmluZyl3b3JuX2J5LT5uYW1lKFdFUikpKSArICIgc2V0enQgIiArCisJICAgIG5hbWUoV0VOLDApICsgIiBhYi5cbiIsICh7d29ybl9ieX0pKTsKK30KKworaW50IHNldHplbihzdHJpbmcgc3RyKSB7CisgIHN0cmluZyBvYjsKKworICBpZighc3RyKQorICAgIHJldHVybiAwOworICBpZihzc2NhbmYoc3RyLCAiJXMgYXVmIiwgb2IpPT0xICkKKyAgICByZXR1cm4gX2RvX3dlYXIob2IsIDAsIDApOworICBpZihzc2NhbmYoc3RyLCAiJXMgYWIiLCBvYik9PTEgKQorICAgIHJldHVybiBfZG9fdW53ZWFyKG9iLCAwLCAwKTsKKyAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL3N0ZC9jbG90aGluZ19jb250YWluZXIuYyBiL3N0ZC9jbG90aGluZ19jb250YWluZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzkzYjkyCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL2Nsb3RoaW5nX2NvbnRhaW5lci5jCkBAIC0wLDAgKzEsNTQgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vLAorLy8gY2xvdGhpbmdfY29udGFpbmVyLmMgLS0gS2xlaWR1bmcsIGluIGRpZSBtYW4gd2FzIHJlaW5zdGVja2VuIGthbm4KKy8vCisvLyAkSWQ6IGNsb3RoaW5nX2NvbnRhaW5lci5jLHYgMS4zIDIwMDMvMDgvMDcgMDc6MjU6NDMgUmlrdXMgRXhwICQKKworI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworI3ByYWdtYSByYW5nZV9jaGVjaworCitpbmhlcml0ICIvc3RkL3RoaW5nL3Byb3BlcnRpZXMiOworaW5oZXJpdCAiL3N0ZC90aGluZy9jb21tYW5kcyI7Citpbmhlcml0ICIvc3RkL3RoaW5nL2xhbmd1YWdlIjsKK2luaGVyaXQgIi9zdGQvdGhpbmcvZW52Y2hrIjsKK2luaGVyaXQgIi9zdGQvY29udGFpbmVyL2xpZ2h0IjsKK2luaGVyaXQgIi9zdGQvY29udGFpbmVyL3Jlc3RyaWN0aW9ucyI7Citpbmhlcml0ICIvc3RkL2NvbnRhaW5lci9pbnZlbnRvcnkiOworaW5oZXJpdCAiL3N0ZC9jb250YWluZXIvaXRlbXMiOworaW5oZXJpdCAiL3N0ZC9jbG90aGluZy9tb3ZpbmciOworaW5oZXJpdCAiL3N0ZC9jbG90aGluZy93ZWFyIjsKK2luaGVyaXQgIi9zdGQvY2xvdGhpbmcvY29udGFpbmVyX2Rlc2NyaXB0aW9uIjsKKworLy8jZGVmaW5lIE5FRURfUFJPVE9UWVBFUworCisjaW5jbHVkZSA8Y29udGFpbmVyLmg+CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpIHsKKyAgcHJvcGVydGllczo6Y3JlYXRlKCk7CisgIGNvbW1hbmRzOjpjcmVhdGUoKTsKKyAgbGlnaHQ6OmNyZWF0ZSgpOworICBjb250YWluZXJfZGVzY3JpcHRpb246OmNyZWF0ZSgpOworICByZXN0cmljdGlvbnM6OmNyZWF0ZSgpOworICBpdGVtczo6Y3JlYXRlKCk7CisgIHdlYXI6OmNyZWF0ZSgpOworICBlbnZjaGs6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfQ09OVEFJTkVSLDEpOworICBTZXRQcm9wKFBfUFJFUE9TSVRJT04sICJpbiIpOworICBTZXRQcm9wKFBfU09VUkNFX1BSRVBPU0lUSU9OLCAiYXVzIik7CisgIFNldFByb3AoUF9ERVNUX1BSRVBPU0lUSU9OLCAiaW4iKTsKKyAgQWRkSWQoIkRpbmciKTsKK30KKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlX3N1cGVyKCkgeworICBzZXRfbmV4dF9yZXNldCgtMSk7Cit9CisKK3ZvaWQgcmVzZXQoKSAgeworICBpdGVtczo6cmVzZXQoKTsKK30KKworaW50IElzQ2xvdGhpbmcoKSB7cmV0dXJuIDE7fQorCmRpZmYgLS1naXQgYS9zdGQvY29udGFpbmVyLmMgYi9zdGQvY29udGFpbmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc3YzdmYQotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9jb250YWluZXIuYwpAQCAtMCwwICsxLDY3IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gY29udGFpbmVyLmMgLS0gY29udGFpbmVyIHN0YW5kYXJkIG9iamVjdAorLy8KKy8vICRJZDogY29udGFpbmVyLmMgNzgwNCAyMDExLTA3LTEwIDIwOjM3OjUyWiBaZXNzdHJhICQKKworLy8gVGhlIG1vc3QgZ2VuZXJhbCBvYmplY3QgY2xhc3MuIEl0IGRlZmluZXMgdGhlIHJlYWxseSBiYXNpYyBmdW5jdGlvbnMuCisvLworLy8gVGhpcyBvYmplY3Qgc2hvdWxkIHVuZGVyc3RhbmQgdGhlIHByb3BlcnRpZXMgc2hvcnQsIGxvbmcsIGluZm8sIHJlYWRfbXNnLAorLy8gdmFsdWUsIHdlaWdodC4KKy8vCisvLyB3ZWlnaHQgaXMgZ2l2ZW4gaW4gZ3JhbXMsIDEga2lsb2dyYW0gKGtnKSA9IDEwMDAgZ3JhbXMgKGcpID0gMSBvbGQgd2VpZ2h0CisvLyB1bml0CisKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKworaW5oZXJpdCAiL3N0ZC90aGluZy9wcm9wZXJ0aWVzIjsKK2luaGVyaXQgIi9zdGQvdGhpbmcvbW92aW5nIjsKK2luaGVyaXQgIi9zdGQvdGhpbmcvY29tbWFuZHMiOworaW5oZXJpdCAiL3N0ZC90aGluZy9sYW5ndWFnZSI7Citpbmhlcml0ICIvc3RkL2NvbnRhaW5lci9kZXNjcmlwdGlvbiI7Citpbmhlcml0ICIvc3RkL2NvbnRhaW5lci9saWdodCI7Citpbmhlcml0ICIvc3RkL2NvbnRhaW5lci9yZXN0cmljdGlvbnMiOworaW5oZXJpdCAiL3N0ZC9jb250YWluZXIvaW52ZW50b3J5IjsKK2luaGVyaXQgIi9zdGQvY29udGFpbmVyL2l0ZW1zIjsKK2luaGVyaXQgIi9zdGQvdGhpbmcvZW52Y2hrIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgIHByb3BlcnRpZXM6OmNyZWF0ZSgpOworICBjb21tYW5kczo6Y3JlYXRlKCk7CisgIGxpZ2h0OjpjcmVhdGUoKTsKKyAgZGVzY3JpcHRpb246OmNyZWF0ZSgpOworICByZXN0cmljdGlvbnM6OmNyZWF0ZSgpOworICBpdGVtczo6Y3JlYXRlKCk7CisgIGVudmNoazo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9DT05UQUlORVIsMSk7CisgIFNldFByb3AoUF9QUkVQT1NJVElPTiwgImluIik7CisgIFNldFByb3AoUF9TT1VSQ0VfUFJFUE9TSVRJT04sICJhdXMiKTsKKyAgU2V0UHJvcChQX0RFU1RfUFJFUE9TSVRJT04sICJpbiIpOworfQorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGVfc3VwZXIoKSB7CisgIHNldF9uZXh0X3Jlc2V0KC0xKTsKK30KKworLyoKK3ZvaWQgaW5pdCgpIAoreworICBjb21tYW5kczo6aW5pdCgpOworICBkZXNjcmlwdGlvbjo6aW5pdCgpOworfQorKi8KKwordm9pZCByZXNldCgpCit7CisgIGl0ZW1zOjpyZXNldCgpOworfQorCmRpZmYgLS1naXQgYS9zdGQvY29udGFpbmVyL2Rlc2NyaXB0aW9uLmMgYi9zdGQvY29udGFpbmVyL2Rlc2NyaXB0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRmN2I1YwotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9jb250YWluZXIvZGVzY3JpcHRpb24uYwpAQCAtMCwwICsxLDEwMyBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGNvbnRhaW5lci9kZXNjcmlwdGlvbi5jIC0tIHN0YW5kYXJkIGRlc2NyaXB0aW9uIGZvciBjb250YWluZXJzCisvLworLy8gJElkOiBkZXNjcmlwdGlvbi5jIDg3NTUgMjAxNC0wNC0yNiAxMzoxMzo0MFogWmVzc3RyYSAkCisKK2luaGVyaXQgIi9zdGQvdGhpbmcvZGVzY3JpcHRpb24iOworCisjcHJhZ21hIHN0cmljdF90eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisKKyNpbmNsdWRlIDxjb250YWluZXIuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorCisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX1RSQU5TUEFSRU5ULCAxKTsKKyAgQWRkSWQoIkNvbnRhaW5lciIpOworfQorCit2YXJhcmdzIHN0cmluZyBsb25nKGludCBtb2RlKSB7CisgIHN0cmluZyBkZXNjciwgaW52X2Rlc2NyOworCisgIGRlc2NyID0gcHJvY2Vzc19zdHJpbmcoUXVlcnlQcm9wKFBfTE9ORykpOworICBpZighUXVlcnlQcm9wKFBfVFJBTlNQQVJFTlQpKSByZXR1cm4gZGVzY3I7CisKKyAgaW52X2Rlc2NyID0gbWFrZV9pbnZsaXN0KFBMLCBhbGxfaW52ZW50b3J5KE1FKSwgbW9kZSApOworICBpZiAoIGludl9kZXNjciAhPSAiIiApCisgICAgZGVzY3IgKz0gY2FwaXRhbGl6ZShRdWVyeVByb25vdW4oV0VSKSkgKyAiIGVudGhhZWx0OlxuIiArIGludl9kZXNjcjsKKyAgcmV0dXJuIGRlc2NyOworfQorCisvLyBmbGFnczogMSAtIHdpemFyZCwgMiAtIGRvbid0IGNvbGxlY3QgZXF1YWwgb2JqZWN0cyAnCisvLyBmbGFnczogNCAtIGRvbid0IGFwcGVuZCBpbmZvcyBmb3Igd2l6YXJkcworcHJpdmF0ZSB2b2lkIHN0cmluZ2VuaXplKG1peGVkIG9iaiwgaW50IGZsYWdzLCBtaXhlZCBvYmpzLCBtaXhlZCBpbmZvKQoreworICBzdHJpbmcgaWQsIHRtcDsKKyAgaW50IGlkeDsKKyAgCisgIGlmICggKCEoZmxhZ3MgJiA0KSAmJiAoZmxhZ3MgJiAxKSkpIHsKKyAgICAvL3dlbm4gTWFnaWVyIHVuZCBNYWdpZXJpbmZvcyBhbmdlaGFlbmd0IHdlcmRlbiBzb2xsZW46CisgICAgdG1wID0gY2FwaXRhbGl6ZShvYmotPnNob3J0KCl8fCIiKVswLi48Ml0KKyAgICAgICAgKyAiIFsiK29iamVjdF9uYW1lKG9iaikrIl0iOworICB9CisgIGVsc2UgaWYgKG9iai0+UXVlcnlQcm9wKFBfSU5WSVMpKSB7CisgICAgLy9rZWluZSBBdXNnYWJlIGJ6dy4gbGVlcmVyIFN0cmluZywgd2lyZCBkYW5uIHZvbiBjb2xsZWN0IHJhdXNnZXNjaG1pc3NlbgorICAgIHRtcD0iIjsKKyAgfQorICBlbHNlIHsKKyAgICAvL1NwaWVsZXIsIE1hZ2llciBvaG5lIFBfV0FOVFNfVE9fTEVBUk4gZXRjLgorICAgIHRtcCA9IGNhcGl0YWxpemUob2JqLT5zaG9ydCgpfHwiIilbMC4uPDJdOworICB9CisgIC8vd2VubiB3aXphcmQgdW5kICdkb250IGNvbGxlY3QgZXF1YWwgb2JqZWN0cyc6IGlkIGlzdCBvYmplY3RfbmFtZSgpCisgIGlmKGZsYWdzICYgMyB8fCBsaXZpbmcob2JqKSkgCisgICAgaWQgPSBvYmplY3RfbmFtZShvYmopOworICAvL3NvbnN0IG5laG1lbiB3aXIgZGVuIE5hbWVuIGRlciBCbHVlcHJpbnQgLT56dXNhbW1lbmZhc3NlbiBkZXIgT2JqZWt0ZQorICBlbHNlCisgICAgaWQgPSBCTFVFX05BTUUob2JqKSArIHRtcDsKKyAgLy8gQW56YWhsIGRlcyBqZXdlaWxpZ2VuIE9iamVrdHMgKGFuaGFuZCB2b24gaWQpIHphZWhsZW4uCisgIGlmKChpZHggPSBtZW1iZXIob2JqcywgaWQpKSA9PSAtMSkKKyAgeworICAgIG9ianMgKz0gKHsgaWQgfSk7CisgICAgaW5mbyArPSAoeyAoeyB0bXAsIDEsIG9ian0pIH0pOworICB9CisgIGVsc2UKKyAgICBpbmZvW2lkeF1bMV0rKzsKK30KKworcHJpdmF0ZSBzdHJpbmcgY29sbGVjdChtaXhlZCBvYmopCit7CisgIC8vYmVrb21tdCBlaW4gQXJyYXkgKHtuYW1lLGFuemFobCxvYmpla3R9KQorICAvL09iamVrdGUgb2huZSBOYW1lbiAoUF9TSE9SVD09MCBvZGVyIFBfSU5WSVMpIHdlZ3dlcmZlbgorICBpZighc2l6ZW9mKG9ialswXSkpIHJldHVybiAwOworICAvLyBPYmpla3RuYW1lICsgKEFuemFobCkgenVydWVja2dlYmVuLgorICByZXR1cm4gb2JqWzBdICsgKG9ialsxXSA+IDEgPyAiICgiK29ialsxXSsiKSIgOiAiIik7Cit9CisKKy8vIGZsYWdzOiAxIC0gcmV0dXJuIGFycmF5LCAyIC0gZG9uJ3QgY29sbGVjdCBlcXVhbCBvYmplY3RzICcKKy8vIGZsYWdzOiA0IC0gZG9uJ3QgYXBwZW5kIGluZm9zIGZvciB3aXphcmRzCit2YXJhcmdzIG1peGVkIG1ha2VfaW52bGlzdChvYmplY3Qgdmlld2VyLCBtaXhlZCBpbnYsIGludCBmbGFncykKK3sKKyAgaW50IGlzd2l6OworICBtaXhlZCBvYmpzLCBpbmZvOworCisgIGlzd2l6ID0gSVNfTEVBUk5FUiggdmlld2VyICkgJiYgdmlld2VyLT5RdWVyeVByb3AoUF9XQU5UU19UT19MRUFSTik7CisgIG9ianMgPSAoe30pOyBpbmZvID0gKHt9KTsKKyAgbWFwKGludiwgIydzdHJpbmdlbml6ZS8qJyovLCBpc3dpeiB8IChmbGFncyAmIDIpIHwgKGZsYWdzICYgNCksICZvYmpzLCAmaW5mbyk7CisgIGlmKGZsYWdzICYgMSkgcmV0dXJuIGluZm87CisgIGludiA9IG1hcChpbmZvLCAjJ2NvbGxlY3QvKicqLykgLSAoeyAwIH0pOworICBpZighc2l6ZW9mKGludikpIHJldHVybiAiIjsKKyAgcmV0dXJuIHNwcmludGYoIiUiKyhzaXplb2YoaW52KSA+IDYgPyAiIyIgOiAiPSIpKyItNzhzIiwKKyAgICAgICAgICAgICAgICAgaW1wbG9kZShpbnYsICJcbiIpKSArICJcbiI7Cit9CisKZGlmZiAtLWdpdCBhL3N0ZC9jb250YWluZXIvaW52ZW50b3J5LmMgYi9zdGQvY29udGFpbmVyL2ludmVudG9yeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMDU3YjcKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvY29udGFpbmVyL2ludmVudG9yeS5jCkBAIC0wLDAgKzEsMTI4IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gY29udGFpbmVyL2ludmVudG9yeS5jIC0tIFVtZ2FuZyBtaXQgYmVzb25kZXJlbiBPYmpla3RlbiBpbSBJbnZlbnRvcnkKKy8vCisvLyAkSWQ6IGludmVudG9yeS5jIDYzNzkgMjAwNy0wNy0yMCAyMjozMjowMlogWmVzc3RyYSAkCisKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKy8vI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworCisjaW5jbHVkZSA8dGhpbmcuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8c2Vuc2l0aXZlLmg+CisKKyNkZWZpbmUgTUUgdGhpc19vYmplY3QoKQorCit2b2lkIFJlbW92ZVNlbnNpdGl2ZU9iamVjdEZyb21MaXN0KG9iamVjdCBvYiwgc3RyaW5nIGxpc3QpIHsKKyAgbWl4ZWQgYSxiLGM7CisgIGludCBpLGY7CisKKyAgaWYgKCFwb2ludGVycChhPVF1ZXJ5UHJvcChTRU5TX1BST1BfUFJFRklYK2xpc3QpKSkKKyAgICByZXR1cm47CisgIGY9MTsKKyAgZm9yIChpPXNpemVvZihhKS0xO2k+PTA7aS0tKQorICAgIGlmICghcG9pbnRlcnAoYj1hW2ldKSB8fAorCSFzaXplb2YoYikgfHwKKwkhb2JqZWN0cChjPWJbMF0pIHx8CisJZW52aXJvbm1lbnQoYykhPU1FIHx8CisJYz09b2IpCisgICAgICBhW2ldPWY9MDsKKyAgaWYgKGYpCisgICAgcmV0dXJuOworICBhLT0oezB9KTsKKyAgaWYgKCFzaXplb2YoYSkpCisgICAgYT0wOworICBTZXRQcm9wKFNFTlNfUFJPUF9QUkVGSVgrbGlzdCxhKTsKK30KKwordm9pZCBSZW1vdmVTZW5zaXRpdmVPYmplY3Qob2JqZWN0IG9iKSB7CisgIFJlbW92ZVNlbnNpdGl2ZU9iamVjdEZyb21MaXN0KG9iLFNFTlNJVElWRV9JTlZFTlRPUlkpOworICBSZW1vdmVTZW5zaXRpdmVPYmplY3RGcm9tTGlzdChvYixTRU5TSVRJVkVfSU5WRU5UT1JZX1RSSUdHRVIpOworfQorCit2YXJhcmdzIHZvaWQgSW5zZXJ0U2Vuc2l0aXZlT2JqZWN0VG9MaXN0KG9iamVjdCBvYiwgc3RyaW5nIGxpc3QsIHN0cmluZyBrZXksCisJCQkJCSBpbnQgdGhyZXNob2xkLCBtaXhlZCAqb3B0KSB7CisgIG1peGVkIGE7CisgIGludCBpOworICAKKyAgaWYgKCFwb2ludGVycChhPVF1ZXJ5UHJvcChTRU5TX1BST1BfUFJFRklYK2xpc3QpKSkKKyAgICBhPSh7fSk7CisgIGZvciAoaT1zaXplb2YoYSktMTtpPj0wO2ktLSkKKyAgICBpZiAoYVtpXVtTRU5TX09CSkVDVF09PW9iICYmIGFbaV1bU0VOU19LRVldPT1rZXkpCisgICAgICByZXR1cm47CisgIGErPSh7KHtvYixzeW1ib2xfZnVuY3Rpb24oU0VOU19UUklHR0VSX1BSRUZJWCtsaXN0LG9iKSwKKyAgICAgICAgIGtleSx0aHJlc2hvbGQsb3B0fSl9KTsKKyAgU2V0UHJvcChTRU5TX1BST1BfUFJFRklYK2xpc3QsYSk7Cit9CisKK3ZvaWQgSW5zZXJ0U2Vuc2l0aXZlT2JqZWN0KG9iamVjdCBvYiwgbWl4ZWQgYXJnKSB7CisgIGludCBpOworICBtaXhlZCB4OworICBtYXBwaW5nIG1hcF9sZGZpZWQ7CisgIAorICBpZiAoIXBvaW50ZXJwKGFyZykpCisgICAgcmV0dXJuOworICBmb3IgKGk9c2l6ZW9mKGFyZyktMTtpPj0wO2ktLSkKKyAgICBpZiAocG9pbnRlcnAoeD1hcmdbaV0pICYmCisJc2l6ZW9mKHgpPj0zICYmCisJc3RyaW5ncCh4WzBdKSAmJgorCXN0cmluZ3AoeFsxXSkgJiYKKwlpbnRwKHhbMl0pKSB7CisgICAgICBJbnNlcnRTZW5zaXRpdmVPYmplY3RUb0xpc3Qob2IseFswXSx4WzFdLHhbMl0seFszLi5dKTsKKyAgICAgIGNhbGxfb3RoZXIoTUUsU0VOU19JTlNFUlRfUFJFRklYK3hbMF0sb2IseFsxXSx4WzJdLHhbMy4uXSk7CisgICAgfQorfQorCit2YXJhcmdzIHZvaWQgaW5zZXJ0X3NlbnNpdGl2ZV9pbnYob2JqZWN0IG9iLCBzdHJpbmcga2V5LAorCQkJCSBpbnQgdGhyZXNob2xkLCBtaXhlZCAqb3B0KSB7CisgIC8vIERpZXNlIEZ1bmt0aW9uIHN1Y2h0LCBvYiBiZWltIEhpbnp1ZnVlZ2VuIGVpbmVzIHNlbnNpdGl2ZW4gT2JqZWt0cworICAvLyBzY2hvbiBlaW4gT2JqZWt0IGRhIGlzdCwgZGFzcyBkaWVzZXMgYXVzbG9lc3QuCisgIC8vIHouQi4gKGR5bmFtaXQsIGZldWVyLCAxMDAsIG9wdF9keW5hbWl0KSBzb3JndCBmdWVyCisgIC8vIGR5bmFtaXQtPnRyaWdnZXJfc2Vuc2l0aXZlX2ludihmYWNrZWwsZmV1ZXIsMTIwLG9wdF9mYWNrZWwsb3B0X2R5bmFtaXQpCisgIC8vIHdlbm4gZWluZSBGYWNrZWwgdm9yaGVyIG1pdCBXZXJ0IDEyMCBlaW5nZXRyYWdlbiB3YXIuCisgIG1peGVkIGEseDsKKyAgaW50IGk7CisgIAorICBpZiAoIXBvaW50ZXJwKGE9UXVlcnlQcm9wKFBfU0VOU0lUSVZFX0lOVkVOVE9SWV9UUklHR0VSKSkgfHwKKyAgICAgICFvYmplY3RwKG9iKSkKKyAgICByZXR1cm47CisgIGZvciAoaT1zaXplb2YoYSktMTtpPj0wO2ktLSkKKyAgICBpZiAocG9pbnRlcnAoeD1hW2ldKSAmJgorCXhbU0VOU19LRVldPT1rZXkgJiYKKwl4W1NFTlNfVEhSRVNIT0xEXT50aHJlc2hvbGQgJiYgLy8gSXN0IGRlciBBdXNsb2VzZXIgZ3Jvc3MgZ2VudWc/CisJb2JqZWN0cCh4W1NFTlNfT0JKRUNUXSkgJiYKKwllbnZpcm9ubWVudCh4W1NFTlNfT0JKRUNUXSk9PWVudmlyb25tZW50KG9iKSkKKyAgICAgIG9iLT50cmlnZ2VyX3NlbnNpdGl2ZV9pbnYoeFtTRU5TX09CSkVDVF0seFtTRU5TX0tFWV0seFtTRU5TX1RIUkVTSE9MRF0sCisJCQkJeFtTRU5TX09QVF0sb3B0KTsKKyAgLy8gWnVlcnN0IFRyaWdnZXItT3B0aW9uZW4sIGRhbm4gT3B0aW9uZW4gZGVzIHNlbnNpdGl2ZW4gT2JqZWt0cworfQorCit2YXJhcmdzIHZvaWQgaW5zZXJ0X3NlbnNpdGl2ZV9pbnZfdHJpZ2dlcihvYmplY3Qgb2IsIHN0cmluZyBrZXksCisJCQkJCSBpbnQgdGhyZXNob2xkLCBtaXhlZCAqb3B0KSB7CisgIC8vIERpZXNlIEZ1bmt0aW9uIHN1Y2h0LCBvYiBlaW4gc2Vuc2l0aXZlcyBPYmpla3QgaW0gSW52ZW50b3J5IGlzdCwKKyAgLy8gZGFzIGR1cmNoIGRpZXNlcyBPYmpla3QgYXVzZ2Vsb2VzdCB3aXJkLgorICAvLyB6LkIuIChmYWNrZWwsIGZldWVyLCAxMjAsIG9wdF9mYWNrZWwpIHNvcmd0IGZ1ZXIKKyAgLy8gZHluYW1pdC0+dHJpZ2dlcl9zZW5zaXRpdmVfaW52KGZhY2tlbCxmZXVlciwxMjAsb3B0X2ZhY2tlbCxvcHRfZHluYW1pdCkKKyAgLy8gd2VubiBEeW5hbWl0IG1pdCBXZXJ0PDEyMCBlaW5nZXRyYWdlbiB3YXIKKyAgbWl4ZWQgYSx4OworICBpbnQgaTsKKyAgCisgIGlmICghcG9pbnRlcnAoYT1RdWVyeVByb3AoUF9TRU5TSVRJVkVfSU5WRU5UT1JZKSkgfHwKKyAgICAgICFvYmplY3RwKG9iKSkKKyAgICByZXR1cm47CisgIGZvciAoaT1zaXplb2YoYSktMTtpPj0wO2ktLSkKKyAgICBpZiAocG9pbnRlcnAoeD1hW2ldKSAmJgorCXhbU0VOU19LRVldPT1rZXkgJiYKKwl4W1NFTlNfVEhSRVNIT0xEXTx0aHJlc2hvbGQgJiYgLy8gQXVzbG9lc2VyIGdyb3NzIGdlbnVnPworCW9iamVjdHAoeFtTRU5TX09CSkVDVF0pICYmCisJZW52aXJvbm1lbnQoeFtTRU5TX09CSkVDVF0pPT1lbnZpcm9ubWVudChvYikgJiYKKwljbG9zdXJlcCh4W1NFTlNfQ0xPU1VSRV0pKQorICAgICAgZnVuY2FsbCh4W1NFTlNfQ0xPU1VSRV0sCisJICAgICAgb2Isa2V5LHRocmVzaG9sZCxvcHQseFtTRU5TX09QVF0pOworICAvLyBadWVyc3QgVHJpZ2dlci1PcHRpb25lbiwgZGFubiBPcHRpb25lbiBkZXMgc2Vuc2l0aXZlbiBPYmpla3RzCit9CmRpZmYgLS1naXQgYS9zdGQvY29udGFpbmVyL2l0ZW1zLmMgYi9zdGQvY29udGFpbmVyL2l0ZW1zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk2MWJmZQotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9jb250YWluZXIvaXRlbXMuYwpAQCAtMCwwICsxLDI1NiBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGNvbnRhaW5lci9pdGVtcy5jIC0tIGNyZWF0aW5nIGV4dHJhIGl0ZW1zIGluIHJvb20KKy8vCisvLyAkSWQ6IGl0ZW1zLmMgODgxMSAyMDE0LTA1LTA5IDE3OjMwOjM3WiBaZXNzdHJhICQKKworLy8gZXh0cmEgaXRlbXMgaGFuZGxpbmcKKy8vCisvLwlBZGRJdGVtKHN0cmluZyBmaWxlbmFtZSwgaW50IHJlZnJlc2gpCisvLwkgIENsb25lcyBhbiBpdGVtIGFuZCBwdXRzIGl0IGludG8gdGhlIHJvb20uIDxyZWZyZXNoPiBtYXkgYmUKKy8vCSAgb24gb2YgdGhlIGZvbGxvd2luZzoKKy8vCSAgUkVGUkVTSF9OT05FOiBObyByZWZyZXNoIGRvbmUgdW50aWwgcmVib290LgorLy8JICBSRUZSRVNIX0RFU1RSVUNUOiBSZWZyZXNoIG9uIHJlc2V0IGlmIGl0ZW0gd2FzIGRlc3RydWN0ZWQuCisvLwkgIFJFRlJFU0hfUkVNT1ZFOiBSZWZyZXNoIG9uIHJlc2V0IGlmIGl0ZW0gd2FzIHJlbW92ZWQgZnJvbSByb29tLgorLy8JICBSRUZSRVNIX0FMV0FZUzogQ3JlYXRlIGEgbmV3IGNsb25lIG9uIGV2ZXJ5IHJlc2V0LgorLy8KKy8vIFRoZSBjb21tYW5kcyBhcmUgaW1wbGVtZW50ZWQgYXMgcHJvcGVydGllcyBQX0lURU1TIGFzIG1hcHBpbmcuIFRoZXkgYXJlIAorLy8gc3RvcmVkIGxvY2FsbHkgKF9zZXRfeHgpIGFzIG1hcHBpbmcgdG8gc3BlZWQgdXAgdGhlIHJvdXRpbmVzIAorLy8gaW4gdGhpcyBtb2R1bGUuCisvLyAKKy8vIEZvcm1hdCBvZiBrZXkgYW5kIGRhdGEgaW4gdGhlIFBfSVRFTVMgbWFwcGluZzoKKy8vCisvLyAoWyBrZXkxIDogcmVmcmVzaDE7IG9icDE7IGFycjEsIC4uLiwga2V5biA6IHJlZnJlc2huOyBvYnBuOyBhcnJuIF0pCisKKyNpbmNsdWRlIDxzeXNfZGVidWcuaD4KKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDx0aGluZy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8cm9vbXMuaD4KKyNpbmNsdWRlIDxjb250YWluZXIuaD4KKyN1bmRlZiBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPGRhZW1vbi5oPgorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreyAKKyAgICBTZXQoIFBfSVRFTVMsICh7fSkgKTsKKyAgICBTZXQoIFBfSVRFTVMsIFNFQ1VSRUQsIEZfTU9ERV9BUyApOworICAgIAorICAgIE9CSkVDVEQtPlF1ZXJ5T2JqZWN0KCk7ICAvLyBxdWVyeWluZyBnZW5lcmFsIG9iamVjdHMKK30KKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlX3N1cGVyKCkgeworICBzZXRfbmV4dF9yZXNldCgtMSk7Cit9CisKKy8qIEtyYW0genVtIEF1ZnJhZXVtZW4gdm9uIG11bHRpcGxlbiBnbGVpY2hlbiBJdGVtcyBpbSBDb250YWluZXIuICovCitwcml2YXRlIG9iamVjdCByZW1vdmVhYmxlX29iKCBvYmplY3Qgb2IgKQoreworICAgIGlmICggIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2IpICYmICFsaXZpbmcob2IpICkKKyAgICAgICAgcmV0dXJuIG9iOworCisgICAgcmV0dXJuIDA7Cit9CisKK3Byb3RlY3RlZCB2YXJhcmdzIHZvaWQgcmVtb3ZlX211bHRpcGxlKGludCBsaW1pdCwgbWl4ZWQgZnVuKQoreworICAgIG9iamVjdCAqaW5oID0gYWxsX2ludmVudG9yeSh0aGlzX29iamVjdCgpKSAtICh7MH0pOworCisgICAgaW5oID0gZmlsdGVyKCBpbmgsICMncmVtb3ZlYWJsZV9vYiApOworICAgIGZvcmVhY2gobWl4ZWQgaXRlbSA6IFF1ZXJ5UHJvcChQX0lURU1TKSkKKyAgICAgIGluaCAtPSAoeyBpdGVtWzBdIH0pOworIAorICAgIGlmICghc3RyaW5ncChmdW4pICYmICFjbG9zdXJlcChmdW4pKQorICAgICAgZnVuID0gImRlc2NyaXB0aW9uX2lkIjsKKyAgICBpbmggPSB1bmlxdWVfYXJyYXkoaW5oLCBmdW4sIDApOworICAgIGZvcmVhY2gobWl4ZWQgYXJyOiBpbmgpCisgICAgeworICAgICAgaWYgKHNpemVvZihhcnIpIDw9IGxpbWl0KQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGNhdGNoKGNhbGxfb3RoZXIoYXJyW2xpbWl0IC4uXSwgInJlbW92ZSIpOyBwdWJsaXNoKTsKKyAgICB9Cit9CisKKworLyogSXRlbSBoYW5kbGluZyAqLworcHVibGljIHZhcmFyZ3Mgb2JqZWN0IEFkZEl0ZW0oIG1peGVkIGZpbGVuYW1lLCBpbnQgcmVmcmVzaCwgbWl4ZWQgcHJvcHMgKSAKK3sKKyAgICBzdHJpbmcgZmlsZTsKKyAgICBvYmplY3Qgb2I7CisgICAgaW50IGk7CisKKyAgICBpZiggcG9pbnRlcnAoZmlsZW5hbWUpICkgeworICAgICAgICBmb3IoIGkgPSBzaXplb2YoZmlsZW5hbWUpOyBpLS07ICkKKyAgICAgICAgICAgIGZpbGVuYW1lW2ldID0gKHN0cmluZyltYXN0ZXIoKS0+X2dldF9wYXRoKCBmaWxlbmFtZVtpXSwgIj8iICk7CisgICAgICAgIAorICAgICAgICBmaWxlID0gZmlsZW5hbWVbcmFuZG9tKCBzaXplb2YoZmlsZW5hbWUpICldOworICAgIH0KKyAgICBlbHNlIAorICAgICAgICBmaWxlID0gZmlsZW5hbWUgPSAoc3RyaW5nKW1hc3RlcigpLT5fZ2V0X3BhdGgoIGZpbGVuYW1lLCAiPyIgKTsKKyAgICAKKyAgICBpZiAoIHByb3BzID09IDEgKQorICAgICAgICBjYXRjaChvYiA9IGxvYWRfb2JqZWN0KCBmaWxlKTsgcHVibGlzaCk7CisgICAgZWxzZQorCWNhdGNoKG9iID0gY2xvbmVfb2JqZWN0KGZpbGUpOyBwdWJsaXNoKTsKKyAgICAKKyAgICBpZiAob2JqZWN0cChvYikpIHsKKyAgICAgIG9iLT5tb3ZlKCB0aGlzX29iamVjdCgpLCBNX05PQ0hFQ0t8TV9OT19BVFRBQ0sgKTsKKyAgICAgIC8vIG1pdCBBYnNpY2h0IGtlaW5lIFBydWVmdW5nIGF1ZnMgTW92ZSwgd2VubnMgbmljaHQgZ2VodCwgc29sbHMgMnMKKyAgICAgIC8vIHNwYWV0ZXIgYXVmIGRlciBFYmVuZSBidWdnZW4sIHdlaWwgcHJha3Rpc2NoIG5pZW1hbmQgaW0gY3JlYXRlKCkgZGFzCisgICAgICAvLyBFcmdlYm5pcyB2b20gQWRkSXRlbSgpIHBydWVmdC4KKyAgICB9CisKKyAgICAvLyBJbiBQX0lURU1TIHZlcm1lcmtlbiwgZXMgc2VpIGRlbm4sIFJFRlJFU0hfTk9ORSBpc3QgZ2VnZWJlbiwgaW4gZGVtCisgICAgLy8gRmFsbCBpc3QgZGllIFNwZWljaGVydW5nIHZvZWxsaWcgdW5ub2V0aWcuCisgICAgLy8gVE9ETzogUHJ1ZWZlbiwgb2IgZGFzIHdpcmtsaWNoIHByb2JsZW1sb3MgZ2VodC4gQmlzIGRhaGluIHdlcmRlbiBhdWNoCisgICAgLy8gVE9ETzo6UkVGUkVTSF9OT05FLUl0ZW1zIHZlcm1lcmt0LiAocy4gY2xlYW5fdXAoKSBpbiAvc3RkL3Jvb20uYykKKyAgICAvL2lmICghKHJlZnJlc2ggJiBSRUZSRVNIX05PTkUpKSB7CisgICAgICBTZXRQcm9wKCBQX0lURU1TLCBRdWVyeVByb3AoUF9JVEVNUykgKworICAgICAgICAgICAgICh7ICh7IG9iLCAgICAgICAgLy8gUklURU1fT0JKRUNUCisgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsICAvLyBSSVRFTV9GSUxFCisgICAgICAgICAgICAgICAgICAgcmVmcmVzaCAgICAvLyBSSVRFTV9SRUZSRVNICisgICAgICAgICAgICAgICAgICAgICAgIH0pICsKKyAgICAgICAgICAgICAgICAgICAgKChtYXBwaW5ncChwcm9wcykgfHwgcHJvcHMgPT0gMSkgPyAoeyBwcm9wcyB9KSA6ICh7fSkpIH0pICk7CisgICAgLy99CisKKyAgICBpZiAoIG9iICYmIG1hcHBpbmdwKHByb3BzKSApIAorICAgICAgICB3YWxrX21hcHBpbmcoIHByb3BzLCBzeW1ib2xfZnVuY3Rpb24oICJTZXRQcm9wIiwgb2IgKSApOworICAgIAorICAgIHJldHVybiBvYjsKK30KKworCitwcml2YXRlIHZvaWQgcmlfcmVtX29iKCBvYmplY3Qgb2IgKQoreworICAgIG9iamVjdCAqaW52OworICAgIGludCBpOworICAKKyAgICBpZiAoIG9iamVjdHAob2IpICYmIHByZXNlbnQob2IsIHRoaXNfb2JqZWN0KCkpICkgeworICAgICAgICBpbnYgPSBkZWVwX2ludmVudG9yeShvYik7CisgICAgICAgIAorICAgICAgICBmb3IgKCBpID0gc2l6ZW9mKGludik7IGktLTsgKQorICAgICAgICAgICAgaWYgKCBpbnZbaV0gKSB7CisgICAgICAgICAgICAgICAgaW52W2ldLT5yZW1vdmUoMSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKCBpbnZbaV0gKQorICAgICAgICAgICAgICAgICAgICBkZXN0cnVjdChpbnZbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgb2ItPnJlbW92ZSgxKTsKKyAgICAgICAgCisgICAgICAgIGlmICggb2IgKQorICAgICAgICAgICAgZGVzdHJ1Y3Qob2IpOworICAgIH0KK30KKworCitwcml2YXRlIGludCByaV9maWx0ZXIoIG1peGVkICpyaXRlbSwgbWl4ZWQgZmlsZSApCit7CisgICAgb2JqZWN0IG9iLCAqaW52OworICAgIGludCBpOworICAKKyAgICBvYiA9IHJpdGVtW1JJVEVNX09CSkVDVF07CisgIAorICAgIGlmICggc3RyaW5ncChmaWxlKSAmJiByaXRlbVtSSVRFTV9GSUxFXSA9PSBmaWxlICkKKyAgICAgICAgcmV0dXJuIHJpX3JlbV9vYihvYiksIDA7CisgICAgZWxzZSBpZiAoIHBvaW50ZXJwKHJpdGVtW1JJVEVNX0ZJTEVdKSAmJiBwb2ludGVycChmaWxlKSAmJgorICAgICAgICAgICAgICBzaXplb2YoZmlsZSAmIHJpdGVtW1JJVEVNX0ZJTEVdKSA9PSBzaXplb2Yocml0ZW1bUklURU1fRklMRV0pICkKKyAgICAgICAgcmV0dXJuIHJpX3JlbV9vYihvYiksIDA7CisKKyAgICByZXR1cm4gMTsKK30KKworCitwdWJsaWMgdm9pZCBSZW1vdmVJdGVtKCBtaXhlZCBmaWxlbmFtZSApCit7CisgICAgbWl4ZWQgKml0ZW1zOworICAgIGludCBpOworCisgICAgaWYgKCAhcG9pbnRlcnAoaXRlbXMgPSBRdWVyeVByb3AoUF9JVEVNUykpIHx8ICFzaXplb2YoaXRlbXMpICkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCBwb2ludGVycChmaWxlbmFtZSkgKQorICAgICAgICBmb3IgKCBpID0gc2l6ZW9mKGZpbGVuYW1lKTsgaS0tOyApCisgICAgICAgICAgICBmaWxlbmFtZVtpXSA9IChzdHJpbmcpbWFzdGVyKCktPl9nZXRfcGF0aCggZmlsZW5hbWVbaV0sICI/IiApOworICAgIGVsc2UKKyAgICAgICAgZmlsZW5hbWUgPSAoc3RyaW5nKW1hc3RlcigpLT5fZ2V0X3BhdGgoIGZpbGVuYW1lLCAiPyIgKTsKKyAgCisgICAgU2V0UHJvcCggUF9JVEVNUywgZmlsdGVyKCBpdGVtcywgIydyaV9maWx0ZXIvKicqLywgZmlsZW5hbWUgKSApOworfQorCisKK3ByaXZhdGUgbWl4ZWQgX2RvX3JlZnJlc2goIG1peGVkIGl0ZW0gKQoreworICAgIHN0cmluZyBmaWxlOworICAgIG9iamVjdCBvYjsKKworICAgIGlmICggIXBvaW50ZXJwKGl0ZW0pIHx8IGl0ZW1bUklURU1fUkVGUkVTSF0gPT0gUkVGUkVTSF9OT05FICkKKyAgICAgICAgcmV0dXJuIGl0ZW07CisKKyAgICBpZiAoIHBvaW50ZXJwKGl0ZW1bUklURU1fRklMRV0pICkgCisgICAgICAgIGZpbGUgPSBpdGVtW1JJVEVNX0ZJTEVdW3JhbmRvbSggc2l6ZW9mKGl0ZW1bUklURU1fRklMRV0pICldOworICAgIGVsc2UKKyAgICAgICAgZmlsZSA9IGl0ZW1bUklURU1fRklMRV07CisKKyAgICBzd2l0Y2goIGl0ZW1bUklURU1fUkVGUkVTSF0gKXsKKyAgICBjYXNlIFJFRlJFU0hfTU9WRV9IT01FOgorICAgICAgICBpZiAoIG9iamVjdHAoaXRlbVtSSVRFTV9PQkpFQ1RdKSAmJgorICAgICAgICAgICAgIGVudmlyb25tZW50KGl0ZW1bUklURU1fT0JKRUNUXSkgIT0gTUUgKSB7CisgICAgICAgICAgICBpdGVtW1JJVEVNX09CSkVDVF0tPm1vdmUoIE1FLCBNX0dPfE1fTk9fQVRUQUNLICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAvLyBmYWxsIHRocm91Z2gKKyAgICBjYXNlIFJFRlJFU0hfREVTVFJVQ1Q6CisgICAgICAgIGlmICggb2JqZWN0cChpdGVtW1JJVEVNX09CSkVDVF0pICkgCisgICAgICAgICAgICBicmVhazsgLy8gZWxzZSBGQUxMIFRIUk9VR0gKKyAgICAgICAgCisgICAgY2FzZSBSRUZSRVNIX1JFTU9WRToKKyAgICAgICAgaWYgKCBvYmplY3RwKGl0ZW1bUklURU1fT0JKRUNUXSkgJiYKKyAgICAgICAgICAgICBlbnZpcm9ubWVudChpdGVtW1JJVEVNX09CSkVDVF0pID09IE1FICkKKyAgICAgICAgICAgIGJyZWFrOyAvLyBlbHNlIEZBTEwgVEhST1VHSAorICAgICAgICAKKyAgICBkZWZhdWx0OgorICAgICAgICBpZiAoIHNpemVvZihpdGVtKSA+IFJJVEVNX1BST1BTICYmIGl0ZW1bUklURU1fUFJPUFNdID09IDEgKSB7CisgICAgICAgICAgICBvYiA9IGxvYWRfb2JqZWN0KGZpbGUpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG9iID0gY2xvbmVfb2JqZWN0KGZpbGUpOworCisgICAgICAgIG9iLT5tb3ZlKCBNRSwgTV9OT0NIRUNLfE1fTk9fQVRUQUNLICk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAKKyAgICBpZiAoIG9iICl7CisgICAgICAgIGl0ZW1bUklURU1fT0JKRUNUXSA9IG9iOworICAgICAgICAKKyAgICAgICAgaWYgKCBzaXplb2YoaXRlbSkgPiBSSVRFTV9QUk9QUyAmJiBtYXBwaW5ncChpdGVtW1JJVEVNX1BST1BTXSkgKQorICAgICAgICAgICAgd2Fsa19tYXBwaW5nKCBpdGVtW1JJVEVNX1BST1BTXSwgc3ltYm9sX2Z1bmN0aW9uKCAiU2V0UHJvcCIsIG9iICkgKTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIGl0ZW07Cit9CisKKworLy8gcmVzZXQgaGFuZGxpbmc6IGNoZWNrIGhvdyB0aGUgaXRlbXMgc2hvdWxkIGJlIHJlZnJlc2hlZC4KK3ZvaWQgcmVzZXQoKSAKK3sKKyAgICBtaXhlZCAqaXRlbXM7CisKKyAgICBpZiAoICFwb2ludGVycChpdGVtcyA9IFF1ZXJ5UHJvcChQX0lURU1TKSkgKXsKKyAgICAgICAgU2V0UHJvcCggUF9JVEVNUywgKHt9KSApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIFNldFByb3AoIFBfSVRFTVMsIG1hcCggaXRlbXMsICMnX2RvX3JlZnJlc2gvKicqLyApIC0gKHswfSkgKTsKK30KKwpkaWZmIC0tZ2l0IGEvc3RkL2NvbnRhaW5lci9saWdodC5jIGIvc3RkL2NvbnRhaW5lci9saWdodC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNTQwMGYKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvY29udGFpbmVyL2xpZ2h0LmMKQEAgLTAsMCArMSwxNDkgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBjb250YWluZXIvbGlnaHQuYyAtLSBMaWNodHN5c3RlbSBmdWVyIENvbnRhaW5lcgorLy8KKy8vICRJZDogZGVzY3JpcHRpb24uYyA2OTg2IDIwMDgtMDgtMjIgMjE6MzI6MTVaIFplc3N0cmEgJAorCitpbmhlcml0ICIvc3RkL3RoaW5nL2xpZ2h0IjsKKworI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcyxydHRfY2hlY2tzCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisKKyNpbmNsdWRlIDxjb250YWluZXIuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisKKy8vIEJUVzogX3F1ZXJ5X2xhc3RfY29udGVudF9jaGFuZ2UoKSBzb2xsdGUgYmxvc3MgbmllIGF1Y2ggLTEgZnVlcgorLy8gdW5pbml0aWFsaXNpZXJ0IHp1cnVlY2tsaWVmZXJuLi4uCitwcml2YXRlIG5vc2F2ZSBpbnQgbGFzdF9saWdodF9jYWxjID0gLTE7CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7CisgIC8vIHdpZXZpZWwgTGljaHQgc2NobHVja3QgZGVyIENvbnRhaW5lciBfbXVzc18gPiAwIHNlaW4hCisgIFNldFByb3AoUF9MSUdIVF9UUkFOU1BBUkVOQ1ksIDIpOworfQorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGVfc3VwZXIoKSB7c2V0X25leHRfcmVzZXQoLTEpO30KKworCitzdGF0aWMgbWl4ZWQgX3F1ZXJ5X2xpZ2h0X3RyYW5zcGFyZW5jeSgpCit7CisgICBpZiAoUXVlcnlQcm9wKFBfVFJBTlNQQVJFTlQpKQorICAgICByZXR1cm4gUXVlcnkoUF9MSUdIVF9UUkFOU1BBUkVOQ1ksRl9WQUxVRSk7CisgICByZXR1cm4gOTk5OworfQorCitwdWJsaWMgaW50IGFkZF9saWdodF9zb3VyY2VzKGludCAqIHNvdXJjZXMpIHsKKyAgZmxvYXQgbGlnaHQgPSAwLjA7CisgIC8vcHJpbnRmKCJhbHMoJU8pOiAlT1xuIix0aGlzX29iamVjdCgpLHNvdXJjZXMpOworICAvLyBBbGxlIExpY2h0bGV2ZWwgd2VyZGVuIGFscyBFeHBvbmVudCB2b24gZSBhdWZnZWZhc3N0IHVuZCBkaWUgU3VtbWUgZGllc2VyCisgIC8vIFBvdGVuemVuIGdlYmlsZGV0LgorICBmb3JlYWNoKGludCBsIDogc291cmNlcykgeworICAgICBpZiAobCA+IDApCisgICAgICAgbGlnaHQgKz0gZXhwKGwpOworICAgICBlbHNlIGlmIChsIDwgMCkKKyAgICAgICBsaWdodCAtPSBleHAoYWJzKGwpKTsKKyAgICAgLy8gbD09MCBtdXNzIGlnbm9yaWVydCB3ZXJkZW4KKyAgfQorICAvLyBhbnNjaGxpZXNzZW5kIHdpcmQgYXVzIGRpZXNlciBTdW1tZSBkZXIgbmF0dWVybGljaGUgTG9nYXJpdGhtdXMKKyAgLy8gYmVyZWNobmV0LgorICAvLyBhdWYgZGllc2UgV2Vpc2UgaGFiZW4gaG9laGVyZSBMaWNodGxldmVsIHVlYmVycHJvcG9ydGlvbmFsIHZpZWwgRWluZmx1c3MKKyAgLy8gYXVmIGRpZSBIZWxsaWdrZWl0IGltIFJhdW0sIGtsZWluZSBMaWNodGxldmVsIGZhbGxlbiBhYmVyIG5pY2h0IGtvbXBsZXR0CisgIC8vIHJhdXMuCisgIGlmIChsaWdodCA+IDApIHsKKyAgICAgIGxpZ2h0ID0gbG9nKGxpZ2h0KTsKKyAgfQorICBlbHNlIGlmIChsaWdodCA8IDApIHsKKyAgICAgIGxpZ2h0ID0gLWxvZyhhYnMobGlnaHQpKTsKKyAgfQorCisgIC8vcHJpbnRmKCJhbHMoKTogJU9cbiIsbGlnaHQpOworICAvLyBydW5kZW4gdW5kIGFscyBpbnQgenVydWVja2dlYmVuLgorICBpZiAobGlnaHQgPj0gMCkKKyAgICByZXR1cm4gdG9faW50KGxpZ2h0KzAuNSk7CisgIC8vZWxzZQorICByZXR1cm4gdG9faW50KGxpZ2h0LTAuNSk7Cit9CisKK3N0YXRpYyBpbnQgX3F1ZXJ5X3RvdGFsX2xpZ2h0KCkKK3sKKyAgaW50IHRvdGFsbGlnaHQ7CisKKyAgaWYgKCBfcXVlcnlfbGFzdF9jb250ZW50X2NoYW5nZSgpID09IGxhc3RfbGlnaHRfY2FsYyApCisgICAgcmV0dXJuIFF1ZXJ5KFBfVE9UQUxfTElHSFQpOworCisgIC8vIGVpZ2VuZXMgUF9MSUdIVCB1bmQgUF9UT1RBTF9MSUdIVCBkZXIgZW50aGFsdGVuZW4gT2JqZWt0ZSB2ZXJyZWNobmVuCisgIGludCBpbnRsaWdodCA9IGFkZF9saWdodF9zb3VyY2VzKAorICAgICAgYWxsX2ludmVudG9yeSgpLT5RdWVyeVByb3AoUF9UT1RBTF9MSUdIVCkgKyAoe1F1ZXJ5UHJvcChQX0xJR0hUKX0pKTsKKyAgLy8gUF9JTlRfTElHSFQgKGdlcnVuZGV0KSBhYnNwZWljaGVybgorICBTZXQoUF9JTlRfTElHSFQsIGludGxpZ2h0LCBGX1ZBTFVFKTsKKworICAvLyBMaWNodCBuYWNoIGF1c3NlbiBtdXNzIENvbnRhaW5lcnRyYW5zcGFyZW56IGJlcnVlY2tzaWNodGlnZW4uCisgIGlmIChpbnRsaWdodCA+IDApIHsKKyAgICB0b3RhbGxpZ2h0ID0gaW50bGlnaHQgLSBRdWVyeVByb3AoUF9MSUdIVF9UUkFOU1BBUkVOQ1kpOworICAgIGlmICh0b3RhbGxpZ2h0IDwgMCkKKyAgICAgIHRvdGFsbGlnaHQgPSAwOworICB9CisgIGVsc2UgeworICAgIHRvdGFsbGlnaHQgPSBpbnRsaWdodCArIFF1ZXJ5UHJvcChQX0xJR0hUX1RSQU5TUEFSRU5DWSk7CisgICAgaWYgKHRvdGFsbGlnaHQgPiAwKQorICAgICAgdG90YWxsaWdodCA9IDA7CisgIH0KKyAgLy9wcmludGYoIl9xdWVyeV90b3RhbF9saWdodCglTyk6ICVPXG4iLHRoaXNfb2JqZWN0KCksdG90YWxsaWdodCk7CisKKyAgbGFzdF9saWdodF9jYWxjID0gX3F1ZXJ5X2xhc3RfY29udGVudF9jaGFuZ2UoKTsKKworICAvLyBSdW5kZW4gdW5kIEtvbnZlcnNpb24gbmFjaCBpbnQgbmljaHQgdmVyZ2Vzc2VuLi4uCisgIGlmICh0b3RhbGxpZ2h0ID4gMCkKKyAgICByZXR1cm4gU2V0UHJvcChQX1RPVEFMX0xJR0hULCB0b19pbnQodG90YWxsaWdodCArIDAuNSkpOworICAvL2Vsc2UKKyAgcmV0dXJuIFNldFByb3AoUF9UT1RBTF9MSUdIVCwgdG9faW50KHRvdGFsbGlnaHQgLSAwLjUpKTsKK30KKworc3RhdGljIGludCBfcXVlcnlfaW50X2xpZ2h0KCkKK3sKKyAgIGludCBpbnRsaWdodCwgZW52bGlnaHQ7CisKKyAgIGlmICggX3F1ZXJ5X2xhc3RfY29udGVudF9jaGFuZ2UoKSAhPSBsYXN0X2xpZ2h0X2NhbGMgKQorICAgICAgIF9xdWVyeV90b3RhbF9saWdodCgpOworCisgICAvLyBQX0lOVF9MSUdIVCBkZXMgZW52aXJvbm1lbnRzIGthbm4gc2ljaCBuYXR1ZXJsaWNoIGFlbmRlcm4gX29obmVfIGRhcworICAgLy8gZXR3YXMgYW4gZWluZW0gY29udGFpbmVyIGdlYWVuZGVydCB3aXJkLiBEYWhlciBBdXN3ZXJ0dW5nIGplZGVzIG1hbAorICAgLy8gbmV1IGFrdHVhbGlzaWVyZW4uCisgICBpZiAoIWVudmlyb25tZW50KCkKKyAgICAgICB8fCAhKGVudmxpZ2h0PShpbnQpZW52aXJvbm1lbnQoKS0+UXVlcnlQcm9wKFBfSU5UX0xJR0hUKSkpCisgICAgICByZXR1cm4gUXVlcnkoUF9JTlRfTElHSFQsIEZfVkFMVUUpOworICAgZWxzZSB7CisgICAgICBpbnRsaWdodCA9IFF1ZXJ5KFBfSU5UX0xJR0hULCBGX1ZBTFVFKTsKKyAgICAgIGludCB0cmFuc3BhcmVuY3kgPSBRdWVyeVByb3AoUF9MSUdIVF9UUkFOU1BBUkVOQ1kpOworCisgICAgICAvLyBiZWkgZWluZW0gdHJhbnNwYXJlbnRlbSBDb250YWluZXIga2FubiBuYXR1ZXJsaWNoIGRhcyBMaWNodCBkZXMKKyAgICAgIC8vIGVudmlyb25tZW50cyBkZW4gQ29udGFpbmVyIGF1Y2ggYXVzbGV1Y2h0ZW4uLi4uCisgICAgICAvLyAoQW5tZXJrdW5nOiBpbiBkZW0gTGljaHQgdm9uIGRyYXVzc2VuIGlzdCB1bnNlciBMaWNodGFudGVpbAorICAgICAgLy8gbmF0dWVybGljaCBhdWNoIGRyaW4sIGdlZGFlbXBmdCB1bSBkaWUgVHJhbnNwYXJlbnogKHJhdXMgdW5kIHJlaW4pLgorICAgICAgLy8gSWNoIHZlcm5hY2hsYWVzc2lnZSBkYXMuKQorICAgICAgaWYgKGFicyhlbnZsaWdodCkgPiB0cmFuc3BhcmVuY3kpIHsKKyAgICAgICAgaWYgKGVudmxpZ2h0ID4gMCkKKyAgICAgICAgICAgIGVudmxpZ2h0IC09IHRyYW5zcGFyZW5jeTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZW52bGlnaHQgKz0gdHJhbnNwYXJlbmN5OworICAgICAgICAvLyBqZXR6dCBMaWNodCB2b24gYXVzc2VuIHVuZCBpbm5lbiB2ZXJyZWNobmVuCisgICAgICAgIGludGxpZ2h0ID0gYWRkX2xpZ2h0X3NvdXJjZXMoKHtpbnRsaWdodCwgZW52bGlnaHR9KSk7CisgICAgICB9CisgICAgICAvLyBlbHNlOiBudXIgUF9JTlRfTElHSFQsIExpY2h0IGRlcyBFbnZpcm9ubWVudHMga2VpbmUgQmVkZXV0dW5nCisgICB9CisgICByZXR1cm4gaW50bGlnaHQ7Cit9CisKK3N0YXRpYyBpbnQgX3NldF9saWdodChpbnQgbGlnaHQpCit7CisgIGxhc3RfbGlnaHRfY2FsYz0tMTsKKworICByZXR1cm4gOjpfc2V0X2xpZ2h0KGxpZ2h0KTsKK30KKwpkaWZmIC0tZ2l0IGEvc3RkL2NvbnRhaW5lci9tb25leWhhbmRsZXIuYyBiL3N0ZC9jb250YWluZXIvbW9uZXloYW5kbGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUyNTQ1MwotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9jb250YWluZXIvbW9uZXloYW5kbGVyLmMKQEAgLTAsMCArMSw1MyBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGNvbnRhaW5lci9tb25leWhhbmRsZXIuYyAtLSBtb25leSBoYW5kbGVyIGZvciBjb250YWluZXIKKy8vCisvLyAkSWQ6IG1vbmV5aGFuZGxlci5jIDY3MzggMjAwOC0wMi0xOSAxODo0NjoxNFogSHVtbmkgJAorI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPHRoaW5nL3Byb3BlcnRpZXMuaD4KKyN1bmRlZiBORUVEX1BST1RPVFlQRVMKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDxtb25leS5oPgorCitwdWJsaWMgaW50IEFkZE1vbmV5KCBpbnQgYW1vdW50ICkKK3sKKyAgb2JqZWN0IG9iOworICBpbnQgcmV0OworCisgIGlmICggIWFtb3VudCApCisgICAgcmV0dXJuIDE7CisgICAgCisgIG9iID0gY2xvbmVfb2JqZWN0KCBHRUxEICk7CisgIG9iLT5TZXRQcm9wKCBQX0FNT1VOVCwgYW1vdW50ICk7CisKKyAgcmV0PW9iLT5tb3ZlKCB0aGlzX29iamVjdCgpLCBNX1BVVHxNX01PVkVfQUxMICk7CisgIC8vIEJlaSBmZWhsZXJoYWZ0ZW0gbW92ZSBnZ2YuIHdpZWRlciB6ZXJzdG9lcmVuLgorICBpZiAoKHJldCAhPSBNT1ZFX09LKQorICAgICAgJiYgb2IpCisgIHsKKyAgICBvYi0+cmVtb3ZlKDEpOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK3B1YmxpYyBpbnQgUXVlcnlNb25leSgpCit7CisgIG9iamVjdCBtb25leTsKKyAgaW50IGdlbGQ7CisKKyAgaWYgKCBtb25leSA9IHByZXNlbnRfY2xvbmUoR0VMRCwgdGhpc19vYmplY3QoKSkgKQorICAgIGdlbGQgPSBtb25leS0+UXVlcnlQcm9wKFBfQU1PVU5UKTsKKworICBpZiAoIG1vbmV5ID0gcHJlc2VudChHRUxEQk9FUlNFX01JVF9HRUxELCB0aGlzX29iamVjdCgpKSApCisgICAgZ2VsZCArPSBtb25leS0+UXVlcnlQcm9wKFBfQU1PVU5UKTsKKworICByZXR1cm4gZ2VsZDsKK30KZGlmZiAtLWdpdCBhL3N0ZC9jb250YWluZXIvcmVzdHJpY3Rpb25zLmMgYi9zdGQvY29udGFpbmVyL3Jlc3RyaWN0aW9ucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYTVjOWQKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvY29udGFpbmVyL3Jlc3RyaWN0aW9ucy5jCkBAIC0wLDAgKzEsNDgwIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gY29udGFpbmVyL3Jlc3RyaWN0aW9ucy5jIC0tIGNvbnRhaW5lciByZXN0cmljdGlvbnMKKy8vCisvLyAkSWQ6IHJlc3RyaWN0aW9ucy5jIDkwMjAgMjAxNS0wMS0xMCAyMTo0OTo0MVogWmVzc3RyYSAkCisKKy8vIFRoaXMgaXMgYSBzaW1wbGUgY29udGFpbmVyIHRvIHB1dCBvYmplY3RzIGluLiBJdCBkZWZpbmVzIGFsbCBmdW5jdGlvbnMKKy8vIHdoaWNoIGFyZSBuZWNlc3NhcnkgdG8gZGVzY3JpYmUgYW4gb2JqZWN0IHdoaWNoIGNhbiBiZSBmaWxsZWQgd2l0aAorLy8gb3RoZXIgdGhpbmdzLgorLy8KKy8vIEl0IHdpbGwgc3VwcG9ydCByZXN0cmljdGlvbnMgZm9yIHZvbHVtZSwgd2VpZ2h0IGV0Yy4KKy8vCisvLyBUaGUgZm9sbG93aW5nIHByb3BlcnRpZXMgYXJlIGRlZmluZWQ6CisvLyBQX01BWF9XRUlHSFQgLSBtYXhpbXVtIHdlaWdodCB3aGljaCBjb250YWluZXIgY2FuIGNhcnJ5CisvLyBQX1RPVEFMX1dFSUdIVCAtIHRvdGFsIHdlaWdodCwgd2l0aCBjb250ZW50cy4KKy8vIFBfV0VJR0hUIC0gdGhlIHdlaWdodCBvZiB0aGUgY29udGFpbmVyIHdpdGhvdXQgY29udGVudHMKKy8vCisvLyBGdW5jdGlvbnMgZm9yIG1hbmlwdWxhdGlvbiBvZiB3ZWlnaHQKKy8vIE1heUFkZFdlaWdodCh3ZWlnaHQpIC0gQ2FuIDx3ZWlnaHQ+IGJlIGluc2VydGVkPworLy8gQWRkV2VpZ2h0KHdlaWdodCkgLSBBZGQgYW4gYW1vdW50IG9mIDx3ZWlnaHQ+CisvLworLy8gSU1QT1JUQU5UOiB1bml0IGVxdWFscyAxIGdyYW0KKworI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworLy8jcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisKKyNpbmNsdWRlICIvc3lzL3RoaW5nL3Byb3BlcnRpZXMuaCIKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPHRoaW5nL2Rlc2NyaXB0aW9uLmg+CisKKy8vIGxvY2FsIHByb3BlcnRpZXMgcHJvdG90eXBlcworc3RhdGljIGludCBfcXVlcnlfdG90YWxfd2VpZ2h0KCk7CisKKworcHJpdmF0ZSBub3NhdmUgaW50IExhc3RXZWlnaHRDYWxjLCBjb250ZW50cywgTGFzdE9iamVjdENvdW50LCBvYmpjb3VudDsKK3ByaXZhdGUgbm9zYXZlIGludCBsYXN0X2NvbnRlbnRfY2hhbmdlOworCisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgICBTZXQoIFBfV0VJR0hUX1BFUkNFTlQsIDUwICk7CisgICAgU2V0KCBQX1RPVEFMX1dFSUdIVCwgTk9TRVRNRVRIT0QsIEZfU0VUX01FVEhPRCApOworICAgIFNldCggUF9UT1RBTF9XRUlHSFQsIFBST1RFQ1RFRCwgRl9NT0RFICk7CisgICAgU2V0KCBQX01BWF9PQkpFQ1RTLCAxMDAgKTsKKyAgICBTZXQoIFBfVE9UQUxfT0JKRUNUUywgTk9TRVRNRVRIT0QsIEZfU0VUX01FVEhPRCApOworICAgIFNldCggUF9UT1RBTF9PQkpFQ1RTLCBQUk9URUNURUQsIEZfTU9ERSApOworICAgIExhc3RXZWlnaHRDYWxjID0gLTE7CisgICAgTGFzdE9iamVjdENvdW50ID0gLTE7Cit9CisKKworc3RhdGljIGludCBfcXVlcnlfbGFzdF9jb250ZW50X2NoYW5nZSgpCit7CisgICAgcmV0dXJuIGxhc3RfY29udGVudF9jaGFuZ2U7Cit9CisKKworLy8gYWJzaWNodGxpY2ggcHVibGljLCBkYSBlcyB2b24gZGVyIHNpbXVsX2VmdW4uYyAqZGlyZWt0KiBhdWZnZXJ1ZmVuCisvLyB3aXJkIGF1cyBQZXJmb3JtYW5jZWdydWVuZGVuIQorcHVibGljIHZhcmFyZ3MgaW50IF9zZXRfbGFzdF9jb250ZW50X2NoYW5nZSggbWl4ZWQgd2VydCApCit7CisgICAgLy8gRGVyIHVlYmVyZ2ViZW5lIFdlcnQgaXN0IHVuZXJoZWJsaWNoLiBEaWUgUHJvcGVydHkKKyAgICAvLyBQX0xBU1RfQ09OVEVOVF9DSEFOR0Ugd2lyZCBzbyBvZGVyIHNvIGJlaSBqZWRlbSBTZXRQcm9wKCktCisgICAgLy8gQXVmcnVmIHVtIGVpbnMgZXJob2VodCwgdW0gZGVyIDJzLSJVbnNjaGFlcmZlIiB2b24gdGltZSgpCisgICAgLy8gYXVzIGRlbSBXZWcgenUgZ2VoZW4uCisgICAgcmV0dXJuICsrbGFzdF9jb250ZW50X2NoYW5nZTsKK30KKworCitpbnQgcXVlcnlfd2VpZ2h0X2NvbnRlbnRzKCkKK3sKKyAgICBvYmplY3QgKm9ianM7CisgICAgaW50IHcsIHcyLCBpOworCisgICAgaWYgKCBsYXN0X2NvbnRlbnRfY2hhbmdlID09IExhc3RXZWlnaHRDYWxjICkKKyAgICAgICAgcmV0dXJuIGNvbnRlbnRzOworICAgIAorICAgIHcgPSAwOworICAgIG9ianMgPSBhbGxfaW52ZW50b3J5KHRoaXNfb2JqZWN0KCkpOworICAgIGkgPSBzaXplb2Yob2Jqcyk7CisgICAgCisgICAgd2hpbGUgKCBpLS0gKXsKKyAgICAgICAgaWYgKCAhKHcyID0gKGludClvYmpzW2ldLT5RdWVyeVByb3AoUF9UT1RBTF9XRUlHSFQpKSApCisgICAgICAgICAgICB3MiA9IChpbnQpb2Jqc1tpXS0+UXVlcnlQcm9wKFBfV0VJR0hUKTsKKyAgICAgICAgdyArPSB3MjsKKyAgICB9CisgICAgCisgICAgTGFzdFdlaWdodENhbGMgPSBsYXN0X2NvbnRlbnRfY2hhbmdlOworICAgIHJldHVybiBjb250ZW50cyA9IHc7Cit9CisKKworc3RhdGljIGludCBfcXVlcnlfdG90YWxfb2JqZWN0cygpCit7CisgIGlmICggbGFzdF9jb250ZW50X2NoYW5nZSA9PSBMYXN0T2JqZWN0Q291bnQgKQorICAgICAgcmV0dXJuIG9iamNvdW50OworCisgIG9iamNvdW50ID0gc2l6ZW9mKCBmaWx0ZXJfb2JqZWN0cyggYWxsX2ludmVudG9yeSgpLCAic2hvcnQiICkgKTsKKyAgTGFzdE9iamVjdENvdW50ID0gbGFzdF9jb250ZW50X2NoYW5nZTsKKyAgcmV0dXJuIG9iamNvdW50OworfQorCisKKy8vIGRpZXNlIEZ1bmt0aW9uIHNvbGx0ZSB2b24gUmFldW1lbiBuYXR1ZXJsaWNoIHVlYmVyc2NocmllYmVuIHdlcmRlbi4uLgoraW50IE1heUFkZE9iamVjdCggb2JqZWN0IG9iICkKK3sKKyAgICBpZiAob2IpIHsKKyAgICAgICAgaWYgKCAhb2ItPnNob3J0KCkgKQorICAgICAgICAgICAgcmV0dXJuIDE7IC8vIGludmlzLU9iamVrdGUgZHVlcmZlbiBpbW1lcgorICAgICAgICAKKyAgICAgICAgaWYgKCBvYiA9PSBNRSB8fCBlbnZpcm9ubWVudChvYikgPT0gTUUpCisgICAgICAgICAgICByZXR1cm4gMTsgLy8gb2JqZWt0IGlzdCBzY2hvbiBkcmluCisgICAgfQorICAgIAorICAgIHJldHVybiAoUXVlcnlQcm9wKFBfVE9UQUxfT0JKRUNUUykgPCBRdWVyeVByb3AoUF9NQVhfT0JKRUNUUykpOworfQorCisKKyNkZWZpbmUgRU5WIGVudmlyb25tZW50CisjZGVmaW5lIFBPIHByZXZpb3VzX29iamVjdCgpCisKK2ludCBNYXlBZGRXZWlnaHQoIGludCB3ICkKK3sKKyAgICBpbnQgbncsIGF3OworCisgICAgLy8gd2FzIG5peCB3aWVndCwgcGFzc3QKKyAgICBpZiAoIHcgPD0gMCApCisgICAgICAgIHJldHVybiAwOworCisgICAgbncgPSB3OyAvLyBHZXdpY2h0IGltIG5ldWVuIENvbnRhaW5lcgorICAgIGF3ID0gMDsgLy8gR2V3aWNodCBmdWVyIGRhcyBlbnYoKQorCisgICAgLy8gVm9uIFJhdW0gaW4gQmVoYWVsdGVyIGltIFNwaWVsZXI6IENvbnRhaW5lciBzaWVodCB2b2xsZXMgR2V3aWNodCAobnc9dyksCisgICAgLy8gQ2hlY2sgaW0gZW52KCkgKFNwaWVsZXIpIG1pdCByZWR1emllcnRlbSBHZXdpY2h0LgorICAgIGlmICggRU5WKCkgJiYgUE8gJiYgRU5WKFBPKSAhPSBFTlYoKSApCisgICAgICAgIGF3ID0gUXVlcnlQcm9wKFBfV0VJR0hUX1BFUkNFTlQpICogdyAvIDEwMCB8fCAxOworCisgICAgaWYgKCBQTyAmJiBFTlYoUE8pICYmIEVOVihFTlYoUE8pKSApeworICAgICAgICAvLyBXZW5uIGRhcyBPYmpla3QgZWluIGVudigpIGhvY2hiZXdlZ3Qgd2lyZCwgd2lyZCBkYXMgR2V3aWNodCBpbSBhbHRlbgorICAgICAgICAvLyBDb250YWluZXIgYWJnZXpvZ2VuLiBXZWl0ZXJlciBDaGVjayBpbSBlbnYoKSBpc3QgdW5ub2V0aWcgKGF3PTApLgorICAgICAgICBpZiAoIEVOVihFTlYoUE8pKSA9PSBNRSApCisgICAgICAgICAgICBudyA9IHcgLSAoaW50KUVOVihQTyktPlF1ZXJ5UHJvcChQX1dFSUdIVF9QRVJDRU5UKSAqIHcgLyAxMDA7CisgICAgICAgIC8vIEVpbmUgRWJlbmUgdGllZmVyIGJld2VnZW46IFRlc3QgaW0gbmV1ZW4gQ29udGFpbmVyIG1pdCB1bnZlcmFlbmRlcnRlbQorICAgICAgICAvLyBHZXdpY2h0OyBDaGVjayBpbSBlbnYoKSBtaXQgdW0gR2V3aWNodHNyZWR1a3Rpb24gdmVycmluZ2VydGVtIEdld2ljaHQKKyAgICAgICAgZWxzZSBpZiAoIHByZXNlbnQoIE1FLCBFTlYoUE8pICkgKQorICAgICAgICAgICAgYXcgPSBRdWVyeVByb3AoUF9XRUlHSFRfUEVSQ0VOVCkgKiB3IC8gMTAwIC0gdzsKKyAgICAgICAgLy8gQXVmIGRlcnNlbGJlbiBFYmVuZSB2ZXJzY2hpZWJlbiAodm9uIFBha2V0IGluIEJldXRlbCk6CisgICAgICAgIC8vIE5ldWVyIENvbnRhaW5lciBzaWVodCB2b2xsZXMgR2V3aWNodCAobnc9dyksIENoZWNrIGltIGVudigpIG1pdAorICAgICAgICAvLyBEaWZmZXJlbnogYXVzIEdld2ljaHQgaW4gQ29udGFpbmVyMSB1bmQgaW4gQ29udGFpbmVyMi4KKyAgICAgICAgZWxzZSBpZiAoIEVOVihFTlYoRU5WKFBPKSkpICYmIEVOVigpID09IEVOVihFTlYoUE8pKSApCisgICAgICAgICAgICBhdyA9IFF1ZXJ5UHJvcChQX1dFSUdIVF9QRVJDRU5UKSAqIHcgLyAxMDAKKyAgICAgICAgICAgICAgICAtICgoaW50KUVOVihQTyktPlF1ZXJ5UHJvcChQX1dFSUdIVF9QRVJDRU5UKSAqIHcgLyAxMDAgfHwgMSk7CisgICAgfQorCisgICAgaWYgKCBxdWVyeV93ZWlnaHRfY29udGVudHMoKSArIG53ID4gUXVlcnlQcm9wKFBfTUFYX1dFSUdIVCkgKQorICAgICAgICAvLyBDb250YWluZXIga2FubiBHZXdpY2h0IG5pY2h0IG1laHIgYXVmbmVobWVuCisgICAgICAgIHJldHVybiAtMTsKKyAgICAKKyAgICBpZiAoIGF3ICYmIEVOVigpLT5NYXlBZGRXZWlnaHQoYXcpIDwgMCApCisgICAgICAgIC8vIFVtZ2VidW5nIGRlcyBDb250YWluZXJzIGthbm4gR2V3aWNodCBuaWNodCBtZWhyIGF1Zm5laG1lbgorICAgICAgICByZXR1cm4gLTI7CisgICAgCisgICAgcmV0dXJuIDA7Cit9CisKKworLyogUmVkZWZpbmUgUHJldmVudEluc2VydCgpIHRvIHByZXZlbnQgaW5zZXJ0aW5nIG9mIHNwZWNpYWwgb2JqZWN0cy4gSWYKKyAqIGEgdmFsdWUgZ3JlYXRlciAwIGlzIHJldHVybmVkIHRoZSBvYmplY3Qgb2IgY2FuJ3QgYmUgaW5zZXJ0ZWQgaW4gdGhlCisgKiBjb250YWluZXIuCisgKi8KK3B1YmxpYyBpbnQgUHJldmVudEluc2VydCggb2JqZWN0IG9iICkgeyByZXR1cm4gMDsgfQorcHVibGljIGludCBQcmV2ZW50TGVhdmUoIG9iamVjdCBvYiwgbWl4ZWQgZGVzdCApIHsgcmV0dXJuIDA7IH0KK3B1YmxpYyBpbnQgUHJldmVudEluc2VydExpdmluZyggb2JqZWN0IG9iICkgeyByZXR1cm4gMDsgfQorcHVibGljIGludCBQcmV2ZW50TGVhdmVMaXZpbmcoIG9iamVjdCBvYiwgbWl4ZWQgZGVzdCApIHsgcmV0dXJuIDA7IH0KK3B1YmxpYyB2b2lkIE5vdGlmeUluc2VydChvYmplY3Qgb2IsIG9iamVjdCBvbGRlbnYpIHsgfQorCisvLyAqKioqIGxvY2FsIHByb3BlcnR5IG1ldGhvZHMKK3N0YXRpYyBpbnQgX3F1ZXJ5X3RvdGFsX3dlaWdodCgpIAoreyAKKyAgICByZXR1cm4gUXVlcnlQcm9wKFBfV0VJR0hUKSArCisgICAgICAgIChRdWVyeVByb3AoUF9XRUlHSFRfUEVSQ0VOVCkgKiBxdWVyeV93ZWlnaHRfY29udGVudHMoKSAvIDEwMCk7IAorfQorCisKKy8vIEhpbGZzZnVua3Rpb24KK3N0YXRpYyBpbnQgX2JlaGFsdGVuKCBvYmplY3Qgb2IsIHN0cmluZyB1aWQgKQoreworICAgIHJldHVybiAoc3RyaW5nKW9iLT5RdWVyeVByb3AoUF9LRUVQX09OX1NFTEwpID09IHVpZDsKK30KKworCisvKgorICoKKyAqIGdldCBhIGxpc3Qgb2YgYWxsIGNvbnRhaW5lZCBvYmplY3RzIG1hdGNoaW5nIGEgY29tcGxleCBkZXNjcmlwdGlvbgorICoKKyAqLworCisjZGVmaW5lIFBPU19JTlZFUlMgICAweDAxICAvKiBudXIgenVyIGZ1bmt0aW9uc2ludGVybmVuIFZlcndlbmR1bmcgKi8KKyNkZWZpbmUgUE9TX0xFVFpURVMgIDB4MDIgIC8qIG51ciB6dXIgZnVua3Rpb25zaW50ZXJuZW4gVmVyd2VuZHVuZyAqLworCitvYmplY3QgKnByZXNlbnRfb2JqZWN0cyggc3RyaW5nIGNvbXBsZXhfZGVzYyApCit7CisgICAgaW50IGk7ICAgICAgICAgIC8vIFphZWhsZXJ2YXJpYWJsZQorICAgIGludCBtZXRoOyAgICAgICAvLyAweDAxID0gaW52ZXJzPywgIDB4MDIgPSBsZXR6dGVzPworICAgIG9iamVjdCBvYjsgICAgICAvLyBlaW56ZWxuZXMgdGVtcG9yYWVyZXMgT2JqZWt0CisgICAgb2JqZWN0ICpvYnM7ICAgIC8vIGxpc3RlIGRlciBhdXNnZXdhZWhsdGVuIE9iamVrdGUKKyAgICBvYmplY3QgKmVyZzsgICAgLy8genVtIHNhbW1lbG4gYmlzIGVzIG5hY2hoZXIgenVydWVja2dlZ2ViZW4gd2lyZC4uLgorICAgIHN0cmluZyAqc3RybHN0OyAvLyBsaXN0ZSBhbGxlciBHcnVwcGVuIGRpZSBtaXQgQU5EIHZlcmtudWVwZnQgc2luZAorICAgIG9iamVjdCBoYXVmZW47CisKKyAgICBzdHJsc3QgPSBhbGxvY2F0ZSgyKTsKKyAgICAKKyAgICBpZiAoIHNzY2FuZiggY29tcGxleF9kZXNjLCAiJXMgYXVzc2VyICVzIiwgc3RybHN0WzBdLCBzdHJsc3RbMV0pID09IDIgKXsKKyAgICAgICAgZXJnID0gcHJlc2VudF9vYmplY3RzKCBzdHJsc3RbMF0gKTsKKyAgICAgICAgb2JzID0gcHJlc2VudF9vYmplY3RzKCBzdHJsc3RbMV0gKTsKKyAgICAgICAgcmV0dXJuIGVyZy1vYnM7CisgICAgfQorICAgIAorICAgc3RybHN0ID0gZXhwbG9kZSggY29tcGxleF9kZXNjLCAiIHVuZCAiICk7CisgICBlcmcgPSAoe30pOworICAgCisgICBmb3IgKCBpID0gc2l6ZW9mKHN0cmxzdCk7IGktLTsgKQorICAgeworICAgICAgIGNvbXBsZXhfZGVzYyA9IHN0cmxzdFtpXTsKKyAgICAgICAvLyBhdWYgbGV0enRlL2xldHp0ZXMvbGV0enRlbiBwcnVlZmVuLi4uCisgICAgICAgaWYgKCBjb21wbGV4X2Rlc2NbMC4uNV0gPT0gImxldHp0ZSIgKXsKKyAgICAgICAgICAgc3dpdGNoKCBjb21wbGV4X2Rlc2NbNi4uNl0gKXsKKyAgICAgICAgICAgY2FzZSAiICI6CisgICAgICAgICAgICAgICBtZXRoIHw9IFBPU19MRVRaVEVTOworICAgICAgICAgICAgICAgY29tcGxleF9kZXNjID0gY29tcGxleF9kZXNjWzcuLl07CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgY2FzZSAicyI6CisgICAgICAgICAgIGNhc2UgIm4iOgorICAgICAgICAgICBjYXNlICJtIjoKKyAgICAgICAgICAgY2FzZSAiciI6CisgICAgICAgICAgICAgICBpZiAoIGNvbXBsZXhfZGVzY1s3Li43XSAhPSAiICIgKQorICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgbWV0aCB8PSBQT1NfTEVUWlRFUzsKKyAgICAgICAgICAgICAgIGNvbXBsZXhfZGVzYyA9IGNvbXBsZXhfZGVzY1s4Li5dOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgIH0KKyAgICAgICB9CisKKyAgICAgICAvLyBhdWYgdmVybmVpbnVuZyBwcnVlZmVuCisgICAgICAgaWYgKCBjb21wbGV4X2Rlc2NbMC4uNV0gPT0gIm5pY2h0ICIgKXsKKyAgICAgICAgICAgbWV0aCB8PSBQT1NfSU5WRVJTOworICAgICAgICAgICBjb21wbGV4X2Rlc2MgPSBjb21wbGV4X2Rlc2NbNi4uXTsKKyAgICAgICB9CisKKyAgICAgICBvYnM9KHt9KTsKKyAgICAgICAvLyBudW4gbmFjaCBNYWluLUlkcyAoR3J1cHBlbikgc3VjaGVuLi4uCisgICAgICAgaWYgKCBtZXRoICYgUE9TX0xFVFpURVMgKQorICAgICAgIHsgLy8gZ2VodCBlcyBudXIgdW0gZGVuIGxldHp0ZW4gR2VnZW5zdGFuZD8KKyAgICAgICAgICAgc3dpdGNoKCBjb21wbGV4X2Rlc2MgKXsKKyAgICAgICAgICAgY2FzZSAid2FmZmUiOgorICAgICAgICAgICAgICAgb2JzID0gZmlsdGVyX29iamVjdHMoIGFsbF9pbnZlbnRvcnkoKSwgIlF1ZXJ5UHJvcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUF9XRUFQT05fVFlQRSApOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgY2FzZSAicnVlc3R1bmciOgorICAgICAgICAgICAgICAgb2JzID0gZmlsdGVyX29iamVjdHMoIGFsbF9pbnZlbnRvcnkoKSwgIlF1ZXJ5UHJvcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUF9BUk1PVVJfVFlQRSApOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgCisgICAgICAgICAgIGNhc2UgImtsZWlkdW5nIjoKKyAgICAgICAgICAgICAgIG9icyA9IGZpbHRlcl9vYmplY3RzKCBhbGxfaW52ZW50b3J5KCksICJJc0Nsb3RoaW5nIik7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICBjYXNlICJ2ZXJzY2hpZWRlbmVtIjoKKyAgICAgICAgICAgY2FzZSAidmVyc2NoaWVkZW5lcyI6CisgICAgICAgICAgICAgICBvYnMgPSBhbGxfaW52ZW50b3J5KCk7CisgICAgICAgICAgICAgICBvYnMgLT0gZmlsdGVyX29iamVjdHMoIG9icywgIlF1ZXJ5UHJvcCIsIFBfV0VBUE9OX1RZUEUgKTsKKyAgICAgICAgICAgICAgIG9icyAtPSBmaWx0ZXJfb2JqZWN0cyggb2JzLCAiUXVlcnlQcm9wIiwgUF9BUk1PVVJfVFlQRSApOworICAgICAgICAgICAgICAgb2JzIC09IGZpbHRlcl9vYmplY3RzKCBvYnMsICJJc0Nsb3RoaW5nIik7CisgICAgICAgICAgICAgICBvYnMgLT0gZmlsdGVyKCBvYnMsICMnbGl2aW5nLyonKi8gKTsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAKKyAgICAgICAgICAgY2FzZSAiZWlnZW5lcyI6CisgICAgICAgICAgIGNhc2UgIm1laW5zIjoKKyAgICAgICAgICAgICAgIGlmIChvYmplY3RwKGhhdWZlbj1wcmVzZW50KCJcbmhhdWZlbiAiKworICAgICAgICAgICAgICAgICAgICAgdGhpc19wbGF5ZXIoKS0+bmFtZShXRU0pKSkpIHsKKyAgICAgICAgICAgICAgICAgIG9icyA9IGFsbF9pbnZlbnRvcnkoaGF1ZmVuKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIC8vIGtlaW4gYnJlYWs7LCBGYWxsLXRocm91Z2ghCisgICAgICAgICAgIGNhc2UgImJlaGFsdGVuZW0iOgorICAgICAgICAgICBjYXNlICJiZWhhbHRlbmVzIjoKKyAgICAgICAgICAgICAgIG9icyArPSBmaWx0ZXIoIGFsbF9pbnZlbnRvcnkoKSwgIl9iZWhhbHRlbiIsIE1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXR1aWQodGhpc19wbGF5ZXIoKSB8fCBwcmV2aW91c19vYmplY3QoKSkgKTsKKworICAgICAgICAgICAgICAgb2JzICs9IChRdWVyeVByb3AoUF9BUk1PVVJTKSB8fCAoe30pKQorICAgICAgICAgICAgICAgICAgICsgKHsgUXVlcnlQcm9wKFBfV0VBUE9OKSB9KSAtICh7IDAgfSk7CisgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgIGNhc2UgImdlZ2Vuc3RhbmQiOgorICAgICAgICAgICAgICAgb2JzID0gYWxsX2ludmVudG9yeSgpIC0KKyAgICAgICAgICAgICAgICAgICBmaWx0ZXIoIGFsbF9pbnZlbnRvcnkoKSwgIydsaXZpbmcvKicqLyApOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgIG9icyA9IGZpbHRlcl9vYmplY3RzKCBhbGxfaW52ZW50b3J5KCksICJpZCIsIGNvbXBsZXhfZGVzYyApOworICAgICAgICAgICB9CisKKyAgICAgICAgICAgLy8gdW5zaWNodGJhcmUgb2JqZWt0ZSBlbnRmZXJuZW4KKyAgICAgICAgICAgb2JzID0gZmlsdGVyX29iamVjdHMoIG9icywgInNob3J0IiApOworCisgICAgICAgICAgIC8vIGxldHp0ZW4gR2VnZW5zdGFuZCByYXVzc3VjaGVuCisgICAgICAgICAgIG9icyA9IG9ic1swLi4wXTsgCisgICAgICAgfSAvLyBpZiAobGV0enRlciBHZWdlbnN0YW5kKQorICAgICAgIGVsc2UKKyAgICAgICB7IC8vIGdhbnplIEdydXBwZW4gdW5kIG5pY2h0IG51ciBkYXMgbGV0enRlIE9iamVrdAorICAgICAgICAgICBzd2l0Y2ggKCBjb21wbGV4X2Rlc2MgKQorICAgICAgICAgICB7CisgICAgICAgICAgIGNhc2UgImFsbGVtIjoKKyAgICAgICAgICAgY2FzZSAiYWxsZXMiOgorICAgICAgICAgICBjYXNlICJqZWRlbiBnZWdlbnN0YW5kIjoKKyAgICAgICAgICAgY2FzZSAiamVkZW0gZ2VnZW5zdGFuZCI6CisgICAgICAgICAgIGNhc2UgImdlZ2Vuc3RhZW5kZSI6CisgICAgICAgICAgIGNhc2UgImFsbGUgZ2VnZW5zdGFlbmRlIjoKKyAgICAgICAgICAgY2FzZSAiYWxsZW4gZ2VnZW5zdGFlbmRlbiI6CisgICAgICAgICAgICAgICBpZiAoIG1ldGggJiBQT1NfSU5WRVJTICkKKyAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gYWxsZXMgbmljaHQgPSBuaWNodHMgOikKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgb2JzID0gYWxsX2ludmVudG9yeSgpIC0KKyAgICAgICAgICAgICAgICAgICBmaWx0ZXIoIGFsbF9pbnZlbnRvcnkoKSwgIydsaXZpbmcvKicqLyApOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgY2FzZSAid2FmZmVuIjoKKyAgICAgICAgICAgY2FzZSAiamVkZSB3YWZmZSI6CisgICAgICAgICAgIGNhc2UgImplZGVyIHdhZmZlIjoKKyAgICAgICAgICAgY2FzZSAiYWxsZSB3YWZmZW4iOgorICAgICAgICAgICBjYXNlICJhbGxlbiB3YWZmZW4iOgorICAgICAgICAgICAgICAgb2JzID0gZmlsdGVyX29iamVjdHMoIGFsbF9pbnZlbnRvcnkoKSwgIlF1ZXJ5UHJvcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUF9XRUFQT05fVFlQRSApOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgY2FzZSAicnVlc3R1bmdlbiI6CisgICAgICAgICAgIGNhc2UgImplZGUgcnVlc3R1bmciOgorICAgICAgICAgICBjYXNlICJqZWRlciBydWVzdHVuZyI6CisgICAgICAgICAgIGNhc2UgImFsbGUgcnVlc3R1bmdlbiI6CisgICAgICAgICAgIGNhc2UgImFsbGVuIHJ1ZXN0dW5nZW4iOgorICAgICAgICAgICAgICAgb2JzID0gZmlsdGVyX29iamVjdHMoIGFsbF9pbnZlbnRvcnkoKSwgIlF1ZXJ5UHJvcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUF9BUk1PVVJfVFlQRSApOworICAgICAgICAgICAgICAgYnJlYWs7CisgCisgICAgICAgICAgIGNhc2UgImtsZWlkdW5nIjoKKyAgICAgICAgICAgY2FzZSAiamVkZSBrbGVpZHVuZyI6CisgICAgICAgICAgIGNhc2UgImplZGVyIGtsZWlkdW5nIjoKKyAgICAgICAgICAgY2FzZSAiYWxsZSBrbGVpZHVuZyI6CisgICAgICAgICAgIGNhc2UgImFsbGVuIGtsZWlkdW5nIjoKKyAgICAgICAgICAgICAgIG9icyA9IGZpbHRlcl9vYmplY3RzKCBhbGxfaW52ZW50b3J5KCksICJJc0Nsb3RoaW5nIik7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgIGNhc2UgImdlZ2Vuc3RhbmQiOgorICAgICAgICAgICAgICAgb2JzID0gZmlsdGVyX29iamVjdHMoIGFsbF9pbnZlbnRvcnkoKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCBhbGxfaW52ZW50b3J5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjJ2xpdmluZy8qJyovICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNob3J0IiApWzAuLjBdOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgY2FzZSAidmVyc2NoaWVkZW5lbSI6CisgICAgICAgICAgIGNhc2UgInZlcnNjaGllZGVuZXMiOgorICAgICAgICAgICAgICAgb2JzID0gYWxsX2ludmVudG9yeSgpOworICAgICAgICAgICAgICAgb2JzIC09IGZpbHRlcl9vYmplY3RzKCBvYnMsICJRdWVyeVByb3AiLCBQX1dFQVBPTl9UWVBFICk7CisgICAgICAgICAgICAgICBvYnMgLT0gZmlsdGVyX29iamVjdHMoIG9icywgIlF1ZXJ5UHJvcCIsIFBfQVJNT1VSX1RZUEUgKTsKKyAgICAgICAgICAgICAgIG9icyAtPSBmaWx0ZXJfb2JqZWN0cyggb2JzLCAiSXNDbG90aGluZyIpOworICAgICAgICAgICAgICAgb2JzIC09IGZpbHRlciggb2JzLCAjJ2xpdmluZy8qJyovICk7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAKKyAgICAgICAgICAgY2FzZSAiZWlnZW5lcyI6CisgICAgICAgICAgIGNhc2UgImVpZ2VuZW0iOgorICAgICAgICAgICBjYXNlICJlaWdlbmVuIjoKKyAgICAgICAgICAgY2FzZSAibWVpbnMiOgorICAgICAgICAgICBjYXNlICJhbGxlcyBlaWdlbmUiOgorICAgICAgICAgICAgICAgaWYgKG9iamVjdHAoaGF1ZmVuPXByZXNlbnQoIlxuaGF1ZmVuICIrCisgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfcGxheWVyKCktPm5hbWUoV0VNKSkpKSB7CisgICAgICAgICAgICAgICAgICBvYnMgPSBhbGxfaW52ZW50b3J5KGhhdWZlbik7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAvLyBrZWluIGJyZWFrOywgRmFsbC10aHJvdWdoIQorICAgICAgICAgICBjYXNlICJiZWhhbHRlbmVtIjoKKyAgICAgICAgICAgY2FzZSAiYmVoYWx0ZW5lbiI6CisgICAgICAgICAgIGNhc2UgImJlaGFsdGVuZXMiOgorICAgICAgICAgICBjYXNlICJhbGxlcyBiZWhhbHRlbmUiOgorICAgICAgICAgICAgICAgb2JzICs9IGZpbHRlciggYWxsX2ludmVudG9yeSgpLCAiX2JlaGFsdGVuIiwgTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldHVpZCh0aGlzX3BsYXllcigpIHx8IHByZXZpb3VzX29iamVjdCgpKSApOworCisgICAgICAgICAgICAgICBvYnMgKz0gKFF1ZXJ5UHJvcChQX0FSTU9VUlMpIHx8ICh7fSkpCisgICAgICAgICAgICAgICAgICAgKyAoeyBRdWVyeVByb3AoUF9XRUFQT04pIH0pIC0gKHsgMCB9KTsKKyAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgIGlmICggY29tcGxleF9kZXNjWzAuLjNdID09ICJqZWRlIiB8fAorICAgICAgICAgICAgICAgICAgICBjb21wbGV4X2Rlc2NbMC4uNF0gPT0gImFsbGUgIikKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBpZiAoIGNvbXBsZXhfZGVzY1s0Li40XSA9PSAiICIgKQorICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgb2JzID0gZmlsdGVyX29iamVjdHMoIGFsbF9pbnZlbnRvcnkoKSwgImlkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXhfZGVzY1s1Li5dICk7CisgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIGNvbXBsZXhfZGVzY1s0Li41XSApCisgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAibSAiOgorICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJyICI6CisgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIm4gIjoKKyAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAicyAiOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JzID0gZmlsdGVyX29iamVjdHMoIGFsbF9pbnZlbnRvcnkoKSwgImlkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV4X2Rlc2NbNi4uXSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9icyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9icykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgLy8gRGVyIE5vcm1hbGZhbGw6IGVpbnplbG5lIElELi4uCisgICAgICAgICAgICAgICBvYiA9IHByZXNlbnQoIGNvbXBsZXhfZGVzYywgTUUgKTsKKyAgICAgICAgICAgICAgIC8vIEFjaHR1bmc6IGRpZXNlciBUZWlsIHNldHp0IGRhcyBmb3IoKSBmb3J0IChjb250aW51ZSkgdW5kCisgICAgICAgICAgICAgICAvLyB1bWdlaHQgZGFiZWkgZGllIFBydWVmdW5nIGF1ZiBTaWNodGJhcmtlaXQgbmFjaCBkZW0gRW5kZSB2b20KKyAgICAgICAgICAgICAgIC8vIHN3aXRjaCgpLiBBdXMgZGllc2VtIEdydW5kZSBtdXNzIGhpZXIgc2VsYmVyIGdlcHJ1ZWZ0CisgICAgICAgICAgICAgICAvLyB3ZXJkZW4uCisgICAgICAgICAgICAgICBpZiAoIG1ldGggJiBQT1NfSU5WRVJTICkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBpZiAoIG9iICYmIG9iICE9IE1FICkKKyAgICAgICAgICAgICAgICAgICAgICAgZXJnICs9IChmaWx0ZXJfb2JqZWN0cyggYWxsX2ludmVudG9yeSgpLCAic2hvcnQiICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtICh7IG9iIH0pICk7CisgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICBlcmcgKz0gZmlsdGVyX29iamVjdHMoIGFsbF9pbnZlbnRvcnkoKSwgInNob3J0IiApOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgZWxzZSBpZiAoIG9iICYmIG9iICE9IE1FICYmICFvYi0+UXVlcnlQcm9wKFBfSU5WSVMpICkKKyAgICAgICAgICAgICAgICAgICBlcmcgKz0gKHsgb2IgfSk7ICAgLy9Ob3JtYWxmYWxsOiBlaW56ZWxuZSBJRAorCisgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICB9ICAvLyBzd2l0Y2gKKyAgICAgICAgICAgLy8gdW5zaWNodGJhcmUgb2JqZWt0ZSBlbnRmZXJuZW4KKyAgICAgICAgICAgb2JzID0gZmlsdGVyX29iamVjdHMoIG9icywgInNob3J0IiApOyAKKyAgICAgICB9IC8vIGVsc2UKKworICAgICAgIGlmICggbWV0aCAmIFBPU19JTlZFUlMgKQorICAgICAgICAgICBlcmcgKz0gKCBmaWx0ZXJfb2JqZWN0cyggYWxsX2ludmVudG9yeSgpLCAic2hvcnQiICkgLSBvYnMgKTsKKyAgICAgICBlbHNlCisgICAgICAgICAgIGVyZyArPSBvYnM7CisgICB9IC8vIGZvcgorICAgcmV0dXJuIGVyZzsKK30KKworLyoKKyAqIHJldHVybnMgYSBsaXN0IG9mIGFsbCBmb3VuZCBvYmplY3RzIGluc2lkZSBpdHNlbGYKKyAqIG1heSBjYWxsIHNhbWUgZnVuY3Rpb24gaW4gb2JqZWN0cyBpbnNpZGUKKyAqCisgKiBGdW5rdGlvbiB3aXJkIG5pY2h0IG1laHIgdm9uIHB1dF9hbmRfZ2V0IGF1ZmdlcnVmZW4sIHN0YXR0ZGVzc2VuIHdpcmQKKyAqIGRpcmVrdCBwcmVzZW50X29iamVjdHMgYmVudXR6dCEKKyAqLyAKK29iamVjdCAqbG9jYXRlX29iamVjdHMoIHN0cmluZyBjb21wbGV4X2Rlc2MsIGludCBpbmZvICkgeworICAgIHN0cmluZyB3YXMsIHdvOworCisgICAgaWYgKCBzc2NhbmYoIGNvbXBsZXhfZGVzYywgIiVzIGluICVzIiwgd2FzLCB3byApID09IDIgKXsKKyAgICAgIG9iamVjdCAqZm91bmRfb2JzID0gKHt9KTsKKyAgICAgIGZvcmVhY2gob2JqZWN0IGludm9iOiBwcmVzZW50X29iamVjdHMod28pKSB7CisgICAgICAgIC8vIHx8ICh7fSkgd2VpbCBpbnZvYiBlaW4gT2JqZWt0IG9obmUgbG9jYXRlX29iamVjdHMoKSBzZWluIGtvZW5udGUuCisgICAgICAgIGZvdW5kX29icyArPSAob2JqZWN0ICopaW52b2ItPmxvY2F0ZV9vYmplY3RzKCB3YXMsIGluZm8pIHx8ICh7fSk7CisgICAgICB9CisgICAgICByZXR1cm4gZm91bmRfb2JzOworICAgIH0KKyAgICAvLyBrZWluICJpbiIgZ2VmdW5kZW4KKyAgICByZXR1cm4gcHJlc2VudF9vYmplY3RzKCBjb21wbGV4X2Rlc2MgKTsKK30KKwpkaWZmIC0tZ2l0IGEvc3RkL2NvcnBzZS5jIGIvc3RkL2NvcnBzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNGQ4YWUKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvY29ycHNlLmMKQEAgLTAsMCArMSw3MjcgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIgICAgICAgICAgICAgICAKKy8vCisvLyBjb3Jwc2UuYyAtLSBjb3Jwc2Ugc3RhbmRhcmQgb2JqZWN0CisvLworLy8gJElkOiBjb3Jwc2UuYyA5MzkxIDIwMTUtMTItMDcgMjI6Mjg6NTNaIEFyYXRob3JuICQKKworLy8gQSBjb3Jwc2UuCisvLyAKKy8vIEVrZWx0ZXh0ZSBieSBCb2luZworLy8KKy8vIFRoaXMgaXMgYSBkZWNheWluZyBjb3Jwc2UuIEl0IGlzIGNyZWF0ZWQgYXV0b21hdGljYWxseQorLy8gd2hlbiBhIHBsYXllciBvciBtb25zdGVyIGRpZXMuCisvLworLy8gRXJ3ZWl0ZXJ1bmcgUmFzY2hhdWE6CisvLyAtIEtvcGllcmVuIHZvbiBQX0NMQVNTCisvLyAtIFRlaWx3ZWlzZXMgYXVmZXNzZW4KKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgcGVkYW50aWMKKworLy8jZGVmaW5lIE5FRURfUFJPVE9UWVBFUworCitpbmhlcml0ICJzdGQvY29udGFpbmVyIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxsaXZpbmcvbGlmZS5oPgorI2luY2x1ZGUgIi9zZWN1cmUvc2NvcmVtYXN0ZXIuaCIKKworI2RlZmluZSBDT1JQU0VfT0JKICIvc3RkL2NvcnBzZS5jIgorI2RlZmluZSBQSUxFX09CSiAiL3N0ZC9waWxlLmMiCisKK25vc2F2ZSBpbnQgX2RlY2F5ID0gNDsKK25vc2F2ZSBzdHJpbmcgX25hbWUgPSAiVW5iZWthbm50IjsKK25vc2F2ZSBvYmplY3QgbW9lcmRlcjsKK3ByaXZhdGUgbm9zYXZlIGludCBnZXNwb3R0ZXQgPSAwOworbm9zYXZlIGludCBuYWhydW5nX2dlc2FtdCA9IDE7Citub3NhdmUgaW50IG5haHJ1bmdfYWt0dWVsbCA9IDE7CisvLyBTcGllbGVybGVpY2hlPworcHJpdmF0ZSBub3NhdmUgc3RhdHVzIHNwaWVsZXJsZWljaGU7CisKK3ZvaWQgSWRlbnRpZnkoIG9iamVjdCBvYiApOwordm9pZCBkb19kZWNheSgpOworaW50IFF1ZXJ5RGVjYXkoKTsKK3N0YXRpYyBpbnQgbWFtcGYoIHN0cmluZyBzdHIgKTsKK3N0YXRpYyBpbnQgc3BvdHQoc3RyaW5nIHN0cik7Cit2b2lkIENoYW5uZWxNZXNzYWdlSmVlciggbWl4ZWQgc2VuZGVyLCBzdHJpbmcgdGV4dCwgaW50IGZsYWcgKTsKK29iamVjdCBfY2hhbm5lbCggb2JqZWN0IG9iICk7Cit2b2lkIHRyYW5zZm9ybV9pbnRvX3BpbGUoKTsKKwordm9pZCBjcmVhdGUoKQoreworICBpZiAob2JqZWN0X25hbWUoTUUpID09IF9fRklMRV9fWzAuLjwzXSkgeworICAgIHNldF9uZXh0X3Jlc2V0KC0xKTsKKyAgfQorICA6OmNyZWF0ZSgpOworICBpZiggY2xvbmVwKHRoaXNfb2JqZWN0KCkpICkKKyAgeworICAgIEFkZElkKCh7ICJsZWljaGUiLCJcbmxlaWNoZSIsInJlc3QiLCJ1ZWJlcnJlc3QifSkpOworICAgIFNldFByb3AoIFBfR0VOREVSLCBGRU1BTEUgKTsKKyAgICBTZXRQcm9wKCBQX05BTUUsICJMZWljaGUiICk7CisgICAgU2V0UHJvcCggUF9NQVRFUklBTCwgKFsgTUFUX01JU0NfREVBRDogMTAwIF0pICk7CisgICAgU2V0UHJvcCggUF9DT1JQU0VfREVDQVlfVElNRSwgMzAgKTsKKyAgICBTZXRQcm9wKFBfTk9fU0NPUkUsMSk7CisgICAgQWRkQ21kKCh7ImlzcyIsInZlcnNwZWlzZSJ9KSwibWFtcGYiKTsKKyAgICBBZGRDbWQoInNwb3R0ZSIsInNwb3R0Iik7CisgICAgU2V0UHJvcChQX0FSVElDTEUsIDEpOworICB9CisgIGVsc2UKKyAgICBTZXRQcm9wKCBQX0FSVElDTEUsIDAgKTsKK30KKworLyogRGFtaXQgZGllIExlaWNoZSBuaWNodCB2b2xsIHdpcmQuLi4gKi8KK2ludCBNYXlBZGRXZWlnaHQoIGludCB3ZWlnaHQgKSB7IHJldHVybiAwOyB9CitpbnQgTWF5QWRkT2JqZWN0KCBvYmplY3Qgb2IgKSB7IHJldHVybiAxOyB9CisKKworLyogSHVtbmksIDIwMDQtMDYtMTY6IEVudHN0YXRpY3QgKi8KK3N0cmluZyBfcXVlcnlfbGVpY2hlbl9uYW1lKCkKK3sgICByZXR1cm4gX25hbWU7ICAgfQorCisvKiBVZWJlcm5laG1lIGRlbiBOYW1lbiB2b24gb2IgKi8KK3ZvaWQgSWRlbnRpZnkoIG9iamVjdCBvYiApCit7CisgICAgY2xvc3VyZSBjbDsKKyAgICBpbnQgaTsKKyAgICBzdHJpbmcgaW5mbzsKKworICAgIHNwaWVsZXJsZWljaGUgPSBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iKTsKKyAgICBjbD1zeW1ib2xfZnVuY3Rpb24oIlF1ZXJ5UHJvcCIsIG9iKTsKKyAgICBfbmFtZSA9IChzdHJpbmcpIG9iLT5uYW1lKFdFU1NFTiwwKTsKKyAgICBTZXRQcm9wKCBQX1NIT1JULCAiRGllIExlaWNoZSAiKyBfbmFtZSApOworICAgIFNldFByb3AoIFBfTE9ORywgIkR1IHNpZWhzdCBkaWUgc3RlcmJsaWNoZW4gVWViZXJyZXN0ZSAiKyBfbmFtZSArICIuXG4iICk7CisgICAgX2RlY2F5ID0gNDsKKyAgICBTZXRQcm9wKCBQX09SSUdfTkFNRSwgdG9fc3RyaW5nKG9iLT5uYW1lKFJBVykpICAgICAgKTsKKyAgICBTZXRQcm9wKCBQX1BJTEVfTkFNRSwgdG9fc3RyaW5nKG9iLT5uYW1lKFdFTSkpICAgICAgKTsKKyAgICBBZGRJZCggIlxubGVpY2hlICIrIFF1ZXJ5UHJvcChQX1BJTEVfTkFNRSkgICAgICAgICAgKTsKKyAgICBTZXRQcm9wKCBQX0tJTExFUiwgICAgICAgIChvYmplY3QpICAgZnVuY2FsbChjbCwgUF9LSUxMRVIpICAgICAgICApOworICAgIFNldFByb3AoIFBfQVRUUklCVVRFUywgICAgKG1hcHBpbmcpICBmdW5jYWxsKGNsLCBQX0FUVFJJQlVURVMpICAgICk7CisgICAgU2V0UHJvcCggUF9MQVNUX0RBTVRZUEVTLCAoc3RyaW5nICopIGZ1bmNhbGwoY2wsIFBfTEFTVF9EQU1UWVBFUykgKTsKKyAgICBTZXRQcm9wKCBQX1hQLCAgICAgdG9faW50KGZ1bmNhbGwoY2wsIFBfWFApKSAgICAgICAgKTsKKyAgICBTZXRQcm9wKCBQX1NJWkUsICAgdG9faW50KGZ1bmNhbGwoY2wsIFBfU0laRSkpICAgICAgKTsKKyAgICBTZXRQcm9wKCBQX0xFVkVMLCAgdG9faW50KGZ1bmNhbGwoY2wsIFBfTEVWRUwpKSAgICAgKTsKKyAgICBTZXRQcm9wKCBQX01BWF9IUCwgdG9faW50KGZ1bmNhbGwoY2wsIFBfTUFYX0hQKSkgICAgKTsKKyAgICBTZXRQcm9wKCBQX1JBQ0UsICAgdG9fc3RyaW5nKGZ1bmNhbGwoY2wsIFBfUkFDRSkpICAgKTsKKyAgICBTZXRQcm9wKCBQX0NMQVNTLCAgKHN0cmluZyAqKShmdW5jYWxsKGNsLCBQX0NMQVNTKSkgKTsKKyAgICBTZXRQcm9wKCBQX0hBTkRTLCAgKG1peGVkICopIGZ1bmNhbGwoY2wsIFBfSEFORFMpICAgKTsKKyAgICBTZXRQcm9wKCBQX1dFSUdIVCwgKG1peGVkICopIGZ1bmNhbGwoY2wsIFBfV0VJR0hUKSAgKTsKKyAgICBTZXRQcm9wKCBQX0FMSUdOLCAgdG9faW50KGZ1bmNhbGwoY2wsIFBfQUxJR04pKSAgICAgKTsKKyAgICBTZXRQcm9wKCBQX09SSUdfRklMRV9OQU1FLCBvYmplY3RfbmFtZShvYikgICAgICAgICAgKTsKKyAgICBTZXRQcm9wKCBQX0hFQUwsICAgdG9faW50KGZ1bmNhbGwoY2wsIFBfSEVBTCkpICAgICAgKTsKKyAgICAKKyAgICAvLyBTYWV0dGlndW5nIGRlciBMZWljaGUgYmVyZWNobmVuCisgICAgLy8gUF9XRUlHSFQgdW5kIFBfU0laRSB3ZXJkZW4gdmVyd2VuZGV0LCBNaXR0ZWwgYmlsZGVuCisgICAgLy8gRWluIFNhZXR0aWd1bmdzcHVua3QgZnVlciAoa29uc2VydmF0aXZlIFJlY2hudW5nKToKKyAgICAvLyAgICAgICAgICAgNSBrZworICAgIC8vICAgICAgICAgIDEyIGNtCisgICAgLy8gQmVpc3BpZWxlOgorICAgIC8vICAgICAgICAgIE1lbnNjaCwgMS44MCBtIGdyb3NzLCA3NSBrZyBzY2h3ZXI6CisgICAgLy8gICAgICAgICAgMTgwLzEyICsgNzUvNSA9IDE1ICsgMTUgPSAzMAorICAgIC8vICAgICAgICAgIEt1aCwgMS41MCBtIGdyb3NzLCA1MDAga2cgc2Nod2VyOgorICAgIC8vICAgICAgICAgIDE1MC8xMiArIDUwMC81ID0gMTIgKyAxMDAgPSAxMTIKKyAgICAvLyAgICAgICAgICBEcmFjaGUsIDUgbSBncm9zcywgMTUwMCBrZyBzY2h3ZXI6CisgICAgLy8gICAgICAgICAgNTAwLzEyICsgMTUwMC81ID0gNDEgKyAzMDAgPSAzNDEKKyAgICBuYWhydW5nX2dlc2FtdCA9IFF1ZXJ5UHJvcChQX1dFSUdIVCkvNTAwMCArIFF1ZXJ5UHJvcChQX1NJWkUpLzEyOworICAgIGlmIChuYWhydW5nX2dlc2FtdCA8PSAwKQorICAgICAgbmFocnVuZ19nZXNhbXQgPSAxOworICAgIG5haHJ1bmdfYWt0dWVsbCA9IG5haHJ1bmdfZ2VzYW10OworCisgICAgaWYgKCBpbnRwKGkgPSBmdW5jYWxsKGNsLCBQX0NPUlBTRV9ERUNBWV9USU1FKSkgJiYgaSA+IDIgKQorICAgICAgICBTZXRQcm9wKCBQX0NPUlBTRV9ERUNBWV9USU1FLCBpICk7CisKKyAgICBjYWxsX291dCggImRvX2RlY2F5IiwgUXVlcnlQcm9wKFBfQ09SUFNFX0RFQ0FZX1RJTUUpICk7CisKKyAgICBpZiAoICFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iKSApCisgICAgICAgIG1vZXJkZXIgPSAob2JqZWN0KSAiL3N0ZC9jb3Jwc2UiLT5fY2hhbm5lbChvYik7Cit9CisKK3B1YmxpYyBpbnQgSXNQbGF5ZXJDb3Jwc2UoKSB7IHJldHVybiBzcGllbGVybGVpY2hlOyB9CisKK3B1YmxpYyBzdHJpbmcgUXVlcnlIZWFsSW5mbygpCit7CisgIHN0cmluZyBpbmZvID0gIlNvbGx0ZXN0IER1IGF1ZiBkaWUgYWJlcndpdHppZ2UgSWRlZSB2ZXJmYWxsZW4sIGRpZXNlICIKKyAgICAiTGVpY2hlIHp1IGVzc2VuLCAiOworICBzd2l0Y2goIFF1ZXJ5UHJvcChQX0hFQUwpICkKKyAgeworICAgIGNhc2UgLV9fSU5UX01BWF9fLi4tMTAwOgorICAgICAgaW5mbyArPSAid2lyZCBEaXIgZGFzIGVyaGVibGljaGVuIFNjaGFkZW4genVmdWVnZW4uIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgLTk5Li4tMTE6CisgICAgICBpbmZvICs9ICJpc3QgZGFzIGF1c2dlc3Byb2NoZW4gdW5nZXN1bmQgZnVlciBEaWNoLiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIC0xMC4uLTE6CisgICAgICBpbmZvICs9ICJ3aXJkIERpciBzaWNoZXIgZWluIHdlbmlnIHVlYmVsIHdlcmRlbi4iOworICAgICAgYnJlYWs7CisgICAgY2FzZSAwLi41OgorICAgICAgaW5mbyArPSAid2lyZCBEaXIgbmljaHRzIHNjaGxpbW1lcyBwYXNzaWVyZW4uIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNi4uX19JTlRfTUFYX186CisgICAgICBpbmZvICs9ICJrb2VubnRlc3QgRHUgc29nYXIgZWluIHdlbmlnIGdlaGVpbHQgd2VyZGVuLiI7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gaW5mbzsKK30KKworcHJpdmF0ZSBzdHJpbmcga25hYmJlcl90ZXh0KCkKK3sKKyAgc3RyaW5nIHR4dDsKKyAgc3dpdGNoIChuYWhydW5nX2FrdHVlbGwgKiA0IC8gbmFocnVuZ19nZXNhbXQpIHsKKyAgY2FzZSA0OgorICAgIC8vIExlaWNoZSBub2NoIGtvbXBsZXR0CisgICAgdHh0ID0gIiI7CisgICAgYnJlYWs7CisgIGNhc2UgMzoKKyAgICAvLyBub2NoIG1heGltYWwgOTklCisgICAgdHh0ID0gIiBtaXQgS25hYmJlcnNwdXJlbiB1ZWJlcnNhZXRlIjsKKyAgICBicmVhazsKKyAgY2FzZSAyOgorICAgIC8vIG5vY2ggbWF4aW1hbCA3NCUKKyAgICB0eHQgPSAiIGFuZ2VmcmVzc2VuZSI7CisgICAgYnJlYWs7CisgIGNhc2UgMToKKyAgICAvLyBub2NoIG1heGltYWwgNDklCisgICAgdHh0ID0gIiBzY2hvbiBoYWxiIGF1ZmdlZnV0dGVydGUiOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIC8vIG5vY2ggbWF4aW1hbCAyNCUKKyAgICB0eHQgPSAiIHRvdGFsIGFiZ2VuYWd0ZSI7CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHR4dDsKK30KKworc3RhdGljIHN0cmluZyBfcXVlcnlfc2hvcnQoKQoreworICBzdHJpbmcgdHh0OworICBzd2l0Y2goX2RlY2F5KSB7CisgIGNhc2UgNDoKKyAgICB0eHQgPSAiRGllIitrbmFiYmVyX3RleHQoKSsiIExlaWNoZSAiOworICAgIGJyZWFrOworICBjYXNlIDM6CisgICAgdHh0ID0gIkRpZSBiZXJlaXRzIHppZW1saWNoIHN0aW5rZW5kZSIra25hYmJlcl90ZXh0KCkrIiBMZWljaGUgIjsKKyAgICBicmVhazsKKyAgY2FzZSAyOgorICAgIHR4dCA9ICJEaWUgc2NoaW1tZWxuZGUgdW5kIGhhbGJ2ZXJ3ZXN0ZSIra25hYmJlcl90ZXh0KCkrIiBMZWljaGUgIjsKKyAgICBicmVhazsKKyAgY2FzZSAxOgorICAgIHR4dCA9ICJEaWUgdmVyZmF1bHRlbiIrKHNpemVvZihrbmFiYmVyX3RleHQoKSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuIjoiIikrIiBFaW56ZWx0ZWlsZSAiOworICAgIGJyZWFrOworICB9CisgIHR4dCArPSBfbmFtZTsKKyAgcmV0dXJuIHR4dDsKK30KKwordm9pZCBkb19kZWNheSgpCit7CisgICAgX2RlY2F5IC09IDE7CisgICAgCisgICAgaWYgKCBfZGVjYXkgPiAwICkgCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIChfZGVjYXkgPT0gMikgJiYgKFF1ZXJ5UHJvcCggUF9IRUFMICkgPj0gLTQpICkKKyAgICAgICAgICAgIFNldFByb3AoIFBfSEVBTCwgLTQgKTsKKyAgICAgICAgICAgIGNhbGxfb3V0KCAiZG9fZGVjYXkiLCBRdWVyeVByb3AoUF9DT1JQU0VfREVDQVlfVElNRSkgKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgCisgICAgdHJhbnNmb3JtX2ludG9fcGlsZSgpOworICAgIHJlbW92ZSgpOworfQorCisvKiBIYWVoPyBEYXMgbW92ZSBpbnMgZW52IG1hY2h0IGRlciBNYXN0ZXIgaW0gcHJlcGFyZV9kZXN0cnVjdCgpIGRvY2ggZWg/ICovCisvKgordmFyYXJncyBpbnQgcmVtb3ZlKCkKK3sKKyAgICAvLyB1bml0cyBiZWtvbW1lbiBlaW5lIENoYW5jZSB6dXIgVmVyZWluaWd1bmcuLi4KKyAgICBmaWx0ZXJfb2JqZWN0cyggYWxsX2ludmVudG9yeShNRSksICJtb3ZlIiwgZW52aXJvbm1lbnQoTUUpLCBNX1NJTEVOVCApOworICAgIHJldHVybiA6OnJlbW92ZSgpOworfQorKi8KKworaW50IFF1ZXJ5RGVjYXkoKSB7IHJldHVybiBfZGVjYXk7IH0KKworc3RhdGljIGludCAqIF9xdWVyeV9uYWhydW5nKCkKK3sgICByZXR1cm4gKHtuYWhydW5nX2FrdHVlbGwsIG5haHJ1bmdfZ2VzYW10fSk7ICAgfQorCitwcml2YXRlIHN0cmluZyBtYW1wZl9oZWlsdW5nKGludCB3aWV2aWVsKQoreworICBpbnQgaGVhbDsKKyAgc3RyaW5nIG1zZzsKKyAgaGVhbCA9IFF1ZXJ5UHJvcChQX0hFQUwpOworICAvLyBBbnRlaWwgYW4gR2VzYW10aGVpbHVuZyBhdXNyZWNobmVuCisgIGhlYWwgPSBoZWFsICogd2lldmllbCAvIG5haHJ1bmdfZ2VzYW10OworICBpZiAoICggaGVhbCApIDwgMCApIHsKKyAgICAvLyAKKyAgICB0aGlzX3BsYXllcigpLT5kb19kYW1hZ2UoIHJhbmRvbSgtaGVhbCksIHRoaXNfb2JqZWN0KCkgKTsKKyAgICBtc2cgPSAiQnVhaCwgZGllc2UgTGVpY2hlIHdhciB6d2VpZmVsbG9zIG5pY2h0IGJlc29uZGVycyBnZXN1bmQuXG4iOworICB9IGVsc2UgeworICAgIHRoaXNfcGxheWVyKCktPmhlYWxfc2VsZiggcmFuZG9tKGhlYWwpICk7CisgICAgbXNnID0gIkhtbW0sIGxlY2tlciFcbiI7CisgIH0KKyAgcmV0dXJuIG1zZzsKK30KKworc3RhdGljIGludCBtYW1wZiggc3RyaW5nIHN0ciApCit7CisgICAgaW50IGdlZ2Vzc2VuOworCisgICAgX25vdGlmeV9mYWlsKCJXYXMgbW9lY2h0ZXN0IER1IGVzc2VuP1xuIik7CisgICAgCisgICAgaWYgKCAhc3RyIHx8ICFpZChzdHIpICkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAodGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKFBfR0hPU1QpKQorICAgIHsKKwlfbm90aWZ5X2ZhaWwoIkRhcyB3dWVyZGUgZHVyY2ggRGljaCBoaW5kdXJjaCBmYWxsZW4uXG4iKTsKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBEYXMgZm9sZ2VuZGUgaXN0IG5pY2h0IGdhbnogc2F1YmVyLCBkYSBkaWUgU3RhZXJrZSBiZWkgZWF0X2Zvb2QgbmljaHQKKyAgICAvLyB1bmJlZGluZ3QgZGVtIFNhZXR0aWd1bmdzd2VydCBlbnRzcHJlY2hlbiBtdXNzICh3ZWdlbiBGT09EX1ZBTFVFKS4KKyAgICBnZWdlc3NlbiA9IChpbnQpIHRoaXNfcGxheWVyKCktPlF1ZXJ5UHJvcChQX01BWF9GT09EKSAtCisgICAgICAoaW50KSB0aGlzX3BsYXllcigpLT5RdWVyeVByb3AoUF9GT09EKTsKKyAgICBpZiAoZ2VnZXNzZW4gPD0gMCkgeworICAgICAgLy8gU3BpZWxlciBpc3QgcHJvcHBlbnZvbGwsIE1lbGR1bmcgYXVzZ2ViZW4KKyAgICAgIGdlZ2Vzc2VuID0gMDsKKyAgICAgIHdyaXRlKCJEdSBiZWtvbW1zdCB2b24gZGVyIExlaWNoZSBuaWNodCBlaW5lbiBCaXNzZW4gbWVociBydW50ZXIuXG4iKTsKKyAgICB9IGVsc2UgaWYgKGdlZ2Vzc2VuID49IG5haHJ1bmdfYWt0dWVsbCkgeworICAgICAgLy8gc3BpZWxlciBrYW5uIGRpZSBnZXNhbXRlIExlaWNoZSBlc3NlbiwgYWxzbyBlbnRmZXJuZW4uCisgICAgICB0aGlzX3BsYXllcigpLT5lYXRfZm9vZChuYWhydW5nX2FrdHVlbGwpOworICAgICAgLy8gVmVyZGFtbXQuIGVhdF9mb29kKCkga2FubiBUUCB1bWdlYnJhY2h0IGhhYmVuIHVuZCBpbSBGYWxsZSBlaW5lcyBOUEMKKyAgICAgIC8vIGlzdCBkZXIgZGFubiB3ZWcuCisgICAgICBpZiAob2JqZWN0cCh0aGlzX3BsYXllcigpKSkgeworCXdyaXRlKG1hbXBmX2hlaWx1bmcobmFocnVuZ19ha3R1ZWxsKSk7CisJc2F5KCBzcHJpbnRmKCIlcyB3aXJkIHZvbiAlcyB2b2xsIEhpbmdlYnVuZyB2ZXJzcGVpc3QuXG4iLAorICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUobmFtZShXRVIpKSwKKyAgICAgICAgICAgICAgICAgICAoc3RyaW5nKSB0aGlzX3BsYXllcigpLT5uYW1lKFdFTSkpICk7CisgICAgICB9CisgICAgICB0cmFuc2Zvcm1faW50b19waWxlKCk7CisgICAgICByZW1vdmUoKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gQXVjaCB0ZWlsd2Vpc2UgVmVyc3BlaXN1bmcgaXN0IG1vZWdsaWNoLCBuYWhydW5nX2FrdHVlbGwgYW5wYXNzZW4KKyAgICAgIHRoaXNfcGxheWVyKCktPmVhdF9mb29kKGdlZ2Vzc2VuKTsKKyAgICAgIGlmIChvYmplY3RwKHRoaXNfcGxheWVyKCkpKSB7CisJd3JpdGUobWFtcGZfaGVpbHVuZyhnZWdlc3NlbikrIkxlaWRlciBiaXN0IER1IG5pY2h0IGluIGRlciBMYWdlLCIKKyAgICAgICAgICAgICAgICIgYWxsZXMgYXVmenVlc3Nlbi5cbiIpOworICAgICAgc2F5KCBzcHJpbnRmKCIlcyBrbmFiYmVydCBhbiAlcyBoZXJ1bS5cbiIsCisgICAgICAgICAgICAgICAgICAgKHN0cmluZykgdGhpc19wbGF5ZXIoKS0+bmFtZSgpLAorICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUobmFtZShXRU0pKSApICk7CisgICAgICB9CisgICAgICBuYWhydW5nX2FrdHVlbGwgLT0gZ2VnZXNzZW47CisgICAgfQorICAgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgc3BvdHQoIHN0cmluZyBzdHIgKQoreworICAgIGlmICggIXN0ciApCisgICAgICAgIHJldHVybiBfbm90aWZ5X2ZhaWwoICJTeW50YXg6IHNwb3R0ZSA8dGV4dD5cbiIgKSwgMDsKKyAgICAKKyAgICBpZiAoICFvYmplY3RwKG1vZXJkZXIpICkKKyAgICAgICAgcmV0dXJuIF9ub3RpZnlfZmFpbCggIkRpZXNlcyBPcGZlciBpc3QgZGVuIFNwb3R0IG5pY2h0IHdlcnQuXG4iICksIDA7CisgICAgCisgICAgaWYgKCBQTCAhPSBtb2VyZGVyICkKKyAgICAgICAgcmV0dXJuIF9ub3RpZnlfZmFpbCggIkR1IGthbm5zdCBudXIgRGVpbmUgZWlnZW5lbiBPcGZlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsidmVyc3BvdHRlbiFcbiIgKSwgMDsKKworICAgIGlmICggZ2VzcG90dGV0ICkKKyAgICAgICAgcmV0dXJuIF9ub3RpZnlfZmFpbCggIkR1IGthbm5zdCBEZWluIE9wZmVyIG51ciBlaW5tYWwgdmVyc3BvdHRlbiFcbiIgKQorICAgICAgICAgICAgLCAwOworCisgICAgaWYgKCBfZGVjYXkgPCA0ICkKKyAgICAgICAgcmV0dXJuIF9ub3RpZnlfZmFpbCggIkRhIHNvbGx0ZXN0IER1IHNjaG9uIGV0d2FzIHNwb250YW5lciBzZWluLlxuIiApCisgICAgICAgICAgICAsIDA7CisKKyAgICBzdHIgPSAoc3RyaW5nKSBQTC0+X3VucGFyc2VkX2FyZ3MoKTsKKyAgICAKKyAgICBzd2l0Y2ggKCBzdHJbMF0gKQorICAgICAgICB7CisgICAgICAgIGNhc2UgJzonOgorICAgICAgICAgICAgIi9zdGQvY29ycHNlIi0+Q2hhbm5lbE1lc3NhZ2VKZWVyKCBQTCwgc3RyWzEuLl0sIE1TR19FTU9URSApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgCisgICAgICAgIGNhc2UgJzsnOgorICAgICAgICAgICAgIi9zdGQvY29ycHNlIi0+Q2hhbm5lbE1lc3NhZ2VKZWVyKCBQTCwgc3RyWzEuLl0sIE1TR19HRU1PVEUgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIAorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgIi9zdGQvY29ycHNlIi0+Q2hhbm5lbE1lc3NhZ2VKZWVyKCBQTCwgc3RyLCBNU0dfU0FZICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAKKyAgZ2VzcG90dGV0ID0gMTsKKyAgd3JpdGUoICJEdSB2ZXJzcG90dGVzdCBEZWluIHRvdGVzIE9wZmVyLlxuIiApOworICAKKyAgcmV0dXJuIDE7Cit9CisKKwordm9pZCBDaGFubmVsTWVzc2FnZUplZXIoIG1peGVkIHNlbmRlciwgc3RyaW5nIHRleHQsIGludCBmbGFnICkKK3sKKyAgaWYgKG1lbWJlcihpbmhlcml0X2xpc3QocHJldmlvdXNfb2JqZWN0KCkpLENPUlBTRV9PQkopPi0xKQorICAgICAgQ0hNQVNURVItPnNlbmQoICJNb2VyZGVyIiwgc2VuZGVyLCB0ZXh0LCBmbGFnICk7Cit9CisKKworLy8gX2NoYW5uZWwoKSAtLQorI2RlZmluZSBLSUxMX01FU1NBR0VTIFwKKyJKZXR6dCBoYXQgbWljaCBkb2NoIGdsYXR0ICVzIGVyd2lzY2h0IDooIiwgXAorIldpZSBzb2xsIGRhcyBub2NoIGVuZGVuLCAlcz8iLCBcCisiVW5nbGF1YmxpY2gsIHdpZSBoYXQgJXMgZGFzIGdlc2NoYWZmdD8iLCBcCisiUkFDSEUhIEJyaW5ndCAlcyB1bSEiLCBcCisiJXMgaXN0IHN0YWVya2VyIGFscyBpY2ggZGFjaHRlLiIsIFwKKyJXZW5uIGljaCBEaWNoIGVyd2lzY2hlLCAlcyEiLCBcCisiJXMgaGF0IG1pY2ggZXJtb3JkZXQhIiwgXAorIldlbGNoZSBTY2htYWNoISAlcyBoYXQgbWljaCBiZXNpZWd0LiIsIFwKKyJIdWV0ZXQgRXVjaCB2b3IgJXMhIiwgXAorIldhcnVtIGhhdCBtaXIgbmllbWFuZCBnZWdlbiAlcyBnZWhvbGZlbj8iLCBcCisiJXMsIER1IE1vbnN0ZXJzY2hhZW5kZXIhIiwgXAorIk1vbnN0ZXIgYWxsZXIgUmVnaW9uZW4sIHZlcmVpbmlndCBFdWNoIGdlZ2VuICVzISIsIFwKKyJEYW5rZSwgJXMsIER1IGhhc3QgbWljaCB2b24gZGllc2VyIHNjaHJlY2tsaWNoZW4sICIgXAorInN0ZXJibGljaGVuIEh1ZWxsZSBiZWZyZWl0LiIsIFwKKyIlcz8gSWNoIGJpbiBkYW5uIGpldHp0IHdlZy4iLCBcCisiTWFjaHQgRXVjaCBrZWluZSBNdWVoZSwgJXMgaGF0IG1pY2ggbWFsIGt1cnogenUgIiBcCisiR2V2YXR0ZXIgVG9kIGdlc2NoaWNrdC4iLCBcCisiT2ggbmVpbiwgJXMgaGF0IG1pY2ggc2Nob24gd2llZGVyIGthbHRnZW1hY2h0ISIsIFwKKyJTaGVyaWZmISBWZXJoYWZ0ZSAlcyEiLCBcCisiSGlsZmUhIERpZWJlISBNb2VyZGVyISBIYWxzYWJzY2huZWlkZXIhICVzISIsIFwKKyJXaWVkZXIgbWFsIGFuICVzIGdlc3RvcmJlbiwgZmluZCBpY2ggYWxiZXJuISIsIFwKKyIlcywgcHJvYmllciBkYXMgYmVpIEFubmUhIiwgXAorIlVuZCB3aWVkZXIgZWluIERyaXR0ZWwgRXJmYWhydW5nIHdlZyB3ZWdlbiAlcy4uLiIsIFwKKyJPaCB3YWVyIGljaCBkb2NoIGVpbiBTcGllbGVyLCBkYW5uIGR1ZXJmdGUgbWljaCAiXAorIiVzIG5pY2h0IG1laHIgdG9ldGVuISIsIFwKKyJXZW5uIER1IGRhcyBub2NoIG9lZnRlciBtYWNoc3QsICVzLCBkYW5uIHNwaWVsZSAiXAorImljaCBoaWVyIG5pY2h0IG1laHIhIiwgXAorIiVzLCB3aWVzbyByZWRldCBkZXIgS2VybCBoaWVyIGluIEdyb3NzYnVjaHN0YWJlbiAiXAorInp1IG1pcj8gQ0FQUy1MT0NLIGthcHV0dD8iLCBcCisiJXMgaXN0IHNjaHVsZCEiLFwKKyJTbyBzY2hhZmYgaWNoJ3Mgd29obCBuaWUsIFNlaGVyIHp1IHdlcmRlbiwgJXMgOigiLFwKKyJNdXNzdGUgZGFzIFdJUktMSUNIIHNlaW4sICVzPyIsXAorIld1ZW5zY2h0IG1pciBuZSBrdXJ6ZSBUb2Rlc3NlcXVlbnosIGljaCBoYWIgc2llICJcCisiJXMgenUgdmVyZGFua2VuLi4uIixcCisiTmFlY2hzdGVzIE1hbCBicmluZyBtaXIgbGllYmVyIFBvc3Qgc3RhdHQgbWljaCAiXAorInp1IGVybW9yZGVuLCAlcyEiLFwKKyIlcywgd2llc28gc2FndCBkZXIgVHlwOiBLT01NIE1JVCBNSVIsIFNURVJCTElDSEVSPyIsXAorIkljaCBnbGF1YiwgamV0enQga2VubmUgaWNoIEFMTEUgVG9kZXNzZXF1ZW56ZW4sICVzISIsXAorIldhcywgJXMgaGF0IG1pciBXSUUgVklFTEUgTGViZW5zcHVua3RlIGFiZ2V6b2dlbj8/PyIsXAorIlZlcmRhbW10LCAlcyB3b2xsdGUgbmljaHQgc3RlcmJlbi4uLiIsXAorIlRvZCBkZW4gTW9uc3RlcnNjaGFlbmRlcm4hIFN0cmFmdCAlcyEiLFwKKyJOYWVjaHN0ZXMgTWFsIHdlcmRlIElDSCBzaWVnZW4sICVzISIsXAorIkZpbmRlc3QgRHUgZGFzIGZhaXIsICVzPyIsXAorIkRhcyB3YXIgZWluIGdlbWVpbmVyIFRpZWZzY2hsYWcsICVzISIsXAorIldlbm4gaWNoIG1hbCBncm9zcyBiaW4sIHphaGwgaWNoIERpciBkYXMgYWxsZXMgIlwKKyJoZWltLCAlcyEiLFwKKyJBTEFBQUFBQVJNISAlcyBJU1QgQVVTR0VCUk9DSEVOISIsXAorIkVpbiBLb2VuaWdyZWljaCBmdWVyIGRlbiwgZGVyIG1pciBkZW4gS29wZiB2b24gIlwKKyIlcyBicmluZ3QhIixcCisiU3VjaGUgS2lsbGVyLCB6YWhsZSBndXQsIFppZWxwZXJzb24gJXMuIixcCisiRGFzIHNhZyBpY2ggYWxsZXMgQm9pbmcsICVzISIsXAorIkRhcyBzYWcgaWNoIGFsbGVzIFJ1bWF0YSwgJXMhIixcCisiRGFzIHNhZyBpY2ggYWxsZXMgSm9mLCAlcyEiLFwKKyJEYXMgc2FnIGljaCBhbGxlcyBkZW0gU2hlcmlmZiwgJXMhIixcCisiS29tbSBEdSBtaXIgbnVyIHdpZWRlciwgJXMhIixcCisiSWNoIGZvcmRlcmUgUmV2YW5jaGUsICVzISIsXAorIlNoZXJpZmYhIFVudGVybmltbSB3YXMgZ2VnZW4gJXMhIixcCisiJXMsIHdlciBoYXQgRElDSCBkZW5uIGVpbmdlbGFkZW4/IixcCisiTkFFQ0hTVEVTIE1BTCBORUhNIElDSCBESUNIIEFVQ0ggTUlULCAlcyEiLFwKKyJIYWV0dGVuIHdpciBkYXMgbmljaHQgYXVzZGlza3V0aWVyZW4ga29lbm5lbiwgJXM/IixcCisiRGljaCBtZXJrIGljaCBtaXIsICVzISIsXAorIk5hIHByaW1hLCBzY2hvbiB3aWVkZXIgZGllc2VyIGR1bmtsZSBUeXAhIFVuZCAiXAorImFsbGVzIG51ciB3ZWdlbiAlcy4iLFwKKyJIYWxsbz8gSGF0IGplbWFuZCBtZWluZW4gS29lcnBlciBnZXNlaGVuPyBNdWVzc3RlICJcCisiaXJnZW5kd28gYmVpICVzIGxpZWdlbiEiLFwKKyIlcywgd2FlciBqZXR6dCBuaWNodCBlaWdlbnRsaWNoIFZvcmxlc3VuZz8iLFwKKyJMZXJuIGxpZWJlciwgc3RhdHQgdW5zY2h1bGRpZ2UgTW9uc3RlciB6dSBlciJcCisibW9yZGVuLCAlcyEiLFwKKyJPaG5lIGRpZXNlcyBMYWcgaGFldHRlIG1pY2ggJXMgbmljaHQgdW1nZWJyYWNodCEiLFwKKyJJbiBzcGFldGVzdGVucyBlaW5lciBTdHVuZGUga29tbWUgaWNoIHdpZWRlciwgJXMhIixcCisiTmEgd2FydGUgJXMsIGJlaW0gbmFlY2hzdGVuIE1hbCB0cmV0ZSBpY2ggRGlyICJcCisia3JhZWZ0aWcgaW4gZGVuIEdlZGFuLUJlcmVpY2ghIixcCisiU0NISUVCVU5HLCBkZXIgbGV0enRlIFNjaGxhZyB2b24gJXMgd2FyIG5pY2h0ICJcCisicmVnZWxnZXJlY2h0ISIsXAorIkxpZWJlciBlaW5lIEgyTy1WZXJnaWZ0dW5nLCBhbHMgdm9uICVzIGVybW9yZGV0ICJcCisienUgd2VyZGVuISIsXAorIkRpZSBFaHJlIHdlcmQgaWNoICVzIG5pY2h0IGFudHVuLCB1bmQgaGllciAiXAorImhlcnVtcG9zYXVuZW4sIHdlciBtaWNoIHVtZ2VuaWV0ZXQgaGF0ISIsXAorIklzIG1pciBkb2NoIGVnYWwgJXMsIGljaCBnbGF1YmUgYW4gIlwKKyJkaWUgV2llZGVyZ2VidXJ0ISIsXAorIkFiZXIgdm9yc2ljaHQsICVzIGlzY2gga3V1dWwgbWFlbiEiLFwKKyJPaywgJXMsIER1IHdpcnN0IHZvbiBtZWluZXIgRXJ3YXJ0ZWxpc3RlIGdlc3RyaWNoZW4hIixcCisiRGFzIG5hZWNoc3RlIE1hbCBzaWVodCBtYW4gdW5zZXJlIGJlaWRlbiBOYW1lbiBhdWYgW1RvZDpdLCAlcyEiLFwKKyJNYWdpZXIgenUgbWlyLCBoaWVyIGlzdCBlaW4gQnVnOiAlcyBpc3QgaW1tZXIgbm9jaCBuaWNodCB0b3QhIixcCisiTW9yZ2VuIGZydWVoIHVtIGhhbGIgc2VjaHMgaW4gZGVyIEFyZW5hLCAlcyEgSWNoIGhhYiBkaWUgV2FobCBkZXIgV2FmZmVuLiIsXAorIiVzIGlzdCBzY2hsaW1tZXIgYWxzIGRhcyBNZW5zYWVzc2VuLiBBYnNvbHV0IHRvZWRsaWNoLiIsXAorIk1pc3QsIG1laW5lIFZvcnNpY2h0IGhhdCB2ZXJzYWd0ISBVbmQgZGFzIGJlaSAlcyEiLFwKKyIlcywgZGllIEh5ZHJhIGlzdCBtaXIgbGllYmVyLi4uIixcCisiU28sIG1laW5lIElnbm9yaWVyZWxpc3RlIGlzdCBzY2hvbiB3aWVkZXIgdW0gZWluZW4gTmFtZW4gbGFlbmdlciwgJXMuIgorCisjZGVmaW5lIEtJTExfTUVTU0FHRVMyIFwKKyJGZWllcmFiZW5kISBEYW5rZSwgJXMhIixcCisiVG9sbCEgR0VOQVUgZGFzIGhhYiBpY2ggamV0enQgZ2VicmF1Y2h0ISBTdXBlciwgJXMhIDooIixcCisiU2Nob24gd2llZGVyIGVpbiBUYWcgdmVyc2F1dCB3ZWdlbiAlcyEiLFwKKyJJaHIgc2FndCwgSUNIIHNlaSBlaW4gTW9uc3Rlcj8gSWhyIGtlbm50ICVzIG5pY2h0ISEhIixcCisiU3BlcnJ0ICVzIG1hbCBpbidzIFBvbGFyZ2ViaWV0ISBHYWViZSBlaW4gZ3V0ZXMgVW50aWVyIGFiLi4uIixcCisiRnJlaWhlaXQgZnVlciBOaWNodC1TcGllbGVyISBWZXJuaWNodGV0ICVzISIsXAorIk1lcmxpbiwgbWFjaCAlcyB6dW0gTWFnaWVyISIsXAorIiVzIGlzdCBOSUNIVCB6dSBtZWluZXIgQmVlcmRpZ3VuZyBlaW5nZWxhZGVuISIsXAorIkljaCBoYWIga2VpbmUgQW5nc3Qgdm9yIERpciwgJXMhIixcCisiJXMgaXN0IGRvb2YgdW5kIHN0aW5rdCEiLFwKKyJNb2VnZXN0IER1IGltIExhZyB2ZXJyb3R0ZW4sICVzISIsXAorIiVzIHdpcmQgZ2xlaWNoIGRhcyBTcGllbCB2ZXJsYXNzZW4sIHVtIG1laW5lciBSYWNoZSB6dSBlbnRnZWhlbiEiLFwKKyJEZXIgVG9kZXN0YWcgdm9uICVzIHdpcmQgZnVlciBtaWNoIGVpbiBGZWllcnRhZyBzZWluISIsXAorIiVzIGlzdCBlaW4gTWV0emVsc2tyaXB0LCBpY2ggaGFiJ3MgZ2VuYXUgZ2VzZWhlbiEiLCBcCisiV2FlciBpY2ggVGFuamlhbiwgaGFldHRlc3QgRHUgZGFzIG5pY2h0IGdlc2NoYWZmdCwgJXMhIiwgXAorIkRhcyBuYWVjaHN0ZSBNYWwga29tbWUgaWNoIGFscyBLYWVtcGZlciB3aWVkZXIsICVzISIsIFwKKyJJY2ggbGFzcycgbWljaCBhdWZ3ZXJ0ZW4gdW5kIHdlcmRlIFphdWJlcmVyLCAlcyEiLCBcCisiR2lsZGVuYmFsYW5jZSEgJXMgaXN0IHZpZWwgenUgc3RhcmshIiwgXAorIkpldHp0IGlzdCBtaXIgZGFzIEtsZWluZ2VsZCB6dW0gVGFua2VuIGF1c2dlZ2FuZ2VuLCAlcy4uLiIsIFwKKyIlcyBoYXQgZWluIFphcC1Ub29sISIsIFwKKyIlcywgRHUgPHplbnNpZXJ0PiEiLCBcCisiJXMsIGRhcyBpc3QgZG9jaCBIdWxsZXBhbnouIChjKSBDYXR3ZWF6bGUiLCBcCisiQmFsZCBiaW4gaWNoIFN1cGVyU2VoZXIsICVzISIsIFwKKyJNaXQgRGlyICdwaWVsIGljaCBuaWNoJyBtZWhyLCAlcywgRHUgaGFzdCBpbiBtZWluIEZvZXJtc3NlbiBkZXBpbmtlbHQhIiwgXAorIlZlcmRhbW10LCAlcyBtdXNzIG1pciBkZW4gRmVlbnJpbmcgZ2VrbGF1dCBoYWJlbi4uLiIsIFwKKyJOaWUgaXN0IGVpbiBLbGVyaWtlciBpbiBkZXIgTmFlaGUsIHdlbm4gbWFuIGlobiBicmF1Y2h0LCAlcy4uLiIsIFwKKyJNZW5ubywgJXMsIHdvIHdhciBoaWVyIG5vY2ggbWFsIGRpZSBIZWlsc3RlbGxlPyIsIFwKKyJIb2ZmZW50bGljaCB3ZXJkZSBpY2ggbmFlY2hzdGVzIE1hbCBhbHMgS3VoIHdpZWRlcmdlYm9yZW4sICVzLi4uIiwgXAorIldlbm4gRHUgc29uc3Qgbm9jaCBQcm9ibGVtZSBoYXN0LCAlcywgZ2VoJyB6dSBNYXJ2aW4gdW5kIHJlZCcgIiBcCisibWl0IGlobSBkYXJ1ZWJlci4iLCBcCisiRHUsICVzLCBHZXdhbHQgaXN0IGtlaW5lIExvZXN1bmcsIGxhc3MgdW5zIGRhcnVlYmVyIGRpc2t1dGllcmVuLiIsIFwKKyJEYXMgbmFlY2hzdGUgTWFsIHplaWcnIGljaCBEaXIgbWVpbmUgTWF0ZXRlZXNhbW1sdW5nLCAlcy4iLCBcCisiJXMgZXVudCBkb211bSEiLCBcCisiJXMsIGlzdCBlcyBzbyBrYWx0IGhpZXIgb2RlciBiaW4gaWNoIGRhcz8iLCBcCisiSWNoIHdhciBzY2hvbiB3aWVkZXIgenVyIGZhbHNjaGVuIFplaXQgYW0gZmFsc2NoZW4gT3J0LCAlcy4uLiIsIFwKKyJEYW5rZSwgJXMuIEltIE5hbWVuIGRlcyBNb25kZXMgd2VyZGUgaWNoIERpY2ggYmVzdHJhZmVuISIsIFwKKyJEYXMgd2FyIG1hbCB3aWVkZXIgZWluIFNjaHVzcyBpbiBkZW4gT2ZlbiwgJXMuLi4iLCBcCisiS2FubnN0IER1IGRhcyBtaXQgRGVpbmVtIEdld2lzc2VuIHZlcmVpbmJhcmVuLCAlcz8iLCBcCisiVW5kIEthbmRyaSBzcHJhY2g6IE1laW4gaXN0IGRpZSBSYWNoZSwgJXMhIiwgXAorIiVzLCBEdSBoYWV0dGVzdCBtZWluZSBMZWljaGUgbmljaHQgYXVjaCBub2NoIHNjaGFlbmRlbiBtdWVzc2VuLi4uIiwgXAorIiVzLCBpY2gga2FubiBzbyBuaWNodCBhcmJlaXRlbiEiLCBcCisiJXMsIGljaCBnZWInIERpciBtYWwgMiBNdWVuemVuLCBkYW5uIGthbm5zdCBEdSBEZWluZSBTb3JnZW4gIiBcCisiamVtYW5kIGFuZGVyZW0gZXJ6YWVobGVuLi4uIiwgXAorIk1hbmNobWFsIHZlcnNwZWlzdCBEdSBkZW4gQmFlciwgJXMsIG1hbmNobWFsIHZlcnNwZWlzdCAiIFwKKyJkZXIgQmFlciBEaWNoLi4uIiwgXAorIkRhcyBuYWVjaHN0ZSBNYWwgYmV0cml0dHN0IF9EdV8gZGllIFdlbHQgZGVzIFNjaG1lcnplcywgJXMhIiwgXAorIldlbm4gaWNoIHdpZWRlcmtvbW1lLCAlcywgd2VyZGUgaWNoIGVyc3QgRGljaCB0b2V0ZW4sIGRhbm4gIiBcCisiRGVpbmVuIFBhcnRuZXIsIGRhbm4gRGVpbmUgQnJ1ZWRlciB1bmQgU2Nod2VzdGVybiB1bmQgamVkZW4gIiBcCisiZGVyIERpY2gga2VubnQhIiwgXAorIk9oIG5laW4sICVzISBTY2hvbiB3aWVkZXIgZGllc2UgZXdpZyBsYW5nZSBUb2Rlc3NlcXVlbnogbWl0IGRlciAiIFwKKyJEcmFjaGVuc2NodWxlISIsIFwKKyIlcywgd28gYmVrb21tZSBpY2ggamV0enQgZWluZW4gbmV1ZW4gS29lcnBlciBoZXI/IiwgXAorIkxhc3MgRGlyIG1laW5lIExlaWNoZSBzY2htZWNrZW4sICVzLiIsIFwKKyJIYWVoPyIsIFwKKyJKYSwgYWJlciB3aWVzbyBkYXMgZGVubj8gT2NoIG1lbm5vLCAlcyEiLCBcCisiU28gZWluIE1pc3QsICVzLCBpY2ggaGF0dGUgJ25lbiBEaXNjb25uZWN0Li4uIiwgXAorIip3aW5rZXdpbmtlKiwgJXMhIiwgXAorIkhldXRlIGlzdCBuaWNodCBhbGxlIFRhZ2UsIGljaCBrb21tJyB3aWVkZXIsIGtlaW5lIEZyYWdlLiIsIFwKKyJMYXNzIGRhcywgJXMhIiwgXAorIk5pZW1hbmQhIE5pZW1hbmQgbmVubnQgbWljaCBlaW5lIGZlaWdlIFNhdSwgJXMhIiwgXAorIkRhIGhhYicgaWNoIGpldHp0IHdvaGwgdmVybG9yZW4sICVzLi4uIiwgXAorIiVzLCBpY2gga2FubiBuaWNodCBtZXR6ZWxuLCBpY2gga2FubiBudXIgc3RlcmJlbi4uLiIsIFwKKyJIYXR0ZXN0IER1IHVlYmVyaGF1cHQgZWluZW4gVGVybWluLCAlcz8iLCBcCisiRHUgd2Fyc3QgZ2FyIG5pY2h0IGFuIGRlciBSZWloZSwgJXMhIiwgXAorIkFldHNjaCwgJXMsIGRlciBLaWxsIHphZWhsdCBuaWNodCEiLCBcCisiSmV0enQgbm9jaCBtYWwgbWl0IEdlZnVlaGwsICVzLiIsIFwKKyJUc2NodWVzcyBlcnN0bWFsLCAlcy4iLCBcCisiSWNoIHdlaXNzIG5pY2h0IG9iIER1IGVzIGdlbWVya3QgaGFzdCwgJXMsIGFiZXIgIiBcCisiaWNoIGJpbiBzY2hvbiB0b3QuLi4iLCBcCisiJXMsIGljaCBoYWV0dGUgbmljaHQgZ2VkYWNodCwgZGFzcyBpY2ggbm9jaCBtYWwgc3RlcmJlICIgXAorImJldm9yIFRhcmFtaXMgYW5nZXNjaGxvc3NlbiB3aXJkLi4uIiwgXAorIkljaCB3b2xsdGUgc293aWVzbyBncmFkZSBnZWhlbiwgJXMuIiwgXAorIlNoaXQgaGFwcGVucywgJXMuIiwgXAorIkRhenUgZmFlbGx0IG1pciBqZXR6dCBuaXggbWVociBlaW4sICVzLiIKKworI2RlZmluZSBLSUxMX01FU1NBR0VTMyBcCisiV2FzIGhlaXNzdCBkZW5uIFwiRGVpbiBUZWRkeSBrbnVkZGVsdCBEaWNoIGVpbiBsZXR6dGVzIE1hbFwiLCAlcz8iLCBcCisiSWNoIGJpbiBiZWVpbmRydWNrdCwgJXMuIiwgXAorIk9rLCBEZWluIEdlc2ljaHQgbWVya2UgaWNoIG1pciwgJXMhIiwgXAorIkthdW0gZGEsIGhhdXQgbWljaCAlcyBzY2hvbiB3aWVkZXIgdG90Li4uICpncnVtbWVsKiIsIFwKKyJJY2ggd2VyZGUgRGljaCB2ZXJmb2xnZW4sICVzISBJY2ggd2VyZGUgaW4gRGVpbmUgVHJhZXVtZSBlaW5kcmluZ2VuICIgXAorInVuZCBEaWNoIGluIGRlbiBXYWhuc2lubiB0cmVpYmVuISBEdSB3aXJzdCBkaWVzZW4gVGFnIG5vY2ggdmVyZmx1Y2hlbiEiLCBcCisiSWNoIGdlaCBqYSBzY2hvbiwgJXMuIiwgXAorIkF1ZiBkZW4gZXJzdGVuIEJsaWNrIHNpZWh0ICVzIGdhciBuaWNodCBzbyBnZWZhZWhybGljaCBhdXMuIiwgXAorIlZvbiAlcyBiZXNpZWd0IC0gd2llIHBlaW5saWNoLiIsIFwKKyJNaXN0LiBFaW5tYWwgbmljaHQgYXVmZ2VwYXNzdCwgc2Nob24gd2lyZCBtYW4gdm9uICVzIGVybW9yZGV0LiIsIFwKKyJEYXMgd2FyIGVpbiBHbHVlY2tzdHJlZmZlciwgJXMhIiwgXAorIkhhaCwgZGFzIGlzdCBkb2NoIG51ciBlaW5lIEZsZWlzY2h3dW5kZSEgR2lic3QgRHUgZXR3YSBzY2hvbiBhdWYsICVzPyIsIFwKKyIlcyBtYWNodCBnZXJhZGUgZWluZSBkZXN0cnVrdGl2ZSBQaGFzZSBkdXJjaC4iLCBcCisiWnVtIEdsdWVjayBpc3QgZGFzIGphIG51ciBlaW4gU3BpZWwsICVzLiBTb25zdCB3YWVyZSBpY2ggamV0enQgd2lya2xpY2ggIiBcCisiYm9lc2UuIiwgXAorIkJlZ3JhYmUgbWljaCB3ZW5pZ3N0ZW5zIGFuc3RhZW5kaWcsICVzLiIsIFwKKyJIbSwgZGllIEZsYXRyYXRlIGJyYXVjaCcgaWNoIGRhbm4gd29obCBkb2NoIG5pY2h0LCAlcy4iLCBcCisiTmEgd2FydGUsICVzISBadXIgU3RyYWZlIHdlcmRlIGljaCBnbGVpY2ggZGFzIE11ZCBjcmFzaGVuISIsIFwKKyJJY2ggc29sbHRlIG5pY2h0IG1laHIgc292aWVsIG11ZGRlbi4gRGFubiBtdWVzc3RlIGljaCBtaWNoIGF1Y2ggbmljaHQgbWVociAiIFwKKyJ1ZWJlciAlcyBhZXJnZXJuLiIsIFwKKyJBdWYgYW0gQm9kZW4gTGllZ2VuZGUgZWluenVzY2hsYWdlbiEgU2NoYWVtIERpY2gsICVzISIsIFwKKyJFaW5pZ2VuIHdpciB1bnMgYXVmIHVuZW50c2NoaWVkZW4sICVzPyIsIFwKKyJJY2ggc2FndGUgZG9jaCBcIkljaCBlcmdlYmUgbWljaCFcIiwgJXMuIiwgXAorIkFlaCwgJXMsIGtvZW5udGUgZGFzIHVudGVyIHVucyBibGVpYmVuPyBJY2ggaGFiZSBzY2hsaWVzc2xpY2ggZWluZW4gIiBcCisiUnVmIHp1IHZlcmxpZXJlbi4uLiIsIFwKKyJEdSBiaXN0IHZpZWxsZWljaHQgc3RhZXJrZXIsICVzLCBhYmVyIGRhZnVlciBiaW4gaWNoIHNjaG9lbmVyLiIsIFwKKyJEaWUgUmVjaG51bmcgZnVlciBkaWUgQmVoYW5kbHVuZyBtZWluZXIgTWluZGVyd2VydGlna2VpdHNrb21wbGV4ZSBnZWh0ICIgXAorImFuICVzLiIsIFwKKyJBYiB1bmQgenUgbXVzcyBtYW4gJXMgamEgZ2V3aW5uZW4gbGFzc2VuLCBzb25zdCBnaWJ0IGVzIHdpZWRlciBUcmFlbmVuLiIsIFwKKyJCaXMgZWJlbiB3YXIgbWlyICVzIG5vY2ggc3ltcGF0aGlzY2guIiwgXAorIkdlaHQncyBEaXIgamV0enQgYmVzc2VyLCAlcz8iLCBcCisiTWFjaHQga2FwdXR0LCB3YXMgbWljaCBrYXB1dHQgbWFjaHQhIFRvZXRldCAlcyEiLCBcCisiQmVpbSBuYWVjaHN0ZW4gTWFsIG1hY2gnIGljaCBlcyBEaXIgbmljaHQgbWVociBzbyBlaW5mYWNoLCAlcyEiLCBcCisiV2Vpc3N0IER1LCAlcywgaWNoIGhhYmUgbnVyIHZlcmxvcmVuLCB3ZWlsIER1Li4uIGFlaCwgd2VpbCBpY2guLi4gIiBcCisiYWVoLi4uIHdlaWwgRHUgZ2V3b25uZW4gaGFzdC4iLCBcCisiSm8sIGltbWVyIGZlc3RlIGRydWZmLCAlcy4gSXN0IGphIG51ciBlaW4gZHVtbWVyIE5QQy4gKmdydW1tZWwqIiwgXAorIkljaCBtdXNzIHNhZ2VuLCAlcyBrYW5uIGZlc3RlIHNjaGxhZ2VuLiIsIFwKKyJBbHNvICVzISBLb21tc3QgaGllciByZWluLCBoYXVzdCBtaWNoIHVtIHVuZCB0dXN0IGRhbm4gc28sIGFscyBzZWkgbmljaHRzICIgXAorImdld2VzZW4uLi4iLCBcCisiSW4gd2VsY2hlciBHaWxkZSBrb25udGUgbWFuIG5vY2htYWwgXCJiZWZyaWVkZVwiIGxlcm5lbiwgJXM/IiwgXAorIlRqYSwgJXMsIGF1cyBkaWVzZW0gS2FtcGYgYmlzdCBEdSB3b2hsIG51ciBhbHMgVm9ybGV0enRlciBoZXJ2b3JnZWdhbmdlbiIgXAorIi4uLiIsIFwKKyJWb3JzaWNodCwgJXMgZ3JlaWZ0IGltbWVyIHZvbiBoaW50ZW4gYW4hIiwgXAorIldhcyBtZWludCAlcyBtaXQgXCJTcGFycmluZ3NwYXJ0bmVyXCI/IiwgXAorIkljaCBoYWJlIG1pciBiZWkgRGlyIG51ciBkZXNoYWxiIGtlaW5lIE11ZWhlIGdlZ2ViZW4sICVzLCB3ZWlsIER1IGVoIG5pY2h0ICIgXAorInN0dXBzdC4iLCBcCisiSHVjaCwgaWNoIGJpbiBqYSBzY2hvbiB3aWVkZXIgYXVmIC1Nb2VyZGVyISIsIFwKKyJJY2ggc3B1Y2snIERpciBpbidzIEF1Z2UgdW5kIGJsZW5kZSBEaWNoLCAlcyEiLCBcCisiSHVjaCwgd28gc2VpZCBpaHIgYWxsZSBoaW4/IiwgXAorIldlciB3YXIgZGFzPyIsIFwKKyJNb2VnZXN0IER1IGluIGludGVyZXNzYW50ZW4gWmVpdGVuIGxlYmVuLCAlcy4iLCBcCisiSWNoIHNlaGUgd2FzLCB3YXMgRHUgbmljaHQgc2llaHN0LCAlcywgdW5kIGVzIGlzdC4uLiBzY2h3YXJ6LiIsIFwKKyJIZXkgTWFlZGVscyEgUmF0ZXQsIHdlbiBpY2ggZ2VyYWRlIGdldHJvZmZlbiBoYWJlISIsIFwKKyIlcz8iLCBcCisiTm9jaCBlaW5tYWwgc293YXMsICVzLCB1bmQgaWNoIGxhc3NlIERlaW5lIEdpbGRlIGFid2VydGVuLiBJY2gga2FubiBkYXMhIiwgXAorIldhcyBiZWRldXRldCAnSmVtYW5kIGJlc2Nod29lcnQgRGVpbiBCaWxkIGhlcmF1Zi4nPyBXYXJzdCBEdSBkYXMsICVzPyIKKworcHJpdmF0ZSBzdHJpbmcgKm1vZXJkZXJfbXNncyA9ICh7S0lMTF9NRVNTQUdFUywgS0lMTF9NRVNTQUdFUzIsIEtJTExfTUVTU0FHRVMzLAorIlN0ZXJiZW4gaXN0IHNjaG9lbiwgU3RlcmJlbiBpc3QgdG9sbCAtIEFjaCB3YWVyIGljaCB3aWUgZWluIEthZW1wZmVyIHZvbGwhIiwKKyJMYXVzY2hpZ2UgTmFjaHQgLSBpY2ggZ2VoIG1pciBkaWUgU3Rlcm5lIGFuc2NoYXVlbi4gQmlzIHNwYWV0ZXIhIiwKKyJFY2h0ICVzLCBkYXMgd2FyIDA4MTUsIGtlaW5lIEtyZWF0aXZpdGFldCBiZWltIFRvZXRlbiEiLAorIiVzLCBEdSBrYW5uc3QgamEgZ2FyIG5pLi4uIFZlcmRhbW10ISIsCisiS2FlbXBmZXIsIFphdWJlcmVyLCBUYW5qaWFuLCBhbGxlcyBMdXNjaGVuISBJY2ggd2VyZGUgQWJlbnRldXJlciwgZGEgaXN0ICIKKyAgICAid2VuaWdzdGVucyBUaHJpbGwhIiwgCisiVG9ldGVuLCBUb2V0ZW4sIFRvZXRlbi4gSXN0IGRhcyBhbGxlcywgd2FzIER1IGthbm5zdCwgJXM/IiwKKyJBY2ggZ2VoIGRvY2ggQmx1ZW1jaGVuIHBmbHVlY2tlbiAlcyEiLCAKKyJNZWluIFRvZCB3YXIgS0VJTiBGUCAlcy4uLiBIQSEiLAorIkxhcnMgZ2lidCBtaXIgbmVuIFdoaXNreSwgd2VubiBpY2gga29tbWUuIFVuZCBEaXI/IiwKKyJHZWggbGVybmVuLCBEZXBwISIsCisiQXVmIGRlciBuYWVjaHN0ZW4gTXVkLVBhcnR5IGhhdXQgRGljaCBtZWluIE1hZ2llciB6dXJ1ZWNrISIsCisiTGFzcyBndXQgc2VpbiwgdGF0IGVoIG5pY2h0IHdlaCEiLCAKKyJJY2ggbGFzcyBEaWNoIHZvbiBab29rIGFiaGFlbmdlbiwgJXMhIiwKKyJLb2VubmVuIHdpciBuYWVjaHN0ZXMgTWFsIG5pY2h0IGxpZWJlciBlaW5lbiB0cmlua2VuIGdlaGVuLCAlcz8iLAorIlZlcmRhbW10LCBtZWluZSBuZXVlIEdpbGRlIGlzdCBqYSBub2NoIGdhciBuaWNodCBhbmdlc2NobG9zc2VuISIsCisiWW9ob2hvIHVuZCBuZSBCdWRkZWwgdm9sbCBSdW0hIiwKKyJCZWltIEthcnRlbnNwaWVsIGhhZXR0ZXN0IER1IGtlaW5lIENoYW5jZSBnZWhhYnQgJXMhIiwKKyIlcywgRHUgaGFzdCBlY2h0IGtlaW5lIEFobnVuZyB2b24gc3RpbHZvbGxlbSBNZXR6ZWxuLi4uIiwKKyJXYXMgbXVzcyBpY2ggbm9jaCB0dW4gZnVlciBEZWluZW4gQXVmc3RpZWcsICVzPyAqc2V1ZnoqIiwKKyJFSy1Qb3NlciEiLAorIkxlaXN0dW5nIGlzdCB3YXMgYW5kZXJlcywgJXMhIiwKKyJMYXNzIG1pY2ggbGVlZWVlZWIuLi4gQXJycnJnZ2dnaCEiLAorIkhhc3QgRHUgc29uc3Qgbml4IGluIGRlciBEcmFjaGVuc2NodWxlIGdlbGVybnQsICVzPyIsCisiVW5kIHdlciBrdWVtbWVydCBzaWNoIGpldHp0IHVtIG1laW5lIEhhdXN0aWVyZSwgJXM/IiwKKyJJY2ggbXVzc3RlIHN0ZXJiZW4sIER1IHdpbGxzdCBtaWNoIG51ciBiZWVyYmVuLiBJY2ggZ2VoZSAiCisgICAgIm1pdCBTdGlsLCBEdSBmaW5kZXN0IG5pY2h0IHZpZWwuIiwKKyJJY2ggaGFiZSBudW4gbWVociBUb2RlIGFscyBEdSwgJXMuIFRvcHAgbWljaCwgd2VubiBEdSBrYW5uc3QhIiwKKyJPaywgZGFubiBnZWggaWNoIGhhbHQgV09XIHNwaWVsZW4uIiwKKyJUb2xsLCBmcmV1dCBzaWNoIGRlciBOYWVjaHN0ZS4gV2llZGVyIG5lIFRvZGVzZm9sZ2UsICVzLiIsCisiRHUgZ3Vja3Rlc3Qgc28gdHJhdXJpZywgJXMsIGljaCBtYWNodGUgRGlyIG1laW5lbiBUb2QgenVtIEdlc2NoZW5rLiAiCisgICAgIlNvbGxzdCBqYSBhdWNoIG1hbCAnbiBFcmZvbGdzZXJsZWJuaXMgaGFiZW4hIiwKKyJOdW4gcmVpY2hlIGljaCBkZW4gbGV0enRlbiBCZWNoZXIsIHRyaW5rZSBkZW4gV2VpbiwgZXJrZW5uZSBEZWluIFNlaW4uIiwKKyIlcyBoYXQgbmljaHQgZWlubWFsIGdldHJvZmZlbi4gSWNoIGhhYmUgbWljaCB3b3J0d29lcnRsaWNoIHRvdGdlbGFjaHQuIiwKKyJMYXNzIG1pY2ggbmFjaGRlbmtlbiwgJXMuIEljaCBzdGFyYiBmdWVyIG5lbiBFSz8iLAorIkljaCBrYW5uIG5pY2h0IGdsYXViZW4sIGRhc3MgZGFzIGdlcmFkZSBwYXNzaWVydCBpc3QhIiwKKyJEdSBTdWVuZGVyLiBEdSBzb2xsc3QgX25pY2h0XyB0b2V0ZW4hIiwKKyIlcywgbWVpbiBUZXN0YW1lbnQgc3RlY2t0IGltIHJlY2h0ZW4gU2NodWghIiwKKyJTdGVyYmVuIHVuZCBzdGVyYmVuIGxhc3NlbiwgbWVpbiBGcmV1bmQuIFdpciBzZWhlbiB1bnMgd2llZGVyISIsCisiVW5kIGljaCBzYWcgbm9jaCwgJXMuLi4gRGFzIGlzdCBLRUlORSBTY2h3ZXJ0c2NoZWlkZS4uLiBBYmVyIER1IG11c3N0ICIKKyAgImphIGFsbGVzIHNlbGJzdCBhdXNwcm9iaWVyZW4uIiwKKyJTb2xsIGRhcyBqZXR6dCBhbGxlcyBnZXdlc2VuIHNlaW4sICVzPyIsCisiSW4gbWVpbmVtIENvZGUgaXN0IGVpbiBGZWhsZXIgdW5kIGdsZWljaCBnaWJ0J3MgJ25lbiBDcmFzaC4iLAorIkFjaCwgYXVjaCBlZ2FsLCAlcy4gSXN0IGVoIGdsZWljaCBTY2hpY2h0d2VjaHNlbC4iLAorIkpvZnZlcmRhbW10Li4uIHdhcnN0IER1IGd1dCwgJXMhIiwKKyJEdWVsbGUgdm9uIEtpbGxlcm4gZW5kZW4gbWVpc3QgZnVlciBlaW5lbiB0b2VkbGljaCB1bmQgZGFzIHdpcnN0ICIKKyAgIkR1IHMuLi4gQXJnaCEiLAorIkJpc3QgRHUgc2ljaGVyLCBkYXNzIER1IGRlbiBFSyBiZWtvbW1lbiBoYXN0LCAlcz8iLAorIkRhbmtlICVzISBXZWlzc3QgRHUsIGljaCBoYXR0ZSBtaXQgWm9vayBnZXdldHRldCwgd2VyIG1pY2ggIgorICAidG9ldGV0LiBVbmQgaWNoIGhhYmUgZWluZSBXaWVkZXJnZWJ1cnQgZ2V3b25uZW4hIiwKKyJOdW4gYmluIGljaCBzaWNoZXIgdm9yIERpciwgJXMhIiwKKyJJY2ggbWFjaGUgamV0enQgVXJsYXViIHVuZCBoYWJlIFpvb2sgZ2ViZXRlbiwgbWVpbmVuIFJlc2V0ICIKKyAgInVtIGVpbmVuIE1vbmF0IHp1IHZlcnNjaGllYmVuLiBHbHVlY2tsaWNoLCAlcz8iLAorfSk7CisKKworaW50IF9xdWVyeV9rbWEoKSB7IHJldHVybiBzaXplb2YobW9lcmRlcl9tc2dzKTsgfQorCisKK29iamVjdCBfY2hhbm5lbCggb2JqZWN0IG9iICkKK3sKKyAgaW50IG1fRk1NLCBtX0hQLCBtX1dDLCBtX0FDLCBzX0hQLCBzX1dDLCBzX0FDOworICBzdHJpbmcgbXNnOworICBvYmplY3QgcnVlY2s7CisKKyAgaWYgKG1lbWJlcihpbmhlcml0X2xpc3QocHJldmlvdXNfb2JqZWN0KCkpLENPUlBTRV9PQkopPi0xKQorICAgICAgeworICAgICAgICAgIHN0cmluZyBraWxsZXI7CisgICAgICAgICAgaW50IGksIHgsIHksIHosIG5yOworICAgICAgICAgIGNsb3N1cmUgbV9xLCBzX3E7CisgICAgCisgICAgICAgICAgd2hpbGUoIHByZXZpb3VzX29iamVjdChpKSAmJgorICAgICAgICAgICAgICAgICAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShwcmV2aW91c19vYmplY3QoaSkpICkKKyAgICAgICAgICAgICAgaSsrOworICAgICAgICAgIAorICAgICAgICAgIGlmKCAhcHJldmlvdXNfb2JqZWN0KGkpIHx8IElTX0xFQVJORVIocHJldmlvdXNfb2JqZWN0KGkpKSApCisgICAgICAgICAgICAgIHJldHVybiBydWVjazsKKworICAgICAgICAgIGtpbGxlciA9IChzdHJpbmcpIHByZXZpb3VzX29iamVjdChpKS0+bmFtZSgpOworICAgICAgICAgIAorICAgICAgICAgIGlmICggbG93ZXJfY2FzZShraWxsZXIpICE9IGdldHVpZChwcmV2aW91c19vYmplY3QoaSkpICkKKyAgICAgICAgICAgICAga2lsbGVyID0gY2FwaXRhbGl6ZShnZXR1aWQocHJldmlvdXNfb2JqZWN0KGkpKSk7CisgICAgICAgICAgCisgICAgICAgICAgbV9xID0gc3ltYm9sX2Z1bmN0aW9uKCAiUXVlcnlQcm9wIiwgb2IgKTsgLy8gTW9uc3RlcgorICAgICAgICAgIHNfcSA9IHN5bWJvbF9mdW5jdGlvbiggIlF1ZXJ5UHJvcCIsIHByZXZpb3VzX29iamVjdChpKSApOyAvLyBTcGllbGVyCisgICAgICAgICAgCisgICAgICAgICAgaWYgKCAobV9GTU0gPSAoaW50KSBmdW5jYWxsKCBtX3EsIFBfRk9SQ0VfTVVSREVSX01TRyApKSA+PSAwICkKKyAgICAgICAgICAgICAgaWYgKCAob2JqZWN0X25hbWUob2IpID09ICIvb2JqL3NodXQiKSB8fAorICAgICAgICAgICAgICAgICAgIChtX0ZNTSA+IDApIHx8CisgICAgICAgICAgICAgICAgICAgKG5yID0gKHJhbmRvbSgxMDApID49IDk5KSA/IDEgOiAwICkgfHwgCisgICAgICAgICAgICAgICAgICAgKG5yID0gKCh4ID0gKG1fSFAgPSAoaW50KSBmdW5jYWxsKCBtX3EsIFBfTUFYX0hQICkpICogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1fV0MgPSAoaW50KSBmdW5jYWxsKCBtX3EsIFBfVE9UQUxfV0MgKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtX0FDID0gKGludCkgZnVuY2FsbCggbV9xLCBQX1RPVEFMX0FDICkpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPiAyMDAwMDApID8gMiA6IDApIHx8CisgICAgICAgICAgICAgICAgICAgKG5yID0gKCgoeSA9IG1fSFAgKiAobV9XQyArIG1fQUMpKSA+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAoeiA9IDUgKiAoc19IUCA9IChpbnQpIGZ1bmNhbGwoIHNfcSwgUF9NQVhfSFAgKSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoc19XQyA9IChpbnQpIGZ1bmNhbGwoIHNfcSwgUF9UT1RBTF9XQyApKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzX0FDID0gKGludCkgZnVuY2FsbCggc19xLCBQX1RPVEFMX0FDICkpKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgID8gMyA6IDApKSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBTZXRQcm9wKCBQX05BTUUsICJHZWlzdCAiKyhzdHJpbmcpIG9iLT5uYW1lKFdFU1NFTiwgMCkgKTsKKworICAgICAgICAgICAgICAgICAgICAgIGlmKCAhKG1zZyA9IChzdHJpbmcpIG9iLT5RdWVyeVByb3AoUF9NVVJERVJfTVNHKSkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBtb2VyZGVyX21zZ3NbcmFuZG9tKHNpemVvZihtb2VyZGVyX21zZ3MpKV07IAorCisJCSAgICAgIGlmICggc3RyaW5ncChtc2cpICkKKwkJCSAgbXNnID0gc3ByaW50ZiggbXNnLCBraWxsZXIgfHwgIk1vZXJkZXIiICk7CisKKyAgICAgICAgICAgICAgICAgICAgICBDSE1BU1RFUi0+c2VuZCggIk1vZXJkZXIiLCB0aGlzX29iamVjdCgpLCBmdW5jYWxsKG1zZykgKTsKKworICAgICAgICAgICAgICAgICAgICAgIHJ1ZWNrID0gcHJldmlvdXNfb2JqZWN0KGkpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIGxvZ19maWxlKCAibW9lcmRlci5sb2ciLAorICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCAiTU9OKCVPKSBDT05EKCVkKSBOUEMoJWQpLCBESUZGKCVkLCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2IsIG5yLCB4LCB5LCB6KSApOworICAgICAgfQorCisgIHJldHVybiBydWVjazsKK30KKwordm9pZCB0cmFuc2Zvcm1faW50b19waWxlKCkgeworCWlmKCBlbnZpcm9ubWVudCgpLT5RdWVyeVByb3AoUF9QUkVWRU5UX1BJTEUpICkgcmV0dXJuOworCW9iamVjdCogaW52ID0gYWxsX2ludmVudG9yeSgpOworCWlmKCBzaXplb2YoaW52KTwyICkgcmV0dXJuOworCW9iamVjdCBwID0gY2xvbmVfb2JqZWN0KFBJTEVfT0JKKTsKKwlmaWx0ZXJfb2JqZWN0cyggaW52LCAibW92ZSIsIHAsIE1fU0lMRU5UIHwgTV9OT0NIRUNLICk7CisJcC0+bW92ZSggZW52aXJvbm1lbnQoKSwgTV9TSUxFTlQgfCBNX05PQ0hFQ0sgKTsKK30KZGlmZiAtLWdpdCBhL3N0ZC9kZWZfd29ya3Jvb20uYyBiL3N0ZC9kZWZfd29ya3Jvb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjAzNGZhCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL2RlZl93b3Jrcm9vbS5jCkBAIC0wLDAgKzEsNDYgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBkZWZfd29ya3Jvb20uYyAtLSBzdGFuZGFyZCB3b3Jrcm9vbSBmb3IgbmV3IHdpemFyZHMKKy8vCisvLyAkSWQ6IGRlZl93b3Jrcm9vbS5jIDc0MjMgMjAxMC0wMi0wNyAyMjo1NjozOFogWmVzc3RyYSAkCisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHNhdmVfdHlwZXMscnR0X2NoZWNrcworI3ByYWdtYSBwZWRhbnRpYywgcmFuZ2VfY2hlY2sKKworaW5oZXJpdCAic3RkL3Jvb20iOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCit2b2lkIGNyZWF0ZSgpCit7CisgIHN0cmluZyBXSVpOQU1FOworCisgIDo6Y3JlYXRlKCk7CisgIFdJWk5BTUUgPSBjYXBpdGFsaXplKGdldHVpZCh0aGlzX29iamVjdCgpKSk7CisKKyAgU2V0UHJvcCggUF9MSUdIVCwgMSApOworICBTZXRQcm9wKCBQX0lOVF9TSE9SVCwgIkRlciBBcmJlaXRzcmF1bSB2b24gIitXSVpOQU1FICk7CisgIFNldFByb3AoIFBfSU5UX0xPTkcsCisgICAiRGllc2VzIGlzdCBkZXIgQXJiZWl0c3JhdW0gdm9uICIrV0laTkFNRSsiLiBFcyBsaWVnZW4gdm9sbGdlc2NocmllYmVuZVxuIgorICArIlpldHRlbCBhdWYgZGVtIEJvZGVuLCBkaWUgV2FlbmRlIHNpbmQgbWl0IEtyZWlkZXplaWNoZW4genVnZWtyaXR6ZWx0LlxuIgorICArIk1hbiBtZXJrdCwgZGFzcyBkaWVzZXIgUmF1bSBkYWZ1ZXIgZGEgaXN0LCBkYXNzICIrV0laTkFNRSsiIGZ1ZXIgc2ljaFxuIgorICArInVuZ2VzdG9lcnQgYXJiZWl0ZW4ga2Fubi4gRWluIG1hZ2lzY2hlcyBQb3J0YWwgZnVlaHJ0IGluIGRpZSBXZWx0XG4iCisgICsiZGVyIFN0ZXJibGljaGVuLlxuIgorCSAgKTsKKyAgU2V0UHJvcChQX0lORE9PUlMsMSk7CisgIEFkZERldGFpbCggKHsgInBvcnRhbCIsICJwb3J0YWxlIiB9KSwgCisJICAgICJEYXMgUG9ydGFsIGZ1ZWhydCBpbiBkaWUgQWJlbnRldXJlci1naWxkZS5cbiIgKTsKKyAgQWRkRGV0YWlsKCAoeyAicmF1bSIsICJhcmJlaXRzcmF1bSIgfSksCisJICAgICAiRHUgYmVmaW5kZXN0IERpY2ggbWl0dGVuZHJpbi5cbiIgKTsKKyAgQWRkRGV0YWlsKCAiemV0dGVsIiwKKwkgICAgICJEaWUgWmV0dGVsIHNpbmQgbWl0IHVubGVzZXJsaWNoZW4gWmVpY2hlbiB2b2xsZ2VzY2hyaWViZW4uXG4iICk7CisgIEFkZERldGFpbCggKHsgImJvZGVuIiwgImZ1c3Nib2RlbiIgfSksCisJICAgICAiRGVyIEZ1c3Nib2RlbiBpc3QgYmVkZWNrdCBtaXQgdm9sbGdlc2NocmllYmVuZW4gWmV0dGVsbi5cbiIgKTsKKyAgQWRkRGV0YWlsKCAoeyAid2FuZCIsICJ3YWVuZGUiIH0pLAorCSAgICAgIkFuIGRlbiBXYWVuZGVuIGJlZmluZGVuIHNpY2ggS3JlaWRlemVpY2hlbi5cbiIgKTsKKyAgQWRkRGV0YWlsKCAoeyAia3JlaWRlIiwgImtyZWlkZXplaWNoZW4iLCAiemVpY2hlbiIgfSksCisJICAgICJEaWUgWmVpY2hlbiBlcmdlYmVuIG51ciBmdWVyICIgKyBXSVpOQU1FICsgIiBlaW5lbiBTaW5uLlxuIiApOworICBBZGREZXRhaWwoICJwb3J0YWwiLAorCSAgICAgIkRhcyBQb3J0YWwgZnVlaHJ0IGluIGRpZSBXZWx0IGRlciBTdGVyYmxpY2hlbi5cbiIgKTsKKyAgQWRkRXhpdCgiZ2lsZGUiLCJpbiBkaWUgR2lsZGUjL2dpbGRlbi9hYmVudGV1cmVyIik7Cit9CmRpZmYgLS1naXQgYS9zdGQvZm9vZC5jIGIvc3RkL2Zvb2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yjc1OTIxCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL2Zvb2QuYwpAQCAtMCwwICsxLDczMiBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIC9zdGQvZm9vZC5jICAtIFN0YW5kYXJkb2JqZWt0IGZ1ZXIgTGViZW5zbWl0dGVsCisvLworLy8gJElkOiBmb29kLmMgODI0OCAyMDEyLTExLTIzIDIxOjI4OjA0WiBaZXNzdHJhICQKKyNwcmFnbWEgc3RyaWN0X3R5cGVzLHNhdmVfdHlwZXMscnR0X2NoZWNrcworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYyxyYW5nZV9jaGVjaworCitpbmhlcml0ICIvc3RkL3RoaW5nIjsKKworI2luY2x1ZGUgPGZvb2QuaD4KKyNpbmNsdWRlIDxsaXZpbmcvbGlmZS5oPgorI2luY2x1ZGUgPGJyZWFrX3N0cmluZy5oPgorCisvLyBTdGFuZGFyZC1JRHMgdW5kIC1BZGpla3RpdmUgbXVlc3NlbiBnZXNpY2hlcnQgd2VyZGVuCisjZGVmaW5lICBJRF9CQUNLVVAgICAgICAgInN0ZF9mb29kX2lkX2JhY2t1cCIKKyNkZWZpbmUgIEFESl9CQUNLVVAgICAgICAic3RkX2Zvb2RfYWRqX2JhY2t1cCIKKworLy8gWmVpdHB1bmt0LCBhbiBkZW0gZGllIFNwZWlzZSB2ZXJkb3JiZW4gaXN0Citwcml2YXRlIG5vc2F2ZSBpbnQgdGltZV9nb25lX2JhZDsKKworLy8gWmVpdHB1bmt0LCBhbiBkZW0gZGllIFNwZWlzZSB2ZXJkZXJiZW4gZGFyZgorLy8gd2lyZCBpbW1lciBlcnN0IGdlc2V0enQsIHdlbm4gZWluIFNwaWVsZXIgaGllcm1pdCBpbiBCZXJ1ZWhydW5nIGtvbW10Citwcml2YXRlIG5vc2F2ZSBpbnQgdGltZV90b2dvX2JhZDsKKworLy8gWmVpdHB1bmt0LCBhbiBkZW0gZGllIFNwZWlzZSB6ZXJzdG9lcnQgd2VyZGVuIGRhcmYKKy8vIHdpcmQgaW1tZXIgZXJzdCBnZXNldHp0LCB3ZW5uIGVpbiBTcGllbGVyIGhpZXJtaXQgaW4gQmVydWVocnVuZyBrb21tdAorcHJpdmF0ZSBub3NhdmUgaW50IHRpbWVfdG9fcmVtb3ZlOworCisvLyBaZWl0cHVua3QsIGFiIGRlbSBkaWUgU3BlaXNlIG1pdCBlaW5lbSBTcGllbGVyIGluIEJlcnVlaHJ1bmcga2FtCisvLyBiZWkgZXdpZyBoYWx0YmFyZW4gU3BlaXNlbiBpc3Qgc2llIGltbWVyIDA7Citwcml2YXRlIG5vc2F2ZSBpbnQgc3RhcnRfbGlmZSA9IDA7CisKKy8vIERhdWVyIGRlcyBlcnN0ZW4gUmVzZXRzCitwcml2YXRlIG5vc2F2ZSBpbnQgZmlyc3RfcmVzZXRfbGVuZ3RoID0gMDsKKworLy8gV2VydGV0IFByb3BlcnRpZXMgYXVzIChFcnNldHp1bmdlbiB3ZXJkZW4gZHVyY2hnZWZ1ZWhydCkKK3Byb3RlY3RlZCBtaXhlZCBldmFsX3Byb3BlcnR5KHN0cmluZyB2YWwsb2JqZWN0IGNvbnN1bWVyKSB7CisgIG1peGVkIHdoYXQgPSBRdWVyeVByb3AodmFsKTsKKyAgaWYgKHN0cmluZ3Aod2hhdCkpIHsKKyAgICB3aGF0PWNhcGl0YWxpemUocmVwbGFjZV9wZXJzb25hbCh3aGF0LCh7dGhpc19vYmplY3QoKSxjb25zdW1lcn0pLDEpKTsKKyAgfQorICByZXR1cm4gYnJlYWtfc3RyaW5nKHdoYXQsNzgsIiIsQlNfTEVBVkVfTVlfTEZTKTsKK30KKworLy8gd2lyZCBudXIgdmVyd2VuZGV0LCB3ZW5uIGRlciBnZXNldHp0ZSBSZXNldCBlaW4gVGltZXJlbmRlIGRhcnN0ZWxsdCwKKy8vIHVtIHp1IGdhcmFudGllcmVuLCBkYXNzIGRlciBuaWNodCBhYmdlc3RlbGx0IHdpcmQuCisvLyBadWdlZ2ViZW5lbmVybWFzc2VuIGtlaW5lIHNjaG9lbmVyIEhhY2sgOi0vCitwcml2YXRlIHZvaWQgbXlfc2V0X25leHRfcmVzZXQoaW50IHplaXQpIHsKKyAgc2V0X25leHRfcmVzZXQoemVpdCk7CisgIC8vIERhbWl0IGRlciBSZXNldCBhdWNoIHdpcmtsaWNoIGF1c2dlZnVlaHJ0IHdpcmQgLi4uCisgIGNhbGxfb3V0KCMnaWQsMSk7Cit9CisKKy8vIEF1c2dhYmUgdm9uIE1lbGR1bmdlbiBhbiBCZXNpdHplciBvZGVyIFJhdW0KK3Byb3RlY3RlZCB2b2lkIG1lc3NhZ2Uoc3RyaW5nIHByb3ApIHsKKyAgb2JqZWN0IGVudiA9IGVudmlyb25tZW50KHRoaXNfb2JqZWN0KCkpOworICBpZiAob2JqZWN0cChlbnYpKSB7CisgICAgaWYgKGludGVyYWN0aXZlKGVudikpIHsKKyAgICAgIHRlbGxfb2JqZWN0KGVudiwKKyAgICAgICAgYnJlYWtfc3RyaW5nKGV2YWxfcHJvcGVydHkocHJvcCxlbnYpLDc4LCIiLEJTX0xFQVZFX01ZX0xGUykpOworICAgIH0KKyAgICBlbHNlIGlmKCFsaXZpbmcoZW52KSkgeworICAgICAgdGVsbF9yb29tKGVudiwKKyAgICAgICAgYnJlYWtfc3RyaW5nKGV2YWxfcHJvcGVydHkocHJvcCwwKSw3OCwiIixCU19MRUFWRV9NWV9MRlMpKTsKKyAgICB9CisgIH0KK30KKworLy8gRmxhZywgb2IgZGllIFNwZWlzZSB2ZXJkb3JiZW4gaXN0CitwdWJsaWMgaW50IGlzX2JhZCgpIHsKKyAgcmV0dXJuIHRpbWVfZ29uZV9iYWQgPiAwOworfQorCisvLyBBbnphaGwgZGVyIFNla3VuZGVuLCBkaWUgZGFzIExlYmVuc21pdHRlbCBiZXJlaXRzIGhpbnRlciBzaWNoIGhhdCwKKy8vIHNlaXQgZXMgbWl0IGVpbmVtIFNwaWVsZXIgaW4gQmVydWVocnVuZyBrYW0KK3B1YmxpYyBpbnQgZ2V0X2N1cnJlbnRfbGlmZXRpbWUoKSB7CisgIGlmICghc3RhcnRfbGlmZSkgcmV0dXJuIDA7CisgIHJldHVybiB0aW1lKCkgLSBzdGFydF9saWZlOworfQorCisvLyBCZXJlY2huZXQgZGVuIFdlcnQgZGVyIFNwZWlzZSBrb3JyZWt0CitpbnQgX3F1ZXJ5X3ZhbHVlKCkgeworICBpbnQgcmVzdWx0ID0gMDsKKyAgaWYgKCFpc19iYWQoKSkgeworICAgIHJlc3VsdCArPSB0b19pbnQoUXVlcnlQcm9wKFBfUE9SVElPTlMpKlF1ZXJ5KFBfVkFMVUUsRl9WQUxVRSkpOworICB9CisgIGlmIChtYXBwaW5ncChRdWVyeVByb3AoUF9FTVBUWV9QUk9QUykpKSB7CisgICAgcmVzdWx0ICs9IFF1ZXJ5UHJvcChQX0VNUFRZX1BST1BTKVtQX1ZBTFVFXTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvLyBCZXJlY2huZXQgZGVuIFdlcnQgZGVyIFNwZWlzZSBrb3JyZWt0CitpbnQgX3F1ZXJ5X3dlaWdodCgpIHsKKyAgaW50IHJlc3VsdCA9IHRvX2ludChRdWVyeVByb3AoUF9QT1JUSU9OUykqUXVlcnkoUF9XRUlHSFQsRl9WQUxVRSkpOworICBpZiAobWFwcGluZ3AoUXVlcnlQcm9wKFBfRU1QVFlfUFJPUFMpKSkgeworICAgIHJlc3VsdCArPSBRdWVyeVByb3AoUF9FTVBUWV9QUk9QUylbUF9XRUlHSFRdOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIERhdWVyIGRlcyBlcnN0ZW4gUmVzZXRzIHdpcmQgd2llZGVyIGhpbnp1Z2VyZWNobmV0CisvLyBkYW1pdCB3aXJkIGJlaSBOaWNodHNldHplbiBkZXIgUHJvcCBkZXIgU3RhbmRhcmQgZ2VsaWVmZXJ0CitpbnQgX3F1ZXJ5X3N0ZF9mb29kX2xpZmV0aW1lKCkgeworICByZXR1cm4gUXVlcnkoUF9MSUZFVElNRSxGX1ZBTFVFKSsoZmlyc3RfcmVzZXRfbGVuZ3RoKTsKK30KKworLy8gU2V0dGVyIGZ1ZXIgZGllIExpZmV0aW1lLCBkYW1pdCBkaWUgUmVzZXR0aW1lIGltbWVyIG1pdGtvcnJpZ2llcnQgd2lyZAorLy8gdW5kIERhdWVyIGRlcyBlcnN0ZW4gUmVzZXRzIGFiZ2V6b2dlbiB3ZXJkZW4sIGRhIGRpZSBhbHMgU3RhbmRhcmQgaW1tZXIKKy8vIGRhenVrb21tZW4KK3Byb3RlY3RlZCB2b2lkIHNldF9zdGRfZm9vZF9saWZldGltZShpbnQgdmFsKSB7CisgIGlmICh2YWwgPiAwKSB7CisgICAgaWYgKCF0aW1lX3RvZ29fYmFkICYmICFpc19iYWQoKSkgeworICAgICAgU2V0KFBfTElGRVRJTUUsdmFsLShmaXJzdF9yZXNldF9sZW5ndGgpLEZfVkFMVUUpOworICAgICAgLy8gQW56YWhsIGRlciBSZXNldHMgcmljaHRldCBzaWNoIG5hY2ggZGVtIE1pdHRlbHdlcnQKKyAgICAgIFNldChQX1JFU0VUX0xJRkVUSU1FLHRvX2ludCgodmFsLShmaXJzdF9yZXNldF9sZW5ndGgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLyhfX1JFU0VUX1RJTUVfXyowLjc1KSkrMSxGX1ZBTFVFKTsKKyAgICAgIHNldF9uZXh0X3Jlc2V0KHZhbCk7CisgICAgfQorICB9CisgIGVsc2UgeworICAgIHdyaXRlKCJEYSBpc3Qgd2FzIHNjaGllZiBnZWxhdWZlbiEgU3ByaWNoIG1hbCBtaXQgZWluZW0gTWFnaWVyLlxuIik7CisgICAgcmFpc2VfZXJyb3IoInNldHRpbmcgUF9MSUZFVElNRSB0byBpbnZhbGlkIGludCB2YWx1ZTogIisKKyAgICAgIHRvX3N0cmluZyh2YWwpKyJcbiIpOworICB9Cit9CisKKy8vIEFuemFobCBkZXIgUmVzZXRzIGFscyBMZWJlbnN6ZWl0Cit2b2lkIF9zZXRfc3RkX2Zvb2RfbGlmZXRpbWVfcmVzZXQoaW50IHZhbHVlKSB7CisgIGlmICh2YWx1ZSA8IDEpIHZhbHVlID0gMTsKKworICBTZXQoUF9SRVNFVF9MSUZFVElNRSx2YWx1ZSxGX1ZBTFVFKTsKKyAgLy8gcGVyIFp1ZmFsbCBkaWUgTGFlbmdlIGRlciBlaW56ZWxuZW4gUmVzZXRzIGJlcmVjaG5lbgorICBpbnQgbGVuZ3RoID0gZmlyc3RfcmVzZXRfbGVuZ3RoOworICBmb3JlYWNoKGludCBpOiB2YWx1ZSkgeworICAgIGxlbmd0aCArPSB0b19pbnQoKF9fUkVTRVRfVElNRV9fICsgcmFuZG9tKF9fUkVTRVRfVElNRV9fKSkgLyAyKTsKKyAgfQorICBzZXRfc3RkX2Zvb2RfbGlmZXRpbWUobGVuZ3RoKTsKK30KKworLy8gRmxhZywgb2IgU3BlaXNlICJlc3NiYXIiIGlzdAorcHVibGljIGludCBpc19lYXRhYmxlKCkgeworICByZXR1cm4gUXVlcnlQcm9wKFBfRk9PRCkgPiAwOworfQorCisvLyBGbGFnLCBvYiBTcGVpc2UgInRyaW5rYmFyIiBpc3QKK3B1YmxpYyBpbnQgaXNfZHJpbmthYmxlKCkgeworICByZXR1cm4gUXVlcnlQcm9wKFBfRk9PRCkgPT0gMCAmJiBRdWVyeVByb3AoUF9EUklOSykgPiAwOworfQorCisvLyBGbGFnLCBvYiBub2NoIFBvcnRpb25lbiBkZXIgU3BlaXNlIHZvcmhhbmRlbiBzaW5kCitwdWJsaWMgaW50IGlzX25vdF9lbXB0eSgpIHsKKyAgcmV0dXJuIFF1ZXJ5UHJvcChQX1BPUlRJT05TKSA+IDA7Cit9CisKKy8vIE1hY2h0IGVpbmUgU3BlaXNlIGxlZXIgYnp3LiB6ZXJzdG9lcnQgc2llLgorLy8gTXVzcyBiZWltIFVlYmVyc2NocmVpYmVuIGltbWVyIGFscyBsZXR6dGVzIGF1ZmdlcnVmZW4gd2VyZGVuLgorLy8gRGllc2UgTWV0aG9kZSB3aXJkIGF1ZmdlcnVmZW4sIHdlbm4gZWluIEJlaGFlbHRlciBsZWVyZ2VmdXR0ZXJ0IHdpcmQKKy8vIG9kZXIgZGVyIEluaGFsdCB6ZXJzdG9lcnQgd2VyZGVuIHNvbGwKKy8vIFJ1ZWNrZ2FiZXdlcnQ6IEVyZ2VibmlzIHZvbiByZW1vdmUoKSBiencuIDAsIHdlbm4gT2JqZWt0IG5pY2h0CisvLyAgICAgICAgICAgICAgICB6ZXJzdG9lcnQgd2VyZGVuIG11c3MKKy8vIEJlaW0gQXVmcnVmIGJpdHRlIElNTUVSIGRhcyBFcmdlYm5pcyBwcnVlZmVuLCBkYW1pdCBrZWluZSBBdWZydWZlIGFuCisvLyBnZWxvZXNjaHRlbiBPYmpla3RlbiBwYXNzaWVyZW4hIGlmIChtYWtlX2VtcHR5KCkpIHJldHVybiAuLi47CitwdWJsaWMgaW50IG1ha2VfZW1wdHkoKSB7CisgIG1peGVkIHByb3BzID0gUXVlcnlQcm9wKFBfRU1QVFlfUFJPUFMpOworICBpZiAobWFwcGluZ3AocHJvcHMpKSB7CisgICAgZm9yZWFjaChzdHJpbmcga2V5Om1faW5kaWNlcyhwcm9wcykpIHsKKyAgICAgIGlmIChrZXkgPT0gUF9JRFMpIHsKKyAgICAgICAgUmVtb3ZlSWQoUXVlcnlQcm9wKFBfSURTKSk7CisgICAgICAgIEFkZElkKFF1ZXJ5UHJvcChJRF9CQUNLVVApKTsKKyAgICAgICAgQWRkSWQocHJvcHNba2V5XSk7CisgICAgICB9CisgICAgICBlbHNlIGlmIChrZXkgPT0gUF9BREpFQ1RJVkVTKSB7CisgICAgICAgIFJlbW92ZUlkKFF1ZXJ5UHJvcChQX0FESkVDVElWRVMpKTsKKyAgICAgICAgQWRkQWRqZWN0aXZlKFF1ZXJ5UHJvcChBREpfQkFDS1VQKSk7CisgICAgICAgIEFkZEFkamVjdGl2ZShwcm9wc1trZXldKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBTZXRQcm9wKGtleSxwcm9wc1trZXldKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTaWNoZXJoZWl0c2hhbGJlciA6LSkKKyAgICBTZXRQcm9wKFBfUE9SVElPTlMsMCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgZWxzZSB7CisgICAgcmV0dXJuIHJlbW92ZSgxKTsKKyAgfQorfQorCisvLyB3aXJkIGF1ZmdlcnVmZW4sIHdlbm4gZGllIFNwZWlzZSBzY2hsZWNodCB3YXIgdW5kIGRlciBSZW1vdmV0aW1lcgorLy8gYWJnZWxhdWZlbiBpc3QKKy8vIFplcnN0b2VydCBkaWUgU3BlaXNlIG9kZXIgZGVuIEluaGFsdCBlaW5lcyBCZWhhZWx0ZXJzCisvLyBSdWVja2dhYmV3ZXJ0OiBFcmdlYm5pcyB2b24gcmVtb3ZlKCkgYnp3LiAwLCB3ZW5uIE9iamVrdCBuaWNodAorLy8gICAgICAgICAgICAgICAgemVyc3RvZXJ0IHdlcmRlbiBtdXNzCitwdWJsaWMgaW50IG1ha2VfZGVzdHJveSgpIHsKKyAgbWVzc2FnZShQX1JFTU9WRV9NU0cpOworICBzZXRfbmV4dF9yZXNldCgtMSk7CisgIHJldHVybiBtYWtlX2VtcHR5KCk7IC8vIExlZXJtYWNoZW4gb2RlciB6ZXJzdG9lcmVuCit9CisKKy8vIExhZXNzdCBkaWUgU3BlaXNlIHNjaGxlY2h0IHdlcmRlbiAobWl0IE1lbGR1bmdlbikKKy8vIG11c3MgYmVpbSBVZWJlcnNjaHJlaWJlbiBpbW1lciBtaXQgYXVmZ2VydWZlbiB3ZXJkZW4KKy8vIFJ1ZWNrZ2FiZXdlcnQ6IEVyZ2VibmlzIHZvbiByZW1vdmUoKSBiencuIDAsIHdlbm4gT2JqZWt0IG5pY2h0CisvLyAgICAgICAgICAgICAgICB6ZXJzdG9lcnQgd2VyZGVuIG11c3MKKy8vIEJlaW0gQXVmcnVmIGJpdHRlIElNTUVSIGRhcyBFcmdlYm5pcyBwcnVlZmVuLCBkYW1pdCBrZWluZSBBdWZydWZlIGFuCisvLyBnZWxvZXNjaHRlbiBPYmpla3RlbiBwYXNzaWVyZW4hIGlmIChtYWtlX2JhZCgpKSByZXR1cm4gLi4uOworcHVibGljIGludCBtYWtlX2JhZCgpIHsKKyAgdGltZV9nb25lX2JhZCA9IHRpbWUoKTsKKyAgaWYgKGlzX25vdF9lbXB0eSgpKSB7CisgICAgbWVzc2FnZShQX0JBRF9NU0cpOworICB9CisgIGlmIChRdWVyeVByb3AoUF9ERVNUUk9ZX0JBRCkgPT0gREVTVFJPWV9CQUQgJiYgIVF1ZXJ5UHJvcChQX0VNUFRZX1BST1BTKSkgeworICAgIHJldHVybiByZW1vdmUoMSk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vIFN0YXJ0ZXQgZGVuIFRpbWVyIHp1bSBTY2hsZWNodHdlcmRlbiBkZXIgU3BlaXNlCitwdWJsaWMgdm9pZCBzdGFydF9saWZldGltZSgpIHsKKyAgLy8gVGVzdCwgb2IgTGViZW5zbWl0dGVsIHNjaGxlY2h0IHdlcmRlbiBkYXJmCisgIGlmICghUXVlcnlQcm9wKFBfTk9fQkFEKSAmJiAhdGltZV90b2dvX2JhZCkgeworICAgIHN0YXJ0X2xpZmUgPSB0aW1lKCk7CisgICAgaW50IHplaXQgPSBRdWVyeVByb3AoUF9MSUZFVElNRSk7CisgICAgIC8vIFplaXRwdW5rdCBkZXMgU2NobGVjaHR3ZXJkZW5zCisgICAgdGltZV90b2dvX2JhZCA9IHN0YXJ0X2xpZmUgKyB6ZWl0OworICAgIC8vIFplaXRwdW5rdCBkZXMgWmVyc3RvZXJlbnMKKyAgICB0aW1lX3RvX3JlbW92ZSA9IHRpbWVfdG9nb19iYWQgKyBRdWVyeVByb3AoUF9ERVNUUk9ZX0JBRCk7CisgICAgbXlfc2V0X25leHRfcmVzZXQoemVpdCk7CisgIH0KK30KKworLy8gUmVzZXQgd2lyZCBpbiAyIFNpdHVhdGlvbmVuIGF1ZmdlcnVmZW46CisvLyAxLiBUaW1lciB6dW0gc2NobGVjaHQgd2VyZGVuIGlzdCBhYmdlbGF1ZmVuLCBkYXMgRnV0dGVyIG11c3MgYWxzbworLy8gICAgc2NobGVjaHQgd2VyZGVuIHVuZCBldnRsLiBkZXIgVGltZXIgenVtIFplcnN0b2VyZW4gZ2VzdGFydGV0IHdlcmRlbgorLy8gMi4gVGltZXIgenVtIFplcnN0b2VyZW4gaXN0IGFiZ2VsYXVmZW4sIGFsc28gd2lyZCBGdXR0ZXIgemVyc3RvZXJ0LgorLy8gV2lyZCBkZXIgUmVzZXQgYXVzIGlyZ2VuZGVpbmVtIEdydW5kIHp1IGZhbHNjaGVuIFplaXRlbiBhdWZnZXJ1ZmVuLAorLy8gd2lyZCBkZXIgbmFlY2hzdGUgUmVzZXQga29ycmVrdCBpbml0aWFsaXNpZXJ0Lgordm9pZCByZXNldCgpIHsKKyAgLy8gd2VubiBrZWluIGVudiwgQWJicnVjaCB1bmQgcmVzZXQgYWJzY2hhbHRlbi4KKyAgaWYgKCFlbnZpcm9ubWVudCgpKSB7CisgICAgICBzZXRfbmV4dF9yZXNldCgtMSk7CisgICAgICByZXR1cm47CisgIH0KKworICAvLyBUZXN0LCBvYiBMZWJlbnNtaXR0ZWwgc2NobGVjaHQgd2VyZGVuIGRhcmYKKyAgaWYgKCFRdWVyeVByb3AoUF9OT19CQUQpKSB7CisgICAgaWYgKCFpc19iYWQoKSkgeworICAgICAgLy8gVGVzdCwgb2IgVGltZXIgbGFldWZ0CisgICAgICBpZiAodGltZV90b2dvX2JhZCkgeworICAgICAgICAvLyBQcnVlZmVuLCBvYiBkZXIgUmVzZXQgc28gaW4gZXR3YSB6dXIgcmljaHRpZ2VuIFplaXQgYXVmZ2VydWZlbiB3dXJkZQorICAgICAgICAvLyAxMCUgQWJ3ZWljaHVuZyBzaW5kIGVybGF1YnQKKyAgICAgICAgaW50IGRpZmYgPSB0aW1lKCkgLSB0aW1lX3RvZ29fYmFkOworICAgICAgICBpbnQgc3RkID0gdG9faW50KFF1ZXJ5UHJvcChQX0xJRkVUSU1FKS8xMCk7CisgICAgICAgIGlmIChhYnMoZGlmZikgPCBzdGQgfHwgZGlmZiA+IDApIHsKKyAgICAgICAgICBpZiAobWFrZV9iYWQoKSkgcmV0dXJuOworICAgICAgICAgIC8vIFJlc2V0IHp1bSBaZXJzdG9lcmVuIHZvcmJlcmVpdGVuCisgICAgICAgICAgaWYgKFF1ZXJ5UHJvcChQX0RFU1RST1lfQkFEKSA+IDApIHsKKyAgICAgICAgICAgIG15X3NldF9uZXh0X3Jlc2V0KHRpbWVfdG9fcmVtb3ZlIC0gdGltZSgpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzZXRfbmV4dF9yZXNldCgtMSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIC8vIFJlc2V0IG5vY2htYWwgenVtIEFibGF1ZiBkZXIgRnJpc3QKKyAgICAgICAgICBteV9zZXRfbmV4dF9yZXNldChhYnMoZGlmZikpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHRpbWVfdG9fcmVtb3ZlICYmIFF1ZXJ5UHJvcChQX0RFU1RST1lfQkFEKSA+IDApIHsKKyAgICAgIC8vIHdpciBzaW5kIGltIFJlc2V0IG5hY2ggZGVtIFNjaGxlY2h0d2VyZGVuCisgICAgICBpbnQgZGlmZiA9IHRpbWUoKSAtIHRpbWVfdG9fcmVtb3ZlOworICAgICAgaW50IHN0ZCA9IHRvX2ludCgoUXVlcnlQcm9wKFBfTElGRVRJTUUpK1F1ZXJ5UHJvcChQX0RFU1RST1lfQkFEKSkvMTApOworICAgICAgLy8gUHJ1ZWZlbiwgb2IgZGVyIFJlc2V0IHNvIGluIGV0d2EgenVyIHJpY2h0aWdlbiBaZWl0IGF1ZmdlcnVmZW4gd3VyZGUKKyAgICAgIC8vIDEwJSBBYndlaWNodW5nIHNpbmQgZXJsYXVidAorICAgICAgaWYgKGFicyhkaWZmKSA8IHN0ZCB8fCBkaWZmID4gMCkgeworICAgICAgICBpZiAobWFrZV9kZXN0cm95KCkpIHJldHVybjsgLy8gTGVlcm1hY2hlbiBvZGVyIHplcnN0b2VyZW4KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICAvLyBSZXNldCBub2NobWFsIHp1bSBBYmxhdWYgZGVyIEZyaXN0CisgICAgICAgIG15X3NldF9uZXh0X3Jlc2V0KGFicyhkaWZmKSk7CisgICAgICB9CisgICAgfQorICB9IC8vIGlmIChQX05PX0JBRCkKKworICA6OnJlc2V0KCk7Cit9CisKK3ByaXZhdGUgaW50IHNhZmV0eV9jaGVjaygpIHsKKyAgLy8gRGFtaXQgZWluIFNwaWVsZXIgYXVjaCBnYWFhYW56IHNpY2hlciBuaWNodCBTcGVpc2VuIGF1c3NlcmhhbGIgZGVyIAorICAvLyBQX0xJRkVUSU1FIG51dHplbiBrYW5uIC4uLgorICBpZiAodGltZV90b2dvX2JhZCAmJiAhaXNfYmFkKCkgJiYgdGltZSgpID4gdGltZV90b2dvX2JhZCkgeworICAgIGlmIChtYWtlX2JhZCgpKSByZXR1cm4gMDsKKyAgICAvLyBSZXNldCB6dW0gWmVyc3RvZXJlbiB2b3JiZXJlaXRlbgorICAgIGlmIChRdWVyeVByb3AoUF9ERVNUUk9ZX0JBRCkgPiAwKSB7CisgICAgICBteV9zZXRfbmV4dF9yZXNldCh0aW1lX3RvX3JlbW92ZSAtIHRpbWUoKSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgc2V0X25leHRfcmVzZXQoLTEpOworICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQorICBlbHNlIGlmICh0aW1lX3RvX3JlbW92ZSAmJiB0aW1lKCkgPiB0aW1lX3RvX3JlbW92ZQorICAgICAgJiYgUXVlcnlQcm9wKFBfREVTVFJPWV9CQUQpID4gMCkgeworICAgIG1ha2VfZGVzdHJveSgpOyAvLyBMZWVybWFjaGVuIG9kZXIgemVyc3RvZXJlbgorICAgIHJldHVybiAwOworICB9CisgIHJldHVybiAxOworfQorCisvLyBQcnVlZnVuZyB6dW0gU3RhcnRlbiBhdXNnZWxhZ2VydCwgZGEgZGFzIGltIGluaXQgdW5kIGluCisvLyBOb3RpZnlNb3ZlIGdlYnJhdWNodCB3aXJkCitwcml2YXRlIHZvaWQgY2hlY2tfc3RhcnRfdGltZXIob2JqZWN0IG9sZGVudikgeworICAvLyBUZXN0LCBvYiBMZWJlbnNtaXR0ZWwgc2NobGVjaHQgd2VyZGVuIGthbm4KKyAgaWYgKCFRdWVyeVByb3AoUF9OT19CQUQpICYmICF0aW1lX3RvZ29fYmFkKSB7CisgICAgLy8gV2VubiB3aXIgaXJnZW5kd2llIGluIGVpbmVtIFNwaWVsZXIgc3RlY2tlbiBvZGVyIGVpbiBTcGllbGVyIGluIGRlcgorICAgIC8vIFVtZ2VidW5nIGlzdCBvZGVyIGRhcyBGdXR0ZXIgbWVocmZhY2ggYmV3ZWd0IHd1cmRlCisgICAgaWYgKHNpemVvZihmaWx0ZXIoYWxsX2Vudmlyb25tZW50KCksIydxdWVyeV9vbmNlX2ludGVyYWN0aXZlKSkKKyAgICAgICAgfHwgc2l6ZW9mKGZpbHRlcihhbGxfaW52ZW50b3J5KGVudmlyb25tZW50KCkpLCMncXVlcnlfb25jZV9pbnRlcmFjdGl2ZSkpCisgICAgICAgIHx8IG9iamVjdHAob2xkZW52KSkgeworICAgICAgc3RhcnRfbGlmZXRpbWUoKTsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgLy8gRGFtaXQgZWluIFNwaWVsZXIgYXVjaCBnYWFhYW56IHNpY2hlciBuaWNodCBTcGVpc2VuIGF1c3NlcmhhbGIKKyAgICAvLyBkZXIgUF9MSUZFVElNRSBudXR6ZW4ga2FubiAuLi4KKyAgICBzYWZldHlfY2hlY2soKTsKKyAgfQorfQorCisvLyBoaWVyIHdpcmQgZ2VwcnVlZnQsIG9iIGRhcyBGdXR0ZXIgZGVtIFNwaWVsZXIgenVnYWVuZ2xpY2ggaXN0Lgordm9pZCBpbml0KCkgeworICA6OmluaXQoKTsKKyAgY2hlY2tfc3RhcnRfdGltZXIoZW52aXJvbm1lbnQoKSk7Cit9CisKKy8vIGhpZXIgd2lyZCBnZXBydWVmdCwgb2IgZGFzIEZ1dHRlciBkZW0gU3BpZWxlciB6dWdhZW5nbGljaCBpc3QuCisvLyBkYXMgaXN0IHNpY2hlcmVyIGFscyBudXIgaW0gaW5pdCgpCitwcm90ZWN0ZWQgdm9pZCBOb3RpZnlNb3ZlKG9iamVjdCBkZXN0LCBvYmplY3Qgb2xkZW52LCBpbnQgbWV0aG9kKSB7CisgIDo6Tm90aWZ5TW92ZShkZXN0LCBvbGRlbnYsIG1ldGhvZCk7CisgIGNoZWNrX3N0YXJ0X3RpbWVyKG9sZGVudik7Cit9CisKK3ZvaWQgY3JlYXRlKCkgeworICAvLyBTaWNoZXJoZWl0c2hhbGJlciwKKyAgLy8gZmFsbHMgamVtYW5kIGRpZSBCbHVlcHJpbnQgbWl0IFByb3BzIGluaXRpYWxpc2llcmVuIHdpbGwKKyAgOjpjcmVhdGUoKTsKKyAgU2V0KFBfTElGRVRJTUUsICMnc2V0X3N0ZF9mb29kX2xpZmV0aW1lLCBGX1NFVF9NRVRIT0QpOworICBTZXQoUF9MSUZFVElNRSwgUFJPVEVDVEVELCBGX01PREVfQVMpOworCisgIHRpbWVfdG9nb19iYWQgPSAwOworICB0aW1lX3RvX3JlbW92ZSA9IDA7CisgIHRpbWVfZ29uZV9iYWQgPSAwOworCisgIC8vIFN0YW5kYXJkbGF1ZnplaXQgMSBSZXNldAorICBmaXJzdF9yZXNldF9sZW5ndGggPSB0b19pbnQoKF9fUkVTRVRfVElNRV9fICsgcmFuZG9tKF9fUkVTRVRfVElNRV9fKSkgLyAyKTsKKyAgLy8gUmVzZXQgd2lyZCBlcnN0bWFsIGFiZ2VzY2hhbHRldCwgZGFzIHdpcmQgaW0gTm90aWZ5TW92ZSBnZXBydWVmdAorICBzZXRfbmV4dF9yZXNldCgtMSk7CisKKyAgU2V0UHJvcChQX1NIT1JULCJFaW4gTGViZW5zbWl0dGVsIik7CisgIFNldFByb3AoUF9MT05HLCJEYXMgaXN0IGVpbiBMZWJlbnNtaXR0ZWwuXG4iKTsKKyAgU2V0UHJvcChQX05BTUUsIkxlYmVuc21pdHRlbCIpOworICBTZXRQcm9wKFBfTUFURVJJQUwsIE1BVF9NSVNDX0ZPT0QpOworICBTZXRQcm9wKFBfR0VOREVSLE5FVVRFUik7CisgIFNldFByb3AoUF9XRUlHSFQsNTApOworICBTZXRQcm9wKFBfVkFMVUUsMTApOworICBTZXRQcm9wKFBfUE9SVElPTlMsMSk7IC8vIGVpbm1hbCBBYmJlaXNzZW4KKyAgU2V0UHJvcChQX0RFU1RST1lfQkFELERFU1RST1lfQkFEKTsgLy8gWmVyc3RvZXJlbiBiZWltIFNjaGxlY2h0d2VyZGVuCisgIFNldFByb3AoUF9ESVNUUklCVVRJT04sSERfU1RBTkRBUkQpOyAvLyBIZWlsdW5nIHBlciBTdGFuZGFyZHZlcnRlaWx1bmcgKDUvaGIpCisKKyAgU2V0UHJvcChQX0NPTlNVTUVfTVNHLCJAV0VSMiBrb25zdW1pZXJ0IEBXRU4xLiIpOworICBTZXRQcm9wKFBfRUFURVJfTVNHLCJEdSBrb25zdW1pZXJzdCBAV0VOMS4iKTsKKyAgU2V0UHJvcChQX0VNUFRZX01TRywiQFdFUjEgaXN0IGJlcmVpdHMgbGVlci4iKTsKKyAgU2V0UHJvcChQX05PRk9PRF9NU0csIkBXRU4xIGthbm4gbWFuIG5pY2h0IGVzc2VuISIpOworICBTZXRQcm9wKFBfTk9EUklOS19NU0csIkBXRU4xIGthbm4gbWFuIG5pY2h0IHRyaW5rZW4hIik7CisgIFNldFByb3AoUF9CQURfTVNHLCJAV0VSMSB2ZXJkaXJidC4iKTsKKyAgU2V0UHJvcChQX0ZPT0RfRlVMTF9NU0csIkR1IGJpc3QgenUgc2F0dCwgZGFzIHNjaGFmZnN0IER1IG5pY2h0IG1laHIuIik7CisgIFNldFByb3AoUF9EUklOS19GVUxMX01TRywiU28gdmllbCBrYW5uc3QgRHUgaW0gTW9tZW50IG5pY2h0IHRyaW5rZW4uIik7CisgIFNldFByb3AoUF9BTENfRlVMTF9NU0csIlNvdmllbCBBbGtvaG9sIHZlcnRyYWVnc3QgRHUgbmljaHQgbWVoci4iKTsKKyAgU2V0UHJvcChQX0VOVl9NU0csIlZpZWxsZWljaHQgc29sbHRlc3QgRHUgQFdFTjEgdm9yaGVyIG5laG1lbi4iKTsKKyAgU2V0UHJvcChQX1JFTU9WRV9NU0csIkBXRVIxIHplcmZhZWxsdCB6dSBTdGF1Yi4iKTsKKworICAvLyBTaWNoZXJuIGRlciBTdGFuZGFyZHMKKyAgU2V0UHJvcChJRF9CQUNLVVAsUXVlcnlQcm9wKFBfSURTKSk7CisgIFNldFByb3AoQURKX0JBQ0tVUCxRdWVyeVByb3AoUF9BREpFQ1RJVkVTKSk7CisKKyAgQWRkSWQoKHsibGViZW5zbWl0dGVsIiwibmFocnVuZyIsIlxuZm9vZCJ9KSk7CisKKyAgQWRkQ21kKCh7ImlzcyIsImVzc2UifSksImNtZF9lYXQiKTsKKyAgQWRkQ21kKCh7InRyaW5rIiwidHJpbmtlIn0pLCJjbWRfZHJpbmsiKTsKK30KKworLy8gQWVuZGVydCBXZXJ0ZSBkZXIgU3BlaXNlLCB3ZW5uIHNpZSB2ZXJnYW1tZWx0IGlzdCB1bmQga29uc3VtaWVydCB3aXJkCitwcm90ZWN0ZWQgdm9pZCBjb25zdW1lX2JhZChtYXBwaW5nIGVudHJ5X2luZm8pIHsKKyAgZW50cnlfaW5mb1tQX0hQXSA9IDA7CisgIGVudHJ5X2luZm9bUF9TUF0gPSAwOworICBlbnRyeV9pbmZvW0hfRUZGRUNUU10gPSAoW1BfUE9JU09OOjFdKTsKK30KKworLy8gU3RlbGx0IE1hcHBpbmcgenVtIEtvbnN1bWllcmVuIHp1c2FtbWVuIHVuZCBrb25zdW1pZXJ0LgorLy8ga2FubiBtaXQgdGVzdG9ubHk9MSBhdWZnZXJ1ZmVuIHdlcmRlbiwgdW0genUgcHJ1ZWZlbiwgb2Iga29uc3VtaWVyZW4ga2xhcHB0CisvLyBHaWJ0IGRhcyBFcmdlYm5pcyB2b24gbGl2aW5nLT5jb25zdW1lKCkgenVydWVjazoKKy8vID4wIC0+IGVyZm9sZ3JlaWNoIGtvbnN1bWllcnQKKy8vIDwwIC0+IG5pY2h0IGtvbnN1bWllcnQgKHNpZWhlIEhpbGZlIHp1IGNvbnN1bWUpCitwcm90ZWN0ZWQgdmFyYXJncyBpbnQgdHJ5X2NvbnN1bWUob2JqZWN0IGNvbnN1bWVyLCBpbnQgdGVzdG9ubHkpIHsKKyAgbWFwcGluZyBlbnRyeV9pbmZvID0gKFtQX0ZPT0Q6UXVlcnlQcm9wKFBfRk9PRCksCisgICAgICAgICAgICAgICAgICAgICAgICBQX0RSSU5LOlF1ZXJ5UHJvcChQX0RSSU5LKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBfSFA6UXVlcnlQcm9wKFBfSFApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUF9TUDpRdWVyeVByb3AoUF9TUCksCisgICAgICAgICAgICAgICAgICAgICAgIFBfUE9JU09OOlF1ZXJ5UHJvcChQX1BPSVNPTiksCisgICAgICAgICAgICAgICAgICAgICAgUF9BTENPSE9MOlF1ZXJ5UHJvcChQX0FMQ09IT0wpLAorICAgICAgICAgICAgICAgICBIX0RJU1RSSUJVVElPTjpRdWVyeVByb3AoUF9ESVNUUklCVVRJT04pXSk7CisKKyAgaWYgKGlzX2JhZCgpKSBjb25zdW1lX2JhZChlbnRyeV9pbmZvKTsKKworICBpbnQgcmVzdWx0ID0gKGludCljb25zdW1lci0+Y29uc3VtZShlbnRyeV9pbmZvLCB0ZXN0b25seSk7CisgIGlmICghcmVzdWx0KSB7CisgICAgdGVsbF9vYmplY3QoY29uc3VtZXIsCisgICAgICAiRGEgaXN0IHdhcyBzY2hpZWYgZ2VsYXVmZW4hIFNwcmljaCBtYWwgbWl0IGVpbmVtIE1hZ2llci5cbiIpOworICAgIHJhaXNlX2Vycm9yKCJsaXZpbmctPmNvbnN1bWUoKSBtaXQgZmFsc2NoZW4gUGFyYW1ldGVybiBhdWZnZXJ1ZmVuOlxuIisKKyAgICAgIHNwcmludGYoIiVPXG4iLGVudHJ5X2luZm8pKTsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIEtvbnN1bWllcmVuIHdhciBlcmZvbGdyZWljaAorLy8gSGllciBrYW5uIG1hbiBiZWltIFVlYmVyc2NocmVpYmVuIG5vY2ggenVzYWV0emxpY2hlIFNhY2hlbiBtYWNoZW4KKy8vIFBfUE9SVElPTlMgaXN0IGJlcmVpdHMgcnVudGVyZ2V6YWVobHQsIFNwZWlzZSBpc3QgYWJlciBub2NoIG5pY2h0IGxlZXIhCisvLyBtYWtlX2VtcHR5KCkgd2lyZCBhbHNvIGV2ZW50dWVsbCBub2NoIGRhbmFjaCBhdWZnZXJ1ZmVuCisvLyBlbnRzcHJpY2h0IGFsdGVyIEZ1bmMgQmVpbUVzc2VuKCkKK3Byb3RlY3RlZCB2b2lkIHN1Y2Nlc3NfY29uc3VtZShvYmplY3QgY29uc3VtZXIpIHsKKyAgdGVsbF9yb29tKGVudmlyb25tZW50KGNvbnN1bWVyKSxldmFsX3Byb3BlcnR5KFBfQ09OU1VNRV9NU0csY29uc3VtZXIpLCh7Y29uc3VtZXJ9KSk7CisgIHRlbGxfb2JqZWN0KGNvbnN1bWVyLGV2YWxfcHJvcGVydHkoUF9FQVRFUl9NU0csY29uc3VtZXIpKTsKK30KKworLy8gS29uc3VtaWVyZW4gd2FyIG5pY2h0IGVyZm9sZ3JlaWNoCisvLyBIaWVyIGthbm4gbWFuIGJlaW0gVWViZXJzY2hyZWliZW4gbm9jaCB6dXNhZXR6bGljaGUgU2FjaGVuIG1hY2hlbgorLy8gaW4gcmVhc29uIHdpcmQgZGVyIEdydW5kIGRlcyBGZWhsc2NobGFnZW5zIHVlYmVyZ2ViZW4gKHNpZWhlICdtYW4gY29uc3VtZScpCitwcm90ZWN0ZWQgdm9pZCBmYWlsZWRfY29uc3VtZShvYmplY3QgY29uc3VtZXIsIGludCByZWFzb24pIHsKKyAgaWYgKHJlYXNvbiAmIEhDX01BWF9GT09EX1JFQUNIRUQpCisgICAgdGVsbF9vYmplY3QoY29uc3VtZXIsZXZhbF9wcm9wZXJ0eShQX0ZPT0RfRlVMTF9NU0csY29uc3VtZXIpKTsKKyAgZWxzZSBpZiAocmVhc29uICYgSENfTUFYX0RSSU5LX1JFQUNIRUQpCisgICAgdGVsbF9vYmplY3QoY29uc3VtZXIsZXZhbF9wcm9wZXJ0eShQX0RSSU5LX0ZVTExfTVNHLGNvbnN1bWVyKSk7CisgIGVsc2UgaWYgKHJlYXNvbiAmIEhDX01BWF9BTENPSE9MX1JFQUNIRUQpCisgICAgdGVsbF9vYmplY3QoY29uc3VtZXIsZXZhbF9wcm9wZXJ0eShQX0FMQ19GVUxMX01TRyxjb25zdW1lcikpOworfQorCisvLyBLb25zdW1pZXJ0IGRpZSBTcGVpc2UKKy8vIEdpYnQgZGFzIEVyZ2VibmlzIHZvbiBsaXZpbmctPmNvbnN1bWUoKSB6dXJ1ZWNrOgorLy8gPjAgLT4gZXJmb2xncmVpY2gga29uc3VtaWVydAorLy8gPDAgLT4gbmljaHQga29uc3VtaWVydCAoc2llaGUgSGlsZmUgenUgY29uc3VtZSkKK3Byb3RlY3RlZCBpbnQgY29uc3VtZShvYmplY3QgY29uc3VtZXIpIHsKKyAgaWYgKCFvYmplY3RwKGNvbnN1bWVyKSB8fCAhbGl2aW5nKGNvbnN1bWVyKSkgeworICAgIHJhaXNlX2Vycm9yKCJhcmd1bWVudCBwbCBub3QgYSBsaXZpbmc6XG4iKworICAgICAgc3ByaW50ZigiJU9cbiIsY29uc3VtZXIpKTsKKyAgfQorICAvLyBkYW1pdCBhYmdlbGF1ZmVuZSBTcGVpc2VuIGF1Y2ggd2lya2xpY2ggYWJnZWxhdWZlbiBzaW5kCisgIGlmICghc2FmZXR5X2NoZWNrKCkpIHJldHVybiAwOworCisgIGlmICghaXNfbm90X2VtcHR5KCkpIHsKKyAgICBub3RpZnlfZmFpbChldmFsX3Byb3BlcnR5KFBfRU1QVFlfTVNHLGNvbnN1bWVyKSk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaW50IHJlc3VsdCA9IHRyeV9jb25zdW1lKGNvbnN1bWVyKTsKKyAgaWYgKHJlc3VsdCA+IDApIHsKKyAgICBTZXRQcm9wKFBfUE9SVElPTlMsUXVlcnlQcm9wKFBfUE9SVElPTlMpLTEpOworICAgIHN1Y2Nlc3NfY29uc3VtZShjb25zdW1lcik7CisgICAgaWYgKCFpc19ub3RfZW1wdHkoKSkgbWFrZV9lbXB0eSgpOworICB9CisgIGVsc2UgaWYgKHJlc3VsdCA8IDApIHsKKyAgICBmYWlsZWRfY29uc3VtZShjb25zdW1lcixyZXN1bHQpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIEZ1dHRlcm4KK2ludCBjbWRfZWF0KHN0cmluZyBzdHIpIHsKKyAgbm90aWZ5X2ZhaWwoIldBUyBtb2VjaHRlc3QgRHUgZXNzZW4/XG4iKTsKKyAgaWYgKCFzdHIgfHwgIWlkKHN0cikpIHJldHVybiAwOworICBvYmplY3QgZW52ID0gZW52aXJvbm1lbnQodGhpc19vYmplY3QoKSk7CisgIGlmIChlbnYgIT0gdGhpc19wbGF5ZXIoKSAmJiBRdWVyeVByb3AoUF9FTlZfTVNHKSkgeworICAgIG5vdGlmeV9mYWlsKGV2YWxfcHJvcGVydHkoUF9FTlZfTVNHLGVudikpOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKCFpc19lYXRhYmxlKCkgJiYgIWlzX2RyaW5rYWJsZSgpKSB7CisgICAgd3JpdGUoIk1pdCBkaWVzZW0gRnV0dGVyIHN0aW1tdCB3YXMgbmljaHQhIgorICAgICAgIiBTcHJpY2ggbWFsIG1pdCBlaW5lbSBNYWdpZXIuXG4iKTsKKyAgICByYWlzZV9lcnJvcigiRm9vZCBvaG5lIFdlcnRlLlxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoIWlzX2VhdGFibGUoKSkgeworICAgIG5vdGlmeV9mYWlsKGV2YWxfcHJvcGVydHkoUF9OT0ZPT0RfTVNHLGVudikpOworICAgIHJldHVybiAwOworICB9CisKKyAgcmV0dXJuIGNvbnN1bWUodGhpc19wbGF5ZXIoKSk7Cit9CisKKy8vIFRyaW5rZW4KK2ludCBjbWRfZHJpbmsoc3RyaW5nIHN0cikgeworICBub3RpZnlfZmFpbCgiV0FTIG1vZWNodGVzdCBEdSB0cmlua2VuP1xuIik7CisgIGlmICghc3RyIHx8ICFpZChzdHIpKSByZXR1cm4gMDsKKyAgb2JqZWN0IGVudiA9IGVudmlyb25tZW50KHRoaXNfb2JqZWN0KCkpOworICBpZiAoZW52ICE9IHRoaXNfcGxheWVyKCkgJiYgUXVlcnlQcm9wKFBfRU5WX01TRykpIHsKKyAgICBub3RpZnlfZmFpbChldmFsX3Byb3BlcnR5KFBfRU5WX01TRyxlbnYpKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmICghaXNfZWF0YWJsZSgpICYmICFpc19kcmlua2FibGUoKSkgeworICAgIHdyaXRlKCJNaXQgZGllc2VtIEZ1dHRlciBzdGltbXQgd2FzIG5pY2h0ISIKKyAgICAgICIgU3ByaWNoIG1hbCBtaXQgZWluZW0gTWFnaWVyLlxuIik7CisgICAgcmFpc2VfZXJyb3IoIkZvb2Qgb2huZSBXZXJ0ZS5cbiIpOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKCFpc19kcmlua2FibGUoKSkgeworICAgIG5vdGlmeV9mYWlsKGV2YWxfcHJvcGVydHkoUF9OT0RSSU5LX01TRyxlbnYpKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiBjb25zdW1lKHRoaXNfcGxheWVyKCkpOworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEtvbXBhdGliaWxpdGFldHNjb2RlCisvLyB1bSBldmVudHVlbGwgdmVyZ2Vzc2VuZXMgRm9vZCBvZGVyIFp1Z3JpZmYgdm9uIGF1c3NlbiBhdWYgYWx0ZXMgRm9vZAorLy8gbWl0enViZWtvbW1lbgorCitub3NhdmUgZGVwcmVjYXRlZCBpbnQgYWxjLCBhbGNfcHAsIGZvb2QsIGZvb2RfcHAsIGhlYWwsIHAsIHNvZnQsIHNvZnRfcHAsIGM7CisKK2RlcHJlY2F0ZWQgaW50IGVhdF90aGlzKCBzdHJpbmcgc3RyICkgeworICByZXR1cm4gY21kX2VhdChzdHIpOworfQorCitkZXByZWNhdGVkIGludCBkcmlua190aGlzKHN0cmluZyBzdHIpIHsKKyAgcmV0dXJuIGNtZF9kcmluayhzdHIpOworfQorCitkZXByZWNhdGVkIHZvaWQgTWFrZURyaW5rKCkgeworICBTZXRQcm9wKFBfRFJJTkssMSk7CisgIFNldFByb3AoUF9GT09ELDApOworfQorCitkZXByZWNhdGVkIG1peGVkIF9xdWVyeV9vbGRfaXNfZm9vZCgpIHsKKyAgcmV0dXJuIGlzX2VhdGFibGUoKTsKK30KKworZGVwcmVjYXRlZCB2b2lkIF9zZXRfb2xkX2lzX2Zvb2QobWl4ZWQgdmFsdWUpIHsKKyAgU2V0UHJvcChQX0RSSU5LLDApOworICBTZXRQcm9wKFBfRk9PRCx2YWx1ZSk7Cit9CisKK2RlcHJlY2F0ZWQgbWl4ZWQgX3F1ZXJ5X29sZF9pc19kcmluaygpIHsKKyAgcmV0dXJuIGlzX2RyaW5rYWJsZSgpOworfQorCitkZXByZWNhdGVkIHZvaWQgX3NldF9vbGRfaXNfZHJpbmsobWl4ZWQgdmFsdWUpIHsKKyAgU2V0UHJvcChQX0RSSU5LLHZhbHVlKTsKKyAgU2V0UHJvcChQX0ZPT0QsMCk7Cit9CisKK2RlcHJlY2F0ZWQgbWl4ZWQgX3F1ZXJ5X29sZF9pc19mdWxsKCkgeworICByZXR1cm4gaXNfbm90X2VtcHR5KCk7Cit9CisKK2RlcHJlY2F0ZWQgdm9pZCBfc2V0X29sZF9pc19mdWxsKG1peGVkIHZhbHVlKSB7CisgIFNldFByb3AoUF9QT1JUSU9OUyx2YWx1ZSk7Cit9CisKK2RlcHJlY2F0ZWQgbWl4ZWQgX3F1ZXJ5X29sZF9hbGMoKSB7CisgIHJldHVybiBRdWVyeVByb3AoUF9BTENPSE9MKTsKK30KKworZGVwcmVjYXRlZCB2b2lkIF9zZXRfb2xkX2FsYyhtaXhlZCB2YWx1ZSkgeworICBTZXRQcm9wKFBfQUxDT0hPTCx2YWx1ZSk7Cit9CisKK2RlcHJlY2F0ZWQgbWl4ZWQgX3F1ZXJ5X29sZF93YXRlcigpIHsKKyAgcmV0dXJuIFF1ZXJ5UHJvcChQX0RSSU5LKTsKK30KKworZGVwcmVjYXRlZCB2b2lkIF9zZXRfb2xkX3dhdGVyKG1peGVkIHZhbHVlKSB7CisgIFNldFByb3AoUF9EUklOSyx2YWx1ZSk7Cit9CisKK2RlcHJlY2F0ZWQgbWl4ZWQgX3F1ZXJ5X29sZF9mb29kX3NpemUoKSB7CisgIHJldHVybiBRdWVyeVByb3AoUF9GT09EKTsKK30KKworZGVwcmVjYXRlZCB2b2lkIF9zZXRfb2xkX2Zvb2Rfc2l6ZShtaXhlZCB2YWx1ZSkgeworICBTZXRQcm9wKFBfRk9PRCx2YWx1ZSk7Cit9CisKK2RlcHJlY2F0ZWQgbWl4ZWQgX3F1ZXJ5X29sZF9wb3Rpb24oKSB7CisgIHJldHVybiBRdWVyeVByb3AoUF9QT1JUSU9OUyk7Cit9CisKK2RlcHJlY2F0ZWQgdm9pZCBfc2V0X29sZF9wb3Rpb24obWl4ZWQgdmFsdWUpIHsKKyAgU2V0UHJvcChQX1BPUlRJT05TLHZhbHVlKTsKK30KKworZGVwcmVjYXRlZCBtaXhlZCBfcXVlcnlfb2xkX2hlYWxfaHAoKSB7CisgIHJldHVybiBRdWVyeVByb3AoUF9IUCk7Cit9CisKK2RlcHJlY2F0ZWQgdm9pZCBfc2V0X29sZF9oZWFsX2hwKG1peGVkIHZhbHVlKSB7CisgIFNldFByb3AoUF9IUCx2YWx1ZSk7Cit9CisKK2RlcHJlY2F0ZWQgbWl4ZWQgX3F1ZXJ5X29sZF9oZWFsX3NwKCkgeworICByZXR1cm4gUXVlcnlQcm9wKFBfU1ApOworfQorCitkZXByZWNhdGVkIHZvaWQgX3NldF9vbGRfaGVhbF9zcChtaXhlZCB2YWx1ZSkgeworICBTZXRQcm9wKFBfU1AsdmFsdWUpOworfQorCitkZXByZWNhdGVkIG1peGVkIF9xdWVyeV9vbGRfYmFkKCkgeworICByZXR1cm4gaXNfYmFkKCk7Cit9CisKK2RlcHJlY2F0ZWQgdm9pZCBfc2V0X29sZF9iYWQobWl4ZWQgdmFsdWUpIHsKKyAgcmV0dXJuOworfQorCitkZXByZWNhdGVkIG1peGVkIF9xdWVyeV9vbGRfbWVzcygpIHsKKyAgcmV0dXJuIFF1ZXJ5UHJvcChQX0NPTlNVTUVfTVNHKTsKK30KKworZGVwcmVjYXRlZCB2b2lkIF9zZXRfb2xkX21lc3MobWl4ZWQgdmFsdWUpIHsKKyAgU2V0UHJvcChQX0NPTlNVTUVfTVNHLHZhbHVlKTsKK30KKworZGVwcmVjYXRlZCBtaXhlZCBfcXVlcnlfb2xkX2VhdGVyKCkgeworICByZXR1cm4gUXVlcnlQcm9wKFBfRUFURVJfTVNHKTsKK30KKworZGVwcmVjYXRlZCB2b2lkIF9zZXRfb2xkX2VhdGVyKG1peGVkIHZhbHVlKSB7CisgIFNldFByb3AoUF9FQVRFUl9NU0csdmFsdWUpOworfQorCitkZXByZWNhdGVkIG1peGVkIF9xdWVyeV9vbGRfcG9pc29uKCkgeworICByZXR1cm4gUXVlcnlQcm9wKFBfUE9JU09OKTsKK30KKworZGVwcmVjYXRlZCB2b2lkIF9zZXRfb2xkX3BvaXNvbihtaXhlZCB2YWx1ZSkgeworICBTZXRQcm9wKFBfUE9JU09OLHZhbHVlKTsKK30KKworLy8gaW50ZXJuZSBNZXRob2RlCitwcml2YXRlIG1peGVkIGdldF9vbGRfZW1wdHkoc3RyaW5nIHByb3ApIHsKKyAgbWl4ZWQgcHJvcHMgPSBRdWVyeVByb3AoUF9FTVBUWV9QUk9QUyk7CisgIGlmIChtYXBwaW5ncChwcm9wcykpIHJldHVybiBwcm9wc1twcm9wXTsKKyAgcmV0dXJuIDA7Cit9CisvLyBpbnRlcm5lIE1ldGhvZGUKK3ByaXZhdGUgdm9pZCBzZXRfb2xkX2VtcHR5KHN0cmluZyBwcm9wLCBtaXhlZCB2YWx1ZSkgeworICBtaXhlZCBwcm9wcyA9IFF1ZXJ5UHJvcChQX0VNUFRZX1BST1BTKTsKKyAgaWYgKCFtYXBwaW5ncChwcm9wcykpIHByb3BzID0gKFtwcm9wOnZhbHVlXSk7CisgIGVsc2UgcHJvcHNbcHJvcF0gPSB2YWx1ZTsKKyAgU2V0UHJvcChQX0VNUFRZX1BST1BTLHByb3BzKTsKK30KKworZGVwcmVjYXRlZCBtaXhlZCBfcXVlcnlfb2xkX2VtcHR5X2NvbigpIHsKKyAgcmV0dXJuIGdldF9vbGRfZW1wdHkoUF9TSE9SVCk7Cit9CisKK2RlcHJlY2F0ZWQgdm9pZCBfc2V0X29sZF9lbXB0eV9jb24obWl4ZWQgdmFsdWUpIHsKKyAgc2V0X29sZF9lbXB0eShQX1NIT1JULHZhbHVlKTsKK30KKworZGVwcmVjYXRlZCBtaXhlZCBfcXVlcnlfb2xkX2VtcHR5X2dlbmRlcigpIHsKKyAgcmV0dXJuIGdldF9vbGRfZW1wdHkoUF9HRU5ERVIpOworfQorCitkZXByZWNhdGVkIHZvaWQgX3NldF9vbGRfZW1wdHlfZ2VuZGVyKG1peGVkIHZhbHVlKSB7CisgIHNldF9vbGRfZW1wdHkoUF9HRU5ERVIsdmFsdWUpOworfQorCitkZXByZWNhdGVkIG1peGVkIF9xdWVyeV9vbGRfZW1wdHlfaWQoKSB7CisgIHJldHVybiBnZXRfb2xkX2VtcHR5KFBfSURTKTsKK30KKworZGVwcmVjYXRlZCB2b2lkIF9zZXRfb2xkX2VtcHR5X2lkKG1peGVkIHZhbHVlKSB7CisgIHNldF9vbGRfZW1wdHkoUF9JRFMsdmFsdWUpOworfQorCitkZXByZWNhdGVkIG1peGVkIF9xdWVyeV9vbGRfZW1wdHlfbG9uZygpIHsKKyAgcmV0dXJuIGdldF9vbGRfZW1wdHkoUF9MT05HKTsKK30KKworZGVwcmVjYXRlZCB2b2lkIF9zZXRfb2xkX2VtcHR5X2xvbmcobWl4ZWQgdmFsdWUpIHsKKyAgc2V0X29sZF9lbXB0eShQX0xPTkcsdmFsdWUpOworfQorCitkZXByZWNhdGVkIG1peGVkIF9xdWVyeV9vbGRfbm9fY29uKCkgeworICByZXR1cm4gbWFwcGluZ3AoUXVlcnlQcm9wKFBfRU1QVFlfUFJPUFMpKTsKK30KKworZGVwcmVjYXRlZCB2b2lkIF9zZXRfb2xkX25vX2NvbihtaXhlZCB2YWx1ZSkgeworICBpZiAodmFsdWUpIFNldFByb3AoUF9FTVBUWV9QUk9QUywoW10pKTsKKyAgZWxzZSBTZXRQcm9wKFBfRU1QVFlfUFJPUFMsMCk7Cit9CisKKy8vIE11cGZlbAorZGVwcmVjYXRlZCBpbnQgRXNzYmFyKCkgeworICByZXR1cm4gMTsKK30KKworZGVwcmVjYXRlZCBtaXhlZCBfcXVlcnlfZm9vZF9pbmZvKCkgeworICByZXR1cm4gKFtdKTsKK30KKworZGVwcmVjYXRlZCB2b2lkIF9zZXRfZm9vZF9pbmZvKG1peGVkIHZhbHVlKSB7CisgIHJldHVybjsKK30KKworLy8gVHJveQorZGVwcmVjYXRlZCB2b2lkIGZvb2RfZGVjYXkoKSB7CisgIHJldHVybjsKK30KKworZGVwcmVjYXRlZCBpbnQgZWF0X21lKHN0cmluZyBzdHIpIHsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zdGQvZ2lsZGUuYyBiL3N0ZC9naWxkZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYjg0Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvZ2lsZGUuYwpAQCAtMCwwICsxLDM4MCBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGdpbGRlLmMgLS0gU3RhbmRhcmRnaWxkZQorLy8KKy8vICRJZDogZ2lsZGUuYyA4Mzg4IDIwMTMtMDItMTYgMTc6Mjg6MzFaIFplc3N0cmEgJAorI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCitpbmhlcml0ICIvc3RkL3Jvb20iOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxyb29tcy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8bmV3X3NraWxscy5oPgorI2luY2x1ZGUgPGV4cGxvcmF0aW9uLmg+CisjaW5jbHVkZSA8YW5zaS5oPgorI2luY2x1ZGUgIi9zZWN1cmUvcXVlc3RtYXN0ZXIuaCIKKyNpbmNsdWRlICIvc2VjdXJlL2xlcG1hc3Rlci5oIgorI2luY2x1ZGUgIi9zZWN1cmUvY29uZmlnLmgiCisjaW5jbHVkZSA8ZXZlbnRzLmg+CisKKyNkZWZpbmUga29zdGVuXzAgXAorICAoWzA6ICAgICAgICAgICAgICAgICJCaXMgRHUgRGljaCBkYXMgbmFlY2hzdGUgTWFsIGhpZXIgYmxpY2tlbiBsYWVzc3QsIHNvbGx0ZXN0IER1IGVpbmUgTWVuZ2UgU3R1ZmVucHVua3RlIHNhbW1lbG4uIFNvbnN0IHdpcmQgZGFzIG5peCEiLFwKKyAgICAiemF1YmVyZXIiOiAgICAgICAiSmV0enQgZmFuZyBoaWVyIGphIG5pY2h0IGFuIHp1IGphbW1lcm4uIER1IGhhc3QgZG9jaCBncmFkZSBlcnN0IGVyaG9laHQuIEZ1ZXIgZGllIG5hZWNoc3RlIFN0dWZlIG11c3N0IER1IGVyc3RtYWwgTGVpc3R1bmcgemVpZ2VuISIsXAorICAgICJrYWVtcGZlciI6ICAgICAgICJIYXQgZ3JhZGUgZXJzdCBlcmhvZWh0IHVuZCBmYWVuZ3Qgc2Nob24gYW4genUgamFtbWVybiB3aWUgZWluIGFsdGVyc3NjaHdhY2hlciBaYXViZXJlci4gTmltbSBnZWZhZWxsaWdzdCBIYWx0dW5nIGFuISIsXAorICAgICJrbGVydXMiOiAgICAgICAgICJXZXIgaGF0IERpciBkZW5uIGRhcyBHZWhpcm4gZ2VsYWV1dGVydD8gWmVpZyBlcnN0bWFsIHdhcyB2b24gRGVpbmVtIEtvZW5uZW4sIGJldm9yIER1IHNjaG9uIHdpZWRlciBlcmhvZWhlbiB3aWxsc3QhIixcCisgICAgImNoYW9zIjogICAgICAgICAgIlNvIGNoYW90aXNjaCBrYW5uc3QgRHUgZG9jaCBuaWNodCBzZWluIHp1IGdsYXViZW4sIGRhc3MgRHUgc2Nob24gd2llZGVyIGVyaG9laGVuIGthbm5zdCEiLFwKKyAgICAia2FyYXRlIjogICAgICAgICAiUnVoIERlaW5lIEtub2NoZW4gZXJzdG1hbCBlaW4gYmlzc2NoZW4gYXVzLiBCaXMgenVyIG5hZWNoc3RlbiBTdHVmZSB3ZXJkZW4gc2llIG5vY2ggZ2VudWcgbGVpZGVuIG11ZXNzZW4hIixcCisgICAgImthdHplbmtyaWVnZXIiOiAgIkRhIGhpbGZ0IGtlaW4gTWF1bnplbiB1bmQga2VpbiBTY2hudXJyZW4uIER1IGhhc3QgZ3JhZGUgZXJzdCBlcmhvZWh0IHVuZCBkYWJlaSBibGVpYnQgZGFzISIsXAorICAgICJ0YW5qaWFuIjogICAgICAgICJKZXR6dCBzY2hyZWkgbmljaHQgZ2xlaWNoIG5hY2ggU2lhbWlsLiBEdSBtdXNzdCBub2NoIGVpbmUgTWVuZ2UgbGVpc3RlbiBiaXMgenVyIG5hZWNoc3RlbiBTdHVmZSEiLFwKKyAgICAiYmllcnNjaHVldHRsZXIiOiAiRHUgaGFzdCBkYXMgQmllciBhdWYgRGVpbmVuIGxldHp0ZW4gRXJmb2xnIG5vY2ggbmljaHQgZWlubWFsIGF1c2dldHJ1bmtlbi4gV2VyZCBqZXR6dCBqYSBuaWNodCBncm9lc3NlbndhaG5zaW5uaWchIixcCisgICAgIndlcndvZWxmZSIgOiAgICAgIlVuZCB3ZW5uIER1IG5vY2ggc28gZ3JpbW1pZyBndWNrc3QgdW5kIGRlbiBNb25kIGFuaGV1bHN0LiBEdSBoYXN0IGdlcmFkZSBlcnN0IGVyaG9laHQuIE51biBtdXNzdCBEdSBlcnN0bWFsIHdpZWRlciBldHdhcyB0dW4hIixcCisgIF0pCisjZGVmaW5lIGtvc3Rlbl8yMCBcCisgIChbMDogICAgICAgICAgICAgICAgIkRhIGxpZWd0IGFiZXIgbm9jaCBlaW4gd2VpdGVyIFdlZyB2b3IgRGlyLiBBYmVyIER1IHNjaGFmZnN0IGVzIGdhbnogc2ljaGVyISIsXAorICAgICJ6YXViZXJlciI6ICAgICAgICJEdSBrYW5uc3QgendhciB6YXViZXJuLCBhYmVyIG5pY2h0IGhleGVuLiBGdWVyIGRpZSBuYWVjaHN0ZSBTdHVmZSBtdXNzdCBEdSBzY2hvbiBub2NoIGVpbmlnZXMgdHVuISIsXAorICAgICJrYWVtcGZlciI6ICAgICAgICJPaCB3ZWgsIGRhIGhhc3QgRHUgYWJlciBub2NoIG5lIE1lbmdlIHZvciBEaXIuIEJlaXNzIGRpZSBaYWVobmUgenVzYW1tZW4gdW5kIGxvcyBnZWh0cyEiLFwKKyAgICAia2xlcnVzIjogICAgICAgICAiRHUgd2lyc3QgYmVzdGltbXQgbm9jaCBlaW5pZ2UgSGVpbHRyYWVua2UgYnJhdWNoZW4gYmlzIHp1ciBuYWVjaHN0ZW4gU3R1ZmUhIixcCisgICAgImNoYW9zIjogICAgICAgICAgIkhhc3QgRHUgdmVyc3VjaHQgRGVpbiBDaGFvcyB6dSBiZXNlaXRpZ2VuLCBvZGVyIHdhcyBoYXN0IER1IGdlbWFjaHQ/IFNlaHIgd2VpdCBnZWtvbW1lbiBiaXN0ZSBqZWRlbmZhbGxzIG5vY2ggbmljaHQuIE11c3N0IERpY2ggc2Nob24gZWluIGJpc3NjaGVuIGFuc3RyZW5nZW4hIixcCisgICAgImthcmF0ZSI6ICAgICAgICAgIkdhbnogc2Nob2VuIGFuc3RyZW5nZW5kIGltbWVyIG51ciBtaXQgSGFuZCB1bmQgRnVzcyB6dSBtZXR6ZWxuLCBvZGVyPyBBYmVyIGVzIGhhdCBEaWNoIHNjaG9uIGV0d2FzIG5hZWhlciBhbiBkaWUgbmFlY2hzdGUgU3R1ZmUgcmFuZ2VicmFjaHQhIixcCisgICAgImthdHplbmtyaWVnZXIiOiAgIkJpc3NjaGVuIHdlbmlnZXIgRmVsbHBmbGVnZSBiZXRyZWliZW4sIHVuZCBlaW4gYmlzc2NoZW4gbWVociBTdHVmZW5wdW5rdGUgc2FtbWVsbi4gRHUgaGFzdCBuYWVtbGljaCBub2NoIGVpbiBndXRlcyBTdHVlY2sgdm9yIERpciEiLFwKKyAgICAidGFuamlhbiI6ICAgICAgICAiRHUgaGFzdCBub2NoIG5lIE1lbmdlIHp1IHR1biBiaXMgenVyIG5hZWNoc3RlbiBTdHVmZS4gU3RlcmIgbmljaHQgc28gb2Z0LCBhYmVyIHNvd2FzIHR1biBUYW5qaWFuIGphIGVoIG5pY2h0ISIsXAorICAgICJiaWVyc2NodWV0dGxlciI6ICJCaWVyIHRyaW5rZW4gYWxsZWluZSB3aXJkIERpY2ggbmljaHQgd2VpdGVyIGJyaW5nZW4sIG9id29obCBEdSBzY2hvbiBlaW4gU3R1ZWNrIHdlaXQgZ2Vrb21tZW4gYmlzdCEiLFwKKyAgICAid2Vyd29lbGZlIiA6ICAgICAiU3RhZXJrZSBEZWluZSBXaWxsZW5za3JhZnQuIER1IGhhc3Qgbm9jaCBlaW5pZ2VzIHZvciBEaXIhIixcCisgIF0pCisjZGVmaW5lIGtvc3Rlbl80MCBcCisgIChbMDogICAgICAgICAgICAgICAgIkFsc28gZGllIEhhZWxmdGUgaGFzdCBEdSBzY2hvbiB1bmdlZmFlaHIgZ2VzY2hhZmZ0LiBBYmVyIHJ1aCBEaWNoIGpldHp0IGphIG5pY2h0IGRhcmF1ZiBhdXMuIFNpZWggbWFsIHp1LCBkYXNzIER1IGRpZSB6d2VpdGUgSGFlbGZ0ZSB6dXIgbmFlY2hzdGVuIFN0dWZlIGF1Y2ggbm9jaCBzY2hhZmZzdC4gQXVmIGVpbmVtIEJlaW4ga2FubiBtYW4gc2NobGllc3NsaWNoIG5pY2h0IGxhbmdlIHN0ZWhuISIsXAorICAgICJ6YXViZXJlciI6ICAgICAgICJUZWlsZSBMbHlzdHJhdGhlIG1pdCBIaWxmZS4gT2NoIHNjaGFkZSBzY2hlaW50IG5pY2h0IHp1IGZ1bmt0aW9uaWVyZW4sIGRhbm4gbXVzc3QgRHUgZWJlbiBzZWxiZXIgbm9jaCBuZSBNZW5nZSBTdHVmZW5wdW5rdGUgc2FtbWVsbiEiLFwKKyAgICAia2FlbXBmZXIiOiAgICAgICAiS2FlbXBmZXIgc2NobmVsbCBhbiBkaWUgV2FmZmVuISBEaWUgSGFlbGZ0ZSBoYXN0IER1IHVuZ2VmYWVociBnZXNjaGFmZnQsIGFiZXIgZXMgZ2lidCBub2NoIHZpZWwgenUgdHVuISIsXAorICAgICJrbGVydXMiOiAgICAgICAgICJCZWlsZSBEaWNoISBEYXMgQm9lc2Ugc2l0enQgRGlyIGltIE5hY2tlbiB1bmQgRHUgaGFzdCBub2NoIHVuZ2VmYWVociBkaWUgSGFlbGZ0ZSB2b3IgRGlyISIsXAorICAgICJjaGFvcyI6ICAgICAgICAgICJTY2huYXBwIERpciBEZWluZW4gRGFlbW9uIHVuZCB0ZWlsIERpciBkaWUgendlaXRlIEhhZWxmdGUgZGVyIEFyYmVpdCBtaXQgaWhtISIsXAorICAgICJrYXJhdGUiOiAgICAgICAgICJEdSBzY2hlaW5zdCBlaW5nZXNlaGVuIHp1IGhhYmVuLCBkYXNzIGhpcm5sb3NlcyBEcmF1ZmhhdWVuIG5peCBudXR6dC4gRGllIEhhZWxmdGUgaGFzdGUgdW5nZWZhZWhyIHNjaG9uIGdlc2NoYWZmdCEiLFwKKyAgICAia2F0emVua3JpZWdlciI6ICAiU28gdW5nZWZhZWhyIGJpcyB6dXIgSGFlbGZ0ZSBoYXN0IER1IERpY2ggc2Nob24gYW4gZGllIG5ldWUgU3R1ZmUgaGVyYW5nZXNjaGxpY2hlbiEiLFwKKyAgICAidGFuamlhbiI6ICAgICAgICAiTWFuIGthbm4gZGVuIFdlcnQgendpc2NoZW4gZGVuIGJlaWRlbiBTdHVmZW4gZHVyY2hhdXMgYWxzIGF1c2dld29nZW4gYmV6ZWljaG5lbi4gVHJvdHpkZW0gaGFzdCBEdSBub2NoIGVpbiBTdHVlY2sgZGVzIFdlZ2VzIHZvciBEaXIhIixcCisgICAgImJpZXJzY2h1ZXR0bGVyIjogIldhciBkYXMgRmFzcyBudSBoYWxiIHZvbGwgb2RlciBoYWxiIGxlZXI/IEplZGVuZmFsbHMgYmlzdGUgdW5nZWZhZWhyIGJlaSBkZXIgSGFlbGZ0ZSBhbmdla29tbWVuISIsXAorICAgICJ3ZXJ3b2VsZmUiIDogICAgICJOb2NoIGVpbmlnZSBHZWduZXIgd2VyZGVuIHNpY2ggdm9yIERpciBmdWVyY2h0ZW4gbXVlc3Nlbiwgb2J3b2hsIER1IHNjaG9uIHZpZWwgZ2VzY2hhZmZ0IGhhc3QhIixcCisgIF0pCisjZGVmaW5lIGtvc3Rlbl82MCBcCisgIChbMDogICAgICAgICAgICAgICAgIkFsc28gZWluIGJpc3NjaGVuIHdhcyBtdXNzdCBEdSBub2NoIHR1biwgYWJlciBlcyBzaWVodCBzY2hvbiB6aWVtbGljaCBndXQgYXVzISIsXAorICAgICJ6YXViZXJlciI6ICAgICAgICJFaW4gYmlzc2NoZW4gV2lsbGUgdW5kIE1hZ2llIHVuZCBEdSBzY2hhZmZzdCBlcyB3aWVkZXIgZWluIFN0dWVjayBuYWVoZXIgYW4gZGllIG5ldWUgU3R1ZmUgaGVyYW56dWtvbW1lbiEiLFwKKyAgICAia2FlbXBmZXIiOiAgICAgICAiU3RhZXJrZSBEZWluZW4gS2FtcGZ3aWxsZW4uIERpZSBncm9lc3N0ZW4gQW5zdHJlbmd1bmdlbiBoYXN0IER1IHNjaG9uIGhpbnRlciBEaXIhIixcCisgICAgImtsZXJ1cyI6ICAgICAgICAgIlNvIG5haCBhbSBaaWVsIHdpcnN0IER1IGRvY2ggbmljaHQgYXVmZ2ViZW4gd29sbGVuLiBIb2wgRGlyIG5vY2ggZWluIGJpc3NjaGVuIGdvZXR0bGljaGUgVW50ZXJzdHVldHp1bmcgdW5kIHdlaXRlciBnZWh0cyEiLFwKKyAgICAiY2hhb3MiOiAgICAgICAgICAiQ2hhb3Rpc2NoIHNlaW4gYWxsZWluZSBoaWxmdCBuaWNodC4gRWluIGJpc3NjaGVuIHdhcyBtdXNzdCBEdSBzY2hvbiBub2NoIHR1biEiLFwKKyAgICAia2FyYXRlIjogICAgICAgICAiRGllIEhhbmRrYW50ZW4gZ2VzY2hhZXJmdCwgZGVuIEdpIGZlc3QgenVnZWJ1bmRlbi4gQmFsZCBoYXN0IER1IGVzIGdlc2NoYWZmdCEiLFwKKyAgICAia2F0emVua3JpZWdlciI6ICAiQXVmIFNhbXRwZm90ZW4gc2NobGVpY2hzdCBEdSBtaXQgZ3Jvc3NlbiBTY2hyaXR0ZW4gYW5zIFppZWwgaGVyYW4uIEFiZXIgZWluIGJpc3NjaGVuIGZlaGx0IG5vY2ghIixcCisgICAgInRhbmppYW4iOiAgICAgICAgIkVpbmUgUXVlc3QgaGllciwgZWluIHBhYXIgTW9uc3RlciBkYS4gQWJlciBpbW1lciBzY2hvZW4gYXVzZ2VnbGljaGVuIGJsZWliZW4sIGRhbm4ga2xhcHB0cyBhdWNoIHdlaXRlcmhpbiEiLFwKKyAgICAiYmllcnNjaHVldHRsZXIiOiAiTm9jaCBlaW4gcGFhciBrcmFlZnRpZ2UgU2NobHVja2UgdW5kIER1IGhhc3QgZXMgZmFzdCBnZXNjaGFmZnQhIixcCisgICAgIndlcndvZWxmZSIgOiAgICAgIlZlcmxhc3MgRGVpbiBSdWRlbCB1bmQgemllaCBoaW5hdXMgaW5zIEFiZW50ZXVlci4gRGFubiB3aXJzdCBEdSBiYWxkIHNpZWdyZWljaCBoZWlta2VocmVuISIsXAorICBdKQorI2RlZmluZSBrb3N0ZW5fODAgXAorICAoWzA6ICAgICAgICAgICAgICAgICJIdWNoIG5hIHNvd2FzLCBEdSBoYXN0IGRpZSBuYWVjaHN0ZSBTdHVmZSBqYSBzY2hvbiBmYXN0IGVycmVpY2h0LiBOYSBhbHNvISBEZXIgUmVzdCBpc3QgamEgd2lya2xpY2ggbnVyIG5vY2ggS2xlaW5rcmFtISIsXAorICAgICJ6YXViZXJlciI6ICAgICAgICJEaWUgcGFhciBmZWhsZW5kZW4gUHVlbmt0Y2hlbiBoYXN0ZSBEaXIgZG9jaCByYXNjaCB6dXNhbW1lbmdlemF1YmVydCEiLFwKKyAgICAia2FlbXBmZXIiOiAgICAgICAiRGFzIGZlaGxlbmRlIGJpc3NjaGVuIG1hY2hzdCBEdSBhbHMgZ25hZGVubG9zIGd1dGVyIEthZW1wZmVyIGRvY2ggbWl0IExpbmtzLiBKZXR6dCBoYWx0IERpY2ggYWJlciBtYWwgcmFuLiBPZGVyIHdpbGxzdCBEdSBEaWNoIGF1ZiBkZW0gbGV0enRlbiBTdHVlY2sgbm9jaCB2b24gc28gZWluZW0gbHVzY2hpZ2VuIFphdWJlcmVyIHVlYmVycnVuZGVuIGxhc3Nlbj8iLFwKKyAgICAia2xlcnVzIjogICAgICAgICAiQmVpIFNhcGhpbmEsIEthbmRyaSB1bmQgTGVtYm9sZCwgRHUgYmlzdCBmYXN0IGJlaSBkZXIgbmFlY2hzdGVuIFN0dWZlIGFuZ2Vrb21tZW4hIixcCisgICAgImNoYW9zIjogICAgICAgICAgIkJvZXNlIHdhZWhydCBhbSBsYWVuZ3N0ZW4uIEZhc3QgaGFzdCBEdSBlcyBnZXNjaGFmZnQhIixcCisgICAgImthcmF0ZSI6ICAgICAgICAgIlNvIHZpZWxlIGJsYXVlIEZsZWNrZW4gd2llIER1IGFuIEFybWVuIHVuZCBCZWluZW4gaGFzdCwga2FubiBkaWUgbmFlY2hzdGUgU3R1ZmUgbmljaHQgbWVociB3ZWl0IHNlaW4hIixcCisgICAgImthdHplbmtyaWVnZXIiOiAgIlBhc3MgYmxvc3MgYXVmLCBkYXNzIERpY2ggYXVmIGRlbiBsZXR6dGVuIFplbnRpbWV0ZXJuIG5pY2h0IG5vY2ggZWluIEh1bmQgZXJ3aXNjaHQhIixcCisgICAgInRhbmppYW4iOiAgICAgICAgIlNpYW1pbCB3aXJkIHN0b2x6IGF1ZiBEaWNoIHNlaW4uIER1IGhhc3QgRGljaCBnZWdlbiBHdXQgdW5kIEJvZXNlIGR1cmNoZ2VzZXR6dCB1bmQgZGFzIFppZWwgZmFzdCBlcnJlaWNodCEiLFwKKyAgICAiYmllcnNjaHVldHRsZXIiOiAiTGFuZ2UgbXVzc3QgRHUgbmljaHQgbWVociB3YXJ0ZW4uIEthbm5zdCBydWhpZyBzY2hvbiBtYWwgZWluIGZyaXNjaGVzIEJpZXIgaW4gQXVmdHJhZyBnZWJlbiEiLFwKKyAgICAid2Vyd29lbGZlIiA6ICAgICAiTm9jaCBlaW4gbGV0enRlcyBNYWwgZGllIGZ1ZXJjaHRlcmxpY2hlbiBLcmFsbGVuIHNjaGFlcmZlbiwgZGFubiBoYXN0IER1IERlaW5lbiBuZXVlbiBMZXZlbCBlcnJlaWNodCEiLFwKKyAgXSkKKwordm9pZCBjcmVhdGUoKQoreworICBpZiAob2JqZWN0X25hbWUodGhpc19vYmplY3QoKSkgPT0gX19GSUxFX19bMC4uPDNdKSB7CisgICAgICBzZXRfbmV4dF9yZXNldCgtMSk7CisgICAgICByZXR1cm47CisgIH0KKyAgcm9vbTo6Y3JlYXRlKCk7CisKKyAgQWRkQ21kKCJrb3N0ZW4iLCJrb3N0ZW4iKTsKKyAgQWRkQ21kKCJsaXN0ZSIsImxpc3RlIik7CisgIEFkZENtZCgiZXJob2VoZSIsImFkdmFuY2UiKTsKKyAgQWRkQ21kKCh7InRyZWZmIn0pLCAiR290b01hZ2llclRyZWZmIik7CisgfQorCit2b2lkIGluaXQoKQoreworICBpbnQgbHZsOworICByb29tOjppbml0KCk7CisKKyAgaWYgKFBMICYmIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoUEwpCisgICAgICAmJiAobHZsPVBMLT5RdWVyeVByb3AoUF9MRVZFTCkpIDw9IDYKKyAgICAgICYmIExFUE1BU1RFUi0+UXVlcnlMZXZlbChQTC0+UXVlcnlQcm9wKFBfTEVQKSkgPiBsdmwpCisgIHsKKyAgICB0ZWxsX29iamVjdChQTCwKKyAgICAgICJcbkR1IGtvZW5udGVzdCBEZWluZSBTdHVmZSBtaXQgXCJlcmhvZWhlIHNwaWVsZXJcIiBoaWVyIGluIGRlciBHaWxkZSAiCisgICAgICAiZXJob2VoZW4uXG5cbiIpOworICB9Cit9CisKK3N0cmluZyB6ZWlnZV9yZWJvb3QoKQoreworICBzdHJpbmcgc3RyOworICBpbnQgdCx0MjsKKworICB0PXRpbWUoKS1sYXN0X3JlYm9vdF90aW1lKCk7CisgIHQyPXQ7CisgIHN0cj0iU2VpdCBkZW0gbGV0enRlbiBTaHV0ZG93biBzaW5kICIrdCsiIFNla3VuZGVuIHZlcmdhbmdlbi5cbiI7CisgIGlmICh0PDYwKSByZXR1cm4gc3RyOworICBzdHIrPSJEYXMgc2luZCAiOworICBpZiAodD49ODY0MDApCisgIHsKKyAgICBzdHIrPXQvODY0MDArIiBUYWciOworICAgIGlmICh0Pj04NjQwMCoyKQorICAgICAgc3RyKz0iZSI7CisgICAgc3RyKz0iLCAiOworICAgIHQyPXQyJTg2NDAwOworICB9CisgIGlmICh0Pj0zNjAwKQorICB7CisgICAgc3RyKz10Mi8zNjAwKyIgU3R1bmRlIjsKKyAgICBpZiAodDIvMzYwMCE9MSkKKyAgICAgIHN0cis9Im4iOworICAgIHN0cis9IiwgIjsKKyAgICB0Mj10MiUzNjAwOworICB9CisgIGlmICh0Pj02MCkKKyAgeworICAgIHN0cis9dDIvNjArIiBNaW51dGUiOworICAgIGlmICh0Mi82MCE9MSkKKyAgICAgIHN0cis9Im4iOworICAgIHN0cis9IiB1bmQgIjsKKyAgICB0Mj10MiU2MDsKKyAgfQorICBzdHIrPXQyKyIgU2VrdW5kZSI7CisgIGlmICh0MiE9MSkKKyAgICBzdHIrPSJuIjsKKyAgc3RyKz0iLlxuIjsKKyAgcmV0dXJuIHN0cjsKK30KKworaW50IHNlZXJfY29uZChpbnQgc2lsZW50KQoreworICBpbnQgY29uZDsKKworICBjb25kPUxFUE1BU1RFUi0+UXVlcnlSZWFkeUZvcldpeih0aGlzX3BsYXllcigpKTsKKworICBpZiAoIXNpbGVudCkKKyAgICB3cml0ZShicmVha19zdHJpbmcoTEVQTUFTVEVSLT5RdWVyeVJlYWR5Rm9yV2l6VGV4dCh0aGlzX3BsYXllcigpKSwKKyAgICAgICAgICA3OCwgMCwgMSkpOworCisgIHJldHVybiBjb25kOworfQorCit2YXJhcmdzIGludCBrb3N0ZW4oc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIHRtcDsKKworICBpbnQgbGVwID0gUEwtPlF1ZXJ5UHJvcChQX0xFUCk7CisgIGludCBsdmwgPSBQTC0+UXVlcnlQcm9wKFBfTEVWRUwpOworICBpbnQgZGlmZiA9IExFUE1BU1RFUi0+UXVlcnlOZXh0TGV2ZWxMRVAobHZsLCBsZXApOworCisgIHN3aXRjaCAoIGRpZmYgKSB7CisgICAgY2FzZSAxMDEuLl9fSU5UX01BWF9fOgorICAgICAgLy8gRmFsbHMgbWFsIExFUHMgYWJoYW5kZW5nZWtvbW1lbiBzaW5kLi4uCisgICAgICB0bXAgPSAiV2llIGJpc3QgRHUgdWViZXJoYXVwdCBhbiBEZWluZW4gTGV2ZWwgZ2Vrb21tZW4/XG4iCisgICAgICAiU2VpIGZyb2gsIGRhc3MgRHUgbmljaHQgd2llZGVyIGFiZ2VzdHVmdCB3aXJzdC4iOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDgxLi4xMDA6CisgICAgICB0bXA9a29zdGVuXzBbUEwtPlF1ZXJ5UHJvcChQX0dVSUxEKV0gfHwga29zdGVuXzBbMF07CisgICAgICBicmVhazsKKworICAgIGNhc2UgNjEuLjgwOgorICAgICAgdG1wPWtvc3Rlbl8yMFtQTC0+UXVlcnlQcm9wKFBfR1VJTEQpXSB8fCBrb3N0ZW5fMjBbMF07CisgICAgICBicmVhazsKKworICAgIGNhc2UgNDEuLjYwOgorICAgICAgdG1wPWtvc3Rlbl80MFtQTC0+UXVlcnlQcm9wKFBfR1VJTEQpXSB8fCBrb3N0ZW5fNDBbMF07CisgICAgICBicmVhazsKKworICAgIGNhc2UgMjEuLjQwOgorICAgICAgdG1wPWtvc3Rlbl82MFtQTC0+UXVlcnlQcm9wKFBfR1VJTEQpXSB8fCBrb3N0ZW5fNjBbMF07CisgICAgICBicmVhazsKKworICAgIGNhc2UgMS4uMjA6CisgICAgICB0bXA9a29zdGVuXzgwW1BMLT5RdWVyeVByb3AoUF9HVUlMRCldIHx8IGtvc3Rlbl84MFswXTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGlmICggbHZsIDwgOSApCisgICAgICAgIHRtcCA9ICJQcm9iaWVyIG1hbCBkZW4gQmVmZWhsICdlcmhvZWhlJy4iOworICAgICAgZWxzZQorICAgICAgICB0bXAgPSAiRGVuIEJlZmVobCAnZXJob2VoZScga2VubnN0IER1IGFiZXIsIGphPyI7CisgICAgICBicmVhazsKKyAgfQorCisgIHdyaXRlKCBicmVha19zdHJpbmcoIHRtcCwgNzgsIDAsIEJTX0xFQVZFX01ZX0xGUyApICk7CisKKyAgaWYgKCFJU19TRUVSKHRoaXNfcGxheWVyKCkpIAorICAgICAgJiYgKCAoc3RyID09ICJsYW5nIikgfHwKKyAgICAgICAgKHRoaXNfcGxheWVyKCktPlF1ZXJ5UHJvcChQX0xFVkVMKSA+IDEyICYmIHN0ciAhPSAia3VyeiIpKSkgeworICAgIHNlZXJfY29uZCgwKTsKKyAgICB3cml0ZSAoYnJlYWtfc3RyaW5nKCJcbk1pdCAna29zdGVuIGt1cnonIGthbm5zdCBEdSBkaWUgQW5nYWJlIGRlciAiCisgICAgICAgICAgIlNlaGVyLUFuZm9yZGVydW5nZW4gdW50ZXJkcnVlY2tlbi4iLCA3OCwwLDEpKTsKKyAgfQorCisgIHJldHVybiAxOworfQorCisvLyBlcm1pdHRlbHQgR2lsZGVudGl0ZWwgenVtIExldmVsIDxsZXY+LgorLy8gRGVyIGxldHp0ZSB2ZXJmdWVnYmFyZSBHaWxkZW50aXRlbCB3aXJkIG51ciBmdWVyIFNlaGVyIHZlcmdlYmVuLgorLy8gVE9ETzogbWl0IGRlbSBlbnRzcHJlY2hlbmRlbiBDb2RlIGF1cyBnaWxkZW5fb2IuYyB2ZXJlaW5pZ2VuPworc3RyaW5nIGdldF9uZXdfdGl0bGUoaW50IGxldiwgb2JqZWN0IHBsKQoreworICBtYXBwaW5nIHRpdGxlczsKKworICBpZiAoIXBsKSByZXR1cm4gMDsKKworICBpZiAobGV2PDApIGxldj0wOworCisgIGlmIChwbC0+UXVlcnlQcm9wKFBfR0VOREVSKSA9PSBNQUxFKQorICAgIHRpdGxlcz0obWFwcGluZylRdWVyeVByb3AoUF9HVUlMRF9NQUxFX1RJVExFUyk7CisgIGVsc2UKKyAgICB0aXRsZXM9KG1hcHBpbmcpUXVlcnlQcm9wKFBfR1VJTERfRkVNQUxFX1RJVExFUyk7CisKKyAgaWYgKCFtYXBwaW5ncCh0aXRsZXMpIHx8ICFzaXplb2YodGl0bGVzKSkgcmV0dXJuIDA7CisKKyAgaW50IG1heGxldmVsID0gbWF4KG1faW5kaWNlcyh0aXRsZXMpKTsKKworICAvLyBMZXZlbCBiZWdyZW56ZW4uIE1heC1MZXZlbCBmdWVyIFNlaGVyLgorICBpZiAobGV2ID49IG1heGxldmVsKQorICAgIGxldiA9IElTX1NFRVIocGwpID8gbWF4bGV2ZWwgOiBtYXhsZXZlbC0xOworCisgIHJldHVybiB0aXRsZXNbbGV2XTsKK30KKworLy8gdmVyc3VjaHQgZGFzIFNwaWVsZXJsZXZlbCB6dSBlcmhvZWhlbi4gTWFjaHQgbmljaHQgZGVuIGdhbnplbiBLcmFtcworLy8gZHJ1bXJ1bSwgZGVuIGFkdmFuY2UoKSBhdXMgaHlzdGVyaXNjaGVuIEdydWVuZGVuIHR1dC4KK2ludCB0cnlfcGxheWVyX2FkdmFuY2Uob2JqZWN0IHBsKSB7CisKKyAgaWYgKFBMLT5RdWVyeVByb3AoUF9LSUxMUyk+MCkKKyAgICByZXR1cm4gLTE7CisKKyAgaW50IGxldmVsID0gcGwtPlF1ZXJ5UHJvcCggUF9MRVZFTCApOworICBpZiAobGV2ZWwgPT0gLTEpIGxldmVsID0gMDsKKworICBpZiAoTEVQTUFTVEVSLT5RdWVyeU5leHRMZXZlbExFUChsZXZlbCwgcGwtPlF1ZXJ5UHJvcChQX0xFUCkpID4gMCkKKyAgICAgIHJldHVybiAwOworICBlbHNlCisgICAgICArK2xldmVsOworCisgIHBsLT5TZXRQcm9wKCBQX0xFVkVMLCBsZXZlbCApOworCisgIC8vIEF1ZnN0aWVncy1FdmVudCBhdXNsb2VzZW4KKyAgRVZFTlRELT5UcmlnZ2VyRXZlbnQoRVZUX0xJQl9BRFZBTkNFLCAoWworICAgICAgICBFX09CSkVDVDogUEwsIEVfUExOQU1FOiBnZXR1aWQoUEwpLAorICAgICAgICBFX0VOVklST05NRU5UOiBlbnZpcm9ubWVudChQTCksCisgICAgICAgIEVfR1VJTEROQU1FOiBQTC0+UXVlcnlQcm9wKFBfR1VJTEQpLAorICAgICAgICBQX0xFVkVMOiBQTC0+UXVlcnlQcm9wKFBfTEVWRUwpLAorICAgICAgICBdKSApOworCisgIC8vIEZhbGxzIGRpZSBrb25rcmV0ZSBHaWxkZSBkZXMgU3BpZWxlcm4gaXJnZWR3YXMgbWl0IGRlbSBUaXRlbCBpbgorICAvLyBBQmhhZW5naWdrZWl0IGRlcyBTcGllbGVybGV2ZWxzIHR1biB3aWxsLiBBdXNuYWhtc3dlaXNlIHBlciBjYWxsX290aGVyLAorICAvLyBkaWUgRnVua3Rpb24ga29tbXQgZWlnZW50bGljaCBhdXMgL3N0ZC9naWxkZW5fb2IuYy4KKyAgc3RyaW5nIGduYW1lPShzdHJpbmcpcGwtPlF1ZXJ5UHJvcChQX0dVSUxEKTsKKyAgKEdVSUxEX0RJUisiLyIrZ25hbWUpLT5hZGp1c3RfdGl0bGUocGwpOworCisgIHJldHVybiAxOworfQorCisvLyAiZXJob2VoZSItS29tbWFuZG8uCisvLyBlcmhvZWh0IGRhcyBTcGllbGVybGV2ZWwsIGZhbGxzIG1vZWdsaWNoLiBTZXR6dCBkZW4gcGFzc2VuZGVuCisvLyBBYmVudGV1cmVyZ2lsZGVudGl0ZWwuCitpbnQgYWR2YW5jZShzdHJpbmcgYXJnKQoreworCisgIGlmIChhcmcgJiYKKyAgICAgIGFyZyAhPSAic3R1ZmUiICYmIGFyZyAhPSAic3BpZWxlcnN0dWZlIiAmJiBhcmcgIT0gInNwaWVsZXIiCisgICAgICAmJiBhcmcgIT0gInNwaWVsZXJsZXZlbCIpCisgICAgcmV0dXJuIDA7CisKKyAgaW50IHJlcyA9IHRyeV9wbGF5ZXJfYWR2YW5jZShQTCk7CisKKyAgaWYgKCFyZXMpCisgICAgcmV0dXJuIGtvc3Rlbigia3VyeiIpOworICBlbHNlIGlmIChyZXMgPCAwKSB7CisgICAgbm90aWZ5X2ZhaWwoYnJlYWtfc3RyaW5nKAorICAgICAgICAiRHUgaGFzdCBlaW5lbiBNaXRzcGllbGVyIHVtZ2VicmFjaHQhXG4iKworICAgICAgICAiSW4gZGllc2VtIEZhbGwga2FubnN0IER1IERlaW5lIFN0dWZlIG5pY2h0IGVyaG9laGVuLlxuIisKKyAgICAgICAgIkJpdHRlIHdlbmRlIERpY2ggYW4gZGVuIFNoZXJpZmYgKG9kZXIgZWluZW4gRXJ6bWFnaWVyKSB1bmQgYnJpbmcgIgorICAgICAgICAiZGFzIGluIE9yZG51bmcuXG4iLDc4LEJTX0xFQVZFX01ZX0xGUykpOworICAgIHNheShicmVha19zdHJpbmcoUEwtPk5hbWUoV0VSKSAKKyAgICAgICAgICArICIgaGF0IHNvZWJlbiBhdWYgc2NobWVyemxpY2hlIFdlaXNlIGVyZmFocmVuIG11ZXNzZW4sIGRhc3MgIgorICAgICAgICAgICJlcyB3aXJrbGljaCBuaWNodCBmb2VyZGVybGljaCBpc3QsIE1pdHNwaWVsZXIgdW16dWJyaW5nZW4uXG4iLAorICAgICAgICAgIDc4KSwgUEwpOworICAgIHJldHVybiAwOworICB9CisKKyAgc3RyaW5nIG5hbWVfb2ZfcGxheWVyID0gUEwtPm5hbWUoV0VSKTsKKyAgaW50IGxldmVsID0gUEwtPlF1ZXJ5UHJvcChQX0xFVkVMKTsKKyAgc2F5KCBuYW1lX29mX3BsYXllciArICIgaGF0IGpldHp0IFN0dWZlICIgKyBsZXZlbCArICIgZXJyZWljaHQuXG4iKTsKKworICBzdHJpbmcgdGl0bGUgPSBQTC0+UXVlcnlQcm9wKFBfVElUTEUpOworCisgIHN3aXRjaChyYW5kb20oMykpIHsKKyAgICBjYXNlIDA6CisgICAgICB3cml0ZSgiRHUgYmlzdCBqZXR6dCAiICsgbmFtZV9vZl9wbGF5ZXIgKyAiICIgKyB0aXRsZSArCisgICAgICAgICIgKFN0dWZlICIgKyBsZXZlbCArICIpLlxuIik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgMToKKyAgICAgIHdyaXRlKCJHdXQgZ2VtYWNodCwgIiArIG5hbWVfb2ZfcGxheWVyICsgIiAiICsgdGl0bGUgKworICAgICAgICAiIChTdHVmZSAiICsgbGV2ZWwgKyAiKS5cbiIpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgd3JpdGUoIldpbGxrb21tZW4gYXVmIERlaW5lciBuZXVlbiBTdHVmZS5cbiIgKworICAgICAgICAiRHUgYmlzdCBqZXR6dCAiICsgbmFtZV9vZl9wbGF5ZXIrIiAiKyB0aXRsZSArCisgICAgICAgICIgKFN0dWZlICIgKyBsZXZlbCArICIpLlxuIik7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiAxOworfQorCisvLyBTcGllbGVya29tbWFuZG8gZnVlciBBYmVudGV1cmVybGlzdGUKK3ZhcmFyZ3MgaW50IGxpc3RlKG1peGVkIHBsKQoreworICBzdHJpbmcgc3RyOyAKKyAgaWYgKCF0aGlzX3BsYXllcigpKSByZXR1cm4gMDsKKworICBpZighb2JqZWN0cChwbCkpCisgICAgaWYoc3RyaW5ncChwbCkpCisgICAgICBwbD1maW5kX3BsYXllcihwbCl8fGZpbmRfbmV0ZGVhZChwbCk7CisgIGlmKCFvYmplY3RwKHBsKSkKKyAgICBwbD1QTDsKKyAgaWYgKHBsICE9IHRoaXNfcGxheWVyKCkpIHsKKyAgICB3cml0ZSAoIkR1IGthbm5zdCBEaXIgbnVyIERlaW5lIGVpZ2VuZW4gQWJlbnRldWVyIGFuc2VoZW4uXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHN0ciA9IFFNLT5saXN0ZShwbCk7CisKKyAgdGhpc19wbGF5ZXIoKS0+TW9yZSggc3RyLCAwICk7CisgIHJldHVybiAxOworfQorCitpbnQgR290b01hZ2llclRyZWZmKCkKK3sKKyAgaWYoSVNfTEVBUk5FUih0aGlzX3BsYXllcigpKSkKKyAgeworICAgIHdyaXRlKCJFaW4gWmF1YmVyc3BydWNoIHppZWh0IHZvciBEZWluZW0gZ2Vpc3RpZ2VuIEF1Z2Ugdm9yYmVpIHVuZCBEdVxuIgorICAgICJzcHJpY2hzdCBpaG4gbmFjaC5cbiIpOworICAgIHNheShQTC0+bmFtZSgpKyIgbXVybWVsdCBlaW5lbiBnZWhlaW1lbiBaYXViZXJzcHJ1Y2ggdW5kIHNjaHdlYnQgbGFuZ3NhbVxuIgorICAgICJ6dXIgRGVja2UgaGluYXVmIHVuZCB2ZXJzY2h3aW5kZXQgZHVyY2ggZGllIFdhbmQuXG4iKTsKKyAgICB3cml0ZSgiRHUgc2Nod2Vic3QgbGFuZ3NhbSB6dXIgRGVja2UgaGluYXVmIHVuZCBhbHMgb2IgZGllc2UgbmljaHQgZGFcbiIKKyAgICAid2FlcmUgbWl0dGVuIGhpbmR1cmNoIGluIGRlbiBNYWdpZXJ0cmVmZi5cbiIpOworICAgIHJldHVybiAoUEwtPm1vdmUoIi9zZWN1cmUvbWVybGluIiwgTV9UUE9SVCB8IE1fU0lMRU5UICkgPj0gMCk7CisgIH0KKyAgd3JpdGUoIkR1IHNwcmluZ3N0IHp1ciBEZWNrZSBoaW5hdWYgdW5kIG5peCBwYXNzaWVydC5cbiIpOworICByZXR1cm4gMTsKK30KKwpkaWZmIC0tZ2l0IGEvc3RkL2dpbGRlbl9vYi5jIGIvc3RkL2dpbGRlbl9vYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MDVhY2MKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvZ2lsZGVuX29iLmMKQEAgLTAsMCArMSw0NjIgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBnaWxkZW5fb2IuYyAtLSBCYXNpc2Z1bmt0aW9uZW4gZWluZXIgR2lsZGUKKy8vCisvLyAkSWQ6IGdpbGRlbl9vYi5jIDg0MzMgMjAxMy0wMi0yNCAxMzo0Nzo1OVogWmVzc3RyYSAkCisjcHJhZ21hIHN0cmljdF90eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIG5vX3NoYWRvdworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBwZWRhbnRpYworCitpbmhlcml0ICIvc3RkL3Jlc3RyaWN0aW9uX2NoZWNrZXIiOworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxhdHRyaWJ1dGVzLmg+CisjaW5jbHVkZSA8bmV3X3NraWxscy5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxwbGF5ZXIvZmFvLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisKK3ZvaWQgY3JlYXRlKCkgeworICAgIC8vIFBfR1VJTERfU0tJTExTIHNvbGx0ZSBuaWNodCBkaXJla3Qgdm9uIGF1c3NlbiBtYW5pcHVsaWVydCB3ZXJkZW4uLi4KKyAgICBTZXRQcm9wKFBfR1VJTERfU0tJTExTLChbXSkpOworICAgIFNldChQX0dVSUxEX1NLSUxMUyxQUk9URUNURUQsRl9NT0RFX0FTKTsKK30KKworbWFwcGluZyBfcXVlcnlfZ3VpbGRfc2tpbGxzKCkgeworICAgIC8vIGVpbmUgS29waWUgenVydWVja2xpZWZlcm4sIHVtIHZlcnNlaGVudGxpY2hlIEFlbmRlcnVuZ2VuIGRlcworICAgIC8vIE9yaWdpbmFsbWFwcGluZ3MgaW4gZGVyIEdpbGRlIHp1IHZlcm1laWRlbi4KKyAgICAvLyBEYXJmIG5pY2h0IG9obmUgd2VpdGVyZXMgZW50ZmVybnQgd2VyZGVuLCBkYSBlcyBoaWVyIGltIEZpbGUgQ29kZSBnaWJ0LAorICAgIC8vIGRlciBzaWNoIGF1ZiBkaWUgS29waWUgdmVybGFlc3N0LgorICAgIHJldHVybihkZWVwX2NvcHkoUXVlcnkoUF9HVUlMRF9TS0lMTFMpKSk7Cit9CisKK3N0cmluZyBHdWlsZE5hbWUoKSB7CisgIC8vR2lsZGVuIG11ZXNzZW4gQmx1ZXByaW50cyBzZWluLCBzby4gOy0pCisgIHJldHVybiBvYmplY3RfbmFtZSh0aGlzX29iamVjdCgpKVs4Li5dOworfQorCit2YXJhcmdzIGludAorSXNHdWlsZE1lbWJlcihvYmplY3QgcGwpIHsKKyAgc3RyaW5nIHBsZzsKKworICBpZiAoIXBsICYmICEocGw9dGhpc19wbGF5ZXIoKSkpCisgICAgcmV0dXJuIDA7CisgIGlmICghKHBsZz0oc3RyaW5nKXBsLT5RdWVyeVByb3AoUF9HVUlMRCkpKQorICAgIHJldHVybiAwOworICBpZiAoR3VpbGROYW1lKCkhPXBsZykgeworICAgIF9ub3RpZnlfZmFpbCgiRHUgZ2Vob2Vyc3QgZGllc2VyIEdpbGRlIG5pY2h0IGFuIVxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2ludCBjaGVja19jb25kKG1peGVkIGNvbmQpIHsKKyAgc3RyaW5nIHJlczsKKworICBpZiAoaW50cChjb25kKSkgeworICAgIF9ub3RpZnlfZmFpbCgiRGlyIGZlaGx0IG5vY2ggZGllIG5vZXRpZ2UgRXJmYWhydW5nLiAiKworICAgICAgICAgICAgICAgICJLb21tIHNwYWV0ZXIgd2llZGVyLlxuIik7CisgICAgcmV0dXJuICh0aGlzX3BsYXllcigpLT5RdWVyeVByb3AoUF9YUCk+PWNvbmQpOworICB9CisgIGlmIChtYXBwaW5ncChjb25kKSkgeworICAgIHJlcz1jaGVja19yZXN0cmljdGlvbnModGhpc19wbGF5ZXIoKSxjb25kKTsKKyAgICBpZiAoIXN0cmluZ3AocmVzKSkgcmV0dXJuIDE7CisgICAgX25vdGlmeV9mYWlsKHJlcyk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2ludCBjYW5fYWR2YW5jZSgpIHsKKyAgaW50IGx2OworICBtYXBwaW5nIGx2czsKKworICBpZiAoIShsdj0oaW50KXRoaXNfcGxheWVyKCktPlF1ZXJ5UHJvcChQX0dVSUxEX0xFVkVMKSkpIHJldHVybiAxOworICBpZiAoIShsdnM9UXVlcnlQcm9wKFBfR1VJTERfTEVWRUxTKSkpIHJldHVybiAwOworICByZXR1cm4gY2hlY2tfY29uZChsdnNbbHYrMV0pOyAvLyBCZWRpbmd1bmcgZnVlciBuYWVjaHN0ZW4gTGV2ZWwgdGVzdGVuLgorfQorCit2b2lkIGFkanVzdF90aXRsZShvYmplY3QgcGwpIHsKKyAgaW50IGx2OworICBtaXhlZCB0aTsKKworCisgIGlmICghcGwgfHwKKyAgICAgICEobHY9KGludClwbC0+UXVlcnlQcm9wKFBfR1VJTERfTEVWRUwpKSkKKyAgICByZXR1cm47CisgIHN3aXRjaCgoaW50KXBsLT5RdWVyeVByb3AoUF9HRU5ERVIpKSB7CisgIGNhc2UgTUFMRToKKyAgICB0aT1RdWVyeVByb3AoUF9HVUlMRF9NQUxFX1RJVExFUyk7CisgICAgYnJlYWs7CisgIGNhc2UgRkVNQUxFOgorICAgIHRpPVF1ZXJ5UHJvcChQX0dVSUxEX0ZFTUFMRV9USVRMRVMpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIHJldHVybjsKKyAgfQorICBpZiAobWFwcGluZ3AodGkpKQorICAgIHRpPXRpW2x2XTsKKyAgaWYgKHN0cmluZ3AodGkpKQorICAgIHBsLT5TZXRQcm9wKFBfR1VJTERfVElUTEUsdGkpOworICAKKyAgLy8gU3BpZWxlcnRpdGVsIG51bGxlbiwgZGFtaXQgZGVyIEdpbGRlbnRpdGVsIGFuZ2V6ZWlndCB3aXJkLgorICBpZiAoIUlTX1NFRVIocGwpICYmICFGQU9fSEFTX1RJVExFX0dJRlQocGwpKQorICAgICAgcGwtPlNldFByb3AoUF9USVRMRSwwKTsKK30KKwordm9pZCBkb19hZHZhbmNlKCkgeworICBpbnQgbHY7CisKKyAgbHY9dGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKFBfR1VJTERfTEVWRUwpKzE7CisgIGlmIChsdjwxKSBsdj0xOworICB0aGlzX3BsYXllcigpLT5TZXRQcm9wKFBfR1VJTERfTEVWRUwsbHYpOworICBhZGp1c3RfdGl0bGUodGhpc19wbGF5ZXIoKSk7Cit9CisKK2ludCB0cnlfYWR2YW5jZSgpIHsKKyAgaWYgKGNhbl9hZHZhbmNlKCkpIHsKKyAgICBpZiAoSXNHdWlsZE1lbWJlcih0aGlzX3BsYXllcigpKSkKKyAgICAgIGRvX2FkdmFuY2UoKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworaW50IGJlaXRyZXRlbigpIHsKKyAgc3RyaW5nIHJlczsKKyAgaW50IGVyZzsKKworICBpZiAocmVzPWNoZWNrX3Jlc3RyaWN0aW9ucyh0aGlzX3BsYXllcigpLFF1ZXJ5UHJvcChQX0dVSUxEX1JFU1RSSUNUSU9OUykpKSB7CisgICAgLy8gV2VyZGVuIGRpZSBCZWl0cml0dHNiZWRpbmd1bmdlbiBlcmZ1ZWxsdD8KKyAgICBwcmludGYoIkR1IGthbm5zdCBkaWVzZXIgR2lsZGUgbmljaHQgYmVpdHJldGVuLlxuR3J1bmQ6ICVzIixyZXMpOworICAgIHJldHVybiAtMzsKKyAgfQorICBpZiAoZXJnPShpbnQpR1VJTERNQVNURVItPmJlaXRyZXRlbigpKSB7CisgICAgaWYgKGVyZzwwKQorICAgICAgcmV0dXJuIGVyZzsKKyAgICBpZiAoISh0aGlzX3BsYXllcigpLT5RdWVyeVByb3AoUF9HVUlMRF9MRVZFTCkpKQorICAgICAgdHJ5X2FkdmFuY2UoKTsgLy8gTGV2ZWwgMSB3aXJkIHNvZm9ydCB2ZXJnZWJlbgorICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQorCit2YXJhcmdzIGludCBhdXN0cmV0ZW4oaW50IGxvc3MpIHsKKyAgICByZXR1cm4gKGludClHVUlMRE1BU1RFUi0+YXVzdHJldGVuKGxvc3MpOworfQorCitpbnQgYmVpX29kZXJfYXVzX3RyZXRlbihzdHJpbmcgc3RyKSB7CisgIGlmICghc3RyKSByZXR1cm4gMDsKKyAgaWYgKHNpemVvZihyZWdleHAoKHtsb3dlcl9jYXNlKHN0cil9KSwKKyAgICAgICAgICAgICAgICAgICAgIlxcPGF1c1xcPi4qZ2lsZGVcXD4uKlxcPGF1c1xcPiIpKSkKKyAgICByZXR1cm4gYXVzdHJldGVuKCk7CisgIGlmIChzaXplb2YocmVnZXhwKCh7bG93ZXJfY2FzZShzdHIpfSksCisgICAgICAgICAgICAgICAgICAgICAiKGdpbGRlXFw+LipcXDxiZWlcXD58XFw8aW5cXD4uKmdpbGRlXFw+LipcXDxlaW5cXD4pIikpKQorICAgIHJldHVybiBiZWl0cmV0ZW4oKTsKKyAgcmV0dXJuIDA7Cit9CisKK3ZhcmFyZ3MgaW50CitBZGRTa2lsbChzdHJpbmcgc25hbWUsIG1hcHBpbmcgc2tpKSB7CisgIG1hcHBpbmcgc2tpbGxzOworCisgIGlmICghc25hbWUpCisgICAgcmV0dXJuIDA7CisKKyAgLy8gcGVyIFF1ZXJ5KCkgYWJmcmFnZW4sIGhpZXIgaXN0IGtlaW5lIEtvcGllIG5vZXRpZy4KKyAgaWYgKCFtYXBwaW5ncChza2lsbHM9UXVlcnkoUF9HVUlMRF9TS0lMTFMpKSkgeworICAgIHNraWxscz0oW10pOworICAgIFNldFByb3AoUF9HVUlMRF9TS0lMTFMsc2tpbGxzKTsKKyAgfQorICAKKyAgaWYgKCFtYXBwaW5ncChza2kpKQorICAgICAgc2tpPShbXSk7CisgIGVsc2UKKyAgICAgIC8vWnVyIFNpY2hlcmhlaXQgS29waWUgZXJzdGVsbGVuLCB3ZXIgd2Vpc3MsIHdhcyBkZXIgRWludHJhZ2VuZGUgbm9jaAorICAgICAgLy9taXQgc2VpbmVtIE1hcHBpbmcgbWFjaHQuLi4KKyAgICAgIHNraT1kZWVwX2NvcHkoc2tpKTsKKworICBpZiAoIXN0cmluZ3Aoc2tpW1NJX1NLSUxMRlVOQ10pKQorICAgIC8vIFdlbm4ga2VpbmUgRnVua3Rpb24gYW5nZWdlYmVuIGlzdCwgRnVua3Rpb25zbmFtZT1Ta2lsbG5hbWUKKyAgICBza2lbU0lfU0tJTExGVU5DXT1zbmFtZTsKKworICAvLyBHaWxkZW4tT2Zmc2V0cyBhZGRpZXJlbgorICBza2k9QWRkU2tpbGxNYXBwaW5ncyhRdWVyeVByb3AoUF9HTE9CQUxfU0tJTExQUk9QUyksc2tpKTsKKworICAvLyBTa2lsbCBzZXR6ZW4uCisgIHNraWxsc1tzbmFtZV09c2tpOworICAvL1NldFByb3AoKSB1bm5vZXRpZywgZGEgb2JlbiBwZXIgUXVlcnkoKSBkYXMgT3JpZ2luYWxtYXBwaW5nIGVyaGFsdGVuCisgIC8vd3VyZGUuCisgIC8vU2V0UHJvcChQX0dVSUxEX1NLSUxMUyxza2lsbHMpOworICByZXR1cm4gMTsKK30KKworCit2YXJhcmdzIGludAorQWRkU3BlbGwoc3RyaW5nIHZlcmIsIG1hcHBpbmcgc2tpKSB7CisgIG1hcHBpbmcgc2tpbGxzOworCisgIGlmICghdmVyYikKKyAgICAgIHJldHVybiAwOworICBpZiAoIW1hcHBpbmdwKHNraSkpCisgICAgICBza2k9KFtdKTsKKworICBpZiAoIXN0cmluZ3Aoc2tpW1NJX1NQRUxMQk9PS10pICYmCisgICAgICAhc3RyaW5ncChza2lbU0lfU1BFTExCT09LXT1RdWVyeVByb3AoUF9HVUlMRF9ERUZBVUxUX1NQRUxMQk9PSykpKQorICAgIC8vIFdlbm4ga2VpbiBTcGVsbGJvb2sgYW5nZWdlYmVuIGlzdCBtdXNzIGVpbgorICAgIC8vIERlZmF1bHQtU3BlbGxib29rIGFuZ2VnZWJlbiBzZWluLCBzb25zdCBGZWhsZXIKKyAgICByZXR1cm4gMDsKKyAgaWYgKGZpbGVfc2l6ZShTUEVMTEJPT0tfRElSK3NraVtTSV9TUEVMTEJPT0tdKyIuYyIpPDApCisgICAgcmV0dXJuIDA7IC8vIFNwZWxsYm9vayBzb2xsdGUgYXVjaCBleGlzdGllcmVuLi4uCisKKyAgcmV0dXJuIEFkZFNraWxsKGxvd2VyX2Nhc2UodmVyYiksc2tpKTsKK30KKworbWFwcGluZyBRdWVyeVNraWxsKHN0cmluZyBza2lsbCkgeworICBtYXBwaW5nIHNraTsKKworICAvLyBBYmZyYWdlIHBlciBRdWVyeSgpLCBkYSB2aWVsbGVpY2h0IG51ciBlaW4gU2tpbGwgZ2V3dWVuc2NodAorICAvLyB3aXJkIHVuZCBkYWhlciBkaWUga29tcGxldHRlIEtvcGllIGRlcyBTcGVsbG1hcHBpbmdzIGluIGRlciBRdWVyeS1NZXRob2RlCisgIC8vIHVubm9ldGlnIGlzdC4KKyAgaWYgKCFza2lsbAorICAgICAgfHwgIShza2k9UXVlcnkoUF9HVUlMRF9TS0lMTFMsIEZfVkFMVUUpKQorICAgICAgfHwgIShza2k9c2tpW3NraWxsXSkpIC8vIEdpbGRlbnNwZXppZmlzY2hlIFNraWxsZWlnZW5zY2hhZnRlbgorICAgIHJldHVybiAwOworICAvLyBoaWVyIGFiZXIgZGFubiBuYXR1ZXJsaWNoIGVpbmUgS29waWUgZXJzdGVsbGVuLiA7LSkKKyAgcmV0dXJuKGRlZXBfY29weShza2kpKTsKK30KKworbWFwcGluZyBRdWVyeVNwZWxsKHN0cmluZyBzcGVsbCkgeworICBtYXBwaW5nIHNraSxza2kyOworICBzdHJpbmcgc3BlbGxib29rLHNmdW5jOworCisgIC8vIFF1ZXJ5U2tpbGwoKSBoaWVyIHVuZCBRdWVyeVNwZWxsKCkgaW0gU3BlbGxib29rIGxpZWZlcm4gS29waWVuIGRlcgorICAvLyBTa2lsbG1hcHBpbmdzIHp1cnVlY2ssIEtvcGllcmVuIGhpZXIgZGFoZXIgdW5ub2V0aWcuCisgIGlmICghc3BlbGwKKyAgICAgIHx8ICEoc2tpPVF1ZXJ5U2tpbGwoc3BlbGwpKQorICAgICAgfHwgIShzcGVsbGJvb2s9c2tpW1NJX1NQRUxMQk9PS10pKQorICAgIHJldHVybiAwOworICBpZiAoIShzZnVuYz1za2lbU0lfU0tJTExGVU5DXSkpCisgICAgc2Z1bmM9c3BlbGw7CisgIHNwZWxsYm9vaz1TUEVMTEJPT0tfRElSK3NwZWxsYm9vazsKKyAgaWYgKCEoc2tpMj0obWFwcGluZykoc3BlbGxib29rLT5RdWVyeVNwZWxsKHNmdW5jKSkpKQorICAgIHJldHVybiAwOworICByZXR1cm4gQWRkU2tpbGxNYXBwaW5ncyhza2kyLHNraSk7IC8vIFJlaWhlbmZvbGdlIHdpY2h0aWchCisgIC8vIERpZSBHaWxkZSBrYW5uIFNwZWxsZWlnZW5zY2hhZnRlbiBuZXUgZGVmaW5pZXJlbiEKK30KKwordmFyYXJncyBpbnQKK1VzZVNwZWxsKG9iamVjdCBjYXN0ZXIsIHN0cmluZyBzcGVsbCwgbWFwcGluZyBzaW5mbykgeworICBtYXBwaW5nIHNraTsKKyAgc3RyaW5nIHNwZWxsYm9vazsKKworICBpZiAoIWNhc3RlcgorICAgICAgfHwgIXNwZWxsCisgICAgICB8fCAhKHNraT1RdWVyeVNraWxsKHNwZWxsKSkgLy8gRXhpc3RpZXJ0IGRpZXNlciBTcGVsbCBpbiBkaWVzZXIgR2lsZGU/CisgICAgICB8fCAhKHNwZWxsYm9vaz1za2lbU0lfU1BFTExCT09LXSkpIC8vIFNwZWxsYm9vayBtdXNzIGJla2FubnQgc2VpbgorICAgIHJldHVybiAwOworICBpZiAoc2luZm8pCisgICAgc2tpKz1zaW5mbzsKKyAgc3BlbGxib29rPVNQRUxMQk9PS19ESVIrc3BlbGxib29rOworICAvLyBwcmludGYoIiVPICVPICVPICVPXG4iLHNwZWxsYm9vayxjYXN0ZXIsc3BlbGwsc2tpKTsKKyAgcmV0dXJuIChpbnQpc3BlbGxib29rLT5Vc2VTcGVsbChjYXN0ZXIsc3BlbGwsc2tpKTsKK30KKworc3RhdGljIGludAorSW5pdGlhbFNraWxsQWJpbGl0eShtYXBwaW5nIHNraSwgb2JqZWN0IHBsKSB7CisgIGlmICghc2tpIHx8ICFwbCkgcmV0dXJuIDA7CisgIHJldHVybiAoMzAwKkdldE9mZnNldChTSV9TS0lMTExFQVJOLHNraSxwbCkrCisgICAgICAgICAgKDIwMCooaW50KXBsLT5RdWVyeUF0dHJpYnV0ZShBX0lOVCkqCisgICAgICAgICAgIEdldEZhY3RvcihTSV9TS0lMTExFQVJOLHNraSxwbCkpLzEwMCk7Cit9CisKK2ludAorU2tpbGxMaXN0ZShpbnQgd2hhdCkgeworICBpbnQgcmVzOworICAvLyBRdWVyeW1ldGhvZGUgZXJzdGVsbHQgS29waWUgKHdpY2h0aWchKQorICBtYXBwaW5nIGFsbHNraWxscz1RdWVyeVByb3AoUF9HVUlMRF9TS0lMTFMpOworICBzdHJpbmcgKnNraWxscz0oe30pOworICBzdHJpbmcgKnNwZWxscz0oe30pOworCisgIGlmICghbWFwcGluZ3AoYWxsc2tpbGxzKSB8fCAhc2l6ZW9mKGFsbHNraWxscykpCisgICAgcmV0dXJuIDA7CisKKyAgZm9yZWFjaChzdHJpbmcgcywgbWFwcGluZyBzZGF0YTogJmFsbHNraWxscykgeworICAgIC8vIExlcm5sZXZlbCBlcm1pdHRlbG4gdW5kIHNwZWljaGVybi4KKyAgICBtYXBwaW5nIHRtcD1RdWVyeVNwZWxsKHMpOworICAgIC8vIHdlbm4gbml4IGdlZnVuZGVuLCBkYW5uIGlzdCBlcyBlaW4gU2tpbGwsIHNvbnN0IGVpbiBTcGVsbC4KKyAgICBpZiAodG1wKSB7CisgICAgICBzcGVsbHMgKz0gKHtzfSk7CisgICAgICAvLyBkYXMgU3BlbGxib29rIGhhdCBpbSBad2VpZmVsIGRhcyBTSV9TS0lMTElORk8KKyAgICAgIHNkYXRhW1NJX1NLSUxMSU5GT10gPSB0bXBbU0lfU0tJTExJTkZPXTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAvLyBTSV9TS0lMTElORk8gc3RlaHQgaW4gZGllc2VtIEZhbGwgc2Nob24gaW4gc2RhdGEuLi4KKyAgICAgIHRtcCA9IFF1ZXJ5U2tpbGwocyk7CisgICAgICBza2lsbHMgKz0gKHtzfSk7CisgICAgfQorICAgIC8vIGd1Y2tlbiwgb2JzIG5lbiBMZXJubGV2ZWwgZ2lidCB1bmQgZWluZmFjaCBpbiBzZGF0YSBzY2hyZWliZW4KKyAgICBpZiAoICh0bXA9dG1wW1NJX1NLSUxMUkVTVFJfTEVBUk5dKSApCisgICAgICBzZGF0YVsiX3Jlc3RyX2xldmVsIl0gPSB0bXBbUF9MRVZFTF07CisgIH0KKworICAvLyBqZXR6dCBzb3J0aWVyZW4uCisgIGNsb3N1cmUgY2wgPSBmdW5jdGlvbiBpbnQgKHN0cmluZyBhLCBzdHJpbmcgYikKKyAgICB7IHJldHVybiBhbGxza2lsbHNbYV1bIl9yZXN0cl9sZXZlbCJdID4gYWxsc2tpbGxzW2JdWyJfcmVzdHJfbGV2ZWwiXTsgfTsKKyAgaWYgKHdoYXQgJiAweDAxKQorICAgIHNwZWxscyA9IHNvcnRfYXJyYXkoc3BlbGxzLCBjbCk7CisgIGlmICh3aGF0ICYgMHgwMikKKyAgICBza2lsbHMgPSBzb3J0X2FycmF5KHNraWxscywgY2wpOworCisgIC8vIHVuZCBhdXNnZWJlbgorICBjbCA9IGZ1bmN0aW9uIHZvaWQgKHN0cmluZyAqbGlzdCkKKyAgICB7CisgICAgICBzdHJpbmcgdG1wPSIiOworICAgICAgaW50IGx2bDsKKyAgICAgIGZvcmVhY2goc3RyaW5nIHNwOiBsaXN0KSB7CisgICAgICAgIGx2bCA9IGFsbHNraWxsc1tzcF1bIl9yZXN0cl9sZXZlbCJdOworICAgICAgICBpZiAobHZsPjApCisgICAgICAgICAgdG1wICs9IHNwcmludGYoIiUtMjBzICVkXG4iLHNwLGx2bCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICB0bXAgKz0gc3ByaW50ZigiJS0yMHNcbiIsc3ApOworICAgICAgICBpZiAoYWxsc2tpbGxzW3NwXVtTSV9TS0lMTElORk9dKQorICAgICAgICAgIHRtcCArPSBicmVha19zdHJpbmcoYWxsc2tpbGxzW3NwXVtTSV9TS0lMTElORk9dLCA3OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgIik7CisgICAgICB9CisgICAgICB0ZWxsX29iamVjdChQTCwgdG1wKTsKKyAgICB9OworCisgIGlmICgod2hhdCAmIDB4MDEpICYmIHNpemVvZihzcGVsbHMpKSB7CisgICAgcmVzID0gMTsKKyAgICB0ZWxsX29iamVjdChQTCxzcHJpbnRmKAorICAgICAgICAiRHUga2FubnN0IHZlcnN1Y2hlbiwgZm9sZ2VuZGUgWmF1YmVyc3BydWVjaGUgenUgbGVybmVuOlxuIgorICAgICAgICAiJS0yMHMgJS0zc1xuIiwiWmF1YmVyc3BydWNoIiwiU3BpZWxlcnN0dWZlIikpOworICAgIGZ1bmNhbGwoY2wsIHNwZWxscyk7CisgICAgdGVsbF9vYmplY3QoUEwsYnJlYWtfc3RyaW5nKAorICAgICAgICJEdSBrYW5uc3QgZWluZW4gWmF1YmVyc3BydWNoIG1pdCBkZW0gS29tbWFuZG8gXCJsZXJuZVwiLCBnZWZvbGd0ICIKKyAgICAgICAidm9tIFphdWJlcnNwcnVjaG5hbWVuIGxlcm5lbi4iLDc4KSk7CisgIH0KKyAgaWYgKCh3aGF0ICYgMHgwMikgJiYgc2l6ZW9mKHNraWxscykpIHsKKyAgICByZXMgPSAxOworICAgIHRlbGxfb2JqZWN0KFBMLHNwcmludGYoCisgICAgICAgICJEdSBrYW5uc3QgdmVyc3VjaGVuLCBmb2xnZW5kZSBGYWVoaWdrZWl0ZW4genUgZXJ3ZXJiZW46XG4iCisgICAgICAgICIlLTIwcyAlLTNzXG4iLCJGYWVoaWdrZWl0IiwiU3BpZWxlcnN0dWZlIikpOworICAgIGZ1bmNhbGwoY2wsIHNraWxscyk7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCit2YXJhcmdzIGludAorTGVhcm5TcGVsbChzdHJpbmcgc3BlbGwsb2JqZWN0IHBsKSB7CisgIG1hcHBpbmcgc2tpLHJlc3RyOworICBzdHJpbmcgcmVzOworICBtaXhlZCBsZWFybl9pbml0ZnVuYzsKKyAgaW50IGFiaWwsZGlmZjsKKworICAvLyBXZW5uIGtlaW4gcGwgZ2VzZXR6dCBpc3QsIG5laG1lbiB3aXIgdGhpc19wbGF5ZXIoKSwgZGFzIGlzdCBkZXIKKyAgLy8gTm9ybWFsZmFsbC4KKyAgaWYgKCFwbCkKKwkgIHBsPXRoaXNfcGxheWVyKCk7CisgIGlmICghSXNHdWlsZE1lbWJlcihwbCkpIHsKKyAgICBfbm90aWZ5X2ZhaWwoIkR1IGdlaG9lcnN0IGRpZXNlciBHaWxkZSBuaWNodCBhbiFcbiIpOworICAgIHJldHVybiAwOworICB9CisgIF9ub3RpZnlfZmFpbCgiV2FzIG1vZWNodGVzdCBEdSBsZXJuZW4/XG4iKTsKKyAgaWYgKCFzcGVsbCkKKyAgICByZXR1cm4gU2tpbGxMaXN0ZSgweDAxKTsKKyAgc3BlbGw9bG93ZXJfY2FzZShzcGVsbCk7CisgIGlmICghKHNraT1RdWVyeVNwZWxsKHNwZWxsKSkpCisgICAgcmV0dXJuIDA7CisgIGlmIChwbC0+UXVlcnlTa2lsbChzcGVsbCkpIHsKKyAgICBfbm90aWZ5X2ZhaWwoIkR1IGthbm5zdCBkaWVzZW4gU3BydWNoIGRvY2ggc2Nob24hXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoKHJlc3RyPXNraVtTSV9TS0lMTFJFU1RSX0xFQVJOXSkKKyAgICAgICYmIChyZXM9Y2hlY2tfcmVzdHJpY3Rpb25zKHBsLHJlc3RyKSkpIHsKKyAgICBwcmludGYoIkR1IGthbm5zdCBkaWVzZW4gU3BydWNoIG5vY2ggbmljaHQgbGVybmVuLlxuR3J1bmQ6ICVzIixyZXMpOworICAgIHJldHVybiAxOworICB9CisgIGFiaWw9SW5pdGlhbFNraWxsQWJpbGl0eShza2kscGwpOworICBpZiAoYWJpbDwxKSBhYmlsPTE7CisgIGlmIChhYmlsPjc1MDApIGFiaWw9NzUwMDsKKyAgd3JpdGUoIkR1IGxlcm5zdCBlaW5lbiBuZXVlbiBaYXViZXJzcHJ1Y2guXG4iKTsKKyAgaWYgKCEoZGlmZj1HZXRGVmFsdWVPKFNJX0RJRkZJQ1VMVFksc2tpLHBsKSkpCisgICAgZGlmZj1HZXRGVmFsdWVPKFNJX1NQRUxMQ09TVCxza2kscGwpOworICBwbC0+TW9kaWZ5U2tpbGwoc3BlbGwsYWJpbCxkaWZmKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludAorTGVhcm5Ta2lsbChzdHJpbmcgc2tpbGwpIHsKKyAgbWFwcGluZyBza2kscmVzdHI7CisgIG9iamVjdCBwbDsKKyAgc3RyaW5nIHJlczsKKyAgbWl4ZWQgbGVhcm5faW5pdGZ1bmM7CisgIGludCBhYmlsLGRpZmY7CisKKyAgaWYgKCFJc0d1aWxkTWVtYmVyKHBsPXRoaXNfcGxheWVyKCkpKSB7CisgICAgX25vdGlmeV9mYWlsKCJEdSBnZWhvZXJzdCBkaWVzZXIgR2lsZGUgbmljaHQgYW4hXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBfbm90aWZ5X2ZhaWwoIldhcyBtb2VjaHRlc3QgRHUgbGVybmVuP1xuIik7CisgIGlmICghc2tpbGwpCisgICAgcmV0dXJuIFNraWxsTGlzdGUoMHgwMik7CisgIHNraWxsPWNhcGl0YWxpemUoc2tpbGwpOworICBpZiAoIShza2k9UXVlcnlTa2lsbChza2lsbCkpKQorICAgIHJldHVybiAwOworICBpZiAocGwtPlF1ZXJ5U2tpbGwoc2tpbGwpKSB7CisgICAgX25vdGlmeV9mYWlsKCJEdSBoYXN0IGRpZXNlIEZhZWhpZ2tlaXQgZG9jaCBzY2hvbiFcbiIpOworICAgIHJldHVybiAwOworICB9CisgIGlmICgocmVzdHI9c2tpW1NJX1NLSUxMUkVTVFJfTEVBUk5dKQorICAgICAgJiYgKHJlcz1jaGVja19yZXN0cmljdGlvbnMocGwscmVzdHIpKSkgeworICAgIHByaW50ZigiRHUga2FubnN0IGRpZXNlIEZhZWhpZ2tlaXQgbm9jaCBuaWNodCBlcndlcmJlbi5cbkdydW5kOiAlcyIscmVzKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBhYmlsPUluaXRpYWxTa2lsbEFiaWxpdHkoc2tpLHBsKTsKKyAgaWYgKCFhYmlsKSBhYmlsPTE7CisgIGlmIChhYmlsPk1BWF9BQklMSVRZKSBhYmlsPU1BWF9BQklMSVRZOworICBpZiAoYWJpbDwtTUFYX0FCSUxJVFkpIGFiaWw9LU1BWF9BQklMSVRZOworICB3cml0ZSgiRHUgZXJ3aXJic3QgZWluZSBuZXVlIEZhZWhpZ2tlaXQuXG4iKTsKKyAgZGlmZj1HZXRGVmFsdWVPKFNJX0RJRkZJQ1VMVFksc2tpLHBsKTsKKyAgcGwtPk1vZGlmeVNraWxsKHNraWxsLGFiaWwsZGlmZik7CisgIHJldHVybiAxOworfQorCitpbnQgR3VpbGRSYXRpbmcob2JqZWN0IHBsKQoreworICBtYXBwaW5nIHNraTsKKyAgc3RyaW5nICpzazsKKyAgaW50IGksIGNudCwgc3VtOworICBjbG9zdXJlIHFzYTsKKyAgCisgIGlmICghSXNHdWlsZE1lbWJlcihwbCl8fCFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHBsKSkKKyAgICByZXR1cm4gMDsKKworICBpZiAoIShza2kgPSBRdWVyeVByb3AoUF9HVUlMRF9TS0lMTFMpKSB8fAorICAgICAgIShxc2EgPSBzeW1ib2xfZnVuY3Rpb24oIlF1ZXJ5U2tpbGxBYmlsaXR5IixwbCkpKQorICAgIHJldHVybiAwOworCisgIHNrID0gbV9pbmRpY2VzKHNraSk7CisgIGNudCA9IHNpemVvZihza2kpOworICAKKyAgZm9yIChpPWNudC0xLCBzdW09MDsgaT49MDsgaS0tKQorICAgIHN1bSArPSBmdW5jYWxsKHFzYSwgc2tbaV0pOworCisgIHN1bSA9IHN1bS9jbnQ7CisgIGlmIChzdW0gPCAwKQorICAgIHN1bSA9IDA7CisgIGVsc2UgaWYgKHN1bSA+IE1BWF9BQklMSVRZKQorICAgIHN1bSA9IE1BWF9BQklMSVRZOworICAKKyAgcmV0dXJuIChpbnQpcGwtPlNldFByb3AoUF9HVUlMRF9SQVRJTkcsIHN1bSk7Cit9CisKKy8vIFdpcmQgdm9uIC9zdGQvcGxheWVyL3F1ZXN0LmMgYXVmZ2VydWZlbiwgd2VubiBRdWVzdCBnZWxvZXN0LgorLy8gKEplZGVzIG1hbCAtIG5pY2h0IG51ciBiZWltIGVyc3RlbiBtYWwuKQorLy8gSXN0IHp1bSBzZWxic3QtdWViZXJzY2hyZWliZW4gZ2VkYWNodCwgc29sbHRlIGFiZXIgZGVmaW5pZXJ0IHNlaW4uCit2b2lkIE5vdGlmeUdpdmVRdWVzdChvYmplY3QgcGwsIHN0cmluZyBrZXkpeyAgfQorCmRpZmYgLS1naXQgYS9zdGQvZ2lsZGVuX3Jvb20uYyBiL3N0ZC9naWxkZW5fcm9vbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2M2RlNTkKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvZ2lsZGVuX3Jvb20uYwpAQCAtMCwwICsxLDMzIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gZ2lsZGVuX3Jvb20uYyAtLSBHaWxkZW5nZWJhZXVkZQorLy8KKy8vICRJZDogZ2lsZGVuX3Jvb20uYyA2MzgwIDIwMDctMDctMjAgMjI6MzI6MzhaIFplc3N0cmEgJAorI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCisvLyAjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworaW5oZXJpdCAiL3N0ZC9naWxkZSI7Citpbmhlcml0ICIvc3RkL2dpbGRlbl9vYiI7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8YXR0cmlidXRlcy5oPgorI2luY2x1ZGUgPG5ld19za2lsbHMuaD4KKwordm9pZCBjcmVhdGUoKSB7CisgIGdpbGRlOjpjcmVhdGUoKTsKKyAgZ2lsZGVuX29iOjpjcmVhdGUoKTsKKyAgQWRkQ21kKCh7InRyaXR0IiwidHJldGUifSksImJlaV9vZGVyX2F1c190cmV0ZW4iKTsKKyAgQWRkQ21kKCh7Imxlcm4iLCJsZXJuZSJ9KSwiTGVhcm5TcGVsbCIpOworfQorCitpbnQgYWR2YW5jZShzdHJpbmcgYXJnKSB7CisgIGludCByMSxyMjsKKworICByMT1naWxkZTo6YWR2YW5jZShhcmcpOworICByMj1naWxkZW5fb2I6OnRyeV9hZHZhbmNlKCk7CisgIHJldHVybiAocjF8fHIyKTsKK30KZGlmZiAtLWdpdCBhL3N0ZC9ob29rX2NvbnN1bWVyLmMgYi9zdGQvaG9va19jb25zdW1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYTAzYjMKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvaG9va19jb25zdW1lci5jCkBAIC0wLDAgKzEsMTkgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWINCisvLw0KKy8vIC9zdGQvaG9va19jb25zdW1lci5jICAtIHVzZWQgdG8gY29udGFpbiBzb21lIHRlbXBsYXRlIGZvciBob29rIGNvbnN1bWVycywNCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBub3QgbmVlZGVkIGFueW1vcmUuDQorLy8NCisNCisjcHJhZ21hIHN0cm9uZ190eXBlcw0KKyNwcmFnbWEgc2F2ZV90eXBlcw0KKyNwcmFnbWEgbm9fY2xvbmUNCisjcHJhZ21hIHBlZGFudGljDQorI3ByYWdtYSByYW5nZV9jaGVjaw0KKw0KKyNpbmNsdWRlIDxob29rLmg+DQorDQorZGVwcmVjYXRlZCBtaXhlZCBIb29rQ2FsbGJhY2sob2JqZWN0IGhvb2tTb3VyY2UsIGludCBob29raWQsIG1peGVkIGhvb2tEYXRhKQ0KK3sNCisgIHJldHVybiAoe0hfTk9fTU9ELGhvb2tEYXRhfSk7DQorfQ0KKw0KZGlmZiAtLWdpdCBhL3N0ZC9ob29rX3Byb3ZpZGVyLmMgYi9zdGQvaG9va19wcm92aWRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYjhjYTMKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvaG9va19wcm92aWRlci5jCkBAIC0wLDAgKzEsNDkzIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gL3N0ZC9ob29rX3Byb3ZpZGVyLmMgIC0gSG9va3N5c3RlbQorLy8KKy8vICRJZDogaG9va19wcm92aWRlci5jIDk0NTMgMjAxNi0wMi0wNCAyMToyMjo1NFogWmVzc3RyYSAkCisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgcGVkYW50aWMKKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDxob29rLmg+CisjdW5kZWYgTkVFRF9QUk9UT1RZUEVTCisKKy8vIGdldCB0aGUgb2JqZWN0IGZ1ciBjbG9zdXJlIDxjbD4gKHdoZXJlIHRoZSBjb2RlIGlzISkKKyNkZWZpbmUgR0VUX09CSkVDVChjbCkgZ2V0X3R5cGVfaW5mbyhjbCwyKQorCisvLyBTdHJ1Y3QgZGVzY3JpYmluZyBvbmUgaG9vayBjb25zdW1lci4gPGNsPiB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBob29rIGlzCisvLyB0cmlnZ2VyZWQuIFRoZSBsb3dlciA8cHJpbz4sIHRoZSBlYXJsaWVyIHRoZSBjb25zdW1lciB3aWxsIGJlIGNhbGxlZC4KKy8vIDx0eXBlPiBpcyBhIGNvbnN1bWVydHlwZSwgZS5nLiBzdXJ2ZXlvciwgbGlzdGVuZXIgZXRjLiAoc2VlIGhvb2suaCkKK3N0cnVjdCBob29rX2VudHJ5X3MgeworICBjbG9zdXJlIGNsOworICBpbnQgcHJpbzsKKyAgaW50IGVuZHRpbWU7CisgIGludCB0eXBlOworfTsKKworLy8gU3RydWN0IGhvbGRpbmcgdGhlIGNvbnN1bWVycyBvZiBvbmUgc3BlY2lmaWMgaG9vay4KKy8vIHRoZSB2YWx1ZSBhcnJheXMgYXJlIGd1YXJlbnRlZWQgdG8gZXhpc3QsIGJ1dCBtYXkgYmUgZW1wdHkuCitzdHJ1Y3QgaG9va19zIHsKKyAgc3RydWN0IGhvb2tfZW50cnlfcyAqc3VydmV5b3JzOworICBzdHJ1Y3QgaG9va19lbnRyeV9zICpobW9kczsKKyAgc3RydWN0IGhvb2tfZW50cnlfcyAqZG1vZHM7CisgIHN0cnVjdCBob29rX2VudHJ5X3MgKmxpc3RlbmVyczsKK307CisKKy8qIGhvb2sgbWFwcGluZworICAgdGhlIGxpc3Qgb2YgYWxsIG9mZmVyZWQgaG9va3MgaW4gdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6CisgICAoW2hvb2tpZDogKDxob29rX3M+KSwgLi4uCisgICApXQorKi8KK3ByaXZhdGUgbm9zYXZlIG1hcHBpbmcgaG9va01hcHBpbmc9KFtdKTsKKworcHJvdGVjdGVkIHZvaWQgQ2xlYW5Ib29rTWFwcGluZyhpbnQgKmhvb2tpZHMpOworCisvLyBEZWJ1Z2dpbmcgLSBnZ2YuIHVlYmVyc2NocmVpYmVuCitwcm90ZWN0ZWQgaW50IGhfZGJnKCkge3JldHVybiAwO30KKwordm9pZCBIb29rVGVzdE9mZmVyKGludCBpZCwgaW50IHN0YXQpeworICBpZihoX2RiZygpKSB7CisgICAgICBvZmZlckhvb2soaWQsc3RhdCk7CisgIH0KK30KKwordm9pZCBIb29rVGVzdFRyaWdnZXIoaW50IGlkLCBtaXhlZCBkYXRhKXsKKyAgaWYoaF9kYmcoKSkgeworICAgICAgSG9va0Zsb3coaWQsZGF0YSk7CisgIH0KK30KKworLy8gTk9URTogaWYgeW91IGhhdmUgdGhlIGNsb3N1cmUsIHlvdSBjYW4gY2FsbCB0aGUgbGZ1biwgZXZlbiBpZiBpdCBpcworLy8gcHJpdmF0ZS4gVGhlcmVmb3JlIGFjY2VzcyB0byB0aGlzIGRhdGEgc2hvdWxkIGJlIHJlc3RyaWN0ZWQgdG8KKy8vIHRoaXNfb2JqZWN0KCkuCisvLyBUaGVzZSB0d28gZnVuY3Rpb25zIHNob3VsZCBiZSB1c2VkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCitwcm90ZWN0ZWQgbWFwcGluZyBIQ29weUhvb2tNYXBwaW5nKCl7CisgIHJldHVybiBkZWVwX2NvcHkoaG9va01hcHBpbmcpOworfQorCitwcm90ZWN0ZWQgbWFwcGluZyBIQ29weUhvb2tDb25zdW1lcnMoaW50IGhvb2tpZCl7CisgIGlmKG1lbWJlcihob29rTWFwcGluZyxob29raWQpKSB7CisgICAgICBDbGVhbkhvb2tNYXBwaW5nKCh7aG9va2lkfSkpOworICAgICAgcmV0dXJuIGRlZXBfY29weShob29rTWFwcGluZ1tob29raWRdKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworLy8gR2dmLiB6dW0gVWViZXJzY2hyZWliZW4uCitpbnQgSENvbnN1bWVyVHlwZUlzQWxsb3dlZChpbnQgdHlwZSwgb2JqZWN0IGNvbnN1bWVyKXsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBIUHJpb3JpdHlJc0FsbG93ZWQoaW50IHByaW8sIG9iamVjdCBjb25zdW1lcil7CisgIHJldHVybiAxOworfQorCisvLyBjbGVhbiBpbnRlcm5hbCBob29rIGRhdGEgc3RydWN0dXJlcyBvZiBzdGFsZSBob29rIGNvbnN1bWVycy4KK3Byb3RlY3RlZCB2b2lkIENsZWFuSG9va01hcHBpbmcoaW50ICpob29raWRzKXsKKyAgLy8gaG9va3MgZW50aGFlbHQgZGllIGF1Znp1cmFldW1lbmRlbiBIb29rcy4gV2VubiBrZWluIEFycmF5IC0+IGFsbGUgSG9va3MKKyAgaWYgKCFwb2ludGVycChob29raWRzKSkKKyAgICBob29raWRzPW1faW5kaWNlcyhob29rTWFwcGluZyk7CisKKyAgZm9yZWFjaChpbnQgaG9va2lkIDogaG9va2lkcykgeyAvLyBhbGxlIEhvb2tzCisgICAgc3RydWN0IGhvb2tfcyBob29rcyA9IGhvb2tNYXBwaW5nW2hvb2tpZF07CisgICAgaWYgKCFzdHJ1Y3RwKGhvb2tzKSkKKyAgICAgIGNvbnRpbnVlOworICAgIC8vIHVlYmVyIGFsbGUgQ29uc3VtZXJ0eXBlbiBsYXVmZW4KKyAgICBmb3JlYWNoIChzdHJpbmcgY29uc3VtZXJ0eXBlOiBIX0NPTlNVTUVSTkFNRVMpCisgICAgeworICAgICAgLy8gWWVhaCAtIGNvbXB1dGUgc3RydWN0IGxvb2t1cCBhdCBydW50aW1lLi4uIDstKQorICAgICAgc3RydWN0IGhvb2tfZW50cnlfcyAqY29uc3VtZXJzID0gaG9va3MtPihjb25zdW1lcnR5cGUpOworICAgICAgLy8gSG9va2VpbnRyYWVnZSAvIENvbnN1bWVyCisgICAgICBmb3JlYWNoKHN0cnVjdCBob29rX2VudHJ5X3MgaCA6ICZjb25zdW1lcnMpIHsKKyAgICAgICAgLy8gYWxsZSBhYmdlbGF1ZmVuZW4gRWludHJhZWdlIG9kZXIgc29sY2hlIG1pdCB6ZXJzdG9lcnRlbiBPYmpla3RlbgorICAgICAgICAvLyBudWxsZW4KKyAgICAgICAgaWYgKCFoLT5jbCB8fCBoLT5lbmR0aW1lIDwgdGltZSgpICkKKyAgICAgICAgICAgIGggPSAwOworICAgICAgfQorICAgICAgLy8gMCBub2NoIHJhdXN3ZXJmZW4uCisgICAgICBob29rcy0+KGNvbnN1bWVydHlwZSkgLT0gKHswfSk7CisgICAgfQorICB9Cit9CisKK3Byb3RlY3RlZCB2b2lkIG9mZmVySG9vayhpbnQgaG9va2lkLCBpbnQgb2ZmZXJzdGF0ZSkKK3sKKyAgSF9ETVNHKHNwcmludGYoIm9mZmVySG9vayBob29raWQgJWQgb2ZmZXJzdGF0ZSAlZFxuIixob29raWQsb2ZmZXJzdGF0ZSkpOworICBpZiAoaG9va2lkPjApCisgIHsKKyAgICAgIGlmIChvZmZlcnN0YXRlKSB7CisgICAgICAgICAgaWYgKCFtZW1iZXIoaG9va01hcHBpbmcsaG9va2lkKSkgeworICAgICAgICAgICAgICBzdHJ1Y3QgaG9va19zIGhvb2sgPSAoPGhvb2tfcz4KKyAgICAgICAgICAgICAgICAgIHN1cnZleW9yczogKHt9KSwKKyAgICAgICAgICAgICAgICAgIGhtb2RzOiAoe30pLAorICAgICAgICAgICAgICAgICAgZG1vZHM6ICh7fSksCisgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnM6ICh7fSkgKTsKKyAgICAgICAgICAgICAgaG9va01hcHBpbmdbaG9va2lkXSA9IGhvb2s7CisgICAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgICAgaWYgKG1lbWJlcihob29rTWFwcGluZyxob29raWQpKSB7CisgICAgICAgICAgICBtX2RlbGV0ZShob29rTWFwcGluZyxob29raWQpOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgfQorICBIX0RNU0coc3ByaW50ZigiICByZXN1bHQgJU9cbiIsaG9va01hcHBpbmcpKTsKK30KKworLy8gaG9va0NvbnN1bWVySW5mbygpIGxpZWZlcnQgQXJyYXkgdm9uIGhvb2tfZW50cnlfcyB6dXJ1ZWNrLiBELmguIGJlaSBBYmZyYWdlCisvLyB2b24gT2JqZWt0ZW4gYWxsZSBDbG9zdXJlcyBkaWVzZXMgT2JqZWt0cyB1bmQgamVkZSBkYXZvbiBlcnpldWd0IGVpbgorLy8gRWxlbWVudCBob29rX2VudHJ5X3MgaW0gRXJnZWJuaXNhcnJheS4gQmVpIEFiZnJhZ2Ugdm9uIENsb3N1cmVzIGhhdCBkYXMKKy8vIEFycmF5IGltbWVyIGdlbmF1IDEgb2RlciBrZWluIEVsZW1lbnQuCisvLyBXQVJOSU5HOiB3aG9ldmVyIGhhcyBhIGhvb2tfZW50cnlfcyBjYW4gY2hhbmdlL2RlbGV0ZSB0aGUgaG9vayEKKy8vICAgICAgICAgIE5FVkVSIHJldHVybiB0aGUgb3JpZ2luYWwgdG8gYW4gZXh0ZXJuYWwgY2FsbGVyIQorLy8gTk9URTogd2hvZXZlciBoYXMgdGhlIGNsIGZyb20gaG9va19lbnRyeV9zIGNhbiBjYWxsIGl0LCBldmVuIGlmIHRoZSBsZnVuCisvLyAgICAgICBpcyBwcml2YXRlIChhbmQgdGhpcyBvYmplY3QgdGhlIG9ubHkgb25lIGtub3dpbmcgaXQpLgorcHJvdGVjdGVkIG1peGVkICogaG9va0NvbnN1bWVySW5mbyhpbnQgaG9va2lkLCBvYmplY3R8Y2xvc3VyZSBjb25zdW1lcikKK3sKKyAgY2xvc3VyZSBmaWx0ZXJfY2w7CisKKyAgaWYgKCFtZW1iZXIoaG9va01hcHBpbmcsaG9va2lkKSkKKyAgICByZXR1cm4gKHt9KTsKKworICAvLyBDbG9zdXJlIHp1bSBGaWx0ZXJuIGJlc3RpbW1lbiAtIGplIG5hY2hkZW0sIHdhcyBnZXN1Y2h0IHdpcmQuCisgIGlmIChjbG9zdXJlcChjb25zdW1lcikpCisgIHsKKyAgICBmaWx0ZXJfY2wgPSBmdW5jdGlvbiBpbnQgKHN0cnVjdCBob29rX2VudHJ5X3MgaCkKKyAgICAgICAgICAgICAgICB7IHJldHVybiBoLT5jbCA9PSBjb25zdW1lcgorICAgICAgICAgICAgICAgICAgICAgICAgICYmIGgtPmVuZHRpbWUgPj0gdGltZSgpOyB9OworICB9CisgIGVsc2UgaWYgKG9iamVjdHAoY29uc3VtZXIpKQorICB7CisgICAgZmlsdGVyX2NsID0gZnVuY3Rpb24gaW50IChzdHJ1Y3QgaG9va19lbnRyeV9zIGgpCisgICAgICAgICAgICAgICAgeyByZXR1cm4gR0VUX09CSkVDVChoLT5jbCkgPT0gY29uc3VtZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAmJiBoLT5lbmR0aW1lID49IHRpbWUoKTsgfTsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gKHt9KTsKKyAgfQorCisgIHN0cnVjdCBob29rX3MgaG9vayA9IGhvb2tNYXBwaW5nW2hvb2tpZF07CisgIHN0cnVjdCBob29rX2VudHJ5X3MgKnJlc3VsdCA9ICh7fSk7CisgIGZvcmVhY2ggKHN0cmluZyBjb25zdW1lcnR5cGU6IEhfQ09OU1VNRVJOQU1FUyApCisgIHsKKyAgICByZXN1bHQgKz0gZmlsdGVyKGhvb2stPihjb25zdW1lcnR5cGUpLCBmaWx0ZXJfY2wpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBISXNIb29rQ29uc3VtZXIoaW50IGhvb2tpZCwgbWl4ZWQgY29uc3VtZXIpIHsKKyAgcmV0dXJuIHNpemVvZihob29rQ29uc3VtZXJJbmZvKGhvb2tpZCxjb25zdW1lcikpICE9IDA7Cit9CisKK2ludCogSExpc3RIb29rcygpIHsKKyAgcmV0dXJuIG1faW5kaWNlcyhob29rTWFwcGluZyk7Cit9CisKK2ludCBIVW5yZWdpc3RlckZyb21Ib29rKGludCBob29raWQsIG1peGVkIGNvbnN1bWVyKSB7CisKKyAgSF9ETVNHKHNwcmludGYoIkhVbnJlZ2lzdGVyRnJvbUhvb2sgaG9va2lkICVkIGNvbnN1bWVyICVPXG4iLGhvb2tpZCxjb25zdW1lcikpOworICBpZiAob2JqZWN0cChjb25zdW1lcikpCisgICAgY29uc3VtZXIgPSBzeW1ib2xfZnVuY3Rpb24oIkhvb2tDYWxsYmFjayIsIGNvbnN1bWVyKTsKKyAgaWYgKCFjbG9zdXJlcChjb25zdW1lcikpCisgICAgcmV0dXJuIDA7CisKKyAgc3RydWN0IGhvb2tfZW50cnlfcyAqaW5mbyA9IGhvb2tDb25zdW1lckluZm8oaG9va2lkLGNvbnN1bWVyKTsKKworICAvLyBpdCBzaG91bGQgbmV2ZXIgaGFwcGVuIHRoYXQgYSBjbG9zdXJlIGlzIHJlZ2lzdGVyZWQgbW9yZSB0aGFuIG9uY2UsIGkuZS4KKyAgLy8gdGhlIHJlc3VsdCBjb250YWlucyBtb3JlIHRoYW4gb25lIGVsZW1lbnQuCisgIGlmIChzaXplb2YoaW5mbykpIHsKKyAgICAgIHN0cnVjdCBob29rX2VudHJ5X3MgaCA9IGluZm9bMF07CisgICAgICBoLT5jbCA9IDA7CisgICAgICBIX0RNU0coc3ByaW50ZigiICByZXN1bHQgJU9cbiIsIGhvb2tNYXBwaW5nKSk7CisgICAgICAvLyB0aGUgbm93IGludmFsaWQgaCB3aWxsIGJlIGNsZWFuZWQgdXAgbGF0ZXIuCisgICAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworLy8gc3VydmV5b3JzIGFyZSBhc2tlZCBmb3IgcmVnaXN0cmF0aW9uIHBlcm1pdHRhbmNlCitwcm90ZWN0ZWQgaW50IGFza1N1cnZleW9yc0ZvclJlZ2lzdHJhdGlvbkFsbG93YW5jZSgKKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBob29rX2VudHJ5X3MgKnN1cnZleW9ycywgb2JqZWN0IGNvbnN1bWVyLGludCBob29raWQsCisgICAgICAgICAgICAgICAgICBpbnQgaG9va3ByaW8saW50IGNvbnN1bWVydHlwZSkKK3sKKyAgSF9ETVNHKHNwcmludGYoImFza1N1cnZleW9yc0ZvclJlZ2lzdHJhdGlvbkFsbG93YW5jZSBzdXJ2ZXlvcnMgJU8sICIKKyAgICAgICAgImNvbnN1bWVyICVPLCBob29raWQgJWQsIGhvb2twcmlvICVkLCBjb25zdW1lcnR5cGUgJWRcbiIsCisgICAgICAgIHN1cnZleW9ycyxjb25zdW1lcixob29raWQsaG9va3ByaW8sY29uc3VtZXJ0eXBlKSk7CisKKyAgZm9yZWFjaChzdHJ1Y3QgaG9va19lbnRyeV9zIHN1cnZleW9yIDogc3VydmV5b3JzKSB7CisgICAgaWYgKGNsb3N1cmVwKHN1cnZleW9yLT5jbCkgJiYgc3VydmV5b3ItPmVuZHRpbWUgPj0gdGltZSgpKQorICAgIHsKKyAgICAgIC8vIHN1cnZleW9yIGhvb2sgZ3VlbHRpZy4KKyAgICAgIG9iamVjdCBzb2IgPSBHRVRfT0JKRUNUKHN1cnZleW9yLT5jbCk7CisgICAgICBpZiAoIXNvYi0+SG9va1JlZ2lzdHJhdGlvbkNhbGxiYWNrKGNvbnN1bWVyLCBob29raWQsCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX29iamVjdCgpLCBob29rcHJpbywgY29uc3VtZXJ0eXBlKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisgIHJldHVybiAxOworfQorCitpbnQgSFJlZ2lzdGVyVG9Ib29rKGludCBob29raWQsIG1peGVkIGNvbnN1bWVyLCBpbnQgaG9va3ByaW8sCisgICAgICAgICAgICAgICAgICAgICAgIGludCBjb25zdW1lcnR5cGUsIGludCB0aW1lSW5TZWNvbmRzKSB7CisgIGludCByZXQsIHJlZ3RpbWU7CisKKyAgaWYgKCFjbG9zdXJlcChjb25zdW1lcikgJiYgIW9iamVjdHAoY29uc3VtZXIpKQorICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIldyb25nIGFyZ3VtZW50ICUuNTBPIHRvIEhSZWdpc3RlclRvSG9vaygpOiBjb25zdW1lciAiCisgICAgICAgICAgIm11c3QgYmUgY2xvc3VyZSBvciBvYmplY3QuXG4iLGNvbnN1bWVyKSk7CisKKyAgaWYgKCFtZW1iZXIoaG9va01hcHBpbmcsIGhvb2tpZCkpCisgICAgcmV0dXJuIC0xOworCisgIGlmIChvYmplY3RwKGNvbnN1bWVyKSkgeworICAgIGNvbnN1bWVyID0gc3ltYm9sX2Z1bmN0aW9uKCJIb29rQ2FsbGJhY2siLCBjb25zdW1lcik7CisgICAgaWYgKCFjbG9zdXJlcChjb25zdW1lcikpCisgICAgICByZXR1cm4gLTI7CisgIH0KKworICBpZiAodGltZUluU2Vjb25kcyA+IDApIHsKKyAgICAgIHJlZ3RpbWU9dGltZSgpICsgdGltZUluU2Vjb25kczsKKyAgfQorICBlbHNlIHsKKyAgICAgIHJlZ3RpbWU9X19JTlRfTUFYX187CisgIH0KKworICBIX0RNU0coc3ByaW50ZigiSFJlZ2lzdGVyVG9Ib29rIGhvb2tpZCAlZCBjb25zdW1lciAlT1xuIGhvb2twcmlvICVkICIKKyAgICAgICAgImNvbnN1bWVydHlwZSAlZFxuIixob29raWQsY29uc3VtZXIsaG9va3ByaW8sY29uc3VtZXJ0eXBlKSk7CisKKyAgQ2xlYW5Ib29rTWFwcGluZygoe2hvb2tpZH0pKTsgLy8gZW50ZmVybnQgdW5ndWVsdGlnZS9hYmdlbGF1ZmVuZSBFaW50cmFlZ2UKKworICAvLyBudXIgZWlubWFsIHBybyBjbG9zdXJlIHJlZ2lzdHJpZXJlbiEKKyAgaWYgKEhJc0hvb2tDb25zdW1lcihob29raWQsIGNvbnN1bWVyKSkKKyAgICByZXR1cm4gLTM7CisKKyAgLy8gQ29uc3VtZXJ0eXAgZXJsYXVidD8KKyAgaWYgKEhfQ09OU1VNRVJDSEVDSyhjb25zdW1lcnR5cGUpID09IC0xCisgICAgICB8fCAhSENvbnN1bWVyVHlwZUlzQWxsb3dlZChjb25zdW1lcnR5cGUsR0VUX09CSkVDVChjb25zdW1lcikpKQorICAgIHJldHVybiAtNDsKKworICAvLyBQcmlvcml0YWV0IGVybGF1YnQ/CisgIGlmIChIX0hPT0tfVkFMSURQUklPKGhvb2twcmlvKSA9PSAtMQorICAgICAgfHwgIUhQcmlvcml0eUlzQWxsb3dlZChob29rcHJpbywgR0VUX09CSkVDVChjb25zdW1lcikpKQorICAgIHJldHVybiAtNTsKKworICBzdHJ1Y3QgaG9va19zIGhvb2sgPSBob29rTWFwcGluZ1tob29raWRdOworCisgIC8vIFVuZCBzdXJ2ZXlvcnMgZXJsYXViZW4gZGllIFJlZ2lzdGllcnVuZz8KKyAgaWYgKCFhc2tTdXJ2ZXlvcnNGb3JSZWdpc3RyYXRpb25BbGxvd2FuY2UoaG9vay0+c3VydmV5b3JzLAorICAgICAgICAgICAgICAgICAgICBHRVRfT0JKRUNUKGNvbnN1bWVyKSxob29raWQsCisgICAgICAgICAgICAgICAgICAgIGhvb2twcmlvLGNvbnN1bWVydHlwZSkpCisgICAgcmV0dXJuIC02OworCisgIHN0cmluZyBjdHlwZW5hbWUgPSBIX0NPTlNVTUVSTkFNRVNbY29uc3VtZXJ0eXBlXTsKKworICAvLyBnZXQgdGhlIGNvbnN1bWVyIGFycmF5CisgIHN0cnVjdCBob29rX2VudHJ5X3MgKmNvbnN1bWVycyA9IGhvb2stPihjdHlwZW5hbWUpOworCisgIC8vIGFzc2VtYmxlIG5ldyBob29rIGNvbnN1bWVyIHN0cnVjdAorICBzdHJ1Y3QgaG9va19lbnRyeV9zIG5ld2NvbnN1bWVyID0gKDxob29rX2VudHJ5X3M+CisgICAgICAgICAgICAgICAgICAgICAgY2wgOiBjb25zdW1lciwKKyAgICAgICAgICAgICAgICAgICAgICBwcmlvIDogaG9va3ByaW8sCisgICAgICAgICAgICAgICAgICAgICAgZW5kdGltZSA6IHJlZ3RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgdHlwZSA6IGNvbnN1bWVydHlwZSApOworCisgIC8vIGNvbnN1bWVycyBlbnRoYWVsdCBkaWUgSG9va2VpbnRyYWVnZQorICBpZiAoc2l6ZW9mKGNvbnN1bWVycykgPCBNQVhfSE9PS19DT1VOVFNbY29uc3VtZXJ0eXBlXSkgeworICAgIC8vIG1heC4gQW56YWhsIGFuIEVpbnRyYWVnZW4gZnVlciBkaWVzZW4gVHlwIG5vY2ggbmljaHQKKyAgICAvLyBlcnJlaWNodCwgZGlyZWt0IGFuaGFlbmdlbi4KKyAgICBjb25zdW1lcnMgKz0gKHsgbmV3Y29uc3VtZXIgfSk7CisgICAgaG9vay0+KGN0eXBlbmFtZSkgPSBjb25zdW1lcnM7CisgICAgcmV0PTE7CisgIH0KKyAgZWxzZSB7CisgICAgLy8gZ2lidCBlcyBlaW5lbiBFaW50cmFnIG1pdCBob2VoZXJlbSBQcmlvd2VydCAobmllZHJpZ2VyZQorICAgIC8vIFByaW9yaXRhZXQpLCBkZW4gbWFuIGVyc2V0emVuIGtvZW5udGU/CisgICAgLy8gRGFzIEFycmF5IGlzdCBzb3J0aWVydCwgbWl0IGhvZWNoc3RlbiBQcmlvd2VydGVuIGFtCisgICAgLy8gRW5kZS4gRXJzZXR6dCB3ZXJkZW4gc29sbCBkZXIgRWludHJhZyBtaXQgZGVtIGhvZWNoc3RlbgorICAgIC8vIFphaGxlbndlcnQsIGZhbGxzIGRlciBuZXVlIEVpbnRyYWcgZWluZW4gbmllZHJpZ2VyZW4gV2VydAorICAgIC8vIGhhdCwgZC5oLiBlcyBtdXNzIG51ciBlciBsZXR6dGUgQ29uc3VtZXIgaW0gQXJyYXkgZ2VwcnVlZnQgd2VyZGVuLgorICAgIC8vIFBydWVmdW5nIGF1ZiBDbG9zdXJlZXhpc3RlbnosIGZhbGxzIGRlciBTdXJ2ZXlvciBPYmpla3RlCisgICAgLy8gemVyc3RvZXJ0IChoYXQpLi4uCisgICAgc3RydWN0IGhvb2tfZW50cnlfcyBvaCA9IGNvbnN1bWVyc1s8MV07CisgICAgaWYgKCFvaC0+Y2wgfHwgb2gtPnByaW8gPiBuZXdjb25zdW1lci0+cHJpbykgeworICAgICAgLy8gRm91bmQgc3VwZXJzZWVkYWJsZSBlbnRyeSAtIHJlcGxhY2UgaXQsIGJ1dCBpbmZvcm0gdGhlIG9iamVjdC4KKyAgICAgIEhfRE1TRygiRm91bmQgc3VwZXJzZWVkYWJsZSBlbnRyeVxuIik7CisgICAgICBjb25zdW1lcnNbPDFdID0gbmV3Y29uc3VtZXI7CisgICAgICBHRVRfT0JKRUNUKG9oLT5jbCktPnN1cGVyc2VlZGVkSG9vayhob29raWQsIHRoaXNfb2JqZWN0KCkpOworICAgICAgcmV0ID0gMTsKKyAgICAgIC8vIG5pY2h0IG5vZXRpZywgY29uc3VtZXJzIHdpZWRlciBpbiBzZWluIGhvb2tfcyB6dSBoYWVubmdlbiB3ZWdlbiBBcnJheQorICAgICAgLy8gLT4gUmVmZXJlbnoKKyAgICB9CisgIH0KKworICAvLyB3ZW5uIGVpbiBFaW50cmFnIGhpbnp1Z2VmdWVndCB3dXJkZSwgbXVzcyBuZXUgc29ydGllcnQgd2VyZGVuCisgIGlmIChyZXQpIHsKKyAgICBob29rLT4oY3R5cGVuYW1lKSA9IHNvcnRfYXJyYXkoY29uc3VtZXJzLAorICAgICAgICBmdW5jdGlvbiBpbnQgKHN0cnVjdCBob29rX2VudHJ5X3MgYSwgc3RydWN0IGhvb2tfZW50cnlfcyBiKSB7CisgICAgICAgICAgICByZXR1cm4gYS0+cHJpbyA+IGItPnByaW87IH0gKTsKKyAgfQorCisgIEhfRE1TRyhzcHJpbnRmKCIgIHJlc3VsdCAlT1xuIixob29rTWFwcGluZykpOworCisgIC8vIC03LCB3ZW5uIGtlaW4gRWludHJhZyBtZWhyIGZyZWkgLyB6dXZpZWxlIEhvb2tzCisgIHJldHVybiAocmV0ID4gMCA/IDEgOiAtNyk7Cit9CisKKy8vIENvbnZlbmllbmNlcyB3cmFwcGVyIGZvciBzaW1wbGUgbGlzdGVuZXIgaG9va3MKK2ludCBIUmVnaXN0ZXJMaXN0ZW5lcihpbnQgaG9va2lkLCBtaXhlZCBjb25zdW1lcikKK3sKKyAgcmV0dXJuIEhSZWdpc3RlclRvSG9vayhob29raWQsIGNvbnN1bWVyLCBIX0hPT0tfT1RIRVJQUklPKDIpLCBIX0xJU1RFTkVSLCAwKTsKK30KKworLy8gQ252ZW5pZW5jZXMgd3JhcHBlciBmb3Igc2ltcGxlIG1vZGlmaWNhdG9yIGhvb2tzCitpbnQgSFJlZ2lzdGVyTW9kaWZpZXIoaW50IGhvb2tpZCwgbWl4ZWQgY29uc3VtZXIpCit7CisgIHJldHVybiBIUmVnaXN0ZXJUb0hvb2soaG9va2lkLCBjb25zdW1lciwgSF9IT09LX09USEVSUFJJTygyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBIX0hPT0tfTU9ESUZJQ0FUT1IsIDApOworfQorCisvLyBzdXJ2ZXlvcnMgYXJlIGFza2VkIGZvciBjYW5jZWxsYXRpb24gcGVybWl0dGFuY2UKK3Byb3RlY3RlZCBpbnQgYXNrU3VydmV5b3JzRm9yQ2FuY2VsQWxsb3dhbmNlKG1peGVkIHN1cnZleW9ycywKKyAgb2JqZWN0IG1vZGlmaXlpbmdPYixtaXhlZCBkYXRhLGludCBob29raWQsaW50IHByaW8sb2JqZWN0IGhvb2tPYil7CisKKyAgZm9yZWFjaChzdHJ1Y3QgaG9va19lbnRyeV9zIHN1cnZleW9yIDogc3VydmV5b3JzKSB7CisgICAgaWYgKGNsb3N1cmVwKHN1cnZleW9yLT5jbCkgJiYgc3VydmV5b3ItPmVuZHRpbWUgPj0gdGltZSgpKQorICAgIHsKKyAgICAgIC8vIHN1cnZleW9yIGhvb2sgZ3VlbHRpZy4KKyAgICAgIG9iamVjdCBzb2IgPSBHRVRfT0JKRUNUKHN1cnZleW9yLT5jbCk7CisgICAgICBpZiAoIXNvYi0+SG9va0NhbmNlbEFsbG93YW5jZUNhbGxiYWNrKG1vZGlmaXlpbmdPYiwgaG9va2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgaG9va09iLCBwcmlvLCBkYXRhKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisgIHJldHVybiAxOworfQorCisvLyBzdXJ2ZXlvcnMgYXJlIGFza2VkIGZvciBkYXRhIGNoYW5nZSBwZXJtaXR0YW5jZQorcHJvdGVjdGVkIGludCBhc2tTdXJ2ZXlvcnNGb3JNb2RpZmljYXRpb25BbGxvd2FuY2UobWl4ZWQgc3VydmV5b3JzLAorICBvYmplY3QgbW9kaWZpeWluZ09iLG1peGVkIGRhdGEsaW50IGhvb2tpZCxpbnQgcHJpbyxvYmplY3QgaG9va09iKXsKKworICBmb3JlYWNoKHN0cnVjdCBob29rX2VudHJ5X3Mgc3VydmV5b3IgOiBzdXJ2ZXlvcnMpIHsKKyAgICBpZiAoY2xvc3VyZXAoc3VydmV5b3ItPmNsKSAmJiBzdXJ2ZXlvci0+ZW5kdGltZSA+PSB0aW1lKCkpCisgICAgeworICAgICAgLy8gc3VydmV5b3IgaG9vayBndWVsdGlnLgorICAgICAgb2JqZWN0IHNvYiA9IEdFVF9PQkpFQ1Qoc3VydmV5b3ItPmNsKTsKKyAgICAgIGlmICghc29iLT5Ib29rTW9kaWZpY2F0aW9uQWxsb3dhbmNlQ2FsbGJhY2sobW9kaWZpeWluZ09iLAorICAgICAgICAgICAgICAgICAgICAgICAgaG9va2lkLCBob29rT2IsIHByaW8sIGRhdGEpKQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3Byb3RlY3RlZCBtaXhlZCBIb29rRmxvdyhpbnQgaG9va2lkLCBtaXhlZCBob29rZGF0YSl7CisgIG1peGVkIHRtcCwgcmV0OworCisgIHJldD0oe0hfTk9fTU9ELGhvb2tkYXRhfSk7CisKKyAgSF9ETVNHKHNwcmludGYoIkhvb2tGbG93IGhvb2tpZCAlZCBob29rZGF0YSAlT1xuIixob29raWQsaG9va2RhdGEpKTsKKworICBpZiAoIW1lbWJlcihob29rTWFwcGluZywgaG9va2lkKSkKKyAgICByZXR1cm4gcmV0OworCisgIHN0cnVjdCBob29rX3MgaG9vayA9IGhvb2tNYXBwaW5nW2hvb2tpZF07CisKKyAgLy8gbm90aWZ5IHN1cnZleW9ycworICBmb3JlYWNoKHN0cnVjdCBob29rX2VudHJ5X3MgaCA6IGhvb2stPnN1cnZleW9ycykgeworICAgIGlmIChjbG9zdXJlcChoLT5jbCkgJiYgaC0+ZW5kdGltZSA+PSB0aW1lKCkpCisgICAgeworICAgICAgLy8gSG9vayBndWVsdGlnCisgICAgICB0bXAgPSBmdW5jYWxsKGgtPmNsLCB0aGlzX29iamVjdCgpLCBob29raWQsIHJldFtIX1JFVERBVEFdKTsKKyAgICAgIGlmKHRtcFtIX1JFVENPREVdPT1IX0NBTkNFTExFRCkgeworICAgICAgICByZXRbSF9SRVRDT0RFXT1IX0NBTkNFTExFRDsKKyAgICAgICAgcmV0dXJuIHJldDsgIC8vIHVuZCB3ZWcuLi4KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYodG1wW0hfUkVUQ09ERV09PUhfQUxURVJFRCl7CisgICAgICAgIHJldFtIX1JFVENPREVdPUhfQUxURVJFRDsKKyAgICAgICAgcmV0W0hfUkVUREFUQV09dG1wW0hfUkVUREFUQV07CisgICAgICB9CisgICAgfQorICAgIC8vIHVuZ3VlbHRpZ2UvYWJnZWxhdWZlbmUgRWludHJhZWdlIC0+IEF1ZnJhZXVtZW4sIGFiZXIgbmljaHQgamV0enQuCisgICAgZWxzZSBpZiAoZmluZF9jYWxsX291dCgjJ0NsZWFuSG9va01hcHBpbmcpID09IC0xKSB7CisgICAgICBjYWxsX291dCgjJ0NsZWFuSG9va01hcHBpbmcsIDAsICh7aG9va2lkfSkpOworICAgIH0KKyAgfSAvLyBzdXJ2ZXlvcnMgZmVydGlnCisKKyAgLy8gbm90aWZ5IGhtb2RzCisgIGZvcmVhY2goc3RydWN0IGhvb2tfZW50cnlfcyBoIDogaG9vay0+aG1vZHMpIHsKKyAgICBpZiAoY2xvc3VyZXAoaC0+Y2wpICYmIGgtPmVuZHRpbWUgPj0gdGltZSgpKQorICAgIHsKKyAgICAgIC8vIEhvb2sgZ3VlbHRpZworICAgICAgdG1wID0gZnVuY2FsbChoLT5jbCwgdGhpc19vYmplY3QoKSwgaG9va2lkLCByZXRbSF9SRVREQVRBXSk7CisgICAgICBpZih0bXBbSF9SRVRDT0RFXT09SF9DQU5DRUxMRUQpIHsKKyAgICAgICAgLy8gYXNrIGFsbG93YW5jZSBpbiBzdXJ2ZXlvcnMKKyAgICAgICAgaWYoaC0+Y2wgJiYKKyAgICAgICAgICAgYXNrU3VydmV5b3JzRm9yQ2FuY2VsQWxsb3dhbmNlKGhvb2stPnN1cnZleW9ycywKKyAgICAgICAgICAgICAgR0VUX09CSkVDVChoLT5jbCksIGhvb2tkYXRhLCBob29raWQsCisgICAgICAgICAgICAgIGgtPnByaW8sIHRoaXNfb2JqZWN0KCkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXRbSF9SRVRDT0RFXSA9IEhfQ0FOQ0VMTEVEOworICAgICAgICAgICAgcmV0dXJuIHJldDsgLy8gdW5kIHJhdXMuLi4KKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSBpZih0bXBbSF9SRVRDT0RFXT09SF9BTFRFUkVEKSB7CisgICAgICAgIC8vIGFzayBhbGxvd2FuY2UgaW4gc3VydmV5b3JzCisgICAgICAgIGlmKGgtPmNsICYmCisgICAgICAgICAgIGFza1N1cnZleW9yc0Zvck1vZGlmaWNhdGlvbkFsbG93YW5jZShob29rLT5zdXJ2ZXlvcnMsCisgICAgICAgICAgICAgIEdFVF9PQkpFQ1QoaC0+Y2wpLGhvb2tkYXRhLCBob29raWQsCisgICAgICAgICAgICAgIGgtPnByaW8sdGhpc19vYmplY3QoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldFtIX1JFVENPREVdID0gSF9BTFRFUkVEOworICAgICAgICAgICAgcmV0W0hfUkVUREFUQV0gPSB0bXBbSF9SRVREQVRBXTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAvLyB1bmd1ZWx0aWdlL2FiZ2VsYXVmZW5lIEVpbnRyYWVnZSAtPiBBdWZyYWV1bWVuLCBhYmVyIG5pY2h0IGpldHp0LgorICAgIGVsc2UgaWYgKGZpbmRfY2FsbF9vdXQoIydDbGVhbkhvb2tNYXBwaW5nKSA9PSAtMSkgeworICAgICAgY2FsbF9vdXQoIydDbGVhbkhvb2tNYXBwaW5nLCAwLCAoe2hvb2tpZH0pKTsKKyAgICB9CisgIH0gLy8gaG1vZHMgZmVydGlnCisKKyAgLy8gbm90aWZ5IGRtb2RzCisgIGZvcmVhY2goc3RydWN0IGhvb2tfZW50cnlfcyBoIDogaG9vay0+ZG1vZHMpIHsKKyAgICBpZiAoY2xvc3VyZXAoaC0+Y2wpICYmIGgtPmVuZHRpbWUgPj0gdGltZSgpKQorICAgIHsKKyAgICAgIC8vIEhvb2sgZ3VlbHRpZworICAgICAgdG1wID0gZnVuY2FsbChoLT5jbCwgdGhpc19vYmplY3QoKSwgaG9va2lkLCByZXRbSF9SRVREQVRBXSk7CisgICAgICBpZih0bXBbSF9SRVRDT0RFXT09SF9BTFRFUkVEKSB7CisgICAgICAgIC8vIGFzayBhbGxvd2FuY2UgaW4gc3VydmV5b3JzCisgICAgICAgIGlmIChoLT5jbCAmJgorICAgICAgICAgICAgYXNrU3VydmV5b3JzRm9yTW9kaWZpY2F0aW9uQWxsb3dhbmNlKGhvb2stPnN1cnZleW9ycywKKyAgICAgICAgICAgICAgR0VUX09CSkVDVChoLT5jbCksaG9va2RhdGEsIGhvb2tpZCwKKyAgICAgICAgICAgICAgaC0+cHJpbyx0aGlzX29iamVjdCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0W0hfUkVUQ09ERV0gPSBIX0FMVEVSRUQ7CisgICAgICAgICAgICByZXRbSF9SRVREQVRBXSA9IHRtcFtIX1JFVERBVEFdOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIC8vIHVuZ3VlbHRpZ2UvYWJnZWxhdWZlbmUgRWludHJhZWdlIC0+IEF1ZnJhZXVtZW4sIGFiZXIgbmljaHQgamV0enQuCisgICAgZWxzZSBpZiAoZmluZF9jYWxsX291dCgjJ0NsZWFuSG9va01hcHBpbmcpID09IC0xKSB7CisgICAgICBjYWxsX291dCgjJ0NsZWFuSG9va01hcHBpbmcsIDAsICh7aG9va2lkfSkpOworICAgIH0KKyAgfSAvLyBkbW9kcyBmZXJ0aWcKKworICAvLyBub3RpZnkgbGlzdGVuZXIKKyAgZm9yZWFjaChzdHJ1Y3QgaG9va19lbnRyeV9zIGggOiBob29rLT5saXN0ZW5lcnMpIHsKKyAgICBpZiAoY2xvc3VyZXAoaC0+Y2wpICYmIGgtPmVuZHRpbWUgPj0gdGltZSgpKQorICAgIHsKKyAgICAgIC8vIEhvb2sgZ3VlbHRpZworICAgICAgZnVuY2FsbChoLT5jbCwgdGhpc19vYmplY3QoKSwgaG9va2lkLCByZXRbSF9SRVREQVRBXSk7CisgICAgfQorICAgIC8vIHVuZ3VlbHRpZ2UvYWJnZWxhdWZlbmUgRWludHJhZWdlIC0+IEF1ZnJhZXVtZW4sIGFiZXIgbmljaHQgamV0enQuCisgICAgZWxzZSBpZiAoZmluZF9jYWxsX291dCgjJ0NsZWFuSG9va01hcHBpbmcpID09IC0xKSB7CisgICAgICBjYWxsX291dCgjJ0NsZWFuSG9va01hcHBpbmcsIDAsICh7aG9va2lkfSkpOworICAgIH0KKyAgfSAvLyBsaXN0ZW5lciBmZXJ0aWcKKworICByZXR1cm4gcmV0OworfQorCmRpZmYgLS1naXQgYS9zdGQvaG9va19zdXJ2ZXlvci5jIGIvc3RkL2hvb2tfc3VydmV5b3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWZiMTkzCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL2hvb2tfc3VydmV5b3IuYwpAQCAtMCwwICsxLDQxIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gL3N0ZC9ob29rX3N1cnZleW9yLmMgIC0gQmFzaXNrbGFzc2UgZnVlciBTdXJ2ZXlvci1Ib29rcworLy8KKworI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworI3ByYWdtYSByYW5nZV9jaGVjaworCisjaW5jbHVkZSA8aG9vay5oPgorCisvLyBvdmVycmlkZSBhcyB3aXNoZWQgYW5kIG5lZWRlZAorCitpbnQgSG9va1JlZ2lzdHJhdGlvbkNhbGxiYWNrKG9iamVjdCByZWdpc3RyaW5nT2JqZWN0LCBpbnQgaG9va2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IGhvb2tTb3VyY2UsIGludCByZWdpc3RyaW5nT2JqZWN0c1ByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlZ2lzdHJpbmdPYmplY3RzVHlwZSkKK3sKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBIb29rQ2FuY2VsQWxsb3dhbmNlQ2FsbGJhY2sob2JqZWN0IGNhbmNlbGxpbmdPYmplY3QsIGludCBob29raWQsCisgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgaG9va1NvdXJjZSwgaW50IGNhbmNlbGxpbmdPYmplY3RzUHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICBtaXhlZCBob29rRGF0YSkKK3sKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBIb29rTW9kaWZpY2F0aW9uQWxsb3dhbmNlQ2FsbGJhY2sob2JqZWN0IG1vZGlmeWluZ09iamVjdCwgaW50IGhvb2tpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCBob29rU291cmNlLCBpbnQgbW9kaWZ5aW5nT2JqZWN0c1ByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZWQgaG9va0RhdGEpCit7CisgIHJldHVybiAxOworfQorCittaXhlZCBIb29rQ2FsbGJhY2sob2JqZWN0IGhvb2tTb3VyY2UsIGludCBob29raWQsIG1peGVkIGhvb2tEYXRhKQoreworICByZXR1cm4gKHtIX05PX01PRCxob29rRGF0YX0pOworfQorCmRpZmYgLS1naXQgYS9zdGQvaW5wYy5jIGIvc3RkL2lucGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2VkZDY3Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkL2lucGMuYwpAQCAtMCwwICsxLDYyIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gaW5wYy5jIC0tIEludGVsbGlnZW50ZXIgTlBDCisvLworLy8gJElkOiBpbnBjLmMgNjU3MSAyMDA3LTEwLTIxIDE0OjQxOjEwWiBaZXNzdHJhICQKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKworaW5oZXJpdCAiL3N0ZC9ucGMiOworaW5oZXJpdCAiL3N0ZC9pbnBjL25vYmFuayI7Citpbmhlcml0ICIvc3RkL2lucGMvc2VsZWN0IjsKK2luaGVyaXQgIi9zdGQvaW5wYy9ib296aW5nIjsKK2luaGVyaXQgIi9zdGQvaW5wYy9pdGVtcyI7Citpbmhlcml0ICIvc3RkL2lucGMvZXZhbCI7CisKKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDxpbnBjLmg+CisjZGVmaW5lIE1FIHRoaXNfb2JqZWN0KCkKKyNkZWZpbmUgRU5WIGVudmlyb25tZW50KCkKKyNkZWZpbmUgVFAgdGhpc19wbGF5ZXIoKQorCisjcHJhZ21hIHN0cm9uZ190eXBlcworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSB7CisgIG5wYzo6Y3JlYXRlKCk7CisgIGl0ZW1zOjpjcmVhdGUoKTsKKyAgYWRkX3NlbGVjdF9jb21tYW5kcygpOworfQorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGVfc3VwZXIoKSB7CisgIHNldF9uZXh0X3Jlc2V0KC0xKTsKK30KKwordm9pZCByZXNldCgpIHsKKyAgbnBjOjpyZXNldCgpOworICBpdGVtczo6cmVzZXQoKTsKK30KKwordm9pZCBpbml0KCkgeworICBucGM6OmluaXQoKTsKKyAgaWYgKFRQICYmIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoVFApKQorICAgIFNldFByb3AoUF9JTlBDX0xBU1RfUExBWUVSX0NPTlRBQ1QsdGltZSgpKTsKK30KKwordmFyYXJncyBpbnQgbW92ZShtaXhlZCBkZXN0LCBpbnQgbWV0aCwgc3RyaW5nIGRpciwgc3RyaW5nIHRpbiwgc3RyaW5nIHRvdXQpIHsKKyAgaW50IHJlczsKKyAgb2JqZWN0IGVudjsKKworICBlbnY9RU5WOworICBpZiAoIShtZXRoJk1fTk9DSEVDSykKKyAgICAgICYmICFFTlYKKyAgICAgICYmIFF1ZXJ5UHJvcChQX0lOUENfV0FMS19NT0RFKQorICAgICAgJiYgIW1heV9lbnRlcl9yb29tKGRlc3QpKQorICAgIHJldHVybiBNRV9DQU5UX1RQT1JUX0lOOworICByZXM9Ojptb3ZlKGRlc3QsbWV0aCxkaXIsdGluLHRvdXQpOworICBpZiAoZW52IT1FTlYpCisgICAgU2V0UHJvcChQX0lOUENfTEFTVF9FTlZJUk9OTUVOVCxFTlYpOworICByZXR1cm4gcmVzOworfQpkaWZmIC0tZ2l0IGEvc3RkL2lucGMvLnJlYWRtZSBiL3N0ZC9pbnBjLy5yZWFkbWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZjMWYxNAotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9pbnBjLy5yZWFkbWUKQEAgLTAsMCArMSwxMSBAQAorCitJTlBDOiBJbnRlbGxpZ2VudGVyIE5QQworKioqIElOIEVOVFdJQ0tMVU5HIC0gQkVOVVRaVU5HIEFVRiBFSUdFTkUgR0VGQUhSICoqKgorCitub2Jhbms6ICAgTW9uZXloYW5kbGVyK0JlaGFuZGx1bmcgdm9uIEJhbmt6d2VpdGllcword2Fsa2luZzogIExhdWZtb25zdGVyLCBhdXRvbWF0aXNjaGUgUm91dGVuc3VjaGUKK2Jvb3ppbmc6ICBPcHRpbWFsZSBTYWV1ZmVyZWkKK3NlbGVjdDogICBBdXN3YWhsIGd1dGVyIE9iamVrdGUgKGJlc3RlIFdhZmZlL1J1ZXN0dW5nLi4uKQorZXZhbC5jOiAgIEdlZ25lciBlaW5zY2hhZXR6ZW4KK2l0ZW1zLmM6ICBXYWZmZW4sIFJ1ZXN0dW5nZW4gZWluZmFjaCBlaW5mdWVnZW4sIGF1dG9tYXRpc2NoIGltIFJlc2V0IHp1ZWNrZW4KKwpkaWZmIC0tZ2l0IGEvc3RkL2lucGMvYm9vemluZy5jIGIvc3RkL2lucGMvYm9vemluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMjRmNTIKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvaW5wYy9ib296aW5nLmMKQEAgLTAsMCArMSw2MiBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGlucGMvYm9vemluZy5jIC0tIEludGVsbGlnZW50ZXMgU2F1ZmVuCisvLworLy8gJElkOiBib296aW5nLmMgODM5NiAyMDEzLTAyLTE4IDIxOjU2OjM3WiBaZXNzdHJhICQKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDx0aGluZy5oPgorI2luY2x1ZGUgPGxpdmluZy5oPgorI2luY2x1ZGUgPGlucGMuaD4KKyNpbmNsdWRlIDxjb250YWluZXIvbW9uZXloYW5kbGVyLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCisjZGVmaW5lIERSSU5LX0lEUyAxCisjZGVmaW5lIERSSU5LX0NPU1QgMgorI2RlZmluZSBEUklOS19IRUFMIDMKKyNkZWZpbmUgRFJJTktfQUxDIDQKKyNkZWZpbmUgRFJJTktfU0FUIDUKKworaW50IERyaW5rKCkgeworICBtaXhlZCBkcmlua3M7CisgIG9iamVjdCBlbnY7CisgIGludCBpLG1heCxtb24saGRpZmY7CisgCisgIGlmICgobW9uPVF1ZXJ5TW9uZXkoKSk8PTAKKyAgICAgIHx8ICEoZW52PWVudmlyb25tZW50KCkpCisgICAgICB8fCAhcG9pbnRlcnAoZHJpbmtzPWVudi0+cXVlcnlfZHJpbmsoKSkKKyAgICAgIHx8IChoZGlmZj1RdWVyeVByb3AoUF9NQVhfSFApLVF1ZXJ5UHJvcChQX0hQKSk8PTApCisgICAgcmV0dXJuIDA7CisgIG1heD0tMTsKKyAgZm9yIChpPXNpemVvZihkcmlua3MpLTE7aT49MDtpLS0pIHsKKyAgICBpZiAoZHJpbmtzW2ldW0RSSU5LX0NPU1RdPm1vbgorICAgICAgICB8fCAoKGRyaW5rc1tpXVtEUklOS19BTENdPjApICYmCisJICAgICgoZHJpbmtzW2ldW0RSSU5LX0FMQ10rUXVlcnlQcm9wKFBfQUxDT0hPTCkpCisJICAgICA+ICgxMDAtUXVlcnlQcm9wKFBfSV9IQVRFX0FMQ09IT0wpKSkpCisgICAgICAgIHx8IGRyaW5rc1tpXVtEUklOS19TQVRdK1F1ZXJ5UHJvcChQX0RSSU5LKT4xMDAKKyAgICAgICAgfHwgZHJpbmtzW2ldW0RSSU5LX0hFQUxdPD0wKQorICAgICAgY29udGludWU7CisgICAgaWYgKG1heDwwCisgICAgICAgIHx8IChkcmlua3NbaV1bRFJJTktfSEVBTF0+ZHJpbmtzW21heF1bRFJJTktfSEVBTF0gJiYKKyAgICAgICAgICAgIGRyaW5rc1ttYXhdW0RSSU5LX0hFQUxdPGhkaWZmKQorICAgICAgICB8fCAoZHJpbmtzW2ldW0RSSU5LX0hFQUxdPj1oZGlmZiAmJgorICAgICAgICAgICAgZHJpbmtzW2ldW0RSSU5LX0NPU1RdPGRyaW5rc1ttYXhdW0RSSU5LX0NPU1RdKSkKKyAgICAgIG1heD1pOworICB9CisgIGlmIChtYXg8MCkgcmV0dXJuIDA7CisgIGNvbW1hbmQoImJlc3RlbGwgIitkcmlua3NbbWF4XVtEUklOS19JRFNdWzBdKTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgRHJpbmtMb29wKCkgeworICB3aGlsZSAocmVtb3ZlX2NhbGxfb3V0KCJEcmlua0xvb3AiKT49MCk7CisgIGlmICghRHJpbmsoKSkKKyAgICByZXR1cm47CisgIGNhbGxfb3V0KCJEcmlua0xvb3AiLDApOworfQorCmRpZmYgLS1naXQgYS9zdGQvaW5wYy9ldmFsLmMgYi9zdGQvaW5wYy9ldmFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc1NTU3NgotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9pbnBjL2V2YWwuYwpAQCAtMCwwICsxLDE4OSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGlucGMvZXZhbC5jIC0tIEVpbnNjaGFldHplbiB2b24gR2VnbmVybgorLy8KKy8vICRJZDogZXZhbC5jIDYzNzEgMjAwNy0wNy0xNyAyMjo0Njo1MFogWmVzc3RyYSAkCisjcHJhZ21hIHN0cm9uZ190eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxpdmluZy5oPgorI3VuZGVmIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx0aGluZy5oPgorI2luY2x1ZGUgPGlucGMuaD4KKwordmFyYXJncyB2b2lkIFNldEV2YWxGYWN0b3IobWl4ZWQgd2hhdCwgaW50IGZhYywgaW50IG9mZikgeworICBtYXBwaW5nIG9mZnMsZmFjczsKKworICBpZiAoIW1hcHBpbmdwKGZhY3M9UXVlcnlQcm9wKFBfRVZBTF9GQUNUT1JTKSkpIGZhY3M9KFtdKTsKKyAgaWYgKCFtYXBwaW5ncChvZmZzPVF1ZXJ5UHJvcChQX0VWQUxfT0ZGU0VUUykpKSBvZmZzPShbXSk7CisgIGZhY3Nbd2hhdF09ZmFjOworICBvZmZzW3doYXRdPW9mZjsKKyAgU2V0UHJvcChQX0VWQUxfRkFDVE9SUyxmYWNzKTsKKyAgU2V0UHJvcChQX0VWQUxfT0ZGU0VUUyxvZmZzKTsKK30KKwordm9pZCBTZXREZWZhdWx0RXZhbEZhY3RvcnMoKSB7CisgIFNldEV2YWxGYWN0b3IoUF9IUCwxNTAsLTYwKTsKKyAgU2V0RXZhbEZhY3RvcihQX1RPVEFMX1dDLDI1MCwwKTsKKyAgU2V0RXZhbEZhY3RvcihQX1RPVEFMX0FDLDEwMDAsLTUwKTsKKyAgU2V0RXZhbEZhY3RvcigiYWJlbnRldXJlcl9wZmVpbCIsMywwKTsKKyAgU2V0RXZhbEZhY3RvcigiYWJlbnRldXJlcl9mZXVlcmJhbGwiLDgsMCk7Cit9CisKK3ZhcmFyZ3MgaW50Cittb2RpZnlfZXZhbChvYmplY3Qgb2IsIG1peGVkIHdoYXQsIG1hcHBpbmcgZmFjLCBtYXBwaW5nIG9mZiwgaW50IHZhbCkgeworICBpZiAoIXZhbCkgdmFsPVF1ZXJ5UHJvcCh3aGF0KTsKKyAgdmFsLT1vZmZbd2hhdF07CisgIGlmICh2YWw8MCkgdmFsPTA7CisgIHZhbD0odmFsKmZhY1t3aGF0XSkvMTAwMDA7CisgIGlmICh2YWw+MjAwKSB2YWw9MjAwOworICByZXR1cm4gdmFsOworfQorCit2YXJhcmdzIGludCBldmFsX2VuZW15KG9iamVjdCBlbmVteSwgbWFwcGluZyBmYWMsIG1hcHBpbmcgb2ZmKSB7CisgIGludCByZXM7CisgIHN0cmluZyBnaWxkZTsKKyAgCisgIGlmICghb2JqZWN0cChlbmVteSkpIHJldHVybiAwOworICBpZiAoIW1hcHBpbmdwKGZhYykpIGZhYz1RdWVyeVByb3AoUF9FVkFMX0ZBQ1RPUlMpOworICBpZiAoIW1hcHBpbmdwKGZhYykpIGZhYz0oW10pOworICBpZiAoIW1hcHBpbmdwKG9mZikpIG9mZj1RdWVyeVByb3AoUF9FVkFMX09GRlNFVFMpOworICBpZiAoIW1hcHBpbmdwKG9mZikpIG9mZj0oW10pOworCisgIHJlcz0wOworICByZXMrPW1vZGlmeV9ldmFsKGVuZW15LFBfVE9UQUxfV0MsZmFjLG9mZik7CisgIHJlcys9bW9kaWZ5X2V2YWwoZW5lbXksUF9UT1RBTF9BQyxmYWMsb2ZmKTsKKyAgcmVzKz1tb2RpZnlfZXZhbChlbmVteSxQX0hQLGZhYyxvZmYpOworICBpZiAoc3RyaW5ncChnaWxkZT1lbmVteS0+UXVlcnlQcm9wKFBfR1VJTEQpKSkKKyAgICByZXMrPWNhbGxfb3RoZXIodGhpc19vYmplY3QoKSwiZXZhbF9ndWlsZF8iK2dpbGRlLGVuZW15LGZhYyxvZmYsZ2lsZGUpOworICBpZiAocmVzPDApIHJlcz0wOworICBpZiAocmVzPjEwMDApIHJlcz0xMDAwOworICByZXR1cm4gcmVzOworfQorCit2YXJhcmdzIG1peGVkICpldmFsX2VuZW1pZXMobWFwcGluZyBmYWMsIG1hcHBpbmcgb2ZmLCBvYmplY3QgKmhlcmUpIHsKKyAgaW50IGksc3o7CisgIG1peGVkICpyZXM7CisKKyAgcmVzPSh7fSk7CisgIGlmICghaGVyZSkKKyAgICBoZXJlPVByZXNlbnRFbmVtaWVzKCk7CisgIGlmICghcG9pbnRlcnAoaGVyZSkgfHwgIShzej1zaXplb2YoaGVyZSkpKQorICAgIHJldHVybiByZXM7CisgIGlmICghbWFwcGluZ3AoZmFjKSkgZmFjPVF1ZXJ5UHJvcChQX0VWQUxfRkFDVE9SUyk7CisgIGlmICghbWFwcGluZ3AoZmFjKSkgZmFjPShbXSk7CisgIGlmICghbWFwcGluZ3Aob2ZmKSkgb2ZmPVF1ZXJ5UHJvcChQX0VWQUxfT0ZGU0VUUyk7CisgIGlmICghbWFwcGluZ3Aob2ZmKSkgb2ZmPShbXSk7CisKKyAgZm9yIChpPXN6LTE7aT49MDtpLS0pCisgICAgcmVzKz0oeyh7aGVyZVtpXSxldmFsX2VuZW15KGhlcmVbaV0sZmFjLG9mZil9KX0pOworICByZXR1cm4gcmVzOworfQorCit2YXJhcmdzIGludCBzdW1fZXZhbF9lbmVtaWVzKG1hcHBpbmcgZmFjLCBtYXBwaW5nIG9mZiwgb2JqZWN0ICpoZXJlKSB7CisgIGludCByZXMsaTsKKyAgbWl4ZWQgKmV2YWxzLHgseTsKKworICByZXM9MDsKKyAgaWYgKCFwb2ludGVycChldmFscz1ldmFsX2VuZW1pZXMoZmFjLG9mZixoZXJlKSkpCisgICAgcmV0dXJuIHJlczsKKyAgZm9yIChpPXNpemVvZihldmFscyktMTtpPj0wO2ktLSkKKyAgICBpZiAocG9pbnRlcnAoeD1ldmFsc1tpXSkgJiYgc2l6ZW9mKHgpPj0yICYmIGludHAoeT14WzFdKSkKKyAgICAgIHJlcys9eTsKKyAgcmV0dXJuIHJlczsKK30KKwordmFyYXJncyBvYmplY3QgKm1pbmltaXplX3Byb3BfZmlsdChvYmplY3QgKmhlcmUsIG1peGVkIHByb3ApIHsKKyAgb2JqZWN0ICpvYnMsb2I7CisgIGludCBpLG1ocCxocCxzejsKKyAgCisgIG9icz0wOworICBpZiAoIXBvaW50ZXJwKGhlcmUpKQorICAgIGhlcmU9UHJlc2VudEVuZW1pZXMoKTsKKyAgaWYgKCFwcm9wKQorICAgIHByb3A9UF9IUDsKKyAgZm9yIChpPXNpemVvZihoZXJlKS0xO2k+PTA7aS0tKSB7CisgICAgaWYgKG9iamVjdHAob2I9aGVyZVtpXSkpIHsKKyAgICAgIGhwPW9iLT5RdWVyeVByb3AocHJvcCk7CisgICAgICBpZiAoIXBvaW50ZXJwKG9icykgfHwgaHA8bWhwKSB7CisJb2JzPSh7b2J9KTsKKwltaHA9aHA7CisgICAgICB9IGVsc2UgaWYgKGhwPT1taHApIHsKKwlvYnMrPSh7b2J9KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKCFwb2ludGVycChvYnMpKQorICAgIG9icz0oe30pOworICByZXR1cm4gb2JzOworfQorCit2YXJhcmdzIG9iamVjdCAqbWF4aW1pemVfcHJvcF9maWx0KG9iamVjdCAqaGVyZSwgbWl4ZWQgcHJvcCkgeworICBvYmplY3QgKm9icyxvYjsKKyAgaW50IGksbXdjLHdjLHN6OworICAKKyAgb2JzPTA7CisgIGlmICghcG9pbnRlcnAoaGVyZSkpCisgICAgaGVyZT1QcmVzZW50RW5lbWllcygpOworICBpZiAoIXByb3ApCisgICAgcHJvcD1QX1RPVEFMX1dDOworICBmb3IgKGk9c2l6ZW9mKGhlcmUpLTE7aT49MDtpLS0pIHsKKyAgICBpZiAob2JqZWN0cChvYj1oZXJlW2ldKSkgeworICAgICAgd2M9b2ItPlF1ZXJ5UHJvcChwcm9wKTsKKyAgICAgIGlmICghcG9pbnRlcnAob2JzKSB8fCB3Yzxtd2MpIHsKKwlvYnM9KHtvYn0pOworCW13Yz13YzsKKyAgICAgIH0gZWxzZSBpZiAod2M9PW13YykgeworCW9icys9KHtvYn0pOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoIXBvaW50ZXJwKG9icykpCisgICAgb2JzPSh7fSk7CisgIHJldHVybiBvYnM7Cit9CisKK3ZhcmFyZ3Mgb2JqZWN0ICpwbGF5ZXJfZmlsdChvYmplY3QgKmhlcmUpIHsKKyAgb2JqZWN0ICpvYnMsb2I7CisgIGludCBpOworICAKKyAgb2JzPSh7fSk7CisgIGlmICghcG9pbnRlcnAoaGVyZSkpCisgICAgaGVyZT1QcmVzZW50RW5lbWllcygpOworICBmb3IgKGk9c2l6ZW9mKGhlcmUpLTE7aT49MDtpLS0pCisgICAgaWYgKG9iamVjdHAob2I9aGVyZVtpXSkgJiYgcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYikpCisgICAgICBvYnMrPSh7b2J9KTsKKyAgcmV0dXJuIG9iczsKK30KKwordmFyYXJncyBvYmplY3Qgc2VsZWN0X2VuZW15X21pbl9wcm9wKG9iamVjdCAqaGVyZSwgbWl4ZWQgcHJvcCkgeworICBvYmplY3QgKm9iczsKKyAgaW50IHN6OworCisgIGlmIChwb2ludGVycChvYnM9bWluaW1pemVfcHJvcF9maWx0KGhlcmUscHJvcCkpICYmIChzej1zaXplb2Yob2JzKSkpCisgICAgcmV0dXJuIG9ic1tyYW5kb20oc3opXTsKKyAgcmV0dXJuIDA7Cit9CisKK3ZhcmFyZ3Mgb2JqZWN0IHNlbGVjdF9lbmVteV9tYXhfcHJvcChvYmplY3QgKmhlcmUsIG1peGVkIHByb3ApIHsKKyAgb2JqZWN0ICpvYnM7CisgIGludCBzejsKKworICBpZiAocG9pbnRlcnAob2JzPW1heGltaXplX3Byb3BfZmlsdChoZXJlLHByb3ApKSAmJiAoc3o9c2l6ZW9mKG9icykpKQorICAgIHJldHVybiBvYnNbcmFuZG9tKHN6KV07CisgIHJldHVybiAwOworfQorCit2YXJhcmdzIG9iamVjdCBzZWxlY3RfcGxheWVyX21pbl9wcm9wKG9iamVjdCAqaGVyZSwgbWl4ZWQgcHJvcCkgeworICByZXR1cm4gc2VsZWN0X2VuZW15X21pbl9wcm9wKHBsYXllcl9maWx0KGhlcmUpLHByb3ApOworfQorCit2YXJhcmdzIG9iamVjdCBzZWxlY3RfcGxheWVyX21heF9wcm9wKG9iamVjdCAqaGVyZSwgbWl4ZWQgcHJvcCkgeworICByZXR1cm4gc2VsZWN0X2VuZW15X21heF9wcm9wKHBsYXllcl9maWx0KGhlcmUpLHByb3ApOworfQpkaWZmIC0tZ2l0IGEvc3RkL2lucGMvaXRlbXMuYyBiL3N0ZC9pbnBjL2l0ZW1zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFmZGQwNAotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9pbnBjL2l0ZW1zLmMKQEAgLTAsMCArMSw3OCBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGlucGMvaXRlbXMuYyAtLSBEaWUgcmljaHRpZ2UgQXVzcnVlc3R1bmcgdHJhZ2VuCisvLworLy8gJElkOiBpdGVtcy5jIDY1NzEgMjAwNy0xMC0yMSAxNDo0MToxMFogWmVzc3RyYSAkCisjcHJhZ21hIHN0cm9uZ190eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisKKyNpbmNsdWRlIDx0aGluZy5oPgorI2luY2x1ZGUgPGlucGMuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bW92aW5nLmg+CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpIHsKKyAgU2V0UHJvcChQX0lURU1TLCh7MH0pKTsKK30KKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlX3N1cGVyKCkgeworICBzZXRfbmV4dF9yZXNldCgtMSk7Cit9CisKK3ZvaWQgQWRkV2VhcG9uKHN0cmluZyBubSwgc3RyaW5nIHBhdGgpIHsKKyAgb2JqZWN0IG9iOworICBtaXhlZCAqaXQ7CisgIAorICBpZiAoIXBhdGggfHwgIW5tKSByZXR1cm47CisgIGlmIChvYj1jbG9uZV9vYmplY3QocGF0aCkpIHsKKyAgICBvYi0+bW92ZSh0aGlzX29iamVjdCgpLE1fTk9DSEVDSyk7CisgICAgY29tbWFuZCgienVlY2tlICIrbm0pOworICB9CisgIGl0PVF1ZXJ5UHJvcChQX0lURU1TKTsKKyAgaWYgKCFwb2ludGVycChpdCkgfHwgIXNpemVvZihpdCkpIGl0PSh7MH0pOworICBpdFswXT0oe29iLHBhdGgsbm19KTsKKyAgU2V0UHJvcChQX0lURU1TLGl0KTsKK30KKwordm9pZCBBZGRBcm1vdXIoc3RyaW5nIG5tLCBzdHJpbmcgcGF0aCkgeworICBvYmplY3Qgb2I7CisgIG1peGVkICppdDsKKyAgCisgIGlmICghcGF0aCB8fCAhbm0pIHJldHVybjsKKyAgaWYgKG9iPWNsb25lX29iamVjdChwYXRoKSkgeworICAgIG9iLT5tb3ZlKHRoaXNfb2JqZWN0KCksTV9OT0NIRUNLKTsKKyAgICBjb21tYW5kKCJ6aWVoICIrbm0rIiBhbiIpOworICB9CisgIGl0PVF1ZXJ5UHJvcChQX0lURU1TKTsKKyAgaWYgKCFwb2ludGVycChpdCkgfHwgIXNpemVvZihpdCkpIGl0PSh7MH0pOworICBpdCs9KHtvYixwYXRoLG5tfSk7CisgIFNldFByb3AoUF9JVEVNUyxpdCk7Cit9CisKK3ZvaWQgcmVzZXQoKSB7CisgIG1peGVkICppdCx4OworICBpbnQgaTsKKyAgb2JqZWN0IG9iOworICAKKyAgaWYgKCFwb2ludGVycChpdD1RdWVyeVByb3AoUF9JVEVNUykpKSByZXR1cm47CisgIGZvciAoaT1zaXplb2YoaXQpLTE7aT49MDtpLS0pIHsKKyAgICB4PWl0W2ldOworICAgIGlmICghcG9pbnRlcnAoeCkgfHwgc2l6ZW9mKHgpPDMpIGNvbnRpbnVlOworICAgIGlmICghb2JqZWN0cCh4WzBdKSkgeworICAgICAgaWYgKG9iPWNsb25lX29iamVjdCh4WzFdKSkKKwlvYi0+bW92ZSh0aGlzX29iamVjdCgpLE1fTk9DSEVDSyk7CisgICAgICB4WzBdPW9iOworICAgIH0KKyAgICBpZiAob2JqZWN0cCh4WzBdKSkgeworICAgICAgaWYgKGkpCisJY29tbWFuZCgiemllaCAiK3hbMl0rIiBhbiIpOworICAgICAgZWxzZQorCWNvbW1hbmQoInp1ZWNrZSAiK3hbMl0pOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3RkL2lucGMvbm9iYW5rLmMgYi9zdGQvaW5wYy9ub2JhbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjA0YWVmCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL2lucGMvbm9iYW5rLmMKQEAgLTAsMCArMSwxMDAgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBpbnBjL25vYmFuay5jIC0tIE5pZWRlciBtaXQgQmFua3p3ZWl0aWVzIQorLy8KKy8vICRJZDogbm9iYW5rLmMgODk2NiAyMDE0LTExLTE5IDIxOjQxOjEyWiBaZXNzdHJhICQKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKworaW5oZXJpdCAiL3N0ZC9saXZpbmcvbW9uZXloYW5kbGVyIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxhdHRyaWJ1dGVzLmg+CisjaW5jbHVkZSA8bW9uZXkuaD4KKyNkZWZpbmUgTUUgdGhpc19vYmplY3QoKQorCitpbnQgRGVlcFF1ZXJ5TW9uZXkob2JqZWN0IG9iKSB7CisgIGludCByZXMsaTsKKyAgb2JqZWN0ICpvYnM7CisgIAorICBpZiAoIW9iKSByZXR1cm4gMDsKKyAgcmVzPTA7b2JzPWRlZXBfaW52ZW50b3J5KG9iKTsKKyAgZm9yIChpPXNpemVvZihvYnMpLTE7aT49MDtpLS0pCisgICAgaWYgKChvYj1vYnNbaV0pICYmIGxvYWRfbmFtZShvYik9PUdFTEQpCisgICAgICByZXMrPW9iLT5RdWVyeVByb3AoUF9BTU9VTlQpOworICByZXR1cm4gcmVzOworfQorCitpbnQgaXNfYmFuayhvYmplY3Qgb2IpIHsKKyAgaW50ICpzdGF0cyxnZWxkOworICAKKyAgaWYgKCFvYiB8fCAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYikpIHJldHVybiAwOworICBzdGF0cz0oe29iLT5RdWVyeUF0dHJpYnV0ZShBX1NUUiksCisJICBvYi0+UXVlcnlBdHRyaWJ1dGUoQV9JTlQpLAorCSAgb2ItPlF1ZXJ5QXR0cmlidXRlKEFfREVYKSwKKwkgIG9iLT5RdWVyeUF0dHJpYnV0ZShBX0NPTiksCisJICAwfSk7CisgIHN0YXRzWzRdPXN0YXRzWzFdK3N0YXRzWzJdK3N0YXRzWzNdOworICBnZWxkPURlZXBRdWVyeU1vbmV5KG9iKTsKKyAgCisgIGlmIChzdGF0c1swXT49MTAKKyAgICAgICYmIHN0YXRzWzRdPHN0YXRzWzBdCisgICAgICAmJiBnZWxkPjUwMDAKKyAgICAgICYmIG9iLT5RdWVyeVByb3AoUF9YUCk8MzAwMDAwCisgICAgICAmJiBvYi0+UXVlcnlQcm9wKFBfUVApPDMwMCkKKyAgICByZXR1cm4gZ2VsZDsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBEZWVwVHJhbnNmZXJNb25leShvYmplY3QgcGwsIGludCBhbW91bnQpIHsKKyAgb2JqZWN0ICpvYnMsb2I7CisgIGludCBhY3QsdHJhbnMsaTsKKyAgCisgIGlmICghcGwgfHwgYW1vdW50PD0wKQorICAgIHJldHVybiAwOworICBpZiAocGwtPlF1ZXJ5TW9uZXkoKT49YW1vdW50KSB7CisgICAgcGwtPkFkZE1vbmV5KC0xKmFtb3VudCk7CisgICAgdHJhbnM9YW1vdW50OworICB9IGVsc2UgeworICAgIG9icz1kZWVwX2ludmVudG9yeShwbCk7dHJhbnM9MDsKKyAgICBmb3IgKGk9c2l6ZW9mKG9icyktMTtpPj0wO2ktLSkgeworICAgICAgaWYgKChvYj1vYnNbaV0pICYmIGxvYWRfbmFtZShvYik9PUdFTEQpIHsKKwlhY3Q9b2ItPlF1ZXJ5UHJvcChQX0FNT1VOVCk7CisJaWYgKGFjdDw9MCkgY29udGludWU7CisJaWYgKGFjdD49YW1vdW50KSB7IC8vIG1laHIgR2VsZCBhbHMgYmVub2V0aWd0PworCSAgb2ItPlNldFByb3AoUF9BTU9VTlQsYWN0LWFtb3VudCk7IC8vIGFiemllaGVuCisJICB0cmFucys9YW1vdW50OyAKKwkgIGFtb3VudD0wOyAvLyBuaWNodHMgbWVociBiZW5vZXRpZ3QKKwkgIGJyZWFrOyAgICAvLyBhbHNvIGF1Y2ggZW5kZQorCX0KKwlhbW91bnQtPWFjdDsKKwl0cmFucys9YWN0OworCW9iLT5yZW1vdmUoKTsgLy8gYWJ6aWVoZW4gd2FzIGRhIGlzdAorICAgICAgfQorICAgIH0KKyAgfQorICBsb2dfZmlsZSgic3RvbGVuX21vbmV5IiwKKwkgICBzcHJpbnRmKCIlcyAlTzogJU8gKCVPKVxuIixjdGltZSh0aW1lKCkpWzQuLjE1XSxwbCx0cmFucyxNRSkpOworICBBZGRNb25leSh0cmFucyk7CisgIHJldHVybiB0cmFuczsKK30KKwordmFyYXJncyBpbnQgVGVzdEFuZFRyYW5zZmVyKG9iamVjdCBvYiwgaW50IHRyYW5zLCBzdHJpbmcgbXNnKSB7CisgIGludCBnZWxkLGFienVnOworCisgIGlmICgoZ2VsZD1pc19iYW5rKG9iKSk8PTApIHJldHVybiAwOworICBpZiAodHJhbnM8MCkKKyAgICBhYnp1Zz0oZ2VsZCp0cmFucykvLTEwMDsgLy8gUHJvemVudHNhdHoKKyAgZWxzZQorICAgIGFienVnPXRyYW5zOyAgICAgICAgICAgICAvLyBmZXN0ZXIgQWJ6dWcKKyAgaWYgKGFienVnPmdlbGQpIGFienVnPWdlbGQ7CisgIGlmIChhYnp1Zzw9MCkgcmV0dXJuIDA7CisgIGFienVnPURlZXBUcmFuc2Zlck1vbmV5KG9iLGFienVnKTsKKyAgaWYgKGFienVnPD0wKSByZXR1cm4gMDsgIAorICBpZiAobXNnICYmIG9iKQorICAgIHRlbGxfb2JqZWN0KG9iLHNwcmludGYobXNnLGFienVnKSk7CisgIHJldHVybiBhYnp1ZzsKK30KZGlmZiAtLWdpdCBhL3N0ZC9pbnBjL3NlbGVjdC5jIGIvc3RkL2lucGMvc2VsZWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDczZWJlZAotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9pbnBjL3NlbGVjdC5jCkBAIC0wLDAgKzEsMzM3IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gaW5wYy9zZWxlY3QuYyAtLSBCZXN0ZSBBdXNydWVzdHVuZyBzdWNoZW4KKy8vCisvLyAkSWQ6IHNlbGVjdC5jIDY5OTggMjAwOC0wOC0yNCAxNzoxNzo0NlogWmVzc3RyYSAkCisjcHJhZ21hIHN0cm9uZ190eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisKKyNpbmNsdWRlIDx0aGluZy5oPgorI2luY2x1ZGUgPGxpdmluZy5oPgorI2luY2x1ZGUgPGlucGMuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8Y29tYmF0Lmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKworI2RlZmluZSBNRSB0aGlzX29iamVjdCgpCisKK21hcHBpbmcgc2Nhbl9vYmplY3RzKG1peGVkIHNyYykgeworICAvLyBFcm1pdHRlbHQgenUgamVkZW0gVHlwIChXYWZmZSwgUnVlc3R1bmdzdHlwLi4uKSBhbGxlIE9iamVrdGUgZGllc2VuIFR5cHMKKyAgLy8gR2VzdWNodCB3aXJkOiAtIEltIEludmVudG9yeSwgZmFsbHMgT2JqZWt0IGFuZ2VnZWJlbgorICAvLyAgICAgICAgICAgICAgIC0gSW0gQXJyYXksIGZhbGxzIEFycmF5IGFuZ2VnZWJlbgorICBvYmplY3QgKm9iczsKKyAgbWFwcGluZyByZXM7CisgIG1peGVkIHg7CisgIGludCBpLGNvc3QsY29zdF9saW1pdDsKKworICBpZiAobWFwcGluZ3Aoc3JjKSkKKyAgICByZXR1cm4gc3JjOworICByZXM9KFtdKTsKKyAgaWYgKG9iamVjdHAoc3JjKSkKKyAgICBzcmM9YWxsX2ludmVudG9yeShzcmMpOworICBpZiAoIXBvaW50ZXJwKHNyYykpCisgICAgc3JjPSh7c3JjfSk7CisgIAorICBjb3N0X2xpbWl0ID0gZ2V0X2V2YWxfY29zdCgpLzM7CisgIGZvcmVhY2gob2JqZWN0IG9iOiBzcmMpCisgIHsKKyAgICBpZiAoIChjb3N0PWdldF9ldmFsX2Nvc3QoKSkgPCBjb3N0X2xpbWl0ICkKKyAgICB7CisgICAgICBsb2dfZmlsZSgicm9jaHVzL3JhZXViZXJfZXZhbCIsCisgICAgICAgIGN0aW1lKCkrInNlbGVjdDo6c2Nhbl9vYmplY3RzKCkuIFJlc3QgIit0b19zdHJpbmcoY29zdCkrCisgICAgICAgICIsIGk9Iit0b19zdHJpbmcoaSkrIiwgU2l6ZSAiK3RvX3N0cmluZyhzaXplb2Yoc3JjKSkrIi5cbiIpOworICAgICAgcmV0dXJuIHJlczsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIW9iamVjdHAob2IpKQorICAgICAgY29udGludWU7CisgICAgaWYgKHg9b2ItPlF1ZXJ5UHJvcChQX0FSTU9VUl9UWVBFKSkKKyAgICAgIDsKKyAgICBlbHNlIGlmIChvYi0+UXVlcnlQcm9wKFBfV0VBUE9OX1RZUEUpKQorICAgICAgeD1PVF9XRUFQT047CisgICAgZWxzZSBpZiAob2ItPlF1ZXJ5UHJvcChQX0NPTUJBVENNRFMpKQorICAgICAgeD1PVF9DT01CQVRfT0JKRUNUOworICAgIGVsc2UKKyAgICAgIHg9T1RfTUlTQzsKKyAgICBpZiAoIXBvaW50ZXJwKG9icz1yZXNbeF0pKQorICAgICAgb2JzPSh7fSk7CisgICAgb2JzKz0oe29ifSk7CisgICAgcmVzW3hdPW9iczsKKyAgfQorICByZXR1cm4gcmVzOworfQorCittaXhlZCAqZmluZF9vYmplY3RfYnlfdHlwZShtaXhlZCBmcm9tLCBtaXhlZCB0eXApIHsKKyAgLy8gRmluZGV0IGFsbCBPYmpla3RlIGVpbmVzIFR5cHMsIHouQi4gYWxsZSBXYWZmZW4gaW0gTW9uc3RlcgorICAvLyA8ZnJvbT4ga2FubiBhdWNoIGVpbiBNYXBwaW5nIHNlaW4sIGRhcyBzY2hvbiBkaWUgbWl0IHNjYW5fb2JqZWN0cworICAvLyBlcnN0ZWxsdCBLbGFzc2lmaWthdGlvbiBlbnRoYWVsdCwgZGFtaXQgZGllc2UgbmljaHQgbWVocmZhY2gKKyAgLy8gZXJzdGVsbHQgd2VyZGVuIG11c3MuCisgIG1peGVkIHJlczsKKworICBpZiAoIW1hcHBpbmdwKGZyb20pKQorICAgIGZyb209c2Nhbl9vYmplY3RzKGZyb20pOworICBpZiAoIW1hcHBpbmdwKGZyb20pIHx8CisgICAgICAhcG9pbnRlcnAocmVzPWZyb21bdHlwXSkpCisgICAgcmV0dXJuICh7fSk7CisgIHJldHVybiByZXM7Cit9CisKK2ludCBldmFsX3dlYXBvbihvYmplY3Qgb2IpIHsKKyAgcmV0dXJuIG9iLT5RdWVyeVByb3AoUF9XQyk7Cit9CisKK29iamVjdCBmaW5kX2Jlc3Rfd2VhcG9uKG1peGVkIGZyb20pIHsKKyAgLy8gRmluZGV0IGRpZSBiZXN0ZSBXYWZmZQorICBpbnQgaSx3Yyxid2MsY29zdCxjb3N0X2xpbWl0OworICBvYmplY3QgKnJlcyxib2I7CisKKyAgaWYgKCFwb2ludGVycChyZXM9ZmluZF9vYmplY3RfYnlfdHlwZShmcm9tLCBPVF9XRUFQT04pKSkKKyAgICByZXR1cm4gMDsKKyAgYndjPS0xO2JvYj0wOworICAKKyAgY29zdF9saW1pdCA9IGdldF9ldmFsX2Nvc3QoKS8zOworICBmb3IgKGk9c2l6ZW9mKHJlcyk7aS0tOykKKyAgZm9yZWFjaChvYmplY3Qgb2I6IHJlcykKKyAgeworICAgIGlmICghb2JqZWN0cChvYikpIGNvbnRpbnVlOworICAgIHdjPWV2YWxfd2VhcG9uKG9iKTsKKyAgICBpZiAod2M+YndjKQorICAgIHsKKyAgICAgIGJvYj1vYjsKKyAgICAgIGJ3Yz13YzsKKyAgICB9CisgICAgCisgICAgaWYgKCAoY29zdD1nZXRfZXZhbF9jb3N0KCkpIDwgY29zdF9saW1pdCApCisgICAgeworICAgICAgbG9nX2ZpbGUoInJvY2h1cy9yYWV1YmVyX2V2YWwiLAorICAgICAgICAiQnJlYWsgaW4gc2VsZWN0OjpmaW5kX2Jlc3Rfd2VhcG9uKCkuIFJlc3QtVGlja3MgIit0b19zdHJpbmcoY29zdCkrCisgICAgICAgICIsIGkgPSAiK3RvX3N0cmluZyhpKSsiLCBTaXplICIrdG9fc3RyaW5nKHNpemVvZihyZXMpKSsiLlxuIik7CisgICAgICByZXR1cm4gYm9iOyAvLyB6dXJ1ZWNrZ2ViZW4sIHdhcyBiaXNoZXIgZHJpbnN0ZWh0LgorICAgICAgYnJlYWs7CisgICAgfSAKKyAgfQorICByZXR1cm4gYm9iOworfQorCit2YXJhcmdzIGludCB3aWVsZF9iZXN0X3dlYXBvbihtaXhlZCBmcm9tKSB7CisgIC8vIFp1ZWNrdCBkaWUgYmVzdGUgV2FmZmUuCisgIC8vIFNvbGx0ZSBtaXQgY29tbWFuZCgienVlY2tlX2Jlc3RlX3dhZmZlIikgYXVmZ2VydWZlbiB3ZXJkZW4sCisgIC8vIGRhbWl0IHRoaXNfcGxheWVyKCkgcmljaHRpZyBnZXNldHp0IHdpcmQuCisgIG9iamVjdCBvYixvbGQ7CisKKyAgLy8gRWluaWdlIE5QQyBtb2VnZW4ga2VpbmUgV2FmZmVuLiBadW0gQmVpc3BpZWwgS2FyYXRlLUdpbGRlbi1OUEMKKyAgLy8gRHVyY2ggU2V0emVuIHZvbiBJTlBDX0RPTlRfV0lFTERfV0VBUE9OUyBrYW5uIG1hbiBkYXMgWnVlY2tlbiB2ZXJoaW5kZXJuCisgIGlmKFF1ZXJ5UHJvcChJTlBDX0RPTlRfV0lFTERfV0VBUE9OUykpIHJldHVybiAwOworCisgIGlmICghZnJvbSkKKyAgICBmcm9tPU1FOworICAKKyAgaWYgKCFvYmplY3RwKG9iPWZpbmRfYmVzdF93ZWFwb24oZnJvbSkpKQorICAgIHJldHVybiAwOworICBpZiAob2JqZWN0cChvbGQ9UXVlcnlQcm9wKFBfV0VBUE9OKSkgJiYgb2xkIT1vYikgeworICAgIG9sZC0+UmVtb3ZlSWQoSU5QQ19CRVNUX1dFQVBPTl9JRCk7CisgICAgb2xkLT5Eb1Vud2llbGQoKTsKKyAgfQorICBpZiAoIW9iLT5pZChJTlBDX0JFU1RfV0VBUE9OX0lEKSkKKyAgICBvYi0+QWRkSWQoSU5QQ19CRVNUX1dFQVBPTl9JRCk7CisKKyAgcmV0dXJuIG9iLT5Eb1dpZWxkKCk7Cit9CisKK2ludCBldmFsX2FybW91cihvYmplY3Qgb2IpIHsKKyAgcmV0dXJuIG9iLT5RdWVyeVByb3AoUF9BQyk7Cit9CisKK29iamVjdCBmaW5kX2Jlc3RfYXJtb3VyKG1peGVkIGZyb20sIG1peGVkIHR5cCkgeworICAvLyBGaW5kZXQgZGllIGJlc3RlIFJ1ZXN0dW5nIGVpbmVzIFR5cHMKKyAgaW50IGksYWMsYmFjOworICBvYmplY3QgKnJlcyxib2I7CisgIAorICBpZiAoIXBvaW50ZXJwKHJlcz1maW5kX29iamVjdF9ieV90eXBlKGZyb20sIHR5cCkpKQorICAgIHJldHVybiAwOworICBiYWM9LTE7CisgIGJvYj0wOworICBmb3JlYWNoKG9iamVjdCBvYjogcmVzKQorICB7CisgICAgaWYgKCFvYmplY3RwKG9iKSkgY29udGludWU7CisgICAgYWM9ZXZhbF9hcm1vdXIob2IpOworICAgIGlmIChhYz5iYWMpIAorICAgIHsKKyAgICAgIGJvYj1vYjsKKyAgICAgIGJhYz1hYzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGJvYjsKK30KKworb2JqZWN0ICpmaW5kX2Jlc3RfYXJtb3VycyhtaXhlZCBmcm9tKSB7CisgIC8vIEZpbmRldCBkaWUgYmVzdGVuIFJ1ZXN0dW5nZW4sIGRpZSBnbGVpY2h6ZWl0aWcgZ2V0cmFnZW4gd2VyZGVuIGtvZW5uZW4KKyAgbWFwcGluZyBvbDsKKyAgb2JqZWN0ICpyZXMsb2I7CisgIG1peGVkICp0eXBlczsKKyAgaW50IGk7CisgIAorICBpZiAoIW1hcHBpbmdwKG9sPXNjYW5fb2JqZWN0cyhmcm9tKSkpCisgICAgcmV0dXJuICh7fSk7CisgIGlmICghcG9pbnRlcnAocmVzPW9sW0FUX01JU0NdKSkKKyAgICByZXM9KHt9KTsKKyAgdHlwZXM9bV9pbmRpY2VzKG9sKTsKKyAgZm9yZWFjaChvYmplY3QgdHlwOiB0eXBlcykKKyAgeyAKKyAgICBpZiAoVkFMSURfQVJNT1VSX0NMQVNTW3R5cF0pIC8vIGFuZGVyZXIgQXJtb3VyLVR5cCBhdXNzZXIgQVRfTUlTQz8KKyAgICB7CisgICAgICBvYj1maW5kX2Jlc3RfYXJtb3VyKGZyb20sdHlwKTsKKyAgICAgIGlmIChvYmplY3RwKG9iKSkKKwlyZXMrPSh7b2J9KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKwordmFyYXJncyBpbnQgd2Vhcl9iZXN0X2FybW91cnMobWl4ZWQgZnJvbSkgeworICAvLyBEaWUgYmVzdGVuIFJ1ZXN0dW5nZW4gd2VyZGVuIGFuZ2V6b2dlbgorICAvLyBTb2xsdGUgbWl0IGNvbW1hbmQoInRyYWdlX2Jlc3RlX3J1ZXN0dW5nZW4iKSBhdWZnZXJ1ZmVuIHdlcmRlbiwKKyAgLy8gZGFtaXQgdGhpc19wbGF5ZXIoKSByaWNodGlnIGdlc2V0enQgd2lyZC4KKyAgb2JqZWN0ICpuYSwqb2EsKmRpZmY7CisgIGludCBpLGNvc3QsY29zdF9saW1pdDsKKyAgCisgIGlmICghZnJvbSkKKyAgICBmcm9tPU1FOworICBpZiAoIXBvaW50ZXJwKG5hPWZpbmRfYmVzdF9hcm1vdXJzKGZyb20pKSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKCFwb2ludGVycChvYT1RdWVyeVByb3AoUF9BUk1PVVJTKSkpCisgICAgb2E9KHt9KTsKKyAgZGlmZj1vYS1uYTsKKyAgY29zdF9saW1pdCA9IGdldF9ldmFsX2Nvc3QoKS8zOworICBmb3JlYWNoKG9iamVjdCBkaTogZGlmZikKKyAgeworICAgIGRpLT5SZW1vdmVJZChJTlBDX0JFU1RfU0hJRUxEX0lEKTsKKyAgICBkaS0+RG9VbndlYXIoKTsKKyAgICBpZiAoIChjb3N0PWdldF9ldmFsX2Nvc3QoKSkgPCBjb3N0X2xpbWl0ICkKKyAgICB7CisgICAgICBsb2dfZmlsZSgicm9jaHVzL3JhZXViZXJfZXZhbCIsCisgICAgICAgIGN0aW1lKCkrIkJyZWFrIDEgaW4gc2VsZWN0Ojp3ZWFyX2Jlc3RfYXJtb3VycygpLiBSZXN0ICIrCisJdG9fc3RyaW5nKGNvc3QpKyIsIGk9Iit0b19zdHJpbmcoaSkrIiwgU2l6ZSAiKworCXRvX3N0cmluZyhzaXplb2YoZGlmZikpKyIuXG4iKTsKKyAgICAgIHJldHVybiAxOyAvLyB6dXJ1ZWNrZ2ViZW4sIHdhcyBiaXNoZXIgZHJpbnN0ZWh0LgorICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGRpZmY9bmEtb2E7CisgIGNvc3RfbGltaXQgPSBnZXRfZXZhbF9jb3N0KCkvMzsKKyAgZm9yZWFjaChvYmplY3QgZGk6IGRpZmYpCisgIHsKKyAgICBpZiAoIGRpLT5RdWVyeVByb3AoUF9BUk1PVVJfVFlQRSk9PUFUX1NISUVMRAorICAgICAgICAgJiYgIWRpLT5pZChJTlBDX0JFU1RfU0hJRUxEX0lEKSkKKyAgICAgZGktPkFkZElkKElOUENfQkVTVF9TSElFTERfSUQpOworICAgICBkaS0+ZG9fd2VhcigiYWxsZXMiKTsKKyAgICAgaWYgKCAoY29zdD1nZXRfZXZhbF9jb3N0KCkpIDwgY29zdF9saW1pdCApCisgICAgIHsKKyAgICAgICBsb2dfZmlsZSgicm9jaHVzL3JhZXViZXJfZXZhbCIsCisgICAgICAgICBjdGltZSgpKyJCcmVhayAyIGluIHNlbGVjdDo6d2Vhcl9iZXN0X2FybW91cnMoKS4gUmVzdCAiKworCSB0b19zdHJpbmcoY29zdCkrIiwgaT0iK3RvX3N0cmluZyhpKSsiLCBTaXplICIrCisJIHRvX3N0cmluZyhzaXplb2YoZGlmZikpKyIuXG4iKTsKKyAgICAgIHJldHVybiAxOyAvLyB6dXJ1ZWNrZ2ViZW4sIHdhcyBiaXNoZXIgZHJpbnN0ZWh0LgorICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAxOworfQorCitpbnQgZXZhbF9jb21iYXRfb2JqZWN0KG9iamVjdCBvYiwgbWFwcGluZyB2YWxzLCBvYmplY3QgZW5lbXkpIHsKKyAgcmV0dXJuIDA7Cit9CisKK3ZhcmFyZ3Mgc3RyaW5nCitmaW5kX2Jlc3RfY29tYmF0X2NvbW1hbmQobWl4ZWQgZnJvbSwgb2JqZWN0IGVuZW15LCBtYXBwaW5nIHByZWYpIHsKKyAgLy8gU3VjaHQgZGVuIGd1ZW5zdGlnc3RlbiBCZWZlaGwgenVyIEJlbnV0enVuZyBlaW5lciBTb25kZXJ3YWZmZSBoZXJhdXMKKyAgb2JqZWN0ICpvYnM7CisgIG1peGVkICppbmQseSx2dWw7CisgIG1hcHBpbmcgeDsKKyAgc3RyaW5nIGJlc3Q7CisgIGludCBpLGosbWF4LHZhbCxtaHA7CisgIAorICBpZiAoIWZyb20pCisgICAgZnJvbT1NRTsKKyAgaWYgKCFlbmVteSkKKyAgICBlbmVteT1TZWxlY3RFbmVteSgpOworICBpZiAoIW1hcHBpbmdwKHByZWYpKSAvLyBiZXZvcnp1Z3RlIEVpZ2Vuc2NoYWZ0ZW4KKyAgICBwcmVmPShbQ19NSU46NSwKKwkgICBDX0FWRzoxMCwKKwkgICBDX01BWDoyLAorCSAgIENfSEVBTDoxMAorCSAgIF0pOworICBiZXN0PTA7bWF4PS0xOworICBpZiAoIXBvaW50ZXJwKG9icz1maW5kX29iamVjdF9ieV90eXBlKGZyb20sT1RfQ09NQkFUX09CSkVDVCkpKQorICAgIHJldHVybiBiZXN0OworICBtaHA9UXVlcnlQcm9wKFBfTUFYX0hQKS1RdWVyeVByb3AoUF9IUCk7CisgIGlmIChvYmplY3RwKGVuZW15KSkKKyAgICB2dWw9ZW5lbXktPlF1ZXJ5UHJvcChQX1JFU0lTVEFOQ0VfU1RSRU5HVEhTKTsKKyAgaWYgKG1ocDwwKSBtaHA9MDsKKyAgZm9yZWFjaChvYmplY3Qgb2I6IG9icykKKyAgeworICAgIGlmICghb2JqZWN0cChvYikpIAorICAgICAgY29udGludWU7CisgICAgaWYgKCFtYXBwaW5ncCh4PW9iLT5RdWVyeVByb3AoUF9DT01CQVRDTURTKSkpCisgICAgICBjb250aW51ZTsKKyAgICBpbmQ9bV9pbmRpY2VzKHgpOworICAgIGZvciAoaj1zaXplb2YoaW5kKS0xO2o+PTA7ai0tKQorICAgIHsKKyAgICAgIGlmICghc3RyaW5ncChpbmRbal0pKSBjb250aW51ZTsKKyAgICAgIHk9eFtpbmRbal1dOworICAgICAgaWYgKG1hcHBpbmdwKHkpKSAKKyAgICAgIHsKKwlpZiAodmFsPXlbQ19IRUFMXSkgCisJeworCSAgaWYgKHZhbD5taHApIHZhbD1taHA7IC8vIE51ciBNT0VHTElDSEUgSGVpbHVuZyBiZXJ1ZWNrc2ljaHRpZ2VuCisJICB2YWwqPXByZWZbQ19IRUFMXTsKKwl9IAorCWVsc2UgCisJeworCSAgdmFsPXlbQ19NSU5dKnByZWZbQ19NSU5dCisJICAgICsgeVtDX0FWR10qcHJlZltDX0FWR10KKwkgICAgKyB5W0NfTUFYXSpwcmVmW0NfTUFYXTsKKwkgIC8vIGF1c2tvbW1lbnRpZXJ0LCBkYSBldmFsX3Jlc2lzdGFuY2UoKSBiaXNoZXIgbmljaHQgaW1wbGVtZW50aWVydAorCSAgLy8gaXN0LiBaZXNzdHJhLCAwNi4wOC4yMDA3CisJICAvL2lmICh5W0NfRFRZUEVTXSAmJiB2dWwpIC8vIFZ1bG5lcmFiaWxpdHkgZGVzIEdlZ25lcnMgYmVkZW5rZW4uLi4KKwkgIC8vICB2YWw9KGludCkoKChmbG9hdCl2YWwpKigxLjArZXZhbF9yZXNpc3RhbmNlKHlbQ19EVFlQRVNdLHZ1bCkpKTsKKwl9CisgICAgICB9IAorICAgICAgZWxzZSAKKyAgICAgIHsKKwl2YWw9MTsKKyAgICAgIH0KKyAgICAgIHZhbCs9ZXZhbF9jb21iYXRfb2JqZWN0KG9ic1tpXSx5LGVuZW15KTsKKyAgICAgIGlmICh2YWw8bWF4KSBjb250aW51ZTsKKyAgICAgIG1heD12YWw7CisgICAgICBpZiAobWFwcGluZ3AoeSkgJiYgeVtDX0hFQUxdPjApCisgICAgICAgIGJlc3Q9c3ByaW50ZihpbmRbal0sbmFtZShSQVcpKTsgLy8gSGVpbHVuZyBhdWYgc2ljaCBzZWxic3QKKyAgICAgIGVsc2UgaWYgKG9iamVjdHAoZW5lbXkpKQorICAgICAgICBiZXN0PXNwcmludGYoaW5kW2pdLGVuZW15LT5uYW1lKFJBVykpOyAvLyBTY2hhZGVuIGF1ZiBHZWduZXIKKyAgICB9CisgIH0KKworICByZXR1cm4gYmVzdDsKK30KKwordmFyYXJncyBpbnQgdXNlX2Jlc3RfY29tYmF0X2NvbW1hbmQobWl4ZWQgZW5lbXksIG1peGVkIGZyb20sIG1hcHBpbmcgcHJlZikgeworICAvLyBGdWVocnQgbW9lZ2xpY2hzdCBndXRlbiBLYW1wZmVpbnNhdHogbWl0IGVpbmVyIFNvbmRlcndhZmZlIGF1cworICBzdHJpbmcgc3RyOworICAgIAorICBpZiAoc3RyaW5ncChlbmVteSkgJiYgZW52aXJvbm1lbnQoKSkKKyAgICBlbmVteT1wcmVzZW50KGVuZW15LGVudmlyb25tZW50KCkpOworICBpZiAoc3RyPWZpbmRfYmVzdF9jb21iYXRfY29tbWFuZChmcm9tLGVuZW15LHByZWYpKQorICAgIHJldHVybiBjb21tYW5kKHN0cik7CisgIHJldHVybiAwOworfQorCit2b2lkIGFkZF9zZWxlY3RfY29tbWFuZHMoKSB7CisgIGFkZF9hY3Rpb24oIndpZWxkX2Jlc3Rfd2VhcG9uIiwienVlY2tlX2Jlc3RlX3dhZmZlIik7CisgIGFkZF9hY3Rpb24oIndlYXJfYmVzdF9hcm1vdXJzIiwidHJhZ2VfYmVzdGVfcnVlc3R1bmdlbiIpOworICBhZGRfYWN0aW9uKCJ1c2VfYmVzdF9jb21iYXRfY29tbWFuZCIsImJlbnV0emVfYmVzdGVfc29uZGVyd2FmZmUiKTsKK30KZGlmZiAtLWdpdCBhL3N0ZC9pbnBjL3dhbGtpbmcuYyBiL3N0ZC9pbnBjL3dhbGtpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjRhYWU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkL2lucGMvd2Fsa2luZy5jCkBAIC0wLDAgKzEsMTMwIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gaW5wYy93YWxraW5nLmMgLS0gSW50ZWxsaWdlbnQgaGVydW1sYXVmZW4KKy8vCisvLyAkSWQ6IHdhbGtpbmcuYyA4NzU1IDIwMTQtMDQtMjYgMTM6MTM6NDBaIFplc3N0cmEgJAorI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPHRoaW5nL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx0aGluZy5oPgorI3VuZGVmIE5FRURfUFJPVE9UWVBFUworCisjaW5jbHVkZSA8aW5wYy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKworI2RlZmluZSBNRSB0aGlzX29iamVjdCgpCisjZGVmaW5lIEVOViBlbnZpcm9ubWVudCgpCisKK2ludCBfc2V0X2lucGNfd2Fsa19kZWxheShpbnQgZGVsKSB7CisgIGlmIChkZWwgJiYgZGVsPDUpIGRlbD01OworICByZXR1cm4gU2V0KFBfSU5QQ19XQUxLX0RFTEFZUyxkZWwpOworfQorCittaXhlZCBfcXVlcnlfaW5wY19ob21lKCkgeworICBtaXhlZCByZXM7CisKKyAgcmVzPVF1ZXJ5KFBfSU5QQ19IT01FKTsKKyAgaWYgKCFyZXMpIHJldHVybiAiL3Jvb20vdm9pZCI7CisgIHJldHVybiByZXM7Cit9CisKK2ludCBhcmVhX2NoZWNrKHN0cmluZyBmbikgeworICBtaXhlZCBhcmVhOworICBzdHJpbmcgKndvcmRzOworICBpbnQgaTsKKworICBpZiAoIShhcmVhPVF1ZXJ5UHJvcChQX0lOUENfV0FMS19BUkVBKSkpCisgICAgcmV0dXJuIDE7IC8vIEtlaW5lIEJlc2NocmFlbmt1bmcgaW0gR2ViaWV0PworICBpZiAobWFwcGluZ3AoYXJlYSkpIHsKKyAgICBpZiAoYXJlYVtmbl0pCisgICAgICByZXR1cm4gMTsgLy8gRXhwbGl6aXQgZXJsYXVidGVyIFJhdW0KKyAgICB3b3Jkcz1vbGRfZXhwbG9kZShmbiwiLyIpOworICAgIGZvciAoaT1zaXplb2Yod29yZHMpLTI7aT49MDtpLS0pCisgICAgICBpZiAoYXJlYVtpbXBsb2RlKHdvcmRzWzAuLmldLCIvIildKQorCXJldHVybiAxOyAvLyBFcmxhdWJ0ZXMgR2ViaWV0CisgICAgcmV0dXJuIDA7IC8vIE5pY2h0IGVybGF1YnRlcyBHZWJpZXQKKyAgfQorICBpZiAocG9pbnRlcnAoYXJlYSkpIHsKKyAgICBmb3IgKGk9c2l6ZW9mKGFyZWEpLTE7aT49MDtpLS0pCisgICAgICBpZiAoZm5bMC4uKHNpemVvZihhcmVhW2ldKS0xKV09PWFyZWFbaV0pCisJcmV0dXJuIDE7IC8vIEVybGF1YnRlcyBHZWJpZXQKKyAgICByZXR1cm4gMDsgLy8gTmljaHQgZXJsYXVidGVzIEdlYmlldAorICB9CisgIHJldHVybiAxOworfQorCitpbnQgbWF5X2VudGVyX3Jvb20obWl4ZWQgcm9vbSkgeworICBpbnQgZmxhZ3M7CisgIHN0cmluZyBmbjsKKyAgb2JqZWN0IG9iOworICAKKyAgaWYgKG9iamVjdHAocm9vbSkpIHsKKyAgICBmbj1vYmplY3RfbmFtZShyb29tKTsKKyAgICBvYj1yb29tOworICB9IGVsc2UgaWYgKHN0cmluZ3Aocm9vbSkpIHsKKyAgICBmbj1yb29tOworICAgIG9iPWZpbmRfb2JqZWN0KHJvb20pOworICB9IGVsc2UKKyAgICByZXR1cm4gMTsgLy8gRGFubiBzb2xsdGUgbW92ZSBzY2hvbiBuZW4gRmVobGVyIG1hY2hlbgorICBpZiAoZm49PSIvcm9vbS92b2lkIikgLy8gVm9pZCBkYXJmIElNTUVSIGJldHJldGVuIHdlcmRlbgorICAgIHJldHVybiAxOworICBmbGFncz1RdWVyeVByb3AoUF9JTlBDX1dBTEtfRkxBR1MpOworICBpZiAoIShmbGFncyAmIFdGX01BWV9MT0FEKQorICAgICAgJiYgIW9iamVjdHAob2IpKQorICAgIHJldHVybiAwOyAvLyBEYXJmIG5pY2h0IGluIG5pY2h0IGdlbGFkZW5lIFJhZXVtZSBmb2xnZW4uCisgIGlmICghKGZsYWdzICYgV0ZfTUFZX1dBTEtfQkFDSykKKyAgICAgICYmIG9iPT1RdWVyeVByb3AoUF9JTlBDX0xBU1RfRU5WSVJPTk1FTlQpKQorICAgIHJldHVybiAwOyAvLyBEYXJmIG5pY2h0IGluIGRlbiB2b3JoZXJpZ2VuIFJhdW0KKyAgcmV0dXJuIGFyZWFfY2hlY2soZm4pOworfQorCitpbnQgd2Fsa19yYW5kb20oKSB7CisgIHN0cmluZyAqZXgsKmV4MjsKKyAgb2JqZWN0IGVudjsKKyAgaW50IGkscixmbGFnczsKKyAgCisgIGlmICghb2JqZWN0cChlbnY9RU5WKSkKKyAgICByZXR1cm4gMDsKKyAgZXg9bV9pbmRpY2VzKEVOVi0+UXVlcnlQcm9wKFBfRVhJVFMpKTsKKyAgZmxhZ3M9UXVlcnlQcm9wKFBfQ0FOX0ZMQUdTKTsKKyAgaWYgKGZsYWdzICYgV0ZfTUFZX1VTRV9TUEVDSUFMKQorICAgIGV4Kz1tX2luZGljZXMoRU5WLT5RdWVyeVByb3AoUF9TUEVDSUFMX0VYSVRTKSk7CisgIGV4Mj1leFswLi5dOworICB3aGlsZSAoaT1zaXplb2YoZXgpKSB7CisgICAgcj1yYW5kb20oaSk7CisgICAgY29tbWFuZChleFtyXSk7CisgICAgaWYgKEVOViE9ZW52KQorICAgICAgcmV0dXJuIDE7CisgICAgZXgtPSh7ZXhbcl19KTsKKyAgfQorICBpZiAoIShmbGFncyAmIFdGX01BWV9XQUxLX0JBQ0spKSB7CisgICAgU2V0UHJvcChQX0lOUENfTEFTVF9FTlZJUk9OTUVOVCwwKTsvL0RpcnR5IEhhY2ssIHVtIFNhY2tnYXNzZW4genUgdmVybGFzc2VuCisgICAgZXg9ZXgyOworICAgIHdoaWxlIChpPXNpemVvZihleCkpIHsKKyAgICAgIHI9cmFuZG9tKGkpOworICAgICAgY29tbWFuZChleFtyXSk7CisgICAgICBpZiAoRU5WIT1lbnYpCisJcmV0dXJuIDE7CisgICAgICBleC09KHtleFtyXX0pOworICAgIH0KKyAgfQorICByZXR1cm4gbW92ZShRdWVyeVByb3AoUF9JTlBDX0hPTUUpLE1fVFBPUlQpOworfQorCitpbnQgd2Fsa19yb3V0ZSgpIHsKK30KKworaW50IHdhbGtfdG8oKSB7Cit9CisKK2ludCB3YWxrX2ZvbGxvdygpIHsKK30KKworaW50IHdhbGtfZmxlZSgpIHsKK30KZGlmZiAtLWdpdCBhL3N0ZC9pdGVtcy9maXNoaW5nL2FuZ2VsLmMgYi9zdGQvaXRlbXMvZmlzaGluZy9hbmdlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNTcwOWYKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvaXRlbXMvZmlzaGluZy9hbmdlbC5jCkBAIC0wLDAgKzEsNTEwIEBACisvKgorICBadXNhbW1lbmZhc3N1bmcgQmVkaW5ndW5nZW46CisgIC0gQW5nZWwgYXVzd2VyZmVuCisgICAgICAtIEhha2VuIG11c3MgZHJhbiBzZWluCisgICAgICAtIEhha2VuIG11c3MgS29lZGVyIGhhYmVuCisgICAgICAtIGRhcmYgbnVyIGVpbiBIYWtlbiBkcmluIHNlaW4sIHNvbnN0IG5peCwgdW5kIGdlbmF1IGVpbiBIYWtlbgorICAgICAgLSBBbmdlbCBpbSBJbnZlbnRhcgorICAgICAgLSBBbmdlbCBkYXJmIG5pY2h0IHNjaG9uIGF1c2dld29yZmVuIHNlaW4KKyAgICAgIC0gcGFzc2VuZGVzIEdld2Flc3NlciBpbSBSYXVtCisgICAgICAtIE1vdmUtSG9vayBtdXNzIGtvcnJla3QgcmVnaXN0cmllcmJhciBzZWluCisgIC0gQW5nZWwgZWluaG9sZW4KKyAgICAgIC0gQW5nZWwtQ2FsbG91dCBtdXNzIHVlYmVyaGF1cHQgZXJzdG1hbCBsYXVmZW4KKyAgLSBXYWVocmVuZCBkZXMgQW5nZWxucworICAgICAgLSBiZXdlZ2VuIGJlZW5kZXQgZGFzIEFuZ2VsbgorICAgICAgLSBBdXNsb2dnZW4gYmVlbmRldCBkYXMgQW5nZWxuCisgICAgICAtIEVuZGUgYmVlbmRldCBkYXMgQW5nZWxuCisgICAgICAtIG5pY2h0cyByYXVzbmVobWVuCisgICAgICAtIG5pY2h0cyByZWludHVuLCBhdXNzZXIgRmlzY2ggYW0gRW5kZSBkZXIgV2FydGV6ZWl0CisgICAgICAtIExhbmdiZXNjaHJlaWJ1bmcgemVpZ3QgImF1c2dld29yZmVuIiwgS29lZGVyIHVuZCBnZWZhbmdlbmVuIEZpc2NoIGFuCisgIC0gRmlzY2ggZmFuZ2VuIChjYWxsX291dCB6dWVuZGUpCisgICAgICAtIEdld2Flc3NlciBwYXNzdCAoaW1tZXIgbm9jaCkKKyAgICAgIC0gRmlzY2ggcGFzc3Qgbm9jaCBpbiBkaWUgQW5nZWwgcmVpbgorICAtIEhha2VuIGRyYW5oYWVuZ2VuCisgICAgICAtIEhha2VuIGltIEludgorICAgICAgLSBIYWtlbiBtdXNzICJlY2h0ZXIiIEFuZ2VsaGFrZW4gc2VpbgorICAgICAgLSBBbmdlbCBpbSBJbnYKKyAgICAgIC0gS29lZGVyIGFtIEhha2VuCisgICAgICAtIG5vY2gga2VpbiBhbmRlcmVyIEtvZWRlciBkcmFuCisgICAgICAtIEFuZ2VsIGlzdCBuaWNodCBhdXNnZXdvcmZlbgorICAtIGdlbmVyZWxsCisgICAgICAtIG51ciBIYWtlbiBkcmFuc3RlY2tlbiwgbml4IGFuZGVyZXMgcmVpbnR1bgorICAgICAgLSByZWludHVuIG51ciBtaXQgU3ludGF4ICJoYWVuZ2UiIGV0Yy4gKGRhbWl0IHNpbmQgRmlzY2hlIGF1c3NlbiB2b3IsCisgICAgICAgIHdlaWwgZGllIFN5bnRheCBhdWYgSGFrZW4gcHJ1ZWZ0KQorICAgICAgICAoZ2dmLiBpc3QgZGFubiBkYXMgUHJldmVudEluc2VydCgpIHp1IHZlcmVpbmZhY2hlbikKKyAqLworCisjcHJhZ21hIHN0cm9uZ190eXBlcywgc2F2ZV90eXBlcywgcnR0X2NoZWNrcworI3ByYWdtYSBub19jbG9uZSwgbm9fc2hhZG93CisKK2luaGVyaXQgIi9zdGQvY29udGFpbmVyIjsKK2luaGVyaXQgIi9zdGQvaG9va19jb25zdW1lciI7CisKKyNpbmNsdWRlIDxuZXdfc2tpbGxzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bW92aW5nLmg+CisjaW5jbHVkZSA8aG9vay5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPGl0ZW1zL2Zpc2hpbmcvZmlzaGluZy5oPgorI2luY2x1ZGUgPGl0ZW1zL2Zpc2hpbmcvYXF1YXJpdW0uaD4KKworI2RlZmluZSBUUCB0aGlzX3BsYXllcigpCisjZGVmaW5lIE1FIHRoaXNfb2JqZWN0KCkKKyNkZWZpbmUgQlMoeCkgYnJlYWtfc3RyaW5nKHgsIDc4KQorCisjZGVmaW5lIE1JTl9ERUxBWSAgICAgICA4MCAgIC8vIE1pbmRlc3RkZWxheSBiaXMgRmlzY2ggYmVpc3N0IQorI2RlZmluZSBTVERfREVMQVlfUExVUyAgNjAgICAvLyAgKy8tIDYwIHNla3VuZGVuIFRvbGVyYW50CisjZGVmaW5lIE1BWF9GSVNIX0JPTlVTICA2MCAgIC8vIG1heC4gV2FydGV6ZWl0dmVya3Vlcnp1bmcgZHVyY2ggUF9GSVNICisjZGVmaW5lIFdST05HV0FURVIgICAgICA2MCAgIC8vIDEtMiBtaW4sIGZhbGxzIEFuZ2VsIG5pY2h0IGdlZWlnbmV0CisjZGVmaW5lIFdST05HV09STSAgICAgICA2MCAgIC8vIDEtMiBtaW4sIGZhbGxzIEtvZWRlciBuaWNodCBnZWVpZ25ldAorCisjZGVmaW5lIEtPRURFUl9MT1NUICAgICAxMAorLy8gVmVybHVzdHdhaHJzY2guIGZ1ZXIgS29lZGVyIGZhbGxzIEZpc2NoIHp1IHNjaHdlcgorCitwcml2YXRlIG9iamVjdCByb29tLCBjdXJyZW50X3VzZXI7Citwcml2YXRlIGludCBhY3RpdmUsIGFjdGltZTsKK3ByaXZhdGUgbWFwcGluZyBhcXVhcml1bSA9IFNUREZJU0hMSVNUOworCitub21hc2sgdmFyYXJncyB2b2lkIFN0b3BGaXNoaW5nKHN0cmluZyBtc2dfbWUsIHN0cmluZyBtc2dfcm9vbSk7CitpbnQgSXNGaXNoaW5nKCk7CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpIHsKKyAgOjpjcmVhdGUoKTsKKyAgCisgIFNldFByb3AoUF9TSE9SVCwgIkVpbmUgQW5nZWwiKTsKKyAgU2V0UHJvcChQX0xPTkcsICJFaW5lIG5hZ2VsbmV1ZSBBbmdlbC5cbiIpOworICBTZXRQcm9wKFBfTkFNRSwgIkFuZ2VsIik7CisgIEFkZElkKCh7ImFuZ2VsIiwgInJ1dGUiLCBBTkdFTF9JRH0pKTsKKworICBTZXRQcm9wKFBfR0VOREVSLCBGRU1BTEUpOworICBTZXRQcm9wKFBfTUFURVJJQUwsKFtNQVRfTUlTQ19XT09EOjkwLE1BVF9XT09MOjEwXSkpOworICBTZXRQcm9wKFBfVFJBTlNQQVJFTlQsMSk7CisgIFNldFByb3AoUF9XRUlHSFQsMjAwKTsKKyAgU2V0UHJvcChQX01BWF9XRUlHSFQsIDEwMDAwKTsKKyAgU2V0UHJvcChQX1dBVEVSLCBXX1VTRVIpOyAgICAgLy9tdXNzIChtZWhyZXJlKSBGbGFncyBnZXNldHp0IGhhYmVuIQorICBTZXRQcm9wKFBfU09VUkNFX1BSRVBPU0lUSU9OLCAidm9uIik7CisgIFNldFByb3AoUF9OUl9IQU5EUywgMik7IAorCisgIFNldChQX05PRFJPUCwgZnVuY3Rpb24gc3RyaW5nICgpIHsKKyAgICByZXR1cm4gKElzRmlzaGluZygpPyJEdSBzb2xsdGVzdCBkaWUgQW5nZWwgbmljaHQgZmFsbGVubGFzc2VuLCBzb2xhbmdlICIKKyAgICAgICJEdSBhbmdlbHN0LlxuIjowKTsKKyAgfSwgRl9RVUVSWV9NRVRIT0QpOworCisgIEFkZENtZCgoeyJhbmdlbCIsImFuZ2xlIn0pLCJhbmdlbCIpOworICBBZGRDbWQoImhvbGV8aG9sJkBJRCZlaW4iLCAic3RvcGl0IiwgIldhcyB3aWxsc3QgRHUgKGVpbilob2xlbj98IgorICAgICJXaWxsc3QgRHUgQFdFTjIgZWluaG9sZW4/Iik7CisgIEFkZENtZCgiaGFlbmdlfGhhZW5nfGJlZmVzdGlnZSZAUFJFU0VOVCZASUQiLCAibW92ZV9pbiIsCisgICAgIldhcyB3aWxsc3QgRHUgd29yYW4gQHZlcmJlbj98IgorICAgICJXb3JhbiB3aWxsc3QgRHUgQFdFTjIgZGVubiBAdmVyYmVuPyIpOworCisgIEFkZENtZCgiYXRlbGwiLCJ0ZWxsX3N0YXQiKTsKKyAgQWRkQ21kKCJhbmdlbHRlc3QiLCJxYW5nZWwiKTsKK30KKyAKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZV9zdXBlcigpIHsKKyAgc2V0X25leHRfcmVzZXQoLTEpOworfQorICAgICAKK3N0YXRpYyBpbnQgc3RvcGl0KHN0cmluZyBzdHIpIHsKKyAgaWYoIGZpbmRfY2FsbF9vdXQoImRvX2FuZ2VsIik9PS0xICkKKyAgICB0ZWxsX29iamVjdChUUCwgIkR1IGFuZ2Vsc3QgbmljaHQhXG5UUCwgIik7CisgIGVsc2UgCisgICAgU3RvcEZpc2hpbmcoKTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZhcmFyZ3Mgc3RyaW5nIGxvbmcoaW50IG1vZGUpIHsKKyAgc3RyaW5nIGRlc2NyID0gUXVlcnlQcm9wKFBfTE9ORyk7CisgIGlmKCFRdWVyeVByb3AoUF9UUkFOU1BBUkVOVCkpIAorICAgIHJldHVybiBkZXNjcjsKKworICBpZiAoIGZpbmRfY2FsbF9vdXQoImRvX2FuZ2VsIikhPS0xICkKKyAgICBkZXNjciArPSBjYXBpdGFsaXplKFF1ZXJ5UHJvbm91bihXRVIpKSAgKyAiIGlzdCBhdXNnZXdvcmZlbi5cbiI7CisKKyAgb2JqZWN0ICppbnYgPSBhbGxfaW52ZW50b3J5KE1FKTsKKyAgc3RyaW5nIGludl9kZXNjciA9IG1ha2VfaW52bGlzdChUUCwgaW52KTsKKyAgaWYgKCBpbnZfZGVzY3IgIT0gIiIgKQorICAgIGRlc2NyICs9ICJBbiAiK1F1ZXJ5UHJvbm91bihXRU0pICsgIiBoYWVuZyIrKHNpemVvZihpbnYpPjE/ImVuIjoidCIpKworICAgICI6XG4iICsgaW52X2Rlc2NyOworICAKKyAgcmV0dXJuIGRlc2NyOworfQorCisvKmludCB0ZWxsX3N0YXQoKQoreworICBpbnQgbjsKKyAgCisgIGlmKCFJU19XSVpBUkQoVFApKQorICAgIHJldHVybiAwOworICBpZighYWN0aXZlKXsgCisgICAgd3JpdGUoIkR1IGFuZ2Vsc3QgbmljaHRcbiIpOyByZXR1cm4gMTsgCisgIH0KKyAgbj1maW5kX2NhbGxfb3V0KCJkb19hbmdlbCIpOworICBpZihhY3RpdmUpCisgICAgd3JpdGUoCisgICAgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCisgICAgICsiRGVyIEZpc2NoIGJlaXNzdCBpbiAiK24rIiBzZWMhXG4iCisgICAgICsiQmVzdGFuZHN3ZXJ0IGRlcyBSYXVtZXM6ICIrcm9vbS0+UXVlcnlQcm9wKFBfRklTSCkKKyAgICAgKyIgPSAiKyhyb29tLT5RdWVyeVByb3AoUF9GSVNIKSsxMDApKyIlLlxuIgorICAgICArIkJlc3RhbmRzd2VydCBkZXMgS29lZGVyczogIitrb2VkZXItPlF1ZXJ5UHJvcChQX0ZJU0gpCisgICAgICsiID0gIisoMTAwK2tvZWRlci0+UXVlcnlQcm9wKFBfRklTSCkpKyIlLlxuIgorICAgICArIkdlc2FtdDoiK2Jlc3RhbmQrIiA9ICIrKGJlc3RhbmQrMTAwKSsiJS5cbiIpOworICBpZighKFF1ZXJ5UHJvcChQX1dBVEVSKSZyb29tLT5RdWVyeVByb3AoUF9XQVRFUikpKQorICAgIHdyaXRlKCJEaWUgQW5nZWwgcGFzc3QgbmljaHQgenVtIEdld2Flc3NlcnR5cGVuLlxuIik7CisgIGVsc2UKKyAgICB3cml0ZSgiRGllIEFuZ2VsIHBhc3N0IHp1bSBHZXdhZXNzZXJ0eXBlbi5cbiIpOworICBpZighKHJvb20tPlF1ZXJ5UHJvcChQX1dBVEVSKSZrb2VkZXItPlF1ZXJ5UHJvcChQX1dBVEVSKSkpCisgICAgd3JpdGUoIkRlciBLb2VkZXIgcGFzc3QgbmljaHQgenVtIEdld2Flc3NlcnR5cGVuLlxuIik7CisgIGVsc2UKKyAgICB3cml0ZSgiRGVyIEtvZWRlciBwYXNzdCB6dW0gR2V3YWVzc2VydHlwZW4uXG4iKTsKKyAgd3JpdGUoIiA9PiBEZWxheT0iK2RlbGF5KyIuXG4iCisgICAgKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCispOworICByZXR1cm4gMTsKK30qLworCitzdGF0aWMgaW50IG1vdmVfaW4oc3RyaW5nIHN0ciwgbWl4ZWQgKnBhcmFtKSB7CisgIG9iamVjdCBoYWtlbiA9IHBhcmFtWzBdOworICAvLyBwYXJhbVsxXSBzaW5kIHdpciBzZWxic3QsIGRhaGVyIGFiIGhpZXIgTUUgdmVyd2VuZGV0LgorCisgIGlmICggZmluZF9jYWxsX291dCgiZG9fYW5nZWwiKSE9LTEgKSB7IC8vIGFuZ2VsdCBub2NoIG5pY2h0PworICAgIHRlbGxfb2JqZWN0KFRQLCBCUyhOYW1lKFdFUiwxKSsiIGlzdCBiZXJlaXRzIGF1c2dld29yZmVuLCBkYSBoYWVuZ3N0ICIKKyAgICAgICJEdSBqZXR6dCBiZXNzZXIgbmljaHRzIG1laHIgZHJhbiwgZGFzIHZlcnRyZWlidCBudXIgZGllIEZpc2NoZS4iKSk7CisgIH0KKyAgZWxzZSBpZiAoICFoYWtlbi0+aWQoSEFLRU5fSUQpICkgeyAvLyBlY2h0ZXIgQW5nZWxoYWtlbj8KKyAgICB0ZWxsX29iamVjdChUUCwgQlMoaGFrZW4tPk5hbWUoV0VSLDEpKyIgaXN0IGtlaW4gQW5nZWxoYWtlbiwgIisKKyAgICAgIGhha2VuLT5RdWVyeUFydGljbGUoV0VOLCAxLCAxKSsia2FubnN0IER1IG5pY2h0IGFuICIrbmFtZShXRU4sMSkrCisgICAgICAiIGhhZW5nZW4uIikpOworICB9CisgIGVsc2UgaWYgKCBlbnZpcm9ubWVudChoYWtlbikgIT0gVFAgKSB7IC8vIEhha2VuIGltIEludj8KKyAgICB0ZWxsX29iamVjdChUUCwgQlMoIldpZSBlciBkYSBzbyBhdWYgZGVtIEJvZGVuIGxpZWd0LCBzY2hhZmZzdCBEdSBlcyAiCisgICAgICAiZWluZmFjaCBuaWNodCwgIitoYWtlbi0+bmFtZShXRU4sMSkrIiB2ZXJudWVuZnRpZyBhbiAiK25hbWUoV0VNLDEpKworICAgICAgIiB6dSBiZWZlc3RpZ2VuLiIpKTsKKyAgfQorICBlbHNlIGlmICggZW52aXJvbm1lbnQoTUUpICE9IFRQICkgeyAvLyBBbmdlbCBpbSBJbnY/CisgICAgdGVsbF9vYmplY3QoVFAsIEJTKCJFcyBzdGVsbHQgc2ljaCB2aWVsIGZ1bW1lbGlnZXIgaGVyYXVzIGFscyBnZWRhY2h0LCAiKworICAgICAgaGFrZW4tPm5hbWUoV0VOLDEpKyIgYW4gIituYW1lKFdFTSwxKSsiIHp1IGJlZmVzdGlnZW4sIHNvbGFuZ2UgIisKKyAgICAgIFF1ZXJ5UHJvbm91bihXRVIpKyIgYXVmIGRlbSBCb2RlbiBoZXJ1bWxpZWd0LiIpKTsKKyAgfQorICBlbHNlIGlmICggcHJlc2VudChIQUtFTl9JRCwgTUUpICkgeyAvLyBhbmRlcmVyIEhha2VuIHNjaG9uIGRyYW4/CisgICAgdGVsbF9vYmplY3QoVFAsIEJTKCJBbiAiK25hbWUoV0VNLDEpKyIgaGFlbmd0IGJlcmVpdHMgZWluIEFuZ2VsaGFrZW4uIikpOworICB9CisgIGVsc2UgaWYgKCAhaGFrZW4tPlF1ZXJ5S29lZGVyKCkgKSB7IC8vIEtvZWRlciBhbSBIYWtlbj8KKyAgICB0ZWxsX29iamVjdChUUCwgQlMoIkR1IHdpbGxzdCAiK2hha2VuLT5uYW1lKFdFTiwxKSsiIGdlcmFkZSBhbiAiKworICAgICAgbmFtZShXRU4sMSkrIiBoYWVuZ2VuLCBhbHMgRGlyIGF1ZmZhZWxsdCwgZGFzcyBEdSBiZWluYWhlIGRlbiBLb2VkZXIgIgorICAgICAgInZlcmdlc3NlbiBoYWV0dGVzdC4iKSk7CisgIH0KKyAgZWxzZSB7IC8vIGRhbm4gZGFyZiBkZXIgSGFrZW4gcmFuZ2VoYWVuZ3Qgd2VyZGVuLgorICAgIGlmICggaGFrZW4tPm1vdmUoTUUsIE1fUFVUKSA9PSBNT1ZFX09LICkgeworICAgICAgdGVsbF9vYmplY3QoVFAsIEJTKCJEdSBoYWVuZ3N0ICIraGFrZW4tPm5hbWUoV0VOLDEpKyIgYW4gIisKKyAgICAgICAgbmFtZShXRU4sMSkrIi4iKSk7CisgICAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoVFApLCBCUyhUUC0+TmFtZShXRVIpKyIgaGFlbmd0IGV0d2FzIG1ldGFsbGlzY2ggIgorICAgICAgICAiR2xhZW56ZW5kZXMgYW4gIituYW1lKFdFTikrIiwgdmVybXV0bGljaCBlaW5lbiBBbmdlbGhha2VuLiIpLCAKKyAgICAgICAgKHtUUH0pKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICB0ZWxsX29iamVjdChUUCwgQlMoaGFrZW4tPk5hbWUoV0VSLDEpKyIgbGFlc3N0IHNpY2ggbmljaHQgYW4gIisKKyAgICAgICAgbmFtZShXRU0sMSkrIiBiZWZlc3RpZ2VuLiIpKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcWFuZ2VsKCkgeworICBpZihJU19XSVpBUkQoVFApKSB7CisgICAgY2FsbF9vdXQoImRvX2FuZ2VsIiwxKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbmdlbChzdHJpbmcgc3RyKSB7CisgIG9iamVjdCBoYWtlbiA9IHByZXNlbnQoSEFLRU5fSUQsTUUpOworICBpZiAoIGVudmlyb25tZW50KE1FKSAhPSBUUCApIHsKKyAgICB0ZWxsX29iamVjdChUUCwgQlMoIkRhZnVlciBtdXNzdCBEdSBkaWUgQW5nZWwgaW4gZGllIEhhbmQgbmVobWVuLiIpKTsKKyAgfQorICBlbHNlIGlmICggZmluZF9jYWxsX291dCgiZG9fYW5nZWwiKSE9LTEgKSB7CisgICAgdGVsbF9vYmplY3QoVFAsICJEYXMgdHVzdCBEdSBkb2NoIHNjaG9uLlxuIik7CisgIH0KKyAgZWxzZSBpZighb2JqZWN0cChoYWtlbikpIHsKKyAgICB0ZWxsX29iamVjdChUUCwgIldpZSBzb2xsIGRhcyBnZWhlbj8gRHUgaGFzdCBqYSBuaWNodG1hbCBlaW5lbiBIYWtlbiAiCisgICAgICAiYW4gZGVyIEFuZ2VsIVxuIik7CisgIH0KKyAgZWxzZSBpZighaGFrZW4tPlF1ZXJ5S29lZGVyKCkpIHsKKyAgICB0ZWxsX29iamVjdChUUCwgYnJlYWtfc3RyaW5nKCJPaG5lIEtvZWRlciBhbSBIYWtlbiB3aXJkIHNpY2gga2VpbiAiCisgICAgICAiRmlzY2ggZGVyIFdlbHQgZnVlciBEZWluZSBBbmdlbCBpbnRlcmVzc2llcmVuLiIsNzgpKTsKKyAgfQorICBlbHNlIGlmKHByZXNlbnQoRklTQ0hfSUQsTUUpKSB7CisgICAgdGVsbF9vYmplY3QoVFAsICJOaW1tIGVyc3QgbWFsIGRpZSBCZXV0ZSB2b24gZGVyIEFuZ2VsLCBkaWUgbm9jaCBkYXJhbiAiCisgICAgICAiemFwcGVsdCFcbiIpOworICB9CisgIGVsc2UgaWYgKCAhVFAtPlVzZUhhbmRzKE1FLCBRdWVyeVByb3AoUF9OUl9IQU5EUykpICkgeyAvLyBmcmVpZSBIYWVuZGU/CisgICAgdGVsbF9vYmplY3QoVFAsIEJTKCJEdSBtdXNzdCBzY2hvbiBiZWlkZSBIYWVuZGUgZnJlaSBoYWJlbiwgdW0gZGllICIKKyAgICAgICJBbmdlbCBzaWNoZXIgZmVzdGhhbHRlbiB6dSBrb2VubmVuLiIpKTsKKyAgfQorICBlbHNlIHsKKyAgICAvLyBSYXVtIGZlc3RoYWx0ZW4sIGluIGRlbSBnZWFuZ2VsdCB3aXJkLgorICAgIHJvb20gPSBlbnZpcm9ubWVudChUUCk7CisgICAgLy8gR2V3YWVzc2VydHlwIGFiZnJhZ2VuCisgICAgYWN0aXZlID0gcm9vbS0+UXVlcnlQcm9wKFBfV0FURVIpOworICAgIC8vIEtlaW4gV2Fzc2VyIHZvcmhhbmRlbiwgb2RlciBuaWNodC1iZWZpc2NoYmFyZXIgU29uZGVydHlwPworICAgIGlmKCAoIWFjdGl2ZSkgfHwgKGFjdGl2ZSAmIFdfT1RIRVIpICkgeworICAgICAgdGVsbF9vYmplY3QoVFAsICJEdSBrYW5uc3QgaGllciBuaWNodCBhbmdlbG4uXG4iKTsKKyAgICAgIFRQLT5GcmVlSGFuZHMoTUUpOworICAgIH0KKyAgICAvLyB0b3RlcyBHZXdhZXNzZXIgZXJ3aXNjaHQKKyAgICBlbHNlIGlmICggYWN0aXZlICYgV19ERUFEICkgeworICAgICAgd3JpdGUoIkluIGRlbSBHZXdhZXNzZXIgaGllciBnaWJ0IGVzIGtlaW5lIEZpc2NoZS5cbiIpOworICAgICAgVFAtPkZyZWVIYW5kcyhNRSk7CisgICAgfQorICAgIC8vIEpldHp0IGFiZXI6IGVzIGdpYnQgRmlzY2gsIEJhYnkuIDstKQorICAgIGVsc2UgeworICAgICAgaW50IGRlbGF5ID0gTUlOX0RFTEFZOyAvLyA4MCBTZWt1bmRlbi4KKyAgICAgIC8vIEZpc2NoYmVzdGFuZCBlcm1pdHRlbG4gYXVzIFJhdW0tIHVuZCBLb2VkZXJwYXJhbWV0ZXJuCisgICAgICBpbnQgYm9udXMgPSByb29tLT5RdWVyeVByb3AoUF9GSVNIKSArIGhha2VuLT5RdWVyeVByb3AoUF9GSVNIKTsKKyAgICAgIC8vIElzdCBrZWluIEJvbnVzLCBzb25kZXJuIGVpbiBNYWx1cyByYXVzZ2Vrb21tZW4/CisgICAgICBpZiAoIGJvbnVzIDwgMCApIHsKKyAgICAgICAgLy8gRGFubiBiZWdyZW56ZW4gYXVmIDUgTWluLgorICAgICAgICBpZiAoIGJvbnVzIDwgLTMwMCApCisgICAgICAgICAgYm9udXMgPSAtMzAwOworICAgICAgICAvLyBXYXJ0ZXplaXQgZXJob2VoZW4uCisgICAgICAgIGRlbGF5ICs9IHJhbmRvbSgtYm9udXMpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIC8vIEJvbnVzIGRlY2tlbG4gYXVmIE1heC1XZXJ0ICg2MCBTZWt1bmRlbikKKyAgICAgICAgaWYgKCBib251cyA+IE1BWF9GSVNIX0JPTlVTICkgeworICAgICAgICAgIGJvbnVzID0gTUFYX0ZJU0hfQk9OVVM7CisgICAgICAgIH0KKyAgICAgICAgLy8gRGVsYXkgcmVkdXppZXJlbiAobWluaW1hbCAyMCBTZWt1bmRlbikKKyAgICAgICAgZGVsYXkgLT0gcmFuZG9tKGJvbnVzKTsKKyAgICAgIH0KKyAgCisgICAgICAvLyBwYXNzdCBkYXMgR2V3YWVzc2VyIHp1ciBBbmdlbC96dW0gS29lZGVyID8KKyAgICAgIGlmKCAhKFF1ZXJ5UHJvcChQX1dBVEVSKSAmIHJvb20tPlF1ZXJ5UHJvcChQX1dBVEVSKSkgKQorICAgICAgICBkZWxheSArPSBXUk9OR1dBVEVSICsgcmFuZG9tKFdST05HV0FURVIpOworICAgICAgaWYoICEocm9vbS0+UXVlcnlQcm9wKFBfV0FURVIpICYgaGFrZW4tPlF1ZXJ5UHJvcChQX1dBVEVSKSkgJiYKKyAgICAgICAgICByb29tLT5RdWVyeVByb3AoUF9XQVRFUikgIT0gV19VU0VSICkKKyAgICAgICAgZGVsYXkgKz0gV1JPTkdXT1JNICsgcmFuZG9tKFdST05HV09STSk7CisKKyAgICAgIGludCBob29rID0gVFAtPkhSZWdpc3RlclRvSG9vayhIX0hPT0tfTU9WRSwgTUUsIEhfSE9PS19PVEhFUlBSSU8oMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSF9MSVNURU5FUiwgMCk7CisgICAgICBpZiAoIGhvb2sgIT0gMSApIHsKKyAgICAgICAgYWN0aXZlID0gMDsKKyAgICAgICAgcm9vbSA9IDA7CisgICAgICAgIFRQLT5GcmVlSGFuZHMoTUUpOworICAgICAgICB0ZWxsX29iamVjdChUUCwgQlMoCisgICAgICAgICAgIkR1IHNjaGxldWRlcnN0IGRpZSBBbmdlbCBtaXQgU2Nod3VuZyBpbiBSaWNodHVuZyBXYXNzZXIsIGFiZXIgZGVyICIKKyAgICAgICAgICAiSGFrZW4gdmVyZmFlbmd0IHNpY2ggaW4gRGVpbmVuIFNhY2hlbiB1bmQgcGlla3N0IERpciBpbiBkZW4gIgorICAgICAgICAgICJBbGxlcndlcnRlc3Rlbi4gRGFzIHZlcnN1Y2hzdCBEdSBiZXNzZXIgbm9jaCBlaW5tYWwgYW5kZXJzLiIpKTsKKyAgICAgICAgdGVsbF9yb29tKGVudmlyb25tZW50KFRQKSwgQlMoCisgICAgICAgICAgVFAtPk5hbWUoKSsiIHNjaGxldWRlcnQgZWluZSBBbmdlbCBpbiBSaWNodHVuZyBXYXNzZXIsIGlzdCBkYWJlaSAiCisgICAgICAgICAgImFiZXIgc28gdW5nZXNjaGlja3QsIGRhc3Mgc2ljaCBkZXIgSGFrZW4gdmVyZmFlbmd0LiIpLCAoe1RQfSkpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIC8vIEFsbGUgQmVkaW5ndW5nZW4gZXJmdWVsbHQ6IAorICAgICAgICAvLyAtIEFuZ2VsIGluIGRlciBIYW5kLgorICAgICAgICAvLyAtIEdld2Flc3NlciBzdGltbXQuCisgICAgICAgIC8vIC0gSGFrZW4gbWl0IEtvZWRlciBpc3QgZHJhbi4KKyAgICAgICAgLy8gLSBhbHRlIEJldXRlIHd1cmRlIGFiZ2Vub21tZW4uCisgICAgICAgIC8vIC0gTW92ZS1Ib29rIGdlc2V0enQsIHVtIEFiYnJ1Y2ggYXVzbG9lc2VuIHp1IGtvZW5uZW4uCisgICAgICAgIGFjdGltZSA9IHRpbWUoKTsKKyAgICAgICAgY3VycmVudF91c2VyID0gVFA7CisgICAgICAgIHRlbGxfb2JqZWN0KFRQLCAiRHUgd2lyZnN0IGRpZSBBbmdlbCBhdXMuXG4iKTsKKyAgICAgICAgdGVsbF9yb29tKGVudmlyb25tZW50KFRQKSwgVFAtPk5hbWUoKSsiIHdpcmZ0IGVpbmUgQW5nZWwgYXVzLlxuIiwgCisgICAgICAgICAgKHtUUH0pKTsKKyAgICAgICAgY2FsbF9vdXQoImRvX2FuZ2VsIiwgZGVsYXkpOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKworcHJpdmF0ZSBvYmplY3QgR2V0RmlzaChvYmplY3Qgcm9vbSkgeworICBpbnQgd3R5cGUgPSByb29tLT5RdWVyeVByb3AoUF9XQVRFUik7CisgIHN0cmluZyAqZmlzY2hlOworICAKKyAgLy8gV2VubiBHZXRBcXVhcml1bSgpIGJlaSBXX1VTRVIgbmljaHRzIHp1cnVlY2tsaWVmZXJ0LCBnZWh0IGRlciBBbmdsZXIKKyAgLy8gbGVlciBhdXMuIEVzIGthbm4ga2VpbiBGaXNjaCBhdXMgZGVyIFN0ZC1MaXN0ZSBnZW5vbW1lbiB3ZXJkZW4sIHdlaWwKKyAgLy8gZGVyIEdld2Flc3NlcnR5cCBqYSBwZXIgRGVmaW5pdGlvbiBiZW51dHplcmRlZmluaWVydCBpc3QuCisgIGlmICggd3R5cGUgPT0gV19VU0VSICkKKyAgICBmaXNjaGUgPSByb29tLT5HZXRBcXVhcml1bShNRSl8fCh7fSk7CisgIGVsc2UgCisgICAgZmlzY2hlID0gYXF1YXJpdW1bd3R5cGVdOworCisgIHN0cmluZyBiZXV0ZSA9IGZpc2NoZVtyYW5kb20oc2l6ZW9mKGZpc2NoZSkpXTsKKworICBpZiAoICFiZXV0ZSApCisgICAgcmV0dXJuIDA7CisgIC8vIEdldEFxdWFyaXVtKCkgbGllZmVydCB2b2xsZSBQZmFkZSwgU1RERklTSExJU1QgbnVyIERhdGVpbmFtZW4gcmVsYXRpdgorICAvLyB6dSBGSVNIKCkKKyAgZWxzZSBpZiAoIHd0eXBlID09IFdfVVNFUiApCisgICAgcmV0dXJuIGNsb25lX29iamVjdChiZXV0ZSk7CisgIGVsc2UKKyAgICByZXR1cm4gY2xvbmVfb2JqZWN0KEZJU0goYmV1dGUpKTsKK30KKworc3RhdGljIHZvaWQgZG9fYW5nZWwoKSB7CisgIG9iamVjdCBoYWtlbiA9IHByZXNlbnQoSEFLRU5fSUQsIE1FKTsKKyAgb2JqZWN0IHJvb20gID0gZW52aXJvbm1lbnQoVFApOworICBvYmplY3QgZmlzY2g7CisKKyAgc3RyaW5nIG1zZ19zZWxmLCBtc2dfb3RoZXI7CisgIGlmICggbWVtYmVyKFRQLT5RdWVyeVByb3AoUF9IQU5EU19VU0VEX0JZKSwgTUUpPT0tMSApIHsKKyAgICB0ZWxsX29iamVjdChUUCwgQlMoIldhZWhyZW5kIER1IHZlcnRyYWV1bXQgdm9yIERpY2ggaGluZ2VhbmdlbHQgaGFzdCwgIgorICAgICAgImhhdCBzaWNoIERlaW4gR3JpZmYgYW4gZGVyIEFuZ2VsIHdvaGwgZ2Vsb2NrZXJ0LCBzbyBkYXNzIGRlciAiCisgICAgICAiRmlzY2gsIGRlciBnZXJhZGUgYW5iZWlzc2VuIHdvbGx0ZSwgc2llIERpciBiZWluYWhlIGVudHJpc3NlbiAiCisgICAgICAiaGFldHRlLiIpKTsKKyAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoVFApLCBCUyhUUC0+TmFtZShXRVIpKyIgaGF0IHNpY2ggZ2VyYWRlICIKKyAgICAgICJ6aWVtbGljaCBlcnNjaHJlY2t0LCBhbHMgIitUUC0+UXVlcnlQcm9ub3VuKFdFTSkrIiBiZWluYWhlICIrCisgICAgICBUUC0+UVBQKE1FLCBXRU4sIFNJTkdVTEFSKSsiICIrTmFtZShSQVcpKyIgZW50cmlzc2VuIHdvcmRlbiB3YWVyZS4iKSwKKyAgICAgICh7VFB9KSk7CisgICAgaWYgKCAhcmFuZG9tKDMpICYmIGhha2VuLT5Lb2VkZXJHZWZyZXNzZW4oKSApCisgICAgICB0ZWxsX29iamVjdChUUCwgQlMoIkRlciBLb2VkZXIgaXN0IGplZGVuZmFsbHMgZnV0c2NoLiIpKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoICFvYmplY3RwKGhha2VuKSApIHsKKyAgICBtc2dfc2VsZiA9ICJIdWNoLCBhbnNjaGVpbmVuZCBoYXQgc2ljaCBpbiBlaW5lbSB1bmJlb2JhY2h0ZXRlbiAiCisgICAgICAiTW9tZW50IGRlciBBbmdlbGhha2VuIHZvbiBkZXIgQW5nZWxzY2hudXIgZ2Vsb2VzdC4gV2FyIGRlciBLbm90ZW4gIgorICAgICAgImRvY2ggbmljaHQgZ3V0IGdlbnVnIGdlc2ljaGVydD8iOworICAgIG1zZ19vdGhlciA9IFRQLT5OYW1lKCkrIiB6aWVodCB1bmdsYWV1YmlnIGVpbmUgbGVlcmUgQW5nZWxzY2hudXIgYXVzICIKKyAgICAgICJkZW0gV2Fzc2VyLiI7CisgIH0KKyAgZWxzZSBpZiAoICFvYmplY3RwKGZpc2NoPUdldEZpc2gocm9vbSkpIHx8IAorICAgICAgICAgICAgYWN0aXZlICE9IHJvb20tPlF1ZXJ5UHJvcChQX1dBVEVSKSApCisgIHsKKyAgICBtc2dfc2VsZiA9ICJBbnNjaGVpbmVuZCBnaWJ0IGVzIGhpZXIgZG9jaCBrZWluZSBGaXNjaGUuIER1IGdpYnN0ICIKKyAgICAgICJhdWYgdW5kIGhvbHN0ICIrbmFtZShXRU4sMSkrIiB3aWVkZXIgZWluLiI7CisgICAgLy8gTGVha2VuIHZvbiBGaXNjaG9iamVrdGVuIHZlcmhpbmRlcm4uCisgICAgaWYgKG9iamVjdHAoZmlzY2gpKQorICAgICAgZmlzY2gtPnJlbW92ZSgpOworICB9CisgIGVsc2UgaWYgKCBmaXNjaC0+bW92ZShNRSkgIT0gTU9WRV9PSyApIHsKKyAgICBtc2dfc2VsZiA9IGZpc2NoLT5OYW1lKFdFUikrIiBiaXNzIGFuLCB3YXIgYWJlciB6dSBzY2h3ZXIgZnVlciAiCisgICAgICAiRGljaCAob2RlciBEZWluZSBBbmdlbCkuICIrY2FwaXRhbGl6ZShmaXNjaC0+UXVlcnlQcm9ub3VuKFdFUikpKworICAgICAgIiBlbnRnbGVpdGV0IERpciB1bmQgcGx1bXBzdCB6dXJ1ZWNrIGlucyBXYXNzZXIhIjsKKyAgICAKKyAgICBpZiggIShmaXNjaC0+UXVlcnlQcm9wKFBfRklTSCkgJiBGX05PVEhVTkdSWSkgKSB7CisgICAgICBoYWtlbi0+S29lZGVyR2VmcmVzc2VuKCk7CisgICAgICBpZighcmFuZG9tKEtPRURFUl9MT1NUKSkgeworICAgICAgICBtc2dfc2VsZiArPSAiIERlaW4gSGFrZW4gaXN0IGRhYmVpIGxlaWRlciBhYmdlcmlzc2VuISI7CisgICAgICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudChUUCksIEJTKE5hbWUoV0VSLDEpKyIgdm9uICIrVFAtPk5hbWUoV0VNKSsKKyAgICAgICAgICAiIHdhY2tlbHRlIHNlaHIgc3RhcmsuIiksICh7VFB9KSk7CisgICAgICAgIGhha2VuLT5yZW1vdmUoKTsKKyAgICAgIH0KKyAgICB9CisgICAgZmlzY2gtPnJlbW92ZSgxKTsKKyAgfQorICBlbHNlIHsKKyAgICBoYWtlbi0+S29lZGVyR2VmcmVzc2VuKCk7CisgIH0KKyAgU3RvcEZpc2hpbmcobXNnX3NlbGYsIG1zZ19vdGhlcik7Cit9CisKK3ZhcmFyZ3MgaW50IHJlbW92ZShpbnQgc2lsZW50KSB7CisgIGlmICggZmluZF9jYWxsX291dCgiZG9fYW5nZWwiKSE9LTEgKQorICAgIFN0b3BGaXNoaW5nKE5hbWUoV0VSLDEpKyIgbG9lc3Qgc2ljaCBwbG9ldHpsaWNoIGltIE5pY2h0cyBhdWYuIik7CisgIHJldHVybiA6OnJlbW92ZShzaWxlbnQpOworfQorCisvLyBKZW1hbmQgbWFjaHQgImVuZGUiIHdhZWhyZW5kIGVyIGFuZ2VsdD8KK3Byb3RlY3RlZCB2b2lkIE5vdGlmeU1vdmUob2JqZWN0IGRlc3QsIG9iamVjdCBvbGRlbnYsIGludCBtZXRob2QpIHsKKyAgaWYgKCBmaW5kX2NhbGxfb3V0KCJkb19hbmdlbCIpIT0tMSAmJiBvbGRlbnYgPT0gY3VycmVudF91c2VyICYmIAorICAgICAgIGRlc3QtPklzUm9vbSgpICkgeworICAgIFN0b3BGaXNoaW5nKCJEdSBob2xzdCBkaWUgQW5nZWwgZWluIHVuZCBsZWdzdCBzaWUgYmVpc2VpdGUuIik7CisgIH0KKyAgcmV0dXJuIDo6Tm90aWZ5TW92ZShkZXN0LCBvbGRlbnYsIG1ldGhvZCk7Cit9CisKKy8vIFNwaWVsZXIgbG9nZ3Qgd2FlaHJlbmQgZGVzIEFuZ2VsbnMgYXVzPyBEYW5uIGFuZ2VsbiBlaW5zdGVsbGVuLgordm9pZCBCZWNvbWVzTmV0RGVhZChvYmplY3QgcGwpIHsKKyAgaWYgKCBmaW5kX2NhbGxfb3V0KCJkb19hbmdlbCIpIT0tMSAmJiBwbCA9PSBjdXJyZW50X3VzZXIgKSB7CisgICAgU3RvcEZpc2hpbmcoIkFuZ2VsbiBpc3Qgc28gZWluZSBiZXJ1aGlnZW5kZSBGcmVpemVpdGJlc2NoYWVmdGlndW5nISAiCisgICAgICAiQmV2b3IgRHUgbWl0IGRlciBBbmdlbCBpbiBkZXIgSGFuZCBlaW5zY2hsYWVmdCwgaG9sc3QgRHUgc2llICIKKyAgICAgICJsaWViZXIgc2NobmVsbCBlaW4uIiwgcGwtPk5hbWUoKSsiIGhvbHQgc2NobmVsbCBub2NoIGRpZSBBbmdlbCBlaW4sICIKKyAgICAgICJiZXZvciAiK3BsLT5RdWVyeVByb25vdW4oV0VSKSsiIGVpbnNjaGxhZWZ0LiIpOworICB9Cit9CisKK2ludCBQcmV2ZW50SW5zZXJ0KG9iamVjdCBvYikgeworICAvLyBGdW5rdGlvbiB3aXJkIGF1cyBlaW5lciBTcGllbGVyZWluZ2FiZSBoZXJhdXMgZ2VydWZlbgorICAvLyBJY2ggbmVobWUgaGllciBuaWNodCBUUCwgd2VpbCBkZXIgY2FsbF9vdXQoImRvX2FuZ2VsIikgZGllCisgIC8vIGdlZmFuZ2VuZW4gRmlzY2hlIHBlciBtb3ZlKCkgaW4gZGllIEFuZ2VsIGJld2VndDogQmVpIGNhbGxfb3V0KClzIHdpcmQKKyAgLy8gVFAgZHVyY2ggZGllIEtldHRlIHdlaXRlcmdlcmVpY2h0LCBzbyBkYXNzIGRhbm4gaGllciBrZWluZSAKKyAgLy8gVW50ZXJzY2hlaWR1bmcgendpc2NoZW4gU3BpZWxlcmVpbmdhYmUgdW5kIGNhbGxfb3V0KCkgbW9lZ2xpY2ggd2FlcmUuCisgIFNldFByb3AoUF9OT0lOU0VSVF9NU0csIDApOworICBpZiAoIHN0cmluZ3AocXVlcnlfdmVyYigpKSAmJgorICAgICAgIG1lbWJlcigoeyJoYWVuZ2UiLCJoYWVuZyIsImJlZmVzdGlnZSJ9KSwgcXVlcnlfdmVyYigpKSA9PSAtMSApIHsKKyAgICBTZXRQcm9wKFBfTk9JTlNFUlRfTVNHLCBCUyhOYW1lKFdFUiwxKSsiIGlzdCBudXIgZGFmdWVyIGdlZWlnbmV0LCAiCisgICAgICAiQW5nZWxoYWtlbiBkYXJhbnp1aGFlbmdlbi4iKSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYoIG9iLT5pZChGSVNDSF9JRCkgKSB7CisgICAgd3JpdGUoIkV0d2FzIHphcHBlbHQgYW4gRGVpbmVyIEFuZ2VsLlxuIik7CisgIH0KKyAgcmV0dXJuIDo6UHJldmVudEluc2VydChvYik7Cit9CisKKy8vIFdlbm4gZ2VhbmdlbHQgd2lyZCwgbmltbXQgaGllciBuaWVtYW5kIHdhcyByYXVzLgorcHVibGljIGludCBQcmV2ZW50TGVhdmUob2JqZWN0IG9iLCBtaXhlZCBkZXN0KSB7CisgIFNldFByb3AoUF9OT0xFQVZFX01TRywgMCk7CisgIGlmICggZmluZF9jYWxsX291dCgiZG9fYW5nZWwiKSE9LTEgKSB7CisgICAgaWYgKCBvYmplY3RwKFRQKSAmJiBvYi0+aWQoSEFLRU5fSUQpICkKKyAgICAgIFNldFByb3AoUF9OT0xFQVZFX01TRywgQlMoIkRlciBIYWtlbiBpc3QgZ2VyYWRlIHVudGVyIFdhc3Nlci4gRXMgIgorICAgICAgICAid2FlcmUga29udHJhcHJvZHVrdGl2LCBpaG4gYXVzZ2VyZWNobmV0IGpldHp0IGFienVuZWhtZW4uIikpOworICAgIHJldHVybiAxOworICB9CisgIHJldHVybiA6OlByZXZlbnRMZWF2ZShvYiwgZGVzdCk7Cit9CisKKy8vIEJlZW5kZXQgZGFzIEFuZ2VsbiwgaW5kZW0gQWt0aXYtRmxhZyBnZWxvZXNjaHQsIEhvb2sgZGVyZWdpc3RyaWVydAorLy8gdW5kIGNhbGxfb3V0KCkgZ2Vsb2VzY2h0IHdpcmQuIFp1c2FldHpsaWNoIHdlcmRlbiBkaWUgYWxzIEFyZ3VtZW50IHVlYmVyLQorLy8gZ2ViZW5lbiBNZWxkdW5nZW4gYXVzZ2VnZWJlbiwgb2RlciBwYXNzZW5kZSBnZW5lcmlzY2hlIHZlcndlbmRldC4KK25vbWFzayB2YXJhcmdzIHZvaWQgU3RvcEZpc2hpbmcoc3RyaW5nIG1zZ19tZSwgc3RyaW5nIG1zZ19yb29tKSB7CisgIGFjdGl2ZSA9IDA7CisgIHdoaWxlKHJlbW92ZV9jYWxsX291dCgiZG9fYW5nZWwiKSE9LTEpOworICBvYmplY3QgZW52ID0gZW52aXJvbm1lbnQoTUUpOworICBpZiAoIG9iamVjdHAoZW52KSAmJiBlbnYgPT0gY3VycmVudF91c2VyICkgeworICAgIGVudi0+RnJlZUhhbmRzKE1FKTsKKyAgICBjdXJyZW50X3VzZXIgPSAwOworICAgIGVudi0+SFVucmVnaXN0ZXJGcm9tSG9vayhIX0hPT0tfTU9WRSwgTUUpOworICAgIHRlbGxfb2JqZWN0KGVudiwgQlMobXNnX21lfHwiRHUgaG9sc3QgRGVpbmUgQW5nZWwgd2llZGVyIGVpbi4iKSk7CisgICAgdGVsbF9yb29tKGVudmlyb25tZW50KGVudiksIEJTKG1zZ19yb29tfHwKKyAgICAgIGVudi0+TmFtZShXRVIpKyIgaG9sdCAiK2Vudi0+UXVlcnlQb3NzUHJvbm91bihNRSxXRU4sU0lOR1VMQVIpKyIgIisKKyAgICAgIG5hbWUoUkFXKSsiIGVpbi4iKSwgKHtlbnZ9KSk7CisgIH0KK30KKworLy8gRGllc2UgTWV0aG9kZSB3aXJkIGluIGplZGVtIEhvb2stS29uc3VtZW50ZW4gZWluZXMgSG9vay1Qcm92aWRlcnMKKy8vIGF1ZmdlcnVmZW4sIHNvbGFuZ2UgZGllIFZlcmFyYmVpdHVuZyBuaWNodCB2b3JoZXIgYWJnZWJyb2NoZW4gd3VyZGUuCisvLyBEYW5uIGplZG9jaCB3dXJkZSBhdWNoIGRpZSBBa3Rpb24gKEJld2VndW5nKSBuaWNodCBhdXNnZWZ1ZWhydCwgZC5oLgorLy8gc29sYW5nZSBoaWVyIGtlaW4gRXZlbnQgYW5rb21tdCwgd3VyZGUga2VpbmUgQmV3ZWd1bmcgYXVzZ2VmdWVocnQgdW5kIAorLy8gZGFzIEFuZ2VsbiBrYW5uIHdlaXRlcmxhdWZlbi4KK21peGVkIEhvb2tDYWxsYmFjayhvYmplY3QgaG9va1NvdXJjZSwgaW50IGhvb2tpZCwgbWl4ZWQgaG9va0RhdGEpIHsKKyAgaWYgKCBob29raWQgPT0gSF9IT09LX01PVkUgJiYgaG9va1NvdXJjZSA9PSBjdXJyZW50X3VzZXIgKSB7CisgICAgU3RvcEZpc2hpbmcoIkRlaW5lIEFuZ2Vsc2NobnVyIGlzdCB6dSBrdXJ6LCB1bSBkYW1pdCBydW1sYXVmZW4genUgIgorICAgICAgImtvZW5uZW4uIER1IGhvbHN0IGRpZSBBbmdlbCB3aWVkZXIgZWluLiIpOworICB9CisgIHJldHVybiAoe0hfTk9fTU9ELCBob29rRGF0YX0pOworfQorCisvLyBXaXJkIGdlcnVmZW4sIHdlbm4gZGVyIEtvbnN1bWVudCB2b24gZWluZW0gYW5kZXJlbiBtaXQgaG9laGVyZXIgUHJpb3JpdGFldAorLy8gdmVyZHJhZW5ndCB3dXJkZS4KK3ZvaWQgc3VwZXJzZWVkZWRIb29rKGludCBob29raWQsIG9iamVjdCBob29rU291cmNlKSB7CisgIGlmICggaG9va2lkID09IEhfSE9PS19NT1ZFICYmIGhvb2tTb3VyY2UgPT0gY3VycmVudF91c2VyICkgeworICAgIFN0b3BGaXNoaW5nKCJJcmdlbmRldHdhcyBpc3QgZ2VyYWRlIHBhc3NpZXJ0LCBkYXMgYWxsZSBGaXNjaGUgIgorICAgICAgInZlcnRyaWViZW4gaGF0LiBEdSBzaWVoc3Qgc2llIHVudGVyIGRlciBXYXNzZXJvYmVyZmxhZWNoZSBkYXZvbiIKKyAgICAgICJmbGl0emVuLiBFcm51ZWNodGVydCBob2xzdCBEdSBEZWluZSBBbmdlbCB3aWVkZXIgZWluLiIpOworICB9Cit9CisKKy8vIEFuZ2VsenVzdGFuZCBhYmZyYWdlbi4KK2ludCBJc0Zpc2hpbmcoKSB7CisgIHJldHVybiAoZmluZF9jYWxsX291dCgiZG9fYW5nZWwiKSE9LTEpOworfQorCisvLyBHZXdhZXNzZXJ0eXAgYWJmcmFnZW4sIGluIGRlbSBnZXJhZGUgZ2VhbmdlbHQgd2lyZC4KK2ludCBxdWVyeV9hY3RpdmUoKSB7CisgIHJldHVybiBhY3RpdmU7Cit9CmRpZmYgLS1naXQgYS9zdGQvaXRlbXMvZmlzaGluZy9maXNoLmMgYi9zdGQvaXRlbXMvZmlzaGluZy9maXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIwOWIzNQotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9pdGVtcy9maXNoaW5nL2Zpc2guYwpAQCAtMCwwICsxLDIyMiBAQAorLy9SZXZpc2lvbiAxLjE6IFF1ZXJ5UXVhbGl0eSgpIGFkZGVkLCBzb2xsdGUgYWJlciBub2NoIHZlcmJlc3NlcnQgd2VyZGVuIQorLyoKK0xldHp0ZSBBZW5kZXJ1bmc6IFZhbmlvbiwgMjYuMDUuMDIKKyAgICAgICAgICAgICAgICAgIC0gRGllIEZpc2NoZSBoYWJlbiBqZXR6dCB3aWVkZXIgZWluZW4gV2VydC4gRGVyIFByZWlzIHdpcmQgCisgICAgICAgICAgICAgICAgICAgIHZvbiBlaW5lbSBNYXN0ZXIga29udHJvbGxpZXJ0LiBKZSBtZWhyIEZpc2NoIGVpbiBTcGllbGVyCisgICAgICAgICAgICAgICAgICAgIGFuZ2VsdCwgZGVzdG8gYmlsbGlnZXIgd2lyZCBkZXIgRmlzY2guCisgICAgICAgICAgICAgICAgICAtIEdyb3NzLUtsZWluc2NocmVpYnVuZyBiZWltIGVzc2VuIGtvcnJpZ2llcnQuCisqLworCisjcHJhZ21hIHN0cm9uZ190eXBlcywgc2F2ZV90eXBlcywgcnR0X2NoZWNrcworI3ByYWdtYSBub19jbG9uZSwgbm9fc2hhZG93CisKK2luaGVyaXQgIi9zdGQvdGhpbmciOworCisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPGl0ZW1zL2Zpc2hpbmcvZmlzaGluZy5oPgorCisjZGVmaW5lIFRQIHRoaXNfcGxheWVyKCkKKyNkZWZpbmUgQlMoeCkgYnJlYWtfc3RyaW5nKHgsIDc4KQorCitwcml2YXRlIHN0cmluZyBlYXRtZXNzYWdlOworc3RyaW5nIGNvcnBzZW9iamVjdCA9ICIvaXRlbXMvZmlzaGluZy9ncmFldGVuIjsKK3N0YXRpYyBpbnQgcHJpY2VfbW9kaWZpZXI7CisKKyNkZWZpbmUgREVDQVlTVEFSVCAgIDYwMCAgLy8gYmVnaW5udCBuYWNoIDEwIG1pbiB6dSBmYXVsZW4KKyNkZWZpbmUgREVDQVlTVEVQICAgIDEyMCAgLy8gYWxsZSAyIE1pbnV0ZW4gd2lyZCBlciBzY2hsZWNodGVyCisjZGVmaW5lIE1BWFFVQUxJVFkgICAgIDQgIC8vIG5hY2ggNCBEZWNheXMgaXN0IGVyIGdpZnRpZworI2RlZmluZSBLSUxMRkFDVE9SICAgICA1ICAvLyByZWR1Y2VfaGl0X3BvaW50cyhTVEVQUypLSUxMRkFDVE9SKQorI2RlZmluZSBIRUFMRkFDVE9SICAgIDMyICAvLyA4MDAgZyA9IDI1IExQCisjZGVmaW5lIE1BWEhFQUwgICAgICAgNDAgIC8vIEtlaW4gRmlzY2ggYnJpbmd0IG1laHIgYWxzIDQwIExQCisjZGVmaW5lIE1JTkhFQUwgICAgICAgIDAgIC8vIG9kZXIgd2VuaWdlciBhbHMgMAorI2RlZmluZSBGT09ESEVBTEZBQ1RPUiAzICAvLyBMUD1MUCArIDEvMyBkZXMgR2V3aWNodHMKKwordm9pZCBTZXRFYXRNZXNzYWdlKHN0cmluZyBzdHIpOwordm9pZCBTZXRDb3Jwc2VPYmplY3Qoc3RyaW5nIHN0cik7CitpbnQgUXVlcnlRdWFsaXR5KCk7CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpIHsKKyAgOjpjcmVhdGUoKTsKKyAgLy8gUmVzZXQga3VyeiBuYWNoIEVycmVpY2hlbiBkZXMgbWF4LiBHYW1tZWx6dXN0YW5kcywgZGFubiB6ZXJzdG9lcmVuLgorICBzZXRfbmV4dF9yZXNldChERUNBWVNUQVJUKyhNQVhRVUFMSVRZKzEpKkRFQ0FZU1RFUCk7CisgIEFkZElkKCh7RklTQ0hfSUQgLCJmaXNjaCJ9KSk7CisgIFNldFByb3AoUF9OQU1FLCAiRmlzY2giICk7CisgIFNldFByb3AoUF9HRU5ERVIgLCBNQUxFKTsKKyAgU2V0UHJvcChQX1NIT1JULCAiRWluIEZpc2NoIiApOworICBTZXRQcm9wKFBfTE9ORywgIkVpbiBzdGlua25vcm1hbGVyIEZpc2NoLlxuIik7CisgIFNldFByb3AoUF9NQVRFUklBTCwgTUFUX01JU0NfRk9PRCk7CisgIFNldFByb3AoUF9OT0JVWSwxKTsKKyAgU2V0UHJvcChQX1dFSUdIVCwgNTAwKTsKKyAgQWRkQ21kKCJpc3MmQElEIiwgImVhdGl0IiwgIldhcyB3aWxsc3QgRHUgZXNzZW4/Iik7CisKKyAgLy8gVmFuaW9uLCAyNi4wNS4wMjogRGVyIFByZWlzIHdpcmQgZXJzdCBuYWNoIGRlbSBjcmVhdGUoKSBnZWhvbHQsIAorICAvLyBkYSBkYXMgR2V3aWNodCBkYW5uIHNjaG9uIGdlc2V0enQgd2VyZGVuIG11c3MuCisgIGNhbGxfb3V0KCJHZXRQcmljZU1vZGlmaWVyIiwwKTsKK30KKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlX3N1cGVyKCkgeworICBzZXRfbmV4dF9yZXNldCgtMSk7Cit9CisKKy8vIFdlcnQgZGVzIEZpc2NoZXMgaXN0IGFiaGFlbmdpZyB2b20gcHJpY2VfbW9kaWZpZXIgdW5kIHZvbiBQX1ZBTFVFCitzdGF0aWMgaW50IF9xdWVyeV92YWx1ZSgpIHsKKyAgaW50IHZhbHVlOworCisgIC8vIE1pbmltYWxwcmVpcyBpc3QgaW1tZXIgMSBNdWVuemUuIERhbWl0IG1hbiBpaG4gbG9zd2lyZC4KKyAgaWYoIXByaWNlX21vZGlmaWVyKSAKKyAgICByZXR1cm4gMTsKKworICB2YWx1ZSA9IFF1ZXJ5KFBfVkFMVUUsIEZfVkFMVUUpOworCisgIGlmKCF2YWx1ZSkKKyAgICByZXR1cm4gMDsgCisKKyAgcmV0dXJuICh2YWx1ZSpwcmljZV9tb2RpZmllcikvMTAwIDsKK30KKworLypFaW5nZWJhdXQgdm9uIFZhbmlvbiwgMjYuMDUuMDIKKyAgRGllIEZ1bmt0aW9uIGhvbHQgZGVuIHByaWNlX21vZGlmaWVyIGF1cyBkZW0gRmlzaC1NYXN0ZXIuCisgIEhpZXJiZWkgd2lyZCBlaW4gV2VydCB6d2lzY2hlbiAwIHVuZCAxMDAgenVydWVja2dlZ2ViZW4sIGRlciAKKyAgZGVuIFByb3plbnRzYXR6IGRlcyBXZXJ0ZXMgdm9uIFBfVkFMVUUgYW5naWJ0LiA1MCBiZWRldXRldCwgZGFzcworICBkZXIgRmlzY2ggNTAlIHNlaW5lcyBNYXhpbWFsd2VydGVzIGhhdC4gKi8KKworI2RlZmluZSBGSVNITUFTVEVSICJwL2RhZW1vbi9maXNobWFzdGVyIgorCit2b2lkIEdldFByaWNlTW9kaWZpZXIoKSB7CisgIGlmICghdGhpc19wbGF5ZXIoKSkgcmV0dXJuOworCisgIC8vIEpldHp0IHdpcmQgZGVyIFByZWlzIGZ1ZXIgZGVuIEZpc2NoIGJlc3RpbW10LgorICBwcmljZV9tb2RpZmllciA9IEZJU0hNQVNURVItPlByaWNlT2ZGaXNoKFRQLCBNRSk7CisgIHJldHVybjsKK30KKwordm9pZCBTZXRFYXRNZXNzYWdlKHN0cmluZyBzdHIpIHsKKyAgZWF0bWVzc2FnZT1zdHI7Cit9CisKK3ZvaWQgU2V0Q29ycHNlT2JqZWN0KHN0cmluZyBzdHIpIHsKKyAgY29ycHNlb2JqZWN0PXN0cjsKK30KKworaW50IF9zZXRfd2VpZ2h0KGludCBncmFtbSkgeworICBpbnQgdG1wID0gZ3JhbW0vMiArIHJhbmRvbShncmFtbS8yKTsgLy8gIm5hdC4gU2Nod2Fua3VuZ2VuIiBuYWNoYmlsZGVuCisgIFNldChQX1dFSUdIVCwgdG1wLCBGX1ZBTFVFKTsKKyAgU2V0UHJvcChQX1ZBTFVFLCB0bXAvNCk7IC8vIEltIG5vcm1hbGVuIExhZGVuIG51ciAxLzQgR2V3aWNodCBpbiBNdWVuemVuCisgIHJldHVybiB0bXA7Cit9CisKK3ZvaWQgaW5pdCgpIHsKKyAgOjppbml0KCk7CisgIGlmKCBRdWVyeVByb3AoUF9GSVNIKSZGX1JFUExBQ0UgKSB7CisgICAgaWYocXVlcnlfb25jZV9pbnRlcmFjdGl2ZShlbnZpcm9ubWVudChNRSkpKSB7CisgICAgICBjYWxsX291dCgiUmVwbGFjZUZpc2giLDApOworICAgIH0KKyAgfQorICByZXR1cm47Cit9CisgCit2YXJhcmdzIHN0cmluZyBsb25nKGludCBtb2RlKSB7CisgIHN0cmluZyBwcm9uID0gY2FwaXRhbGl6ZShRdWVyeVByb25vdW4oV0VSKSk7CisgIHN0cmluZyB0eHQgPSBRdWVyeVByb3AoUF9MT05HKTsKKyAKKyAgc3dpdGNoKFF1ZXJ5UXVhbGl0eSgpKSB7CisgICAgY2FzZSA0OiAgdHh0ICs9IHByb24rIiBpc3QgZmFuZ2ZyaXNjaC5cbiI7ICAgICAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOiAgdHh0ICs9IHByb24rIiBpc3Qgbm9jaCByZWNodCBmcmlzY2guXG4iOyAgICAgYnJlYWs7CisgICAgY2FzZSAyOiAgdHh0ICs9IHByb24rIiBpc3Qgc2Nob24gZXR3YXMgcnVuemxpZy5cbiI7ICAgYnJlYWs7CisgICAgY2FzZSAxOiAgdHh0ICs9IHByb24rIiBzaWVodCBzY2hvbiByZWNodCBhbHQgYXVzLlxuIjsgYnJlYWs7CisgICAgY2FzZSAwOiAgdHh0ICs9IHByb24rIiBpc3QgbmljaHQgbWVociBnZW5pZXNzYmFyIVxuIjsgYnJlYWs7CisgICAgY2FzZSAtMTogdHh0ICs9IHByb24rIiBpc3QgdmVyZ2FtbWVsdC5cbiI7ICAgICAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHR4dCArPSAocHJvbisiIHN0aW5rdCB3aWRlcmxpY2ggdW5kIGlzdCBiZXJlaXRzIHZvbGxlciBNYWRlbiFcbiIrcHJvbisKKyAgICAgICAgIiB6ZXJmYWVsbHQgbm9jaCB3YWVocmVuZCBEdSAiK1F1ZXJ5UHJvbm91bihXRU4pKyIgYmV0cmFjaHRlc3QuXG4iKTsKKyAgICAgIHJlbW92ZSgpOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuKHR4dCk7Cit9CisKK2ludCBfcXVlcnlfZmlzaF9hZ2UoKSB7CisgIHJldHVybiAodGltZSgpLVF1ZXJ5UHJvcChQX0NMT05FX1RJTUUpKTsKK30KKworc3RhdGljIGludCBlYXRpdChzdHJpbmcgc3RyKSB7CisgIHN0cmluZyBtc2dfb3RoZXIgPSBUUC0+TmFtZSgpKyIgaXNzdCAiK25hbWUoV0VOKSsiLiI7CisKKyAgaWYgKCAhZWF0bWVzc2FnZSApCisgICAgZWF0bWVzc2FnZSA9ICJEdSBpc3N0ICIrbmFtZShXRU4sMSkrIiBhdWYuIjsKKworICBpZiAoIHN0cmluZ3AoY29ycHNlb2JqZWN0KSApIHsKKyAgICBvYmplY3QgbXVlbGw9Y2xvbmVfb2JqZWN0KGNvcnBzZW9iamVjdCk7CisgICAgaWYgKCBtdWVsbC0+bW92ZShUUCwgTV9HRVQpICE9IE1PVkVfT0sgKSB7CisgICAgICBtdWVsbC0+bW92ZShlbnZpcm9ubWVudChUUCksIE1fR0VUKTsKKyAgICB9CisgIH0KKyAgCisgIC8vIEhlaWx1bmcgYmVyZWNobmVuLgorICAvLyBIZWlsd2VydCBydW50ZXJza2FsaWVyZW4gbWl0IFF1YWxpdGFldCwgd2VubiBkYXMgTWluZGVzdGFsdGVyIGVycmVpY2h0CisgIC8vIGlzdCwgYWJlciBudXIsIHdlbm4gZGVyIEZpc2NoIGF1Y2ggdmVyZ2FtbWVsbiBrYW5uLgorICBpbnQgaGVhbGluZyA9IFF1ZXJ5UHJvcChQX1dFSUdIVCkvSEVBTEZBQ1RPUjsKKyAgaW50IGFnZSA9IFF1ZXJ5UHJvcChQX0ZJU0hfQUdFKTsKKyAgaWYgKCBhZ2UgPiBERUNBWVNUQVJUICYmICEoUXVlcnlQcm9wKFBfRklTSCkmRl9OT1JPVFRFTikpIHsKKyAgICBoZWFsaW5nID0gaGVhbGluZyAqIChRdWVyeVF1YWxpdHkoKSoyNSkvMTAwOworICB9CisgIGlmICggaGVhbGluZyA+IE1BWEhFQUwgKQorICAgIGhlYWxpbmcgPSBNQVhIRUFMOworICBlbHNlIGlmICggaGVhbGluZyA8IE1JTkhFQUwgKQorICAgIGhlYWxpbmcgPSBNSU5IRUFMOworCisgIGlmKCBhZ2UgPiBERUNBWVNUQVJUICsgTUFYUVVBTElUWSpERUNBWVNURVApIHsKKyAgICB0ZWxsX29iamVjdChUUCwgQlMoZWF0bWVzc2FnZSArICIgRGlyIHdpcmQgc3BlaXVlYmVsLCBkZXIgRmlzY2ggd2FyICIKKyAgICAgICJ6dSBhbHQhIikpOworICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudChUUCksIEJTKG1zZ19vdGhlciArIFRQLT5RdWVyeVByb25vdW4oV0VSKSsKKyAgICAgICIgdmVyZHJlaHQgYW5nZWVrZWx0IGRpZSBBdWdlbi4iKSwgKHtUUH0pKTsKKyAgICBUUC0+cmVkdWNlX2hpdF9wb2ludHMoICgoYWdlLURFQ0FZU1RBUlQpL0RFQ0FZU1RFUCkqS0lMTEZBQ1RPUiApOworICAgIHJlbW92ZSgpOworICB9CisgIGVsc2UgeworICAgIGlmICggVFAtPmVhdF9mb29kKGhlYWxpbmcqRk9PREhFQUxGQUNUT1IpICkgeworICAgICAgdGVsbF9vYmplY3QoVFAsIEJTKGVhdG1lc3NhZ2UpKTsKKyAgICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudChUUCksIEJTKG1zZ19vdGhlciksICh7VFB9KSk7CisgICAgICBpZiAoICEoUXVlcnlQcm9wKFBfRklTSCkmRl9OT0hFQUwpICkKKyAgICAgICAgVFAtPmJ1ZmZlcl9ocChoZWFsaW5nLDUpOworICAgICAgcmVtb3ZlKCk7CisgICAgfQorICB9CisgIHJldHVybiAxOworfQorCisvLyBRdWFsaXRhZXQgZGVzIEZpc2NoZXMgZXJtaXR0ZWxuLiBSdWVja2dhYmV3ZXJ0OiA0LCAzLCAyLCAxLCAwLCAtMSAuLi4KK2ludCBRdWVyeVF1YWxpdHkoKSB7CisgIC8vIEFsdGVyIGluIFNla3VuZGVuIHVlYmVyIGRlciBHcmVuemUsIGFiIGRlciBkZXIgRmlzY2ggYW5mYWVuZ3QgenUgZ2FtbWVsbgorICBpbnQgYWdlID0gUXVlcnlQcm9wKFBfRklTSF9BR0UpLURFQ0FZU1RBUlQ7CisgIC8vIFdlbm4gZGllIEdyZW56ZSBub2NoIG5pY2h0IGVycmVpY2h0IGlzdCwgb2RlciBkZXIgRmlzY2ggZ2VuZXJlbGwgbmljaHQKKyAgLy8gZ2FtbWVsdCAoRl9OT1JPVFRFTiksIGRhbm4gaXN0IGRhcyBBbHRlciAwIHVuZCBkaWUgUXVhbGl0YWV0IG1heC4KKyAgaWYgKCBhZ2U8MCB8fCBRdWVyeVByb3AoUF9GSVNIKSAmIEZfTk9ST1RURU4gKSAKKyAgICBhZ2UgPSAwOworCisgIC8vIFF1YWxpdGFldCBpbiBERUNBWVNURVAtU3R1ZmVuIHJlZHV6aWVyZW4gKDYwIHMgcHJvIEdhbW1lbHN0dWZlKQorICByZXR1cm4gTUFYUVVBTElUWS0oYWdlL0RFQ0FZU1RFUCk7Cit9CisKK3ZvaWQgcmVzZXQoKSB7CisgIGlmIChjbG9uZXAoTUUpKSB7CisgICAgc3RyaW5nIG1zZyA9IEJTKE5hbWUoKSsiIGlzdCB2ZXJnYW1tZWx0IHVuZCB6ZXJmYWVsbHQuIikgOworICAgIGlmICggaW50ZXJhY3RpdmUoZW52aXJvbm1lbnQoKSkgKSB7CisgICAgICB0ZWxsX29iamVjdChlbnZpcm9ubWVudCgpLCBtc2cpOworICAgIH0KKyAgICBlbHNlIGlmICggZW52aXJvbm1lbnQoKS0+SXNSb29tKCkgKSB7CisgICAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSwgbXNnKTsKKyAgICB9CisgICAgaWYgKCBzdHJpbmdwKGNvcnBzZW9iamVjdCkgKSB7CisgICAgICBvYmplY3QgbXVlbGw9Y2xvbmVfb2JqZWN0KGNvcnBzZW9iamVjdCk7CisgICAgICBpZiAoIG11ZWxsLT5tb3ZlKGVudmlyb25tZW50KCksIE1fR0VUKSAhPSBNT1ZFX09LICkgeworICAgICAgICBtdWVsbC0+bW92ZShlbnZpcm9ubWVudChlbnZpcm9ubWVudCgpKSwgTV9HRVQpOworICAgICAgfQorICAgIH0KKyAgICBjYWxsX291dCgicmVtb3ZlIiwwKTsKKyAgICByZXR1cm47IAorICB9CisgIHJldHVybiA6OnJlc2V0KCk7Cit9CmRpZmYgLS1naXQgYS9zdGQvaXRlbXMvZmlzaGluZy9oYWtlbi5jIGIvc3RkL2l0ZW1zL2Zpc2hpbmcvaGFrZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmI5MWY0Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkL2l0ZW1zL2Zpc2hpbmcvaGFrZW4uYwpAQCAtMCwwICsxLDE1NyBAQAorI3ByYWdtYSBzdHJvbmdfdHlwZXMsIHNhdmVfdHlwZXMsIHJ0dF9jaGVja3MKKyNwcmFnbWEgbm9fc2hhZG93LCBub19jbG9uZQorCitpbmhlcml0ICIvc3RkL3RoaW5nIjsKKworI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGl0ZW1zL2Zpc2hpbmcvZmlzaGluZy5oPgorI2luY2x1ZGUgPGl0ZW1zL2ZsYXNjaGUuaD4KKyNpbmNsdWRlIDx1bml0Lmg+CisKKyNkZWZpbmUgVFAgdGhpc19wbGF5ZXIoKQorI2RlZmluZSBNRSB0aGlzX29iamVjdCgpCisKK2ludCBRdWVyeUtvZWRlcigpOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSB7CisgIDo6Y3JlYXRlKCk7CisKKyAgQWRkSWQoKHtIQUtFTl9JRCwiaGFrZW4iLCJhbmdlbGhha2VuIn0pKTsKKyAgU2V0UHJvcChQX05BTUUsICJIYWtlbiIpOworICBTZXRQcm9wKFBfR0VOREVSLCBNQUxFKTsKKyAgU2V0UHJvcChQX0FSVElDTEUsIDEpOworICBTZXRQcm9wKFBfV0VJR0hULCA1KTsKKyAgU2V0UHJvcChQX1NIT1JULCAiRWluIEFuZ2VsaGFrZW4iKTsKKyAgU2V0UHJvcChQX0xPTkcsICJFaW4gQW5nZWxoYWtlbiBhdXMgTWV0YWxsLlxuIik7CisgIFNldFByb3AoUF9MT05HX0VNUFRZLCJWaWVsbGVpY2h0IGthbm5zdCBEdSBldHdhcyBkYW1pdCBhdWZzcGllc3Nlbj9cbiIpOworCisgIC8vIExhbmctIHVuZCBLdXJ6YmVzY2hyZWlidW5nZW4gcmVhZ2llcmVuIGF1ZiBlaW5lbiBldnRsLiB2b3JoYW5kZW5lbiAKKyAgLy8gS29lZGVyLCBhbGxlcmRpbmdzIG51ciBhdWYgZWluIHRhdHNhZWNobGljaCBleGlzdGllcmVuZGVzIEtvZWRlci1PYmpla3QsCisgIC8vIG5pY2h0IGF1ZiBlaW5lbiBwZXIgdWViZXJzY2hyaWViZW5lbSBRdWVyeUtvZWRlcigpIHZvcmdldGFldXNjaHRlbgorICAvLyBLb2VkZXIsIHdpZSBlcyBkZXIgU3BlemlhbGhha2VuIHR1dC4KKyAgU2V0KFBfU0hPUlQsIGZ1bmN0aW9uIHN0cmluZyAoKSB7CisgICAgb2JqZWN0IGtvZWRlciA9IHByZXNlbnQoV1VSTV9JRCwgTUUpOworICAgIHJldHVybiBRdWVyeShQX1NIT1JULEZfVkFMVUUpKworICAgICAgKG9iamVjdHAoa29lZGVyKT8iIG1pdCAiK2tvZWRlci0+bmFtZShXRU0pOiIiKTsKKyAgfSwgRl9RVUVSWV9NRVRIT0QpOworICBTZXQoUF9MT05HLCBmdW5jdGlvbiBzdHJpbmcgKCkgeyAKKyAgICBvYmplY3Qga29lZGVyID0gcHJlc2VudChXVVJNX0lELCBNRSk7CisgICAgcmV0dXJuIFF1ZXJ5KFBfTE9ORyxGX1ZBTFVFKSArIChvYmplY3RwKGtvZWRlcik/CisgICAgICBrb2VkZXItPk5hbWUoV0VSKSsiIGhhZW5ndCBkYXJhbi5cbiI6UXVlcnlQcm9wKFBfTE9OR19FTVBUWSkpOworICB9LCBGX1FVRVJZX01FVEhPRCk7CisKKyAgLy8gUF9GSVNIIHVuZCBQX1dBVEVSIGxpZWZlcm4gZGllIERhdGVuIGVpbmVzIGV2dGwuIHZvcmhhbmRlbmVuIEtvZWRlcnMKKyAgLy8gV2VubiBrZWluIEtvZWRlciBkcmFuaGFlbmd0LCB3ZXJkZW4gUF9XQVRFUiB1bmQgUF9GSVNIIGRlcyBIYWtlbnMKKyAgLy8genVydWVja2dlZ2ViZW4sIGZhbGxzIGVzIHNpY2ggdW0gZWluZW4gRmFrZS1Lb2VkZXIgaGFuZGVsdCB3aWUgYmVpbQorICAvLyBTcGV6aWFsaGFrZW47IGluIGRpZXNlbSBGYWxsIGhhdCBkZXIgSGFrZW4gc2VsYnN0IGRpZSBQcm9wZXJ0aWVzIAorICAvLyBnZXNldHp0LgorICBTZXQoUF9GSVNILCBmdW5jdGlvbiBpbnQgKCkgeworICAgIG9iamVjdCBrb2VkZXIgPSBwcmVzZW50KFdVUk1fSUQsIE1FKTsKKyAgICByZXR1cm4gKG9iamVjdHAoa29lZGVyKT9rb2VkZXItPlF1ZXJ5UHJvcChQX0ZJU0gpOlF1ZXJ5KFBfRklTSCkpOworICB9LCBGX1FVRVJZX01FVEhPRCk7CisgIFNldChQX1dBVEVSLCBmdW5jdGlvbiBpbnQgKCkgeworICAgIG9iamVjdCBrb2VkZXIgPSBwcmVzZW50KFdVUk1fSUQsIE1FKTsKKyAgICByZXR1cm4gKG9iamVjdHAoa29lZGVyKT9rb2VkZXItPlF1ZXJ5UHJvcChQX1dBVEVSKTpRdWVyeShQX1dBVEVSKSk7CisgIH0sIEZfUVVFUllfTUVUSE9EKTsKKworICBTZXRQcm9wKFBfTUFURVJJQUwsKFtNQVRfU1RFRUw6MTAwXSkpOworCisgIEFkZENtZCgoeyJzcGllc3MiLCJzcGllc3NlIn0pLCJzcGllc3NhdWYiKTsKK30KKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlX3N1cGVyKCkgeworICBzZXRfbmV4dF9yZXNldCgtMSk7Cit9CisKK3N0YXRpYyBpbnQgc3BpZXNzYXVmKHN0cmluZyBzdHIpIHsKKyAgc3RyaW5nIGhha2VuLHd1cm1uYW1lLCpzdWJzdHI7CisgIG9iamVjdCB3dXJtOworICBpbnQgYW1vdW50OworCisgIG5vdGlmeV9mYWlsKCJXYXMgd2lsbHN0IER1IGRlbm4gYXVmc3BpZXNzZW4/XG4iKTsKKyAgaWYgKCFzdHJpbmdwKHN0cikgfHwgIXNpemVvZihzdHIpKSAKKyAgICByZXR1cm4gMDsKKyAgCisgIGlmKCBzc2NhbmYoc3RyLCAiJXMgYXVmJXMiLCB3dXJtbmFtZSwgaGFrZW4pICE9IDIgKQorICAgIHJldHVybiAwOworCisgIGhha2VuID0gdHJpbShoYWtlbik7CisKKyAgbm90aWZ5X2ZhaWwoIlNvIGV0d2FzIGhhc3QgRHUgbmljaHQgYmVpIERpci5cbiIpOworICBpZiAoICFvYmplY3RwKHd1cm09cHJlc2VudCh3dXJtbmFtZSxUUCkpICkKKyAgICByZXR1cm4gMDsKKworICBub3RpZnlfZmFpbCgiRGFzIGthbm5zdCBEdSBuaWNodCBhdWZzcGllc3Nlbi5cbiIpOworICBpZiggIXd1cm0tPmlkKFdVUk1fSUQpICkKKyAgICByZXR1cm4gMDsKKworICBub3RpZnlfZmFpbCgiV29yYXVmIHdpbGxzdCBEdSAiK3d1cm0tPm5hbWUoV0VOLDEpKyIgZGVubiBzcGllc3Nlbj9cbiIpOworICBpZiAoIGhha2VuIT0iIiAmJiAhaWQoaGFrZW4pICkKKyAgICByZXR1cm4gMDsKKworICBub3RpZnlfZmFpbChicmVha19zdHJpbmcoIkRhenUgc29sbHRlc3QgRHUgIituYW1lKFdFTiwxKSsiIGVyc3QgZWlubWFsICIKKyAgICAiYmVpIERpciBoYWJlbi4iLDc4KSk7CisgIGlmICggZW52aXJvbm1lbnQoTUUpICE9IFRQICkKKyAgICByZXR1cm4gMDsKKworICBub3RpZnlfZmFpbCgiQW4gZGVtIEhha2VuIGhhZW5ndCBzY2hvbiBlaW4gS29lZGVyLlxuIik7CisgIGlmICggUXVlcnlLb2VkZXIoKSApCisgICAgcmV0dXJuIDA7CisKKyAgLy8gSGFrZW4gdW5kIEtvZWRlciBzaW5kIGltIEludmVudGFyIHVuZCBmdWVobGVuIHNpY2ggdm9uIGRlciBTeW50YXgKKyAgLy8gYW5nZXNwcm9jaGVuLgorICBpZiggd3VybS0+SXNVbml0KCkgKSB7CisgICAgLy8gRGFzIFF1ZXJ5UHJvcCgpIGlzdCBuaWNodCB1bm5vZXRpZy4gQmVpIGRlciBBYmZyYWdlIHZvbiBVX1JFUSB3aXJkCisgICAgLy8gVV9SRVEgZ2VudWxsdCwgd2VubiBkYXMgYWt0dWVsbGUgcXVlcnlfdmVyYigpICE9IGRlbSBsZXR6dGVuIGlzdC4KKyAgICAvLyBCZWkgZGVyIGVyc3RlbiBBYmZyYWdlIHd1ZXJkZSBhbHNvIGRhcyBoaWVyIGdlc2V0enRlIFVfUkVRIHdpZWRlcgorICAgIC8vIGdlbG9lc2NodC4gRGFoZXIgbXVzcyBkYXMgamV0enQgaGllciBhbHMgZXJzdGVzIGVpbm1hbCBhYmdlZnJhZ3QKKyAgICAvLyB3ZXJkZW4uLi4KKyAgICB3dXJtLT5RdWVyeVByb3AoVV9SRVEpOworICAgIHd1cm0tPlNldFByb3AoVV9SRVEsMSk7CisgIH0KKyAgdGVsbF9vYmplY3QoVFAsIGJyZWFrX3N0cmluZygKKyAgICAiRHUgc3BpZXNzdCAiK3d1cm0tPm5hbWUoV0VOLDEpKyIgYXVmICIrbmFtZShXRU4sMSkrIi4iLDc4KSk7CisgIHRlbGxfcm9vbShlbnZpcm9ubWVudChUUCksIGJyZWFrX3N0cmluZygKKyAgICBUUC0+TmFtZShXRVIpKyIgc3BpZXNzdCAiK3d1cm0tPm5hbWUoV0VOKSsiIGF1ZiAiK25hbWUoV0VOKSsiLiIsNzgpLAorICAgICh7VFB9KSk7CisgIC8vIE1fR0VULCBkYW1pdCBhdWNoIFBfTk9EUk9QLUtvZWRlciBhdWZnZXNwaWVzc3Qgd2VyZGVuIGtvZW5uZW4uCisgIGlmICggd3VybS0+bW92ZShNRSxNX0dFVCkgIT0gTU9WRV9PSykgeworICAgIHRlbGxfb2JqZWN0KFRQLCBicmVha19zdHJpbmcoCisgICAgICAiVmVyZGFtbXQhIEpldHp0IGhhc3QgRHUgRGlyIGZhc3QgaW4gZGVuIEZpbmdlciBnZXN0b2NoZW4hICIrCisgICAgICB3dXJtLT5OYW1lKFdFTiwxKSsiIGhhc3QgRHUgZGFiZWkgbmF0dWVybGljaCB2ZXJmZWhsdC4iLCA3OCkpOworICB9CisgIHJldHVybiAxOworfQorCitpbnQgUXVlcnlLb2VkZXIoKXsgCisgIHJldHVybiBvYmplY3RwKHByZXNlbnQoV1VSTV9JRCwgTUUpKTsKK30KKworb2JqZWN0IFF1ZXJ5S29lZGVyT2JqZWN0KCkgeworICByZXR1cm4gcHJlc2VudChXVVJNX0lELE1FKTsKK30KKworaW50IE1heUFkZE9iamVjdChvYmplY3Qgb2IpIHsKKyAgcmV0dXJuIChvYmplY3RwKG9iKSAmJiBvYi0+aWQoV1VSTV9JRCkgJiYgc2l6ZW9mKGFsbF9pbnZlbnRvcnkoTUUpKTw9MSk7IAorfQorCitpbnQgX3F1ZXJ5X3RvdGFsX3dlaWdodCgpIHsKKyAgaW50IHR3OworICBmb3JlYWNoKGludCB3OiBhbGxfaW52ZW50b3J5KE1FKSsoe01FfSkpCisgICAgdHcgKz0gdy0+UXVlcnlQcm9wKFBfV0VJR0hUKTsKKyAgcmV0dXJuIHR3OworfQorCit2YXJhcmdzIGludCByZW1vdmUoaW50IHNpbCkgeworICBhbGxfaW52ZW50b3J5KE1FKS0+cmVtb3ZlKCk7IC8vIGZ1bmt0aW9uaWVydCBhdWNoIG1pdCBsZWVyZW4gQXJyYXlzCisgIHJldHVybiA6OnJlbW92ZShzaWwpOworfQorCitpbnQgS29lZGVyR2VmcmVzc2VuKCkgeworICAvLyBOaWNodCBRdWVyeUtvZWRlcigpIHBydWVmZW4sIGRhIGRhcyBiZWkgU3BlemlhbGhha2VuIGltbWVyIDEgaXN0LgorICBvYmplY3Qga29lZGVyID0gcHJlc2VudChXVVJNX0lELCBNRSk7CisgIGlmICggb2JqZWN0cChrb2VkZXIpICkKKyAgICByZXR1cm4ga29lZGVyLT5yZW1vdmUoKTsKKyAgcmV0dXJuIC0xOworfQpkaWZmIC0tZ2l0IGEvc3RkL2l0ZW1zL2Zpc2hpbmcva29lZGVyLmMgYi9zdGQvaXRlbXMvZmlzaGluZy9rb2VkZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjMzMTdiCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL2l0ZW1zL2Zpc2hpbmcva29lZGVyLmMKQEAgLTAsMCArMSwyOCBAQAorI3ByYWdtYSBzdHJvbmdfdHlwZXMsIHNhdmVfdHlwZXMsIHJ0dF9jaGVja3MKKyNwcmFnbWEgbm9fY2xvbmUsIG5vX3NoYWRvdworCitpbmhlcml0ICIvc3RkL3RoaW5nIjsKKworI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGl0ZW1zL2Zpc2hpbmcvZmlzaGluZy5oPgorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKXsKKyAgOjpjcmVhdGUoKTsKKyAgQWRkSWQoKHtXVVJNX0lELCJrb2VkZXIiLCAid3VybSIsInJlZ2Vud3VybSJ9KSk7CisgIFNldFByb3AoUF9OQU1FLCAiV3VybSIpOworICBTZXRQcm9wKFBfR0VOREVSICwgTUFMRSk7CisgIFNldFByb3AoUF9BUlRJQ0xFLCAxKTsKKyAgU2V0UHJvcChQX0ZJU0gsIDApOworICBTZXRQcm9wKFBfV0FURVIsIDApOworICBTZXRQcm9wKFBfU0hPUlQsICJFaW4ga2xlaW5lciBXdXJtIik7CisgIFNldFByb3AoUF9MT05HLCAiRWluIGtsZWluZXIgUmVnZW53dXJtLlxuIik7CisgIFNldFByb3AoUF9NQVRFUklBTCwgTUFUX01JU0NfTElWSU5HKTsKKyAgU2V0UHJvcChQX1ZBTFVFLCAxKTsKKyAgU2V0UHJvcChQX1dFSUdIVCwgNSk7Cit9CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZV9zdXBlcigpIHsKKyAgc2V0X25leHRfcmVzZXQoLTEpOworfQorCmRpZmYgLS1naXQgYS9zdGQvaXRlbXMvZmxhc2NoZS5jIGIvc3RkL2l0ZW1zL2ZsYXNjaGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzczNWZlCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL2l0ZW1zL2ZsYXNjaGUuYwpAQCAtMCwwICsxLDMzMyBAQAorLypPQkoqLworLyogMjAxMy1NYWktMjMsIEFyYXRob3JuCisgICBVbWZhc3NlbmQgdWViZXJhcmJlaXRldDsgc2V0dXAoKSwgaW5pdCgpIHVuZCBSZXBsYWNlV2Fzc2VyKCkgZW50c29yZ3QsCisgICBQX1dFSUdIVCB1bmQgUF9MT05HIGR5bmFtaXNjaCBnZWJhdXQsIHNvIGRhc3MgZGFzIHN0YWVuZGlnZSBVbXNldHplbgorICAgZGVyIFByb3BlcnRpZXMgbWl0dGVscyBzZXR1cCgpIG5hY2ggamVkZW0gRnVlbGxlbi9MZWVyZW4gZW50ZmFlbGx0LgorICovCisKKy8qIExldHp0ZSBBZW5kZXJ1bmc6IDQuNS4yMDA0LCBBcmF0aG9ybi4KKyAgIFplaWxlIDE0OTogY29udF9vYmotPnJlbW92ZSgpIGVpbmdlZnVlZ3QsIGRhbWl0IGRhcyBnZWNsb250ZSBPYmpla3QKKyAgIG5hY2ggZGVtIEFiZnJhZ2VuIHNlaW5lcyBOYW1lbnMgd2llZGVyIGVudGZlcm50IHdpcmQuCisgICBVcGRhdGUgNi42LjIwMDQsIEFyYXRob3JuLiBIYWJlIHVtIGVpbiBkZXN0cnVjdCgpIGVyZ2Flbnp0LCB3ZWlsIGRhcworICAgdHJvdHogcmVtb3ZlKCkgaGFydG5hZWNraWcgd2VpdGVyZ2VidWdndCBoYXQuICpmbHVjaCoKKyAqLworCisvKiBWZXJzaW9uIDEuMyBieSBGcmFnZ2xlICgxNy4xLjE5OTUpICovCisKKyAvLyBQcmV2ZW50SW5zZXJ0OiB2ZXJoaW5kZXJ0IEZ1ZWxsZW4gd2llIHN0ZC9jb250YWluZXIKKy8qIFZlcnNpb24gMS4yIGJ5IEZyYWdnbGUgKDE3LjEuMTk5NSkgKi8KKworIC8vIEZsYXNjaGUga2FubiBudW4gbWl0dGVscyBlbnZpcm9ubWVudChUUCktPkdldExpcXVpZCgpCisgLy8gZXR3YXMgYW5kZXJlcyBhbHMgV2Fzc2VyIGVudGhhbHRlbiwgc29mZXJuCisgLy8gZW52aXJvbm1lbnQoVFApLT5RdWVyeVByb3AoUF9XQVRFUik9PVdfT1RIRVIKKyAvLyBCVUc6IGF1Y2ggMWwgTWV0aGFuIHdpZWd0IDEgS2csIGFlbmRlcmUgaWNoIHNwYWV0ZXIKKworLyogVmVyc2lvbiAxLjEgYnkgRnJhZ2dsZSAoMTcuMS4xOTk1KSAqLworI3ByYWdtYSBzdHJvbmdfdHlwZXMscnR0X2NoZWNrcworI3ByYWdtYSBub19jbG9uZQorCitpbmhlcml0ICIvc3RkL3RoaW5nIjsKKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxpdGVtcy9mbGFzY2hlLmg+CisjaW5jbHVkZSA8aXRlbXMvZmlzaGluZy9maXNoaW5nLmg+CisKKyNkZWZpbmUgREVGQVVMVF9MSVEgIldhc3NlciIKKyNkZWZpbmUgVFAgdGhpc19wbGF5ZXIoKQorCitwcml2YXRlIHN0cmluZyBjb19maWxlbmFtZTsKK3B1YmxpYyBzdHJpbmcgbGlxdWlkX25hbWU9REVGQVVMVF9MSVE7CisKK3N0cmluZyBkeW5hbWljX2xvbmcoKTsKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkgeworICA6OmNyZWF0ZSgpOworCisgIEFkZElkKCh7Indhc3NlcmJlaGFlbHRlciIsImJlaGFlbHRlciIsIlxud2F0ZXJfc291cmNlIn0pKTsKKyAgU2V0UHJvcChQX05BTUUsICJXYXNzZXJiZWhhZWx0ZXIiKTsKKyAgU2V0UHJvcChQX0dFTkRFUiAsIE1BTEUpOworICBTZXRQcm9wKFBfQVJUSUNMRSwgMSk7CisgIFNldFByb3AoUF9TSE9SVCwgIkVpbiBTdGFuZGFyZC1XYXNzZXJiZWhhZWx0ZXIiKTsKKyAgU2V0UHJvcChQX0xPTkcsIm5vbmUiKTsKKyAgU2V0KFBfTE9ORywgIydkeW5hbWljX2xvbmcsIEZfUVVFUllfTUVUSE9EKTsKKyAgU2V0UHJvcChQX0xPTkdfRU1QVFksIiIpOyAvLyBCZXNjaHJlaWJ1bmcgZnVlciBsZWVyZW4gWnVzdGFuZAorICBTZXRQcm9wKFBfTE9OR19GVUxMLCIiKTsgIC8vIEJlc2NocmVpYnVuZyBmdWVyIGdlZnVlbGx0ZW4gWnVzYW5kCisgIFNldFByb3AoUF9MSVFVSUQsMTAwMCk7ICAgLy8gRnVlbGxtZW5nZSA9IDEgTGl0ZXIKKyAgU2V0UHJvcChQX1dBVEVSLDApOyAgICAgICAvLyBGbGFzY2hlIGlzdCBkZWZhdWx0bWFlc3NpZyBsZWVyIQorICBTZXRQcm9wKFBfVkFMVUUsMTApOworCisgIC8vIFBfV0VJR0hUIGF1ZiBMZWVyZ2V3aWNodCBkZXIgRmxhc2NoZSBzZXR6ZW4sIFF1ZXJ5TWV0aG9kZSBsaWVmZXJ0CisgIC8vIGRpZSBTdW1tZSBhdXMgTGVlcmdld2ljaHQrRnVlbGx1bmcgenVydWVjayAoRGljaHRlID0gMSkuCisgIFNldFByb3AoUF9XRUlHSFQsMjApOworICBTZXQoUF9XRUlHSFQsIGZ1bmN0aW9uIGludCAoKSB7CisgICAgIHJldHVybiAoIFF1ZXJ5KFBfV0VJR0hULEZfVkFMVUUpKworICAgICAgICAgICAgICAoUXVlcnlQcm9wKFBfV0FURVIpP1F1ZXJ5UHJvcChQX0xJUVVJRCk6MCkgKTsKKyAgICAgfSwgRl9RVUVSWV9NRVRIT0QpOworCisgIEFkZENtZCgoeyJmdWVsbCIsImZ1ZWxsZSJ9KSwiY21kX2Z1ZWxsZSIpOworICBBZGRDbWQoKHsibGVlcmUiLCAiZW50bGVlcmUifSksImNtZF9sZWVyZSIpOworfQorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGVfc3VwZXIoKSB7CisgIHNldF9uZXh0X3Jlc2V0KC0xKTsKK30KKworLy8gQmVoYWVsdGVyIGlzdCBnZWZ1ZWxsdCwgZGFubiBpc3QgZGllIExhbmdiZXNjaHJlaWJ1bmcgZW50d2VkZXIgZGllIAorLy8gUF9MT05HX0ZVTEwsIGZhbGxzIGFuZ2VnYmVuLCBvZGVyIGRpZSBQX0xPTkcgKyBCZXNjaHJlaWJ1bmcgZGVyIEZ1ZWxsdW5nLgorLy8gR2VuYXVzbywgd2VubiBzaWUgbGVlciBpc3QuCitzdHJpbmcgZHluYW1pY19sb25nKCkgeworICBzdHJpbmcgbD1RdWVyeShQX0xPTkcsRl9WQUxVRSk7CisgIGlmICggUXVlcnlQcm9wKFBfV0FURVIpICkgeworICAgIHN0cmluZyBsZiA9IFF1ZXJ5UHJvcChQX0xPTkdfRlVMTCk7CisgICAgaWYgKCBzdHJpbmdwKGxmKSAmJiBzaXplb2YobGYpICkKKyAgICAgIGw9bGY7CisgICAgZWxzZQorICAgICAgbCs9Y2FwaXRhbGl6ZShRdWVyeVByb25vdW4oV0VSKSkrIiBlbnRoYWVsdCAiK2xpcXVpZF9uYW1lKyIuXG4iOworICAgIC8vIEZhbGxzIGRpZSBGbGFzY2hlIG1pdCBldHdhcyBhbmRlcmVtIGFscyBXYXNzZXIgZ2VmdWVsbHQgd2lyZCwgZGllCisgICAgLy8gTGFuZ2Jlc2NocmVpYnVuZyBmdWVyICJ2b2xsZSBGbGFzY2hlIiAoUF9MT05HX0ZVTEwpIGFiZXIgbnVyIGZ1ZXIKKyAgICAvLyBXYXNzZXIgYXVzZ2VsZWd0IGlzdCwgd2lyZCAiV2Fzc2VyIiBkdXJjaCBkZW4gSW5oYWx0IHZvbiBsaXF1aWRfbmFtZQorICAgIC8vIGVyc2V0enQuCisgICAgaWYgKCBsaXF1aWRfbmFtZSAhPSBERUZBVUxUX0xJUSApCisgICAgICBsPXJlZ3JlcGxhY2UobCwgREVGQVVMVF9MSVEsIGxpcXVpZF9uYW1lLCAxKTsKKyAgfSBlbHNlIHsKKyAgICBzdHJpbmcgbGUgPSBRdWVyeVByb3AoUF9MT05HX0VNUFRZKTsKKyAgICBpZiAoIHN0cmluZ3AobGUpICYmIHNpemVvZihsZSkgKQorICAgICAgbD1sZTsKKyAgICBlbHNlCisgICAgICBsKz1jYXBpdGFsaXplKFF1ZXJ5UHJvbm91bihXRVIpKSsiIGlzdCBsZWVyLlxuIjsKKyAgfQorICByZXR1cm4gbDsKK30KKworLy8gWnVtIFVlYmVyc2NocmVpYmVuISBQcmV2ZW50SW5zZXJ0KG9iamVjdCBvYil7cmV0dXJuIDA7fSB6LkIuCisvLyBtYWNodCBkaWUgRmxhc2NoZSBnYXNkaWNodC4KKy8vIE9kZXIgbWFuIGthbm4gZGllIEZsYXNjaGUgdmVyc2NobGllc3NiYXIgbWFjaGVuLgoraW50IFByZXZlbnRJbnNlcnQob2JqZWN0IG9iaikKK3sKKyAgaWYob2JqLT5pZCgiZ2FzIikpIHsgLy9kZWZhdWx0OiBOSUNIVCBHYXNkaWNodCEKKyAgICB3cml0ZShvYmotPk5hbWUoV0VSLDEpKyIgZW50d2VpY2h0IHNvZm9ydCB3aWVkZXIhXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworLy8gVHJhbnNmZXJpZXJ0IGRlbiBJbmhhbHQgZGVyIEZsYXNjaGUgYW4gPGRlc3Q+Citwcm90ZWN0ZWQgaW50IHRyYW5zZmVyX3RvKG9iamVjdCBkZXN0KQoreworICBpbnQgd2F0ZXI9UXVlcnlQcm9wKFBfV0FURVIpOworICBpZiAoIXdhdGVyKQorICB7CisgICAgd3JpdGUoTmFtZShXRVIsMSkgKyAiIGlzdCBzY2hvbiBsZWVyIVxuIik7CisgICAgcmV0dXJuIDA7ICAgLy8gV2FyIHNjaG9uIGxlZXIhCisgIH0KKyAgaW50IGNvbnRlbnRzPVF1ZXJ5UHJvcChQX0xJUVVJRCk7CisKKyAgaWYgKCB3YXRlciZXX09USEVSICkKKyAgeworICAgIGRlc3QtPlB1dExpcXVpZChjb19maWxlbmFtZSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgZGVzdC0+QWRkV2F0ZXIoY29udGVudHMpOworICB9CisgIFNldFByb3AoUF9XQVRFUiwwKTsKKyAgUmVtb3ZlSWQobG93ZXJfY2FzZShsaXF1aWRfbmFtZSkpOworICBsaXF1aWRfbmFtZT1ERUZBVUxUX0xJUTsKKyAgcmV0dXJuIGNvbnRlbnRzOyAvL2dpYiBkaWUgbWwgYW4gVW1nZWJ1bmcgYWIgOikKK30KKworLy8gRW50bGVlcnQgZGllIEZsYXNjaGUgaW5zIEVudmlyb25tZW50IGRlciBGbGFzY2hlLCBhbGxlcmRpbmdzIG5pY2h0LCB3ZW5uCisvLyBkaWVzIGVpbiBMZWJld2VzZW4gaXN0LCBkYW5uIHdpcmQgZGFzIEVudmlyb25tZW50IHZvbiBkZW0gZ2Vub21tZW4uCisvLyBUT0RPOiBFaW5lIEZsYXNjaGUgaW4gZWluZW0gUGFrZXQgbGVlcmVuIHd1cmRlIGRhbm4gaW4gZGFzIHBha2V0IGVudGxlZXJlbi4KKy8vIERhcyB3YWVyZSBhbiBzaWNoIHNvZ2FyIHJpY2h0aWcuLi4gTnVyOiBnZXdvbGx0PyBBbHRlcm5hdGl2ZSBrb2VubmVuIHdpcgorLy8gYXVjaCBkYXMgYWV1c3NlcnN0ZSBFbnZpcm9ubWVudCBuZWhtZW4sIHdhcyBuaWNodCBsZWJ0LgorcHVibGljIGludCBlbXB0eSgpCit7CisgIGlmIChlbnZpcm9ubWVudCgpKQorICB7CisgICAgLy8gRW52aXJvbm1lbnQgZGVzIEJlbnV0emVycyBmaW5kZW4uCisgICAgb2JqZWN0IGVudiA9IGVudmlyb25tZW50KCk7CisgICAgd2hpbGUgKGxpdmluZyhlbnYpKQorICAgICAgZW52PWVudmlyb25tZW50KGVudik7CisgICAgcmV0dXJuIHRyYW5zZmVyX3RvKGVudik7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vIEZ1ZWxsdCBkaWUgRmxhc2NoZSBhdXMgPHNyYz4KK3Byb3RlY3RlZCBpbnQgZmlsbF9ib3R0bGUob2JqZWN0IHNyYykKK3sKKyAgaW50IGxpcXVpZHR5cGUgPSBzcmMtPlF1ZXJ5UHJvcChQX1dBVEVSKTsKKyAgaWYobGlxdWlkdHlwZSkKKyAgeworICAgIGlmKFF1ZXJ5UHJvcChQX1dBVEVSKSkgeworICAgICAgd3JpdGUoTmFtZShXRVIsMSkrIiBpc3QgYmVyZWl0cyB2b2xsIVxuIik7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgLy8gV2Fzc2VyIHZvbiBVbWdlYnVuZyBhYnppZWhlbiEKKyAgICAvLyBNYW4ga2FubiBhbHMgTWFnaWVyIGRpZSBGdW5rdGlvbiBBZGRXYXRlcihpbnQgbikgZGF6dSBiZW51ZXR6dGVuLAorICAgIC8vIGJlaXNwaWVsc3dlaXNlIGVpbmUgUGZ1ZXR6ZSB6dSBsZWVyZW4sIC4uLgorICAgIHNyYy0+QWRkV2F0ZXIoLVF1ZXJ5UHJvcChQX0xJUVVJRCkpOworICAgIG9iamVjdCBjb250X29iajsKKyAgICBpZihsaXF1aWR0eXBlJldfT1RIRVIpCisgICAgeworICAgICAgLy8gTWl0dGVscyBHZXRMaXF1aWQoKSBrYW5uIGRpZSBGbGFzY2hlIG1pdCB3YXMgYW5kZXJlbSBhbHMgV2Fzc2VyCisgICAgICAvLyBnZWZ1ZWxsdCB3ZXJkZW4uCisgICAgICBjb19maWxlbmFtZT1zcmMtPkdldExpcXVpZCgpOworICAgICAgaWYgKGNvX2ZpbGVuYW1lKQorICAgICAgeworICAgICAgICBjb250X29iaj1jbG9uZV9vYmplY3QoY29fZmlsZW5hbWUpOworICAgICAgICBpZihQcmV2ZW50SW5zZXJ0KGNvbnRfb2JqKSkKKyAgICAgICAgeworICAgICAgICAgIC8vIEhpZXIgcGFzc2llcnQgZWlnZW50bGljaCBkYXMgZ2xlaWNoZSB3aWUgbmFjaCBkZW0gaWZibG9jaywgYWJlcgorICAgICAgICAgIC8vIGF1Y2ggbm9jaCBGdW5rdGlvbiBiZWVuZGVuLgorICAgICAgICAgIC8vIFRPRE86IFJ1ZWNrZ2FlbmlnIG1hY2hlbiB2b24gQWRkV2F0ZXIoKT8KKyAgICAgICAgICAvLyBUT0RPOiBEaWUgTWVsZHVuZyBhdXMgZGVtIFByZXZlbnRJbnNlcnQoKSBtdWVzc3RlIGVpZ2VudGxpY2gKKyAgICAgICAgICAvLyBfdm9yaGVyXyBub2NoIG1pdCBlaW5lciBCZWZ1ZWxsbWVsZHVuZyBiZWdsZWl0ZXQgd2VyZGVuLgorICAgICAgICAgIGNvbnRfb2JqLT5yZW1vdmUoMSk7CisgICAgICAgICAgaWYgKCBvYmplY3RwKGNvbnRfb2JqKSApCisgICAgICAgICAgICBjb250X29iai0+bW92ZSgiL3Jvb20vbXVlbGxyYXVtIixNX1BVVCk7CisgICAgICAgICAgY29udF9vYmo9MDsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgbGlxdWlkX25hbWU9Y29udF9vYmotPm5hbWUoV0VOKTsKKyAgICAgICAgLy8gSW4gamVkZW0gRmFsbCB3aXJkIGRhcyBPYmpla3Qgd2llZGVyIHplcnN0b2VydCAtIGVzIHd1cmRlIG51ciBmdWVyCisgICAgICAgIC8vIGRhcyBFcm1pdHRlbG4gZGVzIGxpcXVpZF9uYW1lIGJlbnV0enQuLi4gV2VpYS4KKyAgICAgICAgaWYgKCBjb250X29iaiApIGNvbnRfb2JqLT5yZW1vdmUoKTsKKyAgICAgICAgaWYgKCBjb250X29iaiApIGNvbnRfb2JqLT5tb3ZlKCIvcm9vbS9tdWVsbHJhdW0iLE1fUFVUKTsKKyAgICAgIH0KKyAgICB9CisgICAgU2V0UHJvcChQX1dBVEVSLGxpcXVpZHR5cGUpOworICAgIEFkZElkKGxvd2VyX2Nhc2UobGlxdWlkX25hbWUpKTsKKyAgICAvL3dpZSBwcmFrdGlzY2gsIDEgbWwgPT0gMSBnIDopIC8vIEFiZXIgbnVyIGZ1ZXIgV2Fzc2VyLCBkdSBWT0dFTCEgOi18CisgICAgcmV0dXJuIDE7CisgIH0KKyAgZWxzZSB7CisgICAgd3JpdGUoIkR1IGZpbmRlc3QgaGllciBuaWNodHMsIHdhcyBEdSBpbiAiK25hbWUoV0VOLDEpKworICAgICAgIiBmdWVsbGVuIGtvZW5udGVzdCFcbiIpOworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNtZF9sZWVyZShzdHJpbmcgc3RyKQoreworICBvYmplY3QgZGVzdDsKKyAgbm90aWZ5X2ZhaWwoIldhcyB3aWxsc3QgRHUgZGVubiAod28gaGluZWluKSBsZWVyZW4/XG4iKTsKKyAgaWYgKCFzdHIpCisgICAgcmV0dXJuIDA7CisKKyAgc3RyaW5nIHN0cmJvdHRsZSxzdHJvYmo7CisgIC8vIGxlZXJlIGZsYXNjaGUKKyAgaWYgKGlkKHN0cikpCisgIHsKKyAgICAvL05PT1AKKyAgfQorICAvLyBsZWVyZSBmbGFzY2hlIGluIHh4eAorICBlbHNlIGlmIChzc2NhbmYoc3RyLCIlcyBpbiAlcyIsc3RyYm90dGxlLHN0cm9iaik9PTIpCisgIHsKKyAgICBpZiAoIWlkKHN0cmJvdHRsZSkpCisgICAgICByZXR1cm4gMDsKKyAgICBkZXN0ID0gcHJlc2VudChzdHJvYmosIGVudmlyb25tZW50KHRoaXNfcGxheWVyKCkpKQorICAgICAgICAgICB8fCBwcmVzZW50KHN0cm9iaiwgdGhpc19wbGF5ZXIoKSk7CisgICAgaWYgKCFkZXN0KQorICAgICAgcmV0dXJuIDA7CisgIH0KKyAgZWxzZQorICAgIHJldHVybiAwOworICAvLyBTeW50YXhwcnVlZnVuZyBmZXJ0aWcuCisKKyAgaWYoIVF1ZXJ5UHJvcChQX1dBVEVSKSkKKyAgeworICAgIHdyaXRlKCJEYSBpc3Qga2VpbiAiK2xpcXVpZF9uYW1lKyIgZHJpbiFcbiIpOworICAgIHJldHVybiAxOworICB9CisKKyAgaWYgKGRlc3QpCisgIHsKKyAgICB3cml0ZShicmVha19zdHJpbmcoIkR1IGxlZXJzdCAiK25hbWUoV0VOLDEpKyAiIGluICIKKyAgICAgICAgICArIGRlc3QtPm5hbWUoV0VOKSArICIuIiw3OCkpOworICAgIHNheShicmVha19zdHJpbmcoVFAtPm5hbWUoKSsiIGxlZXJ0ICIrbmFtZShXRU4sMCkKKyAgICAgICAgICArICIgaW4gIiArIGRlc3QtPm5hbWUoV0VOKSArICIuIiw3OCksVFApOworICAgIHRyYW5zZmVyX3RvKGRlc3QpOworICAgIHJldHVybiAxOworICB9CisgIHdyaXRlKGJyZWFrX3N0cmluZygiRHUgbGVlcnN0ICIrbmFtZShXRU4sMSkrIi4iLDc4KSk7CisgIHNheShicmVha19zdHJpbmcoVFAtPm5hbWUoKSsiIGxlZXJ0ICIrbmFtZShXRU4sMCkrIi4iLDc4KSxUUCk7CisgIGVtcHR5KCk7CisgIHJldHVybiAxOworfQorCitwdWJsaWMgaW50IGNtZF9mdWVsbGUoc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIHN0cmJvdHRsZSxzdHJvYmo7CisKKyAgbm90aWZ5X2ZhaWwoIldhcyB3aWxsc3QgRHUgZGVubiAod29taXQpIGZ1ZWxsZW4/XG4iKTsKKyAgaWYoIXN0cikKKyAgICByZXR1cm4gMDsKKworICAvLyBmdWVsbGUgZmxhc2NoZQorICBpZiAoaWQoc3RyKSkKKyAgeworICAgIGlmIChmaWxsX2JvdHRsZShlbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKSkpCisgICAgeworICAgICAgd3JpdGUoYnJlYWtfc3RyaW5nKCJEdSBmdWVsbHN0IGV0d2FzICIrbGlxdWlkX25hbWUrIiBpbiAiCisgICAgICAgICAgICArbmFtZShXRU4sMSkrIi4iLDc4KSk7CisgICAgICBzYXkoYnJlYWtfc3RyaW5nKFRQLT5OYW1lKFdFUikrIiBmdWVsbHQgZXR3YXMgIgorICAgICAgICAgICAgK2xpcXVpZF9uYW1lKyIgaW4gIituYW1lKFdFTikrIi4iLDc4KSwgVFApOworICAgIH0KKyAgICByZXR1cm4gMTsKKyAgfQorICAvLyBmdWVsbGUgZmxhc2NoZSBhdXMgeHh4CisgIC8vIGZ1ZWxsZSBmbGFzY2hlIG1pdCB4eHgKKyAgLy8gZnVlbGxlIHh4eCBpbiBmbGFzY2hlCisgIC8vIGZ1ZWxsZSBmbGFzY2hlIGluIHh4eAorICAvLyBmdWVsbGUgeHh4IGF1cyBmbGFzY2hlCisgIC8vIGZ1ZWxsZSB4eHggbWl0IGZsYXNjaGUKKyAgZWxzZSBpZiAoc3NjYW5mKHN0ciwiJXMgaW4gJXMiLHN0cm9iaixzdHJib3R0bGUpPT0yCisgICAgICAgICAgIHx8IHNzY2FuZihzdHIsIiVzIG1pdCAlcyIsc3RyYm90dGxlLHN0cm9iaik9PTIKKyAgICAgICAgICAgfHwgc3NjYW5mKHN0ciwiJXMgYXVzICVzIixzdHJib3R0bGUsc3Ryb2JqKT09MikKKyAgeworICAgIG9iamVjdCBvYmo7CisgICAgLy8gRmxhc2NoZSBiZWZ1ZWxsZW4/CisgICAgaWYgKGlkKHN0cmJvdHRsZSkKKyAgICAgICAgJiYgKCBvYmo9cHJlc2VudChzdHJvYmosIGVudmlyb25tZW50KHRoaXNfcGxheWVyKCkpKSAKKyAgICAgICAgICAgICAgICAgfHwgcHJlc2VudChzdHJvYmosIHRoaXNfcGxheWVyKCkpICkKKyAgICAgICApCisgICAgeworICAgICAgaWYgKGZpbGxfYm90dGxlKG9iaikpCisgICAgICB7CisgICAgICAgIHdyaXRlKGJyZWFrX3N0cmluZygKKyAgICAgICAgICAgICAgIkR1IGZ1ZWxsc3QgZXR3YXMgIitsaXF1aWRfbmFtZSsiIGF1cyAiICsgb2JqLT5uYW1lKFdFTSwxKSAKKyAgICAgICAgICAgICAgKyAiIGluICIrbmFtZShXRU4sMSkrIi4iLDc4KSk7CisgICAgICAgIHNheShicmVha19zdHJpbmcoVFAtPk5hbWUoV0VSKSsiIGZ1ZWxsdCBldHdhcyAiK2xpcXVpZF9uYW1lKyAiIGF1cyAiIAorICAgICAgICAgICAgICArIG9iai0+bmFtZShXRU0sMSkgKyAiIGluICIrbmFtZShXRU4pKyIuIiw3OCksIFRQKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICAvLyBhbmRlcmVzIEdlZmFlc3MgYmVmdWVsbGVuPworICAgIGVsc2UgaWYgKGlkKHN0cm9iaikKKyAgICAgICAgJiYgKCBvYmo9cHJlc2VudChzdHJib3R0bGUsIGVudmlyb25tZW50KHRoaXNfcGxheWVyKCkpKSAKKyAgICAgICAgICAgICAgICAgfHwgcHJlc2VudChzdHJib3R0bGUsIHRoaXNfcGxheWVyKCkpICkKKyAgICAgICApCisgICAgeworICAgICAgaWYgKHRyYW5zZmVyX3RvKG9iaikpCisgICAgICB7CisgICAgICAgIHdyaXRlKGJyZWFrX3N0cmluZygKKyAgICAgICAgICAgICAgIkR1IGZ1ZWxsc3QgZXR3YXMgIitsaXF1aWRfbmFtZSsiIGF1cyAiICsgbmFtZShXRU0sMSkKKyAgICAgICAgICAgICAgKyAiIGluICIrb2JqLT5uYW1lKFdFTiwxKSsiLiIsNzgpKTsKKyAgICAgICAgc2F5KGJyZWFrX3N0cmluZyhUUC0+TmFtZShXRVIpKyIgZnVlbGx0IGV0d2FzICIrbGlxdWlkX25hbWUrICIgYXVzICIgCisgICAgICAgICAgICAgICsgbmFtZShXRU0sMSkgKyAiIGluICIrb2JqLT5uYW1lKFdFTikrIi4iLDc4KSwgVFApOworICAgICAgfQorICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisgIC8vIFN5bnRheCBwYXNzdCBuaWNodC4KKyAgcmV0dXJuIDA7Cit9CisKK2ludCBJc0JvdHRsZSgpIHsKKyAgIHJldHVybiAxOworfQorCmRpZmYgLS1naXQgYS9zdGQvaXRlbXMva3JhZXV0ZXIva3JhdXQuYyBiL3N0ZC9pdGVtcy9rcmFldXRlci9rcmF1dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZTUwNDUKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvaXRlbXMva3JhZXV0ZXIva3JhdXQuYwpAQCAtMCwwICsxLDE5NSBAQAorLy8gKGMpIFNlcHRlbWJlciAyMDAwIGJ5IFBhZHJlaWMgKFBhZHJlaWNAbWcubXVkLmRlKQorCisjcHJhZ21hIHN0cm9uZ190eXBlcywgc2F2ZV90eXBlcywgcnR0X2NoZWNrcworCitpbmhlcml0ICIvc3RkL3RoaW5nIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxpdGVtcy9rcmFldXRlci9rcmFldXRlci5oPgorCisjZGVmaW5lIFBMQU5UX0xJRkVUSU1FICAoMjQqMzYwMCkKKyNkZWZpbmUgRlJFU0hfVElNRSAgICAgICg2KjM2MDApCisvLyBEaWUgcGxhbnRJRCB3aXJkIGZ1ZXIgdW5ndWVsdGlnIGVyc2NoYWZmZW5lIEtyYWV1dGVyIGF1ZiAtMSBnZXNldHp0LgorI2RlZmluZSBEUklFRF9QTEFOVCAgICAgLTEKKworcHJpdmF0ZSBpbnQgYWdlPXRpbWUoKTsKKy8vIGVudGhhZWx0IGRpZSBOdW1tZXIgZGVzIEtyYXV0cworcHJpdmF0ZSBpbnQgcGxhbnRJZDsKKy8vIGVudGhhZWx0IGRlbiBQZmFkIGRlcyBjbG9uZW5kZW4gT2JqZWt0cworcHJpdmF0ZSBzdHJpbmcgY2xvbmVyOworLy8gUXVhbGl0YWV0IGRlcyBLcmF1dGVzLgorcHJpdmF0ZSBpbnQgcXVhbGl0eT0xMDA7CisKKy8vIEZpbGUga2FubiBlaW4gbmFtZSBzZWluLCBkZXNzZW4gRWlnZW5zY2hhZnRlbiBkZXIgVkMga29uZmlndXJpZXJlbiBzZWluCisvLyBvZGVyIDAsIHdlbm4gZXIgc2VsYmVyIGVybWl0dGVsbiBzb2xsLCB3YXMgZnVlciBlaW4gRmlsZSBlciBnZXJhZGUgZXJ6ZXVndAorLy8gaGF0LgorLy8gU3ByaWNoOiByZWFsIGV4aXN0aWVyZW5kZSBGaWxlcyBhdWYgZGVyIFBsYXR0ZSBtdWVzc2VuIGRhIGlocmVuIE5hbWVuCisvLyBhbmdlYmVuLCBTdGFuZGFyZGZhbGwgaXN0IGFiZXIsIGRhc3MgbWFuIDAgYW5naWJ0IHVuZCBkZXIgVkMgd2Vpc3MsIHdhcyBlcgorLy8gZ2VyYWRlIGVyemV1Z3QgaGF0Lgordm9pZCBjdXN0b21pemVNZShzdHJpbmcgZmlsZSkKK3sKKyAgaWYgKHN0cmluZ3AoZmlsZSkpIAorICAgIGZpbGU9ZXhwbG9kZShmaWxlLCAiLyIpWzwxXTsKKyAgS1JBRVVURVJWQy0+Q3VzdG9taXplT2JqZWN0KGZpbGUpOworfQorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICBpZiAob2JqZWN0X25hbWUodGhpc19vYmplY3QoKSkgPT0gX19GSUxFX19bMC4uPDNdKQorICB7CisgICAgc2V0X25leHRfcmVzZXQoLTEpOworICAgIHJldHVybjsKKyAgfQorICA6OmNyZWF0ZSgpOworIAorICBTZXQoUF9RVUFMSVRZLCBmdW5jdGlvbiBpbnQgKCkgeyByZXR1cm4gcXVhbGl0eTsgfSwgRl9RVUVSWV9NRVRIT0QpOworICBTZXRQcm9wKFBfV0VJR0hULCAxMjApOworICBTZXRQcm9wKFBfVkFMVUUsIDcwKTsKKyAgU2V0UHJvcChQX01BVEVSSUFMLCBNQVRfTUlTQ19QTEFOVCk7Cit9CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZV9zdXBlcigpCit7CisgIHNldF9uZXh0X3Jlc2V0KC0xKTsKK30KKworcHVibGljIHN0cmluZyBzaG9ydCgpCit7CisgIHN0cmluZyBzdHI9UXVlcnlQcm9wKFBfU0hPUlQpOworICBpZiAoIXN0cmluZ3Aoc3RyKSkgCisgICAgICByZXR1cm4gMDsKKyAgaWYgKHBsYW50SWQ9PS0xKQorICAgICAgcmV0dXJuIHN0cisiICh1bndpcmtzYW0pLlxuIjsKKyAgZWxzZSBpZiAoYWdlPT1EUklFRF9QTEFOVCkKKyAgICAgcmV0dXJuIHN0cisiIChnZXRyb2NrbmV0KS5cbiI7CisgIGVsc2UgaWYgKGFnZStGUkVTSF9USU1FK1BMQU5UX0xJRkVUSU1FPHRpbWUoKSkKKyAgICAgcmV0dXJuIHN0cisiICh2ZXJmYXVsdCkuXG4iOworICByZXR1cm4gc3RyKyIuXG4iOworfQorCisvLyBMaWVmZXJ0IGVpbmVuIFNrYWxpZXJ1bmdzZmFrdG9yIHp1cnVlY2ssIGRlciBtaXQgZGVtIGFrdHVlbGxlbiBXZXJ0IHZvbgorLy8gUF9RVUFMSVRZIHZlcnJlY2huZXQgd2lyZC4gUnVlY2tnYWJld2VydGU6CisvLyBQZmxhbnplIGdldHJvY2tuZXQgb2RlciBuaWNodCBhZWx0ZXIgYWxzIDYgaCA6IDEwMAorLy8gUGZsYW56ZSBhZWx0ZXIgYWxzIDYsIGFiZXIganVlbmdlciBhbHMgMzAgaCA6IDk5Li4uMQorLy8gUGZsYW56ZSBhZWx0ZXIgYWxzIDMwIGg6IDAuCisvLyBEcnlQbGFudCgpIHplcnN0b2VydCBkYXMgS3JhdXQsIHdlbm4gUF9RVUFMSVRZIHVudGVyIDEgZmFlbGx0LgorcHVibGljIGludCBQbGFudFF1YWxpdHkoKQoreworICBpbnQgZmFjdG9yOworICAvLyBzY2hvbiBnZXRyb2NrbmV0IG9kZXIgbmljaHQgYWVsdGVyIGFscyA2IGg/IAorICAvLyBEYW5uIGtlaW5lIHdlaXRlcmUgUmVkdWt0aW9uLgorICBpZiAoIGFnZSA9PSBEUklFRF9QTEFOVCB8fCBhZ2UrRlJFU0hfVElNRSA+IHRpbWUoKSkgCisgICAgZmFjdG9yID0gMTAwOworICAvLyA+MzAgU3R1bmRlbiBuYWNoIGRlbSBQZmx1ZWNrZW4gaXN0IGRhcyBLcmF1dCB2ZXJzY2hpbW1lbHQuCisgIGVsc2UgaWYgKCBhZ2UgKyBGUkVTSF9USU1FICsgUExBTlRfTElGRVRJTUUgPCB0aW1lKCkgKSAKKyAgICBmYWN0b3IgPSAxOworICAvLyBaZWl0IHp3aXNjaGVuIDYgdW5kIDMwIFN0dW5kZW4gbmFjaCBkZW0gUGZsdWVja2VuIGluIDk5IGdsZWljaG1hZXNzaWdlCisgIC8vIEFic2Nobml0dGUgdW50ZXJ0ZWlsZW4uIDI0IGggc2luZCA4NjQwMCBzLCA4NjQwMC85OSA9IDg3My4KKyAgZWxzZQorICAgIGZhY3Rvcj0odGltZSgpLWFnZS1GUkVTSF9USU1FKS84NzM7CisKKyAgcmV0dXJuIFF1ZXJ5UHJvcChQX1FVQUxJVFkpKmZhY3Rvci8xMDA7Cit9CisKKy8vIFdpZSBsYW5nZSAoaW4gU2VrdW5kZW4pIGlzdCBkYXMgS3JhdXQgbm9jaCBoYWx0YmFyPworcHVibGljIGludCBUaW1lVG9MaXZlKCkKK3sKKyAgaWYgKCBhZ2UgPT0gRFJJRURfUExBTlQgKQorICAgIHJldHVybiBfX0lOVF9NQVhfXzsKKyAgcmV0dXJuIGFnZS10aW1lKCkrUExBTlRfTElGRVRJTUU7Cit9CisKKy8vVE9ETzogdmllbGxlaWNodCBldHdhcyB6dWZhbGw/IFNvbnN0IEtyYWV1dGVycXVhbGl0YWV0IGhpZXJhbiBlcm1pdHRlbGJhci4KK3N0YXRpYyBpbnQgX3F1ZXJ5X3ZhbHVlKCkKK3sKKyAgaW50IHZhbCA9IFF1ZXJ5KFBfVkFMVUUsRl9WQUxVRSkqUGxhbnRRdWFsaXR5KCkvMTAwOworICBpZiAocGxhbnRJZDw9MCB8fCB2YWwgPSAwKQorICAgIHJldHVybiAwOworICByZXR1cm4gdmFsLXZhbCUxMDsKK30KKworc3RhdGljIHN0cmluZyBfcXVlcnlfbm9zZWxsKCkgCit7CisgIGlmIChhZ2UgIT0gRFJJRURfUExBTlQpCisgICAgcmV0dXJuICJNaXQgdW5nZXRyb2NrbmV0ZW4gS3JhZXV0ZXJuIGhhbmRlbGUgaWNoIG5pY2h0LiBEaWUgdmVyZGVyYmVuICIKKyAgICAgICJpbW1lciBzbyBzY2huZWxsIGltIExhZ2VyLCB1bmQgZGFubiB3ZXJkZSBpY2ggc2llIG5pY2h0IHdpZWRlciBsb3MuIjsKKyAgcmV0dXJuIDA7Cit9CisKKy8vIE1pdCBEcnlQbGFudCgpIHdpcmQgZGllIFBmbGFuemUgZ2V0cm9ja25ldC4gQWxzIEFyZ3VtZW50IHdpcmQgZGVyIFByb3plbnQtCisvLyB3ZXJ0IHVlYmVyZ2ViZW4sIGF1ZiBkZW4gZGllIFF1YWxpdGFldCBzaW5rZW4gc29sbC4gQWxzIEF1c2dhbmdzd2VydAorLy8gZGllc2VyIEJlcmVjaG51bmcgd2lyZCBkZXIgUnVlY2tnYWJld2VydCB2b24gUGxhbnRRdWFsaXR5KCkgdmVyd2VuZGV0LgorLy8gSGludGVyZ3J1bmQ6IERpZSBRdWFsaXRhZXQgZGVzIEtyYXV0cyBzaW5rdCBpbSB1bmdldHJvY2tuZXRlbiBadXN0YW5kCisvLyB1ZWJlciBlaW5lbiBaZWl0cmF1bSB2b24gMjQgaCBrb250aW51aWVybGljaCB2b24gMTAwIGF1ZiAxIGFiLCBzb2JhbGQKKy8vIGVzIGFlbHRlciBhbHMgNiBTdHVuZGVuIGlzdC4gRGFuYWNoIGlzdCBlcyB2ZXJzY2hpbW1lbHQsIHdhcyBhYmVyIHNlaW5lcgorLy8gdmVyYmxlaWJlbmRlbiAiV2lya3VuZyIga2VpbmVuIEFiYnJ1Y2ggdHV0LgorLy8gRXMgd2lyZCBkaWUgenVtIFplaXRwdW5rdCBkZXMgVHJvY2tudW5nc3ZvcmdhbmdlcyBndWVsdGlnZSBRdWFsaXRhZXQKKy8vIGFsc28gc296dXNhZ2VuICJlaW5nZWZyb3JlbiIgdW5kIGVudHNwcmVjaGVuZCBkZW0gUnVlY2tnYWJld2VydCB2b24KKy8vIFBsYW50UXVhbGl0eSgpIGhlcnVudGVyZ2VyZWNobmV0LgorCisvLyBEaWVzZSBGdW5rdGlvbiBrYW5uIG5hdHVlcmxpY2ggYXVjaCB1ZWJlcnNjaHJpZWJlbiB3ZXJkZW4sIHdlbm4gYmVzdGltbXRlCisvLyBLcmFldXRlciBlcnN0IGR1cmNoIHRyb2NrbmVuIGluIGRlciBRdWFsaXRhZXQgc3RlaWdlbi4KKworLy8gVE9ETzogSXN0IGRhcyBBcmd1bWVudCAicXVhbCIgZGFiZWkgcHJvemVudHVhbCBhdWZ6dWZhc3Nlbiwgb2RlciAKKy8vIHNvbGwgbnVyIGVpbiBub2NoIHp1IGJlc3RpbW1lbmRlciBGZXN0d2VydCBhYmdlem9nZW4gd2VyZGVuPworLy8gQXJhdGhvcm46IEVzIGJsZWlidCBqZXR6dCBlcnN0bWFsIHByb3plbnR1YWwuCisKKyNkZWZpbmUgRFJZSU5HX0FMTE9XRUQgKHtQTEFOVE1BU1RFUiwgIi9pdGVtcy9rcmFldXRlci90cm9ja25lciJ9KQorCitwdWJsaWMgdm9pZCBEcnlQbGFudChpbnQgcXVhbCkgCit7CisgIC8vIEtlaW5lIG1laHJmYWNoZSBUcm9ja251bmcgenVsYXNzZW4uCisgIGlmICggYWdlID09IERSSUVEX1BMQU5UICkKKyAgICByZXR1cm47CisgCisgIC8vIE51ciBiZXN0aW1tdGUgT2JqZWt0ZSBkdWVyZmVuIFRyb2NrbnVuZ2VuIGF1c2xvZXNlbi4KKyAgaWYgKCBtZW1iZXIoRFJZSU5HX0FMTE9XRUQsIGxvYWRfbmFtZShwcmV2aW91c19vYmplY3QoKSkpID09IC0xICkKKyAgICByZXR1cm47CisKKyAgLy8gUXVhbGl0YWV0IGF1ZiAxMDAgZGVja2Vsbi4KKyAgaWYgKCBxdWFsPjEwMCApCisgICAgcXVhbCA9IDEwMDsKKyAgCisgIC8vIFF1YWxpdGFldCBtaXR0ZWxzIFBsYW50UXVhbGl0eSgpIHJ1bnRlcnNrYWxpZXJlbi4KKyAgcXVhbCA9IFBsYW50UXVhbGl0eSgpKnF1YWwvMTAwOworICAKKyAgaWYgKCBxdWFsIDwgMSApIHsKKyAgICBpZihvYmplY3RwKHRoaXNfcGxheWVyKCkpKQorICAgICAgdGVsbF9vYmplY3QodGhpc19wbGF5ZXIoKSwgCisgICAgICAgIE5hbWUoV0VSLDEpKyIgemVyZmFlbGx0IGluIHVuemFlaGxpZ2UgZmVpbmUgS3J1ZW1lbC5cbiIpOworICAgIHJlbW92ZSgpOworICAgIHJldHVybjsKKyAgfQorICAvLyBLcmF1dCBhbHMgZ2V0cm9ja25ldCBrZW5uemVpY2huZW4uCisgIGFnZT1EUklFRF9QTEFOVDsKKyAgcXVhbGl0eSA9IHF1YWw7Cit9CisKKy8qIEZ1bmt0aW9uZW4genVtIEluaXRpYWxpc2llcmVuIGRlciBQZmxhbnplICovCisvLyBEZXIgS3JhZXV0ZXJtYXN0ZXIgcHJ1ZWZ0IGRlbiBDbG9uZSBhdWYgR3VlbHRpZ2tlaXQuIEVpbmUgZWlubWFsIGdlc2V0enRlCisvLyBJRCBrYW5uIGF1ZiBkaWVzZW0gV2VnIG5pY2h0IG1laHIgZ2VhZW5kZXJ0IHdlcmRlbi4KK25vbWFzayBpbnQgU2V0UGxhbnRJZChpbnQgbmV3X2lkKQoreworICBpZiAocGxhbnRJZCAhPSAwKQorICAgIHJldHVybiAtMTsKKyAgY2xvbmVyPTA7CisgIGFnZT10aW1lKCk7CisgIGlmIChjYXRjaChjbG9uZXI9Y2FsbF9vdGhlcihQTEFOVE1BU1RFUiwgIkNoZWNrUGxhbnQiLCBuZXdfaWQpKSB8fCAhY2xvbmVyKQorICAgIG5ld19pZCA9IC0xOworICByZXR1cm4gKHBsYW50SWQ9bmV3X2lkKTsKK30KKworbm9tYXNrIGludCBRdWVyeVBsYW50SWQoKQoreworICByZXR1cm4gcGxhbnRJZDsKK30KKworbm9tYXNrIHN0cmluZyBRdWVyeUNsb25lcigpCit7CisgIHJldHVybiBjbG9uZXI7Cit9CisKK25vbWFzayBpbnQgUXVlcnlEcmllZCgpIAoreworICByZXR1cm4gKGFnZSA9PSBEUklFRF9QTEFOVCk7Cit9CmRpZmYgLS1naXQgYS9zdGQvaXRlbXMva3JhZXV0ZXIvdHJhbmsuYyBiL3N0ZC9pdGVtcy9rcmFldXRlci90cmFuay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYzBlZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvaXRlbXMva3JhZXV0ZXIvdHJhbmsuYwpAQCAtMCwwICsxLDExNDcgQEAKKy8vVE9ETzoKKworI3ByYWdtYSBzdHJvbmdfdHlwZXMscnR0X2NoZWNrcworCitpbmhlcml0ICIvc3RkL3RoaW5nIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8aXRlbXMva3JhZXV0ZXIva3JhZXV0ZXIuaD4KKyNpbmNsdWRlIDxpdGVtcy9rcmFldXRlci90cmFua2F0dHJpYnV0ZS5oPgorI2luY2x1ZGUgPGhvb2suaD4KKyNpbmNsdWRlIDxjbGFzcy5oPgorI2luY2x1ZGUgPG5ld19za2lsbHMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKworI2lmbmRlZiBCUworIyAgZGVmaW5lIEJTKHgpICAgICAgICAgICAgIGJyZWFrX3N0cmluZyh4LCA3OCkKKyNlbmRpZgorCisjZGVmaW5lIGFsbG93ZWQoeCkgKG9iamVjdF9uYW1lKHgpPT1QTEFOVE1BU1RFUikKKyNkZWZpbmUgRFJJTktfUE9USU9OICJsaWJfa3JhZXV0ZXJ0cmFua190cmlua2VuIgorLy8gZm9yIGRlYnVnCisjZGVmaW5lIHByaXZhdGUgcHVibGljCisKKy8vIEFibGF1ZnplaXQgZGVzIFRyYW5rcywgYWIgZGFubiBrZWluZSBXaXJrdW5nIG1laHIKK3ByaXZhdGUgbm9zYXZlIGludCBleHBpcnk7CisvLyBBYmxhdWZ6ZWl0IGRlciB3aXJrdW5nZW4gZGVzIFRyYW5rZXMgKDAsIHdlbm4gVHJhbmsgbmljaHQgZ2V0cnVua2VuKQorcHJpdmF0ZSBub3NhdmUgaW50IGR1cmF0aW9uOworLy8gVHJhbmthdHRyaWJ1dGUsIHZvbSBLcmF1dG1hc3RlciBzY2hvbiBza2FsaWVydCwgZ2VrYXBwdCwgYmVzY2hyYWVua3QgYXVmCisvLyBkaWUgamV3ZWlscyBtYXguIHBvc2l0aXZlbiBFZmZla3RlCitwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIGRhdGE7CisvLyBLbGFzc2VuLCBkaWUgYmVpIFNjaHV0eiBvZGVyIHZlcnN0YWVya3RlbSBTY2hhZGVuIGJldHJvZmZlbiBzaW5kLiBXZXJ0ZQorLy8gaXN0IGRlciBTY2h1dHotIG9kZXIgQXR0YWNrZWJvbnVzLy1tYWx1cy4KK3ByaXZhdGUgbm9zYXZlIG1hcHBpbmcgYXR0X2NsYXNzZXM7Citwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIHByb3RfY2xhc3NlczsKKy8vIG1heC4gU3VtbWUgdm9uIEdpZnRzdHVmZW4gKFBfUE9JU09OIHVuZCBQX0xFVkVMLzEwIGJlaSBDTF9QT0lTT04pLgorcHJpdmF0ZSBub3NhdmUgaW50IHByb3RfcG9pc29uOworLy8gbWF4LiBnZWhlaWx0ZSBTdW1tZSB2b24gS3JhbmtoZWl0c2xldmVsIChQX0xFVkVMLzUgaW4gQ0xfRElTRUFTRSkuCitwcml2YXRlIG5vc2F2ZSBpbnQgcHJvdF9kaXNlYXNlOworLy8gbmFjaCBXaXJrdW5nIGFic3RlaWdlbmQgc29ydGllcnRlIExpc3RlIGRlciBFZmZla3RlLCB3aXJkIGJlaW0gZXJzdGVuCisvLyBBdWZydWYgdm9uIERldGVybWluZVN0cm9uZ2VzRWZmZWN0KCkgYmVmdWVsbHQuCitwcml2YXRlIG5vc2F2ZSBzdHJpbmcqIHNvcnRlZF9lZmZlY3RzOworCittaXhlZCBfcXVlcnlfZGF0YSgpIHtyZXR1cm4gZGF0YTt9CitpbnQgX3NldF9kYXRhKG1peGVkIGQpIHtkYXRhPWQ7IGV4cGlyeSA9IF9fSU5UX01BWF9fOyByZXR1cm4gZGF0YSE9MDt9Citwcml2YXRlIHN0cmluZyBlZmZlY3QyY29sb3VyKCk7CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgIGlmIChvYmplY3RfbmFtZSh0aGlzX29iamVjdCgpKSA9PSBfX0ZJTEVfX1swLi48M10pCisgIHsKKyAgICBzZXRfbmV4dF9yZXNldCgtMSk7CisgICAgcmV0dXJuOworICB9CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9HRU5ERVIsIEZFTUFMRSk7CisgIFNldFByb3AoUF9OQU1FLCAiR2xhc2ZsYXNjaGUiKTsKKyAgU2V0UHJvcChQX05BTUVfQURKLCAoeyJrbGVpbiJ9KSk7CisgIFNldFByb3AoUF9WQUxVRSwgMTApOworICBTZXRQcm9wKFBfV0VJR0hULCAxMDApOworICBTZXRQcm9wKFBfS0lMTF9OQU1FLCAiRWluIEtyYWV1dGVydHJhbmsiKTsKKyAgU2V0UHJvcChQX0tJTExfTVNHLCAiJXMgaGF0IHNpY2ggd29obCBiZWltIEFucnVlaHJlbiB2ZXJ0YW4uIik7CisgIEFkZElkKCh7ImdsYXNmbGFzY2hlIiwgImZsYXNjaGUifSkpOworICBBZGRBZGplY3RpdmUoKHsia2xlaW4iLCAia2xlaW5lIn0pKTsKKyAgQWRkQ21kKCJ0cmlua3x0cmlua2UmQElEIiwgImNtZF90cmlua2VuIiwKKyAgICAiV2FzIHdpbGxzdCBEdSB0cmlua2VuPyIpOworfQorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGVfc3VwZXIoKQoreworICBzZXRfbmV4dF9yZXNldCgtMSk7Cit9CisKK3N0YXRpYyBzdHJpbmcgX3F1ZXJ5X3Nob3J0KCkKK3sKKyAgaWYgKCFjbG9uZXAoTUUpKQorICAgIHJldHVybiAiRWluZSBrbGVpbmUgR2xhc2ZsYXNjaGUiOworICByZXR1cm4gTmFtZShXRU4sIDApKyhkYXRhPT0wID8gIiIgOiAiIChnZWZ1ZWxsdCkiKTsKK30KKworc3RhdGljIHN0cmluZyBfcXVlcnlfbG9uZygpCit7CisgIGlmIChkYXRhPT0wKQorICAgIHJldHVybiBicmVha19zdHJpbmcoCisgICAgICAiRWluZSBrbGVpbmUgbGVlcmUgR2xhc2ZsYXNjaGUsIGRpZSBtaXQgZWluZW0gS29ya2VuIHZlcnNjaGxvc3NlbiAiCisgICAgICAiaXN0LlxuIgorICAgICAgIkZsYXNjaGVuIHdpZSBkaWVzZSB3ZXJkZW4gdWVibGljaGVyd2Vpc2UgdmVyd2VuZGV0LCB1bSBkYXJpbiAiCisgICAgICAibWFnaXNjaGUgVHJhZW5rZSBhYnp1ZnVlbGxlbi4iLCA3OCwgMCwgQlNfTEVBVkVfTVlfTEZTKTsKKworICByZXR1cm4gYnJlYWtfc3RyaW5nKAorICAgICJFaW5lIGtsZWluZSBHbGFzZmxhc2NoZSwgZGllIG1pdCBlaW5lciAiK2VmZmVjdDJjb2xvdXIoKSsiZW4gIgorICAgICJGbHVlc3NpZ2tlaXQgZ2VmdWVsbHQgaXN0LlxuIgorICAgICJTaWUgaXN0IG1pdCBlaW5lbSBLb3JrZW4gdmVyc2NobG9zc2VuLCB1bSBkZW4gSW5oYWx0IGRlciAiCisgICAgIkZsYXNjaGUgenUgc2NodWV0emVuLiIsNzgsIDAsIEJTX0xFQVZFX01ZX0xGUyk7Cit9CisKK3ByaXZhdGUgc3RyaW5nIG51bTJkZXNjKGludCBidW1tcykKK3sKKyAgc3dpdGNoKGFicyhidW1tcykpCisgIHsKKyAgICBjYXNlIDAuLjQ5OToKKyAgICAgIHJldHVybiAiZWluIHdlbmlnIjsKKyAgICBjYXNlIDUwMC4uOTk5OgorICAgICAgcmV0dXJuICJzbyBlaW5pZ2VzIjsKKyAgICBjYXNlIDEwMDAuLjE0OTk6CisgICAgICByZXR1cm4gImVyaGVibGljaCI7CisgICAgY2FzZSAxNTAwLi4yMDAwOgorICAgICAgcmV0dXJuICJ1bmdsYXVibGljaCI7CisgIH0KKyAgcmV0dXJuICJ1bmdlbmVobWlndCB2aWVsIjsgLy8ga29tbXQgaG9mZmVudGxpY2ggbmljaHQgdm9yLgorfQorCit2YXJhcmdzIHByaXZhdGUgc3RyaW5nIERldGVybWluZVN0cm9uZ2VzdEVmZmVjdChpbnQgcG9zKQoreworICAvLyBnbG9iYWxlIFdlcnRlbGlzdGUgYmVmdWVsbGVuLCB3ZW5uIGRhIG5vY2ggbmljaHRzIGRyaW5zdGVodC4KKyAgaWYgKCAhcG9pbnRlcnAoc29ydGVkX2VmZmVjdHMpICkgeworICAgIHNvcnRlZF9lZmZlY3RzID0gc29ydF9hcnJheShtX2luZGljZXMoZGF0YSkgJiBUX0tSQVVUX0VGRkVDVFMsCisgICAgICBmdW5jdGlvbiBpbnQgKHN0cmluZyBhLCBzdHJpbmcgYikgeworICAgICAgICByZXR1cm4gKGFicyhkYXRhW2FdKTw9YWJzKGRhdGFbYl0pKTsKKyAgICAgIH0pOworICB9CisKKyAgLy8gWnVyIEluZGl6aWVydW5nIGRlcyBBcnJheXMgbXVzcyA8cG9zPiBiZWkgTnVsbCBzdGFydGVuLCBlcyB3aXJkCisgIC8vIGFiZXIgbWl0IGRlciBCZWRldXR1bmcgZWluZXIgT3JkaW5hbHphaGwgKGVyc3RlLCB6d2VpdGUsIGRyaXR0ZSwgLi4uKQorICAvLyB1ZWJlcmdlYmVuLiBEYWhlciB1bSAxIHJlZHV6aWVyZW4uCisgIC0tcG9zOworCisgIHN0cmluZyByZXQ7CisKKyAgLy8gSW0gQXJyYXkgbXVzcyBtaW5kZXN0ZW5zIGVpbiBFaW50cmFnIHN0ZWhlbiwgc29uc3QgZ2lidCdzIGdhciBrZWluZW4KKyAgLy8gRWZmZWt0LgorICBpZiAoIHNpemVvZihzb3J0ZWRfZWZmZWN0cykgKQorICB7CisgICAgLy8gV2VubiBkZXIgYW5nZWZyYWd0ZSBJbmRleCBhdXNzZXJoYWxiIGRlciBBcnJheWdyZW56ZW4gbGllZ3QsIHdpcmQKKyAgICAvLyBhbmdlbm9tbWVuLCBkYXNzIGRlciBlcnN0ZSBiencuIGxldHp0ZSBFaW50cmFnIGdlc3VjaHQgd2FyZW4uCisgICAgaWYgKCBwb3MgPCAwICkKKyAgICAgIHJldCA9IHNvcnRlZF9lZmZlY3RzWzBdOworICAgIGVsc2UgaWYgKCBwb3MgPj0gc2l6ZW9mKHNvcnRlZF9lZmZlY3RzKSApCisgICAgICByZXQgPSBzb3J0ZWRfZWZmZWN0c1s8MV07CisgICAgZWxzZQorICAgICAgcmV0ID0gc29ydGVkX2VmZmVjdHNbcG9zXTsKKyAgfQorICByZXR1cm4gcmV0OworfQorCisvLyBMaWVmZXJ0IHp1IGRlbSBtYXhpbWFsIHdpcmtzYW1lbiBFZmZla3QgZGllIEZhcmJlIGRlcyBUcmFua2VzIHp1cnVlY2suCitwcml2YXRlIHN0cmluZyBlZmZlY3QyY29sb3VyKCkKK3sKKyAgLy8gSXN0IGRpZSBIYWx0YmFya2VpdCBzY2hvbiBhYmdlbGF1ZmVuLCB3aXJkIGRlciBUcmFuayBmYXJibG9zLgorICBpZiAoIHRpbWUoKSA+IGV4cGlyeSApCisgICAgcmV0dXJuICJmYXJibG9zIjsKKworICAvLyBOYW1lbiBkZXMgc3RhZXJrc3RlbiBFZmZla3RzIGhvbGVuLgorICBzdHJpbmcgZWZmZWN0ID0gRGV0ZXJtaW5lU3Ryb25nZXN0RWZmZWN0KDEpOworICBtYXBwaW5nIGNvbG91cnMgPSAoWworICAgIFRfQ0FSUlk6ICAgICAgICAgICAgICAidHJ1ZWIgYnJhdW4iLAorICAgIFRfREFNQUdFX0FOSU1BTFM6ICAgICAiYmx1dHJvdCIsCisgICAgVF9EQU1BR0VfTUFHSUM6ICAgICAgICJva3RhcmluZmFyYmVuIiwKKyAgICBUX0RBTUFHRV9VTkRFQUQ6ICAgICAgImFudGhyYXppdGZhcmJlbiIsCisgICAgVF9GTEVFX1RQT1JUOiAgICAgICAgICJzY2h3ZWZlbGdlbGIiLAorICAgIFRfRlJPRzogICAgICAgICAgICAgICAic2NobGFtbWdydWVuIiwKKyAgICBUX0hFQUxfRElTRUFTRTogICAgICAgInBlcmxtdXR0ZmFyYmVuIiwKKyAgICBUX0hFQUxfUE9JU09OOiAgICAgICAgImdydWVuIiwKKyAgICBUX0hFQUxfU1A6ICAgICAgICAgICAgImJsYXUiLAorICAgIFRfSEVBTF9MUDogICAgICAgICAgICAic2NoYXJsYWNocm90IiwKKyAgICBUX1BST1RFQ1RJT05fQU5JTUFMUzogIm1ldGFsbGlzY2ggZ3JhdSIsCisgICAgVF9QUk9URUNUSU9OX01BR0lDOiAgICJ2aW9sZXR0IiwKKyAgICBUX1BST1RFQ1RJT05fVU5ERUFEOiAgInN0cmFobGVuZCB3ZWlzcyIsCisgICAgVF9TQV9TUEVFRDogICAgICAgICAgICJvcmFuZ2VmYXJiZW4iLAorICAgIFRfU0FfU1BFTExfUEVORVRSQVRJT046ICJzdGFobGJsYXUiLAorICAgIFRfU0FfRFVSQVRJT046ICAgICAgICAicGlua2ZhcmJlbiIsCisgIF0pOworICBzdHJpbmcgcmV0ID0gY29sb3Vyc1tlZmZlY3RdOworICByZXR1cm4gc3RyaW5ncChyZXQpID8gcmV0IDogImZhcmJsb3MiOworfQorCisvLyBXaXJkIGdlcnVmZW4sIHdlbm4gZGllIFdpcmt1bmcgZGVzIFRyYW5rZXMgYWJsYXVmZW4gc29sbC4KK3ByaXZhdGUgdm9pZCB0ZXJtaW5hdGVfZWZmZWN0cygpCit7CisgIHRlbGxfb2JqZWN0KGVudmlyb25tZW50KCksCisgICAgICAiRGllIGxldHp0ZW4gV2lya3VuZ2VuIGRlcyBLcmFldXRlcnRyYW5rZXMga2xpbmdlbiBhYi5cbiIpOworICByZW1vdmUoMSk7Cit9CisKKy8vIFZvbiBkZW4gSG9va3MgSF9IT09LX0FUVEFDS19NT0QgdW5kIEhfSE9PS19ERUZFTkQgZ2VydWZlbiwgZXJob2VodCBvZGVyCisvLyB2ZXJyaW5nZXJ0IGRlbiBTY2hhZGVuIGdlZ2VuIExlYmVud2VzZW4gYmVzdGltbXRlciBLbGFzc2VuIChLZXlzIGluCisvLyA8Y2xhc3Nlcz4pLiBEZXIgTWFsdXMvQm9udXMgc3RlaHQgYWxzIFdlcnQgenVtIGpld2VpbGlnZW4gS2V5IGluIGRlbQorLy8gTWFwcGluZy4KK21peGVkIGhjYWxsYmFjayhvYmplY3QgaG9va1NvdXJjZSwgaW50IGhvb2tpZCwgbWl4ZWQgaG9va0RhdGEpCit7CisgICAgaWYgKGhvb2tTb3VyY2UgIT0gZW52aXJvbm1lbnQoKSkKKyAgICAgICAgcmV0dXJuICh7SF9OT19NT0QsaG9va0RhdGF9KTsKKyAgICBzd2l0Y2goaG9va2lkKQorICAgIHsKKyAgICAgIGNhc2UgSF9IT09LX0FUVEFDS19NT0Q6CisgICAgICAgIGZvcmVhY2goc3RyaW5nIGNsYXNzLCBpbnQgbW9kdmFsIDogYXR0X2NsYXNzZXMpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoaG9va0RhdGFbU0lfRU5FTVldLT5pc19jbGFzc19tZW1iZXIoY2xhc3MpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFllYWguIFRyZWZmZXIuIFNjaGFkZW4gZXJob2VoZW4gb2RlciB2ZXJyaW5nZXJuLi4uIDspCisgICAgICAgICAgICBob29rRGF0YVtTSV9TS0lMTERBTUFHRV0gKz0gbW9kdmFsOworICAgICAgICAgICAgLy8gRW5kZS4ga2VpbmUgd2VpdGVyZW4gS2xhc3NlbiBwcnVlZmVuLgorICAgICAgICAgICAgcmV0dXJuICh7SF9BTFRFUkVELCBob29rRGF0YX0pOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSF9IT09LX0RFRkVORDoKKyAgICAgICAgLy8gaG9va0RhdGE6ICh7ZGFtLGRhbV90eXBlLHNwZWxsLGVuZW15fSkKKyAgICAgICAgZm9yZWFjaChzdHJpbmcgY2xhc3MsIGludCBtb2R2YWwgOiBwcm90X2NsYXNzZXMpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoaG9va0RhdGFbM10tPmlzX2NsYXNzX21lbWJlcihjbGFzcykpCisgICAgICAgICAgeworICAgICAgICAgICAgLy8gWWVhaC4gVHJlZmZlci4gU2NoYWRlbiBlcmhvZWhlbiBvZGVyIHZlcnJpbmdlcm4uLi4gOykKKyAgICAgICAgICAgIGhvb2tEYXRhWzBdICs9IG1vZHZhbDsKKyAgICAgICAgICAgIC8vIEVuZGUuIGtlaW5lIHdlaXRlcmVuIEtsYXNzZW4gcHJ1ZWZlbi4KKyAgICAgICAgICAgIHJldHVybiAoe0hfQUxURVJFRCwgaG9va0RhdGF9KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEhfSE9PS19JTlNFUlQ6CisgICAgICAgIC8vIFdlbm4gZGllIEdpZnRzY2h1dHprYXBheml0YWV0IG5vY2ggYXVzcmVpY2h0LCB3aXJkIGRhcyByZWlua29tbWVuZGUKKyAgICAgICAgLy8gT2JqZWt0IHplcnN0b2VydCAodW5kIGRpZSBLYXBheml0YWV0IHJlZHV6aWVydCkuCisgICAgICAgIC8vIGhvb2tEYXRhOiBuZXVlcyBvYmplY3QKKyAgICAgICAgaWYgKHByb3RfcG9pc29uID4gMAorICAgICAgICAgICAgJiYgaG9va0RhdGEtPmlzX2NsYXNzX21lbWJlcihDTF9QT0lTT04pKQorICAgICAgICB7CisgICAgICAgICAgLy8ga29zdGV0IGVpbiBaZWhudGVsIGRlcyBMZXZlbHMsIGFiZXIgbWluLiAxLgorICAgICAgICAgIGludCBwPWhvb2tEYXRhLT5RdWVyeVByb3AoUF9MRVZFTCkgLyAxMCArIDE7CisgICAgICAgICAgaWYgKHAgPCBwcm90X3BvaXNvbikKKyAgICAgICAgICB7CisgICAgICAgICAgICBob29rRGF0YS0+cmVtb3ZlKDEpOworICAgICAgICAgICAgcHJvdF9wb2lzb24tPXA7CisgICAgICAgICAgICByZXR1cm4gKHtIX0NBTkNFTExFRCwgaG9va0RhdGF9KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gV2VubiBkaWUgS3JhbmtoZWl0c3NjaHV0emthcGF6aXRhZXQgbm9jaCBhdXNyZWljaHQsIHdpcmQgZGFzIHJlaW5rb21tZW5kZQorICAgICAgICAvLyBPYmpla3QgemVyc3RvZXJ0ICh1bmQgZGllIEthcGF6aXRhZXQgcmVkdXppZXJ0KS4KKyAgICAgICAgLy8gaG9va0RhdGE6IG5ldWVzIG9iamVjdAorICAgICAgICBpZiAocHJvdF9kaXNlYXNlID4gMAorICAgICAgICAgICAgJiYgaG9va0RhdGEtPmlzX2NsYXNzX21lbWJlcihDTF9ESVNFQVNFKSkKKyAgICAgICAgeworICAgICAgICAgIC8vIGtvc3RldCBlaW4gRnVlbmZ0ZWwgZGVzIExldmVscywgYWJlciBtaW4uIDEuCisgICAgICAgICAgaW50IGx2bCA9IGhvb2tEYXRhLT5RdWVyeVByb3AoUF9MRVZFTCkgLyA1ICsgMTsKKyAgICAgICAgICBpZiAobHZsIDwgcHJvdF9kaXNlYXNlKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGhvb2tEYXRhLT5yZW1vdmUoMSk7CisgICAgICAgICAgICBwcm90X2Rpc2Vhc2UtPWx2bDsKKyAgICAgICAgICAgIHJldHVybiAoe0hfQ0FOQ0VMTEVELCBob29rRGF0YX0pOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSF9IT09LX1BPSVNPTjoKKyAgICAgICAgLy8gaG9va0RhdGE6IHBvaXNvbnZhbAorICAgICAgICAvLyBBbGxlIEdpZnRsZXZlbCB3ZXJkZW4gcmVkdXppZXJ0IGF1ZiAwIHVuZCB2b24gcHJvdF9wb2lzb24KKyAgICAgICAgLy8gYWJnZXpvZ2VuLiBXZW5uIGRhcyAwIGlzdCwgZW5kZXQgZGVyIEdpZnRzY2h1dHouCisgICAgICAgIGlmIChwcm90X3BvaXNvbj4wKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGhvb2tEYXRhIDwgcHJvdF9wb2lzb24pCisgICAgICAgICAgeworICAgICAgICAgICAgcHJvdF9wb2lzb24tPWhvb2tEYXRhOworICAgICAgICAgICAgaG9va0RhdGEgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgaG9va0RhdGEgLT0gcHJvdF9wb2lzb247CisgICAgICAgICAgICBwcm90X3BvaXNvbj0wOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gKHtIX0FMVEVSRUQsIGhvb2tEYXRhfSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAoe0hfTk9fTU9ELCBob29rRGF0YX0pOworfQorCitwcml2YXRlIGludCByZWdfaG9vayhpbnQgaG9vaywgaW50IGhvb2t0eXBlKQoreworICAvLyBXZW5uIHNjaG9uIHJlZ2lzdHJpZXJ0LCB6YWVobHQgZGFzIGF1Y2ggYWxzIEVyZm9sZy4KKyAgaWYgKGVudmlyb25tZW50KCktPkhJc0hvb2tDb25zdW1lcihob29rLCAjJ2hjYWxsYmFjaykpCisgICAgcmV0dXJuIDE7CisgIGludCByZXMgPSBlbnZpcm9ubWVudCgpLT5IUmVnaXN0ZXJUb0hvb2soaG9vaywgIydoY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgIEhfSE9PS19PVEhFUlBSSU8oMCksIGhvb2t0eXBlLCBkdXJhdGlvbik7CisgIGlmIChyZXMgPD0gMCkKKyAgeworICAgIC8vIHdlbm4gYW5kZXJlIEZlaGxlciBhbHMgLTcgKHp1dmllbGUgSG9va3MgcmVnaXN0cmllcnQpIHZvcmtvbW1lbjoKKyAgICAvLyBGZWhsZXJtZWxkdW5nIGF1c2dlYmVuCisgICAgaWYgKHJlcyAhPSAtNykKKyAgICAgIHRlbGxfb2JqZWN0KGVudmlyb25tZW50KCksYnJlYWtfc3RyaW5nKHNwcmludGYoCisgICAgICAgICAgIlRlY2huaXNjaGVyIEhpbndlaXMsIGRlbiBEdSBhbiBlaW5lbiBNYWdpZXIgd2VpdGVyZ2ViZW4gIgorICAgICAgICAgICJzb2xsdGVzdDogQmVpbSBSZWdpc3RyaWVyZW4gZGVzIEhvb2tzICVkIGdhYiBlcyBGZWhsZXI6ICVkXG4iLAorICAgICAgICAgIGhvb2ssIHJlcyksNzgpKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gMTsKK30KKworLy8gZWZmZWt0OiBXaXJrdW5nc3dlcnQgZGVzIFRyYW5rcyAobXVzcyBuZWdhdGl2IHNlaW4pCisvLyB0eXBlOiAxIGZ1ZXIgR2lmdCwgMCBmdWVyIEtyYW5raGVpdAorcHJpdmF0ZSB2b2lkIHRpY2t0YWNrKGludCBlZmZla3QsIGludCB0eXBlKQoreworICAvLyBTY2hhZGVuIHRpY2t0IGFsbGUgNSBTZWt1bmRlbgorICBpbnQgZGVsYXkgPSA1OworICAvLyBEZXIgaGFsYmUgQmV0cmFnIGRlcyBuZWdhdGl2ZW4gRWZmZWt0cyB3aXJkIGFscyBTY2hhZGVuIGFtCisgIC8vIFNwaWVsZXIgdmVydXJzYWNodC4KKyAgLy8gQmVyZWNobnVuZzogKFNjaGFkZW4gcHJvIFNla3VuZGUpICogKERlbGF5IGluIFNla3VuZGVuKQorICAvLyBpbiBmbG9hdCByZWNobmVuIGlzdCBoaWVyIHNpbm52b2xsLCBpbmtsLiBhdWZydW5kZW4gKGR1cmNoIGRpZSArMC41KQorLy8gIGludCBkYW0gPSB0b19pbnQoKCgtMC41KmVmZmVrdCkvZHVyYXRpb24pKmRlbGF5ICsgMC41KTsKKyAgaW50IGRhbSA9IHRvX2ludCgwLjUqYWJzKGVmZmVrdCkvZGF0YVtUX0VGRkVDVF9EVVJBVElPTl0qZGVsYXkgKyAwLjUpOworCisgIGlmICh0eXBlKQorICAgIHRlbGxfb2JqZWN0KGVudmlyb25tZW50KCksCisgICAgICBicmVha19zdHJpbmcoIkdpZnQgcHVsc2llcnQgYnJlbm5lbmQgZHVyY2ggRGVpbmUgQWRlcm4uIiw3OCkpOworICBlbHNlCisgICAgdGVsbF9vYmplY3QoZW52aXJvbm1lbnQoKSwKKyAgICAgIGJyZWFrX3N0cmluZygiRHUgZnVlaGxzdCBEaWNoIHNjaHdhY2ggdW5kIGVsZW5kLCBlaW5lIEVya3Jhbmt1bmcgIgorICAgICAgInplaHJ0IGFuIERlaW5lbiBLcmFlZnRlbi4iLDc4KSk7CisKKyAgZW52aXJvbm1lbnQoKS0+ZG9fZGFtYWdlKGRhbSwgdGhpc19vYmplY3QoKSk7CisgIGNhbGxfb3V0KCMndGlja3RhY2ssIGRlbGF5LCBlZmZla3QsIHR5cGUpOworfQorCitwcml2YXRlIGludCBhY3RfYXR0cl9oZWFsX3BvaXNvbihpbnQgZWZmZWt0KQoreworICBpbnQgZXJmb2xncmVpY2g7CisgIHRlbGxfb2JqZWN0KGVudmlyb25tZW50KCksIGJyZWFrX3N0cmluZygKKyAgICAgIkR1IGZ1ZWhsc3QsIHdpZSBkZXIgVHJhbmsgd2llIEZldWVyIGR1cmNoIERlaW5lbiBLb2VycGVyIHNjaGllc3N0ICIKKyAgICAgInVuZCBrcnVlbW1zdCBEaWNoIHZvciBTY2htZXJ6ZW4uIERvY2ggTW9tZW50ZSBzcGFldGVyIGxhZXNzdCBkaWUgIgorICAgICAiVG9ydHVyIG5hY2guIiw3OCkpOworCisgIC8vIG1heC4gNDAgR2lmdGxldmVsIGhlaWxlbi4uLgorICBwcm90X3BvaXNvbiA9IGVmZmVrdCAvIDUwOworCisgIGlmIChwcm90X3BvaXNvbiA8IDApCisgIHsKKyAgICB0ZWxsX29iamVjdChlbnZpcm9ubWVudCgpLCBCUygKKyAgICAgICJCYWghIERlciBUcmFuayBzY2htZWNrdCB3aWRlcmxpY2ggYml0dGVyLiBXZW5uIGRlciBtYWwgbmljaHQgIgorICAgICAgImdpZnRpZyB3YXIuIikpOworICAgIGNhbGxfb3V0KCMndGlja3RhY2ssIDUsIGVmZmVrdCwgMSk7IC8vIDEgPT4gR2lmdAorICAgIHJldHVybiAxOworICB9CisgIAorICAvLyBhYiBqZXR6dCBudXIgbm9jaCBwb3NpdGl2ZSBXaXJrdW5nZW4uCisKKyAgLy8gUF9QT0lTT04genVlcnN0LgorICBpbnQgcG9pc29uID0gZW52aXJvbm1lbnQoKS0+UXVlcnlQcm9wKFBfUE9JU09OKTsKKyAgaWYgKHBvaXNvbikKKyAgeworICAgIGlmIChwb2lzb24gPD0gcHJvdF9wb2lzb24pCisgICAgeworICAgICAgcHJvdF9wb2lzb24gLT0gcG9pc29uOworICAgICAgZW52aXJvbm1lbnQoKS0+U2V0UHJvcChQX1BPSVNPTiwwKTsKKyAgICAgIGlmICghZW52aXJvbm1lbnQoKS0+UXVlcnlQcm9wKFBfUE9JU09OKSkKKyAgICAgICAgKytlcmZvbGdyZWljaDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHBvaXNvbiAtPSBwcm90X3BvaXNvbjsKKyAgICAgIHByb3RfcG9pc29uPTA7CisgICAgICBlbnZpcm9ubWVudCgpLT5TZXRQcm9wKFBfUE9JU09OLCBwb2lzb24pOworICAgICAgLy8gV2VubiBlcmZvbGdyZWljaCwgZGlyZWt0IE1lbGR1bmcgdW5kIHJhdXMuCisgICAgICBpZiAoZW52aXJvbm1lbnQoKS0+UXVlcnlQcm9wKFBfUE9JU09OKSA9PSBwb2lzb24pCisgICAgICB7CisgICAgICAgIHRlbGxfb2JqZWN0KGVudmlyb25tZW50KCksIGJyZWFrX3N0cmluZygKKyAgICAgICAgICAgIlVlYmVycmFzY2h0IHN0ZWxsc3QgRHUgZmVzdCwgZGFzcyBEdSBEaWNoICIKKyAgICAgICAgICAgImJlc3NlciBmdWVobHN0IC0gZGVyIFRyYW5rIGhhdCBEZWluZSBWZXJnaWZ0dW5nIG9mZmVuYmFyICIKKyAgICAgICAgICAgImdlbGluZGVydC4iLDc4KSk7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIHdlbm4gVHJhbmsgaW1tZXIgbm9jaCBwb3NpdGl2IChhbHNvIG5vY2ggV0lya3VuZyB1ZWJyaWcpCisgIGlmIChwcm90X3BvaXNvbiA+IDApCisgIHsKKyAgICAvLyBBbHMgbmFlY2hzdGVzIE9iamVrdGUgc3VjaGVuLgorICAgIG9iamVjdCAqb2IgPSBmaWx0ZXJfb2JqZWN0cyhhbGxfaW52ZW50b3J5KGVudmlyb25tZW50KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXNfY2xhc3NfbWVtYmVyIiwgQ0xfUE9JU09OKTsKKyAgICBmb3JlYWNoKG9iamVjdCBvOiBvYikKKyAgICB7CisgICAgICAvLyBFbnRnaWZ0ZW4ga29zdGV0IGVpbiBaZWhudGVsIGRlcyBMZXZlbHMsIGFiZXIgbWluLiAxLgorICAgICAgcG9pc29uID0gby0+UXVlcnlQcm9wKFBfTEVWRUwpOworICAgICAgaWYgKHBvaXNvbiA8PSBwcm90X3BvaXNvbioxMCkKKyAgICAgIHsKKyAgICAgICAgcHJvdF9wb2lzb24gLT0gcG9pc29uLzEwICsgMTsKKyAgICAgICAgby0+U2V0UHJvcChQX0xFVkVMLCAwKTsKKyAgICAgICAgaWYgKG8tPnJlbW92ZSgpKQorICAgICAgICAgICsrZXJmb2xncmVpY2g7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHBvaXNvbiAtPSBwcm90X3BvaXNvbiAqIDEwOworICAgICAgICBwcm90X3BvaXNvbiA9IDA7CisgICAgICAgIG8tPlNldFByb3AoUF9MRVZFTCwgcG9pc29uKTsKKyAgICAgICAgaWYgKG8tPlF1ZXJ5UHJvcChQX0xFVkVMKSA9PSBwb2lzb24pCisgICAgICAgICAgKytlcmZvbGdyZWljaDsKKyAgICAgIH0KKyAgICAgIGlmIChwcm90X3BvaXNvbiA8PSAwKQorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAoZXJmb2xncmVpY2gpCisgIHsKKyAgICB0ZWxsX29iamVjdChlbnZpcm9ubWVudCgpLCBicmVha19zdHJpbmcoCisgICAgICAiVWViZXJyYXNjaHQgc3RlbGxzdCBEdSBmZXN0LCBkYXNzIER1IERpY2ggdmllbCBiZXNzZXIgZnVlaGxzdCAtIGRlciAiCisgICAgICAiVHJhbmsgd2lya3Qgb2ZmZW5iYXIgZ2VnZW4gVmVyZ2lmdHVuZ2VuLiIsNzgpKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICB0ZWxsX29iamVjdChlbnZpcm9ubWVudCgpLCBicmVha19zdHJpbmcoCisgICAgICAiRWluZSBBaG51bmcgc2FndCBEaXIsIGRhc3MgZGVyIFRyYW5rIGlyZ2VuZGVpbmUgcG9zaXRpdmUgIgorICAgICAgIldpcmt1bmcgaGF0LiIpKTsKKyAgfQorCisgIC8vIGdnZi4gYW4gZGllIEhvb2tzIHJlZ2lzdHJpZXJlbiwgd2VubiBub2NoIFNjaHV0endpcmt1bmcgdWVicmlnIGlzdC4KKyAgaWYgKHByb3RfcG9pc29uID4gMCkKKyAgeworICAgIC8vIFJ1ZWNrZ2FiZXdlcnRlIHZvbiBIUmVnaXN0ZXJUb0hvb2sgc3BlaWNoZXJuLi4uCisgICAgaW50ICpyZXMgPSAoeyByZWdfaG9vayhIX0hPT0tfUE9JU09OLCBIX0RBVEFfTU9ESUZJQ0FUT1IpIH0pOworICAgIHJlcyArPSAoeyByZWdfaG9vayhIX0hPT0tfSU5TRVJULCBIX0hPT0tfTU9ESUZJQ0FUT1IpIH0pOworICAgIC8vIFdlbm4gYWxsZSB2ZXJzdWNodGVuIFJlZ2lzdHJpZXJ1bmdlbiBlcmZvbGdyZWljaCB3YXJlbi4uLj8gQW5zb25zdGVuCisgICAgLy8gYW5kZXJlIE1lbGR1bmcuLi4gSWNoIGJpbiBub2NoIG5pY2h0IGdsdWVja2xpY2gsIGRhcyBoaWVyIHNvIGV4cGxpeml0CisgICAgLy8gYXVzenVnZWJlbiwgYWJlciBpY2ggd2Vpc3MgZ2VyYWRlIHNvbnN0IG5pY2h0LCB3aWUgbWFuIGRyYXVmIGtvbW1lbgorICAgIC8vIHNvbGwsIGRhc3MgZXMgZWluIFByb2JsZW0gZ2lidC4KKyAgICBpZiAoc2l6ZW9mKHJlcykgPT0gc2l6ZW9mKHJlcyAmICh7MX0pKSkKKyAgICAgIHRlbGxfb2JqZWN0KGVudmlyb25tZW50KCksCisgICAgICAgICAiVmllbGxlaWNodCBoYWVsdCBkaWVzZSBXaXJrdW5nIGphIHNvZ2FyIG5vY2ggZXR3YXMgYW4/XG4iKTsKKyAgICBlbHNlCisgICAgeworICAgICAgLy8genVtaW5kZXN0IGVpbiBlcmZvbGc/CisgICAgICBpZiAobWVtYmVyKHJlcywgMSkgPiAtMSkKKyAgICAgICAgdGVsbF9vYmplY3QoZW52aXJvbm1lbnQoKSwKKyAgICAgICAgICAgICJWaWVsbGVpY2h0IGhhZWx0IGVpbiBUZWlsIGRpZXNlciBXaXJrdW5nIGphIHNvZ2FyIG5vY2ggZXR3YXMgYW4/XG4iKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3ByaXZhdGUgaW50IGFjdF9hdHRyX2hlYWxfZGlzZWFzZShpbnQgZWZmZWt0KQoreworICBpbnQgZXJmb2xncmVpY2g7CisKKyAgLy8gbWF4LiA0MCBLcmFua2hlaXRzbGV2ZWwgaGVpbGVuLi4uCisgIHByb3RfZGlzZWFzZSA9IGVmZmVrdCAvIDUwOworCisgIGlmIChwcm90X2Rpc2Vhc2UgPiAwKQorICB7CisgICAgIHRlbGxfb2JqZWN0KGVudmlyb25tZW50KCksIGJyZWFrX3N0cmluZygKKyAgICAgICAiRHUgZnVlaGxzdCwgd2llIGRlciBUcmFuayBpbiBEZWluZW0gQmF1Y2ggZWluZSB3b2hsaWdlIFdhZXJtZSAiCisgICAgICAgInZlcmJyZWl0ZXQgdW5kIGxhZWNoZWxzdCB1bndpbGxrdWVybGljaC4iLDc4KSk7CisgICAKKyAgICAvLyBPYmpla3RlIHN1Y2hlbi4KKyAgICBvYmplY3QgKm9iID0gZmlsdGVyX29iamVjdHMoYWxsX2ludmVudG9yeShlbnZpcm9ubWVudCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlzX2NsYXNzX21lbWJlciIsIENMX0RJU0VBU0UpOworICAgIGZvcmVhY2gob2JqZWN0IG86IG9iKQorICAgIHsKKyAgICAgIC8vIEhlaWxlbiBrb3N0ZXQgZWluIEZ1ZW5mdGVsIGRlcyBMZXZlbHMsIGFiZXIgbWluLiAxLgorICAgICAgaW50IGRpc2Vhc2UgPSBvLT5RdWVyeVByb3AoUF9MRVZFTCk7CisgICAgICBpZiAoZGlzZWFzZSA8PSBwcm90X2Rpc2Vhc2UqNSkKKyAgICAgIHsKKyAgICAgICAgcHJvdF9kaXNlYXNlIC09IGRpc2Vhc2UvNSArIDE7CisgICAgICAgIG8tPlNldFByb3AoUF9MRVZFTCwgMCk7CisgICAgICAgIGlmIChvLT5yZW1vdmUoKSkKKyAgICAgICAgICArK2VyZm9sZ3JlaWNoOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBkaXNlYXNlIC09IHByb3RfZGlzZWFzZSAqIDU7CisgICAgICAgIHByb3RfZGlzZWFzZSA9IDA7CisgICAgICAgIG8tPlNldFByb3AoUF9MRVZFTCwgZGlzZWFzZSk7CisgICAgICAgIGlmIChvLT5RdWVyeVByb3AoUF9MRVZFTCkgPT0gZGlzZWFzZSkKKyAgICAgICAgICArK2VyZm9sZ3JlaWNoOworICAgICAgfQorICAgICAgaWYgKHByb3RfZGlzZWFzZSA8PSAwKQorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgdGVsbF9vYmplY3QoZW52aXJvbm1lbnQoKSwgQlMoCisgICAgICAiRGVyIFRyYW5rIHNjaG1lY2t0IGVrbGlnIGZhdWxpZy4gRGVpbiBNYWdlbiByZWJlbGxpZXJ0IHVtZ2VoZW5kLiAiCisgICAgICAiRHUga2FubnN0IERlaW5lbiBCcmVjaHJlaXogZ2VyYWRlIG5vY2ggdW50ZXJkcnVlY2tlbiwgZnVlaGxzdCAiCisgICAgICAiRGljaCBhYmVyIGtyYW5rLiIpKTsKKyAgICBjYWxsX291dCgjJ3RpY2t0YWNrLCA1LCBlZmZla3QsIDApOyAvLyAwID0+IEtyYW5raGVpdAorICAgIHJldHVybiAxOworICB9CisKKyAgaWYgKGVyZm9sZ3JlaWNoKQorICB7CisgICAgdGVsbF9vYmplY3QoZW52aXJvbm1lbnQoKSwgYnJlYWtfc3RyaW5nKAorICAgICAgIkVudHNwYW5udCBkdXJjaGF0bWVuZCBzdGVsbHN0IER1IGZlc3QsIGRhc3MgRHUgRGljaCB2aWVsIGJlc3NlciBmdWVobHN0IC0gZGVyICIKKyAgICAgICJUcmFuayB3aXJrdCBvZmZlbmJhciBnZWdlbiBLcmFua2hlaXRlbi4iLDc4KSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgdGVsbF9vYmplY3QoZW52aXJvbm1lbnQoKSwgYnJlYWtfc3RyaW5nKAorICAgICAgIkVpbmUgQWhudW5nIHNhZ3QgRGlyLCBkYXNzIGRlciBUcmFuayBpcmdlbmRlaW5lIHBvc2l0aXZlICIKKyAgICAgICJXaXJrdW5nIGhhdC4iKSk7CisgIH0KKworICAvLyBnZ2YuIGFuIGRpZSBIb29rcyByZWdpc3RyaWVyZW4uCisgIGlmIChwcm90X2Rpc2Vhc2UgPiAwKQorICB7CisgICAgLy8gUmVnaXN0cmllcnVuZyBlcmZvbGdyZWljaC4uLj8gQW5zb25zdGVuIGFuZGVyZSBNZWxkdW5nLi4uIEljaCBiaW4KKyAgICAvLyBub2NoIG5pY2h0IGdsdWVja2xpY2gsIGRhcyBoaWVyIHNvIGV4cGxpeml0IGF1c3p1Z2ViZW4sIGFiZXIgaWNoCisgICAgLy8gd2Vpc3MgZ2VyYWRlIHNvbnN0IG5pY2h0LCB3aWUgbWFuIGRyYXVmIGtvbW1lbiBzb2xsLCBkYXNzIGVzIGVpbgorICAgIC8vIFByb2JsZW0gZ2lidC4KKyAgICBpZiAocmVnX2hvb2soSF9IT09LX0lOU0VSVCwgSF9IT09LX01PRElGSUNBVE9SKT09MSkKKyAgICAgIHRlbGxfb2JqZWN0KGVudmlyb25tZW50KCksCisgICAgICAgICAiVmllbGxlaWNodCBoYWVsdCBkaWVzZSBXaXJrdW5nIGphIHNvZ2FyIG5vY2ggZXR3YXMgYW4/XG4iKTsKKworICB9CisgIHJldHVybiAxOworfQorCitwcml2YXRlIHN0cmluZyBudW0yZGVzY19maWdodChpbnQgYnVtbXMpCit7CisgIHN3aXRjaChhYnMoYnVtbXMpKQorICB7CisgICAgY2FzZSAwLi40OTk6CisgICAgICByZXR1cm4gImVpbiB3ZW5pZyI7CisgICAgY2FzZSA1MDAuLjk5OToKKyAgICAgIHJldHVybiAic3B1ZXJiYXIiOworICAgIGNhc2UgMTAwMC4uMTQ5OToKKyAgICAgIHJldHVybiAiZGV1dGxpY2giOworICAgIGNhc2UgMTUwMC4uMjAwMDoKKyAgICAgIHJldHVybiAiZXJoZWJsaWNoIjsKKyAgfQorICByZXR1cm4gInVuZ2VuZWhtaWd0IHZpZWwiOyAvLyBrb21tdCBob2ZmZW50bGljaCBuaWNodCB2b3IuCit9CisKKy8vIEFOOiBUaWVyZSBzaW5kOiBDTF9BTklNQUwsIENMX0ZJU0gsIENMX0ZST0csIENMX0lOU0VDVCwgQ0xfTUFNTUFMLAorLy8gQ0xfTUFNTUFMX0xBTkQsIENMX01BTU1BTF9XQVRFUiwgQ0xfUkVQVElMRSwgQ0xfQVJBQ0hOSUQsIENMX0JJUkQKK3ByaXZhdGUgaW50IGFjdF9hdHRyX2RhbV9hbmltYWxzKGludCBlZmZla3QpCit7CisgIGlmIChyZWdfaG9vayhIX0hPT0tfQVRUQUNLX01PRCwgSF9EQVRBX01PRElGSUNBVE9SKSA9PSAxKQorICB7CisgICAgaWYgKCFtYXBwaW5ncChhdHRfY2xhc3NlcykpIGF0dF9jbGFzc2VzPW1fYWxsb2NhdGUoMSk7CisgICAgYXR0X2NsYXNzZXNbQ0xfQU5JTUFMXSA9IGVmZmVrdC8yMDsKKyAgICB0ZWxsX29iamVjdChlbnZpcm9ubWVudCgpLCBicmVha19zdHJpbmcoCisgICAgICAgICJEdSBzcHVlcnN0IGluIERpciBlaW4gc2VsdHNhbWVzIFZlcmxhbmdlbiBhdWZzdGVpZ2VuLCBhdWYgZGllIEphZ2QgIgorICAgICAgICAienUgZ2VoZW4gLSBhbHMgd3VlcmRlIEFydGVtaXMgcGVyc29lbmxpY2ggRGVpbmUgQW5ncmlmZmUgIgorICAgICAgICArIG51bTJkZXNjX2ZpZ2h0KGVmZmVrdCkKKyAgICAgICAgKyAiIHZlcmJlc3Nlcm4uIiw3OCkpOworICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQorCisvLyBBTjogTWFnaXNjaGUgV2VzZW4gc29sbGVuIHNlaW46IENMX0VMRU1FTlRBTCwgQ0xfSUxMVVNJT04sIENMX1NIQURPVworLy8gQ0xfRFJBR09OLCBDTF9ERU1PTiwgQ0xfU0hBUEVDSEFOR0VSLCBDTF9IQVJQWQorcHJpdmF0ZSBpbnQgYWN0X2F0dHJfZGFtX21hZ2ljYWwoaW50IGVmZmVrdCkKK3sKKyAgaWYgKHJlZ19ob29rKEhfSE9PS19BVFRBQ0tfTU9ELCBIX0RBVEFfTU9ESUZJQ0FUT1IpID09IDEpCisgIHsKKyAgICBpZiAoIW1hcHBpbmdwKGF0dF9jbGFzc2VzKSkgYXR0X2NsYXNzZXM9bV9hbGxvY2F0ZSg0KTsKKyAgICBhdHRfY2xhc3Nlc1tDTF9EUkFHT05dID0gYXR0X2NsYXNzZXNbQ0xfRUxFTUVOVEFMXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gYXR0X2NsYXNzZXNbQ0xfU0hBRE9XXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gYXR0X2NsYXNzZXNbQ0xfSUxMVVNJT05dCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBlZmZla3QvMjA7CisgICAgdGVsbF9vYmplY3QoZW52aXJvbm1lbnQoKSwgYnJlYWtfc3RyaW5nKAorICAgICAgICAiTWVya3d1ZXJkaWcuIER1IGhhc3QgZ2VyYWRlIGRhcyBHZWZ1ZWhsLCBhbHMgZmllbGUgRGlyIGRlciAiCisgICAgICAgICJLYW1wZiBnZWdlbiB2b24gSGVrYXRlIGJlc2NoZW5rdGUgV2VzZW4gIgorICAgICAgICArIG51bTJkZXNjX2ZpZ2h0KGVmZmVrdCkKKyAgICAgICAgKyAiIGxlaWNodGVyLiIsNzgpKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworLy8gQU46IFVudG90ZSBzb2xsZW4gc2VpbjogQ0xfU0tFTEVUT04sIENMX0dIT1VMLCBDTF9HSE9TVCwgQ0xfVkFNUElSRQorLy8gQ0xfWk9NQklFLCBDTF9VTkRFQUQKKy8vIEJsb2VkIGlzdCBudXIsIGRhc3MgQ0xfVU5ERUFEIGFsbGUgYW5kZXJlbiBlbnRoYWVsdCBiaXMgYXVmIENMX0dIT1NULgorLy8gQWxzbyBsYXNzZW4gd2lyIGRpZSBVbnRlcnNjaGVpZHVuZyB1bmQgc2Nocml0dHdlaXNlIEZyZWlzY2hhbHR1bmcKKy8vIGVyc3QgZWlubWFsIHNlaW4uCitwcml2YXRlIGludCBhY3RfYXR0cl9kYW1fdW5kZWFkKGludCBlZmZla3QpCit7CisgIGlmIChyZWdfaG9vayhIX0hPT0tfQVRUQUNLX01PRCwgSF9EQVRBX01PRElGSUNBVE9SKSA9PSAxKQorICB7CisgICAgLy8gWm9tYmllcywgU2tlbGV0dGUsIEdodWxlLi4uCisgICAgaWYgKCFtYXBwaW5ncChhdHRfY2xhc3NlcykpIGF0dF9jbGFzc2VzPW1fYWxsb2NhdGUoMSk7CisgICAgYXR0X2NsYXNzZXNbQ0xfVU5ERUFEXSA9ICBlZmZla3QvMjA7CisgICAgdGVsbF9vYmplY3QoZW52aXJvbm1lbnQoKSwgYnJlYWtfc3RyaW5nKAorICAgICAgICAiQXVmIGVpbm1hbCBoYXN0IER1IGRlbiBFaW5kcnVjaywgZGFzcyBkaWUgS3JlYXR1cmVuIGRlcyAiCisgICAgICAgICJIYWRlcyBEZWluZW4gQW5ncmlmZmVuICIKKyAgICAgICAgKyBudW0yZGVzY19maWdodChlZmZla3QpCisgICAgICAgICsgIiB3ZW5pZ2VyIGVudGdlZ2VuIHp1IHNldHplbiBoYWJlbi4iLDc4KSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3ByaXZhdGUgaW50IGFjdF9hdHRyX3Byb3RfYW5pbWFscyhpbnQgZWZmZWt0KQoreworICBpZiAocmVnX2hvb2soSF9IT09LX0RFRkVORCwgSF9EQVRBX01PRElGSUNBVE9SKSA9PSAxKQorICB7CisgICAgaWYgKCFtYXBwaW5ncChwcm90X2NsYXNzZXMpKSBwcm90X2NsYXNzZXM9bV9hbGxvY2F0ZSgxKTsKKyAgICBwcm90X2NsYXNzZXNbQ0xfQU5JTUFMXSA9IGVmZmVrdC8yMDsKKyAgICB0ZWxsX29iamVjdChlbnZpcm9ubWVudCgpLCBicmVha19zdHJpbmcoCisgICAgICAgICJEdSBoYXN0IGRhcyBHZWZ1ZWhsLCBkYXNzIEFydGVtaXMgaWhyZSBzY2h1ZXR6ZW5kZSBIYW5kICIKKyAgICAgICAgKyBudW0yZGVzY19maWdodChlZmZla3QpCisgICAgICAgICsgIiB1ZWJlciBEaWNoIGhhZWx0LiIsNzgpKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworcHJpdmF0ZSBpbnQgYWN0X2F0dHJfcHJvdF9tYWdpY2FsKGludCBlZmZla3QpCit7CisgIGlmIChyZWdfaG9vayhIX0hPT0tfREVGRU5ELCBIX0RBVEFfTU9ESUZJQ0FUT1IpID09IDEpCisgIHsKKyAgICBpZiAoIW1hcHBpbmdwKHByb3RfY2xhc3NlcykpIHByb3RfY2xhc3Nlcz1tX2FsbG9jYXRlKDQpOworICAgIHByb3RfY2xhc3Nlc1tDTF9EUkFHT05dID0gcHJvdF9jbGFzc2VzW0NMX0VMRU1FTlRBTF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHByb3RfY2xhc3Nlc1tDTF9TSEFET1ddCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBwcm90X2NsYXNzZXNbQ0xfSUxMVVNJT05dCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBlZmZla3QvMjA7CisgICAgdGVsbF9vYmplY3QoZW52aXJvbm1lbnQoKSwgYnJlYWtfc3RyaW5nKAorICAgICAgICAiRHUgaGFzdCBkYXMgR2VmdWVobCwgZGFzcyB2b24gSGVrYXRlIGJlc2NoZW5rdGUgV2VzZW5oZWl0ZW4gRGlyICIKKyAgICAgICAgK251bTJkZXNjX2ZpZ2h0KGVmZmVrdCkKKyAgICAgICAgKyAiIHdlbmlnZXIgYW5oYWJlbiBrb2VubmVuLiIsNzgpKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworcHJpdmF0ZSBpbnQgYWN0X2F0dHJfcHJvdF91bmRlYWQoaW50IGVmZmVrdCkKK3sKKyAgaWYgKHJlZ19ob29rKEhfSE9PS19ERUZFTkQsIEhfREFUQV9NT0RJRklDQVRPUikgPT0gMSkKKyAgeworICAgIC8vIFpvbWJpZXMsIFNrZWxldHRlLCBHaHVsZS4uLgorICAgIGlmICghbWFwcGluZ3AocHJvdF9jbGFzc2VzKSkgcHJvdF9jbGFzc2VzPW1fYWxsb2NhdGUoMSk7CisgICAgcHJvdF9jbGFzc2VzW0NMX1VOREVBRF0gPSAgZWZmZWt0LzIwOworICAgIHRlbGxfb2JqZWN0KGVudmlyb25tZW50KCksIGJyZWFrX3N0cmluZygKKyAgICAgICAgIkR1IGJpc3QgcGxvZXR6bGljaCB6dXZlcnNpY2h0bGljaCwgQW5ncmlmZmVuIGRlciBLcmVhdHVyZW4gIgorICAgICAgICAiZGVzIEhhZGVzICIKKyAgICAgICAgKyBudW0yZGVzY19maWdodChlZmZla3QpCisgICAgICAgICsgIiBiZXNzZXIgd2lkZXJzdGVoZW4genUga29lbm5lbi4iLDc4KSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKworcHJpdmF0ZSBpbnQgYWN0X2F0dHJfdHJhZ2VuKGludCBlZmZla3QpCit7CisgIGlmICggSVNfTEVBUk5FUihlbnZpcm9ubWVudCgpKSApCisgICAgdGVsbF9vYmplY3QoZW52aXJvbm1lbnQoKSwgc3ByaW50ZigiZWZmZWt0OiAlZFxuIixlZmZla3QpKTsKKyAgU2V0UHJvcChQX1dFSUdIVCwgUXVlcnlQcm9wKFBfV0VJR0hUKSAtIGVmZmVrdCo0KTsKKyAgdGVsbF9vYmplY3QoZW52aXJvbm1lbnQoKSwKKyAgICAgIEJTKCJEdSBmdWVobHN0IERpY2ggcGxvZXR6bGljaCAiK251bTJkZXNjKGVmZmVrdCkKKyAgICAgICAgKyAoZWZmZWt0PjAgPyAiIGVudGxhc3RldCIgOiAiIGJlbGFzdGV0IikgKyAiLiIpKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIEJlcmVjaG5ldCBlaW5lIG1heC4gVmVyem9lZ2VydW5nIGRlciBXaXJrdW5nIGFiaGFlbmdpZyB2b24gZGVyIFdpcmt1bmcgdW5kCisvLyBlaW5lciBXaXJrc2Nod2VsbGUuIERlciByZWwuIEFic3RhbmQgdm9uIGRlciBXaXJrc2Nod2VsbGUgKHJlbGF0aXYgenVtIG1heC4KKy8vIG1vZWdsaWNoZW4gQWJzdGFuZCkgd2lyZCBoaWVyYmVpIGdlbnV0enQuIEF1c3NlcmRlbSBpc3QgZGllIG1heC4KKy8vIFZlcnpvZWdlcnVuZyBuYXR1ZXJsaWNoIGRpZSBXaXJrdW5nc2RhdWVyIGRlcyBUcmFua2VzLgorLy8gPGR1cmF0aW9uPiBtdXNzIGltIFRyYW5rIHNjaG9uIGdlc2V0enQgc2Vpbi4KK3ByaXZhdGUgaW50IGNhbGNfbWF4X2RlbGF5KGludCBlZmZla3QsIGludCB3aXJrc2Nod2VsbGUpCit7CisgIGludCBhYnN0YW5kID0gYWJzKGVmZmVrdCAtIHdpcmtzY2h3ZWxsZSk7CisgIGlmICghZHVyYXRpb24pIGR1cmF0aW9uID0gdGltZSgpKzYwMDsKKyAgaWYgKCBJU19MRUFSTkVSKGVudmlyb25tZW50KCkpICkKKyAgICBwcmludGYoImNhbGNfbWF4X2RlbGF5OiAlZFxuIiwoKGR1cmF0aW9uLXRpbWUoKSkgKiBhYnN0YW5kKSAvCisgICAgICAoMjAwMC1hYnMod2lya3NjaHdlbGxlKSkpOworICByZXR1cm4gKChkdXJhdGlvbi10aW1lKCkpICogYWJzdGFuZCkgLyAoMjAwMC1hYnMod2lya3NjaHdlbGxlKSk7Cit9CisKKy8vVE9ETzogZGllIFplaXR2ZXJ6b2VnZXJ1bmcgaXN0IG5lbiBuZXR0ZXIgRWZmZWt0LCBhYmVyIHplaXR2ZXJnem9lZ2VydGUKKy8vVHBvcnRzIHNpbmQgb2VmdGVyIGtlaW5lIGd1dGUgSWRlZSAtPiBub2NoIHBydWVmZW4KKy8vVE9ETzogRGllIFplaXR2ZXJ6b2VnZXJ1bmcgYmVpIE5PX1RQT1JUX09VVCBhdWNoIG5vY2htYWwgcHJ1ZWZlbgorcHJpdmF0ZSBpbnQgYWN0X2F0dHJfZmxlZV90cG9ydChpbnQgZWZmZWt0KQoreworICAvLyBlZmZla3QgPiAwIHRlbGVwb3J0aWVydCBzb2ZvcnQgenUgaGFsYndlZ3Mgc2ljaGVyZW4gT3J0ZW4KKyAgLy8gLTc1MCA8PSBlZmZla3QgPCAwIHRlbGVwb3J0aWVydCBhdWNoIHNvZm9ydCB6dSBuaWNodCBzbyBkb2xsZW4gT3J0ZW4KKyAgLy8gLTIwMDAgPD0gZWZmZWt0IDwgLTc1MCB0ZWxlcG9ydGllcnQgc3BhZXRlciB6dSBibG9lZGVuIE9ydGVuCisgIGlmIChlZmZla3QgPCAtNzUwICYmIGVmZmVrdCA+PSAtMjAwMCkKKyAgeworICAgIC8vIFZlcnpvZWdlcnVuZyBhdXNyZWNobmVuIHVuZCBkaWVzIGhpZXIgcGVyIGNhbGxfb3V0IG5vY2htYWwgbWl0IGVpbmVtCisgICAgLy8gZWZmZWt0IHJ1ZmVuLCBkZXIgZWluZSBpbnN0YW50YW5lIFJlYWt0aW9uIGF1c2xvZXN0LgorICAgIC8vIGVmZmVrdCAtIDIwMDAgaXN0IGVpbiBIYWNrLCBkYW1pdCBuaWNodCBub2NobWFsIHZlcnpvZWdlcnQgd2lyZC4KKyAgICBjYWxsX291dCgjJ2FjdF9hdHRyX2ZsZWVfdHBvcnQsCisgICAgICAgIHJhbmRvbShjYWxjX21heF9kZWxheShlZmZla3QsIC03NTApKSsxLCBlZmZla3QgLSAyMDAwKTsKKyAgICB0ZWxsX29iamVjdChlbnZpcm9ubWVudCgpLAorICAgICAgICAiRGVpbmUgVW1nZWJ1bmcgZnVlaGx0IHNpY2ggbmFjaCB1bmQgbmFjaCB1bndpcmtsaWNoZXIgYW4uXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIC8vIEVmZmVrdGUgaW5zdGFudGFuIGF1c2xvZXNlbi4KKworICAvLyB3ZW5uIGhpZXIga2VpbiBQX05PX1RQT1JUIGVybGF1YnQgaXN0LCBtYWwgZ3Vja2VuLCBvYiB3aXIgc3BhZXRlciBub2NoCisgIC8vIHplaXQgaGFiZW4uCisgIGlmIChlbnZpcm9ubWVudChlbnZpcm9ubWVudCgpKS0+UXVlcnlQcm9wKFBfTk9fVFBPUlQpPT1OT19UUE9SVF9PVVQpCisgIHsKKyAgICB0ZWxsX29iamVjdChlbnZpcm9ubWVudCgpLAorICAgICAgICBCUygiSXJnZW5kZXR3YXMgaGFlbHQgRGljaCBhbiBkaWVzZW0gT3J0IGZlc3QuIikpOworICAgIGludCBkZWxheSA9IGR1cmF0aW9uIC0gdGltZSgpOworICAgIC8vIHdlbm4gbm9jaCBnZW51ZyBSZXN0emVpdCwgbm9jaG1hbCB2ZXJzdWNoZW4sIHNvbnN0IG5peCBtYWNoZW4uCisgICAgaWYgKGRlbGF5PjEwKQorICAgIHsKKyAgICAgIC8vIEFOL1RPRE86IEthbm4gZGFzIG5pY2h0IGF1Y2ggemllbWxpY2ggbGFuZyBzZWluPworICAgICAgY2FsbF9vdXQoIydhY3RfYXR0cl9mbGVlX3Rwb3J0LCByYW5kb20oZGVsYXkpLCBlZmZla3QpOworICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vIGRlbiBIYWNrIHZvbiBvYmVuIHJ1ZWNrZ2FlbmdpZyBtYWNoZW4sIHdpciBicmF1Y2hlbiBkZW4gb3JpZ2luYWxlbgorICAvLyBFZmZla3R3ZXJ0IHp1cnVlY2suCisgIGlmIChlZmZla3QgPCAtMjAwMCkKKyAgICBlZmZla3QgKz0gMjAwMDsKKworICBzdHJpbmcqIGRlc3RzOworICBpZiAoIGVmZmVrdCA+IDAgKQorICB7CisgICAgc3dpdGNoKGVmZmVrdCkKKyAgICB7CisgICAgICBjYXNlIDAuLjQ5OToKKyAgICAgICAgZGVzdHMgPSAoeyIvZC9pbnNlbG4vemVzc3RyYS92dWxrYW53ZWcvcm9vbS9yMSIsCisgICAgICAgICAgICAgICAgICAiL2QvZmVybndlc3QvbGkveGlhbi9sYWIyL2dyYWIyIiwKKyAgICAgICAgICAgICAgICAgICIvZC9lYmVuZS9taXJpbC9zY2hsb3NzL2hlaWRlMTEiLAorICAgICAgICAgICAgICAgICAgIi9kL3BvbGFyL2FsbGUvcm9vbS93ZWc0XzE1IiwKKyAgICAgICAgICAgICAgICAgICIvZC9kc2NodW5nZWwvYXJhdGhvcm4vdGVtcGVsL3Jvb20vdDQtNSIsCisgICAgICAgICAgICAgICAgICAiL2QvYW5mYWVuZ2VyL2FyYXRob3JuL21pbml0dXQvcm9vbS9odWV0dGVfIisKKyAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoKS0+cXVlcnlfcmVhbF9uYW1lKCksCisgICAgICAgICAgICAgICAgIH0pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNTAwLi43NDk6CisgICAgICAgIGRlc3RzID0gKHsiL2QvZWJlbmUvYmVydHJhbS9lYmVuZS93YXNzZXI4IiwKKyAgICAgICAgICAgICAgICAgICIvZC9lYmVuZS9yb29tL2dlYnVlc2NoMl8zIiwKKyAgICAgICAgICAgICAgICAgICIvZC9wb2xhci9hbGxlL3Jvb20vZWlzd3Vlc3RlL2Vpc3d1ZXN0ZVs0LDZdIiwKKyAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmIChlbnZpcm9ubWVudCgpLT5RdWVyeVByb3AoUF9SRUFMX1JBQ0UpIT0iRHVua2VsZWxmIikKKyAgICAgICAgICBkZXN0cyArPSAoeyIvZC91bnRlcndlbHQvcGFkcmVpYy9rbmVpcGUva25laXBlIn0pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNzUwLi45OTk6CisgICAgICAgIGRlc3RzID0gKHsiL2QvZ2ViaXJnZS9zaWx2YW5hL2Nyb25vZXJ0YWwvcm9vbS90ZjQiLAorICAgICAgICAgICAgICAgICAgIi9kL2luc2Vsbi9zY2hpZmZlL2Zsb3NzIiwKKyAgICAgICAgICAgICAgICAgICIvZC9wb2xhci9odW1uaS9oZXhlbi9yb29tL2xldWNodGthbW1lciIsCisgICAgICAgICAgICAgICAgICAiL2QvcG9sYXIvZ2FieWxvbi90ZW1vbmcvcm9vbXMvYW5sZWdlc3RlbGxlIiwKKyAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMDAwLi4xMjQ5OgorICAgICAgICBkZXN0cyA9ICh7Ii9kL2Zlcm53ZXN0L3NoaW5vYmkva29uZnVfcXVlc3Qvcm9vbS9pbnNlbDQiLAorICAgICAgICAgICAgICAgICAgIi9kL2Zlcm53ZXN0L3Vsby9tdXJhL3Rva29yby9oYXVzNCIsCisgICAgICAgICAgICAgICAgICAiL2QvZWJlbmUvcm9vbS9IYWxsZS9zaGFsbGUxNCIsCisgICAgICAgICAgICAgICAgIH0pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTI1MC4uMTQ5OToKKyAgICAgICAgZGVzdHMgPSAoeyIvZC9nZWJpcmdlL3NpbHZhbmEvY3Jvbm9lcnRhbC9yb29tL3RmNCIsCisgICAgICAgICAgICAgICAgICAiL2dpbGRlbi96YXViZXJlciIsCisgICAgICAgICAgICAgICAgICAiL2QvZ2ViaXJnZS9nZW9yZy9yb29tL3cxMSIKKyAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxNTAwLi4xNzQ5OgorICAgICAgICBkZXN0cyA9ICh7Ii9naWxkZW4vYmllcnNjaHVldHRsZXIiLAorICAgICAgICAgICAgICAgICAgIi9naWxkZW4va2FlbXBmZXIiLAorICAgICAgICAgICAgICAgICAgIi9kL3dhbGQvZ3VuZHVyL2hvYmJpdGRvcmYvc2NocmVpbiIsCisgICAgICAgICAgICAgICAgICAiL2QvdmxhbmQvbW9yZ290aC9yb29tL2NpdHkvcmF0aGFsbGUiLAorICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBkZXN0cyA9ICh7ZW52aXJvbm1lbnQoKS0+UXVlcnlQcm9wKFBfU1RBUlRfSE9NRSl8fAorICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudCgpLT5RdWVyeURlZmF1bHRIb21lKCksCisgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudCgpLT5RdWVyeURlZmF1bHRIb21lKCksCisgICAgICAgICAgICAgICAgICAiL2QvZWJlbmUvcm9vbS9Qb3J0VmFpbi9wb19oYWYyIiwKKyAgICAgICAgICAgICAgICAgICIvZC9nZWJpcmdlL3Jvb20vaGUzeDMiLAorICAgICAgICAgICAgICAgICAgIi9kL2ViZW5lL3Jvb20vaHVldHRlIiwKKyAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIGlmICggZWZmZWt0IDwgMCApCisgIHsKKyAgICBzd2l0Y2goZWZmZWt0KQorICAgIHsKKyAgICAgIGNhc2UgLTQ5OS4uMDoKKyAgICAgICAgZGVzdHMgPSAoeyIvZC9wb2xhci9iZW5kZWlnaWQvcm9vbXMvbmVza2F5YS9uZXNrYXkxMiIsCisgICAgICAgICAgICAgICAgICAiL3BsYXllcnMva2V0b3MvZ2wvcm9vbS9nbDF4MSIsCisgICAgICAgICAgICAgICAgICAiL2QvaW5zZWxuL3plc3N0cmEvdnVsa2Fud2VnL3Jvb20vcjEwIiwKKyAgICAgICAgICAgICAgICAgICIvZC92bGFuZC9tb3Jnb3RoL3Jvb20va2F0YS9rdGFua2UiLAorICAgICAgICAgICAgICAgICAgIi9kL2ViZW5lL3phcmRvei9idXJnL2ZldWVycmF1IiwKKyAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAtOTk5Li4tNTAwOgorICAgICAgICBkZXN0cyA9ICh7Ii9kL2ViZW5lL3Jvb20vSG9laGxlL2hnNiIsCisgICAgICAgICAgICAgICAgICAiL2QvZ2ViaXJnZS9zaWx2YW5hL3dhcm9rL3Jvb20vbDMvd2FfM3g3IiwKKyAgICAgICAgICAgICAgICAgICIvZC92bGFuZC9tb3Jnb3RoL3Jvb20va2F0YS94a2F0MDMiLAorICAgICAgICAgICAgICAgICAgIi9kL3ZsYW5kL21vcmdvdGgvcm9vbS9rYXRhL2thdGE1IiwKKyAgICAgICAgICAgICAgICAgICIvZC93YWxkL3lvcnUvb3J0L2RyYXZpL3dlZzUiLAorICAgICAgICAgICAgICAgICAgIi9kL3dhbGQvYXRhbXVyL3Jvb20vZTgzIiwKKyAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAtMTQ5OS4uLTEwMDA6CisgICAgICAgIGRlc3RzID0gKHsiL2QvcG9sYXIvYmVuZGVpZ2lkL3Jvb21zL3Bhc3MvcGFzc19lMSIsCisgICAgICAgICAgICAgICAgICAiL2QvZWJlbmUvcm9vbS9nZWJ1ZXNjaCIsCisgICAgICAgICAgICAgICAgICAiL2QvZ2ViaXJnZS9zaWx2YW5hL3dhcm9rL3Jvb20vbDEvd2FfMXg2IiwKKyAgICAgICAgICAgICAgICAgICIvZC92bGFuZC9tb3Jnb3RoL3Jvb20va2F0YS9na2F0MTciLAorICAgICAgICAgICAgICAgICAgIi9kL3dhbGQvYXRhbXVyL3Jvb20vZTEyIiwKKyAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmIChlbnZpcm9ubWVudCgpLT5RdWVyeVByb3AoUF9SRUFMX1JBQ0UpPT0iRHVua2VsZWxmIikKKyAgICAgICAgICBkZXN0cyArPSAoeyIvZC91bnRlcndlbHQvcGFkcmVpYy9rbmVpcGUva25laXBlIn0pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgLTE3NDkuLi0xNTAwOgorICAgICAgICBkZXN0cyA9ICh7Ii9kL2RzY2h1bmdlbC93dXJ6ZWwvdDIiLAorICAgICAgICAgICAgICAgICAgIi9kL3ZsYW5kL21vcmdvdGgvcm9vbS9rYXRhL3VrYXQyNiIsCisgICAgICAgICAgICAgICAgICAiL2QvdmxhbmQvbW9yZ290aC9yb29tL2thdGEvaDEyIiwKKyAgICAgICAgICAgICAgICAgICIvZC9nZWJpcmdlL2JvaW5nL3NtL2w1L201eDIiLAorICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKGVudmlyb25tZW50KCktPlF1ZXJ5UHJvcChQX0dVSUxEKT09ImNoYW9zIikKKyAgICAgICAgICBkZXN0cys9KHsiL2dpbGRlbi9rbGVydXMifSk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZGVzdHMgPSAoeyIvZC9lYmVuZS9yb2NodXMvcm9vbS9zcDEwIiwKKyAgICAgICAgICAgICAgICAgICIvZC9lYmVuZS9yb2NodXMvcXVlc3RfM3BsYXllci9yb29tL3NjaGFjaHQxMCIsCisgICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIElTX1NFRVIoZW52aXJvbm1lbnQoKSkgKQorICAgICAgICAgIGRlc3RzICs9ICh7Ii9kL3dhbGQvcGFyYWNlbHN1cy9mcm9vbS9zY2hfNmUiLAorICAgICAgICAgICAgICAgICAgICAgIi9kL3dhbGQvcGFyYWNlbHN1cy9mcm9vbS9zY2hfOXgiLAorICAgICAgICAgICAgICAgICAgICAgIi9kL3dhbGQvcGFyYWNlbHN1cy9mcm9vbS9zY2gyXzZkIiwKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICB0ZWxsX29iamVjdChlbnZpcm9ubWVudCgpLAorICAgICAgQlMoIkVpbmUgS3JhZnQgemVycnQgYW4gRGlyLCBkaWUgV2VsdCB2ZXJzY2h3aW1tdC4uLiIpKTsKKyAgaWYgKGVudmlyb25tZW50KCktPm1vdmUoZGVzdHNbcmFuZG9tKHNpemVvZihkZXN0cykpXSxNX1RQT1JUKSA9PSBNT1ZFX09LKQorICAgIHRlbGxfb2JqZWN0KGVudmlyb25tZW50KCksCisgICAgICAgICJFaW5lbiBNb21lbnQgc3BhZXRlciBiaXN0IER1IGdhbnogd29hbmRlcnMuXG4iKTsKKyAgZWxzZQorICAgIHRlbGxfb2JqZWN0KGVudmlyb25tZW50KCksCisgICAgICAgICJBYmVyIHNvbnN0IHBhc3NpZXJ0IG5pY2h0cy5cbiIpOworICByZXR1cm4gMTsKK30KKworcHJpdmF0ZSBpbnQgYWN0X2F0dHJfY2hhbmdlX2RpbWVuc2lvbihpbnQgZWZmZWt0KQoreworICAvLyBudXIgZWZmZWt0ID49IDEwMDAgYWVuZGVybiBkaWUgRGltZW5zaW9uIGluc3RhbnRhbi4gOy0pCisgIGlmIChlZmZla3QgPiAwICYmIGVmZmVrdCA8IDEwMDApCisgIHsKKyAgICAvLyBWZXJ6b2VnZXJ1bmcgYXVzcmVjaG5lbiB1bmQgZGllcyBoaWVyIHBlciBjYWxsX291dCBub2NobWFsIG1pdCBlaW5lbQorICAgIC8vIGVmZmVrdCBydWZlbiwgZGVyIGVpbmUgaW5zdGFudGFuZSBSZWFrdGlvbiBhdXNsb2VzdC4KKyAgICBjYWxsX291dCgjJ2FjdF9hdHRyX2NoYW5nZV9kaW1lbnNpb24sCisgICAgICAgIHJhbmRvbShjYWxjX21heF9kZWxheShlZmZla3QsMTAwMCkpKzEsIDEwMDApOworICAgIHRlbGxfb2JqZWN0KGVudmlyb25tZW50KCksQlMoIlVtIERpY2ggaGVydW0gd2lyZCBhbGxlcyAiCisgICAgICAgICJsYW5nc2FtIGdyYXVlci5cbiIpKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICAvLyBudXIgLTYwMCA8IGVmZmVrdCA8IDAgYWVuZGVybiBkaWUgRGltZW5zaW9uIGluc3RhbnRhbiA7LSkKKyAgaWYgKGVmZmVrdCA8IC02MDApCisgIHsKKyAgICAvLyBWZXJ6b2VnZXJ1bmcgYXVzcmVjaG5lbiB1bmQgZGllcyBoaWVyIHBlciBjYWxsX291dCBub2NobWFsIG1pdCBlaW5lbQorICAgIC8vIGVmZmVrdCBydWZlbiwgZGVyIGVpbmUgaW5zdGFudGFuZSBSZWFrdGlvbiBhdXNsb2VzdC4KKyAgICBjYWxsX291dCgjJ2FjdF9hdHRyX2NoYW5nZV9kaW1lbnNpb24sCisgICAgICAgIHJhbmRvbShjYWxjX21heF9kZWxheShlZmZla3QsIC02MDApKSsxLCAtNjAxKTsKKyAgICB0ZWxsX29iamVjdChlbnZpcm9ubWVudCgpLEJTKCJVbSBEaWNoIGhlcnVtIHdpcmQgYWxsZXMgIgorICAgICAgICAibGFuZ3NhbSBncmF1ZXIuXG4iKSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgLy8gRWZmZWt0ZSBpbnN0YW50YW4gYXVzbG9lc2VuLgorICAvLyB3ZW5uIGhpZXIga2VpbiBQYXJhLVRyYW5zIGVybGF1YnQgaXN0LCBtYWwgZ3Vja2VuLCBvYiB3aXIgc3BhZXRlciBub2NoCisgIC8vIHplaXQgaGFiZW4uCisgIGlmIChlbnZpcm9ubWVudChlbnZpcm9ubWVudCgpKS0+UXVlcnlQcm9wKFBfTk9fUEFSQV9UUkFOUykpCisgIHsKKyAgICBpbnQgZGVsYXkgPSBkdXJhdGlvbiAtIHRpbWUoKTsKKyAgICAvLyB3ZW5uIG5vY2ggZ2VudWcgUmVzdHplaXQsIG5vY2htYWwgdmVyc3VjaGVuLCBzb25zdCBuaXggbWFjaGVuLgorICAgIGlmIChkZWxheT4xMCkKKyAgICB7CisgICAgICBjYWxsX291dCgjJ2FjdF9hdHRyX2NoYW5nZV9kaW1lbnNpb24sIHJhbmRvbShkZWxheSksIGVmZmVrdCk7CisgICAgICB0ZWxsX29iamVjdChlbnZpcm9ubWVudCgpLCBCUygiRGllIFdlbHQgdW0gRGljaCB3aXJkIGVpbiAiCisgICAgICAgICAgICAid2VuaWcgZ3JhdWVyLiIpKTsKKyAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKCBlZmZla3QgPiAwICkKKyAgeworICAgIGlmICggZW52aXJvbm1lbnQoKS0+UXVlcnlQcm9wKFBfUEFSQSkgPiAwICkKKyAgICB7CisgICAgICBlbnZpcm9ubWVudCgpLT5TZXRQcm9wKFBfUEFSQSwgMCk7CisgICAgICB0ZWxsX29iamVjdChlbnZpcm9ubWVudCgpLCBCUygiRnVlciBlaW5lbiBrdXJ6ZW4gTW9tZW50IHNpZWhzdCBEdSBudXIgIgorICAgICAgICAgICJlaW4gZ3JhdWVzIFdhYmVybiB1bSBEaWNoIGhlcnVtLCBiZXZvciBkaWUgV2VsdCB3aWVkZXIgIgorICAgICAgICAgICJub3JtYWwgYXVzc2llaHQuXG4iKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICB0ZWxsX29iamVjdChlbnZpcm9ubWVudCgpLCBCUygiRnVlciBlaW5lbiBrdXJ6ZW4gTW9tZW50IHNpZWh0IGFsbGVzIHVtICIKKyAgICAgICAgICAgICJEaWNoIGhlcnVtIGdyYXUgYXVzLiIpKTsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoIGVmZmVrdCA8IDAgKQorICB7CisgICAgaWYgKCAhZW52aXJvbm1lbnQoKS0+UXVlcnlQcm9wKFBfUEFSQSkgKQorICAgIHsKKyAgICAgIGVudmlyb25tZW50KCktPlNldFByb3AoUF9QQVJBLCAxKTsKKyAgICAgICB0ZWxsX29iamVjdChlbnZpcm9ubWVudCgpLCBCUygiRnVlciBlaW5lbiBrdXJ6ZW4gTW9tZW50IHNpZWhzdCBEdSBudXIgIgorICAgICAgICAgICJlaW4gZ3JhdWVzIFdhYmVybiB1bSBEaWNoIGhlcnVtLCBiZXZvciBkaWUgV2VsdCB3aWVkZXIgIgorICAgICAgICAgICJub3JtYWwgYXVzc2llaHQuIEFiZXIgZXMgYmxlaWJ0IGVpbiB1bmd1dGVzIEdlZnVlaGwuXG4iKSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgdGVsbF9vYmplY3QoZW52aXJvbm1lbnQoKSwgQlMoIkZ1ZXIgZWluZW4ga3VyemVuIE1vbWVudCBzaWVodCBhbGxlcyB1bSAiCisgICAgICAgICAgICAiRGljaCBoZXJ1bSBncmF1IGF1cy4iKSk7CisgICAgfQorICB9CisgIHJldHVybiAxOworfQorCitwcml2YXRlIGludCBhY3RfYXR0cl9kZWZyb2coaW50IGVmZmVrdCkKK3sKKyAgLy8gbnVyIGVmZmVrdCA+IDEwMDAgZW50ZnJvc2NodCBpbnN0YW50YW4uIDstKQorICBpZiAoZWZmZWt0ID4gMCAmJiBlZmZla3QgPCAxMDAwKQorICB7CisgICAgLy8gVmVyem9lZ2VydW5nIGF1c3JlY2huZW4gdW5kIGRpZXMgaGllciBwZXIgY2FsbF9vdXQgbm9jaG1hbCBtaXQgZWluZW0KKyAgICAvLyBlZmZla3QgcnVmZW4sIGRlciBlaW5lIGluc3RhbnRhbmUgUmVha3Rpb24gYXVzbG9lc3QuCisgICAgY2FsbF9vdXQoIydhY3RfYXR0cl9kZWZyb2csIHJhbmRvbShjYWxjX21heF9kZWxheShlZmZla3QsMTAwMCkpKzEsIDEwMDApOworICAgIHRlbGxfb2JqZWN0KGVudmlyb25tZW50KCksQlMoCisgICAgICAgICJEdSBob2Vyc3QgcGxvZXR6bGljaCBsYXV0ZXMgR2VxdWFrZSwgd2FzIGxhbmdzYW0gaW1tZXIgbGVpc2VyICIKKyAgICAgICAgIndpcmQuXG4iKSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgLy8gbnVyIC01MDAgPCBlZmZla3QgPCAwIGZyb3NjaHQgaW5zdGFudGFuIDstKQorICBpZiAoZWZmZWt0IDwgLTUwMCkKKyAgeworICAgIC8vIFZlcnpvZWdlcnVuZyBhdXNyZWNobmVuIHVuZCBkaWVzIGhpZXIgcGVyIGNhbGxfb3V0IG5vY2htYWwgbWl0IGVpbmVtCisgICAgLy8gZWZmZWt0IHJ1ZmVuLCBkZXIgZWluZSBpbnN0YW50YW5lIFJlYWt0aW9uIGF1c2xvZXN0LgorICAgIGNhbGxfb3V0KCMnYWN0X2F0dHJfZGVmcm9nLCByYW5kb20oY2FsY19tYXhfZGVsYXkoZWZmZWt0LCAtNTAwKSkrMSwgLTUwMSk7CisgICAgdGVsbF9vYmplY3QoZW52aXJvbm1lbnQoKSxCUygKKyAgICAgICAgIkR1IGhvZXJzdCBwbG9ldHpsaWNoIGdhbnogbGVpc2VzcyBHZXF1YWtlLCB3YXMgbGFuZ3NhbSBpbW1lciBsYXV0ZXIgIgorICAgICAgICAid2lyZC5cbiIpKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIC8vIEVmZmVrdGUgaW5zdGFudGFuIGF1c2xvZXNlbi4KKyAgaWYgKCBlZmZla3QgPiAwICkKKyAgeworICAgIGlmICggZW52aXJvbm1lbnQoKS0+UXVlcnlQcm9wKFBfRlJPRykgKQorICAgIHsKKyAgICAgIGVudmlyb25tZW50KCktPlNldFByb3AoUF9GUk9HLDApOworICAgICAgdGVsbF9vYmplY3QoUEwsICJEdSBmdWVobHN0IERpY2ggZGV1dGxpY2ggd2VuaWdlciBncnVlbi5cbiIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgdGVsbF9vYmplY3QoZW52aXJvbm1lbnQoKSwgYnJlYWtfc3RyaW5nKCJEaWUgV2VsdCB1bSBEaWNoIGhlcnVtIHZlcmxpZXJ0ICIKKyAgICAgICAgInBsb2V0emxpY2ggYWxsZSBncnVlbmVuIEZhcmJ0b2VuZSwgZGllIGJhbGQgZGFyYXVmIGFsbG1hZWhsaWNoICIKKyAgICAgICAgInp1cnVlY2trZWhyZW4uIiw3OCkpOworICAgIH0KKyAgfQorICBlbHNlIGlmICggZWZmZWt0IDwgMCApIHsKKyAgICBpZiAoICFlbnZpcm9ubWVudCgpLT5RdWVyeVByb3AoUF9GUk9HKSApIHsKKyAgICAgIGVudmlyb25tZW50KCktPlNldFByb3AoUF9GUk9HLCAxKTsKKyAgICAgIHRlbGxfb2JqZWN0KGVudmlyb25tZW50KCksICJRdWFrIVxuIik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgdGVsbF9vYmplY3QoZW52aXJvbm1lbnQoKSwgYnJlYWtfc3RyaW5nKCJEZWluZSBTaWNodCB2ZXJzY2h3aW1tdCwgYWxsZXMgd2lyZCAiCisgICAgICAgICJpbnRlbnNpdiBncnVlbi4gTWVya3d1ZXJkaWcuIFp1bSBHbHVlY2sgaXN0IGRhcyBzY2huZWxsIHdpZWRlciAiCisgICAgICAgICJ2b3JiZWkuIiw3OCkpOworICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKworcHJpdmF0ZSBpbnQgYWN0X2F0dHJfaGVhbF9scChpbnQgZWZmZWt0KQoreworICBpZiAoZWZmZWt0ID4gMCkKKyAgeworICAgIHRlbGxfb2JqZWN0KGVudmlyb25tZW50KCksCisgICAgICAgIEJTKCJEdSBmdWVobHN0IERpY2ggc2NobGFnYXJ0aWcgIitudW0yZGVzYyhlZmZla3QpCisgICAgICAgICAgKyAiIGJlc3Nlci4iKSk7CisgICAgZW52aXJvbm1lbnQoKS0+cmVzdG9yZV9oaXRfcG9pbnRzKGVmZmVrdC8xMCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgdGVsbF9vYmplY3QoZW52aXJvbm1lbnQoKSwKKyAgICAgICAgQlMoIkR1IGZ1ZWhsc3QgRGljaCBzY2hsYWdhcnRpZyAiK251bTJkZXNjKGVmZmVrdCkKKyAgICAgICAgICArICIgc2NobGVjaHRlci4iKSk7CisgICAgZW52aXJvbm1lbnQoKS0+ZG9fZGFtYWdlKC1lZmZla3QvMTApOworICB9CisgIHJldHVybiAxOworfQorCitwcml2YXRlIGludCBhY3RfYXR0cl9oZWFsX3NwKGludCBlZmZla3QpCit7CisgIGlmIChlZmZla3QgPiAwKQorICB7CisgICAgdGVsbF9vYmplY3QoZW52aXJvbm1lbnQoKSwKKyAgICAgICAgQlMoIkR1IGZ1ZWhsc3QgRGljaCBzY2hsYWdhcnRpZyAiK251bTJkZXNjKGVmZmVrdCkKKyAgICAgICAgICArICIga29uemVudHJpZXJ0ZXIuIikpOworICAgIGVudmlyb25tZW50KCktPnJlc3RvcmVfc3BlbGxfcG9pbnRzKGVmZmVrdC8xMCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgdGVsbF9vYmplY3QoZW52aXJvbm1lbnQoKSwKKyAgICAgICAgQlMoIkR1IGZ1ZWhsc3QgRGljaCBzY2hsYWdhcnRpZyAiK251bTJkZXNjKGVmZmVrdCkKKyAgICAgICAgICArICIgdW5rb256ZW50cmllcnRlci4iKSk7CisgICAgZW52aXJvbm1lbnQoKS0+cmVkdWNlX3NwZWxsX3BvaW50cygtZWZmZWt0LzEwKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworCitwcml2YXRlIGludCBtb2RpZnlfc2Eoc3RyaW5nIHNhLCBpbnQgZWZmZWt0KQoreworICBzdHJpbmcgbXNnOworICBzd2l0Y2ggKHNhKQorICB7CisgICAgY2FzZSBTQV9TUEVFRDoKKyAgICAgIG1zZyA9ICJEdSB3aXJzdCBnZXJhZGUgIiArIG51bTJkZXNjKGVmZmVrdCkKKyAgICAgICAgICAgICsoZWZmZWt0PjAgPyAiIHNjaG5lbGxlci4iIDogIiBsYW5nc2FtZXIuIik7CisgICAgICBlZmZla3QgPSAoZWZmZWt0ICogMzApIC8gMjAwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0FfRFVSQVRJT046CisgICAgICBtc2cgPSAiRHUgd2lyc3QgZ2VyYWRlICIgKyBudW0yZGVzYyhlZmZla3QpCisgICAgICAgICAgICArKGVmZmVrdD4wID8gIiBhdXNkYXVlcm5kZXIuIgorICAgICAgICAgICAgICAgICAgICAgICA6ICIgd2VuaWdlciBhdXNkYXVlcm5kLiIpOworICAgICAgZWZmZWt0ID0gKGVmZmVrdCAqIDI1KSAvIDIwMDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNBX1NQRUxMX1BFTkVUUkFUSU9OOgorICAgICAgbXNnID0gIkRlaW5lIGdlaXN0aWdlIER1cmNoc2V0enVuZ3NrcmFmdCBoYXQgc2ljaCBnZXJhZGUgIgorICAgICAgICAgICAgKyBudW0yZGVzYyhlZmZla3QpCisgICAgICAgICAgICArKGVmZmVrdD4wID8gIiB2ZXJiZXNzZXJ0LiIgOiAiIHZlcnNjaGxlY2h0ZXJ0LiIpOworICAgICAgZWZmZWt0ID0gKGVmZmVrdCAqIDMwKSAvIDIwMDA7CisgICAgICBicmVhazsKKyAgfQorICBpZiAoZW52aXJvbm1lbnQoKS0+TW9kaWZ5U2tpbGxBdHRyaWJ1dGUoc2EsIGVmZmVrdCwgZHVyYXRpb24tdGltZSgpKSA9PQorICAgICAgICBTQV9NT0RfT0spCisgIHsKKyAgICB0ZWxsX29iamVjdChlbnZpcm9ubWVudCgpLEJTKG1zZykpOworICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQorCitwcml2YXRlIGludCBhY3RfYXR0cl9jaGFuZ2Vfc2Ffc3BlZWQoaW50IGVmZmVrdCkKK3sKKyAgcmV0dXJuIG1vZGlmeV9zYShTQV9TUEVFRCwgZWZmZWt0KTsKK30KK3ByaXZhdGUgaW50IGFjdF9hdHRyX2NoYW5nZV9zYV9kdXJhdGlvbihpbnQgZWZmZWt0KQoreworICByZXR1cm4gbW9kaWZ5X3NhKFNBX0RVUkFUSU9OLCBlZmZla3QpOworfQorcHJpdmF0ZSBpbnQgYWN0X2F0dHJfY2hhbmdlX3NhX3NwZWxsX3BlbmV0cmF0aW9uKGludCBlZmZla3QpCit7CisgIHJldHVybiBtb2RpZnlfc2EoU0FfU1BFTExfUEVORVRSQVRJT04sIGVmZmVrdCk7Cit9CisKKworLy8gU3BpZWxlciBNVVNTIGRhcyBlbnZpcm9ubWVudCgpIHNlaW4hCitwcml2YXRlIHZvaWQgZWZmZWt0KCkKK3sKKyAgLy8gQWxzIGVyc3RlcyBkaWUgV2lya3VuZ3NkYXVlciB2ZXJ3dXJzdGVuLCBlaW5pZ2UgRWZmZWt0ZSBicmF1Y2hlbgorICAvLyA8ZHVyYXRpb24+LgorICAvLyBXYW5uIGxhdWZlbiBkaWUgRWZmZWt0ZSBkZW5uIHNwYWV0ZW5zdGVucyBhYj8KKyAgZHVyYXRpb24gPSB0aW1lKCkgKyBkYXRhW1RfRUZGRUNUX0RVUkFUSU9OXTsKKyAgY2FsbF9vdXQoIyd0ZXJtaW5hdGVfZWZmZWN0cywgZGF0YVtUX0VGRkVDVF9EVVJBVElPTl0pOworCisgIC8vIG51ciBlY2h0ZSB3aXJrdW5nZW4gYmVydWVja3NpY2h0aWdlbiwga2VpbmUgIk1ldGFkYXRlbiIKKyAgbWFwcGluZyBlZmZlY3RzID0gZGF0YSAmIFRfS1JBVVRfRUZGRUNUUzsKKyAgLy8gZnVlciBTcGllbGVyIHdpcmQgZGVyIFBhcmF0cmFucyBuaWNodCBzdGF0dGZpbmRlbi4KKyAgaWYgKCFJU19TRUVSKGVudmlyb25tZW50KCkpKQorICAgIG1fZGVsZXRlKGRhdGEsIFRfQ0hBTkdFX0RJTUVOU0lPTik7CisKKyAgLy8gV2FlaHJlbmQgZGVyIFdpcmt1bmcgaXN0IGRpZXNlcyBPYmpla3Qgc2Nob25tYWwgdW5zaWNodGJhci4KKyAgU2V0UHJvcChQX0lOVklTLCAxKTsKKyAgLy8gR2V3aWNodCBudWxsZW4sIGJldm9yIGRpZSBXaXJrdW5nZW4gYWt0aXZpZXJ0IHdlcmRlbiwgZGEgZGllCisgIC8vIFdpcmt1bmcgdm9uIFRfQ0FSUlkgYW5zb25zdGVuIHdpZWRlciBkZWFrdGl2aWVydCB3dWVyZGUuIAorICBTZXRQcm9wKFBfV0VJR0hULCAwKTsKKyAgLy8gbmV1ZSwgbGVlcmUgRmxhc2NoZSBpbnMgSW52ZW50YXIgZGVzIFNwaWVsZXJzIGJld2VnZW4uCisgIGNsb25lX29iamVjdChUUkFOS0lURU0pLT5tb3ZlKGVudmlyb25tZW50KCksTV9OT0NIRUNLfE1fU0lMRU5UKTsKKworICAvLyBhdWZ0cmVubmVuIGluIHBvc2l0aXZlIHVuZCBuZWdhdGl2ZSBFZmZla3RlLiBLZXlzIG1pdCBXZXJ0IDAgd2VyZGVuCisgIC8vIGlnbm9yaWVydC4KKyAgbWFwcGluZyBwZWZmID0gZmlsdGVyKGVmZmVjdHMsIGZ1bmN0aW9uIGludCAoc3RyaW5nIGssIGludCB2YWwpCisgICAgICAgICAgICAgICAgICAgICAgICB7cmV0dXJuIHZhbCA+IDA7fSk7CisgIG1hcHBpbmcgbmVmZiA9IGZpbHRlcihlZmZlY3RzLCBmdW5jdGlvbiBpbnQgKHN0cmluZyBrLCBpbnQgdmFsKQorICAgICAgICAgICAgICAgICAgICAgICAge3JldHVybiB2YWwgPCAwO30pOworICAvLyBlcnN0IGRpZSBwb3NpdGl2ZW4sIGRhbm4gZGllIG5lZ2F0aXZlbiBXaXJrdW5nZW4gYWt0aXZpZXJlbgorICAvLyBmdWVyIGplZGUgV2lya3VuZyB3aXJkIGVpbmUgbGZ1biBhY3RfPHRyYW5rYXR0cmlidXQ+KCkgZ2VydWZlbiwgei5CLgorICAvLyBhY3RfYXR0cl90cmFnZW4oKSAoLT4gYWN0X1RfQ0FSUlkoKSApCisgIG1hcHBpbmcgbm90YWN0aXZhdGVkID0KKyAgICAgICAgICBmaWx0ZXIocGVmZiwgZnVuY3Rpb24gaW50IChzdHJpbmcgaywgaW50IHZhbCkKKyAgICAgICAgICAgICAge3JldHVybiAhZnVuY2FsbChzeW1ib2xfZnVuY3Rpb24oImFjdF8iK2ssdGhpc19vYmplY3QoKSksIHZhbCk7fSkKKyAgICAgICAgICsKKyAgICAgICAgICBmaWx0ZXIobmVmZiwgZnVuY3Rpb24gaW50IChzdHJpbmcgaywgaW50IHZhbCkKKyAgICAgICAgICAgICAge3JldHVybiAhZnVuY2FsbChzeW1ib2xfZnVuY3Rpb24oImFjdF8iK2ssdGhpc19vYmplY3QoKSksIHZhbCk7fSk7CisgIC8vIE1lbGR1bmdlbiBhdXNnZWJlbiB1ZWJlciBuaWNodCBha3RpdmllcnRlIFdpcmt1bmdlbj8KKyAgLy8gVE9ETworfQorCitzdGF0aWMgaW50IGNtZF90cmlua2VuKHN0cmluZyBzdHIsIG1peGVkICpwYXJhbSkKK3sKKyAgaWYgKGVudmlyb25tZW50KHRoaXNfb2JqZWN0KCkpICE9IFBMKQorICB7CisgICAgd3JpdGUoIkF1cyBhdWYgZGVtIEJvZGVuIGxpZWdlbmRlIEZsYXNjaGVuIHRyaW5rdCBlcyBzaWNoIHNvICIKKyAgICAgICAic2NobGVjaHQhXG4iKTsKKyAgfQorICBlbHNlIGlmIChkYXRhPT0wKQorICB7CisgICAgd3JpdGUoIkRpZSBGbGFzY2hlIGlzdCBsZWVyLCBEdSBtdWVzc3Rlc3QgZXJzdCBldHdhcyBoaW5laW5mdWVsbGVuLlxuIik7CisgIH0KKyAgZWxzZSBpZiAodGltZSgpPmV4cGlyeSkgCisgIHsKKyAgICB3cml0ZShCUygiSXJnZW5kd2llIHBhc3NpZXJ0IG5pY2h0cy4gSGF0dGVzdCBEdSB2aWVsbGVpY2h0IGRvY2ggbnVyICIKKyAgICAgICJrbGFyZXMgV2Fzc2VyIGFiZ2VmdWVsbHQ/IikpOworICAgIGRhdGE9MDsKKyAgfQorICBlbHNlIHsKKyAgICAvLyBEaWUgU3BlcnJ6ZWl0IG11c3MgaGllciBzZXBhcmF0IGJlcmVjaG5ldCB3ZXJkZW4sIHdlaWwgZWluZQorICAgIC8vIEFucGFzc3VuZyBkZXIgV2lya3VuZ3NkYXVlciBpbSBLcmF1dG1hc3RlciBkYXp1IGZ1ZWhyZW4gd3VlcmRlLAorICAgIC8vIGRhc3MgZXMga2VpbmUgaW5zdGFudGFuIHdpcmtlbmRlbiBUcmFlbmtlIG1laHIgZ2FlYmUuCisgICAgaW50IGJsb2NrdGltZSA9IG1heCg2MCtyYW5kb20oNjApLCBkYXRhW1RfRUZGRUNUX0RVUkFUSU9OXSk7CisgICAgaWYoZW52aXJvbm1lbnQoKS0+Y2hlY2tfYW5kX3VwZGF0ZV90aW1lZF9rZXkoYmxvY2t0aW1lLCBEUklOS19QT1RJT04pPT0tMSkKKyAgICB7CisgICAgICB3cml0ZShCUygiRHUgb2VmZm5lc3QgZGllIEZsYXNjaGUgdW5kIHRyaW5rc3QgaWhyZW4gSW5oYWx0IGF1cy4iKSk7CisgICAgICBzYXkoQlMoUEwtPk5hbWUoV0VSLCAwKSsiIG9lZmZuZXQgZWluZSBGbGFzY2hlIHVuZCB0cmlua3Qgc2llIGluIGVpbmVtICIKKyAgICAgICAgIlNjaGx1Y2sgYXVzLiIpKTsKKyAgICAgIGVmZmVrdCgpOworICAgICAgLy8gVE9ETzogcmVpY2h0IGRhcyBoaWVyIGF1cywgb2RlciBtdXNzIGRhcyBub2NoIGFuIGFuZGVyZW4gU3RlbGxlbiAKKyAgICAgIC8vIGVpbmdlYmF1dCB3ZXJkZW4/CisgICAgICBSZW1vdmVJZCgoeyJ0cmFuayIsImtyYWV1dGVydHJhbmsifSkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHRlbGxfb2JqZWN0KGVudmlyb25tZW50KCksIEJTKAorICAgICAgICAiRGVyIGxldHp0ZSBUcmFuayB3aXJrdCBub2NoIGVpbiB3ZW5pZyBuYWNoLiBEdSBrYW5uc3QgRGVpbmVtICIKKyAgICAgICAgIk1hZ2VuIG5pY2h0IHNvIGJhbGQgc2Nob24gZGVuIG5hZWNoc3RlbiB6dW11dGVuLiIpKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3B1YmxpYyBub21hc2sgaW50IEZpbGwob2JqZWN0ICpwbGFudHMpCit7CisgIGlmICghcG9pbnRlcnAocGxhbnRzKSkgcmV0dXJuIC0xOworICBpZiAoZGF0YSkgcmV0dXJuIC0yOyAgLy8gc2Nob24gdm9sbAorICBkYXRhID0gUExBTlRNQVNURVItPm1ha2VfcG90aW9uKHBsYW50cyk7CisgIEFkZElkKCh7InRyYW5rIiwia3JhZXV0ZXJ0cmFuayJ9KSk7CisgIGlmIChtYXBwaW5ncChkYXRhKSkKKyAgeworICAgIC8vIFBmbGFuemVuIHplcnN0b2VydCBkZXIgTWFzdGVyLCB3ZW5ucyBnZWtsYXBwdCBoYXQuCisgICAgZXhwaXJ5PXRpbWUoKStkYXRhW1RfRVhQSVJFXTsKKyAgICBTZXRQcm9wKFBfV0VJR0hULCAzMDApOworICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAtMzsKK30KKwordm9pZCBOb3RpZnlQbGF5ZXJEZWF0aChvYmplY3QgdmljLCBvYmplY3Qga2lsbGVyLCBpbnQgZXhwKQoreworICBjYWxsX291dCgicmVtb3ZlIiwxKTsKK30KZGlmZiAtLWdpdCBhL3N0ZC9rcmFldXRlcnN0b3JlLmMgYi9zdGQva3JhZXV0ZXJzdG9yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NmExZDYKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQva3JhZXV0ZXJzdG9yZS5jCkBAIC0wLDAgKzEsMzUgQEAKKy8vIChjKSAyMDAzIGJ5IFBhZHJlaWMgKHBhZHJlaWNAbWcubXVkLmRlKQorLy8gU3Rkc3RvcmUgZnVlciBLcmFldXRlcmxhZWRlbiEKKworaW5oZXJpdCAiL3N0ZC9zdG9yZSI7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8YmFuay5oPgorCit2b2lkIGNyZWF0ZSgpCit7CisgICBpZiAob2JqZWN0X25hbWUodGhpc19vYmplY3QoKSkgPT0gX19GSUxFX19bMC4uPDNdKQorICAgeworICAgICBzZXRfbmV4dF9yZXNldCgtMSk7CisgICAgIHJldHVybjsKKyAgIH0KKyAgIDo6Y3JlYXRlKCk7CisgICBTZXRQcm9wKFBfTUlOX1NUT0NLLCA1MCk7CisgICAvLyBpbiBqZWRlbSBSZXNldCB2ZXJzY2h3aW5kZW4gbnVyIDIlIGFsbGVyIE9iamVrdGUKKyAgIFNldFByb3AoUF9TVE9SRV9DT05TVU1FLCAyKTsKK30KKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlX3N1cGVyKCkKK3sKKyAgc2V0X25leHRfcmVzZXQoLTEpOworfQorCit2b2lkIHJlc2V0KCkKK3sKKyAgIDo6cmVzZXQoKTsKKyAgIC8vIGRhbWl0IGRpZSBLcmFldXRlciBpbSBMYWRlbiBuaWNodCBzY2hpbW1lbG4sIGdnZi4gdHJvY2tuZW4uLi4KKyAgIG9iamVjdCAqb2JzID0gZmlsdGVyKCBhbGxfaW52ZW50b3J5KCksIGZ1bmN0aW9uIGludCAob2JqZWN0IG9iKSB7CisgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iLT5UaW1lVG9MaXZlKCk8MzYwMDt9ICk7CisgICBvYnMtPkRyeVBsYW50KDk1KTsKK30KKwpkaWZmIC0tZ2l0IGEvc3RkL2xpZ2h0c291cmNlLmMgYi9zdGQvbGlnaHRzb3VyY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGIyMjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkL2xpZ2h0c291cmNlLmMKQEAgLTAsMCArMSwzMTMgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBsaWdodHNvdXJjZS5jIC0tIHN0YW5kYXJkIGxpZ2h0IHNvdXJjZQorLy8KKy8vICRJZDogbGlnaHRzb3VyY2UuYyA3ODA2IDIwMTEtMDctMTEgMjA6Mjg6MTdaIFplc3N0cmEgJAorCisvLyBzdGQvbGlnaHRzb3VyY2UuYworLy8KKy8vIE9yaWdpbmFsIHZvbiBNaXJpbCBBcHJpbCAnOTIKKy8vIE5ldWZhc3N1bmcgdm9uIFNpciBEZXplbWJlciAnOTIgKCB1bnRlciBCb2luZ3MgQWVnaWRlIDopCisvLyBWZXJzaW9uIDogMS4wCisvLworLy8gQnVnZml4ZXMgdm9uIFNpciBKdW5pICc5MworLy8gVmVyc2lvbiA6IDEuMgorLy8KKy8vIFdpY2h0aWdlIEZ1bmt0aW9uZW4sIGRpZSBtYW4gaW4gY3JlYXRlKCkgYXVmcnVmZW4gc29sbHRlIDoKKy8vCisvLyBTZXR6ZW4gZGVyIEJyZW5uc3RvZmZtZW5nZSA6ICAKKy8vIFNldFByb3AoIFBfRlVFTCwgaW50ICkgICAgICAgaW50IGdpYnQgZGllIEJyZW5uemVpdCBpbiBTZWt1bmRlbiBhbgorLy8KKy8vIFNldHplbiBkZXIgQmVzY2hyZWlidW5nIHdlbm4gT2JqZWt0IGFuZ2V6dWVuZGV0KCBkZWZhdWx0IDogImJyZW5uZW5kIiApIDoKKy8vIFNldFByb3AoIFBfTElHSFRERVNDLCBzdHJpbmcgKQorLy8KKy8vIExlZ3QgZmVzdCwgb2IgZWluIExldWNodG9iamVrdCBuYWNoIHNlaW5lbSBBYmJyZW5uZW4gZGVzdHJ1Y3RlZCB3aXJkCisvLyBTZXRQcm9wKCBQX0RPX0RFU1RSVUNULCBpbnQgKQorLy8KKy8vIExlZ3QgZmVzdCwgd2llIGhlbGwgZGllIEZhY2tlbCBsZXVjaHRldC4KKy8vIFNldFByb3AoIFBfTElHSFQsIGludCApCisvLworLy8gQW5zb25zdGVuIHNpbmQgZGllIFN0YW5kYXJkZnVrdGlvbmVuIHdpZSB6LkIuIFNldFByb3AoIFBfR0VOREVSLCBNQUxFICkgCisvLyBhdWZ6dXJ1ZmVuCisKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKworaW5oZXJpdCAic3RkL3RoaW5nIiA7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisKKyNkZWZpbmUgVFJVRSAgMQorI2RlZmluZSBGQUxTRSAwCisjZGVmaW5lIGJvb2wgIGludAorCisjZGVmaW5lIERGTFRfRlVFTCAgICAgICAyMCAvLyAyMCBTZWt1bmRlbgorI2RlZmluZSBERkxUX0xJR0hUREVTQyAgImJyZW5uZW5kIgorI2RlZmluZSBERkxUX0xJR0hUICAgICAgMgorCisvLyBTbyBlcmdpYnQgc2ljaCBkaWUgTW9lZ2xpY2hrZWl0IHNpZSB3aWVkZXIgYXV6dWZ1ZWxsZW4KKyNkZWZpbmUgQ0FMTF9PVVRfVElNRSAgIDEwMAorCisjdW5kZWYgREVCVUcKKworLy8gVE9ETzogUHJpdmF0ZSB3YWVyIGxhbmdmcmlzdGlnIG5ldHQuLi4KK25vc2F2ZSBpbnQgIGZ1ZWwsIG1heF9mdWVsOworbm9zYXZlIGJvb2wgbGlnaHRlZCA7Citub3NhdmUgaW50ICBjYWxsX3RpbWUgOworCit2b2lkIGNyZWF0ZSgpCit7CisgIHRoaW5nOjpjcmVhdGUoKSA7CisgIAorICBTZXRQcm9wKCBQX05BTUUsICJMaWNodHF1ZWxsZSIgKSA7CisgIFNldFByb3AoIFBfU0hPUlQsICJFaW5lIExpY2h0cXVlbGxlIiApIDsKKyAgU2V0UHJvcCggUF9MT05HLCAiRHUgc2llaHN0IG5pY2h0cyBiZXNvbmRlcmVzLlxuIiApIDsKKyAgU2V0UHJvcCggUF9HRU5ERVIsIEZFTUFMRSApIDsKKyAgU2V0UHJvcCggUF9GVUVMLCBERkxUX0ZVRUwgKSA7CisgIFNldFByb3AoIFBfTElHSFRERVNDLCBERkxUX0xJR0hUREVTQyApIDsKKyAgU2V0UHJvcCggUF9MSUdIVCwgREZMVF9MSUdIVCApOworICBTZXRQcm9wKCBQX0RPX0RFU1RSVUNULCBUUlVFICkgOworICBTZXRQcm9wKCBQX1ZBTFVFLCA1ICkgOworICAKKyAgQWRkSWQoICh7ICJsaWNodHF1ZWxsZSIsICJcbmxpY2h0cXVlbGxlIiB9KSApIDsKKyAgQWRkQ21kKCAoeyAienVlbmRlIiwgInp1ZW5kIiB9KSwgImxpZ2h0IiApOworICBBZGRDbWQoICh7ICJsb2VzY2hlIiwgImxvZXNjaCIgfSksICJleHRpbmd1aXNoIiApOworfQorCit2b2lkIHRlc3RfcmVtb3ZlKCkKK3sgIGlmIChRdWVyeVByb3AoUF9ET19ERVNUUlVDVCkpIHJlbW92ZSgpOyAgfQorCisvKgorICogTGljaHRxdWVsbGUgYW56dWVuZGVuCisgKi8KK2Jvb2wgbGlnaHQoc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIHRtcCA7CisgIG9iamVjdCBlbnY7CisKKyAgX25vdGlmeV9mYWlsKCAiWnVlbmRlIHdhcyBhbj9cbiIgKSA7CisKKyAgaWYoICghc3RyKSB8fCAoIXNzY2FuZiggc3RyLCAiJXMgYW4iLCB0bXAgKSkgfHwgKCFpZCggdG1wICkpICkKKyAgICByZXR1cm4gRkFMU0UgOworICAKKyAgaWYoIGVudmlyb25tZW50KCkgIT0gUEwgKSAvLyBQbGF5ZXIgaGF0IGVzIG5pY2h0CisgIHsKKyAgICBfbm90aWZ5X2ZhaWwoICJFcnN0bWFsIG11c3N0IER1ICIgKyBuYW1lKCBXRU4sIDAgKSArICIgaGFiZW4uXG4iICkgOworICAgIHJldHVybiBGQUxTRSA7CisgIH0KKyAgCisgIGlmKCBsaWdodGVkICkKKyAgeworICAgIF9ub3RpZnlfZmFpbCggQ0FQKCBuYW1lKCBXRVIsIDEgKSApICsgIiBicmVubnQgc2Nob24uXG4iICkgOworICAgIHJldHVybiBGQUxTRSA7CisgIH0KKworICBpZiggZnVlbCA8PSAwICkKKyAgeworICAgIF9ub3RpZnlfZmFpbCggQ0FQKCBuYW1lKCBXRVIsIDEgKSApICsgIiBpc3QgYWJnZWJyYW5udC5cbiIgKSA7CisgICAgdGVzdF9yZW1vdmUoKSA7CisgICAgcmV0dXJuIEZBTFNFIDsKKyAgfQorCisgIGxpZ2h0ZWQgPSBUUlVFIDsKKyAgZW52PXRoaXNfb2JqZWN0KCk7CisgIHdoaWxlIChvYmplY3RwKGVudj1lbnZpcm9ubWVudChlbnYpKSkKKyAgICAgIC8vIEphLiBNYW4gcnVmdCBkaWUgX3NldF94eHgoKS1GdW5rdGlvbmVuIGVpZ2VudGxpY2ggbmljaHQgZGlyZWt0IGF1Zi4KKyAgICAgIC8vIEFiZXIgZGFzIExpY2h0c3lzdGVtIGlzdCBzY2hvbiAqc28qIHJlY2hlbmludGVuc2l2IHVuZCBnZXJhZGUgZGVyCisgICAgICAvLyBQX0xBU1RfQ09OVEVOVF9DSEFOR0UtQ2FjaGUgd2lyZCAqc28qIG9mdCBiZW5vZXRpZ3QsIGRhc3MgZXMgbWlyCisgICAgICAvLyBkYSB1bSBqZWRlcyBiaXNzY2hlbiBSZWNoZW56ZWl0IGdlaHQuCisgICAgICAvLyBEZXIgWndlY2sgaGVpbGlndCBqYSBiZWthbm50bGljaCBkaWUgTWl0dGVsLiA7LSkKKyAgICAgIC8vCisgICAgICAvLyBUaWFtYWsKKyAgICAgIGVudi0+X3NldF9sYXN0X2NvbnRlbnRfY2hhbmdlKCk7CisgIGNhbGxfdGltZSA9IChmdWVsIDwgQ0FMTF9PVVRfVElNRSk/IGZ1ZWwgOiBDQUxMX09VVF9USU1FIDsKKyAgY2FsbF9vdXQoICJvdXRfb2ZfZnVlbCIsIGNhbGxfdGltZSApIDsKKyAgaWYoIChpbnQpUEwtPlF1ZXJ5UHJvcChQX1BMQVlFUl9MSUdIVCkgPT0gMSApCisgICAgd3JpdGUoICJEdSBrYW5uc3Qgd2llZGVyIGV0d2FzIHNlaGVuLlxuIiApIDsKKyAgZWxzZSB3cml0ZSggIk9rLlxuIiApIDsKKyAgc2F5KChzdHJpbmcpUEwtPk5hbWUoV0VSKQorICAgICAgKyAiIHp1ZW5kZXQgIiArIG5hbWUoIFdFTiwgMCApICsgIiBhbi5cbiIgKSA7CisKKyAgcmV0dXJuIFRSVUUgOworfQorCitib29sIGV4dGluZ3Vpc2goc3RyaW5nIHN0cikKK3sKKyAgaW50IHRpOworICBvYmplY3QgZW52OworCisgIF9ub3RpZnlfZmFpbCggIldlbGNoZSBMaWNodHF1ZWxsZSBtb2VjaHRlc3QgRHUgbG9lc2NoZW4/XG4iICkgOworCisgIGlmKCAoIXN0cikgfHwgKCFpZCggc3RyICkpICkKKyAgICByZXR1cm4gRkFMU0UgOworICAKKyAgaWYoICFsaWdodGVkICkKKyAgeworICAgIF9ub3RpZnlfZmFpbCggQ0FQKCBuYW1lKCBXRVIsIDEgKSApICsgIiBicmVubnQgZ2FyIG5pY2h0LlxuIiApIDsKKyAgICByZXR1cm4gRkFMU0UgOworICB9CisKKyAgaWYoIGVudmlyb25tZW50KCkgIT0gUEwgKQorICB7CisgICAgX25vdGlmeV9mYWlsKCAiRXJzdG1hbCBtdXNzdCBEdSAiICsgbmFtZSggV0VOLCAwICkgKyAiIGhhYmVuLlxuIiApIDsKKyAgICByZXR1cm4gRkFMU0UgOworICB9CisKKyAgaWYoICggdGkgPSByZW1vdmVfY2FsbF9vdXQoICJvdXRfb2ZfZnVlbCIgKSApID09IC0xICkKKyAgICB0aSA9IDAgOworCisgIGZ1ZWwgLT0gKGNhbGxfdGltZSAtIHRpKSA7CisgIGxpZ2h0ZWQgPSBGQUxTRSA7CisgIGVudj10aGlzX29iamVjdCgpOworICB3aGlsZSAob2JqZWN0cChlbnY9ZW52aXJvbm1lbnQoZW52KSkpCisgICAgICAvLyBKYS4gTWFuIHJ1ZnQgZGllIF9zZXRfeHh4KCktRnVua3Rpb25lbiBlaWdlbnRsaWNoIG5pY2h0IGRpcmVrdCBhdWYuCisgICAgICAvLyBBYmVyIGRhcyBMaWNodHN5c3RlbSBpc3Qgc2Nob24gKnNvKiByZWNoZW5pbnRlbnNpdiB1bmQgZ2VyYWRlIGRlcgorICAgICAgLy8gUF9MQVNUX0NPTlRFTlRfQ0hBTkdFLUNhY2hlIHdpcmQgKnNvKiBvZnQgYmVub2V0aWd0LCBkYXNzIGVzIG1pcgorICAgICAgLy8gZGEgdW0gamVkZXMgYmlzc2NoZW4gUmVjaGVuemVpdCBnZWh0LgorICAgICAgLy8gRGVyIFp3ZWNrIGhlaWxpZ3QgamEgYmVrYW5udGxpY2ggZGllIE1pdHRlbC4gOy0pCisgICAgICAvLworICAgICAgLy8gVGlhbWFrCisgICAgICBlbnYtPl9zZXRfbGFzdF9jb250ZW50X2NoYW5nZSgpOworICBpZiAoIHRoaXNfcGxheWVyKCktPlF1ZXJ5UHJvcChQX1BMQVlFUl9MSUdIVCkgPT0gMCApCisgIHsKKyAgICB3cml0ZSggIkVzIHdpcmQgZHVua2VsLlxuIiApIDsKKyAgICBzYXkoKHN0cmluZylQTC0+TmFtZShXRVIpIAorCSsgIiBtYWNodCBkYXMgTGljaHQgYXVzLlxuIiApIDsKKyAgfQorICBlbHNlCisgIHsKKyAgICB3cml0ZSggIk9rLlxuIiApIDsKKyAgICBzYXkoKHN0cmluZylQTC0+TmFtZShXRVIpCisJKyAiIGxvZXNjaHQgIiArIG5hbWUoIFdFTiwgMCApICsgIiBhdXMuXG4iICkgOworICB9CisKKyAgaWYoIGZ1ZWwgPD0gMCApIHRlc3RfcmVtb3ZlKCkgOworICByZXR1cm4gVFJVRSA7Cit9CisKK2Jvb2wgdW5saWdodCgpCit7CisgIGludCB0aTsKKyAgb2JqZWN0IGVudjsKKworICBpZiggIWxpZ2h0ZWQgKQorICAgIHJldHVybiBGQUxTRSA7CisKKyAgaWYoICggdGkgPSByZW1vdmVfY2FsbF9vdXQoICJvdXRfb2ZfZnVlbCIgKSApID09IC0xICkKKyAgICB0aSA9IDAgOworCisgIGZ1ZWwgLT0gKGNhbGxfdGltZSAtIHRpKSA7CisgIGxpZ2h0ZWQgPSBGQUxTRSA7CisgIGVudj10aGlzX29iamVjdCgpOworICB3aGlsZSAob2JqZWN0cChlbnY9ZW52aXJvbm1lbnQoZW52KSkpCisgICAgICAvLyBLb21tZW50YXIgc2llaGUgb2JlbiA7XikKKyAgICAgIGVudi0+X3NldF9sYXN0X2NvbnRlbnRfY2hhbmdlKCk7CisgIGlmKCBmdWVsIDw9IDAgKSB0ZXN0X3JlbW92ZSgpIDsKKyAgcmV0dXJuIFRSVUUgOworfQorCit2b2lkIG91dF9vZl9mdWVsKCkKK3sKKyAgaW50IGk7CisgIG9iamVjdCAqaW52LCBlbnY7CisgIAorICBmdWVsIC09IGNhbGxfdGltZSA7CisKKyAgaWYgKGZ1ZWw+MCkgeworICAgIGNhbGxfb3V0KCAib3V0X29mX2Z1ZWwiLCBjYWxsX3RpbWUgKSA7CisgICAgcmV0dXJuIDsKKyAgfQorICBsaWdodGVkPUZBTFNFOworICBlbnY9dGhpc19vYmplY3QoKTsKKyAgd2hpbGUgKG9iamVjdHAoZW52PWVudmlyb25tZW50KGVudikpKQorICAgICAgLy8gSW1tZXIgbm9jaCBuaWNodCB3aXJrbGljaCBzYXViZXIuIEFiZXIgQmVncnVlbmR1bmcgc2llaGUgb2Jlbi4KKyAgICAgIGVudi0+X3NldF9sYXN0X2NvbnRlbnRfY2hhbmdlKCk7CisKKyAgaWYgKGVudmlyb25tZW50KCkpCisgIHsKKyAgICBpZiAoIGxpdmluZyhlbnZpcm9ubWVudCgpKSAmJiBlbnZpcm9ubWVudChlbnZpcm9ubWVudCgpKSApCisgICAgeworICAgICAgaW52PSh1c2VycygpICYgYWxsX2ludmVudG9yeShlbnZpcm9ubWVudChlbnZpcm9ubWVudCgpKSkpLSh7IGVudmlyb25tZW50KCkgfSk7CisgICAgICBmb3IgKGk9c2l6ZW9mKGludiktMTsgaT49MDsgaS0tKSAKKyAgICAgICAgaWYgKGludltpXS0+UXVlcnlQcm9wKFBfUExBWUVSX0xJR0hUKTw9MCkKKyAgICAgICAgICB0ZWxsX29iamVjdChpbnZbaV0sICJFcyB3aXJkIGR1bmtlbCBhbHMgIiArIGVudmlyb25tZW50KCktPm5hbWUoV0VTU0VOKSArCisgICAgICAgICAgICAiICIgKyBRdWVyeVByb3AoUF9OQU1FKSArICIgZXJsaXNjaHQuXG4iICkgOworICAgICAgICBlbHNlIHRlbGxfb2JqZWN0KGludltpXSwgQ0FQKCBuYW1lKCBXRVIsIDAgKSApICsgIiBlcmxpc2NodC5cbiIgKSA7CisgICAgICBpZiAoZW52aXJvbm1lbnQoKS0+UXVlcnlQcm9wKFBfUExBWUVSX0xJR0hUKTw9MCkKKyAgICAgICAgdGVsbF9vYmplY3QoZW52aXJvbm1lbnQoKSwgCisgICAgICAgICAgQ0FQKCBuYW1lKCBXRVIsIDEgKSApICsgIiBlcmxpc2NodCB1bmQgZXMgd2lyZCBkdW5rZWwuXG4iICkgOworICAgICAgZWxzZSB0ZWxsX29iamVjdChlbnZpcm9ubWVudCgpLCBDQVAoIG5hbWUoIFdFUiwgMSApICkgKyAiIGVybGlzY2h0LlxuIiApIDsgICAgCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpbnY9KHVzZXJzKCkgJiBhbGxfaW52ZW50b3J5KGVudmlyb25tZW50KCkpKTsKKyAgICAgIGZvciAoaT1zaXplb2YoaW52KS0xOyBpPj0wOyBpLS0pIAorICAgICAgICBpZiAoaW52W2ldLT5RdWVyeVByb3AoUF9QTEFZRVJfTElHSFQpPD0wKQorICAgICAgICAgIHRlbGxfb2JqZWN0KGludltpXSwgIkVzIHdpcmQgZHVua2VsIGFscyAiICsgbmFtZShXRVIsMSkKKyAgICAgICAgICArICIgZXJsaXNjaHQuXG4iICkgOworICAgICAgICBlbHNlIHRlbGxfb2JqZWN0KGludltpXSwgQ0FQKCBuYW1lKCBXRVIsIDAgKSApICsgIiBlcmxpc2NodC5cbiIgKSA7CisgICAgfQorICB9ICAKKyAgdGVzdF9yZW1vdmUoKSA7Cit9CisKKy8vIEJyZW5uc3RvZmYgbmFjaGZ1ZWxsZW4KK3ZvaWQgQWRkRnVlbChpbnQgZikKK3sgIGZ1ZWwgKz0gZiA7ICB9CisKKy8vIFByb3BlcnR5IC0gRnVua3Rpb25lbgorCitzdGF0aWMgdm9pZCBfc2V0X2xpZ2h0ZWQoYm9vbCBsKQoreyAgbGlnaHRlZCA9IGwgOyAgfQorCitib29sIF9xdWVyeV9saWdodGVkKCkKK3sgIHJldHVybiBsaWdodGVkIDsgIH0KKworc3RhdGljIHZvaWQgX3NldF9mdWVsKGludCBmKQoreworICBpZiAoZj5tYXhfZnVlbCkgbWF4X2Z1ZWw9ZjsKKyAgZnVlbCA9IGYgOworfQorCitzdGF0aWMgaW50IF9xdWVyeV9mdWVsKCkKK3sKKyAgaW50IHRtcDsKKworICBpZiAoKHRtcD1maW5kX2NhbGxfb3V0KCJvdXRfb2ZfZnVlbCIpKT49MCkKKyAgICByZXR1cm4gZnVlbC1jYWxsX3RpbWUrdG1wOworICBlbHNlIHJldHVybiBmdWVsOworfQorCitzdGF0aWMgc3RyaW5nIF9xdWVyeV9saWdodGRlc2MoKQoreworICBzdHJpbmcgKnRtcDsKKyAgaW50IG4saTsKKyAgCisgIHRtcD1RdWVyeShQX0xJR0hUREVTQyk7CisgIGlmICghcG9pbnRlcnAodG1wKSkgcmV0dXJuIChzdHJpbmcpdG1wOworICBuPXNpemVvZih0bXApOworICBpPW4qX3F1ZXJ5X2Z1ZWwoKS9tYXhfZnVlbDsKKyAgaWYgKGk+PW4pIGk9bi0xOworICByZXR1cm4gdG1wW2ldOworfQorCitzdGF0aWMgaW50IF9xdWVyeV9saWdodCgpCit7ICAgcmV0dXJuIChsaWdodGVkID8gUXVlcnkoUF9MSUdIVCkgOiAwKTsgIH0KKworLyoKKyAqIHNob3J0KCkgdWViZXJsYWRlbgorICovCitzdHJpbmcgc2hvcnQoKQoreworICBzdHJpbmcgczsKKyAgc3RyaW5nIGRlc2M7CisKKyAgaWYoIShzPVF1ZXJ5UHJvcChQX1NIT1JUKSkpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiBzICsgKCAobGlnaHRlZCk/ICgiICgiK1F1ZXJ5UHJvcCggUF9MSUdIVERFU0MgKSArIikuXG4iKSA6ICIuXG4iICk7Cit9CmRpZmYgLS1naXQgYS9zdGQvbGl2aW5nL2F0dHJpYnV0ZXMuYyBiL3N0ZC9saXZpbmcvYXR0cmlidXRlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMDI3YTQKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvbGl2aW5nL2F0dHJpYnV0ZXMuYwpAQCAtMCwwICsxLDY3MSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGxpdmluZy9hdHRyaWJ1dGVzLmMgLS0gYXR0cmlidXRlcyBmb3IgbGl2aW5nIG9iamVjdHMKKy8vCisvLyAkSWQ6IGF0dHJpYnV0ZXMuYyA4Mzc1IDIwMTMtMDItMTIgMjE6NTI6NThaIFplc3N0cmEgJAorCisjaW5jbHVkZSA8c3lzX2RlYnVnLmg+CisKKy8vIGF0dHJpYnV0ZSBoYW5kbGluZworLy8KKy8vICAgZmlsdGVyX2xkZmllZDogc3RyLCBkZXgsIGNvbiwgaW50CisvLworLy8gSW4gZGVuIEF0dHJpYnV0ZW4gdW5kIEFiaWxpdGVzIHdlcmRlbiBSYXNzZW5zcHppZmlzY2hlIHVuZCBlcndvcmJlbmUKKy8vIEZhZWhpZ2tlaXRlbiAobWl0IGF1dG9sb2FkLUVpZ2Vuc2NoYWZ0KSBhYmdlcHNlaWNoZXJ0LgorLy8KKy8vIEZ1bmt0aW9uZW46CisvLyAgIFNldEF0dHJpYnV0ZSggYXR0ciwgdmFsICkgKEVyemV1Z2UgdW5kKSBzZXR6ZSBkYXMgQXR0cmlidXQgYXVmIHZhbC4KKy8vICAgUXVlcnlBdHRyaWJ1dGUoIGF0dHIgKSAgICBHZWJlIGRlbiBXZXJ0IGRlcyBBdHRyaWJ1dGVzIHp1cnVlY2suCisvLworLy8gICBXZW5uIGVpbiBPYmpla3QgZWluZSBGdW5rdGlvbiBfZmlsdGVyYXR0cl88bmFtZT4gYmVpdHp0LCB3aXJkIGJlaW0gU2V0emVuCisvLyAgIGRlcyBBdHRyaWJ1dGVzIDxuYW1lPiwgZGVyIHZvcmdlc2NobGFnZW5lIFdlcnQgdWViZXJnZWJlbiB1bmQgZGVyIHZvbgorLy8gICBkaWVzZXIgRnVua3Rpb24genVydWVja2dlZ2ViZW5lIGdlc2V0enQuIChmdWVyIHVlYmVycHJ1ZWZ1bmdzendlY2tlKQorLy8gICBHbGVpY2hlcyBnaWx0IGZ1ZXIgX2ZpbHRlcmFiaWxfPG5hbWU+LgorCisjcHJhZ21hIHN0cmljdF90eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGF0dHJpYnV0ZXMuaD4KKyNpbmNsdWRlIDxwbGF5ZXIvZ21jcC5oPgorI3VuZGVmIE5FRURfUFJPVE9UWVBFUworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCittYXBwaW5nIGF0dHJpYnV0ZXM7IC8vIERpZXMgc2luZCBkaWUgbWl0IFpUcyB2ZXJhZW5kZXJiYXJlbiBBdHRyaWJ1dGUKK21hcHBpbmcgYXR0cmlidXRlc19tb2RpZmllcjsgLy8gTW9kaWZpZXIgc29sbGVuIGdlc3BlaWNoZXJ0IHdlcmRlbgorbm9zYXZlIG1peGVkKiBhdHRyaWJ1dGVzX3RpbWVkX21vZHM7IC8vUF9USU1FRF9BVFRSX01PRAorbm9zYXZlIG1hcHBpbmcgYXR0cmlidXRlc19vZmZzZXRzOyAvLyBPZmZzZXRzIE5JQ0hUIHNwZWljaGVybiEKK25vc2F2ZSBtYXBwaW5nIHVzZWRfYXR0cmlidXRlc19vZmZzZXRzOyAvLyBadXIgQmVzY2hsZXVuaWd1bmcgZGVyIEJlcmVjaG51bmcKK25vc2F2ZSBvYmplY3QqIGFsbF9tb2RpZmllcnM7IC8vIG9iamVrdGUgbWl0IFBfWC9NX0FUVFJfTU9ELCBQX1gvTV9IRUFMVEhfTU9ECitub3NhdmUgb2JqZWN0KiBpbnZhbGlkX21vZGlmaWVyczsgLy8gb2JqZWt0ZSB3ZWxjaGUgZGFzIGxpbWl0IHVlYmVyc2NocmVpdGVuCitub3NhdmUgaW50IGN1bXVsYXRpdmVfbW9kOyAvLyBiaWxhbnogZGVyIFBfWC9NX0FUVFJfTU9ECitub3NhdmUgaW50IGhwX29mZjsKK25vc2F2ZSBpbnQgc3Bfb2ZmOworCisKK25vbWFzayBwdWJsaWMgaW50IFNldFRpbWVkQXR0ck1vZGlmaWVyKHN0cmluZyBrZXksIG1hcHBpbmcgbW9kaWZpZXIsIAorICAgIGludCBvdXRkYXRlZCwgb2JqZWN0IGRlcGVuZGVudCwgbWl4ZWQgbm90aWZ5KSB7CisgIGlmKCFrZXkgfHwga2V5PT0iIiB8fCAhbW9kaWZpZXIgfHwgKG91dGRhdGVkPjAgJiYgb3V0ZGF0ZWQ8dGltZSgpKSB8fCAKKyAgICAgIChub3RpZnkgJiYgIXN0cmluZ3Aobm90aWZ5KSAmJiAhb2JqZWN0cChub3RpZnkpKSApIHsKKyAgICByZXR1cm4gVEFUVFJfSU5WQUxJRF9BUkdTOworICB9CisgIAorICAKKyAgaWYobWVtYmVyKGF0dHJpYnV0ZXNfdGltZWRfbW9kc1tUQVRUUl9FTlRSSUVTXSxrZXkpKSB7CisgICAgLy8gY2hhbmdlIGVudHJ5CisgICAgYXR0cmlidXRlc190aW1lZF9tb2RzW1RBVFRSX0VOVFJJRVNdW2tleSxUQVRUUl9NT0RdPW1vZGlmaWVyOworICAgIGF0dHJpYnV0ZXNfdGltZWRfbW9kc1tUQVRUUl9FTlRSSUVTXVtrZXksVEFUVFJfT1VUREFURURdPW91dGRhdGVkOworICAgIGF0dHJpYnV0ZXNfdGltZWRfbW9kc1tUQVRUUl9FTlRSSUVTXVtrZXksVEFUVFJfREVQRU5ERU5UXT1kZXBlbmRlbnQ7CisgICAgYXR0cmlidXRlc190aW1lZF9tb2RzW1RBVFRSX0VOVFJJRVNdW2tleSxUQVRUUl9OT1RJRlldPW5vdGlmeTsKKyAgfQorICBlbHNlIHsKKyAgICAvLyBhZGQgZW50cnkKKyAgICBhdHRyaWJ1dGVzX3RpbWVkX21vZHNbVEFUVFJfRU5UUklFU10rPShba2V5Om1vZGlmaWVyO291dGRhdGVkO2RlcGVuZGVudDtub3RpZnldKTsKKyAgfQorICAKKyAgLy8gYWRkIG91dGRhdGUKKyAgaWYob3V0ZGF0ZWQ+MCAmJiBtZW1iZXIoYXR0cmlidXRlc190aW1lZF9tb2RzW1RBVFRSX09VVERBVEVdLG91dGRhdGVkKT09LTEpCisgIHsKKyAgICBhdHRyaWJ1dGVzX3RpbWVkX21vZHNbVEFUVFJfT1VUREFURV0rPSh7b3V0ZGF0ZWR9KTsKKyAgICBhdHRyaWJ1dGVzX3RpbWVkX21vZHNbVEFUVFJfT1VUREFURV09CisgICAgICBzb3J0X2FycmF5KGF0dHJpYnV0ZXNfdGltZWRfbW9kc1tUQVRUUl9PVVREQVRFXSwjJzwpOworICB9CisgIAorICAvLyBhZGQgZGVwZW5kZW50CisgIGlmKG9iamVjdHAoZGVwZW5kZW50KSkKKyAgeworICAJaWYobWVtYmVyKGF0dHJpYnV0ZXNfdGltZWRfbW9kc1tUQVRUUl9ERVBFTkRFTlRTXSxrZXkpKQorICAJeworCSAgYXR0cmlidXRlc190aW1lZF9tb2RzW1RBVFRSX0RFUEVOREVOVFNdW2tleV09ZGVwZW5kZW50OworICAJfQorICAJZWxzZQorICAJeworICAgICAgICAgIGF0dHJpYnV0ZXNfdGltZWRfbW9kc1tUQVRUUl9ERVBFTkRFTlRTXSs9KFtrZXk6ZGVwZW5kZW50XSk7CisgIAl9CisgIH0KKyAgZWxzZQorICB7CisgIAkvLyByZW1vdmUgcHJldmlvdXNseSBzZXQgZGVwZW5kZW50CisgIAlpZihtZW1iZXIoYXR0cmlidXRlc190aW1lZF9tb2RzW1RBVFRSX0RFUEVOREVOVFNdLGtleSkpCisgIAl7CisJICBhdHRyaWJ1dGVzX3RpbWVkX21vZHNbVEFUVFJfREVQRU5ERU5UU10tPShba2V5XSk7CisgIAl9CisgIH0KKyAgCisgIFVwZGF0ZUF0dHJpYnV0ZXMoKTsKKworICByZXR1cm4gVEFUVFJfT0s7Cit9CisKK25vbWFzayBwdWJsaWMgbWFwcGluZyBRdWVyeVRpbWVkQXR0ck1vZGlmaWVyKHN0cmluZyBrZXkpCit7CisgIGludCBvdXRkYXRlZDsKKyAgb2JqZWN0IGRlcGVuZGVudDsKKyAgbWl4ZWQgbm90aWZ5OworICBtYXBwaW5nIG1vZDsKKyAgCisgIGlmKCFrZXkgfHwga2V5PT0iIikKKyAgeworICAgIHJldHVybiAoW10pOworICB9CisKKyAgaWYoIW1lbWJlcihhdHRyaWJ1dGVzX3RpbWVkX21vZHNbVEFUVFJfRU5UUklFU10sa2V5KSkKKyAgeyAKKyAgICByZXR1cm4gKFtdKTsKKyAgfQorCisgIG1vZD1kZWVwX2NvcHkoYXR0cmlidXRlc190aW1lZF9tb2RzW1RBVFRSX0VOVFJJRVNdW2tleSxUQVRUUl9NT0RdKTsKKyAgb3V0ZGF0ZWQ9YXR0cmlidXRlc190aW1lZF9tb2RzW1RBVFRSX0VOVFJJRVNdW2tleSxUQVRUUl9PVVREQVRFRF07CisgIGRlcGVuZGVudD1hdHRyaWJ1dGVzX3RpbWVkX21vZHNbVEFUVFJfRU5UUklFU11ba2V5LFRBVFRSX0RFUEVOREVOVF07CisgIG5vdGlmeT1hdHRyaWJ1dGVzX3RpbWVkX21vZHNbVEFUVFJfRU5UUklFU11ba2V5LFRBVFRSX05PVElGWV07CisgIAorICByZXR1cm4gKFtrZXk6bW9kO291dGRhdGVkO2RlcGVuZGVudDtub3RpZnkgXSk7Cit9CisKK25vbWFzayBwdWJsaWMgaW50IERlbGV0ZVRpbWVkQXR0ck1vZGlmaWVyKHN0cmluZyBrZXkpCit7CisgIGlmKCFrZXkgfHwga2V5PT0iIikKKyAgeworICAgIHJldHVybiBUQVRUUl9JTlZBTElEX0FSR1M7CisgIH0KKworICBpZighbWVtYmVyKGF0dHJpYnV0ZXNfdGltZWRfbW9kc1tUQVRUUl9FTlRSSUVTXSxrZXkpKQorICB7IAorICAgIHJldHVybiBUQVRUUl9OT19TVUNIX01PRElGSUVSOworICB9CisgIAorICBhdHRyaWJ1dGVzX3RpbWVkX21vZHNbVEFUVFJfREVQRU5ERU5UU10tPShba2V5XSk7CisgIGF0dHJpYnV0ZXNfdGltZWRfbW9kc1tUQVRUUl9FTlRSSUVTXS09KFtrZXldKTsKKyAgVXBkYXRlQXR0cmlidXRlcygpOworICAKKyAgcmV0dXJuIFRBVFRSX09LOworfQorCitub21hc2sgcHJvdGVjdGVkIHZvaWQgYXR0cmlidXRlX2hiKCkKK3sKKyAgaW50IG5vdyxpLGssdXBkYXRlLG91dGRhdGVkOworICBzdHJpbmcqIGtleXM7CisgIG1hcHBpbmcgdG9ub3RpZnk7CisJCisgIC8vIGluaXRpYWxpemUKKyAgbm93PXRpbWUoKTsKKyAgdG9ub3RpZnk9KFtdKTsKKworICBrZXlzPW1faW5kaWNlcyhhdHRyaWJ1dGVzX3RpbWVkX21vZHNbVEFUVFJfRU5UUklFU10pOworICAKKyAgLy8gZGVsZXRlIG91dGRhdGVkIAorICBmb3IoaT1zaXplb2YoYXR0cmlidXRlc190aW1lZF9tb2RzW1RBVFRSX09VVERBVEVdKS0xO2k+PTA7aS0tKQorICB7CisgIAlvdXRkYXRlZD1hdHRyaWJ1dGVzX3RpbWVkX21vZHNbVEFUVFJfT1VUREFURV1baV07CisgIAlpZihvdXRkYXRlZD5ub3cpCisgIAl7CisgIAkgIGJyZWFrOworICAJfQorICAJCisgIAlmb3Ioaz1zaXplb2Yoa2V5cyktMTtrPj0wO2stLSkKKyAgCXsKKyAgCSAgaWYoYXR0cmlidXRlc190aW1lZF9tb2RzW1RBVFRSX0VOVFJJRVNdW2tleXNba10sVEFUVFJfT1VUREFURURdPT1vdXRkYXRlZCkKKyAgCSAgeworICAJICAgIC8vIGJlaSBmZWhsZW5kZW0gbm90aWZpZXIgd3VyZGUgZGFzIHp1bSB2ZXJoYWVuZ25pcworICAJICAgIC8vIGRhbmsgYW4gZ2xvaW5zb24KKyAgCSAgICAvKgorICAJICAgIGlmKG9iamVjdHAoYXR0cmlidXRlc190aW1lZF9tb2RzW1RBVFRSX0VOVFJJRVNdW2tleXNba10sVEFUVFJfTk9USUZZXSkpCisgIAkgICAgeworICAJICAgICovCisgIAkgICAgdG9ub3RpZnkrPShba2V5c1trXTphdHRyaWJ1dGVzX3RpbWVkX21vZHNbVEFUVFJfRU5UUklFU11ba2V5c1trXSxUQVRUUl9OT1RJRlldXSk7CisgIAkgICAgLy99CisgIAkgICAgCisJICAgIGF0dHJpYnV0ZXNfdGltZWRfbW9kc1tUQVRUUl9ERVBFTkRFTlRTXS09KFtrZXlzW2tdXSk7CisgCSAgICBhdHRyaWJ1dGVzX3RpbWVkX21vZHNbVEFUVFJfRU5UUklFU10tPShba2V5c1trXV0pOworICAJICAgIGtleXMtPSh7a2V5c1trXX0pOworICAJICB9CisgIAl9CisgIAkKKyAgCWF0dHJpYnV0ZXNfdGltZWRfbW9kc1tUQVRUUl9PVVREQVRFXS09KHtvdXRkYXRlZH0pOworICB9CisgIAorICAvLyBkZWxldGUgZGVwZW5kaW5nCisgIGtleXM9bV9pbmRpY2VzKGF0dHJpYnV0ZXNfdGltZWRfbW9kc1tUQVRUUl9ERVBFTkRFTlRTXSk7CisgIGZvcihpPXNpemVvZihrZXlzKS0xO2k+PTA7aS0tKQorICB7CisgIAlpZighb2JqZWN0cChhdHRyaWJ1dGVzX3RpbWVkX21vZHNbVEFUVFJfREVQRU5ERU5UU11ba2V5c1tpXV0pKQorICAJeworICAJICAgIC8vIHNpZWhlIG9iZW4KKyAgCSAgICAvKgorICAJICAgIGlmKG9iamVjdHAoYXR0cmlidXRlc190aW1lZF9tb2RzW1RBVFRSX0VOVFJJRVNdW2tleXNbaV0sVEFUVFJfTk9USUZZXSkpCisgIAkgICAgeworICAJICAgICovCisgIAkgICAgdG9ub3RpZnkrPShba2V5c1tpXTphdHRyaWJ1dGVzX3RpbWVkX21vZHNbVEFUVFJfRU5UUklFU11ba2V5c1tpXSxUQVRUUl9OT1RJRlldXSk7CisgIAkgICAgLy99CisKKwkgICAgYXR0cmlidXRlc190aW1lZF9tb2RzW1RBVFRSX0RFUEVOREVOVFNdLT0oW2tleXNbaV1dKTsKKyAJICAgIGF0dHJpYnV0ZXNfdGltZWRfbW9kc1tUQVRUUl9FTlRSSUVTXS09KFtrZXlzW2ldXSk7CisgIAkgICAga2V5cy09KHtrZXlzW2ldfSk7CisgIAl9CisgIH0KKyAgCisgIAorICAvLyB1cGRhdGUKKyAgaWYoc2l6ZW9mKHRvbm90aWZ5KSkKKyAgeworICAgIFVwZGF0ZUF0dHJpYnV0ZXMoKTsKKyAgICBjYWxsX291dCgjJ25vdGlmeUV4cGlyZWRNb2RpZmllcnMsMCx0b25vdGlmeSk7CisgIH0KK30KKworbm9tYXNrIHByb3RlY3RlZCB2b2lkIG5vdGlmeUV4cGlyZWRNb2RpZmllcnMobWFwcGluZyBub3RzKQoreworICBpbnQgaTsKKyAgc3RyaW5nKiBrZXlzOworICB3aGlsZShyZW1vdmVfY2FsbF9vdXQoIydub3RpZnlFeHBpcmVkTW9kaWZpZXJzKSE9LTEpOworICAKKyAgaWYoIW5vdHMpCisgIHsKKyAgICByZXR1cm47CisgIH0KKyAgCisgIGtleXM9bV9pbmRpY2VzKG5vdHMpOworICBmb3IoaT1zaXplb2Yobm90cyktMTtpPj0wO2ktLSkKKyAgeworICAJaWYobm90c1trZXlzW2ldXSAmJiAKKwkgICAgKCBvYmplY3RwKG5vdHNba2V5c1tpXV0pfHxzdHJpbmdwKG5vdHNba2V5c1tpXV0pICkgKQorICAJeworICAJICAgY2FsbF9vdGhlcihub3RzW2tleXNbaV1dLCJOb3RpZnlUaW1lZEF0dHJNb2RFeHBpcmVkIixrZXlzW2ldKTsKKyAgCX0KKyAgfQorfQorCisKKy8vIGludmFsaWRlIG1vZGlmaWVyIGJlbmFjaHJpY2h0aWdlbgorbm9tYXNrIHByb3RlY3RlZCB2b2lkIG5vdGlmeUludmFsaWRNb2RpZmllcnMoKSB7CisKKyAgd2hpbGUocmVtb3ZlX2NhbGxfb3V0KCMnbm90aWZ5SW52YWxpZE1vZGlmaWVycykhPS0xKTsKKyAgCisgIGlmKCFpbnZhbGlkX21vZGlmaWVycykgeworICAgIGludmFsaWRfbW9kaWZpZXJzPSh7fSk7CisgIH0KKyAgCisgIGNhbGxfb3RoZXIoaW52YWxpZF9tb2RpZmllcnMsIk5vdGlmeVhNQXR0ck1vZExpbWl0VmlvbGF0aW9uIik7CisKK30KKworCisvLyB3ZWxjaGUgTW9kaWZpZXIgLyBtb2RpZi4gT2JqZWt0ZSB3aXJrZW4gbnVuPworcHJvdGVjdGVkIG5vbWFzayB2b2lkIGNhbGN1bGF0ZV92YWxpZF9tb2RpZmllcnMoKSB7CisgIGNsb3N1cmUgcXA7CisgIG1hcHBpbmcgcmVzOwkKKyAgc3RyaW5nIGtleTsJCisgIGludCB3ZXJ0OworICAvLyBVbnRlcnNjaGVpZHVuZyBCb251cyA8LT4gTWFsdXMsIHdlaWwgZGVyIE1hbHVzIHZvbGwgZWluZ2VoZW4gc29sbAkKKyAgaW50IGhwX21hbHVzLCBzcF9tYWx1czsKKyAKKyAgdXNlZF9hdHRyaWJ1dGVzX29mZnNldHM9KFtdKTsKKyAgY3VtdWxhdGl2ZV9tb2Q9MDsKKyAgaHBfb2ZmPXNwX29mZj0wOworICBpbnZhbGlkX21vZGlmaWVycz0oe30pOworCisgIC8vIHJhc3NlbnNwZXppZmlzY2hlIGJvbmkgUF9BVFRSSUJVVEVTX09GRlNFVFMgIAorICBpZiAoIG1hcHBpbmdwKGF0dHJpYnV0ZXNfb2Zmc2V0cykgKQorICAgIHVzZWRfYXR0cmlidXRlc19vZmZzZXRzKz1hdHRyaWJ1dGVzX29mZnNldHM7CisKKyAgaWYgKCFwb2ludGVycChhbGxfbW9kaWZpZXJzKSB8fCAhc2l6ZW9mKGFsbF9tb2RpZmllcnMpKSB7CisgICAgLy8gaW4gZGllc2VtIEZhbGwga29lbm5lbiB3aXIgaGllciBkaXJla3QgbWl0IGRpZXNlciBGdW5rdGlvbiBTY2hsdXNzCisgICAgLy8gbWFjaGVuLiA7LSkKKyAgICByZXR1cm47CisgIH0KKyAgZWxzZQorICAgIGFsbF9tb2RpZmllcnMtPSh7MH0pOyAvL3plcnN0b2VydGUgT2JqZWt0ZSByYXVzd2VyZmVuLgorICAgIAorICAvLyBlaW5tYWwgdWViZXIgYWxsZSBtb2RpZml6aWVyZW5kZW4gT2JqZWt0IGl0ZXJpZXJlbiB1bmQgYXVmYWRkaWVyZW4KKyAgZm9yZWFjaChvYmplY3Qgb2I6IGFsbF9tb2RpZmllcnMpIHsKKyAgICBxcCA9IHN5bWJvbF9mdW5jdGlvbigiUXVlcnlQcm9wIixvYik7CisgCisgICAgaWYgKCFvYmplY3RwKG9iKSB8fCBlbnZpcm9ubWVudChvYikhPXRoaXNfb2JqZWN0KCkpIHsKKyAgICAgIGFsbF9tb2RpZmllcnMtPSh7b2J9KTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAJCQorICAgIC8vIGV4dC4gQXR0cmlidXQtTW9kaWZpZXIKKyAgICBpZiAoIG1hcHBpbmdwKHJlcz1mdW5jYWxsKHFwLFBfWF9BVFRSX01PRCkpICkgewkJCisgICAgICBmb3JlYWNoKGtleSwgd2VydDogcmVzKSB7CisgICAgICAgIGN1bXVsYXRpdmVfbW9kKz13ZXJ0OworICAgICAgfQorICAgIH0KKworICAgIC8vIG1hZ2ljIEF0dHJpYnV0LU1vZGlmaWVyCisgICAgaWYgKCBtYXBwaW5ncChyZXM9ZnVuY2FsbChxcCxQX01fQVRUUl9NT0QpKQorICAgICAgICAmJiAoIGZ1bmNhbGwocXAsUF9XT1JOKQorICAgICAgICAgICAgfHwgZnVuY2FsbChxcCxQX1dJRUxERUQpICkgKSB7CQkKKyAgICAgIGZvcmVhY2goa2V5LCB3ZXJ0OiByZXMpIHsKKyAgICAgICAgY3VtdWxhdGl2ZV9tb2QrPXdlcnQ7CisgICAgICB9CisgICAgfQorICAgIC8vIE1hZ2ljIEhlYWx0aC1Nb2RpZmllciAJCQorICAgIGlmICggbWFwcGluZ3AocmVzPWZ1bmNhbGwocXAsUF9NX0hFQUxUSF9NT0QpKQorICAgICAgICAmJiAoIGZ1bmNhbGwocXAsUF9XT1JOKQorICAgICAgICAgICAgfHwgZnVuY2FsbChxcCxQX1dJRUxERUQpICkgKSB7CisgICAgICBpZiAocmVzW1BfSFBdIDwgMCkKKyAgICAgICAgaHBfbWFsdXMgKz0gcmVzW1BfSFBdOworICAgICAgZWxzZQorICAgICAgICBocF9vZmYrPXJlc1tQX0hQXTsKKworICAgICAgaWYgKHJlc1tQX1NQXSA8IDApCisgICAgICAgIHNwX21hbHVzICs9IHJlc1tQX1NQXTsKKyAgICAgIGVsc2UKKyAgICAgICAgc3Bfb2ZmKz1yZXNbUF9TUF07CisgICAgICB9CisJICAgICAgCisgICAgLy8gZXh0ZXJuYWwgSGVhbHRoIE1vZGlmaWVyCisgICAgaWYgKCBtYXBwaW5ncChyZXM9ZnVuY2FsbChxcCxQX1hfSEVBTFRIX01PRCkpICkgeworICAgICAgaWYgKHJlc1tQX0hQXSA8IDApCisgICAgICAgIGhwX21hbHVzICs9IHJlc1tQX0hQXTsKKyAgICAgIGVsc2UKKyAgICAgICAgaHBfb2ZmKz1yZXNbUF9IUF07CisKKyAgICAgIGlmIChyZXNbUF9TUF0gPCAwKQorICAgICAgICBzcF9tYWx1cyArPSByZXNbUF9TUF07CisgICAgICBlbHNlCisgICAgICAgIHNwX29mZis9cmVzW1BfU1BdOwkgICAgCisgICAgfQkKKyAgCisgIH0gLy8gRW5kZSAxLiBmb3JlYWNoKCkKKyAgCisgCisgIC8vIHVuZCBub2NobWFsLCBzb3ZpZWxlIE9iamVrdCB3aWVkZXIgcmF1c3NjaG1laXNzZW4sIGJpcyBkYXMgTGltaXQgd2llZGVyCisgIC8vIHVudGVyc2Nocml0dGVuIHdpcmQuIChWZXJiZXNzZXJ1bmdzdm9yc2NobGFlZ2UgZXJ3dWVuc2NodC4pIDotKAorICBmb3JlYWNoKG9iamVjdCBvYjogYWxsX21vZGlmaWVycykgeworCisgICAgcXAgPSBzeW1ib2xfZnVuY3Rpb24oIlF1ZXJ5UHJvcCIsb2IpOworIAorICAgIGlmICggbWFwcGluZ3AocmVzPWZ1bmNhbGwocXAsUF9YX0FUVFJfTU9EKSkgKSB7CisgICAgICBpZihjdW11bGF0aXZlX21vZD5DVU1VTEFUSVZFX0FUVFJfTElNSVQpIHsgCisgICAgICAgIGludmFsaWRfbW9kaWZpZXJzKz0oe29ifSk7CSAgCisJZm9yZWFjaChrZXksIHdlcnQ6IHJlcykgeworICAgICAgICAgIGN1bXVsYXRpdmVfbW9kLT13ZXJ0OworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgYWRkX29mZnNldHMocmVzKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIG1hcHBpbmdwKHJlcz1mdW5jYWxsKHFwLFBfTV9BVFRSX01PRCkpCisgICAgICAgICYmICggZnVuY2FsbChxcCxQX1dPUk4pCisgICAgICAgICAgICB8fCBmdW5jYWxsKHFwLFBfV0lFTERFRCkgKSApIHsKKyAgICAgIGlmKGN1bXVsYXRpdmVfbW9kPkNVTVVMQVRJVkVfQVRUUl9MSU1JVCkgeyAgICAgCisgICAgICAgIGlmKG1lbWJlcihpbnZhbGlkX21vZGlmaWVycyxvYik9PS0xKSB7CisgICAgICAgICAgaW52YWxpZF9tb2RpZmllcnMrPSh7b2J9KTsKKyAgICAgICAgfQkJCQorCWZvcmVhY2goa2V5LCB3ZXJ0OiByZXMpIHsKKyAgICAgICAgICBjdW11bGF0aXZlX21vZC09d2VydDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGFkZF9vZmZzZXRzKHJlcyk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gSEVBTFRIX01PRCB3ZXJkZW4gZHVyY2ggZWluZSBGb3JtZWwgJ2VudHNjaGFlcmZ0JywgZGFtaXQgbWFuIG51ciBzY2h3ZXIKKyAgLy8gZGFzIE1heGltdW0gdm9uIDE1MCBlcnJlaWNoZW4ga2Fubi4gKEZvcm1lbCB2b24gSHVtbmksIGJlc2NobG9zc2VuIGF1ZiAzLgorICAvLyBFTS1UcmVmZmVuKQorICAvLyBNYWxpIGdlaGVuIGFiZXIgdm9sbCBlaW4KKyAgaHBfb2ZmID0gKGludCkoMTUwIC0gKDE1MCoxNTAuMC8oMTUwICsgaHBfb2ZmKSkpICsgaHBfbWFsdXM7CisgIHNwX29mZiA9IChpbnQpKDE1MCAtICgxNTAqMTUwLjAvKDE1MCArIHNwX29mZikpKSArIHNwX21hbHVzOworCisgIC8qIGFsdGUgVmVyc2lvbgorICAgIGhwX29mZiArPSBocF9tYWx1czsKKyAgICBzcF9vZmYgKz0gc3BfbWFsdXM7CisgICovCisgCisgIC8vIG5vdGlmeSBpbnZhbGlkIG1vZGlmaWVycworICBpZihzaXplb2YoaW52YWxpZF9tb2RpZmllcnMpPjApIHsKKyAgICBjYWxsX291dCgjJ25vdGlmeUludmFsaWRNb2RpZmllcnMsMCk7CisgIH0KK30KKworLy8gYWJtZWxkZW4gZWluZXMgbW9kaWZpZXJzIAorbm9tYXNrIHB1YmxpYyB2b2lkIGRlcmVnaXN0ZXJfbW9kaWZpZXIob2JqZWN0IG1vZGlmaWVyKQoreyAKKyAgaWYgKCFwb2ludGVycChhbGxfbW9kaWZpZXJzKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIC8vIHZhbGlkIG9iamVjdD8KKyAgaWYgKCFvYmplY3RwKG1vZGlmaWVyKSB8fCBtZW1iZXIoYWxsX21vZGlmaWVycyxtb2RpZmllcik9PS0xKSB7CisgICAgcmV0dXJuOworICB9CisgIAorICBhbGxfbW9kaWZpZXJzLT0oe21vZGlmaWVyfSk7CisgIGlmIChpbnZhbGlkX21vZGlmaWVycykgeworICAgIGludmFsaWRfbW9kaWZpZXJzLT0oe21vZGlmaWVyfSk7CisgIH0KK30KKworLy8gYW5tZWxkZW4gZWluZXMgbW9kaWZpZXJzIAorbm9tYXNrIHB1YmxpYyB2b2lkIHJlZ2lzdGVyX21vZGlmaWVyKG9iamVjdCBtb2RpZmllcikgeyAKKyAgY2xvc3VyZSBxcDsKKyAgCisgIGlmICghcG9pbnRlcnAoYWxsX21vZGlmaWVycykpIHsKKyAgICBhbGxfbW9kaWZpZXJzPSh7fSk7CisgIH0KKworICAvLyB2YWxpZCBvYmplY3Q/CisgIGlmICghb2JqZWN0cChtb2RpZmllcikgfHwgZW52aXJvbm1lbnQobW9kaWZpZXIpIT10aGlzX29iamVjdCgpIHx8IAorICAgICAgbWVtYmVyKGFsbF9tb2RpZmllcnMsbW9kaWZpZXIpIT0tMSkgeworICAgIHJldHVybjsKKyAgfQorICAKKyAgcXAgPSBzeW1ib2xfZnVuY3Rpb24oIlF1ZXJ5UHJvcCIsbW9kaWZpZXIpOworICAvLyBtb2RpZmllciBhZnRlciBhbGw/IERpZSBQX01fKiBtdWVzc2VuIGdldHJhZ2VuL2dlenVlY2t0IHNlaW4uCisgIGlmKG1hcHBpbmdwKGZ1bmNhbGwocXAsUF9YX0FUVFJfTU9EKSkgfHwKKyAgICAgbWFwcGluZ3AoZnVuY2FsbChxcCxQX1hfSEVBTFRIX01PRCkpIHx8CisgICAgKChtYXBwaW5ncChmdW5jYWxsKHFwLFBfTV9BVFRSX01PRCkpIHx8CisgICAgICAgbWFwcGluZ3AoZnVuY2FsbChxcCxQX01fSEVBTFRIX01PRCkpKSAmJgorICAgICAgKGZ1bmNhbGwocXAsUF9XT1JOKSB8fCBmdW5jYWxsKHFwLFBfV0lFTERFRCkpICkgKSB7CisgICAgYWxsX21vZGlmaWVycys9KHttb2RpZmllcn0pOworICB9Cit9CisKK3Byb3RlY3RlZCB2b2lkIGFkZF9vZmZzZXRzKG1hcHBpbmcgYXJyKSB7CisgIG1peGVkICppbmQ7CisgIGludCBpOworICAKKyAgaWYgKCAhbWFwcGluZ3AoYXJyKSApCisgICAgcmV0dXJuOworCisgIGZvcmVhY2goc3RyaW5nIGtleSwgaW50IHdlcnQ6IGFycikgeworICAgIHVzZWRfYXR0cmlidXRlc19vZmZzZXRzW2tleV0rPXdlcnQ7CisgIH0KK30KKworcHVibGljIHZvaWQgVXBkYXRlQXR0cmlidXRlcygpIHsKKyAgbWl4ZWQgICAqaW5kOworICBpbnQgICAgIGk7CisgIAorICAvLyBhbGxlIGd1ZWx0aWdlbiBNb2RpZmllciBlcm1pdHRlbG4gYXVzIE9iamVrdGVuIGltIEludmVudGFyLgorICBjYWxjdWxhdGVfdmFsaWRfbW9kaWZpZXJzKCk7CisKKyAgLy8gcGVyc2lzdGVudGUgbW9kaWZpZXIgZHJhdWYgKGZyb3NjaCB6YikKKyAgLy8gYXVzIFBfQVRUUklCVVRFU19NT0RJRklFUlMKKyAgaWYgKCBtYXBwaW5ncChhdHRyaWJ1dGVzX21vZGlmaWVyKSApIHsKKyAgICBmb3JlYWNoKG1peGVkIGtleSwgbWFwcGluZyB3ZXJ0OiBhdHRyaWJ1dGVzX21vZGlmaWVyKSB7CisgICAgICBhZGRfb2Zmc2V0cyh3ZXJ0KTsgLy8gTW9kaWZpZXIgYWRkaWVyZW4uLi4JCQorICAgIH0KKyAgfQorICAvLyB0aW1lZCBtb2RpZmllciBkcmF1ZiBhdXMgUF9USU1FRF9BVFRSX01PRAorICBpbmQ9bV9pbmRpY2VzKGF0dHJpYnV0ZXNfdGltZWRfbW9kc1tUQVRUUl9FTlRSSUVTXSk7CisgIGZvciAoIGk9c2l6ZW9mKGluZCktMSA7IGk+PTAgOyBpLS0gKSB7CisgICAgLy8gTW9kaWZpZXIgYWRkaWVyZW4uLi4KKyAgICBhZGRfb2Zmc2V0cyhhdHRyaWJ1dGVzX3RpbWVkX21vZHNbVEFUVFJfRU5UUklFU11baW5kW2ldLDBdKTsKKyAgfQorICAvLyBCZWkgTW9uc3Rlcm4gd2VyZGVuIGRpZSBIUC9TUCB1ZWJsaWNoZXJ3ZWlzZSBzZWxic3QgZ2VzZXR6dAorICBpZiAoICFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHRoaXNfb2JqZWN0KCkpKQorICAgIHJldHVybjsKKworICBTZXRQcm9wKFBfTUFYX0hQLCBRdWVyeUF0dHJpYnV0ZShBX0NPTikqOCs0MitocF9vZmYpOworICBTZXRQcm9wKFBfTUFYX1NQLCBRdWVyeUF0dHJpYnV0ZShBX0lOVCkqOCs0MitzcF9vZmYpOworICAKKyAgaWYoUXVlcnlQcm9wKFBfSFApPlF1ZXJ5UHJvcChQX01BWF9IUCkpIHsKKyAgICBTZXRQcm9wKFBfSFAsUXVlcnlQcm9wKFBfTUFYX0hQKSk7CisgIH0KKyAgCisgIGlmKFF1ZXJ5UHJvcChQX1NQKT5RdWVyeVByb3AoUF9NQVhfU1ApKSB7CisgICAgU2V0UHJvcChQX1NQLFF1ZXJ5UHJvcChQX01BWF9TUCkpOworICB9CisKKyAgR01DUF9DaGFyKCAoWyBBX0lOVDogUXVlcnlBdHRyaWJ1dGUoQV9JTlQpLAorICAgICAgICAgICAgICAgIEFfREVYOiBRdWVyeUF0dHJpYnV0ZShBX0RFWCksCisgICAgICAgICAgICAgICAgQV9TVFI6IFF1ZXJ5QXR0cmlidXRlKEFfU1RSKSwKKyAgICAgICAgICAgICAgICBBX0NPTjogUXVlcnlBdHRyaWJ1dGUoQV9DT04pIF0pICk7Cit9CisKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkgeworICBocF9vZmY9c3Bfb2ZmPTA7CisgIHVzZWRfYXR0cmlidXRlc19vZmZzZXRzPShbXSk7CisgIGFsbF9tb2RpZmllcnM9KHt9KTsKKyAgaW52YWxpZF9tb2RpZmllcnM9KHt9KTsKKyAgY3VtdWxhdGl2ZV9tb2Q9MDsKKyAgCisgIFNldChQX0FUVFJJQlVURVNfTU9ESUZJRVIsIGF0dHJpYnV0ZXNfbW9kaWZpZXI9KFtdKSk7IC8vIG5pY2h0IGdlc2NodWV0enQKKyAgU2V0KFBfQVRUUklCVVRFU19PRkZTRVRTLCBhdHRyaWJ1dGVzX29mZnNldHM9KFtdKSk7CisgIFNldChQX0FUVFJJQlVURVNfT0ZGU0VUUywgUFJPVEVDVEVELCBGX01PREUpOworICBTZXQoUF9BVFRSSUJVVEVTLCBhdHRyaWJ1dGVzPShbXSkpOworICBTZXQoUF9BVFRSSUJVVEVTLCBQUk9URUNURUQsIEZfTU9ERSk7CisKKyAgU2V0KFBfVElNRURfQVRUUl9NT0QsIGF0dHJpYnV0ZXNfdGltZWRfbW9kcz0oeyAoe30pLChbXSksKFtdKSB9KSk7CisgIFNldChQX1RJTUVEX0FUVFJfTU9ELCBOT1NFVE1FVEhPRHxTRUNVUkVELCBGX01PREVfQVMpOworfQorCitzdGF0aWMgbWl4ZWQgX3F1ZXJ5X3RpbWVkX2F0dHJfbW9kKCkgeworICBtaXhlZCByZXQ7CisgIHJldHVybiBTZXQoUF9USU1FRF9BVFRSX01PRCwJICAgIAorICAgICAgKHthdHRyaWJ1dGVzX3RpbWVkX21vZHNbMF0sCisJZGVlcF9jb3B5KGF0dHJpYnV0ZXNfdGltZWRfbW9kc1sxXSksCisJZGVlcF9jb3B5KGF0dHJpYnV0ZXNfdGltZWRfbW9kc1syXSl9KSk7Cit9CisKK3N0YXRpYyBtYXBwaW5nIF9zZXRfYXR0cmlidXRlcyhtYXBwaW5nIGFycikgCit7CisgIFNldChQX0FUVFJJQlVURVMsIGF0dHJpYnV0ZXM9YXJyKTsKKyAgVXBkYXRlQXR0cmlidXRlcygpOworICByZXR1cm4gYXJyOworfQorCitzdGF0aWMgbWFwcGluZyBfcXVlcnlfYXR0cmlidXRlcygpIAoreworICByZXR1cm4gZGVlcF9jb3B5KFNldChQX0FUVFJJQlVURVMsIGF0dHJpYnV0ZXMpKTsgCit9CisKK3N0YXRpYyBtYXBwaW5nIF9zZXRfYXR0cmlidXRlc19vZmZzZXRzKG1hcHBpbmcgYXJyKSAKK3sKKyAgU2V0KFBfQVRUUklCVVRFU19PRkZTRVRTLCBhdHRyaWJ1dGVzX29mZnNldHM9YXJyKTsKKyAgVXBkYXRlQXR0cmlidXRlcygpOworICByZXR1cm4gYXR0cmlidXRlc19vZmZzZXRzOworfQorCitzdGF0aWMgbWFwcGluZyBfcXVlcnlfYXR0cmlidXRlc19vZmZzZXRzKCkgCit7IAorICByZXR1cm4gZGVlcF9jb3B5KFNldChQX0FUVFJJQlVURVNfT0ZGU0VUUywgYXR0cmlidXRlc19vZmZzZXRzKSk7Cit9CisKK3N0YXRpYyBtaXhlZCBfc2V0X2F0dHJpYnV0ZXNfbW9kaWZpZXIobWl4ZWQgYXJyKSAKK3sgc3RyaW5nIGZuOworICBtaXhlZCBwcmU7CisgIG1hcHBpbmcgbWFwX2xkZmllZDsKKyAgCisgIGlmICggcG9pbnRlcnAoYXJyKSAmJiAoc2l6ZW9mKGFycik+PTIpICkKKyAgeworICAgIHByZT1hcnJbMF07CisgICAgbWFwX2xkZmllZD1hcnJbMV07CisgIH0KKyAgZWxzZSAKKyAgeworICAgIHByZT1wcmV2aW91c19vYmplY3QoKTsKKyAgICBtYXBfbGRmaWVkPWFycjsKKyAgfQorCisgIGlmICggb2JqZWN0cChwcmUpICkKKyAgICBmbj1vbGRfZXhwbG9kZShvYmplY3RfbmFtZShwcmUpLCIjIilbMF07CisgIGVsc2UKKyAgICBmbj1wcmU7CisKKyAgaWYgKCAhc3RyaW5ncChmbikgKQorICAgIHJldHVybiAwOworCisgIC8vIHdlbm4gTW9kaWZpZXIga2VpbiBtYXBwaW5nIG9kZXIgZWluIGxlZXJlcyBNYXBwaW5nOiBsb2VzY2hlbgorICBpZiAoICFtYXBwaW5ncChtYXBfbGRmaWVkKSB8fCAhc2l6ZW9mKG1hcF9sZGZpZWQpKQorICAgIG1fZGVsZXRlKGF0dHJpYnV0ZXNfbW9kaWZpZXIsZm4pOworICBlbHNlCisgICAgYXR0cmlidXRlc19tb2RpZmllcltmbl09bWFwX2xkZmllZDsKKworICBTZXQoUF9BVFRSSUJVVEVTX01PRElGSUVSLCBhdHRyaWJ1dGVzX21vZGlmaWVyKTsKKyAgVXBkYXRlQXR0cmlidXRlcygpOworICByZXR1cm4gYXR0cmlidXRlc19tb2RpZmllcltmbl07Cit9CisKK3N0YXRpYyBtYXBwaW5nIF9xdWVyeV9hdHRyaWJ1dGVzX21vZGlmaWVyKCkgCit7CisgIHJldHVybiBkZWVwX2NvcHkoYXR0cmlidXRlc19tb2RpZmllcik7ICAKK30KKworcHVibGljIGludCBTZXRBdHRyKHN0cmluZyBhdHRyLCBpbnQgdmFsKSAKK3sgY2xvc3VyZSBmaWx0ZXJfbGRmaWVkOworCisgIGlmICggZmlsdGVyX2xkZmllZCA9IHN5bWJvbF9mdW5jdGlvbigiX2ZpbHRlcmF0dHJfIithdHRyLCB0aGlzX29iamVjdCgpKSApIAorICAgIHZhbCA9IGZ1bmNhbGwoZmlsdGVyX2xkZmllZCwgdmFsICk7CisKKyAgYXR0cmlidXRlc1thdHRyXSA9IHZhbDsKKyAgVXBkYXRlQXR0cmlidXRlcygpOworICByZXR1cm4gdmFsOworfQorCitwdWJsaWMgaW50IFNldEF0dHJpYnV0ZShzdHJpbmcgYXR0ciwgaW50IHZhbCkgCit7CisgIHJldHVybiBTZXRBdHRyKGF0dHIsIHZhbC11c2VkX2F0dHJpYnV0ZXNfb2Zmc2V0c1thdHRyXSk7Cit9CisKKy8vIERpZXNlIEZ1bmt0aW9uIHNvbGx0ZSB6dW0gQWJmcmFnZW4gdmVyd2VuZGV0IHdlcmRlbjoKK3B1YmxpYyBpbnQgUXVlcnlBdHRyaWJ1dGUoc3RyaW5nIGF0dHIpIAoreyBpbnQgcmU7CisKKyAgcmU9YXR0cmlidXRlc1thdHRyXSt1c2VkX2F0dHJpYnV0ZXNfb2Zmc2V0c1thdHRyXTsKKworICBpZiAoIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUodGhpc19vYmplY3QoKSkgJiYgKHJlPjMwKSApCisgICAgcmU9MzA7CisKKyAgcmV0dXJuIHJlOworfQorCitwdWJsaWMgaW50IFF1ZXJ5UmVhbEF0dHJpYnV0ZShzdHJpbmcgYXR0cikgCit7CisgIHJldHVybiBhdHRyaWJ1dGVzW2F0dHJdOworfQorCitwdWJsaWMgaW50IFNldFJlYWxBdHRyaWJ1dGUoc3RyaW5nIGF0dHIsIGludCB2YWwpIAoreworICByZXR1cm4gU2V0QXR0cihhdHRyLCB2YWwpOworfQorCitwdWJsaWMgaW50IFF1ZXJ5QXR0cmlidXRlT2Zmc2V0KHN0cmluZyBhdHRyKSAKK3sKKyAgcmV0dXJuIHVzZWRfYXR0cmlidXRlc19vZmZzZXRzW2F0dHJdOworfQorCitwdWJsaWMgc3RhdHVzIFRlc3RMaW1pdFZpb2xhdGlvbihtYXBwaW5nIGNoZWNrKQoreworICBpbnQgayx0ZXN0OworICBtaXhlZCogaW5kOworICAgIAorICBpZighY2hlY2sgfHwgIW1hcHBpbmdwKGNoZWNrKSkKKyAgeworICAgIHJldHVybiAwOworICB9CisKKyAgdGVzdD0wOworICBpbmQ9bV9pbmRpY2VzKGNoZWNrKTsKKyAgZm9yKCBrPXNpemVvZihpbmQpLTEgOyBrPj0wIDsgay0tICkKKyAgeworICAgIHRlc3QrPWNoZWNrW2luZFtrXV07CisgIH0KKyAgCisgIHRlc3QrPWN1bXVsYXRpdmVfbW9kOworICBpZih0ZXN0PkNVTVVMQVRJVkVfQVRUUl9MSU1JVCkKKyAgeworICAgIHJldHVybiAxOworICB9CisgIAorICByZXR1cm4gMDsKK30KKworLyoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBhdHRyaWJ1dGVzIGNvbXBhdGliaWxpdHkgZnVuY3Rpb25zCisgKi8KKworcHJvdGVjdGVkIGludCBfZmlsdGVyYXR0cl9zdHIoaW50IHZhbCkKK3sKKyAgcmV0dXJuICggKHZhbDwwKSA/IDAgOiAodmFsPjIwKSA/IDIwIDogdmFsICk7Cit9CisKK3Byb3RlY3RlZCBpbnQgX2ZpbHRlcmF0dHJfZGV4KGludCB2YWwpCit7CisgIHJldHVybiAoICh2YWw8MCkgPyAwIDogKHZhbD4yMCkgPyAyMCA6IHZhbCApOworfQorCitwcm90ZWN0ZWQgaW50IF9maWx0ZXJhdHRyX2ludChpbnQgdmFsKQoreworICByZXR1cm4gKCAodmFsPDApID8gMCA6ICh2YWw+MjApID8gMjAgOiB2YWwgKTsKK30KKworcHJvdGVjdGVkIGludCBfZmlsdGVyYXR0cl9jb24oaW50IHZhbCkKK3sKKyAgcmV0dXJuICggKHZhbDwwKSA/IDAgOiAodmFsPjIwKSA/IDIwIDogdmFsICk7Cit9CmRpZmYgLS1naXQgYS9zdGQvbGl2aW5nL2Nsb3RoaW5nLmMgYi9zdGQvbGl2aW5nL2Nsb3RoaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZhZmY0NAotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9saXZpbmcvY2xvdGhpbmcuYwpAQCAtMCwwICsxLDk2IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gbGl2aW5nL2Nsb3RoaW5nLmMgLS0gTW9kdWwgZnVlciBCZWtsZWlkdW5nc2ZyYWdlbi4gOy0pCisvLworLy8gJElkOiBhcm1vdXIuYyx2IDMuOCAyMDAzLzA4LzI1IDA5OjM2OjA0IFJpa3VzIEV4cCAkCisjcHJhZ21hIHN0cm9uZ190eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPgorI3VuZGVmIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPGxpdmluZy9jbG90aGluZy5oPgorI2luY2x1ZGUgPGxpdmluZy9jb21iYXQuaD4KKyNpbmNsdWRlIDxhcm1vdXIuaD4KKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkgeworICBTZXRQcm9wKFBfQ0xPVEhJTkcsICh7fSkpOworICBTZXQoUF9DTE9USElORywgUFJPVEVDVEVELCBGX01PREVfQVMpOworfQorCitwdWJsaWMgb2JqZWN0ICpGaWx0ZXJDbG90aGluZyhjbG9zdXJlIGZpbHRlcmZ1biwgdmFyYXJncyBtaXhlZCogZXh0cmEpIHsKKyAgaWYgKCFjbG9zdXJlcChmaWx0ZXJmdW4pKQorICAgIHJldHVybiAoe30pOworICByZXR1cm4gYXBwbHkoIydmaWx0ZXIsIFF1ZXJ5UHJvcChQX0NMT1RISU5HKSwgZmlsdGVyZnVuLCBleHRyYSk7Cit9CisKK3B1YmxpYyBvYmplY3QgKkZpbHRlckFybW91cnMoY2xvc3VyZSBmaWx0ZXJmdW4sIHZhcmFyZ3MgbWl4ZWQqIGV4dHJhKSB7CisgIGlmICghY2xvc3VyZXAoZmlsdGVyZnVuKSkKKyAgICByZXR1cm4gKHt9KTsKKyAgcmV0dXJuIGFwcGx5KCMnZmlsdGVyLCBRdWVyeVByb3AoUF9BUk1PVVJTKS0oezB9KSwgZmlsdGVyZnVuLCBleHRyYSk7Cit9CisKK3B1YmxpYyBpbnQgV2VhckNsb3RoaW5nKG9iamVjdCBvYikgeworICBvYmplY3QgKmNsb3RoaW5nID0gUXVlcnlQcm9wKFBfQ0xPVEhJTkcpOworICBpZiAobWVtYmVyKGNsb3RoaW5nLCBvYikgIT0gLTEpCisgICAgcmV0dXJuIDA7CisgIGNsb3RoaW5nICs9ICh7b2J9KTsKKyAgU2V0UHJvcChQX0NMT1RISU5HLCBjbG90aGluZyk7CisgIHJldHVybiAxOworfQorCitwdWJsaWMgaW50IFdlYXJBcm1vdXIob2JqZWN0IG9iKSB7CisgIGlmICghVkFMSURfQVJNT1VSX1RZUEUob2ItPlF1ZXJ5UHJvcChQX0FSTU9VUl9UWVBFKSkpCisgICAgcmV0dXJuIDA7CisKKyAgb2JqZWN0ICphcm1vdXJzID0gUXVlcnlQcm9wKFBfQVJNT1VSUyk7CisgIGlmIChtZW1iZXIoYXJtb3Vycywgb2IpICE9IC0xKQorICAgIHJldHVybiAwOworCisgIGFybW91cnMgKz0gKHtvYn0pOworICBTZXRQcm9wKFBfQVJNT1VSUywgYXJtb3Vycyk7CisgIHJldHVybiAxOworfQorCitwdWJsaWMgaW50IFdlYXIob2JqZWN0IG9iKSB7CisgIC8vIHJlaWhlbmZvbGdlIGlzdCB3aWNodGlnISBSdWVzdHVuZyBzaW5kIF9hdWNoXyBLbGVpZHVuZywgYWJlciBLbGVpZHVuZworICAvLyBrZWluZSBSdWVzdHVuZy4KKyAgaWYgKG9iLT5Jc0FybW91cigpKQorICAgIHJldHVybiBXZWFyQXJtb3VyKG9iKTsKKyAgZWxzZSBpZiAob2ItPklzQ2xvdGhpbmcoKSkKKyAgICByZXR1cm4gV2VhckNsb3RoaW5nKG9iKTsKKyAgcmV0dXJuIDA7Cit9CisKK3B1YmxpYyBpbnQgVW53ZWFyQ2xvdGhpbmcob2JqZWN0IG9iKSB7CitvYmplY3QgKmNsb3RoaW5nID0gUXVlcnlQcm9wKFBfQ0xPVEhJTkcpOworICBpZiAobWVtYmVyKGNsb3RoaW5nLCBvYikgPT0gLTEpCisgICAgcmV0dXJuIDA7CisgIGNsb3RoaW5nIC09ICh7b2J9KTsKKyAgU2V0UHJvcChQX0NMT1RISU5HLCBjbG90aGluZyk7CisgIHJldHVybiAxOworfQorCitwdWJsaWMgaW50IFVud2VhckFybW91cihvYmplY3Qgb2IpIHsKKyAgb2JqZWN0ICphcm1vdXJzID0gUXVlcnlQcm9wKFBfQVJNT1VSUyk7CisgIGlmIChtZW1iZXIoYXJtb3Vycywgb2IpID09IC0xKQorICAgIHJldHVybiAwOworCisgIGFybW91cnMgLT0gKHtvYn0pOworICBTZXRQcm9wKFBfQVJNT1VSUywgYXJtb3Vycyk7CisgIHJldHVybiAxOworfQorCitwdWJsaWMgaW50IFVud2VhcihvYmplY3Qgb2IpIHsKKyAgLy8gcmVpaGVuZm9sZ2UgaXN0IHdpY2h0aWchIFJ1ZXN0dW5nIHNpbmQgX2F1Y2hfIEtsZWlkdW5nLCBhYmVyIEtsZWlkdW5nCisgIC8vIGtlaW5lIFJ1ZXN0dW5nLgorICBpZiAob2ItPklzQXJtb3VyKCkpCisgICAgcmV0dXJuIFVud2VhckFybW91cihvYik7CisgIGVsc2UgaWYgKG9iLT5Jc0Nsb3RoaW5nKCkpCisgICAgcmV0dXJuIFVud2VhckNsb3RoaW5nKG9iKTsKKyAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL3N0ZC9saXZpbmcvY29tYmF0LmMgYi9zdGQvbGl2aW5nL2NvbWJhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MGYzZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvbGl2aW5nL2NvbWJhdC5jCkBAIC0wLDAgKzEsMjMxMSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGxpdmluZy9jb21iYXQuYyAtLSBCYXNpcy1LYW1wZm1vZHVsCisvLworLy8gJElkOiBjb21iYXQuYyA5NTY4IDIwMTYtMDYtMDUgMTg6NTM6MTBaIFplc3N0cmEgJAorI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCitpbmhlcml0ICIvc3RkL2xpdmluZy9za2lsbF91dGlscyI7Citpbmhlcml0ICIvc3RkL2xpdmluZy9pbnZlbnRvcnkiOworaW5oZXJpdCAiL3N0ZC9saXZpbmcvdGVhbSI7CisKKyNpbmNsdWRlIDxzeXNfZGVidWcuaD4KKyNpbmNsdWRlIDxkZWJ1Z19tZXNzYWdlLmg+CisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8aG9vay5oPgorI2luY2x1ZGUgPGxpdmluZy9za2lsbHMuaD4KKyNpbmNsdWRlIDx0aGluZy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8cGxheWVyL2NvbW0uaD4KKyNpbmNsdWRlIDxsaXZpbmcvc2tpbGxfYXR0cmlidXRlcy5oPgorI2luY2x1ZGUgPGNvbWJhdC5oPgorI2luY2x1ZGUgPGxpdmluZy5oPgorI3VuZGVmIE5FRURfUFJPVE9UWVBFUworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8YXR0cmlidXRlcy5oPgorI2luY2x1ZGUgPG5ld19za2lsbHMuaD4KKworI2luY2x1ZGUgPGRlZmluZXMuaD4KKworI2luY2x1ZGUgPHNlbnNpdGl2ZS5oPgorCisjZGVmaW5lIEhVTlRUSU1FIDMwMCAvLzMwMCBIQnMgc2luZCAxMCBNaW51dGVuCisjZGVmaW5lIFJOQU1FKHgpIGNhcGl0YWxpemUoZ2V0dWlkKHgpKQorCisvLyAncHJpdmF0ZSctUHJvdG90eXBlcworcHJpdmF0ZSBzdHJpbmcgX2tpbGxfYWxpYXMoIHN0cmluZyBzdHIgKTsKKworLy8gZ2xvYmFsZSBWYXJpYWJsZW4KK25vc2F2ZSBtYXBwaW5nIGVuZW1pZXM7Citwcml2YXRlIG5vc2F2ZSBzdHJpbmcgbWFnaWNfYXR0YWNrOworcHJpdmF0ZSBub3NhdmUgaW50IGF0dGFja19idXN5Oworbm9zYXZlIGludCBub19tb3JlX2F0dGFja3M7Citwcml2YXRlIG5vc2F2ZSBpbnQgcmVtYWluaW5nX2hlYXJ0X2JlYXRzOworcHJpdmF0ZSBub3NhdmUgaW50IGF0dDJfdGltZTsKK3ByaXZhdGUgbm9zYXZlIHN0cmluZyBsYXN0X2F0dGFja19tc2c7Citwcml2YXRlIG5vc2F2ZSBvYmplY3QgKm1pc3NpbmdfYXR0YWNrczsKK3ByaXZhdGUgbm9zYXZlIG1hcHBpbmcgcGVhY2VfdHJpZXM7CisvLyBDYWNoZSBmdWVyIFF1ZXJ5QXJtb3VyQnlUeXBlKCkKK3ByaXZhdGUgbm9zYXZlIG1hcHBpbmcgUUFCVENhY2hlOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICBTZXQoUF9XSU1QWSwgU0FWRSwgRl9NT0RFX0FTKTsKKyAgU2V0KFBfVE9UQUxfQUMsIFBST1RFQ1RFRCwgRl9NT0RFX0FTKTsKKyAgU2V0KFBfSEFORFMsIFNBVkUsIEZfTU9ERV9BUyk7CisgIFNldChQX1NIT1dfQVRUQUNLX01TRyxTQVZFLEZfTU9ERV9BUyk7CisgIFNldChQX1JFU0lTVEFOQ0UsICh7fSkpOworICBTZXQoUF9WVUxORVJBQklMSVRZLCAoe30pKTsKKyAgU2V0KFBfR1VJTERfUFJFUEFSRUJMT0NLLCBTQVZFLCBGX01PREVfQVMpOworICAvLyBLZWluIFNldHplbiB2b24gUF9BUk1PVVJTIHZvbiBhdXNzZW4gcGVyIFNldCgpLiAoUGVyIFNldFByb3AoKSBnZWh0IGVzCisgIC8vIGR1cmNoIGRpZSBTZXRtZXRob2RlKS4KKyAgU2V0KFBfQVJNT1VSUyxQUk9URUNURUQsRl9NT0RFX0FTKTsKKyAgU2V0UHJvcChQX0FSTU9VUlMsICh7fSkpOworICBhdHRhY2tfYnVzeT0xMDA7CisgIGF0dDJfdGltZT0wOworICBlbmVtaWVzPShbXSk7CisgIHBlYWNlX3RyaWVzPShbXSk7CisgIHRlYW06OmNyZWF0ZSgpOyAKKyAgb2ZmZXJIb29rKEhfSE9PS19ERUZFTkQsMSk7CisgIG9mZmVySG9vayhIX0hPT0tfQVRUQUNLLDEpOworICBvZmZlckhvb2soSF9IT09LX0FUVEFDS19NT0QsMSk7Cit9CisKKyN1bmRlZiBERUJVRworI2RlZmluZSBERUJVRyh4KSBpZiAoZmluZF9vYmplY3QoInplc3N0cmEiKSkgXAorICB0ZWxsX29iamVjdChmaW5kX3BsYXllcigiemVzc3RyYSIpLHgpCisKK3B1YmxpYyB2b2lkIFVwZGF0ZVJlc2lzdGFuY2VTdHJlbmd0aHMoKSB7IAorICBtYXBwaW5nIHJlc21vZHMsIHN0cm1hcDsKKworICBpZiAoICFtYXBwaW5ncChyZXNtb2RzPVF1ZXJ5KFBfUkVTSVNUQU5DRV9NT0RJRklFUikpICkKKyAgICByZXR1cm47CisKKyAgLy9lcnN0bWFsIGRpZSBhbHRlIEF1ZnN1bW1hdGlvbiBsb2VzY2hlbgorICBtX2RlbGV0ZShyZXNtb2RzLCJtZSIpOworCisgIC8vd2VubiBqZXR6dCBsZWVyOiBBYmJydWNoLCBrZWluZSBSZXMtTW9kaWZpZXIgZGEuCisgIGlmICghc2l6ZW9mKHJlc21vZHMpKQorICAgICAgcmV0dXJuKFNldChQX1JFU0lTVEFOQ0VfTU9ESUZJRVIsMCkpOworCisgIHN0cm1hcCA9IChbXSk7CisKKyAgLy8gdWViZXIgYWxsZSBnZXNldHp0ZW4gUmVzTW9kaWZpZXIgZ2VoZW4KKyAgZm9yZWFjaChzdHJpbmcgbW9kLCBtYXBwaW5nIHJlc21hcCwgb2JqZWN0IG9iOiByZXNtb2RzKSB7CisgICAgaWYgKCAhbWFwcGluZ3AocmVzbWFwKSB8fCAhc2l6ZW9mKHJlc21hcCkKKyAgICAgICAgfHwgIW9iamVjdHAob2IpICkgeworICAgICAgbV9kZWxldGUocmVzbW9kcywgbW9kKTsKKyAgICAgIGNvbnRpbnVlOyAvLyBSZXNpIHVuZ3VlbHRpZywgd2VnIGRhbWl0LgorICAgIH0KKyAgICAvLyBqZXR6dCBub2NoIHVlYmVyIGRpZSBTdWJtYXBwaW5ncyBsYXVmZW4sIGRpZSBkaWUgUmVzaXMgZGVyIE9iamVrdGUKKyAgICAvLyBiZWluaGFsdGVuLgorICAgIGZvcmVhY2goc3RyaW5nIHJlc2tleSwgZmxvYXQgcmVzaTogcmVzbWFwKSB7CisgICAgICAgIHN0cm1hcFtyZXNrZXldID0gKChzdHJtYXBbcmVza2V5XSsxLjApKihyZXNpKzEuMCkpLTEuMDsKKyAgICB9CisgIH0KKworICBpZiAoICFzaXplb2Yoc3RybWFwKSApCisgICAgU2V0KFBfUkVTSVNUQU5DRV9NT0RJRklFUiwgMCk7CisgIGVsc2UKKyAgICBTZXQoUF9SRVNJU1RBTkNFX01PRElGSUVSLCByZXNtb2RzKyhbICJtZSIgOiBzdHJtYXA7IDAgXSkgKTsKK30KKworcHVibGljIHZhcmFyZ3MgaW50IEFkZFJlc2lzdGFuY2VNb2RpZmllcihtYXBwaW5nIG1vZCwgc3RyaW5nIGFkZCkKK3sgc3RyaW5nICBrZXk7CisgIG1hcHBpbmcgcmVzOworCisgIGlmICggIW1hcHBpbmdwKG1vZCkgfHwgIXNpemVvZihtb2QpIHx8ICFwcmV2aW91c19vYmplY3QoKSApCisgICAgcmV0dXJuIDA7CisKKyAga2V5ID0gZXhwbG9kZShvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSksIiMiKVswXTsKKworICBpZiAoIGFkZCApCisgICAga2V5ICs9ICgiIyIrYWRkKTsKKworICByZXMgPSBRdWVyeShQX1JFU0lTVEFOQ0VfTU9ESUZJRVIpOworICBtb2QgPSBkZWVwX2NvcHkobW9kKTsKKworICBpZiAoICFtYXBwaW5ncChyZXMpICkKKyAgICByZXMgPSAoWyBrZXkgOiBtb2Q7IHByZXZpb3VzX29iamVjdCgpIF0pOworICBlbHNlCisgICAgcmVzICs9IChbIGtleSA6IG1vZDsgcHJldmlvdXNfb2JqZWN0KCkgXSk7CisKKyAgU2V0KFBfUkVTSVNUQU5DRV9NT0RJRklFUiwgcmVzKTsKKyAgVXBkYXRlUmVzaXN0YW5jZVN0cmVuZ3RocygpOworCisgIHJldHVybiAxOworfQorCitwdWJsaWMgdmFyYXJncyB2b2lkIFJlbW92ZVJlc2lzdGFuY2VNb2RpZmllcihzdHJpbmcgYWRkKQoreyBzdHJpbmcgIGtleTsKKyAgbWFwcGluZyByZXM7CisKKyAgaWYgKCAhcHJldmlvdXNfb2JqZWN0KCkgKQorICAgIHJldHVybjsKKworICBrZXkgPSBleHBsb2RlKG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSwiIyIpWzBdOworCisgIGlmICggYWRkICkKKyAgICBrZXkgKz0gKCIjIithZGQpOworCisgIGlmICggIW1hcHBpbmdwKHJlcyA9IFF1ZXJ5KFBfUkVTSVNUQU5DRV9NT0RJRklFUikpICkKKyAgICByZXR1cm47CisKKyAgbV9kZWxldGUocmVzLCBrZXkpOworICBTZXQoUF9SRVNJU1RBTkNFX01PRElGSUVSLCByZXMpOworICBVcGRhdGVSZXNpc3RhbmNlU3RyZW5ndGhzKCk7Cit9CisKKy8vIHZlcmFsdGV0ZSBQcm9wLCBhdXMgS29tcGF0aWJpbGl0YWV0c2dydWVuZGVuIG5vY2ggdm9yaGFuZGVuLgorc3RhdGljIG1peGVkIF9zZXRfcmVzaXN0YW5jZShtaXhlZCBhcmcpCit7IGludCAgICAgaTsKKyAgbWFwcGluZyByZXNpbWFwOworICBtaXhlZCAgIG9sZDsKKworICBpZiAoICFwb2ludGVycChhcmcpICkKKyAgICBhcmc9KHthcmd9KTsKKworICBpZiAoICFtYXBwaW5ncChyZXNpbWFwPVF1ZXJ5KFBfUkVTSVNUQU5DRV9TVFJFTkdUSFMpKSApCisgICAgcmVzaW1hcD0oW10pOworCisgIGlmICggcG9pbnRlcnAob2xkPVF1ZXJ5UHJvcChQX1JFU0lTVEFOQ0UpKSApCisgICAgZm9yICggaT1zaXplb2Yob2xkKS0xIDsgaT49MCA7IGktLSApCisgICAgICByZXNpbWFwW29sZFtpXV09KDEuMCsoKGZsb2F0KXJlc2ltYXBbb2xkW2ldXSkpKjIuMC0xLjA7CisKKyAgZm9yICggaT1zaXplb2YoYXJnKS0xIDsgaT49MCA7IGktLSApCisgICAgcmVzaW1hcFthcmdbaV1dPSgxLjArKChmbG9hdClyZXNpbWFwW2FyZ1tpXV0pKSowLjUtMS4wOworCisgIFNldFByb3AoUF9SRVNJU1RBTkNFX1NUUkVOR1RIUyxyZXNpbWFwKTsKKworICByZXR1cm4gU2V0KFBfUkVTSVNUQU5DRSxhcmcpOworfQorCisvLyB2ZXJhbHRldGUgUHJvcCwgYXVzIEtvbXBhdGliaWxpdGFldHNncnVlbmRlbiBub2NoIHZvcmhhbmRlbi4KK3N0YXRpYyBtaXhlZCBfc2V0X3Z1bG5lcmFiaWxpdHkobWl4ZWQgYXJnKQoreyBpbnQgICAgIGk7CisgIG1hcHBpbmcgcmVzaW1hcDsKKyAgbWl4ZWQgICBvbGQ7CisKKyAgaWYgKCAhcG9pbnRlcnAoYXJnKSApCisgICAgYXJnPSh7YXJnfSk7CisKKyAgaWYgKCAhbWFwcGluZ3AocmVzaW1hcD1RdWVyeShQX1JFU0lTVEFOQ0VfU1RSRU5HVEhTKSkgKQorICAgIHJlc2ltYXA9KFtdKTsKKworICBpZiAoIHBvaW50ZXJwKG9sZD1RdWVyeVByb3AoUF9WVUxORVJBQklMSVRZKSkgKQorICAgIGZvciAoIGk9c2l6ZW9mKG9sZCktMSA7IGk+PTAgOyBpLS0gKQorICAgICAgcmVzaW1hcFtvbGRbaV1dPSgxLjArKChmbG9hdClyZXNpbWFwW29sZFtpXV0pKSowLjUtMS4wOworCisgIGZvciAoIGk9c2l6ZW9mKGFyZyktMSA7IGk+PTAgOyBpLS0gKQorICAgIHJlc2ltYXBbYXJnW2ldXT0oMS4wKygoZmxvYXQpcmVzaW1hcFthcmdbaV1dKSkqMi4wLTEuMDsKKworICBTZXRQcm9wKFBfUkVTSVNUQU5DRV9TVFJFTkdUSFMscmVzaW1hcCk7CisKKyAgcmV0dXJuIFNldChQX1ZVTE5FUkFCSUxJVFksYXJnKTsKK30KKworCisvKioga2lsbCAtIEthbXBmIHN0YXJ0ZW4uCisgKiBGdWVndCBvYiBkZXIgRmVpbmRlc2xpc3RlIGhpbnp1LgorICovCitwdWJsaWMgaW50IEtpbGwob2JqZWN0IG9iKQoreyBpbnQgICByZXMsIGFyZW5hOworICBpbnR8c3RyaW5nIG5vX2F0dGFjazsKKworICBpZiAoICFvYmplY3RwKG9iKSApCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKCBvYi0+UXVlcnlQcm9wKFBfR0hPU1QpICkKKyAgeworICAgIHRlbGxfb2JqZWN0KE1FLG9iLT5OYW1lKFdFUikrIiBpc3QgZG9jaCBzY2hvbiB0b3QhXG4iKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBpZiAoIG5vX2F0dGFjayA9IG9iLT5RdWVyeVByb3AoUF9OT19BVFRBQ0spICkKKyAgeworICAgIGlmICggc3RyaW5ncChub19hdHRhY2spICkKKyAgICAgIHRlbGxfb2JqZWN0KE1FLCBub19hdHRhY2spOworICAgIGVsc2UKKyAgICAgIHRlbGxfb2JqZWN0KE1FLCBvYi0+TmFtZShXRVIsMSkrIiBsYWVzc3Qgc2ljaCBuaWNodCBhbmdyZWlmZW4hXG4iKTsKKworICAgIHJldHVybiAtMjsKKyAgfQorCisgIGlmICggUXVlcnlQcm9wKFBfTk9fQVRUQUNLKSApCisgICAgcmV0dXJuIC0zOworCisgIHJlcz1JbnNlcnRFbmVteShvYik7CisgIGlmIChyZXMpCisgICAgdGVsbF9vYmplY3QoTUUsICJPay5cbiIpOworICBlbHNlIGlmIChJc0VuZW15KG9iKSkKKyAgICB0ZWxsX29iamVjdChNRSwgIkphamFqYSwgbWFjaHN0IER1IGRvY2ggc2Nob24hXG4iKTsKKyAgLy9lbHNlIC8va2VpbiBndWVsdGlnZXIgRmVpbmQsIG9iIHd1cmRlIG5pY2h0IGVpbmdldHJhZ2VuLgorCisgIGlmICggIXJlcyApCisgICAgcmV0dXJuIC00OyAgLy8gbmljaHQgYWVuZGVybiBvaG5lIEtpbGwgaW4gcGxheWVyL2NvbWJhdC5jCisKKyAgcmV0dXJuIDE7Cit9CisKK3B1YmxpYyBpbnQgSW5zZXJ0U2luZ2xlRW5lbXkob2JqZWN0IG9iKQoreworICAgIGlmICggIWxpdmluZyhvYikgKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8vIFdpZSBsYW5nZSB2ZXJmb2xndCBkaWVzZXMgTGl2aW5nPyBXZW5uIFByb3AgbmljaHQgZ2VzZXR6dCBvZGVyIAorICAgIC8vIHVuZ3VlbHRpZywgZC5oLiBrZWluIGludCBvZGVyIDw9IDAsIGRhbm4gd2lyZCBkaWUgRGVmYXVsdHplaXQgZ2Vub21tZW4uCisgICAgaW50IGh1bnR0aW1lID0gKGludClRdWVyeVByb3AoUF9IVU5UVElNRSk7CisgICAgaHVudHRpbWUgPSAoaW50cChodW50dGltZSkgJiYgaHVudHRpbWUgPiAwKSA/IAorICAgICAgICAgICAgICAgICBodW50dGltZSAvIF9fSEVBUlRfQkVBVF9JTlRFUlZBTF9fIDogSFVOVFRJTUU7CisKKyAgICAvLyBBdWNoIHdlbm4gZWluIE9iamVrdCBzY2hvbiBhbHMgR2VnbmVyIGVpbmdldHJhZ2VuIGlzdCwgdHJvdHpkZW0gZGllCisgICAgLy8gSFVOVFRJTUUgZXJuZXVlcm4uIERhcyAicmV0dXJuIDA7IiBtdXNzIGFiZXIgYmxlaWJlbiwgZGEgZGVyIEdlZ25lcgorICAgIC8vIGphIG5pY2h0IG5ldSBpc3QuCisgICAgLy8KKyAgICAvLyAwOS4xMi4yMDAwLCBUaWFtYWsKKyAgICBpZiAoIG1lbWJlciggZW5lbWllcywgb2IgKSApIHsKKyAgICAgICAgZW5lbWllc1tvYixFTkVNWV9IVU5UVElNRV0gPSBodW50dGltZTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKCAob2I9PU1FKSB8fCBRdWVyeVByb3AoUF9OT19BVFRBQ0spCisgICAgICAgICB8fCAhb2JqZWN0cChvYikgfHwgKG9iLT5RdWVyeVByb3AoUF9OT19BVFRBQ0spKQorICAgICAgICAgfHwgKG9iLT5RdWVyeVByb3AoUF9HSE9TVCkpICkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBvYmplY3QgdGVhbTsKKyAgICBpZiAoICggcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShNRSkgfHwgcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYikgKQorICAgICAgICAgJiYgb2JqZWN0cCh0ZWFtPVF1ZXJ5KFBfVEVBTSkpICYmICh0ZWFtPT0ob2ItPlF1ZXJ5KFBfVEVBTSkpKSApCisgICAgICAgIHJldHVybiAwOworCisgICAgc2V0X2hlYXJ0X2JlYXQoMSk7CisKKyAgICBsYXN0X2F0dGFja19tc2c9MDsKKworICAgIGVuZW1pZXNbb2IsRU5FTVlfSFVOVFRJTUVdID0gaHVudHRpbWU7CisgICAgU2V0KFBfTEFTVF9DT01CQVRfVElNRSx0aW1lKCkpOworCisgICAgcmV0dXJuIDE7Cit9CisKK3B1YmxpYyBpbnQgSW5zZXJ0RW5lbXkob2JqZWN0IG9iKQoreyBpbnQgcmVzOworCisgIGlmICggcmVzPUluc2VydFNpbmdsZUVuZW15KG9iKSApCisgICAgSW5zZXJ0RW5lbXlUZWFtKG9iKTsKKworICByZXR1cm4gcmVzOworfQorCitwdWJsaWMgb2JqZWN0IFF1ZXJ5UHJlZmVyZWRFbmVteSgpCit7IGludCAgICBzeixyOworICA8aW50fG9iamVjdD4qICBwcmVmOworICBvYmplY3QgZW5lbXk7CisKKyAgZW5lbXk9MDsKKyAgaWYgKCBwb2ludGVycChwcmVmPVF1ZXJ5UHJvcChQX1BSRUZFUkVEX0VORU1ZKSkgJiYgKChzej1zaXplb2YocHJlZikpPjEpCisgICAgICAmJiBpbnRwKHI9cHJlZlswXSkgJiYgKHJhbmRvbSgxMDApPHIpICkKKyAgeworICAgIGVuZW15PXByZWZbMStyYW5kb20oc3otMSldOworCisgICAgaWYgKCAhb2JqZWN0cChlbmVteSkgKQorICAgIHsKKyAgICAgIHByZWYtPSh7ZW5lbXl9KTsKKworICAgICAgaWYgKCBzaXplb2YocHJlZik8MiApCisgICAgICAgIHByZWY9MDsKKworICAgICAgU2V0UHJvcChQX1BSRUZFUkVEX0VORU1ZLHByZWYpOworCisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoICFJc0VuZW15KGVuZW15KSApCisgICAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiBlbmVteTsKK30KKworcHVibGljIG9iamVjdCAqUHJlc2VudEVuZW1pZXMoKSB7CisKKyAgb2JqZWN0ICpoZXJlPSh7fSk7CisgIG9iamVjdCAqbmV0ZGVhZD0oe30pOworICBtaXhlZCBub19hdHRhY2s7CisgIGZvcmVhY2gob2JqZWN0IHBsOiBlbmVtaWVzKSB7CisgICAgaWYgKG5vX2F0dGFjayA9IChtaXhlZClwbC0+UXVlcnlQcm9wKFBfTk9fQVRUQUNLKSkgeworICAgICAgbV9kZWxldGUoZW5lbWllcyxwbCk7CisgICAgICAvLyBVbmQgYXVjaCBpbSBHZWduZXIgYXVzdHJhZ2VuLCBzb25zdCBoYXV0IGRlciB3ZWl0ZXIgenUgdW5kIGRpZXNlcworICAgICAgLy8gTGl2aW5nIHdlaHJ0IHNpY2ggbmljaHQuIChaZXNzdHJhLCAyNi4xMS4yMDA2KQorICAgICAgaWYgKHN0cmluZ3Aobm9fYXR0YWNrKSkgeworICAgICAgICB0ZWxsX29iamVjdChNRSwgbm9fYXR0YWNrKTsKKyAgICAgICAgcGwtPlN0b3BIdW50Rm9yKE1FLCAxKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgcGwtPlN0b3BIdW50Rm9yKE1FLCAwKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIGVudmlyb25tZW50KCk9PWVudmlyb25tZW50KHBsKSApCisgICAgeworICAgICAgaWYgKCBpbnRlcmFjdGl2ZShwbCkgfHwgIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUocGwpICkKKyAgICAgICAgaGVyZSs9KHtwbH0pOworICAgICAgZWxzZQorICAgICAgICBuZXRkZWFkKz0oe3BsfSk7CisgICAgfQorICB9CisKKyAgaWYgKCAhc2l6ZW9mKGhlcmUpICkgLy8gTmV0enRvdGUgc2luZCBudXIgRmVpbmRlLCBmYWxscyBrZWluZSBhbmRlcmVuIGRhIHNpbmQKKyAgICByZXR1cm4gbmV0ZGVhZDsKKworICByZXR1cm4gaGVyZTsKK30KKworcHVibGljIHZhcmFyZ3Mgb2JqZWN0IFNlbGVjdEVuZW15KG9iamVjdCAqaGVyZSkKK3sgb2JqZWN0IGVuZW15OworCisgIGlmICggIXBvaW50ZXJwKGhlcmUpICkKKyAgICBoZXJlPVByZXNlbnRFbmVtaWVzKCk7CisKKyAgaWYgKCAhc2l6ZW9mKGhlcmUpICkKKyAgICByZXR1cm4gMDsKKworICBpZiAoICFvYmplY3RwKGVuZW15PVF1ZXJ5UHJlZmVyZWRFbmVteSgpKQorICAgICAgfHwgKGVudmlyb25tZW50KGVuZW15KSE9ZW52aXJvbm1lbnQoKSkgKQorICAgIGVuZW15PWhlcmVbcmFuZG9tKHNpemVvZihoZXJlKSldOworCisgIHJldHVybiBlbmVteTsKK30KKworcHJvdGVjdGVkIHZvaWQgaGVhcnRfYmVhdCgpIHsKKyAgaW50IGhiczsgCisgIC8vIGxlaWRlciBydWZlbiB2aWVsZSBMZXV0ZSBlaW5mYWNoIGRhcyBnZWVyYnRlIGhlYXJ0X2JlYXQoKSBvYndvaGwgc2llCisgIC8vIHNjaG9uIHRvdCBzaW5kIHVuZCBkYW1pdCBkYXMgT2JqZWt0IHplcnN0b2VydCBpc3QuCisgIGlmICghbGl2aW5nKHRoaXNfb2JqZWN0KCkpKQorICAgICAgcmV0dXJuOworCisgIC8vIFBhcmFseXNlIHBydWVmZW4sIGdnZi4gcmVkdXppZXJlbgorICBpbnQgZGlzX2F0dGFjayA9IFF1ZXJ5UHJvcChQX0RJU0FCTEVfQVRUQUNLKTsKKyAgaWYgKCBpbnRwKGRpc19hdHRhY2spICYmIChkaXNfYXR0YWNrID4gMCkgKQorICB7CisgICAgICBTZXRQcm9wKFBfRElTQUJMRV9BVFRBQ0ssIC0tZGlzX2F0dGFjayk7CisgIH0KKworICAvLyBBdHRhY2tlbiBlcm1pdHRlbG46IFNBX1NQRUVEICsgUmVzdCBhdXMgZGVtIGxldHp0ZW4gSEIKKyAgaGJzID0gcmVtYWluaW5nX2hlYXJ0X2JlYXRzICsgUXVlcnlTa2lsbEF0dHJpYnV0ZShTQV9TUEVFRCk7CisgIGlmICggaGJzIDw9IDAgKQorICAgIGhicyA9IDEwMDsgCisKKyAgLy8gUF9BVFRBQ0tfQlVTWSBiZXN0aW1tZW4KKyAgaWYgKCBhdHRhY2tfYnVzeSA+IDk5KSAKKyAgIGF0dGFja19idXN5ID0gMTAwICsgaGJzOworICBlbHNlCisgICAgYXR0YWNrX2J1c3kgKz0gMTAwICsgaGJzOworICAvLyBtZWhyIGZ1ZXIgU2VoZXIuLi4KKyAgaWYgKCBJU19TRUVSKE1FKSApCisgICAgYXR0YWNrX2J1c3krPSgxMDArUXVlcnlQcm9wKFBfTEVWRUwpKTsgCisgIC8vIG1heC4gNTAwLCBkLmguIDUgQXR0YWNrZW4KKyAgaWYgKCBhdHRhY2tfYnVzeT41MDAgKQorICAgIGF0dGFja19idXN5PTUwMDsKKworICAvLyB1bmdhbnp6YWhsaWdlbiBSZXN0IGZ1ZXIgbmFlY2hzdGVuIEhCIHNwZWljaGVybgorICByZW1haW5pbmdfaGVhcnRfYmVhdHMgPSBoYnMgJSAxMDA7CisgIGhicyAvPSAxMDA7IC8vIGdhbnplIEF0dGFja2VuLiA7LSkKKworICBpZiAoIGhicyA+IDEwICkgLy8gbmljaHQgbWVociBhbHMgMTAgQXR0YWNrZW4uCisgICAgaGJzID0gMTA7IAorCisgIC8vIEZhbGxzIGplbWFuZCBzZWl0IGRlbSBsZXR6dGVuIEhCIGluIGRpZXNlbSBMaXZpbmcgdm9uIGF1c3NlbiBBdHRhY2soKQorICAvLyBnZXJ1ZmVuIGhhdCAobmljaHQgRXh0cmFBdHRhY2soKSksIHdpcmQgamV0enQgd2FzIGFiZ2V6b2dlbi4KKyAgaGJzIC09IG5vX21vcmVfYXR0YWNrczsKKyAgbm9fbW9yZV9hdHRhY2tzID0gMDsKKworICAvLyBXaWUgbGFuZ2UgdmVyZm9sZ3QgZGllc2VyIE5QQz8gV2VubiBQcm9wIG5pY2h0IGdlc2V0enQgb2RlciB1bmd1ZWx0aWcsCisgIC8vIGQuaC4ga2VpbiBpbnQgb2RlciA8PSAwLCBkYW5uIHdpcmQgZGllIERlZmF1bHR6ZWl0IGdlbm9tbWVuLgorICBpbnQgaHVudHRpbWUgPSAoaW50KVF1ZXJ5UHJvcChQX0hVTlRUSU1FKTsKKyAgaHVudHRpbWUgPSAoaW50cChodW50dGltZSkgJiYgaHVudHRpbWUgPiAwKSA/IAorICAgICAgICAgICAgICBodW50dGltZSAvIF9fSEVBUlRfQkVBVF9JTlRFUlZBTF9fIDogSFVOVFRJTUU7CisgIC8vIGVyc3RtYWwgZGllIEh1bnR0aW1lcyBkZXIgR2VnbmVyIGFrdHVhbGlzaWVyZW4gdW5kIG5lYmVuYmVpIGRpZQorICAvLyBhbndlc2VuZGVuIEZlaW5kZSBtZXJrZW4uIEF1c3NlcmRlbSBnZ2YuIEthbXBmIGFiYnJlY2hlbiwgd2VubgorICAvLyBQX05PX0FUVEFDSyBnZXNldHp0IGlzdC4KKyAgLy8gZWlnZW50bGljaCBpc3QgZGllc2UgZ2FuemUgU2NobGVpZmUgZmFzdCBkYXMgZ2xlaWNoZSB3aWUKKyAgLy8gUHJlc2VudEVuZW1pZXMoKSwgYWJlciBsZWlkZXIgbXVlc3NlbiBqYSBkaWUgSHVudHRpbWVzIGFrdHVsaXNpZXJ0IHdlcmRlLAorICAvLyBkYWhlciBrYW5uIG1hbiBuaWNodCBkaXJla3QgUHJlc2VudEVuZW1pZXMoKSBuZWhtZW4uCisgIC8vIFRPRE86IERpZXNlIFNjaGxlaWZlIHVuZCBQcmVzZW50RW5taWVzKCkgaXJnZW5kd2llIHZlcmVpbmlnZW4uCisgIG9iamVjdCAqbmV0ZGVhZD0oe30pOworICBvYmplY3QgKmhlcmU9KHt9KTsKKyAgb2JqZWN0IGVuZW15OworICBtaXhlZCBub19hdHRhY2s7CisgIGZvcmVhY2goZW5lbXksIGludCBodGltZTogJmVuZW1pZXMpIHsgLy8gS2V5cyBpbiBlbmVteQorICAgIC8vIGdnZi4gTWVsZHVuZ2VuIGF1c2dlYmVuIHVuZCBHZWduZXIgYXVzdHJhZ2VuIHVuZCBkaWVzZXMgTGl2aW5nIGJlaW0KKyAgICAvLyBHZWduZXIgYXVzdHJhZ2VuLgorICAgIGlmIChub19hdHRhY2s9ZW5lbXktPlF1ZXJ5UHJvcChQX05PX0FUVEFDSykpIHsKKyAgICAgIG1fZGVsZXRlKGVuZW1pZXMsZW5lbXkpOworICAgICAgICBpZiAoIHN0cmluZ3Aobm9fYXR0YWNrKSApIHsKKyAgICAgICAgICAgIHdyaXRlKCBub19hdHRhY2sgKTsKKyAgICAgICAgICAgIGVuZW15LT5TdG9wSHVudEZvciggTUUsIDEgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBlbmVteS0+U3RvcEh1bnRGb3IoIE1FLCAwICk7CisgICAgfQorICAgIGVsc2UgaWYgKCBlbnZpcm9ubWVudCgpPT1lbnZpcm9ubWVudChlbmVteSkgKSB7CisgICAgICAvLyBHZWduZXIgYW53ZXNlbmQsIGFscyBGZWluZCBtZXJrZW4uLi4KKyAgICAgIGlmICggaW50ZXJhY3RpdmUoZW5lbXkpIHx8ICFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKGVuZW15KSApCisgICAgICAgIGhlcmUrPSh7ZW5lbXl9KTsKKyAgICAgIGVsc2UKKyAgICAgICAgbmV0ZGVhZCs9KHtlbmVteX0pOworICAgICAgLy8gLi4uIHVuZCBIdW50dGltZSBlcm5ldWVybi4KKyAgICAgIGh0aW1lID0gaHVudHRpbWU7CisgICAgfQorICAgIC8vIEZlaW5kIG5pY2h0IGFud2VzZW5kLiBUaW1lciBkZWtyZW1lbnRpZXJlbiB1bmQgRmVpbmQgYXVzdHJhZ2VuLCB3ZW5uCisgICAgLy8gSmFnZHplaXQgYWJnZWxhdWZlbi4KKyAgICBlbHNlIGlmICggKC0taHRpbWUpIDw9IDAgKQorICAgICAgU3RvcEh1bnRGb3IoZW5lbXkpOworICB9CisgIC8vIE5ldHp0b3RlIHNpbmQgbnVyIEZlaW5kZSwgd2VubiBzb25zdCBrZWluZSBkYSBzaW5kLgorICBpZiAoICFzaXplb2YoaGVyZSkgKQorICAgIGhlcmU9bmV0ZGVhZDsKKworICAvLyBzY2hvbm1hbCBhYmZyYWdlbiwgb2IgZWluIFNwZWxsIHZvcmJlcmVpdGV0IHdpcmQuCisgIG1peGVkIHBzcGVsbD1RdWVyeVByb3AoUF9QUkVQQVJFRF9TUEVMTCk7CisKKyAgLy9EYSBoYnMgMCB1bmQgbm9fbW9yZV9hdHRhY2tzIGR1cmNoIGVpbmVuIG1hbnVlbGxlbiBBdWZydWYgdm9uIEF0dGFjaygpIGltCisgIC8vU3BpZWxlciA+MCBzZWluIGthbm4sIGthbm4gamV0enQgaGJzIDwwIHNlaW4uIChzLm8uKQorICBpZiAoaGJzID4gMCAmJiBzaXplb2YoaGVyZSkpIHsKKyAgICBmb3JlYWNoKGludCBpOiBoYnMpIHsKKyAgICAgIC8vIEZlaW5kIGluIE5haGthbXBmcmVpY2h3ZWl0ZSBmaW5kZW4KKyAgICAgIGlmICggb2JqZWN0cChlbmVteT1TZWxlY3ROZWFyRW5lbXkoaGVyZSkpICkgeworICAgICAgICAvLyBGbHVjaHQgZXJ3dWVuc2NodD8KKyAgICAgICAgaWYgKCBRdWVyeVByb3AoUF9XSU1QWSkgPiBRdWVyeVByb3AoUF9IUCkgKSB7CisgICAgICAgICAgRmxlZSgpOworICAgICAgICAgIC8vIEZsdWNodCBnZWx1bmdlbj8KKyAgICAgICAgICBpZiAoIGVuZW15ICYmIChlbnZpcm9ubWVudChlbmVteSkhPWVudmlyb25tZW50KCkpICkgeworICAgICAgICAgICAgaGVyZSA9IDA7IC8vIG5hZWNoc3RlIFJ1bmRlIG5ldWUgRmVpbmRlIHN1Y2hlbgorICAgICAgICAgICAgZW5lbXkgPSAwOworICAgICAgICAgICAgY29udGludWU7IC8vIGtlaW4gS2FtcGYsIFJ1bmRlIHVlYmVyc3ByaW5nZW4KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICAvLyBrZWluZSBGZWluZGUgZ2VmdW5kZW4uLi4gQWJicmVjaGVuLgorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIC8vIFBhcmFseXNlIGdlc2V0enQ/IC0+IEFiYnJlY2hlbi4gRGllc2VzIFBydWVmdW5nIG11c3MgaGllciBwYXNzaWVyZW4sCisgICAgICAvLyBkYW1pdCBnZ2YuIGRpZSBhdXRvbWF0aXNjaGUgRmx1Y2h0IGRlcyBMZWJld2VzZW5zIGR1cmNoZ2VmdWVocnQgd2lyZCwKKyAgICAgIC8vIGF1Y2ggd2VubiBlcyBwYXJhbHlzaWVydCBpc3QuCisgICAgICBpZiAoZGlzX2F0dGFjayA+IDApIGJyZWFrOworCisgICAgICAvLyBLYW1wZiBkdXJjaCBTcGVsbC1QcmVwYXJlIGJsb2NraWVydD8KKyAgICAgIC8vIEtlaW5lIGdlbmF1ZSBBYmZyYWdlLCB3aXJkIHNwYWV0ZXIgbm9jaCBnZW5hdSBnZXBydWVmdC4KKyAgICAgIGlmICggcHNwZWxsICYmIFF1ZXJ5UHJvcChQX0dVSUxEX1BSRVBBUkVCTE9DSykgKQorICAgICAgICBicmVhazsgLy8ga2VpbmUgQW5ncmlmZmUgaW4gZGllc2VtIEhCLgorICAgICAgLy8gd2VubiBGZWluZCBkYTogaGl0J2VtIGhhcmQuCisgICAgICBpZiAoIG9iamVjdHAoZW5lbXkpICkKKyAgICAgICAgQXR0YWNrKGVuZW15KTsKKyAgICAgIC8vIGdnZi4gaGF0IEF0dGFjaygpIG5vX21vcmVfYXR0YWNrcyBnZXNldHp0LiBadXJ1ZWNrc2V0emVuCisgICAgICBub19tb3JlX2F0dGFja3MgPSAwOworICAgICAgLy8gbmFlY2hzdGUgS2FtcGZydW5kZSBuZXVlIEZlaW5kZSBzdWNoZW4KKyAgICAgIGhlcmUgPSAwOworICAgIH0gIC8vIGZvcmVhY2gKKyAgfQorCisgIG5vX21vcmVfYXR0YWNrcz0wOworCisgIC8vIElzdCBlaW4gU3BlbGwgaW4gVm9yYmVyZWl0dW5nIHVuZCBldnRsLiBqZXR6dCBmZXJ0aWcgdm9yYmVyZWl0ZXQ/CisgIGlmICggcG9pbnRlcnAocHNwZWxsKQorICAgICAgJiYgKHNpemVvZihwc3BlbGwpPj0zKSAmJiBpbnRwKHBzcGVsbFswXSkgJiYgc3RyaW5ncChwc3BlbGxbMV0pICkgeworICAgIGlmICggdGltZSgpPj1wc3BlbGxbMF0gKSAvLyBLYW5uIGRlciBTcHJ1Y2ggamV0enQgYXVzZ2VmdWVocnQgd2VyZGVuPworICAgIHsKKyAgICAgIFVzZVNwZWxsKHBzcGVsbFsyXSxwc3BlbGxbMV0pOyAvLyBEYW5uIGxvcworICAgICAgU2V0UHJvcChQX1BSRVBBUkVEX1NQRUxMLDApOworICAgIH0KKyAgfQorICBlbHNlIGlmICggcHNwZWxsICkgLy8gVW5icmF1Y2hiYXJlciBXZXJ0LCBsb2VzY2hlbgorICAgIFNldFByb3AoUF9QUkVQQVJFRF9TUEVMTCwwKTsKKworfSAvLyBFbmRlIGhlYXJ0X2JlYXQKKworLy8gd2lyZCB2b24gTlBDIGdlcnVmZW4sIGRpZSBIZWFydGJlYXRzIG5hY2hob2xlbiB1bmQgZGFiZWkgZGllIEh1bnR0aW1lcyB1bQorLy8gZGllIEFuemFobCB2ZXJwYXNzdGVyIEhlYXJ0YmVhdHMgcmVkdXppZXJlbiBtdWVzc2VuLgorLy8gV2lyZCB2b24gU3BpZWxlcm9iamVrdGVuIGdlcnVmZW4sIHdlbm4gc2llIG5hY2ggJ3NjaGxhZmUgZWluJyBhdWZ3YWNoZW4sIHVtCisvLyBkaWUgbm90d2VuZGlnZSBBbnphaGwgYW4gSEIgaGllciBhYnp1emllaGVuIHVuZCBnZ2YuIGRpZSBGZWluZGUgenUgZXhwaXJlbiwKKy8vIGRhIFNwaWVsZXIgamEgbmV0enRvdCBrZWluZW4gSGVhcnRiZWF0IGhhYmVuLgorcHJvdGVjdGVkIHZvaWQgdXBkYXRlX2h1bnRfdGltZXMoaW50IGJlYXRzKSB7CisgIGlmICghbWFwcGluZ3AoZW5lbWllcykpIHJldHVybjsKKyAgZm9yZWFjaChvYmplY3QgZW4sIGludCBodGltZTogJmVuZW1pZXMpIHsgLy8gTWFwcGluZy1LZXlzIGluIGVuCisgICAgaHRpbWUgLT0gYmVhdHM7CisgICAgaWYgKCBodGltZSA8PSAwICkKKyAgICAgIFN0b3BIdW50Rm9yKGVuKTsKKyAgfQorfQorCitwdWJsaWMgaW50IElzRW5lbXkob2JqZWN0IHdlcikKK3sKKyAgcmV0dXJuIChtZW1iZXIoZW5lbWllcyx3ZXIpKTsKK30KKworcHVibGljIHZvaWQgU3RvcEh1bnRUZXh0KG9iamVjdCBhcmcpCit7CisgIHRlbGxfb2JqZWN0KGFyZywKKyAgICBOYW1lKFdFUiwxKSsiICIrKFF1ZXJ5UHJvcChQX1BMVVJBTCk/ImphZ2VuICI6ImphZ3QgIikrCisgICAgICAgICAgICAgICAoYXJnLT5RdWVyeVByb3AoUF9QTFVSQUwpPyJFdWNoIjoiRGljaCIpKyIgbmljaHQgbWVoci5cbiIpOworICB0ZWxsX29iamVjdChNRSwoUXVlcnlQcm9wKFBfUExVUkFMKT8iSWhyIGphZ3QgIjoiRHUgamFnc3QgIikrCisgICAgICAgICAgICAgICAgIGFyZy0+bmFtZShXRU4sMSkrIiBuaWNodCBtZWhyLlxuIik7Cit9CisKK3B1YmxpYyB2YXJhcmdzIGludCBTdG9wSHVudEZvcihvYmplY3QgYXJnLCBpbnQgc2lsZW50KQoreworICBpZiAoICFvYmplY3RwKGFyZykgfHwgIUlzRW5lbXkoYXJnKSApCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKCFzaWxlbnQpCisgICAgU3RvcEh1bnRUZXh0KGFyZyk7CisKKyAgbV9kZWxldGUoZW5lbWllcyxhcmcpOworICBsYXN0X2F0dGFja19tc2c9MDsKKworICByZXR1cm4gMTsKK30KKworLy8gQmVncnVlc3N1bmdzc2NobGFnIG51ciBlaW5tYWwgcHJvIEhCCitwdWJsaWMgdm9pZCBBdHRhY2syKG9iamVjdCBlbmVteSkKK3sKKyAgaWYgKCBhdHQyX3RpbWUgPiB0aW1lKCkgKQorICAgIHJldHVybjsKKworICBhdHQyX3RpbWU9dGltZSgpICsgX19IRUFSVF9CRUFUX0lOVEVSVkFMX187CisgIEF0dGFjayhlbmVteSk7Cit9CisKKy8vIEZ1ZXIgZXZ0bC4gQXR0YWNrLUFlbmRlcnVuZ2VuLCBvaG5lIGRhc3MgbWFuIGdsZWljaCBkYXMgZ2FuemUKKy8vIEF0dGFjayB1ZWJlcmxhZ2VybiBtdXNzOgorcHJvdGVjdGVkIHZvaWQgSW50ZXJuYWxNb2RpZnlBdHRhY2sobWFwcGluZyBhaW5mbykKK3sKKyAgcmV0dXJuOyAvLyBWb3JlcnN0IQorLyoKKyAgaW50ICAgZmFjOworICBtaXhlZCByZXM7CisKKyAgZmFjPTEwMDsKKworICBpZiAoQ2Fubm90U2VlKDEpKQorICAgIGZhYyAtPSA1MDsKKworICAvLyBXZWl0ZXJlIE1hbGk/CisKKyAgaWYgKGZhYzwxMDApCisgICAgYWluZm9bU0lfU0tJTExEQU1BR0VdID0gYWluZm9bU0lfU0tJTExEQU1BR0VdKmZhYy8xMDA7CisgIC8vIEZlcnRpZworKi8KK30KKworLy8gQXVzZnVlaHJlbiBFaW5lcyBBbmdyaWZmcyBhdWNoIHdlbm4gZXMgYmVyZWl0cyBlaW5lbiBBbmdyaWZmCisvLyBpbiBkaWVzZXIgUnVuZGUgZ2VnZWJlbiBoYXQuIERpZXNlciBBbmdyaWZmIHdpcmQgYXVjaCBuaWNodAorLy8gZ2V6YWVobHQuIERpZSBOdXR6dW5nIGRpZXNlciBGdW5rdGlvbiBpc3QgbnVyIGZ1ZXIgU3BlemlhbGZhZWxsZQorLy8gZ2VkYWNodCB1bmQgaW1tZXIgQkFMQU5DRVBGTElDSFRJRyEKK3ZhcmFyZ3MgcHVibGljIHZvaWQgRXh0cmFBdHRhY2sob2JqZWN0IGVuZW15LCBpbnQgaWdub3JlX3ByZXZpb3VzKQoreworICBpbnQgc2F2ZWRfbm9fbW9yZV9hdHRhY2tzOworCisgIC8vIEVyc3RzY2hsYWdzaW5mbyBzcGVpY2hlcm4uCisgIHNhdmVkX25vX21vcmVfYXR0YWNrcyA9IG5vX21vcmVfYXR0YWNrczsKKworICAvLyBCZWkgQmVkYXJmIGJpc2hlciBzY2hvbiBkdXJjaGdlZnVlaHJ0ZSBFcnN0c2NobGFlZ2UgaWdub3JpZXJlbgorICBpZiAoaWdub3JlX3ByZXZpb3VzKSBub19tb3JlX2F0dGFja3M9MDsKKworICAvLyBOb3JtYWxlbiBBbmdyaWZmIGR1cmNoZnVlaHJlbgorICBBdHRhY2sgKGVuZW15KTsKKworICAvLyBHZXNwZWljaGVydGVuIFdlcnQgenVydWVja3NldHplbgorICBub19tb3JlX2F0dGFja3MgPSBzYXZlZF9ub19tb3JlX2F0dGFja3M7CisKKyAgcmV0dXJuOworfQorCitwdWJsaWMgdm9pZCBBdHRhY2sob2JqZWN0IGVuZW15KQoreworICBjbG9zdXJlIGNsOworICBtaXhlZCAgIHJlczsKKyAgbWFwcGluZyBhaW5mbzsKKyAgbWFwcGluZyBlZGVmZW5kaW5mbzsgLy8gZXJ3ZWl0ZXJ0ZSBEZWZlbmQtSW5mb3MKKyAgbWl4ZWQgaG9va0RhdGE7CisgIG1peGVkIGhvb2tSZXM7CisKKyAgaWYgKCBub19tb3JlX2F0dGFja3MgfHwgUXVlcnlQcm9wKFBfR0hPU1QpIHx8IAorICAgICAgIW9iamVjdHAoZW5lbXkpIHx8ICFvYmplY3RwKHRoaXNfb2JqZWN0KCkpIHx8IAorICAgICAgKFF1ZXJ5UHJvcChQX0RJU0FCTEVfQVRUQUNLKSA+IDApIHx8IGVuZW15LT5RdWVyeVByb3AoUF9OT19BVFRBQ0spIHx8IAorICAgICAgKHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUodGhpc19vYmplY3QoKSkgJiYgIWludGVyYWN0aXZlKHRoaXNfb2JqZWN0KCkpKSApCisgICAgcmV0dXJuOworCisgIGVkZWZlbmRpbmZvPShbXSk7CisKKyAgU2V0KFBfTEFTVF9DT01CQVRfVElNRSx0aW1lKCkpOworCisgIC8vIGlua3JlbWVudGllcmVuLiBEaWVzZSBWYXJpYWJsZSB3aXJkIGltIEhCIG5hY2ggZGVuIEFuZ3JpZmZlbiBnZW51bGx0LgorICAvLyBEaWVzZSBWYXJpYWJsZSB3aXJkIGltIG5hZWNoc3RlbiBIZWFydGJlYXQgdm9uIGRlciBBbnphaGwgYW4gdmVyZnVlZ2JhcmVuCisgIC8vIEFuZ3JpZmZlbiBkZXMgTGl2aW5ncyBhYmdlem9nZW4uIERpZXMgYmVydWVja3NpY2h0aWd0IGFsc28gendpc2NoZW4gZGVuCisgIC8vIEhCcyAoei5CLiBleHRlcm4pIGdlcnVmZW5lIEF0dGFja3MoKS4KKyAgbm9fbW9yZV9hdHRhY2tzKys7CisKKyAgLy8gV2lyZCBkYXMgQXR0YWNrIGR1cmNoIGVpbmVuIHRlbXBvcmFlcmVuIEF0dGFjay1Ib29rIGVyc2V0enQ/CisgIGlmICggcmVzPVF1ZXJ5UHJvcChQX1RNUF9BVFRBQ0tfSE9PSykgKQorICB7CisgICAgaWYgKCBwb2ludGVycChyZXMpICYmIChzaXplb2YocmVzKT49MykgJiYgaW50cChyZXNbMF0pICYmICh0aW1lKCk8cmVzWzBdKQorICAgICAgICAmJiBvYmplY3RwKHJlc1sxXSkgJiYgc3RyaW5ncChyZXNbMl0pICkKKyAgICB7CisgICAgICBpZiAoICEocmVzPWNhbGxfb3RoZXIocmVzWzFdLHJlc1syXSxlbmVteSkpICkKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlbHNlCisgICAgICBTZXRQcm9wKFBfVE1QX0FUVEFDS19IT09LLDApOworICB9CisKKyAgLy8gdHJpZ2dlciBhdHRhY2sgaG9vaworICBob29rRGF0YT0oe2VuZW15fSk7CisgIGhvb2tSZXM9SG9va0Zsb3coSF9IT09LX0FUVEFDSyxob29rRGF0YSk7CisgIGlmKGhvb2tSZXMgJiYgcG9pbnRlcnAoaG9va1JlcykgJiYgc2l6ZW9mKGhvb2tSZXMpPkhfUkVUREFUQSl7CisgICAgaWYoaG9va1Jlc1tIX1JFVENPREVdPT1IX0NBTkNFTExFRCl7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgYWluZm8gPSAoWyBTSV9FTkVNWSA6IGVuZW15LAorICAgICAgICAgICAgIFNJX1NQRUxMIDogMCwKKyAgICAgICAgICAgXSk7CisKKyAgaWYgKCBvYmplY3RwKGFpbmZvW1BfV0VBUE9OXT1RdWVyeVByb3AoUF9XRUFQT04pKSApCisgIHsKKyAgICBhaW5mb1tQX1dFQVBPTl0tPlRha2VGbGF3KGVuZW15KTsKKworICAgIC8vIEFiZnJhZ2UgZnVlciBkZW4gRmFsbCwgZGFzcyBXYWZmZSBkdXJjaCBkYXMgVGFrZUZsYXcoKSB6ZXJzdG9lcnQKKyAgICAvLyB3dXJkZS4gRGFubiB3aXJkIGRhcyBBdHRhY2sgYWJnZWJyb2NoZW4uCisgICAgaWYgKCAhb2JqZWN0cChhaW5mb1tQX1dFQVBPTl0pICkKKyAgICAgIHJldHVybjsKKworICAgIGNsPXN5bWJvbF9mdW5jdGlvbigibmFtZSIsYWluZm9bUF9XRUFQT05dKTsKKyAgICBhaW5mb1tTSV9TS0lMTERBTUFHRV9NU0ddID0gKCIgbWl0ICIrKHN0cmluZylmdW5jYWxsKGNsLFdFTSwwKSk7CisgICAgYWluZm9bU0lfU0tJTExEQU1BR0VfTVNHMl0gPSAoIiBtaXQgIisoc3RyaW5nKWZ1bmNhbGwoY2wsV0VNLDEpKTsKKworICAgIGFpbmZvW1NJX1NLSUxMREFNQUdFXSA9IChpbnQpYWluZm9bUF9XRUFQT05dLT5RdWVyeURhbWFnZShlbmVteSk7CisKKyAgICBjbD1zeW1ib2xfZnVuY3Rpb24oIlF1ZXJ5UHJvcCIsYWluZm9bUF9XRUFQT05dKTsKKyAgICBhaW5mb1tTSV9TS0lMTERBTUFHRV9UWVBFXSA9IGZ1bmNhbGwoY2wsUF9EQU1fVFlQRSk7CisgICAgYWluZm9bUF9XRUFQT05fVFlQRV0gPSAoc3RyaW5nKWZ1bmNhbGwoY2wsUF9XRUFQT05fVFlQRSk7CisgICAgYWluZm9bUF9OUl9IQU5EU10gPSAoaW50KWZ1bmNhbGwoY2wsUF9OUl9IQU5EUyk7CisgICAgYWluZm9bUF9XQ10gPSAoaW50KWZ1bmNhbGwoY2wsUF9XQyk7CisKKyAgICAvLyBad2VpaGFlbmRpZ2UgV2FmZmU/CisgICAgaWYgKCBhaW5mb1tQX05SX0hBTkRTXT09MgorICAgICAgICAmJiBtYXBwaW5ncChyZXM9VXNlU2tpbGwoU0tfVFdPSEFOREVELGRlZXBfY29weShhaW5mbykpKQorICAgICAgICAmJiBtZW1iZXIocmVzLFNJX1NLSUxMREFNQUdFKSApCisgICAgeworICAgICAgLy8gTnVyIGRlbiBuZXVlbiBTY2hhZGVuc3dlcnQgdWViZXJuZWhtZW4uCisgICAgICBhaW5mb1tTSV9TS0lMTERBTUFHRV09KChpbnQpKHJlc1tTSV9TS0lMTERBTUFHRV0pKTsKKyAgICB9CisgIH0KKyAgZWxzZSAvLyBLZWluZSBXYWZmZSBnZXp1ZWNrdAorICB7CisgICAgLyogQ2hlY2sgaWYgdGhlcmUgaXMgYSBtYWdpY2FsIGF0dGFjayAqLworICAgIGlmICggbWFwcGluZ3AocmVzPVVzZVNraWxsKFNLX01BR0lDX0FUVEFDSywoW1NJX0VORU1ZOmVuZW15XSkpKSApCisgICAgeworICAgICAgYWluZm9bU0lfU0tJTExEQU1BR0VdPShpbnQpcmVzW1NJX1NLSUxMREFNQUdFXTsKKyAgICAgIGFpbmZvW1NJX1NLSUxMREFNQUdFX1RZUEVdPXJlc1tTSV9TS0lMTERBTUFHRV9UWVBFXTsKKworICAgICAgaWYgKCBzdHJpbmdwKHJlc1tTSV9TS0lMTERBTUFHRV9NU0ddKSApCisgICAgICAgIGFpbmZvW1NJX1NLSUxMREFNQUdFX01TR10gPSAiIG1pdCAiKyhzdHJpbmcpcmVzW1NJX1NLSUxMREFNQUdFX01TR107CisgICAgICBlbHNlCisgICAgICAgIGFpbmZvW1NJX1NLSUxMREFNQUdFX01TR10gPSAiIG1pdCBtYWdpc2NoZW4gRmFlaGlna2VpdGVuIjsKKworICAgICAgaWYgKCBzdHJpbmdwKHJlc1tTSV9TS0lMTERBTUFHRV9NU0cyXSkgKQorICAgICAgICBhaW5mb1tTSV9TS0lMTERBTUFHRV9NU0cyXSA9ICIgbWl0ICIrKHN0cmluZylyZXNbU0lfU0tJTExEQU1BR0VfTVNHMl07CisgICAgICBlbHNlCisgICAgICAgIGFpbmZvW1NJX1NLSUxMREFNQUdFX01TRzJdID0gKHN0cmluZylhaW5mb1tTSV9TS0lMTERBTUFHRV9NU0ddOworCisgICAgICBpZiAoICEoYWluZm9bUF9XRUFQT05fVFlQRV09cmVzW1BfV0VBUE9OX1RZUEVdKSApCisgICAgICAgIGFpbmZvW1BfV0VBUE9OX1RZUEVdPVdUX01BR0lDOworCisgICAgICBpZiAoIG1lbWJlcihyZXMsU0lfU1BFTEwpICkKKyAgICAgICAgYWluZm9bU0lfU1BFTExdPXJlc1tTSV9TUEVMTF07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBPaG5lIChmcmVpZSkgSGFlbmRlIHdpcmQgYXVjaCBuaWNodCBhbmdlZ3JpZmZlbiAqLworICAgICAgaWYgKCBpbnRlcmFjdGl2ZSh0aGlzX29iamVjdCgpKQorICAgICAgICAgICYmIChRdWVyeVByb3AoUF9VU0VEX0hBTkRTKSA+PSBRdWVyeVByb3AoUF9NQVhfSEFORFMpKSApCisgICAgICAgIHJldHVybiA7CisKKyAgICAgIGlmICggIXBvaW50ZXJwKHJlcz1RdWVyeVByb3AoUF9IQU5EUykpIHx8IChzaXplb2YocmVzKTwyKSApCisgICAgICAgIHJldHVybjsKKworICAgICAgYWluZm9bU0lfU0tJTExEQU1BR0VdID0gKCggMipyYW5kb20oKChpbnQpcmVzWzFdKSsxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAxMCooUXVlcnlBdHRyaWJ1dGUoQV9TVFIpKSApLzMpOworICAgICAgYWluZm9bU0lfU0tJTExEQU1BR0VfVFlQRV0gPSByZXNbMl07CisgICAgICBhaW5mb1tTSV9TS0lMTERBTUFHRV9NU0ddID0gYWluZm9bU0lfU0tJTExEQU1BR0VfTVNHMl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAoKHN0cmluZylyZXNbMF0pOworICAgICAgYWluZm9bUF9XRUFQT05fVFlQRV0gPSBXVF9IQU5EUzsKKyAgICAgIGFpbmZvW1BfV0NdID0gKGludClyZXNbMV07CisgICAgfQorICB9ICAvLyBiZXNvbmRlcmUgRmFlaGlna2VpdGVuIG1pdCBkaWVzZW0gV2FmZmVudHlwPworICBpZiAoIG1hcHBpbmdwKHJlcz1Vc2VTa2lsbChGSUdIVChhaW5mb1tQX1dFQVBPTl9UWVBFXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZXBfY29weShhaW5mbykpKSApCisgICAgU2tpbGxSZXNUcmFuc2ZlcihyZXMsYWluZm8pOworCisgIC8vIGJlc29uZGVyZSBhbGxnZW1laW5lIEthbXBmZmFlaGlna2VpdGVuPworICBpZiAoIG1hcHBpbmdwKHJlcz1Vc2VTa2lsbChTS19GSUdIVCxkZWVwX2NvcHkoYWluZm8pKSkgKQorICAgIFNraWxsUmVzVHJhbnNmZXIocmVzLGFpbmZvKTsKKworICAvLyBWZXJhZW5kZXJ1bmdlbiBkdXJjaCBlaW5lbiBBdHRhY2stTW9kaWZpZXI/CisgIGlmICggKHJlcz1RdWVyeVByb3AoUF9UTVBfQVRUQUNLX01PRCkpICkKKyAgeworICAgIGlmICggcG9pbnRlcnAocmVzKSAmJiAoc2l6ZW9mKHJlcyk+PTMpICYmIGludHAocmVzWzBdKQorICAgICAgICAmJiAodGltZSgpPHJlc1swXSkgJiYgb2JqZWN0cChyZXNbMV0pICYmIHN0cmluZ3AocmVzWzJdKSApCisgICAgeworICAgICAgaWYgKCAhKHJlcz1jYWxsX290aGVyKHJlc1sxXSxyZXNbMl0sZGVlcF9jb3B5KGFpbmZvKSkpCisgICAgICAgICAgfHwgIW1hcHBpbmdwKHJlcykgKQorICAgICAgICByZXR1cm47CisgICAgICBlbHNlCisgICAgICAgIFNraWxsUmVzVHJhbnNmZXIocmVzLGFpbmZvKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgU2V0UHJvcChQX1RNUF9BVFRBQ0tfTU9ELDApOworICB9CisKKyAgLy8gdHJpZ2dlciBhdHRhY2sgbW9kIGhvb2sKKyAgaG9va0RhdGE9ZGVlcF9jb3B5KGFpbmZvKTsKKyAgaG9va1Jlcz1Ib29rRmxvdyhIX0hPT0tfQVRUQUNLX01PRCxob29rRGF0YSk7CisgIGlmKGhvb2tSZXMgJiYgcG9pbnRlcnAoaG9va1JlcykgJiYgc2l6ZW9mKGhvb2tSZXMpPkhfUkVUREFUQSl7CisgICAgaWYoaG9va1Jlc1tIX1JFVENPREVdPT1IX0NBTkNFTExFRCl7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UgaWYoaG9va1Jlc1tIX1JFVENPREVdPT1IX0FMVEVSRUQgJiYgaG9va1Jlc1tIX1JFVERBVEFdICYmCisgICAgICAgICAgICAgbWFwcGluZ3AoaG9va1Jlc1tIX1JFVERBVEFdKSl7CisgICAgICAgIFNraWxsUmVzVHJhbnNmZXIoaG9va1Jlc1tIX1JFVERBVEFdLGFpbmZvKTsKKyAgICB9CisgIH0KKworICAvLyBJbnRlcm5lIE1vZGlmaWthdGlvbmVuIGRlciBBbmdyaWZmc3dlcnRlCisgIEludGVybmFsTW9kaWZ5QXR0YWNrKGFpbmZvKTsKKworICBpZiAoICFvYmplY3RwKGVuZW15KSApCisgICAgcmV0dXJuOworCisgIC8vIGhpZXIgbWFsIGJld3Vzc3QgbmljaHQgYXVmIFBfUExVUkFMIHp1ZXJzdCB0ZXN0ZW4uIGluIDkwJSBkZXIgRmFlbGxlCisgIC8vIHdpcmQgZWgga2VpbmUgQW5ncmlmZnNtZWxkdW5nIG1laHIgYXVzZ2VnZWJlbiwgYWxzbyBwcnVlZmVuIHdpciBkYXMKKyAgLy8gbGllYmVyIHp1ZXJzdC4gUGx1cmFsIHRlc3RlbiB6aWVodCBzY2hvbiBnZW51ZyBSZWNoZW56ZWl0IDovCisgIC8vIE5pY2h0IG1laW5lIElkZWUhIE5pY2h0IG1laW5lIElkZWUhIE5hY2h0d2luZCA3LjcuMjAwMQorICBpZiAoIGFpbmZvW1NJX1NLSUxMREFNQUdFX01TRzJdIT1sYXN0X2F0dGFja19tc2cgKQorICB7CisgICAgbGFzdF9hdHRhY2tfbXNnID0gYWluZm9bU0lfU0tJTExEQU1BR0VfTVNHMl07CisgICAgaWYgKFF1ZXJ5UHJvcChQX1BMVVJBTCkpCisgICAgeworICAgICAgdGVsbF9vYmplY3QoIE1FLCAiICBJaHIgZ3JlaWZ0ICIgKyBlbmVteS0+bmFtZShXRU4sMSkKKyAgICAgICAgICAgICAgICAgICArIGFpbmZvW1NJX1NLSUxMREFNQUdFX01TRzJdICsgIiBhbi5cbiIgKTsKKyAgICAgIHNheSgiICAiKyhOYW1lKFdFUiwxKSkrIiBncmVpZmVuICIrKGVuZW15LT5uYW1lKFdFTiwxKSkrCisgICAgICAgICAgYWluZm9bU0lfU0tJTExEQU1BR0VfTVNHXSsiIGFuLlxuIiwgZW5lbXkgKTsKKyAgICAgIHRlbGxfb2JqZWN0KCBlbmVteSwgIiAgIisoTmFtZShXRVIsMSkpKyIgZ3JlaWZlbiAiKworICAgICAgICAgICAgICAgICAgKGVuZW15LT5RdWVyeVByb3AoUF9QTFVSQUwpPyJFdWNoIjoiRGljaCIpKworICAgICAgICAgICAgICAgICAgIGFpbmZvW1NJX1NLSUxMREFNQUdFX01TRzJdKyIgYW4uXG4iICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICB0ZWxsX29iamVjdCggTUUsICIgIER1IGdyZWlmc3QgIiArIGVuZW15LT5uYW1lKFdFTiwxKQorICAgICAgICAgICAgICAgICAgICsgYWluZm9bU0lfU0tJTExEQU1BR0VfTVNHMl0gKyAiIGFuLlxuIiApOworICAgICAgc2F5KCIgICIrKE5hbWUoV0VSLDIpKSsiIGdyZWlmdCAiKyhlbmVteS0+bmFtZShXRU4sMSkpKworICAgICAgICAgIGFpbmZvW1NJX1NLSUxMREFNQUdFX01TR10rIiBhbi5cbiIsIGVuZW15ICk7CisgICAgICB0ZWxsX29iamVjdCggZW5lbXksICIgICIrKE5hbWUoV0VSLDEpKSsiIGdyZWlmdCAiKworICAgICAgICAgICAgICAgICAgKGVuZW15LT5RdWVyeVByb3AoUF9QTFVSQUwpPyJFdWNoIjoiRGljaCIpKworICAgICAgICAgICAgICAgICAgIGFpbmZvW1NJX1NLSUxMREFNQUdFX01TRzJdKyIgYW4uXG4iICk7ICAgIH0KKyAgfQorICBlbHNlIGlmICggUXVlcnkoUF9TSE9XX0FUVEFDS19NU0cpICkKKyAgICBpZiAoUXVlcnlQcm9wKFBfUExVUkFMKSkKKyAgICAgIHRlbGxfb2JqZWN0KCBNRSwgIiAgSWhyIGdyZWlmdCAiICsgZW5lbXktPm5hbWUoV0VOLDEpCisgICAgICAgICAgICAgICAgICAgKyBhaW5mb1tTSV9TS0lMTERBTUFHRV9NU0cyXSArICIgYW4uXG4iICk7CisgICAgZWxzZQorICAgICAgdGVsbF9vYmplY3QoIE1FLCAiICBEdSBncmVpZnN0ICIgKyBlbmVteS0+bmFtZShXRU4sMSkKKyAgICAgICAgICAgICAgICAgICArIGFpbmZvW1NJX1NLSUxMREFNQUdFX01TRzJdICsgIiBhbi5cbiIgKTsKKworICAvLyBhaW5mbyBpbiBkZWZlbmRpbmZvIG1lcmtlbgorICBlZGVmZW5kaW5mb1sgT1JJR0lOQUxfQUlORk9dPSBkZWVwX2NvcHkoYWluZm8pOworICBlZGVmZW5kaW5mb1sgT1JJR0lOQUxfREFNXT0gYWluZm9bU0lfU0tJTExEQU1BR0VdOworICBlZGVmZW5kaW5mb1sgT1JJR0lOQUxfREFNVFlQRV09IGFpbmZvW1NJX1NLSUxMREFNQUdFX1RZUEVdOworICBlZGVmZW5kaW5mb1sgQ1VSUkVOVF9EQU1dPSBhaW5mb1tTSV9TS0lMTERBTUFHRV07CisgIGVkZWZlbmRpbmZvWyBDVVJSRU5UX0RBTVRZUEVdPSBhaW5mb1tTSV9TS0lMTERBTUFHRV9UWVBFXTsKKworICAvLyBhaW5mb1tTSV9TUEVMTF0gYXVmIGVpbiBtYXBwaW5nIG5vcm1pZXJlbgorICBpZiAoIGludHAoYWluZm9bU0lfU1BFTExdKSApCisgIHsKKyAgICBhaW5mb1tTSV9TUEVMTF0gPSAoWyBTUF9QSFlTSUNBTF9BVFRBQ0sgOiAhYWluZm9bU0lfU1BFTExdLAorICAgICAgICAgICAgICAgU1BfU0hPV19EQU1BR0UgICAgIDogIWFpbmZvW1NJX1NQRUxMXSwKKyAgICAgICAgICAgICAgIFNQX1JFRFVDRV9BUk1PVVIgICA6IChbIF0pICBdKTsKKyAgfQorCisgIC8vIGRlZmVuZGluZm8gYW5oYWVuZ2VuLCBmYWxscyBhaW5mb1tTSV9TUEVMTF0gZWluIG1hcHBpbmcgaXN0CisgIGlmKCBtYXBwaW5ncChhaW5mb1tTSV9TUEVMTF0pKQorICB7CisgICAgYWluZm9bU0lfU1BFTExdW0VJTkZPX0RFRkVORF09ZWRlZmVuZGluZm87CisgIH0KKworCisgIGVuZW15LT5EZWZlbmQoYWluZm9bU0lfU0tJTExEQU1BR0VdLCBhaW5mb1tTSV9TS0lMTERBTUFHRV9UWVBFXSwKKyAgICAgICAgICAgICAgICBhaW5mb1tTSV9TUEVMTF0sICAgICAgIHRoaXNfb2JqZWN0KCkpOworCisKKyAgLy9lZGVmZW5kaW5mbz0oW10pOworCisgIC8qIERvbmUgYXR0YWNraW5nICovCit9CisKK3B1YmxpYyB2b2lkIEFkZERlZmVuZGVyKG9iamVjdCBmcmllbmQpCit7IG9iamVjdCAqZGVmczsKKworICBpZiAoICFvYmplY3RwKGZyaWVuZCkgKQorICAgIHJldHVybjsKKworICBpZiAoICFwb2ludGVycChkZWZzPVF1ZXJ5UHJvcChQX0RFRkVOREVSUykpICkKKyAgICBkZWZzPSh7fSk7CisKKyAgaWYgKCBtZW1iZXIoZGVmcyxmcmllbmQpPj0wICkKKyAgICByZXR1cm47CisKKyAgZGVmcys9KHtmcmllbmR9KTsKKyAgU2V0UHJvcChQX0RFRkVOREVSUyxkZWZzKTsKK30KKworcHVibGljIHZvaWQgUmVtb3ZlRGVmZW5kZXIob2JqZWN0IGZyaWVuZCkKK3sgb2JqZWN0ICpkZWZzOworCisgIGlmICggIW9iamVjdHAoZnJpZW5kKSApCisgICAgcmV0dXJuOworCisgIGlmICggIXBvaW50ZXJwKGRlZnM9UXVlcnlQcm9wKFBfREVGRU5ERVJTKSkgKQorICAgIGRlZnM9KHt9KTsKKworICBpZiAoIG1lbWJlcihkZWZzLGZyaWVuZCk9PS0xICkKKyAgICByZXR1cm47CisKKyAgZGVmcyAtPSAoe2ZyaWVuZH0pOworICBTZXRQcm9wKFBfREVGRU5ERVJTLGRlZnMpOworfQorCitwdWJsaWMgdm9pZCBJbmZvcm1EZWZlbmQob2JqZWN0IGVuZW15KQoreworICBVc2VTa2lsbChTS19JTkZPUk1fREVGRU5ELChbIFNJX0VORU1ZICA6IGVuZW15LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX0ZSSUVORCA6IHByZXZpb3VzX29iamVjdCgpIF0pKTsKKyAgLy8gT2gsIG9oIC0gaWNoIGhvZmZlIG1hbCwgZGFzcyBJbmZvcm1EZWZlbmQgd2lya2xpY2ggTlVSIGF1cyBEZWZlbmQKKyAgLy8gZWluZXMgYmVmcmV1bmRldGVuIGxpdmluZ3MgYXVmZ2VydWZlbiB3aXJkLi4uIChTaWx2YW5hKQorICAvLyBUaGlzIGlzIG9ubHkgZXhwZXJpbWVudGFsLi4uIDspCit9CisKK3B1YmxpYyA8aW50fHN0cmluZyp8bWFwcGluZz4qIERlZmVuZE90aGVyKGludCBkYW0sIHN0cmluZ3xzdHJpbmcqIGRhbV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50fG1hcHBpbmcgc3BlbGwsIG9iamVjdCBlbmVteSkKK3sKKyAgPGludHxzdHJpbmcqfG1hcHBpbmc+KiByZXM7CisKKyAgaWYgKCAocmVzPVVzZVNraWxsKFNLX0RFRkVORF9PVEhFUiwoWyBTSV9TS0lMTERBTUFHRSA6IGRhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSV9TS0lMTERBTUFHRV9UWVBFIDogZGFtX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU1BFTEwgOiBzcGVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSV9GUklFTkQgOiBwcmV2aW91c19vYmplY3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSV9FTkVNWSA6IGVuZW15IF0pKSkKKyAgICAgICYmIHBvaW50ZXJwKHJlcykgKQorICAgIHJldHVybiByZXM7CisKKyAgcmV0dXJuIDA7Cit9CisKK3B1YmxpYyB2b2lkIENoZWNrV2ltcHlBbmRGbGVlKCkKK3sKKyAgaWYgKCAoUXVlcnlQcm9wKFBfV0lNUFkpPlF1ZXJ5UHJvcChQX0hQKSkgJiYgIVRlYW1GbGVlKCkKKyAgICAgICYmIGZpbmRfY2FsbF9vdXQoIkZsZWUiKTwwICkKKyAgICBjYWxsX291dCgjJ0ZsZWUsMCxlbnZpcm9ubWVudCgpKTsKK30KKworcHJvdGVjdGVkIHN0cmluZyBtZXNzKHN0cmluZyBtc2csb2JqZWN0IG1lLG9iamVjdCBlbmVteSkKK3sgY2xvc3VyZSBtbmFtZSwgZW5hbWU7CisgIHN0cmluZyAgKnBhcnRzLHg7CisgIGludCAgICAgaTsKKworICBtbmFtZSA9IHN5bWJvbF9mdW5jdGlvbigibmFtZSIsIG1lKTsKKyAgZW5hbWUgPSBzeW1ib2xfZnVuY3Rpb24oIm5hbWUiLCBlbmVteSk7CisKKyAgcGFydHM9cmVnZXhwbG9kZShtc2csIkBXRVtBLVpdKlsxMl0iKTsKKyAgZm9yICggaT1zaXplb2YocGFydHMpLTIgOyBpPj0xIDsgaS09MiApCisgIHsKKyAgICBzd2l0Y2gocGFydHNbaV0pCisgICAgeworICAgICAgY2FzZSAiQFdFUjEiOiAgICBwYXJ0c1tpXT1mdW5jYWxsKG1uYW1lLFdFUiwxKTsgICAgYnJlYWs7CisgICAgICBjYXNlICJAV0VTU0VOMSI6IHBhcnRzW2ldPWZ1bmNhbGwobW5hbWUsV0VTU0VOLDEpOyBicmVhazsKKyAgICAgIGNhc2UgIkBXRU0xIjogICAgcGFydHNbaV09ZnVuY2FsbChtbmFtZSxXRU0sMSk7ICAgIGJyZWFrOworICAgICAgY2FzZSAiQFdFTjEiOiAgICBwYXJ0c1tpXT1mdW5jYWxsKG1uYW1lLFdFTiwxKTsgICAgYnJlYWs7CisgICAgICBjYXNlICJAV0VSMiI6ICAgIHBhcnRzW2ldPWZ1bmNhbGwoZW5hbWUsV0VSLDEpOyAgICBicmVhazsKKyAgICAgIGNhc2UgIkBXRVNTRU4yIjogcGFydHNbaV09ZnVuY2FsbChlbmFtZSxXRVNTRU4sMSk7IGJyZWFrOworICAgICAgY2FzZSAiQFdFTTIiOiAgICBwYXJ0c1tpXT1mdW5jYWxsKGVuYW1lLFdFTSwxKTsgICAgYnJlYWs7CisgICAgICBjYXNlICJAV0VOMiI6ICAgIHBhcnRzW2ldPWZ1bmNhbGwoZW5hbWUsV0VOLDEpOyAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6IDsKKyAgICB9CisgIH0KKworICByZXR1cm4gYnJlYWtfc3RyaW5nKGNhcGl0YWxpemUoaW1wbG9kZShwYXJ0cywiIikpLDc4LCIgICIsMSk7Cit9CisKKy8vIEZ1ZXIgZXZ0bC4gRGVmZW5kLUFlbmRlcnVuZ2VuLCBvaG5lIGRhc3MgbWFuIGdsZWljaCBkYXMgZ2FuemUKKy8vIEF0dGFjayB1ZWJlcmxhZ2VybiBtdXNzOgorcHJvdGVjdGVkIHZvaWQgSW50ZXJuYWxNb2RpZnlEZWZlbmQoaW50IGRhbSwgc3RyaW5nKiBkdCwgbWFwcGluZyBzcGVsbCwgb2JqZWN0IGVuZW15KQoreworICByZXR1cm47Cit9CisKK3B1YmxpYyBpbnQgRGVmZW5kKGludCBkYW0sIHN0cmluZ3xzdHJpbmcqIGRhbV90eXBlLCBpbnR8bWFwcGluZyBzcGVsbCwgb2JqZWN0IGVuZW15KQoreworICBpbnQgICAgIGksazsKKyAgbWl4ZWQgICByZXMscmVzMjsKKyAgb2JqZWN0ICAqYXJtb3Vycyx0bXA7CisgIG1peGVkIGhvb2tEYXRhOworICBtaXhlZCBob29rUmVzOworICAKKyAgLy8gIHN0cmluZyAgd2hhdCwgaG93OworICBzdHJpbmcgZW5uYW1lLCBteW5hbWU7CisKKyAgLy8gdGhpc19wbGF5ZXIoKSwgd2VubiBrZWluIGVuZW15IGJla2FubnQuLi4KKyAgZW5lbXkgfHw9IHRoaXNfcGxheWVyKCk7CisgIC8vIFRlc3Rlbiwgb2IgZGllc2VzIExlYmV3ZXNlbiB1ZWJlcmhhdXB0IGFuZ2VncmlmZmVuIHdlcmRlbiBkYXJmCisgIGlmICggIXRoaXNfb2JqZWN0KCkgfHwgIWVuZW15IHx8IFF1ZXJ5UHJvcChQX05PX0FUVEFDSykKKyAgICAgIHx8ICggcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShlbmVteSkgJiYgISBpbnRlcmFjdGl2ZShlbmVteSkgKSApCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKCBpbnRwKHNwZWxsKSApCisgICAgc3BlbGwgPSAoWyBTUF9QSFlTSUNBTF9BVFRBQ0sgOiAhc3BlbGwsCisgICAgICAgICAgICAgICBTUF9TSE9XX0RBTUFHRSAgICAgOiAhc3BlbGwsCisgICAgICAgICAgICAgICBTUF9SRURVQ0VfQVJNT1VSICAgOiAoWyBdKSAgXSk7CisgIGVsc2UgaWYgKCAhbWFwcGluZ3Aoc3BlbGwpICkgLy8gSWxsZWdhbGVyIHNwZWxsLVBhcmFtZXRlcgorICAgIHJldHVybiAwOworCisgIC8vIHRlc3RlbiBvYiBlaW5lIGVyd2VpdGVydGUgZGVmZW5kaW5mbyB2b3JoYW5kZW4gaXN0CisgIGlmKCFtZW1iZXIoc3BlbGwsRUlORk9fREVGRU5EKSkKKyAgeworICAgICAgICAgIC8vc3BlbGwrPShbRUlORk9fREVGRU5EOihbXSldKTsgLy8gZ2dmIGhpbnp1ZnVlZ2VuCisgICAgICAgIC8vIHVzZSBhIHRlbXBvcmFyeSBtYXBwaW5nIHRvIGF2b2lkIHJlY3Vyc2l2ZQorICAgICAgICAvLyB2YWxbeF1beV0gPSBkZWVwX2NvcHkodmFsKTsKKyAgICAgICAgbWFwcGluZyB0bXBkZWZlbmQgPSAoWworICAgICAgICAgICAgICAgIE9SSUdJTkFMX0FJTkZPOmRlZXBfY29weShzcGVsbCksCisgICAgICAgICAgICAgICAgT1JJR0lOQUxfREFNOmRhbSwKKyAgICAgICAgICAgICAgICAgIE9SSUdJTkFMX0RBTVRZUEU6ZGFtX3R5cGUsCisgICAgICAgIF0pOworICAgICAgICAgIHNwZWxsW0VJTkZPX0RFRkVORF09dG1wZGVmZW5kOworICB9CisKKyAgLy8gU2NoYWRlbnN0eXAgdWViZXJwcnVlZmVuCisgIGlmICggIXBvaW50ZXJwKGRhbV90eXBlKSApCisgICAgZGFtX3R5cGUgPSAoeyBkYW1fdHlwZSB9KTsKKworICBzcGVsbFtFSU5GT19ERUZFTkRdW0NVUlJFTlRfREFNVFlQRV09ZGFtX3R5cGU7CisgIHNwZWxsW0VJTkZPX0RFRkVORF1bQ1VSUkVOVF9EQU1dPWRhbTsKKworICAvLyBUZXN0ZW4sIG9iIGRlciBBbmdyZWlmZXIgc2Nob24gYWxzIEZlaW5kIHJlZ2lzdHJpZXJ0IHdvcmRlbiBpc3QuCisgIC8vIFdlbm4gbmVpbiwgcmVnaXN0cmllcmVuLgorICBpZiAoICFJc0VuZW15KGVuZW15KSAmJiAhc3BlbGxbU1BfTk9fRU5FTVldICkKKyAgeworICAgIHNwZWxsW0VJTkZPX0RFRkVORF1bRU5FTVlfSU5TRVJURURdPTE7CisgICAgSW5zZXJ0RW5lbXkoZW5lbXkpOworICB9CisKKyAgLy8gUkZSLVRha3RpayBhYmZhbmdlbgorICBpZiAoICFRdWVyeVByb3AoUF9FTkFCTEVfSU5fQVRUQUNLX09VVCkgKQorICB7CisgICAgaT10aW1lKCktKGVuZW15LT5RdWVyeVByb3AoUF9MQVNUX01PVkUpKTsKKyAgICAvLyBHZWduZXIgaGF0IHNpY2ggYmV3ZWd0LCBtYW4gc2VsYnN0IG5pY2h0CisgICAgaWYgKCAoaTwzKSAmJiAodGltZSgpLVF1ZXJ5UHJvcChQX0xBU1RfTU9WRSk+PTUpICkKKyAgICB7CisgICAgICAvLyBCZWkgRXJzdGVyIEthbXBmcnVuZGUgd2VuaWdlIFNjaGFkZW4KKyAgICAgIGRhbS89KDQtaSk7CisgICAgICBzcGVsbFtFSU5GT19ERUZFTkRdW1JGUl9SRURVQ0VdPWRhbTsKKyAgICAgIHNwZWxsW0VJTkZPX0RFRkVORF1bQ1VSUkVOVF9EQU1dPWRhbTsKKyAgICB9CisgIH0KKworICAvLyBNYW4ga2FubiBWZXJ0ZWlkaWdlciBoYWJlbi4gRGllc2Uga29tbWVuIGFscyBlcnN0ZSB6dW0gWnVnZQorICBpZiAoIHJlcz1RdWVyeVByb3AoUF9ERUZFTkRFUlMpICkKKyAgeyBvYmplY3QgKmRlZnMsKmRlZnNfaGVyZTsKKworICAgIGRlZnM9KHt9KTsKKyAgICBkZWZzX2hlcmU9KHt9KTsKKyAgICBpZiAoICFwb2ludGVycChyZXMpICkKKyAgICAgIHJlcz0oe3Jlc30pOworICAgIC8vIGVyc3QgYWxsZSBhbndlc2VuZGVuIGZpbmRlbi4KKyAgICBmb3JlYWNoKG9iamVjdCBkZWZlbmRlcjogcmVzKSB7CisgICAgICBpZiAoIG9iamVjdHAoZGVmZW5kZXIpICYmIChtZW1iZXIoZGVmcyxkZWZlbmRlcik8MCkgKQorICAgICAgeworICAgICAgICBkZWZzKz0oe2RlZmVuZGVyfSk7CisgICAgICAgIC8vICBWZXJ0ZWlkaWdlciBtdWVzc2VuIGltIGdsZWljaGVuIFJhdW0gb2RlciBpbSBMaXZpbmcgc2VsYmVyCisgICAgICAgIC8vICBlbnRoYWx0ZW4gc2Vpbi4KKyAgICAgICAgaWYgKCBlbnZpcm9ubWVudChkZWZlbmRlcikgPT0gZW52aXJvbm1lbnQoKQorICAgICAgICAgICAgfHwgZW52aXJvbm1lbnQoZGVmZW5kZXIpID09IE1FKQorICAgICAgICB7CisgICAgICAgICAgY2FsbF9vdGhlcihkZWZlbmRlciwiSW5mb3JtRGVmZW5kIixlbmVteSk7CisgICAgICAgICAgaWYgKGRlZmVuZGVyKQorICAgICAgICAgICAgZGVmc19oZXJlICs9ICh7IGRlZmVuZGVyIH0pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIC8vQW53ZXNlbmRlIFZlcnRlaWRpZ2VyIGVpbnRyYWdlbi4KKyAgICBzcGVsbFtFSU5GT19ERUZFTkRdW1BSRVNFTlRfREVGRU5ERVJTXT1kZWZzX2hlcmU7CisKKyAgICAvLyBQX0RFRkVOREVSUyBhdWNoIGdsZWljaCBha3R1YWxpc2llcmVuCisgICAgaWYgKCBzaXplb2YoZGVmcyk8MSApCisgICAgICBkZWZzPTA7CisgICAgU2V0UHJvcChQX0RFRkVOREVSUyxkZWZzKTsKKworICAgIGlmICggc3BlbGxbU1BfUEhZU0lDQUxfQVRUQUNLXSApIHsKKyAgICAgIC8vIEJlaSBwaHlzaXNjaGVuIEFuZ3JpZmZlbiBudXIgVmVydGVpZGlnZXIgYXVzIFJlaWhlIDEKKyAgICAgIC8vIG5laG1lbiAoei5CLiBmdWVyIFJ1ZWNrZW5kZWNrdW5nKQorICAgICAgZm9yZWFjaChvYmplY3QgZGVmZW5kZXI6IGRlZnNfaGVyZSkgeworICAgICAgICBpZiAoIChkZWZlbmRlci0+UHJlc2VudFBvc2l0aW9uKCkpPjEgKSB7CisgICAgICAgICAgZGVmc19oZXJlLT0oe2RlZmVuZGVyfSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgCisgICAgaWYgKCAoaT1zaXplb2YoZGVmc19oZXJlKSkgKQorICAgIHsKKyAgICAgIG1peGVkIGVkZWZlbmR0bXA9KHtkZWZzX2hlcmVbcmFuZG9tKGkpXSwwLDAsMH0pOyAKKyAgICAgIHJlcz1jYWxsX290aGVyKGVkZWZlbmR0bXBbREVGX0RFRkVOREVSXSwiRGVmZW5kT3RoZXIiLAorICAgICAgICAgICAgICAgICAgICAgZGFtLGRhbV90eXBlLHNwZWxsLGVuZW15KTsKKyAgICAgIGlmICggcG9pbnRlcnAocmVzKSAmJiAoc2l6ZW9mKHJlcyk+PTMpICYmIGludHAocmVzWzBdKQorICAgICAgICAgICYmIHBvaW50ZXJwKHJlc1sxXSkpCisgICAgICB7CisgICAgICAgIC8vIEhlbGZlciBrb2VubmVuIGRlbiBTY2hhZGVuIG9kZXIgU2NoYWRlbnN0eXAgYWVuZGVybiwKKyAgICAgICAgLy8gei5CLiBVbXdhbmRsdW5nIHZvbiBGZXVlciBuYWNoIEVpcyBvZGVyIHNvLi4uCisgICAgICAgIGRhbT1yZXNbMF07CisgICAgICAgIGVkZWZlbmR0bXBbREVGX0RBTV09ZGFtOworICAgICAgICBkYW1fdHlwZT1yZXNbMV07CisgICAgICAgIGVkZWZlbmR0bXBbREVGX0RBTVRZUEVdPWRhbV90eXBlOworCisgICAgICAgIGlmICggbWFwcGluZ3AocmVzWzJdKSApCisgICAgICAgIHsKKyAgICAgICAgICBzcGVsbD1yZXNbMl07CisgICAgICAgICAgLy8gdGV1ZXIsIGFiZXIgZ2VodCBuaWNodCBhbmRlcnMgKFJla3Vyc2lvbiB2ZXJtZWlkZW4pCisgICAgICAgICAgZWRlZmVuZHRtcFtERUZfU1BFTExdPWRlZXBfY29weShyZXNbMl0pOworICAgICAgICB9CisgICAgICAgIHNwZWxsW0VJTkZPX0RFRkVORF1bQ1VSUkVOVF9EQU1UWVBFXT1kYW1fdHlwZTsKKyAgICAgICAgc3BlbGxbRUlORk9fREVGRU5EXVtDVVJSRU5UX0RBTV09ZGFtOworICAgICAgfQorICAgICAgc3BlbGxbRUlORk9fREVGRU5EXVtERUZFTkRJTkdfREVGRU5ERVJdPWVkZWZlbmR0bXA7CisgICAgfQorICB9IC8vIEVuZGUgRGVmZW5kZXItVmVyYXJiZWl0dW5nCisKKworICAvLyBVZWJlciBlaW5lbiBQX1RNUF9ERUZFTkRfSE9PSyB3ZXJkZW4gei5CLiBTY2h1dHp6YXViZXIgZ2VoYW5kaGFidAorICBzcGVsbFtFSU5GT19ERUZFTkRdW0RFRkVORF9IT09LXT1ESV9OT0hPT0s7CisgIGlmICggcmVzPVF1ZXJ5UHJvcChQX1RNUF9ERUZFTkRfSE9PSykgKQorICB7CisgICAgaWYgKCBwb2ludGVycChyZXMpICYmIChzaXplb2YocmVzKT49MykgJiYgaW50cChyZXNbMF0pICYmICh0aW1lKCk8cmVzWzBdKQorICAgICAgICAmJiBvYmplY3RwKHJlc1sxXSkgJiYgc3RyaW5ncChyZXNbMl0pICkKKyAgICB7CisgICAgICBpZiAoICEocmVzPWNhbGxfb3RoZXIocmVzWzFdLHJlc1syXSxkYW0sZGFtX3R5cGUsc3BlbGwsZW5lbXkpKSApCisgICAgICB7CisgICAgICAgIC8vIEVpbiBQX1RNUF9ERUZFTkRfSE9PSyBrYW5uIGRlbiBTY2hhZGVuIHZvbGxzdGFlbmRpZyBhYmZhbmdlbiwKKyAgICAgICAgLy8gZGFzIERlZmVuZCB3aXJkIGRhbm4gaGllciBhYmdlYnJvY2hlbiAqU0lDSyogdW5kIGVzIHdpcmQgbnVyCisgICAgICAgIC8vIG5vY2ggZ2V0ZXN0ZXQsIG9iIG1hbiBpbiBkaWUgRmx1Y2h0IGdlc2NobGFnZW4gd3VyZGUKKyAgICAgICAgc3BlbGxbRUlORk9fREVGRU5EXVtERUZFTkRfSE9PS109RElfSE9PS0lOVEVSUlVQVDsKKyAgICAgICAgQ2hlY2tXaW1weUFuZEZsZWUoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHNwZWxsW0VJTkZPX0RFRkVORF1bREVGRU5EX0hPT0tdPURJX0hPT0s7CisgICAgICAgIGlmICggcG9pbnRlcnAocmVzKSAmJiAoc2l6ZW9mKHJlcyk+PTMpCisgICAgICAgICAgICAmJiBpbnRwKHJlc1swXSAmJiBwb2ludGVycChyZXNbMV0pKSApCisgICAgICAgIHsKKyAgICAgICAgICBtaXhlZCBlZGVmZW5kdG1wPSh7MCwwLDB9KTsKKyAgICAgICAgICAvLyBEZXIgUF9UTVBfREVGRU5EX0hPT0sga2FubiBlYmVuZmFsbHMgU2NoYWRlbnNob2VoZSB1bmQKKyAgICAgICAgICAvLyAtYXJ0IHNvd2llIGRpZSBTcGVsbC1JbmZvcyB2ZXJhZW5kZXJuCisgICAgICAgICAgZGFtPXJlc1swXTsKKyAgICAgICAgICBlZGVmZW5kdG1wW0hPT0tfREFNXT1kYW07CisgICAgICAgICAgZGFtX3R5cGU9cmVzWzFdOworICAgICAgICAgIGVkZWZlbmR0bXBbSE9PS19EQU1UWVBFXT1kYW1fdHlwZTsKKworICAgICAgICAgIGlmICggbWFwcGluZ3AocmVzWzJdKSApCisgICAgICAgICAgeworICAgICAgICAgICAgc3BlbGw9cmVzWzJdOworICAgICAgICAgICAgLy8gV2FlaC4gVGV1ZXIuIEFiZXIgZ2VodCBuaWNodCBhbmRlcnMuCisgICAgICAgICAgICBlZGVmZW5kdG1wW0hPT0tfU1BFTExdPWRlZXBfY29weShzcGVsbCk7CisgICAgICAgICAgfQorICAgICAgICAgIHNwZWxsW0VJTkZPX0RFRkVORF1bREVGRU5EX0hPT0tdPWVkZWZlbmR0bXA7CisgICAgICAgICAgc3BlbGxbRUlORk9fREVGRU5EXVtDVVJSRU5UX0RBTVRZUEVdPWRhbV90eXBlOworICAgICAgICAgIHNwZWxsW0VJTkZPX0RFRkVORF1bQ1VSUkVOVF9EQU1dPWRhbTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgICBTZXRQcm9wKFBfVE1QX0RFRkVORF9IT09LLDApOworICB9IC8vIFBfVE1QX0RFRkVORF9IT09LCisKKyAgLy8gdHJpZ2dlciBkZWZlbmQgaG9vaworICBob29rRGF0YT0oe2RhbSxkYW1fdHlwZSxzcGVsbCxlbmVteX0pOworICBob29rUmVzPUhvb2tGbG93KEhfSE9PS19ERUZFTkQsaG9va0RhdGEpOworICBpZihob29rUmVzICYmIHBvaW50ZXJwKGhvb2tSZXMpICYmIHNpemVvZihob29rUmVzKT5IX1JFVERBVEEpeworICAgIGlmKGhvb2tSZXNbSF9SRVRDT0RFXT09SF9DQU5DRUxMRUQpeworICAgICAgICBzcGVsbFtFSU5GT19ERUZFTkRdW0RFRkVORF9IT09LXT1ESV9IT09LSU5URVJSVVBUOworICAgICAgICBDaGVja1dpbXB5QW5kRmxlZSgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZSBpZihob29rUmVzW0hfUkVUQ09ERV09PUhfQUxURVJFRCAmJiBob29rUmVzW0hfUkVUREFUQV0peworICAgICAgICBzcGVsbFtFSU5GT19ERUZFTkRdW0RFRkVORF9IT09LXT1ESV9IT09LOworICAgICAgICBpZiAoIHBvaW50ZXJwKGhvb2tSZXNbSF9SRVREQVRBXSkgJiYgKHNpemVvZihob29rUmVzW0hfUkVUREFUQV0pPj0zKQorICAgICAgICAgICAgJiYgaW50cChob29rUmVzW0hfUkVUREFUQV1bMF0gJiYgcG9pbnRlcnAoaG9va1Jlc1tIX1JFVERBVEFdWzFdKSkgKQorICAgICAgICB7CisgICAgICAgICAgbWl4ZWQgZWRlZmVuZHRtcD0oezAsMCwwfSk7CisgICAgICAgICAgLy8gRGVyIFBfVE1QX0RFRkVORF9IT09LIGthbm4gZWJlbmZhbGxzIFNjaGFkZW5zaG9laGUgdW5kCisgICAgICAgICAgLy8gLWFydCBzb3dpZSBkaWUgU3BlbGwtSW5mb3MgdmVyYWVuZGVybgorICAgICAgICAgIGRhbT1ob29rUmVzW0hfUkVUREFUQV1bMF07CisgICAgICAgICAgZWRlZmVuZHRtcFtIT09LX0RBTV09ZGFtOworICAgICAgICAgIGRhbV90eXBlPWhvb2tSZXNbSF9SRVREQVRBXVsxXTsKKyAgICAgICAgICBlZGVmZW5kdG1wW0hPT0tfREFNVFlQRV09ZGFtX3R5cGU7CisKKyAgICAgICAgICBpZiAoIG1hcHBpbmdwKGhvb2tSZXNbSF9SRVREQVRBXVsyXSkgKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHNwZWxsPWhvb2tSZXNbSF9SRVREQVRBXVsyXTsKKyAgICAgICAgICAgIC8vIFRldWVyLCB0ZXVlci4uLiA6LSgKKyAgICAgICAgICAgIGVkZWZlbmR0bXBbSE9PS19TUEVMTF09ZGVlcF9jb3B5KHNwZWxsKTsKKyAgICAgICAgICB9CisgICAgICAgICAgc3BlbGxbRUlORk9fREVGRU5EXVtERUZFTkRfSE9PS109ZWRlZmVuZHRtcDsKKyAgICAgICAgICBzcGVsbFtFSU5GT19ERUZFTkRdW0NVUlJFTlRfREFNVFlQRV09ZGFtX3R5cGU7CisgICAgICAgICAgc3BlbGxbRUlORk9fREVGRU5EXVtDVVJSRU5UX0RBTV09ZGFtOworICAgICAgICB9CisgICAgfQorICB9IC8vIEVuZGUgSG9vay1CZWhhbmRsdW5nCisKKyAgaWYgKCAhbWVtYmVyKHNwZWxsLFNQX1JFRFVDRV9BUk1PVVIpIHx8ICFtYXBwaW5ncChzcGVsbFtTUF9SRURVQ0VfQVJNT1VSXSkgKQorICAgICAgICBzcGVsbFtTUF9SRURVQ0VfQVJNT1VSXSA9IChbXSk7CisKKyAgLy8gRXMgZ2lidCBhdWNoIFBhcmllcndhZmZlbiwKKyAgaWYgKCBvYmplY3RwKHRtcD1RdWVyeVByb3AoUF9QQVJSWV9XRUFQT04pKSApCisgIHsKKyAgICByZXMyPXRtcC0+UXVlcnlEZWZlbmQoZGFtX3R5cGUsIHNwZWxsLCBlbmVteSk7CisKKyAgICAvLyBSZWR1emllcmJhcmUgV2lya3NhbWtlaXQgZGVyIFBhcmllcndhZmZlPworICAgIGlmICggbWVtYmVyKHNwZWxsW1NQX1JFRFVDRV9BUk1PVVJdLFBfUEFSUllfV0VBUE9OKQorICAgICAgICAmJiBpbnRwKHJlcz1zcGVsbFtTUF9SRURVQ0VfQVJNT1VSXVtQX1BBUlJZX1dFQVBPTl0pICYmIChyZXM+PTApICkKKyAgICB7CisgICAgICByZXMyPShyZXMyKnJlcykvMTAwOworICAgIH0KKworICAgIGRhbS09cmVzMjsKKyAgICBzcGVsbFtFSU5GT19ERUZFTkRdW0NVUlJFTlRfREFNXT1kYW07CisgIH0KKworICAvLyBKZXR6dCBrb21tZW4gZGllIFJ1ZXN0dW5nZW4gZGVzIExlYmV3ZXNlbnMgaW5zIFNwaWVsICh3ZW5uIGVzIGRlbm4KKyAgLy8gd2VsY2hlIHRyYWVndCkKKworICBhcm1vdXJzPVF1ZXJ5UHJvcChQX0FSTU9VUlMpLSh7MH0pOworICBpZiAoIChpPXNpemVvZihhcm1vdXJzKSk+MCApIHsgCisgICAgc3RyaW5nIGF0eTsKKworICAgIHRtcD1hcm1vdXJzW3JhbmRvbShpKV07CisKKyAgICBpZiAoIG9iamVjdHAodG1wKSApCisgICAgICAvL1VlYmVyZ2FiZSBkZXMgTWFwcGluZ3MgZWggYWxzIFBvaW50ZXIvUmVmZXJlbnosIGRhaGVyIGJpbGxpZworICAgICAgdG1wLT5UYWtlRmxhdyhkYW1fdHlwZSxzcGVsbFtFSU5GT19ERUZFTkRdKTsKKworICAgIC8vIHBybyBSdWVzdHVuZyBlaW4gS2V5IGFuIFBsYXR6IHJlc2VydmllcmVuCisgICAgc3BlbGxbRUlORk9fREVGRU5EXVtERUZFTkRfQVJNT1VSU109bV9hbGxvY2F0ZShpLDIpOworICAgIGZvcmVhY2gob2JqZWN0IGFybW91ciA6IGFybW91cnMpIHsKKyAgICAgIGlmICggb2JqZWN0cChhcm1vdXIpICkgeworICAgICAgICBhdHk9KHN0cmluZylhcm1vdXItPlF1ZXJ5UHJvcChQX0FSTU9VUl9UWVBFKTsKKworICAgICAgICBpZiAoIG1lbWJlcihzcGVsbFtTUF9SRURVQ0VfQVJNT1VSXSxhdHkpCisgICAgICAgICAgICAmJiBpbnRwKHJlczI9c3BlbGxbU1BfUkVEVUNFX0FSTU9VUl1bYXR5XSkgJiYgKHJlczI+PTApICkKKyAgICAgICAgICBkYW0gLT0gKHJlczIqYXJtb3VyLT5RdWVyeURlZmVuZChkYW1fdHlwZSwgc3BlbGwsIGVuZW15KSkvMTAwOworICAgICAgICBlbHNlCisgICAgICAgICAgZGFtIC09IChpbnQpKGFybW91ci0+UXVlcnlEZWZlbmQoZGFtX3R5cGUsIHNwZWxsLCBlbmVteSkpOworICAgICAgICAvLyBTY2hhZGVuIE5BQ0ggRGVmZW5kRnVuYyB2ZXJtZXJrZW4uIAorICAgICAgICAvLyBTY2h1dHp3aXJrdW5nIFZPUiBEZWZlbmRGdW5jIChERUZfQVJNT1VSX1BST1QpIHZlcm1lcmt0CisgICAgICAgIC8vIGRhcyBRdWVyeURlZmVuZCgpIHNlbGJlci4KKyAgICAgICAgc3BlbGxbRUlORk9fREVGRU5EXVtERUZFTkRfQVJNT1VSU11bYXJtb3VyLERFRl9BUk1PVVJfREFNXT1kYW07CisgICAgICAgIC8vIGFrdC4gU2NoYWRlbiB2ZXJtZXJrZW4gdW5kIFNjaHV0eiBkZXIgYWt0dWVsbGVuIFJ1ZXN0dW5nICh2b3IKKyAgICAgICAgLy8gRGVmZW5kRnVuYykgd2llZGVyIGF1ZiAwIHNldHplbiBmdWVyIGRlbiBuYWVjaHN0ZW4gRHVyY2hsYXVmLgorICAgICAgICBzcGVsbFtFSU5GT19ERUZFTkRdW0NVUlJFTlRfREFNXT1kYW07CisgICAgICAgIHNwZWxsW0VJTkZPX0RFRkVORF1bREVGRU5EX0NVUl9BUk1PVVJfUFJPVF09MDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBNYW5jaGUgR2lsZGVuIGhhYmVuIGVpbmVuIFZlcnRlaWRpZ3VuZ3Nza2lsbC4gRGVyIGtvbW10IGpldHp0IHp1bQorICAvLyB0cmFnZW4uIERlciBTa2lsbCBrYW5uIGRpZSBTY2hhZGVuc2hvZWhlIHVuZCAtYXJ0IGJlZWluZmx1c3Nlbi4KKyAgc3BlbGxbRUlORk9fREVGRU5EXSs9KFtERUZFTkRfR1VJTEQ6KHt9KV0pOworICBpZiAoIG1hcHBpbmdwKHJlcz1Vc2VTa2lsbChTS19NQUdJQ19ERUZFTlNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChbIFNJX0VORU1ZICAgICAgICAgICAgOiBlbmVteSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSV9TS0lMTERBTUFHRSAgICAgIDogZGFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NLSUxMREFNQUdFX1RZUEUgOiBkYW1fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSV9TUEVMTCAgICAgICAgICAgIDogc3BlbGwgICAgIF0pKSkgKQorICB7CisgICAgZGFtPShpbnQpcmVzW1NJX1NLSUxMREFNQUdFXTsKKworICAgIGlmICggcG9pbnRlcnAocmVzW1NJX1NLSUxMREFNQUdFX1RZUEVdKSApCisgICAgICAgIGRhbV90eXBlPXJlc1tTSV9TS0lMTERBTUFHRV9UWVBFXTsKKworICAgIHNwZWxsW0VJTkZPX0RFRkVORF1bQ1VSUkVOVF9EQU1UWVBFXT1kYW1fdHlwZTsKKyAgICBzcGVsbFtFSU5GT19ERUZFTkRdW0NVUlJFTlRfREFNXT1kYW07CisgICAgc3BlbGxbRUlORk9fREVGRU5EXVtERUZFTkRfR1VJTERdPSh7ZGFtLGRhbV90eXBlfSk7CisgIH0KKworICAvLyBFdnRsLiBpbnRlcm5lIE1vZGlmaWthdGlvbmVuCisgIEludGVybmFsTW9kaWZ5RGVmZW5kKCZkYW0sICZkYW1fdHlwZSwgJnNwZWxsLCAmZW5lbXkpOworCisgIHNwZWxsW0VJTkZPX0RFRkVORF1bQ1VSUkVOVF9EQU1UWVBFXT1kYW1fdHlwZTsKKyAgc3BlbGxbRUlORk9fREVGRU5EXVtDVVJSRU5UX0RBTV09ZGFtOworCisgIC8vIFRlc3Rlbiwgb2IgaXJnZW5kd2FzIGltIEludmVudG9yeSBkZXMgTGViZXdlc2VuIGF1ZiBkZW4gQW5ncmlmZgorICAvLyAicmVhZ2llcnQiCisgIENoZWNrU2Vuc2l0aXZlQXR0YWNrKGRhbSxkYW1fdHlwZSxzcGVsbCxlbmVteSk7CisKKyAgaWYgKCAhb2JqZWN0cChlbmVteSkgKQorICAgIHJldHVybiAwOworCisgIC8vIEFuZ3JpZmZzemVpdCBpbSBHZWduZXIgc2V0emVuCisgIGVuZW15LT5TZXRQcm9wKFBfTEFTVF9DT01CQVRfVElNRSx0aW1lKCkpOworCisgIC8vIERpZSBSZXNpc3RlbnplbiBkZXMgTGViZXdlc2VucyAobmF0dWVybGljaGUgdW5kIGR1cmNoIFJ1ZXN0dW5nZW4KKyAgLy8gZ2VzZXR6dGUpIGJlcnVlY2tzaWNodGlnZW4KKyAgZGFtID0gdG9faW50KENoZWNrUmVzaXN0YW5jZShkYW1fdHlwZSkqZGFtKTsKKyAgc3BlbGxbRUlORk9fREVGRU5EXVtERUZFTkRfUkVTSV09ZGFtOworCisgIHNwZWxsW0VJTkZPX0RFRkVORF1bQ1VSUkVOVF9EQU1dPWRhbTsKKworICAvLyBCZWkgcGh5c2lrYWxpc2NoZW4gQW5ncmlmZmVuIHdpcmQgZGllIG5hdHVlcmxpY2hlIFBhbnplcnVuZyB1bmQgZGllCisgIC8vIEdlc2NoaWNrbGljaGtlaXQgZGVzIExlYmV3ZXNlbnMgYmVydWVja3NpY2h0aWd0CisgIG9iamVjdCBzdGF0ID0gZmluZF9vYmplY3QoIi9kL2Vyem1hZ2llci96ZXNzdHJhL3BhY3N0YXQiKTsgLy8gVE9ETzogcmVtb3ZlCisgIGlmICggc3BlbGxbU1BfUEhZU0lDQUxfQVRUQUNLXSApCisgIHsKKyAgICAvLyBNaW5pbXVtIGlzdCBhdWNoIGhpZXIgMS4KKyAgICBpbnQgYm9keSA9IFF1ZXJ5UHJvcChQX0JPRFkpK1F1ZXJ5QXR0cmlidXRlKEFfREVYKTsKKyAgICByZXMyID0gKGJvZHkvNCArIHJhbmRvbShib2R5KjMvNCArIDEpKSB8fCAxOworICAgIGlmIChzdGF0KQorICAgICAgc3RhdC0+Ym9keXN0YXQoYm9keSwgcmVzMiwgcmFuZG9tKGJvZHkpKzEpOworCisgICAgLy8gUmVkdXppZXJiYXJlIFdpcmtzYW1rZWl0IGRlcyBCb2RpZXM/CisgICAgaWYgKCBtZW1iZXIoc3BlbGxbU1BfUkVEVUNFX0FSTU9VUl0sIFBfQk9EWSkKKyAgICAgICAgJiYgaW50cChyZXM9c3BlbGxbU1BfUkVEVUNFX0FSTU9VUl1bUF9CT0RZXSkgJiYgKHJlcz49MCkgKQorICAgICAgcmVzMj0ocmVzMipyZXMpLzEwMDsKKworICAgIGRhbS09cmVzMjsKKyAgfQorICBzcGVsbFtFSU5GT19ERUZFTkRdW0RFRkVORF9CT0RZXT1kYW07CisgIHNwZWxsW0VJTkZPX0RFRkVORF1bQ1VSUkVOVF9EQU1dPWRhbTsKKworICAvLyBJc3QgdWViZXJoYXVwdCBub2NoIGV0d2FzIHZvbSBTY2hhZGVuIHVlYnJpZyBnZWJsaWViZW4/CisgIGlmICggZGFtPDAgKQorICAgIGRhbSA9IDA7CisgIHNwZWxsW0VJTkZPX0RFRkVORF1bQ1VSUkVOVF9EQU1dPWRhbTsKKworICAvLyBmdWVyIGRpZSBTdGF0aXN0aWsKKyAgLy8gVE9ETzogZW50ZmVybmVuIG5hY2ggVGVzdC1VcHRpbWUKKyAgaWYgKHN0YXQpCisgICAgc3RhdC0+ZGFtYWdlc3RhdChzcGVsbFtFSU5GT19ERUZFTkRdKTsKKworICAvLyBEaWUgQW56YWhsIGRlciBhYnp1emllaGVuZGVuIExlYmVuc3B1bmt0ZSBpc3QgZGVyIGR1cmNoIDEwIGdldGVpbHRlCisgIC8vIFNjaGFkZW5zd2VydAorICBkYW0gPSBkYW0gLyAxMDsKKyAgc3BlbGxbRUlORk9fREVGRU5EXVtERUZFTkRfTE9TVExQXT1kYW07CisKKyAgLy8gZXZ0bC4gaGF0IGVudHdlZGVyIGRlciBBdWZydWZlciBvZGVyIGRhcyBMZWJld2VzZW4gc2VsYmVyIGVpZ2VuZQorICAvLyBTY2hhZGVuc21lbGR1bmdlbiBkZWZpbmllcnQuIERpZSB2b20gQXVmcnVmZXIgaGFiZW4gUHJpb3JpdGFldC4KKyAgbWl4ZWQgZGFtX21zZyA9IHNwZWxsW1NQX1NIT1dfREFNQUdFXTsKKyAgLy8gV2VubiAhPSAwIChkLmguIFRyZWZmZXJtZWxkdW5nZW4gZ3J1bmRzYWV0emxpY2ggZXJ3dWVuc2NodCksIGFiZXIga2VpbgorICAvLyBBcnJheSwgaGllciBpbSBMaXZpbmcgZnJhZ2VuLgorICBpZiAoZGFtX21zZyAmJiAhcG9pbnRlcnAoZGFtX21zZykpCisgICAgZGFtX21zZyA9IFF1ZXJ5UHJvcChQX0RBTUFHRV9NU0cpOworCisgIC8vIEluIGRlbiBtZWlzdGVuIEZhZWxsZW4gc29sbCBhdWNoIGVpbmUgU2NoYWRlbnNtZWxkdW5nIGF1c2dlZ2ViZW4KKyAgLy8gd2VyZGVuLCBkaWUgZGllIEhvZWhlIGRlcyBTY2hhZGVucyAoZ3JvYikgYW56ZWlndAorICBpZiAoc3BlbGxbU1BfU0hPV19EQU1BR0VdICYmICFwb2ludGVycChkYW1fbXNnKSkgeworICAgIG15bmFtZT1uYW1lKFdFTik7CisgICAgZW5uYW1lPWVuZW15LT5OYW1lKFdFUik7CisgICAgaWYgKGVuZW15LT5RdWVyeVByb3AoUF9QTFVSQUwpKSB7CisgICAgICBzd2l0Y2ggKGRhbSkgeworICAgICAgY2FzZSAwOgorICAgICAgICB0ZWxsX29iamVjdChlbmVteSxzcHJpbnRmKCIgIElociB2ZXJmZWhsdCAlcy5cbiIsbXluYW1lKSk7CisgICAgICAgIHRlbGxfb2JqZWN0KHRoaXNfb2JqZWN0KCksc3ByaW50ZigiICAlcyB2ZXJmZWhsZW4gRGljaC5cbiIsZW5uYW1lKSk7CisgICAgICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudChlbmVteSl8fGVudmlyb25tZW50KHRoaXNfb2JqZWN0KCkpLAorICAgICAgICAgICBzcHJpbnRmKCIgICVzIHZlcmZlaGxlbiAlcy5cbiIsZW5uYW1lLG15bmFtZSksCisgICAgICAgICAgICAgICAgICAoeyBlbmVteSwgdGhpc19vYmplY3QoKSB9KSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxOgorICAgICAgICB0ZWxsX29iamVjdChlbmVteSxzcHJpbnRmKCIgIElociBraXR6ZWx0ICVzIGFtIEJhdWNoLlxuIixteW5hbWUpKTsKKyAgICAgICAgdGVsbF9vYmplY3QodGhpc19vYmplY3QoKSwKKyAgICAgICAgICBzcHJpbnRmKCIgICVzIGtpdHplbG4gRGljaCBhbSBCYXVjaC5cbiIsZW5uYW1lKSk7CisgICAgICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudChlbmVteSl8fGVudmlyb25tZW50KHRoaXNfb2JqZWN0KCkpLAorICAgICAgICAgIHNwcmludGYoIiAgJXMga2l0emVsbiAlcyBhbSBCYXVjaC5cbiIsZW5uYW1lLG15bmFtZSksCisgICAgICAgICAgICAgICAgICAoeyBlbmVteSwgdGhpc19vYmplY3QoKSB9KSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyLi4zOgorICAgICAgICB0ZWxsX29iamVjdChlbmVteSxzcHJpbnRmKCIgIElociBrcmF0enQgJXMuXG4iLG15bmFtZSkpOworICAgICAgICB0ZWxsX29iamVjdCh0aGlzX29iamVjdCgpLHNwcmludGYoIiAgJXMga3JhdHplbiBEaWNoLlxuIixlbm5hbWUpKTsKKyAgICAgICAgdGVsbF9yb29tKGVudmlyb25tZW50KGVuZW15KXx8ZW52aXJvbm1lbnQodGhpc19vYmplY3QoKSksCisgICAgICAgICAgc3ByaW50ZigiICAlcyBrcmF0emVuICVzLlxuIixlbm5hbWUsbXluYW1lKSwKKyAgICAgICAgICAgICAgICAgICh7IGVuZW15LCB0aGlzX29iamVjdCgpIH0pKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDQuLjU6CisgICAgICAgIHRlbGxfb2JqZWN0KGVuZW15LHNwcmludGYoIiAgSWhyIHRyZWZmdCAlcy5cbiIsbXluYW1lKSk7CisgICAgICAgIHRlbGxfb2JqZWN0KHRoaXNfb2JqZWN0KCksc3ByaW50ZigiICAlcyB0cmVmZmVuIERpY2guXG4iLGVubmFtZSkpOworICAgICAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoZW5lbXkpfHxlbnZpcm9ubWVudCh0aGlzX29iamVjdCgpKSwKKyAgICAgICAgICBzcHJpbnRmKCIgICVzIHRyZWZmZW4gJXMuXG4iLGVubmFtZSxteW5hbWUpLAorICAgICAgICAgICAgICAgICAgKHsgZW5lbXksIHRoaXNfb2JqZWN0KCkgfSkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNi4uMTA6CisgICAgICAgIHRlbGxfb2JqZWN0KGVuZW15LHNwcmludGYoIiAgSWhyIHRyZWZmdCAlcyBoYXJ0LlxuIixteW5hbWUpKTsKKyAgICAgICAgdGVsbF9vYmplY3QodGhpc19vYmplY3QoKSxzcHJpbnRmKCIgICVzIHRyZWZmZW4gRGljaCBoYXJ0LlxuIixlbm5hbWUpKTsKKyAgICAgICAgdGVsbF9yb29tKGVudmlyb25tZW50KGVuZW15KXx8ZW52aXJvbm1lbnQodGhpc19vYmplY3QoKSksCisgICAgICAgICAgc3ByaW50ZigiICAlcyB0cmVmZmVuICVzIGhhcnQuXG4iLGVubmFtZSxteW5hbWUpLAorICAgICAgICAgICAgICAgICAgKHsgZW5lbXksIHRoaXNfb2JqZWN0KCkgfSkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTEuLjIwOgorICAgICAgICB0ZWxsX29iamVjdChlbmVteSxzcHJpbnRmKCIgIElociB0cmVmZnQgJXMgc2VociBoYXJ0LlxuIixteW5hbWUpKTsKKyAgICAgICAgdGVsbF9vYmplY3QodGhpc19vYmplY3QoKSwKKyAgICAgICAgICBzcHJpbnRmKCIgICVzIHRyZWZmZW4gRGljaCBzZWhyIGhhcnQuXG4iLGVubmFtZSkpOworICAgICAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoZW5lbXkpfHxlbnZpcm9ubWVudCh0aGlzX29iamVjdCgpKSwKKyAgICAgICAgICBzcHJpbnRmKCIgICVzIHRyZWZmZW4gJXMgc2VociBoYXJ0LlxuIixlbm5hbWUsbXluYW1lKSwKKyAgICAgICAgICAgICAgICAgICh7IGVuZW15LCB0aGlzX29iamVjdCgpIH0pKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDIxLi4zMDoKKyAgICAgICAgdGVsbF9vYmplY3QoZW5lbXksCisgICAgICAgICAgc3ByaW50ZigiICBJaHIgc2NobGFndCAlcyBtaXQgZGVtIEtyYWNoZW4gYnJlY2hlbmRlciBLbm9jaGVuLlxuIiwKKyAgICAgICAgICAgICAgICAgIG15bmFtZSkpOworICAgICAgICB0ZWxsX29iamVjdCh0aGlzX29iamVjdCgpLAorICAgICAgICAgIHNwcmludGYoIiAgJXMgc2NobGFnZW4gRGljaCBtaXQgZGVtIEtyYWNoZW4gYnJlY2hlbmRlciBLbm9jaGVuLlxuIiwKKyAgICAgICAgICAgICAgICAgIGVubmFtZSkpOworICAgICAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoZW5lbXkpfHxlbnZpcm9ubWVudCh0aGlzX29iamVjdCgpKSwKKyAgICAgICAgICBzcHJpbnRmKCIgICVzIHNjaGxhZ2VuICVzIG1pdCBkZW0gS3JhY2hlbiBicmVjaGVuZGVyIEtub2NoZW4uXG4iLAorICAgICAgICAgICAgICAgICAgZW5uYW1lLG15bmFtZSksICh7IGVuZW15LCB0aGlzX29iamVjdCgpIH0pKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDMxLi41MDoKKyAgICAgICAgdGVsbF9vYmplY3QoZW5lbXksCisgICAgICAgICAgc3ByaW50ZigiICBJaHIgemVyc2NobWV0dGVydCAlcyBpbiBrbGVpbmUgU3R1ZWNrY2hlbi5cbiIsbXluYW1lKSk7CisgICAgICAgIHRlbGxfb2JqZWN0KHRoaXNfb2JqZWN0KCksCisgICAgICAgICAgc3ByaW50ZigiICAlcyB6ZXJzY2htZXR0ZXJuIERpY2ggaW4ga2xlaW5lIFN0dWVja2NoZW4uXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5uYW1lKSk7CisgICAgICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudChlbmVteSl8fGVudmlyb25tZW50KHRoaXNfb2JqZWN0KCkpLAorICAgICAgICAgIHNwcmludGYoIiAgJXMgemVyc2NobWV0dGVybiAlcyBpbiBrbGVpbmUgU3R1ZWNrY2hlbi5cbiIsCisgICAgICAgICAgICAgICAgICBlbm5hbWUsbXluYW1lKSwgKHsgZW5lbXksIHRoaXNfb2JqZWN0KCkgfSkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNTEuLjc1OgorICAgICAgICB0ZWxsX29iamVjdChlbmVteSxzcHJpbnRmKCIgIElociBzY2hsYWd0ICVzIHp1IEJyZWkuXG4iLG15bmFtZSkpOworICAgICAgICB0ZWxsX29iamVjdCh0aGlzX29iamVjdCgpLAorICAgICAgICAgIHNwcmludGYoIiAgJXMgc2NobGFnZW4gRGljaCB6dSBCcmVpLlxuIixlbm5hbWUpKTsKKyAgICAgICAgdGVsbF9yb29tKGVudmlyb25tZW50KGVuZW15KXx8ZW52aXJvbm1lbnQodGhpc19vYmplY3QoKSksCisgICAgICAgICAgc3ByaW50ZigiICAlcyBzY2hsYWdlbiAlcyB6dSBCcmVpLlxuIixlbm5hbWUsbXluYW1lKSwKKyAgICAgICAgICAgICAgICAgICh7IGVuZW15LCB0aGlzX29iamVjdCgpIH0pKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDc2Li4xMDA6CisgICAgICAgIHRlbGxfb2JqZWN0KGVuZW15LHNwcmludGYoIiAgSWhyIHB1bHZlcmlzaWVydCAlcy5cbiIsbXluYW1lKSk7CisgICAgICAgIHRlbGxfb2JqZWN0KHRoaXNfb2JqZWN0KCksc3ByaW50ZigiICAlcyBwdWx2ZXJpc2llcmVuIERpY2guXG4iLGVubmFtZSkpOworICAgICAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoZW5lbXkpfHxlbnZpcm9ubWVudCh0aGlzX29iamVjdCgpKSwKKyAgICAgICAgICBzcHJpbnRmKCIgICVzIHB1bHZlcmlzaWVyZW4gJXMuXG4iLGVubmFtZSxteW5hbWUpLAorICAgICAgICAgICAgICAgICAgKHsgZW5lbXksIHRoaXNfb2JqZWN0KCkgfSkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTAxLi4xNTA6CisgICAgICAgIHRlbGxfb2JqZWN0KGVuZW15LHNwcmludGYoIiAgSWhyIHplcnN0YWV1YnQgJXMuXG4iLG15bmFtZSkpOworICAgICAgICB0ZWxsX29iamVjdCh0aGlzX29iamVjdCgpLHNwcmludGYoIiAgJXMgemVyc3RhZXViZW4gRGljaC5cbiIsZW5uYW1lKSk7CisgICAgICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudChlbmVteSl8fGVudmlyb25tZW50KHRoaXNfb2JqZWN0KCkpLAorICAgICAgICAgIHNwcmludGYoIiAgJXMgemVyc3RhZXViZW4gJXMuXG4iLGVubmFtZSxteW5hbWUpLAorICAgICAgICAgICAgICAgICAgKHsgZW5lbXksIHRoaXNfb2JqZWN0KCkgfSkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTUxLi4yMDA6CisgICAgICAgIHRlbGxfb2JqZWN0KGVuZW15LHNwcmludGYoIiAgSWhyIGF0b21pc2llcnQgJXMuXG4iLG15bmFtZSkpOworICAgICAgICB0ZWxsX29iamVjdCh0aGlzX29iamVjdCgpLHNwcmludGYoIiAgJXMgYXRvbWlzaWVyZW4gRGljaC5cbiIsZW5uYW1lKSk7CisgICAgICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudChlbmVteSl8fGVudmlyb25tZW50KHRoaXNfb2JqZWN0KCkpLAorICAgICAgICAgIHNwcmludGYoIiAgJXMgYXRvbWlzaWVyZW4gJXMuXG4iLGVubmFtZSxteW5hbWUpLAorICAgICAgICAgICAgICAgICAgKHsgZW5lbXksIHRoaXNfb2JqZWN0KCkgfSkpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRlbGxfb2JqZWN0KGVuZW15LHNwcmludGYoIiAgSWhyIHZlcm5pY2h0ZXQgJXMuXG4iLG15bmFtZSkpOworICAgICAgICB0ZWxsX29iamVjdCh0aGlzX29iamVjdCgpLHNwcmludGYoIiAgJXMgdmVybmljaHRlbiBEaWNoLlxuIixlbm5hbWUpKTsKKyAgICAgICAgdGVsbF9yb29tKGVudmlyb25tZW50KGVuZW15KXx8ZW52aXJvbm1lbnQodGhpc19vYmplY3QoKSksCisgICAgICAgICAgc3ByaW50ZigiICAlcyB2ZXJuaWNodGVuICVzLlxuIixlbm5hbWUsbXluYW1lKSwKKyAgICAgICAgICAgICAgICAgICh7IGVuZW15LCB0aGlzX29iamVjdCgpIH0pKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBzd2l0Y2ggKGRhbSkgeworICAgICAgY2FzZSAwOgorICAgICAgICB0ZWxsX29iamVjdChlbmVteSxzcHJpbnRmKCIgIER1IHZlcmZlaGxzdCAlcy5cbiIsbXluYW1lKSk7CisgICAgICAgIHRlbGxfb2JqZWN0KHRoaXNfb2JqZWN0KCksc3ByaW50ZigiICAlcyB2ZXJmZWhsdCBEaWNoLlxuIixlbm5hbWUpKTsKKyAgICAgICAgdGVsbF9yb29tKGVudmlyb25tZW50KGVuZW15KXx8ZW52aXJvbm1lbnQodGhpc19vYmplY3QoKSksCisgICAgICAgICAgc3ByaW50ZigiICAlcyB2ZXJmZWhsdCAlcy5cbiIsZW5uYW1lLG15bmFtZSksCisgICAgICAgICAgICAgICAgICAoeyBlbmVteSwgdGhpc19vYmplY3QoKSB9KSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxOgorICAgICAgICB0ZWxsX29iamVjdChlbmVteSxzcHJpbnRmKCIgIER1IGtpdHplbHN0ICVzIGFtIEJhdWNoLlxuIixteW5hbWUpKTsKKyAgICAgICAgdGVsbF9vYmplY3QodGhpc19vYmplY3QoKSwKKyAgICAgICAgICBzcHJpbnRmKCIgICVzIGtpdHplbHQgRGljaCBhbSBCYXVjaC5cbiIsZW5uYW1lKSk7CisgICAgICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudChlbmVteSl8fGVudmlyb25tZW50KHRoaXNfb2JqZWN0KCkpLAorICAgICAgICAgIHNwcmludGYoIiAgJXMga2l0emVsdCAlcyBhbSBCYXVjaC5cbiIsZW5uYW1lLG15bmFtZSksCisgICAgICAgICAgICAgICAgICAoeyBlbmVteSwgdGhpc19vYmplY3QoKSB9KSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyLi4zOgorICAgICAgICB0ZWxsX29iamVjdChlbmVteSxzcHJpbnRmKCIgIER1IGtyYXR6dCAlcy5cbiIsbXluYW1lKSk7CisgICAgICAgIHRlbGxfb2JqZWN0KHRoaXNfb2JqZWN0KCksc3ByaW50ZigiICAlcyBrcmF0enQgRGljaC5cbiIsZW5uYW1lKSk7CisgICAgICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudChlbmVteSl8fGVudmlyb25tZW50KHRoaXNfb2JqZWN0KCkpLAorICAgICAgICAgIHNwcmludGYoIiAgJXMga3JhdHp0ICVzLlxuIixlbm5hbWUsbXluYW1lKSwKKyAgICAgICAgICAgICAgICAgICh7IGVuZW15LCB0aGlzX29iamVjdCgpIH0pKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDQuLjU6CisgICAgICAgIHRlbGxfb2JqZWN0KGVuZW15LHNwcmludGYoIiAgRHUgdHJpZmZzdCAlcy5cbiIsbXluYW1lKSk7CisgICAgICAgIHRlbGxfb2JqZWN0KHRoaXNfb2JqZWN0KCksc3ByaW50ZigiICAlcyB0cmlmZnQgRGljaC5cbiIsZW5uYW1lKSk7CisgICAgICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudChlbmVteSl8fGVudmlyb25tZW50KHRoaXNfb2JqZWN0KCkpLAorICAgICAgICAgIHNwcmludGYoIiAgJXMgdHJpZmZ0ICVzLlxuIixlbm5hbWUsbXluYW1lKSwKKyAgICAgICAgICAgICAgICAgICh7IGVuZW15LCB0aGlzX29iamVjdCgpIH0pKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDYuLjEwOgorICAgICAgICB0ZWxsX29iamVjdChlbmVteSxzcHJpbnRmKCIgIER1IHRyaWZmc3QgJXMgaGFydC5cbiIsbXluYW1lKSk7CisgICAgICAgIHRlbGxfb2JqZWN0KHRoaXNfb2JqZWN0KCksc3ByaW50ZigiICAlcyB0cmlmZnQgRGljaCBoYXJ0LlxuIixlbm5hbWUpKTsKKyAgICAgICAgdGVsbF9yb29tKGVudmlyb25tZW50KGVuZW15KXx8ZW52aXJvbm1lbnQodGhpc19vYmplY3QoKSksCisgICAgICAgICAgc3ByaW50ZigiICAlcyB0cmlmZnQgJXMgaGFydC5cbiIsZW5uYW1lLG15bmFtZSksCisgICAgICAgICAgICAoeyBlbmVteSwgdGhpc19vYmplY3QoKSB9KSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMS4uMjA6CisgICAgICAgIHRlbGxfb2JqZWN0KGVuZW15LHNwcmludGYoIiAgRHUgdHJpZmZzdCAlcyBzZWhyIGhhcnQuXG4iLG15bmFtZSkpOworICAgICAgICB0ZWxsX29iamVjdCh0aGlzX29iamVjdCgpLAorICAgICAgICAgIHNwcmludGYoIiAgJXMgdHJpZmZ0IERpY2ggc2VociBoYXJ0LlxuIixlbm5hbWUpKTsKKyAgICAgICAgdGVsbF9yb29tKGVudmlyb25tZW50KGVuZW15KXx8ZW52aXJvbm1lbnQodGhpc19vYmplY3QoKSksCisgICAgICAgICAgc3ByaW50ZigiICAlcyB0cmlmZnQgJXMgc2VociBoYXJ0LlxuIixlbm5hbWUsbXluYW1lKSwKKyAgICAgICAgICAgICAgICAgICh7IGVuZW15LCB0aGlzX29iamVjdCgpIH0pKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDIxLi4zMDoKKyAgICAgICAgdGVsbF9vYmplY3QoZW5lbXksCisgICAgICAgICAgc3ByaW50ZigiICBEdSBzY2hsYWVnc3QgJXMgbWl0IGRlbSBLcmFjaGVuIGJyZWNoZW5kZXIgS25vY2hlbi5cbiIsCisgICAgICAgICAgICAgICAgICBteW5hbWUpKTsKKyAgICAgICAgdGVsbF9vYmplY3QodGhpc19vYmplY3QoKSwKKyAgICAgICAgICBzcHJpbnRmKCIgICVzIHNjaGxhZWd0IERpY2ggbWl0IGRlbSBLcmFjaGVuIGJyZWNoZW5kZXIgS25vY2hlbi5cbiIsCisgICAgICAgICAgICAgICAgICBlbm5hbWUpKTsKKyAgICAgICAgdGVsbF9yb29tKGVudmlyb25tZW50KGVuZW15KXx8ZW52aXJvbm1lbnQodGhpc19vYmplY3QoKSksCisgICAgICAgICAgc3ByaW50ZigiICAlcyBzY2hsYWVndCAlcyBtaXQgZGVtIEtyYWNoZW4gYnJlY2hlbmRlciBLbm9jaGVuLlxuIiwKKyAgICAgICAgICAgICAgICAgIGVubmFtZSxteW5hbWUpLCAoeyBlbmVteSwgdGhpc19vYmplY3QoKSB9KSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzMS4uNTA6CisgICAgICAgIHRlbGxfb2JqZWN0KGVuZW15LAorICAgICAgICAgIHNwcmludGYoIiAgRHUgemVyc2NobWV0dGVyc3QgJXMgaW4ga2xlaW5lIFN0dWVja2NoZW4uXG4iLG15bmFtZSkpOworICAgICAgICB0ZWxsX29iamVjdCh0aGlzX29iamVjdCgpLAorICAgICAgICAgIHNwcmludGYoIiAgJXMgemVyc2NobWV0dGVydCBEaWNoIGluIGtsZWluZSBTdHVlY2tjaGVuLlxuIixlbm5hbWUpKTsKKyAgICAgICAgdGVsbF9yb29tKGVudmlyb25tZW50KGVuZW15KXx8ZW52aXJvbm1lbnQodGhpc19vYmplY3QoKSksCisgICAgICAgICAgc3ByaW50ZigiICAlcyB6ZXJzY2htZXR0ZXJ0ICVzIGluIGtsZWluZSBTdHVlY2tjaGVuLlxuIiwKKyAgICAgICAgICAgICAgICAgIGVubmFtZSxteW5hbWUpLCAoeyBlbmVteSwgdGhpc19vYmplY3QoKSB9KSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA1MS4uNzU6CisgICAgICAgIHRlbGxfb2JqZWN0KGVuZW15LHNwcmludGYoIiAgRHUgc2NobGFlZ3N0ICVzIHp1IEJyZWkuXG4iLG15bmFtZSkpOworICAgICAgICB0ZWxsX29iamVjdCh0aGlzX29iamVjdCgpLAorICAgICAgICAgIHNwcmludGYoIiAgJXMgc2NobGFlZ3QgRGljaCB6dSBCcmVpLlxuIixlbm5hbWUpKTsKKyAgICAgICAgdGVsbF9yb29tKGVudmlyb25tZW50KGVuZW15KXx8ZW52aXJvbm1lbnQodGhpc19vYmplY3QoKSksCisgICAgICAgICAgc3ByaW50ZigiICAlcyBzY2hsYWVndCAlcyB6dSBCcmVpLlxuIixlbm5hbWUsbXluYW1lKSwKKyAgICAgICAgICAgICAgICAgICh7IGVuZW15LCB0aGlzX29iamVjdCgpIH0pKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDc2Li4xMDA6CisgICAgICAgIHRlbGxfb2JqZWN0KGVuZW15LHNwcmludGYoIiAgRHUgcHVsdmVyaXNpZXJzdCAlcy5cbiIsbXluYW1lKSk7CisgICAgICAgIHRlbGxfb2JqZWN0KHRoaXNfb2JqZWN0KCksc3ByaW50ZigiICAlcyBwdWx2ZXJpc2llcnQgRGljaC5cbiIsZW5uYW1lKSk7CisgICAgICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudChlbmVteSl8fGVudmlyb25tZW50KHRoaXNfb2JqZWN0KCkpLAorICAgICAgICAgIHNwcmludGYoIiAgJXMgcHVsdmVyaXNpZXJ0ICVzLlxuIixlbm5hbWUsbXluYW1lKSwKKyAgICAgICAgICAgICAgICAgICh7IGVuZW15LCB0aGlzX29iamVjdCgpIH0pKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEwMS4uMTUwOgorICAgICAgICB0ZWxsX29iamVjdChlbmVteSxzcHJpbnRmKCIgIER1IHplcnN0YWV1YnN0ICVzLlxuIixteW5hbWUpKTsKKyAgICAgICAgdGVsbF9vYmplY3QodGhpc19vYmplY3QoKSxzcHJpbnRmKCIgICVzIHplcnN0YWV1YnQgRGljaC5cbiIsZW5uYW1lKSk7CisgICAgICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudChlbmVteSl8fGVudmlyb25tZW50KHRoaXNfb2JqZWN0KCkpLAorICAgICAgICAgIHNwcmludGYoIiAgJXMgemVyc3RhZXVidCAlcy5cbiIsZW5uYW1lLG15bmFtZSksCisgICAgICAgICAgICAgICAgICAoeyBlbmVteSwgdGhpc19vYmplY3QoKSB9KSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxNTEuLjIwMDoKKyAgICAgICAgdGVsbF9vYmplY3QoZW5lbXksc3ByaW50ZigiICBEdSBhdG9taXNpZXJzdCAlcy5cbiIsbXluYW1lKSk7CisgICAgICAgIHRlbGxfb2JqZWN0KHRoaXNfb2JqZWN0KCksc3ByaW50ZigiICAlcyBhdG9taXNpZXJ0IERpY2guXG4iLGVubmFtZSkpOworICAgICAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoZW5lbXkpfHxlbnZpcm9ubWVudCh0aGlzX29iamVjdCgpKSwKKyAgICAgICAgICBzcHJpbnRmKCIgICVzIGF0b21pc2llcnQgJXMuXG4iLGVubmFtZSxteW5hbWUpLAorICAgICAgICAgICAgICAgICAgKHsgZW5lbXksIHRoaXNfb2JqZWN0KCkgfSkpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRlbGxfb2JqZWN0KGVuZW15LHNwcmludGYoIiAgRHUgdmVybmljaHRlc3QgJXMuXG4iLG15bmFtZSkpOworICAgICAgICB0ZWxsX29iamVjdCh0aGlzX29iamVjdCgpLHNwcmludGYoIiAgJXMgdmVybmljaHRldCBEaWNoLlxuIixlbm5hbWUpKTsKKyAgICAgICAgdGVsbF9yb29tKGVudmlyb25tZW50KGVuZW15KXx8ZW52aXJvbm1lbnQodGhpc19vYmplY3QoKSksCisgICAgICAgICAgc3ByaW50ZigiICAlcyB2ZXJuaWNodGV0ICVzLlxuIixlbm5hbWUsbXluYW1lKSwKKyAgICAgICAgICAgICAgICAgICh7IGVuZW15LCB0aGlzX29iamVjdCgpIH0pKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gTWFuIGthbm4gYXVjaCBzZWxic3QtZGVmaW5pZXJ0ZSBTY2hhZGVuc21lbGR1bmdlbiBhdXNnZWJlbiBsYXNzZW4KKyAgZWxzZSBpZiggc3BlbGxbU1BfU0hPV19EQU1BR0VdICYmIHBvaW50ZXJwKGRhbV9tc2cpICkKKyAgeworICAgIGZvciggaT1zaXplb2YoZGFtX21zZykgOyAtLWkgPj0gMCA7ICkKKyAgICB7CisgICAgICBpZiAoIGRhbT5kYW1fbXNnW2ldWzBdICkKKyAgICAgIHsKKyAgICAgICAgdGVsbF9vYmplY3QoTUUsbWVzcyhkYW1fbXNnW2ldWzFdLE1FLGVuZW15KSk7CisgICAgICAgIHRlbGxfb2JqZWN0KGVuZW15LG1lc3MoZGFtX21zZ1tpXVsyXSxNRSxlbmVteSkpOworICAgICAgICBzYXkobWVzcyhkYW1fbXNnW2ldWzNdLE1FLGVuZW15KSwgZW5lbXkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLy8gZWxzZSAoIXNwZWxsW1NQX1NIT1dfREFNQUdFXSkga2VpbmUgU2NoYWRlbnNtZWxkdW5nLgorCisgIC8vIEluZm9ybWF0aW9uZW4gdWViZXIgZGVuIGxldHp0ZW4gQW5ncmlmZiBmZXN0aGFsdGVuCisgIFNldChQX0xBU1RfREFNVFlQRVMsIGRhbV90eXBlKTsKKyAgU2V0KFBfTEFTVF9EQU1USU1FLCAgdGltZSgpKTsKKyAgU2V0KFBfTEFTVF9EQU1BR0UsICAgZGFtKTsKKworICAvLyBCZWkgQW5ncmlmZmVuIG1pdCBTUF9OT19FTkVNWS1GbGFnIGthbm4gbWFuIG5pY2h0IHN0ZXJiZW4gLi4uCisgIGlmICggc3BlbGxbU1BfTk9fRU5FTVldICkKKyAgICByZWR1Y2VfaGl0X3BvaW50cyhkYW0pOworICAvLyAuLi4gYmVpIGFsbGVuIGFuZGVyZW4gbmF0dWVybGljaCBzY2hvbgorICBlbHNlCisgICAgZG9fZGFtYWdlKGRhbSxlbmVteSk7CisKKyAgLy8gZXZ0bC4gaXN0IGRpZXMgT2JqZWt0IGhpZXIgdG90Li4uCisgIGlmICghb2JqZWN0cChNRSkpIHJldHVybiBkYW07CisKKyAgLy8gVGVzdGVuLCBvYiBtYW4gaW4gZGllIEZ1Y2h0IGdlc2NobGFnZW4gd2lyZAorICBDaGVja1dpbXB5QW5kRmxlZSgpOworCisgIC8vIFZlcnVyc2FjaHRlbiBTY2hhZGVuIChpbiBMUCkgenVydWVja2dlYmVuCisgIHJldHVybiBkYW07Cit9CisKK3B1YmxpYyBmbG9hdCBDaGVja1Jlc2lzdGFuY2Uoc3RyaW5nICpkYW1fdHlwZSkgeworICAgIC8vZnVua3Rpb24ga3JpZWd0IGRpZSBzY2hhZGVuc2FydGVuIHVlYmVyZ2ViZW4sIHNjaGF1dCBzaWNoIGRpZXNlcworICAgIC8vc293aWUgUF9SRVNJU1RFTkNFX1NUUkVOR1RIIHVuZCBQX1JFU0lURU5DRV9NT0RGSUZJRVIgYW4gdW5kIGJlcmVjaG5ldAorICAgIC8vZWluZW4gRmFrdG9yLCBtaXQgZGVtIGRpZSB1cnNwcnVlbmdsaWNoZSBTY2hhZGVuc21lbmdlIG11bHRpcGxpemllcnQKKyAgICAvL3dpcmQsIHVtIGRlbiBTY2hhZGVuIG5hY2ggQmVydWVja3NpY2h0aWd1bmcgZGVyIFJlc2lzL0FuZmFlbGxpZ2tlaXRlbiB6dQorICAgIC8vZXJoYWx0ZW4uIFJ1ZWNrZ2FiZXdlcnQgbm9ybWFsZXJ3ZWlzZSAocy51LikgPj0wLgorICBtYXBwaW5nIHJzdHJlbiwgbW9kOworICBmbG9hdCAgIGZha3RvcixuOworICBpbnQgICAgIGk7CisKKyAgbW9kID0gUXVlcnkoUF9SRVNJU1RBTkNFX01PRElGSUVSKTsKKyAgaWYgKCBtYXBwaW5ncChtb2QpICkKKyAgICBtb2QgPSBtb2RbIm1lIl07CisKKyAgaWYgKCAhbWFwcGluZ3AocnN0cmVuPVF1ZXJ5KFBfUkVTSVNUQU5DRV9TVFJFTkdUSFMpKSApCisgIHsKKyAgICBpZiAoIW1hcHBpbmdwKG1vZCkpCisgICAgICByZXR1cm4gMS4wOworICAgIGVsc2UKKyAgICAgIHJzdHJlbiA9IChbXSk7CisgIH0KKworICBpZiAoICFtYXBwaW5ncChtb2QpICkKKyAgICBtb2QgPSAoW10pOworCisgIGlmICggKGk9c2l6ZW9mKGRhbV90eXBlKSk8MSApCisgICAgcmV0dXJuIDEuMDsKKworICBuPXRvX2Zsb2F0KGkpOworICBmYWt0b3I9MC4wOworCisgIC8vZGllcyBoaWVyIHR1dCBuaWNodCBtZWhyIGRhcyBnZXd1ZW5zY2h0ZSwgd2VubiBpbiBQX1JFU0lTVEVOQ0VfU1RSRU5HVEhTCisgIC8vRmFrdG9yZW4gPC0xLjAgYW5nZWdlYmVuIHdlcmRlbi4gUnVlY2tnYWJld2VydGUgPDAgc2luZCBkYW5uIG1vZWdsaWNoIHVuZAorICAvL2xlaWRlciB3ZXJkZW4gZGllIFNjaGFkZW5zYXJ0ZW4gb2huZSBSZXNpcyBuaWNodCBtZWhyIHJpY2h0aWcgdmVyd3Vyc3RldC4gOi0vCisgIGZvcmVhY2goc3RyaW5nIGR0OiBkYW1fdHlwZSkgeworICAgIGZha3RvciA9IGZha3RvciArICgxLjAgKyB0b19mbG9hdChyc3RyZW5bZHRdKSkKKyAgICAgICAgICAgKiAoMS4wICsgdG9fZmxvYXQobW9kW2R0XSkpLTEuMDsKKyAgfQorICByZXR1cm4gMS4wKyhmYWt0b3Ivbik7Cit9CisKK3B1YmxpYyB2YXJhcmdzIG1hcHBpbmcgU3RvcEh1bnRpbmdNb2RlKGludCBzaWxlbnQpCit7IG1hcHBpbmcgc2F2ZV9lbmVteTsKKyAgaW50ICAgICBpOworCisgIHNhdmVfZW5lbXk9ZW5lbWllczsKKyAgaWYgKCAhc2lsZW50ICkKKyAgICB3YWxrX21hcHBpbmcoZW5lbWllcywgIydTdG9wSHVudFRleHQpOyAvLyMnKTsKKworICBlbmVtaWVzPW1fYWxsb2NhdGUoMCwxKTsKKyAgbGFzdF9hdHRhY2tfbXNnPTA7CisKKyAgcmV0dXJuIHNhdmVfZW5lbXk7Cit9CisKK3B1YmxpYyA8b2JqZWN0KnxpbnQqPiogUXVlcnlFbmVtaWVzKCkKK3sKKyAgcmV0dXJuICh7bV9pbmRpY2VzKGVuZW1pZXMpLG1fdmFsdWVzKGVuZW1pZXMpfSk7Cit9CisKK3B1YmxpYyBtYXBwaW5nIEdldEVuZW1pZXMoKQoreworICByZXR1cm4gZW5lbWllczsKK30KKworcHVibGljIG1hcHBpbmcgU2V0RW5lbWllcyg8b2JqZWN0KnxpbnQqPiogbXllbmVtaWVzKQoreworICBlbmVtaWVzPW1rbWFwcGluZyhteWVuZW1pZXNbMF0sbXllbmVtaWVzWzFdKTsKKyAgcmV0dXJuIGVuZW1pZXM7Cit9CisKK3ByaXZhdGUgc3RyaW5nIF9raWxsX2FsaWFzKCBzdHJpbmcgc3RyICkKK3sKKyAgICByZXR1cm4gIlxcIiArIHN0cjsKK30KKworcHVibGljIHZhcmFyZ3Mgdm9pZCBGbGVlKCBvYmplY3Qgb2xkZW52LCBpbnQgZm9yY2UgKQoreyBtaXhlZCAgICpleGl0cywgZXhpdCwgZGV4OworICBtYXBwaW5nIHRtcDsKKyAgaW50ICAgICBpOworICBvYmplY3QgIGVudjsKKworICBpZiAoICFlbnZpcm9ubWVudCgpICkKKyAgICByZXR1cm47CisKKyAgLy8gbWl0ICdmb3JjZScga2FubiBtYW4gZGllIENoZWNrcyB1bWdlaGVuLCBkYW1pdCBkZXIgU3BpZWxlciBhdWYgamVkZW4KKyAgLy8gRmFsbCBmbHVlY2h0ZXQgLi4uCisgIGlmICggIWZvcmNlICYmICggb2xkZW52ICYmIChvbGRlbnYgIT0gZW52aXJvbm1lbnQoKSkgfHwKKyAgICAgICAgICAgICAgICAgICBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKE1FKSAmJiAoIUVuZW15UHJlc2VudCgpIHx8CisgICAgICAgICAgICAgICAgICAgKFF1ZXJ5UHJvcChQX0hQKSA+PSBRdWVyeVByb3AoUF9XSU1QWSkpKSApICkKKyAgICByZXR1cm47CisKKyAgLy8gLi4uIGFiZXIgTWFnaWVyIGZsdWVjaHRlbiB6dSBsYXNzZW4gaXN0IG5pY2h0IGdhbnogc28gZWluZmFjaCA7LSkKKyAgaWYgKCBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHRoaXNfb2JqZWN0KCkpICYmIElTX0xFQVJOSU5HKHRoaXNfb2JqZWN0KCkpICkKKyAgICByZXR1cm47CisKKyAgLy8gR2Vpc3RlciBicmF1Y2hlbiBuaWNodCB1bSBpaHIgTGViZW4genUgZnVlcmNodGVuCisgIGlmICggUXVlcnlQcm9wKFBfR0hPU1QpICkKKyAgICByZXR1cm47CisKKyAgdGVsbF9vYmplY3QoIE1FLCAiRGllIEFuZ3N0IGlzdCBzdGFlcmtlciBhbHMgRHUgLi4uICIrCisgICAgICAgICAgICAgICAgICAgIkR1IHdpbGxzdCBudXIgbm9jaCB3ZWcgaGllci5cbiIpOworCisgIGlmICggVGVhbUZsZWUoKSApIC8vIEVyZm9sZ3JlaWNoZSBGbHVjaHQgaW4gaGludGVyZSBLYW1wZnJlaWhlPworICAgIHJldHVybjsKKworICBlbnYgPSBlbnZpcm9ubWVudCgpOworICB0bXAgPSBlbnZpcm9ubWVudCgpLT5RdWVyeVByb3AoUF9FWElUUyk7CisgIGV4aXRzID0gbV9pbmRpY2VzKHRtcCk7CisgIHRtcCA9IGVudmlyb25tZW50KCktPlF1ZXJ5UHJvcChQX1NQRUNJQUxfRVhJVFMpOworICBleGl0cyArPSBtX2luZGljZXModG1wKTsKKworICBpZiAoIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoTUUpICkKKyAgICAgICAgZXhpdHMgPSBtYXAoIGV4aXRzLCAjJ19raWxsX2FsaWFzLyonKi8gKTsKKworICAvLyBkaWUgRmx1Y2h0cmljaHR1bmcgdm9uIE1hZ2llcm4gd2lyZCBhdXMgU2ljaGVyaGVpdHNncnVlbmRlbgorICAvLyBuaWNodCBhdXNnZXdlcnRldAorICBpZiAoIGludGVyYWN0aXZlKE1FKSAmJiBJU19TRUVSKE1FKSAmJiAhSVNfTEVBUk5FUihNRSkKKyAgICAgICYmIChkZXg9UXVlcnlQcm9wKFBfV0lNUFlfRElSRUNUSU9OKSkgKQorICB7CisgICAgaSA9IDYwICsgNCAqIChRdWVyeVByb3AoUF9MRVZFTCkgLSAzMCkgLyAzOworICAgIGV4aXRzICs9ICh7ZGV4fSk7IC8vIGJldm9yenVndGUgRmx1Y2h0cmljaHR1bmcgbWluZGVzdGVucyBlaW5tYWwKKyAgfQorCisgIGlmICggIXNpemVvZihleGl0cykgKQorICB7CisgICAgdGVsbF9vYmplY3QoIE1FLCAiRHUgdmVyc3VjaHN0IHp1IGZsaWVoZW4sIHNjaGFmZnN0IGVzIGFiZXIgbmljaHQuXG4iICk7CisKKyAgICByZXR1cm47CisgIH0KKworICB3aGlsZSAoIHNpemVvZihleGl0cykgJiYgKGVudmlyb25tZW50KCk9PWVudikgKQorICB7CisgICAgaWYgKCBkZXggICAgICAgICAgICAgICAgICAgICAgICAgLy8gVm9yenVnc3dlaXNlIEZsdWNodHJpY2h0dW5nPworICAgICAgICAmJiAobWVtYmVyKGV4aXRzLGRleCkgPj0gMCkgIC8vIG1vZWdsaWNoPworICAgICAgICAmJiAocmFuZG9tKDEwMCkgPD0gaSkpICAgICAgIC8vIHVuZCBXYWhyc2NoZWlubGljaGtlaXQgZ3Jvc3MgZ2VudWc/CisgICAgICBleGl0ID0gZGV4OworICAgIGVsc2UKKyAgICAgIGV4aXQgPSBleGl0c1tyYW5kb20oc2l6ZW9mKGV4aXRzKSldOworCisgICAgY2F0Y2goY29tbWFuZChleGl0KTtwdWJsaXNoKTsKKyAgICBleGl0cyAtPSAoe2V4aXR9KTsKKyAgfQorCisgIGlmICggZW52aXJvbm1lbnQoKT09ZW52ICkKKyAgICB0ZWxsX29iamVjdCggTUUsICJEZWluIEZsdWNodHZlcnN1Y2ggaXN0IGdlc2NoZWl0ZXJ0LlxuIiApOworfQorCitwdWJsaWMgb2JqZWN0IEVuZW15UHJlc2VudCgpCit7CisgIGZvcmVhY2gob2JqZWN0IGVuOiBlbmVtaWVzKSB7CisgICAgaWYgKGVudmlyb25tZW50KCk9PWVudmlyb25tZW50KGVuKSkKKyAgICAgIHJldHVybiBlbjsKKyAgfQorICByZXR1cm4gMDsKK30KKworcHVibGljIG9iamVjdCBJbkZpZ2h0KCkKK3sKKyAgcmV0dXJuIEVuZW15UHJlc2VudCgpOworfQorCitwdWJsaWMgdmFyYXJncyBpbnQgU3RvcEh1bnRJRChzdHJpbmcgc3RyLCBpbnQgc2lsZW50KSB7IAorCisgIGlmICggIXN0cmluZ3Aoc3RyKSApCisgICAgcmV0dXJuIDA7CisKKyAgaW50IGo7CisgIGZvcmVhY2gob2JqZWN0IGVuOiBlbmVtaWVzKSB7CisgICAgaWYgKGVuLT5pZChzdHIpKSB7CisgICAgICBTdG9wSHVudEZvcihlbixzaWxlbnQpOworICAgICAgaisrOworICAgIH0KKyAgfQorCisgIHJldHVybiBqOworfQorCitwdWJsaWMgaW50IFNwZWxsRGVmZW5kKG9iamVjdCBjYXN0ZXIsIG1hcHBpbmcgc2luZm8pCit7IGludCAgICByZTsKKyAgbWl4ZWQgIHJlczsKKyAgc3RyaW5nICppbmQ7CisKKyAgcmUgPSBVc2VTa2lsbChTS19TUEVMTF9ERUZFTkQsKFsgU0lfU0tJTExBUkcgOiBzaW5mbyAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX0VORU1ZICAgIDogY2FzdGVyIF0pICk7CisKKyAgaWYgKCAocmVzPVF1ZXJ5UHJvcChQX01BR0lDX1JFU0lTVEFOQ0VfT0ZGU0VUKSkgJiYgbWFwcGluZ3AocmVzKQorICAgICAgJiYgcG9pbnRlcnAoc2luZm9bU0lfTUFHSUNfVFlQRV0pKQorICB7CisgICAgaW5kID0gbV9pbmRpY2VzKHJlcykgJiBzaW5mb1tTSV9NQUdJQ19UWVBFXTsKKworICAgIGlmIChwb2ludGVycChpbmQpICYmIHNpemVvZihpbmQpICkgeworICAgICAgZm9yZWFjaChzdHJpbmcgaW5kZXggOiBpbmQpCisgICAgICAgIHJlKz1yZXNbaW5kZXhdOworICAgIH0KKyAgfQorICBlbHNlIGlmKHJlcyAmJiBpbnRwKHJlcykpCisgICAgcmUrPXJlczsKKworICBpZiAoIChyZT4zMzMzKSAmJiBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHRoaXNfb2JqZWN0KCkpICkKKyAgICByZT0zMzMzOyAvKiBNYXhpbWFsIDMzJSBBYndlaHJjaGFuY2UgYmVpIFNwaWVsZXJuICovCisgIHJldHVybiByZTsKK30KKworLy8gKioqKiB0aGlzIGlzIHByb3BlcnR5LWxpa2UKKworc3RhdGljIGludCBfc2V0X2F0dGFja19idXN5KG1peGVkIHZhbCkKK3sKKyAgaWYgKCAoKHRvX2ludCh2YWwpKT41KSAmJiBwcmV2aW91c19vYmplY3QoMSkKKyAgICAgICYmIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUocHJldmlvdXNfb2JqZWN0KDEpKSApCisgICAgbG9nX2ZpbGUoIkFUVEFDS0JVU1kiLHNwcmludGYoIiVzICVkIFRhZXRlcjogJU8gT3BmZXI6ICVPXG4iLAorICAgICAgICAgICAgIGR0aW1lKHRpbWUoKSksdG9faW50KHZhbCkscHJldmlvdXNfb2JqZWN0KDEpLHRoaXNfb2JqZWN0KCkpKTsKKworICBhdHRhY2tfYnVzeS09dG9faW50KHZhbCoxMDAuMCk7CisKKyAgaWYgKCBhdHRhY2tfYnVzeTwtMjAwMCApCisgICAgYXR0YWNrX2J1c3k9LTIwMDA7CisKKyAgcmV0dXJuIGF0dGFja19idXN5OworfQorCitzdGF0aWMgaW50IF9xdWVyeV9hdHRhY2tfYnVzeSgpCit7CisgIGlmIChJU19MRUFSTklORyhNRSkpCisgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIChhdHRhY2tfYnVzeTwxMDApOworfQorCisvLyAqKioqIGxvY2FsIHByb3BlcnR5IG1ldGhvZHMKK3N0YXRpYyBpbnQgX3NldF93aW1weShpbnQgaSkKK3sKKyAgaWYgKCAhaW50cChpKSB8fCAoaT5RdWVyeVByb3AoUF9NQVhfSFApKSB8fCAoaTwwKSApCisgICAgcmV0dXJuIDA7CisKKyAgLy8gZ2dmLiBTdGF0dXNyZXBvcnQgYXVzZ2ViZW4KKyAgaWYgKGludGVyYWN0aXZlKE1FKSkKKyAgICBzdGF0dXNfcmVwb3J0KERPX1JFUE9SVF9XSU1QWSwgaSk7CisKKyAgcmV0dXJuIFNldChQX1dJTVBZLCBpKTsKK30KKworc3RhdGljIHN0cmluZyBfc2V0X3dpbXB5X2RpcihzdHJpbmcgcykgeworICAvLyBnZ2YuIFN0YXR1c3JlcG9ydCBhdXNnZWJlbgorICBpZiAoaW50ZXJhY3RpdmUoTUUpKQorICAgIHN0YXR1c19yZXBvcnQoRE9fUkVQT1JUX1dJTVBZX0RJUiwgcyk7CisgIHJldHVybiBTZXQoUF9XSU1QWV9ESVJFQ1RJT04sIHMsIEZfVkFMVUUpOworfQorCitzdGF0aWMgbWl4ZWQgX3NldF9oYW5kcyhtaXhlZCBoKQoreyAKKyAgaWYgKCBzaXplb2YoaCk9PTIgKQorICAgIGggKz0gKHsgKHtEVF9CTFVER0VPTn0pIH0pOworICBpZiAoIXBvaW50ZXJwKGhbMl0pKQorICAgIGhbMl0gPSAoe2hbMl19KTsKKyAgcmV0dXJuIFNldChQX0hBTkRTLCBoLCBGX1ZBTFVFKTsKK30KKworLy9UT0RPIG5vcm1hbGlzaWVyZW4va29ycmlnaWVyZW4gaW4gdXBkYXRlc19hZnRlcl9yZXN0b3JlKCkuCitzdGF0aWMgbWl4ZWQgX3F1ZXJ5X2hhbmRzKCkKK3sKKyAgbWl4ZWQgKmhhbmRzID0gUXVlcnkoUF9IQU5EUyk7CisgIGlmICggIWhhbmRzICkKKyAgICByZXR1cm4gU2V0KFBfSEFORFMsICh7ICIgbWl0IGJsb3NzZW4gSGFlbmRlbiIsIDMwLCAoe0RUX0JMVURHRU9OfSl9KSk7CisgIGVsc2UgaWYgKCBzaXplb2YoaGFuZHMpPDMgKQorICAgIHJldHVybiBTZXQoUF9IQU5EUywgKHtoYW5kc1swXSwgaGFuZHNbMV0sICh7RFRfQkxVREdFT059KX0pKTsKKyAgZWxzZSBpZiAoICFwb2ludGVycChoYW5kc1syXSkgKQorICAgIHJldHVybiBTZXQoUF9IQU5EUywgKHtoYW5kc1swXSwgaGFuZHNbMV0sICh7IGhhbmRzWzJdIH0pfSkpOworCisgIHJldHVybiBRdWVyeShQX0hBTkRTKTsKK30KKworc3RhdGljIGludCBfcXVlcnlfdG90YWxfd2MoKQoreyBtaXhlZCByZXM7CisgIGludCAgIHRvdHdjOworCisgIGlmICggb2JqZWN0cChyZXM9UXVlcnlQcm9wKFBfV0VBUE9OKSkgKQorICAgIHRvdHdjID0gKChpbnQpKHJlcy0+UXVlcnlQcm9wKFBfV0MpKSk7CisgIGVsc2UgaWYgKCBwb2ludGVycChyZXM9UXVlcnlQcm9wKFBfSEFORFMpKSAmJiBzaXplb2YocmVzKT4xCisgICAgICAgICAgICYmIGludHAocmVzWzFdKSApCisgICAgdG90d2M9KChpbnQpcmVzWzFdKTsKKyAgZWxzZQorICAgIHRvdHdjPTMwOworCisgIHRvdHdjID0gKCgyKnRvdHdjKSsoMTAqUXVlcnlBdHRyaWJ1dGUoQV9TVFIpKSkvMzsKKworICByZXR1cm4gU2V0KFBfVE9UQUxfV0MsIHRvdHdjLCBGX1ZBTFVFKTsKK30KKworc3RhdGljIGludCBfcXVlcnlfdG90YWxfYWMoKSB7CisKKyAgaW50IHRvdGFjID0gMDsKKyAgb2JqZWN0ICphcm1vdXJzID0gUXVlcnlQcm9wKFBfQVJNT1VSUyk7CisgIG9iamVjdCBwYXJyeSA9IFF1ZXJ5UHJvcChQX1BBUlJZX1dFQVBPTik7CisKKyAgaWYgKCBtZW1iZXIoYXJtb3VycywwKT49MCApIHsKKyAgICBhcm1vdXJzIC09ICh7IDAgfSk7IAorICB9CisKKyAgZm9yZWFjaChvYmplY3QgYXJtb3VyOiBhcm1vdXJzKQorICAgIHRvdGFjICs9ICgoaW50KWFybW91ci0+UXVlcnlQcm9wKFBfQUMpKTsKKworICBpZiAoIG9iamVjdHAocGFycnkpICkKKyAgICB0b3RhYyArPSBwYXJyeS0+UXVlcnlQcm9wKFBfQUMpOworCisgIHRvdGFjICs9IChRdWVyeVByb3AoUF9CT0RZKStRdWVyeUF0dHJpYnV0ZShBX0RFWCkpOworCisgIHJldHVybiBTZXQoUF9UT1RBTF9BQywgdG90YWMsIEZfVkFMVUUpOworfQorCitzdGF0aWMgbWFwcGluZyBfcXVlcnlfcmVzaXN0YW5jZV9zdHJlbmd0aHMoKSB7CisKKyAgVXBkYXRlUmVzaXN0YW5jZVN0cmVuZ3RocygpOworCisgIG1hcHBpbmcgcnN0cmVuID0gY29weShRdWVyeShQX1JFU0lTVEFOQ0VfU1RSRU5HVEhTLCBGX1ZBTFVFKSk7CisgIG1hcHBpbmcgbW9kID0gUXVlcnkoUF9SRVNJU1RBTkNFX01PRElGSUVSLCBGX1ZBTFVFKTsKKworICBpZiAoICFtYXBwaW5ncChyc3RyZW4pICkKKyAgICByc3RyZW4gPSAoW10pOworCisgIGlmICggIW1hcHBpbmdwKG1vZCkgfHwgIW1hcHBpbmdwKG1vZD1tb2RbIm1lIl0pIHx8ICFzaXplb2YobW9kKSApCisgICAgcmV0dXJuIHJzdHJlbjsKKworICBmb3JlYWNoKHN0cmluZyBtb2RrZXksIGZsb2F0IG1vZHZhbHVlIDogbW9kKQorICAgIHJzdHJlblttb2RrZXldID0gKCgxLjArcnN0cmVuW21vZGtleV0pKigxLjArbW9kdmFsdWUpKS0xLjA7CisKKyAgcmV0dXJuIHJzdHJlbjsKK30KKworc3RhdGljIGludCBfc2V0X2Rpc2FibGVfYXR0YWNrKGludCB2YWwpCit7CisgIGlmICh2YWw8LTEwMDAwMCkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgbG9nX2ZpbGUoIlBBUkFMWVNFX1RPT19MT1ciLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCJXZXJ0IHp1IGtsZWluOiAlcywgV2VydDogJWQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXVmcnVmZXI6ICVPLCBPcGZlcjogJU8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0aW1lKHRpbWUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwscHJldmlvdXNfb2JqZWN0KDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc19vYmplY3QoKSkpOworICAgICAgICAgICB9CisgIGlmICggdmFsPjMwICkKKyAgICB2YWw9MzA7CisgIGlmICggKHZhbD49MjApICYmIHByZXZpb3VzX29iamVjdCgxKSE9TUUgJiYgcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShNRSkgKQorICAgIGxvZ19maWxlKCJQQVJBTFlTRSIsc3ByaW50ZigiJXMgJWQgVGFldGVyOiAlTyBPcGZlcjogJU9cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0aW1lKHRpbWUoKSlbNC4uMTVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwscHJldmlvdXNfb2JqZWN0KDEpLHRoaXNfb2JqZWN0KCkpKTsKKyAKKyAgaWYgKHRpbWUoKTxRdWVyeVByb3AoUF9ORVhUX0RJU0FCTEVfQVRUQUNLKSkKKyAgeworICAgIC8vIGd1ZWx0aWdlIFplaXRzcGVycmUgZXhpc3RpZXJ0LgorICAgIC8vIEVyaG9laGVuIHZvbiBQX0RJU0FCTEVfQVRUQUNLIGdlaHQgZGFubiBuaWNodC4gKEphLCBhdWNoIG5pY2h0IGVyaG9laGVuCisgICAgLy8gZWluZXMgbmVnYXRpdmVuIFBfRElTQUJMRV9BVFRBQ0spCisgICAgaWYgKHZhbCA+PSBRdWVyeVByb3AoUF9ESVNBQkxFX0FUVEFDSykpCisgICAgICByZXR1cm4gRElTQUJMRV9UT09fRUFSTFk7CisgICAgLy8gdmFsIGlzdCBrbGVpbmVyIGFscyBha3R1ZWxsZXMgUF9ESVNBQkxFX0FUVEFDSyAtIGRhcyBpc3QgZXJsYXVidCwgQUJFUiBlcworICAgIC8vIGRhcmYgZGllIGJlc3RlaGVuZGUgWmVpdHNwZXJyZSBuaWNodCB2ZXJyaW5nZXJuLCBkYWhlciB3aXJkIHNpZSBuaWNodAorICAgIC8vIGdlYWVuZGVydC4KKyAgICByZXR1cm4gU2V0KFBfRElTQUJMRV9BVFRBQ0ssdmFsLEZfVkFMVUUpOworICB9CisgIC8vIGVzIGV4aXN0aWVydCBrZWluZSBndWVsdGlnZSBaZWl0c3BlcnJlIC0gZGFubiB3aXJkIHNpZSBudW4gZ2VzZXR6dC4KKyAgLy8gKFNvbGx0ZSB2YWwgPCAwIHNlaW4sIHdpcmQgZWluZSBaZWl0c3BlcnJlIGluIGRlciBWZXJnYW5nZW5oZWl0IGdlc2V0enQsCisgIC8vIGRpZSBzY2hvbiBhYmdlbGF1ZmVuIGlzdC4gRGFzIGlzdCB1ZWJlcmZsdWVzc2lnLCBzY2hhZGV0IGFiZXIgYXVjaAorICAvLyBuaWNodC4pCisgIFNldFByb3AoUF9ORVhUX0RJU0FCTEVfQVRUQUNLLHRpbWUoKSt2YWwqMipfX0hFQVJUX0JFQVRfSU5URVJWQUxfXyk7CisgIHJldHVybiBTZXQoUF9ESVNBQkxFX0FUVEFDSyx2YWwpOworfQorCisvLyBOZXVlIFZlcndhbHR1bmcgZGVyIEhhZW5kZToKKworLy8gUF9IQU5EU19VU0VEX0JZIGVuaGFlbHQgZWluIEFycmF5IG1pdCBhbGxlbiBPYmpla3RlbiwgZGllIEhhZW5kZQorLy8gYmVsZWdlbiwgamVkZXMga29tbXQgc28gb2Z0IHZvciB3aWUgSGFlbmRlIGJlbGVndCB3ZXJkZW4uCisKK3N0YXRpYyBtaXhlZCAqX3F1ZXJ5X2hhbmRzX3VzZWRfYnkoKQoreworICByZXR1cm4gKChRdWVyeShQX0hBTkRTX1VTRURfQlksIEZfVkFMVUUpIHx8ICh7fSkgKSAtICh7MH0pKTsKK30KKworc3RhdGljIGludCBfcXVlcnlfdXNlZF9oYW5kcygpCit7CisgIHJldHVybiBzaXplb2YoUXVlcnlQcm9wKFBfSEFORFNfVVNFRF9CWSkpOworfQorCitzdGF0aWMgaW50IF9xdWVyeV9mcmVlX2hhbmRzKCkKK3sKKyAgcmV0dXJuIChRdWVyeVByb3AoUF9NQVhfSEFORFMpLVF1ZXJ5UHJvcChQX1VTRURfSEFORFMpKTsKK30KKworcHVibGljIHZhcmFyZ3MgaW50IFVzZUhhbmRzKG9iamVjdCBvYiwgaW50IG51bSkKK3sgbWl4ZWQgKmg7CisKKyAgaWYgKCAhb2IgJiYgIShvYj1wcmV2aW91c19vYmplY3QoMSkpICkKKyAgICByZXR1cm4gMDsKKworICBpZiAoIChudW08PTApICYmICgobnVtPW9iLT5RdWVyeVByb3AoUF9IQU5EUykpPD0wKSApCisgICAgcmV0dXJuIDA7CisKKyAgaD1RdWVyeVByb3AoUF9IQU5EU19VU0VEX0JZKS0oe29ifSk7CisKKyAgaWYgKCAoc2l6ZW9mKGgpK251bSk+UXVlcnlQcm9wKFBfTUFYX0hBTkRTKSApCisgICAgcmV0dXJuIDA7CisKKyAgZm9yZWFjaChpbnQgaTogbnVtKQorICAgIGgrPSh7b2J9KTsKKworICBTZXRQcm9wKFBfSEFORFNfVVNFRF9CWSxoKTsKKworICByZXR1cm4gMTsKK30KKworcHVibGljIHZhcmFyZ3MgaW50IEZyZWVIYW5kcyhvYmplY3Qgb2IpCit7CisgIGlmICggIW9iICYmICEob2I9cHJldmlvdXNfb2JqZWN0KDEpKSApCisgICAgcmV0dXJuIDA7CisKKyAgU2V0UHJvcChQX0hBTkRTX1VTRURfQlksUXVlcnlQcm9wKFBfSEFORFNfVVNFRF9CWSktKHtvYn0pKTsKKworICByZXR1cm4gMTsKK30KKworLy8gS29tcGF0aWJsaXRhZXRzZnVua3Rpb25lbjoKKworc3RhdGljIGludCBfc2V0X3VzZWRfaGFuZHMoaW50IG5ld19udW0pCit7IGludCAgICBvbGRfbnVtLCBkaWY7CisgIG9iamVjdCBvYjsKKworICBvbGRfbnVtPVF1ZXJ5UHJvcChQX1VTRURfSEFORFMpOworCisgIGlmICggIW9iamVjdHAob2I9cHJldmlvdXNfb2JqZWN0KDEpKSApCisgICAgcmV0dXJuIG9sZF9udW07CisKKyAgLy8gTWVsZHVuZyBpbnMgRGVidWdsb2cgc2NocmVpYmVuLiBBdWZydWZlciBzb2xsdGUgZ2VmaXh0IHdlcmRlbi4KKyAgZGVidWdfbWVzc2FnZShzcHJpbnRmKCJQX1VTRURfSEFORFMgaW4gJU8gd2lyZCBnZXNldHp0IGR1cmNoICVPXG4iLAorICAgICAgICB0aGlzX29iamVjdCgpLCBvYiksIERNU0dfTE9HRklMRXxETVNHX1NUQU1QKTsKKworICBpZiAoICEoZGlmPW5ld19udW0tb2xkX251bSkgKQorICAgIHJldHVybiBuZXdfbnVtOworCisgIGlmICggZGlmPjAgKQorICAgIFVzZUhhbmRzKG9iLGRpZik7CisgIGVsc2UKKyAgICBGcmVlSGFuZHMob2IpOworCisgIHJldHVybiBRdWVyeVByb3AoUF9VU0VEX0hBTkRTKTsKK30KKworLy8gRnVua3Rpb25lbiBmdWVyIEJlZ3J1ZXNzdW5nc3NjaGxhZyAvIE5hY2tlbnNjaGxhZzoKKworcHVibGljIGludCBDaGVja0VuZW15KG9iamVjdCBvYikKK3sKKyAgcmV0dXJuIChsaXZpbmcob2IpICYmIElzRW5lbXkob2IpKTsKK30KKworcHVibGljIHZhcmFyZ3Mgdm9pZCBFeGVjdXRlTWlzc2luZ0F0dGFja3Mob2JqZWN0ICpyZW1vdmVfYXR0YWNrZXJzKQoreworICBpZiAoICFwb2ludGVycChtaXNzaW5nX2F0dGFja3MpICkKKyAgICBtaXNzaW5nX2F0dGFja3M9KHt9KTsKKworICBpZiAoIHBvaW50ZXJwKHJlbW92ZV9hdHRhY2tlcnMpICkKKyAgICBtaXNzaW5nX2F0dGFja3MtPXJlbW92ZV9hdHRhY2tlcnM7CisKKyAgZm9yZWFjaChvYmplY3Qgb2IgOiBtaXNzaW5nX2F0dGFja3MpIHsKKyAgICBpZiAoIG9iamVjdHAob2IpICYmIChlbnZpcm9ubWVudChvYik9PWVudmlyb25tZW50KCkpICkKKyAgICAgIG9iLT5BdHRhY2syKE1FKTsKKyAgfQorICBtaXNzaW5nX2F0dGFja3M9KHt9KTsKK30KKworcHVibGljIHZvaWQgSW5pdEF0dGFjaygpCit7IG9iamVjdCBvYixuZXh0OworICBjbG9zdXJlIGNiOworCisgIGlmICggIWxpdmluZyhNRSkgKQorICAgIHJldHVybjsKKworICBFeGVjdXRlTWlzc2luZ0F0dGFja3MoKTsKKyAgLy9FTUEga2FubiBkYXMgTGl2aW5nIHplcnN0b2VyZW4gb2RlciB0b2V0ZW4uLi4KKyAgaWYgKCFsaXZpbmcoTUUpIHx8IFF1ZXJ5UHJvcChQX0dIT1NUKSkgcmV0dXJuOworCisgIGlmICggb2JqZWN0cChvYj1Jc1RlYW1Nb3ZlKCkpICkKKyAgICBjYj1zeW1ib2xfZnVuY3Rpb24oIkluaXRBdHRhY2tfQ2FsbGJhY2siLG9iKTsKKyAgZWxzZQorICAgIGNiPTA7CisKKyAgZm9yICggb2I9Zmlyc3RfaW52ZW50b3J5KGVudmlyb25tZW50KCkpIDsgb2JqZWN0cChvYikgOyBvYj1uZXh0KQorICB7CisgICAgbmV4dD1uZXh0X2ludmVudG9yeShvYik7CisKKyAgICBpZiAoICFsaXZpbmcob2IpICkKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKG9iLT5Jc0VuZW15KE1FKSkKKyAgICB7CisgICAgICAvLyBEYXMgaXN0IG5pY2h0IHNvIHNpbm5sb3Mgd2llIGVzIGF1c3NpZWh0LiBhKSB3ZXJkZW4gZGllIEh1bnR0aW1lcworICAgICAgLy8gYWt0dWFsaXNpZXJ0IHVuZCBiKSB3ZXJkZW4gVGVhbW1pdGdsaWVkZXIgdm9uIG1pciBiZWkgZGllc2VtCisgICAgICAvLyBJbnNlcnRFbmVteSgpIGdnZi4gZXJmYXNzdC4KKyAgICAgIG9iLT5JbnNlcnRFbmVteShNRSk7CisKKyAgICAgIGlmICggY2xvc3VyZXAoY2IpICYmIGZ1bmNhbGwoY2Isb2IpICkgLy8gV2lyZCBnYW56ZXMgVGVhbSBnZW1vdmVkPworICAgICAgICBtaXNzaW5nX2F0dGFja3MgKz0gKHsgb2IgfSk7IC8vIERhbm4gZXJzdG1hbCB3YXJ0ZW4gYmlzIGFsbGUgZGEgc2luZAorICAgICAgZWxzZQorICAgICAgICBvYi0+QXR0YWNrMihNRSk7CisKKyAgICB9CisgICAgZWxzZSBpZiAoIElzRW5lbXkob2IpICkKKyAgICB7CisgICAgICAvLyBEYXMgaXN0IG5pY2h0IHNvIHNpbm5sb3Mgd2llIGVzIGF1c3NpZWh0LiBhKSB3ZXJkZW4gZGllIEh1bnR0aW1lcworICAgICAgLy8gYWt0dWFsaXNpZXJ0IHVuZCBiKSB3ZXJkZW4gVGVhbW1pdGdsaWVkZXIgdm9uIG9iIGJlaSBkaWVzZW0gCisgICAgICAvLyBJbnNlcnRFbmVteSgpIGdnZi4gZXJmYXNzdC4KKyAgICAgIEluc2VydEVuZW15KG9iKTsKKyAgICAgIEF0dGFjazIob2IpOworICAgIH0KKyAgICAvL0F0dGFjazIga2FubiBkaWVzZXMgT2JqZWt0IHplcnN0b2VyZW4gb2RlciB0b2V0ZW4uIFdlbm4gamE6IGFiYnJ1Y2gKKyAgICBpZiAoICFsaXZpbmcoTUUpIHx8IFF1ZXJ5UHJvcChQX0dIT1NUKSkgYnJlYWs7CisgIH0KK30KKworcHVibGljIHZvaWQgRXhpdEF0dGFjaygpCit7CisgIGlmICggIWxpdmluZyhNRSkgKQorICAgIHJldHVybjsKKworICAvLyBOb2NoIG5hY2h6dWhvbGVuZGUgQmVncnVlc3N1bmdzc2NobGFlZ2U6CisgIEV4ZWN1dGVNaXNzaW5nQXR0YWNrcygpOworfQorCitwdWJsaWMgb2JqZWN0fG9iamVjdCp8bWFwcGluZyBRdWVyeUFybW91ckJ5VHlwZShzdHJpbmcgdHlwZSkKK3sKKyAgLy8gUnVlY2tnYWJld2VydDoKKyAgLy8gRElFIFJ1ZXN0dW5nIHZvbSBUeXAgPHR5cGU+LCBmYWxscyA8dHlwZT4gbmljaHQgQVRfTUlTQywKKyAgLy8gQXJyYXkgYWxsZXIgQVRfTUlTQy1SdWVzdHVuZ2VuIGZhbGxzIDx0eXBlPiBBVF9NSVNDIChhdWNoIGxlZXIpLAorICAvLyBNYXBwaW5nIG1pdCBhbGxlbiBvYmVuIGdlbmFubnRlbiBJbmZvcywgZmFsbHMgPHR5cGU+IE51bGwKKworICBvYmplY3QgKmFybW91cnM7CisgIHN0cmluZyB0eXAyOworCisgIC8vIFdlbm4gQ2FjaGUgdm9yaGFuZGVuLCBkYW5uIENhY2hlIGxpZWZlcm4uCisgIGlmIChtYXBwaW5ncChRQUJUQ2FjaGUpKSB7CisgICAgaWYgKHR5cGUgPT0gQVRfTUlTQykKKyAgICAgIHJldHVybiBRQUJUQ2FjaGVbQVRfTUlTQ10gLSAoezB9KTsKKyAgICBlbHNlIGlmICh0eXBlKQorICAgICAgcmV0dXJuIFFBQlRDYWNoZVt0eXBlXTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gY29weShRQUJUQ2FjaGUpOworICB9CisKKyAgaWYgKCAhcG9pbnRlcnAoYXJtb3Vycz1RdWVyeVByb3AoUF9BUk1PVVJTKSkgKQorICAgIGFybW91cnM9KHt9KTsKKworICAvLyBDYWNoZSBlcnpldWdlbgorICBRQUJUQ2FjaGUgPSAoWyBBVF9NSVNDOiAoe30pIF0pOworICBmb3JlYWNoKG9iamVjdCBvYjogYXJtb3VycyAtICh7MH0pICkgeworICAgIGlmICggIXN0cmluZ3AodHlwMj1vYi0+UXVlcnlQcm9wKFBfQVJNT1VSX1RZUEUpKSApCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoIHR5cDI9PUFUX01JU0MgKQorICAgICAgUUFCVENhY2hlW0FUX01JU0NdICs9ICh7b2J9KTsKKyAgICBlbHNlCisgICAgICBRQUJUQ2FjaGVbdHlwMl0gPSBvYjsKKyAgfQorICAvLyBVbmQgZ2V3dWVuc2NodGVzIERhdHVtIGxpZWZlcm4uCisgIGlmICh0eXBlKQorICAgIHJldHVybiBRQUJUQ2FjaGVbdHlwZV07CisgIGVsc2UKKyAgICByZXR1cm4gY29weShRQUJUQ2FjaGUpOworfQorCisvL1RPRE86IGxhbmdmcmlzdGlnIHdhZXJzIGJlc3Nlciwgd2VubiBoaWVyIG5pY2h0IGplZGVyIHBlciBTZXRQcm9wKCkgZHJhdWYKKy8vbG9zIHNjaHJlaWJlbiB3dWVyZGUuCitzdGF0aWMgb2JqZWN0ICpfc2V0X2FybW91cnMob2JqZWN0ICphcm1vdXJzKSB7CisgIGlmIChwb2ludGVycChhcm1vdXJzKSkgeworICAgIC8vIENhY2hlIHdlZ3dlcmZlbgorICAgIFFBQlRDYWNoZSA9IDA7CisgICAgLy8gYXJtb3VycyBnZ2YuIHVuaWZpemllcmVuLiBBdXNzZXJkZW0gS29waWUgcmVpbnNjaHJlaWJlbi4KKyAgICByZXR1cm4gU2V0KFBfQVJNT1VSUywgbV9pbmRpY2VzKG1rbWFwcGluZyhhcm1vdXJzKSksIEZfVkFMVUUpOworICB9CisgIHJldHVybiBRdWVyeVByb3AoUF9BUk1PVVJTKTsKK30KKworLyoqIFJlZHV6aWVydCBkaWUgQmVmcmllZGV6YWVobGVyIHBybyBSZXNldCBpbSBEdXJjaHNjaG5pdHQgdW0gMi41LgorICBCZXJlY2huZXQgZ2FuenphaGxpZ2UgZHVyY2hzY2huaXR0bGljaGUgUmVzZXRzIHNlaXQgZGVtIGxldHp0ZW4gRXhwaXJlIHVuZAorICBlcmhvZWh0IGRpZSBsZXR6dGUgRXhwaXJlemVpdCB1bSBSZXNldHMqX19SRVNFVF9USU1FX18gKFN0YW5kYXJkIEludGVydmFsbAorICBmdWVyIFJlc2V0IGlzdCBtb21lbnRhbiAzNjAwcywgaW0gRHVyY2hzY2huaXR0IGtvbW1lbiBkYW5uIDI3MDAgendpc2NoZW4gMgorICBSZXNldHMgYmVpIHJhdXMpLiBTbyB3aXJkIGRlciB1bmdhbnp6YWhsaWdlIFJlc3QgYmVpbSBuYWVjaHN0ZW4gQXVmcnVmCisgIGJlcnVlY2tzaWNodGlndC4KKyAgRGllc2UgVmFyaWFudGUgZGVzIEV4cGlyZXMgd3VyZGUgZ2V3YWVobHQsIHVtIHp1IHZlcm1laWRlbiwgY29tYmF0LmMgZWluZW4KKyAgcmVzZXQoKSB6dSBnZWJlbiB1bmQgaW4gamVkZW0gUmVzZXQgaW4gamVkZW0gTGViZXdlc2VuIGVpbiBFeHBpcmUgbWFjaGVuIHp1CisgIG11ZXNzZW4sIGF1Y2ggd2VubiBudXIgaW4gc2VociB3ZW5pZ2VuIExlYmV3ZXNlbiB3YXMgZ2VtYWNodCB3ZXJkZW4gbXVzcy4KKyAgQHBhcmFtW2luLG91dF0gcGggTWFwcGluZyBhdXMgUF9QRUFDRV9ISVNUT1JZLiBXaXJkIGRpcmVrdCBha3R1YWxpc2llcnQuCisgIEBhdHRlbnRpb24gTXVzcyBlaW4gZ3VlbHRpZ2VzIFBfUEVBQ0VfSElTVE9SWSB1ZWJlcmdlYmVuIGJla29tbWVuLCBhbmRlcmVtCisgIERhdGVudHlwIGlua2wuIDAgd2lyZCBkaWUgRnVua3Rpb24gYnVnZ2VuLgorICAqLworcHJpdmF0ZSB2b2lkIF9kZWNheV9wZWFjZV9oaXN0b3J5KG1peGVkIHBoKSB7CisgIC8vIEdhbnp6YWhsaWdlIHJlc2V0cyBzZWl0IGxldHp0ZW0gRXhwaXJlIGVybWl0dGVsbi4gKER1cmNoc2Nobml0dCkKKyAgaW50IHJlc2V0cyA9ICh0aW1lKCkgLSBwaFswXSkgLyAoX19SRVNFVF9USU1FX18qNzUvMTAwKTsKKyAgLy8gYXVmIFplaXRzdGVtcGVsIGRyYXVmcmVjaG5lbiwgZGFtaXQgZGVyIHVuZ2FuenphaGxpZ2UgUmVzdCBuaWNodAorICAvLyB2ZXJsb3JlbmdlaHQsIGRlciB3aXJkIGJlaW0gbmFlY2hzdGVuIEV4cGlyZSBkYW5uIGJlcnVlY2tzaWNodGlndC4KKyAgcGhbMF0gKz0gcmVzZXRzICogKF9fUkVTRVRfVElNRV9fICogNzUgLyAxMDApOworICAvLyBwcm8gUmVzZXQgd2VyZGVuIGltIER1cmNoc2Nobml0dCAyLjUgVmVyc3VjaGUgYWJnZXpvZ2VuLiAoSGllciB3ZXJkZW4KKyAgLy8gYmVpbSBFeHBpcmUgbWFsIDIgdW5kIG1hbCAzIFZlcnN1Y2hlIHBybyBSZXNldCBnZXJlY2huZXQuIEFiZXIgZmFsbHMgaGllcgorICAvLyB2aWVsZSBSZXNldHMgdmVyZ2FuZ2VuIHNpbmQsIGlzdCBlcyB2ZXJtdXRsaWNoIGVoIGVnYWwsIHdlaWwgZGllIENvdW50ZXIKKyAgLy8gYXVmIDAgZmFsbGVuLikKKyAgaW50IGV4cGlyZSA9IHJlc2V0cyAqIChyYW5kb20oMikgKyAyKTsKKyAgLy8gdWViZXIgYWxsZSBHaWxkZW4KKyAgbWFwcGluZyB0bXA9cGhbMV07CisgIGZvcmVhY2goc3RyaW5nIGtleSwgaW50IGNvdW50OiAmdG1wICkgeworICAgIGNvdW50LT1leHBpcmU7CisgICAgaWYgKGNvdW50IDwgMCkgY291bnQgPSAwOworICB9Cit9CisKKy8qKiBQYWNpZnkoKSBkaWVudCB6dXIgQmVzdGltbXVuZywgb2Igc2ljaCBlaW4gTGViZXdlc2VuIGdlcmFkZSAKKyAqIGJlZnJpZWRlbiBsYXNzZW4gd2lsbC4KKyAqIEJlcmVjaG5ldCBlaW5lIFdhaHJzY2hlaW5saWNoa2VpdCBuYWNoIHVudGVuIHN0ZWhlbmRlciBGb3JtZWwsIHdlbGNoZSBkaWUKKyAqIEludGVsbGlnZW56IGRpZXNlcyBMZWJlbndlc2VucywgZGllIEludGVsbGlnZW56IGRlcyBDYXN0ZXJzIHVuZCBkaWUKKyAqIGJpc2hlcmlnZSBBbnphaGwgZXJmb2xncmVpY2hlciBCZWZyaWVkdW5nc3ZlcnN1Y2hlIGRpZXNlciBHaWxkZSBlaW5nZWh0LgorICogQW5zY2hsaWVzc2VuZCB3aXJkIGF1cyBkZXIgV2FocnNjaGVpbmxpY2hrZWl0IHVuZCByYW5kb20oKSBiZXN0aW1tdCwgb2IKKyAqIGRpZXNlciBWZXJzdWNoIGVyZm9sZ3JlaWNoIGlzdC4KK0Zvcm1lbDogdyA9IChJTlRfQ0FTVEVSICsgMTAgLSBBTloqNCkgLyAoSU5UX01FICsgMTApCitJTlRfQ0FTVEVSOiBDYXN0ZXItSW50ZWxsaWdlbnosIElOVF9NRTogSW50ZWxsaWdlbnogZGllc2VzIExpdmluZ3MKK0FOWjogQW56YWhsIGVyZm9sZ3JlaWNoZXIgQmVmcmllZHVuZ3N2ZXJzdWNoZQorCitBbm5haG1lOiBJTlRfQ0FTVEVSID09PSAyMiwgYWxsZSBXYWhyc2NoZWlubGljaGtlaXRlbiAqIDEwMAorCitJTlRfTUUgICBFcmZvbGdzd2FocnNjaGVpbmxpY2hrZWl0ZW4gamUgbmFjaCBBbnphaGwgZXJmb2xncmVpY2hlciBWZXJzdWNoZQorICAgICAgICAgICAgICAxICAgICAgIDIgICAgICAgMyAgICAgICA0ICAgICAgIDUgICAgICAgNiAgICAgICA3ICAgICAgIDgKKyAgICAgIDAgICAgIDI4MCAgICAgMjQwICAgICAyMDAgICAgIDE2MCAgICAgMTIwICAgICAgODAgICAgICA0MCAgICAgICAwCisgICAgICAyICAyMzMsMzMgICAgIDIwMCAgMTY2LDY3ICAxMzMsMzMgICAgIDEwMCAgIDY2LDY3ICAgMzMsMzMgICAgICAgMAorICAgICAgNCAgICAgMjAwICAxNzEsNDMgIDE0Miw4NiAgMTE0LDI5ICAgODUsNzEgICA1NywxNCAgIDI4LDU3ICAgICAgIDAKKyAgICAgIDYgICAgIDE3NSAgICAgMTUwICAgICAxMjUgICAgIDEwMCAgICAgIDc1ICAgICAgNTAgICAgICAyNSAgICAgICAwCisgICAgICA4ICAxNTUsNTYgIDEzMywzMyAgMTExLDExICAgODgsODkgICA2Niw2NyAgIDQ0LDQ0ICAgMjIsMjIgICAgICAgMAorICAgICAxMCAgICAgMTQwICAgICAxMjAgICAgIDEwMCAgICAgIDgwICAgICAgNjAgICAgICA0MCAgICAgIDIwICAgICAgIDAKKyAgICAgMTIgIDEyNywyNyAgMTA5LDA5ICAgOTAsOTEgICA3Miw3MyAgIDU0LDU1ICAgMzYsMzYgICAxOCwxOCAgICAgICAwCisgICAgIDE0ICAxMTYsNjcgICAgIDEwMCAgIDgzLDMzICAgNjYsNjcgICAgICA1MCAgIDMzLDMzICAgMTYsNjcgICAgICAgMAorICAgICAxNiAgMTA3LDY5ICAgOTIsMzEgICA3Niw5MiAgIDYxLDU0ICAgNDYsMTUgICAzMCw3NyAgIDE1LDM4ICAgICAgIDAKKyAgICAgMTggICAgIDEwMCAgIDg1LDcxICAgNzEsNDMgICA1NywxNCAgIDQyLDg2ICAgMjgsNTcgICAxNCwyOSAgICAgICAwCisgICAgIDIwICAgOTMsMzMgICAgICA4MCAgIDY2LDY3ICAgNTMsMzMgICAgICA0MCAgIDI2LDY3ICAgMTMsMzMgICAgICAgMAorICAgICAyMiAgICA4Nyw1ICAgICAgNzUgICAgNjIsNSAgICAgIDUwICAgIDM3LDUgICAgICAyNSAgICAxMiw1ICAgICAgIDAKKyAgICAgMjQgICA4MiwzNSAgIDcwLDU5ICAgNTgsODIgICA0NywwNiAgIDM1LDI5ICAgMjMsNTMgICAxMSw3NiAgICAgICAwCisgICAgIDI2ICAgNzcsNzggICA2Niw2NyAgIDU1LDU2ICAgNDQsNDQgICAzMywzMyAgIDIyLDIyICAgMTEsMTEgICAgICAgMAorICAgICAyOCAgIDczLDY4ICAgNjMsMTYgICA1Miw2MyAgIDQyLDExICAgMzEsNTggICAyMSwwNSAgIDEwLDUzICAgICAgIDAKKyAgICAgMzAgICAgICA3MCAgICAgIDYwICAgICAgNTAgICAgICA0MCAgICAgIDMwICAgICAgMjAgICAgICAxMCAgICAgICAwCisgICAgIDMyICAgNjYsNjcgICA1NywxNCAgIDQ3LDYyICAgIDM4LDEgICAyOCw1NyAgIDE5LDA1ICAgIDksNTIgICAgICAgMAorICAgICAzNCAgIDYzLDY0ICAgNTQsNTUgICA0NSw0NSAgIDM2LDM2ICAgMjcsMjcgICAxOCwxOCAgICA5LDA5ICAgICAgIDAKKyAgICAgMzUgICA2MiwyMiAgIDUzLDMzICAgNDQsNDQgICAzNSw1NiAgIDI2LDY3ICAgMTcsNzggICAgOCw4OSAgICAgICAwCisgICAgIDM2ICAgNjAsODcgICA1MiwxNyAgIDQzLDQ4ICAgMzQsNzggICAyNiwwOSAgIDE3LDM5ICAgICA4LDcgICAgICAgMAorICAgICAzOCAgIDU4LDMzICAgICAgNTAgICA0MSw2NyAgIDMzLDMzICAgICAgMjUgICAxNiw2NyAgICA4LDMzICAgICAgIDAKKyAgICAgNDAgICAgICA1NiAgICAgIDQ4ICAgICAgNDAgICAgICAzMiAgICAgIDI0ICAgICAgMTYgICAgICAgOCAgICAgICAwCisgICAgIDQyICAgNTMsODUgICA0NiwxNSAgIDM4LDQ2ICAgMzAsNzcgICAyMywwOCAgIDE1LDM4ICAgIDcsNjkgICAgICAgMAorICAgICA0NCAgIDUxLDg1ICAgNDQsNDQgICAzNywwNCAgIDI5LDYzICAgMjIsMjIgICAxNCw4MSAgICA3LDQxICAgICAgIDAKKyAgICAgNDYgICAgICA1MCAgIDQyLDg2ICAgMzUsNzEgICAyOCw1NyAgIDIxLDQzICAgMTQsMjkgICAgNywxNCAgICAgICAwCisgICAgIDQ4ICAgNDgsMjggICA0MSwzOCAgIDM0LDQ4ICAgMjcsNTkgICAyMCw2OSAgIDEzLDc5ICAgICA2LDkgICAgICAgMAorICAgICA1MCAgIDQ2LDY3ICAgICAgNDAgICAzMywzMyAgIDI2LDY3ICAgICAgMjAgICAxMywzMyAgICA2LDY3ICAgICAgIDAKKyAgICAgNTIgICA0NSwxNiAgIDM4LDcxICAgMzIsMjYgICAyNSw4MSAgIDE5LDM1ICAgIDEyLDkgICAgNiw0NSAgICAgICAwCisgICAgIDU0ICAgNDMsNzUgICAgMzcsNSAgIDMxLDI1ICAgICAgMjUgICAxOCw3NSAgICAxMiw1ICAgIDYsMjUgICAgICAgMAorICAgICA1NiAgIDQyLDQyICAgMzYsMzYgICAgMzAsMyAgIDI0LDI0ICAgMTgsMTggICAxMiwxMiAgICA2LDA2ICAgICAgIDAKKyAgICAgNTggICA0MSwxOCAgIDM1LDI5ICAgMjksNDEgICAyMyw1MyAgIDE3LDY1ICAgMTEsNzYgICAgNSw4OCAgICAgICAwCisgICAgIDYwICAgICAgNDAgICAzNCwyOSAgIDI4LDU3ICAgMjIsODYgICAxNywxNCAgIDExLDQzICAgIDUsNzEgICAgICAgMAorICAgICA2MiAgIDM4LDg5ICAgMzMsMzMgICAyNyw3OCAgIDIyLDIyICAgMTYsNjcgICAxMSwxMSAgICA1LDU2ICAgICAgIDAKKyAgICAgNjQgICAzNyw4NCAgIDMyLDQzICAgMjcsMDMgICAyMSw2MiAgIDE2LDIyICAgMTAsODEgICAgNSw0MSAgICAgICAwCisgICAgIDY2ICAgMzYsODQgICAzMSw1OCAgIDI2LDMyICAgMjEsMDUgICAxNSw3OSAgIDEwLDUzICAgIDUsMjYgICAgICAgMAorICAgICA2OCAgICAzNSw5ICAgMzAsNzcgICAyNSw2NCAgIDIwLDUxICAgMTUsMzggICAxMCwyNiAgICA1LDEzICAgICAgIDAKKyAgICAgNzAgICAgICAzNSAgICAgIDMwICAgICAgMjUgICAgICAyMCAgICAgIDE1ICAgICAgMTAgICAgICAgNSAgICAgICAwCisgICAgIDcyICAgMzQsMTUgICAyOSwyNyAgIDI0LDM5ICAgMTksNTEgICAxNCw2MyAgICA5LDc2ICAgIDQsODggICAgICAgMAorICAgICA3NCAgIDMzLDMzICAgMjgsNTcgICAyMyw4MSAgIDE5LDA1ICAgMTQsMjkgICAgOSw1MiAgICA0LDc2ICAgICAgIDAKKyAgICAgNzYgICAzMiw1NiAgIDI3LDkxICAgMjMsMjYgICAgMTgsNiAgIDEzLDk1ICAgICA5LDMgICAgNCw2NSAgICAgICAwCisgICAgIDc4ICAgMzEsODIgICAyNywyNyAgIDIyLDczICAgMTgsMTggICAxMyw2NCAgICA5LDA5ICAgIDQsNTUgICAgICAgMAorICAgICA4MCAgIDMxLDExICAgMjYsNjcgICAyMiwyMiAgIDE3LDc4ICAgMTMsMzMgICAgOCw4OSAgICA0LDQ0ICAgICAgIDAKKyAgICAgODIgICAzMCw0MyAgIDI2LDA5ICAgMjEsNzQgICAxNywzOSAgIDEzLDA0ICAgICA4LDcgICAgNCwzNSAgICAgICAwCisgICAgIDg0ICAgMjksNzkgICAyNSw1MyAgIDIxLDI4ICAgMTcsMDIgICAxMiw3NyAgICA4LDUxICAgIDQsMjYgICAgICAgMAorICAgICA4NiAgIDI5LDE3ICAgICAgMjUgICAyMCw4MyAgIDE2LDY3ICAgIDEyLDUgICAgOCwzMyAgICA0LDE3ICAgICAgIDAKKyAgICAgODggICAyOCw1NyAgIDI0LDQ5ICAgMjAsNDEgICAxNiwzMyAgIDEyLDI0ICAgIDgsMTYgICAgNCwwOCAgICAgICAwCisgICAgIDkwICAgICAgMjggICAgICAyNCAgICAgIDIwICAgICAgMTYgICAgICAxMiAgICAgICA4ICAgICAgIDQgICAgICAgMAorICAgICA5MiAgIDI3LDQ1ICAgMjMsNTMgICAxOSw2MSAgIDE1LDY5ICAgMTEsNzYgICAgNyw4NCAgICAzLDkyICAgICAgIDAKKyAgICAgOTQgICAyNiw5MiAgIDIzLDA4ICAgMTksMjMgICAxNSwzOCAgIDExLDU0ICAgIDcsNjkgICAgMyw4NSAgICAgICAwCisgICAgIDk2ICAgMjYsNDIgICAyMiw2NCAgIDE4LDg3ICAgMTUsMDkgICAxMSwzMiAgICA3LDU1ICAgIDMsNzcgICAgICAgMAorICAgICA5OCAgIDI1LDkzICAgMjIsMjIgICAxOCw1MiAgIDE0LDgxICAgMTEsMTEgICAgNyw0MSAgICAgMyw3ICAgICAgIDAKKyAgICAxMDAgICAyNSw0NSAgIDIxLDgyICAgMTgsMTggICAxNCw1NSAgIDEwLDkxICAgIDcsMjcgICAgMyw2NCAgICAgICAwCisgKiBAcmV0dXJuIDEsIGZhbGxzIEJlZnJpZWRlbiBlcmxhdWJ0IGlzdCwgMCBzb25zdC4KKyAqIEBwYXJhbVtpbl0gY2FzdGVyIERlcmplbmlnZSwgZGVyIGRlbiBTcHJ1Y2ggYXVzZnVlaHJ0LgorICogQGF0dGVudGlvbiBXZW5uIGFjaWZ5KCkgMSB6dXJ1ZWNrbGllZmVydCwgemFlaGx0IGRpZXMgYWxzCisgKiBlcmZvbGdyZWljaGVyIEJlZnJpZWR1bmdzdmVyc3VjaCB1bmQgaW4gZGllc2VtIExlYmV3ZXNlbiB3dXJkZQorICogU3RvcEh1bnRpbmdNb2RlKDEpIGF1ZmdlcnVmZW4uCisqLworcHVibGljIGludCBQYWNpZnkob2JqZWN0IGNhc3RlcikgeworICAKKyAgLy8gd2VubiBkYXMgVmllY2gga2VpbmUgR2VnbmVyIGhhdCwgZGFubiB3aXR6bG9zLiA7LSkgT2huZSBDYXN0ZXIgZ2VodHMgYXVjaAorICAvLyBkaXJla3QgcmF1cy4KKyAgaWYgKCFtYXBwaW5ncChlbmVtaWVzKSB8fCAhc2l6ZW9mKGVuZW1pZXMpCisgICAgICB8fCAhb2JqZWN0cChjYXN0ZXIpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLyBXZW5uIFBfQUNDRVBUX1BFQUNFIGdlc2V0enQgaXN0LCBhbHRlcyBWZXJoYWx0ZW4gd2llZGVyc3BpZWdlbG4KKyAgLy8gLT4gZGVyIE5QQyBpc3QgZWluZmFjaCBpbW1lciBiZWZyaWVkYmFyLiBHbGVpY2hlcyBnaWx0IGZ1ZXIgZGVuIENhc3RlcgorICAvLyBzZWxiZXIsIGRlciB3aXJkIHNpY2ggamEgbmljaHQgZ2VnZW4gZGFzIGVpZ2VuZSBCZWZyaWVkZSB3ZWhyZW4uIFVuZCBhdWNoCisgIC8vIGltIHRlYW0gd2VocnQgbWFuIHNpY2ggbmljaHQgZ2VnZW4gZGFzIEJlZnJpZWRlIGVpbmVzIFRlYW1rb2xsZWdlbgorICBpZiAoUXVlcnlQcm9wKFBfQUNDRVBUX1BFQUNFKT09MSB8fCBjYXN0ZXI9PU1FCisgICAgICB8fCBtZW1iZXIoVGVhbU1lbWJlcnMoKSwgY2FzdGVyKSA+IC0xKSB7CisgICAgU3RvcEh1bnRpbmdNb2RlKDEpOyAvLyBDYXN0ZXIvR2lsZGUgc29sbHRlIGVpZ2VuZSBNZWxkdW5nIGF1c2dlYmVuCisgICAgcmV0dXJuIDE7CisgIH0KKworICBzdHJpbmcgZ2lsZGUgPSBjYXN0ZXItPlF1ZXJ5UHJvcChQX0dVSUxEKSB8fCAiQU5ZIjsKKworICAvLyBnZ2YuIFBfUEVBQ0VfSElTVE9SWSBpbml0aWFsaXNpZXJlbgorICBtaXhlZCBwaCA9IChtaXhlZClRdWVyeVByb3AoUF9QRUFDRV9ISVNUT1JZKTsKKyAgaWYgKCFwb2ludGVycChwaCkpCisgICAgU2V0UHJvcChQX1BFQUNFX0hJU1RPUlksIHBoPSh7dGltZSgpLCAoW10pIH0pICk7CisgIAorICAvLyBnZ2YuIGRpZSBaYWVobGVyIHJlZHV6aWVyZW4uCisgIGlmICggcGhbMF0gKyBfX1JFU0VUX1RJTUVfXyAqIDc1LzEwMCA8IHRpbWUoKSkgeworICAgIF9kZWNheV9wZWFjZV9oaXN0b3J5KCZwaCk7CisgIH0KKyAgCisgIGZsb2F0IHcgPSAoY2FzdGVyLT5RdWVyeUF0dHJpYnV0ZShBX0lOVCkgKyAxMCAtIHBoWzFdW2dpbGRlXSAqIDQuMCkgLyAKKyAgICAgICAgICAgICAoUXVlcnlBdHRyaWJ1dGUoQV9JTlQpICsgMTApOworICAvLyBhdWYgWzAsMV0gYmVncmVuemVuLgorICBpZiAodzwwKSB3PTAuMDsKKyAgZWxzZSBpZiAodz4xKSB3PTEuMDsKKyAgLy8gdyAqIG4gaXN0IGVpbmUgWmFobCB6d2lzY2hlbiAwIHVuZCBuLCB3ZW5uIHcgKiBuID4gcmFuZG9tKG4pKzEsCisgIC8vIGRhcmYgYmVmcmllZGV0IHdlcmRlbi4gRGEgZGFzIFJhbmRvbSBmdWVyIGdyb3NzZSBaYWhsZW4KKyAgLy8gYmVzc2VyIHZlcnRlaWx0IGlzdCwgbmVobSBpY2ggbiA9IF9fSU5UX01BWF9fIHVuZCB2ZXJuYWNobGFlc3NpZ2UKKyAgLy8gYXVzc2VyZGVtIGRpZSArMSBiZWltIHJhbmRvbSgpLgorICBpZiAoY2VpbCh3ICogX19JTlRfTUFYX18pID4gcmFuZG9tKF9fSU5UX01BWF9fKSApIHsKKyAgICBwaFsxXVtnaWxkZV0rKzsKKyAgICBTdG9wSHVudGluZ01vZGUoMSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgLy8gZWluIFNldFByb3AoUF9QRUFDRV9ISVNUT1JZKSBrYW5uIGVudGZhbGxlbiwgZGEgZGFzIE1hcHBpbmcgZGlyZWt0CisgIC8vIGdlYWVuZGVydCB3aXJkLiBTb2xsdGUgZGllIFByb3AgYWxsZXJkaW5ncyBtYWwgbmUgUXVlcnltZXRob2RlIGhhYmVuLAorICAvLyB3ZWxjaGUgZWluZSBLb3BpZSBkYXZvbiBsaWVmZXJ0LCBtdXNzIGRhcyBoaWVyIGdlYWVuZGVydCBvZGVyIGRpZQorICAvLyBQcm9wIHBlciBRdWVyeSgpIGFiZ2VmcmFndCB3ZXJkZW4uCisgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9zdGQvbGl2aW5nL2NvbW0uYyBiL3N0ZC9saXZpbmcvY29tbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMDFmZmQKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvbGl2aW5nL2NvbW0uYwpAQCAtMCwwICsxLDEzMyBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGxpdmluZy9jb21tLmMgLS0gY29tbXVuaWN0aW9uIG1vZHVsZSBmb3IgbGl2aW5ncworLy8KKy8vICRJZCQKKworI3ByYWdtYSBzdHJvbmdfdHlwZXMsc2F2ZV90eXBlcworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworI3ByYWdtYSByYW5nZV9jaGVjaworCisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPGxpdmluZy9jb21tLmg+CisKK3ZvaWQgY3JlYXRlX3N1cGVyKCkKK3sKKyAgc2V0X25leHRfcmVzZXQoLTEpOworfQorCitwcm90ZWN0ZWQgc3RyaW5nIGNvbW1fZ3Vlc3NfYWN0aW9uKCkgeworICBzdHJpbmcgY21kOworICBzdHJpbmcgYWN0aW9uID0gcXVlcnlfdmVyYigpOworICAvLyBEaWUgQWt0aW9uZW4gc2luZCBpbnRlcm4gaW4gZGVyIFJlZ2VsIG5hY2ggZGVuIGhhZXVmaWdzdGVuIEtvbW1hbmRvdmVyYmVuCisgIC8vIGRpZXNlciBBa3Rpb24gYmVuYW5udC4gQmVpIGVpbmlnZW4gQWt0aW9uZW4gc2luZCBtZWhyZXJlIEtvbW1hbmRvdmVyYmVuCisgIC8vIHVlYmxpY2gsIGRpZSBzb2xsZW4gaGllciBub2NoIGFiZ2VoYW5kZWx0IHdlcmRlbi4KKyAgc3dpdGNoKGFjdGlvbikgeworICAgIGNhc2UgIm5laG1lIjoKKyAgICAgIC8vIE1BX1RBS0UgPT0gbmltbQorICAgICAgYWN0aW9uID0gTUFfVEFLRTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAibm9yZGVuIjoKKyAgICBjYXNlICJub3Jkb3N0ZW4iOgorICAgIGNhc2UgIm9zdGVuIjoKKyAgICBjYXNlICJzdWVkb3N0ZW4iOgorICAgIGNhc2UgInN1ZWRlbiI6CisgICAgY2FzZSAic3VlZHdlc3RlbiI6CisgICAgY2FzZSAid2VzdGVuIjoKKyAgICBjYXNlICJub3Jkd2VzdGVuIjoKKyAgICBjYXNlICJvYmVuIjoKKyAgICBjYXNlICJ1bnRlbiI6CisgICAgY2FzZSAiYmV0cmV0ZSI6CisgICAgY2FzZSAidmVybGFzc2UiOgorICAgIGNhc2UgInRlbGVwb3J0IjoKKyAgICBjYXNlICJ0ZWxlcG9ydGllcmUiOgorICAgICAgYWN0aW9uID0gTUFfTU9WRTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAidW50IjoKKyAgICAgIGFjdGlvbiA9IE1BX0xPT0s7CisgICAgICBicmVhazsKKworICAgIGNhc2UgIndpcmYiOgorICAgICAgaWYgKHN0cnN0cihxdWVyeV9jb21tYW5kKCksICIgd2VnIikgPiAtMSkKKyAgICAgICAgYWN0aW9uID0gTUFfUFVUOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICJzdGVja2UiOgorICAgICAgY21kID0gcXVlcnlfY29tbWFuZCgpOworICAgICAgaWYgKHN0cnN0cihjbWQsICIgd2VnIikgPiAtMSkKKyAgICAgICAgYWN0aW9uID0gTUFfVU5XSUVMRDsKKyAgICAgIGVsc2UgaWYgKHN0cnN0cihjbWQsIiBpbiAiKSA+IC0xKQorICAgICAgICBhY3Rpb24gPSBNQV9QVVQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgInppZWhlIjoKKyAgICAgIGNtZCA9IHF1ZXJ5X2NvbW1hbmQoKTsKKyAgICAgIGlmIChzdHJzdHIoY21kLCAiIGFuIikgPiAtMSkKKyAgICAgICAgYWN0aW9uID0gTUFfV0VBUjsKKyAgICAgIGVsc2UgaWYgKHN0cnN0cihjbWQsICIgYXVzIikgPiAtMSkKKyAgICAgICAgYWN0aW9uID0gTUFfVU5XRUFSOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICJlc3NlIjoKKyAgICBjYXNlICJmcmlzcyI6CisgICAgICBhY3Rpb24gPSBNQV9FQVQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgInNhdWZlIjoKKyAgICAgIGFjdGlvbiA9IE1BX0RSSU5LOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICJob2VyZSI6CisgICAgICAvL01BX0xJU1RFTiA9PSBsYXVzY2hlCisgICAgICBhY3Rpb24gPSBNQV9MSVNURU47CisgICAgICBicmVhazsKKyAgICBjYXNlICJsZXNlIjoKKyAgICAgIGFjdGlvbiA9IE1BX1JFQUQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgIjoiOgorICAgIGNhc2UgIjsiOgorICAgICAgYWN0aW9uID0gTUFfRU1PVEU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgInplcmJyZWNoZSI6CisgICAgY2FzZSAiemVyc3RvZXJlIjoKKyAgICBjYXNlICJ2ZXJicmVubmUiOgorICAgIGNhc2UgImVudHNvcmdlIjoKKyAgICAgIGFjdGlvbiA9IE1BX1JFTU9WRTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBhY3Rpb247Cit9CisKK3Byb3RlY3RlZCBpbnQgY29tbV9ndWVzc19tZXNzYWdlX3R5cGUoc3RyaW5nIGFjdGlvbiwgbWl4ZWQgb3JpZ2luKSB7CisgIC8vIGV2ZXJ5dGhpbmcgbm90IG1lbnRpb25lZCBpbiB0aGUgc3dpdGNoIGJlY29tZXMgTVRfTE9PSy4KKyAgc3dpdGNoKGFjdGlvbikgeworICAgIGNhc2UgTUFfRklHSFQ6CisgICAgICAvLyBLYW1wZiBrYW5uIG1hbiBtZWlzdGVuIHNvd29obCBzZWhlbiBhbHMgYXVjaCBob2VyZW4uCisgICAgICByZXR1cm4gTVRfTE9PSyB8IE1UX0xJU1RFTjsKKyAgICBjYXNlIE1BX0xJU1RFTjoKKyAgICBjYXNlIE1BX1NBWToKKyAgICAgIHJldHVybiBNVF9MSVNURU47CisgICAgY2FzZSBNQV9GRUVMOgorICAgICAgcmV0dXJuIE1UX0ZFRUw7CisgICAgY2FzZSBNQV9TTUVMTDoKKyAgICAgIHJldHVybiBNVF9TTUVMTDsKKyAgICBjYXNlIE1BX0NIQU5ORUw6CisgICAgICByZXR1cm4gTVRfQ09NTSB8IE1UX0ZBUjsKKyAgICBjYXNlIE1BX0VNT1RFOgorICAgICAgaWYgKG9iamVjdHAob3JpZ2luKQorICAgICAgICAgICYmIGVudmlyb25tZW50KG9yaWdpbikgPT0gZW52aXJvbm1lbnQoKSkKKyAgICAgICAgcmV0dXJuIE1UX0NPTU07CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBNVF9DT01NIHwgTVRfRkFSOworICAgIGNhc2UgTUFfU0hPVVQ6CisgICAgICByZXR1cm4gTVRfTElTVEVOIHwgTVRfRkFSOworICB9CisgIC8vIGRpZSBtZWlzdGVuIEFrdGlvbmVuIHNpbmQgenVtaW5kZXN0IHNpY2h0YmFyLi4uCisgIHJldHVybiBNVF9MT09LOworfQorCmRpZmYgLS1naXQgYS9zdGQvbGl2aW5nL2Rlc2NyaXB0aW9uLmMgYi9zdGQvbGl2aW5nL2Rlc2NyaXB0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM1M2NhOQotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9saXZpbmcvZGVzY3JpcHRpb24uYwpAQCAtMCwwICsxLDMzMiBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGxpdmluZy9kZXNjcmlwdGlvbi5jIC0tIGRlc2NyaXB0aW9uIGZvciBsaXZpbmcgb2JqZWN0cworLy8KKy8vICRJZDogZGVzY3JpcHRpb24uYyA5Mzk1IDIwMTUtMTItMDggMjM6MDQ6MzhaIFplc3N0cmEgJAorI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCitpbmhlcml0ICIvc3RkL2NvbnRhaW5lci9kZXNjcmlwdGlvbiI7CisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisKKyNpbmNsdWRlIDxsaXZpbmcvc2tpbGxzLmg+CisjaW5jbHVkZSA8bGl2aW5nL2Nsb3RoaW5nLmg+CisjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPG5ld19za2lsbHMuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8Y2xhc3MuaD4KKyNpbmNsdWRlIDxzeXNfZGVidWcuaD4KKworcHVibGljIHN0cmluZyBfcXVlcnlfaW50ZXJuYWxfZXh0cmFsb29rKCkgeworICBtaXhlZCB4bDsKKyAgaW50IHplaXQ7CisgIHN0cmluZyByZXMsIGxvb2s9IiI7CisKKyAgeGw9UXVlcnkoUF9JTlRFUk5BTF9FWFRSQV9MT09LLEZfVkFMVUUpOworICBpZiAoIW1hcHBpbmdwKHhsKSkKKyAgICByZXR1cm4oMCk7CisKKyAgZm9yZWFjaChzdHJpbmcga2V5LCBtYXBwaW5nIHhsZDogeGwpIHsKKyAgICBpZiAoaW50cCh6ZWl0PXhsZFsieGxkdXJhdGlvbiJdKSkgeworICAgICAgLy9oYXQgb2ZmZW5iYXIgbmVuIEFibGF1ZmRhdHVtCisgICAgICBpZiAoICh6ZWl0ID4gMCAmJiB6ZWl0IDwgdGltZSgpKSB8fAorICAgICAgICAgICAoemVpdCA8IDAgJiYgYWJzKHplaXQpIDwgb2JqZWN0X3RpbWUoTUUpKSApIHsKKyAgICAgICAgLy8gWmVpdCBhYmdlbGF1ZmVuIG9kZXIKKyAgICAgICAgLy8gbmVnYXRpdmUgIkFibGF1ZnplaXQiIHVuZCBkYXMgT2JqZWt0IGlzdCBuZXVlciBhbHMgZGllCisgICAgICAgIC8vIEVpbnRyYWd6ZWl0LCBhbHNvIGxvZXNjaGVuIHVuZCB3ZWl0ZXIgKGphLCBkYXMgZ2VodC4gOy0pIHVuZCB4bGQKKyAgICAgICAgLy8gaGF0IGRhcyBFaW50cmFnc21hcHBpbmcgamEgbm9jaCwgd2VpdGVyZSBCZW51dHp1bmcgYWxzbyBtb2VnbGljaC4pCisgICAgICAgIG1fZGVsZXRlKHhsLGtleSk7CisgICAgICAgIC8vIGdnZi4gTWVsZHVuZyBhdXNnZWJlbgorICAgICAgICBpZiAoaW50ZXJhY3RpdmUoTUUpKSB7CisgICAgICAgICAgaWYgKHNpemVvZih4bGRbInhsZW5kZSJdKSkgeworICAgICAgICAgICAgdGVsbF9vYmplY3QoTUUseGxkWyJ4bGVuZGUiXSk7CisgICAgICAgICAgfQorICAgICAgICAgIC8va2VpbiBlaW5mYWNoZXIgU3RyaW5nLCBhYmVyIE9iamVrdCtGdW5rdGlvbiBnZWdlYmVuPworICAgICAgICAgIGVsc2UgaWYgKHNpemVvZih4bGRbInhsZW5kZWZ1biJdKSAmJiBzaXplb2YoeGxkWyJ4bG9iamVjdG5hbWUiXSkgJiYKKyAgICAgICAgICAgICghY2F0Y2gocmVzPWNhbGxfb3RoZXIoeGxkWyJ4bG9iamVjdG5hbWUiXSx4bGRbInhsZW5kZWZ1biJdLE1FKQorICAgICAgICAgICAgICAgICAgICA7cHVibGlzaCkpKSB7CisgICAgICAgICAgICAgIGlmIChzdHJpbmdwKHJlcykgJiYgc2l6ZW9mKHJlcykpCisgICAgICAgICAgICAgICAgdGVsbF9vYmplY3QoTUUscmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gRGVyIEVpbnRyYWcgaXN0IG9mZmVuYmFyIG5vY2ggZ3VlbHRpZywgTWVsZHVuZyBhbmhhZW5nZW4sIGJ6dy4gdmlhCisgICAgLy8gRnVua3Rpb25zYXVmcnVmIGJlc2NoYWZmZW4uCisgICAgaWYgKHNpemVvZih4bGRbInhsbG9vayJdKSkKKyAgICAgIGxvb2srPXhsZFsieGxsb29rIl07CisgICAgZWxzZSBpZiAoc2l6ZW9mKHhsZFsieGxmdW4iXSkgJiYgc2l6ZW9mKHhsZFsieGxvYmplY3RuYW1lIl0pKSB7CisgICAgICBjbG9zdXJlIGNsOworICAgICAgaWYgKGNhdGNoKGNsPXN5bWJvbF9mdW5jdGlvbih4bGRbInhsZnVuIl0seGxkWyJ4bG9iamVjdG5hbWUiXSk7cHVibGlzaCkKKyAgICAgICAgICB8fCAhY2wpIHsKKyAgICAgICAgICAvLyB3ZW5uIEZlaGxlciBiZWltIExhZGVuL0Nsb3N1cmUgZXJzdGVsbGVuLCBkYW5uIEVpbnRyYWcgbG9lc2NoZW4KKyAgICAgICAgICAvLyAtPiBBbm5haG1lLCBkYXNzIGRpZXNlciBGZWhsZXIgcGVybWFuZW50IHNlaW4gd2lyZCwgei5CLiBFaW50cmFnCisgICAgICAgICAgLy8gdm9uIENsb25lbgorICAgICAgICAgIG1fZGVsZXRlKHhsLGtleSk7CisgICAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBlbHNlIGlmICghY2F0Y2gocmVzPWZ1bmNhbGwoY2wsIE1FKTsgcHVibGlzaCkpIHsKKyAgICAgICAgaWYgKCFzdHJpbmdwKHJlcykgfHwgIXNpemVvZihyZXMpKSB7CisgICAgICAgICAgLy8ga2VpbmVuIFN0cmluZyBvZGVyIGxlZXJlbiBTdHJpbmcgZ2VrcmllZ3QgLT4gdWViZXJzcHJpbmdlbi4KKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgbG9vays9cmVzOworICAgICAgfQorICAgIH0KKyAgfQorICAvLyBmZXJ0aWcuIFdlbm4gbG9vayBuaWNodCBsZWVyIGlzdCwgenVydWVja2dlYmVuLCBzb25zdCAwLgorICBpZiAoc2l6ZW9mKGxvb2spKQorICAgIHJldHVybihsb29rKTsKKyAgZWxzZQorICAgIHJldHVybigwKTsKK30KKworcHVibGljIHZhcmFyZ3MgaW50IEFkZEV4dHJhTG9vayhzdHJpbmcgbG9vaywgaW50IGR1cmF0aW9uLCBzdHJpbmcga2V5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGxvb2tlbmRlLCBvYmplY3Qgb2IpIHsKKyAgbWFwcGluZyB4bDsKKyAgc3RyaW5nIG9uYW1lOworICBpZiAoIXN0cmluZ3Aoa2V5KSB8fCAhc2l6ZW9mKGtleSkpIHsKKyAgICAvLyBBdXRvbWF0aXNjaCBlcnpldWdlbiwgd2VubiBtb2VnbGljaAorICAgIGlmICghb2JqZWN0cChwcmV2aW91c19vYmplY3QoKSkgfHwgCisgICAgICAgICFzdHJpbmdwKGtleT1vYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSkpIHx8ICFzaXplb2Yoa2V5KSkKKyAgICAgIHJldHVybigtMSk7CisgIH0KKworICBpZiAoIXN0cmluZ3AobG9vaykgfHwgIXNpemVvZihsb29rKSkKKyAgICByZXR1cm4oLTIpOworICBpZiAoIWludHAoZHVyYXRpb24pKQorICAgIHJldHVybigtMyk7CisKKyAgeGw9UXVlcnkoUF9JTlRFUk5BTF9FWFRSQV9MT09LLEZfVkFMVUUpOyAvLyBkcmFuIGRlbmtlbjogbGllZmVydCByZWZlcmVueiB6dXJ1ZWNrCisgIGlmICghbWFwcGluZ3AoeGwpKSB7CisgICAgU2V0KFBfSU5URVJOQUxfRVhUUkFfTE9PSywgeGw9KFtdKSApOworICB9CisKKyAgLy8ga2VpbiBBdXRvbWF0aXNjaGVzIFVlYmVyc2NocmVpYmVuLgorICBpZiAobWVtYmVyKHhsLGtleSkpCisgICAgcmV0dXJuKC00KTsKKworICAvLyBuZWcuIFdlcnRlOiAiYmlzIEVuZGUvcmVib290IiwgYWJzKGR1cmF0aW9uKSA9PSBFaW50cmFnemVpdAorICAvLyAwOiAiZnVlciBld2lnIiwgPjA6IFplaXRkYXVlciBpbiBTZWt1bmRlbgorICBpZiAoZHVyYXRpb24gPiAwKQorICAgIGR1cmF0aW9uKz10aW1lKCk7ICAvLyBob2ZmZW50bGljaCBnaWJ0IGVzIHJlaWNodHplaXRpZyA2NGJpdC1JbnRzCisgIGVsc2UgaWYgKGR1cmF0aW9uIDwgMCkKKyAgICBkdXJhdGlvbj1uZWdhdGUodGltZSgpKTsKKyAgLy8gMCBibGVpYnQsIHdpZSBlcyBpc3QuCisKKyAgaWYgKG9iamVjdHAob2IpKSB7CisgICAgLy8gRnVua3Rpb25zbmFtZSB1bmQgT2JqZWt0bmFtZSAoYWxzIE5hbWUsIGRhbWl0IGVzIGF1Y2ggbm9jaCBnZWh0LCB3ZW5uCisgICAgLy8gZGFzIE9iamVrdCBlbnRsYWRlbiB3dXJkZSwgQ3Jhc2gvcmVib290IHdhciBldGMuKSBzcGVpY2hlcm4KKyAgICAvLyBDbG9uZSB3ZXJkZW4gYXVjaCBnZXNwZWljaGVydCwgYWJlciBlcyB3aXJkIGRpcmVrdCBlaW4gaGFydGVyIEZlaGxlcgorICAgIC8vIGF1c2dlbG9lc3QsIHdlbm4gZWluIHBlcm1hbmVudGVyIFhsb29rIGZ1ZXIgZWluZW4gQ2xvbmUgcmVnaXN0cmllcnQKKyAgICAvLyB3ZXJkZW4gc29sbDogZGFzIGthbm4gbmljaHQgZ2VoZW4uCisgICAgaWYgKCFkdXJhdGlvbiAmJiBjbG9uZXAob2IpKQorICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKAorICAgICAgICAgICAiQWRkRXh0cmFMb29rKCk6IEZlaGxlcmhhZnRlcyBBcmd1bWVudCA8ZHVyYXRpb24+OiAlZCwgIgorICAgICAgICAgICAicGVybWFuZW50ZSBFeHRyYWxvb2tzIGR1cmNoIENsb25lICglcykgbmljaHQgcmVnaXN0cmllcmJhci5cbiIsCisgICAgICAgICAgIGR1cmF0aW9uLCBvYmplY3RfbmFtZShvYikpKTsKKworICAgIHhsW2tleV09KFsieGxvYmplY3RuYW1lIjpvYmplY3RfbmFtZShvYiksCisgICAgICAgICAgICAgICJ4bGZ1biI6IGxvb2ssCisgICAgICAgICAgICAgXSk7CisgICAgLy8gZ2dmLiBOYW1lIGRlciBGdW5rdGlvbiBzcGVpY2hlcm4sIGRpZSBiZWkgQWJsYXVmIGF1ZmdlcnVmZW4gd2lyZC4KKyAgICBpZiAoc3RyaW5ncChsb29rZW5kZSkgJiYgc2l6ZW9mKGxvb2tlbmRlKSkKKyAgICAgICAgeGxba2V5XVsieGxlbmRlZnVuIl09bG9va2VuZGU7CisgIH0KKyAgZWxzZSB7CisgICAgLy8gRWluZmFjaGVyIEVpbnRyYWcsIG51ciBkZW4gYmVhcmJlaXRldGVuIFN0cmluZyBtZXJrZW4uIDstKQorICAgIHhsW2tleV09KFsieGxsb29rIjogYnJlYWtfc3RyaW5nKHJlcGxhY2VfcGVyc29uYWwobG9vaywoe01FfSksMSksNzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsQlNfTEVBVkVfTVlfTEZTKSwKKyAgICAgICAgICAgICBdKTsKKyAgICAvLyBnZ2YuIE1lbGR1bmcgc3BlaWNoZXJuLCBkaWUgYmVpIEFibGF1ZiBhdXNnZWdlYmVuIHdlcmRlbiBzb2xsLgorICAgIGlmIChzdHJpbmdwKGxvb2tlbmRlKSAmJiBzaXplb2YobG9va2VuZGUpKSB7CisgICAgICB4bFtrZXldWyJ4bGVuZGUiXT1icmVha19zdHJpbmcocmVwbGFjZV9wZXJzb25hbChsb29rZW5kZSwoe01FfSksMSksNzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsQlNfTEVBVkVfTVlfTEZTKTsKKyAgICB9CisgIH0KKyAgLy8gRW5kZXplaXQgdmVybWVya2VuLgorICBpZiAoZHVyYXRpb24gIT0gMCkKKyAgICB4bFtrZXldWyJ4bGR1cmF0aW9uIl09ZHVyYXRpb247CisKKyAgLy8gS2VpbiBTZXQgbm9ldGlnLCB3ZWlsIFF1ZXJ5IGRhcyBNYXBwaW5nIGphIGFscyBSZWZlcmVueiBsaWVmZXJ0ZS4KKyAgcmV0dXJuKDEpOworfQorCitwdWJsaWMgaW50IFJlbW92ZUV4dHJhTG9vayhzdHJpbmcga2V5KSB7CisgIG1hcHBpbmcgeGw7CisgIGlmICghc3RyaW5ncChrZXkpIHx8ICFzaXplb2Yoa2V5KSkgeworICAgIC8vIEF1dG9tYXRpc2NoIGVyemV1Z2VuLCB3ZW5uIG1vZWdsaWNoCisgICAgaWYgKCFvYmplY3RwKHByZXZpb3VzX29iamVjdCgpKSB8fAorICAgICAgICAhc3RyaW5ncChrZXk9b2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpKSB8fCAhc2l6ZW9mKGtleSkpCisgICAgICByZXR1cm4oLTEpOworICB9CisgIHhsPVF1ZXJ5KFBfSU5URVJOQUxfRVhUUkFfTE9PSyxGX1ZBTFVFKTsgLy8gZHJhbiBkZW5rZW46IGxpZWZlcnQgcmVmZXJlbnogenVydWVjaworICBpZiAoIW1hcHBpbmdwKHhsKSkKKyAgICByZXR1cm4gKC0yKTsKKyAgaWYgKCFtZW1iZXIoeGwsa2V5KSkKKyAgICByZXR1cm4oLTIpOworCisgIG1fZGVsZXRlKHhsLGtleSk7CisgIC8vIEtlaW4gU2V0IG5vZXRpZywgd2VpbCBRdWVyeSBkYXMgTWFwcGluZyBqYSBhbHMgUmVmZXJlbnogbGllZmVydGUuCisgIHJldHVybigxKTsKK30KKwordm9pZCBjcmVhdGUoKQoreyAKKyAgOjpjcmVhdGUoKTsKKyAgU2V0KFBfR0VOREVSLCBTQVZFLCBGX01PREUpOworICAvLyBFeHRyYWxvb2stUHJvcGVydHkgc3BlaWNoZXJuIHVuZCB2b3IgbWFudWVsbGVyIEFlbmRlcnVuZyBzY2h1ZXR6ZW4KKyAgLy8gRU1zIGR1ZXJmZW4sIGRpZSB3aXNzZW4gaG9mZmVudGxpY2gsIHdhcyBzaWUgdHVuLgorICBTZXQoUF9JTlRFUk5BTF9FWFRSQV9MT09LLCBTQVZFfFBST1RFQ1RFRCwgRl9NT0RFX0FTKTsKKyAgU2V0UHJvcChQX0NMT1RISU5HLCh7fSkpOworICBBZGRJZCgiTGl2aW5nIik7Cit9CisKK3N0cmluZyBjb25kaXRpb24oKQoreworICBpbnQgaHBudCwgbWF4X2hwbnQsIHBlcmM7CisKKyAgaHBudCAgICAgICAgPSBRdWVyeVByb3AoIFBfSFAgKTsKKyAgbWF4X2hwbnQgICAgPSBRdWVyeVByb3AoIFBfTUFYX0hQICk7CisKKyAgaWYobWF4X2hwbnQ+MCAmJiBocG50PjApCisgICAgcGVyYz0xMDAqaHBudC9tYXhfaHBudDsKKyAKKyAgc3dpdGNoKHBlcmMpIHsKKyAgICBjYXNlIDAuLjk6CisgICAgICAgIHJldHVybiBjYXBpdGFsaXplKFF1ZXJ5UHJvbm91bihXRVIpKSsiIHN0ZWh0IGF1ZiBkZXIgU2Nod2VsbGUgZGVzIFRvZGVzLlxuIjsKKyAgICBjYXNlIDEwLi4xOToKKyAgICAgICAgcmV0dXJuIGNhcGl0YWxpemUoUXVlcnlQcm9ub3VuKFdFUikpKyIgYnJhdWNodCBkcmluZ2VuZCBlaW5lbiBBcnp0LlxuIjsKKyAgICBjYXNlIDIwLi4yOToKKyAgICAgICAgcmV0dXJuIGNhcGl0YWxpemUoUXVlcnlQcm9ub3VuKFdFUikpKyIgaXN0IGluIGtlaW5lciBndXRlbiBWZXJmYXNzdW5nLlxuIjsKKyAgICBjYXNlIDMwLi4zOToKKyAgICAgICAgcmV0dXJuIGNhcGl0YWxpemUoUXVlcnlQcm9ub3VuKFdFUikpKyIgd2Fua3QgYmVyZWl0cyBiZWRlbmtsaWNoLlxuIjsKKyAgICBjYXNlIDQwLi40OToKKyAgICAgICAgcmV0dXJuIGNhcGl0YWxpemUoUXVlcnlQcm9ub3VuKFdFUikpKyIgbWFjaHQgZWluZW4gbWl0Z2Vub21tZW5lbiBFaW5kcnVjay5cbiI7CisgICAgY2FzZSA1MC4uNTk6CisgICAgICAgIHJldHVybiBjYXBpdGFsaXplKFF1ZXJ5UHJvbm91bihXRVIpKSsiIHNpZWh0IG5pY2h0IG1laHIgdGF1ZnJpc2NoIGF1cy5cbiI7CisgICAgY2FzZSA2MC4uNjk6CisgICAgICAgIHJldHVybiBjYXBpdGFsaXplKFF1ZXJ5UHJvbm91bihXRVIpKSsiIGlzdCBsZWljaHQgYW5nZXNjaGxhZ2VuLlxuIjsKKyAgICBjYXNlIDcwLi43OToKKyAgICAgICAgcmV0dXJuIGNhcGl0YWxpemUoUXVlcnlQcm9ub3VuKFdFUikpKyIgZnVlaGx0ZSBzaWNoIGhldXRlIHNjaG9uIGJlc3Nlci5cbiI7CisgICAgY2FzZSA4MC4uODk6CisgICAgICAgIHJldHVybiBjYXBpdGFsaXplKFF1ZXJ5UHJvbm91bihXRVIpKSsiIGlzdCBzY2hvbiBldHdhcyBnZXNjaHdhZWNodC5cbiI7CisgIH0KKyAgLy9mYWxsLXRocm91Z2gKKyAgcmV0dXJuIGNhcGl0YWxpemUoUXVlcnlQcm9ub3VuKFdFUikpKyIgaXN0IGFic29sdXQgZml0LlxuIjsKK30KKwordmFyYXJncyBzdHJpbmcgbG9uZygpIHsKKyAgc3RyaW5nIHN0ciwgY2FwX3Byb25vdW47CisgIHN0cmluZyBkZXNjciwgaW52bCx0bXAsZXhsOworICBpbnQgaHBudCwgbWF4X2hwbnQ7CisgIG1peGVkIGZpbHRlcl9sZGZpZWQ7CisgIG9iamVjdCBvYjsKKworICBzdHIgPSBwcm9jZXNzX3N0cmluZyggUXVlcnlQcm9wKFBfTE9ORykgKTsKKyAgaWYoIXN0cmluZ3Aoc3RyKSkgc3RyID0gIiI7CisKKyAgc3RyICs9IGNvbmRpdGlvbigpOworCisgIC8vIEV4dHJhbG9vaworICBpZihzdHJpbmdwKHRtcCA9IFF1ZXJ5UHJvcChQX0VYVFJBX0xPT0spKSkKKyAgICBzdHIgKz0gdG1wOworICBpZiAoc3RyaW5ncCh0bXAgPSBRdWVyeVByb3AoUF9JTlRFUk5BTF9FWFRSQV9MT09LKSkpCisgICAgc3RyICs9IHRtcDsKKyAgZm9yKG9iID0gZmlyc3RfaW52ZW50b3J5KE1FKTsgb2I7IG9iID0gbmV4dF9pbnZlbnRvcnkob2IpKQorICAgIGlmKGV4bCA9IG9iLT5RdWVyeVByb3AoUF9FWFRSQV9MT09LKSkgCisgICAgICBzdHIgKz0gZXhsOworICAgIGVsc2UgaWYoZXhsID0gb2ItPmV4dHJhX2xvb2soKSkgCisgICAgICBzdHIgKz0gZXhsOyAvLyBUTyBCRSBSRU1PVkVECisKKyAgCisgIGlmKGZpbHRlcl9sZGZpZWQgPSBRdWVyeVByb3AoUF9UUkFOU1BBUkVOVCkpCisgIHsKKyAgICBpbnZsID0gbWFrZV9pbnZsaXN0KFBMLCBhbGxfaW52ZW50b3J5KE1FKSk7CisgICAgaWYoaW52bCAhPSAiIikKKyAgICAgIHN0ciArPSBjYXBpdGFsaXplKFF1ZXJ5UHJvbm91bihXRVIpKSsiIHRyYWVndCBiZWkgc2ljaDpcbiIgKyBpbnZsOworICB9CisgIHJldHVybiBzdHI7Cit9CisKK3ZhcmFyZ3Mgc3RyaW5nIG5hbWUoaW50IGNhc3VzLCBpbnQgZGVtb25zdCkKK3sgCisgIGlmKCBRdWVyeVByb3AoIFBfSU5WSVMgKSApCisgIHsKKyAgICBpZiggY2FzdXMgPT0gUkFXICkgcmV0dXJuICJKZW1hbmQiOworICAgIHJldHVybiAoeyJKZW1hbmQiLCJKZW1hbmRzIiwiSmVtYW5kZW0iLCJKZW1hbmRlbiJ9KVtjYXN1c107CisgIH0KKyAgaWYgKFF1ZXJ5UHJvcChQX0ZST0cpICYmIGNhc3VzICE9IFJBVyApCisgIHsKKyAgICBzdHJpbmcgcz1RdWVyeUFydGljbGUoY2FzdXMsIDAsIDEpKyJGcm9zY2giOworICAgIGlmIChjYXN1cz09V0VTU0VOKSBzICs9ICJlcyI7CisgICAgcmV0dXJuIHM7CisgIH0KKyAgcmV0dXJuIDo6bmFtZSggY2FzdXMsIGRlbW9uc3QgKTsKK30KKworc3RhdGljIGludCBfcXVlcnlfZ2VuZGVyKCkKK3sKKyAgaWYgKFF1ZXJ5UHJvcChQX0ZST0cpKSByZXR1cm4gMTsKKyAgcmV0dXJuIFF1ZXJ5KFBfR0VOREVSKTsKK30KKworLy8gTlBDIHNvbGxlbiBhdXMgS29tcGF0aWJpbGl0YWV0c2dydWVuZGVuIGF1Y2ggZWluZSAiZWNodGUiIFJhc3NlIGhhYmVuLgorLy8gRGVmYXVsdCBpc3QgaGllciBkaWUgUmFzc2UsIG1hbiBrYW5uIGFiZXIgaGllcm1pdCBhdWNoIGVpbmVuIE5QQyBmYWtlbiwKKy8vIGRlciBzaWNoIHRhcm50LCBpbmRlbSBtYW4gUF9SRUFMX1JBQ0UgcGVyIEhhbmQgc2V0enQuCitzdGF0aWMgc3RyaW5nIF9xdWVyeV9yZWFsX3JhY2UoKQoreworICByZXR1cm4gUXVlcnkoUF9SRUFMX1JBQ0UsRl9WQUxVRSl8fFF1ZXJ5UHJvcChQX1JBQ0UpOworfQorCitzdGF0aWMgbWl4ZWQgX3NldF9uYW1lKG1peGVkIG5tICkKK3sKKyAgc3RyaW5nIGx2bmFtOworICBsdm5hbSA9IG5tOworICBpZihwb2ludGVycChubSkpIGx2bmFtID0gbm1bMF07CisgIHNldF9saXZpbmdfbmFtZShsb3dlcl9jYXNlKGx2bmFtKSk7CisgIHJldHVybiBTZXQoUF9OQU1FLCBubSk7Cit9CisKK2ludCBfcXVlcnlfY29udGFpbmVyKCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBpc19jbGFzc19tZW1iZXIobWl4ZWQgc3RyKSB7CisgIC8vIEtlaW5lIEtsYXNzZSwga2VpbmUgTWl0Z2xpZWRzY2hhZnQgLi4uCisgIGlmICghc3RyIHx8ICghc3RyaW5ncChzdHIpICYmICFwb2ludGVycChzdHIpKSB8fCBzdHI9PSIiKSAKKyAgICAgIHJldHVybiAwOworCisgIGlmICg6OmlzX2NsYXNzX21lbWJlcihzdHIpKQorICAgIHJldHVybiAxOworCisgIGlmIChzdHJpbmdwKHN0cikpCisgICAgc3RyID0gKHtzdHJ9KTsKKworICAvLyBSYXNzZW4gd2VyZGVuIGFscyBpbXBsaXppdGUgS2xhc3NlbiBhdWZnZWZhc3N0LgorICAvLyBUT0RPOiBQcnVlZmVuLCBvYiBkYXMgdW5iZWRpbmd0IGhhcnQta29kaWVydCBzZWluIG11c3MuCisgIHN0cmluZyByYWNlID0gUXVlcnlQcm9wKFBfUkFDRSk7CisgIGlmICggc3RyaW5ncChyYWNlKSAmJiBtZW1iZXIoIHN0ciwgbG93ZXJfY2FzZShyYWNlKSApID4gLTEgKQorICAgIHJldHVybiAxOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKK21hcHBpbmcgX3F1ZXJ5X21hdGVyaWFsKCkgeworICBtaXhlZCByZXM7CisKKyAgaWYgKG1hcHBpbmdwKHJlcz1RdWVyeShQX01BVEVSSUFMKSkpCisgICAgcmV0dXJuIHJlczsKKyAgcmV0dXJuIChbTUFUX01JU0NfTElWSU5HOjEwMF0pOworfQorCmRpZmYgLS1naXQgYS9zdGQvbGl2aW5nL2hlbHBlcnMuYyBiL3N0ZC9saXZpbmcvaGVscGVycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMjkyYzAKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvbGl2aW5nL2hlbHBlcnMuYwpAQCAtMCwwICsxLDE0OSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGxpdmluZy9oZWxwZXJzLmMgLS0gKFF1ZXJ5KU1ldGhvZGVuIGZ1ZXIgSGlsZnNvYmpla3RlLCB6LkIuIHp1bSBUYXVjaGVuCisvLworLy8gJElkOiBtb25leWhhbmRsZXIuaCx2IDMuMSAxOTk3LzAyLzEyIDEzOjI5OjA5IFdhcmdvbiBFeHAgJQorCisjcHJhZ21hIHN0cm9uZ190eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisKKyNpbmNsdWRlIDxsaXZpbmcvaGVscGVycy5oPgorI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDx0aGluZy9wcm9wZXJ0aWVzLmg+CisjdW5kZWYgTkVFRF9QUk9UT1RZUEVTCisKK3B1YmxpYyBpbnQgUmVnaXN0ZXJIZWxwZXJPYmplY3Qob2JqZWN0IGhlbHBlciwgaW50IHR5cGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmd8Y2xvc3VyZSBjYWxsYmFjaykgCit7CisgIC8vIGNiOiBjbG9zdXJlIGF1ZiBkaWUgQ2FsbGJhY2stRnVua3Rpb24gaW4gcHJldmlvdXNfb2JqZWN0KCkKKyAgY2xvc3VyZSBjYjsKKyAgLy8gaGVscGVyczogTWFwcGluZyBhbGxlciBlaW5nZXRyYWdlbmVuIEhlbGZlci1PYmpla3RlCisgIG1hcHBpbmcgaGVscGVyczsKKworICAvLyBLZWluIHBvc2l0aXZlciBJbnRlZ2Vyd2VydCBhbHMgSGVsZmVydHlwIHVlYmVyZ2ViZW4/CisgIGlmICggIWludHAodHlwZSkgfHwgdHlwZSA8IDEgKQorICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCAiV3JvbmcgYXJndW1lbnQgMSB0byBSZWdpc3RlckhlbHBlck9iamVjdCgpLiAiCisgICAgICAgICJFeHBlY3RlZCBwb3NpdGl2ZSA8aW50PiwgZ290ICVPLlxuIiwgdHlwZSkpOworICAvLyBLZWluIE9iamVrdCB2b3JoYW5kZW4sIGFuIGRlbSBkaWUgQ2FsbGJhY2stRnVua3Rpb24gZ2VydWZlbiB3ZXJkZW4gc29sbD8KKyAgaWYgKCAhb2JqZWN0cChoZWxwZXIpICkKKyAgICByZXR1cm4gSEVMUEVSX05PX0NBTExCQUNLX09CSkVDVDsKKworICAvLyBGdW5rdGlvbnNuYW1lIHp1bSBad2VjayBkZXMgQ2FsbGJhY2tzIHVlYmVyZ2ViZW4/CisgIGlmICggc3RyaW5ncChjYWxsYmFjaykgKSB7CisgICAgLy8gRGFubiBDbG9zdXJlIGRhdm9uIGVyc3RlbGxlbi4KKyAgICBjYiA9IHN5bWJvbF9mdW5jdGlvbihjYWxsYmFjaywgaGVscGVyKTsKKyAgICAvLyBXZW5uIGRhcyBuaWNodCBrbGFwcHQgKHpCIHdlaWwgZGllIEZ1bmt0aW9uIHByaXZhdGUgaXN0KSwgZGFubgorICAgIC8vIEZlaGxlciB3ZXJmZW4gdW5kIGFiYnJlY2hlbi4KKyAgICBpZiAoICFjbG9zdXJlcChjYikgKQorICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiRXJyb3IgaW4gUmVnaXN0ZXJIZWxwZXJPYmplY3QoKTogVW5hYmxlIHRvIGNhbGwgIgorICAgICAgICAiZnVuY3Rpb24gJXMgaW4gb2JqZWN0ICVPLlxuIiwgY2FsbGJhY2ssIGhlbHBlcikpOworICB9CisgIC8vIFdlbm4gc2Nob24gZWluZSBDbG9zdXJlIHVlYmVyZ2ViZW4gd3VyZGUsIGRhbm4gZGllc2UgZGlyZWt0IHNwZWljaGVybi4KKyAgZWxzZSBpZiAoIGNsb3N1cmVwKGNhbGxiYWNrKSApIHsKKyAgICBjYiA9IGNhbGxiYWNrOworICB9CisgIC8vIFdlZGVyIEZ1bmt0aW9uc25hbWUsIG5vY2ggQ2xvc3VyZSwgZGFubiBGZWhsZXIgd2VyZmVuIHVuZCBhYmJyZWNoZW4uCisgIGVsc2UKKyAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJXcm9uZyBhcmd1bWVudCAyIHRvIFJlZ2lzdGVySGVscGVyT2JqZWN0KCkuICIKKyAgICAgICJFeHBlY3RlZCA8c3RyaW5nL2Nsb3N1cmU+LCBnb3QgJU8uXG4iLGNhbGxiYWNrKSk7CisKKyAgLy8gUHJvcGVydHkgYXVzbGVzZW4gdW5kIHp3aXNjaGVuc3BlaWNoZXJuCisgIGhlbHBlcnMgPSBRdWVyeVByb3AoUF9IRUxQRVJfT0JKRUNUUyk7CisgIC8vIFdlbm4gZGllIFByb3AgbGVlciBpc3QsIGhpZXIgaW5pdGlhbGlzaWVyZW4KKyAgaWYgKCAhaGVscGVycyApIHsKKyAgICBoZWxwZXJzID0gKFt0eXBlOih7fSldKTsKKyAgfQorICAvLyBXZW5uIGRlciBUeXAgbm9jaCBuaWNodCBleGlzdGllcnQsIGhpZXIgbmFjaHRyYWdlbi4KKyAgZWxzZSBpZiAoICFwb2ludGVycChoZWxwZXJzW3R5cGVdKSApIHsKKyAgICBoZWxwZXJzW3R5cGVdID0gKHt9KTsKKyAgfQorCisgIC8vIENsb3N1cmUgZWludHJhZ2VuLCB3ZW5uIG5vY2ggbmljaHQgdm9yaGFuZGVuCisgIGlmICggbWVtYmVyKGhlbHBlcnNbdHlwZV0sIGNiKT09LTEgKSB7CisgICAgaGVscGVyc1t0eXBlXSA9IGhlbHBlcnNbdHlwZV0rKHtjYn0pOworICAgIFNldFByb3AoUF9IRUxQRVJfT0JKRUNUUywgaGVscGVycyk7CisgICAgcmV0dXJuIEhFTFBFUl9TVUNDRVNTOworICB9CisgIGVsc2UKKyAgICByZXR1cm4gSEVMUEVSX0FMUkVBRFlfTElTVEVEOworfQorCitwdWJsaWMgaW50IFVucmVnaXN0ZXJIZWxwZXJPYmplY3Qob2JqZWN0IGhlbHBlciwgaW50IHR5cGUpIHsKKyAgaWYgKCAhaW50cCh0eXBlKSB8fCB0eXBlIDwgMSApCisgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoICJXcm9uZyBhcmd1bWVudCAyIHRvIFVucmVnaXN0ZXJIZWxwZXJPYmplY3QoKS4gIgorICAgICAgICAiRXhwZWN0ZWQgcG9zaXRpdmUgPGludD4sIGdvdCAlTy5cbiIsIHR5cGUpKTsKKyAgaWYgKCAhb2JqZWN0cChoZWxwZXIpICkKKyAgICByZXR1cm4gSEVMUEVSX05PX0NBTExCQUNLX09CSkVDVDsKKworICBtYXBwaW5nIGhlbHBlcnMgPSBRdWVyeShQX0hFTFBFUl9PQkpFQ1RTLCBGX1ZBTFVFKTsKKworICBpZiAoIG1hcHBpbmdwKGhlbHBlcnMpICkgeworICAgIGZvcmVhY2goY2xvc3VyZSBjbDogaGVscGVyc1t0eXBlXSkgeworICAgICAgaWYgKCBnZXRfdHlwZV9pbmZvKGNsLDIpID09IGhlbHBlciApIHsKKyAgICAgICAgaGVscGVyc1t0eXBlXSA9IGhlbHBlcnNbdHlwZV0tKHtjbH0pOworICAgICAgICByZXR1cm4gSEVMUEVSX1NVQ0NFU1M7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBIRUxQRVJfTk9USElOR19UT19VTlJFR0lTVEVSOworfQorCisvLyBRdWVyeW1ldGhvZGUgZnVlciBQX0FRVUFUSUNfSEVMUEVSUworcHVibGljIG1hcHBpbmcgX3F1ZXJ5X2xpYl9wX2FxdWF0aWNfaGVscGVycygpIHsKKyAgbWFwcGluZyByZXQgPSAoW10pOworICAvLyBlaW5nZXRyYWdlbmUgQ2FsbGJhY2stQ2xvc3VyZXMgYXVzbGVzZW4KKyAgY2xvc3VyZSAqaGVscGVycyA9IAorICAgICggUXVlcnkoUF9IRUxQRVJfT0JKRUNUUywgRl9WQUxVRSkgfHwgKFtdKSApW0hFTFBFUl9UWVBFX0FRVUFUSUNdOworICAvLyBFcyBzaW5kIGdhciBrZWluZSBXZXJ0ZSBlaW5nZXRyYWdlbj8gRGFubiBnbGVpY2ggcmF1c3NwcmluZ2VuLgorICBpZiAoICFwb2ludGVycChoZWxwZXJzKSApCisgICAgcmV0dXJuIHJldDsKKworICAvLyBOdWxsZWxlbWVudCBzdWJzdHJhaGllcmVuCisgIGhlbHBlcnMgLT0gKHswfSk7CisKKyAgaWYgKCBzaXplb2YoaGVscGVycykgKSB7CisgICAgLy8gTWFwcGluZyBlcnN0ZWxsZW46IEtleXMgc2luZCBkaWUgT2JqZWt0ZSwgZGVyZW4gQ2xvc3VyZXMgZWluZ2V0cmFnZW4KKyAgICAvLyBzaW5kLiBWYWx1ZXMgc2luZCBkaWUgUnVlY2tnYWJld2VydGUgZGVyIENsb3N1cmVzLAorICAgIC8vIGRpZSBkYWJlaSBkYXMgU3BpZWxlcm9iamVrdCB1bmQgZGFzIGFiZnJhZ2VuZGUgT2JqZWt0IHVlYmVyZ2ViZW4KKyAgICAvLyBiZWtvbW1lbi4KKyAgICBvYmplY3QgKmtleXMgPSBtYXAoaGVscGVycywgIydnZXRfdHlwZV9pbmZvLCAyKTsKKyAgICBpbnQgKnZhbHMgPSBtYXAoaGVscGVycywgIydmdW5jYWxsLCB0aGlzX29iamVjdCgpLCBwcmV2aW91c19vYmplY3QoMSkpOworICAgIHJldCA9IG1rbWFwcGluZyhrZXlzLHZhbHMpOworICB9CisgIHJldHVybiByZXQ7Cit9CisKKy8vIFF1ZXJ5bWV0aG9kZSBmdWVyIFBfQUVSSUFMX0hFTFBFUlMKK3B1YmxpYyBtYXBwaW5nIF9xdWVyeV9saWJfcF9hZXJpYWxfaGVscGVycygpIHsKKyAgbWFwcGluZyByZXQgPSAoW10pOworICAvLyBlaW5nZXRyYWdlbmUgQ2FsbGJhY2stQ2xvc3VyZXMgYXVzbGVzZW4KKyAgY2xvc3VyZSAqaGVscGVycyA9IAorICAgICggUXVlcnkoUF9IRUxQRVJfT0JKRUNUUywgRl9WQUxVRSkgfHwgKFtdKSApW0hFTFBFUl9UWVBFX0FFUklBTF07CisKKyAgLy8gRXMgc2luZCBnYXIga2VpbmUgV2VydGUgZWluZ2V0cmFnZW4/IERhbm4gZ2xlaWNoIHJhdXNzcHJpbmdlbi4KKyAgaWYgKCAhcG9pbnRlcnAoaGVscGVycykgKQorICAgIHJldHVybiByZXQ7CisgIAorICAvLyBOdWxsZWxlbWVudCBzdWJzdHJhaGllcmVuCisgIGhlbHBlcnMgLT0gKHswfSk7CisKKyAgaWYgKCBzaXplb2YoaGVscGVycykgKSB7CisgICAgLy8gTWFwcGluZyBlcnN0ZWxsZW46IEtleXMgc2luZCBkaWUgT2JqZWt0ZSwgZGVyZW4gQ2xvc3VyZXMgZWluZ2V0cmFnZW4KKyAgICAvLyBzaW5kLiBWYWx1ZXMgc2luZCBkaWUgUnVlY2tnYWJld2VydGUgZGVyIENsb3N1cmVzLAorICAgIC8vIGRpZSBkYWJlaSBkYXMgU3BpZWxlcm9iamVrdCB1bmQgZGFzIGFiZnJhZ2VuZGUgT2JqZWt0IHVlYmVyZ2ViZW4KKyAgICAvLyBiZWtvbW1lbi4KKyAgICBvYmplY3QgKmtleXMgPSBtYXAoaGVscGVycywjJ2dldF90eXBlX2luZm8sIDIpOworICAgIGludCAqdmFscyA9IG1hcChoZWxwZXJzLCAjJ2Z1bmNhbGwsIHRoaXNfb2JqZWN0KCksIHByZXZpb3VzX29iamVjdCgxKSk7CisgICAgcmV0ID0gbWttYXBwaW5nKGtleXMsdmFscyk7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworLy8gUXVlcnltZXRob2RlIGZ1ZXIgUF9IRUxQRVJfT0JKRUNUUworcHVibGljIG1hcHBpbmcgX3F1ZXJ5X2xpYl9wX2hlbHBlcl9vYmplY3RzKCkgeworICByZXR1cm4gZGVlcF9jb3B5KFF1ZXJ5KFBfSEVMUEVSX09CSkVDVFMsRl9WQUxVRSkpOworfQorCmRpZmYgLS1naXQgYS9zdGQvbGl2aW5nL2ludmVudG9yeS5jIGIvc3RkL2xpdmluZy9pbnZlbnRvcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzAyN2U0Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkL2xpdmluZy9pbnZlbnRvcnkuYwpAQCAtMCwwICsxLDY2IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gY29udGFpbmVyL2ludmVudG9yeS5jIC0tIFVtZ2FuZyBtaXQgYmVzb25kZXJlbiBPYmpla3RlbiBpbSBJbnZlbnRvcnkKKy8vCisvLyAkSWQ6IGludmVudG9yeS5jIDY1NTQgMjAwNy0xMC0xNyAyMjo0NTo1M1ogWmVzc3RyYSAkCisjcHJhZ21hIHN0cm9uZ190eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisKK2luaGVyaXQgIi9zdGQvY29udGFpbmVyL2ludmVudG9yeSI7CisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8c2Vuc2l0aXZlLmg+CisjaW5jbHVkZSA8YXR0cmlidXRlcy5oPgorCisjZGVmaW5lIE1FIHRoaXNfb2JqZWN0KCkKKworcHVibGljIHZvaWQgUmVtb3ZlU2Vuc2l0aXZlT2JqZWN0KG9iamVjdCBvYikgeworICA6OlJlbW92ZVNlbnNpdGl2ZU9iamVjdChvYik7CisgIFJlbW92ZVNlbnNpdGl2ZU9iamVjdEZyb21MaXN0KG9iLFNFTlNJVElWRV9BVFRBQ0spOworICBpZiAob2JqZWN0cChvYikgJiYgKG9iLT5RdWVyeVByb3AoUF9YX0FUVFJfTU9EKSAgIHx8CisgICAgICAgICAgICAgICAgICAgICAgb2ItPlF1ZXJ5UHJvcChQX1hfSEVBTFRIX01PRCkgKSkKKyAgeworICAgIGRlcmVnaXN0ZXJfbW9kaWZpZXIob2IpOworICAgIC8vIEVyc3Qgd2VubiBkYXMgT2JqZWt0IGRlbiBTcGllbGVyIHZlcmxhc3NlbiBrb25udGUsIGRpZSBBdHRyaWJ1dGUKKyAgICAvLyBuZXUgYmVyZWNobmVuLgorICAgIGlmIChmaW5kX2NhbGxfb3V0KCJVcGRhdGVBdHRyaWJ1dGVzIik9PS0xKQorICAgICAgY2FsbF9vdXQoIlVwZGF0ZUF0dHJpYnV0ZXMiLDApOyAKKyAgfQorfQorCitwdWJsaWMgdm9pZCBJbnNlcnRTZW5zaXRpdmVPYmplY3Qob2JqZWN0IG9iLCBtaXhlZCBhcmcpIHsKKyAgOjpJbnNlcnRTZW5zaXRpdmVPYmplY3Qob2IsYXJnKTsKKyAgaWYgKG9iamVjdHAob2IpICYmIChvYi0+UXVlcnlQcm9wKFBfWF9BVFRSX01PRCkgICB8fAorICAgICAgICAgICAgICAgICAgICAgIG9iLT5RdWVyeVByb3AoUF9YX0hFQUxUSF9NT0QpICkpCisgIHsKKyAgICByZWdpc3Rlcl9tb2RpZmllcihvYik7CisgICAgVXBkYXRlQXR0cmlidXRlcygpOworICB9Cit9CisKK3B1YmxpYyB2b2lkIENoZWNrU2Vuc2l0aXZlQXR0YWNrKGludCBkYW0sIG1peGVkIGRhbV90eXBlLCBtaXhlZCBzcGVsbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgZW5lbXkpIHsKKyAgbWl4ZWQgYSx4OworICBpbnQgaTsKKyAgCisgIGlmICghcG9pbnRlcnAoYT1RdWVyeVByb3AoUF9TRU5TSVRJVkVfQVRUQUNLKSkpCisgICAgcmV0dXJuOworICBpZiAoIXBvaW50ZXJwKGRhbV90eXBlKSkKKyAgICBkYW1fdHlwZT0oe2RhbV90eXBlfSk7CisgIGZvciAoaT1zaXplb2YoYSktMTtpPj0wO2ktLSkKKyAgICBpZiAocG9pbnRlcnAoeD1hW2ldKSAmJgorCWRhbT54W1NFTlNfVEhSRVNIT0xEXSAmJgorCW1lbWJlcihkYW1fdHlwZSx4W1NFTlNfS0VZXSk+PTAgJiYKKwlvYmplY3RwKHhbU0VOU19PQkpFQ1RdKSAmJgorCWVudmlyb25tZW50KHhbU0VOU19PQkpFQ1RdKT09TUUgJiYKKwljbG9zdXJlcCh4W1NFTlNfQ0xPU1VSRV0pKQorICAgICAgZnVuY2FsbCh4W1NFTlNfQ0xPU1VSRV0sCisJICAgICAgZW5lbXkseFtTRU5TX0tFWV0sZGFtLAorCSAgICAgIHNwZWxsLHhbU0VOU19PUFRdKTsKK30KKwpkaWZmIC0tZ2l0IGEvc3RkL2xpdmluZy9saWZlLmMgYi9zdGQvbGl2aW5nL2xpZmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2E3MmY1Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkL2xpdmluZy9saWZlLmMKQEAgLTAsMCArMSwxNTcyIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gbGl2aW5nL2xpZmUuYyAtLSBsaWZlIHZhcmlhYmxlcworLy8KKy8vICRJZDogbGlmZS5jIDk0MjYgMjAxNi0wMS0wMyAxMDowMjo1N1ogWmVzc3RyYSAkCisKKy8vIGxpdmluZyBvYmplY3QgbGlmZSB2YXJpYWJsZXMKKy8vCisvLyAgUF9BTElHTiAgICAgICAgIC0tIGFsaWdubWVudCB2YWx1ZQorLy8gIFBfTlBDICAgICAgICAgICAtLSBpZiBsaXZpbmcgaXMgYW4gTlBDCisvLyAgUF9IUCAgICAgICAgICAgIC0tIEhpdFBvaW50cworLy8gIFBfU1AgICAgICAgICAgICAtLSBTcGVsbFBvaW50cworLy8gIFBfQUxDT0hPTCAgICAgICAtLSB2YWx1ZSBvZiBpbnRveGljYXRpb24KKy8vICBQX0RSSU5LICAgICAgICAgLS0gdmFsdWUgb2Ygc29ha25lc3MKKy8vICBQX0ZPT0QgICAgICAgICAgLS0gdmFsdWUgb2Ygc3R1ZmZuZXNzCisvLyAgUF9YUCAgICAgICAgICAgIC0tIGV4cGVyaWVuY2UKKy8vICBQX1BPSVNPTiAgICAgICAgLS0gbGV2ZWwgb2YgcG9pc29uCisvLyAgUF9DT1JQU0UgICAgICAgIC0tIGNvcnBzZS1vYmplY3QKKy8vICBQX0RFQUYgICAgICAgICAgLS0gaWYgbGl2aW5nIGlzIGRlYWYKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHNhdmVfdHlwZXMscnR0X2NoZWNrcworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPGhvb2suaD4KKyNpbmNsdWRlIDxsaXZpbmcvc2tpbGxzLmg+CisjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxpdmluZy9saWZlLmg+CisjaW5jbHVkZSA8bGl2aW5nL21vdmluZy5oPgorI2luY2x1ZGUgPGxpdmluZy9jb21iYXQuaD4KKyNpbmNsdWRlIDxsaXZpbmcvYXR0cmlidXRlcy5oPgorI2luY2x1ZGUgPHRoaW5nL2Rlc2NyaXB0aW9uLmg+CisjaW5jbHVkZSA8dGhpbmcvbGFuZ3VhZ2UuaD4KKyN1bmRlZiBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDxoZWFsdGguaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8bmV3X3NraWxscy5oPgorI2luY2x1ZGUgPHNjb3JlbWFzdGVyLmg+CisjaW5jbHVkZSA8ZGVmdWVsLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGV2ZW50cy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorCisjZGVmaW5lIEFMQ09IT0xfVkFMVUUobikgbgorCisjaW5jbHVkZSA8ZGVidWdfaW5mby5oPiAvL3ZvcnVlYmVyZ2VoZW5kCisKKworLy8gJ3ByaXZhdGUnLVByb3RvdHlwZW4KK3ByaXZhdGUgdm9pZCBEaXN0cmlidXRlRXhwKG9iamVjdCBlbmVteSwgaW50IGV4cF90b19naXZlKTsKKworLy8gVmFyaWFibGVuCitub3NhdmUgaW50IGRlbGF5X2FsY29ob2w7IC8qIHRpbWUgdW50aWwgbmV4dCBhbGNvaG9sIGVmZmVjdCAqLworbm9zYXZlIGludCBkZWxheV9kcmluazsgICAvKiB0aW1lIHVudGlsIG5leHQgZHJpbmsgZWZmZWN0ICovCitub3NhdmUgaW50IGRlbGF5X2Zvb2Q7ICAgIC8qIHRpbWUgdW50aWwgbmV4dCBmb29kIGVmZmVjdCAqLworbm9zYXZlIGludCBkZWxheV9oZWFsOyAgICAvKiB0aW1lIHVudGlsIG5leHQgaGVhbCBlZmZlY3QgKi8KK25vc2F2ZSBpbnQgZGVsYXlfc3A7ICAgICAgLyogdGltZSB1bnRpbCBuZXh0IHNwIHJlZ2VuZXJhdGlvbiAqLworbm9zYXZlIGludCBkZWxheV9wb2lzb247ICAvKiB0aW1lIHVudGlsIG5leHQgcG9pc29uIGVmZmVjdCAqLworbm9zYXZlIGludCBkcm9wX3BvaXNvbjsKK25vc2F2ZSBtYXBwaW5nIGVuZW15X2RhbWFnZTsKK25vc2F2ZSBtYXBwaW5nIGhwX2J1ZmZlcjsKK25vc2F2ZSBtYXBwaW5nIHNwX2J1ZmZlcjsKK25vc2F2ZSBpbnQgcmVtb3ZlX21lOworaW50IG5leHRkZWZ1ZWx0aW1lZm9vZDsKK2ludCBuZXh0ZGVmdWVsdGltZWRyaW5rOworCisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgIFNldChQX0dIT1NULCBTQVZFLCBGX01PREUpOworICBTZXQoUF9GUk9HLCBTQVZFLCBGX01PREUpOworICBTZXQoUF9BTElHTiwgU0FWRSwgRl9NT0RFKTsKKyAgU2V0KFBfSFAsIFNBVkUsIEZfTU9ERSk7CisgIFNldChQX1NQLCBTQVZFLCBGX01PREUpOworICBTZXQoUF9YUCwgU0FWRSwgRl9NT0RFKTsKKyAgU2V0KCBQX0xBU1RfWFAsICh7ICIiLCAwIH0pICk7CisgIFNldCggUF9MQVNUX1hQLCBQUk9URUNURUQsIEZfTU9ERV9BUyApOworCisgIFNldChQX0FMQ09IT0wsIFNBVkUsIEZfTU9ERSk7CisgIFNldChQX0RSSU5LLCBTQVZFLCBGX01PREUpOworICBTZXQoUF9GT09ELCBTQVZFLCBGX01PREUpOworICBTZXQoUF9QT0lTT04sIFNBVkUsIEZfTU9ERSk7CisgIFNldChQX0RFQUYsIFNBVkUsIEZfTU9ERSk7CisKKyAgU2V0UHJvcChQX0ZPT0RfREVMQVksIEZPT0RfREVMQVkpOworICBTZXRQcm9wKFBfRFJJTktfREVMQVksIERSSU5LX0RFTEFZKTsKKyAgU2V0UHJvcChQX0FMQ09IT0xfREVMQVksIEFMQ09IT0xfREVMQVkpOworICBTZXRQcm9wKFBfSFBfREVMQVksSEVBTF9ERUxBWSk7CisgIFNldFByb3AoUF9TUF9ERUxBWSxIRUFMX0RFTEFZKTsKKyAgU2V0UHJvcChQX1BPSVNPTl9ERUxBWSxQT0lTT05fREVMQVkpOworICAvLyBkZWZhdWx0IGZ1ZXIgYWxsZSBMZWJld2VzZW4gKE5QQyArIFNwaWVsZXIpOgorICBTZXRQcm9wKFBfTUFYX1BPSVNPTiwgMTApOworICBTZXRQcm9wKFBfQ09SUFNFLCAiL3N0ZC9jb3Jwc2UiKTsKKworICBuZXh0ZGVmdWVsdGltZWZvb2Q9dGltZSgpK1F1ZXJ5UHJvcChQX0RFRlVFTF9USU1FX0ZPT0QpOworICBuZXh0ZGVmdWVsdGltZWRyaW5rPXRpbWUoKStRdWVyeVByb3AoUF9ERUZVRUxfVElNRV9EUklOSyk7CisKKyAgZW5lbXlfZGFtYWdlPShbOjIgXSk7CisgIGhwX2J1ZmZlcj0oW10pOworICBzcF9idWZmZXI9KFtdKTsKKworICBTZXRQcm9wKFBfREVGVUVMX0xJTUlUX0ZPT0QsMSk7CisgIFNldFByb3AoUF9ERUZVRUxfTElNSVRfRFJJTkssMSk7CisgIFNldFByb3AoUF9ERUZVRUxfVElNRV9GT09ELDEpOworICBTZXRQcm9wKFBfREVGVUVMX1RJTUVfRFJJTkssMSk7CisgIFNldFByb3AoUF9ERUZVRUxfQU1PVU5UX0ZPT0QsMSk7CisgIFNldFByb3AoUF9ERUZVRUxfQU1PVU5UX0RSSU5LLDEpOworCisgIG9mZmVySG9vayhIX0hPT0tfRElFLDEpOworCisgIG9mZmVySG9vayhIX0hPT0tfRk9PRCwxKTsKKyAgb2ZmZXJIb29rKEhfSE9PS19EUklOSywxKTsKKyAgb2ZmZXJIb29rKEhfSE9PS19BTENPSE9MLDEpOworICBvZmZlckhvb2soSF9IT09LX1BPSVNPTiwxKTsKKyAgb2ZmZXJIb29rKEhfSE9PS19DT05TVU1FLDEpOworfQorCisvLyBXZW5uIGRlciBsZXR6dGUgS2FtcGYgbGFuZyBoZXIgaXN0IHVuZCBkYXMgTGViZXdlc2VuIHdpZWRlciB2b2xsZ2VoZWlsdAorLy8gaXN0LCB3aXJkIFBfRU5FTVlfREFNQUdFIHp1cnVlY2tnZXNldHp0LgorcHJvdGVjdGVkIHZvaWQgUmVzZXRFbmVteURhbWFnZSgpIHsKKyAgaWYgKHRpbWUoKSA+IFF1ZXJ5UHJvcChQX0xBU1RfQ09NQkFUX1RJTUUpICsgX19SRVNFVF9USU1FX18gKiA0CisgICAgICAmJiBRdWVyeVByb3AoUF9IUCkgPT0gUXVlcnlQcm9wKFBfTUFYX0hQKSkKKyAgICBlbmVteV9kYW1hZ2U9KFs6MiBdKTsKK30KKworcHJpdmF0ZSB2b2lkIERpc3RyaWJ1dGVFeHAob2JqZWN0IGVuZW15LCBpbnQgZXhwX3RvX2dpdmUpIHsKKyAgaW50IHRvdGFsX2RhbWFnZSwgdG1wLCBleDsKKyAgbWFwcGluZyBwcmVzZW50X2VuZW1pZXM7CisKKyAgaWYgKCBleHBfdG9fZ2l2ZTw9MCApCisgICAgcmV0dXJuOworCisgIG1hcHBpbmcgZW5kbWc9ZGVlcF9jb3B5KGVuZW15X2RhbWFnZSk7CisKKyAgLy8gTWl0Z2xpZWRlciBpbSBUZWFtIGRlcyBLaWxsZXJzIGJla29tbWVuOgorICAvLworICAvLyAgICAgICAgICAgICAgICAgIEdlc2FtdGFudGVpbCBkZXMgVGVhbXMKKyAgLy8gRWlnZW5lbiBBbnRlaWwgKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vICAgICAgICAgICAgICAgICAgQW56YWhsICBUZWFtbWl0Z2xpZWRlcgorICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gICAgICAgICAgICAgICAgMgorICAvLworICBvYmplY3QgKmludiA9IGVuZW15LT5UZWFtTWVtYmVycygpOworICBpZiAoIHBvaW50ZXJwKGludikgKQorICB7CisgICAgcHJlc2VudF9lbmVtaWVzPW1fYWxsb2NhdGUoc2l6ZW9mKGludiksIDEpOworICAgIGZvcmVhY2gob2JqZWN0IG9iOiBpbnYpCisgICAgeworICAgICAgaWYgKCBvYmplY3RwKG9iKSAmJiAoZW52aXJvbm1lbnQob2IpPT1lbnZpcm9ubWVudCgpKSApCisgICAgICB7CisgICAgICAgIHRtcD1lbmRtZ1tvYmplY3RfbmFtZShvYildOworICAgICAgICB0b3RhbF9kYW1hZ2UrPXRtcDsKKyAgICAgICAgcHJlc2VudF9lbmVtaWVzW29iXSA9IHRtcC8yOworICAgICAgICBtX2RlbGV0ZShlbmRtZyxvYmplY3RfbmFtZShvYikpOyAvL3MudS4KKyAgICAgIH0KKyAgICB9CisgICAgaW50IG1pdGdsaWVkZXIgPSBzaXplb2YocHJlc2VudF9lbmVtaWVzKTsKKyAgICBpZiAoIG1pdGdsaWVkZXIgKQorICAgIHsKKyAgICAgIHRtcD10b3RhbF9kYW1hZ2UvKDIqbWl0Z2xpZWRlcik7CisgICAgICBmb3JlYWNoKG9iamVjdCBvYiwgaW50IHB1bmt0ZTogJnByZXNlbnRfZW5lbWllcykKKyAgICAgICAgcHVua3RlICs9IHRtcDsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgLy8gb2huZSBUZWFtIHdpcmQgdHJvdHpkZW0gZWluIE1hcHBpbmcgZ2VicmF1Y2h0LiBEYSBHcm9lc3NlbnZlcmFlbmRlcnVuZworICAgIC8vIHJlbC4gdGV1ZXIgc2luZCwga2FubiBlaW5mYWNoIG1hbCBmdWVyIDMgRWludHJhZWdlIFBsYXR6IHJlc2VydmllcmVuLgorICAgIHByZXNlbnRfZW5lbWllcz1tX2FsbG9jYXRlKDMsIDEpOworICB9CisgIC8vIFVuZCBub2NoIGRpZSBMZWJld2VzZW4gaW0gUmF1bSBvaG5lIFRlYW0uCisgIGZvcmVhY2gob2JqZWN0IG9iOiBhbGxfaW52ZW50b3J5KGVudmlyb25tZW50KCkpKQorICB7CisgICAgaWYgKCB0bXA9ZW5kbWdbb2JqZWN0X25hbWUob2IpXSApCisgICAgeworICAgICAgdG90YWxfZGFtYWdlICs9IHRtcDsKKyAgICAgIHByZXNlbnRfZW5lbWllc1tvYl0gPSB0bXA7CisgICAgICBtX2RlbGV0ZShlbmRtZyxvYmplY3RfbmFtZShvYikpOyAvLyBOdXIgZWlubWFsIHBybyBMZWJlbiBQdW5rdGUgOikKKyAgICB9CisgIH0KKyAgaWYgKCAhdG90YWxfZGFtYWdlICkKKyAgeworICAgIGVuZW15LT5BZGRFeHAoZXhwX3RvX2dpdmUpOworICB9CisgIGVsc2UKKyAgeworICAgIGZvcmVhY2gob2JqZWN0IG9iLCBpbnQgZGFtYWdlOiBwcmVzZW50X2VuZW1pZXMpCisgICAgeworICAgICAgaWYgKCAhb2JqZWN0cChvYikgKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGlmICggcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYikgJiYgKCAhaW50ZXJhY3RpdmUob2IpCisgICAgICAgICAgICAgIHx8IChxdWVyeV9pZGxlKG9iKT42MDApICkgKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vZXhwX3RvX2dpdmUqcHJlc2VudF9lbmVtaWVzW2ldWzFdL3RvdGFsX2RhbWFnZSBnaWJ0IGJlaSB2aWVsIFNjaGFkZW4KKyAgICAgIC8vZWluZW4gbnVtZXJpY2FsIG92ZXJmbG93LiBEYWhlciBtdWVzc2VuIHdpciBoaWVyIHdvaGwgZG9jaAorICAgICAgLy96d2lzY2hlbnplaXRsaWNoIG1pdCBmbG9hdHMgcmVjaG5lbiwgYXVjaCB3ZW5uIGRhcyAwLTEgWFAgVmVybHVzdAorICAgICAgLy9kdXJjaCBmbG9hdC0+aW50LUtvbnZlcnNpb24gZ2lidC4gKGNlaWwoKSBsb2hudCBzaWNoIElNSE8gbmljaHQuKQorICAgICAgZXggPSAoaW50KShleHBfdG9fZ2l2ZSooKGZsb2F0KWRhbWFnZS8oZmxvYXQpdG90YWxfZGFtYWdlKSk7CisgICAgICBvYi0+QWRkRXhwKGV4KTsKKyAgICB9CisgIH0KK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gb3RoZXIgcGxheWVycyB3aGVuIHRoZXkgd2FudCB0byBtYWtlCisgKiBkYW1hZ2UgdG8gdXMuIEJ1dCBpdCB3aWxsIG9ubHkgYmUgY2FsbGVkIGluZGlyZWN0bHkuCisgKiBXZSByZXR1cm4gaG93IG11Y2ggZGFtYWdlIHdlIHJlY2VpdmVkLCB3aGljaCB3aWxsCisgKiBjaGFuZ2UgdGhlIGF0dGFja2VycyBzY29yZS4gVGhpcyByb3V0aW5lIGlzIHByb2JhYmx5IGNhbGxlZCBmcm9tCisgKiBoZWFydF9iZWF0KCkgZnJvbSBhbm90aGVyIHBsYXllci4KKyAqIENvbXBhcmUgdGhpcyBmdW5jdGlvbiB0byByZWR1Y2VfaGl0X3BvaW50cyhkYW0pLgorICovCitwdWJsaWMgaW50IGRvX2RhbWFnZShpbnQgZGFtLCBvYmplY3QgZW5lbXkpCit7IGludCBoaXRfcG9pbnQsYWwsYWwyOworCisgIGlmICggZXh0ZXJuX2NhbGwoKQorICAgICAgJiYgb2JqZWN0cChlbmVteSkKKyAgICAgICYmIGxpdmluZyhlbmVteSkKKyAgICAgICYmICFRdWVyeVByb3AoUF9FTkFCTEVfSU5fQVRUQUNLX09VVCkpCisgIHsKKyAgICBhbD10aW1lKCktZW5lbXktPlF1ZXJ5UHJvcChQX0xBU1RfTU9WRSk7CisgICAgaWYgKGFsPDMpICAgICAgLy8gRXJzdGUgS2FtcGZydW5kZSBuYWNoIEJldHJldGVuIGRlcyBSYXVtZXM/CisgICAgICBkYW0vPSg0LWFsKTsgLy8gR2VnZW4gUmVpbi1GZXVlcmJhbGwtUmF1cy1UYWt0aWsKKyAgfQorCisgIGlmICggUXVlcnlQcm9wKFBfR0hPU1QpIHx8IFF1ZXJ5UHJvcChQX05PX0FUVEFDSykgfHwgKGRhbTw9MCkKKyAgICAgIHx8ICggb2JqZWN0cChlbmVteSkKKyAgICAgICAgICAmJiAoIGVuZW15LT5RdWVyeVByb3AoUF9HSE9TVCkKKyAgICAgICAgICAgICAgfHwgZW5lbXktPlF1ZXJ5UHJvcChQX05PX0FUVEFDSykgKSApICkKKyAgICByZXR1cm4gMDsKKworICBoaXRfcG9pbnQgPSBRdWVyeVByb3AoUF9IUCktZGFtOworCisgIGlmICggUXVlcnlQcm9wKFBfWFApICYmIG9iamVjdHAoZW5lbXkpICkKKyAgeworICAgIGlmICggIVF1ZXJ5UHJvcChQX05PX1hQKSApCisgICAgICBlbmVteS0+QWRkRXhwKGRhbSooaW50KVF1ZXJ5UHJvcChQX1RPVEFMX1dDKS8xMCk7CisgIH0KKworICBpZiAobGl2aW5nKGVuZW15KSkgeworICAgICAgc3RyaW5nIGVubmFtZSA9IG9iamVjdF9uYW1lKGVuZW15KTsKKyAgICAgIC8vIEhtcGYuIEJsdWVwcmludHMgc2luZCBkb29mLiBEaWUgQ2hhbmNlIGlzdCB6d2FyIGdlcmluZywgYWJlciBrb2VubnRlCisgICAgICAvLyBzZWluLCBkYXNzIGVpbiBVbmlxdWUtTlBDIG1pdCB6d2VpIHZlcnNjaGllZGVuZW4gU3BpZWxlcm4gYW0gZ2xlaWNoZW4KKyAgICAgIC8vIE5QQyBtZXR6ZWx0LgorICAgICAgLy8gVE9ETzogTUhtbS4gd2llIGdyb3NzIGlzdCBkYXMgUmlzaWtvIHdpcmtsaWNoPworICAgICAgLy9pZiAoIWNsb25lcChlbmVteSkpCisgICAgICAvLyAgICBlbm5hbWUgPSBlbm5hbWUgKyAiXyIgKyB0b19zdHJpbmcob2JqZWN0X3RpbWUoZW5lbXkpKTsKKyAgICAgIC8vIG51ciB3ZW5uIGdlZ25lciBOUEMgaXN0IHVuZCBub2NoIG5pY2h0IGRyaW5zdGVodDogRGF0ZW4gYXVzCisgICAgICAvLyBQX0hFTFBFUl9OUEMgYXVzd2VydGVuCisgICAgICBpZiAoIW1lbWJlcihlbmVteV9kYW1hZ2UsZW5lbXkpICYmICFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKGVuZW15KSkgeworICAgICAgICAgIG1peGVkIGhlbHBlciA9IGVuZW15LT5RdWVyeVByb3AoUF9IRUxQRVJfTlBDKTsKKyAgICAgICAgICBpZiAocG9pbnRlcnAoaGVscGVyKSAmJiBvYmplY3RwKGhlbHBlclswXSkpCisgICAgICAgICAgICAgIGVuZW15X2RhbWFnZVtlbm5hbWUsMV0gPSBoZWxwZXJbMF07CisgICAgICB9CisgICAgICBlbmVteV9kYW1hZ2VbZW5uYW1lLDBdKz1kYW07CisgIH0KKworICBTZXRQcm9wKFBfSFAsIGhpdF9wb2ludCk7CisKKyAgaWYgKCBoaXRfcG9pbnQ8MCApCisgIHsKKyAgICAvL1RPRE86IFdhcnVtIG5pY2h0IGRhcyBnYW56ZSBaZXVnIGlucyBkaWUoKSB2ZXJsZWdlbj8KKyAgICBpZiAoIGVuZW15ICkKKyAgICB7CisgICAgICBlbmVteS0+U3RvcEh1bnRGb3IoTUUsMSk7CisgICAgICBpZiAoICFRdWVyeVByb3AoUF9OT19YUCkgKQorICAgICAgICBEaXN0cmlidXRlRXhwKGVuZW15LFF1ZXJ5UHJvcChQX1hQKS8xMDApOworICAgICAgaWYgKCAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShNRSkgKQorICAgICAgICBsb2dfZmlsZSAoIk5QQ19YUCIsIHNwcmludGYoCisJICAgICJbJXNdICVzLCBYUDogJWQsIEhQKldDOiAlZCwgS2lsbGVyOiAlc1xuIiwKKwkgICAgZHRpbWUodGltZSgpKSwgb2JqZWN0X25hbWUoTUUpLCAoUXVlcnlQcm9wKFBfWFApLzEwMCksCisgICAgICAgICAgICAgICAgICBRdWVyeVByb3AoUF9UT1RBTF9XQykqUXVlcnlQcm9wKFBfTUFYX0hQKS8xMCwKKyAgICAgICAgICAgICAgICAgIGVuZW15LT5uYW1lKCl8fCJOb05hbWUiICkpOworICAgICAgYWwgPSBRdWVyeVByb3AoUF9BTElHTikvNTAgKyBlbmVteS0+UXVlcnlQcm9wKFBfQUxJR04pLzIwMDsKKyAgICAgIGlmIChhbD4yMCkKKyAgICAgICAgYWw9MjA7CisgICAgICBlbHNlIGlmKGFsPC0yMCkKKyAgICAgICAgYWw9LTIwOworICAgICAgZW5lbXktPlNldFByb3AoUF9BTElHTixlbmVteS0+UXVlcnlQcm9wKFBfQUxJR04pLWFsKTsKKyAgICB9CisgICAgU2V0UHJvcChQX0tJTExFUiwgZW5lbXkpOworICAgIAorICAgIGRpZSgpOworICB9CisgIHJldHVybiBkYW07Cit9CisKKworcHJpdmF0ZSB2b2lkIF90cmFuc2Zlciggb2JqZWN0ICpvYnMsIHN0cmluZ3xvYmplY3QgZGVzdCwgaW50IGZsYWcgKQoreyAgIGludCBpOworCisgICAgaSA9IHNpemVvZihvYnMpOworCisgICAgLy8gRWluZSBTY2hsZWlmZSBpc3QgendhciBsYW5nc2FtZXIgYWxzIGZpbHRlcigpIG8uYWUuLCBhYmVyCisgICAgLy8gc2VsYnN0IG1pdCBlaW5lciBub2NoIHNvIHNjaG5lbGxlbiBMb2VzdW5nIGthbm4gbGVpZGVyIG5pY2h0CisgICAgLy8gYXVzZ2VzY2hsb3NzZW4gd2VyZGVuLCBkYXNzIGlyZ2VuZHdvIGVpbiB0b28tbG9uZy1ldmFsLUJ1ZyBkYXp3aXNjaGVuCisgICAgLy8ga29tbXQuIERhenUgc2luZCBkaWUgS2FlbXBmZSBtaXQgR2lsZGVuLU5QQ3MgZXRjLiBlaW5mYWNoIHp1IHRldWVyIC4uLgorICAgIC8vIFBydWVmdW5nIGF1ZiB6ZXJzdG9lcnRlIE9iamVrdGUsIGRhIGVpbmlnZSBzaWNoIGV2dGwuIGltIE5vdGlmeVBsYXllckRlYXRoKCkgCisgICAgLy8gemVyc3RvZXJlbi4KKyAgIHdoaWxlICggaSAmJiBnZXRfZXZhbF9jb3N0KCkgPiAzMDAwMDAgKQorICAgICAgICBpZiAoIG9iamVjdHAob2JzWy0taV0pICYmICFvYnNbaV0tPlF1ZXJ5UHJvcChQX05FVkVSRFJPUCkgKQorICAgICAgICAvLyBKZXR6dCB3aXJkJ3Mgbm9jaCBldHdhcyB0ZXVyZXIgbWl0IGNhdGNoKCkgLSBhYmVyIG1hbmNoZSBTYWNoZW4KKyAgICAgICAgLy8gZHVlcmZlbiBlaW5mYWNoIG5pY2h0IGJ1Z2dlbgorICAgICAgICAgICAgY2F0Y2goIG9ic1tpXS0+bW92ZSggZGVzdCwgZmxhZyApO3B1Ymxpc2ggKTsKKworICAgIGlmICggaSA+IDAgKQorICAgICAgICAvLyBadXZpZWwgUmVjaGVuemVpdCB2ZXJicmF0ZW4sIGVzIG11ZXNzZW4gbm9jaCBPYmpla3RlIGJld2VndCB3ZXJkZW4KKyAgICAgICAgY2FsbF9vdXQoICMnX3RyYW5zZmVyLCAwLCBvYnNbMC4uaS0xXSwgZGVzdCwgZmxhZyApOworICAgIGVsc2UgeworICAgICAgICBpZiAoIHJlbW92ZV9tZSApCisgICAgICAgICAgICByZW1vdmUoKTsKKyAgICB9Cit9CisKKworcHVibGljIHZhcmFyZ3Mgdm9pZCB0cmFuc2Zlcl9hbGxfdG8oIHN0cmluZ3xvYmplY3QgZGVzdCwgaW50IGlzbnBjICkgeworICAgIGludCBmbGFnczsKKyAgICBvYmplY3QgKm9iczsKKworICAgIGlmICggIW9iamVjdHAoTUUpICkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gRGFzIEZsYWcgImlzbnBjIiBpc3QgZnVlciBOUENzIGdlZGFjaHQuIERlcmVuIEF1c3J1ZXN0dW5nIGRhcmYgbmljaHQKKyAgICAvLyBtaXQgTV9OT0NIRUNLIGJld2VndCB3ZXJkZW4sIGRhIFNwaWVsZXIgZGFzIGJlaSBOaWNodC1TdGFuZGFyZC1MZWljaGVuCisgICAgLy8gc29uc3QgdS5VLiBhdXNudXR6ZW4ga29lbm50ZW4uCisgICAgaWYgKCBpc25wYyApCisgICAgICAgIGZsYWdzID0gTV9TSUxFTlQ7CisgICAgZWxzZQorICAgICAgICBmbGFncyA9IE1fU0lMRU5UfE1fTk9DSEVDSzsKKworICAgIG9icyA9IGFsbF9pbnZlbnRvcnkoTUUpIHx8ICh7fSk7CisKKyAgICAvLyB1bm5vZXRpZywgd2VpbCBfdHJhbnNmZXIoKSBhdWNoIGF1ZiBQX05FVkVSRFJPUCBwcnVlZnQuIFplc3N0cmEKKyAgICAvL29icyAtPSBmaWx0ZXJfb2JqZWN0cyggb2JzLCAiUXVlcnlQcm9wIiwgUF9ORVZFUkRST1AgKTsKKworICAgIF90cmFuc2Zlciggb2JzLCBkZXN0LCBmbGFncyApOworfQorCisKK3Byb3RlY3RlZCB2YXJhcmdzIHZvaWQgY3JlYXRlX2tpbGxfbG9nX2VudHJ5KHN0cmluZyBraWxsZXIsIG9iamVjdCBlbmVteSkgeworICBpbnQgbGV2ZWwsbG9zdF9leHA7CisKKyAgaWYgKCAobGV2ZWw9UXVlcnlQcm9wKFBfTEVWRUwpKTwyMCB8fCAhSVNfU0VFUihNRSkgKQorICAgIGxvc3RfZXhwID0gUXVlcnlQcm9wKFBfWFApLzM7CisgIGVsc2UKKyAgICBsb3N0X2V4cCA9IFF1ZXJ5UHJvcChQX1hQKS8obGV2ZWwtMTcpOworICAKKyAgbG9nX2ZpbGUoIktJTExTIixzcHJpbnRmKCIlcyAlcyAoJWQsJWQpICVzXG4iLCBzdHJmdGltZSgiJWUgJWIgJUg6JU0iKSwKKyAgICAgICAgICAgICAgIGNhcGl0YWxpemUoUkVBTF9VSUQoTUUpKSwgbGV2ZWwsIGxvc3RfZXhwLzEwMDAsIGtpbGxlcikpOyAKK30KKworLy8gTGllZmVydCBpbSBUb2QgKG5hY2ggZGVtIHRvZXRlbmRlbiBkb19kYW1hZ2UoKSkgZGFzIFNwaWVsZXJvYmpla3QsIHdhcyBkZW4KKy8vIFRvZCB3b2hsIHp1IHZlcmFudHdvcnRlbiBoYXQsIGZhbGxzIGVzIGVybWl0dGVsdCB3ZXJkZW4ga2Fubi4gRXMgd2VyZGVuIHZvcgorLy8gYWxsZW0gcmVnaXN0cmllcnRlIEhlbGZlci1OUEMgdW5kIGVpbmlnZSBTb25kZXJvYmpla3RlIGJlcnVlY2tzaWNodGlndC4KK3Byb3RlY3RlZCBvYmplY3QgZ2V0X2tpbGxpbmdfcGxheWVyKCkKK3sKKyAgb2JqZWN0IGtpbGxlcj1RdWVyeVByb3AoUF9LSUxMRVIpOworICAvLyBrb2VubnRlIHNlaW4sIHdlbm4gYXVzc2VyaGFsYiBkZXMgVG9kZXMgZ2VydWZlbiBvZGVyIGVpbmUgVmVyZ2lmdHVuZyB1bnMKKyAgLy8gdW1nZWJyYWNodCBoYXQuCisgIGlmICghb2JqZWN0cChraWxsZXIpKQorICAgIHJldHVybiAwOworCisgIHdoaWxlIChraWxsZXIgJiYgIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoa2lsbGVyKSkKKyAgICBraWxsZXIgPSBraWxsZXItPlF1ZXJ5VXNlcigpOworCisgIHJldHVybiBraWxsZXI7Cit9CisKK3Byb3RlY3RlZCBvYmplY3QgR2l2ZUtpbGxTY29yZShvYmplY3QgcGwsIGludCBucGNudW0pCit7CisgIC8vIFN0dWZlbnB1bmt0IGZ1ZXIgZGVuIEtpbGwgdmVyZ2ViZW4uCisgIC8vIEZhbGxzIGRlciBLaWxsZXIgZGVuIFB1bmt0IHNjaG9uIGhhdCwgd2lyZAorICAvLyB6dWZhZWxsaWcgZWluIE1pdGdsaWVkIHNlaW5lcyBUZWFtcyBhdXNnZXdhZWhsdAorICAvLyB1bmQgZGllc2VtIGRlciBQdW5rdCBnZWdlYmVuLgorICBvYmplY3QgKm9icyxvYjsKKyAgbWl4ZWQgKmZyOworICBpbnQgaSxqLHN6OworCisgIGlmICggcG9pbnRlcnAob2JzPXBsLT5UZWFtTWVtYmVycygpKSAmJiAobWVtYmVyKG9icyxwbCk+PTApICkKKyAgeworICAgIGlmICggIXBvaW50ZXJwKGZyPXBsLT5QcmVzZW50VGVhbVJvd3MoKSkKKyAgICAgICAgfHwgIXNpemVvZihmcikKKyAgICAgICAgfHwgIXBvaW50ZXJwKGZyPWZyWzBdKSkgLy8gRXJzdGUgUmVpaGUgZGVzIFRlYW1zCisgICAgICBmcj0oe30pOworICAgIGZyLT0oe3BsLDB9KTsKKyAgICBvYnMtPSh7cGwsMH0pOworICAgIG9icy09ZnI7CisgICAgaT1zej1zaXplb2Yob2JzKTsgLy8gcmVzdGxpY2hlIFRlYW1taXRnbGllZGVyIGluIHp1ZmFlbGxpZ2VyIFJlaWhlbmZvbGdlOgorICAgIGZvciAoIC0taSA7IGk+PTAgOyBpLS0gKQorICAgIHsKKyAgICAgIGo9cmFuZG9tKHN6KTsKKyAgICAgIG9iPW9ic1tqXTsKKyAgICAgIG9ic1tqXT1vYnNbMF07CisgICAgICBvYnNbMF09b2I7CisgICAgfQorICAgIGk9c3o9c2l6ZW9mKGZyKTsgIC8vIEVyc3RlIFJlaWhlIGluIHp1ZmFlbGxpZ2VyIFJlaWhlbmZvbGdlOgorICAgIGZvciAoIC0taSA7IGk+PTAgOyBpLS0gKQorICAgIHsKKyAgICAgIGo9cmFuZG9tKHN6KTsKKyAgICAgIG9iPWZyW2pdOworICAgICAgZnJbal09ZnJbMF07CisgICAgICBmclswXT1vYjsKKyAgICB9CisKKyAgICBvYnMrPWZyOyAgICAgLy8gRXJzdGUgUmVpaGUgd2lyZCB2b3IgUmVzdCBnZXRlc3RldAorICAgIG9icys9KHtwbH0pOyAvLyBLaWxsZXIgd2lyZCBhbHMgZXJzdGVzIGdldGVzdGV0CisgIH0KKyAgZWxzZQorICB7CisgICAgb2JzPSh7cGx9KTsKKyAgfQorICBmb3IgKCBpPXNpemVvZihvYnMpLTEgOyBpPj0wIDsgaS0tICkKKyAgICBpZiAoIG9iamVjdHAob2I9b2JzW2ldICkKKyAgICAgICAgJiYgaW50ZXJhY3RpdmUob2IpICAgICAvLyBOdXIgbmV0enRvdCBkYWJlaSBzdGVoZW4gZ2lsdCBuaWNodCA6KQorICAgICAgICAmJiBxdWVyeV9pZGxlKG9iKTw2MDAgIC8vIGdlZ2VuIExldXRlIGRpZSBzaWNoIG51ciBtaXRzY2hsZXBwZW4gbGFzc2VuCisgICAgICAgICYmIGVudmlyb25tZW50KG9iKT09ZW52aXJvbm1lbnQocGwpIC8vIE51ciBhbndlc2VuZGUgVGVhbW1pdGdsaWVkZXIKKyAgICAgICAgJiYgIUlTX0xFQVJORVIob2IpCisvLyAgICAgICAgJiYgIW9iLT5RdWVyeVByb3AoUF9URVNUUExBWUVSKQorICAgICAgICAmJiAhKFNDT1JFTUFTVEVSLT5IYXNLaWxsKG9iLE1FKSkgKQorICAgICAgcmV0dXJuIFNDT1JFTUFTVEVSLT5HaXZlS2lsbChvYixucGNudW0pLG9iOworCisgIHJldHVybiBTQ09SRU1BU1RFUi0+R2l2ZUtpbGwocGwsbnBjbnVtKSxwbDsKK30KKworLy8genVtIHVlYmVyc2NocmVpYmVuIGluIFNwaWVsZXJuCitwdWJsaWMgaW50IGRlYXRoX3N1ZmZlcmluZygpIHsKKyAgcmV0dXJuIDA7IC8vIE5QQyBoYWJlbiBrZWluZSBUb2Rlc2ZvbGdlbgorfQorCisvLyBrZWluIDIuIExlYmVuIGZ1ZXIgTmljaHQtU3BpZWxlci4gOy0pCit2YXJhcmdzIHByb3RlY3RlZCBpbnQgc2Vjb25kX2xpZmUoIG9iamVjdCBjb3Jwc2UgKSB7CisgICAgcmV0dXJuIDA7Cit9CisKK3B1YmxpYyB2YXJhcmdzIHZvaWQgZGllKCBpbnQgcG9pc29uZGVhdGgsIGludCBleHRlcm4gKQoreyAgIG9iamVjdCBjb3Jwc2U7CisgICAgc3RyaW5nIGRpZV9tc2csIHRtcDsKKyAgICBtaXhlZCByZXM7CisgICAgbWl4ZWQgaG9va0RhdGE7CisgICAgbWl4ZWQgaG9va1JlczsKKworICAgIGlmICggIW9iamVjdHAodGhpc19vYmplY3QoKSkgfHwgUXVlcnlQcm9wKFBfR0hPU1QpICkKKyAgICAgICAgcmV0dXJuOyAvLyBHaG9zdHMgZG9udCBkaWUgLi4uCisKKyAgICAvLyBkaXJla3Qgdm9uIGV4dGVybiBhdWZnZXJ1ZmVuIHVuZCBuaWNodCB1ZWJlciBoZWFydF9iZWF0KCkgb2RlcgorICAgIC8vIGRvX2RhbWFnZSgpIGhpZXJoZXIgZ2VsYW5ndD8KKyAgICBpZiAoZXh0ZXJuX2NhbGwoKSAmJiBwcmV2aW91c19vYmplY3QoKSAhPSB0aGlzX29iamVjdCgpKSB7CisgICAgICBleHRlcm49MTsKKyAgICAgIFNldFByb3AoUF9LSUxMRVIsIHByZXZpb3VzX29iamVjdCgpKTsKKyAgICB9CisKKyAgICBpZiAoIHJlcyA9IFF1ZXJ5UHJvcChQX1RNUF9ESUVfSE9PSykgKXsKKyAgICAgICAgaWYgKCBwb2ludGVycChyZXMpICYmIHNpemVvZihyZXMpPj0zCisgICAgICAgICAgICAmJiBpbnRwKHJlc1swXSkgJiYgdGltZSgpPHJlc1swXQorICAgICAgICAgICAgJiYgb2JqZWN0cChyZXNbMV0pICYmIHN0cmluZ3AocmVzWzJdKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggcmVzID0gY2FsbF9vdGhlciggcmVzWzFdLCByZXNbMl0sIHBvaXNvbmRlYXRoICkgKSB7CisgICAgICAgICAgICAgIFNldFByb3AoUF9LSUxMRVIsMCk7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBTZXRQcm9wKFBfVE1QX0RJRV9IT09LLDApOworICAgIH0KKworICAgIC8vIHRyaWdnZXIgZGllIGhvb2sKKyAgICBob29rRGF0YT1wb2lzb25kZWF0aDsKKyAgICBob29rUmVzPUhvb2tGbG93KEhfSE9PS19ESUUsaG9va0RhdGEpOworICAgIGlmIChwb2ludGVycChob29rUmVzKSAmJiBzaXplb2YoaG9va1Jlcyk+SF9SRVREQVRBKXsKKyAgICAgIGlmKGhvb2tSZXNbSF9SRVRDT0RFXT09SF9DQU5DRUxMRUQpIHsKKyAgICAgICAgU2V0UHJvcChQX0tJTExFUiwwKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgZWxzZSBpZiAoaG9va1Jlc1tIX1JFVENPREVdPT1IX0FMVEVSRUQpCisgICAgICAgICAgcG9pc29uZGVhdGggPSBob29rUmVzW0hfUkVUREFUQV07CisgICAgfQorCisgICAgaWYgKCBJU19MRUFSTklORyhNRSkgJiYgcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShNRSkgKXsKKyAgICAgICB0ZWxsX29iamVjdCggTUUsICJTZWkgZnJvaCBkYXNzIER1IHVuc3RlcmJsaWNoIGJpc3QsIHNvbnN0IHdhZXJlIGVzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJlYmVuIERlaW4gRW5kZSBnZXdlc2VuLlxuIik7CisgICAgICAgU2V0UHJvcChQX0tJTExFUiwwKTsKKyAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gR2VnbmVyIGJlZnJpZWRlbi4KKyAgICBtYXBfb2JqZWN0cyggUXVlcnlFbmVtaWVzKClbMF0sICJTdG9wSHVudEZvciIsIE1FLCAxICk7CisgICAgU3RvcEh1bnRpbmdNb2RlKDEpOworCisgICAgLy8gRmFsbHMgZGllKCkgZGlyZWt0IGF1ZmdlcnVmZW4gd3VyZGUgdW5kIGRpZXMgZWluIFNwaWVsZXIgaXN0LCBtdXNzIGRhcworICAgIC8vIGRpZSgpIG5vY2ggRWludHJhZWdlIGluIC9sb2cvS0lMTFMgdmlhIGNyZWF0ZV9raWxsX2xvZ19lbnRyeSBiencuIGluCisgICAgLy8gL2xvZy9LSUxMRVIgZXJzdGVsbGVuLgorICAgIGlmICggcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShNRSkgJiYgZXh0ZXJuICkKKyAgICB7CisgICAgICBvYmplY3Qga2lsbGVyID0gUXVlcnlQcm9wKFBfS0lMTEVSKSAKKyAgICAgICAgICAgICAgICAgICAgIHx8IHByZXZpb3VzX29iamVjdCgpIHx8IHRoaXNfaW50ZXJhY3RpdmUoKSB8fCB0aGlzX3BsYXllcigpOworICAgICAgaWYgKCBraWxsZXIgJiYgIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoa2lsbGVyKSApCisgICAgICB7CisgICAgICAgICAgdG1wID0gZXhwbG9kZSggb2JqZWN0X25hbWUoa2lsbGVyKSwgIiMiKVswXSArICIgKGRpcmVrdCAhKSI7CisKKyAgICAgICAgICBjcmVhdGVfa2lsbF9sb2dfZW50cnkoIHRtcCArICIgKCIgKyBSRUFMX1VJRChraWxsZXIpICsgIikiLCBraWxsZXIgKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCBraWxsZXIgJiYgIVF1ZXJ5UHJvcChQX1RFU1RQTEFZRVIpICYmICFJU19MRUFSTkVSKE1FKSApCisgICAgICB7CisgICAgICAgICAgbG9nX2ZpbGUoICJLSUxMRVIiLCBzcHJpbnRmKCAiJXMgJXMgKCVkLyVkKSB0b2V0ZXRlICVzICglZC8lZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdGltZSh0aW1lKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoa2lsbGVyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeV93aXpfbGV2ZWwoa2lsbGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbGxlci0+UXVlcnlQcm9wKFBfTEVWRUwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoTUUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5X3dpel9sZXZlbChNRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWVyeVByb3AoUF9MRVZFTCkgKSApOworCisgICAgICAgICAga2lsbGVyLT5TZXRQcm9wKCBQX0tJTExTLCAtMSApOworICAgICAgfQorICAgIH0KKworICAvLyBCZWkgTlBDIEVLcyB2ZXJnZWJlbiB1bmQgZ2dmLiBpbiBkZXIgR2lsZGUgZGVzIEtpbGxlcnMgdW5kIGltIFJhdW0KKyAgLy8gTlBDX0tpbGxlZF9CeSgpIHJ1ZmVuLgorICBpZiAoICFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKE1FKSApCisgIHsKKyAgICBvYmplY3Qga2lsbGVyID0gKChvYmplY3QpIFF1ZXJ5UHJvcChQX0tJTExFUikpIHx8IHByZXZpb3VzX29iamVjdCgpIHx8CisgICAgICB0aGlzX2ludGVyYWN0aXZlKCkgfHwgdGhpc19wbGF5ZXIoKTsKKworICAgIGlmICgga2lsbGVyICYmIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoa2lsbGVyKSApCisgICAgeworICAgICAgaWYgKHN0cmluZ3AocmVzPWtpbGxlci0+UXVlcnlQcm9wKFBfR1VJTEQpKQorICAgICAgICAgICYmIG9iamVjdHAocmVzPWZpbmRfb2JqZWN0KCIvZ2lsZGVuLyIrcmVzKSkpCisgICAgICAgIHJlcy0+TlBDX0tpbGxlZF9CeShraWxsZXIpOworCisgICAgICBpZiAoZW52aXJvbm1lbnQoKSkKKyAgICAgICAgICBlbnZpcm9ubWVudCgpLT5OUENfS2lsbGVkX0J5KGtpbGxlcik7CisKKyAgICAgIHJlcyA9IFF1ZXJ5UHJvcChQX1hQKTsKKyAgICAgIHJlcyA9IChyZXMgPCBTQ09SRV9MT1dfTUFSSykgPyAwIDogKChyZXMgPiBTQ09SRV9ISUdIX01BUkspID8gMiA6IDEpOworICAgICAgaWYgKCAhUXVlcnlQcm9wKFBfTk9fU0NPUkUpICYmICFJU19MRUFSTkVSKGtpbGxlcikgJiYKKyAgICAgICAgICAgLy8gIWtpbGxlci0+UXVlcnlQcm9wKFBfVEVTVFBMQVlFUikgJiYKKyAgICAgICAgICAgcG9pbnRlcnAoIHJlcyA9IFNDT1JFTUFTVEVSLT5RdWVyeU5QQyhyZXMpKSApCisgICAgICAgIEdpdmVLaWxsU2NvcmUoIGtpbGxlciwgcmVzWzBdICk7CisgICAgfQorICB9CisKKyAgaWYoICEoZGllX21zZyA9IFF1ZXJ5UHJvcChQX0RJRV9NU0cpKSApCisgICAgaWYgKFF1ZXJ5UHJvcChQX1BMVVJBTCkpCisgICAgICBkaWVfbXNnID0gIiBmYWxsZW4gdG90IHp1IEJvZGVuLlxuIjsKKyAgICBlbHNlCisgICAgICBkaWVfbXNnID0gIiBmYWVsbHQgdG90IHp1IEJvZGVuLlxuIjsKKworICBpZiAoIHBvaXNvbmRlYXRoICkKKyAgeworICAgICAgU2V0KCBQX0xBU1RfREFNVFlQRVMsICh7IERUX1BPSVNPTiB9KSApOworICAgICAgU2V0KCBQX0xBU1RfREFNVElNRSwgdGltZSgpICk7CisgICAgICBTZXQoIFBfTEFTVF9EQU1BR0UsIDEgKTsKKyAgICAgIGRpZV9tc2cgPSAiIHdpcmQgdm9uIEdpZnQgaGlud2VnZ2VyYWZmdCB1bmQga2lwcHQgdW0uXG4iOworICB9CisKKyAgc2F5KCBjYXBpdGFsaXplKG5hbWUoV0VSLDEpKSArIGRpZV9tc2cgKTsKKworICAvLyBXZW5uIGtlaW5lIExlaWNoZSwgZGFubiBLcmFtIGlucyBFbnYgbGVnZW4uCisgIGlmICggUXVlcnlQcm9wKFBfTk9DT1JQU0UpIHx8ICEodG1wID0gUXVlcnlQcm9wKFBfQ09SUFNFKSkKKyAgICAgIHx8IGNhdGNoKGNvcnBzZSA9IGNsb25lX29iamVjdCh0bXApO3B1Ymxpc2gpIAorICAgICAgfHwgIW9iamVjdHAoY29ycHNlKSApCisgIHsKKyAgICAgIC8vIE1hZ2llciBvZGVyIFRlc3RzcGllbGVyIGJlaGFsdGVuIGlocmUgQXVzcnVlc3R1bmcuCisgICAgICAvLyBTb25zdCBrYWVtZW4gdS5VLiBTcGllbGVyIGFuIE1hZ2llcnRvb2xzIGV0Yy4gaGVyYW4KKyAgICAgIGlmICggIShJU19MRUFSTkVSKE1FKSB8fCAodG1wID0gUXVlcnkoUF9URVNUUExBWUVSKSkgJiYKKyAgICAgICAgICAgICAoIXN0cmluZ3AodG1wKSB8fCBJU19MRUFSTkVSKCBsb3dlcl9jYXNlKHRtcCkgKSkpICkKKyAgICAgICAgICB0cmFuc2Zlcl9hbGxfdG8oIGVudmlyb25tZW50KCksIDAgKTsKKyAgICAgIGVsc2UKKyAgICAgICAgICAvLyBBYmVyIHNpZSB6aWVoZW4gc2ljaCBhdXMuCisgICAgICAgICAgZmlsdGVyX29iamVjdHMoUXVlcnlQcm9wKFBfQVJNT1VSUyksIkRvVW53ZWFyIixNX05PQ0hFQ0ssMCk7CisgIH0KKyAgZWxzZQorICAvLyBzb25zdCBpbiBkaWUgTGVpY2hlIGxlZ2VuLgorICB7CisgICAgICBjb3Jwc2UtPklkZW50aWZ5KE1FKTsKKyAgICAgIGNvcnBzZS0+bW92ZSggZW52aXJvbm1lbnQoKSwgTV9OT0NIRUNLfE1fU0lMRU5UICk7CisgICAgICAvLyBNYWdpZXIgb2RlciBUZXN0c3BpZWxlciBiZWhhbHRlbiBpaHJlIEF1c3J1ZXN0dW5nLgorICAgICAgLy8gU29uc3Qga2FlbWVuIHUuVS4gU3BpZWxlciBhbiBNYWdpZXJ0b29scyBldGMuIGhlcmFuCisgICAgICBpZiAoICEoSVNfTEVBUk5FUihNRSkgfHwgKHRtcCA9IFF1ZXJ5KFBfVEVTVFBMQVlFUikpICYmCisgICAgICAgICAgICAgKCFzdHJpbmdwKHRtcCkgfHwgSVNfTEVBUk5FUiggbG93ZXJfY2FzZSh0bXApICkpKSApCisgICAgICAgICAgdHJhbnNmZXJfYWxsX3RvKCBjb3Jwc2UsICFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKE1FKSApOworICAgICAgZWxzZQorICAgICAgICAgIC8vIEFiZXIgc2llIHppZWhlbiBzaWNoIGF1cy4KKyAgICAgICAgICBmaWx0ZXJfb2JqZWN0cyhRdWVyeVByb3AoUF9BUk1PVVJTKSwiRG9VbndlYXIiLE1fTk9DSEVDSywwKTsKKyAgfQorCisgIGlmICggcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShNRSkgKSB7CisgICAgICBTZXQoIFBfREVBRFMsIFF1ZXJ5KFBfREVBRFMpICsgMSApOworICAgICAgLy8gU3BpZWxlci1Ub2QtZXZlbnQgYXVzbG9lc2VuCisgICAgICBFVkVOVEQtPlRyaWdnZXJFdmVudChFVlRfTElCX1BMQVlFUl9ERUFUSCwgKFsKKyAgICAgIEVfT0JKRUNUOiBNRSwgRV9QTE5BTUU6IGdldHVpZChNRSksCisgICAgICBFX0VOVklST05NRU5UOiBlbnZpcm9ubWVudCgpLCBFX1RJTUU6IHRpbWUoKSwKKyAgICAgIFBfS0lMTEVSOiBRdWVyeVByb3AoUF9LSUxMRVIpLAorICAgICAgUF9MQVNUX0RBTUFHRTogUXVlcnlQcm9wKFBfTEFTVF9EQU1BR0UpLAorICAgICAgUF9MQVNUX0RBTVRZUEVTOiBjb3B5KFF1ZXJ5UHJvcChQX0xBU1RfREFNVFlQRVMpKSwKKyAgICAgIEVfRVhURVJOQUxfREVBVEg6IGV4dGVybiwKKyAgICAgIEVfUE9JU09OX0RFQVRIOiBwb2lzb25kZWF0aCwgCisgICAgICBFX0NPUlBTRTogKG9iamVjdHAoY29ycHNlKT9jb3Jwc2U6MCkgXSkgKTsKKyAgfQorICBlbHNlIHsKKyAgICAgIC8vIE5QQy1Ub2Rlcy1FdmVudCBhdXNsb2VzZW4uIERpdi4gTWFwcGluZ3MvQXJyYXlzIHdlcmRlbiBuaWNodCBrb3BpZXJ0LAorICAgICAgLy8gd2VpbCBkZXIgTlBDIGphIGpldHp0IGVoIHplcnN0b2VydCB3aXJkLgorICAgICAgbWFwcGluZyBkYXRhID0gKFsKKyAgICAgICAgICAgIEVfT0JOQU1FOiBvYmplY3RfbmFtZShNRSksCisgICAgICAgICAgICBFX0VOVklST05NRU5UOiBlbnZpcm9ubWVudCgpLCBFX1RJTUU6IHRpbWUoKSwKKyAgICAgICAgICAgIFBfTkFNRTogUXVlcnlQcm9wKFBfTkFNRSksCisgICAgICAgICAgICBQX0tJTExFUjogUXVlcnlQcm9wKFBfS0lMTEVSKSwKKyAgICAgICAgICAgIFBfRU5FTVlfREFNQUdFOiBRdWVyeVByb3AoUF9FTkVNWV9EQU1BR0UpLAorICAgICAgICAgICAgUF9MQVNUX0RBTUFHRTogUXVlcnlQcm9wKFBfTEFTVF9EQU1BR0UpLAorICAgICAgICAgICAgUF9MQVNUX0RBTVRZUEVTOiBRdWVyeVByb3AoUF9MQVNUX0RBTVRZUEVTKSwKKyAgICAgICAgICAgIEVfRVhURVJOQUxfREVBVEg6IGV4dGVybiwKKyAgICAgICAgICAgIEVfUE9JU09OX0RFQVRIOiBwb2lzb25kZWF0aCwKKyAgICAgICAgICAgIEVfQ09SUFNFOiAob2JqZWN0cChjb3Jwc2UpP2NvcnBzZTowKSwKKyAgICAgICAgICAgIFBfWFA6IFF1ZXJ5UHJvcChQX1hQKSwKKyAgICAgICAgICAgIFBfQVRUUklCVVRFUzogUXVlcnlQcm9wKFBfQVRUUklCVVRFUyksCisgICAgICAgICAgICBQX01BWF9IUDogUXVlcnlQcm9wKFBfTUFYX0hQKSwKKyAgICAgICAgICAgIFBfSEFORFM6IFF1ZXJ5UHJvcChQX0hBTkRTKSwKKyAgICAgICAgICAgIFBfQUxJR046IFF1ZXJ5UHJvcChQX0FMSUdOKSwKKyAgICAgICAgICAgIFBfUkFDRTogUXVlcnlQcm9wKFBfUkFDRSksCisgICAgICAgICAgICBQX0NMQVNTOiBRdWVyeVByb3AoUF9DTEFTUyksCisgICAgICAgICAgICBdKTsKKyAgICAgIEVWRU5URC0+VHJpZ2dlckV2ZW50KEVWVF9MSUJfTlBDX0RFQVRIKCIiKSwgZGF0YSk7CisgICAgICBFVkVOVEQtPlRyaWdnZXJFdmVudCgKKyAgICAgICAgICBFVlRfTElCX05QQ19ERUFUSChsb2FkX25hbWUoTUUpKSwgZGF0YSk7CisgIH0KKworICAvLyB0cmFuc2Zlcl9hbGxfdG8oKSBpc3QgZXZ0bC4gKHdlbm4genV2aWVsZSBPYmpla3RlIGJld2VndCB3ZXJkZW4gbXVzc3RlbikKKyAgLy8gbm9jaCBuaWNodCBnYW56IGZlcnRpZyB1bmQgd2lyZCBwZXIgY2FsbF9vdXQoKSBkZW4gUmVzdCBlcmxlZGlnZW4uCisgIC8vIFNvbGx0ZSBkaWUgTGVpY2hlIGRhbm4gbmljaHQgbWVociBleGlzdGllcmVuLCB2ZXJibGVpYmVuIGRpZSByZXN0bGljaGVuCisgIC8vIE9iamVrdGUgaW0gU3BpZWxlci4KKyAgLy8gRXMgYmxlaWJlbiBhYmVyIGF1ZiBqZWRlbiBGYWxsIG5vY2ggcnVuZCAzMDBrIEV2YWwtVGlja3MgdWViZXIsIGRhbWl0CisgIC8vIGtlaW4gU3BpZWxlciBkYW5rICJldmFsY29zdCB0b28gaGlnaCIgdW5nZXNjaG9yZW4gZGF2b24ga29tbXQuCisgIGlmICggIShzZWNvbmRfbGlmZShjb3Jwc2UpKSApCisgIHsKKyAgICAgIFNldCggUF9HSE9TVCwgMSApOyAvLyBGdWVyIGtvcnJla3RlIEF1c2dhYmUgYXVmIFRlYW1rYW5hbC4KKworICAgICAgaWYgKCBmaW5kX2NhbGxfb3V0KCMnX3RyYW5zZmVyKSA9PSAtMSApCisgICAgICAgICAgLy8gRmFsbHMga2VpbiBjYWxsX291dCgpIG1laHIgbGFldWZ0LCBzb2ZvcnQgZGVzdHJ1Y3RlbiAuLi4KKyAgICAgICAgICByZW1vdmUoKTsKKyAgICAgIGVsc2UKKyAgICAgICAgICAvLyAuLi4gYW5zb25zdGVuIHZvcm1lcmtlbgorICAgICAgICAgIHJlbW92ZV9tZSA9IDE7CisgIH0KK30KKworcHVibGljIHZvaWQgaGVhbF9zZWxmKGludCBoKQoreworICBpZiAoIGg8PTAgKQorICAgIHJldHVybjsKKyAgU2V0UHJvcChQX0hQLCBRdWVyeVByb3AoUF9IUCkraCk7CisgIFNldFByb3AoUF9TUCwgUXVlcnlQcm9wKFBfU1ApK2gpOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIGludCBkZWZ1ZWxfZm9vZCggLyogdm9pZCAqLyApCisvLworLy8gICBFbnR0YW5rdCBkZW4gU3BpZWxlciB1bSBlaW5lbiBnZXdpc3NlbiBFc3NlbnMtV2VydC4KKy8vICAgU29sbHRlIG51ciB2b24gVG9pbGV0dGVuIGF1ZmdlcnVmZW4gd2VyZGVuLgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3B1YmxpYyBpbnQgZGVmdWVsX2Zvb2QoKQoreworICBpbnQgZm9vZDsKKworICBmb29kPVF1ZXJ5UHJvcChQX0ZPT0QpOworCisvLyB3ZW5uIHNwaWVsZXIga2VpbiBmb29kIGhhdDogcmV0dXJuIDAKKyAgaWYgKCAhZm9vZCApCisgICByZXR1cm4gTk9fREVGVUVMOworCisvLyB3ZW5uIHNwaWVsZXIgdW50ZXIgZW50dGFuay1ncmVuemU6IHJldHVybiAtMQorICBpZiAoIGZvb2QgPCBRdWVyeVByb3AoUF9ERUZVRUxfTElNSVRfRk9PRCkgKQorICAgcmV0dXJuIERFRlVFTF9UT09fTE9XOworCisvLyB3ZW5uIGxldHp0ZXMgZW50dGFua2VuIG5pY2h0IGxhbmdlIGdlbnVnIHp1cnVlY2tsaWVndDogcmV0dXJuIC0yCisgIGlmICggdGltZSgpIDwgbmV4dGRlZnVlbHRpbWVmb29kICkKKyAgIHJldHVybiBERUZVRUxfVE9PX1NPT047CisKKyAgZm9vZD10b19pbnQoKChmb29kKlF1ZXJ5UHJvcChQX0RFRlVFTF9BTU9VTlRfRk9PRCkpLzIpKTsKKyAgZm9vZCs9cmFuZG9tKGZvb2QpOworCisvLyBzaWNoZXJoZWl0c2hhbGJlcgorICBpZiAoIGZvb2QgPiBRdWVyeVByb3AoUF9GT09EKSApCisgICBmb29kPVF1ZXJ5UHJvcChQX0ZPT0QpOworCisgIFNldFByb3AoUF9GT09ELChRdWVyeVByb3AoUF9GT09EKS1mb29kKSk7CisKKyAgbmV4dGRlZnVlbHRpbWVmb29kPXRpbWUoKStRdWVyeVByb3AoUF9ERUZVRUxfVElNRV9GT09EKTsKKworICByZXR1cm4gZm9vZDsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gICBpbnQgZGVmdWVsX2RyaW5rKCAvKiB2b2lkICovICkKKy8vCisvLyAgIEVudHRhbmt0IGRlbiBTcGllbGVyIHVtIGVpbmVuIGdld2lzc2VuIEZsdWVzc2lna2VpdHMtV2VydC4KKy8vICAgR2xlaWNoemVpdGlnIHdpcmQgZWluZSBnZXdpc3NlIE1lbmdlIEFsa29ob2wgcmVkdXppZXJ0LgorLy8gICBTb2xsdGUgbnVyIHZvbiBUb2lsZXR0ZW4gYXVmZ2VydWZlbiB3ZXJkZW4uCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcHVibGljIGludCBkZWZ1ZWxfZHJpbmsoKQoreworICBpbnQgYWxjLCBkcmluazsKKworICBkcmluaz1RdWVyeVByb3AoUF9EUklOSyk7CisKKy8vIHdlbm4gc3BpZWxlciBrZWluIGRyaW5rIGhhdDogcmV0dXJuIDAKKyAgaWYgKCAhZHJpbmsgKQorICAgcmV0dXJuIE5PX0RFRlVFTDsKKworLy8gd2VubiBzcGllbGVyIHVudGVyIGVudHRhbmstZ3JlbnplOiByZXR1cm4gLTEKKyAgaWYgKCBkcmluayA8IFF1ZXJ5UHJvcChQX0RFRlVFTF9MSU1JVF9EUklOSykgKQorICAgcmV0dXJuIERFRlVFTF9UT09fTE9XOworCisvLyB3ZW5uIGxldHp0ZXMgZW50dGFua2VuIG5pY2h0IGxhbmdlIGdlbnVnIHp1cnVlY2tsaWVndDogcmV0dXJuIC0yCisgIGlmICggdGltZSgpIDwgbmV4dGRlZnVlbHRpbWVkcmluayApCisgICByZXR1cm4gREVGVUVMX1RPT19TT09OOworICAgIAorICBkcmluaz10b19pbnQoKChkcmluaypRdWVyeVByb3AoUF9ERUZVRUxfQU1PVU5UX0RSSU5LKSkvMikpOworICBkcmluays9cmFuZG9tKGRyaW5rKTsKKworLy8gc2ljaGVyaGVpdHNoYWxiZXIKKyAgaWYgKCBkcmluayA+IFF1ZXJ5UHJvcChQX0RSSU5LKSApCisgICBkcmluaz1RdWVyeVByb3AoUF9EUklOSyk7CisKKyAgU2V0UHJvcChQX0RSSU5LLChRdWVyeVByb3AoUF9EUklOSyktZHJpbmspKTsKKworLy8gamVkZXMgZmx1ZXNzaWdlIEVudHRhbmtlbiBtYWNodCBhdWNoIGV0d2FzIG51ZWNodGVybmVyIDpeKQorLy8gYmVpIHNlaHIga2xlaW5lbiBNZW5nZW4gZW50dGFua3QgbWFuIGtlaW5lbiBBbGtvaG9sCisvLyBhbnNvbnN0ZW4gaW4gQWJoYWVuZ2lna2VpdCB2b24gZW50dGFua3RlciBNZW5nZSwgUF9BTENPSE9MIHVuZCBQX1dFSUdIVAorCisgIGlmICggZHJpbmsgPiA5ICYmIFF1ZXJ5UHJvcChQX0FMQ09IT0wpID4gMCApCisgICB7CisgICAgYWxjPSh0b19pbnQoZXhwKGxvZygxLjEpKihkcmluaykpKSoKKyAgICAgICAgIHRvX2ludChleHAobG9nKDAuNjcpKihRdWVyeVByb3AoUF9BTENPSE9MKSkpKSkvCisgICAgICAgICAoUXVlcnlQcm9wKFBfTUFYX0RSSU5LKSpRdWVyeVByb3AoUF9NQVhfQUxDT0hPTCkpKgorICAgICAgICAgKHRvX2ludChRdWVyeVByb3AoUF9XRUlHSFQpLzEwMDApKTsKKworICAgICBTZXRQcm9wKFBfQUxDT0hPTCxRdWVyeVByb3AoUF9BTENPSE9MKS0oYWxjK3JhbmRvbShhbGMpKSk7CisgICB9CisKKyAgbmV4dGRlZnVlbHRpbWVkcmluaz10aW1lKCkrUXVlcnlQcm9wKFBfREVGVUVMX1RJTUVfRFJJTkspOworIAorICByZXR1cm4gZHJpbms7Cit9CisKKworcHVibGljIHZvaWQgcmVkdWNlX3NwZWxsX3BvaW50cyhpbnQgaCkKK3sKKyAgU2V0UHJvcChQX1NQLCBRdWVyeVByb3AoUF9TUCktaCk7Cit9CisKK3B1YmxpYyB2b2lkIHJlc3RvcmVfc3BlbGxfcG9pbnRzKGludCBoKQoreworICBTZXRQcm9wKFBfU1AsIFF1ZXJ5UHJvcChQX1NQKStoKTsKK30KKworLyogUmVkdWNlIGhpdHBvaW50cy4gTG9nIHdobyBpcyBkb2luZyBpdC4gKi8KK3B1YmxpYyBpbnQgcmVkdWNlX2hpdF9wb2ludHMoaW50IGRhbSkKK3sgb2JqZWN0IG87CisgIGludCBpOworCisjaWZkZWYgTE9HX1JFRFVDRV9IUAorICBpZiAodGhpc19wbGF5ZXIoKSE9TUUpCisgIHsKKyAgICBsb2dfZmlsZSgiUkVEVUNFX0hQIiwgbmFtZSgpKyIgYnkgIik7CisgICAgaWYoIXRoaXNfcGxheWVyKCkpIGxvZ19maWxlKCJSRURVQ0VfSFAiLCI/XG4iKTsKKyAgICBlbHNlIHsKKyAgICAgIGxvZ19maWxlKCJSRURVQ0VfSFAiLHRoaXNfcGxheWVyKCktPm5hbWUoKSk7CisgICAgICBvPXByZXZpb3VzX29iamVjdCgpOworICAgICAgaWYgKG8pCisgICAgICAgIGxvZ19maWxlKCJSRURVQ0VfSFAiLCAiICIgKyBvYmplY3RfbmFtZShvKSArICIsICIgKworICAgICAgICAgICAgICAgICBvLT5uYW1lKFdFUiwwKSArICIgKCIgKyBjcmVhdG9yKG8pICsgIilcbiIpOworICAgICAgZWxzZQorICAgICAgICBsb2dfZmlsZSgiUkVEVUNFX0hQIiwgIiA/P1xuIik7CisgICAgfQorICB9CisjZW5kaWYKKyAgaWYgKChpPVF1ZXJ5UHJvcChQX0hQKSkgPD0gZGFtKQorICAgIHJldHVybiBTZXRQcm9wKFBfSFAsMSk7CisgIHJldHVybiBTZXRQcm9wKFBfSFAsIGkgLSBkYW0pOworfQorCitwdWJsaWMgaW50IHJlc3RvcmVfaGl0X3BvaW50cyhpbnQgaGVhbCkKK3sKKyAgcmV0dXJuIHJlZHVjZV9oaXRfcG9pbnRzKC1oZWFsKTsKK30KKworcHVibGljIHZhcmFyZ3MgaW50IGRyaW5rX2FsY29ob2woaW50IHN0cmVuZ3RoLGludCB0ZXN0b25seSwgc3RyaW5nIG15dGV4dCkKK3sgaW50IGFsYyxhZGQscmVzOworCisgIGFkZD1BTENPSE9MX1ZBTFVFKHN0cmVuZ3RoKTsKKyAgcmVzPVVzZVNraWxsKFNLX0JPT1pFLChbCisgICAgICBTSV9TS0lMTEFSRyA6IGFkZCwKKyAgICAgIFNJX1RFU1RGTEFHIDogMV0pKTsgLy8gS2FubiBkZXIgU3BpZWxlciBndXQgc2F1ZmVuPworICBpZiAoaW50cChyZXMpICYmIHJlcz4wKSBhZGQ9cmVzOworICBhbGM9UXVlcnlQcm9wKFBfQUxDT0hPTCkrYWRkOworICBpZiAoKGFsYyA+PSBRdWVyeVByb3AoUF9NQVhfQUxDT0hPTCkpICYmICFJU19MRUFSTklORyh0aGlzX29iamVjdCgpKSl7CisgICAgaWYoIXRlc3Rvbmx5KQorICAgICAgdGVsbF9vYmplY3QoTUUsbXl0ZXh0fHwiU28gZWluIFBlY2gsIER1IGhhc3QgYWxsZXMgdmVyc2NodWV0dGV0LlxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYodGVzdG9ubHkpcmV0dXJuIDE7CisgIFVzZVNraWxsKFNLX0JPT1pFLChbIFNJX1NLSUxMQVJHIDogQUxDT0hPTF9WQUxVRShzdHJlbmd0aCkgXSkpOworICBpZihhbGMgPCAwKSBhbGMgPSAwOworICBpZighYWxjKSB0ZWxsX29iamVjdChNRSwgIkR1IGJpc3Qgc3RvY2tudWVjaHRlcm4uXG4iKTsKKyAgU2V0UHJvcChQX0FMQ09IT0wsIGFsYyk7CisgIHJldHVybiAxOworfQorCitwdWJsaWMgdmFyYXJncyBpbnQgZHJpbmtfc29mdChpbnQgc3RyZW5ndGgsIGludCB0ZXN0b25seSwgc3RyaW5nIG15dGV4dCkKK3sgaW50IHNvYWtlZDsKKworICBzb2FrZWQgPSBRdWVyeVByb3AoUF9EUklOSyk7CisgIGlmKChzb2FrZWQgKyBzdHJlbmd0aCA+IFF1ZXJ5UHJvcChQX01BWF9EUklOSykpICYmCisgICAgICFJU19MRUFSTklORyh0aGlzX29iamVjdCgpKSl7CisgICAgaWYoIXRlc3Rvbmx5KQorICAgICB0ZWxsX29iamVjdChNRSwgbXl0ZXh0fHwKKyAgICAgICAiTmVlLCBzbyB2aWVsIGthbm5zdCBEdSBtb21lbnRhbiBlY2h0IG5pY2h0IHRyaW5rZW4uXG4iICk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYodGVzdG9ubHkpcmV0dXJuIDE7CisgIGlmKChzb2FrZWQgKz0gRFJJTktfVkFMVUUoc3RyZW5ndGgpKSA8IDApIHNvYWtlZCA9IDA7CisgIGlmKCFzb2FrZWQpIHRlbGxfb2JqZWN0KE1FLCAiRGlyIGtsZWJ0IGRpZSBadW5nZSBhbSBHYXVtZW4uXG4iKTsKKyAgU2V0UHJvcChQX0RSSU5LLCBzb2FrZWQpOworICByZXR1cm4gMTsKK30KKworcHVibGljIHZhcmFyZ3MgaW50IGVhdF9mb29kKGludCBzdHJlbmd0aCwgaW50IHRlc3Rvbmx5LCBzdHJpbmcgbXl0ZXh0KQoreyBpbnQgc3R1ZmZlZDsKKworICBzdHVmZmVkID0gUXVlcnlQcm9wKFBfRk9PRCk7CisgIGlmICgoc3R1ZmZlZCArIHN0cmVuZ3RoID4gUXVlcnlQcm9wKFBfTUFYX0ZPT0QpKSAmJgorICAgICAgIUlTX0xFQVJOSU5HKHRoaXNfb2JqZWN0KCkpKQorICB7CisgICAgaWYoIXRlc3Rvbmx5KQorICAgICAgICB0ZWxsX29iamVjdChNRSwKKyAgICAgICAgICAgIG15dGV4dCB8fCAiRGFzIGlzdCB2aWVsIHp1IHZpZWwgZnVlciBEaWNoISBXaWUgd2FlcnMgbWl0IGV0d2FzICIKKyAgICAgICAgICAgICJsZWljaHRlcmVtP1xuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYodGVzdG9ubHkpcmV0dXJuIDE7CisgIHN0dWZmZWQgKz0gRk9PRF9WQUxVRShzdHJlbmd0aCk7CisgIGlmKHN0dWZmZWQgPCAwKSBzdHVmZmVkID0gMDsKKyAgaWYoIXN0dWZmZWQpIHRlbGxfb2JqZWN0KE1FLCAiV2FzIHJ1bXBlbHQgZGVubiBkYSBpbiBEZWluZW0gQmF1Y2g/XG4iKTsKKyAgU2V0UHJvcChQX0ZPT0QsIHN0dWZmZWQpOworICByZXR1cm4gMTsKK30KKworcHVibGljIGludCBidWZmZXJfaHAoaW50IHZhbCxpbnQgcmF0ZSkKK3sKKyAgaW50IGRpZjsKKworICBpZih2YWw8PTAgfHwgcmF0ZTw9MClyZXR1cm4gMDsKKyAgaWYodmFsIDwgcmF0ZSlyYXRlID0gdmFsOworICBpZihyYXRlPjIwKSByYXRlPTIwOworCisgIC8qIENoZWNrIGZvciBCdWZmZXJPdmVyZmxvdyAqLworICBpZigoZGlmPShocF9idWZmZXJbMF0rdmFsKS1RdWVyeVByb3AoUF9NQVhfSFApKSA+IDApdmFsLT1kaWY7CisgIGlmKHZhbDw9MClyZXR1cm4gMDsKKworICBocF9idWZmZXJbMF0gKz0gdmFsOworICBocF9idWZmZXJbMStyYXRlXSArPSB2YWw7CisgIGlmKHJhdGUgPiBocF9idWZmZXJbMV0paHBfYnVmZmVyWzFdID0gcmF0ZTsKKworICByZXR1cm4gaHBfYnVmZmVyWzBdOworfQorCitwdWJsaWMgaW50IGJ1ZmZlcl9zcChpbnQgdmFsLGludCByYXRlKQoreworICBpbnQgZGlmOworCisgIGlmKHZhbDw9MCB8fCByYXRlPD0wKXJldHVybiAwOworICBpZih2YWwgPCByYXRlKXJhdGUgPSB2YWw7CisgIGlmKHJhdGU+MjApIHJhdGU9MjA7CisKKyAgLyogQ2hlY2sgZm9yIEJ1ZmZlck92ZXJmbG93ICovCisgIGlmKChkaWY9KHNwX2J1ZmZlclswXSt2YWwpLVF1ZXJ5UHJvcChQX01BWF9TUCkpID4gMCl2YWwtPWRpZjsKKyAgaWYodmFsPD0wKXJldHVybiAwOworCisgIHNwX2J1ZmZlclswXSArPSB2YWw7CisgIHNwX2J1ZmZlclsxK3JhdGVdICs9IHZhbDsKKyAgaWYocmF0ZSA+IHNwX2J1ZmZlclsxXSlzcF9idWZmZXJbMV0gPSByYXRlOworCisgIHJldHVybiBzcF9idWZmZXJbMF07Cit9CisKK3Byb3RlY3RlZCB2b2lkIHVwZGF0ZV9idWZmZXJzKCkKK3sgaW50IGksIHJhdGUsIG1heDsKKworICByYXRlPTA7CisgIG1heD0wOworICBmb3IoaT0xO2k8PTIwO2krKyl7CisgICAgaWYobWVtYmVyKGhwX2J1ZmZlciwgaSsxKSkKKyAgICAgIGlmKGhwX2J1ZmZlcltpKzFdPD0wKQorICAgICAgICBocF9idWZmZXIgPSBtX2RlbGV0ZShocF9idWZmZXIsaSsxKTsKKyAgICAgIGVsc2V7CisgICAgICAgIG1heCs9aHBfYnVmZmVyW2krMV07CisgICAgICAgIHJhdGU9aTsKKyAgICAgIH0KKyAgfQorCisgIGhwX2J1ZmZlclswXT1tYXg7CisgIGhwX2J1ZmZlclsxXT1yYXRlOworICByYXRlPTA7CisgIG1heD0wOworICBmb3IoaT0xO2k8PTIwO2krKyl7CisgICAgaWYobWVtYmVyKHNwX2J1ZmZlciwgaSsxKSkKKyAgICAgIGlmKHNwX2J1ZmZlcltpKzFdPD0wKQorICAgICAgICBzcF9idWZmZXIgPSBtX2RlbGV0ZShzcF9idWZmZXIsaSsxKTsKKyAgICAgIGVsc2V7CisgICAgICAgIG1heCs9c3BfYnVmZmVyW2krMV07CisgICAgICAgIHJhdGU9aTsKKyAgICAgIH0KKyAgfQorICBzcF9idWZmZXJbMF09bWF4OworICBzcF9idWZmZXJbMV09cmF0ZTsKK30KKworcHVibGljIGludCBjaGVja190aW1lZF9rZXkoc3RyaW5nIGtleSkgeworCisgIC8vIGtlaW5lIDAgYWxzIGtleSAoVHlwIHdpcmQgcGVyIFJUVEMgZ2VwcnVlZnQpCisgIGlmICgha2V5KQorICAgIHJldHVybiAwOworICBtYXBwaW5nIHRtYXA9UXVlcnkoUF9USU1JTkdfTUFQLCBGX1ZBTFVFKTsKKyAgaWYgKCFtYXBwaW5ncCh0bWFwKSkgeworICAgIHRtYXA9KFtdKTsKKyAgICBTZXQoUF9USU1JTkdfTUFQLCB0bWFwLCBGX1ZBTFVFKTsKKyAgfQorICAvLyBXZW5uIGtleSBub2NoIG5pY2h0IGFiZ2VsYXVmZW4sIEFibGF1ZnplaXRwdW5rdCB6dXJ1ZWNrZ2ViZW4uCisgIC8vIFNvbnN0IDAgKGtleSBmcmVpKQorICByZXR1cm4gKHRpbWUoKSA8IHRtYXBba2V5XSkgJiYgdG1hcFtrZXldOworfQorCitwdWJsaWMgaW50IGNoZWNrX2FuZF91cGRhdGVfdGltZWRfa2V5KGludCBkdXJhdGlvbixzdHJpbmcga2V5KSB7CisKKyAgLy8gd2VubiBrZXkgbm9jaCBnZXNwZXJydCwgZGllIHplaXQgZGVyIG5hZWNoc3RlbiBWZXJmdWVnYmFya2VpdAorICAvLyB6dXJ1ZWNrZ2ViZW4uCisgIGludCByZXMgPSBjaGVja190aW1lZF9rZXkoa2V5KTsKKyAgaWYgKHJlcykgeworICAgIHJldHVybiByZXM7CisgIH0KKworICAvLyBkdXJhdGlvbiA8PSAwIGlzdCB1bnNpbm5pZy4gQWJlciBrZXkgaXN0IG5pY2h0IG1laHIgZ2VzcGVycnQsIGQuaC4gdGltZSgpCisgIC8vIGlzdCBlaW4gc2lubnZvbGxlciBSdWVja2dhYmV3ZXJ0LgorICBpZiAoZHVyYXRpb24gPD0gMCkKKyAgICByZXR1cm4gdGltZSgpOworIAorICBtYXBwaW5nIHRtYXAgPSBRdWVyeShQX1RJTUlOR19NQVAsRl9WQUxVRSk7CisgIHRtYXBba2V5XT10aW1lKCkrZHVyYXRpb247CisgIAorICAvLyBzcGVpY2hlcm4gcGVyIFNldFByb3AoKSB1bm5vZXRpZywgZGEgbWFuIGRhcyBNYXBwaW5nIGRpcmVrdCBhZW5kZXJ0LAorICAvLyBrZWluZSBLb3BpZS4KKyAgLy9TZXRQcm9wKFBfVElNSU5HX01BUCwgdG1hcCk7CisgIAorICByZXR1cm4gLTE7IC8vIEVyZm9sZy4KK30KKworcHJvdGVjdGVkIHZvaWQgZXhwaXJlX3RpbWluZ19tYXAoKSB7CisgIAorICBtYXBwaW5nIHRtYXAgPSBRdWVyeShQX1RJTUlOR19NQVAsIEZfVkFMVUUpOworICBpZiAoIW1hcHBpbmdwKHRtYXApIHx8ICFzaXplb2YodG1hcCkpCisgICAgcmV0dXJuOworICBmb3JlYWNoKHN0cmluZyBrZXksIGludCBlbmR0aW1lOiB0bWFwKSB7CisgICAgaWYgKGVuZHRpbWUgPCB0aW1lKCkpCisgICAgICBtX2RlbGV0ZSh0bWFwLCBrZXkpOworICB9CisgIC8vIHNwZWljaGVybiBwZXIgU2V0UHJvcCgpIHVubm9ldGlnLCBkYSBtYW4gZGFzIE1hcHBpbmcgZGlyZWt0IGFlbmRlcnQsCisgIC8vIGtlaW5lIEtvcGllLgorfQorCitwcm90ZWN0ZWQgdm9pZCBoZWFydF9iZWF0KCkKK3sKKyAgICBpZiAoICF0aGlzX29iamVjdCgpICkKKyAgICAgICAgcmV0dXJuOworCisgICAgYXR0cmlidXRlX2hiKCk7CisKKyAgICAvLyBBbHMgR2Vpc3QgbGVpZGV0IG1hbiBuaWNodCB1bnRlciBzbyB3ZWx0bGljaGVuIERpbmdlbiB3aWUKKyAgICAvLyBBbGtvaG9sLCBHaWZ0JkNvIC4uLgorICAgIGlmICggUXVlcnlQcm9wKFBfR0hPU1QpICkKKyAgICAgICAgcmV0dXJuOworCisgICAgaW50IGhwb2lzb24gPSBRdWVyeVByb3AoUF9QT0lTT04pOworICAgIGludCBybG9jayA9IFF1ZXJ5UHJvcChQX05PX1JFR0VORVJBVElPTik7CisgICAgaW50IGhwID0gUXVlcnlQcm9wKFBfSFApOworICAgIGludCBzcCA9IFF1ZXJ5UHJvcChQX1NQKTsKKyAgICBpbnQgYWxjOworCisgICAgLy8gV2VubiBBbGtvaG9sIGdldHJ1bmtlbjogQWxrb2hvbGF1c3dpcmt1bmdlbj8KKyAgICBpZiAoIChhbGMgPSBRdWVyeVByb3AoUF9BTENPSE9MKSkgJiYgIXJhbmRvbSg0MCkgKXsKKyAgICAgICAgaW50IG47CisgICAgICAgIHN0cmluZyBnaWxkZTsKKyAgICAgICAgb2JqZWN0IG9iOworCisgICAgICAgIG4gPSByYW5kb20oIDUgKiAoYWxjIC0gMSkvUXVlcnlQcm9wKFBfTUFYX0FMQ09IT0wpICk7CisKKyAgICAgICAgc3dpdGNoIChuKXsKKyAgICAgICAgY2FzZSBBTENfRUZGRUNUX0hJQ0s6CisgICAgICAgICAgICBzYXkoIGNhcGl0YWxpemUobmFtZSggV0VSLCAxICkpICsgIiBzYWd0OiA8SGljaz4hXG4iICk7CisgICAgICAgICAgICB3cml0ZSggIjxIaWNrPiEgT2gsIFRzY2h1bGRpZ3VuZy5cbiIgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisgICAgICAgIGNhc2UgQUxDX0VGRkVDVF9TVFVNQkxFOgorICAgICAgICAgICAgc2F5KCBjYXBpdGFsaXplKG5hbWUoIFdFUiwgMSApKSArICIgc3RvbHBlcnQgdWViZXIgIiArCisgICAgICAgICAgICAgICAgIFF1ZXJ5UG9zc1Byb25vdW4oIEZFTUFMRSwgV0VOICkgKyAiIEZ1ZXNzZS5cbiIgKTsKKyAgICAgICAgICAgIHdyaXRlKCAiRHUgc3RvbHBlcnN0LlxuIiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBBTENfRUZGRUNUX0xPT0tEUlVOSzoKKyAgICAgICAgICAgIHNheSggY2FwaXRhbGl6ZShuYW1lKCBXRVIsIDEgKSkgKyAiIHNpZWh0IGJldHJ1bmtlbiBhdXMuXG4iICk7CisgICAgICAgICAgICB3cml0ZSggIkR1IGZ1ZWhsc3QgRGljaCBiZW5vbW1lbi5cbiIgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisgICAgICAgIGNhc2UgQUxDX0VGRkVDVF9SVUVMUFM6CisgICAgICAgICAgICBzYXkoIGNhcGl0YWxpemUobmFtZSggV0VSLCAxICkpICsgIiBydWVscHN0LlxuIiApOworICAgICAgICAgICAgd3JpdGUoICJEdSBydWVscHN0LlxuIiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAKKyAgICAgICAgLy8gR2lsZGUgdW5kIEVudmlyb25tZW50IGluZm9ybWllcmVuIHVlYmVyIEFsa29ob2xhdXN3aXJrdW5nLgorICAgICAgICBpZiAoIHN0cmluZ3AoZ2lsZGUgPSBRdWVyeVByb3AoUF9HVUlMRCkpCisgICAgICAgICAgICAgJiYgb2JqZWN0cChvYiA9IGZpbmRfb2JqZWN0KCAiL2dpbGRlbi8iICsgZ2lsZGUgKSkgKQorICAgICAgICAgICAgb2ItPkluZm9ybUFsY29ob2xFZmZlY3QoIE1FLCBuLCBBTENfRUZGRUNUX0FSRUFfR1VJTEQgKTsKKyAgICAgICAgCisgICAgICAgIGlmICggZW52aXJvbm1lbnQoKSApCisgICAgICAgICAgICBlbnZpcm9ubWVudCgpLT5JbmZvcm1BbGNvaG9sRWZmZWN0KCBNRSwgbiwgQUxDX0VGRkVDVF9BUkVBX0VOViApOworICAgIH0KKyAgICAKKyAgICAvLyBBbGtvaG9sIGFiYmF1ZW4gdW5kIGV0d2FzIGV4dHJhIGhlaWxlbiwgZmFsbHMgZXJsYXVidC4KKyAgICBpZiAoIGFsYyAmJiAoLS1kZWxheV9hbGNvaG9sIDwgMCkKKyAgICAgICAgICYmICEocmxvY2sgJiBOT19SRUdfQUxDT0hPTCkgKXsKKworICAgICAgICBTZXRQcm9wKCBQX0FMQ09IT0wsIGFsYyAtIDEgKTsKKyAgICAgICAgCisgICAgICAgIGlmICggIWhwb2lzb24gKXsKKyAgICAgICAgICAgIGhwKys7CisgICAgICAgICAgICBzcCsrOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBkZWxheV9hbGNvaG9sID0gUXVlcnlQcm9wKFBfQUxDT0hPTF9ERUxBWSk7CisgICAgfQorCisgICAgLy8gUF9EUklOSyByZWR1emllcmVuLCBmYWxscyBlcmxhdWJ0LgorICAgIGlmICggKC0tZGVsYXlfZHJpbmsgPCAwKSAmJiAhKHJsb2NrICYgTk9fUkVHX0RSSU5LKSApeworICAgICAgICBkZWxheV9kcmluayA9IFF1ZXJ5UHJvcChQX0RSSU5LX0RFTEFZKTsKKyAgICAgICAgU2V0UHJvcCggUF9EUklOSywgUXVlcnlQcm9wKFBfRFJJTkspIC0gMSApOworICAgIH0KKworICAgIC8vIFBfRk9PRCByZWR1emllcmVuLCBmYWxscyBlcmxhdWJ0LgorICAgIGlmICggKC0tZGVsYXlfZm9vZCA8IDApICYmICEocmxvY2sgJiBOT19SRUdfRk9PRCkgKXsKKyAgICAgICAgZGVsYXlfZm9vZCA9IFF1ZXJ5UHJvcChQX0ZPT0RfREVMQVkpOworICAgICAgICBTZXRQcm9wKCBQX0ZPT0QsIFF1ZXJ5UHJvcChQX0ZPT0QpIC0gMSApOworICAgIH0KKworICAgIC8vIFJlZ2VuZXJhdGlvbiBhdXMgZGVtIEhQLVB1ZmZlcgorICAgIC8vIEhpZXJiZWkgd2lyZCB6d2FyIG51ciBnZWhlaWx0LCB3ZW5uIGRhcyBlcmxhdWJ0IGlzdCwgYWJlciBkZXIgUHVmZmVyCisgICAgLy8gbXVzcyB0cm90emRlbSBhYmdlYXJiZWl0ZXQvcmVkdXppZXJ0IHdlcmRlbiwgZGEgRGVsZmVuIHNvbnN0IGVpbmUKKyAgICAvLyBtb2JpbGUgVGFua2Uga3JpZWdlbi4gKEtlaW5lIEhlaWx1bmcgaW0gSGVsbGVuLCBQdWZmZXIgYmxlaWJ0IHNvbnN0CisgICAgLy8ga29uc3RhbnQgdW5kIGthbm4gYmVpIEJlZGFyZiB1ZWJlciBkdW5rZWxtYWNoZW5kZSBJdGVtcyBhYmdlcnVmZW4KKyAgICAvLyB3ZXJkZW4uKQorICAgIGludCB2YWw7CisgICAgaWYgKGhwX2J1ZmZlclswXSkgeworICAgICAgICBpbnQgcmF0ZSA9IGhwX2J1ZmZlclsxXTsKKyAgICAgICAgdmFsID0gaHBfYnVmZmVyW3JhdGUgKyAxXTsKKyAgICAKKyAgICAgICAgaWYgKCB2YWwgPiByYXRlICkKKyAgICAgICAgICAgIHZhbCA9IHJhdGU7CisgICAgICAgIGhwX2J1ZmZlclswXSAtPSB2YWw7CisgICAgICAgIGhwX2J1ZmZlcltyYXRlICsgMV0gLT0gdmFsOworICAgICAgICBpZiAoIGhwX2J1ZmZlcltyYXRlICsgMV0gPD0gMCApCisgICAgICAgICAgICB1cGRhdGVfYnVmZmVycygpOworICAgIH0KKyAgICAvLyBKZXR6dCBSZWdlbmVyYXRpb24gYXVzIGRlbSBQdWZmZXIgZHVyY2hmdWVocmVuLCBhYmVyIG51ciB3ZW5uIGVybGF1YnQuCisgICAgaWYgKCB2YWwgJiYgIShybG9jayAmIE5PX1JFR19CVUZGRVJfSFApICkKKyAgICAgICAgaHAgKz0gdmFsOyAKKyAgICAvLyBub3JtYWxlcyBIZWlsZW4sIGZhbGxzIGtlaW5lIFJlZ2VuZXJhdGlvbiBhdXMgZGVtIFB1ZmZlciBlcmZvbGd0ZSB1bmQKKyAgICAvLyBlcyBlcmxhdWJ0IGlzdC4KKyAgICBlbHNlIGlmICggKC0tZGVsYXlfaGVhbCA8IDApICYmICEocmxvY2sgJiBOT19SRUdfSFApICl7CisgICAgICAgIGRlbGF5X2hlYWwgPSBRdWVyeVByb3AoUF9IUF9ERUxBWSk7CisgICAgICAgIGlmICggIWhwb2lzb24gKQorICAgICAgICAgICAgaHArKzsKKyAgICB9CisKKyAgICAvLyBHbGVpY2hlcyBTcGllbCBqZXR6dCBmdWVyIGRlbiBTUC1QdWZmZXIgKHMuby4pCisgICAgdmFsPTA7CisgICAgaWYgKCBzcF9idWZmZXJbMF0gKSB7CisgICAgICAgIGludCByYXRlID0gc3BfYnVmZmVyWzFdOworICAgICAgICB2YWwgPSBzcF9idWZmZXJbcmF0ZSArIDFdOworICAgICAgICAKKyAgICAgICAgaWYgKCB2YWwgPiByYXRlICkKKyAgICAgICAgICAgIHZhbCA9IHJhdGU7CisgICAgICAgIAorICAgICAgICBzcF9idWZmZXJbMF0gLT0gdmFsOworICAgICAgICBzcF9idWZmZXJbcmF0ZSArIDFdIC09IHZhbDsKKyAKKyAgICAgICAgaWYgKCBzcF9idWZmZXJbcmF0ZSArIDFdIDw9IDAgKQorICAgICAgICAgICAgdXBkYXRlX2J1ZmZlcnMoKTsKKyAgICB9CisgICAgLy8gUmVnZW5lcmF0aW9uIGVybGF1YnQ/CisgICAgaWYgKCB2YWwgJiYgIShybG9jayAmIE5PX1JFR19CVUZGRVJfU1ApICkKKyAgICAgICAgIHNwICs9IHZhbDsKKyAgICAvLyBXZW5uIG5pY2h0LCBub3JtYWxlcyBIb2NoaWRlbG4gdmVyc3VjaGVuLgorICAgIGVsc2UgaWYgKCAoLS1kZWxheV9zcCA8IDApICYmICEocmxvY2sgJiBOT19SRUdfU1ApICl7CisgICAgICAgIGRlbGF5X3NwID0gUXVlcnlQcm9wKFBfU1BfREVMQVkpOworICAgICAgICBpZiAoICFocG9pc29uICkKKyAgICAgICAgICAgIHNwKys7CisgICAgfQorCisgICAgaWYgKCBocG9pc29uICYmIChpbnRlcmFjdGl2ZShNRSkgfHwgIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoTUUpKSApeworICAgICAgICAvLyBWYW5pb24sIDI2LjEwLjAzCisgICAgICAgIC8vIFdlbm4gX3NldF9wb2lzb24oKSBwZXIgU0VUX01FVEhPRCB1ZWJlcnNjaHJpZWJlbiB3aXJkLCBrYW5uCisgICAgICAgIC8vIG5pY2h0IHNpY2hlcmdlc3RlbGx0IHdlcmRlbiwgZGFzcyBwb2lzb24gaW1tZXIgZ3JvZXNzZXIgMCBpc3QKKyAgICAgICAgLy8gRGFoZXIgbXVzcyBoaWVyIGVpbiBUZXN0IHJlaW4sIHNvIHRldWVyIGRhcyBhdWNoIGlzdCA6KAorICAgICAgICBpZiAoLS1ocG9pc29uIDwgMCkKKyAgICAgICAgICBocG9pc29uPTA7CisgICAgICAgIAorICAgICAgICBpZiAoIC0tZGVsYXlfcG9pc29uIDwgMCApeworICAgICAgICAgICAgZGVsYXlfcG9pc29uID0gUXVlcnlQcm9wKFBfUE9JU09OX0RFTEFZKQorICAgICAgICAgICAgICAgICsgcmFuZG9tKFBPSVNPTl9NRVJDWV9ERUxBWSk7CisgICAgICAgICAgICBocCAtPSBocG9pc29uOworCisgICAgICAgICAgICBpZiAoIGhwIDwgMCApeworICAgICAgICAgICAgICAgIHRlbGxfb2JqZWN0KCBNRSwgIk9oIHdlaCAtIGRhcyBHaWZ0IHdhciB6dXZpZWwgZnVlciBEaWNoIVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJEdSBzdGlyYnN0LlxuIiApOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmICggcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShNRSkgKXsKKyAgICAgICAgICAgICAgICAgICAgY3JlYXRlX2tpbGxfbG9nX2VudHJ5KCAiVmVyZ2lmdHVuZyIsIDAgKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIC8vIEJlaW0gR2lmdHRvZCBnaWJ0IGVzIGtlaW5lbiBLaWxsZXIuIEFiZXIgYXVmIGRpZXNlIEFydAorICAgICAgICAgICAgICAgICAgICAvLyBlcmtlbm50IGRlciBUb2Rlc3JhdW0gZGllIFVyc2FjaGUga29ycmVrdCB1bmQgZ2lidCBkaWUKKyAgICAgICAgICAgICAgICAgICAgLy8gcmljaHRpZ2UgTWVsZHVuZyBhdXMuCisgICAgICAgICAgICAgICAgICAgIFNldFByb3AoIFBfS0lMTEVSLCAiZ2lmdCIgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZGllKDEpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCAoaHBvaXNvbiA8IDMgfHwgIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoTUUpICkKKyAgICAgICAgICAgICAgICAgJiYgLS1kcm9wX3BvaXNvbiA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gR2lmdGxldmVsIGVpbnMgcmVkdXppZXJlbi4gaHBvaXNvbiB3dXJkZSBvYmVuIHNjaG9uCisgICAgICAgICAgICAgICAgLy8gcmVkdXppZXJ0LCBkLmguIGVpbmZhY2ggaHBvaXNvbiBpbiBQX1BPSVNPTiBzY2hyZWliZW4uCisgICAgICAgICAgICAgICAgLy8gZGFiZWkgd2lyZCBkYW5uIGF1Y2ggZ2dmLiBkcm9wX3BvaXNvbiByaWNodGlnIGdlc2V0enQuCisgICAgICAgICAgICAgICAgU2V0UHJvcCggUF9QT0lTT04sIGhwb2lzb24gKTsKKyAgICAgICAgICAgICAgICBpZiAoICFocG9pc29uICkKKyAgICAgICAgICAgICAgICAgICAgdGVsbF9vYmplY3QoIE1FLCAiRHUgc2NoZWluc3QgZGllIFZlcmdpZnR1bmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1ZWJlcnd1bmRlbiB6dSBoYWJlbi5cbiIgKTsgIAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoIGhwb2lzb24gJiYgIXJhbmRvbSgxNSkgKQorICAgICAgICAgICAgc3dpdGNoICggaHAqMTAwL1F1ZXJ5UHJvcChQX01BWF9IUCkgKXsKKyAgICAgICAgICAgIGNhc2UgNzEuLjEwMCA6CisgICAgICAgICAgICAgICAgd3JpdGUoICJEdSBmdWVobHN0IERpY2ggbmljaHQgZ3V0LlxuIiApOworICAgICAgICAgICAgICAgIHNheSggY2FwaXRhbGl6ZShuYW1lKFdFUikpICsKKyAgICAgICAgICAgICAgICAgICAgICIgc2llaHQgZXR3YXMgYmVub21tZW4gYXVzLlxuIiApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSA0Ni4uNzAgOgorICAgICAgICAgICAgICAgIHdyaXRlKCAiRGlyIGlzdCBzY2h3aW5kbGlnIHVuZCBEZWluIE1hZ2VuIHJldm9sdGllcnQuXG4iICk7CisgICAgICAgICAgICAgICAgc2F5KCBjYXBpdGFsaXplKG5hbWUoV0VSKSkgKyAiIHRhdW1lbHQgZWluIHdlbmlnLlxuIiApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSAyNi4uNDUgOgorICAgICAgICAgICAgICAgIHdyaXRlKCAiRGlyIGlzdCBoZWlzcy4gRHUgZnVlaGxzdCBEaWNoIHNjaHdhY2guIEtvcGZ3ZWggIgorICAgICAgICAgICAgICAgICAgICAgICAiaGFzdCBEdSBhdWNoLlxuIiApOworICAgICAgICAgICAgICAgIHNheSggY2FwaXRhbGl6ZShuYW1lKFdFUikpICsgIiBnbHVlaHQgZGlyZWt0IHVuZCBzY2hlaW50ICIKKyAgICAgICAgICAgICAgICAgICAgICJncm9zc2UgU2Nod2llcmlna2VpdGVuIHp1IGhhYmVuLlxuIiApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSAxMS4uMjUgOgorICAgICAgICAgICAgICAgIHdyaXRlKCAiRHUgZnVlaGxzdCBEaWNoIGJlc2NoaXNzZW4uIEFsbGVzIHR1dCB3ZWgsIHVuZCBEdSAiCisgICAgICAgICAgICAgICAgICAgICAgICJzaWVoc3QgbnVyIG5vY2ggdW5zY2hhcmYuXG4iICk7CisgICAgICAgICAgICAgICAgc2F5KCBjYXBpdGFsaXplKG5hbWUoV0VSKSkgKyAiIHRhdW1lbHQgdW5kIHN0b2VobnQgdW5kICIKKyAgICAgICAgICAgICAgICAgICAgICJrYW5uIGdlcmFkZSBub2NoIHZlcm1laWRlbiwgaGluenVmYWxsZW4uXG4iICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBjYXNlIDAuLjEwIDoKKyAgICAgICAgICAgICAgICB3cml0ZSggYnJlYWtfc3RyaW5nKCAiRHUgc2llaHN0IGZhc3QgbmljaHRzIG1laHIgdW5kIGthbm5zdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRpY2ggbnVyIG5vY2ggdW50ZXIgZ3JvZXNzdGVuIFNjaG1lcnplbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJld2VnZW4uIEFiZXIgYmFsZCB0dXQgbmljaHRzIG1laHIgd2VoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuLi4iLCA3OCApICk7CisgICAgICAgICAgICAgICAgc2F5KCBicmVha19zdHJpbmcoIGNhcGl0YWxpemUobmFtZShXRVIpKSArICIgZ2x1ZWh0IHdpZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbSBGaWViZXIsIGthbm4gc2ljaCBrYXVtIG5vY2ggcnVlaHJlbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmQgaGF0IGVpbiBzY2htZXJ6dmVyemVycnRlcyBHZXNpY2h0LlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzggKSApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgIH0KKworICAgIFNldFByb3AoIFBfSFAsIGhwICk7CisgICAgU2V0UHJvcCggUF9TUCwgc3AgKTsKK30KKworcHVibGljIGludCBBZGRFeHAoIGludCBlICkKK3sKKyAgaW50IGV4cGVyaWVuY2U7CisgIHN0cmluZyBmbjsKKyAgbWl4ZWQgbGFzdDsKKworICBleHBlcmllbmNlID0gUXVlcnlQcm9wKFBfWFApOworCisgIGlmICggUXVlcnlQcm9wKFBfS0lMTFMpID4gMSAmJiBlID4gMCApCisgICAgICByZXR1cm4gZXhwZXJpZW5jZTsKKworICBmbiA9IGltcGxvZGUoIGV4cGxvZGUoIG9iamVjdF9uYW1lKCBlbnZpcm9ubWVudCgpIHx8IHRoaXNfb2JqZWN0KCkgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLyIgKVswLi48Ml0sICIvIiApOworCisgIGlmICggcG9pbnRlcnAobGFzdCA9IFF1ZXJ5KFBfTEFTVF9YUCkpICYmIHNpemVvZihsYXN0KSA9PSAyICYmIGxhc3RbMF0gPT0gZm4gKQorICAgICAgU2V0KCBQX0xBU1RfWFAsICh7IGZuLCBsYXN0WzFdK2UgfSkgKTsKKyAgZWxzZQorICAgICAgU2V0KCBQX0xBU1RfWFAsICh7IGZuLCBlIH0pICk7CisKKyAgaWYgKCAoZXhwZXJpZW5jZSArPSBlKSA8IDAgKQorICAgICAgZXhwZXJpZW5jZSA9IDA7CisKKyAgcmV0dXJuIFNldFByb3AoIFBfWFAsIGV4cGVyaWVuY2UgKTsKK30KKworc3RhdGljIDxzdHJpbmd8aW50PiogX3NldF9sYXN0X3hwKCA8aW50fHN0cmluZz4qIGxhc3QgKQoreworICAgIGlmICggIXBvaW50ZXJwKGxhc3QpIHx8IHNpemVvZihsYXN0KSAhPSAyIHx8ICFzdHJpbmdwKGxhc3RbMF0pIHx8CisgICAgICAgICAhaW50cChsYXN0WzFdKSApCisgICAgICAgIHJldHVybiBRdWVyeShQX0xBU1RfWFApOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFNldCggUF9MQVNUX1hQLCBsYXN0ICk7Cit9CisKKworc3RhdGljIGludCBfc2V0X2FsaWduKGludCBhKQoreworICBpZiAoYTwtMTAwMCkgYSA9IC0xMDAwOworICBpZiAoYT4xMDAwKSBhID0gMTAwMDsKKyAgcmV0dXJuIFNldChQX0FMSUdOLCBhKTsKK30KKworCitzdGF0aWMgaW50IF9zZXRfaHAoIGludCBocCApCit7CisgICAgaWYgKCBRdWVyeVByb3AoUF9HSE9TVCkgKQorICAgICAgICByZXR1cm4gUXVlcnlQcm9wKFBfSFApOworCisgICAgaWYgKCBocCA8IDAgKQorICAgICAgICByZXR1cm4gU2V0KCBQX0hQLCAwICk7CisKKyAgICBpZiAoIGhwID4gUXVlcnlQcm9wKFBfTUFYX0hQKSApCisgICAgICAgIHJldHVybiBTZXQoIFBfSFAsIFF1ZXJ5UHJvcChQX01BWF9IUCksIEZfVkFMVUUgKTsKKworICAgIHJldHVybiBTZXQoIFBfSFAsIGhwLCBGX1ZBTFVFICk7Cit9CisKK3N0YXRpYyBpbnQgX3NldF9zcCggaW50IHNwICkKK3sKKyAgICAvL2VpbmlnZSBMZXV0ZSBzY2hyZWliZW4gZmxvYXRzIGluIGRpZSBQX0hQLiA6LSgKKyAgICBpZiAoIWludHAoc3ApKSB7CisJc3A9dG9faW50KHNwKTsKKwkvL2phLCBlcyBpc3QgdGV1ZXIuIEFiZXIgaWNoIHdpbGwgd2lzc2VuLCB3ZXJzIGlzdC4gS2FubiB2b3IKKwkvL25hZWNoc3RlbSBSZWJvb3Qgd2llZGVyIHJhdXMuCisJbG9nX2ZpbGUoIklMTEVHQUxfVFlQRS5sb2ciLHNwcmludGYoCisJICAgICAgIlZlcnN1Y2gsIGVpbmVuIG5pY2h0LWludCBpbiBQX1NQIGluICVPIHp1IHNjaHJlaWJlbjogXG4lT1xuIiwKKwkgICAgICB0aGlzX29iamVjdCgpLAorCSAgICAgIGRlYnVnX2luZm8oRElORk9fVFJBQ0UsRElUX1NUUl9DVVJSRU5UKSkpOworICAgIH0KKworICAgIGlmICggUXVlcnlQcm9wKFBfR0hPU1QpICkKKyAgICAgICAgUXVlcnlQcm9wKFBfU1ApOworCisgICAgaWYgKCBzcCA8IDAgKQorICAgICAgICByZXR1cm4gU2V0KCBQX1NQLCAwICk7CisKKyAgICBpZiAoIHNwID4gUXVlcnlQcm9wKFBfTUFYX1NQKSApCisgICAgICAgIHJldHVybiBTZXQoIFBfU1AsIFF1ZXJ5UHJvcChQX01BWF9TUCksIEZfVkFMVUUgKTsKKworICAgIHJldHVybiBTZXQoIFBfU1AsIHNwLCBGX1ZBTFVFICk7Cit9CisKK3N0YXRpYyBpbnQgX3NldF9hbGNvaG9sKGludCBuKQoreworICBpZighaW50cChuKSkKKyAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoCisgICAgICAgICJfc2V0X2FsY29ob2woKTogZXhwZWN0ZWQgPGludD4sIGdvdCAlLjUwT1xuIiwgbikpOworCisgIGlmIChRdWVyeVByb3AoUF9HSE9TVCkpCisgICAgcmV0dXJuIFF1ZXJ5KFBfQUxDT0hPTCwgRl9WQUxVRSk7CisKKyAgLy8gbnVyIMRuZGVydW5nZW4gdW5kIFdlcnRlID49MCB3ZXJkZW4gZ2VzZXR6dC4uLgorICBuID0gbiA8IDAgPyAwIDogbjsKKyAgaW50IG9sZCA9IFF1ZXJ5KFBfQUxDT0hPTCwgRl9WQUxVRSk7CisgIGlmICggb2xkID09IG4pCisgICAgcmV0dXJuIG9sZDsKKworICAvLyBIb29rcyBhdWZydWZlbgorICBpbnQgKnJldCA9IEhvb2tGbG93KEhfSE9PS19BTENPSE9MLCBuKTsKKyAgLy8gQmVpIEFiYnJ1Y2ggYWx0ZW4gV2VydCB6dXJ1ZWNrZ2ViZW4KKyAgc3dpdGNoIChyZXRbSF9SRVRDT0RFXSkgeworICAgIGNhc2UgSF9DQU5DRUxMRUQ6CisgICAgICByZXR1cm4gb2xkOworICAgIGNhc2UgSF9BTFRFUkVEOgorICAgICAgLy8gc29uc3QgbmV1ZW4gV2VydCBzZXR6ZW4KKyAgICAgIGlmKCFpbnRwKHJldFtIX1JFVERBVEFdKSkKKyAgICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKAorICAgICAgICAgICAgIl9zZXRfYWxjb2hvbCgpOiBkYXRhIGZyb20gSG9va0Zsb3coKSAhPSA8aW50PjogJS41ME9cbiIsCisgICAgICAgICAgICByZXRbSF9SRVREQVRBXSkpOworICAgICAgbiA9IHJldFtIX1JFVERBVEFdOworICAgICAgbiA9IG4gPCAwID8gMCA6IG47CisKKyAgICAvLyBIX05PX01PRCBpcyBmYWxsdGhyb3VnaAorICB9CisKKyAgcmV0dXJuIFNldChQX0FMQ09IT0wsIG4sIEZfVkFMVUUpOworfQorCitzdGF0aWMgaW50IF9zZXRfZHJpbmsoaW50IG4pCit7CisgIGlmKCFpbnRwKG4pKQorICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigKKyAgICAgICAgIl9zZXRfZHJpbmsoKTogZXhwZWN0ZWQgPGludD4sIGdvdCAlLjUwT1xuIiwgbikpOworCisgIGlmIChRdWVyeVByb3AoUF9HSE9TVCkpCisgICAgcmV0dXJuIFF1ZXJ5KFBfRFJJTkssIEZfVkFMVUUpOworCisgIC8vIG51ciDEbmRlcnVuZ2VuIHVuZCBXZXJ0ZSA+PTAgd2VyZGVuIGdlc2V0enQuLi4KKyAgbiA9IG4gPCAwID8gMCA6IG47CisgIGludCBvbGQgPSBRdWVyeShQX0RSSU5LLCBGX1ZBTFVFKTsKKyAgaWYgKCBvbGQgPT0gbikKKyAgICByZXR1cm4gb2xkOworCisgIC8vIEhvb2tzIGF1ZnJ1ZmVuCisgIGludCAqcmV0ID0gSG9va0Zsb3coSF9IT09LX0RSSU5LLCBuKTsKKyAgLy8gQmVpIEFiYnJ1Y2ggYWx0ZW4gV2VydCB6dXJ1ZWNrZ2ViZW4KKyAgc3dpdGNoIChyZXRbSF9SRVRDT0RFXSkgeworICAgIGNhc2UgSF9DQU5DRUxMRUQ6CisgICAgICByZXR1cm4gb2xkOworICAgIGNhc2UgSF9BTFRFUkVEOgorICAgICAgLy8gc29uc3QgbmV1ZW4gV2VydCBzZXR6ZW4KKyAgICAgIGlmKCFpbnRwKHJldFtIX1JFVERBVEFdKSkKKyAgICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKAorICAgICAgICAgICAgIl9zZXRfZHJpbmsoKTogZGF0YSBmcm9tIEhvb2tGbG93KCkgIT0gPGludD46ICUuNTBPXG4iLAorICAgICAgICAgICAgcmV0W0hfUkVUREFUQV0pKTsKKyAgICAgIG4gPSByZXRbSF9SRVREQVRBXTsKKyAgICAgIG4gPSBuIDwgMCA/IDAgOiBuOworCisgICAgLy8gSF9OT19NT0QgaXMgZmFsbHRocm91Z2gKKyAgfQorCisgIHJldHVybiBTZXQoUF9EUklOSywgbiwgRl9WQUxVRSk7Cit9CisKK3N0YXRpYyBpbnQgX3NldF9mb29kKGludCBuKQoreworICBpZighaW50cChuKSkKKyAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoCisgICAgICAgICJfc2V0X2Zvb2QoKTogZXhwZWN0ZWQgPGludD4sIGdvdCAlLjUwT1xuIiwgbikpOworCisgIGlmIChRdWVyeVByb3AoUF9HSE9TVCkpCisgICAgcmV0dXJuIFF1ZXJ5KFBfRk9PRCwgRl9WQUxVRSk7CisKKyAgLy8gbnVyIMRuZGVydW5nZW4gdW5kIFdlcnRlID49MCB3ZXJkZW4gZ2VzZXR6dC4uLgorICBuID0gbiA8IDAgPyAwIDogbjsKKyAgaW50IG9sZCA9IFF1ZXJ5KFBfRk9PRCwgRl9WQUxVRSk7CisgIGlmICggb2xkID09IG4pCisgICAgcmV0dXJuIG9sZDsKKworICAvLyBIb29rcyBhdWZydWZlbgorICBpbnQgKnJldCA9IEhvb2tGbG93KEhfSE9PS19GT09ELCBuKTsKKyAgLy8gQmVpIEFiYnJ1Y2ggYWx0ZW4gV2VydCB6dXJ1ZWNrZ2ViZW4KKyAgc3dpdGNoIChyZXRbSF9SRVRDT0RFXSkgeworICAgIGNhc2UgSF9DQU5DRUxMRUQ6CisgICAgICByZXR1cm4gb2xkOworICAgIGNhc2UgSF9BTFRFUkVEOgorICAgICAgLy8gc29uc3QgbmV1ZW4gV2VydCBzZXR6ZW4KKyAgICAgIGlmKCFpbnRwKHJldFtIX1JFVERBVEFdKSkKKyAgICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKAorICAgICAgICAgICAgIl9zZXRfZm9vZCgpOiBkYXRhIGZyb20gSG9va0Zsb3coKSAhPSA8aW50PjogJS41ME9cbiIsCisgICAgICAgICAgICByZXRbSF9SRVREQVRBXSkpOworICAgICAgbiA9IHJldFtIX1JFVERBVEFdOworICAgICAgbiA9IG4gPCAwID8gMCA6IG47CisKKyAgICAvLyBIX05PX01PRCBpcyBmYWxsdGhyb3VnaAorICB9CisKKyAgcmV0dXJuIFNldChQX0ZPT0QsIG4sIEZfVkFMVUUpOworfQorCitzdGF0aWMgaW50IF9zZXRfcG9pc29uKGludCBuKQoreworICAgIGlmKCFpbnRwKG4pKQorICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigKKyAgICAgICAgIl9zZXRfcG9pc29uKCk6IGV4cGVjdGVkIDxpbnQ+LCBnb3QgJS41ME9cbiIsIG4pKTsKKworICBpZiAoUXVlcnlQcm9wKFBfR0hPU1QpKQorICAgIHJldHVybiBRdWVyeShQX1BPSVNPTiwgRl9WQUxVRSk7CisKKyAgaW50IG1wID0gUXVlcnlQcm9wKFBfTUFYX1BPSVNPTik7CisgIG4gPSAobjwwID8gMCA6IChuPm1wID8gbXAgOiBuKSk7CisKKyAgLy8gbnVyID49MCB6dWxhc3Nlbi4KKyAgbiA9IG4gPCAwID8gMCA6IG47CisKKyAgaW50IG9sZCA9IFF1ZXJ5KFBfUE9JU09OLCBGX1ZBTFVFKTsKKyAgaWYgKCBvbGQgPT0gMCAmJiBuID09IDApCisgICAgcmV0dXJuIG9sZDsKKworICAvLyBIb29rcyBhdWZydWZlbgorICBpbnQgKnJldCA9IEhvb2tGbG93KEhfSE9PS19QT0lTT04sIG4pOworICAvLyBCZWkgQWJicnVjaCBhbHRlbiBXZXJ0IHp1cnVlY2tnZWJlbgorICBzd2l0Y2ggKHJldFtIX1JFVENPREVdKSB7CisgICAgY2FzZSBIX0NBTkNFTExFRDoKKyAgICAgIHJldHVybiBvbGQ7CisgICAgY2FzZSBIX0FMVEVSRUQ6CisgICAgICAvLyBzb25zdCBuZXVlbiBXZXJ0IHNldHplbgorICAgICAgaWYoIWludHAocmV0W0hfUkVUREFUQV0pKQorICAgICAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoCisgICAgICAgICAgICAiX3NldF9wb2lzb24oKTogZGF0YSBmcm9tIEhvb2tGbG93KCkgIT0gPGludD46ICUuNTBPXG4iLAorICAgICAgICAgICAgcmV0W0hfUkVUREFUQV0pKTsKKyAgICAgIG4gPSByZXRbSF9SRVREQVRBXTsKKyAgICAgIG4gPSBuIDwgMCA/IDAgOiBuOworCisgICAgLy8gSF9OT19NT0QgaXMgZmFsbHRocm91Z2gKKyAgfQorCisgIC8vIEZ1ZXIgZGllIFNlbGJzdGhlaWx1bmcuCisgIHN3aXRjaChuKSB7CisgIGNhc2UgMToKKyAgICBkcm9wX3BvaXNvbiA9IDQwK3JhbmRvbSgxNik7CisgICAgYnJlYWs7CisgIGNhc2UgMjoKKyAgICBkcm9wX3BvaXNvbiA9IDI1K3JhbmRvbSg4KTsKKyAgICBicmVhazsKKyAgY2FzZSAzOgorICAgIGRyb3BfcG9pc29uID0gMTgrcmFuZG9tKDQpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIC8vIG51ciByZWxldmFudCBmdWVyIE5QQywgZGEgU3BpZWxlciBiZWkgPjMgR2lmdCBuaWNodCBtZWhyIHJlZ2VnZW5pZXJlbi4KKyAgICBkcm9wX3BvaXNvbiA9IDIyIC0gMipuICsgcmFuZG9tKDQzIC0gMypuKTsKKyAgICBicmVhazsKKyAgfQorCisgIC8vIGZ1ZXIgU2V0emVuIGRlciBQcm9wIHZvbiBhdXNzZW4gZWluIExvZyBzY2hyZWliZW4KKyAgaWYgKHByZXZpb3VzX29iamVjdCgxKSAhPSBNRSkKKyAgICBsb2dfZmlsZSgiUE9JU09OIiwgc3ByaW50ZigiJXMgLSAlczogJWQgdm9uICVPICglcylcbiIsCisgICAgICAgICAgIGR0aW1lKHRpbWUoKSlbNS4uXSwKKyAgICAgICAgICAgKHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUodGhpc19vYmplY3QoKSkgPworICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0ZXVpZCh0aGlzX29iamVjdCgpKSkgOgorICAgICAgICAgICAgIGNhcGl0YWxpemUobmFtZShXRVIpKSksCisgICAgICAgICAgIG4sCisgICAgICAgICAgIChwcmV2aW91c19vYmplY3QoMikgPyBwcmV2aW91c19vYmplY3QoMikgOiBwcmV2aW91c19vYmplY3QoMSkpLAorICAgICAgICAgICAodGhpc19wbGF5ZXIoKSA/IGNhcGl0YWxpemUoZ2V0ZXVpZCh0aGlzX3BsYXllcigpKSkgOiAiPz8/IikpKTsKKworICByZXR1cm4gU2V0KFBfUE9JU09OLCBuLCBGX1ZBTFVFKTsKK30KKworc3RhdGljIGludCBfc2V0X3hwKGludCB4cCkgeyByZXR1cm4gU2V0KFBfWFAsIHhwIDwgMCA/IDAgOiB4cCwgRl9WQUxVRSk7IH0KKworc3RhdGljIG1peGVkIF9zZXRfZGllX2hvb2sobWl4ZWQgaG9vaykKK3sKKyAgaWYoaG9vayAmJiBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHRoaXNfb2JqZWN0KCkpKQorICAgIGxvZ19maWxlKCJESUVfSE9PSyIsCisgICAgICAgICAgICAgc3ByaW50ZigiJXMgOiBESUVfSE9PSyBnZXNldHp0IHZvbiAlTyBpbiAlTyAoJXMpXG4iLAorICAgICAgICAgICAgICAgICAgICAgZHRpbWUodGltZSgpKVs1Li5dLAorICAgICAgICAgICAgICAgICAgICAgKHByZXZpb3VzX29iamVjdCgyKSA/IHByZXZpb3VzX29iamVjdCgyKTpwcmV2aW91c19vYmplY3QoMSkpLAorICAgICAgICAgICAgICAgICAgICAgdGhpc19vYmplY3QoKSxnZXR1aWQodGhpc19vYmplY3QoKSkpKTsKKyAgcmV0dXJuIFNldChQX1RNUF9ESUVfSE9PSyxob29rLCBGX1ZBTFVFKTsKK30KKworc3RhdGljIG1hcHBpbmcgX3F1ZXJ5X2VuZW15X2RhbWFnZSgpCit7CisgIHJldHVybiBjb3B5KGVuZW15X2RhbWFnZSk7Cit9CisKKy8vIG51ciBuZSBLb3BpZSBsaWVmZXJuLCBzb25zdCBrYW5uIGRhcyBqZWRlciB2b24gYXVzc2VuIGFlbmRlcm4uCitzdGF0aWMgbWFwcGluZyBfcXVlcnlfdGltaW5nX21hcCgpIHsKKyAgcmV0dXJuIGNvcHkoUXVlcnkoUF9USU1JTkdfTUFQKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb25zdW1lLUZ1bmt0aW9uLCB1bSB6ZW50cmFsIGR1cmNoIGtvbnN1bWllcmJhcmUgRGluZ2UgYXVzZ2Vsb2VzdGUKKyAqIEFlbmRlcnVuZ2VuIGRlcyBHZXN1bmRoZWl0c3p1c3RhbmRlcyBoZXJiZWl6dWZ1ZWhyZW4uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBLb25zdW1pZXJ0IGV0d2FzCisgKgorICogUnVlY2tnYWJld2VydAorICogICAgICAxICAgICAgIGVyZm9sZ3JlaWNoIGtvbnN1bWllcnQKKyAqICAgICAgMCAgICAgICBmZWhsZW5kZSBvZGVyIGZhbHNjaGUgUGFyYW1ldGVyCisgKiAgICAgPDAgICAgICAgQmVkaW5ndW5nIGZ1ZXIga29uc3VtaWVyZW4gbmljaHQgZXJmdWVsbHQsIEJpdHNldCBhdXM6CisgKiAgICAgIDEgICAgICAgS2FubiBuaWNodHMgbWVociBlc3NlbgorICogICAgICAyICAgICAgIEthbm4gbmljaHRzIG1laHIgdHJpbmtlbgorICogICAgICA0ICAgICAgIEthbm4gbmljaHRzIG1laHIgc2F1ZmVuCisgKiAgICAgIDggICAgICAgQWJnZWJyb2NoZW4gZHVyY2ggSG9vayBIX0hPT0tfQ09OU1VNRQorICovCitwdWJsaWMgdmFyYXJncyBpbnQgY29uc3VtZShtYXBwaW5nIGNpbmZvLCBpbnQgdGVzdG9ubHkpCit7CisgIGludCByZXR2YWwgPSAwOworICAvLyBudXIgd2FzIHR1biwgd2VubiBhdWNoIEluZm9zIHJlaW5rb21tZW4KKyAgaWYgKG1hcHBpbmdwKGNpbmZvKSAmJiBzaXplb2YoY2luZm8pKSB7CisgICAgLy8gSG9va3MgYXVmcnVmZW4sIHNpZSBhZW5kZXJuIGdnZi4gbm9jaCB3YXMgaW4gY2luZm8uCisgICAgbWl4ZWQgKmhyZXQgPSBIb29rRmxvdyhIX0hPT0tfQ09OU1VNRSwgKHtjaW5mbywgdGVzdG9ubHl9KSApOworICAgIHN3aXRjaChocmV0W0hfUkVUQ09ERV0pCisgICAgeworICAgICAgICBjYXNlIEhfQ0FOQ0VMTEVEOgorICAgICAgICAgIHJldHVybiAtSENfSE9PS19DQU5DRUxMQVRJT047CisgICAgICAgIGNhc2UgSF9BTFRFUkVEOgorICAgICAgICAgIC8vIHRlc3Rvbmx5IGthbm4gbmljaHQgZ2VhZW5kZXJ0IHdlcmRlbi4KKyAgICAgICAgICBjaW5mbyA9IGhyZXRbSF9SRVREQVRBXVswXTsKKyAgICB9CisgICAgLy8gTGVnYWN5LU1hcHBpbmdzIChmbGFjaGUpIG5lYmVuIHN0cnVrdHVyaWVydGVuIE1hcHBpbmdzIHp1bGFzc2VuCisgICAgLy8gZmxhY2hlIEtvcGllbiBlcnpldWdlbiAoVE9ETz86IHVuZCBmdWVyIFRlaWxtYXBwaW5ncyBuaWNodCByZWxldmFudGUKKyAgICAvLyBFaW50cmFlZ2UgbG9lc2NoZW4pCisgICAgbWFwcGluZyBjb25kaXRpb25zOworICAgIGlmIChtYXBwaW5ncChjaW5mb1tIX0NPTkRJVElPTlNdKSkgeworICAgICAgY29uZGl0aW9ucyA9IGNvcHkoY2luZm9bSF9DT05ESVRJT05TXSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbmRpdGlvbnMgPSBjb3B5KGNpbmZvKTsKKyAgICB9CisgICAgbWFwcGluZyBlZmZlY3RzOworICAgIGlmIChtYXBwaW5ncChjaW5mb1tIX0VGRkVDVFNdKSkgeworICAgICAgZWZmZWN0cyA9IGZpbHRlcihjaW5mb1tIX0VGRkVDVFNdLCAoOiBtZW1iZXIoSF9BTExPV0VEX0VGRkVDVFMsICQxKSA+IC0xIDopKTsKKyAgICB9IGVsc2UgeworICAgICAgZWZmZWN0cyA9IGZpbHRlcihjaW5mbywgKDogbWVtYmVyKEhfQUxMT1dFRF9FRkZFQ1RTLCAkMSkgPiAtMSA6KSk7CisgICAgfQorCisgICAgLy8gQmVkaW5ndW5nZW4gcHJ1ZWZlbgorICAgIGlmIChtYXBwaW5ncChjb25kaXRpb25zKSAmJiBzaXplb2YoY29uZGl0aW9ucykpIHsKKyAgICAgIC8vIEJlZGluZ3VuZ2VuIGZ1ZXIgS29uc3VtIGF1c3dlcnRlbgorICAgICAgaWYgKGNvbmRpdGlvbnNbUF9GT09EXSAmJiAhZWF0X2Zvb2QoY29uZGl0aW9uc1tQX0ZPT0RdLCAxKSkKKyAgICAgICAgcmV0dmFsIHw9IEhDX01BWF9GT09EX1JFQUNIRUQ7CisgICAgICBlbHNlIGlmIChjb25kaXRpb25zW1BfRFJJTktdICYmICFkcmlua19zb2Z0KGNvbmRpdGlvbnNbUF9EUklOS10sIDEpKQorICAgICAgICByZXR2YWwgfD0gSENfTUFYX0RSSU5LX1JFQUNIRUQ7CisgICAgICBlbHNlIGlmIChjb25kaXRpb25zW1BfQUxDT0hPTF0gJiYgIWRyaW5rX2FsY29ob2woY29uZGl0aW9uc1tQX0FMQ09IT0xdLCAxKSkKKyAgICAgICAgcmV0dmFsIHw9IEhDX01BWF9BTENPSE9MX1JFQUNIRUQ7CisgICAgICAvLyByZXR2YWwgbmVnYXRpdiBtYWNoZW4sIGRhbWl0IEZlaGxlciBsZWljaHQgZXJrZW5uYmFyIGlzdAorICAgICAgcmV0dmFsID0gLXJldHZhbDsKKyAgICB9CisgICAgLy8gQmVkaW5ndW5nZW4gd3VyZGVuIGFiZ2VhcmJlaXRldCwgamV0enQgZGllIEhlaWx1bmcgZHVyY2hmdWVocmVuCisgICAgaWYgKCFyZXR2YWwpIHsKKyAgICAgIGlmICghdGVzdG9ubHkpIHsKKyAgICAgICAgLy8gQmVkaW5ndW5nZW4gZXJmdWVsbGVuLCB3ZW5uIGFsbGVzIHBhc3N0IHVuZCBrZWluIFRlc3QKKyAgICAgICAgaWYgKGNvbmRpdGlvbnNbUF9BTENPSE9MXSkKKyAgICAgICAgICBkcmlua19hbGNvaG9sKGNvbmRpdGlvbnNbUF9BTENPSE9MXSk7CisgICAgICAgIGlmIChjb25kaXRpb25zW1BfRFJJTktdKQorICAgICAgICAgIGRyaW5rX3NvZnQoY29uZGl0aW9uc1tQX0RSSU5LXSk7CisgICAgICAgIGlmIChjb25kaXRpb25zW1BfRk9PRF0pCisgICAgICAgICAgZWF0X2Zvb2QoY29uZGl0aW9uc1tQX0ZPT0RdKTsKKyAgICAgICAgLy8gVW5kIGpldHp0IGRpZSBXaXJrdW5nZW4KKyAgICAgICAgaWYgKGVmZmVjdHNbUF9QT0lTT05dKQorICAgICAgICAgIFNldFByb3AoUF9QT0lTT04sIFF1ZXJ5UHJvcChQX1BPSVNPTikgKyBlZmZlY3RzW1BfUE9JU09OXSk7CisgICAgICAgIC8vIFVuZCBudW4gd2lya2xpY2ggaGVpbGVuCisgICAgICAgIHN3aXRjaCAoY2luZm9bSF9ESVNUUklCVVRJT05dKSB7CisgICAgICAgIGNhc2UgSERfSU5TVEFOVDoKKyAgICAgICAgICBtYXAoZWZmZWN0cywgKDogU2V0UHJvcCgkMSwgUXVlcnlQcm9wKCQxKSArICQyKSA6KSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMS4uNTA6CisgICAgICAgICAgYnVmZmVyX2hwKGVmZmVjdHNbUF9IUF0sIGNpbmZvW0hfRElTVFJJQlVUSU9OXSk7CisgICAgICAgICAgYnVmZmVyX3NwKGVmZmVjdHNbUF9TUF0sIGNpbmZvW0hfRElTVFJJQlVUSU9OXSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnVmZmVyX2hwKGVmZmVjdHNbUF9IUF0sIEhEX1NUQU5EQVJEKTsKKyAgICAgICAgICBidWZmZXJfc3AoZWZmZWN0c1tQX1NQXSwgSERfU1RBTkRBUkQpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR2YWwgPSAxOworICAgIH0KKyAgfQorICByZXR1cm4gcmV0dmFsOworfQpkaWZmIC0tZ2l0IGEvc3RkL2xpdmluZy9saWdodC5jIGIvc3RkL2xpdmluZy9saWdodC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMTJlMWYKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvbGl2aW5nL2xpZ2h0LmMKQEAgLTAsMCArMSw1NSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGxpdmluZy9kZXNjcmlwdGlvbi5jIC0tIGRlc2NyaXB0aW9uIGZvciBsaXZpbmcgb2JqZWN0cworLy8KKy8vICRJZDogZGVzY3JpcHRpb24uYyA3MzQwIDIwMDktMTEtMTkgMjE6NDQ6NTFaIFplc3N0cmEgJAorI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPGxpdmluZy9kZXNjcmlwdGlvbi5oPgorI2luY2x1ZGUgPGxpdmluZy9za2lsbHMuaD4KKyN1bmRlZiBORUVEX1BST1RPVFlQRVMKKworI2luY2x1ZGUgPHBsYXllci92aWV3Y21kLmg+CisjaW5jbHVkZSA8bmV3X3NraWxscy5oPgorI2luY2x1ZGUgPGNvbnRhaW5lci5oPgorI2luY2x1ZGUgPHBsYXllci9iYXNlLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisKK2luaGVyaXQgIi9zdGQvY29udGFpbmVyL2xpZ2h0IjsKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkgeworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfTElHSFRfVFJBTlNQQVJFTkNZLCAwKTsKK30KKworc3RhdGljIGludCBfcXVlcnlfcGxheWVyX2xpZ2h0KCkKK3sKKyAgaWYgKGVudmlyb25tZW50KCkpCisgICAgcmV0dXJuIGVudmlyb25tZW50KCktPlF1ZXJ5UHJvcChQX0lOVF9MSUdIVCkgKyBRdWVyeVByb3AoUF9MSUdIVF9NT0RJRklFUik7Cit9CisKK3ZhcmFyZ3MgaW50IENhbm5vdFNlZShpbnQgc2lsZW50KQoreworICAgc3RyaW5nIGlzX2JsaW5kOworICAgaWYgKGlzX2JsaW5kID0gUXVlcnlQcm9wKFBfQkxJTkQpKSB7CisgICAgICBpZiAoIXNpbGVudCkgeworICAgICAgICAgaWYgKHN0cmluZ3AoaXNfYmxpbmQpKQorICAgICAgICAgICAgdGVsbF9vYmplY3QodGhpc19vYmplY3QoKSwgaXNfYmxpbmQpOworICAgICAgICAgZWxzZSB0ZWxsX29iamVjdCh0aGlzX29iamVjdCgpLCAiRHUgYmlzdCBibGluZCFcbiIpOworICAgICAgfQorICAgICAgcmV0dXJuIDI7CisgICB9CisgICBpZiAoVXNlU2tpbGwoU0tfTklHSFRWSVNJT04pPD0wICYmCisgICAgICAgZW52aXJvbm1lbnQoKSAmJiBRdWVyeVByb3AoUF9QTEFZRVJfTElHSFQpPD0wICYmCisgICAgICAgKCFJU19MRUFSTkVSKHRoaXNfb2JqZWN0KCkpIHx8ICFRdWVyeShQX1dBTlRTX1RPX0xFQVJOKSkpCisgICB7CisgICAgICAgaWYgKCFzaWxlbnQpIHRlbGxfb2JqZWN0KHRoaXNfb2JqZWN0KCksICJFcyBpc3QgenUgZHVua2VsIVxuIik7CisgICAgICAgcmV0dXJuIDE7CisgICB9CisgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3N0ZC9saXZpbmcvbW9uZXloYW5kbGVyLmMgYi9zdGQvbGl2aW5nL21vbmV5aGFuZGxlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMjIyMjYKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvbGl2aW5nL21vbmV5aGFuZGxlci5jCkBAIC0wLDAgKzEsMjYgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBsaXZpbmcvbW9uZXloYW5kbGVyLmMgLS0gbW9uZXkgaGFuZGxlciBmb3IgbGl2aW5ncworLy8KKy8vICRJZDogbW9uZXloYW5kbGVyLmMgNjczOCAyMDA4LTAyLTE5IDE4OjQ2OjE0WiBIdW1uaSAkCisjcHJhZ21hIHN0cm9uZ190eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisKK2luaGVyaXQgIi9zdGQvY29udGFpbmVyL21vbmV5aGFuZGxlciI7CisKKy8vIEZ1bmt0aW9uZW4gc29sbGVuIG51ciBkYXMgUHJvZ3JhbW0gZXJzZXR6ZW4sIG5hdHVlcmxpY2ggbnVyIGluIGRlcgorLy8gQmx1ZXByaW50IF9kaWVzZXNfIE9iamVrdGVzLCBuaWNodCBpbiBhbmRlcmVuLiA7LSkgQlRXOiBOb3JtYWxlcndlaXNlCisvLyBzb2xsdGUgbmllbWFuZCBoaWVyZHJpbiBjcmVhdGUoKSBydWZlbiwgZGVyIGRhcyBEaW5nIGhpZXIgZXJidC4KK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZV9zdXBlcigpIHsKKyAgaWYgKG9iamVjdF9uYW1lKHRoaXNfb2JqZWN0KCkpID09IF9fRklMRV9fWy4uPDNdKQorICAgIHJlcGxhY2VfcHJvZ3JhbSgpOworfQorCisvLyB3aXJkIG5pY2h0IHZvbiBlcmJlbmRlbiBPYmpla3RlbiBnZXJ1ZmVuLiAoV296dSBhdWNoLikKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpIHsKKyAgY3JlYXRlX3N1cGVyKCk7Cit9CisKZGlmZiAtLWdpdCBhL3N0ZC9saXZpbmcvbW92aW5nLmMgYi9zdGQvbGl2aW5nL21vdmluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MTQ5ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvbGl2aW5nL21vdmluZy5jCkBAIC0wLDAgKzEsNDU3IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gbGl2aW5nL21vdmluZy5jIC0tIG1vdmluZyBvZiBsaXZpbmcgb2JqZWN0cworLy8KKy8vICRJZDogbW92aW5nLmMgOTQ0OCAyMDE2LTAxLTIyIDE3OjUyOjI4WiBaZXNzdHJhICQKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKworaW5oZXJpdCAiL3N0ZC90aGluZy9tb3ZpbmciOworCisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPGhvb2suaD4KKyNpbmNsdWRlIDxsaXZpbmcvbW92aW5nLmg+CisjaW5jbHVkZSA8bGl2aW5nL3NraWxscy5oPgorI2luY2x1ZGUgPHRoaW5nL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx0aGluZy9kZXNjcmlwdGlvbi5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPG5ld19za2lsbHMuaD4KKyNpbmNsdWRlIDxsaXZpbmcuaD4KKworI3VuZGVmIE5FRURfUFJPVE9UWVBFUworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorCisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgICAgaWYgKG9iamVjdF9uYW1lKHRoaXNfb2JqZWN0KCkpID09IF9fRklMRV9fWzAuLjwzXSkKKyAgICB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIG9mZmVySG9vayhIX0hPT0tfTU9WRSwxKTsKK30KKworcHVibGljIHZvaWQgQWRkUHVyc3VlcihvYmplY3Qgb2IpCit7CisgIG1peGVkICpwdXI7CisKKyAgaWYgKCFvYmplY3RwKG9iKSkKKyAgICByZXR1cm47CisKKyAgaWYgKCFwb2ludGVycChwdXI9UXVlcnkoUF9QVVJTVUVSUykpKQorICAgIHB1cj0oezAsKHt9KX0pOworICBlbHNlIGlmIChtZW1iZXIocHVyWzFdLG9iKSE9LTEpCisgICAgcmV0dXJuOworICAKKyAgU2V0UHJvcChQX1BVUlNVRVJTLCh7IHB1clswXSwgcHVyWzFdKyh7b2J9KS0oezB9KSB9KSk7CisgIG9iLT5fU2V0UHVyc3VlZChNRSk7Cit9CisKK3B1YmxpYyB2b2lkIFJlbW92ZVB1cnN1ZXIob2JqZWN0IG9iKQoreworICBtaXhlZCAqcHVyOworCisgIGlmIChwb2ludGVycChwdXI9UXVlcnkoUF9QVVJTVUVSUyxGX1ZBTFVFKSkgCisgICAgICAmJiBtZW1iZXIocHVyWzFdLG9iKSE9LTEpCisgIHsKKyAgICBwdXJbMV0tPSh7b2IsMH0pOworICAgIGlmIChvYikKKyAgICAgIG9iLT5fUmVtb3ZlUHVyc3VlZChNRSk7CisgICAgaWYgKCFwdXJbMF0mJiFzaXplb2YocHVyWzFdKSkKKyAgICAgIHB1cj0wOworICAgIFNldFByb3AoUF9QVVJTVUVSUyxwdXIpOworICB9Cit9CisKK3B1YmxpYyB2b2lkIF9TZXRQdXJzdWVkKG9iamVjdCBvYikKK3sKKyAgbWl4ZWQgKnB1cjsKKworICBpZiAoIXBvaW50ZXJwKHB1cj1RdWVyeShQX1BVUlNVRVJTKSkpCisgICAgcHVyPSh7MCwoe30pfSk7CisgIGVsc2UKKyAgICBpZiAob2JqZWN0cChwdXJbMF0pKQorICAgICAgcHVyWzBdLT5SZW1vdmVQdXJzdWVyKE1FKTsKKyAgcHVyWzBdPW9iOworICBwdXJbMV0tPSh7MH0pOworICBTZXQoUF9QVVJTVUVSUyxwdXIpOworfQorCitwdWJsaWMgdm9pZCBfUmVtb3ZlUHVyc3VlZChvYmplY3Qgb2IpCit7CisgIG1peGVkICpwdXI7CisKKyAgaWYgKCFwb2ludGVycChwdXI9UXVlcnkoUF9QVVJTVUVSUykpIHx8IHB1clswXSE9b2IpCisgICAgcmV0dXJuOworICBwdXJbMF09MDsKKyAgcHVyWzFdLT0oezB9KTsKKyAgaWYgKCFzaXplb2YocHVyWzFdKSkKKyAgICBwdXI9MDsKKyAgU2V0KFBfUFVSU1VFUlMscHVyKTsKK30KKworCitwcml2YXRlIHZvaWQga2FtcGZlbmRlKCBvYmplY3QgZW4gKSB7CisgIGlmICghb2JqZWN0cChlbikpIHJldHVybjsKKyAgdGVsbF9vYmplY3QoIE1FLCBjYXBpdGFsaXplKGVuLT5uYW1lKCkpICsKKyAgICAgICIgaXN0IGpldHp0IGhpbnRlciBEaXIgaGVyLlxuIiApOworICB0ZWxsX29iamVjdCggZW4sICJEdSB2ZXJmb2xnc3QgamV0enQgIiArIG5hbWUoV0VOKSArICIuXG4iICk7ICAgICAgCisgIGVuLT5JbnNlcnRTaW5nbGVFbmVteShNRSk7Cit9CisKK3ByaXZhdGUgaW50IF9pc19sZWFybmVyKG9iamVjdCBwbCkgeworICByZXR1cm4gSVNfTEVBUk5FUihwbCk7IAorfQorCisKKy8vIGEpIFBydWVmdW5nZW4sIG9iIGRhcyBtb3ZlIGVybGF1YnQgaXN0LgorLy8gYikgenVtIFVlYmVyc2NocmVpYmVuCitwcm90ZWN0ZWQgaW50IFByZXZlbnRNb3ZlKG9iamVjdCBkZXN0LCBvYmplY3Qgb2xkZW52LCBpbnQgbWV0aG9kKSB7CisKKyAgLy8gTV9OT0NIRUNLPyAtPiBCZXdlZ3VuZyBlaCBlcmxhdWJ0ICh1bmQgUnVlY2tnYWJld2VydCB3dWVyZGUgaWdub3JpZXJ0KSwKKyAgLy8gYWJlciBQcmV2ZW50SW5zZXJ0L1ByZXZlbnRMZWF2ZSgpIHJ1ZmVuIHVuZCBpZ25vcmllcmVuLgorICBpZiAoKG1ldGhvZCZNX05PQ0hFQ0spKSB7CisgICAgICAvLyBlcnN0IFByZXZlbnRMZWF2ZUxpdmluZygpIHJ1ZmVuLi4uCisgICAgICBpZihlbnZpcm9ubWVudCgpKSAgICAgICAgCisgICAgICAgICAgZW52aXJvbm1lbnQoKS0+UHJldmVudExlYXZlTGl2aW5nKHRoaXNfb2JqZWN0KCksIGRlc3QpOworICAgICAgLy8gZGFubiBQcmV2ZW50SW5zZXJ0TGl2aW5nKCkgaW0gWmllbC1FbnYuCisgICAgICBkZXN0LT5QcmV2ZW50SW5zZXJ0TGl2aW5nKHRoaXNfb2JqZWN0KCkpOworICAgICAgLy8gdW5kIHJhdXMuLi4KKyAgICAgIHJldHVybigwKTsKKyAgfQorCisgIC8vIGJlaSBMZWJld2VzZW4gbXVzcyBkaWUgQmV3ZWd1bmdzbWV0aG9kZSBNX0dPIHVuZCBNX1RQT1JUIHNlaW4uIERpZXMgaXN0CisgIC8vIGdsZWljaHplaWd0IGRpZSBSZXN0cmlrdGlvbiBnZWdlbiBkYXMgTmVobWVuIHZvbiBMZWJld2VzZW4sIGRhIGRvcnQKKyAgLy8gTV9HRVQvTV9HSVZFL01fUFVUIGV0Yy4gdmVyd2VuZGV0IHd1ZXJkZS4gQmVpIE1fR08gdW5kIE1fVFBPUlQgZmluZGV0CisgIC8vIGtlaW5lIFBydWVmdW5nIHN0YXR0LCBvYiBkYXMgT2JqZWt0IGlucyBaaWVsICdyZWlucGFzc3QnIChHZXdpY2h0LCBBbnphaGwKKyAgLy8gT2JqZWt0ZSB1c3cuKS4KKyAgLy8gSWNoIGZpbmRlIGVzIGV0d2FzIG1lcmt3dWVyZGlnIGdlYmF1dCAoWmVzc3RyYSkuCisgIGlmICggIShtZXRob2QgJiAoTV9HTyB8IE1fVFBPUlQpKSApCisgICAgICByZXR1cm4gTUVfUExBWUVSOworICAKKyAgLy8gYWx0ZSB1bmQgbmV1ZSBVbWdlYnVuZyBhdWYgTk9fVFBPUlQgcHJ1ZWZlbi4KKyAgaWYgKCAobWV0aG9kICYgTV9UUE9SVCkgKSB7CisgICAgaWYgKCBlbnZpcm9ubWVudCgpICYmCisgICAgICAgIChlbnZpcm9ubWVudCgpLT5RdWVyeVByb3AoUF9OT19UUE9SVCkgJiAoTk9fVFBPUlRfT1VUfE5PX1RQT1JUKSkgKQorICAgICAgICAgIHJldHVybiBNRV9DQU5UX1RQT1JUX09VVDsKKyAgICBlbHNlIGlmICggZGVzdC0+UXVlcnlQcm9wKFBfTk9fVFBPUlQpICYgKE5PX1RQT1JUX0lOfE5PX1RQT1JUKSApCisgICAgICAgICAgcmV0dXJuIE1FX0NBTlRfVFBPUlRfSU47CisgIH0KKworICAvLyBlcnN0IFByZXZlbnRMZWF2ZUxpdmluZygpIHRlc3Rlbi4uLgorICBpZiggZW52aXJvbm1lbnQoKSAmJiBlbnZpcm9ubWVudCgpLT5QcmV2ZW50TGVhdmVMaXZpbmcodGhpc19vYmplY3QoKSwgZGVzdCkpCisgICAgICByZXR1cm4gTUVfQ0FOVF9MRUFWRV9FTlY7CisgIC8vIGRhbm4gUHJldmVudEluc2VydExpdmluZygpIGltIFppZWwtRW52CisgIGlmIChkZXN0LT5QcmV2ZW50SW5zZXJ0TGl2aW5nKHRoaXNfb2JqZWN0KCkpKSAKKyAgICAgIHJldHVybiBNRV9DQU5UX0JFX0lOU0VSVEVEOworCisgIHJldHVybiAwOworfQorCisvLyBLcmFtcyBuYWNoIGRlbSBNb3ZlIG1hY2hlbiB1bmQgbmViZW5iZWkgenVtIFVlYmVyc2NocmVpYmVuLgorcHJvdGVjdGVkIHZvaWQgTm90aWZ5TW92ZShvYmplY3QgZGVzdCwgb2JqZWN0IG9sZGVudiwgaW50IG1ldGhvZCkgeworICBtaXhlZCByZXM7CisgIG9iamVjdCBlbmVtOworCisgIC8vIEJlZ3J1ZXNzdW5nc3NjaGxhZyBmdWVyIGRpZSBHZWdlbmVyCisgIGlmICggIShtZXRob2QgJiBNX05PX0FUVEFDSykgKQorICAgICAgSW5pdEF0dGFjaygpOworCisgIGlmICghb2JqZWN0cChNRSkpIHJldHVybjsKKworICAvLyBWZXJmb2xnZXIgbmFjaGhvbGVuLgorICBpZiAoIHBvaW50ZXJwKHJlcyA9IFF1ZXJ5KFBfUFVSU1VFUlMpKSAmJiBzaXplb2YocmVzWzFdKSApIHsKKyAgICAgIHdoaWxlICggcmVtb3ZlX2NhbGxfb3V0KCAiVGFrZUZvbGxvd2VycyIgKSA+PSAwICk7CisKKyAgICAgIGNhbGxfb3V0KCAiVGFrZUZvbGxvd2VycyIsIDAgKTsKKyAgfQorCisgIC8vIHVuZCBub2NoIGRhcyBUZWFtIG5hY2hob2xlbi4KKyAgaWYgKCBvbGRlbnYgIT0gZGVzdAorICAgICAgJiYgb2JqZWN0cChNRSkKKyAgICAgICYmIFF1ZXJ5UHJvcChQX1RFQU1fQVVUT0ZPTExPVykKKyAgICAgICYmIG9iamVjdHAoIGVuZW0gPSBJc1RlYW1MZWFkZXIoKSApICkKKyAgICAgIGVuZW0tPlN0YXJ0Rm9sbG93KG9sZGVudik7IC8vIFRlYW12ZXJmb2xndW5nCisKK30KKwordmFyYXJncyBwdWJsaWMgaW50IG1vdmUoIG9iamVjdHxzdHJpbmcgZGVzdCwgaW50IG1ldGhvZCwgc3RyaW5nIGRpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGV4dG91dCwgc3RyaW5nIHRleHRpbiApCit7CisgICAgaW50IHBhcmEsIG5pZ2h0dmlzLCBpbnZpcywgdG1wOworICAgIG9iamVjdCBvbGRlbnYsICppbnY7CisgICAgc3RyaW5nIGZuLHZjOworICAgIG1peGVkIHJlczsKKyAgICBtaXhlZCBob29rRGF0YSwgaG9va1JlczsKKworICAgIGlmICghb2JqZWN0cChkZXN0KSAmJiAhc3RyaW5ncChkZXN0KSkKKyAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIldyb25nIGFyZ3VtZW50IDEgdG8gbW92ZSgpLiAnZGVzdCcgbXVzdCBiZSBhICIKKyAgICAgICAgICAgICJzdHJpbmcgb3Igb2JqZWN0ISBBcmd1bWVudCB3YXM6ICUuMTAwT1xuIiwKKyAgICAgICAgICAgIGRlc3QpKTsKKworICAgIC8vIGFsdGVzIEVudiBlcnN0bWFsIG1lcmtlbi4KKyAgICBvbGRlbnYgPSBlbnZpcm9ubWVudCgpOworICAgIAorICAgIC8vZXJzdG1hbCBkZW4gcmljaHRpZ2VuIFppZWxyYXVtIHN1Y2hlbiwgYmV2b3IgaXJnZW5kd2VsY2hlIENoZWNrcyBnZW1hY2h0CisgICAgLy93ZXJkZW4uLi4KKyAgICAvLyBJc3QgZGVyIFNwaWVsZXIgaW4gZWluZXIgUGFyYWxsZWx3ZWx0PworICAgIGlmICggKHBhcmEgPSBRdWVyeVByb3AoUF9QQVJBKSkgJiYgaW50cChwYXJhKSApIHsKKyAgICAgICAgZm4gPSBvYmplY3RwKGRlc3QpID8gb2JqZWN0X25hbWUoZGVzdCkgOiBkZXN0OworCisgICAgICAgIC8vIEZhbGxzIGRlciBaaWVscmF1bSBuaWNodCBzY2hvbiBleHBsaXppdCBpbiBkZXIgUGFyYWxsZWx3ZWx0IGlzdCwKKyAgICAgICAgLy8gbmV1ZW4gWmllbHJhdW0gc3VjaGVuLiBBYmVyIG51ciwgd2VubiBmbiBrZWluICMgZW50aGFlbHQgKGFsc28ga2VpbgorICAgICAgICAvLyBDbG9uZSBpc3QpLCBzb25zdCB3dWVyZGUgZWluZSBCZXdlZ3VuZyBuYWNoIHJhdW0jNDJecGFyYSB2ZXJzdWNodCwKKyAgICAgICAgLy8gd2FzIGRhbm4gYnVnZ3QuIDstKSBQcm9ibGVtIHdpcmQgb2ZmZW5iYXIsIHdlbm4gZWluIFBhcmEtTGViZXdlc2VuCisgICAgICAgIC8vIGltIGNyZWF0ZSgpIGVpbmVzIFZDLVJhdW1zIGluIFBhcmEgaW4gZGVuIFJhdW0gYmV3ZWd0IHdpcmQsIGRhCisgICAgICAgIC8vIGRpZXNlciBkYW5uIG5vY2ggbmljaHQgdm9tIERyaXZlciB1bWJlbmFubnQgd3VyZGUgdW5kIHJhdW0jNDIKKyAgICAgICAgLy8gaGVpc3N0LgorICAgICAgICBpZiAoICFzaXplb2YocmVnZXhwKCAoeyBmbiB9KSwgIlxcXlsxLTldWzAtOV0qJCIgKSkgJiYKKyAgICAgICAgICAgIHN0cnJzdHIoZm4sIiMiKT09LTEgKQorICAgICAgICB7CisgICAgICAgICAgICBmbiArPSAiXiIgKyBwYXJhOworCisgICAgICAgICAgLy8gRGVyIFBhcmFsbGVsd2VsdC1SYXVtIG11c3MgZXhpc3RpZXJlbiB1bmQgZnVlciBTcGllbGVyCisgICAgICAgICAgLy8gZnJlaWdlZ2ViZW4gc2VpbiwgZGFtaXQgZXIgenVtIG5ldWVuIFppZWwgd2lyZC4gQW5zb25zdGVuCisgICAgICAgICAgLy8gZHVlcmZlbiBudXIgTlBDcywgVGVzdHNwaWVsZXIgdW5kIE1hZ2llciBoZXJlaW4uCisgICAgICAgICAgaWYgKCAoZmluZF9vYmplY3QoZm4pIAorICAgICAgICAgICAgICAgIHx8ICgoZmlsZV9zaXplKGZuKyIuYyIpPjAgfHwKKyAgICAgICAgICAgICAgICAgICAgKGZpbGVfc2l6ZSh2Yz1pbXBsb2RlKGV4cGxvZGUoZm4sIi8iKVswLi48Ml0sIi8iKSsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIi92aXJ0dWFsX2NvbXBpbGVyLmMiKT4wICYmCisgICAgICAgICAgICAgICAgICAgICFjYXRjaCh0bXA9KGludCljYWxsX290aGVyKHZjLCJRdWVyeVZhbGlkT2JqZWN0Iixmbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaXNoKSAmJiB0bXA+MCkpICYmCisgICAgICAgICAgICAgICAgICAgICFjYXRjaChsb2FkX29iamVjdChmbik7cHVibGlzaCkgKSkgJiYKKyAgICAgICAgICAgICAgICAgICghaW50ZXJhY3RpdmUoTUUpIHx8ICFmbi0+UXVlcnlQcm9wKFBfTk9fUExBWUVSUykgfHwgCisgICAgICAgICAgICAgICAgICAobWV0aG9kICYgTV9OT0NIRUNLKSB8fCBJU19MRUFSTkVSKE1FKSB8fAorICAgICAgICAgICAgICAgICAgKHN0cmluZ3AocmVzID0gUXVlcnlQcm9wKFBfVEVTVFBMQVlFUikpICYmCisgICAgICAgICAgICAgICAgICAgSVNfTEVBUk5FUiggbG93ZXJfY2FzZShyZXMpICkpKSApCisgICAgICAgICAgeworICAgICAgICAgICAgICBkZXN0ID0gZm47CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICAgIC8vIFdpciBibGVpYmVuIGluIGRlciBOb3JtYWx3ZWx0LgorICAgICAgICAgICAgICBwYXJhID0gMDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBqZXR6dCBlcnN0bWFsIEhvb2tzIGFicHJ1ZWZlbiwgZGEgc2llIGdnZi4gZGllIERhdGVuIGFlbmRlcm4uCisgICAgLy8gYWx0ZW4gUF9UTVBfTU9WRV9IT09LIHBydWVmZW4uCisgICAgaWYgKCByZXMgPSBRdWVyeVByb3AoUF9UTVBfTU9WRV9IT09LKSApeworICAgICAgICBpZiAoIHBvaW50ZXJwKHJlcykgJiYgc2l6ZW9mKHJlcykgPj0gMworICAgICAgICAgICAgICYmIGludHAocmVzWzBdKSAmJiB0aW1lKCk8cmVzWzBdCisgICAgICAgICAgICAgJiYgb2JqZWN0cChyZXNbMV0pICYmIHN0cmluZ3AocmVzWzJdKSApeworICAgICAgICAgICAgaWYgKCByZXMgPSBjYWxsX290aGVyKCByZXNbMV0sIHJlc1syXSwgZGVzdCwgbWV0aG9kLCBkaXJlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRvdXQsIHRleHRpbiApICl7CisgICAgICAgICAgICAgICAgaWYgKCBwb2ludGVycChyZXMpICYmIHNpemVvZihyZXMpID09IDUgKXsKKyAgICAgICAgICAgICAgICAgICAgZGVzdCA9IHJlc1swXTsKKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gcmVzWzFdOworICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSByZXNbMl07CisgICAgICAgICAgICAgICAgICAgIHRleHRvdXQgPSByZXNbM107CisgICAgICAgICAgICAgICAgICAgIHRleHRpbiA9IHJlc1s0XTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIGludHAocmVzKSAmJiByZXMgPT0gLTEgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTUVfQ0FOVF9MRUFWRV9FTlY7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgU2V0UHJvcCggUF9UTVBfTU9WRV9IT09LLCAwICk7CisgICAgfQorICAgIC8vIG1vdmUgaG9vayBuYWNoIG5ldWVtIEhvb2tzeXN0ZW0gdHJpZ2dlcm4uCisgICAgaG9va0RhdGE9KHtkZXN0LG1ldGhvZCxkaXJlY3Rpb24sdGV4dG91dCx0ZXh0aW59KTsKKyAgICBob29rUmVzPUhvb2tGbG93KEhfSE9PS19NT1ZFLGhvb2tEYXRhKTsKKyAgICBpZihob29rUmVzICYmIHBvaW50ZXJwKGhvb2tSZXMpICYmIHNpemVvZihob29rUmVzKT5IX1JFVERBVEEpIHsKKyAgICAgIGlmKGhvb2tSZXNbSF9SRVRDT0RFXT09SF9DQU5DRUxMRUQpIHsKKyAgICAgICAgcmV0dXJuIE1FX0NBTlRfTEVBVkVfRU5WOworICAgICAgfQorICAgIGVsc2UgaWYoaG9va1Jlc1tIX1JFVENPREVdPT1IX0FMVEVSRUQgJiYgaG9va1Jlc1tIX1JFVERBVEFdICYmCisgICAgICAgICAgcG9pbnRlcnAoaG9va1Jlc1tIX1JFVERBVEFdKSAmJiBzaXplb2YoaG9va1Jlc1tIX1JFVERBVEFdKT49NSApeworICAgICAgZGVzdCA9IGhvb2tSZXNbSF9SRVREQVRBXVswXTsKKyAgICAgIG1ldGhvZCA9IGhvb2tSZXNbSF9SRVREQVRBXVsxXTsKKyAgICAgIGRpcmVjdGlvbiA9IGhvb2tSZXNbSF9SRVREQVRBXVsyXTsKKyAgICAgIHRleHRvdXQgPSBob29rUmVzW0hfUkVUREFUQV1bM107CisgICAgICB0ZXh0aW4gPSBob29rUmVzW0hfUkVUREFUQV1bNF07CisgICAgICB9CisgICAgfQorCisgICAgLy8gZGVzdCBhdWYgT2JqZWN0IG5vcm1pZXJlbgorICAgIGlmIChzdHJpbmdwKGRlc3QpKSBkZXN0PWxvYWRfb2JqZWN0KGRlc3QpOworCisgICAgLy8gamV0enQgQ2hlY2tzIGR1cmNoZnVlaHJlbiwgb2IgZGFzIE1vdmUgZHVyY2hnZWZ1ZWhydCB3ZXJkZW4gZGFyZi4KKyAgICBpZiAodG1wPVByZXZlbnRNb3ZlKGRlc3QsIG9sZGVudiwgbWV0aG9kKSkgeworICAgICAgLy8gYXVmIGd1ZWx0aWdlbiBGZWhsZXIgcHJ1ZWZlbiwgd2VyIHdlaXNzLCB3YXMgTWFnaWVyIGRhIGV2dGwuCisgICAgICAvLyB2ZXJzZWhlbnRsaWNoIHp1cnVlY2tnZWJlbi4KKyAgICAgIGlmIChWQUxJRF9NT1ZFX0VSUk9SKHRtcCkpCisgICAgICAgIHJldHVybih0bXApOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4oTUVfRE9OVF9XQU5UX1RPX0JFX01PVkVEKTsKKyAgICB9CisgIAorICAgIGlmICggaW52aXMgPSBRdWVyeVByb3AoUF9JTlZJUykgKQorICAgICAgICBtZXRob2QgfD0gTV9TSUxFTlQ7CisKKyAgICBpZiAoIG9iamVjdHAob2xkZW52KSApIHsKKyAgICAgICAgaWYgKCAhKG1ldGhvZCAmIE1fU0lMRU5UKSApIHsKKyAgICAgICAgICAgIHN0cmluZyAqbW91dDsKKyAgICAgICAgICAgIGlmICggIXRleHRvdXQgKXsKKyAgICAgICAgICAgICAgICBpZiAoIG1ldGhvZCAmIE1fVFBPUlQgKQorICAgICAgICAgICAgICAgICAgICB0ZXh0b3V0ID0gKHN0cmluZykgUXVlcnlQcm9wKFBfTU1TR09VVCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChzdHJpbmcpIFF1ZXJ5UHJvcChQX01TR09VVCk7CisgICAgICAgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgICAgICAgICAgdGV4dG91dCA9IChtb3V0ID0gZXhwbG9kZSggKHN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1ZXJ5UHJvcChQX01TR09VVCkgfHwgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIyIgKSlbMF0KKyAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoc3RyaW5nKVF1ZXJ5UHJvcChQX01NU0dPVVQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoICFzaXplb2YoZGlyZWN0aW9uKSApCisgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gMDsKKworICAgICAgICAgICAgaW52ID0gYWxsX2ludmVudG9yeShlbnZpcm9ubWVudCgpKSAtICh7IHRoaXNfb2JqZWN0KCkgfSk7CisgICAgICAgICAgICBpbnYgPSBmaWx0ZXIoIGludiwgIydsaXZpbmcvKicqLyApOworICAgICAgICAgICAgaW52IC09IGZpbHRlcl9vYmplY3RzKCBpbnYsICJDYW5ub3RTZWUiLCAxICk7CisKKyAgICAgICAgICAgIGZpbHRlciggaW52LCAjJ3RlbGxfb2JqZWN0LyonKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUoIFdFUiwgMiApICsgIiAiICsgdGV4dG91dCArCisgICAgICAgICAgICAgICAgICAgICAgICAgIChkaXJlY3Rpb24gPyAiICIgKyBkaXJlY3Rpb24gOiAiIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZW9mKG1vdXQpID4gMSA/IG1vdXRbMV0gOiAiIikgKyAiLlxuIiApOworICAgICAgICB9CisgICAgICAgIC8vIE1hZ2llciBzZWhlbiBhdWNoIEJld2VndW5nZW4sIGRpZSBNX1NJTEVOVCBzaW5kCisgICAgICAgIGVsc2UgaWYgKCBpbnRlcmFjdGl2ZShNRSkgKXsKKyAgICAgICAgICAgIGludiA9IChhbGxfaW52ZW50b3J5KGVudmlyb25tZW50KCkpICYgdXNlcnMoKSkKKyAgICAgICAgICAgICAgICAtICh7IHRoaXNfb2JqZWN0KCkgfSk7CisgICAgICAgICAgICBpbnYgPSBmaWx0ZXIoIGludiwgIydfaXNfbGVhcm5lci8qJyovICk7CisKKyAgICAgICAgICAgIGlmICggaW52aXMgKQorICAgICAgICAgICAgICAgIGZuID0gIigiICsgY2FwaXRhbGl6ZShnZXR1aWQoTUUpKSArICIpIHZlcnNjaHdpbmRldCAiCisgICAgICAgICAgICAgICAgICAgICJ1bnNpY2h0YmFyLlxuIjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmbiA9IGNhcGl0YWxpemUoZ2V0dWlkKE1FKSkgKyAiIHZlcnNjaHdpbmRldCBnYW56IGxlaXNlLlxuIjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZmlsdGVyKCBpbnYsICMndGVsbF9vYmplY3QvKicqLywgZm4gKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gTmFja2Vuc2NobGFnIGJlaW0gRmx1ZWNodGVuOgorICAgICAgICBpZiAoICEobWV0aG9kICYgTV9OT19BVFRBQ0spICYmIG9iamVjdHAoTUUpICkKKyAgICAgICAgICAgIEV4aXRBdHRhY2soKTsKKyAgICAgICAgLy9mYWxscyBuYWNoIEV4aXRBdHRhY2soKSBkYXMgTGl2aW5nIG5pY2h0IG1laHIgZXhpc3RpZXJ0LCBtdXNzIGRhcworICAgICAgICAvL21vdmUoKSBhdWNoIG5pY2h0IG1laHIgZm9ydGdlc2V0enQgd2VyZGVuLiBXZWl0ZXIgdW50ZW4gZ2lidCBlcyBhdWNoCisgICAgICAgIC8vbWluLiBlaW5lIFN0ZWxsZSwgZGllIG5pY2h0IHBydWVmdCB1bmQgZ2dmLiBidWdndC4gRGFoZXIgZXJmb2xndAorICAgICAgICAvL2hpZXIgZ2dmLiBlaW4gQWJicnVjaC4gMTUuMTEuMDYgWmVzc3RyYQorICAgICAgICBpZiAoIW9iamVjdHAoTUUpKSByZXR1cm4oTUVfV0FTX0RFU1RSVUNURUQpOworCisgICAgICAgIC8vIE5hY2tlbnNjaGxhZyBrYW5uIE1FIGluIGRlbiBUb2Rlc3JhdW0gYmV3ZWd0IGhhYmVuLi4uCisgICAgICAgIGlmICggb2xkZW52ID09IGVudmlyb25tZW50KCkgKSB7CisgICAgICAgICAgICAvLyBGdWVyIGFsbGUgYW53ZXNlbmRlbiBnZWduZXIga2FtcGZlbmRlKCkgYXVmcnVmZW4KKyAgICAgICAgICAgIGZpbHRlcigoUXVlcnlFbmVtaWVzKClbMF0gJiBhbGxfaW52ZW50b3J5KG9sZGVudikpLSh7MH0pLAorICAgICAgICAgICAgICAgICMna2FtcGZlbmRlKTsKKyAgICAgICAgICAgIC8vIEJ1Z3MgaW0gZXhpdCgpIHNpbmQgb2huZSBjYXRjaCgpIGVpbmZhY2ggbWlzdC4KKyAgICAgICAgICAgIGNhdGNoKGVudmlyb25tZW50KCktPmV4aXQoTUUsIGRlc3QpO3B1Ymxpc2gpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gaXJnZW5kd2FzIGthbm4gZGFzIE9iamVrdCB6ZXJzdG9lcnQgaGFiZW4sIHouQi4gZW52LT5leGl0KCkuCisgICAgaWYgKCFvYmplY3RwKE1FKSkgcmV0dXJuKE1FX1dBU19ERVNUUlVDVEVEKTsKKworICAgIGlmICggb2xkZW52ICE9IGVudmlyb25tZW50KCkgKQorICAgICAgICAvLyBEZXIgTmFja2Vuc2NobGFnIG9kZXIgZXhpdCgpIGtvZW5uZW4gZWluZW4gc2Nob24gYmV3ZWd0IGhhYmVuLgorICAgICAgICAvLyBVbmQgd2VubiBlcyBpbiBkZW4gVG9kZXNyYXVtIGlzdC4gO14pCisgICAgICAgIHJldHVybiBNT1ZFX09LOworICAgIAorICAgIFNldFByb3AoIFBfUFJFUEFSRURfU1BFTEwsIDAgKTsgLy8gU3BydWNodm9yYmVyZWl0dW5nIGFiZ2Vicm9jaGVuCisgICAgU2V0UHJvcCggUF9MQVNUX01PVkUsIHRpbWUoKSApOyAvLyBaZWl0cHVua3QgZGVyIGxldHp0ZW4gQmV3ZWd1bmcKKyAgICAKKyAgICBtb3ZlX29iamVjdChNRSwgZGVzdCk7CisgICAgaWYgKCFvYmplY3RwKE1FKSkKKyAgICAgIHJldHVybihNRV9XQVNfREVTVFJVQ1RFRCk7CisKKyAgICBkZXN0ID0gZW52aXJvbm1lbnQoKTsKKyAgICAKKyAgICBuaWdodHZpcyA9IFVzZVNraWxsKFNLX05JR0hUVklTSU9OKTsKKyAgICAvLyBNZWxkdW5nZW4gYW4gbmljaHQtQmxpbmRlIGF1c2dlYmVuLCBmYWxscyBrZWluZSAnc3RpbGxlJyBCZXdlZ3VuZworICAgIGlmICggIShtZXRob2QgJiBNX1NJTEVOVCkgKSB7CisgICAgICBpZiAoICF0ZXh0aW4gKSB7ICAgICAgICAKKyAgICAgICAgaWYgKCBtZXRob2QgJiBNX1RQT1JUICkKKyAgICAgICAgICAgICAgdGV4dGluID0gKHN0cmluZykgUXVlcnlQcm9wKFBfTU1TR0lOKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICB0ZXh0aW4gPSAoc3RyaW5nKSBRdWVyeVByb3AoUF9NU0dJTik7CisgICAgICB9CisgICAgICAgICAgICAKKyAgICAgIGludiA9IGFsbF9pbnZlbnRvcnkoZW52aXJvbm1lbnQoKSkgLSAoeyB0aGlzX29iamVjdCgpIH0pOworICAgICAgaW52ID0gZmlsdGVyKCBpbnYsICMnbGl2aW5nLyonKi8gKTsKKyAgICAgICAgICAgIGludiAtPSBmaWx0ZXJfb2JqZWN0cyggaW52LCAiQ2Fubm90U2VlIiwgMSApOworICAgICAgICAgICAgZmlsdGVyKCBpbnYsICMndGVsbF9vYmplY3QvKicqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShuYW1lKCBXRVIsIDAgKSkgKyAiICIgKyB0ZXh0aW4gKyAiLlxuIiApOworICAgIH0KKyAgICAvLyBzb25zdDogTWFnaWVyIHNlaGVuIGF1Y2ggTV9TSUxFTlQtQmV3ZWd1bmdlbiwgaGllciBhbHNvIG51ciBhbiBNYWdpZXIKKyAgICAvLyBhdXNnZWJlbiwgYWxsZSBhbmRlcmVuIHNlaGVuIGVoIG5peC4KKyAgICBlbHNlIGlmICggaW50ZXJhY3RpdmUoTUUpICkgeyAgCisgICAgICBpbnYgPSAoYWxsX2ludmVudG9yeShlbnZpcm9ubWVudCgpKSAmIHVzZXJzKCkpIC0gKHt0aGlzX29iamVjdCgpfSk7ICAgICAgICAKKyAgICAgIGludiA9IGZpbHRlciggaW52LCAjJ19pc19sZWFybmVyLyonKi8gKTsgICAgICAgIAorICAgICAgaWYgKCBpbnZpcyApCisgICAgICAgIGZuID0gIigiICsgY2FwaXRhbGl6ZShnZXR1aWQoTUUpKSArICIpIHRhdWNodCB1bnNpY2h0YmFyIGF1Zi5cbiI7CisgICAgICBlbHNlCisgICAgICAgIGZuID0gY2FwaXRhbGl6ZShnZXR1aWQoTUUpKSArICIgc2NobGVpY2h0IGxlaXNlIGhlcmVpbi5cbiI7ICAgICAgICAKKyAgICAgIGZpbHRlciggaW52LCAjJ3RlbGxfb2JqZWN0LCBmbiApOyAgICAKKyAgICB9CisKKyAgICAvLyAiT2JqZWt0IiB1ZWJlciBkYXMgTW92ZSBpbmZvcm1pZXJlbi4KKyAgICBOb3RpZnlNb3ZlKGRlc3QsIG9sZGVudiwgbWV0aG9kKTsKKworICAgIC8vIEluaXRBdHRhY2soKSBpbiBOb3RpZnlNb3ZlKCkga2FubiBkYXMgT2JqZWt0IHplcnN0b2VydCBoYWJlbi4KKyAgICBpZiAoIW9iamVjdHAoTUUpKQorICAgICAgcmV0dXJuKE1FX1dBU19ERVNUUlVDVEVEKTsKKworICAgIC8vc2NoZWludCB3b2hsIGdla2xhcHB0IHp1IGhhYmVuLgorICAgIHJldHVybiBNT1ZFX09LOworfQorCitwdWJsaWMgdm9pZCBUYWtlRm9sbG93ZXJzKCkKK3sKKyAgbWl4ZWQgKmYsZW52OworICBpbnQgbWV0aCxpLHI7CisKKyAgZj1RdWVyeShQX1BVUlNVRVJTKTsKKyAgaWYgKCFwb2ludGVycChmKSkKKyAgICByZXR1cm47CisgIGVudj1lbnZpcm9ubWVudCgpOworICBpZihvYmplY3RfbmFtZShlbnYpID09ICIvcm9vbS9uZXR6dG90IikgcmV0dXJuOworICBmb3JlYWNoKG9iamVjdCBmb2xsb3dlcjogZlsxXS0oezB9KSApIHsKKyAgICAvLyBkaWUgcHJ1ZWZ1bmcgYXVmIG9iamVjdHAgaXN0IG5pY2h0IHZlcnJ1ZWNrdCwgZXMga2FubiB0aGVvLiBzZWluLCBkYXNzCisgICAgLy8gVmVyZm9sZ2VyIGltIFByZXZlbnRGb2xsb3coKSBvZGVyIGluIGlocmVtIG1vdmUvaW5pdCBhbmRlcmUgVmVyZm9sZ2VyCisgICAgLy8gemVyc3RvZXJlbi4KKyAgICBpZiAob2JqZWN0cChmb2xsb3dlcikgJiYgZW52aXJvbm1lbnQoZm9sbG93ZXIpIT1lbnYpIHsKKyAgICAgIC8vbWV0aD1NX05PQ0hFQ0s7CisgICAgICBtZXRoPU1fR087CisgICAgICBpZiAoZm9sbG93ZXItPlF1ZXJ5KFBfRk9MTE9XX1NJTEVOVCkpCisgICAgICAgICAgbWV0aHw9TV9TSUxFTlR8TV9OT19TSE9XOworICAgICAgY2F0Y2gocj1mb2xsb3dlci0+UHJldmVudEZvbGxvdyhlbnYpO3B1Ymxpc2gpOworICAgICAgaWYgKCFyKQorICAgICAgICAgIGZvbGxvd2VyLT5tb3ZlKGVudixtZXRoKTsKKyAgICAgIGVsc2UgaWYgKHI9PTIpCisgICAgICAgICAgUmVtb3ZlUHVyc3Vlcihmb2xsb3dlcik7CisgICAgfQorICB9Cit9CisKK3ZhcmFyZ3MgcHVibGljIGludCByZW1vdmUoKQoreyBvYmplY3QgdGVhbTsKKworICBpZiAoZW52aXJvbm1lbnQoKSkKKyAgeworICAgIGlmICggb2JqZWN0cCh0ZWFtPVF1ZXJ5KFBfVEVBTSkpICkKKyAgICAgIGNhdGNoKHRlYW0tPlJlbW92ZU1lbWJlcihNRSk7cHVibGlzaCk7CisKKyAgICBlbnZpcm9ubWVudCgpLT5Ob3RpZnlSZW1vdmUoTUUpOworICB9CisgIGRlc3RydWN0KE1FKTsKKyAgcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL3N0ZC9saXZpbmcvcHV0X2FuZF9nZXQuYyBiL3N0ZC9saXZpbmcvcHV0X2FuZF9nZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTFhOTdmCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL2xpdmluZy9wdXRfYW5kX2dldC5jCkBAIC0wLDAgKzEsMTI0MyBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGxpdmluZy9wdXRfYW5kX2dldC5jIC0tIHRha2luZyBhbmQgcHV0dGluZyB0aGluZ3MKKy8vCisvLyAkSWQ6IHB1dF9hbmRfZ2V0LmMgODc1NSAyMDE0LTA0LTI2IDEzOjEzOjQwWiBaZXNzdHJhICQKKworLyoKKyAgR3J1bmRsZWdlbmQgbmV1IHN0cnVrdHVyaWVydCB2b24gQW15bnRob3IgaW0gQXByaWwtSnVuaSAyMDA3CisKK0RpZSBlaWdlbnRsaWNoZW4gRnVua3Rpb25lbjoKKworICBwcml2YXRlIHN0cmluZyBwdXRfb3JfZ2V0KG9iamVjdCBvLCBvYmplY3QgZGVzdCkKKyAgICBCZXdlZ3QgZWluIGVpbnplbG5lcyBPYmpla3QgbWl0IGF1dG9tYXRpc2NoIGJlc3RpbW10ZXIgTWV0aG9kLiBHaWJ0IGltCisgICAgRXJmb2xnc2ZhbGwgMCB6dXJ1ZWNrLCBzb25zdCBkaWUgYXVzenVnZWJlbmRlIEZlaGxlcm1lbGR1bmcuCisKKyAgdmFyYXJncyBpbnQgZHJvcChvYmplY3QgbywgbWl4ZWQgbXNnKQorICB2YXJhcmdzIGludCBwdXQob2JqZWN0IG8sIG9iamVjdCBkZXN0LCBtaXhlZCBtc2cpCisgIHZhcmFyZ3MgaW50IHBpY2sob2JqZWN0IG8sIG1peGVkIG1zZykKKyAgdmFyYXJncyBpbnQgZ2l2ZShvYmplY3Qgbywgb2JqZWN0IGRlc3QsIG1peGVkIG1zZykKKyAgdmFyYXJncyBpbnQgc2hvdyhvYmplY3Qgbywgb2JqZWN0IGRlc3QsIG1peGVkIG1zZykKKyAgICBEZXIgU3BpZWxlciBuaW1tdC9sZWd0L2dpYnQvemVpZ3QvbGFlc3N0IGVpbiBPYmpla3QgZmFsbGVuLCB3b2JlaSBkaWUKKyAgICBlbnRzcHJlY2hlbmRlbiBvZGVyIG9wdGlvbmFsIGFid2VpY2hlbmRlIChpbSBGb3JtYXQgdm9uIFBfWFhYX01TRykgb2RlcgorICAgIGdhciBrZWluZSAobXNnID09IDEpIE1lbGR1bmdlbiBhdXNnZWdlYmVuIHdlcmRlbi4gRXMgbGllZ3QgaW4gZGVyCisgICAgVmVyYW50d29ydHVuZyBkZXMgUnVmZW5kZW4sIHNpbm52b2xsZSBXZXJ0ZSB6dSB1ZWJlcmdlYmVuOyBpbnNiZXNvbmRlcmUKKyAgICB3aXJkIG5pY2h0IGdlcHJ1ZWZ0LCBvYiBzaWNoIGRpZSBPYmpla3RlIGluIGRlciBSZWljaHdlaXRlIGRlcyBTcGllbGVycworICAgIGJlZmluZGVuLiBHaWJ0IDEgenVydWVjaywgd2VubiBkYXMgT2JqZWt0IGJld2VndCB3dXJkZSwgc29uc3QgMC4KKworSGlsZnNmdW5rdGlvbmVuOgorCisgIHByaXZhdGUgb2JqZWN0ICpfX2ZpbmRfb2JqZWN0cyhzdHJpbmcgKnRva2Vucywgb2JqZWN0IGVudiwgaW50IGlzX3NvdXJjZSkKKyAgb2JqZWN0ICpmaW5kX29iamVjdHMoc3RyaW5nIHdoYXQsIG9iamVjdCBlbnYsIGludCBpc19zb3VyY2UpCisgICAgU3VjaHQgaW0gUmF1bSB1bmQgaW0gU3BpZWxlciAob2RlciBhbHRlcm5hdGl2IGluIGRlciBhbmdlZ2ViZW5lbiBVbWdlYnVuZykKKyAgICBuYWNoIGRlbiBpbiB0b2tlbnMvd2hhdCBiZXplaWNobmV0ZW4gT2JqZWt0ZW4uIGlzX3NvdXJjZSBiZXN0aW1tdCBkaWUKKyAgICBlcndhcnRldGUgZ3JhbW1hdGlzY2hlIEZvcm0gKDAgZnVlciAidG9wZiBhdWYgaGVyZCIgdW5kIDEgZnVlciAidG9wZiB2b24KKyAgICBoZXJkIiwgc2llaGUgTWFucGFnZSkuCisKKyAgdmFyYXJncyBpbnQgZHJvcF9vYmplY3RzKHN0cmluZyBzdHIsIG1peGVkIG1zZykKKyAgdmFyYXJncyBpbnQgcHV0X29iamVjdHMoc3RyaW5nIHN0ciwgaW50IGNhc3VzLCBzdHJpbmcgdmVyYiwgbWl4ZWQgbXNnKQorICB2YXJhcmdzIGludCBwaWNrX29iamVjdHMoc3RyaW5nIHN0ciwgbWl4ZWQgbXNnLCBpbnQgZmxhZykKKyAgdmFyYXJncyBpbnQgZ2l2ZV9vYmplY3RzKHN0cmluZyBzdHIsIG1peGVkIG1zZykKKyAgdmFyYXJncyBpbnQgc2hvd19vYmplY3RzKHN0cmluZyBzdHIsIG1peGVkIG1zZykKKyAgICBFaW4gQmVmZWhsIHdpZSAid2lyZiB3YWZmZW4gd2VnIiByZXN1bHRpZXJ0IGluIGVpbmVtIEF1ZnJ1ZiB2b24KKyAgICBkcm9wX29iamVjdHMoIndhZmZlbiIpLiBEaWVzZSBGdW5rdGlvbmVuIHNpbmQgaGF1cHRzYWVjaGxpY2ggZnVlciBkaWUKKyAgICBCZWhhbmRsdW5nIGRlciBqZXdlaWxpZ2VuIEtvbW1hbmRvcyB2b3JnZXNlaGVuLCBrb2VubmVuIGplZG9jaCBhdWNoIGZ1ZXIKKyAgICBlaWdlbmUgQmVmZWhsZSB2ZXJ3ZW5kZXQgd2VyZGVuLiBwdXRfb2JqZWN0cygpIGVyd2FydGV0IGF1c3NlcmRlbSBkZW4KKyAgICBLYXN1cyAoIkR1IGthbm5zdCBuaWNodHMgYW4gREVSIFBpbndhbmQgYmVmZXN0aWdlbi4iKSB1bmQgZGFzIHZlcndlbmRldGUKKyAgICBWZXJiIGluIGRlciBHdW5kZm9ybSAoImJlZmVzdGlnZW4iKS4gRGFzIEZsYWcgZnVlciBwaWNrX29iamVjdHMoKSBnaWJ0CisgICAgYW4sIG9iIGRhcyBPYmpla3QgYXVjaCBlaW5mYWNoIGhlcnVtbGllZ2VuIGRhcmYgKCJuaW1tIC4uLiIpIG9kZXIgbmljaHQKKyAgICAoImhvbGUgLi4uIikuIEdpYnQgYmVpIEVyZm9sZyAxLCBzb25zdCAwIHp1cnVlY2suCisKKyAgb2JqZWN0ICptb3ZlZF9vYmplY3RzKCkKKyAgb2JqZWN0IG1vdmVkX3doZXJlKCkKKyAgICBHaWJ0IGRpZSBlYmVuIGZhbGxlbmdlbGFzc2VuZW4vZ2VzdGVja3Rlbi8uLi4gT2JqZWt0ZSB6dXJ1ZWNrIHVuZCB3b2hpbgorICAgIHNpZSBnZXN0ZWNrdC93ZW0gc2llIGdlZ2ViZW4vZ2V6ZWlndCB3dXJkZW4uIEZ1ZXIgZGVuIEZhbGwsIGRhc3MgbWFuCisgICAgYW5zY2hsaWVzc2VuZCBub2NoIGV0d2FzIG1pdCBpaG5lbiBtYWNoZW4gbW9lY2h0ZS4KKworRGllIGVpbnplbG5lbiBLb21tYW5kb3M6CisgIHN0YXRpYyBpbnQgZmFsbGVubGFzc2VuKHN0cmluZyBzdHIpCisgIHN0YXRpYyBpbnQgd2VyZmVuKHN0cmluZyBzdHIpCisgIHN0YXRpYyBpbnQgbGVnZW4oc3RyaW5nIHN0cikKKyAgc3RhdGljIGludCBzdGVja2VuKHN0cmluZyBzdHIpCisgIHN0YXRpYyBpbnQgaG9sZW4oc3RyaW5nIHN0cikKKyAgc3RhdGljIGludCBuZWhtZW4oc3RyaW5nIHN0cikKKyAgc3RhdGljIGludCBnZWJlbihzdHJpbmcgc3RyKQorICAgIE1pbmltYWxlIFdyYXBwZXIgZnVlciBYWFhfb2JqZWN0cygpLCBlbnRmZXJuZW4gImZhbGxlbiIsICJ3ZWciIGJ6dy4gImFiIgorICAgIGF1cyBkZW4gQXJndW1lbnRlbiB1bmQgc2V0emVuIGVudHNwcmVjaGVuZGUgU3RhbmRhcmQtRmVobGVybWVsZHVuZ2VuLgorICAgIAorICBwcm90ZWN0ZWQgdm9pZCBhZGRfcHV0X2FuZF9nZXRfY29tbWFuZHMoKQorICAgIFJlZ2lzdHJpZXJ0IG9iaWdlIEZ1bmt0aW9uZW4gcGVyIGFkZF9hY3Rpb24oKS4KKworQXVzIHJlaW5lbiBLb21wYXRpYmlsaXRhZXRzZ3J1ZW5kZW4gd2VpdGVyaGluIGVudGhhbHRlbjoKKworICBvYmplY3QqIGZpbmRfb2JzKHN0cmluZyBzdHIsIGludCBtZXRoKQorICBpbnQgcGlja19vYmoob2JqZWN0IG9iKQorICBpbnQgZHJvcF9vYmoob2JqZWN0IG9iKQorICBpbnQgcHV0X29iaihvYmplY3Qgb2IsIG9iamVjdCB3aGVyZSkKKyAgaW50IGdpdmVfb2JqKG9iamVjdCBvYiwgb2JqZWN0IHdoZXJlKQorICAgIHNpZWhlIE1hbnBhZ2VzCisKKyovCisKKy8qCisgIDIxLiBPa3QgMTk5OCBrb21wbGV0dGUgbmV1IHByb2dyYW1taWVydW5nIHZvbiBwdXRfYW5kX2dldC5jIChQYWRyZWljKQorLSBkaWUgR3J1cHBlbmF1c3dhaGxlbiBhbGxlcywgd2FmZmVuIHVuZCBydWVzdHVuZ2VuIHNpbmQgamV0enQgaW1tZXIgbW9lZ2xpY2gKKyAgZGllIEdydXBwZW4gc2luZCBzZWhyIGxlaWNodCBlcndlaXRlcmJhciB1bmQgbWFuIHNvbGx0ZSBzaWNoIG5pY2h0IHNjaGV1ZW4KKyAgZGF2b24gZ2VicmF1Y2ggenUgbWFjaGVuLi4uCistIG1pdCAiaW4gbWlyIiB1bmQgImltIHJhdW0iIGthbm4gbWFuIGRlbiBhYnp1c3VjaGVuZGVuIFJhdW0gc2VsYnN0IGVpbmdyZW56ZW4KKy0gbWl0ICJhbGxlfGplZGV8amVkZW58amVkZXMgPGlkPiIga2FubiBtYW4gYXVjaCBnYW56ZSBvYmpla3RncnVwcGVuIGF1c3dhZWhsZW4KKyovCisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPHRoaW5nL2Rlc2NyaXB0aW9uLmg+CisjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPGNvbnRhaW5lci5oPgorI3VuZGVmIE5FRURfUFJPVE9UWVBFUworCisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKworI2RlZmluZSBUTUUoc3RyKSB0ZWxsX29iamVjdCh0aGlzX29iamVjdCgpLCBcCisgICAgYnJlYWtfc3RyaW5nKHN0ciwgNzgsIDAsIEJTX0xFQVZFX01ZX0xGUykpCisjZGVmaW5lIFRPQihvYixzdHIpIHRlbGxfb2JqZWN0KG9iLCBicmVha19zdHJpbmcoc3RyLCA3OCwgMCwgQlNfTEVBVkVfTVlfTEZTKSkKKyNkZWZpbmUgU0FZKHN0cikgdGVsbF9yb29tKGVudmlyb25tZW50KCksIFwKKyAgICBicmVha19zdHJpbmcoc3RyLCA3OCwgMCwgQlNfTEVBVkVfTVlfTEZTKSwgKHt0aGlzX29iamVjdCgpfSkpCisjZGVmaW5lIFNBWTIob2JzLCBzdHIpIHRlbGxfcm9vbShlbnZpcm9ubWVudCgpLCBcCisgICAgYnJlYWtfc3RyaW5nKHN0ciwgNzgsIDAsIEJTX0xFQVZFX01ZX0xGUyksICh7dGhpc19vYmplY3QoKX0pICsgb2JzKQorI2RlZmluZSBORihzdHIpIF9ub3RpZnlfZmFpbChicmVha19zdHJpbmcoc3RyLCA3OCwgMCwgQlNfTEVBVkVfTVlfTEZTKSkKKworcHJpdmF0ZSBub3NhdmUgY2xvc3VyZSBjbDsKK3ByaXZhdGUgbm9zYXZlIHN0cmluZyB3ZW4wLCB3ZW4xLCB3ZXIwOworcHJpdmF0ZSBub3NhdmUgb2JqZWN0ICpsYXN0X21vdmVkX29iamVjdHM7Citwcml2YXRlIG5vc2F2ZSBvYmplY3QgbGFzdF9tb3ZlZF93aGVyZTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKiogRGllIGVpZ2VudGxpY2hlbiBGdW5rdGlvbmVuICoqKioqKioqKioqKioqKioqKioqKioqKi8KKworcHJpdmF0ZSBzdHJpbmcgcHV0X29yX2dldChvYmplY3Qgbywgb2JqZWN0IGRlc3QpCisKKy8qIEJld2VndCBlaW4gZWluemVsbmVzIE9iamVrdCA8bz4gaW4gZGFzIFppZWxvYmpla3QgPGRlc3Q+LiBWZXJ3ZW5kZXQgZGF6dQorICogamUgbmFjaCBVbXN0YWVuZGVuIChaaWVsIGlzdCBkZXIgU3BpZWxlciwgZGllIFVtZ2VidW5nLCBlaW4gTGViZXdlc2VuKSBkZW4KKyAqIGVudHNwcmVjaGVuZGVuIFdlcnQgZnVlciA8bWV0aG9kPi4gR2lidCBpbSBFcmZvbGdzZmFsbCAwIHp1cnVlY2ssIGVyc3RlbGx0CisgKiBzb25zdCBkaWUgYXVzenVnZWJlbmRlIEZlaGxlcm1lbGR1bmcgdW5kIGdpYnQgZGllc2UgenVydWVjay4KKyAqLworCit7CisgICAgaW50IG1ldGhvZCwgcmV0OworICAgIHN0cmluZyBzdHI7CisKKyAgICAvL2lmIChsaXZpbmcobykpCisgICAgLy8gICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiTGViZW5kZXMgQXJndW1lbnQgZnVlciBwdXRfb3JfZ2V0OiAlT1xuIiwgbykpOworCisgICAgaWYgKGRlc3QgPT0gdGhpc19vYmplY3QoKSkgICAgICAgICAgLyogcGljayAqLworICAgICAgICBtZXRob2QgPSBNX0dFVDsKKyAgICBlbHNlIGlmIChkZXN0ID09IGVudmlyb25tZW50KCkpICAgICAvKiBkcm9wICovCisgICAgICAgIG1ldGhvZCA9IE1fUFVUOworICAgIGVsc2UgaWYgKGxpdmluZyhkZXN0KSkgICAgICAgICAgICAgIC8qIGdpdmUgKi8KKyAgICAgICAgbWV0aG9kID0gTV9HSVZFOworICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHB1dCAqLworICAgICAgICBtZXRob2QgPSBNX1BVVCB8IE1fR0VUOworICAgICAgICBpZiAoZmlyc3RfaW52ZW50b3J5KG8pKQorICAgICAgICAgICAgcmV0dXJuIG8tPk5hbWUoV0VSLCAxKSArICIgaXN0IG5pY2h0IGxlZXIhIjsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IG8tPm1vdmUoZGVzdCwgbWV0aG9kKSkgPiAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHN3aXRjaCAocmV0KSB7CisgICAgICAgIGNhc2UgTUVfVE9PX0hFQVZZOgorICAgICAgICAgICAgaWYgKGRlc3QgPT0gdGhpc19vYmplY3QoKSkKKyAgICAgICAgICAgICAgICBpZiAoUXVlcnlQcm9wKFBfR0hPU1QpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkFscyBHZWlzdCBrYW5uc3QgRHUgbmljaHRzIG1pdG5laG1lbi4iOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEdSBrYW5uc3QgIiArIHdlbjEgKyAiIG5pY2h0IG1laHIgdHJhZ2VuLiI7CisKKyAgICAgICAgICAgIGlmIChzdHJpbmdwKHN0ciA9IGRlc3QtPlF1ZXJ5UHJvcChQX1RPT19IRUFWWV9NU0cpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gY2FwaXRhbGl6ZShyZXBsYWNlX3BlcnNvbmFsKHN0ciwgKHtvLCBkZXN0fSksIDEpKTsKKworICAgICAgICAgICAgaWYgKGxpdmluZyhkZXN0KSkgeworICAgICAgICAgICAgICAgIGlmIChkZXN0LT5RdWVyeVByb3AoUF9HSE9TVCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiQWxzIEdlaXN0IGthbm4gIiArIGRlc3QtPm5hbWUoV0VSLCAxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG5pY2h0cyBtaXRuZWhtZW4uIjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXN0LT5OYW1lKFdFUiwgMSkgKyAiIGthbm4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZW4wICsgIiBuaWNodCBtZWhyIHRyYWdlbi4iOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZGVzdCA9PSBlbnZpcm9ubWVudCgpKQorICAgICAgICAgICAgICAgIHJldHVybiAoc3RyaW5ncChzdHIgPSBkZXN0LT5OYW1lKFdFUiwgMSkpICYmIHNpemVvZihzdHIpID8KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ciA6ICJEZXIgUmF1bSIpICsgIiB3dWVyZGUgZGFubiB6dSBzY2h3ZXIgd2VyZGVuLiI7CisKKyAgICAgICAgICAgIHJldHVybiBjYXBpdGFsaXplKHdlcjAgKyAiIHBhc3N0IGluICIgKyBkZXN0LT5uYW1lKFdFTiwgMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBuaWNodCBtZWhyIHJlaW4uIik7CisKKyAgICAgICAgY2FzZSBNRV9DQU5UX0JFX0RST1BQRUQ6CisgICAgICAgICAgICBpZiAobyAmJiBzdHJpbmdwKHN0ciA9IG8tPlF1ZXJ5UHJvcChQX05PRFJPUCkpKQorICAgICAgICAgICAgICAgIHJldHVybiBzdHI7CisKKyAgICAgICAgICAgIGlmIChkZXN0ID09IGVudmlyb25tZW50KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuICJEdSBrYW5uc3QgIiArIHdlbjEgKyAiIG5pY2h0IHdlZ3dlcmZlbiEiOworCisgICAgICAgICAgICBpZiAobGl2aW5nKGRlc3QpKQorICAgICAgICAgICAgICAgIHJldHVybiAiRHUga2FubnN0ICIgKyB3ZW4xICsgIiBuaWNodCB3ZWdnZWJlbi4iOworCisgICAgICAgICAgICByZXR1cm4gIlNvIHdpcnN0IER1ICIgKyB3ZW4xICsgIiBuaWNodCBsb3MuLi4iOworCisgICAgICAgIGNhc2UgTUVfQ0FOVF9CRV9UQUtFTjoKKyAgICAgICAgICAgIGlmIChvICYmIHN0cmluZ3Aoc3RyID0gby0+UXVlcnlQcm9wKFBfTk9HRVQpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RyOworCisgICAgICAgICAgICBpZiAoc3RyaW5ncChzdHIgPSBlbnZpcm9ubWVudChvKS0+UXVlcnlQcm9wKFBfTk9MRUFWRV9NU0cpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gY2FwaXRhbGl6ZSgKKyAgICAgICAgICAgICAgICAgICAgcmVwbGFjZV9wZXJzb25hbChzdHIsICh7bywgZW52aXJvbm1lbnQobyl9KSwgMSkpOworCisgICAgICAgICAgICAvL2lmIChkZXN0ICE9IGVudmlyb25tZW50KCkpCisgICAgICAgICAgICAvLyAgICByZXR1cm4gIkR1IGthbm5zdCAiICsgd2VuMSArICIgbmljaHQgZWlubWFsIG5laG1lbi4iOworCisgICAgICAgICAgICByZXR1cm4gIkR1IGthbm5zdCAiICsgd2VuMSArICIgbmljaHQgbmVobWVuLiI7CisKKyAgICAgICAgY2FzZSBNRV9DQU5UX0JFX0lOU0VSVEVEOgorICAgICAgICAgICAgaWYgKHN0cmluZ3Aoc3RyID0gZGVzdC0+UXVlcnlQcm9wKFBfTk9JTlNFUlRfTVNHKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGNhcGl0YWxpemUocmVwbGFjZV9wZXJzb25hbChzdHIsICh7bywgZGVzdH0pLCAxKSk7CisKKyAgICAgICAgICAgIGlmIChkZXN0ID09IGVudmlyb25tZW50KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuICJEYXMgZGFyZnN0IER1IGhpZXIgbmljaHQgYWJsZWdlbi4iOworCisgICAgICAgICAgICBpZiAoZGVzdCA9PSB0aGlzX29iamVjdCgpKQorICAgICAgICAgICAgICAgIHJldHVybiAiRHUga2FubnN0ICIgKyB3ZW4xICsgIiBuaWNodCBuZWhtZW4uIjsKKworICAgICAgICAgICAgaWYgKGxpdmluZyhkZXN0KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gIkRhcyBrYW5uc3QgRHUgIiArIGRlc3QtPm5hbWUoV0VNLCAxKSArICIgbmljaHQgZ2ViZW4uIjsKKworICAgICAgICAgICAgcmV0dXJuIGNhcGl0YWxpemUod2VuMCArICIga2FubnN0IER1IGRvcnQgbmljaHQgaGluZWluc3RlY2tlbi4iKTsKKworICAgICAgICBjYXNlIE1FX0NBTlRfTEVBVkVfRU5WOgorICAgICAgICAgICAgLy8gTUVfQ0FOVF9MRUFWRV9FTlYga2FubiBudXIgYXVmdHJldGVuLCB3ZW5uIG8gZWluIEVudmlyb25tZW50CisgICAgICAgICAgICAvLyBoYXQsIGRlc2hhbGIga2VpbiBDaGVjayBkYWRyYXVmCisgICAgICAgICAgICBpZiAoc3RyaW5ncChzdHIgPSBlbnZpcm9ubWVudChvKS0+UXVlcnlQcm9wKFBfTk9MRUFWRV9NU0cpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gY2FwaXRhbGl6ZSgKKyAgICAgICAgICAgICAgICAgICAgcmVwbGFjZV9wZXJzb25hbChzdHIsICh7bywgZW52aXJvbm1lbnQobyl9KSwgMSkpOworCisgICAgICAgICAgICBpZiAoZW52aXJvbm1lbnQobykgIT0gdGhpc19vYmplY3QoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gIkR1IGthbm5zdCAiICsgd2VuMSArICIgbmljaHQgbmVobWVuLiI7CisKKyAgICAgICAgICAgIGlmIChkZXN0ID09IGVudmlyb25tZW50KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuICJEdSBrYW5uc3QgIiArIHdlbjEgKyAiIG5pY2h0IHdlZ3dlcmZlbiEiOworCisgICAgICAgICAgICBpZiAobGl2aW5nKGRlc3QpKQorICAgICAgICAgICAgICAgIHJldHVybiAiRHUga2FubnN0ICIgKyB3ZW4xICsgIiBuaWNodCB3ZWdnZWJlbi4iOworCisgICAgICAgICAgICByZXR1cm4gIlNvIHdpcnN0IER1ICIgKyB3ZW4xICsgIiBuaWNodCBsb3MuLi4iOworCisgICAgICAgIGNhc2UgTUVfVE9PX0hFQVZZX0ZPUl9FTlY6CisgICAgICAgICAgICBpZiAoc3RyaW5ncChzdHIgPSBkZXN0LT5RdWVyeVByb3AoUF9FTlZfVE9PX0hFQVZZX01TRykpKQorICAgICAgICAgICAgICAgIHJldHVybiBjYXBpdGFsaXplKHJlcGxhY2VfcGVyc29uYWwoc3RyLCAoe28sIGRlc3R9KSwgMSkpOworCisgICAgICAgICAgICBpZiAoZW52aXJvbm1lbnQoZGVzdCkgPT0gdGhpc19vYmplY3QoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVzdC0+TmFtZShXRVIsIDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIiB3dWVyZGUgRGlyIGRhbm4genUgc2Nod2VyIHdlcmRlbi4iOworCisgICAgICAgICAgICByZXR1cm4gKHN0cmluZ3Aoc3RyID0gZW52aXJvbm1lbnQoZGVzdCktPk5hbWUoV0VSLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHNpemVvZihzdHIpID8gc3RyIDogIkRlciBSYXVtIikgKworICAgICAgICAgICAgICAgICAgICAiIHd1ZXJkZSBkYW5uIHp1IHNjaHdlciB3ZXJkZW4uIjsKKworICAgICAgICBjYXNlIFRPT19NQU5ZX09CSkVDVFM6CisgICAgICAgICAgICBpZiAoc3RyaW5ncChzdHIgPSBkZXN0LT5RdWVyeVByb3AoUF9UT09fTUFOWV9NU0cpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gY2FwaXRhbGl6ZShyZXBsYWNlX3BlcnNvbmFsKHN0ciwgKHtvLCBkZXN0fSksIDEpKTsKKworICAgICAgICAgICAgaWYgKGRlc3QgPT0gdGhpc19vYmplY3QoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gIlNvdmllbGUgR2VnZW5zdGFlbmRlIGthbm5zdCBEdSB1bm1vZWdsaWNoIHRyYWdlbiEiOworCisgICAgICAgICAgICBpZiAoZGVzdCA9PSBlbnZpcm9ubWVudCgpKQorICAgICAgICAgICAgICAgIHJldHVybiAiRGFmdWVyIGlzdCBoaWVyIG5pY2h0IG1laHIgZ2VudWcgUGxhdHouIjsKKworICAgICAgICAgICAgaWYgKGxpdmluZyhkZXN0KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVzdC0+TmFtZShXRVIsIDEpICsgIiBrYW5uICIgICsgd2VuMCArCisgICAgICAgICAgICAgICAgICAgICAgICIgbmljaHQgbWVociB0cmFnZW4uIjsKKworICAgICAgICAgICAgcmV0dXJuICJEYWZ1ZXIgaXN0IG5pY2h0IG1laHIgZ2VudWcgUGxhdHogaW4gIiArCisgICAgICAgICAgICAgICAgICAgZGVzdC0+bmFtZShXRU0sIDEpICsgIi4iOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAoZGVzdCA9PSB0aGlzX29iamVjdCgpKQorICAgICAgICAgICAgICAgIHJldHVybiAiRHUga2FubnN0ICIgKyB3ZW4xICsgIiBuaWNodCBuZWhtZW4uIjsKKworICAgICAgICAgICAgaWYgKGRlc3QgPT0gZW52aXJvbm1lbnQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gIkR1IGthbm5zdCAiICsgd2VuMSArICIgbmljaHQgd2Vnd2VyZmVuISI7CisKKyAgICAgICAgICAgIGlmIChsaXZpbmcoZGVzdCkpCisgICAgICAgICAgICAgICAgcmV0dXJuICJEdSBrYW5uc3QgIiArIHdlbjEgKyAiIG5pY2h0IHdlZ2dlYmVuLiI7CisKKyAgICAgICAgICAgIHJldHVybiBjYXBpdGFsaXplKHdlbjAgKyAiIGthbm5zdCBEdSBkb3J0IG5pY2h0IGhpbmVpbnN0ZWNrZW4uIik7CisgICAgfQorICAgIHJldHVybiAwOyAvLyBOT1QgUkVBQ0hFRAorfQorCisKKy8qIHZhcmFyZ3MgaW50IGRyb3Aob2JqZWN0IG8sIG1peGVkIG1zZykKKyAqIHZhcmFyZ3MgaW50IHB1dChvYmplY3Qgbywgb2JqZWN0IGRlc3QsIG1peGVkIG1zZykKKyAqIHZhcmFyZ3MgaW50IHBpY2sob2JqZWN0IG8sIG1peGVkIG1zZykKKyAqIHZhcmFyZ3MgaW50IGdpdmUob2JqZWN0IG8sIG9iamVjdCBkZXN0LCBtaXhlZCBtc2cpCisgKiB2YXJhcmdzIGludCBzaG93KG9iamVjdCBvLCBvYmplY3QgZGVzdCwgbWl4ZWQgbXNnKQorICoKKyAqIERlciBTcGllbGVyIG5pbW10L2xlZ3QvZ2lidC96ZWlndC9sYWVzc3QgZWluIE9iamVrdCBmYWxsZW4sIHdvYmVpIGRpZQorICogZW50c3ByZWNoZW5kZW4gb2RlciBvcHRpb25hbCBhYndlaWNoZW5kZSAoaW0gRm9ybWF0IHZvbiBQX1hYWF9NU0cpIG9kZXIKKyAqIGdhciBrZWluZSAobXNnID09IDEpIE1lbGR1bmdlbiBhdXNnZWdlYmVuIHdlcmRlbi4gRXMgbGllZ3QgaW4gZGVyCisgKiBWZXJhbnR3b3J0dW5nIGRlcyBSdWZlbmRlbiwgc2lubnZvbGxlIFdlcnRlIHp1IHVlYmVyZ2ViZW47IGluc2Jlc29uZGVyZQorICogd2lyZCBuaWNodCBnZXBydWVmdCwgb2Igc2ljaCBkaWUgT2JqZWt0ZSBpbiBkZXIgUmVpY2h3ZWl0ZSBkZXMgU3BpZWxlcnMKKyAqIGJlZmluZGVuLiBHaWJ0IDEgenVydWVjaywgd2VubiBkYXMgT2JqZWt0IGJld2VndCB3dXJkZSwgc29uc3QgMC4KKyAqLworCit2YXJhcmdzIGludCBkcm9wKG9iamVjdCBvLCBtaXhlZCBtc2cpCit7CisgICAgc3RyaW5nIHN0cjsKKworICAgIC8vIHZvcmhlciBzcGVpY2hlcm4sIGZhbGxzIGRhcyBPYmpla3QgemVyc3RvZXJ0IHdpcmQKKyAgICBjbCA9IHN5bWJvbF9mdW5jdGlvbigibmFtZSIsIG8pOworICAgIHdlbjAgPSBmdW5jYWxsKGNsLCBXRU4sIDApOworICAgIHdlbjEgPSBmdW5jYWxsKGNsLCBXRU4sIDEpOworICAgIHdlcjAgPSAwOworCisgICAgaWYgKCFtc2cpCisgICAgICAgIG1zZyA9IG8tPlF1ZXJ5UHJvcChQX0RST1BfTVNHKTsKKworICAgIGlmIChzdHIgPSBwdXRfb3JfZ2V0KG8sIGVudmlyb25tZW50KCkpKSB7CisgICAgICAgIFRNRShzdHIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoIW1zZykgeworICAgICAgICBUTUUoIkR1IGxhZXNzdCAiICsgd2VuMSArICIgZmFsbGVuLiIpOworICAgICAgICBTQVkoTmFtZShXRVIsMSkgKyAiIGxhZXNzdCAiICsgd2VuMCArICIgZmFsbGVuLiIpOworICAgIH0gZWxzZSBpZiAocG9pbnRlcnAobXNnKSkKKyAgICAgICAgc3dpdGNoIChzaXplb2YobXNnKSkgeworICAgICAgICAgIC8vIFdlbm4gZXMgendlaSBTdHJpbmdzIGdpYnQsIGdlaHQgZGllIDIuIGFucyBFbnZpcm9ubWVudAorICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIFNBWShyZXBsYWNlX3BlcnNvbmFsKG1zZ1sxXSwgKHt0aGlzX29iamVjdCgpLCBvfHx3ZW4wfSksIDEpKTsKKyAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBUTUUocmVwbGFjZV9wZXJzb25hbChtc2dbMF0sICh7dGhpc19vYmplY3QoKSwgb3x8d2VuMX0pLCAxKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigKKyAgICAgICAgICAgICAgICAiRmFsc2NoZXMgRm9ybWF0IGZ1ZXIgUF9EUk9QX01TRzogJU9cbiIsIG98fHdlbjEpKTsKKyAgICAgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKK3ZhcmFyZ3MgaW50IHB1dChvYmplY3Qgbywgb2JqZWN0IGRlc3QsIG1peGVkIG1zZykKK3sKKyAgICBzdHJpbmcgc3RyOworCisgICAgLy8gRmFsbHMgZGFzIGplbWFuZCB2b24gYXVzc2VuIHJ1ZnQgdW5kIFNjaHJvdHQgdWViZXJnaWJ0Li4uCisgICAgLy9pZiAobGl2aW5nKGRlc3QpKQorICAgIC8vICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIkxlYmVuZGVzIFppZWwgZnVlciBwdXQoKTogJU9cbiIsIGRlc3QpKTsKKyAgICBpZiAoZGVzdCA9PSBlbnZpcm9ubWVudCgpKQorICAgICAgICByYWlzZV9lcnJvcigiWmllbCBmdWVyIHB1dCgpIGlzdCBVbWdlYnVuZyBkZXMgU3BpZWxlcnNcbiIpOworCisgICAgLy8gdm9yaGVyIHNwZWljaGVybiwgZmFsbHMgZGFzIE9iamVrdCB6ZXJzdG9lcnQgd2lyZAorICAgIGNsID0gc3ltYm9sX2Z1bmN0aW9uKCJuYW1lIiwgbyk7CisgICAgd2VuMCA9IGZ1bmNhbGwoY2wsIFdFTiwgMCk7CisgICAgd2VuMSA9IGZ1bmNhbGwoY2wsIFdFTiwgMSk7CisgICAgd2VyMCA9IGZ1bmNhbGwoY2wsIFdFUiwgMCk7CisKKyAgICBpZiAoIW1zZykKKyAgICAgICAgbXNnID0gby0+UXVlcnlQcm9wKFBfUFVUX01TRyk7CisKKyAgICBpZiAoc3RyID0gcHV0X29yX2dldChvLCBkZXN0KSkgeworICAgICAgICBUTUUoc3RyKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIAorICAgIGlmICghbXNnKSB7CisgICAgICAgIFRNRSgiRHUgc3RlY2tzdCAiICsgd2VuMSArICIgaW4gIiArIGRlc3QtPm5hbWUoV0VOLCAxKSArICIuIik7CisgICAgICAgIGlmIChlbnZpcm9ubWVudCgpKQorCSAgU0FZKE5hbWUoV0VSLCAxKSArICIgc3RlY2t0ICIgKyB3ZW4wICsKKwkgICAgICAiIGluICIgKyBkZXN0LT5uYW1lKFdFTiwgMCkgKyAiLiIpOworICAgIH0KKyAgICBlbHNlIGlmIChwb2ludGVycChtc2cpKSB7CisgICAgICAgIHN3aXRjaCAoc2l6ZW9mKG1zZykpIHsKKyAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBpZiAoZW52aXJvbm1lbnQoKSkKKwkgICAgICBTQVkocmVwbGFjZV9wZXJzb25hbChtc2dbMV0sICh7dGhpc19vYmplY3QoKSwgb3x8d2VuMCwgZGVzdH0pLCAxKSk7CisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgVE1FKHJlcGxhY2VfcGVyc29uYWwobXNnWzBdLCAoe3RoaXNfb2JqZWN0KCksIG98fHdlbjEsIGRlc3R9KSwgMSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoCisgICAgICAgICAgICAgICAgIkZhbHNjaGVzIEZvcm1hdCBmdWVyIFBfUFVUX01TRzogJU9cbiIsb3x8d2VuMSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKK3ZhcmFyZ3MgaW50IHBpY2sob2JqZWN0IG8sIG1peGVkIG1zZykKK3sKKyAgICBzdHJpbmcgc3RyOworCisgICAgLy8gdm9yaGVyIHNwZWljaGVybiwgZmFsbHMgZGFzIE9iamVrdCB6ZXJzdG9lcnQgd2lyZAorICAgIGNsID0gc3ltYm9sX2Z1bmN0aW9uKCJuYW1lIiwgbyk7CisgICAgd2VuMCA9IDA7CisgICAgd2VuMSA9IGZ1bmNhbGwoY2wsIFdFTiwgMSk7CisgICAgd2VyMCA9IDA7CisKKyAgICBpZiAoIW1zZykKKyAgICAgICAgbXNnID0gby0+UXVlcnlQcm9wKFBfUElDS19NU0cpOworCisgICAgaWYgKHN0ciA9IHB1dF9vcl9nZXQobywgdGhpc19vYmplY3QoKSkpIHsKKyAgICAgICAgVE1FKHN0cik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICghbXNnKSB7CisgICAgICAgIFRNRSgiRHUgbmltbXN0ICIgKyB3ZW4xICsgIi4iKTsKKyAgICAgICAgU0FZKE5hbWUoV0VSLCAxKSArICIgbmltbXQgIiArIHdlbjEgKyAiLiIpOworICAgIH0gZWxzZSBpZiAocG9pbnRlcnAobXNnKSkKKyAgICAgICAgc3dpdGNoIChzaXplb2YobXNnKSkgeworICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIFNBWShyZXBsYWNlX3BlcnNvbmFsKG1zZ1sxXSwgKHt0aGlzX29iamVjdCgpLCBvfHx3ZW4xfSksIDEpKTsKKyAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBUTUUocmVwbGFjZV9wZXJzb25hbChtc2dbMF0sICh7dGhpc19vYmplY3QoKSwgb3x8d2VuMX0pLCAxKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigKKyAgICAgICAgICAgICAgICAiRmFsc2NoZXMgRm9ybWF0IGZ1ZXIgUF9QSUNLX01TRzogJU9cbiIsIG98fHdlbjEpKTsKKyAgICAgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKK3ZhcmFyZ3MgaW50IGdpdmUob2JqZWN0IG8sIG9iamVjdCBkZXN0LCBtaXhlZCBtc2cpCit7CisgICAgc3RyaW5nIHpuYW1lLCBnbmFtZTsKKyAgICBzdHJpbmcgc3RyOworCisgICAgLy8gRmFsbHMgZGFzIGplbWFuZCB2b24gYXVzc2VuIHJ1ZnQgdW5kIFNjaHJvdHQgdWViZXJnaWJ0Li4uCisgICAgaWYgKCFsaXZpbmcoZGVzdCkpCisgICAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIlRvdGVzIFppZWwgZnVlciBnaXZlKCk6ICVPXG4iLCBkZXN0KSk7CisKKyAgICB6bmFtZSA9IGRlc3QtPm5hbWUoV0VNLCAxKTsKKyAgICBnbmFtZSA9IE5hbWUoV0VSLCAxKTsKKworICAgIC8vIHZvcmhlciBzcGVpY2hlcm4sIGZhbGxzIGRhcyBPYmpla3QgemVyc3RvZXJ0IHdpcmQKKyAgICBjbCA9IHN5bWJvbF9mdW5jdGlvbigibmFtZSIsIG8pOworICAgIHdlbjAgPSBmdW5jYWxsKGNsLCBXRU4sIDApOworICAgIHdlbjEgPSBmdW5jYWxsKGNsLCBXRU4sIDEpOworICAgIHdlcjAgPSAwOworCisgICAgaWYgKCFtc2cpCisgICAgICAgIG1zZyA9IG8tPlF1ZXJ5UHJvcChQX0dJVkVfTVNHKTsKKworICAgIGlmIChzdHIgPSBwdXRfb3JfZ2V0KG8sIGRlc3QpKSB7CisgICAgICAgIFRNRShzdHIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoIW1zZykgeworICAgICAgICBUTUUoIkR1IGdpYnN0ICIgKyB6bmFtZSArICIgIiArIHdlbjEgKyAiLiIpOworICAgICAgICBUT0IoZGVzdCwgZ25hbWUgKyAiIGdpYnQgRGlyICIgKyB3ZW4wICsgIi4iKTsKKyAgICAgICAgU0FZMigoe2Rlc3R9KSwgZ25hbWUgKyAiIGdpYnQgIiArIHpuYW1lICsgIiAiICsgd2VuMCArICIuIik7CisgICAgfSBlbHNlIGlmIChwb2ludGVycChtc2cpKQorICAgICAgICBzd2l0Y2ggKHNpemVvZihtc2cpKSB7CisgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgVE9CKGRlc3QsIHJlcGxhY2VfcGVyc29uYWwoCisgICAgICAgICAgICAgICAgbXNnWzJdLCAoe3RoaXNfb2JqZWN0KCksIG98fHdlbjAsIGRlc3R8fHpuYW1lfSksIDEpKTsKKyAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBTQVkyKCh7ZGVzdCwgdGhpc19vYmplY3QoKX0pLCByZXBsYWNlX3BlcnNvbmFsKAorICAgICAgICAgICAgICAgICBtc2dbMV0sICh7dGhpc19vYmplY3QoKSwgb3x8d2VuMCwgZGVzdHx8em5hbWV9KSwgMSkpOworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIFRNRShyZXBsYWNlX3BlcnNvbmFsKAorICAgICAgICAgICAgICAgIG1zZ1swXSwgKHt0aGlzX29iamVjdCgpLCBvfHx3ZW4xLCBkZXN0fHx6bmFtZX0pLCAxKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigKKyAgICAgICAgICAgICAgICAiRmFsc2NoZXMgRm9ybWF0IGZ1ZXIgUF9HSVZFX01TRzogJU9cbiIsIG98fHdlbjEpKTsKKyAgICAgICAgfQorCisgICAgaWYgKCFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKGRlc3QpKQorICAgICAgICBkZXN0LT5naXZlX25vdGlmeShvKTsKKworICAgIHJldHVybiAxOworfQorCit2YXJhcmdzIGludCBzaG93KG9iamVjdCBvLCBvYmplY3Qgd2hvbSwgbWl4ZWQgbXNnKQoreworICAgIHN0cmluZyB6bmFtZSwgZ25hbWU7CisgICAgc3RyaW5nIHdlbjAsIHdlbjIsIGxvbmc7CisKKyAgICB6bmFtZSA9IHdob20gPyB3aG9tLT5uYW1lKFdFTSwgMSkgOiAiYWxsZW4iOworICAgIGduYW1lID0gTmFtZShXRVIsIDEpOworCisgICAgaWYgKCFtc2cpCisgICAgICAgIG1zZyA9IG8tPlF1ZXJ5UHJvcChQX1NIT1dfTVNHKTsKKworICAgIGlmIChlbnZpcm9ubWVudChvKSA9PSB0aGlzX29iamVjdCgpIHx8CisgICAgICAgIGVudmlyb25tZW50KGVudmlyb25tZW50KG8pKSA9PSB0aGlzX29iamVjdCgpKSB7CisgICAgICAgIHdlbjAgPSBvLT5uYW1lKFdFTiwgMCk7CisKKyAgICAgICAgLyogRGVyIEFra3VzYXRpdiBtdXNzIG1pdCBkZW0gdW5iZXN0aW1tdGVuIEFydGlrZWwgZ2ViaWxkZXQgd2VyZGVuLAorICAgICAgICAgKiBkYW1pdCBldmVudHVlbGxlIEFkamVrdGl2ZSBkaWUgcmljaHRpZ2UgRW5kdW5nIGJlc2l0emVuLgorICAgICAgICAgKiAoZWluIGtsZWluZXMgU2Nod2VydCAtPiBrbGVpbmVzIFNjaHdlcnQgLT4gRGVpbiBrbGVpbmVzIFNjaHdlcnQpCisgICAgICAgICAqLworCisgICAgICAgIGlmIChvLT5RdWVyeVByb3AoUF9BUlRJQ0xFKSAmJiBtZW1iZXIod2VuMCwgJyAnKSA+PSAwKSB7CisgICAgICAgICAgICBpbnQgb2JnZW5kZXIgPSBvLT5RdWVyeVByb3AoUF9HRU5ERVIpOworICAgICAgICAgICAgaW50IG9ibnVtID0gby0+UXVlcnlQcm9wKFBfQU1PVU5UKSA+IDEgPyBQTFVSQUwgOiBTSU5HVUxBUjsKKworICAgICAgICAgICAgLy8gV2ljaHRpZzogUF9BTU9VTlQgaXN0IDAgZnVlciBPYmpla3RlLCBkaWUgbmljaHQgdm9uIHVuaXQgZXJiZW4uCisgICAgICAgICAgICAvLyBEYSB1bml0LmMga2VpbiBQX0FNT1VOVD09MCB6dWxhZXNzdCwgbmVobWVuIHdpciBkaWVzZW4gRmFsbCBhbHMKKyAgICAgICAgICAgIC8vIHNpbmd1bGFyIGFuLiAqUnVtYXRhCisKKyAgICAgICAgICAgIHdlbjIgPSB3ZW4wW21lbWJlcih3ZW4wLCAnICcpLi5dOworICAgICAgICAgICAgd2VuMCA9IFF1ZXJ5UG9zc1Byb25vdW4obywgV0VOLCBvYm51bSkgKyB3ZW4yOworCisgICAgICAgICAgICBpZiAob2JudW0gPT0gUExVUkFMIHx8IG9iZ2VuZGVyID09IEZFTUFMRSkKKyAgICAgICAgICAgICAgICB3ZW4yID0gIkRlaW5lIiArIHdlbjI7CisgICAgICAgICAgICBlbHNlIGlmIChvYmdlbmRlciA9PSBNQUxFKQorICAgICAgICAgICAgICAgIHdlbjIgPSAiRGVpbmVuIiArIHdlbjI7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgd2VuMiA9ICJEZWluIiArIHdlbjI7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgd2VuMiA9IHdlbjA7CisgICAgfSBlbHNlCisgICAgICAgIHdlbjIgPSB3ZW4wID0gby0+bmFtZShXRU4sIDEpOworCisgICAgLy8gdm9yaGVyIHNwZWljaGVybiwgZmFsbHMgZGFzIE9iamVrdCBpbSBjYXRjaF90ZWxsKCkgemVyc3RvZXJ0IHdpcmQKKyAgICBsb25nID0gby0+bG9uZyg0KTsKKworICAgIGlmICghbXNnKSB7CisgICAgICAgIFRNRSgiRHUgemVpZ3N0ICIgKyB6bmFtZSArICIgIiArIHdlbjIgKyAiLiIpOworICAgICAgICBpZiAoIXdob20pCisgICAgICAgICAgICBTQVkoZ25hbWUgKyAiIHplaWd0IERpciAiICsgd2VuMCArICIuIik7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgVE9CKHdob20sIGduYW1lICsgIiB6ZWlndCBEaXIgIiArIHdlbjAgKyAiLiIpOworICAgICAgICAgICAgU0FZMigoe3dob219KSwgZ25hbWUgKyAiIHplaWd0ICIgKyB6bmFtZSArICIgIiArIHdlbjAgKyAiLiIpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChwb2ludGVycChtc2cpKQorICAgICAgICBzd2l0Y2ggKHNpemVvZihtc2cpKSB7CisgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgaWYgKHdob20pCisgICAgICAgICAgICAgICAgVE9CKHdob20sIHJlcGxhY2VfcGVyc29uYWwoCisgICAgICAgICAgICAgICAgICAgIG1zZ1syXSwgKHt0aGlzX29iamVjdCgpLCBvfHx3ZW4wLCB3aG9tfHx6bmFtZX0pLCAxKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgU0FZKHJlcGxhY2VfcGVyc29uYWwoCisgICAgICAgICAgICAgICAgICAgIG1zZ1syXSwgKHt0aGlzX29iamVjdCgpLCBvfHx3ZW4wLCB3aG9tfHx6bmFtZX0pLCAxKSk7CisgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgaWYgKHdob20pCisgICAgICAgICAgICAgICAgU0FZMigoe3dob20sIHRoaXNfb2JqZWN0KCl9KSwgcmVwbGFjZV9wZXJzb25hbCgKKyAgICAgICAgICAgICAgICAgICAgIG1zZ1sxXSwgKHt0aGlzX29iamVjdCgpLCBvfHx3ZW4wLCB3aG9tfHx6bmFtZX0pLCAxKSk7CisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgVE1FKHJlcGxhY2VfcGVyc29uYWwoCisgICAgICAgICAgICAgICAgbXNnWzBdLCAoe3RoaXNfb2JqZWN0KCksIG98fHdlbjIsIHdob218fHpuYW1lfSksIDEpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKAorICAgICAgICAgICAgICAgICJGYWxzY2hlcyBGb3JtYXQgZnVlciBQX1NIT1dfTVNHOiAlT1xuIiwgb3x8d2VuMCkpOworICAgICAgICB9CisKKyAgICBpZiAoIXdob20pCisgICAgICAgIFNBWShsb25nKTsKKyAgICBlbHNlIHsKKyAgICAgICAgVE9CKHdob20sIGxvbmcpOworICAgICAgICBpZiAoIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUod2hvbSkpCisgICAgICAgICAgICB3aG9tLT5zaG93X25vdGlmeShvKTsKKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSGlsZnNmdW5rdGlvbmVuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBwcml2YXRlIG9iamVjdCAqX19maW5kX29iamVjdHMoc3RyaW5nICp0b2tlbnMsIG9iamVjdCBlbnYsIGludCBpc19zb3VyY2UpOworICogb2JqZWN0ICpmaW5kX29iamVjdHMoc3RyaW5nIHdoYXQsIG9iamVjdCBlbnYsIGludCBpc19zb3VyY2UpOworICoKKyAqIFN1Y2h0IGltIFJhdW0gdW5kIGltIFNwaWVsZXIgKG9kZXIgYWx0ZXJuYXRpdiBpbiBkZXIgYW5nZWdlYmVuZW4gVW1nZWJ1bmcpCisgKiBuYWNoIGRlbiBpbiB0b2tlbnMvd2hhdCBiZXplaWNobmV0ZW4gT2JqZWt0ZW4uIGlzX3NvdXJjZSBiZXN0aW1tdCBkaWUKKyAqIGVyd2FydGV0ZSBncmFtbWF0aXNjaGUgRm9ybSAoMCBmdWVyICJ0b3BmIGF1ZiBoZXJkIiB1bmQgMSBmdWVyICJ0b3BmIHZvbgorICogaGVyZCIsIHNpZWhlIE1hbnBhZ2UpLgorICovCisgCitwcml2YXRlIG9iamVjdCAqX19maW5kX29iamVjdHMoc3RyaW5nICp0b2tlbnMsIG9iamVjdCBlbnYsIGludCBpc19zb3VyY2UpCit7CisgICAgb2JqZWN0IG9iLCAqb2JzOworCisgICAgLy8gaXNfc291cmNlID09IDA6IE9iamVrdCBzb2xsIG5pY2h0IGJld2VndCB3ZXJkZW4gKCJ0b3BmIGF1ZiBoZXJkIikKKyAgICAvLyAgICAgICAgICAgICAgMTogT2JqZWt0IHNvbGwgYmV3ZWd0IHdlcmRlbiAoInRvcGYgdm9uIGhlcmQiKQorICAgIC8vICAgICAgICAgICAgICAyOiBpbnRlcm4KKworICAgIGlmICghZW52ICYmIHNpemVvZih0b2tlbnMpID4gMSAmJiB0b2tlbnNbPDFdID09ICJoaWVyIikgeworICAgICAgICB0b2tlbnMgPSB0b2tlbnNbLi48Ml07CisgICAgICAgIGVudiA9IGVudmlyb25tZW50KCk7CisgICAgfQorICAgIGVsc2UgaWYgKCFlbnYgJiYgc2l6ZW9mKHRva2VucykgPiAyICYmIHRva2Vuc1s8Ml0gPT0gImluIikKKyAgICB7CisgICAgICAgIGlmICh0b2tlbnNbPDFdID09ICJtaXIiIHx8CisgICAgICAgICAgICB0b2tlbnNbPDFdID09ICJkaXIiKSB7CisgICAgICAgICAgICB0b2tlbnMgPSB0b2tlbnNbLi48M107CisgICAgICAgICAgICBlbnYgPSB0aGlzX29iamVjdCgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHRva2Vuc1s8MV0gPT0gInJhdW0iKSB7CisgICAgICAgICAgICB0b2tlbnMgPSB0b2tlbnNbLi48M107CisgICAgICAgICAgICBlbnYgPSBlbnZpcm9ubWVudCgpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpbnQgaSA9IHNpemVvZih0b2tlbnMpLTE7IGkgPiAxOyBpLS0pIHsKKyAgICAgICAgaWYgKGVudikKKyAgICAgICAgICAgIG9iID0gcHJlc2VudChpbXBsb2RlKHRva2Vuc1tpLi5dLCAiICIpLCBlbnYpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBvYiA9IHByZXNlbnQoaW1wbG9kZSh0b2tlbnNbaS4uXSwgIiAiKSwgZW52aXJvbm1lbnQoKSkgfHwKKyAgICAgICAgICAgICAgICAgcHJlc2VudChpbXBsb2RlKHRva2Vuc1tpLi5dLCAiICIpLCB0aGlzX29iamVjdCgpKTsKKworICAgICAgICBpZiAoIW9iKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKGxpdmluZyhvYikpIHsKKyAgICAgICAgICAgIE5GKCJBYmVyICIgKyBvYi0+bmFtZShXRVIsIDEpICsgIiBsZWJ0IGRvY2ghIik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvYi0+UXVlcnlQcm9wKFBfQ05UX1NUQVRVUykpIHsKKyAgICAgICAgICAgIE5GKCJBYmVyICIgKyBvYi0+bmFtZShXRVIsIDEpICsgIiBpc3QgZG9jaCBnZXNjaGxvc3NlbiEiKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzX3NvdXJjZSAhPSAwICYmCisgICAgICAgICAgICB0b2tlbnNbaS0xXSA9PSBvYi0+UXVlcnlQcm9wKFBfU09VUkNFX1BSRVBPU0lUSU9OKSkKKyAgICAgICAgICAgIHJldHVybiBvYi0+cHJlc2VudF9vYmplY3RzKGltcGxvZGUodG9rZW5zWy4uaS0yXSwgIiAiKSk7CisKKyAgICAgICAgaWYgKHRva2Vuc1tpLTFdID09IG9iLT5RdWVyeVByb3AoUF9QUkVQT1NJVElPTikpCisgICAgICAgICAgICByZXR1cm4gX19maW5kX29iamVjdHModG9rZW5zWy4uaS0yXSwgb2IsIGlzX3NvdXJjZSA/IDIgOiAwKTsKKworICAgICAgICBORigiRHUga2FubnN0IG5pY2h0cyAiICsgdG9rZW5zW2ktMV0gKyAiICIgKworICAgICAgICAgICBvYi0+bmFtZShXRU0sIDEpICsgIiBuZWhtZW4uIik7CisgICAgfQorCisgICAgaWYgKGlzX3NvdXJjZSA9PSAyKQorICAgICAgICByZXR1cm4gKHt9KTsKKworICAgIGlmIChlbnYpCisgICAgICAgIHJldHVybiBlbnYtPnByZXNlbnRfb2JqZWN0cyhpbXBsb2RlKHRva2VucywgIiAiKSk7CisKKyAgICBpZiAoZW52aXJvbm1lbnQoKSAmJgorICAgICAgICBzaXplb2Yob2JzID0gZW52aXJvbm1lbnQoKS0+cHJlc2VudF9vYmplY3RzKGltcGxvZGUodG9rZW5zLCAiICIpKSkpCisgICAgICAgIHJldHVybiBvYnM7CisKKyAgICByZXR1cm4gcHJlc2VudF9vYmplY3RzKGltcGxvZGUodG9rZW5zLCAiICIpKTsKK30KKworb2JqZWN0ICpmaW5kX29iamVjdHMoc3RyaW5nIHdoYXQsIG9iamVjdCBlbnYsIGludCBpc19zb3VyY2UpCit7CisgIGlmICghc3RyaW5ncCh3aGF0KSB8fCAhc2l6ZW9mKHdoYXQpKQorICAgIHJldHVybiAoe30pOworICByZXR1cm4gX19maW5kX29iamVjdHMoZXhwbG9kZSh3aGF0LCAiICIpLCBlbnYsIGlzX3NvdXJjZSk7Cit9CisKKworLyogdmFyYXJncyBpbnQgZHJvcF9vYmplY3RzKHN0cmluZyBzdHIsIG1peGVkIG1zZyk7CisgKiB2YXJhcmdzIGludCBwdXRfb2JqZWN0cyhzdHJpbmcgc3RyLCBpbnQgY2FzdXMsIHN0cmluZyB2ZXJiLCBtaXhlZCBtc2cpOworICogdmFyYXJncyBpbnQgcGlja19vYmplY3RzKHN0cmluZyBzdHIsIGludCBmbGFnLCBtaXhlZCBtc2cpOworICogdmFyYXJncyBpbnQgZ2l2ZV9vYmplY3RzKHN0cmluZyBzdHIsIG1peGVkIG1zZyk7CisgKiB2YXJhcmdzIGludCBzaG93X29iamVjdHMoc3RyaW5nIHN0ciwgbWl4ZWQgbXNnKTsKKyAqCisgKiBFaW4gQmVmZWhsIHdpZSAid2lyZiB3YWZmZW4gd2VnIiByZXN1bHRpZXJ0IGluIGVpbmVtIEF1ZnJ1ZiB2b24KKyAqIGRyb3Bfb2JqZWN0cygid2FmZmVuIikuIERpZXNlIEZ1bmt0aW9uZW4gc2luZCBoYXVwdHNhZWNobGljaCBmdWVyIGRpZQorICogQmVoYW5kbHVuZyBkZXIgamV3ZWlsaWdlbiBLb21tYW5kb3Mgdm9yZ2VzZWhlbiwga29lbm5lbiBqZWRvY2ggYXVjaCBmdWVyCisgKiBlaWdlbmUgQmVmZWhsZSB2ZXJ3ZW5kZXQgd2VyZGVuLiBwdXRfb2JqZWN0cygpIGVyd2FydGV0IGF1c3NlcmRlbSBkZW4KKyAqIEthc3VzICgiRHUga2FubnN0IG5pY2h0cyBhbiBERVIgUGlud2FuZCBiZWZlc3RpZ2VuLiIpIHVuZCBkYXMgdmVyd2VuZGV0ZQorICogVmVyYiBpbiBkZXIgR3VuZGZvcm0gKCJiZWZlc3RpZ2VuIikuIERhcyBGbGFnIGZ1ZXIgcGlja19vYmplY3RzKCkgZ2lidAorICogYW4sIG9iIGRhcyBPYmpla3QgYXVjaCBlaW5mYWNoIGhlcnVtbGllZ2VuIGRhcmYgKCJuaW1tIC4uLiIpIG9kZXIgbmljaHQKKyAqICgiaG9sZSAuLi4iKS4gR2lidCBiZWkgRXJmb2xnIDEsIHNvbnN0IDAgenVydWVjay4KKyAqLworCit2YXJhcmdzIGludCBkcm9wX29iamVjdHMoc3RyaW5nIHN0ciwgbWl4ZWQgbXNnKQoreworICAgIG9iamVjdCAqb2JzOworCisgICAgaWYgKCFzaXplb2Yob2JzID0gZmluZF9vYmplY3RzKHN0ciwgdGhpc19vYmplY3QoKSwgMSkpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGZvcmVhY2ggKG9iamVjdCBvOiBvYnMpIHsKKyAgICAgICAgaWYgKG9iamVjdHAobykpCisgICAgICAgICAgICBkcm9wKG8sIG1zZyk7CisKKyAgICAgICAgaWYgKGdldF9ldmFsX2Nvc3QoKSA8IDEwMDAwMCkgeworICAgICAgICAgICAgVE1FKCJEZW4gUmVzdCBiZWhhZWx0c3QgRHUgZXJzdCBtYWwuIik7CisgICAgICAgICAgICBsYXN0X21vdmVkX29iamVjdHMgPSBvYnNbLi5tZW1iZXIob2JzLCBvKV07CisgICAgICAgICAgICBsYXN0X21vdmVkX3doZXJlID0gMDsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorCisgICAgbGFzdF9tb3ZlZF9vYmplY3RzID0gb2JzOworICAgIGxhc3RfbW92ZWRfd2hlcmUgPSAwOworICAgIHJldHVybiAxOworfQorCit2YXJhcmdzIGludCBwdXRfb2JqZWN0cyhzdHJpbmcgc3RyLCBpbnQgY2FzdXMsIHN0cmluZyB2ZXJiLCBtaXhlZCBtc2cpCit7CisgICAgb2JqZWN0ICpvYnMsIGRlc3QsICpub19tb3ZlOworICAgIAorICAgIGlmICghc3RyaW5ncChzdHIpIHx8ICFzaXplb2Yoc3RyKSkgcmV0dXJuIDA7CisKKyAgICBzdHJpbmcgKnRva2VucyA9IGV4cGxvZGUoc3RyLCAiICIpOworICAgIGludCBhbGxvd19yb29tID0gMTsKKyAgICBpbnQgYWxsb3dfbWUgPSAxOworCisgICAgaWYgKHNpemVvZih0b2tlbnMpID4gMSAmJiB0b2tlbnNbPDFdID09ICJoaWVyIikgeworICAgICAgICB0b2tlbnMgPSB0b2tlbnNbLi48Ml07CisgICAgICAgIGFsbG93X21lID0gMDsKKyAgICB9IGVsc2UgaWYgKHNpemVvZih0b2tlbnMpID4gMiAmJiB0b2tlbnNbPDJdID09ICJpbiIpCisgICAgICAgIGlmICh0b2tlbnNbPDFdID09ICJtaXIiIHx8CisgICAgICAgICAgICB0b2tlbnNbPDFdID09ICJkaXIiKSB7CisgICAgICAgICAgICB0b2tlbnMgPSB0b2tlbnNbLi48M107CisgICAgICAgICAgICBhbGxvd19yb29tID0gMDsKKyAgICAgICAgfSBlbHNlIGlmICh0b2tlbnNbPDFdID09ICJyYXVtIikgeworICAgICAgICAgICAgdG9rZW5zID0gdG9rZW5zWy4uPDNdOworICAgICAgICAgICAgYWxsb3dfbWUgPSAwOworICAgICAgICB9CisKKyAgICBmb3IgKGludCBpID0gc2l6ZW9mKHRva2VucyktMTsgaSA+IDE7IGktLSkgeworICAgICAgICBpZiAoIShkZXN0ID0gYWxsb3dfcm9vbSAmJiBwcmVzZW50KGltcGxvZGUodG9rZW5zW2kuLl0sICIgIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoKSkpICYmCisgICAgICAgICAgICAhKGRlc3QgPSBhbGxvd19tZSAmJiBwcmVzZW50KGltcGxvZGUodG9rZW5zW2kuLl0sICIgIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfb2JqZWN0KCkpKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmIChsaXZpbmcoZGVzdCkpIHsKKyAgICAgICAgICAgIE5GKCJBYmVyICIgKyBkZXN0LT5uYW1lKFdFUiwgMSkgKyAiIGxlYnQgZG9jaCEiKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisvKgorICAgICAgICBpZiAodmVyYiA9PSAibGVnZW4iICYmICFkZXN0LT5RdWVyeVByb3AoUF9UUkFZKSkgeworICAgICAgICAgICAgTkYoIkR1IGthbm5zdCBuaWNodHMgYXVmICIgKyBkZXN0LT5uYW1lKFdFTiwgMSkgKyAiIGxlZ2VuLiIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyovCisgICAgICAgIGlmICh2ZXJiID09ICJzdGVja2VuIiAmJiAhZGVzdC0+UXVlcnlQcm9wKFBfQ09OVEFJTkVSKSkgeworICAgICAgICAgICAgTkYoIkR1IGthbm5zdCBpbiAiICsgZGVzdC0+bmFtZShXRU4sIDEpICsgIiBuaWNodHMgcmVpbnN0ZWNrZW4uIik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZXN0LT5RdWVyeVByb3AoUF9DTlRfU1RBVFVTKSkgeworICAgICAgICAgICAgTkYoIkFiZXIgIiArIGRlc3QtPm5hbWUoV0VSLCAxKSArICIgaXN0IGRvY2ggZ2VzY2hsb3NzZW4hIik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0b2tlbnNbaS0xXSAhPSBkZXN0LT5RdWVyeVByb3AoUF9ERVNUX1BSRVBPU0lUSU9OKSkgeworICAgICAgICAgICAgTkYoIkR1IGthbm5zdCBuaWNodHMgIiArIHRva2Vuc1tpLTFdICsgIiAiICsKKyAgICAgICAgICAgICAgIGRlc3QtPm5hbWUoY2FzdXMsIDEpICsgIiAiICsgdmVyYiArICIuIik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghc2l6ZW9mKG9icyA9IF9fZmluZF9vYmplY3RzKHRva2Vuc1suLmktMl0sIDAsIDEpIC0gKHsgZGVzdCB9KSkpIHsKKyAgICAgICAgICAgIE5GKCJXQVMgbW9lY2h0ZXN0IER1ICIgKyB0b2tlbnNbaS0xXSArICIgIiArCisgICAgICAgICAgICAgICBkZXN0LT5uYW1lKGNhc3VzLCAxKSArICIgIiArIHZlcmIgKyAiPyIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2l6ZW9mKG5vX21vdmUgPSBvYnMgJiBhbGxfaW52ZW50b3J5KGRlc3QpKSkgeworICAgICAgICAgICAgVE1FKGNhcGl0YWxpemUoQ291bnRVcChtYXBfb2JqZWN0cyhub19tb3ZlLCAibmFtZSIsIFdFUiwgMSkpKSArCisgICAgICAgICAgICAgICAgKHNpemVvZihub19tb3ZlKSA9PSAxID8gIiBpc3QiIDogIiBzaW5kIikgKworICAgICAgICAgICAgICAgICIgZG9jaCBiZXJlaXRzIGluICIgKyBkZXN0LT5uYW1lKFdFTSwxKSArICIuIik7CisgICAgICAgICAgICBpZiAoIXNpemVvZihvYnMgLT0gbm9fbW92ZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBmb3JlYWNoIChvYmplY3Qgbzogb2JzKSB7CisgICAgICAgICAgICBpZiAob2JqZWN0cChvKSkKKyAgICAgICAgICAgICAgICBwdXQobywgZGVzdCwgbXNnKTsKKworICAgICAgICAgICAgaWYgKGdldF9ldmFsX2Nvc3QoKSA8IDEwMDAwMCkgeworICAgICAgICAgICAgICAgIFRNRSgiRGVuIFJlc3QgbGFlc3N0IER1IGVyc3QgbWFsLCB3byBlciBpc3QuIik7CisgICAgICAgICAgICAgICAgbGFzdF9tb3ZlZF9vYmplY3RzID0gb2JzWy4ubWVtYmVyKG9icywgbyldOworICAgICAgICAgICAgICAgIGxhc3RfbW92ZWRfd2hlcmUgPSBkZXN0OworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbGFzdF9tb3ZlZF9vYmplY3RzID0gb2JzOworICAgICAgICBsYXN0X21vdmVkX3doZXJlID0gZGVzdDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIAorICAgIHJldHVybiAwOworfQorCit2YXJhcmdzIGludCBwaWNrX29iamVjdHMoc3RyaW5nIHN0ciwgaW50IGZsYWcsIG1peGVkIG1zZykKK3sKKyAgICBvYmplY3QgKm9iczsKKworICAgIGlmICgoKGludClRdWVyeVByb3AoUF9NQVhfSEFORFMpKSA8IDEpeworICAgICAgICBORigiT2huZSBIYWVuZGUga2FubnN0IER1IG5pY2h0cyBuZWhtZW4uIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICghc2l6ZW9mKG9icyA9IGZpbmRfb2JqZWN0cyhzdHIsIDAsIDEpIC0gYWxsX2ludmVudG9yeSgpCisJICAtIChmbGFnID8gYWxsX2ludmVudG9yeShlbnZpcm9ubWVudCgpKSA6ICh7fSkpKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBmb3JlYWNoIChvYmplY3Qgbzogb2JzKSB7CisgICAgICAgIGlmIChvYmplY3RwKG8pKQorICAgICAgICAgICAgcGljayhvLCBtc2cpOworCisgICAgICAgIGlmIChnZXRfZXZhbF9jb3N0KCkgPCAxMDAwMDApIHsKKyAgICAgICAgICAgIFRNRSgiRGVuIFJlc3QgbGFlc3N0IER1IGVyc3QgbWFsIGxpZWdlbi4iKTsKKyAgICAgICAgICAgIGxhc3RfbW92ZWRfb2JqZWN0cyA9IG9ic1suLm1lbWJlcihvYnMsIG8pXTsKKyAgICAgICAgICAgIGxhc3RfbW92ZWRfd2hlcmUgPSAwOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBsYXN0X21vdmVkX29iamVjdHMgPSBvYnM7CisgICAgbGFzdF9tb3ZlZF93aGVyZSA9IDA7CisgICAgcmV0dXJuIDE7Cit9CisKK3ZhcmFyZ3MgaW50IGdpdmVfb2JqZWN0cyhzdHJpbmcgc3RyLCBtaXhlZCBtc2cpCit7CisgICAgb2JqZWN0ICpvYnMsIGRlc3Q7CisgICAgCisgICAgaWYgKCFzdHJpbmdwKHN0cikgfHwgIXNpemVvZihzdHIpKSByZXR1cm4gMDsKKworICAgIHN0cmluZyAqdG9rZW5zID0gZXhwbG9kZShzdHIsICIgIik7CisKKyAgICBpZiAoKChpbnQpUXVlcnlQcm9wKFBfTUFYX0hBTkRTKSkgPCAxKXsKKyAgICAgICAgTkYoIk9obmUgSGFlbmRlIGthbm5zdCBEdSBuaWNodHMgd2VnZ2ViZW4uIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZW9mKHRva2VucyktMTsgaSsrKSB7CisgICAgICAgIGlmICghKGRlc3QgPSBwcmVzZW50KGltcGxvZGUodG9rZW5zWy4uaV0sICIgIiksIGVudmlyb25tZW50KCkpKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmICghbGl2aW5nKGRlc3QpKSB7CisgICAgICAgICAgICBORigiQWJlciAiICsgZGVzdC0+bmFtZShXRVIsIDEpICsgIiBsZWJ0IGRvY2ggZ2FyIG5pY2h0ISIpOworICAgICAgICAgICAgZGVzdCA9IDA7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghc2l6ZW9mKG9icyA9IF9fZmluZF9vYmplY3RzKHRva2Vuc1tpKzEuLl0sIDAsIDEpKSkgeworICAgICAgICAgICAgTkYoIldBUyBtb2VjaHRlc3QgRHUgIiArIGRlc3QtPm5hbWUoV0VNLCAxKSsiIGdlYmVuPyIpOworICAgICAgICAgICAgZGVzdCA9IDA7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFkZXN0KSB7CisgICAgICAgIGludCBwb3M7CisKKyAgICAgICAgaWYgKChwb3MgPSBzdHJyc3RyKHN0ciwgIiBhbiAiKSkgPj0gMCkgeworICAgICAgICAgICAgZGVzdCA9IHByZXNlbnQoc3RyW3Bvcys0Li5dLCBlbnZpcm9ubWVudCgpKTsKKyAgICAgICAgICAgIC8vIHp1IGdlYmVuZGUgT2JqZWt0ZSBpbiBFbnYgKyBMaXZpbmcgc3VjaGVuCisgICAgICAgICAgICBvYnMgPSBmaW5kX29iamVjdHMoc3RyWy4ucG9zLTFdLCAwLCAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghZGVzdCB8fCAhbGl2aW5nKGRlc3QpIHx8ICFzaXplb2Yob2JzKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBmb3JlYWNoIChvYmplY3Qgbzogb2JzKSB7CisgICAgICAgIGlmIChvYmplY3RwKG8pKQorICAgICAgICAgICAgZ2l2ZShvLCBkZXN0LCBtc2cpOworCisgICAgICAgIGlmIChnZXRfZXZhbF9jb3N0KCkgPCAxMDAwMDApIHsKKyAgICAgICAgICAgIFRNRSgiRGVuIFJlc3QgYmVoYWVsdHN0IER1IGVyc3QgbWFsLiIpOworICAgICAgICAgICAgbGFzdF9tb3ZlZF9vYmplY3RzID0gb2JzWy4ubWVtYmVyKG9icywgbyldOworICAgICAgICAgICAgbGFzdF9tb3ZlZF93aGVyZSA9IGRlc3Q7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGxhc3RfbW92ZWRfb2JqZWN0cyA9IG9iczsKKyAgICBsYXN0X21vdmVkX3doZXJlID0gZGVzdDsKKyAgICByZXR1cm4gMTsKK30KKwordmFyYXJncyBpbnQgc2hvd19vYmplY3RzKHN0cmluZyBzdHIsIG1peGVkIG1zZykKK3sKKyAgICBvYmplY3QgKm9icywgd2hvbTsKKyAgICAKKyAgICBpZiAoIXN0cmluZ3Aoc3RyKSB8fCAhc2l6ZW9mKHN0cikpCisgICAgICByZXR1cm4gMDsKKworICAgIHN0cmluZyAqdG9rZW5zID0gZXhwbG9kZShzdHIsICIgIik7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemVvZih0b2tlbnMpLTE7IGkrKykgeworICAgICAgICBpZiAod2hvbSA9IHByZXNlbnQoaW1wbG9kZSh0b2tlbnNbLi5pXSwgIiAiKSwgZW52aXJvbm1lbnQoKSkpIHsKKyAgICAgICAgICAgIGlmICghbGl2aW5nKHdob20pKSB7CisgICAgICAgICAgICAgICAgTkYoIkFiZXIgIiArIHdob20tPm5hbWUoV0VSLCAxKSArICIgbGVidCBkb2NoIGdhciBuaWNodCEiKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChpICE9IDAgfHwgdG9rZW5zWzBdICE9ICJhbGxlbiIpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGlmICghc2l6ZW9mKGZpbHRlcihhbGxfaW52ZW50b3J5KGVudmlyb25tZW50KCkpIC0KKyAgICAgICAgICAgICAgICAgICAgKHsgdGhpc19vYmplY3QoKSB9KSwgIydsaXZpbmcpKSkgeworICAgICAgICAgICAgICAgIE5GKCJIaWVyIGlzdCBuaWVtYW5kLCBkZW0gRHUgZXR3YXMgemVpZ2VuIGtvZW5udGVzdCEiKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICh3aG9tID09IHRoaXNfb2JqZWN0KCkpIHsKKyAgICAgICAgICAgIE5GKCJEYXp1IHNvbGx0ZXN0IER1IGRhbm4gYmVzc2VyICdzY2hhdScgYmVudXR6ZW4hXG4iKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFzaXplb2Yob2JzID0gX19maW5kX29iamVjdHModG9rZW5zW2krMS4uXSwgdGhpc19vYmplY3QoKSwgMCkpICYmCisgICAgICAgICAgICAhc2l6ZW9mKG9icyA9IF9fZmluZF9vYmplY3RzKHRva2Vuc1tpKzEuLl0sIDAsIDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoeyB0aGlzX29iamVjdCgpLCB3aG9tIH0pKSkgeworICAgICAgICAgICAgTkYoIldBUyBtb2VjaHRlc3QgRHUgIiArICh3aG9tID8gd2hvbS0+bmFtZShXRU0sIDEpIDogImFsbGVuIikgKworICAgICAgICAgICAgICAgIiB6ZWlnZW4/Iik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGZvcmVhY2ggKG9iamVjdCBvOiBvYnMpIHsKKyAgICAgICAgICAgIGlmIChvYmplY3RwKG8pKQorICAgICAgICAgICAgICAgIHNob3cobywgd2hvbSwgbXNnKTsKKworICAgICAgICAgICAgaWYgKGdldF9ldmFsX2Nvc3QoKSA8IDEwMDAwMCkgeworICAgICAgICAgICAgICAgIFRNRSgiRGFzIHJlaWNodCBlcnN0IG1hbC4iKTsKKyAgICAgICAgICAgICAgICBsYXN0X21vdmVkX29iamVjdHMgPSBvYnNbLi5tZW1iZXIob2JzLCBvKV07CisgICAgICAgICAgICAgICAgbGFzdF9tb3ZlZF93aGVyZSA9IHdob207CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBsYXN0X21vdmVkX29iamVjdHMgPSBvYnM7CisgICAgICAgIGxhc3RfbW92ZWRfd2hlcmUgPSB3aG9tOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworb2JqZWN0ICptb3ZlZF9vYmplY3RzKHZvaWQpCit7CisgICAgcmV0dXJuIGxhc3RfbW92ZWRfb2JqZWN0czsKK30KKworb2JqZWN0IG1vdmVkX3doZXJlKHZvaWQpCit7CisgICAgcmV0dXJuIGxhc3RfbW92ZWRfd2hlcmU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogRGllIGVpbnplbG5lbiBLb21tYW5kb3MgKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIHN0YXRpYyBpbnQgZmFsbGVubGFzc2VuKHN0cmluZyBzdHIpCisgKiBzdGF0aWMgaW50IHdlcmZlbihzdHJpbmcgc3RyKQorICogc3RhdGljIGludCBsZWdlbihzdHJpbmcgc3RyKQorICogc3RhdGljIGludCBzdGVja2VuKHN0cmluZyBzdHIpCisgKiBzdGF0aWMgaW50IGhvbGVuKHN0cmluZyBzdHIpCisgKiBzdGF0aWMgaW50IG5laG1lbihzdHJpbmcgc3RyKQorICogc3RhdGljIGludCBnZWJlbihzdHJpbmcgc3RyKQorICogICBNaW5pbWFsZSBXcmFwcGVyIGZ1ZXIgWFhYX29iamVjdHMoKSwgZW50ZmVybmVuICJmYWxsZW4iLCAid2VnIiBiencuICJhYiIKKyAqICAgYXVzIGRlbiBBcmd1bWVudGVuIHVuZCBzZXR6ZW4gZW50c3ByZWNoZW5kZSBTdGFuZGFyZC1GZWhsZXJtZWxkdW5nZW4uCisgKiAgIAorICogcHJvdGVjdGVkIHZvaWQgYWRkX3B1dF9hbmRfZ2V0X2NvbW1hbmRzKCkKKyAqICAgUmVnaXN0cmllcnQgb2JpZ2UgRnVua3Rpb25lbiBwZXIgYWRkX2FjdGlvbigpLgorICovCisKK3N0YXRpYyBpbnQgZmFsbGVubGFzc2VuKHN0cmluZyBzdHIpCit7CisgICAgaWYgKFF1ZXJ5UHJvcChQX0dIT1NUKSkgeworICAgICAgICBfbm90aWZ5X2ZhaWwoIkFscyBHZWlzdCBrYW5uc3QgRHUgbmljaHRzIGZhbGxlbmxhc3Nlbi5cbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoIXN0ciB8fCBzdHJbPDcuLl0gIT0gIiBmYWxsZW4iKSB7CisgICAgICAgIF9ub3RpZnlfZmFpbCgiTGFzcyBldHdhcyBGQUxMRU4sIG9kZXIgd2FzIG1laW5zdCBEdT9cbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBfbm90aWZ5X2ZhaWwoIldBUyBtb2VjaHRlc3QgRHUgZmFsbGVubGFzc2VuP1xuIik7CisgICAgcmV0dXJuIGRyb3Bfb2JqZWN0cyhzdHJbMC4uPDhdKTsKK30KKworc3RhdGljIGludCB3ZXJmZW4oc3RyaW5nIHN0cikKK3sKKyAgICBpZiAoUXVlcnlQcm9wKFBfR0hPU1QpKSB7CisgICAgICAgIF9ub3RpZnlfZmFpbCgiQWxzIEdlaXN0IGthbm5zdCBEdSBuaWNodHMgd2Vnd2VyZmVuLlxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICghc3RyIHx8IHN0cls8NC4uXSAhPSAiIHdlZyIpIHsKKyAgICAgICAgX25vdGlmeV9mYWlsKCJXaXJmIGV0d2FzIFdFRywgb2RlciB3YXMgbWVpbnN0IER1P1xuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIF9ub3RpZnlfZmFpbCgiV0FTIG1vZWNodGVzdCBEdSBsb3N3ZXJkZW4/XG4iKTsKKyAgICByZXR1cm4gZHJvcF9vYmplY3RzKHN0clswLi48NV0pOworfQorCitzdGF0aWMgaW50IGxlZ2VuKHN0cmluZyBzdHIpCit7CisgICAgaWYgKFF1ZXJ5UHJvcChQX0dIT1NUKSkgeworICAgICAgICBfbm90aWZ5X2ZhaWwoIkFscyBHZWlzdCBrYW5uc3QgRHUgbmljaHRzIHdlZ2xlZ2VuLlxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICghc3RyKSB7CisgICAgICAgIF9ub3RpZnlfZmFpbCgiTGVnZSBldHdhcyBBQiwgb2RlciB3YXMgbWVpbnN0IER1P1xuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChzdHJbPDMuLl0gPT0gIiBhYiIpIHsKKyAgICAgICAgX25vdGlmeV9mYWlsKCJXQVMgbW9lY2h0ZXN0IER1IGFibGVnZW4/XG4iKTsKKyAgICAgICAgcmV0dXJuIGRyb3Bfb2JqZWN0cyhzdHJbMC4uPDRdKTsKKyAgICB9CisKKyAgICBpZiAoc3RyWzw0Li5dID09ICIgd2VnIikgeworICAgICAgICBfbm90aWZ5X2ZhaWwoIldBUyBtb2VjaHRlc3QgRHUgd2VnbGVnZW4/XG4iKTsKKyAgICAgICAgcmV0dXJuIGRyb3Bfb2JqZWN0cyhzdHJbMC4uPDVdKTsKKyAgICB9CisKKyAgICBfbm90aWZ5X2ZhaWwoIldBUyBtb2VjaHRlc3QgRHUgV09ISU4gbGVnZW4/XG4iKTsKKyAgICByZXR1cm4gcHV0X29iamVjdHMoc3RyLCBXRU4sICJsZWdlbiIpOworfQorCitzdGF0aWMgaW50IHN0ZWNrZW4oc3RyaW5nIHN0cikKK3sKKyAgICBpZiAoUXVlcnlQcm9wKFBfR0hPU1QpKSB7CisgICAgICAgIF9ub3RpZnlfZmFpbCgiRGFzIGthbm5zdCBEdSBpbiBEZWluZW0gaW1tYXRlcmllbGxlbiBadXN0YW5kIG5pY2h0LlxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIF9ub3RpZnlfZmFpbCgiV0FTIG1vZWNodGVzdCBEdSBXT0hJTiBzdGVja2VuP1xuIik7CisgICAgcmV0dXJuIHB1dF9vYmplY3RzKHN0ciwgV0VOLCAic3RlY2tlbiIpOworfQorCitzdGF0aWMgaW50IGhvbGVuKHN0cmluZyBzdHIpCit7CisgICAgaWYgKFF1ZXJ5UHJvcChQX0dIT1NUKSkgeworICAgICAgICBfbm90aWZ5X2ZhaWwoIkFscyBHZWlzdCBrYW5uc3QgRHUgbmljaHRzIG5laG1lbi5cbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBfbm90aWZ5X2ZhaWwoIldBUyBtb2VjaHRlc3QgRHUgYXVzIFdBUyBob2xlbj9cbiIpOworICAgIHJldHVybiBwaWNrX29iamVjdHMoc3RyLCAxKTsKK30KKworc3RhdGljIGludCBuZWhtZW4oc3RyaW5nIHN0cikKK3sKKyAgICBpZiAoUXVlcnlQcm9wKFBfR0hPU1QpKSB7CisgICAgICAgIF9ub3RpZnlfZmFpbCgiQWxzIEdlaXN0IGthbm5zdCBEdSBuaWNodHMgbmVobWVuLlxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIF9ub3RpZnlfZmFpbCgiV0FTIG1vZWNodGVzdCBEdSBuZWhtZW4/XG4iKTsKKyAgICByZXR1cm4gcGlja19vYmplY3RzKHN0ciwgMCk7Cit9CisKK3N0YXRpYyBpbnQgZ2ViZW4oc3RyaW5nIHN0cikKK3sKKyAgICBpZiAoUXVlcnlQcm9wKFBfR0hPU1QpKSB7CisgICAgICAgIF9ub3RpZnlfZmFpbCgiQWxzIEdlaXN0IGthbm5zdCBEdSBuaWNodHMgd2VnZ2ViZW4uXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgX25vdGlmeV9mYWlsKCJXRU0gbW9lY2h0ZXN0IER1IFdBUyBnZWJlbj9cbiIpOworICAgIHJldHVybiBnaXZlX29iamVjdHMoc3RyKTsKK30KKworc3RhdGljIGludCB6ZWlnZW4oc3RyaW5nIHN0cikKK3sKKyAgICBpZiAoUXVlcnlQcm9wKFBfR0hPU1QpKSB7CisgICAgICAgIF9ub3RpZnlfZmFpbCgiQWxzIEdlaXN0IGthbm5zdCBEdSBuaWVtYW5kZW0gZXR3YXMgemVpZ2VuLlxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIF9ub3RpZnlfZmFpbCgiV0VNIG1vZWNodGVzdCBEdSBXQVMgemVpZ2VuP1xuIik7CisgICAgcmV0dXJuIHNob3dfb2JqZWN0cyhzdHIpOworfQorCitwcm90ZWN0ZWQgdm9pZCBhZGRfcHV0X2FuZF9nZXRfY29tbWFuZHModm9pZCkKK3sKKyAgICBhZGRfYWN0aW9uKCJmYWxsZW5sYXNzZW4iLCAibGFzcyIpOworICAgIGFkZF9hY3Rpb24oImZhbGxlbmxhc3NlbiIsICJsYXNzZSIpOworICAgIGFkZF9hY3Rpb24oIndlcmZlbiIsICAgICAgICJ3aXJmIik7CisgICAgYWRkX2FjdGlvbigid2VyZmVuIiwgICAgICAgIndlcmYiKTsKKyAgICBhZGRfYWN0aW9uKCJ3ZXJmZW4iLCAgICAgICAid2VyZmUiKTsKKyAgICBhZGRfYWN0aW9uKCJsZWdlbiIsICAgICAgICAibGVnIik7CisgICAgYWRkX2FjdGlvbigibGVnZW4iLCAgICAgICAgImxlZ2UiKTsKKyAgICBhZGRfYWN0aW9uKCJzdGVja2VuIiwgICAgICAic3RlY2siKTsKKyAgICBhZGRfYWN0aW9uKCJzdGVja2VuIiwgICAgICAic3RlY2tlIik7CisgICAgYWRkX2FjdGlvbigiaG9sZW4iLCAgICAgICAgImhvbCIpOworICAgIGFkZF9hY3Rpb24oImhvbGVuIiwgICAgICAgICJob2xlIik7CisgICAgYWRkX2FjdGlvbigibmVobWVuIiwgICAgICAgIm5pbW0iKTsKKyAgICBhZGRfYWN0aW9uKCJuZWhtZW4iLCAgICAgICAibmVobSIpOworICAgIGFkZF9hY3Rpb24oIm5laG1lbiIsICAgICAgICJuZWhtZSIpOworICAgIGFkZF9hY3Rpb24oImdlYmVuIiwgICAgICAgICJnZWJlIik7CisgICAgYWRkX2FjdGlvbigiZ2ViZW4iLCAgICAgICAgImdpYiIpOworICAgIGFkZF9hY3Rpb24oInplaWdlbiIsICAgICAgICJ6ZWlnIik7CisgICAgYWRkX2FjdGlvbigiemVpZ2VuIiwgICAgICAgInplaWdlIik7Cit9CisKKworLyoqKioqKioqKiogQXVzIHJlaW5lbiBLb21wYXRpYmlsaXRhZXRzZ3J1ZW5kZW4gd2VpdGVyaGluIGVudGhhbHRlbiAqKioqKioqKiovCisKK29iamVjdCogZmluZF9vYnMoc3RyaW5nIHN0ciwgaW50IG1ldGgpCisvLyBnaWJ0IGVpbiBhcnJheSB6dXJ1ZWNrIG1pdCBhbGxlbiBPYmpla3RlbiBkaWUgbWl0IHN0ciBhbmdlc3Byb2NoZW4gd2VyZGVuCit7CisgICBvYmplY3QgaW52OworICAgaWYgKCFzdHIpIHJldHVybiAwOworICAgaWYgKHN0cls8Ny4uXT09IiBpbiBtaXIiKSB7CisgICAgIGludj1NRTsKKyAgICAgc3RyPXN0clswLi48OF07CisgICB9CisgICBlbHNlIGlmIChzdHJbPDguLl09PSIgaW4gcmF1bSIpIHsKKyAgICAgaWYgKG1ldGggJiBQVVRfR0VUX0RST1ApIHsgLy8gbWFuIGthbm4gbmljaHRzIGF1cyBkZW0gUmF1bSB3ZWd3ZXJmZW4KKyAgICAgICBfbm90aWZ5X2ZhaWwoIkR1IGthbm5zdCBuaWNodHMgd2Vnd2VyZmVuLCBkYXMgRHUgZ2FyIG5pY2h0IGhhc3QuXG4iKTsKKyAgICAgICByZXR1cm4gMDsKKyAgICAgfQorICAgICBpbnY9ZW52aXJvbm1lbnQoKTsKKyAgICAgc3RyPXN0clswLi48OV07CisgICB9CisgICBlbHNlIGlmIChtZXRoICYgUFVUX0dFVF9EUk9QKSBpbnY9TUU7IC8vIFJhdW0gYmVpIGRyb3AgdW5pbnRlcmVzc2FudAorICAgLy8gZWxzZSBrZWluIGJlc29uZGVyZXMgaW52IGF1c2dld2FlaGx0IGFsc28gaW52PTAKKyAgIGlmICghc2l6ZW9mKHN0cikpCisgICAgIHJldHVybiAwOyAvLyBoaWVyIHBhc3N0IGRpZSBiZXJlaXRzIGdlc2V0enRlIF9ub3RpZnlfZmFpbAorICAgZWxzZSB7CisgICAgIG9iamVjdCAqb2JzOworICAgICBzdHJpbmcgY29uOworICAgICBpZiAoc3NjYW5mKHN0ciwgIiVzIGF1cyAlcyIsIHN0ciwgY29uKT09MiB8fAorICAgICAgICAgc3NjYW5mKHN0ciwgIiVzIGluICVzIiwgc3RyLCBjb24pPT0yIHx8CisgICAgICAgICBzc2NhbmYoc3RyLCAiJXMgdm9uICVzIiwgc3RyLCBjb24pPT0yIHx8CisgICAgICAgICBzc2NhbmYoc3RyLCAiJXMgdm9tICVzIiwgc3RyLCBjb24pPT0yKSB7CisgICAgICAgaWYgKCFpbnYpIHsKKyAgICAgICAgIGlmICghZW52aXJvbm1lbnQoKSB8fCAhKGludj1wcmVzZW50KGNvbiwgZW52aXJvbm1lbnQoKSkpKQorICAgICAgICAgICAgaW52PXByZXNlbnQoY29uLCBNRSk7IC8vIHNvd29obCBpbSBlbnYgYWxzIGF1Y2ggaW0gaW52IHN1Y2hlbgorICAgICAgIH0KKyAgICAgICBlbHNlIGludj1wcmVzZW50KGNvbiwgaW52KTsgLy8gbnVyIGluIGF1c2dld2FlaGx0ZW0gaW52IHN1Y2hlbgorICAgICAgIGlmIChpbnY9PU1FKSBpbnY9MDsKKyAgICAgICBpZiAoIWludiB8fCAhKGludi0+c2hvcnQoKSkpIHsKKyAgICAgICAgIF9ub3RpZnlfZmFpbChicmVha19zdHJpbmcoIkR1IGhhc3QgaGllciBhYmVyIGtlaW4gJyIrY2FwaXRhbGl6ZShjb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIicuIiw3OCkpOworICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgfQorICAgICAgIGlmIChsaXZpbmcoaW52KSkgeworICAgICAgICAgX25vdGlmeV9mYWlsKGJyZWFrX3N0cmluZygiQWJlciAiK2ludi0+bmFtZShXRVIsMSkrIiBsZWJ0IGRvY2ghIiw3OCkpOworICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgfQorICAgICAgIC8vIHdpZXNvIG1hbiBhdXMgT2JqZWt0ZW4gZGllIHZvbiBzdGQvdHJheSBhYmdlbGVpdGV0IHdlcmRlbiBldHdhcworICAgICAgIC8vIG5laG1lbiBrb2VubmVuIHNvbGwsIHZlcnN0ZWggaWNoIHp3YXIgbmljaHQgc28gZ2Fuei4uLgorICAgICAgIGlmICghKGludi0+UXVlcnlQcm9wKFBfQ09OVEFJTkVSKSkgJiYgIShpbnYtPlF1ZXJ5UHJvcChQX1RSQVkpKSkgeworICAgICAgICAgX25vdGlmeV9mYWlsKGJyZWFrX3N0cmluZygiRHUga2FubnN0IG5pY2h0cyBhdXMgIitpbnYtPm5hbWUoV0VNLDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIiBuZWhtZW4uIiw3OCkpOworICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgfQorICAgICAgIGlmIChpbnYtPlF1ZXJ5UHJvcChQX0NOVF9TVEFUVVMpKSB7IC8vIENvbnRhaW5lciBpc3QgZ2VzY2hsb3NzZW4KKyAgICAgICAgIF9ub3RpZnlfZmFpbChicmVha19zdHJpbmcoIkFiZXIgIitpbnYtPm5hbWUoV0VSLDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIiBpc3QgZG9jaCBnZXNjaGxvc3Nlbi4iLCA3OCkpOworICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgfQorICAgICB9CisgICAgIGVsc2UgaWYgKGludj09TUUgJiYgKG1ldGggJiBQVVRfR0VUX1RBS0UpKSB7IC8vIG5pY2h0cyBhdXMgc2ljaCBuZWhtZW4KKyAgICAgICBfbm90aWZ5X2ZhaWwoIkR1IGthbm5zdCBuaWNodHMgbmVobWVuLCAiCisgICAgICAgICAgICAgICAgICAgICJ3YXMgRHUgc2Nob24gYmVpIERpciB0cmFlZ3N0LlxuIik7CisgICAgICAgcmV0dXJuIDA7CisgICAgIH0KKyAgICAgaWYgKCFpbnYgJiYgKG1ldGggJiBQVVRfR0VUX1RBS0UpKQorICAgICAgIGludj1lbnZpcm9ubWVudCgpOyAvLyBuaWNodHMgbmVobWVuIHdhcyBtYW4gc2Nob24gaGF0CisKKyAgICAgaWYgKCFpbnYpIHsKKyAgICAgICBpZiAoZW52aXJvbm1lbnQoKSkgeworICAgICAgICAgb2JzPShlbnZpcm9ubWVudCgpLT5wcmVzZW50X29iamVjdHMoc3RyKXx8KHt9KSk7CisgICAgICAgICBpZiAoIXNpemVvZihvYnMpKSBvYnMrPShNRS0+cHJlc2VudF9vYmplY3RzKHN0cil8fCh7fSkpOworICAgICAgIH0KKyAgICAgICBlbHNlIG9icz0oTUUtPnByZXNlbnRfb2JqZWN0cyhzdHIpIHx8ICh7fSkpOworICAgICB9CisgICAgIGVsc2Ugb2JzPShpbnYtPnByZXNlbnRfb2JqZWN0cyhzdHIpIHx8ICh7fSkpOworICAgICByZXR1cm4gb2JzLSh7IE1FIH0pOworICAgfQorICAgcmV0dXJuKDApOworfQorCitpbnQgcGlja19vYmoob2JqZWN0IG9iKQoreworICBvYmplY3QgZW52OworCisgIGlmICghb2IgfHwgb2IgPT0gdGhpc19vYmplY3QoKSB8fCBlbnZpcm9ubWVudChvYikgPT0gdGhpc19vYmplY3QoKSkgcmV0dXJuIDA7CisgIGlmICgoZW52PWVudmlyb25tZW50KG9iKSkgIT0gZW52aXJvbm1lbnQoKSkgeworICAgIGlmICghZW52LT5RdWVyeVByb3AoUF9DT05UQUlORVIpICYmICFlbnYtPlF1ZXJ5UHJvcChQX1RSQVkpKSB7CisgICAgICBUTUUoIkR1IGthbm5zdCBuaWNodHMgYXVzICIgKyBlbnYtPm5hbWUoV0VNLDEpICsgIiBuZWhtZW4uIik7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZSBpZiAoZW52LT5RdWVyeVByb3AoUF9DTlRfU1RBVFVTKSkgeyAgLy8gQ29udGFpbmVyIGlzdCBnZXNjaGxvc3NlbgorICAgICAgVE1FKCJBYmVyICIgKyBlbnYtPm5hbWUoV0VSLCAxKSArICIgaXN0IGRvY2ggZ2VzY2hsb3NzZW4uIik7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKyAgaWYgKG9iLT5Jc1VuaXQoKSAmJiBvYi0+UXVlcnlQcm9wKFBfQU1PVU5UKTwwKSB7CisgICAgVE1FKCJEdSBrYW5uc3QgbmljaHQgbWVociBuZWhtZW4gYWxzIGRhIGlzdC4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBwaWNrKG9iKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBkcm9wX29iaihvYmplY3Qgb2IpCit7CisgIGlmICghb2IgfHwgb2I9PXRoaXNfb2JqZWN0KCkgfHwgZW52aXJvbm1lbnQob2IpIT10aGlzX29iamVjdCgpKSByZXR1cm4gMDsKKyAgZHJvcChvYik7CisgIHJldHVybiAxOworfQorCitpbnQgcHV0X29iaihvYmplY3Qgb2IsIG9iamVjdCB3aGVyZSkKK3sKKyAgb2JqZWN0IGVudjsKKworICBpZiAob2IgPT0gdGhpc19vYmplY3QoKSB8fCBvYiA9PSB3aGVyZSB8fCBlbnZpcm9ubWVudChvYikgPT0gd2hlcmUpIHJldHVybiAwOworICBlbnY9ZW52aXJvbm1lbnQob2IpOworICBpZiAoIXdoZXJlLT5RdWVyeVByb3AoUF9DT05UQUlORVIpKSB7CisgICAgVE1FKCJEdSBrYW5uc3QgaW4gIiArIHdoZXJlLT5uYW1lKFdFTiwxKSArICIgbml4IHJlaW5zdGVja2VuLiIpOworICAgIHJldHVybiAxOworICB9CisgIGlmICh3aGVyZS0+UXVlcnlQcm9wKFBfQ05UX1NUQVRVUykpIHsgIC8vIENvbnRhaW5lciBpc3QgZ2VzY2hsb3NzZW4KKyAgICBUTUUoIkFiZXIgIiArIHdoZXJlLT5uYW1lKFdFUiwgMSkgKyAiIGlzdCBkb2NoIGdlc2NobG9zc2VuLiIpOworICAgIHJldHVybiAxOworICB9CisgIGlmIChlbnYhPWVudmlyb25tZW50KHRoaXNfb2JqZWN0KCkpICYmIGVudiE9dGhpc19vYmplY3QoKSkgeworICAgIF9ub3RpZnlfZmFpbCgiRGEga29tbXN0IGR1IHNvIG5pY2h0IHJhbi5cbiIpOworICAgIHJldHVybiAwOworICB9CisgIHB1dChvYiwgd2hlcmUpOworICByZXR1cm4gMTsKK30KKworaW50IGdpdmVfb2JqKG9iamVjdCBvYiwgb2JqZWN0IHdoZXJlKQoreworICBvYmplY3QgZW52OworCisgIGlmIChlbnZpcm9ubWVudChvYikhPXRoaXNfb2JqZWN0KCkpIHsKKyAgICBUTUUoIkRhcyBzb2xsdGVzdCBEdSBlcnN0bWFsIG5laG1lbi4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoIW9iIHx8IG9iID09IHRoaXNfb2JqZWN0KCkgfHwgb2IgPT0gd2hlcmUgfHwKKyAgICAgIGVudmlyb25tZW50KHdoZXJlKSE9ZW52aXJvbm1lbnQoKSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKGVudmlyb25tZW50KG9iKSA9PSB3aGVyZSkgeworICAgIF9ub3RpZnlfZmFpbCgiRGFzIFppZWwgaXN0IGluIGRlbSB6dSBnZWJlbmRlbiBPYmplY3QgZW50aGFsdGVuIVxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGVudmlyb25tZW50KG9iKSE9dGhpc19vYmplY3QoKSkgeworICAgIFRNRSgiRGFzIGhhc3QgRHUgbmljaHQuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgZ2l2ZShvYiwgd2hlcmUpOworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL3N0ZC9saXZpbmcvc2tpbGxfYXR0cmlidXRlcy5jIGIvc3RkL2xpdmluZy9za2lsbF9hdHRyaWJ1dGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ5MGFhMAotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9saXZpbmcvc2tpbGxfYXR0cmlidXRlcy5jCkBAIC0wLDAgKzEsMzc5IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gbGl2aW5nL3NraWxsc19hdHRyaWJ1dGVzLmMgLSBWZXJ3YWx0dW5nIGRlciBTa2lsbGF0dHJpYnV0ZSB2b24gTGViZXdlc2VuCisvLworLy8gJElkOiBza2lsbHMuYyA2NjczIDIwMDgtMDEtMDUgMjA6NTc6NDNaIFplc3N0cmEgJAorI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCitpbmhlcml0ICIvc3RkL3V0aWwvZXhlY3V0ZXIiOworCisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPGxpdmluZy9za2lsbF9hdHRyaWJ1dGVzLmg+CisjaW5jbHVkZSA8cGxheWVyL2xpZmUuaD4KKyNpbmNsdWRlIDx0aGluZy9wcm9wZXJ0aWVzLmg+CisjdW5kZWYgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisKKy8vI2RlZmluZSBaREVCVUcoeCkgaWYgKGZpbmRfcGxheWVyKCJ6ZXNzdHJhIikpIHRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJ6ZXNzdHJhIikseCkKKyNkZWZpbmUgWkRFQlVHKHgpCisvLyNkZWZpbmUgU0FTRVRMT0coeCkgbG9nX2ZpbGUoIlNBU0VULkxPRyIsIHgsIDI1MDAwMCkKKworLy8jZGVmaW5lIF9fREVCVUdfXworCisvLyBWYXJpYWJsZSBmdWVyIGRpZSBTa2lsbC1BdHRyaWJ1dGUsIERhdGVuc3RydWt0dXI6CisvKiAgKFsgU0FfQVRUUjogKHtTdW1tZV9TdGF0X01vZGlmaWVyLCBaZWl0cHVua3QsIEFuemFobE1vZGlmaWVyLCB9KTsKKyAgICAgICAgICAgICAgKFsgb2IxOnZhbHVlO2R1cmF0aW9uLAorICAgICAgICAgICAgICAgICBvYjI6dmFsdWU7ZHVyYXRpb24sIC4uLl0pOyAgLy8gc3RhdC4gTW9kaWZpZXIKKyAgICAgICAgICAgICAgKFsgb2IxOmNsb3N1cmU7ZHVyYXRpb24sCisgICAgICAgICAgICAgICAgIG9iMjpjbG9zdXJlO2R1cmF0aW9uLCAuLi5dKSAgICAgLy8gZHluLiBNb2RpZmllcgorICAgICAgICAgICAgICwKKyAgICAgU0FfQVRUUjI6ICh7Li4ufSk7IChbXSk7IChbXSksCisgICBdKSAqLworcHJpdmF0ZSBub3NhdmUgbWFwcGluZyBza2lsbGF0dHJzOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSB7CisgIFNldChQX1NLSUxMX0FUVFJJQlVURVMsIFNFQ1VSRUQsIEZfTU9ERV9BUyk7Cit9CisKKy8vIHZvbiBhdXNzZW4gUHJvcCBzZXR6ZW4gaXN0IG5pY2h0Li4uCittYXBwaW5nIF9zZXRfc2tpbGxfYXR0cihtYXBwaW5nIHNhKSB7CisgIHJldHVybiBkZWVwX2NvcHkoc2tpbGxhdHRycyk7Cit9CisvLyB1bmQgYXVjaCBiZWltIEFiZnJhZ2VuIG51ciBrb3BpZW4gbGllZmVybi4gOy0pCittYXBwaW5nIF9xdWVyeV9za2lsbF9hdHRyKCkgeworICByZXR1cm4gZGVlcF9jb3B5KHNraWxsYXR0cnMpOworCisvL1RPRE86IEV2dGwuIGV4dC4gU2V0emVuIHZvbiBQX1NLSUxMX0FUVFJJQlVURV9PRkZTRVRTIG1pdGxvZ2dlbj8KK30KKworcHJpdmF0ZSB2b2lkIFVwZGF0ZVNBQ2FjaGUoc3RyaW5nICphdHRycykgeworI2lmZGVmIF9fREVCVUdfXworICAgIGlmIChnZXR1aWQodGhpc19vYmplY3QoKSkgPT0gInplc3N0cmEiKQorICAgIFpERUJVRyhzcHJpbnRmKCIlT1xuIixza2lsbGF0dHJzKSk7CisjZW5kaWYKKyAgaWYgKCFtYXBwaW5ncChza2lsbGF0dHJzKSkgcmV0dXJuOworICBpZiAoIXBvaW50ZXJwKGF0dHJzKSB8fCBzaXplb2YoYXR0cnMpKQorICAgIGF0dHJzID0gbV9pbmRpY2VzKHNraWxsYXR0cnMpOyAvLyBhbGxlCisgIC8vIHNvbnN0IHNjaG5pdHRtZW5nZSBhdXMgZXhpc3RpZXJlbmRlbiB1bmQgZGVuIHVlYmVyZ2ViZW5lbi4KKyAgYXR0cnMgPSBtX2luZGljZXMoc2tpbGxhdHRycykgJiBhdHRyczsKKworICAvLyB1bmQgamV0enQgdWViZXIgYWxsZSBnZXd1ZW5zY2h0ZW4gU0FzIGRydWViZXIKKyAgZm9yZWFjaChzdHJpbmcgYXR0ciA6IGF0dHJzKSB7CisgICAgaW50ICpjYWNoZSA9IHNraWxsYXR0cnNbYXR0ciwgU0FNX0NBQ0hFXTsKKyAgICBtYXBwaW5nIHN0YXQgPSBza2lsbGF0dHJzW2F0dHIsIFNBTV9TVEFUSUNdOworICAgIG1hcHBpbmcgZHluID0gc2tpbGxhdHRyc1thdHRyLCBTQU1fRFlOQU1JQ107CisgICAgaW50IHN1bSA9IDA7CisgICAgaW50IHRpbWVvdXQgPSBfX0lOVF9NQVhfXzsKKyAKKyAgICAvLyB1ZWJlciBzdGF0LiBNb2RzIGl0ZXJpZXJlbiB1bmQgQXVmc3VtbWllcmVuLCBrbGVpbnN0ZW4gVGltZW91dAorICAgIC8vIGVybWl0dGVsbi4KKyAgICBmb3JlYWNoKG9iamVjdCBvYiwgaW50IHZhbHVlLCBpbnQgZHVyYXRpb246IHN0YXQpIHsKKyAgICAgIC8vIGd1ZWx0aWdlIE1vZHMgYXVmYWRkaWVyZW4sIGFiZ2VsYXVmZW5lIHJhdXN3ZXJmZW4KKyAgICAgIGlmIChkdXJhdGlvbiA+PSB0aW1lKCkpIHsKKyAgICAgICAgc3VtICs9IHZhbHVlOworICAgICAgICBpZiAoZHVyYXRpb24gPCB0aW1lb3V0KQorICAgICAgICAgIHRpbWVvdXQgPSBkdXJhdGlvbjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgbV9kZWxldGUoc3RhdCwgb2IpOyAvLyBqYSwgZ2VodCBpbSBmb3JlYWNoIDstKQorICAgIH0KKyAgICAvLyBBYmxhdWZ6ZWl0ZW4gZGVyIGR5bi4gTW9kcyBwcnVlZmVuLCB3YWVyZSBoaWVyIHp3YXIgbmljaHQgdW5iZWRpbmd0CisgICAgLy8gbm9ldGlnIHNvbmRlcm4ga29lbm50ZSBtYW4gYXVzc2NobGllc3NsaWNoIGltIFF1ZXJ5U2tpbGxBdHRyaWJ1dGUoKQorICAgIC8vIG1hY2hlbiwgYWJlciBkYW5uIHdhZXJlIGRpZSBFcm1pdHRsdW5nIGRlciBTdW1tZSBkZXIgTW9kcyBzY2h3aWVyaWdlci4KKyAgICBmb3JlYWNoKG9iamVjdCBvYiwgY2xvc3VyZSB2YWx1ZSwgaW50IGR1cmF0aW9uOiBkeW4pIHsKKyAgICAgIGlmIChkdXJhdGlvbiA8IHRpbWUoKSkKKyAgICAgICAgbV9kZWxldGUoZHluLCBvYik7IC8vIHVuZ3VlbHRpZywgd2VnIGRhbWl0LgorICAgIH0KKyAgICAvLyBnZXNhbXR6YWhsIE1vZHM/CisgICAgY2FjaGVbU0FNX0NPVU5UXSA9IHNpemVvZihzdGF0KSArIHNpemVvZihkeW4pOworICAgIGlmICghY2FjaGVbU0FNX0NPVU5UXSkgeworICAgICAgLy8ga2VpbmUgbW9kcyBkYSwgU3VibWFwcGluZyBmdWVyIGRpZXNlcyBTQSBrb21wbGV0dCBsb2VzY2hlbi4KKyAgICAgIG1fZGVsZXRlKHNraWxsYXR0cnMsIGF0dHIpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIC8vIHNvbnN0IGRpZSBhbmRlcmVuIENhY2hlLVdlcnRlIHNldHplbi4KKyAgICBjYWNoZVtTQU1fU1VNXSA9IHN1bTsKKyAgICBjYWNoZVtTQU1fQ0FDSEVfVElNRU9VVF0gPSB0aW1lb3V0OworICB9CisgIC8vIHdlbm4gYWxsZSBNb2RzIGdlbG9lc2NodCB3dXJkZW4uCisgIGlmICghc2l6ZW9mKHNraWxsYXR0cnMpKSBza2lsbGF0dHJzPTA7CisjaWZkZWYgX19ERUJVR19fCisgIGlmIChnZXR1aWQodGhpc19vYmplY3QoKSkgPT0gInplc3N0cmEiKQorICAgIFpERUJVRyhzcHJpbnRmKCIlT1xuIixza2lsbGF0dHJzKSk7CisjZW5kaWYKK30KKworcHJpdmF0ZSBpbnQgSW50ZXJuYWxNb2RpZnlTa2lsbEF0dHJpYnV0ZShvYmplY3QgY2FzdGVyLCBzdHJpbmcgYXRybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZWQgdmFsdWUsIGludCBkdXJhdGlvbikgeworICBpbnQgemVpdCA9IHV0aW1lKClbMV07CisgIGludCB0aWNrcyA9IGdldF9ldmFsX2Nvc3QoKTsKKworICAvLyBudXIgZXhpc3RpZXJlbmRlIFNBcy4uLgorICBpZiAoIXN0cmluZ3AoYXRybmFtZSkKKyAgICAgIHx8IG1lbWJlcihWQUxJRF9TS0lMTF9BVFRSSUJVVEVTLCBhdHJuYW1lKSA9PSAtMSkKKyAgICByZXR1cm4gU0FfTU9EX0lOVkFMSURfQVRUUjsKKworICBpZiAoIW9iamVjdHAoY2FzdGVyKSkgcmV0dXJuIFNBX01PRF9JTlZBTElEX09CSkVDVDsKKworICBpZiAoIW1hcHBpbmdwKHNraWxsYXR0cnMpKSBza2lsbGF0dHJzPW1fYWxsb2NhdGUoMSwzKTsKKyAgCisgIGlmICghbWVtYmVyKHNraWxsYXR0cnMsIGF0cm5hbWUpKSB7CisgICAgc2tpbGxhdHRyc1thdHJuYW1lLFNBTV9DQUNIRV0gPSAoezAsIDAsIDB9KTsKKyAgICAvLyBkaWUgbWVpc3RlbiBNb2RzIHNpbmQgc3RhdGlzY2gsIGRhaGVyIGF1ZiBWZXJkYWNodCBoaWVyIGZ1ZXIgZWluZW4KKyAgICAvLyBFaW50cmFnIFBsYXR6IHJlc2VydmllcmVuLCBhYmVyIG5pY2h0IGZ1ZXIgZGVuIGR5bi4gVGVpbC4KKyAgICBza2lsbGF0dHJzW2F0cm5hbWUsU0FNX1NUQVRJQ10gPSBtX2FsbG9jYXRlKDEsMik7CisgICAgc2tpbGxhdHRyc1thdHJuYW1lLFNBTV9EWU5BTUlDXSA9IG1fYWxsb2NhdGUoMCwyKTsKKyAgfQorICAvLyBwcnVlZmVuLCBvYiBNYXhpbWFsemFobCBhbiBFaW50cmFlZ2VuIGRyaW4gaXN0CisgIGVsc2UgaWYgKHNraWxsYXR0cnNbYXRybmFtZSxTQU1fQ0FDSEVdW1NBTV9DT1VOVF0gPj0gU0FNX01BWF9NT0RTKSB7CisgICAgLy8gbGV0enRlIENoYW5jZTogZGVzdHJ1Y3RldGUgT2JqZWt0ZSBkcmluPworICAgIHNraWxsYXR0cnNbYXRybmFtZSxTQU1fQ0FDSEVdW1NBTV9DT1VOVF0gPSAKKyAgICAgIHNpemVvZihza2lsbGF0dHJzW2F0cm5hbWUsU0FNX1NUQVRJQ10pCisgICAgK3NpemVvZihza2lsbGF0dHJzW2F0cm5hbWUsU0FNX0RZTkFNSUNdKTsKKyAgICAvLyBlcyBrYW5uIHNlaW4sIGRhc3Mgbm9jaCBhYmdlbGF1ZmVuZSBPYmpla3RlIGRyaW5zdGVoZW4sCisgICAgLy8gYWJlciBkaWUgUHJ1ZWZ1bmcgaXN0IG1pciBnZXJhZGUgenUgdGV1ZXIuIFRPRE8KKyAgICAvLyBub2NobWFsIGd1Y2tlbiAocmVzdCB2b20gY2FjaGUgd2lyZCBnZ2YuIHVudGVuIGdlcHJ1ZWZ0LikKKyAgICBpZiAoc2tpbGxhdHRyc1thdHJuYW1lLFNBTV9DQUNIRV1bU0FNX0NPVU5UXSA+PSBTQU1fTUFYX01PRFMpCisgICAgICByZXR1cm4gU0FfVE9PX01BTllfTU9EUzsgLy8gZGFubiBuaWNodC4KKyAgfQorCisgIC8vIERhdWVyIGRhcmYgbnVyIGVpbiBpbnQgc2Vpbi4KKyAgaWYgKCFpbnRwKGR1cmF0aW9uKSkKKyAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJXcm9uZyBhcmd1bWVudCAzIHRvIE1vZGlmeVNraWxsQXR0cmlidXRlOiAiCisgICAgImV4cGVjdGVkICdpbnQnLCBnb3QgJS4xME9cbiIsIGR1cmF0aW9uKSk7CisgIC8vIFplaXRzdGVtcGVsIGVybWl0dGVsbgorICBkdXJhdGlvbiArPSB0aW1lKCk7CisKKyAgLy8gc3RhdGlzY2hlciBvZGVyIGR5bi4gTW9kaWZpZXI/CisgIGlmIChpbnRwKHZhbHVlKSkgeworICAgIC8vIE1vZCBkYXJmIG5pY2h0IHp1IGdyb3NzIG9kZXIgenUga2xlaW4gc2Vpbi4gVE9ETzogR3Jlbnplbj8KKyAgICBpZiAodmFsdWUgPCAtMTAwMCkKKyAgICAgIHJldHVybiBTQV9NT0RfVE9PX1NNQUxMOworICAgIGVsc2UgaWYgKHZhbHVlID4gMTAwMCkKKyAgICAgIHJldHVybiBTQV9NT0RfVE9PX0JJRzsKKyAgICBlbHNlIGlmICghdmFsdWUpCisgICAgICByZXR1cm4gU0FfTU9EX0lOVkFMSURfVkFMVUU7IAorICAgIC8vIGplZGVzIE9iamVrdCBkYXJmIG51ciBlaW5lbiBtb2QgaGFiZW4uIFdlbm4gZGllc2VzIHNjaG9uIGVpbmVuIGR5bi4KKyAgICAvLyBoYXQsIG11c3MgZGVyIGdlbG9lc2NodCB3ZXJkZW4gKHN0YXQuIHdlcmRlbiBqYSBlaCBlcnNldHp0KS4KKyAgICBpZiAobWVtYmVyKHNraWxsYXR0cnNbYXRybmFtZSxTQU1fRFlOQU1JQ10sIGNhc3RlcikpCisgICAgICBtX2RlbGV0ZShza2lsbGF0dHJzW2F0cm5hbWUsU0FNX0RZTkFNSUNdLCBjYXN0ZXIpOworICAgIC8vIHNvbnN0IGVpbnRyYWdlbgorICAgIHNraWxsYXR0cnNbYXRybmFtZSwgU0FNX1NUQVRJQ10gKz0gKFtjYXN0ZXI6IHZhbHVlOyBkdXJhdGlvbl0pOworICB9CisgIGVsc2UgaWYgKGNsb3N1cmVwKHZhbHVlKSkgeworICAgIC8vIG51ciBlaW4gTW9kIHBybyBPYmpla3QsIHMuby4KKyAgICBpZiAobWVtYmVyKHNraWxsYXR0cnNbYXRybmFtZSxTQU1fU1RBVElDXSwgY2FzdGVyKSkKKyAgICAgIG1fZGVsZXRlKHNraWxsYXR0cnNbYXRybmFtZSxTQU1fU1RBVElDXSwgY2FzdGVyKTsKKyAgICAvLyBkaXJla3Qgb2huZSB3ZWl0ZXJlIFBydWVmdW5nIGVpbnRyYWdlbgorICAgIHNraWxsYXR0cnNbYXRybmFtZSwgU0FNX0RZTkFNSUNdICs9IChbY2FzdGVyOiB2YWx1ZTsgZHVyYXRpb25dKTsKKyAgfQorICBlbHNlCisgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiV3JvbmcgYXJndW1lbnQgMiB0byBNb2RpZnlTa2lsbEF0dHJpYnV0ZSgpOiAiCisgICAgImV4cGVjdGVkICdpbnQnIG9yICdjbG9zdXJlJywgZ290ICUuMTBPXG4iLHZhbHVlKSk7CisKKyNpZmRlZiBTQVNFVExPRworICBpZiAocXVlcnlfb25jZV9pbnRlcmFjdGl2ZSh0aGlzX29iamVjdCgpKSkKKyAgICBTQVNFVExPRyhzcHJpbnRmKCIlczogJU8sICVzLCAlTywgJU9cbiIsIAorICAgICAgICBzdHJmdGltZSgiJXklbSVkLSVIJU0lUyIpLCB0aGlzX29iamVjdCgpLCBhdHJuYW1lLCBjYXN0ZXIsIHZhbHVlKSk7CisjZW5kaWYKKyNpZmRlZiBTQVNUQVRECisgIG9iamVjdCBkYWVtb247CisgIGlmIChxdWVyeV9vbmNlX2ludGVyYWN0aXZlKE1FKQorICAgICAgJiYgb2JqZWN0cChkYWVtb249ZmluZF9vYmplY3QoU0FTVEFURCkpKQorICAgIGRhZW1vbi0+TG9nTW9kaWZpZXIoY2FzdGVyLCBhdHJuYW1lLCB2YWx1ZSwgZHVyYXRpb24pOworI2VuZGlmCisgIC8vIG5vY2ggZGVuIENhY2hlIGZ1ZXIgZGllc2VzIFNBIG5ldSBiZXJlY2huZW4KKyAgLy8gVE9ETzogQ2FjaGUgbnVyIGludmFsaWRpZXJlbiwgZGFtaXQgZXIgZXJzdCBiZWkgZGVyIG5hZWNoc3RlbiBBYmZyYWdlCisgIC8vIGFrdHVhbGlzaWVydCB3aXJkLiBTcGFydCBaZWl0LCB3ZW5uIGJpcyBkYWhpbiBtZWhyZXJlIE1vZHMKKyAgLy8gZW50ZmVybnQvYWRkaWVydCB3ZXJkZW4uIERhZnVlciBpc3QgZGllIGdlY2FjaGUgQW56YWhsIGFuIE1vZHMKKyAgLy8gaW5rb25zaXN0ZW50LgorICBVcGRhdGVTQUNhY2hlKCAoe2F0cm5hbWV9KSApOworCisgIFpERUJVRyhzcHJpbnRmKCJNU0E6ICVPLCBaZWl0OiAlZCwgVGlja3M6ICVkXG4iLAorCXRoaXNfb2JqZWN0KCksCisJdXRpbWUoKVsxXS16ZWl0LCB0aWNrcy1nZXRfZXZhbF9jb3N0KCkpKTsKKworICByZXR1cm4gU0FfTU9EX09LOworfQorCitwdWJsaWMgaW50IE1vZGlmeVNraWxsQXR0cmlidXRlKHN0cmluZyBhdHJuYW1lLCBtaXhlZCB2YWx1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHVyYXRpb24pIHsKKyAgcmV0dXJuIEludGVybmFsTW9kaWZ5U2tpbGxBdHRyaWJ1dGUoCisgICAgICAoZXh0ZXJuX2NhbGwoKT9wcmV2aW91c19vYmplY3QoKTpNRSksIGF0cm5hbWUsIHZhbHVlLCBkdXJhdGlvbik7Cit9CisKK3B1YmxpYyBpbnQgUmVtb3ZlU2tpbGxBdHRyaWJ1dGVNb2RpZmllcihvYmplY3QgY2FzdGVyLCBzdHJpbmcgYXR0cm5hbWUpIHsKKyAgaWYgKCFzdHJpbmdwKGF0dHJuYW1lKSB8fCAhbWFwcGluZ3Aoc2tpbGxhdHRycykgfHwgIW9iamVjdHAoY2FzdGVyKQorICAgICAgfHwgIW1lbWJlcihza2lsbGF0dHJzLCBhdHRybmFtZSkpCisgICAgcmV0dXJuIFNBX01PRF9OT1RfRk9VTkQ7CisgIC8vIFRPRE86IEJlcmVjaHRpZ3VuZyBwcnVlZmVuLiA7LSkKKworICBpZiAobWVtYmVyKHNraWxsYXR0cnNbYXR0cm5hbWUsIFNBTV9TVEFUSUNdLCBjYXN0ZXIpKSB7CisgICAgbV9kZWxldGUoc2tpbGxhdHRyc1thdHRybmFtZSwgU0FNX1NUQVRJQ10sIGNhc3Rlcik7CisgIH0KKyAgZWxzZSBpZiAobWVtYmVyKHNraWxsYXR0cnNbYXR0cm5hbWUsIFNBTV9EWU5BTUlDXSwgY2FzdGVyKSkgeworICAgIG1fZGVsZXRlKHNraWxsYXR0cnNbYXR0cm5hbWUsIFNBTV9EWU5BTUlDXSwgY2FzdGVyKTsKKyAgfQorICBlbHNlCisgICAgcmV0dXJuIFNBX01PRF9OT1RfRk9VTkQ7CisgIAorICAvLyBUT0RPOiBDYWNoZSBudXIgaW52YWxpZGllcmVuLCBkYW1pdCBlciBlcnN0IGJlaSBkZXIgbmFlY2hzdGVuIEFiZnJhZ2UKKyAgLy8gYWt0dWFsaXNpZXJ0IHdpcmQuIFNwYXJ0IFplaXQsIHdlbm4gYmlzIGRhaGluIG1laHJlcmUgTW9kcworICAvLyBlbnRmZXJudC9hZGRpZXJ0IHdlcmRlbi4gRGFmdWVyIGlzdCBkaWUgZ2VjYWNoZSBBbnphaGwgYW4gTW9kcworICAvLyBpbmtvbnNpc3RlbnQuCisgIFVwZGF0ZVNBQ2FjaGUoICh7YXR0cm5hbWV9KSApOworCisgIHJldHVybiBTQV9NT0RfUkVNT1ZFRDsKK30KKworcHVibGljIGludCBRdWVyeVNraWxsQXR0cmlidXRlKHN0cmluZyBhdHJuYW1lKQoreworICBtaXhlZCBvZmZzZXRzLCBhdHRyOworICBpbnQgbW9kc3VtbWUsIHF1YWwsIHJldCwgY3ZhbDsKKworICBpZiAoIXN0cmluZ3AoYXRybmFtZSkpIC8vIFZBTElEX1NLSUxMX0FUVFJJQlVURVMgYmVydWVja3NpY2h0aWdlbj8KKyAgICByZXR1cm4gMTAwOworCisgIC8vIHdlbm4gbmljaHQgU0FfUVVBTElUWSBnZWZyYWd0IGlzdCwgZXJzdG1hbCBqZW5lcyBlcm1pdHRlbG4sIHdlaWwgZXMgZGVuCisgIC8vIGVyc3RlbiBNb2RpZmllciBhdWYgYWxsZSBhbmRlcmVuIFNBcyBkYXJzdGVsbHQuIFNvbnN0IGRlbiBTdGFydHdlcnQgZnVlcgorICAvLyBTQV9RVUFMSVRZICgxMDApIG1vZGlmaXppZXJ0IGR1cmNoIGV2dGwuIFRvZGVzZm9sZ2VuIGVybWl0dGVsbi4KKyAgaWYgKCBhdHJuYW1lICE9IFNBX1FVQUxJVFkgKQorICAgIHF1YWwgPSBRdWVyeVNraWxsQXR0cmlidXRlKFNBX1FVQUxJVFkpOworICBlbHNlCisgICAgLy8gYmVpIFNBX1FVQUxJVFkgZ2VoZW4gZGllIFRvZGVzZm9sZ2VuIGVpbgorICAgIHF1YWwgPSB0b19pbnQoMTAwICogcG93KDAuOSwgZGVhdGhfc3VmZmVyaW5nKCkvMTAuMCkpOworCisgIC8vIERpZSBPZmZzZXRzIHNpbmQgc296dXNhZ2VuIGRlciBCYXNpc3dlcnQgZGVyIFNBcy4gQWxzIGVyc3RlcyB2ZXJ3dXJzdGVuLAorICAvLyBzb2Zlcm4gdm9yaGFuZGVuLCBuZW4gaW50IGRyaW5zdGVodCB1bmQgZGVyIG9mZnNldCAhPSAwIGlzdC4KKyAgaWYgKCBtYXBwaW5ncChvZmZzZXRzID0gUXVlcnkoUF9TS0lMTF9BVFRSSUJVVEVfT0ZGU0VUUykpCisgICAgICAgJiYgaW50cChhdHRyPW9mZnNldHNbYXRybmFtZV0pIAorICAgICAgICYmIGF0dHIpCisgICAgcmV0ID0gYXR0cjsKKyAgZWxzZQorICAgIHJldCA9IDEwMDsKKworICAvLyB3ZW5uIGtlaW5lIE1vZHMgZ2VzZXR6dCBzaW5kLCB3YXJzIGRhcyBqZXR6dC4gOy0pCisgIGlmICggIW1hcHBpbmdwKHNraWxsYXR0cnMpCisgICAgICAgfHwgIW1lbWJlcihza2lsbGF0dHJzLCBhdHJuYW1lKSApCisgICAgcmV0dXJuIChyZXQqcXVhbCkvMTAwOworCisgIC8vIHdlbm4gQ2FjaGUgZGVyIHN0YXQuIE1vZHMgYWJnZWxhdWZlbiBvZGVyIG9mZmVuYmFyIE9iamVrdGUgemVyc3RvZXJ0CisgIC8vIHd1cmRlbiwgbXVzcyBkZXIgQ2FjaGUgbmV1IGJlcmVjaG5ldCB3ZXJkZW4uCisgIGlmICggc2tpbGxhdHRyc1thdHJuYW1lLFNBTV9DQUNIRV1bU0FNX0NBQ0hFX1RJTUVPVVRdIDwgdGltZSgpCisgICAgICB8fCBzaXplb2Yoc2tpbGxhdHRyc1thdHJuYW1lLFNBTV9TVEFUSUNdKQorICAgICAgICAgK3NpemVvZihza2lsbGF0dHJzW2F0cm5hbWUsU0FNX0RZTkFNSUNdKSAhPQorICAgICAgICAgICBza2lsbGF0dHJzW2F0cm5hbWUsU0FNX0NBQ0hFXVtTQU1fQ09VTlRdICkKKyAgeworICAgIFVwZGF0ZVNBQ2FjaGUoICh7YXRybmFtZX0pICk7CisgICAgLy8gVXBkYXRlU0FDYWNoZSgpIGxvZXNjaHQgdVUgZGFzIFNBLU1hcHBpbmcgb2RlciBFaW50cmFlZ2UgZGFyYXVzLgorICAgIGlmICggIW1hcHBpbmdwKHNraWxsYXR0cnMpCisgICAgICAgICB8fCAhbWVtYmVyKHNraWxsYXR0cnMsIGF0cm5hbWUpICkKKyAgICByZXR1cm4gKHJldCpxdWFsKS8xMDA7CisgIH0KKyAgLy8gU3VtbWUgZGVyIHN0YXRpc2NoZW4gTW9kcy4KKyAgbW9kc3VtbWUgPSBza2lsbGF0dHJzW2F0cm5hbWUsU0FNX0NBQ0hFXVtTQU1fU1VNXTsKKworICAvLyBUT0RPISBFdnRsLiBhbmRlcmUgRGF0ZW4gYWxzIE1FIGFuIGRpZSBGdW5rdGlvbiB1ZWJlcmdlYmVuCisgIC8vIFRPRE8hIGJlcmVpdHMgbmFjaCBBZGRpdGlvbiBkZXMgRnVua3Rpb25zcnVlY2tnYWJld2VydGVzIHBydWVmZW4sIG9iIGRlcgorICAvLyAgICAgICBXZXJ0ZWJlcmVpY2ggZGVzIFNBLU1vZGlmaWVycyB1ZWJlcnNjaHJpdHRlbiBpc3QsIG9kZXIgZnJlaWVuCisgIC8vICAgICAgIFdlcnRlYmVyZWljaCBlcmxhdWJlbiB1bmQgZXJzdCBhbSBFbmRlIGRlY2tlbG4gKGFrdHVlbGxlIFZhcmlhbnRlKQorICAvLyBEeW5hbWlzY2hlIE1vZGlmaWVyIGF1c3dlcnRlbgorICBmb3JlYWNoKCBvYmplY3Qgb2IsIGNsb3N1cmUgY2wsIGludCBkdXJhdGlvbjoKKyAgICAgICAgICAgc2tpbGxhdHRyc1thdHJuYW1lLFNBTV9EWU5BTUlDXSApCisgIHsKKyAgICBpZiAoIGR1cmF0aW9uID4gdGltZSgpICAgICAgICAgICAgICAgLy8gTm9jaCBuaWNodCBhYmdlbGF1ZmVuIHVuZAorICAgICAgICAgJiYgaW50cChjdmFsPWZ1bmNhbGwoY2wsIE1FKSkgKSAvLyBGdW5rdGlvbiBsaWVmZXJ0IGludCB6dXJ1ZWNrCisgICAgICBtb2RzdW1tZSArPSBjdmFsOworICAgIGVsc2UgeworICAgICAgbV9kZWxldGUoc2tpbGxhdHRyc1thdHJuYW1lLFNBTV9EWU5BTUlDXSwgb2IpOworICAgICAgc2tpbGxhdHRyc1thdHJuYW1lLFNBTV9DQUNIRV1bU0FNX0NPVU5UXS0tOworICAgIH0KKyAgfQorICByZXQgPSAoKHJldCttb2RzdW1tZSkqcXVhbCkvMTAwOworICBpZiAoIHJldCA8IDEwICkKKyAgICByZXQgPSAxMDsKKyAgZWxzZSBpZiAoIHJldCA+IDEwMDAgKQorICAgIHJldCA9IDEwMDA7CisKKyAgcmV0dXJuIHJldDsKK30KKworcHVibGljIHZhcmFyZ3MgbWFwcGluZyBRdWVyeVNraWxsQXR0cmlidXRlTW9kaWZpZXIob2JqZWN0IGNhc3RlciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgKmF0dHJuYW1lcykgeworICAKKyAgLy8gYXVmIGFiZ2VsYXVmZW5lIE1vZGlmaWthdG9yZW4gcHJ1ZWZlbgorICBpZiAoIXBvaW50ZXJwKGF0dHJuYW1lcykpCisgICAgVXBkYXRlU0FDYWNoZSggKHt9KSApOworICBlbHNlCisgICAgVXBkYXRlU0FDYWNoZShhdHRybmFtZXMpOworCisgIGlmICghbWFwcGluZ3Aoc2tpbGxhdHRycykpCisgICAgcmV0dXJuIChbXSk7CisgIGlmICghcG9pbnRlcnAoYXR0cm5hbWVzKSB8fCAhc2l6ZW9mKGF0dHJuYW1lcykpCisgICAgYXR0cm5hbWVzID0gbV9pbmRpY2VzKHNraWxsYXR0cnMpOyAvLyBhbGxlIGR1cmNoc3VjaGVuCisgIGVsc2UgLy8gc2Nobml0dG1lbmdlIGRlciBnZXcuIHVuZCB2b3JoYW5kZW5lbiBiaWxkZW4KKyAgICBhdHRybmFtZXMgPSBtX2luZGljZXMoc2tpbGxhdHRycykgJiBhdHRybmFtZXM7CisgIAorICBtYXBwaW5nIHJlcz1tX2FsbG9jYXRlKHNpemVvZihhdHRybmFtZXMpLCAxKTsKKworICBmb3JlYWNoKHN0cmluZyBhdHI6IGF0dHJuYW1lcykgeworICAgIHJlc1thdHJdID0gbV9hbGxvY2F0ZSg1LCAyKTsgLy8gbWFsIGZ1ZXIgNSBXZXJ0ZSBQbGF0eiByZXNlcnZpZXJlbgorICAgIGlmICghb2JqZWN0cChjYXN0ZXIpKSB7CisgICAgICAvLyB3ZW5uIGtlaW4gYmVzdGltbXRlciBjYXN0ZXIgYW5nZWZyYWd0IGlzdCwgYWxsZSBtb2RzIGxpZWZlcm4KKyAgICAgIGZvcmVhY2gob2JqZWN0IGMsIGludCB2YWx1ZSwgaW50IGR1cjogc2tpbGxhdHRyc1thdHIsIFNBTV9TVEFUSUNdKSB7CisJcmVzW2F0cl0gKz0gKFtjOiB2YWx1ZTsgZHVyXSk7CisgICAgICB9CisgICAgICBmb3JlYWNoKG9iamVjdCBjLCBjbG9zdXJlIHZhbHVlLCBpbnQgZHVyOiBza2lsbGF0dHJzW2F0ciwgU0FNX0RZTkFNSUNdKSB7CisJcmVzW2F0cl0gKz0gKFtjOiB2YWx1ZTsgZHVyXSk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgLy8gc29uc3QgbnVyIGRlbiBNb2Qgdm9uIGNhc3RlcgorICAgICAgaWYgKG1lbWJlcihza2lsbGF0dHJzW2F0ciwgU0FNX1NUQVRJQ10sIGNhc3RlcikpIHsKKwlyZXNbYXRyXSArPSAoW2Nhc3RlcjogCisJCQkgc2tpbGxhdHRyc1thdHIsIFNBTV9TVEFUSUNdW2Nhc3RlciwgU0FNX1ZBTFVFXTsKKwkgICAgICAgICAgICAgICAgIHNraWxsYXR0cnNbYXRyLCBTQU1fU1RBVElDXVtjYXN0ZXIsIFNBTV9EVVJBVElPTl0KKwkJICAgIF0pOworICAgICAgfQorICAgICAgZWxzZSBpZiAobWVtYmVyKHNraWxsYXR0cnNbYXRyLCBTQU1fRFlOQU1JQ10sIGNhc3RlcikpIHsKKwlyZXNbYXRyXSArPSAoW2Nhc3RlcjoKKwkJCSBza2lsbGF0dHJzW2F0ciwgU0FNX0RZTkFNSUNdW2Nhc3RlciwgU0FNX1ZBTFVFXTsKKwkgICAgICAgICAgICAgICAgIHNraWxsYXR0cnNbYXRyLCBTQU1fRFlOQU1JQ11bY2FzdGVyLCBTQU1fRFVSQVRJT05dCisJCSAgICBdKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKworLy8gS29tcGF0aWJpbGl0YWV0c2Z1bmt0aW9uIG1pdCBhbHRlbSBJbnRlcmZhY2UuIElzdCBudXIgZWluIFdyYXBwZXIsIGRlcgorLy8gdmFsdWUgdW1yZWNobmV0IHVuZCAnYWx0ZScgUnVlY2tnYWJld2VydGUgbGllZmVydC4KKworcHVibGljIHZhcmFyZ3MgaW50IE1vZGlmeVNraWxsQXR0cmlidXRlT2xkKG9iamVjdCBjYXN0ZXIsIHN0cmluZyBhdHJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWUsIGludCBkdXJhdGlvbiwgbWl4ZWQgZnVuKSB7CisgIGludCByZXM7CisgIC8vIENhbGxlciBlcm1pdHRlbG4KKyAgaWYgKGV4dGVybl9jYWxsKCkpIGNhc3Rlcj1wcmV2aW91c19vYmplY3QoKTsKKyAgZWxzZSBjYXN0ZXI9TUU7CisKKyAgLy8gQ2xvc3VyZXMga29lbm5lbiB2aWEgTW9kaWZ5U2tpbGxBdHRyaWJ1dGVPbGQoKSBuaWNodCBtZWhyIGdlc2V0enQgd2VyZGVuLAorICAvLyBkYSBkZXJlbiBSdWVja2dhYmV3ZXJ0IG5pY2h0IHNpbm52b2xsIHVtZ2VyZWNobmV0IHdlcmRlbiBrb2VubmVuLiAoTWFuCisgIC8vIHdlaXNzIG5pY2h0LCBvYiBlcyBlaW5lIG5ldWUgb2RlciBhbHRlIENsb3N1cmUgaXN0LikKKyAgaWYgKHBvaW50ZXJwKGZ1bikgfHwgY2xvc3VyZXAoZnVuKSkKKyAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIkNsb3N1cmVzIGZvciBTQSBtb2RpZmllcnMgY2FuJ3QgYmUgc2V0IGJ5ICIKKyAgICAgICJNb2RpZnlTa2lsbEF0dHJpYnV0ZU9sZCgpISBVc2UgTW9kaWZ5U2tpbGxBdHRyaWJ1dGUoKSFcbiIpKTsKKyAgCisgIHJlcyA9IEludGVybmFsTW9kaWZ5U2tpbGxBdHRyaWJ1dGUoY2FzdGVyLCBhdHJuYW1lLCB2YWx1ZS0xMDAsIGR1cmF0aW9uKTsKKyAgLy8gZGllIGFsdGUgZnVua3Rpb24gaGF0dGUgbnVyIDAgZnVlciB1bmd1ZWx0aWdlbiBXZXJ0IHVuZCA8IDAgZnVlciB6dQorICAvLyBrbGVpbmVzIExldmVsIGFscyBSdWVja2dhYmV3ZXJ0LiBadSBrbGVpbmVzIExldmVsIGdpYnQgbmljaHQgbWVociwgYWxzbworICAvLyBibGVpYnQgbnVyIDAgYWxzIFNhbW1lbC1GZWhsZXJjb2RlIHVlYnJpZy4gKnNldWZ6KgorICBpZiAocmVzIDwgMCkgcmV0dXJuIDA7CisgIHJldHVybiByZXM7Cit9CisKZGlmZiAtLWdpdCBhL3N0ZC9saXZpbmcvc2tpbGxfdXRpbHMuYyBiL3N0ZC9saXZpbmcvc2tpbGxfdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGNhZjc1Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkL2xpdmluZy9za2lsbF91dGlscy5jCkBAIC0wLDAgKzEsMzUgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBsaXZpbmcvc2tpbGxfdXRpbHMgLS0gc29tZSBoZWxwZXIgZnVuY3Rpb25zIGZvciBtYW5pcHVsYXRpbmcgc2tpbGwgZGF0YSAKKy8vICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgaW4gbW9yZSB0aGFuIG9uZSBwcm9ncmFtLgorLy8KKy8vICRJZDogc2tpbGxfdXRpbHMuYyA2NzM4IDIwMDgtMDItMTkgMTg6NDY6MTRaIEh1bW5pICQKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKworI2luY2x1ZGUgPG5ld19za2lsbHMuaD4KKworcHJvdGVjdGVkIHZvaWQgU2tpbGxSZXNUcmFuc2ZlcihtYXBwaW5nIGZyb21fTSwgbWFwcGluZyB0b19NKQoreworICBpZiAoICFtYXBwaW5ncChmcm9tX00pIHx8ICFtYXBwaW5ncCh0b19NKSApCisgICAgcmV0dXJuOworCisgIGlmICggbWVtYmVyKGZyb21fTSxTSV9TS0lMTERBTUFHRSkgKQorICAgIHRvX01bU0lfU0tJTExEQU1BR0VdID0gdG9faW50KGZyb21fTVtTSV9TS0lMTERBTUFHRV0pOworCisgIGlmICggbWVtYmVyKGZyb21fTSxTSV9TS0lMTERBTUFHRV9NU0cpICkKKyAgICB0b19NW1NJX1NLSUxMREFNQUdFX01TR10gPSB0b19zdHJpbmcoZnJvbV9NW1NJX1NLSUxMREFNQUdFX01TR10pOworCisgIGlmICggbWVtYmVyKGZyb21fTSxTSV9TS0lMTERBTUFHRV9NU0cyKSApCisgICAgdG9fTVtTSV9TS0lMTERBTUFHRV9NU0cyXSA9IHRvX3N0cmluZyhmcm9tX01bU0lfU0tJTExEQU1BR0VfTVNHMl0pOworCisgIGlmICggbWVtYmVyKGZyb21fTSxTSV9TS0lMTERBTUFHRV9UWVBFKSApCisgICAgdG9fTVtTSV9TS0lMTERBTUFHRV9UWVBFXSA9IGZyb21fTVtTSV9TS0lMTERBTUFHRV9UWVBFXTsKKworICBpZiAoIG1lbWJlcihmcm9tX00sU0lfU1BFTEwpICkKKyAgICB0b19NW1NJX1NQRUxMXSA9IGZyb21fTVtTSV9TUEVMTF07Cit9CisKZGlmZiAtLWdpdCBhL3N0ZC9saXZpbmcvc2tpbGxzLmMgYi9zdGQvbGl2aW5nL3NraWxscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYzlkY2MKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvbGl2aW5nL3NraWxscy5jCkBAIC0wLDAgKzEsNTk1IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gbGl2aW5nL3NraWxscy5jIC0tIEdpbGRlbi0sIFNraWxsLSB1bmQgU3BlbGxmdW5rdGlvbmVuIGZ1ZXIgTGViZXdlc2VuCisvLworLy8gJElkOiBza2lsbHMuYyA4NzU1IDIwMTQtMDQtMjYgMTM6MTM6NDBaIFplc3N0cmEgJAorI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCitpbmhlcml0ICIvc3RkL2xpdmluZy9zdGRfc2tpbGxzIjsKKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDxsaXZpbmcvc2tpbGxzLmg+CisjaW5jbHVkZSA8bGl2aW5nL3NraWxsX2F0dHJpYnV0ZXMuaD4KKyNpbmNsdWRlIDxwbGF5ZXIvbGlmZS5oPgorI3VuZGVmIE5FRURfUFJPVE9UWVBFUworCisjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxuZXdfc2tpbGxzLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisKKy8vIHNwZWljaGVydCBkaWUgU3BlbGwtRmF0aWd1ZXMgKGdsb2JhbCwgU3BydWNoZ3J1cHBlbiwgRWluemVsc3BydWVjaGUpCitwcml2YXRlIG1hcHBpbmcgc3BlbGxfZmF0aWd1ZXMgPSAoW10pOworCisvLyBQcm90b3R5cGVuCitwcml2YXRlIHZvaWQgZXhwaXJlX3NwZWxsX2ZhdGlndWVzKCk7CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgIC8vIG1haW5seSBuZWNlc3NhcnkgZm9yIHBsYXllcnMsIGJ1dCB0aGVyZSBtYXkgYmUgc29tZSBOUEMgd2l0aCBzYXZlZmlsZXMuCisgIC8vIEFkZGl0aW9uYWxseSwgaXQgc2ltcGxpZmllcyBleHBpcmF0aW9uIG9mIG9sZCBrZXlzIHRvIGhhdmUgaXQgaGVyZS4KKyAgY2FsbF9vdXQoIydleHBpcmVfc3BlbGxfZmF0aWd1ZXMsIDQpOworfQorCisKKy8vIERpZXNlIC0gaGllciBzY2hlaW5iYXIgc2lubmxvc2UgLSBGdW5rdGlvbiB3aXJkIHZvbiAvc3RkL3BsYXllci9za2lsbHMuYyBkYW5uIAorLy8gdWViZXJsYWRlbi4KK3B1YmxpYyBpbnQgaXNfZGVhY3RpdmF0ZWRfc2tpbGwoc3RyaW5nIHNuYW1lLCBzdHJpbmcgZ2lsZGUpCit7CisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgc3RyaW5nIF9xdWVyeV92aXNpYmxlX2d1aWxkKCkKK3sgc3RyaW5nIHJlczsKKworICBpZiAoIHN0cmluZ3AocmVzPVF1ZXJ5KFBfVklTSUJMRV9HVUlMRCkpICkKKyAgICByZXR1cm4gcmVzOworCisgIHJldHVybiBRdWVyeVByb3AoUF9HVUlMRCk7Cit9CisKK3N0YXRpYyBzdHJpbmcgX3F1ZXJ5X3Zpc2libGVfc3ViZ3VpbGRfdGl0bGUoKQoreyBzdHJpbmcgcmVzOworCisgIGlmICggc3RyaW5ncChyZXM9UXVlcnkoUF9WSVNJQkxFX1NVQkdVSUxEX1RJVExFKSkgKQorICAgIHJldHVybiByZXM7CisKKyAgcmV0dXJuIFF1ZXJ5UHJvcChQX1NVQkdVSUxEX1RJVExFKTsKK30KKworc3RhdGljIG1peGVkIF9xdWVyeV9ndWlsZF9wcmVwYXJlYmxvY2soKQoreyBtYXBwaW5nIHJlczsKKyAgc3RyaW5nICBnaWxkZTsKKworICBpZiAoICFzdHJpbmdwKGdpbGRlPVF1ZXJ5UHJvcChQX0dVSUxEKSkgKQorICAgIHJldHVybiAwOworICBpZiAoICFtYXBwaW5ncChyZXM9UXVlcnkoUF9HVUlMRF9QUkVQQVJFQkxPQ0spKSAKKyAgICAgIHx8ICFtZW1iZXIocmVzLGdpbGRlKSApCisgICAgcmV0dXJuIDA7CisgIHJldHVybiByZXNbZ2lsZGVdOworfQorCitzdGF0aWMgbWl4ZWQgX3NldF9ndWlsZF9wcmVwYXJlYmxvY2sobWl4ZWQgYXJnKQoreyBtYXBwaW5nIHJlczsKKyAgc3RyaW5nICBnaWxkZTsKKworICBpZiAoICFzdHJpbmdwKGdpbGRlPVF1ZXJ5UHJvcChQX0dVSUxEKSkgKQorICAgIHJldHVybiAwOworICBpZiAoICFtYXBwaW5ncChyZXM9UXVlcnkoUF9HVUlMRF9QUkVQQVJFQkxPQ0spKSApCisgICAgcmVzPShbXSk7CisKKyAgcmVzW2dpbGRlXT1hcmc7CisgIFNldChQX0dVSUxEX1BSRVBBUkVCTE9DSyxyZXMpOworCisgIHJldHVybiBhcmc7Cit9CisKKworcHJpdmF0ZSBub3NhdmUgaW50IHZhbGlkX3NldHNraWxsc19vdmVycmlkZTsKKy8vIE1hbiBzb2xsdGUgZWlnZW50bGljaCBqYSBuaWNodCBQYXJhbWV0ZXIgYWxzIGdsb2JhbGUgVmFyaWFibGVuCisvLyB1ZWJlcmdlYmVuLCBhYmVyIGhpZXIgZ2luZyBlcyBuaWNodCBhbmRlcnMKK25vbWFzayBwcml2YXRlIGludCB2YWxpZF9zZXRza2lsbHMoc3RyaW5nIGdpbGRlKQoreyBzdHJpbmcgZm47CisKKyAgaWYgKCAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZSh0aGlzX29iamVjdCgpKSApCisgICAgcmV0dXJuIDE7IC8vIE1vbnN0ZXIgZHVlcmZlbiBzaWNoIHNlbGJlciBTa2lsbHMgc2V0emVuIDopCisKKyAgaWYgKCBRdWVyeVByb3AoUF9URVNUUExBWUVSKSB8fCBJU19XSVpBUkQodGhpc19vYmplY3QoKSkgKQorICAgICAgcmV0dXJuIDE7IC8vIFRlc3RzcGllbGVyIHVuZCBNYWdpZXIgc2luZCBzY2h1dHpsb3NlIE9wZmVyIDstKQorCisgIGlmICggcHJldmlvdXNfb2JqZWN0KCkgKQorICB7CisgICAgaWYgKCBwcmV2aW91c19vYmplY3QoKT09dGhpc19vYmplY3QoKQorICAgICAgICAmJiB0aGlzX2ludGVyYWN0aXZlKCk9PXRoaXNfb2JqZWN0KCkgKQorICAgICAgcmV0dXJuIDE7CisKKyAgICBmbj1vYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSk7CisgICAgaWYgKCBmblswLi43XT09Ii9naWxkZW4vIgorICAgICAgICB8fCBmblswLi4xMV09PSIvc3BlbGxib29rcy8iCisgICAgICAgIHx8IGZuWzAuLjddPT0iL3NlY3VyZS8iCisgICAgICAgIHx8IGZuWzAuLjExXT09Ii9wL3phdWJlcmVyLyIgKQorICAgICAgcmV0dXJuIDE7IC8vIERpZSBzb2xsdGVuIHByb2JsZW1sb3MgYWVuZGVybiBkdWVyZmVuCisKKyAgICBpZiAoIGZpbGVfc2l6ZSgiL2dpbGRlbi9hY2Nlc3NfcmlnaHRzIik+MAorICAgICAgICYmIGNhbGxfb3RoZXIoIi9naWxkZW4vYWNjZXNzX3JpZ2h0cyIsCisgICAgICAgICAgICAgICAgICAgICJhY2Nlc3NfcmlnaHRzIiwKKyAgICAgICAgICAgICAgICAgICAgZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKSwKKyAgICAgICAgICAgICAgICAgICAgZ2lsZGUrIi5jIikpCisgICAgICByZXR1cm4gMTsgLy8gU2V0emVuZGVzIE9iamVrdCBrb21tdCB2b20gR2lsZGVucHJvZ3JhbW1pZXJlcgorCisgICAgaWYgKCBmaWxlX3NpemUoIi9naWxkZW4vIitnaWxkZSsiLmMiKT4wCisgICAgICAgICYmIGNhbGxfb3RoZXIoIi9naWxkZW4vIitnaWxkZSwKKyAgICAgICAgICAgICAgICAgICAgICAidmFsaWRfc2V0c2tpbGxzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGxvZGUoZm4sIiMiKVswXSkgKQorICAgICAgcmV0dXJuIDE7IC8vIERpZSBHaWxkZSBzZWxiZXIga2FubiBBdXNuYWhtZW4genVsYXNzZW4KKyAgfQorCisgIGlmICh2YWxpZF9zZXRza2lsbHNfb3ZlcnJpZGUpCisgIHsKKyAgICB2YWxpZF9zZXRza2lsbHNfb3ZlcnJpZGU9MDsKKyAgICByZXR1cm4gMTsgLy8gRnVlcnMgU2V0emVuIGRlciBDbG9zdXJlCisgIH0KKworICBpZiAoIHRoaXNfaW50ZXJhY3RpdmUoKSApCisgIHsKKyAgICBpZiAoIElTX0FSQ0godGhpc19pbnRlcmFjdGl2ZSgpKSApCisgICAgICByZXR1cm4gMTsgLy8gRXJ6bWFnaWVyIGR1ZXJmZW4gaW1tZXIgYWVuZGVybgorCisgICAgaWYgKCBjYWxsX290aGVyKCIvZ2lsZGVuL2FjY2Vzc19yaWdodHMiLAorICAgICAgICAgICAgICAgICAgICAiYWNjZXNzX3JpZ2h0cyIsCisgICAgICAgICAgICAgICAgICAgIGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpLAorICAgICAgICAgICAgICAgICAgICBnaWxkZSsiLmMiKSkKKyAgICAgIHJldHVybiAxOyAgLy8gRGVyIEdpbGRlbnByb2dyYW1taWVyZXIgc2VsYmVyIGF1Y2gKKyAgfQorCisgIC8vIEZ1ZXIgZGllIFdhZmZlbnNraWxscywgZGllIHNvbGxlbiBzaWNoIHNlbGJzdCBhdWNoIHNldHplbiBkdWVyZmVuCisgIGlmICghdGhpc19pbnRlcmFjdGl2ZSgpICYmIHRoaXNfb2JqZWN0KCk9PXByZXZpb3VzX29iamVjdCgpKQorCSAgcmV0dXJuIDE7CisgIAorICAKKyAgbG9nX2ZpbGUoIlNFVFNLSUxMUyIsc3ByaW50ZigiKioqKipcbiVzIFBPOiVPLT5UTzolTyBUSTolT1xuIEdVSUxEOiVzIFZFUkJfQVJHUzonJXMnXG4iLAorICAgICAgICAgICAgY3RpbWUodGltZSgpKVs0Li4xNV0sCisgICAgICAgICAgICBwcmV2aW91c19vYmplY3QoKSwKKyAgICAgICAgICAgIHRoaXNfb2JqZWN0KCksCisgICAgICAgICAgICB0aGlzX2ludGVyYWN0aXZlKCksCisgICAgICAgICAgICBnaWxkZSwKKyAgICAgICAgICAgICggdGhpc19pbnRlcmFjdGl2ZSgpID8gcXVlcnlfdmVyYigpICsgIiAiICsKKyAgICAgICAgICAgICAgICB0aGlzX2ludGVyYWN0aXZlKCktPl91bnBhcnNlZF9hcmdzKCkgOiAiIikgKSk7CisKKyAgcmV0dXJuIDA7Cit9CisKKy8vIE51ciBpbnRlcm5lIFZlcndlbmR1bmcsIHZhbHVlIHdpcmQgbmljaHQgd2VpdGVyIHBydWVmdCwgbXVzcyBvayBzZWluLgorLy8gRXMgd2lyZCBrZWluZSBLb3BpZSB2b24gdmFsdWUgZ2VtYWNodCwgd2VubiBlcyBpbnMgTWFwcGluZyBnZXNjaHJpZWJlbgorLy8gd2lyZCEKK3ByaXZhdGUgbWFwcGluZyBpbnRlcm5hbF9zZXRfbmV3c2tpbGxzKG1hcHBpbmcgdmFsdWUsIHN0cmluZyBnaWxkZSkgeworICBtYXBwaW5nIHNraWxsczsKKworICAvLyBpbiBkZXIgcmljaHRpZ2VuIEdpbGRlIHNldHplbi4KKyAgaWYgKCAhZ2lsZGUgJiYgIShnaWxkZT1RdWVyeVByb3AoUF9HVUlMRCkpICkKKyAgICBnaWxkZT0iQU5ZIjsKKworICAvLyBRdWVyeSgpLCBoaWVyIGlzdCBlaW5lIEtvcGllIG5pY2h0IHNpbm52b2xsLgorICBpZiAoICFtYXBwaW5ncChza2lsbHM9UXVlcnkoUF9ORVdTS0lMTFMsRl9WQUxVRSkpICkgeworICAgIHNraWxscz0oW10pOworICAgIFNldChQX05FV1NLSUxMUywgc2tpbGxzLCBGX1ZBTFVFKTsKKyAgfQorCisgIC8vIEZhbGxzIGRpZXMgaGllciBtYWwgYXVzZ2V3ZXJ0ZXQgd2VyZGVuIHNvbGx0ZSwgbmljaHQgdmVyZ2Vzc2VuLCBkYXNzCisgIC8vIGVpbmlnZSBGdW5rdGlvbiBoaWVyIGltIEZpbGUgZGllIFByb3AgZXZ0bC4gdmlhCisgIC8vIGludGVybmFsX3F1ZXJ5X25ld3NraWxscygpIGFicnVmZW4gdW5kIGRpcmVrdCBhZW5kZXJuLi4uCisgIHZhbGlkX3NldHNraWxscyhnaWxkZSk7IC8vIFNpY2hlcmhlaXRzdWViZXJwcnVlZnVuZworICAKKyAgLy8gU2tpbGxzIHNldHplbi4gU2V0KCkgdW5ub2V0aWcsIHdlaWwgd2lyIGRhcyB2b24gUXVlcnkoKSBnZWxpZWZlcnRlCisgIC8vIE1hcHBpbmcgYWVuZGVybiB1bmQgZGFzIGphIHZpYSBSZWZlcmVueiBiZWtvbW1lbiBoYWJlbi4KKyAgc2tpbGxzW2dpbGRlXT12YWx1ZTsKKyAgLy9TZXQoUF9ORVdTS0lMTFMsc2tpbGxzKTsKKworICByZXR1cm4odmFsdWUpOworfQorCisvLyBudXIgenVyIGludGVybmVuIFZlcndlbmR1bmcsIGVzIHdpcmQga2VpbmUgS29waWUgZGVzIFNraWxsbWFwcGluZ3MgZ2VtYWNodCEKK3ByaXZhdGUgbWFwcGluZyBpbnRlcm5hbF9xdWVyeV9uZXdza2lsbHMoc3RyaW5nIGdpbGRlKSB7CisgIG1hcHBpbmcgc2tpbGxzOworCisgIC8vIHJpY2h0aWdlIEdpbGRlIGFiZnJhZ2VuLgorICBpZiAoICFnaWxkZSAmJiAhKGdpbGRlPVF1ZXJ5UHJvcChQX0dVSUxEKSkgKQorICAgIGdpbGRlPSJBTlkiOworCisgIHNraWxscz1RdWVyeShQX05FV1NLSUxMUyk7CisKKyAgaWYgKCFtYXBwaW5ncChza2lsbHMpIHx8ICFtYXBwaW5ncChza2lsbHM9c2tpbGxzW2dpbGRlXSkgKQorICAgIHJldHVybiAoW10pOworCisgIHJldHVybihza2lsbHMpOworfQorCisvLyBFaWdlbnRsaWNoIHNvbGx0ZSBtYW4gZGVuIF9xdWVyeS1GdW5rdGlvbmVuIGtlaW5lIFBhcmFtZXRlciBnZWJlbi4uLgorc3RhdGljIHZhcmFyZ3MgbWFwcGluZyBfcXVlcnlfbmV3c2tpbGxzKHN0cmluZyBnaWxkZSkgeworCisgIC8vIHNvbnN0IEtvcGllIGRlcyBzcGVsbG1hcHBpbmdzIGxpZWZlcm4hIEtvc3RldCB6d2FyLCBhYmVyIHZlcmhpbmRlcnQKKyAgLy8gZWluaWdlIGFuZGVyZSBCdWdzIHVuZCB2ZXJzZWhlbnRsaWNoZSBBZW5kZXJ1bmdlbiBhbiBkZW4gU2tpbGxzIQorICByZXR1cm4oZGVlcF9jb3B5KGludGVybmFsX3F1ZXJ5X25ld3NraWxscyhnaWxkZSkpKTsKK30KKworLy8gRWlnZW50bGljaCBzb2xsdGUgbWFuIGRlbiBfc2V0LUZ1bmt0aW9uZW4ga2VpbmUgd2VpdGVyZW4gUGFyYW1ldGVyIGdlYmVuCitzdGF0aWMgdmFyYXJncyBtYXBwaW5nIF9zZXRfbmV3c2tpbGxzKG1hcHBpbmcgdmFsdWUsIHN0cmluZyBnaWxkZSkgeworCisgIC8vIHZhbHVlIGF1ZiBNYXBwaW5ncyBub3JtYWxpc2llcmVuLCBnZ2YuIEtvcGllcmVuCisgIGlmICggIW1hcHBpbmdwKHZhbHVlKSApCisgICAgICB2YWx1ZT0oW10pOworICBlbHNlCisgICAgICAvL3p1ciBTaWNoZXJoZWl0LCB3ZXIgd2Vpc3MsIHdhcyBkZXIgc2V0emVuZGUgbm9jaCBkYW1pdCBtYWNodC4uLgorICAgICAgdmFsdWU9ZGVlcF9jb3B5KHZhbHVlKTsKKworICAvLyB1bmQgc2V0emVuLi4uCisgIGludGVybmFsX3NldF9uZXdza2lsbHModmFsdWUsIGdpbGRlKTsKKworICAvLyB1bmQgbm9jaCBuZSBLb3BpZSB2b24gZGVtIExpZWZlcm4sIHdhcyB3aXIgZ2VzZXR6dCBoYWJlbiAoa2VpbmUgUmVmZXJlbnosCisgIC8vIHNvbnN0IGtvZW5udGUgZGVyIEF1ZnJ1ZmVuZGUgamEgbm9jaCBpbSBOYWNoaGluZWluIGFlbmRlcm4pLgorICByZXR1cm4oX3F1ZXJ5X25ld3NraWxscyhnaWxkZSkpOworfQorCitwcml2YXRlIG1hcHBpbmcgSW50ZXJuYWxRdWVyeVNraWxsKHN0cmluZyBzbmFtZSwgc3RyaW5nIGdpbGRlKSB7CisgIG1peGVkIHNraWxsLCBza2lsbHM7CisgIC8vIEluIGlzX2FueSB3aXJkIGdlc3BlaWNoZXJ0LCBvYiBlcyBlaW4gZ2lsZGVudW5hYmhhZW5naWVyIFNraWxsIGlzdCwKKyAgLy8gZnVlciBkaWUgaXNfZGVhY3RpdmF0ZV9za2lsbC1BYmZyYWdlLgorICBpbnQgaXNfYW55OworCisgIC8vIFNraWxscyBrb21wbGV0dCBhYmZyYWdlbiwga2VpbmUgc3Blei4gR2lsZGUKKyAgaWYgKCFtYXBwaW5ncChza2lsbHM9UXVlcnkoUF9ORVdTS0lMTFMsRl9WQUxVRSkpKQorICAgICAgcmV0dXJuIDA7CisKKyAgaWYgKHN0cmluZ3AoZ2lsZGUpICYmIHNpemVvZihnaWxkZSkpIHsKKyAgICAvL2Jlc3RpbW10ZSBHaWxkZSBhbmdlZ2ViZW4sIGd1dCwgZG9ydCBndWNrZW4uCisgICAgaWYgKG1hcHBpbmdwKHNraWxsc1tnaWxkZV0pKQorICAgICAgc2tpbGw9c2tpbGxzW2dpbGRlXVtzbmFtZV07IAorICB9CisgIGVsc2UgeworICAgIGdpbGRlPVF1ZXJ5UHJvcChQX0dVSUxEKTsgLy9yZWFsZSBHaWxkZSBob2xlbgorICAgIGlmIChnaWxkZSAmJiBtYXBwaW5ncChza2lsbHNbZ2lsZGVdKSAmJiAKKwkoc2tpbGw9c2tpbGxzW2dpbGRlXVtzbmFtZV0pKSB7CisgICAgICAvLyBnaWJ0IGVzIGRlbiBTcGVsbCBpbiBkZXIgR2lsZGUgZGVzIFNwaWVsZXJzPworICAgICAgLy8gZGFubiBoaWVyIG5peCBtYWNoZW4uLi4KKyAgICB9CisgICAgZWxzZSBpZiAobWFwcGluZ3Aoc2tpbGxzWyJBTlkiXSkpIHsKKyAgICAgLy8gWnVtIFNjaGx1c3M6IEdpYnQgZXMgZGVuIFNraWxsIHZpZWxsZWljaHQgR2lsZGVudW5hYmhhZW5naWc/CisgICAgICBza2lsbD1za2lsbHNbIkFOWSJdW3NuYW1lXTsKKyAgICAgIC8vIHdlbm4gbWFuIGhpZXIgcmVpbmtvbW10LCBkYW5uIHNwYWV0ZXIgbWl0IGlzX2RlYWN0aXZhdGVkX3NraWxsKCkgCisgICAgICAvLyBwcnVlZmVuIQorICAgICAgaXNfYW55PTE7CisgICAgfQorICB9CisKKyAgLy8gd2VubiBrZWluIFNraWxsIGdlZnVuZGVuLCBtaXQgMCBkaXJla3QgcmF1cworICBpZiAoIXNraWxsKSByZXR1cm4gMDsKKworICAvLyBCZWkgZ2lsZGVudW5hYmhhZW5naWdlbiBhdWNoIGltIFNraWxsbWFwcGluZyB2ZXJtZXJrZW4KKyAgaWYgKCBpc19hbnkgKSB7CQorICAgICAgc2tpbGwrPShbU0lfR1VJTEQ6IkFOWSJdKTsJCisgICAgICAvLyBJc3QgZXIgdmllbGxlaWNodCBpbiBkZXIgR2lsZGUgZGVzIFNwaWVsZXJzIGRlYWt0aXZpZXJ0PyAJCQorICAgICAgLy8gRGllcyBrYW5uIG51ciBkZXIgRmFsbCBzZWluLCB3ZW5uIGVzIGtlaW4gR2lsZGVuc2tpbGwgaXN0LgkJCisgICAgICBpZiAoaXNfZGVhY3RpdmF0ZWRfc2tpbGwoc25hbWUsZ2lsZGUpKSB7CQkgICAgCisJICByZXR1cm4gMDsJCQorICAgICAgfQorICB9CisKKyAgcmV0dXJuKHNraWxsKTsKK30KKworcHVibGljIHZhcmFyZ3MgbWFwcGluZyBRdWVyeVNraWxsKHN0cmluZyBzbmFtZSwgc3RyaW5nIGdpbGRlKSB7CisgCisgICAgaWYgKCFzdHJpbmdwKHNuYW1lKSB8fCAhc2l6ZW9mKHNuYW1lKSkKKwlyZXR1cm4gMDsKKworICAgIC8vS29waWUgenVydWVja2xpZWZlcm4KKyAgICByZXR1cm4oZGVlcF9jb3B5KEludGVybmFsUXVlcnlTa2lsbChzbmFtZSxnaWxkZSkpKTsKK30KKworI2RlZmluZSBTTVVMKHgseSkgKCh4PDAgJiYgeTwwKT8oLTEqeCp5KTooeCp5KSkKK3B1YmxpYyB2YXJhcmdzIGludCBRdWVyeVNraWxsQWJpbGl0eShzdHJpbmcgc25hbWUsIHN0cmluZyBnaWxkZSkKK3sgbWFwcGluZyBza2lsbDsKKyAgc3RyaW5nIHNraWxsMjsKKworICBpZiAoICEoc2tpbGw9SW50ZXJuYWxRdWVyeVNraWxsKHNuYW1lLCBnaWxkZSkpICkKKyAgICByZXR1cm4gMDsKKworICBpbnQgdmFsPXNraWxsW1NJX1NLSUxMQUJJTElUWV07CisKKyAgaWYgKHNraWxsMj1za2lsbFtTSV9JTkhFUklUXSkKKyAgeworICAgIGludCB2YWwyOworICAgIHZhbDI9UXVlcnlTa2lsbEFiaWxpdHkoc2tpbGwyKTsKKyAgICB2YWw9KHZhbCpNQVhfQUJJTElUWStTTVVMKHZhbCx2YWwyKSkvKDIqTUFYX0FCSUxJVFkpOworICB9CisKKyAgcmV0dXJuIHZhbDsKK30KKworcHJvdGVjdGVkIHZhcmFyZ3MgbWl4ZWQgTGltaXRBYmlsaXR5KG1hcHBpbmcgc2luZm8sIGludCBkaWZmKQoreyBtaXhlZCBhYmlsOworICBpbnQgbWF4LG9sZCxkMjsKKworICBhYmlsPXNpbmZvW1NJX1NLSUxMQUJJTElUWV07CisKKyAgaWYgKCAhaW50cChhYmlsKSApCisgICAgcmV0dXJuIHNpbmZvOworICBvbGQ9YWJpbDsKKworICAvLyBCZWltIFNwaWVsZXIgZWluZ2V0cmFnZW5lIFNjaHdpZXJpZ2tlaXQgZ2lsdCB2b3IgYW5nZWdlYmVuZXIuCisgIGlmICggKGQyPXNpbmZvW1NJX0RJRkZJQ1VMVFldKSApCisgICAgZGlmZj1kMjsKKworICAvLyBkaWZmIDwtMTAwIHNvbGwgbmljaHQgaGVtbWVuIHVuZCBtYWNodCBrZWluZW4gU2lubgorICBkaWZmPShkaWZmPCgtMTAwKSk/KC0xMDApOmRpZmY7CisgIAorICBtYXg9TUFYX0FCSUxJVFktKGRpZmYrMTAwKSooMzUtUXVlcnlQcm9wKFBfTEVWRUwpKTsKKworLy8gZGlmZnxsdmwgMTp8ICAgMzp8CTc6fCAxMDp8IDEzOnwgMTY6fCAxOTp8IDIyOnwgMjU6fCAyODp8IDMxOnwgMzQ6fAorLy8gLS0tLSstLS0tLS0rLS0tLS0rLS0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rCisvLyAgLTUwfCAgIDgzJXwgIDg0JXwgIDg2JXwgODclfCA4OSV8IDkwJXwgOTIlfCA5MyV8IDk1JXwgOTYlfCA5OCV8IDk5JXwKKy8vICAtMTB8ICAgNjklfCAgNzIlfCAgNzQlfCA3NyV8IDgwJXwgODIlfCA4NSV8IDg4JXwgOTElfCA5MyV8IDk2JXwgOTklfAorLy8gICAgMHwgICA2NiV8ICA2OSV8ICA3MiV8IDc1JXwgNzglfCA4MSV8IDg0JXwgODclfCA5MCV8IDkzJXwgOTYlfCA5OSV8CisvLyAgIDEwfCAgIDYyJXwgIDY1JXwgIDY5JXwgNzIlfCA3NSV8IDc5JXwgODIlfCA4NSV8IDg5JXwgOTIlfCA5NSV8IDk4JXwKKy8vICAgMjB8ICAgNTklfCAgNjIlfCAgNjYlfCA3MCV8IDczJXwgNzclfCA4MCV8IDg0JXwgODglfCA5MSV8IDk1JXwgOTglfAorLy8gICAzMHwgICA1NSV8ICA1OSV8ICA2MyV8IDY3JXwgNzElfCA3NSV8IDc5JXwgODMlfCA4NyV8IDkwJXwgOTQlfCA5OCV8CisvLyAgIDQwfCAgIDUyJXwgIDU2JXwgIDYwJXwgNjUlfCA2OSV8IDczJXwgNzclfCA4MSV8IDg2JXwgOTAlfCA5NCV8IDk4JXwKKy8vICAgNTB8ICAgNDklfCAgNTMlfCAgNTglfCA2MiV8IDY3JXwgNzElfCA3NiV8IDgwJXwgODUlfCA4OSV8IDk0JXwgOTglfAorLy8gIDEwMHwgICAzMiV8ICAzOCV8ICA0NCV8IDUwJXwgNTYlfCA2MiV8IDY4JXwgNzQlfCA4MCV8IDg2JXwgOTIlfCA5OCV8CisvLyAgMTUwfCAgIDE1JXwgIDIyJXwgIDMwJXwgMzclfCA0NSV8IDUyJXwgNjAlfCA2NyV8IDc1JXwgODIlfCA5MCV8IDk3JXwKKy8vICAyMDB8ICAgLTIlfCAgIDclfCAgMTYlfCAyNSV8IDM0JXwgNDMlfCA1MiV8IDYxJXwgNzAlfCA3OSV8IDg4JXwgOTclfAorLy8gIDI1MHwgIC0xOSV8ICAtOCV8CTIlfCAxMiV8IDIzJXwgMzMlfCA0NCV8IDU0JXwgNjUlfCA3NSV8IDg2JXwgOTYlfAorLy8gIDMwMHwgIC0zNiV8IC0yNCV8IC0xMiV8ICAwJXwgMTIlfCAyNCV8IDM2JXwgNDglfCA2MCV8IDcyJXwgODQlfCA5NiV8CisvLyAgNDAwfCAgLTcwJXwgLTU1JXwgLTQwJXwtMjUlfC0xMCV8ICA1JXwgMjAlfCAzNSV8IDUwJXwgNjUlfCA4MCV8IDk1JXwKKy8vICA1MDB8IC0xMDQlfCAtODYlfCAtNjglfC01MCV8LTMyJXwtMTQlfCAgNCV8IDIyJXwgNDAlfCA1OCV8IDc2JXwgOTQlfAorLy8gIDYwMHwgLTEzOCV8LTExNyV8IC05NiV8LTc1JXwtNTQlfC0zMyV8LTEyJXwgIDklfCAzMCV8IDUxJXwgNzIlfCA5MyV8CisKKyAgaWYgKCBhYmlsPm1heCApCisgICAgYWJpbD1tYXg7CisgIGlmICggYWJpbD5NQVhfQUJJTElUWQorICAgICkgYWJpbD1NQVhfQUJJTElUWTsKKyAgZWxzZSBpZiAoIGFiaWw8LU1BWF9BQklMSVRZICkKKyAgICBhYmlsPS1NQVhfQUJJTElUWTsKKworICBpZiAoIG9sZCAmJiAhYWJpbCApCisgICAgYWJpbD0xOworICAvLyBGYWVoaWdrZWl0ZW4gc29sbGVuIG5pY2h0IGR1cmNoIGRpZSBCZWdyZW56dW5nIHZlcnNjaHdpbmRlbgorCisgIHNpbmZvW1NJX1NLSUxMQUJJTElUWV09YWJpbDsKKworICByZXR1cm4gc2luZm87Cit9CisKK3B1YmxpYyB2YXJhcmdzIHZvaWQgTW9kaWZ5U2tpbGwoc3RyaW5nIHNuYW1lLCBtaXhlZCB2YWwsIGludCBkaWZmLCBzdHJpbmcgZ2lsZGUpCit7IAorICBtYXBwaW5nIHNraWxsczsKKyAgbWl4ZWQgc2tpbGw7CisKKyAgaWYgKCAhc3RyaW5ncChzbmFtZSkgfHwgIXNpemVvZihzbmFtZSkgKQorICAgIHJldHVybjsKKworICAvLyBpbnRlcm5hbF9xdWVyeV9uZXdza2lsbHMoKSBtYWNodCBrZWluZSBLb3BpZQorICBza2lsbHM9aW50ZXJuYWxfcXVlcnlfbmV3c2tpbGxzKGdpbGRlKTsKKworICAvLyBTa2lsbCBlcm1pdHRlbG4sIHdlbm4gbmljaHQgZXhpc3RpZXJ0LCB3aXJkIGVyIGFuZ2VsZWd0LgorICBpZiAoIXNraWxsPXNraWxsc1tzbmFtZV0pIHsKKyAgICAgIHNraWxsPShbXSk7IAorICB9CisgIAorICAvLyBadXIgU2ljaGVyaGVpdCBtYWwgZGFzIE1hcHBpbmcga29waWVyZW4sIHdlciB3ZWlzcywgd2FzIGRlcgkKKyAgLy8gQXVmcnVmZW5kZSBkaWVzZXIgRnVua3Rpb24gc2VsYmVyIHNwYWV0ZXIgZGFtaXQgbm9jaCBtYWNodC4KKyAgLy8gaXN0IG9rLCB3ZW5uIHZhbCBrZWluIE1hcHBpbmcgaXN0LCBkYW5uIG1hY2h0IGRlZXBfY29weSBuaXguCisgIHZhbD1kZWVwX2NvcHkodmFsKTsKKworICAvLyBTa2lsbCB1bmQgdmFsIHZlcmVpbmlnZW4KKyAgaWYgKCBtYXBwaW5ncCh2YWwpICkKKyAgICBza2lsbCs9dmFsOworICBlbHNlIGlmIChpbnRwKHZhbCkpCisgICAgc2tpbGxbU0lfU0tJTExBQklMSVRZXT12YWw7CisgIGVsc2UKKyAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJCYWQgYXJnIDIgdG8gTW9kaWZ5U2tpbGwoKTogZXhwZWN0ZWQgJ2ludCcsICIKKyAgICAgICAgICAiZ290ICUuMTBPLlxuIix2YWwpKTsKKworICAvLyBMZXJuZW4gZW50c3ByZWNoZW5kIFNJX0RJRkZJQ1VMVFkgYmVncmVuemVuLgorICBpZihkaWZmICYmICFtZW1iZXIoc2tpbGwsU0lfRElGRklDVUxUWSkpCisgICAgc2tpbGxbU0lfRElGRklDVUxUWV09ZGlmZjsKKyAgc2tpbGw9TGltaXRBYmlsaXR5KHNraWxsLGRpZmYgfHwgc2tpbGxbU0lfRElGRklDVUxUWV0pOworICAKKyAgLy8gc2NobGllc3NsaWNoIGltIFNraWxsbWFwcGluZyB2ZXJtZXJrZW4uIEltIE5vcm1hbGZhbGwgaXN0IGRlciBTa2lsbCBqZXR6dAorICAvLyBzY2hvbiBnZWFlbmRlcnQsIG5pY2h0IGVyc3QgbmFjaCBkZW0gaW50ZXJuYWxfc2V0X25ld3NraWxscygpLgorICBza2lsbHNbc25hbWVdPXNraWxsOworCisgIC8vIGV4cGxpeml0ZXMgQWJzcGVpY2hlcm4gZmFzdCB1ZWJlcmZsdWVzc2lnLCB3ZWlsIHdpciBvYmVuIGVpbmUgUmVmZXJlbnoKKyAgLy8gYXVmIGRhcyBTa2lsbG1hcHBpbmcgZ2VrcmllZ3QgaGFiZW4uLi4KKyAgLy8gQWJlciBlcyBrb2VubnRlIHNlaW4sIGRhc3MgZGllcyBkZXIgZXJzdGUgU2tpbGwgZnVlciBkaWVzZSBHaWxkZSBpc3QsCisgIC8vIGRhbm4gaXN0IGVzIG5vZXRpZy4gWnVtIGFuZGVyZW4gd2lyZCBpbnRlcm5hbF9zZXRfbmV3c2tpbGxzKCkgbm9jaG1hbAorICAvLyBnZWxvZ2d0LgorICBpbnRlcm5hbF9zZXRfbmV3c2tpbGxzKHNraWxscyxnaWxkZSk7Cit9CisKK3B1YmxpYyB2YXJhcmdzIHZvaWQgTGVhcm5Ta2lsbChzdHJpbmcgc25hbWUsIGludCBhZGQsIGludCBkaWZmKQoreyBtYXBwaW5nIHNraWxsOworICBzdHJpbmcgc2tpbGwyLGdpbGRlOworICBpbnQgdmFsOworCisgIC8vIFNwaWVsZXIgc29sbGVuIG51ciBsZXJuZW4sIHdlbm4gc2llIGludGVyYWN0aXZlIHNpbmQuIERhcyBzb2xsCisgIC8vIG5hdHVlcmxpY2ggbnVyIGZ1ZXIgU3BpZWxlciBnZWx0ZW4uCisgIGlmIChxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHRoaXNfb2JqZWN0KCkpICYmICFpbnRlcmFjdGl2ZSgpKQorCSAgcmV0dXJuOworCisgIGlmICggYWRkPk1BWF9TS0lMTEVBUk4gKQorICAgIGFkZD1NQVhfU0tJTExFQVJOOworICBlbHNlIGlmICggYWRkPDEgKQorICAgIGFkZD0xOworCisgIC8vIFNraWxsbWFwcGluZyBlcm1pdHRlbG4gKGhpZXIga29tbXQga2VpbmUgS29waWUgenVydWVjaykKKyAgc2tpbGw9SW50ZXJuYWxRdWVyeVNraWxsKHNuYW1lLCAwKTsKKyAgLy8gd2VubiBrZWluIFNraWxsLCBkYW5uIEFiYnJ1Y2gKKyAgaWYgKCFza2lsbCkgcmV0dXJuOworCisgIHZhbD1za2lsbFtTSV9TS0lMTEFCSUxJVFldOworICBnaWxkZT1za2lsbFtTSV9HVUlMRF07CisgCisgIHZhbCs9YWRkOworCisgIE1vZGlmeVNraWxsKHNuYW1lLHZhbCxkaWZmLGdpbGRlKTsKKyAgaWYgKCBza2lsbDI9c2tpbGxbU0lfSU5IRVJJVF0gKQorICAgIExlYXJuU2tpbGwoc2tpbGwyLGFkZC8zLGRpZmYpOworfQorCitwdWJsaWMgdmFyYXJncyBpbnQgVXNlU3BlbGwoc3RyaW5nIHN0ciwgc3RyaW5nIHNwZWxsKQoreyBzdHJpbmcgZ2lsZGUsc2Jvb2s7CisgIG1hcHBpbmcgc2luZm87CisgIGNsb3N1cmUgY2w7CisgIAorICBpZiAoICFzcGVsbCAmJiAhKHNwZWxsPXF1ZXJ5X3ZlcmIoKSkgKQorICAgIHJldHVybiAwOworCisgIHNwZWxsPWxvd2VyX2Nhc2Uoc3BlbGwpOworCisgIC8vIFF1ZXJ5U2tpbGwoKSBsaWVmZXJ0IGVpbmUgS29waWUgZGVzIFNraWxsbWFwcGluZ3MuCisgIC8vIHdlbm4gc2tpbGwgdW5iZWthbm50IG9kZXIgQWJpbGl0eSA8PSAwLCBpc3QgZGVyIFNwZWxsIG5pY2h0IG51dHpiYXIuCisgIGlmICggIShzaW5mbz1RdWVyeVNraWxsKHNwZWxsLDApKQorICAgICAgICB8fCBzaW5mb1tTSV9TS0lMTEFCSUxJVFldIDw9IDAgKQorICAgIHJldHVybiAwOworCisgIHNpbmZvW1NJX1NLSUxMQVJHXT1zdHI7IC8vIEFyZ3VtZW50IGVpbnRyYWdlbgorCisgIGlmICggIWNsb3N1cmVwKGNsPXNpbmZvW1NJX0NMT1NVUkVdKSApCisgIHsKKyAgICAvLyBXZW5uIGVpbiBTcGVsbGJvb2sgYW5nZWdlYmVuIGlzdCB3aXJkIGRlciBTcGVsbCBkaXJla3QgYXVzZ2VmdWVocnQKKyAgICBpZiAoIHN0cmluZ3Aoc2Jvb2s9c2luZm9bU0lfU1BFTExCT09LXSkgKQorICAgICAgY2w9c3ltYm9sX2Z1bmN0aW9uKCJVc2VTcGVsbCIsU1BFTExCT09LX0RJUitzYm9vayk7CisKKyAgICAvLyBXZW5uIGRlciBTcGllbGVyIGluIGVpbmVyIEdpbGRlIGlzdCwgc28gd2Vpc3MgZGllc2UsIGluIHdlbGNoZW0KKyAgICAvLyBTcGVsbGJvb2sgZGVyIFNwZWxsIHp1IGZpbmRlbiBpc3QuLi4KKyAgICBlbHNlIGlmICggKGdpbGRlPVF1ZXJ5UHJvcChQX0dVSUxEKSkgJiYgCisgICAgICAoIGZpbmRfb2JqZWN0KEdVSUxEX0RJUitnaWxkZSkgfHwgZmlsZV9zaXplKEdVSUxEX0RJUitnaWxkZSsiLmMiKT4tMSkpCisgICAgICBjbD1zeW1ib2xfZnVuY3Rpb24oIlVzZVNwZWxsIixHVUlMRF9ESVIrZ2lsZGUpOworICAgIGVsc2UKKyAgICAgIGNsPWZ1bmN0aW9uIGludCAoKSB7cmV0dXJuIDA7fTsKKworICAgIHNpbmZvW1NJX0NMT1NVUkVdPWNsOworICAgIHZhbGlkX3NldHNraWxsc19vdmVycmlkZT0xOworICAgIE1vZGlmeVNraWxsKHNwZWxsLChbU0lfQ0xPU1VSRTpjbF0pLDAsc2luZm9bU0lfR1VJTERdKTsKKyAgICB2YWxpZF9zZXRza2lsbHNfb3ZlcnJpZGU9MDsKKyAgfQorICByZXR1cm4gZnVuY2FsbChjbCx0aGlzX29iamVjdCgpLHNwZWxsLHNpbmZvKTsKK30KKworcHVibGljIHZhcmFyZ3MgbWl4ZWQgVXNlU2tpbGwoc3RyaW5nIHNraWxsLCBtYXBwaW5nIGFyZ3MpCit7IG1hcHBpbmcgc2luZm87CisgIHN0cmluZyBnaWxkZSwgZnVuYyxza2lsbDI7CisgIG1peGVkIHJlczsKKyAgY2xvc3VyZSBjbDsKKyAgCisgIGlmICggIXNraWxsIHx8CisgICAgICAgUXVlcnlQcm9wKFBfR0hPU1QpKQorICAgIHJldHVybiAwOworCisgIHNraWxsPWNhcGl0YWxpemUoc2tpbGwpOworICAvLyBRdWVyeVNraWxsKCkgbGllZmVydCBlaW5lIEtvcGllIGRlcyBTa2lsbG1hcHBpbmdzCisgIGlmICggIShzaW5mbz1RdWVyeVNraWxsKHNraWxsLDApKSApCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKGFyZ3MpCisgICAgc2luZm8rPWFyZ3M7CisKKyAgaWYgKCAhY2xvc3VyZXAoY2w9c2luZm9bU0lfQ0xPU1VSRV0pICkKKyAgeworICAgIGlmICggIShmdW5jPXNpbmZvW1NJX1NLSUxMRlVOQ10pICAgIC8vIEtlaW5lIEZ1bmt0aW9uIGFuZ2VnZWJlbj8KKyAgICAgICAgfHwgIShnaWxkZT1RdWVyeVByb3AoUF9HVUlMRCkpKSAvLyBLZWluZSBHaWxkZSBhbmdlZ2ViZW4/CisgICAgeworICAgICAgLy8gRGFubiBTdGFuZGFyZC1GdW5rdGlvbiBuZWhtZW4sIHdlbm4gZXMgZGllIG5pY2h0IGdpYnQsIGRlbgorICAgICAgLy8gQWJpbGl0eS1XZXJ0IHp1cnVlY2tsaWVmZXJuLgorICAgICAgaWYgKCFjbG9zdXJlcChjbCA9IHN5bWJvbF9mdW5jdGlvbigiU3RkU2tpbGxfIitza2lsbCx0aGlzX29iamVjdCgpKSkpCisgICAgICAgIGNsPWZ1bmN0aW9uIGludCAob2JqZWN0IG9iLCBzdHJpbmcgc25hbWUpCisgICAgICAgICAgICAge3JldHVybiBRdWVyeVNraWxsQWJpbGl0eShzbmFtZSk7fSA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvLyBTb25zdCBkaWVzZSBGdW5rdGlvbiBpbSBHaWxkZW5vYmpla3QgYXVmcnVmZW4KKyAgICAgIGNsPXN5bWJvbF9mdW5jdGlvbihmdW5jLEdVSUxEX0RJUitnaWxkZSk7CisgICAgfQorCisgICAgc2luZm9bU0lfQ0xPU1VSRV09Y2w7CisgICAgdmFsaWRfc2V0c2tpbGxzX292ZXJyaWRlPTE7CisgICAgTW9kaWZ5U2tpbGwoc2tpbGwsKFtTSV9DTE9TVVJFOmNsXSksMCxzaW5mb1tTSV9HVUlMRF0pOworICAgIHZhbGlkX3NldHNraWxsc19vdmVycmlkZT0wOworICB9CisKKyAgcmVzPWZ1bmNhbGwoY2wsdGhpc19vYmplY3QoKSxza2lsbCxzaW5mbyk7CisgIGlmICggKHNraWxsMj1zaW5mb1tTSV9JTkhFUklUXSkgJiYgbWFwcGluZ3AocmVzKSApCisgICAgcmVzPVVzZVNraWxsKHNraWxsMixyZXMpOyAvLyBGdWVyIFNraWxscywgZGllIHZvbiBhbmRlcmVuIGFiaGFlbmdlbgorCisgIHJldHVybiByZXM7Cit9CisKKy8vICoqKioqKioqKioqKioqIFNwZWxsZmF0aWd1ZXMgKioqKioqKioqKioqKioqCisKKy8qICBQcnVlZnQgZGllIFNwZWxsZmF0aWd1ZSBmdWVyIFNwcnVjaChncnVwcGUpIDxrZXk+LgorICogIDxrZXk+IGRhcmYgMCBzZWluIChnbG9iYWxlIFNwcnVjaHNwZXJyZSkuCisgKiAgTGllZmVydCAwLCB3ZW5uIGtlaW5lIFNwZXJyZSB1bmQgZGllIEFibGF1ZnplaXQsIHdlbm4gZWluZSBTcGVycmUgbm9jaAorICogIGd1ZWx0aWcuIGlzdC4KKyAqLworcHVibGljIHZhcmFyZ3MgaW50IENoZWNrU3BlbGxGYXRpZ3VlKHN0cmluZyBrZXkpIHsKKyAgLy8ga2V5PT0wIGlzIHRoZSAoZGVmYXVsdCkgZ2xvYmFsIHNwZWxsZmF0aWd1ZS4KKyAgaWYgKHNwZWxsX2ZhdGlndWVzW2tleV0gPiB0aW1lKCkpCisgICAgcmV0dXJuIHNwZWxsX2ZhdGlndWVzW2tleV07IC8vIEFibGF1ZnplaXQgenVydWVja2dlYmVuLgorCisgIHJldHVybiAwOyAvLyBvaywga2VpbmUgU3BlcnJlLgorfQorCisvKiogU3BlaWNoZXJ0IGVpbmUgU3BlbGxmYXRpZ3VlIHZvbiA8ZHVyYXRpb24+IFNla3VuZGVuIGZ1ZXIgPGtleT4uCisgKiA8a2V5PiBkYXJmIDAgc2VpbiB1bmQgYmV6ZWljaG5ldCBkYXMgZ2xvYmFsZSBTcGVsbGZhdGlndWUuCisgKiBSdWVja2dhYmV3ZXJ0OiBBYmxhdWZ6ZWl0IGRlciBnZXNldHp0ZW4gU3BlcnJlCisgICAgICAgICAgICAgICAgICAtMSwgd2VubiBub2NoIGVpbmUgbmljaHQtYWJnZWxhdWZlbmUgU3BlcnJlIGF1ZiBkZW0gPGtleT4gbGFnLgorICAgICAgICAgICAgICAgICAgMCwgd2VubiBkdXJhdGlvbiAwIGlzdC4KKyAqLworcHVibGljIHZhcmFyZ3MgaW50IFNldFNwZWxsRmF0aWd1ZShpbnQgZHVyYXRpb24sIHN0cmluZyBrZXkpIHsKKyAgLy8gYWt0dWVsbGUgU3BlcnJlIGFiZ2VsYXVmZW4/CisgIGlmIChDaGVja1NwZWxsRmF0aWd1ZShrZXkpKQorICAgIHJldHVybiAtMTsgLy8gYWx0ZSBTcGVycmUgbm9jaCBha3Rpdi4KKworICBkdXJhdGlvbiArPSB0aW1lKCk7CisgIC8vIDAgaXMgT0sgZm9yIDxrZXk+LCBpdCBpcyB0aGUga2V5IGZvciBnbG9iYWwgc3BlbGwgZmF0aWd1ZXMKKyAgc3BlbGxfZmF0aWd1ZXNba2V5XSA9IGR1cmF0aW9uOworICByZXR1cm4gZHVyYXRpb247Cit9CisKKy8qICBQcnVlZnQgZGllIFNwZWxsZmF0aWd1ZSBmdWVyIFNwcnVjaChncnVwcGUpIDxrZXk+LgorICogIDxrZXk+IGRhcmYgZnVlciBkaWVzZSBGdW5rdGlvbiAwIChnbG9iYWxlIFNwcnVjaHNwZXJyZSkgc2VpbiwgYWJlciBtYW4KKyAqICBkYXJmIGRhcyBBcmd1bWVudCBuaWNodCB3ZWdsYXNzZW4sIGRhbWl0IG5pY2h0IGVpbiB2ZXJwZWlsdGVyIE1hZ2llcgorICogIHZlcnNlaGVudGxpY2ggZGllIGdsb2JhbGUgU3BydWNoc3BlcnJlIG51bGx0LgorICovCitwdWJsaWMgdm9pZCBEZWxldGVTcGVsbEZhdGlndWUoc3RyaW5nIGtleSkgeworICAvLyBrZXk9PTAgaXMgdGhlIChkZWZhdWx0KSBnbG9iYWwgc3BlbGxmYXRpZ3VlLgorICBtX2RlbGV0ZShzcGVsbF9mYXRpZ3Vlcywga2V5KTsKK30KKworLyoqIExvZXNjaHQgYWJnZWxhdWZlbmUgS2V5cyBhdXMgZGVtIHNwZWxsX2ZhdGlndWUgbWFwcGluZy4KKyAqLworcHJpdmF0ZSB2b2lkIGV4cGlyZV9zcGVsbF9mYXRpZ3VlcygpIHsKKyAgZm9yZWFjaChzdHJpbmcga2V5LCBpbnQgZW5kdGltZTogc3BlbGxfZmF0aWd1ZXMpIHsKKyAgICBpZiAoZW5kdGltZSA8PSB0aW1lKCkpCisgICAgICBtX2RlbGV0ZShzcGVsbF9mYXRpZ3Vlcywga2V5KTsKKyAgfQorfQorCisvKiogU2V0bWV0aG9kZSBmdWVyIFBfTkVYVF9TUEVMTF9USU1FLgorICAqLworc3RhdGljIGludCBfc2V0X25leHRfc3BlbGwoaW50IGZhdGlndWUpIHsKKyAgcmV0dXJuIFNldFNwZWxsRmF0aWd1ZShmYXRpZ3VlIC0gdGltZSgpKTsKK30KKy8qKiBRdWVyeW1ldGhvZGUgZnVlciBQX05FWFRfU1BFTExfVElNRS4KKyAgKi8KK3N0YXRpYyBpbnQgX3F1ZXJ5X25leHRfc3BlbGwoKSB7CisgIHJldHVybiBDaGVja1NwZWxsRmF0aWd1ZSgpOworfQorCmRpZmYgLS1naXQgYS9zdGQvbGl2aW5nL3N0ZF9za2lsbHMuYyBiL3N0ZC9saXZpbmcvc3RkX3NraWxscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMzJlZmMKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvbGl2aW5nL3N0ZF9za2lsbHMuYwpAQCAtMCwwICsxLDEwNCBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGxpdmluZy9zdGRfc2tpbGxzLmMgLS0gU3RhbmRhcmRmYWVoaWdrZWl0ZW4KKy8vCisvLyAkSWQ6IHN0ZF9za2lsbHMuYyA2NjczIDIwMDgtMDEtMDUgMjA6NTc6NDNaIFplc3N0cmEgJAorI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPGxpdmluZy9za2lsbHMuaD4KKyNpbmNsdWRlIDxsaXZpbmcvc2tpbGxfYXR0cmlidXRlcy5oPgorI2luY2x1ZGUgPHRoaW5nL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxhdHRyaWJ1dGVzLmg+CisjdW5kZWYgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG5ld19za2lsbHMuaD4KKworI2RlZmluZSBTSUcoeCkgKHg/KHg+MD8xOi0xKTowKQorCitwcm90ZWN0ZWQgaW50IFN0ZFNraWxsX05pZ2h0dmlzaW9uKG9iamVjdCBtZSwgc3RyaW5nIHNuYW1lLCBtaXhlZCBzaW5mbykgeworICBpbnQgYWJpbCxsaWdodCxsbHQsZHQscmVzOworCisgIGlmICghc2luZm8gfHwgIWVudmlyb25tZW50KCkpIHJldHVybiAwOworICBpZiAoaW50cChzaW5mbykpIHNpbmZvPShbU0lfU0tJTExBQklMSVRZOnNpbmZvXSk7CisgIGlmICghbWFwcGluZ3Aoc2luZm8pKSByZXR1cm4gMDsKKyAgaWYgKChsaWdodD1RdWVyeVByb3AoUF9QTEFZRVJfTElHSFQpKT4wKSB7CisgICAgTW9kaWZ5U2tpbGwoc25hbWUsKFtTSV9MQVNUTElHSFQ6dGltZSgpXSkpOworICAgIHJldHVybiBsaWdodDsKKyAgfQorICBhYmlsPXNpbmZvW1NJX1NLSUxMQUJJTElUWV07CisgIGlmICghKGxsdD1zaW5mb1tTSV9MQVNUTElHSFRdKSkgeworICAgIE1vZGlmeVNraWxsKHNuYW1lLChbU0lfTEFTVExJR0hUOnRpbWUoKV0pKTsKKyAgICBkdD0wOworICB9IGVsc2UgeworICAgIGR0PXRpbWUoKS1sbHQ7CisgICAgaWYgKGR0PDApIGR0PTA7CisgICAgaWYgKGR0Pjg2NDAwKSBkdD04NjQwMDsKKyAgfQorCisgIHJlcz0oYWJpbCpkdCkvKDIwKk1BWF9BQklMSVRZKStsaWdodDsKKyAgaWYgKHJlczw9MCkgeworICAgIHJlcy0tOyAvLyBXZXJ0IG11c3MgIT0wIHNlaW4KKyAgICBpZiAocmVzPC1NQVhfQUJJTElUWSkgcmVzPS1NQVhfQUJJTElUWTsKKyAgfSBlbHNlIHsKKyAgICBpZiAocmVzPk1BWF9BQklMSVRZKSByZXM9TUFYX0FCSUxJVFk7CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKworcHJvdGVjdGVkIG1hcHBpbmcgU3RkU2tpbGxfQmloYW5kKG9iamVjdCBtZSwgc3RyaW5nIHNuYW1lLCBtYXBwaW5nIHNpbmZvKSB7CisgIGludCBhYmlsLHZhbDsKKworICAvLyBwcmludGYoIkJpaGFuZDogJU9cbiIsc2luZm8pOworICBpZiAoIXNpbmZvKSByZXR1cm4gMDsKKyAgYWJpbD1zaW5mb1tTSV9TS0lMTEFCSUxJVFldOworICB2YWw9KGFiaWwqKFF1ZXJ5QXR0cmlidXRlKEFfU1RSKSszMykpL01BWF9BQklMSVRZOworICB2YWw9KHZhbCpRdWVyeVNraWxsQXR0cmlidXRlKFNBX0RBTUFHRSkpLzEwMDsKKyAgc2luZm9bU0lfU0tJTExEQU1BR0VdKz12YWw7CisgIC8vICsgbWF4LiA1MworICByZXR1cm4gc2luZm87Cit9CisKK3Byb3RlY3RlZCBtYXBwaW5nIFN0ZFNraWxsX0ZpZ2h0X3N3b3JkKG9iamVjdCBtZSwgc3RyaW5nIHNuYW1lLCBtYXBwaW5nIHNpbmZvKSB7CisgIGludCBhYmlsLGFzaWcsdmFsOworCisgIGFiaWw9c2luZm9bU0lfU0tJTExBQklMSVRZXTthc2lnPVNJRyhhYmlsKTsKKyAgdmFsPShhYmlsKihRdWVyeUF0dHJpYnV0ZShBX1NUUikgKworICAgICAgICAgICAgIFF1ZXJ5QXR0cmlidXRlKEFfREVYKSphc2lnICsKKyAgICAgICAgICAgICAzMykpL01BWF9BQklMSVRZOworICB2YWw9KHZhbCpRdWVyeVNraWxsQXR0cmlidXRlKFNBX0RBTUFHRSkpLzEwMDsKKyAgc2luZm9bU0lfU0tJTExEQU1BR0VdKz12YWw7CisgIC8vICsgbWF4LiA3MworICByZXR1cm4gc2luZm87Cit9CisKK3Byb3RlY3RlZCBtYXBwaW5nIFN0ZFNraWxsX0ZpZ2h0X2hhbmRzKG9iamVjdCBtZSwgc3RyaW5nIHNuYW1lLCBtYXBwaW5nIHNpbmZvKSB7CisgIGludCBhYmlsLGFzaWcsdmFsOworCisgIGlmICghc2luZm8pIHJldHVybiAwOworICBhYmlsPXNpbmZvW1NJX1NLSUxMQUJJTElUWV07YXNpZz1TSUcoYWJpbCk7CisgIHZhbD0oYWJpbCooUXVlcnlBdHRyaWJ1dGUoQV9TVFIpICsKKyAgICAgICAgICAgICBRdWVyeUF0dHJpYnV0ZShBX0RFWCkqMyphc2lnICsKKyAgICAgICAgICAgICAxMDApKS9NQVhfQUJJTElUWTsKKyAgdmFsPSh2YWwqUXVlcnlTa2lsbEF0dHJpYnV0ZShTQV9EQU1BR0UpKS8xMDA7CisgIHNpbmZvW1NJX1NLSUxMREFNQUdFXSs9dmFsOworICAvLyArIG1heC4gMTgwCisgIHJldHVybiBzaW5mbzsKK30KKworcHJvdGVjdGVkIGludCBTdGRTa2lsbF9Cb296ZShvYmplY3QgbWUsIHN0cmluZyBzbmFtZSwgbWFwcGluZyBzaW5mbykgeworICBpbnQgYWJpbCx2YWw7CisKKyAgdmFsPTA7CisgIGlmICghc2luZm8gfHwgKHZhbD1zaW5mb1tTSV9TS0lMTEFSR10pPD0wKQorICAgIHJldHVybiB2YWw7CisgIGFiaWw9c2luZm9bU0lfU0tJTExBQklMSVRZXTsKKyAgdmFsLT0odmFsKmFiaWwpLyhNQVhfQUJJTElUWSsyNTAwKTsgLy8gQmlzIHp1IDgwJSBBYnp1ZyBiZWkgQWxrb2hvbGlrZXJuLgorICBpZiAodmFsPD0wKSB2YWw9MTsKKyAgcmV0dXJuIHZhbDsKK30KKwpkaWZmIC0tZ2l0IGEvc3RkL2xpdmluZy90ZWFtLmMgYi9zdGQvbGl2aW5nL3RlYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjMxZGI5Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkL2xpdmluZy90ZWFtLmMKQEAgLTAsMCArMSw2NTAgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBsaXZpbmcvdGVhbS5jCisvLworLy8gJElkOiB0ZWFtLmMgOTEzOCAyMDE1LTAyLTAzIDIxOjQ2OjU2WiBaZXNzdHJhICQKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx0aGluZy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGl2aW5nL2NvbWJhdC5oPgorI2luY2x1ZGUgPGNvbWJhdC5oPgorI2luY2x1ZGUgPGxpdmluZy90ZWFtLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8aG9vay5oPgorCisjZGVmaW5lIE1FIHRoaXNfb2JqZWN0KCkKKyNkZWZpbmUgVFAgdGhpc19wbGF5ZXIoKQorI2RlZmluZSBQTyBwcmV2aW91c19vYmplY3QoKQorI2RlZmluZSBFTlYgZW52aXJvbm1lbnQoKQorCitwcml2YXRlIG5vc2F2ZSBzdHJpbmcgdGVhbV9hdHRhY2tfY21kOworcHJpdmF0ZSBub3NhdmUgbWFwcGluZyB0ZWFtX2ZvbGxvd190b2RvOworcHJpdmF0ZSBub3NhdmUgaW50IHRlYW1fYXV0b2ZvbGxvdzsKK3ByaXZhdGUgbm9zYXZlIG9iamVjdCB0ZWFtbW92ZTsKKwordm9pZCBjcmVhdGUoKSB7CisgIFNldChQX1RFQU1fQVRUQUNLX0NNRCwtMSxGX1NFVF9NRVRIT0QpOworICBTZXQoUF9URUFNX0FUVEFDS19DTUQsUFJPVEVDVEVELEZfTU9ERV9BUyk7CisgIFNldChQX1RFQU1fQVVUT0ZPTExPVywtMSxGX1NFVF9NRVRIT0QpOworICBTZXQoUF9URUFNX0FVVE9GT0xMT1csUFJPVEVDVEVELEZfTU9ERV9BUyk7CisgIHRlYW1tb3ZlPTA7CisgIG9mZmVySG9vayhIX0hPT0tfVEVBTVJPV0NIQU5HRSwgMSk7Cit9CisKK3ZvaWQgYWRkX3RlYW1fY29tbWFuZHMoKSB7CisgIGFkZF9hY3Rpb24oInRlYW1jbWQiLCJncnVwcGUiKTsKKyAgYWRkX2FjdGlvbigidGVhbWNtZCIsImciKTsKKyAgYWRkX2FjdGlvbigidGVhbWNtZCIsInRlYW0iKTsKK30KKworc3RyaW5nIF9xdWVyeV90ZWFtX2F0dGFja19jbWQoKSB7CisgIHJldHVybiBTZXQoUF9URUFNX0FUVEFDS19DTUQsdGVhbV9hdHRhY2tfY21kKTsKK30KKworaW50IF9xdWVyeV90ZWFtX2F1dG9mb2xsb3coKSB7CisgIHJldHVybiBTZXQoUF9URUFNX0FVVE9GT0xMT1csdGVhbV9hdXRvZm9sbG93KTsKK30KKworcHJpdmF0ZSBpbnQgdGVhbV9oZWxwKCkgeworICAvLyBTeW50YXgtS29tcGF0aWJsaXRhZXQgKEF2YWxvbikgaXN0IGdhbnogbmV0dCA6LSkKKyAgd3JpdGUoIlwKKyhCZWZlaGxlIGRlcyBUZWFtbGVpdGVycyBzaW5kIG1pdCAqIGdla2VubnplaWNobmV0XG5cCitcblwKKyogdGVhbSBhbmdyaWZmXG5cCisgIHRlYW0gYW5ncmlmZnNiZWZlaGwgPGJlZmVobD5cblwKKyogdGVhbSBhdWZuYWhtZSA8bmFtZT5cblwKKyAgdGVhbSBhdXRvZltvbGdlXSA8ZWluL2F1cz5cblwKKyogdGVhbSBhdXRvaVtuZm9dIDxlaW4vYXVzPiBbK1tscF1dIFsrW2twXV0gW3NvZm9ydF1cblwKKyogdGVhbSBlbnRsYXNzZSA8bmFtZT5cblwKKyAgdGVhbSBmYXJiZW4gbHBfcm90IGxwX2dlbGIga3Bfcm90IGtwX2dlbGJcblwKKyAgdGVhbSBmbHVjaHRbcmVpaGVdIDxyZWloZT5cblwKKyAgdGVhbSBmb2xnZSA8bmFtZT5cblwKKyogdGVhbSBmb3JtYXRpb24gPG1pblstbWF4XT4gWzxtaW5bLW1heF0+IC4uLl1cblwKKyAgdGVhbSBoaWxmZXw/XG5cCisgIHRlYW0gW2luZm9dIFtzb3J0aWVydHxhbHBoYWJldGlzY2hdXG5cCisgIHRlYW0gW2thbXBmXXJlaWhlIDxyZWloZT5cblwKKyogdGVhbSBsZWl0ZXJbaW5dIDxuYW1lPlxuXAorICB0ZWFtIGxpc3RlXG5cCisqIHRlYW0gbmFtZSA8Z3J1cHBlbm5hbWU+XG5cCisgIHRlYW0gb3J0ZSBbYWxsZV1cblwKKyAgdGVhbSBydWZbZV1cblwKKyAgdGVhbSB1ZWJlcnNpY2h0XG5cCisgIHRlYW0gdmVybGFzc2VcbiIpOworICByZXR1cm4gMTsKK30KKworb2JqZWN0IElzVGVhbUxlYWRlcigpIHsKKyAgb2JqZWN0IHRlYW07CisKKyAgaWYgKCFvYmplY3RwKHRlYW09UXVlcnkoUF9URUFNKSkKKyAgICAgIHx8IHRlYW0hPVF1ZXJ5KFBfVEVBTV9MRUFERVIpCisgICAgICB8fCB0ZWFtLT5MZWFkZXIoKSE9TUUpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiB0ZWFtOworfQorCitvYmplY3QgKlRlYW1NZW1iZXJzKCkgeworICBvYmplY3QgdGVhbTsKKworICBpZiAoIW9iamVjdHAodGVhbT1RdWVyeShQX1RFQU0pKSkKKyAgICByZXR1cm4gKHtNRX0pOworICByZXR1cm4gdGVhbS0+TWVtYmVycygpOworfQorCitzdHJpbmcgVGVhbVByZWZpeCgpIHsKKyAgb2JqZWN0IHRlYW07CisKKyAgaWYgKCFvYmplY3RwKHRlYW09UXVlcnkoUF9URUFNKSkpCisgICAgcmV0dXJuICIiOworICByZXR1cm4gIlsiK3RlYW0tPk5hbWUoKSsiXSAiOworfQorCisKK3ByaXZhdGUgaW50IHRlYW1fYXVmbmFobWV3dW5zY2goc3RyaW5nIGFyZykgeworICBvYmplY3QgcGw7CisKKyAgaWYgKCghb2JqZWN0cChwbD1maW5kX3BsYXllcihhcmcpKSAmJiAhb2JqZWN0cChwbD1wcmVzZW50KGFyZyxFTlYpKSkKKyAgICAgIHx8IHBsLT5RdWVyeVByb3AoUF9JTlZJUykgfHwgZW52aXJvbm1lbnQocGwpIT1FTlYpCisgICAgcmV0dXJuIG5vdGlmeV9mYWlsKGNhcGl0YWxpemUoYXJnKSsiIG5pY2h0IGdlZnVuZGVuLlxuIiksMDsKKyAgaWYgKCFsaXZpbmcocGwpKQorICAgIHJldHVybiBub3RpZnlfZmFpbChwbC0+TmFtZShXRVIpKyIgaXN0IGV0d2FzIHp1IGluYWt0aXYuXG4iKSwwOworICBpZiAocGw9PU1FKQorICAgIHJldHVybiBub3RpZnlfZmFpbCgiRHUgYmlzdCBlaW5lIFBlcnNvbiB6dSB3ZW5pZyBmdWVyIGVpbiBUZWFtLlxuIiksMDsKKyAgU2V0UHJvcChQX1RFQU1fTkVXTUVNQkVSLHBsKTsKKyAgaWYgKHBsLT5Jc1RlYW1MZWFkZXIoKSkgeworICAgIHdyaXRlKCJEdSBiaXR0ZXN0ICIrcGwtPm5hbWUoV0VOKSsiIHVtIEF1Zm5haG1lIGlucyBUZWFtLlxuIik7CisgICAgdGVsbF9vYmplY3QocGwsVFAtPk5hbWUoV0VSKSsiIGJpdHRldCBEaWNoIHVtIEF1Zm5haG1lIGlucyBUZWFtLlxuIik7CisgIH0gZWxzZSB7CisgICAgd3JpdGUoIkR1IGJpdHRlc3QgIitwbC0+bmFtZShXRU4pKyIgdW0gR3J1ZW5kdW5nIGVpbmVzIFRlYW1zLlxuIik7CisgICAgdGVsbF9vYmplY3QocGwsVFAtPk5hbWUoV0VSKSsiIGJpdHRldCBEaWNoIHVtIEdydWVuZHVuZyBlaW5lcyBUZWFtcy5cbiIpOworICB9CisgIHJldHVybiAxOworfQorCitwcml2YXRlIGludCB0ZWFtX2F1Zm5haG1lKHN0cmluZyBhcmcpIHsKKyAgb2JqZWN0IHBsLHRlYW07CisgIGludCByZXM7CisKKyAgaWYgKCghb2JqZWN0cChwbD1maW5kX3BsYXllcihhcmcpKSAmJiAhb2JqZWN0cChwbD1wcmVzZW50KGFyZyxFTlYpKSkKKyAgICAgIHx8IHBsLT5RdWVyeVByb3AoUF9JTlZJUykgfHwgZW52aXJvbm1lbnQocGwpIT1FTlYpCisgICAgcmV0dXJuIG5vdGlmeV9mYWlsKGNhcGl0YWxpemUoYXJnKSsiIG5pY2h0IGdlZnVuZGVuLlxuIiksMDsKKyAgaWYgKHBsLT5RdWVyeVByb3AoUF9URUFNX05FV01FTUJFUikhPU1FKQorICAgIHJldHVybiBub3RpZnlfZmFpbChwbC0+TmFtZShXRVIpKyIgaGF0IERpY2ggbmljaHQgdW0gQXVmbmFobWUgZ2ViZXRlbi5cbiIpLAorICAgICAgMDsKKyAgaWYgKHBsPT1NRSkKKyAgICByZXR1cm4gbm90aWZ5X2ZhaWwoIkR1IGJpc3QgZWluZSBQZXJzb24genUgd2VuaWcgZnVlciBlaW4gVGVhbS5cbiIpLDA7CisgIGlmICghb2JqZWN0cCh0ZWFtPVF1ZXJ5UHJvcChQX1RFQU0pKSkKKyAgICB0ZWFtPWNsb25lX29iamVjdChURUFNX09CSkVDVCk7CisgIHJlcz10ZWFtLT5BZGRNZW1iZXIocGwpOworICBpZiAoIXNpemVvZih0ZWFtLT5NZW1iZXJzKCkpKQorICAgIHRlYW0tPnJlbW92ZSgpOworICByZXR1cm4gcmVzOworfQorCitvYmplY3QgSXNUZWFtTW92ZSgpIHsKKyAgaWYgKCFvYmplY3RwKHRlYW1tb3ZlKSB8fCAodGVhbW1vdmUhPVF1ZXJ5KFBfVEVBTSkpKQorICAgIHRlYW1tb3ZlPTA7CisgIHJldHVybiB0ZWFtbW92ZTsKK30KKworc3RhdGljIHZvaWQgRG9UZWFtQXR0YWNrKG9iamVjdCBlbnYsIG9iamVjdCBjYWxsYmFja3RvKSB7CisgIGlmIChlbnY9PUVOViAmJiBzdHJpbmdwKHRlYW1fYXR0YWNrX2NtZCkgJiYgIUlTX0xFQVJORVIoTUUpCisgICAgICAmJiAoaW50ZXJhY3RpdmUoTUUpIHx8ICFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKE1FKSkKKyAgICAgICYmIG9iamVjdHAoY2FsbGJhY2t0bykgJiYgY2FsbGJhY2t0bz09UXVlcnkoUF9URUFNKSkgeworICAgIHRlYW1tb3ZlPWNhbGxiYWNrdG87CisgICAgY29tbWFuZCh0ZWFtX2F0dGFja19jbWQpOworICB9CisgIGlmIChvYmplY3RwKGNhbGxiYWNrdG8pKQorICAgIGNhbGxiYWNrdG8tPlRlYW1BdHRhY2tFeGVjdXRlZF9DYWxsYmFjayh0ZWFtbW92ZT8xOjApOworICB0ZWFtbW92ZT0wOworfQorCitpbnQgQ2FsbFRlYW1BdHRhY2sob2JqZWN0IGVudikgeworICBpZiAoc3RyaW5ncCh0ZWFtX2F0dGFja19jbWQpCisgICAgICAmJiBmaW5kX2NhbGxfb3V0KCJEb1RlYW1BdHRhY2siKTwwCisgICAgICAmJiBQTworICAgICAgJiYgUE89PVF1ZXJ5KFBfVEVBTSkpCisgICAgcmV0dXJuIGNhbGxfb3V0KCJEb1RlYW1BdHRhY2siLDAsZW52LFBPKSwxOworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBEb1RlYW1Gb2xsb3coKSB7CisgIHN0cmluZyBjbWQ7CisKKyAgaWYgKCF0ZWFtX2F1dG9mb2xsb3cKKyAgICAgIHx8ICghaW50ZXJhY3RpdmUoTUUpICYmIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoTUUpKQorICAgICAgfHwgSVNfTEVBUk5FUihNRSkKKyAgICAgIHx8ICFtYXBwaW5ncCh0ZWFtX2ZvbGxvd190b2RvKSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKCFzdHJpbmdwKGNtZD10ZWFtX2ZvbGxvd190b2RvW0VOVl0pKQorICAgIHJldHVybiB0ZWFtX2ZvbGxvd190b2RvPTA7CisKKyAgZG8geworICAgIG1fZGVsZXRlKHRlYW1fZm9sbG93X3RvZG8sRU5WKTsKKyAgICB0ZWxsX29iamVjdChNRSxzcHJpbnRmKCJEdSBmb2xnc3QgRGVpbmVtIFRlYW0gbWl0IFwiJXNcIi5cbiIsY21kKSk7CisgICAgY29tbWFuZChjbWQpOworICB9IHdoaWxlIChnZXRfZXZhbF9jb3N0KCk+OTAwMDAwICYmIHJhbmRvbSgxMDAwKT4yMCAmJiBvYmplY3RwKE1FKQorICAgICAgICAgICAmJiBzdHJpbmdwKGNtZD10ZWFtX2ZvbGxvd190b2RvW0VOVl0pKTsKKworICAvLyBJc3QgU3BpZWxlciBpbiBVbWdlYnVuZyBnZWxhbmRldCwgZnVlciBkaWUgbm9jaCBlaW4KKyAgLy8gQmVmZWhsIGF1c3p1ZnVlaHJlbiBpc3Q/CisgIGlmICghb2JqZWN0cChNRSkgfHwgIXN0cmluZ3AodGVhbV9mb2xsb3dfdG9kb1tFTlZdKSkKKyAgICByZXR1cm4gdGVhbV9mb2xsb3dfdG9kbz0wOworICB3aGlsZSAgKHJlbW92ZV9jYWxsX291dCgiRG9UZWFtRm9sbG93IikhPS0xKSA7CisgIGNhbGxfb3V0KCJEb1RlYW1Gb2xsb3ciLDApOworICByZXR1cm4gMDsKK30KKworaW50IENhbGxUZWFtRm9sbG93KG9iamVjdCBlbnYsIHN0cmluZyBjbWQpIHsKKyAgaWYgKCF0ZWFtX2F1dG9mb2xsb3cKKyAgICAgIHx8IFBPIT1RdWVyeShQX1RFQU0pCisgICAgICB8fCAhUE8KKyAgICAgIHx8ICFvYmplY3RwKGVudikKKyAgICAgIHx8ICFzdHJpbmdwKGNtZCkpCisgICAgcmV0dXJuIDA7CisgIGlmICghbWFwcGluZ3AodGVhbV9mb2xsb3dfdG9kbykpCisgICAgdGVhbV9mb2xsb3dfdG9kbz0oW10pOworICBpZiAoRU5WIT1lbnYgJiYgIXRlYW1fZm9sbG93X3RvZG9bRU5WXSkKKyAgICByZXR1cm4gMDsKKyAgdGVhbV9mb2xsb3dfdG9kb1tlbnZdPWNtZDsKKyAgaWYgKGZpbmRfY2FsbF9vdXQoIkRvVGVhbUZvbGxvdyIpPDApCisgICAgY2FsbF9vdXQoIkRvVGVhbUZvbGxvdyIsMCk7CisgIHJldHVybiAxOworfQorCitpbnQgQ2xlYXJUZWFtRm9sbG93KCkgeworICBpZiAoUE8hPVF1ZXJ5KFBfVEVBTSkgfHwgIVBPKQorICAgIHJldHVybiAwOworICB0ZWFtX2ZvbGxvd190b2RvPShbXSk7CisgIHJldHVybiAxOworfQorCittaXhlZCAqUHJlc2VudFRlYW1Sb3dzKCkgeworICBvYmplY3QgdGVhbTsKKyAgbWl4ZWQgKnJlczsKKyAgaW50IGk7CisKKyAgaWYgKCFvYmplY3RwKHRlYW09UXVlcnkoUF9URUFNKSkpIHsKKyAgICByZXM9RU1QVFlfVEVBTUFSUkFZOworICAgIHJlc1swXT0oe01FfSk7CisgICAgcmV0dXJuIHJlczsKKyAgfQorICByZXM9dGVhbS0+UHJlc2VudFJvd3MoRU5WKTsKKyAgZm9yIChpPTA7aTxNQVhfVEVBTVJPV1M7aSsrKQorICAgIGlmIChtZW1iZXIocmVzW2ldLE1FKT49MCkKKyAgICAgIHJldHVybiByZXM7CisgIHJlc1swXSs9KHtNRX0pOworICByZXR1cm4gcmVzOworfQorCit2YXJhcmdzIG1peGVkICpQcmVzZW50RW5lbXlSb3dzKG9iamVjdCAqaGVyZSkgeworICBtaXhlZCAqcmVzLCpyb3dzOworICBtYXBwaW5nIGFkZGVkX3RlYW1zOworICBpbnQgaSxqOworICBvYmplY3Qgb2IsdGVhbTsKKworICBhZGRlZF90ZWFtcz0oW1F1ZXJ5KFBfVEVBTSk6MV0pOyAvLyBOaWNodCBhdWYgZWlnZW5lcyBUZWFtIGhhdWVuCisgIHJlcz1FTVBUWV9URUFNQVJSQVk7CisgIGlmICghcG9pbnRlcnAoaGVyZSkpCisgICAgaGVyZT1QcmVzZW50RW5lbWllcygpOworICBmb3IgKGk9c2l6ZW9mKGhlcmUpLTE7aT49MDtpLS0pIHsKKyAgICBpZiAoIW9iamVjdHAob2I9aGVyZVtpXSkpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoIW9iamVjdHAodGVhbT1vYi0+UXVlcnlQcm9wKFBfVEVBTSkpKSB7CisgICAgICByZXNbMF0rPSh7b2J9KTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoYWRkZWRfdGVhbXNbdGVhbV0pCisgICAgICBjb250aW51ZTsKKyAgICBhZGRlZF90ZWFtc1t0ZWFtXT0xOworICAgIHJvd3M9dGVhbS0+UHJlc2VudFJvd3MoRU5WKTsKKyAgICBmb3IgKGo9MDtqPE1BWF9URUFNUk9XUztqKyspCisgICAgICByZXNbal0rPXJvd3Nbal07CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKwordmFyYXJncyBvYmplY3QgU2VsZWN0TmVhckVuZW15KG9iamVjdCAqaGVyZSwgaW50IGZvcmNlZnJvbSkgeworICBvYmplY3Qgb2IsZW4sdGVhbTsKKyAgbWl4ZWQgKnJvd3M7CisgIGludCAqcHJvYixwcm90LGkscixzeix1cHN6LHN1bTsKKworICBpZiAoIXBvaW50ZXJwKGhlcmUpKQorICAgIGhlcmU9UHJlc2VudEVuZW1pZXMoKTsKKyAgaWYgKCFvYmplY3RwKG9iPVNlbGVjdEVuZW15KGhlcmUpKSkKKyAgICByZXR1cm4gMDsKKyAgZW49b2ItPlF1ZXJ5UHJvcChQX1RFQU0pOyAgICAgICAgICAvLyBGZWluZGxpY2hlcyBUZWFtCisgIGlmIChvYmplY3RwKHRlYW09UXVlcnkoUF9URUFNKSkpIHsgLy8gRWlnZW5lcyBUZWFtCisgICAgaWYgKGVuPT10ZWFtKSAvLyBGZWluZCBpbSBlaWdlbmVuIFRlYW0sIGtlaW4gQU5ERVJFUyBNaXRnbGllZCB3YWVobGVuLgorICAgICAgcmV0dXJuIG9iOyAgLy8gQWJlciBhdWNoIGF1c3NlcmhhbGIgUmVpaGUgMSBkcmF1ZmhhdWVuCisgICAgcm93cz10ZWFtLT5QcmVzZW50Um93cyhFTlYpOworICAgIGlmIChtZW1iZXIocm93c1swXSxNRSk8MCkgLy8gU3RlaGUgaWNoIGluIGRlciBlcnN0ZW4gUmVpaGU/CisgICAgICByZXR1cm4gMDsgLy8gRmFsbHMgbmVpbiBpc3QgYXVjaCBrZWluIEdlZ25lciBuYWhlLgorICB9CisgIGlmICghb2JqZWN0cChlbikpCisgICAgcmV0dXJuIG9iOyAvLyBJc3QgbmljaHQgaW4gZWluZW0gVGVhbSwgYWxzbyBkcmF1Zi4KKyAgcm93cz1lbi0+UHJlc2VudFJvd3MoZW52aXJvbm1lbnQob2IpKTsKKyAgcHJvYj0oezEsMCwwLDAsMH0pOworICBwcm90PXN1bT0wOworICBmb3IgKGk9MDtpPE1BWF9URUFNUk9XUztpKyspIHsKKyAgICBpZiAocHJvdD4wKSBwcm90LS07ICAgICAgICAgICAgICAgIC8vIFNjaHV0emtlZ2VsIG5pbW10IGFiLgorICAgIGlmICghc3o9c2l6ZW9mKHJvd3NbaV0pKSBjb250aW51ZTsgLy8gR2VnbmVyIGluIGRpZXNlciBSZWloZQorICAgIHVwc3o9c3otcHJvdDtpZiAodXBzejwwKSBjb250aW51ZTsgLy8gQW56YWhsIHVuZ2VzY2h1ZXR6dGVyIEdlZ25lcgorICAgIHByb2JbaV0rPSh1cHN6K3N1bSk7ICAgICAgICAgICAgICAgLy8gV2FocnNjaGVpbmxpY2hrZWl0ICs9IHVuZ2VzY2h1ZXR6dAorICAgIHN1bT1wcm9iW2ldOyAgICAgICAgICAgICAgICAgICAgICAgLy8gU3VtbWUgYmlzaGVyaWdlciBXYWhyc2NoZWlubGljaGtlaXRlbgorICAgIGlmIChzej5wcm90KSBwcm90PXN6OyAgICAgICAgICAgICAgLy8gTmV1ZXIgU2NodXR6a2VnZWwKKyAgfQorICByPXJhbmRvbShzdW0pOworICBmb3IgKGk9MDtpPE1BWF9URUFNUk9XUztpKyspCisgICAgaWYgKHI8cHJvYltpXSkKKyAgICAgIGJyZWFrOworICBpZiAoaT49TUFYX1RFQU1ST1dTKQorICAgIGk9MDsKKyAgaWYgKG9iamVjdHAoZW49U2VsZWN0RW5lbXkoZm9yY2Vmcm9tPyhoZXJlJnJvd3NbaV0pOnJvd3NbaV0pKSkKKyAgICByZXR1cm4gZW47CisgIGlmIChpICYmIG9iamVjdHAoZW49U2VsZWN0RW5lbXkoZm9yY2Vmcm9tPyhoZXJlJnJvd3NbMF0pOnJvd3NbMF0pKSkKKyAgICByZXR1cm4gZW47CisgIHJldHVybiBvYjsKK30KKwordmFyYXJncyBvYmplY3QgU2VsZWN0RmFyRW5lbXkob2JqZWN0ICpoZXJlLCBpbnQgbWluLCBpbnQgbWF4LCBpbnQgZm9yY2Vmcm9tKSB7CisgIG1peGVkICpyb3dzOworICBpbnQgKnByb2IsaSxyLHN1bTsKKyAgb2JqZWN0IGVuOworCisgIGlmIChtYXg8MCB8fCBtaW4+PU1BWF9URUFNUk9XUyB8fCBtYXg8bWluKQorICAgIHJldHVybiAwOworICBpZiAobWluPDApIG1pbj0wOworICBpZiAobWF4Pj1NQVhfVEVBTVJPV1MpIG1heD1NQVhfVEVBTVJPV1MtMTsKKyAgaWYgKCFwb2ludGVycChoZXJlKSkKKyAgICBoZXJlPVByZXNlbnRFbmVtaWVzKCk7CisgIHJvd3M9UHJlc2VudEVuZW15Um93cyhoZXJlKTsKKyAgcHJvYj0oezAsMCwwLDAsMH0pOworICBzdW09MDsKKyAgZm9yIChpPW1pbjtpPD1tYXg7aSsrKQorICAgIHN1bT1wcm9iW2ldPXN1bStzaXplb2Yocm93c1tpXSkrbWF4LWk7CisKKyAgcj1yYW5kb20oc3VtKTsKKyAgZm9yIChpPW1pbjtpPD1tYXg7aSsrKQorICAgIGlmIChyPHByb2JbaV0pCisgICAgICBicmVhazsKKyAgaWYgKGk+bWF4KQorICAgIGk9bWluOworICBpZiAob2JqZWN0cChlbj1TZWxlY3RFbmVteShmb3JjZWZyb20/KGhlcmUmcm93c1tpXSk6cm93c1tpXSkpKQorICAgIHJldHVybiBlbjsKKyAgZm9yIChpPW1pbjtpPD1tYXg7aSsrKQorICAgIGlmIChvYmplY3RwKGVuPVNlbGVjdEVuZW15KGZvcmNlZnJvbT8oaGVyZSZyb3dzW2ldKTpyb3dzW2ldKSkpCisgICAgICByZXR1cm4gZW47CisgIHJldHVybiAwOworfQorCittaXhlZCBfcXVlcnlfZnJpZW5kKCkgeworICBtaXhlZCByZXM7CisKKyAgaWYgKHJlcz1RdWVyeShQX0ZSSUVORCkpCisgICAgcmV0dXJuIHJlczsKKyAgaWYgKG9iamVjdHAocmVzPVF1ZXJ5KFBfVEVBTV9BU1NPQ19NRU1CRVJTKSkKKyAgICAgICYmIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUocmVzKSkKKyAgICByZXR1cm4gcmVzOworICByZXR1cm4gMDsKK30KKworaW50IERlQXNzb2NNZW1iZXIob2JqZWN0IG5wYykgeworICBtaXhlZCBvYnM7CisgIG9iamVjdCB0ZWFtOworCisgIGlmIChleHRlcm5fY2FsbCgpICYmIFBPIT1ucGMgJiYKKyAgICAgIG1lbWJlcigoeyJnaWxkZW4iLCJzcGVsbGJvb2tzIn0pLAorICAgICAgICAgICAgIGV4cGxvZGUob2JqZWN0X25hbWUoUE8pLCIvIilbMV0pPDApCisgICAgcmV0dXJuIDA7CisgIG9icz1RdWVyeVByb3AoUF9URUFNX0FTU09DX01FTUJFUlMpOworICBpZiAoIXBvaW50ZXJwKG9icykpCisgICAgcmV0dXJuIDA7CisgIG9icy09KHtucGMsMH0pOworICBTZXRQcm9wKFBfVEVBTV9BU1NPQ19NRU1CRVJTLG9icyk7CisgIGlmIChvYmplY3RwKHRlYW09UXVlcnlQcm9wKFBfVEVBTSkpKQorICAgIHRlYW0tPlJlbW92ZUFzc29jTWVtYmVyKE1FLG5wYyk7CisgIHJldHVybiAxOworfQorCitpbnQgQXNzb2NNZW1iZXIob2JqZWN0IG5wYykgeworICBtaXhlZCBvYnM7CisgIG9iamVjdCB0ZWFtOworCisgIGlmIChleHRlcm5fY2FsbCgpICYmIFBPIT1ucGMgJiYKKyAgICAgIG1lbWJlcigoeyJnaWxkZW4iLCJzcGVsbGJvb2tzIn0pLAorICAgICAgICAgICAgIGV4cGxvZGUob2JqZWN0X25hbWUoUE8pLCIvIilbMV0pPDApCisgICAgcmV0dXJuIDA7CisgIGlmICghb2JqZWN0cChucGMpCisgICAgICB8fCBucGMtPlF1ZXJ5UHJvcChQX1RFQU1fQVNTT0NfTUVNQkVSUykKKyAgICAgIHx8IElzRW5lbXkobnBjKQorICAgICAgfHwgbnBjPT1NRQorICAgICAgfHwgcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShucGMpKQorICAgIHJldHVybiAwOworICBvYnM9UXVlcnlQcm9wKFBfVEVBTV9BU1NPQ19NRU1CRVJTKTsKKyAgaWYgKG9iamVjdHAob2JzKSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKCFwb2ludGVycChvYnMpKQorICAgIG9icz0oe30pOworICBvYnM9KG9icy0oe25wYywwfSkpKyh7bnBjfSk7CisgIFNldFByb3AoUF9URUFNX0FTU09DX01FTUJFUlMsb2JzKTsKKyAgbnBjLT5TZXRQcm9wKFBfVEVBTV9BU1NPQ19NRU1CRVJTLE1FKTsKKyAgaWYgKG9iamVjdHAodGVhbT1RdWVyeVByb3AoUF9URUFNKSkpCisgICAgdGVhbS0+QWRkQXNzb2NNZW1iZXIoTUUsbnBjKTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZhcmFyZ3Mgdm9pZCBJbnNlcnRFbmVteVRlYW0obWl4ZWQgZW5zLCBpbnQgcmVrKSB7CisgIG9iamVjdCAqb2JzLG9iLGV0ZWFtLHRlYW07CisgIGludCBpOworCisgIHRlYW09UXVlcnkoUF9URUFNKTsKKyAgLy8gQWxsZSBUZWFtbWl0Z2xpZWRlciBkZXMgR2VnbmVycyBzaW5kIEZlaW5kOgorICBpZiAob2JqZWN0cChlbnMpKSB7CisgICAgaWYgKG9iamVjdHAoZXRlYW09ZW5zLT5RdWVyeVByb3AoUF9URUFNKSkpIHsKKyAgICAgIGlmIChldGVhbT09dGVhbSkgLy8gZmVpbmRsaWNoZXMgVGVhbSA9IGVpZ2VuZXMgVGVhbT8KKyAgICAgICAgcmV0dXJuOyAgICAgICAgLy8gYWxzbyBuaWNodCBhbGxlIFRlYW1taXRnbGllZGVyIGdlZ2VuZWluYW5kZXIgaGV0emVuCisgICAgICBlbnM9ZXRlYW0tPk1lbWJlcnMoKTsKKyAgICB9IGVsc2UgeworICAgICAgZW5zPSh7ZW5zfSk7CisgICAgfQorICB9CisgIGlmICghcG9pbnRlcnAoZW5zKSkKKyAgICByZXR1cm47CisgIGVucy09KHtNRX0pOworCisgIC8vIEludGVyYWN0aXZlcyBzb2xsZW4ga2VpbmUgSW50ZXJhY3RpdmVzIGR1cmNoIFRlYW0gYW5ncmVpZmVuOgorICBpZiAocXVlcnlfb25jZV9pbnRlcmFjdGl2ZShNRSkpIHsKKyAgICBmb3IgKGk9c2l6ZW9mKGVucyktMTtpPj0wO2ktLSkKKyAgICAgIGlmIChvYmplY3RwKG9iPWVuc1tpXSkgJiYgZW52aXJvbm1lbnQob2IpPT1lbnZpcm9ubWVudCgpCisgICAgICAgICAgJiYgIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2IpKQorICAgICAgICBJbnNlcnRTaW5nbGVFbmVteShvYik7CisgIH0gZWxzZSB7CisgICAgZm9yIChpPXNpemVvZihlbnMpLTE7aT49MDtpLS0pCisgICAgICBpZiAob2JqZWN0cChvYj1lbnNbaV0pICYmIGVudmlyb25tZW50KG9iKT09ZW52aXJvbm1lbnQoKSkKKyAgICAgICAgSW5zZXJ0U2luZ2xlRW5lbXkob2IpOworICB9CisKKyAgLy8gQWxsZSBhbmRlcmVuIFRlYW1taXRnbGllZGVyIEluZm9ybWllcmVuOgorICBpZiAocmVrIHx8ICFvYmplY3RwKHRlYW0pIHx8ICFwb2ludGVycChvYnM9dGVhbS0+TWVtYmVycygpKSkKKyAgICByZXR1cm47CisgIG9icy09KHtNRX0pOworICBvYnMtPWVuczsKKyAgZm9yIChpPXNpemVvZihvYnMpLTE7aT49MDtpLS0pCisgICAgaWYgKG9iamVjdHAob2I9b2JzW2ldKSkKKyAgICAgIG9iLT5JbnNlcnRFbmVteVRlYW0oZW5zLDEpOworfQorCitpbnQgVGVhbUZsZWUoKSB7CisgIG9iamVjdCB0ZWFtOworCisgIGlmIChRdWVyeShQX1RFQU1fV0lNUFlfUk9XKTwyIHx8ICFvYmplY3RwKHRlYW09UXVlcnkoUF9URUFNKSkpCisgICAgcmV0dXJuIDA7CisgIGlmICghdGVhbS0+RmxlZVRvUm93KE1FKSkKKyAgICAgcmV0dXJuIDA7CisgIGlmIChRdWVyeShQX1RFQU1fTEVBREVSKT09dGVhbSkgeworICAgIGlmICh0ZWFtX2F1dG9mb2xsb3cpCisgICAgICB0ZWxsX29iamVjdChNRSwiRHUgdmVyc3VjaHN0IHp1IGZsaWVoZW4sICIrCisgICAgICAgICAgICAgICAgICAiRGVpbiBUZWFtIGZvbGd0IERpciBuaWNodCBtZWhyLlxuIik7CisgICAgdGVhbV9hdXRvZm9sbG93PTA7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3ZhcmFyZ3MgbWFwcGluZyBQcmVzZW50VGVhbVBvc2l0aW9ucyhtaXhlZCBwcmVzX3Jvd3MpIHsKKyAgbWFwcGluZyByZXM7CisgIGludCBpLGo7CisgIG9iamVjdCAqb2JzLG9iOworCisgIHJlcz0oW10pOworICBpZiAoIXBvaW50ZXJwKHByZXNfcm93cykpCisgICAgcHJlc19yb3dzPVByZXNlbnRUZWFtUm93cygpOworICBmb3IgKGk9MDtpPE1BWF9URUFNUk9XUztpKyspIHsKKyAgICBvYnM9cHJlc19yb3dzW2ldOworICAgIGZvciAoaj1zaXplb2Yob2JzKS0xO2o+PTA7ai0tKQorICAgICAgaWYgKG9iamVjdHAob2I9b2JzW2pdKSAmJiAhcmVzW29iXSkKKyAgICAgICAgcmVzW29iXT1pKzE7CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKwordmFyYXJncyBpbnQgUHJlc2VudFBvc2l0aW9uKG1peGVkIHBtYXApIHsKKyAgb2JqZWN0IHRlYW07CisgIGludCBpOworCisgIGlmICghb2JqZWN0cCh0ZWFtPVF1ZXJ5KFBfVEVBTSkpKQorICAgIHJldHVybiAxOworICBpZiAobWFwcGluZ3AocG1hcCkpCisgICAgcmV0dXJuIHBtYXBbTUVdOworICBpZiAoIXBvaW50ZXJwKHBtYXApKQorICAgIHBtYXA9dGVhbS0+UHJlc2VudFJvd3MoRU5WKTsKKyAgZm9yIChpPTE7aTxNQVhfVEVBTVJPV1M7aSsrKQorICAgIGlmIChtZW1iZXIocG1hcFtpXSxNRSk+PTApCisgICAgICByZXR1cm4gaSsxOworICByZXR1cm4gMTsKK30KKworI2RlZmluZSBGSUxMU1RSSU5HICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgordmFyYXJncyBwcml2YXRlIHN0cmluZyBjZW50ZXJfc3RyaW5nKHN0cmluZyBzdHIsIGludCB3KSB7CisgIHJldHVybiAoRklMTFNUUklOR1swLi4oKHctc2l6ZW9mKHN0cikpLzItMSldK3N0citGSUxMU1RSSU5HKVswLi4ody0xKV07Cit9CisKK3ByaXZhdGUgaW50IFNob3dUZWFtUm93cygpIHsKKyAgaW50IGksaixzejsKKyAgbWl4ZWQgKnByZXNfcm93czsKKyAgb2JqZWN0ICpvYnMsb2I7CisgIHN0cmluZyBzdHI7CisKKyAgcHJlc19yb3dzPVByZXNlbnRFbmVteVJvd3MoKTsKKyAgZm9yIChzej1NQVhfVEVBTVJPV1MtMTtzej49MDtzei0tKQorICAgIGlmIChzaXplb2YocHJlc19yb3dzW3N6XSkpCisgICAgICBicmVhazsKKyAgZm9yIChpPXN6O2k+PTA7aS0tKSB7CisgICAgb2JzPXByZXNfcm93c1tpXTtzdHI9IiI7CisgICAgZm9yIChqPXNpemVvZihvYnMpLTE7aj49MDtqLS0pCisgICAgICBpZiAob2JqZWN0cChvYj1vYnNbal0pKSB7CisgICAgICAgIGlmIChzdHIhPSIiKSBzdHIrPSIgLyAiOworICAgICAgICBzdHIrPW9iLT5OYW1lKFJBVyk7CisgICAgICB9CisgICAgcHJpbnRmKCIlZC4gJXNcbiIsaSsxLGNlbnRlcl9zdHJpbmcoc3RyLDc1KSk7CisgIH0KKyAgaWYgKHN6Pj0wKQorICAgIHdyaXRlKCIgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworICBwcmVzX3Jvd3M9UHJlc2VudFRlYW1Sb3dzKCk7CisgIGZvciAoc3o9TUFYX1RFQU1ST1dTLTE7c3o+MDtzei0tKQorICAgIGlmIChzaXplb2YocHJlc19yb3dzW3N6XSkpCisgICAgICBicmVhazsKKyAgZm9yIChpPTA7aTw9c3o7aSsrKSB7CisgICAgb2JzPXByZXNfcm93c1tpXTtzdHI9IiI7CisgICAgZm9yIChqPXNpemVvZihvYnMpLTE7aj49MDtqLS0pCisgICAgICBpZiAob2JqZWN0cChvYj1vYnNbal0pKSB7CisgICAgICAgIGlmIChzdHIhPSIiKSBzdHIrPSIgLyAiOworICAgICAgICBzdHIrPW9iLT5OYW1lKFJBVyk7CisgICAgICB9CisgICAgcHJpbnRmKCIlZC4gJXNcbiIsaSsxLGNlbnRlcl9zdHJpbmcoc3RyLDc1KSk7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3ZhcmFyZ3MgaW50IHRlYW1fbGlzdChzdHJpbmcgYXJnKSB7CisgIG9iamVjdCAqdG9icywqb2JzLHRvYixvYixsZDsKKyAgc3RyaW5nICpubXMsKnRubXMsc3RyOworICBpbnQgaSxqOworCisgIGlmICghcG9pbnRlcnAodG9icz1URUFNX01BU1RFUi0+TGlzdFRlYW1PYmplY3RzKCkpKSByZXR1cm4gMDsKKyAgaWYgKGFyZyE9ImFsbGUiKSBhcmc9MDsKKyAgdG5tcz0oe30pOworICBmb3IgKGk9c2l6ZW9mKHRvYnMpLTE7aT49MDtpLS0pIHsKKyAgICBpZiAoIW9iamVjdHAodG9iPXRvYnNbaV0pCisgICAgICAgIHx8ICFvYmplY3RwKGxkPXRvYi0+TGVhZGVyKCkpCisgICAgICAgIHx8ICghcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShsZCkgJiYgIWFyZykKKyAgICAgICAgfHwgIXBvaW50ZXJwKG9icz10b2ItPk1lbWJlcnMoKSkpCisgICAgICBjb250aW51ZTsKKyAgICBubXM9KHt9KTsKKyAgICBmb3IgKGo9c2l6ZW9mKG9icyktMTtqPj0wO2otLSkgeworICAgICAgaWYgKCFvYmplY3RwKG9iPW9ic1tqXSkKKyAgICAgICAgICB8fCAoIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2IpICYmIWFyZykpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgaWYgKCFzdHJpbmdwKHN0cj1vYi0+TmFtZShXRVIpKSkgc3RyPSI/IjsKKyAgICAgIGlmIChvYj09bGQpIHN0cis9IigqKSI7CisgICAgICBubXMrPSh7c3RyfSk7CisgICAgICBubXM9c29ydF9hcnJheShubXMsIyc+KTsKKyAgICB9CisgICAgaWYgKCFzdHJpbmdwKHN0cj10b2ItPk5hbWUoKSkpIHN0cj0iVGVhbSA/IjsKKyAgICBzdHIrPSI6ICI7CisgICAgdG5tcys9KHticmVha19zdHJpbmcoaW1wbG9kZShubXMsIiwgIiksNzgsc3RyKX0pOworICAgIHRubXM9c29ydF9hcnJheSh0bm1zLCMnPCk7CisgIH0KKyAgaWYgKHNpemVvZih0bm1zKSkKKyAgICB0ZWxsX29iamVjdChNRSwgc3ByaW50ZigiJUBzXG4iLCB0bm1zKSk7CisgIGVsc2UKKyAgICB0ZWxsX29iamVjdChNRSwgIktlaW5lIFRlYW1zIGdlZnVuZGVuLlxuIik7IAorICAKKyAgcmV0dXJuIDE7Cit9CisKK3ZhcmFyZ3MgaW50IHRlYW1jbWQoc3RyaW5nIGFyZykgeworICBzdHJpbmcgKndvcmRzLG5hcmc7CisgIG9iamVjdCB0ZWFtOworCisgIGlmICghYXJnKQorICAgIGFyZz0iIjsKKyAgaWYgKCFzdHJpbmdwKG5hcmc9VFAtPl91bnBhcnNlZF9hcmdzKCkpKQorICAgIG5hcmcgPSBhcmc7CisgIGlmICghc2l6ZW9mKHdvcmRzPWV4cGxvZGUoYXJnLCIgIikpKQorICAgIHJldHVybiAwOworIAorICBpZiAoc2l6ZW9mKHdvcmRzKSA+IDEpIHsKKyAgICAgIGFyZz1pbXBsb2RlKHdvcmRzWzEuLl0sIiAiKTsKKyAgICAgIG5hcmcgPSBpbXBsb2RlKGV4cGxvZGUobmFyZywgIiAiKVsxLi5dLCAiICIpOworICB9CisgIGVsc2UKKyAgICAgIGFyZyA9IG5hcmcgPSAiIjsKKworICBzd2l0Y2god29yZHNbMF0pIHsgLy8gQmVmZWhsZSBkaWUga2VpbmUgTWl0Z2xpZWRzY2hhZnQgZXJmb3JkZXJuOgorICBjYXNlICJhdWZuYWhtZSI6CisgICAgcmV0dXJuIHRlYW1fYXVmbmFobWUoYXJnKTsKKyAgY2FzZSAiZm9sZ2UiOgorICAgIHJldHVybiB0ZWFtX2F1Zm5haG1ld3Vuc2NoKGFyZyk7CisgIGNhc2UgIj8iOgorICBjYXNlICJoaWxmZSI6CisgICAgcmV0dXJuIHRlYW1faGVscCgpOworICBjYXNlICJsaXN0ZSI6CisgICAgcmV0dXJuIHRlYW1fbGlzdChhcmcpOyAgCisgIGNhc2UgInVlYmVyc2ljaHQiOgorICAgIHJldHVybiBTaG93VGVhbVJvd3MoKTsKKyAgZGVmYXVsdDo7CisgIH0KKworICBpZiAoIW9iamVjdHAodGVhbT1RdWVyeVByb3AoUF9URUFNKSkpCisgICAgcmV0dXJuIG5vdGlmeV9mYWlsKCJEdSBiaXN0IGluIGtlaW5lbSBUZWFtLlxuIiksMDsKKworICBzd2l0Y2god29yZHNbMF0pIHsKKyAgY2FzZSAiYW5ncmlmZnNiZWZlaGwiOgorICAgIGlmIChuYXJnPT0iIikgbmFyZz0wOworICAgIHRlYW1fYXR0YWNrX2NtZD1uYXJnOworICAgIGlmIChzdHJpbmdwKG5hcmcpKQorICAgICAgd3JpdGUoIkR1IGJlZ2lubnN0IGRlbiBLYW1wZiBtaXQgXCIiK25hcmcrIlwiXG4iKTsKKyAgICBlbHNlCisgICAgICB3cml0ZSgiRHUgaGFzdCBkZW4gVGVhbWFuZ3JpZmZzYmVmZWhsIGRlYWt0aXZpZXJ0LlxuIik7CisgICAgYnJlYWs7IC8vIE5JQ0hUIHJldHVybiEKKyAgY2FzZSAiYXV0b2ZvbGdlIjoKKyAgY2FzZSAiYXV0b2YiOgorICAgIGlmIChhcmc9PSJlaW4iIHx8IGFyZz09ImFuIikgeworICAgICAgdGVhbV9hdXRvZm9sbG93PTE7CisgICAgICBpZiAoSXNUZWFtTGVhZGVyKCkpCisgICAgICAgIHdyaXRlKCJEZWluIFRlYW0gZm9sZ3QgRGlyLlxuIik7CisgICAgICBlbHNlCisgICAgICAgIHdyaXRlKCJEdSBmb2xnc3QgamV0enQgZGVtIFRlYW1sZWl0ZXIuXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgdGVhbV9hdXRvZm9sbG93PTA7CisgICAgICBpZiAoSXNUZWFtTGVhZGVyKCkpCisgICAgICAgIHdyaXRlKCJEZWluIFRlYW0gZm9sZ3QgRGlyIG5pY2h0IG1laHIuXG4iKTsKKyAgICAgIGVsc2UKKyAgICAgICAgd3JpdGUoIkR1IGZvbGdzdCBqZXR6dCBuaWNodCBtZWhyIGRlbSBUZWFtbGVpdGVyLlxuIik7CisgICAgfQorICAgIGJyZWFrOyAvLyBOSUNIVCByZXR1cm4hCisgIGRlZmF1bHQ6IDsKKyAgfQorICByZXR1cm4gdGVhbS0+VGVhbUNtZCh3b3Jkc1swXSxuYXJnKTsgLy8gQmVmZWhsZSBkaWUgTWl0Z2xpZWRzY2hhZnQgZXJmb3JkZXJuOgorfQorCit2YXJhcmdzIHZvaWQgSW5mb3JtUm93Q2hhbmdlKGludCBmcm9tLCBpbnQgdG8sIG9iamVjdCBjYXN0ZXIpIHsKKworICBpZiAoY2FzdGVyKSByZXR1cm47IC8vIEZ1ZXIgZGVuIEZhbGwsIGRhc3MgR2lsZGVub2JqZWt0PT1NRSBpc3QKKyAgaWYgKFBPIT1RdWVyeShQX1RFQU0pKSByZXR1cm47CisjaWYgX19CT09UX1RJTUVfXyA8IDEyODE5MDQ0MzcKKyAgbWl4ZWQgZ2lsZGUgPSBRdWVyeVByb3AoUF9HVUlMRCk7CisgIGlmICghc3RyaW5ncChnaWxkZSkpIHJldHVybjsKKyAgaWYgKCFvYmplY3RwKGdpbGRlPWZpbmRfb2JqZWN0KCIvZ2lsZGVuLyIrZ2lsZGUpKSkgcmV0dXJuOworICBnaWxkZS0+SW5mb3JtUm93Q2hhbmdlKGZyb20sdG8sTUUpOworI2VuZGlmCisgIEhvb2tGbG93KEhfSE9PS19URUFNUk9XQ0hBTkdFLCAoe2Zyb20sdG99KSApOworfQpkaWZmIC0tZ2l0IGEvc3RkL21haWxjYWJpbi5jIGIvc3RkL21haWxjYWJpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhOTRlODUKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvbWFpbGNhYmluLmMKQEAgLTAsMCArMSwxMiBAQAorI3ByYWdtYSBzdHJpY3RfdHlwZXMsc2F2ZV90eXBlcworCitpbmhlcml0ICIvcC9zZXJ2aWNlL2xvY28vc3RkL21haWxjYWJpbiI7CisKK3ZvaWQgY3JlYXRlKCkgeworICBpZiAoIWNsb25lcCgpIHx8IG9iamVjdF9uYW1lKHRoaXNfb2JqZWN0KCkpID09IF9fRklMRV9fWzAuLjwzXSkgeworICAgICAgc2V0X25leHRfcmVzZXQoLTEpOworICAgICAgcmV0dXJuOworICB9CisgIDo6Y3JlYXRlKCk7Cit9CisKZGlmZiAtLWdpdCBhL3N0ZC9tb3JlLmMgYi9zdGQvbW9yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MTg5ODEKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvbW9yZS5jCkBAIC0wLDAgKzEsMTQzIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gbW9yZS5jIC0tIG1vcmUgZmlsZXMKKy8vCisvLyAkSWQ6IG1vcmUuYyA5MTQyIDIwMTUtMDItMDQgMjI6MTc6MjlaIFplc3N0cmEgJAorCisjcHJhZ21hIHN0cmljdF90eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisjcHJhZ21hIHJhbmdlX2NoZWNrCisKK2luaGVyaXQgIi9zdGQvdXRpbC9wYWdlciI7CisKKyNpbmNsdWRlIDxwYWdlci5oPgorCisjaWZkZWYgR0VSTUFOCisjIGRlZmluZSBNU0dfV1JBUFBFRAkiIFZPTSBBTkZBTkciCisjIGRlZmluZSBNU0dfTk9UX0ZPVU5ECSIgTklDSFRTIEdFRlVOREVOIgorIyBkZWZpbmUgTVNHX05PX1JFR1gJIiBGRUhMRU5ERVIgUkVHLiBBVVNEUlVDSyIKKyMgZGVmaW5lIE1TR19JTExFR0FMCSIgSUxMRUdBTEUgWkVJTEVOWkFITCIKKyMgZGVmaW5lIE1TR19IRUxQICAgICAgICJcCitIaWxmZSBmdWVyIG1vcmU6XG5cCitcblwKK2IsQiAgICAgICAgLS0gRWluZSBTZWl0ZSB6dXJ1ZWNrLlxuXAordSxVICAgICAgICAtLSBFaW5lIGhhbGJlIFNlaXRlIHp1cnVlY2suXG5cCitmLEYgICAgICAgIC0tIEVpbmUgU2VpdGUgdm9yd2FlcnRzLlxuXAorZCxEICAgICAgICAtLSBFaW5lIGhhbGJlIFNlaXRlIHZvcndhZXJ0cy5cblwKKzxaZWlsZT4gICAgLS0gU3ByaW5nZSB6dSBaZWlsZSA8WmVpbGU+XG5cCitxLHggICAgICAgIC0tIFZlcmxhc3NlbiB2b24gbW9yZS5cblwKKy88UmVnRXhwPiAgLS0gTmFjaCBkZW0gcmVndWxhZXJlbiBBdXNkcnVjayA8UmVnRXhwPiBzdWNoZW4uXG4iCisjZWxzZQorIyBkZWZpbmUgTVNHX1dSQVBQRUQJIiBXUkFQUEVEIgorIyBkZWZpbmUgTVNHX05PVF9GT1VORAkiIE5PVEhJTkcgRk9VTkQiCisjIGRlZmluZSBNU0dfTk9fUkVHWAkiIE5PIFBSRVYgUkVHVUxBUiBFWFBSIgorIyBkZWZpbmUgTVNHX0lMTEVHQUwJIiBJTExFR0FMIExJTkUgTlVNQkVSIgorIyBkZWZpbmUgTVNHX0hFTFAgICAgICAgIlwKK0hlbHAgZm9yIG1vcmU6XG5cCitcblwKK2IsQiAgICAgICAgLS0gT25lIHBhZ2UgYmFjay5cblwKK3UsVSAgICAgICAgLS0gSGFsZiBhIHBhZ2UgYmFjay5cblwKK2YsRiAgICAgICAgLS0gT25lIHBhZ2UgZm9yd2FyZC5cblwKK2QsRCAgICAgICAgLS0gSGFsZiBhIHBhZ2UgZm9yd2FyZC5cblwKKzxsaW5lPiAgICAgLS0gSnVtcCB0byBsaW5lIG51bWJlciA8bGluZT5cblwKK3EseCAgICAgICAgLS0gUXVpdCBvciBlWGl0IG1vcmUuXG5cCisvPHJlZ2V4cD4gIC0tIFNlYXJjaCBmb3IgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiA8cmVnZXhwPi5cbiIKKyNlbmRpZgorCitwcml2YXRlIG5vc2F2ZSBzdHJpbmcgY3Byb21wdCA9ICIiOworCitzdHJpbmcgcHJvbXB0KG1peGVkIHBpbmZvLCBzdHJpbmcgYWRkKQoreworICBpbnQgbGluZSxtYXg7IG1heCA9IDE7CisgIGlmKHBvaW50ZXJwKHBpbmZvKSkKKyAgeworICAgICBpZihwaW5mb1tDVVJMXSArIHBpbmZvW1BBR0VdID49IHBpbmZvW01BWExdKSBsaW5lID0gcGluZm9bTUFYTF07CisgICAgIGVsc2UgbGluZSA9IHBpbmZvW0NVUkxdICsgcGluZm9bUEFHRV07CisgICAgIG1heCA9IHBpbmZvW01BWExdOworICB9CisgIGlmIChwaW5mb1tGTEFHXSAmIEVfQUJTKQorICAgIHJldHVybiBzcHJpbnRmKCIlcyAoJWQvJWQpJXMgJXMiLAorCQkgICA6OnByb21wdChwaW5mbywgIiIpLAorCQkgICBsaW5lLTEsIHBpbmZvW01BWExdLAorCQkgICBjcHJvbXB0LCBzdHJpbmdwKGFkZCk/YWRkOiIiKTsKKyAgZWxzZQorICAgIHJldHVybiBzcHJpbnRmKCIlcyglZCUlKSVzICVzIiwKKwkJICAgOjpwcm9tcHQocGluZm8sICIiKSwKKwkJICAgbGluZSoxMDAvbWF4LCAKKwkJICAgY3Byb21wdCwgc3RyaW5ncChhZGQpP2FkZDoiIik7Cit9CisKK2ludCBzZWFyY2gobWl4ZWQgcGluZm8pCit7CisgIGludCBsLCBsaW5lczsKKyAgbWl4ZWQgdG1wOworICBsID0gcGluZm9bQ1VSTF07CisgIHdoaWxlKCh0bXAgPSBmcmVhZChwaW5mbywgbCwgcGluZm9bUEFHRV0pKSAmJgorICAgICAgICAhc2l6ZW9mKHJlZ2V4cChvbGRfZXhwbG9kZSh0bXAsICJcbiIpLCBwaW5mb1tSRUdYXSkpKQorICAgIGwgKz0gcGluZm9bUEFHRV07CisgIGlmKCF0bXApCisgIHsKKyAgICBjcHJvbXB0ICs9IE1TR19XUkFQUEVEOworICAgIGwgPSAxOworICAgIHdoaWxlKGwgPCBwaW5mb1tDVVJMXSAmJgorICAgICAgICAgICh0bXAgPSBmcmVhZChwaW5mbywgbCwgcGluZm9bUEFHRV0pKSAmJgorICAgICAgICAgICFzaXplb2YocmVnZXhwKG9sZF9leHBsb2RlKHRtcCwgIlxuIiksIHBpbmZvW1JFR1hdKSkpCisgICAgICBsICs9IHBpbmZvW1BBR0VdOworICAgIGlmKGwgPj0gcGluZm9bQ1VSTF0pIHJldHVybiAwOworICB9CisgIHJldHVybiBsOworfQorCit2YXJhcmdzIGludCBldmFsX2NvbW1hbmQobWl4ZWQgaW4sIG1peGVkIHBpbmZvKQoreworICBjcHJvbXB0ID0gIiI7CisgIGlmKHN0cmluZ3AoaW4pKQorICAgIHN3aXRjaChpbikKKyAgICB7CisgICAgY2FzZSAiPyI6CisgICAgICB3cml0ZShNU0dfSEVMUCsiXG4iKTsKKyAgICAgIHJldHVybiAwOyAKKyAgICBjYXNlICJiIjoKKyAgICBjYXNlICJCIjoKKyAgICAgIHBpbmZvW0NVUkxdIC09IHBpbmZvW1BBR0VdOworICAgICAgYnJlYWs7CisgICAgY2FzZSAidSI6CisgICAgY2FzZSAiVSI6CisgICAgICBwaW5mb1tDVVJMXSAtPSBwaW5mb1tQQUdFXSAvIDI7CisgICAgICBicmVhazsKKyAgICBjYXNlICJmIjoKKyAgICBjYXNlICJGIjoKKyAgICAgIHBpbmZvW0NVUkxdICs9IHBpbmZvW1BBR0VdOworICAgICAgYnJlYWs7CisgICAgY2FzZSAiZCI6CisgICAgY2FzZSAiRCI6CisgICAgICBwaW5mb1tDVVJMXSArPSBwaW5mb1tQQUdFXSAvIDI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgIHsKKyAgICAgIGludCBsOworICAgICAgaWYobCA9IHRvX2ludChpbikpCisgICAgICB7CisgICAgICAgIGlmKGwgPiBwaW5mb1tNQVhMXSB8fCBsIDwgMSkgcmV0dXJuIChjcHJvbXB0ID0gTVNHX0lMTEVHQUwsIDApOworICAgICAgICBwaW5mb1tDVVJMXSA9IGw7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYoc2l6ZW9mKGluKSAmJiBpblswXSA9PSAnLycpCisgICAgICB7CisJaWYoc2l6ZW9mKGluKSA9PSAxKQorCXsKKwkgIGlmKCFwaW5mb1tSRUdYXSkgcmV0dXJuIChjcHJvbXB0ID0gTVNHX05PX1JFR1gsIDApOworCX0KKwllbHNlIHBpbmZvW1JFR1hdID0gaW5bMS4uXTsKKwlpZihsID0gc2VhcmNoKHBpbmZvKSkgcGluZm9bQ1VSTF0gPSBsOworCWVsc2UgcmV0dXJuIChjcHJvbXB0ID0gTVNHX05PVF9GT1VORCwgMCk7CisgICAgICB9CisgICAgICBlbHNlIHJldHVybiA6OmV2YWxfY29tbWFuZChpbiwgcGluZm8pOyAgICAKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICB9CisgIGVsc2UgcmV0dXJuIDo6ZXZhbF9jb21tYW5kKGluLCBwaW5mbyk7CisgIHJldHVybiA6OmV2YWxfY29tbWFuZCgtMSwgcGluZm8pOworfSAgIApkaWZmIC0tZ2l0IGEvc3RkL25ld3NjbGllbnQuYyBiL3N0ZC9uZXdzY2xpZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA0N2U0MQotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9uZXdzY2xpZW50LmMKQEAgLTAsMCArMSwyNDQgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBuZXdzY2xpZW50LmMgLS0gTmFjaHJpY2h0ZW5icmV0dGVyCisvLworLy8gJElkOiBuZXdzY2xpZW50LmMgODM0OSAyMDEzLTAyLTA0IDIxOjE1OjI4WiBaZXNzdHJhICQKKworLyogMTk5MiBKT0YgKi8KKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgcGVkYW50aWMKKworaW5oZXJpdCAiL3N0ZC90aGluZyI7Citpbmhlcml0ICIvc3RkL21vcmUiOworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG5ld3MuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxpbnB1dF90by5oPgorCitzdHJpbmcgR1JPVVA7CitzdHJpbmcgd3JpdGVyOworc3RyaW5nIHVzZW1zZzsKKwordm9pZCBTZXRJblVzZU1lc3NhZ2Uoc3RyaW5nIHN0cikKK3sKKyAgdXNlbXNnPXN0cjsKK30KKworc3RyaW5nIFNldEdyb3VwKHN0cmluZyBzdHIpCit7CisgIHJldHVybiBHUk9VUD1zdHI7Cit9CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgIHRoaW5nOjpjcmVhdGUoKTsKKyAgd3JpdGVyPT0iIjsKKworfQorCit2b2lkIHRoaW5naW5pdCgpIC8qIElmIHNvbWVvbmUgZG9lc250IHdhbnQgb3VyIGFkZF9hY3Rpb24gaGUgbWF5IGNhbGwgdGhpcyAqLworeworICB0aGluZzo6aW5pdCgpOworfQorCit2YXJhcmdzIGludCByZW1vdmUoaW50IHNpbGVudCkKK3sKKyAgcmV0dXJuIHRoaW5nOjpyZW1vdmUoKTsKK30KKwordm9pZCBpbml0KCkKK3sKKyAgdGhpbmc6OmluaXQoKTsKKyAgYWRkX2FjdGlvbigic2NocmVpYiIsInNjaHJlaWIiLDEpOworICBhZGRfYWN0aW9uKCJsaWVzIiwibGllcyIpOworICBhZGRfYWN0aW9uKCJsb2VzY2hlIiwibG9lc2NoIiwxKTsKK30KKworc3RyaW5nIGxhZGooc3RyaW5nIHN0ciwgaW50IHdlaXRlKQoreworICByZXR1cm4oKHN0cisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKVswLi53ZWl0ZS0xXSk7Cit9CisKK3N0cmluZyBRdWVyeUxvbmcoKQoreworICBtaXhlZCAqbWVzc2FnZXM7CisgIHN0cmluZyBkZXNjOworICBpbnQgaTsKKworICBkZXNjPVF1ZXJ5UHJvcChQX0xPTkcpOworICBkZXNjKz0iXG4iOworICBtZXNzYWdlcz1ORVdTU0VSVkVSLT5HZXROb3RlcyhHUk9VUCk7CisgIGlmICghcG9pbnRlcnAobWVzc2FnZXMpIHx8ICFzaXplb2YobWVzc2FnZXMpKSAKKyAgICByZXR1cm4gZGVzYysiWnVyIFplaXQgYmVmaW5kZW4gc2ljaCBrZWluZSBOYWNocmljaHRlbiBhbSBCcmV0dC5cbiI7CisgIGlmIChzaXplb2YobWVzc2FnZXMpPT0xKQorICAgIGRlc2MrPSJadXIgWmVpdCBiZWZpbmRldCBzaWNoIGVpbmUgTmFjaHJpY2h0IGFtIEJyZXR0OlxuXG4iOworICBlbHNlCisgICAgZGVzYys9Ilp1ciBaZWl0IGJlZmluZGVuIHNpY2ggIitzaXplb2YobWVzc2FnZXMpKyIgTmFjaHJpY2h0ZW4gYW0gQnJldHQ6XG5cbiI7CisgIGZvciAoaT0wO2k8c2l6ZW9mKG1lc3NhZ2VzKTtpKyspCisgIHsKKyAgICBpZiAoaTw5KSBkZXNjKz0iICI7CisgICAgZGVzYys9IiIrKGkrMSkrIi4gIjsKKyAgICBkZXNjKz0obGFkaihtZXNzYWdlc1tpXVtNX1RJVExFXSw0NSkrIiAoIisKKwkgICBsYWRqKG1lc3NhZ2VzW2ldW01fV1JJVEVSXSsiLCIsMTMpKworCSAgIGR0aW1lKG1lc3NhZ2VzW2ldW01fVElNRV0pWzQuLjI0XSArICIpXG4iKTsKKyAgfQorICByZXR1cm4gZGVzYzsKK30KKwordmFyYXJncyBzdHJpbmcgbG9uZyhpbnQgbW9kZSkKK3sKKyAgcmV0dXJuIFF1ZXJ5TG9uZygpOworfQorCittaXhlZCAqbWVzc2FnZTsKKworaW50IHNjaHJlaWIoc3RyaW5nIHN0cikKK3sKKyAgaW50IGVycjsKKworICBpZiAoIXRoaXNfaW50ZXJhY3RpdmUoKSB8fCAhdGhpc19pbnRlcmFjdGl2ZSgpLT5xdWVyeV9yZWFsX25hbWUoKSkgcmV0dXJuIDA7CisgIGlmICh3cml0ZXIpCisgIHsKKyAgICB3cml0ZSgiRGFzIGdlaHQgaW0gTW9tZW50IG5pY2h0LCBkYSAiK2NhcGl0YWxpemUod3JpdGVyKSsiIGdlcmFkZSBhbiBkaWVzZW0gQnJldHQgc2NocmVpYnQuXG4iKTsKKyAgICBpZiAodXNlbXNnKSB3cml0ZSh1c2Vtc2crIlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgX25vdGlmeV9mYWlsKCJEdSBtdXNzdCBlaW5lbiBUaXRlbCBmdWVyIGRpZSBOb3RpeiBhbmdlYmVuICFcbiIpOworICBpZiAoIXN0cikgcmV0dXJuIDA7CisgIHN3aXRjaCAoZXJyPU5FV1NTRVJWRVItPkFza0FsbG93ZWRXcml0ZShHUk9VUCkpCisgIHsKKyAgICBjYXNlICAxOiBicmVhazsKKwkgICAgIGNhc2UgLTE6IHdyaXRlKCJEdSBkYXJmc3Qga2VpbmUgTm90ZXMgYW4gZGllc2VzIEJyZXR0IGhlZnRlbiAhXG4iKTsgcmV0dXJuIDE7CisJICAgICBjYXNlIC0zOiB3cml0ZSgiRGFzIEJyZXR0IGlzdCBsZWlkZXIgdm9sbCAhXG4iKTsgcmV0dXJuIDE7CisJICAgICBkZWZhdWx0OiB3cml0ZSgiSW50ZXJuZXIgRmVobGVyICIrZXJyKyIsIEVyem1hZ2llciB2ZXJzdGFlbmRpZ2VuICFcbiIpOyByZXR1cm4gMTsKKwkgICB9CisgIHdyaXRlcj10aGlzX2ludGVyYWN0aXZlKCktPnF1ZXJ5X3JlYWxfbmFtZSgpOworICBtZXNzYWdlPWFsbG9jYXRlKDYpOworICBtZXNzYWdlW01fQk9BUkRdPUdST1VQOworICBtZXNzYWdlW01fVElUTEVdPXN0cjsKKyAgbWVzc2FnZVtNX01FU1NBR0VdPSIiOworICB3cml0ZSgiT2ssIGJlZW5kZSBEZWluZSBOb3RpeiBtaXQgJyoqJyBvZGVyIGJyaWNoIHNpZSBtaXQgJ35xJyBhYiAhXG4iKTsKKyAgaWYgKElTX1dJWkFSRCh0aGlzX3BsYXllcigpKSkKKyAgICB3cml0ZSgiQWxzIE1hZ2llciIrKHRoaXNfcGxheWVyKCktPlF1ZXJ5UHJvcChQX0dFTkRFUik9PUZFTUFMRSA/ICJpbiIgOiAiIikrCisJICAiIGthbm5zdCBEdSBwZXIgJ35yPGZpbGVuYW1lPicgZWluIEZpbGUgaW4gZGllIE5vdGl6IGVpbmxlc2VuLlxuIik7CisgIGlucHV0X3RvKCJnZXRfbm90ZV9saW5lIiwgSU5QVVRfUFJPTVBULCAiOiIpOworICByZXR1cm4gMTsKK30KKworaW50IGdldF9ub3RlX2xpbmUoc3RyaW5nIHN0cikKK3sKKyAgaW50IGVycjsKKyAgaWYgKHN0cj09IioqIiB8fCBzdHI9PSJ+LiIpCisgIHsKKyAgICB3cml0ZXI9MDsKKyAgICBzd2l0Y2ggKGVycj0oTkVXU1NFUlZFUi0+V3JpdGVOb3RlKG1lc3NhZ2UpKSkKKyAgICB7CisgICAgICBjYXNlIDE6ICB3cml0ZSgiT2ssIE5hY2hyaWNodCBhdWZnZWhhZW5ndC5cbiIpOworCSAgICAgICBzYXkobWVzc2FnZVtNX1dSSVRFUl0rIiBoYXQgZWluZSBOYWNocmljaHQgYW5zIEJyZXR0IGdlaGFlbmd0LlxuIik7CisJICAgICAgIHJldHVybiAxOworCSAgICAgICBjYXNlIC0xOiB3cml0ZSgiRHUgZGFyZnN0IGxlaWRlciBrZWluZSBOYWNocmljaHRlbiBoaWVyIGF1ZmhhZW5nZW4uXG4iKTsKKwkgICAgICAgcmV0dXJuIDE7CisJICAgICAgIGNhc2UgLTM6IHdyaXRlKCJEYXMgQnJldHQgaXN0IGxlaWRlciB2b2xsICFcbiIpOworCSAgICAgICByZXR1cm4gMTsKKwkgICAgICAgZGVmYXVsdDogd3JpdGUoIkludGVybmVyIEZlaGxlciAiK2VycisiIGF1ZmdldHJldGVuICEgQml0dGUgRXJ6bWFnaWVyIHZlcnN0YWVuZGlnZW4uXG4iKTsKKwkgICAgICAgcmV0dXJuIDE7CisJICAgICB9CisgIH0KKyAgaWYgKHN0cj09In5xIikKKyAgeworICAgIHdyaXRlcj0wOworICAgIHdyaXRlKCJOb3RpeiBuaWNodCBhbmdlaGVmdGV0LlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKHN0clswLi4xXT09In5yIiAmJiBJU19XSVpBUkQodGhpc19wbGF5ZXIoKSkpIHsKKyAgICBzdHI9c3RyWzIuLjwxXTsKKyAgICBpZiAoc3RyWzBdPT0nICcpIHN0cj1zdHJbMS4uPDFdOworICAgIGlmICghc3RyIHx8IGNhdGNoKGVycj1maWxlX3NpemUoc3RyKTtwdWJsaXNoKSB8fCBlcnI8MCkgeworICAgICAgd3JpdGUoIkZpbGUgbmljaHQgZ2VmdW5kZW4uXG4iKTsKKyAgICAgIGlucHV0X3RvKCJnZXRfbm90ZV9saW5lIiwgSU5QVVRfUFJPTVBULCAiOiIpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHN0cj1yZWFkX2ZpbGUoc3RyKTsKKyAgICBpZiAoIXN0cil7CisgICAgICB3cml0ZSgiWnUgZ3Jvc3MhXG4iKTsKKyAgICAgIGlucHV0X3RvKCJnZXRfbm90ZV9saW5lIiwgSU5QVVRfUFJPTVBULCAiOiIpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHdyaXRlKCJPay5cbiIpOworICB9CisgIGlmIChtZXNzYWdlW01fTUVTU0FHRV0gJiYgbWVzc2FnZVtNX01FU1NBR0VdIT0iIikgbWVzc2FnZVtNX01FU1NBR0VdKz0iXG4iOworICBtZXNzYWdlW01fTUVTU0FHRV0rPXN0cjsKKyAgaW5wdXRfdG8oImdldF9ub3RlX2xpbmUiLCBJTlBVVF9QUk9NUFQsICI6Iik7CisgIHJldHVybiAxOworfQorCitpbnQgbGllcyhzdHJpbmcgc3RyKQoreworICBpbnQgbnVtOworICBtaXhlZCAqbWVzc2FnZXM7CisKKyAgaWYgKCFzdHIgfHwgc3RyPT0iIiB8fCBzc2NhbmYoc3RyLCIlZCIsbnVtKSE9MSB8fCBudW08PTApCisgIHsKKyAgICBfbm90aWZ5X2ZhaWwoIldFTENIRSBOYWNocmljaHQgd2lsbHN0IER1IGxlc2VuID9cbiIpOworICAgIHJldHVybiAwOworICB9CisgIG51bS0tOworICBtZXNzYWdlcz0oTkVXU1NFUlZFUi0+R2V0Tm90ZXMoR1JPVVApKTsKKyAgaWYgKHNpemVvZihtZXNzYWdlcyk8PW51bSkKKyAgeworICAgIF9ub3RpZnlfZmFpbCgiU28gdmllbGUgTmFjaHJpY2h0ZW4gc2luZCBkYSBuaWNodCAhXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICB0aGlzX3BsYXllcigpLT5Nb3JlKG1lc3NhZ2VzW251bV1bTV9USVRMRV0rIiAoIittZXNzYWdlc1tudW1dW01fV1JJVEVSXSsiLCAiKworICAgICAgZHRpbWUobWVzc2FnZXNbbnVtXVtNX1RJTUVdKVs1Li4yNl0gKyAiKTpcbiIgKyAKKyAgICAgICBtZXNzYWdlc1tudW1dW01fTUVTU0FHRV0pOworICByZXR1cm4gMTsKK30KKworaW50IGxvZXNjaGUoc3RyaW5nIHN0cikKK3sKKyAgaW50IG51bTsKKworICBpZiAoIXN0ciB8fCBzdHI9PSIiIHx8IHNzY2FuZihzdHIsIiVkIixudW0pIT0xIHx8IG51bTw9MCkKKyAgeworICAgIF9ub3RpZnlfZmFpbCgiV0VMQ0hFIE5hY2hyaWNodCB3aWxsc3QgRHUgbG9lc2NoZW4gP1xuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgbnVtLS07CisgIHN3aXRjaCAoTkVXU1NFUlZFUi0+UmVtb3ZlTm90ZShHUk9VUCwgbnVtKSl7CisgICAgY2FzZSAxOiB3cml0ZSgiT2suXG4iKTsKKwkgICAgc2F5KHRoaXNfcGxheWVyKCktPm5hbWUoKSsiIGVudGZlcm50IGVpbmUgTmFjaHJpY2h0IHZvbSBCcmV0dC5cbiIpOworCSAgICByZXR1cm4gMTsKKwkgICAgY2FzZSAtMTogd3JpdGUoIkRhcyBkYXJmc3QgRHUgbmljaHQuXG4iKTsKKwkgICAgc2F5KHRoaXNfcGxheWVyKCktPm5hbWUoKSsiIHZlcnN1Y2h0LCBlaW5lIE5hY2hyaWNodCB2b20gQnJldHQgenUgcmVpc3Nlbi5cbiIpOworCSAgICByZXR1cm4gMTsKKwkgICAgY2FzZSAtMzogd3JpdGUoIlNvIHZpZWxlIE5hY2hyaWNodGVuIHNpbmQgZGEgbmljaHQgIVxuIik7CisJICAgIHJldHVybiAxOworCSAgICBkZWZhdWx0OiB3cml0ZSgiSW50ZXJuZXIgRmVobGVyLiBCaXR0ZSBFcnptYWdpZXIgdmVyc3RhZW5kaWdlbiAhXG4iKTsKKwkgICAgcmV0dXJuIDE7CisJICB9CisgIHJldHVybiAwOworfQorCit2b2lkIENydW1ibGUoKQoreworICBpZiAoZW52aXJvbm1lbnQoKSAmJiBsaXZpbmcoZW52aXJvbm1lbnQoKSkpCisgICAgcmV0dXJuOworICBzYXkoY2FwaXRhbGl6ZShuYW1lKFdFUikpKyIgemVyZmFlbGx0IHp1IFN0YXViLCBkZXIgc2ljaCBzb2ZvcnQgdmVydGVpbHQuXG4iKTsKKyAgd3JpdGUoY2FwaXRhbGl6ZShuYW1lKFdFUikpKyIgemVyZmFlbGx0IHp1IFN0YXViLCBkZXIgc2ljaCBzb2ZvcnQgdmVydGVpbHQuXG4iKTsKKyAgcmVtb3ZlKCk7Cit9CisKK3ZhcmFyZ3MgaW50IG1vdmUob2JqZWN0IHRhcmdldCxtaXhlZCBtZXRob2QpCit7CisgIGlmIChvYmplY3RwKHRhcmdldCkmJiFsaXZpbmcodGFyZ2V0KSYmZW52aXJvbm1lbnQoKSYmbGl2aW5nKGVudmlyb25tZW50KCkpKQorICAgIGNhbGxfb3V0KCJDcnVtYmxlIiwzMCtyYW5kb20oMzApKTsKKyAgcmV0dXJuIDo6bW92ZSh0YXJnZXQsIG1ldGhvZCk7Cit9CmRpZmYgLS1naXQgYS9zdGQvbnBjLmMgYi9zdGQvbnBjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYxMmYxZQotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9ucGMuYwpAQCAtMCwwICsxLDE3NSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIG5wYy5jIC0tIGEgZ2VuZXJpYyBucGMgKG5vbiBwbGF5ZXIgY2hhcmFjdGVyKQorLy8KKy8vIFRlc3R2ZXJzaW9uIG1pdCBzdXBwb3J0IGZ1ZXIgQWRkSXRlbQorLy8gc29sbCBzcGFldGVyIGluIG5wYy5jIGF1ZmdlaGVuCisvLworLy8gJElkOiBucGMuYyA5NDc4IDIwMTYtMDItMTkgMjE6MTg6MzVaIFplc3N0cmEgJAorI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCitpbmhlcml0ICIvc3RkL3RoaW5nL3Byb3BlcnRpZXMiOworaW5oZXJpdCAiL3N0ZC9ob29rX3Byb3ZpZGVyIjsKK2luaGVyaXQgIi9zdGQvbGl2aW5nL2Rlc2NyaXB0aW9uIjsKK2luaGVyaXQgIi9zdGQvbGl2aW5nL2xpZ2h0IjsKK2luaGVyaXQgIi9zdGQvbGl2aW5nL2xpZmUiOworaW5oZXJpdCAiL3N0ZC9saXZpbmcvYXR0cmlidXRlcyI7Citpbmhlcml0ICIvc3RkL25wYy9tb3ZpbmciOworaW5oZXJpdCAiL3N0ZC9saXZpbmcvc2tpbGxfYXR0cmlidXRlcyI7Citpbmhlcml0ICIvc3RkL2xpdmluZy9za2lsbHMiOworaW5oZXJpdCAiL3N0ZC9saXZpbmcvY2xvdGhpbmciOworaW5oZXJpdCAiL3N0ZC9ucGMvY29tYmF0IjsKK2luaGVyaXQgIi9zdGQvbnBjL2NoYXQiOworaW5oZXJpdCAiL3N0ZC9ucGMvY29tbSI7Citpbmhlcml0ICIvc3RkL2NvbnRhaW5lci9yZXN0cmljdGlvbnMiOworaW5oZXJpdCAiL3N0ZC90aGluZy9jb21tYW5kcyI7Citpbmhlcml0ICIvc3RkL3RoaW5nL2xhbmd1YWdlIjsKK2luaGVyaXQgIi9zdGQvbnBjL2luZm8iOworaW5oZXJpdCAiL3N0ZC9ucGMvcHV0X2FuZF9nZXQiOworaW5oZXJpdCAiL3N0ZC9ucGMvaXRlbXMiOworaW5oZXJpdCAiL3N0ZC90aGluZy9lbnZjaGsiOworaW5oZXJpdCAiL3N0ZC9saXZpbmcvaGVscGVycyI7CisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8YW5zaS5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPGxpdmluZy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8YXR0cmlidXRlcy5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxoZWFsdGguaD4KKyNpbmNsdWRlIDxucGMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDxndWFyZC5oPgorCitzdGF0aWMgaW50IF9zZXRfbGV2ZWwoaW50IGFyZyk7CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7IAorICBzZXRldWlkKGdldHVpZCgpKTsKKyAgcHJvcGVydGllczo6Y3JlYXRlKCk7CisgIHJlc3RyaWN0aW9uczo6Y3JlYXRlKCk7CisgIGNvbW1hbmRzOjpjcmVhdGUoKTsKKyAgbGlnaHQ6OmNyZWF0ZSgpOworICBkZXNjcmlwdGlvbjo6Y3JlYXRlKCk7CisgIGF0dHJpYnV0ZXM6OmNyZWF0ZSgpOworICBjbG90aGluZzo6Y3JlYXRlKCk7CisgIGxpZmU6OmNyZWF0ZSgpOworICBlbmFibGVfY29tbWFuZHMoKTsKKyAgY29tbTo6Y3JlYXRlKCk7CisgIGNvbWJhdDo6Y3JlYXRlKCk7CisgIGluZm86OmNyZWF0ZSgpOworICBwdXRfYW5kX2dldDo6YWRkX3B1dF9hbmRfZ2V0X2NvbW1hbmRzKCk7CisgIGFkZF90ZWFtX2NvbW1hbmRzKCk7CisgIGl0ZW1zOjpjcmVhdGUoKTsKKyAgZW52Y2hrOjpjcmVhdGUoKTsKKyAgbW92aW5nOjpjcmVhdGUoKTsKKworICBhZGRfYWN0aW9uKCJVc2VTcGVsbCIsIiIsMSk7CisKKyAgU2V0UHJvcChQX0xJR0hUX01PRElGSUVSLCAxKTsKKyAgU2V0UHJvcChQX1dFSUdIVF9QRVJDRU5ULCAxMDApOworICBTZXRQcm9wKFBfTkFNRSwgIk5pZW1hbmQiKTsKKyAgU2V0UHJvcChQX01TR0lOLCAia29tbXQgYW4iKTsKKyAgU2V0UHJvcChQX01TR09VVCwgImdlaHQiKTsKKyAgU2V0UHJvcChQX01NU0dJTiwgImVyc2NoZWludCBpbiBlaW5lciBSYXVjaHdvbGtlIik7CisgIFNldFByb3AoUF9NTVNHT1VULCAidmVyc2Nod2luZGV0IG1pdCBLbmFsbCB1bmQgU2Nod2VmZWxkdWZ0Iik7CisgIFNldFByb3AoUF9HRU5ERVIsIE5FVVRFUiApOworICBTZXRQcm9wKFBfV0VJR0hULCA3NTAwMCk7CisgIFNldFByb3AoUF9NQVhfV0VJR0hULCA1MDAwMCk7CisgIFNldFByb3AoUF9SQUNFLCAiTnBjIik7CisgIFNldFByb3AoUF9NQVhfSFAsMTAwKTsKKyAgU2V0UHJvcChQX01BWF9TUCwxMDApOworICBTZXRQcm9wKFBfSFAsNTApOworICBTZXRQcm9wKFBfU1AsNTApOworICBTZXRQcm9wKFBfTUFYX0FMQ09IT0wsMTAwKTsKKyAgU2V0UHJvcChQX01BWF9EUklOSywxMDApOworICBTZXRQcm9wKFBfTUFYX0ZPT0QsMTAwKTsKKyAgU2V0UHJvcChQX0RSSU5LLCAwKTsKKyAgU2V0UHJvcChQX0ZPT0QsIDApOworICBTZXRQcm9wKFBfQUxDT0hPTCwgMCk7CisgIFNldFByb3AoUF9IQU5EUywgKHsgIiIsIDMwIH0pICk7CisgIFNldFByb3AoUF9NQVhfSEFORFMsIDIpOworICBTZXRQcm9wKFBfTlBDLCAxKTsKKyAgU2V0UHJvcChQX0dVQVJELDEwMCk7CisgIFNldFByb3AoUF9OT19UUE9SVCxOT19UUE9SVF9JTik7CisKKyAgc2V0X2hlYXJ0X2JlYXQoMSk7CisgIGhlYXJ0YmVhdD0xOworfQorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGVfc3VwZXIoKSB7CisgIHNldF9uZXh0X3Jlc2V0KC0xKTsKK30KKwordm9pZCByZXNldCgpeworICBpdGVtczo6cmVzZXQoKTsKKyAgY29tYmF0OjpyZXNldCgpOworfQorCitzdGF0aWMgaW50IF9zZXRfbGV2ZWwoaW50IGFyZykKK3sKKyAgU2V0KFBfTEVWRUwsIGFyZyk7CisgIFNldEF0dHIoQV9DT04sIGFyZyk7CisgIFNldEF0dHIoQV9ERVgsIGFyZyk7CisgIFNldEF0dHIoQV9JTlQsIGFyZyk7CisgIFNldEF0dHIoQV9TVFIsIGFyZyk7CisgIHJldHVybihhcmcpOyAvL1J1ZWNrZ2FiZXdlcnQgbm9ldGlnIQorfQorCit2YXJhcmdzIHZvaWQgY3JlYXRlX2RlZmF1bHRfbnBjKGludCBsZXZlbCwgaW50IG1heGhwKQoreyAKKyAgaWYobGV2ZWwgPCAxKSByZXR1cm47CisgIFNldFByb3AoUF9MRVZFTCwgbGV2ZWwpOworICBpZiAobWF4aHA8PTApIG1heGhwID0gNDIgKyBsZXZlbCo4OworICBTZXRQcm9wKFBfTUFYX0hQLCBtYXhocCk7CisgIFNldFByb3AoUF9NQVhfU1AsIG1heGhwKTsKKyAgU2V0UHJvcChQX0hBTkRTLCAoeyIgbWl0IGJsb3NzZW4gSGFlbmRlbiIsIGxldmVsKjEwIH0pICk7CisgIFNldFByb3AoUF9CT0RZLCAobGV2ZWwqMjApLzMpOworICBTZXRQcm9wKFBfWFAsIGxldmVsICogbWF4aHAgKiA1MCk7Cit9IAorCitwcm90ZWN0ZWQgdm9pZCBoZWFydF9iZWF0KCkKK3sKKyAgaWYoIGVudmlyb25tZW50KCkgKSBsaWZlOjpoZWFydF9iZWF0KCk7CisgIGlmICghdGhpc19vYmplY3QoKSkgcmV0dXJuOyAvLyBFdnRsLiBhbiBHaWZ0IGdlc3RvcmJlbi4uLgorICBjb21iYXQ6OmhlYXJ0X2JlYXQoKTsKKyAgY2hhdDo6aGVhcnRfYmVhdCgpOworfQorCit2b2lkIGdpdmVfbm90aWZ5KG9iamVjdCBvYikKK3sKKyAgcHV0X2FuZF9nZXQ6OmdpdmVfbm90aWZ5KG9iKTsKK30KKworLy8gRm9yY2UgdGhlIG1vbnN0ZXIgdG8gZG8gYSBjb21tYW5kLgoraW50IGNvbW1hbmRfbWUoc3RyaW5nIGNtZCkgeyByZXR1cm4gY29tbWFuZChjbWQpOyB9CisKK3ZvaWQgaW5pdCgpCit7CisgIGNvbWJhdDo6aW5pdCgpOworICBpbmZvOjppbml0KCk7CisgIGNvbW1hbmRzOjppbml0KCk7CisvLyAgZGVzY3JpcHRpb246OmluaXQoKTsKK30KKworLy8gaXRlbXMgaW5pdGlhbGlzaWVyZW4/Citwcm90ZWN0ZWQgdm9pZCBOb3RpZnlNb3ZlKG9iamVjdCBkZXN0LCBvYmplY3Qgb2xkZW52LCBpbnQgbWV0aG9kKSB7CisgICAgCisgIDo6Tm90aWZ5TW92ZShkZXN0LCBvbGRlbnYsIG1ldGhvZCk7CisgIC8vIGdlc3RvcmJlbj8KKyAgaWYgKCFvYmplY3RwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisKKyAgaWYgKCBRdWVyeShOUENfTkVFRFNfSVRFTV9JTklULCBGX1ZBTFVFKSkKKyAgICAgIF9jbG9uZV9pdGVtcygpOworfQorCitzdHJpbmcgX3F1ZXJ5X3JhY2UoKQoreworICAgaWYgKHN0cmluZ3AoUXVlcnkoUF9SQUNFKSkpIHJldHVybiBjYXBpdGFsaXplKFF1ZXJ5KFBfUkFDRSkpOworfQpkaWZmIC0tZ2l0IGEvc3RkL25wYy9jaGF0LmMgYi9zdGQvbnBjL2NoYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjRmODliCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL25wYy9jaGF0LmMKQEAgLTAsMCArMSw2NiBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIG5wYy9jaGF0LmMgLS0gTGFiZXJuZGUgTlBDcworLy8KKy8vICRJZDogY2hhdC5jIDY4MDEgMjAwOC0wMy0yMSAyMzozNDo0NlogWmVzc3RyYSAkCisjcHJhZ21hIHN0cm9uZ190eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPGxpdmluZy9jb21iYXQuaD4KKyNpbmNsdWRlIDx0aGluZy9wcm9wZXJ0aWVzLmg+CisjdW5kZWYgTkVFRF9QUk9UT1RZUEVTCisKKyNkZWZpbmUgTUUgdGhpc19vYmplY3QoKQorCisvKgorICogU29tZSBzaW1wbGUgY2hhdCB2YXJpYWJsZXMKKyAqLworCisvKgorICogaGVhcnRfYmVhdCBpcyBjYWxsZWQgc28gdGhlIG1vbnN0ZXIgbWF5IGNoYXQuCisgKi8KK3ZvaWQgU2V0Q2hhdHMoaW50IGNoYW5jZSwgbWl4ZWQgc3RycykgeworICBpZiAoIXBvaW50ZXJwKHN0cnMpKQorICAgIHJldHVybjsKKyAgU2V0UHJvcChQX0NIQVRfQ0hBTkNFLGNoYW5jZSk7CisgIFNldFByb3AoUF9DSEFUUyxzdHJzKTsKK30KKwordm9pZCBTZXRBdHRhY2tDaGF0cyhpbnQgY2hhbmNlLCBtaXhlZCBzdHJzKSB7CisgIGlmICghcG9pbnRlcnAoc3RycykpCisgICAgcmV0dXJuOworICBTZXRQcm9wKFBfQUNIQVRfQ0hBTkNFLGNoYW5jZSk7CisgIFNldFByb3AoUF9BQ0hBVFMsc3Rycyk7Cit9CisKK3ZvaWQgRG9BdHRhY2tDaGF0KCkgeworICBzdHJpbmcqIGM7CisgIGlmICghTUUgfHwgIWVudmlyb25tZW50KE1FKSkKKyAgICByZXR1cm47CisgIGlmIChRdWVyeVByb3AoUF9ESVNBQkxFX0FUVEFDSyk+MClyZXR1cm4gOworICBpZiAocmFuZG9tKDEwMCkgPCBRdWVyeVByb3AoUF9BQ0hBVF9DSEFOQ0UpKQorICAgIGlmICgoYyA9IFF1ZXJ5UHJvcChQX0FDSEFUUykpICYmIHNpemVvZihjKSkgCisgICAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoTUUpLAorCQlwcm9jZXNzX3N0cmluZyhjW3JhbmRvbShzaXplb2YoYykpXSkpOworfQorCit2b2lkIERvQ2hhdCgpIHsKKyAgc3RyaW5nICpjOworICBpZiAoIU1FIHx8ICFlbnZpcm9ubWVudChNRSkpCisgICAgcmV0dXJuOworICBpZiAocmFuZG9tKDEwMCkgPCBRdWVyeVByb3AoUF9DSEFUX0NIQU5DRSkpCisgICAgaWYgKChjID0gUXVlcnlQcm9wKFBfQ0hBVFMpKSAmJiBzaXplb2YoYykpIAorICAgICAgdGVsbF9yb29tKGVudmlyb25tZW50KE1FKSwKKwkJcHJvY2Vzc19zdHJpbmcoY1tyYW5kb20oc2l6ZW9mKGMpKV0pKTsKK30KKworcHJvdGVjdGVkIHZvaWQgaGVhcnRfYmVhdCgpCit7CisgIGlmKCBJbkZpZ2h0KCkgKSBEb0F0dGFja0NoYXQoKTsKKyAgZWxzZSAgICAgICAgICAgIERvQ2hhdCgpOworfQpkaWZmIC0tZ2l0IGEvc3RkL25wYy9jb21iYXQuYyBiL3N0ZC9ucGMvY29tYmF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ3NzE0YgotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9ucGMvY29tYmF0LmMKQEAgLTAsMCArMSw0MDcgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBucGMvY29tYmF0LmMgLS0gTlBDLXNwZXppZmlzY2hlIEthbXBmZnVua3Rpb25lbgorLy8KKy8vICRJZDogY29tYmF0LmMgOTQ4OCAyMDE2LTAyLTE5IDIxOjI0OjA0WiBBcmF0aG9ybiAkCisjcHJhZ21hIHN0cm9uZ190eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisKK2luaGVyaXQgInN0ZC9saXZpbmcvY29tYmF0IjsKKworI2luY2x1ZGUgPGNvbWJhdC5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPGhlYWx0aC5oPgorI2luY2x1ZGUgPG5ld19za2lsbHMuaD4KKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMgMQorI2luY2x1ZGUgPGxpdmluZy9saWZlLmg+CisjdW5kZWYgTkVFRF9QUk9UT1RZUEVTCisKKyNkZWZpbmUgSEJfQ0hFQ0sgNworI2RlZmluZSBNRSB0aGlzX29iamVjdCgpCisjZGVmaW5lIFNUQVRNQVNURVIgIi9wL3NlcnZpY2Uvcm9jaHVzL2d1aWxkc3RhdC9tYXN0ZXIiCisKK25vc2F2ZSBpbnQgaGVhcnRiZWF0LCBiZWF0Y291bnQ7CisKK3ByaXZhdGUgdm9pZCBjYXRjaF91cF9oYnMoKTsKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkgeworICA6OmNyZWF0ZSgpOworICBiZWF0Y291bnQ9MTsKKyAgaGVhcnRiZWF0PTE7Cit9CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZV9zdXBlcigpIHsKKyAgc2V0X25leHRfcmVzZXQoLTEpOworfQorCisvLyBha3R1ZWxsZXMgTGViZXdlc2VuLCBmdWVyIGRhcyBkaWVzZXIgTlBDIGdlcmFkZSB0YWV0aWcgaXN0LiBEZWZhdWx0OgorLy8gU3BpZWxlciwgYmVpIGRlbSBlciBhbHMgSGVsZmVyLU5QQyByZWdpc3RyaWVydCBpc3QuCitwdWJsaWMgb2JqZWN0IFF1ZXJ5VXNlcigpCit7CisgIG1peGVkIGhlbHBlcmRhdGEgPSBRdWVyeVByb3AoUF9IRUxQRVJfTlBDKTsKKyAgaWYgKHBvaW50ZXJwKGhlbHBlcmRhdGEpICYmIG9iamVjdHAoaGVscGVyZGF0YVswXSkpCisgICAgcmV0dXJuIGhlbHBlcmRhdGFbMF07CisgIHJldHVybiAwOworfQorCisvLyBnZ2YuIEZlaW5kZSBleHBpcmVuLiBTb2xsIGRhcyBQcm9ibGVtIHZlcnJpbmdlcm4sIGRhc3MgU3BpZWxlciBuYWNoIFRhZ2VuCisvLyBlcnN0IGRpZSBNZWxkdW5nIGtyaWVnZW4sIGRhc3MgZGVyIE5QQyBzaWUgbmljaHQgbWVociBqYWd0LCB3ZW5uIGRlciBIQgorLy8gcmVha3RpdmVydCB3aXJkLgordm9pZCByZXNldCgpIHsKKyAgLy8gZ2dmLiBkaWUgYWJnZXNjaGFsdGV0ZW4gSEJzIG5hY2hob2xlbi4KKyAgaWYgKCFoZWFydGJlYXQpCisgICAgY2F0Y2hfdXBfaGJzKCk7CisgIC8vIGdnZi4gUF9FTkVNWV9EQU1BR0UgenVydWVja3NldHplbgorICBSZXNldEVuZW15RGFtYWdlKCk7Cit9CisKK3N0YXRpYyB2b2lkIF9zZXRfbWF4X2hwKGludCBpKSB7CisgIFNldChQX01BWF9IUCxpKTsKKyAgU2V0UHJvcChQX0hQLGkpOworfQorCitzdGF0aWMgdm9pZCBfc2V0X21heF9zcChpbnQgaSkgeworICBTZXQoUF9NQVhfU1AsaSk7CisgIFNldFByb3AoUF9TUCxpKTsKK30KKworCisvLyBDaGVjay1GdW5rdGlvbiBmdWVyIGRpZSBQX05PX0FUVEFDSy1RdWVyeU1ldGhvZAorc3RhdGljIG1peGVkIF9jaGVja19pbW1vcnRhbGl0eSgpCit7CisgICAgaW50IHQ7CisKKyAgICBpZiAoICEodCA9IFF1ZXJ5KCJ0aW1lX3RvX21vcnRhbGl0eSIpKSB8fCB0aW1lKCkgPiB0ICl7CisgICAgICAgIC8vIFplaXQgaXN0IGFiZ2VsYXVmZW4gLSB3aWVkZXIgYW5ncmVpZmJhciBtYWNoZW4KKyAgICAgICAgU2V0KCBQX05PX0FUVEFDSywgMCwgRl9RVUVSWV9NRVRIT0QgKTsKKyAgICAgICAgaGVhcnRiZWF0ID0gMTsKKyAgICAgICAgYmVhdGNvdW50ID0gMTsKKyAgICAgICAgc2V0X2hlYXJ0X2JlYXQoMSk7CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gZGVyIE5QQyBpc3Qgbm9jaCB1bmFuZ3JlaWZiYXIKKyAgICByZXR1cm4gYnJlYWtfc3RyaW5nKCBjYXBpdGFsaXplKG5hbWUoIFdFUiwgMSApKSArICIgdmVyc3RlY2t0IHNpY2ggaGludGVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZWluZW0gRmVobGVyIGltIFJhdW0tWmVpdC1HZWZ1ZWdlIHVuZCBlbnRnZWh0IHNvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAidm9ydWViZXJnZWhlbmQgYWxsZW4gQW5ncmlmZmVuLiIsIDc4ICk7Cit9CisKKworLy8gd2VubiBkZXIgSGVhcnRCZWF0IGJ1Z2d0LCB3aXJkIGRpZXNlIEZ1bmt0aW9uIHZvbSBNYXN0ZXIgYXVmZ2VydWZlbgorcHVibGljIHZvaWQgbWFrZV9pbW1vcnRhbCgpCit7CisgICAgLy8gZnVlciA1IE1pbnV0ZW4gdW5hbmdyZWlmYmFyIG1hY2hlbgorICAgIFNldCggUF9OT19BVFRBQ0ssICMnX2NoZWNrX2ltbW9ydGFsaXR5LCBGX1FVRVJZX01FVEhPRCApOworCisgICAgU2V0KCAidGltZV90b19tb3J0YWxpdHkiLCB0aW1lKCkgKyAzMDAsIEZfVkFMVUUgKTsKKworICAgIC8vIGRhbWl0IGRpZSBTcGllbGVyIGtlaW5lbiBWb3J0ZWlsIGR1cmNoIGRlbiBCdWcgaGFiZW4sIGhlaWxlbgorICAgIGhlYWxfc2VsZigxMDAwMCk7CisKKyAgICAvLyBkYSBudW4gZGVyIEhlYXJ0YmVhdCBhYmdlc2NoYWx0ZXQgaXN0IHVuZCBub3JtYWxlcndlaXNlIGVyc3QKKyAgICAvLyByZWFrdGl2aWVydCB3aXJkLCBzb2JhbGQgamVtYW5kIG5hY2ggNW1pbiBQX05PX0FUVEFDSyBhYmZyYWd0LCBtdXNzIG1hbgorICAgIC8vIGFiZXIgYXVmIFZpZWNoZXIgYWNodGVuLCBkaWUgaW1tZXIgbmVuIEhlYXJ0YmVhdCBoYWJlbiB3b2xsZW4uIEluIGRlbQorICAgIC8vIGZhbGwgcGVyIGNhbGxfb3V0IHNlbGJlciBkaWUgUHJvcCBhYmZyYWdlbi4KKyAgICBpZiAoUXVlcnlQcm9wKFBfSEIpKQorICAgICAgY2FsbF9vdXQoIydRdWVyeVByb3AsIDMwMSwgUF9OT19BVFRBQ0spOworfQorCisKKy8vIERhbWl0IE5QQ3MgZ2VnZW5laW5hbmRlciB3ZWl0ZXJrYWVtcGZlbiwgYXVjaCB3ZW5uIGtlaW4gU3BpZWxlcgorLy8gaW4gZGVyIE5hZWhlIGlzdDoKK3N0YXRpYyBpbnQgX3F1ZXJ5X2hiKCkKK3sKKyAgICAvLyBUT0RPOiByZXR1cm4gSW5GaWdodCgpIHx8IFF1ZXJ5KFBfSEIsIEZfVkFMVUUpLCBzb2JhbGQgSW5GaWdodCgpCisgICAgLy8gZ2VhZW5kZXJ0LgorICAgIHJldHVybiAoSW5GaWdodCgpIHx8IFF1ZXJ5KFBfSEIsRl9WQUxVRSkpID8gMSA6IDA7Cit9CisKKworI2RlZmluZSBTUEVMTF9UT1RBTFJBVEUgMAorI2RlZmluZSBTUEVMTF9EQU1BR0UgMQorI2RlZmluZSBTUEVMTF9URVhUX0ZPUl9FTkVNWSAyCisjZGVmaW5lIFNQRUxMX1RFWFRfRk9SX09USEVSUyAzCisjZGVmaW5lIFNQRUxMX0RBTVRZUEUgNAorI2RlZmluZSBTUEVMTF9GVU5DIDUKKyNkZWZpbmUgU1BFTExfQVJHIDYKKwordmFyYXJncyBpbnQgQWRkU3BlbGwoaW50IHJhdGUsIGludCBkYW1hZ2UsIHN0cmluZyBUZXh0Rm9yRW5lbXksCisgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgVGV4dEZvck90aGVycywgc3RyaW5nfHN0cmluZyogZGFtX3R5cGUsIHN0cmluZyBmdW5jLAorICAgICAgICAgICAgICAgICAgICAgaW50fG1hcHBpbmcgc3BlbGxhcmcpIHsKKyAgbWl4ZWQgKnNwZWxsczsKKyAgaW50IHRvdGFsX3JhdGVzOworCisgIGlmIChyYXRlPDAgfHwgZGFtYWdlPD0wIHx8ICFzdHJpbmdwKFRleHRGb3JFbmVteSkgfHwKKyAgICAgICFzdHJpbmdwKFRleHRGb3JPdGhlcnMpKQorICAgICByZXR1cm4gMDsKKworICBpZiAoc3RyaW5ncChkYW1fdHlwZSkpCisgICAgIGRhbV90eXBlID0gKHtkYW1fdHlwZX0pOworICBlbHNlIGlmICghcG9pbnRlcnAoZGFtX3R5cGUpKQorICAgICAgZGFtX3R5cGUgPSAoe0RUX01BR0lDfSk7CisgIAorICAvLyBUYXRzYWVjaGxpY2ggaXN0IGVzIGltbWVyIGVpbiBuaWNodC1waHlzaXNjaGVyIEFuZ3JpZmYsIHdlbm4gc3BlbGxhcmcgZWluCisgIC8vIGludCBpc3QsIHdlaWwgd2VubiBzcGVsbGFyZz09MCBpc3QgZGVyIERlZmF1bHQgbmljaHQtcGh5c2lzY2hlciBBbmdyaWZmCisgIC8vIHVuZCBiZWkgc3BlbGxhcmchPTAgYXVjaC4gTnVyIG1pdCBlaW5lbSBtYXBwaW5nIGthbm4gbWFuIGVpbmVuIHBoeXMuCisgIC8vIEFuZ3JpZmYgZXJ6ZXVnZW4uCisgIGlmIChpbnRwKHNwZWxsYXJnKSkKKyAgICBzcGVsbGFyZyA9IChbU1BfUEhZU0lDQUxfQVRUQUNLOiAwXSk7CisKKyAgLy8gRmFsbHMgdm9yaGFuZGVuLCBhbHRlIFN5bnRheCBhdWYgZGllIHZvbiByZXBsYWNlX3BlcnNvbmFsKCkgYW5wYXNzZW4sCisgIC8vIGRpZSBpbSBoZWFydF9iZWF0KCkgYmVpbSBBdXNnZWJlbiBkZXIgTWVsZHVuZyB2ZXJ3ZW5kZXQgd2lyZC4KKyAgaWYgKCBzdHJzdHIoVGV4dEZvck90aGVycywgIkAiLCAwKSAhPSAtMSApCisgIHsKKyAgICAvLyBaZWljaGVuIG5hY2ggQFdFUiAmIENvIGluIHJ1bmRlIEtsYW1tZXJuIGVpbnNjaGxpZXNzZW4sIGRhbWl0IGVzIGFscworICAgIC8vIFN1Yi1QYXR0ZXJuIGltIEF1c2dhYmVzdHJpbmcgd2llZGVyaG9sdCB3ZXJkZW4ga2Fubi4gQW5zb25zdGVuIHd1ZXJkZQorICAgIC8vIGVzIG1pdCBlcnNldHp0LgorICAgIFRleHRGb3JPdGhlcnMgPSByZWdyZXBsYWNlKFRleHRGb3JPdGhlcnMsICJAV0VSKFteMS05XSkiLCAiQFdFUjFcXDEiLCAxKTsKKyAgICBUZXh0Rm9yT3RoZXJzID0gcmVncmVwbGFjZShUZXh0Rm9yT3RoZXJzLCAiQFdFU1NFTihbXjEtOV0pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQFdFU1NFTjFcXDEiLCAxKTsKKyAgICBUZXh0Rm9yT3RoZXJzID0gcmVncmVwbGFjZShUZXh0Rm9yT3RoZXJzLCAiQFdFTShbXjEtOV0pIiwgIkBXRU0xXFwxIiwgMSk7CisgICAgVGV4dEZvck90aGVycyA9IHJlZ3JlcGxhY2UoVGV4dEZvck90aGVycywgIkBXRU4oW14xLTldKSIsICJAV0VOMVxcMSIsIDEpOworICB9CisgIHRvdGFsX3JhdGVzPVF1ZXJ5KCJucGM6dG90YWxfcmF0ZXMiKStyYXRlOworICBzcGVsbHM9UXVlcnkoUF9TUEVMTFMpOworICBpZiAoIXBvaW50ZXJwKHNwZWxscykpCisgICAgc3BlbGxzPSh7fSk7CisgIHNwZWxscys9KHsoe3RvdGFsX3JhdGVzLCBkYW1hZ2UsIFRleHRGb3JFbmVteSwgVGV4dEZvck90aGVycywKKyAgICAgICAgICAgICAgZGFtX3R5cGUsIGZ1bmMsIHNwZWxsYXJnfSl9KTsKKyAgU2V0KFBfU1BFTExTLHNwZWxscyk7CisgIFNldCgibnBjOnRvdGFsX3JhdGVzIix0b3RhbF9yYXRlcyk7CisgIHJldHVybiAxOworfQorCitpbnQgQXV0b0F0dGFjayhvYmplY3Qgb2IpIHsKKyAgbWl4ZWQgbTsKKworICBpZiAoIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2IpKQorICAgIHJldHVybiAwOworICBpZiAobWFwcGluZ3AobT1RdWVyeVByb3AoUF9BR0dSRVNTSVZFKSkpIHsKKyAgICBtaXhlZCAqaW5kLHgsejsKKyAgICBmbG9hdCBmOworICAgIGludCBpLG47CisKKyAgICBpbmQ9bV9pbmRpY2VzKG0pLSh7MH0pO249MDtmPTAuMDsKKyAgICBmb3IgKGk9c2l6ZW9mKGluZCktMTtpPj0wO2ktLSkgeworICAgICAgeD1pbmRbaV07CisgICAgICBpZiAoKHo9bVt4XVtvYi0+UXVlcnlQcm9wKHgpXSkgfHwgKHo9bVt4XVswXSkpIHsKKyAgZj1mKyhmbG9hdCl6OworICBuKys7CisgICAgICB9CisgICAgfQorICAgIGlmIChuKQorICAgICAgbT1mLygoZmxvYXQpbik7CisgICAgZWxzZQorICAgICAgbT1tWzBdOworICB9CisgIGlmICgoKGludCkoMTAwKihtK29iLT5RdWVyeVByb3AoUF9BR0dSRVNTSVZFKSkpKTw9cmFuZG9tKDEwMCkpCisgICAgcmV0dXJuIDA7CisgIGlmICAoSVNfTEVBUk5FUihvYikKKyAgICAgICAmJiAob2ItPlF1ZXJ5UHJvcChQX0lOVklTKQorICAgICB8fCBvYi0+UXVlcnlQcm9wKFBfV0FOVFNfVE9fTEVBUk4pKSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgU3BlbGxBdHRhY2sob2JqZWN0IGVuZW15KSB7Cit9CisKKyNpZiAwCitUSihzdHJpbmcgcykgeworICBvYmplY3QgbzsKKyAgaWYgKG89ZmluZF9wbGF5ZXIoImpvZiIpKQorICAgIHRlbGxfb2JqZWN0KG8sc3ByaW50ZigiJU86ICVzXG4iLHRoaXNfb2JqZWN0KCkscykpOworfQorI2Vsc2UKKyNkZWZpbmUgVEooeCkKKyNlbmRpZgorCitwcm90ZWN0ZWQgdm9pZCBoZWFydF9iZWF0KCkgeworICBpbnQgcixpOworICBtaXhlZCBlbnYsKnNwZWxscywgc2luZm87CisgIG9iamVjdCBlbmVteTsKKworICBpZiAoIC0tYmVhdGNvdW50IDwgMCApCisgICAgICBiZWF0Y291bnQgPSAwOworICAKKyAgaWYgKCFiZWF0Y291bnQgJiYgIVF1ZXJ5KFBfSEIpKSB7CisgICAgaWYgKCFlbnZpcm9ubWVudCgpKSB7CisgICAgICBzZXRfaGVhcnRfYmVhdCgwKTsKKyAgICAgIGhlYXJ0YmVhdCA9IDA7CisgICAgICBpZiggY2xvbmVwKHRoaXNfb2JqZWN0KCkpICkgcmVtb3ZlKCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghUXVlcnlQcm9wKFBfUE9JU09OKSkgeworICAgICAgLy8gU3BpZWxlciBhbndlc2VuZD8KKyAgICAgIGVudiA9IGZpbHRlcihhbGxfaW52ZW50b3J5KGVudmlyb25tZW50KCkpLCAjJ3F1ZXJ5X29uY2VfaW50ZXJhY3RpdmUpOworICAgICAgaWYgKCFzaXplb2YoZW52KSkgeworCS8vIE5laW4sIEhCcyBhYnNjaGFsdGVuLgorCXNldF9oZWFydF9iZWF0KDApOworCWhlYXJ0YmVhdD0wOworCVRKKCJPRkZcbiIpOworCWJlYXRjb3VudD1IQl9DSEVDSzsKKwlTZXQoIm5wYzpiZWF0X29mZl9udW0iLGFic29sdXRlX2hiX2NvdW50KCkpOworCXJldHVybjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgOjpoZWFydF9iZWF0KCk7CisgIGlmICghTUUpCisgICAgICByZXR1cm47CisgIGVuZW15PVNlbGVjdEVuZW15KCk7CisgIGlmIChRdWVyeVByb3AoUF9BR0dSRVNTSVZFKQorICAgICAgJiYgKCFlbmVteSB8fCBlbnZpcm9ubWVudCgpIT1lbnZpcm9ubWVudChlbmVteSkpCisgICAgICAmJiAhYmVhdGNvdW50KSB7CisgICAgYmVhdGNvdW50PUhCX0NIRUNLOworICAgIGVudj1maWx0ZXIoYWxsX2ludmVudG9yeShlbnZpcm9ubWVudCgpKSwjJ0F1dG9BdHRhY2spOworICAgIGlmICghc2l6ZW9mKGVudikpCisgICAgICAgcmV0dXJuOworICAgIGk9cmFuZG9tKHNpemVvZihlbnYpKTsKKyAgICBLaWxsKGVudltpXSk7CisgIH0KKyAgZWxzZSBpZiAoIWJlYXRjb3VudCkKKyAgICBiZWF0Y291bnQ9SEJfQ0hFQ0s7CisgIGlmICghb2JqZWN0cChlbmVteSkgfHxRdWVyeVByb3AoUF9ESVNBQkxFX0FUVEFDSyk+MCkKKyAgICByZXR1cm47CisgIFNwZWxsQXR0YWNrKGVuZW15KTsKKworICBpZiAoIXBvaW50ZXJwKHNwZWxscz1RdWVyeShQX1NQRUxMUykpCisgICAgICB8fCAhc2l6ZW9mKHNwZWxscykKKyAgICAgIHx8ICFvYmplY3RwKGVuZW15PVNlbGVjdEVuZW15KCkpCisgICAgICB8fCBlbnZpcm9ubWVudChlbmVteSkhPWVudmlyb25tZW50KCkKKyAgICAgIHx8IChRdWVyeVByb3AoUF9ESVNBQkxFX0FUVEFDSyk+MCkKKyAgICAgIHx8IHJhbmRvbSgxMDApPlF1ZXJ5KFBfU1BFTExSQVRFKSkKKyAgICByZXR1cm47CisgIHI9cmFuZG9tKFF1ZXJ5KCJucGM6dG90YWxfcmF0ZXMiKSk7CisgIGZvciAoaT1zaXplb2Yoc3BlbGxzKS0xOyhpPjAgJiYgc3BlbGxzW2ktMV1bU1BFTExfVE9UQUxSQVRFXT5yKTtpLS0pCisgICAgOworICBzdHJpbmcgYWt0X3NwZWxsX21lc3MgPSBzcGVsbHNbaV1bU1BFTExfVEVYVF9GT1JfRU5FTVldOworICBpZiAoIHNpemVvZihha3Rfc3BlbGxfbWVzcykgKQorICAgIHRlbGxfb2JqZWN0KGVuZW15LCBicmVha19zdHJpbmcoYWt0X3NwZWxsX21lc3MsIDc4KSk7CisgIGFrdF9zcGVsbF9tZXNzID0gc3BlbGxzW2ldW1NQRUxMX1RFWFRfRk9SX09USEVSU107CisgIC8vIE51ciwgd2VubiB1ZWJlcmhhdXB0IGVpbmUgTWVsZHVuZyBnZXNldHp0IHd1cmRlLCBtdXNzIGRpZXNlIHZlcmFyYmVpdGV0CisgIC8vIHdlcmRlbi4KKyAgaWYgKHN0cmluZ3AoYWt0X3NwZWxsX21lc3MpICYmIHNpemVvZihha3Rfc3BlbGxfbWVzcykpCisgIHsKKyAgICBha3Rfc3BlbGxfbWVzcyA9IHJlcGxhY2VfcGVyc29uYWwoYWt0X3NwZWxsX21lc3MsICh7ZW5lbXl9KSwgMSk7CisgICAgc2F5KGJyZWFrX3N0cmluZyhha3Rfc3BlbGxfbWVzcywgNzgpLCh7ZW5lbXksIHRoaXNfb2JqZWN0KCl9KSk7CisgIH0KKyAgc2luZm8gPSBkZWVwX2NvcHkoc3BlbGxzW2ldW1NQRUxMX0FSR10pOworICBpZighbWFwcGluZ3Aoc2luZm8pKQorICAgIHNpbmZvPShbIFNJX01BR0lDX1RZUEUgOih7IE1UX0FOR1JJRkYgfSkgXSk7CisgIGVsc2UgaWYoIXNpbmZvW1NJX01BR0lDX1RZUEVdKQorICAgIHNpbmZvWyBTSV9NQUdJQ19UWVBFXT0oeyBNVF9BTkdSSUZGIH0pOworICBpZighc2luZm9bU1BfUEhZU0lDQUxfQVRUQUNLXSAmJgorICAgICAoZW5lbXktPlNwZWxsRGVmZW5kKHRoaXNfb2JqZWN0KCksc2luZm8pID4KKyAgICAgIHJhbmRvbShNQVhfQUJJTElUWStRdWVyeVByb3AoUF9MRVZFTCkqNTApKSl7CisgICAgdGVsbF9vYmplY3QoZW5lbXksIkR1IHdlaHJzdCBkZW4gU3BydWNoIGFiLlxuIik7CisgICAgc2F5KGVuZW15LT5OYW1lKFdFUiwxKSsiIHdlaHJ0IGRlbiBTcHJ1Y2ggYWIuXG4iLAorICAgICAgICAoeyBlbmVteSwgdGhpc19vYmplY3QoKX0pKTsKKyAgICByZXR1cm4gOworICB9CisgIGludCBkYW1hZ2UgPSByYW5kb20oc3BlbGxzW2ldW1NQRUxMX0RBTUFHRV0pKzE7CisgIGVuZW15LT5EZWZlbmQoZGFtYWdlLCBzcGVsbHNbaV1bU1BFTExfREFNVFlQRV0sCisgICAgICAgICAgICAgICAgc3BlbGxzW2ldW1NQRUxMX0FSR10sCisgICAgICAgICAgICAgICAgdGhpc19vYmplY3QoKSk7CisKKyAgLy8gRmFsbHMgZGVyIEdlZ25lciAob2RlciB3aXIpIGltIERlZmVuZCBzdGlyYnQsIGhpZXIgYWJicmVjaGVuCisgIGlmICggIW9iamVjdHAoTUUpIHx8ICFvYmplY3RwKGVuZW15KSAKKyAgICAgIHx8IGVuZW15LT5RdWVyeVByb3AoUF9HSE9TVCkgKSByZXR1cm47CisgIAorICBpZiAoc3BlbGxzW2ldW1NQRUxMX0ZVTkNdICYmIHN0cmluZ3Aoc3BlbGxzW2ldW1NQRUxMX0ZVTkNdKSkKKyAgICBjYXRjaChjYWxsX290aGVyKHRoaXNfb2JqZWN0KCksCisgICAgICAgICBzcGVsbHNbaV1bU1BFTExfRlVOQ10sCisgICAgICAgICBlbmVteSwKKyAgICAgICAgIGRhbWFnZSwKKyAgICAgICAgIHNwZWxsc1tpXVtTUEVMTF9EQU1UWVBFXSk7cHVibGlzaCk7Cit9CisKKy8vIEhlYXJ0YmVhdHMgbmFjaGhvbGVuLgorcHJpdmF0ZSB2b2lkIGNhdGNoX3VwX2hicygpIHsKKyAgLy8gZ2lidCBlcyBIQnMgenVtIG5hY2hob2xlbj8KKyAgaW50IGJlYXRfb2ZmX251bSA9IFF1ZXJ5KCJucGM6YmVhdF9vZmZfbnVtIik7CisgIGlmICghYmVhdF9vZmZfbnVtKQorICAgIHJldHVybjsgLy8gbmVpbi4KKyAgLy8gd2lldmllbGUgSEJzIG5hY2hob2xlbj8KKyAgYmVhdF9vZmZfbnVtID0gYWJzb2x1dGVfaGJfY291bnQoKSAtIGJlYXRfb2ZmX251bTsKKyAgCisgIGlmIChiZWF0X29mZl9udW0+MCkgeworICAgIC8vIE5pY2h0IGF1c2dlZnVlaHJ0ZXMgSEVJTEVOIG5hY2hob2xlbgorICAgIGludCBybG9jaz1RdWVyeVByb3AoUF9OT19SRUdFTkVSQVRJT04pOworICAgIGludCBocD1RdWVyeVByb3AoUF9IUCk7CisgICAgaW50IHNwPVF1ZXJ5UHJvcChQX1NQKTsKKyAgICBpbnQgYWxjPVF1ZXJ5UHJvcChQX0FMQ09IT0wpOworICAgIGlmICghKHJsb2NrICYgTk9fUkVHX0hQKSkgeworICAgICAgaHArPWJlYXRfb2ZmX251bS9IRUFMX0RFTEFZK2FsYy9BTENPSE9MX0RFTEFZOworICAgICAgU2V0UHJvcChQX0hQLGhwKTsKKyAgICB9CisgICAgaWYgKCEocmxvY2sgJiBOT19SRUdfU1ApKSB7CisgICAgICBzcCs9YmVhdF9vZmZfbnVtL0hFQUxfREVMQVkrYWxjL0FMQ09IT0xfREVMQVk7CisgICAgICBTZXRQcm9wKFBfU1Asc3ApOworICAgIH0KKyAgICBhbGMtPWJlYXRfb2ZmX251bS9BTENPSE9MX0RFTEFZOworICAgIGlmICggYWxjIDwgMCApCisgICAgICBhbGMgPSAwOworICAgIFNldFByb3AoUF9BTENPSE9MLGFsYyk7CisgICAgaW50IGRhID0gUXVlcnlQcm9wKFBfRElTQUJMRV9BVFRBQ0spOworICAgIC8vIFBhcmFseXNlbiBhYmJhdWVuCisgICAgaWYgKCBkYSA+IDAgKSB7CisgICAgICBkYSAtPSBiZWF0X29mZl9udW07CisgICAgICBpZiAoIGRhIDwgMCApCisJZGEgPSAwOworICAgICAgU2V0UHJvcCggUF9ESVNBQkxFX0FUVEFDSywgZGEgKTsKKyAgICB9CisgICAgLy8gSHVudHRpbWVzIGFrdHVhbGlzaWVyZW4sIEZlaW5kZSBleHBpcmVuCisgICAgdXBkYXRlX2h1bnRfdGltZXMoYmVhdF9vZmZfbnVtKTsKKyAgICBpZiAoIWhlYXJ0YmVhdCkKKyAgICAgIC8vIEhCcyBpbW1lciBub2NoIGFiZ2VzY2hhbHRldCwgbmFlY2hzdGVzIE1hbCBIQnMgc2VpdCBqZXR6dCBuYWNoaG9sZW4uCisgICAgICBTZXQoIm5wYzpiZWF0X29mZl9udW0iLGFic29sdXRlX2hiX2NvdW50KCkpOworICAgIGVsc2UKKyAgICAgIC8vIEhCIGxhZXVmdCB3aWVkZXIsIG5peCBtZWhyIG5hY2hob2xlbiwgYmlzIHp1ciBuYWVjaHN0ZW4gQWJzY2hhbHR1bmcuCisgICAgICBTZXQoIm5wYzpiZWF0X29mZl9udW0iLDApOworICB9Cit9CisKK3ZvaWQgaW5pdCgpIHsKKworICAvLyBnZ2YuIEhlYXJ0YmVhdHMgbmFjaGhvbGVuIHVuZCB3aWVkZXIgZWluc2NoYWx0ZW4uCisgIGlmICghaGVhcnRiZWF0KSB7CisgICAgc2V0X2hlYXJ0X2JlYXQoMSk7CisgICAgaGVhcnRiZWF0PTE7CisgICAgY2F0Y2hfdXBfaGJzKCk7CisgIH0KKworICBpZiAoQXV0b0F0dGFjayh0aGlzX3BsYXllcigpKSkKKyAgICBLaWxsKHRoaXNfcGxheWVyKCkpOworfQorCitwcml2YXRlIG5vc2F2ZSBjbG9zdXJlIG1vZF9hdHRfc3RhdDsKKworaW50IERlZmVuZChpbnQgZGFtLCBtaXhlZCBkYW1fdHlwZSwgbWl4ZWQgc3BlbGwsIG9iamVjdCBlbmVteSkgeworICBpZiAob2JqZWN0cChlbmVteT0oZW5lbXl8fHRoaXNfcGxheWVyKCkpKQorICAgICAgJiYgcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShlbmVteSkKKyAgICAgICYmICFJU19MRUFSTkVSKGVuZW15KSkgeworICAgIGlmICghb2JqZWN0cChnZXRfdHlwZV9pbmZvKG1vZF9hdHRfc3RhdCwyKSkpIHsKKyAgICAgIG9iamVjdCBtYTsKKyAgICAgIGlmICghb2JqZWN0cChtYT1maW5kX29iamVjdChTVEFUTUFTVEVSKSkpCisgICAgICAgIHJldHVybiA6OkRlZmVuZChkYW0sZGFtX3R5cGUsc3BlbGwsZW5lbXkpOworICAgICAgLy8gS2VpbmUgU3RhdGlzdGlrIHdlbm4gTWFzdGVyIG5pY2h0IGdlbGFkZW4gaXN0LgorICAgICAgbW9kX2F0dF9zdGF0PXN5bWJvbF9mdW5jdGlvbigiTW9kaWZ5QXR0YWNrU3RhdCIsbWEpOworICAgIH0KKyAgICBmdW5jYWxsKG1vZF9hdHRfc3RhdCwKKyAgICAgICAgICAgIGVuZW15LT5RdWVyeVByb3AoUF9HVUlMRCksCisgICAgICAgICAgICBlbmVteS0+UXVlcnlQcm9wKFBfR1VJTERfTEVWRUwpLAorICAgICAgICAgICAgZGFtLAorICAgICAgICAgICAgZGFtX3R5cGUsCisgICAgICAgICAgICBzcGVsbCk7CisgIH0KKworICByZXR1cm4gOjpEZWZlbmQoZGFtLGRhbV90eXBlLHNwZWxsLGVuZW15KTsKK30KZGlmZiAtLWdpdCBhL3N0ZC9ucGMvY29tbS5jIGIvc3RkL25wYy9jb21tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkyZDhmYQotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9ucGMvY29tbS5jCkBAIC0wLDAgKzEsNTcgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBucGMvY29tbS5jIC0tIEJhc2lza29tbXVuaWthdGlvbiBmdWVyIE5QQ3MKKy8vCisvLyAkSWQ6IGNvbW0uYyA5MzU4IDIwMTUtMTAtMjIgMTg6MzU6MDRaIFplc3N0cmEgJAorI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCitpbmhlcml0ICIvc3RkL2xpdmluZy9jb21tIjsKKworI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8bGl2aW5nL2NvbW0uaD4KKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8dGhpbmcvZGVzY3JpcHRpb24uaD4KKworCit2b2lkIGNyZWF0ZSgpIHsKKyAgYWRkX2FjdGlvbiggInNhZ2UiLCAic2FnIiwgMSApOworICBhZGRfYWN0aW9uKCAiZWNobyIsICJlY2hvIiApOworICBhZGRfYWN0aW9uKCAiZW1vdGUiLCAiZW1vdGUiICk7Cit9CisKK2ludCBlY2hvKCBzdHJpbmcgc3RyICkgeworICBzYXkoIHN0ciArICJcbiIgKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBzYWdlKCBzdHJpbmcgc3RyICkgeworICBzYXkoIGJyZWFrX3N0cmluZyhzdHIsIDc4LCBjYXBpdGFsaXplKG5hbWUoV0VSLDIpKSsiIHNhZ3Q6ICIpKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBlbW90ZSggc3RyaW5nIHN0ciApIHsKKyAgc2F5KCBjYXBpdGFsaXplKG5hbWUoV0VSLDIpKSsiICIrc3RyKyJcbiIgKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIHp1bSB1ZWJlcnNjaHJlaWJlbiAtIERFUFJFQ0FURUQhIFVTRSBSZWNlaXZlTXNnKCkhCitwdWJsaWMgdm9pZCBjYXRjaF9tc2cobWl4ZWQgKmFyciwgb2JqZWN0IG9iaikge30KK3B1YmxpYyB2b2lkIGNhdGNoX3RlbGwoc3RyaW5nIHN0cikge30KKworLy8gYnkgZGVmYXVsdCwgdGhlIG1zZyBpcyBkZWxpdmVyZWQgdG8gY2F0Y2hfdGVsbCgpIGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMKKy8vIGFuZCBvdGhlcndpc2UgaWdub3JlZC4KK3B1YmxpYyB2YXJhcmdzIGludCBSZWNlaXZlTXNnKHN0cmluZyBtc2csIGludCBtc2dfdHlwLCBzdHJpbmcgbXNnX2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtc2dfcHJlZml4LCBvYmplY3Qgb3JpZ2luKQoreworICAvLyBjb21wYXRpYmlsaXR5Li4uCisgIGlmIChtc2dfdHlwICYgTVNHX0RPTlRfV1JBUCkKKyAgICBjYXRjaF90ZWxsKHNwcmludGYoIiVzJXMiLCBtc2dfcHJlZml4fHwiIiwgbXNnKSk7CisgIGVsc2UKKyAgICBjYXRjaF90ZWxsKHNwcmludGYoIiVzJXNcbiIsIG1zZ19wcmVmaXh8fCIiLCBtc2cpKTsKKyAgcmV0dXJuIE1TR19ERUxJVkVSRUQ7Cit9CisKZGlmZiAtLWdpdCBhL3N0ZC9ucGMvaW5mby5jIGIvc3RkL25wYy9pbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY2ZWUyNgotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9ucGMvaW5mby5jCkBAIC0wLDAgKzEsMzQ1IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gbnBjL2luZm8uYyAtLSBCZWhhbmRlbG4gdm9uIEZyYWdlbiBhbiBkZW4gTlBDCisvLworLy8gJElkOiBpbmZvLmMgOTUyMiAyMDE2LTAzLTAxIDE5OjIwOjEwWiBBcmF0aG9ybiAkCisKKy8qIExldHp0ZSBBZW5kZXJ1bmdlbiB2b24gV2ltIDguMS45OQorICoKKyAqIEFkZEluZm8oIHNjaGx1ZXNzZWwsIGFudHdvcnQgWywgaW5kZW50IFssIFtzaWxlbnQgWywgY2FzZWJhc2VkXSBdIF0gKQorICogIFdlbm4gZWluIFNwaWVsZXIgZGllc2VzIE1vbnN0ZXIgbmFjaCAic2NobHVlc3NlbCIgZnJhZ3QsIHNvIGdpYiBkaWUKKyAqICBQcm9ncmFtbWllcnRlIEFudHdvcnQgYXVzLgorICogIEVyd2VpdGVydW5nIHZvbiBXaW06IGlzdCBzaWxlbnQgZ2VzZXR6dCwgc28gZXJmb2xndCBlaW5lICJwZXJzb2VubGljaGUiCisgKiAgICBBbnR3b3J0LiBkLmguIHVtc3RlaGVuZGUgUGVyc29uZW4gYmVrb21tZW4gYmVpIHNpbGVudD09MSBrZWluZW4sIGJlaQorICogICAgc3RyaW5ncChzaWxlbnQpLCBkZW4gU3RyaW5nIGF1c2dlZ2ViZW4sIGRhYmVpIGthbm4gZXIgYXVjaCBkaWUgU2NobHVlc3NlbC0KKyAqICAgIFdvcnRlIEBXRVIgQFdFU1NFTiBAV0VNIEBXRU4gZW50aGFsdGVuLgorICogIC0gRXJnYWVuenQgdW0gQENBUF9XRVIuLi4gZnVlciB6d2FuZ3MtY2FwaXRhbGlzaWVydGUgTmFtZW4gYW4gU2F0emFuZmFlbmdlbi4KKyAqICAgIGlzdCBiZWkgZnJhZ2VuZGVuIE5QQ3MgdW5kIFBDcyBtaXQgVGFybmthcHBlIHdpY2h0aWchIChTaWx2YW5hKQorICogIC0gQXVjaCBpbiBkZXIgQW50d29ydCBkZXMgZnJhZ2VuZGVuIHdpcmQgbnVuIGVyc2V0enQgKFZhbmlvbikKKyAqICBFbnRoYWVsdCBjYXNlZGJhc2VkIGVpbmVuIEZ1bmt0aW9uc25hbWVuIG9kZXIgdmVyd2Vpc3QgYXVmIGVpbmUgY2xvc3VyZSwgc28KKyAqICAgIHdpcmQgZGllIEJlYW50d29ydHVuZyBkZXIgRnJhZ2Ugdm9uIGRlbSByZXR1cm4tV2VydCBhYmhhZW5naWcgZ2VtYWNodC4KKyAqICAgIEJlaSAwIHdpcmQgZGllIEZyYWdlIG5vcm1hbCBiZWFudHdvcnRldCwgYmVpIDEgZXJmb2xndCBkaWUgQXVzZ2FiZSBkZXMKKyAqICAgIHVudGVyIERFRkFVTFRfTk9JTkZPIGdlc3BlaWNoZXJ0ZW4gVGV4dGVzLgorICogICAgV2lyZCBlaW4gU3RyaW5nIHp1cnVlY2tnZWdlYmVuLCBzbyB3aXJkIGVyIHVudGVyIEJlYWNodHVuZyB2b24gaWRlbnQgYW4KKyAqICAgIFN0ZWxsZSBkZXIgdXJzcHJ1ZW5nbGljaGVuIEluZm9ybWF0aW9uIGF1c2dlZ2ViZW4uCisgKgorICogUmVtb3ZlSW5mbyggc2NobHVlc3NlbCApCisgKiAgRGFzIE1vbnN0ZXIgYW50d29ydGV0IG5pY2h0IG1laHIgYXVmIGRpZXNlbiBTY2hsdWVzc2VsLgorICoKKyAqIFNldFByb3AoIFBfREVGQVVMVF9JTkZPLCBhbnR3b3J0IFssIGluZGVudCBdICkKKyAqICBTZXR6ZSBkaWUgQW50d29ydCwgZGllIGRhcyBNb25zdGVyIGF1ZiB1bnZlcnN0YWVuZGxpY2hlIEZyYWdlbiBnZWJlbgorICogIHNvbGwuIChEaWVzZSBGdW5rdGlvbiBpc3Qgb2Jzb2xldCEgQmVudXR6ZSBzdGF0dGRlc3NlbgorICogIEFkZEluZm8oICJcbmRlZmF1bHQgaW5mbyIsIGFudHdvcnQgWywgaW5kZW50IF0gKTsKKyAqCisgKiBHZXRJbmZvKCBbc2NobHVlc3NlbF0gKQorICogIFdlbm4gU2NobHVlc3NlbCBnZXNldHp0IGlzdCwgc28gd2lyZCBkaWUgZGF6dWdlaG9lcmlnZSBJbmZvLAorICogIGFuc29uc3RlbiB3ZXJkZW4gYWxsZSBJbmZvcyB6dXJ1ZWNrZ2VnZWJlbi4KKyAqCisgKiBEaWUgQW50d29ydGVuIHNvbGx0ZW4gd2llIGVtb3RlIC0ga29tbWFuZG9zIGF1c3NlaGVuLgorICogRGVyIG9wdGlvbmFsZSBJbmRlbnQgd2lyZCB6dW0gVW1icmVjaGVuIHZvbiBsYW5nZW4gSW5mb3MgYmVudXR6dC4KKyAqIChUeXBpc2NoZXJ3ZWlzZSBzb2xsdGUgaW5kZW50PSJzYWd0OiAiIHNlaW4uKQorICoKKyAqIEluIGRlbiBJbmZvcyBkYXJmIG1pdCBwcm9jZXNzX3N0cmluZyBnZWFyYmVpdGV0IHdlcmRlbi4gRGFzIEVyZ2VibmlzIHZvbgorICogcHJvY2Vzc19zdHJpbmcgd2lyZCBkYW5uIG1pdCB1bWdlYnJvY2hlbiEKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjcHJhZ21hIHN0cm9uZ190eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8dGhpbmcvZGVzY3JpcHRpb24uaD4KKyNpbmNsdWRlIDx0aGluZy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bnBjLmg+CisjdW5kZWYgTkVFRF9QUk9UT1RZUEVTCisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8ZXhwbG9yYXRpb24uaD4KKworLy8gVE9ETzogbGFuZ2ZyaXN0aWcgd2FlciBoaWVyIHByaXZhdGUgc2Nob2VuLgorbm9zYXZlIG1hcHBpbmcgaW5mb3M7CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgICAgLy8gSW5pdGlhbGlzaWVydW5nIG51ciB3ZW5uIG5vZXRpZywgZGFtaXQgYmVpbSB2aXJ0dWVsbGVuIEVyYmVuIHZvbgorICAgIC8vIC9zdGQvbnBjIGluIG5wYzEgdW5kIG5wYzIgZGFubiBpbiBucGMzIGJlaW0gbnBjMTo6Y3JlYXRlKCk7CisgICAgLy8gbnBjMjpjcmVhdGUoKTsgaW0gendlaXRlbiBjcmVhdGUoKSBkaWUgSW5mb3MgbmljaHQKKyAgICAvLyB1ZWJlcnNjaHJpZWJlbi9nZWxvZXNjaHQgd2VyZGVuLgorICAgIGlmICghbWFwcGluZ3AoaW5mb3MpKSB7CisgICAgICAgIGluZm9zID0gKFsKKyAgICAgICAgICAgIERFRkFVTFRfSU5GTzoic2NoYXV0IERpY2ggZnJhZ2VuZCBhbi5cbiI7MDsKKyAgICAgICAgICAgICJzY2hhdXQgQFdFTiBmcmFnZW5kIGFuLlxuIjswLAorICAgICAgICAgICAgREVGQVVMVF9OT0lORk86Im1vZWNodGUgRGlyIG5pY2h0IGFudHdvcnRlbi5cbiI7MDsKKyAgICAgICAgICAgICJ2ZXJ3ZWlnZXJ0IEBXRU0gZGllIEFudHdvcnQuXG4iOzEKKyAgICAgICAgICAgIF0pOworICAgIH0KK30KKworCit2b2lkIGluaXQoKSB7CisgIGFkZF9hY3Rpb24oICJmcmFnZSIsICJmcmFnIiwgMSApOworfQorCisKK3N0YXRpYyB2b2lkIHNtYXJ0X25wY19sb2coc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIGNyZWF0LCBjcmVhdF9kZXQ7CisKKyAgaWYgKCFzdHJpbmdwKGNyZWF0PVF1ZXJ5UHJvcChQX0xPR19JTkZPKSkpIHsKKyAgICBjcmVhdCA9IE1BU1RFUi0+Y3JlYXRvcl9maWxlKHRoaXNfb2JqZWN0KCkpOworICAgIGlmIChjcmVhdCA9PSBST09USUQpCisgICAgICBjcmVhdCA9ICJST09UIjsKKyAgICBlbHNlIGlmKCBjcmVhdD09QkFDS0JPTkVJRCApCisgICAgICBjcmVhdD0iU1REIjsKKyAgICBjcmVhdF9kZXQ9InJlcG9ydC8iK2V4cGxvZGUoY3JlYXQsICIuIilbPDFdKyJfSU5GTy5yZXAiOworICAgIGNyZWF0PSJyZXBvcnQvIitleHBsb2RlKGNyZWF0LCAiLiIpWzwxXSsiLnJlcCI7CisgIH0KKyAgbG9nX2ZpbGUoY3JlYXQsCisgICAgICAgICAgIHNwcmludGYoIklORk8gdm9uICVzIFslc10gKCVzKTpcbiVzXG4iLAorICAgICAgICAgICAgICAgICAgIGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpLAorICAgICAgICAgICAgICAgICAgIGV4cGxvZGUob2JqZWN0X25hbWUodGhpc19vYmplY3QoKSksIiMiKVswXSwKKyAgICAgICAgICAgICAgICAgICBzdHJmdGltZSgiJWQuICViICVZIiksCisgICAgICAgICAgICAgICAgICAgc3RyKSk7CisgIGlmIChzdHJpbmdwKGNyZWF0X2RldCkgJiYgc2l6ZW9mKGNyZWF0X2RldCkpCisgICAgbG9nX2ZpbGUoY3JlYXRfZGV0LAorICAgICAgICAgICAgIHNwcmludGYoIklORk8gdm9uICVzIFslc10gKCVzKTpcbiVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSksCisgICAgICAgICAgICAgICAgICAgICBleHBsb2RlKG9iamVjdF9uYW1lKHRoaXNfb2JqZWN0KCkpLCIjIilbMF0sCisgICAgICAgICAgICAgICAgICAgICBzdHJmdGltZSgiJWQuICViICVZIiksCisgICAgICAgICAgICAgICAgICAgICBzdHIpKTsKK30KKworcHVibGljIGludCBmcmFnZShzdHJpbmcgc3RyKSB7CisgIHN0cmluZyBteW5hbWUsIHRleHQ7CisKKyAgc3RyPShleHRlcm5fY2FsbCgpP3RoaXNfcGxheWVyKCktPl91bnBhcnNlZF9hcmdzKCk6c3RyKTsKKyAgaWYoICFzdHIgfHwgc3NjYW5mKCBzdHIsICIlcyBuYWNoICVzIiwgbXluYW1lLCB0ZXh0ICkgIT0gMiApIHsKKyAgICBfbm90aWZ5X2ZhaWwoICJXRU4gd2lsbHN0IER1IG5hY2ggV0FTIGZyYWdlbj9cbiIgKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmKCAhaWQoIGxvd2VyX2Nhc2UobXluYW1lKSApCisgICAgfHwgUXVlcnlQcm9wKFBfSU5WSVMpICkgeworICAgIF9ub3RpZnlfZmFpbCggIlNvIGplbWFuZGVuIGZpbmRlc3QgRHUgaGllciBuaWNodC5cbiIgKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBzYXkoIGNhcGl0YWxpemUodGhpc19wbGF5ZXIoKS0+bmFtZShXRVIpKSsiIGZyYWd0ICIgKworICAgIG5hbWUoV0VOLDIpKyIgbmFjaCAiK2NhcGl0YWxpemUodGV4dCkrIi5cbiIsCisgICAgICB0aGlzX3BsYXllcigpICk7CisKKyAgdGV4dCA9IGxvd2VyX2Nhc2UodGV4dCk7CisgIEdpdmVFUChFUF9JTkZPLCB0ZXh0KTsKKworICByZXR1cm4gZG9fZnJhZ2UoIHRleHQgKTsKK30KKworc3RhdGljIHN0cmluZyBpbmZvRGVmYXVsdFJlcGxhY2Uoc3RyaW5nIHBzdHJpbmcsIG9iamVjdCBwbCkKK3sKKyAgcHN0cmluZz0iICIrcHN0cmluZzsKKyAgaWYgKHN0cnN0cihwc3RyaW5nLCJAV0VSIiwwKSA+LTEgKQorICAgIHBzdHJpbmc9IHJlZ3JlcGxhY2UocHN0cmluZywiQFdFUiIscGwtPm5hbWUoV0VSLDEpLDEpOworICBpZiAoc3Ryc3RyKHBzdHJpbmcsIkBXRVNTRU4iLDApID4tMSApCisgICAgcHN0cmluZz0gcmVncmVwbGFjZShwc3RyaW5nLCJAV0VTU0VOIixwbC0+bmFtZShXRVNTRU4sMSksMSk7CisgIGlmIChzdHJzdHIocHN0cmluZywiQFdFTSIsMCkgPi0xICkKKyAgICBwc3RyaW5nPSByZWdyZXBsYWNlKHBzdHJpbmcsIkBXRU0iLHBsLT5uYW1lKFdFTSwxKSwxKTsKKyAgaWYgKHN0cnN0cihwc3RyaW5nLCJAV0VOIiwwKSA+LTEgKQorICAgIHBzdHJpbmc9IHJlZ3JlcGxhY2UocHN0cmluZywiQFdFTiIscGwtPm5hbWUoV0VOLDEpLDEpOworICBpZiAoc3Ryc3RyKHBzdHJpbmcsIkBDQVBfV0VSIiwwKSA+LTEgKQorICAgIHBzdHJpbmc9IHJlZ3JlcGxhY2UocHN0cmluZywiQENBUF9XRVIiLHBsLT5OYW1lKFdFUiwxKSwxKTsKKyAgaWYgKHN0cnN0cihwc3RyaW5nLCJAQ0FQX1dFU1NFTiIsMCkgPi0xICkKKyAgICBwc3RyaW5nPSByZWdyZXBsYWNlKHBzdHJpbmcsIkBDQVBfV0VTU0VOIixwbC0+TmFtZShXRVNTRU4sMSksMSk7CisgIGlmIChzdHJzdHIocHN0cmluZywiQENBUF9XRU0iLDApID4tMSApCisgICAgcHN0cmluZz0gcmVncmVwbGFjZShwc3RyaW5nLCJAQ0FQX1dFTSIscGwtPk5hbWUoV0VNLDEpLDEpOworICBpZiAoc3Ryc3RyKHBzdHJpbmcsIkBDQVBfV0VOIiwwKSA+LTEgKQorICAgIHBzdHJpbmc9IHJlZ3JlcGxhY2UocHN0cmluZywiQENBUF9XRU4iLHBsLT5OYW1lKFdFTiwxKSwxKTsKKworICByZXR1cm4gcHN0cmluZ1sxLi5dOworfQorCitzdGF0aWMgbWl4ZWQgKkdldEluZm9BcnIoc3RyaW5nIHN0cikKK3sgIAorICAgcmV0dXJuICh7IGluZm9zW3N0ciwgMF0sIGluZm9zW3N0ciwgMV0sIGluZm9zW3N0ciwyXSwgaW5mb3Nbc3RyLCAzXSB9KTsKK30KKworcHVibGljIGludCBkb19mcmFnZShzdHJpbmcgdGV4dCkKK3sKKyAgc3RyaW5nIGluZGVudCxhbnN3ZXI7CisgIG1peGVkIHNpbGVudCwgcHJlaW5mbywgbm9hbnN3ZXI7CisgIG1peGVkICppbmZvOworCisgIGlmIChzdHJpbmdwKHByZWluZm8gPSBRdWVyeVByb3AoUF9QUkVfSU5GTykpKQorICB7CisgICAgIC8vIERpZSBtZXNzYWdlIGFjdGlvbiB3aXJkIGF1ZiAiZnJhZ2UiIGZpeGllcnQsIGRhbWl0IGRpZXMgaW1tZXIgZGFzCisgICAgIC8vIGdsZWljaGUgaXN0LCBlZ2FsLCBtaXQgd2VsY2hlbSBWZXJiIG1hbiBpbiBkaWVzZSBGdW5rdGlvbiBrb21tdC4KKyAgICAgdGhpc19wbGF5ZXIoKS0+UmVjZWl2ZU1zZyhwcmVpbmZvLCBNVF9MSVNURU4sICJmcmFnZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZShXRVIsMikrIiAiLHRoaXNfb2JqZWN0KCkpOworICAgICBzZW5kX3Jvb20oZW52aXJvbm1lbnQodGhpc19vYmplY3QoKSksCisgICAgICAgICAgICAgICAiaXN0IG5pY2h0IGdld2lsbHQsICIrdGhpc19wbGF5ZXIoKS0+TmFtZShXRU0sMikKKyAgICAgICAgICAgICAgICsiIHp1IGFudHdvcnRlbi4iLAorICAgICAgICAgICAgICAgTVRfTElTVEVOLCAiZnJhZ2UiLAorICAgICAgICAgICAgICAgTmFtZShXRVIsMikrIiAiLAorICAgICAgICAgICAgICAgKHt0aGlzX3BsYXllcigpfSkgKTsKKyAgICAgcmV0dXJuIDE7CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYgKGludHAocHJlaW5mbykgJiYgcHJlaW5mbyA+IDApCisgICAgICByZXR1cm4gMTsKKyAgfQorCisgIGluZm89R2V0SW5mb0Fycih0ZXh0KTsKKyAgaWYgKCFpbmZvWzBdKQorICB7CisgICAgaWYoIHRoaXNfaW50ZXJhY3RpdmUoKSAmJiBRdWVyeVByb3AoUF9MT0dfSU5GTykgKQorICAgICAgc21hcnRfbnBjX2xvZyh0ZXh0KTsKKyAgICB0ZXh0ID0gREVGQVVMVF9JTkZPOworICAgIGluZm89R2V0SW5mb0Fycih0ZXh0KTsKKyAgfQorCisgIGlmIChjbG9zdXJlcChpbmZvWzBdKSApIHsKKyAgICBhbnN3ZXI9ZnVuY2FsbChpbmZvWzBdKTsKKyAgICBpZiggIWFuc3dlciB8fCBhbnN3ZXI9PSIiKSByZXR1cm4gMTsKKyAgfSBlbHNlIHsKKyAgICBhbnN3ZXI9cHJvY2Vzc19zdHJpbmcoaW5mb1swXSk7CisgIH0KKworICBpZiAoY2xvc3VyZXAoaW5mb1szXSkgKQorICAgeworICAgIG5vYW5zd2VyPWZ1bmNhbGwoaW5mb1szXSk7CisgICAgaWYgKCBpbnRwKG5vYW5zd2VyKSAmJiBub2Fuc3dlciA+IDApCisgICAgIHsKKyAgICAgICB0ZXh0ID0gREVGQVVMVF9OT0lORk87CisgICAgICAgaW5mbyA9IEdldEluZm9BcnIodGV4dCk7CisgICAgICAgaWYgKGNsb3N1cmVwKGluZm9bMF0pICkgeworICAgICAgICAgYW5zd2VyPWZ1bmNhbGwoaW5mb1swXSk7CisgICAgICAgICBpZiggIWFuc3dlciB8fCBhbnN3ZXI9PSIiKSByZXR1cm4gMTsKKyAgICAgICB9IGVsc2UgeworICAgICAgICAgYW5zd2VyPXByb2Nlc3Nfc3RyaW5nKGluZm9bMF0pOworICAgICAgIH0KKyAgICAgfQorICAgIGVsc2UgaWYgKCBzdHJpbmdwKG5vYW5zd2VyKSApCisgICAgICBhbnN3ZXIgPSBub2Fuc3dlcjsKKyAgIH0KKworICBzaWxlbnQ9aW5mb1syXTsKKworICAvLyBSZXBsYWNlbWVudHMgZ2VoZW4gYXVjaCBpbiBkZXIgQW50d29ydCBkZXMgTlBDLiBEYXMgZ2lidCBkZW4gQW50d29ydGVuIAorICAvLyBlaW5lIHBlcnNvZW5saWNoZSBOb3RlLCB1bmQgc28gdGV1ZXIgaXMgZGFzIGF1Y2ggbmljaHQgOikKKyAgYW5zd2VyID0gaW5mb0RlZmF1bHRSZXBsYWNlKGFuc3dlciwgdGhpc19wbGF5ZXIoKSk7CisKKyAgaWYoIGluZGVudD1pbmZvWzFdICkKKyAgeworICAgIGlmIChzdHJpbmdwKHNpbGVudCkgfHwgKGludHAoc2lsZW50KSAmJiBzaWxlbnQgPiAwKSApCisgICAgeyAgLy8gUGVyc29lbmxpY2hlIEFudHdvcnQgbWl0IGluZGVudAorICAgICAgIHRoaXNfcGxheWVyKCktPlJlY2VpdmVNc2coYW5zd2VyLCBNVF9MSVNURU58TVNHX0JTX0xFQVZFX0xGUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmcmFnZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lKFdFUiwyKSsiICIraW5kZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc19vYmplY3QoKSk7CisgICAgICAgaWYgKHN0cmluZ3Aoc2lsZW50KSkKKyAgICAgICB7CisgICAgICAgICAgc2lsZW50PWluZm9EZWZhdWx0UmVwbGFjZShzaWxlbnQsIHRoaXNfcGxheWVyKCkpOworICAgICAgICAgIHNlbmRfcm9vbShlbnZpcm9ubWVudCgpLCBzaWxlbnQsIE1UX0xJU1RFTiwgImZyYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgTmFtZShXRVIsMikrIiAiLCAoe3RoaXNfcGxheWVyKCl9KSk7CisgICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8vICJub3JtYWxlIEFudHdvcnQiIG1pdCBJbmRlbnQKKyAgICB7CisgICAgICBzZW5kX3Jvb20oZW52aXJvbm1lbnQoKSwgYW5zd2VyLCBNVF9MSVNURU58TVNHX0JTX0xFQVZFX0xGUywKKyAgICAgICAgICAgICAgICAiZnJhZ2UiLAorICAgICAgICAgICAgICAgIE5hbWUoV0VSLDIpKyIgIitpbmRlbnQsICh7dGhpc19vYmplY3QoKX0pKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYgKHN0cmluZ3Aoc2lsZW50KSB8fCAoaW50cChzaWxlbnQpICYmIHNpbGVudCA+IDApICkKKyAgICB7ICAvLyBQZXJzb2VubGljaGUgQW50d29ydCBvaG5lIGluZGVudAorICAgICAgIHRoaXNfcGxheWVyKCktPlJlY2VpdmVNc2coYW5zd2VyLCBNVF9MSVNURU58TVNHX0RPTlRfV1JBUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmcmFnZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lKFdFUiwyKSsiICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX29iamVjdCgpKTsKKyAgICAgICBpZiAoc3RyaW5ncChzaWxlbnQpKQorICAgICAgIHsKKyAgICAgICAgICBzaWxlbnQ9aW5mb0RlZmF1bHRSZXBsYWNlKHNpbGVudCwgdGhpc19wbGF5ZXIoKSk7CisgICAgICAgICAgc2VuZF9yb29tKGVudmlyb25tZW50KCksIHNpbGVudCwgTVRfTElTVEVOLCAiZnJhZ2UiLAorICAgICAgICAgICAgICAgICAgICBOYW1lKFdFUiwyKSsiICIsICh7dGhpc19wbGF5ZXIoKX0pICk7CisgICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8vICJub3JtYWxlIEFudHdvcnQiIG9obmUgSW5kZW50CisgICAgICBzZW5kX3Jvb20oZW52aXJvbm1lbnQoKSwgYW5zd2VyLCBNVF9MSVNURU58TVNHX0RPTlRfV1JBUCwKKyAgICAgICAgICAgICAgICAiZnJhZ2UiLCBOYW1lKFdFUiwyKSsiICIpOworICB9CisgIHJldHVybiAxOworfQorCisvKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFNldHplbiB2b24gSW5mb3MKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworcHVibGljIHZhcmFyZ3Mgdm9pZCBBZGRJbmZvKG1peGVkIGtleSwgbWl4ZWQgaW5mbywgc3RyaW5nIGluZGVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZWQgc2lsZW50LCBtaXhlZCBjYXNlYmFzZWQgKSB7CisKKyAgaWYgKHN0cmluZ3AoY2FzZWJhc2VkKSkKKyAgICBjYXNlYmFzZWQ9c3ltYm9sX2Z1bmN0aW9uKGNhc2ViYXNlZCx0aGlzX29iamVjdCgpKTsKKworICBpZiggcG9pbnRlcnAoIGtleSApICkgeworICAgIGludCBpOworICAgIGZvciAoIGk9c2l6ZW9mKCBrZXkgKS0xOyBpPj0wOyBpLS0gKQorICAgICAgaW5mb3MgKz0gKFsga2V5W2ldOiBpbmZvOyBpbmRlbnQ7IHNpbGVudDsgY2FzZWJhc2VkIF0pOworICB9CisgIGVsc2UKKyAgICBpbmZvcyArPSAoWyBrZXk6IGluZm87IGluZGVudDsgc2lsZW50OyBjYXNlYmFzZWQgXSk7Cit9CisKK3B1YmxpYyB2YXJhcmdzIHZvaWQgQWRkU3BlY2lhbEluZm8obWl4ZWQga2V5cywgc3RyaW5nIGZ1bmN0aW9ubmFtZSwgCisgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGluZGVudCwgbWl4ZWQgc2lsZW50LCBtaXhlZCBjYXNlYmFzZWQgKQoreworICBpbnQgaTsKKyAgY2xvc3VyZSBjbDsKKworICBpZighKGNsPXN5bWJvbF9mdW5jdGlvbihmdW5jdGlvbm5hbWUsdGhpc19vYmplY3QoKSkpKSByZXR1cm47CisgIHJldHVybiBBZGRJbmZvKGtleXMsY2wsaW5kZW50LHNpbGVudCxjYXNlYmFzZWQpOworfQorCisKK3B1YmxpYyB2b2lkIFJlbW92ZUluZm8oIHN0cmluZyBrZXkgKQoreworICBtX2RlbGV0ZShpbmZvcyxrZXkpOworfQorCitzdGF0aWMgdmFyYXJncyB2b2lkIF9zZXRfZGVmYXVsdF9pbmZvKCBtaXhlZCBpbmZvICkKK3sKKyAgaWYgKHBvaW50ZXJwKGluZm8pKQorICAgIGFwcGx5KCMnQWRkSW5mby8qJyovLERFRkFVTFRfSU5GTyxpbmZvKTsKKyAgZWxzZQorICAgIEFkZEluZm8oREVGQVVMVF9JTkZPLGluZm8pOworfQorCitwdWJsaWMgdmFyYXJncyBtaXhlZCBHZXRJbmZvKHN0cmluZyBzdHIpCit7CisgIGlmICghc3RyKSByZXR1cm4gZGVlcF9jb3B5KGluZm9zKTsKKyAgcmV0dXJuIGluZm9zW3N0cl07Cit9CisKKworc3RhdGljIG1hcHBpbmcgX3F1ZXJ5X25wY19pbmZvKCkKK3sKKyAgICByZXR1cm4gZGVlcF9jb3B5KGluZm9zKTsKK30KKworCitzdGF0aWMgbWFwcGluZyBfc2V0X25wY19pbmZvKCBtYXBwaW5nIG1hcF9sZGZpZWQgKQoreworICAgIGlmICggIW1hcHBpbmdwKG1hcF9sZGZpZWQpICkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gaW5mb3MgPSBtYXBfbGRmaWVkOworfQorCmRpZmYgLS1naXQgYS9zdGQvbnBjL2l0ZW1zLmMgYi9zdGQvbnBjL2l0ZW1zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAyNjBjZgotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9ucGMvaXRlbXMuYwpAQCAtMCwwICsxLDI0MCBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIC9zdGQvbnBjL2l0ZW1zLmMgLS0gSXRlbS1WZXJ3YWx0dW5nIGZ1ZXIgTlBDcworLy8KKy8vICRJZDogaXRlbXMuYyA4MTQ2IDIwMTItMTAtMzAgMTg6MTg6MTRaIFplc3N0cmEgJAorLy8KKy8vIChjKSBieSBQYWRyZWljIChQYWRyZWljQG1nLm11ZC5kZSkKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDx0aGluZy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8dGhpbmcvZGVzY3JpcHRpb24uaD4KKyNpbmNsdWRlIDxsaXZpbmcvY29tYmF0Lmg+CisjdW5kZWYgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8bnBjLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGNvbWJhdC5oPgorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPHN5c19kZWJ1Zy5oPgorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICAvLyBkaWVzZXMgZmxhZyBpc3QgbnVyIGJpcyB6dW0gZXJzdGVuIG1vdmUgZ2VzZXR6dC4gTmltbXQgZGFuYWNoIGFsc28gYXVjaAorICAgU2V0KE5QQ19ORUVEU19JVEVNX0lOSVQsIDEpOyAgLy8ga2VpbmVuIFNwZWljaGVyIG1laHIgaW4gQW5zcHJ1Y2guCisgICAvLyBTZXQoUF9JVEVNUywgKHt9KSk7IC8vIGtlaW5lIGluaXRpYWxpc2llcnVuZyBzcGFydCBTcGVpY2hlciAgCit9CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZV9zdXBlcigpIHsKKyAgICAgIHNldF9uZXh0X3Jlc2V0KC0xKTsKK30KKworcHJvdGVjdGVkIG9iamVjdCogbWF5YmVfb3duX3N0dWZmKCkgeworICBvYmplY3QqIG9icyA9IGFsbF9pbnZlbnRvcnkoZW52aXJvbm1lbnQoKSk7CisgIG9iamVjdCBoYXVmZW4gPSBwcmVzZW50KCJcbmhhdWZlbiAiK25hbWUoV0VNKSxlbnZpcm9ubWVudCgpKTsKKyAgaWYoIG9iamVjdHAoaGF1ZmVuKSApIG9icyArPSBhbGxfaW52ZW50b3J5KGhhdWZlbik7CisgIG9iamVjdCBsZWljaGUgPSBwcmVzZW50KCJcbmxlaWNoZSAiK25hbWUoV0VNKSxlbnZpcm9ubWVudCgpKTsKKyAgaWYoIG9iamVjdHAobGVpY2hlKSApIG9icyArPSBhbGxfaW52ZW50b3J5KGxlaWNoZSk7CisgIHJldHVybiBvYnM7Cit9CisKKy8vIGNsb250IGFsbGUgT2JqZWt0ZSBkaWUgZ2VjbG9udCB3ZXJkZW4gbXVlc3Nlbi4uLgorcHJvdGVjdGVkIHZvaWQgX2Nsb25lX2l0ZW1zKCkKK3sKKyAgaW50IGksIGosIG1vZGUsIHJlZnJlc2g7CisgIG9iamVjdCBvYiwgKmludjE7CisgIG1peGVkICBwcm9wcywgKml0ZW1zOworICBzdHJpbmcgZmlsZSwgKmludjI7CisKKyAgaWYgKCFwb2ludGVycChpdGVtcz1RdWVyeVByb3AoUF9JVEVNUykpKSByZXR1cm47CisgIGlmIChlbnZpcm9ubWVudCgpKSB7IC8vIExpc3RlIG1pdCBmaWxlbmFtZW4gKGludjIpIGVyc3RlbGxlbi4KKyAgICBpbnYxID0gbWF5YmVfb3duX3N0dWZmKCk7CisgICAgaW52MiA9IG1hcChpbnYxLCAjJ2xvYWRfbmFtZSk7CisgIH0KKyAgZWxzZSBpbnYyPSh7fSk7IC8vIGludjEgd2lyZCBnYXIgbmljaHQgbWVociBiZW5vZXRpZ3QKKworICBmb3IgKGk9c2l6ZW9mKGl0ZW1zKS0xOyBpPj0wOyBpLS0pIHsKKyAgICBvYiA9IGl0ZW1zW2ldW1JJVEVNX09CSkVDVF07CisgICAgZmlsZSA9IGl0ZW1zW2ldW1JJVEVNX0ZJTEVdOworICAgIG1vZGUgPSBpdGVtc1tpXVtSSVRFTV9SRUZSRVNIXTsKKyAgICByZWZyZXNoID0gbW9kZSAmIDB4MDAwMGZmZmY7CisgICAgcHJvcHMgPSBpdGVtc1tpXVtSSVRFTV9QUk9QU107CisgICAgaWYgKHByb3BzICYmIGludHAocHJvcHMpKSB7IC8vIHVuaXF1ZSBHZWdlbnN0YW5kPworICAgICAgb2I9ZmluZF9vYmplY3QoZmlsZSk7CisgICAgICBpZiAob2IpIHsKKyAgICAgICAgLy8ga2FubiBvYiBhdWZnZW5vbW1lbiB3ZXJkZW4/IFdlbm4gZGFzIE9iamVrdCBpbiBpbnYxIGRyaW4gaXN0LCBpc3QgZXMKKyAgICAgICAgLy8gaW0gRW52IG9kZXIgaW4gZWluZXIgTGVpY2hlIG9kZXIgZWluZW0gSGF1ZmVuLgorICAgICAgICBpZiAobWVtYmVyKGludjEsb2IpID4gLTEpIHsKKyAgICAgICAgICBpZiAoZW52aXJvbm1lbnQoKSkgeworICAgICAgICAgICAgaWYgKGVudmlyb25tZW50KG9iKSA9PSBlbnZpcm9ubWVudCgpKQorICAgICAgICAgICAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSwKKyAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUobmFtZShXRVIpKSsiIGhlYnQgIitvYi0+bmFtZShXRU4pKyIgYXVmLlxuIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudCgpLGJyZWFrX3N0cmluZygKKyAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUobmFtZShXRVIpKSsiIG5pbW10ICIrb2ItPm5hbWUoV0VOKSsgIiBhdXMgIgorICAgICAgICAgICAgICAgICAgK2Vudmlyb25tZW50KG9iKS0+bmFtZShXRU0pICsgIi4iLDc4KSk7CisgICAgICAgICAgfQorICAgICAgICAgIG9iLT5yZW1vdmUoKTsgIC8vIHplcnN0b2VyZW4gdW5kIG5ldWxhZGVuLgorICAgICAgICAgIGlmIChvYikgZGVzdHJ1Y3Qob2IpOworICAgICAgICAgIGlmIChjYXRjaChvYj1sb2FkX29iamVjdChmaWxlKTtwdWJsaXNoKSkgICAgICAgICAgICAgCisgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoCisgICAgICAgICAgICAgICAgIl9jbG9uZV9pdGVtcygpOiAlTyBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgbG9hZGFibGVcbiIsIGZpbGUpKTsgCisgICAgICAgICAgb2ItPm1vdmUodGhpc19vYmplY3QoKSwgTV9OT0NIRUNLKTsKKyAgICAgICAgICBpdGVtc1tpXVtSSVRFTV9PQkpFQ1RdPW9iOworICAgICAgICB9CisgICAgICAgIGVsc2Ugc3dpdGNoKCByZWZyZXNoICkgeworICAgICAgICAgIGNhc2UgUkVGUkVTSF9ERVNUUlVDVDoKKyAgICAgICAgICAgIGlmIChlbnZpcm9ubWVudChvYikpIHsKKyAgICAgICAgICAgICAgb2I9MDsgLy8gbmljaHQgenVlY2tlbiwgdHJhZ2VuLCBpbml0aWFsaXNpZXJlbi4uLgorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIFJFRlJFU0hfQUxXQVlTOgorICAgICAgICAgIGNhc2UgUkVGUkVTSF9SRU1PVkU6ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgb2ItPnJlbW92ZSgpOworICAgICAgICAgICAgaWYgKG9iKSBkZXN0cnVjdChvYik7CisgICAgICAgICAgICBpZiAoY2F0Y2gob2I9bG9hZF9vYmplY3QoZmlsZSk7cHVibGlzaCkpIAorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIl9jbG9uZV9pdGVtcygpOiAiCisgICAgICAgICAgICAgICAgICAgICAgIiVPIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBsb2FkYWJsZVxuIiwgZmlsZSkpOworICAgICAgICAgICAgb2ItPm1vdmUodGhpc19vYmplY3QoKSwgTV9OT0NIRUNLKTsKKyAgICAgICAgICAgIGl0ZW1zW2ldW1JJVEVNX09CSkVDVF09b2I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFJFRlJFU0hfTk9ORToKKyAgICAgICAgICBkZWZhdWx0OiBvYj0wOyAvLyBuaWNodCB6dWVja2VuLCB0cmFnZW4sIGluaXRpYWxpc2llcmVuLi4uCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBpZiAoY2F0Y2gob2I9bG9hZF9vYmplY3QoZmlsZSk7cHVibGlzaCkpIHJhaXNlX2Vycm9yKHNwcmludGYoCisgICAgICAgICAgIl9jbG9uZV9pdGVtcygpOiAlTyBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgbG9hZGFibGVcbiIsIGZpbGUpKTsKKyAgICAgICAgaWYgKG9iamVjdHAob2IpKSBvYi0+bW92ZSh0aGlzX29iamVjdCgpLCBNX05PQ0hFQ0spOworICAgICAgICBpdGVtc1tpXVtSSVRFTV9PQkpFQ1RdPW9iOworICAgICAgfQorICAgIH0gLy8gaWYgKHByb3BzIC4uLikgLy8gYWxzbyBuaWNodCB1bmlxdWUKKyAgICBlbHNlIHsKKyAgICAgIHN3aXRjaCggcmVmcmVzaCApIHsKKyAgICAgICAgY2FzZSBSRUZSRVNIX0RFU1RSVUNUOiAvLyBlcmZ1ZWxsdCBhdWNoIFJFRlJFU0hfUkVNT1ZFIEJlZGluZ3VuZy4uLgorICAgICAgICAgIGlmIChvYikgeworICAgICAgICAgICAgb2I9MDsgLy8gbmljaHQgenVlY2tlbiwgdHJhZ2VuLCBpbml0aWFsaXNpZXJlbi4uLgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICBjYXNlIFJFRlJFU0hfUkVNT1ZFOgorICAgICAgICAgIGlmIChvYikgeworICAgICAgICAgICAgaWYocHJlc2VudChvYiwgdGhpc19vYmplY3QoKSkpIHsKKyAgICAgICAgICAgICAgb2I9MDsgLy8gbmljaHQgenVlY2tlbiwgdHJhZ2VuLCBpbml0aWFsaXNpZXJlbi4uLgorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICBpZiAoKG1lbWJlcihpbnYyLCBmaWxlKSk9PS0xKSB7ICAKKyAgICAgICAgICAgICAgICBvYj0wOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICBjYXNlIFJFRlJFU0hfTk9ORTogLy8gd2lyZCBlbnRmZXJudCBuYWNoIGRlbSBlcnN0ZW4gY2xvbmVuISEhCisgICAgICAgIGNhc2UgUkVGUkVTSF9BTFdBWVM6CisgICAgICAgICAgLy8gc2NoYXVlbiBvYiBkZXIgR2VnZW5zdGFuZCBpbSBlbnZpcm9ubWVudCBsaWVndC4KKyAgICAgICAgICBpZiAoKGo9bWVtYmVyKGludjIsIGZpbGUpKSE9LTEpIHsKKyAgICAgICAgICAgIG9iPWludjFbal07IC8vIGludjEga2FubiBsZWVyIHNlaW4sIGFiZXIgZGFubiBpc3QgaW52MiBhdWNoIGxlZXIKKyAgICAgICAgICAgIGludjFbal09MDsgLy8gd2ljaHRpZyBmYWxscyBtZWhyZXJlIGdsZWljaGUgQWRkSXRlbXMKKyAgICAgICAgICAgIGludjJbal09MDsgLy8gPSAwIHNldHplbiB1bSBBcnJheSBrb3BpZXJlbiB6dSB2ZXJtZWlkZW4KKyAgICAgICAgICAgIGlmIChlbnZpcm9ubWVudCgpKSB7CisgICAgICAgICAgICAgIGlmIChlbnZpcm9ubWVudCgpID09IGVudmlyb25tZW50KG9iKSkKKyAgICAgICAgICAgICAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSwKKyAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShuYW1lKFdFUikpKyIgaGVidCAiK29iLT5uYW1lKFdFTikrIiBhdWYuXG4iKTsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudCgpLGJyZWFrX3N0cmluZygKKyAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShuYW1lKFdFUikpKyIgbmltbXQgIitvYi0+bmFtZShXRU4pKyIgYXVzICIKKyAgICAgICAgICAgICAgICAgICAgK2Vudmlyb25tZW50KG9iKS0+bmFtZShXRU0pICsgIi4iLDc4KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChvYikgeworICAgICAgICAgICAgb2ItPnJlbW92ZSgpOworICAgICAgICAgICAgaWYgKG9iKSBkZXN0cnVjdChvYik7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChjYXRjaChvYj1jbG9uZV9vYmplY3QoZmlsZSk7cHVibGlzaCkpIHJhaXNlX2Vycm9yKHNwcmludGYoCisgICAgICAgICAgICAiX2Nsb25lX2l0ZW1zKCk6ICVPIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBsb2FkYWJsZVxuIiwgZmlsZSkpOworICAgICAgICAgIG9iLT5tb3ZlKHRoaXNfb2JqZWN0KCksIE1fTk9DSEVDSyk7CisgICAgICAgICAgc3dpdGNoKCByZWZyZXNoICkgeworICAgICAgICAgIGNhc2UgUkVGUkVTSF9OT05FOgorICAgICAgICAgICAgaXRlbXNbaV0gPSAwOyAvLyBTcGVpY2hlciBmcmVpbWFjaGVuCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFJFRlJFU0hfQUxXQVlTOgorICAgICAgICAgICAgaXRlbXNbaV1bUklURU1fT0JKRUNUXSA9IDA7IC8vIE9iamVrdCAidmVyZ2Vzc2VuIgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGl0ZW1zW2ldW1JJVEVNX09CSkVDVF0gPSBvYjsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IG9iPTA7IC8vIG5pY2h0IHp1ZWNrZW4sIHRyYWdlbiwgaW5pdGlhbGlzaWVyZW4uLi4KKyAgICAgIH0KKyAgICB9IC8vIGlmIChwcm9wcyAuLi4pIGVsc2UgCisgICAgaWYgKG9iKSB7CisgICAgICBpZiAobWFwcGluZ3AocHJvcHMpKSB3YWxrX21hcHBpbmcocHJvcHMsIHN5bWJvbF9mdW5jdGlvbigiU2V0UHJvcCIsIG9iKSk7CisgICAgICAvLyBFaWdlbnRsaWNoIHdpbGwgbWFuIGhpZXIgc293YXMgd2llIGNvbW1hbmQoInp1ZWNrZSBzY2h3ZXJ0IikKKyAgICAgIC8vIG1hY2hlbiwgYWJlciBkYXMgaGFuZGxpbmcgZGVyIGlkJ3Mga2FubiBuaWNodCBzaWNoZXJzdGVsbGVuLAorICAgICAgLy8gZGFzcyBkZXIgTlBDIGRpZSByaWNodGlnZSBXYWZmZSBlcndpc2NodCwgZGVzaGFsYiBtYWNoZW4gd2lyCisgICAgICAvLyBkYXMgdHJhZ2VuIGhpZXIgdm9uIEhhbmQuCisgICAgICBpZiAobW9kZSAmIENMT05FX1dFQVIpIHsKKyAgICAgICAgaWYoIG1vZGUgJiBDTE9ORV9OT19DSEVDSyApIHsKKyAgICAgICAgICBvYmplY3QgKmFybW91cnM7CisgICAgICAgICAgb2ItPkRvVW53ZWFyKCk7IC8vIGV2dGwuIGRlbSBWb3JnYWVuZ2VyIGFibmVobWVuLgorICAgICAgICAgIFVzZUhhbmRzKG9iLCBvYi0+UXVlcnlQcm9wKFBfTlJfSEFORFMpKTsKKyAgICAgICAgICBhcm1vdXJzPVF1ZXJ5UHJvcChQX0FSTU9VUlMpKyh7IG9iIH0pOworICAgICAgICAgIFNldFByb3AoUF9BUk1PVVJTLCBhcm1vdXJzKTsKKyAgICAgICAgICBTZXRQcm9wKFBfVE9UQUxfQUMsIFF1ZXJ5UHJvcChQX1RPVEFMX0FDKStvYi0+UXVlcnlQcm9wKFBfQUMpKTsKKyAgICAgICAgICBvYi0+U2V0UHJvcChQX1dPUk4sIHRoaXNfb2JqZWN0KCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvbW1hbmQoICJ0cmFnZSBcbiIrb2JqZWN0X25hbWUob2IpICk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChtb2RlICYgQ0xPTkVfV0lFTEQpIHsKKyAgICAgICAgaWYoIG1vZGUgJiBDTE9ORV9OT19DSEVDSyApIHsKKyAgICAgICAgICBvYi0+RG9VbndpZWxkKCk7IC8vIGV2dGwuIGRlbSBWb3JnYWVuZ2VyIGFibmVobWVuLiAKKyAgICAgICAgICBVc2VIYW5kcyhvYiwgb2ItPlF1ZXJ5UHJvcChQX05SX0hBTkRTKSk7CisgICAgICAgICAgU2V0UHJvcChQX1dFQVBPTiwgb2IpOworICAgICAgICAgIFNldFByb3AoUF9UT1RBTF9XQywgb2ItPlF1ZXJ5UHJvcChQX1dDKSk7CisgICAgICAgICAgb2ItPlNldFByb3AoUF9XSUVMREVELCB0aGlzX29iamVjdCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjb21tYW5kKCAienVlY2tlIFxuIitvYmplY3RfbmFtZShvYikgKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gLy8gaWYgKG9iKSAKKyAgfSAvLyBmb3IgaQorICBpdGVtcy09KHsgMCB9KTsgLy8gUkVGUkVTSF9OT05FcyB2b24gbmljaHQgdW5pcXVlIE9iamVrdGVuIAorICBpZiAoIXNpemVvZihpdGVtcykpIGl0ZW1zPTA7IC8vIFNwZWljaGVyIHNwYXJlbi4uLgorICBTZXRQcm9wKFBfSVRFTVMsIGl0ZW1zKTsKKyAgU2V0KE5QQ19ORUVEU19JVEVNX0lOSVQsIDApOworfQorCitwdWJsaWMgdmFyYXJncyBvYmplY3QgQWRkSXRlbShtaXhlZCBmaWxlbmFtZSwgaW50IHJlZnJlc2gsIG1peGVkIHByb3BzKQoreworICAvLyBBdXMgQXJyYXkgZWluIEVsZW1lbnQgYXVzd2FlaGxlbgorICBpZiAocG9pbnRlcnAoZmlsZW5hbWUpKSAKKyAgICBmaWxlbmFtZSA9IGZpbGVuYW1lW3JhbmRvbShzaXplb2YoZmlsZW5hbWUpKV07CisgCisgIC8vIEtlaW4gU3RyaW5nPyAtPiBGZWhsZXIKKyAgaWYgKCFzdHJpbmdwKGZpbGVuYW1lKSl7CisgICAgcmFpc2VfZXJyb3IoIkFkZEl0ZW06IGZpbGVuYW1lIG9yIGFycmF5IG9mIGZpbGVuYW1lcyBleHBlY3RlZC5cbiIpOyAKKyAgfSBlbHNlIHsKKyAgICAvLyBQZmFkIG5vcm1pZXJlbiB1bmQgZXZlbnR1ZWxsIHZvcmhhbmRlbmVzICIuYyIgZW50ZmVybmVuCisgICAgZmlsZW5hbWUgPSBNQVNURVItPl9nZXRfcGF0aCgKKyAgICAgICAgICAgICAgICAgIGZpbGVuYW1lWzwyLi5dPT0iLmMiP2ZpbGVuYW1lPWZpbGVuYW1lWzAuLjwzXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZmlsZW5hbWUsIj8iKTsgCisgICAgLy8gUHJvcGVydHkgc2V0emVuCisgICAgU2V0UHJvcChQX0lURU1TLCAoUXVlcnlQcm9wKFBfSVRFTVMpfHwoe30pKSsKKyAgICAgICAgICAgICAgICAgICAgICh7ICh7IDAsIGZpbGVuYW1lLCByZWZyZXNoLCBwcm9wcyB9KSB9KSk7CisKKyAgaWYgKGVudmlyb25tZW50KCkpIF9jbG9uZV9pdGVtcygpOworICB9CisgIHJldHVybiAwOworfQorCit2b2lkIHJlc2V0KCkKKy8vIGZ1ZXIgUkVGUkVTSF8gT2JqZWt0ZS4uLgoreworICBfY2xvbmVfaXRlbXMoKTsKK30KKwpkaWZmIC0tZ2l0IGEvc3RkL25wYy9tb3ZpbmcuYyBiL3N0ZC9ucGMvbW92aW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA2ZTBkYQotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9ucGMvbW92aW5nLmMKQEAgLTAsMCArMSwzOSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGxpdmluZy9tb3ZpbmcuYyAtLSBtb3Zpbmcgb2YgbGl2aW5nIG9iamVjdHMKKy8vCisvLyAkSWQkCisjcHJhZ21hIHN0cm9uZ190eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisKK2luaGVyaXQgIi9zdGQvbGl2aW5nL21vdmluZyI7CisKKyNpbmNsdWRlIDxob29rLmg+CisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPG1vdmluZy5oPgorCisvLzxpbnR8PHN0cmluZ3xjbG9zdXJlPiogPiogR3VhcmRFeGl0KG9iamVjdCByb29tLCBpbnQgaG9va2lkLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RyaW5nfGNsb3N1cmU+KiBoZGF0YSkKKy8veworLy99CisKK3Byb3RlY3RlZCBpbnQgX3JlZ19leGl0X2hvb2sob2JqZWN0IGRlc3QsIG9iamVjdCBvbGRlbnYpCit7CisgIGNsb3N1cmUgY2wgPSBzeW1ib2xfZnVuY3Rpb24oIkd1YXJkRXhpdCIsIHRoaXNfb2JqZWN0KCkpOworICBpZiAoY2wpCisgIHsKKyAgICBpZiAob2xkZW52KQorICAgICAgb2xkZW52LT5IVW5yZWdpc3RlckZyb21Ib29rKEhfSE9PS19FWElUX1VTRSwgY2wpOworICAgIHJldHVybiBkZXN0LT5IUmVnaXN0ZXJNb2RpZmllcihIX0hPT0tfRVhJVF9VU0UsIGNsKTsKKyAgfQorICByZXR1cm4gMDsKK30KKy8vIEtyYW1zIG5hY2ggZGVtIE1vdmUgbWFjaGVuIHVuZCBuZWJlbmJlaSB6dW0gVWViZXJzY2hyZWliZW4uCitwcm90ZWN0ZWQgdm9pZCBOb3RpZnlNb3ZlKG9iamVjdCBkZXN0LCBvYmplY3Qgb2xkZW52LCBpbnQgbWV0aG9kKQoreworICBfcmVnX2V4aXRfaG9vayhkZXN0LCBvbGRlbnYpOworICByZXR1cm4gOjpOb3RpZnlNb3ZlKGRlc3QsIG9sZGVudiwgbWV0aG9kKTsKK30KZGlmZiAtLWdpdCBhL3N0ZC9ucGMvcHV0X2FuZF9nZXQuYyBiL3N0ZC9ucGMvcHV0X2FuZF9nZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjcyY2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkL25wYy9wdXRfYW5kX2dldC5jCkBAIC0wLDAgKzEsMzYgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBucGMvcHV0X2FuZF9nZXQuYy5jIC0tIEdlYmVuIHVuZCBuZWhtZW4gZnVlciBOUENzCisvLworLy8gJElkOiBwdXRfYW5kX2dldC5jIDYzNzEgMjAwNy0wNy0xNyAyMjo0Njo1MFogWmVzc3RyYSAkCisjcHJhZ21hIHN0cm9uZ190eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisKK2luaGVyaXQgInN0ZC9saXZpbmcvcHV0X2FuZF9nZXQiOworI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKwordm9pZCBnaXZlX25vdGlmeSggb2JqZWN0IG9iaiApCit7CisgICBtaXhlZCogbXNnOworICAgaWYgKHBvaW50ZXJwKG1zZz1RdWVyeVByb3AoUF9SRUpFQ1QpKSkgeworICAgICAgc3dpdGNoKG1zZ1swXSkgeworICAgICAgICAgY2FzZSBSRUpFQ1RfR0lWRToKKyAgICAgICAgICAgIHNheShtc2dbMV0pOworICAgICAgICAgICAgZ2l2ZV9vYmooIG9iaiwgdGhpc19wbGF5ZXIoKSApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBjYXNlIFJFSkVDVF9MSUdIVF9NT0RJRklFUjoKKyAgICAgICAgICAgIGlmIChvYmotPlF1ZXJ5UHJvcChQX0xJR0hUX01PRElGSUVSKSB8fAorICAgICAgICAgICAgICAgIG9iai0+UXVlcnlQcm9wKFBfTElHSFQpKSBicmVhazsKKyAgICAgICAgIGNhc2UgUkVKRUNUX0RST1A6CisgICAgICAgICAgICBzYXkobXNnWzFdKTsKKyAgICAgICAgICAgIGRyb3Bfb2JqKCBvYmogKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSBSRUpFQ1RfS0VFUDoKKyAgICAgICAgIGRlZmF1bHQ6IHNheShtc2dbMV0pOyAvKiBrZWVwIGl0ICovCisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zdGQvbnBjL3NlcXVlbmNlci5jIGIvc3RkL25wYy9zZXF1ZW5jZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGM4NWUzCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL25wYy9zZXF1ZW5jZXIuYwpAQCAtMCwwICsxLDEyNSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIG5wYy9zZXF1ZW5jZXIuYyAtLSBTY3JpcHRlIHVuZCBUcmlnZ2VyIGZ1ZXIgTlBDcyA6KQorLy8KKy8vICRJZDogc2VxdWVuY2VyLmMgNzUyNiAyMDEwLTA0LTAyIDAwOjAxOjI2WiBBcmF0aG9ybiAkCisKKy8vIHNlcTIuYworLy8gVmVyc2lvbiAyLjAgZGVzIFNlcXVlbmNlcnMgdm9uIERvbiBSdW1hdGEgMjguMDYuOTMKKy8vIAorLy8gU2lubjoKKy8vICAgQmVyZWl0c3RlbGx1bmcgdm9uIEZ1bmt0aW9uZW4sIGRkYW1pdCBlaW4gbnBjIG1laHJlcmUgQmVmZWhsZQorLy8gICBiZWkgRWludHJpdHQgZWluZXMgYmVzdGltbXRlbiBFcmVpZ25pc3NlcyBuYWNoZWluYW5kZXIKKy8vICAgYXV0b21hdGlzY2ggZHVyY2hmdWVocnQuCisvLworLy8gRXJlaWduaXNzZToKKy8vICAgVGVsbEV2ZW50OiBFcyB3aXJkIGV0d2FzIGluIGRlbSBSYXVtLCBpbiBkZW0gZGVyIG5wYyBzaWNoCisvLyAgICAgICAgICAgICAgYmVmaW5kZXQsIGdlc2FndC4KKy8vICAgR2l2ZUV2ZW50OiBFcyB3aXJkIGRlbSBucGMgZXR3YXMgZ2VnZWJlbi4KKy8vCisvLyBQcm9ncmFtbToKKy8vICAgRWluIFByb2dyYW1tIGlzdCBlaW5lIExpc3RlIHZvbiBCZWZlaGxlbi4KKy8vICAgSmVkZXIgQmVmZWhsIGlzdCBlaW5lIExpc3RlLCBiZXN0ZWhlbmQgYXVzIGVpbmVtIEtvbW1hbmRvCisvLyAgIHVuZCBlaW5lciBaYWhsLgorLy8gICBEYXMgS29tbWVuZG8gd2lyZCBhZWhubGljaCBkZXIgQmVmZWhsZSwgZGllIGVpbiBTcGllbGVyIGVpbi0KKy8vICAgZ2lidCBhdXNnZWZ1ZWhydC4KKy8vICAgVm9yc2ljaHQ6IE5QQ3Mga29lbm5lbiBudXIgZWluZW4gVGVpbCBkZXIgQmVmZWhsZSwgZGllIGVpbgorLy8gICBTcGllbGVyIGthbm4sIGRhZnVlciBhYmVyIGltbWVyICdlY2hvJyB1bmQgJ2Vtb3RlJy4KKy8vICAgRGllIFphaGwgZ2lidCBkaWUgQW56YWhsIGRlciBTZWt1bmRlbiBhbiwgaW4gZGVyIGRlciBuYWVjaHN0ZQorLy8gICBCZWZlaGwgYXVzZ2VmdWVocnQgd2lyZC4KKy8vCisvLyBGdW5rdGlvbmVuOgorLy8gICBSZWdpc3RlclRlbGwoIGZ1bmt0aW9uLCBwcm9ncmFtbSApCisvLyAgICAgV2VubiBkZW0gbnBjIGV0d2FzIGdlc2FndCB3aXJkLCBzbyB3aXJkIGRpZSBnZXNhZ3RlIE1lbGR1bmcKKy8vICAgICBhbiBkaWUgRnVua3Rpb24gdWViZXJnZWJlbi4gR2lidCBkaWUgRnVua3Rpb25lbiBuaWNodCAwCisvLyAgICAgenVydWVjaywgd2lyZCBkYXMgUHJvZ3JhbW0gZ2VzdGFydGV0LgorLy8gICBSZWdpc3RlckdpdmUoIGZ1bmt0aW9uLCBwcm9ncmFtbSApCisvLyAgICAgV2lyZCBkZW0gbnBjIGV0d2FzIGdlZ2ViZW4sIHNvIHdpcmQgZGFzIE9iamVrdCBhbiBkaWUKKy8vICAgICBGdW5rdGlvbiB1ZWJlcmdlYmVuLiBHaWJ0IGRpZSBGdW5rdGlvbiBuaWNodCAwIHp1cnVlY2ssIHNvCisvLyAgICAgd2lyZCBkYXMgUHJvZ3JhbW0gZ2VzdGFydGV0LgorLy8gICBMb2FkKCBwcm9ncmFtbSApCisvLyAgICAgU3RhcnRlIGRhcyBhbmdlZ2ViZW5lIFByb2dyYW1tLgorLy8KKy8vICAgZ2l2ZV9ub3RpZnkoKSBnaWJ0IGVpbmUgMSB6dXJ1ZWNrLCB3ZW5uIGRhcyBPYmpla3QgYWt6ZXB0aWVydAorLy8gICAgIHd1cmRlLiAoRXMgbXVzcyAtIGZhbGxzIGdld3VlbnNjaHQgLSBkYW5uIHZvbiBIYW5kIHp1cnVlY2gtCisvLyAgICAgZ2VnZWJlbiB3ZXJkZW4uIChnaXZlX29iaihvYix0aGlzX3BsYXllcigpKSkgaW4gZGVyIEZ1bmsuKQorLy8gICBtaXR0ZWxzIGFkZF9hY3Rpb24oKSBrYW5uIG1hbiBpbSBjcmVhdGUoKSBkcyBOUENzIGVpZ2VuZQorLy8gICAgIFZlcmJlbiBmdWVyIGRlbiBOUEMgZWluZnVlaHJlbi4KKy8vCisvLyBFcyBrYW5uIGltbWVyIG51ciBlaW5lIEZ1bmt0aW9uIChlZ2FsIG9iIFRlbGwgb2RlciBHaXZlKSBhbmdlbWVsZGV0CisvLyBzZWluLiBFcyBrYW5uIGltbWVyIG51ciBlaW4gUHJvZ3JhbW0gZ2xlaWNoemVpdGlnIGxhdWZlbi4KKy8vCisvLyBJZGVlbiB1bmQgQnVncmVwb3J0cyBhbiBSdW1hdGEKKworc3RyaW5nIGdpdmVmdW4sIHRlbGxmdW47CittaXhlZCAqcHJvZ3JhbTsKK2ludCBpc1J1bm5pbmc7CisKKy8vIHp1ciBzaWNoZXJoZWl0IG5pY2h0IHZvbiBhdXNzZW4gYXVmcnVmYmFyICEhISEKK3N0YXRpYyBzdHJpbmcgUmVnaXN0ZXJHaXZlKCBzdHJpbmcgZnVuLCBtaXhlZCBwcm9nICkKK3sKKyAgaWYoIGlzUnVubmluZyApIHJldHVybiAwOworICBwcm9ncmFtID0gcHJvZzsKKyAgdGVsbGZ1biA9IDA7CisgIHJldHVybiBnaXZlZnVuID0gZnVuOworfQorCisvLyB6dXIgc2ljaGVyaGVpdCBuaWNodCB2b24gYXVzc2VuIGF1ZnJ1ZmJhciAhISEhCitzdGF0aWMgc3RyaW5nIFJlZ2lzdGVyVGVsbCggc3RyaW5nIGZ1biwgbWl4ZWQgcHJvZyApCit7CisgIGlmKCBpc1J1bm5pbmcgKSByZXR1cm4gMDsKKyAgcHJvZ3JhbSA9IHByb2c7CisgIGdpdmVmdW4gPSAwOworICByZXR1cm4gdGVsbGZ1biA9IGZ1bjsKK30KKworLy8genVyIHNpY2hlcmhlaXQgbmljaHQgdm9uIGF1c3NlbiBhdWZydWZiYXIgISEhIQorc3RhdGljIHZvaWQgU3RhcnQoKQoreworICBpZiggaXNSdW5uaW5nIHx8ICFvYmplY3RwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgIGlzUnVubmluZyA9IDE7CisgIGNhbGxfb3V0KCAibmV4dFN0ZXAiLCAwLCAwICk7Cit9CisKK3N0YXRpYyB2b2lkIExvYWQoIG1peGVkIHByb2cgKQoreworICBpZiggaXNSdW5uaW5nICkgcmV0dXJuOworICBwcm9ncmFtID0gcHJvZzsKKyAgU3RhcnQoKTsKK30KKworcHVibGljIHZvaWQgY2F0Y2hfdGVsbCggc3RyaW5nIHN0ciApCit7CisgIGlmKCBpc1J1bm5pbmcgfHwgcHJldmlvdXNfb2JqZWN0KCk9PXRoaXNfb2JqZWN0KCkpIHJldHVybjsKKyAgaWYoIHN0cmluZ3AodGVsbGZ1bikgJiYgY2FsbF9vdGhlciggdGhpc19vYmplY3QoKSwgdGVsbGZ1biwgc3RyICkgKQorICAgIFN0YXJ0KCk7Cit9CisKK2ludCBnaXZlX25vdGlmeSggb2JqZWN0IG9iICkKK3sKKyAgaWYoIGlzUnVubmluZyApIHJldHVybiAwOworICBpZiggc3RyaW5ncChnaXZlZnVuKSAmJiBjYWxsX290aGVyKCB0aGlzX29iamVjdCgpLCBnaXZlZnVuLCBvYiApICkKKyAgeworICAgIFN0YXJ0KCk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG5leHRTdGVwKCBpbnQgbGluZSApCit7CisgIGlmKCAhaXNSdW5uaW5nICkgcmV0dXJuOworICBpZiggbGluZSA+PSBzaXplb2YoIHByb2dyYW0gKSApCisgIHsKKyAgICBpc1J1bm5pbmcgPSAwOworICAgIHJldHVybjsKKyAgfQorICBjb21tYW5kKCBwcm9jZXNzX3N0cmluZyggcHJvZ3JhbVtsaW5lXVswXSApICk7CisgIGlmKCAhaXNSdW5uaW5nIHx8ICFvYmplY3RwKHRoaXNfb2JqZWN0KCkpICkgcmV0dXJuOworICBjYWxsX291dCggIm5leHRTdGVwIiwgcHJvZ3JhbVtsaW5lXVsxXSwgbGluZSsxICk7Cit9CisKK21peGVkIFF1ZXJ5UHJvZygpCit7CisgIHJldHVybiBwcm9ncmFtWzAuLl07Cit9IApkaWZmIC0tZ2l0IGEvc3RkL3BpbGUuYyBiL3N0ZC9waWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNmZTVlZgotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9waWxlLmMKQEAgLTAsMCArMSwxMjQgQEAKKy8vIEVpbiB0cmFuc3BhcmVudGVyIENvbnRhaW5lciwgaW4gZGVtIGRpZSBHZWdlbnN0YWVuZGUgbGFuZGVuLAorLy8gZGllIGVpbiBTcGllbGVyIGJlaSBzZWluZW0gVG9kIHZlcmxpZXJ0LgorLy8gU2lubiBkaWVzZXMgT2JqZWt0ZXMgaXN0IGVzLCBkYXMgaW52ZW5vdHJ5IGVpbmVzIFJhdW1lcyBrbGVpbgorLy8genUgaGFsdGVuIHVuZCBkaWUga29zdGVuIGltIGluaXQoKSBlaW5lcyBTcGllbGVycyB6dSBzZW5rZW4uCisKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgcGVkYW50aWMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKworaW5oZXJpdCAic3RkL2NvbnRhaW5lciI7CisKKy8vIFNwaWVsZXJoYXVmZW4gc29sbGVuIHNpY2ggZXR3YXMgYW5kZXJzIGFscyBOUEMtaGF1ZmVuIHZlcmhhbHRlbi4KK3ByaXZhdGUgbm9zYXZlIHN0YXR1cyBzcGllbGVyaGF1ZmVuOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorCit2b2lkIGNyZWF0ZSgpIHsKKwlzdHJpbmcgdm9uOworCWlmIChvYmplY3RfbmFtZSh0aGlzX29iamVjdCgpKSA9PSBfX0ZJTEVfX1swLi48M10pIHsKKwkgIHNldF9uZXh0X3Jlc2V0KC0xKTsKKwkgIHJldHVybjsKKwl9ICAgCisJaWYoICFjbG9uZXAodGhpc19vYmplY3QoKSkgKSByZXR1cm47CisJOjpjcmVhdGUoKTsKKwl2b24gPSAoc3RyaW5nKXByZXZpb3VzX29iamVjdCgpLT5RdWVyeVByb3AoUF9QSUxFX05BTUUpOworCVNldFByb3AoIFBfUElMRV9OQU1FLCAiXG5oYXVmZW4gIit2b24gKTsKKwlzcGllbGVyaGF1ZmVuID0gKGludClwcmV2aW91c19vYmplY3QoKS0+SXNQbGF5ZXJDb3Jwc2UoKTsKKworCUFkZElkKCAoeyJoYXVmZW4iLCJrcmVtcGVsIiwia2x1ZW5nZWwiLCJnZWdlbnN0YWVuZGUifSkgKTsKKwlBZGRJZCggUXVlcnlQcm9wKFBfUElMRV9OQU1FKSApOworCVNldFByb3AoIFBfTkFNRSwgIkhhdWZlbiBLcmVtcGVsIiApOworCVNldFByb3AoIFBfR0VOREVSLCBNQUxFICk7CisJU2V0UHJvcCggUF9JTkZPLCAiRGllc2UgR2VnZW5zdGFlbmRlIGdlaG9lcnRlbiBlaW5tYWwgIiArIHZvbiArICIuXG4iICk7CisJU2V0UHJvcCggUF9MT05HLCBicmVha19zdHJpbmcoIkR1IGJldHJhY2h0ZXN0IGVpbmVuIEhhdWZlbiwgZGVyIGF1cyBlaW5lciB2b24gTGVpY2hlbnJlc3RlbiB6dXNhbW1lbmdlYmFja2VuZW4gTWVuZ2UgZGl2ZXJzZXIgR2VnZW5zdGFlbmRlIGJlc3RlaHQuIFp1bSBHbHVlY2sgaXN0IHZvbiBkZXIgTGVpY2hlIG5pY2h0IG1laHIgZ2VudWcgdWVicmlnLCB1bSBFa2VsZ2VmdWVobGUgenUgd2Vja2VuLiBHYW56IGltIEdlZ2VudGVpbDogRGlyIGp1Y2t0IGVzIGVpbiB3ZW5pZyBpbiBkZW4gRmluZ2VybiwgRGljaCBhbiBkaWVzZW0gSGF1ZmVuIHp1IGJlZGllbmVuLiBBYmVyIG1hbiBrYW5uIHNpY2ggbmllIGdhbnogc2ljaGVyIHNlaW4sIG9iIG5pY2h0IGRvY2ggZWluIEZsdWNoIGF1ZiBkZW4gRGluZ2VuIGxhc3RldC4gVmllbGxlaWNodCBoYXQgZGVyIHZlcnNjaGllZGVuZSBCZXNpdHplciBzaWUgYXVjaCBqZW1hbmRlbSB2ZXJlcmJ0PyBBbmRlcmVyc2VpdHMsIHdlbm4gZ2VyYWRlIG5pZW1hbmQgZ3Vja3QgLi4uXG4iICkgKTsKKwlBZGREZXRhaWwoICh7ImZldHplbiIsImxlaWNoZSIsImxlaWNoZW50ZWlsZSJ9KSwgIk1pdCBibG9zc2VuIEF1Z2VuIGthbm4gbWFuIG5pY2h0IG1laHIgdmllbCBlcmtlbm5lbiwgYWJlciBlaW5pZ2UgRmV0emVuIGRldXRlbiBkYXJhdWYgaGluLCBkYXNzIGRpZSBTYWNoZW4gdm9uICIrdm9uKyIgc3RhbW1lbi5cbiIgKTsKKwlBZGREZXRhaWwoICh7ImVrZWwiLCJla2VsZ2VmdWVobGUifSksICJFcyBpc3QgbmljaHQgbWVociBnZW51ZyBkYSwgdW0gd2VsY2hlIHp1IHdlY2tlbi5cbiIgKTsKKwlBZGREZXRhaWwoICJtZW5nZSIsICJWaWVsZSBrbGVpbmUgRmV0emVuLCBkaWUgYW4gZGVuIEdlZ2Vuc3RhZW5kZW4ga2xlYmVuLlxuIiApOworCUFkZERldGFpbCggImZsdWNoIiwgIkRlbSBBbnNjaGVpbiBuYWNoIGxhc3RldCBhdWYgZGVuIFNhY2hlbiBrZWluIEZsdWNoLCBhYmVyIHdlciB3ZWlzcyAuLi4/XG4iICk7CisJY2FsbF9vdXQoICJtZXJnZV9waWxlIiwgMSApOworfQorCittaXhlZCBfcXVlcnlfc2hvcnQoKSB7CisJaW50IHN6ID0gc2l6ZW9mKGFsbF9pbnZlbnRvcnkoKSk7CisJaWYoIHN6PT0wICkgeworCQljYWxsX291dCgicmVtb3ZlIiwwLDEpOyAvLyBmYWxsYmFjaywgd2VubiBpbmhhbHQgYXVmIHVuZXJ3YXJ0ZXRlIHdlaXNlIHZlcnNjaHdpbmRldAorCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYoIHN6PDEwICkgeworCQlyZXR1cm4gIkVpbiBrbGVpbmVyIEhhdWZlbiBLcmVtcGVsIjsKKwl9IGVsc2UgaWYoIHN6PDMwICkgeworCQlyZXR1cm4gIkVpbiBIYXVmZW4gS3JlbXBlbCI7CisJfSBlbHNlIHsKKwkJcmV0dXJuICJFaW4gZ3Jvc3NlciBIYXVmZW4gS3JlbXBlbCI7CisJfQorICByZXR1cm4gMDsKK30KKworLy8gUHJ1ZWZ0LCBvYiB3aXIgaW4gZWluZW4gU3BpZWxlciBnZW1vdnQgd2VyZGVuIHNvbGxlbi4KKy8vIExpZWZlcnQgcGFzc2VuZGVzIE1vdmVyZXN1bHQsIGFuc29uc3RlbiAwLgorcHJvdGVjdGVkIGludCBQcmV2ZW50TW92ZShvYmplY3QgZGVzdCwgb2JqZWN0IG9sZGVudiwgaW50IG1ldGhvZCkgeworICAgIGlmKCAhb2JqZWN0cChkZXN0KSApIHJldHVybiAwOworICAgIGlmKCBtZXRob2QgJiBNX05PQ0hFQ0sgKSByZXR1cm4gMDsKKyAgICBpZiggcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShkZXN0KSApIHsKKyAgICAgIHJldHVybiBNRV9OT1RfQUxMT1dFRDsKKyAgICAvLyBkZWZhdWx0IG1lbGR1bmcgaW4gcHV0X2FuZF9nZXQ6cGljaworICAgIC8vIElERUU6IGltIHNwaWVsZXIgcGVyIGhvb2sgZWluZSBhbmRlcmUgbWVsZHVuZyB1bnRlcmJyaW5nZW4KKyAgICB9CisgICAgcmV0dXJuIDo6UHJldmVudE1vdmUoZGVzdCwgb2xkZW52LCBtZXRob2QpOworfQorCisvLyBTb3JndCBkYWZ1ZXIsIGRhc3MgaW0gTlBDIHNpY2ggZGVyIEhhdWZlbiBzZWxic3QgemVyc3RvZXJ0LgorcHJvdGVjdGVkIHZvaWQgTm90aWZ5TW92ZShvYmplY3QgZGVzdCwgb2JqZWN0IG9sZGVudiwgaW50IG1ldGhvZCkgeworICAgIGlmKCBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKGRlc3QpKSB7CisJbG9nX2ZpbGUoICJQSUxFLmxvZyIsIGR0aW1lKHRpbWUoKSkgKyAiOiBwaWxlIGluICIgCisJICAgICsgZGVzdC0+cXVlcnlfcmVhbF9uYW1lKCkgKyAiIGdlbGFuZGV0LlxuIiApOworICAgIH0KKyAgICBpZiggbGl2aW5nKGRlc3QpICkgeworCWZpbHRlcl9vYmplY3RzKCBhbGxfaW52ZW50b3J5KCksICJtb3ZlIiwgZGVzdCwgTV9TSUxFTlQgfCBNX05PQ0hFQ0sgKTsKKwkvLyBOUENzIGVyd2FydGVuIG5pY2h0LCBkYXNzIGRpbmdlIGltIG1vdmUgdmVyc2Nod2luZGVuLCBkZXNoYWxiCisJLy8gYWJ3YXJ0ZW4KKwljYWxsX291dCggInJlbW92ZSIsIDAsIDEgKTsKKyAgICB9CisgICAgcmV0dXJuIDo6Tm90aWZ5TW92ZShkZXN0LCBvbGRlbnYsIG1ldGhvZCk7Cit9CisKKy8vIHdlbm4gbnVyIG5vY2ggZWluIE9iamVrdCBpbSBIYXVmZW4gaXN0LCBzb2xsIGRpZXNlciB6ZXJzdG9lcnQgd2VyZGVuLgorcHVibGljIHZvaWQgTm90aWZ5TGVhdmUoIG9iamVjdCBvYiwgb2JqZWN0IGRlc3QgKSB7CisJaWYoIHNpemVvZihhbGxfaW52ZW50b3J5KCkpPjEgKSByZXR1cm47CisJY2FsbF9vdXQoICJyZW1vdmUiLCAwLCAxICk7IC8vIHZlcnpvZWdlcm4sIHVtIHByZXBhcmVfZGVzdHJ1Y3QgZ25hZWRpZyB6dSBzdGltbWVuCit9CisKKy8vIGRpdG8gZnVlcnMgbG9lc2NoZW4KK3B1YmxpYyB2b2lkIE5vdGlmeVJlbW92ZSggb2JqZWN0IG9iICkgeworICAgIE5vdGlmeUxlYXZlKCBvYiwgMCk7Cit9CisKKy8vIEhhdWZlbiwgZGllIHZvbiB6d2VpbWFsIGRlbSBzZWxiZW4gTlBDIGtvbW1lbiwgd2VyZGVuCisvLyB6dXNhbW1lbmdlbGVndAordm9pZCBtZXJnZV9waWxlKCkgeworCW9iamVjdCogb3RoZXIgPSBmaWx0ZXJfb2JqZWN0cygKKwkJYWxsX2ludmVudG9yeShlbnZpcm9ubWVudCgpKSAtICh7IHRoaXNfb2JqZWN0KCkgfSksCisJCSJpZCIsCisJCVF1ZXJ5UHJvcCggUF9QSUxFX05BTUUgKQorCSk7CisJaWYoICFzaXplb2Yob3RoZXIpICkgcmV0dXJuOworCWZpbHRlcl9vYmplY3RzKCBhbGxfaW52ZW50b3J5KCksICJtb3ZlIiwgb3RoZXJbMF0sIE1fU0lMRU5UIHwgTV9OT0NIRUNLICk7CisJcmVtb3ZlKCk7Cit9CisKK3ZvaWQgcmVzZXQoKSB7CisgIC8vIHdlbm4gZXMgZWluIE5QQy1IYXVmZW4gaXN0LCB3ZXJkZW4gR2VnZW5zdGFlbmRlLCBkaWUgb2VmdGVyIGFscyAzbWFsCisgIC8vIHZvcmtvbW1lbiwgemVyc3RvZXJ0LiBTY2hyYWVua3QgZGllIE9iamVrdGZsdXQgYW4gU3RlbGxlbiBlaW4sIHdvIE5QQworICAvLyBpaHJlbiBLcmFtIG5pY2h0IG1pdCBBZGRJdGVtIGNsb25lbi4KKyAgaWYgKCFzcGllbGVyaGF1ZmVuKQorICAgIHJlbW92ZV9tdWx0aXBsZSgzKTsKKyAgOjpyZXNldCgpOworICAvLyB3ZW5uIG51ciBub2NoIHVuc2ljaHRiYXJlIGl0ZW1zIGltIEhhdWZlbjogYXVmbG9lc2VuCisgIGlmICghc2l6ZW9mKGZpbHRlcihhbGxfaW52ZW50b3J5KCksIGZ1bmN0aW9uIGludCAob2JqZWN0IG8pCisgICAgICAgICAgeyByZXR1cm4gIW8tPnNob3J0KCk7fSApKSkKKyAgICByZW1vdmUoMSk7CisKK30KKwpkaWZmIC0tZ2l0IGEvc3RkL3BsYXllci9iYXNlLmMgYi9zdGQvcGxheWVyL2Jhc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzlhNmUxCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9iYXNlLmMKQEAgLTAsMCArMSw0MzU1IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gcGxheWVyL2Jhc2UuYyAtLSB0aGUgYmFzaWMgcGxheWVyIG9iamVjdAorLy8KKy8vICRJZDogYmFzZS5jIDk0NjcgMjAxNi0wMi0xOSAxOTo0ODoyNFogWmVzc3RyYSAkCisjcHJhZ21hIHN0cm9uZ190eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisKKyNpbmNsdWRlIDxzeXNfZGVidWcuaD4KKyNpbmNsdWRlIDxyZWdleHAuaD4KKyNpbmNsdWRlIDxpbnB1dF90by5oPgorI2luY2x1ZGUgPGxvZ2dpbmcuaD4KKyNpbmNsdWRlIDx3ZXJsaXN0ZS5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxlcnJvcmQuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxtb25leS5oPgorCitpbmhlcml0ICIvc3RkL2hvb2tfcHJvdmlkZXIiOworaW5oZXJpdCAiL3N0ZC9wbGF5ZXIvcmVzdHJpY3Rpb25zIjsKK2luaGVyaXQgIi9zdGQvbGl2aW5nL2F0dHJpYnV0ZXMiOworaW5oZXJpdCAiL3N0ZC9saXZpbmcvcHV0X2FuZF9nZXQiOworaW5oZXJpdCAiL3N0ZC9saXZpbmcvY2xvdGhpbmciOworaW5oZXJpdCAiL3N0ZC90aGluZy9wcm9wZXJ0aWVzIjsKK2luaGVyaXQgIi9zdGQvcGxheWVyL3V0aWwiOworaW5oZXJpdCAiL3N0ZC90aGluZy9sYW5ndWFnZSI7Citpbmhlcml0ICIvc3RkL3BsYXllci90cmF2ZWwiOworaW5oZXJpdCAiL3N0ZC9wbGF5ZXIvY29tYmF0IjsKK2luaGVyaXQgIi9zdGQvcGxheWVyL2Rlc2NyaXB0aW9uIjsKK2luaGVyaXQgIi9zdGQvcGxheWVyL21vdmluZyI7Citpbmhlcml0ICIvc3RkL3BsYXllci9saWZlIjsKK2luaGVyaXQgIi9zdGQvcGxheWVyL2NvbW0iOworaW5oZXJpdCAiL3N0ZC9wbGF5ZXIvdmlld2NtZCI7Citpbmhlcml0ICIvc3RkL3BsYXllci9tb25leWhhbmRsZXIiOworaW5oZXJpdCAiL3N0ZC9wbGF5ZXIvY29tbWFuZCI7Citpbmhlcml0ICIvc3RkL2xpdmluZy9za2lsbF9hdHRyaWJ1dGVzIjsKK2luaGVyaXQgIi9zdGQvbGl2aW5nL2xpZ2h0IjsKK2luaGVyaXQgIi9zdGQvcGxheWVyL3NraWxscyI7Citpbmhlcml0ICIvc3RkL3BsYXllci9xdWVzdHMiOworaW5oZXJpdCAiL3N0ZC9wbGF5ZXIvcG90aW9uIjsKK2luaGVyaXQgIi9zdGQvcGxheWVyL3NvdWwiOworaW5oZXJpdCAiL3N0ZC9tb3JlIjsKK2luaGVyaXQgIi9zdGQvdXNlcl9maWx0ZXIiOworaW5oZXJpdCAiL3NlY3VyZS90ZWxuZXRuZWciOworaW5oZXJpdCAiL3N0ZC9wbGF5ZXIvZ3VpZGUiOworaW5oZXJpdCAiL3N0ZC9wbGF5ZXIvcmVwdXRhdGlvbiI7Citpbmhlcml0ICIvc3RkL3BsYXllci9wcm90b2NvbHMvZ21jcCI7Citpbmhlcml0ICIvc3RkL2xpdmluZy9oZWxwZXJzIjsKKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDxwbGF5ZXIvc2tpbGxzLmg+CisjaW5jbHVkZSA8cGxheWVyL2dtY3AuaD4KKyN1bmRlZiBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDxwbGF5ZXIuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8dWRwLmg+CisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8YW5zaS5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPGxpdmluZy5oPgorI2luY2x1ZGUgPGF0dHJpYnV0ZXMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDx0ZXJtaW5hbC5oPgorI2luY2x1ZGUgPG5ld19za2lsbHMuaD4KKyNpbmNsdWRlIDxwYWdlci5oPgorI2luY2x1ZGUgPGNvbWJhdC5oPgorI2luY2x1ZGUgIi9zZWN1cmUvcXVlc3RtYXN0ZXIuaCIKKyNpbmNsdWRlICIvc2VjdXJlL2xlcG1hc3Rlci5oIgorI2luY2x1ZGUgPGV2ZW50cy5oPgorCisjdW5kZWYgTkFNRSAvKiBERUZJTkVEIEJZIFVEUC5IOyBCQUQgTkFNRSBDTEFTSCA6KCAqLworI2RlZmluZSBOQU1FKHdobykgY2FwaXRhbGl6ZShnZXR1aWQod2hvKSkKKworbWFwcGluZyBhdXRvbG9hZDsgICAgICAgICAgIC8qIGF1dG9sb2FkLW1hcHBpbmcgKi8KK2ludCBoY19wbGF5OworCitwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIGF1dG9sb2FkX3Jlc3Q7Citwcml2YXRlIG5vc2F2ZSBzdHJpbmcgICphdXRvbG9hZF9lcnJvcjsKK3ByaXZhdGUgbm9zYXZlIHN0cmluZyByZWFsaXA7IAorCitwcml2YXRlIG5vc2F2ZSBzdHJpbmcgcGFzc3c7ICAgICAgICAvKiB0ZW1wb3JhcmlseSBmb3IgcGFzc3dvcmQgY2hhbmdlICovCitwcml2YXRlIG5vc2F2ZSBzdHJpbmcgcGFzc3dvbGQ7ICAgICAvKiB0ZW1wb3JhcmlseSBmb3IgcGFzc3dvcmQgY2hhbmdlICovCisKKy8vIEhCLVphZWhsZXIuIFdlbm4gMCBlcnJlaWNodCB3aXJkLCB3aXJkICBlaW4gVGVsbmV0IFRNIFBha2V0IGFscyBLZWVwLUFsaXZlCisvLyBhbiBkZW4gQ2xpZW50IGdlc2VuZGV0IHVuZCBkZXIgQ291bnRlciB3aWVkZXIgYXVmIGhvY2hnZXNldHp0LiAKKy8vIFdlbm4gPT0gMCwgaXN0IGRhcyBLZWVwLUFsaXZlIGFiZ2VzY2hhbHRldC4KK3ByaXZhdGUgaW50IHRlbG5ldF90bV9jb3VudGVyOworCitub3NhdmUgc3RyaW5nIGRlZmF1bHRfaG9tZTsgLyogV2hlcmUgdG8gbW92ZSB1cyBpZiB3ZSBkb250IGhhdmUgYSBob21lIHNldCAqLworCitub3NhdmUgaW50IG5kZWFkX2xhc3R0aW1lOworbm9zYXZlIG1peGVkIG5kZWFkX2xvY2F0aW9uOworbm9zYXZlIHN0cmluZyBuZGVhZF9sX2ZpbGVuYW1lOworbm9zYXZlIGludCBuZGVhZF9jdXJyZW50bHk7Citub3NhdmUgaW50IG5kZWFkX25leHRfY2hlY2s7Citub3NhdmUgb2JqZWN0ICpoYl9vYnM7CisKK3ByaXZhdGUgbm9zYXZlIHN0cmluZyBkZWZhdWx0X3ByYXlfcm9vbTsKKworbm9zYXZlIG1peGVkIGVudl9uZGVhZF9pbmZvOworCitzdGF0aWMgaW50IF9zZXRfaW52aXMoaW50IGEpOworc3RhdGljIHN0cmluZyBfc2V0X3R0eShzdHJpbmcgc3RyKTsKK3N0YXRpYyBtaXhlZCBfc2V0X2ZyYXRlcm5pdGFzZG9ub2FyY2htYWdvcnVtKG1peGVkIGFyZyk7CisKKworc3RhdGljIHN0cmluZyBhbF90b190aXRsZShpbnQgYSk7CisKK3N0YXRpYyB2b2lkIG5kZWFkX3Jldml2ZSgpOworCitzdGF0aWMgaW50IHdlZ21lbGR1bmcoc3RyaW5nIHBsYXllcik7CisKK2ludCBxdWl0KCk7Cit2b2lkIHNhdmVfbWUobWl4ZWQgdmFsdWVfaXRlbXMpOwordmFyYXJncyBpbnQgcmVtb3ZlKG1peGVkIGFyZyk7CittaXhlZCBSYWNlRGVmYXVsdChzdHJpbmcgYXJnKTsKKworLyoqIFNldHp0IERlZmF1bHR3ZXJ0ZSB2b3IgZGVtIExhZGVuIGRlcyBTYXZlZmlsZXMuCisgICAgTnVyIGRpZSBXZXJ0ZSBibGVpYmVuIHNwYWV0ZXIgdWVicmlnLCBkaWUgTklDSFQgYXVzIGRlbSBTYXZlZmlsZSBnZWxhZGVuCisgICAgd2VyZGVuIHVuZCBkaWVzZSBoaWVyIGVyc2V0emVuLgorICAgIEF1c3NlcmRlbSBrYW5uIG1hbiBoaWVyIG5pY2h0IG1pdCBkZW4gV2VydGVuIGF1cyBkZW4gU2F2ZWZpbGVzIGFyYmVpdGVuLgorICAgIEhpZXJ6dSBtdXNzIG1hbiB1cGRhdGVzX2FmdGVyX3Jlc3RvcmUoKSB2ZXJ3ZW5kZW4uCisqLworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgaWYoUXVlcnlQcm9wKFBfTEVWRUwpKSAKKyAgeworICAgIHJldHVybjsgLy8gZGFyZiBudXIgRUlOTUFMIGdlbWFjaHQgd2VyZGVuCisgIH0KKyAgY2FsbF9vdXQoImNoZWNrQ29uc2lzdGVuY3kiLCAwKTsKKworICBuZGVhZF9uZXh0X2NoZWNrPU5FVERFQURfQ0hFQ0tfVElNRTsKKyAgbmRlYWRfbGFzdHRpbWU9MDsKKyAgbmRlYWRfbG9jYXRpb249MDsKKyAgbmRlYWRfbF9maWxlbmFtZT0wOworICBuZGVhZF9jdXJyZW50bHk9MDsKKyAgbmRlYWRfbmV4dF9jaGVjaz0wOworICBoY19wbGF5PTA7CisgIAorICBjb21tYW5kOjpjcmVhdGUoKTsKKyAgcHJvcGVydGllczo6Y3JlYXRlKCk7CisgIGRlc2NyaXB0aW9uOjpjcmVhdGUoKTsKKyAgbGlnaHQ6OmNyZWF0ZSgpOworICBhdHRyaWJ1dGVzOjpjcmVhdGUoKTsKKyAgY2xvdGhpbmc6OmNyZWF0ZSgpOworICBjb21iYXQ6OmNyZWF0ZSgpOworICBsaWZlOjpjcmVhdGUoKTsKKyAgY29tbTo6Y3JlYXRlKCk7CisgIHZpZXdjbWQ6OmNyZWF0ZSgpOworICBxdWVzdHM6OmNyZWF0ZSgpOworICByZXN0cmljdGlvbnM6OmNyZWF0ZSgpOworICBtb3Zpbmc6OmNyZWF0ZSgpOworICB0cmF2ZWw6OmNyZWF0ZSgpOworICBza2lsbHM6OmNyZWF0ZSgpOworICAgCisgIFNldFByb3AoUF9MRVZFTCwgLTEpOworICBTZXQoUF9MRVZFTCwgU0FWRXxTRUNVUkVELCBGX01PREVfQVMpOworICBTZXQoUF9HSE9TVCwgU0FWRSwgRl9NT0RFX0FTKTsKKyAgU2V0UHJvcChQX1NDUkVFTlNJWkUsIC0xKTsKKyAgU2V0KFBfU0NSRUVOU0laRSwgU0FWRSxGX01PREVfQVMpOworICBTZXQoUF9NT1JFX0ZMQUdTLCBTQVZFLCBGX01PREVfQVMpOworICBTZXRQcm9wKFBfV0VJR0hUX1BFUkNFTlQsMTAwKTsKKyAgU2V0UHJvcChQX0xPTkcsIDApOworICBTZXRQcm9wKFBfVElUTEUsICJkZXIgaG9mZm51bmdzdm9sbGUgQW5mYWVuZ2VyIik7CisgIFNldFByb3AoUF9BTElHTiwgMCk7CisgIFNldFByb3AoUF9HRU5ERVIsIE5FVVRFUik7CisgIFNldChQX0dFTkRFUiwgU0FWRSwgRl9NT0RFX0FTKTsKKyAgU2V0UHJvcChQX1RUWSwgInZ0MTAwIik7CisgIFNldChQX1RUWSwgU0FWRSwgRl9NT0RFX0FTKTsKKyAgU2V0UHJvcChQX1dFSUdIVCwgNzUwMDApOworICBTZXRQcm9wKFBfTUFYX0hQLDUwKTsKKyAgU2V0UHJvcChQX01BWF9TUCw1MCk7CisgIFNldFByb3AoUF9NQVhfRk9PRCwxMDApOworICBTZXRQcm9wKFBfTUFYX0RSSU5LLDEwMCk7CisgIFNldFByb3AoUF9NQVhfQUxDT0hPTCwxMDApOworICBTZXQoIFBfV0lNUFksIDIwLCBGX1ZBTFVFKTsKKworICBTZXRQcm9wKFBfSEFORFMsICh7IiBtaXQgYmxvc3NlbiBIYWVuZGVuIiwgMzB9KSk7CisgIFNldChQX0hBTkRTLCBTQVZFLCBGX01PREVfQVMpOworICBTZXRQcm9wKFBfTUFYX0hBTkRTLCAyKTsKKworICBTZXQoUF9NQVJSSUVELCBTQVZFLCBGX01PREVfQVMpOworICBTZXQoUF9FWFRSQV9MT09LLCBTQVZFLCBGX01PREVfQVMpOworICBTZXQoUF9TSE9XX0VYSVRTLCBTQVZFLCBGX01PREVfQVMpOworICBTZXQoUF9TSE9XX0VYSVRTLCAxKTsKKyAgU2V0KFBfV0FOVFNfVE9fTEVBUk4sIFNBVkUsIEZfTU9ERV9BUyk7CisgIFNldChQX0NBTl9GTEFHUywgU0FWRSwgRl9NT0RFX0FTKTsKKyAgU2V0KFBfVEVTVFBMQVlFUiwgU0FWRXxQUk9URUNURUQsIEZfTU9ERV9BUyk7CisgIFNldChQX0FMTE9XRURfU0hBRE9XLCBTQVZFfFNFQ1VSRUQsIEZfTU9ERV9BUyk7CisgIFNldChQX1NFQ09ORCwgU0FWRSwgRl9NT0RFX0FTKTsKKyAgU2V0KFBfSU5WSVMsIFNBVkUsIEZfTU9ERV9BUyk7CisgIFNldChQX1JFQURfTkVXUywgU0FWRSwgRl9NT0RFX0FTKTsKKyAgU2V0KFBfU1RBUlRfSE9NRSwgU0FWRSwgRl9NT0RFX0FTKTsKKyAgU2V0KFBfUFJBWV9ST09NLCBTQVZFLCBGX01PREVfQVMpOworICBTZXQoUF9NQUlMQUREUiwgU0FWRSwgRl9NT0RFX0FTKTsKKyAgU2V0KFBfSE9NRVBBR0UsIFNBVkUsIEZfTU9ERV9BUyk7CisgIFNldChQX0lDUSwgU0FWRSwgRl9NT0RFX0FTKTsKKyAgU2V0KFBfTUVTU0VOR0VSLCBTQVZFLCBGX01PREVfQVMpOworICBTZXQoUF9MT0NBVElPTiwgU0FWRSwgRl9NT0RFX0FTKTsKKworICBTZXQoUF9OT19BU0NJSV9BUlQsIFNBVkUsIEZfTU9ERV9BUyk7CisKKyAgU2V0KFBfVklTVUFMQkVMTCwgU0FWRSwgRl9NT0RFX0FTKTsKKyAgU2V0KFBfQ0FSUklFRF9WQUxVRSwgU0FWRSwgRl9NT0RFX0FTKTsKKworICBTZXQoUF9QUk9NUFQsICI+ICIpOworICBTZXQoUF9QUk9NUFQsIFNBVkUsIEZfTU9ERV9BUyk7CisgIFNldChQX0NBTExFRF9GUk9NX0lQLCBTQVZFLCBGX01PREVfQVMpOworICBTZXQoUF9JTkZPUk1NRSxTQVZFfFBST1RFQ1RFRCxGX01PREVfQVMpOworICBTZXQoUF9XQUlURk9SLFNBVkV8UFJPVEVDVEVELEZfTU9ERV9BUyk7CisgIFNldChQX1dBSVRGT1JfUkVBU09OLFNBVkV8UFJPVEVDVEVELEZfTU9ERV9BUyk7CisgIFNldChQX0RBSUxZX1BMQVlUSU1FLFNBVkV8UFJPVEVDVEVELEZfTU9ERV9BUyk7CisgIFNldChQX05FVERFQURfRU5WLCBQUk9URUNURUR8Tk9TRVRNRVRIT0QsIEZfTU9ERV9BUyk7CisgIAorICBhdXRvbG9hZCA9IChbXSk7CisgIGF1dG9sb2FkX3Jlc3QgPSAoW10pOworICBhdXRvbG9hZF9lcnJvciA9ICh7fSk7CisgIFNldFByb3AoUF9BUlRJQ0xFLDApOworICBTZXQoUF9HVUlMRCxTQVZFLEZfTU9ERV9BUyk7CisgIFNldChQX0dVSUxEX1RJVExFLFNBVkUsRl9NT0RFX0FTKTsKKyAgU2V0KFBfR1VJTERfTEVWRUwsU0FWRSxGX01PREVfQVMpOworICBTZXQoUF9HVUlMRF9SQVRJTkcsU0FWRSxGX01PREVfQVMpOworICBTZXQoUF9ORVdTS0lMTFMsU0FWRSxGX01PREVfQVMpOworICBTZXQoUF9ORUVERURfUVAsUkVRX1FQKTsKKyAgU2V0KFBfREVBRFMsMCk7CisgIFNldChQX0RFQURTLCBOT1NFVE1FVEhPRCxGX1NFVF9NRVRIT0QpOworICBTZXQoUF9ERUFEUyxTQVZFfFBST1RFQ1RFRHxTRUNVUkVELEZfTU9ERV9BUyk7CisgIFNldChQX0xBU1RfTE9HSU4sLTEpOworICBTZXQoUF9MQVNUX0xPR0lOLCBOT1NFVE1FVEhPRCxGX1NFVF9NRVRIT0QpOworICBTZXQoUF9MQVNUX0xPR0lOLFNBVkV8UFJPVEVDVEVEfFNFQ1VSRUQsRl9NT0RFX0FTKTsKKyAgU2V0KFBfTEFTVF9MT0dPVVQsLTEpOworICBTZXQoUF9MQVNUX0xPR09VVCwgTk9TRVRNRVRIT0QsRl9TRVRfTUVUSE9EKTsKKyAgU2V0KFBfTEFTVF9MT0dPVVQsU0FWRXxQUk9URUNURUR8U0VDVVJFRCxGX01PREVfQVMpOworICBTZXQoUF9DTE9DS01TRyxTQVZFLEZfTU9ERV9BUyk7CisgIFNldChQX1RJTUVaT05FLFNBVkUsRl9NT0RFX0FTKTsKKyAgU2V0KFBfU0hPV0VNQUlMLFNBVkUsRl9NT0RFX0FTKTsKKyAgU2V0KFBfTEFTVF9RVUlULFNBVkV8UFJPVEVDVEVEfFNFQ1VSRUQsRl9NT0RFX0FTKTsKKworICBTZXQoUF9DTVNHLCAwLCBGX01PREUpOyAvLyB0byBjbGVhbiBvdXQgdGhlIG9sZCBjbG9uZSBtZXNzYWdlcworICBTZXQoUF9ETVNHLCAwLCBGX01PREUpOworICBTZXQoUF9DTE9ORV9NU0csIFNBVkUsIEZfTU9ERSk7CisgIFNldFByb3AoUF9DTE9ORV9NU0csICJ6YXViZXJ0IGV0d2FzIGhlcnZvciIpOworICBTZXQoUF9ERVNUUlVDVF9NU0csIFNBVkUsIEZfTU9ERSk7CisgIFNldFByb3AoUF9ERVNUUlVDVF9NU0csICJ2ZXJzY2h3aW5kZXQgZWluZmFjaCIpOworCisgIFNldChQX0ZBTywgU0FWRXxTRUNVUkVELCBGX01PREVfQVMpOworICBTZXQoUF9GQU9fUE9SVEFMUywgU0FWRSwgRl9NT0RFX0FTKTsKKworICBTZXRQcm9wKFBfTkVXQklFX0dVSURFLDApOworICBTZXQoUF9ORVdCSUVfR1VJREUsU0FWRSxGX01PREVfQVMpOworCisgIC8vVE9ETzogUmVtb3ZlIC0gUHJvcGVydHkgaXN0IG5vdCBuZWVkZWQgYW55IG1vcmUuCisgIFNldChQX1RFTE5FVF9LRUVQX0FMSVZFLCBQUk9URUNURUR8U0FWRSwgRl9NT0RFX0FEKTsKKyAgU2V0UHJvcChQX1RFTE5FVF9LRUVQX0FMSVZFLCAwKTsKKworICBBZGRJZCgiSW50ZXJhY3RpdmUiKTsKKworICByZWFsaXA9IiI7Cit9CisKKy8vIEFDSFRVTkc6IEZhbGxzIGhpZXIgbWFsIHNvbnN0IG5vY2ggd2VpdGVyZSBSZXNldHMgZ2VlcmJ0IHdlcmRlbiwgbXVzcyBkYXMKKy8vIGhpZXIgb3JkZW50bGljaCBkZWZpbmllcnQgd2VyZGVuIQordm9pZCByZXNldCgpIHsgCisgIGNvbW06OnJlc2V0KCk7CisgIC8vIG1vbWVudGFuIGthbm4gZGVyIFJlc2V0IGpldHp0IGFiZ2VzY2hhbHRldCB3ZXJkZW4sIGRhIGVyIG51ciBkaWUKKyAgLy8gVE0tSGlzdG9yeSBsb2VzY2h0IHVuZCBnZ2YuIHZvbiBOZXRkZWFkKCkgdW5kIERpc2Nvbm5lY3QoKSByZWFrdGl2aWVydAorICAvLyB3aXJkLgorICBzZXRfbmV4dF9yZXNldCgtMSk7Cit9CisKK3Byb3RlY3RlZCB2b2lkIE5vdGlmeU1vdmUob2JqZWN0IGRlc3QsIG9iamVjdCBvbGRlbnYsIGludCBtZXRob2QpCit7CisgIG1vdmluZzo6Tm90aWZ5TW92ZShkZXN0LG9sZGVudixtZXRob2QpOworICAvLyBnZ2YuIERhdGVuIHVlYmVyIG5ldWVzIEVudiBwZXIgR01DUCBzZW5kZW4uCisgIGlmIChkZXN0ICE9IG9sZGVudikKKyAgICBHTUNQX1Jvb20oKTsKK30KKworc3RyaW5nIEZvcnNjaHVuZygpCit7CisgIHJldHVybiBMRVBNQVNURVItPlF1ZXJ5Rm9yc2NodW5nKCk7Cit9CisKKy8qKiBTZXR6dCBEZWZhdWx0d2VydGUgZnVlciBSYXNzZW4gLSB3aXJkIHZvbiBkZW4gU2hlbGxzIHVlYmVyc2NocmllYmVuLgorKi8KK21peGVkIFJhY2VEZWZhdWx0KHN0cmluZyBhcmcpCit7CisgIGlmICghYXJnKQorICAgIHJldHVybiAwOworICBzd2l0Y2goYXJnKQorICB7CisgICAgY2FzZSBQX0hBTkRTIDoKKyAgICAgIHJldHVybiAoeyIgbWl0IGJsb3NzZW4gSGFlbmRlbiIsMzAsRFRfQkxVREdFT059KTsKKyAgICBjYXNlIFBfQk9EWSA6CisgICAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gMDsKK30KKworLyoqIFBydWVmdCBTcGllbGVyb2JqZWt0IGF1ZiBLb25zaXN0ZW56LgorICBVZWJlcnBydWVmdCBkYXMgU3BpZWxlcm9iamVrdCBuYWNoIGtvbXBsZXR0ZXIgSW5pdGlhbGlzaWVydW5nIChpbSAKKyAgY2FsbG91dCkgYXVmIGtvcnJla3RlIFdlcnRlIGVpbmlnZXIgUHJvcHMuCisqLwordm9pZCBjaGVja0NvbnNpc3RlbmN5KCkKK3sgbWl4ZWQgaDsKKyAgaW50ICAgbTsKKworICBpZiAocG9pbnRlcnAoaD1SYWNlRGVmYXVsdChQX0hBTkRTKSkgJiYgc2l6ZW9mKGgpPjEpCisgICAgbT0oaW50KWhbMV07CisgIGVsc2UKKyAgICBtPTMwOworICBpZigoaD1RdWVyeShQX0hBTkRTKSlbMV0gPiBtICYmICFJU19MRUFSTkVSKHRoaXNfb2JqZWN0KCkpKSB7CisgICAgbG9nX2ZpbGUoImluY29uc2lzdGVudCIsIHNwcmludGYoCisgICAgICAiWyVzXSAlTzogSEFORFM6ICVkXG4iLCBkdGltZSh0aW1lKCkpLCB0aGlzX3BsYXllcigpLCBoWzFdKSk7CisgICAgaFsxXSA9IG07CisgICAgU2V0KFBfSEFORFMsaCk7CisgIH0KKworICBpZiAoUXVlcnkoUF9CT0RZKSE9KG09UmFjZURlZmF1bHQoUF9CT0RZKSkpCisgICAgIFNldChQX0JPRFksbSk7CisKKyAgaWYgKCFRdWVyeShQX1NFQ09ORF9NQVJLLEZfTU9ERSkpCisgICAgU2V0KFBfU0VDT05EX01BUkssU0FWRXxQUk9URUNURUQsRl9NT0RFX0FTKTsKKyAgaWYgKCFRdWVyeShQX1RUWV9TSE9XLEZfTU9ERSkmU0FWRSkKKyAgeworICAgIFNldChQX1RUWV9TSE9XLDAsRl9WQUxVRSk7CisgICAgU2V0KFBfVFRZX1NIT1csU0FWRSxGX01PREVfQVMpOworICB9CisgIGlmIChRdWVyeShQX1RUWV9DT0xTLEZfTU9ERSkmU0FWRSkKKyAgeworICAgIFNldChQX1RUWV9DT0xTLFNBVkUsRl9NT0RFX0FEKTsKKyAgICBTZXQoUF9UVFlfUk9XUyxTQVZFLEZfTU9ERV9BRCk7CisgICAgU2V0KFBfVFRZX1RZUEUsU0FWRSxGX01PREVfQUQpOworICB9Cit9CisKKy8qKiBCaXR0ZXQgZGFzIFNwaWVsZXJvYmpla3QsIHNpY2ggenUgemVyc3RvZXJlbi4KKyAgXHBhcmFtW2luXSBzaWxlbnQgRmxhZywgb2Igb2huZSBUZXh0YXVzZ2FiZW4gemVyc3RvZXJ0IHdlcmRlbiBzb2xsCisgIFxyZXR1cm4gRXJmb2xnIGRlciBTZWxic3R6ZXJzdG9lcnVuZworKi8KK3ZhcmFyZ3MgaW50IHJlbW92ZShpbnQgc2lsZW50KQoreworICByZXR1cm4gbW92aW5nOjpyZW1vdmUoc2lsZW50KTsKK30KKworLyoqIFNjaGFsdGV0IGluIGFsbGVuIE9iamVrdGVuIGltIEludiBIQnMgYXVzLgorICBTY2hhbHRldCBpbSBJbnYgaW4gYWxsZW4gT2JqZWt0ZW4gKHJla3Vyc2l2LCBkZWVwX2ludmVudG9yeSkKKyAgZGllIEhlYXJ0YmVhdHMgYXVzLiBGYWxscyBvYnMgdWViZXJnZWJlbiB3aXJkLCB3ZXJkZW4gZGllc2UgT2JqZWt0ZQorICBzdGF0dCBkZXMgSW52ZW50YXJzIGJlbnV0enQuCisgIFNwZWljaGVydCBkaWUgT2JqZWt0ZSwgZGllIGVpbmVuIEhCIGhhdHRlbiwgaW4gZGVyIGdsb2IuIFZhci4gaGJfb2JzLgorICBAcGFyYW1baW5dIG9icyBtaXhlZCAtIE9iamVrdGUsIGluIGRlbmVuIGRlciBIQiBhYmdlc2NoYWx0ZXQgd2VyZGVuIHNvbGwuIAorICAgIENvbnRhaW5lciB3ZXJkZW4gcmVrdXJzaXYgYmVoYW5kZWx0LgorICBAYXR0ZW50aW9uIEFjaHR1bmchIE5pZW1hbHMgendlaW1hbCBoaW50ZXJlaW5hbmRlciBydWZlbiwgb2huZSAKKyAgICB6d2lzY2hlbmR1cmNoIHJlc3RhcnRfaGVhcnRfYmVhdHMoKSBnZXJ1ZmVuIHp1IGhhYmVuIQorICBAc2EgcmVzdGFydF9oZWFydF9iZWF0cworKi8KK3ZhcmFyZ3Mgc3RhdGljIHZvaWQgc3RvcF9oZWFydF9iZWF0cyhtaXhlZCBvYnMpCit7CisgIGludCBpOworCisgIGlmICghb2JzKQorICB7CisgICAgaGJfb2JzPSh7fSk7CisgICAgb2JzPWRlZXBfaW52ZW50b3J5KE1FKTsKKyAgfSAKKyAgZm9yZWFjaChtaXhlZCBvYjogb2JzKSB7CisgICAgaWYgKHBvaW50ZXJwKG9iKSkKKyAgICAgICAgc3RvcF9oZWFydF9iZWF0cyhvYik7CisgICAgZWxzZSBpZiAoc2V0X29iamVjdF9oZWFydF9iZWF0KG9iLDApKSAgCisgICAgICAgIGhiX29icys9KHtvYn0pOworICB9Cit9CisKKy8qKiBTY2hhbHRldCBIQnMgaW4gT2JqZWt0ZW4gaW0gSW52IHdpZWRlciBlaW4uCisgIFNjaGFsdGV0IGluIGFsbGVuIE9iamVrdGVuIGluIGhiX29icyBkZW4gSGVhcnRiZWF0IGVpbi4KKyAgICBJbiBoYl9vYnMgKGdsb2IuIFZhci4pIHN0ZWhlbiBhbGxlIE9iamVrdGUsIGRpZSBiZWltIGxldHp0ZW4gQXVmcnVmIHZvbgorICAgIHN0b3BfaGVhcnRfYmVhdHMoKSBlaW5lbiBIQiBoYXR0ZW4uCisgIEBzYSBzdG9wX2hlYXJ0X2JlYXRzCisqLworc3RhdGljIHZvaWQgcmVzdGFydF9oZWFydF9iZWF0cygpCit7CisgIGludCBpOworCisgIGlmIChwb2ludGVycChoYl9vYnMpKQorICB7CisgICAgZm9yZWFjaChvYmplY3Qgb2I6IGhiX29icykKKyAgICAgIHNldF9vYmplY3RfaGVhcnRfYmVhdChvYiwxKTsKKyAgICBoYl9vYnM9MDsKKyAgfQorfQorCisvKiogUHJ1ZWZ0IGF1ZiBhYmdlbGF1ZmVuZSBTcGllbHplaXQuCisgIFBydWVmdCBpbiBTcGllbGVyb2JqZWt0ZW4sIG9iIGRpZSB0YWVnbGljaGUgTWF4aW1hbHNwaWVsemVpdAorICAgIGFiZ2VsYXVmZW4gaXN0LgorICAgIFdpcmQgaW0gaGVhcnRfYmVhdCgpIGdlcnVmZW4uCisgIEByZXR1cm4gaW50IC0gRmxhZywgb2IgU3BpZWx6ZWl0IGFiZ2VsYXVmZW4gdW5kIExvZ291dCBlcmZvbGdlbiBzb2xsCisqLworc3RhdGljIGludCBDaGVja0RhaWx5UGxheXRpbWUoKSB7CisgIGludCAqc3BpZWxkYXVlcixkOworCisgIGlmICghcG9pbnRlcnAoc3BpZWxkYXVlcj1RdWVyeShQX0RBSUxZX1BMQVlUSU1FKSkpCisgICAgcmV0dXJuIDA7CisgIC8vIDA6TWludXRlbiBwcm8gVGFnLCAxOk5yLiBkZXMgbGV0emVuIFRhZ2VzLCAyOk5yLiBkZXMgYW5nZWZhbmdlbmVuIFRhZ2VzLAorICAvLyAzOmxldHp0ZSBaZWl0cHJ1ZWZ1bmcsIDQ6dmVyYmxlaWJlbmRlIFplaXQKKyAgZD10aW1lKCkvODY0MDA7CisgIGlmIChzcGllbGRhdWVyWzFdPD1kKSB7IC8vIEVuZGUgZGVyIHplaXRiZXNjaHJhZW5rdGVuIFRhZ2U/CisgICAgU2V0KFBfREFJTFlfUExBWVRJTUUsMCk7CisgICAgcmV0dXJuIDA7CisgIH0gZWxzZSBpZiAoc3BpZWxkYXVlclsyXSE9ZCkgeyAvLyBOZXVlciBUYWc/CisgICAgc3BpZWxkYXVlcls0XT1zcGllbGRhdWVyWzBdOworICAgIHNwaWVsZGF1ZXJbMl09ZDsKKyAgfSBlbHNlIHsKKyAgICBzcGllbGRhdWVyWzRdLT0odGltZSgpLXNwaWVsZGF1ZXJbM10pOworICB9CisgIHNwaWVsZGF1ZXJbM109dGltZSgpOyAgLy8gTGV0enRlIFplaXRwcnVlZnVuZworICBTZXQoUF9EQUlMWV9QTEFZVElNRSxzcGllbGRhdWVyKTsKKyAgaWYgKHNwaWVsZGF1ZXJbNF08MCkgeyAvLyBLZWluZSBaZWl0IG1laHIgdWVicmlnIGZ1ZXIgaGV1dGUKKyAgICBpZiAoIWludGVyYWN0aXZlKE1FKSkKKyAgICAgIHJldHVybiAxOworICAgIHdyaXRlKCJEdSBoYXN0IGxhbmdlIGdlbnVnIGdlbXVkZGV0IGZ1ZXIgaGV1dGUuXG4iKTsKKyAgICBzYXkoTmFtZShXRVIpKyIgaGF0IGZ1ZXIgaGV1dGUgZ2VudWcgZ2VtdWRkZXQuXG4iKTsKKyAgICByZW1vdmVfaW50ZXJhY3RpdmUoTUUpOworICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQorCisvKiogR2lidCBFcndhcnRlbWVsZHVuZyBtaXQgR3J1bmQgYXVzLgorICBAcGFyYW1baW5dIHdobyAgIHN0cmluZyAtIFdlciBpc3QgaGVyZWluZ2Vrb21tZW4/CisgIEBwYXJhbVtpbl0gaW52aXMgaW50IC0gSXN0IGRlciBTcGllbGVyIEludmlzPworKi8KK3N0YXRpYyB2b2lkIFNob3dfV2FpdEZvcl9SZWFzb24oc3RyaW5nIHdobywgaW50IGludmlzKQoreworICBtaXhlZCBsaXN0OworICBzdHJpbmcgcmVhc29uLG5hbWU7CisKKyAgaWYgKGludmlzKSBuYW1lPSIoIit3aG8rIikiOworICAgIGVsc2UgbmFtZT13aG87CisgIGlmICgobWFwcGluZ3AobGlzdD1RdWVyeVByb3AoUF9XQUlURk9SX1JFQVNPTikpKSAmJiAocmVhc29uPWxpc3Rbd2hvXSkpCisgICAgdGVsbF9vYmplY3QoTUUsc3ByaW50ZigiXG5EdSBlcndhcnRlc3QgJXMgd2VnZW46XG4lc1xuIixuYW1lLHJlYXNvbikpOworICBlbHNlCisgICAgdGVsbF9vYmplY3QoTUUsc3ByaW50ZigiRHUgZXJ3YXJ0ZXN0ICVzIGF1cyBrZWluZW0gYmVzdGltbXRlbiBHcnVuZC5cbiIsCisgICAgICBuYW1lKSk7Cit9CisKKy8qKiBHaWJ0IExpc3RlIGRlciBFcndhcnRldGVuIFNwaWVsZXIgYW4gdGhpc19wbGF5ZXIoKSBhdXMuCisqLworc3RhdGljIHZvaWQgTGlzdEF3YWl0ZWQoKSAvL0Fud2VzZW5kZSBFcndhcnRldGUgYXVmbGlzdGVuCit7CisgICAgc3RyaW5nICpsaXN0OworICAgIG1peGVkIG1saXN0OworICAgIG9iamVjdCBvYjsKKyAgICBpbnQgbWFnOworCisgICAgbWFnPUlTX0xFQVJORVIoTUUpOworCisgICAgbGlzdD0oe30pOworICAgIGZvcmVhY2goc3RyaW5nIGVyd2FydGV0IDogUXVlcnlQcm9wKFBfV0FJVEZPUikpIHsKKyAgICAgICAgaWYgKG9iamVjdHAob2I9ZmluZF9wbGF5ZXIobG93ZXJfY2FzZShlcndhcnRldCkpKSkgeworICAgICAgICAgICAgaWYgKG9iLT5RdWVyeVByb3AoUF9JTlZJUykpIHsKKyAgICAgICAgICAgICAgICBpZiAobWFnKSBsaXN0Kz0oeyBzcHJpbnRmKCIoJXMpIixlcndhcnRldCkgfSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGxpc3QrPSh7ZXJ3YXJ0ZXR9KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc2l6ZW9mKGxpc3QpKQorICAgICAgICBwcmludGYoIkFud2VzZW5kZSBFcndhcnRldGU6ICVzLlxuIiwKKyAgICAgICAgICAgIENvdW50VXAoc29ydF9hcnJheShsaXN0LCMnPikpKTsKKworICAgIGlmICgobWFwcGluZ3AobWxpc3Q9UXVlcnlQcm9wKFBfV0FJVEZPUl9SRUFTT04pKSkgJiYgKHNpemVvZihtbGlzdCkpKQorICAgICAgICB7CisgICAgICAgICAgZm9yZWFjaChzdHJpbmcgZXJ3YXJ0ZXQgOiBtbGlzdCkgeworICAgICAgICAgICAgICAgIGlmICghKG9iPWZpbmRfcGxheWVyKGxvd2VyX2Nhc2UoZXJ3YXJ0ZXQpKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKCFtYWcgJiYgb2ItPlF1ZXJ5UHJvcChQX0lOVklTKSkpOworICAgICAgICAgICAgICAgIGVsc2UgU2hvd19XYWl0Rm9yX1JlYXNvbihlcndhcnRldCxvYi0+UXVlcnlQcm9wKFBfSU5WSVMpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KK30KKy8qKiBUZWlsdCBkZW4gR2lsZGVuIHVuZCBhbmRlcmVuIFNwaWVsZXJuIG1pdCwgd2VyIHJlaW5nZWtvbW1lbiBpc3QuCisgIEF1c3NlcmRlbSB3aXJkIGdnZi4gUGxheWVyUXVpdCgpIGltIEVudmlyb25tZW50IGdlcnVmZW4uCisgIFxwYXJhbVtpbl0gcmVpbiBpbnQgLSB3YWhyLCB3ZW5uIGRlciBTcGllbGVyIGVpbmxvZ2d0LgorKi8KK3Byb3RlY3RlZCB2b2lkIGNhbGxfbm90aWZ5X3BsYXllcl9jaGFuZ2UoaW50IHJlaW4pCit7CisgIHN0cmluZyB3ZXIgPSBnZXR1aWQoTUUpOworICAvLyBlcnN0IGRpZSBHaWxkZSBpbmZvcm1pZXJlbgorICBzdHJpbmcgZ2lsZGUgPSBRdWVyeVByb3AoUF9HVUlMRCk7CisgIGlmIChzdHJpbmdwKGdpbGRlKSAmJiAoZmluZF9vYmplY3QoIi9naWxkZW4vIitnaWxkZSkKKyAgICAgICAgfHwgZmlsZV9zaXplKCIvZ2lsZGVuLyIrZ2lsZGUrIi5jIik+MCkpCisgICAgY2F0Y2goKCIvZ2lsZGVuLyIrZ2lsZGUpLT5ub3RpZnlfcGxheWVyX2NoYW5nZShNRSwgcmVpbik7IHB1Ymxpc2gpOworCisgIC8vIGRhbm4gZGllIGFuZGVyZW4gU3BpZWxlcgorICBpbnQgbWFnID0gSVNfTEVBUk5FUihNRSk7CisgIGludCBpbnZpcyA9IFF1ZXJ5UHJvcChQX0lOVklTKTsKKyAgb2JqZWN0ICp1ID0gdXNlcnMoKSAtICh7TUV9KTsgLy8gc2ljaCBzZWxiZXIgbmljaHQgbWVsZGVuIAorICBpZiAobWFnICYmIGludmlzKSB7ICAgLy8gSW52aXNtYWdpZXIgbnVyIE1hZ2llcm4gbWVsZGVuCisgICAgdSA9IGZpbHRlcih1LCBmdW5jdGlvbiBpbnQgKG9iamVjdCBvKQorICAgICAgICB7IHJldHVybiBxdWVyeV93aXpfbGV2ZWwobykgPj0gTEVBUk5FUl9MVkw7IH0KKyAgICAgICAgKTsKKyAgfQorICB1LT5ub3RpZnlfcGxheWVyX2NoYW5nZShjYXBpdGFsaXplKHdlcikscmVpbixpbnZpcyk7CisKKyAgLy8gdW5kIGJlaW0gQXVzbG9nZ2VuIG5vY2ggZGFzIEVudiBpbmZvcm1pZXJlbi4KKyAgaWYgKCFyZWluKSB7CisgICAgaWYoZW52aXJvbm1lbnQoKSkgY2F0Y2goZW52aXJvbm1lbnQoKS0+UGxheWVyUXVpdChNRSk7cHVibGlzaCk7CisgIH0KK30KKworLyoqIFJ1ZnQgaW0gdWViZXJnZWJlbmVuIE9iamVrdCBlaW4gaW5pdCgpIGF1Ziwgc29mZXJuIG5vdHdlbmRpZy4KKyAgUnVmdCBpbiBvYiBlaW4gaW5pdCgpIGF1ZiwgZmFsbHMgZGFzIE9iamVrdCBuYWNoIGRlbQorICAgIGxldHp0ZW4gQXVzbG9nZ2VuIGdlc2NoYWZmZW4gd3VyZGUuCisgIFxwYXJhbVtpbl0gb2Igb2JqZWN0IC0gT2JqZWt0LCBpbiBkZW0gaW5pdCgpIGdlcnVmZW4gd2lyZC4KKyAgXHBhcmFtW2luXSBsb2dvdXQgaW50IC0gTGV0enRlciBMb2dvdXQKKyAgXHJldHVybiAxLCBmYWxscyBpbml0KCkgZ2VydWZlbiB3dXJkZS4gMCBzb25zdC4KKyovCitzdGF0aWMgaW50IGNhbGxfaW5pdCggb2JqZWN0IG9iLCBpbnQgbG9nb3V0ICkKK3sKKyAgICBpZiAoIG9iamVjdHAob2IpICYmIG9iamVjdF90aW1lKG9iKSA+IGxvZ291dCApCisgICAgICAgIHJldHVybiBjYXRjaChvYi0+aW5pdCgpOyBwdWJsaXNoKSwgMTsKKyAgICByZXR1cm4oMCk7Cit9CisKKy8qKiBIb2x0IHNlaXQgZGVtIGxldHp0ZW4gQXVzbG9nZ2VuIGF1c2dlZmFsbGVuZSBJbml0cyBuYWNoLgorICBSdWZ0IGluIGRlbiB1ZWJlcmdlYmVuZW4gT2JqZWt0ZW4gY2FsbF9pbml0KCksIHdhcyBlaW5lbiBpbml0KCkKKyAgYXVzbG9lc3QsIGZhbGxzIGRhcyBPYmpla3Qgc2VpdCBkZW0gbGV0enRlbiBBdXNsb2dnZW4gZXJzdGVsbHQgd3VyZGUuCisgIFxwYXJhbVtpbl0gbG9nb3V0IFplaXRwdW5rdCBkZXMgbGV0enRlbiBMb2dvdXRzCisgIFxwYXJhbVtpbl0gb2JzIEFycmF5IHZvbiBPYmpla3RlbgorICBcc2EgY2FsbF9pbml0KCkKKyovCitzdGF0aWMgdm9pZCBpbml0c19uYWNoaG9sZW4oIGludCBsb2dvdXQsIG9iamVjdCAqb2JzICkKK3sKKyAgICBmaWx0ZXIoIG9icywgImNhbGxfaW5pdCIsIE1FLCBsb2dvdXQgKTsKK30KKworLyoqIEJlbGVidCBlaW5lbiBOZXR6dG90ZW4gd2llZGVyLgorICBXaXJkIGltIExvZ2luIGdlcnVmZW4sIHdlbm4gZGVyIFNwaWVsZXIgbmV0enRvdCB3YXIuIEFlcXVpdmFsZW50IHp1CisgIHN0YXJ0X3BsYXllcigpCisgIEBwYXJhbVtpbl0gc2lsZW50IFdlbm4gRmxhZyBnZXNldHp0LCB3ZXJkZW4ga2VpbmUgTWVsZHVuZyBhbiBkZW4gUmF1bQorICBhdXNnZWdlYmVuLgorICBAcGFyYW1baW5dIGlwIFRleHR1ZWxsZSBSZXByYWVzZW50YXRpb24gZGVyIElQLUFkcmVzc2UsIHZvbiBkZXIgZGVyIFNwaWVsZXIKKyAga29tbXQuCisgIEBzZWUgc3RhcnRfcGxheWVyKCkKKyovCit2YXJhcmdzIHZvaWQgUmVjb25uZWN0KCBpbnQgc2lsZW50ICkKK3sKKyAgICBpbnQgbnVtOworICAgIHN0cmluZyBjYWxsZWRfZnJvbV9pcDsKKyAgICBvYmplY3QgKmludjsKKworICAgIGlmICggcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShNRSkgKQorICAgIHsKKyAgICAgICAgLy8gcGVyZm9ybSB0aGUgdGVsbmV0IG5lZ290aWF0aW9ucy4gKGFsbCB0aGF0IGFyZSBhdmFpbGFibGUpCisgICAgICAgICIqIjo6c3RhcnR1cF90ZWxuZXRfbmVncygpOworICAgICAgICBTZXQoIFBfTEFTVF9MT0dJTiwgdGltZSgpICk7CisgICAgfQorCisgICAgZW5hYmxlX2NvbW1hbmRzKCk7CisgICAgc2V0X2xpdmluZ19uYW1lKCBnZXR1aWQoKSApOworICAgIF9yZW1vdmVfbmV0ZGVhZCgpOworICAgIHNldF9oZWFydF9iZWF0KDEpOworICAgIC8vIEh1bnR0aW1lcyBha3R1YWxpc2llcmVuIHVuZCBnZ2YuIEZlaW5kZSB2ZXJnZXNzZW4uCisgICAgdXBkYXRlX2h1bnRfdGltZXMoKHRpbWUoKS1RdWVyeVByb3AoUF9MQVNUX0xPR09VVCkpIC9fX0hFQVJUX0JFQVRfSU5URVJWQUxfXyk7CisgICAgLy8gSGVhcnRiZWF0cyBpbiBPYmpla3RlbiBpbSBJbnYgcmVha3RpdmVyZW4uCisgICAgcmVzdGFydF9oZWFydF9iZWF0cygpOworICAgIC8vIGxpZmUuYyB3aWxsIGdnZi4gd2FzIGF1ZnJhZXVtZW4KKyAgICBsaWZlOjpyZWNvbm5lY3QoKTsKKworICAgIGxvZ19maWxlKCAiUkVFTlRFUiIsIHNwcmludGYoICIlLTExcyAlcywgJS0xNXMgKCVzKS5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoTUUpKSwgY3RpbWUodGltZSgpKVs0Li4xNV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlfaXBfbnVtYmVyKE1FKXx8IlVua25vd24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5X2lwX25hbWUoTUUpfHwiVW5rbm93biIgKSwKKyAgICAgICAgICAgICAgMjAwMDAwICk7CisKKyAgICBpZiAoIG5kZWFkX2N1cnJlbnRseSApCisgICAgICAgIG5kZWFkX3Jldml2ZSgpOworCisgICAgaWYgKCAhc2lsZW50ICYmIGludGVyYWN0aXZlKE1FKSApCisgICAgICAgIGNhbGxfbm90aWZ5X3BsYXllcl9jaGFuZ2UoMSk7CisKKyAgICBjb21tYW5kOjpyZWNvbm5lY3QoKTsKKyAgICBpZiAoIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoTUUpICkKKyAgICAgICAgbW9kaWZ5X3Byb21wdCgpOworCisgICAgLy8gTG9naW4tZXZlbnQgYXVzbG9lc2VuCisgICAgRVZFTlRELT5UcmlnZ2VyRXZlbnQoRVZUX0xJQl9MT0dJTiwgKFsKKyAgICAgICAgICBFX09CSkVDVDogTUUsCisgICAgICAgICAgRV9QTE5BTUU6IGdldHVpZChNRSksCisgICAgICAgICAgRV9FTlZJUk9OTUVOVDogZW52aXJvbm1lbnQoKSBdKSApOworCisgICAgY2F0Y2goIG51bSA9ICJzZWN1cmUvbWFpbGVyIi0+RmluZ2VyTWFpbChnZXRldWlkKCkpO3B1Ymxpc2ggKTsKKworICAgIGlmICggbnVtICkKKyAgICAgICAgd3JpdGUoICJEdSBoYXN0ICIgKyBudW0gKyAiIG5ldWUiICsgKG51bSA9PSAxID8gIm4gQnJpZWYiIDogIiBCcmllZmUiKQorICAgICAgICAgICAgICAgKyAiIGltIFBvc3RhbXQgbGllZ2VuLlxuIiApOworCisgICAgaWYgKCBRdWVyeVByb3AoUF9BV0FZKSApCisgICAgICAgIHdyaXRlKCBicmVha19zdHJpbmcoICJEdSBiaXN0IGFscyBhYndlc2VuZCBnZWtlbm56ZWljaG5ldDogIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1ZXJ5UHJvcChQX0FXQVkpICsgIi4iLCA3OCApICk7CisKKyAgICBjYXRjaCggUmVnaXN0ZXJDaGFubmVscygpOyBwdWJsaXNoICk7CisKKyAgICBpZiAoIChjYWxsZWRfZnJvbV9pcCA9IFF1ZXJ5KFBfQ0FMTEVEX0ZST01fSVApKSAmJgorICAgICAgICAgcXVlcnlfaXBfbnVtYmVyKE1FKSAhPSBjYWxsZWRfZnJvbV9pcCApIHsKKyAgICAgICAgc3RyaW5nIHRtcDsKKworICAgICAgICBpZiAoIHN0cmluZ3AodG1wID0gcXVlcnlfaXBfbmFtZShjYWxsZWRfZnJvbV9pcCkpICYmCisgICAgICAgICAgICAgdG1wICE9IGNhbGxlZF9mcm9tX2lwICkKKyAgICAgICAgICAgIHRtcCA9ICIgWyIgKyB0bXAgKyAiXSI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRtcCA9ICIiOworCisgICAgICAgIHdyaXRlKCAiRGFzIGxldHp0ZSBNYWwga2Ftc3QgRHUgdm9uICIgKyBjYWxsZWRfZnJvbV9pcCArIHRtcCArICIuXG4iICk7CisgICAgfQorCisgICAgU2V0KCBQX0NBTExFRF9GUk9NX0lQLCBxdWVyeV9pcF9udW1iZXIoTUUpICk7CisKKyAgICAvLyBmYWxscyBHZWdlbnN0YWVuZGUgbWl0ICd1cGQgLWFyJyB1cGdlZGF0ZWQgd3VyZGVuLCBtdWVzc2VuIGRpZQorICAgIC8vICJ2ZXJsb3JlbiBnZWdhbmdlbmVuIiBpbml0KCkncyBuYWNoZ2Vob2x0IHdlcmRlbgorICAgIGlmICggcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShNRSkgJiYgIUlTX0xFQVJORVIoTUUpICkKKyAgICAgICAgY2FsbF9vdXQoICJpbml0c19uYWNoaG9sZW4iLCAwLCBRdWVyeShQX0xBU1RfTE9HT1VUKSwKKyAgICAgICAgICAgICAgICAgIGFsbF9pbnZlbnRvcnkoTUUpICk7CisKKyAgICAvLyBub2NoIG5pY2h0IGdlY2xvbnRlIEF1dG9sb2FkZXIgIm5hY2giY2xvbmVuCisgICAgd2hpbGUgKCByZW1vdmVfY2FsbF9vdXQoImxvYWRfYXV0b19vYmplY3RzIikgIT0gLTEgKQorICAgICAgICAvKiBkbyBub3RoaW5nICovOworCisgICAgaWYgKCBzaXplb2YoYXV0b2xvYWRfcmVzdCkgKQorICAgICAgICBjYWxsX291dCggImxvYWRfYXV0b19vYmplY3RzIiwgMCwgYXV0b2xvYWRfcmVzdCApOworCisgICAgaWYgKG5kZWFkX2xvY2F0aW9uKSB7CisgICAgICBjYXRjaCggbmRlYWRfbG9jYXRpb24tPkJlY29tZXNOZXRBbGl2ZShNRSk7cHVibGlzaCApOworICAgICAgaW52ID0gYWxsX2ludmVudG9yeShuZGVhZF9sb2NhdGlvbik7CisgICAgICBuZGVhZF9sb2NhdGlvbiA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGludiA9ICh7fSk7CisKKyAgICBpbnYgKz0gZGVlcF9pbnZlbnRvcnkoTUUpOworCisgICAgLy9aWiBmb3JlYWNoIHN0YXR0IGNhbGxfb3RoZXIoKSwgZGFtaXQgbmVuIGJ1ZyBpbiBCTkEgbmljaHQgZGllIGFuZGVyZW4KKyAgICAvL0JOQSB2ZXJoaW5kZXJ0LgorICAgIGZvcmVhY2gob2JqZWN0IG9iOiBpbnYpIHsKKyAgICAgICAgLy9lcyBpc3QgbmljaHQgYXVzenVzY2hsaWVzc2VuLCBkYXNzIEl0ZW1zIGR1cmNoIEJlY29tZXNOZXRBbGl2ZSgpCisgICAgICAgIC8vZWluZXMgYW5kZXJlbiB6ZXJzdG9lcnQgd2VyZGVuLgorICAgICAgICBpZiAob2JqZWN0cChvYikpCisgICAgICAgICAgY2F0Y2goIGNhbGxfb3RoZXIob2IsICJCZWNvbWVzTmV0QWxpdmUiLCBNRSk7cHVibGlzaCApOworICAgIH0KKworICAgIC8vIEVyc3QgYW4gZGllc2VyIFN0ZWxsZSwgd2VpbCBkZXIgU3BpZWxlciB1LlUuIGR1cmNoIGVpbiBCZWNvbWVzTmV0QWxpdmUoKQorICAgIC8vIG5vY2ggYmV3ZWd0IHd1cmRlLgorICAgIGlmICggIXNpbGVudCAmJiBlbnZpcm9ubWVudCgpICYmIG9iamVjdF9uYW1lKGVudmlyb25tZW50KCkpICE9IE5FVERFQURfUk9PTSApCisgICAgeworICAgICAgICBpZihxdWVyeV9oY19wbGF5KCk8PTEpCisgICAgICAgICAgdGVsbF9yb29tKGVudmlyb25tZW50KCksUXVlcnlQcm9wKFBfTkFNRSkgKyAiIHdlaWx0IHdpZWRlciB1bnRlciBkZW4gTGViZW5kZW4uXG4iLCh7TUV9KSApOworICAgICAgICBlbHNlIAorICAgICAgICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudCgpLFF1ZXJ5UHJvcChQX05BTUUpICsgIiB3ZWlsdCB3aWVkZXIgdW50ZXIgZGVuIFZlcnN0b3JiZW5lbi5cbiIsKHtNRX0pICk7CisgICAgfQorCisgICAgTmV3YmllSW50cm9Nc2coKTsKKworICAgIGlmICggcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShNRSkgKQorICAgICAgICBMaXN0QXdhaXRlZCgpOworfQorCisvKiogTG9nZ3QgZWluZW4gU3BpZWxlciBhdXMgdW5kIG1hY2h0IGlobiBuZXR6dG90LgorICBCZXdlZ3QgZWluZW4gU3BpZWxlciBpbiBkZW4gTmV0enRvdGVucmF1bSwgZGVha3RpdmllcnQgSGVhcnRiZWF0cyBpbQorICBJbnZlbnRhciwgcnVmdCBCZWNvbWVzTmV0RGVhZCgpLCBsb2VzdCBFcndhcnRlbWVsZHVuZ2VuIGF1cywgdHJpZ2dlcnQKKyAgQXVzbG9nZ2V2ZW50LgorKi8KK3ZvaWQgTmV0RGVhZCgpCit7CisgIG9iamVjdCAqaW52OworICBpbnQgbnVtOworCisgIGNhdGNoKFJlbW92ZUNoYW5uZWxzKCk7cHVibGlzaCk7CisKKyAgaWYocXVlcnlfaGNfcGxheSgpPjEpCisgICAgc2F5KCJQbG9ldHpsaWNoIHdlaWNodCBhbGxlIHNwaXJpdHVlbGxlIEVuZXJnaWUgYXVzICIrUXVlcnlQcm9wKFBfTkFNRSkrIi5cbiIpOworICBlbHNlCisgICAgc2F5KCJQbG9ldHpsaWNoIHdlaWNodCBhbGxlcyBMZWJlbiBhdXMgIitRdWVyeVByb3AoUF9OQU1FKSsiLlxuIik7CisKKyAgX3NldF9uZXRkZWFkKCk7CisgIHJlbW92ZV9jYWxsX291dCgicXVpdCIpOworICByZW1vdmVfbGl2aW5nX25hbWUoKTsKKyAgLy8gV2lyZCB6d2FyIGltIHNhdmVfbWUoKSBnZW1hY2h0LCBhYmVyIGRpZSBaZWl0dW50ZXJzY2hpZWRlIGJlaW0KKyAgLy8gZmluZ2VybiBkaXJla3QgbmFjaCBkZW0gQXVzbG9nZ2VuIGZ1ZWhyZW4gaW1tZXIgd2llZGVyIHp1IFZlcndpcnJ1bmdlbgorICBpZihxdWVyeV9vbmNlX2ludGVyYWN0aXZlKE1FKSAmJiAhUXVlcnlQcm9wKFBfSU5WSVMpKQorICAgICAgU2V0KFBfTEFTVF9MT0dPVVQsdGltZSgpKTsKKyAgaWYgKE1FKQorICAgIG5kZWFkX2xvY2F0aW9uID0gZW52aXJvbm1lbnQoKTsKKworICBpZiAocXVlcnlfb25jZV9pbnRlcmFjdGl2ZShNRSkpCisgICAgY2FsbF9ub3RpZnlfcGxheWVyX2NoYW5nZSgwKTsKKworICAvLyBMb2dvdXQtZXZlbnQgYXVzbG9lc2VuCisgIEVWRU5URC0+VHJpZ2dlckV2ZW50KEVWVF9MSUJfTE9HT1VULCAoWworICAgICAgICAgIEVfT0JKRUNUOiBNRSwKKyAgICAgICAgICBFX1BMTkFNRTogZ2V0dWlkKE1FKSwKKyAgICAgICAgICBFX0VOVklST05NRU5UOiBlbnZpcm9ubWVudCgpIF0pICk7CisKKyAgc2V0X25leHRfcmVzZXQoOTAwKTsKKyAgLyogQmVpIE5pY2h0LU1hZ2llci1TaGVsbHMgd2lyZCBjb21tOjpyZXNldCgpIGF1ZmdlcnVmZW4sIGRhcyBwcnVlZnQsIG9iCisgICAgIGRlciBTcGllbGVyIGltbWVyIG5vY2ggbmV0enRvdCBpc3QsIHVuZCBmYWxscyBqYSwgZGllIHRtaGlzdCBsb2VzY2h0LgorICAgICBEaWUgTWV0aG9kZSB3aXJkIHZvbiAvc3RkL3NoZWxscy9tYWdpZXIuYyB1ZWJlcnNjaHJpZWJlbiwgbmV0enRvdGUKKyAgICAgTWFnaWVyIChkaWUgZWlnZW50bGljaCBzY2hvbiBhbmRlcndlaXRpZyBiZXNlaXRpZ3Qgd29yZGVuIHNlaW4gc29sbHRlbikKKyAgICAgd2VyZGVuIHJlbW92ZSgpZCB1bmQgZGVzdHJ1Y3QoKWVkLiAtLUFteW50aG9yIDA1LjA1LjIwMDggKi8KKworICBpZiAoZW52aXJvbm1lbnQoKSkgeworICAgIGNhdGNoKGVudmlyb25tZW50KCktPkJlY29tZXNOZXREZWFkKE1FKTtwdWJsaXNoKTsKKyAgICBpbnYgPSBkZWVwX2ludmVudG9yeShNRSkrYWxsX2ludmVudG9yeShlbnZpcm9ubWVudCgpKTsKKyAgfQorICBlbHNlIGludj1kZWVwX2ludmVudG9yeShNRSk7CisgIGZvcmVhY2gob2JqZWN0IG9iOiBpbnYpIHsKKyAgICAgIGlmIChvYmplY3RwKG9iKSkgLy9tYW4gd2Vpc3MgbmllIHdhcyBCTkQoKSBtYWNodC4uLgorICAgICAgICAgIGNhdGNoKCBjYWxsX290aGVyKG9iLCAiQmVjb21lc05ldERlYWQiLCBNRSk7cHVibGlzaCApOworICB9Cit9CisKKworLyoqIFNlbmRldCBnZ2YuIFRlbG5ldCBUaW1pbmcgTWFya3MgYWxzIEtlZXAtQWxpdmUgUGFrZXRlIGFuIGRlbiBDbGllbnQuCisgICogV2lyZCBpbiBoZWFydF9iZWF0KCkgZ2VydWZlbi4KKyAgKiBAcmV0dXJuIDEsIGZhbGxzIGRlciBTcGllbGVyIEtlZXAtQWxpdmUgUGFrZXQgd3VlbnNjaHQsIHNvbnN0IDAuIAorICAqIEBzZWUgaGVhcnRfYmVhdCgpCisqLworcHJvdGVjdGVkIGludCBDaGVja1RlbG5ldEtlZXBBbGl2ZSgpIHsKKyAgaWYgKHRlbG5ldF90bV9jb3VudGVyID4gMCkgeworICAgIC8vIFNwaWVsZXIgaGF0IG9mZmVuYmFyIGVpbiBLZWVwLUFsaXZlIGtvbmZpZ3VyaWVydCAuLi4KKyAgICBpZiAoISgtLXRlbG5ldF90bV9jb3VudGVyKSkgeworICAgICAgLy8gdW5kIGRhcyBJbnRlcnZhbGwgaXN0IGdlcmFkZSBhYmdlbGF1ZmVuLgorICAgICAgLy8gUHJvcCBvZmZlbmJhciBnZXNldHp0LCBGRWF0dXJlIGlzdCB3aXJrbGljaCBnZXd1ZW5zY2h0LAorICAgICAgLy8gVGVsbmV0IFRpbWluZyBNYXJrIHNlbmRlbiAKKyAgICAgIHNlbmRfdGVsbmV0X3RpbWluZ19tYXJrKCk7CisgICAgICAvLyBhbGxlIDEyMCBIQnMgKDI0MHMsIDRtaW4pLgorICAgICAgLy8gc29sbHRlIGVpZ2VudGxpY2ggMjQwIC8gX19IRUFSVF9CRUFUX0lOVEVSVkFMX18gc2Vpbi4gQWJlciBzcGFydAorICAgICAgLy8gZWluZSBPcGVyYXRpb24gaW0gSEIuIDstKQorICAgICAgdGVsbmV0X3RtX2NvdW50ZXIgPSAxMjA7CisgICAgfQorICAgIHJldHVybiAxOyAvLyBLZWVwLUFsaXZlIGlzdCBlaW5nZXNjaGFsdGV0CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG5kZWFkX21vdmVfbWUoKTsKKworLyoqIEhlYXJ0YmVhdCBkZXMgU3BpZWxlcm9iamVrdGVzLgorICBQcnVlZnQgdGFlZ2xpY2hlIFNwaWVsemVpdCwgc3BlaWNoZXJ0IHJlZ2VsbWFlc3NpZyBkZW4gU3BpZWxlciwKKyAgYmV3ZWd0IE5ldHp0b3RlIGluIGRlbiBOZXR6dG9kZW5yYXVtLCBydWZ0IGRpZSBIQnMgYXVzIGxpdmluZy9jb21iYXQgdW5kCisgIHBsYXllci9saWZlLgorKi8KK3Byb3RlY3RlZCB2b2lkIGhlYXJ0X2JlYXQoKSB7CisgIGlmICghTUUpCisgICAgcmV0dXJuOworICBpZiAobmRlYWRfY3VycmVudGx5KQorICB7CisgICAgaWYgKGludGVyYWN0aXZlKE1FKSkKKyAgICB7CisgICAgICBuZGVhZF9yZXZpdmUoKTsKKyAgICAgIG5kZWFkX2xvY2F0aW9uPTA7CisgICAgfQorICAgIGVsc2UgcmV0dXJuOworICB9CisgIGVsc2UKKyAgICBpZiAoIShuZGVhZF9uZXh0X2NoZWNrLS0pKQorICAgIHsKKyAgICAgIG5kZWFkX25leHRfY2hlY2s9TkVUREVBRF9DSEVDS19USU1FOworICAgICAgaWYgKCFpbnRlcmFjdGl2ZShNRSkpCisgICAgICAgIGlmIChuZGVhZF9sYXN0dGltZSkKKyAgICAgICAgeworICAgICAgICAgIHNhdmVfbWUoMSk7CisgICAgICAgICAgaWYgKElTX0xFQVJORVIoTUUpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHF1aXQoKTsKKyAgICAgICAgICAgIGlmIChNRSkKKyAgICAgICAgICAgICAgcmVtb3ZlKCk7CisgICAgICAgICAgICBpZiAoTUUpCisgICAgICAgICAgICAgIGRlc3RydWN0KE1FKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisgICAgICAgICAgbmRlYWRfbW92ZV9tZSgpOworICAgICAgICAgIC8vIFp1bWluZGVzdCBiZWkgR2Flc3RlbiBpc3QgZGFzIE9iamVrdCBqZXR6dCB6ZXJzdG9lcnQKKyAgICAgICAgICBpZiAoIW9iamVjdHAodGhpc19vYmplY3QoKSkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIG5kZWFkX2xhc3R0aW1lPTE7CisgICAgfQorICBpZiAoTUUgJiYgbmRlYWRfbGFzdHRpbWUgJiYgaW50ZXJhY3RpdmUoTUUpKQorICAgIG5kZWFkX2xhc3R0aW1lPTA7CisgIGlmIChDaGVja0RhaWx5UGxheXRpbWUoKSkKKyAgICByZXR1cm47CisKKyAgQ2hlY2tUZWxuZXRLZWVwQWxpdmUoKTsKKworICBsaWZlOjpoZWFydF9iZWF0KCk7CisgIGNvbWJhdDo6aGVhcnRfYmVhdCgpOworICBza2lsbHM6OmhlYXJ0X2JlYXQoKTsKK30KKworLyoqIElELUZ1bmt0aW9uIGZ1ZXIgU3BpZWxlcm9iamVrdGUuCisgKiBpZCgpIGZ1ZXIgU3BpZWxlci4gQmVzb25kZXJlIEJlaGFuZGx1bmcgZnVlciBGcm9lc2NoZSB1bmQgR2Vpc3RlciwKKyAqIHNvd2llIEludmlzLVN0YXR1cy4KKyAqIEdpYnQgaW1tZXIgMCB6dXJ1ZWNrLCB3ZW5uIFBfSU5WSVMgJiYgbHZsIDwgUF9MRVZFTAorICogQHBhcmFtW2luXSBzdHIgYW5nZWZyYWd0ZXIgSUQtU3RyaW5nCisgKiBAcGFyYW1baW5dIGx2bCBMZXZlbCBkZXMgQW5mcmFnZW5kZW4KKyAqIEByZXR1cm4gMSwgZmFsbHMgc3RyIGF1ZiBkZW4gU3BpZWxlciB6dXRyaWZmdCwgMCBzb25zdC4KKyAqLwordmFyYXJncyBpbnQgaWQoc3RyaW5nIHN0ciwgaW50IGx2bCkKK3sKKyAgaWYgKDo6aWQoc3RyKSkKKyAgICByZXR1cm4gMTsKKyAgaWYgKFF1ZXJ5KFBfSU5WSVMpICYmIGx2bCA8IFF1ZXJ5UHJvcChQX0xFVkVMKSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKFF1ZXJ5UHJvcChQX0dIT1NUKSYmIHN0ciA9PSAiZ2Vpc3Qgdm9uICIrIGxvd2VyX2Nhc2UoUXVlcnlQcm9wKFBfTkFNRSkpKQorICAgIHJldHVybiAxOworICBpZiAoUXVlcnlQcm9wKFBfRlJPRykgJiYgc3RyID09ICJmcm9zY2giKSByZXR1cm4gMTsKKyAgcmV0dXJuKDApOworfQorCisvKiogU2V0enQgU3BpZWxlcmhvbWVwYWdlIChTcGllbGVya29tbWFuZG8pLgorICAqIEBwYXJhbVtpbl0gc3RyIFNwaWVsZXJlaW5nYWJlCisgICogQHJldHVybiAxIGJlaSBFcmZvbGcsIDAgc29uc3QuCisgICovCitzdGF0aWMgaW50IHNldF9ob21lcGFnZShzdHJpbmcgc3RyKQoreworICBtaXhlZCB0bXA7CisgIGlmICghKHN0cj1fdW5wYXJzZWRfYXJncygpKSkgeworICAgIGlmICghUXVlcnlQcm9wKFBfSE9NRVBBR0UpKQorICAgICAgd3JpdGUoIkR1IGhhc3Qga2VpbmUgVVJMLUFkcmVzc2UgZ2VzZXR6dCFcbiIpOworICAgIGVsc2UKKyAgICAgIHdyaXRlKCJEZWluZSBvZmZpemllbGxlIFVSTC1BZHJlc3NlIGxhdXRldDogIiArIFF1ZXJ5UHJvcChQX0hPTUVQQUdFKQorICAgICAgICAgICAgKyJcbiIpOworICAgIHJldHVybiAxOworICB9CisgIHdyaXRlKCJEZWluZSBvZmZpemllbGxlIFVSTC1BZHJlc3NlIHd1cmRlIGdlYWVuZGVydC5cbiIpOworICBpZiAoc3RyPT0ia2VpbmUiKSAKKyAgICBTZXRQcm9wKFBfSE9NRVBBR0UsIDApOworICBlbHNlIHsKKyAgICB0bXAgPSBmaWx0ZXIocmVnZXhwbG9kZShzdHIsICJbPF1bXj5dKls+XSIpLAorICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGEoKHsnZX0pLCAoeyMnIT0sICh7IydbLCAnZSwgMH0pLCAnPCd9KSkpOworICAgIHdyaXRlKCJTaWUgbGF1dGV0IGpldHp0OiAiKyhzdHIgPSBpbXBsb2RlKHRtcCwgIiIpKSsiXG4iKTsKKyAgICBTZXRQcm9wKFBfSE9NRVBBR0UsIHN0cik7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8qKiBTZXR6dCBTcGllbGVyLVdvaG5vcnQgKFNwaWVsZXJrb21tYW5kbykuCisgICogXHBhcmFtW2luXSBzdHIgU3BpZWxlcmVpbmdhYmUKKyAgKiBccmV0dXJuIDEgYmVpIEVyZm9sZywgMCBzb25zdC4KKyAgKi8KK3N0YXRpYyBpbnQgc2V0X2xvY2F0aW9uKCBzdHJpbmcgc3RyICkKK3sKKyAgICBtaXhlZCBvcnQ7CisKKyAgICBpZiAoIHN0ciA9PSAiMCIgfHwgc3RyID09ICJsb2VzY2hlbiIgKXsKKyAgICAgICAgU2V0KCBQX0xPQ0FUSU9OLCAwICk7CisgICAgICAgIHdyaXRlKCAiRHUgbG9lc2NodCBEZWluZSBPcnRzYW5nYWJlLlxuIiApOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAoIHN0cmluZ3Aoc3RyID0gX3VucGFyc2VkX2FyZ3MoKSkgJiYgc3RyICE9ICIiICl7CisgICAgICAgIFNldCggUF9MT0NBVElPTiwgY2FwaXRhbGl6ZShzdHIpICk7CisgICAgICAgIHByaW50ZiggIkR1IGFlbmRlcnN0IERlaW5lIE9ydHNhbmdhYmUgYXVmIFwiJXNcIi5cbiIsCisgICAgICAgICAgICAgICAgUXVlcnkoUF9MT0NBVElPTikgKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIHN0cmluZ3Aob3J0ID0gUXVlcnkoUF9MT0NBVElPTikpICkKKyAgICAgICAgcHJpbnRmKCAiRGVpbmUgT3J0c2FuZ2FiZSBsYXV0ZXQgXCIlc1wiLlxuIiwgUXVlcnkoUF9MT0NBVElPTikgKTsKKyAgICBlbHNleworICAgICAgICBTZXQoIFBfTE9DQVRJT04sIDAsIEZfVkFMVUUgKTsKKyAgICAgICAgd3JpdGUoICJEdSBoYXN0IGtlaW5lIE9ydHNhbmdhYmUgZ2VzZXR6dC5cbiIgKTsKKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKworLyoqIFNldHp0IElDUS1VSU4gZGVzIFNwaWVsZXJzIChTcGllbGVya29tbWFuZG8pLgorICAqIFxwYXJhbVtpbl0gc3RyIFNwaWVsZXJlaW5nYWJlCisgICogXHJldHVybiAxIGJlaSBFcmZvbGcsIDAgc29uc3QuCisgICovCitzdGF0aWMgaW50IHNldF9pY3Eoc3RyaW5nIHN0cikgeworICBpbnQgbnVtOworCisgIGlmICghc3RyIHx8IHN0cj09IiIpIHsKKyAgICBpZiAoIW51bT1RdWVyeVByb3AoUF9JQ1EpKQorICAgICAgd3JpdGUoIkR1IGhhc3Qga2VpbmUgSUNRLU51bW1lciBnZXNldHp0IVxuIik7CisgICAgZWxzZQorICAgICAgcHJpbnRmKCJEZWluZSBJQ1EtTnVtbWVyIGxhdXRldDogJWRcbiIsbnVtKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoc3NjYW5mKHN0ciwiJWQiLG51bSkhPTEgfHwgIW51bSkgeworICAgIHdyaXRlKCJEZWluZSBJQ1EtTnVtbWVyIHd1cmRlIGdlbG9lc2NodC5cbiIpOworICAgIFNldFByb3AoUF9JQ1EsIDApOworICB9IGVsc2UgeworICAgIHdyaXRlKCJEZWluZSBJQ1EtTnVtbWVyIHd1cmRlIGdlYWVuZGVydC5cbiIpOworICAgIHByaW50ZigiU2llIGxhdXRldCBqZXR6dDogJWRcbiIsbnVtKTsKKyAgICBTZXRQcm9wKFBfSUNRLCBudW0pOworICB9CisgIHJldHVybiAxOworfQorCisvKiogU2V0enQgSW5zdGFudCBNZXNzYW5nZXIgdm9tIFNwaWVsZXIgKFNwaWVsZXJrb21tYW5kbykuCisgICogXHBhcmFtW2luXSBzdHIgU3BpZWxlcmVpbmdhYmUKKyAgKiBccmV0dXJuIDEgYmVpIEVyZm9sZywgMCBzb25zdC4KKyAgKi8KK3N0YXRpYyBpbnQgc2V0X21lc3NlbmdlcihzdHJpbmcgc3RyKSB7CisgIGludCBudW07CisgIHN0cmluZyBzOworCisgIGlmICghc3RyIHx8IHN0cj09IiIpIHsKKyAgICBpZiAoIXM9UXVlcnlQcm9wKFBfTUVTU0VOR0VSKSkKKyAgICAgIGlmICghbnVtPVF1ZXJ5UHJvcChQX0lDUSkpIAorICAgICAgICB3cml0ZSgiRHUgaGFzdCBrZWluZSBNZXNzZW5nZXItSUQgZ2VzZXR6dC5cbiIpOworICAgICAgZWxzZSAKKyAgICAgICAgcHJpbnRmKCJEdSBoYXN0IGtlaW5lIE1lc3Nlbmdlci1JRCBnZXNldHp0LCBhYmVyIGVpbmUgSUNRLU51bW1lcjogJWRcbiIsIG51bSk7CisgICAgZWxzZQorICAgICAgcHJpbnRmKCJEZWluZSBNZXNzZW5nZXItSUQgbGF1dGV0OiAlc1xuIiwgcyk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKHN0cj09ImxvZXNjaGVuIiB8fCBzdHI9PSJrZWluZSIpIHsKKyAgICB3cml0ZSgiRGVpbmUgTWVzc2VuZ2VyLUlEIHd1cmRlIGdlbG9lc2NodC5cbiIpOworICAgIFNldFByb3AoUF9NRVNTRU5HRVIsIDApOworICB9IGVsc2UgeworICAgIHMgPSBfdW5wYXJzZWRfYXJncygpOworICAgIHByaW50ZigiRGVpbmUgTWVzc2VuZ2VyLUlEIGxhdXRldCBudW46ICVzXG4iLCBzKTsKKyAgICBTZXRQcm9wKFBfTUVTU0VOR0VSLCBzKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworCisvLyBQcnVlZnQsIG9iIGRlciBTdHJpbmcgdmVybXV0bGljaCBlaW5lIGVNYWlsLUFkcmVzc2UgaXN0LgorLy8gZGllcyBpc3QgbmljaHQgbmFycmVuc2ljaGVyLCB3aXJkIGFiZXIgZGllIG1laXN0ZW4gZU1haWwtQWRyZXNzZW4genVsYXNzZW4KKy8vIHVuZCB2aWVsIFNjaHJvdHQgYWJsZWhuZW4uCitwcml2YXRlIHN0cmluZyBjaGVja19lbWFpbChzdHJpbmcgc3RyKSB7CisgIGlmICghc3RyaW5ncChzdHIpKSByZXR1cm4gMDsKKyAgcmV0dXJuIHJlZ21hdGNoKGxvd2VyX2Nhc2Uoc3RyKSwKKyAgICAgICJbYS16MC05Ll8lKy1dK0AoPzpbYS16MC05LV0rXC4pK1thLXpdezIsNH0iLFJFX1BDUkUpOworfQorCisvKiogU2V0enQgRW1haWwtQWRyZXNzZSBkZXMgU3BpZWxlcnMgKFNwaWVsZXJrb21tYW5kbykuCisgICogXHBhcmFtW2luXSBzdHIgU3BpZWxlcmVpbmdhYmUKKyAgKiBccmV0dXJuIDEgYmVpIEVyZm9sZywgMCBzb25zdC4KKyAgKi8KK3N0YXRpYyBpbnQgc2V0X2VtYWlsKHN0cmluZyBzdHIpCit7CisgIGlmICghKHN0cj1fdW5wYXJzZWRfYXJncygpKSkgeworICAgIHdyaXRlKCJEZWluZSBvZmZpemllbGxlIEVtYWlsLUFkcmVzc2UgbGF1dGV0OiAiICsgUXVlcnlQcm9wKFBfTUFJTEFERFIpCisgICAgICAgICAgKyJcbiIpOworICAgIHJldHVybiAxOworICB9CisgIHN0ciA9IGNoZWNrX2VtYWlsKHN0cik7CisgIGlmICghc3RyKSB7CisgICAgbm90aWZ5X2ZhaWwoIkRlaW5lIEVpbmdhYmUgc2NoZWludCBrZWluZSBndWVsdGlnZSBFTWFpbC1BZHJlc3NlICIKKyAgICAgICAgInp1IHNlaW4uXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICB3cml0ZSgiRGVpbmUgRU1haWwtQWRyZXNzZSB3dXJkZSBnZWFlbmRlcnQgenU6XG4iCisgICAgICArc3RyKyJcbiIpOworICBTZXRQcm9wKFBfTUFJTEFERFIsIHN0cik7CisgIHJldHVybiAxOworfQorCisvKiogU3BpZWxlcmtvbW1hbmRvICdzZWxic3Rsb2VzY2h1bmcnLgorICAqIEdpYnQgTWVsZHVuZyBhdXMgdW5kIGZyYWd0IG5hY2ggZWluZXIgQmVzdGFldGlndW5nLgorICAqIFxyZXR1cm4gMSBiZWkgRXJmb2xnLCAwIHNvbnN0LgorICAqLworc3RhdGljIGludCBzZWxmX2RlbGV0ZSgpCit7CisgIHdyaXRlKAorICAgICIgICAgIEIgSSBTIFQgIEQgVSAgRCBJIFIgIFcgSSBSIEsgTCBJIEMgSCAgUyBJIEMgSCBFIFIgPz8/Pz8/Pz8/Pz8/XG4iKworICAgICJXZW5uIER1IERpY2ggc2VsYnN0bG9lc2NoZW4gd2lsbHN0LCBpc3QgRGVpbiBDaGFyYWt0ZXIgVU5XSURFUlJVRkxJQ0hcbiIrCisgICAgInZlcmxvcmVuLiBFcyBnaWJ0IEtFSU5FIE1vZWdsaWNoa2VpdCBpaG4gd2llZGVyenVlcnNjaGFmZmVuLiBTb2xsdGVzdFxuIisKKyAgICAiRHUgbnVyIHplaXR3ZWlsaWcgdm9tICJNVUROQU1FIiB3ZWdibGVpYmVuIHdvbGxlbiwgc28gYmVudXR6ZSBiaXR0ZVxuIisKKyAgICAiZGVuIEJlZmVobCAnc3BpZWxwYXVzZScuXG4iKworICAgICJGYWxsc3QgRHUgRGljaCBpbW1lciBub2NoIHNlbGJzdGxvZXNjaGVuIHdpbGxzdCwgZ2liIERlaW4gUGFzc3dvcmQgZWluLiIrCisgICAgIlxuXG4iKTsKKyAgaW5wdXRfdG8oInNlbGZfZGVsZXRlMiIsSU5QVVRfUFJPTVBUfElOUFVUX05PRUNITywgIkJpdHRlIGRhcyBQYXNzd29yZCBhbmdlYmVuOiAiKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qKiBTcGllbGVya29tbWFuZG8gJ3NlbGJzdGxvZXNjaHVuZycuCisgICogRW1wZmFlbmd0IEJlc3RhZXRpZ3VuZyBkZXMgU3BpZWxlcnMgdW5kIHJ1ZnQgTG9lc2NoZnVua3Rpb24gaW4gCisgICogL3NlY3VyZS9tYXN0ZXIgYXVmLgorICAqIFxwYXJhbVtpbl0gc3RyIFNwaWVsZXJlaW5nYWJlCisgICogXHJldHVybiAxIGJlaSBFcmZvbGcsIDAgc29uc3QuCisgICovCitpbnQgc2VsZl9kZWxldGUyKHN0cmluZyBzdHIpCit7CisgIGludCByZXQ7CisgIHJldD0oaW50KSJzZWN1cmUvbWFzdGVyIi0+ZGVsZXRlX3BsYXllcihzdHIsIGdldHVpZChQTCkpOworICBpZiAoIXJldCkKKyAgeworICAgIHdyaXRlKCJEYXMgaGF0IG5pY2h0IGhpbmdlaGF1ZW4gKEdvdHQgc2VpIERhbmsgLi4uLilcbiIpOworICAgIHJldHVybiAxOworICB9CisgIGlmIChRdWVyeVByb3AoUF9HVUlMRCkmJmZpbGVfc2l6ZShHVUlMRF9ESVIrUXVlcnlQcm9wKFBfR1VJTEQpKyIuYyIpPi0xKQorICAgIGNhdGNoKGNhbGxfb3RoZXIoR1VJTERfRElSK1F1ZXJ5UHJvcChQX0dVSUxEKSwgImF1c3RyZXRlbiIpO3B1Ymxpc2gpOworCisgIGlmIChRdWVyeVByb3AoUF9ERUFEUykgPCA1KSB7CisgICAgd3JpdGUoIkFkaW9zISBNYW4gc2llaHQgc2ljaC5cbiIpOworICAgIHNheShuYW1lKFdFUiwxKSsiIGhhdCBzaWNoIGdlcmFkZSBzZWxic3QgemVyc3RvZXJ0LlxuIik7CisgIH0KKyAgZWxzZSB7CisgICAgd3JpdGUoCisgICAgICAiXG5Ub2Qga29tbXQgYXVmIHNlaW5lbSB3ZWlzc2VuIFBmZXJkIGFuZ2VyaXR0ZW4uXG4iCisgICAgICsiRXIgc3RlaWd0IGFiLCBiYXV0IHNpY2ggZHJvaGVuZCB2b3IgRGlyIGF1ZiB1bmQgbXVzdGVydCBEaWNoIHNjaGFkZW5mcm9oLlxuIgorICAgICArIlxuVG9kIHNhZ3Q6IEVORExJQ0ghIE5VTiBLQU5OIERJUiBBVUNIIExBUlMgTklDSFQgTUVIUiBIRUxGRU4hXG4iCisgICAgICsiXG5Ub2QgaG9sdCB3ZWl0IG1pdCBzZWluZXIgU2Vuc2UgYXVzLiBNaXQgZ3Jvc3NlbSBTY2h3dW5nIGxhZXNzdCBlciBzaWUgYXVmXG4iCisgICAgICsiRGljaCB6dXNhdXNlbiB1bmQgZGFubi4uLlxuIik7CisgICAgc2F5KG5hbWUoV0VSLDEpKyIgc2NoaWVkIGdlcmFkZSBlbmRndWVsdGlnIHZvbiB1bnMuXG4iKTsKKyAgfQorCisgIC8vIEV2ZW50IGF1c2xvZXNlbi4gOy0pCisgIEVWRU5URC0+VHJpZ2dlckV2ZW50KEVWVF9MSUJfUExBWUVSX0RFTEVUSU9OLCAoWworICAgICAgICBFX1BMTkFNRTogZ2V0dWlkKE1FKSwKKyAgICAgICAgRV9FTlZJUk9OTUVOVDogZW52aXJvbm1lbnQoKSwKKyAgICAgICAgRV9HVUlMRE5BTUU6IFF1ZXJ5UHJvcChQX0dVSUxEKSBdKSApOworCisgIHJlbW92ZSgxKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qKiBTZXR6dCBuZXVlIHRhZWdsaWNoZSBTcGllbGRhdWVyIChTcGllbGVya29tbWFuZG8pLgorICAqIFxwYXJhbVtpbl0gc3RyIFNwaWVsZXJlaW5nYWJlCisgICogXHJldHVybiAxIGJlaSBFcmZvbGcsIDAgc29uc3QuCisgICovCitzdGF0aWMgaW50IHNwaWVsZGF1ZXIoc3RyaW5nIHN0cikgeworICBpbnQgbWluLGRheTsKKyAgc3RyaW5nIGZvbzsKKworICBub3RpZnlfZmFpbCgiICBzcGllbGRhdWVyIDx4PiBtaW51dGVuIGZ1ZXIgJWQgdGFnZVxub2RlclxuIisKKyAgICAgICAgICAgICAgIiAgc3BpZWxkYXVlciA8eD4gc3R1bmRlbiBmdWVyICVkIHRhZ2VcbiIpOworICBpZiAoIXN0cikKKyAgICByZXR1cm4gMDsKKyAgaWYgKHNzY2FuZihzdHIsIiVkIHN0dW5kZSVzIGZ1ZXIgJWQgdGFnJXMiLG1pbixmb28sZGF5LGZvbyk9PTQpCisgICAgbWluKj02MDsKKyAgZWxzZSBpZiAoc3NjYW5mKHN0ciwiJWQgbWludXRlJXMgZnVlciAlZCB0YWclcyIsbWluLGZvbyxkYXksZm9vKSE9NCkKKyAgICByZXR1cm4gMDsKKyAgaWYgKG1pbjw1KQorICAgIG1pbj01OworICBpZiAobWluPj0xNDQwKQorICAgIHJldHVybiBub3RpZnlfZmFpbCgiV2l0emJvbGQuXG4iKSwwOworCisgIFNldChQX0RBSUxZX1BMQVlUSU1FLAorICAgICAgKHttaW4qNjAsdGltZSgpLzg2NDAwK2RheSx0aW1lKCkvODY0MDAsdGltZSgpLG1pbio2MH0pKTsKKyAgLy8gMDpNaW51dGVuIHBybyBUYWcsIDE6TnIuIGRlcyBsZXR6ZW4gVGFnZXMsIDI6TnIuIGRlcyBhbmdlZmFuZ2VuZW4gVGFnZXMsCisgIC8vIDM6bGV0enRlIFplaXRwcnVlZnVuZywgNDp2ZXJibGVpYmVuZGUgWmVpdAorICBwcmludGYoIkR1IGRhcmZzdCBkaWUgbmFlY2hzdGVuICVkIFRhZyhlKSBudXIgbm9jaFxuIisKKyAgICIlZCBNaW51dGVuIGFtIFRhZyBtdWRkZW4uXG4iLGRheSxtaW4pOworICByZXR1cm4gMTsKK30KKworLyoqIEludGVycHJldGllcnQgQW5nYWJlIGRlcyBTcGllbGVycyBmdWVyIFNwaWVscGF1c2UuCisgICogXHBhcmFtW2luXSBhIFplaXRhbmdhYmUgZnVlciBTcGllbHBhdXNlLgorICAqIFxyZXR1cm4gWmVpdHB1bmt0LCBFbmRlIGRlciBTcGllbHBhdXNlLgorICAqLworcHJpdmF0ZSBpbnQgSW50ZXJwcmV0VGltZShzdHJpbmcgYSl7CisgIC8vIGFremVwdGllcnQgZm9sZ2VuZGUgRm9ybWF0ZToKKyAgLy8gICBkZC5tbS5qaiAgICAgKFJ1ZWNrZ2FiZTogMDowMCBkZXMgZW50c3ByZWNoZW5kZW4gVGFnZXMpCisKKyAgaW50ICp0cyA9IGFsbG9jYXRlKDkpOworICBpbnQgaSxqLGssbnJhcmdzOworCisgIGlmICgobnJhcmdzPXNzY2FuZihhLCIlZC4lZC4lZCIsaSxqLGspKT09MyB8fAorICAgICAgKG5yYXJncz1zc2NhbmYoYSwiJWQuJWQuIixpLGopKT09MikgeworICAgIC8vIHdlbm4ga2VpbiBqYWhyIGFuZ2VnZWJlbiBpc3QsIGRhcyBha3R1ZWxsZSBuZWhtZW4uCisgICAgaWYgKG5yYXJncyA9PSAyKQorICAgICAgIHRzW1RNX1lFQVJdID0gbG9jYWx0aW1lKClbVE1fWUVBUl07CisgICAgZWxzZSB7CisgICAgICAgLy8gWndlaS1aaWZmZXJuLUFuZ2FiZSBkZXMgSmFocmVzLi4uCisgICAgICAgaWYgKGs8MTAwKQorICAgICAgICAgICBrICs9IDIwMDA7CisgICAgICAgdHNbVE1fWUVBUl0gPSBrOworICAgIH0KKyAgICB0c1tUTV9NREFZXSA9IGk7CisgICAgdHNbVE1fTU9OXSA9IGogLSAxOworCisgICAgaW50IHplaXQgPSBta3RpbWUodHMpOworCisgICAgLy8gbmVnYXRpdmUgdW5kIHZlcmdhbmdlbmUgWmVpdGVuIHBydWVmZW4uCisgICAgaWYgKHplaXQgPD0gdGltZSgpKSB7CisgICAgICB3cml0ZSgiRGllc2VyIFplaXRwdW5rdCBsaWVndCBpbiBkZXIgVmVyZ2FuZ2VuaGVpdC5cbiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiB6ZWl0OworICB9CisgIHJldHVybiAwOworfQorCisvKiogU2V0enQgbmV1ZSBTcGllbHBhdXNlIChTcGllbGVya29tbWFuZG8pLgorICAqIEZyYWd0IHZvcmhlciBuYWNoIEJlc3RhZXRpZ3VuZyBkdXJjaCBkZW4gU3BpZWxlci4KKyAgKiBccGFyYW1baW5dIHN0ciBTcGllbGVyZWluZ2FiZQorICAqIFxyZXR1cm4gMSBiZWkgRXJmb2xnLCAwIHNvbnN0LgorICAqIFxzYSBzcGllbHBhdXNlMigpCisgICovCitzdGF0aWMgaW50IHNwaWVscGF1c2Uoc3RyaW5nIHN0cikKK3sKKyAgaW50IGRheXMsZW5kZXplaXQ7CisgIHN0cmluZyBmb287CisKKyAgbm90aWZ5X2ZhaWwoInNwaWVscGF1c2UgPHg+IHRhZ2UgICAgICAgICAgb2RlclxuIisKKyAgICAgICAgICAgICAgInNwaWVscGF1c2UgYmlzIHR0Lm1tWy5qal1cbiIpOworICBpZiAoIXN0cikgcmV0dXJuIDA7CisgIGlmKHNzY2FuZihfdW5wYXJzZWRfYXJncygpLCJiaXMgJXMiLGZvbyk9PTEpIHsKKyAgICBlbmRlemVpdCA9IEludGVycHJldFRpbWUoZm9vKTsKKyAgICBpZiAoZW5kZXplaXQgPT0gMCkgCisgICAgICAgIHJldHVybiAwOworICAgIGRheXMgPSAoKGVuZGV6ZWl0IC0gdGltZSgpKSAvIDg2NDAwKSArIDE7CisgIH0KKyAgZWxzZSBpZihzc2NhbmYoc3RyLCAiJWQgdGFnJXMiLCBkYXlzLCBmb28pID09IDIpIHsKKyAgICBpZiAoZGF5cyA8IDApCisgICAgICAgIGRheXMgPSAtMTsKKyAgICBlbHNlCisgICAgICAgIGVuZGV6ZWl0ID0gKHRpbWUoKS84NjQwMCkgKiA4NjQwMCArIGRheXMgKiA4NjQwMDsKKyAgfQorICBlbHNlIHJldHVybiAwOworCisgIGlmIChkYXlzID4gMCkKKyAgICB3cml0ZShzdHJmdGltZSgiRHUgd2lyc3QgRGljaCBlcnN0IHdpZWRlciBhbSAlZC4lbS4lWSBlaW5sb2dnZW4ga29lbm5lbiFcbiIsCisgICAgICAgICAgZW5kZXplaXQpKTsKKyAgZWxzZSBpZiAoZGF5cyA8IDApCisgICAgd3JpdGUoICJEdSB3aXJzdCBEaWNoIGF1ZiB1bmJlc3RpbW10ZSBaZWl0IG5pY2h0IG1laHIgZWlubG9nZ2VuIGtvZW5uZW4uXG4iCisgICAgICAgICAgKyJXZW5uIER1IHdpZWRlciBzcGllbGVuIHdpbGxzdCwgbXVzc3QgRHUgRGljaCBhbiBlaW5lbiBHb3R0IG9kZXJcbiIKKyAgICAgICAgICArIkVyem1hZ2llciB3ZW5kZW4gKG1pdCBlaW5lbSBHYXN0IG9kZXIgTWFpbCB2b24gYXVzc2VuKS5cbiIgKTsKKyAgZWxzZSB7CisgICAgd3JpdGUoICJEaWUgU3BpZWxwYXVzZSBpc3QgYXVmZ2Vob2Jlbi5cbiIgKTsKKyAgICBtYXN0ZXIoKS0+VEJhbmlzaE5hbWUoZ2V0dWlkKHRoaXNfb2JqZWN0KCkpLCAwKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICB3cml0ZSggIldlbm4gRHUgZGFzIHdpcmtsaWNoIHdpbGxzdCwgZ2liIGpldHp0ICdqYScgZWluLlxuIiApOworICBpbnB1dF90byggInNwaWVscGF1c2UyIiwgSU5QVVRfUFJPTVBULCAiXSIsIGRheXMpOworICByZXR1cm4gMTsKK30KKworLyoqIFNldHp0IG5ldWUgdGFlZ2xpY2hlIFNwaWVsZGF1ZXIsIHdpcmQgdWViZXIgc3BpZWxwYXVzZSgpIGdlcnVmZW4uCisgICogXHBhcmFtW2luXSBzdHIgU3BpZWxlcmVpbmdhYmUsIEJlc3RhZXRpZ3VuZworICAqIFxwYXJhbVtpbl0gZGF5cyBEYXVlciBkZXIgU3BpZWxwYXVzZSAoaW4gVGFnZW4pLgorICAqIFxzYSBzcGllbHBhdXNlKCkKKyAgKi8KK3N0YXRpYyB2b2lkIHNwaWVscGF1c2UyKHN0cmluZyBzdHIsIGludCBkYXlzKQoreworICBpZiAoc3RyICYmIChzdHIgPT0gImphIiB8fCBzdHIgPT0gIkphIiB8fCBzdHIgPT0gIkpBIikpIHsKKyAgICBtYXN0ZXIoKS0+VEJhbmlzaE5hbWUoZ2V0dWlkKHRoaXNfb2JqZWN0KCkpLCBkYXlzKTsKKyAgICB3cml0ZSgKKyAgICAgICJPaywgZGllIFNwaWVscGF1c2Ugd2lyZCBtaXQgZGVtIG5hZWNoc3RlbiBBdXNsb2dnZW4gd2lya3NhbS5cbiIKKyAgICAgKyJTb2xsdGVzdCBEdSBlcyBEaXIgYmlzIGRhaGluIG5vY2ggZWlubWFsIHVlYmVybGVndCBoYWJlbiwgc28ga2FubnN0XG4iCisgICAgICsiRHUgZGVuIFZvcmdhbmcgbWl0ICdzcGllbHBhdXNlIDAgdGFnZScgd2llZGVyIHJ1ZWNrZ2FlbmdpZyBtYWNoZW4uXG4iICk7CisgICAgcmV0dXJuOworICB9CisgIHdyaXRlKCJWb3JnYW5nIHd1cmRlIGFiZ2Vicm9jaGVuLlxuIiApOworfQorCisvKiogU2V0enQgbmV1ZXMgUGFzc3dvcnQgKFNwaWVsZXJrb21tYW5kbykuCisgICogRnJhZ3QgbmFjaCBhbHRlbSBQYXNzd29ydCB1bmQgcnVmdCBjaGFuZ2VfcGFzc3dvcmQyKCkuCisgICogXHJldHVybiAxIGJlaSBFcmZvbGcsIDAgc29uc3QuCisgICogXHNhIGNoYW5nZV9wYXNzd29yZDIoKSwgY2hhbmdlX3Bhc3N3b3JkMygpLCBjaGFuZ2VfcGFzc3dvcmQ0KCkKKyAgKi8KK3N0YXRpYyBpbnQgY2hhbmdlX3Bhc3N3b3JkKCkgeworICBzdHJpbmcgdmVyYjsKKyAgdmVyYj1xdWVyeV92ZXJiKCk7CisgIGlmICh2ZXJiIT0icGFzc3dkIiYmdmVyYiE9InBhc3N3b3JkIiYmdmVyYiE9InBhc3N3b3J0IikKKyAgICByZXR1cm4gMDsKKyAgaW5wdXRfdG8oImNoYW5nZV9wYXNzd29yZDIiLElOUFVUX05PRUNIT3xJTlBVVF9QUk9NUFQsCisgICAgICAiQml0dGUgZGFzIEFMVEUgUGFzc3dvcnQgYW5nZWJlbjogIik7CisgIHJldHVybiAxOworfQorCisvKiogU2V0enQgbmV1ZXMgUGFzc3dvcnQgKFNwaWVsZXJrb21tYW5kbykuCisgICogUHJ1ZWZ0IGFsdGVzIFBhc3N3b3J0LCBmcmFndCBuYWNoIG5ldWVtIFBhc3N3b3J0IHVuZCBydWZ0IAorICAqICAgY2hhbmdlX3Bhc3N3b3JkMygpLgorICAqIFxwYXJhbVtpbl0gc3RyIFNwaWVsZXJlaW5nYWJlIGRlcyBhbHRlbiBQYXNzd29ydGVzCisgICogXHJldHVybiAxIGJlaSBFcmZvbGcsIDAgc29uc3QuCisgICogXHNhIGNoYW5nZV9wYXNzd29yZCgpLCBjaGFuZ2VfcGFzc3dvcmQzKCksIGNoYW5nZV9wYXNzd29yZDQoKQorICAqLworc3RhdGljIGludCBjaGFuZ2VfcGFzc3dvcmQyKHN0cmluZyBzdHIpIHsKKyAgd3JpdGUoIlxuIik7CisgIGlmICghc3RyKQorICAgIHN0cj0iIjsKKyAgaWYgKE1BU1RFUi0+dXBkYXRlX3Bhc3N3b3JkKHN0cixzdHIpID09IDApIHsKKyAgICB3cml0ZSgiRmFsc2NoZXMgUGFzc3dvcnQhXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBwYXNzd29sZCA9IHN0cjsKKyAgaW5wdXRfdG8oImNoYW5nZV9wYXNzd29yZDMiLElOUFVUX05PRUNIT3xJTlBVVF9QUk9NUFQsCisgICAgICAiQml0dGUgZGFzIE5FVUUgUGFzc3dvcnQgZWluZ2ViZW46ICIpOworICByZXR1cm4gMTsKK30KKworLyoqIFNldHp0IG5ldWVzIFBhc3N3b3J0IChTcGllbGVya29tbWFuZG8pLgorICAqIFBydWVmdCBuZXVlcyBQYXNzd29ydCwgZnJhZ3QgbmFjaCBCZXN0YWV0aWd1bmcgZGVzIG5ldWVzCisgICogUGFzc3dvcnRlcyB1bmQgcnVmdCBjaGFuZ2VfcGFzc3dvcmQ0KCkuCisgICogXHBhcmFtW2luXSBzdHIgU3BpZWxlcmVpbmdhYmUgZGVzIG5ldWVuIFBhc3N3b3J0ZXMKKyAgKiBccmV0dXJuIDEgYmVpIEVyZm9sZywgMCBzb25zdC4KKyAgKiBcc2EgY2hhbmdlX3Bhc3N3b3JkKCksIGNoYW5nZV9wYXNzd29yZDIoKSwgY2hhbmdlX3Bhc3N3b3JkNCgpCisgICovCitzdGF0aWMgaW50IGNoYW5nZV9wYXNzd29yZDMoIHN0cmluZyBzdHIgKQoreworICAgIHdyaXRlKCAiXG4iICk7CisKKyAgICBpZiAoICFzdHIgfHwgc3RyID09ICIiICl7CisgICAgICAgIHdyaXRlKCAiQWJnZWJyb2NoZW4gIVxuIiApOworICAgICAgICBwYXNzd29sZCA9IHBhc3N3ID0gMDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgKCBwYXNzd29sZCA9PSBzdHIgKXsKKyAgICAgICAgd3JpdGUoICJEYXMgd2FyIERlaW4gYWx0ZXMgUGFzc3dvcnQuXG4iICk7CisgICAgICAgIGlucHV0X3RvKCAiY2hhbmdlX3Bhc3N3b3JkMyIsIElOUFVUX05PRUNIT3xJTlBVVF9QUk9NUFQsCisgICAgICAgICAgICAiQml0dGUgZGFzIE5FVUUgUGFzc3dvcnQgZWluZ2ViZW4gKHp1bSBBYmJydWNoIFJldHVybiBkcnVlY2tlbik6ICIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAoICFNQVNURVItPmdvb2RfcGFzc3dvcmQoIHN0ciwgZ2V0dWlkKE1FKSApICl7CisgICAgICAgIGlucHV0X3RvKCAiY2hhbmdlX3Bhc3N3b3JkMyIsIElOUFVUX05PRUNIT3xJTlBVVF9QUk9NUFQsCisgICAgICAgICAgICAiQml0dGUgZGFzIE5FVUUgUGFzc3dvcnQgZWluZ2ViZW46ICIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBwYXNzdyA9IHN0cjsKKyAgICBpbnB1dF90byggImNoYW5nZV9wYXNzd29yZDQiLCBJTlBVVF9OT0VDSE98SU5QVVRfUFJPTVBULAorICAgICAgICAiQml0dGUgbm9jaG1hbDogIik7CisgICAgcmV0dXJuIDE7Cit9CisKKy8qKiBTZXR6dCBuZXVlcyBQYXNzd29ydCAoU3BpZWxlcmtvbW1hbmRvKS4KKyAgKiBQcnVlZnQgbmV1ZXMgUGFzc3dvcnQgdW5kIHNldHp0IG5ldWVzIFBhc3N3b3J0LgorICAqIFxwYXJhbVtpbl0gc3RyIFNwaWVsZXJlaW5nYWJlIGRlcyBuZXVlbiBQYXNzd29ydGVzCisgICogXHJldHVybiAxIGJlaSBFcmZvbGcsIDAgc29uc3QuCisgICogXHNhIGNoYW5nZV9wYXNzd29yZCgpLCBjaGFuZ2VfcGFzc3dvcmQyKCksIGNoYW5nZV9wYXNzd29yZDMoKQorICAqLworc3RhdGljIGludCBjaGFuZ2VfcGFzc3dvcmQ0KCBzdHJpbmcgc3RyICkKK3sKKyAgICB3cml0ZSggIlxuIiApOworCisgICAgaWYgKCAhc3RyIHx8IHN0ciAhPSBwYXNzdyApeworICAgICAgICB3cml0ZSggIkRhcyB3YXIgdmVyc2NoaWVkZW4hIFBhc3N3b3J0IE5JQ0hUIGdlYWVuZGVydC5cbiIgKTsKKyAgICAgICAgcGFzc3dvbGQgPSBwYXNzdyA9IDA7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGlmICggTUFTVEVSLT51cGRhdGVfcGFzc3dvcmQoIHBhc3N3b2xkLCBwYXNzdyApICkKKyAgICAgICAgd3JpdGUoICJQYXNzd29ydCBnZWFlbmRlcnQuXG4iICk7CisgICAgZWxzZQorICAgICAgICB3cml0ZSggIkhhdCBuaWNodCBnZWtsYXBwdCFcbiIgKTsKKworICAgIHBhc3N3b2xkID0gcGFzc3cgPSAwOworICAgIHJldHVybiAxOworfQorCisKKy8qCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSdWVja21lbGR1bmdlbiB2b24gU3BpZWxlcm4gYW4gTWFnaWVyCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0YXRpYyBpbnQgZmVobGVyaGlsZmUoc3RyaW5nIHN0cikgeworICB3cml0ZSgiV2VsY2hlIEFydCB2b24gRmVobGVyIG1vZWNodGVzdCBEdSBkZW5uIG1lbGRlbj9cbiIKKyAgICAgICJGZWhsZnVua3Rpb25lbiAgICAtPiAgYnVnXG4iCisgICAgICAiSWRlZW4vQW5yZWd1bmdlbiAgLT4gIGlkZWVcbiIKKyAgICAgICJUaXBwZmVobGVyL1R5cG9zICAtPiAgdHlwb1xuIgorICAgICAgImZlaGxlbmRlIERldGFpbHMgIC0+ICBkZXRhaWxcbiIpOworCisgIHJldHVybiAxOworfQorCisvKiogU2V0enQgZWluZSBGZWhsZXJtZWxkdW5nIGFuIE1hZ2llciBhYiAoU3BpZWxlcmtvbW1hbmRvKS4KKyAgKiBGcmFndCBuYWNoIGRlciBGZWhsZXJtZWxkdW5nIHVuZCBsaWVzdCBzaWUgdmlhIGJ1ZzIoKSBlaW4sIGZhbGwgZGVyCisgICogU3BpZWxlciBrZWluIEFyZ3VtZW50IGFuZ2ViZW4gaGF0LgorICAqIFxwYXJhbVtpbl0gc3RyIG9wdGlvbmFsZSBTcGllbGVyZWluZ2FiZSBkZXIgRmVobGVyYmVzY2hyZWlidW5nCisgICogXHJldHVybiAxIGJlaSBFcmZvbGcsIDAgc29uc3QuCisgICogQHNlZSBidWcyKHN0cmluZykKKyAgKi8KK3N0YXRpYyBpbnQgYnVnKHN0cmluZyBzdHIpIHsKKyAgaWYgKCEoc3RyPV91bnBhcnNlZF9hcmdzKCkpKSB7CisgICAgd3JpdGUoICJXaWUgc2llaHQgZGVyIEZlaGxlciBkZW5uIGF1cz9cbiIgKTsKKyAgICBpbnB1dF90bygiYnVnMiIsIElOUFVUX1BST01QVCwgIl0iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICB3cml0ZSgiVmllbGVuIERhbmsgZnVlciBkaWUgSGlsZmUuXG4iKTsKKyAgc21hcnRfbG9nKCJCVUdTIixzdHIpOworICByZXR1cm4gMTsKK30KKworLyoqIFNldHp0IGVpbmUgRmVobGVybWVsZHVuZyBhbiBNYWdpZXIgYWIgKFNwaWVsZXJrb21tYW5kbykuCisgICogTGllcyBGZWhsZXJiZXNjaHJlaWJ1bmcgZWluIHVuZCBzcGVpY2hlcnQgc2llIGFiLgorICAqIFxwYXJhbVtpbl0gc3RyIFNwaWVsZXJlaW5nYWJlIGRlciBGZWhsZXJiZXNjaHJlaWJ1bmcuCisgICogXHJldHVybiAxIGJlaSBFcmZvbGcsIDAgc29uc3QuCisgICogQHNlZSBidWcoc3RyaW5nKQorICAqLworc3RhdGljIGludCBidWcyKHN0cmluZyBzdHIpIHsKKyAgaWYgKCFzdHIgfHwgc3RyID09ICIiKSB7CisgICAgd3JpdGUoIkJ1ZyBhYmdlYnJvY2hlbi4uLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgd3JpdGUoIlZpZWxlbiBEYW5rIGZ1ZXIgZGllIEhpbGZlLlxuIik7CisgIHNtYXJ0X2xvZygiQlVHUyIsc3RyKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qKiBTZXR6dCBlaW5lIFR5cG9tZWxkdW5nIGFuIE1hZ2llciBhYiAoU3BpZWxlcmtvbW1hbmRvKS4KKyAgKiBGcmFndCBuYWNoIGRlciBUeXBvbWVsZHVuZyB1bmQgbGllc3Qgc2llIHZpYSB0eXBvMigpIGVpbiwgZmFsbCBkZXIKKyAgKiBTcGllbGVyIGtlaW4gQXJndW1lbnQgYW5nZWJlbiBoYXQuCisgICogXHBhcmFtW2luXSBzdHIgb3B0aW9uYWxlIFNwaWVsZXJlaW5nYWJlIGRlciBUeXBvYmVzY2hyZWlidW5nCisgICogXHJldHVybiAxIGJlaSBFcmZvbGcsIDAgc29uc3QuCisgICogQHNlZSB0eXBvMihzdHJpbmcpCisgICovCitzdGF0aWMgaW50IHR5cG8oc3RyaW5nIHN0cikgeworICBpZiAoIShzdHI9X3VucGFyc2VkX2FyZ3MoKSkpIHsKKyAgICB3cml0ZSggIldvIGlzdCBkZW5uIGRlciBUaXBwZmVobGVyP1xuIiApOworICAgIGlucHV0X3RvKCJ0eXBvMiIsIElOUFVUX1BST01QVCwgIl0iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICB3cml0ZSgiVmllbGVuIERhbmsgZnVlciBkaWUgSGlsZmUuXG4iKTsKKyAgc21hcnRfbG9nKCJUWVBPIixzdHIpOworICByZXR1cm4gMTsKK30KKworLyoqIFNldHp0IGVpbmUgRmVobGVybWVsZHVuZyBhbiBNYWdpZXIgYWIgKFNwaWVsZXJrb21tYW5kbykuCisgICogTGllc3QgZGllIFR5cG9iZXNjaHJlaWJ1bmcgZWluIHVuZCBzcGVpY2hlcnQgc2llLgorICAqIFxwYXJhbVtpbl0gc3RyIFNwaWVsZXJlaW5nYWJlIGRlciBUeXBvYmVzY2hyZWlidW5nCisgICogXHJldHVybiAxIGJlaSBFcmZvbGcsIDAgc29uc3QuCisgICogQHNlZSB0eXBvKHN0cmluZykKKyAgKi8KK3N0YXRpYyBpbnQgdHlwbzIoc3RyaW5nIHN0cikgeworICBpZiAoIXN0ciB8fCBzdHIgPT0gIiIpIHsKKyAgICB3cml0ZSgiVHlwbyBhYmdlYnJvY2hlbi4uLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgc21hcnRfbG9nKCJUWVBPIixzdHIpOworICB3cml0ZSgiVmllbGVuIERhbmsgZnVlciBkaWUgSGlsZmUuXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qKiBTZXR6dCBlaW5lIElkZWUgYW4gTWFnaWVyIGFiIChTcGllbGVya29tbWFuZG8pLgorICAqIEZyYWd0IG5hY2ggZGVyIElkZWUgdW5kIGxpZXN0IHNpZSB2aWEgaWRlZTIoKSBlaW4sIGZhbGxzIGRlcgorICAqIFNwaWVsZXIga2VpbiBBcmd1bWVudCBhbmdlYmVuIGhhdC4KKyAgKiBccGFyYW1baW5dIHN0ciBvcHRpb25hbGUgU3BpZWxlcmVpbmdhYmUgZGVyIElkZWUKKyAgKiBccmV0dXJuIDEgYmVpIEVyZm9sZywgMCBzb25zdC4KKyAgKiBAc2VlIGlkZWEyKHN0cmluZykKKyAgKi8KK3N0YXRpYyBpbnQgaWRlYShzdHJpbmcgc3RyKSB7CisgIGlmICghKHN0cj1fdW5wYXJzZWRfYXJncygpKSkgeworICAgIHdyaXRlKCAiV2FzIGZ1ZXIgZWluZSBJZGVlIGhhc3QgRHUgZGVubj9cbiIgKTsKKyAgICBpbnB1dF90bygiaWRlYTIiLElOUFVUX1BST01QVCwgIl0iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICB3cml0ZSgiVmllbGVuIERhbmsgZnVlciBkaWUgSGlsZmUuXG4iKTsKKyAgc21hcnRfbG9nKCJJREVBIixzdHIpOworICByZXR1cm4gMTsKK30KKworLyoqIFNldHp0IGVpbmUgSWRlZSBhbiBNYWdpZXIgYWIgKFNwaWVsZXJrb21tYW5kbykuCisgICogTGllc3QgZGllIElkZWUgZWluIHVuZCBzcGVpY2hlcnQgc2llLgorICAqIFxwYXJhbVtpbl0gc3RyIFNwaWVsZXJlaW5nYWJlIGRlciBJZGVlCisgICogXHJldHVybiAxIGJlaSBFcmZvbGcsIDAgc29uc3QuCisgICogQHNlZSBpZGVhKHN0cmluZykKKyAgKi8KK3N0YXRpYyBpbnQgaWRlYTIoc3RyaW5nIHN0cikgeworICBpZiAoIXN0ciB8fCBzdHIgPT0gIiIpIHsKKyAgICB3cml0ZSgiSWRlZSBhYmdlYnJvY2hlbi4uLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgd3JpdGUoIlZpZWxlbiBEYW5rIGZ1ZXIgZGllIEhpbGZlLlxuIik7CisgIHNtYXJ0X2xvZygiSURFQSIsc3RyKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qKiBTZXR6dCBlaW4gZmVobGVuZGVzIERldGFpbCBhbiBNYWdpZXIgYWIgKFNwaWVsZXJrb21tYW5kbykuCisgICogRnJhZ3QgbmFjaCBkZW0gRGV0YWlsIHVuZCBsaWVzdCBlcyB2aWEgaWRlZTIoKSBlaW4sIGZhbGxzIGRlcgorICAqIFNwaWVsZXIga2VpbiBBcmd1bWVudCBhbmdlYmVuIGhhdC4KKyAgKiBccGFyYW1baW5dIHN0ciBvcHRpb25hbGUgU3BpZWxlcmVpbmdhYmUgZGVzIGZlaGxlbmRlbiBEZXRhaWxzCisgICogXHJldHVybiAxIGJlaSBFcmZvbGcsIDAgc29uc3QuCisgICogQHNlZSBtZDIoc3RyaW5nKQorICAqLworc3RhdGljIGludCBtZChzdHJpbmcgc3RyKSB7CisgIGlmICghKHN0cj1fdW5wYXJzZWRfYXJncygpKSkgeworICAgIHdyaXRlKCAiRnVlciB3ZWxjaGVzIERldGFpbCBmZWhsdCBkZW5uIGRpZSBCZXNjaHJlaWJ1bmc/XG4iICk7CisgICAgaW5wdXRfdG8oIm1kMiIsSU5QVVRfUFJPTVBULCAiXSIpOworICAgIHJldHVybiAxOworICB9CisgIHdyaXRlKCJWaWVsZW4gRGFuayBmdWVyIGRpZSBIaWxmZS5cbiIpOworICBzbWFydF9sb2coIkRFVEFJTFMiLHN0cik7CisgIHJldHVybiAxOworfQorCisvKiogU2V0enQgZWluIGZlaGxlbmRlcyBEZXRhaWwgYW4gTWFnaWVyIGFiIChTcGllbGVya29tbWFuZG8pLgorICAqIExpZXN0IGRhcyBEZXRhaWwgZWluIHVuZCBzcGVpY2hlcnQgZXMuCisgICogXHBhcmFtW2luXSBzdHIgU3BpZWxlcmVpbmdhYmUgZGVzIGZlaGxlbmRlbiBEZXRhaWxzLgorICAqIFxyZXR1cm4gMSBiZWkgRXJmb2xnLCAwIHNvbnN0LgorICAqIEBzZWUgbWQoc3RyaW5nKQorICAqLworc3RhdGljIGludCBtZDIoc3RyaW5nIHN0cikgeworICBpZiAoIXN0ciB8fCBzdHIgPT0gIiIpIHsKKyAgICB3cml0ZSgiRGV0YWlscyBhYmdlYnJvY2hlbi4uLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgd3JpdGUoIlZpZWxlbiBEYW5rIGZ1ZXIgZGllIEhpbGZlLlxuIik7CisgIHNtYXJ0X2xvZygiREVUQUlMUyIsc3RyKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qKiBMb2dndCBlaW5lIFNwaWVsZXJtZWxkdW5nIGFuIE1hZ2llci4KKyAgKiBMb2dndCBkaWUgU3BpZWxlcm1lbGR1bmcgaW4gZGFzIHBhc3NlbmRlIEZpbGUgdW50ZXIgL2xvZy9yZXBvcnQvIG9kZXIgaW0KKyAgKiB2b20gTWFnaWVyIGdld3VlbnNjaHRlbiBGaWxlLiBIaWVyYmVpIHdlcmRlbiBGZWhsZXIsIElkZWVuLCBNRHMgdW5kIFR5cG9zCisgICogaW4gZ2V0cmVubnRlIEZpbGVzIHNvcnRpZXJ0LgorICAqIFxwYXJhbVtpbl0gc3RyIFNwaWVsZXJtZWxkdW5nCisgICogXHBhcmFtW2luXSBteW5hbWUgQXJ0IGRlciBTcGllbGVybWVsZHVuZyAoREVUQUlMUywgQlVHLCBUWVBPLCBNRCkKKyAgKiBAc2VlIG1kKHN0cmluZyksIGlkZWEoc3RyaW5nKSwgYnVnKHN0cmluZyksIHR5cG8oc3RyaW5nKQorICAqLwordm9pZCBzbWFydF9sb2coc3RyaW5nIG15bmFtZSwgc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIG9ibmFtOworICBvYmplY3Qgb2JqOworCisgIHN0cmluZyAqdG1wID0gZXhwbG9kZShzdHIsICI6Iik7CisgIGlmIChzaXplb2YodG1wKSA+IDEpIHsKKyAgICBvYm5hbSA9IGxvd2VyX2Nhc2UodHJpbSh0bXBbMF0pKTsKKyAgICBvYmogPSBwcmVzZW50KG9ibmFtLCBlbnZpcm9ubWVudCgpKSB8fCBwcmVzZW50KG9ibmFtKTsKKyAgICBpZiAoIW9iaikgeworICAgICAgb2JqID0gZW52aXJvbm1lbnQodGhpc19vYmplY3QoKSk7CisgICAgfQorICAgIGVsc2UgLy8gbnVyIGhpZXIgVGVpbCB2b3IgZGVtIDogd2Vnc2NobmVpZGVuCisgICAgICBzdHIgPSB0cmltKGltcGxvZGUodG1wWzEuLl0sIjoiKSk7CisgIH0KKyAgZWxzZSB7CisgICAgb2JqID0gUXVlcnlQcm9wKFBfUkVGRVJFTkNFX09CSkVDVCk7CisgICAgaWYgKCFvYmogfHwgIXByZXNlbnQob2JqKSkKKyAgICAgIG9iaiA9IGVudmlyb25tZW50KHRoaXNfaW50ZXJhY3RpdmUoKSk7CisgIH0KKworICBtYXBwaW5nIGVyciA9IChbIEZfUFJPRzogInVuYmVrYW5udCIsCisgICAgICAgICAgIEZfTElORTogMCwKKyAgICAgICAgICAgRl9NU0c6IHN0ciwKKyAgICAgICAgICAgRl9PQko6IG9iagorICAgICAgICAgXSk7CisKKyAgc3RyaW5nIGRlc2M9ImV0d2FzIHVuYmVrYW5udGVzIjsKKyAgc3dpdGNoKG15bmFtZSkgeworICAgIGNhc2UgIkJVR1MiOgorICAgICAgZGVzYz0iZWluZW4gRmVobGVyIjsKKyAgICAgIGVycltGX1RZUEVdPVRfUkVQT1JURURfRVJSOworICAgICAgYnJlYWs7CisgICAgY2FzZSAiREVUQUlMUyI6CisgICAgICBkZXNjPSJlaW4gZmVobGVuZGVzIERldGFpbCI7CisgICAgICBlcnJbRl9UWVBFXT1UX1JFUE9SVEVEX01EOworICAgICAgYnJlYWs7CisgICAgY2FzZSAiSURFQSI6CisgICAgICBkZXNjPSJlaW5lIElkZWUiOworICAgICAgZXJyW0ZfVFlQRV09VF9SRVBPUlRFRF9JREVBOworICAgICAgYnJlYWs7CisgICAgY2FzZSAiVFlQTyI6CisgICAgICBkZXNjPSJlaW5lbiBUeXBvIjsKKyAgICAgIGVycltGX1RZUEVdPVRfUkVQT1JURURfVFlQTzsKKyAgICAgIGJyZWFrOworICB9CisKKyAgLy8gRWludHJhZ3VuZyBpbiBkaWUgRmVobGVyLURCCisgIHN0cmluZyBoYXNoa2V5ID0gKHN0cmluZylFUlJPUkQtPkxvZ1JlcG9ydGVkRXJyb3IoZXJyKTsKKworICAvLyBnZ2YuIHdpbGwgZGFzIE9iamVrdGUgbWl0IG5vY2ggaXJnZW5kd2FzIGFuZmFuZ2VuLgorICBvYmotPlNtYXJ0TG9nKDAsIG15bmFtZSwgc3RyLCBzdHJmdGltZSgiJWQuICViICVZIikpOworCisgIHRlbGxfb2JqZWN0KHRoaXNfb2JqZWN0KCksIGJyZWFrX3N0cmluZyggc3ByaW50ZigKKyAgICAiRHUgaGFzdCBhbiAlcyBlcmZvbGdyZWljaCAlcyBhYmdlc2V0enQuXG4iCisgICAgIkRpZSBJRCBkZXIgYWJnZXNldHp0ZW4gTWVsZHVuZyBsYXV0ZXQ6ICVzXG4iLAorICAgIChvYmotPklzUm9vbSgpID8gImRpZXNlbSBSYXVtIiA6IG9iai0+bmFtZShXRU0sMSkpLGRlc2MsCisgICAgaGFzaGtleXx8Ik4vQSIpLDc4LEJTX0xFQVZFX01ZX0xGUykpOworfQorCisvKiogU3BlaWNoZXJ0IGRlbiBTcGllbGVyIHVuZCBsb2dndCBpaG4gYXVzIChTcGllbGVya29tbWFuZG8gJ2VuZGUnKS4KKyAgKiBEZXIgU3BpZWxlciB3aXJkIHZvbGxzdGFlbmRpZyBhdXNnZWxvZ2d0LCBkLmguIGRhcyBTcGllbGVyb2JqZWt0CisgICogemVyc3RvZXJ0LgorICAqIFxyZXR1cm4gMSBiZWkgRXJmb2xnLCAwIHNvbnN0LgorICAqIEBzZWUgZGlzY29ubmVjdCgpCisgICovCitpbnQgcXVpdCgpCit7CisgIGludCBhcmc7CisgIFNldFByb3AoUF9MQVNUX1FVSVQsdGltZSgpKTsKKyAgY2F0Y2goUmVtb3ZlQ2hhbm5lbHMoKTtwdWJsaXNoKTsKKyAgaWYoIVF1ZXJ5R3Vlc3QoKSkKKyAgeworICAgIHNhdmVfbWUoMCk7CisgICAgdGVsbF9vYmplY3QoTUUsIlNwZWljaGVyZSAiK1F1ZXJ5UHJvcChQX05BTUUpKyIuXG4iKTsKKyAgfQorCisgIGlmIChpbnRlcmFjdGl2ZShNRSkpCisgICAgY2FsbF9ub3RpZnlfcGxheWVyX2NoYW5nZSgwKTsKKworICByZW1vdmVfbGl2aW5nX25hbWUoKTsKKyAgLy8gRVZUX0xJQl9MT0dPVVQgd2lyZCBpbiByZW1vdmUoKSBnZXRyaWdnZXJ0LgorICBpZihjYXRjaChyZW1vdmUoKTtwdWJsaXNoKSkgZGVzdHJ1Y3QoTUUpOworICByZXR1cm4gMTsKK30KKworLyoqIFdyYXBwZXIgaW0gcXVpdCgpIGhlcnVtLCB2ZXJoaW5kZXJ0ICdlbmRlJywgZmFsbHMgU3BpZWxlciBrYWVtcGZ0LgorICAqIFxyZXR1cm4gMCBvZGVyIFJ1ZWNrZ2FiZXdlcnQgdm9uIHF1aXQoKQorICAqIEBzZWUgcXVpdCgpCisgICovCitzdGF0aWMgaW50IG5ld19xdWl0KCkgeworICBub3RpZnlfZmFpbCgiRHUgYmlzdCBpbiBHZWRhbmtlbiBub2NoIGJlaSBEZWluZW0gbGV0enRlbiBLYW1wZi5cbiIrCisgICAgICAgICAgICAgICJXYXJ0ZSBub2NoIGV0d2FzIGJldm9yIER1IGRhcyBTcGllbCB2ZXJsYWVzc3QsXG4iKworICAgICAgICAgICAgICAiZGFtaXQgRHUgc28gbmljaHQgaW4gUkwgd2VpdGVybWFjaHN0Li4uXG4iKTsKKyAgaWYgKHRpbWUoKS1RdWVyeShQX0xBU1RfQ09NQkFUX1RJTUUpPDEyMCAmJiAhSVNfTEVBUk5JTkcoTUUpKQorICAgIHJldHVybiAwOworICByZXR1cm4gcXVpdCgpOworfQorCisvKiogR2lidCBkaWUgSW5mb3MgdWViZXIgZGVuIENoYXIgYW4gZGVuIFNwaWVsZXIgYXVzIChTcGllbGVya29tbWFuZG8gJ2luZm8nKS4KKyAgKiBccGFyYW1baW5dIGFyZyBXZW5uIGFyZz09InNob3J0Iiwgd2lyZCBlaW5lIEt1cnp1ZWJlcnNpY2h0IGF1c2dlZ2ViZW4uCisgICogXHJldHVybiAxCisgICogQHNlZSBzaG9ydF9zY29yZSgpCisgICovCitzdGF0aWMgaW50IHNjb3JlKHN0cmluZyBhcmcpIHsKKyAgc3RyaW5nIHRtcCwgZ2VuZGVyOworICBpbnQgaSxzeix2YWw7CisgIG1peGVkIGluZDsKKyAgb2JqZWN0ICplbmVtMSwgKmVuZW0yLCAqaW52OworCisgIGlmIChRdWVyeVByb3AoUF9HSE9TVCkpIHsKKyAgICB3cml0ZSgiSW0gZXdpZ2VuIExlYmVuIGdpYnQgZXMga2VpbmUgUHVua3RlLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBpbnQgcGxldiA9IExFUE1BU1RFUi0+UXVlcnlMZXZlbCgpOworIAorICBzd2l0Y2godG1wID0gUXVlcnlQcm9wKFBfR0VOREVSKSkgeworICBjYXNlIE1BTEU6IGdlbmRlciA9ICJtYWVubmxpY2giOyBicmVhazsKKyAgY2FzZSBGRU1BTEU6IGdlbmRlciA9ICJ3ZWlibGljaCI7IGJyZWFrOworICBjYXNlIE5FVVRFUjogZ2VuZGVyID0gIm5ldXRyYWwiOyBicmVhazsKKyAgZGVmYXVsdDogZ2VuZGVyID0gbG93ZXJfY2FzZSh0bXApOworICB9CisKKyAgaW5kID0gbV9pbmRpY2VzKFF1ZXJ5UHJvcChQX0FUVFJJQlVURVMpKTsKKyAgdG1wID0gIiI7CisgIGZvcmVhY2goc3RyaW5nIGluZGV4OiBpbmQpIHsKKyAgICBzdHJpbmcgYW5hbWU7CisgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgY2FzZSAiaW50IjogYW5hbWUgPSAiSW50ZWxsaWdlbnoiOyBicmVhazsKKyAgICAgIGNhc2UgImNvbiI6IGFuYW1lID0gIkF1c2RhdWVyIjsgYnJlYWs7CisgICAgICBjYXNlICJkZXgiOiBhbmFtZSA9ICJHZXNjaGlja2xpY2hrZWl0IjsgYnJlYWs7CisgICAgICBjYXNlICJzdHIiOiBhbmFtZSA9ICJLcmFmdCI7IGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaWYoc3RyaW5ncChpbmRleCkpIGFuYW1lID0gY2FwaXRhbGl6ZShpbmRleCk7CisgICAgICAgIGVsc2UgYW5hbWUgPSAiVW5iZWthbm50IjsKKyAgICB9CisgICAgYW5hbWUgPSBzcHJpbnRmKCIlLTE4Jy4ncyAlMi4yZCIsIGFuYW1lKyIgIiwgUXVlcnlSZWFsQXR0cmlidXRlKGluZGV4KSk7CisgICAgaWYoKHZhbCA9IFF1ZXJ5QXR0cmlidXRlT2Zmc2V0KGluZGV4KSkpCisgICAgICBhbmFtZSArPSBzcHJpbnRmKCIgKCVzJWQpIiwgKHZhbD49MD8iKyI6IiIpLCB2YWwpOworICAgIHRtcCArPSBhbmFtZSArICJcbiI7CisgIH0KKworICBwcmludGYoIi0gJS0nLSc2OHNcbiIsCisgICAgICAgICBUZWFtUHJlZml4KCkrY2FwaXRhbGl6ZShpbXBsb2RlKGV4cGxvZGUoc2hvcnQoKXx8IiIsIlxuIiksIiIpKSsiICIpOworICBpZihhcmchPSJzaG9ydCIpIHsKKyAgICBwcmludGYoIlJhc3NlIC4uLi4uLi4uLi4uLiAlLScgJzE4cyBBYmVudGV1ZXIgLi4uLi4uLi4gJWQgJXNcbiIsCisgICAgICAgICAgIFF1ZXJ5UHJvcChQX1JBQ0UpLCBRdWVyeVByb3AoUF9RUCksCisgICAgICAgICAgICh2YWwgPSBRTS0+UXVlcnlUb3RhbFFQKCkpID09IFF1ZXJ5UHJvcChQX1FQKSA/ICIiIDogIigiK3ZhbCsiKSIpOworICAgIHByaW50ZigiR2VzY2hsZWNodCAuLi4uLi4uICUtJyAnMThzIEdyb2Vzc2UgLi4uLi4uLi4uLiAlZCBjbVxuIiwKKyAgICAgICAgICAgZ2VuZGVyLCBRdWVyeVByb3AoUF9TSVpFKSk7CisgICAgcHJpbnRmKCJTdHVmZSAuLi4uLi4uLi4uLi4gJS0zLjNkICUtJyAnMTRzIEdld2ljaHQgLi4uLi4uLi4uLiAlZCBrZ1xuIiwKKyAgICAgICAgICAgUXVlcnlQcm9wKFBfTEVWRUwpLCAoUXVlcnlQcm9wKFBfTEVWRUwpIDwgcGxldiA/ICIoIitwbGV2KyIpIiA6ICIiKSwKKyAgICAgICAgICAgUXVlcnlQcm9wKFBfV0VJR0hUKSAvIDEwMDApOworICAgIHByaW50ZigiR2lsZGUgLi4uLi4uLi4uLi4uICUtJyAnMThzIEdpbGRlbnN0dWZlIC4uLi4uLiAlZFxuIiwKKyAgICAgICAgIGNhcGl0YWxpemUoUXVlcnlQcm9wKFBfR1VJTEQpKSwgUXVlcnlQcm9wKFBfR1VJTERfTEVWRUwpKTsKKyAgfQorICBwcmludGYoIkVyZmFocnVuZyAuLi4uLi4uLiAlLScgJzE4cyBDaGFyYWt0ZXIgLi4uLi4uLi4gJS1zXG5cbiIsCisgICAgICAgICBRdWVyeVByb3AoUF9YUCkrICIgUHVua3RlIiwgYWxfdG9fdGl0bGUoUXVlcnlQcm9wKFBfQUxJR04pKSk7CisgIHByaW50ZigiJSMtNzYuMnNcblxuIiwgdG1wKTsKKyAgcHJpbnRmKCJHZXN1bmRoZWl0IC4uLi4uLi4gJS0zLjNkICUtJyAnMTRzIEdpZnQgLi4uLi4uLi4uLi4uLiAlc1xuIiwKKyAgICAgICAgIFF1ZXJ5UHJvcChQX0hQKSwKKyAgICAgICAgIChRdWVyeVByb3AoUF9IUCkgPT0gKHZhbCA9IFF1ZXJ5UHJvcChQX01BWF9IUCkpID8gIiIgOiAiKCIrdmFsKyIpIiksCisgICAgICAgICAoKHZhbCA9IFF1ZXJ5UHJvcChQX1BPSVNPTikpID8KKyAgICAgICAgICAodmFsIDwgNCA/ICJsZWljaHQiIDogImdlZmFlaHJsaWNoIikgOiAiZ2VzdW5kIikpOworICBwcmludGYoIktvbnplbnRyYXRpb24gLi4uLiAlLTMuM2QgJS0nICcxNHMgVm9yc2ljaHQgLi4uLi4uLi4uICVzXG4iLAorICAgICAgICAgUXVlcnlQcm9wKFBfU1ApLAorICAgICAgICAgKFF1ZXJ5UHJvcChQX1NQKSA9PSAodmFsID0gUXVlcnlQcm9wKFBfTUFYX1NQKSkgPyAiIiA6ICIoIit2YWwrIikiKSwKKyAgICAgICAgICgoaW5kID0gUXVlcnlQcm9wKFBfV0lNUFkpKSA/ICIiK2luZCA6ICJtdXRpZyIpKTsKKyAgcHJpbnRmKCJUb2Rlc2ZvbGdlbi4uLi4uLi4gJS0nICcxOHMgJXNcbiIsCisgICAgICAgICAoKHZhbCA9IGRlYXRoX3N1ZmZlcmluZygpKSA/ICIiKygodmFsKzkpLzEwKSA6ICJrZWluIE1hbHVzIiksCisgICAgICAgICAoUXVlcnlQcm9wKFBfV0lNUFkpICYmIGluZD1RdWVyeVByb3AoUF9XSU1QWV9ESVJFQ1RJT04pKQorICAgICAgICAgPyBzcHJpbnRmKCJGbHVjaHRyaWNodHVuZyAuLi4gJU8iLCBpbmQpIDogIiIpOworICBwcmludGYoIiVzIiwKKyAgICAgICAgICh0aW1lKCktUXVlcnkoUF9MQVNUX0NPTUJBVF9USU1FKTwxMjAgJiYgIUlTX0xFQVJOSU5HKE1FKSkgPworICAgICAgICAgIlNwaWVsIHZlcmxhc3NlbiAuLiBuaWNodCBtb2VnbGljaFxuIiA6ICIiCisgICAgICAgICApOworCisgIGlmKGFyZyE9InNob3J0IikgeworICAgIHdyaXRlKGJyZWFrX3N0cmluZyhGb3JzY2h1bmcoKSwgNzApKTsKKyAgICBpZihpbmQ9UXVlcnlQcm9wKFBfQVdBWSkpCisgICAgICBwcmludGYoIkR1IGJpc3QgbmljaHQgYW5zcHJlY2hiYXI6ICVPXG4iLGluZCk7CisgIH0KKworICBpZihzaXplb2YoZW5lbTE9KChtaXhlZClRdWVyeUVuZW1pZXMoKSlbMF0pKSB7CisgICAgZW5lbTI9KHt9KTsKKyAgICBpbnY9YWxsX2ludmVudG9yeShlbnZpcm9ubWVudChNRSkpOworICAgIGZvcmVhY2gob2JqZWN0IGVuOiBlbmVtMSkgeworICAgICAgaWYgKG1lbWJlcihpbnYsZW4pPT0tMSkgLy8gSXN0IHVuc2VyIEZlaW5kIHVuZCBpc3QgbmljaHQgaGllcgorICAgICAgICBlbmVtMis9KHtlbn0pOworICAgIH0KKyAgICBpZihzaXplb2YoZW5lbTIpKQorICAgIHsKKyAgICAgIHdyaXRlKGJyZWFrX3N0cmluZygKKyAgICAgICAgICAgICJEdSB2ZXJmb2xnc3QgIiArIENvdW50VXAobWFwX29iamVjdHMoZW5lbTIsICJuYW1lIiwgV0VOKSkrIi4iLAorICAgICAgICAgICAgNzgpKTsKKyAgICB9CisgIH0KKyAgaWYoYXJnIT0ic2hvcnQiKSBzaG93X2FnZSgpOworICBwcmludGYoIiUtJy0nNzBzXG4iLCAiIik7CisgIHJldHVybiAxOworfQorCisvKiogR2lidCBlaW5lIGt1ZXJ6ZXJlIEluZm8gdWViZXIgZGVuIENoYXIgYXVzIChTcGllbGVya29tbWFuZG8gcHVua3RlfHNjb3JlKS4KKyAgICBSdWZ0IHNjb3JlKCJzaG9ydCIpLgorICAqIFxwYXJhbVtpbl0gYXJnIFVOVVNFRAorICAqIFxyZXR1cm4gMSBiZWkgRXJmb2xnLCAwIHNvbnN0LgorICAqIEBzZWUgc2NvcmUoc3RyaW5nKSwgdmVyeV9zaG9ydF9zY29yZSgpCisgICovCitzdGF0aWMgaW50IHNob3J0X3Njb3JlKHN0cmluZyBhcmcpIHsKKyAgcmV0dXJuIHNjb3JlKCJzaG9ydCIpOworfQorCisvKiogR2lidCBlaW5lIE1pbmlpbmZvIHVlYmVyIExQIC8gS1AgYXVzIChTcGllbGVya29tbWFuZG86IGt1cnppbmZvKQorICAqIFxyZXR1cm4gMQorICAqIEBzZWUgc2NvcmUoc3RyaW5nKSwgc2hvcnRfc2NvcmUoc3RyaW5nKQorICAqLworc3RhdGljIGludCB2ZXJ5X3Nob3J0X3Njb3JlKHN0cmluZyBhcmcpIHsKKyAgaW50ICAgIGxwLG1scCx4bHAsa3AsbWtwLHhrcDsKKyAgc3RyaW5nIGJhcjsKKworICBscD1RdWVyeVByb3AoUF9IUCk7IG1scD1RdWVyeVByb3AoUF9NQVhfSFApOworICBrcD1RdWVyeVByb3AoUF9TUCk7IG1rcD1RdWVyeVByb3AoUF9NQVhfU1ApOworICBpZiAobWxwKQorICAgIHhscD0obHAqNDAvbWxwKTsKKyAgaWYgKG1rcCkKKyAgICB4a3A9KGtwKjQwL21rcCk7CisgIGJhcj0iICAuICAgIC4gICAgLiAgICAuICAgIC4gICAgLiAgICAuICAgIC4gICI7CisgIGlmIChRdWVyeVByb3AoUF9OT19BU0NJSV9BUlQpIHx8IGFyZyA9PSAiLWsiKQorICAgIHByaW50ZigiR2VzdW5kaGVpdDogJTMuM2QgKCUzLjNkKSwgS29uemVudHJhdGlvbjogJTMuM2QgKCUzLjNkKVxuIiwKKyAgICAgICAgICAgbHAsIG1scCwga3AsIG1rcCk7CisgIGVsc2UKKyAgICBwcmludGYoIkdlc3VuZGhlaXQ6ICAgIDAgfCUnIyc0MC40MHN8ICUzLjNkJXNcbiIrCisgICAgICAgICAgICJLb256ZW50cmF0aW9uOiAwIHwlJyMnNDAuNDBzfCAlMy4zZCVzXG4iLAorICAgICAgICAgICAoeGxwPDA/YmFyOmJhclt4bHAuLl0pLGxwLChscD09bWxwPyIiOnNwcmludGYoIiAoJWQpIixtbHApKSwKKyAgICAgICAgICAgKHhrcDwwP2JhcjpiYXJbeGtwLi5dKSxrcCwoa3A9PW1rcD8iIjpzcHJpbnRmKCIgKCVkKSIsbWtwKSkKKyAgICAgICAgICAgKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qKiBHaWJ0IGVpbmUgTWFucGFnZS9IaWxmZXNlaXRlIGFuIGRlbiBTcGllbGVyIGF1cy4KKyAgICBCZXJ1ZWNrc2ljaHRpZ3QgaGllcmJlaSBkaWUgU3lub255bWxpc3RlIGF1cyBkaXIvLnN5bm9ueW0sIHVtIGRpZSByaWNodGlnZQorICAgIE1hbnBhZ2UgYXVzenVnZWJlbi4KKyAgKiBccGFyYW1baW5dIGRpciBWZXJ6ZWljaG5pcyBkZXIgZ2V3dWVuc2NodGVuIE1hbnBhZ2UKKyAgKiBccGFyYW1baW5dIHBhZ2UgTmFtZSBkZXIgZ2V3dWVuc2NodGVuIE1hbnBhZ2UKKyAgKiBccmV0dXJuIFN0cmluZyBkZXIgZ2V3dWVuc2NodGVuIE1hbnBhZ2UKKyAgKi8KK3N0YXRpYyBzdHJpbmcgZ2V0bWFucGFnZShzdHJpbmcgZGlyLCBzdHJpbmcgcGFnZSkKK3sKKyAgc3RyaW5nIHRleHQsICpzeW47CisgIGludCBpOworCisgIGlmIChkaXJbPDFdICE9ICcvJykKKyAgICBkaXIgKz0gIi8iOworCisgIGlmICgodGV4dD1yZWFkX2ZpbGUoZGlyK3BhZ2UpKSAmJiBzaXplb2YodGV4dCkpCisgICAgcmV0dXJuIHRleHQ7CisKKyAgaWYgKHRleHQgPSByZWFkX2ZpbGUoZGlyKyIuc3lub255bSIpKSB7CisgICAgc3luID0gcmVnZXhwbG9kZSh0ZXh0LCAiKFsgXHRdWyBcdF0qfFxuKSIpOworICAgIGlmICgoaT1tZW1iZXIoc3luLCBwYWdlKSkhPS0xKQorICAgICAgcmV0dXJuIHJlYWRfZmlsZShkaXIrc3luW2krMl0pOworICB9CisgIHJldHVybiAwOworfQorCisvKiogR2lidCBlaW5lIEhpbGZlc2VpdGUgYW4gZGVuIFNwaWVsZXIgYXVzIChTcGllbGVya29tbWFuZG8gaGlsZmV8bWFuKS4KKyAgKiBEaWUgSGlsZmVzZWl0ZSB3aXJkIGluIGRpdi4gVmVyemVpY2huaXNzZW4gZ2VzdWNodCAoamUgbmFjaCBHaWxkZSwKKyAgKiBNYWdpZXItL1NwaWVsZXJzdGF0dXMpLgorICAqIFxwYXJhbVtpbl0gc3RyIE5hbWUgZGVyIGdld3VlbnNjaHRlbiBIaWxmZXNlaXRlLgorICAqIFxyZXR1cm4gMQorICAqLworc3RhdGljIGludCBoZWxwKHN0cmluZyBzdHIpIHsKKyAgc3RyaW5nIHZlcmIsIHJlc3QsIHRleHQsIGdpbGRlOworICBtaXhlZCBmb3VuZDsKKworICBmb3VuZD0wOworICB0ZXh0ID0gIiI7CisgIGlmIChzdHIpIHsKKyAgICBzdHIgPSBpbXBsb2RlKCBleHBsb2RlKHN0ciwgIi4uIiApLCAiIik7CisKKyAgICBpZiAoIHNzY2FuZiggc3RyLCAiZ2lsZGUgJXMgJXMiLCBnaWxkZSwgcmVzdCk9PTIpCisgICAgICBzdHI9cmVzdDsKKyAgICBlbHNlCisgICAgICBnaWxkZT1RdWVyeVByb3AoUF9HVUlMRCk7CisgICAgaWYgKCFnaWxkZSkgZ2lsZGU9ImFiZW50ZXVyZXIiOworCisgICAgaWYgKCBzc2NhbmYoIHN0ciwgIiVzICVzIix2ZXJiLHJlc3QgKT09MiApIHN0ciA9IHZlcmI7CisKKyAgICBpZiAoKElTX0xFQVJORVIoUEwpKSApIHsKKyAgICAgIGlmIChyZXN0ID0gZ2V0bWFucGFnZSgiL2RvYy93aXovIixzdHIpKSB7CisgICAgICAgIGZvdW5kID0gMTsKKyAgICAgICAgdGV4dCArPSByZXN0OworICAgICAgfQorICAgICAgZWxzZSBpZiAocmVzdCA9IGdldG1hbnBhZ2UoIi9kb2MvbWNtZC8iLCBzdHIpKSB7CisgICAgICAgIGZvdW5kID0gMTsKKyAgICAgICAgdGV4dCArPSByZXN0OworICAgICAgfQorICAgIH0KKworICAgIGlmICgoSVNfU0VFUihQTCkpIC8qJiYgIWZvdW5kKi8gKSB7CisgICAgICBpZiAocmVzdCA9IGdldG1hbnBhZ2UoIi9kb2Mvc2NtZC8iLHN0cikpIHsKKyAgICAgICAgaWYgKGZvdW5kKQorICAgICAgICAgIHRleHQgKz0gIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiI7CisgICAgICAgIGZvdW5kID0gMTsKKyAgICAgICAgdGV4dCArPSByZXN0OworICAgICAgfQorICAgIH0KKworICAgIGlmIChyZXN0ID0gZ2V0bWFucGFnZSgiL2RvYy9nLiIrZ2lsZGUrIi8iLHN0cikpIHsKKyAgICAgIGlmIChmb3VuZCkKKyAgICAgICAgdGV4dCArPSAiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIjsKKyAgICAgIGZvdW5kID0gMTsKKyAgICAgIHRleHQgKz0gcmVzdDsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKHJlc3QgPSBnZXRtYW5wYWdlKCIvZG9jL2hlbHAvIixzdHIpKSB7CisgICAgICAgIGlmIChmb3VuZCkKKyAgICAgICAgICB0ZXh0ICs9ICJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iOworICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgIHRleHQgKz0gcmVzdDsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHJlc3QgPSBnZXRtYW5wYWdlKCIvZG9jL3BjbWQvIixzdHIpKSB7CisgICAgICAgIGlmIChmb3VuZCkKKyAgICAgICAgICB0ZXh0ICs9ICJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iOworICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgIHRleHQgKz0gcmVzdDsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHJlc3QgPSBnZXRtYW5wYWdlKCIvZG9jL1JFR0VMTi8iLHN0cikpIHsKKyAgICAgICAgaWYgKGZvdW5kKQorICAgICAgICAgIHRleHQgKz0gIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiI7CisgICAgICAgIGZvdW5kID0gMTsKKyAgICAgICAgdGV4dCArPSByZXN0OworICAgICAgfQorICAgIH0KKworICAgIGlmICghZm91bmQpCisgICAgICB0ZXh0ID0gIkRhenUgaXN0IGtlaW5lIEhpbGZlIHZlcmZ1ZWdiYXIuXG4iOworCisgICAgTW9yZSh0ZXh0LDApOworICAgIHJldHVybiAxOworICB9CisgIGlmIChJU19MRUFSTkVSKFBMKSkKKyAgICB0ZXh0ID0gcmVhZF9maWxlKCIvZG9jL2hpbGZlLm1hZ2llciIpOworICBlbHNlIGlmIChJU19TRUVSKFBMKSkKKyAgICB0ZXh0ID0gcmVhZF9maWxlKCIvZG9jL2hpbGZlLnNlaGVyIik7CisKKyAgTW9yZSh0ZXh0ICsgcmVhZF9maWxlKCIvZG9jL2hpbGZlLnNwaWVsZXIiKSwgMCk7CisgIHJldHVybiAxOworfQorCisvKiogRXJtaXR0ZWx0IGFuZ2ViZW5lIE9wdGlvbmVuIGZ1ZXIgZGFzIFNwaWVsZXJrb21tYW5kbyAnd2VyJy4KKyAgKiBccGFyYW1baW5dIHN0ciB2b20gU3BpZWxlciBzcGV6aWZpemllcnRlciBTdHJpbmcgdm9uIEZpbHRlcm9wdGlvbmVuOiAtaywKKyAgKiAtdiwgLWEsIC1zICgrIExhbmdmb3JtZW4pLgorICAqIFxyZXR1cm4gQXJyYXkgdm9uIFNwaWVsZXJvcHRpb25lbiBhbHMgdmVyb2RlcnRlIEludC1GbGFncyB1bmQgUmVzdCBkZXIKKyAgKiBTcGllbGVyZWluZ2FiZSBvaG5lIGRpZSBPcHRpb25lbi4KKyAgKi8KK3N0YXRpYyBtaXhlZCBmaWx0ZXJfd2hvX29wdGlvbnMoc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nKiBvcHQsICphbnM7CisgIGludCBpLGxlbixyZXM7CisKKyAgb3B0ID0gZXhwbG9kZShzdHIsIiAiKTsgbGVuPXNpemVvZihvcHQpOworICBhbnMgPSAoe30pOworICByZXMgPSAwOworICBmb3IoaT0wO2k8bGVuO2krKykKKyAgICBzd2l0Y2gob3B0W2ldKXsKKyAgICAgIGNhc2UgIi1rIjoKKyAgICAgIGNhc2UgIi1rdXJ6IjoKKyAgICAgIHJlcyB8PSBXSE9fU0hPUlQ7IGJyZWFrOworICAgICAgY2FzZSAiLXYiOgorICAgICAgY2FzZSAiLXZlcnRpa2FsIjoKKyAgICAgIHJlcyB8PSBXSE9fVkVSVElDQUw7IGJyZWFrOworICAgICAgY2FzZSAiLWFscGhhYmV0aXNjaCI6CisgICAgICBjYXNlICItYSI6CisgICAgICBjYXNlICItYWxwaGEiOgorICAgICAgcmVzIHw9IFdIT19BTFBIQTsgYnJlYWs7CisgICAgICBjYXNlICItcyI6CisgICAgICBjYXNlICItc3BpZWxlciI6CisgICAgICByZXMgfD0gV0hPX1BMQVlFUl9WSUVXOyBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gKHsgcmVzLCBpbXBsb2RlKG9wdFtpLi5dLCIgIikgfSk7CisgICAgfQorICByZXR1cm4gKHsgcmVzLCAwIH0pOworCit9CisKKy8qKiBTcGllbGVya29tbWFuZG8gJ3dlcicsIGZyYWd0IC9vYmovd2VybGlzdGUgYWIuCisgICogXHBhcmFtW2luXSBzdHIgU3BpZWxlcmVpbmdhYmUgbWl0IE9wdGlvbmVuIGZ1ZXIgd2VyLgorICAqIFxyZXR1cm4gMQorICAqLworc3RhdGljIGludCB3aG8oc3RyaW5nIHN0cikgeworICBpbnQgaSxzaHJ0OworICBzdHJpbmcgcmV0OworICBtaXhlZCBhbnM7CisKKyAgaWYgKChzdHI9X3VucGFyc2VkX2FyZ3MoKSkmJnN0clswLi4wXSE9Ii0iKSB7CisgICAgYW5zID0gZmlsdGVyX3dob19vcHRpb25zKHN0cik7CisgICAgc2hydCA9IGFuc1swXTsKKyAgICBzdHIgPSBhbnNbMV07CisgICAgaWYgKCFzaHJ0KSB7CisgICAgICBpZiAocmV0PUlORVRELT5fc2VuZF91ZHAoc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFsgUkVRVUVTVDogIndobyIsIFNFTkRFUjogZ2V0dWlkKE1FKSBdKSwgMSApKQorICAgICAgICB3cml0ZShyZXQpOworICAgICAgZWxzZQorICAgICAgICB3cml0ZSgiQW5mcmFnZSBhYmdlc2NoaWNrdC5cbiIpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisgIGlmIChzdHIpIGk9KG1lbWJlcihzdHIsJ28nKT4wKTsgZWxzZSBpPTA7CisgIGlmIChzaXplb2Yoc3RyKT4xICYmIHN0clswXSA9PSAnLScpIHN0ciA9IHN0clsxLi4xXTsKKyAgTW9yZShpbXBsb2RlKCAiL29iai93ZXJsaXN0ZSItPlF1ZXJ5V2hvTGlzdGUoCisgICAgSVNfTEVBUk5FUihNRSkgJiYgUXVlcnlQcm9wKFBfV0FOVFNfVE9fTEVBUk4pLHNocnQsMCxzdHIsaSksIlxuIiksMCk7CisgIHJldHVybiAxOworfQorCisvKiogU3BpZWxlcmtvbW1hbmRvICdrd2VyJywgZnJhZ3QgL29iai93ZXJsaXN0ZSBhYi4KKyAgKiBccGFyYW1baW5dIHN0ciBTcGllbGVyZWluZ2FiZSBtaXQgT3B0aW9uZW4gZnVlciB3ZXIuCisgICogXHJldHVybiAxCisgICovCitzdGF0aWMgaW50IGt3aG8oc3RyaW5nIHN0cikKK3sKKyAgaW50IHNocnQ7CisgIG1peGVkIHJlczsKKworICBpZihzdHIpIHsKKyAgICByZXMgPSBmaWx0ZXJfd2hvX29wdGlvbnMoc3RyKTsKKyAgICBzaHJ0ID0gcmVzWzBdOworICAgIHN0ciA9IHJlc1sxXTsKKyAgfQorICBNb3JlKGltcGxvZGUoICIvb2JqL3dlcmxpc3RlIi0+UXVlcnlXaG9MaXN0ZSgKKyAgICAgIElTX0xFQVJORVIoTUUpICYmIFF1ZXJ5UHJvcChQX1dBTlRTX1RPX0xFQVJOKSwgc2hydHxXSE9fU0hPUlQgLDAsc3RyKSwKKyAgICAiXG4iKSsiXG5cbiIsMCk7CisgIHJldHVybiAxOworfQorCisvKiogU3BpZWxlcmtvbW1hbmRvICdra3dlcicsIGdpYnQgZWluZSBlaW5mYWNoZSBMaXN0ZSBkZXIgQW53ZXNlbmRlbiBhdXMuCisgICAgRmlsdGVydCB1bnNpY2h0YmFyZSBTcGllbGVyIGF1cywgZmFsbHMgU1BpZWxlcm9iamVrdCBrZWluIE1hZ2llciBpc3QuCisgICogXHBhcmFtW2luXSBzdHIgU3BpZWxlcmVpbmdhYmUgbWl0IE9wdGlvbmVuIGZ1ZXIgd2VyLgorICAqIFxyZXR1cm4gMQorICAqLworc3RhdGljIHZhcmFyZ3MgaW50IGtrd2hvKHN0cmluZyBzdHIpIHsKKyAgb2JqZWN0ICpvYnM7CisgIHN0cmluZyAqbmFtZW47CisKKyAgb2JzPWZpbHRlcl91c2VycyhzdHIpOworICBuYW1lbj0oe30pOworICBpZiAoSVNfTEVBUk5FUih0aGlzX3BsYXllcigpKSkgeworICAgIGZvcmVhY2gob2JqZWN0IG9iOiBvYnMpIHsKKyAgICAgIGlmIChlbnZpcm9ubWVudChvYikpCisgICAgICAgIG5hbWVuKz0oe2NhcGl0YWxpemUoZ2V0ZXVpZChvYikpfSk7CisgICAgfQorICB9IAorICBlbHNlIHsKKyAgICBmb3JlYWNoKG9iamVjdCBvYjogb2JzKSB7CisgICAgICBpZiAoIW9iLT5RdWVyeVByb3AoUF9JTlZJUykgJiYgZW52aXJvbm1lbnQob2IpKQorICAgICAgICBuYW1lbis9KHtjYXBpdGFsaXplKGdldGV1aWQob2IpKX0pOworICAgIH0KKyAgfQorICBpZiAoc2l6ZW9mKG5hbWVuKSkKKyAgICB3cml0ZShicmVha19zdHJpbmcoQ291bnRVcChzb3J0X2FycmF5KG5hbWVuLCMnPiksIiwgIiwgIiwgIikrIi4iLDc1KSk7CisgIGVsc2UKKyAgICB3cml0ZSgiS2VpbmUgcGFzc2VuZGVuIFNwaWVsZXIgZ2VmdW5kZW4uXG4iKTsKKyAgCisgIHJldHVybiAxOworfQorCisvKiogU3BpZWxlcmtvbW1hbmRvICd0b2V0ZScuCisgICogUHJ1ZWZ0IGF1ZiBHZWlzdCwgR2FzdCwgdG90ZW4gSEMtU3BpZWxlciwgV2FmZmUvZnJlaWUgSGFuZC4gVmVyc3VjaHQgZWluZW4KKyAgKiBHZWduZXIgenUgZmluZGVuIHVuZCBydWZ0IGRhbm4gS2lsbChzdHJpbmcpLgorICAqIFxwYXJhbVtpbl0gc3RyIFNwaWVsZXJlaW5nYWJlCisgICogXHJldHVybiAxIG9kZXIgMCwgZmFsbHMga2VpbiBwb3RlbnRpZWxsZXIgR2VnbmVyIGJlaSAndG9ldGUgYWxsZScgZ2VmdW5kZW4KKyAgKiB3aXJkLgorICAqLworc3RhdGljIGludCBraWxsKHN0cmluZyBzdHIpIHsKKyAgb2JqZWN0IGVvYix3b2I7CisKKyAgaWYgKFF1ZXJ5UHJvcChQX0dIT1NUKSkKKyAgeworICAgIHdyaXRlKCJEYXMga2FubnN0IER1IGluIERlaW5lbSBpbW1hdGVyaWVsbGVuIFp1c3RhbmQgbmljaHQuXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICAKKyAgaWYoaGNfcGxheT4xKQorICB7CisgICAgd3JpdGUoIkRBUyBIQVNUIERVIEhJTlRFUiBESVIuXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICAKKyAgaWYgKFF1ZXJ5R3Vlc3QoKSkKKyAgeworICAgIHdyaXRlKCJEdSBiaXN0IGRvY2ggbnVyIEdhc3QgaGllci5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIGlmICghc3RyIHx8IHN0ciA9PSAiIikgeworICAgIHdyaXRlKCJXRU4gd2lsbHN0IER1IHRvZXRlbj9cbiIpOworICAgIHJldHVybiAxOworICB9CisgIGlmKCAhUXVlcnlQcm9wKFBfV0VBUE9OKSAmJiBRdWVyeVByb3AoUF9GUkVFX0hBTkRTKT09MCApIHsKKyAgICB3cml0ZSgKKyAgICAgICJEYXp1IHNvbGx0ZXN0IER1IGVpbmUgV2FmZmUgZ2V6dWVja3Qgb2RlciBlaW5lIEhhbmQgZnJlaSBoYWJlbi5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIHN0cj1sb3dlcl9jYXNlKHN0cik7CisgIGlmIChzdHI9PSJhbGxlIikgeworICAgIG9iamVjdCBsaXZzOworICAgIGxpdnM9ZmlsdGVyKGFsbF9pbnZlbnRvcnkoZW52aXJvbm1lbnQoUEwpKSwKKyAgICAgICAgZnVuY3Rpb24gaW50IChvYmplY3Qgb2IpIHsKKyAgICAgICAgICAgIGlmIChsaXZpbmcob2IpICYmICFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iKQorICAgICAgICAgICAgICAgICAgJiYgIW9iLT5RdWVyeVByb3AoUF9JTlZJUykKKyAgICAgICAgICAgICAgICAgICYmICFvYi0+UXVlcnlQcm9wKFBfTk9fR0xPQkFMX0FUVEFDSykKKyAgICAgICAgICAgICAgICAgICYmICFvYi0+UXVlcnlQcm9wKFBfRlJJRU5EKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBLaWxsKG9iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9ICk7CisgICAgLy8gd2VubiBHZWduZXIgZ2VmdW5kZW4sIHJhdXMsIGFuc29uc3RlbiBrb21tdCBkaWUgRmVobGVybWVsZHVuZyB1bnRlbi4KKyAgICBpZiAoc2l6ZW9mKGxpdnMpKSByZXR1cm4gMTsKKyAgfQorICBlbHNlIHsKKyAgICBpbnQgaT0xOworICAgIHdoaWxlKG9iamVjdHAoZW9iID0gcHJlc2VudChzdHIsaSsrLGVudmlyb25tZW50KFBMKSkpKSB7CisgICAgICBpZiAobGl2aW5nKGVvYikgJiYgIWVvYi0+UXVlcnlQcm9wKFBfSU5WSVMpKQorICAgICAgICBicmVhazsKKyAgICAgIGVsc2UKKyAgICAgICAgZW9iPTA7CisgICAgfQorICB9CisgIGlmICghb2JqZWN0cChlb2IpKSB7CisgICAgLy8gcGVyIHdyaXRlIHVuZCByZXR1cm4gMSBpc3QgaGllciBtYWwgb2ssIHdlaWwgZGllcyBLb21tYW5kbyBpbSBTcGllbGVyCisgICAgLy8gZWggenVsZXR6dCBpbiBkZXIgS29tbWFuZG9rZXR0ZSBhdXNnZWZ1ZWhydCB3aXJkIHVuZCBwZXIgcmV0dXJuIDAgZWgKKyAgICAvLyBrZWluIGFuZGVyZXMgbWVociB6dW0gWnVnIGtvbW10LgorICAgIHdyaXRlKCJEdSBzaWVoc3QgaGllciBrZWluIGRlcmFydGlnZXMgV2VzZW4hXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBlbHNlIGlmIChlb2IgPT0gUEwpIHsKKyAgICB3cml0ZSgiU2VsYnN0bW9yZCBpc3Qga2VpbmUgTG9lc3VuZyFcbiIpOworICAgIHJldHVybiAxOworICB9CisKKyAgLyogS2lsbCBoaW0gKi8KKyAgS2lsbChlb2IpOworICByZXR1cm4gMTsKK30KKworLyoqIFNwaWVsZXJrb21tYW5kbyAnc3RvcCcuCisgICogTG9lc2NodCBkaWUgR2VnbmVybGlzdGUsIHNvZmVybiBtYW4gbmljaHQgSW5GaWdodCgpIGlzdC4KKyAgKiBccGFyYW1baW5dIHN0ciBTcGllbGVyZWluZ2FiZSwgd2lyZCBpZ25vcmllcnQuCisgICogXHJldHVybiAxCisgICovCitzdGF0aWMgaW50IHN0b3AoIHN0cmluZyBzdHIgKQoreworICAgIGlmICggSW5GaWdodCgpICl7CisgICAgICAgIHdyaXRlKCAiRGFzIGdlaHQgbmljaHQgbWl0dGVuIGltIEthbXBmLlxuIiApOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAoICFzdHIgKXsKKyAgICAgICAgU3RvcEh1bnRpbmdNb2RlKCk7CisgICAgICAgIHdyaXRlKCAiT2suXG4iICk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGlmICggIVN0b3BIdW50SUQoc3RyKSApCisgICAgICAgIHdyaXRlKCAiU28gamVtYW5kZW4gdmVyZm9sZ3N0IER1IG5pY2h0IVxuIiApOworCisgICAgcmV0dXJuIDE7Cit9CisKKy8qKiBTcGllbGVya29tbWFuZG8gZnVlcnMgZW1vdGVuICc6Jy4KKyAgKiBccGFyYW1baW5dIHN0ciBTcGllbGVyZWluZ2FiZQorICAqIFxwYXJhbVtpbl0gZ2VuaXRpdiBHZW5ldGl2ZmxhZworICAqIFxyZXR1cm4gMSBvZGVyIDAsIGZhbGxzIFNwaWVsZXIgbmljaHQgZW1vdGVuIGthbm4gKGtlaW4gQ0FOX0VNT1RFIEZsYWcgaW4KKyAgKiBQX0NBTl9GTEFHUykuCisgICovCitpbnQgZW1vdGUoc3RyaW5nIHN0cixpbnQgZ2VuaXRpdikKK3sKKyAgc3RyaW5nICpjb21tYW5kcyxtZXNzYWdlLHZlcmI7CisgIG9iamVjdCBsaXZpbmc7CisgIGludCBpLHNpemU7CisKKyAgaWYgKCEoUXVlcnkoUF9DQU5fRkxBR1MpJkNBTl9FTU9URSkpIHJldHVybiAwOworICBpZiAocXVlcnlfdmVyYigpWzBdPT0nOycpIGdlbml0aXY9MTsKKyAgaWYgKHF1ZXJ5X3ZlcmIoKVswXT09JzonfHxxdWVyeV92ZXJiKClbMF09PSc7JykKKyAgICB2ZXJiPXF1ZXJ5X3ZlcmIoKVsxLi5dKyIgIjsKKyAgZWxzZQorICAgIHZlcmI9IiI7CisgIHN0cj10aGlzX3BsYXllcigpLT5fdW5wYXJzZWRfYXJncygpOworICBjb21tYW5kcz1leHBsb2RlKHZlcmIrKHN0cnx8IiIpLCIjIik7CisgIG1lc3NhZ2U9YnJlYWtfc3RyaW5nKChJU19TRUVSKE1FKSA/ICIiIDogIj4iKQorICAgICAgICAgICAgICAgICAgICAgICArY2FwaXRhbGl6ZShnZW5pdGl2ID8gbmFtZShXRVNTRU4pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSgpKQorICAgICAgICAgICAgICAgICAgICAgICArIiAiK2NvbW1hbmRzWzBdLDc4KTsKKyAgc2l6ZT1zaXplb2YoY29tbWFuZHMpOworICBpZihzaXplPj0zKQorICB7CisgICAgbGl2aW5nPWZpbmRfbGl2aW5nKGxvd2VyX2Nhc2UoY29tbWFuZHNbMV0pKTsKKyAgICBpZighbGl2aW5nIHx8IGVudmlyb25tZW50KGxpdmluZykhPWVudmlyb25tZW50KCkgfHwKKyAgICAgICAobGl2aW5nLT5RdWVyeVByb3AoUF9JTlZJUykpICYmICFJU19MRUFSTkVSKE1FKSkKKyAgICB7CisgICAgICB3cml0ZShjYXBpdGFsaXplKGNvbW1hbmRzWzFdKSsiIHNlaGUgaWNoIGhpZXIgbmljaHQhXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZihsaXZpbmchPXRoaXNfb2JqZWN0KCkpCisgICAgICB0ZWxsX29iamVjdChsaXZpbmcsYnJlYWtfc3RyaW5nKChJU19TRUVSKHRoaXNfcGxheWVyKCkpID8gIiIgOiAiPiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArY2FwaXRhbGl6ZShnZW5pdGl2ID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfcGxheWVyKCktPm5hbWUoV0VTU0VOKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX3BsYXllcigpLT5uYW1lKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIiAiK2NvbW1hbmRzWzJdLDc4KSk7CisgIH0KKyAgaWYoc2l6ZT49NCkKKyAgICB3cml0ZShicmVha19zdHJpbmcoY29tbWFuZHNbM10sNzgpKTsKKyAgZWxzZQorICAgIHdyaXRlKG1lc3NhZ2UpOworICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSxtZXNzYWdlLCh7dGhpc19vYmplY3QoKSxsaXZpbmd9KSk7CisgIHJldHVybiAxOworfQorCisvKiogU3BpZWxlcmtvbW1hbmRvIGZ1ZXJzIHJlbW90ZW4gJ3I6Jy4KKyAgKiBccGFyYW1baW5dIHN0ciBTcGllbGVyZWluZ2FiZQorICAqIFxwYXJhbVtpbl0gZmxhZyBHZW5ldGl2ZmxhZworICAqIFxyZXR1cm4gMSBvZGVyIDAsIGZhbGxzIFNwaWVsZXIgbmljaHQgZW1vdGVuIGthbm4gKGtlaW4gQ0FOX1JFTU9URSBGbGFnIGluCisgICogUF9DQU5fRkxBR1MpLgorICAqLworc3RhdGljIGludCByZW1vdGUoc3RyaW5nIHN0ciwgaW50IGZsYWcpCit7CisgIGludCBtOworICBzdHJpbmcgdG1wLCBkZXN0OworICBzdHJpbmcgKmV4c3RyOworICBvYmplY3QgZGVzdHBsOworCisgIGlmICggIShRdWVyeShQX0NBTl9GTEFHUykgJiBDQU5fUkVNT1RFKSApCisgICAgICByZXR1cm4gMDsKKworICBpZiAoICEoc3RyPV91bnBhcnNlZF9hcmdzKCkpIHx8CisgICAgICAgc2l6ZW9mKCAoZXhzdHI9ZXhwbG9kZShzdHIsIiAiKSkgLSAoeyIifSkgKSA8PSAxICl7CisgICAgICB3cml0ZSgiV2FzIHdpbGxzdCBEdSB6dSB3ZW0gYGVtb3RlbmA/XG4iKTsKKyAgICAgIHJldHVybiAxOworICB9CisKKyAgZGVzdCA9IGxvd2VyX2Nhc2UoZXhzdHJbMF0pOworCisgIGlmKCAhKGRlc3RwbD1maW5kX3BsYXllciggZGVzdCApICkgfHwKKyAgICAgIChkZXN0cGwtPlF1ZXJ5UHJvcChQX0lOVklTKSAmJiAhSVNfTEVBUk5FUihNRSkpICl7CisgICAgd3JpdGUoIkVpbmVuIHNvbGNoZW4gU3BpZWxlciBnaWJ0IGVzIGRlcnplaXQgbmljaHQuXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHRtcCA9IGltcGxvZGUoIGV4c3RyWzEuLl0sICIgIiApOworCisgIHRtcCA9IHJlZ3JlcGxhY2UoIHRtcCwgIihefFteI10pIygkfFteI10pIiwgIlxcMWF1cyBkZXIgRmVybmVcXDIiLCAxICk7CisgIHRtcCA9IHJlZ3JlcGxhY2UoIHRtcCwgIihefFteXFxeXSlcXF4oJHxbXlxcXl0pIiwgIlxcMWluIGRlciBGZXJuZVxcMiIsIDEgKTsKKyAgdG1wID0gcmVncmVwbGFjZSggdG1wLCAiIyMiLCAiIyIsIDEgKTsKKyAgdG1wID0gcmVncmVwbGFjZSggdG1wLCAiXFxeXFxeIiwgIl4iLCAxICk7CisKKyAgaWYgKCBzdHJzdHIoIHRtcCwgImF1cyBkZXIgRmVybmUiICkgPT0gLTEKKyAgICAgICAmJiBzdHJzdHIoIHRtcCwgImluIGRlciBGZXJuZSIgKSA9PSAtMSApCisgICAgICB0bXAgKz0gIiBhdXMgZGVyIEZlcm5lIjsKKworICBpZiAoIFF1ZXJ5UHJvcChQX0lOVklTKSAmJiBJU19MRUFSTkVSKGRlc3RwbCkgKXsKKyAgICAgIHN0ciA9ICIoIiArIGNhcGl0YWxpemUoZ2V0dWlkKE1FKSk7CisgICAgICBpZiAoIGZsYWcgKQorICAgICAgICAgIHN0ciArPSBtZW1iZXIoICJzeHoiLCBzdHJbPDFdICkgPT0gLTEgPyAicyIgOiAiJyI7CisgICAgICBzdHIgKz0gIikiOworICB9CisgIGVsc2UKKyAgICAgIHN0ciA9IChmbGFnID8gY2FwaXRhbGl6ZShuYW1lKFdFU1NFTikpIDogY2FwaXRhbGl6ZShuYW1lKFdFUikpKTsKKworICBzdHIgKz0gIiAiICsgdG1wICsgKG1lbWJlciggIi4/ISIsIHRtcFs8MV0gKSA9PSAtMSA/ICIuIiA6ICIiKSArICJcbiI7CisKKyAgbSA9IGRlc3RwbC0+UmVjZWl2ZU1zZyhzdHIsIE1UX0NPTU18TVRfRkFSLCBNQV9FTU9URSwwLCBNRSk7CisgIHN3aXRjaChtKQorICB7CisgICAgY2FzZSBNU0dfREVMSVZFUkVEOgorICAgICAgX3JlY3YoZGVzdHBsLCBjYXBpdGFsaXplKGRlc3RwbC0+bmFtZSgpKSArICItPiIgKyBzdHIsIE1TR0ZMQUdfUkVNT1RFKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTVNHX0JVRkZFUkVEOgorICAgICAgd3JpdGUoIGNhcGl0YWxpemUoZGVzdHBsLT5uYW1lKFdFUikgKyAiIGlzdCBnZXJhZGUgYmVzY2hhZWZ0aWd0LlxuIikgKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTVNHX0lHTk9SRUQ6CisgICAgICB3cml0ZSggY2FwaXRhbGl6ZShkZXN0cGwtPm5hbWUoV0VSKSArICIgaWdub3JpZXJ0IERpY2guXG4iKSApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNU0dfVkVSQl9JR046CisgICAgY2FzZSBNU0dfTVVEX0lHTjoKKyAgICAgIHdyaXRlKCBjYXBpdGFsaXplKGRlc3RwbC0+bmFtZShXRVIpICsgIiBpZ25vcmllcnQgRGVpbmUgTWVsZHVuZy5cbiIpICk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgd3JpdGUoIGNhcGl0YWxpemUoZGVzdHBsLT5uYW1lKFdFUikgKyAiIGthbm4gRGljaCBnZXJhZGUgbmljaHQgIgorICAgICAgICAgICAgIndhaHJuZWhtZW4uXG4iKSApOworICB9CisgIHJldHVybiAxOworfQorCisvKiogU3BpZWxlcmtvbW1hbmRvIGZ1ZXJzIGVtb3RlbiBpbSBHZW5pdGl2ICc7Jy4KKyAgKiBSdWZ0IGVtb3RlKHN0cmluZyxpbnQpIGF1Zi4KKyAgKi8KK3N0YXRpYyBpbnQgZ2Vtb3RlKHN0cmluZyBzdHIpCit7CisgIHJldHVybiBlbW90ZShzdHIsIDEpOworfQorCisvKiogU3BpZWxlcmtvbW1hbmRvIGZ1ZXJzIHJlbW90ZW4gaW0gR2VuaXRpdiAncjsnLgorICAqIFJ1ZnQgcmVtb3RlKHN0cmluZywgaW50KSBhdWYuCisgICovCitzdGF0aWMgaW50IGdyZW1vdGUoc3RyaW5nIHN0cikKK3sKKyAgcmV0dXJuIHJlbW90ZShzdHIsIDEpOworfQorCitzdGF0aWMgdm9pZCBsb2FkX2F1dG9fb2JqZWN0cyhtYXBwaW5nIG1hcF9sZGZpZWQpOworCitwcml2YXRlIHZvaWQgSW5pdFBsYXllcigpOworcHJpdmF0ZSB2b2lkIEluaXRQbGF5ZXIyKCk7Citwcml2YXRlIHZvaWQgSW5pdFBsYXllcjMoKTsKKworLyoqIEdpYnQgZWluZSBadWZhbGxzemFobCB1bSBQX0FWRVJBR0VfU0laRSBoZXJ1bSB6dXJ1ZWNrLgorICAqIFxyZXR1cm4gWnVmYWVsbGlnZSBHcm9lc3NlLgorICAqLworcHJpdmF0ZSBpbnQgUmFuZG9tU2l6ZSgpCit7CisgIHJldHVybiAoMTAwK3JhbmRvbSgxMyktcmFuZG9tKDEzKStyYW5kb20oMTMpLXJhbmRvbSgxMykpKgorICAgIChRdWVyeVByb3AoUF9BVkVSQUdFX1NJWkUpfHwxNzApLzEwMDsKK30KKworLyoqIFNldHp0IGJlc3RpbW10ZSBQcm9wcyBpbSBTcGllbGVyLCBmYWxscyBkaWVzZSBuaWNodCBnZXNldHp0IHNpbmQgb2RlcgorICAqIGxvZXNjaHQgb2Jzb2xldGUgUHJvcHMuIFJlcGFyaWVydCBiZXN0aW1tdGUgRGF0ZW5zdHJ1a3R1cmVuIGltIFNwaWVsZXIuCisgICogV2lyZCB2b24gc3RhcnRfcGxheWVyKCkgbmFjaCBMYWRlbiBkZXMgU2F2ZWZpbGVzIGdlcnVmZW4uCisgICogTW9tZW50YW4gd2lyZCB6LkIuIGRpZSBHcm9lc3NlIGdlc2V0enQsIGZhbGxzIHNpZSBiaXNoZXIgMCBpc3QgdW5kIGRpZQorICAqIFNraWxscyBkZXMgU3BpZWxlcnMgaW5pdGlhbGlzaWVydCBiencuIHJlcGFyaWVydCBvZGVyIGF1ZiBkaWUgYWt0dWVsbHN0ZQorICAqIFZlcnNpb24gZGVzIFNraWxsc3lzdGVtcworICAqIFJ1ZnQgZ2dmLiBJbml0U2tpbGxzKCkgdW5kIEZpeFNraWxscygpLgorICAqIEBwYXJhbVtpbl0gbmV3ZmxhZyBHaWJ0IGFuLCBvYiBlcyBlaW4gbmV1ZXJzdGVsbHRlciBTcGllbGVyIGlzdC4KKyAgKiBAc2Egc3RhcnRfcGxheWVyKCksIEluaXRTa2lsbHMoKSwgRml4U2tpbGxzKCkKKyAgKi8KK3ByaXZhdGUgdm9pZCB1cGRhdGVzX2FmdGVyX3Jlc3RvcmUoaW50IG5ld2ZsYWcpIHsKKyAKKyAgLy8gU2VoZXIgZHVlcmZlbiBkaWUgRmx1Y2h0cmljaHR1bmcgdWViZXJtaXR0ZWxuIGxhc3Nlbi4KKyAgLy8gRWlnZW50bGljaCBrb2VubnRlIGVzIE1lcmxpbiBtYWNoZW4uIER1bW1lcndlaXNlIGdpYnQgZXMgamEgYXVjaCBhbHRlCisgIC8vIFNlaGVyIHVuZCBkYW5uIGthbm4gZXMgZ2xlaWNoZSBmdWVyIGFsbGUgaGllciBnZW1hY2h0IHdlcmRlbi4gKE9iIGRlcgorICAvLyBDb2RlIGplbWFscyByYXVza2Fubj8pCisgIC8vVE9ETzogSXJnZW5kd2FubiBhbGxlIFNlaGVyIGtvcnJpZ2llcmVuIHVuZCBDb2RlIG5hY2ggTWVybGluIHNjaGllYmVuLi4uCisgIGlmIChJU19TRUVSKE1FKSkKKyAgICBTZXRQcm9wKFBfQ0FOX0ZMQUdTLFF1ZXJ5UHJvcChQX0NBTl9GTEFHUykgfCBDQU5fUkVQT1JUX1dJTVBZX0RJUik7CisKKyAgLy8gZ2dmLiBJbnZpcy1FaWdlbnNjaGFmdCBhdXMgZGVtIExvZ2lub2JqZWt0IGFicnVmZW4gKEludmlzbG9naW4pLCBrb2VubnRlCisgIC8vIGphIGFuZGVycyBhbHMgYXVzIFNhdmVmaWxlIHNlaW4uIEdlc2V0enRlcyBQX0lOVklTIGF1cyBkaWVzZW0gYWJlcgorICAvLyBiZWliZWhhbHRlbi4KKyAgaWYgKElTX0xFQVJORVIoTUUpICYmICFRdWVyeVByb3AoUF9JTlZJUykKKy8vICAgICAgJiYgbG9hZF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSA9PSAiL3NlY3VyZS9sb2dpbiIKKyAgICAgICkKKyAgeworICAgIFNldFByb3AoUF9JTlZJUywgcHJldmlvdXNfb2JqZWN0KCktPnF1ZXJ5X2ludmlzKCkpOworICAgIGlmIChRdWVyeVByb3AoUF9JTlZJUykpCisgICAgICB0ZWxsX29iamVjdChNRSwgIkRVIEJJU1QgVU5TSUNIVEJBUiFcbiIgKTsKKyAgfQorICAiKiI6OnVwZGF0ZXNfYWZ0ZXJfcmVzdG9yZShuZXdmbGFnKTsKKworICBhdHRyaWJ1dGVzOjpVcGRhdGVBdHRyaWJ1dGVzKCk7CisKKyAgaW50IHNpemU9UXVlcnkoUF9TSVpFKTsKKyAgaWYgKCFzaXplKSBzaXplPVJhbmRvbVNpemUoKTsKKyAgd2hpbGUoc2l6ZT09UXVlcnlQcm9wKFBfQVZFUkFHRV9TSVpFKSkKKyAgICBzaXplPVJhbmRvbVNpemUoKTsKKyAgU2V0KFBfU0laRSxzaXplKTsKKworICAvLyBQcm9wIHdpcmQgbmljaHQgbWVociBnZW51dHp0LiBUT0RPOiBpcmdlbmR3YW5uIGVudGZlcm5lbi4KKyAgU2V0KFBfU0VDT05EX0xJU1QsIFNBVkUsIEZfTU9ERV9BRCk7CisgIFNldChQX1NFQ09ORF9MSVNULCAwLCBGX1ZBTFVFKTsKK30KKworCisvKiogU2V0enQgZGVuIEhDLU1vZHVzLgorICAqLwordmFyYXJncyBub21hc2sgdm9pZCBzZXRfaGNfcGxheShzdHJpbmcgc3RyLGludCB2YWwpCit7CisgICBzdHJpbmcgc3RyMTsKKworICAgIHN0cjEgPSBleHBsb2RlKCBvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSksICIjIiApWzBdOworICAgIAorICAgIGlmICggc3RyMSAhPSAiL3NlY3VyZS9sb2dpbiIgJiYKKyAgICAgICAgIHByZXZpb3VzX29iamVjdCgpIT10aGlzX29iamVjdCgpICYmCisgICAgICAgICBleHRlcm5fY2FsbCgpICYmCisgICAgICAgICAoIWdldGV1aWQoTUUpIHx8IGdldGV1aWQoTUUpICE9IGdldHVpZChNRSkgfHwKKyAgICAgICAgICBjYXBpdGFsaXplKGdldGV1aWQoTUUpKSAhPSBzdHIgfHwKKyAgICAgICAgICBnZXRldWlkKE1FKSAhPSBnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSkgKXsKKyAgICAgICAgd3JpdGUoICJESUVTRVIgVkVSU1VDSCBXQVIgSUxMRUdBTCAhIVxuIiApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIGhjX3BsYXk9dmFsOworfQorCisvKiogZ2lidCBkZW4gSEMtTW9kdXMgenVydWVjay4KKyAgKi8KK25vbWFzayBpbnQgcXVlcnlfaGNfcGxheSgpCit7CisgIHJldHVybiBoY19wbGF5OworfQorCisvKiogSW5pdGlhbGlzaWVydCB1bmQgYWt0aXZpZXJ0IGRhcyBTcGllbGVyb2JqZWt0LgorICAqIEthbm4gbnVyIHZvbiAvc2VjdXJlL2xvZ2luIG9kZXIgL3NlY3VyZS9tYXN0ZXIgZ2VydWZlbiB3ZXJkZW4uCisgICogU3RhcnRldCBUZWxuZXQgTmVnb3RpYXRpb24sIGxhZWR0IFNhdmVmaWxlLCBzZXR6dCBlaW5pZ2UgUHJvcHMuIAorICAqIFJ1ZnQgdXBkYXRlc19hZnRlcl9yZXN0b3JlKCksIHVtIGRpdi4gRGF0ZW4genUgYWt0dWFsaXNpZXJlbi9yZXBhcmllcmVuLgorICAqIFJ1ZnQgY3JlYXRlKCkgYXVzIC9zdGQvcGxheWVyL3BvdGlvbi5jLgorICAqIEJlaSBuZXVlbSBTcGllbGVyIHdpcmQgZGVyIGVudHNwcmVjaGVuZGUgRXZlbnQgYXVzZ2Vsb2VzdCBkaWUgQXR0cmlidXRlCisgICogYXVmIGRpZSBTdGFydHdlcnRlIGdlc2V0enQuCisgICogUHJ1ZWZ0IFp3ZWl0aWVtYXJraWVydW5nZW4uCisgICogUnVmdCBJbml0UGxheWVyKCkuCisgICogQHBhcmFtW2luXSBzdHIgTmFtZSBkZXMgQ2hhcmFrdGVycywgZGVyIGdlbGFkZW4gd2VyZGVuIHNvbGwuCisgICogQHBhcmFtW2luXSBpcCB0ZXh0dWVsbGUgUmVwcmFlc2VudGF0aW9uIGRlciBJUC1BZHJlc3NlIGRlcyBTcGllbGVycy4KKyAgKiBAcmV0dXJuIDEgYmVpIEVyZm9sZywgMCBzb25zdC4KKyAgKiBAdG9kbyBEaXYuIFJlcGFyYXR1cmVuL1VwZGF0ZXMgbmFjaCB1cGRhdGVzX2FmdGVyX3Jlc3RvcmUoKSBhdXNsYWdlcm4uCisgICovCit2YXJhcmdzIG5vbWFzayBpbnQgc3RhcnRfcGxheWVyKCBzdHJpbmcgc3RyLCBzdHJpbmcgaXAgKQoreworICAgIG1peGVkIHNlY29uZDsKKyAgICBpbnQgbmV3ZmxhZzsgIC8qIGNvdWxkIHBsYXllciBiZSByZXN0b3JlZD8gKi8KKyAgICBzdHJpbmcgc3RyMTsKKworICAgIGNhbGxfb3V0KCAiZGlzY29ubmVjdCIsIDYwMCApOworCisgICAgc3RyMSA9IGV4cGxvZGUoIG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSwgIiMiIClbMF07CisKKyAgICBpZiAoIHN0cjEgIT0gIi9zZWN1cmUvbG9naW4iICYmCisgICAgICAgICBzdHIxICE9ICIvc2VjdXJlL21hc3RlciIgJiYKKyAgICAgICAgICghZ2V0ZXVpZChNRSkgfHwgZ2V0ZXVpZChNRSkgIT0gZ2V0dWlkKE1FKSB8fAorICAgICAgICAgIGNhcGl0YWxpemUoZ2V0ZXVpZChNRSkpICE9IHN0ciB8fAorICAgICAgICAgIGdldGV1aWQoTUUpICE9IGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpKSApeworICAgICAgICB3cml0ZSggIkRJRVNFUiBWRVJTVUNIIFdBUiBJTExFR0FMICEhXG4iICk7CisgICAgICAgIGRlc3RydWN0KE1FKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogdHJ5IHRvIHJlc3RvcmUgcGxheWVyLiBJZiBpdCBkb2Vzbid0IGV4aXN0LCBzZXQgdGhlIG5ldyBmbGFnICovCisgICAgbmV3ZmxhZyA9ICFyZXN0b3JlX29iamVjdCggIi8iICsgU0FWRVBBVEggKyBsb3dlcl9jYXNlKHN0cilbMC4uMF0gKyAiLyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArbG93ZXJfY2FzZShzdHIpICk7CisKKyAgICB1cGRhdGVzX2FmdGVyX3Jlc3RvcmUobmV3ZmxhZyk7CisKKyAgIGlmICggcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShNRSkgKQorICAgIHsKKyAgICAgIC8vIFRlbG5ldC1OZWdvdGlhdGlvbnMgZHVyY2hmdWVocmVuLCBhYmVyIG51ciBkaWUgZ3J1bmRsZWdlbmRlbiBhdXMKKyAgICAgIC8vIHRlbG5ldG5lZy4gQWxsZSBhbmRlcmVuIHNvbGx0ZW4gZXJzdCBzcGFldGVyLCBuYWNoIHZvbGxzdGFlbmRpZ2VyCisgICAgICAvLyBJbml0aWFsaXNpZXJ1bmcgZ2VtYWNodCB3ZXJkZW4uCisgICAgICAgIHRlbG5ldG5lZzo6c3RhcnR1cF90ZWxuZXRfbmVncygpOworICAgICAgICBtb2RpZnlfcHJvbXB0KCk7CisgICAgICAgIFNldCggUF9MQVNUX0xPR0lOLCB0aW1lKCkgKTsKKyAgICB9CisKKyAgICBTZXQoIFBfV0FOVFNfVE9fTEVBUk4sIDEgKTsgLy8gMSBzb2xsdGUgZGVyIGRlZmF1bHQgc2VpbiAhISEKKyAgICBTZXQoIFBfV0FOVFNfVE9fTEVBUk4sIFBST1RFQ1RFRCwgRl9NT0RFX0FTICk7CisgICAgLy8gRWluZ2VmdWVndCAxOC4xMS45OSwga2FubiBuYWNoIGVpbmVtIEphaHIgd2llZGVyIHJhdXM6CisgICAgU2V0KCBQX1RFU1RQTEFZRVIsIFBST1RFQ1RFRCwgRl9NT0RFX0FTICk7CisKKyAgICBpZiAoIElTX0xFQVJORVIoTUUpICkKKyAgICAgICAgU2V0UHJvcCggUF9DQU5fRkxBR1MsIFF1ZXJ5UHJvcChQX0NBTl9GTEFHUyl8Q0FOX1JFTU9URSApOworCisgICAgU2V0KCBQX05BTUUsIHN0ciApOworICAgIFNldCggUF9OQU1FLCBTRUNVUkVELCBGX01PREVfQVMgKTsKKworICAgIGlmICggIVF1ZXJ5UHJvcChQX05FRURFRF9RUCkgKQorICAgICAgICBTZXRQcm9wKCBQX05FRURFRF9RUCwgUkVRX1FQICk7CisKKyAgICBTZXQoIFBfTkVFREVEX1FQLCBOT1NFVE1FVEhPRCwgRl9TRVRfTUVUSE9EICk7CisgICAgU2V0KCBQX05FRURFRF9RUCwgU0FWRXxTRUNVUkVELCBGX01PREVfQVMgKTsKKworICAgIC8qIGF1dG9zYXZlIHRoZSBwbGF5ZXIgYWZ0ZXIgNTAwIGhlYXJ0YmVhdHMgKi8KKyAgICB0aW1lX3RvX3NhdmUgPSBhZ2UgKyA1MDA7CisgICAgcG90aW9uOjpjcmVhdGUoKTsgLyogRE8gSVQgSEVSRSBBRlRFUiBUSEUgUkVTVE9SRSAhISAqLworCisgICAgQWRkSWQoIGdldHVpZCgpICk7CisgICAgU2V0UHJvcCggUF9BQywgMCApOworICAgIFNldFByb3AoIFBfV0VBUE9OLCAwICk7CisKKyAgICAvKiBTZXQgc29tZSB0aGluZ3Mgd2hpY2ggd29udCBiZSBzZXQgd2hlbiBhbGwgaXMgT0sgKi8KKyAgICBTZXRQcm9wKCBQX01BWF9IUCwgKFF1ZXJ5QXR0cmlidXRlKEFfQ09OKSAqIDggKyA0MiApKTsKKyAgICBTZXRQcm9wKCBQX01BWF9TUCwgKFF1ZXJ5QXR0cmlidXRlKEFfSU5UKSAqIDggKyA0MiApKTsKKworICAgIGNhdGNoKCBiYiA9ICIvc2VjdXJlL2JibWFzdGVyIi0+cXVlcnlfYmIoKSApOworCisgICAgLyogSWYgdGhpcyBpcyBhIG5ldyBjaGFyYWN0ZXIsIHdlIGNhbGwgdGhlIGFkdmVudHVyZXJzIGd1aWxkIHRvIGdldAorICAgICAqIG91ciBmaXJzdCB0aXRsZSAhCisgICAgICovCisgICAgaWYgKCBuZXdmbGFnICkgeworICAgICAgICBpZiAoIFF1ZXJ5R3Vlc3QoKSkKKyAgICAgICAgICAgIFNldFByb3AoIFBfVElUTEUsICJ1ZWJlcmtvbW10IGRhcyAiTVVETkFNRSIgLi4uIiApOworCisgICAgICAgIFNldCggUF9MRVZFTCwgLTEgKTsKKyAgICAgICAgU2V0UHJvcCggUF9BVFRSSUJVVEVTLCAoWyBBX1NUUjoxLCBBX0NPTjoxLCBBX0lOVDoxLCBBX0RFWDoxIF0pICk7CisgICAgICAgIFNldFByb3AoIFBfSFAsIFF1ZXJ5UHJvcChQX01BWF9IUCkgKTsKKworICAgICAgICAvLyBFdmVudCBhdXNsb2VzZW4KKyAgICAgICAgRVZFTlRELT5UcmlnZ2VyRXZlbnQoRVZUX0xJQl9QTEFZRVJfQ1JFQVRJT04sIChbCisgICAgICAgICAgICAgIEVfT0JKRUNUOiBNRSwKKyAgICAgICAgICAgICAgRV9QTE5BTUU6IGdldHVpZChNRSkgXSkgKTsKKyAgICB9CisgICAgCisgICAgSW5pdFBsYXllcigpOworCisgICAgLy8gUGFkcmVpYyAwMS4wMi4xOTk5CisgICAgaWYgKCAhSVNfTEVBUk5FUihNRSkgJiYgc2Vjb25kID0gUXVlcnlQcm9wKFBfU0VDT05EKSApIHsKKyAgICAgICAgaWYgKCBzdHJpbmdwKHNlY29uZCkgJiYgbG93ZXJfY2FzZShzZWNvbmQpWzAuLjNdID09ICJ2b24gIiApIHsKKyAgICAgICAgICAgIHNlY29uZCA9IGxvd2VyX2Nhc2Uoc2Vjb25kWzQuLl0pOworICAgICAgICAgICAgU2V0UHJvcCggUF9TRUNPTkQsIHNlY29uZCApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCAhc3RyaW5ncChzZWNvbmQgKSB8fAorICAgICAgICAgICAgIGZpbGVfc2l6ZSggIi9zYXZlLyIgKyBzZWNvbmRbMC4uMF0gKyAiLyIgKyBzZWNvbmQgKyAiLm8iICkgPD0gMCApeworICAgICAgICAgICAgaWYgKCBzdHJpbmdwKHNlY29uZCkgJiYKKyAgICAgICAgICAgICAgICAgZmlsZV9zaXplKCAiL3NhdmUvIiArIGxvd2VyX2Nhc2Uoc2Vjb25kWzAuLjBdKSArICIvIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXJfY2FzZShzZWNvbmQpICsgIi5vIiApID4wICl7CisgICAgICAgICAgICAgICAgU2V0UHJvcCggUF9TRUNPTkQsIGxvd2VyX2Nhc2Uoc2Vjb25kKSApOworICAgICAgICAgICAgICAgIGxvZ19maWxlKCAiV1JPTkdfU0VDT05EIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggIiVzOiAlczogUF9TRUNPTkQgPSAlTyAtPiBBdXRvbWF0aXNjaCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrb3JyaWdpZXJ0LFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHRpbWUodGltZSgpKSwgb2JqZWN0X25hbWUoKSwgc2Vjb25kICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHRlbGxfb2JqZWN0KCBNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIipcbipcbiogRGVpbmUgWndlaXRpZW1hcmtpZXJ1bmcgaXN0IHVuZ3VlbHRpZywgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYml0dGUgYWVuZGVyZSBkaWVzZSB1bmQgc3ByaWNoIGltXG4qIFp3ZWlmZWwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYml0dGUgZWluZW4gRXJ6bWFnaWVyIGFuLlxuKlxuKlxuIiApOworCisgICAgICAgICAgICAgICAgbG9nX2ZpbGUoICJXUk9OR19TRUNPTkQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCAiJXM6ICVzOiBQX1NFQ09ORCA9ICVPXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdGltZSh0aW1lKCkpLCBvYmplY3RfbmFtZSgpLCBzZWNvbmQgKSApOworICAgICAgICAgICAgICAgIC8vIGVpbiBiaXNzY2hlbiBkZXV0bGljaGVyIGF1ZmZvcmRlcm4uLiBQYWRyZWljIDA4LjA0LjE5OTkKKyAgICAgICAgICAgICAgICBtb3ZlKCAiL2QvZ2ViaXJnZS9yb29tL3p3YWZmbGFkIiwgTV9HTyApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybigwKTsKK30KKworLyoqIExldHp0ZSBQaGFzZSBkZXIgU3BpZWxlcmluaXRpYWxpc2llcnVuZyBiZWltIExhZGVuIGRlcyBDaGFyYWt0ZXJzLgorICAqIFJ1ZnQgZW5hYmxlX2NvbW1hbmRzKCksIGFrdGl2aWVydCBkZW4gSGVhcnRiZWF0IHVuZCBha3RpdmllcnQgZGllCisgICogS29tbWFuZG9zIGF1cyBkZW4gZ2VlcmJ0ZW4gY29tbWFuZC5jLCBwdXRfYW5kX2dldC5jLCB0ZWFtLmMsIHNvdWwuYywKKyAgKiBndWlkZS5jLCBzZXR6dCBkZW4gTGl2aW5nIE5hbWUuCisgICogUmVnaXN0cmllcnQgVXNlU3BlbGwoKSBhbHMgQ2F0Y2hhbGwtS29tbWFuZG8uCisgICogTGFlc3N0IGRlbiBTcGllbGVyIGdnZi4gZWluZW4gTGV2ZWwgcGVyIC9zdGQvZ2lsZGUgYXVmc3RlaWdlbiwgcnVmdAorICAqIGNhbGxfbm90aWZ5X3BsYXllcl9jaGFuZ2UoKSwgbG9lc3QgTG9naW4tRXZlbnQgYXVzLgorICAqIEdpYnQgV2lsbGtvbW1lbnN0ZXh0ZSwgTmV3cyB1bmQgbmV1ZSBNYWlscyBhdXMuCisgICogRmluZGV0IGRlbiBTdGFydHJhdW0gdW5kIGJld2VndCBkZW4gU3BpZWxlciBkb3J0aGluLgorICAqIFJ1ZnQgRmluYWxTZXR1cCgpIChhdXMgZGVuIFJhc3NlbnNoZWxscykuCisgICogQmVncmVuenQgR2VsZG1lbmdlIGltIFNwaWVsZXIgKHdlZ2VuIEJhbmt6d2VpdGllcykgbmFjaCBUcmFna3JhZnQgdW5kCisgICogZXJzdGF0dGV0IEdlbGQgYmVpIFJlYm9vdC4KKyAgKiBSdWZ0IHNldF9pc193aXphcmQoKS4KKyAgKiBTdGFydGV0IENsb25lbiBkZXIgQXV0b2xvYWRlci4KKyAgKiBAc2EgSW5pdFBsYXllcjMoKSxJbml0UGxheWVyMigpLCBJbml0UGxheWVyKCksIHN0YXJ0X3BsYXllcigpLgorICAqLworcHJpdmF0ZSB2b2lkIEluaXRQbGF5ZXI0KCkKK3sKKyAgICBpbnQgbnVtLCBzdHIsIHNraTsKKyAgICBzdHJpbmcgZXJyLCBjYWxsZWRfZnJvbV9pcDsKKyAgICBtaXhlZCBzdGFydF9wbGFjZTsKKyAgICBvYmplY3QgbW9uOworCisgICAgZW5hYmxlX2NvbW1hbmRzKCk7CisgICAgc2V0X2hlYXJ0X2JlYXQoMSk7CisgICAgY29tbWFuZDo6aW5pdGlhbGl6ZSgpOworICAgIGFkZF9wdXRfYW5kX2dldF9jb21tYW5kcygpOworICAgIGFkZF90ZWFtX2NvbW1hbmRzKCk7CisgICAgYWRkX3NvdWxfY29tbWFuZHMoKTsKKyAgICBhZGRfZ3VpZGVfY29tbWFuZHMoKTsKKyAgICBhZGRfYWN0aW9uKCAiVXNlU3BlbGwiLCAiIiwgMSApOworICAgIHNldF9saXZpbmdfbmFtZSggZ2V0dWlkKCkgKTsKKyAgICB3aGlsZSAoIHJlbW92ZV9jYWxsX291dCgiZGlzY29ubmVjdCIpICE9IC0xICkKKyAgICAgICAgOworCisgICAgaWYgKCBRdWVyeVByb3AoUF9MRVZFTCkgPT0gLTEgKQorICAgIHsKKyAgICAgICAgY2F0Y2goICIvc3RkL2dpbGRlIi0+dHJ5X3BsYXllcl9hZHZhbmNlKHRoaXNfb2JqZWN0KCkpIDtwdWJsaXNoICk7CisgICAgfQorCisgICAgaWYgKCBpbnRlcmFjdGl2ZShNRSkgKQorICAgICAgICBjYWxsX25vdGlmeV9wbGF5ZXJfY2hhbmdlKDEpOworCisgICAgaWYgKCBpbnRlcmFjdGl2ZSh0aGlzX29iamVjdCgpKSApIHsKKyAgICAgICAgY2F0KCAiL2V0Yy9ORVdTIiApOworCisgICAgICAgIE5ld2JpZUludHJvTXNnKCk7CisKKyAgICAgICAgaWYgKCBRdWVyeVByb3AoUF9JTlZJUykgJiYgIUlTX1dJWkFSRChNRSkgKQorICAgICAgICAgICAgU2V0UHJvcCggUF9JTlZJUywgMCApOworCisgICAgICAgIGNhdGNoKCBudW0gPSAic2VjdXJlL21haWxlciItPkZpbmdlck1haWwoZ2V0dWlkKCkpO3B1Ymxpc2ggKTsKKworICAgICAgICBpZiAoIG51bSApCisgICAgICAgICAgICB3cml0ZSggIkR1IGhhc3QgIiArIG51bSArICIgbmV1ZSIgKworICAgICAgICAgICAgICAgICAgIChudW0gPT0gMSA/ICJuIEJyaWVmIiA6ICIgQnJpZWZlIikrIiBpbSBQb3N0YW10IGxpZWdlbi5cbiIgKTsKKworICAgICAgICBjYXRjaCggUmVnaXN0ZXJDaGFubmVscygpO3B1Ymxpc2ggKTsKKworICAgICAgICBpZiAoIChjYWxsZWRfZnJvbV9pcCA9IFF1ZXJ5KFBfQ0FMTEVEX0ZST01fSVApKSAmJgorICAgICAgICAgICAgIHF1ZXJ5X2lwX251bWJlcihNRSkgIT0gY2FsbGVkX2Zyb21faXAgKXsKKyAgICAgICAgICAgIHN0cmluZyB0bXA7CisKKyAgICAgICAgICAgIGlmICggc3RyaW5ncCh0bXAgPSBxdWVyeV9pcF9uYW1lKGNhbGxlZF9mcm9tX2lwKSkgJiYKKyAgICAgICAgICAgICAgICAgdG1wICE9IGNhbGxlZF9mcm9tX2lwICkKKyAgICAgICAgICAgICAgICB0bXAgPSAiIFsiICsgdG1wICsgIl0iOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRtcCA9ICIiOworCisgICAgICAgICAgICB3cml0ZSggIkRhcyBsZXR6dGUgTWFsIGthbXN0IER1IHZvbiAiICsgY2FsbGVkX2Zyb21faXAKKyAgICAgICAgICAgICAgICAgICArIHRtcCArICIuXG4iICk7CisgICAgICAgIH0KKworICAgICAgICBTZXQoIFBfQ0FMTEVEX0ZST01fSVAsIHF1ZXJ5X2lwX251bWJlcihNRSkgKTsKKyAgICB9CisKKyAgICBpZiAoICFzdHJpbmdwKGRlZmF1bHRfaG9tZSkgfHwgZGVmYXVsdF9ob21lID09ICIiICkKKyAgICAgICAgZGVmYXVsdF9ob21lID0gIi9naWxkZW4vYWJlbnRldXJlciI7CisKKyAgICBpZiAoIElTX1NFRVIoTUUpICYmICFJU19MRUFSTkVSKE1FKSApCisgICAgICAgIGNhdGNoKCBzdGFydF9wbGFjZSA9IEhBVVNWRVJXQUxURVItPkZpbmRlSGF1cyhnZXR1aWQoTUUpKTtwdWJsaXNoICk7CisgICAgLy8gd2VubiBkZXIgU3BpZWxlciBub2NoIGdhbnogZnJpc2NoIGlzdCB1bmQgbm9jaCB3ZW5pZyAgU3R1ZmVucHVua3RlCisgICAgLy8gZ2VrcmllZ3QgaGF0IHVuZCBkYXMgVHV0b3JpYWwgbm9jaCBuaWNodCBnZW1hY2h0IGhhdCwgc3RhcnRldCBlciBpbQorICAgIC8vIFR1dG9yaWFsLgorICAgIGVsc2UgaWYgKFF1ZXJ5UHJvcChQX0xFUCkgPD0gMTIwCisgICAgICAgICAgICAgJiYgUU0tPkhhc01pbmlRdWVzdCh0aGlzX29iamVjdCgpLAorICAgICAgICAgICAgICAgIi9kL2FuZmFlbmdlci9lbm5veC90dXRvcmlhbC9ucGNzL3ZlcmthZXVmZXIiKSAhPSAxKQorICAgICAgICBzdGFydF9wbGFjZSA9ICIvcm9vbS93ZWxjb21lLyIrIGdldHVpZCh0aGlzX29iamVjdCgpKTsKKyAgICBlbHNlCisgICAgICAgIHN0YXJ0X3BsYWNlID0gMDsKKworICAgIGlmICggIXN0YXJ0X3BsYWNlICkKKyAgICAgICAgc3RhcnRfcGxhY2UgPSBRdWVyeVByb3AoUF9TVEFSVF9IT01FKTsKKworICAgIGlmKCBvYmplY3RwKHN0YXJ0X3BsYWNlKSB8fCAoc3RyaW5ncChzdGFydF9wbGFjZSkgJiYgc3RhcnRfcGxhY2UgIT0gIiIgKSApeworICAgICAgICBpZiAoKGVyciA9IGNhdGNoKG1vdmUoIHN0YXJ0X3BsYWNlLCBNX0dPfE1fU0lMRU5UfE1fTk9fU0hPVyApO3B1Ymxpc2gpKSAKKyAgICAgICAgICAgIHx8ICFlbnZpcm9ubWVudCgpICkKKyAgICAgICAgICAgIGVyciA9IGNhdGNoKG1vdmUoIGRlZmF1bHRfaG9tZSwgTV9HT3xNX1NJTEVOVHxNX05PX1NIT1cgKTtwdWJsaXNoKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBlcnIgPSBjYXRjaChtb3ZlKCBkZWZhdWx0X2hvbWUsIE1fR098TV9TSUxFTlR8TV9OT19TSE9XICk7cHVibGlzaCk7CisKKyAgICBpZiAoIGVyciApCisgICAgICAgIGNhdGNoKG1vdmUoICIvZ2lsZGVuL2FiZW50ZXVyZXIiLCBNX0dPfE1fU0lMRU5UfE1fTk9fU0hPVyApO3B1Ymxpc2gpOworCisgICAgLy8gRGllIFNoZWxsIG11c3MgRmluYWxTZXR1cCgpIG5pY2h0IGltcGxlbWVudGllcmVuLiBEYWhlciBDYWxsb3RoZXIKKyAgICBjYXRjaCggTUUtPkZpbmFsU2V0dXAoKTtwdWJsaXNoICk7CisKKyAgICAvLyBMb2dpbi1ldmVudCBhdXNsb2VzZW4KKyAgICBFVkVOVEQtPlRyaWdnZXJFdmVudChFVlRfTElCX0xPR0lOLCAoWworICAgICAgICAgIEVfT0JKRUNUOiBNRSwKKyAgICAgICAgICBFX1BMTkFNRTogZ2V0dWlkKE1FKSwKKyAgICAgICAgICBFX0VOVklST05NRU5UOiBlbnZpcm9ubWVudCgpIF0pICk7CisKKyAgICAvLyBlcnN0IGpldHp0IEdNQ1AgZnJlaWdlYmVuIHVuZCB6dSB2ZXJoYW5kZWxuLgorICAgIGdtY3A6OnN0YXJ0dXBfdGVsbmV0X25lZ3MoKTsKKworICAgIC8vIFNjaG9ubWFsIHNpY2hlcm4sIGZhbGxzIGVpbiBCdWcgKEV2YWxjb3N0Li4uKSBkYXp3aXNjaGVuIGtvbW1lbiBzb2xsdGUuCisgICAgYXV0b2xvYWRfcmVzdCA9IGF1dG9sb2FkOworCisgICAgLy8gVW0gR2VsZC1YdGllcyBtaXQgaWxsZWdhbCB2aWVsIEdlbGQgenUgdmVybWVpZGVuLCBrb21tdCBlaW4gQ2hlY2s6CisgICAgaWYgKCAhSVNfTEVBUk5FUihNRSkgJiYgIVF1ZXJ5KFBfVEVTVFBMQVlFUikgJiYKKyAgICAgICAgIG1vbiA9IHByZXNlbnQoICJcbmdlbGQiLCBNRSApICl7CisgICAgICAgIC8vIG1heGltYWxlIEtyYWZ0LCBkaWUgZGVyIFNwaWVsZXIgaGFldHRlIGhhYmVuIGtvZW5uZW4KKyAgICAgICAgc3RyID0gUXVlcnlBdHRyaWJ1dGUoQV9TVFIpICsgNDsKKyAgICAgICAgaWYgKCBRdWVyeShQX0ZST0cpICkKKyAgICAgICAgICAgIHN0ciArPSAzMDsKKyAgICAgICAgaWYgKCBzdHIgPCAxICkKKyAgICAgICAgICAgIHN0ciA9IFF1ZXJ5UmVhbEF0dHJpYnV0ZShBX1NUUikgKyA0OworICAgICAgICBpZiAoIHN0ciA+IDMwICkKKyAgICAgICAgICAgIHN0ciA9IDMwOworCisgICAgICAgIC8vIFRyYWdlc2tpbGwgYmVhY2h0ZW4KKyAgICAgICAgc2tpID0gdG9faW50KFVzZVNraWxsKCBTS19DQVJSWSwgKFtTSV9TS0lMTEFSRyA6IHN0ciBdKSApKTsKKyAgICAgICAgaWYgKCAhaW50cChza2kpICkKKyAgICAgICAgICAgIHNraSA9IDA7CisKKyAgICAgICAgLy8gV2lldmllbCBrb25udGUgZGVyIFNwaWVsZXIgaW5zZ2VzYW10IG1heGltYWwgdHJhZ2VuPworICAgICAgICBudW0gPSA5MjAwICsgc3RyICogODAwICsgc2tpOworICAgICAgICBpZiAoIG51bSA8IDMwMDAgKQorICAgICAgICAgICAgbnVtID0gMzAwMDsKKworICAgICAgICAvLyBWZXJkb3BwZWxuIGZ1ZXIgZWluZW4gZ3V0ZW4gQ29udGFpbmVyIHVuZCBub2NobWFsIDIwJSBkcmF1ZnNjaGxhZ2VuCisgICAgICAgIC8vIHp1ciBTaWNoZXJoZWl0LiBEYXMgR2FuemUgZGFuYWNoICo0LCB1bSBkaWUgbWF4aW1hbGUgQW56YWhsIE11ZW56ZW4KKyAgICAgICAgLy8genUgZXJoYWx0ZW4uCisgICAgICAgIG51bSA9IChpbnQpIChudW0gKiA4LjgpOworCisgICAgICAgIC8vIEdlbGQsIGRhcyB6dXZpZWwgaXN0LCBhdWYgZGVuIE1heGltYWx3ZXJ0IGt1ZXJ6ZW4uCisgICAgICAgIC8vIFp1ciBTaWNoZXJoZWl0IHdpcmQgbWl0Z2Vsb2dndC4gRmFsbHMgZWluIFNwaWVsZXIgc2ljaCAoenUgcmVjaHQpCisgICAgICAgIC8vIGJlc2Nod2VydCwga2FubiBtYW4gaW1tZXIgbm9jaCB3aWVkZXIgZGllIFN1bW1lIGtvcnJpZ2llcmVuIDstKQorICAgICAgICBpZiAoIChzdHIgPSBtb24tPlF1ZXJ5UHJvcChQX0FNT1VOVCkpID4gbnVtICl7CisgICAgICAgICAgICBtb24tPlNldFByb3AoIFBfQU1PVU5ULCBudW0gKTsKKyAgICAgICAgICAgIGxvZ19maWxlKCAiWlVWSUVMX0dFTEQiLCBzcHJpbnRmKCAiJXM6ICVzIGhhdHRlICVkIE11ZW56ZW4gYmVpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2ljaC4gS29ycmlnaWVydCBhdWYgJWQuXG4gIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdGltZSh0aW1lKCkpWzQuLl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoTUUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIsIG51bSApICk7CisgICAgICAgIH0KKyAgICB9CisgICAgaW50IGVudHNjaGFlZGlndW5nID0gUXVlcnlQcm9wKFBfQ0FSUklFRF9WQUxVRSk7CisgICAgaWYgKCBlbnRzY2hhZWRpZ3VuZyA+IDAgKQorICAgIHsKKyAgICAgICAgd3JpdGUoICJEdSBmaW5kZXN0ICIgKyBlbnRzY2hhZWRpZ3VuZyArCisgICAgICAgICAgICAgICAiIE11ZW56ZW4sIGRpZSBEdSBiZWltIGxldHp0ZW4gTWFsIHZlcmxvcmVuIGhhc3QuXG4iICk7CisKKyAgICAgICAgaWYgKCBNYXlBZGRXZWlnaHQoIGVudHNjaGFlZGlndW5nIC8gNCApICl7CisgICAgICAgICAgICB3cml0ZSggIldlaWwgRHUgbmljaHQgbWVociBzb3ZpZWwgdHJhZ2VuIGthbm5zdCwgc3BlbmRlc3QgRHUgZGVuICIrCisgICAgICAgICAgICAgICAgICAgIlJlc3QgZGVyIFplbnRyYWxiYW5rLlxuIiApOworCisgICAgICAgICAgICBudW0gPSAoUXVlcnlQcm9wKFBfTUFYX1dFSUdIVCkgLSBxdWVyeV93ZWlnaHRfY29udGVudHMoKSkgKiA0OworICAgICAgICAgICAgZW50c2NoYWVkaWd1bmcgPSAobnVtIDwgMCkgPyAwIDogbnVtOworICAgICAgICB9CisKKyAgICAgICAgQWRkTW9uZXkoIGVudHNjaGFlZGlndW5nICk7CisgICAgICAgIFNldFByb3AoUF9DQVJSSUVEX1ZBTFVFLDApOworICAgIH0KKworICAgIGlmICggIVF1ZXJ5UHJvcChQX0lOVklTKSApCisgICAgICAgIHNheSggY2FwaXRhbGl6ZShuYW1lKFdFUikpICsgIiBiZXRyaXR0IGRpZXNlIFdlbHQuXG4iICk7CisgICAgZWxzZQorICAgICAgICB3cml0ZSggIkRVIEJJU1QgVU5TSUNIVEJBUiFcblxuIiApOworI2lmIF9fRUZVTl9ERUZJTkVEX18oc2V0X2lzX3dpemFyZCkKKyAgICBpZiAoIElTX1dJWkFSRChnZXR1aWQoTUUpKSApCisgICAgICAgIHNldF9pc193aXphcmQoIE1FLCAxICk7CisgICAgZWxzZQorICAgICAgICBzZXRfaXNfd2l6YXJkKCBNRSwgMCApOworI2VuZGlmCisgICAgaWYgKCBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKE1FKSApCisgICAgICAgIExpc3RBd2FpdGVkKCk7CisKKyAgICAvLyBBdXRvbG9hZGVyIHdlcmRlbiBnYW56IHp1bSBTY2hsdXNzIGdlY2xvbnQsIGRhIGRhcyBiaXMgenVtIGJpdHRlcmVuCisgICAgLy8gKEV2YWxjb3N0LSlFbmRlIGdlc2NoaWVodCB1bmQgZGFuYWNoIHUuVS4ga2VpbmUgUmVjaGVuemVpdCBmdWVyCisgICAgLy8gYW5kZXJlIEFrdGlvbmVuIG1laHIgdWViZXIgaXN0CisgICAgbG9hZF9hdXRvX29iamVjdHMoIGF1dG9sb2FkICk7Cit9CisKKy8qKiBTZXR6dCBkaWUgU3BpZWxlcmluaXRpYWxpc2llcnVuZyBuYWNoIHN0YXJ0X3BsYXllcigpIGZvcnQuCisgICogUHJ1ZWZ0IGRlbiBXZXJ0IGRlciB2b20gU3BpZWxlciBnZXRyYWdlbmVuIFNhY2hlbiAoZnVlciBFbnRzY2hhZWRpZ3VuZworICAqIG5hY2ggUmVib290KS4KKyAgKiBTZXR6dCBkaXYuIFByb3BlcnRpZXMgZGVzICJTcGllbGVya29lcnBlcnMiLCBkaWUgZWlnZW50bGljaCBnZXNwZWljaGVydAorICAqIHdlcmRlbiwgbmFjaCBlaW5lbSBSZWJvb3QgenVydWVjay4KKyAgKiBGcmFndCBnZ2YuIG5hY2ggZU1haWwtQWRyZXNzZSB1bmQgdWViZXJnaWJ0IHBlciBpbnB1dF90byBhbgorICAqIEluaXRQbGF5ZXIyKCkuCisgICogQHNhIEluaXRQbGF5ZXIzKCksSW5pdFBsYXllcjIoKSwgSW5pdFBsYXllcigpLCBzdGFydF9wbGF5ZXIoKS4KKyovCitwcml2YXRlIHZvaWQgSW5pdFBsYXllcigpCit7CisgICAgc3RyaW5nIG1haWxhZGRyOworCisgICAgLy8gd2VubiBlcyBlaW5lbiBDcmFzaCBnYWIsIHNvbGxlbiBTcGllbGVyIG5pY2h0IG5vY2ggZXh0cmEgYmVzdHJhZnQgd2VyZGVuCisgICAgaWYgKCBmaWxlX3RpbWUoICIvc2F2ZS8iICsgZ2V0dWlkKClbMC4uMF0gKyAiLyIgKyBnZXR1aWQoKSArICIubyIgKQorICAgICAgICAgPCBsYXN0X3JlYm9vdF90aW1lKCkgKXsKKyAgICAgICAgU2V0UHJvcCggUF9GT09ELCAwICk7CisgICAgICAgIFNldFByb3AoIFBfRFJJTkssIDAgKTsKKyAgICAgICAgU2V0UHJvcCggUF9BTENPSE9MLCAwICk7CisgICAgICAgIFNldFByb3AoIFBfQkxJTkQsIDAgKTsKKyAgICAgICAgU2V0UHJvcCggUF9ERUFGLCAwICk7CisgICAgICAgIFNldFByb3AoIFBfUE9JU09OLCAwICk7CisgICAgICAgIFNldFByb3AoIFBfR0hPU1QsIDAgKTsKKyAgICAgICAgU2V0UHJvcCggUF9GUk9HLCAwICk7CisgICAgICAgIFNldFByb3AoIFBfSFAsIFF1ZXJ5UHJvcChQX01BWF9IUCkgKTsKKyAgICAgICAgU2V0UHJvcCggUF9TUCwgUXVlcnlQcm9wKFBfTUFYX1NQKSApOworICAgIH0KKworICAgIGlmICggUXVlcnlHdWVzdCgpICkKKyAgICAgICAgU2V0KCBQX01BSUxBRERSLCAibm9uZSIgKTsKKyAgICBlbHNlIGlmICggIShtYWlsYWRkciA9IFF1ZXJ5KFBfTUFJTEFERFIpKSB8fCBtYWlsYWRkciA9PSAiIiApIHsKKyAgICAgICAgd3JpdGUoYnJlYWtfc3RyaW5nKAorICAgICAgICAgICJFaW5lIGd1ZWx0aWdlIEVNYWlsLUFkcmVzc2UgZXJsZWljaHRlcnQgZXMgZXJoZWJsaWNoLCBEaXIgIgorICAgICAgICAgICJlaW4gbmV1ZXMgUGFzc3dvcnQgc2V0emVuIHp1IGxhc3NlbiwgZmFsbHMgRHUgZWlubWFsIERlaW4gIgorICAgICAgICAgICJQYXNzd29ydCB2ZXJnaXNzdC4iLDc4KSk7IAorICAgICAgICBpbnB1dF90byggImdldG1haWxhZGRyIixJTlBVVF9QUk9NUFQsCisgICAgICAgICAgICAiR2liIGJpdHRlIERlaW5lIEVNYWlsLUFkcmVzc2UgYW46ICIgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBJbml0UGxheWVyMigpOworfQorCisvKiogbGllc3QgZU1haWwtQWRyZXNzZSB2b20gU3BpZWxlciBlaW4gdW5kIHNwZWljaGVydCBzaWUuCisgICogVWViZXJnaWJ0IGFuc2NobGllc3NlbmQgYW4gSW5pdFBsYXllcjIoKQorICAqIEBwYXJhbVtpbl0gbWFkZHIgU3BpZWxlcmVpbmdhYmUgZGVyIEVtYWlsYWRyZXNzZS4KKyAgKiBAc2EgSW5pdFBsYXllcjIoKS4KKyAgKi8KK3N0YXRpYyB2b2lkIGdldG1haWxhZGRyKCBzdHJpbmcgbWFkZHIgKQoreworICAgIG1hZGRyID0gY2hlY2tfZW1haWwobWFkZHIpOworCisgICAgaWYgKCAhc3RyaW5ncChtYWRkcikpIHsKKyAgICAgIHdyaXRlKCJEZWluZSBFaW5nYWJlIHNjaGVpbnQga2VpbmUgZ3VlbHRpZ2UgRU1haWwtQWRyZXNzZSBnZXdlc2VuICIKKyAgICAgICAgICAienUgc2Vpbi5cbiIpOworICAgICAgaW5wdXRfdG8oICJnZXRtYWlsYWRkciIsIElOUFVUX1BST01QVCwKKyAgICAgICAgICAiR2liIGJpdHRlIERlaW5lIEVNYWlsLUFkcmVzc2UgYW46ICIgKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgU2V0KCBQX01BSUxBRERSLCBtYWRkciApOworICAgIEluaXRQbGF5ZXIyKCk7Cit9CisKKworLyoqIFBydWVmdCBHZXNjaGxlY2h0IGRlcyBTcGllbGVycyB1bmQgZnJhZ3QgZ2dmLiBiZWltIFNwaWVsZXIgbmFjaC4KKyAgKiBVZWJlcmdpYnQgYW4gSW5pdFBsYXllcjMoKSBvZGVyIGdldF9nZW5kZXIoKS4KKyAgKiBAc2EgSW5pdFBsYXllcjMoKSwgZ2V0X2dlbmRlcigpLgorICAqLworcHJpdmF0ZSB2b2lkIEluaXRQbGF5ZXIyKCkKK3sKKyAgICBpZiggbWVtYmVyKCh7IE1BTEUsIEZFTUFMRSB9KSwgUXVlcnlQcm9wKFBfR0VOREVSKSApID09IC0xICkgeworICAgICAgICBpbnB1dF90byggImdldGdlbmRlciIsIElOUFVUX1BST01QVCwKKyAgICAgICAgICAgICJCaXN0IER1IG1hZW5ubGljaCBvZGVyIHdlaWJsaWNoOiAiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEluaXRQbGF5ZXIzKCk7Cit9CisKKy8qKiBMaWVzdCBTcGllbGVyYW50d29ydCBhdWYgZGllIEZyYWdlIG5hY2ggZGVtIEdlc2NobGVjaHQgZGVzIENoYXJzIGVpbi4KKyAgKiBXaXJkIGdlcnVmZW4gdm9uIGlucHV0X3RvKCkuCisgICogVWViZXJnaWJ0IGFuIEluaXRQbGF5ZXIzKCkuCisgICogQHNhIEluaXRQbGF5ZXIzKCkuCisgICovCitzdGF0aWMgdm9pZCBnZXRnZW5kZXIoIHN0cmluZyBnZW5kZXJfc3RyaW5nICkKK3sKKyAgICBnZW5kZXJfc3RyaW5nID0gbG93ZXJfY2FzZSggZ2VuZGVyX3N0cmluZyApOworCisgICAgaWYgKCBzaXplb2YoZ2VuZGVyX3N0cmluZyk9PTEgJiYgZ2VuZGVyX3N0cmluZ1swXSA9PSAnbScgKXsKKyAgICAgICAgd3JpdGUoICJXaWxsa29tbWVuLCBtZWluIEhlcnIhXG4iICk7CisgICAgICAgIFNldFByb3AoIFBfR0VOREVSLCBNQUxFICk7CisgICAgfQorICAgIGVsc2UgaWYgKCBzaXplb2YoZ2VuZGVyX3N0cmluZyk9PTEgJiYgZ2VuZGVyX3N0cmluZ1swXSA9PSAndycgKXsgICAgCisgICAgICAgIHdyaXRlKCAiV2lsbGtvbW1lbiwgZ25hZScgRnJhdSFcbiIgKTsKKyAgICAgICAgU2V0UHJvcCggUF9HRU5ERVIsIEZFTUFMRSApOyAgICAKKyAgICB9ICAgIAorICAgIGVsc2UgeworICAgICAgICB3cml0ZSggIldpZT8gV2FzPyBWZXJzdGVoZSBpY2ggbmljaHQhXG4iICk7ICAgIAorICAgICAgICBpbnB1dF90byggImdldGdlbmRlciIsIElOUFVUX1BST01QVCwKKyAgICAgICAgICAgICJCaXN0IER1IG1hZW5ubGljaCBvZGVyIHdlaWJsaWNoPyAodGlwcGUgbSBvZGVyIHcpOiAiKTsgICAgCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBJbml0UGxheWVyMygpOworfQorCisKKy8qKiBQcnVlZnQgVGVybWluYWx0eXAgZGVzIFNwaWVsZXJzIHVuZCBmcmFndCBnZ2YuIGJlaW0gU3BpZWxlciBuYWNoLgorICAqIFVlYmVyZ2lidCBhbiBJbml0UGxheWVyNCgpIG9kZXIgZ2V0dHR5KCkuCisgICogQHNhIEluaXRQbGF5ZXI0KCksIGdldHR0eSgpLgorICAqLworcHJpdmF0ZSB2b2lkIEluaXRQbGF5ZXIzKCkKK3sKKyAgICBpZiAoICFRdWVyeVByb3AoUF9UVFkpIHx8IFF1ZXJ5UHJvcChQX1RUWSkgPT0gIm5vbmUiICkKKyAgICB7CisgICAgICAgIHdyaXRlKCAiV2FlaGxlIGVpbmVuIFRlcm1pbmFsdHlwIChrYW5uIHNwYWV0ZXIgbWl0IDxzdHR5PiBnZWFlbmRlcnQgIgorICAgICAgICAgICAgICAgIndlcmRlbilcbiIpOworICAgICAgICBpbnB1dF90byggImdldHR0eSIsIElOUFVUX1BST01QVCwgInZ0MTAwLCBhbnNpLCBkdW1iIChTdGFuZGFyZDogZHVtYik6ICIgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBJbml0UGxheWVyNCgpOworfQorCisvKiogTGllc3QgU3BpZWxlcmFudHdvcnQgYXVmIGRpZSBGcmFnZSBuYWNoIGRlbSBUZXJtaW5hbHR5cCBlaW4uCisgICogV2lyZCBnZXJ1ZmVuIHZvbiBpbnB1dF90bygpLgorICAqIFVlYmVyZ2lidCBhbiBJbml0UGxheWVyNCgpLgorICAqIEBzYSBJbml0UGxheWVyNCgpLgorICAqLworc3RhdGljIHZvaWQgZ2V0dHR5KCBzdHJpbmcgdHR5c3RyICkKK3sKKyAgICBpZiAoICF0dHlzdHIgfHwgdHR5c3RyID09ICIiICkKKyAgICAgICAgdHR5c3RyID0gImR1bWIiOworCisgICAgdHR5c3RyID0gbG93ZXJfY2FzZSh0dHlzdHIpOworCisgICAgaWYgKCB0dHlzdHIgPT0gInZ0MTAwIiApeworICAgICAgICB3cml0ZSggIkRpZXMgc29sbHRlICIgKyBBTlNJX0JPTEQgKyAiZmV0dCIgKyBBTlNJX05PUk1BTCArICIgc2Vpbi5cbiIgKTsKKyAgICAgICAgU2V0UHJvcCggUF9UVFksIHR0eXN0ciApOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGlmICggdHR5c3RyID09ICJhbnNpIiApeworICAgICAgICAgICAgd3JpdGUoICJEaWVzIHNvbGx0ZSAiICsgQU5TSV9SRUQgKyAicm90IiArIEFOU0lfTk9STUFMICsKKyAgICAgICAgICAgICAgICAgICAiIHNlaW4uXG4iICk7CisgICAgICAgICAgICBTZXRQcm9wKCBQX1RUWSwgImFuc2kiICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIHR0eXN0ciA9PSAiZHVtYiIgKXsKKyAgICAgICAgICAgIHdyaXRlKCAiT2hqZSwgb2VkZSEgQmVzb3JnIERpciBlaW4gYmVzc2VyZXMgVGVybWluYWwhXG4iICk7CisgICAgICAgICAgICBTZXRQcm9wKCBQX1RUWSwgImR1bWIiICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB3cml0ZSggIkRpZXNlciBUZXJtaW5hbHR5cCB3aXJkIG5pY2h0IHVudGVyc3R1ZXR6dC4gTmltbSBiaXR0ZSAiCisgICAgICAgICAgICAgICAgICAgImVpbmVuIGF1czpcbnZ0MTAwLCBhbnNpIG9yIGR1bWIgKFN0YW5kYXJkIGlzdCBkdW1iKS5cbiIgKTsKKyAgICAgICAgICAgIGlucHV0X3RvKCAiZ2V0dHR5IiwgSU5QVVRfUFJPTVBULAorICAgICAgICAgICAgICAgICJ2dDEwMCwgYW5zaSBvciBkdW1iIChTdGFuZGFyZCBpc3QgZHVtYik6ICIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICBJbml0UGxheWVyNCgpOworfQorCisKKy8qKiBMaWVmZXJ0IGRpZSBVSUQgZGVzIENoYXJha3RlcnMgenVydWVjaywgYWxzbyBkZW4gQ2hhcmFrdGVybmFtZW4uCisgICogQHJldHVybiBVSUQgZGVzIE9iamVrdHMgKENoYXJha3Rlcm5hbWUpLgorICAqLworbm9tYXNrIHN0cmluZyBxdWVyeV9yZWFsX25hbWUoKSB7CisgIC8qIEFDSFRVTkcgISEgRElFUyBMRlVOIERBUkYgTklDSFQgRU5URkVSTlQgV0VSREVOICEhISAqLworICAvKiBTaWUgd2lyZCB2b20gR2FtZWRyaXZlciAoekIgYmVpIEZfRUQpIGF1ZmdlcnVmZW4gISEgKi8KKyAgLyogSWNoIGJpbiBkYSB6d2FyIG5pY2h0IHNvIHVlYmVyemV1Z3Qgdm9uLCBkYXNzIGRlciBEcml2ZXIgZGllIGhldXR6dXRhZ2UKKyAgICogbm9jaCBydWZ0LCBhYmVyIGRpZSBoYWxiZSBNdWRsaWIgcnVmdCBzaWUuIDstKSAoWmVzc3RyYSwgMjcuNC4wOCkKKyAgICovCisgIHJldHVybiBnZXR1aWQoKTsKK30KKworLyoKKyAqIHRoZSB3aXphcmQgY29tbWFuZCByZXZpZXc6IHNob3cgcGxheWVyIG1vdmluZyBtZXNzYWdlcworICovCitpbnQgcmV2aWV3KCkgeworICBzdHJpbmcgKm1zZzsKKyAgd3JpdGUoc2hvcnQoKSk7CisgIHdyaXRlKCJEZWluZSBCZXdlZ3VuZ2VuIHdlcmRlbiB3aWUgZm9sZ3QgZ2VtZWxkZXQ6XG4iKworICAgICAgICAibW91dDogICIrbmFtZShXRVIpKyIgIisobXNnPWV4cGxvZGUoUXVlcnlQcm9wKFBfTVNHT1VUKSwiIyIpKVswXQorICAgICAgICsiIDxSaWNodHVuZz4iKyhzaXplb2YobXNnKT4xID8gbXNnWzFdIDogIiIpKyIuXG4iKworICAgICAgICAibWluOiAgICIrbmFtZShXRVIpKyIgIitRdWVyeVByb3AoUF9NU0dJTikrIi5cbiIrCisgICAgICAgICJtbW91dDogIituYW1lKFdFUikrIiAiK1F1ZXJ5UHJvcChQX01NU0dPVVQpKyIuXG4iKworICAgICAgICAibW1pbjogICIrbmFtZShXRVIpKyIgIitRdWVyeVByb3AoUF9NTVNHSU4pKyIuXG4iKworICAgICAgICAoSVNfTEVBUk5FUihNRSkgPworICAgICAgICAgImNtc2c6ICAiK25hbWUoV0VSKSsiICIrUXVlcnlQcm9wKFBfQ0xPTkVfTVNHKSsiLlxuIisKKyAgICAgICAgICJkbXNnOiAgPElyZ2VuZGV0d2FzPiAiK1F1ZXJ5UHJvcChQX0RFU1RSVUNUX01TRykrIi5cbiIKKyAgICAgICAgIDogIiIpKworICAgICAgICAiV2VubiBEdSBqZW1hbmRlbiBhbmdyZWlmc3QsIHNpZWh0IGRhcyBzbyBhdXM6XG4iKworICAgICAgICBuYW1lKFdFUikrIiBncmVpZnQgRGljaCIrUXVlcnlQcm9wKFBfSEFORFMpWzBdKyIgYW4uXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qCisgKiBzZXQgcGxheWVyIG1vdmluZyBtZXNzYWdlcworICovCisKK3N0YXRpYyBpbnQgc2V0bWluKHN0cmluZyBzdHIpCit7CisgIFNldFByb3AoUF9NU0dJTiwgX3VucGFyc2VkX2FyZ3MoKXx8ImtvbW10IGFuIik7CisgIHdyaXRlKCJPay5cbiIpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBzZXRtb3V0KHN0cmluZyBzdHIpCit7CisgIHN0cmluZyAqbXNnOworCisgIGlmKHNpemVvZihtc2c9ZXhwbG9kZSgoX3VucGFyc2VkX2FyZ3MoKXx8ImdlaHQiKSwiIyIpKT4yKQorICB7CisgICAgd3JpdGUoIkR1IGRhcmZzdCBudXIgZWlubWFsICcjJyBmdWVyIGRpZSBSaWNodHVuZyBhbmdlYmVuLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYoc2l6ZW9mKG1zZyk+MSkKKyAgeworICAgIGlmIChtc2dbMF0hPSIiICYmIG1zZ1swXVs8MV09PScgJykgbXNnWzBdPW1zZ1swXVswLi48Ml07CisgICAgU2V0UHJvcChQX01TR09VVCwgbXNnWzBdKyIjIittc2dbMV0pOworICB9CisgIGVsc2UKKyAgICBTZXRQcm9wKFBfTVNHT1VULCBfdW5wYXJzZWRfYXJncygpfHwiZ2VodCIpOworICB3cml0ZSgiT2suXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc2V0bW1pbihzdHJpbmcgc3RyKQoreworICBTZXRQcm9wKFBfTU1TR0lOLCBfdW5wYXJzZWRfYXJncygpfHwiZXJzY2hlaW50Iik7CisgIHdyaXRlKCJPay5cbiIpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBzZXRtbW91dChzdHJpbmcgc3RyKQoreworICBTZXRQcm9wKFBfTU1TR09VVCwgX3VucGFyc2VkX2FyZ3MoKXx8InZlcnNjaHdpbmRldCIpOworICB3cml0ZSgiT2suXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc2V0Y21zZyhzdHJpbmcgc3RyKQoreworICBTZXRQcm9wKFBfQ0xPTkVfTVNHLCBfdW5wYXJzZWRfYXJncygpfHwiemF1YmVydCBldHdhcyBhdXMgIgorICAgICAgICAgICsgUXVlcnlQb3NzUHJvbm91bihNQUxFLFdFTSkgKyAiIEFlcm1lbCBoZXJ2b3IiKTsKKyAgd3JpdGUoIk9rLlxuIik7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHNldGRtc2coc3RyaW5nIHN0cikKK3sKKyAgU2V0UHJvcChQX0RFU1RSVUNUX01TRywgX3VucGFyc2VkX2FyZ3MoKXx8IndpcmQgdm9uICIgKyBuYW1lKFdFUiwxKQorICAgICAgICAgICsgIiB6ZXJzdGFldWJ0Iik7CisgIHdyaXRlKCJPay5cbiIpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBzZXRfdGl0bGUoc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIGJvbnVzOworICAKKyAgaWYoIUlTX1NFRVIodGhpc19vYmplY3QoKSkgJiYgIUZBT19IQVNfVElUTEVfR0lGVCh0aGlzX29iamVjdCgpKSApCisgIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICAKKyAgYm9udXMgPSAiIjsKKyAgaWYgKCEoc3RyPV91bnBhcnNlZF9hcmdzKCkpKQorICAgIHN0ciA9ICIiOworICBlbHNlIGlmKCBzdHJbMC4uMl09PSJcXGIsIiB8fCBzdHJbMC4uMl09PSJcXGInIiApCisgIHsKKyAgICBib251cyA9ICJcYiI7IC8vIGVpbiBiYWNrc3BhY2UgZnVlciBlaW4gKGhvY2gpa29tbWEgaXN0IG9rISA6LSkKKyAgICBzdHIgPSBzdHJbMi4uXTsKKyAgfQorICBpZihzdHI9PSIwIikgIC8vIGRhbWl0IGRlciBHaWxkZW50aXRlbCB6dW0gVm9yc2NoZWluIGtvbW1lbiBrYW5uCisgICAgU2V0UHJvcChQX1RJVExFLCAwKTsKKyAgZWxzZQorICAgIFNldFByb3AoUF9USVRMRSwgYm9udXMrc3RyKTsKKyAgd3JpdGUoIk9rLlxuIik7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGV4dHJhX2lucHV0KHN0cmluZyBzdHIsIHN0cmluZyBsb29rKQoreworICBpZiAoc3RyPT0iKioiKQorICB7CisgICAgaWYgKGxvb2s9PSIiKQorICAgICAgU2V0UHJvcChQX0VYVFJBX0xPT0ssMCk7CisgICAgZWxzZQorICAgICAgU2V0UHJvcChQX0VYVFJBX0xPT0ssbG9vayk7CisgICAgd3JpdGUoIk9rLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaW5wdXRfdG8oImV4dHJhX2lucHV0IixJTlBVVF9QUk9NUFQsICJdIiAsbG9vaytzdHIrIlxuIik7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGV4dHJhbG9vayhtaXhlZCBzdHIpCit7CisgIGlmKCBzdHI9PSI/IiApCisgIHsKKyAgICB3cml0ZSggIkRlaW4gRXh0cmFsb29rIGlzdCA6ICIrUXVlcnlQcm9wKFBfRVhUUkFfTE9PSykgKyAiXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICB3cml0ZSgiQml0dGUgZ2liIERlaW5lbiBFeHRyYS1Mb29rIGVpbi4gQmVlbmRlbiBtaXQgKio6XG4iKTsKKyAgaW5wdXRfdG8oImV4dHJhX2lucHV0IixJTlBVVF9QUk9NUFQsIl0iLCIiKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGNhbGN1bGF0ZV92YWx1ZSgpCit7CisgIGludCBpLCBjYXJyaWVkX3ZhbHVlLCB2YWx1ZTsKKworICBjYXJyaWVkX3ZhbHVlPTA7CisgIGZvcmVhY2gob2JqZWN0IG9iOiBkZWVwX2ludmVudG9yeShNRSkpIHsKKyAgICBpZiAoIW9iLT5RdWVyeVByb3AoUF9BVVRPTE9BRE9CSikpCisgICAgICBjYXJyaWVkX3ZhbHVlKz0oKHZhbHVlPShpbnQpb2ItPlF1ZXJ5UHJvcChQX1ZBTFVFKSkgPiAxMDAwID8gMTAwMCA6IHZhbHVlKTsKKyAgfQorICBTZXRQcm9wKFBfQ0FSUklFRF9WQUxVRSwgY2FycmllZF92YWx1ZSk7Cit9CisKKy8qIENhbGxlZCBieSBjb21tYW5kICdzYXZlJyAqLworaW50IHNhdmVfY2hhcmFjdGVyKCkgeworICBzYXZlX21lKDEpOworICB3cml0ZSgiT2suXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgc2F2ZV9tZShtaXhlZCB2YWx1ZV9pdGVtcykKK3sKKyAgLy8gR2Flc3RlIHdlcmRlbiBuaWNodCBnZXNwZWljaGVydAorICBpZiggZ2V0dWlkKClbMC4uM109PSJnYXN0IiApCisgICAgcmV0dXJuOworIAorICAvLyBBdXRvbG9hZGVyIGlkZW50aWZpemllcmVuIHVuZCBzcGVpY2hlcm4KKyAgYXV0b2xvYWQ9KFtdKTsKKyAgZm9yZWFjaChvYmplY3Qgb2I6IGRlZXBfaW52ZW50b3J5KE1FKSkgeworICAgIGludCB2YWwgPSBvYi0+UXVlcnlQcm9wKCBQX0FVVE9MT0FET0JKICk7CisgICAgaWYgKHZhbCAmJiBjbG9uZXAob2IpKQorICAgIHsKKyAgICAgIHN0cmluZyBvYm5hbWU9bG9hZF9uYW1lKG9iKTsKKyAgICAgIGlmIChvYm5hbWUgPT0gR0VMRCkKKyAgICAgICAgYXV0b2xvYWRbb2JuYW1lXSArPSB2YWw7CisgICAgICBlbHNlCisgICAgICAgIGF1dG9sb2FkICs9IChbb2JuYW1lOnZhbF0pOworICAgIH0KKyAgfQorICAvLyBBbiBub2NoIG5pY2h0IGdlY2xvbnRlIEF1dG9sb2FkZXIgZGVua2VuIQorICBhdXRvbG9hZCArPSBhdXRvbG9hZF9yZXN0OworICAKKyAgLy8gSW0gQmVkYXJmc2ZhbGwgV2VydCBkZXMgSW52ZW50b3J5IGJlc3RpbW1lbgorICBpZiAodmFsdWVfaXRlbXMpCisgICAgY2FsY3VsYXRlX3ZhbHVlKCk7CisgIGVsc2UKKyAgICBTZXRQcm9wKFBfQ0FSUklFRF9WQUxVRSwgMCk7CisKKyAgLy8gTG9nb3V0LVplaXQgc3BlaWNoZXJuCisgIGlmKHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoTUUpICYmICFRdWVyeVByb3AoUF9JTlZJUykpCisgICAgU2V0KFBfTEFTVF9MT0dPVVQsdGltZSgpKTsKKworICAvLyBGdW5rdGlvbiB6dXIgQmVzdGltbXVuZyBkZXMgR2lsZGVucmF0aW5nIGF1ZnJ1ZmVuCisgIHN0cmluZyBnaWxkZT1HVUlMRF9ESVIrUXVlcnlQcm9wKFBfR1VJTEQpOworICBpZiAoZmluZF9vYmplY3QoZ2lsZGUpIHx8IGZpbGVfc2l6ZShnaWxkZSsiLmMiKT4tMSkKKyAgICBjYXRjaChjYWxsX290aGVyKGdpbGRlLCJHdWlsZFJhdGluZyIsdGhpc19vYmplY3QoKSk7cHVibGlzaCk7CisKKyAgLy8gU3BlaWNoZXJuIGRlcyBTcGllbGVycworICBzYXZlX29iamVjdCgiLyIrU0FWRVBBVEgrZ2V0dWlkKClbMC4uMF0rIi8iICsgZ2V0dWlkKCkpOworfQorCitzdGF0aWMgdmFyYXJncyB2b2lkIGxvZ19hdXRvbG9hZCggc3RyaW5nIGZpbGUsIHN0cmluZyByZWFzb24sIG1peGVkIGRhdGEsIHN0cmluZyBlcnJvciApCit7CisgIGlmIChtZW1iZXIoYXV0b2xvYWRfZXJyb3IsZmlsZSkhPS0xKSByZXR1cm47CisgIGxvZ19maWxlKFNIRUxMTE9HKCJOT19BVVRPX0ZJTEUiKSxzcHJpbnRmKCIlczogJXM6ICVzXG5yZWFzb246IGNhbm5vdCAlcyBmaWxlXG5kYXRhOiAlT1xuJXNcbiIsCisgICAgICAgICAgIGN0aW1lKClbNC4uMTVdLGNhcGl0YWxpemUoZ2V0dWlkKCkpLGZpbGUscmVhc29uLGRhdGEsCisgICAgICAgICAgIChlcnJvcj8iRmVobGVybWVsZHVuZzogIitlcnJvcisiXG4iOiIiKSkpOworICBhdXRvbG9hZF9lcnJvcis9KHtmaWxlfSk7Cit9CisKKy8vIHRpY3MsIGRpZSBmdWVyIGF1dG9sb2FkZXIgcmVpY2hlbiBzb2xsdGVuOgorI2RlZmluZSBTQUZFX0ZPUl9BVVRPTE9BREVSIF9fTUFYX0VWQUxfQ09TVF9fLzQKKworcHJpdmF0ZSB2b2lkIGxvYWRfYXV0b19vYmplY3QoIHN0cmluZyBmaWxlLCBtaXhlZCBkYXRhICkKK3sKKyAgICBvYmplY3Qgb2I7CisgICAgc3RyaW5nIGVycm9yOworICAgCisgICAgaWYoIGdldF9ldmFsX2Nvc3QoKSA8IFNBRkVfRk9SX0FVVE9MT0FERVIgKSByZXR1cm47CisgICAgbV9kZWxldGUoIGF1dG9sb2FkX3Jlc3QsIGZpbGUgKTsKKyAgICBhdXRvbG9hZF9lcnJvci09KHtmaWxlfSk7CisKKyAgICBpZiAoIGZpbGUgPT0gIi9vYmovbW9uZXkiICkKKyAgICAgIGZpbGUgPSAiL2l0ZW1zL21vbmV5IjsKKyAgICBpZiAoIGZpbGUgPT0gIi9vYmovc2VlcmNhcmQiICkKKyAgICAgIGZpbGUgPSAiL2l0ZW1zL3NlZXJjYXJkIjsKKyAgICAKKyAgICBvYiA9IGZpbmRfb2JqZWN0KGZpbGUpOworICAgIAorICAgIGlmICghb2IpCisgICAgeworICAgICAgICBpZiAoZmlsZV9zaXplKGZpbGUrIi5jIik8MCYmCisgICAgICAgICAgIGZpbGVfc2l6ZShpbXBsb2RlKGV4cGxvZGUoZmlsZSwiLyIpWzAuLjwyXSwiLyIpKworICAgICAgICAgICAgICAgICAgICAgIi92aXJ0dWFsX2NvbXBpbGVyLmMiKTwwKQorICAgICAgICB7CisgICAgICAgICAgIGxvZ19hdXRvbG9hZChmaWxlLCJmaW5kIixkYXRhLDApOworICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVycm9yID0gY2F0Y2gobG9hZF9vYmplY3QoZmlsZSk7IHB1Ymxpc2gpKQorICAgICAgICB7CisgICAgICAgICAgIGxvZ19hdXRvbG9hZChmaWxlLCJsb2FkIixkYXRhLGVycm9yKTsKKyAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGlmICggZXJyb3IgPSBjYXRjaChvYiA9IGNsb25lX29iamVjdChmaWxlKTsgcHVibGlzaCkgKQorICAgIHsKKyAgICAgICAgbG9nX2F1dG9sb2FkKGZpbGUsImNsb25lIixkYXRhLCBlcnJvcik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIGVycm9yID0gY2F0Y2gob2ItPlNldFByb3AoIFBfQVVUT0xPQURPQkosIGRhdGEgKTsgcHVibGlzaCkgKQorICAgIHsKKyAgICAgICAgbG9nX2F1dG9sb2FkKGZpbGUsIlNldFByb3AiLGRhdGEsIGVycm9yKTsKKyAgICAgICAgb2ItPnJlbW92ZSgxKTsKKyAgICAgICAgaWYgKG9iKSBkZXN0cnVjdChvYik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIGVycm9yID0gY2F0Y2gob2ItPm1vdmUoIE1FLCBNX05PQ0hFQ0sgKTtwdWJsaXNoKSApIHsKKyAgICAgICAgbG9nX2F1dG9sb2FkKGZpbGUsIm1vdmUiLGRhdGEsIGVycm9yKTsKKyAgICAgICAgb2ItPnJlbW92ZSgxKTsKKyAgICAgICAgaWYob2IpIGRlc3RydWN0KG9iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KK30KKworc3RhdGljIHZvaWQgbG9hZF9hdXRvX29iamVjdHMoIG1hcHBpbmcgbWFwX2xkZmllZCApCit7CisgICAgaWYgKCAoIW1hcHBpbmdwKG1hcF9sZGZpZWQpIHx8ICFzaXplb2YobWFwX2xkZmllZCkpICYmICFzaXplb2YoYXV0b2xvYWRfcmVzdCkgKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBNaXQgTmV0enRvdGVuIFNwaWVsZXJuIHJlY2huZW4gbWFuY2hlIEF1dG9sb2FkZXIgbmljaHQuIEFsc28KKyAgICAvLyBkYXMgQ2xvbmVuIHVudGVyYnJlY2hlbiB1bmQgaW4gUmVjb25uZWN0KCkgd2llZGVyIGFud2VyZmVuLgorICAgIGlmICggIWludGVyYWN0aXZlKCkgKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBLbGVpbmVyIEhhY2s6IGF1dG9sb2FkX3Jlc3QgaXN0IGVpbmUgZ2xvYmFsZSBWYXJpYWJsZSwgZGllIGJlaW0KKyAgICAvLyBDbG9uZW4gZGVyIGVpbnplbG5lbiBBdXRvbG9hZGVyIGRpcmVrdCB2ZXJhZW5kZXJ0IHdpcmQuCisgICAgLy8gU28gbGFuZ2UgZGFzIE1hcHBpbmcgbm9jaCBFaW50cmFlZ2UgaGF0LCBtdWVzc2VuIHdpciBub2NoIGZlaGxlbmRlCisgICAgLy8gQXV0b2xvYWRlciBjbG9uZW4uCisgICAgaWYgKCAhc2l6ZW9mKGF1dG9sb2FkX3Jlc3QpICkKKyAgICAgICAgYXV0b2xvYWRfcmVzdCA9IG1hcF9sZGZpZWQ7CisKKyAgICAvLyBTY2hvbiBoaWVyIGVpbmVuIGNhbGxfb3V0KCkgenVtICJOYWNoImNsb25lbiB2b24gbm9jaCBuaWNodCBnZWNsb250ZW4KKyAgICAvLyBBdXRvbG9hZGVybiBzdGFydGVuLCBkYSBzcGFldGVyIHUuVS4ga2VpbmUgUmVjaGVuemVpdCBtZWhyIGRhZnVlciBkYSBpc3QuCisgICAgd2hpbGUgKCByZW1vdmVfY2FsbF9vdXQoImxvYWRfYXV0b19vYmplY3RzIikgIT0gLTEgKQorICAgICAgICAvKiBkbyBub3RoaW5nICovOworICAgIAorICAgIC8vIE1pdCBQYXJhbWV0ZXIgJzAnIGF1ZnJ1ZmVuLCBkYSBkYXMgZ2xvYmFsZSBNYXBwaW5nIGJlbnV0enQgd2lyZC4KKyAgICAvLyBWZXJ6b2VnZXJ1bmcgMCBpbiByZWt1cnNpdmVuIENhbGxvdXRzIGlzdCBibG9lZCwgYWxzbyAxcyBEZWxheQorICAgIGNhbGxfb3V0KCAibG9hZF9hdXRvX29iamVjdHMiLCAyLCAwICk7CisgICAgCisgICAgLy8gTWl0IGNhdGNoKCkgZ2VnZW4gZGllIEV2YWxjb3N0LUZhbGxlIQorICAgIC8vIE1pdCBBYnNpY2h0IGRhcyB3YWxrX21hcHBpbmcoKSBhdXMgZGVyICJhbHRlbiIgVmVyc2lvbiBlcmhhbHRlbiB1bmQKKyAgICAvLyBuaWNodCBkdXJjaCBlaW5lIChlaW5mYWNoZXJlKSBTY2hsZWlmZSBpbmtsLiBnZXRfZXZhbF9jb3N0KCkgZXJzZXR6dCwKKyAgICAvLyBkYSBlaW5lIFNjaGxlaWZlIGdlZ2VudWViZXIgZGVyIHdhbGtfbWFwcGluZygpLUxvZXN1bmcgZGVuIEF1ZmJhdQorICAgIC8vIGRlciBwcmV2aW91c19vYmplY3QoKS1LZXR0ZSB2ZXJhZW5kZXJuIHd1ZXJkZTsgZGFyYXVmIHRlc3RlbiBhYmVyCisgICAgLy8gbWFuY2hlIE9iamVrdGUuCisgICAgY2F0Y2goIHdhbGtfbWFwcGluZyggYXV0b2xvYWRfcmVzdCwgIydsb2FkX2F1dG9fb2JqZWN0LyonKi8gKSApOworfQorCisvKgorICogYWxfdG9fdGl0bGU6IE1ha2UgdGhlIG51bWVyaWMgYWxpZ25tZW50IHZhbHVlIGludG8gYSBzdHJpbmcKKyAqLworc3RhdGljIHN0cmluZyBhbF90b190aXRsZShpbnQgYSkKK3sKKyAgaWYgKGEgPj0gS0lMTF9ORVVUUkFMX0FMSUdOTUVOVCAqIDEwMCkKKyAgICByZXR1cm4gImhlaWxpZyI7CisgIGlmIChhID4gS0lMTF9ORVVUUkFMX0FMSUdOTUVOVCAqIDIwKQorICAgIHJldHVybiAiZ3V0IjsKKyAgaWYgKGEgPiBLSUxMX05FVVRSQUxfQUxJR05NRU5UICogNCkKKyAgICByZXR1cm4gIm5ldHQiOworICBpZiAoYSA+IC0gS0lMTF9ORVVUUkFMX0FMSUdOTUVOVCAqIDQpCisgICAgcmV0dXJuICJuZXV0cmFsIjsKKyAgaWYgKGEgPiAtIEtJTExfTkVVVFJBTF9BTElHTk1FTlQgKiAyMCkKKyAgICByZXR1cm4gImZyZWNoIjsKKyAgaWYgKGEgPiAtIEtJTExfTkVVVFJBTF9BTElHTk1FTlQgKiAxMDApCisgICAgcmV0dXJuICJib2VzZSI7CisgIHJldHVybiAic2F0YW5pc2NoIjsKK30KKworc3RhdGljIGludCB0b2dnbGVfd2hpbXB5X2RpcihzdHJpbmcgc3RyKSB7CisgIFNldFByb3AoUF9XSU1QWV9ESVJFQ1RJT04sc3RyPV91bnBhcnNlZF9hcmdzKCl8fHN0cik7CisgIGlmIChzdHIpCisgICAgcHJpbnRmKCJPaywgRmx1Y2h0cmljaHR1bmcgJU8uXG4iLHN0cik7CisgIGVsc2UKKyAgICBwcmludGYoIk9rLCBiZXZvcnp1Z3RlIEZsdWNodHJpY2h0dW5nIGRlYWt0aXZpZXJ0LlxuIik7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHRvZ2dsZV93aGltcHkoc3RyaW5nIHN0cikKK3sKKyAgaW50IGk7CisKKyAgaWYoIXN0ciB8fCBzdHI9PSIiIHx8IChzc2NhbmYoc3RyLCIlZCIsaSk8MCkpCisgIHsKKyAgICB3cml0ZSgidm9yc2ljaHQgPGhwPiwgMDw9aHA8IitRdWVyeVByb3AoUF9NQVhfSFApKyJcbiIpOworICAgIHJldHVybiAxOworICB9CisgIGlmKGk+PVF1ZXJ5UHJvcChQX01BWF9IUCkgfHwgaTwwKQorICB7CisgICAgd3JpdGUoIkRlciBXZXJ0IGlzdCBuaWNodCBlcmxhdWJ0LlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYoIWkpIHdyaXRlKCJQcmlueiBFaXNlbmhlcnotTW9kdXMuXG4iKTsKKyAgZWxzZSB3cml0ZSgiVm9yc2ljaHQtTW9kdXMgKCIraSsiKVxuIik7CisgIFNldFByb3AoUF9XSU1QWSxpKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qKiBCZXN0aW1tdCwgb2IgZGFzIFNwaWVsZXJvYmpla3QgYmVzY2hhdHRldCB3ZXJkZW4gZGFyZi4KKyAgKiBCZXNjaGF0dGVuIGlzdCBudXIgZnVlciBPYmpla3RlIGVybGF1YnQsIGRpZSBpbiAvc3RkL3BsYXllci9zaGFkb3dzCisgICogYWJnZWxlZ3Qgc2luZC4KKyAgKiBBdXNuYWhtZTogVGVzdHNwaWVsZXIgbWl0IGdlc2V0enRlbSBQX0FMTE9XRURfU0hBRE9XCisgICogQHBhcmFtW2luXSBvYmogT2JqZWt0LCB3YXMgYmVzY2hhdHRlbiBtb2VjaHRlLgorICAqIEByZXR1cm4gMCwgd2VubiBCZXNjaGF0dGVuIGVybGF1YnQsIDEgc29uc3QuCisgICovCit2YXJhcmdzIG5vbWFzayBpbnQgcXVlcnlfcHJldmVudF9zaGFkb3cob2JqZWN0IG9iaikKK3sKKyAgc3RyaW5nIHdoYXQsIGFsbG93ZWRfc2hhZG93OworICBpbnQgICAgZHVtbXk7CisKKy8vICBpZiAoIFF1ZXJ5KFBfVEVTVFBMQVlFUikgKQorLy8gICAgICByZXR1cm4gMDsKKyAgCisgIGlmIChvYmopeworICAgIHdoYXQ9b2JqZWN0X25hbWUob2JqKTsKKyAgICBpZiAod2hhdCAmJiB3aGF0ICE9ICIiICYmCisgICAgICAgIHNzY2FuZih3aGF0LCIvc3RkL3BsYXllci9zaGFkb3dzLyVzIyVkIix3aGF0LGR1bW15KT09MikKKyAgICAgIHJldHVybiAwOworICAgIAorICAgIC8vIEVpbmVtIFRlc3RzcGllbGVyIGthbm4gbWFuIFBfQUxMT1dFRF9TSEFET1cgYXVmIGVpbmVuIHp1IHRlc3RlbmRlbgorICAgIC8vIFNoYWRvdyBzZXR6ZW4uCisgICAgaWYgKCBRdWVyeShQX1RFU1RQTEFZRVIpICYmIAorICAgICAgICAgc3RyaW5ncCh3aGF0KSAmJiAKKyAgICAgICAgIHN0cmluZ3AoYWxsb3dlZF9zaGFkb3c9UXVlcnkoUF9BTExPV0VEX1NIQURPVykpICYmCisgICAgICAgICBzdHJzdHIod2hhdCwgYWxsb3dlZF9zaGFkb3cpPT0wKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdWhyemVpdCgpCit7CisgIHdyaXRlKGR0aW1lKHRpbWUoKStRdWVyeVByb3AoUF9USU1FWk9ORSkqMzYwMCkrIi5cbiIpOworICByZXR1cm4gMTsKK30KKworcHJvdGVjdGVkIHN0cmluZyBTZXREZWZhdWx0SG9tZShzdHJpbmcgc3RyKQoreworICByZXR1cm4gZGVmYXVsdF9ob21lPXN0cjsKK30KKworc3RyaW5nIFF1ZXJ5RGVmYXVsdEhvbWUoKQoreworICByZXR1cm4gZGVmYXVsdF9ob21lOworfQorCitwcm90ZWN0ZWQgc3RyaW5nIFNldERlZmF1bHRQcmF5Um9vbShzdHJpbmcgc3RyKQoreworICBpZihoY19wbGF5PjEpCisgIHsKKyAgICBkZWZhdWx0X3ByYXlfcm9vbT0iL3Jvb20vbmlydmFuYSI7CisgIH0KKyAgZWxzZQorICAgIGRlZmF1bHRfcHJheV9yb29tPXN0cjsKKyAgCisgIHJldHVybiBkZWZhdWx0X3ByYXlfcm9vbTsKK30KKworc3RyaW5nIFF1ZXJ5UHJheVJvb20oKQoreworICBpZihoY19wbGF5PjEpCisgIHsKKyAgICByZXR1cm4gIi9yb29tL25pcnZhbmEiOworICB9IAorICBzdHJpbmcgcm9vbSA9IFF1ZXJ5UHJvcChQX1BSQVlfUk9PTSk7CisgIGlmIChzdHJpbmdwKHJvb20pKQorICAgIHJldHVybiByb29tOworICBlbHNlIGlmIChkZWZhdWx0X3ByYXlfcm9vbSkKKyAgICByZXR1cm4gZGVmYXVsdF9wcmF5X3Jvb207CisgIC8vIGhvZmZlbnRsaWNoIGlzdCBkYXMgd2VuaWdzdGVucyBnZXNldHp0LiAKKyAgcmV0dXJuIGRlZmF1bHRfaG9tZTsKK30KKwordm9pZCBfcmVzdGFydF9iZWF0KCkKK3sKKyAgdGVsbF9vYmplY3QoTUUsCisgICAgICAiRGVyIEdhbWVEcml2ZXIgdGVpbHQgRGlyIG1pdDogRGVpbiBIZXJ6c2NobGFnIGhhdCB3aWVkZXIgZWluZ2VzZXR6dC5cbiIpOworICBzZXRfaGVhcnRfYmVhdCgxKTsKK30KKworc3RhdGljIGludCB3ZWcoc3RyaW5nIHN0cikKK3sKKyAgaWYgKCEoc3RyPV91bnBhcnNlZF9hcmdzKCkpKQorICB7CisgICAgcHJpbnRmKCJEdSBiaXN0IG5pY2h0JXMgYWxzIGFid2VzZW5kIGdla2VubnplaWNobmV0LlxuIiwKKyAgICAgICAgICAgUXVlcnlQcm9wKFBfQVdBWSkgPyAiIG1laHIiIDogIiIpOworICAgIFNldFByb3AoUF9BV0FZLCAwKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICB3cml0ZSgiRHUgYmlzdCBqZXR6dCBhbHMgYWJ3ZXNlbmQgZ2VrZW5uemVpY2huZXQuXG4iKTsKKyAgU2V0UHJvcChQX0FXQVksIHN0cik7CisgIHJldHVybiAxOworfQorCisvKiBFaW4gQmVmZWhsIHp1bSBhbnNjaGF1ZW4gZGVyIFdlZ21lbGR1bmcgYW5kZXJlciBTcGllbGVyICovCitzdGF0aWMgaW50IHdlZ21lbGR1bmcoc3RyaW5nIHBsYXllcikKK3sKKworICBvYmplY3QgcGxheWVyX29iOworICBzdHJpbmcgd2VnOworCisgIGlmICggIXBsYXllciB8fCBwbGF5ZXI9PSIiIHx8IAorICAgICAgIHBsYXllcj09bG93ZXJzdHJpbmcodGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKFBfTkFNRSkpKQorICB7CisgICAgd2VnPXRoaXNfcGxheWVyKCktPlF1ZXJ5UHJvcChQX0FXQVkpOworICAgIHdyaXRlICgiRHUgYmlzdCAiKyh3ZWc/IiI6Im5pY2h0ICIpKyJhbHMgYWJ3ZXNlbmQgZ2VrZW5uemVpY2huZXQuXG4iKTsKKyAgICBpZiAod2VnKQorICAgICAgd3JpdGUoYnJlYWtfc3RyaW5nKHdlZywgNzgsIkdydW5kOiAiLEJTX0lOREVOVF9PTkNFKSk7CisgICAgcmV0dXJuIDE7ICAKKyAgfQorCisgIC8vIFdlbGNoZXIgU3BpZWxlciBpc3QgZ2VtZWludD8KKyAgcGxheWVyX29iPWZpbmRfcGxheWVyKHBsYXllcik7CisKKyAgLy8gU3BpZWxlciBuaWNodCBkYSBvZGVyIEludmlzIHVuZCBBbmZyYWdlciBpcyBrZWluIE1hZ2llcgorICBpZiAoIXBsYXllcl9vYiB8fCAKKyAgICAgIChwbGF5ZXJfb2ItPlF1ZXJ5UHJvcChQX0lOVklTKSAmJiAhSVNfTEVBUk5FUih0aGlzX3BsYXllcigpKSkpIAorICB7CisgICAgd3JpdGUoY2FwaXRhbGl6ZShwbGF5ZXIpKyIgaXN0IGdlcmFkZSBuaWNodCBpbSBTcGllbC5cbiIpOworICAgIHJldHVybiAxOworICB9CisKKyAgd2VnPXBsYXllcl9vYi0+UXVlcnlQcm9wKFBfQVdBWSk7CisKKyAgICAgICAgLy8gcGxheWVyX29iLT5OYW1lKCkgZ2lidCBiZWkgaW52aXMtTWFnaWVybiAiSmVtYW5kIiB6dXJ1ZWNrCisgIHdyaXRlIChwbGF5ZXJfb2ItPlF1ZXJ5UHJvcChQX05BTUUpKyIgaXN0ICIrCisgICAgICAgICAod2VnPyIiOiJuaWNodCAiKSsiYWxzIGFid2VzZW5kIGdla2VubnplaWNobmV0LlxuIik7CisKKyAgaWYgKHdlZykKKyAgICB3cml0ZShicmVha19zdHJpbmcod2VnLCA3OCwiR3J1bmQ6ICIsQlNfSU5ERU5UX09OQ0UpKTsKKworICByZXR1cm4gMTsKK30KKworc3RhdGljIHN0cmluZyB0aW1lZGlmZihpbnQgdGltZSkKK3sKKyAgc3RyaW5nIHJldDsKKworICByZXQ9IiI7CisgIGlmKHRpbWU+PTg2NDAwKSB7CisgICAgcmV0Kz10aW1lLzg2NDAwKyJkICI7CisgICAgdGltZSU9ODY0MDA7CisgIH0KKyAgaWYodGltZTwzNjAwMCkgcmV0Kz0iMCI7CisgIHJldCs9dGltZS8zNjAwKyI6IjsKKyAgdGltZSU9MzYwMDsKKyAgaWYodGltZTw2MDApIHJldCs9IjAiOworICByZXQrPXRpbWUvNjArIjoiOworICB0aW1lJT02MDsKKyAgaWYodGltZTwxMCkgcmV0Kz0iMCI7CisgIHJldCs9dGltZSsiIjsKKyAgcmV0dXJuIHJldDsKK30KKworCisvKiBFaW4gQmVmZWhsIHp1bSBhbnNjaGF1ZW4gZGVyIElkbGV6ZWl0IGFuZGVyZXIgU3BpZWxlciAqLworc3RhdGljIGludCBpZGxlemVpdChzdHJpbmcgcGxheWVyKQoreworCisgIG9iamVjdCBwbGF5ZXJfb2I7CisgIGludCBpZGxlOworCisgIGlmICggIXBsYXllciB8fCBwbGF5ZXI9PSIiIHx8IAorICAgICAgIHBsYXllcj09bG93ZXJzdHJpbmcodGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKFBfTkFNRSkpKQorICB7CisgICAgd3JpdGUgKCJEdSBiaXN0IHNlbGJlciBuYXR1ZXJsaWNoIGdlcmFkZSBuaWNodCBpZGxlLlxuIik7CisgICAgcmV0dXJuIDE7ICAKKyAgfQorCisgIC8vIFdlbGNoZXIgU3BpZWxlciBpc3QgZ2VtZWludD8KKyAgcGxheWVyX29iPWZpbmRfcGxheWVyKHBsYXllcik7CisKKyAgLy8gU3BpZWxlciBuaWNodCBkYSBvZGVyIEludmlzIHVuZCBBbmZyYWdlciBpcyBrZWluIE1hZ2llcgorICBpZiAoIXBsYXllcl9vYiB8fCAKKyAgICAgIChwbGF5ZXJfb2ItPlF1ZXJ5UHJvcChQX0lOVklTKSAmJiAhSVNfTEVBUk5FUih0aGlzX3BsYXllcigpKSkpIAorICB7CisgICAgd3JpdGUoY2FwaXRhbGl6ZShwbGF5ZXIpKyIgaXN0IGdlcmFkZSBuaWNodCBpbSBTcGllbC5cbiIpOworICAgIHJldHVybiAxOworICB9CisKKyAgaWRsZT1xdWVyeV9pZGxlKHBsYXllcl9vYik7CisKKyAgICAgICAgLy8gcGxheWVyX29iLT5OYW1lKCkgZ2lidCBiZWkgaW52aXMtTWFnaWVybiAiSmVtYW5kIiB6dXJ1ZWNrCisgIHdyaXRlIChwbGF5ZXJfb2ItPlF1ZXJ5UHJvcChQX05BTUUpKyIgaXN0ICIrCisgICAgICAgICAoaWRsZT49NjA/dGltZWRpZmYoaWRsZSk6Im5pY2h0IikrIiBwYXNzaXYuXG4iKTsKKworICByZXR1cm4gMTsKK30KKworCisvKiogQmVsZWJ0IGVpbmVuIG5ldHp0b3RlbiBTcGllbGVyIHdpZWRlci4KKyAgKiBSZWFrdGl2aWVydCBIZWFydGJlYXRzLCBiZXdlZ3QgZGVuIFNwaWVsZXIgenVydWVjayBhbiBkZW4gT3J0LCBkZXIgZWltCisgICogRWluc2NobGFmZW4genVtIEF1ZndhY2hlbiBlcm1pdHRlbHQgd3VyZGUgKGltIGVpbmZhY2hzdGVuIEZhbGwgZGVyIFJhdW0sCisgICogd28gbWFuIGVpbmdlc2NobGFmZW4gaXN0KS4KKyAgKi8KK3N0YXRpYyB2b2lkIG5kZWFkX3Jldml2ZSgpCit7CisgICAgc3RyaW5nIGZuYW1lOworICAgIGludCByZXQ7CisKKyAgICBzZXRfaGVhcnRfYmVhdCgxKTsKKyAgICBuZGVhZF9uZXh0X2NoZWNrID0gTkVUREVBRF9DSEVDS19USU1FOworICAgIG5kZWFkX2N1cnJlbnRseSA9IDA7CisgICAgbmRlYWRfbGFzdHRpbWUgPSAwOworCisgICAgaWYgKCAhb2JqZWN0cChuZGVhZF9sb2NhdGlvbikgJiYgCisgICAgICAgICBzdHJpbmdwKG5kZWFkX2xfZmlsZW5hbWUpICYmIHNpemVvZihuZGVhZF9sX2ZpbGVuYW1lKSkgeworICAgICAgICAKKyAgICAgICAgaWYgKCBtZW1iZXIoIG5kZWFkX2xfZmlsZW5hbWUsICcjJyApID09IC0xICl7CisgICAgICAgICAgICBjYXRjaChsb2FkX29iamVjdCggbmRlYWRfbF9maWxlbmFtZSk7IHB1Ymxpc2gpOworICAgICAgICAgICAgbmRlYWRfbG9jYXRpb24gPSBmaW5kX29iamVjdChuZGVhZF9sX2ZpbGVuYW1lKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG5kZWFkX2xvY2F0aW9uID0gZmluZF9vYmplY3QobmRlYWRfbF9maWxlbmFtZSk7CisgICAgICAgICAgICBpZiAoICFuZGVhZF9sb2NhdGlvbiAmJiBlbnZfbmRlYWRfaW5mbyApeworICAgICAgICAgICAgICAgIGZuYW1lID0gZXhwbG9kZSggbmRlYWRfbF9maWxlbmFtZSwgIiMiIClbMF07CisgICAgICAgICAgICAgICAgY2F0Y2gobmRlYWRfbG9jYXRpb24gPSAKKyAgICAgICAgICAgICAgICAgICAgKGxvYWRfb2JqZWN0KGZuYW1lKS0+U2V0UHJvcChQX05FVERFQURfSU5GTywgZW52X25kZWFkX2luZm8pKTsKKyAgICAgICAgICAgICAgICAgICAgcHVibGlzaCk7CisgICAgICAgICAgICAgICAgaWYgKCAhb2JqZWN0cChuZGVhZF9sb2NhdGlvbikgKXsKKyAgICAgICAgICAgICAgICAgICAgY2F0Y2gobG9hZF9vYmplY3QoIG5kZWFkX2xvY2F0aW9uKTtwdWJsaXNoKTsKKyAgICAgICAgICAgICAgICAgICAgbmRlYWRfbG9jYXRpb24gPSBmaW5kX29iamVjdChuZGVhZF9sb2NhdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCAhb2JqZWN0cChuZGVhZF9sb2NhdGlvbikKKyAgICAgICAgfHwgY2F0Y2gocmV0ID0gbW92ZSggbmRlYWRfbG9jYXRpb24sIE1fR098TV9TSUxFTlQgKTtwdWJsaXNoKSAKKyAgICAgICAgfHwgcmV0ICE9IDEgKSB7CisgICAgICAgIG1vdmUoICJnaWxkZW4vYWJlbnRldXJlciIsIE1fR098TV9TSUxFTlQgKTsKKyAgICAgICAgbmRlYWRfbG9jYXRpb24gPSBlbnZpcm9ubWVudCgpOworICAgIH0KKworICAgIC8vICBuZGVhZF9sb2NhdGlvbj0wOworICAgIG5kZWFkX2xfZmlsZW5hbWUgPSAwOworICAgIGVudl9uZGVhZF9pbmZvID0gMDsKK30KKworLyoqIEJld2VndCBlaW5lbiBuZXR6dG90ZW4gU3BpZWxlciBpbiBkZW4gTmV0enRvdGVucmF1bQorICAqIEdlcnVmZW4gdm9uIGhlYXJ0YmVhdCgpLgorICAqIFplcnN0b2VydCBHYWVzdGUsIHZlcmxhZXNzdCBnZ2YuIGRhcyBUZWFtLCBlcm1pdHRlbHQsIG9iIGRlciBTcGllbGVyIGJlaW0KKyAgKiBBdWZ3YWNoZW4gaW4gZGFzIGFsdGUgRW52aXJvbm1lbnQgYmV3ZWd0IHdlcmRlbiBzb2xsIG9kZXIgaW4gZWluZW4gYW5kZXJlbgorICAqIFJhdW0sIGhpZXJ6dSB3aXJkIGltIEVudmlyb25tZW50IFBfTkVUREVBRF9JTkZPIGFiZ2VmcmFndC4KKyAgKiBEZWFrdGl2aWVydCBkaWUgS29tbWFuZG9zIHBlciBkaXNhYmxlX2NvbW1hbmRzKCkuCisgICovCitzdGF0aWMgdm9pZCBuZGVhZF9tb3ZlX21lKCkgeworICBvYmplY3QgdGVhbTsKKyAgbWl4ZWQgYW1lbTsKKworICBzZXRfaGVhcnRfYmVhdCgwKTsKKyAgc3RvcF9oZWFydF9iZWF0cygpOworICBpZiAoUXVlcnlHdWVzdCgpKSB7CisgICAgcXVpdCgpOworICAgIGlmIChNRSkKKyAgICAgIHJlbW92ZSgpOworICAgIGlmIChNRSkKKyAgICAgIGRlc3RydWN0KE1FKTsKKyAgICByZXR1cm47CisgIH0KKyAgbmRlYWRfbmV4dF9jaGVjaz1ORVRERUFEX0NIRUNLX1RJTUU7CisgIG5kZWFkX2N1cnJlbnRseT0xOworICBuZGVhZF9sYXN0dGltZT0wOworICBuZGVhZF9sb2NhdGlvbj1lbnZpcm9ubWVudCgpOworICBpZiAob2JqZWN0cChuZGVhZF9sb2NhdGlvbikpCisgICAgbmRlYWRfbF9maWxlbmFtZT1vYmplY3RfbmFtZShuZGVhZF9sb2NhdGlvbik7CisgIAorICBpZiAob2JqZWN0cChlbnZpcm9ubWVudCgpKQorICAgICAgJiYgc2l6ZW9mKGV4cGxvZGUob2JqZWN0X25hbWUoZW52aXJvbm1lbnQoKSksIiMiKSkgPiAxKQorICAgIGVudl9uZGVhZF9pbmZvPWVudmlyb25tZW50KCktPlF1ZXJ5UHJvcChQX05FVERFQURfSU5GTyk7CisgIGVsc2UKKyAgICBlbnZfbmRlYWRfaW5mbz0wOworICAKKyAgaWYgKCBvYmplY3RwKHRlYW09UXVlcnkoUF9URUFNKSkgKQorICAgICAgLy8gRGVyIFRlc3QgYXVmIGFzc296aWllcnRlIFRlYW1taXRnbGllZGVyICg9PSBGb2xnZU5QQ3MpCisgICAgICAvLyB2ZXJoaW5kZXJ0LCBkYXNzIFNwaWVsZXIgbmFjaCAic2NobGFmZSBlaW4iIGF1cyBkZW0KKyAgICAgIC8vIFRlYW0gYXVzZ2V0cmFnZW4gd2VyZGVuLiAtLSAyOS4wMS4yMDAyIFRpYW1haworICAgICAgLy8gICAgICAmJiAhb2JqZWN0cChhbWVtPVF1ZXJ5KFBfVEVBTV9BU1NPQ19NRU1CRVJTKSkKKyAgICAgIC8vICAgICAgJiYgIShwb2ludGVycChhbWVtKSAmJiBzaXplb2YoYW1lbSkpKQorICAgIHRlYW0tPlJlbW92ZU1lbWJlcihNRSk7CisgIAorICBkaXNhYmxlX2NvbW1hbmRzKCk7CisgIG1vdmUoTkVUREVBRF9ST09NLE1fR098TV9OT19BVFRBQ0t8TV9OT0NIRUNLLCJpbnMgUmVpY2ggZGVyIE5ldHp0b3RlbiIpOworfQorCisvKiogSXN0IGRpZXNlciBDaGFyYWN0ZXIgZWluIEdhc3Q/CisgICogQHJldHVybiAxLCB3ZW5uIEdhc3QsIDAgc29uc3QuCisgICovCitpbnQgUXVlcnlHdWVzdCgpCit7CisgIHN0cmluZyBkdW1teTsKKyAgcmV0dXJuIHNzY2FuZihnZXR1aWQoKSwiZ2FzdCVkIixkdW1teSk7Cit9CisKKy8qKiBTcGllbGVya29tbWFuZG8gJ3NjaGxhZmUgZWluJy4KKyAgKiBSdWZ0IHJlbW92ZV9pbnRlcmFjdGl2ZSgpIGJlaSBTcGllbGVybiwgYmVpIE1hZ2llcm4gd2lyZCBxdWl0KCkgZ2VydWZlbiwKKyAgKiB1bSBkYXMgTWFnaWVyb2JqZWt0IHp1IHplcnN0b2VyZW4uCisgICogQHNhIHF1aXQoKQorICAqLworaW50IGRpc2Nvbm5lY3Qoc3RyaW5nIHN0cikKK3sgCisgIHN0cmluZyB2ZXJiOworICBzdHJpbmcgZGVzYyA9IGJyZWFrX3N0cmluZygKKyAgICAgICJcInNjaGxhZmUgZWluXCIgYmVlbmRldCBEZWluZSBWZXJiaW5kdW5nIG1pdCAiTVVETkFNRSIuIER1IGJlaGFlbHRzdCAiCisgICAgICJEZWluZSBTYWNoZW4uXG5GYWxscyAiTVVETkFNRSIgamVkb2NoIGFic3R1ZXJ6dCBvZGVyIG5ldSBnZXN0YXJ0ZXQgIgorICAgICAid2lyZCwgd2FlaHJlbmQgRHUgd2VnIGJpc3QsIHZlcmxpZXJzdCBEdSBkaWUgbWVpc3RlbiBhbGxlcmRpbmdzICIKKyAgICAgIihnZW5hdXNvLCBhbHMgd2VubiBEdSBEZWluZSBWZXJiaW5kdW5nIG1pdCBcImVuZGVcIiBiZWVuZGV0IGhhZXR0ZXN0KS4gIgorICAgICAiSW4gZGllc2VtIEZhbGwgYmVrb21tc3QgRHUgZGFubiBlaW5lIGtsZWluZSBFbnRzY2hhZWRpZ3VuZy4iCisgICAgICw3OCwwLEJTX0xFQVZFX01ZX0xGUyk7CisKKyAgdmVyYj1xdWVyeV92ZXJiKCk7CisgIGlmICghdmVyYikKKyAgICB2ZXJiPSJBVVRPQ0FMTCI7CisgIGlmICh2ZXJiWzAuLjVdPT0ic2NobGFmIiAmJiBzdHIhPSJlaW4iKQorICB7CisgICAgbm90aWZ5X2ZhaWwoZGVzYyk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKElTX0xFQVJORVIodGhpc19vYmplY3QoKSkpCisgICAgcmV0dXJuIHF1aXQoKTsKKyAgCisgIHRlbGxfb2JqZWN0KHRoaXNfb2JqZWN0KCksIGRlc2MpOworCisgIGlmIChjbG9uZXAoZW52aXJvbm1lbnQoKSkgJiYgIWVudmlyb25tZW50KCktPlF1ZXJ5UHJvcChQX05FVERFQURfSU5GTykpCisgICAgdGVsbF9vYmplY3QodGhpc19vYmplY3QoKSxicmVha19zdHJpbmcoCisgICAgICAgICJcbkFDSFRVTkc6IFdlbm4gRHUgaGllciBsYWVuZ2VyZSBaZWl0IHNjaGxhZWZzdCwgIgorICAgICAgICAia29tbXN0IER1IHZlcm11dGxpY2ggbmljaHQgYW4gZGllc2VuIE9ydCB6dXJ1ZWNrISIsNzgpKTsKKworICBzYXkoY2FwaXRhbGl6ZShuYW1lKFdFUikpKyIgaGF0IGdlcmFkZSBkaWUgVmVyYmluZHVuZyB6dSAiTVVETkFNRSIgZ2VrYXBwdC5cbiIpOworICByZW1vdmVfaW50ZXJhY3RpdmUoTUUpOworICBjYWxsX291dCgjJ2NsZWFyX3RlbGxfaGlzdG9yeSw0KTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZmluZ2VyIChzdHJpbmcgc3RyKQoreworICBzdHJpbmcgcmV0OworICBtaXhlZCB4bmFtZTsKKworICBpZiAoIXN0ciB8fCBzdHI9PSIiCisgICAgICB8fCBzaXplb2YoZXhwbG9kZShzdHIsIiAiKS0oeyItbiIsIi1wIiwiLXMiLCItdiIsIi1hIn0pKT4xKQorICB7CisgICAgd3JpdGUoImZpbmdlciA8c3BpZWxlcm5hbWU+IG9kZXIgZmluZ2VyIDxzcGllbGVybmFtZUBtdWRuYW1lPlxuIisKKyAgICAgICJCaXR0ZSBudXIgZGVuIHJlaW5lbiBTcGllbGVybmFtZW4gdmVyd2VuZGVuLCBrZWluZSBOYW1lbnN2b3JzYWV0emUgb2RlciBUaXRlbFxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgeG5hbWU9ZXhwbG9kZShzdHIsIkAiKTsKKyAgaWYoc2l6ZW9mKHhuYW1lKT09MikKKyAgeworICAgIGlmICh4bmFtZVswXT09Ii1uICIgfHwgeG5hbWVbMF09PSItcCAiIHx8IHhuYW1lWzBdPT0iLXMgIikgIHsKKyAgICAgIHdyaXRlKCJmaW5nZXIgPHNwaWVsZXJuYW1lPkA8bXVkbmFtZT4gLSBkZXIgU3BpZWxlcm5hbWUgZmVobHQuXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAocmV0PUlORVRELT5fc2VuZF91ZHAoeG5hbWVbMV0sKFsKKyAgICAgICAgICAgICAgICAgICBSRVFVRVNUOiAiZmluZ2VyIiwKKyAgICAgICAgICAgICAgICAgICBTRU5ERVI6IGdldHVpZChNRSksCisgICAgICAgICAgICAgICAgICAgREFUQTogKGV4cGxvZGUoeG5hbWVbMF0sIiAiKS0oeyItbiIsIi1wIiwiLXMifSkpWzBdCisgICAgICAgICAgICAgICAgICAgXSksIDEpKQorICAgICAgICAgICAgd3JpdGUocmV0KTsKKyAgICAgICAgZWxzZQorICAgICAgd3JpdGUoIkFuZnJhZ2UgYWJnZXNjaGlja3QuXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICAiL3AvZGFlbW9uL2ZpbmdlciItPmZpbmdlcl9zaW5nbGUoc3RyLDEpOworICByZXR1cm4gMTsKK30KKworc3RyaW5nIGxhbGlnbihzdHJpbmcgc3RyLCBpbnQgd2lkKQoreworICByZXR1cm4gKHN0cisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIisKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKVswLi53aWQtMV07Cit9CisKKyNkZWZpbmUgTVVEU19CQVIgIlwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisKK3ByaXZhdGUgdm9pZCBmb3JtYXQobWl4ZWQgbXVkLCBtaXhlZCBob3N0cywgc3RyaW5nIG91dHB1dCkKK3sKKyAgb3V0cHV0ICs9IGxhbGlnbihob3N0c1ttdWRdW0hPU1RfTkFNRV0sIDIwKSArICIgICIgKworICAgICAgICAoaG9zdHNbbXVkXVtIT1NUX1NUQVRVU10gPworICAgICAgICAgICBob3N0c1ttdWRdW0hPU1RfU1RBVFVTXSA+IDAgPworICAgICAgICAgICAgICJVUCAgICAgICAiICsgY3RpbWUoaG9zdHNbbXVkXVtIT1NUX1NUQVRVU10pWzQuLjE1XSA6CisgICAgICAgICAgICAgIkRPV04gICAgICIgKyBjdGltZSgtaG9zdHNbbXVkXVtIT1NUX1NUQVRVU10pWzQuLjE1XQorICAgICAgICAgOiAiVU5LTk9XTiAgTmV2ZXIgYWNjZXNzZWQuIikgKyAiXG4iOworfQorCitzdGF0aWMgaW50IG11ZHMoKSB7CisgIG1hcHBpbmcgaG9zdHM7CisgIGludCBpOworICBtaXhlZCBtdWRzLCBvdXRwdXQ7CisKKyAgb3V0cHV0ID0gbGFsaWduKCJNdWRuYW1lIiwgMjApICsgIiAgU3RhdHVzICAgTGFzdCBhY2Nlc3MiOworICBvdXRwdXQgKz0gIlxuIiArIE1VRFNfQkFSWzAuLnNpemVvZihvdXRwdXQpXSArICJcbiI7CisgIG11ZHMgPSBzb3J0X2FycmF5KG1faW5kaWNlcyhob3N0cyA9IElORVRELT5xdWVyeSgiaG9zdHMiKSksIyc+KTsKKyAgbWFwKG11ZHMsICMnZm9ybWF0LCBob3N0cywgJm91dHB1dCk7CisgIE1vcmUob3V0cHV0KTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vICoqKiogbG9jYWwgcHJvcGVydHkgbWV0aG9kcworc3RhdGljIGludCBfc2V0X2xldmVsKGludCBpKQoreworICBpZiAoIWludHAoaSkpIHJldHVybiAtMTsKKyAgaWYgKGk8MSkgcmV0dXJuIC0xOworICBTZXQoUF9MRVZFTCwgaSk7CisgIEdNQ1BfQ2hhciggKFtQX0xFVkVMOiBpXSkgKTsKKyAgcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQgX3NldF9pbnZpcyhpbnQgYSkKK3sKKyAgcmV0dXJuIFNldChQX0lOVklTLCBpbnRwKGEpID8gYSA6ICFRdWVyeShQX0lOVklTKSk7Cit9CisKKy8qIHNldHMgdGhlIHRlcm1pbmFsIHR5cGUgKi8KKy8qIG5vdGU6IHN1cHBvcnQgdnQxMDAgKGIvdyksIGFuc2kgKGNvbG9yKSwgZHVtYiAobm9uZSkgKi8KK3N0YXRpYyBzdHJpbmcgX3NldF90dHkoc3RyaW5nIHN0cikgeworICBpZihzdHIgIT0gImR1bWIiICYmIHN0ciAhPSAidnQxMDAiICYmIHN0ciAhPSAiYW5zaSIpCisgICAgcmV0dXJuIFF1ZXJ5KFBfVFRZKTsKKyAgcmV0dXJuIFNldChQX1RUWSwgc3RyKTsKK30KKworc3RhdGljIGludCBzdHR5KHN0cmluZyBzdHIpCit7CisgIGlmKHN0ciE9ImR1bWIiJiZzdHIhPSJ2dDEwMCImJnN0ciE9ImFuc2kiJiZzdHIhPSJyZXNldCIpCisgIHsKKyAgICB3cml0ZSgiS29tbWFuZG86IHN0dHkgZHVtYnx2dDEwMHxhbnNpIG9kZXIgcmVzZXRcbiIpOworICB9CisgIGlmKHN0ciA9PSAicmVzZXQiKSB7CisgICAgICBwcmludGYoIhtbMzA7NDdtG1swbURpZXNlciBUZXh0IHNvbGx0ZSBsZXNiYXIgc2VpbiFcbiIpOworICAgICAgcmV0dXJuIDE7CisgIH0KKworICB3cml0ZSgiVFRZIHN0ZWh0IGpldHp0IGF1ZiAiK1NldFByb3AoUF9UVFksc3RyKSsiLlxuIik7CisgIGlmKHN0ciA9PSAiYW5zaSIgfHwgc3RyID09ICJ2dDEwMCIpIHsKKyAgICAgIHByaW50ZigiVGVybWluYWwgVGVzdDpcbiIpOworICAgICAgcHJpbnRmKCJWVDEwMDogG1sxbWZldHQbWzBtIBtbNG11bnRlcnN0cmljaGVuG1swbSAiKworICAgICAgICAgICAgICIbWzVtYmxpbmtlbmQbWzBtIBtbN21pbnZlcnMbWzBtXG4iKTsKKyAgICAgIGlmKHN0ciA9PSAiYW5zaSIpIHsKKyAgICAgICAgICBwcmludGYoIkFOU0kgRmFyYmVuIHVuZCBWVDEwMCBBdHRyaWJ1dGU6XG4iKTsKKyAgICAgICAgICBmb3JlYWNoKGludCBmZzogMzAgLi4gMzcpIHsKKyAgICAgICAgICAgICAgZm9yZWFjaChpbnQgYmc6IDQwIC4uIDQ3KSB7CisgICAgICAgICAgICAgICAgICBwcmludGYoIhtbJWQ7JWRtG1sxbUAbWzBtIiwgZmcsIGJnKTsKKyAgICAgICAgICAgICAgICAgIHByaW50ZigiG1slZDslZG0bWzRtQBtbMG0iLCBmZywgYmcpOworICAgICAgICAgICAgICAgICAgcHJpbnRmKCIbWyVkOyVkbRtbNW1AG1swbSIsIGZnLCBiZyk7CisgICAgICAgICAgICAgICAgICBwcmludGYoIhtbJWQ7JWRtG1s3bUAbWzBtIiwgZmcsIGJnKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgICAgfQorICAgICAgICAgIHByaW50ZigiU29sbHRlIGRpZXNlciBUZXh0IGhpZXIgbmljaHQgcmljaHRpZyBsZXNiYXJcbnNlaW4sIisKKyAgICAgICAgICAgICAgICAgImJlbnV0emUgZGFzIEtvbW1hbmRvIHN0dHkgcmVzZXQhXG4iKTsKKyAgICAgIH0KKworICB9CisgIHJldHVybiAxOworfQorCitpbnQgc2V0X2FzY2lpX2FydChzdHJpbmcgc3RyKQoreworICBpZiAoc3RyIT0iZWluIiYmc3RyIT0iYXVzIikKKyAgeworICAgICBwcmludGYoIkR1IG1vZWNodGVzdCAnR3JhZmlrJyAiKyhRdWVyeVByb3AoUF9OT19BU0NJSV9BUlQpPyJOSUNIVCAiOiIiKSsKKyAgICAgICAgICAgICAgICAgICAgICJzZWhlbi5cbiIpOworICB9CisKKyAgaWYgKHN0cj09ImVpbiIpIHsKKyAgICBTZXRQcm9wKFBfTk9fQVNDSUlfQVJULCAwKTsKKyAgICBwcmludGYoIlp1a3VlbmZ0aWcgbW9lY2h0ZXN0IER1ICdHcmFmaWsnIHNlaGVuLlxuIik7CisgIH0KKworICBpZiAoc3RyPT0iYXVzIikgeworICAgIFNldFByb3AoUF9OT19BU0NJSV9BUlQsIDEpOworICAgIHByaW50ZigiWnVrdWVuZnRpZyBtb2VjaHRlc3QgRHUgS0VJTkUgJ0dyYWZpaycgbWVociBzZWhlbi5cbiIpOworICB9CisKKworICByZXR1cm4gMTsKK30KKworaW50IF9zZXRfc2hlbGxfdmVyc2lvbihpbnQgYXJnKQoreworICBpZiAoIWludHAoYXJnKSkKKyAgICByZXR1cm4gLTE7CisgIFNldChQX1NIRUxMX1ZFUlNJT04sKHtRdWVyeVByb3AoUF9SQUNFKSxhcmd9KSk7CisgIHJldHVybiAxOworfQorCitpbnQgX3F1ZXJ5X3NoZWxsX3ZlcnNpb24oKQoreyAgIG1peGVkIHN2OworCisgICAgaWYgKCEoc3Y9UXVlcnkoUF9TSEVMTF9WRVJTSU9OKSkgfHwgIXBvaW50ZXJwKHN2KSB8fCBzaXplb2Yoc3YpIT0yIHx8CisgICAgICAgIHN2WzBdIT1RdWVyeVByb3AoUF9SQUNFKSB8fCAhaW50cChzdlsxXSkpCisgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gc3ZbMV07Cit9CisKKy8vIFh4WHhYeFh4WHgKKworaW50IG1vcmUoc3RyaW5nIHN0cikKK3sKKyAgaWYoIXN0cikKKyAgeworICAgIG5vdGlmeV9mYWlsKCJVc2FnZTogbW9yZSA8ZmlsZT5cbiIpOworICAgIHJldHVybiAwOworICB9CisgIGlmIChmaWxlX3NpemUoc3RyKSA8PSAwKSB7CisgICAgbm90aWZ5X2ZhaWwoc3RyKyI6IE5vIHN1Y2ggZmlsZVxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgTW9yZShzdHIsIDEpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBzZXRfdmlzdWFsYmVsbChzdHJpbmcgc3RyKQoreworICBpZighc3RyKQorICB7CisgICAgd3JpdGUoIkRlcnplaXRpZ2UgRWluc3RlbGx1bmcgZnVlciBUb25hdXNnYWJlOiAiKworICAgICAgICAgKFF1ZXJ5UHJvcChQX1ZJU1VBTEJFTEwpPyJBVVMiOiJFSU4iKSsiLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKHN0cj09ImVpbiIpCisgIHsKKyAgICBpZighUXVlcnlQcm9wKFBfVklTVUFMQkVMTCkpCisgICAgICB3cml0ZSgiRGllIFRvbmF1c2dhYmUgc3RhbmQgc2Nob24gYXVmIEVJTi5cbiIpOworICAgIGVsc2UKKyAgICAgIHsKKyAgU2V0UHJvcChQX1ZJU1VBTEJFTEwsMCk7CisgICAgICAgIHdyaXRlKCJPSywgVG9uYXVzZ2FiZSBhdWYgRUlOIGdlc3RlbGx0LlxuIik7CisgICAgICB9CisgIH0KKyAgZWxzZQorICAgIGlmIChzdHI9PSJhdXMiKQorICAgIHsKKyAgICAgIGlmKFF1ZXJ5UHJvcChQX1ZJU1VBTEJFTEwpKQorICAgICAgICB3cml0ZSgiRGllIFRvbmF1c2dhYmUgc3RhbmQgc2Nob24gYXVmIEFVUy5cbiIpOworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgU2V0UHJvcChQX1ZJU1VBTEJFTEwsMSk7CisgICAgd3JpdGUoIk9LLCBUb25hdXNnYWJlIGF1ZiBBVVMgZ2VzdGVsbHQuXG4iKTsKKyAgfQorICAgIH0KKyAgICBlbHNlCisgICAgICB3cml0ZSgiU3ludGF4OiB0b24gW2VpbnxhdXNdXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc2V0X3NjcmVlbnNpemUoc3RyaW5nIHN0cikKK3sKKyAgaW50IHNpemU7CisKKyAgaWYgKHN0ciAmJiAoc3RyWzAuLjJdID09ICJhYnMiIHx8IHN0clswLi4yXT09InJlbCIpKSB7CisgICAgc2l6ZSA9IFF1ZXJ5UHJvcChQX01PUkVfRkxBR1MpOworICAgIGlmIChzdHJbMC4uMl0gPT0gImFicyIpIHsKKyAgICAgIHNpemUgfD0gRV9BQlM7CisgICAgICB3cml0ZSgiRXMgd2lyZCBiZWltIFByb21wdCBkaWUgWmVpbGVuemFobCBkZXMgVGV4dGVzIGFuZ2VnZWJlbi5cbiIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHNpemUgJj0gfkVfQUJTOworICAgICAgd3JpdGUoIkVzIHdpcmQgYmVpbSBQcm9tcHQgZGVyIHByb3plbnR1YWxlIEFudGVpbCBkZXMgVGV4dGVzIGFuZ2VnZWJlbi5cbiIpOworICAgIH0KKyAgICBTZXRQcm9wKFBfTU9SRV9GTEFHUywgc2l6ZSk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBpZiAoIHN0ciAmJiAoc3RyPT0iYXV0byIgfHwgc3NjYW5mKCBzdHIsICJhdXRvICVkIiwgc2l6ZSApKSApeworICAgICAgaWYgKCBzaXplID4gMCApeworICAgICAgICAgIHdyaXRlKCJVbmd1ZWx0aWdlciBXZXJ0ISAiCisgICAgICAgICAgICAgICAgIkluIFZlcmJpbmR1bmcgbWl0ICdhdXRvJyBzaW5kIG51ciBuZWdhdGl2ZSBXZXJ0ZSBlcmxhdWJ0LlxuIik7CisgICAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisKKyAgICAgIFNldFByb3AoIFBfU0NSRUVOU0laRSwgc2l6ZS0xICk7CisKKyAgICAgIHdyaXRlKCJPaywgRGVpbmUgWmVpbGVuemFobCB3aXJkIG51biBhdXRvbWF0aXNjaCBlcm1pdHRlbHQgKGRlcnplaXQgIisKKyAgICAgICAgICAgIFF1ZXJ5UHJvcChQX1NDUkVFTlNJWkUpKyIpLlxuIisKKyAgICAgICAgICAgIGJyZWFrX3N0cmluZygiQml0dGUgYmVhY2h0ZSwgZGFzcyBkaWVzIG51ciBlaW53YW5kZnJlaSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImZ1bmt0aW9uaWVydCwgd2VubiBEZWluIENsaWVudCBUZWxuZXRuZWdvdGlhdGlvbnMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJ1bnRlcnN0dWV0enQgKHNpZWhlIGF1Y2ggXCJoaWxmZSB0ZWxuZWdzXCIpLiIpICk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBpZiAoICFzdHIgfHwgc3RyPT0iIiB8fCAhc3NjYW5mKCBzdHIsICIlZCIsIHNpemUgKSB8fCBzaXplIDwgMCB8fCBzaXplID4gMTAwKXsKKyAgICAgIHdyaXRlKGJyZWFrX3N0cmluZygKKyAgICAgICAgICAgIHNwcmludGYoIk1pdCBkZW0gQmVmZWhsICd6ZWlsZW4gPGdyb2Vzc2U+JyBrYW5uc3QgRHUgZWluc3RlbGxlbiwgIgorICAgICAgICAgICAgIndpZXZpZWxlIFplaWxlbiBiZWkgbWVocnNlaXRpZ2VuIFRleHRlbiBhdWYgZWlubWFsIGF1c2dlZ2ViZW4gIgorICAgICAgICAgICAgIndlcmRlbi4gRGllIGFuZ2VnZWJlbmUgR3JvZXNzZSBtdXNzIHp3aXNjaGVuIDAgdW5kIDEwMCBsaWVnZW4uICIKKyAgICAgICAgICAgICJCZWkgR3JvZXNzZSAwIHdpcmQgZWluZmFjaCBhbGxlcyBhdXNnZWdlYmVuIChvaG5lIFBhdXNlKS4gTWl0ICIKKyAgICAgICAgICAgICJkZXIgRWluc3RlbGx1bmcgJ2F1dG8nIHdpcmQgZGllIEdyb2Vzc2UgYXV0b21hdGlzY2ggdWViZXIgIgorICAgICAgICAgICAgImRpZSBUZWxuZXRuZWdvdGlhdGlvbnMgZXJtaXR0ZWx0IChzaWVoZSBhdWNoICdoaWxmZSB0ZWxuZWdzJykuICIKKyAgICAgICAgICAgICJVbSBuYWNoIGVpbmVyIFNlaXRlIFRleHQgbm9jaCBldHdhcyBQbGF0eiB6dSBoYWJlbiwga2FubiBtYW4gei5CLiAiCisgICAgICAgICAgICAiJ3plaWxlbiBhdXRvIC0zJyBlaW5zdGVsbGVuLlxuIgorICAgICAgICAgICAgIkRpZSBWb3JlaW5zdGVsbHVuZyBpc3QgMjAgWmVpbGVuLlxuIgorICAgICAgICAgICAgIk1pdCAnemVpbGVuIGFic1tvbHV0XScgdW5kICd6ZWlsZW4gcmVsW2F0aXZdJyBrYW5uc3QgRHUgZmVzdCIKKyAgICAgICAgICAgICJsZWdlbiwgb2IgaW0gUHJvbXB0IGJlaSBsYW5nZW4gVGV4dGVuIGRpZSBha3R1ZWxsZSBaZWlsZW5udW1tZXIgIgorICAgICAgICAgICAgIm9kZXIgZWluZSBwcm96ZW50dWFsZSBBbmdhYmUgYXVzZ2VnZWJlbiB3aXJkLlxuIgorICAgICAgICAgICAgIkRlaW5lIGFrdHVlbGxlIEVpbnN0ZWxsdW5nIGlzdCAlZCVzIFplaWxlbiAoJXMpLiIsCisgICAgICAgICAgICBRdWVyeVByb3AoUF9TQ1JFRU5TSVpFKSwKKyAgICAgICAgICAgIFF1ZXJ5KFBfU0NSRUVOU0laRSkgPCAwID8gIiAnYXV0b21hdGlzY2hlJyIgOiAiIiwKKyAgICAgICAgICAgIFF1ZXJ5UHJvcChQX01PUkVfRkxBR1MpICYgRV9BQlMgPyAiYWJzb2x1dCIgOiAicmVsYXRpdiIpLDc4LDAsMSkpOworICAgIHJldHVybiAxOworICB9CisKKyAgU2V0UHJvcCggUF9TQ1JFRU5TSVpFLCBzaXplICk7CisKKyAgcHJpbnRmKCAiT2theSwgRGVpbmUgWmVpbGVuemFobCBzdGVodCBudW4gYXVmICVkLlxuIiwgc2l6ZSApOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfcXVlcnlfc2NyZWVuc2l6ZSgpCit7CisgICAgaW50IHN6LHJvd3M7CisKKyAgICBpZiAoIChzej1RdWVyeShQX1NDUkVFTlNJWkUpKSA+PSAwICkKKyAgICAgICAgcmV0dXJuIHN6OworCisgICAgaWYgKCAhcm93cz1RdWVyeVByb3AoUF9UVFlfUk9XUykgKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiAocm93cys9c3opID49IDUgPyByb3dzIDogNTsKK30KKworc3RhdGljIGludCBwcmVzYXkoc3RyaW5nIHN0cikKK3sKKyAgaWYgKCFzdHI9X3VucGFyc2VkX2FyZ3MoKSkKKyAgICB3cml0ZSgiRGVpbiBQcmVzYXkgaXN0IGpldHp0IGdlbG9lc2NodC5cbiIpOworICBlbHNlCisgICAgcHJpbnRmKCJEZWluIFByZXNheSBsYXV0ZXQgamV0enQ6IFwiJXNcIi5cbiIsc3RyPWNhcGl0YWxpemUoc3RyKSk7CisgIFNldFByb3AoUF9QUkVTQVksc3RyKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc2V0aGFuZHMoc3RyaW5nIHN0cikKK3sKKyAgbWl4ZWQgKmhhbmRzOworCisgIGlmICghKHN0cj1fdW5wYXJzZWRfYXJncygpKSkKKyAgeworICAgIHdyaXRlKCJzZXRoYW5kcyA8bWVzc2FnZT5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIGlmIChzdHI9PSIwIikKKyAgICAgIGhhbmRzPVJhY2VEZWZhdWx0KFBfSEFORFMpOworICBpZiAoIWhhbmRzIHx8ICFwb2ludGVycChoYW5kcykpCisgICAgICBoYW5kcz1RdWVyeShQX0hBTkRTKTsKKyAgaGFuZHNbMF09IiAiK3N0cjsKKyAgU2V0KFBfSEFORFMsaGFuZHMpOworICB3cml0ZSgiT2suXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgaW5mb3JtKHN0cmluZyBzdHIpCit7CisgIHN3aXRjaCAoc3RyKSB7CisgICAgY2FzZSAib24iOgorICAgIGNhc2UgImVpbiI6CisgICAgY2FzZSAiYW4iOgorICAgICAgaWYgKFF1ZXJ5KFBfSU5GT1JNTUUpKQorICAgIHdyaXRlKCJEYXMgaGF0dGVzdCBEdSBzY2hvbiBzbyBlaW5nZXN0ZWxsdC5cbiIpOworICAgICAgZWxzZQorICAgICAgeworICAgIHdyaXRlKCJLdWVuZnRpZyB3aXJzdCBEdSBpbmZvcm1pZXJ0LCB3ZW5uIGplbWFuZCBkYXMgIk1VRE5BTUUiIHZlcmxhZXNzdC9iZXRyaXR0LlxuIik7CisgICAgU2V0KFBfSU5GT1JNTUUsMSk7CisgICAgICB9CisgICAgICByZXR1cm4gMTsKKyAgICBjYXNlICJhdXMiOgorICAgIGNhc2UgIm9mZiI6CisgICAgICBpZiAoIVF1ZXJ5KFBfSU5GT1JNTUUpKQorICAgIHdyaXRlKCJEYXMgaGF0dGVzdCBEdSBzY2hvbiBzbyBlaW5nZXN0ZWxsdC5cbiIpOworICAgICAgZWxzZQorICAgICAgeworICAgIHdyaXRlKCJPay5cbiIpOworICAgIFNldChQX0lORk9STU1FLDApOworICAgICAgfQorICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSAwOgorICAgICAgd3JpdGUoIkluZm9ybS1Nb2RlIGlzdCAiKyhRdWVyeShQX0lORk9STU1FKT8iYW4iOiJhdXMiKSsiZ2VzY2hhbHRldC5cbiIpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB3cml0ZSgiaW5mb3JtIGFuIG9kZXIgaW5mb3JtIGF1cywgYml0dGUuXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgZGVsYXllZF93cml0ZShtaXhlZCAqd2hhdCkKK3sKKyAgaWYgKCFwb2ludGVycCh3aGF0KXx8IXNpemVvZih3aGF0KXx8IXBvaW50ZXJwKHdoYXRbMF0pKQorICAgIHJldHVybjsKKyAgdGVsbF9vYmplY3QoTUUsd2hhdFswXVswXSk7CisgIGlmIChzaXplb2Yod2hhdCk+MSYmc2l6ZW9mKHdoYXRbMF0pPjEpCisgICAgY2FsbF9vdXQoImRlbGF5ZWRfd3JpdGUiLHdoYXRbMF1bMV0sd2hhdFsxLi5dKTsKK30KKwordm9pZCBub3RpZnlfcGxheWVyX2NoYW5nZShzdHJpbmcgd2hvLCBpbnQgcmVpbiwgaW50IGludmlzKQoreworICBzdHJpbmcgKmxpc3QsbmFtZTsKKyAgbWl4ZWQgbWxpc3Q7CisKKyAgaWYgKGludmlzKSBuYW1lPSIoIit3aG8rIikiOworICAgIGVsc2UgbmFtZT13aG87CisKKyAgaWYgKFF1ZXJ5KFBfSU5GT1JNTUUpKQorICB7CisgICAgICBpZiAocmVpbikKKyAgICAgICAgdGVsbF9vYmplY3QoTUUsbmFtZSsiIGlzdCBnZXJhZGUgaW5zICJNVUROQU1FIiBnZWtvbW1lbi5cbiIpOworICAgICAgZWxzZQorICAgICAgICB0ZWxsX29iamVjdChNRSxuYW1lKyIgaGF0IGdlcmFkZSBkYXMgIk1VRE5BTUUiIHZlcmxhc3Nlbi5cbiIpOworICB9CisKKyAgaWYoUXVlcnkoUF9XQUlURk9SX0ZMQUdTKSAmICgweDAxKSlyZXR1cm4gOworCisgIGlmKHBvaW50ZXJwKGxpc3Q9UXVlcnkoUF9XQUlURk9SKSkgJiYgc2l6ZW9mKGxpc3QpICYmIG1lbWJlcihsaXN0LHdobykhPS0xKQorICB7CisgICAgaWYgKCFRdWVyeVByb3AoUF9WSVNVQUxCRUxMKSkKKyAgICAgICAgbmFtZSs9c3ByaW50ZigiJWMiLDcpOyAvLyBDaGFyIGZ1ZXIgUGllcHMgYW4gZGVuIFN0cmluZyBhbmhhZW5nZW4uCisgICAgLy8gTW9lY2h0ZSBkZXIgU3BpZWxlciBrZWluZSBBU0NJSS1HcmFmaWsgc2VoZW4sIHdpcmQgZGllc2UgTWVsZHVuZyBvaG5lCisgICAgLy8gTGVlcnplaWNoZW4gZm9ybWF0aWVydCwgc28gZGFzcyBzaWUgdm9uIFNjcmVlbnJlYWRlcm4gdm9yZ2VsZXNlbiB3aXJkLgorICAgIC8vIEFuZGVyZW5mYWxscyB3dWVyZGUgc2llIGVpbnplbG4gYnVjaHN0YWJpZXJ0LgorICAgIGlmICggUXVlcnlQcm9wKFBfTk9fQVNDSUlfQVJUKSApCisgICAgeworICAgICAgZGVsYXllZF93cml0ZSggKHsgKHsgc3ByaW50ZigiJXMgSVNUIEpFVFpUICVzREEgISEhXG4iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIChyZWluPyIiOiJOSUNIVCBNRUhSICIpKSB9KSB9KSApOworICAgIH0KKyAgICBlbHNlIAorICAgIHsKKyAgICAgIGRlbGF5ZWRfd3JpdGUoICh7ICh7IHNwcmludGYoIiVzICAgSSBTIFQgICBKIEUgVCBaIFQgICAlc0QgQSAhISFcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCAocmVpbj8iIjoiTiBJIEMgSCBUICAgTSBFIEggUiAgICIpKSB9KSB9KSApOworICAgIH0KKyAgfQorCisgIGlmIChyZWluICYmIChzaXplb2YobWxpc3Q9UXVlcnlQcm9wKFBfV0FJVEZPUl9SRUFTT04pKSkgJiYKKyAgICAgKG1hcHBpbmdwKG1saXN0KSkgJiYgKG1saXN0W3dob10pKQorICAgICAgICBTaG93X1dhaXRGb3JfUmVhc29uKHdobyxpbnZpcyk7Cit9CisKK3N0YXRpYyBpbnQgZXJ3YXJ0ZShzdHJpbmcgc3RyKQoreworICBzdHJpbmcgKmxpc3QsKnN0cjE7CisgIG1peGVkIG1saXN0OworICBpbnQgaTsKKworICBpZiAoIW1hcHBpbmdwKG1saXN0PVF1ZXJ5UHJvcChQX1dBSVRGT1JfUkVBU09OKSkpCisgICAgIG1saXN0PShbXSk7CisgIGlmICghcG9pbnRlcnAobGlzdD1RdWVyeShQX1dBSVRGT1IpKSkKKyAgICAgbGlzdD0oe30pOworCisgIGlmICghc3RyIHx8IHN0cj09Ii11IikKKyAgeworICAgICBpZihRdWVyeShQX1dBSVRGT1JfRkxBR1MpJjB4MDEpCisgICAgICAgd3JpdGUoIkR1IGhhc3QgJ2Vyd2FydGUnIHRlbXBvcmFlciBkZWFrdGl2aWVydC5cbiIpOworICAgICB3cml0ZSgiRHUgZXJ3YXJ0ZXN0IGpldHp0Iik7CisgICAgIGlmICghc2l6ZW9mKGxpc3QpKQorICAgICAgICB3cml0ZSgiIG5pZW1hbmRlbiBtZWhyLlxuIik7CisgICAgIGVsc2UKKyAgICAgeworICAgICAgICB3cml0ZSgiOlxuIik7CisgICAgICAgIGlmICghc3RyKSBsaXN0PXNvcnRfYXJyYXkobGlzdCwjJz4pOworICAgICAgICBNb3JlKGJyZWFrX3N0cmluZyhDb3VudFVwKGxpc3QpLDc4KSk7CisgICAgIH0KKyAgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYoc3RyPT0iYXVzIil7CisgICAgU2V0KFBfV0FJVEZPUl9GTEFHUyxRdWVyeShQX1dBSVRGT1JfRkxBR1MpfDB4MDEpOworICAgIHdyaXRlKCJFcndhcnRlIGlzdCBqZXR6dCBkZWFrdGl2aWVydC5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIGlmKHN0cj09ImFuIiB8fCBzdHI9PSJlaW4iKXsKKyAgICBTZXQoUF9XQUlURk9SX0ZMQUdTLFF1ZXJ5KFBfV0FJVEZPUl9GTEFHUykmMHhGRSk7CisgICAgd3JpdGUoIkVyd2FydGUgaXN0IGpldHp0IGFrdGl2LlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBzdHIxPWV4cGxvZGUoX3VucGFyc2VkX2FyZ3MoKXx8IiIsIiAiKTsKKyAgaWYgKHNpemVvZihzdHIxKT09MSkKKyAgeworICAgICBpZiAoc3RyMVswXSE9IndlZ2VuIikKKyAgICAgeworICAgICAgICBzdHI9Y2FwaXRhbGl6ZShsb3dlcl9jYXNlKHN0cikpOworICAgICAgICBpZiAobWVtYmVyKGxpc3Qsc3RyKSE9LTEpCisgICAgICAgIHsKKyAgICAgICAgICAgU2V0UHJvcChQX1dBSVRGT1JfUkVBU09OLG1fY29weV9kZWxldGUobWxpc3Qsc3RyKSk7CisgICAgICAgICAgIGxpc3QtPSh7c3RyfSk7CisgICAgICAgICAgIHdyaXRlKHN0cisiIGF1cyBkZXIgTGlzdGUgZW50ZmVybnQuXG4iKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgaWYgKHNpemVvZihsaXN0KT4xMDAwKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgd3JpdGUoIkR1IGVyd2FydGVzdCBzY2hvbiBnZW51ZWdlbmQhXG4iKTsKKyAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBsaXN0Kz0oe3N0cn0pOworICAgICAgICAgICB3cml0ZShzdHIrIiBhbiBkaWUgTGlzdGUgYW5nZWhhZW5ndC5cbiIpOworICAgICAgICB9CisgICAgICAgIFNldChQX1dBSVRGT1IsbGlzdCk7CisgICAgIH0KKyAgICAgZWxzZQorICAgICB7CisgICAgICAgIGlmIChzaXplb2YobWxpc3QpICYmIHNpemVvZihsaXN0PW1faW5kaWNlcyhtbGlzdCkpKQorICAgICAgICB7CisgICAgICAgICAgIHdyaXRlKCJEdSBlcndhcnRlc3QgYXVzIGVpbmVtIGJlc3RpbW10ZW4gR3J1bmQ6XG4iKTsKKyAgICAgICAgICAgd3JpdGUoYnJlYWtfc3RyaW5nKENvdW50VXAoc29ydF9hcnJheShsaXN0LCMnPikpKyIuIiw3OCkpOworICAgICAgICB9CisgICAgICAgIGVsc2Ugd3JpdGUoIkR1IGVyd2FydGVzdCBuaWVtYW5kZW4gYXVzIGVpbmVtIGJlc3RpbW10ZW4gR3J1bmQuXG4iKTsKKyAgICAgfQorICAgICByZXR1cm4gMTsKKyAgfQorICBub3RpZnlfZmFpbCgiRmFsc2NoZSBTeW50YXgsIHNpZWhlICdoaWxmZSBlcndhcnRlJyFcbiIpOworICBpZiAoc3RyMVsxXSE9IndlZ2VuIikgcmV0dXJuIDA7CisgIGlmIChzaXplb2Yoc3RyMSk9PTIpCisgICAgIFNob3dfV2FpdEZvcl9SZWFzb24oY2FwaXRhbGl6ZShsb3dlcl9jYXNlKHN0cjFbMF0pKSwwKTsKKyAgZWxzZSB7CisgICAgIHN0cmluZyBzPWNhcGl0YWxpemUobG93ZXJfY2FzZShzdHIxWzBdKSk7CisgICAgIGlmIChzaXplb2Yoc3RyMSk9PTMgJiYgKHN0cjFbMl09PSJuaWNodHMiIHx8IHN0cjFbMl09PSJsb2VzY2hlbiIpKQorICAgICAgICBpZiAoIW1saXN0W3NdKQorICAgICAgICAgICB3cml0ZSgiRHUgaGFzdCAiK3MrIiBhdXMga2VpbmVtIGJlc3RpbW10ZW4gR3J1bmQgZXJ3YXJ0ZXQhXG4iKTsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgIFNldFByb3AoUF9XQUlURk9SX1JFQVNPTixtX2NvcHlfZGVsZXRlKG1saXN0LHMpKTsKKyAgICAgICAgICAgd3JpdGUoIkR1IGVyd2FydGVzdCAiK3MrIiBhdXMga2VpbmVtIGJlc3RpbW10ZW4gR3J1bmQgbWVociFcbiIpOworICAgICAgICB9CisgICAgIGVsc2UKKyAgICAgeworICAgICAgICBpZiAoSVNfQVJDSChNRSkpIGk9ODA7IGVsc2UgaWYgKElTX0xFQVJORVIoTUUpKSBpPTQwOworICAgICAgICBlbHNlIGlmIChJU19TRUVSKE1FKSkgaT0yMDsgZWxzZSBpPTEwOworICAgICAgICBpZiAoIW1saXN0W3NdICYmIHNpemVvZihtbGlzdCk+PWkpCisgICAgICAgICAgIHdyaXRlKCJTb3JyeSwgYWJlciBEdSBlcndhcnRlc3Qgc2Nob24gZ2VudWVnZW5kIExldXRlIVxuIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICBTZXRQcm9wKFBfV0FJVEZPUl9SRUFTT04sbWxpc3QrKFtzOmltcGxvZGUoc3RyMVsyLi5dLCIgIildKSk7CisgICAgICAgICAgIFNob3dfV2FpdEZvcl9SZWFzb24ocywwKTsKKyAgICAgICAgfQorICAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdWhybWVsZHVuZyhzdHJpbmcgc3RyKQoreworICBpZiAoIShzdHI9X3VucGFyc2VkX2FyZ3MoKSkpCisgIHsKKyAgICBzdHI9UXVlcnlQcm9wKFBfQ0xPQ0tNU0cpOworICAgIGlmICghc3RyKQorICAgIHsKKyAgICAgIHdyaXRlKCJEdSBoYXN0IGRpZSBTdGFuZGFyZC1VaHJtZWxkdW5nLlxuIik7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgICAgIGlmKCAhc3RyaW5ncChzdHIpICkgc3RyID0gc3ByaW50ZigiJU9cbiIsc3RyKTsKKyAgICBwcmludGYoIkRlaW5lIFVocm1lbGR1bmcgaXN0OlxuJXNcbiIsc3RyWzAuLjwyXSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKHN0cj09IjAiKQorICB7CisgICAgU2V0UHJvcChQX0NMT0NLTVNHLDApOworICAgIHdyaXRlKCJPaywgRHUgaGFzdCBqZXR6dCB3aWVkZXIgZGllIFN0YW5kYXJkLU1lbGR1bmcuXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoc2l6ZW9mKGV4cGxvZGUoc3RyLCIlZCIpKT4yKQorICB7CisgICAgd3JpdGUoIkZlaGxlciwgZXMgZGFyZiBudXIgZWluICVkIGluIGRlciBNZWxkdW5nIHZvcmtvbW1lbi5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIC8qIE1laHJlcmUgJS1QYXJhbWV0ZXIgdmVydXJzYWNoZW4gZGFzIEFic2NoYWx0ZW4gZGVyIFVociB6dXIgdm9sbGVuIFN0dW5kZS4KKyAgICovCisgIGlmIChzaXplb2YoZXhwbG9kZShzdHIsIiUiKSk+MikKKyAgeworICAgIHdyaXRlKCJGZWhsZXI6IFp1dmllbGUgJS1QYXJhbWV0ZXIgaW4gZGVyIE1lbGR1bmcuXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICAvKiBOdXIgZWluICUtUGFyYW1ldGVyLCBhYmVyIGRlciBmYWxzY2hlOiBuaWNodCBzaW5udm9sbC4gKi8KKyAgZWxzZQorICB7CisgICAgaW50IGkgPSBzdHJzdHIoc3RyLCIlIiwwKTsKKyAgICBpZiAoIGk+LTEgJiYgKCBpPT1zaXplb2Yoc3RyKS0xIHx8IHN0cltpKzFdIT0nZCcpKQorICAgIHsKKyAgICAgIHdyaXRlKCJGZWhsZXI6IEZhbHNjaGVyICUtUGFyYW1ldGVyIGluIGRlciBNZWxkdW5nLlxuIik7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKyAgc3RyKz0iXG4iOworICBTZXRQcm9wKFBfQ0xPQ0tNU0csc3RyKTsKKyAgd3JpdGUoIk9rLlxuIik7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHplaXR6b25lKHN0cmluZyBzdHIpCit7CisgIGludCB6dDsKKyAgaWYoIXN0ciB8fCBzdHI9PSIiKXsKKyAgICBpZighKHp0PVF1ZXJ5UHJvcChQX1RJTUVaT05FKSkpCisgICAgICB3cml0ZSgiRHUgaGFzdCBkZXJ6ZWl0IGRpZSBnbGVpY2hlIFplaXR6b25lIHdpZSBkYXMgIk1VRE5BTUUiICIrCisgICAgICAgICAgICAiZWluZ2VzdGVsbHQuXG4iKTsKKyAgICBlbHNlIGlmKHp0PjApCisgICAgICBwcmludGYoIkRlaW5lIFplaXR6b25lIGlzdCBhdWYgJWQgU3R1bmRlbiB2b3IgKG9lc3RsaWNoKSB2b24gQmVybGluICIrCisgICAgICAgICAgICAgImVpbmdlc3RlbGx0LlxuIix6dCk7CisgICAgZWxzZQorICAgICAgcHJpbnRmKCJEZWluZSBaZWl0em9uZSBpc3QgYXVmICVkIFN0dW5kZW4gbmFjaCAod2VzdGxpY2gpIHZvbiAiKworICAgICAgICAgICAgICJCZXJsaW4gZWluZ2VzdGVsbHQuXG4iLC16dCk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYoc3NjYW5mKHN0ciwidXRjICVkIix6dCk9PTEpICB6dD0oenQtMSklMjQ7CisgIGVsc2UgenQ9dG9faW50KHN0ciklMjQ7CisKKyAgU2V0UHJvcChQX1RJTUVaT05FLHp0KTsKKworICBpZighenQpCisgICAgd3JpdGUoIkR1IGhhc3QgZGVyemVpdCBkaWUgZ2xlaWNoZSBaZWl0em9uZSB3aWUgZGFzICJNVUROQU1FIiAiKworICAgICAgICAgICJlaW5nZXN0ZWxsdC5cbiIpOworICBlbHNlIGlmKHp0PjApCisgICAgcHJpbnRmKCJEZWluZSBaZWl0em9uZSBpc3QgYXVmICVkIFN0dW5kZW4gdm9yIChvZXN0bGljaCkgdm9uIEJlcmxpbiAiKworICAgICAgICAgICAiZWluZ2VzdGVsbHQuXG4iLHp0KTsKKyAgZWxzZQorICAgIHByaW50ZigiRGVpbmUgWmVpdHpvbmUgaXN0IGF1ZiAlZCBTdHVuZGVuIG5hY2ggKHdlc3RsaWNoKSB2b24gIisKKyAgICAgICAgICAgIkJlcmxpbiBlaW5nZXN0ZWxsdC5cbiIsLXp0KTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZW1haWxhbnplaWdlKHN0cmluZyBzdHIpeworICBub3RpZnlfZmFpbCgiU3ludGF4OiBlbWFpbGFuemVpZ2UgW2FsbGV8ZnJldW5kZXxuaWVtYW5kXVxuIik7CisgIGlmKCFzdHIgfHwgc3RyPT0iIil7CisgICAgaWYoIShzdHI9UXVlcnlQcm9wKFBfU0hPV0VNQUlMKSkpc3RyPSJOaWVtYW5kZW0iOworICAgIGVsc2UgaWYoc3RyPT0iYWxsZSIpc3RyPSJhbGxlbiI7CisgICAgZWxzZSBpZihzdHI9PSJmcmV1bmRlIilzdHI9IkRlaW5lbiBGcmV1bmRlbiI7CisgICAgZWxzZSBpZihzdHI9PSJuaWVtYW5kIilzdHI9Im5pZW1hbmRlbSI7CisgICAgZWxzZXsKKyAgICAgIFNldFByb3AoUF9TSE9XRU1BSUwsMCk7CisgICAgICBzdHI9Ik5pZW1hbmRlbSI7CisgICAgfQorICAgIHdyaXRlKCJEZWluZSBFbWFpbCB3aXJkICIrc3RyKyIgYW5nZXplaWd0LlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgZWxzZSBpZihtZW1iZXIoKHsiYWxsZSIsImZyZXVuZGUiLCJuaWVtYW5kIn0pLHN0cik9PS0xKXJldHVybiAwOworCisgIFNldFByb3AoUF9TSE9XRU1BSUwsc3RyKTsKKworICBpZihzdHI9PSJhbGxlIilzdHI9ImFsbGVuIjsKKyAgZWxzZSBpZihzdHI9PSJmcmV1bmRlIilzdHI9IkRlaW5lbiBGcmV1bmRlbiI7CisgIGVsc2Ugc3RyPSJuaWVtYW5kZW0iOworICB3cml0ZSgiRGVpbmUgRW1haWwgd2lyZCAiK3N0cisiIGFuZ2V6ZWlndC5cbiIpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCB6YXViZXJ0cmFlbmtlKCkKK3sKKyAgTW9yZSgiL3Jvb20vb3Jha2VsIi0+VGlwTGlzdGUoKSk7CisgIHJldHVybiAxOworfQorCit2YXJhcmdzIHN0YXRpYyBpbnQgYW5ncmlmZnNtZWxkdW5nKHN0cmluZyBhcmcpIHsKKyAgaWYgKGFyZz09ImVpbiIgfHwgYXJnPT0iYW4iKQorICAgIFNldFByb3AoUF9TSE9XX0FUVEFDS19NU0csMSk7CisgIGVsc2UgaWYgKGFyZz09ImF1cyIpCisgICAgU2V0UHJvcChQX1NIT1dfQVRUQUNLX01TRywwKTsKKyAgaWYgKFF1ZXJ5UHJvcChQX1NIT1dfQVRUQUNLX01TRykpCisgICAgd3JpdGUoIkR1IHNpZWhzdCBzYWVtdGxpY2hlIEFuZ3JpZmZzbWVsZHVuZ2VuIHZvbiBEaXIuXG4iKTsKKyAgZWxzZQorICAgIHdyaXRlKCJEdSBzaWVoc3QgbnVyIG5ldWUgQW5ncmlmZnNtZWxkdW5nZW4gdm9uIERpci5cbiIpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIG1peGVkIF9xdWVyeV9sb2NhbGNtZHMoKQoreworICByZXR1cm4gKHsoeyJ6ZWlsZW4iLCJzZXRfc2NyZWVuc2l6ZSIsMCwwfSksCisgICAgICAgICAgICh7ImVtYWlsIiwic2V0X2VtYWlsIiwwLDB9KSwKKyAgICAgICAgICAgKHsidXJsIiwic2V0X2hvbWVwYWdlIiwwLDB9KSwKKyAgICAgICAgICAgKHsiaWNxIiwic2V0X2ljcSIsMCwwfSksCisgICAgICAgICAgICh7Im1lc3NlbmdlciIsICJzZXRfbWVzc2VuZ2VyIiwgMCwgMH0pLCAKKyAgICAgICAgICAgKHsib3J0Iiwic2V0X2xvY2F0aW9uIiwwLDB9KSwKKyAgICAgICAgICAgKHsicHVua3RlIiwic2hvcnRfc2NvcmUiLDAsMH0pLAorICAgICAgICAgICAoeyJzY29yZSIsInNob3J0X3Njb3JlIiwwLDB9KSwKKyAgICAgICAgICAgKHsiaW5mbyIsInNjb3JlIiwwLDB9KSwKKyAgICAgICAgICAgKHsia3VyemluZm8iLCJ2ZXJ5X3Nob3J0X3Njb3JlIiwwLDB9KSwKKyAgICAgICAgICAgKHsicXVpdCIsIm5ld19xdWl0IiwwLDB9KSwKKyAgICAgICAgICAgKHsiZW5kZSIsIm5ld19xdWl0IiwwLDB9KSwKKyAgICAgICAgICAgKHsiZGlzY29ubmVjdCIsImRpc2Nvbm5lY3QiLDAsMH0pLAorICAgICAgICAgICAoeyJzY2hsYWYiLCJkaXNjb25uZWN0IiwxLDB9KSwKKyAgICAgICAgICAgKHsic3BlaWNoZXJuIiwic2F2ZV9jaGFyYWN0ZXIiLDAsMH0pLAorICAgICAgICAgICAoeyJzYXZlIiwic2F2ZV9jaGFyYWN0ZXIiLDAsMH0pLAorICAgICAgICAgICAoeyJ0b2V0ZSIsImtpbGwiLDAsMH0pLAorICAgICAgICAgICAoeyJhbmdyaWZmc21lbGR1bmciLCJhbmdyaWZmc21lbGR1bmciLDAsMH0pLAorICAgICAgICAgICAoeyJwYXNzdyIsImNoYW5nZV9wYXNzd29yZCIsMSwwfSksCisgICAgICAgICAgICh7ImhpbGZlIiwiaGVscCIsMSwwfSksCisgICAgICAgICAgICh7InNlbGJzdGxvZXNjaHVuZyIsInNlbGZfZGVsZXRlIiwwLDB9KSwKKyAgICAgICAgICAgKHsic3BpZWxwYXVzZSIsInNwaWVscGF1c2UiLDAsMH0pLAorICAgICAgICAgICAoeyJzcGllbGRhdWVyIiwic3BpZWxkYXVlciIsMCwwfSksCisgICAgICAgICAgICh7ImlkZWUiLCJpZGVhIiwwLDB9KSwKKyAgICAgICAgICAgKHsidHlwbyIsInR5cG8iLDAsMH0pLAorICAgICAgICAgICAoeyJidWciLCJidWciLDAsMH0pLAorICAgICAgICAgICAoeyJmZWhsZXIiLCJmZWhsZXJoaWxmZSIsMCwwfSksCisgICAgICAgICAgICh7Im1kIiwibWQiLDAsMH0pLAorICAgICAgICAgICAoeyJkZXRhaWwiLCJtZCIsMCwwfSksCisgICAgICAgICAgICh7InZvcnNpY2h0IiwidG9nZ2xlX3doaW1weSIsMCwwfSksCisgICAgICAgICAgICh7InN0b3AiLCJzdG9wIiwwLDB9KSwKKyAgICAgICAgICAgKHsia3dobyIsImt3aG8iLDAsMH0pLAorICAgICAgICAgICAoeyJrd2VyIiwia3dobyIsMCwwfSksCisgICAgICAgICAgICh7Imtrd2VyIiwia2t3aG8iLDAsMH0pLAorICAgICAgICAgICAoeyJra3dobyIsImtrd2hvIiwwLDB9KSwKKyAgICAgICAgICAgKHsid2hvIiwid2hvIiwwLDB9KSwKKyAgICAgICAgICAgKHsid2VyIiwid2hvIiwwLDB9KSwKKyAgICAgICAgICAgKHsiemVpdCIsInVocnplaXQiLDAsMH0pLAorICAgICAgICAgICAoeyJ1aHJ6ZWl0IiwidWhyemVpdCIsMCwwfSksCisgICAgICAgICAgICh7IndlZyIsIndlZyIsMCwwfSksCisgICAgICAgICAgICh7IndlZ21lbGR1bmciLCAid2VnbWVsZHVuZyIsIDAsIDB9KSwKKyAgICAgICAgICAgKHsiaWRsZXplaXQiLCAiaWRsZXplaXQiLCAwLCAwfSksCisgICAgICAgICAgICh7ImZpbmdlciIsImZpbmdlciIsMCwwfSksCisgICAgICAgICAgICh7Im11ZHMiLCJtdWRzIiwwLDB9KSwKKyAgICAgICAgICAgKHsiZW1vdGUiLCJlbW90ZSIsMCwwfSksCisgICAgICAgICAgICh7IjoiLCJlbW90ZSIsMSwwfSksCisgICAgICAgICAgICh7IjsiLCJlbW90ZSIsMSwwfSksCisgICAgICAgICAgICh7InJlbW90ZSIsInJlbW90ZSIsMCxTRUVSX0xWTH0pLAorICAgICAgICAgICAoeyJyOiIsInJlbW90ZSIsMSwwfSksCisgICAgICAgICAgICh7InI7IiwiZ3JlbW90ZSIsMSwwfSksCisgICAgICAgICAgICh7InRpdGVsIiwic2V0X3RpdGxlIiwwLDB9KSwKKyAgICAgICAgICAgKHsicmV2aWV3IiwicmV2aWV3IiwwLFNFRVJfTFZMfSksCisgICAgICAgICAgICh7InNldG1pbiIsInNldG1pbiIsMCxTRUVSX0xWTH0pLAorICAgICAgICAgICAoeyJzZXRtb3V0Iiwic2V0bW91dCIsMCxTRUVSX0xWTH0pLAorICAgICAgICAgICAoeyJzZXRtbWluIiwic2V0bW1pbiIsMCxTRUVSX0xWTH0pLAorICAgICAgICAgICAoeyJzZXRtbW91dCIsInNldG1tb3V0IiwwLFNFRVJfTFZMfSksCisgICAgICAgICAgICh7InNldGhhbmRzIiwic2V0aGFuZHMiLDAsU0VFUl9MVkx9KSwKKyAgICAgICAgICAgKHsicHJlc2F5IiwicHJlc2F5IiwwLFNFRVJfTFZMfSksCisgICAgICAgICAgICh7ImV4dHJhbG9vayIsImV4dHJhbG9vayIsMCxTRUVSX0xWTH0pLAorICAgICAgICAgICAoeyJmbHVjaHRyaWNodHVuZyIsInRvZ2dsZV93aGltcHlfZGlyIiwwLFNFRVJfTFZMfSksCisgICAgICAgICAgICh7ImluZm9ybSIsImluZm9ybSIsMCwwfSksCisgICAgICAgICAgICh7ImVyd2FydGUiLCJlcndhcnRlIiwwLDB9KSwKKyAgICAgICAgICAgKHsic3R0eSIsInN0dHkiLDAsMH0pLAorICAgICAgICAgICAoeyJncmFmaWsiLCAic2V0X2FzY2lpX2FydCIsIDAsIDB9KSwgCisgICAgICAgICAgICh7InVocm1lbGR1bmciLCJ1aHJtZWxkdW5nIiwwLDB9KSwKKyAgICAgICAgICAgKHsiemVpdHpvbmUiLCJ6ZWl0em9uZSIsMCwwfSksCisgICAgICAgICAgICh7ImJlaGFsdGUiLCJiZWhhbHRlIiwwLDB9KSwKKyAgICAgICAgICAgKHsiendlaXRpZW1hcmtpZXJ1bmciLCJ6d2VpdGllbWFya2llcnVuZyIsMCwwfSksCisgICAgICAgICAgICh7ImVtYWlsYW56ZWlnZSIsImVtYWlsYW56ZWlnZSIsMCwwfSksCisgICAgICAgICAgICh7InRvcGxpc3RlIiwidG9wbGlzdGUiLDAsMH0pLAorICAgICAgICAgICAoeyJ0b24iLCJzZXRfdmlzdWFsYmVsbCIsMCwwfSksCisgICAgICAgICAgICh7InRlbG5lZ3MiLCJzaG93X3RlbG5lZ3MiLDAsMH0pLAorICAgICAgICAgICAoeyJzcG90dGUiLCAic3BvdHRlIiwgMCwgMH0pLAorICAgICAgICAgICAoeyJyZWlzZSIsInJlaXNlIiwwLDB9KSwKKyAgICAgICAgICAgKHsiemF1YmVydHJhZW5rZSIsInphdWJlcnRyYWVua2UiLDAsMH0pLAorICAgICAgICAgICAoeyJ0ZWxuZXQiLCJ0ZWxuZXRfY21kIiwwLDB9KSwKKyAgICAgfSkrCisgICAgIGNvbW1hbmQ6Ol9xdWVyeV9sb2NhbGNtZHMoKSsKKyAgICAgdmlld2NtZDo6X3F1ZXJ5X2xvY2FsY21kcygpKworICAgICBjb21tOjpfcXVlcnlfbG9jYWxjbWRzKCkrCisgICAgIHNraWxsczo6X3F1ZXJ5X2xvY2FsY21kcygpKworICAgICBkZXNjcmlwdGlvbjo6X3F1ZXJ5X2xvY2FsY21kcygpOworfQorCitzdGF0aWMgaW50IF9jaGVja19rZWVwKG9iamVjdCBvYikKK3sKKyAgcmV0dXJuIChvYi0+UXVlcnlQcm9wKFBfS0VFUF9PTl9TRUxMKSk9PWdldGV1aWQoTUUpOworfQorCitzdGF0aWMgbWl4ZWQgX3NldF90ZXN0cGxheWVyKG1peGVkIGFyZykgeworICBtaXhlZCByZXM7CisgIG9iamVjdCBzZXRvYjsKKworICBzZXRvYj10aGlzX3BsYXllcigpOworICBpZiAoIW9iamVjdHAoc2V0b2IpIHx8ICFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHNldG9iKSkKKyAgICBzZXRvYj10aGlzX2ludGVyYWN0aXZlKCk7CisgIGlmICghb2JqZWN0cChzZXRvYikpCisgICAgc2V0b2I9cHJldmlvdXNfb2JqZWN0KCk7CisgIGlmIChzZXRvYiAmJiAhSVNfREVQVVRZKHNldG9iKSkgeworICAgIGFyZz1nZXRldWlkKHNldG9iKTsKKyAgICBpZiAoIWFyZyB8fCBhcmc9PSJOT0JPRFkiKQorICAgICAgYXJnPWdldHVpZChzZXRvYik7CisgICAgYXJnPWNhcGl0YWxpemUoYXJnKTsKKyAgfQorICByZXM9U2V0KFBfVEVTVFBMQVlFUixhcmcpOworICBTZXQoUF9URVNUUExBWUVSLFBST1RFQ1RFRCxGX01PREVfQVMpOworICByZXR1cm4gcmVzOworfQorCitpbnQgendlaXRpZW1hcmtpZXJ1bmcoc3RyaW5nIGFyZykKK3sKKyAgaWYgKCFRdWVyeVByb3AoUF9TRUNPTkQpKQorICAgIHJldHVybiBfbm90aWZ5X2ZhaWwoIkFiZXIgRHUgYmlzdCBkb2NoIGdhciBrZWluIFp3ZWl0aS5cbiIpLDA7CisgIG5vdGlmeV9mYWlsKCJTeW50YXg6IHp3ZWl0aWVtYXJraWVydW5nIFt1bnNpY2h0YmFyfHNpY2h0YmFyfG5hbWVdXG4iKTsKKyAgaWYgKCFhcmcpCisgICAgcmV0dXJuIDA7CisgIHN3aXRjaCAoYXJnKQorICB7CisgICAgY2FzZSAidW5zaWNodGJhciIgOgorICAgICAgU2V0UHJvcChQX1NFQ09ORF9NQVJLLC0xKTsKKyAgICAgIHdyaXRlKCJKZXR6dCBzaWVodCBrZWluIFNwaWVsZXIgbWVociwgZGFzcyBEdSBlaW4gWndlaXRpIGJpc3QuXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgIGNhc2UgInNpY2h0YmFyIiA6CisgICAgICBTZXRQcm9wKFBfU0VDT05EX01BUkssMCk7CisgICAgICB3cml0ZSgiSmV0enQgc2llaHQga2VpbiBTcGllbGVyIG1laHIsIHdlc3NlbiBad2VpdGkgRHUgYmlzdC5cbiIpOworICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSAibmFtZSIgOgorICAgICAgU2V0UHJvcChQX1NFQ09ORF9NQVJLLDEpOworICAgICAgd3JpdGUoIkpldHp0IGtvZW5uZW4gYWxsZSBzZWhlbiwgd2Vzc2VuIFp3ZWl0aSBEdSBiaXN0LlxuIik7CisgICAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworaW50IHRvcGxpc3RlKHN0cmluZyBhcmcpCit7CisgICAgaWYgKCFhcmcpCisgICAgeworICAgICAgICBwcmludGYoIkR1IGhhc3QgRGljaCBmdWVyIGRpZSBUb3BsaXN0ZSAlcy5cbiIsCisgICAgICAgICAgICAoUXVlcnlQcm9wKFBfTk9fVE9QTElTVCkgPyAiZ2VzcGVycnQiIDogImZyZWlnZWdlYmVuIikpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZSBpZiAobWVtYmVyKCh7ImoiLCJqYSIsIm4iLCJuZWluIn0pLGFyZyk9PS0xKQorICAgICAgICByZXR1cm4gX25vdGlmeV9mYWlsKCJTeW50YXg6IHRvcGxpc3RlIFtqYXxuZWluXVxuIiksMDsKKyAgICBpZiAoYXJnWzBdPT0naicpCisgICAgeworICAgICAgICBTZXRQcm9wKFBfTk9fVE9QTElTVCwwKTsKKyAgICAgICAgd3JpdGUoIkR1IGthbm5zdCBqZXR6dCAodGhlb3JldGlzY2gpIGluIGRlciBUb3BsaXN0ZSBhdWZ0YXVjaGVuLlxuIik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFNldFByb3AoUF9OT19UT1BMSVNULDEpOworICAgICAgICB3cml0ZSgiRHUgd2lyc3QgamV0enQgbmljaHQgaW4gZGVyIFRvcGxpc3RlIGF1ZnRhdWNoZW4uXG4iKTsKKyAgICB9CisgICAgU2V0KFBfTk9fVE9QTElTVCxTQVZFfFBST1RFQ1RFRCxGX01PREVfQVMpOworICAgIHJldHVybiAxOworfQorCitpbnQgc2hvd190ZWxuZWdzKHN0cmluZyBhcmcpCit7CisgICAgaWYgKCFhcmcpCisgICAgeworICAgICAgICB3cml0ZSgiRHUgYmVrb21tc3QgQWVuZGVydW5nZW4gRGVpbmVyIEZlbnN0ZXJncm9lc3NlICIrCisgICAgICAgICAgICAgIChRdWVyeVByb3AoUF9UVFlfU0hPVyk/IiI6Im5pY2h0ICIpKyJhbmdlemVpZ3QuXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChtZW1iZXIoKHsiZWluIiwiYW4iLCJhdXMifSksYXJnKT09LTEpCisgICAgeworICAgICAgICB3cml0ZSgiU3ludGF4OiB0ZWxuZWdzIFtlaW58YXVzXVxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoYXJnPT0iZWluIiB8fCBhcmc9PSJhbiIpCisgICAgeworICAgICAgICB3cml0ZSgiRHUgYmVrb21tc3QgIisoUXVlcnlQcm9wKFBfVFRZX1NIT1cpPyIiOiJudW4gIikrCisgICAgICAgICAgICAgICJBZW5kZXJ1bmdlbiBEZWluZXIgRmVuc3Rlcmdyb2Vzc2UgYW5nZXplaWd0LlxuIik7CisgICAgICAgIFNldChQX1RUWV9TSE9XLDEpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgd3JpdGUoIkR1IGJla29tbXN0ICIrKFF1ZXJ5UHJvcChQX1RUWV9TSE9XKT8ibnVuICI6IiIpKworICAgICAgICAgICJBZW5kZXJ1bmdlbiBEZWluZXIgRmVuc3Rlcmdyb2Vzc2UgbmljaHQgIisKKyAgICAgICAgICAoUXVlcnlQcm9wKFBfVFRZX1NIT1cpPyJtZWhyICI6IiIpKyJhbmdlemVpZ3QuXG4iKTsKKyAgICBTZXQoUF9UVFlfU0hPVywwKTsKKyAgICByZXR1cm4gMTsKK30KKworcHJpdmF0ZSBpbnQgc2V0X2tlZXBfYWxpdmUoc3RyaW5nIHN0cikgeworICBpZiAoc3RyID09ICJlaW4iKSB7CisgICAgdGVsbmV0X3RtX2NvdW50ZXIgPSAyNDAgLyBfX0hFQVJUX0JFQVRfSU5URVJWQUxfXzsKKyAgICB0ZWxsX29iamVjdCh0aGlzX29iamVjdCgpLCBicmVha19zdHJpbmcoCisgICAgICAgICJBbiBEZWluZW4gQ2xpZW50IHdlcmRlbiBqZXR6dCBhbGxlIDQgTWludXRlbiB1bnNpY2h0YmFyZSBEYXRlbiAiCisgICAgICAgICJnZXNjaGlja3QsIHVtIHp1IHZlcmhpbmRlcm4sIGRhc3MgRGVpbmUgVmVyYmluZHVuZyB6dW0gIk1VRE5BTUUKKyAgICAgICAgIiBiZWVuZGV0IHdpcmQuIiwgNzgpKTsKKyAgfQorICBlbHNlIGlmIChzdHIgPT0gImF1cyIpIHsKKyAgICB0ZWxuZXRfdG1fY291bnRlciA9IDA7CisgICAgdGVsbF9vYmplY3QodGhpc19vYmplY3QoKSxicmVha19zdHJpbmcoCisgICAgICAgICJEdSBoYXN0IGRhcyBTZW5kZW4gdm9uIHVuc2ljaHRiYXJlbiBEYXRlbiAoS2VlcC1BbGl2ZS1QYWtldGUpIGFuICIKKyAgICAgICAgIkRlaW5lbiBDbGllbnQgYXVzZ2VzY2hhbHRldC4iLDc4KSk7CisgIH0KKyAgZWxzZSB7CisgICAgaWYgKCF0ZWxuZXRfdG1fY291bnRlcikKKyAgICAgIHRlbGxfb2JqZWN0KHRoaXNfb2JqZWN0KCksIGJyZWFrX3N0cmluZygKKyAgICAgICAgIkFuIERlaW5lbiBDbGllbnQgd2VyZGVuIGtlaW5lIEtlZXAtQWxpdmUtUGFrZXRlIGdlc2NoaWNrdC4iLDc4KSk7CisgICAgZWxzZQorICAgICAgdGVsbF9vYmplY3QodGhpc19vYmplY3QoKSwgYnJlYWtfc3RyaW5nKAorICAgICAgICAiQW4gRGVpbmVuIENsaWVudCB3ZXJkZW4gYWxsZSA0IE1pbnV0ZW4gIiAKKyAgICAgICAgInVuc2ljaHRiYXJlIERhdGVuIGdlc2NoaWNrdCwgZGFtaXQgRGVpbmUgVmVyYmluZHVuZyAiCisgICAgICAgICJ6dW0gIk1VRE5BTUUiIG5pY2h0IGJlZW5kZXQgd2lyZC4iLDc4KSk7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3ByaXZhdGUgaW50IHByaW50X3RlbG5ldF9ydHRpbWUoKSB7CisgIGludCBydHQgPSBRdWVyeVByb3AoUF9URUxORVRfUlRUSU1FKTsKKyAgaWYgKHJ0dD4wKQorICAgIHRlbGxfb2JqZWN0KE1FLCBicmVha19zdHJpbmcoCisgICAgICAiRGllIGxldHp0ZSBnZW1lc3NlbmUgJ3JvdW5kLXRyaXAnIFplaXQgdm9tIE1HIHp1IERlaW5lbSBDbGllbnQgIgorICAgICAgInVuZCB6dXJ1ZWNrIGJldHJ1ZyAiICsgcnR0ICsgIiB1cy4iLDc4KSk7CisgIGVsc2UKKyAgICB0ZWxsX29iamVjdChNRSwgYnJlYWtfc3RyaW5nKAorICAgICAgIkJpc2xhbmcgd3VyZGUgZGllICdyb3VuZC10cmlwJyBaZWl0IHZvbSBNRyB6dSBEZWluZW0gQ2xpZW50ICIKKyAgICAgICJub2NoIG5pY2h0IGdlbWVzc2VuIG9kZXIgRGVpbiBDbGllbnQgdW50ZXJzdHVldHp0IGRpZXNlcyAiCisgICAgICAibmljaHQuIiw3OCkpOworICByZXR1cm4gMTsKK30KKworaW50IHRlbG5ldF9jbWQoc3RyaW5nIHN0cikgeworICBpZiAoIXN0cikgcmV0dXJuIDA7CisgIHN0cmluZyAqYXJncyA9IGV4cGxvZGUoc3RyLCAiICIpOworICBzdHJpbmcgbmV3YXJnczsKKyAgaWYgKHNpemVvZihhcmdzKSA+IDEpCisgICAgbmV3YXJncyA9IGltcGxvZGUoYXJnc1sxLi5dLCAiICIpOworICBlbHNlCisgICAgbmV3YXJncyA9ICIiOworCisgIHN3aXRjaChhcmdzWzBdKQorICB7CisgICAgY2FzZSAia2VlcGFsaXZlIjoKKyAgICAgIHJldHVybiBzZXRfa2VlcF9hbGl2ZShuZXdhcmdzKTsKKyAgICBjYXNlICJydHRpbWUiOgorICAgICAgcmV0dXJuIHByaW50X3RlbG5ldF9ydHRpbWUoKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworaW50IHNwb3R0ZSggc3RyaW5nIHN0ciApCit7CisgICAgX25vdGlmeV9mYWlsKCAiSGllciBpc3QgbmljaHRzLCB3YXMgRHUgdmVyc3BvdHRlbiBrb2VubnRlc3QhXG4iICk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBiZWhhbHRlKHN0cmluZyBzdHIpCit7CisgIG9iamVjdCBvYiwqb2JzOworICBzdHJpbmcgczsKKworICBpZiAoc3RyKQorICB7CisgICAgaWYgKHN0cj09ImFsbGVzIikgeworICAgICAgZmlsdGVyX29iamVjdHMoYWxsX2ludmVudG9yeSgpLCAiU2V0UHJvcCIsIFBfS0VFUF9PTl9TRUxMLCBnZXR1aWQoKSk7CisgICAgICB3cml0ZSgiT2shXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoc3RyPT0ibmljaHRzIikgeworICAgICAgZmlsdGVyX29iamVjdHMoYWxsX2ludmVudG9yeSgpLCAiU2V0UHJvcCIsIFBfS0VFUF9PTl9TRUxMLCAwKTsKKyAgICAgIHdyaXRlKCJPayFcbiIpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmICghc2l6ZW9mKG9icz1maW5kX29icyhzdHIsUFVUX0dFVF9OT05FKSkpCisgICAgeworICAgICAgX25vdGlmeV9mYWlsKCJBYmVyIHNvd2FzIGhhc3QgRHUgbmljaHQgZGFiZWkhXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlIG9iPW9ic1swXTsKKworICAgIGlmIChvYi0+UXVlcnlQcm9wKFBfS0VFUF9PTl9TRUxMKT09Z2V0ZXVpZChNRSkpCisgICAgICAgIG9iLT5TZXRQcm9wKFBfS0VFUF9PTl9TRUxMLDApOworICAgIGVsc2UKKyAgICAgICAgb2ItPlNldFByb3AoUF9LRUVQX09OX1NFTEwsZ2V0ZXVpZChNRSkpOworCisgICAgLy8gZXJuZXV0IGFiZnJhZ2VuLCBkYSBzaWNoIGRlciBXZXJ0IG5pY2h0IGdlYWVuZGVydCBoYWJlbiBtdXNzCisgICAgaWYgKG9iLT5RdWVyeVByb3AoUF9LRUVQX09OX1NFTEwpPT1nZXRldWlkKE1FKSkKKyAgICAgICAgd3JpdGUoYnJlYWtfc3RyaW5nKHNwcmludGYoIk9rLCBEdSB3aXJzdCAlcyBqZXR6dCBiZWkgJ3ZlcmthdWZlIGFsbGVzJyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZWhhbHRlbi5cbiIsb2ItPm5hbWUoV0VOKSksNzgpKTsKKyAgICBlbHNlCisgICAgICAgIHdyaXRlKGJyZWFrX3N0cmluZyhzcHJpbnRmKCJPaywgRHUgd2lyc3QgJXMgYmVpbSBuYWVjaHN0ZW4gJ3ZlcmthdWZlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFsbGVzJyBtaXR2ZXJrYXVmZW4hXG4iLG9iLT5uYW1lKFdFTikpLDc4KSk7CisKKyAgICByZXR1cm4gMTsKKyAgfQorICBzPW1ha2VfaW52bGlzdChNRSxmaWx0ZXIoYWxsX2ludmVudG9yeShNRSksIydfY2hlY2tfa2VlcCkpOyAvLycpKTsKKyAgTW9yZShzKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3F1ZXJ5X2xlcCgpCit7CisgIGludCB2YWw7CisgIHZhbCA9IExFUE1BU1RFUi0+UXVlcnlMRVAoKTsKKyAgU2V0KCBQX0xFUCwgdmFsICk7CisgIHJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBtaXhlZCBfc2V0X2ZyYXRlcm5pdGFzZG9ub2FyY2htYWdvcnVtKG1peGVkIGFyZykKK3sKKyAgaWYgKCFpbnRwKGFyZykpIHJldHVybiAtMTsKKworICBpZiAoKCFwcmV2aW91c19vYmplY3QoMSl8fG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgxKSkhPUZBT19NQVNURVIpICYmIAorICAgICAgKCF0aGlzX2ludGVyYWN0aXZlKCkgfHwgIUlTX0FSQ0godGhpc19pbnRlcmFjdGl2ZSgpKSkpCisgICAgcmV0dXJuIC0xOworCisgIGlmICghaW50cChhcmcpKSByZXR1cm4gLTE7CisKKyAgbG9nX2ZpbGUoImZhby9QX0ZBTyIsc3ByaW50ZigiJXMgLSAlcyBQX0ZBTyBnZXNldHp0IGF1ZiAlT1xuIiwKKyAgICAgICAgZHRpbWUodGltZSgpKSxxdWVyeV9yZWFsX25hbWUoKSxhcmcpICk7CisgIHJldHVybiBTZXQoUF9GQU8sYXJnKTsKK30KKworbm9tYXNrIHZvaWQgc2V0X3JlYWxpcChzdHJpbmcgc3RyKQoreworICBpZihwcmV2aW91c19vYmplY3QoKSAmJiBzdHJzdHIob2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpLCIvc2VjdXJlIik9PTApCisgIHsKKyAgICByZWFsaXA9c3RyOworICB9Cit9CisKK25vbWFzayBzdHJpbmcgcXVlcnlfcmVhbGlwKCkKK3sKKyAgcmV0dXJuIHJlYWxpcCA/IHJlYWxpcCA6ICIiOworfQorCittaXhlZCBfcXVlcnlfbmV0ZGVhZF9lbnYoKSB7CisgICAgICAgIHJldHVybiBuZGVhZF9sb2NhdGlvbiB8fCBuZGVhZF9sX2ZpbGVuYW1lOworfQpkaWZmIC0tZ2l0IGEvc3RkL3BsYXllci9jaGFubmVsLmMgYi9zdGQvcGxheWVyL2NoYW5uZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Zjg1MTJhCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9jaGFubmVsLmMKQEAgLTAsMCArMSw1NzkgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBjaGFubmVsLmMgLS0gY2hhbm5lbCBjbGllbnQKKy8vCisvLyAkSWQ6IGNoYW5uZWwuYyA5NDA0IDIwMTUtMTItMTMgMDA6MjE6NDRaIFplc3N0cmEgJAorI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPHV0aWwuaD4KKyNpbmNsdWRlIDx0aGluZy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGl2aW5nL2NvbW0uaD4KKyNpbmNsdWRlIDxwbGF5ZXIuaD4KKyNpbmNsdWRlIDxwbGF5ZXIvY29tbS5oPgorI2luY2x1ZGUgPGRhZW1vbi5oPgorI2luY2x1ZGUgPHBsYXllci9nbWNwLmg+CisjdW5kZWYgTkVFRF9QUk9UT1RZUEVTCisKKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHN5c19kZWJ1Zy5oPgorI2luY2x1ZGUgPHJlZ2V4cC5oPgorCisjZGVmaW5lIFBfU1dBUF9DSEFOTkVMUyAgInN3YXBfY2hhbm5lbHMiCisjZGVmaW5lIFBfQ0hBTk5FTF9TSE9SVCAgInNob3J0X2NoYW5uZWxzIgorCisjZGVmaW5lIENIQU5ORUxDTURTICAgICAgIlsjQCUkJigpPD5hLXpBLVowLTlcXC1dIgorCisjZGVmaW5lIERFRkFVTFRfQ0hBTk5FTFMgKHsiQWJlbnRldWVyIiwgIkFuZmFlbmdlciIsIkdyYXRzIiwiVG9kIiwgIlpUIn0pCisjZGVmaW5lIERFRkFVTFRfU0hPUlRDVVRTIFwKKyhbICAgICAgICAgICAgICAgICAgICAgXAorICJiIjoiQWJlbnRldWVyIiwgICAgICBcCisgImEiOiJBbGxnZW1laW4iLCAgICAgIFwKKyAiQiI6IkJlaWxlaWQiLCAgICAgICAgXAorICJxIjoiRC1jaGF0IiwgICAgICAgICBcCisgIkciOiJHcmF0cyIsICAgICAgICAgIFwKKyAiTSI6Ik1vZXJkZXIiLCAgICAgICAgXAorICJoIjoiU2VoZXIiLCAgICAgICAgICBcCisgIlQiOiJUb2QiLCAgICAgICAgICAgIFwKK10pCisKKyNkZWZpbmUgV0laQVJEX1NIT1JUQ1VUUyBcCisoWyAgICAgICAgICAgICAgICAgICAgIFwKKyAiUCI6IkQtY29kZSIsICAgICAgICAgXAorICJEIjoiRGVidWciLCAgICAgICAgICBcCisgIk8iOiJJbnRlcmNvZGUiLCAgICAgIFwKKyAiSSI6IkludGVybXVkIiwgICAgICAgXAorICJtIjoiTWFnaWVyIiwgICAgICAgICBcCitdKQorCisKK3ByaXZhdGUgbm9zYXZlIG1hcHBpbmcgc2hvcnRjdXQ7Citwcml2YXRlIG5vc2F2ZSBpbnQgY19zdGF0dXM7CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgU2V0KFBfQ0hBTk5FTFMsIFNBVkUsIEZfTU9ERSk7CisgIFNldChQX0NIQU5ORUxTLCBERUZBVUxUX0NIQU5ORUxTKTsKKyAgU2V0KFBfU1dBUF9DSEFOTkVMUywgU0FWRSwgRl9NT0RFKTsKKyAgU2V0KFBfU1REX0NIQU5ORUwsICJBbGxnZW1laW4iKTsKKyAgU2V0KFBfU1REX0NIQU5ORUwsIFNBVkUsIEZfTU9ERSk7CisgIFNldChQX0NIQU5ORUxfU0hPUlQsIFNBVkUsIEZfTU9ERSk7CisgIFNldChQX0NIQU5ORUxfU0hPUlQsIERFRkFVTFRfU0hPUlRDVVRTCisgICAgICArIChJU19MRUFSTkVSKHRoaXNfb2JqZWN0KCkpID8gV0laQVJEX1NIT1JUQ1VUUyA6IChbXSkpKTsKK30KKworc3RhdGljIG1peGVkIF9xdWVyeV9sb2NhbGNtZHMoKQoreworICByZXR1cm4gKHsoeyItIiwiQ2hhbm5lbFBhcnNlciIsIDEsIDB9KSwKKyAgICAgICAgICAgKHsiZWJlbmUiLCAiQ2hhbm5lbEFkbWluIiwgMCwgMH0pLAorICAgICAgICAgICAoeyJlYmVuZW4iLCAiQ2hhbm5lbEFkbWluIiwgMSwgMH0pLAorICAgICAgICAgfSk7Cit9CisKK21peGVkIFJlZ2lzdGVyQ2hhbm5lbHMoKQoreworICBtaXhlZCBlcnI7CisgIGlmKGV4dGVybl9jYWxsKCkgJiYKKyAgICAgcHJldmlvdXNfb2JqZWN0KCkgIT0gZmluZF9vYmplY3QoQ0hNQVNURVIpKSByZXR1cm47CisgIGNfc3RhdHVzID0gMDsKKyAgc2hvcnRjdXQgPSBRdWVyeVByb3AoUF9DSEFOTkVMX1NIT1JUKTsKKyAgU2V0UHJvcChQX0NIQU5ORUxTLCBtYXAoUXVlcnlQcm9wKFBfQ0hBTk5FTFMpIHx8ICh7fSksCisJIydsb3dlcl9jYXNlKSk7CisgIGVyciA9IGZpbHRlcihRdWVyeVByb3AoUF9DSEFOTkVMUyksCisgICAgICAgICBzeW1ib2xfZnVuY3Rpb24oImpvaW4iLCBDSE1BU1RFUiksCisgICAgICAgICB0aGlzX29iamVjdCgpKTsKKyAgaWYoUXVlcnlQcm9wKFBfTEVWRUwpIDwgNSkgcmV0dXJuIGVycjsKKyAgd2hpbGUoc2l6ZW9mKGVycikpIHsKKyAgICBDSE1BU1RFUi0+bmV3KGVyclswXSwgdGhpc19vYmplY3QoKSk7CisgICAgZXJyWzAuLjBdID0gKHt9KTsKKyAgfQorICByZXR1cm4gZXJyOworfQorCittaXhlZCBSZW1vdmVDaGFubmVscygpCit7CisgIGNsb3N1cmUgY2w7CisgIG1peGVkIGVycj0oe30pOworICBpZihleHRlcm5fY2FsbCgpICYmCisgICAgIHByZXZpb3VzX29iamVjdCgpICE9IGZpbmRfb2JqZWN0KENITUFTVEVSKSkgcmV0dXJuOworICBpZighY19zdGF0dXMpIGNfc3RhdHVzID0gMTsKKyAgZWxzZSByZXR1cm4gKHt9KTsKKyAgY2w9c3ltYm9sX2Z1bmN0aW9uKCJsZWF2ZSIsIENITUFTVEVSKTsKKyAgaWYgKGNsb3N1cmVwKGNsKSkgeworICAgICAgZXJyID0gZmlsdGVyKFF1ZXJ5UHJvcChQX0NIQU5ORUxTKSwgY2wsIHRoaXNfb2JqZWN0KCkpOworICAgICAgU2V0UHJvcChQX0NIQU5ORUxTLCBRdWVyeVByb3AoUF9DSEFOTkVMUykgLSBlcnIpOworICB9CisgIHJldHVybiBlcnI7Cit9CisKK3ZhcmFyZ3MgcHJpdmF0ZSBzdHJpbmcgZ2V0TmFtZShtaXhlZCB4LCBpbnQgZmFsbCkgeworICAKKyAgbWl4ZWQgbyA9IGNsb3N1cmVwKHgpID8gcXVlcnlfY2xvc3VyZV9vYmplY3QoeCkgOiB4OworICBpZihzdHJpbmdwKG8pICYmIHNpemVvZihvKSAmJiAoeCA9IGZpbmRfb2JqZWN0KG8pKSkgCisgICAgbyA9IHg7CisgIAorICAvLyBPYmpla3RlCisgIGlmIChvYmplY3RwKG8pKSB7CisgICAgLy8gTWFnaWVyIHNlaGVuIHVuc2ljaHRiYXJlIG5pY2h0IG51ciBhbHMgIkplbWFuZCIKKyAgICBpZiAoby0+UXVlcnlQcm9wKFBfSU5WSVMpICYmIElTX0xFQVJOSU5HKHRoaXNfb2JqZWN0KCkpKQorICAgICAgcmV0dXJuICIoIitjYXBpdGFsaXplKGdldHVpZChvKSkrIikiOworICAgIC8vIEZyb2VzY2hlIG1pdCBOYW1lbiB2ZXJzb3JnZW4uCisgICAgaWYgKG8tPlF1ZXJ5UHJvcChQX0ZST0cpKQorICAgICAgcmV0dXJuICJGcm9zY2ggIitjYXBpdGFsaXplKGdldHVpZChvKSk7CisgICAgLy8gRGVmYXVsdCAoVW5zaWNodGJhcmUgYWxzICJKZW1hbmQiIChzLiBOYW1lKCkpKQorICAgIHJldHVybiBvLT5OYW1lKGZhbGwsIDIpfHwiPFVuYmVrYW5udD4iOworICB9CisgIC8vIFN0cmluZ3MKKyAgZWxzZSBpZiAoc3RyaW5ncChvKSAmJiBzaXplb2YobykpIHsKKyAgICBpZiAob1swXSA9PSAnLycpIHsKKyAgICAgIC8vIHVuc2ljaHRiYXJlIE9iamVrdGUuLi4KKyAgICAgIGludCBwID0gc3Ryc3RyKG8sICIkIik7CisgICAgICBpZiAocCAhPSAtMSkgeworCS8vIE1hZ2llciBpbSBNYWdpZXJtb2R1cyBrcmllZ2VuIGRlbiBSZWFsbmFtZW4sIGFuZGVyZSBuaWNodC4KKwlpZiAoSVNfTEVBUk5JTkcodGhpc19vYmplY3QoKSkpCisJICByZXR1cm4gb1sxLi5wLTFdOworCWVsc2UKKwkgIHJldHVybiBvW3ArMS4uXTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKwkvLyBkb2NoIG5pY2h0IHVuc2ljaHRiYXIKKwlyZXR1cm4gKGZhbGwgPT0gV0VTU0VOID8gbysicyIgOiBvKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgLy8gbmljaHQgdW5zaWNodGJhcgorICAgICAgcmV0dXJuIChmYWxsID09IFdFU1NFTiA/IG8rInMiIDogbyk7CisgIH0KKyAgLy8gRmFsbC10aHJvdWdoCisgIHJldHVybiAiPFVuYmVrYW5udD4iOworfQorCisvLyA8bm9uaW50PiB1bnRlcmRydWVja3QgZGllIEFVc2dhYmUgYW4gZGVuIFNwaWVsZXIgdW5kIGxpZWZlcnQgZGVuIFRleHQKKy8vIHp1cnVlY2suIFdpcmQgbnVyIGZ1ZXIgZGllIEViZW5lbmhpc3RvcnkgYmVudXR6dC4gCitzdHJpbmcgQ2hhbm5lbE1lc3NhZ2UobWl4ZWQqIG1zZywgaW50IG5vbmludCkKK3sKKyAgc3RyaW5nIGNoYW5uZWxfbWVzc2FnZTsKKyAgc3RyaW5nIGNoYW5uZWw9bXNnWzBdOworICBvYmplY3Qgc2VuZGVyPW1zZ1sxXTsKKyAgc3RyaW5nIG1lc3NhZ2U9bXNnWzJdOworICBpbnQgbXNnX3R5cGUgPSBtc2dbM107CisKKyAgaWYgKCBwcmV2aW91c19vYmplY3QoKSAhPSBmaW5kX29iamVjdChDSE1BU1RFUikgJiYKKyAgICAgICBwcmV2aW91c19vYmplY3QoKSAhPSBNRSApCisgICAgICByZXR1cm4gMDsKKworICBzdHJpbmcgc2VuZGVyX25hbWUgPSBnZXROYW1lKHNlbmRlciwgbXNnX3R5cGUgPT0gTVNHX0dFTU9URSA/IFdFU1NFTiA6IFdFUik7CisgIGludCBwcmVwZW5kX2luZGVudF9mbGFnPVF1ZXJ5UHJvcChQX01FU1NBR0VfUFJFUEVORCkgPyBCU19QUkVQRU5EX0lOREVOVCA6IDA7CisgIHN3aXRjaChtc2dfdHlwZSkgeworICBjYXNlIE1TR19FTVBUWToKKyAgICBjaGFubmVsX21lc3NhZ2U9IG1lc3NhZ2UrIlxuIjsKKyAgICBicmVhazsKKyAgY2FzZSBNU0dfR0VNT1RFOgorICBjYXNlIE1TR19FTU9URToKKyAgICBjaGFubmVsX21lc3NhZ2UgPSBicmVha19zdHJpbmcoc2VuZGVyX25hbWUgKyAiICIrIG1lc3NhZ2UrIl0iLAorICAgICAgICAgICAgICAgICAgIDc4LCBzcHJpbnRmKCJbJXM6IiwgY2hhbm5lbCksCisgICAgICAgICAgICAgICAgICAgQlNfSU5ERU5UX09OQ0V8cHJlcGVuZF9pbmRlbnRfZmxhZyk7CisgICAgYnJlYWs7CisgIGNhc2UgTVNHX1NBWToKKyAgZGVmYXVsdDoKKyAgICBzdHJpbmcgcHJlc2F5PXNwcmludGYoIlslczolc10gIiwgY2hhbm5lbCwgc2VuZGVyX25hbWUpOworICAgIGNoYW5uZWxfbWVzc2FnZSA9IGJyZWFrX3N0cmluZyhtZXNzYWdlLCBtYXgoNzgsc2l6ZW9mKHByZXNheSkrMTApLAorICAgICAgICAgICAgICAgICAgIHByZXNheSwgcHJlcGVuZF9pbmRlbnRfZmxhZyk7CisgICAgYnJlYWs7CisgIH0KKyAgaWYobm9uaW50KQorICAgIHJldHVybiBjaGFubmVsX21lc3NhZ2U7CisKKyAgLy8gV2VubiBHTUNQIHNpY2ggdW0gVWViZXJ0cmFndW5nIGRlciBOYWNocmljaHQga3VlbW1lcnQsIHdpcmQgUmVjZWl2ZU1zZygpCisgIC8vIG5pY2h0IG1laHIgYXVmZ2VydWZlbi4KKyAgaWYgKEdNQ1BfQ2hhbm5lbChjaGFubmVsX21lc3NhZ2UsIGNoYW5uZWwsIHNlbmRlcl9uYW1lKSAhPSAxKQorICB7CisgICAgLy8gRGVyIEViZW5lbm5hbWUgbXVzcyBpbiBLbGVpbmJ1Y2hzdGFiZW4gdWViZXJnZWJlbiB3ZXJkZW4sIGRhbWl0IGRpZQorICAgIC8vIElnbm9yaWVyZXBydWVmdW5nIGZ1bmt0aW9uaWVydC4gRGllIGlnbm9yaWVyZXN0cmluZ3Mgc2luZCBuYWVtbGljaCBhbGxlCisgICAgLy8ga2xlaW5nZXNjaHJpZWJlbi4KKyAgICBSZWNlaXZlTXNnKGNoYW5uZWxfbWVzc2FnZSwgCisgICAgICAgICAgICAgICBNVF9DT01NfE1UX0ZBUnxNU0dfRE9OVF9TVE9SRXxNU0dfRE9OVF9XUkFQLAorICAgICAgICAgICAgICAgTUFfQ0hBTk5FTCIuIiArIGxvd2VyX2Nhc2UoY2hhbm5lbCksIDAsIHNlbmRlcik7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3ByaXZhdGUgdm9pZCBjcmVhdGVMaXN0KHN0cmluZyBuLCBtaXhlZCBhLCBtaXhlZCBtLCBtaXhlZCBsKQoreworICBpbnQgcG9zOyBzdHJpbmcgc2gsICptZW07CisgIGlmKChwb3MgPSBtZW1iZXIobWFwKG1fdmFsdWVzKHNob3J0Y3V0KSwgIydsb3dlcl9jYXNlLyonKi8pLCBuKSkgIT0gLTEpCisgICAgc2ggPSBtX2luZGljZXMoc2hvcnRjdXQpW3Bvc107CisgIGVsc2Ugc2ggPSAiIjsKKyAgbWVtPW1hcChhW0lfTUVNQkVSXSwjJ2dldE5hbWUvKicqLywgV0VSKTsKKyAgbWVtLT0oeyI8TWFzdGVSPiJ9KTsKKyAgbCArPSAoeyBzcHJpbnRmKCIlLTEyLjEyJy4ncyAlY1slLTEuMXNdICV8MTIuMTInICdzICglLXwzJyAnZCkgJS00Mi40MnNcbiIsCisgICAgICAgICAgICAgICAgICBhW0lfTkFNRV0sIChtZW1iZXIobSwgbikgIT0gLTEgPyAnKicgOiAnICcpLCBzaCwKKyAgICAgICAgICAgICAgICAgIGFbSV9NQVNURVJdID8KKyAgICAgICAgICAgICAgICAgIGdldE5hbWUoYVtJX01BU1RFUl0pIDogZ2V0TmFtZShhW0lfQUNDRVNTXSksCisgICAgICAgICAgICAgICAgICBzaXplb2YobWVtKSwKKyAgICAgICAgICAgIChjbG9zdXJlcChhW0lfSU5GT10pICYmIG9iamVjdHAocXVlcnlfY2xvc3VyZV9vYmplY3QoYVtJX0lORk9dKSkpID8KKyAgICAgICAgICAgICAgICAgIGZ1bmNhbGwoYVtJX0lORk9dKSB8fCAiLSBLZWluZSBCZXNjaHJlaWJ1bmcgLSIgOgorICAgICAgICAgICAgICAgICAgKHN0cmluZ3AoYVtJX0lORk9dKSA/IGFbSV9JTkZPXSA6ICItIEtlaW5lIEJlc2NocmVpYnVuZyAtIikKKyAgICAgICAgKSB9KTsKK30KKworcHJpdmF0ZSBtaXhlZCBnZXRDaGFubmVsKHN0cmluZyBjaCkKK3sKKyAgbWl4ZWQgZmY7CisgIGlmKCFzaXplb2YoY2gpKSBjaCA9IFF1ZXJ5UHJvcChQX1NURF9DSEFOTkVMKTsKKyAgaWYoc2hvcnRjdXQgJiYgc2hvcnRjdXRbY2hdKSBjaCA9IHNob3J0Y3V0W2NoXTsKKyAgcmV0dXJuIENITUFTVEVSLT5maW5kKGNoLCB0aGlzX29iamVjdCgpKTsKK30KKworI2lmbmRlZiBERUJVRworI2RlZmluZSBERUJVRyh4KSAgICAgICAgaWYgKGZ1bmNhbGwoc3ltYm9sX2Z1bmN0aW9uKCdmaW5kX3BsYXllciksInplc3N0cmEiKSlcCisgICAgICAgICAgdGVsbF9vYmplY3QoZnVuY2FsbChzeW1ib2xfZnVuY3Rpb24oJ2ZpbmRfcGxheWVyKSwiemVzc3RyYSIpLFwKKwkgICAgICAgICAgICAgICJNREJHOiAiK3grIlxuIikKKyNlbmRpZgoraW50IENoYW5uZWxQYXJzZXIoc3RyaW5nIGFyZ3MpCit7CisgIG1peGVkIGNoLCBjbWQsIHRtcDsKKyAgaW50IHBvcywgdHlwZSwgZXJyOworICBzdHJpbmcgdHh0OworICBjbWQgPSBxdWVyeV92ZXJiKCk7CisgIGFyZ3MgPSBfdW5wYXJzZWRfYXJncygpOworICBub3RpZnlfZmFpbCgiQmVudXR6dW5nOiAtPEViZW5lPlsgXVsnfDp8O108VGV4dD5cbiIKKyAgICAgICAgICAgICAgIiAgICAgICAgICAgLTxFYmVuZT5bK3wtfD98IXwqXVxuIgorICAgICAgICAgICAgICAiICAgICAgICAgICAtP1xuIik7CisgIGlmKCFjbWQgJiYgIWFyZ3MpIHJldHVybiAwOworICBpZighYXJncykgYXJncyA9ICIiOworICBjbWQgPSBjbWRbMS4uXTsKKyAgaWYoc2l6ZW9mKGNtZCA9IHJlZ2V4cGxvZGUoY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXiIgQ0hBTk5FTENNRFMgIioiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoWystXXxcXCF8XFw/fFxcKikqIikpID4gMSkKKyAgeworICAgIC8vei5CLiBjbWQ9ICh7IiIsImFsbGdlbWVpbiIsIjp0ZXN0ZXQifSkKKyAgICBpZihzaXplb2YoY21kWzFdKSA+IDEgJiYKKyAgICAgICBzdHJzdHIoIistPyEqIiwgY21kWzFdWzwxLi48MV0pID4gLTEpCisgICAgICB0bXAgPSBjbWRbMV1bMC4uPDJdOworICAgIGVsc2UKKyAgICAgIHRtcCA9IGNtZFsxXTsKKyAgICBpZihjbWRbMV0gIT0gIj8iICYmIGNtZFsxXSAhPSAiISIpCisgICAgICBpZihwb2ludGVycChjaCA9IGdldENoYW5uZWwodG1wKSkpCisgICAgICB7CisgICAgICAgIG5vdGlmeV9mYWlsKCJEaWVzZSBBbmdhYmUgd2FyIG5pY2h0IGVpbmRldXRpZyEgIgorICAgICAgICAgICAgICAgICAgICAiRm9sZ2VuZGUgRWJlbmVuIHBhc3NlbjpcbiIKKyAgICAgICAgICAgICAgICAgICAgK2ltcGxvZGUoY2gsICIsICIpKyJcbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYoIWNoKSByZXR1cm4gKG5vdGlmeV9mYWlsKCJEaWUgRWJlbmUgJyIrdG1wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIicgZ2lidCBlcyBuaWNodCFcbiIpLCAwKTsKKyAgICAvL0RFQlVHKHNwcmludGYoIkNoYW5DbWQ6ICVPXG4iLGNtZCkpOworICAgIGlmIChzaXplb2YoY21kWzFdKSkgeworICAgICAgc3dpdGNoKGNtZFsxXVs8MV0pIHsKKyAgICBjYXNlICcrJzoKKyAgICAgIHN3aXRjaChDSE1BU1RFUi0+am9pbihjaCwgdGhpc19vYmplY3QoKSkpCisgICAgICB7CisgICAgICBjYXNlIEVfQUNDRVNTX0RFTklFRDoKKyAgICAgICAgbm90aWZ5X2ZhaWwoIkR1IGRhcmZzdCBhbiBkaWUgRWJlbmUgJyIrY2grIicgbmljaHQgaGVyYW4uXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICBjYXNlIEVfQUxSRUFEWV9KT0lORUQ6CisgICAgICAgIG5vdGlmeV9mYWlsKCJEdSBoYXN0IGRpZXNlIEViZW5lIHNjaG9uIGJldHJldGVuIVxuIik7CisgICAgICAgIHJldHVybiAwOworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICB9CisgICAgICB3cml0ZSgiRHUgYmV0cml0dHN0IGRpZSBFYmVuZSAnIitjaCsiJy5cbiIpOworICAgICAgaWYobWVtYmVyKFF1ZXJ5UHJvcChQX0NIQU5ORUxTKSwgY2ggPSBsb3dlcl9jYXNlKGNoKSkgPT0gLTEpCisgICAgICAgIFNldFByb3AoUF9DSEFOTkVMUywgUXVlcnlQcm9wKFBfQ0hBTk5FTFMpICsgKHsgY2ggfSkpOworICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSAnLSc6CisgICAgICBzd2l0Y2goQ0hNQVNURVItPmxlYXZlKGNoLCB0aGlzX29iamVjdCgpKSkKKyAgICAgIHsKKyAgICAgIGNhc2UgRV9BQ0NFU1NfREVOSUVEOgorICAgICAgICB3cml0ZSgiRHUga2FubnN0IGRpZSBFYmVuZSAnIitjaCsiJyBuaWNodCB2ZXJsYXNzZW4uXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEVfTk9UX01FTUJFUjoKKyAgICAgICAgd3JpdGUoIldpZSB3aWxsc3QgRHUgZWluZSBFYmVuZSB2ZXJsYXNzZW4sIHdlbGNoZSBEdSBuaWNodCAiCisgICAgICAgICAgICAgICJiZXRyZXRlbiBoYXN0P1xuIik7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgd3JpdGUoIkR1IHZlcmxhZXNzdCBkaWUgRWJlbmUgJyIrY2grIicuXG4iKTsKKyAgICAgICAgU2V0UHJvcChQX0NIQU5ORUxTLCBRdWVyeVByb3AoUF9DSEFOTkVMUykgLSAoeyBsb3dlcl9jYXNlKGNoKSwgY2ggfSkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHJldHVybiAxOworICAgIGNhc2UgJyEnOgorICAgIGNhc2UgJz8nOgorICAgIHsKKyAgICAgIG1hcHBpbmcgbDsKKyAgICAgIGlmKG1hcHBpbmdwKGwgPSBDSE1BU1RFUi0+bGlzdCh0aGlzX29iamVjdCgpKSkpCisgICAgICAgIGlmKHN0cmluZ3AoY2gpICYmIHNpemVvZihjaCkgJiYgcG9pbnRlcnAobFtjaCA9IGxvd2VyX2Nhc2UoY2gpXSkpCisgICAgICAgIHsKKyAgICAgICAgICBpbnQgYzsgb2JqZWN0IG87IHN0cmluZyBuOyBzdHJpbmcgKm07CisgICAgICAgICAgbT1zb3J0X2FycmF5KG1hcChsW2NoXVtJX01FTUJFUl0sIydnZXROYW1lLyonKi8sIFdFUiksIyc+LyonKi8pOworICAgICAgICAgIG0tPSh7IjxNYXN0ZVI+In0pOworICAgICAgICAgIHdyaXRlKGxbY2hdW0lfTkFNRV0rIiwgIitmdW5jYWxsKGxbY2hdW0lfSU5GT10pKyIuXG4iKTsKKyAgICAgICAgICB3cml0ZSgiRHUgc2llaHN0ICIrKChjID0gc2l6ZW9mKG0pKSA+IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKGMgPT0gMSA/ICJlaW4gR2VzaWNodCIgOiBjKyIgR2VzaWNodGVyIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIm5pZW1hbmRlbiIpKyIgYXVmIGRlciBFYmVuZSAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArbFtjaF1bSV9OQU1FXSsiJzpcbiIpOworICAgICAgICAgIHdyaXRlKGJyZWFrX3N0cmluZyhpbXBsb2RlKG0sIiwgIiksIDc4KSk7CisgICAgICAgICAgd3JpdGUoKGxbY2hdW0lfTUFTVEVSXSA/CisgICAgICAgICAgICAgICAgIGdldE5hbWUobFtjaF1bSV9NQVNURVJdKSA6IGdldE5hbWUobFtjaF1bSV9BQ0NFU1NdLCBXRVIpKQorICAgICAgICAgICAgICAgICsiIGhhdCBkYXMgU2FnZW4gYXVmIGRpZXNlciBFYmVuZS5cbiIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIG1peGVkIGxpc3Q7IGxpc3QgPSAoe30pOworICAgICAgICAgIGlmKGNtZFsxXVs8MV0gPT0gJyEnKQorICAgICAgICAgICAgbCAtPSBta21hcHBpbmcobV9pbmRpY2VzKGwpIC0gUXVlcnlQcm9wKFBfQ0hBTk5FTFMpKTsKKyAgICAgICAgICB3YWxrX21hcHBpbmcobCwgIydjcmVhdGVMaXN0LyonKi8sIFF1ZXJ5UHJvcChQX0NIQU5ORUxTKSwgJmxpc3QpOworICAgICAgICAgIGxpc3QgPSBzb3J0X2FycmF5KGxpc3QsICMnPi8qJyovKTsKKyAgICAgICAgICB0eHQgPSBzcHJpbnRmKCIlLTEyLjEyJyAncyAgW0FdICV8MTInICdzICglLTMnICdzKSAlLTQyLjQyc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJOYW1lIiwgIkVpZ25lciIsICJTcCIsICJCZXNjaHJlaWJ1bmciKQorICAgICAgICAgICAgICArICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorICAgICAgICAgICAgICArICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgorICAgICAgICAgICAgICArIGltcGxvZGUobGlzdCwgIiIpOworICAgICAgICAgIE1vcmUodHh0KTsKKyAgICAgICAgfQorICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGNhc2UgJyonOgorICAgIHsKKyAgICAgIG1peGVkIGhpc3Q7IGludCBhbW91bnQ7CisgICAgICBpZighcG9pbnRlcnAoaGlzdCA9IENITUFTVEVSLT5oaXN0b3J5KGNoLCB0aGlzX29iamVjdCgpKSkgCisJCSAgICAgIHx8ICFzaXplb2YoaGlzdCkpCisgICAgICB7CisgICAgICAgIHdyaXRlKCJFcyBpc3Qga2VpbmUgR2VzY2hpY2h0ZSBmdWVyICciK2NoKyInIHZlcmZ1ZWdiYXIuXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vKFplc3N0cmEpIGNtZCBoYXQgb2ZmZW5iYXIgaW1tZXIgMyBFbGVtZW50ZS4uLgorICAgICAgLy9iZWkgLWFsbCogKHsiIiwiYWxsKiIsIiJ9KQorICAgICAgLy9iZWkgLWFsbCoxMCAoeyIiLCJhbGwqLCIxMCJ9KQorICAgICAgLy9hbHNvIGlzdCBiZWkgLWFsbCogYW1vdW50IGltbWVyID09IDAgdW5kIGVzIGZ1bmt0aW9uaWVydCBlaGVyIHp1ZmFlbGxpZy4KKyAgICAgIC8qaWYoc2l6ZW9mKGNtZCkgPiAyKSAKKyAgICAgICAgYW1vdW50ID0gdG9faW50KGNtZFsyXSk7CisgICAgICBlbHNlIAorICAgICAgICBhbW91bnQ9c2l6ZW9mKGhpc3QpOyovCisgICAgICBhbW91bnQ9dG9faW50KGNtZFsyXSk7CisgICAgICBpZiAoYW1vdW50IDw9IDAgfHwgYW1vdW50ID49IHNpemVvZihoaXN0KSkKKyAgICAgICAgYW1vdW50PXNpemVvZihoaXN0KTsKKworICAgICAgdHh0ID0gIkZvbGdlbmRlcyBpc3QgYXVmICciK2NoKyInIHBhc3NpZXJ0OlxuIgorICAgICAgICAgICsgaW1wbG9kZShtYXAoaGlzdFs8YW1vdW50Li5dLCAjJ0NoYW5uZWxNZXNzYWdlLyonKi8sIDEpLCAiIik7CisgICAgICBNb3JlKHR4dCk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICB9CisgIH0KKyAgaWYoc2l6ZW9mKGNtZCA9IGltcGxvZGUoY21kWzIuLl0sICIiKSkpCisgICAgIGFyZ3MgPSBjbWQgKyAoc2l6ZW9mKGFyZ3MpID8gIiAiIDogIiIpICsgYXJnczsKKworICAvLyBLT250cm9sbGNoYXJzIGF1c2ZpbHRlcm4uCisgIGFyZ3MgPSByZWdyZXBsYWNlKGFyZ3MsIltbOmNudHJsOl1dIiwiIixSRV9QQ1JFfFJFX0dMT0JBTCk7CisgIGlmKCFzaXplb2YoYXJncykpIHJldHVybiAwOworCisgIC8vV2VubiBjbWQgbGVlciBpc3Q6IE1TR19TQVkKKyAgaWYgKCFzaXplb2YoY21kKSkgdHlwZT1NU0dfU0FZOworICBlbHNlIHsKKyAgICBzd2l0Y2goY21kWzBdKQorICAgIHsKKyAgICBjYXNlICc6JyA6CisgICAgICB0eXBlID0gTVNHX0VNT1RFOworICAgICAgYXJncyA9IGFyZ3NbMS4uXTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJzsnIDoKKyAgICAgIHR5cGUgPSBNU0dfR0VNT1RFOworICAgICAgYXJncyA9IGFyZ3NbMS4uXTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1wnJzoKKyAgICAgIGFyZ3MgPSBhcmdzWzEuLl07CisgICAgZGVmYXVsdCAgOiB0eXBlID0gTVNHX1NBWTsgYnJlYWs7CisgICAgfQorICB9CisgIGlmKCFjaCB8fCAhc2l6ZW9mKGNoKSkgY2ggPSBRdWVyeVByb3AoUF9TVERfQ0hBTk5FTCk7CisgIGlmKChlcnIgPSBDSE1BU1RFUi0+c2VuZChjaCwgdGhpc19vYmplY3QoKSwgYXJncywgdHlwZSkpIDwgMCkKKyAgICBpZighKGVyciA9IENITUFTVEVSLT5qb2luKGNoLCB0aGlzX29iamVjdCgpKSkpCisgICAgeworICAgICAgaWYobWVtYmVyKFF1ZXJ5UHJvcChQX0NIQU5ORUxTKSwgY2ggPSBsb3dlcl9jYXNlKGNoKSkgPT0gLTEpCisgICAgICAgIFNldFByb3AoUF9DSEFOTkVMUywgUXVlcnlQcm9wKFBfQ0hBTk5FTFMpICsgKHsgY2ggfSkpOworICAgICAgZXJyID0gQ0hNQVNURVItPnNlbmQoY2gsIHRoaXNfb2JqZWN0KCksIGFyZ3MsIHR5cGUpOworICAgIH0KKworICBzd2l0Y2goZXJyKQorICB7CisgIGNhc2UgRV9BQ0NFU1NfREVOSUVEOgorICAgIG5vdGlmeV9mYWlsKCJBdWYgZGVyIEViZW5lICciK2NoKyInIGRhcmZzdCBEdSBuaWNodHMgc2FnZW4uXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgY2FzZSBFX05PVF9NRU1CRVI6CisgICAgbm90aWZ5X2ZhaWwoIkR1IGhhc3QgZGllIEViZW5lICciK2NoKyInIG5pY2h0IGJldHJldGVuIVxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2ludCBDaGFubmVsQWRtaW4oc3RyaW5nIGFyZ3MpCit7CisgIHN0cmluZyBuLCBkZXNjciwgc2gsIGNuOworICBtaXhlZCBwYSwgdG1wOworICBhcmdzID0gX3VucGFyc2VkX2FyZ3MoKTsKKyAgbm90aWZ5X2ZhaWwoIkJlbnV0enVuZzogZWJlbmUgPEFia3Vlcnp1bmc+PTxFYmVuZT5cbiIKKyAgICAgICAgICAgICAgIiAgICAgICAgICAgZWJlbmUgPEFia3Vlcnp1bmc+PVxuIgorICAgICAgICAgICAgICAiICAgICAgICAgICBlYmVuZSBhYmt1ZXJ6dW5nZW4gW3N0YW5kYXJkXVxuIgorICAgICAgICAgICAgICAiICAgICAgICAgICBlYmVuZSBzdGFuZGFyZCA8RWJlbmU+XG4iCisgICAgICAgICAgICAgICIgICAgICAgICAgIGViZW5lIGFufGVpbnxhdXNcbiIKKyAgICAgICAgICAgICAgKyhRdWVyeVByb3AoUF9MRVZFTCkgPj0gNSA/CisgICAgICAgICAgICAgICAgIiAgICAgICAgICAgZWJlbmUgbmV1IDxOYW1lPiA8QmV6ZWljaG51bmc+XG4iCisgICAgIiAgICAgICAgICAgZWJlbmUgYmVzY2hyZWlidW5nIDxOYW1lPiA8QmVzY2hyZWlidW5nPlxuIiA6ICIiKQorICAgICAgICArKElTX0FSQ0godGhpc19vYmplY3QoKSkgPworICAgICAgICAgICIgICAgICAgICAgIGViZW5lIGtpbGwgPE5hbWU+XG4iCisJICAiICAgICAgICAgICBlYmVuZSBjbGVhciA8TmFtZT5cbiI6ICIiKSk7CisgIGlmKCFhcmdzIHx8ICFzaXplb2YoYXJncykpIHJldHVybiAwOworICBpZihzc2NhbmYoYXJncywgImtpbGwgJXMiLCBuKSAmJiBJU19BUkNIKHRoaXNfb2JqZWN0KCkpKQorICB7CisgICAgaWYoIShjbiA9IENITUFTVEVSLT5maW5kKG4sIHRoaXNfb2JqZWN0KCkpKSkgY24gPSBuOworICAgIHN3aXRjaChDSE1BU1RFUi0+cmVtb3ZlKGNuLCB0aGlzX29iamVjdCgpKSkKKyAgICB7CisgICAgY2FzZSBFX0FDQ0VTU19ERU5JRUQ6CisgICAgIG5vdGlmeV9mYWlsKCJEaWUgRWJlbmUgJyIrY24rIicgbGllcyBzaWNoIG5pY2h0IGVudGZlcm5lbiFcbiIpOworICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgd3JpdGUoIkR1IGVudGZlcm5zdCBkaWUgRWJlbmUgJyIrY24rIicuXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZihzc2NhbmYoYXJncywgImNsZWFyICVzIiwgbikgJiYgSVNfQVJDSCh0aGlzX29iamVjdCgpKSkKKyAgeworICAgIGlmKCEoY24gPSBDSE1BU1RFUi0+ZmluZChuLCB0aGlzX29iamVjdCgpKSkpIGNuID0gbjsKKyAgICBzd2l0Y2goQ0hNQVNURVItPmNsZWFyX2hpc3RvcnkoY24sIHRoaXNfb2JqZWN0KCkpKQorICAgIHsKKyAgICBjYXNlIEVfQUNDRVNTX0RFTklFRDoKKyAgICAgbm90aWZ5X2ZhaWwoIkRlciBWZXJsYXVmIHp1ciBFYmVuZSAnIitjbisiJyBsaWVzIHNpY2ggbmljaHQgZW50ZmVybmVuIVxuIik7CisgICAgIHJldHVybiAwOworICAgIH0KKyAgICB3cml0ZSgiRHUgZW50ZmVybnN0IGRlbiBWZXJsYXVmIHp1ciBFYmVuZSAnIitjbisiJy5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIGlmKHNzY2FuZihhcmdzLCAibmV1ICVzICVzIiwgbiwgZGVzY3IpID09IDIpCisgIHsKKyAgICBtaXhlZCB4OworICAgIGlmKFF1ZXJ5UHJvcChQX0xFVkVMKSA8IDUpCisgICAgICByZXR1cm4gKG5vdGlmeV9mYWlsKCJOZXVlIEViZW5lbiB6dSBlcnN0ZWxsZW4gaXN0IGRpciB2ZXJ3ZWhydC5cbiIpLCAwKTsKKyAgICBpZighc2l6ZW9mKHJlZ2V4cCgoeyBuIH0pLCAiXiIgQ0hBTk5FTENNRFMgQ0hBTk5FTENNRFMgIioiKSkpCisgICAgICByZXR1cm4gKG5vdGlmeV9mYWlsKCJEZXIgTmFtZSAnIituKyInIGlzdCBuaWNodCBrb25mb3JtIVxuIiksIDApOworICAgIGlmIChzaXplb2YobikgPiAyMCApCisgICAgICByZXR1cm4obm90aWZ5X2ZhaWwoIkRlciBOYW1lICciK24rIicgaXN0IHp1IGxhbmcuXG4iKSwgMCk7CisgICAgc3dpdGNoKHggPSBDSE1BU1RFUi0+bmV3KG4sIHRoaXNfb2JqZWN0KCksIGRlc2NyKSkKKyAgICB7CisgICAgY2FzZSBFX0FDQ0VTU19ERU5JRUQ6CisgICAgICBub3RpZnlfZmFpbCgiRGllc2UgRWJlbmUgZGFyZnN0IGR1IG5pY2h0IGVyc2NoYWZmZW4hXG4iKTsgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHdyaXRlKCJEdSBlcnNjaGFmZnN0IGRpZSBFYmVuZSAnIituKyInLlxuIik7CisgICAgICBTZXRQcm9wKFBfQ0hBTk5FTFMsIFF1ZXJ5UHJvcChQX0NIQU5ORUxTKSArICh7IGxvd2VyX2Nhc2UobikgfSkpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisgIGlmKHNzY2FuZihhcmdzLCAiYmVzY2hyZWlidW5nICVzICVzIiwgbiwgZGVzY3IpID09IDIpCisgIHsKKyAgICBtaXhlZCBjaDsKKyAgICBjbiA9IENITUFTVEVSLT5maW5kKG4sIHRoaXNfb2JqZWN0KCkpOworICAgIGlmKCFjbiB8fCBwb2ludGVycChjbikpCisgICAgICByZXR1cm4gKG5vdGlmeV9mYWlsKCJEaWUgRWJlbmUgJyIrbisiJyBleGlzdGllcnQgbmljaHQgb2RlciBkaWUgQW5nYWJlICIKKyAgICAgICAgIndhciBuaWNodCBlaW5kZXV0aWcuXG4iKSwgMCk7CisgICAgY2ggPSBDSE1BU1RFUi0+bGlzdCh0aGlzX29iamVjdCgpKTsKKyAgICBpZihjaFtsb3dlcl9jYXNlKGNuKV1bSV9NQVNURVJdICE9IHRoaXNfb2JqZWN0KCkpCisgICAgICByZXR1cm4gKG5vdGlmeV9mYWlsKCJEdSBiaXN0IG5pY2h0IGJlcmVjaHRpZ3QgZGllIEJlc2NocmVpYnVuZyBkZXIgRWJlbmUiCisgICAgICAgICIgJyIrY24rIicgenUgYWVuZGVybi5cbiIpLCAwKTsKKyAgICBjaFtsb3dlcl9jYXNlKGNuKV1bSV9JTkZPXSA9IGRlc2NyOworICAgIHdyaXRlKCJEaWUgRWJlbmUgJyIrY24rIicgaGF0IGFiIHNvZm9ydCBkaWUgQmVzY2hyZWlidW5nOlxuIitkZXNjcisiXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZihzc2NhbmYoYXJncywgIiVzPSVzIiwgc2gsIG4pID09IDIgJiYgc2l6ZW9mKG4pKQorICB7CisgICAgbWFwcGluZyBzYzsKKyAgICBpZihwb2ludGVycCh0bXAgPSBDSE1BU1RFUi0+ZmluZChuLCB0aGlzX29iamVjdCgpKSkgfHwgIXRtcCkKKyAgICAgIHJldHVybiAobm90aWZ5X2ZhaWwoIkJlbnV0enVuZzogZWJlbmUgPEFia3Vlcnp1bmc+PTxFYmVuZT5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKyhwb2ludGVycCh0bXApID8gaW1wbG9kZSh0bXAsICIsICIpICsgIlxuIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkViZW5lICciK24rIicgbmljaHQgZ2VmdW5kZW4hXG4iKSksIDApOworICAgIHNjID0gUXVlcnlQcm9wKFBfQ0hBTk5FTF9TSE9SVCk7CisgICAgaWYoIXNjKSBzYyA9IChbXSk7CisgICAgc2Nbc2hdID0gdG1wOworICAgIFNldFByb3AoUF9DSEFOTkVMX1NIT1JULCBzYyk7CisgICAgc2hvcnRjdXQgPSBRdWVyeVByb3AoUF9DSEFOTkVMX1NIT1JUKTsKKyAgICB3cml0ZSgiJyIrc2grIicgd2lyZCBqZXR6dCBhbHMgQWJrdWVyenVuZyBmdWVyICciK3RtcCsiJyBhbmVya2FubnQuXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZihzc2NhbmYoYXJncywgIiVzPSIsIHNoKSkKKyAgeworICAgIFNldFByb3AoUF9DSEFOTkVMX1NIT1JULCBtX2NvcHlfZGVsZXRlKFF1ZXJ5UHJvcChQX0NIQU5ORUxfU0hPUlQpIHx8IChbXSksIHNoKSk7CisgICAgc2hvcnRjdXQgPSBRdWVyeVByb3AoUF9DSEFOTkVMX1NIT1JUKTsKKyAgICB3cml0ZSgiRHUgbG9lc2Noc3QgZGllIEFia3Vlcnp1bmcgJyIrc2grIicuXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZihhcmdzID09ICJhbiIgfHwgYXJncyA9PSAiZWluIikKKyAgeworICAgIG1peGVkIGV4Y2w7CisgICAgaWYocG9pbnRlcnAoUXVlcnlQcm9wKFBfU1dBUF9DSEFOTkVMUykpKQorICAgICAgU2V0UHJvcChQX0NIQU5ORUxTLCBRdWVyeVByb3AoUF9TV0FQX0NIQU5ORUxTKSk7CisgICAgZWxzZQorICAgICAgU2V0UHJvcChQX0NIQU5ORUxTLCBtX2luZGljZXMoQ0hNQVNURVItPmxpc3QodGhpc19vYmplY3QoKSkpKTsKKyAgICBleGNsID0gUmVnaXN0ZXJDaGFubmVscygpOworICAgIHdyaXRlKCJEdSBzY2hhbHRlc3QgZm9sZ2VuZGUgRWJlbmVuIGVpbjpcbiIKKyAgICAgICAgICArYnJlYWtfc3RyaW5nKGltcGxvZGUoUXVlcnlQcm9wKFBfQ0hBTk5FTFMpIC0gZXhjbCwgIiwgIiksIDc4KSk7CisgICAgU2V0UHJvcChQX1NXQVBfQ0hBTk5FTFMsIDApOworICAgIHJldHVybiAxOworICB9CisgIGlmKGFyZ3MgPT0gImF1cyIpCisgIHsKKyAgICBTZXRQcm9wKFBfU1dBUF9DSEFOTkVMUywgUXVlcnlQcm9wKFBfQ0hBTk5FTFMpKTsKKyAgICBSZW1vdmVDaGFubmVscygpOworICAgIFNldFByb3AoUF9DSEFOTkVMUywgKHt9KSk7CisgICAgd3JpdGUoIkR1IHN0ZWxsc3QgZGllIEViZW5lbiBhYi5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIHBhID0gb2xkX2V4cGxvZGUoYXJncywgIiAiKTsKKyAgaWYoIXN0cnN0cigiYWJrdWVyenVuZ2VuIiwgcGFbMF0pKQorICB7CisgICAgc3RyaW5nIHR4dDsgdHh0ID0gIiI7CisgICAgaWYoc2l6ZW9mKHBhKSA+IDEgJiYgIXN0cnN0cigic3RhbmRhcmQiLCBwYVsxXSkpCisgICAgeworICAgICAgd3JpdGUoIkRpZSBTdGFuZGFyZCBBYmt1ZXJ6dW5nZW4gd2VyZGVuIGdlc2V0enQuXG4iKTsKKyAgICAgIFNldFByb3AoUF9DSEFOTkVMX1NIT1JULCBERUZBVUxUX1NIT1JUQ1VUUworICAgICAgICAgICAgICArIChJU19MRUFSTkVSKHRoaXNfb2JqZWN0KCkpID8gV0laQVJEX1NIT1JUQ1VUUyA6IChbXSkpKTsKKyAgICB9CisgICAgd2Fsa19tYXBwaW5nKFF1ZXJ5UHJvcChQX0NIQU5ORUxfU0hPUlQpLAorICAgICAgICAgICAgICAgICBsYW1iZGEoKHsnaS8qJyovLCAnYywgJ3J9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh7IycrPSwgJ3IvKicqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHsjJ3NwcmludGYvKicqLywgIiU1LjVzID0gJXNcbiIsICdpLCAnY30pfSkpLAorICAgICAgICAgICAgICAgICAmdHh0KTsKKyAgICB0eHQgPSBzcHJpbnRmKCJGb2xnZW5kZSBBYmt1ZXJ6dW5nZW4gc2luZCBkZWZpbmllcnQ6XG4lLTc4I3NcbiIsCisgICAgICAgICAgICAgICAgICBpbXBsb2RlKHNvcnRfYXJyYXkob2xkX2V4cGxvZGUodHh0LCAiXG4iKSwgIyc+LyonKi8pLCAiXG4iKSk7CisgICAgTW9yZSh0eHQpOworICAgIHJldHVybiAxOworICB9CisgIGlmKCFzdHJzdHIoInN0YW5kYXJkIiwgcGFbMF0pKQorICAgIGlmKHNpemVvZihwYSkgPCAyKQorICAgICAgcmV0dXJuIChub3RpZnlfZmFpbCgiQmVudXR6dW5nOiBlYmVuZSBzdGFuZGFyZCA8RWJlbmU+XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICsoUXVlcnlQcm9wKFBfU1REX0NIQU5ORUwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAiTW9tZW50YW4gaXN0ICciK1F1ZXJ5UHJvcChQX1NURF9DSEFOTkVMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiJyBlaW5nZXN0ZWxsdC5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJFcyBpc3Qga2VpbmUgU3RhbmRhcmRlYmVuZSBlaW5nZXN0ZWxsdC5cbiIpKSwwKTsKKyAgICBlbHNlCisgICAgICBpZihwb2ludGVycCh0bXAgPSBDSE1BU1RFUi0+ZmluZChwYVsxXSwgdGhpc19vYmplY3QoKSkpKQorICAgICAgICByZXR1cm4gKG5vdGlmeV9mYWlsKCJEYXMgd2FyIGtlaW5lIGVpbmRldXRpZ2UgQW5nYWJlISAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZvbGdlbmRlIEViZW5lbiBwYXNzZW46XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgK2JyZWFrX3N0cmluZyhpbXBsb2RlKHRtcCwgIiwgIiksIDc4KSksIDApOworICAgICAgZWxzZQorICAgICAgICBpZighdG1wKSByZXR1cm4gKG5vdGlmeV9mYWlsKCJFYmVuZSAnIitwYVsxXSsiJyBuaWNodCBnZWZ1bmRlbiFcbiIpLDApOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB3cml0ZSgiJyIrdG1wKyInIGlzdCBqZXR6dCBkaWUgU3RhbmRhcmRlYmVuZS5cbiIpOworICAgICAgICAgIFNldFByb3AoUF9TVERfQ0hBTk5FTCwgdG1wKTsKKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICByZXR1cm4oMCk7Cit9CisKZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvY29tYmF0LmMgYi9zdGQvcGxheWVyL2NvbWJhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiYjVhMWIKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL2NvbWJhdC5jCkBAIC0wLDAgKzEsMjE3IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gcGxheWVyL2NvbWJhdC5jIC0tIGNvbWJhdCBzdGF0aXN0aWNzCisvLworLy8gJElkOiBjb21iYXQuYyA5MDA4IDIwMTUtMDEtMDYgMTc6MjA6MTdaIFplc3N0cmEgJAorI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCitpbmhlcml0ICIvc3RkL2xpdmluZy9jb21iYXQiOworaW5oZXJpdCAiL3N0ZC9wbGF5ZXIvcGtsb2ciOworCisjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxjb21iYXQuaD4KKyNpbmNsdWRlIDxuZXdfc2tpbGxzLmg+CisKKyNkZWZpbmUgTUUgdGhpc19vYmplY3QoKQorI2RlZmluZSBTVEFUTUFTVEVSICIvcC9zZXJ2aWNlL3JvY2h1cy9ndWlsZHN0YXQvbWFzdGVyIgorCitwcml2YXRlIG5vc2F2ZSBjbG9zdXJlIG1vZF9kZWZfc3RhdDsKK3ByaXZhdGUgbm9zYXZlIHN0cmluZyAqcGxBdHRhY2tlZCA9ICh7fSk7CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpIHsKKyAgY29tYmF0OjpjcmVhdGUoKTsKKyAgLy8gUF9OT19BVFRBQ0sgaXN0IG5pY2h0IGZ1ZXIgU3BpZWxlciBnZWRhY2h0LiBBdXNuYWhtZTogU3BpZWxlciBpc3QKKyAgLy8gR2Vpc3QsIGRhbm4gc2V0enQgZGFzIFNwaWVsZXJvYmpla3QgYWJlciBzZWxiZXIuCisgIFNldChQX05PX0FUVEFDSywgU0VDVVJFRHxOT1NFVE1FVEhPRCwgRl9NT0RFX0FTKTsKKyAgCisgIFNldChQX0hFTFBFUl9OUEMsIFBST1RFQ1RFRCwgRl9NT0RFKTsKKyAgU2V0UHJvcChQX0hFTFBFUl9OUEMsIChbXSkgKTsKK30KKworLy8gTWFza2UgZnVlciBhbGxlIG1vZWdsaWNoZW4gS2xhc3NlbiB2b24gSGVsZmVyLU5QQworI2RlZmluZSBDTEFTU19NQVNLIDB4MWZmZmZmZmYKKy8qKiByZWdpc3RyaWVydCBkZW4gTlBDIGFscyBIZWxmZXIgdm9uIGRpZXNlbSBTcGllbGVyLgorICBAcGFyYW1baW5dIG5wYyBvYmplY3QgSGVsZmVyLU5QQworICBAcGFyYW1baW5dIGZsYWdzIGludCBCaXRmZWxkIHZvbiBGbGFncworICBAcmV0dXJuIGludCAxLCBmYWxscyBkZXIgSGVsZmVyLU5QQyByZWdpc3RyaWVydCB3dXJkZSB1bmQgbm9jaCBuaWNodAorICByZWdpc3RyaWVydCB3YXIuCisgIEBhdHRlbnRpb24gTnV0enQgYXVzLCBkYXNzIFF1ZXJ5UHJvcChQX0hFTFBFUl9OUEMpIF9rZWluZV8gS29waWUgZGVzCisgIE1hcHBpbmdzIGluIGRlciBQcm9wIGxpZWZlcnQuCisgICovCitwdWJsaWMgaW50IFJlZ2lzdGVySGVscGVyTlBDKG9iamVjdCBucGMsIGludCBmbGFncykgeworICBpZiAoIW9iamVjdHAobnBjKSkKKyAgICByYWlzZV9lcnJvcihzcHJpbnRmKCAiV3JvbmcgYXJndW1lbnQgMSBpbiBSZWdpc3RlckhlbHBlck5QQygpLiAiCisgICAgICAgICAgIkV4cGVjdGVkIDxvYmplY3Q+LCBnb3QgJS4xMDBPXG4iLCBucGMpKTsKKyAgaWYgKCFpbnRwKGZsYWdzKSB8fCBmbGFncyA8IDEpCisgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoICJXcm9uZyBhcmd1bWVudCAyIGluIFJlZ2lzdGVySGVscGVyTlBDKCkuICIKKyAgICAgICAgICAiRXhwZWN0ZWQgcG9zaXRpdmUgPGludD4sIGdvdCAlT1xuIiwgZmxhZ3MpKTsKKyAgCisgIG1hcHBpbmcgaGVscGVycyA9IFF1ZXJ5UHJvcChQX0hFTFBFUl9OUEMpOworICAKKyAgLy8gc2Nob24gcmVnaXN0cmllcnRlIHNpbmQgd2l0emxvcy4KKyAgaWYgKG1lbWJlcihoZWxwZXJzLCBucGMpKQorICAgIHJldHVybiAwOworICAKKyAgLy8gYXVmIGV4a2x1c2l2ZSBIZWxmZXIgcHJ1ZWZlbi4KKyAgZm9yZWFjaChvYmplY3QgaGVscGVyLCBpbnQgZmw6IGhlbHBlcnMpIHsKKyAgICAvLyBmbGFncyBpZGVudGlzY2g/IERhbm4gS2xhc3NlIHVuZCBFeGtsdXNpdml0YWV0IGlkZW50aXNjaAorICAgIGlmIChmbCA9PSBmbGFncykKKyAgICAgIHJldHVybiAwOworICAgIC8vIG9kZXIgZWluZXIgdm9uIGJlaWRlbiBleGtsdXNpdiB1bmQgYmVpZGUgaW4gZGVyIGdsZWljaGVuIEtsYXNzZT8KKyAgICBlbHNlIGlmICggKChmbCAmIEVYQ0xVU0lWRV9IRUxQRVIpIHx8IChmbGFncyAmIEVYQ0xVU0lWRV9IRUxQRVIpKQorICAgICAgICAgICAgICAmJiAoKGZsICYgQ0xBU1NfTUFTSykgPT0gKGZsYWdzICYgQ0xBU1NfTUFTSykpICkKKyAgICAgIHJldHVybiAwOworICB9CisgIC8vIHNjaGVpbnQgd29obCBvayB6dSBzZWluLiBSZWdpc3RyaWVyZW4gdW5kIFByb3AgaW0gTlBDIHNldHplbi4KKyAgaGVscGVycyArPSAoWyBucGM6IGZsYWdzIF0pOworICBucGMtPlNldFByb3AoUF9IRUxQRVJfTlBDLCAoeyB0aGlzX29iamVjdCgpLCBmbGFncyB9KSApOworICAvLyBtb21lbnRhbiB1bm5vZXRpZywgZGEgaGVscGVycyBrZWluZSBLb3BpZSBpc3QuCisgIC8vIFNldFByb3AoUF9IRUxQRVJfTlBDLCBoZWxwZXJzKTsKKworICByZXR1cm4gMTsKK30KKyN1bmRlZiBDTEFTU19NQVNLCisKKy8qKiBkZS1yZWdpc3RyaWVydCBkZW4gTlBDIGFscyBIZWxmZXIgdm9uIGRpZXNlbSBTcGllbGVyLgorICBAcGFyYW1baW5dIG5wYyBvYmplY3QgSGVsZmVyLU5QQworICBAcmV0dXJuIGludCAxLCBmYWxscyBkZXIgSGVsZmVyLU5QQyByZWdpc3RyaWVydCB3YXIgdW5kIGVudGZlcm50IHd1cmRlLgorICBAYXR0ZW50aW9uIE51dHp0IGF1cywgZGFzcyBRdWVyeVByb3AoUF9IRUxQRVJfTlBDKSBfa2VpbmVfIEtvcGllIGRlcworICBNYXBwaW5ncyBpbiBkZXIgUHJvcCBsaWVmZXJ0LgorICovCitwdWJsaWMgaW50IFVucmVnaXN0ZXJIZWxwZXJOUEMob2JqZWN0IG5wYykgeworICBpZiAoIW9iamVjdHAobnBjKSkKKyAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJXcm9uZyBhcmd1bWVudCBpbiBVbnJlZ2lzdGVySGVscGVybk5QQygpLiAiCisgICAgICAgICAgIkV4cGVjdGVkIDxvYmplY3Q+LCBnb3QgJS4xMDBPXG4iLCBucGMpKTsKKworICBtYXBwaW5nIGhlbHBlcnMgPSBRdWVyeVByb3AoUF9IRUxQRVJfTlBDKTsKKyAgaWYgKG1lbWJlcihoZWxwZXJzLCBucGMpKSB7CisgICAgbV9kZWxldGUoaGVscGVycywgbnBjKTsKKyAgICAvLyBtb21lbnRhbiB1bm5vZXRpZywgZGEgaGVscGVycyBrZWluZSBLb3BpZSBpc3QuCisgICAgLy8gU2V0UHJvcChQX0hFTFBFUl9OUEMsIGhlbHBlcnMpOworICAgIG5wYy0+U2V0UHJvcChQX0hFTFBFUl9OUEMsIDApOworICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQorCisvKiogRmVpbmQgZWludHJhZ2VuLgorICAqIFRyYWVndCBvYiBhbHMgRmVpbmQgZWluLiBEaWVzIGFsbGVyZGluZ3MgbnVyLCB3ZW5uIG9iIGtlaW4gU3BpZWxlciBpc3QKKyAgKiBvZGVyIGJlaWRlIFNwaWVsZXIgKGRpZXNlcyBPYmpla3QgdW5kIG9iKSBpbiBkZXIgU2NoYXR0ZW53ZWx0IHNpbmQgb2RlcgorICAqIGJlaWRlIFNwaWVsZXIgVGVzdHNwaWVsZXIgc2luZC4KKyAgIEBwYXJhbVtpbl0gb2IgcG90ZW50aWVsbGVyIEZlaW5kLgorICAgQHJldHVybiBpbnQgMSwgZmFsbHMgb2IgYWxzIF9uZXVlcl8gRmVpbmQgZWluZ2V0cmFnZW4gd3VyZGUuCisgICAqLworcHVibGljIGludCBJbnNlcnRFbmVteShvYmplY3Qgb2IpIHsKKyAgLy8gd2VubiBvYiBlaW4gU3BpZWxlciBpc3QgdW5kIG5pY2h0IHNvd29obCBpY2ggYWxzIGF1Y2ggb2IgaW4gZGVyCisgIC8vIFNjaGF0dGVud2VsdCBzaW5kLCB3aXJkIG9iIG5pY2h0IGFscyBGZWluZCBlaW5nZXRyYWdlbi4KKyAgaWYgKHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2IpCisgICAgICAmJiAoc3Ryc3RyKG9iamVjdF9uYW1lKGVudmlyb25tZW50KG9iKSksIi9kL3NjaGF0dGVud2VsdC8iKSE9MAorICAgICAgICAgIHx8IHN0cnN0cihvYmplY3RfbmFtZShlbnZpcm9ubWVudChNRSkpLCIvZC9zY2hhdHRlbndlbHQvIikhPTApCisgICAgICAmJiAoIVF1ZXJ5UHJvcChQX1RFU1RQTEFZRVIpIHx8ICFvYi0+UXVlcnlQcm9wKFBfVEVTVFBMQVlFUikpCisgICAgICkKKyAgeworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiA6Okluc2VydEVuZW15KG9iKTsKK30KKworLyoqIEhhdCBkaWVzZXIgU3BpZWxlciBkZW4gU3BpZWxlciBwbCBhbmdlZ3JpZmZlbj8uCisgIEBwYXJhbVtpbl0gcGwgb2JqZWN0IHp1IHBydWVmZW5kZXIgU3BpZWxlcgorICBAcmV0dXJuIGludCAxLCBmYWxscyBkaWVzZXIgU3BpZWxlciBwbCBhbmdlZ3JpZmZlbiBoYXQuCisgIEBhdHRlbnRpb24gTmViZW5lZmZla3Q6IGJlcmVpbmlndCBkZW4gaW50ZXJuZW4gU3BlaWNoZXIgdm9uIFVJRHMgdm9uCisgIHplcnN0b2VydGVuIFNwaWVsZXJuIHVuZCBzb2xjaGVuLCBkaWUga2VpbmUgRmVpbmRlIG1laHIgc2luZC4KKyAgKi8KK3B1YmxpYyBpbnQgUXVlcnlQbEF0dGFja2VkKG9iamVjdCBwbCkgeworICBvYmplY3Qgb2I7CisKKyAgaWYgKCAhb2JqZWN0cChwbCkgKQorICAgIHJldHVybiAwOworCisgIGZvcmVhY2goc3RyaW5nIHBsbmFtZTogcGxBdHRhY2tlZCkgeworICAgIGlmICggISggb2I9KGZpbmRfcGxheWVyKHBsbmFtZSl8fGZpbmRfbmV0ZGVhZChwbG5hbWUpKSApCisgICAgICAgIHx8ICggIUlzRW5lbXkob2IpICYmICEob2ItPklzRW5lbXkoTUUpKSApICkKKyAgICAgIHBsQXR0YWNrZWQgLT0gKHtwbG5hbWV9KTsgLy8gamEsIGRhcyBnZWh0LiA7LSkKKyAgfQorICByZXR1cm4gKG1lbWJlciggcGxBdHRhY2tlZCwgZ2V0dWlkKHBsKSApID49IDApOworfQorCisvKioga2lsbCAtIEthbXBmIHN0YXJ0ZW4uCisgKiBGdWVndCBvYiBkZXIgRmVpbmRlc2xpc3RlIGhpbnp1LgorICovCitwdWJsaWMgaW50IEtpbGwob2JqZWN0IG9iKSB7CisKKyAgaWYgKCFvYmplY3RwKG9iKSkgcmV0dXJuIDA7CisKKyAgLy8gZGllcyBkaWVudCBudXIgZGF6dSwgZGFzIHBsQXR0YWNrZWQgbWFwcGluZyB6dSBiZXJlaW5pZ2VuLgorICAvLyBUT0RPOiBiZXNzZXIgbWFjaGVuLiA7LSkKKyAgaWYgKCBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iKSAmJiAhSXNFbmVteShvYikpIHsKKyAgICBRdWVyeVBsQXR0YWNrZWQoTUUpOworICAgIG9iLT5RdWVyeVBsQXR0YWNrZWQob2IpOyAvLyBha3R1YWxpc2llcmVuIC4uLgorICB9CisKKyAgaW50IHJlcyA9IGNvbWJhdDo6S2lsbChvYik7CisKKyAgLy8gZmFsbHMgb2IgbmVuIFNwaWVsZXIgaXN0LCBwcnVlZmVuLCBvYiBlcyBlaW4gU3BpZWxlci1TcGllbGVyLUFuZ3JpZmYKKyAgLy8gaXN0LgorICAvLyBEYWJlaSBnZ2YuIGxvZ2dlbiB1bmQgTWFnaWVyIHZlcnN0YWVuZGlnZW4uCisgIGlmIChxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iKSAmJiBDaGVja1BsYXllckF0dGFjayhNRSwgb2IsIDApKQorICB7CisgICAgaWYgKHJlcyA9PSAtNCkgLy8gZmVpbmQgd3VyZGUgbmljaHQgZWluZ2V0cmFnZW4KKyAgICAgIHRlbGxfb2JqZWN0KE1FLCAiRWluIGdvZXR0bGljaGVyIEJlZmVobCBoaW5kZXJ0IERpY2ggYW0gS2FtcGYuXG4iKTsKKyAgICBlbHNlCisgICAgICBwbEF0dGFja2VkICs9ICh7IGdldHVpZChvYikgfSk7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitwdWJsaWMgaW50IERlZmVuZChpbnQgZGFtLCBzdHJpbmd8c3RyaW5nKiBkYW1fdHlwZSwgaW50fG1hcHBpbmcgc3BlbGwsIG9iamVjdCBlbmVteSkgeworICBpbnQgZGVsdGFfaHAscmVzOworCisgIGlmIChxdWVyeV9vbmNlX2ludGVyYWN0aXZlKE1FKQorICAgICAgJiYgIUlTX0xFQVJORVIoTUUpCisgICAgICAmJiAhb2JqZWN0cChnZXRfdHlwZV9pbmZvKG1vZF9kZWZfc3RhdCwyKSkpIHsKKyAgICBvYmplY3QgbWE7CisgICAgaWYgKCFvYmplY3RwKG1hPWZpbmRfb2JqZWN0KFNUQVRNQVNURVIpKSkKKyAgICAgIHJldHVybiA6OkRlZmVuZChkYW0sZGFtX3R5cGUsc3BlbGwsZW5lbXkpOworICAgIC8vIFN0YXRpc3RpayBudXIgYXVmcnVmZW4gZmFsbHMgTWFzdGVyIGdlbGFkZW4KKyAgICBtb2RfZGVmX3N0YXQ9c3ltYm9sX2Z1bmN0aW9uKCJNb2RpZnlEZWZlbmRTdGF0IixtYSk7CisgIH0KKworICBpZiAoY2xvc3VyZXAobW9kX2RlZl9zdGF0KSkKKyAgICBkZWx0YV9ocD1RdWVyeVByb3AoUF9IUCk7CisKKyAgcmVzPTo6RGVmZW5kKGRhbSxkYW1fdHlwZSxzcGVsbCxlbmVteSk7CisKKyAgaWYgKGNsb3N1cmVwKG1vZF9kZWZfc3RhdCkpIHsKKyAgICBkZWx0YV9ocC09UXVlcnlQcm9wKFBfSFApOworICAgIGlmIChkZWx0YV9ocDwwKQorICAgICAgZGVsdGFfaHA9MDsKKyAgICBmdW5jYWxsKG1vZF9kZWZfc3RhdCwKKyAgICAgICAgICAgIFF1ZXJ5UHJvcChQX0dVSUxEKSwKKyAgICAgICAgICAgIFF1ZXJ5UHJvcChQX0dVSUxEX0xFVkVMKSwKKyAgICAgICAgICAgIGRhbS0xMCpkZWx0YV9ocCwKKyAgICAgICAgICAgIGRhbV90eXBlLAorICAgICAgICAgICAgc3BlbGwpOworICB9CisKKyAgcmV0dXJuIHJlczsKK30KKworLy8gU3BpZWxlciBrb2VubmVuIGFscyBHZWlzdCBuaWNodCBr5G1wZmVuCisvLyBUT0RPOiBwcnVlZmVuLCBvYiBkYXMgU2V0emVuIHVuZCBMb2VzY2hlbiBkZXIgUHJvcCBpbiBzZXRfZ2hvc3QoKSBuaWNodAorLy8gYXVjaCBhdXNyZWljaGVuIHd1ZXJkZS4gSW4gZGVtIEZhbGwgbXVlc3N0ZSBtYW4gYWJlciBQX05PX0FUVEFDSyBhdWNoCisvLyBzcGVpY2hlcm4sIGRhIFBfR0hPU1QgZ2VzcGVpY2hlcnQgd2lyZC4uLgorc3RhdGljIG1peGVkIF9xdWVyeV9ub19hdHRhY2soKQoreworICAgIGlmICggUXVlcnlQcm9wKFBfR0hPU1QpICkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICByZXR1cm4gUXVlcnkoUF9OT19BVFRBQ0spOworfQpkaWZmIC0tZ2l0IGEvc3RkL3BsYXllci9jb21tLmMgYi9zdGQvcGxheWVyL2NvbW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTFmMWRlCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9jb21tLmMKQEAgLTAsMCArMSwxOTIyIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gcGxheWVyL2NvbW0uYy0tIGJhc2ljIHBsYXllciBjb21tdW5pY3Rpb24gY29tbWFuZHMKKy8vCisvLyAkSWQ6IGNvbW0uYyA5NTc2IDIwMTYtMDYtMTggMTU6MDA6MDFaIFplc3N0cmEgJAorI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworLy8jcHJhZ21hIHJhbmdlX2NoZWNrCisKK2luaGVyaXQgIi9zdGQvbGl2aW5nL2NvbW0iOworaW5oZXJpdCAiL3N0ZC9wbGF5ZXIvY2hhbm5lbCI7Citpbmhlcml0ICIvc3RkL3BsYXllci9jb21tX3N0cnVjdHMiOworCisjaW5jbHVkZSA8aW5wdXRfdG8uaD4KKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDxwbGF5ZXIvcXVlc3QuaD4KKyNpbmNsdWRlIDxwbGF5ZXIvZ21jcC5oPgorI2luY2x1ZGUgPGxpdmluZy9kZXNjcmlwdGlvbi5oPgorI3VuZGVmIE5FRURfUFJPVE9UWVBFUworCisjaW5jbHVkZSA8c3lzX2RlYnVnLmg+CisKKyNpbmNsdWRlIDx0aGluZy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8cGxheWVyL2NvbW0uaD4KKyNpbmNsdWRlIDxwbGF5ZXIvYmFzZS5oPgorCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGFuc2kuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPHVkcC5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxkYWVtb24uaD4KKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjaW5jbHVkZSA8cmVnZXhwLmg+CisjaW5jbHVkZSA8aW50ZXJhY3RpdmVfaW5mby5oPgorCisjZGVmaW5lIFRFTExISVNUX0RJU0FCTEVEICAgMAorI2RlZmluZSBURUxMSElTVF9OT19NRVNTQUdFIDEKKyNkZWZpbmUgVEVMTEhJU1RfRU5BQkxFRCAgICAyCisjZGVmaW5lIFRFTExISVNUX0xPTkdMSUZFICAgMworCisjZGVmaW5lIEVDSE9fQ09TVCA1MAorI2RlZmluZSBFUldJREVSX1BBUkFNICIsIgorCisjZGVmaW5lIFpERUJVRyh4KSAgaWYgKGZpbmRfcGxheWVyKCJ6ZXNzdHJhIikpXAorICAgICAgICAgICAgICBlZnVuOjp0ZWxsX29iamVjdChmaW5kX3BsYXllcigiemVzc3RyYSIpLCJDb21tREJHOiAiK3grIlxuIikKKworcHJpdmF0ZSBpbnQgdGVsbF9oaXN0b3J5X2VuYWJsZWQgPSBURUxMSElTVF9OT19NRVNTQUdFOworcHJpdmF0ZSBub3NhdmUgbWFwcGluZyB0ZWxsX2hpc3Rvcnk9KFtdKTsKK3ByaXZhdGUgbm9zYXZlIHN0cmluZyAqY29tbXJlY2VpdmVycyA9ICh7fSk7Citwcml2YXRlIG5vc2F2ZSBzdHJpbmcgbGFzdF9jb21tX3BhcnRuZXI7Citwcml2YXRlIG5vc2F2ZSBpbnQgbGFzdF9iZWVwX3RpbWU7CisKKy8vIFN0YXR1c3JlcG9ydGUgYWt0aXZpZXJ0PyBCaW5hZXJlIEZsYWdzIChzLiBzZXRfcmVwb3J0KCkpCitwcml2YXRlIGludCBzdGF0X3JlcG9ydHM7CisvLyBpbnRlcm5lciBDYWNoZSBmdWVyIGRpZSBMUC9LUC9HaWZ0LVdlcnRlIGZ1ZXIgZGllIFN0YXR1c3JlcG9ydC1BdXNnYWJlbgorLy8gRWludHJhZWdlIChpbiBkaWVzZXIgUmVpaGVuZm9sZ2UpOiBQX0hQLCBQX1NQLCBHaWZ0c3RhdHVzCisvLyBJbml0aWFsaXNpZXJ1bmcgZXJmb2xndCBiZWltIGVyc3RlbiBSZXBvcnQgbmFjaCBMb2dpbgorcHJpdmF0ZSBub3NhdmUgbWl4ZWQgKnJlcG9ydF9jYWNoZTsKKworLy8gUHVmZmVyIGZ1ZXIgS29ib2xkLgorcHJpdmF0ZSBub3NhdmUgc3RydWN0IG1zZ19idWZmZXJfcyBrb2JvbGQgPSAoPG1zZ19idWZmZXJfcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZjogYWxsb2NhdGUoMzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IC0xLCk7CisjZGVmaW5lIE1BWF9LT0JPTERfTElNSVQgMjU2CisKK3ZhcmFyZ3Mgc3RyaW5nIG5hbWUoaW50IGNhc3VzLCBpbnQgZGVtb25zdCk7CisKKy8vbG9jYWwgcHJvcGVydHkgcHJvdG90eXBlcworc3RhdGljIGludCBfcXVlcnlfaW50ZXJtdWQoKTsKK3B1YmxpYyBpbnQgUmVtb3ZlSWdub3JlKHN0cmluZyBpZ24pOworcHVibGljIGludCBBZGRJZ25vcmUoc3RyaW5nIGlnbik7CisKK3B1YmxpYyB2YXJhcmdzIGludCBSZWNlaXZlTXNnKHN0cmluZyBtc2csIGludCBtc2dfdHlwZSwgc3RyaW5nIG1zZ19hY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbXNnX3ByZWZpeCwgb2JqZWN0IG9yaWdpbik7CisKKy8vIGVyemV1Z3Qgc29ydGllcnRlIExpc3RlIGFuIEtvbW11bmlrYXRpb25zcGFydG5lcm4KK3ByaXZhdGUgc3RyaW5nICpzb3J0ZWRfY29tbXBhcnRuZXJzKGludCByZXZlcnNlZCk7CisKK3ByaXZhdGUgbm9zYXZlIHN0cmluZyAqYnVmZmVyID0gKHt9KTsKKwordm9pZCBjcmVhdGUoKQoreworICA6OmNyZWF0ZSgpOworICBTZXQoUF9FQVJNVUZGUywgMCk7CisgIFNldChQX0VBUk1VRkZTLCBTQVZFLCBGX01PREUpOworICBTZXQoUF9FQVJNVUZGUywgU0VDVVJFRCwgRl9NT0RFKTsKKyAgU2V0KFBfSU5URVJNVUQsIFNBVkUsIEZfTU9ERSk7CisgIFNldChQX0lHTk9SRSwgKFtdKSwgRl9WQUxVRSk7CisgIFNldChQX0lHTk9SRSwgU0FWRSwgRl9NT0RFKTsKKyAgU2V0KFBfQlVGRkVSLCBTQVZFLCBGX01PREUpOworICBTZXQoUF9NRVNTQUdFX1BSRVBFTkQsIFNBVkUsIEZfTU9ERV9BUyk7CisgIFNldChQX01FU1NBR0VfQkVFUCwgU0FWRSwgRl9NT0RFX0FTKTsKK30KKwordm9pZCBjcmVhdGVfc3VwZXIoKQoreworICBzZXRfbmV4dF9yZXNldCgtMSk7Cit9CisKKy8vIHVlYmVybWl0dGVsdCBlaW5lIE1UX05PVElGSUNBVElPTiBhbiB0aGlzX29iamVjdCgpLCB3ZWxjaGUgbmljaHQgaWdub3JpZXJ0CisvLyB3ZXJkZW4ga2FubiB1bmQgYXVjaCBuaWNodCBnZXNwZWljaGVydCB3aXJkLgorcHJvdGVjdGVkIHZvaWQgX25vdGlmeShzdHJpbmcgbXNnLCBzdHJpbmcgYWN0aW9uKSB7CisgIFJlY2VpdmVNc2cobXNnLAorICAgICAgICAgICAgIE1UX05PVElGSUNBVElPTnxNU0dfRE9OVF9CVUZGRVJ8TVNHX0RPTlRfSUdOT1JFfE1TR19ET05UX1NUT1JFLAorICAgICAgICAgICAgIGFjdGlvbiwgMCwgdGhpc19vYmplY3QoKSk7Cit9CisKK3Byb3RlY3RlZCB2b2lkIHVwZGF0ZXNfYWZ0ZXJfcmVzdG9yZShpbnQgbmV3ZmxhZykgeworICAvLyBBbHRlcyBJZ25vcmllcmUgbG9lc2NoZW4uLi4KKyAgbWl4ZWQgaWduID0gUXVlcnkoUF9JR05PUkUsRl9WQUxVRSk7CisgIGlmICghbWFwcGluZ3AoaWduKSkKKyAgeworICAgIGlmIChwb2ludGVycChpZ24pKQorICAgICAgX25vdGlmeShicmVha19zdHJpbmcoCisgICAgICAgICJEZWluZSBJZ25vcmllcmUtRWluc3RlbGx1bmdlbiB3dXJkZW4gc29lYmVuIGdlbG9lc2NodCwgIgorICAgICAgICAid2VpbCBlcyBlaW5lIEFrdHVhbGlzaWVydW5nIGRlciBJZ25vcmllcmVmdW5rdGlvbiBnYWIsICIKKyAgICAgICAgImJlaSBkZXIgZWluZSBLb252ZXJzaW9uIGRlciBEYXRlbiBsZWlkZXIgbmljaHQgIgorICAgICAgICAibW9lZ2xpY2ggd2FyLiIsNzgpLCAwKTsKKworICAgIFNldChQX0lHTk9SRSwgKFtdKSwgRl9WQUxVRSk7CisgIH0KK30KKworc3RhdGljIGludCBzZXRfcmVwb3J0KHN0cmluZyBzdHIpIHsKKyAgaW50IGNhbmZsYWdzID0gUXVlcnlQcm9wKFBfQ0FOX0ZMQUdTKTsKKworICBpZighc3RyKQorICB7CisgICAgaWYgKHN0YXRfcmVwb3J0cykgeworICAgIHN0cmluZyAqcmVzPSh7fSk7CisgICAgaWYgKHN0YXRfcmVwb3J0cyAmIERPX1JFUE9SVF9IUCkKKyAgICAgIHJlcys9KHsiTGViZW5zcHVua3RlIn0pOworICAgIGlmIChzdGF0X3JlcG9ydHMgJiBET19SRVBPUlRfU1ApCisgICAgICByZXMrPSh7IktvbnplbnRyYXRpb25zcHVua3RlIn0pOworICAgIGlmIChzdGF0X3JlcG9ydHMgJiBET19SRVBPUlRfUE9JU09OKQorICAgICAgcmVzKz0oeyJWZXJnaWZ0dW5nZW4ifSk7CisgICAgaWYgKHN0YXRfcmVwb3J0cyAmIERPX1JFUE9SVF9XSU1QWSkKKyAgICAgIHJlcys9KHsiVm9yc2ljaHQifSk7CisKKyAgICB0ZWxsX29iamVjdChNRSxicmVha19zdHJpbmcoCisgICAgICAgICJEaXIgd2VyZGVuIGpldHp0IFZlcmFlbmRlcnVuZ2VuIERlaW5lciAiCisgICAgICAgICtDb3VudFVwKHJlcykgKyAiIGJlcmljaHRldC4iLDc4KSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHRlbGxfb2JqZWN0KE1FLAorICAgICAgICAiQWxsZSBTdGF0dXNyZXBvcnRzIHNpbmQgYXVzZ2VzY2hhbHRldC5cbiIpOworCisgICAgcmV0dXJuIDE7CisgIH0KKyAgZWxzZSBpZiAoc3RyID09ICJhdXMiKSB7CisgICAgaWYgKHN0YXRfcmVwb3J0cyAmIERPX1JFUE9SVF9IUCB8fCBzdGF0X3JlcG9ydHMgJiBET19SRVBPUlRfV0lNUFkpIHsKKyAgICAgIHN0cmluZyBzPSIiOworICAgICAgaWYgKHN0YXRfcmVwb3J0cyAmIERPX1JFUE9SVF9IUCkgeworICAgICAgICBzdHI9ImViZW5mYWxscyAiOworICAgICAgICB0ZWxsX29iamVjdChNRSwgIkRlciBSZXBvcnQgd3VyZGUgYXVzZ2VzY2hhbHRldC5cbiIpOworICAgICAgfQorICAgICAgaWYgKCBzdGF0X3JlcG9ydHMgJiBET19SRVBPUlRfV0lNUFkgKSB7CisgICAgICAgIHRlbGxfb2JqZWN0KE1FLCAiRGVyIFZvcnNpY2h0LVJlcG9ydCB3dXJkZSAiK3MrCisgICAgICAgICAgImF1c2dlc2NoYWx0ZXQuXG4iKTsKKyAgICAgIH0KKyAgICAgIHN0YXRfcmVwb3J0cz0wOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHRlbGxfb2JqZWN0KE1FLCAiRGVyIFJlcG9ydCBpc3QgYmVyZWl0cyBhdXNnZXNjaGFsdGV0LlxuIik7CisgICAgfQorICAgIHJldHVybiAxOworICB9CisgIGVsc2UgaWYgKHN0ciA9PSAiZWluIikgeworICAgIGlmICggc3RhdF9yZXBvcnRzICYgRE9fUkVQT1JUX0hQICkgeworICAgICAgdGVsbF9vYmplY3QoTUUsICJEZXIgUmVwb3J0IGlzdCBiZXJlaXRzIGVpbmdlc2NoYWx0ZXQuXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICB0ZWxsX29iamVjdChNRSwgIkRlciBSZXBvcnQgd3VyZGUgZWluZ2VzY2hhbHRldC5cbiIpOworICAgIHN0YXRfcmVwb3J0cyB8PSBET19SRVBPUlRfSFA7CisgICAgaWYgKCEoY2FuZmxhZ3MgJiBDQU5fUkVQT1JUX1NQKSkgeworICAgICAgaWYgKFF1ZXJ5UXVlc3QoIkhpbGYgZGVuIEduYXJmZW4iKT09MSkgeworICAgICAgICBTZXRQcm9wKFBfQ0FOX0ZMQUdTLCBjYW5mbGFncyB8IENBTl9SRVBPUlRfU1ApOworICAgICAgICBzdGF0X3JlcG9ydHMgfD0gRE9fUkVQT1JUX1NQOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHRlbGxfb2JqZWN0KE1FLCBicmVha19zdHJpbmcoCisgICAgICAgICAgIkZ1ZXIgZGVuIFN0YXR1c3JlcG9ydCBEZWluZXIgS29uemVudHJhdGlvbiBtdXNzdCBEdSBqZWRvY2ggIgorICAgICAgICAgICJ6dW5hZWNoc3QgZGllIFF1ZXN0IFwiSGlsZiBkZW4gR25hcmZlblwiIGJlc3RlaGVuLiIsNzgpKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICBzdGF0X3JlcG9ydHMgfD0gRE9fUkVQT1JUX1NQOworICAgIH0KKyAgICBpZiAoIShjYW5mbGFncyAmIENBTl9SRVBPUlRfUE9JU09OKSkgeworICAgICAgaWYgKFF1ZXJ5UXVlc3QoIkthdHplbmphbW1lciIpPT0xKSB7CisgICAgICAgIFNldFByb3AoUF9DQU5fRkxBR1MsIGNhbmZsYWdzIHwgQ0FOX1JFUE9SVF9QT0lTT04pOworICAgICAgICBzdGF0X3JlcG9ydHMgfD0gRE9fUkVQT1JUX1BPSVNPTjsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICB0ZWxsX29iamVjdChNRSwgYnJlYWtfc3RyaW5nKAorICAgICAgICAgICJGdWVyIGRlbiBTdGF0dXNyZXBvcnQgRGVpbmVyIFZlcmdpZnR1bmcgbXVzc3QgRHUgamVkb2NoICIKKyAgICAgICAgICAienVuYWVjaHN0IGRpZSBRdWVzdCBcIkthdHplbmphbW1lclwiIGJlc3RlaGVuLiIsNzgpKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICBzdGF0X3JlcG9ydHMgfD0gRE9fUkVQT1JUX1BPSVNPTjsKKyAgICB9CisgICAgLy8gQ2FjaGUgbG9lc2NoZW4sIGRhbWl0IGJlaW0gbmFlY2hzdGVuIFJlcG9ydC1FdmVudCBhbGxlIERhdGVuIG5ldQorICAgIC8vIGVpbmdldHJhZ2VuIHdlcmRlbiBtdWVzc2VuLiBNdXNzIGJlaW0gRWluc2NoYWx0ZW4gZGVzIFJlcG9ydHMKKyAgICAvLyBwYXNzaWVyZW4sIHdlaWwgYXVjaCBpbiBkZXIgaW5ha3RpdmVuIFplaXQgd2VpdGVyaGluIEFlbmRlcnVuZ2VuIGluCisgICAgLy8gc3RhdHVzX3JlcG9ydCgpIGVpbmdlaGVuLCBzbyBkYXNzIGRlciBDYWNoZSB6d2FyIGVyc3QgZWlubWFsIGxlZXIgaXN0LAorICAgIC8vIGFiZXIgYmVpbSBXaWVkZXJlaW5zY2hhbHRlbiBuaWNodCBtZWhyIHVuZ3VlbHRpZyB3YWVyZSB1bmQgc29taXQKKyAgICAvLyB2ZXJhbHRldGUgRGF0ZW4gYW4gZGVuIFNwaWVsZXIgYXVzZ2VnZWJlbiB3ZXJkZW4uIEltIHVuZ3VlbnN0aWdzdGVuCisgICAgLy8gRmFsbCB3dWVyZGUgZGFzIHNvZ2FyIGRhenUgZnVlaHJlbiwgZGFzcyBkaWUgdmVyYWx0ZXRlbiBEYXRlbiBsYW5nZQorICAgIC8vIFplaXQgbmljaHQgYWt0dWFsaXNpZXJ0IHdlcmRlbiwgd2VubiB6LkIuIFBfSFAgPT0gUF9NQVhfSFAsIHNvIGRhc3MKKyAgICAvLyBrZWluIFBfSFAtRXZlbnQgbWVociBlaW5nZWh0LgorICAgIHJlcG9ydF9jYWNoZT0wOworICB9CisgIGVsc2UgaWYgKHN0ciA9PSAidm9yc2ljaHQiKSB7CisgICAgaWYgKCEoY2FuZmxhZ3MgJiBDQU5fUkVQT1JUX1dJTVBZKSkgeworICAgICAgaWYgKFF1ZXJ5UXVlc3QoIlNjaHJhdCBrYW5uIG5pY2h0IGVpbnNjaGxhZmVuIik9PTEpIHsKKyAgICAgICAgU2V0UHJvcChQX0NBTl9GTEFHUywgY2FuZmxhZ3MgfCBDQU5fUkVQT1JUX1dJTVBZKTsKKyAgICAgICAgdGVsbF9vYmplY3QoTUUsICJEZXIgVm9yc2ljaHQtUmVwb3J0IHd1cmRlIGVpbmdlc2NoYWx0ZXQuXG4iKTsKKyAgICAgICAgc3RhdF9yZXBvcnRzIHw9IERPX1JFUE9SVF9XSU1QWTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICB0ZWxsX29iamVjdChNRSwgYnJlYWtfc3RyaW5nKAorICAgICAgICAgICJGdWVyIGRlbiBTdGF0dXNyZXBvcnQgRGVpbmVyIFZvcnNpY2h0IG11c3N0IER1ICIKKyAgICAgICAgICAienVuYWVjaHN0IGRpZSBRdWVzdCBcIlNjaHJhdCBrYW5uIG5pY2h0IGVpbnNjaGxhZmVuXCIgIgorICAgICAgICAgICJiZXN0ZWhlbi4iLDc4KSk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBzdGF0X3JlcG9ydHMgfD0gRE9fUkVQT1JUX1dJTVBZOworICAgIH0KKyAgICAvLyBmdWVyIFNlaGVyIGF1Y2ggQmVyaWNodCBkZXIgRmx1Y2h0cmljaHR1bmcgZWluc2NoYWx0ZW4uCisgICAgaWYgKChzdGF0X3JlcG9ydHMgJiBET19SRVBPUlRfV0lNUFkpCisgICAgICAgICYmICEoc3RhdF9yZXBvcnRzICYgRE9fUkVQT1JUX1dJTVBZX0RJUikKKyAgICAgICAgJiYgKChjYW5mbGFncyAmIENBTl9SRVBPUlRfV0lNUFkpIHx8IElTX1NFRVIoTUUpKSkKKyAgICB7CisgICAgICBzdGF0X3JlcG9ydHMgfD0gRE9fUkVQT1JUX1dJTVBZX0RJUjsgICAgICAgIAorICAgIH0KKyAgfQorICAvLyBzZW5kZXQgZWlubWFsaWcgZ2VuYXUgamV0enQgZGVuIGtvbmZpZ3VyaWVydGVuIHJlcG9ydC4gS2FubiB6dW0gdGVzdGVuCisgIC8vICh2b24gVHJpZ2dlcm4pIG9kZXIgYmVpbSBMb2dpbiBiZW51dHp0IHdlcmRlbiwgd2VubiBtYW4gZWluZW4gaW5pdGlhbGVuCisgIC8vIERhdGVuYmVzdGFuZCBlcmhhbHRlbiB3aWxsLgorICBlbHNlIGlmIChzdHI9PSJzZW5kZW4iKQorICB7CisgICAgLy8gRXMgd2lyZCBBdXNnYWJlIHZvbiBMUCB1bmQgVm9yc2ljaHQgZ2V0cmlnZ2VydCwgZGFzIHNlbmRldCBiZWlkZQorICAgIC8vIFplaWxlbi4KKyAgICBzdGF0dXNfcmVwb3J0KERPX1JFUE9SVF9IUCwgUXVlcnlQcm9wKFBfSFApKTsKKyAgICBzdGF0dXNfcmVwb3J0KERPX1JFUE9SVF9XSU1QWSwgUXVlcnlQcm9wKFBfV0lNUFkpKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBlbHNlIAorICAgIHJldHVybiAwOworICAvLyBudXIgYWt0dWVsbGVuIFp1c3RhbmQgYmVyaWNodGVuCisgIHNldF9yZXBvcnQoMCk7CisgIHJldHVybiAxOworfQorCitwcml2YXRlIHN0cmluZyBnZXRfcG9pc29uX2Rlc2MoaW50IHApIHsKKyAgc3RyaW5nIHJldDsKKyAgaWYgKCBpbnRwKHApICkgeworICAgIHN3aXRjaChwKSB7CisgICAgICBjYXNlIDA6ICAgIHJldD0ia2VpbnMiOyAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMS4uMzogcmV0PSJsZWljaHQiOyAgICAgIGJyZWFrOworICAgICAgY2FzZSA0Li44OiByZXQ9ImdlZmFlaHJsaWNoIjsgYnJlYWs7CisgICAgICBkZWZhdWx0OiAgIHJldD0ic2VociBlcm5zdCI7ICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKKyAgfQorICBlbHNlIHJldHVybiAiKG5pY2h0IHZlcmZ1ZWdiYXIpIjsKK30KKworLy8gc3ByaW50ZigpLUZvcm1hdHN0cmluZ3MgZnVlciBkaWUgUmVwb3J0YXVzZ2FiZS4KKyNkZWZpbmUgUkVQT1JUTElORSAiTFA6ICUzZCwgS1A6ICUzcywgR2lmdDogJXMuXG4iCisjZGVmaW5lIFJFUE9SVExJTkVfV0lNUFkgIlZvcnNpY2h0OiAlZCwgRmx1Y2h0cmljaHR1bmc6ICVzLlxuIgorLy8gRGVmaW5lcyB6dXIgQWRyZXNzaWVydW5nIGRlciBDYWNoZS1FaW50cmFlZ2UKKyNkZWZpbmUgUkVQX0hQICAgICAwCisjZGVmaW5lIFJFUF9TUCAgICAgMQorI2RlZmluZSBSRVBfUE9JU09OIDIKKworcHJvdGVjdGVkIHZvaWQgc3RhdHVzX3JlcG9ydChpbnQgdHlwZSwgbWl4ZWQgdmFsKSB7CisgIC8vIFdlbm4gZGVyIFNwaWVsZXIgR01DUCBoYXQgdW5kIGRhcyBzaWNoIHVtIGRpZSBJbmZvcm1hdGlvbiBrdWVtbWVydCwKKyAgLy8gZXJmb2xndCBrZWluZSB0ZXh0dWVsbGUgQXVzZ2FiZSBtZWhyLiBEYWhlciByZXR1cm4sIHdlbm4gR01DUF9DaGFyKCkKKyAgLy8gZXJmb2xnIHZlcm1lbGRldCBoYXQuCisgIGludCBmbGFncyA9IFF1ZXJ5UHJvcChQX0NBTl9GTEFHUyk7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgRE9fUkVQT1JUX0hQOgorICAgICAgaWYgKEdNQ1BfQ2hhciggKFsgUF9IUDogdmFsIF0pICkgKSByZXR1cm47CisgICAgICBicmVhazsKKyAgICBjYXNlIERPX1JFUE9SVF9TUDoKKyAgICAgIGlmICghKGZsYWdzICYgQ0FOX1JFUE9SVF9TUCkpIHJldHVybjsKKyAgICAgIGlmIChHTUNQX0NoYXIoIChbIFBfU1A6IHZhbCBdKSApICkgcmV0dXJuOworICAgICAgYnJlYWs7CisgICAgY2FzZSBET19SRVBPUlRfUE9JU09OOgorICAgICAgIGlmICghKGZsYWdzICYgQ0FOX1JFUE9SVF9QT0lTT04pKSByZXR1cm47CisgICAgICAgaWYgKEdNQ1BfQ2hhciggKFsgUF9QT0lTT046IHZhbCBdKSApICkgcmV0dXJuOworICAgICAgYnJlYWs7CisgICAgY2FzZSBET19SRVBPUlRfV0lNUFk6CisgICAgICBpZiAoIShmbGFncyAmIENBTl9SRVBPUlRfV0lNUFkpKSByZXR1cm47CisgICAgICBpZiAoR01DUF9DaGFyKCAoWyBQX1dJTVBZOiB2YWwgXSkgKSApIHJldHVybjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRE9fUkVQT1JUX1dJTVBZX0RJUjoKKyAgICAgIGlmICghKGZsYWdzICYgQ0FOX1JFUE9SVF9XSU1QWV9ESVIpKSByZXR1cm47CisgICAgICBpZiAoR01DUF9DaGFyKCAoWyBQX1dJTVBZX0RJUkVDVElPTjogdmFsIF0pICkgKSByZXR1cm47CisgICAgICBicmVhazsKKyAgfQorCisgIC8vIGtvbnZlbnRpb25lbGxlIHRleHR1ZWxsZSBBdXNnYWJlIGRlcyBSZXBvcnRzIGFiIGhpZXIuCisgIGlmICghKHR5cGUgJiBzdGF0X3JlcG9ydHMpKQorICAgIHJldHVybjsKKworICBpZiAoICFyZXBvcnRfY2FjaGUgKSB7CisgICAgcmVwb3J0X2NhY2hlID0gKHsKKyAgICAgIFF1ZXJ5UHJvcChQX0hQKSwKKyAgICAgIChzdGF0X3JlcG9ydHMmRE9fUkVQT1JUX1NQKSA/IHRvX3N0cmluZyhRdWVyeVByb3AoUF9TUCkpIDogIiMjIyIsCisgICAgICAoc3RhdF9yZXBvcnRzJkRPX1JFUE9SVF9QT0lTT04pID8KKyAgICAgICAgICBnZXRfcG9pc29uX2Rlc2MoUXVlcnlQcm9wKFBfUE9JU09OKSkgOiAiKG5pY2h0IHZlcmZ1ZWdiYXIpIgorICAgIH0pOworICB9CisKKyAgc3dpdGNoKHR5cGUpIHsKKyAgICAgIC8vIExQIGJlcmljaHRlbjogQ2FjaGUgYWt0dWFsaXNpZXJlbiB1bmQgTWVsZHVuZyBhdXNnZWJlbi4KKyAgICAgIGNhc2UgRE9fUkVQT1JUX0hQOgorICAgICAgICByZXBvcnRfY2FjaGVbUkVQX0hQXT12YWw7CisgICAgICAgIHRlbGxfb2JqZWN0KE1FLCBzcHJpbnRmKFJFUE9SVExJTkUsIHJlcG9ydF9jYWNoZVtSRVBfSFBdLAorICAgICAgICAgIHJlcG9ydF9jYWNoZVtSRVBfU1BdLCByZXBvcnRfY2FjaGVbUkVQX1BPSVNPTl0pKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAvLyBLUCBiZXJpY2h0ZW46IFdlbm4gZGVyIFNwaWVsZXIgZGVuIFJlcG9ydCBmcmVpZ2VzY2hhbHRldCBoYXQsCisgICAgICAvLyB3aXJkIGJlaSBBZW5kZXJ1bmdlbiBnZW1lbGRldC4gV2VubiBuaWNodCwgYWVuZGVydCBzaWNoIG51ciBkZXIKKyAgICAgIC8vIENhY2hlLUVpbnRyYWcuIFNvIHdpcmQgdmVyaGluZGVydCwgZGFzcyBlaW4gU3BpZWxlciB1ZWJlciBLUC0KKyAgICAgIC8vIFZlcmFlbmRlcnVuZ2VuIGF1Y2ggZGFubiBpbmZvcm1pZXJ0IHd1ZXJkZSwgd2VubiBlciBkZW4gS1AtUmVwb3J0CisgICAgICAvLyBnYXIgbmljaHQgYmVudXR6ZW4ga29lbm50ZS4KKyAgICAgIGNhc2UgRE9fUkVQT1JUX1NQOgorICAgICAgICByZXBvcnRfY2FjaGVbUkVQX1NQXT10b19zdHJpbmcodmFsKTsKKyAgICAgICAgdGVsbF9vYmplY3QoTUUsIHNwcmludGYoUkVQT1JUTElORSwgcmVwb3J0X2NhY2hlW1JFUF9IUF0sCisgICAgICAgICAgcmVwb3J0X2NhY2hlW1JFUF9TUF0sIHJlcG9ydF9jYWNoZVtSRVBfUE9JU09OXSkpOworICAgICAgICBicmVhazsKKyAgICAgIC8vIEdpZnRzdGF0dXMgYmVyaWNodGVuOiBXZW5uIGRlciBHaWZ0cmVwb3J0IGZyZWlnZXNjaGFsdGV0IGlzdCwKKyAgICAgIC8vIENhY2hlIGFrdHVhbGlzaWVyZW4gdW5kIGJlcmljaHRlbi4gV2VubiBuaWNodCwgYWVuZGVydCBzaWNoIG51cgorICAgICAgLy8gZGVyIENhY2hlLUVpbnRyYWcuIEVybGFldXRlcnVuZyBoaWVyenUgcy5vLiBiZWltIEtQLVJlcG9ydC4KKyAgICAgIGNhc2UgRE9fUkVQT1JUX1BPSVNPTjoKKyAgICAgICAgcmVwb3J0X2NhY2hlW1JFUF9QT0lTT05dID0gZ2V0X3BvaXNvbl9kZXNjKHZhbCk7CisgICAgICAgIHRlbGxfb2JqZWN0KE1FLCBzcHJpbnRmKFJFUE9SVExJTkUsIHJlcG9ydF9jYWNoZVtSRVBfSFBdLAorICAgICAgICAgIHJlcG9ydF9jYWNoZVtSRVBfU1BdLCByZXBvcnRfY2FjaGVbUkVQX1BPSVNPTl0pKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAvLyBWb3JzaWNodC1SZXBvcnQ6IGthbm4gb2huZSB3ZWl0ZXJlIEFiZnJhZ2VuIGF1c2dlZ2ViZW4gd2VyZGVuLCBkYQorICAgICAgLy8gYWxsZSBub2V0aWdlbiBDaGVja3Mgc2Nob24genUgQmVnaW5uIGRpZXNlciBGdW5rdGlvbiBlcmxlZGlndCB3dXJkZW4uCisgICAgICAvLyBMZWRpZ2xpY2ggZGVyIEluaGFsdCBkZXIgTWVsZHVuZyBtdXNzIGFiaGFlbmdpZyB2b20gU2VoZXJzdGF0dXMKKyAgICAgIC8vIGtvbmZpZ3VyaWVydCB3ZXJkZW4uCisgICAgICBjYXNlIERPX1JFUE9SVF9XSU1QWToKKyAgICAgICAgc3RyaW5nIHJlczsKKyAgICAgICAgaWYgKElTX1NFRVIoTUUpKSB7CisgICAgICAgICAgLy8gUXVlcnlQcm9wKCkgYXVzIEtvc3RlbmdydWVuZGVuIGltIGlmKCksIGRhbWl0IGRpZSBBdWZydWYtCisgICAgICAgICAgLy8gSGFldWZpZ2tlaXQgenVtaW5kZXN0IGVpbiB3ZW5pZyByZWR1emllcnQgd2lyZC4KKyAgICAgICAgICBzdHJpbmcgZGlyID0gUXVlcnlQcm9wKFBfV0lNUFlfRElSRUNUSU9OKXx8ImtlaW5lIjsKKyAgICAgICAgICByZXMgPSBzcHJpbnRmKFJFUE9SVExJTkVfV0lNUFksIHZhbCwgZGlyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgcmVzID0gc3ByaW50ZihSRVBPUlRMSU5FX1dJTVBZLCB2YWwsICIobmljaHQgdmVyZnVlZ2JhcikiKTsKKyAgICAgICAgdGVsbF9vYmplY3QoTUUsIHJlcyk7CisgICAgICAgIGJyZWFrOworICAgICAgLy8gRmx1Y2h0cmljaHR1bmdzLVJlcG9ydDogd2lyZCBudXIgYmVpIFNlaGVybiBhdXNnZWdlYmVuLCBkYW1pdAorICAgICAgLy8gbmljaHQgYXVjaCBTcGllbGVyIGVpbmUgVlMtL0ZSLU1lbGR1bmcgYmVrb21tZW4sIHdlbm4gei5CLiBlaW5lCisgICAgICAvLyBleHRlcm5lIE1hbmlwdWxhdGlvbiBkZXIgRmx1Y2h0cmljaHR1bmcgc3RhdHRmaW5kZXQsIHNpZSBhYmVyIGRlbgorICAgICAgLy8gUmVwb3J0IG1hbmdlbHMgU2VoZXJzdGF0dXMgZ2FyIG5pY2h0IGZyZWlnZXNjaGFsdGV0IGhhYmVuLgorICAgICAgY2FzZSBET19SRVBPUlRfV0lNUFlfRElSOgorICAgICAgICBpZiAoSVNfU0VFUihNRSkpIHsKKyAgICAgICAgICBpZiAoIXZhbCkgdmFsID0gImtlaW5lIjsKKyAgICAgICAgICB0ZWxsX29iamVjdChNRSxzcHJpbnRmKFJFUE9SVExJTkVfV0lNUFksIFF1ZXJ5UHJvcChQX1dJTVBZKSwgdmFsKSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgIH0KK30KKworI3VuZGVmIFJFUE9SVExJTkUKKyN1bmRlZiBSRVBPUlRMSU5FX1dJTVBZCisjdW5kZWYgUkVQX0hQCisjdW5kZWYgUkVQX1NQCisjdW5kZWYgUkVQX1BPSVNPTgorCitwcml2YXRlIHN0cmluZyBwZXJtdXRhdGUoc3RyaW5nIG1zZykKK3sKKyAgLy8gS29udHJvbGx6ZWljaGVuIHJhdXNmaWx0ZXJuLiAqc2V1ZnoqCisgIG1zZyA9IHJlZ3JlcGxhY2UobXNnLCJbWzpjbnRybDpdXSIsIiIsUkVfUENSRXxSRV9HTE9CQUwpOworICBvYmplY3Qgb2I9UXVlcnlQcm9wKFBfUEVSTV9TVFJJTkcpOworICBpZiAoIW9iamVjdHAob2IpKQorICAgIHJldHVybiBtc2c7CisKKyAgcmV0dXJuIChzdHJpbmcpb2ItPnBlcm11dGF0ZV9zdHJpbmcobXNnKXx8IiI7Cit9CisKKy8vIG5ldWUgbmFjaHJpY2h0IGFuIGRlbiBLb2JvbGQgYW5oYWVuZ2VuCisvLyBSdWVja2dhYmV3ZXJ0ZTogTVNHX0JVRkZFUl9GVUxMIG9kZXIgTVNHX0JVRkZFUkVECitwcml2YXRlIGludCBhZGRfdG9fa29ib2xkKHN0cmluZyBtc2csIGludCBtc2dfdHlwZSwgc3RyaW5nIG1zZ19hY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtc2dfcHJlZml4LCBvYmplY3Qgb3JpZ2luKQoreworICAvLyBOYWNocmljaHQgc29sbCBpbSBLb2JvbGQgZ2VzcGVpY2hlcnQgd2VyZGVuLgorICAvLyBLb2JvbGQgc3BlaWNoZXJ0IFJvaGRhdGVuIHVuZCBnaWJ0IHNwYWV0ZXIgZGFzIGdhbnplIGF1Y2ggd2llZGVyIHZpYQorICAvLyBSZWNlaXZlTXNnKCkgYXVzIC0gZGFiZWkgd2lyZCBNU0dfRE9OVF9CVUZGRVIgfCBNU0dfRE9OVF9TVE9SRSBnZXNldHosCisgIC8vIGRhbWl0IGtlaW5lIGVybmV1dGUgU3BlaWNoZXIgaW4gS29ib2xkIG9kZXIgS29tbS1IaXN0b3J5IGVyZm9sZ3QuCisKKyAgLy8gd2VubiBkZXIgUHVmZmVyIHp1IGtsZWluIGlzdCwgR3JvZXNzZSB2ZXJkb3BwZWxuLCB3ZW5uIG5vY2ggdW50ZXJoYWxiCisgIC8vIGRlcyBMaW1pdHMuCisgIGlmIChrb2JvbGQtPmluZGV4ID49IHNpemVvZihrb2JvbGQtPmJ1ZiktMSkgeworICAgIGlmIChzaXplb2Yoa29ib2xkLT5idWYpIDwgTUFYX0tPQk9MRF9MSU1JVCkKKyAgICAgIGtvYm9sZC0+YnVmICs9IGFsbG9jYXRlKHNpemVvZihrb2JvbGQtPmJ1ZikpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBNU0dfQlVGRkVSX0ZVTEw7CisgIH0KKyAga29ib2xkLT5pbmRleCA9IGtvYm9sZC0+aW5kZXggKzE7CisgIC8vIG5ldWUgTmFjaHJpY2h0IGFuIGRlbiBQdWZmZXIgYW5oYWVuZ2VuLgorICBzdHJpbmcgc2VuZGVybmFtZSA9IHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob3JpZ2luKSA/CisgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luLT5xdWVyeV9yZWFsX25hbWUoKSA6CisgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luLT5uYW1lKFdFUikgfHwgIjxVbmJla2FubnQ+IjsKKyAga29ib2xkLT5idWZba29ib2xkLT5pbmRleF0gPSAoPG1zZ19zPiBtc2c6IG1zZywKKyAgICAgIHR5cGUgOiBtc2dfdHlwZSwgYWN0aW9uIDogbXNnX2FjdGlvbiwgcHJlZml4IDogbXNnX3ByZWZpeCwKKyAgICAgIHNlbmRlcm5hbWUgOiBzZW5kZXJuYW1lKTsKKyAgcmV0dXJuIE1TR19CVUZGRVJFRDsKK30KKworcHJpdmF0ZSB2b2lkIF9mbHVzaF9jYWNoZShpbnQgdmVyYm9zZSkgeworICAvLyBudXIgbWl0IGdlbnVnIEV2YWx0aWNrcyBhdXNnZWJlbi4KKyAgaWYgKGdldF9ldmFsX2Nvc3QoKSA8IDEwMDAwMCkgcmV0dXJuOworICBpZiAoa29ib2xkLT5pbmRleCA+PSAwKQorICB7CisgICAgUmVjZWl2ZU1zZygiRWluIGtsZWluZXIgS29ib2xkIHRlaWx0IERpciBmb2xnZW5kZXMgbWl0OiIsCisgICAgICAgICAgICAgICBNVF9OT1RJRklDQVRJT058TVNHX0RPTlRfSUdOT1JFfE1TR19ET05UX0JVRkZFUiwKKyAgICAgICAgICAgICAgIDAsIDAsIHRoaXNfb2JqZWN0KCkpOworICAgIGludCBwcmVwZW5kID0gUXVlcnlQcm9wKFBfTUVTU0FHRV9QUkVQRU5EKTsKKyAgICBmb3JlYWNoKGludCBpOiAwIC4uIGtvYm9sZC0+aW5kZXgpIC8vICcwIC4uJyBpc3Qgd2ljaHRpZyEKKyAgICB7CisgICAgICBzdHJ1Y3QgbXNnX3MgbXNnID0ga29ib2xkLT5idWZbaV07CisgICAgICAvLyBkaWVzIGlzdCBkaWVudCBkZXIgRmVobGVyYWJzaWNoZXJ1bmcsIGZhbGxzIGVzIG5lbiBGZWhsZXIgKHouQi4gVExFKQorICAgICAgLy8gaW4gZGVyIFNjaGxlaWZlIHVudGVuIGdhYjogZGFubiBpc3QgaW5kZXggbmljaHQgYXVmIC0xIGdlc2V0enQKKyAgICAgIC8vIHdvcmRlbiwgYWJlciBlaW5pZ2UgTmFjaHJpY2h0ZW4gc2luZCBzY2hvbiBnZWxvZXNjaHQuCisgICAgICBpZiAoIXN0cnVjdHAobXNnKSkgY29udGludWU7CisgICAgICAvLyBBdXNnYWJlIHZpYSBlZnVuOjp0ZWxsX29iamVjdCgpLCB3ZWlsIGRpZSBBcmJlaXQgdm9uIFJlY2VpdmVNc2coKQorICAgICAgLy8gc2Nob24gZ2V0YW4gd3VyZGUuIEFsbGVyZGluZ3MgbXVlc3NlbiB3aXIgdW5zIG5vY2ggdW0gZGVuIFVNYnJ1Y2gKKyAgICAgIC8vIGt1ZW1tZXJuLgorICAgICAgaWYgKChtc2ctPnR5cGUpICYgTVNHX0RPTlRfV1JBUCkKKyAgICAgICAgbXNnLT5tc2cgPSAobXNnLT5wcmVmaXggPyBtc2ctPnByZWZpeCA6ICIiKSArIG1zZy0+bXNnOworICAgICAgZWxzZQorICAgICAgeworICAgICAgICBpbnQgYnNmbGFncyA9IG1zZy0+dHlwZSAmIE1TR19BTExfQlNfRkxBR1M7CisgICAgICAgIGlmIChwcmVwZW5kKQorICAgICAgICAgIGJzZmxhZ3MgfD0gQlNfUFJFUEVORF9JTkRFTlQ7CisgICAgICAgIG1zZy0+bXNnID0gYnJlYWtfc3RyaW5nKG1zZy0+bXNnLCA3OCwgbXNnLT5wcmVmaXgsIGJzZmxhZ3MpOworICAgICAgfQorICAgICAgZWZ1bjo6dGVsbF9vYmplY3QodGhpc19vYmplY3QoKSwgbXNnLT5tc2cpOworICAgICAga29ib2xkLT5idWZbaV09MDsKKyAgICB9CisgICAga29ib2xkLT5pbmRleD0tMTsKKyAgfQorICBlbHNlIGlmICh2ZXJib3NlKQorICB7CisgICAgUmVjZWl2ZU1zZygiRGVyIGtsZWluZSBLb2JvbGQgaGF0IGxlaWRlciBuaWNodHMgTmV1ZXMgZnVlciBEaWNoLiIsCisgICAgICAgICAgICAgICBNVF9OT1RJRklDQVRJT058TVNHX0RPTlRfSUdOT1JFfE1TR19ET05UX0JVRkZFUiwKKyAgICAgICAgICAgICAgIDAsIDAsIHRoaXNfb2JqZWN0KCkpOworICB9Cit9CisKK3ZhcmFyZ3MgaW50IGNtZF9rb2JvbGQoc3RyaW5nIGFyZykKK3sKKyAgc3dpdGNoKGFyZykKKyAgeworICAgIGNhc2UgImVpbiI6CisgICAgICBTZXRQcm9wKFBfQlVGRkVSLCAxKTsKKyAgICAgIHByaW50ZigiRGVyIEtvYm9sZCBtZXJrdCBzaWNoIGpldHp0IGFsbGVzIVxuIik7IGJyZWFrOworICAgIGNhc2UgImF1cyI6CisgICAgICBTZXRQcm9wKFBfQlVGRkVSLCAwKTsKKyAgICAgIHByaW50ZigiRGVyIEtvYm9sZCB3aXJkIERpY2ggbmljaHQgc3RvZXJlbiFcbiIpOyBicmVhazsKKyAgICBkZWZhdWx0OiBpZihhcmcpIHByaW50ZigiRGVyIEtvYm9sZCBzYWd0OiBrb2JvbGQgZWluIG9kZXIga29ib2xkIGF1c1xuIik7CisgIH0KKyAgX2ZsdXNoX2NhY2hlKDEpOworICByZXR1cm4gMTsKK30KKworcHVibGljIGludCBUZXN0SWdub3JlU2ltcGxlKHN0cmluZyAqYXJnKQoreyAgIHN0cmluZyAqaWdub3JlOworCisgICAgaWYgKCFwb2ludGVycChhcmcpIHx8ICFtYXBwaW5ncChpZ25vcmU9UXVlcnkoUF9JR05PUkUsRl9WQUxVRSkpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBmb3JlYWNoKHN0cmluZyBzOiBhcmcpCisgICAgeworICAgICAgaWYgKG1lbWJlcihpZ25vcmUscykpCisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLy9UT0RPOiBkZXByZWNhdGVkIC0gZW50ZmVybmVuLCB3ZW5uIE1lc3NhZ2UoKSBlbnRmZXJudCB3aXJkLgorcHJpdmF0ZSBpbnQgY2hlY2tfaWdub3JlKG1peGVkIGlnbm9yZSwgc3RyaW5nIHZlcmIsIHN0cmluZyBuYW1lKQoreworICBpZiAoaWdub3JlID09IHZlcmIpCisgICAgcmV0dXJuIDE7CisgIGlnbm9yZSA9IGV4cGxvZGUoaWdub3JlLCAiLiIpOworICByZXR1cm4gKChzaXplb2YoaWdub3JlKSA+IDEpICYmCisgICAgIChuYW1lID09IGlnbm9yZVswXSAmJiBtZW1iZXIoaWdub3JlWzEuLl0sIHZlcmIpICE9IC0xKSk7Cit9CisKK3ByaXZhdGUgaW50IGNvbW1fYmVlcCgpIHsKKyAgaWYgKFF1ZXJ5UHJvcChQX1ZJU1VBTEJFTEwpKSByZXR1cm4gMDsgLy8ga2VpbiB0b24KKyAgaW50IGJlZXBfaW50ZXJ2YWw9KGludClRdWVyeVByb3AoUF9NRVNTQUdFX0JFRVApOworICBpZiAoIWJlZXBfaW50ZXJ2YWwgfHwgKCh0aW1lKCktbGFzdF9iZWVwX3RpbWUpIDwgYmVlcF9pbnRlcnZhbCkpIHJldHVybiAwOworICBsYXN0X2JlZXBfdGltZT10aW1lKCk7CisgIHJldHVybiAxOworfQorCitwcml2YXRlIHZhcmFyZ3Mgdm9pZCBhZGRfdG9fdGVsbF9oaXN0b3J5KCBzdHJpbmcgdWlkLCBpbnQgc2VudCwgaW50IHJlY3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbWVzc2FnZSwgc3RyaW5nIGluZGVudCwgaW50IGZsYWdzICkKK3sKKyAgLyogdGVsbF9oaXN0b3J5IGlzdCBlaW4gTWFwcGluZyBtaXQgVUlEcyBkZXIgR2VzcHJhZWNoc3BhcnRuZXIgYWxzIEtleS4KKyAgICAgQWxzIFdlcnQgaXN0IGVpbmUgU3RydWt1ciB2b20gVHlwIGNoYXRfcyBlaW5nZXRyYWdlbi4KKyAgICAgU3RydWt0dXJlbiBjaGF0X3MgdW5kIHN0b3JlZF9tc2dfcyBzaW5kIGluIC9zdGQvcGxheWVyL2NvbW1fc3RydWN0cy5jCisgICAgIGRlZmluaWVydC4KKyAgICAgVE9ETyBmdWVyIHNwYWV0ZXIsIGdlcmFkZSBrZWluZSBaZWl0IGZ1ZXI6CisgICAgIEFscyBXZXJ0IGlzdCBlaW4gQXJyYXkgdm9uIGNoYXRfcyBlbnRoYWx0ZW4sIHdvYmVpIGRhcyAwLiBFbGVtZW50IGRhcworICAgICBqZXdlaWxzIGp1ZW5nc3RlIEdlc3ByYWVjaCBtaXQgZGllc2VtIEdlc3ByYWVjaHNwYXJ0bmVyIGlzdCB1bmQgYWxsZQorICAgICB3ZWl0ZXJlbiBFbGVtZW50ZSBpbiBkZXIgemVpdGxpY2hlbiBSZWloZW5mb2xnZSBrb21tZW4gKGFsc28gbGV0enRlcworICAgICBFbGVtZW50IGlzdCBhZWx0ZXN0ZXMgR2VzcHJhZWNoKS4KKyAgICAgKi8KKworICAvL1RPRE86IEVudGZlcm5lbiwgd2VubiBkYXMgbmljaHQgbWVociBwYXNzaWVydC4KKyAgaWYgKCFzdHJpbmdwKHVpZCkpCisgIHsKKyAgICBSZWNlaXZlTXNnKHNwcmludGYoCisgICAgICAiXG5hZGRfdG9fdGVsbF9oaXN0b3J5KCk6IGdvdCBiYWQgdWlkIGFyZ3VtZW50ICVPLiIKKyAgICAgICJzZW50OiAlZCwgcmVjdjogJWQsIGZsYWdzOiAlZCwgbXNnOiAlcyIsIAorICAgICAgdWlkLCBzZW50LCByZWN2LCBmbGFncywgbWVzc2FnZSksTVRfREVCVUd8TVNHX0JTX0xFQVZFX0xGUywwLDAsTUUpOyAgICAgICAgICAgICAgCisgIH0KKyAgCisgIC8vIGxldHp0ZW4gR2VzcHJhZWNoc3BhcnRuZXIgZnVlciBlcndpZGVyZS4KKyAgaWYgKCEoZmxhZ3MgJiBNU0dGTEFHX1JFTU9URSkpCisgICAgbGFzdF9jb21tX3BhcnRuZXIgPSB1aWQ7CisKKyAgLy8gaXN0IGVpbiBzb3J0aWVydGVzIEFycmF5IHZvbiBtYXguIE1BWF9TQVZFRF9DSEFUUyBHcm9lc3NlLCB3ZWxjaGVzIGRpZQorICAvLyBTcGllbGVyIGVudGhhZWx0LCBkZW5lbiBtYW4gc2Nob24gd2FzIG1pdGdldGVpbHQgaGF0LiBBa3R1ZWxsc3RlIGFtCisgIC8vIEFuZmFuZy4KKyAgaWYgKHNlbnQpIHsKKyAgICBpZiAoIXNpemVvZihjb21tcmVjZWl2ZXJzKSkKKyAgICAgIGNvbW1yZWNlaXZlcnMgPSAoe3VpZH0pOworICAgIGVsc2UgaWYgKGNvbW1yZWNlaXZlcnNbMF0gIT0gdWlkKSB7CisgICAgICAvLyBudXIgd2VubiBkZXIgYWt0dWVsbGUgUGFydG5lciBuaWNodCBhbSBBbmZhbmcgc3RlaHQsIG11c3MgbWFuIGhpZXIgd2FzCisgICAgICAvLyB0dW4uIENvbW0tUGFydG5lciBhbiBkZW4gQW5mYW5nIHN0ZWxsZW4gdW5kIGdnZi4gYWx0ZW4gRWludHJhZworICAgICAgLy8gZW50ZmVybmVuLgorICAgICAgLy8gVE9ETzogRWZmaXppZW50ZXIgZ2VzdGFsdGVuLgorICAgICAgY29tbXJlY2VpdmVycyA9ICh7dWlkfSkgKyAoY29tbXJlY2VpdmVycy0oe3VpZH0pKTsKKyAgICAgIC8vIGdnZi4ga3Vlcnplbi4gKHdlbm4gIXRlbGxfaGlzdG9yeV9lbmFibGVkLCB3aXJkIGVzIGdnZi4gdW50ZW4KKyAgICAgIC8vIGdlbWFjaHQsIGRlbm4gZGllIEhpc3QgbXVzcyBtaW4uIGFsbGUgVUlEIGVudGhhbHRlbiwgZGllIGF1Y2ggaW4KKyAgICAgIC8vIGNvbW1yZWNlaXZlcnMgZHJpbiBzaW5kLikKKyAgICAgIGlmICghdGVsbF9oaXN0b3J5X2VuYWJsZWQgJiYgc2l6ZW9mKGNvbW1yZWNlaXZlcnMpID4gTUFYX1NBVkVEX0NIQVRTKQorICAgICAgICBjb21tcmVjZWl2ZXJzID0gY29tbXJlY2VpdmVyc1swLi5NQVhfU0FWRURfQ0hBVFNdOworICAgIH0KKyAgfQorCisgIGlmICghdGVsbF9oaXN0b3J5X2VuYWJsZWQpCisgICAgcmV0dXJuOworCisgIGlmICghaW5kZW50ICYmIG1lc3NhZ2VbPDFdID09IDEwKQorICAgICAgbWVzc2FnZSA9IG1lc3NhZ2VbLi48Ml07CisKKyAgc3RydWN0IGNoYXRfcyBjaGF0OworICAvLyBHZXNwcmFlY2hzcGFydG5lciB1bmJla2FubnQ/CisgIGlmICghbWVtYmVyKHRlbGxfaGlzdG9yeSwgdWlkKSkgeworICAgIC8vIHp1dmllbGUgR2VzcHJhZWNoZSBpbiBIaXN0PyA+PSBpc3QgQWJzaWNodCB3ZWlsIGphIGdsZWljaCBub2NoIGVpbnMKKyAgICAvLyBkYXp1IGtvbW10LgorICAgIGlmIChzaXplb2YodGVsbF9oaXN0b3J5KSA+PSBNQVhfU0FWRURfQ0hBVFMpIHsKKyAgICAgIHN0cmluZyBkZWx1aWQ7CisgICAgICBpbnQgemVpdCA9IF9fSU5UX01BWF9fOworICAgICAgZm9yZWFjaChzdHJpbmcgdHVpZCwgY2hhdCA6IHRlbGxfaGlzdG9yeSkgeworICAgICAgICAvLyBhZWx0ZXN0ZXMgR2VzcHJhZWNoIHN1Y2hlbgorICAgICAgICBpZiAoemVpdCA+IGNoYXQtPnRpbWVfbGFzdF9tc2cpIHsKKyAgICAgICAgICBkZWx1aWQgPSB0dWlkOworICAgICAgICAgIHplaXQgPSBjaGF0LT50aW1lX2xhc3RfbXNnOworICAgICAgICB9CisgICAgICB9CisgICAgICAvLyBhZWx0ZXN0ZXMgR2VzcHJhZWNoIHJhdXMuCisgICAgICBtX2RlbGV0ZSh0ZWxsX2hpc3RvcnksIGRlbHVpZCk7CisgICAgICBpZiAobWVtYmVyKGNvbW1yZWNlaXZlcnMsZGVsdWlkKT4tMSkKKyAgICAgICAgY29tbXJlY2VpdmVycy09KHtkZWx1aWR9KTsKKyAgICB9CisgICAgLy8gbmV1ZXMgR2VzcHJhZWNoIGFubGVnZW4KKyAgICBjaGF0ID0gKDxjaGF0X3M+IHVpZDogdWlkLCB0aW1lX2ZpcnN0X21zZzogdGltZSgpLCAKKyAgICAgICAgICAgICAgIHRpbWVfbGFzdF9tc2c6IHRpbWUoKSwKKyAgICAgICAgIHNlbnRjb3VudDogc2VudCwgcmVjdmNvdW50OiByZWN2LAorICAgICAgICAgbXNnYnVmOiAwLCBwdHI6IDAgKTsKKyAgICB0ZWxsX2hpc3RvcnlbdWlkXSA9IGNoYXQ7CisgIH0KKyAgZWxzZSB7CisgICAgLy8gR2VzcHJhZWNoc3BhcnRuZXIgYmVrYW5udCwgYWx0ZXMgR2VzcHJhZWNoIHdlaXRlcmJlbnV0emVuCisgICAgY2hhdCA9IHRlbGxfaGlzdG9yeVt1aWRdOworICAgIGNoYXQtPnRpbWVfbGFzdF9tc2cgPSB0aW1lKCk7CisgICAgY2hhdC0+c2VudGNvdW50ICs9IHNlbnQ7CisgICAgY2hhdC0+cmVjdmNvdW50ICs9IHJlY3Y7CisgIH0KKworICBpZiAodGVsbF9oaXN0b3J5X2VuYWJsZWQgPCBURUxMSElTVF9FTkFCTEVEKQorICAgIHJldHVybjsKKworICAvLyBnZ2YuIEFycmF5IGZ1ZXIgTWVzc2FnZXMgYW5sZWdlbgorICBpZiAoIXBvaW50ZXJwKGNoYXQtPm1zZ2J1ZikpCisgICAgY2hhdC0+bXNnYnVmID0gYWxsb2NhdGUoTUFYX1NBVkVEX01FU1NBR0VTKTsKKworICAvLyBNZXNzYWdlLVN0cnVrdHVyIGVybWl0dGVsbiBvZGVyIG5ldSBhbmxlZ2VuCisgIHN0cnVjdCBzdG9yZWRfbXNnX3MgbXNnOworICBpZiAoIXN0cnVjdHAoY2hhdC0+bXNnYnVmW2NoYXQtPnB0cl0pKSB7CisgICAgLy8gbmV1ZSBTdHJ1Y3QgaW5zIEFycmF5IHNjaHJlaWJlbgorICAgIGNoYXQtPm1zZ2J1ZltjaGF0LT5wdHJdID0gbXNnID0gKDxzdG9yZWRfbXNnX3M+KTsKKyAgfQorICBlbHNlIHsKKyAgICAvLyBhbHRlIFN0cnVjdCB1ZWJlcnNjaHJlaWJlbgorICAgIG1zZyA9IGNoYXQtPm1zZ2J1ZltjaGF0LT5wdHJdOworICB9CisgIC8vIEluZGV4IGF1ZiBuYWVjaHN0ZSBNZXNzYWdlc3RydWt0dXIgZXJtaXR0ZWxuCisgIGNoYXQtPnB0ciA9IChjaGF0LT5wdHIgKyAxKSAlIE1BWF9TQVZFRF9NRVNTQUdFUzsKKyAgLy8gTWVzc2FnZSBzcGVpY2hlcm4KKyAgbXNnLT5tc2cgPSBtZXNzYWdlOworICBtc2ctPnByZWZpeCA9IGluZGVudDsKKyAgbXNnLT50aW1lc3RhbXAgPSB0aW1lKCk7Cit9CisKK3Byb3RlY3RlZCB2b2lkIGNsZWFyX3RlbGxfaGlzdG9yeSgpCit7CisgIC8qIE5hY2ggZWluZW0gInNjaGxhZmUgZWluIiB3ZXJkZW4gZGllIGdlc3BlaWNoZXJ0ZW4gTWl0dGVpbHVuZ2VuIGdlbG9lc2NodCwKKyAgICAgc29mZXJuIGRlciBTcGllbGVyIG5pY2h0cyBhYndlaWNoZW5kZXMgZWluZ2VzdGVsbHQgaGF0LiAqLworCisjaWZkZWYgVEVMTEhJU1RfTE9OR0xJRkUKKyAgaWYgKHRlbGxfaGlzdG9yeV9lbmFibGVkID09IFRFTExISVNUX0xPTkdMSUZFKQorICAgIHJldHVybjsKKyNlbmRpZgorCisgIGZvcmVhY2ggKHN0cmluZyB1aWQsIHN0cnVjdCBjaGF0X3MgY2hhdDogdGVsbF9oaXN0b3J5KQorICAgIGlmIChwb2ludGVycChjaGF0LT5tc2didWYpKSB7CisgICAgICBjaGF0LT5tc2didWYgPSAwOworICAgICAgY2hhdC0+cHRyID0gMDsKKyAgICB9Cit9CisKK3Byb3RlY3RlZCB2b2lkIHJlc2V0KHZvaWQpCit7CisgIC8qIFdpcmQgMTUgTWludXRlbiBuYWNoIGRlbSBWZXJsdXN0IGRlciBWZXJiaW5kdW5nIGF1ZmdlcnVmZW4uIEZhbGxzIGRlcgorICAgICBTcGllbGVyIG5pY2h0IGluendpc2NoZW4gZWluZSBWZXJiaW5kdW5nIHdpZWRlcmhlcmdlc3RlbGx0IGhhdCwgd2VyZGVuCisgICAgIHdpZSBiZWkgZWluZW0gInNjaGxhZmUgZWluIiBkaWUgTWl0dGVpbHVuZ2VuIGdlbG9lc2NodC4gKi8KKworICBpZiAoIWludGVyYWN0aXZlKCkpCisgICAgY2xlYXJfdGVsbF9oaXN0b3J5KCk7CisKK30KKworLy8gZ2VydWZlbiwgd2VubiB6aWVsZ2VyaWNodGV0IG1pdCBqZW1hbmRlbSBrb21tdW5pemllcnQgd2lyZCBfdW5kXyBkYXMKKy8vIEVyZ2VibmlzIGRlcyBSZWNlaXZlTXNnKCkgZ2VwcnVlZnQgd2VyZGVuIHVuZCBlaW5lIE1lbGR1bmcgYXVzZ2VnZWJlbgorLy8gd2VyZGVuIHNvbGwuCitwcml2YXRlIHZvaWQgX3NlbmQob2JqZWN0IG9iLCBzdHJpbmcgbXNnLCBpbnQgbXNnX3R5cGUsCisgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1zZ19hY3Rpb24sIHN0cmluZyBtc2dfcHJlZml4KQoreworICBpbnQgcmVzID0gb2ItPlJlY2VpdmVNc2cobXNnLCBtc2dfdHlwZSwgbXNnX2FjdGlvbiwgbXNnX3ByZWZpeCwgTUUpOworICBzd2l0Y2gocmVzKSB7CisgICAgY2FzZSBNU0dfREVMSVZFUkVEOgorICAgICAgYnJlYWs7ICAvLyBuaXggbWFjaGVuCisgICAgY2FzZSBNU0dfQlVGRkVSRUQ6CisgICAgICBSZWNlaXZlTXNnKG9iLT5OYW1lKFdFUikgKyAiIG1vZWNodGUgZ2VyYWRlIG5pY2h0IGdlc3RvZXJ0IHdlcmRlbi4iCisgICAgICAgICAgIkRpZSBNaXR0ZWlsdW5nIHd1cmRlIHZvbiBlaW5lbSBrbGVpbmVuIEtvYm9sZCBpbiBFbXBmYW5nICIKKyAgICAgICAgICAiZ2Vub21tZW4uIEVyIHdpcmQgc2llIHNwYWV0ZXIgd2VpdGVybGVpdGVuISIsCisgICAgICAgICAgTVRfTk9USUZJQ0FUSU9OLCBtc2dfYWN0aW9uLCAwLCB0aGlzX29iamVjdCgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTVNHX0lHTk9SRUQ6CisgICAgY2FzZSBNU0dfVkVSQl9JR046CisgICAgY2FzZSBNU0dfTVVEX0lHTjoKKyAgICAgIFJlY2VpdmVNc2cob2ItPk5hbWUoV0VSKSArICIgaG9lcnQgZ2FyIG5pY2h0IHp1LCB3YXMgRHUgc2Fnc3QuIiwKKyAgICAgICAgICAgTVRfTk9USUZJQ0FUSU9OLCBtc2dfYWN0aW9uLCAwLCB0aGlzX29iamVjdCgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTVNHX1NFTlNFX0JMT0NLOgorICAgICAgUmVjZWl2ZU1zZyhvYi0+TmFtZShXRVIpICsgIiBrYW5uIERpY2ggbGVpZGVyIG5pY2h0IHdhaHJuZWhtZW4uIiwKKyAgICAgICAgICBNVF9OT1RJRklDQVRJT04sIG1zZ19hY3Rpb24sIDAsIHRoaXNfb2JqZWN0KCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNU0dfQlVGRkVSX0ZVTEw6CisgICAgICBSZWNlaXZlTXNnKG9iLT5OYW1lKFdFUikgKyAiIG1vZWNodGUgZ2VyYWRlIG5pY2h0IGdlc3RvZXJ0IHdlcmRlbi4iCisgICAgICAgICAgIkRpZSBNaXR0ZWlsdW5nIGdpbmcgdmVybG9yZW4sIGRlbm4gZGVyIEtvYm9sZCBrYW5uIHNpY2ggIgorICAgICAgICAgICJuaWNodHMgbWVociBtZXJrZW4hIiwgTVRfTk9USUZJQ0FUSU9OLCBtc2dfYWN0aW9uLCAKKyAgICAgICAgICAwLCB0aGlzX29iamVjdCgpKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBSZWNlaXZlTXNnKG9iLT5OYW1lKFdFUikgKyAiIGhhdCBEZWluZSBOYWNocmljaHQgbGVpZGVyIG5pY2h0ICIKKyAgICAgICAgICAibWl0YmVrb21tZW4uIiwgTVRfTk9USUZJQ0FUSU9OLCBtc2dfYWN0aW9uLCAwLCB0aGlzX29iamVjdCgpKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8vIEF1c2dhYmUgYW4gZGFzIE9iamVrdCBzZWxiZXIgdW5kIEF1ZnplaWNobnVuZyBpbiBkZXIgS29tbWhpc3RvcnksIGZhbGxzCisvLyBub2V0aWcuIFdpcmQgYmVpIF9hdXNnZWhlbmRlbl8gTmFjaHJpY2h0ZW4gaW0gZWlnZW5lbiBPYmpla3QgZ2VydWZlbiwgZGFtaXQKKy8vIGRpZSBOYWNocmljaHQgZ2dmLiBpbiBkZW4gS29tbWhpc3RvcnkgZXJmYXNzdCB3aXJkLgorLy8gVE9ETzogZW50ZmVybmVuLCB3ZW5uIGFsbGVzIEF1ZnJ1ZmVyIGVyc2V0enQgc2luZCBkdXJjaCBSZWNlaXZlTXNnKCkuCitwcm90ZWN0ZWQgdmFyYXJncyBpbnQgX3JlY3Yob2JqZWN0IG9iLCBzdHJpbmcgbWVzc2FnZSwgaW50IGZsYWcsIHN0cmluZyBpbmRlbnQpCit7CisgIHdyaXRlKGJyZWFrX3N0cmluZyhtZXNzYWdlLCA3OCwgaW5kZW50LAorICAgICAgICBRdWVyeVByb3AoUF9NRVNTQUdFX1BSRVBFTkQpID8gQlNfUFJFUEVORF9JTkRFTlQgOiAwKSk7CisgIGlmICgoZmxhZyAmIE1TR0ZMQUdfVEVMTCB8fCBmbGFnICYgTVNHRkxBR19SRU1PVEUpICYmCisgICAgICBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iKSkKKyAgeworICAgIGlmIChmbGFnICYgTVNHRkxBR19XSElTUEVSKQorICAgICAgYWRkX3RvX3RlbGxfaGlzdG9yeShnZXR1aWQob2IpLCAxLCAwLAorICAgICAgICAiRHUgZmx1ZXN0ZXJzdCAiICsgb2ItPm5hbWUoV0VNKSArICIgYXVzIGRlciBGZXJuZSBldHdhcyB6dS4iLCAwLAorICAgICAgICBmbGFnKTsKKyAgICBlbHNlCisgICAgICBhZGRfdG9fdGVsbF9oaXN0b3J5KGdldHVpZChvYiksIDEsIDAsIG1lc3NhZ2UsIGluZGVudCwgZmxhZyk7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8vIDxzZW5kZXI+IHNvbGx0ZSBlaW4gT2JqZWt0IHNlaW4uIEluIHNlbHRlbmVuIEZhZWxsZW4gKHouQi4KKy8vIEZlaGxlcmJlaGFuZGx1bmcpIGlzdCBlcyBqZWRvY2ggYXVjaCBtYWwgZWluIFN0cmluZy4KK3ZhcmFyZ3MgaW50IE1lc3NhZ2Uoc3RyaW5nIG1zZywgaW50IGZsYWcsIHN0cmluZyBpbmRlbnQsCisgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbmFtZSwgbWl4ZWQgc2VuZGVyKQoreworICBvYmplY3QgdGk7CisgIHN0cmluZyB2ZXJiLCByZXBseSwgKmlnbm9yZSwgdGluOworICBpbnQgZW0sIHRlOworICBtaXhlZCBkZWFmOworCisgIC8vIEJlaSBkZW4gS2FuYWVsZW4gJ0RlYnVnJyB1bmQgJ0VudHdpY2tsdW5nJyBrYW5uIG1hbiBnZXppZWx0IEJ1Z3MKKyAgLy8gZWluemVsbmVyIE1hZ2llciBpZ25vcmllcmVuLiBEYXp1IHdpcmQgZGVyIEthbmFsbmFtZSB6dW0gJ3ZlcmInLAorICAvLyBkYW1pdCAnaWdub3JpZXJlIG5hbWUuZGVidWcnIGZ1bmt0aW9uaWVydC4KKyAgaWYoIGZsYWcgPT0gTVNHRkxBR19DSEFOTkVMICl7CisgICAgICBpZigobXNnWzEuLjVdID09ICJEZWJ1ZyIgfHwgbXNnWzEuLjExXSA9PSAiRW50d2lja2x1bmciCisgICAgICAgICAgICB8fCBtc2dbMS4uOV09PSJXYXJudW5nZW4iKSkKKyAgICAgIHsKKyAgICAgICAgLy8gTWlzc2JyYXVjaCBkZXIgVmFyaWFibGUgJ2lnbm9yZScgYWxzIFp3aXNjaGVuc3BlaWNoZXIKKyAgICAgICAgaWdub3JlID0gcmVnZXhwbG9kZSggbXNnLCAiOnwgfFxcXSIgKTsKKyAgICAgICAgdmVyYiA9IGxvd2VyX2Nhc2UoaWdub3JlWzBdWzEuLl0pOworICAgICAgICB0aW4gPSBsb3dlcl9jYXNlKGlnbm9yZVsyXSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGlmKGNuYW1lKQorICAgICAgICAgIHZlcmI9bG93ZXJfY2FzZShjbmFtZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICB2ZXJiPXF1ZXJ5X3ZlcmIoKTsKKyAgICAgICAgaWYoIHRpID0gdGhpc19pbnRlcmFjdGl2ZSgpICkKKyAgICAgICAgeworICAgICAgICAgIHRpbiA9IGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8vZmFsbHMgZG9jaCBrZWluIE9iamVrdC4uLgorICAgICAgICAgIGlmIChvYmplY3RwKHNlbmRlcikpCisgICAgICAgICAgICB0aW49bG93ZXJfY2FzZShzZW5kZXItPm5hbWUoUkFXKXx8IjxVbmJla2FubnQ+Iik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICBpZiggdGkgPSB0aGlzX2ludGVyYWN0aXZlKCkgKQorICAgICAgdGluID0gZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSk7CisgICAgdmVyYiA9IHF1ZXJ5X3ZlcmIoKTsKKyAgfQorCisgIHRlID0gZmxhZyAmIChNU0dGTEFHX1RFTEwgfCBNU0dGTEFHX1dISVNQRVIpOworCisgIC8vIGZ1ZXIgImVyd2lkZXJlIgorICBpZiAodGkgJiYgKGZsYWcgJiBNU0dGTEFHX1RFTEwgfHwgZmxhZyAmIE1TR0ZMQUdfUkVNT1RFKSkgeworICAgIGlmICghdGktPlF1ZXJ5UHJvcChQX0lOVklTKXx8SVNfTEVBUk5FUihNRSkpIHsKKyAgICAgIGlmIChmbGFnICYgTVNHRkxBR19XSElTUEVSKQorICAgICAgICBhZGRfdG9fdGVsbF9oaXN0b3J5KGdldHVpZCh0aSksIDAsIDEsCisgICAgICAgICAgY2FwaXRhbGl6ZSgoKChJU19MRUFSTkVSKHRpKSAmJiAhdGktPlF1ZXJ5UHJvcChQX0lOVklTKSAmJgorICAgICAgICAgICAgKHRpLT5RdWVyeVByb3AoUF9DQU5fRkxBR1MpICYgQ0FOX1BSRVNBWSkpID8KKyAgICAgICAgICAgIHRpLT5RdWVyeVByb3AoUF9QUkVTQVkpIDogIiIpICsgdGktPm5hbWUoKSkgfHwgIiIpICsKKyAgICAgICAgICAiIGZsdWVzdGVydCBEaXIgYXVzIGRlciBGZXJuZSBldHdhcyB6dS4iLCAwLCBmbGFnLCAwKTsKKyAgICAgIGVsc2UKKyAgICAgICAgYWRkX3RvX3RlbGxfaGlzdG9yeShnZXR1aWQodGkpLCAwLCAxLCBtc2csIGluZGVudCwgZmxhZywgMCk7CisgICAgfQorICB9CisgIC8vIEhvZXJ0IGRlciBTcGllbGVyIG5pY2h0PworICBlbSA9ICh0aSAmJgorICAgICAgICAodGUgfHwgZmxhZyAmIE1TR0ZMQUdfU0hPVVQpICYmCisgICAgICAgIChRdWVyeVByb3AoUF9FQVJNVUZGUykgJiYKKyAgICAgICAgICAocXVlcnlfd2l6X2xldmVsKHRpKSA8IFF1ZXJ5UHJvcChQX0VBUk1VRkZTKSkpKTsKKyAgaWdub3JlID0gKHBvaW50ZXJwKGlnbm9yZSA9IFF1ZXJ5UHJvcChQX0lHTk9SRSkpID8gaWdub3JlIDogKHt9KSk7CisKKyAgLy8gV2VyZGVuIGRlciBTZW5kZXIgb2RlciBkYXMgVmVyYiBpZ25vcmllcnQ/CisgIGlmKCF0aSAmJiB0aW4gJiYgZmxhZyA9PSBNU0dGTEFHX0NIQU5ORUwpCisgIHsKKyAgICAgaWYoKG1lbWJlcihpZ25vcmUsIHRpbikgIT0gLTEpKQorICAgICB7CisgICAgICAgcmV0dXJuIE1FU1NBR0VfSUdOT1JFX1lPVTsKKyAgICAgfQorICAgICBpZih2ZXJiICYmICBzaXplb2YoZmlsdGVyKGlnbm9yZSwgIydjaGVja19pZ25vcmUsIHZlcmIsIHRpbikpICkKKyAgICAgeworICAgICAgIHJldHVybiBNRVNTQUdFX0lHTk9SRV9ZT1U7CisgICAgIH0KKyAgfQorICBpZiAodGkgJiYgKG1lbWJlcihpZ25vcmUsIGdldHVpZCh0aSkpICE9IC0xKSkgeworICAgIGlmKHRlICYmIChJU19MRUFSTkVSKHRpKXx8IVF1ZXJ5UHJvcChQX0lOVklTKSkpCisgICAgICBlZnVuOjp0ZWxsX29iamVjdCh0aSwgY2FwaXRhbGl6ZShuYW1lKCkpKworICAgICAgICAgICAgICAgICAgICAgICIgaG9lcnQgZ2FyIG5pY2h0IHp1LCB3YXMgRHUgc2Fnc3QuXG4iKTsKKyAgICByZXR1cm4gTUVTU0FHRV9JR05PUkVfWU9VOworICB9CisgIGlmKHRpbiAmJiB2ZXJiICYmCisgICAgIHNpemVvZihmaWx0ZXIoaWdub3JlLCAjJ2NoZWNrX2lnbm9yZS8qJyovLCB2ZXJiLCB0aW4pKSkKKyAgeworICAgIGlmKHRpICYmIHZlcmJbMC4uMl0gIT0gInJ1ZiIgJiYgdmVyYlswLi4zXSAhPSAibXJ1ZiIgJiYKKyAgICAgICB2ZXJiWzAuLjNdICE9ICJlY2hvIiAmJiB2ZXJiWzBdICE9ICctJyAmJiAhKGZsYWcgJiBNU0dGTEFHX0NIQU5ORUwpICkKKyAgICAgIGVmdW46OnRlbGxfb2JqZWN0KHRpLCBuYW1lKCkrIiB3ZWhydCBcIiIrdmVyYisiXCIgYWIuXG4iKTsKKyAgICByZXR1cm4gTUVTU0FHRV9JR05PUkVfVkVSQjsKKyAgfQorICBpZiAoZmxhZyAmIE1TR0ZMQUdfUlRFTEwpIHsKKyAgICBpbnQgYXQ7CisKKyAgICB2ZXJiID0gbG93ZXJfY2FzZShvbGRfZXhwbG9kZShtc2csICIgIilbMF1bMS4uXSk7CisgICAgYXQgPSBtZW1iZXIodmVyYiwgJ0AnKTsKKyAgICAvKiB2ZXJiIHdpcmQgaGllciBlaCBtaXNzYnJhdWNodCwgYWxzbyBhdWNoIGZ1ZXIgZWluIGludGVybXVkLWVyd2lkZXJlKi8KKyAgICBhZGRfdG9fdGVsbF9oaXN0b3J5KHZlcmIsIDAsIDEsIG1zZywgaW5kZW50LCBmbGFnLCAwKTsKKworICAgIGlmICgobWVtYmVyKGlnbm9yZSwgdmVyYikgPj0gMCkgfHwgKG1lbWJlcihpZ25vcmUsdmVyYlswLi5hdF0pID49IDApKQorICAgICAgcmV0dXJuIE1FU1NBR0VfSUdOT1JFX1lPVTsKKyAgICBlbHNlIGlmIChhdCA+IDAgJiYgbWVtYmVyKGlnbm9yZSwgdmVyYlthdC4uXSkgPj0gMCkKKyAgICAgIHJldHVybiBNRVNTQUdFX0lHTk9SRV9NVUQ7CisgIH0KKworICAvLyBUYXViaGVpdC9Pcm9wYXgKKyAgdGUgfD0gKGZsYWcgJiBNU0dGTEFHX1NBWSk7CisKKyAgaWYgKFF1ZXJ5UHJvcChQX0RFQUYpICYmIChmbGFnICYgTVNHRkxBR19ERUFGQ0hLKSAmJiAhKGZsYWcgJiBNU0dGTEFHX0NISVNUKSkgeworICAgIGRlYWYgPSBRdWVyeVByb3AoUF9ERUFGKTsKKyAgICBpZiAodGUpCisgICAgICByZXBseSA9IHN0cmluZ3AoZGVhZikgPworICAgICAgICBjYXBpdGFsaXplKHNwcmludGYoZGVhZiwgbmFtZSgpKSkgOgorICAgICAgICBjYXBpdGFsaXplKG5hbWUoKSkrIiBpc3QgbW9tZW50YW4gbGVpZGVyIHRhdWIuXG4iOworICB9CisgIGVsc2UgaWYgKGVtKQorICAgIHJlcGx5ID0gY2FwaXRhbGl6ZShuYW1lKCkpKyIgaGF0IE9yb3BheCBpbiBkZW4gT2hyZW4uXG4iOworCisgIG1zZyA9IGJyZWFrX3N0cmluZyhtc2csIDc4LCBpbmRlbnQsCisgICAgKFF1ZXJ5UHJvcChQX01FU1NBR0VfUFJFUEVORCkgPyBCU19QUkVQRU5EX0lOREVOVCA6IDApIHwgQlNfTEVBVkVfTVlfTEZTKTsKKworICBpZihRdWVyeVByb3AoUF9CVUZGRVIpICYmCisgICAgIChkZWFmIHx8CisgICAgICBxdWVyeV9lZGl0aW5nKHRoaXNfb2JqZWN0KCkpIHx8CisgICAgICBxdWVyeV9pbnB1dF9wZW5kaW5nKHRoaXNfb2JqZWN0KCkpKSkKKyAgeworICAgIGRlYWYgPSBNRVNTQUdFX0RFQUY7CisgICAgaWYoZmxhZyAmIE1TR0ZMQUdfQ0FDSEUpCisgICAgeworICAgICAgaWYoIXN0cmluZ3AocmVwbHkpKQorICAgICAgICByZXBseSA9IG5hbWUoKSsiIG1vZWNodGUgZ2VyYWRlIG5pY2h0IGdlc3RvZXJ0IHdlcmRlbi5cbiI7CisKKyAgICAgIG1zZyA9IG1zZ1swLi48Ml0rIiBbIiArIHN0cmZ0aW1lKCIlSDolTSIsdGltZSgpKSArICJdXG4iOworCisgICAgICBpbnQgcmVzID0gIGFkZF90b19rb2JvbGQobXNnLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHAoc2VuZGVyKSA/IHNlbmRlciA6IE1FKTsKKyAgICAgIGlmKHJlcyA9PSBNU0dfQlVGRkVSRUQpCisgICAgICB7CisKKyAgICAgICAgcmVwbHkgKz0gIkRpZSBNaXR0ZWlsdW5nIHd1cmRlIHZvbiBlaW5lbSBrbGVpbmVuIEtvYm9sZCBpbiBFbXBmYW5nICIrCisgICAgICAgICAgICAgICAgICJnZW5vbW1lbi5cbkVyIHdpcmQgc2llIHNwYWV0ZXIgd2VpdGVybGVpdGVuISI7CisgICAgICAgIGRlYWYgPSBNRVNTQUdFX0NBQ0hFOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHJlcGx5ICs9ICJEaWUgTWl0dGVpbHVuZyBnaW5nIHZlcmxvcmVuLCBkZW5uICIrCisgICAgICAgICAgICAgICAgICJkZXIgS29ib2xkIGthbm4gc2ljaCBuaWNodHMgbWVociBtZXJrZW4hIjsKKyAgICAgICAgZGVhZiA9IE1FU1NBR0VfQ0FDSEVfRlVMTDsKKyAgICAgIH0KKyAgICAgIGlmKHRpICYmIChJU19MRUFSTkVSKHRpKXx8IVF1ZXJ5UHJvcChQX0lOVklTKSkpCisgICAgICAgIGVmdW46OnRlbGxfb2JqZWN0KHRpLCByZXBseSsiXG4iKTsKKyAgICB9CisgICAgcmV0dXJuIGRlYWY7CisgIH0KKyAgZWxzZSBpZigoZGVhZiB8fCBlbSkgJiYKKyAgICAgICAgICAoIChmbGFnICYgTVNHRkxBR19SVEVMTCkgfHwKKyAgICAgICAgICAgICh0aSAmJiAoSVNfTEVBUk5FUih0aSl8fCFRdWVyeVByb3AoUF9JTlZJUykpKSkpIHsKKyAgICBpZiAodGUgJiYgdGkpCisgICAgICBlZnVuOjp0ZWxsX29iamVjdCh0aSwgcmVwbHkpOworICAgIHJldHVybiBNRVNTQUdFX0RFQUY7CisgIH0KKworICBfZmx1c2hfY2FjaGUoMCk7CisgIGlmKHRlICYmIFF1ZXJ5UHJvcChQX0FXQVkpKQorICAgIG1zZyA9IG1zZ1swLi48Ml0rIiBbIiArIHN0cmZ0aW1lKCIlSDolTSIsdGltZSgpKSArICJdXG4iOworCisgIGlmIChmbGFnICYgKE1TR0ZMQUdfU0FZIHwgTVNHRkxBR19URUxMKSAmJiBjb21tX2JlZXAoKSkgeworICAgIG1zZz1NRVNTQUdFX0JFRVArbXNnOworICB9CisgIGVmdW46OnRlbGxfb2JqZWN0KE1FLCBtc2cpOworICByZXR1cm4gTUVTU0FHRV9PSzsKK30KKworc3RhdGljIGludCBpZ25vcmllcmUoc3RyaW5nIHN0cikKK3sKKyAgc3RyID0gX3VucGFyc2VkX2FyZ3MoMSk7CisgIG1hcHBpbmcgaWdub3JlPVF1ZXJ5KFBfSUdOT1JFLCBGX1ZBTFVFKTsKKworICBpZiAoIXN0cikKKyAgeworICAgIHN0cmluZyogaWduYXJyID0gbV9pbmRpY2VzKGlnbm9yZSk7CisgICAgaWYgKCFzaXplb2YoaWduYXJyKSkKKyAgICAgICAgdGVsbF9vYmplY3QoTUUsICJEdSBpZ25vcmllcnN0IG5pZW1hbmRlbi5cbiIpOworICAgICAgZWxzZQorICAgICAgICBSZWNlaXZlTXNnKCJEdSBpZ25vcmllcnN0OlxuIgorICAgICAgICAgICAgICAgICAgICsgYnJlYWtfc3RyaW5nKENvdW50VXAobWFwKHNvcnRfYXJyYXkoaWduYXJyLCAjJz4gKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMnY2FwaXRhbGl6ZSApIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICsgIi4iLDc4KSwKKyAgICAgICAgICAgICAgICAgICBNVF9OT1RJRklDQVRJT058TVNHX0RPTlRfSUdOT1JFfE1TR19ET05UX1NUT1JFfE1TR19ET05UX1dSQVAsCisgICAgICAgICAgICAgICAgICAgMCwwLHRoaXNfb2JqZWN0KCkpOworICAgICAgcmV0dXJuIDE7CisgIH0KKyAgLy8gdHJpbSBzcGFjZXMgZnJvbSBhcmdzIGFuZCBjb252ZXJ0IHRvIGxvd2VyIGNhc2UuCisgIHN0ciA9IGxvd2VyX2Nhc2UodHJpbShzdHIsIFRSSU1fQk9USCkpOworCisgIGlmIChtZW1iZXIoaWdub3JlLCBzdHIpKQorICB7CisgICAgUmVtb3ZlSWdub3JlKHN0cik7CisgICAgdGVsbF9vYmplY3QoTUUsIHNwcmludGYoIkR1IGlnbm9yaWVyc3QgJXMgbmljaHQgbWVoci5cbiIsIGNhcGl0YWxpemUoc3RyKSkpOworICB9CisgIGVsc2UgaWYgKHNpemVvZihpZ25vcmUpPjEwMCkKKyAgeworICAgdGVsbF9vYmplY3QoTUUsICJEdSBpZ25vcmllcnN0IHNjaG9uIGdlbnVlZ2VuZCFcbiIpOworICB9CisgIGVsc2UgaWYgKEFkZElnbm9yZShzdHIpID09IDEpCisgIHsKKyAgICB0ZWxsX29iamVjdChNRSwKKyAgICAgICAgc3ByaW50ZigiRHUgaWdub3JpZXJzdCBqZXR6dCAlcy5cbiIsIGNhcGl0YWxpemUoc3RyKSkpOworICB9CisgIGVsc2UKKyAgeworICAgIHRlbGxfb2JqZWN0KE1FLAorICAgICAgICBzcHJpbnRmKCInJXMnIGthbm5zdCBEdSBuaWNodCBpZ25vcmllcmVuLlxuIixzdHIpKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IF9tc2dfYmVlcChzdHJpbmcgc3RyKSB7CisgIGludCBiZWVwX2ludGVydmFsOworICBub3RpZnlfZmFpbCgiU3ludGF4OiBrbGluZ2VsdG9uIDwxIGJpcyAzNjAwIFNla3VuZGVuPiBvZGVyIGtsaW5nZWx0b24gYXVzXG4iKTsKKyAgaWYgKHN0cmluZ3Aoc3RyKSkgeworICAgIGlmIChzdHI9PSJhdXMiKQorICAgICAgU2V0UHJvcChQX01FU1NBR0VfQkVFUCwwKTsKKyAgICBlbHNlIGlmICgoYmVlcF9pbnRlcnZhbD10b19pbnQoc3RyKSkgPiAwICYmIGJlZXBfaW50ZXJ2YWw8PTM2MDApCisgICAgICBTZXRQcm9wKFBfTUVTU0FHRV9CRUVQLGJlZXBfaW50ZXJ2YWwpOworICAgIGVsc2UgcmV0dXJuIDA7CisgIH0KKworICBiZWVwX2ludGVydmFsPShpbnQpUXVlcnlQcm9wKFBfTUVTU0FHRV9CRUVQKTsKKyAgX25vdGlmeSgiVG9uIGJlaSBNaXR0ZWlsdW5nZW46ICIrCisgICAgICAgIChiZWVwX2ludGVydmFsID8gImFsbGVyICIrYmVlcF9pbnRlcnZhbCsiIFNla3VuZGVuLiIgOiAiYXVzLiIpLAorICAgICAgICBxdWVyeV92ZXJiKCkpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfbXNnX3ByZXBlbmQoc3RyaW5nIHN0cikgeworICBpbnQgYmVlcF9pbnRlcnZhbDsKKyAgbm90aWZ5X2ZhaWwoIlN5bnRheDogc2VuZGVyd2llZGVyaG9sdW5nIGVpbi9hdXNcbiIpOworICBpZiAoc3RyaW5ncChzdHIpKSB7CisgICAgaWYgKHN0cj09ImF1cyIpICAKKyAgICAgIFNldFByb3AoUF9NRVNTQUdFX1BSRVBFTkQsMSk7CisgICAgZWxzZSBpZiAoc3RyPT0iZWluIikgIAorICAgICAgU2V0UHJvcChQX01FU1NBR0VfUFJFUEVORCwwKTsKKyAgICBlbHNlIHJldHVybiAwOworICB9CisKKyAgX25vdGlmeSgiU2VuZGVyd2llZGVyaG9sdW5nIGJlaSBNaXR0ZWlsdW5nZW46ICIrIAorICAgICAgICAgICgoaW50KVF1ZXJ5UHJvcChQX01FU1NBR0VfUFJFUEVORCkgPyAgImF1cyIgOiAiZWluIikrIi4iLAorICAgICAgICAgIHF1ZXJ5X3ZlcmIoKSk7CisKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2NvbW11bmljYXRlKG1peGVkIHN0ciwgaW50IHNpbGVudCkKK3sKKyAgc3RyaW5nICB2ZXJiOworICBzdHJpbmcgIG15bmFtZTsKKyAgc3RyaW5nICBtc2c7CisKKyAgaWYgKCFzdHIgfHwgZXh0ZXJuX2NhbGwoKSkgc3RyPV91bnBhcnNlZF9hcmdzKCl8fCIiOworICAvKiBzdHI9X3VucGFyc2VkX2FyZ3MoKXx8IiI7ICovCisgIHZlcmIgPSBxdWVyeV92ZXJiKCk7CisgIGlmKHN0cmluZ3AodmVyYikgJiYgdmVyYlswXSA9PSAnXCcnKSBzdHIgPSB2ZXJiWzEuLl0gKyAiICIgKyBzdHI7CisgIGlmIChzdHI9PSIifHxzdHI9PSIgInx8IXN0cikKKyAgeworICAgIF9ub3RpZnkoIldhcyB3aWxsc3QgRHUgc2FnZW4/IixNQV9TQVkpOworICAgIHJldHVybiAxOworICB9CisgIG1zZz1wZXJtdXRhdGUoc3RyKTsKKworICBteW5hbWU9KCgoUXVlcnlQcm9wKFBfSU5WSVMpfHwhSVNfTEVBUk5FUihNRSkpfHwKKyAgICAgIShRdWVyeVByb3AoUF9DQU5fRkxBR1MpJkNBTl9QUkVTQVkpPworICAgICIiOlF1ZXJ5UHJvcChQX1BSRVNBWSkpK25hbWUoKSl8fCIiOworCisgIC8vIGFuIGFsbGVzIGltIFJhdW0gc2VuZGVuLiAoTVRfTElTVEVOLCB3ZWlsIGRpZXMgZ2VzcHJvY2hlbmUgS29tbXVuaWthdGlvbgorICAvLyBpc3QsIGtlaW5lIE1UX0NPTU0pCisgIHNlbmRfcm9vbShlbnZpcm9ubWVudCgpLCBtc2csIE1UX0xJU1RFTiwgTUFfU0FZLAorICAgICAgICAgICAgY2FwaXRhbGl6ZShteW5hbWUpKyIgc2FndDogIiwgKHt0aGlzX29iamVjdCgpfSkgKTsKKworICBpZighc2lsZW50KQorICB7CisgICAgUmVjZWl2ZU1zZyhtc2csIE1UX05PVElGSUNBVElPTnxNU0dfRE9OVF9JR05PUkV8TVNHX0RPTlRfU1RPUkUsCisgICAgICAgICAgICAgICBNQV9TQVksICJEdSBzYWdzdDogIiwgTUUpOworICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9zaG91dF90b19hbGwobWl4ZWQgc3RyKQoreworICBzdHJpbmcgcHJlLCBteW5hbWUsIHJlYWxuYW1lLCB3aXphcmRzX21zZywgcGxheWVyc19tc2c7CisgIHN0cmluZyB3aXphcmRfcHJlZml4LCBwbGF5ZXJfcHJlZml4OworICBpbnQgY2hhcnM7CisKKyAgaWYgKCEoc3RyPV91bnBhcnNlZF9hcmdzKCkpKQorICB7CisgICAgX25vdGlmeSgiV2FzIHdpbGxzdCBEdSBydWZlbj8iLE1BX1NIT1VUKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBjaGFycz1zaXplb2Yoc3RyKS8yOworICBpZiAoY2hhcnM8NCkgY2hhcnM9NDsKKyAgcHJlID0gKCFJU19MRUFSTkVSKE1FKSB8fAorICAgUXVlcnlQcm9wKFBfSU5WSVMpIHx8CisgICAhKFF1ZXJ5UHJvcChQX0NBTl9GTEFHUykgJiBDQU5fUFJFU0FZKSkgPyAiIiA6IFF1ZXJ5UHJvcChQX1BSRVNBWSk7CisgIHJlYWxuYW1lID0gY2FwaXRhbGl6ZSgocHJlICsgY2FwaXRhbGl6ZShnZXR1aWQoKSkpfHwiIik7CisgIG15bmFtZSA9IGNhcGl0YWxpemUocHJlICsgbmFtZSgpfHwiIik7CisgIGlmIChRdWVyeVByb3AoUF9JTlZJUykpCisgICAgcmVhbG5hbWUgPSAiKCIrcmVhbG5hbWUrIikiOworCisgIHdpemFyZHNfbXNnID0gcGVybXV0YXRlKHN0cik7CisgIHdpemFyZF9wcmVmaXggPSBteW5hbWUrIiBydWZ0OiAiOworCisgIGlmKFF1ZXJ5UHJvcChQX0ZST0cpKSB7CisgICAgcGxheWVyc19tc2cgPSAiUXVhYWFrLCBxdWFhYWFhaywgcXV1dXVhYWFhYWFhYWFhYWFhYWFhYWFhYWsgISEiOworICAgIHBsYXllcl9wcmVmaXggPSBteW5hbWUrIiBxdWFrdDogIjsKKyAgfQorICBlbHNlIHsKKyAgICBwbGF5ZXJzX21zZyA9IHdpemFyZHNfbXNnOworICAgIHBsYXllcl9wcmVmaXggPSB3aXphcmRfcHJlZml4OworICB9CisKKyAgaWYoIUlTX0xFQVJORVIodGhpc19wbGF5ZXIoKSkpCisgIHsKKyAgICBpZihRdWVyeVByb3AoUF9HSE9TVCkpIHsKKyAgICAgICAgX25vdGlmeSgiU28gZ2FueiBvaG5lIEtvZXJwZXIgYmVrb21tc3QgRHUga2VpbmVuIFRvbiBoZXJhdXMuIiwKKyAgICAgICAgICAgICAgICBNQV9TSE9VVCk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoUXVlcnlQcm9wKFBfU1ApIDwoY2hhcnMrMjApKQorICAgIHsKKyAgICAgIF9ub3RpZnkoIkR1IG11c3N0IGVyc3Qgd2llZGVyIG1hZ2lzY2hlIEtyYWVmdGUgc2FtbWVsbi4iLAorICAgICAgICAgICAgICBNQV9TSE9VVCk7CisgICAgICBfbm90aWZ5KCJUaXA6IEJlbnV0eiBkb2NoIG1hbCBkaWUgRWJlbmVuIChIaWxmZSBkYXp1IG1pdCAnaGlsZmUgIgorICAgICAgICAgICAgICAiRWJlbmVuJykuIiwgTUFfU0hPVVQpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIFNldFByb3AoUF9TUCwgUXVlcnlQcm9wKFBfU1ApIC0gY2hhcnMgLSAyMCk7CisgIH0KKworICBSZWNlaXZlTXNnKHdpemFyZHNfbXNnLCBNVF9OT1RJRklDQVRJT058TVNHX0RPTlRfSUdOT1JFfE1TR19ET05UX1NUT1JFLAorICAgICAgICAgICAgICJydWZlIiwgIkR1IHJ1ZnN0OiAiLCBNRSk7CisKKyAgZm9yZWFjaCAoIG9iamVjdCBvYiA6IHVzZXJzKCktKHt0aGlzX29iamVjdCgpfSkgKQorICAgIGlmICggSVNfTEVBUk5FUihvYikgKQorICAgICAgb2ItPlJlY2VpdmVNc2cod2l6YXJkc19tc2csIE1UX0xJU1RFTnxNVF9GQVIsIE1BX1NIT1VULCB3aXphcmRfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICB0aGlzX29iamVjdCgpKTsKKyAgICBlbHNlCisgICAgICBvYi0+UmVjZWl2ZU1zZyhwbGF5ZXJzX21zZywgTVRfTElTVEVOfE1UX0ZBUiwgTUFfU0hPVVQsIHBsYXllcl9wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgIHRoaXNfb2JqZWN0KCkpOworCisgIHJldHVybiAxOworfQorCit2YXJhcmdzIGludCBfdGVsbChzdHJpbmcgd2hvLCBtaXhlZCBtc2cpCit7CisgIG9iamVjdCAgICBvYjsKKyAgc3RyaW5nICAgIGF3YXksbXluYW1lLHJldDsKKyAgbWl4ZWQgICAgIGlnbm9yZSxpdDsKKyAgc3RyaW5nICAgICp4bmFtZTsKKyAgaW50ICAgICAgIGksdmlzZmxhZzsKKworICBpZiAoZXh0ZXJuX2NhbGwoKSAmJiB0aGlzX2ludGVyYWN0aXZlKCkhPU1FKSByZXR1cm4gMTsKKyAgaWYgKCF3aG8gfHwgIW1zZykgeworICAgIF9ub3RpZnkoIldhcyB3aWxsc3QgRHUgbWl0dGVpbGVuPyIsTUFfVEVMTCk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBpZih3aG8gPT0gRVJXSURFUl9QQVJBTSkKKyAgeworICAgIGlmICghbGFzdF9jb21tX3BhcnRuZXIpCisgICAgeworICAgICAgX25vdGlmeV9mYWlsKCJEdSBoYXN0IGFiZXIgbm9jaCBrZWluZSBNaXR0ZWlsdW5nZW4gZXJoYWx0ZW4sIGF1ZiBkaWUgIgorICAgICAgICAgICJEdSB3YXMgZXJ3aWRlcm5cbmtvZW5udGVzdC5cbiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHdobz1sYXN0X2NvbW1fcGFydG5lcjsKKyAgfQorCisgIC8vIHRlaWxlIC54IG1pdCB0ZWlsdCBiaXNoZXJpZ2VuIEdlc3ByYWVjaHNwYXJ0bmVybiBldHdhcyBtaXQuCisgIGlmICh3aG8gPT0gIi4iKQorICAgd2hvID0gIi4xIjsKKworICBpZiAoIHNzY2FuZih3aG8sICIuJWQiLCBpKSA9PSAxICkgeworICAgIGlmKGkgPiAwICYmIGkgPD0gc2l6ZW9mKGNvbW1yZWNlaXZlcnMpKQorICAgICAgd2hvID0gY29tbXJlY2VpdmVyc1tpLTFdOworICAgIGVsc2UgeworICAgICAgX25vdGlmeV9mYWlsKCJTbyB2aWVsZW4gTGV1dGVuIGhhc3QgRHUgbm9jaCBuaWNodHMgbWl0Z2V0ZWlsdCFcbiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisKKyAgeG5hbWUgPSBleHBsb2RlKHdobywgIkAiKTsKKworICBpZiAoc2l6ZW9mKHhuYW1lKSA9PSAyKSAKKyAgeworICAgIGlmICggUXVlcnlQcm9wKFBfUVApICkKKyAgICB7CisgICAgICBpZiAocmV0PShzdHJpbmcpSU5FVEQtPl9zZW5kX3VkcCh4bmFtZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChbIFJFUVVFU1Q6ICAgInRlbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVDSVBJRU5UOiB4bmFtZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTkRFUjogICAgZ2V0dWlkKE1FKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEE6ICAgICBtc2cgXSksIDEpKQorICAgICAgeworICAgICAgICBfbm90aWZ5KHJldCwgTUFfVEVMTCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHdyaXRlKCJOYWNocmljaHQgYWJnZXNjaGlja3QuXG4iKTsKKyAgICAgICAgYWRkX3RvX3RlbGxfaGlzdG9yeSh3aG8sIDEsIDAsIG1zZywKKyAgICAgICAgICAiRHUgdGVpbHN0ICIgKyBjYXBpdGFsaXplKHdobykgKyAiIG1pdDogIiwgTVNHRkxBR19URUxMLCAxKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgd3JpdGUoIkR1IGhhc3QgbmljaHQgZ2VudWcgQWJlbnRldWVycHVua3RlLCB1bSBTcGllbGVybiBpbiBhbmRlcmVuIFxuIgorICAgICAgICAiTXVkcyBldHdhcyBtaXR0ZWlsZW4genUga29lbm5lbi5cbiIpOworICAgIHJldHVybiAxOworICB9CisKKyAgaWYgKCFvYj1maW5kX3BsYXllcihpdCA9IGxvd2VyX2Nhc2Uod2hvKSkpCisgIHsKKyAgICBpdCA9IG1hdGNoX2xpdmluZyhpdCwgMCk7CisgICAgaWYgKCFzdHJpbmdwKGl0KSkKKyAgICAgIHN3aXRjaChpdCkgeworICAgICAgY2FzZSAtMToKKyAgICAgICAgX25vdGlmeSgiRGFzIHdhciBuaWNodCBlaW5kZXV0aWchIixNQV9URUxMKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICBjYXNlIC0yOgorICAgICAgICBfbm90aWZ5KCJLZWluIHNvbGNoZXIgU3BpZWxlciEiLE1BX1RFTEwpOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICBvYiA9IGZpbmRfcGxheWVyKGl0KSB8fCBmaW5kX2xpdmluZyhpdCk7CisgICAgaWYoIW9iKSB7CisgICAgICBfbm90aWZ5KCJLZWluIHNvbGNoZXIgU3BpZWxlciEiLE1BX1RFTEwpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisKKyAgaWYoUXVlcnlQcm9wKFBfSU5WSVMpKXsKKyAgICBpZighSVNfTEVBUk5FUihvYikpCisgICAgICBteW5hbWUgPSBuYW1lKCk7CisgICAgZWxzZQorICAgICAgbXluYW1lPSIoIisKKyAgICAgICAgICAgICAoKFF1ZXJ5UHJvcChQX0NBTl9GTEFHUykgJiBDQU5fUFJFU0FZKT9RdWVyeVByb3AoUF9QUkVTQVkpOiIiKSsKKyAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZCgpKSArICIpIjsKKyAgfQorICBlbHNlCisgICAgbXluYW1lPSgoSVNfTEVBUk5FUihNRSkgJiYgKFF1ZXJ5UHJvcChQX0NBTl9GTEFHUykgJiBDQU5fUFJFU0FZKSkgPworICAgICAgICAgICAgICBRdWVyeVByb3AoUF9QUkVTQVkpOiIiKSArIG5hbWUoKTsKKyAgaWYgKG15bmFtZSAmJiBzaXplb2YobXluYW1lKSkgbXluYW1lPWNhcGl0YWxpemUobXluYW1lKTsKKyAgLy8gZXJzdG1hbCBhbiBFbXBmYWVuZ2VyIHNlbmRlbgorICBfc2VuZChvYiwgcGVybXV0YXRlKG1zZyksIE1UX0NPTU18TVRfRkFSLCBNQV9URUxMLAorICAgICAgICBteW5hbWUgKyAiIHRlaWx0IERpciBtaXQ6ICIpOworCisgIC8vIGRhbm4gZXZ0bC4gbm9jaCBhbiBBYnNlbmRlciBhdXNnZWJlbi4uLgorICBpZiAodmlzZmxhZyA9ICFvYi0+UXVlcnlQcm9wKFBfSU5WSVMpIHx8IElTX0xFQVJORVIodGhpc19wbGF5ZXIoKSkpCisgICAgX3JlY3Yob2IsIG1zZywgTVNHRkxBR19URUxMLCAiRHUgdGVpbHN0ICIgKyBjYXBpdGFsaXplKGl0KSArICIgbWl0OiAiKTsKKyAgLy8gb2RlciBpcmdlbmR3YXMgYW5kZXJlcyBhbiBkZW4gQWJzZW5kZXIgYXVzZ2ViZW4uLi4KKyAgaWYgKCF2aXNmbGFnICYmIGludGVyYWN0aXZlKG9iKSkKKyAgICAgIF9ub3RpZnkoIktlaW4gc29sY2hlciBTcGllbGVyISIsTUFfVEVMTCk7CisgIGVsc2UgaWYgKGF3YXkgPSAoc3RyaW5nKW9iLT5RdWVyeVByb3AoUF9BV0FZKSkKKyAgICAgIFJlY2VpdmVNc2coIGJyZWFrX3N0cmluZyggYXdheSwgNzgsIGNhcGl0YWxpemUoaXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaXN0IGdlcmFkZSBuaWNodCBkYTogIiwgQlNfSU5ERU5UX09OQ0UgKSwKKyAgICAgICAgICBNVF9OT1RJRklDQVRJT058TVNHX0RPTlRfV1JBUHxNU0dfRE9OVF9JR05PUkUsCisgICAgICAgICAgTUFfVEVMTCwgMCwgdGhpc19vYmplY3QoKSk7CisgIGVsc2UgaWYgKGludGVyYWN0aXZlKG9iKSAmJiAoaT1xdWVyeV9pZGxlKG9iKSk+PTYwMCkKKyAgeyAvL2FiIDEwIE1pbnMKKyAgICAgIGlmIChpPDM2MDApCisgICAgICAgIGF3YXk9dGltZTJzdHJpbmcoIiVtICVNIixpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgYXdheT10aW1lMnN0cmluZygiJWggJUggdW5kICVtICVNIixpKTsKKworICAgICAgX25vdGlmeShzcHJpbnRmKCIlcyBpc3Qgc2VpdCAlcyB2b2VsbGlnIHVudGFldGlnLiIsCisgICAgICAgICAgICAgIGNhcGl0YWxpemUoaXQpLGF3YXkpLAorICAgICAgICAgICAgICBNQV9URUxMKTsKKyAgICB9CisKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3RlaWxlKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyB3aG8sIG1lc3NhZ2U7CisgIGlmICghKHN0cj1fdW5wYXJzZWRfYXJncygpKSkgcmV0dXJuIDA7CisgIGlmIChzc2NhbmYoc3RyLCAiJXMgbWl0ICVzIiwgd2hvLCBtZXNzYWdlKSA9PSAyKQorICAgIHJldHVybiBfdGVsbCh3aG8sIG1lc3NhZ2UsMSk7CisgIHJldHVybiAwOworfQorc3RhdGljIGludCBfdGVpbGVfbWl0X2FsaWFzKHN0cmluZyBzdHIpCit7CisgIHN0ciA9IF91bnBhcnNlZF9hcmdzKCksIFRSSU1fTEVGVDsKKyAgaWYgKCFzdHIpIHJldHVybiAwOworICBzdHIgPSB0cmltKHN0ciwgVFJJTV9MRUZUKTsKKyAgLy8gWmllbCBtdXNzIG1pbi4gMiBCdWNoc3RhYmVuIGhhYmVuICguPG5yPikKKyAgaWYgKHNpemVvZihzdHIpIDwgNCkgcmV0dXJuIDA7CisgIGludCBwb3MgPSBzdHJzdHIoc3RyLCAiICIpOworICBpZiAocG9zID49IDIpCisgICAgcmV0dXJuIF90ZWxsKHN0clsuLnBvcy0xXSwgc3RyW3BvcysxLi5dKTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX2VyemFlaGxlKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyB3aG8sIG1lc3NhZ2U7CisKKyAgaWYgKCEoc3RyPV91bnBhcnNlZF9hcmdzKCkpKSByZXR1cm4gMDsKKyAgaWYgKHNzY2FuZihzdHIsICIlcyAlcyIsIHdobywgbWVzc2FnZSkgPT0gMikKKyAgICByZXR1cm4gX3RlbGwod2hvLCBtZXNzYWdlLDEpOworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfd2hpc3BlcihzdHJpbmcgc3RyKQoreworICBvYmplY3QgICAgb2I7CisgIHN0cmluZyAgICB3aG87CisgIHN0cmluZyAgICBtc2c7CisgIHN0cmluZyAgICBteW5hbWU7CisKKyAgaWYgKCEoc3RyPV91bnBhcnNlZF9hcmdzKCkpIHx8CisgICAgICAgKHNzY2FuZihzdHIsICIlcyB6dSAlcyIsIHdobywgbXNnKSAhPSAyICYmCisgICAgICAgIHNzY2FuZihzdHIsICIlcyAlcyIsIHdobywgbXNnKSAhPTIgKSkgeworICAgIF9ub3RpZnkoIldhcyB3aWxsc3QgRHUgd2VtIHp1Zmx1ZXN0ZXJuPyIsTUFfU0FZKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoIShvYiA9IHByZXNlbnQod2hvLCBlbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKSkpIHx8ICFsaXZpbmcob2IpKSB7CisgICAgX25vdGlmeShjYXBpdGFsaXplKHdobykrIiBpc3QgbmljaHQgaW4gZGllc2VtIFJhdW0uIixNQV9TQVkpOworICAgIHJldHVybiAxOworICB9CisKKyAgbXluYW1lID0gY2FwaXRhbGl6ZSgoKChJU19MRUFSTkVSKE1FKSAmJgorICAgICAgICFRdWVyeVByb3AoUF9JTlZJUykgJiYKKyAgICAgICAoUXVlcnlQcm9wKFBfQ0FOX0ZMQUdTKSAmIENBTl9QUkVTQVkpKT8KKyAgICAgIFF1ZXJ5UHJvcChQX1BSRVNBWSkgOiAiIikgKyBuYW1lKCkpIHx8ICIiKTsKKworICBfc2VuZChvYiwgcGVybXV0YXRlKG1zZyksIE1UX0xJU1RFTnxNU0dfRE9OVF9TVE9SRSwKKyAgICAgICAgTVNHX1NBWSwgbXluYW1lICsgIiBmbHVlc3RlcnQgRGlyIHp1OiAiKTsKKyAgc2VuZF9yb29tKGVudmlyb25tZW50KCksCisgICAgICAgICAgICBteW5hbWUgKyAiIGZsdWVzdGVydCAiICsgb2ItPm5hbWUoV0VNLCAxKSArICIgZXR3YXMgenUuIiwKKyAgICAgICAgICAgIE1UX0xJU1RFTnxNU0dfRE9OVF9TVE9SRSwgTUFfU0FZLCAwLCAoe3RoaXNfb2JqZWN0KCksb2J9KSk7CisKKyAgX3JlY3Yob2IsIG1zZywgTVNHRkxBR19XSElTUEVSLCAiRHUgZmx1ZXN0ZXJzdCAiICsgb2ItPm5hbWUoV0VNKSArICIgenU6ICIpOworCisKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3JlbW90ZV93aGlzcGVyKHN0cmluZyBzdHIpCit7CisgIC8qIFdpZSAndGVpbGUgbWl0JywgbnVyIG1pdCBNU0dGTEFHX1dISVNQRVIuIERhZHVyY2ggd2lyZCBkZXIgSW5oYWx0IGRlcgorICAgICBOYWNocmljaHQgbmljaHQgaW4gZGVyIHRlbGxfaGlzdG9yeSB2ZXJld2lndC4gKi8KKworICBvYmplY3QgICAgb2I7CisgIHN0cmluZyAgICB3aG8sIGl0OworICBzdHJpbmcgICAgbXNnOworICBzdHJpbmcgICAgbXluYW1lOworCisgIGlmICghKHN0cj1fdW5wYXJzZWRfYXJncygpKSB8fAorICAgICAgIChzc2NhbmYoc3RyLCAiJXMgenUgJXMiLCB3aG8sIG1zZykgIT0gMiAmJgorICAgICAgICBzc2NhbmYoc3RyLCAiJXMgJXMiLCB3aG8sIG1zZykgIT0yICkpIHsKKyAgICBfbm90aWZ5KCJXYXMgd2lsbHN0IER1IHdlbSBhdXMgZGVyIEZlcm5lIHp1Zmx1ZXN0ZXJuPyIsTUFfRU1PVEUpOworICAgIHJldHVybiAxOworICB9CisKKyAgaWYgKCFvYj1maW5kX3BsYXllcihpdCA9IGxvd2VyX2Nhc2Uod2hvKSkpCisgIHsKKyAgICBpdCA9IG1hdGNoX2xpdmluZyhpdCwgMCk7CisgICAgaWYgKCFzdHJpbmdwKGl0KSkKKyAgICAgIHN3aXRjaChpdCl7CisgICAgICBjYXNlIC0xOgorICAgICAgICBfbm90aWZ5KCJEYXMgd2FyIG5pY2h0IGVpbmRldXRpZyEiLE1BX0VNT1RFKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICBjYXNlIC0yOgorICAgICAgICBfbm90aWZ5KCJLZWluIHNvbGNoZXIgU3BpZWxlciEiLE1BX0VNT1RFKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgb2IgPSBmaW5kX3BsYXllcihpdCk7CisgICAgaWYoIW9iKSBvYiA9IGZpbmRfbGl2aW5nKGl0KTsKKyAgICBpZighb2IpeworICAgICAgX25vdGlmeSgiS2VpbiBzb2xjaGVyIFNwaWVsZXIhIixNQV9FTU9URSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKyAgaWYgKGVudmlyb25tZW50KG9iKSA9PSBlbnZpcm9ubWVudCgpKSB7CisgICAgX25vdGlmeSgiV2VubiBqZW1hbmQgbmViZW4gRGlyIHN0ZWh0LCBuaW1tIGZsdWVzdGVyLiIsTUFfRU1PVEUpOworICAgIHJldHVybiAxOworICB9CisKKyAgbXluYW1lID0gY2FwaXRhbGl6ZSgoKChJU19MRUFSTkVSKE1FKSAmJgorICAgICAgICFRdWVyeVByb3AoUF9JTlZJUykgJiYKKyAgICAgICAoUXVlcnlQcm9wKFBfQ0FOX0ZMQUdTKSAmIENBTl9QUkVTQVkpKT8KKyAgICAgIFF1ZXJ5UHJvcChQX1BSRVNBWSkgOiAiIikgKyBuYW1lKCkpIHx8ICIiKTsKKworICAvLyBBbiBFbXBmYWVuZ2VyIHNlbmRlbi4KKyAgX3NlbmQob2IsIHBlcm11dGF0ZShtc2cpLCBNVF9DT01NfE1UX0ZBUnxNU0dfRE9OVF9TVE9SRSwgTUFfRU1PVEUsCisgICAgICAgICBteW5hbWUgKyAiIGZsdWVzdGVydCBEaXIgYXVzIGRlciBGZXJuZSB6dTogIik7CisKKyAgLy8gd2VubiBFbXBmYWVuZ2VyIGludmlzIHVuZCB3aXIga2VpbiBNYWdpZXIgLCBnZ2YuIGZha2VmZWhsZXIgYXVzZ2ViZW4uCisgIGlmIChvYi0+UXVlcnlQcm9wKFBfSU5WSVMpICYmICFJU19MRUFSTkVSKHRoaXNfcGxheWVyKCkpKSB7CisgICAgX25vdGlmeSgiS2VpbiBzb2xjaGVyIFNwaWVsZXIhIixNQV9FTU9URSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgLy8gc29uc3QgZWlnZW5lIE1lbGR1bmcgdmlhIF9yZWN2KCkgYXVzZ2ViZW4uCisgIGVsc2UgCisgICAgX3JlY3Yob2IsIG1zZywgTVNHRkxBR19XSElTUEVSIHwgTVNHRkxBR19SRU1PVEUsCisgICAgICAgICJEdSBmbHVlc3RlcnN0ICIgKyBvYi0+bmFtZShXRU0pICsgIiBhdXMgZGVyIEZlcm5lIHp1OiAiKTsKKworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfY29udmVyc2Uoc3RyaW5nIGFyZykKK3sKKyAgX25vdGlmeSgiTWl0ICcqKicgd2lyZCBkYXMgR2VzcHJhZWNoIGJlZW5kZXQuIixNQV9TQVkpOworICBpZiAoc3RyaW5ncChhcmcpICYmIHN0cnN0cihhcmcsICItcyIpID09IDApCisgICAgaW5wdXRfdG8oIl9jb252ZXJzZV9tb3JlIiwgSU5QVVRfUFJPTVBULCAiXSIsIDEpOworICBlbHNlCisgICAgaW5wdXRfdG8oIl9jb252ZXJzZV9tb3JlIiwgSU5QVVRfUFJPTVBULCAiXSIsIDApOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfY29udmVyc2VfbW9yZShtaXhlZCBzdHIsIGludCBzaWxlbnQpCit7CisgIGlmIChzdHIgPT0gIioqIikgeworICAgIF9ub3RpZnkoIk9rLiIsTUFfU0FZKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmKHN0ciAhPSAiIikKKyAgICBfY29tbXVuaWNhdGUoc3RyLCBzaWxlbnQpOworCisgIGlucHV0X3RvKCJfY29udmVyc2VfbW9yZSIsIElOUFVUX1BST01QVCwgIl0iLCBzaWxlbnQpOworICByZXR1cm4gMTsKK30KKworcHJpdmF0ZSBpbnQgaXNfbGVhcm5lcihvYmplY3QgbykgeyByZXR1cm4gSVNfTEVBUk5FUihvKTsgfQorCitzdGF0aWMgaW50IF9zaG91dF90b193aXphcmRzKG1peGVkIHN0cikKK3sKKyAgaW50ICAgICBpLCBqOworICBzdHJpbmcgICAgbXluYW1lOworICBvYmplY3QgICAqdTsKKworICBzdHIgPSBfdW5wYXJzZWRfYXJncygpOworICBpZiAoIXN0cnx8IXNpemVvZihzdHIpKSB7CisgICAgX25vdGlmeSgiV2FzIHdpbGxzdCBEdSBkZW4gTWFnaWVybiB6dXJ1ZmVuPyIsTUFfU0hPVVQpOworICAgIHJldHVybiAxOworICB9CisgIC8vIEtvbnRyb2xsemVpY2hlbiByYXVzZmlsdGVybi4KKyAgc3RyID0gcmVncmVwbGFjZShzdHIsIltbOmNudHJsOl1dIiwiIixSRV9QQ1JFfFJFX0dMT0JBTCk7CisgIG15bmFtZSA9IGNhcGl0YWxpemUoZ2V0dWlkKHRoaXNfb2JqZWN0KCkpKTsKKyAgaWYgKCFJU19MRUFSTkVSKHRoaXNfb2JqZWN0KCkpKQorICAgIF9yZWN2KDAsIHN0ciwgTVNHRkxBR19NRUNITywgIkR1IHRlaWxzdCBhbGxlbiBNYWdpZXJuIG1pdDogIik7CisKKyAgLy8gbXJ1ZmUgaXN0IG5pY2h0IGlnbm9yaWVyYmFyLCBkYSBlcyBudXIgZnVlciBzY2h3ZXJlIFByb2JsZW1lIGdlZGFjaHQgaXN0LgorICBmaWx0ZXIodXNlcnMoKSwgIydpc19sZWFybmVyKS0+UmVjZWl2ZU1zZyhzdHIsCisgICAgICBNVF9DT01NfE1UX0ZBUnxNU0dfRE9OVF9JR05PUkV8TVNHX0RPTlRfU1RPUkUsCisgICAgICBNQV9TSE9VVCwgbXluYW1lKyIgYW4gYWxsZSBNYWdpZXI6ICIsIHRoaXNfb2JqZWN0KCkpOworCisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9lY2hvKHN0cmluZyBzdHIpIHsKKyAgaWYgKCFJU19TRUVSKE1FKSB8fCAoIUlTX0xFQVJORVIoTUUpCisgICAgICAgICYmICEoUXVlcnlQcm9wKFBfQ0FOX0ZMQUdTKSAmIENBTl9FQ0hPKSkpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKCEoc3RyPV91bnBhcnNlZF9hcmdzKCkpKSB7CisgICAgX25vdGlmeSgiV2FzIG1vZWNodGVzdCBEdSAnZWNob2VuJz8iLCAwKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGlmICghSVNfTEVBUk5FUih0aGlzX2ludGVyYWN0aXZlKCkpKQorICB7CisgICAgaWYgKFF1ZXJ5UHJvcChQX0dIT1NUKSkKKyAgICB7CisgICAgICBfbm90aWZ5X2ZhaWwoIk9obmUgS29lcnBlciBmZWhsdCBEaXIgZGF6dSBkaWUgbm9ldGlnZSBtYWdpc2NoZSBLcmFmdC5cbiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChRdWVyeVByb3AoUF9TUCk8RUNIT19DT1NUKQorICAgIHsKKyAgICAgIF9ub3RpZnlfZmFpbCgiRHUgbXVzc3QgZXJzdCB3aWVkZXIgbWFnaXNjaGUgS3JhZWZ0ZSBzYW1tZWxuLlxuIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgU2V0UHJvcChQX1NQLFF1ZXJ5UHJvcChQX1NQKS1FQ0hPX0NPU1QpOworICAgIHN0cj0iPlxiIitzdHI7CisgICAgbG9nX2ZpbGUoIkFSQ0gvRUNIT19TRUhFUiIsIHNwcmludGYoIiVzICVzOiAlc1xuIiwgZHRpbWUodGltZSgpKSwgZ2V0dWlkKCksCisgICAgICAgICAgIHN0cikpOworICB9CisgIC8vIEFuIGRlbiBSYXVtIHNlbmRlbi4gVHlwIGlzdCBNVF9DT01NLCBhYmVyIGRhcyBFY2hvIHNvbGwgd2VkZXIgaW4gZGVyCisgIC8vIEtvbW1oaXN0b3J5IG5vY2ggaW0gS29ib2xkIGxhbmRlbi4KKyAgc2VuZF9yb29tKGVudmlyb25tZW50KE1FKSwgc3RyLCBNVF9DT01NfE1TR19ET05UX1NUT1JFfE1TR19ET05UX0JVRkZFUiwKKyAgICAgICAgICAgIE1BX1VOS05PV04sIDAsIDApOworICByZXR1cm4gMTsKK30KKworLy8gRGllbnQgYWxzIFZlcnRlaWRpZ3VuZyBnZWdlbiBMZXV0ZSwgZGllIGVoZXIgdW5iZWRhY2h0IHJlaW5zY2hyZWliZW4sIG5pY2h0CisvLyBnZWdlbiBMZXV0ZSwgZGllIGRhIGFic2ljaHRsaWNoIHJlaW5zY2hyZWliZW4uIERpZSB3ZXJkZW4gZ2V0ZWVydAorLy8gdW5kIGdlZmVkZXJ0Lgorc3RhdGljIHN0cmluZyAqX3NldF9pZ25vcmUobWl4ZWQgYXJnKQoreworICByYWlzZV9lcnJvcigiRGlyZWt0ZXMgU2V0emVuIHZvbiBQX0lHTk9SRSBpc3QgbmljaHQgZXJsYXVidC4gIgorICAgICAgIkJlbnV0emUgQWRkSWdub3JlL1JlbW92ZUlnbm9yZSgpIVxuIik7Cit9CisvLyBLb21wYXRpYmlsdGFldCB6dW0gYWx0ZW4gSWdub3JlOiBBcnJheSB2b24gSW5kaWNlcyBsaWVmZXJuLiBBZW5kZXJ0IGFiZXIKKy8vIG5peCBkcmFuLCBkYXNzIGFsbGUgVGVzdElnbm9yZSgpICYgQ28gYmVudXR6ZW4gc29sbGVuLgorc3RhdGljIHN0cmluZyAqX3F1ZXJ5X2lnbm9yZSgpIHsKKyAgbWl4ZWQgaWduPVF1ZXJ5KFBfSUdOT1JFLCBGX1ZBTFVFKTsKKyAgaWYgKG1hcHBpbmdwKGlnbikpCisgICAgcmV0dXJuIG1faW5kaWNlcyhpZ24pOworICByZXR1cm4gKHt9KTsKK30KKworcHVibGljIGludCBBZGRJZ25vcmUoc3RyaW5nIGlnbikgeworICAvLyBFaW5pZ2Ugc3RyaW5ncyBzaW5kIG5pY2h0IGVybGF1YnQsIHouQi4ga29uc2VrdXRpdmUgLgorICBpZiAoIXNpemVvZihpZ24pCisgICAgICB8fCByZWdtYXRjaChpZ24sIlsuXXsyLH0iLFJFX1BDUkUpCisgICAgICB8fCByZWdtYXRjaChpZ24sIiAiLFJFX1BDUkUpCisgICAgICB8fCBzaXplb2YoZXhwbG9kZShpZ24sIi4iKSk+MykKKyAgICByZXR1cm4gMDsKKworICBtYXBwaW5nIGlnbm9yZXM9UXVlcnkoUF9JR05PUkUsIEZfVkFMVUUpOworICBpZ25vcmVzW2lnbl09dGltZSgpOworICAvLyBrZWluIFNldCgpIG5vZXRpZy4KKyAgcmV0dXJuIDE7Cit9CisKK3B1YmxpYyBpbnQgUmVtb3ZlSWdub3JlKHN0cmluZyBpZ24pCit7CisgIG1hcHBpbmcgaWdub3Jlcz1RdWVyeShQX0lHTk9SRSxGX1ZBTFVFKTsKKyAgbV9kZWxldGUoaWdub3JlcyxpZ24pOworICAvLyBLZWluIFNldCgpIG5vZXRpZworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfcXVlcnlfaW50ZXJtdWQoKQoreworICBtaXhlZCB0bXA7CisgIHJldHVybiBtZW1iZXIocG9pbnRlcnAodG1wPVF1ZXJ5KFBfQ0hBTk5FTFMpKT90bXA6KHt9KSwgIkludGVybXVkIikgPiAtMTsKK30KKworCitpbnQgZXJ3aWRlcmUoc3RyaW5nIHN0cikKK3sKKyAgc3RyPV91bnBhcnNlZF9hcmdzKCk7CisgIGlmICghc3RyKSByZXR1cm4gMDsKKyAgcmV0dXJuIF90ZWxsKEVSV0lERVJfUEFSQU0sIHN0ciAsMSk7Cit9CisKK3N0YXRpYyBpbnQgdG1oaXN0KHN0cmluZyBzdHIpCit7CisKKyAgaWYgKHN0ciA9PSAiYXVzIikgeworICAgIHRlbGxfaGlzdG9yeV9lbmFibGVkID0gVEVMTEhJU1RfRElTQUJMRUQ7CisgICAgd3JpdGUoIk9rLCBlcyB3aXJkIG5pY2h0cyBtZWhyIGdlc3BlaWNoZXJ0LlxuIik7CisgICAgaWYgKHNpemVvZih0ZWxsX2hpc3RvcnkpKSB7CisgICAgICB0ZWxsX2hpc3RvcnkgPSAoW10pOworICAgICAgY29tbXJlY2VpdmVycyA9ICh7fSk7CisgICAgICB3cml0ZSgiRGVpbmUgTWl0dGVpbHVuZ3NnZXNjaGljaHRlIHd1cmRlIGdlbG9lc2NodC5cbiIpOworICAgIH0KKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGlmIChzdHIgPT0gIm5hbWVuIikgeworICAgIGludCBmbGFnOworICAgIHRlbGxfaGlzdG9yeV9lbmFibGVkID0gVEVMTEhJU1RfTk9fTUVTU0FHRTsKKyAgICB3cml0ZSgiT2ssIGRpZSBOYW1lbiB6dWt1ZW5mdGlnZXIgR2VzcHJhZWNoc3BhcnRuZXIgd2VyZGVuIGdlc3BlaWNoZXJ0LlxuIik7CisgICAgZm9yZWFjaCAoc3RyaW5nIHVpZCwgc3RydWN0IGNoYXRfcyBjaGF0OiB0ZWxsX2hpc3RvcnkpCisgICAgICBpZiAocG9pbnRlcnAoY2hhdC0+bXNnYnVmKSkgeworICAgICAgICBjaGF0LT5tc2didWYgPSAwOworICAgICAgICBjaGF0LT5wdHIgPSAwOworICAgICAgICBmbGFnID0gMTsKKyAgICAgIH0KKyAgICBpZiAoZmxhZykKKyAgICAgIHdyaXRlKCJEZXIgSW5oYWx0IERlaW5lciBNaXR0ZWlsdW5nZW4gd3VyZGUgZ2Vsb2VzY2h0LlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBpZiAoc3RyID09ICJlaW4iIHx8IHN0ciA9PSAiYW4iKSB7CisgICAgdGVsbF9oaXN0b3J5X2VuYWJsZWQgPSBURUxMSElTVF9FTkFCTEVEOworICAgIHdyaXRlKCJPaywgenVrdWVuZnRpZ2UgTWl0dGVpbHVuZ2VuIHdlcmRlbiBnZXNwZWljaGVydC5cbiIpOworICAgIHJldHVybiAxOworICB9CisKKyNpZmRlZiBURUxMSElTVF9MT05HTElGRQorICBpZiAoc3RyID09ICJsYW5nbGViaWciKSB7CisgICAgdGVsbF9oaXN0b3J5X2VuYWJsZWQgPSBURUxMSElTVF9MT05HTElGRTsKKyAgICB3cml0ZSgiT2ssIHp1a3VlbmZ0aWdlIE1pdHRlaWx1bmdlbiB3ZXJkZW4gamV3ZWlscyBiaXMgenVtIG5hZWNoc3RlbiAiCisgICAgICAgICAgIkVuZGUvQ3Jhc2gvXG5SZWJvb3QgZ2VzcGVpY2hlcnQuXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorI2VuZGlmCisKKyAgaWYgKHN0ciA9PSAic3RhdHVzIikgeworICAgIHN3aXRjaCAodGVsbF9oaXN0b3J5X2VuYWJsZWQpIHsKKyAgICAgIGNhc2UgVEVMTEhJU1RfRElTQUJMRUQ6CisgICAgICAgIHdyaXRlKCJEaWUgTmFtZW4gRGVpbmVyIEdlc3ByYWVjaHNwYXJ0bmVyIHdlcmRlbiBuaWNodCBnZXNwZWljaGVydC5cbiIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVEVMTEhJU1RfTk9fTUVTU0FHRToKKyAgICAgICAgd3JpdGUoIkRpZSBOYW1lbiBEZWluZXIgR2VzcHJhZWNoc3BhcnRuZXIgd2VyZGVuIGdlc3BlaWNoZXJ0LlxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBURUxMSElTVF9FTkFCTEVEOgorICAgICAgICB3cml0ZSgiRGVpbmUgTWl0dGVpbHVuZ2VuIHdlcmRlbiBnZXNwZWljaGVydC5cbiIpOworICAgICAgICBicmVhazsKKyNpZmRlZiBURUxMSElTVF9MT05HTElGRQorICAgICAgY2FzZSBURUxMSElTVF9MT05HTElGRToKKyAgICAgICAgd3JpdGUoIkRlaW5lIE1pdHRlaWx1bmdlbiB3ZXJkZW4gamV3ZWlscyBiaXMgenVtIG5hZWNoc3RlbiBFbmRlLyIKKyAgICAgICAgICAgICAgIkNyYXNoL1JlYm9vdFxuZ2VzcGVpY2hlcnQuXG4iKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICB9CisgICAgcmV0dXJuIDE7CisgIH0KKworICBpZiAodGVsbF9oaXN0b3J5X2VuYWJsZWQgPT0gVEVMTEhJU1RfRElTQUJMRUQpIHsKKyAgICBfbm90aWZ5X2ZhaWwoIkRlaW5lIEdlc3ByYWVjaHNwYXJ0bmVyIHdlcmRlbiBuaWNodCBnZXNwZWljaGVydC5cbiIpOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKCFzaXplb2YodGVsbF9oaXN0b3J5KSkgeworICAgIF9ub3RpZnlfZmFpbCgiRHUgaGFzdCBub2NoIGtlaW5lbSBldHdhcyBtaXRnZXRlaWx0ICIKKyAgICAgICAgICAgICAgICAgInVuZCBub2NoIGtlaW5lIE1pdHRlaWx1bmdlbiBlcmhhbHRlbi5cbiIpOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKHN0ciAmJiBzaXplb2Yoc3RyKSkgeworCisgICAgaWYgKHRlbGxfaGlzdG9yeV9lbmFibGVkIDwgVEVMTEhJU1RfRU5BQkxFRCkgeworICAgICAgX25vdGlmeV9mYWlsKCJEZXIgSW5oYWx0IERlaW5lciBNaXR0ZWlsdW5nZW4gd2lyZCBuaWNodCBnZXNwZWljaGVydC5cbiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgc3RyaW5nIHVpZDsKKyAgICBpZiAobWVtYmVyKHRlbGxfaGlzdG9yeSwgc3RyKSkgeworICAgICAgLy8gTmFtZSBnZXd1ZW5zY2h0LCBkYSBkZXIgU3RyaW5nIGluIGRlciBIaXN0b3J5IHZvcmtvbW10LgorICAgICAgdWlkID0gc3RyOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIC8vIGV2dGwuIG5lIFphaGwgYW5nZWdlYmVuLgorICAgICAgaW50IGk7CisgICAgICBzdHJpbmcgKnBhcnRuZXJzID0gc29ydGVkX2NvbW1wYXJ0bmVycygwKTsKKyAgICAgIGlmICgoaSA9IHRvX2ludChzdHIpIC0gMSkgPj0gMCAmJiBpIDwgc2l6ZW9mKHBhcnRuZXJzKSkKKyAgICAgICAgdWlkID0gcGFydG5lcnNbaV07CisgICAgICBlbHNlIHsKKyAgICAgICAgbm90aWZ5X2ZhaWwoIk1pdCBzbyB2aWVsZW4gTGV1dGVuIGhhc3QgRHUgbmljaHQgZ2VzcHJvY2hlbiFcbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBtaXhlZCAqZGF0YSA9IHRlbGxfaGlzdG9yeVt1aWRdLT5tc2didWY7CisgICAgaWYgKCFkYXRhKSB7CisgICAgICBfbm90aWZ5X2ZhaWwoCisgICAgICAgICJEZXIgSW5oYWx0IGRpZXNlciBNaXR0ZWlsdW5nIGlzdCBuaWNodCAobWVocikgZ2VzcGVpY2hlcnQuXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGludCBwdHIgPSB0ZWxsX2hpc3RvcnlbdWlkXS0+cHRyOworCisgICAgTW9yZShzcHJpbnRmKCIlQHMiLCBtYXAoZGF0YVtwdHIuLk1BWF9TQVZFRF9NRVNTQUdFUy0xXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhWzAuLnB0ci0xXSwKKyAgICAgICAgIGZ1bmN0aW9uIHN0cmluZyAoc3RydWN0IHN0b3JlZF9tc2dfcyBtc2cpIHsKKyAgICAgICAgICAgICBpZiAoIXN0cnVjdHAobXNnKSkgcmV0dXJuICIiOworICAgICAgICAgICAgICAgcmV0dXJuIGJyZWFrX3N0cmluZyggbXNnLT5tc2cgKyAiIDwiCisgICAgICAgICAgICAgICAgICsgc3RyZnRpbWUoIiVIOiVNOiVTIixtc2ctPnRpbWVzdGFtcCkgKyAiPiIsIDc4LAorICAgICAgICAgICAgICAgICBtc2ctPnByZWZpeCB8fCAiIiwgbXNnLT5wcmVmaXggPyBCU19MRUFWRV9NWV9MRlMgOiAwKTsKKyAgICAgICAgIH0gKSApICk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBzdHJpbmcgaGlzdG9yeSA9ICJGb2xnZW5kZSBHZXNwcmFlY2hlIGhhc3QgRHUgYmVyZWl0cyBnZWZ1ZWhydDpcbiI7CisgIGludCBpOworICBmb3JlYWNoIChzdHJpbmcgdWlkIDogc29ydGVkX2NvbW1wYXJ0bmVycygwKSApIHsKKyAgICBpbnQgajsKKyAgICBzdHJ1Y3QgY2hhdF9zIGNoYXQgPSB0ZWxsX2hpc3RvcnlbdWlkXTsKKyAgICBoaXN0b3J5ICs9IHNwcmludGYoIiUyZC4lLTRzICVzICAlLTExcyAgJWQgZ2VzZW5kZXQvJWQgZW1wZmFuZ2VuXG4iLCArK2ksCisgICAgICAoKGo9bWVtYmVyKGNvbW1yZWNlaXZlcnMsdWlkKSk+LTEgPyBzcHJpbnRmKCIvJTJkLiIsaisxKSA6ICIiKSwKKyAgICAgIHN0cmZ0aW1lKCIlYSwgJWUuJW0uJXkiLGNoYXQtPnRpbWVfbGFzdF9tc2cpLAorICAgICAgY2FwaXRhbGl6ZShjaGF0LT51aWQpLCBjaGF0LT5zZW50Y291bnQsIGNoYXQtPnJlY3Zjb3VudCk7CisgIH0KKworICBNb3JlKGhpc3RvcnkpOworCisgIHJldHVybiAxOworfQorCitzdGF0aWMgbWl4ZWQgX3F1ZXJ5X2xvY2FsY21kcygpCit7CisgIHJldHVybiAoeworICAgICh7ImtvYm9sZCIsICJjbWRfa29ib2xkIiwwLDB9KSwKKyAgICAgKHsic2FnIiwiX2NvbW11bmljYXRlIiwwLDB9KSwKKyAgICAgKHsic2FnZSIsIl9jb21tdW5pY2F0ZSIsMCwwfSksCisgICAgICh7IiciLCJfY29tbXVuaWNhdGUiLDEsMH0pLAorICAgICAoeyJtcnVmIiwiX3Nob3V0X3RvX3dpemFyZHMiLDAsMH0pLAorICAgICAoeyJtcnVmZSIsIl9zaG91dF90b193aXphcmRzIiwwLDB9KSwKKyAgICAgKHsicnVmIiwiX3Nob3V0X3RvX2FsbCIsMCwwfSksCisgICAgICh7InJ1ZmUiLCJfc2hvdXRfdG9fYWxsIiwwLDB9KSwKKyAgICAgKHsiZXJ6YWVobCIsIl9lcnphZWhsZSIsMCwwfSksCisgICAgICh7ImVyemFlaGxlIiwiX2VyemFlaGxlIiwwLDB9KSwKKyAgICAgKHsidGVpbCIsIl90ZWlsZSIsMCwwfSksCisgICAgICh7InRlaWxlIiwiX3RlaWxlIiwwLDB9KSwKKyAgICAgKHsidG0iLCJfdGVpbGVfbWl0X2FsaWFzIiwwLDB9KSwKKyAgICAgKHsiZmx1ZXN0ZXIiLCJfd2hpc3BlciIsMCwwfSksCisgICAgICh7ImZsdWVzdGVyZSIsIl93aGlzcGVyIiwwLDB9KSwKKyAgICAgKHsicmZsdWVzdGVyIiwiX3JlbW90ZV93aGlzcGVyIiwwLDB9KSwKKyAgICAgKHsicmZsdWVzdGVyZSIsIl9yZW1vdGVfd2hpc3BlciIsMCwwfSksCisgICAgICh7Imdlc3ByYWVjaCIsIl9jb252ZXJzZSIsMCwwfSksCisgICAgICh7ImVjaG8iLCJfZWNobyIsMCwwfSksCisgICAgICh7Imlnbm9yaWVyIiwiaWdub3JpZXJlIiwwLDB9KSwKKyAgICAgKHsiaWdub3JpZXJlIiwiaWdub3JpZXJlIiwwLDB9KSwKKyAgICAgKHsidG1oaXN0IiwidG1oaXN0IiwwLDB9KSwKKyAgICAgKHsiZXJ3aWRlciIsImVyd2lkZXJlIiwwLDB9KSwKKyAgICAgKHsiZXJ3aWRlcmUiLCJlcndpZGVyZSIsMCwwfSksCisgICAgICh7ImtsaW5nZWx0b24iLCJfbXNnX2JlZXAiLDAsMH0pLAorICAgICAoeyJzZW5kZXJ3aWVkZXJob2x1bmciLCJfbXNnX3ByZXBlbmQiLDAsMH0pLAorICAgICAoeyJyZXBvcnQiLCJzZXRfcmVwb3J0IiwwLDB9KSwKKyAgICB9KStjaGFubmVsOjpfcXVlcnlfbG9jYWxjbWRzKCk7Cit9CisKK3ByaXZhdGUgc3RyaW5nICpzb3J0ZWRfY29tbXBhcnRuZXJzKGludCByZXZlcnNlZCkgeworICByZXR1cm4gc29ydF9hcnJheShtX2luZGljZXModGVsbF9oaXN0b3J5KSwKKyAgICAgIGZ1bmN0aW9uIGludCAoc3RyaW5nIHVpZDEsIHN0cmluZyB1aWQyKSB7CisgICAgICAgICAgaWYgKHJldmVyc2VkKQorICAgICAgICAgICAgcmV0dXJuIHRlbGxfaGlzdG9yeVt1aWQxXS0+dGltZV9sYXN0X21zZyA+CisgICAgICAgICAgICAgICAgICAgdGVsbF9oaXN0b3J5W3VpZDJdLT50aW1lX2xhc3RfbXNnOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiB0ZWxsX2hpc3RvcnlbdWlkMV0tPnRpbWVfbGFzdF9tc2cgPD0KKyAgICAgICAgICAgICAgICAgICB0ZWxsX2hpc3RvcnlbdWlkMl0tPnRpbWVfbGFzdF9tc2c7CisgICAgICB9ICk7Cit9CisKKy8vIEVpZ2VudGxpY2ggbnVyIGluIE1hZ2llcm9iamVrdGVuIGdlcnVmZW4uIEdlaG9lcnQgYWJlciB0aGVtYXRpc2NoIGhpZXIKKy8vIGlyZ2VuZHdpZSBoaW4uCitzdGF0aWMgdm9pZCBtb2RpZnlfcHJvbXB0KCkgeworICAgIHN0cmluZyB0ZXh0ID0gUXVlcnkoUF9QUk9NUFQsIEZfVkFMVUUpOworCisgICAgaWYgKCAhc3RyaW5ncCh0ZXh0KSB8fCAhc2l6ZW9mKHRleHQpICkKKyAgICAgICAgdGV4dCA9ICI+ICI7CisgICAgZWxzZSB7CisgICAgICAgIHN0cmluZyBwYXRoID0gUXVlcnkoUF9DVVJSRU5URElSLCBGX1ZBTFVFKTsKKyAgICAgICAgaWYgKHN0cmluZ3AocGF0aCkgJiYgc2l6ZW9mKHBhdGgpKQorICAgICAgICAgIHRleHQgPSByZWdyZXBsYWNlKHRleHQsIlxcdyIscGF0aCwwKTsgLy8gUGZhZCBlaW5zZXR6ZW4KKyAgICB9CisgICAgY29uZmlndXJlX2ludGVyYWN0aXZlKHRoaXNfb2JqZWN0KCksIElDX1BST01QVCwgdGV4dCk7Cit9CisKKy8vIFBydWVmdCBhdWYgSW5nb3JpZXJlZWludHJhZWdlLgorLy8gUnVlY2tnYWJlOiAwIChuaWNodCBpZ25vcmllcnQpIG9kZXIgTVNHX0lHTk9SRUQKKyNpZmRlZiBfX0xQQ19VTklPTlNfXworcHVibGljIGludCBUZXN0SWdub3JlKHN0cmluZ3xzdHJpbmcqIHNyY25hbWVzKQorI2Vsc2UKK3B1YmxpYyBpbnQgVGVzdElnbm9yZShtaXhlZCBzcmNuYW1lcykKKyNlbmRpZgoreworICBtYXBwaW5nIGlnbiA9IFF1ZXJ5KFBfSUdOT1JFLCBGX1ZBTFVFKTsKKyAgaWYgKHN0cmluZ3Aoc3JjbmFtZXMpKQorICAgIHNyY25hbWVzID0gKHtzcmNuYW1lc30pOworCisgIGZvcmVhY2goc3RyaW5nIHNyY25hbWU6IHNyY25hbWVzKQorICB7CisgICAgLy8gZWluZmFjaHN0ZXIgRmFsbCwgZXhha3RlciBNYXRjaAorICAgIGlmIChtZW1iZXIoaWduLCBzcmNuYW1lKSkKKyAgICAgIHJldHVybiBNU0dfSUdOT1JFRDsKKyAgICAvLyBhbnNvbnN0ZW4gbXVzcyBhdWZnZXRyZW5udCB3ZXJkZW4uCisgICAgaWYgKHN0cnN0cihzcmNuYW1lLCIuIikgPiAtMSkKKyAgICB7CisgICAgICBzdHJpbmcgKnNyY3BhcnRzPWV4cGxvZGUoc3JjbmFtZSwiLiIpOworICAgICAgc3dpdGNoKHNpemVvZihzcmNwYXJ0cykpCisgICAgICB7CisgICAgICAgIC8vIGNhc2UgMCB1bmQgMSBrYW5uIG5pY2h0IHBhc3NpZXJlbi4KKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgIC8vIHp1IHBydWVmZW46IFtzZW5kZXJdLmFrdGlvbi5xdWFsaWZpemllcmVyLgorICAgICAgICAgIC8vIERlciBGYWxsLCBkYXNzIGRlciBTcGllbGVyIGRpZXMgX2dlbmF1XyBfc29fIGlnbm9yaWVydCBoYXQsIHdpcmQKKyAgICAgICAgICAvLyBvYmVuIHNjaG9uIGdlcHJ1ZWZ0LiBpbSBTcGllbGVyIGdlcHJ1ZWZ0IHdlcmRlbiBtdXNzIG5vY2g6CisgICAgICAgICAgLy8gc3BpZWxlciwgLmFrdGlvbiwgc3BpZWxlci5ha3Rpb24gdW5kIC5ha3Rpb24ucXVhbGlmaXppZXJlcgorICAgICAgICAgIGlmICggKHNpemVvZihzcmNwYXJ0c1swXSkgJiYgbWVtYmVyKGlnbixzcmNwYXJ0c1swXSkpIC8vIHNwaWVsZXIKKyAgICAgICAgICAgICAgfHwgbWVtYmVyKGlnbiwgIi4iK3NyY3BhcnRzWzFdKSAgICAgIC8vIC5ha3Rpb24KKyAgICAgICAgICAgICAgfHwgbWVtYmVyKGlnbiwgc3JjcGFydHNbMF0rIi4iK3NyY3BhcnRzWzFdKSAvLyBbc3BpZWxlcl0uYWt0aW9uCisgICAgICAgICAgICAgIHx8IG1lbWJlcihpZ24sICIuIitzcmNwYXJ0c1sxXSsiLiIrc3JjcGFydHNbMl0pIC8vIC5ha3QucXVhbAorICAgICAgICAgICAgICkKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTVNHX0lHTk9SRUQ7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgLy8genUgcHJ1ZWZlbjogc3BpZWxlci5ha3Rpb24KKyAgICAgICAgICAvLyBEZXIgRmFsbCwgZGFzcyBkZXIgU3BpZWxlciBkYXMgX2dlbmF1XyBfc29fIGVpbmdlZ2ViZW4gaGF0LCBpc3QKKyAgICAgICAgICAvLyBvYmVuIHNjaG9uIGdlcHJ1ZWZ0LiBJbSBTcGllbGVyIHp1IHBydWVmZW4gaXN0IG5vY2g6CisgICAgICAgICAgLy8gc3BpZWxlciB1bmQgLmFrdGlvbgorICAgICAgICAgIGlmICgoc2l6ZW9mKHNyY3BhcnRzWzBdKSAmJiBtZW1iZXIoaWduLHNyY3BhcnRzWzBdKSkKKyAgICAgICAgICAgICAgfHwgbWVtYmVyKGlnbiwgIi4iK3NyY3BhcnRzWzFdKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTVNHX0lHTk9SRUQ7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAvLyBtZWhyIGFscyAzIFRlaWxlLi4uCisgICAgICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiVGVzdElnbm9yZUV4dCgpOiB0b28gbWFueSBxdWFsaWZpZXJzLCBvbmx5IDEgIgorICAgICAgICAgICAgICAgICJpcyBzdXBwb3J0ZWQuIEdvdDogJXNcbiIsc3JjbmFtZSkpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICAvLyBEZWZhdWx0OiBuaWNodCBpZ25vcmllcmVuLgorICByZXR1cm4gMDsKK30KKworI2lmZGVmIF9fTFBDX1VOSU9OU19fCitwdWJsaWMgaW50IFRlc3RJZ25vcmVFeHQoc3RyaW5nfHN0cmluZyogc3JjbmFtZXMpCisjZWxzZQorcHVibGljIGludCBUZXN0SWdub3JlRXh0KG1peGVkIHNyY25hbWVzKQorI2VuZGlmCit7CisgIHJldHVybiBUZXN0SWdub3JlKHNyY25hbWVzKTsKK30KKworLy8gUHJ1ZWZ0IGZ1ZXIgUmVjZWl2ZU1zZygpIGF1ZiBJbmdvcmllcmVlaW50cmFlZ2UuIElnbm9yaWVydCBhYmVyIG5pY2h0IGFsbGUKKy8vIFR5cGVuLiAKKy8vIFJ1ZWNrZ2FiZTogMCBvZGVyIE1TR19JR05PUkVEIHwgTVNHX1ZFUkJfSUdOIHwgTVNHX01VRF9JR04KK3ByaXZhdGUgaW50IGNoZWNrX2lnbm9yZXMoc3RyaW5nIG1zZywgaW50IG1zZ190eXBlLCBzdHJpbmcgbXNnX2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbXNnX3ByZWZpeCwgb2JqZWN0IG9yaWdpbikKK3sKKyAgLy8gRWluaWdlIERpbmdlIGxhc3NlbiBzaWNoIG5pY2h0IGlnbm9yaWVyZW4uCisgIGlmIChtc2dfdHlwZSAmIChNVF9ORVdTfE1UX05PVElGSUNBVElPTikpCisgICAgcmV0dXJuIDA7CisgIC8vIGFsbGVzIGFuZGVyZSBnZWh0IHp1ciB6ZWl0IGVyc3RtYWwsIHdlbm4gb3JpZ2luIGJla2FubnQgVU5EIE5JQ0hUIGRhcworICAvLyBlaWdlbmUgT2JqZWt0IGlzdC4gV2FlciBnZ2YuIHNvbnN0IGRvb2YuIEF1c3NlcmRlbSBtdXNzIGVzIG5hdHVlcmxpY2gKKyAgLy8gZWluZSBpZ25vcmllcmJhcmUgbXNnX2FjdGlvbiBnZWJlbi4KKyAgZWxzZSBpZiAoc3RyaW5ncChtc2dfYWN0aW9uKSAmJiBvcmlnaW4gJiYgb3JpZ2luICE9IE1FKQorICB7CisgICAgc3RyaW5nIHNyY25hbWUgPQorICAgICAgKHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob3JpZ2luKSA/IG9yaWdpbi0+cXVlcnlfcmVhbF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBvcmlnaW4tPm5hbWUoV0VSKSB8fCAiIik7CisgICAgbWFwcGluZyBpZ24gPSBRdWVyeShQX0lHTk9SRSwgRl9WQUxVRSk7CisKKyAgICBpZiAobWVtYmVyKGlnbiwgc3JjbmFtZSkpCisgICAgICByZXR1cm4gTVNHX0lHTk9SRUQ7CisgICAgLy8gdmllbGxlaWNodCB3aXJkIGlyZ2VuZHdhcyBhIGxhIG5hbWUuYWt0aW9uIGlnbm9yaWVydD8KKyAgICAvLyBkaWVzIGlnbm9yaWVydCBhdWNoIHNwaWVsZXIuZWJlbmVuLjxlYmVuZT4gKHMuIG1zZ19hY3Rpb24gYmVpCisgICAgLy8gRWJlbmVubWVsZHVuZ2VuKQorICAgIGlmIChtZW1iZXIoaWduLCBzcmNuYW1lKyIuIittc2dfYWN0aW9uKSkKKyAgICAgIHJldHVybiBNU0dfVkVSQl9JR047CisgICAgLy8gT2RlciBkaWUgQWt0aW9uIGtvbXBsZXR0PyBEaWVzIGlnbm9yaWVydCBhdWNoIC5lYmVuZW4uPGViZW5lPiwgb2J3b2hsCisgICAgLy8gZGFzIHJlaWNobGljaCBzaW5uZnJlaSBpc3QuCisgICAgaWYgKG1lbWJlcihpZ24sICIuIittc2dfYWN0aW9uKSkKKyAgICAgIHJldHVybiBNU0dfVkVSQl9JR047CisgICAgLy8gU3BpZWxlciBhdWYgRWJlbmVuIGlnbm9yaWVydD8KKyAgICAvLyBtc2dfYWN0aW9uIGlzdCBoaWVyIG5hY2ggZGllc2VtIE11c3RlcjogTUFfQ0hBTk5FTC48ZWJlbmU+CisgICAgaWYgKHN0cnN0cihtc2dfYWN0aW9uLCBNQV9DSEFOTkVMKSA9PSAwKQorICAgIHsKKyAgICAgIC8vIHNwaWVsZXIuZWJlbmVuPyAoc3BpZWxlci5lYmVuZW4uPGViZW5lPiBvYmVuIHNjaG9uIGdlcHJ1ZWZ0KQorICAgICAgaWYgKG1lbWJlcihpZ24sIHNyY25hbWUgKyAiLiJNQV9DSEFOTkVMKSkKKyAgICAgICAgcmV0dXJuIE1TR19JR05PUkVEOworICAgICAgLy8gc3BpZWxlci5lYmVuZW4uZWJlbmVubmFtZSBpc3Qgb2JlbiBzY2hvbiBhYmdlZGVja3QuCisgICAgICAvLyAuZWJlbmVuIGhhbHRlIGljaCBmdWVyIHNpbm5mcmVpLCBuaWNodCBnZXBydWVmdC4KKyAgICB9CisgICAgLy8gU3BpZWxlciBhdXMgYW5kZXJlbSBtdWQ/ICpzZXVmeioKKyAgICBpZiAoc3Ryc3RyKHNyY25hbWUsIkAiKSA+IC0xKQorICAgIHsKKyAgICAgIHN0cmluZyAqc3JjcGFydHMgPSBleHBsb2RlKHNyY25hbWUsIkAiKTsKKyAgICAgIGlmIChzaXplb2Yoc3JjcGFydHMpPT0yKQorICAgICAgeworICAgICAgICAvLyBzcGllbGVyQD8KKyAgICAgICAgaWYgKG1lbWJlcihpZ24sIHNyY3BhcnRzWzBdKyJAIikpCisgICAgICAgICAgcmV0dXJuIE1TR19JR05PUkVEOworICAgICAgICAvLyBvZGVyIE11ZCBwZXIgQG11ZD8KKyAgICAgICAgaWYgKG1lbWJlcihpZ24sICJAIiArIHNyY3BhcnRzWzFdKSkKKyAgICAgICAgICByZXR1cm4gTVNHX01VRF9JR047CisgICAgICAgIC8vIEJUVzogc3BpZWxlckBtdWQgd3VyZGUgc2Nob24gZ2FueiBvYmVuIGVyZmFzc3QuCisgICAgICB9CisgICAgfQorICB9CisgIC8vIERlZmF1bHQ6IG5pY2h0IGlnbm9yaWVyZW4uCisgIHJldHVybiAwOworfQorCisvLyBXaXJkIGRpZSBuYWNocmljaHQgd2Focmdlbm9tbWVuPyBEaWUgUHJ1ZWZ1bmcgZXJmb2xndCBhdWZncnVuZCB2b24KKy8vIG1zZ190eXBlLiBadXIgd2lyZCBNVF9MT09LIHVuZCBNVF9MSVNURU4gYmVydWVja3NpY2h0aWd0IChQcnVlZnVuZyBhdWYKKy8vIEJMaW5kaGVpdC9UYXViaGVpdCkuCisvLyBXaWNodGlnOiBlbnRoYWVsdCBtc2dfYWN0aW9uIHdlZGVyIE1UX0xPT0sgbm9jaCBNVF9MSVNURU4sIHdpcmQgZGllCisvLyBOYWNocmljaHQgd2Focmdlbm9tbWVuLCBkYSBkYXZvbiBhdXNnZWdhbmdlbiB3aXJkLCBkYXNzIHNpZSBtaXQgZGVuIGJlaWRlbgorLy8gU2lubiBnYXIgbml4IHp1IHR1biBoYXQuCisvLyBSdWVja2dhYmU6IDAgb2RlciBNU0dfU0VOU0VfQkxPQ0sKK3ByaXZhdGUgaW50IGNoZWNrX3NlbnNlcyhzdHJpbmcgbXNnLCBpbnQgbXNnX3R5cGUsIHN0cmluZyBtc2dfYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1zZ19wcmVmaXgsIG9iamVjdCBvcmlnaW4pCit7CisgIGludCBzZW5zZXMgPSBtc2dfdHlwZSAmIChNVF9MT09LfE1UX0xJU1RFTik7CisgIC8vIFdlbm4gdm9uIHZvcmhlcmVpbiBrZWluIFNpbm4gYW5nZXNwcm9jaGVuLCBkYW5uIGlzdCBlcyBlaW5lIG5hY2hyaWNodCwKKyAgLy8gZGllIHZvbiBrZWluZW0gZGVyIGJlaWRlbiB3YWhyZ2Vub21tZW4gd2lyZCB1bmQgc29sbHRlIGRlbW5hY2ggbmljaHQKKyAgLy8gdW50ZXJkcnVlY2t0IHdlcmRlbi4KKyAgaWYgKCFzZW5zZXMpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKChzZW5zZXMgJiBNVF9MT09LKSAmJiBDYW5ub3RTZWUoMSkpCisgICAgc2Vuc2VzICY9IH5NVF9MT09LOyAgLy8gU2lubiBsb2VzY2hlbgorCisgIGlmICgoc2Vuc2VzICYgTVRfTElTVEVOKSAmJiBRdWVyeVByb3AoUF9ERUFGKSkKKyAgICBzZW5zZXMgJj0gfk1UX0xJU1RFTjsKKworICAvLyB3ZW5uIGtlaW4gU2lubiBtZWhyIHVlYmVyLCB3aXJkIGRpZSBOYWNocmljaHQgbmljaHQgd2Focmdlbm9tbWVuLgorICBpZiAoIXNlbnNlcykKKyAgICByZXR1cm4gTVNHX1NFTlNFX0JMT0NLOworCisgIHJldHVybiAwOworfQorCitwdWJsaWMgdmFyYXJncyBpbnQgUmVjZWl2ZU1zZyhzdHJpbmcgbXNnLCBpbnQgbXNnX3R5cGUsIHN0cmluZyBtc2dfYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1zZ19wcmVmaXgsIG9iamVjdCBvcmlnaW4pCit7CisgIGlmICghbXNnKSByZXR1cm4gTVNHX0ZBSUxFRDsKKworICAvLyBGbGFncyB1bmQgVHlwZW4gc3BhbHRlbgorICBpbnQgZmxhZ3MgPSBtc2dfdHlwZSAmIE1TR19BTExfRkxBR1M7CisgIGludCB0eXBlID0gbXNnX3R5cGUgJiB+ZmxhZ3M7CisKKyAgLy8gZ2dmLiBkZWZhdWx0cyBlcm1pdHRlbG4KKyAgb3JpZ2luIHx8PSBwcmV2aW91c19vYmplY3QoKTsKKyAgbXNnX2FjdGlvbiB8fD0gY29tbV9ndWVzc19hY3Rpb24oKTsKKyAgdHlwZSB8fD0gY29tbV9ndWVzc19tZXNzYWdlX3R5cGUobXNnX2FjdGlvbiwgb3JpZ2luKTsKKworICAvLyBEZWJ1Z21lbGR1bmdlbiBudXIgYW4gTWFnaWVyIG9kZXIgVGVzdHNwaWVsZXIgbWl0IFBfV0laX0RFQlVHCisgIGlmIChtc2dfdHlwZSAmIE1UX0RFQlVHKQorICB7CisgICAgaWYgKCFRdWVyeVByb3AoUF9XSVpfREVCVUcpCisgICAgICAgIHx8ICghSVNfTEVBUk5FUihNRSkgJiYgIVF1ZXJ5UHJvcChQX1RFU1RQTEFZRVIpKSApCisgICAgcmV0dXJuIE1TR19GQUlMRUQ7CisgIH0KKworICAvLyBadWVyc3Qgd2VyZGVuIFNpbm5lIHVuZCBQX0lHTk9SRSBzb3dpZSBnZ2YuIHNvbnN0aWdlIEZpbHRlciBnZXBydWVmdC4gSW4KKyAgLy8gZGVtIEZhbGwgaXN0IGRpcmVrdCBFbmRlLCBrZWluIEtvYm9sZCwga2VpbmUgS29tbS1IaXN0b3J5LCBrZWluZQorICAvLyBXZWl0ZXJiZWFyYmVpdHVuZy4KKyAgLy8gYWJlciBiZXN0aW1tdGUgRGluZ2UgbGFzc2VuIHNpY2ggZWluZmFjaCBuaWNodCBpZ25vcmllcmVuLgorICBpZiAoIShmbGFncyAmIE1TR19ET05UX0lHTk9SRSkpCisgIHsKKyAgICAvLyBTaW5uZSBwcnVlZmVuLiAobnVyIHR5cGVuIHVlYmVyZ2ViZW4sIGtlaW5lIEZsYWdzKQorICAgIGludCByZXM9Y2hlY2tfc2Vuc2VzKG1zZywgdHlwZSwgbXNnX2FjdGlvbiwgbXNnX3ByZWZpeCwgb3JpZ2luKTsKKyAgICBpZiAocmVzKSByZXR1cm4gcmVzOworCisgICAgLy8gU3BpZWxlci1kZWZpbmllcnRlcyBJZ25vcmllcmU/IChudXIgdHlwZW4gdWViZXJnZWJlbiwga2VpbmUgRmxhZ3MpCisgICAgcmVzPWNoZWNrX2lnbm9yZXMobXNnLCB0eXBlLCBtc2dfYWN0aW9uLCBtc2dfcHJlZml4LCBvcmlnaW4pOworICAgIGlmIChyZXMpIHJldHVybiByZXM7CisgIH0KKworICAvLyBGdWVyIE1UX0NPTU0gZ2lidCBlcyBlaW4gcGFhciBTb25kZXJkaW5nZSB6dSBtYWNoZW4uCisgIGlmICgodHlwZSAmIE1UX0NPTU0pKQorICB7CisgICAgLy8gZXJzdG1hbCBpbiBkZXIgS29tbS1IaXN0b3J5IGFibGVnZW4sIHdlbm4gZ2V3dWVuc2NodC4KKyAgICBpZiAoKCEoZmxhZ3MgJiBNU0dfRE9OVF9TVE9SRSkpKQorICAgIHsKKyAgICAgIHN0cmluZyB1aWQ7CisgICAgICBpZiAocXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvcmlnaW4pKQorICAgICAgICB1aWQgPSBvcmlnaW4tPnF1ZXJ5X3JlYWxfbmFtZSgpOworICAgICAgZWxzZQorICAgICAgICB1aWQgPSBvcmlnaW4tPm5hbWUoV0VSKSB8fCAiPHVuYmVrYW5udD4iOworICAgICAgYWRkX3RvX3RlbGxfaGlzdG9yeSh1aWQsIDAsIDEsIG1zZywgbXNnX3ByZWZpeCwgMCk7CisgICAgfQorCisgICAgLy8gZ2dmLiBVaHJ6ZWl0IGJlaSBhYndlc2VuZGVuIFNwaWVsZXJuIGFuaGFlbmdlbiwgYWJlciBuaWNodCBiZWkKKyAgICAvLyBFYmVuZW5tZWxkdW5nZW4uIChEaWUgaGFiZW4gZ2dmLiBzY2hvbi4pCisgICAgaWYgKHN0cmluZ3AobXNnX2FjdGlvbikgJiYgUXVlcnlQcm9wKFBfQVdBWSkKKyAgICAgICAgJiYgc3Ryc3RyKG1zZ19hY3Rpb24sIE1BX0NIQU5ORUwpICE9IDApCisgICAgeworICAgICAgLy8gVWhyemVpdCBhbmhhZW5nZW4sIGFiZXIgZ2dmLiBtdXNzIGVpbiBcbiBhYmdlc2Nobml0dGVuIHdlcmRlbi4KKyAgICAgIGlmIChtc2dbPDFdID09ICdcbicpCisgICAgICAgIG1zZyA9IG1zZ1swLi48Ml0rIiBbIiArIHN0cmZ0aW1lKCIlSDolTSIsdGltZSgpKSArICJdXG4iOworICAgICAgZWxzZQorICAgICAgICBtc2cgPSBtc2cgKyAiIFsiICsgc3RyZnRpbWUoIiVIOiVNIix0aW1lKCkpICsgIl0iOworICAgIH0KKyAgICAvLyBLb2JvbGQgZXJsYXVidCB1bmQgZ2V3dWVuc2NodD8gS29ib2xkIGlzdCBmdWVyIGRpZQorICAgIC8vIGRpcmVrdGUgS29tbXVuaWthdGlvbiBtaXR0ZWxzIE1UX0NPTU0gdm9yZ2VzZWhlbi4KKyAgICAvLyBPcm9wYXggdm9uIE1hZ2llcm4gbGVpdGV0IGluendpc2NoZW4gYXVjaCBudXIgaW4gS29ib2xkIHVtIHN0YXR0IHp1CisgICAgLy8gaWdub3JpZXJlbi4KKyAgICAvLyBkaWUgaWYtS29uc3RydWt0aW9uIGlzdCBzbywgd2VpbCBpY2ggZGFzIF9mbHVzaF9jYWNoZSgpIGltIGVsc2UKKyAgICAvLyBicmF1Y2hlLgorICAgIGlmIChxdWVyeV9lZGl0aW5nKHRoaXNfb2JqZWN0KCkpIHx8IHF1ZXJ5X2lucHV0X3BlbmRpbmcodGhpc19vYmplY3QoKSkKKyAgICAgICAgfHwgUXVlcnlQcm9wKFBfRUFSTVVGRlMpKQorICAgIHsKKyAgICAgIGlmICghKGZsYWdzICYgTVNHX0RPTlRfQlVGRkVSKQorICAgICAgICAgICAgJiYgUXVlcnlQcm9wKFBfQlVGRkVSKSkKKyAgICAgIHsKKyAgICAgICAgLy8gTmFjaHJpY2h0IHNvbGwgaW0gS29ib2xkIGdlc3BlaWNoZXJ0IHdlcmRlbi4KKyAgICAgICAgcmV0dXJuIGFkZF90b19rb2JvbGQobXNnLCBtc2dfdHlwZSwgbXNnX2FjdGlvbiwgbXNnX3ByZWZpeCwgb3JpZ2luKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8vIHdlbm4gbmljaHQgaW4gRWRpdG9yL2lucHV0X3RvLCBtYWwgdmVyc3VjaGVuLCBkZW4gS29ib2xkIHp1CisgICAgICAvLyBlbnRsZWVyZW4uCisgICAgICBfZmx1c2hfY2FjaGUoMCk7CisgICAgfQorCisgICAgLy8gZ2dmLiBQaWVwc3RvbiBhbmhhZW5nZW4uIE5BQ0ggS29ib2xkYWJsYWdlLCBkaWUgc29sbGVuIGVyc3RtYWwga2VpbmVuCisgICAgLy8gUGllcHMga3JpZWdlbi4KKyAgICBpZiAoY29tbV9iZWVwKCkpCisgICAgICBtc2c9bXNnICsgTUVTU0FHRV9CRUVQOworICB9CisKKyAgLy8gQXVzZ2FiZW5hY2hyaWNodCBiYXVlbiB1bmQgYW4gZGVuIFNwaWVsZXIgc2VuZGVuLgorICBpZiAoZmxhZ3MgJiBNU0dfRE9OVF9XUkFQKQorICAgIG1zZyA9IChtc2dfcHJlZml4ID8gbXNnX3ByZWZpeCA6ICIiKSArIG1zZzsKKyAgZWxzZQorICB7CisgICAgaW50IGJzZmxhZ3MgPSBmbGFncyAmIE1TR19BTExfQlNfRkxBR1M7CisgICAgaWYgKFF1ZXJ5UHJvcChQX01FU1NBR0VfUFJFUEVORCkpCisgICAgICBic2ZsYWdzIHw9IEJTX1BSRVBFTkRfSU5ERU5UOworICAgIG1zZyA9IGJyZWFrX3N0cmluZyhtc2csIDc4LCBtc2dfcHJlZml4LCBic2ZsYWdzKTsKKyAgfQorICBlZnVuOjp0ZWxsX29iamVjdChNRSwgbXNnKTsKKworICByZXR1cm4gTVNHX0RFTElWRVJFRDsKK30KZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvY29tbV9zdHJ1Y3RzLmMgYi9zdGQvcGxheWVyL2NvbW1fc3RydWN0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMjY4ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL2NvbW1fc3RydWN0cy5jCkBAIC0wLDAgKzEsNDEgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBwbGF5ZXIvY29tbS5jLS0gYmFzaWMgcGxheWVyIGNvbW11bmljdGlvbiBjb21tYW5kcworLy8KKy8vICRJZDogY29tbS5jIDY5MTggMjAwOC0wOC0wNyAyMToxMzoxNlogWmVzc3RyYSAkCisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKworc3RydWN0IG1zZ19zIHsKKyAgc3RyaW5nIG1zZzsgICAgICAgLy8gSW5oYWx0IGRlciBOYWNocmljaHQKKyAgaW50IHR5cGU7ICAgICAgICAgLy8gTWVzc2FnZXR5cCBmdWVyIFJlY2VpdmVNc2cKKyAgc3RyaW5nIGFjdGlvbjsgICAgLy8gTWVzc2FnZWFjdGlvbiBmdWVyIFJlY2VpdmVNc2cKKyAgc3RyaW5nIHByZWZpeDsgICAgLy8gRWlucnVlY2t1bmcgZGVyIE5hY2hyaWNodCBiZWkgRGFyc3RlbGx1bmcgKG1zZ19wcmVmaXgpCisgIHN0cmluZyBzZW5kZXJuYW1lOy8vIFVyc3BydW5nIGRlciBOYWNocmljaHQKK307CisKK3N0cnVjdCBzdG9yZWRfbXNnX3MgKG1zZ19zKSB7CisgIGludCB0aW1lc3RhbXA7ICAgIC8vIFplaXRzdGVtcGVsIGRlciBOYWNocmljaHQKK307CisKK3N0cnVjdCBtc2dfYnVmZmVyX3MgeworICAvL3N0cnVjdCBtc2dfcyAqYnVmOworICBtaXhlZCAqYnVmOworICBpbnQgaW5kZXg7Cit9OworCitzdHJ1Y3QgY2hhdF9zIHsKKyAgc3RyaW5nIHVpZDsgICAgICAgICAgIC8vIFVJRCBkZXMgR2VzcHJhZWNoc3BhcnRuZXJzCisgIGludCB0aW1lX2ZpcnN0X21zZzsgICAvLyBaZWl0IGRlciBlcnN0ZW4gTmFjaHJpY2h0CisgIGludCB0aW1lX2xhc3RfbXNnOyAgICAvLyBaZWl0IGRlciBsZXR6ZW4gTmFjaHJpY2h0CisgIGludCBzZW50Y291bnQ7ICAgICAgICAvLyBBbnphaGwgZ2VzZW5kZXRlciBOYWNocmljaHRlbgorICBpbnQgcmVjdmNvdW50OyAgICAgICAgLy8gQW56YWhsIGVtcGZhbmdlbmVyIE5hY2hyaWNodGVuCisgIG1peGVkIG1zZ2J1ZjsgICAgICAgICAvLyBBcnJheSB2b24gbXNnX3MgKEFydCBSaW5ncHVmZmVyKQorICBpbnQgcHRyOyAgICAgICAgICAgICAgLy8gUG9pbnRlciBhdWYgZGllIG5hZWNoc3RlIHp1IHVlYmVyc2NocmVpYmVuZGUgbXNnX3MKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIG1zZ2J1ZgorfTsKKwpkaWZmIC0tZ2l0IGEvc3RkL3BsYXllci9jb21tYW5kLmMgYi9zdGQvcGxheWVyL2NvbW1hbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzA0NDVkCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9jb21tYW5kLmMKQEAgLTAsMCArMSwxMDc0IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gcGxheWVyL2NvbW1hbmRzLmMgLS0gYWxpYXMsIGhpc3RvcnkgYW5kIHBsYXllciBjb21tYW5kIGhhbmRsaW5nCisvLworLy8gJElkOiBjb21tYW5kLmMgOTU3NiAyMDE2LTA2LTE4IDE1OjAwOjAxWiBaZXNzdHJhICQKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKy8vI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPHBsYXllci9jb21tYW5kLmg+CisjaW5jbHVkZSA8cGxheWVyL2NvbW0uaD4KKyNpbmNsdWRlIDx0aGluZy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGl2aW5nL21vdmluZy5oPgorI2luY2x1ZGUgPHBsYXllci5oPgorI3VuZGVmIE5FRURfUFJPVE9UWVBFUworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8bmV3X3NraWxscy5oPgorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxsb2dnaW5nLmg+CisjaW5jbHVkZSA8c3RyaW5ncy5oPgorCisjZGVmaW5lIENCTE9HKHgpICAgIGxvZ19maWxlKFNIRUxMTE9HKCJESVNBQkxFQ09NTUFORFMiKSx4LDIwMDAwMCkKKworI2RlZmluZSBISVNUX1NJWkUgNDAKKyNkZWZpbmUgRVBNQVNURVIgIi9zZWN1cmUvZXhwbG9yYXRpb25tYXN0ZXIiCisKK3ByaXZhdGUgbWFwcGluZyBhbGlhc2VzOworcHJpdmF0ZSBzdHJpbmcgKmNvbW1hbmRzOworcHJpdmF0ZSBpbnQgaGlzdF9zaXplLCBzaG93X3Byb2Nlc3NpbmcsIGhpc3RtaW47Citwcml2YXRlIHN0cmluZyBkZWZhdWx0X25vdGlmeV9mYWlsOworcHJpdmF0ZSBub3NhdmUgc3RyaW5nICpoaXN0b3J5LCAqdW5wYXJzZWRfYXJncywgdW5tb2RpZmllZDsKK3ByaXZhdGUgbm9zYXZlIGludCBoaXN0X25vdzsKK3ByaXZhdGUgbm9zYXZlIG9iamVjdCBsYXN0X2NvbW1hbmRfZW52OworcHJpdmF0ZSBub3NhdmUgaW50IGNtZHNfcGVyX3RpbWUsIGxhc3RfY2hnLCBtYXhfY29tbWFuZHMsICpjbWRfdHlwZXM7CisvLyBEYXRlbnN0cnVrdHVyOiAoe1NldHplciwgQWJsYXVmemVpdCwgU3RyaW5nL0Nsb3N1cmV9KQorcHJpdmF0ZSBub3NhdmUgbWl4ZWQgZGlzYWJsZWNvbW1hbmRzOworcHJpdmF0ZSBub3NhdmUgb2JqZWN0KiBzeW50YXhkYjsKKworbm9tYXNrIHZvaWQgX19zZXRfYmIoaW50IGZsYWcpOworCitzdGF0aWMgdmFyYXJncyBpbnQgX19hdXN3ZXJ0ZW4oc3RyaW5nIHN0ciwgc3RyaW5nIGludGVybik7Cit2YXJhcmdzIGludCBTb3VsQ29tbShzdHJpbmcgc3RyLCBzdHJpbmcgX3ZlcmIpOwordmFyYXJncyBtaXhlZCBNb3JlKHN0cmluZyBzdHIsIGludCBmZmxhZywgc3RyaW5nIHJldHVybnRvKTsKK3N0YXRpYyBpbnQgX3N0YXJ0c193aXRoKHN0cmluZyBzdHIsIHN0cmluZyBzdGFydCk7CitzdGF0aWMgdm9pZCByZWFsbG9jYXRlX2hpc3RidWYoKTsKKworcHJpdmF0ZSB2b2lkIEFkZEhpc3Rvcnkoc3RyaW5nIHN0cikKK3sKKyAgaWYgKCFzdHJpbmdwKHN0cikgfHwgc3RyPT0iIiB8fCBzdHJbMF09PScmJyB8fCBzdHJbMF09PSdeJyB8fAorICAgICAgc3RyPT0iaGlzdCIpCisgICAgcmV0dXJuOworICBpZiAoIWhpc3Rfc2l6ZSkgcmV0dXJuOworICBpZiAoIXBvaW50ZXJwKGhpc3RvcnkpIHx8IHNpemVvZihoaXN0b3J5KSE9aGlzdF9zaXplKQorICAgIHJlYWxsb2NhdGVfaGlzdGJ1ZigpOworICBpZiAoc2l6ZW9mKHN0cik+PWhpc3RtaW4gJiYgaGlzdG9yeVsoaGlzdF9zaXplK2hpc3Rfbm93LTEpJWhpc3Rfc2l6ZV0hPXN0cikKKyAgICBoaXN0b3J5WyhoaXN0X25vdysrKSVoaXN0X3NpemVdPXN0cjsKK30KKworc3RhdGljIHZvaWQgY3JlYXRlKCkKK3sKKyAgbGFzdF9jaGc9MDsKKyAgaGlzdG1pbj1oaXN0X25vdz0wOworICBTZXQoUF9MT0NBTENNRFMsKHt9KSk7CisgIFNldChQX0xPQ0FMQ01EUyxQUk9URUNURUQsRl9NT0RFX0FTKTsKKyAgU2V0KCJfc3ludGF4ZGIiLCBTRUNVUkVEfFNBVkUsIEZfTU9ERV9BUyk7CisKKyAgc2hvd19wcm9jZXNzaW5nPTE7CisgIHVucGFyc2VkX2FyZ3M9KHswLDAsMH0pOworICBoaXN0X3NpemU9SElTVF9TSVpFOworfQorCitzdGF0aWMgaW50IHJlcGxhY2VkaXNwbGF5KHN0cmluZyBzdHIpCit7CisgIGlmICghc3RyIHx8IHN0cj09IiIgfHwgIXNzY2FuZihzdHIsIiVkIixzaG93X3Byb2Nlc3NpbmcpKQorICAgIHByaW50ZigiVW56dWxhZXNzaWdlIEVpbmdhYmUhXG4lcyAwfDF8MlxuIixxdWVyeV92ZXJiKCkpOworICAgIHByaW50ZigiRXJzZXR6dW5nc2FuemVpZ2UgYXVmIExldmVsICVkLlxuTGV2ZWwgMDogTmljaHRzIGFuemVpZ2VuXG4iKworICAgICAiTGV2ZWwgMTogTnVyIEhpc3RvcnktRXJzZXR6dW5nZW4gYW56ZWlnZW5cbiIrCisgICAgICJMZXZlbCAyOiBIaXN0b3J5LSB1bmQgQWxpYXMtRXJzZXR6dW5nZW4gYW56ZWlnZW5cbiIsc2hvd19wcm9jZXNzaW5nKTsKKyAgaWYgKHNob3dfcHJvY2Vzc2luZz4yJiYhSVNfV0laQVJEKE1FKSkgc2hvd19wcm9jZXNzaW5nPTI7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGhpc3RtaW4oc3RyaW5nIHN0cikKK3sKKyAgaW50IGxlbjsKKworICBpZiAoIXN0cnx8IXNzY2FuZihzdHIsIiVkIixsZW4pfHxsZW48MCkKKyAgeworICAgIHdyaXRlKCJCZW51dHp1bmc6IGhpc3RtaW4gWkFITFxuTGVndCBkaWUgTWluZGVzdGxhZW5nZSBmZXN0LCBkaWUgZWluZSBcCitCZWZlaGxzemVpbGUgaGFiZW4gbXVzcywgdW0gaW4gZGVuXG5IaXN0b3J5LVB1ZmZlciB6dSBnZWxhbmdlbi4gRGVyemVpdCBcCitlaW5nZXN0ZWxsdCBhdWYgIisoc3RyaW5nKWhpc3RtaW4rIiBaZWljaGVuLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaGlzdG1pbj1sZW47CisgIHdyaXRlKCJNaW5kZXN0bGFlbmdlIGF1ZiAiKyhzdHJpbmcpbGVuKyIgZWluZ2VzdGVsbHQuXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIHJlYWxsb2NhdGVfaGlzdGJ1ZigpCit7CisgIGludCBpOworCisgIGhpc3Rvcnk9YWxsb2NhdGUoaGlzdF9zaXplKTsKKyAgaGlzdF9ub3c9MDsKKyAgZm9yIChpPTA7aTxoaXN0X3NpemU7aSsrKQorICAgIGlmICghc3RyaW5ncChoaXN0b3J5W2ldKSkKKyAgICAgIGhpc3RvcnlbaV09IlxuXG4iOworfQorCitzdGF0aWMgaW50IGhpc3RsZW4oc3RyaW5nIHN0cikKK3sKKyAgaW50IGQ7CisgIGlmICghc3RyfHwhc3NjYW5mKHN0ciwiJWQiLGQpfHxkPDB8fGQ+NDApCisgIHsKKyAgICB3cml0ZSgiQmVudXR6dW5nOiBoaXN0bGVuIFpBSExcblpBSEwgbXVzcyB6d2lzY2hlbiAwIHVuZCA0MCBsaWVnZW4uXG4iKTsKKyAgICBwcmludGYoIkRlaW5lIEhpc3RvcnktQnVmZmVyLUxhZW5nZSBsaWVndCBiZWkgJWQgQmVmZWhsZW4uXG4iLGhpc3Rfc2l6ZSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaGlzdF9zaXplPWQ7CisgIHByaW50ZigiRGVpbmUgSGlzdG9yeS1CdWZmZXItTGFlbmdlIGxpZWd0IGpldHp0IGJlaSAlZCBCZWZlaGxlbi5cbiIsCisgICBoaXN0X3NpemUpOworICByZWFsbG9jYXRlX2hpc3RidWYoKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRpYWxpemUoKQoreworICBpZiAoIXBvaW50ZXJwKGhpc3RvcnkpfHxzaXplb2YoaGlzdG9yeSkhPWhpc3Rfc2l6ZSkKKyAgICByZWFsbG9jYXRlX2hpc3RidWYoKTsKKyAgYWRkX2FjdGlvbigiX19hdXN3ZXJ0ZW4iLCIiLDEpOworICAgIG1heF9jb21tYW5kcyA9IEVQTUFTVEVSLT5RdWVyeUNvbW1hbmRzKCk7CisgICAgY21kX3R5cGVzID0gRVBNQVNURVItPlF1ZXJ5Q21kVHlwZXMoKSB8fCAoe30pOworCisgICAgaWYgKCAhbWFwcGluZ3AoYWxpYXNlcykgKQorICAgICAgICBhbGlhc2VzID0gKFtdKTsKKworICAgIGlmICggIXBvaW50ZXJwKGNvbW1hbmRzKSApCisgICAgICAgIGNvbW1hbmRzID0gKHt9KTsKKworICAgIGlmIChRdWVyeVByb3AoIl9zeW50YXhkYiIpKQorICAgICAgICBzeW50YXhkYiA9ICh7ZmluZF9vYmplY3QoIi9zZWN1cmUvc3ludGF4ZGIiKX0pOworLyogICAgZWxzZSBpZiAoUXVlcnlQcm9wKFBfVEVTVFBMQVlFUikpCisgICAgeworICAgICAgU2V0UHJvcCgiX3N5bnRheGRiIiwgMSk7CisgICAgICBjYWxsX291dCgjJ19ub3RpZnksIDIsCisgICAgICAgICAgIlxuRGEgRHUgYWxzIFRlc3RzcGllbGVyIG1hcmtpZXJ0IGJpc3QsIHd1cmRlIGJlaSBEaXIgIgorICAgICAgICAgICJkaWUgU3ludGF4c2FtbWx1bmcgZWluZ2VzY2hhbHRldC4gRHUga2FubnN0IGRpZXMgIgorICAgICAgICAgICJ3aWVkZXIgYXVzc2NoYWx0ZW4uIChoaWxmZSBzeW50YXhzYW1tbHVuZykgIgorICAgICAgICAgICJFcyB3YWVyZSBzY2hvZW4sIHdlbm4gRHUgZXMgYmVpbSBUZXN0ZW4gdm9uICIKKyAgICAgICAgICAiR2ViaWV0ZW4gZWluc2NoYWx0ZXN0LiIsIDApOworICAgIH0qLworfQorCitzdGF0aWMgbWl4ZWQgX3NldF9kZWZhdWx0X25vdGlmeV9mYWlsKHN0cmluZyBzKQoreworICBpZiAoc3RyaW5ncChzKSYmcyE9IiIpCisgIHsKKyAgICBpZiAoc1s8MV0hPSdcbicpIHMrPSJcbiI7CisgICAgcmV0dXJuIGRlZmF1bHRfbm90aWZ5X2ZhaWw9czsKKyAgfQorICBlbHNlIGlmICghc3x8cz09IiIpCisgICAgcmV0dXJuIChkZWZhdWx0X25vdGlmeV9mYWlsPTApOworfQorCitzdGF0aWMgbWl4ZWQgX3F1ZXJ5X2RlZmF1bHRfbm90aWZ5X2ZhaWwoKQoreworICByZXR1cm4gZGVmYXVsdF9ub3RpZnlfZmFpbDsKK30KKworc3RhdGljIGludCBzZXRfZXJyb3JtZXNzYWdlKHN0cmluZyBzKQoreworICBpZiAoIShzPV91bnBhcnNlZF9hcmdzKCkpKQorICB7CisgICAgX3NldF9kZWZhdWx0X25vdGlmeV9mYWlsKDApOworICAgIHdyaXRlKCJTdGFuZGFyZC1GZWhsZXJtZWxkdW5nIGF1ZiBcIldpZSBiaXR0ZT9cIiBnZXNldHp0LlxuIik7CisgIH0gZWxzZQorICB7CisgICAgd3JpdGUoYnJlYWtfc3RyaW5nKHNwcmludGYoIlN0YW5kYXJkLUZlaGxlcm1lbGR1bmcgYXVmICVzIGdlc2V0enQuXG4iLAorICAgICAgICAgICAgIHMpLDc4KSk7CisgICAgX3NldF9kZWZhdWx0X25vdGlmeV9mYWlsKHMpOworICB9CisgIHJldHVybiAxOworfQorCit2b2lkIHJlY29ubmVjdCgpCit7CisgIGlmICghbWFwcGluZ3AoYWxpYXNlcykpIGFsaWFzZXM9KFtdKTsKKworICAgIGlmICggIXBvaW50ZXJwKGNvbW1hbmRzKSApCisgICAgICAgIGNvbW1hbmRzID0gKHt9KTsKKworICAgIG1heF9jb21tYW5kcyA9IEVQTUFTVEVSLT5RdWVyeUNvbW1hbmRzKCk7CisgICAgY21kX3R5cGVzID0gRVBNQVNURVItPlF1ZXJ5Q21kVHlwZXMoKSB8fCAoe30pOworfQorCitzdGF0aWMgaW50IHNob3dfaGlzdCgpCit7CisgIGludCBpOworICBzdHJpbmcgY29tbTsKKworICB0ZWxsX29iamVjdCggTUUsICJEaWUgSGlzdG9yeS1MaXN0ZSBlbnRoYWVsdCBmb2xnZW5kZSBLb21tYW5kb3M6XG4iICk7CisKKyAgZm9yKCBpID0gMDsgaSA8IGhpc3Rfc2l6ZTsgaSsrICkKKyAgICAgIGlmICgoY29tbT1oaXN0b3J5WyhoaXN0X25vdytpKSUgaGlzdF9zaXplXSkhPSAiXG5cbiIpCisgICAgICAgICAgdGVsbF9vYmplY3QoIE1FLCAiICYiKyhoaXN0X25vdytpLWhpc3Rfc2l6ZSkrIi8tIisgKGhpc3Rfc2l6ZS1pLTEpCisgICAgICArIlx0PSAiK2NvbW0rIlxuIik7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgc3RyaW5nIHByZXNlbnRfYWxpYXMobWl4ZWQgKmFsaSkKK3sKKyAgaW50IGosazsKKyAgc3RyaW5nIHMsczI7CisKKyAgZm9yIChzPSIiLGo9c2l6ZW9mKGFsaSktMTtqPj0wO2otLSkKKyAgICBpZiAoaW50cChhbGlbal0pKQorICAgICAgaWYgKChrPWFsaVtqXSk8MCkKKyAgcz0iJCIrKGs9PS0xPyIiOihzdHJpbmcpLWspKyIqIitzOworICAgICAgZWxzZQorICBzPSIkIisoc3RyaW5nKWsrczsKKyAgICBlbHNlCisgICAgICB7CisgICAgICAgICBzMj1pbXBsb2RlKGV4cGxvZGUoYWxpW2pdLCJcXCIpLCJcXFxcIik7CisgICAgICAgICBzPWltcGxvZGUoZXhwbG9kZShzMiwiJCIpLCJcXCQiKStzOworICAgICAgfQorICByZXR1cm4gczsKK30KKworI2RlZmluZSBBTElGT1JNQVQgKHsiICVzXHQ9ICVzIiwgImFsaWFzICVzICVzIn0pW2Rpc3BsYXlfYXNfYWxpYXNjb21tYW5kXQorLy8gSWNoIHdlaXNzLCBkZW4gVmFyaWFibGVubmFtZW4gaW0gZGVmaW5lIHp1IGhhYmVuIGlzdCB1bmZlaW4sIGFiZXIgZGFzCisvLyBtYWNodCBlcyBpbSBDb2RlIGRhbm4gYW5nZW5laG0gdWViZXJzaWNodGxpY2guICAtSHJUCisKK3N0YXRpYyBpbnQgcXVlcnlfYWxpYXNlcyhpbnQgZGlzcGxheV9hc19hbGlhc2NvbW1hbmQpCit7CisgIGludCBpOworICBzdHJpbmcgKmEsKmFsaTsKKworICBpZihpPXNpemVvZihhbGk9c29ydF9hcnJheShtX2luZGljZXMoYWxpYXNlcyksIyc8KSkpIC8vJykpKQorICB7CisgICAgZm9yKGE9KHt9KSxpLS07IGk+PTA7IGktLSkKKyAgICAgICAgYSs9KHtzcHJpbnRmKEFMSUZPUk1BVCwgYWxpW2ldLCBwcmVzZW50X2FsaWFzKCBhbGlhc2VzW2FsaVtpXV0gKSApIH0pOworICAgIE1vcmUoIkR1IGhhc3QgZm9sZ2VuZGUgQWxpYXNlIGRlZmluaWVydDpcbiIraW1wbG9kZShhLCJcbiIpKTsKKyAgfQorICBlbHNlCisgICAgd3JpdGUoIkR1IGhhc3Qga2VpbmUgQWxpYXNlIGRlZmluaWVydC5cbiIpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludAorX3N0YXJ0c193aXRoKHN0cmluZyBzdHIsIHN0cmluZyBzdGFydCkKK3sKKyAgcmV0dXJuIChzaXplb2Yoc3RhcnQpPnNpemVvZihzdHIpID8gMAorICAgIDogc3RyWzAuLnNpemVvZihzdGFydCktMV09PXN0YXJ0KTsKK30KKworc3RhdGljIGludCBhbGlhcyhzdHJpbmcgc3RyKQoreworICBzdHJpbmcgY29tbWFuZDsKKyAgc3RyaW5nICp0bXAsdW0sKmhpdHM7CisgIGludCBudW0sIGwsIHBvcywgY29udDsKKyAgaW50IGRpc3BsYXlfYXNfYWxpYXNjb21tYW5kOworCisgIGlmICh1bm1vZGlmaWVkJiZ1bm1vZGlmaWVkIT0iIikKKyAgICB1bT1pbXBsb2RlKG9sZF9leHBsb2RlKHVubW9kaWZpZWQsIiAiKVsxLi5dLCIgIik7CisgIGlmICh1bT09IiIpIHVtPTA7CisgIGlmKCEoc3RyPXVtfHxfdW5wYXJzZWRfYXJncygpKSB8fCBzdHI9PSIqIikgcmV0dXJuIHF1ZXJ5X2FsaWFzZXMoMCk7CisKKyAgICBpZiAoc3RyPT0iLWEiIHx8IHN0cnN0cihzdHIsICItYSAiKT09MCApICB7CisgICAgc3RyPXN0clsyLi5dOworICAgIGlmIChzdHIgJiYgc3RyIT0iIiAmJiBzdHJbMF09PScgJykgc3RyPXN0clsxLi5dOworICAgIGlmICghc3RyIHx8IHN0cj09IiIgfHwgc3RyPT0iKiIpIHJldHVybiBxdWVyeV9hbGlhc2VzKDEpOworICAgIGRpc3BsYXlfYXNfYWxpYXNjb21tYW5kPTE7CisgIH0KKworICBpZiAoKHBvcz1tZW1iZXIoc3RyLCcgJykpPDApIC8vIDEgQXJnIG9ubHkKKyAgeworICAgIGlmICgodG1wPWFsaWFzZXNbc3RyXSkpCisgICAgICBwcmludGYoQUxJRk9STUFUKyJcbiIsc3RyLHByZXNlbnRfYWxpYXModG1wKSk7CisgICAgZWxzZQorICAgICAgaWYgKHN0cls8MV09PScqJykKKyAgICAgIHsKKyAgICAgICAgc3RyPXN0clswLi48Ml07CisgICAgICAgIGhpdHM9ZmlsdGVyKG1faW5kaWNlcyhhbGlhc2VzKSwgIydfc3RhcnRzX3dpdGgsIHN0cik7CisgICAgICAgIGlmICghc2l6ZW9mKGhpdHMpKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmKCJEdSBoYXN0IGtlaW4gQWxpYXMsIGRhcyBtaXQgXCIlc1wiIGFuZmFlbmd0LlxuIiwgc3RyKTsKKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBoaXRzPXNvcnRfYXJyYXkoaGl0cywgIyc+KTsKKyAgICAgICAgZm9yIChsPXNpemVvZihoaXRzKTsgbC0tOykKKyAgICAgICAgICBoaXRzW2xdPXNwcmludGYoQUxJRk9STUFULCBoaXRzW2xdLCBwcmVzZW50X2FsaWFzKGFsaWFzZXNbaGl0c1tsXV0pKTsKKyAgICAgICAgTW9yZSgiRm9sZ2VuZGUgQWxpYXNlIGJlZ2lubmVuIG1pdCBcIiIrc3RyKyJcIjpcbiIraW1wbG9kZShoaXRzLCJcbiIpKTsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICBwcmludGYoIkR1IGhhc3Qga2VpbiBBbGlhcyBcIiVzXCIgZGVmaW5pZXJ0LlxuIixzdHIpOworICAgIHJldHVybiAxOworICB9CisgIGlmICghcG9zKQorICB7CisgICAgd3JpdGUoIkZlaGxlcjogQmxhbmMgYW0gQWxpYXMtQW5mYW5nXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoKGNvbW1hbmQ9c3RyWzAuLnBvcy0xXSk9PSJ1bmFsaWFzIikKKyAgeworICAgIHdyaXRlCisgICAgICAoIkVzIG5pY2h0IG1vZWdsaWNoLCBkZW4gQmVmZWhsIHVuYWxpYXMgenUgdWViZXJsYWRlbiAod2FlciBkdW1tIDopKVxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKChjb21tYW5kPXN0clswLi5wb3MtMV0pPT0iKiIpCisgIHsKKyAgICB3cml0ZQorICAgICAgKCJFcyBuaWNodCBtb2VnbGljaCwgZGVuIEJlZmVobCBcIipcIiB6dSB1ZWJlcmxhZGVuLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBzdHI9c3RyW3BvcysxLi5dLHRtcD0oe30pOworICB3aGlsZSAobD1zaXplb2Yoc3RyKSkgeworICAgIHBvcz0wLGNvbnQ9MTsKKyAgICB3aGlsZSAoY29udCkgeworICAgICAgaWYgKHBvczxsKSB7CisgICAgICAgIGlmKHN0cltwb3NdPT0nXFwnKSB7CisgICAgICAgICAgc3RyPXN0clswLi5wb3MtMV0rc3RyW3BvcysxLi5dOworICAgICAgICAgIGwtLTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoc3RyW3Bvc109PScmJyB8fCBzdHJbcG9zXT09JyQnKSB7CisgICAgICAgICAgICBjb250PTA7CisgICAgICAgICAgICBpZiAocG9zPjApIHsKKyAgICAgICAgICAgICAgdG1wKz0oe3N0clswLi5wb3MtMV19KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwb3M9PWwtMSkgeworICAgICAgICAgICAgICBwcmludGYoIkZlaGxlcjogJWMgYW0gWmVpbGVuZW5kZVxuIixzdHJbcG9zXSk7CisgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChudW09c3RyWysrcG9zXSk9PScqJykgeworICAgICAgICAgICAgICBudW09MTsKKyAgICAgICAgICAgICAgcG9zLS07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBudW0tPScwJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChudW08MCB8fCBudW0+OSkgeworICAgICAgICAgICAgICBwcmludGYoIkZlaGxlcjogTmFjaCAlYyBtdXNzIFppZmZlciBvZGVyICogZm9sZ2VuXG4iLAorICAgICAgICAgICAgICAgc3RyW3Bvcy0xXSk7CisgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChzdHI9c3RyW3BvcysxLi5dKSE9IiImJnN0clswXT09JyonKSB7CisgICAgICAgICAgICAgIHN0cj1zdHJbMS4uXTsKKyAgICAgICAgICAgICAgbnVtPS1udW07CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0bXArPSh7bnVtfSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHBvcysrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29udD0wOworICAgICAgICBpZiAoc3RyIT0iIikgdG1wKz0oe3N0cn0pOworICAgICAgICBzdHI9IiI7CisgICAgICB9CisgICAgfQorICB9CisgIGlmICgoIWFsaWFzZXNbY29tbWFuZF0pICYmIChzaXplb2YoYWxpYXNlcyk+MjAwMCkpCisgICAgcHJpbnRmKCJEdSBoYXN0IHNjaG9uIGdlbnVlZ2VuZCBBbGlhc2UgZGVmaW5pZXJ0IVxuIik7CisgIGVsc2UKKyAgeworICAgIGFsaWFzZXNbY29tbWFuZF09dG1wOworICAgIHByaW50ZigiTmV1ZXMgQWxpYXM6ICVzXHQ9ICVzXG4iLGNvbW1hbmQscHJlc2VudF9hbGlhcyh0bXApKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCB1bmFsaWFzKHN0cmluZyBzdHIpIHsKKyAgaW50IGk7CisgIHN0cmluZyAqYWxzLHVtOworCisgIGlmICh1bm1vZGlmaWVkJiZ1bm1vZGlmaWVkIT0iIikKKyAgICB1bT1pbXBsb2RlKG9sZF9leHBsb2RlKHVubW9kaWZpZWQsIiAiKVsxLi5dLCIgIik7CisgIGlmICh1bT09IiIpIHVtPTA7CisgIGlmICggIShzdHI9dW0gfHwgX3VucGFyc2VkX2FyZ3MoKSkpIHJldHVybiAwOworICBpZiAoc3RyID09ICIqLioiIHx8IHN0ciA9PSAiKiIpIHsKKyAgICB3cml0ZShicmVha19zdHJpbmcoCisgICAgICAiVmVyc3VjaHMgbWFsIG1pdCAndW5hbGlhcyAuKicsIHdlbm4gRHUgd2lya2xpY2ggYWxsZSBBbGlhcyBlbnRmZXJuZW4gIgorICAgICAgIndpbGxzdC4iLDc4KSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKCFtZW1iZXIoYWxpYXNlcyxzdHIpKSB7CisgICAgYWxzPXJlZ2V4cChtX2luZGljZXMoYWxpYXNlcyksKCJeIitzdHIrIiQiKSk7CisgICAgaWYgKCEoaT1zaXplb2YoYWxzKSkpIHsKKyAgICAgIHdyaXRlKCJTbyBlaW4gQWxpYXMgaGFzdCBEdSBuaWNodCBkZWZpbmllcnQuXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBmb3IgKC0taTtpPj0wO2ktLSkKKyAgICAgIG1fZGVsZXRlKGFsaWFzZXMsYWxzW2ldKTsKKyAgICB3cml0ZShicmVha19zdHJpbmcoKCJEdSBlbnRmZXJuc3QgZm9sZ2VuZGUgQWxpYXNlOiAiKworICAgICAgaW1wbG9kZShhbHMsIiAiKSsiLlxuIiksNzUpKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBtX2RlbGV0ZShhbGlhc2VzLHN0cik7CisgIHdyaXRlKCJEdSBlbnRmZXJuc3QgZGFzIEFsaWFzIFwiIitzdHIrIlwiLlxuIik7CisgIHJldHVybiAxOworfQorCit2YXJhcmdzIHN0cmluZyBfdW5wYXJzZWRfYXJncyhpbnQgbGV2ZWwpCit7CisgIHJldHVybiB1bnBhcnNlZF9hcmdzW2xldmVsXTsKK30KKworI2RlZmluZSBBUlRJS0VMICh7ImRhcyIsImRlciIsImRpZSIsImRlcyIsImRlbSIsImRlbiIsImVpbiIsImVpbmUiLCJlaW5lciIsXAorICAgICAgICAgICAgICAgICAgImVpbmVzIn0pCisKKyNkZWZpbmUgVFJFTk5FUiAoeyJpbiIsImF1cyIsInVlYmVyIiwiYXVmIiwidW50ZXIiLCJtaXQiLCJkdXJjaCIsImZ1ZXIiLFwKKyAgICAgICAgICAgICAgICAgICJ2b24iLCJ2b20iLCJpbSIsImF1ZnMiLCJlaW4iLCJ3ZWciLCJ6dXJ1ZWNrIn0pCisKK3N0YXRpYyBzdHJpbmcgX3NpbmdsZV9zcGFjZXMoc3RyaW5nIHN0cikKK3sKKyAgcmV0dXJuIHJlZ3JlcGxhY2Uoc3RyLCAiICAqIiwgIiAiLCAxKTsKK30KKworc3RhdGljIG1peGVkIF9yZXR1cm5fYXJncyhzdHJpbmcgc3RyKQoreworICBzdHJpbmcgKnQsKnQyLHZlcmIsczI7CisgIGludCBpLGwsaixsMjsKKworICB0PWV4cGxvZGUodHJpbShzdHIsVFJJTV9CT1RIKSwiICIpOworICB2ZXJiPXRbMF07CisgIHQgPSB0WzEuLl07CisgIGlmICghc2l6ZW9mKHQpKQorICB7CisgICAgdW5wYXJzZWRfYXJnc1swXT11bnBhcnNlZF9hcmdzWzFdPXVucGFyc2VkX2FyZ3NbMl09MDsKKyAgICByZXR1cm4gc3RyPXZlcmI7CisgIH0KKyAgZWxzZQorICAgIHN0ciA9IHVucGFyc2VkX2FyZ3NbMF0gPSBpbXBsb2RlKHQsICIgIik7CisKKyAgc3RyPXVucGFyc2VkX2FyZ3NbMV09bG93ZXJfY2FzZShfc2luZ2xlX3NwYWNlcyhzdHIpKTsKKyAgdD1yZWdleHBsb2RlKHN0ciwiXFw8aW1cXD58XFw8aW5zXFw+Iik7CisgIGZvciAoaT0xO2k8c2l6ZW9mKHQpO2krPTIpIHRbaV09ImluIjsKKyAgdD1yZWdleHBsb2RlKGltcGxvZGUodCwiIiksIltcXCxcXCFcXDpdW1xcLFxcIVxcOl0qIik7CisgIGw9c2l6ZW9mKHQpOworICBmb3IoaT0xO2k8bDtpKz0yKSB0W2ldPSIiOworICB0PW9sZF9leHBsb2RlKGltcGxvZGUodCwiIiksIiAiKS0oeyIifSk7CisgIGZvciAoaT1zaXplb2YodCktMjtpPj0wO2ktLSkKKyAgeworICAgIGlmIChtZW1iZXIoQVJUSUtFTCx0W2ldKT49MCkKKyAgICAgIHQ9dFswLi5pLTFdK3RbaSsxLi5dOworICB9CisgIHVucGFyc2VkX2FyZ3NbMl09aW1wbG9kZSh0LCIgIik7CisgIHQ9cmVnZXhwbG9kZSgoc3RyPWltcGxvZGUodCwiICIpKSwiWzAtOV1bMC05XSpcXC4iKTsKKyAgaWYgKChsPXNpemVvZih0KSk+MikKKyAgeworICAgIGk9MTsKKyAgICB3aGlsZSAoaTxsLTEpCisgICAgeworICAgICAgdFtpXT0iICIrdFtpXVswLi48Ml0rIiAiOworICAgICAgaWYgKChsMj1zaXplb2YodDI9b2xkX2V4cGxvZGUodFtpKzFdLCIgIikpKTwyKQorICB0W2krMV0rPXRbaV07CisgICAgICBlbHNlCisgICAgICB7CisgIGZvciAoaj0xO2o8bDI7aisrKQorICB7CisgICAgaWYgKG1lbWJlcihUUkVOTkVSLHQyW2pdKT49MCkKKyAgICB7CisgICAgICB0MltqLTFdKz10W2ldOworICAgICAgbDI9MDsKKyAgICB9CisgIH0KKyAgaWYgKCFsMikKKyAgICB0W2krMV09aW1wbG9kZSh0MiwiICIpOworICBlbHNlCisgICAgdFtpKzFdKz10W2ldOworICAgICAgfQorICAgICAgdFtpXT0iIjsKKyAgICAgIGkrPTI7CisgICAgfQorICAgIHN0cj1fc2luZ2xlX3NwYWNlcyh2ZXJiKyIgIitpbXBsb2RlKHQsIiAiKSk7CisgICAgaWYgKHN0cls8MV09PScgJykgc3RyPXN0clswLi48Ml07CisgIH0gZWxzZSBzdHI9dmVyYisoc3RyPT0iIj8iIjoiICIrc3RyKTsKKyAgaWYgKHNob3dfcHJvY2Vzc2luZz4yKQorICAgIHByaW50ZigiLT4geyVzfVxuIixzdHIpOworICByZXR1cm4gc3RyOworfQorCitzdGF0aWMgdm9pZCBkZWNheV9hdmVyYWdlKCkKK3sKKyAgaWYgKGFic29sdXRlX2hiX2NvdW50KCktbGFzdF9jaGc+MTQpCisgIHsKKyAgICBsYXN0X2NoZz1hYnNvbHV0ZV9oYl9jb3VudCgpLWxhc3RfY2hnOworICAgIGlmIChsYXN0X2NoZz4zMDAwKQorICAgICAgbGFzdF9jaGc9YWJzb2x1dGVfaGJfY291bnQoKSxjbWRzX3Blcl90aW1lPTA7CisgICAgZWxzZQorICAgIHsKKyAgICAgIHdoaWxlIChsYXN0X2NoZz4xNCkKKyAgY21kc19wZXJfdGltZT1jbWRzX3Blcl90aW1lKjkvMTAsIGxhc3RfY2hnLT0xNTsKKyAgICAgIGxhc3RfY2hnPWFic29sdXRlX2hiX2NvdW50KCktbGFzdF9jaGc7CisgICAgfQorICB9Cit9CisKK3ByaXZhdGUgdm9pZCBEZWxheVByZXBhcmVkU3BlbGxzKCkgeworICBtaXhlZCBwczsKKworICBpZiAocG9pbnRlcnAocHM9UXVlcnlQcm9wKFBfUFJFUEFSRURfU1BFTEwpKQorICAgICAgJiYgc2l6ZW9mKHBzKT49MSAmJiBpbnRwKHBzWzBdKSkgeworICAgIHBzWzBdKys7CisgICAgU2V0UHJvcChQX1BSRVBBUkVEX1NQRUxMLHBzKTsKKyAgICB3cml0ZSgiRGllIEF1c2Z1ZWhydW5nIERlaW5lcyB2b3JiZXJlaXRldGVuIFNwcnVjaGVzIHdpcmQgdmVyem9lZ2VydC5cbiIpOworICB9IGVsc2UgaWYgKHBzKSB7CisgICAgU2V0UHJvcChQX1BSRVBBUkVEX1NQRUxMLDApOworICB9Cit9CisKK3N0YXRpYyBtaXhlZCBiYjsKKyNpZm5kZWYgQkJNQVNURVIKKyNkZWZpbmUgQkJNQVNURVIgIi9zZWN1cmUvYmJtYXN0ZXIiCisjZW5kaWYKKworLyoqIEludGVycHJldGllcnQgQWxpYXNlIHVuZCBIaXN0b3J5LUtvbW1hbmRvcworICBFaWdlbnRsaWNoIG11ZXNzdGUgaGllciBub2NoIGRpZSBVbXdhbmRsdW5nIGRlciBTb25kZXJ6ZWljaGVuCisgIHZlcnNjaGllZGVuZXIgWmVpY2hlbnNhZXR6ZSBtaXQgY29udmVydF9jaGFyc2V0IGdlbWFjaHQgd2VyZGVuLAorICBhYmVyIG5vY2ggZ2lidCBlcyBrZWluZSBNb2VnbGljaGtlaXQsIGRlbiB2b20gU3BpZWxlciBnZW51dHp0ZW4KKyAgWmVpY2hlbnNhdHogenUgaWRlbnRpZml6aWVyZW4uCisgIFxwYXJhbVtpbl0gc3RyIHN0cmluZyAtIEtvbW1hbmRvIGRlcyBTcGllbGVycworICBccmV0dXJuIGludGVycHJldGllcnRlcyBBbGlhcyBiencuIGtvcnJla3RlcyBLb21tYW5kbyBhdXMgZGVyIEhpc3RvcnkKKyovCitwcml2YXRlIHN0cmluZyBwYXJzZWNvbW1hbmQoc3RyaW5nIHN0cikKK3sKKyAgaWYgKHN0clswXT09J1xcJykKKyAgeworICAgIC8vIEtvbW1hbmRvIHNvbGwgbmljaHQgaW50ZXJwcmV0aWVydCB3ZXJkZW4KKyAgICByZXR1cm4gc3RyWzEuLl07CisgIH0KKyAgZWxzZSBpZiAoc3RyWzBdPT0nJicpCisgIHsKKyAgICAvLyBLb21tYW5kbyBhdXMgZGVyIEhpc3RvcnkKKyAgICBzdHJpbmcgY21kID0gc3RyWzEuLl07CisgICAgaW50IGNtZF9zaXplID0gc2l6ZW9mKGNtZCk7CisgICAgaW50IGNtZF9mb3VuZCA9IDA7CisgICAgaWYgKGNtZF9zaXplKQorICAgIHsKKyAgICAgIC8vIFRlc3Qgb2IgJjx0ZXh0PiBldHdhcyBmaW5kZXQKKyAgICAgIGZvciAoaW50IGk9MDtpPGhpc3Rfc2l6ZS0xICYmICFjbWRfZm91bmQ7aSsrKQorICAgICAgeworICAgICAgICBpbnQgaWR4ID0gKGhpc3Rfc2l6ZS1pK2hpc3Rfbm93LTEpJWhpc3Rfc2l6ZTsKKyAgICAgICAgaWYgKGhpc3RvcnlbaWR4XVswLi5jbWRfc2l6ZS0xXT09Y21kKQorICAgICAgICB7CisgICAgICAgICAgc3RyID0gaGlzdG9yeVtpZHhdOworICAgICAgICAgIGNtZF9mb3VuZCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNtZF9mb3VuZCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChzaG93X3Byb2Nlc3NpbmcpCisgICAgICAgICAgICBwcmludGYoIlslc11cbiIsc3RyKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAoIWNtZF9mb3VuZCkKKyAgICB7CisgICAgICAvLyBUZXN0LCBvYiAmPG5yPiBrbGFwcHQKKyAgICAgIGludCBudW1tZXI7CisgICAgICBpZiAoc3RyPT0iJiYiKQorICAgICAgICBzdHIgPSAiJi0wIjsKKyAgICAgIGlmIChzc2NhbmYoc3RyLCImJWQiLG51bW1lcikpCisgICAgICB7CisgICAgICAgIGlmIChudW1tZXI8MCB8fCAoIW51bW1lciAmJiBzdHJbMV09PSctJykpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAobnVtbWVyPC0oaGlzdF9zaXplLTEpKQorICAgICAgICAgICAgbnVtbWVyPS0xOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG51bW1lcj0oaGlzdF9ub3crbnVtbWVyLTEraGlzdF9zaXplKSVoaXN0X3NpemU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaWYgKG51bW1lcj5oaXN0X25vdyB8fCBoaXN0X25vdy1udW1tZXI+aGlzdF9zaXplKQorICAgICAgICAgICAgbnVtbWVyPS0xOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG51bW1lcj1udW1tZXIlaGlzdF9zaXplOworICAgICAgICB9CisgICAgICAgIGlmIChudW1tZXI8MCAKKyAgICAgICAgICAgIHx8ICggKGNtZD1oaXN0b3J5W251bW1lcl0pID09IlxuXG4iKSApCisgICAgICAgICAgbm90aWZ5X2ZhaWwoIkRlciBCZWZlaGwgaXN0IG5pY2h0IGluIGRlciBIaXN0b3J5IVxuIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHN0ciA9IGNtZDsKKyAgICAgICAgICBpZiAoc2hvd19wcm9jZXNzaW5nKQorICAgICAgICAgICAgcHJpbnRmKCJbJXNdXG4iLHN0cik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgc3dpdGNoIChzdHIpCisgIHsKKyAgICBjYXNlICJuIjogcmV0dXJuICJub3JkZW4iOworICAgIGNhc2UgInMiOiByZXR1cm4gInN1ZWRlbiI7CisgICAgY2FzZSAidyI6IHJldHVybiAid2VzdGVuIjsKKyAgICBjYXNlICJvIjogcmV0dXJuICJvc3RlbiI7CisgICAgY2FzZSAibnciOiByZXR1cm4gIm5vcmR3ZXN0ZW4iOworICAgIGNhc2UgInN3IjogcmV0dXJuICJzdWVkd2VzdGVuIjsKKyAgICBjYXNlICJzbyI6IHJldHVybiAic3VlZG9zdGVuIjsKKyAgICBjYXNlICJubyI6IHJldHVybiAibm9yZG9zdGVuIjsKKyAgICBjYXNlICJvYiI6IHJldHVybiAib2JlbiI7CisgICAgY2FzZSAidSI6IHJldHVybiAidW50ZW4iOworICB9CisgIC8vIFRlc3QgYXVmIEFsaWFzCisgIHN0cmluZyBvdXRwdXQgPSAiIjsKKyAgc3RyaW5nKiBpbnB1dCA9IGV4cGxvZGUoc3RyLCIgIik7CisgIGludCBpbnB1dF9zaXplID0gc2l6ZW9mKGlucHV0KTsKKyAgbWl4ZWQgYWxpYXMgPSBhbGlhc2VzW2lucHV0WzBdXTsKKyAgaWYgKCFhbGlhcykKKyAgICByZXR1cm4gc3RyOworICBmb3JlYWNoIChtaXhlZCBhOmFsaWFzKQorICB7CisgICAgaWYgKCFpbnRwKGEpKQorICAgICAgb3V0cHV0ICs9IGE7CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmIChhID49IDApCisgICAgICB7CisgICAgICAgIGlmIChpbnB1dF9zaXplID4gYSkKKyAgICAgICAgICBvdXRwdXQgKz0gaW5wdXRbYV07CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGEgPSAtYTsKKyAgICAgICAgaWYgKGlucHV0X3NpemUgPiBhKQorICAgICAgICAgIG91dHB1dCArPSBpbXBsb2RlKGlucHV0W2EuLl0sIiAiKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgb3V0cHV0ID0gX3NpbmdsZV9zcGFjZXMob3V0cHV0KTsKKyAgc3RyID0gdHJpbShvdXRwdXQsVFJJTV9SSUdIVCk7CisgIGlmIChzaG93X3Byb2Nlc3Npbmc+MSkKKyAgICBwcmludGYoIlslc11cbiIsc3RyKTsKKyAgcmV0dXJuIHN0cjsKK30KKworLyoqIEJlaGFuZGVsdCBhbGxlIFNvbmRlcmZhZWxsZSBkZXIgRWluZ2FiZSBkZXMgU3BpZWxlcnMKKyAgQWxsZSBCZWZlaGxlIGRlcyBTcGllbGVycywgZGllIG5pY2h0IGR1cmNoIE9iamVrdGUgYmVoYW5kZWx0CisgIHdlcmRlbiBzb2xsZW4sIHdlcmRlbiBoaWVyIGVya2FubnQgdW5kIGF1c2dlZnVlaHJ0LgorICBEYXp1IGdlaG9lcnQgYXVjaCBkaWUgSW50ZXJwcmV0YXRpb24gdm9uIEFsaWFzZXMgdW5kIEhpc3RvcnktCisgIGJlZmVobGVuLgorICBccGFyYW1baW5dIHN0ciBzdHJpbmc6IEtvbW1hbmRvIGRlcyBTcGllbGVycworICBccmV0dXJuIGF1c3p1ZnVlaHJlbmRlcyBLb21tYW5kbworICAgIG9kZXIgMCBmdWVyIGVpbiBuaWNodCBpbnRlcnByZXRpZXJiYXJlcyBLb21tYW5kbworICAgIG9kZXIgMSBmdWVyIGVpbiBiZXJlaXRzIGR1cmNoZ2VmdWVocnRlcyBLb21tYW5kbworKi8KK21peGVkIG1vZGlmeV9jb21tYW5kKHN0cmluZyBzdHIpCit7CisKKyAgaWYgKGV4dGVybl9jYWxsKCkgJiYgcHJldmlvdXNfb2JqZWN0KCkgJiYKKyAgICAgIChwcmV2aW91c19vYmplY3QoKSE9dGhpc19vYmplY3QoKSB8fCBwcm9jZXNzX2NhbGwoKSkgKQorICB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLyBMZWVyemVpY2hlbiBhbiBkZW4gRW5kZW4gYWJzY2huZWlkZW4uCisgIHN0ciA9IHRyaW0oc3RyLCBUUklNX0JPVEgpOworCisgIGlmIChiYikKKyAgICBCQk1BU1RFUi0+QkJXcml0ZSh0cmltKHN0cixUUklNX1JJR0hULCJcbiIpLCAwKTsKKworICBkZWNheV9hdmVyYWdlKCk7CisgIGNtZHNfcGVyX3RpbWUrPTEwMDAwOworCisgIHVucGFyc2VkX2FyZ3NbMF09dW5wYXJzZWRfYXJnc1sxXT11bnBhcnNlZF9hcmdzWzJdPXVubW9kaWZpZWQ9IiI7IAorCisgIGlmICghc2l6ZW9mKHN0cikpIHJldHVybiAiIjsKKworICAvLyBLb21tYW5kbyB3aXJkIGdlcGFyc3QKKyAgdW5tb2RpZmllZD1wYXJzZWNvbW1hbmQoc3RyKTsKKworICAvLyBFbnZpcm9ubWVudCBzY2hvbm1hbCBtZXJrZW4uCisgIGxhc3RfY29tbWFuZF9lbnY9ZW52aXJvbm1lbnQoKTsKKworICBpZiAodW5tb2RpZmllZCA9PSAiIikKKyAgICAgIHJldHVybiAiIjsKKyAgLy8gS29tbWFuZG8gaW4gSGlzdG9yeSBtZXJrZW4sIGF1Y2ggd2VubiBlcyBpbSBLb21tYW5kb2Jsb2NrIGFiZ2Vicm9jaGVuCisgIC8vIHdpcmQuCisgIEFkZEhpc3RvcnkodW5tb2RpZmllZCk7CisKKyAgLy8gcHJ1ZWZlbiwgb2IgS29tbWFuZG9ibG9jayBnZXNldHp0IGlzdC4KKyAgLy8gKEZ1ZXIgTWFnaWVyIG1pdCBtc2NoYXUgZWluIHdpcmQgZGFzIGlnbm9yaWVydC4pCisgIC8vIEJUVzogRXMgd2lyZCBhYnNpY2h0bGljaCBuaWNodCBkYXMgRXJnZWJuaXMgZGVyIENsb3N1cmUgenVydWVja2dlZ2ViZW4sCisgIC8vIHNvbnN0IHd1ZXJkZSBtYW4gYmVsaWViaWdlbiBPYmpla3RlbiBuaWNodCBudXIgZGFzIEFiYnJlY2hlbiwgc29uZGVybgorICAvLyBhdWNoIGRhcyBBZW5kZXJuIHZvbiBLb21tYW5kb3MgZXJtb2VnbGljaGVuLgorICBpZiAoZGlzYWJsZWNvbW1hbmRzICYmICFJU19MRUFSTklORyhNRSkgKQorICB7CisgICAgaWYgKGRpc2FibGVjb21tYW5kc1tCX1RJTUVdID49IHRpbWUoKQorICAgICAgJiYgb2JqZWN0cChkaXNhYmxlY29tbWFuZHNbQl9PQkpFQ1RdKSkKKyAgICB7CisgICAgICAvLyBkaXNhYmxlY29tbWFuZHMgdmFsaWQKKyAgICAgIC8vIGhhcnQta29kaWVydGUgQXVzbmFtZWxpc3RlIHBydWVmZW4KKyAgICAgIGlmICggbWVtYmVyKCh7Im1ydWZlIiwibXNjaGF1IiwiYnVnIiwiaWRlZSIsInR5cG8iLCJkZXRhaWwifSksCisgICAgICAgICAgICBleHBsb2RlKHN0ciwiICIpWzBdKSA9PSAtMSkKKyAgICAgIHsKKyAgICAgICAgaWYgKGNsb3N1cmVwKGRpc2FibGVjb21tYW5kc1tCX1ZBTFVFXSkpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZnVuY2FsbChkaXNhYmxlY29tbWFuZHNbQl9WQUxVRV0sX3JldHVybl9hcmdzKHVubW9kaWZpZWQpKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvLyBOb24temVybyBDbG9zdXJlLUVyZ2VibmlzLCBBYmJydWNoLiBEaWUgZ2VydWZlbmUgRnVua3Rpb24gaXN0CisgICAgICAgICAgICAvLyBmdWVyIGVpbmUgZ2VlaWduZXRlIE1lbGR1bmcgYW4gZGVuIFNwaWVsZXIgdmVyYW50d29ydGxpY2guCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gd2VubiBUZXh0LCBkYW5uIGF1Y2ggcHJ1ZWZlbiwgb2IgZGFzIEtvbW1hbmRvdmVyYiBpbiBkZW4gQXVzbmFobWVuCisgICAgICAgIC8vIHN0ZWh0LiAocXVlcnlfdmVyYigpIGdlaHQgbGVpZGVyIGhpZXIgbm9jaCBuaWNodC4pCisgICAgICAgIGVsc2UgaWYgKHN0cmluZ3AoZGlzYWJsZWNvbW1hbmRzW0JfVkFMVUVdKQorICAgICAgICAgICAgICAgICAmJiBtZW1iZXIoZGlzYWJsZWNvbW1hbmRzW0JfRVhDRVBUSU9OU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBsb2RlKHN0ciwiICIpWzBdKSA9PSAtMSkKKyAgICAgICAgeworICAgICAgICAgIC8vIG1lbGR1bmcgYXVzZ2ViZW4uLi4KKyAgICAgICAgICB0ZWxsX29iamVjdChQTCwgZGlzYWJsZWNvbW1hbmRzW0JfVkFMVUVdKTsKKyAgICAgICAgICAvLyB1bmQgRW5kZS4uLgorICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UgZGlzYWJsZWNvbW1hbmRzPTA7CisgIH0KKworICAvLyBWZXJmb2xnZXIgZGlyZWt0IGlucyBFbnYgcmVpbmhvbGVuLgorICBpZiAocmVtb3ZlX2NhbGxfb3V0KCJUYWtlRm9sbG93ZXJzIik+PTApCisgICAgY2F0Y2goVGFrZUZvbGxvd2VycygpO3B1Ymxpc2gpOworCisgIERlbGF5UHJlcGFyZWRTcGVsbHMoKTsKKworICAvLyBIaXN0b3J5ZWludHJhZyBrb3JyaWdpZXJlbgorICBpZiAodW5tb2RpZmllZFswXT09J14nKQorICB7CisgICAgc3RyaW5nICpvbGRuZXcscHJlLHBvc3Q7CisgICAgaWYgKHNpemVvZihvbGRuZXc9ZXhwbG9kZSh1bm1vZGlmaWVkLCJeIikpPjIpCisgICAgeworICAgICAgaW50IGhpc3RfaWR4ID0gKGhpc3Rfbm93LTEpJWhpc3Rfc2l6ZTsKKyAgICAgIHNzY2FuZihoaXN0b3J5W2hpc3RfaWR4XSwiJXMiK29sZG5ld1sxXSsiJXMiLCBwcmUsIHBvc3QpOworICAgICAgdW5tb2RpZmllZCA9IHByZStvbGRuZXdbMl0rcG9zdDsKKyAgICAgIGlmIChzaG93X3Byb2Nlc3NpbmcpCisgICAgICAgIHdyaXRlKCJbIit1bm1vZGlmaWVkKyJdXG4iKTsKKyAgICAgIC8vIGtvcnJpZ2llcnRlcyBLb21tYW5kbyBuYXR1ZXJsaWNoIGF1Y2ggaW4gZGllIEhpc3RvcnkuCisgICAgICBBZGRIaXN0b3J5KHVubW9kaWZpZWQpOworICAgIH0KKyAgfQorCisgIGlmKCBiYiApCisgICAgQkJNQVNURVItPkJCV3JpdGUoIiAtPiAiICsgdW5tb2RpZmllZCwgMSk7CisKKyAgaWYgKHNob3dfcHJvY2Vzc2luZz4xKQorICAgIHByaW50ZigiWyVzXVxuIix1bm1vZGlmaWVkKTsKKworICBtaXhlZCByZXQgPSBfcmV0dXJuX2FyZ3ModW5tb2RpZmllZCk7CisKKyAgLy8gd2VubiBTcGllbGVyIGVpbmdld2lsbGlndCBoYXQgdW5kIGRpZSBTeW50YXhEQiBnZWxhZGVuIGlzdCwgQmVmZWhsCisgIC8vIGRvcnRoaW4gbWVsZGVuLgorICBpZiAoc3ludGF4ZGIpCisgIHsKKyAgICBpZiAoIW9iamVjdHAoc3ludGF4ZGJbMF0pKQorICAgICAgc3ludGF4ZGJbMF0gPSBmaW5kX29iamVjdCgiL3NlY3VyZS9zeW50YXhkYiIpOworICAgIGlmIChzeW50YXhkYlswXSkKKyAgICAgIGNhdGNoKHN5bnRheGRiWzBdLT5zdGFydF9jbWQodW5tb2RpZmllZCk7bm9sb2cpOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZG9fbGlzdChzdHJpbmcgc3RyKQoreworICBzdHJpbmcgKmNtZGxpc3Q7CisgIGludCBpOworCisgIGlmICghUXVlcnlQcm9wKFBfV0FOVFNfVE9fTEVBUk4pKQorICAgIHJldHVybiAwOworICBjbWRsaXN0PW9sZF9leHBsb2RlKF91bnBhcnNlZF9hcmdzKCl8fCIiLCI7IiktKHsgIiIgfSk7CisgIGZvciAoaT0wO2k8c2l6ZW9mKGNtZGxpc3QpO2krKykKKyAgeworICAgIGNtZGxpc3RbaV09aW1wbG9kZShvbGRfZXhwbG9kZShjbWRsaXN0W2ldLCIgIiktKHt9KSwgIiAiKTsKKyAgICBpZiAoc2hvd19wcm9jZXNzaW5nKQorICAgICAgd3JpdGUoIlsiK2NtZGxpc3RbaV0rIl1cbiIpOworICAgIGNvbW1hbmQoY21kbGlzdFtpXSk7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8vZmFsbHMgZGllIGFsaWFzbGlzdGUga2FwdXR0IGlzdCAuLi4KKworaW50IHVuYWxpYXNfYWxsKCkKK3sKKyAgaWYgKElTX0VMREVSKHRoaXNfaW50ZXJhY3RpdmUoKSkpIGFsaWFzZXM9KFtdKTsKKyAgcmV0dXJuIDE7Cit9CisKK29iamVjdCBfcXVlcnlfbGFzdF9jb21tYW5kX2VudigpCit7CisgIHJldHVybiBsYXN0X2NvbW1hbmRfZW52OworfQorCitpbnQgX3F1ZXJ5X3Nob3dfYWxpYXNfcHJvY2Vzc2luZygpCit7CisgIHJldHVybiBzaG93X3Byb2Nlc3Npbmc7Cit9CisKK2ludCBfcXVlcnlfaGlzdG1pbigpCit7CisgIHJldHVybiBoaXN0bWluOworfQorCit2YXJhcmdzIHZvaWQgQWRkQWN0aW9uKG1peGVkIGZ1biwgbWl4ZWQgY21kLCBpbnQgZmxhZywgaW50IGx2bCkKK3sKKyAgaW50IGk7CisgIG1peGVkICpjbWRzOworCisgIGxvZ19maWxlKCAiQVJDSC9BRERfQUNUSU9OIiwgc3ByaW50ZigKKwkiJXM6XG4gIFRPOiAlTyBUUDogJU8gUE86ICVPXG4gICBmdW46ICVPIGNtZDogJU8gZmxhZzogJU8gbHZsOiAlTyIsCisgICAgICAgIGR0aW1lKHRpbWUoKSksIHRoaXNfb2JqZWN0KCksIHRoaXNfcGxheWVyKCksIHByZXZpb3VzX29iamVjdCgpLAorCWZ1biwgY21kLCBmbGFnLCBsdmwpKTsKKworICBpZiAoIShjbWRzPVF1ZXJ5KFBfTE9DQUxDTURTKSkpIGNtZHM9KHt9KTsKKworICBpZiAoIXBvaW50ZXJwKGNtZCkpIGNtZD0oe2NtZH0pOworCisgIGZvciAoaSA9IHNpemVvZihjbWQpLTE7IGk+PTA7IGktLSkKKyAgICBjbWRzICs9ICh7KHsgY21kW2ldICwgZnVuLCBmbGFnLCBsdmx9KX0pOworCisgIFNldChQX0xPQ0FMQ01EUywgY21kcyk7Cit9CisKK3N0YXRpYyBpbnQgYXVzd2VydGVuKG1peGVkIGNtZCwgc3RyaW5nIHN0cikKK3sKKyAgaWYgKGNsb3N1cmVwKGNtZCkpCisgICAgcmV0dXJuIGZ1bmNhbGwoY21kLHN0cik7CisgIGlmIChzdHJpbmdwKGNtZCkpCisgICAgcmV0dXJuIGNhbGxfb3RoZXIodGhpc19vYmplY3QoKSxjbWQsc3RyKTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2YXJhcmdzIGludCBfX2F1c3dlcnRlbihzdHJpbmcgc3RyLCBzdHJpbmcgaW50ZXJuKQoreworICBzdHJpbmcgdmVyYjsKKyAgbWl4ZWQgKmNtZCwgY21kczsKKyAgaW50IGkscmV0LGx2bCxsLHZsOworCisgIGlmICghaW50ZXJuKQorICAgIHZlcmI9cXVlcnlfdmVyYigpOworICBlbHNlCisgICAgdmVyYj1pbnRlcm47CisgIGx2bD1xdWVyeV93aXpfbGV2ZWwoTUUpOworICB2bD1zaXplb2YodmVyYik7CisgIGNtZHM9UXVlcnlQcm9wKFBfTE9DQUxDTURTKTsKKworICBmb3IoaT1zaXplb2YoY21kcyktMTtpPj0wO2ktLSkKKyAgeworICAgIGNtZD1jbWRzW2ldLGw9c2l6ZW9mKGNtZFswXSk7CisgICAgaWYgKGNtZFswXT09dmVyYlswLi5sLTFdICYmIGNtZFszXTw9bHZsICYmIChjbWRbMl18fHZsPT1sKSAmJgorICAocmV0PWF1c3dlcnRlbihjbWRbMV0sc3RyKSkpCisgICAgICByZXR1cm4gcmV0OworICB9CisgIC8vIEFuIGRpZXNlciBTdGVsbGUgZ2lidCBlcyBoaWVyIHVuZCB2ZXJtdXRsaWNoIG5pcmdlbmR3byBhbmRlcnMgZXR3YXMsIHdhcworICAvLyBkaWVzZXMgS29tbWFuZG8gYWxzIGd1ZWx0aWcgYmV0cmFjaHRldC4gV2lyIGluZm9ybWllcmVuIGdnZi4gZGllCisgIC8vIFN5bnRheC1EQi4gKEFjaHR1bmc6IHdlbm4gamVtYW5kIG5lIGFkZF9hY3Rpb24oKSBpbSBTcGllbGVyb2JqZWt0CisgIC8vIGVpbmJhdXQsIGRpZSB2b3IgZGllc2VyIGVpbmdldHJhZ2VuIHdpcmQsIGlzdCBkaWUgQW5uYWhtZSBnZ2YuIGZhbHNjaC4pCisgIC8vIHdlbm4gU3BpZWxlciBlaW5nZXdpbGxpZ3QgaGF0IHVuZCBkaWUgU3ludGF4REIgZ2VsYWRlbiBpc3QsIEJlZmVobAorICAvLyBkb3J0aGluIG1lbGRlbi4KKyAgaWYgKHN5bnRheGRiKQorICB7CisgICAgaWYgKCFvYmplY3RwKHN5bnRheGRiWzBdKSkKKyAgICAgIHN5bnRheGRiWzBdID0gZmluZF9vYmplY3QoIi9zZWN1cmUvc3ludGF4ZGIiKTsKKyAgICBpZiAoc3ludGF4ZGJbMF0pCisgICAgICBjYXRjaChzeW50YXhkYlswXS0+Y21kX3Vuc3VjY2Vzc2Z1bCgpO25vbG9nKTsKKyAgfQorCisgIHJldHVybiAwOworfQorCitwdWJsaWMgdm9pZCBzeW50YXhfbG9nX2VwKGludCB0eXBlKQoreworICAvLyB3ZW5uIFNwaWVsZXIgZWluZ2V3aWxsaWd0IGhhdCB1bmQgZGllIFN5bnRheERCIGdlbGFkZW4gaXN0LCBCZWZlaGwKKyAgLy8gZG9ydGhpbiBtZWxkZW4uCisgIGlmIChzeW50YXhkYiAmJiBzeW50YXhkYlswXSkKKyAgeworICAgICAgY2F0Y2goc3ludGF4ZGJbMF0tPkxvZ0VQKHR5cGUpO25vbG9nKTsKKyAgfQorfQorCitzdGF0aWMgbWl4ZWQgX3F1ZXJ5X2xvY2FsY21kcygpCit7CisgIG1peGVkICpsOworCisgIGw9UXVlcnkoUF9MT0NBTENNRFMpOworICBpZiAoIXBvaW50ZXJwKGwpKQorICAgIGw9KHt9KTsKKyAgcmV0dXJuICh7CisgICAgKHsiYWxpIiwiYWxpYXMiLDAsMH0pLAorICAgICh7ImFsaWFzIiwiYWxpYXMiLDAsMH0pLAorICAgICh7InVuYWxpIiwidW5hbGlhcyIsMSwwfSksCisgICAgKHsiaGlzdG1pbiIsImhpc3RtaW4iLDAsMH0pLAorICAgICh7Imhpc3RsZW4iLCJoaXN0bGVuIiwwLDB9KSwKKyAgICAoeyJoaXN0Iiwic2hvd19oaXN0IiwwLDB9KSwKKyAgICAoeyJoaXN0b3J5Iiwic2hvd19oaXN0IiwwLDB9KSwKKyAgICAoeyJkbyIsImRvX2xpc3QiLDAsTEVBUk5FUl9MVkx9KSwKKyAgICAoeyJlcnNldHp1bmdzYW56ZWlnZSIsInJlcGxhY2VkaXNwbGF5IiwwLDB9KSwKKyAgICAoeyJzeW50YXhzYW1tbHVuZyIsImNvbGxlY3RfY21kcyIsMCwwfSksCisgICAgKHsiZmVobGVybWVsZHVuZyIsInNldF9lcnJvcm1lc3NhZ2UiLDAsU0VFUl9MVkx9KSwKKyAgfSkrbDsKK30KKworc3RhdGljIGludCBjb2xsZWN0X2NtZHMoc3RyaW5nIGNtZCkKK3sKKyAgaWYgKCFzdHJpbmdwKGNtZCkpCisgIHsKKyAgICBfbm90aWZ5KCJNaXQgZGllc2VtIEJlZmVobCBrYW5uc3QgRHUgbWl0aGVsZmVuLCBTeW50YXhlbiBpbSBNRyB6dSAiCisgICAgICAgICAgICAidmVyYmVzc2Vybi4gV2VubiBEdSBlaW52ZXJzdGFuZGVuIGJpc3QsIHNwZWljaGVybiB3aXIgIgorICAgICAgICAgICAgImFub255bSAoZC5oLiBvaG5lIERlaW5lbiBDaGFybmFtZW4pLCB3ZWxjaGUgRGVpbmVyIEJlZmVobGUgIgorICAgICAgICAgICAgImVyZm9sZ3JlaWNoIHVuZCBuaWNodCBlcmZvbGdyZWljaCB3YXJlbi4gVWVibGljaGUgIgorICAgICAgICAgICAgIktvbW11bmlrYXRpb25zYmVmZWhsZSB3ZXJkZW4gZGFiZWkgbmljaHQgZ2VzcGVpY2hlcnQuIiwKKyAgICAgICAgICAgIDApOworICAgIF9ub3RpZnkoIk1pdCAnc3ludGF4c2FtbWx1bmcgamEnIGthbm5zdCBEdSBkaWUgU3BlaWNoZXJ1bmcgZWluc2NoYWx0ZW4sICIKKyAgICAgICAgICAgICJtaXQgJ3N5bnRheHNhbW1sdW5nIG5laW4nIGthbm5zdCBEdSBzaWUgYXVzc2NoYWx0ZW4uIiwwKTsKKyAgICBfbm90aWZ5KCJEZWluZSBCZWZlaGxlIHdlcmRlbiB6dXIgWmVpdCIKKyAgICAgICAgICAgICsgKFF1ZXJ5UHJvcCgiX3N5bnRheGRiIikgPyAiICIgOiAiIE5JQ0hUICIpCisgICAgICAgICAgICArICJnZXNwZWljaGVydC4iLCAwKTsKKyAgfQorICBlbHNlIGlmIChjbWQgPT0gImphIikKKyAgeworICAgIFNldFByb3AoIl9zeW50YXhkYiIsIDEpOworICAgIF9ub3RpZnkoIkFiIGpldHp0IHdlcmRlbiBEZWluZSBCZWZlaGxlIGdlc3BlaWNoZXJ0LiBWaWVsZW4gRGFuayEiLCAwKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBTZXRQcm9wKCJfc3ludGF4ZGIiLCAwKTsKKyAgICBfbm90aWZ5KCJBYiBqZXR6dCB3ZXJkZW4gRGVpbmUgQmVmZWhsZSBOSUNIVCBnZXNwZWljaGVydC4iLCAwKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworaW50IF9xdWVyeV9jb21tYW5kX2F2ZXJhZ2UoKQoreworICBkZWNheV9hdmVyYWdlKCk7CisgIHJldHVybiBjbWRzX3Blcl90aW1lOworfQorCitub21hc2sgdm9pZCBfX3NldF9iYihpbnQgZmxhZykgIHsKKyAgaWYoIHByZXZpb3VzX29iamVjdCgpIT1maW5kX29iamVjdChCQk1BU1RFUikgfHwgcHJvY2Vzc19jYWxsKCkgKQorICAgIHJldHVybjsKKyAgYmI9ZmxhZzsKK30KKworCitub21hc2sgcHVibGljIHZvaWQgY291bnRDbWRzKCBpbnQgdHlwZSwgc3RyaW5nIGtleSApCit7CisgICAgc3RyaW5nIHRtcDsKKworICAgIGlmICggdGhpc19wbGF5ZXIoKSAhPSB0aGlzX2ludGVyYWN0aXZlKCkKKyAgICAgICAgIHx8IHRoaXNfaW50ZXJhY3RpdmUoKSAhPSB0aGlzX29iamVjdCgpCisgICAgICAgICB8fCBtZW1iZXIoIGNtZF90eXBlcywgdHlwZSApIDwgMCApCisgICAgICAgIHJldHVybjsKKworICAgIHRtcCA9IHNwcmludGYoICIlZFxuJXMiLCB0eXBlLCBrZXkgKTsKKworICAgIGNvbW1hbmRzIC09ICh7IHRtcCB9KTsKKyAgICBjb21tYW5kcyArPSAoeyB0bXAgfSk7CisgICAgY29tbWFuZHMgPSBjb21tYW5kc1swLi5tYXhfY29tbWFuZHMtMV07Cit9CisKKworbm9tYXNrIHB1YmxpYyBzdHJpbmcgKmdldENtZHMoKQoreworICAgIHN0cmluZyAqdG1wOworCisgICAgaWYgKCBwcmV2aW91c19vYmplY3QoKSAhPSBmaW5kX29iamVjdChCQk1BU1RFUikgKQorICAgICAgICByZXR1cm4gKHt9KTsKKworICAgIHRtcCA9IGNvbW1hbmRzOworICAgIGNvbW1hbmRzID0gKHt9KTsKKworICAgIHJldHVybiB0bXA7Cit9CisKKy8qCisgKiBGb3JjZSB0aGUgbW9uc3RlciB0byBkbyBhIGNvbW1hbmQuIFRoZSBmb3JjZV91cygpIGZ1bmN0aW9uIGlzbid0CisgKiBhbHdheXMgZ29vZCwgYmVjYXVzZSBpdCBjaGVja3MgdGhlIGxldmVsIG9mIHRoZSBjYWxsZXIsIGFuZCB0aGlzIGZ1bmN0aW9uCisgKiBjYW4gYmUgY2FsbGVkIGJ5IGEgcm9vbS4KKyAqLworaW50IGNvbW1hbmRfbWUoc3RyaW5nIGNtZCkKK3sKKyAgaWYgKElTX0xFQVJORVIoTUUpKQorICB7CisgICAgaWYgKCF0aGlzX2ludGVyYWN0aXZlKCkgfHwgIXByZXZpb3VzX29iamVjdCgpKQorICAgICAgcmV0dXJuIDA7CisgICAgaWYoIGdldGV1aWQoTUUpIT1nZXRldWlkKHRoaXNfaW50ZXJhY3RpdmUoKSkKKyAgICAgICAgfHwgZ2V0ZXVpZChNRSkhPWdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpICkKKyAgICB7CisgICAgICBpZiggcXVlcnlfd2l6X2xldmVsKE1FKTxxdWVyeV93aXpfbGV2ZWwocHJldmlvdXNfb2JqZWN0KCkpKQorICAgICAgICB0ZWxsX29iamVjdChNRSxwcmV2aW91c19vYmplY3QoKS0+bmFtZSgpKyIgendpbmd0IERpY2ggenU6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBjbWQgKyAiLlxuIik7CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHRlbGxfb2JqZWN0KE1FLHByZXZpb3VzX29iamVjdCgpLT5uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIHZlcnN1Y2h0LCBEaWNoIHp1ICIgKyBjbWQgKyAiIHp1IHp3aW5nZW4uXG4iICk7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gY29tbWFuZChjbWQpOworfQorCisKK3N0YXRpYyBtaXhlZCBfcXVlcnlfcF9saWJfZGlzYWJsZWNvbW1hbmRzKCkgeworICAgIC8vIGFiZ2VsYXVmZW4gb2RlciBPYmpla3QgemVyc3RvZXJ0PyBXZWcgZGFtaXQuCisgICAgaWYgKHBvaW50ZXJwKGRpc2FibGVjb21tYW5kcykKKyAgICAgICAgJiYgKGRpc2FibGVjb21tYW5kc1tCX1RJTUVdIDwgdGltZSgpCisgICAgICAgICAgfHwgIW9iamVjdHAoZGlzYWJsZWNvbW1hbmRzW0JfT0JKRUNUXSkpICkKKyAgICAgICAgcmV0dXJuKGRpc2FibGVjb21tYW5kcyA9IDApOworCisgICAgLy8gc29uc3QgS29waWUgenVydWVjayAoY29weSgwKSBnZWh0KQorICAgIHJldHVybihjb3B5KGRpc2FibGVjb21tYW5kcykpOworfQorCitzdGF0aWMgbWl4ZWQgX3NldF9wX2xpYl9kaXNhYmxlY29tbWFuZHMobWl4ZWQgZGF0YSkgeworCisgIC8vIHNldHplbmRlcyBPYmpla3QgZXJtaXR0ZWxuLCBkYSBkaWVzZSBGdW5rdGlvbiBudXIgcGVyIFNldFByb3AoKSBnZXJ1ZmVuCisgIC8vIHdlcmRlbiBzb2xsdGUgKCEpLCBpc3QgZGFzIFBPKDEpOworICBvYmplY3Qgb3JpZ2luID0gcHJldmlvdXNfb2JqZWN0KDEpOworICAvLyB3ZW5uIG5pY2h0IGV4aXN0ZW50LCBkaXJla3QgYWJicnVjaAorICBpZiAoIW9iamVjdHAob3JpZ2luKSkKKyAgICByZXR1cm4gX3F1ZXJ5X3BfbGliX2Rpc2FibGVjb21tYW5kcygpOworCisgIC8vIFByb3AgbG9lc2NoZW4/IEV4cGxpeml0IGxvZXNjaGVuIGRhcmYgamVkZXIsIGFsbGVyZGluZ3MgbmljaHQgZGlyZWt0CisgIC8vIHVuZ2VwcnVlZnQgdWViZXJzY2hyZWliZW4uCisgIGlmICghZGF0YSkgeworICAgICAgcmV0dXJuIChkaXNhYmxlY29tbWFuZHMgPSAwICk7CisgIH0KKyAgLy8gbWFsIGRpcmVrdCBidWdnZW4gYmVpIGZhbHNjaGVuIERhdGVudHlwLCBkYW1pdHMgYXVmZmFlbGx0LgorICBpZiAoIXBvaW50ZXJwKGRhdGEpIHx8IHNpemVvZihkYXRhKSA8IDIgfHwgIWludHAoZGF0YVswXSkKKyAgICAgIHx8ICghc3RyaW5ncChkYXRhWzFdKSAmJiAhY2xvc3VyZXAoZGF0YVsxXSkpCisgICAgICB8fCAoc2l6ZW9mKGRhdGEpID49IDMgJiYgIXBvaW50ZXJwKGRhdGFbMl0pKSApCisgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKAorICAgICAgICAgICAgIldyb25nIGRhdGEgdHlwZSBmb3IgUF9ESVNBQkxFX0NPTU1BTkRTLiBFeHBlY3RlZCBBcnJheSB3aXRoICIKKyAgICAgICAgICAgICIyIG9yIDMgZWxlbWVudHMgKGludCwgc3RyaW5nfGNsb3N1cmUsIFtzdHJpbmcqXSksIGdvdCAlLjI1T1xuIiwKKyAgICAgICAgICAgIGRhdGEpKTsKKworICAvLyBXZW5uIGFiZ2VsYXVmZW4gb2RlciBnbGVpY2hlcyBPYmpla3Qgd2llIGxldHp0ZXMgTWFsOiBlaW50cmFnZW4uCisgIGlmICghZGlzYWJsZWNvbW1hbmRzIHx8IChkaXNhYmxlY29tbWFuZHNbQl9USU1FXSA8IHRpbWUoKQorICAgICAgICB8fCAhb2JqZWN0cChkaXNhYmxlY29tbWFuZHNbQl9PQkpFQ1RdKSAKKyAgICAgICAgfHwgZGlzYWJsZWNvbW1hbmRzW0JfT0JKRUNUXSA9PSBvcmlnaW4pICkgeworICAgICAgLy8gTG9nZ2VuIG51ciwgd2VubiBlaW5lIENsb3N1cmUgZWluZ2V0cmFnZW4gd2lyZC4gUmVkdXppZXJ0IGRlbgorICAgICAgLy8gTG9nc2Nyb2xsIHVuZCBTdHJpbmdzIGhhYmVuIGRldXRsaWNoIHdlbmlnZXIgTWlzc2JyYXVjaHNwb3RlbnRpYWwuCisgICAgICBpZiAoY2xvc3VyZXAoZGF0YVsxXSkpIHsKKyAgICAgICAgQ0JMT0coc3ByaW50ZigiWyVzXSBDQiBnZXNldHp0IHZvbiAlTywgZ3VlbHRpZyBiaXMgJXMsIERhdGVuOiAlT1xuIiwKKyAgICAgICAgc3RyZnRpbWUoIiVZJW0lZC0lSDolTTolUyIpLG9yaWdpbiwKKyAgICAgICAgc3RyZnRpbWUoIiVZJW0lZC0lSDolTTolUyIsZGF0YVswXSksCisgICAgICAgIChzdHJpbmdwKGRhdGFbMV0pID8gcmVncmVwbGFjZShkYXRhWzFdLCJcbiIsIlxcbiIsMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkYXRhWzFdKSkpOworICAgICAgfQorICAgICAgaWYgKHNpemVvZihkYXRhKSsxIDw9IEJfRVhDRVBUSU9OUykKKyAgICAgICAgZGlzYWJsZWNvbW1hbmRzID0gKHsgb3JpZ2luLCBkYXRhWzBdLCBkYXRhWzFdLCAoe30pIH0pOworICAgICAgZWxzZQorICAgICAgICBkaXNhYmxlY29tbWFuZHMgPSAoeyBvcmlnaW4sIGRhdGFbMF0sIGRhdGFbMV0sIGRhdGFbMl0gfSk7CisgICAgICByZXR1cm4oY29weShkaXNhYmxlY29tbWFuZHMpKTsKKyAgfQorCisgIHJldHVybihfcXVlcnlfcF9saWJfZGlzYWJsZWNvbW1hbmRzKCkpOworfQorCitzdGF0aWMgbWl4ZWQgX3NldF9fc3ludGF4ZGIobWl4ZWQgdikKK3sKKyAgU2V0KCJfc3ludGF4ZGIiLCB2LCBGX1ZBTFVFKTsKKyAgaWYgKHYpCisgICAgICBzeW50YXhkYiA9ICh7ZmluZF9vYmplY3QoIi9zZWN1cmUvc3ludGF4ZGIiKX0pOworICBlbHNlCisgICAgICBzeW50YXhkYiA9IDA7CisgIHJldHVybiBRdWVyeVByb3AoIl9zeW50YXhkYiIpOworfQorCmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL2Rlc2NyaXB0aW9uLmMgYi9zdGQvcGxheWVyL2Rlc2NyaXB0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEwNjYzZgotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvZGVzY3JpcHRpb24uYwpAQCAtMCwwICsxLDI5MiBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHBsYXllci9kZXNjcmlwdGlvbi5jIC0tIHBsYXllciBkZXNjcmlwdGlvbiBoYW5kbGluZworLy8KKy8vICRJZDogZGVzY3JpcHRpb24uYyA4NzU1IDIwMTQtMDQtMjYgMTM6MTM6NDBaIFplc3N0cmEgJAorI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCitpbmhlcml0ICIvc3RkL2xpdmluZy9kZXNjcmlwdGlvbiI7CisKKyNpbmNsdWRlIDx0aGluZy9sYW5ndWFnZS5oPgorI2luY2x1ZGUgPHBsYXllci9kZXNjcmlwdGlvbi5oPgorI2luY2x1ZGUgPGxpdmluZy9jbG90aGluZy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8Y29tYmF0Lmg+CisjaW5jbHVkZSA8c3lzX2RlYnVnLmg+CisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8cGxheWVyL2NvbW1hbmQuaD4KKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgOjpjcmVhdGUoKTsKKyAgU2V0KFBfTkFNRSwgTk9TRVRNRVRIT0QsIEZfU0VUX01FVEhPRCk7CisgIFNldChQX1BSRVNBWSwgU0FWRSwgRl9NT0RFX0FTKTsKKyAgU2V0KFBfVElUTEUsIFNBVkUsIEZfTU9ERV9BUyk7CisgIFNldChQX0VYVFJBX0xPT0ssIFNBVkUsIEZfTU9ERV9BUyk7CisgIFNldChQX0dFTkRFUiwgU0FWRSwgRl9NT0RFX0FTKTsKKyAgU2V0KFBfU0laRSwgU0FWRSwgRl9NT0RFX0FTKTsKKyAgU2V0KFBfSU5GTywgTk9TRVRNRVRIT0QsIEZfU0VUX01FVEhPRCk7CisgIC8vIEF2YXRhci1VUklzIHNwZWljaGVybi4gQXVzc2VyZGVtIGhhdCBhbiBkZW5lbiBrZWluZXIgcnVtenVmdW1tZWxuLgorICBTZXQoUF9BVkFUQVJfVVJJLCBTQVZFfFNFQ1VSRUQsIEZfTU9ERV9BUyk7Cit9CisKK3N0cmluZyBfcXVlcnlfaW5mbygpCit7CisgIHN0cmluZyBpbmZvOworICBpbmZvID0gUXVlcnkoUF9JTkZPKTsKKyAgaWYoIWluZm8paW5mbz09IiI7CisgIGluZm8gPSAoc3RyaW5nKXF1ZXJ5X3dpel9sZXZlbCh0aGlzX29iamVjdCgpKTsKKyAgaWYoSVNfR09EKHRoaXNfb2JqZWN0KCkpKQorICAgIHJldHVybiBpbmZvKyIgW0dvdHRdXG4iOworICBpZihJU19BUkNIKHRoaXNfb2JqZWN0KCkpKQorICAgIHJldHVybiBpbmZvKyIgW0Vyem1hZ2llcl1cbiI7CisgIGlmKElTX0VMREVSKHRoaXNfb2JqZWN0KCkpKQorICAgIHJldHVybiBpbmZvKyIgW1dlaXNlcl1cbiI7CisgIGlmKElTX0xPUkQodGhpc19vYmplY3QoKSkpCisgICAgcmV0dXJuIGluZm8rIiBbUmVnaW9uc2NoZWZdXG4iOworICBpZihJU19TUEVDSUFMKHRoaXNfb2JqZWN0KCkpKQorICAgIHJldHVybiBpbmZvKyIgW1NwZWNpYWxdXG4iOworICBpZihJU19ET01BSU5NRU1CRVIodGhpc19vYmplY3QoKSkpCisgICAgcmV0dXJuIGluZm8rIiBbUmVnaW9uc21pdGFyYmVpdGVyXVxuIjsKKyAgaWYoSVNfV0laQVJEKHRoaXNfb2JqZWN0KCkpKQorICAgIHJldHVybiBpbmZvKyIgW01hZ2llcl1cbiI7CisgIGlmKElTX0xFQVJORVIodGhpc19vYmplY3QoKSkpCisgICAgcmV0dXJuIGluZm8rIiBbTWFnaWVyYW53YWVydGVyXVxuIjsKKyAgaW5mbyA9IFF1ZXJ5UHJvcChQX0xFVkVMKTsKKyAgaWYoSVNfU0VFUih0aGlzX29iamVjdCgpKSkKKyAgICByZXR1cm4gaW5mbysiIFtTZWhlcl1cbiI7CisgIHJldHVybiBpbmZvKyIgW1NwaWVsZXJdXG4iOworfQorCitpbnQgX3F1ZXJ5X3NpemUoKSB7CisgIGlmIChRdWVyeVByb3AoUF9GUk9HKSkKKyAgICByZXR1cm4gMjA7CisgIHJldHVybiBRdWVyeShQX1NJWkUpOworfQorCisvLyBzaG9ydCgpIC0tIGdldCB0aGUgc2hvcnQgZGVzY3JpcHRpb24gb2YgYSBwbGF5ZXIKK3N0cmluZyBzaG9ydCgpCit7CisgIHN0cmluZyBhbnN3ZXI7CisgIHN0cmluZyB0aXRsZTsKKworICBpZihRdWVyeVByb3AoUF9JTlZJUykpCisgICAgaWYoaW50ZXJhY3RpdmUocHJldmlvdXNfb2JqZWN0KCkpICYmIElTX0xFQVJOSU5HKHByZXZpb3VzX29iamVjdCgpKSkKKyAgICAgIHJldHVybiAiKCIrUXVlcnlQcm9wKFBfTkFNRSkrIikgXG4iOworICAgIGVsc2UKKyAgICAgIHJldHVybiAwOworCisgIGlmKFF1ZXJ5UHJvcChQX0dIT1NUKSkKKyAgeworICAgIGlmIChRdWVyeVByb3AoUF9GUk9HKSkKKyAgICAgIHJldHVybiAiRGVyIEdlaXN0IGVpbmVzIGtsZWluZW4gRnJvc2NoZXMgbmFtZW5zICIrUXVlcnlQcm9wKFBfTkFNRSkrCisgICAgICAgIi5cbiI7CisgICAgZWxzZQorICAgICAgcmV0dXJuICJEZXIgR2Vpc3Qgdm9uICIrUXVlcnlQcm9wKFBfTkFNRSkrIi5cbiI7CisgIH0KKworICBpZiAoUXVlcnlQcm9wKFBfRlJPRykpCisgICAgcmV0dXJuICJFaW4ga2xlaW5lciBGcm9zY2ggbmFtZW5zICIrUXVlcnlQcm9wKFBfTkFNRSkrIi5cbiI7CisKKyAgYW5zd2VyID0gUXVlcnlQcm9wKFBfUFJFU0FZKSArIFF1ZXJ5UHJvcChQX05BTUUpOworICBpZiAoUXVlcnlQcm9wKFBfQVJUSUNMRSkpIGFuc3dlcj1RdWVyeUFydGljbGUoMCwwKSthbnN3ZXI7CisgIGlmKCh0aXRsZT1RdWVyeVByb3AoUF9USVRMRSkpICYmIHRpdGxlICE9ICIiKSBhbnN3ZXIgKz0gIiAiICsgdGl0bGU7CisgIGlmKCFpbnRlcmFjdGl2ZShNRSkpIGFuc3dlciArPSAiIChuZXR6dG90KSI7CisgIHJldHVybiBhbnN3ZXIrIi5cbiI7Cit9CisKK3ByaXZhdGUgc3RyaW5nIGFuZGxpc3Qob2JqZWN0ICphcnIpIHsKKyAgc3RyaW5nICp0bXA7CisgIGlmKCFwb2ludGVycChhcnIpKSByZXR1cm4gIiI7CisgIGlmKHNpemVvZih0bXAgPSBtYXBfb2JqZWN0cyhhcnIsICJuYW1lIiwgV0VOKSkpCisgICAgcmV0dXJuKENvdW50VXAodG1wKSk7CisgIHJldHVybiAiIjsKK30KKworLy8gZ2lidCBmdWVyIG5pY2h0LUludmlzLU9iamVrdGUgZGVuIE5hbWVuIHp1cnVlY2sKK3ByaXZhdGUgc3RyaW5nIGdldF92aXNfbmFtZShvYmplY3Qgb2IpIHsKKyAgaWYgKG9iLT5RdWVyeVByb3AoUF9JTlZJUykpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiAob2ItPm5hbWUoV0VOKSk7Cit9CisKK3ZhcmFyZ3Mgc3RyaW5nIGxvbmcoKQoreworICBzdHJpbmcgZXhsLCBkZXNjciwgdG1wLCBzaXplX2Rlc2NyOworICBvYmplY3Qgb2I7CisgIG1peGVkIHRyYW5zLCB3LCBhLCByOworICBpbnQgcGVyOworICBzdHJpbmcgZmlsbCwgZmlsbDI7CisgIC8qIGZ1ZXIgZ3JvZXNzZW52ZXJnbGVpY2ggKi8KKyAgc3RyaW5nIGNvbXBhcmVzaXplLCBwZXJzMSwgcGVyczI7CisgIGludCByZWxhdGlvbjsKKworICBwZXI9MTAwMCpRdWVyeVByb3AoUF9TSVpFKS9RdWVyeVByb3AoUF9BVkVSQUdFX1NJWkUpOworICBzd2l0Y2gocGVyKQorICB7CisgICAgY2FzZSAwLi44MDA6IHNpemVfZGVzY3I9InppZW1saWNoIHdpbnppZyI7IGJyZWFrOworICAgIGNhc2UgODAxLi44NTA6IHNpemVfZGVzY3I9ImVoZXIgd2luemlnIjsgYnJlYWs7CisgICAgY2FzZSA4NTEuLjkwMDogc2l6ZV9kZXNjcj0icmVjaHQga2xlaW4iOyBicmVhazsKKyAgICBjYXNlIDkwMS4uOTUwOiBzaXplX2Rlc2NyPSJlaGVyIGtsZWluIjsgYnJlYWs7CisgICAgY2FzZSA5NTEuLjEwNTA6IHNpemVfZGVzY3I9Im1pdHRlbGdyb3NzIjsgYnJlYWs7CisgICAgY2FzZSAxMDUxLi4xMTAwOiBzaXplX2Rlc2NyPSJyZWxhdGl2IGdyb3NzIjsgYnJlYWs7CisgICAgY2FzZSAxMTAxLi4xMTUwOiBzaXplX2Rlc2NyPSJ6aWVtbGljaCBncm9zcyI7IGJyZWFrOworICAgIGNhc2UgMTE1MS4uMTIwMDogc2l6ZV9kZXNjcj0ic2VociBncm9zcyI7IGJyZWFrOworICAgIGRlZmF1bHQ6IHNpemVfZGVzY3I9InJpZXNpZyI7IGJyZWFrOworICB9CisjZGVmaW5lIFJhc3NlblN0cmluZygpICgoUXVlcnlQcm9wKFBfRlJPRykgPyAiZW4gRnJvc2NoIiA6XAorICAgICAgICghUXVlcnlQcm9wKFBfR0VOREVSKT8iICI6UXVlcnlQcm9wKFBfR0VOREVSKT09Mj8iZSAiOiJlbiAiKStcCisgICAgICAgKHBvaW50ZXJwKFF1ZXJ5UHJvcChQX1JBQ0VTVFJJTkcpKT9cCisgICAgICAgIFF1ZXJ5UHJvcChQX1JBQ0VTVFJJTkcpW1dFTl06UXVlcnlQcm9wKFBfUkFDRSkpKSkKKyAgZmlsbDI9ZmlsbD0wOworICBpZiAoUXVlcnlQcm9wKFBfQVZFUkFHRV9TSVpFKTwxNzApCisgIHsKKyAgICBpZiAocGVyPDk1MCkKKyAgICAgIGZpbGw9InNlbGJzdCBmdWVyIGVpbiIrUmFzc2VuU3RyaW5nKCkrIiAiOworICAgIGVsc2UKKyAgICAgIGlmIChwZXI+MTA1MCkKKyAgZmlsbDI9Iiwgd2VubiBhdWNoIG51ciBmdWVyIGVpbiIrUmFzc2VuU3RyaW5nKCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYgKFF1ZXJ5UHJvcChQX0FWRVJBR0VfU0laRSk+MTcwKQorICAgICAgaWYgKHBlcj4xMDUwKQorICBmaWxsPSJzb2dhciBmdWVyIGVpbiIrUmFzc2VuU3RyaW5nKCkrIiAiOworICAgICAgZWxzZQorICBpZiAocGVyPDk1MCkKKyAgICBmaWxsMj0iLCB3ZW5uIGF1Y2ggbnVyIGZ1ZXIgZWluIitSYXNzZW5TdHJpbmcoKTsKKyAgfQorICBpZiAoIWZpbGwmJiFmaWxsMikgZmlsbD0iZnVlciBlaW4iK1Jhc3NlblN0cmluZygpKyIgIjsKKyAgZGVzY3IgPSAiRGFzIGlzdCAiK25hbWUoV0VSLDEpKyIuICIrY2FwaXRhbGl6ZShRdWVyeVByb25vdW4oKSkrIiBpc3QgIisKKyAgICAoZmlsbHx8IiIpK3NpemVfZGVzY3IrKGZpbGwyfHwiIikrIi5cbiI7CisKKyAgaWYodGhpc19wbGF5ZXIoKSkgeworICAgIC8qIGdyb2Vzc2VudmVyZ2xlaWNoX2FuZmFuZyAoTkVVKSAqLworICAgIHBlcnMxID0gUXVlcnlQcm9ub3VuKFdFUik7CisgICAgcGVyczIgPSBRdWVyeVByb25vdW4oV0VNKTsKKyAKKyAgICAvLyB8fCBmYWxscyBUUCBrZWluZSBHcm9lc3NlIGdlc2V0enQgaGF0Li4uIFdhcnVtIGF1Y2ggaW1tZXIuLi4KKyAgICByZWxhdGlvbiA9IChRdWVyeVByb3AoUF9TSVpFKSoxMDApIC8gCisgICAgICAgICAgICAgICAgICAodGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKFBfU0laRSkgfHwgMSk7CisgICAgc3dpdGNoIChyZWxhdGlvbikgCisgICAgIHsKKyAgICAgY2FzZSAgIDAgLi4gIDI1IDogY29tcGFyZXNpemUgPSAiRGFtaXQgZ2lidCAiK3BlcnMxKyIgZWluZW4gZ3V0ZW4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBGdXNzY2hlbWVsIGZ1ZXIgRGljaCBhYiI7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICBjYXNlICAyNiAuLiAgNTAgOiBjb21wYXJlc2l6ZSA9ICJEYW1pdCByZWljaHQgIitwZXJzMSsiIERpciBuaWNodCBtYWwgYmlzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgenVyIEh1ZWZ0ZSI7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICBjYXNlICA1MSAuLiAgNzUgOiBjb21wYXJlc2l6ZSA9ICJEYW1pdCBrYW5uc3QgRHUgIitwZXJzMisiIGxvY2tlciBhdWYgZGVuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgS29wZiBzcHVja2VuIjsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgIGNhc2UgIDc2IC4uICA5MCA6IGNvbXBhcmVzaXplID0gIkRhbWl0IGlzdCAiK3BlcnMxKyIgZWluZW4gS29wZiBrbGVpbmVyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYWxzIER1IjsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgIGNhc2UgIDkxIC4uIDExMCA6IGNvbXBhcmVzaXplID0gIkRhbWl0IGhhdCAiK3BlcnMxKyIgZXR3YSBEZWluZSBHcm9lc3NlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgIAorICAgICBjYXNlIDExMSAuLiAxMjAgOiBjb21wYXJlc2l6ZSA9ICJEYW1pdCBpc3QgIitwZXJzMSsiIGVpbmVuIEtvcGYgZ3JvZXNzZXIiIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYWxzIER1IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgY2FzZSAxMjEgLi4gMTUwIDogY29tcGFyZXNpemUgPSAiRGFtaXQgaG9sc3QgRHUgRGlyIGVpbmVuIHN0ZWlmZW4gTmFja2VuLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHdlbm4gRHUgIitwZXJzMisiIGluIGRpZSBBdWdlbiBzaWVoc3QiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICBjYXNlIDE1MSAuLiAyMDAgOiBjb21wYXJlc2l6ZSA9ICJEYW1pdCB2ZXJzcGVycnQgIitwZXJzMSsiIERpciBhYnNvbHV0IgorCQkgICAgICAgICAgICAgICAgICAgICAiIGRpZSBTaWNodCI7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICBjYXNlIDIwMSAuLiAzMDAgOiBjb21wYXJlc2l6ZSA9ICJEYW1pdCB3YWVyZSBqZWRlciBTY2hsYWcgdm9uIERpciBlaW4iIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgVGllZnNjaGxhZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgIGRlZmF1bHQgICAgICAgICA6IGNvbXBhcmVzaXplID0gIkRhbWl0IGthbm5zdCBEdSAiK3BlcnMyKyIgYmVxdWVtIHp3aXNjaGVuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZGVuIEJlaW5lbiBkdXJjaGxhdWZlbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgIH0KKyAgCisgICAgIGRlc2NyKz1jb21wYXJlc2l6ZSsiLlxuIjsKKyAgICAgLyogZ3JvZXNzZW52ZXJnbGVpY2hfZW5kZSAoTkVVKSAqLworICAgfQorCisgIGlmKFF1ZXJ5UHJvcChQX0dIT1NUKSkgcmV0dXJuIGRlc2NyOworCisgIHRyYW5zID0gUXVlcnlQcm9wKFBfVFJBTlNQQVJFTlQpOyBTZXRQcm9wKFBfVFJBTlNQQVJFTlQsIDApOworICBkZXNjciArPSA6OmxvbmcoKTsgU2V0UHJvcChQX1RSQU5TUEFSRU5ULCB0cmFucyk7CisKKyAgLy8gV2FmZmVuLCBSdWVzdHVuZ2VuL0tsZWlkdW5nIHVuZCBTb25zdGlnZXMgZXJtaXR0ZWxuCisgIHcgPSAoe1F1ZXJ5UHJvcChQX1dFQVBPTiksIFF1ZXJ5UHJvcChQX1BBUlJZX1dFQVBPTil9KSAtICh7MH0pOworICBhID0gUXVlcnlQcm9wKFBfQVJNT1VSUykgKyBRdWVyeVByb3AoUF9DTE9USElORykgLSAoezB9KTsKKyAgciA9IGFsbF9pbnZlbnRvcnkoTUUpIC0gdyAtIGE7IC8vUmVzdCBsb2dpc2NoZXJ3ZWlzZQorCisgIC8vIHJlc3Qgbm9jaCBuYWNoIHNpY2hiYXJrZWl0IHZvbiBhdXNzZXJoYWxiIGRlcyBTUGllbGVycyBmaWx0ZXJuLgorICByPW1hcChyLGZ1bmN0aW9uIHN0cmluZyAob2JqZWN0IG9iKSB7CisJICBpZihzaXplb2YoYWxsX2ludmVudG9yeShvYikpIHx8IG9iLT5RdWVyeVByb3AoUF9MSUdIVCkgfHwgCisJICAgICBvYi0+UXVlcnlQcm9wKFBfTElHSFRFRCkgfHwgb2ItPlF1ZXJ5UHJvcChQX1NIT1dfSU5WKSkKKwkgICAgcmV0dXJuKGdldF92aXNfbmFtZShvYikpOworICAgICAgICAgIHJldHVybigwKTsgfSApIC0gKHswfSk7CisKKyAgLy8gSW52aXMtT2JqZWt0ZSBhdXNmaWx0ZXJuIHVuZCBOYW1lbiBlcm1pdHRlbG4sIGFuc2NobGllc3NlbmQgc2luZCBpbiB3LCBhCisgIC8vIHVuZCByIGplIGVpbiBBcnJheSB2b24gU3RyaW5ncworICB3ID0gbWFwKHcsICMnZ2V0X3Zpc19uYW1lKSAtICh7MH0pOworICBhID0gbWFwKGEsICMnZ2V0X3Zpc19uYW1lKSAtICh7MH0pOworCisgIHJldHVybiBkZXNjciArCisgICAgICAgICAoUXVlcnlQcm9wKFBfVFJBTlNQQVJFTlQpID8KKyAgICAgICAgICBicmVha19zdHJpbmcoY2FwaXRhbGl6ZShuYW1lKFdFUiwgMSkpKyIgaGF0ICIKKyAgICAgICAgICAgICAgICAgICAgICArKHNpemVvZihhKT9Db3VudFVwKGEpOiJrZWluZSBSdWVzdHVuZyIpKyIgYW4iCisgICAgICAgICAgICAgICAgICAgICAgKyhzaXplb2Yocik/IiwgIjoiIHVuZCAiKQorICAgICAgICAgICAgICAgICAgICAgICsoc2l6ZW9mKHcpP0NvdW50VXAodyk6ImtlaW5lIFdhZmZlIikrIiBnZXp1ZWNrdCIKKyAgICAgICAgICArKHNpemVvZihyKT8iIHVuZCB0cmFlZ3QgIitDb3VudFVwKHIpOiIiKSsiLiIsIDc4KTogIiIpOworfQorCisKKy8vICoqKiogbG9jYWwgcHJvcGVydHkgbWV0aG9kcworc3RhdGljIG1peGVkIF9xdWVyeV9wcmVzYXkoKQoreworICBzdHJpbmcgcHJlc2F5OworICBpZigocHJlc2F5ID0gUXVlcnkoUF9QUkVTQVkpKSAmJiAocHJlc2F5ICE9ICIiKSkgcmV0dXJuIHByZXNheSArICIgIjsKKyAgcmV0dXJuICIiOworfQorCitzdGF0aWMgc3RyaW5nIF9xdWVyeV9uYW1lKCkKK3sKKyAgcmV0dXJuIGNhcGl0YWxpemUoUXVlcnkoUF9OQU1FKSB8fCAiTm9OYW1lIik7Cit9CisvLyAqKioqCisKKy8vIExvY2FsIGNvbW1hbmRzCitzdGF0aWMgbWl4ZWQgX3F1ZXJ5X2xvY2FsY21kcygpIHsKKyAgcmV0dXJuCisgICAgKHsKKyAgICAgICh7ImF2YXRhciIsInNldF9hdmF0YXJ1cmkiLDAsMH0pLAorICAgIH0pOworfQorCitpbnQgc2V0X2F2YXRhcnVyaShzdHJpbmcgYXJnKSB7CisgIGFyZyA9IF91bnBhcnNlZF9hcmdzKDApOworICBpZiAoIWFyZyB8fCAhc2l6ZW9mKGFyZykpIHsKKyAgICBzdHJpbmcgdXJpID0gUXVlcnlQcm9wKFBfQVZBVEFSX1VSSSk7CisgICAgaWYgKHN0cmluZ3AodXJpKSkKKyAgICAgIHRlbGxfb2JqZWN0KE1FLAorICAgICAgICAgICJBa3R1ZWxsZSBBdmF0YXItVVJJOiAiICsgdXJpICsgIlxuIik7CisgICAgZWxzZQorICAgICAgdGVsbF9vYmplY3QoTUUsICJEdSBoYXN0IGtlaW5lIEF2YXRhci1VUkkgZWluZ2VzdGVsbHQuXG4iKTsKKyAgfQorICBlbHNlIGlmIChhcmcgPT0gImtlaW5lIikgeworICAgICAgU2V0UHJvcChQX0FWQVRBUl9VUkksIDApOworICAgICAgdGVsbF9vYmplY3QoTUUsICJEZWluZSBBdmF0YXItVVJJIHd1cmRlIGdlbG9lc2NodC5cbiIpOworICB9CisgIGVsc2UgaWYgKHNpemVvZihhcmcpID4gNTEyKQorICAgICAgdGVsbF9vYmplY3QoTUUsICJEZWluZSBuZXVlIEF2YXRhci1VUkkgaXN0IHp1IGxhbmchXG4iKTsKKyAgZWxzZSB7CisgICAgICBTZXRQcm9wKFBfQVZBVEFSX1VSSSwgYXJnKTsKKyAgICAgIHRlbGxfb2JqZWN0KE1FLAorICAgICAgICAgICJBa3R1ZWxsZSBBdmF0YXItVVJJOiAiICsgYXJnICsgIlxuIik7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvZXhwbG9yYXRpb24uYyBiL3N0ZC9wbGF5ZXIvZXhwbG9yYXRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTE5NzZlCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9leHBsb3JhdGlvbi5jCkBAIC0wLDAgKzEsMTI1IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gcGxheWVyL2V4cGxvcmF0aW9uLmMgLS0gZXhwbG9yYXRpb24gcG9pbnQgbWFuYWdlbWVudAorLy8KKy8vICRJZDogZXhwbG9yYXRpb24uYyA5MTQyIDIwMTUtMDItMDQgMjI6MTc6MjlaIFplc3N0cmEgJAorI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPHBsYXllci9saWZlLmg+CisjaW5jbHVkZSA8cGxheWVyL2Jhc2UuaD4KKyNpbmNsdWRlIDx0aGluZy9wcm9wZXJ0aWVzLmg+CisjdW5kZWYgTkVFRF9QUk9UT1RZUEVTCisKKyNpbmNsdWRlIDxleHBsb3JhdGlvbi5oPgorI2luY2x1ZGUgPHNjb3JlbWFzdGVyLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG5ld19za2lsbHMuaD4KKworcHJpdmF0ZSBzdHJpbmcgZ2l2ZW5fc2NvcmVzOworCitwcml2YXRlIG5vc2F2ZSBtaXhlZCBlcG51bTsKKwordm9pZCBjcmVhdGUoKSB7CisgIFNldChQX0xFUCwgU0VDVVJFRHxTQVZFLCBGX01PREVfQVMpOworCisgIGdpdmVuX3Njb3JlcyA9ICIiOworfQorCitzdHJpbmcgRm9yc2NodW5nKCkKK3sKKyAgcmV0dXJuIEVQTUFTVEVSLT5RdWVyeUZvcnNjaHVuZygpOworfQorCitzdGF0aWMgc3RyaW5nIF9xdWVyeV9naXZlbl9zY29yZXMoKQoreworICByZXR1cm4gZ2l2ZW5fc2NvcmVzOworfQorCisvLyBIaWVyIGtvbW1lbiBGdW5rdGlvbmVuIGZ1ZXIgZGllIExldmVscHVua3RlCisKKyNkZWZpbmUgWFBfRkFDIChbMToxMCwyOjQwLDM6MTUwLDQ6NjAwLDU6MjI1MCw2OjkwMDAsNzozNTAwMCw4OjE0MDAwMCw5OjUwMDAwMF0pCisKKy8vI2RlZmluZSBERUJVRyh4LHkpIHByaW50Zih4LHkpCisjZGVmaW5lIERFQlVHKHgseSkKKworaW50IEFkZFNjb3JlKGludCBjb250cmlidXRvcikKK3sKKyAgbWl4ZWQgaW5mbzsKKyAgb2JqZWN0IHBvOworICBpbnQgZHJpbjsKKyAgCisgIGlmICghcG9pbnRlcnAoaW5mbyA9IFNDT1JFTUFTVEVSLT5RdWVyeU5QQ2J5TnVtYmVyKGNvbnRyaWJ1dG9yKSkpCisgICAgcmV0dXJuIC0xOworCisgIGlmICgocG8gPSBwcmV2aW91c19vYmplY3QoKSkgJiYgKG9iamVjdF9uYW1lKHBvKSA9PSBTQ09SRU1BU1RFUikpCisgICAgcG8gPSBwcmV2aW91c19vYmplY3QoMSk7CisKKyAgaWYgKCFwbyB8fCBvbGRfZXhwbG9kZShvYmplY3RfbmFtZShwbyksIiMiKVswXSAhPSBpbmZvW1NDT1JFX0tFWV0pCisgICAgcmV0dXJuIC0yOworCisgIGlmICghc3RyaW5ncChnaXZlbl9zY29yZXMpKQorICAgIGdpdmVuX3Njb3JlcyA9ICIgIjsKKworICBpZiAoY2F0Y2goZHJpbiA9IHRlc3RfYml0KGdpdmVuX3Njb3JlcywgY29udHJpYnV0b3IpO3B1Ymxpc2gpKQorICAgIHJldHVybiAtMzsKKworICBpZiAoIWRyaW4pIHsKKyAgICBnaXZlbl9zY29yZXMgPSBzZXRfYml0KGdpdmVuX3Njb3JlcywgY29udHJpYnV0b3IpOworICAgIFNldChQX0xFUCwgUXVlcnkoUF9MRVApICsgaW5mb1tTQ09SRV9TQ09SRV0pOworICAgIGZvcmNlX3NhdmUoKTsKKyAgICByZXR1cm4gaW5mb1tTQ09SRV9TQ09SRV07CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2ludCBUZXN0U2NvcmUoaW50IGNvbnRyaWJ1dG9yKQoreworICBpbnQgcmV0OworICAKKyAgaWYgKCFwcmV2aW91c19vYmplY3QoKSB8fCAob2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpICE9IFNDT1JFTUFTVEVSKSkKKyAgICByZXR1cm4gMDsKKworICBjYXRjaChyZXQgPSB0ZXN0X2JpdChnaXZlbl9zY29yZXMsIGNvbnRyaWJ1dG9yKTtwdWJsaXNoKTsKKworICByZXR1cm4gcmV0OworfQorCitpbnQgU2V0U2NvcmVCaXQoaW50IGNvbnRyaWJ1dG9yKQoreworICBpbnQgZHJpbjsKKyAgCisgIGlmICghcHJldmlvdXNfb2JqZWN0KCkgfHwgKG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSAhPSBTQ09SRU1BU1RFUikpCisgICAgcmV0dXJuIC0xOworCisgIGlmIChjYXRjaChkcmluID0gdGVzdF9iaXQoZ2l2ZW5fc2NvcmVzLCBjb250cmlidXRvcik7cHVibGlzaCkpCisgICAgcmV0dXJuIC0yOworCisgIGlmIChkcmluKSByZXR1cm4gLTM7CisKKyAgZ2l2ZW5fc2NvcmVzID0gc2V0X2JpdChnaXZlbl9zY29yZXMsIGNvbnRyaWJ1dG9yKTsKKyAgZm9yY2Vfc2F2ZSgpOworICByZXR1cm4gMTsKK30KKworaW50IENsZWFyU2NvcmVCaXQoaW50IGNvbnRyaWJ1dG9yKQoreworICBpbnQgZHJpbjsKKyAgCisgIGlmICghcHJldmlvdXNfb2JqZWN0KCkgfHwgKG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSAhPSBTQ09SRU1BU1RFUikpCisgICAgcmV0dXJuIC0xOworCisgIGlmIChjYXRjaChkcmluID0gdGVzdF9iaXQoZ2l2ZW5fc2NvcmVzLCBjb250cmlidXRvcik7cHVibGlzaCkpCisgICAgcmV0dXJuIC0yOworCisgIGlmICghZHJpbikgcmV0dXJuIC0zOworCisgIGdpdmVuX3Njb3JlcyA9IGNsZWFyX2JpdChnaXZlbl9zY29yZXMsIGNvbnRyaWJ1dG9yKTsKKyAgZm9yY2Vfc2F2ZSgpOworICByZXR1cm4gMTsKK30KKwpkaWZmIC0tZ2l0IGEvc3RkL3BsYXllci9ndWlkZS5jIGIvc3RkL3BsYXllci9ndWlkZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMDhiNDMKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL2d1aWRlLmMKQEAgLTAsMCArMSwxODIgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vIAorLy8gcGxheWVyL2d1aWRlLmMgLS0gbmV3YmllIGd1aWRlIGhhbmRsaW5nIAorLy8KKy8vICRJZDogZ3VpZGUuYyA3MzkxIDIwMTAtMDEtMjUgMjI6NTI6NTFaIFplc3N0cmEgJAorCisjcHJhZ21hIHN0cmljdF90eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8cGxheWVyL3VzZXJfZmlsdGVyLmg+IC8vIGZ1ZXIgaXNfYWN0aXZlX2d1aWRlKCkKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPHRoaW5nL3Byb3BlcnRpZXMuaD4KKworLyogRnVua3Rpb24sIGRpZSBkaWUgR3VpZGUtS29tbWFuZG9zIGFrdGl2aWVydCAqLwordm9pZCBhZGRfZ3VpZGVfY29tbWFuZHMoKQoreworCWFkZF9hY3Rpb24oIkNpY2Vyb25lQ21kIiwiY2ljZXJvbmUiKTsKKwkvLyBTb2xsdGUgZWlnZW50bGljaCBhbiBkZXJzZWxiZW4gU3RlbGxlIG1vZWdsaWNoIHNlaW4uCit9CisKKy8qIEdpYnQgZGllIE1lbGR1bmcgYmVpbSBBZW5kZXJuIGF1cyovCitwcm90ZWN0ZWQgaW50IE5ld2JpZUNoYW5nZU1zZygpIHsKKyAgICBpbnQgY2ljPVF1ZXJ5UHJvcChQX05FV0JJRV9HVUlERSk7CisgICAgLy8gYmVncmVuemVuIGF1ZiAxIFRhZywgZmFsbHMgamVtYW5kIGRhIFNjaHJvdHQgcmVpbmdzY2hyaWViZW4gaGF0LgorICAgIGlmIChjaWMgPiA4NjQwMCkgeworCWNpYz04NjQwMDsKKwlTZXRQcm9wKFBfTkVXQklFX0dVSURFLGNpYyk7CisgICAgfQorICAgIGlmIChjaWM8PTApIHsKKwl3cml0ZSgiRHUgYmlzdCBqZXR6dCBrZWluIENpY2Vyb25lIG1laHIuXG4iKTsKKyAgICB9CisgICAgZWxzZSBpZiAoY2ljIDwgNjApIHsKKwl3cml0ZSgiRHUgYmlzdCBqZXR6dCBlaW4gQ2ljZXJvbmUuXG4iKTsKKyAgICB9CisgICAgZWxzZSB7CisJd3JpdGUoYnJlYWtfc3RyaW5nKAorCSAgICAiRHUgYmlzdCBqZXR6dCBlaW4gQ2ljZXJvbmUsIGFsbGVyZGluZ3MgbnVyIGluIGRlbiBaZWl0ZW4sICIKKwkgICAgImluIGRlbmVuIER1IHdlbmlnZXIgYWxzICIgKyBjaWMvNjAKKwkgICAgKyAoKGNpYy82MCk8MiA/ICIgTWludXRlICI6IiBNaW51dGVuICIpCisJICAgICsgImlkbGUgYmlzdC5cbiIsNzgpKTsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKKy8qIEdpYnQgZGllIFN0YXR1c21lbGR1bmcgYXVzICovCitwcm90ZWN0ZWQgaW50IE5ld2JpZVN0YXR1c01zZygpIHsKKyAgaW50IGNpYz1RdWVyeVByb3AoUF9ORVdCSUVfR1VJREUpOworICAvLyBiZWdyZW56ZW4gYXVmIDEgVGFnLCBmYWxscyBqZW1hbmQgZGEgU2Nocm90dCByZWluZ3NjaHJpZWJlbiBoYXQuCisgIGlmIChjaWMgPiA4NjQwMCkgeworICAgICAgY2ljPTg2NDAwOworICAgICAgU2V0UHJvcChQX05FV0JJRV9HVUlERSxjaWMpOworICB9CisKKyAgaWYgKGNpYyA8PSAwKQorICAgIHdyaXRlICgiRHUgYmlzdCBrZWluIENpY2Vyb25lLlxuIik7CisgIGVsc2UgaWYgKGNpYyA8IDYwKQorICAgIHdyaXRlICgiRHUgc3RlaHN0IE5ldXNwaWVsZXJuIGFscyBDaWNlcm9uZSB6dXIgVmVyZnVlZ3VuZy5cbiIpOworICBlbHNlIHsKKyAgICB3cml0ZShicmVha19zdHJpbmcoCisJICAgICJEdSBzdGVoc3QgTmV1c3BpZWxlcm4gYWxzIENpY2Vyb25lIHp1ciBWZXJmdWVndW5nLCBhbGxlcmRpbmdzICIKKwkgICAgIm51ciBpbiBkZW4gWmVpdGVuLCBpbiBkZW5lbiBEdSB3ZW5pZ2VyIGFscyAiICsgY2ljLzYwCisJICAgICsgKChjaWMvNjApPDIgPyAiIE1pbnV0ZSAiOiIgTWludXRlbiAiKQorCSAgICArICJpZGxlIGJpc3QuXG4iLDc4KSk7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8qIEZ1ZWhydCBkYXMgZWlnZW50bGljaGUgS29tbWFuZG8gYXVzKi8KKworaW50IENpY2Vyb25lQ21kKHN0cmluZyBzdHIpCit7CisJaWYgKFF1ZXJ5UHJvcChQX0xFVkVMKTwyMCkKKwl7CisJCXdyaXRlKGJyZWFrX3N0cmluZygiRHUgc29sbHRlc3QgZXJzdCBub2NoIGVpbiB3ZW5pZyAiCisJCQkJCSJFcmZhaHJ1bmcgc2FtbWVsbiwgYmV2b3IgRHUgRGljaCAiCisJCQkJICAgICAgICJhbHMgQ2ljZXJvbmUgenVyIFZlcmZ1ZWd1bmcgc3RlbGxzdC4iLDc4KSk7CisJCXJldHVybiAxOworCX0KKwkvLyBJZGxlemVpdCB1ZWJlcmdlYmVuPworCWludCBpZGxlPXRvX2ludChzdHIpOworCS8vIG1heC4gZWluZW4gVGFnICgxNDQwIG1pbikgenVsYXNzZW4uCisJaWYgKGlkbGUgPCAwKSBpZGxlPTA7CisJZWxzZSBpZiAoaWRsZSA+IDE0NDApIGlkbGU9MTQ0MDsKKworCWlmICghc3RyKSB7CisJICAgIHJldHVybiBOZXdiaWVTdGF0dXNNc2coKTsKKwl9CisJZWxzZSBpZiAoc3RyPT0ic3RhdHVzIikgeworCSAgICByZXR1cm4gTmV3YmllU3RhdHVzTXNnKCk7CisJfQorCS8vICJlaW4iIHNjaGFsdGV0IGVpbmZhY2ggZ2VuZXJlbGwgZWluLCBoaWVyYmVpIHN0ZWh0IDEgaW4gZGVyIFByb3AKKwkvLyBmdWVyICJwZXJtYW5lbnQgZWluIi4KKwllbHNlIGlmIChzdHI9PSJlaW4iKSB7CisJICAgIFNldFByb3AoUF9ORVdCSUVfR1VJREUsMSk7CisJICAgIHJldHVybiBOZXdiaWVDaGFuZ2VNc2coKTsKKwl9CisJLy8gImF1cyIgb2RlciAiMCIgZGVha3RpdmllcnQuCisJZWxzZSBpZiAoc3RyPT0iYXVzIikgeworCSAgICBTZXRQcm9wKFBfTkVXQklFX0dVSURFLDApOworCSAgICByZXR1cm4gTmV3YmllQ2hhbmdlTXNnKCk7CisJfQorCS8vIHdlbm4gWmFobCB1ZWJlcmdlYmVuIGlzdCwgZGllIGdyb2Vzc2VyIDAgdW5kIGtsZWluZXIgMTQ0MCBpc3QKKwkvLyAocy5vLiksIHdpcmQgZXMgYWxzIEFuemFobCBhbiBJZGxlLU1pbnV0ZW4gYXVmZ2VmYXNzdCwgYWIgZGVyIG1hbgorCS8vIGF1c2dlYmxlbmRldCB3ZXJkZW4gd2lsbC4KKwllbHNlIGlmIChpZGxlKSB7CisJICAgIFNldFByb3AoUF9ORVdCSUVfR1VJREUsIGlkbGUqNjApOyAvLyBhbHMgU2VrdW5kZW4gc3BlaWNoZXJuLgorCSAgICByZXR1cm4gTmV3YmllQ2hhbmdlTXNnKCk7CisJfQorCXdyaXRlKGJyZWFrX3N0cmluZygKKwkgICAgICAiY2ljZXJvbmUgZWluICAtIER1IGJpc3QgQ2ljZXJvbmVcbiIKKwkgICAgICAiY2ljZXJvbmUgYXVzICAtIER1IGJpc3Qga2VpbiBDaWNlcm9uZVxuIgorCSAgICAgICJjaWNlcm9uZSAgICAgIC0gU3RhdHVzIGFuemVpZ2VuXG4iCisJICAgICAgK2JyZWFrX3N0cmluZygKKwkJIkR1IGJpc3QgQ2ljZXJvbmUsIGFiZXIgd2VubiBEdSBsYWVuZ2VyIGFscyA8emFobD4gTWludXRlbiAiCisJCSJpZGxlIGJpc3QsIHdpcnN0IER1IGF1dG9tYXRpc2NoIGF1c2dlYmxlbmRldCwgYmlzIER1IHdpZWRlciAiCisJCSJlbmRpZGVsdCBiaXN0LiIsCisJCTc2LCJjaWNlcm9uZSB6YWhsIC0gIixCU19JTkRFTlRfT05DRSksCisJICAgICAgNzgsIlN5bnRheGhpbGZlOiIsQlNfUFJFUEVORF9JTkRFTlR8QlNfTEVBVkVfTVlfTEZTKSk7CisKKwlyZXR1cm4gMTsKK30KKworcHJvdGVjdGVkIHN0cmluZyBJc3RTaW5kTXNnKHN0cmluZyogbmFtZW4pCit7CisJaWYgKHNpemVvZihuYW1lbik9PTEpCisJCXJldHVybiAiaXN0IGRhdm9uICIrbmFtZW5bMF07CisJZWxzZQorCQlyZXR1cm4gInNpbmQgZGF2b24gIitDb3VudFVwKG5hbWVuKTsKK30KKwordm9pZCBOZXdiaWVJbnRyb01zZygpCit7CisJb2JqZWN0KiBjaWNlcm9uZXM7CisJc3RyaW5nKiBuYW1lbjsKKwlzdHJpbmcgcmVzdGV4dDsKKworCS8vIE51ciBiaXMgTGV2ZWwgNSB3aXJkIGV0d2FzIGF1c2dlZ2ViZW4uCisJaWYgKFF1ZXJ5UHJvcChQX0xFVkVMKT41KSByZXR1cm47CisJCisJLy8gaXNfYWN0aXZlX2d1aWRlKCkgaXN0IGluIC9zdGQvdXNlcl9maWx0ZXIuYywgd2VsY2hlcyB2b20KKwkvLyBTcGllbGVyb2JqZWt0IGdlZXJidCB3aXJkIHVuZCBkYW1pdCB6dXIgVmVyZnVlZ3VuZyBzdGVodC4KKwljaWNlcm9uZXM9ZmlsdGVyKHVzZXJzKCksIydpc19hY3RpdmVfZ3VpZGUpOworCS8vIHVpZCB2ZXJ3ZW5kZW4sIGRhIHNvbnN0IGtsZWluZSBTcGllbGVyIGVpbmVuIGdldGFybnRlbiAKKwkvLyAiUmllc2VuIiBvZGVyIGFlaG5saWNoZXMgYW5zdHByZWNoZW4uCisJbmFtZW49bWFwKGNpY2Vyb25lcyxmdW5jdGlvbiBzdHJpbmcgKG9iamVjdCBvKSAKKwkgICAgeyByZXR1cm4oY2FwaXRhbGl6ZShnZXRldWlkKG8pKSk7IH0gKTsKKworCWlmIChuYW1lbiAmJiBzaXplb2YobmFtZW4pPjApCisJeworCQlyZXN0ZXh0PSJcbkVzIGdpYnQgZWluaWdlIG5ldHRlIFNwaWVsZXIsIGRpZSBiZXJlaXQgc2luZCwgRGljaCAiCisJCQkJImF1ZiBEZWluZW4gZXJzdGVuIFNjaHJpdHRlbiBpbSAiTVVETkFNRQorCQkJCSIgenUgYmVnbGVpdGVuLiBcblxuRGVyemVpdCAiCisJCQkJK0lzdFNpbmRNc2cobmFtZW4pKyIgZWluZ2Vsb2dndC4gRHUga2FubnN0ICIKKwkJCQkiZWluZW4gb2RlciBlaW5lIHZvbiBJaG5lbiBhbnNwcmVjaGVuLCAiCisJCQkJImluZGVtIER1IHouQi4gZWluZmFjaCBcbiIKKwkJCQkiICAndGVpbGUgIisKKwkJCQlsb3dlcl9jYXNlKG5hbWVuW3JhbmRvbShzaXplb2YobmFtZW4pKV0pKworCQkJCSIgbWl0IEhhbGxvIGljaCBiaW4gbmV1IGhpZXIsIGthbm5zdCBEdSAiCisJCQkJIm1pciBiaXR0ZSBoZWxmZW4/J1xuIgorCQkJCSJlaW50aXBwc3QuIE51ciBrZWluZSBTY2hldSwgZGllc2UgU3BpZWxlciAiCisJCQkJImhhYmVuIHNpY2ggZnJlaXdpbGxpZyBkYXp1IGJlcmVpdGVya2xhZXJ0IVxuIgorCQkJCSJcbkR1IGthbm5zdCBEaXIgZGllc2UgU3BpZWxlciBqZWRlcnplaXQgIgorCQkJCSJtaXQgJ2t3ZXIgY2ljZXJvbmVzJyBhbnplaWdlbiBsYXNzZW4uXG5cbiI7CisJCXdyaXRlKGJyZWFrX3N0cmluZyhyZXN0ZXh0LDc4LCIqICAiLEJTX0xFQVZFX01ZX0xGUykpOworCX0KKwllbHNlCisJeworCQkvLyBXZWlhLCBrZWluIE5ld2JpZS1HdWlkZSBkYS4gTGllYmVyIGVyc3RtYWwgbml4IHR1biwKKwkJLy8gYmlzIHVucyB3YXMgYmVzc2VyZXMgZWluZmFlbGx0LgorCX0KKwlyZXR1cm47Cit9CisKKworCisKZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9BbXVsZXR0X2ZlbWFsZSBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9BbXVsZXR0X2ZlbWFsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDg1MDI2Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L0FtdWxldHRfZmVtYWxlCkBAIC0wLDAgKzEsNSBAQAorNgorMzUKKzUKK1xfLworPyYKZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9BbXVsZXR0X21hbGUgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvQW11bGV0dF9tYWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNGUwOWMKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvQW11bGV0dF9tYWxlCkBAIC0wLDAgKzEsNSBAQAorNgorMzYKKzUKK1xfLworPyYKZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9CZXNjaHJpZnR1bmcgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvQmVzY2hyaWZ0dW5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZGRjNWUKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvQmVzY2hyaWZ0dW5nCkBAIC0wLDAgKzEsMjQgQEAKKzcKKzAKKzAKKz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/P19fX19fX19fX19fX19fX19fX19fPEhlbG0+Cis/PFdhZmZlPl9fX19fX19fX19fX19fCis/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/XD8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/P19fX19fX19fX19fX188S29lY2hlcj4KKworPz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/P19fX19fX19fX19fX188QW11bGV0dD4KKz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/X19fX19fCis/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/P1wKKz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/PzxQYW56ZXI+CisKKz88UmluZz5fX19fX19fX19fX19fLworPz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Lz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/X19fX19fX19fX188U2NoaWxkPgorPzxIYW5kc2NodWhlPl9fX19fX18vPz8/Pz8/Pz8/Py8KKz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Py8KKz88R3VlcnRlbD5fX19fX19fX19fX19fX19fX19fLworCis/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz9cX19fX19fX19fX19fPFVtaGFuZz4KKworPz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/P19fX19fX19fXzxIb3NlPgorCisKKz8/Pz8/Pz8/PzxTY2h1aGU+X19fX19fX19fX19fXwpkaWZmIC0tZ2l0IGEvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L0d1ZXJ0ZWxfZmVtYWxlIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L0d1ZXJ0ZWxfZmVtYWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZWQ4ODQKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvR3VlcnRlbF9mZW1hbGUKQEAgLTAsMCArMSw0IEBACis1CiszMworMTAKK2A9PU89PScKZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9HdWVydGVsX21hbGUgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvR3VlcnRlbF9tYWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YzE0YTQKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvR3VlcnRlbF9tYWxlCkBAIC0wLDAgKzEsNCBAQAorNQorMzMKKzEwCitgPT09Tz09PScKZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9IYW5kc2NodWhfZmVtYWxlIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L0hhbmRzY2h1aF9mZW1hbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUzZjE5ZgotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9IYW5kc2NodWhfZmVtYWxlCkBAIC0wLDAgKzEsMTAgQEAKKzQKKzIxCis3Cis/XywtXworKF9fLEkKKworPz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/P3w3Cis/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/L3wKKz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/P2ApLworPz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/PycKZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9IYW5kc2NodWhfbWFsZSBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9IYW5kc2NodWhfbWFsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjgxZGQxCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L0hhbmRzY2h1aF9tYWxlCkBAIC0wLDAgKzEsMTAgQEAKKzQKKzIyCis3CissLS1fXworKF9fLEkKKz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Xz8KKz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz98IHwKKz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8vIHwKKz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz9gKSkKKz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8gJyAKZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9IZWxtX2ZlbWFsZSBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9IZWxtX2ZlbWFsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2JhNjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L0hlbG1fZmVtYWxlCkBAIC0wLDAgKzEsNiBAQAorMQorMzQKKzAKKywtby0uCis9PT09SQorPz8/XF9cCmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvSGVsbV9tYWxlIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L0hlbG1fbWFsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzE4OGEzCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L0hlbG1fbWFsZQpAQCAtMCwwICsxLDYgQEAKKzEKKzM1CiswCissLW8tLgorPT09PUkKKz8/P1xfXApkaWZmIC0tZ2l0IGEvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L0hvc2VuX2ZlbWFsZSBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9Ib3Nlbl9mZW1hbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTljZmRkNgotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9Ib3Nlbl9mZW1hbGUKQEAgLTAsMCArMSwxMyBAQAorNgorMzIKKzEwCisvYC0tLS0tJ1wKK3wvICAgICBcfAorfCAgIFkgICB8Cit8ICAgfCAgIHwKKz98ICB8ICB8Cis/KCAgfCAgKQorP3wgIHwgIHwKKz98ICB8ICB8Cis/fCAgfCAgfAorP0xfLyBcX0oKZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9Ib3Nlbl9tYWxlIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L0hvc2VuX21hbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThlNjM5MAotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9Ib3Nlbl9tYWxlCkBAIC0wLDAgKzEsMTMgQEAKKzYKKzMzCisxMAorL2AtLS0tLSdcCit8LyAgICAgXHwKK3wgICBZICAgfAorfCAgIHwgICB8Cit8ICAgfCAgIHwKKzwuICB8ICAuPgorfCAgIHwgICB8Cit8ICAgfCAgIHwKK3wgICB8ICAgfAorP0xfLyBcX0oKZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9Lb2VjaGVyX2ZlbWFsZSBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9Lb2VjaGVyX2ZlbWFsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTBiMWNmCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L0tvZWNoZXJfZmVtYWxlCkBAIC0wLDAgKzEsNSBAQAorNworNDAKKzMKKyIiIgorLy8KZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9Lb2VjaGVyX21hbGUgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvS29lY2hlcl9tYWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMGIxY2YKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvS29lY2hlcl9tYWxlCkBAIC0wLDAgKzEsNSBAQAorNworNDAKKzMKKyIiIgorLy8KZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9SaW5nX2ZlbWFsZSBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9SaW5nX2ZlbWFsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGY4YjAwCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L1JpbmdfZmVtYWxlCkBAIC0wLDAgKzEsNCBAQAorNgorMjEKKzgKK2MKZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9SaW5nX21hbGUgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvUmluZ19tYWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNjIwYTgKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvUmluZ19tYWxlCkBAIC0wLDAgKzEsNCBAQAorNgorMjIKKzgKK2MKZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9SdWVzdHVuZ19mZW1hbGUgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvUnVlc3R1bmdfZmVtYWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NDlmMzUKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvUnVlc3R1bmdfZmVtYWxlCkBAIC0wLDAgKzEsOSBAQAorMQorMjYKKzQKKz8/Pz8/P19fXz8/P19fXworPz8/Pz8vKCAgXF8vICApXAorPz8/Py8gfFxfX19fXy98IFwKK19fXy8gLz9cXy9fXF8vP1wgXAorfF9fXCc/Pz8pXF8vKD8/P1wvfAorPz8/Pz8/Py9fX19fX1w/Pz98fApkaWZmIC0tZ2l0IGEvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L1J1ZXN0dW5nX21hbGUgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvUnVlc3R1bmdfbWFsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTliNjdjCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L1J1ZXN0dW5nX21hbGUKQEAgLTAsMCArMSw5IEBACisxCisyNQorNAorPz8/Pz9fXl9fX18/Pz9fX19fXl8/Cis/Pz8/KCAgXCAgIFxfLyAgIC8gICkKKz8/Pz8vXCB8XF9fXyBfX18vfCAvXAorP19fLyAgLz9cXyAgICAgXy8/XF8gPgorSV9fX1w+Pz8/KVxfX18vKD8/P3wgfAorPz8/Pz8/Pz8vX19fX19fX1w/P3xffApkaWZmIC0tZ2l0IGEvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L1NjaGlsZF9mZW1hbGUgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvU2NoaWxkX2ZlbWFsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzQ5ZWVhCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L1NjaGlsZF9mZW1hbGUKQEAgLTAsMCArMSwxMCBAQAorNworNDMKKzcKKz8/fFwKKz8/fHwKKz8/fHwKKz09fHwpCis/P3x8Cis/P3x8Cis/P3wvCmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvU2NoaWxkX21hbGUgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvU2NoaWxkX21hbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTViMzI5ZgotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9TY2hpbGRfbWFsZQpAQCAtMCwwICsxLDEwIEBACis3Cis0NQorNworPz98XAorPz98fAorPz98fAorPT18fCkKKz8/fHwKKz8/fHwKKz8/fC8KZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9TY2h1aGVfZmVtYWxlIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L1NjaHVoZV9mZW1hbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJlOTU4ZAotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9TY2h1aGVfZmVtYWxlCkBAIC0wLDAgKzEsNyBAQAorNQorMzIKKzE4Cis/P18/Pz9fCis/fF98P3xffAorPy8gSj9MIFwKKyhfLz8/P1xfKQpkaWZmIC0tZ2l0IGEvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L1NjaHVoZV9tYWxlIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L1NjaHVoZV9tYWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMzMwMTQKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvU2NodWhlX21hbGUKQEAgLTAsMCArMSw3IEBACis1CiszMgorMTgKKz8/P18/Pz9fCis/P3xffD98X3wKKz8vLyBKP0wgXFwKKyhfXy8/Pz9cX18pCmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvVW1oYW5nX2ZlbWFsZSBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9VbWhhbmdfZmVtYWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkODg1YmEKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvVW1oYW5nX2ZlbWFsZQpAQCAtMCwwICsxLDE3IEBACisyCiszMQorNAorPz9fPz8/Pz9fCis/P1Y/Pz8/P1YKKworCit8Pz8/Pz8/Pz8/fAorfD8/Pz8/Pz8/P3wKK3w/Pz8/Pz8/Pz98Cit8Pz8/Pz8/Pz8/fAorfD8/Pz8/Pz8/P3wKK3w/Pz8/Pz8/Pz98Cit8Pz8/Pz8/Pz8/fAorfD8/Pz8/Pz8/P3wKK3w/Pz8/Pz8/Pz98Cis/XD8/Pz8/Pz8vCmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvVW1oYW5nX21hbGUgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvVW1oYW5nX21hbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAyNWRiZQotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9VbWhhbmdfbWFsZQpAQCAtMCwwICsxLDE3IEBACis0CiszMQorNAorPz8/Xz8/Pz8/XworPz8/Vj8/Pz8/VgorCisKK3w/Pz8/Pz8/Pz8/P3wKK3w/Pz8/Pz8/Pz8/P3wKK3w/Pz8/Pz8/Pz8/P3wKK3w/Pz8/Pz8/Pz8/P3wKK3w/Pz8/Pz8/Pz8/P3wKK3w/Pz8/Pz8/Pz8/P3wKK3w/Pz8/Pz8/Pz8/P3wKK3w/Pz8/Pz8/Pz8/P3wKK3w/Pz8/Pz8/Pz8/P3wKKz9cXz8/Pz8/Pz9fLwpkaWZmIC0tZ2l0IGEvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L2F4ZSBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9heGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkyN2Y0OAotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9heGUKQEAgLTAsMCArMSwxMyBAQAorNworMTkKKzEKKz9fXz8/Pz9fXworLy8gXCgpLyBcXAorfHwgIHx8ICB8fAorXFxfL3x8XF8vLworPz8/P3x8Cis/Pz8/fHwKKworCis/Pz8/fHwKKz8/Pz9cLwpkaWZmIC0tZ2l0IGEvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L2Jhc2VfZmVtYWxlIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L2Jhc2VfZmVtYWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYWVjMWEKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvYmFzZV9mZW1hbGUKQEAgLTAsMCArMSwyNSBAQAorMworMAorMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBcXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxfIC98ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fX3wgfHxfXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvICBgICAgJyAgXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyB8XF8vIFxfL3wgXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgIC4tX19fLC8gLyBcICAgICAvIFwgXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgYC0tLi5fXycgICApICAgKCAgIFwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAgLiAgXCAgIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIFwgLyAgfCAgL3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIFkgICB8ICB8JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCAgfCAgLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICB8ICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIHwgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAgfCAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKSAoIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCApICggfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gSiBMIFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJycgICBgYGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvYmFzZV9tYWxlIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L2Jhc2VfbWFsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODM2NjUzCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L2Jhc2VfbWFsZQpAQCAtMCwwICsxLDI1IEBACiszCiswCiswCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBcXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxfIC98ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19fX3wgfF9fX18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL14gICBgIHwgJyAgIF5cICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gLHxcX18vIFxfXy98LixcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAsLS1fX198ICcvIFwgIF9fXyAgLyBcX2BcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgIHxfLi5fX18uJyAgICkvX3xfXCggICB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL1xffF8vXCAgIFwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgLlwgLy4gfCAgIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHwgIFkgIHxsICAvIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAgfCAgfHwgICBcfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxgICd8YCAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIHwgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAgfCAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIHwgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgfCAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBKLiAuTCBcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnJyAgICAgYGBgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9jbHViIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L2NsdWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU2NmVjZQotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9jbHViCkBAIC0wLDAgKzEsMTMgQEAKKzcKKzIxCiswCis/P19fCitfL19fXF8KK198X198XworX3xfX3xfCis/XD8/LworPz98fAorPz98fAorCisKKz8/KCkKZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9mZXJud2FmZmUgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvZmVybndhZmZlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwODk3ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvZmVybndhZmZlCkBAIC0wLDAgKzEsMTkgQEAKKzcKKzIzCiswCis/Pz8pCis/Py8uCis/Lz8uCit8Pz8uCit8Pz8uCit8Pz8uCitJPz8uCisKKworST8/LgorfD8/LgorfD8/LgorfD8/LgorP1w/LgorPz9cLgorPz8/KQpkaWZmIC0tZ2l0IGEvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L2tuaWZlIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L2tuaWZlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YTRlY2QKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngva25pZmUKQEAgLTAsMCArMSw5IEBACis3CisyMworNAorPywKKyh8CisofAorLS0KKworP1UKZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9tYWdpYyBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9tYWdpYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmM1OTRiCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L21hZ2ljCkBAIC0wLDAgKzEsMTAgQEAKKzcKKzIwCiswCissCis/Lj8nPz8uCis/Llx8Lz8sCistPy0rLT8tCissPy98XD8uCisuPywuPz8/LgorPz8/XC8KZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9taXNjIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L21pc2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRiNTI4MQotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9taXNjCkBAIC0wLDAgKzEsMTEgQEAKKzcKKzIzCis0CisvXAorfHwKK3x8CisKKworfHwKK3x8CitgJwpkaWZmIC0tZ2l0IGEvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L3NwZWFyIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L3NwZWFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZTlkNmMKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvc3BlYXIKQEAgLTAsMCArMSwyNSBAQAorNworMjMKKzAKKy9cCishfAorXC8KK3x8Cit8fAorfHwKK3x8CisKKworfHwKK3x8Cit8fAorfHwKK3x8Cit8fAorfHwKK3x8Cit8fAorfHwKK3x8Cit8fAorYCcKZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9zdGFmZiBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9zdGFmZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODQ0NmQwCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L3N0YWZmCkBAIC0wLDAgKzEsMjIgQEAKKzcKKzIzCiswCissLgorfHwKK3x8Cit8fAorfHwKK3x8Cit8fAorCisKK3x8Cit8fAorfHwKK3x8Cit8fAorfHwKK3x8Cit8fAorfHwKK2AnCmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvc3dvcmQgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvc3dvcmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBmZjJkYwotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9zd29yZApAQCAtMCwwICsxLDEzIEBACis3CisyMgorMAorPz8sCis/fHwKKz98fAorP3x8Cis/fHwKKz98fAorX3x8XworCisKKz9gJwpkaWZmIC0tZ2l0IGEvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L3doaXAgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvd2hpcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGRiODQzCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L3doaXAKQEAgLTAsMCArMSwyMSBAQAorNworMTYKKzIKKz8/ICxfIAorPyAvICBcIAorIC8gPz8gXAorIHwgPz8/IHwKKyB8ID8/PyBeCisgfAorPyBcCis/PyB8ID8/IworPz8gLyAKKz8gLyAKKz8gfCAKKz8gLyAKKyAvIAorIHwgCisgfCAKKyB8IAorIFwgCis/IGAgCmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL2ludm1hc3Rlci9pbnZtYXN0ZXIuYyBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2ludm1hc3Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2Y2NkYTAKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9pbnZtYXN0ZXIuYwpAQCAtMCwwICsxLDQ2NCBAQAorLy8gaW52bWFzdGVyLmMgYnkgTmFjaHR3aW5kQE1HIFYxLjEgKDUuMy4yMDAxKQorLy8gQSBzbWFsbCBtYXN0ZXIgdGhhdCBwcm92aWRlcyBhIGdyYXBoaWNhbCBkaXNwbGF5IG9mIHRoZSBwbGF5ZXK0cworLy8gZXF1aXBtZW50LiAKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMscnR0X2NoZWNrcworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCisjaW5jbHVkZSA8aW5wdXRfdG8uaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8YW5zaS5oPgorI2luY2x1ZGUgPGNvbWJhdC5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSAiaW52bWFzdGVyLmgiCisKKworbWFwcGluZyBkYXRhOworY2xvc3VyZSBhYmJyZXZpYXRlOworCisKKy8vIGknbSBhd2FyZSB0aGlzIGNhbiBiZSBkZXRlcm1pbmVkIHdpdGggbV9pbmRpY2VzKFZBTElEX0FSTU9VUl9UWVBFKSwKKy8vIGJ1dCB0aGUgcG9zaXRpb24gaW4gdGhlIGFycmF5cyBpcyBpbXBvcnRhbnQgZm9yIHRoZSBkcmF3aW5nIG9yZGVyLgorLy8gZmlyc3QgaXRlbSBpbiB0aGUgYXJyYXkgaXMgZHJhd24gbGFzdAorc3RhdGljIHN0cmluZyAqYXJtb3VyX3R5cGVzID0gCisoe0FUX0JFTFQsCisgIEFUX1NISUVMRCwKKyAgQVRfSEVMTUVULAorICBBVF9CT09ULAorICBBVF9UUk9VU0VSUywKKyAgQVRfQU1VTEVULAorICBBVF9SSU5HLAorICBBVF9HTE9WRSwKKyAgQVRfUVVJVkVSLAorICBBVF9DTE9BSywKKyAgQVRfQVJNT1VSfSk7CisKK3N0YXRpYyBtYXBwaW5nIGNvbG9ycyA9IAorKFswOkFOU0lfQkxBQ0ssCisgIDE6QU5TSV9SRUQsIAorICAyOkFOU0lfR1JFRU4sCisgIDM6QU5TSV9ZRUxMT1csCisgIDQ6QU5TSV9CTFVFLAorICA1OkFOU0lfUFVSUExFLAorICA2OkFOU0lfQ1lBTiwKKyAgNzpBTlNJX1dISVRFLAorICA4OiIiXSk7CisgIAorc3RhdGljIG1hcHBpbmcgYmdjb2xvcnMgPSAKKyhbMDpBTlNJX0JHX0JMQUNLLAorICAxOkFOU0lfQkdfUkVELCAKKyAgMjpBTlNJX0JHX0dSRUVOLAorICAzOkFOU0lfQkdfWUVMTE9XLAorICA0OkFOU0lfQkdfQkxVRSwKKyAgNTpBTlNJX0JHX1BVUlBMRSwKKyAgNjpBTlNJX0JHX0NZQU4sCisgIDc6QU5TSV9CR19XSElURSwKKyAgODoiIl0pOworICAKKworCitzdGF0aWMgc3RyaW5nIE1hcHBpbmcyQ29sb3JlZFRleHQobWFwcGluZyBwaWMsIG9iamVjdCBwbGF5ZXIpOworc3RhdGljIHN0cmluZyBNYXBwaW5nMlBsYWluVGV4dChtYXBwaW5nIHBpYyk7CitzdGF0aWMgdm9pZCBBZGREZXNjcmlwdGlvbihtYXBwaW5nIHBpYywgc3RyaW5nIHR5cGUsIG9iamVjdCBpdGVtKTsKK3N0YXRpYyBzdHJpbmcgQ29tcG9zZURlc2Mob2JqZWN0IGl0ZW0pOworc3RhdGljIHZvaWQgQ29uZmlndXJlQ29sb3JzKHN0cmluZyB0ZXh0KTsKKwordm9pZCBTaG93SW52KG9iamVjdCBwbGF5ZXIsIHN0cmluZyBhcmcpOworCisvLyBvaywgbGV0tHMganVzdCByZWFkIGluIHRoZSBncmFwaGljcy4uLgorLy8gcmVhbGx5IHRha2VzIHNvbWUgdGltZSAofjI1MCBldmFsIHRpY2tzKSBidXQgaXMgb25seSBkb25lCisvLyBvbmNlIGluIGFuIHVwdGltZQordm9pZCBjcmVhdGUoKQoreworICBtYXBwaW5nIHBpYzsKKyAgc3RyaW5nICpmaWxlcywgKmxpbmVzLCB0ZXh0OworICBpbnQgaSxqLGssIGluZGVudHgsaW5kZW50eSwgY29sb3I7CisKKyAgZGF0YT0oW10pOworICAKKyAgREIoIlRyeWluZyB0byBmaXJlIHVwIG1hc3RlciwgcGF0aCBpcyAnIitJTlZQQVRIKyInLi4uIik7CisgIGZpbGVzPWdldF9kaXIoSU5WUEFUSCsiZ2Z4LyoiKS0oeyIuIiwgIi4uIn0pOworICBEQihzcHJpbnRmKCJGaWxlcyBmb3VuZCBpbiAnZ2Z4Lyc6IFxuJU8iLCBmaWxlcykpOworICBmb3IgKGk9c2l6ZW9mKGZpbGVzKS0xO2k+PTA7aS0tKQorICB7CisgICAgREIoIlJlYWRpbmcgJyIrZmlsZXNbaV0rIicgLi4uIik7CisgICAgdGV4dD1yZWFkX2ZpbGUoSU5WUEFUSCsiZ2Z4LyIrZmlsZXNbaV0pOworICAgIGlmICghc3RyaW5ncCh0ZXh0KSkKKyAgICB7CisgICAgICBEQigiRmFpbGVkIHRvIHJlYWQgZmlsZS4iKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBsaW5lcz1leHBsb2RlKHRleHQsICJcbiIpOworICAgIGlmIChzaXplb2YobGluZXMpIDwgNCkKKyAgICB7CisgICAgICBEQigiRmlsZSBjb3JydXB0LiIpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGluZGVudHg9dG9faW50KGxpbmVzWzFdKTsKKyAgICBpbmRlbnR5PXRvX2ludChsaW5lc1syXSk7CisgICAgY29sb3I9dG9faW50KGxpbmVzWzBdKTsKKyAgICBwaWM9KFtdKTsKKyAgICBmb3IgKGo9c2l6ZW9mKGxpbmVzKS0xO2o+MjtqLS0pCisgICAgeworICAgICAgZm9yIChrPXNpemVvZihsaW5lc1tqXSktMTtrPj0wO2stLSkKKyAgICAgIHsKKyAgICAgICAgaWYgKGxpbmVzW2pdW2suLmtdIT0iPyIpCisgICAgICAgICAgcGljKz0oWyhqLTMraW5kZW50eSkqODAraytpbmRlbnR4OmxpbmVzW2pdW2suLmtdO2NvbG9yXSk7CisgICAgICB9CisgICAgfQorICAgIGRhdGErPShbZmlsZXNbaV06cGljXSk7CisgICAgREIoIkZpbGUgc3VjY2Vzc2Z1bGx5IHJlYWQuIik7CisgIH0KKyAgREIoc3ByaW50ZigiVHlwZXMgY292ZXJlZDpcbiVPXG4iLCBtX2luZGljZXMoZGF0YSkpKTsKKworICAvLyBjcmVhdGUgY2xvc3VyZSBvbmx5IG9uY2UgdG8gc2F2ZSB0aW1lCisgIC8vIG5lZWRlZCBieSBDb21wb3NlRGVzYygpCisgIC8vIHRoZSBjbG9zdXJlIGlzdCBub3QgYXMgY29tcGxpY2F0ZWQgYXMgaXQgc2VlbXMgOykKKyAgLy8gaXQganVzdCBjaGVja3MgZXZlcnkgd29yZCBvZiB0aGUgbmFtZSwgaWYgaXQgZG9lcyBub3QgYmVnaW4KKyAgLy8gd2l0aCBhIGNhcGl0YWwgbGV0dGVyLCBpdCBpcyBhYmJyZXZpYXRlZAorICAvLyB0aGlzIGhhcHBlbnMgb25seSBpZiB0aGUgbmFtZSBsZW5ndGggZXhjZWVkcyAyMCBjaGFycy4uLgorICBhYmJyZXZpYXRlPWxhbWJkYSgoeyd4fSksIAorICAgICAgKHsjJz8sICh7Iyc+LCAoeyMnbWVtYmVyLCBxdW90ZSgoeyJkZXIiLCAiZGVzIn0pKSwgJ3h9KSwgMH0pLAorICAgICAgICAiZC4iLAorICAgICAgICAoeyMnPywgKHsjJz4sICh7IydzaXplb2YsICd4fSksIDN9KSwgCisgICAgICAgICAgKHsjJz8sICh7IycsLCAoeyMnPSwgJ2EsICh7IydhbGxvY2F0ZSwgMX0pIH0pLAorICAgICAgICAgICAgICAgICAgICAgICAgKHsjJz0sICh7IydbLCAnYSwgMH0pLCAneCB9KSwgCisgICAgICAgICAgICAgICAgICAgICAgICAoeyMnc2l6ZW9mLCAoeyMncmVnZXhwLCAnYSwgIl5bYS16XS4qIn0pIH0pIAorICAgICAgICAgICAgICAgICB9KSwgCisgICAgICAgICAgICAoeyMnKywgKHsjJ1suLl0sICd4LCAwLCAxfSksICIuIn0pLAorICAgICAgICAgICAgJ3gKKyAgICAgICAgICB9KSwgCisgICAgICAgICAgJ3gKKyAgICAgICAgfSkKKyAgICAgIH0pKTsKK30KKworLy8gZnVuY3Rpb24gdGhhdCB0cmllcyB0byBndWVzcyBhIGdvb2QgaXRlbSBuYW1lIGFuZCB1c2UgYWJicmV2YXRpb25zCisvLyB3aGVyZSBwb3NzaWJsZQorc3RhdGljIHN0cmluZyBDb21wb3NlRGVzYyhvYmplY3QgaXRlbSkKK3sKKyAgaW50IGk7CisgIHN0cmluZyB0ZXh0LCAqYnVmZjsKKyAgCisgIHRleHQ9cmVncmVwbGFjZShpdGVtLT5RdWVyeVByb3AoUF9TSE9SVCkKKyAgICAgICAgICAgICAgICB8fGl0ZW0tPlF1ZXJ5UHJvcChQX05BTUUpCisgICAgICAgICAgICAgICAgfHwiPD8+IiwKKyAgICAgICAgICAgICAgICAiXihFaW4gUGFhcnxFaW58RWluZXxEZXJ8RGllfERhcykgIiwiIiwwKTsKKyAgICAgICAgICAgICAgICAKKy8vIHRyeSB0byBzaG9ydGVuIHRoZSBuYW1lIHdpdGggdGhlIGNsb3N1cmUKKyAgaWYgKHNpemVvZih0ZXh0KSA+IDIwKQorICAgIHJldHVybiBpbXBsb2RlKG1hcChleHBsb2RlKHRleHQsICIgIiksIGFiYnJldmlhdGUpLCAiICIpOworICBlbHNlICAgICAgCisgICAgcmV0dXJuIHRleHQ7Cit9CisKKy8vIGNvbnZlcnRzIGEgbWFwcGluZyB3aXRoIGNoYXJhY3RlcnMgYW5kIGNvbG9yIGluZm8gaW50byBhCisvLyB0ZXh0LiBkYXRhIGluIHRoZSBtYXBwaW5nIGlzIHN0b3JlZCBpbiBhIG9uZS1kaW1lbnNpb25hbCAKKy8vIG9yZGVyIHdpdGggdGhlIHBvc2l0aW9uIGFzIGtleSAoeXBvcyBpcyBwb3MvODAsIHhwb3MgcG9zJTgwKQorLy8gdGhpcyBzZXR1cCBoYXMgYSBodWdlIGFkdmFudGFnZTogY29tYmluaW5nIHNldmVyYWwKKy8vIGdyYXBoaWNzIGp1c3QgdGFrZXMgYSAiKyIgb3BlcmF0b3IsIHRoZSByZXN0IGlzIGhhbmRsZWQKKy8vIGJ5IHRoZSBnYW1lIGRyaXZlci4gZnJlYWtpbicgZmFzdCwgbXVjaCBiZXR0ZXIgdGhhbiBkb2luZyBhbgorLy8gaXRlcmF0aW9uIG92ZXIgb25lIG9yIG1vcmUgYXJyYXkgaW4gbHBjLgorc3RhdGljIHN0cmluZyBNYXBwaW5nMkNvbG9yZWRUZXh0KG1hcHBpbmcgcGljLCBvYmplY3QgcGxheWVyKQoreworICBzdHJpbmcgdGV4dDsKKyAgbWFwcGluZyBjb25maWdtYXA7CisgIGludCBpLGosY29sb3I7CisgIAorICBjb25maWdtYXA9ZGVmYXVsdF9jb25maWcrKHBsYXllci0+UXVlcnlQcm9wKFBfSU5WTUFTVEVSX0NPTkZJRyl8fChbXSkpOworCisgIHRleHQ9IiI7CisgIGNvbG9yPTA7CisgIGZvciAoaT0wO2k8MjI7aSsrKQorICB7CisgICAgdGV4dCs9Ymdjb2xvcnNbY29uZmlnbWFwWzhdXTsKKyAgICBmb3IgKGo9MDtqPDc4O2orKykKKyAgICB7IAorICAgICAgaWYgKHBpY1tpKjgwK2osMV0hPWNvbG9yKQorICAgICAgeworICAgICAgICBjb2xvcj1waWNbaSo4MCtqLDFdOworICAgICAgICB0ZXh0Kz1jb2xvcnNbY29uZmlnbWFwW2NvbG9yXV07CisgICAgICB9CisgICAgICB0ZXh0Kz1waWNbaSo4MCtqXTsKKyAgICB9CisgICAgdGV4dCs9QU5TSV9OT1JNQUwrIlxuIjsKKyAgICBjb2xvcj0wOworICB9CisgIHJldHVybiB0ZXh0OworfQorCitzdGF0aWMgc3RyaW5nIE1hcHBpbmcyUGxhaW5UZXh0KG1hcHBpbmcgcGljKQoreworICBzdHJpbmcgdGV4dDsKKyAgaW50IGksajsKKyAgCisgIHRleHQ9IiI7CisKKyAgZm9yIChpPTA7aTwyMjtpKyspCisgIHsKKyAgICBmb3IgKGo9MDtqPDc4O2orKykKKyAgICAgIHRleHQrPXBpY1tpKjgwK2pdOworICAgIHRleHQrPSJcbiI7CisgIH0KKyAgcmV0dXJuIHRleHQ7Cit9CitzdGF0aWMgdm9pZCBBZGREZXNjcmlwdGlvbihtYXBwaW5nIHBpYywgc3RyaW5nIHR5cGUsIG9iamVjdCBpdGVtKQoreworICBpbnQgaW5kZW50eCwgaW5kZW50eSwgaTsKKyAgc3RyaW5nIHRleHQ7CisKKyAgc3dpdGNoKHR5cGUpCisgIHsKKyAgIGNhc2UgQVRfSEVMTUVUOgorICAgICAgaW5kZW50eD00NzsKKyAgICAgIGluZGVudHk9MDsKKyAgICAgIHRleHQ9c3ByaW50ZigiJS0zMHMiLENvbXBvc2VEZXNjKGl0ZW0pWzAuLjMwXSk7YnJlYWs7CisgICAgY2FzZSBBVF9RVUlWRVI6CisgICAgICBpbmRlbnR4PTQ5OworICAgICAgaW5kZW50eT0yOworICAgICAgdGV4dD1zcHJpbnRmKCIlLTI4cyIsQ29tcG9zZURlc2MoaXRlbSlbMC4uMjhdKTticmVhazsgICAgIAorICAgIGNhc2UgQVRfQU1VTEVUOgorICAgICAgaW5kZW50eD00OTsKKyAgICAgIGluZGVudHk9NDsgICAgIAorICAgICAgdGV4dD1zcHJpbnRmKCIlLTI3cyIsQ29tcG9zZURlc2MoaXRlbSlbMC4uMjhdKTticmVhazsgICAgIAorICAgIGNhc2UgQVRfQVJNT1VSOgorICAgICAgaW5kZW50eD01MzsKKyAgICAgIGluZGVudHk9NzsKKyAgICAgIHRleHQ9c3ByaW50ZigiJS0yNHMiLENvbXBvc2VEZXNjKGl0ZW0pWzAuLjI1XSk7YnJlYWs7ICAgICAgICAgIAorICAgIGNhc2UgQVRfU0hJRUxEOgorICAgICAgaW5kZW50eD01NDsKKyAgICAgIGluZGVudHk9MTA7ICAgCisgICAgICB0ZXh0PXNwcmludGYoIiUtMjBzIixDb21wb3NlRGVzYyhpdGVtKVswLi4yNF0pO2JyZWFrOworICAgIGNhc2UgQVRfQ0xPQUs6CisgICAgICBpbmRlbnR4PTUzOworICAgICAgaW5kZW50eT0xNTsKKyAgICAgIHRleHQ9c3ByaW50ZigiJS0yMHMiLENvbXBvc2VEZXNjKGl0ZW0pWzAuLjI1XSk7YnJlYWs7CisgICAgY2FzZSBBVF9UUk9VU0VSUzoKKyAgICAgIGluZGVudHg9NDk7CisgICAgICBpbmRlbnR5PTE3OworICAgICAgdGV4dD1zcHJpbnRmKCIlLTIwcyIsQ29tcG9zZURlc2MoaXRlbSlbMC4uMjBdKTticmVhazsgICAgIAorICAgIGNhc2UgQVRfUklORzoKKyAgICAgIGluZGVudHg9MDsKKyAgICAgIGluZGVudHk9OTsKKyAgICAgIHRleHQ9c3ByaW50ZigiJTE0cyIsQ29tcG9zZURlc2MoaXRlbSlbMC4uMTddKTticmVhazsKKyAgICBjYXNlIEFUX0dMT1ZFOgorICAgICAgaW5kZW50eD0wOworICAgICAgaW5kZW50eT0xMTsKKyAgICAgIHRleHQ9c3ByaW50ZigiJTE0cyIsQ29tcG9zZURlc2MoaXRlbSlbMC4uMTddKTticmVhazsKKyAgICBjYXNlIEFUX0JFTFQ6CisgICAgICBpbmRlbnR4PTE7CisgICAgICBpbmRlbnR5PTEzOworICAgICAgdGV4dD1zcHJpbnRmKCIlMTRzIixDb21wb3NlRGVzYyhpdGVtKVswLi4xOF0pO2JyZWFrOyAgICAgCisgICAgY2FzZSBBVF9CT09UOgorICAgICAgaW5kZW50eD0xOworICAgICAgaW5kZW50eT0yMDsKKyAgICAgIHRleHQ9c3ByaW50ZigiJTE4cyIsQ29tcG9zZURlc2MoaXRlbSlbMC4uMThdKTticmVhazsKKyAgICBjYXNlICJXYWZmZSI6CisgICAgICBpbmRlbnR4PTE7CisgICAgICBpbmRlbnR5PTE7CisgICAgICB0ZXh0PXNwcmludGYoIiUxOHMiLENvbXBvc2VEZXNjKGl0ZW0pWzAuLjI1XSk7CisgICAgICBpZiAoaXRlbS0+UXVlcnlQcm9wKFBfTlJfSEFORFMpID4gMSAmJgorICAgICAgICAgIHRoaXNfcGxheWVyKCkgJiYKKyAgICAgICAgICAhKHRoaXNfcGxheWVyKCktPlF1ZXJ5QXJtb3JCeVR5cGUoQVRfU0hJRUxEKSkpCisgICAgICAgIEFkZERlc2NyaXB0aW9uKHBpYywgQVRfU0hJRUxELCBpdGVtKTticmVhazsKKyAgICBkZWZhdWx0OiByZXR1cm47CisgIH0KKyAgZm9yIChpPTA7aTxzaXplb2YodGV4dCk7aSsrKQorICAgIHBpYys9KFsoODAqaW5kZW50eStpbmRlbnR4K2kpOnRleHRbaS4uaV07Ml0pOworfQorCit2YXJhcmdzIHN0YXRpYyB2b2lkIENvbmZpZ3VyZUNvbG9ycyhzdHJpbmcgdGV4dCkKK3sgCisgIG1hcHBpbmcgY29uZmlnLCBkaXNwbGF5OworICBzdHJpbmcgKnN0cnM7CisgIAorICBpZiAoIW9iamVjdHAodGhpc19wbGF5ZXIoKSkpIHJldHVybjsKKyAgCisgIGlmICh0aGlzX3BsYXllcigpLT5JbkZpZ2h0KCkpCisgIHsKKyAgICB3cml0ZShicmVha19zdHJpbmcoCisgICAgICAiSW0gS2FtcGY/IE5hIER1IGhhc3QgTmVydmVuLCBkYXMgbGFzc2VuIHdpciBkb2NoIG1hbCBsaWViZXIhICIKKyAgICAgICJQcm9iaWVyIGVzIGRhbmFjaCBub2NobWFsLi4uIiwgNzgpKTsKKyAgICByZXR1cm47CisgIH0KKyAgCisgIGlmIChzdHJpbmdwKHRleHQpKSB0ZXh0PWxvd2VyX2Nhc2UodGV4dCk7CisgIAorICBpZiAodGV4dD09Im9rIikKKyAgeworICAgIHdyaXRlKCJGYXJia29uZmlndXJhdGlvbiBiZWVuZGV0LlxuIik7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8iYW5zaV9jb25maWciLCBkZWYgaW4gaW52bWFzdGVyLmgKKyAgY29uZmlnPXRoaXNfcGxheWVyKCktPlF1ZXJ5UHJvcChQX0lOVk1BU1RFUl9DT05GSUcpfHwoW10pOworICBkaXNwbGF5PWRlZmF1bHRfY29uZmlnK2NvbmZpZzsKKyAgCisgIGlmICghdGV4dCB8fCB0ZXh0PT0iIikKKyAgeworICAgIHdyaXRlKCAKKyAgICAiKioqIEZhcmJrb25maWd1cmF0aW9uIGZ1ZXIgZGVuIEF1c3J1ZXN0dW5nc2JlZmVobCAqKipcblxuIgorICAgICIgRmFyYmU6ICAgICAgICAgICAgICAgICAgICAgd2lyZCBkYXJnZXN0ZWxsdCBtaXQ6XG4iCisgICAgIi0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgorICAgICIgSGludGVyZ3J1bmQgICAgICAgICAgICAgICAgICIrQ09MT1JOQU1FU1tkaXNwbGF5WzhdXSsiXG4iCisgICAgIiBTY2h3YXJ6ICAgICAgICAgICAgICAgICAgICAgIitDT0xPUk5BTUVTW2Rpc3BsYXlbMF1dKyJcbiIKKyAgICAiIFJvdCAgICAgICAgICAgICAgICAgICAgICAgICAiK0NPTE9STkFNRVNbZGlzcGxheVsxXV0rIlxuIgorICAgICIgR3J1ZW4gICAgICAgICAgICAgICAgICAgICAgICIrQ09MT1JOQU1FU1tkaXNwbGF5WzJdXSsiXG4iCisgICAgIiBHZWxiICAgICAgICAgICAgICAgICAgICAgICAgIitDT0xPUk5BTUVTW2Rpc3BsYXlbM11dKyJcbiIKKyAgICAiIEJsYXUgICAgICAgICAgICAgICAgICAgICAgICAiK0NPTE9STkFNRVNbZGlzcGxheVs0XV0rIlxuIgorICAgICIgTWFnZW50YSAgICAgICAgICAgICAgICAgICAgICIrQ09MT1JOQU1FU1tkaXNwbGF5WzVdXSsiXG4iCisgICAgIiBUdWVya2lzICAgICAgICAgICAgICAgICAgICAgIitDT0xPUk5BTUVTW2Rpc3BsYXlbNl1dKyJcbiIKKyAgICAiIFdlaXNzICAgICAgICAgICAgICAgICAgICAgICAiK0NPTE9STkFNRVNbZGlzcGxheVs3XV0rIlxuXG4iCisgICAgIkZhcmJlIGFlbmRlcm4gbWl0ICc8ZmFyYmU+IDxnZXd1ZW5zY2h0ZSBmYXJiZT4nLlxuIgorICAgICJCZWlzcGllbDogJ2dlbGIgcm90Jy5cbiIKKyAgICAiQWxsZXMsIHdhcyBzdGFuZGFyZG1hZXNzaWcgZ2VsYiB3YWVyZSwgd3VlcmRlIGRhbm4gbWl0IGRlciBBTlNJLUZhcmJlIFxuIgorICAgICJSb3QgZGFyZ2VzdGVsbHQuXG4iCisgICAgIkRlciBIaW50ZXJncnVuZCBrYW5uIHp1c2FldHpsaWNoIGRpZSBGYXJiZSAna2VpbmUnIGhhYmVuLCBiZWkgZGVyIGRlciBcbiIKKyAgICAiSGludGVyZ3J1bmQgZWJlbiB1ZWJlcmhhdXB0IG5pY2h0IGdlZmFlcmJ0IHdpcmQuXG4iCisgICAgIkJlaXNwaWVsOiAnaGludGVyZ3J1bmQga2VpbmUnLiBTY2hhbHRldCBkaWUgSGludGVyZ3J1bmRmYXJiZSBhdXMuXG5cbiIKKyAgICAiQmVlbmRlbiBtaXQgJ29rJy4gXG4iCisgICAgIldpZWRlcmhvbHVuZyBkZXIgRmFyYmxpc3RlIG1pdCA8UmV0dXJuPi5cbiIKKyAgICAiRmFyYmxpc3RlIGF1ZiBTdGFuZGFyZCB6dXJ1ZWNrc2V0emVuIG1pdCAncmVzZXQnLlxuIik7CisgIH0KKyAgZWxzZQorICBpZiAodGV4dD09InJlc2V0IikKKyAgeworICAgIHRoaXNfcGxheWVyKCktPlNldChQX0lOVk1BU1RFUl9DT05GSUcsIFNBVkUsIEZfTU9ERV9BRCk7ICAgIAorICAgIHRoaXNfcGxheWVyKCktPlNldFByb3AoUF9JTlZNQVNURVJfQ09ORklHLCAwKTsKKyAgICB3cml0ZSgiRmFyYmVuIHp1cnVlY2tnZXNldHp0IVxuIik7ICAgIAorICB9CisgIGVsc2UKKyAgeworICAgIGlmICggc2l6ZW9mKHN0cnM9ZXhwbG9kZSh0ZXh0LCAiICIpLSh7IiJ9KSkgIT0yIAorICAgICAgfHwgIW1lbWJlcigoQ09MT1JDT0RFUy0oWyJrZWluZSJdKSksIHN0cnNbMF0pCisgICAgICB8fCAhbWVtYmVyKChDT0xPUkNPREVTLShbImhpbnRlcmdydW5kIl0pKSwgc3Ryc1sxXSkKKyAgICAgIHx8ICgoc3Ryc1swXSE9ImhpbnRlcmdydW5kIikgJiYgKHN0cnNbMV09PSJrZWluZSIpKSApIAorICAgIHsKKyAgICAgIHdyaXRlKCJGYWxzY2hlIEVpbmdhYmUuXG4iCisgICAgICAgICAgICAiRm9ybWF0OiA8ZmFyYmV8aGludGVyZ3J1bmQ+IDx6dWdld2llc2VuZSBGYXJiZT5cbiIKKyAgICAgICAgICAgICJBYmJyZWNoZW4gbWl0ICdvaycuXG4iKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmIChDT0xPUkNPREVTW3N0cnNbMV1dPT1kZWZhdWx0X2NvbmZpZ1tDT0xPUkNPREVTW3N0cnNbMF1dXSkKKyAgICAgICAgY29uZmlnLT0oW0NPTE9SQ09ERVNbc3Ryc1swXV1dKTsKKyAgICAgIGVsc2UKKyAgICAgICAgY29uZmlnKz0oW0NPTE9SQ09ERVNbc3Ryc1swXV06Q09MT1JDT0RFU1tzdHJzWzFdXV0pOworICAgICAgaWYgKCFzaXplb2YoY29uZmlnKSkKKyAgICAgIHsKKyAgICAgICAgdGhpc19wbGF5ZXIoKS0+U2V0KFBfSU5WTUFTVEVSX0NPTkZJRywgU0FWRSwgRl9NT0RFX0FEKTsgICAgCisgICAgICAgIHRoaXNfcGxheWVyKCktPlNldFByb3AoUF9JTlZNQVNURVJfQ09ORklHLCAwKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgdGhpc19wbGF5ZXIoKS0+U2V0UHJvcChQX0lOVk1BU1RFUl9DT05GSUcsIGRlZXBfY29weShjb25maWcpKTsKKyAgICAgICAgdGhpc19wbGF5ZXIoKS0+U2V0KFBfSU5WTUFTVEVSX0NPTkZJRywgU0FWRSwgRl9NT0RFX0FTKTsgICAgICAgIAorICAgICAgfQorICAgICAgd3JpdGUoIk9rLCBGYXJiZSBnZXdhZWhsdCFcbiIpOworICAgIH0KKyAgfQorICBpbnB1dF90bygiQ29uZmlndXJlQ29sb3JzIiwgSU5QVVRfUFJPTVBULCAiXG5FaW5nYWJlOiAiKTsKK30KKworCitzdHJpbmcqIGFybW91cl9vcmRlcj0oeyAKKyAgICBBVF9IRUxNRVQsIEFUX0FNVUxFVCwgQVRfUVVJVkVSLCBBVF9BUk1PVVIsIEFUX0NMT0FLLAorICBBVF9HTE9WRSwgQVRfUklORywgQVRfQkVMVCwKKyAgQVRfVFJPVVNFUlMsIEFUX0JPT1QsIEFUX1NISUVMRCwgQVRfTUlTQ30pOyAKKworbWFwcGluZyB3ZWFwb25fbmFtZXM9KFsKKwkJICAgICAgIFdUX1NQRUFSIDogIlNwZWVyIiwKKwkJICAgICAgIFdUX1NXT1JEIDogIlNjaHdlcnQiLAorCQkgICAgICAgV1RfU1RBRkYgOiAiS2FtcGZzdGFiIiwKKwkJICAgICAgIFdUX1dISVAgIDogIlBlaXRzY2hlIiwKKwkJICAgICAgIFdUX0NMVUIgIDogIktldWxlIiwKKwkJICAgICAgIFdUX0tOSUZFIDogIk1lc3NlciIsCisJCSAgICAgICBXVF9NSVNDICA6ICJJcmdlbmR3YXMiLAorCQkgICAgICAgV1RfTUFHSUMgOiAiQXJ0ZWZha3QiLAorCQkgICAgICAgV1RfQVhFICAgOiAiQXh0IiwKKwkgICAgICAgV1RfUkFOR0VEX1dFQVBPTiA6ICJGZXJud2FmZmUiCisJCSAgICAgICBdKTsKKworc3RyaW5nIFNpbXBsZUludihvYmplY3QgcGxheWVyKSB7CisgIG9iamVjdCogYXJtb3Vycz1wbGF5ZXItPlF1ZXJ5UHJvcChQX0FSTU9VUlMpOworICBpbnQgY291bnQ9c2l6ZW9mKGFybW91cl9vcmRlcik7CisgIHN0cmluZyogbGlzdD1hbGxvY2F0ZShjb3VudCk7CisgIHN0cmluZyByZXN1bHQ9IkF1c3J1ZXN0dW5nXG4iOworICBpbnQgaTsKKworICBmb3JlYWNoKG9iamVjdCBvYjogYXJtb3VycykgeworICAgIGlmICghb2JqZWN0cChvYikpIGNvbnRpbnVlOworICAgICAgaW50IGlkeCA9IG1lbWJlcihhcm1vdXJfb3JkZXIsIG9iLT5RdWVyeVByb3AoUF9BUk1PVVJfVFlQRSkpOwkgICAgICAKKyAgICAgIGlmIChpZHg+PTApCisgICAgICAgIGxpc3RbaWR4XT1vYi0+UXVlcnlQcm9wKFBfU0hPUlQpOworICB9CisKKyAgLy8gQVRfTUlTQyAobGV0enRlcyBFbGVtZW50IGluIGxpc3QgdW5kIGFybW91cl9vcmRlcikgd2VnbGFzc2VuLgorICBmb3IgKGk9MDtpPGNvdW50LTE7aSsrKSB7CisgICAgcmVzdWx0Kz1zcHJpbnRmKCIlLTIwcyAlLTU3c1xuIixhcm1vdXJfb3JkZXJbaV0sbGlzdFtpXSB8fCAiIik7CisgIH0KKworICBvYmplY3Qgb2I9b2I9cGxheWVyLT5RdWVyeVByb3AoUF9XRUFQT04pOworICBpZiAob2JqZWN0cChvYikpIHsKKyAgICByZXN1bHQrPXNwcmludGYoIiUtMjBzICUtNTdzXG4iLAorCQkgICAgKG9iLT5RdWVyeVByb3AoUF9OUl9IQU5EUyk9PTEgPyAiRWluaGFuZC0iOiJad2VpaGFuZC0iKQorCQkgICAgK3dlYXBvbl9uYW1lc1tvYi0+UXVlcnlQcm9wKFBfV0VBUE9OX1RZUEUpXSwKKwkJICAgIG9iLT5RdWVyeVByb3AoUF9TSE9SVCkpOworICB9IGVsc2UgcmVzdWx0Kz0iS2VpbmUgV2FmZmVcbiI7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKy8vIHRoZSBtYWluIGZ1bmN0aW9uIGNhbGxlZCBieSB0aGUgcGxheWVyIG9iamVjdC4KKy8vIGRldGVybWluZXMgZ2VuZGVyLCB0aGVuIGFkZHMgYXJtb3Ivd2VhcG9uIGdyYXBoaWNzCisvLyBkeW5hbWljYWxseS4gc3RpbGwgdmVyeSBmYXN0IGR1ZSB0byB0aGUgdXNlIG9mIHRoZSAiKyIgb3BlcmF0b3IsCisvLyBzZWUgYWJvdmUuCit2b2lkIFNob3dJbnYob2JqZWN0IHBsYXllciwgc3RyaW5nIGFyZykKK3sKKyAgc3RyaW5nIGdlbmRlciwgdHlwZTsKKyAgbWFwcGluZyBwaWM7CisgIGludCBpOworICBvYmplY3QgaXRlbTsKKworICBpZiAoIW9iamVjdHAocGxheWVyKXx8IWludGVyYWN0aXZlKHBsYXllcikpIHJldHVybjsKKworICAvLyBzcGxpdCBhcmdzLgorICBzdHJpbmcgKmFyZ3M7CisgIGlmIChzdHJpbmdwKGFyZykpCisgICAgYXJncyA9IGV4cGxvZGUobG93ZXJfY2FzZShhcmcpLCAiICIpIC0gKHsiICJ9KTsKKyAgZWxzZQorICAgIGFyZ3MgPSAoe30pOworCisgIGlmIChtZW1iZXIoYXJncywgImZhcmJlbiIpID4gLTEpIHsKKyAgICAgIENvbmZpZ3VyZUNvbG9ycygpOworICAgICAgcmV0dXJuOworICB9CisKKyAgaWYgKG1lbWJlcihhcmdzLCAiLWsiKSA+IC0xIHx8IHBsYXllci0+UXVlcnlQcm9wKFBfTk9fQVNDSUlfQVJUKSkgeworICAgIHRlbGxfb2JqZWN0KHBsYXllciwgU2ltcGxlSW52KHBsYXllcikpOworICAgIHJldHVybjsKKyAgfQorCisgIGdlbmRlcj1wbGF5ZXItPlF1ZXJ5UHJvcChQX0dFTkRFUik9PUZFTUFMRT8iX2ZlbWFsZSI6Il9tYWxlIjsKKyAgcGljPWRlZXBfY29weShkYXRhWyJiYXNlIitnZW5kZXJdKTsKKyAgcGljKz1kYXRhWyJCZXNjaHJpZnR1bmciXTsKKyAgZm9yIChpPXNpemVvZihhcm1vdXJfdHlwZXMpLTE7aT49MDtpLS0pCisgICAgaWYgKG9iamVjdHAoaXRlbT1wbGF5ZXItPlF1ZXJ5QXJtb3VyQnlUeXBlKGFybW91cl90eXBlc1tpXSkpKQorICAgIHsKKyAgICAgIHBpYys9ZGF0YVthcm1vdXJfdHlwZXNbaV0rZ2VuZGVyXTsKKyAgICAgIEFkZERlc2NyaXB0aW9uKHBpYywgYXJtb3VyX3R5cGVzW2ldLCBpdGVtKTsKKyAgICB9CisgIGlmIChpdGVtPXBsYXllci0+UXVlcnlQcm9wKFBfV0VBUE9OKSkKKyAgeworICAgIHBpYys9ZGF0YVsoVkFMSURfV0VBUE9OX1RZUEUodHlwZT1pdGVtLT5RdWVyeVByb3AoUF9XRUFQT05fVFlQRSkpKT8KKyAgICAgIHR5cGU6V1RfTUlTQ107CisgICAgQWRkRGVzY3JpcHRpb24ocGljLCAiV2FmZmUiLCBpdGVtKTsKKyAgfSAgICAgIAorICBpZiAocGxheWVyLT5RdWVyeVByb3AoUF9UVFkpIT0iYW5zaSIpCisgICAgcGxheWVyLT5Nb3JlKE1hcHBpbmcyUGxhaW5UZXh0KHBpYykpOworICBlbHNlCisgICAgcGxheWVyLT5Nb3JlKE1hcHBpbmcyQ29sb3JlZFRleHQocGljLCBwbGF5ZXIpKTsKKyAgREIoZ2V0ZXVpZChwbGF5ZXIpKyIgZXZhbCBjb3N0OiAiKygxMDAwMDAwLWdldF9ldmFsX2Nvc3QoKSkrIiB0aWNrcy5cbiIpOworfQorCmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL2ludm1hc3Rlci9pbnZtYXN0ZXIuaCBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2ludm1hc3Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MjFiNjMKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9pbnZtYXN0ZXIuaApAQCAtMCwwICsxLDIxIEBACisjZGVmaW5lIElOVlBBVEggIi9zdGQvcGxheWVyL2ludm1hc3Rlci8iCisjZGVmaW5lIERCKHgpCisvKgorI2RlZmluZSBEQih4KSBpZiAoZmluZF9wbGF5ZXIoInJpa3VzIikpIFwKKyAgICAgICAgICAgICAgICAgICB0ZWxsX29iamVjdChmaW5kX3BsYXllcigicmlrdXMiKSwgXAorICAgICAgICAgICAgICAgICAgICAgYnJlYWtfc3RyaW5nKHgsIDc4LCAiSU5WTUFTVEVSOiAiLCAxKSk7CisqLworI2RlZmluZSBQX0lOVk1BU1RFUl9DT05GSUcgImludm1hc3Rlcl9jb25maWciCisjZGVmaW5lIENPTE9STkFNRVMgKHsiU2Nod2FyeiIsIlJvdCIsIkdydWVuIiwiR2VsYiIsXAorICAgICAgICAgICAgICAgICAgICAgIkJsYXUiLCJNYWdlbnRhIiwiVHVlcmtpcyIsIldlaXNzIiwiS2VpbmUifSkKKyNkZWZpbmUgQ09MT1JDT0RFUyAoWyJzY2h3YXJ6IjowLFwKKyAgICAgICAgICAgICAgICAgICAgICJyb3QiOjEsXAorICAgICAgICAgICAgICAgICAgICAgImdydWVuIjoyLFwKKyAgICAgICAgICAgICAgICAgICAgICJnZWxiIjozLFwKKyAgICAgICAgICAgICAgICAgICAgICJibGF1Ijo0LFwKKyAgICAgICAgICAgICAgICAgICAgICJtYWdlbnRhIjo1LFwKKyAgICAgICAgICAgICAgICAgICAgICJ0dWVya2lzIjo2LFwKKyAgICAgICAgICAgICAgICAgICAgICJ3ZWlzcyI6NyxcCisgICAgICAgICAgICAgICAgICAgICAia2VpbmUiOjgsXAorICAgICAgICAgICAgICAgICAgICAgImhpbnRlcmdydW5kIjo4XSkKKyNkZWZpbmUgZGVmYXVsdF9jb25maWcgKFswOjAsIDE6MSwgMjoyLCAzOjMsIDQ6NCwgNTo1LCA2OjYsIDc6NywgODowXSkKZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvbGlmZS5jIGIvc3RkL3BsYXllci9saWZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNmMWZmNwotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvbGlmZS5jCkBAIC0wLDAgKzEsODQxIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gcGxheWVyL2xpZmUuYyAtLSBwbGF5ZXIgbGlmZSBoYW5kbGluZworLy8KKy8vICRJZDogbGlmZS5jIDkzOTcgMjAxNS0xMi0xMSAyMDoyOToyNlogWmVzc3RyYSAkCisKKy8vIERlZmluZXMgc29tZSB0aGluZ3Mgd2hpY2ggYXJlIGRpZmZlcmVudCB0aGFuIGluIGxpdmluZy5jCisvLyBPbmUgZXhhbXBsZSBpcyB0aGUgaGVhcnRfYmVhdCgpLgorCisvLyBQcm9wZXJ0aWVzCisvLyAgUF9BR0UgICAgICAgICAgIC0tIEFnZQorCisjcHJhZ21hIHN0cm9uZ190eXBlcywgc2F2ZV90eXBlcywgcnR0X2NoZWNrcworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCitpbmhlcml0ICIvc3RkL2xpdmluZy9saWZlIjsKKworI2luY2x1ZGUgPHJ0bGltaXRzLmg+CisjaW5jbHVkZSA8ZGVidWdfaW5mby5oPgorCisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPHRoaW5nL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxwbGF5ZXIvYmFzZS5oPgorI2luY2x1ZGUgPHBsYXllci9saWZlLmg+CisjaW5jbHVkZSA8bW92aW5nLmg+CisjaW5jbHVkZSA8cGxheWVyL2NvbW0uaD4KKyNpbmNsdWRlIDxwbGF5ZXIvZ21jcC5oPgorI3VuZGVmIE5FRURfUFJPVE9UWVBFUworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGhvb2suaD4KKworI2luY2x1ZGUgPGxpdmluZy9saWZlLmg+CisjaW5jbHVkZSA8cGxheWVyL3BrbG9nLmg+CisjaW5jbHVkZSA8cGxheWVyL2NvbWJhdC5oPgorI2luY2x1ZGUgPGhlYWx0aC5oPgorI2luY2x1ZGUgPGxpdmluZy9jb21iYXQuaD4KKyNpbmNsdWRlIDxhdHRyaWJ1dGVzLmg+CisjaW5jbHVkZSA8ZGVmdWVsLmg+CisjaW5jbHVkZSA8bmV3X3NraWxscy5oPgorCisvLyBEaWUgRm9sZ2VuIGVpbmVzIFRvZGVzIHdpcmtlbiA0IFN0dW5kZW4gbGFuZyBuYWNoCisjZGVmaW5lIFNVRkZFUl9USU1FIDcyMDAKKyNkZWZpbmUgUF9ERUFUSF9JTkZPICJkZWF0aF9pbmZvIgorCitpbnQgYWdlOyAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBoZWFydCBiZWF0cyBvZiB0aGlzIGNoYXJhY3Rlci4gKi8KKworcHJpdmF0ZSBpbnQgc3VmZmVyX3RpbWU7CitzdGF0aWMgaW50IHRpbWVfdG9fc2F2ZTsgIC8qIHdoZW4gdG8gbmV4dCBzYXZlIHBsYXllciAqLworcHJpdmF0ZSBub3NhdmUgaW50IGRpZV9pbl9wcm9ncmVzczsgLy8gc2VtYXBob3JlIGZ1ZXIgZGllKCktQXVmcnVmZS4KKworc3RhdGljIGludCBfc2V0X3BsYXllcmtpbGxzKCBpbnQgdmFsICk7CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgICAgOjpjcmVhdGUoKTsKKyAgICBTZXQoUF9BR0UsIC0xLCBGX1NFVF9NRVRIT0QpOworICAgIFNldChQX0FHRSwgUFJPVEVDVEVELCBGX01PREUpOworICAgIFNldCggUF9LSUxMUywgU0FWRXxTRUNVUkVELCBGX01PREVfQVMgKTsKKyAgICBTZXQoIFBfR0hPU1QsIFNBVkUsIEZfTU9ERV9BUyApOworICAgIFNldCggUF9USU1JTkdfTUFQLCBTQVZFfFNFQ1VSRUQsIEZfTU9ERV9BUyApOworICAgIFNldCggUF9MQVNUX0RFQVRIX1RJTUUsIFNBVkV8U0VDVVJFRCwgRl9NT0RFX0FTICk7CisgICAgU2V0KCBQX0RFQVRIX0lORk8sIFNBVkV8U0VDVVJFRCwgRl9NT0RFX0FTICk7CisgICAgU2V0KCBQX0RFRlVFTF9MSU1JVF9GT09ELFBST1RFQ1RFRCxGX01PREVfQVMpOworICAgIFNldCggUF9ERUZVRUxfTElNSVRfRFJJTkssUFJPVEVDVEVELEZfTU9ERV9BUyk7CisgICAgU2V0KCBQX0RFRlVFTF9USU1FX0ZPT0QsUFJPVEVDVEVELEZfTU9ERV9BUyk7CisgICAgU2V0KCBQX0RFRlVFTF9USU1FX0RSSU5LLFBST1RFQ1RFRCxGX01PREVfQVMpOworICAgIFNldCggUF9ERUZVRUxfQU1PVU5UX0ZPT0QsUFJPVEVDVEVELEZfTU9ERV9BUyk7CisgICAgU2V0KCBQX0RFRlVFTF9BTU9VTlRfRFJJTkssUFJPVEVDVEVELEZfTU9ERV9BUyk7CisgICAgb2ZmZXJIb29rKEhfSE9PS19IUCwxKTsKKyAgICBvZmZlckhvb2soSF9IT09LX1NQLDEpOworICAgIC8vIFBfVElNSU5HX01BUCBhdWZyYWV1bWVuLCBhYmVyIHplaXR2ZXJ6b2VnZXJ0LCB3ZWlsIGpldHp0IGRpZSBEYXRlbiBub2NoCisgICAgLy8gbmljaHQgYXVzIGRlbSBTYXZlZmlsZSBnZWxhZGVuIHd1cmRlbi4KKyAgICBjYWxsX291dCgjJ2V4cGlyZV90aW1pbmdfbWFwLCA0KTsKK30KKworLy8gY2FsbGVkIGZyb20gYmFzZS5jIGluIFJlY29ubmVjdCgpCitwcm90ZWN0ZWQgdm9pZCByZWNvbm5lY3QoKSB7CisgIGV4cGlyZV90aW1pbmdfbWFwKCk7Cit9CisKK3N0YXRpYyBpbnQgX3NldF9wbGF5ZXJraWxscyggaW50IHZhbCApCit7CisgICAgc3RyaW5nIHRtcDsKKyAgICBpbnQgcGxheWVya2lsbHM7CisKKyAgICAvLyBpc3QgZGVyIFNldHplciBpbiBlaW5lciBBcmVuYS9TY2hhdHRlbndlbHQuIERhbm4gbmljaHQuIChKYSwgQnVnIGlzdCwKKyAgICAvLyBkYXNzIEVNcyBhdXMgU2NoYXR0ZW53ZWx0L0FyZW5hIGhlcmF1cyBhdWNoIGRhcyBQSy1GbGFnIG5pY2h0CisgICAgLy8genVydWVja3NldHplbiBrb2VubmVuLikKKyAgICBpZiAoIHByZXZpb3VzX29iamVjdCgxKSAmJiBlbnZpcm9ubWVudChwcmV2aW91c19vYmplY3QoMSkpICYmCisgICAgICAgICAodG1wID0gb2JqZWN0X25hbWUoZW52aXJvbm1lbnQocHJldmlvdXNfb2JqZWN0KDEpKSkpICYmCisgICAgICAgICBDaGVja0FyZW5hRmlnaHQocHJldmlvdXNfb2JqZWN0KDEpKSApCisgICAgICAgIHJldHVybiAwOworCisgICAgdG1wID0gc3ByaW50ZiggIiVPOiAlcyAlTyAlcyIsCisgICAgICAgICAgICAgICAgICAgcHJldmlvdXNfb2JqZWN0KDEpIHx8IHRoaXNfaW50ZXJhY3RpdmUoKSB8fCB0aGlzX3BsYXllcigpLAorICAgICAgICAgICAgICAgICAgIGdldHVpZChNRSksIHZhbCwgZHRpbWUodGltZSgpKSApOworCisgICAgcGxheWVya2lsbHMgPSBRdWVyeShQX0tJTExTKTsKKworICAgIGlmKCBpbnRwKHZhbCkgJiYgdmFsID49IDAgKQorICAgICAgICBpZiggcHJldmlvdXNfb2JqZWN0KDEpICYmIElTX0FSQ0goZ2V0dWlkKHByZXZpb3VzX29iamVjdCgxKSkpICYmCisgICAgICAgICAgICB0aGlzX2ludGVyYWN0aXZlKCkgJiYgSVNfQVJDSCh0aGlzX2ludGVyYWN0aXZlKCkpICkKKyAgICAgICAgICAgIHBsYXllcmtpbGxzID0gdmFsOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0bXAgKz0gIiBJTExFR0FMISI7CisgICAgZWxzZQorICAgICAgICBwbGF5ZXJraWxscysrOworCisgICAgaWYgKCAhcHJldmlvdXNfb2JqZWN0KDEpIHx8ICFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHByZXZpb3VzX29iamVjdCgxKSkgfHwKKyAgICAgICAgIElTX0xFQVJORVIocHJldmlvdXNfb2JqZWN0KDEpKSApCisgICAgICAgIGxvZ19maWxlKCAiU0VUX0tJTExTIiwgdG1wICsgIlxuIiApOworCisgICAgcmV0dXJuIFNldCggUF9LSUxMUywgcGxheWVya2lsbHMgKTsKK30KKworCitwdWJsaWMgaW50IGRlYXRoX3N1ZmZlcmluZygpCit7CisgICAgaWYgKCBzdWZmZXJfdGltZSA8PSAwICkKKyAgICByZXR1cm4gc3VmZmVyX3RpbWUgPSAwOworCisgICAgcmV0dXJuIDEgKyAoMTAgKiBzdWZmZXJfdGltZSkgLyBTVUZGRVJfVElNRTsKK30KKworCitwcm90ZWN0ZWQgdm9pZCBoZWFydF9iZWF0KCkKK3sKKyAgICBtYXBwaW5nIGRpLCBtb2RzOworCisgICAgKythZ2U7IC8vIGVyc3RtYWwgYWx0ZXJuIDstKQorCisgICAgOjpoZWFydF9iZWF0KCk7CisKKyAgICBpZiAoIGFnZSA+IHRpbWVfdG9fc2F2ZSApeworICAgICAgICBzYXZlX21lKDEpOworICAgICAgICB0aW1lX3RvX3NhdmUgPSBhZ2UgKyA1MDA7CisgICAgfQorCisgICAgLy8gYWxzIGdlaXN0IGhhdCBtYW4gbWl0IGRlbiBtZWlzdGVuIHdlbHRsaWNoZW4gRGluZ2VuIG5pY2h0IGFsbHp1dmllbCB6dQorICAgIC8vIHR1bi4KKyAgICBpZiAoIFF1ZXJ5UHJvcChQX0dIT1NUKSApCisgICAgICAgIHJldHVybjsKKworICAgIGlmICggc3VmZmVyX3RpbWUgPiAwICkKKyAgICAgICAgc3VmZmVyX3RpbWUtLTsKKworICAgIC8vIFRvZGVzZm9sZ2VuIG51ciBhbGxlIDIwIFNla3VuZGVuICgxMCBIQikgY2hlY2tlbi4KKyAgICAvLyBEYXMgaXN0IGltbWVyIG5vY2ggb2Z0IGdlbnVnIHVuZCBzcGFydCBSZWNoZW56ZWl0LgorICAgIGlmICggKGFnZSAlIDEwKSB8fCAhbWFwcGluZ3AoZGkgPSBRdWVyeVByb3AoUF9ERUFUSF9JTkZPKSkgKQorICAgICAgICByZXR1cm47CisKKyAgICBtb2RzID0gUXVlcnlQcm9wKFBfQVRUUklCVVRFU19NT0RJRklFUilbIiNkZWF0aCJdOworICAgIGlmICghbWFwcGluZ3AobW9kcykpIHJldHVybjsKKworICAgIGlmICggbW9kc1tBX1NUUl0gJiYgLS1kaVtBX1NUUl0gPD0gMCkgeworICAgICAgICAvLyBlaW5lbiBBdHRyaWJ1dHNwdW5rdCByZWdlbmVyaWVyZW4KKyAgICAgICAgaWYgKCBtb2RzW0FfU1RSXSA8IC0xICkgeworICAgICAgICAgICAgbW9kc1tBX1NUUl0rKzsKKyAgICAgICAgICAgIGRpW0FfU1RSXSA9ICgxMTAgKyA1ICogKGRpW0FfU1RSLCAxXSArIG1vZHNbQV9TVFJdKSkgLyAxMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG1fZGVsZXRlKCBtb2RzLCBBX1NUUiApOworICAgICAgICAgICAgbV9kZWxldGUoIGRpLCBBX1NUUiApOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCBtb2RzW0FfQ09OXSAmJiAtLWRpW0FfQ09OXSA8PSAwKSB7CisgICAgICAgIC8vIGVpbmVuIEF0dHJpYnV0c3B1bmt0IHJlZ2VuZXJpZXJlbgorICAgICAgICBpZiAoIG1vZHNbQV9DT05dIDwgLTEgKXsKKyAgICAgICAgICAgIG1vZHNbQV9DT05dKys7CisgICAgICAgICAgICBkaVtBX0NPTl0gPSAoMTEwICsgNSAqIChkaVtBX0NPTiwgMV0gKyBtb2RzW0FfQ09OXSkpIC8gMTA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBtX2RlbGV0ZSggbW9kcywgQV9DT04gKTsKKyAgICAgICAgICAgIG1fZGVsZXRlKCBkaSwgQV9DT04gKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICggbW9kc1tBX0RFWF0gJiYgLS1kaVtBX0RFWF0gPD0gMCkgeworICAgICAgICAvLyBlaW5lbiBBdHRyaWJ1dHNwdW5rdCByZWdlbmVyaWVyZW4KKyAgICAgICAgaWYgKCBtb2RzW0FfREVYXSA8IC0xICl7CisgICAgICAgICAgICBtb2RzW0FfREVYXSsrOworICAgICAgICAgICAgZGlbQV9ERVhdID0gKDExMCArIDUgKiAoZGlbQV9ERVgsIDFdICsgbW9kc1tBX0RFWF0pKSAvIDEwOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbV9kZWxldGUoIG1vZHMsIEFfREVYICk7CisgICAgICAgICAgICBtX2RlbGV0ZSggZGksIEFfREVYICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIG1vZHNbQV9JTlRdICYmIC0tZGlbQV9JTlRdIDw9IDApIHsKKyAgICAgICAgLy8gZWluZW4gQXR0cmlidXRzcHVua3QgcmVnZW5lcmllcmVuCisgICAgICAgIGlmICggbW9kc1tBX0lOVF0gPCAtMSApeworICAgICAgICAgICAgbW9kc1tBX0lOVF0rKzsKKyAgICAgICAgICAgIGRpW0FfSU5UXSA9ICgxMTAgKyA1ICogKGRpW0FfSU5ULCAxXSArIG1vZHNbQV9JTlRdKSkgLyAxMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG1fZGVsZXRlKCBtb2RzLCBBX0lOVCApOworICAgICAgICAgICAgbV9kZWxldGUoIGRpLCBBX0lOVCApOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCBzaXplb2YoZGkpICYmIHNpemVvZihtb2RzKSkKKyAgICAgICAgU2V0UHJvcCggUF9ERUFUSF9JTkZPLCBkaSApOworICAgIGVsc2UKKyAgICAgICAgU2V0UHJvcCggUF9ERUFUSF9JTkZPLCAwICk7CisKKyAgICBTZXRQcm9wKCBQX0FUVFJJQlVURVNfTU9ESUZJRVIsICh7ICIjZGVhdGgiLCBtb2RzIH0pICk7Cit9CisKKworcHVibGljIHZvaWQgZm9yY2Vfc2F2ZSgpIHsKKyAgICB0aW1lX3RvX3NhdmUgPSAwOworfQorCisKK25vbWFzayBwdWJsaWMgaW50IGRvX2RhbWFnZSggaW50IGRhbSwgb2JqZWN0IGVuZW15ICkKK3sKKyAgICBpbnQgaGl0X3BvaW50OworCisgICAgaWYoIFF1ZXJ5UHJvcChQX0dIT1NUKSB8fCBkYW0gPD0gMCApCisgICAgICAgIHJldHVybiAwOworCisgICAgaGl0X3BvaW50ID0gUXVlcnlQcm9wKFBfSFApOworCisgICAgaWYgKCBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKE1FKSAmJiBkYW0gPj0gaGl0X3BvaW50ICYmIElTX0xFQVJOSU5HKE1FKSApeworICAgICAgICB0ZWxsX29iamVjdCggTUUsICJEZWluZSBtYWdpc2NoZW4gS3JhZWZ0ZSB2ZXJoaW5kZXJuIERlaW5lbiBUb2QuXG4iICk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICggIW9iamVjdHAoZW5lbXkpICkKKyAgICAgICAgZW5lbXkgPSBwcmV2aW91c19vYmplY3QoKSB8fCB0aGlzX2ludGVyYWN0aXZlKCkgfHwgdGhpc19wbGF5ZXIoKTsKKworICAgIGhpdF9wb2ludCAtPSBkYW07CisKKyAgICBpZiggaGl0X3BvaW50IDwgMCApeworICAgICAgICBpZiAoICFpbnRlcmFjdGl2ZShNRSkgKQorICAgICAgICAgICAgLy8gTmV0enRvdGUgc3RlcmJlbiBuaWNodAorICAgICAgICAgICAgaGl0X3BvaW50ID0gMTA7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKCBvYmplY3RwKGVuZW15KSAmJiBpbnRlcmFjdGl2ZSggZW5lbXkgKSAmJiBlbmVteSAhPSBNRSAmJgorICAgICAgICAgICAgICAgICAhUXVlcnlQcm9wKFBfVEVTVFBMQVlFUikgJiYgIUlTX1dJWkFSRChNRSkgJiYKKyAgICAgICAgICAgICAgICAgIUNoZWNrQXJlbmFGaWdodChNRSkgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBRdWVyeVBsQXR0YWNrZWQoZW5lbXkpICkKKyAgICAgICAgICAgICAgICAgICAgaGl0X3BvaW50ID0gMTsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaGl0X3BvaW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZW5lbXktPlNldFByb3AoIFBfS0lMTFMsIC0xICk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbG9nX2ZpbGUoICJLSUxMRVIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCAiJXMgJXMoJWQvJWQpIHRvZXRldGUgJXMoJWQvJWQpJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0aW1lKHRpbWUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldHVpZChlbmVteSksIHF1ZXJ5X3dpel9sZXZlbChlbmVteSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIGVuZW15LT5RdWVyeVByb3AoUF9MRVZFTCksIGdldHVpZChNRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5X3dpel9sZXZlbChNRSksIFF1ZXJ5UHJvcChQX0xFVkVMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhpdF9wb2ludCA/ICIgTk9UV0VIUj0+S0VJTiBQSyIgOiAiIikgKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7IAorICAgICAgICAgICAgICAgIHN0cmluZyBraWxsZXJuYW1lOworICAgICAgICAgICAgICAgIGlmIChvYmplY3RwKGVuZW15KSkKKyAgICAgICAgICAgICAgICAgICAga2lsbGVybmFtZT1zcHJpbnRmKCIlcyAoJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJMVUVfTkFNRShlbmVteSksIFJFQUxfVUlEKGVuZW15KSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBraWxsZXJuYW1lPSI/Pz8gKD8/PykiOyAKKworICAgICAgICAgICAgICAgIGlmICggIVF1ZXJ5UHJvcChQX1RFU1RQTEFZRVIpICkKKyAgICAgICAgICAgICAgICAgICAgY3JlYXRlX2tpbGxfbG9nX2VudHJ5KGtpbGxlcm5hbWUsIGVuZW15ICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggZW5lbXkgKQorICAgICAgICAgICAgICAgIGVuZW15LT5TdG9wSHVudEZvciggTUUsIDEgKTsKKworICAgICAgICAgICAgbWFwX29iamVjdHMoIFF1ZXJ5RW5lbWllcygpWzBdLCAiU3RvcEh1bnRGb3IiLCBNRSwgMSApOworICAgICAgICAgICAgU3RvcEh1bnRpbmdNb2RlKDEpOworCisgICAgICAgICAgICBTZXQoIFBfS0lMTEVSLCBlbmVteSApOworICAgICAgICAgICAgZGllKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTZXRQcm9wKCBQX0hQLCBoaXRfcG9pbnQgKTsKKyAgICByZXR1cm4gZGFtOworfQorCisKKy8vIExvZXNjaHQgaW0gc3RlcmJlbmRlbiBTcGllbGVyIGRpZSAna29lcnBlcmFiaGFlbmdpZ2VuJyBQcm9wZXJ0aWVzCitwcml2YXRlIHZvaWQgcmVzZXRfbXlfcHJvcGVydGllcygpCit7CisgIC8vIExvZXNjaGVuIGRlciBQcm9wZXJ0aWVzCisgIGlmICggUXVlcnlQcm9wKFBfUE9JU09OKSApCisgIHsKKyAgICAgLy8gRG9uJ3QgZGllIHR3aWNlICdjYXVzZSBvZiB0aGUgc2FtZSBwb2lzb24KKyAgICAgU2V0KCBQX1BPSVNPTiwgMCwgRl9TRVRfTUVUSE9EICk7CisgICAgIFNldCggUF9QT0lTT04sIDAsIEZfUVVFUllfTUVUSE9EICk7CisgICAgIFNldFByb3AoIFBfUE9JU09OLCAwICk7CisgIH0KKworICBTZXQoIFBfRlJPRywgMCwgRl9RVUVSWV9NRVRIT0QgKTsgCisgIFNldCggUF9GUk9HLCAwLCBGX1NFVF9NRVRIT0QgKTsKKyAgU2V0UHJvcCggUF9GUk9HLCAwICk7IC8vIERhbWl0IGRpZSBBdHRyaWJ1dGUgYXVjaCBzdGltbWVuLgorICBTZXQoIFBfQUxDT0hPTCwgMCwgRl9RVUVSWV9NRVRIT0QgKTsKKyAgU2V0KCBQX0FMQ09IT0wsIDAsIEZfU0VUX01FVEhPRCApOworICBTZXRQcm9wKFBfQUxDT0hPTCwgMCApOworICBTZXQoIFBfRFJJTkssIDAsIEZfUVVFUllfTUVUSE9EICk7CisgIFNldCggUF9EUklOSywgMCwgRl9TRVRfTUVUSE9EICk7CisgIFNldFByb3AoUF9EUklOSywgMCApOworICBTZXQoIFBfRk9PRCwgMCwgRl9RVUVSWV9NRVRIT0QgKTsKKyAgU2V0KCBQX0ZPT0QsIDAsIEZfU0VUX01FVEhPRCApOworICBTZXRQcm9wKFBfRk9PRCwgMCApOworICBTZXQoIFBfQkxJTkQsIDAsIEZfUVVFUllfTUVUSE9EICk7CisgIFNldCggUF9CTElORCwgMCwgRl9TRVRfTUVUSE9EICk7CisgIFNldFByb3AoUF9CTElORCwgMCApOworICBTZXQoIFBfREVBRiwgMCwgRl9RVUVSWV9NRVRIT0QgKTsKKyAgU2V0KCBQX0RFQUYsIDAsIEZfU0VUX01FVEhPRCApOworICBTZXRQcm9wKFBfREVBRiwgMCApOworICBTZXQoIFBfTUFYX0hBTkRTLCAwLCBGX1FVRVJZX01FVEhPRCApOworICBTZXQoIFBfTUFYX0hBTkRTLCAwLCBGX1NFVF9NRVRIT0QgKTsKKyAgU2V0UHJvcCggUF9NQVhfSEFORFMsIDIgKTsKKyAgU2V0KCBQX0hBTkRTX1VTRURfQlksIDAsIEZfUVVFUllfTUVUSE9EICk7CisgIFNldCggUF9IQU5EU19VU0VEX0JZLCAwLCBGX1NFVF9NRVRIT0QgKTsKKyAgU2V0UHJvcCggUF9IQU5EU19VU0VEX0JZLCAoe30pICk7CisgIFNldCggUF9QQVJBLCAwICk7CisgIFNldCggUF9OT19SRUdFTkVSQVRJT04sIDAsIEZfUVVFUllfTUVUSE9EICk7CisgIFNldCggUF9OT19SRUdFTkVSQVRJT04sIDAsIEZfU0VUX01FVEhPRCApOworICBTZXRQcm9wKFBfTk9fUkVHRU5FUkFUSU9OLCAwICk7CisgIFNldCggUF9UTVBfTU9WRV9IT09LLCAwLCBGX1FVRVJZX01FVEhPRCApOworICBTZXQoIFBfVE1QX01PVkVfSE9PSywgMCwgRl9TRVRfTUVUSE9EICk7CisgIFNldFByb3AoUF9UTVBfTU9WRV9IT09LLCAwICk7CisgIFNldCggUF9MQVNUX0RFQVRIX1RJTUUgLCB0aW1lKCkgKTsKKyAgLy8gZGFtaXQgZGVyIFRlZGR5IG8uYWUuIG1pdGJla29tbXQsIGRhc3MgbWFuIGpldHp0IHRvdCBpc3QgXTotPgorICBTZXRQcm9wKCBQX0hQLCAwICk7CisgIFNldFByb3AoIFBfU1AsIDAgKTsKK30KKwordmFyYXJncyBwcm90ZWN0ZWQgaW50IHNlY29uZF9saWZlKCBvYmplY3QgY29ycHNlICkKK3sKKyAgICBpbnQgbG9zdF9leHAsIGxldmVsOworICAgIC8vIEVzIGdpYnQgRnVua3Rpb25lbiwgZGllIHNvbGx0ZSBtYW4gbmljaHQgcGVyIEhhbmQgYXVmcnVmZW4gZHVlcmZlbiA7LSkKKyAgICBpZiAoIGV4dGVybl9jYWxsKCkgJiYgcHJldmlvdXNfb2JqZWN0KCkgIT0gTUUgKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICggcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShNRSkgJiYgSVNfTEVBUk5JTkcoTUUpICl7CisgICAgICAgIHRlbGxfb2JqZWN0KCBNRSwgIlNlaSBmcm9oLCBkYXNzIER1IHVuc3RlcmJsaWNoIGJpc3QsIHNvbnN0IHdhZXJlICIKKyAgICAgICAgICAgICAgICAgICAgICJlcyBlYmVuIHp1IEVuZGUgZ2V3ZXNlbi5cbiIgKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgKCAhSVNfU0VFUihNRSkgfHwgKGxldmVsID0gUXVlcnlQcm9wKFBfTEVWRUwpKSA8IDIwICkKKyAgICAgICAgbG9zdF9leHAgPSBRdWVyeVByb3AoUF9YUCkgLyAzOworICAgIGVsc2UKKyAgICAgICAgbG9zdF9leHAgPSBRdWVyeVByb3AoUF9YUCkgLyAobGV2ZWwgLSAxNyk7CisKKyAgICBBZGRFeHAoLWxvc3RfZXhwKTsKKworCisgICAgLy8gVG9kZXNmb2xnZW4gc2V0emVuLi4uLgorICAgIC8vU2V0UHJvcCggUF9ERUFUSF9JTkZPLCAxKTsKKyAgICBpZiAoICFJU19MRUFSTklORyhNRSkgJiYgIVF1ZXJ5UHJvcChQX1RFU1RQTEFZRVIpICkgeworCisgICAgICAgIG1hcHBpbmcgYXR0ciA9IFF1ZXJ5UHJvcChQX0FUVFJJQlVURVMpOworICAgICAgICBtYXBwaW5nIG1vZHMgPSBRdWVyeVByb3AoUF9BVFRSSUJVVEVTX01PRElGSUVSKVsiI2RlYXRoIl0gfHwgKFtdKTsKKworICAgICAgICAvLyBBdHRyaWJ1dGUgYXVmIDc1JSB2b20gYWt0dWVsbGVuIFdlcnQgc2Vua2VuCisgICAgICAgIG1vZHNbQV9TVFJdID0gLWF0dHJbQV9TVFJdICsgKDMgKiAoYXR0cltBX1NUUl0gKyBtb2RzW0FfU1RSXSkgLyA0KTsKKyAgICAgICAgbW9kc1tBX0NPTl0gPSAtYXR0cltBX0NPTl0gKyAoMyAqIChhdHRyW0FfQ09OXSArIG1vZHNbQV9DT05dKSAvIDQpOworICAgICAgICBtb2RzW0FfREVYXSA9IC1hdHRyW0FfREVYXSArICgzICogKGF0dHJbQV9ERVhdICsgbW9kc1tBX0RFWF0pIC8gNCk7CisgICAgICAgIG1vZHNbQV9JTlRdID0gLWF0dHJbQV9JTlRdICsgKDMgKiAoYXR0cltBX0lOVF0gKyBtb2RzW0FfSU5UXSkgLyA0KTsKKworICAgICAgICBTZXRQcm9wKCBQX0FUVFJJQlVURVNfTU9ESUZJRVIsICh7ICIjZGVhdGgiLCBtb2RzIH0pICk7CisKKyAgICAgICAgaW50IG9mZnMgPSAyMjA7ICAvLyAyMjAgaGVhcnRfYmVhdHMgPT0gN21pbjIwCisgICAgICAgIC8vIERpZSAyMjAgSEIgc2luZCBmaXgsIGRhenUga29tbWVuIG5vY2ggNSBIQiBwcm8gcmVhbGVtIAorICAgICAgICAvLyBBdHRyaWJ1dHNwdW5rdC4gR2V0ZWlsdCB3aXJkIGRhcyBnYW56ZSBub2NoIGR1cmNoIDEwLCB3ZWlsIGltIEhCCisgICAgICAgIC8vIG51ciBhbGxlIDEwIEhCcyBkaWUgVEYgZ2VjaGVja3Qgd2VyZGVuLiBEYSB3aXJkIGRhbm4gYWxsZSAxMCBIQiBlaW4KKyAgICAgICAgLy8gUHVua3QgYWJnZXpvZ2VuIHVuZCB3ZW5uIDAgZXJyZWljaHQgaXN0LCB3aXJkIGRhcyBBdHRyaWJ1dCB1bSBlaW5zCisgICAgICAgIC8vIHJlZ2VuZXJpZXJ0LgorICAgICAgICBTZXRQcm9wKCBQX0RFQVRIX0lORk8sIChbIAorICAgICAgICAgICAgQV9TVFI6IChvZmZzICsgNSAqIChhdHRyW0FfU1RSXSArIG1vZHNbQV9TVFJdKSkvMTA7IGF0dHJbQV9TVFJdLAorICAgICAgICAgICAgQV9DT046IChvZmZzICsgNSAqIChhdHRyW0FfQ09OXSArIG1vZHNbQV9DT05dKSkvMTA7IGF0dHJbQV9DT05dLAorICAgICAgICAgICAgQV9ERVg6IChvZmZzICsgNSAqIChhdHRyW0FfREVYXSArIG1vZHNbQV9ERVhdKSkvMTA7IGF0dHJbQV9ERVhdLAorICAgICAgICAgICAgQV9JTlQ6IChvZmZzICsgNSAqIChhdHRyW0FfSU5UXSArIG1vZHNbQV9JTlRdKSkvMTA7IGF0dHJbQV9JTlRdCisgICAgICAgICAgICAgICAgICBdKSApOworCisgICAgICAgIC8vIGRpZSBzdWZmZXJfdGltZSB3aXJkIHZpYSBkZWF0aF9zdWZmZXJpbmcoKSB2b24KKyAgICAgICAgLy8gUXVlcnlTa2lsbEF0dHJpYnV0ZSgpIGFiZ2VmcmFndCB1bmQgZ2VodCBkYW5uIGFscyBNYWx1cyBpbgorICAgICAgICAvLyBTQV9RVUFMSVRZIG1pdCBlaW4uCisgICAgICAgIGlmICggc3VmZmVyX3RpbWUgPD0gMipTVUZGRVJfVElNRSApCisgICAgICAgICAgICBzdWZmZXJfdGltZSArPSBTVUZGRVJfVElNRSAtIDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN1ZmZlcl90aW1lID0gMyAqIFNVRkZFUl9USU1FIC0gMTsKKyAgICB9CisKKyAgICAvLyBEaWUgdmVyc2NoaWVkZW5lbiBOb3RpZnlQbGF5ZXJEZWF0aC1GdW5rdGlvbmVuIGtvZW5uZW4gdS5VLiBzY2hsZWNodAorICAgIC8vIHByb2dyYW1taWVydCBzZWluIHVuZCB6dXZpZWwgUmVjaGVuemVpdCB6aWVoZW4uIERlc2hhbGIgd2VyZGVuIHNpZSBtaXQKKyAgICAvLyBlaW5lbSBMaW1pdHMgdm9uIDE1MGsgYnp3LiA4MGsgYXVmZ2VydWZlbi4gQXVzc2VyZGVtIHdlcmRlbiBzaWUgbnVyCisgICAgLy8gZ2VydWZlbiwgc29sYW5nZSBub2NoIG1pbi4gMjVrIFRpY2tzIGRhIHNpbmQuCisgICAgaW50ICpsaW1pdHM9cXVlcnlfbGltaXRzKCk7CisgICAgbGltaXRzW0xJTUlUX0VWQUxdID0gMTUwMDAwOworICAgIGxpbWl0c1tMSU1JVF9DT1NUXSA9IExJTUlUX0RFRkFVTFQ7CisKKyAgICBtaXhlZCBraWxsZXIgPSBRdWVyeVByb3AoUF9LSUxMRVIpOworICAgIG1peGVkIGdpID0gUXVlcnlQcm9wKFBfR1VJTEQpOworICAgIGlmIChzdHJpbmdwKGdpKSkKKyAgICAgICAgZ2kgPSBmaW5kX29iamVjdCgiL2dpbGRlbi8iK2dpKTsKKyAgICAvLyBqZWRlcyBPYmpla3QgbnVyIGVpbm1hbCwgYWJlciBuaWNodCB2aWEgbV9pbmRpY2VzKG1rbWFwcGluZykpIHdlZ2VuCisgICAgLy8gVmVybHVzdCBkZXIgUmVpaGVuZm9sZ2UuCisgICAgb2JqZWN0ICppdGVtcyA9ICh7a2lsbGVyfSk7CisgICAgaWYgKGVudmlyb25tZW50KCkgIT0ga2lsbGVyKQorICAgICAgICBpdGVtcyArPSAoe2Vudmlyb25tZW50KCl9KTsKKyAgICBpZiAoZ2kgIT0ga2lsbGVyICYmIGdpICE9IGVudmlyb25tZW50KCkpCisgICAgICAgIGl0ZW1zICs9ICh7Z2l9KTsKKyAgICBmb3JlYWNoKG9iamVjdCBpdGVtOiBpdGVtcykgeworICAgICAgICBpZiAoZ2V0X2V2YWxfY29zdCgpIDwgbGltaXRzW0xJTUlUX0VWQUxdICsgMjAwMDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLy8gZmFsbHMgZWluIE5QRCgpIGltcGxpeml0IGFuZGVyZSBPYmpla3QgemVyc3RvZXJ0IGhhdC4KKyAgICAgICAgaWYgKG9iamVjdHAoaXRlbSkpIHsKKyAgICAgICAgICAgIGNhdGNoKGxpbWl0ZWQoIydjYWxsX290aGVyLCBsaW1pdHMsIGl0ZW0sICJOb3RpZnlQbGF5ZXJEZWF0aCIsCisgICAgICAgICAgICAgICAgICBNRSwga2lsbGVyLCBsb3N0X2V4cCk7cHVibGlzaCk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gamV0enQgZGVuIFJlc3QuCisgICAgbGltaXRzW0xJTUlUX0VWQUxdID0gODAwMDA7CisgICAgZm9yZWFjaChvYmplY3QgaXRlbTogKGVudmlyb25tZW50KCkgPyBhbGxfaW52ZW50b3J5KGVudmlyb25tZW50KCkpIDogKHt9KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZGVlcF9pbnZlbnRvcnkoTUUpCisgICAgICAgICAgICAgICAgICAgICAgICArIChvYmplY3RwKGNvcnBzZSkgPyBkZWVwX2ludmVudG9yeShjb3Jwc2UpIDogKHt9KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC0gaXRlbXMgKSB7CisgICAgICAgIC8vIHdlbm4gbmljaHQgbWVociBnZW51ZyBUaWNrcywgaGFiZW4gZGllIHJlc3RsaWNoZW4gUGVjaCBnZWhhYnQuCisgICAgICAgIGlmIChnZXRfZXZhbF9jb3N0KCkgPCBsaW1pdHNbTElNSVRfRVZBTF0gKyAyMDAwMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAvLyBOUEQoKSBrb2VubmVuIGFuZGVyZSBPYmpla3QgemVyc3RvZXJlbi4KKyAgICAgICAgaWYgKG9iamVjdHAoaXRlbSkpIHsKKyAgICAgICAgICAgIGNhdGNoKGxpbWl0ZWQoIydjYWxsX290aGVyLCBsaW1pdHMsIGl0ZW0sICJOb3RpZnlQbGF5ZXJEZWF0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRSwga2lsbGVyLCBsb3N0X2V4cCk7cHVibGlzaCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBQcm9wZXJ0aWVzIHp1cnVlY2tzZXR6ZW4sIHNvbGx0ZSBuYWNoIGRlbSBOb3RpZnlQbGF5ZXJEZWF0aCgpCisgICAgLy8gcGFzc2llcmVuLCB3ZWlsIE9iamVrdGUgc2ljaCBkYXJpbiBldnRsLiBlcnN0bWFsIG5vY2ggYXVmcmFldW1lbiB1bmQKKyAgICAvLyBwcm9wcyBtYW5pcHVsaWVyZW4uCisgICAgcmVzZXRfbXlfcHJvcGVydGllcygpOworICAgIFVwZGF0ZUF0dHJpYnV0ZXMoKTsgLy8gQmVpbSBUb2Qgd2VyZGVuIERpbmdlIGVudGZlcm50LCBBdHRyaWJ1dGUgcHJ1ZWZlbgorICAgIAorICAgIC8vIEF1Y2ggQmV3ZWd1bmcgZXJzdCBuYWNoIGRlbiBOUEQoKSwgZGEgZGllc2UgZGVuIFNwaWVsZXIgYmV3ZWdlbgorICAgIC8vIGtvZW5udGVuLCB3YXMgZWluZSBCZXdlZ3VuZyBhdXMgZGVtIFRvZGVzcmF1bSB3YWVyZSwgd2VubiBkaWUgQmV3ZWd1bmcKKyAgICAvLyB2b3IgZGVtIE5QRCgpIHN0YXR0ZmFlbmRlLgorICAgIFNldFByb3AoIFBfR0hPU1QsIDEgKTsgLy8gbmFjaCByZXNldF9teV9wcm9wZXJ0aWVzKCkgIQorICAgIGNsb25lX29iamVjdCggInJvb20vZGVhdGgvZGVhdGhfbWFyayIgKS0+bW92ZSggTUUsIE1fTk9DSEVDSyApOyAKKworICAgIHJldHVybiAxOworfQorCisKK3B1YmxpYyBpbnQgQWRkSHBIb29rKCBvYmplY3Qgb2IgKQoreworICAgIG9iamVjdCAqaG9va3M7CisKKyAgICBpZiAoICFvYmplY3RwKG9iKSApCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCAhcG9pbnRlcnAoaG9va3MgPSBRdWVyeShQX0hQX0hPT0tTKSkgKXsKKyAgICAgICAgU2V0KCBQX0hQX0hPT0tTLCAoeyBvYiB9KSApOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAoIG1lbWJlciggaG9va3MsIG9iICkgPj0gMCApCisgICAgICAgIHJldHVybiAwOworCisgICAgU2V0KCBQX0hQX0hPT0tTLCAoaG9va3MgLSAoezB9KSkgKyAoeyBvYiB9KSApOworICAgIHJldHVybiAxOworfQorCisKK3B1YmxpYyBpbnQgUmVtb3ZlSHBIb29rKCBvYmplY3Qgb2IgKQoreworICAgIG9iamVjdCAqaG9va3M7CisKKyAgICBpZiAoICFwb2ludGVycChob29rcyA9IFF1ZXJ5KFBfSFBfSE9PS1MpKSApCisgICAgICAgIHJldHVybiAwOworCisgICAgU2V0KCBQX0hQX0hPT0tTLCBob29rcyAtICh7IG9iLCAwIH0pICk7CisgICAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBfcXVlcnlfYWdlKCkgeworICAgIHJldHVybiBTZXQoUF9BR0UsIGFnZSwgRl9WQUxVRSk7Cit9CisKK3N0YXRpYyBpbnQgX3NldF9ocCggaW50IGhwICkKK3sKKyAgICBvYmplY3QgKmhvb2tzOworICAgIGludCByZXQsIGksIG9sZDsKKworICAgIGlmICggKG9sZCA9IFF1ZXJ5KFBfSFAsIEZfVkFMVUUpKSA9PSBocCApCisgICAgICAgIHJldHVybiBvbGQ7CisKKyAgICByZXQgPSBsaWZlOjpfc2V0X2hwKGhwKTsKKworICAgIGlmICggcmV0ID09IG9sZCApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAvLyBDYWxsIG9sZCBob29rcyBpbiBhbGwgb2JqZWN0cy4uLiBkZXN0cnVjdGVkIG9iamVjdHMgd2lsbCBiZSBpZ25vcmVkLgorICAgIGlmIChwb2ludGVycChob29rcyA9IFF1ZXJ5KFBfSFBfSE9PS1MpKSkKKyAgICAgIGNhbGxfb3RoZXIoaG9va3MsICJOb3RpZnlIcENoYW5nZSIpOworCisgICAgLy8gQ2FsbCBuZXcgaG9va3MuCisgICAgSG9va0Zsb3coSF9IT09LX0hQLHJldCk7CisKKyAgICAvLyBSZXBvcnQtYXVzZ2FiZQorICAgIHN0YXR1c19yZXBvcnQoRE9fUkVQT1JUX0hQLCByZXQpOworCisgICAgcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IF9zZXRfc3AoIGludCBzcCApCit7CisgICAgb2JqZWN0ICpob29rczsKKyAgICBpbnQgcmV0LCBpLCBvbGQ7CisKKyAgICBpZiAoIChvbGQgPSBRdWVyeShQX1NQLEZfVkFMVUUpKSA9PSBzcCApCisgICAgICAgIHJldHVybiBvbGQ7CisKKyAgICByZXQgPSBsaWZlOjpfc2V0X3NwKHNwKTsKKworICAgIGlmICggcmV0ID09IG9sZCApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAvLyBDYWxsIG9sZCBob29rcyBpbiBhbGwgb2JqZWN0cy4uLiBkZXN0cnVjdGVkIG9iamVjdHMgd2lsbCBiZSBpZ25vcmVkLgorICAgIGlmIChwb2ludGVycChob29rcyA9IFF1ZXJ5KFBfSFBfSE9PS1MpKSkKKyAgICAgIGNhbGxfb3RoZXIoaG9va3MsICJOb3RpZnlIcENoYW5nZSIpOworCisgICAgLy8gQ2FsbCBuZXcgaG9va3MuCisgICAgSG9va0Zsb3coSF9IT09LX1NQLHJldCk7CisKKyAgICAvLyBSZXBvcnQtYXVzZ2FiZQorICAgIHN0YXR1c19yZXBvcnQoRE9fUkVQT1JUX1NQLCByZXQpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfc2V0X3BvaXNvbihpbnQgbikKK3sKKyAgaW50IG9sZCA9IFF1ZXJ5KFBfUE9JU09OLCBGX1ZBTFVFKTsKKyAgaWYgKG9sZCA9PSBuICkKKyAgICAgIHJldHVybiBvbGQ7CisgIG4gPSBsaWZlOjpfc2V0X3BvaXNvbihuKTsKKyAgaWYgKCBuID09IG9sZCApCisgICAgICByZXR1cm4gbjsKKyAgLy8gZ2dmLiBTdGF0dXNyZXBvcnQgYXVzZ2ViZW4KKyAgaWYgKGludGVyYWN0aXZlKE1FKSkKKyAgICBzdGF0dXNfcmVwb3J0KERPX1JFUE9SVF9QT0lTT04sIG4pOworICByZXR1cm4gbjsKK30KKworc3RhdGljIGludCBfc2V0X21heF9wb2lzb24oaW50IG4pCit7CisgIGlmIChuID49IDApCisgIHsKKyAgICBTZXQoUF9NQVhfUE9JU09OLCBuLCBGX1ZBTFVFKTsKKyAgICBpbnQgbWF4cD1RdWVyeVByb3AoUF9NQVhfUE9JU09OKTsgLy8ga29lbm50ZSBuZSBRdWVyeW1ldGhvZGUgZHJhdWYgc2Vpbi4uLgorICAgIGlmIChRdWVyeVByb3AoUF9QT0lTT04pID4gbWF4cCkKKyAgICAgIFNldFByb3AoUF9QT0lTT04sIG1heHApOworICB9CisgIEdNQ1BfQ2hhciggKFtQX01BWF9QT0lTT046IG5dKSApOworICByZXR1cm4gbjsKK30KKworc3RhdGljIGludCBfc2V0X21heF9ocCggaW50IGhwICkKK3sKKyAgaWYgKGhwID49IDApCisgIHsKKyAgICBTZXQoUF9NQVhfSFAsIGhwLCBGX1ZBTFVFKTsKKyAgICBpbnQgbWF4aHA9UXVlcnlQcm9wKFBfTUFYX0hQKTsgLy8ga29lbm50ZSBuZSBRdWVyeW1ldGhvZGUgZHJhdWYgc2Vpbi4uLgorICAgIGlmIChRdWVyeVByb3AoUF9IUCkgPiBtYXhocCkKKyAgICAgIFNldFByb3AoUF9IUCwgbWF4aHApOworICB9CisgIEdNQ1BfQ2hhciggKFtQX01BWF9IUDogaHBdKSApOworICByZXR1cm4gaHA7Cit9CisKK3N0YXRpYyBpbnQgX3NldF9tYXhfc3AoIGludCBzcCApCit7CisgIGlmIChzcCA+PSAwKQorICB7CisgICAgU2V0KFBfTUFYX1NQLCBzcCwgRl9WQUxVRSk7CisgICAgaW50IG1heHNwPVF1ZXJ5UHJvcChQX01BWF9TUCk7IC8vIGtvZW5udGUgbmUgUXVlcnltZXRob2RlIGRyYXVmIHNlaW4uLi4KKyAgICBpZiAoUXVlcnlQcm9wKFBfU1ApID4gbWF4c3ApCisgICAgICBTZXRQcm9wKFBfU1AsIG1heHNwKTsKKyAgfQorICBHTUNQX0NoYXIoIChbUF9NQVhfU1A6IHNwXSkgKTsKKyAgcmV0dXJuIHNwOworfQorCitzdGF0aWMgaW50IF9zZXRfZ2hvc3QoIGludCBnICkgeworICAgIG9iamVjdCB0ZWFtOworCisgICAgaWYoIWcgJiYgcXVlcnlfaGNfcGxheSgpPjEpCisgICAgeworICAgICAgd3JpdGUoIkhBSEFIQSwgRFUgQklTVCBBVUYgRVdJRyBNRUlOLlxuIik7CisgICAgICByZXR1cm4gUXVlcnkoUF9HSE9TVCk7CisgICAgfQorCisgICAgZyA9IFNldCggUF9HSE9TVCwgZyApOworCisgICAgaWYgKCBnICYmIG9iamVjdHAodGVhbSA9IFF1ZXJ5KFBfVEVBTSkpICkKKyAgICAgICAgdGVhbS0+UmVtb3ZlTWVtYmVyKE1FKTsKKworICAgIHJldHVybiBnOworfQorCisKK3B1YmxpYyBpbnQgdW5kaWUoKQoreworICAgIG1peGVkIHgsIGRpOworICAgIG1hcHBpbmcgYXR0ciwgbW9kczsKKworICAgIGlmICggIXRoaXNfaW50ZXJhY3RpdmUoKSB8fCAhcHJldmlvdXNfb2JqZWN0KCkgKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICggIUlTX0FSQ0godGhpc19pbnRlcmFjdGl2ZSgpKSB8fCAhSVNfQVJDSChnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpKSB8fAorICAgICAgICAgcHJvY2Vzc19jYWxsKCkgKQorICAgICAgICBsb2dfZmlsZSggIlVORElFIiwgc3ByaW50ZiggIiVzICVPIC0+ICVPXG4iLCBkdGltZSh0aW1lKCkpWzUuLjE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfaW50ZXJhY3RpdmUoKSwgTUUgKSApOworCisgICAgaWYgKCB4ID0gUXVlcnkoUF9ERUFEUykgKQorICAgICAgICB4LS07CisKKyAgICBTZXQoIFBfREVBRFMsIHggKTsKKworICAgIHggPSBRdWVyeVByb3AoUF9YUCk7CisKKyAgICBpZiAoIChkaSA9IFF1ZXJ5UHJvcChQX0xFVkVMKSkgPCAyMCB8fCAhSVNfU0VFUihNRSkgKQorICAgICAgICB4ID0gKGludCkoeCAqIDEuNSk7CisgICAgZWxzZQorICAgICAgICAvLyBVbXdlZyB1ZWJlciBmbG9hdCwgd2VpbCBiZWkgaG9oZW4gWFArTGV2ZWwgc29uc3QgMzJCaXQgbmljaHQKKyAgICAgICAgLy8gbWVociBhdXNyZWljaGVuIC0+IG5lZ2F0aXZlIFhQCisgICAgICAgIHggPSAoaW50KSAoIHggKiAoKGZsb2F0KSAoZGkgLSAxNykgLyAoZGkgLSAxOCkpICk7CisKKyAgICBTZXQoIFBfWFAsIHggKTsKKworICAgIGF0dHIgPSBRdWVyeVByb3AoUF9BVFRSSUJVVEVTKSB8fCAoW10pOworICAgIG1vZHMgPSBRdWVyeVByb3AoUF9BVFRSSUJVVEVTX01PRElGSUVSKVsiI2RlYXRoIl0gfHwgKFtdKTsKKworICAgIGlmICggbWFwcGluZ3AoZGkgPSBRdWVyeVByb3AoUF9ERUFUSF9JTkZPKSkgKXsKKyAgICAgICAgLy8gQmVpbSBuYWVjaHN0ZW4gaGVhcnRfYmVhdCBjaGVja2VuCisgICAgICAgIC8vIFplc3N0cmE6IFdpZXNvIGVpZ2VudGxpY2g/IERpZSBNb2RpZmllciB3ZXJkZW4gZG9jaCBkaXJla3QgaGllcgorICAgICAgICAvLyBnZWxvZXNjaHQuIFNvIGV4cGlyZWQgbWFuIGF1Y2ggZWluZW4gVGVpbCB2b24gbmljaHQtdW5kaWUtdGVuIFRvZGVuCisgICAgICAgIC8vIHZvcnplaXRpZy4uLj8gTWFsIGF1c2tvbW1lbnRpZXJ0LiAyOS4xMC4yMDA3CisgICAgICAgIC8vZGlbQV9TVFJdID0gMTsKKyAgICAgICAgLy9kaVtBX0RFWF0gPSAxOworICAgICAgICAvL2RpW0FfSU5UXSA9IDE7CisgICAgICAgIC8vZGlbQV9DT05dID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgICAgZGkgPSAoW10pOworICAgIAorICAgIG1vZHNbQV9TVFJdID0gKCg0ICogKGF0dHJbQV9TVFJdICsgbW9kc1tBX1NUUl0pKSAvIDMpIC0gYXR0cltBX1NUUl07CisgICAgbW9kc1tBX0RFWF0gPSAoKDQgKiAoYXR0cltBX0RFWF0gKyBtb2RzW0FfREVYXSkpIC8gMykgLSBhdHRyW0FfREVYXTsKKyAgICBtb2RzW0FfSU5UXSA9ICgoNCAqIChhdHRyW0FfSU5UXSArIG1vZHNbQV9JTlRdKSkgLyAzKSAtIGF0dHJbQV9JTlRdOworICAgIG1vZHNbQV9DT05dID0gKCg0ICogKGF0dHJbQV9DT05dICsgbW9kc1tBX0NPTl0pKSAvIDMpIC0gYXR0cltBX0NPTl07CisKKyAgICBpZiAoIG1vZHNbQV9TVFJdID49IDAgKSB7CisgICAgICAgIG1fZGVsZXRlKCBtb2RzLCBBX1NUUiApOworICAgICAgICBtX2RlbGV0ZSggZGksIEFfU1RSKTsKKyAgICB9CisgICAgaWYgKCBtb2RzW0FfREVYXSA+PSAwICkgeworICAgICAgICBtX2RlbGV0ZSggbW9kcywgQV9ERVggKTsKKyAgICAgICAgbV9kZWxldGUoIGRpLCBBX0RFWCk7CisgICAgfQorICAgIGlmICggbW9kc1tBX0lOVF0gPj0gMCApIHsKKyAgICAgICAgbV9kZWxldGUoIG1vZHMsIEFfSU5UICk7CisgICAgICAgIG1fZGVsZXRlKCBkaSwgQV9JTlQpOworICAgIH0KKyAgICBpZiAoIG1vZHNbQV9DT05dID49IDAgKSB7CisgICAgICAgIG1fZGVsZXRlKCBtb2RzLCBBX0NPTiApOworICAgICAgICBtX2RlbGV0ZSggZGksIEFfQ09OKTsKKyAgICB9CisKKyAgICBTZXRQcm9wKCBQX0FUVFJJQlVURVNfTU9ESUZJRVIsICh7ICIjZGVhdGgiLCBtb2RzIH0pICk7CisgICAgaWYgKHNpemVvZihkaSkpCisgICAgICBTZXRQcm9wKCBQX0RFQVRIX0lORk8sIGRpICk7CisgICAgZWxzZQorICAgICAgU2V0UHJvcCggUF9ERUFUSF9JTkZPLCAwKTsKKworICAgIHN1ZmZlcl90aW1lIC09ICgoU1VGRkVSX1RJTUUpLTEpOworCisgICAgaWYgKCBzdWZmZXJfdGltZSA8IDAgKQorICAgICAgICBzdWZmZXJfdGltZSA9IDA7CisKKyAgICBTZXQoIFBfR0hPU1QsIDAgKTsKKyAgICByZXR1cm4gMTsKK30KKworCit2YXJhcmdzIHB1YmxpYyB2b2lkIGRpZSggaW50IHBvaXNvbmRlYXRoLCBpbnQgZXh0ZXJuKQoreworICAgIC8vIGxhZXVmdCBzY2hvbiBlaW4gZGllKCk/IEZlaGxlciBhdXNsb2VzZW4sIFVyc2FjaGUgcmVrdXJzaXZlciBkaWUoKSBzb2xsCisgICAgLy8gZ2VmdW5kZW4gd2VyZGVuLiBESU5GT19FVkFMX05VTUJFUiB3aXJkIGluIGplZGVtIFRvcC1MZXZlbCBDYWxsIGltCisgICAgLy8gZHJpdmVyIGVyaG9laHQsIGQuaC4gZ2xlaWNoZSBaYWhsIHNpZ25hbGlzaWVydCBlaW4gcmVrdXJzaXZlcyBkaWUoKS4KKworICAgIGlmIChkaWVfaW5fcHJvZ3Jlc3MgPT0gZGVidWdfaW5mbyhESU5GT19FVkFMX05VTUJFUikpCisgICAgeworICAgICAgLy8gVE9ETzogaXN0IGRhcyBkaWVfaW5fcHJvZ3Jlc3MgYXVzIGRlbSBsZXR6dGVuIEJhY2tlbmQtQ3ljbGU/CisgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKAorICAgICAgICAgICAgImRpZSgpIGluICVPIGdlcnVmZW4sIGFiZXIgZGllKCkgbGFldWZ0IGJlcmVpdHMhXG4iLAorICAgICAgICAgICAgdGhpc19vYmplY3QoKSkpOworICAgIH0KKyAgICBkaWVfaW5fcHJvZ3Jlc3MgPSBkZWJ1Z19pbmZvKERJTkZPX0VWQUxfTlVNQkVSKTsKKyAgICAKKyAgICAvLyBGdWVyIEhDLVBsYXllciBpc3RzIGpldHp0IGdlbGF1ZmVuLi4uCisgICAgaWYocXVlcnlfaGNfcGxheSgpPT0xKQorICAgIHsKKyAgICAgIHNldF9oY19wbGF5KGNhcGl0YWxpemUoZ2V0ZXVpZChNRSkpLHRpbWUoKSk7CisgICAgICBTZXREZWZhdWx0SG9tZSgiL3Jvb20vbmlydmFuYSIpOworICAgICAgU2V0RGVmYXVsdFByYXlSb29tKCIvcm9vbS9uaXJ2YW5hIik7CisgICAgICBTZXRQcm9wKFBfU1RBUlRfSE9NRSwiL3Jvb20vbmlydmFuYSIpOworICAgICAgbG9nX2ZpbGUoIkhDREVBRCIsZHRpbWUodGltZSgpKSsiICIrY2FwaXRhbGl6ZShnZXRldWlkKE1FKSkKKyAgICAgICAgICArIiBnZWh0IGluIGRhcyBOaXJ2YW5hIGVpbiFcbiIpOworICAgIH0KKworICAgIC8vIFdlbm4gZGFzIGRpZSgpIGRpcmVrdCB2b24gYXVzc2VuIGdlcnVmZW4gd3VyZGUsIG11c3MgUF9LSUxMRVIgaGllcgorICAgIC8vIGdlc3BlaWNoZXJ0IHdlcmRlbi4KKyAgICBpZiAoZXh0ZXJuX2NhbGwoKSkKKyAgICAgICAgU2V0UHJvcChQX0tJTExFUiwgcHJldmlvdXNfb2JqZWN0KCkpOworCisgICAgLy8gU2ljaGVybiBkZXIgenUgbG9lc2NoZW5kZW4gUHJvcGVydGllcy4gRGllc2UgUHJvcHMgd2VyZGVuIGltIFZlcmxhdWYgZGVzCisgICAgLy8gVG9kZXMgenVydWVja2dlc2V0enQuIEVpbmlnZSBNYWdpZXIgd29sbGVuIGRpZXNlIERhdGVuIGFiZXIgc3BhZXRlcgorICAgIC8vIG5vY2ggaGFiZW4gdW5kIGZyYWdlbiB0ZWlsd2Vpc2UgUF9MQVNUX0RFQVRIX1BST1BTIGltCisgICAgLy8gTm90aWZ5UGxheWVyRGVhdGgoKSBhYi4gRGFoZXIgd2lyZCBkZXIgS3JhbSBqZXR6dCBoaWVyIHNjaG9ubWFsCisgICAgLy8gZ2VzaWNoZXJ0LgorICAgIC8vIEJUVzogUHJvcHMgbWl0IE1hcHBpbmdzL0FycmF5cyBzb2xsdGVuIGtvcGllcnQgd2VyZGVuLgorICAgIFNldFByb3AoUF9MQVNUX0RFQVRIX1BST1BTLCAoWworICAgICAgUF9QT0lTT04gICAgICAgICAgOiBRdWVyeVByb3AoUF9QT0lTT04pLAorICAgICAgUF9GUk9HICAgICAgICAgICAgOiBRdWVyeVByb3AoUF9GUk9HKSwKKyAgICAgIFBfQUxDT0hPTCAgICAgICAgIDogUXVlcnlQcm9wKFBfQUxDT0hPTCksCisgICAgICBQX0RSSU5LICAgICAgICAgICA6IFF1ZXJ5UHJvcChQX0RSSU5LKSwKKyAgICAgIFBfRk9PRCAgICAgICAgICAgIDogUXVlcnlQcm9wKFBfRk9PRCksCisgICAgICBQX0JMSU5EICAgICAgICAgICA6IFF1ZXJ5UHJvcChQX0JMSU5EKSwKKyAgICAgIFBfREVBRiAgICAgICAgICAgIDogUXVlcnlQcm9wKFBfREVBRiksCisgICAgICBQX01BWF9IQU5EUyAgICAgICA6IFF1ZXJ5UHJvcChQX01BWF9IQU5EUyksCisgICAgICBQX1BBUkEgICAgICAgICAgICA6IFF1ZXJ5UHJvcChQX1BBUkEpLAorICAgICAgUF9OT19SRUdFTkVSQVRJT04gOiBRdWVyeVByb3AoUF9OT19SRUdFTkVSQVRJT04pLAorICAgICAgUF9IUCAgICAgICAgICAgICAgOiBRdWVyeVByb3AoUF9IUCksCisgICAgICBQX1NQICAgICAgICAgICAgICA6IFF1ZXJ5UHJvcChQX1NQKSwKKyAgICAgIFBfTEFTVF9ERUFUSF9USU1FIDogUXVlcnlQcm9wKFBfTEFTVF9ERUFUSF9USU1FICkKKyAgICBdKSApOworCisgICAgLy8gY2FsbCB0aGUgaW5oZXJpdGVkIGRpZSgpIHdpdGggMTAgTWlvIFRpY2tzIHdoaWNoIHdpbGwgYmUgYWNjb3VudGVkIGFzIDEKKyAgICAvLyBUaWNrLi4uIDstKQorICAgIGludCAqbGltaXRzID0gcXVlcnlfbGltaXRzKCk7CisgICAgbGltaXRzW0xJTUlUX0VWQUxdID09IDEwMDAwMDAwOworICAgIGxpbWl0c1tMSU1JVF9DT1NUXSA9PSBMSU1JVF9VTkxJTUlURUQ7CisgICAgbGltaXRlZCgjJzo6ZGllLCBsaW1pdHMsIHBvaXNvbmRlYXRoLCAoZXh0ZXJuX2NhbGwoKSA/IDEgOiAwKSk7IAorCisgICAgLy8gbmFjaCBkZW0gVG9kIHNvbGx0ZSBtYW4gYXVjaCBrZWluZSBMUCBtZWhyIGhhYmVuLgorICAgIFNldFByb3AoUF9IUCwgMCk7CisKKyAgICAvLyBuYWVjaHN0ZXIgVG9kIGthbm4ga29tbWVuLiBEZWtyZW1lbnRpZXJ1bmcsIGRhIDAgZWluIGd1ZWx0aWdlciBXZXJ0CisgICAgLy8gZnVlciBESU5GT19FVkFMX05VTUJFUiB3YWVyZS4gYWJzKCksIHVtIG5pY2h0ICAtX19JTlRfTUFYX18genUKKyAgICAvLyBkZWtyZW1lbnRpZXJlbi4KKyAgICBkaWVfaW5fcHJvZ3Jlc3MgPSBhYnMoZGllX2luX3Byb2dyZXNzKSAtIDE7Cit9CisKK2ludCBkZWZ1ZWxfZm9vZCgpCit7CisgICAgaW50IHJldDsKKyAgICBvYmplY3QgcHJldjsKKyAgICAKKyAgICByZXQ9OjpkZWZ1ZWxfZm9vZCgpOworICAgIHByZXY9cHJldmlvdXNfb2JqZWN0KCk7CisgICAgaWYoIXByZXYgfHwgIW9iamVjdHAocHJldikpCisgICAgeworICAgICAgICBwcmV2PXRoaXNfb2JqZWN0KCk7CisgICAgfQorICAgIAorICAgIGlmKHJldDw9MCkKKyAgICB7CisgICAgICAgICAgICBjYWxsX290aGVyKEZVRUxTVEFULCJhZGREZWZ1ZWxTdGF0RW50cnkiLHByZXYsdGhpc19vYmplY3QoKSwwLDEsMCwxKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgICAgIGNhbGxfb3RoZXIoRlVFTFNUQVQsImFkZERlZnVlbFN0YXRFbnRyeSIscHJldix0aGlzX29iamVjdCgpLDAsMCxyZXQsMSk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBkZWZ1ZWxfZHJpbmsoKQoreworICAgIGludCByZXQ7CisgICAgb2JqZWN0IHByZXY7CisgICAgCisgICAgcmV0PTo6ZGVmdWVsX2RyaW5rKCk7CisgICAgcHJldj1wcmV2aW91c19vYmplY3QoKTsKKyAgICBpZighcHJldiB8fCAhb2JqZWN0cChwcmV2KSkKKyAgICB7CisgICAgICAgIHByZXY9dGhpc19vYmplY3QoKTsKKyAgICB9CisgICAgCisgICAgaWYocmV0PD0wKQorICAgIHsKKyAgICAgICAgICAgIGNhbGxfb3RoZXIoRlVFTFNUQVQsImFkZERlZnVlbFN0YXRFbnRyeSIscHJldix0aGlzX29iamVjdCgpLDAsMSwwLDApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAgICAgY2FsbF9vdGhlcihGVUVMU1RBVCwiYWRkRGVmdWVsU3RhdEVudHJ5IixwcmV2LHRoaXNfb2JqZWN0KCksMCwwLHJldCwwKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworcHVibGljIHZvaWQgc2hvd19hZ2UoKQoreyBpbnQgaSxqOworCisgICAgd3JpdGUoIkFsdGVyOlx0Iik7CisgICAgaSA9IFF1ZXJ5UHJvcChQX0FHRSk7CisgICAgaWYgKChqPWkvNDMyMDApKQorICAgIHsKKyAgICAgIHdyaXRlKGogKyAiIFRhZyIrKGo9PTE/IiAiOiJlICIpKTsKKyAgICAgIGkgJT0gNDMyMDA7CisgICAgfQorICAgIGlmICgoaj1pLzE4MDApKQorICAgIHsKKyAgICAgIHdyaXRlKGogKyAiIFN0dW5kZSIrKGo9PTE/IiAiOiJuICIpKTsKKyAgICAgIGkgJT0gMTgwMDsKKyAgICB9CisgICAgaWYgKChqPWkvMzApKQorICAgIHsKKyAgICAgIHdyaXRlKGogKyAiIE1pbnV0ZSIrKGo9PTE/IiAiOiJuICIpKTsKKyAgICAgIGkgJT0gMzA7CisgICAgfQorICAgIHdyaXRlKGkqMiArICIgU2VrdW5kZW4uXG4iKTsKK30KKwpkaWZmIC0tZ2l0IGEvc3RkL3BsYXllci9tb25leWhhbmRsZXIuYyBiL3N0ZC9wbGF5ZXIvbW9uZXloYW5kbGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZhMTdkYgotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvbW9uZXloYW5kbGVyLmMKQEAgLTAsMCArMSw1NiBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHBsYXllci9tb25leWhhbmRsZXIuYyAtLSBtb25leSBoYW5kbGVyIGZvciBwbGF5ZXJzCisvLyBOdXIgbm9jaCBhdXMgS29tcGF0aWJpbGl0YWV0c2dydWVuZGVuIHZvcmhhbmRlbgorLy8KKy8vICRJZDogbW9uZXloYW5kbGVyLmMgOTA1MSAyMDE1LTAxLTExIDIwOjI4OjAwWiBaZXNzdHJhICQKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKworaW5oZXJpdCAiL3N0ZC9jb250YWluZXIvbW9uZXloYW5kbGVyIjsKKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDx0aGluZy9wcm9wZXJ0aWVzLmg+CisjdW5kZWYgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8Y29udGFpbmVyL21vbmV5aGFuZGxlci5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtb25leS5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorCitwdWJsaWMgaW50IEFkZE1vbmV5KCBpbnQgYW1vdW50ICkKK3sKKyAgb2JqZWN0IG9iOworCisgIGlmICggIWFtb3VudCApCisgICAgcmV0dXJuIDE7CisKKyAgaW50IHJldCA9IG1vbmV5aGFuZGxlcjo6QWRkTW9uZXkoYW1vdW50KTsKKworICAvLyBnZ2YuIG5vY2ggbG9nZ2VuCisgIGlmICggcmV0ID09IE1PVkVfT0sKKyAgICAgICAmJiBvYmplY3RwKG9iID0gZmluZF9vYmplY3QoIi9wL2RhZW1vbi9tb25leWxvZyIpKQorICAgICAgICYmIGFtb3VudCA+IDAKKyAgICAgICAvLyBkaWVzZXMgbXVzcyBsZWlkZXIgZHJpbmJsZWliZW4sIHdlaWwgdmllbGUgbmljaHQtU3BpZWxlciBkaWVzZXMKKyAgICAgICAvLyBlcmJlbgorICAgICAgICYmIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUodGhpc19vYmplY3QoKSkKKyAgICAgICAmJiAhSVNfV0laQVJEKHRoaXNfb2JqZWN0KCkpCisgICAgICAgJiYgIVF1ZXJ5KFBfVEVTVFBMQVlFUikgKQorICAgIG9iLT5BZGRNb25leSggcHJldmlvdXNfb2JqZWN0KCksIGFtb3VudCApOworCisgIHJldHVybiByZXQ7Cit9CisKK3B1YmxpYyBpbnQgUXVlcnlNb25leSgpCit7CisgIG9iamVjdCBtb25leSA9IHByZXNlbnQoU0VIRVJLQVJURUlEX0FLVElWLCB0aGlzX29iamVjdCgpKTsKKyAgLy8genVzYWV0emxpY2ggenUgZGVuIGFuZGVyZW4gR2VsZHF1ZWxsZW4gYXVjaCBub2NoIGRpZSBTZWhlcmthcnRlIHBydWVmZW4uCisgIGlmIChtb25leSkKKyAgICByZXR1cm4gbW9uZXloYW5kbGVyOjpRdWVyeU1vbmV5KCkgKyBtb25leS0+UXVlcnlQcm9wKFBfQU1PVU5UKTsKKworICByZXR1cm4gbW9uZXloYW5kbGVyOjpRdWVyeU1vbmV5KCk7Cit9CisKZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvbW92aW5nLmMgYi9zdGQvcGxheWVyL21vdmluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNjJmNTkKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL21vdmluZy5jCkBAIC0wLDAgKzEsMTgyIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gcGxheWVyL21vdmluZy5jIC0tIHBsYXllciBtb3ZpbmcKKy8vCisvLyAkSWQ6IG1vdmluZy5jIDk0MzQgMjAxNi0wMS0xMiAxMjozNDowNVogWmVzc3RyYSAkCisjcHJhZ21hIHN0cm9uZ190eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisKK2luaGVyaXQgInN0ZC9saXZpbmcvbW92aW5nIjsKKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDxwbGF5ZXIvYmFzZS5oPgorI2luY2x1ZGUgPGxpdmluZy9kZXNjcmlwdGlvbi5oPgorI2luY2x1ZGUgPHBsYXllci92aWV3Y21kLmg+CisjaW5jbHVkZSA8cGxheWVyLmg+CisjdW5kZWYgTkVFRF9QUk9UT1RZUEVTCisKKyNpbmNsdWRlIDx0aGluZy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPGV2ZW50cy5oPgorI2luY2x1ZGUgPHBhdGhkLmg+CisKK3ByaXZhdGUgbm9zYXZlIHN0cmluZyAqY29ubmVjdGlvbnM7CisKK3B1YmxpYyB2b2lkIGNyZWF0ZSgpCit7CisgICAgU2V0UHJvcCggUF9NU0dJTiwgICJrb21tdCBhbiIgKTsKKyAgICBTZXRQcm9wKCBQX01TR09VVCwgImdlaHQiICk7CisgICAgU2V0UHJvcCggUF9NTVNHSU4sICJ0cml0dCBhdXMgZWluZXIgU2Nod2VmZWx3b2xrZSIgKTsKKyAgICBTZXRQcm9wKCBQX01NU0dPVVQsICJ2ZXJzY2h3aW5kZXQgbWl0IEtuYWxsIHVuZCBTY2h3ZWZlbGR1ZnQiICk7CisgICAgU2V0KCBQX01TR0lOLCAgIFNBVkUsIEZfTU9ERSApOworICAgIFNldCggUF9NU0dPVVQsICBTQVZFLCBGX01PREUgKTsKKyAgICBTZXQoIFBfTU1TR0lOLCAgU0FWRSwgRl9NT0RFICk7CisgICAgU2V0KCBQX01NU0dPVVQsIFNBVkUsIEZfTU9ERSApOworICAgIGNvbm5lY3Rpb25zID0gKHt9KTsKKworICAgIDo6Y3JlYXRlKCk7Cit9CisKKworc3RhdGljIG1peGVkIF90b19yZW1vdmUoIG9iamVjdCBvYiApCit7CisgICAgcmV0dXJuIG9iLT5RdWVyeVByb3AoUF9BVVRPTE9BRE9CSikgfHwgb2ItPlF1ZXJ5UHJvcChQX05PRFJPUCk7Cit9CisKKworLy8gYXV0b2xvYWQgYW5kIG5vZHJvcCBvYmplY3QgbWF5IG5vdCBmYWxsIGludG8gdGhlIGVudmlyb25tZW50CitzdGF0aWMgdmFyYXJncyBpbnQgcmVtb3ZlKCBpbnQgc2lsZW50ICkKK3sKKyAgICBvYmplY3QqIGRlc3Rfb2JqID0gZmlsdGVyKCBkZWVwX2ludmVudG9yeShNRSkgLSAoezB9KSwgIl90b19yZW1vdmUiICk7CisgICAgZmlsdGVyX29iamVjdHMoIGRlc3Rfb2JqLCAicmVtb3ZlIiApOworICAgIGZpbHRlciggZGVzdF9vYmogLSAoezB9KSwgIydkZXN0cnVjdCApOworCisgICAgaWYgKCAhUXVlcnlQcm9wKFBfSU5WSVMpICYmICFzaWxlbnQgKQorICAgICAgICBjYXRjaCggc2F5KCBuYW1lKFdFUiwgMSkgKyAiIHZlcmxhZXNzdCBkaWVzZSBXZWx0LlxuIiwgTUUgKTtwdWJsaXNoICk7CisgICAgCisgICAgaWYgKCBNRSAmJiAhc2lsZW50ICkKKyAgICAgICAgdGVsbF9vYmplY3QoIE1FLCAiQmlzIGJhbGQhXG4iICk7CisKKyAgICAvLyBJbSBGYWxsZSBkZXMgUmVzZXRzIGlzdCBwcmV2aW91c19vYmplY3QoKSA9PSBNRSwgYWJlcgorICAgIC8vIHByZXZpb3VzX29iamVjdCgwKSA9PSAwLiBBdXNzZXJkZW0gaXN0IGRlciBDYWxsZXItU3RhY2sgbGVlci4gQWxzbworICAgIC8vIHNjaGF1ZW4sIG9iIGVzIGVpbiBQTyBnaWJ0LCB3YXMgbmljaHQgZ2xlaWNoIGRlbSBPYmpla3Qgc2VsYmVyIGlzdCwgVEkKKyAgICAvLyBwcnVlZmVuIHVuZCAKKyAgICBpZiAoIHRoaXNfaW50ZXJhY3RpdmUoKSAhPSBNRQorICAgICAgICAmJiBvYmplY3RwKHByZXZpb3VzX29iamVjdCgpKSAmJiBwcmV2aW91c19vYmplY3QoKSAhPSBNRQorICAgICAgICAmJiBvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSlbMC4uN10gIT0gIi9zZWN1cmUvIgorICAgICAgICAmJiBtZW1iZXIob2JqZWN0X25hbWUoTUUpLCAnOicpID4gLTEgKQorICAgICAgbG9nX2ZpbGUoICJQTEFZRVJERVNUIiwKKyAgICAgICAgICAgICAgICBzcHJpbnRmKCAiJXM6ICVPIHZlcm5pY2h0ZXQgdm9uIFBPICVPLCBUSSAlTywgVFAgJU9cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZHRpbWUodGltZSgpKSwgTUUsIHByZXZpb3VzX29iamVjdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfaW50ZXJhY3RpdmUoKSwgdGhpc19wbGF5ZXIoKSApICk7CisKKyAgICAvLyBMb2dvdXQtZXZlbnQgYXVzbG9lc2VuCisgICAgRVZFTlRELT5UcmlnZ2VyRXZlbnQoRVZUX0xJQl9MT0dPVVQsIChbCisJICAgIEVfT0JKRUNUOiBNRSwKKwkgICAgRV9QTE5BTUU6IGdldHVpZChNRSksCisJICAgIEVfRU5WSVJPTk1FTlQ6IGVudmlyb25tZW50KCkgXSkgKTsKKworICAgIHJldHVybiA6OnJlbW92ZSgpOworfQorCitwdWJsaWMgc3RyaW5nIE5vdGlmeURlc3RydWN0KG9iamVjdCBjYWxsZXIpIHsKKyAgCisgIGlmIChwcmV2aW91c19vYmplY3QoKSAhPSBtYXN0ZXIoKQorICAgICAgfHwgb2JqZWN0X25hbWUodGhpc19vYmplY3QoKSkgPT0gX19GSUxFX19bLi48M10pCisgICAgcmV0dXJuIDA7CisKKyAgLy8gRGFzIFplcnN0b2VyZW4gdm9uIFNwaWVsZXJuIHdpcmQgZ2dmLiBnZWxvZ2d0LgorICBpZiAoIG9iamVjdHAoY2FsbGVyKSAmJiBjYWxsZXIgIT0gdGhpc19vYmplY3QoKQorICAgICAgICYmIGdldHVpZChjYWxsZXIpICE9IFJPT1RJRCApIHsKKyAgICAgIGxvZ19maWxlKCAiUExBWUVSREVTVCIsCisJCXNwcmludGYoICIlczogJU8gVkVSTklDSFRFVCB2b24gUE8gJU8sIFRJICVPLCBUUCAlT1xuIiwKKwkJCSBkdGltZSh0aW1lKCkpLCB0aGlzX29iamVjdCgpLCBjYWxsZXIsCisJCQkgdGhpc19pbnRlcmFjdGl2ZSgpLCB0aGlzX3BsYXllcigpICkgKTsKKyAgfQorICAvLyBlcnN0bWFsIG5peCB3ZWl0ZXIgdHVuLCBkZXN0cnVjdCBnZXN0YXR0ZW4uCisgIHJldHVybiAwOworfQorCitwcm90ZWN0ZWQgaW50IFByZXZlbnRNb3ZlKG9iamVjdCBkZXN0LCBvYmplY3Qgb2xkZW52LCBpbnQgbWV0aG9kKSB7CisgIHN0cmluZyBoY3Jvb207CisgIG1peGVkIHJlczsKKworICAvLyBnZXN0b3JiZW5lIEhDLVNwaWVsZXIgZHVlcmZlbiBuaWNodCBtZWhyIGF1cyBkZW0gTmlydmFuYSwgbmljaHQgdW1nZWhiYXIKKyAgLy8gZHVyY2ggTV9OT0NIRUNLCisgIGlmICggaW50ZXJhY3RpdmUoTUUpICYmIChxdWVyeV9oY19wbGF5KCk+MSkgKSB7CisgICAgaWYgKG9iamVjdHAoZGVzdCkpCisgICAgICBoY3Jvb209b2JqZWN0X25hbWUoZGVzdCk7CisgICAgaWYgKHNpemVvZihoY3Jvb20pPDcgfHwgaGNyb29tWzAuLjVdIT0iL3Jvb20vIikgeyAKKyAgICAgIHJldHVybiBNRV9DQU5UX0JFX0lOU0VSVEVEOworICAgIH0KKyAgfQorCisgIC8vIGFsbGUgYW5kZXJlbiBQcnVlZnVuZ2VuIHNpbmQgbWl0IE1fTk9DSEVDSyBlZ2FsLgorICBpZiAoIChtZXRob2QgJiBNX05PQ0hFQ0spICkKKyAgICByZXR1cm4oOjpQcmV2ZW50TW92ZShkZXN0LG9sZGVudixtZXRob2QpKTsKKworICAvLyBTcGllbGVyIGR1ZXJmZW4gaW4gUmFldW1lIG1pdCBnZXNldHp0ZW0gUF9OT19QTEFZRVJTIG5pY2h0IGhpbmVpbgorICBpZiAoIGRlc3QtPlF1ZXJ5UHJvcChQX05PX1BMQVlFUlMpICYmIGludGVyYWN0aXZlKE1FKSAmJgorCSEobWV0aG9kICYgTV9OT0NIRUNLKSAmJgorICAgICAgICAhSVNfTEVBUk5FUihNRSkgJiYgKCFzdHJpbmdwKHJlcyA9IFF1ZXJ5UHJvcChQX1RFU1RQTEFZRVIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhSVNfTEVBUk5FUiggbG93ZXJfY2FzZShyZXMpICkpICl7CisgICAgICB0ZWxsX29iamVjdCggTUUsICJEYSBkYXJmc3QgRHUgYWxzIFNwaWVsZXIgbmljaHQgaGluLlxuIiApOworICAgICAgcmV0dXJuIE1FX05PVF9BTExPV0VEOworICB9CisKKyAgcmV0dXJuIDo6UHJldmVudE1vdmUoZGVzdCxvbGRlbnYsbWV0aG9kKTsKK30KKworLy8gRnVjay4gQXVzbmFobXN3ZWlzZSB3ZWdlbiBWQyBicmF1Y2ggaWNoIG5lbiBhbmRlcmVzIEJMVUVfTkFNRQorI2RlZmluZSBPTERfQkxVRV9OQU1FKG9iKSAoZXhwbG9kZShvYmplY3RfbmFtZShvYiksIiMiKVswXSkKKy8vIEtyYW1zIG5hY2ggZGVtIE1vdmUgbWFjaGVuIHVuZCBuZWJlbmJlaSB6dW0gVWViZXJzY2hyZWliZW4uCitwcm90ZWN0ZWQgdm9pZCBOb3RpZnlNb3ZlKG9iamVjdCBkZXN0LCBvYmplY3Qgb2xkZW52LCBpbnQgbWV0aG9kKSB7CisKKyAgLy8gZXJzdG1hbCBnZ2YuIFJhdW1pbmhhbHQgYW4gU3BpZWxlciBhdXNnZWJlbi4KKyAgaWYgKCBpbnRlcmFjdGl2ZShNRSkgJiYgIShtZXRob2QgJiBNX05PX1NIT1cpICkgeworICAgICAgaWYgKCFDYW5ub3RTZWUoMSkpCisgICAgICAgICAgdGVsbF9vYmplY3QoIE1FLCAiIiArIGVudl9kZXNjcigxKSApOworICAgICAgZWxzZSBpZiAoIFF1ZXJ5UHJvcChQX0JSSUVGKSA8IDIgKQorICAgICAgICAgIHRlbGxfb2JqZWN0KCBNRSwgIkZpbnN0ZXJuaXMuXG4iICk7CisgIH0KKworICAvL2Rhbm4gZ2VlcmJ0ZW4gS3JhbSBtYWNoZW4KKyAgOjpOb3RpZnlNb3ZlKGRlc3Qsb2xkZW52LG1ldGhvZCk7CisKKyAgLy8gU2NobHVzc2VuZGxpY2ggbm9jaCBmdWVyIGRlbiBQYXRoRCBiZXdlZ3VuZyBwcm90b2tvbGxpZXJlbi4KKyAgLy8gKGRlc3QgbmljaHQgZ2VwcnVlZnQsIGRhIGVpbiBTcGllbGVyIG5pY2h0IGF1c3NlcmhhbGIgamVkZXMgRW52IGJld2VndAorICAvLyB3ZXJkZW4ga2FubikKKyAgaWYgKCBpbnRlcmFjdGl2ZSgpICYmIGVudmlyb25tZW50KCkgJiYgcXVlcnlfdmVyYigpICYmIG9iamVjdHAob2xkZW52KSkgeworICAgICAgY29ubmVjdGlvbnMgKz0gKHsgKHsgT0xEX0JMVUVfTkFNRShvbGRlbnYpLCBPTERfQkxVRV9OQU1FKGRlc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlfdmVyYigpICsgIiAiICsgKF91bnBhcnNlZF9hcmdzKDIpIHx8ICIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCwgZGVzdC0+UXVlcnlQcm9wKFBfUEFSQSkgfSkgfSk7CisKKyAgICAgIGlmICggc2l6ZW9mKGNvbm5lY3Rpb25zKSA+IDUwCisgICAgICAgICAgICYmIGZpbmRfY2FsbF9vdXQoImZsdXNoX2Nvbm5lY3Rpb25zIikgPT0gLTEgKQorICAgICAgICAgICAgY2FsbF9vdXQoICJmbHVzaF9jb25uZWN0aW9ucyIsIDAsIGNvbm5lY3Rpb25zICk7CisgIH0KK30KKworcHVibGljIHZvaWQgZmx1c2hfY29ubmVjdGlvbnMoKSB7CisgICAgY2F0Y2goUEFUSEQtPmFkZF9wYXRocyhjb25uZWN0aW9ucyk7cHVibGlzaCk7CisgICAgY29ubmVjdGlvbnMgPSAoe30pOworfQorCisvKioqIFF1ZXJ5LU1ldGhvZGVuIGZ1ZXIgRnJvZXNjaGUuLi4gO14pICoqKi8KK3N0YXRpYyBzdHJpbmcgX3F1ZXJ5X21zZ2luKCkKK3sKKyAgICByZXR1cm4gUXVlcnlQcm9wKFBfRlJPRykgPyAiaHVlcGZ0IGhlcmVpbiIgOiBRdWVyeShQX01TR0lOKTsKK30KKworCitzdGF0aWMgc3RyaW5nIF9xdWVyeV9tc2dvdXQoKQoreworICAgIHJldHVybiBRdWVyeVByb3AoUF9GUk9HKSA/ICJodWVwZnQiIDogUXVlcnkoUF9NU0dPVVQpOworfQpkaWZmIC0tZ2l0IGEvc3RkL3BsYXllci9vYmplY3RzLmMgYi9zdGQvcGxheWVyL29iamVjdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjYzZWEzCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9vYmplY3RzLmMKQEAgLTAsMCArMSwyNDMgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBwbGF5ZXIvb2JqZWN0cy5jIC0tIG9iamVjdCBoYW5kbGluZyBmb3IgcGxheWVyCisvLworLy8gJElkOiBvYmplY3RzLmMgODY3NSAyMDE0LTAyLTE4IDIwOjM5OjU0WiBaZXNzdHJhICQKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlICIvc3lzL3BsYXllci9maWxlc3lzLmgiCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxwbGF5ZXIuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDx0aGluZy9tb3ZpbmcuaD4KKworc3RhdGljIGludCB1cGRhdGVfb2JqZWN0KHN0cmluZyBzdHIpIHsKKyAgb2JqZWN0IG9iOworICBzdHJpbmcgdXBkX2ZpbGU7CisgIGlmICghKHN0cj1fdW5wYXJzZWRfYXJncygpKSkgeworICAgIG5vdGlmeV9mYWlsKCJVc2FnZTogVXBkYXRlIDxvYmplY3RfcGF0aD5cbiIpOyByZXR1cm4gMDsKKyAgfQorICB1cGRfZmlsZSA9IGZpbmRfZmlsZShzdHIsIi5jIik7CisgIGlmICghdXBkX2ZpbGUpIHVwZF9maWxlPWZpbmRfZmlsZShzdHIpOworICBpZiAoIXVwZF9maWxlKSB7CisgICAgbm90aWZ5X2ZhaWwoc3RyKyI6IE5vIHN1Y2ggZmlsZS5cbiIpOyByZXR1cm4gMDsKKyAgfQorICBvYiA9IGZpbmRfb2JqZWN0KHVwZF9maWxlKTsKKyAgaWYgKCFvYikgeworICAgIG5vdGlmeV9mYWlsKHVwZF9maWxlKyI6IE5vIHN1Y2ggb2JqZWN0LlxuIik7IHJldHVybiAwOworICB9CisgIGRlc3RydWN0KG9iKTsKKyAgd3JpdGUodXBkX2ZpbGUgKyAiOiB3aWxsIGJlIHJlbG9hZGVkIGF0IG5leHQgcmVmZXJlbmNlLlxuIik7CisgIHJldHVybiAxOworfQorCisvKgorICogInNvZnQiIG1lYW5zIHRoYXQgdGhlIG9iamVjdCBpcyBnaXZlbiB0aGUgY2hhbmNlIHRvIHNlbGYtZGVzdHJ1Y3QsIHRodXMKKyAqIGFsbG93aW5nIGl0IHRvIGRvIG5lY2Vzc2FyeSBjbGVhbnVwIGxpa2Ugc3VidHJhY3RpbmcgZnJvbSB0aGUgY2FycmllZAorICogd2VpZ2h0IG9mIHRoZSBlbnZpcm9ubWVudCgpLiBXZSBjYWxsIHJlbW92ZSgpIGluIHRoZSBvYmplY3QgdG8gYmUKKyAqIGRlc3RydWN0ZWQuCisgKi8KK3N0YXRpYyBpbnQgc29mdF91cGRhdGVfb2JqZWN0KHN0cmluZyBzdHIpIAoreworICBvYmplY3Qgb2I7CisgIHN0cmluZyB1cGRfZmlsZTsKKyAgaWYgKCEoc3RyPV91bnBhcnNlZF9hcmdzKCkpKSB7CisgICAgbm90aWZ5X2ZhaWwoIlVzYWdlOiB1cGRhdGUgPG9iamVjdF9wYXRoPlxuIik7IHJldHVybiAwOworICB9CisgIHVwZF9maWxlID0gZmluZF9maWxlKHN0ciwiLmMiKTsKKyAgaWYgKCF1cGRfZmlsZSkgdXBkX2ZpbGU9ZmluZF9maWxlKHN0cik7CisgIGlmICghdXBkX2ZpbGUpIHsKKyAgICBub3RpZnlfZmFpbChzdHIrIjogTm8gc3VjaCBmaWxlLlxuIik7IHJldHVybiAwOworICB9CisgIG9iID0gZmluZF9vYmplY3QodXBkX2ZpbGUpOworICBpZiAoIW9iKSB7CisgICAgbm90aWZ5X2ZhaWwodXBkX2ZpbGUrIjogTm8gc3VjaCBvYmplY3QuXG4iKTsgcmV0dXJuIDA7CisgIH0KKyAgaWYgKG9iLT5yZW1vdmUoKSA9PSAwKSB7CisgICAgbm90aWZ5X2ZhaWwodXBkX2ZpbGUrIjogZG9lc24ndCB3YW50IHRvIGJlIGRlc3RydWN0ZWQhXG4iKTsgcmV0dXJuIDA7CisgIH0KKyAgd3JpdGUodXBkX2ZpbGUgKyAiOiB3aWxsIGJlIHJlbG9hZGVkIGF0IG5leHQgcmVmZXJlbmNlLlxuIik7CisgIHJldHVybiAxOworfQorCitpbnQgY2xvbmUoc3RyaW5nIHN0cikgCit7CisgIG9iamVjdCBvYjsKKyAgc3RyaW5nIGNsb25lX2ZpbGU7CisKKyAgaWYgKCEoc3RyPV91bnBhcnNlZF9hcmdzKCkpKXsKKyAgICBub3RpZnlfZmFpbCgiVXNhZ2U6IGNsb25lIDxvYmplY3RfcGF0aD5cbiIpOyByZXR1cm4gMDsKKyAgfQorICBjbG9uZV9maWxlID0gZmluZF9maWxlKHN0ciwiLmMiKTsKKyAgaWYgKCFjbG9uZV9maWxlKSBjbG9uZV9maWxlPWZpbmRfZmlsZShzdHIpOworICBpZiAoIWNsb25lX2ZpbGUpIHsKKyAgICBub3RpZnlfZmFpbChzdHIrIjogTm8gc3VjaCBmaWxlLlxuIik7IHJldHVybiAwOworICB9CisgIGlmICghKG9iID0gY2xvbmVfb2JqZWN0KGNsb25lX2ZpbGUpKSkKKyAgICByZXR1cm4gbm90aWZ5X2ZhaWwoc3RyKyI6IEZhaWxlZCB0byBsb2FkLlxuIiksIDA7CisKKyAgLyogU29tZSBvYmplY3RzIGRlc3RydWN0IHRoZW1zZWx2ZXMgcmF0aGVyIGZhc3QgKi8KKyAgaWYgKCFvYmplY3RwKG9iKSkKKyAgICByZXR1cm4gbm90aWZ5X2ZhaWwoc3RyKyI6IERlc3RydWN0ZWQgd2hpbHN0IGNyZWF0ZWQuXG4iKSwgMDsKKyAgCisgIC8qIHRyeSB0byBtb3ZlIHRoZSBvYmplY3QgdG8gbXkgZW52aXJvbm1lbnQgKi8KKyAgaWYgKChvYi0+bW92ZSh0aGlzX29iamVjdCgpLE1fR0VUKT4wKSB8fCAKKyAgICAgIChvYi0+bW92ZShlbnZpcm9ubWVudCgpLE1fTk9DSEVDSyk+MCkpCisgIHsKKyAgICBpZiAoIW9iamVjdHAob2IpKQorICAgICAgcmV0dXJuIG5vdGlmeV9mYWlsKHN0cisiOiBEZXN0cnVjdGVkIHdoaWxzdCBjcmVhdGVkLlxuIiksIDA7CisgICAgd3JpdGUoIkNsb25lZCAiK29iamVjdF9uYW1lKG9iKSsiLlxuIik7CisgICAgc2F5KHRoaXNfcGxheWVyKCktPm5hbWUoV0VSLDEpICsgIiAiCisJCSsgdGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKFBfQ0xPTkVfTVNHKSsiLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgc2F5KHRoaXNfcGxheWVyKCktPm5hbWUoV0VSLDEpKyIgbWFsdCB3aWxkZSBaZWljaGVuIGluIGRpZSBMdWZ0IHVuZCAiCisgICAgICArIm11cm1lbHQgdm9yIHNpY2ggaGluLCBhYmVyIG5pY2h0cyBwYXNzaWVydC4uLlxuIik7CisgIGRlc3RydWN0KG9iKTsKKyAgd3JpdGUoY2xvbmVfZmlsZSsiOiBmYWlsZWQgdG8gbW92ZVxuIik7CisgIHJldHVybiAxOworfQorCisvKgorICogInNvZnQiIG1lYW5zIHRoYXQgdGhlIG9iamVjdCBpcyBnaXZlbiB0aGUgY2hhbmNlIHRvIHNlbGYtZGVzdHJ1Y3QsIHRodXMKKyAqIGFsbG93aW5nIGl0IHRvIGRvIG5lY2Vzc2FyeSBjbGVhbnVwIGxpa2Ugc3VidHJhY3RpbmcgZnJvbSB0aGUgY2FycmllZAorICogd2VpZ2h0IG9mIHRoZSBlbnZpcm9ubWVudCgpLiBXZSBjYWxsIHJlbW92ZSgpIGluIHRoZSBvYmplY3QgdG8gYmUKKyAqIGRlc3RydWN0ZWQuCisgKi8KK3N0YXRpYyBpbnQgc29mdF9kZXN0cnVjdF9vYmplY3Qoc3RyaW5nIHN0cikKK3sgCisgIG9iamVjdCBvYjsKKyAgb2JqZWN0ICpvYnM7CisgIHN0cmluZyBzdHJXRVIsc3RyV0VOOworCisgIGlmICghKHN0cj1fdW5wYXJzZWRfYXJncygpKSl7CisgICAgbm90aWZ5X2ZhaWwoIlVzYWdlOiBkZXN0cnVjdCA8b2JqZWN0bmFtZT5cbiIpOyByZXR1cm4gMDsKKyAgfQorICBzdHJXRVIgPSBsb3dlcl9jYXNlKHN0cik7CisgIG9icyA9IHRoaXNfcGxheWVyKCktPmZpbmRfb2JzKHN0cldFUixQVVRfR0VUX05PTkUpOworICBpZiAoIW9icyB8fCAhc2l6ZW9mKG9icykpIHsKKyAgICBub3RpZnlfZmFpbCgiS2VpbiBcIiIgKyBzdHIgKyAiXCIgZ2VmdW5kZW4uXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBvYj1vYnNbMF07CisgIHN0cldFUj1vYi0+bmFtZShXRVIpOworICBzdHJXRU49b2ItPm5hbWUoV0VOKTsKKyAgaWYgKCFzdHJXRVIpCisgICAgc3RyV0VSPSJqZW1hbmQiOworICBpZiAoIXN0cldFTikKKyAgICBzdHJXRU49ImplbWFuZGVuIjsKKworICBpZiAob2ItPnJlbW92ZSgpID09IDApIHsKKyAgICBub3RpZnlfZmFpbChzdHJXRVIrIiB3aWxsIG5pY2h0ICdkZXN0cnVjdGVkJyB3ZXJkZW4hXG4iKTsKKyAgICBzYXkodGhpc19wbGF5ZXIoKS0+bmFtZShXRVIsMSkrIiB2ZXJzdWNodCB2ZXJnZWJsaWNoLCAiK3N0cldFTisKKyAgICAgICAgIiB6dSBhdG9taXNpZXJlbi5cbiIpOworICAgIHJldHVybiAwOworICB9CisgIHNheShjYXBpdGFsaXplKHN0cldFUikrIiAiK3RoaXNfcGxheWVyKCktPlF1ZXJ5UHJvcChQX0RFU1RSVUNUX01TRykrIi5cbiIpOworICB3cml0ZShjYXBpdGFsaXplKHN0cldFUikrIiB3aXJkIHZvbiBkaXIgemVyc3RhZXVidC5cbiIpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBkZXN0cnVjdF9vYmplY3Qoc3RyaW5nIHN0cikKK3sgCisgIG9iamVjdCBvYjsKKyAgb2JqZWN0ICpvYnM7CisgIHN0cmluZyBzdHJXRVIsc3RyV0VOOworCisgIGlmICghKHN0cj1fdW5wYXJzZWRfYXJncygpKSkgeworICAgIG5vdGlmeV9mYWlsKCJVc2FnZTogRGVzdHJ1Y3QgPG9iamVjdG5hbWU+XG4iKTsgcmV0dXJuIDA7CisgIH0KKyAgc3RyV0VSID0gbG93ZXJfY2FzZShzdHIpOworICBvYnMgPSB0aGlzX3BsYXllcigpLT5maW5kX29icyhzdHJXRVIsUFVUX0dFVF9OT05FKTsKKyAgaWYgKCFvYnMgfHwgIXNpemVvZihvYnMpKSB7CisgICAgbm90aWZ5X2ZhaWwoIktlaW4gXCIiICsgc3RyICsgIlwiIGdlZnVuZGVuLlxuIik7IHJldHVybiAwOworICB9CisgIG9iPW9ic1swXTsKKyAgc3RyV0VSPW9iLT5uYW1lKFdFUik7CisgIHN0cldFTj1vYi0+bmFtZShXRU4pOworCisgIHNheShjYXBpdGFsaXplKHN0cldFUikrIiAiK3RoaXNfcGxheWVyKCktPlF1ZXJ5UHJvcChQX0RFU1RSVUNUX01TRykrIi5cbiIpOworICBkZXN0cnVjdCggb2IgKTsKKyAgd3JpdGUoY2FwaXRhbGl6ZShzdHJXRVIpKyIgd2lyZCB2b24gZGlyIHplcnN0YWV1YnQuXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbG9hZChzdHJpbmcgc3RyKQoreyAKKyAgb2JqZWN0IGVudjsKKyAgc3RyaW5nIGZpbGU7CisgIHN0cmluZyBlcnI7CisKKyAgaWYgKCEoc3RyPV91bnBhcnNlZF9hcmdzKCkpKSB7CisgICAgbm90aWZ5X2ZhaWwoIlVzYWdlOiBsb2FkIDxvYmplY3RfcGF0aD5cbiIpOyByZXR1cm4gMDsKKyAgfQorICBmaWxlID0gZmluZF9maWxlKHN0ciwiLmMiKTsKKyAgaWYgKCFmaWxlKSBmaWxlPWZpbmRfZmlsZShzdHIpOworICBpZiAoIWZpbGUpIHsKKyAgICBub3RpZnlfZmFpbChzdHIrIjogTm8gc3VjaCBmaWxlLlxuIik7IHJldHVybiAwOworICB9CisgIGlmICggZXJyID0gY2F0Y2gobG9hZF9vYmplY3QoZmlsZSk7cHVibGlzaCkgKQorICAgIHByaW50ZigiQ2Fubm90IGxvYWQgJU8sIGVyciA9ICVPXG4iLGZpbGUsZXJyKTsKKyAgZWxzZSB3cml0ZShmaWxlKyJcbiIpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBleGVjX3BsYXllcm9iKHN0cmluZyBuYW1lKQoreworICBvYmplY3Qgb2IsICppbnY7CisgIGludCBpOworCisgIGlmICghSVNfTE9SRCh0aGlzX29iamVjdCgpKSkgcmV0dXJuIDA7CisgIGlmICh0aGlzX3BsYXllcigpICE9IHRoaXNfaW50ZXJhY3RpdmUoKSkgcmV0dXJuIDA7CisgIGlmICh0aGlzX3BsYXllcigpICE9IHRoaXNfb2JqZWN0KCkpIHJldHVybiAwOworICBpZiAoIShuYW1lPV91bnBhcnNlZF9hcmdzKCkpKSByZXR1cm4gMDsKKyAgbmFtZT0ic2VjdXJlL21hc3RlciItPl9nZXRfcGF0aChuYW1lLGdldHVpZCh0aGlzX29iamVjdCgpKSk7CisgIGlmIChjYXRjaChsb2FkX29iamVjdChuYW1lKTtwdWJsaXNoKSApIAorICB7CisgICAgd3JpdGUoIkJVRyBpbiAiK25hbWUrIlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgb2I9Y2xvbmVfb2JqZWN0KG5hbWUpOworICBpZiAoIW9iKSByZXR1cm4gMDsKKyAgaWYgKGdldHVpZChvYikgIT0gZ2V0dWlkKHRoaXNfb2JqZWN0KCkpKQorICB7CisgICAgd3JpdGUoIlVJRCBjb25mbGljdC5cbiIpOworICAgIGRlc3RydWN0KG9iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBsb2dfZmlsZSgiRVhFQyIsIGdldHVpZCh0aGlzX29iamVjdCgpKSsiICIrbmFtZSsiICIrZHRpbWUodGltZSgpKSk7CisgIGRpc2FibGVfY29tbWFuZHMoKTsKKyAgZXhlYyhvYix0aGlzX29iamVjdCgpKTsKKyAgaWYgKGludGVyYWN0aXZlKHRoaXNfb2JqZWN0KCkpIHx8ICFpbnRlcmFjdGl2ZShvYikpCisgIHsKKyAgICBlbmFibGVfY29tbWFuZHMoKTsKKyAgICB3cml0ZSgiRmVobGVyIGluIGV4ZWNcbiIpOworICAgIHJldHVybiAxOworICB9CisgIGludj1hbGxfaW52ZW50b3J5KHRoaXNfb2JqZWN0KCkpOworICBvYi0+c3RhcnRfcGxheWVyKGNhcGl0YWxpemUoZ2V0dWlkKHRoaXNfb2JqZWN0KCkpKSk7CisgIHJlbW92ZSgpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIG1peGVkIF9xdWVyeV9sb2NhbGNtZHMoKQoreworICByZXR1cm4gKHsKKyAgICAgICAgICAgKHsiY2xvbmUiLCJjbG9uZSIsMCxXSVpBUkRfTFZMfSksCisJICAgKHsiZGVzdHJ1Y3QiLCJzb2Z0X2Rlc3RydWN0X29iamVjdCIsMCxMRUFSTkVSX0xWTH0pLAorCSAgICh7IkRlc3RydWN0IiwiZGVzdHJ1Y3Rfb2JqZWN0IiwwLExFQVJORVJfTFZMfSksCisJICAgKHsibG9hZCIsImxvYWQiLDAsV0laQVJEX0xWTH0pLAorCSAgICh7InVwZGF0ZSIsInNvZnRfdXBkYXRlX29iamVjdCIsMCxMRUFSTkVSX0xWTH0pLAorCSAgICh7IlVwZGF0ZSIsInVwZGF0ZV9vYmplY3QiLDAsTEVBUk5FUl9MVkx9KSwKKwkgICAoeyJleGVjIiwiZXhlY19wbGF5ZXJvYiIsMCxMRUFSTkVSX0xWTH0pCisJIH0pOworfQpkaWZmIC0tZ2l0IGEvc3RkL3BsYXllci9wa2xvZy5jIGIvc3RkL3BsYXllci9wa2xvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MTNlYmUKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL3BrbG9nLmMKQEAgLTAsMCArMSwxMDggQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8qKiBcZmlsZSAvc3RkL3BsYXllci9wa2xvZy5jCisqIEZ1bmt0aW9uIHp1ciBEZXRla3Rpb24gdW5kIExvZ2dlbiB2b24gQW5ncmlmZmVuIHZvbiBTcGllbGVybiBhdWYgU3BpZWxlci4KKyogXGF1dGhvciBaZXNzdHJhCisqIFxkYXRlIDEyLjA4LjIwMDgKKyogXHZlcnNpb24gJElkJAorKi8KKy8qIENoYW5nZWxvZzoKKyovCisjcHJhZ21hIHN0cm9uZ190eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIG5vX3NoYWRvdworI3ByYWdtYSBwZWRhbnRpYworI3ByYWdtYSByYW5nZV9jaGVjaworCisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPGNvbW1hbmRzLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8cGxheWVyL2Jhc2UuaD4KKworI2RlZmluZSBSTkFNRSh4KSBjYXBpdGFsaXplKGdldHVpZCh4KSkKKworLyoqIElzdCB2aWN0aW0gaW4gZWluZXIgQXJlbmEgb2RlciBTY2hhdHRlbndlbHQ/CisgICovCitub21hc2sgaW50IENoZWNrQXJlbmFGaWdodChvYmplY3QgdmljdGltKSB7CisgIHJldHVybiAob2JqZWN0X25hbWUoZW52aXJvbm1lbnQodmljdGltKSlbMC4uMTRdPT0iL2Qvc2NoYXR0ZW53ZWx0Iik7Cit9CisKK25vbWFzayBwcm90ZWN0ZWQgaW50IENoZWNrUGxheWVyQXR0YWNrKG9iamVjdCBhdHRhY2tlciwgb2JqZWN0IHZpY3RpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBhbmdyaWZmc21zZykKK3sKKyAgLy8gZmFsbHMgbWFsIGplbWFuZCBuZSBDbG9zdXJlIGF1ZiBkaWVzZSBGdW5rdGlvbiBpbiBkaWUgRmluZ2VyIGJla29tbXQgdW5kCisgIC8vIHByb3RlY3RlZCB1bWdlaHQuCisgIGlmIChleHRlcm5fY2FsbCgpKQorICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiRXh0ZXJuIENhbGwgdG8gQ2hlY2tQbGF5ZXJBdHRhY2sgaW4gJU8hXG4iLE1FKSk7CisKKyAgLy8gbnVyIFNwaWVsZXIgc2luZCBpbnRlcmVzc2FudC4KKyAgaWYgKCBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKGF0dGFja2VyKSAmJiBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHZpY3RpbSkKKyAgICAgICYmICEoIElTX0xFQVJORVIoYXR0YWNrZXIpICYmIElTX0xFQVJORVIodmljdGltKSApICkgeworICAgIHN0cmluZyBmaWxlbWVzc2FnZSwgd2l6c2hvdXQ7CisgICAgaW50IGFyZW5hOworCisgICAgLy8gQXJlbmEtIG9kZXIgU2NoYXR0ZW53ZWx0a2FtcGY/CisgICAgYXJlbmE9Q2hlY2tBcmVuYUZpZ2h0KGF0dGFja2VyKTsKKworICAgIHdpenNob3V0ID0gc3ByaW50ZigiXG4qKioqICVzIGdyZWlmdCAlcyBhbi4gKCVzKSAqKipcbiIsCisgICAgICAgIFJOQU1FKGF0dGFja2VyKSwgUk5BTUUodmljdGltKSwgb2JqZWN0X25hbWUoTUUpKTsKKyAgICBmaWxlbWVzc2FnZSA9IHNwcmludGYoIlxuWyVzXSAlcyBncmVpZnQgJXMgYW4uICglcykgJXMgJXNcbiIsCisgICAgICAgIHN0cmZ0aW1lKCIlZCVtJXktJUg6JU06JVMiLHRpbWUoKSksIFJOQU1FKGF0dGFja2VyKSwKKyAgICAgICAgUk5BTUUodmljdGltKSwgb2JqZWN0X25hbWUodGhpc19vYmplY3QoKSksCisgICAgICAgIChhcmVuYSA/ICIoQVJFTkEpIiA6ICIiKSwKKyAgICAgICAgKHZpY3RpbS0+UXVlcnlQcm9wKFBfVEVTVFBMQVlFUikgPyAiKFRlc3RzcGllbGVyKSIgOiAiIikpOworCisgICAgLy8gQW5ncmlmZnNtc2cgdm9tIEF1ZnJ1ZmVyIGFuaGFlbmdlbi4KKyAgICBpZiAoc3RyaW5ncChhbmdyaWZmc21zZykgJiYgc2l6ZW9mKGFuZ3JpZmZzbXNnKSkgeworICAgICAgd2l6c2hvdXQgKz0gYW5ncmlmZnNtc2c7CisgICAgICBmaWxlbWVzc2FnZSArPSBhbmdyaWZmc21zZzsKKyAgICB9CisgICAgLy8gZ2dmLiBlY2h0ZW4gVEkgYW5oYWVuZ2VuIG9kZXIgd2FybmVuLCBmYWxscyBrZWluZXIgZXhpc3RpZXJ0LgorICAgIGlmICggdGhpc19pbnRlcmFjdGl2ZSgpICE9IGF0dGFja2VyICkgeworICAgICAgICBpZiAoIHRoaXNfaW50ZXJhY3RpdmUoKSApIHsKKyAgICAgICAgICB3aXpzaG91dCArPSAiQUNIVFVORzogVEkgPSAiICsgZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSkKKyAgICAgICAgICAgICsiXG4iOworICAgICAgICAgIGZpbGVtZXNzYWdlICs9ICJBQ0hUVU5HOiBUSSA9ICIrZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSkKKyAgICAgICAgICAgICsiXG4iOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZmlsZW1lc3NhZ2UgKz0gIiBBQ0hUVU5HOiBLZWluIFRJIHZvcmhhbmRlbiFcbiI7CisgICAgICAgICAgICB3aXpzaG91dCArPSAiIEFDSFRVTkc6IEtlaW4gVEkgdm9yaGFuZGVuIVxuIjsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBjYWxsZXJfc3RhY2soKSBtaXRsb2dnZW4gKGFiZXIgbmljaHQgTWFnaWVyIHZvbGxzY3JvbGxlbikuCisgICAgZmlsZW1lc3NhZ2UgKz0gIkNhbGxlcnN0YWNrOiAiICsgQ291bnRVcChtYXAoY2FsbGVyX3N0YWNrKDEpLAorICAgICAgICAgIGZ1bmN0aW9uIHN0cmluZyAob2JqZWN0IHBvKSB7cmV0dXJuIHRvX3N0cmluZyhwbyk7fSksCisgICAgICAgICIsICIsICIsICIpICsgIlxuIjsKKyAgICAvLyBDb21tYW5kc3RhY2sgYW5oYWVuZ2VuCisgICAgbWl4ZWQgY3N0YWNrID0gY29tbWFuZF9zdGFjaygpOworICAgIGZpbGVtZXNzYWdlICs9ICJDb21tYW5kc3RhY2s6ICIgKyBDb3VudFVwKG1hcChjc3RhY2ssCisgICAgICAgICAgZnVuY3Rpb24gc3RyaW5nIChtaXhlZCBhcnIpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIHNwcmludGYoIih7T3JpZ2luYWwtVFA6ICVPLCBUUDogJU8sIEtvbW1hbmRvOiAlc30pIiwKKyAgICAgICAgICAgICAgICBhcnJbQ01EX09SSUdJTl0sYXJyW0NNRF9QTEFZRVJdLGFycltDTURfVEVYVF0gfHwgIiIpOworICAgICAgICAgIH0sIiwgIiwiLCAiKSkgKyAiXG4iOworICAgIC8vIGZ1ZXIgTWFnaWVyIG9yaWdpbmFlcmVuIEJlZmVobCBhbmhhZW5nZW46CisgICAgaWYgKHNpemVvZihjc3RhY2spKQorICAgICAgd2l6c2hvdXQgKz0gc3ByaW50ZigiS29tbWFuZG86ICVzXG4iLAorICAgICAgICAgIGNzdGFja1swXVtDTURfVEVYVF0gfHwgIjx1bmJla2FubnQ+Iik7CisKKyAgICB3aXpzaG91dCArPSAiXG4iOworCisgICAgLy8gZXJzdG1hbCBsb2dnZW4KKyAgICBpZiAoIGFyZW5hICkKKyAgICAgICAgbG9nX2ZpbGUoIkFUVEFDS1NfQVJFTkEiLCBmaWxlbWVzc2FnZSk7CisgICAgZWxzZSAKKyAgICAgICAgbG9nX2ZpbGUoIkFUVEFDS1MiLCBmaWxlbWVzc2FnZSk7CisKKyAgICAvLyBkYW5uIE1hZ2llcm4gYmVzY2hlaWRnZWJlbgorICAgIGlmICggIWFyZW5hICYmICEodmljdGltLT5RdWVyeVByb3AoUF9URVNUUExBWUVSKSkgKSB7CisgICAgICBmb3JlYWNoKG9iamVjdCB3aXo6IHVzZXJzKCkpIHsKKyAgICAgICAgaWYgKCBJU19MT1JEKHdpeikgfHwgSVNfREVQVVRZKHdpeikgKQorICAgICAgICAgIHRlbGxfb2JqZWN0KHdpeiwgd2l6c2hvdXQpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMTsgLy8gU3BpZWxlci1TcGllbGVya2FtcGYKKyAgfQorICByZXR1cm4gMDsgLy8ga2VpbiBTcGllbGVyLVNwaWVsZXJrYW1wZgorfQorCmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL3BvdGlvbi5jIGIvc3RkL3BsYXllci9wb3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2Q4Y2FhCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9wb3Rpb24uYwpAQCAtMCwwICsxLDI1MiBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHBsYXllci9wb3Rpb24uYyAtLSBwb3Rpb24gaGFuZGxpbmcgZm9yIHBsYXllcgorLy8KKy8vICRJZDogcG90aW9uLmMgOTI4MCAyMDE1LTA4LTE1IDIyOjIwOjM2WiBBcmF0aG9ybiAkCisvLworCisjcHJhZ21hIHN0cm9uZ190eXBlcyxzYXZlX3R5cGVzCisKKyNpbmNsdWRlIDxpbnB1dF90by5oPgorCisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPHRoaW5nL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxwbGF5ZXIvcG90aW9uLmg+CisjaW5jbHVkZSA8YXR0cmlidXRlcy5oPgorI2luY2x1ZGUgPGxpdmluZy9saWZlLmg+CisjaW5jbHVkZSA8cGxheWVyL2Jhc2UuaD4KKyN1bmRlZiBORUVEX1BST1RPVFlQRVMKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisKKyNkZWZpbmUgUE9USU9OTUFTVEVSICIvc2VjdXJlL3BvdGlvbm1hc3RlciIKKworc3RhdGljIG1peGVkICpsaXN0OworCittaXhlZCAqcG90aW9ucm9vbXM7CittaXhlZCAqa25vd25fcG90aW9ucm9vbXM7CisKK3N0YXRpYyBtaXhlZCBfcXVlcnlfcG90aW9ucm9vbXMoKTsKK3N0YXRpYyBtaXhlZCBfcXVlcnlfa25vd25fcG90aW9ucm9vbXMoKTsKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgaWYgKCFwb3Rpb25yb29tcykgcG90aW9ucm9vbXMgPSBQT1RJT05NQVNURVItPkluaXRpYWxMaXN0KCk7CisgIFNldChQX1BPVElPTlJPT01TLCBOT1NFVE1FVEhPRCwgRl9TRVRfTUVUSE9EKTsgIC8vIG5vIHRhbXBlcmluZyBieSBtZXRob2RzCisgIFNldChQX1BPVElPTlJPT01TLCBTRUNVUkVELCBGX01PREVfQVMpOyAgICAgICAgIC8vIG5vIHRhbXBlcmluZyB3aXRoIGxpc3QKKworICBpZiAoIWtub3duX3BvdGlvbnJvb21zKSBrbm93bl9wb3Rpb25yb29tcyA9ICh7fSk7CisgIFNldChQX0tOT1dOX1BPVElPTlJPT01TLCBOT1NFVE1FVEhPRCwgRl9TRVRfTUVUSE9EKTsKKyAgU2V0KFBfS05PV05fUE9USU9OUk9PTVMsIFNFQ1VSRUQsIEZfTU9ERV9BUyk7Cit9CisKK3N0YXRpYyBpbnQgUmVwb3J0UG90aW9uKHN0cmluZyBzLCBpbnQgcG51bSk7CitzdGF0aWMgaW50IFNlbGVjdFdoaWNoKGludCBwbnVtKTsKK3N0YXRpYyBpbnQgYXNrX3F1ZXN0aW9uKGludCBwbnVtKTsKK3N0YXRpYyBpbnQgZ2V0X2Fuc3dlcihzdHJpbmcgZXJnLCBpbnQgcG51bSk7CitzdGF0aWMgaW50IHJhaXNlKHN0cmluZyB3aGF0LCBpbnQgcG51bSk7CitpbnQgQWRkS25vd25Qb3Rpb24oaW50IG5yKTsKK2ludCBSZW1vdmVLbm93blBvdGlvbihpbnQgbnIpOworCitwcm90ZWN0ZWQgdm9pZCB1cGRhdGVzX2FmdGVyX3Jlc3RvcmUoaW50IG5ld2ZsYWcpCit7CisgIC8vIFBfVklTSVRFRF9QT1RJT05ST09NUyBpc3QgbGFuZyB2ZXJhbHRldCB1bmQgdW5iZW51dHp0LCBhYmVyIGJpcyB6dW0KKyAgLy8gMjEuMS4yMDE1IHNvZ2FyIGluIG5ldWVuIFNwaWVsZXJuIGdlc3BlaWNoZXJ0IHdvcmRlbi4KKyAgLy8gQWVobmxpY2ggZnVlciBQX0JPTlVTX1BPVElPTlMuIFdlZyBkYW1pdC4KKyAgU2V0KFBfVklTSVRFRF9QT1RJT05ST09NUywgU0FWRXxQUk9URUNURUQsIEZfTU9ERV9BRCk7CisgIFNldChQX0JPTlVTX1BPVElPTlMsIFNBVkV8UFJPVEVDVEVELCBGX01PREVfQUQpOworfQorCit2YXJhcmdzIGludCBGaW5kUG90aW9uKHN0cmluZyBzKQoreworICBvYmplY3QgcG8gPSBwcmV2aW91c19vYmplY3QoKTsKKyAgaW50IHBudW0gPSBQT1RJT05NQVNURVItPkhhc1BvdGlvbihwbyk7CisgIGludCBmbGFnID0gMTsKKworICBpZiAoIFF1ZXJ5UHJvcChQX1RSQU5LX0ZJTkRFTikgJiYgSVNfV0laQVJEKE1FKSApCisgIHsKKyAgICByZXR1cm4gUmVwb3J0UG90aW9uKHMsIHBudW0pOworICB9CisKKyAgaWYgKCBRdWVyeVByb3AoUF9LSUxMUykgKQorICAgIHJldHVybiAwOworCisgIGlmICggIXBvdGlvbnJvb21zIHx8ICFzaXplb2YocG90aW9ucm9vbXMpIHx8CisgICAgICAgIShQT1RJT05NQVNURVItPkluTGlzdChwbywgcG90aW9ucm9vbXMsIGtub3duX3BvdGlvbnJvb21zKSkgKQorICAgIGZsYWc9MDsKKworICBpZiAoIHBudW0gPCAwIHx8ICFmbGFnICkKKyAgICByZXR1cm4gMDsKKworICBpZiAoIHF1ZXJ5X2lucHV0X3BlbmRpbmcoTUUpIHx8IHF1ZXJ5X2VkaXRpbmcoTUUpICkKKyAgeworICAgIHRlbGxfb2JqZWN0KE1FLAorICAgICAgIkpldHp0IGhhZXR0ZXN0IER1IGZhc3QgZWluZW4gWmF1YmVydHJhbmsgZ2VmdW5kZW4uIER1IHNvbGx0ZXN0IGRlblxuIgorICAgICAgIkVkaXRvci9kYXMgTW9yZSB2ZXJsYXNzZW4gdW5kIGVzIGRhbm4gbm9jaCBlaW5tYWwgdmVyc3VjaGVuIVxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKworICAvLyBIaWVyIGRlciBBdXNiYXUgZGVyIFpUcyBmdWVyIEdlaXN0ZXIsIHdvYmVpIGRhcyBuYXR1ZXJsaWNoIGluIGRlcgorICAvLyBHZWlzdGVyc2NobG9zc3F1ZXN0IGltbWVyIG5vY2ggZ2VoZW4gc29sbHRlLgorICBvYmplY3QgZW52ID0gZW52aXJvbm1lbnQoTUUpOworICBzdHJpbmcgZm4gPSBvbGRfZXhwbG9kZShvYmplY3RfbmFtZShlbnYpLCAiIyIpWzBdOworICBpZiAoIFF1ZXJ5UHJvcChQX0dIT1NUKSAmJiBmblswLi4yNF0gIT0gIi9kL3dhbGQvYmVydHJhbS9nc2NobG9zcy8iICkKKyAgeworICAgIHRlbGxfb2JqZWN0KE1FLCJBbHMgR2Vpc3QgZWluZW4gWmF1YmVydHJhbms/IEhpZXIgbmljaHQhXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBsb2dfZmlsZSgiQVJDSC9QT1RJT05TIiwgc3ByaW50ZigiJXMgICVzIGluICVzXG4iLCBkdGltZSh0aW1lKCkpLAorICAgIGNhcGl0YWxpemUoZ2V0dWlkKCkpLCBvYmplY3RfbmFtZShwbykpKTsKKworICByZXR1cm4gUmVwb3J0UG90aW9uKHMsIHBudW0pOworfQorCitzdGF0aWMgaW50IFJlcG9ydFBvdGlvbihzdHJpbmcgcywgaW50IHBudW0pCit7CisgIGlmIChzdHJpbmdwKHMpICYmIHNpemVvZihzKSkKKyAgICB0ZWxsX29iamVjdChNRSwgcyk7CisgIGVsc2UKKyAgICB0ZWxsX29iamVjdChNRSwgIkR1IGZpbmRlc3QgZWluZW4gWmF1YmVydHJhbmssIGRlbiBEdSBzb2ZvcnQgdHJpbmtzdC5cbiIpOworCisgIFNlbGVjdFdoaWNoKHBudW0pOworCisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IFNlbGVjdFdoaWNoKGludCBwbnVtKQoreworICBsaXN0PSh7IkludGVsbGlnZW56IiwiS3JhZnQiLCJHZXNjaGlja2xpY2hrZWl0IiwiQXVzZGF1ZXIifSk7CisgIGlmIChRdWVyeVJlYWxBdHRyaWJ1dGUoQV9JTlQpPj0yMCkgbGlzdC09KHsiSW50ZWxsaWdlbnoifSk7CisgIGlmIChRdWVyeVJlYWxBdHRyaWJ1dGUoQV9TVFIpPj0yMCkgbGlzdC09KHsiS3JhZnQifSk7CisgIGlmIChRdWVyeVJlYWxBdHRyaWJ1dGUoQV9ERVgpPj0yMCkgbGlzdC09KHsiR2VzY2hpY2tsaWNoa2VpdCJ9KTsKKyAgaWYgKFF1ZXJ5UmVhbEF0dHJpYnV0ZShBX0NPTik+PTIwKSBsaXN0LT0oeyJBdXNkYXVlciJ9KTsKKyAgaWYgKCFzaXplb2YobGlzdCkpIHsKKyAgICBoZWFsX3NlbGYoMTAwMDAwMDApOworICAgIHRlbGxfb2JqZWN0KE1FLCAiRGVyIFRyYW5rIGhhdCBEaWNoIGdlaGVpbHQuXG4iKTsKKyAgICBsb2dfZmlsZSgiQVJDSC9QT1RJT05TIiwKKyAgICAgICBzcHJpbnRmKCIgICVzOiBIZWlsdHJhbmsgKG5vY2ggJWQpXG4iLAorICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoKSksIHNpemVvZihwb3Rpb25yb29tcyktMSkpOworCisgICAgcG90aW9ucm9vbXMgLT0gKHtwbnVtfSk7CisgICAga25vd25fcG90aW9ucm9vbXMgLT0gKHtwbnVtfSk7CisgICAgc2F2ZV9tZSgxKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoIHNpemVvZihsaXN0KT09MSApCisgICAgcmV0dXJuIHJhaXNlKGxpc3RbMF0sIHBudW0pOworICBhc2tfcXVlc3Rpb24ocG51bSk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGFza19xdWVzdGlvbihpbnQgcG51bSkKK3sKKyAgaW50IGk7CisKKyAgdGVsbF9vYmplY3QoTUUsICJEZWluZSBBdHRyaWJ1dGUgc2VoZW4gc28gYXVzOlxuXG4iCisgICAgK3NwcmludGYoIkludGVsbGlnZW56ICAgICA6ICUyZCAoJStkKVxuIiwKKyAgICAgICAgIFF1ZXJ5UmVhbEF0dHJpYnV0ZShBX0lOVCksUXVlcnlBdHRyaWJ1dGVPZmZzZXQoQV9JTlQpKQorICAgICtzcHJpbnRmKCJLcmFmdCAgICAgICAgICAgOiAlMmQgKCUrZClcbiIsCisgICAgICAgICBRdWVyeVJlYWxBdHRyaWJ1dGUoQV9TVFIpLFF1ZXJ5QXR0cmlidXRlT2Zmc2V0KEFfU1RSKSkKKyAgICArc3ByaW50ZigiR2VzY2hpY2tsaWNoa2VpdDogJTJkICglK2QpXG4iLAorICAgICAgICAgUXVlcnlSZWFsQXR0cmlidXRlKEFfREVYKSxRdWVyeUF0dHJpYnV0ZU9mZnNldChBX0RFWCkpCisgICAgK3NwcmludGYoIkF1c2RhdWVyICAgICAgICA6ICUyZCAoJStkKVxuIiwKKyAgICAgICAgIFF1ZXJ5UmVhbEF0dHJpYnV0ZShBX0NPTiksUXVlcnlBdHRyaWJ1dGVPZmZzZXQoQV9DT04pKQorICAgICk7CisKKyAgdGVsbF9vYmplY3QoTUUsCisgICAgIlxuV2FzIG1vZWNodGVzdCBEdSBlcmhvZWhlbj8gRHUgaGFzdCBmb2xnZW5kZSBNb2VnbGljaGtlaXRlbjpcbiIpOworICBmb3IgKGk9MDsgaTxzaXplb2YobGlzdCk7IGkrKykKKyAgICB0ZWxsX29iamVjdChNRSwgc3ByaW50ZigiJWQpICVzXG4iLCBpKzEsIGxpc3RbaV0pKTsKKworICBpbnB1dF90bygiZ2V0X2Fuc3dlciIsIElOUFVUX1BST01QVCwKKyAgICBzcHJpbnRmKCJcbkJpdHRlIGdpYiBqZXR6dCBlaW5lIFphaGwgKDEtJWQpIGFuOiAiLCBpKSwgcG51bSk7CisKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2Fuc3dlcihzdHJpbmcgZXJnLCBpbnQgcG51bSkKK3sKKyAgaW50IG51bSA9IHRvX2ludChlcmcpOworCisgIGlmICggbnVtID4gMCAmJiBudW0gPD0gc2l6ZW9mKGxpc3QpICkKKyAgICByZXR1cm4gcmFpc2UobGlzdFtudW0tMV0sIHBudW0pOworCisgIHRlbGxfb2JqZWN0KE1FLCAiRGVpbmUgV2FobCB3YXIgdW5ndWVsdGlnLiBCaXR0ZSB2ZXJzdWNoJ3Mgbm9jaG1hbCFcblxuIik7CisgIHJldHVybiBhc2tfcXVlc3Rpb24ocG51bSk7Cit9CisKK3N0YXRpYyBpbnQgcmFpc2Uoc3RyaW5nIHdoYXQsIGludCBwbnVtKSB7CisgIHN0cmluZyBhdHRyOworCisgIHN3aXRjaCAod2hhdCkKKyAgeworICAgIGNhc2UgIkdlc2NoaWNrbGljaGtlaXQiOiBhdHRyPUFfREVYOyBicmVhazsKKyAgICBjYXNlICJJbnRlbGxpZ2VueiI6ICAgICAgYXR0cj1BX0lOVDsgYnJlYWs7CisgICAgY2FzZSAiS3JhZnQiOiAgICAgICAgICAgIGF0dHI9QV9TVFI7IGJyZWFrOworICAgIGNhc2UgIkF1c2RhdWVyIjogICAgICAgICBhdHRyPUFfQ09OOyBicmVhazsKKyAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgIH0KKworICBpbnQgeWV0PVF1ZXJ5UmVhbEF0dHJpYnV0ZShhdHRyKTsKKyAgU2V0UmVhbEF0dHJpYnV0ZShhdHRyLCB5ZXQrMSk7CisgIHRlbGxfb2JqZWN0KE1FLAorICAgIHNwcmludGYoIkRlaW5lICVzIGhhdCBzaWNoIHZvbiAlZCBhdWYgJWQgZXJob2VodC5cbiIsIHdoYXQsIHlldCwgeWV0KzEpKTsKKyAgbG9nX2ZpbGUoIkFSQ0gvUE9USU9OUyIsCisgICAgIHNwcmludGYoIiAgJXM6ICVzICVkLT4lZCAobm9jaCAlZClcbiIsCisgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoKSksIGNhcGl0YWxpemUoYXR0ciksCisgICAgICAgeWV0LCB5ZXQrMSwgc2l6ZW9mKHBvdGlvbnJvb21zKS0xKSk7CisKKyAgLy8gV2VubiBkaWUgUHJvcGVydHkgZ2VzZXR6dCBpc3QsIHdpcmQgbmljaHQgdmVyc3VjaHQsIGRlbiBnZWZ1bmRlbmVuIFRyYW5rCisgIC8vIGF1cyBkZXIgWlQtTGlzdGUgZGVzIE1hZ2llcnMgYXVzenV0cmFnZW4uIERlciBOZWJlbmVmZmVrdCwgZGFzcworICAvLyBleGlzdGllcmVuZGUsIGFuZ2VzY2hsb3NzZW5lIFpUcyBhdWNoIG5pY2h0IG1laHIgYXVzIGRlciBaVC1MaXN0ZSB2b24KKyAgLy8gdGVzdGVuZGVuIE1hZ2llcm4gYXVzZ2V0cmFnZW4gd2VyZGVuLCB3aXJkIGRhYmVpIGluIEthdWYgZ2Vub21tZW4uCisgIGlmICggIVF1ZXJ5UHJvcChQX1RSQU5LX0ZJTkRFTikgKQorICB7CisgICAgcG90aW9ucm9vbXMgICAgICAgLT0gKHsgcG51bSB9KTsKKyAgICBrbm93bl9wb3Rpb25yb29tcyAtPSAoeyBwbnVtIH0pOworICAgIHNhdmVfbWUoMSk7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBtaXhlZCBfcXVlcnlfcG90aW9ucm9vbXMoKQoreworICByZXR1cm4gY29weShTZXQoUF9QT1RJT05ST09NUywgcG90aW9ucm9vbXMpKTsKK30KKworc3RhdGljIG1peGVkIF9xdWVyeV9rbm93bl9wb3Rpb25yb29tcygpCit7CisgIHJldHVybiBjb3B5KFNldChQX0tOT1dOX1BPVElPTlJPT01TLCBrbm93bl9wb3Rpb25yb29tcykpOworfQorCitpbnQgQWRkS25vd25Qb3Rpb24oaW50IG5yKQoreworICBpZiAoIXByZXZpb3VzX29iamVjdCgpIHx8CisgICAgICBvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSkgIT0gIi9yb29tL29yYWtlbCIpCisgICAgcmV0dXJuIC0xOyAvLyBLZWluZSBCZXJlY2h0aWd1bmcKKworICBpZiAobWVtYmVyKGtub3duX3BvdGlvbnJvb21zLCBucikgIT0gLTEpCisgICAgcmV0dXJuIC0yOyAvLyBOdW1tZXIgYmVyZWl0cyBlaW5nZXRyYWdlbgorICBlbHNlCisgIHsKKyAgICBrbm93bl9wb3Rpb25yb29tcyArPSAoeyBuciB9KTsKKyAgICByZXR1cm4gMTsKKyAgfQorfQorCitpbnQgUmVtb3ZlS25vd25Qb3Rpb24oaW50IG5yKQoreworICBpZiAoIXByZXZpb3VzX29iamVjdCgpIHx8CisgICAgICBvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSkgIT0gIi9yb29tL29yYWtlbCIpCisgICAgcmV0dXJuIC0xOyAvLyBLZWluZSBCZXJlY2h0aWd1bmcKKworICBpZiAobWVtYmVyKGtub3duX3BvdGlvbnJvb21zLCBucikgPT0gLTEpCisgICAgcmV0dXJuIC0yOyAvLyBOdW1tZXIgbmljaHQgZWluZ2V0cmFnZW4KKyAgZWxzZQorICB7CisgICAga25vd25fcG90aW9ucm9vbXMgLT0gKHsgbnIgfSk7CisgICAgcmV0dXJuIDE7CisgIH0KK30KZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvcHJvdG9jb2xzL2dtY3AuYyBiL3N0ZC9wbGF5ZXIvcHJvdG9jb2xzL2dtY3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTUxZGFhCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9wcm90b2NvbHMvZ21jcC5jCkBAIC0wLDAgKzEsNzg1IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gZ21jcC5jIC0tIFZlcndhbHR1bmcgdm9uIEdNQ1AgaW0gU3BpZWxlcm9iamVrdAorLy8KKy8vICRJZCQKKworI3ByYWdtYSBzdHJvbmdfdHlwZXMsc2F2ZV90eXBlcworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBub19zaGFkb3cKKyNwcmFnbWEgcGVkYW50aWMKKworI2luY2x1ZGUgPHJlZ2V4cC5oPgorI2luY2x1ZGUgPHRlbG5ldC5oPgorCisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPHBsYXllci9iYXNlLmg+CisjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxpdmluZy9hdHRyaWJ1dGVzLmg+CisjaW5jbHVkZSA8cGxheWVyL2dtY3AuaD4KKyNpbmNsdWRlIDx0aGluZy9kZXNjcmlwdGlvbi5oPgorI2luY2x1ZGUgPGxpdmluZy9kZXNjcmlwdGlvbi5oPgorI3VuZGVmIE5FRURfUFJPVE9UWVBFUworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG5ld19za2lsbHMuaD4KKyNpbmNsdWRlIDxyb29tcy5oPgorI2luY2x1ZGUgPHRscy5oPgorCitpbmhlcml0ICIvc2VjdXJlL3RlbG5ldG5lZy1zdHJ1Y3RzLmMiOworCitzdHJ1Y3QgZ21jcF9tb2RfcyB7CisgIHN0cmluZyBpZDsgICAgICAgIC8vIE5hbWUgZGVzIEdNQ1AtTW9kdWxzICh6LkIuICJNRy5DaGFyIikKKyAgaW50IHZlcnNpb247ICAgICAgLy8gVmVyc2lvbiBkZXMgYWt0aXZpZXJ0ZW4gbW9kdWxzCisgIGNsb3N1cmUgc2VuZGNsOyAgIC8vIEhhbmRsZXIgenVtIFNlbmRlbiAobGZ1bi1jbG9zdXJlKQorICBjbG9zdXJlIHJlY3ZjbDsgICAvLyBIYW5kbGVyIHp1bSBFbXBmYW5nZW4gKGxmdW5jLWNsb3N1cmUpCisgIG1peGVkIGRhdGE7ICAgICAgIC8vIG9wdGlvbmFsIGRhdGEgb2YgdGhlIG1vZHVsZQorfTsKKworbm9zYXZlIG1hcHBpbmcgZ21jcGRhdGE7CisvKiBTdHJ1a3R1cjoKKyAgIEplZGVzIE1vZHVsIGhhdCBlaW5lbiBTY2hsdWVzc2VsIGltIFRvcGxldmVsLCB3b3J1bnRlciBnZ2YuIHNlaW5lIERhdGVuCisgICBhYmdlbGVndCBzaW5kLiBEaWUgRGF0ZW4gc2luZCBlaW5lIHN0cnVjdCBnbWNwX21vZF9zLiBEZXIgU2NobHVlc3NlbCBpc3QKKyAgIGRlciBNb2R1bG5hbWUgT0hORSBWZXJzaW9uLgorICAgKi8KKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSAiL3NlY3VyZS90ZWxuZXRuZWcuaCIKKyN1bmRlZiBORUVEX1BST1RPVFlQRVMKKworLy8jZGVmaW5lIF9fR01DUF9ERUJVR19fIDEKKy8vIExvdyBwcmlvcml0eSBkZWJ1ZyBtZXNzYWdlcworI2RlZmluZSBHTUNQX0RFQlVHKHByZSxtc2cscHJpbykgaWYgKGludGVyYWN0aXZlKHRoaXNfb2JqZWN0KCkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBnbWNwZGF0YSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBHTUNQX2RlYnVnKHByZSxtc2cscHJpbyk7CisvLyBoaWdoZXIgcHJpb3JpdHkgZXJyb3IgbWVzc2FnZXMKKyNkZWZpbmUgR01DUEVSUk9SKG1zZykgaWYgKGludGVyYWN0aXZlKHRoaXNfb2JqZWN0KCkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgJiYgZ21jcGRhdGEpIFwKKyAgICAgICAgICAgICAgICAgICAgIEdNQ1BfZGVidWcoIkVSUk9SIixtc2csMTApOworCisKKy8vICoqKioqKioqKioqKioqKiogQVBJIG5hY2ggQXVzc2VuIGZvbGd0IGFiIGhpZXIgKioqKioqKioqKioqKioqKioqKioKKworLy8gV2lyZCB2b20gU3BpZWxlcm9iamVrdCBnZXJ1ZmVuLCB3ZW5uIHNpY2ggRGF0ZW4gYW0gQ2hhcmFrdGVyIHZlcmFlbmRlcnQKKy8vIGhhYmVuLCBkaWUgZ2VzZW5kZXQgd2VyZGVuIHNvbGx0ZW4uCisvLyBEaWVzIGlzdCBlaWdlbnRsaWNoIG51ciBlaW4gV3JhcHBlciwgZGVyIGRpZSBEYXRlbiBhbiBkZW4gSGFuZGxlciBlaW5lcworLy8gTW9kdWxzIHdlaXRlcmdpYnQsIHdlbGNoZXMgdm9tIENsaWVudCBha3RpdmllcnQgd3VyZGUuIEhpZXJ6dSBrb21tZW4genVyCisvLyBaZWl0IDIgaW4gRnJhZ2U6IE1HLkNoYXIgKGJldm9yenVndCkgdW5kIENoYXIgKG1pbmltYWxlciBTdXBwb3J0KS4KKy8qcHJvdGVjdGVkKi8gaW50IEdNQ1BfQ2hhcihtYXBwaW5nIGRhdGEpIHsKKworICBpZiAoIW1hcHBpbmdwKGdtY3BkYXRhKSkgcmV0dXJuIDA7CisKKyAgLy8gQWxzIGVyc3RlcyBzY2hhdWVuLCBvYiBkZXIgQ2xpZW50IE1HLkNoYXIgYWt0aXZpZXJ0IGhhdC4KKyAgc3RydWN0IGdtY3BfbW9kX3MgbW9kID0gZ21jcGRhdGFbIk1HLmNoYXIiXTsKKyAgaWYgKHN0cnVjdHAobW9kKSAmJiBjbG9zdXJlcChtb2QtPnNlbmRjbCkpCisgIHsKKyAgICBmdW5jYWxsKG1vZC0+c2VuZGNsLCBkYXRhKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICAvLyBEYW5uIG5vY2ggZGFzIE1vZHVsIGNoYXIgcHJ1ZWZlbi4gRGFzIGlzdCBhYmVyIHppZW1saWNoIGVpbmdlc2NocmFlbmt0CisgIC8vIHVuZCBlcyBnaWJ0IGhvZmZlbnRsaWNoIG5pY2h0IHZpZWxlIENsaWVudHMsIGRpZSBlcyBiZW51dHplbi4KKyAgLy8gKEFhcmR3b2xmLU1vZHVsKQorICBtb2QgPSBnbWNwZGF0YVsiY2hhciJdOworICBpZiAoc3RydWN0cChtb2QpICYmIGNsb3N1cmVwKG1vZC0+c2VuZGNsKSkKKyAgeworICAgIGZ1bmNhbGwobW9kLT5zZW5kY2wsIGRhdGEpOworICAgIHJldHVybiAxOworICB9CisgIC8vIERhbm4gbm9jaCBkYXMgTW9kdWwgQ2hhciBwcnVlZmVuLiBEYXMgaXN0IGFiZXIgemllbWxpY2ggZWluZ2VzY2hyYWVua3QKKyAgLy8gdW5kIGVzIGdpYnQgaG9mZmVudGxpY2ggbmljaHQgdmllbGUgQ2xpZW50cywgZGllIGVzIGJlbnV0emVuLgorICAvLyAoSVJFLU1vZHVsKQorICBtb2QgPSBnbWNwZGF0YVsiQ2hhciJdOworICBpZiAoc3RydWN0cChtb2QpICYmIGNsb3N1cmVwKG1vZC0+c2VuZGNsKSkKKyAgeworICAgIGZ1bmNhbGwobW9kLT5zZW5kY2wsIGRhdGEpOworICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQorCisvKnByb3RlY3RlZCovIGludCBHTUNQX0NoYW5uZWwoc3RyaW5nIG1zZywgc3RyaW5nIGNoYW5uZWwsIHN0cmluZyBzZW5kZXIpIHsKKyAgaWYgKCFtYXBwaW5ncChnbWNwZGF0YSkpIHJldHVybiAwOworICAvLyBjb21tLmNoYW5uZWwgTW9kdWwgYWt0aXY/CisgIHN0cnVjdCBnbWNwX21vZF9zIG1vZCA9IGdtY3BkYXRhWyJjb21tLmNoYW5uZWwiXTsKKyAgaWYgKHN0cnVjdHAobW9kKSAmJiBjbG9zdXJlcChtb2QtPnNlbmRjbCkpCisgIHsKKyAgICBmdW5jYWxsKG1vZC0+c2VuZGNsLCAoWyJjaGFuIjpjaGFubmVsLCAicGxheWVyIjogc2VuZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1zZyI6IG1zZ10pICk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qcHJvdGVjdGVkKi8gaW50IEdNQ1BfUm9vbSgpIHsKKyAgaWYgKCFtYXBwaW5ncChnbWNwZGF0YSkpIHJldHVybiAwOworICAvLyBNRy5yb29tIE1vZHVsIGFrdGl2PworICBzdHJ1Y3QgZ21jcF9tb2RfcyBtb2QgPSBnbWNwZGF0YVsiTUcucm9vbSJdOworICBpZiAoc3RydWN0cChtb2QpICYmIGNsb3N1cmVwKG1vZC0+c2VuZGNsKSkKKyAgeworICAgIGZ1bmNhbGwobW9kLT5zZW5kY2wsIDApOworICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQorCisvLyAqKioqKioqKioqKioqKioqIEFiIGhpZXIgZm9sZ2VuIGVoZXIgZGllIExvd2xldmVsLURpbmdlICoqKioqKioqKioqCitwcml2YXRlIHZvaWQgR01DUF9kZWJ1ZyhzdHJpbmcgcHJlLCBzdHJpbmcgbXNnLCBpbnQgcHJpbykgeworICBzdHJ1Y3QgZ21jcF9tb2RfcyBtb2QgPSBnbWNwZGF0YVsiQ29yZSJdOworICBpZiAobW9kICYmIChtb2QtPmRhdGEpWyJEZWJ1ZyJdID49IHByaW8pCisgICAgdGVsbF9vYmplY3QodGhpc19vYmplY3QoKSwgc3ByaW50ZigiR01DUCAlczogJXNcbiIscHJlLG1zZykpOworfQorCitwcml2YXRlIHZvaWQgR01DUF9zZW5kKHN0cmluZyBjbWQsIG1peGVkIGRhdGEpCit7CisgIEdNQ1BfREVCVUcoIkdNQ1Bfc2VuZCIsc3ByaW50ZigiJXMgJU8iLGNtZCxkYXRhKSwgMzApOworICBzZW5kX3RlbG5ldF9uZWdfc3RyKHNwcmludGYoIiVjJWMlcyAlcyIsIFNCLCBURUxPUFRfR01DUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZCwganNvbl9zZXJpYWxpemUoZGF0YSkpLCAxKTsKK30KKworcHJpdmF0ZSB2b2lkIEdNQ1BfdW5yZWdpc3Rlcl9tb2R1bGUoc3RyaW5nIG1vZCkKK3sKKyAgaW50IHZlcnNpb247CisgIC8vIFdlbm4gbmljaHQgIm1vZCB2ZXJzaW9uIiBTY2hlbWEsIGlnbm9yaWVyZW4KKyAgaWYgKHNzY2FuZihtb2QsICIlcyAlZCIsIG1vZCwgdmVyc2lvbikgIT0gMikKKyAgICAgIHJldHVybjsKKworICBpZiAobW9kPT0iQ29yZSIpIC8vIGRhcmYgbmljaHQgYWJnZXNjaGFsdGV0IHdlcmRlbi4KKyAgICAgIHJldHVybjsKKworICBtX2RlbGV0ZShnbWNwZGF0YSwgbW9kKTsKK30KKworcHJpdmF0ZSB2b2lkIEdNQ1BfcmVnaXN0ZXJfbW9kdWxlKHN0cmluZyBtb2RuYW1lKQoreworICBpbnQgdmVyc2lvbjsKKyAgR01DUF9ERUJVRygicmVnaXN0ZXJfbW9kdWxlKCk6IHRyeWluZyAuLi4gIixtb2RuYW1lLCAyMCk7CisgIC8vIFdlbm4gbmljaHQgIm1vZCB2ZXJzaW9uIiBTY2hlbWEsIGlnbm9yaWVyZW4KKyAgaWYgKHNzY2FuZihtb2RuYW1lLCAiJXMgJWQiLCBtb2RuYW1lLCB2ZXJzaW9uKSAhPSAyKQorICAgICAgcmV0dXJuOworCisvLyAgR01DUF9ERUJVRygicmVnaXN0ZXJfbW9kdWxlKCkiLG1vZG5hbWUgKyAiIHYiICsgdmVyc2lvbik7CisKKyAgLy8gTW9kdWwgKGdnZi4gbWl0IGFuZGVyZXIgVmVyc2lvbikgYmVyZWl0cyBha3Rpdj8KKyAgc3RydWN0IGdtY3BfbW9kX3MgbW9kID0gZ21jcGRhdGFbbW9kbmFtZV07CisgIGlmIChzdHJ1Y3RwKG1vZCkpIHsKKyAgICAvLyB3ZW5uIGdsZWljaGVyIE5hbWUgdW5kIFZlcnNpb24sIHdpcmQgbml4IGdlbWFjaHQsIGJlaSBhbmRlcmVyIFZlcnNpb24KKyAgICAvLyB3aXJkIGVpbiBuZXVlciBIYW5kbGVyIGVpbmdldHJhZ2VuIHVuZCBkaWUgRGF0ZW4gZ2Vsb2VzY2h0LgorICAgIC8vIFdlbm4gbmljaHQtZXhpc3RpZXJlbmRlIE1vZHVsL1ZlcnNpb24tS29tYmkgYW5nZWZvcmRlcnQgd2lyZCwgaXN0IGRhcworICAgIC8vIE1vZHVsIGhpbnRlcmhlciBhdXMuCisgICAgaWYgKG1vZC0+aWQgPT0gbW9kbmFtZSAmJiBtb2QtPnZlcnNpb24gPT0gdmVyc2lvbikKKyAgICAgIHJldHVybjsKKyAgICBlbHNlCisgICAgICBtX2RlbGV0ZShnbWNwZGF0YSxtb2RuYW1lKTsKKyAgfQorCisgIC8vIERhcyBHTUNQLU1vZHVsIGlzdCBudXIgdmVyZnVlZ2Jhciwgd2VubiBlcyB6dSBkZXIgS29tYmluYXRpb24gYXVzIG1vZCB1bmQKKyAgLy8gdmVyc2lvbiBlaW5lbiBIYW5kbGVyIHp1bSBTZW5kZW4gZ2lidC4uLgorICAvLyBEZXIgSGFuZGxlciBpc3Q6IEdNQ1BfPG1vZD5fdjx2ZXJzaW9uPl9zZW5kLCBhYmVyIGluIDxtb2Q+IHdlcmRlbiBhbGxlCisgIC8vICIuIiBkdXJjaCAiXyIgZXJzZXR6dC4KKyAgc3RyaW5nIHJlcGxhY2VkbmFtZSA9IHJlZ3JlcGxhY2UobW9kbmFtZSwgIlxcLiIsICJfIiwgUkVfR0xPQkFMKTsKKyAgY2xvc3VyZSBzZW5kY2wgPSBzeW1ib2xfZnVuY3Rpb24oc3ByaW50ZigiR01DUG1vZF8lc192JWRfc2VuZCIsCisgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZWRuYW1lLCB2ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICAgICB0aGlzX29iamVjdCgpKTsKKyAgaWYgKCFzZW5kY2wpCisgICAgcmV0dXJuOworICAvLyBEaWVzZSBDbG9zdXJlIGRhcmYgMCBzZWluLiBEYW5uIGZpbmRldCBrZWluZSBCZWhhbmRsdW5nIHZvbiB2b20gQ2xpZW50CisgIC8vIGdlc2VuZGV0ZW4gS29tbWFuZG9zIHN0YXR0LiBXYXMgZnVlciBkaWUgbWVpc3RlbiBNb2R1bGUgYXVjaCBpbiBPcmRudW5nCisgIC8vIGlzdCwgZGEgc2llIGRlbSBDbGllbnQga2VpbmUgS29tbWFuZG9zIGFuYmlldGVuLgorICBjbG9zdXJlIHJlY3ZjbCA9IHN5bWJvbF9mdW5jdGlvbihzcHJpbnRmKCJHTUNQbW9kXyVzX3YlZF9yZWN2IiwKKyAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlZG5hbWUsIHZlcnNpb24pLAorICAgICAgICAgICAgICAgICAgIHRoaXNfb2JqZWN0KCkpOworCisgIEdNQ1BfREVCVUcoInJlZ2lzdGVyX21vZHVsZSgpIixtb2RuYW1lKyIgZXJmb2xncmVpY2ggcmVnaXN0cmllcnQuIiwxMCk7CisKKyAgbW9kID0gKDxnbWNwX21vZF9zPiBpZDogbW9kbmFtZSwgdmVyc2lvbiA6IHZlcnNpb24sCisgICAgICAgICBzZW5kY2wgOiBzZW5kY2wsIHJlY3ZjbDogcmVjdmNsLCBkYXRhOiAoW10pICk7CisgIGdtY3BkYXRhW21vZG5hbWVdID0gbW9kOworCisgIC8vIFp1bSBzY2hsdXNzIG5vY2ggZGVuIFNlbmRlbi1oYW5kbGVyIG1hbCBydWZlbiwgZGFtaXQgZGVyIG1hbCBhbGxlCisgIC8vIHZlcmZ1ZWdiYXJlbiBkYXRlbiBzZW5kZXQuCisgIGZ1bmNhbGwobW9kLT5zZW5kY2wsIDApOworfQorCisvLyBIYW5kbGVyIGZ1ZXIgZGFzIENvcmUgTW9kdWwgdm9uIEdNQ1AKKy8vIEdlcnVmZW4gYmVpIEVtcGZhbmcgdm9uIEtvbW1hbmRvcyB2b20gQ2xpZW50LgorcHJvdGVjdGVkIHZvaWQgR01DUG1vZF9Db3JlX3YxX3JlY3Yoc3RyaW5nIGNtZCwgbWl4ZWQgYXJncykKK3sKKyAgc3RydWN0IGdtY3BfbW9kX3MgbW9kID0gZ21jcGRhdGFbIkNvcmUiXTsKKyAgbWFwcGluZyBkYXRhID0gbW9kLT5kYXRhOworCisvKiAgaWYgKCFtb2QpCisgIHsKKyAgICBHTUNQRVJST1IoIkNvbW1hbmQgJXMgZm9yIGRpc2FibGVkIG1vZHVsZSBpZ25vcmVkLiIpOworICAgIHJldHVybjsKKyAgfQorICAqLworICBHTUNQX0RFQlVHKCJHTUNQbW9kX0NvcmVfdjE6ICIsIGNtZCwgMjApOworCisgIHN3aXRjaCAoY21kKQorICB7CisgICAgY2FzZSAiQ29yZS5IZWxsbyI6CisgICAgICBpZiAobWFwcGluZ3AoYXJncykpCisgICAgICAgIGRhdGFbIkhlbGxvIl0gPSAoWyJjbGllbnQiOiBhcmdzWyJjbGllbnQiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInZlcnNpb24iOiBhcmdzWyJ2ZXJzaW9uIl0gXSk7CisgICAgICBicmVhazsKKyAgICBjYXNlICJDb3JlLlN1cHBvcnRzLlNldCI6CisgICAgICBpZiAocG9pbnRlcnAoYXJncykpCisgICAgICB7CisgICAgICAgIC8vIEFsdGUgTW9kdWxlIGFic2NoYWx0ZW4vbG9lc2NoZW4KKyAgICAgICAgZm9yZWFjaChzdHJpbmcgbSA6IGRhdGFbIlN1cHBvcnRzIl0pCisgICAgICAgICAgR01DUF91bnJlZ2lzdGVyX21vZHVsZShtKTsKKyAgICAgICAgZGF0YVsiU3VwcG9ydHMiXSA9IGFyZ3M7CisgICAgICAgIC8vIFZlcnN1Y2hlbiwgZGllIG5ldWVuIE1vZHVsZSB6dSByZWdpc3RyaWVyZW4KKyAgICAgICAgZm9yZWFjaChzdHJpbmcgbSA6IGFyZ3MpCisgICAgICAgICAgR01DUF9yZWdpc3Rlcl9tb2R1bGUobSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgICAgR01DUF9ERUJVRygiR01DUG1vZF9Db3JlX3YxOiAiLAorICAgICAgICAgICAgICAiRGF0YSBmb3IgQ29yZS5TdXBwb3J0cy5TZXQgaXMgbm8gYXJyYXkiLCA1KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIkNvcmUuU3VwcG9ydHMuQWRkIjoKKyAgICAgIGlmICghcG9pbnRlcnAoZGF0YVsiU3VwcG9ydHMiXSkpCisgICAgICAgIGRhdGFbIlN1cHBvcnRzIl0gPSAoe30pOworICAgICAgaWYgKHBvaW50ZXJwKGFyZ3MpKQorICAgICAgeworICAgICAgICBmb3JlYWNoKHN0cmluZyBtOiBhcmdzKQorICAgICAgICAgIEdNQ1BfcmVnaXN0ZXJfbW9kdWxlKG0pOworICAgICAgICBkYXRhWyJTdXBwb3J0cyJdICs9IGFyZ3M7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICJDb3JlLlN1cHBvcnRzLlJlbW92ZSI6CisgICAgICBpZiAoIXBvaW50ZXJwKGRhdGFbIlN1cHBvcnRzIl0pKQorICAgICAgICBicmVhazsKKyAgICAgIGlmIChwb2ludGVycChhcmdzKSkKKyAgICAgIHsKKyAgICAgICAgZm9yZWFjaChzdHJpbmcgbTogYXJncykKKyAgICAgICAgICBHTUNQX3VucmVnaXN0ZXJfbW9kdWxlKG0pOworICAgICAgICBkYXRhWyJTdXBwb3J0cyJdIC09IGFyZ3M7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICJDb3JlLlN1cHBvcnRzLktlZXBBbGl2ZSI6CisgICAgICBicmVhazsgIC8vIHRoaXMgaXMgaWdub3JlZCBieSB1cy4KKyAgICBjYXNlICJDb3JlLlBpbmciOgorICAgICAgaWYgKGludHAoYXJncykpCisgICAgICAgIGRhdGFbIlBpbmciXSA9IGFyZ3M7CisgICAgICAvLyBzZW5kIGEgcGluZyBiYWNrCisgICAgICBHTUNQX3NlbmQoIkNvcmUuUGluZyIsMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlICJDb3JlLkRlYnVnIjoKKyAgICAgIGlmIChpbnRwKGFyZ3MpICYmIGFyZ3MgPj0gMCkKKyAgICAgICAgZGF0YVsiRGVidWciXSA9IGFyZ3M7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR01DUEVSUk9SKHNwcmludGYoIlVua25vd24gR01DUCBDb3JlIGNtZCAlcyB3aXRoIGFyZ3MgJU8iLAorICAgICAgICAgICAgY21kLCBhcmdzKSk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvLyBIYW5kbGVyIGZ1ZXIgZGFzIENvcmUgTW9kdWwgdm9uIEdNQ1AKKy8vIEdlcnVmZW4sIHdlbm4gRGF0ZW4genUgc2VuZGVuIHNpbmQuCitwcm90ZWN0ZWQgdm9pZCBHTUNQbW9kX0NvcmVfdjFfc2VuZChtYXBwaW5nIGRhdGEpCit7CisgIC8vIFp1ciBaZWl0IG5peCwgc3BhZXRlciBtYWwgQ29yZS5Hb29kYnllLgorfQorCisKKy8vIEhhbmRsZXIgZnVlciBkYXMgTUcuQ2hhciBNb2R1bAorLy8gR2VydWZlbiBiZWkgRW1wZmFuZyB2b24gS29tbWFuZG9zIHZvbSBDbGllbnQuCitwcm90ZWN0ZWQgdm9pZCBHTUNQbW9kX01HX2NoYXJfdjFfc2VuZChtYXBwaW5nIGRhdGEpCit7CisgIG1hcHBpbmcgc3F1ZXVlID0gbV9hbGxvY2F0ZSg1LDApOworICBzdHJ1Y3QgZ21jcF9tb2RfcyBtb2QgPSBnbWNwZGF0YVsiTUcuY2hhciJdOworICAvLyBtb2QtPmRhdGEgZnVuZ2llcnQgaGllciBhdWNoIGFscyBDYWNoZSBkZXIgRGF0ZW4uIERpZSBtdXNzIG1hbiBuYWVtbGljaAorICAvLyBsZWlkZXIgaW1tZXIgYWxsZSBzZW5kZW4sIG5pY2h0IG51ciBkaWUgZ2VhZW5kZXJ0ZW4uCisgIGlmICghbWFwcGluZ3AoZGF0YSkpCisgIHsKKyAgICAvLyBBbGxlIHZlcmZ1ZWdiYXJlbiBJbmZvcm1hdGlvbmVuIHNlbmRlbi4uLgorICAgIG1vZC0+ZGF0YSA9IG1fYWxsb2NhdGUoNik7CisgICAgbV9hZGQobW9kLT5kYXRhLCAiTUcuY2hhci5iYXNlIiwKKyAgICAgICAgICAgICAgKFtQX05BTUU6IE5hbWUoV0VSKSwKKyAgICAgICAgICAgICAgICBQX0dVSUxEOiBRdWVyeVByb3AoUF9HVUlMRCksCisgICAgICAgICAgICAgICAgUF9QUkVTQVk6IFF1ZXJ5UHJvcChQX1BSRVNBWSksICAvLyBUT0RPCisgICAgICAgICAgICAgICAgUF9USVRMRTogUXVlcnlQcm9wKFBfVElUTEUpLAorICAgICAgICAgICAgICAgICJ3aXpsZXZlbCI6IHF1ZXJ5X3dpel9sZXZlbCh0aGlzX29iamVjdCgpKSwKKyAgICAgICAgICAgICAgICBQX1JBQ0U6IFF1ZXJ5UHJvcChQX1JBQ0UpXSkgKTsgIC8vIFRPRE8KKyAgICBtX2FkZChtb2QtPmRhdGEsIk1HLmNoYXIudml0YWxzIiwgCisgICAgICAgICAgICAgIChbUF9IUDogUXVlcnlQcm9wKFBfSFApLAorICAgICAgICAgICAgICAgIFBfU1A6IFF1ZXJ5UHJvcChQX1NQKSwKKyAgICAgICAgICAgICAgICBQX1BPSVNPTjogUXVlcnlQcm9wKFBfUE9JU09OKSBdKSApOworICAgIG1fYWRkKG1vZC0+ZGF0YSwiTUcuY2hhci5tYXh2aXRhbHMiLAorICAgICAgICAgICAgICAoW1BfTUFYX0hQOiBRdWVyeVByb3AoUF9NQVhfSFApLAorICAgICAgICAgICAgICAgIFBfTUFYX1NQOiBRdWVyeVByb3AoUF9NQVhfU1ApLAorICAgICAgICAgICAgICAgIFBfTUFYX1BPSVNPTjogUXVlcnlQcm9wKFBfTUFYX1BPSVNPTikgXSkgKTsKKyAgICBtX2FkZChtb2QtPmRhdGEsIk1HLmNoYXIuYXR0cmlidXRlcyIsCisgICAgICAgICAgICAgIChbIEFfU1RSOiBRdWVyeUF0dHJpYnV0ZShBX1NUUiksCisgICAgICAgICAgICAgICAgIEFfSU5UOiBRdWVyeUF0dHJpYnV0ZShBX0lOVCksCisgICAgICAgICAgICAgICAgIEFfREVYOiBRdWVyeUF0dHJpYnV0ZShBX0RFWCksCisgICAgICAgICAgICAgICAgIEFfQ09OOiBRdWVyeUF0dHJpYnV0ZShBX0NPTikgXSkgKTsKKyAgICBtX2FkZChtb2QtPmRhdGEsIk1HLmNoYXIuaW5mbyIsCisgICAgICAgICAgICAgIChbUF9MRVZFTDogUXVlcnlQcm9wKFBfTEVWRUwpLAorICAgICAgICAgICAgICAgIFBfR1VJTERfTEVWRUw6IFF1ZXJ5UHJvcChQX0dVSUxEX0xFVkVMKSwKKyAgICAgICAgICAgICAgICBQX0dVSUxEX1RJVExFOiBRdWVyeVByb3AoUF9HVUlMRF9USVRMRSkgXSkgKTsKKyAgICBtX2FkZChtb2QtPmRhdGEsIk1HLmNoYXIud2ltcHkiLAorICAgICAgICAgICAgICAoW1BfV0lNUFk6IFF1ZXJ5UHJvcChQX1dJTVBZKSwKKyAgICAgICAgICAgICAgICBQX1dJTVBZX0RJUkVDVElPTjogUXVlcnlQcm9wKFBfV0lNUFlfRElSRUNUSU9OKSBdKSApOworICAgIG1fYWRkKHNxdWV1ZSwiTUcuY2hhci5iYXNlIik7CisgICAgbV9hZGQoc3F1ZXVlLCJNRy5jaGFyLnZpdGFscyIpOworICAgIG1fYWRkKHNxdWV1ZSwiTUcuY2hhci5tYXh2aXRhbHMiKTsKKyAgICBtX2FkZChzcXVldWUsIk1HLmNoYXIuYXR0cmlidXRlcyIpOworICAgIG1fYWRkKHNxdWV1ZSwiTUcuY2hhci5pbmZvIik7CisgICAgbV9hZGQoc3F1ZXVlLCJNRy5jaGFyLndpbXB5Iik7CisgICAgLy8gZGllcyB3aXJkIGRpcmVrdCBnZXNlbmRldCwgd2VpbCBlcyBuaWNodCBnZXNwZWljaGVydCB3ZXJkZW4gbXVzcy4gKHdpcmQKKyAgICAvLyBudXIgYmVpbSBTdGFydCBkZXMgTW9kdWxzIGdlc2VuZGV0KS4KKyAgICBHTUNQX3NlbmQoIk1HLmNoYXIuaW5mb1ZhcnMiLCAoWworICAgICAgICAgIFBfTEVWRUw6ICJTcGllbGVyc3R1ZmUiLCBQX0dVSUxEX0xFVkVMOiAiR2lsZGVuc3R1ZmUiLAorICAgICAgICAgIFBfR1VJTERfVElUTEU6ICJHaWxkZW50aXRlbCIgXSkgKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvLyBudXIgZGllIGluIGRhdGEgZW50aGFsdGVuZW4gc2VuZGVuLgorICAgIC8vIGpldHp0IGVyc3RtYWwgYWxsZXMgYXVzIGRhdGEgc28gc29ydGllcmVuLCB3aWUgZXMgZ2VzZW5kZXQgd2VyZGVuCisgICAgLy8gbXVzcy4uLiAqc2V1ZnoqCisgICAgZm9yZWFjaChzdHJpbmcga2V5LCBtaXhlZCB2YWwgOiBkYXRhKQorICAgIHsKKyAgICAgIHN3aXRjaChrZXkpCisgICAgICB7CisgICAgICAgIGNhc2UgUF9IUDoKKyAgICAgICAgY2FzZSBQX1NQOgorICAgICAgICBjYXNlIFBfUE9JU09OOgorICAgICAgICAgIChtb2QtPmRhdGEpWyJNRy5jaGFyLnZpdGFscyJdICs9IChba2V5OiB2YWxdKTsKKyAgICAgICAgICBtX2FkZChzcXVldWUsIk1HLmNoYXIudml0YWxzIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUF9NQVhfSFA6CisgICAgICAgIGNhc2UgUF9NQVhfU1A6CisgICAgICAgIGNhc2UgUF9NQVhfUE9JU09OOgorICAgICAgICAgIChtb2QtPmRhdGEpWyJNRy5jaGFyLm1heHZpdGFscyJdICs9IChba2V5OiB2YWxdKTsKKyAgICAgICAgICBtX2FkZChzcXVldWUsIk1HLmNoYXIubWF4dml0YWxzIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUF9OQU1FOgorICAgICAgICAgIChtb2QtPmRhdGEpWyJNRy5jaGFyLmJhc2UiXSArPSAoW2tleTogTmFtZShXRVIpXSk7CisgICAgICAgICAgbV9hZGQoc3F1ZXVlLCJNRy5jaGFyLmJhc2UiKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQX1JBQ0U6CisgICAgICAgIGNhc2UgUF9QUkVTQVk6CisgICAgICAgIGNhc2UgUF9USVRMRToKKyAgICAgICAgY2FzZSBQX0dVSUxEOgorICAgICAgICAgIChtb2QtPmRhdGEpWyJNRy5jaGFyLmJhc2UiXSArPSAoW2tleTogdmFsXSk7CisgICAgICAgICAgbV9hZGQoc3F1ZXVlLCJNRy5jaGFyLmJhc2UiKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBX0RFWDoKKyAgICAgICAgY2FzZSBBX1NUUjoKKyAgICAgICAgY2FzZSBBX0NPTjoKKyAgICAgICAgY2FzZSBBX0lOVDoKKyAgICAgICAgICAobW9kLT5kYXRhKVsiTUcuY2hhci5hdHRyaWJ1dGVzIl0gKz0gKFtrZXk6IHZhbF0pOworICAgICAgICAgIG1fYWRkKHNxdWV1ZSwiTUcuY2hhci5hdHRyaWJ1dGVzIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUF9MRVZFTDoKKyAgICAgICAgY2FzZSBQX0dVSUxEX0xFVkVMOgorICAgICAgICBjYXNlIFBfR1VJTERfVElUTEU6CisgICAgICAgICAgKG1vZC0+ZGF0YSlbIk1HLmNoYXIuaW5mbyJdICs9IChba2V5OiB2YWxdKTsKKyAgICAgICAgICBtX2FkZChzcXVldWUsIk1HLmNoYXIuaW5mbyIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBfV0lNUFk6CisgICAgICAgIGNhc2UgUF9XSU1QWV9ESVJFQ1RJT046CisgICAgICAgICAgKG1vZC0+ZGF0YSlbIk1HLmNoYXIud2ltcHkiXSArPSAoW2tleTogdmFsXSk7CisgICAgICAgICAgbV9hZGQoc3F1ZXVlLCJNRy5jaGFyLndpbXB5Iik7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIEdNQ1BfREVCVUcoIkdNQ1Btb2RfTUdfY2hhcl92MV9zZW5kKCkiLAorICAgICAgc3ByaW50ZigiRGF0YSByZWFkeTogJU8sIFNlbmRxdWV1ZTogJU8iLG1vZC0+ZGF0YSwgc3F1ZXVlKSw1MCk7CisKKyAgLy8gSmV0enQgZGllIHNxdWV1ZSBzZW5kZW4uLi4KKyAgZm9yZWFjaChzdHJpbmcga2V5IDogc3F1ZXVlKQorICB7CisgICAgR01DUF9zZW5kKGtleSwgKG1vZC0+ZGF0YSlba2V5XSk7CisgIH0KK30KKworLy8gSGFuZGxlciBmdWVyIGRhcyBNRy5DaGFyIE1vZHVsCisvLyBHZXJ1ZmVuIGJlaSBFbXBmYW5nIHZvbiBLb21tYW5kb3Mgdm9tIENsaWVudC4KK3Byb3RlY3RlZCB2b2lkIEdNQ1Btb2RfTUdfY2hhcl92MV9yZWN2KHN0cmluZyBjbWQsIG1peGVkIGFyZ3MpCit7CisgIC8vIGRpZXNlcyBNb2R1bCBiaWV0ZXQgZGVtIENsaWVudCBrZWluZSBLb21tYW5kb3MgYW4sIGRhaGVyIGlnbm9yaWVyZW4uCisgIEdNQ1BfREVCVUcoIkdNQ1Btb2RfTUdfQ2hhcl92MV9yZWN2IiwiQ2xpZW50LUtvbW1hbmRvIGlnbm9yaWVydDogIitjbWQsMjApOworfQorCisvKgorLy8gSGFuZGxlciBmdWVyIGRhcyBNRy5Sb29tIE1vZHVsIHZvbiBHTUNQCisvLyBHZXJ1ZmVuLCB3ZW5uIERhdGVuIHp1IHNlbmRlbiBzaW5kLgorcHJvdGVjdGVkIHZvaWQgR01DUG1vZF9NR19Sb29tX3YxX3NlbmQobWFwcGluZyBkYXRhKQoreworfQorCisvLyBIYW5kbGVyIGZ1ZXIgZGFzIFJvb20gTW9kdWwgdm9uIEdNQ1AKKy8vIEdlcnVmZW4gYmVpIEVtcGZhbmcgdm9uIEtvbW1hbmRvcyB2b20gQ2xpZW50LgorcHJvdGVjdGVkIHZvaWQgR01DUG1vZF9NR19Sb29tX3YxX3JlY3Yoc3RyaW5nIGNtZCwgbWl4ZWQgYXJncykKK3sKKyAgLy8gZGllc2VzIE1vZHVsIGJpZXRldCBkZW0gQ2xpZW50IGtlaW5lIEtvbW1hbmRvcyBhbiwgZGFoZXIgaWdub3JpZXJlbi4KKyAgR01DUF9ERUJVRygiR01DUG1vZF9NR19Sb29tX3YxX3JlY3YiLCJDbGllbnQtS29tbWFuZG8gaWdub3JpZXJ0OiAiK2NtZCwyMCk7Cit9CisqLworCisvLyBSZWN2IEhhbmRsZXIgZnVlciBkYXMgY29tbS5jaGFubmVsIE1vZHVsIHZvbiBHTUNQCisvLyBHZXJ1ZmVuIGJlaSBFbXBmYW5nIHZvbiBLb21tYW5kb3Mgdm9tIENsaWVudC4KK3Byb3RlY3RlZCB2b2lkIEdNQ1Btb2RfY29tbV9jaGFubmVsX3YxX3JlY3Yoc3RyaW5nIGNtZCwgbWl4ZWQgYXJncykKK3sKKyAgR01DUF9ERUJVRygiR01DUG1vZF9jb21tX2NoYW5uZWxfdjFfcmVjdiIsCisgICAgICAiQ2xpZW50LUtvbW1hbmRvIGlnbm9yaWVydDogIitjbWQsMjApOworfQorCisvLyBTZW5kIEhhbmRsZXIgZnVlciBkYXMgY29tbS5jaGFubmVsIE1vZHVsIHZvbiBHTUNQCitwcm90ZWN0ZWQgdm9pZCBHTUNQbW9kX2NvbW1fY2hhbm5lbF92MV9zZW5kKG1hcHBpbmcgZGF0YSkKK3sKKyAgLy8gR2FueiBzaW1wZWw6IGVpbmZhY2ggcmF1c3NlbmRlbi4uLgorICAvLyBDb3JlIHVlYmVyZ2lidCBiZWltIEVpbnNjaGFsdGVuIDAgYWxzIGRhdGEuIERpZXNlcyBtb2R1bCBtdXNzIGFiZXIgYmVpbQorICAvLyBFaXNuY2hhbHRlbiBuaXggbWFjaGVuLiBBbHNvIG51ciBpZ25vcmllcmVuLgorICBpZiAobWFwcGluZ3AoZGF0YSkpCisgICAgR01DUF9zZW5kKCJjb21tLmNoYW5uZWwiLCBkYXRhKTsKK30KKworLy8gUmVjdiBIYW5kbGVyIGZ1ZXIgZGFzIE1HLnJvb20gTW9kdWwgdm9uIEdNQ1AKKy8vIEdlcnVmZW4gYmVpIEVtcGZhbmcgdm9uIEtvbW1hbmRvcyB2b20gQ2xpZW50LgorcHJvdGVjdGVkIHZvaWQgR01DUG1vZF9NR19yb29tX3YxX3JlY3Yoc3RyaW5nIGNtZCwgbWl4ZWQgYXJncykKK3sKKyAgR01DUF9ERUJVRygiR01DUG1vZF9NR19yb29tX3YxX3JlY3YiLAorICAgICAgIkNsaWVudC1Lb21tYW5kbyBpZ25vcmllcnQ6ICIrY21kLDIwKTsKK30KKworLy8gU2VuZCBIYW5kbGVyIGZ1ZXIgZGFzIGNvbW0uY2hhbm5lbCBNb2R1bCB2b24gR01DUAorcHJvdGVjdGVkIHZvaWQgR01DUG1vZF9NR19yb29tX3YxX3NlbmQobWFwcGluZyBkYXRhKQoreworICAvLyBCZWtvbW10IGltbWVyIDAgYWxzIDxkYXRhPiB1ZWJlcmdlYmVuIHVuZCBzdWNodCBzaWNoIGRpZSBEYXRlbiBhdXMgZGVtCisgIC8vIFJhdW0genVzYW1tZW4uCisKKyAgLy8gQmFlaC4gV2FydW0gd2lyZCBkYXMgZGVubiBvaG5lIEVudiBnZXJ1ZmVuLiA6LSgKKyAgaWYgKCFlbnZpcm9ubWVudCgpKQorICAgIHJldHVybjsKKworICAvLyBCbGluZCBnaWJ0IGVzIGF1Y2ggcGVyIEdNQ1Agbml4LgorICBpZiAoQ2Fubm90U2VlKDEpKQorICAgIHJldHVybjsKKworICBpbnQgcmVzdHIgPSBlbnZpcm9ubWVudCgpLT5RdWVyeVByb3AoUF9NQVBfUkVTVFJJQ1RJT05TKTsKKworICBpZiAocmVzdHIgJiBNUl9OT0lORk8pCisgICAgcmV0dXJuOyAvLyBnYXIga2VpbmUgaW5mbyBzZW5kZW4uCisKKyAgLy8gQW5tZXJrdW5nOiBpbnRfc2hvcnQoKSB3YWVyZSBjb29sLiBEdW1tZXJ3ZWlzZSB1ZWJlcnRyYWVndCBkYXMgYXVjaAorICAvLyBzaWNodGJhcmUgQXVzZ2FuZ2UgdW5kIE9iamVrdGUuIEluc29mZXJuOiBnZWh0IG5pY2h0LgorICBkYXRhID0gKFsKKyAgICAgIFBfU0hPUlQ6IHByb2Nlc3Nfc3RyaW5nKGVudmlyb25tZW50KCktPlF1ZXJ5UHJvcChQX0lOVF9TSE9SVCl8fCIiKSsiLiIsCisgICAgICAiZG9tYWluIjogZW52aXJvbm1lbnQoKS0+UXVlcnlQcm9wKFBfRE9NQUlOKSB8fCAidW5iZWthbm50IiwKKyAgICAgIF0pOworCisgIC8vIHNpY2h0YmFyZSBBdXNnYWVuZ2UgYXVzZ2ViZW4KKyAgbWl4ZWQgaGlkZSA9IGVudmlyb25tZW50KCktPlF1ZXJ5UHJvcChQX0hJREVfRVhJVFMpOworICBpZiAoaGlkZSAmJiAhcG9pbnRlcnAoaGlkZSkpCisgICAgICBkYXRhWyJleGl0cyJdID0gKHt9KTsgICAvLyBhbGxlIHZlcnN0ZWNrZW4KKyAgZWxzZQorICB7CisgICAgICAvLyBRdWVyeSgpIHZlcndlbmRlbiwgZGFtaXQgc293b2hsIG5vcm1hbGUgYWxzIGF1Y2ggU3BlY2lhbCBFeGl0cworICAgICAgLy8ga29tbWVuLi4uIERpZSBTdW1tZSB2b24gYmVpZGVuIHd1ZXJkZSBhdWNoIGdlaGVuLCBhYmVyIGRhbm4gaGF0IG1hbgorICAgICAgLy8gendlaSB1bm5vZXRpZ2UgRmlsdGVyIGluIGRlbiBRdWVyeW1ldGhvZGVuLiBIbmdsLgorICAgICAgbWFwcGluZyBleGl0cyA9IGVudmlyb25tZW50KCktPlF1ZXJ5KFBfRVhJVFMsIEZfVkFMVUUpIHx8IChbXSk7CisgICAgICBpZiAocG9pbnRlcnAoaGlkZSkpCisgICAgICAgIGRhdGFbImV4aXRzIl0gPSBtX2luZGljZXMoZXhpdHMpIC0gaGlkZTsKKyAgICAgIGVsc2UKKyAgICAgICAgZGF0YVsiZXhpdHMiXSA9IG1faW5kaWNlcyhleGl0cyk7CisgIH0KKworICBpZiAocmVzdHIgJiBNUl9OT1VJRCkKKyAgICBkYXRhWyJpZCJdID0gIiI7CisgIGVsc2UKKyAgICBkYXRhWyJpZCJdID0gaGFzaChUTFNfSEFTSF9NRDUsIG9iamVjdF9uYW1lKGVudmlyb25tZW50KCkpKTsKKworICBHTUNQX3NlbmQoIk1HLnJvb20uaW5mbyIsIGRhdGEpOworfQorCisKKy8vIEhhbmRsZXIgZnVlciBkYXMgImNoYXIiIE1vZHVsIHZvbiBHTUNQIChNb2R1bCB2b24gQWFyZHdvbGYpCisvLyBHZXJ1ZmVuLCB3ZW5uIERhdGVuIHp1IHNlbmRlbiBzaW5kLgorcHJvdGVjdGVkIHZvaWQgR01DUG1vZF9jaGFyX3YxX3NlbmQobWFwcGluZyBkYXRhKQoreworICBtYXBwaW5nIHNxdWV1ZSA9IG1fYWxsb2NhdGUoNCwwKTsKKyAgc3RydWN0IGdtY3BfbW9kX3MgbW9kID0gZ21jcGRhdGFbImNoYXIiXTsKKyAgLy8gbW9kLT5kYXRhIGZ1bmdpZXJ0IGhpZXIgYXVjaCBhbHMgQ2FjaGUgZGVyIERhdGVuLiBEaWUgbXVzcyBtYW4gbmFlbWxpY2gKKyAgLy8gbGVpZGVyIGltbWVyIGFsbGUgc2VuZGVuLCBuaWNodCBudXIgZGllIGdlYWVuZGVydGVuLgorICBpZiAoIW1hcHBpbmdwKGRhdGEpKQorICB7CisgICAgLy8gQWxsZSB2ZXJmdWVnYmFyZW4gSW5mb3JtYXRpb25lbiBzZW5kZW4uLi4KKyAgICBtb2QtPmRhdGEgPSBtX2FsbG9jYXRlKDQpOworICAgIG1fYWRkKG1vZC0+ZGF0YSwgImNoYXIuYmFzZSIsIChbIm5hbWUiOiBxdWVyeV9yZWFsX25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyYWNlIjogUXVlcnlQcm9wKFBfUkFDRSldKSApOworICAgIG1fYWRkKG1vZC0+ZGF0YSwiY2hhci52aXRhbHMiLCAoWyJocCI6IFF1ZXJ5UHJvcChQX0hQKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFuYSI6IFF1ZXJ5UHJvcChQX1NQKV0pICk7CisgICAgbV9hZGQobW9kLT5kYXRhLCJjaGFyLnN0YXRzIiwgKFsgInN0ciI6IFF1ZXJ5QXR0cmlidXRlKEFfU1RSKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50IjogUXVlcnlBdHRyaWJ1dGUoQV9JTlQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXgiOiBRdWVyeUF0dHJpYnV0ZShBX0RFWCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbiI6IFF1ZXJ5QXR0cmlidXRlKEFfQ09OKSBdKSApOworICAgIG1fYWRkKG1vZC0+ZGF0YSwiY2hhci5zdGF0dXMiLCAoWyJsZXZlbCI6IFF1ZXJ5UHJvcChQX0xFVkVMKSBdKSApOworICAgIG1fYWRkKHNxdWV1ZSwiY2hhci5iYXNlIik7CisgICAgbV9hZGQoc3F1ZXVlLCJjaGFyLnZpdGFscyIpOworICAgIG1fYWRkKHNxdWV1ZSwiY2hhci5zdGF0cyIpOworICAgIG1fYWRkKHNxdWV1ZSwiY2hhci5zdGF0dXMiKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvLyBudXIgZGllIGluIGRhdGEgZW50aGFsdGVuZW4gc2VuZGVuLgorICAgIC8vIGpldHp0IGVyc3RtYWwgYWxsZXMgYXVzIGRhdGEgc28gc29ydGllcmVuLCB3aWUgZXMgZ2VzZW5kZXQgd2VyZGVuCisgICAgLy8gbXVzcy4uLiAqc2V1ZnoqCisgICAgZm9yZWFjaChzdHJpbmcga2V5LCBtaXhlZCB2YWwgOiBkYXRhKQorICAgIHsKKyAgICAgIHN3aXRjaChrZXkpCisgICAgICB7CisgICAgICAgIGNhc2UgUF9IUDoKKyAgICAgICAgICAobW9kLT5kYXRhKVsiY2hhci52aXRhbHMiXSArPSAoWyJocCI6IHZhbF0pOworICAgICAgICAgIG1fYWRkKHNxdWV1ZSwiY2hhci52aXRhbHMiKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQX1NQOgorICAgICAgICAgIChtb2QtPmRhdGEpWyJjaGFyLnZpdGFscyJdICs9IChbIm1hbmEiOiB2YWxdKTsKKyAgICAgICAgICBtX2FkZChzcXVldWUsImNoYXIudml0YWxzIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUF9OQU1FOgorICAgICAgICBjYXNlIFBfUkFDRToKKyAgICAgICAgICAobW9kLT5kYXRhKVsiY2hhci5iYXNlIl0gKz0gKFtrZXk6IHZhbF0pOworICAgICAgICAgIG1fYWRkKHNxdWV1ZSwiY2hhci5iYXNlIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQV9ERVg6CisgICAgICAgIGNhc2UgQV9TVFI6CisgICAgICAgIGNhc2UgQV9DT046CisgICAgICAgIGNhc2UgQV9JTlQ6CisgICAgICAgICAgKG1vZC0+ZGF0YSlbImNoYXIuc3RhdHMiXSArPSAoW2tleTogdmFsXSk7CisgICAgICAgICAgbV9hZGQoc3F1ZXVlLCJjaGFyLnN0YXRzIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUF9MRVZFTDoKKyAgICAgICAgICAobW9kLT5kYXRhKVsiY2hhci5zdGF0dXMiXSArPSAoW2tleTogdmFsXSk7CisgICAgICAgICAgbV9hZGQoc3F1ZXVlLCJjaGFyLnN0YXR1cyIpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICBHTUNQX0RFQlVHKCJHTUNQbW9kX2NoYXJfdjFfc2VuZCgpIiwKKyAgICAgIHNwcmludGYoIkRhdGEgcmVhZHk6ICVPLCBTZW5kcXVldWU6ICVPIixtb2QtPmRhdGEsIHNxdWV1ZSksNTApOworCisgIC8vIEpldHp0IGRpZSBzcXVldWUgc2VuZGVuLi4uCisgIGZvcmVhY2goc3RyaW5nIGtleSA6IHNxdWV1ZSkKKyAgeworICAgIEdNQ1Bfc2VuZChrZXksIChtb2QtPmRhdGEpW2tleV0pOworICB9Cit9CisKKy8vIEhhbmRsZXIgZnVlciBkYXMgImNoYXIiIE1vZHVsIHZvbiBHTUNQIChNb2R1bCB2b24gQWFyZHdvbGYpCisvLyBHZXJ1ZmVuIGJlaSBFbXBmYW5nIHZvbiBLb21tYW5kb3Mgdm9tIENsaWVudC4KK3Byb3RlY3RlZCB2b2lkIEdNQ1Btb2RfY2hhcl92MV9yZWN2KHN0cmluZyBjbWQsIG1peGVkIGRhdGEpCit7CisgIC8vIGRpZXNlcyBNb2R1bCBiaWV0ZXQgZGVtIENsaWVudCBrZWluZSBLb21tYW5kb3MgYW4sIGRhaGVyIGlnbm9yaWVyZW4uCisgIEdNQ1BfREVCVUcoIkdNQ1Btb2RfY2hhcl92MV9yZWN2IiwiQ2xpZW50LUtvbW1hbmRvIGlnbm9yaWVydDogIitjbWQsMjApOworfQorCisKKy8vIEhhbmRsZXIgZnVlciBkYXMgIkNoYXIiIE1vZHVsIHZvbiBHTUNQIChNb2R1bCB2b24gSVJFKQorLy8gR2VydWZlbiwgd2VubiBEYXRlbiB6dSBzZW5kZW4gc2luZC4KK3Byb3RlY3RlZCB2b2lkIEdNQ1Btb2RfQ2hhcl92MV9zZW5kKG1hcHBpbmcgZGF0YSkKK3sKKyAgbWFwcGluZyBzcXVldWUgPSBtX2FsbG9jYXRlKDQsMCk7CisgIHN0cnVjdCBnbWNwX21vZF9zIG1vZCA9IGdtY3BkYXRhWyJDaGFyIl07CisgIC8vIG1vZC0+ZGF0YSBmdW5naWVydCBoaWVyIGF1Y2ggYWxzIENhY2hlIGRlciBEYXRlbi4gRGllIG11c3MgbWFuIG5hZW1saWNoCisgIC8vIGxlaWRlciBpbW1lciBhbGxlIHNlbmRlbiwgbmljaHQgbnVyIGRpZSBnZWFlbmRlcnRlbi4KKyAgaWYgKCFtYXBwaW5ncChkYXRhKSkKKyAgeworICAgIC8vIEFsbGUgdmVyZnVlZ2JhcmVuIEluZm9ybWF0aW9uZW4gc2VuZGVuLi4uCisgICAgbW9kLT5kYXRhID0gbV9hbGxvY2F0ZSg0KTsKKyAgICBtX2FkZChtb2QtPmRhdGEsIkNoYXIuVml0YWxzIiwgKFsiaHAiOiBRdWVyeVByb3AoUF9IUCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1wIjogUXVlcnlQcm9wKFBfU1ApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXhocCI6IFF1ZXJ5UHJvcChQX01BWF9IUCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heG1wIjogUXVlcnlQcm9wKFBfTUFYX1NQKSBdKSApOworICAgIG1fYWRkKG1vZC0+ZGF0YSwiQ2hhci5TdGF0dXMiLCAoWyJsZXZlbCI6IFF1ZXJ5UHJvcChQX0xFVkVMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3VpbGQiOiBRdWVyeVByb3AoUF9HVUlMRCkgXSkgKTsKKyAgICBtX2FkZChzcXVldWUsIkNoYXIuVml0YWxzIik7CisgICAgbV9hZGQoc3F1ZXVlLCJDaGFyLlN0YXR1cyIpOworICAgIC8vIGRpZXMgd2lyZCBkaXJla3QgZ2VzZW5kZXQsIHdlaWwgZXMgbmljaHQgZ2VzcGVpY2hlcnQgd2VyZGVuIG11c3MuICh3aXJkCisgICAgLy8gbnVyIGJlaW0gU3RhcnQgZGVzIE1vZHVscyBnZXNlbmRldCkuCisgICAgR01DUF9zZW5kKCJDaGFyLlN0YXR1c1ZhcnMiLCAoWworICAgICAgICAgICJsZXZlbCI6ICJTcGllbGVyc3R1ZmUiLCAiZ3VpbGQiOiAiR2lsZGUiIF0pICk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLy8gbnVyIGRpZSBpbiBkYXRhIGVudGhhbHRlbmVuIHNlbmRlbi4KKyAgICAvLyBqZXR6dCBlcnN0bWFsIGFsbGVzIGF1cyBkYXRhIHNvIHNvcnRpZXJlbiwgd2llIGVzIGdlc2VuZGV0IHdlcmRlbgorICAgIC8vIG11c3MuLi4gKnNldWZ6KgorICAgIGZvcmVhY2goc3RyaW5nIGtleSwgbWl4ZWQgdmFsIDogZGF0YSkKKyAgICB7CisgICAgICBzd2l0Y2goa2V5KQorICAgICAgeworICAgICAgICBjYXNlIFBfSFA6CisgICAgICAgICAgKG1vZC0+ZGF0YSlbIkNoYXIuVml0YWxzIl0gKz0gKFsiaHAiOiB2YWxdKTsKKyAgICAgICAgICBtX2FkZChzcXVldWUsIkNoYXIuVml0YWxzIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUF9TUDoKKyAgICAgICAgICAobW9kLT5kYXRhKVsiQ2hhci5WaXRhbHMiXSArPSAoWyJtcCI6IHZhbF0pOworICAgICAgICAgIG1fYWRkKHNxdWV1ZSwiQ2hhci5WaXRhbHMiKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQX01BWF9IUDoKKyAgICAgICAgICAobW9kLT5kYXRhKVsiQ2hhci5WaXRhbHMiXSArPSAoWyJtYXhocCI6IHZhbF0pOworICAgICAgICAgIG1fYWRkKHNxdWV1ZSwiQ2hhci5WaXRhbHMiKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQX01BWF9TUDoKKyAgICAgICAgICAobW9kLT5kYXRhKVsiQ2hhci5WaXRhbHMiXSArPSAoWyJtYXhtcCI6IHZhbF0pOworICAgICAgICAgIG1fYWRkKHNxdWV1ZSwiQ2hhci5WaXRhbHMiKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQX0xFVkVMOgorICAgICAgICBjYXNlIFBfR1VJTEQ6CisgICAgICAgICAgKG1vZC0+ZGF0YSlbIkNoYXIuU3RhdHVzIl0gKz0gKFtrZXk6IHZhbF0pOworICAgICAgICAgIG1fYWRkKHNxdWV1ZSwiQ2hhci5TdGF0dXMiKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgR01DUF9ERUJVRygiR01DUG1vZF9DaGFyX3YxX3NlbmQoKSIsCisgICAgICBzcHJpbnRmKCJEYXRhIHJlYWR5OiAlTywgU2VuZHF1ZXVlOiAlTyIsbW9kLT5kYXRhLCBzcXVldWUpLDUwKTsKKworICAvLyBKZXR6dCBkaWUgc3F1ZXVlIHNlbmRlbi4uLgorICBmb3JlYWNoKHN0cmluZyBrZXkgOiBzcXVldWUpCisgIHsKKyAgICBHTUNQX3NlbmQoa2V5LCAobW9kLT5kYXRhKVtrZXldKTsKKyAgfQorfQorCisvLyBIYW5kbGVyIGZ1ZXIgZGFzICJjaGFyIiBNb2R1bCB2b24gR01DUCAoTW9kdWwgdm9uIEFhcmR3b2xmKQorLy8gR2VydWZlbiBiZWkgRW1wZmFuZyB2b24gS29tbWFuZG9zIHZvbSBDbGllbnQuCitwcm90ZWN0ZWQgdm9pZCBHTUNQbW9kX0NoYXJfdjFfcmVjdihzdHJpbmcgY21kLCBtaXhlZCBhcmdzKQoreworICAvLyBkaWVzZXMgTW9kdWwgYmlldGV0IGRlbSBDbGllbnQga2VpbmUgS29tbWFuZG9zIGFuLCBkYWhlciBpZ25vcmllcmVuLgorICBHTUNQX0RFQlVHKCJHTUNQbW9kX0NoYXJfdjFfcmVjdiIsIkNsaWVudC1Lb21tYW5kbyBpZ25vcmllcnQ6ICIrY21kLDIwKTsKK30KKworCisvLyBIYW5kbGVyLCBkZXIgdm9uIHRlbG5ldG5lZy5jIGdlcnVmZW4gd2lyZC4KK3ByaXZhdGUgdm9pZCBfc3RkX3JlX2hhbmRsZXJfZ21jcChzdHJ1Y3QgdGVsb3B0X3Mgb3B0LCBpbnQgYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqb3B0YXJncykKK3sKKyAgc3dpdGNoKGFjdGlvbikKKyAgeworICAgIGNhc2UgTE9DQUxPTjoKKyAgICAgIC8vIHN1cGVyIQorICAgICAgR01DUF9ERUJVRygicmVjdjoiLCAiTE9DQUxPTiIsMTApOworICAgICAgZ21jcGRhdGEgPSAoW10pOworICAgICAgb3B0LT5kYXRhID0gZ21jcGRhdGE7ICAgLy8gZGF0ZW4gYXVjaCBkb3J0IGFibGVnZW4uCisgICAgICAvLyBDb3JlbW9kdWxlIGluIGRlciBWZXJzaW9uIDEgcmVnaXN0cmllcmVuIChlcyBnaWJ0IG51ciBlaW5lKS4KKyAgICAgIEdNQ1BfcmVnaXN0ZXJfbW9kdWxlKCJDb3JlIDEiKTsKKyNpZmRlZiBfX0dNQ1BfREVCVUdfXworICAgICAgR01DUG1vZF9Db3JlX3YxX3JlY3YoIkNvcmUuRGVidWciLDMwKTsKKyNlbmRpZgorICAgICAgYnJlYWs7CisgICAgY2FzZSBMT0NBTE9GRjoKKyAgICAgIC8vIGFsbGVzIGFic2NoYWx0ZW4gdW5kIERhdGVuIGxvZXNjaGVuCisgICAgICBHTUNQX0RFQlVHKCJyZWN2OiIsICJMT0NBTE9GRiIsMTApOworICAgICAgb3B0LT5kYXRhID0gMDsKKyAgICAgIGdtY3BkYXRhID0gMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUkVNT1RFT046CisgICAgY2FzZSBSRU1PVEVPRkY6CisgICAgICAvLyBIdWNoLiBBdWYgQ2xpZW50c2VpdGUgaXN0IEdNQ1AgZWlnZW50bGljaCBuaWUgYW4uIElnbm9yaWVyZW4uLi4KKyAgICAgIEdNQ1BfREVCVUcoInJlY3Y6IiwgIkh1aD8gUkVNT1RFIHN0YXRlIGNoYW5nZWQ/Iiw1MCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNCOgorICAgICAgLy8gRGVyIGVpZ2VudGxpY2ggaW50ZXJlc3NhbnRlIEZhbGwuLi4gR01DUC1Lb21tYW5kb3MKKyAgICAgIGlmICghbWFwcGluZ3AoZ21jcGRhdGEpKSByZXR1cm47IC8vIEdNQ1Agd29obCBuaWNodCBlaW5nZXNjaGFsdGV0Li4uCisgICAgICBzdHJpbmcgY21kOworICAgICAgbWl4ZWQgYXJnczsKKyAgICAgIHN0cmluZyBwYXlsb2FkPXRvX3N0cmluZyhvcHRhcmdzKTsKKyAgICAgIEdNQ1BfREVCVUcoInJlY3YiLCBwYXlsb2FkLDEwKTsKKyAgICAgIGlmIChzc2NhbmYocGF5bG9hZCwiJXMgJXMiLCBjbWQsIGFyZ3MpICE9IDIpIHsKKyAgICAgICAgLy8gaXN0IHZlcm11dGxpY2ggZWluIEtvbW1hbmRvIG9obmUgZGF0ZW4gKG9kZXIgTXVlbGwpCisgICAgICAgIGNtZCA9IHBheWxvYWQ7CisgICAgICAgIC8vYXJncyA9IDA7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHN0cmluZyBlcnI9Y2F0Y2goYXJncyA9IGpzb25fcGFyc2UoYXJncyk7bm9sb2cpOworICAgICAgICBpZiAoZXJyKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmKCJcbkZlaGxlciBiZWltIFBhcnNlbiBlaW5lciBHTUNQLU5hY2hyaWNodDogJXMuICIKKyAgICAgICAgICAgICAgICAgIk5hY2hyaWNodCB3YXI6ICclcydcbiIKKyAgICAgICAgICAgICAgICAgIkJlZmVobDogJyVzJywgQXJndW1lbnQ6ICclcydcblxuIixlcnIscGF5bG9hZCxjbWQsYXJnc3x8IiIpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgR01DUF9ERUJVRygicmVjdiIsIHNwcmludGYoIkNvbW1hbmQ6ICVzLCBEYXRhOiAlTyIsIGNtZCwgYXJncyksMjApOworCisgICAgICBzdHJpbmcgKmNtZHBhcnRzID0gZXhwbG9kZShjbWQsICIuIik7CisgICAgICBzdHJ1Y3QgZ21jcF9tb2RfcyBtb2Q7CisgICAgICBzdHJpbmcgbW9kbmFtZTsKKyAgICAgIC8vIHZlcnN1Y2gsIGVpbiBNb2R1bCBmdWVyIGRhcyBLb21tYW5kbyB6dSBmaW5kZW4uIEFuZmFuZ2VuIG1pdCBkZXIKKyAgICAgIC8vIEFubmFobWUsIGRhc3MgYmlzIHp1bSBsZXR6dGVuIFB1bmt0IGRlciBNb2R1bG5hbWUgZ2VodCB1bmQgZGFubgorICAgICAgLy8gaW4gamVkZW0gY2FzZSBlaW5lbiBQdW5rdCBrdWVyemVyIHdlcmRlbmQuCisgICAgICBzd2l0Y2goc2l6ZW9mKGNtZHBhcnRzKSkKKyAgICAgIHsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgIG1vZG5hbWUgPSBpbXBsb2RlKGNtZHBhcnRzWzAuLjJdLCIuIik7CisgICAgICAgICAgR01DUF9ERUJVRygidHJ5aW5nIG1vZG5hbWUuLi4gIiwgbW9kbmFtZSwgMjAgKTsKKyAgICAgICAgICBpZiAobWVtYmVyKGdtY3BkYXRhLCBtb2RuYW1lKSkgeworICAgICAgICAgICAgbW9kID0gZ21jcGRhdGFbbW9kbmFtZV07CisgICAgICAgICAgICBmdW5jYWxsKG1vZC0+cmVjdmNsLCBjbWQsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIC8vIEZhbGwtdGhyb3VnaCEKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgIG1vZG5hbWUgPSBpbXBsb2RlKGNtZHBhcnRzWzAuLjFdLCIuIik7CisgICAgICAgICAgR01DUF9ERUJVRygidHJ5aW5nIG1vZG5hbWUuLi4gIiwgbW9kbmFtZSwgMjApOworICAgICAgICAgIGlmIChtZW1iZXIoZ21jcGRhdGEsIG1vZG5hbWUpKSB7CisgICAgICAgICAgICBtb2QgPSBnbWNwZGF0YVttb2RuYW1lXTsKKyAgICAgICAgICAgIGZ1bmNhbGwobW9kLT5yZWN2Y2wsIGNtZCwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgLy8gRmFsbC10aHJvdWdoIQorICAgICAgICBjYXNlIDI6CisgICAgICAgICAgbW9kbmFtZSA9IGltcGxvZGUoY21kcGFydHNbMC4uMF0sIi4iKTsKKyAgICAgICAgICBHTUNQX0RFQlVHKCJ0cnlpbmcgbW9kbmFtZS4uLiAiLCBtb2RuYW1lLCAyMCk7CisgICAgICAgICAgaWYgKG1lbWJlcihnbWNwZGF0YSwgbW9kbmFtZSkpIHsKKyAgICAgICAgICAgIG1vZCA9IGdtY3BkYXRhW21vZG5hbWVdOworICAgICAgICAgICAgZnVuY2FsbChtb2QtPnJlY3ZjbCwgY21kLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICAvLyBIaWVyIGlzdHMgamV0enQgbmVuIEZlaGxlci4KKyAgICAgICAgICBHTUNQRVJST1Ioc3ByaW50ZigiVW5rbm93biBHTUNQIG1vZHVsZSBmb3IgY21kICVzIixjbWQpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAvLyB6dXZpZWxlIG9kZXIgenV3ZW5pZyAuIDstKQorICAgICAgICAgIEdNQ1BFUlJPUihzcHJpbnRmKCJJbGxlZ2FsIEdNQ1AgY21kICVzIHdpdGggYXJncyAlTyIsCisgICAgICAgICAgICAgICAgY21kLCBhcmdzKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAvLyBzYmRhdGEgYnJhdWNoZW4gd2lyIGVpZ2VudGxpY2ggbmljaHQgbWVoci4KKyAgICAgIG9wdC0+cmVfd2lzaGVzLT5zYmRhdGEgPSAwOworICAgICAgYnJlYWs7CisgIH0gLy8gc3dpdGNoIChhY3Rpb24pCit9CisKKy8vIHdpcmQgdm9uIGJhc2UuYyBuYWNoIEtvbm5la3RpZXJ1bmcgZ2VydWZlbi4KKy8vIERhcmYgYWJlciBlcnN0IGdlcnVmZW4gd2VyZGVuLCB3ZW5uIGRhcyBTcGllbGVyb2JqZWt0IGZlcnRpZyBpbml0aWFsaXNpZXJ0CisvLyB1bmQgZWluZ2VsZXNlbiBpc3QuCitwcm90ZWN0ZWQgdm9pZCBzdGFydHVwX3RlbG5ldF9uZWdzKCkKK3sKKyAgLy8gZXZ0bC4gd2FyIGVzIGVpbiByZWNvbm5lY3QsIGRhbm4gc3RlaHQgaW4gZ21jcCBub2NoIGFsdGVyIGtyYW0gZHJpbi4gRGVyCisgIC8vIG11c3Mgd2VnLCBrb2VubnRlIGphIGF1Y2ggc2VpbiwgZGFzcyBkZXIgQ2xpZW50IChqZXR6dCkga2VpbiBHTUNQCisgIC8vIG1laHIKKyAgLy8gd2lsbC4KKyAgZ21jcGRhdGEgPSAwOworCisgIC8vIEhhY2sgYmVzb25kZXJlciBTb3J0ZTogR01DUCBzb2xsIGxva2FsIGVpbmdlc2NoYWx0ZXQgc2Vpbi4gQXVmCisgIC8vIENsaWVudHNlaXRlbiBpc3QgZXMgbGF1dCBQcm90b2tvbGwgbmljaHQgdm9yZ2VzZWhlbiwgZGFoZXIgZHVlcmZlbgorICAvLyAoc29sbHRlbj8pIHdpciBrZWluIERPIGFuIGRlbiBDbGllbnQgc2VuZGVuLiBXaXIgYnJhdWNoZW4gYWJlciBlaW5lbgorICAvLyByZW1vdGUgaGFuZGxlciwgdW0gZGllIFd1ZW5zY2hlIHZvbSBDbGllbnQgenUgdmVyYXJiZWl0ZW4uIERhaGVyIGVyc3RtYWwKKyAgLy8gbnVyIGRlbiBsb2NhbCBoYW5kbGVyIGJpbmRlbiAodW5kIGdsZWljaHplaXRpZyBuZWdvdGlhdGlvbiBhbnN0b3NzZW4pIHVuZAorICAvLyBkYW5uIGRpcmVrdCBkYW5hY2ggZGVuIHJlbW90ZSBoYW5kbGVyIGF1Y2ggYmluZGVuIChvaG5lIGVybmV1dGUKKyAgLy8gbmVnb3RpYXRpb24genUgc3RhcnRlbikuIEFjaGphIHVuZCB3aXIgbmVobWVuIGRpZSBnbGVpY2hlIEZ1bmt0aW9uIGFscworICAvLyBIYW5kbGVyIGZ1ZXIgcmVtb3RlIHVuZCBsb2thbC4KKyAgYmluZF90ZWxuZWdfaGFuZGxlcihURUxPUFRfR01DUCwgMCwgIydfc3RkX3JlX2hhbmRsZXJfZ21jcCwgMSk7CisgIGJpbmRfdGVsbmVnX2hhbmRsZXIoVEVMT1BUX0dNQ1AsICMnX3N0ZF9yZV9oYW5kbGVyX2dtY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMnX3N0ZF9yZV9oYW5kbGVyX2dtY3AsIDApOworfQorCmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL3F1ZXN0cy5jIGIvc3RkL3BsYXllci9xdWVzdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWU1NjZkCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9xdWVzdHMuYwpAQCAtMCwwICsxLDI0NCBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHBsYXllci9xdWVzdHMuYyAtLSBxdWVzdCBoYW5kbGVyCisvLworLy8gJElkOiBxdWVzdHMuYyA5MTQyIDIwMTUtMDItMDQgMjI6MTc6MjlaIFplc3N0cmEgJAorCisvLyBEaWVzZXMgTW9kdWwgZW5oYWVsdCBkaWUgUXVlc3Qtc3BlemlmaXNjaGVuIFRlaWxlIGRlciBQbGF5ZXJvYmpla3RlLgorI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPHBsYXllci9saWZlLmg+CisjaW5jbHVkZSA8cGxheWVyL3F1ZXN0Lmg+CisjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHBsYXllci9iYXNlLmg+CisjaW5jbHVkZSA8bGl2aW5nL2xpZmUuaD4KKyN1bmRlZiBORUVEX1BST1RPVFlQRVMKKworI2luY2x1ZGUgIi9zZWN1cmUvcXVlc3RtYXN0ZXIuaCIKKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxkYWVtb24uaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPG1haWwuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8bmV3X3NraWxscy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxldmVudHMuaD4KKworbWl4ZWQgcXVlc3RzOworCitpbnQgUXVlcnlRdWVzdChzdHJpbmcgcXVlc3RuYW1lKTsKKy8vIGxvY2FsIHByb3BlcnRpZXMgcHJvdG90eXBlCitzdGF0aWMgbWl4ZWQgX3F1ZXJ5X3F1ZXN0cygpOworc3RhdGljIGludCAgIF9xdWVyeV9xdWVzdHBvaW50cygpOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSB7CisgIFNldChQX1FVRVNUUywgTk9TRVRNRVRIT0QsIEZfU0VUX01FVEhPRCk7CisgIFNldChQX1FVRVNUUywgcXVlc3RzID0gKFtdKSwgRl9WQUxVRSk7CisgIFNldChQX1FVRVNUUywgU0VDVVJFRCwgRl9NT0RFKTsKKyAgU2V0KFBfUVAsIFNBVkUsIEZfTU9ERSk7CisgIFNldChQX1FQLCBTRUNVUkVELCBGX01PREUpOworfQorCit2YXJhcmdzIGludCBHaXZlUXVlc3Qoc3RyaW5nIHF1ZXN0bmFtZSwgc3RyaW5nIG1lc3NhZ2UpIHsKKyAgbWl4ZWQgKnF1ZXN0ID0gUU0tPlF1ZXJ5UXVlc3QocXVlc3RuYW1lKTsKKworICAvLyBRdWVzdG5hbWUgdW5ndWVsdGlnCisgIGlmICghcXVlc3R8fCFwb2ludGVycChxdWVzdCl8fHF1ZXN0PT0oe30pKQorICAgIHJldHVybiBHUV9LRVlfSU5WQUxJRDsKKyAgLy8gVW5iZWZ1Z3RlciBadWdyaWZmIGF1ZiBkZWFrdGl2aWVydGUgUXVlc3QKKyAgaWYgKCFxdWVzdFs2XSYmIUlTX0FSQ0godGhpc19pbnRlcmFjdGl2ZSgpKSkKKyAgICByZXR1cm4gR1FfSVNfSU5BQ1RJVkU7CisgIC8vIFVuYmVmdWd0ZXIgWnVncmlmZgorICBpZiAobWVtYmVyKHF1ZXN0WzJdLCBsb2FkX25hbWUocHJldmlvdXNfb2JqZWN0KCkpKT09LTEgJiYKKyAgICAgICFJU19BUkNIKHRoaXNfaW50ZXJhY3RpdmUoKSkpCisgICAgcmV0dXJuIEdRX0lMTEVHQUxfT0JKOworCisgIC8vIEdpbGRlIHdpcmQgaW4gamVkZW0gRmFsbCBpbmZvcm1pZXJ0LgorICBzdHJpbmcgZ3VpbGQ9R1VJTERfRElSK1F1ZXJ5UHJvcChQX0dVSUxEKTsKKyAgaWYgKGZpbmRfb2JqZWN0KGd1aWxkKSB8fCBmaWxlX3NpemUoZ3VpbGQrIi5jIik+LTEpCisgICAgY2F0Y2goIGNhbGxfb3RoZXIoZ3VpbGQsICJOb3RpZnlHaXZlUXVlc3QiLCBNRSwgcXVlc3RuYW1lKTtwdWJsaXNoICk7CisKKyAgLy8gUXVlc3QgYmVyZWl0cyBnZXNldHp0CisgIGlmIChRdWVyeVF1ZXN0KHF1ZXN0bmFtZSkpCisgICAgcmV0dXJuIEdRX0FMUkVBRFlfU0VUOworICBBZGRFeHAocXVlc3RbMV0pOworICBxdWVzdHMgKz0gKFsgcXVlc3RuYW1lIDogcXVlc3RbMF07IHRpbWUoKSBdKTsKKyAgZm9yY2Vfc2F2ZSgpOworICAvLyBFdmVudCBhdXNsb2VzZW4KKyAgRVZFTlRELT5UcmlnZ2VyRXZlbnQoRVZUX0xJQl9RVUVTVF9TT0xWRUQsKFsKKyAgICAgICAgICAgICBFX09CSkVDVDogTUUsCisgICAgICAgICAgICAgRV9QTE5BTUU6IGdldHVpZChNRSksCisgICAgICAgICAgICAgRV9FTlZJUk9OTUVOVDogZW52aXJvbm1lbnQoKSwKKyAgICAgICAgICAgICBFX1FVRVNUTkFNRTogcXVlc3RuYW1lLAorICAgICAgICAgICAgIEVfUVBfR1JBTlRFRDogcXVlc3RbMF0gXSkgKTsKKworICBpZiAobWVzc2FnZSAmJiBtZXNzYWdlIT0iIikgeworICAgIGlmIChtZXNzYWdlIT0iX19zaWxlbnRfXyIpIHsKKyAgICAgIG1lc3NhZ2U9aW1wbG9kZShleHBsb2RlKG1lc3NhZ2UsIkBAbmFtZUBAIiksCisgICAgICAgICAgY2FwaXRhbGl6ZShxdWVyeV9yZWFsX25hbWUoKSkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIG1lc3NhZ2U9IiI7CisgICAgfQorICB9CisgIGVsc2UKKyAgICBtZXNzYWdlPWNhcGl0YWxpemUocXVlcnlfcmVhbF9uYW1lKCkpCisgICAgICArIiBoYXQgZ2VyYWRlIGVpbiBBYmVudGV1ZXIgYmVzdGFuZGVuOiAiKyBxdWVzdG5hbWUrIlxuIjsKKyAgaWYobWVzc2FnZSE9IiIpCisgICAgY2F0Y2goUU0tPkNoYW5uZWwobWVzc2FnZSk7cHVibGlzaCk7CisgIGNhdGNoKFFNLT5TZW5kTWFpbChxdWVzdG5hbWUsIHF1ZXN0LCBNRSk7cHVibGlzaCk7CisgIHJldHVybiBPSzsKK30KKworaW50IERlbGV0ZVF1ZXN0KHN0cmluZyBxdWVzdG5hbWUpIHsKKyAgLy8gUXVlc3QgaXN0IG5pY2h0IGdlc2V0enQKKyAgaWYoIVF1ZXJ5UXVlc3QocXVlc3RuYW1lKSkKKyAgICByZXR1cm4gRFFfTk9UX1NFVDsKKworICBtaXhlZCAqcXVlc3QgPSBRTS0+UXVlcnlRdWVzdChxdWVzdG5hbWUpOworICAvLyBRdWVzdG5hbWUgdW5ndWVsdGlnCisgIGlmICghcXVlc3R8fCFwb2ludGVycChxdWVzdCl8fHF1ZXN0PT0oe30pKQorICAgIHJldHVybiBEUV9LRVlfSU5WQUxJRDsKKyAgLy8gVW5iZWZ1Z3RlciBadWdyaWZmCisgIGlmICghSVNfQVJDSCh0aGlzX2ludGVyYWN0aXZlKCkpKQorICAgIHJldHVybiBEUV9JTExFR0FMX09CSjsKKyAgQWRkRXhwKC1xdWVzdFsxXSk7CisgIG1fZGVsZXRlKHF1ZXN0cywgcXVlc3RuYW1lKTsKKyAgZm9yY2Vfc2F2ZSgpOworICByZXR1cm4gT0s7Cit9CisKK2ludCBRdWVyeVF1ZXN0KHN0cmluZyBxdWVzdG5hbWUpIHsKKyAgaW50IGR1bW15OworCisgIC8vIEdhZXN0ZSBoYWJlbiBrZWluZSBRdWVzdHMuCisgIGlmKCBzc2NhbmYoIGdldHVpZCgpLCAiZ2FzdCVkIiwgZHVtbXkgKSA9PSAxICkKKyAgICByZXR1cm4gUVFfR1VFU1Q7CisgIC8vIFVlYmVyZ2ViZW5lciBQYXJhbWV0ZXIgInF1ZXN0bmFtZSIgdW5ndWVsdGlnIG9kZXIgbGVlcj8KKyAgaWYoIXF1ZXN0bmFtZSB8fCAhc3RyaW5ncChxdWVzdG5hbWUpIHx8IHF1ZXN0bmFtZSA9PSAiIikKKyAgICByZXR1cm4gUVFfS0VZX0lOVkFMSUQ7CisgIC8vIFF1ZXN0bmFtZSBpc3QgdGF0c2FlY2hsaWNoIGluIGRlciBRdWVzdGxpc3RlIGVudGhhbHRlbj8gQWxsZXMga2xhciEKKyAgaWYgKCBtZW1iZXIocXVlc3RzLCBxdWVzdG5hbWUpICkKKyAgICByZXR1cm4gT0s7CisgIC8vIEFuc29uc3RlbiB3YXIgZGVyIE5hbWUgd29obCB1bmd1ZWx0aWcuCisgIHJldHVybiBRUV9LRVlfSU5WQUxJRDsKK30KKworaW50IE1vZGlmeVF1ZXN0VGltZShzdHJpbmcgcW5hbWUsIGludCB3aGVuKSB7CisgIGlmICggcHJvY2Vzc19jYWxsKCkgKQorICAgIHJldHVybiAtMTsKKworICAvLyBOdXIgRU0rIG9kZXIgZGVyIFRhZ2VidWNobWFzdGVyIGR1ZXJmZW4gZGllIFdlcnRlIGFlbmRlcm4uCisgIGlmICggIUlTX0FSQ0godGhpc19pbnRlcmFjdGl2ZSgpKSAmJgorICAgIGxvYWRfbmFtZShwcmV2aW91c19vYmplY3QoKSkhPSIvZC93YWxkL2xldXNlbC9xdWVzdC9vYmpzL3RhZ2VidWNoLW1hc3RlciIpCisgICAgcmV0dXJuIC0xOworCisgIC8vIFF1ZXN0bGlzdGUgaXN0IHVuZXJ3YXJ0ZXQga2VpbiBNYXBwaW5nLgorICBpZiAoICFtYXBwaW5ncChxdWVzdHMpICkKKyAgICByZXR1cm4gLTI7CisKKyAgLy8gS2VpbiBRdWVzdG5hbWUgYW5nZWdlYmVuLCBvZGVyIFNwaWVsZXIgaGF0IGRpZXNlIFF1ZXN0IHVlYmVyaGF1cHQgbmljaHQKKyAgLy8gZ2Vsb2VzdC4KKyAgaWYgKCAhc3RyaW5ncChxbmFtZSkgfHwgIW1lbWJlcihxdWVzdHMsIHFuYW1lKSApCisgICAgcmV0dXJuIC0zOworCisgIC8vIERlciBUYWdlYnVjaG1hc3RlciBzZXR6dCBFaW50cmFlZ2UgZ2dmLiBhdWYgMCwgd2VubiBlciBrZWluZSBEYXRlbgorICAvLyBmaW5kZXQsIHVuZCBFTSsgd29sbGVuIEVpbnRyYWVnZSBhdWYgLTEgc2V0emVuIGtvZW5uZW4sIHVtIGRhcyBFaW5sZXNlbgorICAvLyBkZXIgRGF0ZW4gbm9jaCBlaW5tYWwgenUgZXJtb2VnbGljaGVuLCBkLmguIGRpZXNlIFdlcnRlIHNpbmQgenVzYWV0emxpY2gKKyAgLy8genUgZ3VlbHRpZ2VuIFplaXR3ZXJ0ZW4gZXJsYXVidC4KKyAgaWYgKCAhaW50cCh3aGVuKSB8fCB3aGVuIDwgLTEgfHwgd2hlbiA+IHRpbWUoKSApCisgICAgcmV0dXJuIC00OworCisgIC8vIE5ldWVuIFdlcnQgZWludHJhZ2VuLgorICBxdWVzdHNbcW5hbWUsMV0gPSB3aGVuOworICByZXR1cm4gMTsKK30KKworaW50IFF1ZXJ5UXVlc3RUaW1lKHN0cmluZyBxbmFtZSkgeworICByZXR1cm4gcXVlc3RzW3FuYW1lLDFdOworfQorCisvLyBLb252ZXJ0aWVydCBEYXRlbnN0cnVrdHVyIHZvbiBxdWVzdHMgaW4gZWluIE1hcHBpbmcgbWl0IGZvbGdlbmRlbSBBdWZiYXU6CisvLyBxdWVzdHMgPSAoWyAicXVlc3RuYW1lIiA6IEFiZW50ZXVlcnB1bmt0ZTsgWmVpdF9kZXNfUXVlc3RhYnNjaGx1c3NlcywgXSkKK3Byb3RlY3RlZCB2b2lkIHVwZGF0ZXNfYWZ0ZXJfcmVzdG9yZShtaXhlZCBuZXdmbGFnKSB7CisgIC8vIEdhbnogZnJpc2NoZXIgU3BpZWxlcj8gRGFubiBrZWluZSBCZWhhbmRsdW5nIGVyZm9yZGVybGljaC4KKyAgaWYgKCBuZXdmbGFnICkKKyAgICByZXR1cm47CisgIC8vIFdlbm4gZGllIFF1ZXN0bGlzdGUgbm9jaCBrZWluIE1hcHBpbmcgaXN0LCBLb252ZXJ0aWVydW5nIGFuc3Rvc3Nlbi4KKyAgaWYgKCAhbWFwcGluZ3AocXVlc3RzKSApIHsKKyAgICAvLyBXZW5uIG5vY2gga2VpbmUgUXVlc3RzIGVpbmdldHJhZ2VuIHNpbmQsIExlZXJtYXBwaW5nIGVpbnRyYWdlbi4KKyAgICBpZiAoICFzaXplb2YocXVlc3RzKSApIHsKKyAgICAgIHF1ZXN0cyA9IChbOjJdKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gVm9yc2ljaHRzaGFsYmVyIExlZXJlaW50cmFlZ2UgcmF1c3ppZWhlbi4KKyAgICBxdWVzdHMgLT0gKHsoe30pfSk7CisgICAgLy8gTGlzdGUgZGVyIFF1ZXN0emVpdGVuIGF1cyBkZW0gU3BpZWxlciBhdXNsZXNlbi4gV2VubiBuaWNodCB2b3JoYW5kZW4sCisgICAgLy8gQXJyYXkgbWl0IC0xLUVsZW1lbnRlbiBwYXNzZW5kZXIgTGFlbmdlIGVyemV1Z2VuLgorICAgIC8vIC0xIGFuIGFsbGVuIFN0ZWxsZW4gZWludHJhZ2VuLCB3byBiaXNoZXIga2VpbmUgRGF0ZW4gdm9ybGllZ2VuLgorICAgIC8vIERpZXNlIHdlcmRlbiBkYW5uIHZvbSBRdWVzdHRhZ2VidWNoIGR1cmNoIGRpZSBEYXRlbiBlcnNldHp0LgorICAgIGludCAqcXRpbWVzID0gUXVlcnlQcm9wKCJxdWVzdHRpbWUiKXx8YWxsb2NhdGUoc2l6ZW9mKHF1ZXN0cyksIC0xKTsKKyAgICAvLyBGYWxscyBkaWUgUXVlc3RsaXN0ZSBsYWVuZ2VyIGlzdCBhbHMgZGllIFplaXRlbmxpc3RlLCB3aXJkIGxldHp0ZXJlCisgICAgLy8gdW0gZGllIGZlaGxlbmRlIExhZW5nZSBpbiBGb3JtIHZvbiAtMS1laW50cmFlZ2VuIGVyZ2Flbnp0LCB1bnRlciBkZXIKKyAgICAvLyBBbm5haG1lLCBkYXNzIGRpZSBmZWhsZW5kZW4gRWludHJhZWdlIGJpc2hlciBsZWRpZ2xpY2ggbmljaHQKKyAgICAvLyBlaW5nZWxlc2VuIHd1cmRlbi4gSW0gdW1nZWtlaHJ0ZW4gRmFsbCB3ZXJkZW4gYWxsZSBaZWl0ZW4gdmVyd29yZmVuLAorICAgIC8vIGRhIGRpZXNlciBGYWxsIGVpbnRyaXR0LCB3ZW5uIGVpbmVtIFNwaWVsZXIgZWluZSBRdWVzdCBhdXNnZXRyYWdlbgorICAgIC8vIHd1cmRlIHVuZCBkaWUgTGlzdGVuIGluIGRlciBWZXJnYW5nZW5oZWl0IG5pY2h0IHN5bmNocm9uIGdlaGFsdGVuCisgICAgLy8gd3VyZGVuLgorICAgIGlmICggc2l6ZW9mKHF0aW1lcykgPCBzaXplb2YocXVlc3RzKSApIHsKKyAgICAgIHF0aW1lcyArPSBhbGxvY2F0ZShzaXplb2YocXVlc3RzKS1zaXplb2YocXRpbWVzKSwgLTEpOworICAgIH0KKyAgICBpZiAoIHNpemVvZihxdGltZXMpID4gc2l6ZW9mKHF1ZXN0cykgKSB7CisgICAgICBxdGltZXMgPSBhbGxvY2F0ZShzaXplb2YocXVlc3RzKSwgLTEpOworICAgIH0KKyAgICAvLyBRdWVzdGRhdGVuIHVuZCBRdWVzdHplaXRlbiB6dXNhbW1lbnBmZXJjaGVuLiBFcmdpYnQgZm9sZy4gTWFwcGluZzoKKyAgICAvLyB0ZW1wID0gKFsgKHtRdWVzdG5hbWUxLCBRUDF9KSA6IFF1ZXN0emVpdCwgLi4uIF0pCisgICAgbWFwcGluZyB0ZW1wID0gbWttYXBwaW5nKHF1ZXN0cywgcXRpbWVzKTsKKyAgICBxdWVzdHMgPSBtX2FsbG9jYXRlKHNpemVvZihxdWVzdHMpLDIpOworICAgIGZvcmVhY2gobWl4ZWQgcWRhdGEsIGludCBxdGltZSA6IHRlbXApIHsKKyAgICAgIHF1ZXN0cyArPSAoWyBxZGF0YVswXSA6IHFkYXRhWzFdOyBxdGltZSBdKTsKKyAgICB9CisgICAgaWYgKFF1ZXJ5UHJvcCgicXVlc3R0aW1lIikpIHsKKyAgICAgIFNldFByb3AoInF1ZXN0dGltZSIsMCk7CisgICAgICBTZXQoInF1ZXN0dGltZSIsIFNBVkUsIEZfTU9ERV9BRCk7CisgICAgfQorICB9Cit9CisKKy8vICoqKiogbG9jYWwgcHJvcGVydHkgbWV0aG9kcworc3RhdGljIGludCBfcXVlcnlfcXVlc3Rwb2ludHMoKSB7CisgIGludCBxcDsKKworICBpZiAoICFtYXBwaW5ncChxdWVzdHMpIHx8ICFzaXplb2YocXVlc3RzKSApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGNsb3N1cmUgcXFwID0gc3ltYm9sX2Z1bmN0aW9uKCJRdWVyeVF1ZXN0UG9pbnRzIiwgUU0pOworICAvLyBEaWUgYWt0dWVsbCBndWVsdGlnZW4gQWJlbnRldWVycHVua3RlIGF1cyBkZW0gUXVlc3RtYXN0ZXIgaG9sZW4gdW5kCisgIC8vIGRpZSBRdWVzdGxpc3RlIGRhbWl0IGFrdHVhbGlzaWVyZW4uIHFwIHdpcmQgYWxzIFJlZmVyZW56IG1pdCB1ZWJlcmdlYmVuCisgIC8vIGRhbWl0IGRhcyBBZGRpdGlvbnNlcmdlYm5pcyBhdWNoIG5hY2ggZGVtIER1cmNobGF1ZiBhdXNzZXJoYWxiIGRlcgorICAvLyBDbG9zdXJlIHZlcmZ1ZWdiYXIgaXN0LgorICAvLyBGYWxscyBBYmVudGV1ZXJwdW5rdGUgPCAwIGV4aXN0aWVyZW4sIHdpcmQgZGllIGVudHNwcmVjaGVuZGUgUXVlc3QKKyAgLy8gYXVzIGRlciBMaXN0ZSBhdXNnZXRyYWdlbi4KKyAgd2Fsa19tYXBwaW5nKHF1ZXN0cywKKyAgICBmdW5jdGlvbiB2b2lkIChzdHJpbmcgcW5hbWUsIGludCBxcG9pbnRzLCBpbnQgcXRpbWUsIGludCBzdW0pCisgICAgeworICAgICAgcXBvaW50cyA9IGZ1bmNhbGwocXFwLCBxbmFtZSk7CisgICAgICBpZiAocXBvaW50czwwKQorICAgICAgICBtX2RlbGV0ZShxdWVzdHMscW5hbWUpOworICAgICAgZWxzZQorICAgICAgICBzdW0gKz0gcXBvaW50czsKKyAgICB9LCAmcXApOworCisgIFNldChQX1FQLCBxcCk7CisgIHJldHVybiBxcDsKK30KKworc3RhdGljIG1peGVkIF9xdWVyeV9xdWVzdHMoKSB7CisgIHJldHVybiBjb3B5KHF1ZXN0cyk7Cit9CmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL3JlcHV0YXRpb24uYyBiL3N0ZC9wbGF5ZXIvcmVwdXRhdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmYjNkMTcKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL3JlcHV0YXRpb24uYwpAQCAtMCwwICsxLDczIEBACisjcHJhZ21hIHN0cm9uZ190eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisKKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxyZXB1dGF0aW9uLmg+CisKK3ByaXZhdGUgbWFwcGluZyByZXB1dGF0aW9ucyA9IChbIF0pOworCisvKgorICogQXJndW1lbnRlOgorICogcmVwaWQgPSBSZXB1dGF0aW9uLUlEIGltIFJlcG1hc3RlcgorICogdmFsdWUgPSBXZXJ0IHVtIGRlbiBkaWUgUmVwdXRhdGlvbiBnZWFlbmRlcnQgd2VyZGVuIHNvbGwsCisgKiAgICAgICAgIHBvc2l0aXYgb2RlciBuZWdhdGl2CisgKiBzaWxlbnQgPSBLZWluZSBTdGQtTWVsZHVuZyBhdXNnZWJlbgorICoKKyAqIFJldHVybjoKKyAqIFJFUF9SRVRfV1JPTkdBUkdTID0gRmFsc2NoZSBBcmd1bWVudGUKKyAqIFJFUF9SRVRfSU5BQ1RJVkUgPSBSZXAgaW5ha3RpdiAoa2FubiBkZXJ6ZWl0IG5pY2h0IGdlYWVuZGVydCB3ZXJkZW4pCisgKiBSRVBfUkVUX0lOVkFMSURVSUQgPSBVbnp1bGFlc3NpZSBVSUQKKyAqIFJFUF9SRVRfQUxSRUFEWU1BWCA9IFJlcCBiZXJlaXRzIG1heGltdW0gLyBtaW5pbXVtCisgKiBSRVBfUkVUX0lOVkFMSURSRVAgPSBSZXB1dGF0aW9uIG5pY2h0IHZvcmhhbmRlbgorICoKKyAqIFJFUF9SRVRfU1VDQ0VTUyA9IFJlcHV0YXRpb24gd3VyZGUgdmVyYWVuZGVydAorICogUkVQX1JFVF9TVUNDRVNTQ1VUID0gUmVwdXRhdGlvbiB3dXJkZSBhdWYgTWluIC8gTWF4IHZlcmFlbmRlcnQKKyAqLworcHVibGljIHZhcmFyZ3MgaW50IENoYW5nZVJlcHV0YXRpb24oc3RyaW5nIHJlcGlkLCBpbnQgdmFsdWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpbGVudCkgeworICBzdHJpbmcgdWlkLCBjaGFuZ2Vtc2c7IGludCBuZXd2YWw7IG1hcHBpbmcgcmVwOworICAKKyAgaWYoIWludHAodmFsdWUpIHx8ICF2YWx1ZSB8fCAhc3RyaW5ncChyZXBpZCkgfHwgIXNpemVvZihyZXBpZCkpIAorICAgIHJldHVybiBSRVBfUkVUX1dST05HQVJHUzsKKyAgaWYoIW1hcHBpbmdwKHJlcCA9IFJFUE1BU1RFUi0+R2V0UmVwdXRhdGlvbkRhdGEocmVwaWQpKSkKKyAgICByZXR1cm4gUkVQX1JFVF9JTlZBTElEUkVQOworICBpZighKHJlcFsiZmxhZ3MiXSAmIFJFUF9GTEFHX0FDVElWRSkpCisgICAgcmV0dXJuIFJFUF9SRVRfSU5BQ1RJVkU7CisgIGlmKFJFUE1BU1RFUi0+Q2hlY2tWYWxpZFVpZChyZXBpZCwgcHJldmlvdXNfb2JqZWN0KCkpIDwgMSkKKyAgICByZXR1cm4gUkVQX1JFVF9JTlZBTElEVUlEOworICBpZihyZXB1dGF0aW9uc1tyZXBpZF0gPj0gUkVQX01BWElNVU0gfHwgcmVwdXRhdGlvbnNbcmVwaWRdIDw9IFJFUF9NSU5JTVVNKSAKKyAgICByZXR1cm4gUkVQX1JFVF9BTFJFQURZTUFYOworCisgIGlmKHJlcHV0YXRpb25zW3JlcGlkXSArIHZhbHVlID4gUkVQX01BWElNVU0pIAorICAgIG5ld3ZhbCA9IHJlcHV0YXRpb25zW3JlcGlkXSArIHZhbHVlIC0gUkVQX01BWElNVU07CisgIGVsc2UgaWYocmVwdXRhdGlvbnNbcmVwaWRdIC0gdmFsdWUgPCBSRVBfTUlOSU1VTSkKKyAgICBuZXd2YWwgPSByZXB1dGF0aW9uc1tyZXBpZF0gKyB2YWx1ZSArIFJFUF9NSU5JTVVNOworCisgIGlmKCFzaWxlbnQgJiYKKyAgICAgc3RyaW5ncChjaGFuZ2Vtc2cgPSBSRVBNQVNURVItPkdldERlZmF1bHRDaGFuZ2VNc2cocmVwaWQsIAorICAgICAgIG5ld3ZhbCB8fCB2YWx1ZSkpKQorICAgIHRlbGxfb2JqZWN0KHRoaXNfb2JqZWN0KCksIGNoYW5nZW1zZyk7CisKKyAgcmVwdXRhdGlvbnNbcmVwaWRdICs9IG5ld3ZhbCB8fCB2YWx1ZTsKKworICByZXR1cm4gbmV3dmFsID8gUkVQX1JFVF9TVUNDRVNTQ1VUIDogUkVQX1JFVF9TVUNDRVNTOworfQorCisvKgorICogQXJndW1lbnRlOgorICogcmVwaWQgPSBSZXB1dGF0aW9uLUlEIGltIFJlcG1hc3RlcgorICoKKyAqIFJldHVybjoKKyAqIDAgPSBSZXB1dGF0aW9uIG5vY2ggbmljaHQgdmVyYWVuZGVydCAvIGVudGhhbHRlbiAKKyAqICEwID0gUmVwdXRhdGlvbnN3ZXJ0CisgKi8KK3B1YmxpYyBpbnQgR2V0UmVwdXRhdGlvbihzdHJpbmcgcmVwaWQpIHsgcmV0dXJuIHJlcHV0YXRpb25zW3JlcGlkXTsgfQorCisvKgorICogUmV0dXJuOgorICogTWFwcGluZ2tvcGllIGFsbGVyIGdlc3BlaWNoZXJ0ZW4gUmVwdXRhdGlvbnN3ZXJ0CisgKi8KK3B1YmxpYyBtYXBwaW5nIEdldFJlcHV0YXRpb25zKCkgeyByZXR1cm4gY29weShyZXB1dGF0aW9ucyk7IH0KZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvcmVzdHJpY3Rpb25zLmMgYi9zdGQvcGxheWVyL3Jlc3RyaWN0aW9ucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MWUxNGMKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL3Jlc3RyaWN0aW9ucy5jCkBAIC0wLDAgKzEsMTMwIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gcGxheWVyL3Jlc3RyaWN0aW9ucy5jIC0tIGNvbnRhaW5lciBhc3BlY3Qgb2YgcGxheWVycworLy8KKy8vICRJZDogcmVzdHJpY3Rpb25zLmMgOTAyMCAyMDE1LTAxLTEwIDIxOjQ5OjQxWiBaZXNzdHJhICQKKworLy8gVGhpcyBpcyBhIHNpbXBsZSBjb250YWluZXIgdG8gcHV0IG9iamVjdHMgaW4uIEl0IGRlZmluZXMgYWxsIGZ1bmN0aW9ucworLy8gd2hpY2ggYXJlIG5lY2Vzc2FyeSB0byBkZXNjcmliZSBhbiBvYmplY3Qgd2hpY2ggY2FuIGJlIGZpbGxlZCB3aXRoCisvLyBvdGhlciB0aGluZ3MuCisvLworLy8gSXQgd2lsbCBzdXBwb3J0IHJlc3RyaWN0aW9ucyBmb3Igdm9sdW1lLCB3ZWlnaHQgZXRjLgorLy8KKy8vIFRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBhcmUgZGVmaW5lZDoKKy8vIFBfTUFYX1dFSUdIVCAtIG1heGltdW0gd2VpZ2h0IHdoaWNoIGNvbnRhaW5lciBjYW4gY2FycnkKKy8vIFBfV0VJR0hUX0NPTlRFTlRTIC0gY3VycmVudCBjb250ZW50cworLy8gUF9XRUlHSFQgLSBidWlsdGluIHByb3BlcnR5OiByZWFkLT50b3RhbCB3ZWlnaHQsIHdyaXRlLT5vd24gd2VpZ2h0CisvLworLy8gRnVuY3Rpb25zIGZvciBtYW5pcHVsYXRpb24gb2Ygd2VpZ2h0CisvLyBNYXlBZGRXZWlnaHQod2VpZ2h0KSAtIENhbiA8d2VpZ2h0PiBiZSBpbnNlcnRlZD8KKy8vIEFkZFdlaWdodCh3ZWlnaHQpIC0gQWRkIGFuIGFtb3VudCBvZiA8d2VpZ2h0PgorLy8KKy8vIElNUE9SVEFOVDogdW5pdCBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgZ3JhbXMgKGcpLgorI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCitpbmhlcml0ICIvc3RkL2NvbnRhaW5lci9yZXN0cmljdGlvbnMiOworCisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPHRoaW5nL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxob29rLmg+CisjaW5jbHVkZSA8bGl2aW5nL3NraWxscy5oPgorI2luY2x1ZGUgPGF0dHJpYnV0ZXMuaD4KKyN1bmRlZiBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8Y29udGFpbmVyLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPG5ld19za2lsbHMuaD4KKworLy9MaXN0ZSB2b24gT2JqZWt0ZW4sIGluIGRlbmVuIEluc2VydE5vdGlmeSgpIGdlcnVmZW4gd2lyZCwgd2VubiBldHdhcyBpbiBkZW4KKy8vU3BpZWxlciBiZXdlZ3Qgd3VyZGUuCitub3NhdmUgb2JqZWN0ICpJbnNlcnRIb29rcz0oe30pOworCisvLyBsb2NhbCBwcm9wZXJ0aWVzIHByb3RvdHlwZXMKK3N0YXRpYyBpbnQgX3F1ZXJ5X21heF93ZWlnaHQoKTsKK3N0YXRpYyBtaXhlZCBfc2V0X2Zyb2cobWl4ZWQgYXJnKTsKKwordm9pZCBjcmVhdGUoKQoreworICA6OmNyZWF0ZSgpOworCisgIFNldChQX01BWF9XRUlHSFQsIE5PU0VUTUVUSE9ELCBGX1NFVF9NRVRIT0QpOworICBTZXQoUF9NQVhfV0VJR0hULCBTRUNVUkVELCBGX01PREUpOworICBvZmZlckhvb2soSF9IT09LX0lOU0VSVCwgMSk7Cit9CisKKy8vICoqKiogbG9jYWwgcHJvcGVydHkgbWV0aG9kcworc3RhdGljIGludCBfcXVlcnlfbWF4X3dlaWdodCgpIHsKKyAgaW50IHN0cix2YWw7CisgIG1peGVkIHNraTsKKyAgCisgIGlmIChRdWVyeVByb3AoUF9HSE9TVCkgJiYgIUlTX1dJWkFSRChNRSkpCisgICAgcmV0dXJuIDA7CisgIHN0cj1RdWVyeUF0dHJpYnV0ZShBX1NUUik7CisgIHNraSA9IFVzZVNraWxsKFNLX0NBUlJZLCAoW1NJX1NLSUxMQVJHIDogc3RyIF0pKTsKKworICBpZiAoIWludHAoc2tpKSkKKyAgICBza2kgPSAwOworICAKKyAgaWYgKHN0cjwwKSB7CisgICAgdmFsPTkyMDArc3RyKjE2MCsoaW50KXNraTsKKyAgICBpZiAodmFsPDMwMDApIHZhbD0zMDAwOworICAgIHJldHVybiB2YWw7CisgIH0KKyAgdmFsID0gOTIwMCtzdHIqODAwKyhpbnQpc2tpOworICBpZiAodmFsPDMwMDApCisgICAgdmFsID0gMzAwMDsKKyAgcmV0dXJuIHZhbDsKK30KKworc3RhdGljIG1peGVkIF9zZXRfZnJvZyhtaXhlZCBhcmcpIHsKKyAgbWl4ZWQgcmVzOworICAKKyAgcmVzPVNldChQX0ZST0csYXJnKTsKKyAgaWYgKHJlcykKKyAgICBTZXRQcm9wKFBfQVRUUklCVVRFU19NT0RJRklFUiwoeyIjZnJvc2NoIiwoW0FfU1RSOi0zMF0pfSkpOworICBlbHNlCisgICAgU2V0UHJvcChQX0FUVFJJQlVURVNfTU9ESUZJRVIsKHsiI2Zyb3NjaCIsMCB9KSk7CisgIHJldHVybiByZXM7Cit9CisKK3B1YmxpYyB2b2lkIE5vdGlmeUluc2VydChvYmplY3Qgb2IsIG9iamVjdCBvbGRlbnYpCit7CisgIDo6Tm90aWZ5SW5zZXJ0KG9iLCBvbGRlbnYpOworICAvLyBBbGxlIExpc3RlbmVyIGltIG5ldWVuIEhvb2tzeXN0ZW0gdm9tIEluc2VydEhvb2sgaW5mb3JtaWVyZW4KKyAgSG9va0Zsb3coSF9IT09LX0lOU0VSVCwgb2IpOworICAvLyBBbGxlIExpc3RlbmVyIGltIGFsdGVuIEluc2VydEhvb2sgaW5mb3JtaWVyZW4KKyAgaWYgKHNpemVvZihJbnNlcnRIb29rcykpCisgIHsKKyAgICBmb3JlYWNoKG9iamVjdCBoOiAmSW5zZXJ0SG9va3MpCisgICAgeworICAgICAgaWYgKGggJiYgZW52aXJvbm1lbnQoaCkgPT0gTUUpCisgICAgICAgIGgtPkluc2VydE5vdGlmeShvYik7CisgICAgICBlbHNlCisgICAgICAgIGg9MDsKKyAgICB9CisgICAgSW5zZXJ0SG9va3MtPSh7MH0pOyAvLyBnZW51bGx0ZSBFbGVtZW50ZSBsb2VzY2hlbgorICB9Cit9CisKK3ZvaWQgQWRkSW5zZXJ0SG9vayhvYmplY3Qgb2IpCit7CisgIGlmIChtZW1iZXIoSW5zZXJ0SG9va3Msb2IpIT0tMSB8fCBlbnZpcm9ubWVudChvYikhPXRoaXNfb2JqZWN0KCkpCisgICAgcmV0dXJuOworICBJbnNlcnRIb29rcys9KHtvYn0pOworfQorCit2b2lkIFJlbW92ZUluc2VydEhvb2sob2JqZWN0IG9iKQoreworICBJbnNlcnRIb29rcy09KHtvYn0pOworfQorCitvYmplY3QgKlF1ZXJ5SW5zZXJ0SG9va3MoKQoreworICByZXR1cm4gSW5zZXJ0SG9va3M7Cit9CisKZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvc2hhZG93cy9hcmtfaHVuZ2VyX3NoYWRvdy5jIGIvc3RkL3BsYXllci9zaGFkb3dzL2Fya19odW5nZXJfc2hhZG93LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJkNmRmZgotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvc2hhZG93cy9hcmtfaHVuZ2VyX3NoYWRvdy5jCkBAIC0wLDAgKzEsNTQgQEAKKy8qIERlciBTaGFkb3cgZnVlciBkZW4gSHVuZ2VyZmx1Y2ggKi8KKy8qIC9kL2ViZW5lL2Fyay93b2xmL29iai9odW5nZXIuYyAgKi8KKy8qIFNoYWRvdzogL3N0ZC9wbGF5ZXIvc2hhZG93cy9hcmtfaHVuZ2VyX3NoYWRvdy5jICovCisvKiBPcmlnaW5hbDogL2QvZWJlbmUvYXJrL3dvbGYvb2JqL2h1bmdlcl9vYmouYyAqLworCisjcHJhZ21hIHN0cm9uZ190eXBlcyxzYXZlX3R5cGVzCisKKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCisjZGVmaW5lIEJTIGJyZWFrX3N0cmluZworCitvYmplY3Qgc3BpZWxlcjsKKwordm9pZCBTZXR6ZW4ob2JqZWN0IHNwKQoreworIGlmICghb2JqZWN0cChzcCkgfHwgIWludGVyYWN0aXZlKHNwKSkgcmV0dXJuIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOworIHNwaWVsZXI9c3A7CisgaWYgKCFzaGFkb3coc3AsMSkpIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOworfQorCitpbnQgX3F1ZXJ5X2Zvb2QoKSB7IHJldHVybiAwOyB9CisKK2ludCBfcXVlcnlfbWF4X2Zvb2QoKSB7IHJldHVybiAwOyB9CisKK2ludCBlYXRfZm9vZChpbnQgc3RyZW5ndGgsIGludCB0ZXN0b25seSkKK3sKKyBpZiAoc3RyZW5ndGg9PTApIHJldHVybiAxOworIGlmIChzdHJlbmd0aD4wKQorIHsKKyAgc3RyZW5ndGg9MDsKKyAgaWYgKHNwaWVsZXIpCisgIHsKKyAgICB0ZWxsX29iamVjdChzcGllbGVyLCBCUygiRHUgaGFzdCB6d2FyIGVpbmVuIHRpZXJpc2NoZW4gSHVuZ2VyLCBkb2NoIGlyZ2VuZHdhcyBzYWd0IERpciwgZGFzcyBEdSBkYXMsIHdhcyAiKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEdSBnZXJhZGUgZXNzZW4gd2lsbHN0LCBuaWNodCBtZWhyIGluIERlaW5lbiBNYWdlbiBiZWtvbW1zdC4gRGFzIGlzdCB6aWVtbGljaCAiKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZWZhZWhybGljaCwgaG9mZmVudGxpY2ggdmVyaHVuZ2Vyc3QgRHUgbmljaHQgISIsIDc4KSk7CisgICAgcmV0dXJuIDA7CisgIH0KKyB9CisgZWxzZQorIHsKKyAgaWYgKHNwaWVsZXIpCisgIHsKKyAgIHRlbGxfb2JqZWN0KHNwaWVsZXIsIEJTKCJEZWluIEh1bmdlciB2ZXJ0aWVmdCBzaWNoIHNvIG51ciwgRHUgbGVpZGVzdCBIb2VsbGVucXVhbGVuLiIsIDc4KSk7CisgICBzcGllbGVyLT5yZWR1Y2VfaGl0X3BvaW50cyhzdHJlbmd0aCk7CisgIH0KKyAgcmV0dXJuIDA7CisgfQorfQorCit2b2lkIExvZXNjaGVuKCkgeworICAgIHVuc2hhZG93KCk7CisgICAgZGVzdHJ1Y3QodGhpc19vYmplY3QoKSk7Cit9CmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL3NoYWRvd3MvYmxvY2tfc2hhZG93LmMgYi9zdGQvcGxheWVyL3NoYWRvd3MvYmxvY2tfc2hhZG93LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdhNDMzMwotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvc2hhZG93cy9ibG9ja19zaGFkb3cuYwpAQCAtMCwwICsxLDQ3IEBACisjcHJhZ21hIHN0cm9uZ190eXBlcyxzYXZlX3R5cGVzCisKKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8bW92aW5nLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisKK3ByaXZhdGUgbm9zYXZlIG9iamVjdCBwbDsKKwordm9pZCBjcmVhdGUoKQoreworICBpZiggSVNfQkxVRShNRSkgKSByZXR1cm47CisgIHNoYWRvdyggUEwsIDEpOworICBwbCA9IFBMOworfQorCitpbnQKK0FkZEV4cChpbnQgZXApCit7CisgIG9iamVjdCBibG9jazsKKyAgaW50IGRpZmYsIGxpbTsKKworICBibG9jayA9IHByZXNlbnQoIlxuIGJsb2NrIiwgcGwpOworICBsaW0gPSAzMCArIHJhbmRvbSgxMCk7CisKKyAgaWYgKCBlcCA+IGxpbSAmJgkJCQkgICAgICAvLyBNaW5kZXN0d2VydAorICAgICAgIHByZXZpb3VzX29iamVjdCgpICYmCisgICAgICAgKCBwcmV2aW91c19vYmplY3QoKSA9PSBwbCB8fAkJICAgICAgLy8gekIuIEdpdmVRdWVzdCgpCisJICggbGl2aW5nKHByZXZpb3VzX29iamVjdCgpKSAmJiAJICAgICAgLy8gT2RlciBOUENzCisJICAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShwcmV2aW91c19vYmplY3QoKSkKKwkgKQorICAgICAgICkKKyAgICAgKQorICB7CisgICAgZGlmZiA9IGJsb2NrLT5HdXRzY2hyZWliZW4oZXAtbGltKTsKKyAgICByZXR1cm4gcGwtPkFkZEV4cChsaW0rZGlmZik7CisgIH0KKyAgcmV0dXJuIHBsLT5BZGRFeHAoZXApOworfQorCit2b2lkCitTZWhlckhhdEdlbnVnKCkKK3sKKyAgdW5zaGFkb3coKTsKKyAgZGVzdHJ1Y3QodGhpc19vYmplY3QoKSk7Cit9CisKZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvc2hhZG93cy9tb3JwaF9zaGFkb3cuYyBiL3N0ZC9wbGF5ZXIvc2hhZG93cy9tb3JwaF9zaGFkb3cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmM5N2M0Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9zaGFkb3dzL21vcnBoX3NoYWRvdy5jCkBAIC0wLDAgKzEsNTk4IEBACisvKiAtKi0gbHBjIC0qLSAqLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgbW9ycGguYworLy8KKy8vICAgKGMpIFRyb3kgKHRyb3lAbWcubXVkLmRlKQorLy8gICBLb3BpZXJlbiwgVmVyYWVuZGVybiBvZGVyIFdlaXRlcmdhYmU6IG5hIGtsYXIsIGltbWVyIHp1LCBqZSBzY2hsaW1tZXIgCisvLyAgIHVtIHNvIGJlc3NlcgorLy8KKy8vICAgT2JqZWt0IGVyc3RlbGx0OiAxNC4wOC4wMSwgVHJveQorLy8KKy8vICAgRGllc2VyIHNoYWRvdyBpbXBsZW1lbnRpZXJ0IGdlbmVyaXNjaGUgVmVyd2FuZGx1bmdlbi4gSW0gR2VnZW5zYXR6IG9kZXIKKy8vICAgaW4gRXJn5G56dW5nIHp1bSBUYXJuaGVsbSBzaW5kIGRpZXNlIG5pY2h0IGF1ZiBkaWUgQmVzY2hyZWlidW5nCisvLyAgIGJlc2NocuRua3QsIHNvbmRlcm4gc2NobGFnZW4gc2ljaCBhdWNoIGluIGFuZGVyZW4gUHJvcGVydGllcyBuaWVkZXIuCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaW5jbHVkZSA8bW92aW5nLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHNhdmVfdHlwZXMKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2YXJhcmdzIGludCByZW1vdmUoIGludCBzaWxlbnQgKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgUHJvcGVydHktRWluc3RlbGx1bmdlbiBqZSBuYWNoIFJhc3NlCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitwcml2YXRlIG1hcHBpbmcgbW9ycGhfcHJvcGVydGllczsKKworcHJpdmF0ZSBvYmplY3QgcGw7IC8vIGRlciBzY2hhdHRpZXJ0ZSBTcGllbGVyCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIHN0YXJ0X3NoYWRvdyggU3BpZWxlciwgUHJvcGVydGllcyApCisvLworLy8gICBTdGFydGV0IGRhcyBTaGFkb3dpbmcgdm9uIFNwaWVsZXIuIFByb3BlcnRpZXMgaXN0IGVpbiBNYXBwaW5nIG1pdAorLy8gICBkZW4genUg5G5kZXJuZGVuIFByb3BlcnRpZXMuIERvcnQgbmljaHQgdm9yaGFuZGVuZSBQcm9wZXJ0aWVzIHdlcmRlbgorLy8gICB6dW0gU3BpZWxlciBkdXJjaGdlcmVpY2h0LiBFcyB3ZXJkZW4gZG9ydCBlbnR3ZWRlciBlaW56ZWxuZSBXZXJ0ZQorLy8gICBlcndhcnRldCAoQmVpc3BpZWw6IChbIFBfR0VOREVSOiBNQUxFIF0pKSwgZGllIGRhbm4gZvxyIGFsbGUgUmFzc2VuCisvLyAgIGdlbHRlbiwgb2RlciBjbG9zdXJlcywgZGllIGRhbm4gYXVzZ2Vm/GhydCB3ZXJkZW4gdW50ZXIg3GJlcmdhYmUgZGVyCisvLyAgIFNwaWVsZXJyYXNzZSBhbHMgUGFyYW1ldGVyIG9kZXIgYWJlciBNYXBwaW5ncyBtaXQgZGVuIFJhc3Nlbm5hbWVuCisvLyAgIChCZWlzcGllbDogKFsgUF9HRU5ERVI6IChbICJNZW5zY2giOiBORVVURVIsICJFbGYiOiBGRU1BTEUsCisvLyAgICJad2VyZyI6IE1BTEUsIC4uLiBdKaBdKSkuIElzdCBlaW5lIFJhc3NlIGluIGRlbSBSYXNzZW5tYXBwaW5nIG5pY2h0CisvLyAgIHZvcmhhbmRlbiwgc28gd2lyZCBkYXMgUHJvcGVydHkgenVtIFNwaWVsZXIgZHVyY2hnZXJlaWNodC4gU3BlemllbGwKKy8vICAgYmVoYW5kZWx0IHdlcmRlbiBQX0lEUyAoc2llaGUgX3F1ZXJ5X2lkcygpKSB1bmQgUF9OQU1FIChzaWVoZQorLy8gICBfcXVlcnlfbmFtZSgpKS4gCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW50IHN0YXJ0X3NoYWRvdyggb2JqZWN0IF9wbCwgbWFwcGluZyBwcmVzZXQgKQoreworICBpZiAoICFjbG9uZXAoIHRoaXNfb2JqZWN0KCkgKSApCisgICAgcmV0dXJuIDE7CisgIGlmICggIV9wbCB8fCAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZSggX3BsICkgKQorICAgIHJldHVybiByZW1vdmUoKTsKKyAgcGwgPSBfcGw7CisgIG1vcnBoX3Byb3BlcnRpZXMgPSBkZWVwX2NvcHkoIHByZXNldCApOworICBzaGFkb3coIHBsLCAxICk7CisgIHJldHVybiAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gICBzdG9wX3NoYWRvdygpCisvLworLy8gICBCZWVuZGV0IGRhcyBTaGFkb3dpbmcgdW5kIHplcnN09nJ0IGRpZXNlcyBPYmpla3QKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQgc3RvcF9zaGFkb3coIC8qIHZvaWQgKi8gKQoreworICBpZiAoICFjbG9uZXAoIHRoaXNfb2JqZWN0KCkgKSApCisgICAgcmV0dXJuIDA7CisgIHVuc2hhZG93KCk7CisgIHJldHVybiByZW1vdmUoKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgX3F1ZXJ5X3Byb3BlcnR5KCBQcm9wZXJ0eSApCisvLworLy8gICBHZW5lcmlzY2hlIFByb3BlcnR5LU1hc2tpZXJ1bmcuIGxpZWZlcnQgYXVzIG1vcnBoX3Byb3BlcnRpZXMgZGVuIHp1cgorLy8gICBSYXNzZSBkZXMgVHLkZ2VycyBwYXNzZW5kZW4gRWludHJhZy4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitub21hc2sgc3RhdGljIG1peGVkIF9xdWVyeV9wcm9wZXJ0eSggc3RyaW5nIHByb3AgKQoreworICBzdHJpbmcgcmFjZTsKKworICAvLyBSYXNzZSBob2xlbi4KKyAgaWYgKCBJU19MRUFSTkVSKHBsKSApCisgICAgcmFjZSA9ICJNYWdpZXIiOworICBlbHNlIC8vIF9xdWVyeV9yYWNlKCkgaXN0IG5vdHdlbmRpZywgdW0gY2xvc3VyZXMgenUgdW1nZWhlbi4KKyAgICByYWNlID0gcGwtPl9xdWVyeV9yYWNlKCk7CisKKyAgaWYgKCBtZW1iZXIoIG1vcnBoX3Byb3BlcnRpZXMsIHByb3AgKSA9PSAwICkKKyAgICByZXR1cm4gcGwtPlF1ZXJ5KCBwcm9wICk7CisgIGlmICggY2xvc3VyZXAoIG1vcnBoX3Byb3BlcnRpZXNbIHByb3AgXSApICkKKyAgICByZXR1cm4gZnVuY2FsbCggbW9ycGhfcHJvcGVydGllc1sgcHJvcCBdLCByYWNlICk7CisgIGlmICggbWFwcGluZ3AoIG1vcnBoX3Byb3BlcnRpZXNbIHByb3AgXSApICkKKyAgeworICAgIGlmICggbWVtYmVyKCBtb3JwaF9wcm9wZXJ0aWVzWyBwcm9wIF0sIHJhY2UgKSA9PSAwICkKKyAgICAgIHJldHVybiBwbC0+UXVlcnkoIHByb3AgKTsKKyAgICBpZiAoIGNsb3N1cmVwKCBtb3JwaF9wcm9wZXJ0aWVzWyBwcm9wIF1bIHJhY2UgXSApICkKKyAgICAgIHJldHVybiBmdW5jYWxsKCBtb3JwaF9wcm9wZXJ0aWVzWyBwcm9wIF1bIHJhY2UgXSApOworCisgICAgcmV0dXJuIG1vcnBoX3Byb3BlcnRpZXNbIHByb3AgXVsgcmFjZSBdOworICB9CisgIHJldHVybiBtb3JwaF9wcm9wZXJ0aWVzWyBwcm9wIF07Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIF9xdWVyeV9hcnRpY2xlKCkKKy8vCisvLyAgIFByb3BlcnR5LU1hc2tpZXJ1bmcgZvxyIFBfQVJUSUNMRQorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ludCBfcXVlcnlfYXJ0aWNsZSggLyogdm9pZCAqLyApCit7CisgIHJldHVybiAoaW50KV9xdWVyeV9wcm9wZXJ0eSggUF9BUlRJQ0xFICk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIF9xdWVyeV9hdmVyYWdlX3NpemUoKQorLy8KKy8vICAgUHJvcGVydHktTWFza2llcnVuZyBm/HIgUF9BVkVSQUdFX1NJWkUKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQgX3F1ZXJ5X2F2ZXJhZ2Vfc2l6ZSggLyogdm9pZCAqLyApCit7CisgIHJldHVybiAoaW50KV9xdWVyeV9wcm9wZXJ0eSggUF9BVkVSQUdFX1NJWkUgKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgX3F1ZXJ5X2F2ZXJhZ2Vfd2VpZ2h0KCkKKy8vCisvLyAgIFByb3BlcnR5LU1hc2tpZXJ1bmcgZvxyIFBfQVZFUkFHRV9XRUlHSFQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQgX3F1ZXJ5X2F2ZXJhZ2Vfd2VpZ2h0KCAvKiB2b2lkICovICkKK3sKKyAgcmV0dXJuIChpbnQpX3F1ZXJ5X3Byb3BlcnR5KCBQX0FWRVJBR0VfV0VJR0hUICk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIF9xdWVyeV9ib2R5KCkKKy8vCisvLyAgIFByb3BlcnR5LU1hc2tpZXJ1bmcgZvxyIFBfQk9EWQorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ludCBfcXVlcnlfYm9keSggLyogdm9pZCAqLyApCit7CisgIHJldHVybiAoaW50KV9xdWVyeV9wcm9wZXJ0eSggUF9CT0RZICk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIF9xdWVyeV9nZW5kZXIoKQorLy8KKy8vICAgUHJvcGVydHktTWFza2llcnVuZyBm/HIgUF9HRU5ERVIKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQgX3F1ZXJ5X2dlbmRlciggLyogdm9pZCAqLyApCit7CisgIHJldHVybiAoaW50KV9xdWVyeV9wcm9wZXJ0eSggUF9HRU5ERVIgKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgX3F1ZXJ5X2hhbmRzKCkKKy8vCisvLyAgIFByb3BlcnR5LU1hc2tpZXJ1bmcgZvxyIFBfSEFORFMKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittaXhlZCBfcXVlcnlfaGFuZHMoIC8qIHZvaWQgKi8gKQoreworICByZXR1cm4gX3F1ZXJ5X3Byb3BlcnR5KCBQX0hBTkRTICk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIF9xdWVyeV9pZHMoKQorLy8KKy8vICAgUHJvcGVydHktTWFza2llcnVuZyBm/HIgUF9JRFMgLSBOaWNodC1TdGFuZGFyZCwgZGEgamUgbmFjaCBVcnNwcnVuZ3MtCisvLyAgIGdlc2NobGVjaHQgZGVzIFNwaWVsZXJzIHp1c+R0emxpY2hlIGlkcyBm5GxsaWcgd2VyZGVuLiBBYmxhdWY6IEVzIGdpYnQKKy8vICAgNSBTY2hyaXR0ZSwgYmVpIGRlcmVuIGpld2VpbGlnZW0gVmVyc2FnZW4gZGllIGlkcyBkZXMgU3BpZWxlcnMgZHVyY2gtCisvLyAgIGdlcmVpY2h0IHdlcmRlbjoKKy8vICAgMS4gUF9JRFMgaXN0IGltIHByb3BlcnR5LW1hcHBpbmcgdm9yaGFuZGVuCisvLyAgIDIuIGEpIGVzIGlzdCBlaW4gc3RyaW5nIG9kZXIgZWluIGFycmF5OiBlcyB3aXJkIGFuIGRpZSBpZHMgZGVzIFNwaWVsZXJzCisvLyAgICAgICAgIGFuZ2Vo5G5ndCB1bmQgenVy/GNrZ2VnZWJlbi4KKy8vICAgICAgYikgZXMgaXN0IGVpbmUgY2xvc3VyZS4gRGllc2Ugd2lyZCBhdXNnZWb8aHJ0IHVudGVyINxiZXJnYWJlIGRlcgorLy8gICAgICAgICBTcGllbGVyLWlkcywgZGVyIFJhc3NlIGRlcyBTcGllbGVycyB1bmQgZGVyIEdlc2NobGVjaHRlcgorLy8gICAgICAgICAoZGllc2VzIE9iamVrdHMgdW5kIGRlcyBTcGllbGVycykuIERlciBFcmdlYm5pc3dlcnQgZGVyIGNsb3N1cmUKKy8vICAgICAgICAgd2lyZCBkaXJla3QgenVy/GNrZ2VnZWJlbi4KKy8vICAgICAgYykgZXMgaXN0IGVpbiBtYXBwaW5nLiBIaWVyIG5laG1lbiB3aXIgbnVuIGRhcyD8YmxpY2hlIFJhc3Nlbm5hbWVuLQorLy8gICAgICAgICBtYXBwaW5nIGFuIC0+IDMuKQorLy8gICAzLiBG/HIgZGllIFJhc3NlIGRlcyBTcGllbGVycyB3aXJkIGVpbiBFaW50cmFnIGdlc3VjaHQKKy8vICAgICAgYSkgZXIgaXN0IGVpbiBzdHJpbmcgb2RlciBlaW4gYXJyYXk6IGVyIHdpcmQgYW4gZGllIGlkcyBkZXMgU3BpZWxlcnMKKy8vICAgICAgICAgYW5nZWjkbmd0IHVuZCB6dXL8Y2tnZWdlYmVuLgorLy8gICAgICBiKSBlciBpc3QgZWluZSBjbG9zdXJlLiBEaWVzZSB3aXJkIGF1c2dlZvxocnQgdW50ZXIg3GJlcmdhYmUgZGVyCisvLyAgICAgICAgIFNwaWVsZXItaWRzLCBkZXIgUmFzc2UgZGVzIFNwaWVsZXJzIHVuZCBkZXIgR2VzY2hsZWNodGVyCisvLyAgICAgICAgIChkaWVzZXMgT2JqZWt0cyB1bmQgZGVzIFNwaWVsZXJzKS4gRGVyIEVyZ2Vibmlzd2VydCBkZXIgY2xvc3VyZQorLy8gICAgICAgICB3aXJkIGRpcmVrdCB6dXL8Y2tnZWdlYmVuLgorLy8gICAgICBjKSBlciBpc3QgZWluIG1hcHBpbmcuIEVzIHdpcmQgYW5nZW5vbW1lbiwgZGFzcyBqZSBHZXNjaGxlY2h0IERJRVNFUworLy8gICAgICAgICBPYmpla3RzIGVpbiBFaW50cmFnIHZvcmhhbmRlbiBpc3QuIC0+IDQuKQorLy8gICA0LiBG/HIgZGFzIEdlc2NobGVjaHQgZGllc2VzIE9iamVrdHMgd2lyZCBlaW4gRWludHJhZyBnZXN1Y2h0CisvLyAgICAgIGEpIGVyIGlzdCBlaW4gc3RyaW5nIG9kZXIgZWluIGFycmF5OiBlciB3aXJkIGFuIGRpZSBpZHMgZGVzIFNwaWVsZXJzCisvLyAgICAgICAgIGFuZ2Vo5G5ndCB1bmQgenVy/GNrZ2VnZWJlbi4KKy8vICAgICAgYikgZXIgaXN0IGVpbmUgY2xvc3VyZS4gRGllc2Ugd2lyZCBhdXNnZWb8aHJ0IHVudGVyINxiZXJnYWJlIGRlcgorLy8gICAgICAgICBTcGllbGVyLWlkcywgZGVyIFJhc3NlIGRlcyBTcGllbGVycyB1bmQgZGVyIEdlc2NobGVjaHRlcgorLy8gICAgICAgICAoZGllc2VzIE9iamVrdHMgdW5kIGRlcyBTcGllbGVycykuIERlciBFcmdlYm5pc3dlcnQgZGVyIGNsb3N1cmUKKy8vICAgICAgICAgd2lyZCBkaXJla3QgenVy/GNrZ2VnZWJlbi4KKy8vICAgICAgYykgZXIgaXN0IGVpbiBtYXBwaW5nLiBFcyB3aXJkIGFuZ2Vub21tZW4sIGRhc3MgamUgR2VzY2hsZWNodCBERVMKKy8vICAgICAgICAgU3BpZWxlcnMgZWluIEVpbnRyYWcgdm9yaGFuZGVuIGlzdC4gLT4gNS4pCisvLyAgIDUuIEb8ciBkYXMgR2VzY2hsZWNodCBkZXMgU3BpZWxlcnMgd2lyZCBlaW4gRWludHJhZyBnZXN1Y2h0CisvLyAgICAgIGEpIGVyIGlzdCBlaW4gc3RyaW5nIG9kZXIgZWluIGFycmF5OiBlciB3aXJkIGFuIGRpZSBpZHMgZGVzIFNwaWVsZXJzCisvLyAgICAgICAgIGFuZ2Vo5G5ndCB1bmQgenVy/GNrZ2VnZWJlbi4KKy8vICAgICAgYikgZXIgaXN0IGVpbmUgY2xvc3VyZS4gRGllc2Ugd2lyZCBhdXNnZWb8aHJ0IHVudGVyINxiZXJnYWJlIGRlcgorLy8gICAgICAgICBTcGllbGVyLWlkcywgZGVyIFJhc3NlIGRlcyBTcGllbGVycyB1bmQgZGVyIEdlc2NobGVjaHRlcgorLy8gICAgICAgICAoZGllc2VzIE9iamVrdHMgdW5kIGRlcyBTcGllbGVycykuIERlciBFcmdlYm5pc3dlcnQgZGVyIGNsb3N1cmUKKy8vICAgICAgICAgd2lyZCBkaXJla3QgenVy/GNrZ2VnZWJlbi4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittaXhlZCBfcXVlcnlfaWRzKCAvKiB2b2lkICovICkKK3sKKyAgc3RyaW5nIHJhY2U7CisgIG1peGVkIGlkczsKKyAgaW50IGdlbmRlciwgc2dlbmRlcjsKKworICAvLyBUZXN0IDEuCisgIGlkcyA9IHBsLT5RdWVyeSggUF9JRFMgKTsKKyAgaWYgKCBtZW1iZXIoIG1vcnBoX3Byb3BlcnRpZXMsIFBfSURTICkgPT0gMCApCisgICAgcmV0dXJuIGlkczsKKworICAvLyBSYXNzZSBob2xlbi4KKyAgaWYgKCBJU19MRUFSTkVSKHBsKSApCisgICAgcmFjZSA9ICJNYWdpZXIiOworICBlbHNlIC8vIF9xdWVyeV9yYWNlKCkgaXN0IG5vdHdlbmRpZywgdW0gY2xvc3VyZXMgenUgdW1nZWhlbi4KKyAgICByYWNlID0gcGwtPl9xdWVyeV9yYWNlKCk7CisKKyAgLy8gR2VzY2hsZWNodGVyIGhvbGVuCisgIGdlbmRlciA9IF9xdWVyeV9nZW5kZXIoKTsKKyAgc2dlbmRlciA9IHBsLT5RdWVyeSggUF9HRU5ERVIgKTsKKworICAvLyBUZXN0IDIuCisgIC8vIHN0cmluZz8gRGFubiBlaW5mYWNoIGRlbiBub3JtYWxlbiBpZHMgZGF6dSwgZ2VuYXVzbyBtaXQgYXJyYXkKKyAgaWYgKCBzdHJpbmdwKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdICkgKQorICAgIHJldHVybiBpZHMgKyAoeyBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdIH0pOworICBpZiAoIHBvaW50ZXJwKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdICkgKQorICAgIHJldHVybiBpZHMgKyBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdOworICBpZiAoIGNsb3N1cmVwKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdICkgKQorICAgIHJldHVybiBmdW5jYWxsKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdLCBpZHMsIHJhY2UsIGdlbmRlciwgc2dlbmRlciApOworICAvLyBmYWxscyBrZWluIG1hcHBpbmcsIGRhbm4gcmF1cworICBpZiAoICFtYXBwaW5ncCggbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXSApICkKKyAgICByZXR1cm4gaWRzOworCisgIC8vIFRlc3QgMy4KKyAgaWYgKCBtZW1iZXIoIG1vcnBoX3Byb3BlcnRpZXNbIFBfSURTIF0sIHJhY2UgKSA9PSAwICkKKyAgICByZXR1cm4gaWRzOworICBpZiAoIHN0cmluZ3AoIG1vcnBoX3Byb3BlcnRpZXNbIFBfSURTIF1bIHJhY2UgXSApICkKKyAgICByZXR1cm4gaWRzICsgKHsgbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdIH0pOworICBpZiAoIHBvaW50ZXJwKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdWyByYWNlIF0gKSApCisgICAgcmV0dXJuIGlkcyArIG1vcnBoX3Byb3BlcnRpZXNbIFBfSURTIF1bIHJhY2UgXTsKKyAgaWYgKCBjbG9zdXJlcCggbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdICkgKQorICAgIHJldHVybiBmdW5jYWxsKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdWyByYWNlIF0sIGlkcywgcmFjZSwgZ2VuZGVyLCBzZ2VuZGVyICk7CisgIC8vIGZhbGxzIGtlaW4gbWFwcGluZywgZGFubiByYXVzCisgIGlmICggIW1hcHBpbmdwKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdWyByYWNlIF0gKSApCisgICAgcmV0dXJuIGlkczsKKworICAvLyBUZXN0IDQuCisgIGlmICggbWVtYmVyKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdWyByYWNlIF0sIGdlbmRlciApID09IDAgKQorICAgIHJldHVybiBpZHM7CisgIGlmICggc3RyaW5ncCggbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdWyBnZW5kZXIgXSApICkKKyAgICByZXR1cm4gaWRzICsgKHsgbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdWyBnZW5kZXIgXSB9KTsKKyAgaWYgKCBwb2ludGVycCggbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdWyBnZW5kZXIgXSApICkKKyAgICByZXR1cm4gaWRzICsgbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdWyBnZW5kZXIgXTsKKyAgaWYgKCBjbG9zdXJlcCggbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdWyBnZW5kZXIgXSApICkKKyAgICByZXR1cm4gZnVuY2FsbCggbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdWyBnZW5kZXIgXSwKKwkJICAgIGlkcywgcmFjZSwgZ2VuZGVyLCBzZ2VuZGVyICk7CisgIC8vIGZhbGxzIGtlaW4gbWFwcGluZywgZGFubiByYXVzCisgIGlmICggIW1hcHBpbmdwKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdWyByYWNlIF1bIGdlbmRlciBdICkgKQorICAgIHJldHVybiBpZHM7CisKKyAgLy8gVGVzdCA1LgorICBpZiAoIG1lbWJlciggbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdWyBnZW5kZXIgXSwgc2dlbmRlciApID09IDAgKQorICAgIHJldHVybiBpZHM7CisgIGlmICggc3RyaW5ncCggbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdWyBnZW5kZXIgXVsgc2dlbmRlciBdICkgKQorICAgIHJldHVybiBpZHMgKyAoeyBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdWyByYWNlIF1bIGdlbmRlciBdWyBzZ2VuZGVyIF0gfSk7CisgIGlmICggcG9pbnRlcnAoIG1vcnBoX3Byb3BlcnRpZXNbIFBfSURTIF1bIHJhY2UgXVsgZ2VuZGVyIF1bIHNnZW5kZXIgXSApICkKKyAgICByZXR1cm4gaWRzICsgbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdWyBnZW5kZXIgXVsgc2dlbmRlciBdOworICBpZiAoIGNsb3N1cmVwKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdWyByYWNlIF1bIGdlbmRlciBdWyBzZ2VuZGVyIF0gKSApCisgICAgcmV0dXJuIGZ1bmNhbGwoIG1vcnBoX3Byb3BlcnRpZXNbIFBfSURTIF1bIHJhY2UgXVsgZ2VuZGVyIF1bIHNnZW5kZXIgXSwKKwkJICAgIGlkcywgcmFjZSwgZ2VuZGVyLCBzZ2VuZGVyICk7CisKKyAgcmV0dXJuIGlkczsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgX3F1ZXJ5X2lzX21vcnBoZWQoKQorLy8KKy8vICAgUHJvcGVydHktTWV0aG9kZSBm/HIgImlzX21vcnBoZWQiCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW50IF9xdWVyeV9pc19tb3JwaGVkKCAvKiB2b2lkICovICkKK3sKKyAgcmV0dXJuIDE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIF9xdWVyeV9tYXhfaGFuZHMoKQorLy8KKy8vICAgUHJvcGVydHktTWFza2llcnVuZyBm/HIgUF9NQVhfSEFORFMKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQgX3F1ZXJ5X21heF9oYW5kcyggLyogdm9pZCAqLyApCit7CisgIHJldHVybiAoaW50KV9xdWVyeV9wcm9wZXJ0eSggUF9NQVhfSEFORFMgKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgX3F1ZXJ5X21tc2dpbigpCisvLworLy8gICBQcm9wZXJ0eS1NYXNraWVydW5nIGb8ciBQX01NU0dJTgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0cmluZyBfcXVlcnlfbW1zZ2luKCAvKiB2b2lkICovICkKK3sKKyAgcmV0dXJuIChzdHJpbmcpKF9xdWVyeV9wcm9wZXJ0eSggUF9NTVNHSU4gKSB8fCAiIik7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIF9xdWVyeV9tbXNnb3V0KCkKKy8vCisvLyAgIFByb3BlcnR5LU1hc2tpZXJ1bmcgZvxyIFBfTU1TR09VVAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0cmluZyBfcXVlcnlfbW1zZ291dCggLyogdm9pZCAqLyApCit7CisgIHJldHVybiAoc3RyaW5nKShfcXVlcnlfcHJvcGVydHkoIFBfTU1TR09VVCApIHx8ICIiKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgX3F1ZXJ5X21zZ2luKCkKKy8vCisvLyAgIFByb3BlcnR5LU1hc2tpZXJ1bmcgZvxyIFBfTVNHSU4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdHJpbmcgX3F1ZXJ5X21zZ2luKCAvKiB2b2lkICovICkKK3sKKyAgcmV0dXJuIChzdHJpbmcpKF9xdWVyeV9wcm9wZXJ0eSggUF9NU0dJTiApIHx8ICIiKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgX3F1ZXJ5X21zZ291dCgpCisvLworLy8gICBQcm9wZXJ0eS1NYXNraWVydW5nIGb8ciBQX01TR09VVAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0cmluZyBfcXVlcnlfbXNnb3V0KCAvKiB2b2lkICovICkKK3sKKyAgcmV0dXJuIChzdHJpbmcpKF9xdWVyeV9wcm9wZXJ0eSggUF9NU0dPVVQgKSB8fCAiIik7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIF9xdWVyeV9uYW1lKCkKKy8vCisvLyAgIFByb3BlcnR5LU1ldGhvZGUgZvxyIFBfTkFNRS4gTGVpZGVyIGlzdCBkaWUgcGxheWVyLXNoZWxsIHNvIGdyb3R0aWcsCisvLyAgIGRhc3Mg/GJlcmFsbCBhbmdlbm9tbWVuIHdpcmQsIFF1ZXJ5UHJvcChQX05BTUUpIGxpZWZlcmUgZWluZW4gU3RyaW5nIDotfAorLy8gICBWb2xsc3TkbmRpZ2VzIFByb3BlcnR5IGRhaGVyIHVudGVyIF9xdWVyeV9uYW1lX2Z1bGwoKS4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdHJpbmcgX3F1ZXJ5X25hbWUoIC8qIHZvaWQgKi8gKQoreworICBtaXhlZCBwcm9wOworICBwcm9wID0gX3F1ZXJ5X3Byb3BlcnR5KCBQX05BTUUgKTsKKyAgaWYgKCBzdHJpbmdwKCBwcm9wICkgKQorICAgIHJldHVybiBzcHJpbnRmKCBwcm9wLCBwbC0+UXVlcnkoIFBfTkFNRSApICk7CisgIGlmICggcG9pbnRlcnAoIHByb3AgKSApCisgICAgcmV0dXJuIG1hcCggcHJvcCwKKwkJICAgICAgbGFtYmRhKCAoeyAnZWwsICdzIH0pLAorCQkJICAgICAgKHsjJ3NwcmludGYsICdlbCwgJ3N9KSApLAorCQkgICAgICBwbC0+UXVlcnkoIFBfTkFNRSApIClbIFdFUiBdOworICByZXR1cm4gcGwtPlF1ZXJ5KCBQX05BTUUgKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgX3F1ZXJ5X25hbWVfZnVsbCgpCisvLworLy8gICBQcm9wZXJ0eS1NZXRob2RlIGb8ciAibmFtZV9mdWxsIi4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittaXhlZCBfcXVlcnlfbmFtZV9mdWxsKCAvKiB2b2lkICovICkKK3sKKyAgbWl4ZWQgcHJvcDsKKyAgcHJvcCA9IF9xdWVyeV9wcm9wZXJ0eSggUF9OQU1FICk7CisgIGlmICggc3RyaW5ncCggcHJvcCApICkKKyAgICByZXR1cm4gc3ByaW50ZiggcHJvcCwgcGwtPlF1ZXJ5KCBQX05BTUUgKSApOworICBpZiAoIHBvaW50ZXJwKCBwcm9wICkgKQorICAgIHJldHVybiBtYXAoIHByb3AsCisJCSAgICAgIGxhbWJkYSggKHsgJ2VsLCAncyB9KSwKKwkJCSAgICAgICh7IydzcHJpbnRmLCAnZWwsICdzfSkgKSwKKwkJICAgICAgcGwtPlF1ZXJ5KCBQX05BTUUgKSApOworICByZXR1cm4gcGwtPlF1ZXJ5KCBQX05BTUUgKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgX3F1ZXJ5X3ByZXNheSgpCisvLworLy8gICBQcm9wZXJ0eS1NYXNraWVydW5nIGb8ciBQX1BSRVNBWQorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0cmluZyBfcXVlcnlfcHJlc2F5KCAvKiB2b2lkICovICkKK3sKKyAgcmV0dXJuIChzdHJpbmcpKF9xdWVyeV9wcm9wZXJ0eSggUF9QUkVTQVkgKSB8fCAiIik7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIF9xdWVyeV9yYWNlKCkKKy8vCisvLyAgIFByb3BlcnR5LU1hc2tpZXJ1bmcgZvxyIFBfUkFDRQorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0cmluZyBfcXVlcnlfcmFjZSggLyogdm9pZCAqLyApCit7CisgIHJldHVybiAoc3RyaW5nKShfcXVlcnlfcHJvcGVydHkoIFBfUkFDRSApIHx8ICIiKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgX3F1ZXJ5X3JhY2VzdHJpbmcoKQorLy8KKy8vICAgUHJvcGVydHktTWFza2llcnVuZyBm/HIgUF9SQUNFU1RSSU5HCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RyaW5nKiBfcXVlcnlfcmFjZXN0cmluZyggLyogdm9pZCAqLyApCit7CisgIHJldHVybiAoc3RyaW5nKilfcXVlcnlfcHJvcGVydHkoIFBfUkFDRVNUUklORyApOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gICBfcXVlcnlfc2l6ZSgpCisvLworLy8gICBQcm9wZXJ0eS1NYXNraWVydW5nIGb8ciBQX1NJWkUKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQgX3F1ZXJ5X3NpemUoIC8qIHZvaWQgKi8gKQoreworICByZXR1cm4gKGludClfcXVlcnlfcHJvcGVydHkoIFBfU0laRSApOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gICBfcXVlcnlfdGl0bGUoKQorLy8KKy8vICAgUHJvcGVydHktTWFza2llcnVuZyBm/HIgUF9USVRMRQorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0cmluZyBfcXVlcnlfdGl0bGUoIC8qIHZvaWQgKi8gKQoreworICByZXR1cm4gKHN0cmluZykoX3F1ZXJ5X3Byb3BlcnR5KCBQX1RJVExFICkgfHwgIiIpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gICBfcXVlcnlfd2VpZ2h0KCkKKy8vCisvLyAgIFByb3BlcnR5LU1hc2tpZXJ1bmcgZvxyIFBfV0VJR0hUCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW50IF9xdWVyeV93ZWlnaHQoIC8qIHZvaWQgKi8gKQoreworICByZXR1cm4gKGludCkoX3F1ZXJ5X3Byb3BlcnR5KCBQX1dFSUdIVCApIHx8ICIiKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgaWQoIFRleHQsIExldmVsKQorLy8KKy8vICAgRGllIElkZW50aWZpemllcnVuZyBzcGlubnQgbWl0IFBfTkFNRS1BcnJheXMKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2YXJhcmdzIGludCBpZCggc3RyaW5nIHN0ciwgaW50IGx2bCApCit7CisgIHN0cmluZyBwbG5hbWU7CisKKyAgaWYgKCBwbC0+UXVlcnlQcm9wKCBQX0dIT1NUICkgKQorICAgIGlmICggc3RyID09ICJnZWlzdCIgKQorICAgICAgcmV0dXJuIDE7CisgICAgZWxzZSBpZiAoICggc3NjYW5mKCBzdHIsICJnZWlzdCB2b24gJXMiLCBwbG5hbWUgKSA9PSAxICkgJiYKKwkgICAgICBwbC0+aWQoIHBsbmFtZSApICkKKyAgICAgIHJldHVybiAxOworICAgIGVsc2UgaWYgKCAoIHNzY2FuZiggc3RyLCAiZ2Vpc3QgJXMiLCBwbG5hbWUgKSA9PSAxICkgJiYKKwkgICAgICBwbC0+aWQoIHBsbmFtZSApICkKKyAgICAgIHJldHVybiAxOworCisgIHJldHVybiBwbC0+aWQoIHN0ciwgbHZsICk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIGxvbmcoKQorLy8KKy8vICAgRGllIExhbmdiZXNjaHJlaWJ1bmcgaW0gU3BpZWxlciBoYWRlcnQgbWl0IGRlbSBHZXNjaGxlY2h0IE5FVVRFUi4uLgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZhcmFyZ3Mgc3RyaW5nIGxvbmcoIC8qIHZvaWQgKi8gKQoreworICBzdHJpbmcgc2xvbmc7CisgIHNsb25nID0gcGwtPmxvbmcoKTsKKworICBpZiAoIF9xdWVyeV9nZW5kZXIoKSA9PSBORVVURVIgKQorICB7CisgICAgc3RyaW5nICphbG9uZzsKKyAgICBpbnQgaTsKKworICAgIC8vIGFsbGUgRXItcyB1bmQgZXItcyBzdWNoZW4uLi4KKyAgICBhbG9uZyA9IHJlZ2V4cGxvZGUoIHNsb25nLCAiXFw8W0VlXXJcXD4iICk7CisgICAgLy8gLi4uIHVuZCBkYXMgciBkdXJjaCBlaW4gcyBlcnNldHplbi4KKyAgICBmb3IgKCBpID0gMSA7IGkgPCBzaXplb2YoIGFsb25nICkgOyBpICs9IDIgKQorICAgICAgYWxvbmdbIGkgXVsgMSBdID0gJ3MnOworICAgIHNsb25nID0gaW1wbG9kZSggYWxvbmcsICIiICk7CisgIH0KKworICByZXR1cm4gc2xvbmc7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIHNob3J0KCkKKy8vCisvLyAgIERpZSBLdXJ6YmVzY2hyZWlidW5nIGltIFNwaWVsZXIgaGF0IGVpbiBQcm9ibGVtIG1pdCBQX05BTUUtQXJyYXlzCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RyaW5nIHNob3J0KCAvKiB2b2lkICovICkKK3sKKyAgbWl4ZWQgbmFtZXM7CisgIHN0cmluZyBhbnN3ZXI7CisgIHN0cmluZyB0aXRsZTsKKworICBpZiAoIHBsLT5RdWVyeVByb3AoIFBfSU5WSVMgKSApCisgICAgaWYgKCBpbnRlcmFjdGl2ZSggcHJldmlvdXNfb2JqZWN0KCkgKSAmJgorCSBJU19MRUFSTklORyggcHJldmlvdXNfb2JqZWN0KCkgKSApCisgICAgICByZXR1cm4gIigiICsgcGwtPlF1ZXJ5KCBQX05BTUUgKSArICIpIFxuIjsKKyAgICBlbHNlCisgICAgICByZXR1cm4gKHN0cmluZykwOworCisgIG5hbWVzID0gX3F1ZXJ5X25hbWVfZnVsbCgpOworICBpZiAoIHN0cmluZ3AoIG5hbWVzICkgKQorICAgIG5hbWVzID0gKHsgbmFtZXMsIG5hbWVzLCBuYW1lcywgbmFtZXMgfSk7CisKKyAgaWYgKCBwbC0+UXVlcnlQcm9wKCBQX0dIT1NUICkgKQorICAgIGFuc3dlciA9ICJEZXIgR2Vpc3QgIiArIHBsLT5RdWVyeUFydGljbGUoIFdFU1NFTiwgMCApICsgbmFtZXNbIFdFU1NFTiBdOworICBlbHNlCisgICAgYW5zd2VyID0gcGwtPlF1ZXJ5QXJ0aWNsZSggV0VSLCAwICkgKyBuYW1lc1sgV0VSIF07CisgIGlmICggKCB0aXRsZSA9IHBsLT5RdWVyeVByb3AoIFBfVElUTEUgKSApICYmCisgICAgICAgKCB0aXRsZSAhPSAiIiApICkKKyAgICAgYW5zd2VyICs9ICIgIiArIHRpdGxlOworICBpZiAoICFpbnRlcmFjdGl2ZSggcGwgKSApCisgICAgIGFuc3dlciArPSAiIChuZXR6dG90KSI7CisgIHJldHVybiBjYXBpdGFsaXplKCBhbnN3ZXIgKSArICIuXG4iOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gICByZW1vdmUoIFNjaG5hdXplICkKKy8vCisvLyAgIGF1ZnLkdW1lbgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZhcmFyZ3MgaW50IHJlbW92ZSggaW50IHNpbGVudCApCit7CisgIGRlc3RydWN0KCB0aGlzX29iamVjdCgpICk7CisgIHJldHVybiAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgIC0tIEVOREUgLS0KZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvc2hhZG93cy9wb255LmMgYi9zdGQvcGxheWVyL3NoYWRvd3MvcG9ueS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkM2RlOGQKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL3NoYWRvd3MvcG9ueS5jCkBAIC0wLDAgKzEsNTkgQEAKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHNhdmVfdHlwZXMKKworI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKworLy8gCisvLyBEYSBkZXIgU2hhZG93IHNpY2ggbmljaHQgaW0gUGxheWVyIGJlZmluZGV0LCB3aXJkIGVpbgorLy8gWnVzYXR6b2JqZWt0IGJlbm9ldGlndC4KKy8vIDcuMTAuOTcgLSBEaWUgSG9vayBzb2xsdGUgaW4gZGVuIFZlcnplaWNobmlzc2VuIGRlciBCZW5uaWVxdWVzdAorLy8gICAgICAgICAgIHp1IGZpbmRlbiBzZWluLiAtIFJ1bWF0YQorCisjZGVmaW5lIEhPT0sgImQvd2FsZC9rYXNzYW5kcmEvYmVubmllL29iai9wb255X2hvb2siCisKK3N0YXRpYyBvYmplY3QgcGw7CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyBpZiggSVNfQkxVRShNRSkgKSByZXR1cm47CisgIHNoYWRvdyggUEwsIDEpOworIHBsPVBMOworIC8vdGVsbF9vYmplY3QodGhpc19wbGF5ZXIoKSwiRHUgYmVzdGVpZ3N0IGRhcyBQb255IHNhbXQgU2NoYXR0ZW4uXG4iKTsKKyAgY2xvbmVfb2JqZWN0KCBIT09LICk7IC8vIFN0ZXVlcnVuZyBkZXMgc2hhZG93cyB1ZWJlciBkaWUgaG9vaworfQorCitzdHJpbmcgX3F1ZXJ5X3RpdGxlKCkKK3sgCisgaWYoIHBsLT5RdWVyeVByb3AoUF9HRU5ERVIpID09IEZFTUFMRSApCisgICAgIHJldHVybiAiZGllIFBvbnlyZWl0ZXJpbiI7CisgcmV0dXJuICJkZXIgUG9ueXJlaXRlciI7Cit9CisKK3N0cmluZyBfcXVlcnlfbXNnaW4oKSB7IHJldHVybiAicmVpdGV0IGhlcmVpbiI7IH0KK3N0cmluZyBfcXVlcnlfbXNnb3V0KCkgeyByZXR1cm4gInJlaXRldCI7IH0KKwordmFyYXJncyBpbnQgbW92ZShtaXhlZCBkZXN0LCBpbnQgbWV0aG9kLCBzdHJpbmcgZGlyLCBzdHJpbmcgdGV4dG91dCxzdHJpbmcgdGV4dGluKQoreworIGlmKCAhKG1ldGhvZCAmIE1fTk9DSEVDSykgJiYgZGVzdC0+UXVlcnlQcm9wKFBfSU5ET09SUykgKQorIHsKKyAgd3JpdGUoICJEYXMgUG9ueSB3ZWlnZXJ0IHNpY2gsIGRvcnRoaW4genUgdHJhYmVuLlxuIiApOworICByZXR1cm4gMTsKKyB9CisgcmV0dXJuIHBsLT5tb3ZlKCBkZXN0LCBtZXRob2QsIGRpciwgdGV4dG91dCwgdGV4dGluICk7Cit9CisKK2ludCBfaW52ZW50b3J5KHN0cmluZyBzdHIpCit7CisgaWYoICFlbnZpcm9ubWVudCgpIHx8IHNldF9saWdodCgwKT4wICkKKyAgd3JpdGUoICJEdSBzaXR6dCBhdWYgZWluZW0gUG9ueS5cbiIgKTsKKyByZXR1cm4gcGwtPl9pbnZlbnRvcnkoc3RyKTsKK30KKwordm9pZCBhYnN0ZWlnZW4oKSB7CisgIHVuc2hhZG93KCk7CisgIGRlc3RydWN0KE1FKTsKK30KKworaW50IFF1ZXJ5UmVpdGVyKCkgeyByZXR1cm4gMTsgfQpkaWZmIC0tZ2l0IGEvc3RkL3BsYXllci9zaGFkb3dzL3NpemV0ZXN0LmMgYi9zdGQvcGxheWVyL3NoYWRvd3Mvc2l6ZXRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjY4OTExCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9zaGFkb3dzL3NpemV0ZXN0LmMKQEAgLTAsMCArMSw1NyBAQAorI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKworI2RlZmluZSBTUElFTEVSICJuZWZpcyIKKyNkZWZpbmUgREVCVUcoeCkgIGlmIChmaW5kX3BsYXllcigiemVzc3RyYSIpKVwKKyAgICAgICAgICAgIHRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJ6ZXNzdHJhIiksXAorCQkgICAgICAgICAgICAgICAgICAgICAgIk5lZmlzIFBfU0laRTogIit4KyJcbiIpCisjZGVmaW5lIExPRyh4KSBsb2dfZmlsZSgiemVzc3RyYS9QX1NJWkUubG9nIiwgeCkKKworcHJpdmF0ZSBub3NhdmUgb2JqZWN0IHBsOworCit2b2lkIGNyZWF0ZSgpCit7CisgIGlmICghY2xvbmVwKCkgKSByZXR1cm47CisgIHBsID0gZmluZF9wbGF5ZXIoU1BJRUxFUikgfHwgZmluZF9uZXRkZWFkKFNQSUVMRVIpOworICBpZiAoIW9iamVjdHAocGwpKSB7CisgICAgICBERUJVRygiUGxheWVyb2JqZWt0IG5pY2h0IGdlZnVuZGVuLiIpOworICAgICAgZGVzdHJ1Y3QoTUUpOworICAgICAgcmV0dXJuOworICB9CisgIHNoYWRvdyggcGwsIDEpOworICBERUJVRyhzcHJpbnRmKCIlTyBzaGFkb3dlZCBieTogJU9cbiIsIHBsLCBzaGFkb3cocGwsIDApKSk7Cit9CisKK2ludCBfc2V0X3NpemUoaW50IHN6KSB7CisgIExPRyhzcHJpbnRmKCJbJXNdIEFlbmRlcnVuZyB2b24gUF9TSVpFIGluICVPIGF1ZiAlTyxcbkNhbGxlcnN0YWNrOiAlT1xuXG4iLAorCXN0cmZ0aW1lKCIlYyIsdGltZSgpKSwgcGwsIHN6LCBjYWxsZXJfc3RhY2soKSkpOworICByZXR1cm4gcGwtPlNldChQX1NJWkUsIHN6LCBGX1ZBTFVFKTsKK30KKworcHVibGljIHZhcmFyZ3MgbWl4ZWQgU2V0KCBzdHJpbmcgbmFtZSwgbWl4ZWQgVmFsdWUsIGludCBUeXBlLCBpbnQgZXh0ZXJuICkgeworICBpZiAobmFtZSA9PSBQX1NJWkUpIHsKKyAgTE9HKHNwcmludGYoIlslc10gQWVuZGVydW5nIHZvbiBQX1NJWkUgaW4gJU8gYXVmICVPIChUeXA6ICVPKSBbU2V0KCkhXSIKKwkiLFxuQ2FsbGVyc3RhY2s6ICVPXG5cbiIsCisJICAgICAgICBzdHJmdGltZSgiJWMiLHRpbWUoKSksIHBsLCBWYWx1ZSwgVHlwZSwgY2FsbGVyX3N0YWNrKCkpKTsKKyAgfQorICByZXR1cm4gcGwtPlNldChuYW1lLCBWYWx1ZSwgVHlwZSwgZXh0ZXJuKTsKK30KKworaW50IHN0b3AoKSB7CisgIHVuc2hhZG93KCk7CisgIGRlc3RydWN0KE1FKTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgcmVzZXQoKSB7CisgIGlmICghb2JqZWN0cChwbCkpIAorICAgIHN0b3AoKTsKK30KKworaW50IHJlbW92ZSgpIHsKKyAgc3RvcCgpOworICByZXR1cm4gMTsKK30KKwpkaWZmIC0tZ2l0IGEvc3RkL3BsYXllci9zaGFkb3dzL3Rhcm5oZWxtX3NoYWRvdy5jIGIvc3RkL3BsYXllci9zaGFkb3dzL3Rhcm5oZWxtX3NoYWRvdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZWE3NDQKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL3NoYWRvd3MvdGFybmhlbG1fc2hhZG93LmMKQEAgLTAsMCArMSwxNDAgQEAKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHNhdmVfdHlwZXMKKworI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisKKyNkZWZpbmUgV0VHKCkgZGVzdHJ1Y3QodGhpc19vYmplY3QoKSkKKworb2JqZWN0IHBsYXllcjsKK2ludCBnZW5kZXI7CitzdHJpbmcgZGVzYzsKKwordm9pZCBfdGFybl90dXJuX29uKG9iamVjdCBwbCxzdHJpbmcgdHh0LGludCBnZW4pCit7CisgIGlmICghb2JqZWN0cChwbCl8fCFpbnRlcmFjdGl2ZShwbCkpIHJldHVybiBXRUcoKTsKKyAgaWYgKCFzdHJpbmdwKHR4dCl8fHR4dD09IiIpIHJldHVybiBXRUcoKTsKKyAgaWYgKGdlbjwwfHxnZW4+MikgcmV0dXJuIFdFRygpOworICBwbGF5ZXI9cGw7CisgIGRlc2M9Y2FwaXRhbGl6ZSh0eHQpOworICBnZW5kZXI9Z2VuOworICBzaGFkb3cocGwsMSk7Cit9CisKK2ludCBzcGVjaWFsX3ZlcmIoKQoreworICBzdHJpbmcgdmVyYjsKKyAgCisgIHZlcmI9cXVlcnlfdmVyYigpOworICBpZiAoIXZlcmJ8fHZlcmI9PSIiKSByZXR1cm4gMDsKKyAgaWYgKHZlcmJbMF09PSctJykgcmV0dXJuIDE7CisgIGlmICh2ZXJiPT0icnVmInx8dmVyYj09InJ1ZmUifHx2ZXJiPT0idGVpbGUifHx2ZXJiPT0idGVpbCJ8fHZlcmI9PSJtcnVmInx8CisgICAgICB2ZXJiPT0ibXJ1ZmUifHx2ZXJiPT0iZXJ6YWVobCJ8fHZlcmI9PSJlcnphZWhsZSIpIHJldHVybiAxOworICByZXR1cm4oMCk7IC8vIG5vbi12b2lkIGZ1bmt0aW9uLCBaZXNzdHJhCit9CisKK2ludCBfcXVlcnlfZ2VuZGVyKCkKK3sKKyAgcmV0dXJuIGdlbmRlcjsKK30KKworc3RyaW5nIF9xdWVyeV9uYW1lKCkKK3sKKyAgaWYgKCFzcGVjaWFsX3ZlcmIoKSkKKyAgICByZXR1cm4gY2FwaXRhbGl6ZShkZXNjKTsKKyAgcmV0dXJuIHBsYXllci0+UXVlcnkoUF9OQU1FKTsKK30KKworc3RyaW5nIF9xdWVyeV9zaG9ydCgpCit7CisgIHJldHVybiBjYXBpdGFsaXplKHBsYXllci0+bmFtZSgpKTsKK30KKworc3RyaW5nIF9xdWVyeV9sb25nKCkKK3sKKyAgc3RyaW5nIHN0cjsKKworICBzdHI9cGxheWVyLT5uYW1lKCk7CisgIHJldHVybiBjYXBpdGFsaXplKHN0cikrIiBpc3QgIitzdHIrIiBpc3QgIitzdHIrIi5cbiI7Cit9CisKK3N0cmluZyogX3F1ZXJ5X2lkcygpCit7CisgIHJldHVybiBwbGF5ZXItPlF1ZXJ5KCJpZHMiKSsoe2xvd2VyX2Nhc2UoZGVzYyl9KTsKK30KKworc3RyaW5nIF9xdWVyeV9yYWNlKCkKK3sKKyAgcmV0dXJuIGRlc2M7Cit9CisKK3ZvaWQgX3Rhcm5fdHVybl9vZmYoKQoreworICB1bnNoYWRvdygpOworICBkZXN0cnVjdCh0aGlzX29iamVjdCgpKTsKK30KKworaW50IF9xdWVyeV9hcnRpY2xlKCkKK3sKKyAgaWYgKCFzcGVjaWFsX3ZlcmIoKSkKKyAgICByZXR1cm4gMTsKKyAgcmV0dXJuKDApOyAvLyBub24tdm9pZCBmdW5rdGlvbiwgWmVzc3RyYQorfQorCitzdHJpbmcgX3F1ZXJ5X3ByZXNheSgpCit7CisgIHJldHVybiAiIjsKK30KKworc3RyaW5nIF9xdWVyeV90aXRsZSgpCit7CisgIHJldHVybiAiIjsKK30KKwordm9pZCBEZWZlbmQoaW50IGRhbSxtaXhlZCBkYW1fdHlwZSxtaXhlZCBzcGVsbCxvYmplY3QgZW5lbXkpCit7CisgIG9iamVjdCBvOworCisgIGlmICghcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShwcmV2aW91c19vYmplY3QoKSkpCisgICAgcGxheWVyLT5EZWZlbmQoZGFtLCBkYW1fdHlwZSwgc3BlbGwsIGVuZW15KTsKKyAgZWxzZQorICAgIHByZXZpb3VzX29iamVjdCgpLT5TdG9wSHVudEZvcihwbGF5ZXIpOworICBpZiAoKG89cHJlc2VudCgiXG50YXJuaGVsbSIscGxheWVyKSkpCisgICAgICAgIG8tPkRvVW53ZWFyKCk7CisgIGlmICh0aGlzX29iamVjdCgpKSBkZXN0cnVjdCh0aGlzX29iamVjdCgpKTsKK30KKworaW50IEtpbGwob2JqZWN0IG9iKQoreworICBvYmplY3QgbzsKKworICBpZiAoKG89cHJlc2VudCgiXG50YXJuaGVsbSIscGxheWVyKSkpCisgICAgICBvLT5Eb1Vud2VhcigpOworICBpZiAodGhpc19vYmplY3QoKSkgZGVzdHJ1Y3QodGhpc19vYmplY3QoKSk7CisgIHJldHVybigwKTsgLy8gbm9uLXZvaWQgZnVua3Rpb24sIFplc3N0cmEKK30KKworaW50IEluc2VydEVuZW15KG9iamVjdCBvYikKK3sKKyAgb2JqZWN0IG87CisKKyAgaWYgKCFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iKSkKKyAgICBwbGF5ZXItPkluc2VydEVuZW15KG9iKTsKKyAgZWxzZQorICAgIG9iLT5TdG9wSHVudEZvcihwbGF5ZXIpOworICBpZiAoKG89cHJlc2VudCgiXG50YXJuaGVsbSIscGxheWVyKSkpCisgICAgICBvLT5Eb1Vud2VhcigpOworICBpZiAodGhpc19vYmplY3QoKSkgZGVzdHJ1Y3QodGhpc19vYmplY3QoKSk7CisgIHJldHVybiAwOworfQorCitzdHJpbmcgc2hvcnQoKQoreworICBpZiAob2xkX2V4cGxvZGUob2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpLCIjIilbMF09PSIvb2JqL3dlcmxpc3RlIikKKyAgICByZXR1cm4gY2FwaXRhbGl6ZShnZXRldWlkKHBsYXllcikrIiB2ZXJrbGVpZGV0IGFscyAiK3BsYXllci0+c2hvcnQoKSk7CisgIHJldHVybiBwbGF5ZXItPnNob3J0KCk7Cit9CisKK3N0cmluZyBRdWVyeURpc2d1aXNlKCkKK3sKKyAgcmV0dXJuIGRlc2M7IAorfQpkaWZmIC0tZ2l0IGEvc3RkL3BsYXllci9zaGFkb3dzL3phdWJlcnNoLmMgYi9zdGQvcGxheWVyL3NoYWRvd3MvemF1YmVyc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTljZWNjCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9zaGFkb3dzL3phdWJlcnNoLmMKQEAgLTAsMCArMSwyMjAgQEAKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHNhdmVfdHlwZXMKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKworb2JqZWN0IGNhc3RlcjsKK3N0cmluZyppZHMsbmFtZTsKK2ludCBnZW5kZXIsYXJ0aWNsZSxwbHVyYWw7CitzdHJpbmcgbGdkZXNjOworc3RyaW5nIG1pbixtb3V0LG1taW4sbW1vdXQ7CittaXhlZCBoYW5kczsKKwordm9pZCBJbml0aWFsaXplKG9iamVjdCBfY2FzdGVyLAorICAgICAgICAgICAgICAgIHN0cmluZypfaWRzLAorICAgICAgICAgICAgICAgIHN0cmluZyBfbmFtZSwKKyAgICAgICAgICAgICAgICBpbnQgX2dlbmRlciwKKyAgICAgICAgICAgICAgICBpbnQgX2FydGljbGUsCisgICAgICAgICAgICAgICAgaW50IF9wbHVyYWwpCit7IGlmKCFvYmplY3RwKF9jYXN0ZXIpICAgIHx8CisgICAgICFpbnRlcmFjdGl2ZShfY2FzdGVyKXx8CisgICAgICFzdHJpbmdwKF9uYW1lKSAgICAgIHx8CisgICAgIF9uYW1lPT0iIiAgICAgICAgICAgIHx8CisgICAgIF9nZW5kZXI8MCAgICAgICAgICAgIHx8CisgICAgIF9nZW5kZXI+MikKKyAgeyBkZXN0cnVjdCh0aGlzX29iamVjdCgpKTsKKyAgICByZXR1cm47CisgIH0KKyAgY2FzdGVyPV9jYXN0ZXI7CisgIGlkcz1faWRzOworICBuYW1lPV9uYW1lOworICBnZW5kZXI9X2dlbmRlcjsKKyAgYXJ0aWNsZT1fYXJ0aWNsZTsKKyAgcGx1cmFsPV9wbHVyYWw7CisgIGxnZGVzYz0wOworICBzaGFkb3coY2FzdGVyLDEpOworfQorCit2b2lkIFNldExvbmdEZXNjKHN0cmluZyB0eHQpCit7IGlmKCFzdHJpbmdwKHR4dCl8fHR4dD09IiIpCisgICAgcmV0dXJuOworICBsZ2Rlc2M9dHh0OworfQorCitzdHJpbmcqIF9xdWVyeV9pZHMoKQoreyByZXR1cm4gY2FzdGVyLT5RdWVyeShQX0lEUykraWRzOworfQorCisvLyBuaWNodCBhbGxlIFZlcmJlbiBtaXQgdmVyYWVuZGVydGVtIEF1c3NlaGVuCitpbnQgc3BlY2lhbF92ZXJiKCkKK3sgc3RyaW5nIHZlcmI7CisgIHZlcmI9cXVlcnlfdmVyYigpOworICBpZighc3RyaW5ncCh2ZXJiKXx8dmVyYj09IiIpCisgICAgcmV0dXJuIDA7CisgIGlmKHZlcmJbMF09PSctJykKKyAgICByZXR1cm4gMTsKKyAgaWYobWVtYmVyKCh7InJ1ZiIsInJ1ZmUiLCJtcnVmIiwibXJ1ZmUiLAorICAgICAgICAgICAgICAidGVpbCIsInRlaWxlIiwiZXJ6YWVobCIsImVyemFlaGxlIn0pLHZlcmIpIT0tMSkKKyAgICByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0cmluZyBfcXVlcnlfbmFtZSgpCit7IGlmKCFzcGVjaWFsX3ZlcmIoKSkKKyAgICByZXR1cm4gbmFtZTsKKyAgcmV0dXJuIGNhcGl0YWxpemUoY2FzdGVyLT5RdWVyeShQX05BTUUpKTsKK30KKworc3RyaW5nIF9xdWVyeV9zaG9ydCgpCit7IGlmKCFzcGVjaWFsX3ZlcmIoKSkKKyAgICByZXR1cm4gY2FzdGVyLT5OYW1lKCk7CisgIHJldHVybiBjYXN0ZXItPlF1ZXJ5KFBfU0hPUlQpOworfQorCitzdHJpbmcgX3F1ZXJ5X2xvbmcoKQoreyBpZighc3BlY2lhbF92ZXJiKCkpCisgIHsgc3RyaW5nIHN0cjsKKyAgICBpZihsZ2Rlc2MpCisgICAgICByZXR1cm4gbGdkZXNjOworICAgIHN0cj1jYXN0ZXItPm5hbWUoKTsKKyAgICByZXR1cm4gYnJlYWtfc3RyaW5nKGNhcGl0YWxpemUoc3RyKSsiIGlzdCAiK3N0cisiIGlzdCAiK3N0cisiLiIsNzgpOworICB9CisgIHJldHVybiBjYXN0ZXItPlF1ZXJ5KFBfTE9ORyk7Cit9CisKK2ludCBfcXVlcnlfZ2VuZGVyKCkKK3sgaWYoIXNwZWNpYWxfdmVyYigpKQorICAgIHJldHVybiBnZW5kZXI7CisgIHJldHVybiBjYXN0ZXItPlF1ZXJ5KFBfR0VOREVSKTsKK30KKworaW50IF9xdWVyeV9hcnRpY2xlKCkKK3sgaWYoIXNwZWNpYWxfdmVyYigpKQorICAgIHJldHVybiBhcnRpY2xlOworICByZXR1cm4gY2FzdGVyLT5RdWVyeShQX0FSVElDTEUpOworfQorCitpbnQgX3F1ZXJ5X3BsdXJhbCgpCit7IGlmKCFzcGVjaWFsX3ZlcmIoKSkKKyAgICByZXR1cm4gcGx1cmFsOworICByZXR1cm4gY2FzdGVyLT5RdWVyeShQX1BMVVJBTCk7Cit9CisKK3N0cmluZyBfcXVlcnlfcmFjZSgpCit7IGlmKCFzcGVjaWFsX3ZlcmIoKSkKKyAgICByZXR1cm4gbmFtZTsKKyAgcmV0dXJuIGNhc3Rlci0+UXVlcnkoUF9SQUNFKTsKK30KKwordmFyYXJncyBpbnQgcmVtb3ZlKGludCBzaWxlbnQpIHsKKyAgdW5zaGFkb3coKTsKKyAgZGVzdHJ1Y3QodGhpc19vYmplY3QoKSk7CisgIHJldHVybiAxOworfQorCit2b2lkIHN0b3Bfc2hhZG93KCkKK3sgCisgIHJlbW92ZSgpOworfQorCitzdHJpbmcgX3F1ZXJ5X3ByZXNheSgpCit7IHJldHVybiIiOworfQorCitzdHJpbmcgX3F1ZXJ5X3RpdGxlKCkKK3sgcmV0dXJuIiI7Cit9CisKK3N0cmluZyBfc2V0X21zZ2luKHN0cmluZyB2YWwpCit7IHJldHVybiBtaW49dmFsOworfQorCitzdHJpbmcgX3F1ZXJ5X21zZ2luKCkKK3sgcmV0dXJuIG1pbjsKK30KKworc3RyaW5nIF9zZXRfbXNnb3V0KHN0cmluZyB2YWwpCit7IHJldHVybiBtb3V0PXZhbDsKK30KKworc3RyaW5nIF9xdWVyeV9tc2dvdXQoKQoreyByZXR1cm4gbW91dDsKK30KKworc3RyaW5nIF9zZXRfbW1zZ2luKHN0cmluZyB2YWwpCit7IHJldHVybiBtbWluPXZhbDsKK30KKworc3RyaW5nIF9xdWVyeV9tbXNnaW4oKQoreyByZXR1cm4gbW1pbjsKK30KKworc3RyaW5nIF9zZXRfbW1zZ291dChzdHJpbmcgdmFsKQoreyByZXR1cm4gbW1vdXQ9dmFsOworfQorCitzdHJpbmcgX3F1ZXJ5X21tc2dvdXQoKQoreyByZXR1cm4gbW1vdXQ7Cit9CisKK21peGVkIF9zZXRfaGFuZHMobWl4ZWQgdmFsKQoreyByZXR1cm4gaGFuZHM9dmFsOworfQorCittaXhlZCBfcXVlcnlfaGFuZHMoKQoreyByZXR1cm4gaGFuZHM7Cit9CisKK3ZhcmFyZ3MgaW50IERlZmVuZChpbnQgZGFtLG1peGVkIGRhbV90eXBlLG1peGVkIHNwZWxsLG9iamVjdCBlbmVteSkKK3sgb2JqZWN0IG9iOworICBpZighZW5lbXkgfHwgIC8vIFNpbHZhbmEgMjYuMS4yMDAyCisgICAgICghcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShwcmV2aW91c19vYmplY3QoKSkmJgorICAgICAgIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoZW5lbXkpKSkKKyAgICByZXR1cm4gY2FzdGVyLT5EZWZlbmQoZGFtLGRhbV90eXBlLHNwZWxsLGVuZW15KTsKKyAgZWxzZQorICB7IGVuZW15LT5TdG9wSHVudEZvcihjYXN0ZXIpOworICAgIGNhc3Rlci0+U3RvcEh1bnRGb3IoZW5lbXkpOworICB9CisgIGlmKG9iamVjdHAob2I9cHJlc2VudCgiemF1YmVyZXJcbnNoYWRvdyIsY2FzdGVyKSkpCisgICAgb2ItPnJlbW92ZSgpOworICBpZih0aGlzX29iamVjdCgpKQorICAgIHJlbW92ZSgpOworICByZXR1cm4gMDsKK30KKworaW50IEtpbGwob2JqZWN0IGVuZW15KQoreyBvYmplY3Qgb2I7CisgIGlmKCFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKGVuZW15KSkKKyAgICByZXR1cm4gY2FzdGVyLT5LaWxsKGVuZW15KTsKKyAgaWYob2JqZWN0cChvYj1wcmVzZW50KCJ6YXViZXJlclxuc2hhZG93IixjYXN0ZXIpKSkKKyAgICBvYi0+cmVtb3ZlKCk7CisgIGlmKHRoaXNfb2JqZWN0KCkpCisgICAgcmVtb3ZlKCk7CisgIHJldHVybiAwOworfQorCitpbnQgSW5zZXJ0RW5lbXkob2JqZWN0IGVuZW15KQoreyBvYmplY3Qgb2I7CisgIGlmKCFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKGVuZW15KSkKKyAgICByZXR1cm4gY2FzdGVyLT5JbnNlcnRFbmVteShlbmVteSk7CisgIGVsc2UgeworICAgIGVuZW15LT5TdG9wSHVudEZvcihjYXN0ZXIpOworICAgIGNhc3Rlci0+U3RvcEh1bnRGb3IoZW5lbXkpOworICB9CisgIGlmKG9iamVjdHAob2I9cHJlc2VudCgiemF1YmVyZXJcbnNoYWRvdyIsY2FzdGVyKSkpCisgICAgb2ItPnJlbW92ZSgpOworICBpZih0aGlzX29iamVjdCgpKQorICAgIHJlbW92ZSgpOworICByZXR1cm4gMDsKK30KKworc3RyaW5nIHNob3J0KCkKK3sgaWYobG9hZF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSA9PSAiL29iai93ZXJsaXN0ZSIpCisgICAgcmV0dXJuIGNhcGl0YWxpemUoZ2V0ZXVpZChjYXN0ZXIpKSsiIHZlcmtsZWlkZXQgYWxzICIrY2FzdGVyLT5zaG9ydCgpOworICByZXR1cm4gY2FzdGVyLT5zaG9ydCgpOworfQorCit2YXJhcmdzIHN0cmluZyBsb25nKCkKK3sgaWYobGdkZXNjKQorICAgIHJldHVybiBsZ2Rlc2M7CisgIHJldHVybiBjYXN0ZXItPmxvbmcoKTsKK30KZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvc2tpbGxzLmMgYi9zdGQvcGxheWVyL3NraWxscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwM2RhOTcKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL3NraWxscy5jCkBAIC0wLDAgKzEsNjIxIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gcGxheWVyL3NraWxscy5jIC0tIFNwaWVsZXJza2lsbHMKKy8vCisvLyAkSWQ6IHNraWxscy5jIDg4MDkgMjAxNC0wNS0wOCAxOTo1Mjo0OFogWmVzc3RyYSAkCisKKy8vCisvLyAyMDAzLTAxLTIwOiBOdW4gWm9va3MgQmF1c3RlbGxlCisvLworI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCitpbmhlcml0ICIvc3RkL2xpdmluZy9za2lsbHMiOworCisjaW5jbHVkZSA8Y29tYmF0Lmg+CisjaW5jbHVkZSA8bmV3X3NraWxscy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxicmVha19zdHJpbmcuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDxwbGF5ZXIvYmFzZS5oPgorI2luY2x1ZGUgPHBsYXllci9nbWNwLmg+CisjdW5kZWYgTkVFRF9QUk9UT1RZUEVTCisKKy8vIERpZXNlcyBNYXBwaW5nIHNwZWljaGVydCBkaWUgZGVha3RpdmllcnRlbiBTa2lsbHMgZGVyIGVpbnplbG5lbiBHaWxkZW4KKy8vIERpZXNlIHdlcmRlbiBpbiBkZW4gR2lsZGVuIHVlYmVyIFBfR1VJTERfREVBQ1RJVkFURURfU0tJTEwgZ2VzZXR6dC4KK25vc2F2ZSBtYXBwaW5nIGRlYWN0aXZhdGVkX3NraWxscyA9IChbXSk7CisKKy8vIEZsYWcgZnVlciBkZW4gS29tcGF0aWJpbGl0YWV0c21vZHVzIGRlcyBLYW1wZnMgKEVtdWxhdGlvbiB2b24KKy8vIDJzLUFsYXJtemVpdCkuIFdlbm4gIT0gMCBzcGVpY2hlcnQgZGFzIEZsYWcgZ2xlaWNoemVpdGlnIGRpZSBaZWl0IGRlcworLy8gbGV0enRlbiBIZWFydGJlYXRzLiBBdWYgZGllc2UgWmVpdCB3aXJkIGRlciBTdGFydHB1bmt0IGVpbmVzIFNwZWxsZmF0aWd1ZXMKKy8vIGdnZi4genVydWVja2RhdGllcnQuIChtYXguIGVpbmUgU2VrdW5kZSkKK2ludCBzcGVsbF9mYXRpZ3VlX2NvbXBhdF9tb2RlOworCisvLyBFaW4gY3JlYXRlKCkgZnVlciBkYXMgTWFwcGluZworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICBtYXBwaW5nIGFjdDsKKworICA6OmNyZWF0ZSgpOworCisgIC8vIFdpciBob2xlbiBkaWUgR2lsZGVuIGF1cyBkZW0gR2lsZGVubWFzdGVyIAorICBmb3JlYWNoKHN0cmluZyBndWlsZDoKKyAgICAgIChzdHJpbmcgKiljYWxsX290aGVyKEdVSUxETUFTVEVSLCJRdWVyeVByb3AiLFBfVkFMSURfR1VJTERTKSkKKyAgeworICAgIGlmKGNhdGNoKGFjdD1jYWxsX290aGVyKCIvZ2lsZGVuLyIrZ3VpbGQsIlF1ZXJ5UHJvcCIsCisgICAgICAgIFBfR1VJTERfREVBQ1RJVkFURV9TS0lMTFMpOyBwdWJsaXNoICkpCisgICAgICAgIGxvZ19maWxlKCJXRUFQT05fU0tJTExTIiwgc3ByaW50ZiAoIiVzOiBHaWxkZSBuaWNodCBsYWRiYXI6ICIKKyAgICAgICAgICAgICAgKyJUUDogJU8sIFRJOiAlTywgUE86ICVPLCBHaWxkZTogJXNcbiIsIGR0aW1lKHRpbWUoKSksCisgICAgICAgICAgICAgIHRoaXNfcGxheWVyKCksIHRoaXNfaW50ZXJhY3RpdmUoKSwgcHJldmlvdXNfb2JqZWN0KCksIGd1aWxkKSk7CisgICAgZWxzZSBpZiAoYWN0KSAvLyB3ZW5uIGFjdCwgaW5zIE1hcHBpbmcgYXVmbmVobWVuLgorICAgICAgICBkZWFjdGl2YXRlZF9za2lsbHMrPShbZ3VpbGQ6YWN0XSk7CisgIH0KKyAgLy8ga2VpbmUgZWNodGUgUHJvcCBtZWhyLCBTYXZlLU1vZHVzIHVubm9ldGlnLgorICBTZXQoUF9ORVhUX1NQRUxMX1RJTUUsU0FWRSxGX01PREVfQUQpOworCisgIFNldChQX1NLSUxMU1ZFUlNJT04sIFNBVkV8U0VDVVJFRCwgRl9NT0RFX0FTKTsKK30KKworLy8gRGFzIE1hcHBpbmcga2FubiBtYW4gYXVjaCBhYmZyYWdlbgorCitwdWJsaWMgbWFwcGluZyBHZXREZWFjdGl2YXRlZFNraWxscygpCit7CisgICAgcmV0dXJuIGNvcHkoZGVhY3RpdmF0ZWRfc2tpbGxzKTsKK30KKworLy8gRnVua3Rpb24sIGRpZSBzYWd0IG9iIGVpbiBBTlktU2tpbGwgZGVha3RpdmllcnQgaXN0LgorcHVibGljIGludCBpc19kZWFjdGl2YXRlZF9za2lsbChzdHJpbmcgc25hbWUsc3RyaW5nIGd1aWxkKQoreworICAgICAgICBpZiAoZGVhY3RpdmF0ZWRfc2tpbGxzW2d1aWxkXSkgICAgICAgIAorICAgICAgICAgICAgICAgIHJldHVybiBkZWFjdGl2YXRlZF9za2lsbHNbZ3VpbGRdW3NuYW1lXTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKworLy8gRnVua3Rpb24gZnVlciBkaWUgV2FmZmVuc2tpbGxzCisvLyB0cmFlZ3QgZGllIGFsbGcuIFdhZmZlbnNraWxscyBlaW4uIFdpcmQgZ2dmLiB2b24gRml4U2tpbGxzKCkgZ2VydWZlbi4KKy8vIChEYXMgRWludHJhZ2VuIGJlZGV1dGV0IG5pY2h0LCBkYXNzIGRpZSBha3RpdiBzaW5kISBBYmVyIGJlaSBHaWxkZW53ZWNoc2VsCisvLyB3ZXJkZW4gc2llIG5pY2h0IGVpbmdldHJhZ2VuKS4KK3ByaXZhdGUgdm9pZCBzZXRfd2VhcG9uX3NraWxscygpIHsKKworICBpZiAoUXVlcnlTa2lsbEFiaWxpdHkoRklHSFQoV1RfU1dPUkQpKTw9MCkgICAgICAgICAgICAgICAgCisgICAgICBNb2RpZnlTa2lsbChGSUdIVChXVF9TV09SRCksKFtTSV9TS0lMTEFCSUxJVFk6MF0pLDE1MCwiQU5ZIik7ICAgIAorICBpZiAoUXVlcnlTa2lsbEFiaWxpdHkoRklHSFQoV1RfQVhFKSk8PTApICAgICAgICAgICAgICAgIAorICAgICAgTW9kaWZ5U2tpbGwoRklHSFQoV1RfQVhFKSwoW1NJX1NLSUxMQUJJTElUWTowXSksMTUwLCJBTlkiKTsgICAgICAgICAgCisgIGlmIChRdWVyeVNraWxsQWJpbGl0eShGSUdIVChXVF9TUEVBUikpPD0wKSAgICAgICAgCisgICAgICBNb2RpZnlTa2lsbChGSUdIVChXVF9TUEVBUiksKFtTSV9TS0lMTEFCSUxJVFk6MF0pLDE1MCwiQU5ZIik7ICAgICAgICAgIAorICBpZiAoUXVlcnlTa2lsbEFiaWxpdHkoRklHSFQoV1RfV0hJUCkpPD0wKQorICAgICAgTW9kaWZ5U2tpbGwoRklHSFQoV1RfV0hJUCksKFtTSV9TS0lMTEFCSUxJVFk6MF0pLDE1MCwiQU5ZIik7CisgIGlmIChRdWVyeVNraWxsQWJpbGl0eShGSUdIVChXVF9LTklGRSkpPD0wKSAgICAgICAgICAgICAgICAKKyAgICAgIE1vZGlmeVNraWxsKEZJR0hUKFdUX0tOSUZFKSwoW1NJX1NLSUxMQUJJTElUWTowXSksMTUwLCJBTlkiKTsgICAgICAgICAgCisgIGlmIChRdWVyeVNraWxsQWJpbGl0eShGSUdIVChXVF9DTFVCKSk8PTApICAgICAgICAgICAgICAgIAorICAgICAgTW9kaWZ5U2tpbGwoRklHSFQoV1RfQ0xVQiksKFtTSV9TS0lMTEFCSUxJVFk6MF0pLDE1MCwiQU5ZIik7ICAgICAgICAgIAorICBpZiAoUXVlcnlTa2lsbEFiaWxpdHkoRklHSFQoV1RfU1RBRkYpKTw9MCkKKyAgICAgIE1vZGlmeVNraWxsKEZJR0hUKFdUX1NUQUZGKSwoW1NJX1NLSUxMQUJJTElUWTowXSksMTUwLCJBTlkiKTsKK30gCisKKy8vIGluaXRpYWxpc2llcnQgZGllIFNraWxscyBmdWVyIFNwaWVsZXIgKG1vbWVudGFuOiBhbGxnLiBXYWZmZW5za2lsbHMgc2V0emVuCisvLyB1bmQgUF9TS0lMTFNfVkVSU0lPTikKK3Byb3RlY3RlZCB2b2lkIEluaXRTa2lsbHMoKSB7CisgIG1hcHBpbmcgc2tpOworICAvLyBzY2hvbm1hbCBpbml0aWFsaXNpZXJ0PworICBpZiAobWFwcGluZ3Aoc2tpPVF1ZXJ5KFBfTkVXU0tJTExTLCBGX1ZBTFVFKSkgJiYgc2l6ZW9mKHNraSkpCisgICAgcmV0dXJuOworCisgIC8vIGFsbGcuIFdhZmZlbnNraWxscyBha3RpdmllcmVuCisgIHNldF93ZWFwb25fc2tpbGxzKCk7CisKKyAgLy8gVmVyc2lvbiBzZXR6ZW4KKyAgU2V0UHJvcChQX1NLSUxMU1ZFUlNJT04sIENVUlJFTlRfU0tJTExfVkVSU0lPTik7CisgIFNldChQX1NLSUxMU1ZFUlNJT04sIFNBVkV8U0VDVVJFRCwgRl9NT0RFX0FTKTsKK30KKworLy8gVXBkYXRlZCBTa2lsbHMgYXVzIFZlcnNpb24gMCB1bmQgMSBoZXJhdXMuCitwcml2YXRlIHZvaWQgRml4U2tpbGxWMShzdHJpbmcgc2tpbGxuYW1lLCBtaXhlZCBzaW5mbykgeworICAvLyBhbHRlIFNraWxscyBhdWYgbWFwcGluZ3Mgbm9ybWllcmVuCisgIGlmIChpbnRwKHNpbmZvKSkgeworICAgIHNpbmZvID0gKFtTSV9TS0lMTEFCSUxJVFk6IHNpbmZvIF0pOworICB9CisgIC8vIEVpbmUgUmVpaGUgdm9uIERhdGVuIHdlcmRlbiBnZWxvZXNjaHQsIGRhIGRpZSBEYXRlbiBhdXMgZGVyCisgIC8vIEdpbGRlL1NwZWxsYm9vayBmcmlzY2gga29tbWVuIHNvbGx0ZW4gdW5kIHNpZSBuaWNodCBzcGllbGVyLWluZGl2aWR1ZWxsCisgIC8vIHNpbmQ6IFNJX0NMT1NVUkUgKHdpcmQgb250aGVmbHkga29ycmVrdCBuZXUgZXJ6ZXVndCksIFNJX1NLSUxMQVJHLAorICAvLyBTSV9OVU1CRVJfRU5FTUlFUywgU0lfTlVNQkVSX0ZSSUVORFMsIFNJX0RJU1RBTkNFLCBTSV9XSURUSCwgU0lfREVQVEgsCisgIC8vIFNJX1RFU1RGTEFHLCBTSV9FTkVNWSwgU0lfRlJJRU5ELgorICAvLyBBdXNzZXJkZW0gc2luZCBhbGxlIFNQXyogaW0gdG9wbGV2ZWwgZmFsc2NoLCBkaWUgbXVlc3NlbiBhKSBpbiBTSV9TUEVMTAorICAvLyB1bmQgc29sbHRlbiBiKSBuaWNodCBpbSBTcGllbGVyIGdlc3BlaWNoZXJ0IHdlcmRlbiwgc29uZGVybiB2b24KKyAgLy8gR2lsZGVuL1NwZWxsYm9vayBqZXdlaWxzIGZyaXNjaCBrb21tZW4uCisgIC8vIGFsbCBkaWVzZXMgWmV1ZyBsYW5kZXRlIGluIGFsdGVuIFNwaWVsZXJuIGltIFNhdmVmaWxlLgorICBpZiAobWFwcGluZ3Aoc2luZm8pKQorICAgIHNpbmZvIC09IChbU0lfQ0xPU1VSRSwgU0lfU0tJTExBUkcsIFNJX05VTUJFUl9FTkVNSUVTLCBTSV9OVU1CRVJfRlJJRU5EUywKKyAgICAgICAgICAgICBTSV9ESVNUQU5DRSwgU0lfV0lEVEgsIFNJX0RFUFRILCBTSV9URVNURkxBRywgU0lfRU5FTVksCisgICAgICAgICAgICAgU0lfRlJJRU5ELCBTUF9OQU1FLCBTUF9TSE9XX0RBTUFHRSwgU1BfUkVEVUNFX0FSTU9VUiwKKyAgICAgICAgICAgICBTUF9QSFlTSUNBTF9BVFRBQ0ssIFNQX1JFQ1VSU0lWRSwgU1BfTk9fRU5FTVksCisgICAgICAgICAgICAgU1BfTk9fQUNUSVZFX0RFRkVOU0UsIFNQX0dMT0JBTF9BVFRBQ0sgXSk7CisgIGVsc2UKKyAgeworICAgIHRlbGxfb2JqZWN0KHRoaXNfb2JqZWN0KCksc3ByaW50ZigKKyAgICAgICJcbioqKiogQUNIVFVORyAtIEZFSExFUiAqKipcbiIgCisgICAgICAiRGVpbmUgU2tpbGxzIGVudGhhbHRlbiBlaW5lbiBkZWZla3RlbiBTa2lsbCAlTzpcbiIKKyAgICAgICJCaXR0ZSBsYXNzIGRpZXMgdm9uIGVpbmVtIEVyem1hZ2llciB1ZWJlcnBydWVmZW4uXG4iLAorICAgICAgc2tpbGxuYW1lKSk7CisgIH0KK30KKworLy8gVXBkYXRldCB1bmQgcmVwYXJpZXJ0IGdnZi4gU2tpbGxtYXBwaW5ncyBpbiBTcGllbGVybgorcHJvdGVjdGVkIHZvaWQgRml4U2tpbGxzKCkgeworCisgIC8vIG51ciBiZWkgZ2VudWcgcmVjaGVuemVpdCBsb3NsZWdlbgorICBpZiAoZ2V0X2V2YWxfY29zdCgpIDwgNzUwMDAwKSB7CisgICAgY2FsbF9vdXQoIydGaXhTa2lsbHMsIDEpOworICAgIHJldHVybjsKKyAgfQorICAvLyB3ZW5uIGdhciBrZWluZSBTa2lsbHMgZGEgKD8pOiBJbml0U2tpbGxzKCkgcnVmZW4uCisgIG1hcHBpbmcgYWxsc2tpbGxzID0gUXVlcnkoUF9ORVdTS0lMTFMsIEZfVkFMVUUpOworICBpZiAoIW1hcHBpbmdwKGFsbHNraWxscykgfHwgIXNpemVvZihhbGxza2lsbHMpKSB7CisgICAgICBJbml0U2tpbGxzKCk7CisgICAgICByZXR1cm47CisgIH0KKworICAvLyBEaWUgRmFsbHRocm91Z2hzIGluIGRpZXNlbSBzd2l0Y2ggc2luZCB2b2xsIEFic2ljaHQhCisgIHN3aXRjaChRdWVyeVByb3AoUF9TS0lMTFNWRVJTSU9OKSkgeworICAgIC8vIGJlaSBWZXJzaW9uIDAgdW5kIDEgZGFzIGdsZWljaGUgdHVuCisgICAgY2FzZSAwOiAvLyB2b24gMCBhdWYgMQorICAgIGNhc2UgMTogLy8gdm9uIDEgYXVmIDIKKyAgICAgIGZvcmVhY2goc3RyaW5nIGdpbGRlLCBtYXBwaW5nIHNraWxsczogYWxsc2tpbGxzKSB7CisgICAgICAgIGlmICghc3RyaW5ncChnaWxkZSkpIHsKKyAgICAgICAgICAvLyBzb2xsdGUgbmljaHQgdm9ya29tbWVuIC0gdGF0IGFiZXIuLi4gKnNldWZ6KgorICAgICAgICAgIG1fZGVsZXRlKHNraWxscywgZ2lsZGUpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHdhbGtfbWFwcGluZyhza2lsbHMsICMnRml4U2tpbGxWMSk7CisgICAgICB9CisgICAgICAvLyBhbGxnLiBXYWZmZW5za2lsbHMgYWt0aXZpZXJlbiwgZWluaWdlIGFsdGUgU3BpZWxlciBoYWJlbiBkaWUgbm9jaAorICAgICAgLy8gbmljaHQuCisgICAgICBzZXRfd2VhcG9uX3NraWxscygpOworICAgICAgLy8gU3BlaWNoZXJmbGFnIGZ1ZXIgZGllIFZlcnNpb25zcHJvcCBtdXNzIG5vY2ggZ2VzZXR6dCB3ZXJkZW4uCisgICAgICBTZXQoUF9TS0lMTFNWRVJTSU9OLCBTQVZFfFNFQ1VSRUQsIEZfTU9ERV9BUyk7CisgICAgICAvLyBWZXJzaW9uIGlzdCBqZXR6dCAyLgorICAgICAgU2V0UHJvcChQX1NLSUxMU1ZFUlNJT04sIDIpOworICAgICAgLy8gRmFsbC10aHJvdWdoCisgICBjYXNlIDI6CisgICAgICAvLyBnaWJ0IGVzIG5vY2ggbmljaHQsIG5pY2h0cyBtYWNoZW4uCisgICAgICAvL1NldFByb3AoUF9TS0lMTFNWRVJTSU9OLCAzKTsKKyAgICAgIC8vIEZhbGwtdGhyb3VnaCwgYXVzc2VyIGVzIHNpbmQgenV3ZW5pZyBUaWNrcyBkYSEKKyAgICAgIGlmIChnZXRfZXZhbF9jb3N0KCkgPCA3NTAwMDApCisgICAgICAgIGJyZWFrOyAKKyAgfQorICAvLyBGYWxscyBub2NoIG5pY2h0IGF1ZiBkZXIgYWt0dWVsbGVuIFZlcnNpb24gYW5nZWtvbW1lbiwgbmV1ZXIgY2FsbG91dAorICBpZiAoUXVlcnlQcm9wKFBfU0tJTExTVkVSU0lPTikgPCBDVVJSRU5UX1NLSUxMX1ZFUlNJT04pCisgICAgICBjYWxsX291dCgjJ0ZpeFNraWxscywgMik7Cit9CisKK3Byb3RlY3RlZCB2b2lkIHVwZGF0ZXNfYWZ0ZXJfcmVzdG9yZShpbnQgbmV3ZmxhZykgeworICAvL0FsbGdlbWVpbmUgV2FmZmVuc2tpbGxzIGFrdGl2aWVyZW4sIHdlbm4gbm9ldGlnCisgIC8vIFdpcmQgbnVuIHZvbiBJbml0U2tpbGxzIGJ6dy4gRml4U2tpbGxzIHVlYmVybm9tbWVuLCBmYWxscyBub2V0aWcuCisgIGlmIChuZXdmbGFnKSB7CisgICAgSW5pdFNraWxscygpOworICB9CisgIGVsc2UgaWYgKFF1ZXJ5UHJvcChQX1NLSUxMU1ZFUlNJT04pIDwgQ1VSUkVOVF9TS0lMTF9WRVJTSU9OKSB7CisgICAgLy8gRmFsbHMgbm9ldGlnLCBTa2lsbHMgZml4ZW4vdXBkYXRlbi4gKmdydW1tZWwqCisgICAgRml4U2tpbGxzKCk7CisgIH0KKyAgLy8gUHJvcCBnaWJ0IGVzIG5pY2h0IG1laHIuIFNBVkUtU3RhdHVzIGxvZXNjaGVuLiAKKyAgU2V0KFBfR1VJTERfUFJFVkVOVFNfUkFDRVNLSUxMLFNBVkUsRl9NT0RFX0FEKTsKK30KKworLy8gU3RhbmRhcmRpc2llcnRlIE5haGthbXBmLUZ1bmt0aW9uIGZ1ZXIgYWxsZSBOYWhrYW1wZi1XYWZmZW5hcnRlbgorcHJvdGVjdGVkIG1hcHBpbmcgU2hvcnRSYW5nZVNraWxsKG9iamVjdCBtZSwgc3RyaW5nIHNuYW1lLCBtYXBwaW5nIHNpbmZvKSAKK3sgCisgIGludCB2YWwsIHc7CisgIG9iamVjdCBlbmVteTsKKyAgCisgIGlmICghbWFwcGluZ3Aoc2luZm8pIHx8ICFvYmplY3RwKHNpbmZvW1BfV0VBUE9OXSkpCisgICAgcmV0dXJuIDA7CisKKyAgdyA9IChbV1RfS05JRkUgOiA4LAorICAgICAgICBXVF9TV09SRCA6IDUsCisgICAgICAgIFdUX0FYRSAgIDogNCwKKyAgICAgICAgV1RfU1BFQVIgOiA2LAorICAgICAgICBXVF9DTFVCICA6IDEsCisgICAgICAgIFdUX1dISVAgIDogOSwKKyAgICAgICAgV1RfU1RBRkYgOiA3XSlbc2luZm9bUF9XRUFQT05dLT5RdWVyeVByb3AoUF9XRUFQT05fVFlQRSldOworICAgICAgCisKKyAgdmFsID0gc2luZm9bU0lfU0tJTExBQklMSVRZXSooc2luZm9bUF9XRUFQT05dLT5RdWVyeVByb3AoUF9XQykqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3KlF1ZXJ5QXR0cmlidXRlKEFfREVYKSsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxMC13KSpRdWVyeUF0dHJpYnV0ZShBX1NUUikpLzcwMCkKKyAgICAgICAgL01BWF9BQklMSVRZOworCisgIGlmICh2YWwgPiA4NSkgeworICAgIGxvZ19maWxlKCJXRUFQT05fU0tJTExTIiwgc3ByaW50ZigiJXM6IFp1IGhvaGVyIFNjaGFkZW4gdm9uOiAiCisgICAgKyJUTzogJU8sIFRJOiAlTywgUE86ICVPLCB2YWw6ICVkLCBBX0RFWDogJWQsIEFfU1RSOiAlZCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIlBfV0VBUE9OOiAlTywgUF9XQzogJWRcbiIsIGR0aW1lKHRpbWUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfb2JqZWN0KCksIHRoaXNfaW50ZXJhY3RpdmUoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzX29iamVjdCgpLCB2YWwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWVyeUF0dHJpYnV0ZShBX0RFWCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1ZXJ5QXR0cmlidXRlKEFfU1RSKSwgc2luZm9bUF9XRUFQT05dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5mb1tQX1dFQVBPTl0tPlF1ZXJ5UHJvcChQX1dDKSkpOworICAgIHZhbCA9IDg1OworICB9CisKKyAgLyoKKyAgICBEZXIgenVz5HR6bGljaGUgU2NoYWRlbiBkZXIgYWxsZ2VtZWluZW4gV2FmZmVuc2tpbGxzIGJlcmVjaG5ldAorICAgIHNpY2ggd2llIGZvbGd0OiAKKworICAgIHNpbmZvW1NJX1NLSUxMQUJJTElUWSkqIChQX1dDICogKCBYICkgLyA4MDApIC8gTUFYX0FCSUxJVFkKKworICAgIERhYmVpIGJlcnVlY2tzaWNodGlndCBYIGplIG5hY2ggV2FmZmVudHlwIGluIHVudGVyc2NoaWVkbGljaGVyCisgICAgR2V3aWNodHVuZyBkaWUgV2VydGUgZnVlciBHZXNjaGlja2xpY2hrZWl0IHVuZCBTdGFlcmtlLiAKKworICAgICBYID09IAorCisgICAgICAgTWVzc2VyICAgOiA4KkFfREVYICsgMipBX1NUUgorICAgICAgIFNjaHdlcnQgIDogNSpBX0RFWCArIDUqQV9TVFIKKyAgICAgICBBeHQgICAgICA6IDQqQV9ERVggKyA2KkFfU1RSIAorICAgICAgIFNwZWVyICAgIDogNipBX0RFWCArIDQqQV9TVFIKKyAgICAgICBLZXVsZSAgICA6IDEqQV9ERVggKyA5KkFfU1RSCisgICAgICAgUGVpdHNjaGUgOiA5KkFfREVYICsgMSpBX1NUUgorICAqLworCisgIHNpbmZvW1NJX1NLSUxMREFNQUdFXSs9dmFsOworCisKKyAgLyogTGVybmVuOiBXaXJkIGltbWVyIHNjaHdpZXJpZ2VyLCBudXIgYmVpIGplZGVtIDIwLiBTY2hsYWcgaW0gU2Nobml0dCwKKyAgICogdW5kIG51ciBkYW5uLCB3ZW5uIGRlciBHZWduZXIgYXVjaCBYUCBnaWJ0LiAqLworICBpZiAocmFuZG9tKE1BWF9BQklMSVRZKzEpPnNpbmZvW1NJX1NLSUxMQUJJTElUWV0gJiYgIXJhbmRvbSgxMCkpCisgIHsKKyAgICAgICAgIGVuZW15PXNpbmZvW1NJX0VORU1ZXTsKKyAgICAgICAgIGlmIChvYmplY3RwKGVuZW15KSAmJiAoZW5lbXktPlF1ZXJ5UHJvcChQX1hQKT4wKSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgb2JqZWN0IGF1c2JpbGRlcjsKKyAgICAgICAgLy8gICAgICAgICBsb2dfZmlsZSgiaHVtbmkvbG9nX3d1cm0iLCJIYXV0OiAlcyB1bmQgendhciAlcywgbWl0IHhwICVkXG4iLGdldGV1aWQodGhpc19vYmplY3QoKSksdG9fc3RyaW5nKGVuZW15KSxlbmVteS0+UXVlcnlQcm9wKFBfWFApKTsKKyAgICAgICAgICAgIExlYXJuU2tpbGwoc25hbWUsIHJhbmRvbSg1KSwgMTUwKTsKKyAgICAgICAgLy8gR2lidCBlcyBlaW5lbiBBdXNiaWxkZXI/CisgICAgICAgIGlmIChRdWVyeVByb3AoUF9XRUFQT05fVEVBQ0hFUikgJiYgCisgICAgICAgICAgICAgICAgICAgICAgICBhdXNiaWxkZXI9ZmluZF9wbGF5ZXIoUXVlcnlQcm9wKFBfV0VBUE9OX1RFQUNIRVIpKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvLyBJc3QgZGVyIEF1c2JpbGRlciBhbndlc2VuZD8KKyAgICAgICAgICAgIGlmIChwcmVzZW50KGF1c2JpbGRlcixlbnZpcm9ubWVudCgpKSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAvLyBBdXNiaWxkZXIgdW5kIEF6dWJpIG11ZXNzZW4gZGllc2VsYmUgV2FmZmUgaGFiZW4uCisgICAgICAgICAgICAgIC8vc3RyaW5nIHd0X2F1cyx3dF9henU7CisgICAgICAgICAgICAgIG9iamVjdCB3YWZfYXVzLHdhZl9henU7CisKKyAgICAgICAgICAgICAgd2FmX2F6dT1RdWVyeVByb3AoUF9XRUFQT04pOworICAgICAgICAgICAgICB3YWZfYXVzPWNhbGxfb3RoZXIoYXVzYmlsZGVyLCJRdWVyeVByb3AiLFBfV0VBUE9OKTsKKworICAgICAgICAgICAgICAvL3d0X2F6dT1jYWxsX290aGVyKHdhZl9henUsIlF1ZXJ5UHJvcCIsUF9XRUFQT05fVFlQRSk7CisgICAgICAgICAgICAgIC8vd3RfYXVzPWNhbGxfb3RoZXIod2FmX2F1cywiUXVlcnlQcm9wIixQX1dFQVBPTl9UWVBFKTsKKyAgICAgICAgICAgICAgLy9pZiAod3RfYXp1PT13dF9hdXMpCisgICAgICAgICAgICAgIGlmIChvYmplY3RwKHdhZl9hdXMpICYmIG9iamVjdHAod2FmX2F6dSkgJiYKKyAgICAgICAgICAgICAgICAgIChzdHJpbmcpd2FmX2F1cy0+UXVlcnlQcm9wKFBfV0VBUE9OX1RZUEUpCisgICAgICAgICAgICAgICAgICAgICA9PSAoc3RyaW5nKXdhZl9henUtPlF1ZXJ5UHJvcChQX1dFQVBPTl9UWVBFKSkgCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEJvbnVzIHZvbiBiaXMgenUgNSBQdW5rdGVuCisgICAgICAgICAgICAgICAgLy9sb2dfZmlsZSgiaHVtbmkvbG9nX2F6dWJpIiwKKyAgICAgICAgICAgICAgICAgIC8vIHNwcmludGYoIkF6dWJpICVPIHVuZCBBdXNiaWxkZXIgJU8gOiBXYWZmZW50eXBlbiAlcyB1bmQgJXMsIGdlbGVybnRcbiIsdGhpc19vYmplY3QoKSwKKyAgICAgICAgICAgICAgICAgICAgLy8gICBhdXNiaWxkZXIsIHd0X2F6dSwgd3RfYXVzKSk7CisgICAgICAgICAgICAgICAgTGVhcm5Ta2lsbChzbmFtZSxyYW5kb20oNiksMTUwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICB9CisKKyAgLyogCisgICAgIERpZSBTY2h3aWVyaWdrZWl0IGxpZWd0IGJlaSAxNTAsIHNvIGRhc3MgCisgICAgIGVpbiBMdmwuIDEgU3BpZWxlciBtYXhpbWFsIDE1JSBTa2lsbCAKKyAgICAgdXN3Li4uCisgICAgIGxlcm5lbiBrYW5uLiAoR2VuYXVlIFRhYmVsbGUgaW4gL3N0ZC9saXZpbmcvc2tpbGxzIGJlaSBMaW1pdEFiaWxpdHkpCisgICovICAgICAgICAgCisKKyAgcmV0dXJuIHNpbmZvOworfQorCisKKy8vIFN0YW5kYXJkaXNpZXJ0ZSBGZXJua2FtcGYtRnVua3Rpb24gZnVlciBhbGxlIEZlcm5rYW1wZi1XYWZmZW5hcnRlbgorCisvLyAqKiogbm9jaCBkZWFrdGl2aWVydCAqKioKKworcHJvdGVjdGVkIG1hcHBpbmcgTG9uZ1JhbmdlU2tpbGwob2JqZWN0IG1lLCBzdHJpbmcgc25hbWUsIG1hcHBpbmcgc2luZm8sIGludCBkYW0pIAoreyBpbnQgYWJpbCx2YWw7CisKKyAgaWYgKCFtYXBwaW5ncChzaW5mbykgfHwgIWRhbSB8fCAhb2JqZWN0cChzaW5mb1tQX1dFQVBPTl0pIHx8CisgICAgICAoc2luZm9bUF9XRUFQT05dLT5RdWVyeVByb3AoUF9TSE9PVElOR19XQykpPDUpCisgICAgcmV0dXJuIDA7CisKKyAgYWJpbD1zaW5mb1tTSV9TS0lMTEFCSUxJVFldK3NpbmZvW09GRlNFVChTSV9TS0lMTEFCSUxJVFkpXTsgCisgIHZhbD1kYW0qYWJpbC9NQVhfQUJJTElUWTsKKyAgdmFsPXZhbC8yK3JhbmRvbSh2YWwvMisxKTsKKyAgdmFsPSh2YWwqUXVlcnlTa2lsbEF0dHJpYnV0ZShTQV9EQU1BR0UpKS8xMDA7CisgIHNpbmZvW1NJX1NLSUxMREFNQUdFXSs9dmFsOworCisgIGlmIChyYW5kb20oTUFYX0FCSUxJVFkrMSk+c2luZm9bU0lfU0tJTExBQklMSVRZXSAmJiByYW5kb20oNTApPT00MikKKyAgICBMZWFyblNraWxsKHNuYW1lLCAxLCAxNTApOworCisgIHJldHVybiBzaW5mbzsKK30KKworCisKKy8vIERpZSBlaW56ZWxuZW4gV2FmZmVuc2tpbGxzIHJ1ZmVuIGRhbm4gbnVyIGRpZSBTdGFuZGFyZC1GdW5rdGlvbiBhdWYuCisKK3Byb3RlY3RlZCBtYXBwaW5nIFN0ZFNraWxsX0ZpZ2h0X2F4ZShvYmplY3QgbWUsIHN0cmluZyBzbmFtZSwgbWFwcGluZyBzaW5mbykKK3sKKyAgcmV0dXJuIFNob3J0UmFuZ2VTa2lsbChtZSwgc25hbWUsIHNpbmZvKTsKK30KKworcHJvdGVjdGVkIG1hcHBpbmcgU3RkU2tpbGxfRmlnaHRfY2x1YihvYmplY3QgbWUsIHN0cmluZyBzbmFtZSwgbWFwcGluZyBzaW5mbykKK3sKKyAgcmV0dXJuIFNob3J0UmFuZ2VTa2lsbChtZSwgc25hbWUsIHNpbmZvKTsKK30KKworcHJvdGVjdGVkIG1hcHBpbmcgU3RkU2tpbGxfRmlnaHRfa25pZmUob2JqZWN0IG1lLCBzdHJpbmcgc25hbWUsIG1hcHBpbmcgc2luZm8pCit7CisgIHJldHVybiBTaG9ydFJhbmdlU2tpbGwobWUsIHNuYW1lLCBzaW5mbyk7Cit9CisKK3Byb3RlY3RlZCBtYXBwaW5nIFN0ZFNraWxsX0ZpZ2h0X3NwZWFyKG9iamVjdCBtZSwgc3RyaW5nIHNuYW1lLCBtYXBwaW5nIHNpbmZvKQoreworICByZXR1cm4gU2hvcnRSYW5nZVNraWxsKG1lLCBzbmFtZSwgc2luZm8pOworfQorCitwcm90ZWN0ZWQgbWFwcGluZyBTdGRTa2lsbF9GaWdodF9zd29yZChvYmplY3QgbWUsIHN0cmluZyBzbmFtZSwgbWFwcGluZyBzaW5mbykgCit7CisgIHJldHVybiBTaG9ydFJhbmdlU2tpbGwobWUsIHNuYW1lLCBzaW5mbyk7Cit9CisKK3Byb3RlY3RlZCBtYXBwaW5nIFN0ZFNraWxsX0ZpZ2h0X3doaXAob2JqZWN0IG1lLCBzdHJpbmcgc25hbWUsIG1hcHBpbmcgc2luZm8pCit7CisgIHJldHVybiBTaG9ydFJhbmdlU2tpbGwobWUsIHNuYW1lLCBzaW5mbyk7Cit9CisKK3Byb3RlY3RlZCBtYXBwaW5nIFN0ZFNraWxsX0ZpZ2h0X3N0YWZmKG9iamVjdCBtZSwgc3RyaW5nIHNuYW1lLCBtYXBwaW5nIHNpbmZvKQoreworICByZXR1cm4gU2hvcnRSYW5nZVNraWxsKG1lLCBzbmFtZSwgc2luZm8pOworfQorCisKKworCisvLyBEaWUgRmVybndhZmZlbnNraWxscyBzaW5kIE11bml0aW9uc2FiaGFlbmdpZworCisvLyAqKiogbm9jaCBkZWFrdGl2aWVydCAqKioKKworcHJvdGVjdGVkIG1hcHBpbmcgU3RkU2tpbGxfU2hvb3RfYXJyb3cob2JqZWN0IG1lLCBzdHJpbmcgc25hbWUsIG1hcHBpbmcgc2luZm8pCit7CisgIHJldHVybiBMb25nUmFuZ2VTa2lsbChtZSwgc25hbWUsIHNpbmZvLCA0MCk7Cit9CisKK3Byb3RlY3RlZCBtYXBwaW5nIFN0ZFNraWxsX1Nob290X2JvbHQob2JqZWN0IG1lLCBzdHJpbmcgc25hbWUsIG1hcHBpbmcgc2luZm8pCit7IAorICByZXR1cm4gTG9uZ1JhbmdlU2tpbGwobWUsIHNuYW1lLCBzaW5mbywgNDApOworfQorCitwcm90ZWN0ZWQgbWFwcGluZyBTdGRTa2lsbF9TaG9vdF9kYXJ0KG9iamVjdCBtZSwgc3RyaW5nIHNuYW1lLCBtYXBwaW5nIHNpbmZvKQoreworICByZXR1cm4gTG9uZ1JhbmdlU2tpbGwobWUsIHNuYW1lLCBzaW5mbywgMjApOworfQorCitwcm90ZWN0ZWQgbWFwcGluZyBTdGRTa2lsbF9TaG9vdF9zdG9uZShvYmplY3QgbWUsIHN0cmluZyBzbmFtZSwgbWFwcGluZyBzaW5mbykKK3sKKyAgcmV0dXJuIExvbmdSYW5nZVNraWxsKG1lLCBzbmFtZSwgc2luZm8sIDQwKTsKK30KKworcHJvdGVjdGVkIG1peGVkIF9xdWVyeV9sb2NhbGNtZHMoKSB7CisgICAgcmV0dXJuICh7ICh7InNwcnVjaGVybXVlZHVuZyIsImVuYWJsZV9zcGVsbF9mYXRpZ3VlX2NvbXBhdCIsMCwwfSkgfSk7Cit9CisKKworCisvLyAqKiogS29tcGF0aWJpbGl0YWV0c21vZHVzIGZ1ZXIgU3BlbGxmYXRpZ3VlcyAoRW11bGF0aW9uIDJzLUFsYXJtemVpdCkgKioqCisKKy8qKiBTcGVpY2hlcnQgZWluZSBTcGVsbGZhdGlndWUgdm9uIDxkdXJhdGlvbj4gU2VrdW5kZW4gZnVlciA8a2V5Pi4KKyAqIElzdCBoaWVyIG51ciBmdWVyIGRlbiBTcGVsbGZhdGlndWUtQ29tcGF0LW1vZGUuCisgKiA8a2V5PiBkYXJmIDAgc2VpbiB1bmQgYmV6ZWljaG5ldCBkYXMgZ2xvYmFsZSBTcGVsbGZhdGlndWUuCisgKiBSdWVja2dhYmV3ZXJ0OiBBYmxhdWZ6ZWl0IGRlciBnZXNldHp0ZW4gU3BlcnJlCisgICAgICAgICAgICAgICAgICAtMSwgd2VubiBub2NoIGVpbmUgbmljaHQtYWJnZWxhdWZlbmUgU3BlcnJlIGF1ZiBkZW0gPGtleT4gbGFnLgorICAgICAgICAgICAgICAgICAgMCwgd2VubiBkdXJhdGlvbiAwIGlzdC4KKyAqLworcHVibGljIHZhcmFyZ3MgaW50IFNldFNwZWxsRmF0aWd1ZShpbnQgZHVyYXRpb24sIHN0cmluZyBrZXkpIHsKKworICAvLyAwIHNvbGx0ZSBuaWUgZWluZSBTcGVycmUgYmV3aXJrZW4sIGF1Y2ggbmljaHQgaW0gY29tcGF0IG1vZGUuCisgIGlmICghZHVyYXRpb24pIHJldHVybiAwOworCisgIGlmIChzcGVsbF9mYXRpZ3VlX2NvbXBhdF9tb2RlKSB7CisgICAgLy8gU3BlbGwtRmF0aWd1ZXMgYXVmIEhCcyBzeW5jaHJvbmlzaWVyZW4gKDJzLUFsYXJtemVpdC1FbXVsYXRpb24pLgorICAgIC8vIEF1ZnJ1bmRlbiBhdWYgZ2FuenphaGxpZ2UgVmllbGZhY2hlIHZvbiBfX0hFQVJUX0JFQVRfSU5URVJWQUxfXworICAgIGlmIChkdXJhdGlvbiAlIF9fSEVBUlRfQkVBVF9JTlRFUlZBTF9fKQorICAgICAgICArK2R1cmF0aW9uOworCisgICAgLy8gU3RhcnRwdW5rdCBkZXMgRGVsYXkgc29sbCBCZWdpbm4gZGVyIGFrdHVlbGxlbiBLYW1wZnJ1bmRlIChIQi1aeWtsdXMpCisgICAgLy8gc2VpbiwgZ2dmLiB1bSBtYXguIGVpbmUgU2VrdW5kZSB6dXJ1ZWNrZGF0aWVyZW4uCisgICAgLy8gKHNwZWxsX2ZhdGlndWVfY29tcGF0X21vZGUgaGF0IGRpZSBaZWl0IGRlcyBsZXR6dGVuIEhCLUF1ZnJ1ZnMpCisgICAgLy8gRmFsbHMgZHVyY2ggaXJnZW5kZWluIFByb2JsZW0gKHouQi4gc2VociBob2hlIExhc3QpLCBkZXIgbGV0enRlIEhCCisgICAgLy8gbGFlbmdlciBhbHMgMXMgenVydWVja2xpZWd0LCBmdW5rdGlvbmllcnQgZGFzIG5hdHVlcmxpY2ggbmljaHQsIGFiZXIKKyAgICAvLyBiZWkgZmF0aWd1ZSs9c3BlbGxfZmF0aWd1ZV9jb21wYXRfbW9kZSBrYW5uIGRlciBTcGllbGVyIHp1dmllbCBaZWl0CisgICAgLy8gZWluc3BhcmVuLgorICAgIGlmICh0aW1lKCkgPiBzcGVsbF9mYXRpZ3VlX2NvbXBhdF9tb2RlKQorICAgICAgICAtLWR1cmF0aW9uOyAgLy8xcyB6dXJ1ZWNrZGF0aWVyZW4KKyAgfQorCisgIHJldHVybiA6OlNldFNwZWxsRmF0aWd1ZShkdXJhdGlvbiwga2V5KTsKK30KKworLyoqIEJlZmVobHNmdW5rdGlvbiBmdWVyIFNwaWVsZXIgdW0gZGVuIFNwZWxsZmF0aWd1ZS1Lb21wYXRpYmlsaXRhZXRzbW9kdXMKKyAqIHVtenVzY2hhbHRlbi4KKyAqLworcHVibGljIGludCBlbmFibGVfc3BlbGxfZmF0aWd1ZV9jb21wYXQoc3RyaW5nIGNtZCkgeworICBpZiAoUXVlcnlQcm9wKFBfTEFTVF9DT01CQVRfVElNRSkgKyA2MDAgPiB0aW1lKCkpIHsKKyAgICB3cml0ZShicmVha19zdHJpbmcoCisgICAgICAiSW0gS2FtcGYgb2RlciBrdXJ6IG5hY2ggZWluZW0gS2FtcGYga2FubnN0IER1IG5pY2h0IHp3aXNjaGVuICIKKyAgICAgICJhbHRlciB1bmQgbmV1ZXIgU3BydWNoZXJtdWVkdW5nIHVtc2NoYWx0ZW4uXG4iCisgICAgICAiTW9tZW50YW4gYmVudXR6dCBEdSBkaWUgIgorICAgICAgKyAoc3BlbGxfZmF0aWd1ZV9jb21wYXRfbW9kZSA/ICJhbHRlICh1bmdlbmF1ZXJlKSIgOiAibmV1ZSAobm9ybWFsZSkiKQorICAgICAgKyAiIFNwcnVjaGVybXVlZHVuZy4iLDc4LDAsQlNfTEVBVkVfTVlfTEZTKSk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBpZiAoY21kPT0iYWx0IikgeworICAgIHNwZWxsX2ZhdGlndWVfY29tcGF0X21vZGU9dGltZSgpOworICAgIHdyaXRlKGJyZWFrX3N0cmluZygKKyAgICAgICJBbHRlIFNwcnVjaGVybXVlZHVuZyB3dXJkZSBlaW5nZXNjaGFsdGV0LiBBbGxlIEVybXVlZHVuZ3NwYXVzZW4gIgorICAgICAgInp3aXNjaGVuIFNwcnVlY2hlbiB3ZXJkZW4gYXVmIFZpZWxmYWNoZSB2b24gMnMgYXVmZ2VydW5kZXQgdW5kICIKKyAgICAgICJiZWdpbm5lbiBpbiBkZXIgUmVnZWwgYW0gQW5mYW5nIERlaW5lciBLYW1wZnJ1bmRlLiIpKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBlbHNlIGlmIChjbWQ9PSJuZXUiIHx8IGNtZD09Im5vcm1hbCIpIHsKKyAgICBzcGVsbF9mYXRpZ3VlX2NvbXBhdF9tb2RlPTA7CisgICAgd3JpdGUoYnJlYWtfc3RyaW5nKAorICAgICAgIk5vcm1hbGUgU3BydWNoZXJtdWVkdW5nIHd1cmRlIGVpbmdlc2NoYWx0ZXQuIEFsbGUgRXJtdWVkdW5nc3BhdXNlbiAiCisgICAgICAiendpc2NoZW4gU3BydWVjaGVuIHdlcmRlbiBzZWt1bmRlbmdlbmF1IGJlcmVjaG5ldC4iKSk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBub3RpZnlfZmFpbChicmVha19zdHJpbmcoCisgICAgICAiTW9lY2h0ZXN0IER1IGRpZSBhbHRlIG9kZXIgZGllIG5ldWUgU3BydWNoZXJtdWVkdW5nP1xuIgorICAgICAgIk1vbWVudGFuIGJlbnV0enQgRHUgZGllICIKKyAgICAgICsgKHNwZWxsX2ZhdGlndWVfY29tcGF0X21vZGUgPyAiYWx0ZSAodW5nZW5hdWVyZSkiIDogIm5ldWUgKG5vcm1hbGUpIikKKyAgICAgICsgIiBTcHJ1Y2hlcm11ZWR1bmcuIiw3OCwwLEJTX0xFQVZFX01ZX0xGUykpOworICByZXR1cm4gMDsKK30KKworLyoqIFNwZWljaGVydCBkaWUgWmVpdCBkZXMgbGV0enRlcyBIZWFydGJlYXRzLgorICovCitwcm90ZWN0ZWQgdm9pZCBoZWFydF9iZWF0KCkgeworICBpZiAoc3BlbGxfZmF0aWd1ZV9jb21wYXRfbW9kZSkKKyAgICBzcGVsbF9mYXRpZ3VlX2NvbXBhdF9tb2RlID0gdGltZSgpOworfQorCitzdGF0aWMgaW50IF9zZXRfZ3VpbGRfbGV2ZWwoaW50IG51bSkKK3sgc3RyaW5nIGdpbGRlOworICBtYXBwaW5nIGxldmVsczsKKworICBpZiAoICEoZ2lsZGU9UXVlcnlQcm9wKFBfR1VJTEQpKSApCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKCAhbWFwcGluZ3AobGV2ZWxzPVF1ZXJ5KFBfR1VJTERfTEVWRUwpKSApCisgICAgbGV2ZWxzPShbXSk7CisKKyAgbGV2ZWxzW2dpbGRlXT1udW07CisgIFNldChQX0dVSUxEX0xFVkVMLGxldmVscyk7CisgIEdNQ1BfQ2hhciggKFtQX0dVSUxEX0xFVkVMOiBudW1dKSApOworCisgIHJldHVybiBudW07Cit9CisKK3N0YXRpYyBpbnQgX3F1ZXJ5X2d1aWxkX2xldmVsKCkKK3sgc3RyaW5nICBnaWxkZTsKKyAgbWFwcGluZyBsZXZlbHM7CisKKyAgaWYgKCAhKGdpbGRlPVF1ZXJ5UHJvcChQX0dVSUxEKSkgKQorICAgIHJldHVybiAwOworCisgIGlmICggIW1hcHBpbmdwKGxldmVscz1RdWVyeShQX0dVSUxEX0xFVkVMKSkgKQorICAgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIGxldmVsc1tnaWxkZV07Cit9CisKK3N0YXRpYyBzdHJpbmcgX3NldF9ndWlsZF90aXRsZShzdHJpbmcgdCkKK3sgc3RyaW5nIGdpbGRlOworICBtYXBwaW5nIHRpdGxlczsKKworICBpZiAoICEoZ2lsZGU9UXVlcnlQcm9wKFBfR1VJTEQpKSApCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKCAhbWFwcGluZ3AodGl0bGVzPVF1ZXJ5KFBfR1VJTERfVElUTEUpKSApCisgICAgdGl0bGVzPShbXSk7CisKKyAgdGl0bGVzW2dpbGRlXT10OworICBTZXQoUF9HVUlMRF9USVRMRSx0aXRsZXMpOworICBHTUNQX0NoYXIoIChbUF9HVUlMRF9USVRMRTogdF0pICk7CisgIHJldHVybiB0OworfQorCitzdGF0aWMgc3RyaW5nIF9xdWVyeV9ndWlsZF90aXRsZSgpCit7IHN0cmluZyBnaWxkZSx0OworICBvYmplY3QgZzsKKyAgbWFwcGluZyB0aXRsZXM7CisKKyAgaWYgKCAhKGdpbGRlPVF1ZXJ5UHJvcChQX0dVSUxEKSkgKQorICAgIHJldHVybiAwOworCisgIGlmICggIW1hcHBpbmdwKHRpdGxlcz1RdWVyeShQX0dVSUxEX1RJVExFKSkgKQorICAgIHRpdGxlcz0oW10pOworCisgIHQ9dGl0bGVzW2dpbGRlXTsKKyAgaWYgKCAhdCAmJiBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHRoaXNfb2JqZWN0KCkpCisgICAgICAmJiBvYmplY3RwKGc9ZmluZF9vYmplY3QoIi9naWxkZW4vIitnaWxkZSkpICkKKyAgeworICAgIGctPmFkanVzdF90aXRsZSh0aGlzX29iamVjdCgpKTsKKyAgICBTZXRQcm9wKFBfVElUTEUsMCk7CisKKyAgICBpZiAoICFtYXBwaW5ncCh0aXRsZXM9UXVlcnkoUF9HVUlMRF9USVRMRSkpICkKKyAgICAgIHJldHVybiAwOworCisgICAgdD10aXRsZXNbZ2lsZGVdOworICB9CisKKyAgcmV0dXJuIHQ7Cit9CisKKworc3RhdGljIHN0cmluZyBfc2V0X2d1aWxkKHN0cmluZyBnaWxkZW5uYW1lKQoreyBvYmplY3QgcHJlOworCisgIGlmICghb2JqZWN0cChwcmU9cHJldmlvdXNfb2JqZWN0KCkpKQorICAgIHJldHVybiAwOworCisgIGlmICggcHJlIT10aGlzX29iamVjdCgpIC8vIERhcyBMZWJld2VzZW4gc2VsYmVyIGRhcmYgZGllIEdpbGRlIHNldHplbiwKKyAgICAgICYmIG9iamVjdF9uYW1lKHByZSkhPUdVSUxETUFTVEVSICAvLyBkZXIgR2lsZGVubWFzdGVyIGF1Y2gKKyAgICAgICYmICghdGhpc19wbGF5ZXIoKQorICAgICAgICAgIHx8IHRoaXNfcGxheWVyKCkgIT0gdGhpc19pbnRlcmFjdGl2ZSgpCisgICAgICAgICAgfHwgIUlTX0FSQ0godGhpc19wbGF5ZXIoKSkKKyAgICAgICAgICkKKyAgICAgICkKKyAgICByZXR1cm4gMDsKKworICBTZXQoUF9HVUlMRCxnaWxkZW5uYW1lKTsKKyAgR01DUF9DaGFyKCAoW1BfR1VJTEQ6IGdpbGRlbm5hbWVdKSApOworICByZXR1cm4gZ2lsZGVubmFtZTsKK30KKworc3RhdGljIHN0cmluZyBfcXVlcnlfZ3VpbGQoKQoreyBzdHJpbmcgcmVzOworCisgIGlmICggIShyZXM9UXVlcnkoUF9HVUlMRCkpICYmIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUodGhpc19vYmplY3QoKSkgKQorICB7CisgICAgLy8gU3BpZWxlciwgZGllIGtlaW5lciBHaWxkZSBhbmdlaG9lcmVuLCBnZWhvZXJlbiB6dXIgQWJlbnRldXJlcmdpbGRlCisgICAgaWYgKCAhKHJlcz1RdWVyeVByb3AoUF9ERUZBVUxUX0dVSUxEKSkgKQorICAgICAgcmV0dXJuIERFRkFVTFRfR1VJTEQ7CisgICAgZWxzZQorICAgICAgU2V0KFBfR1VJTEQscmVzKTsKKyAgICByZXR1cm4gcmVzOworICB9CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIHN0cmluZyBfcXVlcnlfdGl0bGUoKQoreyBzdHJpbmcgdGk7CisKKyAgaWYgKCBzdHJpbmdwKHRpPVF1ZXJ5KFBfVElUTEUpKSApCisgICAgcmV0dXJuIHRpOworCisgIHJldHVybiBRdWVyeVByb3AoUF9HVUlMRF9USVRMRSk7Cit9CisKK3N0YXRpYyBzdHJpbmcgX3NldF90aXRsZShzdHJpbmcgdCkKK3sKKyAgU2V0KFBfVElUTEUsIHQsIEZfVkFMVUUpOworICBHTUNQX0NoYXIoIChbUF9USVRMRTogdF0pICk7CisgIHJldHVybiB0OworfQorCmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL3NvdWwuYyBiL3N0ZC9wbGF5ZXIvc291bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzOGYyYzYKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL3NvdWwuYwpAQCAtMCwwICsxLDMyMTggQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBwbGF5ZXIvc291bC5jIC0tIERpZSBTZWVsZSBkZXMgU3BpZWxlcnMKKy8vCisvLyAkSWQ6IHNvdWwuYyA5NTI3IDIwMTYtMDMtMTIgMTE6Mzc6NTRaIEFyYXRob3JuICQKKworLy8gTGV0enRlIEFlbmRlcnVuZyB2b20gMDguMDkuOTUgIFdhcmdvbgorCisvLyBTZXQgVGFiU3RvcCB0byAyIGNoYXJhY3RlcnMKKworLyogVmVyc2lvbiAxLjQxIE1HLCBTZXB0ZW1iZXIgOTUKKyAgIC0gQmVpICJmcmFnZSIgdW5kICJhbnR3b3J0ZSIgVGVzdCBhdWYgUF9QRVJNX1NUUklORyBmdWVyIFNwcmFjaGZsdWVjaGUuCisgICAtIGJ1Z2ZpeCBiZWkgInNjaHdlaWdlIiAobmFobSBrZWluZSBBZHZlcmJpZW4gYW4pCisgICAqLworCisvKiBWZXJzaW9uIDEuNCBNRywgQXVndXN0IDk1CisgICAtIEhpbGZlZnVua3Rpb24gZWluZ2ViYXV0LCBzaWVoZSBhdWNoIHNvdWxoZWxwLmMKKyAgIC0gZWluaWdlIGtsZWluZXJlIEFlbmRlcnVuZ2VuIGVyc3QgamV0enQgZHVyY2ggZWluZSBuZXVlIFZlcnNpb24gZ2V3dWVyZGlndAorICAgLSBuZXVlIFZlcmJlbiwgd2llIGVpZ2VudGxpY2ggZmFzdCBpbW1lciA6PgorICAgLSB0eXBvcyB1bmQgYnVncyBnZWZpeGVkICh1bmQgbmV1ZSBlaW5nZWJhdXQuLi4pCisgICAtIEZ1bmt0aW9uIHp1ciBBYmZyYWdlIHZvbiBBZHZlcmJpZW4gdm9uIGF1c3NlbiBlaW5nZWJhdXQgKEhhbGxvLCBBbnRoZWEgOj4pCisgICAtIHNvIHNjaGxpbW0ga2FubiBkYXMgZG9jaCBuaWNodCBzZWluLCBlaW5lbiBUYWJTdG9wIHZvbiAyIHp1IG5laG1lbiwgZnVlcgorICAgICBkaWVzZXMgZWluZSBmaWxlLCBhbGxlcyBhbmRlcmUgemVybGVndCBtZWluZSBGb3JtYXRpZXJ1bmcgaW1tZXIgc28gOjwKKyAgIC0ga29lbm50ZXQgaWhyIGJpdHRlIG1hbCBvYmVuIGRhcyAiTGV0enRlIEFlbmRlcnVuZyIgYWVuZGVybiwgd2VubiBpaHIKKyAgICAgaXJnZW5kd28gd2FzIGFlbmRlcnQ/CisgICAqLworCisvKiBWZXJzaW9uIDEuMzUgTUcsIERlemVtYmVyIDk0CisgICAtIFZlcmJlbgorICAgLSBBZW5kZXJ1bmcgZGVzIFBhcnNpbmdzIGRlciBxdW90ZWQgYWR2ZXJicworICAgLSBya251ZGRlbCBpZ25vcmllcmVuIHdpcmQgdm9tIG5vcm1hbGVuIGlnbm9yZSB1ZWJlcm5vbW1lbgorICAgKi8KKworLyogVmVyc2lvbiAxLjMyIE1HLCBKdWxpIDk0CisgICAtIGVpbmlnZSBWZXJiZW4KKyAgIC0gaWdub3JpZXJlbiBkZXMgcmtudWRkZWwKKyAgICovCisKKy8qIFZlcnNpb24gMS4zMSBNRywgTWFpIDk0CisgICAtIGVpbmlnZSBWZXJiZW4KKyAgICovCisKKy8qIFZlcnNpb24gMS4zIE1HLCBNYWkgOTQKKyAgIC0gcXVvdGVkIGFkdmVyYnMgR0VIRU4gamV0enQKKyAgIC0gUGFyc2VSZXN0IC8gUGFyc2VSZW1vdGUgbmV1IGdlc2NocmllYmVuCisgICAqLworCisvKiBWZXJzaW9uIDEuMjEgTUcsIEFwcmlsIDk0CisgICAtIHF1b3RlZCBhZHZlcmJzCisgICAqLworCisvKiBEYW5rZSBhbiBBbmd1cyBmdWVyIGRlbiBUZXh0IHZvbiAibGllYmUiICovCisKKy8qIFZlcnNpb24gMS4yIE1HLCBKYW51YXIgOTQKKyAgIC0gVW1zdGVsbHVuZyBkZXIgRmVlbGluZ3Mgdm9uIHZpZWxlbiBrbGVpbmVuIEZ1bmt0aW9uZW4gYXVmIGVpbmUgZ3Jvc3NlLAorICAgICBkYW1pdCBkZXIgRnVua3Rpb25zb3ZlcmhlYWQgd2VnZmFlbGx0LgorICAgLSBuZXVlIEF1c2dhYmUgZGVyIEFkdmVyYmllbiwgbWl0IG1vcmUgdW5kIG51ciBub2NoIGVpbmVzIHBybyBaZWlsZQorICAgLSBtYWwgd2llZGVyIG5ldWUgVmVyYmVuLgorICAgLSB1bmQgZGFzIG5ldWUgU3RhbmRhcmRhZHZlcmIgImpvZmkiIDopCisgICAqLworCisvKiBWZXJzaW9uIDEuMSBNRywgTm92ZW1iZXIgOTMKKyAgIEFlbmRlcnVuZ2VuOgorICAgLSBJY2ggaGFiZSAiYWxsZShuKSIgZWluZ2ViYXV0LiBEaWUgVmVyd2FsdHVuZyBzdGVodCwgbWFuIGthbm4gamV0enQKKyAgICAgVmVyYmVuIGRpZSBNb2VnbGljaGtlaXQgImFsbGUiIGdlYmVuIChCc3AuICJ3aW5rIGFsbGUiKS4KKyAgIC0gaW56d2lzY2hlbiB3aWVkZXIgZWluaWdlIFZlcmJlbiBtZWhyLCBhYmVyIG11c3MgaWNoIGRhcyBub2NoCisgICAgIGVyd2FlaG5lbj8KKyAgIC0gKEhBU1MpIFJ1bWF0YSBoYXQgbWVpbiBzY2hvZW5lcyBTeXN0ZW0gZnVlciBkaWUgQXVzZ2FiZXN0cmluZ3MKKyAgICAgdmVya29tcGxpemllcnQuIFN0YXR0ICZhIHN0ZWh0IGRhIGpldHp0IHouQi4gQEBhZHZlcmJAQCwgd2FzIGluCisgICAgIGVpbmVyIHdlaXRlcmVuIHVubm9ldGlnZW4gRnVua3Rpb24gcmVzdWx0aWVydGUuIE5hamEuCisgICBIaWdobGFuZGVyIHJ5biBUYWhhcgorICAgKi8KKworLyoKKyAgIEhhISBJY2ggbmVobWUgamV0enQgZGllIGVyc3RlIGdhbnplIFZlcnNpb25zbnVtbWVyIGZ1ZXIgbWljaCBpbiBBbnNwcnVjaCA6KQorICAgU28sIGhldXRlIGlzdCdzIGdlc2NoYWZmdCAoSWNoIGF1Y2guLi4pLiBJY2ggYmluIGZlcnRpZyAtIGljaCBtYWNoIG51cgorICAgbm9jaCBuZXVlIFZlcmJlbiByZWluLCB3ZW5uIElkZWVuIGtvbW1lbi4KKyAgIEdlZ2ViZW4gYW4gRGllbnN0YWcsIGRlbSAyMi4gSnVuaSAxOTkzIGltIGhlaW1hdGxpY2hlbiBIb3JzdC4KKyAgIEhpZ2hsYW5kZXIgcnluIFRhaGFyLgorICAgUC5TLjogS29waWVyZSBzaWNoIGRhcyBEaW5nLCB3ZXIgd2lsbCAtIHVudGVyIGZvbGdlbmRlbiBCZWRpbmd1bmdlbjoKKyAgIC0gRGVuIEdvZXR0ZXJuIHZvbiBNb3JnZW5HcmF1ZW4gdW5kCisgICAtIEhpZ2hsYW5kZXJAVEFQUE11ZCAgICAgQmVzY2hlaWQgc2FnZW4gdW5kIGF1c3NlcmRlbQorICAgKnNldWZ6KiBuZWhtdCBIaWdobGFuZGVyIGhpZXIgaW4gTW9yZ2VuR3JhdWVuISEgLUhyVAorICAgSGEhIElociBrb2VubnQgd2llZGVyIFRBUFBNdWQgbmVobWVuIDo+ICBBYmVyIHNhZ3QncyBydWhpZyBpbiBNRy4gLUhyVAorICAgLSBlbnR3ZWRlciBkZW4gZ2FuemVuIFNjaHdhbGwgaGllciBkcmlubGFzc2VuIG9kZXIgbWljaCBtaXQgZWluZW0KKyAgIG5ldWVuIFRleHQgZXJ3YWVobmVuLgorICAgRGFzIEdhbnplIHVudGVyIGRlciBWb3JhdXNzZXR6dW5nLCBkYXNzIHVlYmVyaGF1cHQgbWFsIGplbWFuZCBlaW5lIGRldXRzY2hlCisgICBTZWVsZSBicmF1Y2h0IHVuZCBzaWUgbmljaHQgc2VsYmVyIHNjaHJlaWJlbiB3aWxsIDotKSAoZXJzcGFydHMgZXVjaCBsaWViZXIpCisgICBIaWdobGFuZGVyIHJ5biBUYWhhci4KKworICAgKipBcmJlaXQ6CisgICBFaW5iYXUgdm9uIEFkdmVyYmllbiwgYW5kZXJlIFJlYWt0aW9uZW4gYmVpIEdlaXN0ZXJuIGFscyAiV2llIGJpdHRlPyIsCisgICBlaW5pZ2UgbmV1ZSBWZXJiZW4sIGVpbmlnZSBhbHRlIFZlcmJlbiByYXVzZ2VzY2htaXNzZW4uCisgICBXZWlsIGVzIFByb2JsZW1lIG1pdCBkZW0gYXV0b2xvYWRpbmcgZGVyIHBsYXllcmFkdmVyYnMgZ2FiLCB3dXJkZQorICAgYXVzc2VyZGVtIGRpZSBzb3VsIHZvbSBPYmpla3QgenVtIGluaGVyaXRmaWxlIGZ1ZXIgZGllIHBsYXllcnNoZWxsLgorCisgICAqKklkZWVuICB6dW0gV2VpdGVybWFjaGVuOgorICAgLSAodmVyYikgYWxsZSwgei5CLiB0cml0dCBhbGxlICAgLS0gTW9lZ2xpY2hrZWl0IGVpbmdlYmF1dAorICAgLSBHZWlzdGVydmVyYmVuIG1pdCBBZHZlcmIKKworICAgVmVyc2lvbiAxLjAgZnVlciBNb3JnZW5HcmF1ZW4gICAgSGlnaGxhbmRlciBNYWkvSnVuaSA5MworICAgKi8KKworCisvKiBIaWVyIGlzdCBzaWUgbnVuLCBkaWUgREVVVFNDSEUgdmVyc2lvbiBkZXIgc291bCwKKyAgIHZpZWwgU3Bhc3MgZGFtaXQuCisgICBQb2lldGl4ICBNYWkgMTk5MgorICAgVmVycy46IDAuNCBmdWVyIEpSTXVkCisgICBQLlMuIGJpdHRlIG1lY2tlcnQgbmljaHQgZHJhbiBydW0gLCBzb25kZXJuIHZlcmJlc3NlcnQgdW5kCisgICBlcndlaXRlcnQgc2llLgorCisgICBPbHBwIE5vdmVtYmVyIDE5OTIKKyAgIFZlcnMuOiAwLjUgZnVlciBNb3JnZW5HcmF1ZW4KKworICAgSGUsIE9scHAsIHNjaHJlaWJ0IG1hbiBuaWNodCBkaWUgbmV1ZXN0ZSBBZW5kZXJ1bmcgVUVCRVIgZGllIGFsdGVuPworICAgKmdyaW5zKiwgSGlnaGxhbmRlcgorICAgKi8KKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKy8vI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCisjZGVmaW5lIFNPVUxIRUxQICIvc3RkL3BsYXllci9zb3VsaGVscCIKKyNkZWZpbmUgTEYgIlxuIgorI2RlZmluZSBOT1RfU0VMRiAxCisjZGVmaW5lIE5PVF9ERUFEIDEKKworI2RlZmluZSBRUFAgUXVlcnlQb3NzUHJvbm91bgorI2RlZmluZSBSRVRVUk4gcmV0dXJuIF9ub3RpZnlfZmFpbAorI2RlZmluZSBSZXR1cm4gcmV0dXJuIDB8fF9ub3RpZnlfZmFpbCAgLy8gbmV0dGVyIFRyaWNrLCBtdXNzIGljaCBtaXIgbWVya2VuIC1IclQKKyNkZWZpbmUgR0hPU1RDSEVDSyhzZWwsb3RoLHZpYykgaWYgKGdob3N0KCkpIHsgIHdyaXRlKHNlbCk7IHNheShvdGgsd2hvfHxNRSk7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWMpIHdoby0+TWVzc2FnZSh2aWMpOyByZXR1cm4gMTsgIH0KKyNkZWZpbmUgSEVMUENIRUNLKHgpIGlmIChzdHIgJiYgKHN0cj09Ii1oIiB8fCBzdHI9PSItPyIgfHwgc3RyPT0iL2giIFwKKyAgICAgICAgIHx8IHN0cj09Ii8/IiB8fCBzdHI9PSJoaWxmZSIpKVwKKyAgICAgICAgICAgICAgICAgICAgICAgeyBNb3JlKFNPVUxIRUxQLT5IZWxwKHgpKTsgcmV0dXJuIDE7IH0KKworLy8gInNjaGF1IGFuIiBhbHMgbmljaHQtVW50ZXJzdWNodW5nLiBLbGFwcHQgYWJlciBhbnNjaGVpbmVuZCBuaWNodCwgd2VpbAorLy8gaWNoIG5pY2h0IGdlZ2VuIGRlbiBHRCBhbmtvbW1lLiBBbHNvIGJlc3NlciBhdXNrb21tZW50aWVydCBsYXNzZW4uCisjaWZkZWYgU0NIQVVfQU4KKyN1bmRlZiBTQ0hBVV9BTgorI2VuZGlmCisKKy8vIEFucGllcHNlbiBtaXQgVGV4dC4gSW0gTW9tZW50IGVybGF1YnQsIGJlaSBNaXNzZmFsbGVuIGF1c2tvbW1lbnRpZXJlbiB1bmQKKy8vIGluIGRlciBIaWxmZSBhdXNrb21tZW50aWVyZW4uCisjaWZkZWYgV0VDS0UKKyN1bmRlZiBXRUNLRQorI2VuZGlmCisKKyNkZWZpbmUgV0VDS0UKKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDx0aGluZy9kZXNjcmlwdGlvbi5oPgorI2luY2x1ZGUgPHRoaW5nL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxwbGF5ZXIuaD4KKyNpbmNsdWRlIDxwbGF5ZXIvY29tbS5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjdW5kZWYgTkVFRF9QUk9UT1RZUEVTCisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisKKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8bW92aW5nLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8Y2xhc3MuaD4KKworc3RhdGljIG9iamVjdCB3aG8sIG9mb287CitzdGF0aWMgaW50IGZvcl9hbGwsIGZsYWcsIGlmb287CittYXBwaW5nIHBscl9hZHZlcmJzOworc3RhdGljIHN0cmluZyBvdXRfc2VsLCBvdXRfdmljLCBvdXRfb3RoLCBhZHZlcmIsIHNmb287CisKK3ByaXZhdGUgdm9pZCBQYXJzZUFkdmVyYihzdHJpbmcgKndvcmRzKTsKK3ByaXZhdGUgc3RyaW5nIGNvbnZlcnRfc3RyaW5nKHN0cmluZyBzdHIpOwordmFyYXJncyBtaXhlZCBNb3JlKHN0cmluZyBzdHIsIGludCBmZmxhZywgc3RyaW5nIHJldHVybnRvKTsKK3N0cmluZyBNYXRjaEFkdmVyYihzdHJpbmcgc3RyKTsKKworbWFwcGluZworUXVlcnlTdGRBZHZlcmJzKCkgIHsKKyAgcmV0dXJuIChbCisgICAgInVudmUiIDogInVudmVyc2NoYWVtdCIsCisgICAgImd1dGciIDogImd1dGdlbGF1bnQiLAorICAgICJndXRtIiA6ICJndXRtdWV0aWciLAorICAgICJmcm9oIiA6ICJmcm9oIiwKKyAgICAiZ2x1ZSIgOiAiZ2x1ZWNrbGljaCIsCisgICAgInd1ZXQiIDogInd1ZXRlbmQiLAorICAgICJmcmVjIiA6ICJmcmVjaCIsCisgICAgImRhZW0iIDogImRhZW1vbmlzY2giLAorICAgICJib2VzIiA6ICJib2VzZSIsCisgICAgInVuZ2wiIDogInVuZ2x1ZWNrbGljaCIsCisgICAgImxhbmciIDogImxhbmdzYW0iLAorICAgICJzY2huIiA6ICJzY2huZWxsIiwKKyAgICAiamFtbSIgOiAiamFtbWVybmQiLAorICAgICJmcmV1IiA6ICJmcmV1bmRsaWNoIiwKKyAgICAic2h1ZSIgOiAic2NodWVjaHRlcm4iLAorICAgICJhbXVlIiA6ICJhbXVlc2llcnQiLAorICAgICJhZXJnIiA6ICJhZXJnZXJsaWNoIiwKKyAgICAiYW5lciIgOiAiYW5lcmtlbm5lbmQiLAorICAgICJlcnN0IiA6ICJlcnN0YXVudCIsCisgICAgImJpdHQiIDogImJpdHRlciIsCisgICAgImJyZWkiIDogImJyZWl0IiwKKyAgICAidm9ycyIgOiAidm9yc2ljaHRpZyIsCisgICAgImNoYXIiIDogImNoYXJtYW50IiwKKyAgICAia2FsdCIgOiAia2FsdCIsCisgICAgInZlcmYiIDogInZlcmZ1ZWhyZXJpc2NoIiwKKyAgICAienVmciIgOiAienVmcmllZGVuIiwKKyAgICAidGllZiIgOiAidGllZiIsCisgICAgInZlcnoiIDogInZlcnp3ZWlmZWx0IiwKKyAgICAiZHJlYyIgOiAiZHJlY2tpZyIsCisgICAgInZlcnQiIDogInZlcnRyYWV1bXQiLAorICAgICJ1ZWJlIiA6ICJ1ZWJlcnpldWd0IiwKKyAgICAiZnJ1cyIgOiAiZnJ1c3RyaWVydCIsCisgICAgInN0cmEiIDogInN0cmFobGVuZCIsCisgICAgImhvZmYiIDogImhvZmZudW5nc3ZvbGwiLAorICAgICJ1bmdlIiA6ICJ1bmdlZHVsZGlnIiwKKyAgICAidW5zaSIgOiAidW5zaW5uaWdlcndlaXNlIiwKKyAgICAidW5zYyIgOiAidW5zY2h1bGRpZyIsCisgICAgInVud2kiIDogInVud2lzc2VuZCIsCisgICAgImlyb24iIDogImlyb25pc2NoIiwKKyAgICAid2lzcyIgOiAid2lzc2VuZCIsCisgICAgImdlbWEiIDogImdlbWFlY2hsaWNoIiwKKyAgICAic2VobiIgOiAic2VobnN1ZWNodGlnIiwKKyAgICAibGF1dCIgOiAibGF1dCIsCisgICAgImxpZWIiIDogImxpZWJldm9sbCIsCisgICAgImZyb2UiIDogImZyb2VobGljaCIsCisgICAgImRhbmsiIDogImRhbmtiYXIiLAorICAgICJuYXR1IiA6ICJuYXR1ZXJsaWNoIiwKKyAgICAiZ2VkdSIgOiAiZ2VkdWxkaWciLAorICAgICJwZXJmIiA6ICJwZXJmZWt0IiwKKyAgICAidmVycyIgOiAidmVyc3BpZWx0IiwKKyAgICAiaG9lZiIgOiAiaG9lZmxpY2giLAorICAgICJzdG9sIiA6ICJzdG9seiIsCisgICAgImZyYWciIDogImZyYWdlbmQiLAorICAgICJydXBwIiA6ICJydXBwaWciLAorICAgICJ0cmF1IiA6ICJ0cmF1cmlnIiwKKyAgICAidmVyYSIgOiAidmVyYWVjaHRsaWNoIiwKKyAgICAic2NoYSIgOiAic2NoYW1sb3MiLAorICAgICJlcm5zIiA6ICJlcm5zdCIsCisgICAgInNjaHUiIDogInNjaHVlY2h0ZXJuIiwKKyAgICAiemFlciIgOiAiemFlcnRsaWNoIiwKKyAgICAic2FuZiIgOiAic2FuZnQiLAorICAgICJlbnRnIiA6ICJlbnRnZWlzdGVydCIsCisgICAgImhlaW0iIDogImhlaW10dWVja2lzY2giLAorICAgICJnZWxhIiA6ICJnZWxhbmd3ZWlsdCIsCisgICAgIndpbGQiIDogIndpbGQiLAorICAgICJqb2ZpIiA6ICJ3aWUgSm9mLCB3ZW5uIGVyIG1hbCBuaWNodCBpZGxldCIsCisgIF0pOworfQorCittYXBwaW5nCitRdWVyeUFkdmVyYnMoKSB7CisgIGlmIChleHRlcm5fY2FsbCgpKQorICAgIHJldHVybiBkZWVwX2NvcHkocGxyX2FkdmVyYnMpOworICByZXR1cm4gcGxyX2FkdmVyYnM7Cit9CisKK3N0cmluZworTWF0Y2hBZHZlcmIoc3RyaW5nIGEpICB7CisgIFBhcnNlQWR2ZXJiKGV4cGxvZGUoYSwiICIpKTsKKyAgcmV0dXJuIGFkdmVyYjsKK30KKworLy8gVmVyd2FsdHVuZ3Nyb3V0aW5lbgorCitzdGF0aWMgdm9pZAorYWRkX3NvdWxfY29tbWFuZHMoKSAgeworICBpZiAoIXBscl9hZHZlcmJzKQorICAgIHBscl9hZHZlcmJzPShbXSk7CisgIGFkZF9hY3Rpb24oIlNvdWxDb21tIiwgIiIsIDEpOworfQorCitzdGF0aWMgaW50Cit2ZXJiZW5fbGlzdGUoKSAgeworICBNb3JlKFNPVUxIRUxQLT5IZWxwKCkpOworICByZXR1cm4gMTsKK30KKworI2RlZmluZSBnaG9zdCgpIFF1ZXJ5UHJvcChQX0dIT1NUKQorI2RlZmluZSBmcm9nKCkgUXVlcnlQcm9wKFBfRlJPRykKKyNkZWZpbmUgY2FwbmFtZSgpIGNhcGl0YWxpemUobmFtZSgpKQorI2RlZmluZSBnbmFtZSgpIChnaG9zdCgpPyhmcm9nKCk/IkRlciBHZWlzdCBlaW5lcyBGcm9zY2hlcyJcCisJCQkgICAgICAgIDoiRGVyIEdlaXN0IHZvbiAiK2NhcG5hbWUoKSlcCisJCSAgICAgICAgOmNhcG5hbWUoKSkKKwordmFyYXJncyBwcml2YXRlIHZvaWQKK1BhcnNlUmVzdChzdHJpbmcgYXJnLCBtaXhlZCBleHRyYSkgIHsKKyAgc3RyaW5nIHdlcix3aWUsKndvcmRzLHF1b3RlYTsKKyAgaW50IG51bSxiaXM7CisgIHdobyA9IGZvcl9hbGwgPSBhZHZlcmIgPSAwOworICBpZiAoIWFyZykgcmV0dXJuOworICBpZiAoZXh0cmEpCisgICAgaWYgKCFwb2ludGVycChleHRyYSkpIHsKKyAgICAgIGlmIChzc2NhbmYoYXJnLCBleHRyYSsiICVzIiwgd2llKT09MSkKKyAgICAgIGFyZz13aWU7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGZvciAoYmlzPXNpemVvZihleHRyYSksbnVtPTA7IG51bTxiaXM7IG51bSsrKQorICAgICAgICBpZiAoc3NjYW5mKGFyZywgZXh0cmFbbnVtXSsiICVzIiwgd2llKT09MSkKKyAgICAgICAgICBhcmc9d2llOworCisgIGlmICgoYmlzPXN0cnN0cihhcmcsICIvIikpPj0wKQorICAgIHF1b3RlYT1hcmdbYmlzLi5dLGFyZz1hcmdbMC4uYmlzLTFdOworICBxdW90ZWE9cXVvdGVhfHwiIixhcmc9YXJnfHwiIjsKKworICB3b3Jkcz1leHBsb2RlKGltcGxvZGUoZXhwbG9kZShhcmcsICIsIiksICIgdW5kIiksICIgIik7CisgIGlmICghc2l6ZW9mKHdvcmRzKSkgcmV0dXJuOworICBpZiAoc2l6ZW9mKHdvcmRzKSAmJiAod29yZHNbMF09PSJhbGxlIiB8fCB3b3Jkc1swXT09ImFsbGVuIikpCisgICAgZm9yX2FsbD0xLHdlcj13b3Jkc1swXSx3b3Jkcz13b3Jkc1sxLi5dOworICBpZiAoIWZvcl9hbGwpICB7ICAgICAvKiBub2NoIGtlaW4gT3BmZXIgKi8KKyAgICB3ZXI9bWF0Y2hfbGl2aW5nKGxvd2VyX2Nhc2Uod29yZHNbMF0pKTsKKyAgICBpZiAoc3RyaW5ncCh3ZXIpKSB3aG89cHJlc2VudCh3ZXIsIGVudmlyb25tZW50KE1FKSk7CisgICAgaWYgKCF3aG8pIHdobz1wcmVzZW50KHdvcmRzWzBdLCBlbnZpcm9ubWVudChNRSkpOworICAgIGlmICh3aG8gJiYgd2hvLT5RdWVyeVByb3AoUF9JTlZJUykpIHdobz0wOworICAgIH0KKyAgaWYgKHdobyAmJiBzaXplb2Yod29yZHMpKQorICAgIHdvcmRzPXdvcmRzWzEuLl07ICAvKiBPcGZlciBnZWZ1bmRlbiAtIHdlbm4ncyBlaW5lcyBnaWJ0ICovCisgIHdvcmRzKz1leHBsb2RlKHF1b3RlYSwgIiAiKTsKKyAgd29yZHMtPSh7IiJ9KTsKKyAgaWYgKHNpemVvZih3b3JkcykpIFBhcnNlQWR2ZXJiKHdvcmRzKTsKK30KKworcHJpdmF0ZSBpbnQKK1BhcnNlUmVtb3RlKHN0cmluZyBhcmcpICB7CisgIHN0cmluZyB3ZXIsKndvcmRzOyAKKworICBhZHZlcmIgPSAwOyAvLyBBZHZlcmIgdm9tIGxldHp0ZW4gTWFsIGtlaW5lc2ZhbGxzIHdpZWRlcnZlcndlbmRlbi4gOy0pCisKKyAgaWYgKCFzdHJpbmdwKGFyZykgfHwgIXNpemVvZihhcmcpKSByZXR1cm4gMDsKKyAgCisgIHdvcmRzPWV4cGxvZGUoYXJnLCIgIik7CisKKyAgbWl4ZWQgbGl2ID0gbWF0Y2hfbGl2aW5nKGxvd2VyX2Nhc2Uod29yZHNbMF0pKTsKKyAgaWYgKHN0cmluZ3AobGl2KSkKKyAgICAgIHdobz1maW5kX3BsYXllcihsaXYpOworICAKKyAgaWYgKHdobykgeworICAgIC8vIFppZWwgaXN0IGVpbiBTcGllbGVyLgorICAgIGlmICghd2hvLT5RdWVyeVByb3AoUF9JTlZJUykgfHwgSVNfV0laQVJEKE1FKSkKKyAgICB7CisgICAgICAvLyBTcGllbGVyIGlzdCBuaWNodCBJbnZpcyBvZGVyIGljaCBiaW4gTWFnaWVyLgorICAgICAgc3RyaW5nIG5hbSA9IChxdWVyeV9vbmNlX2ludGVyYWN0aXZlKE1FKSA/IGdldHVpZCgpIDogCisJICAgICAgICAgICAgIGxvd2VyX2Nhc2UobmFtZShSQVcpKSk7CisgICAgICBpZiAocXVlcnlfdmVyYigpWzAuLjVdPT0icmtudWRkIiAmJgorCSAgd2hvLT5UZXN0SWdub3JlKG5hbSsiLnJrbnVkZGVsIikgKQorICAgICAgeworICAgICAgICAvLyBpY2ggb2RlciBkYXMgS29tbWFuZG8gd2VyZGUgaWdub3JpZXJ0LgorICAgICAgICB3cml0ZSh3aG8tPk5hbWUoV0VSKSsiIGlnbm9yaWVydCBEZWluZW4gS251ZGRlbHZlcnN1Y2guXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgIC8vIFNwaWVsZXIgaXN0IGludmlzIHVuZCBpY2ggYmluIGtlaW4gTWFnaWVyLgorICAgICAgd2hvID0gMDsKKyAgfQorICAvLyBrZWluIGVpbmdlbG9nZ3RlciB1bmQgc2ljaHRiYXJlciBTcGllbGVyLiBWaWVsbGVpY2h0IGVpbiBOUEM/IChCVFc6IGtlaW4KKyAgLy8gZWxzZSBpZiwgd2VpbCBpbSBpZiBmdWVyIFNwaWVsZXIgb2JlbiB3aG8gZ2VudWxsdCB3ZXJkZW4ga2FubiB1bmQgZGFubgorICAvLyBub2NobWFsIG5hY2ggbmVtIE5QQyBnZXN1Y2h0IHdlcmRlbiBzb2xsLikKKyAgaWYgKCF3aG8pIHsKKyAgICB3ZXIgPSBtYXRjaF9saXZpbmcobG93ZXJfY2FzZSh3b3Jkc1swXSkpOworICAgIGlmKHN0cmluZ3Aod2VyKSkgCisgICAgICB3aG89cHJlc2VudCh3ZXIsZW52aXJvbm1lbnQoTUUpKTsKKyAgICBpZiAoIXdobykgd2hvPXByZXNlbnQod29yZHNbMF0sIGVudmlyb25tZW50KE1FKSk7CisgICAgaWYgKHdobyAmJiB3aG8tPlF1ZXJ5UHJvcChQX0lOVklTKSkgd2hvPTA7CisgIH0KKworICBpZiAoIXdobyB8fCBzaXplb2Yod29yZHMpPT0xKSByZXR1cm4gMDsKKyAgd29yZHM9d29yZHNbMS4uXTsKKyAgUGFyc2VBZHZlcmIod29yZHMpOworICByZXR1cm4oMCk7Cit9CisKKy8qKgorIEdpYnQgZGVuIHBhc3NlbmRlbiBBZHZlcmItVGV4dCB6dSBlaW5lbSBrZXkgenVydWVjaworIFxwYXJhbSBzIERhbmFjaCB3aXJkIGluIGRlciBBZHZlcmJpZW4tTGlzdGUgZ2VzdWNodAorIFxwYXJhbSBmdXp6eSAKKyBccmV0dXJuIERlciBnZWZ1bmRlbmUgQWR2ZXJiaWVudGV4dCBvZGVyIDAKKyAqLwordmFyYXJncyBzdHJpbmcgR2V0UGxheWVyQWR2ZXJiKCBzdHJpbmcgcywgaW50IGZ1enp5ICkgeworICBpbnQgaSwgajsgCisgIHN0cmluZyAqc2VhcmNoX3BhdHRlcm4sCisgICAgICAgICAqc2VhcmNoX3Jlc3VsdCwgCisgICAgICAgICAgcmVzdWx0OworCisgIC8vIEVyc3RtYWwgZ3Vja2VuLCBvYiBkZXIgU3RyaW5nIGRpcmVrdCBnZWZ1bmRlbiB3ZXJkZW4ga2FubgorICAvLyBkYXMgZ2VodCBhbSBzY2huZWxsc3RlbgorICByZXN1bHQgPSBRdWVyeVN0ZEFkdmVyYnMoKVtzXSB8fCBwbHJfYWR2ZXJic1tzXTsKKworICAvLyBXZW5uIG5vY2gga2VpbiBFcmdlYm5pcyBnZWZ1bmRlbiwgdW5kIG1hbiB1bnNjaGFyZiBzdWNoZW4gd2lsbAorICBpZiAoIGZ1enp5ICYmICFyZXN1bHQpIHsKKworICAgIC8vIFN1Y2htdXN0ZXIgZnVlciBkYXMgSW50ZXJzZWN0IGVyemV1Z2VuCisgICAgc2VhcmNoX3BhdHRlcm49KHtzfSk7CisKKyAgICBqID0gc2l6ZW9mKHMpLTE7CisgICAgZm9yICggaT0yOyAgaSA8IGogO2krKykgeworICAgICAgc2VhcmNoX3BhdHRlcm4gKz0gKHtzWzAuLjxpXX0pOworICAgIH0KKworICAgIC8vIEludGVyc2VjdCB6d2lzY2hlbiBhbGxlbiBiZWthbm50ZW4gQWJrdWVyenVuZ2VuIHVuZCBTZWFyY2gtUGF0dGVybgorICAgIC8vIGVyemV1Z2VuLiBEaWVzZXMgd2lyZCBkYW5uIGdsZWljaHplaXRpZyBuYWNoIExhZW5nZSBzb3J0aWVydAorICAgIC8vIGdlbmF1ZXN0ZXIgVHJlZmZlciA9IFN0cmluZyBtaXQgZ3JvZXNzdGVyIExhZW5nZQorICAgIHNlYXJjaF9yZXN1bHQgPSBzb3J0X2FycmF5KAorICAgICAgKG1faW5kaWNlcyhRdWVyeVN0ZEFkdmVyYnMoKSkgfCBtX2luZGljZXMocGxyX2FkdmVyYnMpKSZzZWFyY2hfcGF0dGVybiwgCisgICAgICAgICAjJz4pOworCisgICAgLy8gQWR2ZXJiIHp1bSBnZW5hdWVzdGVuIFRyZWZmZXIgenVydWVja2dlYmVuCisgICAgaWYgKHNpemVvZihzZWFyY2hfcmVzdWx0KSkgCisgICAgICByZXN1bHQgPSBRdWVyeVN0ZEFkdmVyYnMoKVtzZWFyY2hfcmVzdWx0WzBdXSB8fCAKKyAgICAgICAgICAgICAgIHBscl9hZHZlcmJzW3NlYXJjaF9yZXN1bHRbMF1dOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgIFBhcnN0IGRpZSBBZHZlcmJpZW5wYXJhbWV0ZXIgZnVlciBWZXJiZW4gdW5kIHNwZWljaGVydCBkaWUKKyAgcGFzc2VuZGUgVGV4dGF1c2dhYmUgaW4gZGVyIGdsb2JhbGVuIFZhcmlhYmxlICJhZHZlcmIiCisgIFxwYXJhbSB3b3JkcyBBcnJheSBtaXQgZGVuIHp1IHBhcnNlbmRlbiBBZHZlcmJpZW4tU3RyaW5ncworKi8KK3ByaXZhdGUgdm9pZAorUGFyc2VBZHZlcmIoc3RyaW5nICp3b3JkcykgIHsKKyAgaW50IG51bSxhbmRzaWduLGJpczsKKyAgc3RyaW5nIHFhZHYsKmFkdixjbnQ7CisKKyAgYWR2PSh7fSk7CisgIHFhZHY9MDsKKworICBiaXM9c2l6ZW9mKHdvcmRzKTsKKyAgLy8gU29uZGVyZmFsbCBHZXF1b3RldGVzIEFkdmVyYiAoYWxsZXMgbmFjaCBkZW0gUXVvdGUpIHNwZWljaGVybiB1bmQgYXVzIAorICAvLyBXb3JkcyByYXVzc2NobmVpZGVuLgorICBmb3IgKG51bT0wOyBudW08YmlzOyBudW0rKykKKyAgICBpZiAod29yZHNbbnVtXVswLi4wXT09Ii8iKSAgeworICAgICAgd29yZHNbbnVtXT13b3Jkc1tudW1dWzEuLl07CisgICAgICBxYWR2PWltcGxvZGUod29yZHNbbnVtLi5dLCAiICIpOworICAgICAgd29yZHM9d29yZHNbMC4ubnVtLTFdOworICAgICAgYnJlYWs7CisgICAgfQorCisgIC8vIEVzIGthbm4gc2VpbiwgZGFzcyB2b3IgZGVtIFF1b3RlIG5vY2ggZWluZSB1bmQgc3RlaHQuIERhcyB3aXJkIGpldHp0IGF1Y2ggCisgIC8vIG5vY2ggZW50ZmVybnQsIG11c3MgYWJlciBzcGFldGVyIHdpZWRlciBlaW5nZWZ1ZWd0IHdlcmRlbi4KKyAgaWYgKHNpemVvZih3b3JkcykgJiYgd29yZHNbPDFdPT0idW5kIikgIHsKKyAgICB3b3Jkcz13b3Jkc1swLi48Ml07CisgICAgYW5kc2lnbj0xOworICB9CisKKyAgLy8gV2VpdGVyc3VjaGVuPworICBpZiAoYmlzPXNpemVvZih3b3JkcykpCisgICAgZm9yIChudW09MDsgbnVtPGJpczsgbnVtKz0yKQorICAgICAgIGFkdis9KHtHZXRQbGF5ZXJBZHZlcmIod29yZHNbbnVtXSwgMSl9KTsKKyAgY250PUNvdW50VXAoYWR2LSh7MH0pKTsKKworICAvLyBBdXNnYWJlIHp1c2FtbWVuYmF1ZW4KKyAgaWYgKGFuZHNpZ24pCisgICAgYWR2ZXJiPUNvdW50VXAoKHNpemVvZihhZHYpID8gYWR2IDogKHt9KSkrKHFhZHYgPyAoe3FhZHZ9KSA6ICh7fSkpKTsKKyAgZWxzZSBpZiAoc2l6ZW9mKGNudCkgJiYgc2l6ZW9mKHFhZHYpKQorICAgIGFkdmVyYiA9IGNudCArICIgIiArIHFhZHY7CisgIGVsc2UgaWYgKHNpemVvZihxYWR2KSkKKyAgICBhZHZlcmIgPSBxYWR2OworICBlbHNlIGlmIChzaXplb2YoY250KSkKKyAgICBhZHZlcmIgPSBjbnQ7IAorICBpZiAoYWR2ZXJiPT0iIikgYWR2ZXJiPTA7Cit9CisKK3ByaXZhdGUgbWl4ZWQgTWl4ZWRPdXQoaW50IGNhc3VzKSAgeworICBvYmplY3QgKmVudnMsKnZpY3M7CisgIHN0cmluZyAqbmFtZXMsb3V0LGF1Zno7CisgIGludCBjb3VudCxtc2c7CisKKyAgZm9yX2FsbD0wOworICB2aWNzPSh7fSk7CisgIG5hbWVzPSh7fSk7CisgIGVudnM9YWxsX2ludmVudG9yeShlbnZpcm9ubWVudCgpKS0oe3RoaXNfcGxheWVyKCl9KTsKKyAgaWYgKCEoY291bnQ9c2l6ZW9mKGVudnMpKSkKKyAgICBSRVRVUk4oIk5pY2h0cyB1bmQgbmllbWFuZCBkYS4gU2NoYXUgRGljaCBuYWVjaHN0ZXMgTWFsIGJlc3NlciB1bS5cbiIpOworICBmb3IgKCA7IGNvdW50LS07ICkKKyAgICBpZiAobGl2aW5nKGVudnNbY291bnRdKSAmJiAhZW52c1tjb3VudF0tPlF1ZXJ5UHJvcChQX0lOVklTKSkgIHsKKyAgICAgIHZpY3MrPSh7ZW52c1tjb3VudF19KTsKKyAgICAgIG5hbWVzKz0oe2VudnNbY291bnRdLT5uYW1lKGNhc3VzKX0pOworICAgIH0KKyAgaWYgKCFzaXplb2YodmljcykpCisgICAgUkVUVVJOKCJLZWluZXIgZGEuIFNjaGF1IERpY2ggbmFlY2hzdGVzIE1hbCBiZXNzZXIgdW0uXG4iKTsKKyAgYXVmej1Db3VudFVwKG5hbWVzKTsKKyAgZm9yIChjb3VudD1zaXplb2Yodmljcyk7IGNvdW50LS07KQorICB7CisgICAgb3V0PWltcGxvZGUoZXhwbG9kZShvdXRfdmljLCAiQEBhbGxlQEAiKSxhdWZ6KTsKKyAgICAgICAgb3V0ID0gcmVncmVwbGFjZSggb3V0LCAiXFw8Iit2aWNzW2NvdW50XS0+bmFtZShjYXN1cykrIlxcPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUodmljc1tjb3VudF0tPlF1ZXJ5RHUoY2FzdXMpKSwgMCApOworCisgICAgbXNnPXZpY3NbY291bnRdLT5SZWNlaXZlTXNnKGNvbnZlcnRfc3RyaW5nKG91dCksTVRfQ09NTSxNQV9FTU9URSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCx0aGlzX29iamVjdCgpKTsKKyAgICBzd2l0Y2gobXNnKQorICAgIHsKKyAgICAgIGNhc2UgTVNHX0RFTElWRVJFRDoKKyAgICAgIGNhc2UgTVNHX0JVRkZFUkVEOgorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTVNHX0lHTk9SRUQ6CisgICAgICBjYXNlIE1TR19WRVJCX0lHTjoKKyAgICAgIGNhc2UgTVNHX01VRF9JR046CisgICAgICAgIHdyaXRlKHZpY3NbY291bnRdLT5OYW1lKCkrIiBpZ25vcmllcnQgRGljaCBvZGVyIGRpZXNlbiBCZWZlaGwuXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB3cml0ZSh2aWNzW2NvdW50XS0+TmFtZSgpKyIga29ubnRlIERpY2ggZ2VyYWRlIG5pY2h0IGxlc2VuLlxuIik7CisgICAgfQorICB9CisgIHdyaXRlKGJyZWFrX3N0cmluZyhjb252ZXJ0X3N0cmluZyhpbXBsb2RlKGV4cGxvZGUob3V0X3NlbCwiQEBhbGxlQEAiKSxhdWZ6KQorICAgICtMRiksIDc4KSk7CisgIHJldHVybiAxOworfQorCit2YXJhcmdzIHByaXZhdGUgaW50CitDaGVja0xpZmUoaW50IG5vX3NlbGYsaW50IG5vX2RlYWQsIHN0cmluZyBub19zZWxmX3RleHQsIHN0cmluZyBub19kZWFkX3RleHQpICB7CisgIGlmICh3aG8gJiYgbGl2aW5nKHdobykgJiYgd2hvIT10aGlzX3BsYXllcigpKSByZXR1cm4gMDsKKyAgaWYgKG5vX3NlbGYgJiYgd2hvICYmIHdobz09dGhpc19wbGF5ZXIoKSkgIHsKKyAgICBpZiAobm9fc2VsZl90ZXh0KQorICAgICAgd3JpdGUobm9fc2VsZl90ZXh0K0xGKTsKKyAgICBlbHNlCisgICAgICB3cml0ZSgiTWFjaCBkYXMgbWl0IGFuZGVyZW4sIG5pY2h0IG1pdCBEaXIgc2VsYmVyLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKHdobyAmJiAhbGl2aW5nKHdobykgJiYgbm9fZGVhZCkgIHsKKyAgICBpZiAobm9fZGVhZF90ZXh0KQorICAgICAgd3JpdGUobm9fZGVhZF90ZXh0K0xGKTsKKyAgICBlbHNlCisgICAgICB3cml0ZSgiRGFzIGRhcmZzdCBEdSBudXIgbWl0IExlYmV3ZXNlbi5cbiIpOworICAgIHJldHVybiAyOworICB9CisgIGlmICghd2hvKSAgeworICAgIHdyaXRlKCJTY2hhdSBEaWNoIGVyc3QgbWFsIHVtIC0gZGFzIGFuZ2VnZWJlbmUgT2JqZWt0IGlzdCBuaWNodCBkYS5cbiIpOworICAgIHJldHVybiAzOworICB9CisgIHJldHVybigwKTsgLy9ub24tdm9pZC4gRmFsbC10aHJvdWdoLCBhbGxlcyBPSy4KK30KKworcHJpdmF0ZSBzdHJpbmcKK2NvbnZlcnRfc3RyaW5nKHN0cmluZyBzdHIpICB7CisgIC8qIEljaCBiaW4gdW5zY2h1bGRpZywgaWNoIGhhdHRlIGRhcyB2aWVsIGVpbmZhY2hlciB1bmQgc2Nob2VuZXIgOikKKyAgICAgUnVtYXRhIHdvbGx0ZSBkYXMgc28gOykgIC1IclQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RyID0gaW1wbG9kZSggZXhwbG9kZSggc3RyLCAiQEBuYW1lQEAiICksIGNhcG5hbWUoKSApOworICBzdHIgPSBpbXBsb2RlKCBleHBsb2RlKCBzdHIsICJAQGduYW1lQEAiICksIGduYW1lKCkgKTsKKyAgc3RyID0gaW1wbG9kZSggZXhwbG9kZSggc3RyLCAiQEB3ZXJAQCIgKSwKKyAgICAod2hvP2NhcGl0YWxpemUod2hvLT5uYW1lKFdFUiwyKXx8IiIpOiIiICkpOworICBzdHIgPSBpbXBsb2RlKCBleHBsb2RlKCBzdHIsICJAQCB3ZW5AQCIgKSwKKyAgICAod2hvPyIgIit3aG8tPm5hbWUoV0VOLDIpOiIiKSk7CisgIHN0ciA9IGltcGxvZGUoIGV4cGxvZGUoIHN0ciwgIkBAIHdlbUBAIiApLAorICAgICh3aG8/IiAiK3doby0+bmFtZShXRU0sMik6IiIpKTsKKyAgc3RyID0gaW1wbG9kZSggZXhwbG9kZSggc3RyLCAiQEB3ZW5AQCIgKSwKKyAgICAod2hvP3doby0+bmFtZShXRU4sMik6IiIpKTsKKyAgc3RyID0gaW1wbG9kZSggZXhwbG9kZSggc3RyLCAiQEB3ZW1AQCIgKSwKKyAgICAod2hvP3doby0+bmFtZShXRU0sMik6IiIpKTsKKyAgc3RyID0gaW1wbG9kZSggZXhwbG9kZSggc3RyLCAiQEB3ZXNzZW5AQCIgKSwKKyAgICAod2hvP3doby0+bmFtZShXRVNTRU4sMik6IiIpKTsKKyAgc3RyID0gaW1wbG9kZSggZXhwbG9kZSggc3RyLCAiQEBhZHZlcmJAQCIgKSwKKyAgICAoYWR2ZXJiPyIgIithZHZlcmI6IiIpICk7CisgIHJldHVybiBzdHI7Cit9CisKK3ByaXZhdGUgaW50CitGZWVsSXQoKSAgeworICBpbnQgbXNnLCBmbGc7CisKKyAgZmxnID0gTVNHRkxBR19TT1VMOworICBpZiAocXVlcnlfdmVyYigpICYmIChxdWVyeV92ZXJiKClbMC4uM109PSJmcmFnIiB8fCBxdWVyeV92ZXJiKClbMC4uM109PSJhbnR3IikpCisgICAgZmxnIHw9IE1TR0ZMQUdfU0FZOworICBpZiAocXVlcnlfdmVyYigpICYmIChxdWVyeV92ZXJiKClbMC4uNV09PSJya251ZGQiIHx8IHF1ZXJ5X3ZlcmIoKT09InJ3aW5rIikpCisgICAgZmxnIHw9IE1TR0ZMQUdfUkVNT1RFOworCisgIC8vIE5QQyBoYWJlbiBrZWluZSBUTS1IaXN0IChjb21tLmMpLiBMZWlkZXIgZXJiZW4gYWJlciBkaXYuIE1hZ2llciBkaWUgU291bAorICAvLyAodHJvdHpkZW0gc2llIGluIC9zdGQvcGxheWVyLyBsaWVndCkgaW4gaWhyZW4gTlBDLi4uICpmbHVjaCoKKyAgaWYgKHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoTUUpKQorICAgIF9yZWN2KHdobywgYnJlYWtfc3RyaW5nKGNvbnZlcnRfc3RyaW5nKG91dF9zZWwpLDc4KSwgZmxnKTsKKyAgZWxzZQorICAgIHRlbGxfb2JqZWN0KE1FLCBicmVha19zdHJpbmcoY29udmVydF9zdHJpbmcob3V0X3NlbCksNzgpKTsKKworICBpZiAob3V0X3ZpYyAmJiB3aG8pICB7CisgICAgaWYgKHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUod2hvKSkgIHsKKyAgICAgIG1zZz13aG8tPk1lc3NhZ2UoIGJyZWFrX3N0cmluZyhjb252ZXJ0X3N0cmluZyggb3V0X3ZpYyApLDc4KSwgZmxnKTsKKyAgICAgIGlmIChtc2c9PS0xKQorICAgICAgICB3cml0ZSh3aG8tPm5hbWUoKSsiIGlnbm9yaWVydCBEaWNoIG9kZXIgZGllc2VuIEJlZmVobC5cbiIpOworICAgIH0gZWxzZQorICAgICAgdGVsbF9vYmplY3Qod2hvLGJyZWFrX3N0cmluZyhjb252ZXJ0X3N0cmluZyggb3V0X3ZpYyApLDc4KSk7CisgIH0KKyAgaWYgKG91dF9vdGgpCisgIHNheSggYnJlYWtfc3RyaW5nKGNvbnZlcnRfc3RyaW5nKCBvdXRfb3RoICksNzgpLCAoe3dobyx0aGlzX3BsYXllcigpfSkgKTsKKyAgb3V0X3NlbD1vdXRfdmljPW91dF9vdGg9MDsKKyAgcmV0dXJuIDE7Cit9CisKKy8qKgorICBEaWUgRnVua3Rpb24gc3RlbGx0IGVpbmVuIEhpbGZldGV4dCB6dXIgVmVyZnVlZ3VuZyB1bmQgbGlzdGV0IGRpZSAKKyAgZGVmaW5pZXJ0ZW4gQWR2ZXJiaWVuIGF1Zi4KKyAgXHBhcmFtIG1pbmUgMCA9IGFsbGUgQWR2ZXJiaWVuLCAKKyAgICAgICAgICAgICAgMT1udXIgc2VsYnN0IGRlZmluaWVydGUgQWR2ZXJiaWVuIAorICAgICAgICAgICAgICAyPW51ciBkaWUgdm9tIFN5c3RlbSBiZXJlaXRnZXN0ZWxsdGVuCisgKi8KK3ByaXZhdGUgaW50IHplaWdlX2FkdmVyYnMoaW50IG1pbmUpICB7CisgIG1hcHBpbmcgYWR2ZXJiX2xpc3Q7CisgIHN0cmluZyBvdXQsczsKKworICAvLyBQYXJhbWV0ZXIgYXVzd2VydGVuCisgIHN3aXRjaCAobWluZSl7CisgICAgY2FzZSAxOgorICAgICAgYWR2ZXJiX2xpc3Q9cGxyX2FkdmVyYnM7CisgICAgICBvdXQgPSAiRHUgaGFzdCBmb2xnZW5kZSBBZHZlcmJpZW4gZGVmaW5pZXJ0OlxuIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIGFkdmVyYl9saXN0PVF1ZXJ5U3RkQWR2ZXJicygpOworICAgICAgb3V0ID0gIlN5c3RlbXNlaXRpZyBzaW5kIGZvbGdlbmRlIEFkdmVyYmllbiBkZWZpbmllcnQ6XG4iOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGFkdmVyYl9saXN0PVF1ZXJ5U3RkQWR2ZXJicygpK3Bscl9hZHZlcmJzOworICAgICAgb3V0ID0gIkZvbGdlbmRlIEFkdmVyYmllbiBzdGVoZW4gRGlyIHp1ciBWZXJmdWVndW5nOlxuIjsKKyAgfQorCisgIG91dCArPSIgIEFiay4gICAgQWR2ZXJiXG4gID09PT09PSAgPT09PT09XG4iOworCisgIGlmICggc2l6ZW9mKGFkdmVyYl9saXN0KSA9PSAwKSAKKyAgICBvdXQgKz0gIiBrZWluZS5cbiI7CisgIGVsc2UKKyAgICAvLyBVZWJlciBhbGxlIEVsZW1lbnRlIGRlciBpbmRpemllcyBkZXIgQWR2ZXJiaWVubGlzdGUgZ2VoZW4KKyAgIGZvcmVhY2ggKCBzIDogc29ydF9hcnJheShtX2luZGljZXMoYWR2ZXJiX2xpc3QpLCAjJz4gKSApIHsKKyAgICAgIG91dCArPSBicmVha19zdHJpbmcoYWR2ZXJiX2xpc3Rbc10sNzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoIiAgJS02cyAgIixzKSxCU19JTkRFTlRfT05DRSk7CisgICAgfQorCisgIE1vcmUob3V0KyJcbldpZSBkaWVzZSBBZHZlcmJpZW4gYmVudXR6dCB3ZXJkZW4gaXN0IGluIDxoaWxmZSBhZHZlcmI+ICIKKyAgICAiYmVzY2hyaWViZW4uXG4iKTsKKworICByZXR1cm4gMTsKK30KKwordmFyYXJncyBzdGF0aWMgaW50CitTb3VsQ29tbShzdHJpbmcgc3RyLCBzdHJpbmcgX3ZlcmIpICB7CisgIGludCB0X2csdF9uLGZsYWc7CisgIHN0cmluZyBzdHIxLHN0cjIsc3RyMywqdGFlbnplLHZiOworICBvdXRfc2VsPW91dF92aWM9b3V0X290aD13aG89MDsKKy8vICBpZiAodGhpc19pbnRlcmFjdGl2ZSgpIT1NRSkgcmV0dXJuIDA7CisgIGlmIChpbnRlcmFjdGl2ZShNRSkpIHN0cj1fdW5wYXJzZWRfYXJncygpOyAvLyBOUENzIGhhYmVuIGRhcyBuaWNodCA6KAorICBpZiAoc3RyPT0iIikgc3RyPTA7CisgIHZiPV92ZXJifHxxdWVyeV92ZXJiKCk7CisgIGlmIChzaXplb2YodmIpPjEgJiYgdmJbPDFdPT0nZScgJiYgdmIhPSJub2UiKSB2Yj12YlswLi48Ml07CisgIHNmb28gPSAwOworICBzd2l0Y2ggKHZiKSAgeworICAgIC8qKioqKioqKioqKioqKioqIEFlY2h6ZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImFlY2h6IjoKKyAgICBIRUxQQ0hFQ0soImFlY2h6Iik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKHN0ciAmJiAhYWR2ZXJiKQorICAgICAgUmV0dXJuKCJBZWNoemUgd2llP1xuIik7CisgICAgb3V0X3NlbD0iRHUgYWVjaHp0QEBhZHZlcmJAQC4iOworICAgIG91dF9vdGg9IkBAZ25hbWVAQCBhZWNoenRAQGFkdmVyYkBALiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogQW5zY2htaWVnZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgInNjaG1pZWciOgorICAgIEhFTFBDSEVDSygic2NobWllZyIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmICghd2hvKQorICAgICAgUmV0dXJuKCJBbiB3ZW4gd2lsbHN0IER1IERpY2ggYW5zY2htaWVnZW4/XG4iKTsKKyAgICBpZiAoQ2hlY2tMaWZlKE5PVF9TRUxGLE5PVF9ERUFELAorICAgICAgIkRhcyBnZWh0IGRvY2ggbmljaHQuIiwKKyAgICAgICJOZWluLCBkYXMgbWFjaHQga2VpbmVuIFNwYXNzLiBMZWJ0IGphIG5pY2h0IG1hbC4iKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgb3V0X3NlbD0iRHUgc2NobWllZ3N0IERpY2hAQGFkdmVyYkBAIGFuQEAgd2VuQEAgYW4uIjsKKyAgICBvdXRfdmljPSJAQGduYW1lQEAgc2NobWllZ3Qgc2ljaEBAYWR2ZXJiQEAgYW4gRGljaC4iOworICAgIG91dF9vdGg9IkBAZ25hbWVAQCBzY2htaWVndCBzaWNoQEBhZHZlcmJAQCBhbkBAIHdlbkBAIGFuLiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogQW50d29ydGVuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJhbnR3b3J0IjoKKyAgICBIRUxQQ0hFQ0soImFudHdvcnQiKTsKKyAgICBpZiAoIXN0cikKKyAgICAgIFJldHVybigiQW50d29ydGUgW1dFTV0gV0FTP1xuIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKCF3aG8pCisgICAgICBzdHIxPWNhcGl0YWxpemUoc3RyKTsKKyAgICBlbHNlCisgICAgICBpZiAoc3NjYW5mKHN0ciwiJXMgJXMiLHN0cjEsc3RyMSkhPTIpCisgICAgICAgIFJldHVybigiQW50d29ydGUgd2FzP1xuIik7CisgICAgICBlbHNlCisgICAgICAgIHN0cjE9Y2FwaXRhbGl6ZShzdHIxKTsKKyAgICBvdXRfc2VsPSJEdSBhbnR3b3J0ZXN0QEAgd2VtQEA6ICIrc3RyMTsKKyAgICAvKiBTcHJhY2hmbHVlY2hlIGJlcnVlY2tzaWNodGlnZW4gLVdhcmdvbiwgOC4gOS4gOTUgKi8KKyAgICBpZiAoUXVlcnlQcm9wKFBfUEVSTV9TVFJJTkcpKQorICAgICAgc3RyMSA9IGNhbGxfb3RoZXIoUXVlcnlQcm9wKFBfUEVSTV9TVFJJTkcpLCJwZXJtdXRhdGVfc3RyaW5nIixzdHIxKXx8IiI7CisgICAgaWYgKHdobykgb3V0X3ZpYz0iQEBnbmFtZUBAIGFudHdvcnRldCBEaXI6ICIrc3RyMTsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAgYW50d29ydGV0QEAgd2VtQEA6ICIrc3RyMTsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBBcHBsYXVkaWVyZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImFwcGxhdWRpZXIiOgorICAgIEhFTFBDSEVDSygiYXBwbGF1ZGllciIpOworICAgIEdIT1NUQ0hFQ0soIkRlaW5lIEhhZW5kZSBmYWhyZW4gZHVyY2hlaW5hbmRlciBkdXJjaCAtIHdhciB3b2hsIG5peC5cbiIsCisgICAgICBnbmFtZSgpKyIgd2lsbCBhcHBsYXVkaWVyZW4sIGFiZXIgIitRUFAoRkVNQUxFLFdFUixQTFVSQUwpCisgICAgICAgICsiIEhhZW5kZSBzYXVzZW5cbmR1cmNoZWluYW5kZXIgZHVyY2guXG4iLCAwKTsKKyAgICBpZiAoIXN0cikgIHsKKyAgICAgIG91dF9zZWw9IkR1IGFwcGxhdWRpZXJzdCB2b24gZ2FuemVtIEhlcnplbi4iOworICAgICAgb3V0X290aD0iQEBuYW1lQEAgZ2lidCBlaW5lIFJ1bmRlIEFwcGxhdXMuIjsKKyAgICB9CisgICAgZWxzZSAgeworICAgICAgUGFyc2VSZXN0KHN0cik7CisgICAgICBpZiAoZm9yX2FsbCkgIHsKKyAgICAgICAgb3V0X3NlbD0iRHUgYXBwbGF1ZGllcnN0IEBAYWxsZUBAQEBhZHZlcmJAQC4iOworICAgICAgICBvdXRfdmljPSJAQG5hbWVAQCBhcHBsYXVkaWVydCBAQGFsbGVAQEBAYWR2ZXJiQEAuIjsKKyAgICAgICAgcmV0dXJuIE1peGVkT3V0KFdFTSk7CisgICAgICB9CisgICAgICBpZiAoIXdobyAmJiAhYWR2ZXJiKQorICAgICAgICBSZXR1cm4oIkFwcGxhdWRpZXJlIHdlbSBvZGVyIHdpZSBvZGVyIHNvIGFlaG5saWNoLlxuIik7CisgICAgICBpZiAod2hvICYmIENoZWNrTGlmZShOT1RfU0VMRixOT1RfREVBRCwKKyAgICAgICAgIk5laW4sIGRhcyBnZWhvZXJ0IHNpY2ggbmljaHQuIiwKKyAgICAgICAgIlNhY2hlbiB3aXJkIGhpZXIgbmljaHQgYXBwbGF1ZGllcnQsIE9LPyIpKQorICAgICAgICAgIHJldHVybiAxOworICAgICAgb3V0X3NlbD0iRHUgYXBwbGF1ZGllcnN0QEAgd2VtQEBAQGFkdmVyYkBALiI7CisgICAgICBpZiAod2hvKSBvdXRfdmljPSJAQG5hbWVAQCBhcHBsYXVkaWVydCBEaXJAQGFkdmVyYkBALiI7CisgICAgICBvdXRfb3RoPSJAQG5hbWVAQCBhcHBsYXVkaWVydEBAIHdlbUBAQEBhZHZlcmJAQC4iOworICAgIH0KKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBBcmdsbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAiYXJnbCI6CisgICAgSEVMUENIRUNLKCJhcmdsIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKHN0ciAmJiAhYWR2ZXJiKQorICAgICAgUmV0dXJuKCJBcmdsZSB3aWU/XG4iKTsKKyAgICBvdXRfc2VsPSJEdSBhcmdsc3QiKyhhZHZlcmIgPyAiQEBhZHZlcmJAQC4iIDogIiBlaW4gd2VuaWcgdm9yIERpY2ggaGluLiIpOworICAgIG91dF9vdGg9IkBAZ25hbWVAQCBhcmdsdCIKKyAgICAgICsoYWR2ZXJiID8gIkBAYWR2ZXJiQEAuIiA6ICIgZWluIHdlbmlnIHZvciBzaWNoIGhpbi4iKTsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBBdWZhdG1lbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAiYXRtIjoKKyAgICBIRUxQQ0hFQ0soImF0bSIpOworICAgIGlmICghc3RyIHx8IHNzY2FuZihzdHIsIiVzYXVmIixzdHIxKSE9MSkKKyAgICAgIFJldHVybigiQXRtZSB3aWUgYXVmP1xuIik7CisgICAgUGFyc2VSZXN0KHN0cjEpOworICAgIG91dF9zZWw9IkR1IGF0bWVzdCIrKGFkdmVyYiA/ICJAQGFkdmVyYkBAIiA6ICIgZXJsZWljaHRlcnQiKSsiIGF1Zi4iOworICAgIG91dF9vdGg9IkBAZ25hbWVAQCBhdG1ldCIrKGFkdmVyYiA/ICJAQGFkdmVyYkBAIiA6ICIgZXJsZWljaHRlcnQiKSsiIGF1Zi4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIEJlZ3J1ZXNzZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImhhbGxvIjoKKyAgICBjYXNlICJoaSI6CisgICAgY2FzZSAiYmVncnVlc3MiOgorICAgIEhFTFBDSEVDSygiYmVncnVlc3MiKTsKKyAgICBQYXJzZVJlbW90ZShzdHIpOworICAgIGlmICghd2hvKQorICAgICAgUmV0dXJuKCJXZW4gd2lsbHN0IER1IGJlZ3J1ZXNzZW4/XG4iKTsKKyAgICBpZiAocHJlc2VudCh3aG8sIGVudmlyb25tZW50KCkpKSAgeworICAgICAgb3V0X3NlbD0iRHUgaGVpc3N0IEBAd2VuQEBAQGFkdmVyYkBAIHdpbGxrb21tZW4uIjsKKyAgICAgIG91dF92aWM9IkBAZ25hbWVAQCBoZWlzc3QgRGljaEBAYWR2ZXJiQEAgd2lsbGtvbW1lbi4iOworICAgICAgb3V0X290aD0iQEBnbmFtZUBAIGhlaXNzdCBAQHdlbkBAQEBhZHZlcmJAQCB3aWxsa29tbWVuLiI7CisgICAgfQorICAgIGVsc2UgIHsKKyAgICAgIG91dF9zZWw9IkR1IGhlaXNzdCBAQHdlbkBAQEBhZHZlcmJAQCBhdXMgZGVyIEZlcm5lIHdpbGxrb21tZW4uIjsKKyAgICAgIG91dF92aWM9IkBAZ25hbWVAQCBoZWlzc3QgRGljaEBAYWR2ZXJiQEAgYXVzIGRlciBGZXJuZSB3aWxsa29tbWVuLiI7CisgICAgfQorICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIEJldGFzdGVuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJiZXRhc3QiOgorICAgIEhFTFBDSEVDSygiYmV0YXN0Iik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKCF3aG8pCisgICAgICBSZXR1cm4oIkJlZ3JhYnNjaGUgd2VuP1xuIik7CisgICAgb3V0X3NlbD0iRHUgZ3JhYmJlbHN0QEBhZHZlcmJAQCBhbiAiK3doby0+bmFtZShXRU0pKyIgaGVydW0uIjsKKyAgICBvdXRfdmljPSJAQGduYW1lQEAgZ3JhYmJlbHRAQGFkdmVyYkBAIGFuIERpciBoZXJ1bS4iOworICAgIG91dF9vdGg9IkBAZ25hbWVAQCBncmFiYmVsdEBAYWR2ZXJiQEAgYW4gIit3aG8tPm5hbWUoV0VNKSsiIGhlcnVtLiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogQmV3dW5kZXJuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJiZXd1bmRlciI6CisgICAgSEVMUENIRUNLKCJiZXd1bmRlciIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmICghd2hvKQorICAgICAgUmV0dXJuKCJCZXd1bmRlcmUgd2VuP1xuIik7CisgICAgb3V0X3NlbD0iRHUgYmV3dW5kZXJzdCBAQHdlbkBAQEBhZHZlcmJAQC4iOworICAgIG91dF92aWM9IkBAZ25hbWVAQCBiZXd1bmRlcnQgRGljaEBAYWR2ZXJiQEAuIjsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAgYmV3dW5kZXJ0IEBAd2VuQEBAQGFkdmVyYkBALiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogQmliYmVybiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAiYmliYmVyIjoKKyAgICBIRUxQQ0hFQ0soImJpYmJlciIpOworICAgIGlmIChnaG9zdCgpKQorICAgICAgUmV0dXJuKCJBbHMgR2Vpc3QgZnVlaGxzdCBEdSBrZWluZSBLYWVsdGUuXG4iKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoc3RyICYmICFhZHZlcmIpCisgICAgICBSZXR1cm4oIkJpYmJlcmUgd2llP1xuIik7CisgICAgb3V0X3NlbD0iRHUgYmliYmVyc3RAQGFkdmVyYkBAIHZvciBLYWVsdGUuIjsKKyAgICBvdXRfb3RoPSJAQG5hbWVAQCBiaWJiZXJ0QEBhZHZlcmJAQCB2b3IgS2FlbHRlLiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogQm9ocmUgTmFzZSAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAiYm9ociI6CisgICAgSEVMUENIRUNLKCJib2hyIik7CisgICAgUGFyc2VSZXN0KHN0ciwgKHsibmFzZSIsImluIGRlciBuYXNlIiwiaW4gbmFzZSJ9KSk7CisgICAgaWYgKHN0ciAmJiBzdHIhPSJuYXNlIiAmJiBzdHIhPSJpbiBuYXNlIiAmJiBzdHIhPSJpbiBkZXIgbmFzZSIgJiYgIWFkdmVyYikKKyAgICAgIFJldHVybigiQm9ocmUgd2llIE5hc2U/XG4iKTsKKyAgICBvdXRfc2VsPSJEdSBib2hyc3RAQGFkdmVyYkBAIGluIERlaW5lciBOYXNlLiI7CisgICAgb3V0X290aD0iQEBnbmFtZUBAIGJvaHJ0QEBhZHZlcmJAQCBpbiBkZXIgTmFzZS4gICAgIElnaXR0ISA6KSI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogQnJ1bW1lbG4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImJydW1tZWwiOgorICAgIEhFTFBDSEVDSygiYnJ1bW1lbCIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIG91dF9zZWw9IkR1IGJydW1tZWxzdCIKKyAgICAgICsoYWR2ZXJiID8gIkBAYWR2ZXJiQEAuIiA6IChzdHIgPyAiIGthdW0gdmVyc3RhZW5kbGljaDogIitzdHIrIi4iIDogIi4iKSk7CisgICAgb3V0X290aD0iQEBnbmFtZUBAIGJydW1tZWx0IgorICAgICAgKyhhZHZlcmIgPyAiQEBhZHZlcmJAQC4iIDogKHN0ciA/ICIga2F1bSB2ZXJzdGFlbmRsaWNoOiAiK3N0cisiLiIgOiAiLiIpKTsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBjbHMgKioqKioqKioqKioqKioqLworICAgIGNhc2UgImNscyI6CisgICAgSEVMUENIRUNLKCJjbHMiKTsKKyAgICB3cml0ZSgiG1syShtbSCIpOworICAgIHJldHVybiAxOworCisgICAgLyoqKioqKioqKioqKioqKiogRGFldW1jaGVuZHJlaGVuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJkcmVoIjoKKyAgICBIRUxQQ0hFQ0soImRyZWgiKTsKKyAgICBpZiAoIXN0cikKKyAgICAgIFJldHVybigiRHJlaGUgd2FzP1xuIik7CisgICAgaWYoc3Ryc3RyKHN0ciwiZGFldW1jaGVuIik8MCAmJiBzdHJzdHIoc3RyLCJkYXVtZW4iKTwwKQorICAgICAgUmV0dXJuKCJEcmVoZSB3YXM/XG4iKTsKKyAgICBQYXJzZVJlc3Qoc3RyLCh7ImRhZXVtY2hlbiIsImRhdW1lbiJ9KSk7CisgICAgb3V0X3NlbD0iRHUgZHJlaHN0QEBhZHZlcmJAQCBEYWV1bWNoZW4uIjsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAgZHJlaHRAQGFkdmVyYkBAIERhZXVtY2hlbi4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIERhbmtlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAiZGFuayI6CisgICAgSEVMUENIRUNLKCJkYW5rIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKCF3aG8pCisgICAgICBSZXR1cm4oIkJlaSB3ZW0gd2lsbHN0IER1IERpY2ggYmVkYW5rZW4/XG4iKTsKKyAgICBpZiAoQ2hlY2tMaWZlKE5PVF9TRUxGLCBOT1RfREVBRCwKKyAgICAgICJMZWlkZXN0IER1IGpldHp0IHNjaG9uIGFuIFBlcnNvZW5saWNrZWl0c3NwYWx0dW5nPyBOZSwgbmUuLi4iLAorICAgICAgIktlaW5lIFJlYWt0aW9uLiBJc3Qgd29obCBiZWZyaWVkaWdlbmRlciwgc2ljaCBiZWkgTGViZXdlc2VuIHp1ICIKKyAgICAgICAgKyJiZWRhbmtlbi4iKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgb3V0X3NlbD0iRHUgYmVkYW5rc3QgRGljaEBAYWR2ZXJiQEAgYmVpQEAgd2VtQEAuIjsKKyAgICBvdXRfdmljPSJAQGduYW1lQEAgYmVkYW5rdCBzaWNoQEBhZHZlcmJAQCBiZWkgRGlyLiI7CisgICAgb3V0X290aD0iQEBnbmFtZUBAIGJlZGFua3Qgc2ljaEBAYWR2ZXJiQEAgYmVpQEAgd2VtQEAuIjsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBEZW5rZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImRlbmsiOgorICAgIEhFTFBDSEVDSygiZGVuayIpOworICAgIGlmIChnaG9zdCgpKQorICAgICAgUmV0dXJuKCJXb21pdCB3aWxsc3QgRHUgZGVubiBkZW5rZW4/IER1IGhhc3Qga2VpbmUgZ3JhdWVuIFplbGxlbi4uLlxuIik7CisvLyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBzdHIyPW9sZF9leHBsb2RlKHN0cnx8IiIsIiAiKVswXTsKKyAgICBpZiAoc3RyCisgICAgJiYgKCFhZHZlcmJ8fCgoUXVlcnlTdGRBZHZlcmJzKClbc3RyMl18fHBscl9hZHZlcmJzW3N0cjJdKSkhPWFkdmVyYikpICB7CisgICAgICBvdXRfc2VsPSJEdSBkZW5rc3QgICAuIG8gTyAoIitzdHIrIikiOworICAgICAgb3V0X290aD0iQEBuYW1lQEAgZGVua3QgICAuIG8gTyAoIitzdHIrIikiOworICAgICAgb3V0X3ZpYz0iQEBuYW1lQEAgZGVua3QgICAuIG8gTyAoIitzdHIrIikiOworICAgIH0KKyAgICBlbHNlICB7CisgICAgICBvdXRfc2VsPSJEdSBmYWVuZ3N0QEBhZHZlcmJAQCBhbiB6dSBkZW5rZW4uXG5LbGVpbmUgIgorICAgICAgICArIlJhdWNod29lbGtjaGVuIHN0ZWlnZW4gYXVmLi4uIjsKKyAgICAgIG91dF9vdGg9IkBAbmFtZUBAIGZhZW5ndEBAYWR2ZXJiQEAgYW4genUgZGVua2VuLlxuS2xlaW5lICIKKyAgICAgICAgKyJSYXVjaHdvZWxrY2hlbiBzdGVpZ2VuIGF1Zi4uLiI7CisgICAgfQorICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIERldXRlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAiZGV1dCI6CisgICAgSEVMUENIRUNLKCJkZXV0Iik7CisgICAgUGFyc2VSZXN0KHN0ciwiYXVmIik7CisgICAgaWYgKGZvcl9hbGwpICB7CisgICAgICBvdXRfc2VsPSJEdSBkZXV0ZXN0QEBhZHZlcmJAQCBhdWYgQEBhbGxlQEAuIjsKKyAgICAgIG91dF92aWM9IkBAZ25hbWVAQCBkZXV0ZXRAQGFkdmVyYkBAIGF1ZiBAQGFsbGVAQC4iOworICAgICAgcmV0dXJuIE1peGVkT3V0KFdFTik7CisgICAgfQorICAgIGlmICghd2hvKQorICAgICAgUmV0dXJuKCJBdWYgd2VuIG9kZXIgd2FzIHdpbGxzdCBEdSBkZXV0ZW4/XG4iKTsKKyAgICBvdXRfc2VsPSJEdSBkZXV0ZXN0QEBhZHZlcmJAQCBhdWYiCisgICAgICArKHdobz09dGhpc19vYmplY3QoKT8iIERpY2guIiA6ICJAQCB3ZW5AQC4iKTsKKyAgICBpZiAod2hvICE9IHRoaXNfb2JqZWN0KCkpIG91dF92aWM9IkBAZ25hbWVAQCBkZXV0ZXRAQGFkdmVyYkBAIGF1ZiBEaWNoLiI7CisgICAgb3V0X290aD0iQEBnbmFtZUBAIGRldXRldEBAYWR2ZXJiQEAgYXVmIgorICAgICAgKyh3aG89PXRoaXNfb2JqZWN0KCkgPyAiIHNpY2ggc2VsYmVyLiI6ICJAQCB3ZW5AQC4iKTsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBEcnVlY2tlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAiZHJ1ZWNrIjoKKyAgICBIRUxQQ0hFQ0soImRydWVjayIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmIChmb3JfYWxsKSAgeworICAgICAgb3V0X3NlbD0iRHUgZHJ1ZWNrc3QgQEBhbGxlQEAiKyhhZHZlcmIgPyAiQEBhZHZlcmJAQCIgOiAiIHphZXJ0bGljaCIpCisgICAgICAgICsiIGFuIERpY2guIjsKKyAgICAgIG91dF92aWM9IkBAZ25hbWVAQCBkcnVlY2t0IEBAYWxsZUBAIisKKyAgICAgICAgKGFkdmVyYiA/ICJAQGFkdmVyYkBAIiA6ICIgemFlcnRsaWNoIikrIiBhbiBzaWNoLiI7CisgICAgICByZXR1cm4gTWl4ZWRPdXQoV0VOKTsKKyAgICB9CisgICAgaWYgKCF3aG8pCisgICAgICBSZXR1cm4oIldlbiB3aWxsc3QgRHUgZGVubiBkcnVlY2tlbj9cbiIpOworICAgIGlmIChDaGVja0xpZmUoTk9UX1NFTEYsTk9UX0RFQUQsCisgICAgICAiRGFzIG1hY2h0IGRvY2gga2VpbmVuIFNwYXNzLiIsCisgICAgICAiSWNoIGRydWVja2UgbnVyIGplbWFuZGVuLCBuaWNodCBldHdhcy4iKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgR0hPU1RDSEVDSygiRHUgd2lsbHN0ICIrd2hvLT5uYW1lKFdFTikrIiBhbiBEaWNoIGRydWVja2VuIC0gbnVyIGhhc3QgRHUgIgorICAgICAgICArInNjaG9uXG53aWVkZXIgbmljaHQgZGFyYW4gZ2VkYWNodCwgZGFzcyBzbyB3YXMgYWxzIEdlaXN0IG5pY2h0ICIKKyAgICAgICAgKyJnZWh0LlxuIiwKKyAgICAgIGduYW1lKCkrIiB3aWxsICIrd2hvLT5uYW1lKFdFTikrIiBhbiBzaWNoIGRydWVja2VuIC0gaGF0IGFiZXJcbiIKKyAgICAgICAgKyJtYWwgd2llZGVyIG5pY2h0IGFuIGRpZSBOYWNodGVpbGUgZGVzIEdlaXN0ZXJkYXNlaW5zIGdlZGFjaHQuXG4iLAorICAgICAgZ25hbWUoKSsiIHdpbGwgRGljaCBhbiBzaWNoIGRydWVja2VuIC0gaGF0IGFiZXIgbWFsIHdpZWRlclxuIgorICAgICAgICArIm5pY2h0IGFuIGRpZSBOYWNodGVpbGUgZGVzIEdlaXN0ZXJkYXNlaW5zIGdlZGFjaHQuXG4iKTsKKyAgICBvdXRfc2VsPSJEdSBkcnVlY2tzdCBAQHdlbkBAIisoYWR2ZXJiID8gIkBAYWR2ZXJiQEAiIDogIiB6YWVydGxpY2giKQorICAgICAgKyIgYW4gRGljaC4iOworICAgIG91dF92aWM9IkBAbmFtZUBAIGRydWVja3QgRGljaCIrKGFkdmVyYiA/ICJAQGFkdmVyYkBAIiA6ICIgemFlcnRsaWNoIikKKyAgICAgICsiIGFuIHNpY2guIjsKKyAgICBvdXRfb3RoPSJAQG5hbWVAQCBkcnVlY2t0IEBAd2VuQEAiKyhhZHZlcmIgPyAiQEBhZHZlcmJAQCIgOiAiIHphZXJ0bGljaCIpCisgICAgICArIiBhbiBzaWNoLiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogRW50c2NodWxkaWdlICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJlbnRzY2h1bGRpZyI6CisgICAgSEVMUENIRUNLKCJlbnRzY2h1bGRpZyIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmIChzdHIgJiYgIXdobyAmJiAhYWR2ZXJiKQorICAgICAgUmV0dXJuKCJFbnRzY2h1bGRpZ2UgRGljaCB3aWUgb2RlciBiZWkgd2VtP1xuIik7CisgICAgb3V0X3NlbD0iRHUgYml0dGVzdCIrKHdobyA/ICIgQEB3ZW5AQCIgOiAiIikKKyAgICAgICsiQEBhZHZlcmJAQCB1bSBFbnRzY2h1bGRpZ3VuZy4iOworICAgIGlmICh3aG8pIG91dF92aWM9IkBAZ25hbWVAQCBiaXR0ZXQgRGljaEBAYWR2ZXJiQEAgdW0gRW50c2NodWxkaWd1bmcuIjsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAgYml0dGV0Iisod2hvID8gIiBAQHdlbkBAIiA6ICIiKQorICAgICAgKyJAQGFkdmVyYkBAIHVtIEVudHNjaHVsZGlndW5nLiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogRXJibGVpY2hlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAiZXJibGVpY2giOgorICAgIEhFTFBDSEVDSygiZXJibGVpY2giKTsKKyAgICBHSE9TVENIRUNLKCJJY2ggd2Vpc3MgendhciBuaWNodCwgd2llIER1IGRhcyBzY2hhZmZzdCwgYWJlciBEdSB3aXJzdCAiCisgICAgICAgICsibm9jaCBibGVpY2hlci5cbiIsCisgICAgICBicmVha19zdHJpbmcoIldpZSB1bndhaHJzY2hlaW5saWNoIGRhcyBhdWNoIGlzdCwgYWJlciAiK2duYW1lKCkKKyAgICAgICAgKyIgc2NoYWZmdCBlcyB0YXRzYWVjaGxpY2gsIG5vY2ggYmxlaWNoZXIgenUgd2VyZGVuLiIsNzgpLCAwICk7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKHN0ciAmJiAhYWR2ZXJiKQorICAgICAgUmV0dXJuKCJXaWUgd2lsbHN0IER1IGVyYmxlaWNoZW4/XG4iKTsKKyAgICBvdXRfc2VsPSJEdSBlcmJsZWljaHN0QEBhZHZlcmJAQC4iOworICAgIG91dF9vdGg9IkBAbmFtZUBAIGVyYmxlaWNodEBAYWR2ZXJiQEAuIjsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBFcnJvZXRlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAiZXJyb2V0IjoKKyAgICBIRUxQQ0hFQ0soImVycm9ldCIpOworICAgIEdIT1NUQ0hFQ0soIkR1IHNjaGFmZnN0IGVzIG51ciBiaXMgenUgZWluZW0gYmxhc3NlbiBSb3NhLCBhYmVyIGltbWVyaGluLlxuIiwKKyAgICAgICJEaWUgV2FuZ2VuIGRlcyBHZWlzdGVzIHZvbiAiK2NhcG5hbWUoKSsiIHdlcmRlbiBsZWljaHQgcm9zYS5cbiIsIDApOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmICghYWR2ZXJiICYmIHN0cikKKyAgICAgIFJldHVybigiRXJyb2V0ZSB3aWU/XG4iKTsKKyAgICBvdXRfc2VsPSJEZWluZSBXYW5nZW4gZ2x1ZWhlbkBAYWR2ZXJiQEAuIjsKKyAgICBvdXRfb3RoPSJAQG5hbWVAQCBlcnJvZXRldEBAYWR2ZXJiQEAuIjsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBFcnNjaHJlY2tlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAiZXJzY2hyZWNrIjoKKyAgICBjYXNlICJlcnNjaHJpY2siOgorICAgIGlmICghZ2hvc3QoKSkKKyAgICAgIFJldHVybigiRHUgYmlzdCB6dSBoYXJtbG9zLCBHZWlzdCBtdWVzc3RlIG1hbiBzZWluLi4uXG4iKTsKKyAgICBIRUxQQ0hFQ0soImVyc2NocmVjayIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmICghd2hvKQorICAgICAgUmV0dXJuKCJXZW4gd2lsbHN0IER1IGRlbm4gZXJzY2hyZWNrZW4/XG4iKTsKKyAgICBvdXRfc2VsPSJNaXQgZWluZW0gbGF1dGVuIEJVSCEgZXJzY2hyZWNrc3QgRHUgQEB3ZW5AQCIKKyAgICAgICsoYWR2ZXJiID8gIkBAYWR2ZXJiQEAuIiA6ICIgZnVlcmNodGVybGljaC4iKTsKKyAgICBvdXRfdmljPSJCVUghIER1IHp1Y2tzdCB2b3IgU2NocmVjayB6dXNhbW1lbi4gTXVzcyBkaWVzZXIgR2Vpc3Qgdm9uICIKKyAgICAgICsiQEBnbmFtZUBAIERpY2ggYXVjaEBAYWR2ZXJiQEAgZXJzY2hyZWNrZW4uIjsKKyAgICBvdXRfb3RoPSJCVUghIEBAZ25hbWVAQCBlcnNjaHJlY2t0IEBAd2VuQEAiCisgICAgICArKGFkdmVyYiA/ICJAQGFkdmVyYkBALiIgOiAiIGZ1ZXJjaHRlcmxpY2guIik7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogRmxpcHBlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAiZmxpcHAiOgorICAgIEhFTFBDSEVDSygiZmxpcHAiKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoc3RyICYmICFhZHZlcmIpCisgICAgICBSZXR1cm4oIkF1c2ZsaXBwZW4gd29sbGVuIHdpciBhbHNvLCBzbyBzby4gVW5kIHdpZSwgd2VubiBpY2ggIgorICAgICAgICArImZyYWdlbiBkYXJmP1xuIik7CisgICAgb3V0X3NlbD0iRHUgZmxpcHBzdCIrKGFkdmVyYiA/ICJAQGFkdmVyYkBAIGF1cy4iIDogIiB0b3RhbCBhdXMuIik7CisgICAgb3V0X290aD0iQEBnbmFtZUBAIGZsaXBwdCIrKGFkdmVyYiA/ICJAQGFkdmVyYkBAIGF1cy4iIDogIiB0b3RhbCBhdXMuIik7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogRmx1Y2hlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAiZmx1Y2giOgorICAgIEhFTFBDSEVDSygiZmx1Y2giKTsKKyAgICBHSE9TVENIRUNLKCJEdSBmYWVuZ3N0IG1hbmdlbHMgUmVzb25hbnprb2VycGVyIGxlaXNlIGFuIHp1IGZsdWNoZW4uXG4iLAorICAgICAgZ25hbWUoKSsiIGZhZW5ndCBsZWlzZSBhbiB6dSBmbHVjaGVuLiBMYXV0IGthbm4gZXIgbmljaHQsXG4iCisgICAgICAgICsibWFuZ2VscyBMdWZ0IHVuZCBSZXNvbmFuemtvZXJwZXIuXG4iLCAwKTsKKyAgICBpZiAoIXN0cikgIHsKKyAgICAgIG91dF9zZWw9IkR1IGZsdWNoc3QgbGF1dHN0YXJrLiI7CisgICAgICBvdXRfb3RoPSJAQG5hbWVAQCBmYWVuZ3QgYW4sIGZ1ZXJjaHRlcmxpY2ggenUgZmx1Y2hlbi4iOworICAgIH0KKyAgICBlbHNlICB7CisgICAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICAgIGlmICghYWR2ZXJiKQorICAgICAgICBSZXR1cm4oIldpZSB3aWxsc3QgRHUgZmx1Y2hlbj9cbiIpOworICAgICAgb3V0X3NlbD0iRHUgZmx1Y2hzdEBAYWR2ZXJiQEAuIjsKKyAgICAgIG91dF9vdGg9IkBAbmFtZUBAIGZsdWNodCBhdWYgZWlubWFsQEBhZHZlcmJAQC4iOworICAgIH0KKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBGcmFnZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImZyYWciOgorICAgIEhFTFBDSEVDSygiZnJhZyIpOworICAgIGlmICghc3RyKQorICAgICAgUmV0dXJuKCJGcmFnZSB3ZW4gd2FzP1xuIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKHdobyAmJiBDaGVja0xpZmUoTk9UX1NFTEYsTk9UX0RFQUQsCisgICAgICAiRHUgZmFlbmdzdCB6dSBncnVlYmVsbiBhbi4uLiIsCisgICAgICAiRnJhZ2UgamVtYW5kLCBkZXIgbGVidC4iKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKHdobykKKyAgICAgIHNzY2FuZihzdHIsIiVzICVzIiwgc3RyMSxzdHIxKTsKKyAgICBlbHNlCisgICAgICBzdHIxPXN0cjsKKyAgICBpZiAoIXN0cjEpCisgICAgICBSZXR1cm4oIkZyYWdlICIrd2hvLT5uYW1lKFdFTikrIiBXQVM/XG4iKTsKKyAgICBzdHIxPWNhcGl0YWxpemUoc3RyMSk7CisgICAgaWYgKHN0cjFbPDFdICE9ICc/JykKKyAgICAgIHN0cjEgKz0gIj8iOworICAgIG91dF9zZWw9IkR1IGZyYWdzdEBAIHdlbkBAOiAiK3N0cjE7CisgICAgLyogU3ByYWNoZmx1Y2ggYmVydWVja3NpY2h0aWdlbiAtV2FyZ29uLCA4LiA5LiA5NSAqLworICAgIGlmIChvYmplY3RwKFF1ZXJ5UHJvcChQX1BFUk1fU1RSSU5HKSkpCisgICAgICBzdHIxID0gY2FsbF9vdGhlcihRdWVyeVByb3AoUF9QRVJNX1NUUklORyksICJwZXJtdXRhdGVfc3RyaW5nIiwgc3RyMSl8fCIiOworICAgIGlmICh3aG8pIG91dF92aWM9KGdob3N0KCkgPyAiRGVyIEdlaXN0IHZvbiAiIDogLyogSVNfTEVBUk5FUihNRSkgPworICAgICAgUXVlcnlQcm9wKFBfUFJFU0FZKXx8IiIgOiAqLyAiIikrY2FwbmFtZSgpKyIgZnJhZ3QgRGljaDogIitzdHIxOworICAgIG91dF9vdGg9KGdob3N0KCkgPyAiRGVyIEdlaXN0IHZvbiAiIDogLyogSVNfTEVBUk5FUihNRSkgPworICAgICAgUXVlcnlQcm9wKFBfUFJFU0FZKXx8IiIgOiAqLyAiIikrY2FwbmFtZSgpKyIgZnJhZ3RAQCB3ZW5AQDogIitzdHIxOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIEZyZXVlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAiZnJldSI6CisgICAgSEVMUENIRUNLKCJmcmV1Iik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKHN0ciAmJiAhd2hvICYmICFhZHZlcmIpCisgICAgICBSZXR1cm4oIkZyZXVlIERpY2ggd2llP1xuIik7CisgICAgb3V0X3NlbD0iRHUgIisod2hvID8gImdyaW5zdCBAQHdlbkBAIGFuIHVuZCAiIDogIiIpCisgICAgICArImZyZXVzdCBEaWNoQEBhZHZlcmJAQC4iOworICAgIGlmICh3aG8pIG91dF92aWM9IkBAZ25hbWVAQCBncmluc3QgRGljaCBhbiB1bmQgZnJldXQgc2ljaEBAYWR2ZXJiQEAuIjsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAgIisod2hvID8gImdyaW5zdCBAQHdlbkBAIGFuIHVuZCAiIDogIiIpCisgICAgICArImZyZXV0IHNpY2hAQGFkdmVyYkBALiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogRnVyemVuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJmdXJ6IjoKKyAgICBIRUxQQ0hFQ0soImZ1cnoiKTsKKyAgICBHSE9TVENIRUNLKCJEdSBsYWVzc3QgZWluZW4gZmFocmVuIC0gYWJlciBlciByaWVjaHQgbmFjaCBnYXIgbml4LlxuIiwKKyAgICAgIGduYW1lKCkrIiBsYWVzc3QgZWluZW4gZmFocmVuLiBNYW4gcmllY2h0IGFiZXIgbml4LlxuIiwgMCk7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKHN0ciAmJiAhYWR2ZXJiKQorICAgICAgUmV0dXJuKCJGdXJ6ZSB3aWU/XG4iKTsKKyAgICBvdXRfc2VsPSJEdSBmdXJ6dCIrKGFkdmVyYiA/ICJAQGFkdmVyYkBALiIgOiAiIGhlbW11bmdzbG9zLiIpOworICAgIG91dF9vdGg9IkBAbmFtZUBAIGxhZXNzdEBAYWR2ZXJiQEAgZWluZW4gU3RpbmtlZnVyeiBmYWhyZW4uIjsKKyAgICBvZm9vPWNsb25lX29iamVjdCgiL2l0ZW1zL2Z1cnoiKTsKKyAgICBvZm9vLT5zZXRfZnVyemVyKHRoaXNfcGxheWVyKCkpOworICAgIG9mb28tPm1vdmUoZW52aXJvbm1lbnQodGhpc19wbGF5ZXIoKSkpOworICAgIHJldHVybiBGZWVsSXQoKTsKKy8vIERFQlVHIEZ1cnogdGVzdGVuIQorCisgICAgLyoqKioqKioqKioqKioqKiogR2FlaG5lbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAiZ2FlaG4iOgorICAgIEhFTFBDSEVDSygiZ2FlaG4iKTsKKyAgICBpZiAoZ2hvc3QoKSkKKyAgICAgIFJldHVybigiQWxzIEdlaXN0IHdpcnN0IER1IG5pY2h0IG11ZWRlIC0gYWxzbyBuaWNodCBnYWVobmVuLlxuIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKHN0ciAmJiAhYWR2ZXJiKQorICAgICAgUmV0dXJuKCJXaWUgd2lsbHN0IER1IGdhZWhuZW4/XG4iKTsKKyAgICBpZiAoIWFkdmVyYikKKyAgICAgIG91dF9zZWw9Ikthbm5zdCBEdSBhYmVyIERlaW4oZW4pIE11bmQvTWF1bC9TY2huYWJlbCB3ZWl0IGF1ZnJlaXNzZW4hIjsKKyAgICBlbHNlCisgICAgICBvdXRfc2VsPSJEdSBnYWVobnN0QEBhZHZlcmJAQC4iOworICAgIG91dF9vdGg9IkBAZ25hbWVAQCBnYWVobnRAQGFkdmVyYkBALiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogR2x1Y2tzZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImdsdWNrcyI6CisgICAgSEVMUENIRUNLKCJnbHVja3MiKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoc3RyICYmICFhZHZlcmIpCisgICAgICBSZXR1cm4oIkdsdWNrc2Ugd2llP1xuIik7CisgICAgb3V0X3NlbD0iRHUgZ2x1Y2tzdCIrKGFkdmVyYiA/ICJAQGFkdmVyYkBALiIgOiAiIHdpZSBlaW4gSHVobi4iKTsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAgZ2x1Y2tzdCIrKGFkdmVyYiA/ICJAQGFkdmVyYkBALiIgOiAiIHdpZSBlaW4gSHVobi4iKTsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBHcmF0dWxpZXJlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAiZ3JhdHVsaWVyIjoKKyAgICBjYXNlICJiZWdsdWVja3d1ZW5zY2giOgorICAgIEhFTFBDSEVDSygiZ3JhdHVsaWVyIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKCF3aG8pCisgICAgICBSZXR1cm4oIldlbSB3aWxsc3QgRHUgZ3JhdHVsaWVyZW4/XG4iKTsKKyAgICBpZiAoQ2hlY2tMaWZlKE5PVF9TRUxGLCBOT1RfREVBRCwKKyAgICAgICJOYSwgbWVpbnN0IER1IG5pY2h0LCBkYXNzIEVpZ2VubG9iIHN0aW5rdD8iLAorICAgICAgIlNvbGwgaWNoIGRlbSBEaW5nIHZpZWxsZWljaHQgenVtIFRvdHNlaW4gZ3JhdHVsaWVyZW4/IE5lZSBuZWUuIikpCisgICAgICAgIHJldHVybiAxOworICAgIG91dF9zZWw9IkR1IGdyYXR1bGllcnN0IEBAd2VtQEBAQGFkdmVyYkBALiI7CisgICAgb3V0X3ZpYz0iQEBnbmFtZUBAIGdyYXR1bGllcnQgRGlyQEBhZHZlcmJAQC4iOworICAgIG91dF9vdGg9IkBAZ25hbWVAQCBncmF0dWxpZXJ0IEBAd2VtQEBAQGFkdmVyYkBALiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogR3JpbnNlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAiZ3JpbnMiOgorICAgIEhFTFBDSEVDSygiZ3JpbnMiKTsKKyAgICBHSE9TVENIRUNLKCJBbHMgRHUgZ3JpbnN0LCBzaWVoc3QgRHUgcmVnZWxyZWNodCwgd2llIGRpZSBhbmRlcmVuIGVpbmUgIgorICAgICAgICArIkdhZW5zZWhhdXQgYmVrb21tZW4uXG4iLAorICAgICAgIkR1IGJla29tbXN0IGVpbmUgR2FlbnNlaGF1dCwgYWxzIGRlciBHZWlzdCB2b24gIitjYXBuYW1lKCkKKyAgICAgICAgKyIgenUgZ3JpbnNlbiBhbmZhZW5ndC5cbiIsIDApOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmIChmb3JfYWxsKSAgeworICAgICAgb3V0X3NlbD0iRHUgZ3JpbnN0IEBAYWxsZUBAQEBhZHZlcmJAQCBhbi4iOworICAgICAgb3V0X3ZpYz0iQEBuYW1lQEAgZ3JpbnN0IEBAYWxsZUBAQEBhZHZlcmJAQCBhbi4iOworICAgICAgcmV0dXJuIE1peGVkT3V0KFdFTik7CisgICAgfQorICAgIGlmICghd2hvICYmICFhZHZlcmIgJiYgc3RyKQorICAgICAgUmV0dXJuKCJHcmluc2VuIC0gc2Nob2VuIHVuZCBndXQuIEFiZXIgd2VuIG9kZXIgd2llIChhbilncmluc2VuP1xuIik7CisgICAgaWYgKHdobyAmJiBDaGVja0xpZmUoTk9UX1NFTEYsTk9UX0RFQUQsCisgICAgICAiRHUgZ3JpbnN0IERpciB3YXMsIGFiZXIgc28sIGRhc3MgZXMga2VpbiBhbmRlcmVyIHNpZWh0LiIsCisgICAgICAiTmljaHQgbWFsIGVpbmVuIFNwaWVnZWwgZGFyZiBtYW4gaGllciBhbmdyaW5zZW4sIG51ciBMZWJld2VzZW4hIikpCisgICAgICAgIHJldHVybiAxOworICAgIG91dF9zZWw9IkR1IGdyaW5zdEBAIHdlbkBAQEBhZHZlcmJAQCIrKHdobyA/ICIgYW4iIDogIiIpKyIuIjsKKyAgICBpZiAod2hvKSBvdXRfdmljPSJAQG5hbWVAQCBncmluc3QgRGljaEBAYWR2ZXJiQEAgYW4uIjsKKyAgICBvdXRfb3RoPSJAQG5hbWVAQCBncmluc3RAQCB3ZW5AQEBAYWR2ZXJiQEAiKyh3aG8gPyAiIGFuIiA6ICIiKSsiLiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogR3J1ZWJlbG4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImdydWViZWwiOgorICAgIGNhc2UgImdydWVibCI6CisgICAgSEVMUENIRUNLKCJncnVlYmVsIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKHN0ciAmJiAhYWR2ZXJiKQorICAgICAgUmV0dXJuKCJHcnVlYmxlIHdpZT9cbiIpOworICAgIG91dF9zZWw9IkR1IGdydWViZWxzdEBAYWR2ZXJiQEAgZWluZSBXZWlsZSB2b3IgRGljaCBoaW4uIjsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAgZ3J1ZWJlbHRAQGFkdmVyYkBAIGVpbmUgV2VpbGUgdm9yIHNpY2ggaGluLiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogR3J1bW1lbG4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImdydW1tZWwiOgorICAgIGNhc2UgImdydW1tbCI6CisgICAgSEVMUENIRUNLKCJncnVtbWVsIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKHN0ciAmJiAhYWR2ZXJiKQorICAgICAgUmV0dXJuKCJHcnVtbWxlIHdpZT9cbiIpOworICAgIG91dF9zZWw9IkR1IGdydW1tZWxzdEBAYWR2ZXJiQEAuIjsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAgZ3J1bW1lbHRAQGFkdmVyYkBALiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogR3J1bnplbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAiZ3J1bnoiOgorICAgIEhFTFBDSEVDSygiZ3J1bnoiKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoc3RyICYmICFhZHZlcmIpCisgICAgICBSZXR1cm4oIkdydW56ZSB3aWU/XG4iKTsKKyAgICBvdXRfc2VsPSJEdSBncnVuenRAQGFkdmVyYkBALiI7CisgICAgb3V0X290aD0iQEBnbmFtZUBAIGdydW56dEBAYWR2ZXJiQEAuIjsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBHdWNrZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImd1Y2siOgorICAgIEhFTFBDSEVDSygiZ3VjayIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmICghYWR2ZXJiKQorICAgICAgUmV0dXJuKCJHdWNrZSB3aWUgYXVzIGRlciBXYWVzY2hlP1xuIik7CisgICAgb3V0X3NlbD0iRHUgZ3Vja3N0QEBhZHZlcmJAQCBhdXMgZGVyIFdhZXNjaGUuIjsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAgZ3Vja3RAQGFkdmVyYkBAIGF1cyBkZXIgV2Flc2NoZS4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIEphbW1lcm4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImphbW1lciI6CisgICAgSEVMUENIRUNLKCJqYW1tZXIiKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoc3RyICYmICFhZHZlcmIpCisgICAgICBSZXR1cm4oIldpZSB3aWxsc3QgRHUgamFtbWVybj9cbiIpOworICAgIG91dF9zZWw9IkR1IGphbW1lcnN0QEBhZHZlcmJAQC4iOworICAgIG91dF9vdGg9IkBAZ25hbWVAQCBqYW1tZXJ0QEBhZHZlcmJAQC4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIEhhZXRzY2hlbG4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImhhZXRzY2hlbCI6CisgICAgY2FzZSAiaGFldHNjaGwiOgorICAgIEhFTFBDSEVDSygiaGFldHNjaGVsIik7CisgICAgR0hPU1RDSEVDSygiRHUgdWViZXJsZWdzdCBlcyBEaXIgYW5kZXJzIC0gbWl0IERlaW5lbiBkdXJjaGxhZXNzaWdlbiAiCisgICAgICAgICsiSGFlbmRlbi4uLiIsCisgICAgICBnbmFtZSgpKyIgd2lsbCBhbnNjaGVpbmVuZCBqZW1hbmQgaGFldHNjaGVsbiwgdWViZXJsZWd0XG4iCisgICAgICAgICsiZXMgc2ljaCBuYWNoIGVpbmVtIGt1cnplbiBCbGljayBhdWYgc2VpbmUgSGFlbmRlIGFuZGVycy5cbiIsIDApOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmIChmb3JfYWxsKSAgeworICAgICAgb3V0X3NlbD0iRHUgaGFldHNjaGVsc3QgQEBhbGxlQEBAQGFkdmVyYkBALiI7CisgICAgICBvdXRfdmljPSJAQG5hbWVAQCBoYWV0c2NoZWx0IEBAYWxsZUBAQEBhZHZlcmJAQC4iOworICAgICAgcmV0dXJuIE1peGVkT3V0KFdFTik7CisgICAgfQorICAgIGlmICghc3RyIHx8ICF3aG8pCisgICAgICBSZXR1cm4oIldlbiB3aWxsc3QgRHUgaGFldHNjaGVsbj9cbiIpOworICAgIGlmICh3aG8gJiYgQ2hlY2tMaWZlKE5PVF9TRUxGLCBOT1RfREVBRCwKKyAgICAgICJEYXMgc2llaHQgdmllbCB6dSBhbGJlcm4gYXVzIC0gRHUgbGFlc3N0IGVzIGJsZWliZW4uIiwKKyAgICAgICJJc3QgZGEgdWViZXJoYXVwdCB3YXMgenUgaGFldHNjaGVsbj8gTmVpbiwgZGEgbGVidCBkb2NoIG5peC4iKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgb3V0X3NlbD0iRHUgaGFldHNjaGVsc3RAQCB3ZW5AQEBAYWR2ZXJiQEAuIjsKKyAgICBvdXRfdmljPSJAQG5hbWVAQCBoYWV0c2NoZWx0IERpY2hAQGFkdmVyYkBALiI7CisgICAgb3V0X290aD0iQEBuYW1lQEAgaGFldHNjaGVsdEBAIHdlbkBAQEBhZHZlcmJAQC4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIEhpY2tzZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImhpY2tzIjoKKyAgICBIRUxQQ0hFQ0soImhpY2tzIik7CisgICAgR0hPU1RDSEVDSygiSG9wcGxhISBEaWVzZXIgSGlja3NlciB6aWVodCBEaWNoIGdhbnogc2Nob2VuIHp1c2FtbWVuIVxuIiwKKyAgICAgIGduYW1lKCkrIiBoYXQgYW5zY2hlaW5lbmQgU2NobHVja2F1Zi5cbiIKKyAgICAgICAgKyJVbmQgd2FzIGZ1ZXIgZWluZW4hIEZ1ZXIgZWluZW4gTW9tZW50IHppZWh0IGVzICIrUXVlcnlQcm9ub3VuKFdFTikKKyAgICAgICAgKyIgemllbWxpY2ggenVzYW1tZW4uXG4iLCAwKTsKKyAgICBpZiAoIXN0cikgIHsKKyAgICAgIG91dF9zZWw9IkhpY2tzISI7CisgICAgICBvdXRfb3RoPSJAQG5hbWVAQCBtdXNzIGhpY2tzZW4uIFdhaHJzY2hlaW5saWNoIHp1IHZpZWwgQWxrb2hvbC4uLiI7CisgICAgfQorICAgIGVsc2UgIHsKKyAgICAgIFBhcnNlUmVzdChzdHIpOworICAgICAgaWYgKCFhZHZlcmIpCisgICAgICAgIFJldHVybigiSGlja3NlIHdpZT9cbiIpOworICAgICAgb3V0X3NlbD0iRHUgaGlja3N0QEBhZHZlcmJAQC4iOworICAgICAgb3V0X290aD0iQEBuYW1lQEAgaGlja3N0QEBhZHZlcmJAQC4iOworICAgIH0KKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBIdWVwZmVuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJodWVwZiI6CisgICAgSEVMUENIRUNLKCJodWVwZiIpOworICAgIEdIT1NUQ0hFQ0soIkR1IHNjaHdlYnN0IGR1cmNoIGRpZSBHZWdlbmQuXG4iLAorICAgICAgZ25hbWUoKSsiIHNjaHdlYnQgZHVyY2ggZGllIEdlZ2VuZC5cbiIsIDApOworICAgIGlmICghc3RyKSAgeworICAgICAgb3V0X3NlbD0iQiBPIEkgTiBHICEhIER1IGh1ZXBmc3QgaW4gZGVyIEdlZ2VuZCBoZXJ1bS4iOworICAgICAgb3V0X290aD0iQEBuYW1lQEAgaHVlcGZ0IGluIGRlciBHZWdlbmQgaGVydW0uIjsKKyAgICB9CisgICAgZWxzZSAgeworICAgICAgUGFyc2VSZXN0KHN0cik7CisgICAgICBpZiAoIXdobyAmJiAhYWR2ZXJiKQorICAgICAgICBSZXR1cm4oIkh1ZXBmZSB3aWUgb2RlciB1bSB3ZW4gb2RlciB3aWUgb2RlciB3YXMgb2RlciBoYWVoP1xuIik7CisgICAgICBvdXRfc2VsPSJEdSBodWVwZnN0QEBhZHZlcmJAQCIrKHdobyA/ICIgdW1AQCB3ZW5AQCIgOiAiIikrIiBoZXJ1bS4iOworICAgICAgaWYgKHdobykgb3V0X3ZpYz0iQEBuYW1lQEAgaHVlcGZ0QEBhZHZlcmJAQCB1bSBEaWNoIGhlcnVtLiI7CisgICAgICBvdXRfb3RoPSJAQG5hbWVAQCBodWVwZnRAQGFkdmVyYkBAIisod2hvID8gIiB1bUBAIHdlbkBAIiA6ICIiKSsiIGhlcnVtLiI7CisgICAgfQorICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIEh1c3RlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAiaHVzdCI6CisgICAgSEVMUENIRUNLKCJodXN0Iik7CisgICAgR0hPU1RDSEVDSygiRHUgdmVyc3RyZXVzdCBlaW4gcGFhciBHZWlzdGVyYmF6aWxsZW4gaW0gUmF1bS5cbiIsCisgICAgICBnbmFtZSgpKyIgbWFjaHQgdWZmZiwgdWZmZiB1bmQgdmVydGVpbHQgZWluIHBhYXIgR2Vpc3Rlci1cbiIKKyAgICAgICAgKyJiYXppbGxlbiBpbSBSYXVtLlxuIiwgMCk7CisgICAgaWYgKCFzdHIpICB7CisgICAgICBvdXRfc2VsPSJIdXN0ISBLZXVjaCEgSGFsdCBkaXIgZG9jaCB3ZW5pZ3N0ZW5zIGRpZSBIYW5kIHZvciBkZW4gTXVuZCEiOworICAgICAgb3V0X290aD0iQEBuYW1lQEAgaHVzdGV0IHNpY2ggZmFzdCBkaWUgU2VlbGUgYXVzIGRlbSBMZWliLiI7CisgICAgfQorICAgIGVsc2UgIHsKKyAgICAgIFBhcnNlUmVzdChzdHIpOworICAgICAgaWYgKCF3aG8gJiYgIWFkdmVyYikKKyAgICAgICAgUmV0dXJuKCJXZW5uIER1IHNjaG9uIHdhcyBoaW50ZXIgaHVzdGUgdGlwcHN0LCBkYW5uIGJpdHRlIHdhcyAiCisgICAgICAgICAgKyJ2ZXJudWVuZnRpZ2VzIVxuIik7CisgICAgICBpZiAod2hvICYmIENoZWNrTGlmZShOT1RfU0VMRixOT1RfREVBRCwKKyAgICAgICAgIkRpciBzZWxiZXIga29lbm5lbiBudXIgYW5kZXJlIHdhcyBodXN0ZW4uIiwKKyAgICAgICAgIkJpdHRlIGh1c3RlIG51ciBMZWJld2VzZW4gd2FzLiIpKQorICAgICAgICAgIHJldHVybiAxOworICAgICAgb3V0X3NlbD0iRHUgaHVzdGVzdEBAIHdlbUBAQEBhZHZlcmJAQCIrKHdobz8gIiB3YXMiIDogIiIpKyIuIjsKKyAgICAgIGlmICh3aG8pIG91dF92aWM9IkBAbmFtZUBAIGh1c3RldCBEaXJAQGFkdmVyYkBAd2FzLiI7CisgICAgICBvdXRfb3RoPSJAQG5hbWVAQCBodXN0ZXRAQCB3ZW1AQEBAYWR2ZXJiQEAiKyh3aG8/ICIgd2FzIiA6ICIiKSsiLiI7CisgICAgfQorICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIEp1YmVsbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAianViZWwiOgorICAgIGNhc2UgImp1YmwiOgorICAgIEhFTFBDSEVDSygianViZWwiKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoc3RyICYmICF3aG8gJiYgIWFkdmVyYikKKyAgICAgIFJldHVybigiSnVibGUgd2llPyBPZGVyIHdlbSB6dT9cbiIpOworICAgIG91dF9zZWw9IkR1IGp1YmVsc3RAQCB3ZW1AQEBAYWR2ZXJiQEAiKyh3aG8gPyAiIHp1LiIgOiAiLiIpOworICAgIGlmICh3aG8pIG91dF92aWM9IkBAZ25hbWVAQCBqdWJlbHQgRGlyQEBhZHZlcmJAQCB6dS4iOworICAgIG91dF9vdGg9IkBAZ25hbWVAQCBqdWJlbHRAQCB3ZW1AQEBAYWR2ZXJiQEAiKyh3aG8gPyAiIHp1LiIgOiAiLiIpOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIEtldWNoZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImtldWNoIjoKKyAgICBIRUxQQ0hFQ0soImtldWNoIik7CisgICAgaWYgKGdob3N0KCkpCisgICAgICBSZXR1cm4oIkFscyBHZWlzdCBzdHJlbmd0IERpY2ggbml4IGFuIC0gYWxzbyB3aXJkIGF1Y2ggbmljaHQgIgorICAgICAgICArImdla2V1Y2h0LlxuIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKHN0ciAmJiAhYWR2ZXJiKQorICAgICAgUmV0dXJuKCJLZXVjaGUgd2llP1xuIik7CisgICAgb3V0X3NlbD0iRHUga2V1Y2hzdCIrKGFkdmVyYiA/ICJAQGFkdmVyYkBALiIgOiAiIHZvciBBbnN0cmVuZ3VuZy4iKTsKKyAgICBvdXRfb3RoPSJAQG5hbWVAQCBrZXVjaHQiKyhhZHZlcmIgPyAiQEBhZHZlcmJAQC4iIDogIiB2b3IgQW5zdHJlbmd1bmcuIik7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogS2ljaGVybiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAia2ljaGVyIjoKKyAgICBIRUxQQ0hFQ0soImtpY2hlciIpOworICAgIGlmICghc3RyKSAgeworICAgICAgb3V0X3NlbD0iRHUga2ljaGVyc3QuIChXaWUgYWxiZXJuIHZvbiBEaXIpIjsKKyAgICAgIG91dF9vdGg9IkBAZ25hbWVAQCBnaWJ0IGVpbiBhbGJlcm5lcyBLaWNoZXJuIHZvbiBzaWNoLiI7CisgICAgfQorICAgIGVsc2UgIHsKKyAgICAgIFBhcnNlUmVzdChzdHIpOworICAgICAgaWYgKCF3aG8gJiYgIWFkdmVyYikKKyAgICAgICAgUmV0dXJuKCJEYXMgaGF1dCBzbyBuaWNodCBoaW4sIGdpYiB2ZXJudWVuZnRpZ2UgUGFyYW1ldGVyLlxuIik7CisgICAgICBpZiAod2hvICYmIENoZWNrTGlmZShOT1RfU0VMRixOT1RfREVBRCwKKyAgICAgICAgIkluIGRpZXNlbSBGYWxsIG5pbW0gYml0dGUgbnVyIGtpY2hlci4iLAorICAgICAgICAiTXVzc3Qgc2Nob24gZXR3YXMgTGViZW5kZXMgYW5nZWJlbiwgbmljaHRzIFRvdGVzLiIpKQorICAgICAgICAgIHJldHVybiAxOworICAgICAgb3V0X3NlbD0iRHUga2ljaGVyc3RAQGFkdmVyYkBAIisod2hvID8gIiBoaW50ZXIgIit3aG8tPm5hbWUoV0VTU0VOKSsKKyAgICAgICAgIiBSdWVja2VuLiIgOiAiLiIpOworICAgICAgaWYgKHdobykgIG91dF92aWM9IkplbWFuZCBraWNoZXJ0QEBhZHZlcmJAQCBoaW50ZXIgZGVpbmVtIFJ1ZWNrZW4uIjsKKyAgICAgIG91dF9vdGg9IkBAZ25hbWVAQCBraWNoZXJ0QEBhZHZlcmJAQCIrKHdobyA/ICIgaGludGVyICIrd2hvLT5uYW1lKFdFU1NFTikKKyAgICAgICAgKyIgUnVlY2tlbi4iIDogIi4iKTsKKyAgICB9CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogS2l0emVsbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAia2l0emVsIjoKKyAgICBjYXNlICJraXR6bCI6CisgICAgSEVMUENIRUNLKCJraXR6ZWwiKTsKKyAgICBHSE9TVENIRUNLKCJNaXQgRGVpbmVuIGltbWF0ZXJpZWxsZW4gRmluZ2VybiBzY2hhZmZzdCBEdSBkYXMgbmljaHQuXG4iLAorICAgICAgZ25hbWUoKSsiIG11c3MgZ2VyYWRlIGZlc3RzdGVsbGVuLCBkYXNzIG1hbiBtaXRcbiIKKyAgICAgICAgKyJpbW1hdGVyaWVsbGVuIEZpbmdlcm4gbmljaHQga2l0emVsbiBrYW5uLlxuIiwgMCk7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKCF3aG8pCisgICAgICBSZXR1cm4oIldlbiB3aWxsc3QgRHUga2l0emVsbj9cbiIpOworICAgIGlmICh3aG8gJiYgQ2hlY2tMaWZlKE5PVF9TRUxGLE5PVF9ERUFELAorICAgICAgIkR1IGJpc3QgZG9jaCBrZWluIE1hc29jaGlzdCEgRHUgbGFlc3N0IGVzIGJsZWliZW4uIiwKKyAgICAgICJEaW5nZSBzaW5kIHNvIHNlbHRlbiBraXR6bGlnLiBMYXNzIGVzIGJsZWliZW4uIikpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChtZW1iZXIoKHsiaGlnaGxhbmRlciIsImhvYm8ifSksIHdoby0+cXVlcnlfcmVhbF9uYW1lKCkpPi0xKQorICAgICAgc3dpdGNoICh3aG8tPnF1ZXJ5X3JlYWxfbmFtZSgpKSAgeworICAgICAgICBjYXNlICJoaWdobGFuZGVyIjogc3RyMT0idW50ZXIiOyBzdHIyPSJGZWRlcm4iOyBicmVhazsKKyAgICAgICAgY2FzZSAiaG9ibyIgICAgICA6IHN0cjE9ImFuIjsgICAgc3RyMj0iS2lubiI7IGJyZWFrOworICAgICAgfQorICAgIGVsc2UgaWYgKHdoby0+UXVlcnlQcm9wKFBfUkFDRSkpCisgICAgICBzd2l0Y2ggKGxvd2VyX2Nhc2Uod2hvLT5RdWVyeVByb3AoUF9SQUNFKSkpICB7CisgICAgICAgIGNhc2UgImRyYWNoZSIgOiBzdHIxPSJ1bnRlciI7c3RyMj0iU2NodXBwZW4iOworICAgICAgICAgIHRfZz1GRU1BTEU7IHRfbj1QTFVSQUw7IGJyZWFrOworICAgICAgICBjYXNlICJncmVpZiIgIDogc3RyMT0idW50ZXIiO3N0cjI9IkZlZGVybiI7CisgICAgICAgICAgdF9nPUZFTUFMRTsgdF9uPVBMVVJBTDsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQgICAgICAgOiBzdHIxPSJhbiI7IHN0cjI9Iktpbm4iOyB0X2c9TkVVVEVSOyB0X249U0lOR1VMQVI7CisgICAgICB9CisgICAgZWxzZSAgeworICAgICAgc3RyMT0iYW4iOyBzdHIyPSJLaW5uIjsgdF9nPU5FVVRFUjsgdF9uPVNJTkdVTEFSOworICAgIH0KKyAgICBpZiAoZ2V0dWlkKHdobyk9PSJ0cmVzdCIgfHwgZ2V0dWlkKHdobyk9PSJ3b2Vsa2NoZW4iKSAgeworICAgICAgc3RyMT0iYW4iOyBzdHIyPSJGdWVzc2VuIjsgdF9nPU1BTEU7IHRfbj1QTFVSQUw7CisgICAgfQorICAgIG91dF9zZWw9IkR1IGtpdHplbHN0QEAgd2VuQEBAQGFkdmVyYkBAICIrc3RyMSsiICIrd2hvLT5RUFAodF9nLFdFTSx0X24pCisgICAgICArIiAiK3N0cjIrIi5cbkBAd2VyQEAgdmVyc3VjaHQsIHNpY2ggenUgYmVoZXJyc2NoZW4sIG11c3MgYWJlciAiCisgICAgICArImRvY2ggbGFjaGVuLiI7CisgICAgb3V0X3ZpYz0iQEBuYW1lQEAga2l0emVsdCBEaWNoQEBhZHZlcmJAQCAiK3N0cjErIiBEZWluZSIKKyAgICAgICsodF9uID8gIm4iIDogKHRfZz09RkVNQUxFID8gInIiIDogIm0iKSkrIiAiK3N0cjIKKyAgICAgICsiLlxuRHUgdmVyc3VjaHN0LCBEaWNoIHp1IGJlaGVycnNjaGVuLCBtdXNzdCBhYmVyIGRvY2ggbGFjaGVuLiI7CisgICAgb3V0X290aD0iQEBuYW1lQEAga2l0emVsdEBAIHdlbkBAQEBhZHZlcmJAQCAiK3N0cjErIiAiCisgICAgICArd2hvLT5RUFAodF9nLFdFTSx0X24pKyIgIitzdHIyCisgICAgICArIi5cbkBAd2VyQEAgdmVyc3VjaHQsIHNpY2ggenUgYmVoZXJyc2NoZW4sIG11c3MgYWJlciBkb2NoIGxhY2hlbi4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIEtsYXRzY2hlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAia2xhdHNjaCI6CisgICAgSEVMUENIRUNLKCJrbGF0c2NoIik7CisgICAgR0hPU1RDSEVDSygiRGVpbmUgSGFlbmRlIHNhdXNlbiBkdXJjaGVpbmFuZGVyIGR1cmNoLlxuIiwKKyAgICAgIGduYW1lKCkrIiB3aWxsIGluIGRpZSBIYWVuZGUga2xhdHNjaGVuIC0gYWJlciBzaWVcbiIKKyAgICAgICAgKyJzYXVzZW4gZHVyY2hlaW5hbmRlciBkdXJjaC5cbiIsIDApOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmICghYWR2ZXJiICYmIHN0cikKKyAgICAgIFJldHVybigiS2xhdHNjaGUgd2llP1xuIik7CisgICAgb3V0X3NlbD0iRHUga2xhdHNjaHN0QEBhZHZlcmJAQCBpbiBkaWUgSGFlbmRlLiI7CisgICAgb3V0X290aD0iQEBuYW1lQEAga2xhdHNjaHRAQGFkdmVyYkBAIGluIGRpZSBIYWVuZGUuIjsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBLbG9wZmVuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJrbG9wZiI6CisgICAgSEVMUENIRUNLKCJrbG9wZiIpOworICAgIGlmICghc3RyfHxzc2NhbmYoc3RyLCIlcyBhdWYgc2NodWx0ZXIiLHNmb28pIT0xKQorICAgICAgaWYgKCFzdHJ8fHNzY2FuZihzdHIsIiVzIGF1ZiBkaWUgc2NodWx0ZXIiLHNmb28pIT0xKQorICAgICAgICBSZXR1cm4oIktsb3BmZSB3aWUgd2VtIHdpZXNvIHdhcz9cbiIpOworICAgIGlmIChnaG9zdCgpKQorICAgICAgUmV0dXJuKCJEYXMgZ2VodCBsZWlkZXIgbmljaHQgbWl0IGR1cmNobGFlc3NpZ2VuIEhhZW5kZW4uXG4iKTsKKyAgICBzdHI9c2ZvbzsKKyAgICBpZiAoc3RyPT0iIikgc3RyPTA7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKCF3aG8pCisgICAgICBSZXR1cm4oIktsb3BmZSB3ZW0gYXVmIGRpZSBTY2h1bHRlcj9cbiIpOworICAgIG91dF9zZWw9IkR1IGtsb3Bmc3QgQEB3ZW1AQEBAYWR2ZXJiQEAgYXVmIGRpZSBTY2h1bHRlci4iOworICAgIG91dF92aWM9IkBAbmFtZUBAIGtsb3BmdCBEaXJAQGFkdmVyYkBAIGF1ZiBkaWUgU2NodWx0ZXIuIjsKKyAgICBvdXRfb3RoPSJAQG5hbWVAQCBrbG9wZnQgQEB3ZW1AQEBAYWR2ZXJiQEAgYXVmIGRpZSBTY2h1bHRlci4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIEtuYWJiZXJuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJrbmFiYmVyIjoKKyAgICBIRUxQQ0hFQ0soImtuYWJiZXIiKTsKKyAgICBpZiAoZ2hvc3QoKSkKKyAgICAgIFJldHVybigiU29ycnksIGFiZXIgZGFmdWVyIGZlaGx0IERpciBpbSBNb21lbnQgZGVyIG5vZXRpZ2UgIgorICAgICAgICArIlwiQmlzc1wiLi4uXG4iKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoIXdobykKKyAgICAgIFJldHVybigiS25hYmJlcmUgd2VuIGFuP1xuIik7CisgICAgaWYgKENoZWNrTGlmZShOT1RfU0VMRixOT1RfREVBRCwKKyAgICAgICJEdSBrb21tc3QgbmljaHQgYW4gZGVpbiBlaWdlbmVzIE9ociByYW4uLi4iLAorICAgICAgIk5vZSwgbm9lLCBkYXMgc2NobWVja3QgYmVzdGltbXQgbmljaHQgZ3V0LiIpKQorICAgICAgICByZXR1cm4gMTsKKyAgICBvdXRfc2VsPSJEdSBrbmFiYmVyc3RAQGFkdmVyYkBAIGFuICIrd2hvLT5uYW1lKFdFU1NFTikrIiBPaHIuIjsKKyAgICBvdXRfdmljPSJAQG5hbWVAQCBrbmFiYmVydEBAYWR2ZXJiQEAgYW4gRGVpbmVtIE9oci4iOworICAgIG91dF9vdGg9IkBAbmFtZUBAIGtuYWJiZXJ0QEBhZHZlcmJAQCBhbiAiK3doby0+bmFtZShXRVNTRU4pKyIgT2hyLiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogS25pY2tzZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImtuaWNrcyI6CisgICAgSEVMUENIRUNLKCJrbmlja3MiKTsKKyAgICBHSE9TVENIRUNLKCJEdSBrbmlja3N0IGluIGRlciBNaXR0ZSBhYiwga3JpZWdzdCBEaWNoIGFiZXIgc2NobmVsbCB3aWVkZXIgIgorICAgICAgICArInp1c2FtbWVuLlxuIiwKKyAgICAgIGduYW1lKCkrIiBrbmljayhzKXQgaW4gZGVyIE1pdHRlIGFiLCBrcmllZ3Qgc2ljaCBhYmVyXG4iCisgICAgICAgICsienVtIEdsdWVjayBzY2huZWxsIHdpZWRlciB6dXNhbW1lbi5cbiIsIDApOworICAgIGlmICghc3RyKSB7CisgICAgICBvdXRfc2VsPSJEdSBtYWNoc3QgZWluZW4gYW5tdXRpZ2VuIEtuaWNrcy4iOworICAgICAgb3V0X290aD0iQEBuYW1lQEAgbWFjaHQgZWluZW4gYW5tdXRpZ2VuIEtuaWNrcy4iOworICAgIH0KKyAgICBlbHNlICB7CisgICAgICBQYXJzZVJlc3Qoc3RyLCJ2b3IiKTsKKyAgICAgIGlmIChmb3JfYWxsKSAgeworICAgICAgICBvdXRfc2VsPSJEdSBrbmlja3N0QEBhZHZlcmJAQCB2b3IgQEBhbGxlQEAuIjsKKyAgICAgICAgb3V0X3ZpYz0iQEBuYW1lQEAga25pY2tzdEBAYWR2ZXJiQEAgdm9yIEBAYWxsZUBALiI7CisgICAgICAgIHJldHVybiBNaXhlZE91dChXRU0pOworICAgICAgfQorICAgICAgaWYgKCF3aG8gJiYgIWFkdmVyYikKKyAgICAgICAgUmV0dXJuKCJLbmlja3NlIGlyZ2VuZHdpZSBvZGVyIHZvciBqZW1hbmRlbS5cbiIpOworICAgICAgaWYgKHdobyAmJiBDaGVja0xpZmUoTk9UX1NFTEYsTk9UX0RFQUQsCisgICAgICAgICJXaWUgd2lsbHN0IER1IGRhcyBkZW5uIHNjaGFmZmVuPyIsCisgICAgICAgICJWb3IgU2FjaGVuIHdpcmQgaGllciBuaWNodCBnZWtuaWNrc3QhIikpCisgICAgICAgICAgcmV0dXJuIDE7CisgICAgICBvdXRfc2VsPSJEdSBrbmlja3N0QEBhZHZlcmJAQCIrKHdobyA/ICIgdm9yIiA6ICIiKSsiQEAgd2VtQEAuIjsKKyAgICAgIGlmICh3aG8gKSBvdXRfdmljPSJAQG5hbWVAQCBrbmlja3N0QEBhZHZlcmJAQCB2b3IgRGlyLiI7CisgICAgICBvdXRfb3RoPSJAQG5hbWVAQCBrbmlja3N0QEBhZHZlcmJAQCIrKHdobyA/ICIgdm9yIiA6ICIiKSsiQEAgd2VtQEAuIjsKKyAgICB9CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogS25pcnNjaGVuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJrbmlyc2NoIjoKKyAgICBIRUxQQ0hFQ0soImtuaXJzY2giKTsKKyAgICBpZiAoZ2hvc3QoKSkKKyAgICAgIFJldHVybigiRHUga2FubnN0IG1pdCBuaWNodHMga25pcnNjaGVuLCBzbyBhbHMgR2Vpc3QuIFZlcnN1Y2hlIGRvY2ggIgorICAgICAgICArImRhZnVlclxubWFsLCB6dSByYXNzZWxuLi4uXG4iKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoc3RyICYmICFhZHZlcmIpCisgICAgICBSZXR1cm4oIktuaXJzY2hlIHdpZT9cbiIpOworICAgIHN3aXRjaCAoUXVlcnlQcm9wKFBfUkFDRSkpICB7CisgICAgICBjYXNlICJncmVpZiIgIDogc3RyMT0iZGVtIFNjaG5hYmVsLiI7IGJyZWFrOworICAgICAgY2FzZSAic2FuZHRpZ2VyIiA6IHN0cjE9ImRlbiBGYW5nemFlaG5lbi4iOyBicmVhazsKKyAgICAgIGNhc2UgImRyYWNoZSIgOiBzdHIxPSJkZW4gRmFuZ3phZWhuZW4uIjsgYnJlYWs7CisgICAgICBkZWZhdWx0ICAgICAgIDogc3RyMT0iZGVuIFphZWhuZW4uIjsKKyAgICB9CisgICAgb3V0X3NlbD0iRHUga25pcnNjaHN0QEBhZHZlcmJAQCBtaXQgIitzdHIxOworICAgIG91dF9vdGg9IkBAbmFtZUBAIGtuaXJzY2h0QEBhZHZlcmJAQCBtaXQgIitzdHIxOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIEtudWRkZWxuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJrbnVkZGVsIjoKKyAgICBjYXNlICJrbnVkZGwiOgorICAgIEhFTFBDSEVDSygia251ZGRlbCIpOworICAgIGlmIChnaG9zdCgpKQorICAgICAgUmV0dXJuKCJTb3JyeSwgbmljaHQgYWxzIEdlaXN0LlxuIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKGZvcl9hbGwpICB7CisgICAgICBvdXRfc2VsPSJEdSBrbnVkZGVsc3QgQEBhbGxlQEBAQGFkdmVyYkBALiI7CisgICAgICBvdXRfdmljPSJAQG5hbWVAQCBrbnVkZGVsdCBAQGFsbGVAQEBAYWR2ZXJiQEAuIjsKKyAgICAgIHJldHVybiBNaXhlZE91dChXRU4pOworICAgIH0KKyAgICBpZiAoIXdobykKKyAgICAgIFJldHVybigiS251ZGRsZSB3ZW4/XG4iKTsKKyAgICBpZiAoQ2hlY2tMaWZlKE5PVF9TRUxGLE5PVF9ERUFELAorICAgICAgIkRhcyBicmluZ3QgZG9jaCBuaXgsIGxhc3MgZXMgaGFsdC4iLAorICAgICAgIkR1IGthbm5zdCBzb3ZpZWwgaWNoIHdlaXNzIGF1c3NlciBMZWJld2VzZW4gbnVyIFRlZGR5cyBrbnVkZGVsbi4iKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgb3V0X3NlbD0iRHUga251ZGRlbHN0QEAgd2VuQEBAQGFkdmVyYkBALiI7CisgICAgb3V0X3ZpYz0iQEBuYW1lQEAga251ZGRlbHQgRGljaEBAYWR2ZXJiQEAuIjsKKyAgICBvdXRfb3RoPSJAQG5hbWVAQCBrbnVkZGVsdEBAIHdlbkBAQEBhZHZlcmJAQC4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIEtudXJyZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImtudXJyIjoKKyAgICBIRUxQQ0hFQ0soImtudXJyIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKGZvcl9hbGwpICB7CisgICAgICBvdXRfc2VsPSJEdSBrbnVycnN0IEBAYWxsZUBAQEBhZHZlcmJAQCBhbi4iOworICAgICAgb3V0X3ZpYz0iQEBnbmFtZUBAIGtudXJydCBAQGFsbGVAQEBAYWR2ZXJiQEAgYW4uIjsKKyAgICAgIHJldHVybiBNaXhlZE91dChXRU4pOworICAgIH0KKyAgICBpZiAoc3RyICYmICF3aG8gJiYgIWFkdmVyYikKKyAgICAgIFJldHVybigiV2VuIGFua251cnJlbiBvZGVyIHdpZSBrbnVycmVuP1xuIik7CisgICAgaWYgKHdobyAmJiBDaGVja0xpZmUoTk9UX1NFTEYsTk9UX0RFQUQsCisgICAgICAiRHUga251cnJzdCBpbiBEaWNoIGhpbmVpbi4iLAorICAgICAgIlJlYWdpZXJ0IG5pY2h0LiBTb2xsdGVzdCB3b2hsIGJlc3NlciBMZWJ3ZXNlbiBhbmtudXJyZW4uIikpCisgICAgICAgIHJldHVybiAxOworICAgIG91dF9zZWw9IkR1IGtudXJyc3RAQCB3ZW5AQEBAYWR2ZXJiQEAiKyh3aG8gPyAiIGFuLiIgOiAiLiIpOworICAgIGlmICh3aG8pIG91dF92aWM9IkBAZ25hbWVAQCBrbnVycnQgRGljaEBAYWR2ZXJiQEAgYW4uIjsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAga251cnJ0QEAgd2VuQEBAQGFkdmVyYkBAIisod2hvID8gIiBhbi4iIDogIi4iKTsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiAgS251dHNjaGVuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJrbnV0c2NoIjoKKyAgICBIRUxQQ0hFQ0soImtudXRzY2giKTsKKyAgICBpZiAoZ2hvc3QoKSkKKyAgICAgIFJldHVybigiRGFzIGthbm5zdCBEdSBhbHMgR2Vpc3QgbGVpZGVyIG5pY2h0LiBJcmdlbmR3aWUgZmVobHQgRGlyICIKKyAgICAgICAgKyJkYXp1IGRhcyBIZXJ6LlxuIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKCF3aG8pCisgICAgICBSZXR1cm4oIktudXRzY2hlIHdlbiBhYj9cbiIpOworICAgIGlmIChDaGVja0xpZmUoTk9UX1NFTEYsTk9UX0RFQUQsCisgICAgICAiRGFzIGdlaHQgbmljaHQuIiwKKyAgICAgICJJZ2l0dCEgTGllYmVyIG5pY2h0ISIpKQorICAgICAgICByZXR1cm4gMTsKKyAgICBvdXRfc2VsPSJEdSBnaWJzdCBAQHdlbUBAQEBhZHZlcmJAQCBlaW5lbiBSSUNIVElHRU4gS3Vzcy4iOworICAgIG91dF92aWM9IkBAbmFtZUBAIGdpYnQgRGlyQEBhZHZlcmJAQCBlaW5lbiB0aWVmZW4gdW5kIGhpbmdlYnVuZ3N2b2xsZW4gIgorICAgICAgKyJLdXNzLlxuRHUgc2Nod2Vic3QgaW0gNy4gSGltbWVsLiI7CisgICAgb3V0X290aD0iQEBuYW1lQEAgZ2lidCBAQHdlbUBAQEBhZHZlcmJAQCBlaW5lbiB0aWVmZW4gdW5kICIKKyAgICAgICsiaGluZ2VidW5nc3ZvbGxlbiBLdXNzLiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogS290emVuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJrb3R6IjoKKyAgICBIRUxQQ0hFQ0soImtvdHoiKTsKKyAgICBpZiAoZ2hvc3QoKSkKKyAgICAgIFJldHVybigiTmUsIGRhcyBpc3QgZWlucyB2b24gZGVuIFNhY2hlbiwgZGllIGFscyBHZWlzdCBuaWNodCBnZWhlbi5cbiIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmIChzdHIgJiYgIXdobyAmJiAhYWR2ZXJiKQorICAgICAgUmV0dXJuKCJLb3R6ZSB3aWU/IEtvdHplIGF1ZiB3ZW4/XG4iKTsKKyAgICBpZiAod2hvICYmIENoZWNrTGlmZShOT1RfU0VMRiwwLAorICAgICAgIklnaXR0LCBuZWluIGRhbmtlLiIpKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZighc3RyKSB7CisgICAgICBvdXRfc2VsPSJEdSBrb3R6dCB1ZWJlciBkZWluZSBTY2h1aGUuIjsKKyAgICAgIG91dF9vdGg9IkBAbmFtZUBAIHZlcmRyZWh0IGRpZSBBdWdlbiB1bmQga290enQuIjsKKyAgICB9CisgICAgZWxzZSAgeworICAgICAgb3V0X3NlbD0iRHUga290enRAQGFkdmVyYkBAIisod2hvID8gIiBhdWYgQEB3ZW5AQC4iIDogIi4iKTsKKyAgICAgIGlmICh3aG8pIG91dF92aWM9IkBAbmFtZUBAIGtvdHp0QEBhZHZlcmJAQCBhdWYgRGljaC4iOworICAgICAgb3V0X290aD0iQEBuYW1lQEAga290enRAQGFkdmVyYkBAIisod2hvID8gIiBhdWYgQEB3ZW5AQC4iIDogIi4iKTsKKyAgICB9CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogS3JhdHplbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAia3JhdHoiOgorICAgIEhFTFBDSEVDSygia3JhdHoiKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAod2hvICYmICh3aG8hPXRoaXNfcGxheWVyKCkpKQorICAgICAgUmV0dXJuKCJEYXMgbWFjaCBtYWwgc2Nob2VuIG51ciBtaXQgRGlyIHNlbGJlci5cbiIpOworICAgIGlmIChzdHIgJiYgIWFkdmVyYikKKyAgICAgIFJldHVybigiV2llIHdpbGxzdCBEdSBEaWNoIGtyYXR6ZW4/XG4iKTsKKyAgICBvdXRfc2VsPSJEdSBrcmF0enQgZGljaEBAYWR2ZXJiQEAgYW0gS29wcC4iOworICAgIG91dF9vdGg9IkBAZ25hbWVAQCBrcmF0enQgc2ljaEBAYWR2ZXJiQEAgYW0gS29wcC4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIEtyaWVjaGUgKioqKioqKioqKioqKioqLworICAgIGNhc2UgImtyaWVjaCI6CisgICAgSEVMUENIRUNLKCJrcmllY2giKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBvdXRfc2VsPSJEdSBrcmllY2hzdCIrKHdobyA/ICIgdm9yIEBAd2VtQEAiIDogIiIpKyJAQGFkdmVyYkBAIGltIFN0YXViLiI7CisgICAgaWYgKHdobykgb3V0X3ZpYz0iQEBnbmFtZUBAIGtyaWVjaHRAQGFkdmVyYkBAIHZvciBEaXIgaW0gU3RhdWIuIjsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAga3JpZWNodCIrKHdobyA/ICIgdm9yIEBAd2VtQEAiIDogIiIpCisgICAgICArIkBAYWR2ZXJiQEAgaW0gU3RhdWIuIjsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBLdWVzc2VuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJrdWVzcyI6CisgICAgSEVMUENIRUNLKCJrdWVzcyIpOworICAgIGlmIChnaG9zdCgpKQorICAgICAgUmV0dXJuKCJBbHMgR2Vpc3Qga2FubnN0IER1IGxlaWRlciBuaWVtYW5kZW4ga3Vlc3Nlbi5cbiIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmICghd2hvKQorICAgICAgUmV0dXJuKCJXZW4gd2lsbHN0IER1IGt1ZXNzZW4/XG4iKTsKKyAgICBpZiAoQ2hlY2tMaWZlKE5PVF9TRUxGLE5PVF9ERUFELAorICAgICAgIkRhIGhhc3QgRHUgYWJlciBTY2h3aWVyaWdrZWl0ZW4uLi4gRHUgZ2lic3QgZXMgc2NobGllc3NsaWNoIGF1Zi4iLAorICAgICAgIk5peC4gQWJzb2x1dCBuaXguIEt1ZXNzZSBsaWViZXIgTGViZXdlc2VuIC0gZGllIHJlYWdpZXJlblxuIgorICAgICAgICArIndlbmlnc3RlbnMgKHVuZCBzZWkgZXMsIGRhc3Mgc2llIERpY2ggZnJlc3Nlbi4uLikuIikpCisgICAgICAgIHJldHVybiAxOworICAgIG91dF9zZWw9IkR1IGt1ZXNzdEBAIHdlbkBAQEBhZHZlcmJAQC4iOworICAgIG91dF92aWM9IkBAbmFtZUBAIGt1ZXNzdCBEaWNoQEBhZHZlcmJAQC4iOworICAgIG91dF9vdGg9IkBAbmFtZUBAIGt1ZXNzdEBAIHdlbkBAQEBhZHZlcmJAQC4iOworICAgIEZlZWxJdCgpOworICAgIGlmICh3aG8tPlF1ZXJ5UHJvcChQX0ZST0cpJiZRdWVyeVByb3AoUF9MRVZFTCk+d2hvLT5RdWVyeVByb3AoUF9MRVZFTCkpIHsKKyAgICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKSwiUExPUFAhXG4iKTsKKyAgICAgIHdyaXRlKCJIdWNoISBEdSB3aXJzdCBhdWYgZWlubWFsIHNvIGdydWVuIHVuZCBrbGVpbiB1bmQga3JpZWdzdCBhdWZcbiIKKyAgICAgICAgKyJlaW5tYWwgZnVyY2h0YmFyIEh1bmdlciBhdWYgRmxpZWdlbiB1bmQgc28uLi5cbiIpOworICAgICAgd2hvLT5NZXNzYWdlKCJBdWYgZWlubWFsIHdpcmQgZGllIFdlbHQgdW0gRGljaCB3aWVkZXIgc28ga2xlaW4sIHdpZSBzaWVcbiIKKyAgICAgICAgKyIgZnJ1ZWhlciBtYWwgd2FyIC0gdW5kIHZvciBEaXIgc2l0enQgZWluIGtsZWluZXIgZ3J1ZW5lciBGcm9zY2guXG4iKTsKKyAgICAgIHNheSh3aG8tPm5hbWUoV0VSKSsiIHN0ZWh0IGF1ZiBlaW5tYWwgZGEgdW5kIHNjaGF1dCBkdW1tIGF1cyBkZXIgIgorICAgICAgICArIldhZXNjaGUuIERhZnVlciBmZWhsdFxuamV0enQgc2VsdHNhbWVyd2Vpc2UgIitjYXBuYW1lKCkKKyAgICAgICAgKyIuIERpZSBHZXNhbXR6YWhsIGFuIGtsZWluZW4gZ3J1ZW5lblxuRnJvZXNjaGVuIGltIFJhdW0gaGF0IHNpY2ggIgorICAgICAgICArImplZG9jaCBuaWNodCBnZWFlbmRlcnQuLi5cbiIsKHt3aG8sdGhpc19wbGF5ZXIoKX0pKTsKKyAgICAgIHdoby0+U2V0UHJvcChQX0ZST0csMCk7CisgICAgICBTZXRQcm9wKFBfRlJPRywxKTsKKyAgICB9CisgICAgcmV0dXJuIDE7CisKKyAgICAvKioqKioqKioqKioqKioqKiBLdXNjaGVsbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAia3VzY2hlbCI6CisgICAgY2FzZSAia3VzY2hsIjoKKyAgICBIRUxQQ0hFQ0soImt1c2NoZWwiKTsKKyAgICBHSE9TVENIRUNLKCJEYXp1IGJpc3QgRHUgYWxzIEdlaXN0IHZpZWwgenUga2FsdCB1bmQgZ2FyICIKKyAgICAgICAgKyJzY2hyb2Vja2xpY2ggYW56dXNlaGVuLlxuIiwKKyAgICAgIGduYW1lKCkrIiBzY2hlaW50IEFud2FuZGx1bmdlbiB6dSBoYWJlbiwgc2ljaCBhbiBqZW1hbmQgIgorICAgICAgICArImFua3VzY2hlbG4genUgd29sbGVuLlxuRW50c2V0enQgc3ByaW5nZW4gYWxsZSB6dXJ1ZWNrLCB3ZWlsICIKKyAgICAgICAgKyJkYXp1IGlzdCBlciBkb2NoIHp1IGthbHQgdW5kIHNjaHJvZWNrbGljaFxuYW56dXNlaGVuLlxuIiwgMCk7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKCF3aG8pCisgICAgICBSZXR1cm4oIkFuIHdlbiB3aWxsc3QgRHUgRGljaCBhbmt1c2NoZWxuP1xuIik7CisgICAgb3V0X3NlbD0iRHUga3VzY2hlbHN0IERpY2hAQGFkdmVyYkBAIGFuIEBAd2VuQEAgYW4uIjsKKyAgICBvdXRfdmljPSJAQG5hbWVAQCBrdXNjaGVsdCBzaWNoQEBhZHZlcmJAQCBhbiBEaWNoIGFuLiI7CisgICAgb3V0X290aD0iQEBuYW1lQEAga3VzY2hlbHQgc2ljaEBAYWR2ZXJiQEAgYW4gQEB3ZW5AQCBhbi4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIExhY2hlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAibGFjaCI6CisgICAgSEVMUENIRUNLKCJsYWNoIik7CisgICAgR0hPU1RDSEVDSygiRHUgbGFjaHN0IG1pdCBob2hsZXIgU3RpbW1lLiBEZW4gVW1zdGVoZW5kZW4gKHNpbmQgZG9jaCB3ZWxjaGUiCisgICAgICAgICsiIGRhLCBvZGVyPylcbmxhZXVmdCBlcyBrYWx0IGRlbiBSdWVja2VuIHJ1bnRlci5cbiIsCisgICAgICBnbmFtZSgpKyIgbGFjaHQgbWl0IGhvaGxlciBTdGltbWUuXG5EaXIgbGFldWZ0IGVzIGVpc2thbHQgZGVuIFJ1ZWNrZW4iCisgICAgICAgICsiIHJ1bnRlci5cbiIsIDApOworICAgIGlmICghc3RyKSAgeworICAgICAgb3V0X3NlbD0iRHUgYnJpY2hzdCB2b3IgTGFjaGVuIHp1c2FtbWVuLiI7CisgICAgICBvdXRfb3RoPSJAQG5hbWVAQCBicmljaHQgdm9yIExhY2hlbiB6dXNhbW1lbi4iOworICAgIH0KKyAgICBlbHNlICB7CisgICAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICAgIGlmIChmb3JfYWxsKSAgeworICAgICAgICBvdXRfc2VsPSJEdSBsYWNoc3RAQGFkdmVyYkBAIHVlYmVyIEBAYWxsZUBALiI7CisgICAgICAgIG91dF92aWM9IkBAbmFtZUBAIGxhY2h0QEBhZHZlcmJAQCB1ZWJlciBAQGFsbGVAQC4iOworICAgICAgICByZXR1cm4gTWl4ZWRPdXQoV0VOKTsKKyAgICAgIH0KKyAgICAgIGlmICghd2hvICYmICFhZHZlcmIpCisgICAgICAgIFJldHVybigiTGFjaGUgd2llLCBsYWNoZSB1ZWJlciB3ZW4/XG4iKTsKKyAgICAgIGlmICh3aG8gJiYgQ2hlY2tMaWZlKE5PVF9TRUxGLE5PVF9ERUFELAorICAgICAgICAiTGFjaCBEaWNoIGRvY2ggbmljaHQgc2VsYmVyIGF1cyAtIGRhcyBtYWNoZW4gc2Nob24gYW5kZXJlLi4uIiwKKyAgICAgICAgIkdlbGFjaHQgd2lyZCBudXIgdWViZXIgTGViZXdlc2VuIChkaWUga29lbm5lbiBzaWNoIGRydWViZXIgYWVyZ2VybikuIikpCisgICAgICAgICAgcmV0dXJuIDE7CisgICAgICBvdXRfc2VsPSJEdSBsYWNoc3RAQGFkdmVyYkBAIisod2hvPyIgdWViZXJAQCB3ZW5AQCI6IiIpKyIuIjsKKyAgICAgIGlmICh3aG8pIG91dF92aWM9IkBAbmFtZUBAIGxhY2h0QEBhZHZlcmJAQCB1ZWJlciBEaWNoLiI7CisgICAgICBvdXRfb3RoPSJAQG5hbWVAQCBsYWNodEBAYWR2ZXJiQEAiKyh3aG8/IiB1ZWJlckBAIHdlbkBAIjoiIikrIi4iOworICAgIH0KKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBMYWVjaGVsbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAibGFlY2hlbCI6CisgICAgY2FzZSAibGFlY2hsIjoKKyAgICBIRUxQQ0hFQ0soImxhZWNoZWwiKTsKKyAgICBpZiAoZ2hvc3QoKSkgeworICAgICAgd3JpdGUoIkR1IGxhZWNoZWxzdCBpbm5lcmxpY2guXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZighc3RyKSB7CisgICAgICBvdXRfc2VsPSJEdSBsYWVjaGVsc3QuIjsKKyAgICAgIG91dF9vdGg9IkBAbmFtZUBAIGxhZWNoZWx0LiI7CisgICAgfQorICAgIGVsc2UgIHsKKyAgICAgIFBhcnNlUmVzdChzdHIpOworICAgICAgaWYgKGZvcl9hbGwpICB7CisgICAgICAgIG91dF9zZWw9IkR1IGxhZWNoZWxzdCBAQGFsbGVAQEBAYWR2ZXJiQEAgYW4uIjsKKyAgICAgICAgb3V0X3ZpYz0iQEBuYW1lQEAgbGFlY2hlbHQgQEBhbGxlQEBAQGFkdmVyYkBAIGFuLiI7CisgICAgICAgIHJldHVybiBNaXhlZE91dChXRU4pOworICAgICAgfQorICAgICAgaWYgKCF3aG8gJiYgIWFkdmVyYiAmJiBzdHIpCisgICAgICAgIFJldHVybigiV2llIG9kZXIgd2VuP1xuIik7CisgICAgICBpZiAod2hvICYmIENoZWNrTGlmZShOT1RfU0VMRixOT1RfREVBRCwKKyAgICAgICAgIk11c3N0IHNjaG9uIGplbWFuZCBhbmRlcnMgYW5sYWVjaGVsbi4iLAorICAgICAgICAiQml0dGUgZWluIExlYmV3ZXNlbiBhbmxhZWNoZWxuLiIpKQorICAgICAgICAgIHJldHVybiAxOworICAgICAgb3V0X3NlbD0iRHUgbGFlY2hlbHN0QEAgd2VuQEBAQGFkdmVyYkBAIisod2hvID8gIiBhbi4iIDogIi4iKTsKKyAgICAgIGlmICh3aG8pIG91dF92aWM9IkBAbmFtZUBAIGxhZWNoZWx0IERpY2hAQGFkdmVyYkBAIGFuLiI7CisgICAgICBvdXRfb3RoPSJAQG5hbWVAQCBsYWVjaGVsdEBAIHdlbkBAQEBhZHZlcmJAQCIrKHdobyA/ICIgYW4uIiA6ICIuIik7CisgICAgfQorICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIExpZWJlICoqKioqKioqKioqKioqKi8KKyAgICAvKiBUaGVzZSBsaW5lcyBhcHBlYXIgQ291cnRlc3kgb2YgQW5ndXNATW9yZ2VuR3JhdWVuLiBTbyBsb25nLCBhbmQgdGhhbmtzICovCisgICAgLyogZm9yIGFsbCB0aGUgZmlzaCwgZXJyciwgdGV4dCwgQW5ndXMgOikgKi8KKyAgICBjYXNlICJsaWViIjoKKyAgICBIRUxQQ0hFQ0soImxpZWIiKTsKKyAgICBpZiAoZ2hvc3QoKSkKKyAgICAgIFJldHVybigiQXVmIGRpZXNlIEZyZXVkZW4gbXVzc3QgRHUgYWxzIEdlaXN0IGxlaWRlciB2ZXJ6aWNodGVuLlxuIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKCF3aG8pCisgICAgICBSZXR1cm4oIldlbiBoYXN0IER1IGxpZWI/XG4iKTsKKyAgICBpZiAoQ2hlY2tMaWZlKE5PVF9TRUxGLE5PVF9ERUFELAorICAgICAgIkphLCBpY2ggd2Vpc3MsIER1IG1hZ3N0IERpY2gsIGFiZXIgZGFzIG11c3N0IER1IG5pY2h0IHp1ciBTY2hhdSIKKyAgICAgICAgKyJzdGVsbGVuLiIsCisgICAgICAiRHUgZW50d2lja2Vsc3Qgc2VsdHNhbWUgTmVpZ3VuZ2VuLCBmaW5kZSBpY2guIikpCisgICAgICAgIHJldHVybiAxOworICAgIHN0cjE9KHdoby0+UXVlcnlQcm9wKFBfR0VOREVSKT09RkVNQUxFID8gImlociIgOiAiaWhtIik7CisgICAgLyogb2xkIHZlcnNpb246CisgICAgICBvdXRfc2VsPSJEdSBmbHVlc3RlcnN0IEBAd2VtQEBAQGFkdmVyYkBAIGxpZWJldm9sbGUgV29ydGUgaW5zIE9oci4iOworICAgICAgb3V0X3ZpYz1nbmFtZSgpKyIgZmx1ZXN0ZXJ0IERpckBAYWR2ZXJiQEAgbGllYmV2b2xsZSBXb3J0ZSBpbnMgT2hyLiI7CisgICAgICBvdXRfb3RoPWduYW1lKCkrIiBmbHVlc3RlcnRAQGFkdmVyYkBAIHNhbmZ0ZSBXb3J0ZSB6dSBAQHdlbUBALiI7CisgICAgKi8KKyAgICBvdXRfc2VsPSJEdSBzY2hsaWVzc3QgZGllIEF1Z2VuLCBzY2htaWVnc3QgRGljaCBlbmcgYW4gQEB3ZW5AQCB1bmQgZ2lic3QiCisgICAgICArTEYrc3RyMSsiIGVpbmVuIHphZXJ0bGljaGVuIHVuZCBsZWlkZW5zY2hhZnRsaWNoZW4gS3Vzcy5cbiIKKyAgICAgICsiVW0gRGljaCBoZXJ1bSB2ZXJzaW5rdCBkaWUgV2VsdCB1bmQgRHUgZ2xhdWJzdCwgYXVmIFdvbGtlbiB6dSAiCisgICAgICArInNjaHdlYmVuLiI7CisgICAgb3V0X3ZpYz0iQEBuYW1lQEAgZHJ1ZWNrdCBEaWNoIHphZXJ0bGljaCBhbiBzaWNoIHVuZCBnaWJ0IERpclxuIgorICAgICAgKyJlaW5lbiB6YWVydGxpY2hlbiB1bmQgbGVpZGVuc2NoYWZ0bGljaGVuIEt1c3MuIER1IHNjaGxpZXNzdCBkaWVcbiIKKyAgICAgICsiQXVnZW4gdW5kIHRyYWV1bXN0IGVpbiB3ZW5pZy4uLi4uLkR1IHNjaHdlYnN0IGF1ZiBXb2xrZW4gZGlyZWt0XG4iCisgICAgICArImluIGRlbiBzaWVidGVuIEhpbW1lbC4iOworICAgIG91dF9vdGg9IkR1IHNjaGF1c3QgZGV6ZW50IHdlZywgYWxzIHNpY2ggQEBuYW1lQEAgdW5kICIrd2hvLT5uYW1lKCkKKyAgICAgICsiIHZlcmxpZWJ0IGluIGRpZSBBcm1lXG5zaW5rZW4uIjsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBMb2JlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAibG9iIjoKKyAgICBIRUxQQ0hFQ0soImxvYiIpOworICAgIGlmICghc3RyKQorICAgICAgUmV0dXJuKCJXZW4gb2RlciB3YXMgd2lsbHN0IER1IGxvYmVuP1xuIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKHdobz09TUUpICB7CisgICAgICBvZm9vPWNsb25lX29iamVjdCgiL2l0ZW1zL2Z1cnoiKTsKKyAgICAgIG9mb28tPnNldF9mdXJ6ZXIodGhpc19wbGF5ZXIoKSk7CisgICAgICBvZm9vLT5zZXRfZWlnZW5sb2IoKTsKKyAgICAgIG9mb28tPm1vdmUoZW52aXJvbm1lbnQodGhpc19wbGF5ZXIoKSkpOworICAgICAgLy9ERUJVRyBGdXJ6IHp1bSBFaWdlbmxvYiBwYXRjaGVuIDo+CisgICAgICBvdXRfc2VsPSJEdSBsb2JzdCBEaWNoIHNlbGJlckBAYWR2ZXJiQEAuIERpZSBGb2xnZW4ga2VubnN0IER1IGphLi4uIjsKKyAgICAgIG91dF9vdGg9IkBAZ25hbWVAQCBsb2J0IHNpY2ggc2VsYmVyQEBhZHZlcmJAQCwgbWl0IGRlbiBiZWthbm50ZW4gRm9sZ2VuLiI7CisgICAgfSBlbHNlIGlmICh3aG8pIHsKKyAgICAgIG91dF9zZWw9IkR1IGxvYnN0IEBAd2VuQEBAQGFkdmVyYkBALiI7CisgICAgICBvdXRfdmljPSJAQGduYW1lQEAgbG9idCBEaWNoQEBhZHZlcmJAQC4iOworICAgICAgb3V0X290aD0iQEBnbmFtZUBAIGxvYnQgQEB3ZW5AQEBAYWR2ZXJiQEAuIjsKKyAgICB9IGVsc2UgIHsKKyAgICAgIG91dF9zZWw9IkR1IGxvYnN0ICIrc3RyKyIuIjsKKyAgICAgIG91dF9vdGg9IkBAZ25hbWVAQCBsb2J0ICIrc3RyKyIuIjsKKyAgICB9CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogTW9wcGVybiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAibW9wcGVyIjoKKyAgICBIRUxQQ0hFQ0soIm1vcHBlciIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmIChzdHIgJiYgIWFkdmVyYikKKyAgICAgIFJldHVybigiTW9wcGVyZSB3aWU/XG4iKTsKKyAgICBvdXRfc2VsPSJEdSBtb3BwZXJzdEBAYWR2ZXJiQEAuIjsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAgbW9wcGVydEBAYWR2ZXJiQEAuIjsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBNdXN0ZXJuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJtdXN0ZXIiOgorICAgIEhFTFBDSEVDSygibXVzdGVyIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKCF3aG8pCisgICAgICBSZXR1cm4oIk11c3RlcmUgd2VuP1xuIik7CisgICAgb3V0X3NlbD0iRHUgbXVzdGVyc3QgQEB3ZW5AQEBAYWR2ZXJiQEAuIjsKKyAgICBvdXRfdmljPSJAQGduYW1lQEAgbXVzdGVydCBEaWNoQEBhZHZlcmJAQC4iOworICAgIG91dF9vdGg9IkBAZ25hbWVAQCBtdXN0ZXJ0IEBAd2VuQEBAQGFkdmVyYkBALiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogTmlja2VuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJqYSI6CisgICAgY2FzZSAibmljayI6CisgICAgSEVMUENIRUNLKCJuaWNrIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKGZvcl9hbGwpICB7CisgICAgICBvdXRfc2VsPSJEdSBuaWNrc3QgQEBhbGxlQEBAQGFkdmVyYkBAIHp1LiI7CisgICAgICBvdXRfdmljPSJAQGduYW1lQEAgbmlja3QgQEBhbGxlQEBAQGFkdmVyYkBAIHp1LiI7CisgICAgICByZXR1cm4gTWl4ZWRPdXQoV0VNKTsKKyAgICB9CisgICAgaWYgKHN0ciAmJiAhd2hvICYmICFhZHZlcmIpCisgICAgICBSZXR1cm4oIk5pY2tlIHdpZSBvZGVyIHdlbSB6dSBvZGVyIHdlbSB3aWUgenU/XG4iKTsKKyAgICBpZiAod2hvICYmIENoZWNrTGlmZShOT1RfU0VMRixOT1RfREVBRCwKKyAgICAgICJEdSB3aWxsc3QgRGlyIHNlbGJlciB6dW5pY2tlbj8gTGllYmVyIG5pY2h0LCBkYXMgc2llaHQgc28gYWxiZXJuIGF1cy4iLAorICAgICAgIkhtLiBOaXggcGFzc2llcnQuIFZvbiBMZWJld2VzZW4gYmVrb21tdCBtYW4gbWVpc3RlbnMgbWVociBGZWVkYmFjay4iKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgb3V0X3NlbD0iRHUgbmlja3N0QEAgd2VtQEBAQGFkdmVyYkBAIgorICAgICAgKyh3aG8gPyAiIHp1LiIgOiAoYWR2ZXJiID8gIi4iIDogIiB6dXN0aW1tZW5kLiIpKTsKKyAgICBpZiAod2hvKSBvdXRfdmljPSJAQGduYW1lQEAgbmlja3QgRGlyQEBhZHZlcmJAQCB6dS4iOworICAgIG91dF9vdGg9IkBAZ25hbWVAQCBuaWNrdEBAIHdlbUBAQEBhZHZlcmJAQCIKKyAgICAgICsod2hvID8gIiB6dS4iIDogKGFkdmVyYiA/ICIuIiA6ICIgenVzdGltbWVuZC4iKSk7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogTmllc2VuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJuaWVzIjoKKyAgICBIRUxQQ0hFQ0soIm5pZXMiKTsKKyAgICBpZiAoZ2hvc3QoKSkKKyAgICAgIFJldHVybigiRHUgaGFzdCBrZWluZSBOYXNlIG1laHIsIGluIGRlciBlcyBEaWNoIGp1Y2tlbiBrb2VubnRlLi4uXG4iKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoc3RyICYmICFhZHZlcmIpCisgICAgICBSZXR1cm4oIk5pZXNlIHdpZT9cbiIpOworICAgIG91dF9zZWw9IkhhYWFhYWEtdHNjaGkhIEdlc3VuZGhlaXQhIisoYWR2ZXJiID8gIiBEdSBuaWVzdEBAYWR2ZXJiQEAuIiA6ICIiKTsKKyAgICBvdXRfb3RoPSJIYWFhYWFhLXRzY2hpISBAQG5hbWVAQCBuaWVzdEBAYWR2ZXJiQEAuIjsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBPaHJmZWlnZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImdpYiI6CisgICAgSEVMUENIRUNLKCJnaWIiKTsKKyAgICBpZiAoIXN0cikKKyAgICAgIFJldHVybigiR2liIHdlbSB3YXM/XG4iKTsKKyAgICBpZiAoc3NjYW5mKCBzdHIsIiVzIG9ocmZlaWdlIixzdHIxKT09MCkKKyAgICAgIHJldHVybiAwOworICAgIFBhcnNlUmVzdChzdHIsICh7Im9ocmZlaWdlIiwgImVpbmUgb2hyZmVpZ2UifSkpOworICAgIGlmIChmb3JfYWxsKSAgeworICAgICAgb3V0X3NlbD0iRHUgdmVycGFzc3QgQEBhbGxlQEBAQGFkdmVyYkBAIGVpbmUgT2hyZmVpZ2UuIjsKKyAgICAgIG91dF92aWM9IkBAbmFtZUBAIHZlcnBhc3N0IEBAYWxsZUBAQEBhZHZlcmJAQCBlaW5lIE9ocmZlaWdlLiI7CisgICAgICByZXR1cm4gTWl4ZWRPdXQoV0VNKTsKKyAgICB9CisgICAgaWYgKCF3aG8pCisgICAgICBSZXR1cm4oIkdpYiB3ZW0gZWluZSBPaHJmZWlnZT9cbiIpOworICAgIGlmIChDaGVja0xpZmUoTk9UX1NFTEYsTk9UX0RFQUQsCisgICAgICAiRGF6dSBzaW5kIERpciBEZWluZSBCYWNrZW4gZG9jaCB6dSBzY2hhZGUuIiwKKyAgICAgICJEdSB3aXJzdCBkb2NoIG5pY2h0cyBzY2hsYWdlbiwgd2FzIHNpY2ggbmljaHQgd2VocmVuIGthbm4/IikpCisgICAgICAgIHJldHVybiAxOworICAgIEdIT1NUQ0hFQ0soIkRlaW5lIEhhbmQgc2F1c3QgbWl0IHZvbGxlciBXdWNodCBkdXJjaCBkZWluIE9wZmVyIGR1cmNoISIsCisgICAgICBnbmFtZSgpKyIgd2lsbCAiK3doby0+bmFtZShXRU0pKyIgZWluZSBPaHJmZWlnZSBnZWJlbiAtIGFiZXIgZGllIEhhbmRcbiIKKyAgICAgICAgKyJzYXVzdCBtaXQgdm9sbGVyIFd1Y2h0IGR1cmNoIGRhcyBPcGZlciBkdXJjaCEiLCAwKTsKKyAgICBvdXRfc2VsPSJEdSB2ZXJwYXNzdCBAQHdlbUBAQEBhZHZlcmJAQCBlaW5lIHNjaGFsbGVuZGUgT2hyZmVpZ2UuIjsKKyAgICBvdXRfdmljPSJAQG5hbWVAQCB2ZXJwYXNzdCBEaXJAQGFkdmVyYkBAIGVpbmUgV2F0c2NoZSwgZGFzcyBEaXIgSG9lcmVuICIKKyAgICAgICsidW5kIFNlaGVuIHZlcmdlaHQuIjsKKyAgICBvdXRfb3RoPSJAQG5hbWVAQCB2ZXJwYXNzdCBAQHdlbUBAQEBhZHZlcmJAQCBlaW5lIHNjaGFsbGVuZGUgT2hyZmVpZ2UuIjsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBQZmVpZmVuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJwZmVpZiI6CisgICAgSEVMUENIRUNLKCJwZmVpZiIpOworICAgIEdIT1NUQ0hFQ0soIkVzIGtvbW10IGxlaWRlciBudXIgKG5pY2h0IG1hbCBoZWlzc2UpIEx1ZnQsIGFiZXIga2VpbiAiCisgICAgICAgICsiUGZpZmYuXG4iLAorICAgICAgZ25hbWUoKSsiIHNwaXR6dCBkZW4gTXVuZCB1bmQgcHVzdGV0IGFuZ2VzdHJlbmd0LiBOaWNodHMgcGFzc2llcnQuXG4iLCAwKTsKKyAgICBQYXJzZVJlc3Qoc3RyLCAibmFjaCIpOworICAgIGlmIChzdHIgJiYgIXdobyAmJiAhYWR2ZXJiKQorICAgICAgUmV0dXJuKCJQZmVpZmUgd2llPyBQZmVpZmUgd2VtIG5hY2g/IEhhZWg/XG4iKTsKKyAgICBpZiAod2hvICYmIENoZWNrTGlmZShOT1RfU0VMRixOT1RfREVBRCwKKyAgICAgICJXYXMgd2lsbHN0IER1IGRlbm4gZGFtaXQgYXVzZHJ1ZWNrZW4/IERhcyBnaWJ0IGZ1ZXIgbWljaCBrZWluZW4gU2lubi4iLAorICAgICAgIkljaCBoYWJlIGtlaW5lIEx1c3QgZGF6dS4iKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgb3V0X3NlbD0iRHUgcGZlaWZzdEBAIHdlbkBAQEBhZHZlcmJAQCIKKyAgICAgICsod2hvID8gIiBuYWNoLiIgOiAoYWR2ZXJiID8gIi4iIDogIiBhbmVya2VubmVuZC4iKSk7CisgICAgaWYgKHdobykgb3V0X3ZpYz0iQEBuYW1lQEAgcGZlaWZ0IERpckBAYWR2ZXJiQEAgbmFjaC4iOworICAgIG91dF9vdGg9IkBAbmFtZUBAIHBmZWlmdEBAIHdlbkBAQEBhZHZlcmJAQCIKKyAgICAgICsod2hvID8gIiBuYWNoLiIgOiAoYWR2ZXJiID8gIi4iIDoiIGFuZXJrZW5uZW5kLiIpKTsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBQaGlsb3NvcGhpZXJlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAicGhpbG9zb3BoaWVyIjoKKyAgICBIRUxQQ0hFQ0soInBoaWxvc29waGllciIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIG91dF9zZWw9IkR1IHBoaWxvc29waGllcnN0IisoYWR2ZXJiID8gIkBAYWR2ZXJiQEAuIiA6CisgICAgICAoc3RyID8gIiB1ZWJlciAiK3N0cisiLiIgOiAiLiIpKTsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAgcGhpbG9zb3BoaWVydCIrKGFkdmVyYiA/ICJAQGFkdmVyYkBALiIgOgorICAgICAgKHN0ciA/ICIgdWViZXIgIitzdHIrIi4iIDogIi4iKSk7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogKE5hc2UpIFB1dHplbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAicHV0eiI6CisgICAgSEVMUENIRUNLKCJwdXR6Iik7CisgICAgaWYgKGdob3N0KCkpCisgICAgICBSZXR1cm4oIk5peCBkYSB6dW0gUHV0emVuLCBzbyBuZWJ1bG9lcywgd2llIER1IGJpc3QuXG4iKTsKKyAgICBQYXJzZVJlc3Qoc3RyLCAoeyJuYXNlIiwgImRpZSBuYXNlIn0pKTsKKyAgICBpZiAoc3RyICYmIHN0ciE9Im5hc2UiICYmICFhZHZlcmIpCisgICAgICBSZXR1cm4oIlB1dHplIERlaW5lIE5hc2Ugd2llP1xuIik7CisgICAgb3V0X3NlbD0iRHUgcHV0enQgRGVpbmUgTmFzZUBAYWR2ZXJiQEAuIjsKKyAgICBvdXRfb3RoPSJAQG5hbWVAQCBwdXR6dEBAYWR2ZXJiQEAgIitRUFAoRkVNQUxFLFdFTikrIiBOYXNlLiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogUXVha2VuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJxdWFrIjoKKyAgICBIRUxQQ0hFQ0soInF1YWsiKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoc3RyICYmICFhZHZlcmIpCisgICAgICBSZXR1cm4oIlF1YWtlIHdpZT9cbiIpOworICAgIHNmb289IiI7CisgICAgZmxhZz1RdWVyeVByb3AoUF9GUk9HKSYmIWdob3N0KCk7CisgICAgZm9yICh0X2c9MDsgdF9nPD1yYW5kb20oZmxhZyA/IDQgOiAyKTsgdF9nKyspICB7CisgICAgICBzZm9vKz0oZmxhZyA/ICIgUXUiIDogIiBrdyIpOworICAgICAgZm9yICh0X249MDsgdF9uPD1yYW5kb20oZmxhZyA/IDEwIDogNSk7IHRfbisrKQorICAgICAgICBzZm9vKz0iYUEiW3JhbmRvbSgxKS4ucmFuZG9tKDEpXTsKKyAgICAgIHNmb28rPSJrIjsKKyAgICB9CisgICAgaWYgKCFmbGFnKQorICAgICAgc2Zvbz1sb3dlcl9jYXNlKHNmb28pOworICAgIGVsc2UKKyAgICAgIHNmb28rPSIhIjsKKyAgICBvdXRfc2VsPSJEdSBxdWFrc3QiKyhhZHZlcmIgPyAiQEBhZHZlcmJAQCIgOiAoZmxhZyA/ICIgYXVzIHZvbGxlciBLZWhsZSIKKyAgICAgIDogIiBpbiBldHdhIHdpZSBlaW4gRnJvc2NoIikpKyI6IitzZm9vOworICAgIG91dF9vdGg9IkBAZ25hbWVAQCBxdWFrdCIrKGFkdmVyYiA/ICJAQGFkdmVyYkBAIiA6IChmbGFnID8gIiBhdXMgdm9sbGVyIEtlaGxlIgorICAgICAgOiAiIGluIGV0d2Egd2llIGVpbiBGcm9zY2giKSkrIjoiK3Nmb287CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogUXVpZXRzY2hlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAicXVpZXRzY2giOgorICAgIGNhc2UgInF1aWVrIjoKKyAgICBIRUxQQ0hFQ0soInF1aWVrIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKHN0ciAmJiAhYWR2ZXJiKQorICAgICAgUmV0dXJuKCJRdWlldHNjaGUgd2llP1xuIik7CisgICAgb3V0X3NlbD0iRHUgcXVpZXRzY2hzdCIrKGFkdmVyYiA/ICJAQGFkdmVyYkBALiIgOiAiIHZlcmdudWVndC4iKTsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAgcXVpZXRzY2h0IisoYWR2ZXJiID8gIkBAYWR2ZXJiQEAuIiA6ICIgdmVyZ251ZWd0LiIpOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIFJhZXVzcGVybiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAicmFldXNwZXIiOgorICAgIEhFTFBDSEVDSygicmFldXNwZXIiKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoc3RyICYmICFhZHZlcmIpCisgICAgICBSZXR1cm4oIkhtPyBXaWUgbWVpbmVuP1xuIik7CisgICAgb3V0X3NlbD0iRHUgcmFldXNwZXJzdCBEaWNoQEBhZHZlcmJAQC4iOworICAgIG91dF9vdGg9IkBAZ25hbWVAQCByYWV1c3BlcnQgc2ljaEBAYWR2ZXJiQEAuIjsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBSZWliZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgInJlaWIiOgorICAgIEhFTFBDSEVDSygicmVpYiIpOworICAgIGlmIChnaG9zdCgpKQorICAgICAgUmV0dXJuKCJEdSBoYXN0IG5pY2h0cyB6dW0gUmVpYmVuLCBhYmVyIGF1Y2ggZ2FyIG5pY2h0cy5cbiIpOworICAgIGlmIChzdHIgJiYgKHNzY2FuZihzdHIsIiVzIGRpZSBBdWdlbiIsc2Zvbyk9PTEgfHwgc3NjYW5mKHN0ciwiJXMgQXVnZW4iLHNmb28pPT0xKSkKKyAgICAgIHN0cj1zZm9vOworICAgIGVsc2UgaWYgKHN0ciAmJiAoc3NjYW5mKHN0ciwiJXMgZGllIEhhZW5kZSIsc2Zvbyk9PTEKKyAgICB8fHNzY2FuZihzdHIsIiVzIEhhZW5kZSIsc2Zvbyk9PTEpKSAgeworICAgICAgZmxhZz0yOworICAgICAgc3RyPXNmb287CisgICAgfQorICAgIGlmIChzdHI9PSIiKSBzdHI9MDsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoc3RyICYmICFhZHZlcmIpCisgICAgICBSZXR1cm4oIlJlaWJlIHdpZSBkaWUgIisoZmxhZz09MiA/ICJIYWVuZGUiIDogIkF1Z2VuIikrIj9cbiIpOworICAgIG91dF9zZWw9IkR1IHJlaWJzdCBEaXIiKyhhZHZlcmIgPyAiQEBhZHZlcmJAQCIKKyAgICAgIDogKGZsYWc9PTIgPyAiIHZlcmdudWVndCIgOiAiIG11ZWRlIikpKyIgZGllICIKKyAgICAgICsoZmxhZz09MiA/ICJIYWVuZGUuIiA6ICJBdWdlbi4iKTsKKyAgICBvdXRfb3RoPSJAQG5hbWVAQCByZWlidCBzaWNoIisoYWR2ZXJiID8gIkBAYWR2ZXJiQEAiCisgICAgICA6IChmbGFnPT0yID8gIiB2ZXJnbnVlZ3QiIDogIiBtdWVkZSIpKSsiIGRpZSAiCisgICAgICArKGZsYWc9PTIgPyAiSGFlbmRlLiIgOiAiQXVnZW4uIik7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogUm90ZmxuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJyb3RmbCI6CisgICAgSEVMUENIRUNLKCJyb3RmbCIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmIChzdHIgJiYgIWFkdmVyYikKKyAgICAgIFJldHVybigiUm90Zmwgd2llP1xuIik7CisgICAgb3V0X3NlbD0iRHUgcm90ZmxzdEBAYWR2ZXJiQEAuIjsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAgcm90Zmx0QEBhZHZlcmJAQC4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIFJ1ZWxwc2VuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJydWVscHMiOgorICAgIEhFTFBDSEVDSygicnVlbHBzIik7CisgICAgR0hPU1RDSEVDSygiRWluIGxlaWNodGVyIFdpbmRoYXVjaCBlbnRmYWVocnQgRGVpbmVtIE11bmQsIG1laHIgbmljaHQuXG4iLAorICAgICAgIkRlbSBNdW5kIGRlcyBHZWlzdGVzIHZvbiAiK2NhcG5hbWUoKQorICAgICAgICArIiBlbnRmYWVocnQgZWluIGxlaWNodGVzIEx1ZWZ0Y2hlbi5cbiIsIDApOworICAgIGlmICghc3RyKSAgeworICAgICAgb3V0X3NlbD0iQk9PT09FRUVSUlJSUFAhICBFbnRzY2h1bGRpZ2UgZGljaCBnZWZhZWxsaWdzdCEiOworICAgICAgb3V0X290aD0iQEBuYW1lQEAgcnVlbHBzdCB1bmFuc3RhZW5kaWcuIjsKKyAgICB9CisgICAgZWxzZSAgeworICAgICAgUGFyc2VSZXN0KHN0cik7CisgICAgICBpZiAoIWFkdmVyYikgIHsKKyAgICAgICAgd3JpdGUoIlJ1ZWxwc2Ugd2llIChzY2hsaW1tIGdlbnVnLCBkYXNzIER1IERpY2ggbmljaHQgYmVoZXJyc2NoZW4gIgorICAgICAgICAgICsia2FubnN0ISk/XG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgICBvdXRfc2VsPSJEdSBydWVscHN0QEBhZHZlcmJAQC4gU2NoYWVtIERpY2ghIjsKKyAgICAgIG91dF9vdGg9IkBAbmFtZUBAIHJ1ZWxwc3RAQGFkdmVyYkBAIHVuZCB3aXJkIG5pY2h0IG1hbCByb3QgZGFiZWkuIjsKKyAgICB9CisgICAgcmV0dXJuIEZlZWxJdCgpOworICB9CisKKyAgc3dpdGNoICh2YikgIHsKKyAgICAvKioqKioqKioqKioqKioqKiBSdW56ZWxuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJydW56ZWwiOgorICAgIGNhc2UgInJ1bnpsIjoKKyAgICBIRUxQQ0hFQ0soInJ1bnplbCIpOworICAgIGlmIChnaG9zdCgpKQorICAgICAgUmV0dXJuKCJEQVMgZ2VodCBhbHMgR2Vpc3QgbnVuIHdpcmtsaWNoIG5pY2h0LlxuIik7CisgICAgUGFyc2VSZXN0KHN0ciwic3Rpcm4iKTsKKyAgICBpZiAoc3RyICYmICFhZHZlcmIpCisgICAgICBSZXR1cm4oIlJ1bnpsZSBkaWUgU3Rpcm4gd2llP1xuIik7CisgICAgb3V0X3NlbD0iRHUgcnVuemVsc3RAQGFkdmVyYkBAIGRpZSBTdGlybi4iOworICAgIG91dF9vdGg9IkBAbmFtZUBAIHJ1bnplbHRAQGFkdmVyYkBAIGRpZSBTdGlybi4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIFNhYmJlcmUgKioqKioqKioqKioqKioqLworICAgIGNhc2UgInNhYmJlciI6CisgICAgSEVMUENIRUNLKCJzYWJiZXIiKTsKKyAgICBzZm9vPWdob3N0KCkgPyAic2NobGVpbSIgOiAic2FiYmVyIjsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoc3RyICYmICFhZHZlcmIgJiYgIXdobykKKyAgICAgIFJldHVybigiU2FiYmVyIHdpZSBvZGVyIHdlbiBhbj9cbiIpOworICAgIG91dF9zZWw9IkR1ICIrc2Zvbysic3RAQCB3ZW5AQEBAYWR2ZXJiQEAgIgorICAgICAgKyh3aG8gPyAiYW4uIiA6ICJhdWYgZGVuIEJvZGVuLiIpOworICAgIGlmICh3aG8pIG91dF92aWM9IkBAZ25hbWVAQCAiK3Nmb28rInQgRGljaEBAYWR2ZXJiQEAgYW4uIjsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAgIitzZm9vKyJ0QEAgd2VuQEBAQGFkdmVyYkBAICIKKyAgICAgICsod2hvID8gImFuLiIgOiAiYXVmIGRlbiBCb2Rlbi4iKTsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBTY2hhZW1lbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAic2NoYWVtIjoKKyAgICBIRUxQQ0hFQ0soInNjaGFlbSIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmIChzdHIgJiYgIWFkdmVyYiAmJiBsb3dlcl9jYXNlKHN0cikhPSJkaWNoIikKKyAgICAgIFJldHVybigiU2NoYWVtZSBEaWNoIHdpZT9cbiIpOworICAgIG91dF9zZWw9IkR1IHNjaGFlbXN0IERpY2hAQGFkdmVyYkBALiI7CisgICAgb3V0X290aD0iQEBnbmFtZUBAIHNjaGFlbXQgc2ljaEBAYWR2ZXJiQEAuIjsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyNpZmRlZiBTQ0hBVV9BTgorICAgIC8qKioqKioqKioqKioqKioqIFNjaGF1IGFuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJzY2hhdSI6CisgICAgSEVMUENIRUNLKCJzY2hhdSIpOworICAgIGlmICghc3RyIHx8IG9sZF9leHBsb2RlKHN0ciwgIiAiKVtzaXplb2Yob2xkX2V4cGxvZGUoc3RyLCAiICIpKV0hPSJhbiIpCisgICAgICByZXR1cm4gMDsKKyAgICBQYXJzZVJlc3Qoc3RyLCAiYW4iKTsKKyAgICBpZiAoIXdobykKKyAgICAgIFJldHVybigiU2NoYXUgd2VuIGFuP1xuIik7CisgICAgb3V0X3NlbD0iRHUgc2NoYXVzdCBAQHdlbkBAQEBhZHZlcmJAQCBhbi4iOworICAgIG91dF92aWM9IkBAZ25hbWVAQCBzY2hhdXQgRGljaEBAYWR2ZXJiQEAgYW4uIjsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAgc2NoYXV0IEBAd2VuQEBAQGFkdmVyYkBAIGFuLiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworI2VuZGlmCisKKyAgICAvKioqKioqKioqKioqKioqKiBTY2hsdWNoemVuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJzY2hsdWNoeiI6CisgICAgSEVMUENIRUNLKCJzY2hsdWNoeiIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmIChzdHIgJiYgIWFkdmVyYikKKyAgICAgIFJldHVybigiU2NobHVjaHplIHdpZT9cbiIpOworICAgIG91dF9zZWw9IkR1IHNjaGx1Y2h6dCIrKGFkdmVyYiA/ICJAQGFkdmVyYkBALiIgOiAiIGhlcnp6ZXJyZWlzc2VuZC4iKTsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAgc2NobHVjaHp0IgorICAgICAgKyhhZHZlcmIgPyAiQEBhZHZlcmJAQC4iIDogIiBoZXJ6emVycmVpc3NlbmQuIik7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogU2NobW9sbGVuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJzY2htb2xsIjoKKyAgICBIRUxQQ0hFQ0soInNjaG1vbGwiKTsKKyAgICBHSE9TVENIRUNLKCJEdSBzY2h3ZWJzdCBiZWxlaWRpZ3QgaW4gZGllIEVja2UuXG4iLAorICAgICAgZ25hbWUoKSsiIHNjaHdlYnQgYmVsZWlkaWd0IGluIGRpZSBFY2tlIHVuZCBzY2htb2xsdC5cbiIsIDApOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmIChzdHIgJiYgIWFkdmVyYikKKyAgICAgIFJldHVybigiU2NobW9sbGUgd2llP1xuIik7CisgICAgb3V0X3NlbD0iRHUgc2NobW9sbHN0QEBhZHZlcmJAQC4iOworICAgIG91dF9vdGg9IkBAbmFtZUBAIGdlaHQgaW4gZGllIEVja2UgdW5kIHNjaG1vbGx0QEBhZHZlcmJAQC4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIFNjaG11bnplbG4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgInNjaG11bnplbCI6CisgICAgY2FzZSAic2NobXVuemwiOgorICAgIEhFTFBDSEVDSygic2NobXVuemVsIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKHN0ciAmJiAhYWR2ZXJiKQorICAgICAgUmV0dXJuKCJTY2htdW56bGUgd2llP1xuIik7CisgICAgb3V0X3NlbD0iRHUgc2NobXVuemVsc3RAQGFkdmVyYkBALiI7CisgICAgb3V0X290aD0iQEBnbmFtZUBAIHNjaG11bnplbHRAQGFkdmVyYkBALiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogU2NobmFsemVuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJzY2huYWx6IjoKKyAgICBIRUxQQ0hFQ0soInNjaG5hbHoiKTsKKyAgICBQYXJzZVJlc3Qoc3RyLCAoeyJ6dW5nZSIsIm1pdCB6dW5nZSIsICJtaXQgZGVyIHp1bmdlIn0pKTsKKyAgICBvdXRfc2VsPSJEdSBzY2huYWx6dEBAYWR2ZXJiQEAgbWl0IGRlciBadW5nZS4iOworICAgIG91dF9vdGg9IkBAZ25hbWVAQCBzY2huYWx6dEBAYWR2ZXJiQEAgbWl0IGRlciBadW5nZS4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIFNjaG5hdWJlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAic2NobmF1YiI6CisgICAgSEVMUENIRUNLKCJzY2huYXViIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKHN0ciAmJiAhYWR2ZXJiKQorICAgICAgUmV0dXJuKCJTY2huYXViZSB3aWU/XG4iKTsKKyAgICBvdXRfc2VsPSJEdSBzY2huYXVic3QiKyhhZHZlcmIgPyAiQEBhZHZlcmJAQC4iIDogIiBlbnRydWVzdGV0LiIpOworICAgIG91dF9vdGg9IkBAZ25hbWVAQCBzY2huYXVidCIrKGFkdmVyYiA/ICJAQGFkdmVyYkBALiIgOiAiIGVudHJ1ZXN0ZXQuIik7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogU2NobmF1ZmVuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJzY2huYXVmIjoKKyAgICBIRUxQQ0hFQ0soInNjaG5hdWYiKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoc3RyICYmICFhZHZlcmIpCisgICAgICBSZXR1cm4oIlNjaG5hdWZlIHdpZT9cbiIpOworICAgIG91dF9zZWw9IkR1IHNjaG5hdWZzdCIrKGFkdmVyYiA/ICJAQGFkdmVyYkBALiIgOiAiIHZvciBBbnN0cmVuZ3VuZy4iKTsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAgc2NobmF1ZnQiKyhhZHZlcmIgPyAiQEBhZHZlcmJAQC4iIDogIiB2b3IgQW5zdHJlbmd1bmcuIik7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogU2NobmlwcGVuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJzY2huaXBwIjoKKyAgICBjYXNlICJzY2huaXBwcyI6CisgICAgSEVMUENIRUNLKCJzY2huaXBwIik7CisgICAgR0hPU1RDSEVDSygiRHUgc2NoYWZmc3QgZXMgbmljaHQsIHdlaWwgZGllIEZpbmdlciBkdXJjaGVpbmFuZGVyIGR1cmNoICIKKyAgICAgICAgKyJnZWhlbi5cbiIsCisgICAgICBnbmFtZSgpKyIgdmVyc2FndCBiZWltIFNjaG5pcHBlbiAtIGRpZSBGaW5nZXJcbmdlaGVuIGR1cmNoZWluYW5kZXIgIgorICAgICAgICArImR1cmNoLlxuIiwgMCk7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKHN0ciAmJiAhYWR2ZXJiKQorICAgICAgUmV0dXJuKCJTY2huaXBwZSB3aWU/XG4iKTsKKyAgICBvdXRfc2VsPSJEdSBzY2huaXBwc3RAQGFkdmVyYkBAIG1pdCBkZWluZW4gRmluZ2Vybi4iOworICAgIG91dF9vdGg9IkBAbmFtZUBAIHNjaG5pcHB0QEBhZHZlcmJAQCBtaXQgZGVuIEZpbmdlcm4uIjsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBTY2huYXJjaGVuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJzY2huYXJjaCI6CisgICAgSEVMUENIRUNLKCJzY2huYXJjaCIpOworICAgIGlmIChnaG9zdCgpKQorICAgICAgUmV0dXJuKCJJY2ggZ2xhdWJlLCBkYSBmZWhsZW4gRGlyIGlyZ2VuZHdpZSBkaWUgcGh5c2lzY2hlbiAiCisgICAgICAgICsiVm9yYXVzc2V0enVuZ2VuIGRhenUuXG4iKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoc3RyICYmICFhZHZlcmIpCisgICAgICBSZXR1cm4oIlNjaG5hcmNoZSB3aWU/XG4iKTsKKyAgICBvdXRfc2VsPShzdHIgPyAiWnp6enp6enp6enouLi4iIDogIkR1IHNjaG5hcmNoc3RAQGFkdmVyYkBALiIpOworICAgIG91dF9vdGg9IkBAbmFtZUBAIHNjaG5hcmNodCAiKyhzdHIgPyAiQEBhZHZlcmJAQC4iIDogImxhdXQuIik7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogU2NobmllZmVuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJzbmllZiI6CisgICAgY2FzZSAic2NobmllZiI6CisgICAgSEVMUENIRUNLKCJzY2huaWVmIik7CisgICAgR0hPU1RDSEVDSygiRHUgc2NobmllZnN0IGdhbnogbGVpc2UuXG4iLAorICAgICAgZ25hbWUoKSsiIHNjaG5pZWZ0IGdhbnogbGVpc2UuXG4iLCAwKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoc3RyICYmICFhZHZlcmIpCisgICAgICBSZXR1cm4oIlNjaG5pZWZlIHdpZT9cbiIpOworICAgIG91dF9zZWw9IkR1IHNjaG5pZWZzdEBAYWR2ZXJiQEAuIjsKKyAgICBvdXRfb3RoPSJAQG5hbWVAQCBzY2huaWVmdEBAYWR2ZXJiQEAuIjsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBTY2hudXJyZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgInNjaG51cnIiOgorICAgIEhFTFBDSEVDSygic2NobnVyciIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmIChzdHIgJiYgIWFkdmVyYikKKyAgICAgIFJldHVybigiV2llIHdpbGxzdCBEdSBzY2hudXJyZW4/XG4iKTsKKyAgICBvdXRfc2VsPSJNTU1NSUlJSUlBQUFBQUFVVVVVVVVVVSEgRHUgc2NobnVycnN0IgorICAgICAgKyhhZHZlcmIgPyAiQEBhZHZlcmJAQC4iIDogIiB6dWZyaWVkZW4uIik7CisgICAgb3V0X290aD0iQEBnbmFtZUBAIHNjaG51cnJ0IisoYWR2ZXJiID8gIkBAYWR2ZXJiQEAuIiA6ICIgenVmcmllZGVuLiIpOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIFNjaHJlaWVuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJzY2hyZWkiOgorICAgIEhFTFBDSEVDSygic2NocmVpIik7CisgICAgR0hPU1RDSEVDSygiQUFBQUlJSUlJSUlJSUlJRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUUhIEphLCBudXIgR2Vpc3RlciAiCisgICAgICAgICsia29lbm5lbiBzbyBzY2hyZWllbiFcbiIsCisgICAgICBnbmFtZSgpKyIgc2NocmVpdCAtIGRhcyBCbHV0IGdlZnJpZXJ0IGZhc3QgaW4gZGVpbmVuIEFkZXIhXG4iLCAwKTsKKyAgICBpZiAoIXN0cikgIHsKKyAgICAgIG91dF9zZWw9IkFVVVVBQUFISEhISEghISEhIjsKKyAgICAgIG91dF9vdGg9IkBAbmFtZUBAIHNjaHJlaXQgbGF1dCEiOworICAgIH0KKyAgICBlbHNlICB7CisgICAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICAgIGlmICghd2hvICYmICFhZHZlcmIpCisgICAgICAgIFJldHVybigiU2NocmVpZW4gLSB3aWUgZGVubj8gT2RlciB3ZW4gZGVubiBhbnNjaHJlaWVuP1xuIik7CisgICAgICBvdXRfc2VsPSJEdSBzY2hyZWlzdEBAIHdlbkBAQEBhZHZlcmJAQCIrKHdobyA/ICIgYW4iIDogIiIpKyIuIjsKKyAgICAgIGlmICh3aG8pIG91dF92aWM9IkBAbmFtZUBAIHNjaHJlaXQgRGljaEBAYWR2ZXJiQEAgYW4uIjsKKyAgICAgIG91dF9vdGg9IkBAbmFtZUBAIHNjaHJlaXRAQCB3ZW5AQEBAYWR2ZXJiQEAiKyh3aG8/ICIgYW4iIDogIiIpKyIuIjsKKyAgICB9CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogU2NodWV0dGVsbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAic2NodWV0dGVsIjoKKyAgICBjYXNlICJzY2h1ZXR0bCI6CisgICAgSEVMUENIRUNLKCJzY2h1ZXR0ZWwiKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoZm9yX2FsbCkgIHsKKyAgICAgIG91dF9zZWw9IkR1IHNjaHVldHRlbHN0IEBAYWxsZUBAQEBhZHZlcmJAQCBkaWUgSGFlbmRlLiI7CisgICAgICBvdXRfdmljPSJAQGduYW1lQEAgc2NodWV0dGVsdCBAQGFsbGVAQEBAYWR2ZXJiQEAgZGllIEhhZW5kZS4iOworICAgICAgcmV0dXJuIE1peGVkT3V0KFdFTSk7CisgICAgfQorICAgIGlmIChzdHIgJiYgIXdobyAmJiAhYWR2ZXJiKQorICAgICAgUmV0dXJuKCJTY2h1ZXR0bGUgd2llPyBTY2h1ZXR0bGUgd2VtIGRpZSBIYW5kP1xuIik7CisgICAgaWYoIXdobykgeworICAgICAgb3V0X3NlbD0iRHUgc2NodWV0dGVsc3QgRGljaEBAYWR2ZXJiQEAuIjsKKyAgICAgIG91dF9vdGg9IkBAZ25hbWVAQCBzY2h1ZXR0ZWx0IHNpY2hAQGFkdmVyYkBALiI7CisgICAgfQorICAgIGVsc2UgIHsKKyAgICAgIGlmIChDaGVja0xpZmUoMCxOT1RfREVBRCwKKyAgICAgICAgIiIsICJOb2UsIGRhcyBtYWNoIGljaCBudXIgbWl0IExlYmV3ZXNlbi4iKSkKKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgIGlmICh3aG8gPT0gdGhpc19wbGF5ZXIoKSkgIHsKKyAgICAgICAgb3V0X3NlbD0iRHUgaGVic3QiKyhhZHZlcmIgPyAiQEBhZHZlcmJAQCIgOiAiIHRyaXVtcGhpZXJlbmQiKQorICAgICAgICAgICsiIERlaW5lIEhhZW5kZSB1ZWJlciBkZW4gS29wZiB1bmQgc2NodWV0dGVsc3Qgc2llLiI7CisgICAgICAgIG91dF9vdGg9IkBAZ25hbWVAQCBoZWJ0IisoYWR2ZXJiID8gIkBAYWR2ZXJiQEAiIDogIiB0cml1bXBoaWVyZW5kIikKKyAgICAgICAgICArIiBkaWUgSGFlbmRlIHVlYmVyIGRlbiBLb3BmXG51bmQgc2NodWV0dGVsdCBzaWUuIjsKKyAgICAgIH0KKyAgICAgIGVsc2UgIHsKKyAgICAgICAgb3V0X3NlbD0iRHUgc2NodWV0dGVsc3RAQCB3ZW1AQEBAYWR2ZXJiQEAgZGllIEhhZW5kZS4iOworICAgICAgICBpZiAoZ2hvc3QoKSkgb3V0X3NlbCs9IlxuTmFqYSwgRHUgdmVyc3VjaHN0IGVzIHdlbmlnc3RlbnMgLSAiCisgICAgICAgICAgKyJpbW1lciBkaWVzZSBkdXJjaGxhZXNzaWdlbiBIYWVuZGUuLi4iOworICAgICAgICBvdXRfdmljPSJAQGduYW1lQEAgc2NodWV0dGVsdCBEaXJAQGFkdmVyYkBAIGRpZSBIYWVuZGUuIjsKKyAgICAgICAgaWYgKGdob3N0KCkpIG91dF92aWMrPSJcbk5hamEsIER1IHZlcnN1Y2hzdCBlcyB3ZW5pZ3N0ZW5zIC0gIgorICAgICAgICAgICsiaW1tZXIgZGllc2UgZHVyY2hsYWVzc2lnZW4gSGFlbmRlLi4uIjsKKyAgICAgICAgb3V0X290aD0iQEBnbmFtZUBAIHNjaHVldHRlbHRAQCB3ZW1AQEBAYWR2ZXJiQEAgZGllIEhhZW5kZS4iOworICAgICAgICBpZiAoZ2hvc3QoKSkgb3V0X290aCs9IlxuTmFqYSwgRHUgdmVyc3VjaHN0IGVzIHdlbmlnc3RlbnMgLSAiCisgICAgICAgICAgKyJpbW1lciBkaWVzZSBkdXJjaGxhZXNzaWdlbiBIYWVuZGUuLi4iOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBTY2h3ZWlnZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgInNjaHdlaWciOgorICAgIEhFTFBDSEVDSygic2Nod2VpZyIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmIChzdHIgJiYgIWFkdmVyYikKKyAgICAgIFJldHVybigiU2Nod2VpZ2Ugd2llP1xuIik7CisgICAgb3V0X3NlbD0iRHUgc2Nod2VpZ3N0QEBhZHZlcmJAQC4iOworICAgIG91dF9vdGg9IkBAZ25hbWVAQCBzY2h3ZWlndEBAYWR2ZXJiQEAuIjsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBTZXVmemVuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJzZXVmeiI6CisgICAgSEVMUENIRUNLKCJzZXVmeiIpOworICAgIEdIT1NUQ0hFQ0soIkR1IHNldWZ6dCBnZWlzdGVyaGFmdC5cbiIsCisgICAgICBnbmFtZSgpKyIgc2V1Znp0IGdlaXN0ZXJoYWZ0LiBOYWphLCB3aWUgZGVubiBzb25zdD9cbiIsIDApOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmICghYWR2ZXJiICYmIHN0cikKKyAgICAgIFJldHVybigiU2V1ZnplIHdpZT9cbiIpOworICAgIG91dF9zZWw9IkR1IHNldWZ6c3RAQGFkdmVyYkBALiI7CisgICAgb3V0X290aD0iQEBuYW1lQEAgc2V1Znp0QEBhZHZlcmJAQC4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIFNpbmdlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAic2luZyI6CisgICAgSEVMUENIRUNLKCJzaW5nIik7CisgICAgaWYgKCFzdHIpIHsKKyAgICAgIG91dF9zZWw9Ik9oIHNvbGUgbWlvISI7CisgICAgICBvdXRfb3RoPSJAQGduYW1lQEAgc2luZ3QgaXJnZW5kd2FzIGl0YWxpZW5pc2NoZXMuIjsKKyAgICB9CisgICAgZWxzZSAgeworICAgICAgUGFyc2VSZXN0KHN0cik7CisgICAgICBvdXRfc2VsPSJEdSBzaW5nc3RAQGFkdmVyYkBAIisoYWR2ZXJiID8gIi4iIDogIiAnIitjYXBpdGFsaXplKHN0cikrIicuIik7CisgICAgICBvdXRfb3RoPSJAQGduYW1lQEAgc2luZ3RAQGFkdmVyYkBAIisoYWR2ZXJiID8gIi4iIDogIiAnIgorICAgICAgICArY2FwaXRhbGl6ZShzdHIpKyInLiIpOworICAgIH0KKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBTbmlmZmVuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJzbmlmZiI6CisgICAgSEVMUENIRUNLKCJzbmlmZiIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmIChzdHIgJiYgIWFkdmVyYiAmJiAhd2hvKQorICAgICAgUmV0dXJuKCJTbmlmZmUgd2llP1xuIik7CisgICAgb3V0X3NlbD0iRHUgc25pZmZzdCIrKHdobyA/ICIgQEB3ZW5AQCIgOiAiIikKKyAgICAgICsoYWR2ZXJiID8gIkBAYWR2ZXJiQEAiIDogIiB0cmF1cmlnIikrKHdobyA/ICIgYW4uIiA6ICIuIik7CisgICAgaWYgKHdobykgb3V0X3ZpYz0iQEBnbmFtZUBAIHNuaWZmdCBEaWNoIgorICAgICAgKyhhZHZlcmIgPyAiQEBhZHZlcmJAQCIgOiAiIHRyYXVyaWciKSsiIGFuLiI7CisgICAgb3V0X290aD0iQEBnbmFtZUBAIHNuaWZmdCIrKHdobyA/ICIgQEB3ZW5AQCIgOiAiIikKKyAgICAgICsoYWR2ZXJiID8gIkBAYWR2ZXJiQEAiIDogIiB0cmF1cmlnIikrKHdobyA/ICIgYW4uIiA6ICIuIik7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogU3B1Y2tlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAic3B1Y2siOgorICAgIEhFTFBDSEVDSygic3B1Y2siKTsKKyAgICBHSE9TVENIRUNLKCJEdSBicmluZ3N0IG5pY2h0IGdlbnVnIFNwdWNrZSB6dXNhbW1lbi5cbiIsCisgICAgICBnbmFtZSgpKyIgc3RlbGx0IGdlcmFkZSBmZXN0LCBkYXNzIG1hbiBvaG5lIFNwdWNrZSBuaWNodFxuIgorICAgICAgICArInNwdWNrZW4ga2Fubi5cbiIsIDApOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmIChzdHIgJiYgIXdobyAmJiAhYWR2ZXJiKQorICAgICAgUmV0dXJuKCJTcHVja2Ugd2VuIHdpZSBhbj9cbiIpOworICAgIGlmICh3aG8gJiYgQ2hlY2tMaWZlKE5PVF9TRUxGLDAsCisgICAgICAiSGFzdCBEdSBEaWNoIHNvIHNjaGxlY2h0IGJlbm9tbWVuPyBMYXNzIGVzIGxpZWJlciBibGVpYmVuLiIpKQorICAgICAgICByZXR1cm4gMTsKKyAgICBvdXRfc2VsPSJEdSBzcHVja3N0QEAgd2VuQEBAQGFkdmVyYkBAICIrKHdobyA/ICJhbi4iIDogImF1ZiBkZW4gQm9kZW4uIik7CisgICAgaWYgKHdobykgb3V0X3ZpYz0iQEBuYW1lQEAgc3B1Y2t0IERpY2hAQGFkdmVyYkBAIGFuLiI7CisgICAgb3V0X290aD0iQEBuYW1lQEAgc3B1Y2t0QEAgd2VuQEBAQGFkdmVyYkBAICIKKyAgICAgICsod2hvID8gImFuLiIgOiAiYXVmIGRlbiBCb2Rlbi4iKTsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBTdGFtcGZlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAic3RhbXBmIjoKKyAgICBIRUxQQ0hFQ0soInN0YW1wZiIpOworICAgIFBhcnNlUmVzdChzdHIsICJhdWYiKTsKKyAgICBvdXRfc2VsPSJEdSBzdGFtcGZzdEBAYWR2ZXJiQEAgbWl0IGRlbSBGdXNzIGF1Zi4iOworICAgIG91dF9vdGg9IkBAZ25hbWVAQCBzdGFtcGZ0QEBhZHZlcmJAQCBtaXQgZGVtIEZ1c3MgYXVmLiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogU3RhcnJlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAic3RhcnIiOgorICAgIEhFTFBDSEVDSygic3RhcnIiKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoc3RyICYmICF3aG8gJiYgIWFkdmVyYikKKyAgICAgIFJldHVybigiU3RhcnJlIHdpZSBiencuIHdlbiBhbj9cbiIpOworICAgIGlmICh3aG8gJiYgQ2hlY2tMaWZlKE5PVF9TRUxGLDAsCisgICAgICAiV2llIHdpbGxzdCBEdSBpbiBEZWluZSBlaWdlbmVuIEF1Z2VuIHN0YXJyZW4/ICIKKyAgICAgICAgKyIoU3BpZWdlbCBnZWx0ZW4gbmljaHQuLi4pIikpCisgICAgICAgIHJldHVybiAxOworICAgIG91dF9zZWw9IkR1IHN0YXJyc3QiKyghc3RyID8gIiBpbnMgTGVlcmUuIiA6ICh3aG8gPyAiQEAgd2VuQEAiIDogIiIpCisgICAgICArKGFkdmVyYiA/ICJAQGFkdmVyYkBAIiA6ICIgdmVydHJhZXVtdCIpKyh3aG8gPyAiIGFuLiIgOiAiLiIpKTsKKyAgICBpZiAod2hvKSBvdXRfdmljPSJAQGduYW1lQEAgc3RhcnJ0IisoYWR2ZXJiID8gIkBAYWR2ZXJiQEAiIDogIiB0aWVmIikKKyAgICAgICsiIGluIERlaW5lIEF1Z2VuLiI7CisgICAgb3V0X290aD0iQEBnbmFtZUBAIHN0YXJydCIrKCFzdHIgPyAiIGlucyBMZWVyZS4iIDogKHdobyA/ICJAQCB3ZW5AQCIgOiAiIikKKyAgICAgICsoYWR2ZXJiID8gIkBAYWR2ZXJiQEAiIDogIiB2ZXJ0cmFldW10IikrKHdobyA/ICIgYW4uIiA6ICIuIikpOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIFN0YXVuZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgInN0YXVuIjoKKyAgICBIRUxQQ0hFQ0soInN0YXVuIik7CisgICAgaWYgKCFzdHIpICB7CisgICAgICBvdXRfc2VsPSJEdSBiaXN0IGVyc3RhdW50LiI7CisgICAgICBvdXRfb3RoPSJAQGduYW1lQEAgaXN0IGVyc3RhdW50LiI7CisgICAgfQorICAgIGVsc2UgIHsKKyAgICAgIFBhcnNlUmVzdChzdHIsICJ1ZWJlciIpOworICAgICAgaWYgKCF3aG8gJiYgIWFkdmVyYikKKyAgICAgICAgUmV0dXJuKCJCbGEgYmxhLiBXZW5uIER1IG5hY2ggc3RhdW5lIG5vY2ggd2FzIHRpcHBzdCwgc29sbHRlICIKKyAgICAgICAgICArImRhcyBlaW5cbkxlYmV3ZXNlbiBzZWluLlxuIik7CisgICAgICBpZiAod2hvID09IHRoaXNfcGxheWVyKCkpICB7CisgICAgICAgIG91dF9zZWw9IkR1IHN0YXVuc3RAQGFkdmVyYkBAIHVlYmVyIERpY2ggc2VsYmVyLiI7CisgICAgICAgIG91dF9vdGg9IkBAZ25hbWVAQCBzdGF1bnRAQGFkdmVyYkBAIHVlYmVyIHNpY2ggc2VsYmVyLiI7CisgICAgICB9CisgICAgICBlbHNlICB7CisgICAgICAgIG91dF9zZWw9IkR1IHN0YXVuc3RAQGFkdmVyYkBAIisod2hvID8gIiB1ZWJlciBAQHdlbkBALiIgOiAiLiIpOworICAgICAgICBpZiAod2hvKSBvdXRfdmljPSJAQGduYW1lQEAgc3RhdW50QEBhZHZlcmJAQCB1ZWJlciBEaWNoLiI7CisgICAgICAgIG91dF9vdGg9IkBAZ25hbWVAQCBzdGF1bnRAQGFkdmVyYkBAIisod2hvID8gIiB1ZWJlciBAQHdlbkBALiIgOiAiLiIpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBTdGllcmVuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJzdGllciI6CisgICAgSEVMUENIRUNLKCJzdGllciIpOworICAgIEdIT1NUQ0hFQ0soIkR1IHN0aWVyc3QgbWl0IGhvaGxlbSBCbGljayBpbiBkaWUgR2VnZW5kLlxuIiwKKyAgICAgIGduYW1lKCkrIiBzdGllcnQgbWl0IGhvaGxlbSBCbGljayBpbiBkaWUgR2VnZW5kLlxuIiwgMCk7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKHN0ciAmJiAhd2hvICYmICFhZHZlcmIpCisgICAgICBSZXR1cm4oIlN0aWVyZSB3aWUgb2RlciB3ZW4gYW4/XG4iKTsKKyAgICBpZiAod2hvICYmIENoZWNrTGlmZShOT1RfU0VMRixOT1RfREVBRCwKKyAgICAgICJEdSBrYW5uc3QgRGljaCBuaWNodCBzZWxiZXIgYW5zdGllcmVuLiIsCisgICAgICAiQml0dGUgbnVyIExlYmV3ZXNlbiBhbnN0aWVyZW4uIikpCisgICAgICAgIHJldHVybiAxOworICAgIG91dF9zZWw9IkR1IHN0aWVyc3RAQCB3ZW5AQEBAYWR2ZXJiQEAiCisgICAgICArKHdobyA/ICIgYW4uIiA6ICIgaW4gZGVyIEdlZ2VuZCBoZXJ1bS4iKTsKKyAgICBpZiAod2hvKSBvdXRfdmljPSJAQGduYW1lQEAgc3RpZXJ0IERpY2hAQGFkdmVyYkBAIGFuLiI7CisgICAgb3V0X290aD0iQEBnbmFtZUBAIHN0aWVydEBAIHdlbkBAQEBhZHZlcmJAQCIKKyAgICAgICsod2hvID8gIiBhbi4iIDogIiBpbiBkZXIgR2VnZW5kIGhlcnVtLiIpOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIFN0aW1tZSB6dSAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAic3RpbW0iOgorICAgIEhFTFBDSEVDSygic3RpbW0iKTsKKyAgICBQYXJzZVJlc3Qoc3RyLCAienUiKTsKKyAgICBpZiAoc3RyICYmICF3aG8gJiYgIWFkdmVyYikKKyAgICAgIFJldHVybigiU3RpbW1lIHdlbSB6dT9cbiIpOworICAgIG91dF9zZWw9IkR1IHN0aW1tc3RAQCB3ZW1AQEBAYWR2ZXJiQEAgenUuIjsKKyAgICBpZiAod2hvKSBvdXRfdmljPSJAQGduYW1lQEAgc3RpbW10IERpckBAYWR2ZXJiQEAgenUuIjsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAgc3RpbW10QEAgd2VtQEBAQGFkdmVyYkBAIHp1LiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogU3RvZWhuZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgInN0b2VobiI6CisgICAgSEVMUENIRUNLKCJzdG9laG4iKTsKKyAgICBHSE9TVENIRUNLKCJEdSBzdG9laG5zdCBzY2hhdWRlcmxpY2guXG4iLAorICAgICAgZ25hbWUoKSsiIHN0b2VobnQgc2NoYXVkZXJsaWNoLiBadW0gR2x1ZWNrXG5oYXN0IER1IHppZW1saWNoICIKKyAgICAgICAgKyJndXRlIE5lcnZlbi5cbiIsIDApOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmICghYWR2ZXJiICYmIHN0cikKKyAgICAgIFJldHVybigiV2llIHdpbGxzdCBEdSBzdG9laG5lbj9cbiIpOworICAgIG91dF9zZWw9IkR1IHN0b2VobnN0QEBhZHZlcmJAQC4iOworICAgIG91dF9vdGg9IkBAbmFtZUBAIHN0b2VobnRAQGFkdmVyYkBALiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogU3Rvc3NlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAic3Rvc3MiOgorICAgIEhFTFBDSEVDSygic3Rvc3MiKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoIXdobykKKyAgICAgIFJldHVybigiU3Rvc3NlIHdlbj9cbiIpOworICAgIGlmIChDaGVja0xpZmUoTk9UX1NFTEYsTk9UX0RFQUQsCisgICAgICAiV2FzIHNvbGwgZGVyIFVuc2lubj8gTGFzcyBkYXMhIiwKKyAgICAgICJEYXMgZ2lidCBudXIgYmVpIExlYmV3ZXNlbiBTaW5uLiIpKQorICAgICAgICByZXR1cm4gMTsKKyAgICBHSE9TVENIRUNLKCJEZWluIEVsbGVuYm9nZW4gdmVyc2lua3QgaW4gIit3aG8tPm5hbWUoV0VNKSsiLlxuIiwKKyAgICAgIGduYW1lKCkrIiB3aWxsICIrd2hvLT5uYW1lKFdFTSkrIiBpbiBkaWUgUmlwcGVuIHN0b3NzZW4sIGFiZXIgIgorICAgICAgICArUVBQKE1BTEUsV0VSLFBMVVJBTCkrIlxuRWxsZW5ib2dlbiB2ZXJ0ZWlsZW4ga2VpbmVuIFN0b3NzLCAiCisgICAgICAgICsic29uZGVybiB2ZXJzaW5rZW4uXG4iLAorICAgICAgZ25hbWUoKSsiIHdpbGwgRGljaCBpbiBkaWUgUmlwcGVuIHN0b3NzZW4sIGFiZXIgIitRUFAoTUFMRSxXRVIsUExVUkFMKQorICAgICAgICArIiBFbGxlbmJvZ2VuIHZlcnNpbmtlbi5cbiIpOworICAgIG91dF9zZWw9IkR1IHN0b2Vzc3RAQCB3ZW5AQEBAYWR2ZXJiQEAgaW4gZGllIFJpcHBlbi4iOworICAgIG91dF92aWM9IkBAbmFtZUBAIHN0b2Vzc3QgRGlyQEBhZHZlcmJAQCBpbiBkaWUgUmlwcGVuLiI7CisgICAgb3V0X290aD0iQEBuYW1lQEAgc3RvZXNzdEBAIHdlbkBAQEBhZHZlcmJAQCBpbiBkaWUgUmlwcGVuLiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogU3RyZWljaGVsbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAic3RyZWljaGVsIjoKKyAgICBjYXNlICJzdHJlaWNobCI6CisgICAgSEVMUENIRUNLKCJzdHJlaWNoZWwiKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoIXdobykKKyAgICAgIFJldHVybigiU3RyZWljaGxlIHdlbj9cbiIpOworICAgIGlmIChmb3JfYWxsKSAgeworICAgICAgb3V0X3NlbD0iRHUgc3RyZWljaGVsc3QgQEBhbGxlQEBAQGFkdmVyYkBALiI7CisgICAgICBvdXRfdmljPSJAQGduYW1lQEAgc3RyZWljaGVsdCBAQGFsbGVAQEBAYWR2ZXJiQEAuIjsKKyAgICAgIHJldHVybiBNaXhlZE91dChXRU4pOworICAgIH0KKyAgICBpZiAoQ2hlY2tMaWZlKE5PVF9TRUxGLE5PVF9ERUFELAorICAgICAgIkxhc3MgRGljaCB2b24gYW5kZXJlbiBzdHJlaWNoZWxuLiIsCisgICAgICAiSWNoIHN0cmVpY2hsZSBudXIgTGViZXdlc2VuLiIpKQorICAgICAgICByZXR1cm4gMTsKKyAgICBHSE9TVENIRUNLKCJEdSB3aWxsc3QgIit3aG8tPm5hbWUoV0VOLDIpKyIgc3RyZWljaGVsbiwgYWJlciBEZWluZSAiCisgICAgICArIkhhZW5kZSBrb2VubmVuXG5uaWNodHMgYmVydWVocmVuLlxuIiwKKyAgICBnbmFtZSgpKyIgd2lsbCAiK3doby0+bmFtZShXRU4sMikrIiBzdHJlaWNoZWxuLCBhYmVyIGRpZXNlXG4iCisgICAgICArIkdlaXN0ZXJoYWVuZGUga29lbm5lbiBoYWx0IG5peCBiZXJ1ZWhyZW4uLi5cbiIsCisgICAgZ25hbWUoKSsiIHdpbGwgRGljaCBzdHJlaWNoZWxuLCBzY2hlaXRlcnQgYWJlciB3aWUgc28gb2Z0IGFuXG4iCisgICAgICArImRpZXNlbiBkdW1tZW4gZHVyY2hsYWVzc2lnZW4gR2Vpc3RlcmhhZW5kZW4uXG4iKTsKKyAgICBvdXRfc2VsPSJEdSBzdHJlaWNoZWxzdCBAQHdlbkBAQEBhZHZlcmJAQC4iOworICAgIG91dF92aWM9IkBAbmFtZUBAIHN0cmVpY2hlbHQgRGljaEBAYWR2ZXJiQEAuIjsKKyAgICBvdXRfb3RoPSJAQG5hbWVAQCBzdHJlaWNoZWx0IEBAd2VuQEBAQGFkdmVyYkBALiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogU3R1cHNlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAic3R1cHMiOgorICAgIEhFTFBDSEVDSygic3R1cHMiKTsKKyAgICBpZiAoZ2hvc3QoKSkKKyAgICAgIFJldHVybigiRGFzIGdlaHQgbmljaHQgb2huZSBFbGxlbmJvZ2VuLC4uXG4iKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoIXdobykKKyAgICAgIFJldHVybigiU3R1cHNlIHdlbiBhbj9cbiIpOworICAgIG91dF9zZWw9IkR1IHN0dXBzdCBAQHdlbkBAQEBhZHZlcmJAQCBhbi4iOworICAgIG91dF92aWM9IkBAbmFtZUBAIHN0dXBzdCBEaWNoQEBhZHZlcmJAQCBhbi4iOworICAgIG91dF9vdGg9IkBAbmFtZUBAIHN0dXBzdCBAQHdlbkBAQEBhZHZlcmJAQCBhbi4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIFN0dXR6ZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgInN0dXR6IjoKKyAgICBIRUxQQ0hFQ0soInN0dXR6Iik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKHN0ciAmJiAhYWR2ZXJiKQorICAgICAgUmV0dXJuKCJTdHV0emUgd2llP1xuIik7CisgICAgb3V0X3NlbD0iRHUgc3R1dHp0QEBhZHZlcmJAQC4iOworICAgIG91dF9vdGg9IkBAZ25hbWVAQCBzdHV0enRAQGFkdmVyYkBALiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogVGFldHNjaGVsbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAidGFldHNjaGVsIjoKKyAgICBjYXNlICJ0YWV0c2NobCI6CisgICAgSEVMUENIRUNLKCJ0YWV0c2NoZWwiKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoIXdobykKKyAgICAgIFJldHVybigiVGFldHNjaGxlIHdlbj9cbiIpOworICAgIGlmIChDaGVja0xpZmUoTk9UX1NFTEYsTk9UX0RFQUQsCisgICAgICAiRGFzIHNpZWh0IHp1IGRvb2YgYXVzLCBkYXMgbWFjaGUgaWNoIG5pY2h0LiIsCisgICAgICAiSWNoIHRhZXRzY2hsZSBudXIgTGViZXdlc2VuLiIpKQorICAgICAgICByZXR1cm4gMTsKKyAgICAgR0hPU1RDSEVDSygiRHUgd2lsbHN0ICIrd2hvLT5uYW1lKFdFTikrIiB0YWV0c2NoZWxuIC0gYWJlciBEZWluZSAiCisgICAgICAgICsiSGFlbmRlIGdlaGVuXG5nbGF0dCBkdXJjaCBkZW4gS29wZiBkdXJjaC5cbiIsCisgICAgICBnbmFtZSgpKyIgd2lsbCAiK3doby0+bmFtZShXRU4pKyIgZGVuIEtvcGYgdGFldHNjaGVsbiwgYWJlciAiCisgICAgICAgICsiZGllIEdlaXN0ZXItXG5oYWVuZGUgZ2VoZW4gZ2xhdHQgZHVyY2ggZGVuIEtvcGYgZHVyY2guXG4iLAorICAgICAgZ25hbWUoKSsiIHdpbGwgRGVpbmVuIEtvcGYgdGFldHNjaGVsbiwgYWJlciBkaWVzZSBHZWlzdGVyaGFlbmRlICIKKyAgICAgICAgKyJnZWhlblxuZ2xhdHQgZHVyY2ggRGVpbmVuIEtvcGYgZHVyY2ggLSBEdSBoYXN0IGVpbiBzZWx0c2FtZXMgIgorICAgICAgICArIkdlZnVlaGwgZGFiZWkuXG4iKTsKKyAgICBvdXRfc2VsPSJEdSB0YWV0c2NoZWxzdCBAQHdlbUBAQEBhZHZlcmJAQCBkZW4gS29wZi4iOworICAgIG91dF92aWM9IkBAbmFtZUBAIHRhZXRzY2hlbHQgRGlyQEBhZHZlcmJAQCBkZW4gS29wZi4iOworICAgIG91dF9vdGg9IkBAbmFtZUBAIHRhZXRzY2hlbHQgQEB3ZW1AQEBAYWR2ZXJiQEAgZGVuIEtvcGYuIjsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBUYW56ZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgInRhbnoiOgorICAgIEhFTFBDSEVDSygidGFueiIpOworICAgIEdIT1NUQ0hFQ0soIkR1IHRhbnp0IGRlbiBrbGFzc2lzY2hlbiBHZWlzdGVyVGFueiAodG0pLlxuIiwKKyAgICAgIGduYW1lKCkrIiB0YW56dCBkZW4ga2xhc3Npc2NoZW4gR2Vpc3RlclRhbnogKHRtKS5cbiIsIDApOworICAgIGlmICghc3RyKSB7CisgICAgICBvdXRfc2VsPSJLb21tc3QgRHUgRGlyIG5pY2h0IGlyZ2VuZHdpZSBibG9lZCB2b3I/IER1IHRhbnp0ICIKKyAgICAgICAgKyJkZW4gRW50ZW50YW56LiI7CisgICAgICBvdXRfb3RoPSJAQG5hbWVAQCB0YW56dCBkZW4gRW50ZW50YW56LiI7CisgICAgfQorICAgIGVsc2UgIHsKKyAgICAgIHRhZW56ZT0oeyJXYWx6ZXIiLCJQb2xrYSIsIlJ1bWJhIiwiVGFuZ28iLCJDaGEgY2hhIGNoYSIsIkZveHRyb3R0IiwKKyAgICAgICAgIk1hbWJvIiwiU2Fsc2EiLCJTbG93Zm94IiwiQnJlYWtkYW5jZSIsIlBvZ28iLCJNZXJlbmd1ZSIsCisgICAgICAgICJSb2NrJ24nUm9sbCIsIkJhbGxldHQiLCJSZWdlbnRhbnoiLCJIZXhlbnRhbnoifSk7CisgICAgICBQYXJzZVJlc3Qoc3RyLCJtaXQiKTsKKyAgICAgIGlmICghd2hvKQorICAgICAgICBSZXR1cm4oIk1pdCB3ZW0gd2lsbHN0IER1IHRhbnplbj9cbiIpOworICAgICAgaWYgKHdobyAmJiBDaGVja0xpZmUoTk9UX1NFTEYsTk9UX0RFQUQsCisgICAgICAgICJNaXQgRGlyIHNlbGJlciBrYW5uc3QgRHUgbmljaHQgdGFuemVuLiIsCisgICAgICAgICJLZWluZSBSZWFrdGlvbiAtIHdpbGwgd2FocnNjaGVpbmxpY2ggbmljaHQgdGFuemVuLiIpKQorICAgICAgICAgIHJldHVybiAxOworICAgICAgaWZvbz1yYW5kb20oc2l6ZW9mKHRhZW56ZSkpOworICAgICAgb3V0X3NlbD0iRHUgdGFuenRAQGFkdmVyYkBAIG1pdCBAQHdlbUBAIGVpbmUgUnVuZGUgIit0YWVuemVbaWZvb10rIi4iOworICAgICAgb3V0X3ZpYz0iQEBuYW1lQEAgcmVpc3N0IERpY2ggYW4gc2ljaCB1bmQgdGFuenRAQGFkdmVyYkBAIGVpbmUgUnVuZGUgIgorICAgICAgICArdGFlbnplW2lmb29dKyIgbWl0IERpci4iOworICAgICAgb3V0X290aD0iQEBuYW1lQEAgc2NobmFwcHQgc2ljaCBAQHdlbkBAIHVuZCBkaWUgYmVpZGVuIHRhbnplbiIKKyAgICAgICAgKyJAQGFkdmVyYkBAIGVpbmUgUnVuZGUgIit0YWVuemVbaWZvb10rIi4iOworICAgIH0KKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBUcmFldW1lbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAidHJhZXVtIjoKKyAgICBIRUxQQ0hFQ0soInRyYWV1bSIpOworICAgIGlmICghc3RyKQorICAgICAgUmV0dXJuKCJUcmFldW1lIHdvdm9uIG9kZXIgdm9uIHdlbT9cbiIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIG91dF9zZWw9IkR1IHRyYWV1bXN0Iisod2hvID8gIkBAYWR2ZXJiQEAgdm9uIEBAd2VtQEAuIgorICAgICAgOiAoYWR2ZXJiID8gIkBAYWR2ZXJiQEAuIiA6ICIgIitzdHIrIi4iKSk7CisgICAgaWYgKHdobykgb3V0X3ZpYz0iQEBnbmFtZUBAIHRyYWV1bXRAQGFkdmVyYkBAIHZvbiBEaXIuIjsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAgdHJhZXVtdCIrKHdobyA/ICJAQGFkdmVyYkBAIHZvbiBAQHdlbUBALiIKKyAgICAgIDogKGFkdmVyYiA/ICJAQGFkdmVyYkBALiIgOiAiICIrc3RyKyIuIikpOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIFRyZXRlbiAodHJpdHQpICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJ0cml0dCI6CisgICAgY2FzZSAidHJldCI6CisgICAgSEVMUENIRUNLKCJ0cml0dCIpOworICAgIGlmICghc3RyKSAgeworICAgICAgR0hPU1RDSEVDSygiRGVpbiBGdXNzIGZhZWhydCBkdXJjaCBkaWUgYmVydWVobXRlIGxhbmd2ZXJnZXNzZW5lICIKKyAgICAgICAgICArInVuc2ljaHRiYXJlIFNjaGlsZGtyb2V0ZVxuaGluZHVyY2guXG4iLAorICAgICAgICBnbmFtZSgpKyIgd2lsbCBkaWUgYmVydWVobXRlIGxhbmd2ZXJnZXNzZW5lIHVuc2ljaHRiYXJlXG4iCisgICAgICAgICAgKyJTY2hpbGRrcm9ldGUgdHJldGVuLCBhYmVyICIrUVBQKE1BTEUsV0VSKQorICAgICAgICAgICsiIEZ1c3MgZmFlaHJ0IGR1cmNoIHNpZSBoaW5kdXJjaC5cbiIsIDApOworICAgICAgb3V0X3NlbD0iRHUgdHJpdHRzdCBkaWUgYmVydWVobXRlIGxhbmd2ZXJnZXNzZW5lIHVuc2ljaHRiYXJlICIKKyAgICAgICAgKyJTY2hpbGRrcm9ldGUuIjsKKyAgICAgIG91dF9vdGg9IkBAZ25hbWVAQCB0cml0dCBkaWUgYmVydWVobXRlIGxhbmd2ZXJnZXNzZW5lIHVuc2ljaHRiYXJlICIKKyAgICAgICAgKyJTY2hpbGRrcm9ldGUuIjsKKyAgICB9CisgICAgZWxzZSAgeworICAgICAgUGFyc2VSZXN0KHN0cik7CisgICAgICBpZiAoZm9yX2FsbCkgIHsKKyAgICAgICAgb3V0X3NlbD0iRHUgdHJpdHRzdCBAQGFsbGVAQEBAYWR2ZXJiQEAuIFNvbGx0ZXN0IER1IG5pY2h0IGxhbmdzYW0gIgorICAgICAgICAgICsiYW4gRmx1Y2h0IGRlbmtlbj8iOworICAgICAgICBvdXRfdmljPSJAQG5hbWVAQCB0cml0dCBAQGFsbGVAQEBAYWR2ZXJiQEAuIFRyYXV0IHNpY2ggZ2FueiAiCisgICAgICAgICAgKyJzY2hvZW4gd2FzISI7CisgICAgICAgIHJldHVybiBNaXhlZE91dChXRU4pOworICAgICAgfQorICAgICAgaWYgKCF3aG8gJiYgIWFkdmVyYikKKyAgICAgICAgUmV0dXJuKCJXZW5uIER1IHNjaG9uIHdhcyBuYWNoIHRyaXR0IHRpcHBzdCwgZGFubiBzYWcgbWlyLCB3ZW4gIgorICAgICAgICAgICsib2RlciB3aWUgaWNoIGRhcyBzb2xsLlxuIik7CisgICAgICBpZiAod2hvICYmIENoZWNrTGlmZShOT1RfU0VMRixOT1RfREVBRCwKKyAgICAgICAgIkR1IHNjaGFmZnN0IGVzIG5pY2h0LCBEaXIgc2VsYmVyIGluIGRlbiBIaW50ZXJuIHp1IHRyZXRlbi4iLAorICAgICAgICAiVG90ZSBTYWNoZW4gdHJpdHQgbWFuIG5pY2h0IGF1Y2ggbm9jaCEiKSkKKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgIGlmICh3aG8pICB7CisgICAgICAgIG91dF9zZWw9IkR1IHRyaXR0c3RAQCB3ZW5AQEBAYWR2ZXJiQEAuIjsKKyAgICAgICAgaWYgKHdobykgb3V0X3ZpYz0iQEBnbmFtZUBAIHRyaXR0IERpY2hAQGFkdmVyYkBALiI7CisgICAgICAgIG91dF9vdGg9IkBAZ25hbWVAQCB0cml0dEBAIHdlbkBAQEBhZHZlcmJAQC4iOworICAgICAgfQorICAgICAgZWxzZSAgeworICAgICAgICBvdXRfc2VsPSJEdSB0cml0dHN0IGRpZSBiZXJ1ZWhtdGUgbGFuZ3Zlcmdlc3NlbmUgdW5zaWNodGJhcmUgIgorICAgICAgICAgICsiU2NoaWxka3JvZXRlQEBhZHZlcmJAQC4iOworICAgICAgICBvdXRfb3RoPSJAQGduYW1lQEAgdHJpdHQgZGllIGJlcnVlaG10ZSBsYW5ndmVyZ2Vzc2VuZSB1bnNpY2h0YmFyZSAiCisgICAgICAgICAgKyJTY2hpbGRrcm9ldGVcbkBAYWR2ZXJiQEAuIjsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogVHJvZXN0ZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgInRyb2VzdCI6CisgICAgSEVMUENIRUNLKCJ0cm9lc3QiKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoIXdobykKKyAgICAgIFJldHVybigiV2VuIHdpbGxzdCBEdSB0cm9lc3Rlbj9cbiIpOworICAgIGlmICh3aG8gJiYgQ2hlY2tMaWZlKE5PVF9TRUxGLE5PVF9ERUFELAorICAgICAgIlRyb3N0IG11c3N0IER1IGJlaSBqZW1hbmQgYW5kZXJzIHN1Y2hlbi4iLAorICAgICAgIkRhcyBUZWlsIG11c3N0IER1IG5pY2h0IHRyb2VzdGVuLCBkYXMgZnVlaGx0IG5peC4iKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgb3V0X3NlbD0iRHUgdHJvZXN0ZXN0QEAgd2VuQEBAQGFkdmVyYkBALiI7CisgICAgb3V0X3ZpYz0iQEBnbmFtZUBAIHRyb2VzdGV0IERpY2hAQGFkdmVyYkBALiI7CisgICAgb3V0X290aD0iQEBnbmFtZUBAIHRyb2VzdGV0QEAgd2VuQEBAQGFkdmVyYkBALiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogVW1hcm1lbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAidW1hcm0iOgorICAgIEhFTFBDSEVDSygidW1hcm0iKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoIXdobykKKyAgICAgIFJldHVybigiV2VuIHdpbGxzdCBEdSB1bWFybWVuP1xuIik7CisgICAgaWYgKHdobyAmJiBDaGVja0xpZmUoMCxOT1RfREVBRCwwLCJCaXR0ZSB1bWFybWUgbnVyIExlYmV3ZXNlbi4iKSkKKyAgICAgIHJldHVybiAxOworICAgIGlmIChnaG9zdCgpICYmIENoZWNrTGlmZShOT1RfU0VMRiwwLAorICAgICAgIkR1IGthbm5zdCBEaWNoIGFscyBHZWlzdCBuaWNodCBzZWxiZXIgd2Flcm1lbi4iKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgc3RyMT13aG8tPlF1ZXJ5UHJvcChQX05BTUUpOworICAgIGlmKHBvaW50ZXJwKHN0cjEpKXN0cjE9KHN0cmluZylzdHIxWzBdOyAvLyBSdW1hdGEKKyAgICBzdHIyPXdoby0+UXVlcnlQcm9ub3VuKFdFTik7CisgICAgR0hPU1RDSEVDSygiRHUgd2lsbHN0ICIrc3RyMSsiIHVtYXJtZW4sIGFiZXIgRGVpbmUgQXJtZSBnZWhlbiBkdXJjaCAiCisgICAgICAgICtzdHIyKyIgZHVyY2guXG4iLAorICAgICAgZ25hbWUoKSsiIHdpbGwgIitzdHIxKyIgdW1hcm1lbiwgYWJlciAiK1FQUChNQUxFLFdFUixQTFVSQUwpCisgICAgICAgICsiIEFybWUgZ2VoZW5cbmR1cmNoICIrc3RyMisiIGhpbmR1cmNoLlxuIiwKKyAgICAgIGduYW1lKCkrIiB3aWxsIERpY2ggdW1hcm1lbiwgYWJlciAiK1FQUChNQUxFLFdFUixQTFVSQUwpCisgICAgICAgICsiIEFybWUgZ2VoZW4gZHVyY2ggRGljaCBoaW5kdXJjaC5cbiIpOworICAgIGlmIChmb3JfYWxsKSAgeworICAgICAgb3V0X3NlbD0iRHUgdW1hcm1zdCBAQGFsbGVAQEBAYWR2ZXJiQEAuIjsKKyAgICAgIG91dF92aWM9IkBAbmFtZUBAIHVtYXJtdCBAQGFsbGVAQEBAYWR2ZXJiQEAuIjsKKyAgICAgIHJldHVybiBNaXhlZE91dChXRU4pOworICAgIH0KKyAgICBpZiAod2hvPT10aGlzX3BsYXllcigpKSAgeworICAgICAgb3V0X3NlbD0iRHUgbGVnc3QgRGVpbmUgQXJtZSB1bSBEaWNoIHVuZCB3YWVybXN0IERpY2ggIgorICAgICAgICArImVpbiBiaXNzY2hlbiBzZWxiZXIuIjsKKyAgICAgIG91dF9vdGg9IkBAbmFtZUBAIGxlZ3QgIitRUFAoTUFMRSxXRVIsUExVUkFMKQorICAgICAgICArIiBBcm1lIHVtIHNpY2ggdW5kIHdhZXJtdCBzaWNoIGVpbiBiaXNzY2hlbiBzZWxiZXIuIjsKKyAgICB9CisgICAgZWxzZSAgeworICAgICAgb3V0X3NlbD0iRHUgdW1hcm1zdEBAIHdlbkBAQEBhZHZlcmJAQC4iOworICAgICAgb3V0X3ZpYz0iQEBuYW1lQEAgdW1hcm10IERpY2hAQGFkdmVyYkBALiI7CisgICAgICBvdXRfb3RoPSJAQG5hbWVAQCB1bWFybXRAQCB3ZW5AQEBAYWR2ZXJiQEAuIjsKKyAgICB9CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogVmVyZmx1Y2hlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAidmVyZmx1Y2giOgorICAgIEhFTFBDSEVDSygidmVyZmx1Y2giKTsKKyAgICBpZiAoIXN0cikKKyAgICAgIFJldHVybigiV2VuIG9kZXIgd2FzIHdpbGxzdCBEdSBkZW5uIHZlcmZsdWNoZW4/XG4iKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoIXdobykgIHsKKyAgICAgIG91dF9zZWw9IkR1IHZlcmZsdWNoc3QgIitzdHIrIi4iOworICAgICAgb3V0X290aD0iQEBnbmFtZUBAIHZlcmZsdWNodCAiK3N0cisiLiI7CisgICAgfQorICAgIGVsc2UgIHsKKyAgICAgIGlmICh3aG89PXRoaXNfcGxheWVyKCkpCisgICAgICAgIFJldHVybigiU2ljaCBzZWxiZXIgdmVyZmx1Y2h0IG1hbiBiZXNzZXIgbmljaHQuLi5cbiIpOworICAgICAgaWYgKCFhZHZlcmIpICB7CisgICAgICAgIGZsYWc9c3NjYW5mKHN0ciwgIiVzICVzIiwgc3RyMSxzdHIyKTsKKyAgICAgICAgb3V0X3NlbD0iRHUgdmVyZmx1Y2hzdEBAIHdlbkBAIisoZmxhZz09MiA/ICIgIitzdHIyIDogIiIpKyIuIjsKKyAgICAgICAgb3V0X3ZpYz0iQEBnbmFtZUBAIHZlcmZsdWNodCBEaWNoIisoZmxhZz09Mj8iICIrc3RyMiA6ICIiKSsiLiI7CisgICAgICAgIG91dF9vdGg9IkBAZ25hbWVAQCB2ZXJmbHVjaHRAQCB3ZW5AQCIrKGZsYWc9PTIgPyAiICIrc3RyMiA6ICIiKSsiLiI7CisgICAgICB9CisgICAgICBlbHNlICB7CisgICAgICAgIG91dF9zZWw9IkR1IHZlcmZsdWNoc3RAQCB3ZW5AQEBAYWR2ZXJiQEAuIjsKKyAgICAgICAgb3V0X3ZpYz0iQEBnbmFtZUBAIHZlcmZsdWNodCBEaWNoQEBhZHZlcmJAQC4iOworICAgICAgICBvdXRfb3RoPSJAQGduYW1lQEAgdmVyZmx1Y2h0QEAgd2VuQEBAQGFkdmVyYkBALiI7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIFZlcm5laWdlbiAvIFZlcmJldWdlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAidmVybmVpZyI6CisgICAgY2FzZSAidmVyYmV1ZyI6CisgICAgSEVMUENIRUNLKCJ2ZXJuZWlnIik7CisgICAgR0hPU1RDSEVDSygiRHUgdmVybmVpZ3N0IERpY2ggZWluIGJpc3NjaGVuIGhlZnRpZyAtIERlaW4gS29wZiB0YXVjaHQgIgorICAgICAgICArImt1cnogaW4gZGVuIEJvZGVuLlxuIiwKKyAgICAgIGduYW1lKCkrIiB2ZXJuZWlndCBzaWNoLiBFaW4gYmlzc2NoZW4gaGVmdGlnIC0gIitRUFAoTUFMRSxXRVIpCisgICAgICAgICsiIEtvcGZcbnRhdWNodCBrdXJ6IGluIGRlbiBCb2RlbiBlaW4uXG4iLCAwKTsKKyAgICBpZiAoKCFzdHIpIHx8IChzdHIgPT0gImRpY2giKSkgeworICAgICAgb3V0X3NlbD0iRHUgdmVybmVpZ3N0IERpY2ggdm9yIGRlbiBBbndlc2VuZGVuLiI7CisgICAgICBvdXRfb3RoPSJAQG5hbWVAQCB2ZXJuZWlndCBzaWNoIGFubXV0aWcuIjsKKyAgICB9CisgICAgZWxzZSAgeworICAgICAgUGFyc2VSZXN0KHN0cik7CisgICAgICBpZiAoZm9yX2FsbCkgIHsKKyAgICAgICAgb3V0X3NlbD0iRHUgdmVybmVpZ3N0IERpY2hAQGFkdmVyYkBAIHZvciBAQGFsbGVAQC4iOworICAgICAgICBvdXRfdmljPSJAQG5hbWVAQCB2ZXJuZWlndCBzaWNoQEBhZHZlcmJAQCB2b3IgQEBhbGxlQEAuIjsKKyAgICAgICAgcmV0dXJuIE1peGVkT3V0KFdFTSk7CisgICAgICB9CisgICAgICBpZiAoIXdobyAmJiAhYWR2ZXJiKQorICAgICAgICBSZXR1cm4oIlZlcm5laWdlIGRpY2ggaXJnZW5kd2llIG9kZXIgdm9yIGplbWFuZGVtLlxuIik7CisgICAgICBpZiAod2hvICYmIENoZWNrTGlmZShOT1RfU0VMRixOT1RfREVBRCwKKyAgICAgICAgIldpZSB3aWxsc3QgRHUgZGFzIGRlbm4gc2NoYWZmZW4/IiwKKyAgICAgICAgIlZvciBTYWNoZW4gd2lyZCBoaWVyIG5pY2h0IHZlcm5laWd0LCBrbGFyP1xuIikpCisgICAgICAgICAgcmV0dXJuIDE7CisgICAgICBvdXRfc2VsPSJEdSB2ZXJuZWlnc3QgRGljaEBAYWR2ZXJiQEAiKyh3aG8gPyAiIHZvciIgOiAiIikrIkBAIHdlbUBALiI7CisgICAgICBpZiAod2hvICkgb3V0X3ZpYz0iQEBuYW1lQEAgdmVybmVpZ3Qgc2ljaEBAYWR2ZXJiQEAgdm9yIERpci4iOworICAgICAgb3V0X290aD0iQEBuYW1lQEAgdmVybmVpZ3Qgc2ljaEBAYWR2ZXJiQEAiKyh3aG8gPyAiIHZvciIgOiAiIikKKyAgICAgICAgKyJAQCB3ZW1AQC4iOworICAgIH0KKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBWZXJuZWluZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgIm5laW4iOgorICAgIGNhc2UgIm5vZSI6CisgICAgSEVMUENIRUNLKCJuZWluIik7CisgICAgR0hPU1RDSEVDSygiRHUgc2NodWV0dGVsc3QgRGVpbmVuIEtvcGYgc28gaGVmdGlnLCBkYXNzIGVyIGt1cnogIgorICAgICAgICArImRhdm9uc2Nod2VidC5cbiIsCisgICAgICBnbmFtZSgpKyIgc2NodWV0dGVsdCBoZWZ0aWcgZGVuIEtvcGYuXG5TbyBoZWZ0aWcsIGRhc3MgZGllc2VyICIKKyAgICAgICAgKyJrdXJ6IGRhdm9uc2Nod2VidCB1bmQgd2llZGVyIGVpbmdlZmFuZ2VuIHdlcmRlbiBtdXNzLlxuIiwgMCk7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKHN0ciAmJiAhYWR2ZXJiKQorICAgICAgUmV0dXJuKCJTY2h1ZXR0bGUgd2llIGRlbiBLb3BmP1xuIik7CisgICAgb3V0X3NlbD0iRHUgc2NodWV0dGVsc3RAQGFkdmVyYkBAIGRlbiBLb3BmLiI7CisgICAgb3V0X290aD0iQEBuYW1lQEAgc2NodWV0dGVsdEBAYWR2ZXJiQEAgZGVuIEtvcGYuIjsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBXYWNrZWxuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJ3YWNrZWwiOgorICAgIGNhc2UgIndhY2tsIjoKKyAgICBIRUxQQ0hFQ0soIndhY2tlbCIpOworICAgIGlmIChnaG9zdCgpKQorICAgICAgUmV0dXJuKCJEYSBnaWJ0IGVzIG5pY2h0cyBtZWhyLCB3b21pdCBEdSB3YWNrZWxuIGthbm5zdC5cbiIpOworICAgIGlmIChzdHIpCisgICAgICBpZiAoc3Ryc3RyKHN0ciwgIm1pdCAiKT09MCkKKyAgICAgICAgc3NjYW5mKHN0ciwgIm1pdCAlcyIsIHNmb28pOworICAgICAgZWxzZSBpZiAoc3Ryc3RyKHN0ciwibWl0ICIpPjApICB7CisgICAgICAgIHNzY2FuZihzdHIsICIlcyBtaXQgJXMiLCBzZm9vLCBzZm9vKTsKKyAgICAgICAgZmxhZz0xOworICAgICAgfQorICAgIGlmIChzZm9vPT0iIikgc2Zvbz0wOworICAgIFBhcnNlUmVzdChzdHIsIChzZm9vID8gKGZsYWcgPyAiIG1pdCAiIDogIm1pdCAiKStzZm9vIDogMCkpOworICAgIGlmIChzdHIgJiYgIWFkdmVyYiAmJiAhc2ZvbykKKyAgICAgIFJldHVybigiV2Fja2xlIHdpZSBvZGVyIHdvbWl0P1xuIik7CisgICAgb3V0X3NlbD0iRHUgd2Fja2Vsc3RAQGFkdmVyYkBAIG1pdCAiKyhzZm9vID8gc2ZvbysiLiIgOiAiZGVtIEhpbnRlcm4uIik7CisgICAgb3V0X290aD0iQEBuYW1lQEAgd2Fja2VsdEBAYWR2ZXJiQEAgbWl0ICIKKyAgICAgICsoc2ZvbyA/IHNmb28rIi4iIDogUVBQKE1BTEUsV0VNKSsiIEhpbnRlcm4uIik7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogV2FlbHplbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAid2FlbHoiOgorICAgIEhFTFBDSEVDSygid2FlbHoiKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoc3RyICYmICFhZHZlcmIpCisgICAgICBSZXR1cm4oIldhZWx6ZSBEaWNoIHdpZSBhdWYgZGVtIEJvZGVuP1xuIik7CisgICAgb3V0X3NlbD0iRHUgd2FlbHp0IERpY2giKyhhZHZlcmIgPyAiQEBhZHZlcmJAQCIgOiAiIHZvciBMYWNoZW4iKQorICAgICAgKyIgYXVmIGRlbSBCb2Rlbi4iOworICAgIG91dF9vdGg9IkBAZ25hbWVAQCB3YWVsenQgc2ljaCIrKGFkdmVyYiA/ICJAQGFkdmVyYkBAIiA6ICIgdm9yIExhY2hlbiIpCisgICAgICArKGdob3N0KCkgPyAiIGltIiA6ICIgYXVmIGRlbSIpKyIgQm9kZW4uIjsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBXYXJ0ZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgIndhcnQiOgorICAgIEhFTFBDSEVDSygid2FydCIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmICghc3RyKSAgeworICAgICAgb3V0X3NlbD0iRHUgdGlwcHN0IG1pdCBkZW0gRnVzcyBhdWYgZGVuIEJvZGVuLiI7CisgICAgICBvdXRfb3RoPSJAQGduYW1lQEAgdGlwcHQgbWl0IGRlbSBGdXNzIGF1ZiBkZW4gQm9kZW4uIjsKKyAgICB9IGVsc2UgaWYgKCF3aG8gJiYgYWR2ZXJiKSAgeworICAgICAgb3V0X3NlbD0iRHUgd2FydGVzdEBAYWR2ZXJiQEAuIjsKKyAgICAgIG91dF9vdGg9IkBAZ25hbWVAQCB3YXJ0ZXRAQGFkdmVyYkBALiI7CisgICAgfSBlbHNlICB7CisgICAgICBvdXRfc2VsPSJEdSB3YXJ0ZXN0QEBhZHZlcmJAQCBhdWYgIisod2hvID8gIkBAd2VuQEAuIiA6IHN0cisiLiIpOworICAgICAgaWYgKHdobykgb3V0X3ZpYz0iQEBnbmFtZUBAIHdhcnRldEBAYWR2ZXJiQEAgYXVmIERpY2guIjsKKyAgICAgIG91dF9vdGg9IkBAZ25hbWVAQCB3YXJ0ZXRAQGFkdmVyYkBAIGF1ZiAiKyh3aG8gPyAiQEB3ZW5AQC4iIDogc3RyKyIuIik7CisgICAgfQorICAgIHJldHVybiBGZWVsSXQoKTsKKworI2lmZGVmIFdFQ0tFCisgICAgLyoqKioqKioqKioqKioqKiogV2Vja2VuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJ3ZWNrIjoKKyAgICBIRUxQQ0hFQ0soIndlY2siKTsKKyAgICBpZiAoUGFyc2VSZW1vdGUoc3RyKSkKKyAgICAgIHJldHVybiAxOworLy8gICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKCF3aG8pCisgICAgICBSZXR1cm4oIldlbiB3aWxsc3QgRHUgd2Vja2VuP1xuIik7CisgICAgaWYgKHNzY2FuZihzdHIsICIlcyAlcyIsIHNmb28sIHNmb28pPT0yKQorICAgICAgZmxhZz0xOworICAgIG91dF9zZWw9IkRlaW4gV2Vja2VyIGtsaW5nZWx0IGJlaSBAQHdlbUBAQEBhZHZlcmJAQCIKKyAgICAgICsoYWR2ZXJiID8gIi4iIDogKGZsYWcgPyAiOiAiK3Nmb28gOiAiLiIpKTsKKyAgICBvdXRfdmljPSIgIituYW1lKFdFU1NFTikrIiBXZWNrZXIga2xpbmdlbHQgYmVpIERpckBAYWR2ZXJiQEAiCisgICAgICArKGFkdmVyYiA/ICIuIiA6IChmbGFnID8gIjogIitzZm9vIDogIi4iKSk7CisgICAgb3V0X290aD0iQEBnbmFtZUBAIHdpcmZ0ICIrUVBQKE1BTEUsIFdFTikKKyAgICAgICsiIFdlY2tlckBAYWR2ZXJiQEAgbmFjaCBAQHdlbUBALiI7CisgICAgICAgICAgaWYgKCF3aG8tPlF1ZXJ5UHJvcChQX1ZJU1VBTEJFTEwpKQorICAgICAgICAgb3V0X3ZpY1swXT03OyAvLyBjaHIoNyk9PUJFTAorICAgICAgZWxzZSBvdXRfdmljPW91dF92aWNbMS4uXTsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisjZW5kaWYKKworICAgIC8qKioqKioqKioqKioqKioqIFdlaW5lbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAid2VpbiI6CisgICAgSEVMUENIRUNLKCJ3ZWluIik7CisgICAgR0hPU1RDSEVDSygiRXMgcmVpY2h0IGxlaWRlciBudXIgZnVlciBlaW4gcGFhciB3aW56aWdlIE5lYmVsd29lbGtjaGVuLCAiCisgICAgICAgICsibmljaHQgZnVlciBUcmFlbmVuLlxuIiwKKyAgICAgIGduYW1lKCkrIiB2ZXJ6aWVodCBkYXMgR2VzaWNodCB1bmQgZWluIHBhYXIgd2luemlnZSBOZWJlbC1cbiIKKyAgICAgICAgKyJ3b2Vsa2NoZW4gZW50ZmVybmVuIHNpY2ggdm9uIHNlaW5lbiBcIkF1Z2VuXCIuXG4iLCAwKTsKKyAgICBpZiAoIXN0cikgIHsKKyAgICAgIG91dF9zZWw9IldhYWFhYWghIER1IHdlaW5zdCBiaXR0ZXJsaWNoLiI7CisgICAgICBvdXRfb3RoPSJAQG5hbWVAQCBicmljaHQgaW4gVHJhZW5lbiBhdXMgdW5kIHdlaW50IGJpdHRlcmxpY2guIjsKKyAgICB9CisgICAgZWxzZSAgeworICAgICAgUGFyc2VSZXN0KHN0cik7CisgICAgICBpZiAoIXdobyAmJiAhYWR2ZXJiKQorICAgICAgICBSZXR1cm4oIldlaW5lIERpY2ggaXJnZW5kd2llIGJlaSBpcmdlbmR3ZW0gYXVzLCBhYmVyIG5pY2h0IHNvLlxuIik7CisgICAgICBpZiAod2hvICYmIENoZWNrTGlmZShOT1RfU0VMRixOT1RfREVBRCwKKyAgICAgICAgIkJlaSBzaWNoIHNlbGJlciBrYW5uIG1hbiBzaWNoIHNvIHNjaGxlY2h0IGF1c3dlaW5lbi4iLAorICAgICAgICAiQmVpIHdlbSB3aWxsc3QgRHUgRGljaCBhdXN3ZWluZW4/Pz8iKSkKKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgIGlmICh3aG8pICB7CisgICAgICAgIG91dF9zZWw9IkR1IHdlaW5zdCBEaWNoQEBhZHZlcmJAQCBiZWlAQCB3ZW1AQCBhdXMuIjsKKyAgICAgICAgb3V0X3ZpYz0iQEBuYW1lQEAgd2VpbnQgc2ljaEBAYWR2ZXJiQEAgYmVpIERpciBhdXMuIjsKKyAgICAgICAgb3V0X290aD0iQEBuYW1lQEAgd2VpbnQgc2ljaEBAYWR2ZXJiQEAgYmVpQEAgd2VtQEAgYXVzLiI7CisgICAgICB9CisgICAgICBlbHNlICB7CisgICAgICAgIG91dF9zZWw9IkR1IGJyaWNoc3QgaW4gVHJhZW5lbiBhdXMgdW5kIHdlaW5zdEBAYWR2ZXJiQEAuIjsKKyAgICAgICAgb3V0X290aD0iQEBuYW1lQEAgYnJpY2h0IGluIFRyYWVuZW4gYXVzIHVuZCB3ZWludEBAYWR2ZXJiQEAuIjsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogV2lua2VuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJ3aW5rIjoKKyAgICBIRUxQQ0hFQ0soIndpbmsiKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoZm9yX2FsbCkgIHsKKyAgICAgIG91dF9zZWw9IkR1IHdpbmtzdCBAQGFsbGVAQEBAYWR2ZXJiQEAgenUuIjsKKyAgICAgIG91dF92aWM9IkBAbmFtZUBAIHdpbmt0IEBAYWxsZUBAQEBhZHZlcmJAQCB6dS4iOworICAgICAgcmV0dXJuIE1peGVkT3V0KFdFTSk7CisgICAgfQorICAgIGlmICghd2hvICYmICFhZHZlcmIgJiYgc3RyKQorICAgICAgUmV0dXJuKCJWaWVsbGVpY2h0IHNvbGx0ZXN0IER1IGF1Y2ggc2FnZW4sIHdlbSBvZGVyIHdpZSBEdSAiCisgICAgICAgICsiKHp1KXdpbmtlbiB3aWxsc3QuXG4iKTsKKyAgICBpZiAod2hvICYmIENoZWNrTGlmZShOT1RfU0VMRiwgTk9UX0RFQUQsCisgICAgICAiV2luayBEaXIgbmljaHQgc2VsYmVyIHp1LiIsCisgICAgICAiRHUgbXVzc3Qgc2Nob24gZWluZW0gTGViZXdlc2VuIHp1d2lua2VuLiIpKQorICAgICAgICByZXR1cm4gMTsKKyAgICBvdXRfc2VsPSJEdSB3aW5rc3RAQCB3ZW1AQEBAYWR2ZXJiQEAiKyh3aG8gPyAiIHp1IiA6ICIiKSsiLiI7CisgICAgaWYgKHdobykgb3V0X3ZpYz0iQEBnbmFtZUBAIHdpbmt0IERpckBAYWR2ZXJiQEAgenUuIjsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAgd2lua3RAQCB3ZW1AQEBAYWR2ZXJiQEAiKyh3aG8gPyAiIHp1IiA6ICIiKSsiLiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogV3VlcmdlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAid3VlcmciOgorICAgIEhFTFBDSEVDSygid3VlcmciKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoc3RyICYmICF3aG8gJiYgIWFkdmVyYikKKyAgICAgIFJldHVybigiV3VlcmdlIHdlbiBvZGVyIHdpZT9cbiIpOworICAgIGlmICghd2hvKSAgeworICAgICAgb3V0X3NlbD0iRHUgZmFlbmdzdEBAYWR2ZXJiQEAgYW4genUgd3Vlcmdlbi4iOworICAgICAgb3V0X290aD0iQEBnbmFtZUBAIGZhZW5ndEBAYWR2ZXJiQEAgYW4genUgd3Vlcmdlbi4iOworICAgIH0gZWxzZSBpZiAoQ2hlY2tMaWZlKE5PVF9TRUxGLCBOT1RfREVBRCwKKyAgICAgICAgICAiRHUgd3VlcmdzdCBlaW4gYmlzY2hlbiBhbiBEaXIgcnVtLiBEaXIgd2lyZCBzY2huZWxsIGxhbmd3ZWlsaWcuIiwKKwkgICJXdWVyZyBsaWViZXIgZWluIExlYmV3ZXNlbi4iKSkgeworICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dF9zZWw9IkR1IHNwcmluZ3N0IEBAd2VuQEAgYW4gdW5kIGZhZW5nc3QgYW4sICIrd2hvLT5RdWVyeVByb25vdW4oV0VOKQorICAgICAgICArIkBAYWR2ZXJiQEAgenUgd3Vlcmdlbi4iOworICAgICAgb3V0X3ZpYz0iQEBnbmFtZUBAIHNwcmluZ3QgRGljaCBhdWYgZWlubWFsIGFuIHVuZCB3dWVyZ3QgRGljaEBAYWR2ZXJiQEAuIjsKKyAgICAgIG91dF9vdGg9IkBAZ25hbWVAQCBzcHJpbmd0IGF1ZiBlaW5tYWwgQEB3ZW5AQCBhbiB1bmQgd3Vlcmd0ICIKKyAgICAgICAgK3doby0+UXVlcnlQcm9ub3VuKFdFTikrIkBAYWR2ZXJiQEAuIjsKKyAgICB9CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogV3VuZGVybiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAid3VuZGVyIjoKKyAgICBIRUxQQ0hFQ0soInd1bmRlciIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmIChzdHIgJiYgIXdobyAmJiAhYWR2ZXJiKQorICAgICAgUmV0dXJuKCJXaWUgb2RlciB1ZWJlciB3ZW4gd2lsbHN0IER1IERpY2ggd3VuZGVybj9cbiIpOworICAgIG91dF9zZWw9IkR1IHd1bmRlcnN0IERpY2hAQGFkdmVyYkBAIisod2hvID8gIiB1ZWJlciBAQHdlbkBALiIgOiAiLiIpOworICAgIGlmICh3aG8pIG91dF92aWM9IkBAZ25hbWVAQCB3dW5kZXJ0IHNpY2hAQGFkdmVyYkBAIHVlYmVyIERpY2guIjsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAgd3VuZGVydCBzaWNoQEBhZHZlcmJAQCIrKHdobyA/ICIgdWViZXIgQEB3ZW5AQC4iIDogIi4iKTsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBXdXNjaGVsbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAid3VzY2hlbCI6CisgICAgY2FzZSAid3VzY2hsIjoKKyAgICBIRUxQQ0hFQ0soInd1c2NoZWwiKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoIXdobykKKyAgICAgIFJldHVybigiV2VuIHdpbGxzdCBEdSBkZW5uIHd1c2NoZWxuP1xuIik7CisgICAgaWYgKENoZWNrTGlmZSgwLE5PVF9ERUFELAorICAgICAgIiIsICJIbW0sIHNlaHIgdG90LiBOZSwgbGllYmVyIG5pY2h0LiIpKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAod2hvLT5RdWVyeVByb3AoUF9GUk9HKSkgIHsKKyAgICAgIHdyaXRlKCJEdSB2ZXJ3dXNjaGVsc3QuLi4gIGFlaC4uLiBobS4gRWluIEZyb3NjaCBoYXQgd29obCBuaXggIgorICAgICAgICArInp1bSBXdXNjaGVsbi5cbiIpOworICAgICAgcmV0dXJuIDE7CisgICAgfTsKKyAgICBHSE9TVENIRUNLKCJEdSB3aWxsc3QgIit3aG8tPm5hbWUoV0VOKSsiIHd1c2NoZWxuIC0gYWJlciBEZWluZSAiCisgICAgICAgICsiSGFlbmRlIGdlaGVuXG5nbGF0dCBkdXJjaCBkZW4gS29wZiBkdXJjaC5cbiIsCisgICAgICBnbmFtZSgpKyIgd2lsbCAiK3doby0+bmFtZShXRU4pKyIgZGVuIEtvcGYgd3VzY2hlbG4sIGFiZXIgIgorICAgICAgICArImRpZSBHZWlzdGVyLVxuaGFlbmRlIGdlaGVuIGdsYXR0IGR1cmNoIGRlbiBLb3BmIGR1cmNoLlxuIiwKKyAgICAgIGduYW1lKCkrIiB3aWxsIERpY2ggd3VzY2hlbG4sIGFiZXIgZGllc2UgR2Vpc3RlcmhhZW5kZSAiCisgICAgICAgICsiZ2VoZW5cbmdsYXR0IGR1cmNoIERlaW5lbiBLb3BmIGR1cmNoIC0gRHUgaGFzdCBlaW4gc2VsdHNhbWVzICIKKyAgICAgICAgKyJHZWZ1ZWhsIGRhYmVpLlxuIik7CisgICAgaWYgKG1lbWJlcigoeyJoaWdobGFuZGVyIiwiYm9pbmciLCJtaWV6ZSIsImZyZXVuZCJ9KSwgd2hvLT5xdWVyeV9yZWFsX25hbWUoKSk+LTEpCisgICAgICBzd2l0Y2ggKHdoby0+cXVlcnlfcmVhbF9uYW1lKCkpICB7CisgICAgICAgIGNhc2UgImhpZ2hsYW5kZXIiOiBzdHIxPSJGZWRlcm4iOyBicmVhazsKKyAgICAgICAgY2FzZSAiZnJldW5kIiAgICA6CisgICAgICAgIGNhc2UgIm1pZXplIiAgICAgOgorICAgICAgICBjYXNlICJib2luZyIgICAgIDogc3RyMT0iRmVsbCI7IGJyZWFrOworICAgICAgfQorICAgIGVsc2UgaWYgKHdoby0+aXNfY2xhc3NfbWVtYmVyKCh7Q0xfRFJBR09OLCBDTF9GSVNILCBDTF9SRVBUSUxFfSkpKQorICAgICAgc3RyMT0iU2NodXBwZW4iOworICAgIGVsc2UgaWYgKHdoby0+aXNfY2xhc3NfbWVtYmVyKCh7Q0xfQklSRCwgImVsc3RlciIsImdyZWlmIn0pKSkKKyAgICAgIHN0cjE9IkZlZGVybiI7CisgICAgZWxzZSBpZiAod2hvLT5pc19jbGFzc19tZW1iZXIoKHtDTF9NQU1NQUxfTEFORCxDTF9GRUxJTkUsInRpZ2VyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdGVpbmJlaXNzZXIiLCJrbnVkZGVsZWlzYmFlciJ9KSkpCisgICAgICBzdHIxPSJGZWxsIjsKKyAgICBlbHNlIHN0cjE9IkhhYXJlIjsKKyAgICBvdXRfc2VsPSJEdSB2ZXJ3dXNjaGVsc3RAQGFkdmVyYkBAIEBAd2Vzc2VuQEAgIitzdHIxKyIuIjsKKyAgICBvdXRfdmljPSJAQG5hbWVAQCB2ZXJ3dXNjaGVsdEBAYWR2ZXJiQEAgRGVpbiIKKyAgICAgICsoc3RyMT09IkZlbGwiID8gIiAiIDogImUgIikrc3RyMSsiLiI7CisgICAgb3V0X290aD0iQEBuYW1lQEAgdmVyd3VzY2hlbHRAQGFkdmVyYkBAIEBAd2Vzc2VuQEAgIitzdHIxKyIuIjsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBaaXRpZXJlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAieml0aWVyIjoKKyAgICBIRUxQQ0hFQ0soInppdGllciIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmICghc3RyKQorICAgICAgUmV0dXJuKCJaaXRpZXJlIHdhcyBvZGVyIHdlbiB3b21pdD9cbiIpOworICAgIHNmb289aW1wbG9kZShleHBsb2RlKHN0ciwgIiAiKVsxLi5dLCAiICIpOworICAgIGlmIChzZm9vPT0iIikgc2Zvbz0wOworICAgIGlmICh3aG8pICB7CisgICAgICBvdXRfc2VsPSJEdSB6aXRpZXJzdCBAQHdlbkBAIisoc2ZvbyA/ICI6IFwiIitzZm9vKyJcIiIgOiAiIikrIi4iOworICAgICAgb3V0X3ZpYz0iQEBnbmFtZUBAIHppdGllcnQgRGljaCIrKHNmb28gPyAiOiBcIiIrc2ZvbysiXCIiIDogIiIpKyIuIjsKKyAgICAgIG91dF9vdGg9IkBAZ25hbWVAQCB6aXRpZXJ0IEBAd2VuQEAiKyhzZm9vID8gIjogXCIiK3Nmb28rIlwiIiA6ICIiKSsiLiI7CisgICAgfQorICAgIGVsc2UgIHsKKyAgICAgIHNmb289ZXhwbG9kZShzdHIsICIvIilbMF07CisgICAgICBvdXRfc2VsPSJEdSB6aXRpZXJzdEBAYWR2ZXJiQEAiKyhzZm9vID8gIjogXCIiK3Nmb28rIlwiIiA6ICIiKSsiLiI7CisgICAgICBvdXRfb3RoPSJAQGduYW1lQEAgeml0aWVydEBAYWR2ZXJiQEAiKyhzZm9vID8gIjogXCIiK3Nmb28rIlwiIiA6ICIiKSsiLiI7CisgICAgfQorICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIFppdHRlcm4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgInppdHRlciI6CisgICAgSEVMUENIRUNLKCJ6aXR0ZXIiKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoc3RyICYmICFhZHZlcmIpCisgICAgICBSZXR1cm4oIlppdHRlcmUgd2llP1xuIik7CisgICAgb3V0X3NlbD0iRHUgeml0dGVyc3QiKyhhZHZlcmIgPyAiQEBhZHZlcmJAQC4iIDogIiB2b3IgQW5nc3QuIik7CisgICAgb3V0X290aD0iQEBnbmFtZUBAIHppdHRlcnQiKyhhZHZlcmIgPyAiQEBhZHZlcmJAQC4iIDogIiB2b3IgQW5nc3QuIik7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogU2NodWx0ZXJ6dWNrZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgInp1Y2siIDoKKyAgICBIRUxQQ0hFQ0soInp1Y2siKTsKKyAgICAgICAgICBpZiAoc3RyKQorICAgICAgaWYgKHNzY2FuZihzdHIsIiVzIG1pdCBkZW4gc2NodWx0ZXJuIixzZm9vKSkKKyAgICAgICAgc3RyPXNmb287CisgICAgZWxzZSBpZiAoc3NjYW5mKHN0ciwiJXMgZGVuIHNjaHVsdGVybiIsc2ZvbykpCisgICAgICBzdHI9c2ZvbzsKKyAgICBlbHNlCisgICAgICBpZiAoc3NjYW5mKHN0ciwiJXMgc2NodWx0ZXJuIixzZm9vKSkKKyAgICAgICAgc3RyPXNmb287CisgICAgaWYgKHN0cj09IiIpIHN0cj0wOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmIChzdHIgJiYgIWFkdmVyYikKKyAgICAgIFJldHVybigiWnVja2Ugd2llIG1pdCBkZW4gU2NodWx0ZXJuP1xuIik7CisgICAgb3V0X3NlbD0iRHUgenVja3N0QEBhZHZlcmJAQCBtaXQgZGVuIFNjaHVsdGVybi4iOworICAgIG91dF9vdGg9IkBAZ25hbWVAQCB6dWNrdCIrKGFkdmVyYiA/ICJAQGFkdmVyYkBAIiA6ICIgcmF0bG9zIikKKyAgICAgICAgICAgICsiIG1pdCBkZW4gU2NodWx0ZXJuLiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogWndpbmtlcm4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgInp3aW5rZXIiOgorICAgIEhFTFBDSEVDSygiendpbmtlciIpOworICAgIGlmIChnaG9zdCgpKQorICAgICAgUmV0dXJuKCJWZXJnaXNzIGVzIC0gZGFzIGlzdCBhbHMgR2Vpc3QgdmllbCB6dSB1bmF1ZmZhZWxsaWcsIGFscyBkYXNzXG4iCisgICAgICAgICsiZXMgYW5kZXJlIExldXRlIHNlaGVuIHd1ZXJkZW4uXG4iKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoc3RyICYmICF3aG8gJiYgIWFkdmVyYikKKyAgICAgIFJldHVybigiWndpbmtlcmUgd2llPyBad2lua2VyZSB3ZW0genU/XG4iKTsKKyAgICBpZiAod2hvICYmIENoZWNrTGlmZShOT1RfU0VMRixOT1RfREVBRCwKKyAgICAgICJEdSBrYW5uc3QgRGlyIG5pY2h0IHNlbGJlciB6dXp3aW5rZXJuLiIsCisgICAgICAiV2llc28gcmVhZ2llcnQgZGFzIERpbmcgZGEgbmljaHQgYXVmIERlaW4gWndpbmtlcm4/IElzdCBlcyBldHdhIHRvdD8iKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgb3V0X3NlbD0iRHUgendpbmtlcnN0QEAgd2VtQEBAQGFkdmVyYkBAIisod2hvID8gIiB6dS4iIDogIi4iKTsKKyAgICBpZiAod2hvKSBvdXRfdmljPSJAQG5hbWVAQCB6d2lua2VydCBEaXJAQGFkdmVyYkBAIHp1LiI7CisgICAgb3V0X290aD0iQEBuYW1lQEAgendpbmtlcnRAQCB3ZW1AQEBAYWR2ZXJiQEAiKyh3aG8gPyAiIHp1LiIgOiAiLiIpOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIFp1bmdlIHJhdXNzdHJlY2tlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAic3RyZWNrIjoKKyAgICBIRUxQQ0hFQ0soInN0cmVjayIpOworICAgIEdIT1NUQ0hFQ0soIlNvcnJ5LCBEdSBoYXN0IGtlaW5lIFp1bmdlIHp1bSBSYXVzc3RyZWNrZW4uXG4iLCIiLDApOworICAgIGlmICghc3RyKQorICAgICAgUmV0dXJuKCJTdHJlY2tlIHdhcyB3aWUgd2VtIHdvIHdhbm4gd2llc28/XG4iKTsKKyAgICBzdHI9bG93ZXJfY2FzZShzdHIpOworICAgIGlmIChzc2NhbmYoc3RyLCAiJXMgenVuZ2UgcmF1cyIsIHN0cjEpIT0xICYmCisgICAgc3NjYW5mKHN0ciwgIiVzIGRpZSB6dW5nZSByYXVzIiwgc3RyMSkhPTEpCisgICAgICBSZXR1cm4oIlN0cmVja2Ugd2FzIHdpZSB3ZW0gd28gd2FubiB3aWVzbz9cbiIpOworICAgIFBhcnNlUmVzdChzdHIxKTsKKyAgICBpZiAoZm9yX2FsbCkgIHsKKyAgICAgIG91dF9zZWw9IkR1IHN0cmVja3N0IEBAYWxsZUBAQEBhZHZlcmJAQCBkaWUgWnVuZ2UgcmF1cy4iOworICAgICAgb3V0X3ZpYz0iQEBuYW1lQEAgc3RyZWNrdCBAQGFsbGVAQEBAYWR2ZXJiQEAgZGllIFp1bmdlIHJhdXMuIjsKKyAgICAgIHJldHVybiBNaXhlZE91dChXRU0pOworICAgIH0KKyAgICBvdXRfc2VsPSJEdSBzdHJlY2tzdEBAIHdlbUBAQEBhZHZlcmJAQCBkaWUgWnVuZ2UgcmF1cy4iOworICAgIGlmICh3aG8pIG91dF92aWM9IkBAbmFtZUBAIHN0cmVja3QgRGlyQEBhZHZlcmJAQCBkaWUgWnVuZ2UgcmF1cy4iOworICAgIG91dF9vdGg9IkBAbmFtZUBAIHN0cmVja3RAQCB3ZW1AQEBAYWR2ZXJiQEAgZGllIFp1bmdlIHJhdXMuIjsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvLyBTcGV6aWFsc2FjaGVuIC0gR2Vpc3RlcnZlcmJlbiB1bmQgTWFnaWVydmVyYmVuCisKKyAgICAvKioqKioqKioqKioqKioqKiBSYXNzZWxuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJyYXNzZWwiOgorICAgIGNhc2UgInJhc3NsIjoKKyAgICBpZiAoIWdob3N0KCkpCisgICAgICBSZXR1cm4oIkRhcyBpc3QgbmljaHQgRGVpbiBGYWNoZ2ViaWV0IC0gRHUgYmlzdCBkb2NoIGtlaW4gR2Vpc3QhXG4iKTsKKyAgICBIRUxQQ0hFQ0soInJhc3NlbCIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmIChzdHIgJiYgIWFkdmVyYikKKyAgICAgIFJldHVybigiUmFzc2VsIHdpZT9cbiIpOworICAgIG91dF9zZWw9IkR1IHJhc3NlbHN0IisoYWR2ZXJiID8gIkBAYWR2ZXJiQEAiIDogIiBmdWVyY2h0ZXJsaWNoIikKKyAgICAgICsiIG1pdCBlaW5lciByb3N0aWdlbiBSYXNzZWxrZXR0ZSxcbiIKKyAgICAgICsiZGllIER1IGF1ZiBlaW5tYWwgZnVlciBlaW5lbiBNb21lbnQgaW4gZGVyIEhhbmQgaGFlbHRzdC4iOworICAgIG91dF9vdGg9IkBAZ25hbWVAQCBob2x0IGF1ZiBlaW5tYWwgZWluZSByb3N0aWdlIFJhc3NlbGtldHRlIGF1c1xuIgorICAgICAgKyJkZW0gTmljaHRzIHVuZCBmYWVuZ3QgYW4sIisoYWR2ZXJiID8gIkBAYWR2ZXJiQEAiIDogIiBmdWVyY2h0ZXJsaWNoIikKKyAgICAgICsiIGRhbWl0IHp1IHJhc3NlbG4uXG4iCisgICAgICArIkRhbmFjaCBpc3QgZGllIEtldHRlIGF1ZiBlaW5tYWwgd2llZGVyIHZlcnNjaHd1bmRlbi4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIEhldWxlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAiaGV1bCI6CisgICAgaWYgKCFnaG9zdCgpKQorICAgICAgUmV0dXJuKCJMYXNzIGRhcyBtYWwgZGVuIEZhY2hsZXV0ZW4gKGFsc28gZGVuIEdlaXN0ZXJuKS5cbiIpOworICAgIEhFTFBDSEVDSygiaGV1bCIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmIChzdHIgJiYgIWFkdmVyYikKKyAgICAgIFJldHVybigiSGV1bGUgd2llP1xuIik7CisgICAgb3V0X3NlbD0iRHUgaGV1bHN0IisoYWR2ZXJiID8gIkBAYWR2ZXJiQEAuIiA6ICIgc2NoYXVlcmxpY2guIik7CisgICAgb3V0X290aD0iQEBnbmFtZUBAIGhldWx0IisoYWR2ZXJiID8gIkBAYWR2ZXJiQEAuIiA6ICIgc2NoYXVlcmxpY2guIik7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogVHJldGVuICh0cmV0ZXQpICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJraWNrIjoKKyAgICBpZiAoIUlTX1dJWkFSRCh0aGlzX3BsYXllcigpKSkKKyAgICAgIHJldHVybiAwOworICAgIEhFTFBDSEVDSygia2ljayIpOworICAgIGlmICghc3RyKSAgeworICAgICAgR0hPU1RDSEVDSygiRGVpbiBGdXNzIGZhZWhydCBkdXJjaCBkaWUgYmVydWVobXRlIGxhbmd2ZXJnZXNzZW5lICIKKyAgICAgICAgICArInVuc2ljaHRiYXJlIFNjaGlsZGtyb2V0ZVxuaGluZHVyY2guXG4iLAorICAgICAgICBnbmFtZSgpKyIgd2lsbCBkaWUgYmVydWVobXRlIGxhbmd2ZXJnZXNzZW5lIHVuc2ljaHRiYXJlXG4iCisgICAgICAgICAgKyJTY2hpbGRrcm9ldGUgdHJldGVuLCBhYmVyICIrUVBQKE1BTEUsV0VSKQorICAgICAgICAgICsiIEZ1c3MgZmFlaHJ0IGR1cmNoIHNpZSBoaW5kdXJjaC5cbiIsIDApOworICAgICAgb3V0X3NlbD0iRHUgdHJldGVzdCBkaWUgYmVydWVobXRlIGxhbmd2ZXJnZXNzZW5lIHVuc2ljaHRiYXJlICIKKyAgICAgICAgKyJTY2hpbGRrcm9ldGUuIjsKKyAgICAgIG91dF9vdGg9IkBAbmFtZUBAIHRyZXRldCBkaWUgYmVydWVobXRlIGxhbmd2ZXJnZXNzZW5lIHVuc2ljaHRiYXJlICIKKyAgICAgICAgKyJTY2hpbGRrcm9ldGUuIjsKKyAgICB9CisgICAgZWxzZSAgeworICAgICAgUGFyc2VSZXN0KHN0cik7CisgICAgICBpZiAoZm9yX2FsbCkgIHsKKyAgICAgICAgb3V0X3NlbD0iRHUgdHJldGVzdCBAQGFsbGVAQEBAYWR2ZXJiQEAuIjsKKyAgICAgICAgb3V0X3ZpYz0iQEBuYW1lQEAgdHJldGV0IEBAYWxsZUBAQEBhZHZlcmJAQC4iOworICAgICAgICByZXR1cm4gTWl4ZWRPdXQoV0VOKTsKKyAgICAgIH0KKyAgICAgIGlmICghd2hvICYmICFhZHZlcmIpCisgICAgICAgIFJldHVybigiV2VubiBEdSBzY2hvbiB3YXMgbmFjaCBraWNrIHRpcHBzdCwgZGFubiBzYWcgbWlyIHdlbiAiCisgICAgICAgICAgKyJvZGVyIHdpZSBpY2hkYXMgc29sbC5cbiIpOworICAgICAgaWYgKHdobyAmJiBDaGVja0xpZmUoTk9UX1NFTEYsTk9UX0RFQUQsCisgICAgICAgICJEdSBzY2hhZmZzdCBlcyBuaWNodCwgRGlyIHNlbGJlciBpbiBkZW4gSGludGVybiB6dSB0cmV0ZW4uIiwKKyAgICAgICAgIlRvdGUgU2FjaGVuIHRyaXR0IG1hbiBuaWNodCBhdWNoIG5vY2ghIikpCisgICAgICAgICAgcmV0dXJuIDE7CisgICAgICBpZiAod2hvKSAgeworICAgICAgICBvdXRfc2VsPSJEdSB0cmV0ZXN0QEAgd2VuQEBAQGFkdmVyYkBALiI7CisgICAgICAgIGlmICh3aG8pIG91dF92aWM9IkBAZ25hbWVAQCB0cmV0ZXQgRGljaEBAYWR2ZXJiQEAuIjsKKyAgICAgICAgb3V0X290aD0iQEBnbmFtZUBAIHRyZXRldEBAIHdlbkBAQEBhZHZlcmJAQC4iOworICAgICAgfQorICAgICAgZWxzZSAgeworICAgICAgICBvdXRfc2VsPSJEdSB0cmV0ZXN0IGRpZSBiZXJ1ZWhtdGUgbGFuZ3Zlcmdlc3NlbmUgdW5zaWNodGJhcmUgIgorICAgICAgICAgICsiU2NoaWxka3JvZXRlQEBhZHZlcmJAQC4iOworICAgICAgICBvdXRfb3RoPSJAQGduYW1lQEAgdHJldGV0IGRpZSBiZXJ1ZWhtdGUgbGFuZ3Zlcmdlc3NlbmUgdW5zaWNodGJhcmUgIgorICAgICAgICAgICsiU2NoaWxka3JvZXRlXG5AQGFkdmVyYkBALiI7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqIE5hc3NzcHJpdHplbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAic3BsYXNoIjoKKyAgICBpZiAoIUlTX1dJWkFSRCh0aGlzX3BsYXllcigpKSAmJgorICAgICEoSVNfU0VFUih0aGlzX3BsYXllcigpKSAmJiBwcmVzZW50KCJTRUhFUlxuc3ByaXR6cGlzdG9sZSIsdGhpc19wbGF5ZXIoKSkpKQorICAgICAgcmV0dXJuIDA7CisgICAgSEVMUENIRUNLKCJzcGxhc2giKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoZm9yX2FsbCkgIHsKKyAgICAgIG91dF9zZWw9IkR1IHppZWhzdCBEZWluZSBXYXNzZXJwaXN0b2xlIHVuZCBzcHJpdHp0IEBAYWxsZUBAQEBhZHZlcmJAQCAiCisgICAgICAgICsicGF0c2NobmFzcy4iOworICAgICAgb3V0X3ZpYz0iQEBnbmFtZUBAIHppZWh0ICIrUVBQKEZFTUFMRSxXRU4pKyIgV2Fzc2VycGlzdG9sZSB1bmQgc3ByaXR6dFxuIgorICAgICAgICArIkBAYWxsZUBAQEBhZHZlcmJAQCBwYXRzY2huYXNzLiI7CisgICAgICByZXR1cm4gTWl4ZWRPdXQoV0VOKTsKKyAgICB9CisgICAgaWYgKCF3aG8pCisgICAgICBSZXR1cm4oIldlbiB3aWxsc3QgRHUgZGVubiBuYXNzbWFjaGVuP1xuIik7CisgICAgaWYgKHdobyA9PSB0aGlzX3BsYXllcigpKSAgeworICAgICAgb3V0X3NlbD0iU2FnIG1hbCwga29tbXN0IER1IERpciBuaWNodCBlaW4gYmlzc2NoZW4gZG9vZiB2b3I/XG4iCisgICAgICAgICsiRHUgemllaHN0IERlaW5lIFdhc3NlcnBpc3RvbGUgdW5kIHNwcml0enQgRGljaEBAYWR2ZXJiQEAgc2VsYmVyIHBhdHNjaG5hc3MuIjsKKyAgICAgIG91dF9vdGg9IkBAZ25hbWVAQCB6aWVodCAiK1FQUChGRU1BTEUsV0VOKSsiIFdhc3NlcnBpc3RvbGUgdW5kIHNwcml0enQgIgorICAgICAgICArInNpY2hAQGFkdmVyYkBAIGF1cyB1bmVyZmluZGxpY2hlbiBHcnVlbmRlbiBzZWxic3QgcGF0c2NobmFzcy4iOworICAgIH0KKyAgICBlbHNlICB7CisgICAgICBvdXRfc2VsPSJEdSB6aWVoc3QgRGVpbmUgV2Fzc2VycGlzdG9sZSB1bmQgc3ByaXR6dCBAQHdlbkBAQEBhZHZlcmJAQCAiCisgICAgICAgICsicGF0c2NobmFzcy4iOworICAgICAgb3V0X3ZpYz0iQEBnbmFtZUBAIHppZWh0ICIrUVBQKEZFTUFMRSxXRU4pKyIgV2Fzc2VycGlzdG9sZSB1bmQgc3ByaXR6dCAiCisgICAgICAgICsiRGljaEBAYWR2ZXJiQEAgcGF0c2NobmFzcy4iOworICAgICAgb3V0X290aD0iQEBnbmFtZUBAIHppZWh0ICIrUVBQKEZFTUFMRSxXRU4pKyIgV2Fzc2VycGlzdG9sZSB1bmQgc3ByaXR6dCAiCisgICAgICAgICsiQEB3ZW5AQEBAYWR2ZXJiQEAgcGF0c2NobmFzcy4iOworICAgIH0KKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBBbmZsYW1tZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImZsYW0iOgorICAgIGlmICghSVNfV0laQVJEKHRoaXNfcGxheWVyKCkpICYmCisgICAgIShJU19TRUVSKHRoaXNfcGxheWVyKCkpICYmIHByZXNlbnQoIlNFSEVSXG5mbGFtbWVud2VyZmVyIix0aGlzX3BsYXllcigpKSkpCisgICAgICByZXR1cm4gMDsKKyAgICBIRUxQQ0hFQ0soImZsYW1lIik7CisgICAgaWYgKGdob3N0KCkpCisgICAgICBSZXR1cm4oIkR1IGhhc3QgbGVpZGVyIGdyYWRlIERlaW5lbiBGbGFtbWVud2VyZmVyIG5pY2h0IGRhYmVpLlxuIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWZvbz0hcmFuZG9tKDcpOworICAgIGlmIChmb3JfYWxsKSAgeworICAgICAgb3V0X3NlbD0iRHUgaG9sc3QgYXVzIERlaW5lbiB0aWVmc3RlbiBUYXNjaGVuIChvZGVyIHdhcyB3ZWlzcyBkZW5uICIKKyAgICAgICAgKyJpY2ggd29oZXIpIERlaW5lblxuTW9yZ2VuR3JhdWVuIGhhbmRnZWFyYmVpdGV0ZW4gTWluaS1GbGFtbWVud2VyZmVyICIKKyAgICAgICAgKyIodG0pLCByaWNodGVzdCBpaG4gYXVzIHVuZC4uLlxuIgorICAgICAgICArKGlmb28gPyAic2NoYXVzdCBsZWljaHQgZnJ1c3RyaWVydCBhdWYgZGFzIFN0cmVpY2hob2x6LCBpbiBkYXMgIgorICAgICAgICAgICsiZXIgc2ljaCB2ZXJ3YW5kZWx0IGhhdC4iCisgICAgICAgIDogImZldWVyc3RAQGFkdmVyYkBAIGVpbmVuIHJpZXNpZ2VuIEZldWVyYmFsbCBhdWYgQEBhbGxlQEAgYWIuXG4iCisgICAgICAgICAgKyJFcyByaWVjaHQgYXVmIGVpbm1hbCBzbyB2ZXJicmFubnQgaGllci4uLiIpOworICAgICAgb3V0X3ZpYz0iQEBuYW1lQEAgaG9sdCBhdWYgZWlubWFsIGlyZ2VuZHdvaGVyIGVpbmVuIE1vcmdlbkdyYXVlbiAiCisgICAgICAgICsiaGFuZGdlYXJiZWl0ZXRlblxuTWluaS1GbGFtbWVud2VyZmVyICh0bSksIHJpY2h0ZXQgaWhuIGF1cyB1bmQuLi5cbiIKKyAgICAgICAgKyhpZm9vID8gInNjaGF1dCB6aWVtbGljaCBmcnVzdHJpZXJ0IGF1ZiBkYXMgU3RyZWljaGhvbHosIGluIGRhcyAiCisgICAgICAgICAgKyJzaWNoIGRhcyBEaW5nIHZlcndhbmRlbHQgaGF0LiIKKyAgICAgICAgOiAiZmV1ZXJ0QEBhZHZlcmJAQCBlaW5lbiByaWVzaWdlbiBGZXVlcmJhbGwgYXVmIEBAYWxsZUBAIGFiLlxuIgorICAgICAgICAgICsiRGlyIHdpcmQgc28gd2FybSB1bSdzIEhlcnouLi4iKTsKKyAgICAgIHJldHVybiBNaXhlZE91dChXRU4pOworICAgIH0KKyAgICBpZiAoIXdobykKKyAgICAgIFJldHVybigiV2VuIHdpbGxzdCBEdSBkZW5uIGFua29rZWxuP1xuIik7CisgICAgb3V0X3NlbD0iRHUgaG9sc3QgYXVzIERlaW5lbiB0aWVmc3RlbiBUYXNjaGVuIChvZGVyIHdhcyB3ZWlzcyBkZW5uICIKKyAgICAgICsiaWNoIHdvaGVyKSBEZWluZW5cbk1vcmdlbkdyYXVlbiBoYW5kZ2VhcmJlaXRldGVuIE1pbmktRmxhbW1lbndlcmZlciAiCisgICAgICArIih0bSksIHJpY2h0ZXN0IGlobiBhdXMgdW5kLi4uXG4iCisgICAgICArKGlmb28gPyAic2NoYXVzdCBsZWljaHQgZnJ1c3RyaWVydCBhdWYgZGFzIFN0cmVpY2hob2x6LCBpbiBkYXMgZXIgIgorICAgICAgICArInNpY2ggdmVyd2FuZGVsdCBoYXQuIgorICAgICAgOiAiZmV1ZXJzdEBAYWR2ZXJiQEAgZWluZW4gcmllc2lnZW4gRmV1ZXJiYWxsIGF1ZiBAQHdlbkBAIGFiLlxuIgorICAgICAgICArIkVzIHJpZWNodCBhdWYgZWlubWFsIHNvIHZlcmJyYW5udCBoaWVyLi4uIik7CisgICAgb3V0X3ZpYz0iQEBuYW1lQEAgaG9sdCBhdWYgZWlubWFsIGlyZ2VuZHdvaGVyIGVpbmVuIE1vcmdlbkdyYXVlbiAiCisgICAgICArImhhbmRnZWFyYmVpdGV0ZW5cbk1pbmktRmxhbW1lbndlcmZlciAodG0pLCByaWNodGV0IGlobiBhdWYgRGljaCAiCisgICAgICArImF1cyB1bmQuLi5cbiIKKyAgICAgICsoaWZvbyA/ICJzY2hhdXQgemllbWxpY2ggZnJ1c3RyaWVydCBhdWYgZGFzIFN0cmVpY2hob2x6LCBpbiBkYXMgIgorICAgICAgICArInNpY2ggZGFzIERpbmdcbnZlcndhbmRlbHQgaGF0LiIKKyAgICAgIDogImZldWVydEBAYWR2ZXJiQEAgZWluZW4gcmllc2lnZW4gRmV1ZXJiYWxsIGF1ZiBEaWNoIGFiLlxuIgorICAgICAgICArIkRpciB3aXJkIHNvIHdhcm0gdW1zIEhlcnouLi4iKTsKKyAgICBvdXRfb3RoPSJAQG5hbWVAQCBob2x0IGF1ZiBlaW5tYWwgaXJnZW5kd29oZXIgZWluZW4gTW9yZ2VuR3JhdWVuICIKKyAgICAgICsiaGFuZGdlYXJiZWl0ZXRlblxuTWluaS1GbGFtbWVud2VyZmVyICh0bSksIHJpY2h0ZXQgaWhuICIKKyAgICAgICsiYXVmQEAgd2VuQEAgYXVzIHVuZC4uLlxuIgorICAgICAgKyhpZm9vID8gInNjaGF1dCB6aWVtbGljaCBmcnVzdHJpZXJ0IGF1ZiBkYXMgU3RyZWljaGhvbHosIGluIGRhcyAiCisgICAgICAgICsic2ljaCBkYXMgRGluZ1xudmVyd2FuZGVsdCBoYXQuIgorICAgICAgOiAiZmV1ZXJ0QEBhZHZlcmJAQCBlaW5lbiByaWVzaWdlbiBGZXVlcmJhbGwgYXVmQEAgd2VuQEAgYWIuXG5FcyAiCisgICAgICAgICsicmllY2h0IGF1ZiBlaW5tYWwgaXJnZW5kd2llIHZlcmJyYW5udCBoaWVyIC4uLiIpOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8vIFNwZWNpYWwgMjogcmVtb3RlIHZlcmJzCisKKyAgICAvKioqKioqKioqKioqKioqKiBSZW1vdGUga251ZGRlbG4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgInJrbnVkZGVsIjoKKyAgICBjYXNlICJya251ZGRsIjoKKyAgICBIRUxQQ0hFQ0soInJrbnVkZGVsIik7CisgICAgaWYgKFBhcnNlUmVtb3RlKHN0cikpCisgICAgICByZXR1cm4gMTsKKyAgICBpZiAoIXdobykKKyAgICAgIFJldHVybigiS251ZGRsZSB3ZW4/XG4iKTsKKyAgICBpZiAoQ2hlY2tMaWZlKE5PVF9TRUxGLDAsCisgICAgICAiRGFzIGJyaW5ndCBkb2NoIG5peCwgbGFzcyBlcyBoYWx0LiIsCisgICAgICAwKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKHByZXNlbnQod2hvLCBlbnZpcm9ubWVudCgpKSkKKyAgICAgIFJldHVybigiV2VubiBqZW1hbmQgbmViZW4gRGlyIHN0ZWh0LCBuaW1tIGtudWRkZWwuXG4iKTsKKyAgICBvdXRfc2VsPSJEdSBrbnVkZGVsc3QgQEB3ZW5AQEBAYWR2ZXJiQEAgYXVzIGRlciBGZXJuZS4iOworICAgIG91dF92aWM9IkBAZ25hbWVAQCBrbnVkZGVsdCBEaWNoQEBhZHZlcmJAQCBhdXMgZGVyIEZlcm5lLiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogUmVtb3RlIHdpbmtlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAicndpbmsiOgorICAgIEhFTFBDSEVDSygicndpbmsiKTsKKyAgICBpZiAoUGFyc2VSZW1vdGUoc3RyKSkKKyAgICAgIHJldHVybiAxOworICAgIGlmICghd2hvKQorICAgICAgUmV0dXJuKCJXaW5rZSB3ZW0genU/XG4iKTsKKyAgICBpZiAoQ2hlY2tMaWZlKE5PVF9TRUxGLDAsCisgICAgICAiU2VociB3aXR6aWcuIFBhaC4iLCAwKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKHByZXNlbnQod2hvLCBlbnZpcm9ubWVudCgpKSkKKyAgICAgIFJldHVybigiV2VubiBqZW1hbmQgbmViZW4gRGlyIHN0ZWh0LCBuaW1tIHdpbmsuXG4iKTsKKyAgICBvdXRfc2VsPSJEdSB3aW5rc3QgQEB3ZW1AQEBAYWR2ZXJiQEAgYXVzIGRlciBGZXJuZSB6dS4iOworICAgIG91dF92aWM9IkBAZ25hbWVAQCB3aW5rdCBEaXJAQGFkdmVyYkBAIGF1cyBkZXIgRmVybmUgenUuIjsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBWZXJiZW5saXN0ZSAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAidmVyYiI6CisgICAgY2FzZSAidmVyYmVuIjoKKyAgICBIRUxQQ0hFQ0soInZlcmIiKTsKKyAgICBNb3JlKFNPVUxIRUxQLT5IZWxwKCkpOworICAgIHJldHVybiAxOworCisgICAgLyoqKioqKioqKioqKioqKiogQWR2ZXJiaWVudmVyd2FsdHVuZyAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAiYWR2ZXJiIjoKKyAgICBjYXNlICJhZHZlcmJlbiI6CisgICAgY2FzZSAiYWR2ZXJiaWVuIjogeyAgIC8qIERhcyBpc3QgZGllIHJpY2h0aWdlIEZvcm0sIGFiZXIgd2VyIHdlaXNzIGRhcz8gKi8KKyAgICBzdHJpbmcgZjEsZjI7CisgICAgSEVMUENIRUNLKCJhZHZlcmIiKTsKKyAgICBpZiAoIXN0ciB8fCBzdHI9PSIjIiB8fCBzdHI9PSIkIikKKyAgICAgIHJldHVybiB6ZWlnZV9hZHZlcmJzKChzdHI9PSIjIiA/IDEgOiAoc3RyPT0iJCIgPyAyIDogMCkpKTsKKyAgICBpZiAoc3NjYW5mKHN0ciwgIiVzICVzIiwgZjEsZjIpPT0yKSAgeworICAgICAgZjEgPSBsb3dlcl9jYXNlKGYxKTsgLy8ga2xlaW5nZXNjaHJpZWJlbiBzcGVpY2hlcm4sIHNwYXJ0IFVtd2FuZGx1bmcKKyAgICAgIGlmIChmMT09IiIpCisgICAgICAgIFJldHVybigiSG0sIGRhIG11c3Mgd29obCBlaW4gTGVlcnplaWNoZW4genUgdmllbCBnZXdlc2VuIHNlaW4uIEJpdHRlICIKKyAgICAgICAgICArIm5vY2htYWwsXG5hYmVyIG9obmUgenV2aWVsZSBMZWVyemVpY2hlbi5cbiIpOworICAgICAgaWYgKGYxPT0iPyIpICB7CisgICAgICAgIGYyID0gbG93ZXJfY2FzZShmMik7CisgICAgICAgIHN0cmluZyBtYXRjaDsKKyAgICAgICAgaWYgKChtYXRjaD1RdWVyeVN0ZEFkdmVyYnMoKVtmMl0gfHwgcGxyX2FkdmVyYnNbZjJdKSkKKyAgICAgICAgICB3cml0ZSgiRGllIEFia3Vlcnp1bmcgIitmMisiIGdlaG9lcnQgenUgZGVtIEFkdmVyYjpcbiIrbWF0Y2grTEYpOworICAgICAgICBlbHNlCisgICAgICAgICAgd3JpdGUoIkRpZXNlIEFia3Vlcnp1bmcgaXN0IGJpc2hlciBuaWNodCBkZWZpbmllcnQuXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgICBpZiAoUXVlcnlTdGRBZHZlcmJzKClbZjFdKQorICAgICAgICBSZXR1cm4oIkRpZSBTdGFuZGFyZGFia3Vlcnp1bmdlbiBrb2VubmVuIG5pY2h0IG5ldSBkZWZpbmllcnQgIgorICAgICAgICAgICsid2VyZGVuLlxuIik7CisgICAgICBpZiAoc2l6ZW9mKHBscl9hZHZlcmJzKT49MTAwKSAKKyAgICAgIHsKKyAgICAgICAgd3JpdGUoIk1laHIgYWxzIDEwMCBlaWdlbmUgQWR2ZXJiaWVuIGthbm5zdCBEdSBuaWNodCBkZWZpbmllcmVuLlxuIik7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgICAgaWYgKHBscl9hZHZlcmJzW2YxXSkgIHsKKyAgICAgICAgcGxyX2FkdmVyYnNbZjFdPWYyOworICAgICAgICB3cml0ZSgiT0ssIEFkdmVyYiBtaXQgZGVyIEFia3Vlcnp1bmcgXCIiK2YxKyJcIiBhdWYgXCIiK2YyCisgICAgICAgICAgKyJcIiBnZXNldHp0LlxuIik7CisgICAgICB9CisgICAgICBlbHNlICB7CisgICAgICAgIGlmIChzaXplb2YoZjEpID4gNikKKyAgICAgICAgICBSZXR1cm4oIkRpZSBBYmt1ZXJ6dW5nIGlzdCB6dSBsYW5nLCBiaXR0ZSBuaWNodCBtZWhyIGFscyAiCisgICAgICAgICAgICArIjYgWmVpY2hlbi5cbiIpOworICAgICAgICBwbHJfYWR2ZXJic1tmMV09ZjI7CisgICAgICAgIHdyaXRlKCJPSywgbmV1ZXMgQWR2ZXJiIFwiIitmMisiXCIgbWl0IGRlciBBYmt1ZXJ6dW5nIFwiIitmMSsiXCIuXG4iKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSAgeworICAgICAgc3RyID0gbG93ZXJfY2FzZShzdHIpOworICAgICAgaWYgKFF1ZXJ5U3RkQWR2ZXJicygpW3N0cl0pCisgICAgICAgIFJldHVybigiRGllIFN0YW5kYXJkYWR2ZXJiZW4ga29lbm5lbiBuaWNodCBnZWxvZXNjaHQgd2VyZGVuLlxuIik7CisgICAgICBlbHNlIGlmICghcGxyX2FkdmVyYnNbc3RyXSkKKyAgICAgICAgUmV0dXJuKCJEdSBoYXN0IGtlaW4gQWR2ZXJiIG1pdCBkaWVzZXIgQWJrdWVyenVuZy5cbiIKKyAgICAgICAgICArIlN5bnRheDogYWR2ZXJiLCB1bSBkaWUgQWR2ZXJiaWVuIGFuenV6ZWlnZW4sXG4iCisgICAgICAgICAgKyIgICAgICAgIGFkdmVyYiAjLCB1bSBudXIgRGVpbmUgQWR2ZXJiaWVuIGFuenV6ZWlnZW4sXG4iCisgICAgICAgICAgKyIgICAgICAgIGFkdmVyYiAkLCB1bSBudXIgZGllIFN0YW5kYXJkYWR2ZXJiaWVuIGFuenV6ZWlnZW4sXG4iCisgICAgICAgICAgKyIgICAgICAgIGFkdmVyYiA/IDxBYmt1ZXJ6dW5nPiwgdW0gbmFjaHp1c2VoZW4sIG9iIDxBYmt1ZXJ6dW5nPiAiCisgICAgICAgICAgICArImRlZmluaWVydCBpc3QsXG4iCisgICAgICAgICAgKyIgICAgICAgIGFkdmVyYiA8QWJrdWVyenVuZz4gPEFkdmVyYj4sIHVtIGRlciA8QWJrdWVyenVuZz4gZGFzICIKKyAgICAgICAgICAgICsiPEFkdmVyYj5cbiIKKyAgICAgICAgICArIiAgICAgICAgICAgICAgIHp1enVvcmRuZW4sXG4iCisgICAgICAgICAgKyIgICAgICAgIGFkdmVyYiA8QWJrdWVyenVuZz4sIHVtIGRhcyBBZHZlcmIgbWl0IGRlciA8QWJrdWVyenVuZz4gIgorICAgICAgICAgICAgKyJ6dSBsb2VzY2hlbixcbiIpOworICAgICAgZWxzZSAgeworICAgICAgICB3cml0ZSgiT0ssIEFkdmVyYiBcIiIrcGxyX2FkdmVyYnNbc3RyXSsiXCIgZ2Vsb2VzY2h0LlxuIik7CisgICAgICAgIHBscl9hZHZlcmJzPW1fY29weV9kZWxldGUocGxyX2FkdmVyYnMsIHN0cik7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiAxOyAKKyAgICB9CisgIH0KKyAgcmV0dXJuKDApOyAgLy9mYWxsdGhyb3VnaAorfQorCmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL3NvdWxoZWxwLmMgYi9zdGQvcGxheWVyL3NvdWxoZWxwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdhNDhmOQotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvc291bGhlbHAuYwpAQCAtMCwwICsxLDMxNyBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHBsYXllci9zb3VsaGVscC5jIC0tIEhpbGZlIHp1IGRlbiBTb3Vsa29tbWFuZG9zCisvLworLy8gJElkOiBzb3VsaGVscC5jIDc0MjMgMjAxMC0wMi0wNyAyMjo1NjozOFogWmVzc3RyYSAkCisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHNhdmVfdHlwZXMKKworI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2lmZGVmIFdFQ0tFCisjdW5kZWYgV0VDS0UKKyNlbmRpZgorI2RlZmluZSBXRUNLRQorCitzdGF0aWMgc3RyaW5nICp3aXpjbWRzLCAqcGxyY21kcywgKmdob3N0Y21kczsKK3N0YXRpYyBtYXBwaW5nIGhlbHA7CisKK3ByaXZhdGUgc3RyaW5nIEhlbHBWZXJiKHN0cmluZyB2KTsKK3ByaXZhdGUgc3RyaW5nKiBTb3J0SXQoc3RyaW5nICphcnIpOworCisKKy8qKgorICBJbml0aWFsaXNpZXJ1bmcKKyovCit2b2lkIGNyZWF0ZSgpICB7CisJcGxyY21kcz0oeworCQkienVjayIsICJzY2htaWVnIiwgImFudHdvcnRlIiwgImFwcGxhdWRpZXJlIiwKKwkJImJldGFzdGUiLCAiY2xzIiwgImRyZWhlIChkYWV1bWNoZW4pIiwgImRhbmtlIiwKKwkJImRydWVja2UiLCAiZXJyb2V0ZSIsICJmbGlwcGUiLCAiZnJhZ2UiLAorCQkiZnVyemUiLCAiZ2FlaG5lIiwgImdsdWNrc2UiLCAiZ3JpbnNlIiwKKwkJImd1Y2siLCAiaGFldHNjaGVsIiwgImhpY2tzZSIsICJodWVwZmUiLAorCQkiaHVzdGUiLCAia2V1Y2hlIiwgImtpY2hlcmUiLCAia2xhdHNjaGUiLAorCQkia25hYmJlcmUiLCAia25pY2tzZSIsICJrbmlyc2NoZSIsICJrbnVycmUiLAorCQkia251dHNjaGUiLCAia290emUiLCAia3Vlc3NlIiwgImxhY2hlIiwKKwkJImxhZWNobGUiLCAibGllYmUiLCAibmlja2UiLCAibmllc2UiLAorCQkiZ2liIiwgInBmZWlmZSIsICJydWVscHNlIiwgInJ1bnpsZSIsCisJCSJzY2htb2xsZSIsICJzY2htdW56bGUiLCAic2NobmlwcGUiLCAic2NobmFyY2hlIiwKKwkJInNjaG51cnJlIiwgInNjaHJlaWUiLCAic2NodWV0dGxlIiwgInNldWZ6ZSIsCisJCSJzaW5nZSIsICJzbmllZmUvc2NobmllZmUiLCAic3B1Y2tlIiwgInN0YXJyZSIsCisJCSJzdGF1bmUiLCAic3RpZXJlIiwgInN0b2VobmUiLCAic3Rvc3NlIiwKKwkJInN0cmVpY2hsZSIsICJ0YW56ZSIsICJ0cml0dCIsICJ0cm9lc3RlIiwKKwkJInVtYXJtZSIsICJ2ZXJuZWlnZSIsICJ3YWNrbGUiLCAid2FlbHplIiwKKwkJIndlaW5lIiwgIndpbmtlIiwgInp3aW5rZXJlIiwgInZlcmJlbiIsCisJCSJhZWNoemUiLCAiZXJibGVpY2hlIiwgImZsdWNoZSIsICJ2ZXJmbHVjaGUiLAorCQkia2l0emxlIiwgIm5laW4iLCAiZGV1dGUiLCAvLyAiemVpZ2UiLAorCQkiZGVua2UgW3RleHRdIiwgImtudWRkbGUiLCAidGFldHNjaGVsIiwgInd1c2NoZWwiLAorCQkic3RyZWNrZSAuLi4gW2RpZV0genVuZ2UgcmF1cyIsICJrcmF0eiIsCisJCSJncnVtbWVsIiwgImp1YmVsIC8ganVibGUgLi4uIFt6dV0iLCAid3VlcmciLAorCQkiZ3JhdHVsaWVyZSAvIGJlZ2x1ZWNrd3VlbnNjaGUiLCAicmFldXNwZXIiLAorCQkiYXJnbCIsICJyb3RmbCIsICJncnVueiIsICJrdXNjaGVsIiwgImF0bWUgLi4uIGF1ZiIsCisJCSJmcmV1ZSIsICJzbmlmZiIsICJncnVlYmxlIiwgImJvaHJlIC4uLiBbaW4gZGVyIG5hc2VdIiwKKwkJInB1dHplIFtuYXNlXSIsICJiaWJiZXJlIiwgInF1aWV0c2NoZS9xdWlla2UiLCAic2NobHVjaHplIiwKKwkJInNjaG5hdWZlIiwgInNjaG5hdWJlIiwgInBoaWxvc29waGllcmUiLCAic2FiYmVyZSIsCisJCSJzdGltbWUgWy4uLl0genUiLCAia3JpZWNoZSIsICJtdXN0ZXJlIiwgInNjaGFlbWUiLAorCQkic2NobmFsemUgLi4uIFt6dW5nZV0iLCAic3RhbXBmZSAuLi4gW2F1Zl0iLCAieml0aWVyZSIsICJsb2JlIiwKKwkJInF1YWtlIiwgInJlaWJlIC4uLiBbZGllXSBBdWdlbnxIYWVuZGUiLCAic3R1dHplIiwgInNjaHdlaWdlIiwKKwkJImtsb3BmZSIsICJ3dW5kZXJlIiwgInN0dXBzZSIsICJicnVtbWVsIiwgImVudHNjaHVsZGlnZSIsCisJCSJtb3BwZXIiLCAiemVpZ2UiLCAidHJhZXVtZSIsICJiZWdydWVzc2UiLCJqYW1tZXIiLAorCX0pOworI2lmZGVmIFdFQ0tFCisJcGxyY21kcys9KHsid2Vja2UifSk7CisjZW5kaWYKKwl3aXpjbWRzPSh7CisJCSJraWNrIiwgInNwbGFzaCIsICJmbGFtZSIsCisJfSk7CisJZ2hvc3RjbWRzPSh7CisJCSJyYXNzZWwvcmFzc2xlIiwgImhldWxlIiwgImVyc2NocmVja2UiLAorCX0pOworCS8vIEF1ZmJhdSBkZXMgaGVscC1tYXBwaW5nczoKKwkvLyBrZXkgICAgOiBWZXJiLCB3aWUgZXMgaW4gc291bC5jIGluIENIRUNLX0hFTFAgZ2VzY2hyaWViZW4gaXN0CisJLy8gZW50cnkgMTogJm4gPSBbPE5hbWU+XSAgICZhID0gWzxBZHZlcmI+XSAgICAmdD1bPFRleHQ+fQorCS8vICAgICAgICAgICEgZGFuYWNoIGhlaXNzdCBub2V0aWdlIEFuZ2FiZSwgYWxzbyBvaG5lIFtdCisJLy8gZW50cnkgMjogJmcgPSBWZXJoYWVsdCBzaWNoIGJlaSBHZWlzdGVybiBhbmRlcnMKKwkvLyAgICAgICAgICAmYSA9IE1hbiBrYW5uICJhbGxlIiBhbHMgWmllbCBhbmdlYmVuCisJLy8gICAgICAgICAgJmQgPSBEZWZhdWx0YWR2ZXJiOyBtdXNzIGFtIEVuZGUgYW5nZWdlYmVuIHdlcmRlbgorCWhlbHA9KFsKKwkJInp1Y2siIDogIiZhIFtbbWl0IFtkZW5dXSBzY2h1bHRlcm5dIjsgIkdpYnQgbWFuIG5pY2h0IG1pbmRlc3RlbnMgIgorCQkJKyJcInNjaHVsdGVyblwiIGFuLCBzbyB6dWNrdCBtYW4genVzYW1tZW4uIERhcyBEZWZhdWx0YWR2ZXJiIGdpbHQgIgorCQkJKyJudXIgZnVlciBkYXMgU2NodWx0ZXJ6dWNrZW4uJmRyYXRsb3MiLAorCQkic2NobWllZyIgOiAiJm4gJmEiOyAiIiwKKwkJImFudHdvcnQiIDogIiZuICZ0ISI7ICIiLAorCQkiYXBwbGF1ZGllciIgOiAiJm4gJmEiOyAiJmcmYSIsCisJCSJiZWdydWVzcyIgOiAiJm4hICZhIjsgIiIsCisJCSJiZXRhc3QiIDogIiZuISAmYSI7ICIiLAorCQkiYmliYmVyIiA6ICImYSI7ICIiLAorCQkiYm9ociIgOiAiJmEgW1tpbiBbZGVyXV0gbmFzZV0iOyAiIiwKKwkJImJydW1tZWwiIDogIiZhIHwgJnQiOyAiIiwKKwkJImNscyIgOiAiIjsgIkxvZXNjaHQgZGVuIEJpbGRzY2hpcm0gYXVmIHZ0MTAwLWtvbXBhdGlibGVuIFRlcm1pbmFscy4iLAorCQkiZHJlaCIgOiAiJmEgW2RhZXVtY2hlbiB8IGRhdW1lbl0iOyAiIiwKKwkJImRhbmsiIDogIiZuISAmYSI7ICIiLAorCQkiZHJ1ZWNrIiA6ICImbiEgJmEiOyAiJmcmYSZkemFlcnRsaWNoIiwKKwkJImVudHNjaHVsZGlnIiA6ICImbiAmYSI7ICIiLAorCQkiZXJyb2V0IiA6ICImYSI7ICImZyIsCisJCSJlcnNjaHJlY2siIDogIiZuISAmYSI7ICImZyZkZnVlcmNodGVybGljaCIsCisJCSJmbGlwcCIgOiAiJmEiOyAiJmR0b3RhbCIsCisJCSJmcmFnIiA6ICImbiFbfF0mdCEiOyAiIiwKKwkJImZyZXUiIDogIiZuICZhIjsgIiIsCisJCSJmdXJ6IiA6ICImYSI7ICImZ0hpbnRlcmxhZXNzdCBlaW5lIGR1ZnRpZ2UgRXJpbm5lcnVuZyBpbSBSYXVtLiIsCisJCSJnYWVobiIgOiAiJmEiOyAiJmciLAorCQkiZ2x1Y2tzIiA6ICImYSI7ICImZHdpZSBlaW4gSHVobiIsCisJCSJncmF0dWxpZXIiIDogIiZuISAmYSI7ICIiLAorCQkiZ3JpbnMiIDogIiZuICZhIjsgIiZnJmEiLAorCQkiZ3J1ZWJlbCIgOiAiJmEiOyAiIiwKKwkJImdydW1tZWwiIDogIiZhIjsgIiIsCisJCSJndWNrIiA6ICImYSI7ICIiLAorCQkiaGFldHNjaGVsIiA6ICImbiEgJmEiOyAiJmcmYSIsCisJCSJoaWNrcyIgOiAiJmEiOyAiJmciLAorCQkiaHVlcGYiIDogIiZuICZhIjsgIiZnIiwKKwkJImh1c3QiIDogIiZuICZhIjsgIiZnIiwKKwkJImp1YmVsIiA6ICImbiAmYSI7ICIiLAorCQkiamFtbWVyIiA6ICImYSI7ICIiLAorCQkia2V1Y2giIDogIiZhIjsgIiZnJmR2b3IgQW5zdHJlbmd1bmciLAorCQkia2ljaGVyIiA6ICImbiAmYSI7ICIiLAorCQkia2xhdHNjaCIgOiAiJmEiOyAiJmciLAorCQkia2xvcGYiIDogIiZuISAmYSI7ICIiLAorCQkia25hYmJlciIgOiAiJm4hICZhIjsgIiZnIiwKKwkJImtuaWNrcyIgOiAiJm4gJmEiOyAiJmcmYSIsCisJCSJrbmlyc2NoIiA6ICImYSI7ICImZyIsCisJCSJrbnVyciIgOiAiJm4gJmEiOyAiJmEiLAorCQkia251dHNjaCIgOiAiJm4hICZhIjsgIiZnIiwKKwkJImtvdHoiIDogIiZuICZhIjsgIiZnIiwKKwkJImtyaWVjaCIgOiAiJm4gJmEiOyAiIiwKKwkJImt1ZXNzIiA6ICImbiEgJmEiOyAiJmdLYW5uIGF1c3NlcmRlbSBiZWkgYmVzdGltbXRlbiBHZWxlZ2VuaGVpdGVuICIKKwkJCSsiZ2V3aXNzZSBOZWJlbmVmZmVrdGUgaGFiZW4uIiwKKwkJImxhY2giIDogIiZuICZhIjsgIiZnJmEiLAorCQkibGFlY2hlbCIgOiAiJm4gJmEiOyAiJmcmYSIsCisJCSJsaWViIiA6ICImbiEgJmEiOyAiIiwKKwkJImxvYiIgOiAieyZuISAmYX0gfCAmdCEiOyAiS2FubiBlaW5lbiBOZWJlbmVmZmVrdCBoYWJlbi4iLAorCQkibW9wcGVyIiA6ICImYSI7ICIiLAorCQkibXVzdGVyIiA6ICImbiEgJmEiOyAiIiwKKwkJIm5pY2siIDogIiZuICZhIjsgIiZhJmR6dXN0aW1tZW5kIiwKKwkJIm5pZXMiIDogIiZhIjsgIiZnIiwKKwkJImdpYiIgOiAiJm4hICZhIFtbZWluZV0gb2hyZmVpZ2VdIjsgIiZnJmEiLAorCQkicGZlaWYiIDogIiZuICZhIFtuYWNoXSI7ICImZyZkYW5lcmtlbm5lbmQiLAorCQkicGhpbG9zb3BoaWVyIiA6ICImYSB8ICZ0IjsgIiIsCisJCSJwdXR6IiA6ICImYSBbW2RpZV0gbmFzZV0iOyAiIiwKKwkJInF1YWsiIDogIiZhIjsgIkdlaHQgYWxzIEZyb3NjaCB3ZXNlbnRsaWNoIGJlc3Nlci4iLAorCQkicXVpZWsiIDogIiZhIjsgIiZkdmVyZ251ZWd0IiwKKwkJInJhZXVzcGVyIiA6ICImYSI7ICIiLAorCQkicmVpYiIgOiAiJmEgW1tkaWVdIEF1Z2VuXSB8IFtbZGllXSBIYWVuZGVdIjsgIk9obmUgd2VpdGVyZSBBbmdhYmUgcmVpYnQgIgorCQkJKyJtYW4gc2ljaCBkaWUgQXVnZW47JmRtdWVkZSBiencuIHZlcmdudWVndCIsCisJCSJydWVscHMiIDogIiZhIjsgIiZnIiwKKwkJInJ1bnplbCIgOiAiJmEiOyAiJmciLAorCQkic2FiYmVyIiA6ICImbiAmYSI7ICIiLAorCQkic2NoYWVtIiA6ICImYSI7ICIiLAorCQkic2NobHVjaHoiIDogIiZhIjsgIiZkaGVyenplcnJlaXNzZW5kIiwKKwkJInNjaG1vbGwiIDogIiZhIjsgIiZnIiwKKwkJInNjaG11bnplbCIgOiAiJmEiOyAiIiwKKwkJInNjaG5hbHoiIDogIiZhIFtbbWl0IFtkZXJdXSB6dW5nZV0iOyAiIiwKKwkJInNjaG5hdWIiIDogIiZhIjsgIiZkZW50cnVlc3RldCIsCisJCSJzY2huYXVmIiA6ICImYSI7ICImZHZvciBBbnN0cmVuZ3VuZyIsCisJCSJzY2huaXBwIiA6ICImYSI7ICImZyIsCisJCSJzY2huYXJjaCIgOiAiJmEiOyAiJmcmZGxhdXQiLAorCQkic2NobmllZiIgOiAiJmEiOyAiJmciLAorCQkic2NobnVyciIgOiAiJmEiOyAiJmR6dWZyaWVkZW4iLAorCQkic2NocmVpIiA6ICImbiAmYSI7ICImZyIsCisJCSJzY2h1ZXR0ZWwiIDogIiZuICZhIjsgIiZnJmFIYXQgZWluZW4gVW50ZXJzY2hpZWQsIGplIG5hY2hkZW0sIG9iIGVpbiBOYW1lIgorCQkJKyIgYW5nZWdlYmVuIHd1cmRlIG9kZXIgbmljaHQuIiwKKwkJInNjaHdlaWciIDogIiZhIjsgIiIsCisJCSJzZXVmeiIgOiAiJmEiOyAiJmciLAorCQkic2luZyIgOiAiJmEgfCAmdCI7ICIiLAorCQkic25pZmYiIDogIiZuICZhIjsgIiZkdHJhdXJpZyIsCisJCSJzcHVjayIgOiAiJm4gJmEiOyAiJmciLAorCQkic3RhbXBmIiA6ICImYSI7ICIiLAorCQkic3RhcnIiIDogIiZuICZhIjsgIlN0YW5kYXJkYWR2ZXJiIGdpbHQgaGllciBudXIgYmVpIEFuZ2FiZSBlaW5lcyBOYW1lbnMuIgorCQkJKyImZHZlcnRyYWV1bXQiLAorCQkic3RhdW4iIDogIiZuICZhIjsgIiIsCisJCSJzdGllciIgOiAiJm4gJmEiOyAiJmciLAorCQkic3RpbW0iIDogIiZuICZhIjsgIiIsCisJCSJzdG9laG4iIDogIiZhIjsgIiZnIiwKKwkJInN0b3NzIiA6ICImbiEgJmEiOyAiJmciLAorCQkic3RyZWljaGVsIiA6ICImbiEgJmEiOyAiJmcmYSIsCisJCSJzdHVwcyIgOiAiJm4hICZhIjsgIiIsCisJCSJzdHV0eiIgOiAiJmEiOyAiIiwKKwkJInRhbnoiIDogIiZuICZhIjsgIiZnIiwKKwkJInRyYWV1bSIgOiAieyZuICZhfSB8ICZ0IjsgIkVzIGtvZW5uZW4gUHJvYmxlbWUgYXVmdHJldGVuLCB3ZW5uIGVpbiBBZHZlcmIiCisJCQkrIiBpbiBmcmVpZW0gVGV4dCBlcmthbm50IHdpcmQuIFRleHQgd2lyZCBnZW5hdSBzbyBhbiBcInRyYWV1bShzKXRcIiAiCisJCQkrImFuZ2VoYWVuZ3QsIHdpZSBlciBhbmdlZ2ViZW4gd3VyZGUuIiwKKwkJInRyaXR0IiA6ICImbiAmYSI7ICImZyZhIiwKKwkJInRyb2VzdCIgOiAiJm4hICZhIjsgIiIsCisJCSJ1bWFybSIgOiAiJm4hICZhIjsgIiZnJmEiLAorCQkidmVybmVpZyIgOiAiJm4gJmEiOyAiJmcmYSIsCisJCSJ3YWNrZWwiIDogIiZhIFttaXQgJnQhXSI7ICImZ01hbiBrYW5uIG1pdCBhbGxlbSBtb2VnbGljaGVtIHdhY2tlbG4uIiwKKwkJIndhZWx6IiA6ICImYSI7ICImZHZvciBMYWNoZW4iLAorCQkid2FydCIgOiAiJm4gJmEiOyAiTWFuIGthbm4gYXVmIGFsbGVzIG1vZWdsaWNoZSB3YXJ0ZW4gKHdhcnRlIGFsbGVzICIKKwkJCSsibW9lZ2xpY2hlKSIsCisJCSJ3ZWNrIiA6ICImbiB7JmEgfCAmdH0iOyAiUGllcHN0IDxOYW1lPiBhbiB1bmQgc2VuZGV0IGlobSBnZ2YuIGRlbiBUZXh0LiIsCisJCSJ3ZWluIiA6ICImbiAmYSI7ICImZyIsCisJCSJ3aW5rIiA6ICImbiAmYSI7ICImYSIsCisJCSJ3dWVyZyIgOiAiJm4gJmEiOyAiIiwKKwkJInd1bmRlciIgOiAiJm4gJmEiOyAiIiwKKwkJInplaWciIDogIjxPYmpla3QtSUQ+IjsgIiZhWmVpZ3QgZGFzIE9iamVrdCAoTGFuZ2Jlc2NocmVpYnVuZykuIiwKKwkJInppdGllciIgOiAiJm4gJmEiOyAiSGllciB1ZWJlcm5pbW10IGRhcyBBZHZlcmIgZ2dmLiBkaWUgU3RlbGxlIGRlcyAiCisJCQkrInppdGllcnRlbiwgd2VubiBkaWVzZXIgbmljaHQgYW53ZXNlbmQgaXN0ICh6aXRpZXJlIEphIC9Kb2YpIiwKKwkJInppdHRlciIgOiAiJmEiOyAiIiwKKwkJInp3aW5rZXIiIDogIiZuICZhIjsgIiZnIiwKKwkJImFlY2h6IiA6ICImYSI7ICIiLAorCQkiYXJnbCIgOiAiJmEiOyAiIiwKKwkJImF0bSIgOiAiJmEiOyAiJmRlcmxlaWNodGVydCIsCisJCSJiZXd1bmRlciIgOiAiJm4hICZhIjsgIiIsCisJCSJlcmJsZWljaCIgOiAiJmEiOyAiJmciLAorCQkiZmx1Y2giIDogIiZhIjsgIiZnIiwKKwkJImdydW56IiA6ICImYSI7ICIiLAorCQkia3VzY2hlbCIgOiAiJm4hICZhIjsgIiZnIiwKKwkJInJvdGZsIiA6ICImYSI7ICIiLAorCQkidmVyZmx1Y2giIDogInsmbiAmYX0gfCAmdCEiOyAiIiwKKwkJImtpdHplbCIgOiAiJm4hICZhIjsgIiZnIiwKKwkJIm5laW4iIDogIiZhIjsgIiZnIiwKKwkJImRldXQiIDogIiZuISAmYSI7ICImYSIsCisJCSJkZW5rIiA6ICImYSB8ICZ0IjsgIiZnIiwKKwkJImtudWRkZWwiIDogIiZuISAmYSI7ICImZyZhIiwKKwkJImtyYXR6IiA6ICImYSI7ICIiLAorCQkic3RyZWNrIiA6ICImbiAmYSBbW2RpZV0genVuZ2UgcmF1cyI7ICImZyIsCisJCSJ0YWV0c2NoZWwiIDogIiZuISAmYSI7ICImZyIsCisJCSJ3dXNjaGVsIiA6ICImbiEgJmEiOyAiIiwKKwkJInJhc3NlbCIgOiAiJmEiOyAiJmcmZGZ1ZXJjaHRlcmxpY2giLAorCQkiaGV1bCIgOiAiJmEiOyAiJmcmZHNjaGF1ZXJsaWNoIiwKKwkJImtpY2siIDogIiZuICZhIjsgIiZnJmEiLAorCQkic3BsYXNoIiA6ICImbiEgJmEiOyAiJmEiLAorCQkiZmxhbWUiIDogIiZuISAmYSI7ICImZyZhIiwKKwkJInJrbnVkZGVsIiA6ICImbiEgJmEiOyAiTnVyIGZ1ZXIgRmVybmdlYnJhdWNoIGdlZGFjaHQuIiwKKwkJInJ3aW5rIiA6ICImbiEgJmEiOyAiTnVyIGZ1ZXIgRmVybmdlYnJhdWNoIGdlZGFjaHQuIiwKKwkJInZlcmIiIDogIiI7ICJMaXN0ZXQgYWxsZSBkZXJ6ZWl0IG1vZWdsaWNoZW4gVmVyYmVuIGF1Zi4iLAorCQkiYWR2ZXJiIiA6ICJbIyB8ICQgfCB7PyA8QWJrdWVyenVuZz59IHwgPEFia3Vlcnp1bmc+IFs8QWR2ZXJiPl1dIjsKKwkJCSJHZW5hdWVyZSBIaWxmZSBtaXQgXCJhZHZlcmIgP1wiIiwKKwldKTsKK30KKworLyoqCisgIEdpYnQgZGllIEhpbGZlIHp1IGVpbmVtIFZlcmIgb2RlciBkaWUgVmVyYmVudWViZXJzaWNodCB6dXJ1ZWNrCisgIFxwYXJhbSB2ZXJiICAgInN0cmluZyIgIEVpbiBWZXJiIGRlc3NlbiBIaWxmZSBhbmdlemVpZ3Qgd2VyZGVuIHNvbGwuCisgICAgICAgICAgICAgICAgMCBvZGVyICIiIFVlYmVyYmxpY2tzc2VpdGUKKyAgXHJldHVybiAJU3RyaW5nIGRlciBhbiBkZW4gU3BpZWxlciBhdXNnZWdlYmVuIHdlcmRlbiBrYW5uLgorKi8KK3N0cmluZyBIZWxwKHN0cmluZyB2ZXJiKSAgeworCXN0cmluZyBvdXQ7CisJaWYgKHZlcmIgJiYgdmVyYiE9IiIpCisJCXJldHVybiBIZWxwVmVyYih2ZXJiKTsKKwlvdXQ9IiI7CisJb3V0Kz1icmVha19zdHJpbmcoIlN0YW5kYXJkdmVyYmVuOlxuIitpbXBsb2RlKFNvcnRJdChwbHJjbWRzKSwgIiwgIikKKwkJKyIuIiwgNzgsIDAsIDEpOworCWlmIChJU19XSVpBUkQodGhpc19wbGF5ZXIoKSkpCisJCW91dCs9IlxuIiticmVha19zdHJpbmcoIk1hZ2llcnZlcmJlbjpcbiIraW1wbG9kZShTb3J0SXQod2l6Y21kcyksICIsICIpCisJCQkrIi4iLCA3OCwgMCwgMSk7CisJaWYgKHRoaXNfcGxheWVyKCktPmdob3N0KCkpCisJCW91dCs9IlxuIiticmVha19zdHJpbmcoIkdlaXN0ZXJ2ZXJiZW46XG4iK2ltcGxvZGUoU29ydEl0KGdob3N0Y21kcyksICIsICIpCisJCQkrIi4iLCA3OCwgMCwgMSk7CisJb3V0Kz1icmVha19zdHJpbmcoIlxuQWR2ZXJiaWVuIGtvZW5uZW4gZW50d2VkZXIgaW4gZGVyIEFia3Vlcnp1bmcgKGJlaSAiCisJCSsiYmVyZWl0cyBkZWZpbmllcnRlbiBBZHZlcmJpZW4pIG9kZXIgbWl0IFwiLzxUZXh0PlwiIGFuZ2VnZWJlbiB3ZXJkZW4uICIKKwkJKyJCZWkgZGVyIHp3ZWl0ZW4gTWV0aG9kZSB3aXJkIDxUZXh0PiBzbywgd2llIGVyIGFuZ2VnZWJlbiB3dXJkZSwgYW4gIgorCQkrIlN0ZWxsZSBkZXMgQWR2ZXJicyBlaW5nZXNldHp0LiIsIDc4LCAwLCAxKTsKKwlvdXQrPSJcbiIrYnJlYWtfc3RyaW5nKCJFaW5lIGt1cnplIEhpbGZlIHp1IGVpbmVtIFZlcmIgYmVrb21tc3QgZHUgbWl0IGVpbmVtIGRlciAiCisgICAgICAgICAgICAgICAgKyJCZWZlaGxlIFwiPFZlcmI+IC0/XCIsIFwiPFZlcmI+IC8/XCIsIFwiPFZlcmI+IC1oXCIsIFwiPFZlcmI+IC9oXCIgb2RlciAiCisgICAgICAgICAgICAgICAgKyJcIjxWZXJiPiBoaWxmZVwiLiAoRGEgd2FyIGplbWFuZCB3aXJrbGljaCBmbGVpc3NpZykuIiwgNzgpOworCXJldHVybiBvdXQrIlxuIiticmVha19zdHJpbmcoIkVpbmlnZSBCZWZlaGxlIHJlYWdpZXJlbiBhdWNoIGF1ZiBsZWljaHQgIgorCQkrInVudGVyc2NoaWVkbGljaGUgU2NocmVpYndlaXNlLiBEaWVzZSBCZWZlaGxzbGlzdGUga2FubiBzaWNoIG1pdCBEZWluZW0gIgorCQkrIlp1c3RhbmQgYWVuZGVybi4iLCA3OCk7Cit9CisKKy8qKgorICBTb3J0aWVydCBlaW4gYXJyYXkgb2Ygc3RyaW5nIGFscGhhYmV0aXNjaC4gCisgIFxwYXJhbSBhcnIgRGFzIHp1IHNvcnRpZXJlbmRlIEFycmF5CisgIFxyZXR1cm4gICAgU29ydGllcnRlIEtvcGllIGRlcyBBcnJheXMKKyovCitwcml2YXRlIHN0cmluZyoKK1NvcnRJdChzdHJpbmcgKmFycikgIHsKKyAgcmV0dXJuIHNvcnRfYXJyYXkoYXJyLCAKKyAgICAgICAgICAgZnVuY3Rpb24gaW50IChzdHJpbmcgeCwgc3RyaW5nIHkpeyAKKyAgICAgICAgICAgICByZXR1cm4gbG93ZXJfY2FzZSh4KSA+IGxvd2VyX2Nhc2UoeSkgOworICAgICAgICAgICB9IAorICAgICAgICAgKTsKK30KKworI2RlZmluZSBOT19NT1JFX0UgKHsiY2xzIiwiZmxpcHAiLCJncnVlYmVsIiwiZ3J1bW1lbCIsImd1Y2siLCJoYWV0c2NoZWwiLFwKKyAgImp1YmVsIiwibGFlY2hlbCIsImdpYiIsInJ1bnplbCIsInNjaG11bnplbCIsInNjaHVldHRlbCIsInNuaWZmIixcCisgICJzdHJlaWNoZWwiLCJ0cml0dCIsICJ3YWNrZWwiLCJhcmdsIiwicm90ZmwiLCJrdXNjaGVsIiwia2l0emVsIiwia251ZGRlbCIsXAorICAidGFldHNjaGVsIiwid3VzY2hlbCIsInJhc3NlbCIsImtpY2siLCJzcGxhc2giLCJmbGFtZSIsInZlcmIiLCJhZHZlcmIiLFwKKyAgIm5laW4iLCJicnVtbWVsIiwibW9wcGVyIix9KQorCisvKioKKyAgR2lidCBkaWUgSGlsZmUgenUgZWluZW0gVmVyYiAKKyAgXHBhcmFtIHYgICAgIEVpbiBWZXJiIGRlc3NlbiBIaWxmZSBhbmdlemVpZ3Qgd2VyZGVuIHNvbGwuCisgIFxyZXR1cm4gCUhpbGZlIHp1bSBWZXJiIGluIEZvcm0gZWluZXMgU3RyaW5ncworKi8KK3ByaXZhdGUgc3RyaW5nCitIZWxwVmVyYihzdHJpbmcgdikgIHsKKwlzdHJpbmcgaCx0OworCWlmIChtZW1iZXIobV9pbmRpY2VzKGhlbHApLHYpPDApCisJCXJldHVybiAiRGF6dSBpc3Qga2VpbmUgSGlsZmUgdm9yaGFuZGVuLlxuIjsKKwloPSJTeW50YXg6XG4qICIrdjsKKwlpZiAobWVtYmVyKE5PX01PUkVfRSwgdik8MCkKKwkJaCs9ImUiOworCWgrPSIgIjsKKwl0PWhlbHBbdiwwXTsKKwl0PWltcGxvZGUoZXhwbG9kZSh0LCImdCEiKSwgIjxUZXh0PiIpOworCXQ9aW1wbG9kZShleHBsb2RlKHQsIiZuISIpLCAiPE5hbWU+Iik7CisJdD1pbXBsb2RlKGV4cGxvZGUodCwiJnQiKSwgIls8VGV4dD5dIik7CisJdD1pbXBsb2RlKGV4cGxvZGUodCwiJm4iKSwgIls8TmFtZT5dIik7CisJdD1pbXBsb2RlKGV4cGxvZGUodCwiJmEiKSwgIls8QWR2ZXJiPl0iKTsKKwloKz10OworCXQ9aGVscFt2LDFdOworCWlmICh0IT0iIikgIHsKKwkJaCs9IlxuQmVtZXJrdW5nZW46IjsKKwkJaWYgKChleHBsb2RlKHQsIiYiKSlbMF0hPSIiKQorCQkJdD0iXG4iK2JyZWFrX3N0cmluZygoZXhwbG9kZSh0LCImIikpWzBdLCA3NiwgIiogIiwgMSlbMC4uPDJdCisJCQkJKyImIitpbXBsb2RlKChleHBsb2RlKHQsIiYiKSlbMS4uPDFdLCImIik7CisJCXQ9aW1wbG9kZShleHBsb2RlKHQsIiZnIiksICJcbiogVmVyaGFlbHQgc2ljaCBiZWkgR2Vpc3Rlcm4gYW5kZXJzICIKKwkJCSsiYWxzIHNvbnN0LiIpOworCQl0PWltcGxvZGUoZXhwbG9kZSh0LCImYSIpLCAiXG4qIEJlaSBkaWVzZW0gVmVyYiBnZWh0IGFsbGUobikgYWxzICIKKwkJCSsiWmllbGFuZ2FiZS4iKTsKKwkJaWYgKHN0cnN0cih0LCImZCIpPj0wKSAgeworCQkJdD1pbXBsb2RlKGV4cGxvZGUodCwiJmQiKSwgIlxuKiBTdGFuZGFyZGFkdmVyYiBpc3QgIik7CisJCQl0Kz0iLiI7CisJCX0KKwl9CisJcmV0dXJuIGJyZWFrX3N0cmluZyhoK3QsIDc4LCAyLCAxKTsKK30KZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvdHJhdmVsLmMgYi9zdGQvcGxheWVyL3RyYXZlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMDdjMGEKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL3RyYXZlbC5jCkBAIC0wLDAgKzEsNTA2IEBACisKKy8qICdyZWlzZScgaGFuZGxpbmcKKyAqCisgKiBVZWJlcmFyYmVpdGV0ZSB1bmQgCisgKiBlcndlaXRlcnRlIFZlcnNpb246IFRpbGx5QE1vcmdlbkdyYXVlbiwgMTAuMDEuMDIKKyAqIEJhc2llcmVuZCBhdWYgICAgIDogYmFzZS5jQFNpbGJlckxhbmQsCisgKiAgICAgICAgICAgICAgICAgICAgIFJldmlzaW9uIDMuNTUsIFdvb2R5QFNpbGJlckxhbmQsIDExLjA1Ljk5CisgKi8gICAKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDxwbGF5ZXIuaD4KKyNpbmNsdWRlIDxsaXZpbmcvbW92aW5nLmg+CisjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPgorI3VuZGVmIE5FRURfUFJPVE9UWVBFUworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPGxpdmluZy5oPgorI2luY2x1ZGUgPGF0dHJpYnV0ZXMuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8bmV3X3NraWxscy5oPgorI2luY2x1ZGUgPGNvbWJhdC5oPgorI2luY2x1ZGUgPHRyYW5zcG9ydC5oPgorCit2b2lkIGNyZWF0ZSgpe30KKworcHJpdmF0ZSBzdHJpbmcgX3RyYXZlbGxlcihzdHJpbmcgKnMpCit7CisgIHN3aXRjaCAoc2l6ZW9mKHMpKQorICB7CisgICAgY2FzZSAxIDogcmV0dXJuIHNbMF07CisgICAgY2FzZSAyIDogcmV0dXJuIHNbMF0rIiBvZGVyICIrc1sxXTsKKyAgfQorICByZXR1cm4gZWZ1bjo6aW1wbG9kZShzWzAuLjwyXSwiLCAiKSsiIG9kZXIgIitzWzwxXTsKK30KKworc3RhdGljIGludCByZWlzZShzdHJpbmcgc3RyKQoreworICBtaXhlZCAgdCwgc2hpcCwgZHN0cjsKKyAgc3RyaW5nIG1pdCwgbmFjaCwgczEsIHMyOworICBpbnQgICAgaTsKKworICBfbm90aWZ5X2ZhaWwoIlN5bnRheDogcmVpc2UgbWl0IDx0cmFuc3BvcnRtaXR0ZWw+IG5hY2ggPHppZWxvcnQ+XG5cbiIKKyAgICAgICAgICAgICAgICJXZWl0ZXJlIFN5bnRheGVuIG1vZWdsaWNoLCBiaXR0ZSAnaGlsZmUgcmVpc2UnIGxlc2VuLlxuIik7CisKKyAgdCA9IFF1ZXJ5UHJvcChQX1RSQVZFTF9JTkZPKTsKKyAgCisgIGlmICghcG9pbnRlcnAodCkgfHwgKHNpemVvZih0KSA8IDQpIHx8ICFvYmplY3RwKHRbMF0pIHx8ICFvYmplY3RwKHRbMV0pKQorICB7CisgICAgU2V0UHJvcChQX1RSQVZFTF9JTkZPLCB0ID0gMCk7CisgIH0KKy8qICogKiAqIAorICogUkVJU0UKKyAqICogKiAqLworICBpZiAoIXN0cikKKyAgeworICAgIGlmICghdCkKKyAgICB7CisgICAgICB3cml0ZSgiRHUgaGFzdCBrZWluZSBSZWlzZXJvdXRlIGZlc3RnZWxlZ3QuXG4iKTsKKyAgICB9CisgICAgZWxzZSBpZiAodFswXSA9PSBlbnZpcm9ubWVudCgpKQorICAgIHsKKyAgICAgIGlmIChlbnZpcm9ubWVudCgpLT5pZCgiVHJhbnNwb3J0ZXIiKSkKKyAgICAgIHsKKyAgICAgICAgd3JpdGUoc3ByaW50ZigiRHUgcmVpc3QgbWl0ICVzJXMuXG4iLGVudmlyb25tZW50KCktPm5hbWUoV0VNLDEpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRbMl0/IiAiK3RbM106IiIpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgd3JpdGUoc3ByaW50ZigiRHUgd2lyc3QgbWl0ICVzJXMgcmVpc2VuLlxuIix0WzFdLT5uYW1lKFdFTSwxKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0WzJdPyIgIit0WzNdOiIiKSk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgd3JpdGUoc3ByaW50ZigiRGVpbmUgbGV0enRlIFJvdXRlIChtaXQgJXMlcykgaXN0IGhpZXIgbmljaHQgd2lya3NhbS5cbiIsCisgICAgICAgICAgICAgICAgICAgICB0WzFdLT5uYW1lKFdFTSwxKSwKKyAgICAgICAgICAgICAgICAgICAgIHRbMl0/IiAiK3RbM106IiIpKTsKKyAgICB9CisgICAgcmV0dXJuIDE7CisgIH0KKworICBzdHIgPSBsb3dlcl9jYXNlKCBfdW5wYXJzZWRfYXJncygpICk7CisvKiAqICogKiAqICogKiAKKyAqIFJFSVNFIFJPVVRFCisgKiAqICogKiAqICogKi8KKyAgaWYgKHN0ciA9PSAicm91dGUiKQorICB7CisgICAgc3RyaW5nICpoYXJib3VyczsKKyAgICAKKyAgICBpZiAoZW52aXJvbm1lbnQoKS0+aWQoIlRyYW5zcG9ydGVyIikpCisgICAgeworICAgICAgaWYgKGVudmlyb25tZW50KCktPlF1ZXJ5UHJvcChQX05PX1RSQVZFTElORykpCisgICAgICB7CisgICAgICAgIHdyaXRlKGJyZWFrX3N0cmluZygKKyAgICAgICAgIGNhcGl0YWxpemUoZW52aXJvbm1lbnQoKS0+bmFtZShXRVIsMSkpKyIgaGF0IGdhciBrZWluZSAiCisgICAgICAgICAiUmVpc2Vyb3V0ZS4gV28gRGljaCBkYXMgd29obCBoaW5mdWVocnQ/Iiw3OCkpOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKworICAgICAgaGFyYm91cnMgPSBlbnZpcm9ubWVudCgpLT5RdWVyeUhhcmJvdXJzKDEpOworICAgICAgCisgICAgICBpZiAoIXNpemVvZihoYXJib3VycykgfHwgIXN0cmluZ3AoaGFyYm91cnNbMF0pKQorICAgICAgeworICAgICAgICB3cml0ZSgiRGllIFJlaXNlcm91dGUgIitlbnZpcm9ubWVudCgpLT5uYW1lKFdFU1NFTiwxKSsiIGlzdCAiCisgICAgICAgICAgICAgKyJsZWlkZXIgbmljaHQgYmVrYW5udC5cbiIpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICB3cml0ZShicmVha19zdHJpbmcoY2FwaXRhbGl6ZShlZnVuOjppbXBsb2RlKGhhcmJvdXJzLCIgLSAiKSkrIi4iLDc4LAorICAgICAgICAgIlJlaXNlcm91dGUgIitlbnZpcm9ubWVudCgpLT5uYW1lKFdFU1NFTiwxKSsiOiAiLEJTX0lOREVOVF9PTkNFKSk7CisgICAgICB9CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKGVudmlyb25tZW50KCktPlF1ZXJ5UHJvcChQX05PX1RSQVZFTElORykpCisgICAgeworICAgICAgd3JpdGUoYnJlYWtfc3RyaW5nKCJIaWVyIGthbm5zdCBEdSBsZWlkZXIga2VpbmUgUmVpc2Vyb3V0ZSB3YWVobGVuLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIldhcyBuaWNodCBoZWlzc3QsIGRhc3MgaGllciBrZWluIFRyYW5zcG9ydG1pdHRlbCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgInZlcmtlaHJ0LiIsNzgpKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoIXBvaW50ZXJwKHNoaXAgPSBUUkFWRUxELT5IYXNUcmFuc3BvcnRlcihlbnZpcm9ubWVudCgpKSkpCisgICAgeworICAgICAgX25vdGlmeV9mYWlsKCJIaWVyIHZlcmtlaHJ0IGtlaW4gVHJhbnNwb3J0bWl0dGVsLlxuIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB3cml0ZSgiSGllciB2ZXJrZWhyZW4gZm9sZ2VuZGUgVHJhbnNwb3J0bWl0dGVsIFxuIgorICAgICAgICAgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gXG4iKTsKKyAgICAgICAgIAorICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc2hpcCk7IGkrKykKKyAgICB7ICAgIAorICAgICAgaWYgKCFzaGlwW2ldLT5RdWVyeShQX1NIT1JUKSkgY29udGludWU7CisgICAgICAKKyAgICAgIGhhcmJvdXJzID0gc2hpcFtpXS0+UXVlcnlIYXJib3VycygxKTsKKworICAgICAgaWYgKHNpemVvZihoYXJib3VycykgJiYgc3RyaW5ncChoYXJib3Vyc1swXSkpCisgICAgICB7CisgICAgICAgIHdyaXRlKGJyZWFrX3N0cmluZyhlZnVuOjppbXBsb2RlKGhhcmJvdXJzLCIgLSAiKSsiLiIsNzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGlwW2ldLT5RdWVyeShQX1NIT1JUKSsiOiAiLEJTX0lOREVOVF9PTkNFKSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHdyaXRlKHNoaXBbaV0tPlF1ZXJ5KFBfU0hPUlQpKyI6IFJvdXRlIHVuYmVrYW5udC5cbiIpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMTsKKyAgfQorLyogKiAqICogKiAqICogCisgKiBSRUlTRSBBVVMKKyAqIFJFSVNFIE5JQ0hUCisgKiAqICogKiAqICogKi8KKyAgaWYgKG1lbWJlcigoWyJhdXMiLCJuaWNodCJdKSxzdHIpKQorICB7CisgICAgaWYgKCF0KQorICAgIHsKKyAgICAgIHdyaXRlKCJEdSBoYXR0ZXN0IGtlaW5lIFJlaXNlcm91dGUgZWluZ2VzdGVsbHQuXG4iKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHdyaXRlKCJEdSBsb2VzY2hzdCBEZWluZSBSZWlzZXJvdXRlLlxuIik7CisgICAgfQorICAgIFNldFByb3AoUF9UUkFWRUxfSU5GTywgMCk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBzdHIgPSByZWdyZXBsYWNlKHN0ciwiXFw8KHp1fHp1bXx6dXJ8aW5zfGFucylcXD4iLCJuYWNoIiwwKTsKKy8qICogKiAqICogKiAqICogKgorICogUkVJU0UgTUlUIE5BQ0gKKyAqIFJFSVNFIE5BQ0ggTUlUCisgKiAqICogKiAqICogKiAqICovCisgIGlmICgoc3NjYW5mKHN0ciwgIm1pdCAlcyBuYWNoICVzIiwgbWl0LCBuYWNoKSA9PSAyKSB8fAorICAgICAgKHNzY2FuZihzdHIsICJuYWNoICVzIG1pdCAlcyIsIG5hY2gsIG1pdCkgPT0gMikpCisgIHsKKyAgICBfbm90aWZ5X2ZhaWwoIkhpZXIga2FubnN0IER1IGxlaWRlciBrZWluZSBSZWlzZXJvdXRlIHdhZWhsZW4uXG4iKTsKKworICAgIGlmIChlbnZpcm9ubWVudCgpLT5RdWVyeVByb3AoUF9OT19UUkFWRUxJTkcpKQorICAgIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoIXNpemVvZihuYWNoKSkKKyAgICB7CisgICAgICBfbm90aWZ5X2ZhaWwoIlN5bnRheDogcmVpc2UgbWl0IDx0cmFuc3BvcnRtaXR0ZWw+IG5hY2ggPHppZWxvcnQ+XG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgICAgcmVpc2UgbmFjaCA8emllbG9ydD4gbWl0IDx0cmFuc3BvcnRtaXR0ZWw+XG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoZW52aXJvbm1lbnQoKS0+aWQoIlRyYW5zcG9ydGVyIikpCisgICAgeworICAgICAgaWYgKGVudmlyb25tZW50KCktPmlkKG1pdCkpCisgICAgICB7CisgICAgICAgIGNvbW1hbmQoInJlaXNlIG5hY2ggIituYWNoKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIF9ub3RpZnlfZmFpbCgiQmVlbmRlIGVyc3RtYWwgRGVpbmUgYWt0dWVsbGUgUmVpc2UgbWl0ICIrCisgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoKS0+bmFtZShXRU0sMSkrIi5cbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFwb2ludGVycChzaGlwID0gVFJBVkVMRC0+SGFzVHJhbnNwb3J0ZXIoZW52aXJvbm1lbnQoKSwgbWl0KSkpCisgICAgeworICAgICAgX25vdGlmeV9mYWlsKCJTbyBlaW4gVHJhbnNwb3J0bWl0dGVsIHZlcmtlaHJ0IGhpZXIgbmljaHQuXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBmb3IgKGkgPSBzaXplb2Yoc2hpcCkgLTEgOyBpID49IDA7IGktLSkKKyAgICAgIGlmICghc2hpcFtpXS0+SGFzUm91dGUobmFjaCkpCisgICAgICB7CisgICAgICAgIHNoaXBbaV0gPSAwOworICAgICAgfQorCisgICAgc2hpcCAtPSAoezB9KTsKKworICAgIGlmIChwb2ludGVycCh0KSAmJiBvYmplY3RwKHRbMV0pICYmIChtZW1iZXIoc2hpcCx0WzFdKSAhPSAtMSkpCisgICAgeworICAgICAgc2hpcCA9ICh7IHRbMV0gfSk7CisgICAgfQorICAgIGlmIChzaXplb2Yoc2hpcCkgPiAxKQorICAgIHsKKyAgICAgIGlmIChvYmplY3RfbmFtZShlbnZpcm9ubWVudCgpKSA9PSBzaGlwWzBdLT5IYXNSb3V0ZShuYWNoKVswXSkKKyAgICAgIHsKKyAgICAgICAgX25vdGlmeV9mYWlsKCJBYmVyIGRhIGJpc3QgRHUgZG9jaCBiZXJlaXRzLlxuIik7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICB3cml0ZSgiRG9ydGhpbiBrYW5uc3QgRHUgbWl0ICIrQ291bnRVcChtYXBfb2JqZWN0cyhzaGlwLCJuYW1lIixXRU0pKQorICAgICAgICAgICArInJlaXNlbi5cbiIpOworIAorCisgICAgICBkc3RyID0gZmlsdGVyKCBmaWx0ZXJfb2JqZWN0cyhzaGlwLCJzaG9ydCIpLCBsYW1iZGEoICh7J3h9KSwKKyAgICAgICAgICAgICAoeyAjJz09LCAoeyMnZW52aXJvbm1lbnQsICd4fSksIGVudmlyb25tZW50KCkgfSkgKSApOworCisgICAgICBpZiAoc2l6ZW9mKGRzdHIpKQorICAgICAgeworICAgICAgICBzaGlwID0gZHN0clswXTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgc2hpcCA9IHNoaXBbMF07CisgICAgICB9CisKKyAgICAgIGRzdHIgPSBzaGlwLT5IYXNSb3V0ZShuYWNoKTsKKworICAgICAgd3JpdGUoc3ByaW50ZigiRHUgZW50c2NoZWlkZXN0IERpY2ggZnVlciAlcyB1bmQgcmVpc3QgJXMuXG4iLAorICAgICAgICAgICAgc2hpcC0+bmFtZShXRU4sMSksZHN0clsxXSkpOworICAgIH0KKyAgICBlbHNlIGlmIChzaXplb2Yoc2hpcCkgPCAxKQorICAgIHsKKyAgICAgIF9ub3RpZnlfZmFpbCgiTmFjaCAnIitjYXBpdGFsaXplKG5hY2gpKyInIGthbm4gRGljaCBkYXMgYW5nZWdlYmVuZSAiCisgICAgICAgICAgICAgICAgICArIlRyYW5zcG9ydG1pdHRlbCBsZWlkZXIgbmljaHQgYnJpbmdlbi5cbiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBzaGlwID0gc2hpcFswXTsKKyAgICAgIGRzdHIgPSBzaGlwLT5IYXNSb3V0ZShuYWNoKTsKKworICAgICAgaWYgKG9iamVjdF9uYW1lKGVudmlyb25tZW50KCkpID09IGRzdHJbMF0pCisgICAgICB7CisgICAgICAgIF9ub3RpZnlfZmFpbCgiQWJlciBkYSBiaXN0IER1IGRvY2ggYmVyZWl0cy5cbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGlmICh0ICYmIHN0cmluZ3AodFsyXSkpCisgICAgICB7CisgICAgICAgIGlmICh0WzJdID09IGRzdHJbMF0pCisgICAgICAgIHsKKyAgICAgICAgICBfbm90aWZ5X2ZhaWwoIkFiZXIgZGFzIHR1c3QgRHUgZG9jaCBiZXJlaXRzLlxuIik7CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHdyaXRlKHNwcmludGYoIk9rLCBEdSByZWlzdCBudW4gbWl0ICVzICVzLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgIHNoaXAtPm5hbWUoV0VNLDEpLGRzdHJbMV0pKTsKKyAgICB9CisgICAgaWYgKGVudmlyb25tZW50KHNoaXApPT1lbnZpcm9ubWVudCgpICYmIHNoaXAtPnNob3J0KCkpCisgICAgeworICAgICAgc2hpcC0+RW50ZXIodGhpc19vYmplY3QoKSk7CisgICAgfQorICAgIFNldFByb3AoUF9UUkFWRUxfSU5GTywgKHsgZW52aXJvbm1lbnQoKSwgc2hpcCwgZHN0clswXSwgZHN0clsxXSB9KSApOworICAgIHJldHVybiAxOworICB9CisvKiAqICogKiAqICogKgorICogUkVJU0UgTkFDSAorICogKiAqICogKiAqICovCisgIGlmIChzc2NhbmYoc3RyLCJuYWNoICVzIixuYWNoKSkKKyAgeworICAgIF9ub3RpZnlfZmFpbCgiSGllciBrYW5uc3QgRHUgbGVpZGVyIGtlaW5lIFJlaXNlcm91dGUgd2FlaGxlbi5cbiIpOworCisgICAgaWYgKGVudmlyb25tZW50KCktPlF1ZXJ5UHJvcChQX05PX1RSQVZFTElORykpCisgICAgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChlbnZpcm9ubWVudCgpLT5pZCgiVHJhbnNwb3J0ZXIiKSkKKyAgICB7CisgICAgICBpZiAoIWRzdHIgPSBlbnZpcm9ubWVudCgpLT5IYXNSb3V0ZShuYWNoKSkKKyAgICAgIHsKKyAgICAgICAgX25vdGlmeV9mYWlsKCJEb3J0aGluIGthbm4gRGljaCAiK2Vudmlyb25tZW50KCktPm5hbWUoV0VSLDEpKworICAgICAgICAgICAgICAgICAgICAgIiBsZWlkZXIgbmljaHQgYnJpbmdlbi5cbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGlmICh0ICYmIHN0cmluZ3AodFsyXSkpCisgICAgICB7CisgICAgICAgIGlmICh0WzJdID09IGRzdHJbMF0pCisgICAgICAgIHsKKyAgICAgICAgICBfbm90aWZ5X2ZhaWwoIkFiZXIgZGFzIHR1c3QgRHUgZG9jaCBiZXJlaXRzLlxuIik7CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHdyaXRlKHNwcmludGYoIk9rLCBEdSByZWlzdCBqZXR6dCBtaXQgJXMgJXMuXG4iLAorICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudCgpLT5uYW1lKFdFTSwxKSxkc3RyWzFdKSk7CisgICAgICAKKyAgICAgIGlmIChJU19XSVpBUkQodGhpc19vYmplY3QoKSkpCisgICAgICB7CisgICAgICAgIHdyaXRlKCJBbHMgTWFnaWVyIG5pbW1zdCBEdSBuYXR1ZXJsaWNoIGRpZSBBYmt1ZXJ6dW5nLlxuIik7CisgICAgICAgIG1vdmUoZHN0clswXSxNX05PQ0hFQ0spOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICAgIFNldFByb3AoUF9UUkFWRUxfSU5GTywoeyBlbnZpcm9ubWVudCgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudCgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RyWzBdLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RyWzFdIH0pICk7CisKKyAgICAgIGlmIChvYmplY3RfbmFtZShlbnZpcm9ubWVudChzaGlwID0gZW52aXJvbm1lbnQoKSkpID09IGRzdHJbMF0gJiYgCisgICAgICAgICAgc2hpcC0+c2hvcnQoKSkKKyAgICAgIHsKKyAgICAgICAgZW52aXJvbm1lbnQoKS0+TGVhdmUodGhpc19vYmplY3QoKSk7CisKKyAgICAgICAgaWYgKGVudmlyb25tZW50KCkgIT0gc2hpcCkKKyAgICAgICAgeworICAgICAgICAgIFNldFByb3AoUF9UUkFWRUxfSU5GTywgMCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoIXBvaW50ZXJwKHNoaXAgPSBUUkFWRUxELT5IYXNUcmFuc3BvcnRlcihlbnZpcm9ubWVudCgpKSkpCisgICAgeworICAgICAgX25vdGlmeV9mYWlsKCJWb24gaGllciBhdXMga2FubnN0IER1IG5pY2h0IHJlaXNlbi5cbiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGZvciAoaSA9IHNpemVvZihzaGlwKSAtIDE7IGkgPj0gMDsgaS0tKQorICAgICAgaWYgKCFzaGlwW2ldLT5IYXNSb3V0ZShuYWNoKSkKKyAgICAgIHsKKyAgICAgICAgc2hpcFtpXSA9IDA7CisgICAgICB9CisKKyAgICBzaGlwIC09ICh7IDAgfSk7CisgCisgICAgaWYgKHBvaW50ZXJwKHQpICYmIG9iamVjdHAodFsxXSkgJiYgKG1lbWJlcihzaGlwLHRbMV0pICE9IC0xKSkKKyAgICB7CisgICAgICBzaGlwID0gKHsgdFsxXSB9KTsKKyAgICB9CisgICAgaWYgKHNpemVvZihzaGlwKSA+IDEpCisgICAgeworICAgICAgaWYgKG9iamVjdF9uYW1lKGVudmlyb25tZW50KCkpID09IHNoaXBbMF0tPkhhc1JvdXRlKG5hY2gpWzBdKQorICAgICAgeworICAgICAgICBfbm90aWZ5X2ZhaWwoIkFiZXIgZGEgYmlzdCBEdSBkb2NoIGJlcmVpdHMuXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisKKyAgICAgIHdyaXRlKGJyZWFrX3N0cmluZygiRGFoaW4ga2FubnN0IER1IG1pdCAiCisgICAgICAgICAgICtfdHJhdmVsbGVyKG1hcF9vYmplY3RzKHNoaXAsICJuYW1lIiwgV0VNKSkrIiBnZWxhbmdlbi4iLDc4KSk7CisKKyAgICAgIGRzdHIgPSBmaWx0ZXIoZmlsdGVyX29iamVjdHMoc2hpcCwic2hvcnQiKSxsYW1iZGEoICh7J3h9KSwKKyAgICAgICAgICAgICh7ICMnPT0sICh7IydlbnZpcm9ubWVudCwgJ3h9KSwgZW52aXJvbm1lbnQoKSB9KSApICk7CisKKyAgICAgIGlmIChzaXplb2YoZHN0cikpCisgICAgICB7CisgICAgICAgIHNoaXAgPSBkc3RyWzBdOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBzaGlwID0gc2hpcFswXTsKKyAgICAgIH0KKworICAgICAgZHN0ciA9IHNoaXAtPkhhc1JvdXRlKG5hY2gpOworCisgICAgICB3cml0ZShzcHJpbnRmKCJEdSB3YWVobHN0ICVzIHVuZCByZWlzdCAlcy5cbiIsc2hpcC0+bmFtZShXRU4sMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0clsxXSkpOworICAgIH0KKyAgICBlbHNlIGlmIChzaXplb2Yoc2hpcCkgPCAxKQorICAgIHsKKyAgICAgIF9ub3RpZnlfZmFpbCgiTmFjaCAnIitjYXBpdGFsaXplKG5hY2gpKyInIGthbm4gRGljaCBsZWlkZXIga2VpbmVzIGRlciAiCisgICAgICAgICAgICAgICAgICArImhpZXIgdmVya2VocmVuZGVuIFRyYW5zcG9ydG1pdHRlbCBicmluZ2VuLlxuIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHNoaXAgPSBzaGlwWzBdOworICAgICAgZHN0ciA9IHNoaXAtPkhhc1JvdXRlKG5hY2gpOworCisgICAgICBpZiAob2JqZWN0X25hbWUoZW52aXJvbm1lbnQoKSkgPT0gZHN0clswXSkKKyAgICAgIHsKKyAgICAgICAgX25vdGlmeV9mYWlsKCJBYmVyIGRhIGJpc3QgRHUgamEgYmVyZWl0cy5cbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHQgJiYgc3RyaW5ncCh0WzJdKSkKKyAgICAgIHsKKyAgICAgICAgaWYgKHRbMl0gPT0gZHN0clswXSkKKyAgICAgICAgeworICAgICAgICAgIF9ub3RpZnlfZmFpbCgiQWJlciBkYXMgdHVzdCBEdSBkb2NoIGJlcmVpdHMuXG4iKTsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgd3JpdGUoc3ByaW50ZigiT2ssIER1IHJlaXN0IG51biBtaXQgJXMgJXMuXG4iLHNoaXAtPm5hbWUoV0VNKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RyWzFdKSk7CisgICAgfQorICAgIGlmIChJU19XSVpBUkQodGhpc19vYmplY3QoKSkpCisgICAgeworICAgICAgd3JpdGUoIkFscyBNYWdpZXIgbmltbXN0IER1IG5hdHVlcmxpY2ggZGllIEFia3Vlcnp1bmcuXG4iKTsKKyAgICAgIG1vdmUoZHN0clswXSxNX05PQ0hFQ0spOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChlbnZpcm9ubWVudChzaGlwKT09ZW52aXJvbm1lbnQoKSAmJiBzaGlwLT5zaG9ydCgpKQorICAgIHsKKyAgICAgIHNoaXAtPkVudGVyKHRoaXNfb2JqZWN0KCkpOworICAgIH0KKyAgICBTZXRQcm9wKFBfVFJBVkVMX0lORk8sICh7IGVudmlyb25tZW50KCksIHNoaXAsIGRzdHJbMF0sIGRzdHJbMV0gfSkgKTsKKyAgICByZXR1cm4gMTsKKyAgfQorLyogKiAqICogKiAqCisgKiBSRUlTRSBNSVQKKyAqICogKiAqICogKi8KKyAgaWYgKHNzY2FuZihzdHIsICJtaXQgJXMiLCBtaXQpKQorICB7CisgICAgX25vdGlmeV9mYWlsKCJIaWVyIGthbm5zdCBEdSBsZWlkZXIga2VpbmUgUmVpc2Vyb3V0ZSB3YWVobGVuLlxuIik7CisKKyAgICBpZiAoZW52aXJvbm1lbnQoKS0+UXVlcnlQcm9wKFBfTk9fVFJBVkVMSU5HKSkKKyAgICB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGVudmlyb25tZW50KCktPmlkKCJUcmFuc3BvcnRlciIpKQorICAgIHsKKyAgICAgIGlmIChlbnZpcm9ubWVudCgpLT5pZChtaXQpKQorICAgICAgeworICAgICAgICBfbm90aWZ5X2ZhaWwoIkFiZXIgZGFzIHR1c3QgRHUgZG9jaCBiZXJlaXRzLlxuIik7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBfbm90aWZ5X2ZhaWwoIkJlZW5kZSBlcnN0bWFsIERlaW5lIGFrdHVlbGxlIFJlaXNlIG1pdCAiKworICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KCktPm5hbWUoV0VNLDEpKyIuXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgfQorICAgIGlmICh0ICYmIG9iamVjdHAodFsxXSkgJiYgdFsxXS0+aWQobWl0KSAmJiB0WzBdID09IGVudmlyb25tZW50KCkpCisgICAgeworICAgICAgX25vdGlmeV9mYWlsKCJBYmVyIGRhcyB0dXN0IER1IGRvY2ggYmVyZWl0cy5cbiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICghcG9pbnRlcnAoc2hpcCA9IFRSQVZFTEQtPkhhc1RyYW5zcG9ydGVyKGVudmlyb25tZW50KCksbWl0KSkpCisgICAgeworICAgICAgX25vdGlmeV9mYWlsKCJTbyBlaW4gVHJhbnNwb3J0bWl0dGVsIHZlcmtlaHJ0IGhpZXIgbmljaHQuXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoc2l6ZW9mKHNoaXApID4gMSkKKyAgICB7CisgICAgICB3cml0ZSgiJyIrY2FwaXRhbGl6ZShtaXQpKyInIGtvZW5udGUgIgorICAgICAgICAgICAgICAgK190cmF2ZWxsZXIobWFwX29iamVjdHMoc2hpcCwibmFtZSIsV0VSKSkrIiBzZWluLlxuIik7CisKKyAgICAgIGRzdHIgPSBmaWx0ZXIoZmlsdGVyX29iamVjdHMoc2hpcCwic2hvcnQiKSxsYW1iZGEoICh7J3h9KSwKKyAgICAgICAgICAgICh7ICMnPT0sICh7IydlbnZpcm9ubWVudCwgJ3h9KSwgZW52aXJvbm1lbnQoKSB9KSApICk7CisKKyAgICAgIGlmIChzaXplb2YoZHN0cikpCisgICAgICB7CisgICAgICAgIHNoaXAgPSBkc3RyWzBdOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBzaGlwID0gc2hpcFswXTsKKyAgICAgIH0KKyAgICAgIHdyaXRlKHNwcmludGYoIkR1IHdhZWhsc3QgJXMuXG4iLCBzaGlwLT5uYW1lKFdFTiwxKSkpOworICAgIH0KKyAgICBlbHNlIGlmIChzaXplb2Yoc2hpcCkgPCAxKQorICAgIHsKKyAgICAgIG5vdGlmeV9mYWlsKCJTbyBlaW4gVHJhbnNwb3J0bWl0dGVsIHZlcmtlaHJ0IGhpZXIgbmljaHQuXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgc2hpcCA9IHNoaXBbMF07CisgICAgICB3cml0ZShzcHJpbnRmKCJEdSByZWlzdCBudW4gbWl0ICVzLlxuIixzaGlwLT5uYW1lKFdFTSwxKSkpOworICAgIH0KKyAgICBpZiAoZW52aXJvbm1lbnQoc2hpcCk9PWVudmlyb25tZW50KCkgJiYgc2hpcC0+c2hvcnQoKSkKKyAgICB7CisgICAgICBzaGlwLT5FbnRlcih0aGlzX29iamVjdCgpKTsKKyAgICB9CisgICAgaWYgKHBvaW50ZXJwKHQpICYmIHN0cmluZ3AodFsyXSkgJiYgc3RyaW5ncCh0WzNdKSAmJgorICAgICAgICBtZW1iZXIoc2hpcC0+UXVlcnlIYXJib3VycygpLHRbMl0pICE9IC0xKQorICAgIHsKKyAgICAgIHdyaXRlKCJEdSBiZWhhZWx0c3QgRGVpbiBiaXNoZXJpZ2VzIFJlaXNlemllbCAoIit0WzNdKyIpIGJlaS5cbiIpOworICAgICAgU2V0UHJvcChQX1RSQVZFTF9JTkZPLCAoeyBlbnZpcm9ubWVudCgpLCBzaGlwLCB0WzJdLCB0WzNdIH0pICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBTZXRQcm9wKFBfVFJBVkVMX0lORk8sICh7IGVudmlyb25tZW50KCksIHNoaXAsIDAsIDAgfSkgKTsKKyAgICB9CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvdXRpbC5jIGIvc3RkL3BsYXllci91dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZjOGZhOQotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvdXRpbC5jCkBAIC0wLDAgKzEsMTExIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gcGxheWVyL3V0aWwuIC0tIFV0aWxpdGllcworLy8KKy8vICRJZDogdXRpbC5jIDYzNzEgMjAwNy0wNy0xNyAyMjo0Njo1MFogWmVzc3RyYSAkCisjcHJhZ21hIHN0cmljdF90eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisKKyNpbmNsdWRlICIvc3lzL3BsYXllci91dGlsLmgiCisjaW5jbHVkZSAiL3N5cy90aGluZy9wcm9wZXJ0aWVzLmgiCisKK3B1YmxpYyB2b2lkIFNob3dQcm9wTGlzdChzdHJpbmcgKnByb3BzKSAKK3sKKyAgaW50IGksajsKKworICBqPXNpemVvZihwcm9wcyk7CisKKyAgZm9yICggaT0wOyBpPGogOyBpKyspIAorICB7CisgICAgd3JpdGUoIioiK3Byb3BzW2ldKyI6ICIpOworICAgIFByZXR0eUR1bXAoUXVlcnlQcm9wKHByb3BzW2ldKSk7CisgICAgd3JpdGUoIlxuIik7CisgIH0KK30KKworc3RhdGljIHZvaWQgUHJldHR5RHVtcChtaXhlZCB4KSAKK3sKKyAgaWYgKHBvaW50ZXJwKHgpKSAKKyAgeworICAgIER1bXBBcnJheSh4KTsKKyAgfQorICBlbHNlIGlmIChtYXBwaW5ncCh4KSkKKyAgeworICAgIER1bXBNYXBwaW5nKHgpOworICB9CisgIGVsc2UgaWYgKG9iamVjdHAoeCkpIAorICB7CisgICAgd3JpdGUgKCJPQkooIitvYmplY3RfbmFtZSh4KSsiKSIpOworICB9CisgIGVsc2UgaWYgKHN0cmluZ3AoeCkpCisgIHsKKyAgICB3cml0ZSgiXCIiK3grIlwiIik7CisgIH0KKyAgZWxzZQorICB7CisgICAgd3JpdGUgKHgpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIER1bXBBcnJheShtaXhlZCAqeCkgCit7CisgIGludCBpLGo7CisKKyAgd3JpdGUgKCIoeyAiKTsKKyAgaWYgKCAoaj1zaXplb2YoeCkpPjAgKQorICB7CisgICAgZm9yICggaT0wIDsgaTwoai0xKSA7IGkrKykgCisgICAgeworICAgICAgUHJldHR5RHVtcCh4W2ldKTsKKyAgICAgIHdyaXRlKCIsICIpOworICAgIH0KKyAgICBQcmV0dHlEdW1wKHhbaV0pOworICAgIHdyaXRlKCIgIik7CisgIH0KKyAgd3JpdGUgKCJ9KSIpOworfQorCitzdGF0aWMgdm9pZCBEdW1wTWFwcGluZyhtYXBwaW5nIHgpCit7CisgIGludCAgIGksIGMsIHM7CisgIG1peGVkICppbmQ7CisKKyAgd3JpdGUoIihbICIpOworCisgIGlmICggKGM9c2l6ZW9mKGluZD1tX2luZGljZXMoeCkpKTwxICkKKyAgeworICAgIHdyaXRlKCIgXSkiKTsKKyAgICByZXR1cm47CisgIH0KKworICBzPWdldF90eXBlX2luZm8oeCwxKTsKKworICBEdW1wS2V5VmFsUGFpcih4LCBpbmRbMF0sIHMpOworICBmb3IgKCBpPTEgOyBpPGMgOyBpKysgKQorICB7CisgICAgd3JpdGUoIiwgIik7CisgICAgRHVtcEtleVZhbFBhaXIoeCwgaW5kW2ldLCBzKTsKKyAgfQorICB3cml0ZSgiIF0pIik7Cit9CisKKy8vIExhY2h0IG5pY2h0IHVlYmVyIGRlbiBOYW1lbiEhISAtQm9pbmcKKy8vIE5laW4sIHVlYmVyIGRlbiBOYW1lbiBsYWNoZSBpY2ggbmljaHQgLi4uIC1QYXJhY2Vsc3VzCitzdGF0aWMgdm9pZCBEdW1wS2V5VmFsUGFpcihtYXBwaW5nIHgsIG1peGVkIGtleSwgaW50IHNpemUpCit7IGludCBqLCB2YzsKKworICBQcmV0dHlEdW1wKGtleSk7CisgIHdyaXRlKCIgOiAiKTsKKyAgUHJldHR5RHVtcCh4W2tleSwwXSk7CisKKyAgZm9yICggaj0xOyBqPHNpemU7IGorKykKKyAgeworICAgIHdyaXRlKCI7ICIpOworICAgIFByZXR0eUR1bXAoeFtrZXksIGpdKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3RkL3BsYXllci92aWV3Y21kLmMgYi9zdGQvcGxheWVyL3ZpZXdjbWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDdlNjE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci92aWV3Y21kLmMKQEAgLTAsMCArMSw3NTQgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBwbGF5ZXIvdmlld2NtZC5jIC0tIHBsYXllciB2aWV3IGNvbW1hbmQgaGFuZGxpbmcKKy8vCisvLyAkSWQ6IHZpZXdjbWQuYyA5NTQ4IDIwMTYtMDQtMTcgMTk6Mjg6MjJaIFplc3N0cmEgJAorCisjcHJhZ21hIHN0cm9uZ190eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSAiL3N5cy90aGluZy9wcm9wZXJ0aWVzLmgiCisjaW5jbHVkZSAiL3N5cy9saXZpbmcvcHV0X2FuZF9nZXQuaCIKKyNpbmNsdWRlICIvc3lzL2xpdmluZy9kZXNjcmlwdGlvbi5oIgorCisjaW5jbHVkZSA8Y29udGFpbmVyLmg+CisjaW5jbHVkZSA8cGxheWVyLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHJvb21zLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPG5ld19za2lsbHMuaD4KKyNpbmNsdWRlIDxhbnNpLmg+CisKKyNpbmNsdWRlIDxzeXNfZGVidWcuaD4KKwordmFyYXJncyBtaXhlZCBNb3JlKHN0cmluZyBzdHIsIGludCBmZmxhZywgc3RyaW5nIHJldHVybnRvKTsKKwordm9pZCBjcmVhdGUoKQoreworICBTZXQoUF9CUklFRiwgU0FWRSwgRl9NT0RFKTsKKyAgU2V0KFBfQkxJTkQsIFNBVkUsIEZfTU9ERSk7Cit9CisKK2ludCBfdG9nZ2xlX2JyaWVmKCkKK3sKKyAgaW50IGJyaWVmOworCisgIGlmIChxdWVyeV92ZXJiKCk9PSJrdXJ6IikKKyAgICBicmllZj0xOworICBlbHNlIGlmIChxdWVyeV92ZXJiKCk9PSJ1bHRyYWt1cnoiKQorICAgIGJyaWVmPTI7CisgIGVsc2UgYnJpZWY9MDsKKyAgU2V0UHJvcChQX0JSSUVGLCBicmllZik7CisgIHdyaXRlKCJEdSBiaXN0IG51biBpbSBcIiIrCisgICAgICAgIChicmllZj8oYnJpZWY9PTE/Ikt1cnoiOiJVbHRyYWt1cnoiKToiTGFuZyIpKyJcIm1vZHVzLlxuIik7CisgIHJldHVybiAxOworfQorCitwcml2YXRlIGludCBzb3J0aW52KG1peGVkIGEsIG1peGVkIGIpIHsgcmV0dXJuIGFbMF0gPiBiWzBdOyB9CisKK3ByaXZhdGUgc3RyaW5nIGNvbGxlY3RpbnYobWl4ZWQgb2JqKQoreworICBpZihvYmpbMF09PSIiKSByZXR1cm4gMDsKKyAgcmV0dXJuIChvYmpbMl0gPyAiICIgOiAiIikKKyAgICAgICArIG9ialswXQorICAgICAgICsgKG9ialsxXSA+IDEgPyAiICgiK29ialsxXSsiKSIgOiAiIik7Cit9CisKKyNkZWZpbmUgSV9BVVRPTE9BRCAgICAgIDEKKyNkZWZpbmUgSV9LRUVQICAgICAgICAgIDQKKyNkZWZpbmUgSV9GT1JNQVRURUQgICAgIDE2CisjZGVmaW5lIElfQVJNT1VSICAgICAgICA2NAorI2RlZmluZSBJX1NPUlQgICAgICAgICAgMjU2CisjZGVmaW5lIElfV0VBUE9OICAgICAgICAxMDI0CisjZGVmaW5lIElfRk9SQ0VfU09SVCAgICA0MDk2CisjZGVmaW5lIElfTk9fVEFCTEUgICAgICAxNjM4NAorCitwcml2YXRlIHN0cmluZyBnZXRmbGFncyhzdHJpbmcgYXJnLCBpbnQgZmxhZ3MpCit7CisgIGludCBubywgaTsKKyAgaWYoc2l6ZW9mKGFyZykgPCAyKSByZXR1cm4gMDsKKyAgbm8gPSAoYXJnWzBdID09ICctJyk7CisKKyAgZm9yKGkgPSAxOyBpIDwgc2l6ZW9mKGFyZyk7IGkrKykKKyAgeworICAgIHN3aXRjaChhcmdbaV0pCisgICAgeworICAgIGNhc2UgJ2EnOiBmbGFncyB8PSBJX0FVVE9MT0FEIDw8IG5vOyBicmVhazsKKyAgICBjYXNlICdiJzogZmxhZ3MgfD0gSV9LRUVQIDw8IG5vOyBicmVhazsKKyAgICBjYXNlICdmJzogZmxhZ3MgfD0gSV9GT1JNQVRURUQgPDwgbm87IGJyZWFrOworICAgIGNhc2UgJ3InOiBmbGFncyB8PSBJX0FSTU9VUiA8PCBubzsgYnJlYWs7CisgICAgY2FzZSAncyc6IGZsYWdzIHw9IElfU09SVCA8PCBubzsgYnJlYWs7CisgICAgY2FzZSAndyc6IGZsYWdzIHw9IElfV0VBUE9OIDw8IG5vOyBicmVhazsKKyAgICBjYXNlICd2JzogZmxhZ3MgfD0gKElfQVJNT1VSIHwgSV9XRUFQT04pIDw8ICFubzsgYnJlYWs7CisgICAgY2FzZSAnMSc6IGZsYWdzIHw9IElfTk9fVEFCTEU7IGJyZWFrOworICAgICAgICAvLyBEaWUgT3B0aW9uIG1hY2h0IG51ciBBZXJnZXIgdW5kIGtvbW1lbnRpZXJ0IGlzdCBzaWUgZWggbmljaHQuCisgICAgICAgIC8vIFdlciBkYXMgZHJpbmdlbmQgYnJhdWNodCwgc29sbCBXYXJnb25zIFNjaGllYmVwdXp6bGUgYmVudXR6ZW4uCisgICAgICAgIC8vCisgICAgICAgIC8vIFRpYW1haywgMTUuMTAuMjAwMAorICAgICAgICAvLyAgICBjYXNlICdTJzogZmxhZ3MgfD0gSV9GT1JDRV9TT1JUIDw8IG5vOyBicmVhazsKKyAgICBkZWZhdWx0IDogcmV0dXJuIGFyZ1tpLi5pXTsgLy8gd2lyZCBhdXNnZWdlYmVuIGFuIFNwaWVsZXIgYWxzIHVuYmVrYW5udC4KKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX2NoZWNrX2tlZXAob2JqZWN0IG9iKQoreworICByZXR1cm4gKG9iLT5RdWVyeVByb3AoUF9LRUVQX09OX1NFTEwpKT09Z2V0ZXVpZChNRSk7Cit9CisKK2ludCBfaW52ZW50b3J5KHN0cmluZyBzdHIpCit7CisgIG1peGVkICphcmdzLCBvdXRwdXQ7CisgIGludCBhbnNpLCBpLCBmbGFncywgbWludjsKKyAgbWl4ZWQgaW52ZW50b3J5LCB3ZWFwb25zLCBhcm1vdXJzLCBtaXNjOworICBzdHJpbmcgZm9ybWF0OworCisgIGlmKENhbm5vdFNlZSgpKSByZXR1cm4gMTsKKworICBpZigoc3RyID0gX3VucGFyc2VkX2FyZ3MoKSkgJiYgc3RyIT0iIikKKyAgeworICAgIHN0cmluZyBlcnJvcjsKKyAgICBlcnJvciA9ICJCZW51dHp1bmc6IGlbbnZlbnRhcl0gWy0vKzFhYmZyc3Z3XVxuIjsKKyAgICBhcmdzID0gcmVnZXhwKHJlZ2V4cGxvZGUoc3RyLCAiWy0rXVsxYWJmcnN3dl1bMWFiZnJzd3ZdKiIpLAorICAgICAgICAgICAgICAgICAgIlstK11bMWFiZnJzd3ZdWzFhYmZyc3d2XSoiKTsKKyAgICBpZighc2l6ZW9mKGFyZ3MpKSByZXR1cm4gKF9ub3RpZnlfZmFpbChlcnJvciksIDApOworICAgIGlmKHNpemVvZihhcmdzID0gbWFwKGFyZ3MsICMnZ2V0ZmxhZ3MvKicqLywgJmZsYWdzKSAtICh7IDAgfSkpKQorICAgIHsKKyAgICAgIHByaW50ZigiJXM6IFVuYmVrYW5udGVzIEFyZ3VtZW50LlxuIitlcnJvciwgaW1wbG9kZShhcmdzLCAiLCAiKSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKyAgLy8gRnVlciBTcGllbGVyIGdlaGVuIG51ciBzaWNodGJhcmUgT2JqZWt0ZSBpbiBkZW4gQWxnb3JpdGhtdXMKKyAgaWYgKElTX0xFQVJOSU5HKE1FKSkgIAorICAgIGludmVudG9yeSA9IGFsbF9pbnZlbnRvcnkoTUUpOworICBlbHNlCisgICAgaW52ZW50b3J5ID0gZmlsdGVyX29iamVjdHMoYWxsX2ludmVudG9yeShNRSksICJzaG9ydCIpOworICAKKyAgYW5zaSA9IG1lbWJlcigoeyJ2dDEwMCIsICJhbnNpIn0pLCBRdWVyeVByb3AoUF9UVFkpKSAhPSAtMTsKKyAgbWludiA9IDEgfCAoZmxhZ3MgJiAoSV9GT1JNQVRURUQgfCAoSV9GT1JNQVRURUQgPDwgMSkpID8gMiA6IDApOworICBmb3JtYXQgPSAoZmxhZ3MgJiBJX05PX1RBQkxFKSA/ICI9IiA6ICIjIjsKKworLy8gIGlmKGZsYWdzICYgKElfRk9SQ0VfU09SVCB8IElfRk9SQ0VfU09SVCA8PCAxKSkKKy8vICB7CisvLyAgICBjbG9zdXJlIHNmOworLy8gICAgc2YgPSBmbGFncyAmIElfRk9SQ0VfU09SVCA/ICMnPiA6ICMnPDsKKy8vICAgIHMgPSBzb3J0X2FycmF5KHMsIGxhbWJkYSgoeydhLCAnYn0pLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7IydmdW5jYWxsLCBzZiwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeyMnfHwsKHsjJ2NhbGxfb3RoZXIsJ2EsInNob3J0In0pLCIifSksCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHsjJ3x8LCh7IydjYWxsX290aGVyLCdiLCJzaG9ydCJ9KSwiIn0pfSkpKTsKKy8vICAgIG1hcF9vYmplY3RzKHMsICJtb3ZlIiwgdGhpc19vYmplY3QoKSk7CisvLyAgICBzID0gYWxsX2ludmVudG9yeShNRSk7CisvLyAgfQorCisgIGlmIChmbGFncyAmIElfQVVUT0xPQUQpCisgICAgaW52ZW50b3J5ID0gZmlsdGVyX29iamVjdHMoaW52ZW50b3J5LCJRdWVyeVByb3AiLFBfQVVUT0xPQURPQkopOworICBlbHNlIGlmIChmbGFncyAmIChJX0FVVE9MT0FEIDw8IDEpKQorICAgIGludmVudG9yeSAtPSBmaWx0ZXJfb2JqZWN0cyhpbnZlbnRvcnksIlF1ZXJ5UHJvcCIsUF9BVVRPTE9BRE9CSik7CisKKyAgaWYoZmxhZ3MgJiBJX0tFRVApCisgICAgaW52ZW50b3J5ID0gZmlsdGVyKGludmVudG9yeSwjJ19jaGVja19rZWVwKTsKKyAgZWxzZSBpZihmbGFncyAmIChJX0tFRVAgPDwgMSkpCisgICAgaW52ZW50b3J5IC09IGZpbHRlcihpbnZlbnRvcnksIydfY2hlY2tfa2VlcCk7CisKKyAgYXJtb3VycyA9IGZpbHRlcl9vYmplY3RzKGludmVudG9yeSwgIlF1ZXJ5UHJvcCIsIFBfQVJNT1VSX1RZUEUpOworICAvLyBLbGVpZHVuZyBkYXp1IGFkZGllcmVuLCB2b3JoZXIgZGllIGVya2FubnRlbiBSdWVzdHVuZ2VuIGFiemllaGVuLCBkaWUKKyAgLy8gbXVlc3NlbiBuaWNodCBub2NobWFsIGR1cmNoaXRlcmllcnQgd2VyZGVuLgorICBhcm1vdXJzICs9IGZpbHRlcl9vYmplY3RzKGludmVudG9yeS1hcm1vdXJzLCAiSXNDbG90aGluZyIpOworICAvLyBSdWVzdHVuZ2VuIHdlcmRlbiBoaWVyIG5pY2h0IGFiZ2V6b2dlbiwgd2VpbCBlcyBLcmFtIGdpYnQsIHdlbGNoZSBzb3dvaGwKKyAgLy8gUnVlc3R1bmcgYWxzIGF1Y2ggV2FmZmUgaXN0LgorICB3ZWFwb25zID0gZmlsdGVyX29iamVjdHMoaW52ZW50b3J5LCAiUXVlcnlQcm9wIiwgUF9XRUFQT05fVFlQRSk7CisgIG1pc2MgPSBpbnZlbnRvcnkgLSB3ZWFwb25zIC0gYXJtb3VyczsgLy8gcmVzdCA7LSkKKworICBpZihmbGFncyAmIElfV0VBUE9OKQorICB7CisgICAgaW52ZW50b3J5ID0gd2VhcG9uczsgbWlzYyA9ICh7fSk7CisgICAgaWYoIShmbGFncyAmIChJX0FSTU9VUikpKSBhcm1vdXJzID0gKHt9KTsKKyAgfQorICBpZihmbGFncyAmIElfQVJNT1VSKQorICB7CisgICAgIGludmVudG9yeSA9IGFybW91cnM7IG1pc2MgPSAoe30pOworICAgICBpZighKGZsYWdzICYgSV9XRUFQT04pKSB3ZWFwb25zID0gKHt9KTsKKyAgfQorICBpZihmbGFncyAmIChJX1dFQVBPTiA8PCAxKSkgeyB3ZWFwb25zID0gKHt9KTsgaW52ZW50b3J5ID0gYXJtb3VycyArIG1pc2M7IH0KKyAgaWYoZmxhZ3MgJiAoSV9BUk1PVVIgPDwgMSkpIHsgYXJtb3VycyA9ICh7fSk7IGludmVudG9yeSA9IHdlYXBvbnMgKyBtaXNjOyB9CisKKyAgb3V0cHV0ID0gIiI7CisgIGlmKGZsYWdzICYgKElfRk9STUFUVEVEIHwgKElfRk9STUFUVEVEIDw8IDEpKSkKKyAgeworICAgIGludmVudG9yeSA9IG1ha2VfaW52bGlzdCh0aGlzX3BsYXllcigpLCBpbnZlbnRvcnksIG1pbnYpOworICAgIGlmKGZsYWdzICYgKElfU09SVCB8IChJX1NPUlQgPDwgMSkpKQorICAgIGludmVudG9yeSA9IHNvcnRfYXJyYXkoaW52ZW50b3J5LCAjJ3NvcnRpbnYvKicqLyk7CisgICAgb3V0cHV0ICs9IHNwcmludGYoIiUiK2Zvcm1hdCsiLTc4c1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBpbXBsb2RlKG1hcChpbnZlbnRvcnksIydjb2xsZWN0aW52LyonKi8pLCJcbiIpKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBpZih3ZWFwb25zICYmIHNpemVvZih3ZWFwb25zKSkKKyAgICB7CisgICAgICB3ZWFwb25zID0gbWFrZV9pbnZsaXN0KHRoaXNfcGxheWVyKCksIHdlYXBvbnMsIG1pbnYpOworICAgICAgaWYoZmxhZ3MgJiAoSV9TT1JUIHwgKElfU09SVCA8PCAxKSkpCisgICAgICAgIHdlYXBvbnMgPSBzb3J0X2FycmF5KHdlYXBvbnMsICMnc29ydGludi8qJyovKTsKKyAgICAgIG91dHB1dCArPSAoYW5zaT9BTlNJX0JPTEQ6IiIpICsgIldhZmZlbjoiICsgKGFuc2k/QU5TSV9OT1JNQUw6IiIpKyJcbiIKKyAgICAgICAgICAgICAgKyBzcHJpbnRmKCIlIitmb3JtYXQrIi03OHNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbXBsb2RlKG1hcCh3ZWFwb25zLCAjJ2NvbGxlY3RpbnYvKicqLyksICJcbiIpKTsKKyAgICB9CisgICAgaWYoYXJtb3VycyAmJiBzaXplb2YoYXJtb3VycykpCisgICAgeworICAgICAgYXJtb3VycyA9IG1ha2VfaW52bGlzdCh0aGlzX3BsYXllcigpLCBhcm1vdXJzLCBtaW52KTsKKyAgICAgIGlmKGZsYWdzICYgKElfU09SVCB8IChJX1NPUlQgPDwgMSkpKQorICAgICAgICBhcm1vdXJzID0gc29ydF9hcnJheShhcm1vdXJzLCAjJ3NvcnRpbnYvKicqLyk7CisgICAgICBvdXRwdXQgKz0gKGFuc2k/QU5TSV9CT0xEOiIiKSAKKyAgICAgICAgICAgICAgKyAiS2xlaWR1bmcgJiBSdWVzdHVuZ2VuOiIgKyAoYW5zaT9BTlNJX05PUk1BTDoiIikrIlxuIgorICAgICAgICAgICAgICArIHNwcmludGYoIiUiK2Zvcm1hdCsiLTc4c1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGltcGxvZGUobWFwKGFybW91cnMsICMnY29sbGVjdGludi8qJyovKSwgIlxuIikpOworICAgIH0KKyAgICBpZihtaXNjICYmIHNpemVvZihtaXNjKSkKKyAgICB7CisgICAgICBtaXNjID0gbWFrZV9pbnZsaXN0KHRoaXNfcGxheWVyKCksIG1pc2MsIG1pbnYpOworICAgICAgaWYoZmxhZ3MgJiAoSV9TT1JUIHwgKElfU09SVCA8PCAxKSkpCisgICAgICAgIG1pc2MgPSBzb3J0X2FycmF5KG1pc2MsICMnc29ydGludi8qJyovKTsKKyAgICAgIG91dHB1dCArPSAoYW5zaT9BTlNJX0JPTEQ6IiIpICsgIlZlcnNjaGllZGVuZXM6IiArIChhbnNpP0FOU0lfTk9STUFMOiIiKSsiXG4iCisgICAgICAgICAgICAgICsgc3ByaW50ZigiJSIrZm9ybWF0KyItNzhzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaW1wbG9kZShtYXAobWlzYywgIydjb2xsZWN0aW52LyonKi8pLCAiXG4iKSk7CisgICAgfQorICB9CisKKyAgLy8gU3BpZWxlcnd1bnNjaDogJ2ludmVudGFyJyBzb2xsdGUgZG9jaCBkYXMgQmV6dWdzb2JqZWt0IGF1ZiBkZW4gU3BpZWxlcgorICAvLyBhZW5kZXJuLgorICBTZXRQcm9wKFBfUkVGRVJFTkNFX09CSkVDVCwgdGhpc19vYmplY3QoKSk7CisKKyAgaWYgKG91dHB1dD09IiIpIAorICAgIG91dHB1dCArPSAoYW5zaT9BTlNJX0JPTEQ6IiIpKyJEaWUgTGlzdGUgaXN0IGxlZXIuIisoYW5zaT9BTlNJX05PUk1BTDoiIik7CisgIE1vcmUob3V0cHV0KTsKKyAgcmV0dXJuIDE7Cit9CisKK3ByaXZhdGUgbm9zYXZlIGludCBleGFfY250OworcHJpdmF0ZSBub3NhdmUgaW50IGV4YV90aW1lOworcHJpdmF0ZSBub3NhdmUgc3RyaW5nICpleGE7CisKK3ZhcmFyZ3MgaW50IF9leGFtaW5lKHN0cmluZyBzdHIsIGludCBtb2RlKQoreworICBvYmplY3QgYmFzZSwgKm9ianMsIGVudjsKKyAgc3RyaW5nIHdoYXQsIGRldGFpbCwgcGFyZW50LCBvdXQsIGVycm9yOworICBpbnQgaSwgc2l6ZSwgZG9uZTsKKworICBpZihDYW5ub3RTZWUoKSkgcmV0dXJuIDE7CisKKyAgX25vdGlmeV9mYWlsKCJXYXMgd2lsbHN0IER1IGRlbm4gdW50ZXJzdWNoZW4/XG4iKTsKKyAgaWYgKCFzdHIpIHJldHVybiAwOworCisgIGlmIChtZW1iZXIoKHsiYm9kZW4iLCJkZWNrZSIsIndhbmQiLCJ3YWVuZGUifSksb2xkX2V4cGxvZGUoc3RyLCIgIilbMF0pID09IC0xKSB7CisgICAgZXhhX2NudCAtPSAodGltZSgpIC0gZXhhX3RpbWUpLzI7CisgICAgZXhhX3RpbWUgPSB0aW1lKCk7CisgICAgZXhhX2NudCsrOworICAgIGlmICghZXhhKQorICAgICAgZXhhID0gKHsgc3RyIH0pOworICAgIGVsc2UKKyAgICAgIGV4YSArPSAoeyBzdHIgfSk7CisgICAgaWYgKGV4YV9jbnQgPiAxMCkgeworICAgICAgbG9nX2ZpbGUoIkFSQ0gvTE9PSyIsIAorICAgICAgICAgIHNwcmludGYoIiVzOiAlcyBpbiAlc1xuJUBPXG4iLGR0aW1lKHRpbWUoKSksZ2V0dWlkKHRoaXNfb2JqZWN0KCkpLCAKKyAgICAgICAgICAgIGVudmlyb25tZW50KCkgPyBvYmplY3RfbmFtZShlbnZpcm9ubWVudCgpKSA6ICI/Pz8iLGV4YSksIDE1MDAwMCk7CisgICAgICBleGFfY250ID0gMDsKKyAgICAgIGV4YSA9ICh7fSk7CisgICAgfQorICAgIGVsc2UgaWYgKGV4YV9jbnQgPCAwKSB7CisgICAgICBleGFfY250ID0gMDsKKyAgICAgIGV4YSA9ICh7fSk7CisgICAgfQorICB9CisgIC8vIGRvIHdlIGxvb2sgYXQgYW4gb2JqZWN0IGluIG91ciBlbnZpcm9ubWVudCA/CisgIGlmIChzc2NhbmYoc3RyLCIlcyBpbiByYXVtIiwgd2hhdCkgfHwgc3NjYW5mKHN0ciwiJXMgaW0gcmF1bSIsIHdoYXQpKQorICAgICAgYmFzZSA9IGVudmlyb25tZW50KCk7CisgIC8vIGlzIHRoZSBvYmplY3QgaW5zaWRlIG9mIG1lIChpbnZlbnRvcnkpCisgIGVsc2UgaWYgKHNzY2FuZihzdHIsIiVzIGluIG1pciIsIHdoYXQpIHx8IHNzY2FuZihzdHIsIiVzIGluIGRpciIsIHdoYXQpKQorICAgICAgYmFzZSA9IHRoaXNfb2JqZWN0KCk7CisgIGVsc2UgeworICAgICAgd2hhdCA9IHN0cjsKKyAgICAgIC8vIGdldCB0aGUgbGFzdCBvYmplY3Qgd2UgbG9va2VkIGF0CisgICAgICBiYXNlID0gUXVlcnlQcm9wKFBfUkVGRVJFTkNFX09CSkVDVCk7CisgICAgICAKKyAgICAgIC8vIGlmIGEgcmVmZXJlbmNlIG9iamVjdCBleGlzdHMsIHRlc3QgZm9yIGl0cyBleGlzdGFuY2UgaW4gdGhlIHJvb20KKyAgICAgIC8vIG9yIGluIG91ciBpbnZlbnRvcnkKKyAgICAgIGlmIChvYmplY3RwKGJhc2UpKQorICAgICAgeworICAgICAgIGlmIChiYXNlID09IGVudmlyb25tZW50KCkgfHwgYmFzZT09dGhpc19vYmplY3QoKSkKKyAgICAgICAgeworICAgICAgICAgIC8vIFVtZ2VidW5nIG9kZXIgU3BpZWxlciBzZWxiZXIgc2luZCBhbHMgQmV6dWdzb2JqZWt0IGltbWVyIGluCisgICAgICAgICAgLy8gT3JkbnVuZywgbmljaHRzIG1hY2hlbi4KKyAgICAgICAgfQorICAgICAgICAvLyBEYXMgUmVmZXJlbnpvYmpla3QgZGFyZiBuaWNodCB1bnNpY2h0YmFyIHNlaW4uCisgICAgICAgIGVsc2UgaWYgKCFiYXNlLT5zaG9ydCgpKQorICAgICAgICAgIGJhc2UgPSAwOworICAgICAgICBlbHNlIGlmKG1lbWJlcihkZWVwX2ludmVudG9yeShlbnZpcm9ubWVudCgpKSwgYmFzZSkgIT0gLTEpCisgICAgICAgIHsKKyAgICAgICAgICBmb3JlYWNoKGVudiA6IGFsbF9lbnZpcm9ubWVudChiYXNlKSkgeworICAgICAgICAgICAgLy8gSXN0IGVpbmUgVW1nZWJ1bmcgTGl2aW5nIG9kZXIgaW50cmFuc3BhcmVudGVyIENvbnRhaW5lciBvZGVyCisgICAgICAgICAgICAvLyB1bnNpY2h0YmFyPworICAgICAgICAgICAgaWYgKGxpdmluZyhlbnYpIHx8ICFlbnYtPlF1ZXJ5UHJvcChQX1RSQU5TUEFSRU5UKQorICAgICAgICAgICAgICAgIHx8ICFlbnYtPnNob3J0KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8vIGluIGRlbSBGYWxsIGlzdCBlbmRlLCBhYmVyIHdlbm4gZGFzIGdlZnVuZGVuZSBFbnYgbmljaHQKKyAgICAgICAgICAgICAgLy8gZGllc2VzIExpdmluZyBzZWxiZXIgb2RlciBzZWluIEVudiBpc3QsIHdpcmQgZGFzCisgICAgICAgICAgICAgIC8vIFJlZmVyZW56b2JqZWt0IHp1c2FldHpsaWNoIGdlbnVsbHQuCisgICAgICAgICAgICAgIGlmIChlbnYgIT0gdGhpc19vYmplY3QoKSAmJiBlbnYgIT0gZW52aXJvbm1lbnQoKSkKKyAgICAgICAgICAgICAgICBiYXNlID0gMDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBiYXNlID0gMDsgLy8gbmljaHQgaW0gUmF1bSBvZGVyIEludmVudG9yeQorICAgICAgfQorICB9CisKKyAgLy8gc2NhbiBpbnB1dCBpZiB3ZSB3YW50IGEgc3BlY2lmaWMgb2JqZWN0IHRvIGxvb2sgYXQKKyAgaWYoc3NjYW5mKHdoYXQsICIlcyBhbiAlcyIsIGRldGFpbCwgcGFyZW50KSA9PSAyIHx8CisgICAgIHNzY2FuZih3aGF0LCAiJXMgYW0gJXMiLCBkZXRhaWwsIHBhcmVudCkgPT0gMiB8fAorICAgICBzc2NhbmYod2hhdCwgIiVzIGluICVzIiwgZGV0YWlsLCBwYXJlbnQpID09IDIgfHwKKyAgICAgc3NjYW5mKHdoYXQsICIlcyBpbSAlcyIsIGRldGFpbCwgcGFyZW50KSA9PSAyKQorICB7CisgICAgLy8gaWYgYW4gcmVmIG9iamVjdCBleGlzdHMgZ2V0IGl0cyBpbnZlbnRvcnkuIChPYmVuIHd1cmRlIHNpY2hlcmdlc3RlbGx0LAorICAgIC8vIGRhc3MgZGFzIFJlZmVyZW56b2JqZWt0IGVpbnNlaGJhciBpc3QpCisgICAgaWYoYmFzZSkKKyAgICAgIG9ianMgPSBiYXNlLT5sb2NhdGVfb2JqZWN0cyhwYXJlbnQsIDEpIHx8ICh7fSk7CisgICAgZWxzZSB7CisgICAgICAvLyBlbHNlIGdldCBvdXIgaW52IGFuZCBlbnYKKyAgICAgIG9ianMgPSBlbnZpcm9ubWVudCgpLT5sb2NhdGVfb2JqZWN0cyhwYXJlbnQsIDEpCisgICAgICAgICAgICsgbG9jYXRlX29iamVjdHMocGFyZW50LCAxKTsKKyAgICB9CisgICAgb2JqcyA9IGZpbHRlcl9vYmplY3RzKG9ianMsICJzaG9ydCIpOyAvLyBudXIgc2ljaHRiYXJlLi4uCisgICAgaWYoc2l6ZW9mKG9ianMpID4gMSkKKyAgICAgIHJldHVybiAobm90aWZ5X2ZhaWwoIkVzIGdpYnQgbWVociBhbHMgZWluZShuKSAiK2NhcGl0YWxpemUocGFyZW50KSsiLlxuIiksIDApOworICAgIGVsc2UKKyAgICB7CisgICAgICBpZiAoc2l6ZW9mKG9ianMpKQorICAgICAgICBiYXNlID0gb2Jqc1swXTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIChub3RpZnlfZmFpbCgiSGllciBpc3Qga2VpbihlKSAiK2NhcGl0YWxpemUocGFyZW50KSsiLlxuIiksIDApOworICAgIH0KKyAgICBvYmpzID0gMDsKKyAgfQorICBlbHNlIGRldGFpbCA9IHdoYXQ7CisKKyAgaW50IGJhc2Vfd2FzX2VudiA9IDE7CisgIGRvIHsKKyAgICAvLyBpZiBhIGJhc2UgZXhpc3RzIGdldCBpdHMgaW52ZW50b3J5LCBlbHNlIGdldCBvdXIgaW52IGFuZCBlbnYKKyAgICBpZiAoYmFzZSkKKyAgICB7CisgICAgICBpZiAgKGJhc2UgPT0gdGhpc19vYmplY3QoKSB8fCBiYXNlID09IGVudmlyb25tZW50KCkgfHwKKyAgICAgICAgICAoYmFzZS0+UXVlcnlQcm9wKFBfVFJBTlNQQVJFTlQpICYmICFsaXZpbmcoYmFzZSkpKQorICAgICAgeworICAgICAgICAvLyBpY2gga2FubiBpbiBiYXNlIHJlaW5ndWNrZW4uLi4KKyAgICAgICAgb2JqcyA9IGJhc2UtPmxvY2F0ZV9vYmplY3RzKGRldGFpbCwgMSkgfHwgKHt9KTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLy8gUmVmZXJlbnpvYmpla3QgZGEsIGFiZXIgbmljaHQgcmVpbmd1Y2tiYXIuIGJhc2UgYWJlciBuaWNodCBudWxsZW4sCisgICAgICAgIC8vIGRlbm4gZXMgaXN0IGphIG5vY2ggZ3VlbHRpZyBmdWVyIERldGFpbHN1Y2hlbiBhbiBiYXNlLi4uCisgICAgICAgIG9ianMgPSAoe30pOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgb2JqcyA9IGVudmlyb25tZW50KCktPmxvY2F0ZV9vYmplY3RzKGRldGFpbCwgMSkKKyAgICAgICAgICAgKyBsb2NhdGVfb2JqZWN0cyhkZXRhaWwsIDEpOworICAgICAgYmFzZSA9IGVudmlyb25tZW50KCk7CisgICAgfQorICAgIG9ianMgPSBmaWx0ZXJfb2JqZWN0cyhvYmpzLCAic2hvcnQiKTsgLy8gbnVyIHNpY2h0YmFyZS4uLgorCisgICAgaWYoIXNpemVvZihvYmpzKSkKKyAgICB7CisgICAgICAvLyB3ZW5uIGtlaW5lIE9iamVrdGUgZ2VmdW5kZW4gd3VyZGVuLCB3aXJkIG5hY2ggRGV0YWlscyBnZXN1Y2h0Li4uCisgICAgICBpZigob3V0ID0gYmFzZS0+R2V0RGV0YWlsKGRldGFpbCwgUXVlcnlQcm9wKFBfUkVBTF9SQUNFKSxTRU5TRV9WSUVXKSkgfHwKKyAgICAgICAgIChvdXQgPSBiYXNlLT5HZXREb29yRGVzYyhkZXRhaWwpKSkKKyAgICAgIHsKKyAgICAgICAgU2V0UHJvcChQX1JFRkVSRU5DRV9PQkpFQ1QsIGJhc2UpOworICAgICAgICByZXR1cm4gKHdyaXRlKG91dCksIDEpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvLyB3ZW5uIGF1Y2gga2VpbmUgRGV0YWlscyBnZWZ1bmRlbiwgZGFubiBzY2hhdWVuLCBvYiBFbmRlIGlzdAorICAgICAgICAvLyAoYmFzZT09ZW52KSBvZGVyIHdpciBldnRsLiBub2NoIGltIGVudiBzdWNoZW4ga29lbm5lbi4KKyAgICAgICAgaWYgKGJhc2UgPT0gZW52aXJvbm1lbnQoKSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChiYXNlX3dhc19lbnYpIHsKKyAgICAgICAgICAgIC8vIGluIGRpZXNlbSBGYWxsIHdhciBkYXMgRW52IGRhcyBCZXp1Z3NvYmpla3QgLSBkYWhlciB3ZWd3ZXJmZW4uCisgICAgICAgICAgICBTZXRQcm9wKFBfUkVGRVJFTkNFX09CSkVDVCwgMCk7CisgICAgICAgICAgICBfbm90aWZ5X2ZhaWwoIlNvd2FzIHNpZWhzdCBEdSBkYSBuaWNodCFcbiIpOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIF9ub3RpZnlfZmFpbCgiU293YXMgc2llaHN0IER1IGF1Y2ggZGEgbmljaHQhXG4iKTsKKyAgICAgICAgICAgIC8vIGluIGRpZXNlbSBGYWxsIHdhciBuaWNodCBkYXMgRW52IGRhcyBCZXp1Z3NvYmpla3QgLSBlcyBzb2xsCisgICAgICAgICAgICAvLyBiZWhhbHRlbiB1bmQgbmljaHQgZ2Vsb2VzY2h0IHdlcmRlbi4KKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgYmFzZV93YXNfZW52PTA7CisgICAgICAgICAgd3JpdGUoYnJlYWtfc3RyaW5nKCJEdSBmaW5kZXN0IGFuICIrYmFzZS0+bmFtZShXRU0pCisgICAgICAgICAgICAgICAgKyIga2VpbiBcIiIgKyBjYXBpdGFsaXplKGRldGFpbCkgKyAiXCIuIgorICAgICAgICAgICAgICAgICAiIERlaW4gQmxpY2sgd2VuZGV0IHNpY2ggZGVyIFVtZ2VidW5nIHp1LiIsNzgpKTsKKyAgICAgICAgICBiYXNlID0gMDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlICAvLyBPYmpla3RlIGdlZnVuZGVuIQorICAgICAgZG9uZSA9IDE7CisgIH0gd2hpbGUoIWRvbmUpOworCisgIC8vIEVzIG11c3MgbWluLiBlaW4gKHNpY2h0YmFyZXMpIE9iamVrdCBnZWJlbiwgc29uc3Qgd2FlcmUgbWFuIGhpZXIgbmljaHQKKyAgLy8gaGluZ2Vrb21tZW4uCisgIG9iamVjdCBvYiA9IG9ianNbMF07CisgIFNldFByb3AoUF9SRUZFUkVOQ0VfT0JKRUNULCBvYik7CisgIHRlbGxfb2JqZWN0KE1FLCBvYi0+bG9uZyhtb2RlKSk7CisgIHJldHVybiAxOworfQorCit2YXJhcmdzIGludCBfc2Vuc2VfZXhhKHN0cmluZyBzdHIpCit7CisgIG9iamVjdCBiYXNlLCAqb2JqcywgZW52OworICBzdHJpbmcgd2hhdCwgZGV0YWlsLCBwYXJlbnQsIG91dCwgZXJyb3I7CisgIGludCBzZW5zZTsKKworICBpZihtZW1iZXIoKHsicmllY2giLCJyaWVjaGUiLCJzY2hudXBwZXIiLCJzY2hudXBwZXJlIn0pLHF1ZXJ5X3ZlcmIoKSkhPS0xKQorICB7CisgICAgX25vdGlmeV9mYWlsKCJEdSBrYW5uc3QgbmljaHRzIEJlc29uZGVyZXMgcmllY2hlbi5cbiIpOworICAgIHNlbnNlID0gU0VOU0VfU01FTEw7CisgIH0KKyAgZWxzZSBpZihtZW1iZXIoKHsibGF1c2NoZSIsImxhdXNjaCIsImhvZXIiLCJob2VyZSJ9KSxxdWVyeV92ZXJiKCkpIT0tMSkKKyAgeworICAgIGlmKFF1ZXJ5UHJvcChQX0RFQUYpKQorICAgICAgcmV0dXJuIG5vdGlmeV9mYWlsKCJEdSBiaXN0IHRhdWIhXG4iKSwgMDsKKworICAgIF9ub3RpZnlfZmFpbCgiRHUga2FubnN0IG5pY2h0cyBCZXNvbmRlcmVzIGhvZXJlbi5cbiIpOworICAgIHNlbnNlID0gU0VOU0VfU09VTkQ7CisgIH0KKyAgZWxzZSBpZihtZW1iZXIoKHsidGFzdGUiLCJiZXJ1ZWhyZSIsImJlcnVlaHIifSkscXVlcnlfdmVyYigpKSE9LTEpCisgIHsKKyAgICBzZW5zZSA9IFNFTlNFX1RPVUNIOworICAgIC8vIGVpbiAiYWIiIGdhbnogYW0gRW5kZSB2b24gc3RyIHdpcmQgYWJnZXNjaG5pdHRlbiwgZXMgc29sbCBzb3dvaGwgInRhc3RlCisgICAgLy8geCBhYiIgYWxzIGF1Y2ggInRhc3RlIHgiIGZ1bmt0aW9uaWVyZW4uCisgICAgaWYgKHN0cikgeworICAgICAgX25vdGlmeV9mYWlsKCJTb3dhcyBrYW5uc3QgRHUgaGllciBuaWNodCBlcnRhc3RlbiFcbiIpOworICAgICAgc3RyaW5nICp0bXAgPSBleHBsb2RlKHN0ciwiICIpOworICAgICAgaWYgKHNpemVvZih0bXApID4gMSAmJiB0bXBbPDFdID09ICJhYiIpCisgICAgICAgIHN0ciA9IGltcGxvZGUodG1wWzAuLjwyXSwgIiAiKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgX25vdGlmeV9mYWlsKCJXYXMgd2lsbHN0IER1IGRlbm4gYWJ0YXN0ZW4/XG4iKTsKKyAgfQorICBlbHNlIGlmIChtZW1iZXIoKHsibGllcyIsImxlc2UiLCJsZXMifSksIHF1ZXJ5X3ZlcmIoKSkgPiAtMSkKKyAgeworICAgIF9ub3RpZnlfZmFpbCgiV2FzIHdpbGxzdCBEdSBsZXNlbj9cbiIpOworICAgIGlmICggIXN0ciApIC8vIEtlaW4gU0VOU0VfREVGQVVMVCB6dWxhc3Nlbi4KKyAgICAgIHJldHVybiAwOworICAgIGlmICh0aGlzX29iamVjdCgpLT5DYW5ub3RTZWUoKSkgeworICAgICAgbm90aWZ5X2ZhaWwoIkR1IGthbm5zdCBuaWNodHMgc2VoZW4hXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBzZW5zZSA9IFNFTlNFX1JFQUQ7CisgIH0KKworICBpZiAoIXN0cikgeworICAgIGlmKCFkZXRhaWwgPQorICAgICAgICBlbnZpcm9ubWVudCgpLT5HZXREZXRhaWwoU0VOU0VfREVGQVVMVCxRdWVyeVByb3AoUF9SRUFMX1JBQ0UpLHNlbnNlKSkKKyAgICAgIHJldHVybiAwOworICAgIHdyaXRlKGRldGFpbCk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgZWxzZSBpZihzc2NhbmYoc3RyLCJhbiAlcyIsd2hhdCk9PTEpCisgICAgc3RyPXdoYXQ7CisKKyAgLy8gZG8gd2UgbG9vayBhdCBhbiBvYmplY3QgaW4gb3VyIGVudmlyb25tZW50ID8KKyAgaWYgKHNzY2FuZihzdHIsIiVzIGluIHJhdW0iLCB3aGF0KSB8fCBzc2NhbmYoc3RyLCIlcyBpbSByYXVtIiwgd2hhdCkpCisgICAgICBiYXNlID0gZW52aXJvbm1lbnQoKTsKKyAgLy8gaXMgdGhlIG9iamVjdCBpbnNpZGUgb2YgbWUgKGludmVudG9yeSkKKyAgZWxzZSBpZiAoc3NjYW5mKHN0ciwiJXMgaW4gbWlyIiwgd2hhdCkgfHwgc3NjYW5mKHN0ciwiJXMgaW4gZGlyIiwgd2hhdCkpCisgICAgICBiYXNlID0gdGhpc19vYmplY3QoKTsKKyAgZWxzZSB7CisgICAgICB3aGF0ID0gc3RyOworICAgICAgLy8gZ2V0IHRoZSBsYXN0IG9iamVjdCB3ZSBsb29rZWQgYXQKKyAgICAgIGJhc2UgPSBRdWVyeVByb3AoUF9SRUZFUkVOQ0VfT0JKRUNUKTsKKyAgICAgIAorICAgICAgLy8gaWYgYSByZWZlcmVuY2Ugb2JqZWN0IGV4aXN0cywgdGVzdCBmb3IgaXRzIGV4aXN0YW5jZSBpbiB0aGUgcm9vbQorICAgICAgLy8gb3IgaW4gb3VyIGludmVudG9yeQorICAgICAgaWYgKG9iamVjdHAoYmFzZSkpCisgICAgICB7CisgICAgICAgIGlmIChiYXNlID09IGVudmlyb25tZW50KCkgfHwgYmFzZT09dGhpc19vYmplY3QoKSkKKyAgICAgICAgeworICAgICAgICAgIC8vIFVtZ2VidW5nIG9kZXIgU3BpZWxlciBzZWxiZXIgc2luZCBhbHMgQmV6dWdzb2JqZWt0IGltbWVyIGluCisgICAgICAgICAgLy8gT3JkbnVuZywgbmljaHRzIG1hY2hlbi4KKyAgICAgICAgfQorICAgICAgICAvLyBEYXMgUmVmZXJlbnpvYmpla3QgZGFyZiBuaWNodCB1bnNpY2h0YmFyIHNlaW4uCisgICAgICAgIGVsc2UgaWYgKCFiYXNlLT5zaG9ydCgpKQorICAgICAgICAgIGJhc2UgPSAwOworICAgICAgICBlbHNlIGlmKG1lbWJlcihkZWVwX2ludmVudG9yeShlbnZpcm9ubWVudCgpKSwgYmFzZSkgIT0gLTEpCisgICAgICAgIHsKKyAgICAgICAgICBmb3JlYWNoKGVudiA6IGFsbF9lbnZpcm9ubWVudChiYXNlKSkgeworICAgICAgICAgICAgLy8gSXN0IGVpbmUgVW1nZWJ1bmcgTGl2aW5nIG9kZXIgaW50cmFuc3BhcmVudGVyIENvbnRhaW5lciBvZGVyCisgICAgICAgICAgICAvLyB1bnNpY2h0YmFyPworICAgICAgICAgICAgaWYgKGxpdmluZyhlbnYpIHx8ICFlbnYtPlF1ZXJ5UHJvcChQX1RSQU5TUEFSRU5UKQorICAgICAgICAgICAgICAgIHx8ICFlbnYtPnNob3J0KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8vIGluIGRlbSBGYWxsIGlzdCBlbmRlLCBhYmVyIHdlbm4gZGFzIGdlZnVuZGVuZSBFbnYgbmljaHQKKyAgICAgICAgICAgICAgLy8gZGllc2VzIExpdmluZyBzZWxiZXIgb2RlciBzZWluIEVudiBpc3QsIHdpcmQgZGFzCisgICAgICAgICAgICAgIC8vIFJlZmVyZW56b2JqZWt0IHp1c2FldHpsaWNoIGdlbnVsbHQuCisgICAgICAgICAgICAgIGlmIChlbnYgIT0gdGhpc19vYmplY3QoKSAmJiBlbnYgIT0gZW52aXJvbm1lbnQoKSkKKyAgICAgICAgICAgICAgICBiYXNlID0gMDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBiYXNlID0gMDsgLy8gbmljaHQgaW0gUmF1bSBvZGVyIEludmVudG9yeQorICAgICAgfQorICB9CisKKyAgLy8gc2NhbiBpbnB1dCBpZiB3ZSB3YW50IGEgc3BlY2lmaWMgb2JqZWN0IHRvIGxvb2sgYXQKKyAgaWYoc3NjYW5mKHdoYXQsICIlcyBhbiAlcyIsIGRldGFpbCwgcGFyZW50KSA9PSAyIHx8CisgICAgIHNzY2FuZih3aGF0LCAiJXMgYW0gJXMiLCBkZXRhaWwsIHBhcmVudCkgPT0gMiB8fAorICAgICBzc2NhbmYod2hhdCwgIiVzIGluICVzIiwgZGV0YWlsLCBwYXJlbnQpID09IDIgfHwKKyAgICAgc3NjYW5mKHdoYXQsICIlcyBpbSAlcyIsIGRldGFpbCwgcGFyZW50KSA9PSAyKQorICB7CisgICAgLy8gaWYgYW4gcmVmIG9iamVjdCBleGlzdHMgZ2V0IGl0cyBpbnZlbnRvcnkuIChPYmVuIHd1cmRlIHNpY2hlcmdlc3RlbGx0LAorICAgIC8vIGRhc3MgZGFzIFJlZmVyZW56b2JqZWt0IGVpbnNlaGJhciBpc3QpCisKKyAgICBpZihiYXNlKQorICAgICAgb2JqcyA9IGJhc2UtPmxvY2F0ZV9vYmplY3RzKHBhcmVudCwgMSkgfHwgKHt9KTsKKyAgICBlbHNlCisgICAgeworICAgICAgLy8gZWxzZSBnZXQgb3VyIGludiBhbmQgZW52CisgICAgICBvYmpzID0gZW52aXJvbm1lbnQoKS0+bG9jYXRlX29iamVjdHMocGFyZW50LCAxKQorICAgICAgICAgICArIGxvY2F0ZV9vYmplY3RzKHBhcmVudCwgMSk7CisgICAgfQorICAgIG9ianMgPSBmaWx0ZXJfb2JqZWN0cyhvYmpzLCAic2hvcnQiKTsgLy8gbnVyIHNpY2h0YmFyZS4uLgorICAgIGlmKHNpemVvZihvYmpzKSA+IDEpCisgICAgICByZXR1cm4gKG5vdGlmeV9mYWlsKCJFcyBnaWJ0IG1laHIgYWxzIGVpbmUobikgIitjYXBpdGFsaXplKHBhcmVudCkrIi5cbiIpLCAwKTsKKyAgICBlbHNlCisgICAgeworICAgICAgaWYoc2l6ZW9mKG9ianMpKQorICAgICAgICAgIGJhc2UgPSBvYmpzWzBdOworICAgICAgZWxzZQorICAgICAgICAgIHJldHVybiAobm90aWZ5X2ZhaWwoIkhpZXIgaXN0IGtlaW4oZSkgIitjYXBpdGFsaXplKHBhcmVudCkrIi5cbiIpLCAwKTsKKyAgICB9CisgICAgb2JqcyA9IDA7CisgIH0KKyAgZWxzZSBkZXRhaWwgPSB3aGF0OworCisgIC8vIHdpZSBhdWNoIGltbWVyIGhhYmVuIHdpciBqZXR6dCBlaW4gQmV6dWdzb2JqZWt0LgorICBpbnQgbWF4dHJpZXM9MzsKKyAgZG8geworICAgIGludCBiYXNlX3dhc19lbnY9MTsKKyAgICAvLyBhbHMgZXJzdGVuIHdlcmRlbiBpbiBGcmFnZSBrb21tZW5kZSBPYmpla3RlIGdlc3VjaHQuIFdlbm4gYmFzZQorICAgIC8vIGV4aXN0aWVydCAoaWRSIG51ciBpbSBlcnN0ZW4gRHVyY2hsYXVmKSwgd2lyZCBkb3J0IGdlc3VjaHQsIHNvbnN0IGluCisgICAgLy8gRW52IHVuZCBJbnYuCisgICAgaWYgKGJhc2UpCisgICAgeworICAgICAgaWYgIChiYXNlID09IHRoaXNfb2JqZWN0KCkgfHwgYmFzZSA9PSBlbnZpcm9ubWVudCgpIHx8CisgICAgICAgICAgKGJhc2UtPlF1ZXJ5UHJvcChQX1RSQU5TUEFSRU5UKSAmJiAhbGl2aW5nKGJhc2UpKSkKKyAgICAgIHsKKyAgICAgICAgLy8gaWNoIGthbm4gaW4gYmFzZSByZWluZ3Vja2VuLi4uCisgICAgICAgIG9ianMgPSBiYXNlLT5sb2NhdGVfb2JqZWN0cyhkZXRhaWwsIDEpIHx8ICh7fSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8vIFJlZmVyZW56b2JqZWt0IGRhLCBhYmVyIG5pY2h0IHJlaW5ndWNrYmFyLiBiYXNlIGFiZXIgbmljaHQgbnVsbGVuLAorICAgICAgICAvLyBkZW5uIGVzIGlzdCBqYSBub2NoIGd1ZWx0aWcgZnVlciBEZXRhaWxzdWNoZW4gYW4gYmFzZS4uLgorICAgICAgICBvYmpzID0gKHt9KTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIG9ianMgPSBlbnZpcm9ubWVudCgpLT5sb2NhdGVfb2JqZWN0cyhkZXRhaWwsIDEpCisgICAgICAgICAgICsgbG9jYXRlX29iamVjdHMoZGV0YWlsLCAxKTsKKyAgICAgIGJhc2UgPSBlbnZpcm9ubWVudCgpOworICAgIH0KKyAgICBvYmpzID0gZmlsdGVyX29iamVjdHMob2JqcywgInNob3J0Iik7IC8vIG51ciBzaWNodGJhcmUuLi4KKworICAgIGlmIChzaXplb2Yob2JqcykpCisgICAgeworICAgICAgLy8gT2JqZWt0ZSBnZWZ1bmRlbiwgbWFsIHNjaGF1ZW4sIG9iIGRpZSB0YXVnZW4gKGQuaC4gZnVlciBkZW4gamV3LiBTaW5uCisgICAgICAvLyBJbmZvcyBoYWJlbi4gV2VubiBuaWNodCwgbXVlc3NlbiB3aXIgd2VpdGVyc3VjaGVuLgorICAgICAgLy8gQWJlciBlcnN0bWFsIGRpZSBPYmpla3RlIGR1cmNobGF1ZmVuLgorICAgICAgZm9yZWFjaChvYmplY3Qgb2I6IG9ianMpCisgICAgICB7CisgICAgICAgIGlmIChzZW5zZSA9PSBTRU5TRV9SRUFEKQorICAgICAgICB7CisgICAgICAgICAgLy8gRXh0cmF3dXJzdDogUF9SRUFEX01TRyBhdWNoIG5vY2ggYWJmcmFnZW4uCisgICAgICAgICAgb3V0ID0gb2ItPlF1ZXJ5UHJvcChQX1JFQURfTVNHKTsKKyAgICAgICAgICBpZiAoIXN0cmluZ3Aob3V0KSkKKyAgICAgICAgICAgIG91dCA9IG9iLT5HZXREZXRhaWwoU0VOU0VfREVGQVVMVCxRdWVyeVByb3AoUF9SRUFMX1JBQ0UpLFNFTlNFX1JFQUQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgCisgICAgICAgICAgb3V0PW9iLT5HZXREZXRhaWwoU0VOU0VfREVGQVVMVCxRdWVyeVByb3AoUF9SRUFMX1JBQ0UpLHNlbnNlKTsKKyAgICAgICAgaWYgKHN0cmluZ3Aob3V0KSkKKyAgICAgICAgeworICAgICAgICAgIFNldFByb3AoUF9SRUZFUkVOQ0VfT0JKRUNULCBvYik7CisgICAgICAgICAgdGVsbF9vYmplY3QoTUUsIG91dCk7CisgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBLZWluZSBPYmpla3RlIGdlZnVuZGVuLCBkaWUgaW4gRnJhZ2Uga29tbWVuLiBOYWNoIERldGFpbHMgc3VjaGVuLgorICAgIGlmKG91dCA9IGJhc2UtPkdldERldGFpbChkZXRhaWwsIFF1ZXJ5UHJvcChQX1JFQUxfUkFDRSksc2Vuc2UpKQorICAgIHsKKyAgICAgIFNldFByb3AoUF9SRUZFUkVOQ0VfT0JKRUNULCBiYXNlKTsKKyAgICAgIHJldHVybiAod3JpdGUob3V0KSwgMSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvLyBBdWNoIGtlaW5lIERldGFpbHMgZ2VmdW5kZW4uLi4gV2VubiB3aXIgdW5zIG5vY2ggZGFzIEVudiBhbmd1Y2tlbgorICAgICAgLy8ga29lbm5lbiAod2VpbCBiYXNlICE9IGVudiksIGRhbm4gbWFjaGVuIHdpciBkYXMsIGFuc29uc3RlbiBpc3QKKyAgICAgIC8vIGpldHp0IGhpZXIgbGVpZGVyIEVuZGUuLi4KKyAgICAgIGlmKGJhc2UgPT0gZW52aXJvbm1lbnQoKSkKKyAgICAgIHsKKyAgICAgICAgaWYgKGJhc2Vfd2FzX2VudikKKyAgICAgICAgICBTZXRQcm9wKFBfUkVGRVJFTkNFX09CSkVDVCwgMCk7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvLyBub2NobWFsIGltIG5hZWNoc3RlbiBTY2hsZWlmZW5kdXJjaGxhdWYgb2huZSBiYXNlIHByb2JpZXJlbi4KKyAgICAgICAgYmFzZSA9IDA7CisgICAgICAgIGJhc2Vfd2FzX2VudiA9IDA7IAorICAgICAgfQorICAgIH0KKyAgfSB3aGlsZSgtLW1heHRyaWVzKTsKKworICAvLyBuYWNoIGRpZXNlciBTY2hsZWlmZSBzb2xsdGUgbWFuIG5pZSBhbmtvbW1lbi4uLgorICByYWlzZV9lcnJvcihzcHJpbnRmKCJfc2Vuc2VfZXhhKCk6IHp1dmllbGUgVmVyc3VjaGUsIGV0d2FzIHp1IGZpbmRlbi4iKSk7CisKKyAgcmV0dXJuIDA7Cit9CisKK3ZhcmFyZ3MgaW50IGxvb2tfaW50byhzdHJpbmcgc3RyLGludCBtb2RlKQoreworICBvYmplY3QgKmZvdW5kX29iczsKKworICBpZiggQ2Fubm90U2VlKCkgKSByZXR1cm4gMTsKKyAgX25vdGlmeV9mYWlsKCJXbyB3aWxsc3QgRHUgZGVubiByZWluc2NoYXVlbiA/XG4iKTsKKyAgZm91bmRfb2JzPWZpbmRfb2JzKHN0cixQVVRfR0VUX05PTkUpOworICBpZiAoIWZvdW5kX29icykKKyAgeworICAgIGlmIChlbnZpcm9ubWVudCgpICYmCisgICAgICAgIChlbnZpcm9ubWVudCgpLT5HZXREZXRhaWwoc3RyLFF1ZXJ5UHJvcChQX1JFQUxfUkFDRSkpfHwKKyAgICAgICAgIGVudmlyb25tZW50KCktPkdldERvb3JEZXNjKHN0cikpKQorICAgICAgX25vdGlmeV9mYWlsKCJEYSBrYW5uc3QgRHUgc28gbmljaHQgcmVpbnNlaGVuLlxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIF9leGFtaW5lKHN0ciwgbW9kZSk7Cit9CisKKy8qIEdlYmUgZGllIFVtZ2VidW5nIGRlcyBha3RpdmVuIFNwaWVsZXJzIHp1cnVlY2ssIGxhc3NlIGRhYmVpICAqLworLyogcmVrdXJzaXYgZ2VzY2hhY2h0ZWx0ZSBSYWV1bWUgenUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBXZW5uIGFsbG93X3Nob3J0IDAgaXN0LCBzbyB3aXJkIGltbWVyIGRpZSBsb25nLWRlc2NyIGJlbnV0enQgKi8KK3ZhcmFyZ3Mgc3RyaW5nIGVudl9kZXNjcihpbnQgYWxsb3dfc2hvcnQsaW50IGZsYWdzLCBpbnQgZm9yY2Vfc2hvcnQgKQoreworICBvYmplY3QgZW52OworICBpbnQgYnJpZWY7CisKKyAgZW52ID0gZW52aXJvbm1lbnQoTUUpOworCisgIGlmKCFlbnYpCisgICAgcmV0dXJuICJEdSBzY2h3ZWJzdCBpbSBOaWNodHMgLi4uIER1IHNpZWhzdCBuaWNodHMsIHJlaW4gZ2FyIG5pY2h0cyAuLi5cbiI7CisKKyAgaWYgKCFmb3JjZV9zaG9ydCAmJiAoIWFsbG93X3Nob3J0IHx8ICFRdWVyeVByb3AoUF9CUklFRikpKQorICAgICAgcmV0dXJuIGVudi0+aW50X2xvbmcoTUUsTUUsZmxhZ3MpOworCisgIGlmICghZmxhZ3MgJiYgKChicmllZj1RdWVyeVByb3AoUF9CUklFRikpPj0yKSkKKyAgICAgIHJldHVybiAiIjsKKworICByZXR1cm4gZW52LT5pbnRfc2hvcnQoTUUsTUUpOworfQorCitpbnQgX2xvb2soc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIHM7CisgIGludCBmbGFnOworCisgIGlmKENhbm5vdFNlZSgpKSByZXR1cm4gMTsKKworICBpZighc3RyKQorICB7CisgICAgU2V0UHJvcChQX1JFRkVSRU5DRV9PQkpFQ1QsIDApOworICAgIHdyaXRlKCBlbnZfZGVzY3IoKSApOworICAgIHJldHVybiAxOworICB9CisgIGlmKHN0cj09Ii1mIiB8fCBzdHI9PSJnZW5hdSIpCisgIHsKKyAgICBTZXRQcm9wKFBfUkVGRVJFTkNFX09CSkVDVCwgMCk7CisgICAgd3JpdGUoIGVudl9kZXNjcigwLDIpICk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYoc3RyPT0iLWsiIHx8IHN0cj09Imt1cnoiKQorICB7CisgICAgU2V0UHJvcChQX1JFRkVSRU5DRV9PQkpFQ1QsIDApOworICAgIHdyaXRlKCBlbnZfZGVzY3IoMSwyLDEpICk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYoc3RyWzAuLjJdPT0iLWYgIil7CisgICAgZmxhZz0yOworICAgIHN0cj1zdHJbMy4uXTsKKyAgfQorICBlbHNlIGlmKHN0clswLi41XT09ImdlbmF1ICIpeworICAgIGZsYWc9MjsKKyAgICBzdHI9c3RyWzYuLl07CisgIH0KKyAgZWxzZSBmbGFnID0gMDsKKyAgaWYgKHNzY2FuZihzdHIsIiVzIGFuIixzKSkgc3RyPXM7CisgIGlmIChzc2NhbmYoc3RyLCIlcyBpbiBtaXIiLHMpfHxzc2NhbmYoc3RyLCIlcyBpbiBkaXIiLHMpKSByZXR1cm4gX2V4YW1pbmUoc3RyLGZsYWcpOworICBpZiAoc3NjYW5mKHN0ciwiaW4gJXMiLHMpKSByZXR1cm4gbG9va19pbnRvKHMsZmxhZyk7CisgIHJldHVybiBfZXhhbWluZShzdHIsZmxhZyk7Cit9CisKK2ludCBfZXF1aXBtZW50KHN0cmluZyBhcmcpCit7CisgIGlmIChDYW5ub3RTZWUoKSkgcmV0dXJuIDE7CisgIGNhbGxfb3RoZXIoIi9zdGQvcGxheWVyL2ludm1hc3Rlci9pbnZtYXN0ZXIiLCAiU2hvd0ludiIsIE1FLCBhcmcpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIG1peGVkIF9xdWVyeV9sb2NhbGNtZHMoKQoreworICByZXR1cm4KKyAgICAoeyh7ImF1c3J1ZXN0dW5nIiwgIl9lcXVpcG1lbnQiLDAsMH0pLAorICAgICAgKHsiaSIsIl9pbnZlbnRvcnkiLDAsMH0pLAorICAgICAgKHsiaW52IiwiX2ludmVudG9yeSIsMCwwfSksCisgICAgICAoeyJpbnZlbnR1ciIsIl9pbnZlbnRvcnkiLDAsMH0pLAorICAgICAgKHsic2NoYXUiLCJfbG9vayIsMCwwfSksCisgICAgICAoeyJzY2hhdWUiLCJfbG9vayIsMCwwfSksCisgICAgICAoeyJ1bnQiLCJfZXhhbWluZSIsMCwwfSksCisgICAgICAoeyJ1bnRlcnN1Y2giLCJfZXhhbWluZSIsMCwwfSksCisgICAgICAoeyJiZXRyYWNodCIsIl9leGFtaW5lIiwwLDB9KSwKKyAgICAgICh7InVudGVyc3VjaGUiLCJfZXhhbWluZSIsMCwwfSksCisgICAgICAoeyJiZXRyYWNodGUiLCJfZXhhbWluZSIsMCwwfSksCisgICAgICAoeyJiZXRyIiwiX2V4YW1pbmUiLDAsMH0pLAorICAgICAgKHsibGF1c2NoZSIsIl9zZW5zZV9leGEiLDAsMH0pLAorICAgICAgKHsibGF1c2NoIiwiX3NlbnNlX2V4YSIsMCwwfSksCisgICAgICAoeyJob2VyIiwiX3NlbnNlX2V4YSIsMCwwfSksCisgICAgICAoeyJob2VyZSIsIl9zZW5zZV9leGEiLDAsMH0pLAorICAgICAgKHsibGllcyIsIl9zZW5zZV9leGEiLDAsMH0pLAorICAgICAgKHsibGVzZSIsIl9zZW5zZV9leGEiLDAsMH0pLAorICAgICAgKHsibGVzIiwiX3NlbnNlX2V4YSIsMCwwfSksCisgICAgICAoeyJzY2hudXBwZXIiLCJfc2Vuc2VfZXhhIiwwLDB9KSwKKyAgICAgICh7InNjaG51cHBlcmUiLCJfc2Vuc2VfZXhhIiwwLDB9KSwKKyAgICAgICh7InJpZWNoIiwiX3NlbnNlX2V4YSIsMCwwfSksCisgICAgICAoeyJyaWVjaGUiLCJfc2Vuc2VfZXhhIiwwLDB9KSwKKyAgICAgICh7InRhc3RlIiwiX3NlbnNlX2V4YSIsMCwwfSksCisgICAgICAoeyJiZXJ1ZWhyZSIsIl9zZW5zZV9leGEiLDAsMH0pLAorICAgICAgKHsiYmVydWVociIsIl9zZW5zZV9leGEiLDAsMH0pLAorICAgICAgKHsia3VyeiIsIl90b2dnbGVfYnJpZWYiLDAsMH0pLAorICAgICAgKHsibGFuZyIsIl90b2dnbGVfYnJpZWYiLDAsMH0pLAorICAgICAgKHsidWx0cmFrdXJ6IiwiX3RvZ2dsZV9icmllZiIsMCwwfSkgCisgICAgfSk7Cit9CmRpZmYgLS1naXQgYS9zdGQvcG9zdC5jIGIvc3RkL3Bvc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGRiYmIxCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3Bvc3QuYwpAQCAtMCwwICsxLDQyIEBACisvKiBOZXVlIHN0ZC9wb3N0CisgICAoQykgMTk5MyBieSBMb2NvCisqLworI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCitpbmhlcml0ICIvc3RkL3Jvb20iOworCisjaW5jbHVkZSAiL21haWwvcG9zdC5oIgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxyb29tcy5oPgorCit2b2lkIGNyZWF0ZSgpIHsKKyAgaW50IGk7CisgICg6OmNyZWF0ZSgpKTsKKyAgU2V0UHJvcChQX0lOVF9TSE9SVCwiUG9zdGFtdCIpOworICBTZXRQcm9wKFBfSU5UX0xPTkcsIlwKK0RpZXMgaXN0IGVpbiBUZXN0cG9zdGFtdC5cblwKK1ZvbiBoaWVyIGF1cyBrYW5uc3QgRHUgQnJpZWZlIGFuIERlaW5lIE1pdHNwaWVsZXIgc2NoaWNrZW4gdW5kIEJyaWVmZSB2b25cblwKK2lobmVuIGxlc2VuLiBXZW5uIER1IGRhcyB3aWxsc3QsIHRpcHBlICdwb3N0JyBvZGVyICdtYWlsJyxcblwKK2J6dy4gJ21haWwgPHNwaWVsZXI+Jy5cbiIpOworICBTZXRQcm9wKCBQX0xJR0hULCAxICk7CisgIEFkZENtZCgicG9zdCIsImRvX21haWwiKTsKKyAgQWRkQ21kKCJtYWlsIiwiZG9fbWFpbCIpOworICBTZXRQcm9wKFBfSU5ET09SUywxKTsKKyAgICBmb3IgKGk9MDtpPE5SQ0FCSU5TOysraSkgQWRkSXRlbShNQUlMQ0FCSU4sUkVGUkVTSF9SRU1PVkUpOworICAgIEFkZEl0ZW0oQ09VTlRFUixSRUZSRVNIX1JFTU9WRSk7Cit9CisKK2ludCBkb19tYWlsKHN0cmluZyBzdHIpIHsKKyAgb2JqZWN0IG1haWxlcjsKKyAgaWYgKHRoaXNfaW50ZXJhY3RpdmUoKSE9dGhpc19wbGF5ZXIoKSkgcmV0dXJuIDA7CisgIG1haWxlcj1jbG9uZV9vYmplY3QoTUFJTEVSKTsKKyAgbWFpbGVyLT5TZXRPZmZpY2VOYW1lKHNob3J0KCkpOworICBtYWlsZXItPmRvX21haWwoc3RyKTsKKyAgcmV0dXJuIDE7Cit9CisKKwpkaWZmIC0tZ2l0IGEvc3RkL3ByZWxvYWRfZmlsZSBiL3N0ZC9wcmVsb2FkX2ZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcxN2ZjYQotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wcmVsb2FkX2ZpbGUKQEAgLTAsMCArMSwzNiBAQAorL3NlY3VyZS9lcnJvcmQKKy9zZWN1cmUvbWF0ZXJpYWxkYgorL3AvZGFlbW9uL2V2ZW50ZAorL3AvZGFlbW9uL2NoYW5uZWxkCisvcm9vbS92b2lkCisvc3RkL3NoZWxscy9tYWdpZXIKKy9wL2RhZW1vbi9yb3V0aW5nZAorL3AvZGFlbW9uL3Nhc3RhdGQKKy9zdGQvc2hlbGxzL2VsZgorL3N0ZC9zaGVsbHMvaHVtYW4KKy9zdGQvc2hlbGxzL2R3YXJmCisvc3RkL3NoZWxscy9ob2JiaXQKKy9zdGQvc2hlbGxzL2ZlbGluZQorL3NlY3VyZS9sb2dpbgorL3NlY3VyZS9tYWlsZXIKKy9zZWN1cmUvY29tYmF0Cisvb2JqL3VocgorL29iai9tbGlzdGUKKy9zZWN1cmUvc2NvcmVtYXN0ZXIKKy9zZWN1cmUvZXhwbG9yYXRpb25tYXN0ZXIKKy9zZWN1cmUvcXVlc3RtYXN0ZXIKKy9zZWN1cmUvbGVwbWFzdGVyCisvc2VjdXJlL3BvdGlvbm1hc3RlcgorL2l0ZW1zL21vbmV5Cisvb2JqL3Rvb2xzL3h0b29sCisvb2JqL3Rvb2xzL2x1cGUKKy9zZWN1cmUvdWRwX21haWwKKy9zZWN1cmUvaW5ldGQKKy9zZWN1cmUvYXdtYXN0ZXIKKy9wL2RhZW1vbi90cmF2ZWxkCisvcC9kYWVtb24vbWFuZAorL3AvZGFlbW9uL3N2bjJuZXdzCisvcC9kYWVtb24vbW9uZXlsb2cKKy9wL2RhZW1vbi91cHRpbWVfbWFzdGVyCisvcGxheWVycy90aWFtYWsvd29ya3Jvb20KKy9zZWN1cmUvendlaXRpZXMKZGlmZiAtLWdpdCBhL3N0ZC9wdWIuYyBiL3N0ZC9wdWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2IwMTlhCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3B1Yi5jCkBAIC0wLDAgKzEsNzUgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBwdWIuYyAtLSBBbGxlcywgd2FzIGVpbmUgS25laXBlIGJyYXVjaHQuCisvLworLy8gJElkOiBwdWIuYyA2NTcxIDIwMDctMTAtMjEgMTQ6NDE6MTBaIFplc3N0cmEgJAorI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCitpbmhlcml0ICIvc3RkL3Jvb20iOworaW5oZXJpdCAiL3N0ZC9yb29tL3B1YiI7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgIHJvb206OmNyZWF0ZSgpOworICBwdWI6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfTElHSFQsMSk7CisgIFNldFByb3AoUF9JTkRPT1JTLDEpOworICBTZXRQcm9wKFBfSU5UX0xPTkcsCisgICAiRGVyIE1hZ2llciwgZGVyIGRpZXNlbiBQdWIgZXJzY2h1Ziwgd2FyIGxlaWRlciB6dSBmYXVsLCBlaW5lICIrCisgICAiQmVzY2hyZWlidW5nXG5kYWZ1ZXIgaGVyenVzdGVsbGVuLlxuIik7CisgIFNldFByb3AoUF9JTlRfU0hPUlQsImdlbmVyaWMgcHViIik7CisgIEFkZEl0ZW0oIi9vYmovdG9wbGlzdGUiLFJFRlJFU0hfUkVNT1ZFKTsKK30KKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlX3N1cGVyKCkgeworICAgICAgc2V0X25leHRfcmVzZXQoLTEpOworfQorCit2b2lkIHJlc2V0KCkKK3sKKyAgIHJvb206OnJlc2V0KCk7CisgICBwdWI6OnJlc2V0KCk7Cit9CisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL3N0ZC9yYW5nZWRfd2VhcG9uLmMgYi9zdGQvcmFuZ2VkX3dlYXBvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1Nzg0ODMKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcmFuZ2VkX3dlYXBvbi5jCkBAIC0wLDAgKzEsMjc1IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gcmFuZ2VkX3dlYXBvbi5jIC0tIFN0YW5kYXJkb2JqZWt0IGZ1ZXIgRmVybmthbXBmd2FmZmVuCisvLworLy8gJElkOiByYW5nZWRfd2VhcG9uLmMgODgyMCAyMDE0LTA1LTE0IDE5OjMxOjQ2WiBaZXNzdHJhICQKKworLy8gR2VicmF1Y2h0IHdpcmQgTXVuaXRpb24gbWl0IGVpbmVyIE1VTl8qIGlkLiBEaWVzZXMgT2JqZWt0IHNvbGx0ZSBhdXNzZXJkZW0KKy8vIFBfREFNX1RZUEUgc2V0emVuIHNvd2llIFBfU0hPT1RJTkdfV0MgdW5kIGdnZi4gUF9ISVRfRlVOQy4gSW4gZGVyIFJlZ2VsCisvLyBzb2xsdGVuIGRpZXNlIE9iamVrdGUgdW5pdHMgc2VpbiwgZGEgZ3JvZXNzZXJlIEFuemFobGVuIGRhdm9uIGdlYnJhdWNodAorLy8gd2VyZGVuLgorI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworI3ByYWdtYSByYW5nZV9jaGVjaworCitpbmhlcml0ICIvc3RkL2xpdmluZy9za2lsbF91dGlscyI7Citpbmhlcml0ICIvc3RkL3dlYXBvbiI7CisKKyNpbmNsdWRlIDxyYW5nZWRfd2VhcG9uLmg+CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPGNvbWJhdC5oPgorI2luY2x1ZGUgPG5ld19za2lsbHMuaD4KKyNpbmNsdWRlIDx1bml0Lmg+CisKK3N0YXRpYyBpbnQgbGFzdF9zaG9vdDsKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgICA6OmNyZWF0ZSgpOworCisgICAgU2V0UHJvcChQX1dFQVBPTl9UWVBFLCBXVF9SQU5HRURfV0VBUE9OKTsKKyAgICBTZXRQcm9wKFBfU1RSRVRDSF9USU1FLCAxKTsKKyAgICBTZXRQcm9wKFBfQU1NVU5JVElPTiwgTVVOX0FSUk9XKTsKKyAgICBTZXRQcm9wKFBfU0hPT1RJTkdfV0MsIDcwKTsKKyAgICBTZXRQcm9wKFBfUkFOR0UsIDUwKTsKKyAgICBTZXRQcm9wKFBfSU5GTywgIlN5bnRheDogc2NoaWVzc2UgV0FTIGF1ZiBXRU4/XG4iKTsKKyAgICAvLyBmdWVyIGRlbiBGYWxsLCBkYXMgbWFuIGRlbiBCb2dlbiBhbHMgS251ZXBwZWwgbnV0enQuLi4KKyAgICBTZXRQcm9wKFBfV0MsIDMwKTsKKyAgICBTZXRQcm9wKFBfUVVBTElUWSwgMTAwKTsKKworICAgIEFkZENtZCggKHsic2NoaWVzcyIsICJzY2hpZXNzZSJ9KSwgImNtZF9zaG9vdCIpOworfQorICAgICAgCitzdGF0aWMgaW50IHNob290X2RhbShtYXBwaW5nIHNob290KQorLy8gYXVzZ2VnbGllZGVydCwgZGFtaXQgbWFuIGRpZXNlIEZ1bmt0aW9uIGdnZi4gdWViZXJzY2hyZWliZW4ga2Fubi4KK3sgICBtaXhlZCAgIHJlczsKKyAgICBvYmplY3QgIGhpdGZ1bmM7CisgICAgY2xvc3VyZSB1c2s7CisKKyAgICAvLyBkaWVzc2VsYmUgRm9ybWVsIHdpZSBiZWkgTmFoa2FtcGZ3YWZmZW4sIG51ciBkYXMgaGllciBERVggYW5zdGF0dCBTVFIKKyAgICAvLyBiZW51dHp0IHdpcmQsIHVuZCBkaWUgV0MgZGVyIE11bml0aW9uIG5vY2ggYWRkaWVydCB3aXJkCisgICAgc2hvb3RbU0lfU0tJTExEQU1BR0VdID0gcmFuZG9tKDErKCAyKihzaG9vdFtQX1dDXStzaG9vdFtQX1NIT09USU5HX1dDXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDEwKlBMLT5RdWVyeUF0dHJpYnV0ZShBX0RFWCkgKS8zKTsKKyAgICAvLyBIaXRGdW5jIGRlciBNdW5pdGlvbiBhZGRpZXJlbgorICAgIGlmICggb2JqZWN0cChoaXRmdW5jPShzaG9vdFtQX0FNTVVOSVRJT05dLT5RdWVyeVByb3AoUF9ISVRfRlVOQykpKSApCisgICAgICBzaG9vdFtTSV9TS0lMTERBTUFHRV0gKz0gKGhpdGZ1bmMtPkhpdEZ1bmMoc2hvb3RbU0lfRU5FTVldKSk7CisKKyAgICB1c2s9c3ltYm9sX2Z1bmN0aW9uKCJVc2VTa2lsbCIsUEwpOworCisgICAgLy8gU2NodXNzLVNraWxsIGRlciBHaWxkZSBmdWVyIGRpZXNlbiBNdW5pdGlvbnN0eXAgYW53ZW5kZW4KKyAgICBpZiAoIG1hcHBpbmdwKHJlcz1mdW5jYWxsKHVzayxTSE9PVChzaG9vdFtQX1dFQVBPTl9UWVBFXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwX2NvcHkoc2hvb3QpKSkgKQorICAgICAgU2tpbGxSZXNUcmFuc2ZlcihyZXMsICZzaG9vdCk7CisKKyAgICAvLyBBbGxnZW1laW5lbiBTY2h1c3MtU2tpbGwgZGVyIEdpbGRlIGFud2VuZGVuCisgICAgaWYgKCBtYXBwaW5ncChyZXM9ZnVuY2FsbCh1c2ssU0tfU0hPT1QsZGVlcF9jb3B5KHNob290KSkpICkKKyAgICAgIFNraWxsUmVzVHJhbnNmZXIocmVzLCAmc2hvb3QpOworCisgICAgcmV0dXJuIHNob290W1NJX1NLSUxMREFNQUdFXTsKK30KKworc3RhdGljIHN0cmluZyBGaW5kUmFuZ2VkVGFyZ2V0KHN0cmluZyBzdHIsIG1hcHBpbmcgc2hvb3QpCit7ICAgc3RyaW5nIHdlbjsKKyAgICBtaXhlZCAgYXJlYTsKKyAgICBpbnQgICAgcHNyOworCisgICAgaWYgKCBzc2NhbmYoc3RyLCAiJXMgYXVmICVzIiwgc3RyLCB3ZW4pIT0yICkKKyAgICB7CisgICAgICAgIHNob290W1NJX0VORU1ZXT1QTC0+U2VsZWN0RmFyRW5lbXkoUEwtPlByZXNlbnRFbmVtaWVzKCksMSw0KTsKKyAgICAgICAgc3RyID0gc2hvb3RbUF9XRUFQT05fVFlQRV07CisgICAgfQorICAgIGVsc2UgaWYgKCBvYmplY3RwKHNob290W1NJX0VORU1ZXT1wcmVzZW50KHdlbiwgZW52aXJvbm1lbnQoUEwpKSkgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0cjsKKyAgICB9CisgICAgZWxzZSBpZiAoICggKGFyZWE9KGVudmlyb25tZW50KFBMKS0+UXVlcnlQcm9wKFBfVEFSR0VUX0FSRUEpKSkKKyAgICAgICAgICAgICAgIHx8IChhcmVhPWVudmlyb25tZW50KGVudmlyb25tZW50KFBMKSkpICkKKyAgICAgICAgICAgICAmJiAoIG9iamVjdHAoYXJlYSkKKyAgICAgICAgICAgICAgICAgfHwgKCBzdHJpbmdwKGFyZWEpCisgICAgICAgICAgICAgICAgICAgICAmJiBvYmplY3RwKGFyZWE9ZmluZF9vYmplY3QoYXJlYSkpICkgKQorICAgICAgICAgICAgICYmIChwc3I9ZW52aXJvbm1lbnQoUEwpLT5RdWVyeVByb3AoUF9TSE9PVElOR19BUkVBKSkgKQorICAgIHsKKyAgICAgICAgc2hvb3RbU0lfRU5FTVldPXByZXNlbnQod2VuLCBhcmVhKTsKKyAgICAgICAgaWYgKCBzaG9vdFtTSV9FTkVNWV0gJiYgKHBzcj5RdWVyeVByb3AoUF9SQU5HRSkpICkKKyAgICAgICAgeworICAgICAgICAgICAgd3JpdGUoYnJlYWtfc3RyaW5nKChzaG9vdFtTSV9FTkVNWV0tPk5hbWUoV0VSKSkrCisgICAgICAgICAgICAgICAgIiBpc3QgbGVpZGVyIGF1c3NlcmhhbGIgZGVyIFJlaWNod2VpdGUgIituYW1lKFdFU1NFTiwgMSkrIi4iLAorICAgICAgICAgICAgICAgNzgpKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgfSAgICAgICAgCisgICAgfQorCisgICAgaWYgKCAhc2hvb3RbU0lfRU5FTVldICkKKyAgICB7CisgICAgICAgIHdyaXRlKCJFcyBpc3Qga2VpbiBGZWluZCB2b3JoYW5kZW4gYXVmIGRlbiBEdSBzY2hpZXNzZW4ga29lbm50ZXN0LlxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiBzdHI7Cit9CisKK3N0YXRpYyBpbnQgY21kX3Nob290KHN0cmluZyBzdHIpCit7ICAgaW50ICAgIGRhbTsKKyAgICBzdHJpbmcgbm9fYXQ7CisgICAgb2JqZWN0IHF1aXZlcjsKKyAgICBtYXBwaW5nIHNob290OworCisgICAgaWYgKCBQTC0+UXVlcnlQcm9wKFBfR0hPU1QpICkKKyAgICB7CisgICAgICAgIHdyaXRlKCJEZWluZSBpbW1hdGVyaWVsbGVuIEZpbmdlciBnbGVpdGVuIGR1cmNoIGRpZSBXYWZmZSBoaW5kdXJjaC5cbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAKKyAgICBpZiAoICFRdWVyeVByb3AoUF9OT0dFVCkgKQorICAgIHsKKyAgICAgICAgLy8gS2F0YXB1bHRlIG9kZXIgYWVobmxpY2hlcyBkaWUgdm9uIE1hZ2llcm4gYXVmZ2VzdGVsbHQgd2VyZGVuCisgICAgICAgIC8vIG11ZXNzZW4gbmF0dWVybGljaCBuaWNodCBnZXp1ZWNrdCB3ZXJkZW4gOikuCisgICAgICAgIGlmICggIVF1ZXJ5UHJvcChQX1dJRUxERUQpICkKKyAgICAgICAgeworICAgICAgICAgICAgbm90aWZ5X2ZhaWwoYnJlYWtfc3RyaW5nKCJEdSBzb2xsdGVzdCAiK25hbWUoV0VOLCAxKSsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGRhenUgc2Nob24genVlY2tlbi4iLCA3OCkpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIChQTC0+SW5GaWdodCgpKSAmJiAoKFBMLT5QcmVzZW50UG9zaXRpb24oKSk8MikgKQorICAgICAgICB7CisgICAgICAgICAgICB3cml0ZShicmVha19zdHJpbmcoCisgICAgICAgICAgICAgICAgIkR1IHNvbGx0ZXN0IERpY2ggZXJzdCBldHdhcyB3ZWl0ZXIgenVydWVja3ppZWhlbiwgdW0gbWl0ICIrCisgICAgICAgICAgICAgICAgbmFtZShXRU0sIDEpKyIgc2NoaWVzc2VuIHp1IGtvZW5uZW4hIiwgNzgpKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCAoIChRdWVyeVByb3AoUF9FUVVJUF9USU1FKStRdWVyeVByb3AoUF9TVFJFVENIX1RJTUUpKjIpID4gdGltZSgpICkKKyAgICAgICAgfHwgKCAobGFzdF9zaG9vdCtRdWVyeVByb3AoUF9TVFJFVENIX1RJTUUpKSA+IGFic29sdXRlX2hiX2NvdW50KCkgKSApCisgICAgeworICAgICAgICB3cml0ZShicmVha19zdHJpbmcoIkR1IGthbm5zdCBtaXQgIituYW1lKFdFTSwgMSkrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG5vY2ggbmljaHQgd2llZGVyIHNjaGllc3Nlbi4iLCA3OCkpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAoIChQTC0+UXVlcnlQcm9wKFBfRElTQUJMRV9BVFRBQ0spKT4wICkKKyAgICB7CisgICAgICAgIHdyaXRlKGJyZWFrX3N0cmluZygiU29sYW5nZSBEdSBub2NoIGdlbGFlaG10IGJpc3QsIGthbm5zdCBEdSAiKworICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZShXRU4sIDEpKyIgbmljaHQgYmVudXR6ZW4hIiwgNzgpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgKCBQTC0+UXVlcnlQcm9wKFBfQVRUQUNLX0JVU1kpICkKKyAgICB7CisgICAgICAgIHdyaXRlKCJOaWNodCBzbyBoZWt0aXNjaCEgU28gc2NobmVsbCBiaXN0IER1IG5pY2h0LlxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIC8vIFBfQVRUQUNLX0JVU1kgbmF0dWVybGljaCBhdWNoIHNldHplbi4uLgorICAgIFBMLT5TZXRQcm9wKFBfQVRUQUNLX0JVU1ksMSk7CisKKyAgICAvLyBJbmZvLU1hcHBpbmcgZXJ6ZXVnZW4KKyAgICBzaG9vdCA9IChbIFBfV0VBUE9OICAgICAgIDogTUUsCisgICAgICAgICAgICAgICBQX1dFQVBPTl9UWVBFICA6IFF1ZXJ5UHJvcChQX0FNTVVOSVRJT04pLAorICAgICAgICAgICAgICAgUF9TVFJFVENIX1RJTUUgOiBRdWVyeVByb3AoUF9TVFJFVENIX1RJTUUpLAorICAgICAgICAgICAgICAgUF9XQyAgICAgICAgICAgOiBRdWVyeVByb3AoUF9TSE9PVElOR19XQyksCisgICAgICAgICAgICAgICBTSV9TUEVMTCAgICAgICA6IDAKKyAgICAgICAgICAgIF0pOworCisgICAgaWYgKCAhc3RyaW5ncChzdHIpIHx8IHN0cj09IiIgKQorICAgICAgc3RyPXNob290W1BfV0VBUE9OX1RZUEVdOworICAgIGVsc2UgaWYgKHN0clswLi4zXT09Im1pdCAiKQorICAgICAgc3RyPXN0cls0Li5dOworICAgIGVsc2UgaWYgKHN0clswLi4zXT09ImF1ZiAiKQorICAgICAgc3RyPXNob290W1BfV0VBUE9OX1RZUEVdKyIgIitzdHI7CisKKyAgICBpZiAoICEoc3RyPUZpbmRSYW5nZWRUYXJnZXQoc3RyLHNob290KSkgKQorICAgICAgcmV0dXJuIDE7CisKKyAgICBpZiAoIHNob290W1NJX0VORU1ZXS0+UXVlcnlQcm9wKFBfR0hPU1QpICkKKyAgICB7CisgICAgICAgIHdyaXRlKGJyZWFrX3N0cmluZygiQWJlciAiKyhzaG9vdFtTSV9FTkVNWV0tPm5hbWUoV0VSLCAxKSkrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGlzdCBkb2NoIGVpbiBHZWlzdCEiLCA3OCkpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZSBpZiAoIG5vX2F0PShzaG9vdFtTSV9FTkVNWV0tPlF1ZXJ5UHJvcChQX05PX0FUVEFDSykpICkKKyAgICB7CisgICAgICAgIGlmICggc3RyaW5ncChub19hdCkgKQorICAgICAgICAgIHdyaXRlKG5vX2F0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHdyaXRlKGJyZWFrX3N0cmluZygiRHUga2FubnN0ICIrKHNob290W1NJX0VORU1ZXS0+bmFtZShXRU4sIDEpKSsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBuaWNodCBhbmdyZWlmZW4uIiwgNzgpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UgaWYgKCBzaG9vdFtTSV9FTkVNWV09PVBMICkKKyAgICB7CisgICAgICAgIHdyaXRlKCJEdSBrYW5uc3QgZG9jaCBuaWNodCBhdWYgRGljaCBzZWxic3Qgc2NoaWVzc2VuIVxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGlmICggIShzaG9vdFtQX0FNTVVOSVRJT05dPXByZXNlbnQoc3RyLCBQTCkpCisgICAgICAgICYmICggIW9iamVjdHAocXVpdmVyPVBMLT5RdWVyeUFybW91ckJ5VHlwZShBVF9RVUlWRVIpKQorICAgICAgICAgICAgfHwgIShzaG9vdFtQX0FNTVVOSVRJT05dPXByZXNlbnQoc3RyLCBxdWl2ZXIpKSApICkKKyAgICB7CisgICAgICAgIGlmICggc3RyPT1zaG9vdFtQX1dFQVBPTl9UWVBFXSApCisgICAgICAgICAgICB3cml0ZShicmVha19zdHJpbmcoIkR1IGhhc3Qga2VpbmUgcGFzc2VuZGUgTXVuaXRpb24gYmVpIERpciwgdW0gIisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWl0ICIrbmFtZShXRU0sIDEpKyIgc2NoaWVzc2VuIHp1IGtvZW5uZW4uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3OCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgd3JpdGUoYnJlYWtfc3RyaW5nKCJEdSBoYXN0IGtlaW4gJyIrc3RyKyInIGJlaSBEaXIuIiwgNzgpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgKCAhc2hvb3RbUF9BTU1VTklUSU9OXS0+aWQoc2hvb3RbUF9XRUFQT05fVFlQRV0pICkKKyAgICB7CisgICAgICAgIHdyaXRlKGJyZWFrX3N0cmluZygoc2hvb3RbUF9BTU1VTklUSU9OXS0+TmFtZShXRVIpKSsiIGthbm5zdCBEdSBtaXQgIisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUoV0VNLCAxKSsiIG5pY2h0IHZlcnNjaGllc3Nlbi4iLCA3OCkpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBzaG9vdFtQX0FNTVVOSVRJT05dLT5TZXRQcm9wKFVfUkVRLCAxKTsKKworICAgIHNob290W1NJX1NLSUxMREFNQUdFX01TR10gID0gc2hvb3RbU0lfU0tJTExEQU1BR0VfTVNHMl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHNob290W1BfQU1NVU5JVElPTl0tPm5hbWUoV0VOKTsKKyAgICBzaG9vdFtTSV9TS0lMTERBTUFHRV9UWVBFXSA9ICggc2hvb3RbUF9BTU1VTklUSU9OXS0+UXVlcnlQcm9wKFBfREFNX1RZUEUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHtEVF9QSUVSQ0V9KSApOworCisgICAgc2hvb3RbUF9TSE9PVElOR19XQ10gID0gc2hvb3RbUF9BTU1VTklUSU9OXS0+UXVlcnlQcm9wKFBfU0hPT1RJTkdfV0MpOworCisgICAgZGFtPXNob290X2RhbShzaG9vdCk7CisKKyAgICAvLyBUZXh0YXVzZ2FiZQorICAgIGlmIChzaG9vdFtTSV9FTkVNWV0pCisgICAgeworICAgICAgdGVsbF9vYmplY3QoUEwsYnJlYWtfc3RyaW5nKAorICAgICAgICAgICJEdSBzY2hpZXNzdCAiK3Nob290W1NJX1NLSUxMREFNQUdFX01TR10rIiBhdWYgIisKKyAgICAgICAgICBzaG9vdFtTSV9FTkVNWV0tPm5hbWUoV0VOLCAxKSsiLiIsIDc4KSApOworICAgICAgdGVsbF9yb29tKGVudmlyb25tZW50KFBMKSwgYnJlYWtfc3RyaW5nKAorICAgICAgICAgIFBMLT5OYW1lKFdFUikrIiBzY2hpZXNzdCAiK3Nob290W1NJX1NLSUxMREFNQUdFX01TRzJdKyIgYXVmICIrCisgICAgICAgICAgc2hvb3RbU0lfRU5FTVldLT5uYW1lKFdFTiwgMSkrIi4iLCA3OCksCisgICAgICAgICAgKHsgc2hvb3RbU0lfRU5FTVldLCBQTCB9KSApOworICAgICAgaWYgKCBlbnZpcm9ubWVudChQTCkhPWVudmlyb25tZW50KHNob290W1NJX0VORU1ZXSkgKQorICAgICAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoc2hvb3RbU0lfRU5FTVldKSxicmVha19zdHJpbmcoCisgICAgICAgICAgICBQTC0+TmFtZShXRVIpKyIgc2NoaWVzc3QgIitzaG9vdFtTSV9TS0lMTERBTUFHRV9NU0cyXSsiIGF1ZiAiKworICAgICAgICAgICAgc2hvb3RbU0lfRU5FTVldLT5uYW1lKFdFTiwgMSkrIi4iLCA3OCksCisgICAgICAgICAgICAoeyBzaG9vdFtTSV9FTkVNWV0gfSkgKTsKKyAgICAgIHRlbGxfb2JqZWN0KHNob290W1NJX0VORU1ZXSwgYnJlYWtfc3RyaW5nKAorICAgICAgICAgIFBMLT5OYW1lKFdFUikrIiBzY2hpZXNzdCAiK3Nob290W1NJX1NLSUxMREFNQUdFX01TRzJdKworICAgICAgICAgICIgYXVmIERpY2ggYWIuIiw3OCkgKTsKKworICAgICAgc2hvb3RbU0lfRU5FTVldLT5EZWZlbmQoZGFtLHNob290W1NJX1NLSUxMREFNQUdFX1RZUEVdLHNob290W1NJX1NQRUxMXSxQTCk7CisgICAgfQorICAgIC8vIE11bml0aW9uIHZlcmJyYXVjaGVuCisgICAgaWYgKCBzaG9vdFtQX0FNTVVOSVRJT05dLT5Jc1VuaXQoKSApCisgICAgICBzaG9vdFtQX0FNTVVOSVRJT05dLT5BZGRBbW91bnQoLTEpOworICAgIGVsc2UKKyAgICAgIHNob290W1BfQU1NVU5JVElPTl0tPnJlbW92ZSgpOworCisgICAgLy8gZXMgd2lyZCBhbiBkaWVzZXIgc3RlbGxlIGFic29sdXRlX2hiX2NvdW50IGFuc3RlbGxlIHZvbiB0aW1lKCkgYmVudXR6dAorICAgIC8vIHVtIGRlbSBTcGllbGVyIHdpcmtsaWNoIGRpZSB2b2xsZW4gMiBzZWsgWmVpdCB6dSBnZWJlbiB1bSB6dSByZWFnaWVyZW4KKyAgICAvLyBvaG5lIGRhcyBlciBkYWR1cmNoIGVpbmVuIFNjaGFkZW4gaGF0ICh3aWUgZXIgZXMgei5iLiBiZWkgdGltZSgpIGhhZXR0ZSkKKyAgICBsYXN0X3Nob290PWFic29sdXRlX2hiX2NvdW50KCk7CisKKyAgICByZXR1cm4gMTsKK30KKwpkaWZmIC0tZ2l0IGEvc3RkL3Jlc3RyaWN0aW9uX2NoZWNrZXIuYyBiL3N0ZC9yZXN0cmljdGlvbl9jaGVja2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJkNDI0OAotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9yZXN0cmljdGlvbl9jaGVja2VyLmMKQEAgLTAsMCArMSwzMjMgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyByZXN0cmljdGlvbl9jaGVja2VyLmMgLS0gQmVzY2hyYWVua3VuZ2VuIGluIEdpbGRlbiwgU3BlbGxzIHVuZCBTa2lsbHMKKy8vCisvLyAkSWQ6IHJlc3RyaWN0aW9uX2NoZWNrZXIuYyA4NzU0IDIwMTQtMDQtMjYgMTM6MTI6NThaIFplc3N0cmEgJAorI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworLy8jcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX3NoYWRvdworCitpbmhlcml0ICIvc3RkL3V0aWwvZXhlY3V0ZXIiOworCisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPHRoaW5nL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bmV3X3NraWxscy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPHF1ZXN0bWFzdGVyLmg+CisKKyNkZWZpbmUgREVCVUcoeCkgaWYgKGZpbmRfcGxheWVyKCJ6ZXNzdHJhIikpIHRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJ6ZXNzdHJhIikseCkKKworLy8gZXJ3ZWl0ZXJ0IHVtIGRhcyA8cGw+IGFyZ3VtZW50IHVuZCBkaWUgZXh0cmEtQXJndW1lbnQsIGRpZSBiZXJlaXRzIGluIDxmdW4+CisvLyBhbmdlZ2ViZW4gd3VyZGVuLiAoKmdydW1tZWwqKQorcHJvdGVjdGVkIG1peGVkIGV4ZWN1dGVfYW55dGhpbmcobWl4ZWQgZnVuLCBvYmplY3QgcGwsIHZhcmFyZ3MgbWl4ZWQgYXJncykKK3sKKyAgLy9ERUJVRyhzcHJpbnRmKCJleF9hbnkoKTogRnVuOiAlTywgT2I6ICVPLCBhcmdzOiAlT1xuIixmdW4scGwsYXJncykpOworICAvLyB3ZW5uIGluIGZ1biBzY2hvbiBleHRyYWFyZ3VtZW50ZSBzdGVoZW4sIGRhbm4gcGwgZWluZnVlZ2VuIHVuZCBhcmdzCisgIC8vIGRyYW5oYWVuZ2VuLgorICBpZiAocG9pbnRlcnAoZnVuKSAmJiBzaXplb2YoZnVuKSA+IDIpCisgIHsKKyAgICAvLyBhcmdzIGthbm4gKHt9KSBzZWluLCB3ZW5uIGtlaW5lIEV4dHJhYXJndW1lbnRlIHVlYmVyZ2ViZW4gd3VyZGVuLCBtYWNodAorICAgIC8vIGFiZXIgbml4LgorICAgIGFyZ3MgPSAoe3BsfSkgKyBmdW5bMi4uXSArIGFyZ3M7CisgICAgZnVuID0gZnVuWzAuLjFdOworICAgIHJldHVybiA6OmV4ZWN1dGVfYW55dGhpbmcoZnVuLCBhcmdzLi4uKTsKKyAgfQorICAvLyBzLm8uCisgIHJldHVybiA6OmV4ZWN1dGVfYW55dGhpbmcoZnVuLCBwbCwgYXJncy4uLik7Cit9CisKK21hcHBpbmcgcmFjZV9tb2RpZmllcihvYmplY3QgcGwsIG1hcHBpbmcgbWFwX2xkZmllZCkgeworICBtYXBwaW5nIHJtYXAsaGVscDsKKworICBpZiAobWFwcGluZ3AobWFwX2xkZmllZCkgJiYgbWVtYmVyKG1hcF9sZGZpZWQsU01fUkFDRSkgJiYgb2JqZWN0cChwbCkgJiYKKyAgICAgIG1hcHBpbmdwKHJtYXA9bWFwX2xkZmllZFtTTV9SQUNFXSkpCisvLyAgICBpZiAobWFwcGluZ3AoaGVscD1ybWFwW3BsLT5fcXVlcnlfcmVhbF9yYWNlKCldKSkKKyAgICBpZiAobWFwcGluZ3AoaGVscD1ybWFwW3BsLT5RdWVyeVByb3AoUF9SRUFMX1JBQ0UpXSkpCisgICAgICAgIHJldHVybiBtYXBfbGRmaWVkK2hlbHA7CisgICAgZWxzZSBpZihtZW1iZXIocm1hcCwiKiIpICYmIG1hcHBpbmdwKGhlbHA9cm1hcFsiKiJdKSkKKyAgICAgICAgcmV0dXJuIG1hcF9sZGZpZWQraGVscDsKKyAgcmV0dXJuIG1hcF9sZGZpZWQ7Cit9CisKK3N0cmluZworY2hlY2tfcmVzdHJpY3Rpb25zKG9iamVjdCBwbCwgbWFwcGluZyByZXN0cikgeworICAvKiBGb2xnZW5kZSBFaW5zY2hyYWVua3VuZ2VuIGtvZW5uZW4gZ2VwcnVlZnQgd2VyZGVuOgorICAgKiAtIE1pbmRlc3R3ZXJ0ZSBiZWkgYWxsZW4gQXR0cmlidXRlbiB1bmQgUHJvcGVydGllcyBMZXZlbCwgUVAsIFhQCisgICAqIC0gYmVzdGltbXRlIFJhc3NlbiBrb2VubmVuIGF1c2dlc2NobG9zc2VuIHdlcmRlbiBiencuIGVybGF1YnQgd2VyZGVuCisgICAqICAgKFNSX0VYQ0xVREVfUkFDRSBpc3QgZWluIEFycmF5IHZvbiBhdXNnZXNjaGxvc3NlbmVuIFJhc3NlbiwKKyAgICogICAgU1JfSU5DTFVERV9SQUNFIGVpbmVzIG1pdCBlaW5nZXNjaGxvc3NlbmVuKQorICAgKiAtIFNSX1JBQ0Uga2FubiBlaW4gTWFwcGluZyBzZWluLCBkYXNzIFJhc3NlbiBlaW4gZWlnZW5lcworICAgKiAgIFJlc3RyaWN0aW9uLW1hcHBpbmcgenVvcmRuZXQuICIqIiBzdGVodCBmdWVyIGFsbGUgYW5kZXJlbiBSYXNzZW4uCisgICAqLworICBjbG9zdXJlIGNsLGNsMjsKKyAgc3RyaW5nIHJhY2UsIGd1aWxkOworCisgIGlmICghbWFwcGluZ3AocmVzdHIpIHx8ICFzaXplb2YocmVzdHIpKSByZXR1cm4gMDsgLy8gS2VpbmUgRWluc2NocmFlbmt1bmdlbgorICBpZiAoIW9iamVjdHAocGwpKSByZXR1cm4gIiI7CisgIGlmIChwbC0+UXVlcnlEaXNndWlzZSgpKQorICAgIHJldHVybiAiWmllaCBlcnN0IG1hbCBkZW4gVGFybmhlbG0gYXVzLlxuIjsKKworICByZXN0cj1yYWNlX21vZGlmaWVyKCZwbCwmcmVzdHIpOworCisgIGNsPXN5bWJvbF9mdW5jdGlvbigiUXVlcnlQcm9wIixwbCk7CisgIGNsMj1zeW1ib2xfZnVuY3Rpb24oIlF1ZXJ5QXR0cmlidXRlIixwbCk7CisKKyAgZm9yZWFjaChzdHJpbmcgdG9fY2hlY2ssIG1peGVkIGNvbmRpdGlvbjogcmVzdHIpCisgIHsKKyAgICBzd2l0Y2godG9fY2hlY2spCisgICAgeworICAgICAgY2FzZSBQX0xFVkVMOgorICAgICAgICBpZiAoZnVuY2FsbChjbCxQX0xFVkVMKSA8IGNvbmRpdGlvbikKKyAgICAgICAgICByZXR1cm4gIkRlaW5lIFN0dWZlIHJlaWNodCBkYWZ1ZXIgbmljaHQgYXVzLlxuIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBfR1VJTERfTEVWRUw6CisgICAgICAgIGlmIChmdW5jYWxsKGNsLFBfR1VJTERfTEVWRUwpIDwgY29uZGl0aW9uKQorICAgICAgICAgIHJldHVybiAiRGVpbmUgR2lsZGVuc3R1ZmUgcmVpY2h0IGRhZnVlciBuaWNodCBhdXMuXG4iOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU1JfU0VFUjogLy8gZGFzIG1hY2h0IG51biB3YWhybGljaCBudXIgYmVpIGludGVyYWN0aXZlcyBzaW5uISEhCisgICAgICAgIGlmIChjb25kaXRpb24gJiYgcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShwbCkgJiYgIUlTX1NFRVIocGwpKQorICAgICAgICAgIHJldHVybiAiRHUgbXVzc3QgZGF6dSBlcnN0IFNlaGVyIHdlcmRlbi5cbiI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQX1hQOgorICAgICAgICBpZiAoZnVuY2FsbChjbCxQX1hQKSA8IGNvbmRpdGlvbikKKyAgICAgICAgICByZXR1cm4gIkR1IGhhc3QgbmljaHQgZ2VudWVnZW5kIEVyZmFocnVuZyBkYWZ1ZXIuXG4iOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUF9RUDoKKyAgICAgICAgaWYgKGZ1bmNhbGwoY2wsUF9RUCkgPCBjb25kaXRpb24pCisgICAgICAgICAgcmV0dXJuICJEdSBoYXN0IG5pY2h0IGdlbnVlZ2VuZCBBdWZnYWJlbiBnZWxvZXN0LlxuIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBfQUxDT0hPTDoKKyAgICAgICAgaWYgKGZ1bmNhbGwoY2wsUF9BTENPSE9MKSA+PSBjb25kaXRpb24pCisgICAgICAgICAgcmV0dXJuICJEdSBiaXN0IHp1IGJlc29mZmVuLlxuIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBfRFJJTks6CisgICAgICAgIGlmIChmdW5jYWxsKGNsLFBfRFJJTkspID49IGNvbmRpdGlvbikKKyAgICAgICAgICByZXR1cm4gIkR1IGhhc3QgenV2aWVsIGdldHJ1bmtlbi5cbiI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQX0ZPT0Q6CisgICAgICAgIGlmIChmdW5jYWxsKGNsLFBfRk9PRCkgPj0gY29uZGl0aW9uKQorICAgICAgICAgIHJldHVybiAiRHUgaGFzdCB6dXZpZWwgZ2VnZXNzZW4uXG4iOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUF9ERUFGOgorICAgICAgICBpZiAoZnVuY2FsbChjbCxQX0RFQUYpKQorICAgICAgICAgIHJldHVybiAiRHUga2FubnN0IG5pY2h0cyBob2VyZW4uXG4iOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUF9CTElORDoKKyAgICAgICAgaWYgKGZ1bmNhbGwoY2wsUF9CTElORCkpCisgICAgICAgICAgcmV0dXJuICJEdSBrYW5uc3QgbmljaHRzIHNlaGVuLlxuIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBfRlJPRzoKKyAgICAgICAgaWYgKGZ1bmNhbGwoY2wsUF9GUk9HKSkKKyAgICAgICAgICByZXR1cm4gIkFscyBGcm9zY2gga2FubnN0IER1IGRhcyBsZWlkZXIgbmljaHQuXG4iOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQV9JTlQ6CisgICAgICAgIGlmIChmdW5jYWxsKGNsMixBX0lOVCkgPCBjb25kaXRpb24pCisgICAgICAgICAgcmV0dXJuICJEZWluZSBJbnRlbGxpZ2VueiByZWljaHQgZGFmdWVyIG5pY2h0IGF1cy5cbiI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBBX0RFWDoKKyAgICAgICAgaWYgKGZ1bmNhbGwoY2wyLEFfREVYKSA8IGNvbmRpdGlvbikKKyAgICAgICAgICByZXR1cm4gIkRlaW5lIEdlc2NoaWNrbGljaGtlaXQgcmVpY2h0IGRhZnVlciBuaWNodCBhdXMuXG4iOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQV9DT046CisgICAgICAgIGlmIChmdW5jYWxsKGNsMixBX0NPTikgPCBjb25kaXRpb24pCisgICAgICAgICAgcmV0dXJuICJEZWluZSBBdXNkYXVlciByZWljaHQgZGFmdWVyIG5pY2h0IGF1cy5cbiI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBBX1NUUjoKKyAgICAgICAgaWYgKGZ1bmNhbGwoY2wyLEFfU1RSKSA8IGNvbmRpdGlvbikKKyAgICAgICAgICByZXR1cm4gIkRlaW5lIFN0YWVya2UgcmVpY2h0IGRhZnVlciBuaWNodCBhdXMuXG4iOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU1JfQkFEOgorICAgICAgICBpZiAoZnVuY2FsbChjbCxQX0FMSUdOKSA8IGNvbmRpdGlvbikKKyAgICAgICAgICByZXR1cm4gIkR1IGJpc3QgenUgYm9lc2UuXG4iOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU1JfR09PRDoKKyAgICAgICAgaWYgKGZ1bmNhbGwoY2wsUF9BTElHTikgPiBjb25kaXRpb24pCisgICAgICAgICAgcmV0dXJuICJEdSBiaXN0IG5pY2h0IGJvZXNlIGdlbnVnLlxuIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNSX01JTl9TSVpFOgorICAgICAgICBpZiAoZnVuY2FsbChjbCxQX1NJWkUpIDwgY29uZGl0aW9uKQorICAgICAgICAgIHJldHVybiAiRHUgYmlzdCBkYWZ1ZXIgenUga2xlaW4uXG4iOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU1JfTUFYX1NJWkU6CisgICAgICAgIGlmIChmdW5jYWxsKGNsLFBfU0laRSkgPiBjb25kaXRpb24pCisgICAgICAgICAgcmV0dXJuICJEdSBiaXN0IGRhZnVlciB6dSBncm9zcy5cbiI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTUl9GUkVFX0hBTkRTOgorICAgICAgICBpZiAoY29uZGl0aW9uID4gKGZ1bmNhbGwoY2wsUF9NQVhfSEFORFMpLWZ1bmNhbGwoY2wsUF9VU0VEX0hBTkRTKSkpCisgICAgICAgICAgcmV0dXJuICJEdSBoYXN0IG5pY2h0IGdlbnVnIGZyZWllIEhhZW5kZSBkYWZ1ZXIuXG4iOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU1JfRVhDTFVERV9SQUNFOgorICAgICAgICBpZiAoSVNfTEVBUk5FUihwbCkpCisgICAgICAgICAgcmFjZT1mdW5jYWxsKGNsLFBfUkFDRSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByYWNlPWZ1bmNhbGwoY2wsUF9SRUFMX1JBQ0UpOyAvL3JhY2U9cGwtPl9xdWVyeV9yZWFsX3JhY2UoKTsKKyAgICAgICAgaWYgKCBwb2ludGVycChjb25kaXRpb24pICYmIG1lbWJlcihjb25kaXRpb24scmFjZSk+PTAgKQorICAgICAgICAgIHJldHVybiAoIkFscyAiK3JhY2UrIiBrYW5uc3QgRHUgZGFzIG5pY2h0LlxuIik7CisgICAgICAgIGJyZWFrOworICAgICBjYXNlIFNSX0lOQ0xVREVfUkFDRToKKyAgICAgICAgaWYgKElTX0xFQVJORVIocGwpKQorICAgICAgICAgIHJhY2U9ZnVuY2FsbChjbCxQX1JBQ0UpOworICAgICAgICBlbHNlCisgICAgICAgICAgcmFjZT1mdW5jYWxsKGNsLFBfUkVBTF9SQUNFKTsgLy9yYWNlPXBsLT5fcXVlcnlfcmVhbF9yYWNlKCk7CisgICAgICAgIGlmIChwb2ludGVycChjb25kaXRpb24pICYmIG1lbWJlcihjb25kaXRpb24scmFjZSk8MCkKKyAgICAgICAgICByZXR1cm4gKCJBbHMgIityYWNlKyIga2FubnN0IER1IGRhcyBuaWNodC5cbiIpOworICAgICAgICBicmVhazsKKyAgICAgY2FzZSBTUl9FWENMVURFX0dVSUxEOgorICAgICAgICBndWlsZD1mdW5jYWxsKGNsLFBfR1VJTEQpOworICAgICAgICBpZiAocG9pbnRlcnAoY29uZGl0aW9uKSAmJiBtZW1iZXIoY29uZGl0aW9uLGd1aWxkKT49MCkKKyAgICAgICAgICByZXR1cm4gKCJNaXQgRGVpbmVyIEdpbGRlbnp1Z2Vob2VyaWdrZWl0IGthbm5zdCBEdSBkYXMgbmljaHQuXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNSX0lOQ0xVREVfR1VJTEQ6CisgICAgICAgIGd1aWxkPWZ1bmNhbGwoY2wsUF9HVUlMRCk7CisgICAgICAgIGlmIChwb2ludGVycChjb25kaXRpb24pICYmIG1lbWJlcihjb25kaXRpb24sZ3VpbGQpPDApCisgICAgICAgICAgcmV0dXJuICgiTWl0IERlaW5lciBHaWxkZW56dWdlaG9lcmlna2VpdCBrYW5uc3QgRHUgZGFzIG5pY2h0LlxuIik7CisgICAgICAgIGJyZWFrOworICAgICBjYXNlIFNSX0ZVTjoKKyAgICAgICAgc3RyaW5nIHJlcz1leGVjdXRlX2FueXRoaW5nKGNvbmRpdGlvbiwgcGwpOworICAgICAgICBpZiAoc3RyaW5ncChyZXMpKQorICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIGJyZWFrOworICAgICBjYXNlIFNSX1BST1A6CisgICAgICAgIGZvcmVhY2ggKCBzdHJpbmcgcHJvcG5hbWUsIG1peGVkIHZhbHVlLCBzdHJpbmcgbXNnOiBjb25kaXRpb24gKSB7CisgICAgICAgICAgaWYgKCBmdW5jYWxsKGNsLCBwcm9wbmFtZSkgIT0gdmFsdWUgKQorICAgICAgICAgICAgcmV0dXJuICggc3RyaW5ncChtc2cpICYmIHNpemVvZihtc2cpID8gbXNnIDoKKyAgICAgICAgICAgICAgIktvZW5udGUgZXMgc2VpbiwgZGFzcyBEdSB2ZXJnZXNzZW4gaGFzdCwgZXR3YXMgenUgIgorICAgICAgICAgICAgICAiZXJsZWRpZ2VuP1xuIik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgIGNhc2UgU1JfUVVFU1Q6CisgICAgICAgIGlmIChwb2ludGVycChjb25kaXRpb24pKQorICAgICAgICB7CisgICAgICAgICAgLy8gZ2Vsb2VzdGUgUXVlc3RzIGF1cyBkZXIgTGlzdGUgZGVyIEJlZGluZ3VuZ2VuIGVudGZlcm5lbgorICAgICAgICAgIGNvbmRpdGlvbiAtPSBmaWx0ZXIoY29uZGl0aW9uLCAiUXVlcnlRdWVzdCIsIHBsKTsKKyAgICAgICAgICBpZiAoIHNpemVvZihjb25kaXRpb24pICkKKyAgICAgICAgICAgIHJldHVybiAoIkR1IG11c3N0IHp1ZXJzdCBkYXMgQWJlbnRldWVyICciK2NvbmRpdGlvblswXSsKKyAgICAgICAgICAgICAgIicgbG9lc2VuLlxuIik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgIGNhc2UgU1JfTUlOSVFVRVNUOgorICAgICAgICBpZiAocG9pbnRlcnAoY29uZGl0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgIGNsb3N1cmUgdW5zb2x2ZWRfTVFzID0gZnVuY3Rpb24gaW50IChtaXhlZCBtcV9udW0pCisgICAgICAgICAgICB7IHJldHVybiAhKFFNKS0+SGFzTWluaVF1ZXN0KHBsLCBtcV9udW0pOyB9OworICAgICAgICAgIGlmICggc2l6ZW9mKGZpbHRlcihjb25kaXRpb24sIHVuc29sdmVkX01RcykpICkKKyAgICAgICAgICAgIHJldHVybiAiRHUgaGFzdCBlaW5lIGJlbm9ldGlndGUgTWluaXF1ZXN0IG5vY2ggbmljaHQgZ2Vsb2VzdC5cbiI7CisgICAgICAgICAgICAvLyBEZXIgTmFtZSBkZXIgTVEgd2lyZCBhYnNpY2h0bGljaCBuaWNodCBleHBsaXppdCBhdXNnZWdlYmVuLgorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0gLy8gc3dpdGNoCisgIH0gLy8gZm9yZWFjaAorICByZXR1cm4gMDsKK30KKwordmFyYXJncyBtaXhlZAorR2V0RGF0YShzdHJpbmcgZG5hbWUsIG1hcHBpbmcgbWFwX2xkZmllZCwgb2JqZWN0IHBsKSB7CisgIG1peGVkIGRhdCxyZXM7CisKKyAgaWYgKCFkbmFtZSB8fCAhbWFwcGluZ3AobWFwX2xkZmllZCkpIHJldHVybiAwOworICBpZiAoY2xvc3VyZXAoZGF0PW1hcF9sZGZpZWRbZG5hbWVdKSAmJiAocmVzPWZ1bmNhbGwoZGF0LHBsLG1hcF9sZGZpZWQpKSkKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgcmV0dXJuIGRhdDsKKworfQorCit2YXJhcmdzIGludAorR2V0VmFsdWUoc3RyaW5nIHZuYW1lLCBtYXBwaW5nIG1hcF9sZGZpZWQsIG9iamVjdCBwbCkgeworICBtaXhlZCBkYXQscmVzOworCisgIC8vIHByaW50ZigiR2V0VmFsdWUoJU8pOiAlT1xuIix2bmFtZSxtYXBfbGRmaWVkKTsKKyAgaWYgKCF2bmFtZSB8fCAhbWFwX2xkZmllZCkgcmV0dXJuIDA7CisgIGlmICgoZGF0PW1hcF9sZGZpZWRbdm5hbWVdKSAmJiAocmVzPWV4ZWN1dGVfYW55dGhpbmcoZGF0LHBsLG1hcF9sZGZpZWQpKSkKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgLy8gcHJpbnRmKCJWYWx1ZTogJU9cbiIsZGF0KTsKKyAgcmV0dXJuIGludHAoZGF0KSA/IGRhdCA6IDA7Cit9CisKK3ZhcmFyZ3MgaW50CitHZXRGYWN0b3Ioc3RyaW5nIGZuYW1lLCBtYXBwaW5nIG1hcF9sZGZpZWQsIG9iamVjdCBwbCkgeworICBtaXhlZCByZXM7CisKKyAgLy8gcHJpbnRmKCJHZXRGYWN0b3IoJU8pOlxuIixmbmFtZSk7CisgIGlmICghZm5hbWUgIHx8ICEocmVzPUdldFZhbHVlKEZBQ1RPUihmbmFtZSksbWFwX2xkZmllZCxwbCkpKQorICAgICAgICByZXR1cm4gMTAwOworICBpZiAocmVzPDEwKSByZXM9MTA7CisgIGVsc2UgaWYgKHJlcz4xMDAwKSByZXM9MTAwMDsKKyAgLy8gcHJpbnRmKCJGYWN0b3I6ICVPXG4iLHJlcyk7CisgIHJldHVybiByZXM7Cit9CisKK3ZhcmFyZ3MgaW50CitHZXRPZmZzZXQoc3RyaW5nIG9uYW1lLCBtYXBwaW5nIG1hcF9sZGZpZWQsIG9iamVjdCBwbCkgeworICBtaXhlZCByZXM7CisKKyAgLy8gcHJpbnRmKCJHZXRPZmZzZXQoJU8pOlxuIixvbmFtZSk7CisgIGlmICghb25hbWUgIHx8ICEocmVzPUdldFZhbHVlKE9GRlNFVChvbmFtZSksbWFwX2xkZmllZCxwbCkpKQorICAgICAgICByZXR1cm4gMDsKKyAgaWYgKHJlczwtMTAwMDApIHJlcz0tMTAwMDA7CisgIGVsc2UgaWYgKHJlcz4xMDAwMCkgcmVzPTEwMDAwOworICAvLyBwcmludGYoIk9mZnNldDogJU9cbiIscmVzKTsKKyAgcmV0dXJuIHJlczsKK30KKwordmFyYXJncyBpbnQKK0dldEZWYWx1ZShzdHJpbmcgdm5hbWUsIG1hcHBpbmcgbWFwX2xkZmllZCwgb2JqZWN0IHBsKSB7CisgIHJldHVybiAoR2V0VmFsdWUodm5hbWUsbWFwX2xkZmllZCxwbCkqR2V0RmFjdG9yKHZuYW1lLG1hcF9sZGZpZWQscGwpKS8xMDA7Cit9CisKK3ZhcmFyZ3MgaW50CitHZXRWYWx1ZU8oc3RyaW5nIHZuYW1lLCBtYXBwaW5nIG1hcF9sZGZpZWQsIG9iamVjdCBwbCkgeworICByZXR1cm4gR2V0VmFsdWUodm5hbWUsbWFwX2xkZmllZCxwbCkrR2V0T2Zmc2V0KHZuYW1lLG1hcF9sZGZpZWQscGwpOworfQorCit2YXJhcmdzIGludAorR2V0RlZhbHVlTyhzdHJpbmcgdm5hbWUsIG1hcHBpbmcgbWFwX2xkZmllZCwgb2JqZWN0IHBsKSB7CisgIHJldHVybiAoKEdldFZhbHVlKHZuYW1lLG1hcF9sZGZpZWQscGwpKkdldEZhY3Rvcih2bmFtZSxtYXBfbGRmaWVkLHBsKSkvMTAwCisgICAgICAgICAgICAgICAgICArIEdldE9mZnNldCh2bmFtZSxtYXBfbGRmaWVkLHBsKSk7Cit9CisKK3ZhcmFyZ3MgaW50CitHZXRSYW5kRlZhbHVlTyhzdHJpbmcgdm5hbWUsIG1hcHBpbmcgbWFwX2xkZmllZCwgb2JqZWN0IHBsKSB7CisgIHJldHVybiAocmFuZG9tKEdldFZhbHVlKHZuYW1lLG1hcF9sZGZpZWQscGwpKkdldEZhY3Rvcih2bmFtZSxtYXBfbGRmaWVkLHBsKSkvMTAwCisgICAgICAgICAgKyBHZXRPZmZzZXQodm5hbWUsbWFwX2xkZmllZCxwbCkpOworfQorCittYXBwaW5nIEFkZFNraWxsTWFwcGluZ3MobWFwcGluZyBvbGRtYXAsIG1hcHBpbmcgbmV3bWFwKSB7CisgIG1hcHBpbmcgcmVzLHQxLHQyOworICBtaXhlZCAqaW54LGluZDsKKyAgaW50IGk7CisKKyAgaWYgKCFtYXBwaW5ncChvbGRtYXApKSByZXR1cm4gbmV3bWFwOworICBpZiAoIW1hcHBpbmdwKG5ld21hcCkpIHJldHVybiBvbGRtYXA7CisgIGlueD0oe1NJX1NLSUxMUkVTVFJfTEVBUk4sU0lfU0tJTExSRVNUUl9VU0UsU01fUkFDRX0pOworICByZXM9b2xkbWFwK25ld21hcDsKKyAgZm9yIChpPXNpemVvZihpbngpO2ktLTspIHsKKyAgICAgICAgaW5kPWlueFtpXTsKKyAgICAgICAgdDE9b2xkbWFwW2luZF07CisgICAgICAgIHQyPW5ld21hcFtpbmRdOworICAgICAgICBpZiAodDEpIHsKKyAgICAgICAgICBpZiAodDIpCisgICAgICAgICAgICAgICAgcmVzW2luZF09dDErdDI7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJlc1tpbmRdPXQxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmICh0MikKKyAgICAgICAgICAgICAgICByZXNbaW5kXT10MjsKKyAgICAgICAgfQorICB9CisgIHJldHVybiByZXM7Cit9CisKZGlmZiAtLWdpdCBhL3N0ZC9yb29tLmMgYi9zdGQvcm9vbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5YWI1MDMKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcm9vbS5jCkBAIC0wLDAgKzEsMjM5IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gcm9vbS5jIC0tIHJvb20gYmFzZSBvYmplY3QKKy8vCisvLyAkSWQ6IHJvb20uYyA5NDc1IDIwMTYtMDItMTkgMjE6MTY6MTdaIFplc3N0cmEgJAorI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCitpbmhlcml0ICIvc3RkL3RoaW5nL3Byb3BlcnRpZXMiOworaW5oZXJpdCAiL3N0ZC90aGluZy9sYW5ndWFnZSI7Citpbmhlcml0ICIvc3RkL2hvb2tfcHJvdmlkZXIiOworaW5oZXJpdCAiL3N0ZC9yb29tL2xpZ2h0IjsKK2luaGVyaXQgIi9zdGQvY29udGFpbmVyL2ludmVudG9yeSI7Citpbmhlcml0ICIvc3RkL3Jvb20vbW92aW5nIjsKK2luaGVyaXQgIi9zdGQvcm9vbS9yZXN0cmljdGlvbnMiOworaW5oZXJpdCAiL3N0ZC9yb29tL2Rlc2NyaXB0aW9uIjsKK2luaGVyaXQgIi9zdGQvcm9vbS9leGl0cyI7Citpbmhlcml0ICIvc3RkL3Jvb20vY29tbWFuZHMiOworaW5oZXJpdCAiL3N0ZC9yb29tL2l0ZW1zIjsKK2luaGVyaXQgIi9zdGQvcm9vbS9kb29ycyI7CisKKyNpbmNsdWRlIDx0aGluZy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHJvb21zLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8ZG9vcnJvb20uaD4KKyNpbmNsdWRlIDxmdW5jdGlvbmxpc3QuaD4KKwordm9pZCByZXNldCgpCit7CisgIGl0ZW1zOjpyZXNldCgpOworICBleGl0czo6cmVzZXQoKTsKKyAgZG9vcnM6OnJlc2V0KCk7Cit9CisKK3N0YXRpYyBpbnQKK19xdWVyeV9ub2dldCgpCit7CisgIHJldHVybiAxOworfQorCisvLyNkZWZpbmUgREIoeCkgaWYgKGZpbmRfcGxheWVyKCJqb2YiKSkgdGVsbF9vYmplY3QoZmluZF9wbGF5ZXIoImpvZiIpLHgpOyBlbHNlIHdyaXRlKHgpCisvLyN1bmRlZiBEQgorLy8jZGVmaW5lIERCKHgpCit2b2lkIG1heWJlX3JlcGxhY2VfcHJvZ3JhbSgpCit7CisgIHN0cmluZyAqbGlzdCwgZmlyc3Q7CisgIG9iamVjdCBmaXJzdF9vYjsKKworLy8gRGVidWdrcmFtIGF1c2tvbW1lbnRpZXJ0LCBaZXNzdHJhLCAwNC4xMS4wNgorLy8gIERCKCJNQVlCRV9SRVBMQUNFX1BST0dSQU1cbiIpOworLy8gIERCKHNwcmludGYoIkZJTEVOQU1FOiAlT1xuIixvYmplY3RfbmFtZSh0aGlzX29iamVjdCgpKSkpOworLy8gIERCKHNwcmludGYoIkZJUlNUX09COiAlT1xuIixpbmhlcml0X2xpc3QodGhpc19vYmplY3QoKSkpKTsKKy8vICBmaXJzdF9vYj1maW5kX29iamVjdChmaXJzdD0obGlzdD1pbmhlcml0X2xpc3QodGhpc19vYmplY3QoKSkpWzFdKTsKKy8vICBEQihzcHJpbnRmKCIlTyA/PSAlT1xuIixzaXplb2YobGlzdCksMStzaXplb2YoaW5oZXJpdF9saXN0KGZpcnN0X29iKSkpKTsKKy8vICBEQihzcHJpbnRmKCIlTyA/PSBzaXplb2YoJU8pXG4iLDEsbGlzdD1mdW5jdGlvbmxpc3QodGhpc19vYmplY3QoKSxSRVRVUk5fRlVOQ1RJT05fTkFNRXxOQU1FX0lOSEVSSVRFRCkpKTsKKyAgaWYgKG9iamVjdF9uYW1lKHRoaXNfb2JqZWN0KCkpPT0iL3N0ZC9yb29tIiB8fAorICAgICAgIShmaXJzdF9vYj1maW5kX29iamVjdChmaXJzdD0obGlzdD1pbmhlcml0X2xpc3QodGhpc19vYmplY3QoKSkpWzFdKSkgfHwKKyAgICAgIChzaXplb2YobGlzdCkhPTErc2l6ZW9mKGluaGVyaXRfbGlzdChmaXJzdF9vYikpKSB8fAorICAgICAgKDEhPXNpemVvZihsaXN0PWZ1bmN0aW9ubGlzdCh0aGlzX29iamVjdCgpLAorICAgICAgICAgICBSRVRVUk5fRlVOQ1RJT05fTkFNRXxOQU1FX0lOSEVSSVRFRCkpKSB8fAorICAgICAgbGlzdFswXSE9ImNyZWF0ZSIpCisgICAgcmV0dXJuOworLy8gIERCKCJSRVBMQUNJTkdcbiIpOworICByZXBsYWNlX3Byb2dyYW0oZmlyc3QpOworfQorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICBtYXliZV9yZXBsYWNlX3Byb2dyYW0oKTsKKyAgLyogU2V0IGVmZmVjdGl2ZSB1c2VyaWQgdG8gdXNlcmlkICovCisgIC8qIHNvIHRoYXQgd2UgbWF5IGNsb25lIG90aGVyIHRoaW5ncyAqLworICBzZXRldWlkKGdldHVpZCh0aGlzX29iamVjdCgpKSk7CisgIHByb3BlcnRpZXM6OmNyZWF0ZSgpOworICByZXN0cmljdGlvbnM6OmNyZWF0ZSgpOworICBjb21tYW5kczo6Y3JlYXRlKCk7CisgIGxpZ2h0OjpjcmVhdGUoKTsKKyAgZGVzY3JpcHRpb246OmNyZWF0ZSgpOworICBleGl0czo6Y3JlYXRlKCk7CisgIGl0ZW1zOjpjcmVhdGUoKTsKKyAgZG9vcnM6OmNyZWF0ZSgpOworCisgIFNldFByb3AoUF9OQU1FLDApOworICBTZXRQcm9wKFBfTkFNRV9BREosKHt9KSk7CisgIFNldChQX1NIT1JULDApOworICBTZXQoUF9MT05HLDApOworICBTZXQoUF9UUkFOU1BBUkVOVCwwKTsKKyAgU2V0KFBfQURKRUNUSVZFUywoe30pKTsKKyAgU2V0KFBfSURTLCh7fSkpOworICBTZXQoUF9XRUlHSFQsUFJPVEVDVEVELEZfTU9ERSk7CisgIFNldChQX1RPVEFMX1dFSUdIVCxQUk9URUNURUQsRl9NT0RFKTsKKyAgU2V0KCIgY2xlYW4gY291bnRlciAiLDIpOworfQorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGVfc3VwZXIoKSB7CisgIHNldF9uZXh0X3Jlc2V0KC0xKTsKK30KKworcHJpdmF0ZSBpbnQKK2NoZWNrX2NsZWFuX2NvdW50KCkKK3sKKyAgaW50IGNjOworCisgIGNjPVF1ZXJ5KCIgY2xlYW4gY291bnRlciAiKTsKKyAgaWYgKC0tY2M8PTApCisgICAgcmV0dXJuIDE7CisgIFNldCgiIGNsZWFuIGNvdW50ZXIgIixjYyk7CisgIHJldHVybiAwOworfQorCitpbnQKK2NsZWFuX3VwKGludCBhcmcpCit7CisgIG1peGVkIGl0ZW1hOworCisgIGlmKGFyZz4xKSByZXR1cm4gMTsgLy8gYmV0dGVyIG5vdCA7KQorCisgIGlmIChRdWVyeSgiIG5ldmVyIGNsZWFuICIpKSByZXR1cm4gMDsKKworICAvLyBpZiB0aGVyZSBhcmUgYW55IGl0ZW0gd2UgaGF2ZSBwcm9kdWNlZCBvdXJzZWxmZXMgY2hlY2sgdGhlbQorICBpZihwb2ludGVycChpdGVtYSA9IFF1ZXJ5UHJvcChQX0lURU1TKSkpCisgIHsKKyAgICBtaXhlZCBuYW1lczsKKyAgICBpbnQgaTsKKyAgICBpID0gc2l6ZW9mKG5hbWVzID0gYWxsX2ludmVudG9yeSh0aGlzX29iamVjdCgpKSk7CisgICAgd2hpbGUoaS0tKQorICAgIHsKKyAgICAgIGlmIChxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG5hbWVzW2ldKSkKKyAgICAgIHsKKwlTZXQoIiBjbGVhbiBjb3VudGVyICIsMik7CisJcmV0dXJuIDE7CisgICAgICB9CisgICAgICBpZihvYmplY3RwKG5hbWVzW2ldKSkgbmFtZXNbaV0gPSBleHBsb2RlKG9iamVjdF9uYW1lKG5hbWVzW2ldKSwiIyIpWzBdOworICAgIH0KKworICAgIGZvcihpID0gc2l6ZW9mKGl0ZW1hKS0xOyBpID49IDA7IGktLSkKKyAgICB7CisgICAgICAvLyBTZW1hbnRpazoKKyAgICAgIC8vIDEuIFdlbm4gUklURU1fT0JKRUNUIGVpbiBhcnJheSBpc3QsIGthbm4gZXZ0bCBnZSdjbGVhbidlZCB3ZXJkZW4uCisgICAgICAvLyAyLiBXZW5uIGVzIGVpbiBSRUZSRVNIX05PTkUgSXRlbSBpc3QgdW5kIGVzIGVudHdlZGVyIG5pY2h0IG1laHIgCisgICAgICAvLyAgICBleGlzdGllcnQgb2RlciBuaWNodCBpbiBkaWVzZW0gUmF1bSBpc3QsIGtlaW4gY2xlYW5fdXAgKGVzIHd1ZXJkZQorICAgICAgLy8gICAgYmVpbSBuZXVsYWRlbiBkZXMgUmF1bWVzIGphIHdpZWRlciBlcnpldWd0OworICAgICAgLy8gICAgZmFsbHMgZXMgYWJlciBoaWVyIGlzdCwgd2lyZCBlcyBtaXR2ZXJuaWNodGV0LCBkYW5uIGlzdHMgb2spCisgICAgICAvLyAzLiBXZW5uIGVzIGVpbiBSRUZSRVNIX0RFU1RSVUNUIGlzdCB1bmQgbm9jaCBleGlzdGllcnQsIGFiZXIgbmljaHQKKyAgICAgIC8vICAgIGhpZXIgaXN0LCBLRUlOIGNsZWFuX3VwLgorICAgICAgaWYgKCFwb2ludGVycChpdGVtYVtpXVtSSVRFTV9PQkpFQ1RdKSAKKwkgICYmICgoaXRlbWFbaV1bUklURU1fUkVGUkVTSF0gPT0gUkVGUkVTSF9OT05FIAorCSAgICAgICYmICghaXRlbWFbaV1bUklURU1fT0JKRUNUXSAKKwkJfHwgZW52aXJvbm1lbnQoaXRlbWFbaV1bUklURU1fT0JKRUNUXSkhPXRoaXNfb2JqZWN0KCkpKSAKKwkgICAgfHwgKGl0ZW1hW2ldW1JJVEVNX1JFRlJFU0hdID09IFJFRlJFU0hfREVTVFJVQ1QgCisJICAgICAgJiYgaXRlbWFbaV1bUklURU1fT0JKRUNUXSAKKwkgICAgICAmJiBlbnZpcm9ubWVudChpdGVtYVtpXVtSSVRFTV9PQkpFQ1RdKSAhPSB0aGlzX29iamVjdCgpKSkpCisJICByZXR1cm4gMTsKKyAgICAgIG5hbWVzIC09IChwb2ludGVycChpdGVtYVtpXVtSSVRFTV9GSUxFXSkgPworCSAgaXRlbWFbaV1bUklURU1fRklMRV0gOiAoeyBpdGVtYVtpXVtSSVRFTV9GSUxFXSB9KSk7CisgICAgfQorICAgIC8vIGlmIHRoZXJlIGFyZSBvYmplY3RzIGxlZnQgaW4gdGhlIHJvb20gZG8gbm90IGNsZWFuIHVwIGJ1dCB0cnkgYWdhaW4gbGF0ZXIKKyAgICBpZihzaXplb2YobmFtZXMpICYmICFjaGVja19jbGVhbl9jb3VudCgpKSByZXR1cm4gMTsKKyAgfQorICBlbHNlCisgICAgLy8gaXMgdGhlcmUgYW55IG9iamVjdCBseWluZyBhcm91bmQ/CisgICAgaWYoZmlyc3RfaW52ZW50b3J5KHRoaXNfb2JqZWN0KCkpICYmICFjaGVja19jbGVhbl9jb3VudCgpKSByZXR1cm4gMjsKKworICAvLyBkbyBjbGVhbl91cAorICAvL2xvZ19maWxlKCJjbGVhbl91cF9sb2ciLHNwcmludGYoCisgIC8vCSIlczolczogJU9cbiIsY3RpbWUodGltZSgpKVsxMS4uMThdLF9fSE9TVF9OQU1FX18sdGhpc19vYmplY3QoKSkpOworICAKKyAgcmVtb3ZlKCk7CisgIC8vIHdlbm4gZGVyIFJhdW0gc2ljaCBpbSByZW1vdmUoKSBuaWNodCB6ZXJzdG9lcnQsIGhhdCBlciBkYWZ1ZXIgdmVybXV0bGljaAorICAvLyBuZW4gR3J1bmQuIEV2dGwuIGtsYXBwdHMgamEgbmFlY2hzdGVzIE1hbC4KKworICByZXR1cm4oMSk7Cit9CisKKy8qIEluc3RlYWQgb2YgcHJpbnRpbmcgdGhlIGV4aXRzIHdpdGggdGhlIGxvbmcgZGVzY3JpcHRpb24sIHdlIGltcGxlbWVudCAqLworLyogdGhlIGNvbW1hbmQgImV4aXRzIiB0byBzaG93IHRoZW0uICovCitpbnQKK3Nob3dfZXhpdHMoKSB7CisgIG1peGVkIGV4OworICBpZiggdGhpc19wbGF5ZXIoKS0+Q2Fubm90U2VlKCkgKSByZXR1cm4gMTsKKyAgaWYgKChleD1RdWVyeVByb3AoUF9ISURFX0VYSVRTKSkgJiYgaW50cChleCkpIHJldHVybiAxOworICBpZiAoZXggPSBHZXRFeGl0cyh0aGlzX3BsYXllcigpKSkgd3JpdGUoZXgpOworICByZXR1cm4gMTsKK30KKworaW50Cit0b2dnbGVfZXhpdHMoc3RyaW5nIHN0cikKK3sKKyAgaW50IGV4OworCisgIC8qIE51ciBkYXMgYWt0dWVsbGUgRW52aXJvbm1lbnQgZGVzIFNwaWVsZXJzIGlzdCB6dXN0YWVuZGlnIGZ1ZXIgZGllCisgICAgIEF1Zmxpc3R1bmcgZGVyIEF1c2dhZW5nZS4gQW5kZXJlbmZhbGxzIHdpcmQgZGFzIEtvbW1hbmRvIHZvbiBSYWV1bWVuCisgICAgIGltIFJhdW0gKHouQi4gVHJhbnNwb3J0ZXJuKSBhYmdlZmFuZ2VuIHVuZCBlcyB3ZXJkZW4gZGVzc2VuIEF1c2dhZW5nZQorICAgICBhdWZnZWxpc3RldC4KKyAgICAgU3ByaWNoOiBrZWluZSBBdWZsaXN0dW5nIHZvbiBBdXNzZW4uICovCisgIGlmIChlbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKSAhPSB0aGlzX29iamVjdCgpKSByZXR1cm4gMDsKKyAgaWYgKCFzdHIpIHJldHVybiBzaG93X2V4aXRzKCk7CisgIGlmIChzdHIhPSJhdXRvIikgcmV0dXJuIDA7CisgIGV4ID0gdGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKFBfU0hPV19FWElUUyk7CisgIHRoaXNfcGxheWVyKCktPlNldFByb3AoUF9TSE9XX0VYSVRTLCAhZXgpOworICBpZiAoZXgpIHdyaXRlKCJBdXNnYWVuZ2Ugd2VyZGVuIG5pY2h0IG1laHIgYXV0b21hdGlzY2ggYW5nZXplaWd0LlxuIik7CisgIGVsc2Ugd3JpdGUoIkF1c2dhZW5nZSB3ZXJkZW4gYXV0b21hdGlzY2ggYW5nZXplaWd0LlxuIik7CisgIHJldHVybiAxOworfQorCit2b2lkCitpbml0KCkKK3sKKyAgU2V0KCIgY2xlYW4gY291bnRlciAiLDIpOworCisgIGV4aXRzOjppbml0KCk7CisgIGNvbW1hbmRzOjppbml0KCk7CisgIGRlc2NyaXB0aW9uOjppbml0KCk7CisgIGRvb3JzOjppbml0KCk7CisKKyAgYWRkX2FjdGlvbigidG9nZ2xlX2V4aXRzIiwgImV4aXRzIik7CisgIGFkZF9hY3Rpb24oInRvZ2dsZV9leGl0cyIsICJhdXNnYW5nIik7CisgIGFkZF9hY3Rpb24oInRvZ2dsZV9leGl0cyIsICJhdXNnYWVuZ2UiKTsKKyAgYWRkX2FjdGlvbigidG9nZ2xlX2V4aXRzIiwgImF1cyIpOworfQorCitpbnQgX3F1ZXJ5X3BhcmEoKXsKKyAgaW50IHJlOworICBpZihyZT1RdWVyeShQX1BBUkEpKXJldHVybiByZTsKKyAgaWYoc2l6ZW9mKHJlZ2V4cCgoe29iamVjdF9uYW1lKHRoaXNfb2JqZWN0KCkpfSksIi4qXFxeMCQiKSkpCisgICAgICByZXR1cm4gLTE7CisgIHJldHVybiB0b19pbnQoCisgICAgcmVncmVwbGFjZShvYmplY3RfbmFtZSh0aGlzX29iamVjdCgpKSwiLipcXF5cKFsxLTldWzAtOV0qXCkkIiwiXFwxIiwxKSk7Cit9CisKKy8vZGllcyBpc3QgZWluIFJhdW0sIHdhciBnZXd1ZW5zY2h0IHZvbiBtZWhyZXJlbiBMZXV0ZW4uCitzdGF0dXMgSXNSb29tKCkge3JldHVybigxKTt9CmRpZmYgLS1naXQgYS9zdGQvcm9vbS9jb21tYW5kcy5jIGIvc3RkL3Jvb20vY29tbWFuZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWE3NWMzCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3Jvb20vY29tbWFuZHMuYwpAQCAtMCwwICsxLDM3IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gcm9vbS9jb21tYW5kcy5jIC0tIHJvb20gY29tbWFuZHMgaGFuZGxpbmcKKy8vCisvLyAkSWQ6IGNvbW1hbmRzLmMgODIwMSAyMDEyLTExLTA3IDE3OjU1OjEyWiBaZXNzdHJhICQKKworI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSBwZWRhbnRpYworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorCitpbmhlcml0ICIvc3RkL3RoaW5nL2NvbW1hbmRzIjsKKworLy8jZGVmaW5lIE5FRURfUFJPVE9UWVBFUworCisjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKwordm9pZCBpbml0KCkgCit7CisgIDo6aW5pdCgpOworCisgIGFkZF9hY3Rpb24oImltcG9zcyIsICJzdWNoIik7CisgIGFkZF9hY3Rpb24oImltcG9zcyIsICJzdWNoZSIpOworfQorCisvKiBGdWVyIGV0d2FzIGJlc3NlcmUgRmVobGVybWVsZHVuZ2VuIGFscyAnV2llIGJpdHRlPycgYmVpIGVpbmlnZW4gKi8KKy8qIGFsbGdlbWVpbmVuIEtvbW1hbmRvcy4JCQkJCSAgICovCitpbnQgaW1wb3NzKCkKK3sKKyAgX25vdGlmeV9mYWlsKCJEdSBzdWNoc3QsIGZpbmRlc3QgYWJlciBuaWNodHMuXG4iKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zdGQvcm9vbS9kZXNjcmlwdGlvbi5jIGIvc3RkL3Jvb20vZGVzY3JpcHRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGQzYjI4Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkL3Jvb20vZGVzY3JpcHRpb24uYwpAQCAtMCwwICsxLDIyMiBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHJvb20vZGVzY3JpcHRpb24uYyAtLSByb29tIGRlc2NyaXB0aW9uIGhhbmRsaW5nCisvLworLy8gJElkOiBkZXNjcmlwdGlvbi5jIDk0NjggMjAxNi0wMi0xOSAyMTowNzowNFogR2xvaW5zb24gJAorCisjcHJhZ21hIHN0cm9uZ190eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIHBlZGFudGljCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisKK2luaGVyaXQgIi9zdGQvY29udGFpbmVyL2Rlc2NyaXB0aW9uIjsKKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxkb29ycm9vbS5oPgorCit2b2lkIGNyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9OQU1FLCAiUmF1bSIpOworICBTZXRQcm9wKFBfSU5UX1NIT1JULCI8bmFtZW5sb3NlciBSYXVtPiIpOworICBTZXRQcm9wKFBfSU5UX0xPTkcsMCk7CisgIFNldFByb3AoUF9ST09NX01TRywgKHt9KSApOworICBTZXRQcm9wKFBfRlVOQ19NU0csIDApOworICBTZXRQcm9wKFBfTVNHX1BST0IsIDMwKTsKKyAgQWRkSWQoKHsicmF1bSIsICJoaWVyIn0pKTsKK30KKwordm9pZCBpbml0KCkKK3sKKyAgLy8gV2VubiBQX1JPT01fTVNHIGdlc2V0enQgb2RlciBQX0ZVTkNfTVNHIHVuZCBrZWluIENhbGxvdXQgbGFldWZ0LAorICAvLyBDYWxsb3V0IHN0YXJ0ZW4uCisgIG1peGVkIHJvb21tc2cgPSBRdWVyeVByb3AoUF9ST09NX01TRyk7CisgIGlmKCAoIChyb29tbXNnICYmIHNpemVvZihyb29tbXNnKSkgfHwKKyAgICAgICAgUXVlcnlQcm9wKFBfRlVOQ19NU0cpICkgJiYKKyAgICAgIChmaW5kX2NhbGxfb3V0KCJXcml0ZVJvb21NZXNzYWdlIik9PS0xKSkKKyAgICBjYWxsX291dCgiV3JpdGVSb29tTWVzc2FnZSIsIHJhbmRvbShRdWVyeVByb3AoUF9NU0dfUFJPQikpKTsKK30KKwordmFyYXJncyB2b2lkIEFkZFJvb21NZXNzYWdlKHN0cmluZyAqbWVzZywgaW50IHByb2IsIG1peGVkIGZ1bmMpCit7CisgIGlmIChtZXNnICYmICFwb2ludGVycChtZXNnKSkKKyAgICByYWlzZV9lcnJvcihzcHJpbnRmKAorICAgICAgIkFkZFJvb21NZXNzYWdlKCk6IHdyb25nIGFyZ3VtZW50IHR5cGUsIGV4cGVjdGVkIEFycmF5IG9yIDAsICIKKyAgICAgICJnb3QgJS4yME8iLG1lc2cpKTsKKworICAgU2V0UHJvcChQX1JPT01fTVNHLCBtZXNnKTsKKworICBpZiAocHJvYj4wKQorICAgIFNldFByb3AoUF9NU0dfUFJPQiwgcHJvYik7CisKKyAgaWYgKGZ1bmMpCisgICAgU2V0UHJvcChQX0ZVTkNfTVNHLCBmdW5jKTsKK30KKworc3RhdGljIHZvaWQgV3JpdGVSb29tTWVzc2FnZSgpCit7CisgIGludCB0aW0sIG1zZ2lkOworICBzdHJpbmcgKnJvb21fbXNnLGZ1bmM7CisgIG1peGVkICpmdW5jX21zZzsKKworICByb29tX21zZyA9IChzdHJpbmcgKilRdWVyeVByb3AoUF9ST09NX01TRyk7CisgIGZ1bmNfbXNnID0gUXVlcnlQcm9wKFBfRlVOQ19NU0cpOworICBpZiAoKCFyb29tX21zZyB8fCAhc2l6ZW9mKHJvb21fbXNnKSkgJiYgIWZ1bmNfbXNnKQorICAgIHJldHVybjsKKworICBpZiAocm9vbV9tc2cmJnNpemVvZihyb29tX21zZykpCisgIHsKKyAgICBtc2dpZCA9IHJhbmRvbShzaXplb2Yocm9vbV9tc2cpKTsKKyAgICAvLyBEZWZhdWx0d2VydGUgc2luZCBmdWVyIEFsdGNvZGUgc2Nod2llcmlnCisgICAgc2VuZF9yb29tKHRoaXNfb2JqZWN0KCksIHJvb21fbXNnW21zZ2lkXSwKKyAgICAgICAgICAgICAgTVRfTE9PS3xNVF9MSVNURU58TVRfRkVFTHxNVF9TTUVMTHwKKyAgICAgICAgICAgICAgTVNHX0RPTlRfU1RPUkV8TVNHX0RPTlRfQlVGRkVSfE1TR19ET05UX1dSQVApOworICB9CisKKyAgaWYgKGZ1bmNfbXNnKQorICB7CisgICAgaWYgKHN0cmluZ3AoZnVuY19tc2cpKQorICAgICAgZnVuYz0oc3RyaW5nKWZ1bmNfbXNnOworICAgIGVsc2UKKyAgICAgIGZ1bmM9ZnVuY19tc2dbcmFuZG9tKHNpemVvZihmdW5jX21zZykpXTsKKyAgICBpZiAoZnVuYyAmJiBmdW5jdGlvbl9leGlzdHMoZnVuYykpCisgICAgICBjYWxsX290aGVyICh0aGlzX29iamVjdCgpLCBmdW5jLCBtc2dpZCk7CisgIH0KKworICB3aGlsZSAocmVtb3ZlX2NhbGxfb3V0KCJXcml0ZVJvb21NZXNzYWdlIikhPS0xKTsKKyAgdGltPVF1ZXJ5UHJvcChQX01TR19QUk9CKTsKKyAgaWYodGhpc19vYmplY3QoKSAmJiBzaXplb2YoZmlsdGVyKAorICAgICAgIGRlZXBfaW52ZW50b3J5KHRoaXNfb2JqZWN0KCkpLCAjJ2ludGVyYWN0aXZlKSkpIC8vJykpKQorICAgIGNhbGxfb3V0KCJXcml0ZVJvb21NZXNzYWdlIiwgKHRpbTwxNSA/IDE1IDogdGltKSk7Cit9CisKK3ZhcmFyZ3Mgc3RyaW5nIGludF9sb25nKG1peGVkIHZpZXdlcixtaXhlZCB2aWV3cG9pbnQsaW50IGZsYWdzKQoreworICBzdHJpbmcgZGVzY3IsIGludl9kZXNjcjsKKworICBmbGFncyAmPSAzOworICBpZiggSVNfTEVBUk5FUih2aWV3ZXIpICYmIHZpZXdlci0+UXVlcnlQcm9wKCBQX1dBTlRTX1RPX0xFQVJOICkgKQorICAgIGRlc2NyID0gIlsiICsgb2JqZWN0X25hbWUoTUUpICsgIl1cbiI7CisgIGVsc2UKKyAgICBkZXNjciA9ICIiOworCisgIGRlc2NyICs9IHByb2Nlc3Nfc3RyaW5nKFF1ZXJ5UHJvcChQX0lOVF9MT05HKXx8IiIpOworICAKKyAgLy8gZ2dmLiBUdWVyZW4gaGluenVmdWVnZW4uCisgIGlmIChRdWVyeVByb3AoUF9ET09SX0lORk9TKSkgeworICAgIHN0cmluZyB0bXA9KChzdHJpbmcpY2FsbF9vdGhlcihET09SX01BU1RFUiwibG9va19kb29ycyIpKTsKKyAgICBpZiAoc3RyaW5ncCh0bXApICYmIHNpemVvZih0bXApKQorICAgICAgICBkZXNjciArPSB0bXA7CisgIH0KKyAgCisgIC8vIGdnZi4gQXVzZ2FlbmdlIGhpbnp1ZnVlZ2VuLgorICBpZiAoIHZpZXdlci0+UXVlcnlQcm9wKFBfU0hPV19FWElUUykgJiYgKCFRdWVyeVByb3AoUF9ISURFX0VYSVRTKSAKKwl8fCBwb2ludGVycChRdWVyeVByb3AoUF9ISURFX0VYSVRTKSkpICkKKyAgICBkZXNjciArPSBHZXRFeGl0cyh2aWV3ZXIpIHx8ICIiOworCisgIC8vIFZpZXdwb2ludCAoT2JqZWt0IG9kZXIgT2JqZWt0YXJyYXkpIHNpbmQgbmljaHQgc2ljaHRiYXIKKyAgaW52X2Rlc2NyID0gKHN0cmluZykgbWFrZV9pbnZsaXN0KHZpZXdlciwgYWxsX2ludmVudG9yeShNRSkgCisJCSAgLSAocG9pbnRlcnAodmlld3BvaW50KT92aWV3cG9pbnQ6KHt2aWV3cG9pbnR9KSkgLGZsYWdzKTsKKworICBpZiAoIGludl9kZXNjciAhPSAiIiApCisgICAgZGVzY3IgKz0gaW52X2Rlc2NyOworCisgIGlmKGVudmlyb25tZW50KCkgJiYgKGludl9kZXNjcj1RdWVyeVByb3AoUF9UUkFOU1BBUkVOVCkpKQorICB7CisgICAgaWYoc3RyaW5ncChpbnZfZGVzY3IpKSBkZXNjciArPSBpbnZfZGVzY3I7CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICBkZXNjciArPSAiQXVzc2VyaGFsYiBzaWVoc3QgRHU6XG4iOworICAgICAgICAgICAgCisgICAgZGVzY3IgKz0gZW52aXJvbm1lbnQoKS0+aW50X3Nob3J0KHZpZXdlcixNRSk7CisgIH0KKyAgICAgICAgICAgICAgICAgIAorICByZXR1cm4gZGVzY3I7Cit9CisKK3N0cmluZyBpbnRfc2hvcnQobWl4ZWQgdmlld2VyLG1peGVkIHZpZXdwb2ludCkKK3sKKyAgc3RyaW5nIGRlc2NyLCBpbnZfZGVzY3I7CisKKyAgZGVzY3IgPSBwcm9jZXNzX3N0cmluZyggUXVlcnlQcm9wKFBfSU5UX1NIT1JUKXx8IiIpOworICBpZiggSVNfTEVBUk5FUih2aWV3ZXIpICYmIHZpZXdlci0+UXVlcnlQcm9wKCBQX1dBTlRTX1RPX0xFQVJOICkgKQorICAgIGRlc2NyICs9ICIgWyIgKyBvYmplY3RfbmFtZShNRSkgKyAiXS5cbiI7CisgIGVsc2UKKyAgICBkZXNjciArPSAiLlxuIjsKKworICBpZiAoICggdmlld2VyLT5RdWVyeVByb3AoUF9TSE9XX0VYSVRTKQorICAgICAgICAgfHwgKCBlbnZpcm9ubWVudCh2aWV3ZXIpID09IE1FICYmICF2aWV3ZXItPlF1ZXJ5UHJvcChQX0JSSUVGKSApICkKKyAgICAgICAmJiAoIVF1ZXJ5UHJvcChQX0hJREVfRVhJVFMpIHx8IHBvaW50ZXJwKFF1ZXJ5UHJvcChQX0hJREVfRVhJVFMpKSkgKQorICAgIGRlc2NyICs9IEdldEV4aXRzKHZpZXdlcikgfHwgIiI7CisgIAorICAvLyBWaWV3cG9pbnQgKE9iamVrdCBvZGVyIE9iamVrdGFycmF5KSBzaW5kIG5pY2h0IHNpY2h0YmFyCisgIGludl9kZXNjciA9IChzdHJpbmcpIG1ha2VfaW52bGlzdCggdmlld2VyLCBhbGxfaW52ZW50b3J5KE1FKSAKKwkJICAtIChwb2ludGVycCh2aWV3cG9pbnQpP3ZpZXdwb2ludDooe3ZpZXdwb2ludH0pKSApOworCisgIGlmICggaW52X2Rlc2NyICE9ICIiICkKKyAgICBkZXNjciArPSBpbnZfZGVzY3I7CisKKyAgcmV0dXJuIGRlc2NyOworfQorCisvKiogUm9vbW1lc3NhZ2VzIGFic2NoYWx0ZW4sIHdlbm4ga2VpbmUgSW50ZXJhY3RpdmVzIG1laHIgZGEgc2luZC4KKyAgKi8KKy8vIFRPRE86IElyZ2VuZHdhbm4gZGFzIHZhcmFyZ3MgbG9zd2VyZGVuLCB3ZW5uIGluIGRlciByZXN0bGljaGVuIE11ZGxpYgorLy8gVE9ETzo6ZXhpdCgpICdyaWNodGlnJyB1ZWJlcnNjaHJpZWJlbiB3aXJkLgordmFyYXJncyB2b2lkIGV4aXQob2JqZWN0IGxpdiwgb2JqZWN0IGRlc3QpIHsKKyAgLy8gZmFsbCBlcmJlbmRlIE9iamVrdGUgZGFzIGxpdiBuaWNodCB1ZWJlcmdlYmVuLiBQcnVlZnVuZyBudXIgYXVmCisgIC8vIHByZXZpb3VzX29iamVjdCgpLiBXZW5uIE1hZ2llciBkYSBub2NoIGlyZ2VuZHdlbGNoZSBTcGllbGNoZW4gbWl0CisgIC8vIGNhbGxfb3RoZXIoKSAmIENvIHRyZWliZW4sIGhhYmVuIHdpciBQZWNoIGdlaGFidCwgbWFjaHQgYWJlciBuaWNodCB2aWVsLAorICAvLyB3ZWlsIGRpZSBSYXVtbWVsZHVuZ2VuIGRhbm4gaW0gbmFlY2hzdGVuIGNhbGxvdXQgYWJnZXNjaGFsdGV0IHdlcmRlbi4KKyAgaWYgKCFsaXZpbmcobGl2PXByZXZpb3VzX29iamVjdCgpKSkgcmV0dXJuOworCisgIG9iamVjdCAqaW50ZXJhY3RpdmVzID0gZmlsdGVyKGFsbF9pbnZlbnRvcnkoKSwgIydpbnRlcmFjdGl2ZSk7CisgIC8vIGxpdiB3dXJkZSBub2NoIG5pY2h0IGJld2VndCwgZ2dmLiBiZXJ1ZWNrc2ljaHRpZ2VuLgorICBpZiAoICFzaXplb2YoaW50ZXJhY3RpdmVzKSB8fAorICAgICAgKGludGVyYWN0aXZlKGxpdikgJiYgc2l6ZW9mKGludGVyYWN0aXZlcykgPCAyKSApCisgICAgd2hpbGUgKHJlbW92ZV9jYWxsX291dCgiV3JpdGVSb29tTWVzc2FnZSIpIT0tMSk7Cit9CisKK3N0YXRpYyBzdHJpbmcgX3F1ZXJ5X2ludF9sb25nKCkge3JldHVybiBRdWVyeShQX0lOVF9MT05HLCBGX1ZBTFVFKTt9CisKKworLy8gUXVlcnltZXRob2RlIGZ1ZXIgUF9ET01BSU4gLSBnaWJ0IGRpZSBSZWdpb24gYW4sIGluIGRlciBSYXVtIGxpZWd0LCBzb2Zlcm4KKy8vIGVyIHVudGVyIC9kLyBsaWVndC4uLgorc3RhdGljIHN0cmluZyBfcXVlcnlfbGliX3BfZG9tYWluKCkKK3sKKyAgc3RyaW5nIGZuID0gb2JqZWN0X25hbWUoKTsKKyAgaWYgKHN0cnN0cihmbiwgIi9kLyIpID09IDApCisgIHsKKyAgICByZXR1cm4gY2FwaXRhbGl6ZShleHBsb2RlKGZuLCAiLyIpWzJdKTsKKyAgfQorCisgIHJldHVybiAidW5iZWthbm50IjsKK30KKworPHN0cmluZ3xzdHJpbmcqPiogX3NldF9oYXJib3VyX25hbWUoIDxzdHJpbmd8c3RyaW5nKj4qIGRlc2MpIAoreworICBpZiAoIHNpemVvZihkZXNjKSE9MiApCisgIHsKKyAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJVbmFjY2VwdGFibGUgZGF0YSBpbiBQX0hBUkJPVVIsIHNpemVvZigpIHdhcyAlZCwgIgorICAgICAgImV4cGVjdGVkIDIuIiwgc2l6ZW9mKGRlc2MpKSk7CisgIH0KKyAgZWxzZSBpZiAoICFzdHJpbmdwKGRlc2NbMF0pICkKKyAgeworICAgIHJhaXNlX2Vycm9yKCJXcm9uZyBkYXRhIHR5cGUgaW4gUF9IQVJCT1VSWzBdOiBleHBlY3RlZCAnc3RyaW5nJy4iKTsKKyAgfQorICBlbHNlIGlmICggcG9pbnRlcnAoZGVzY1sxXSkgJiYgc2l6ZW9mKGRlc2NbMV0pPDEgKQorICB7CisgICAgcmFpc2VfZXJyb3IoIkluc3VmZmljaWVudCBkYXRhIGluIFBfSEFSQk9VUlsxXTogZXhwZWN0ZWQgJ3N0cmluZyonLCAiCisgICAgICAiZ290ICcoe30pJy4iKTsKKyAgfQorICBlbHNlIGlmICggc3RyaW5ncChkZXNjWzFdKSApCisgIHsKKyAgICBkZXNjWzFdID0gKHtkZXNjWzFdfSk7CisgIH0KKyAgcmV0dXJuIFNldChQX0hBUkJPVVIsIGRlc2MsIEZfVkFMVUUpOworfQorCmRpZmYgLS1naXQgYS9zdGQvcm9vbS9kb29ycy5jIGIvc3RkL3Jvb20vZG9vcnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDVmMDA5Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkL3Jvb20vZG9vcnMuYwpAQCAtMCwwICsxLDE2MiBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHJvb20vZG9vcnMuYyAtLSBuZXcgZG9vcnMsIG1hbmFnZWQgYnkgZG9vcm1hc3RlcgorLy8KKy8vICRJZDogZG9vcnMuYyA5MTM0IDIwMTUtMDItMDIgMTk6MjY6MDNaIFplc3N0cmEgJAorCisjcHJhZ21hIHN0cm9uZ190eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIHBlZGFudGljCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8ZG9vcnJvb20uaD4KKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHJvb20vZXhpdHMuaD4KKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgaWYgKG9iamVjdF9uYW1lKHRoaXNfb2JqZWN0KCkpID09IF9fRklMRV9fWzAuLjwzXSkKKyAgeworICAgIHNldF9uZXh0X3Jlc2V0KC0xKTsKKyAgICByZXR1cm47CisgIH0KKyAgU2V0UHJvcChQX0RPT1JfSU5GT1MsMCk7Cit9CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZV9zdXBlcigpIHsKKyAgc2V0X25leHRfcmVzZXQoLTEpOworfQorCit2YXJhcmdzIGludCBOZXdEb29yKHN0cmluZ3xzdHJpbmcqIGNtZHMsIHN0cmluZyBkZXN0LCBzdHJpbmd8c3RyaW5nKiBpZHMsCisgICAgICAgICAgICAgICAgICAgIG1hcHBpbmd8PGludHxzdHJpbmd8c3RyaW5nKj4qIHByb3BzKQoreworLyoKKyAgY21kczogQmVmZWhsKGUpLCB1bSBkdXJjaCBkaWUgVHVlciB6dSBnZWhlbiAoU3RyaW5nIG9kZXIgQXJyYXkgdm9uIFN0cmluZ3MpCisgIGRlc3Q6IFppZWxyYXVtCisgIGlkczogIElkKHMpIGRlciBUdWVyLCBkZWZhdWx0ICJ0dWVyIiAoU3RyaW5nLCBBcnJheSB2b24gU3RyaW5ncyBvZGVyIDApCisgIHByb3BzOiBiZXNvbmRlcmUgRWlnZW5zY2hhZnRlbiBkZXIgVHVlciAob3B0aW9uYWwpCisgIEFycmF5IG1pdCBQYWFyZW4gTnVtbWVyIGRlciBFaWdlbnNjaGFmdCwgSW5oYWx0CisgIGRlZmluaWVydGUgUHJvcGVydGllcyBzaW5kOgorICBEX0ZMQUdTOiAgRmxhZ3Mgd2llIGJlaSBTaXIncyBUdWVyZW4KKyAgZGVmYXVsdDogRE9PUl9DTE9TRUQgfCBET09SX1JFU0VUX0NMCisgIEJlaSBTY2hsdWVzc2VsbiB3aXJkIGdldGVzdGV0LCBvYiBkZXIgU3RyaW5nLCBkZW4KKyAgUXVlcnlEb29yS2V5IHp1cnVlY2tsaWVmZXJ0LCBnbGVpY2gKKyAgInJhdW1uYW1lMTpyYXVtbmFtZTIiIGlzdCwgd29iZWkgcmF1bW5hbWUxLDIgZGllCisgIGtvbXBsZXR0ZW4gRmlsZW5hbWVuIGRlciBiZWlkZW4gUmFldW1lIGluIHNvcnRpZXJ0ZXIKKyAgUmVpaGVuZm9sZ2Ugc2luZC4KKyAgRF9MT05HOiAgIGxhbmdlIEJlc2NocmVpYnVuZyBkZXIgVHVlcgorICBkZWZhdWx0OiAiRWluZSBUdWVyLlxuIgorICBEX1NIT1JUOiAga3VyemUgQmVzY2hyZWlidW5nIGRlciBUdWVyLCB3aXJkIGFuIGRpZSBSYXVtYmVzY2hyZWlidW5nCisgIGFuZ2VmdWVndCwgd29iZWkgJXMgZHVyY2ggZ2VvZWZmbmV0IGJ6dy4gZ2VzY2hsb3NzZW4KKyAgZXJzZXR6dCB3aXJkLgorICBkZWZhdWx0OiAiRWluZSAlc2UgVHVlci4gIgorICBEX05BTUU6ICAgTmFtZSwgZGVyIGJlaW0gT2VmZm5lbi9TY2hsaWVzc2VuIHVuZCBiZWkgRmVobGVybWVsZHVuZ2VuCisgIGFuZ2V6ZWlndCB3aXJkLgorICBkZWZhdWx0OiAiVHVlciIKKyAgRF9HRU5ERVI6IGRlZmF1bHQ6IEZFTUFMRQorICBEX0ZVTkM6ICAgRnVua3Rpb24sIGRpZSBpbSBSYXVtIGF1ZmdlcnVmZW4gd2VyZGVuIHNvbGwsIHdlbm4gZGllCisgIFR1ZXIgZXJmb2xncmVpY2ggZHVyY2hzY2hyaXR0ZW4gd2lyZC4KKyAgZGVmYXVsdDogMAorICBEX01TR1M6ICAgRmFsbHMgU3RyaW5nOiBhdXNnZWdlYmVuZSBSaWNodHVuZyBmdWVyIG1vdmUKKyAgRmFsbHMgQXJyYXk6ICh7ZGlyZWN0aW9uLCB0ZXh0b3V0LCB0ZXh0aW59KSBmdWVyIG1vdmUKKyAgZGVmYXVsdDogMAorCisgIEJlaXNwaWVsOgorICBOZXdEb29yKCJub3JkZW4iLCIvcGxheWVycy9yb2NodXMvcm9vbS90ZXN0MiIsInBvcnRhbCIsCisgICh7RF9OQU1FLCJQb3J0YWwiLAorICBEX0dFTkRFUixORVVURVIsCisgIERfU0hPUlQsIkltIE5vcmRlbiBzaWVoc3QgRHUgZWluICVzZXMgUG9ydGFsLiAiLAorICBEX0xPTkcsIkRhcyBQb3J0YWwgaXN0IGVpbmZhY2ggbnVyIGdpZ2FudGlzY2guXG4iCisgIH0pKTsKKworKi8KKworICBpZiAoIWNtZHMgfHwgIWRlc3QpIHJldHVybiAwOworICByZXR1cm4gY2FsbF9vdGhlcihET09SX01BU1RFUiwiTmV3RG9vciIsY21kcyxkZXN0LGlkcyxwcm9wcyk7Cit9CisKK3ZvaWQgaW5pdCgpCit7CisgIG1peGVkICppbmZvOworICBzdHJpbmcgKmNtZHM7CisgIGludCBpLGo7CisKKyAgaWYgKCFwb2ludGVycChpbmZvPShtaXhlZCAqKVF1ZXJ5UHJvcChQX0RPT1JfSU5GT1MpKSkgcmV0dXJuOworICBhZGRfYWN0aW9uKCJvZWZmbmVuIiwib2VmZm5lIik7CisgIGFkZF9hY3Rpb24oInNjaGxpZXNzZW4iLCJzY2hsaWVzc2UiKTsKKyAgYWRkX2FjdGlvbigic2NobGllc3NlbiIsInNjaGxpZXNzIik7CisgIGZvciAoaT1zaXplb2YoaW5mbyktMTtpPj0wO2ktLSkgeworICAgIGNtZHM9KHN0cmluZyAqKShpbmZvW2ldW0RfQ01EU10pOworICAgIGZvciAoaj1zaXplb2YoY21kcyktMTtqPj0wO2otLSkKKyAgICAgIGFkZF9hY3Rpb24oImdvX2Rvb3IiLGNtZHNbal0pOworICAgIC8vIEJlZmVobGUgSU1NRVIgYW5mdWVnZW4sIGdlY2hlY2tlZCB3aXJkIHNvd2llc28gZXJzdCBiZWltIER1cmNoZ2VoZW4uCisgIH0KK30KKwordm9pZCByZXNldCgpCit7CisgIGlmIChRdWVyeVByb3AoUF9ET09SX0lORk9TKSkKKyAgICBjYWxsX290aGVyKERPT1JfTUFTVEVSLCJyZXNldF9kb29ycyIpOworfQorCitpbnQgb2VmZm5lbiAoc3RyaW5nIHN0cikKK3sKKyAgaWYgKCFzdHIgfHwgIVF1ZXJ5UHJvcChQX0RPT1JfSU5GT1MpKQorICAgIHJldHVybiAwOworICByZXR1cm4gKGludCkgY2FsbF9vdGhlcihET09SX01BU1RFUiwib2VmZm5lbiIsc3RyKTsKK30KKworaW50IHNjaGxpZXNzZW4gKHN0cmluZyBzdHIpCit7CisgIGlmICghc3RyIHx8ICFRdWVyeVByb3AoUF9ET09SX0lORk9TKSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIChpbnQpIGNhbGxfb3RoZXIoRE9PUl9NQVNURVIsInNjaGxpZXNzZW4iLHN0cik7Cit9CisKK3ZhcmFyZ3MgaW50Citnb19kb29yIChzdHJpbmcgc3RyKQoreworICBpZiAoIVF1ZXJ5UHJvcChQX0RPT1JfSU5GT1MpKQorICAgIHJldHVybiAwOworICBpZiAoY2FsbF9vdGhlcihET09SX01BU1RFUiwiZ29fZG9vciIscXVlcnlfdmVyYigpKSkKKyAgICByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBzZXRfZG9vcnMoc3RyaW5nICpjbWRzLGludCBvcGVuKQoreworICBpbnQgajsKKyAgCisgIGlmICghcHJldmlvdXNfb2JqZWN0KCkpCisgICAgcmV0dXJuIDA7CisgIGlmIChvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSkhPURPT1JfTUFTVEVSKQorICAgIHJldHVybiAwOworICAvLyBBbmRlcmUgc29sbGVuIG5pY2h0IHJ1bXBmdXNjaGVuLgorICBpZiAoIXRoaXNfcGxheWVyKCkpIHJldHVybiAwOworICBpZiAoZW52aXJvbm1lbnQodGhpc19wbGF5ZXIoKSkhPXRoaXNfb2JqZWN0KCkpCisgICAgcmV0dXJuIDA7CisgIC8vIElzdCBzb3dpZXNvIGtlaW5lciBkYS4uLgorICBpZiAoIXBvaW50ZXJwKGNtZHMpKQorICAgIHJldHVybiAwOworICBpZiAob3BlbikKKyAgICBBZGRTcGVjaWFsRXhpdChjbWRzLCJnb19kb29yIik7CisgIGVsc2UKKyAgICBSZW1vdmVTcGVjaWFsRXhpdChjbWRzKTsKKyAgZm9yIChqPXNpemVvZihjbWRzKS0xO2o+PTA7ai0tKQorICAgIGFkZF9hY3Rpb24oImdvX2Rvb3IiLGNtZHNbal0pOworICByZXR1cm4gMTsKK30KKworLyogRnVlciBUdWVyZW4sIGRpZSBmbGV4aWJsZSBMYW5nYmVzY2hyZWlidW5nZW4gaGFiZW4sIHdpcmQgZWluIAorICogU3BlY2lhbERldGFpbCBlaW5nZWZ1ZWhydC4KKyAqLworCitzdHJpbmcgc3BlY2lhbF9kZXRhaWxfZG9vcnMoc3RyaW5nIGtleSl7CisgIHJldHVybiBET09SX01BU1RFUi0+c3BlY2lhbF9kZXRhaWxfZG9vcnMoa2V5KTsKK30KZGlmZiAtLWdpdCBhL3N0ZC9yb29tL2V4aXRzLmMgYi9zdGQvcm9vbS9leGl0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNzI0YjgKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcm9vbS9leGl0cy5jCkBAIC0wLDAgKzEsMzM0IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gcm9vbS9leGl0cy5jIC0tIHJvb20gZXhpdHMgaGFuZGxpbmcgCisvLworLy8gJElkOiBleGl0cy5jIDk0OTcgMjAxNi0wMi0yMSAxNDoyMDowM1ogWmVzc3RyYSAkCisKKy8qCisgKiBFeGl0cyBvZiB0aGUgcm9vbSAob2J2aW91cyBvbmVzLCBkb29ycywgYW5kIHNwZWNpYWwgb25lcykKKyAqIHdlIGRlZmluZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIGZvciBlYXN5IHJlZmVyZW5jZToKKyAqIEdldEV4aXRzKCkgLSByZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyBhbiAiT2J2aW91cyBFeGl0cyIgU3RhdGVtZW50CisgKgorICogVGhlIGV4aXRzIGFyZSBpbXBsZW1lbnRlZCBhcyBwcm9wZXJ0aWVzIFBfRVhJVFMKKyAqIFRoZXkgYXJlIHN0b3JlZCBsb2NhbGx5IChfc2V0X3h4LCBfcXVlcnlfeHgpCisgKiBhcyBtYXBwaW5nIHRvIHNwZWVkIHVwIHRoZSByb3V0aW5lcyBpbiB0aGlzIG1vZHVsZS4KKyAqCisgKi8KKworI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSBwZWRhbnRpYworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorCisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPHRoaW5nL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDxyb29tL2V4aXRzLmg+CisjaW5jbHVkZSA8aG9vay5oPgorI2luY2x1ZGUgPGV4cGxvcmF0aW9uLmg+CisjdW5kZWYgTkVFRF9QUk9UT1RZUEVTCisKKyNpbmNsdWRlIDxzeXNfZGVidWcuaD4KKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPGRhZW1vbi5oPgorI2luY2x1ZGUgPGRvb3Jyb29tLmg+CisjaW5jbHVkZSA8cm91dGluZ2QuaD4KKworI2RlZmluZSBOVU1CRVJTICh7ICJ6d2VpIiwgImRyZWkiLCAidmllciIsICJmdWVuZiIsICJzZWNocyIsICJzaWViZW4iLCAiYWNodCIgfSkKKworCisvLyBIaWxmc2Z1bmt0aW9uLCBkaWUgYmVpIGthcHV0dGVuIEV4aXRzIGVpbmUgTm90cmV0dHVuZyBiZXRyZWlidCwgYWJlcgorLy8gdHJvdHpkZW0gYXVmIERlYnVnIGVpbmUgTWVsZHVuZyBtYWNodC4KK3N0YXRpYyBtYXBwaW5nIHJlc2N1ZUV4aXQoKQoreworICBjYXRjaChyYWlzZV9lcnJvcihzcHJpbnRmKAorCSAgInJvb20vZXhpdHMuYzogRm9yZ290dGVuIDo6Y3JlYXRlKCk/ICIKKwkgICJQX0VYSVRTIGluICVPIGlzIDAhXG4iLCB0aGlzX29iamVjdCgpKSk7cHVibGlzaCk7IAorCisgIHJldHVybiAoWzoyXSk7Cit9CisKKworc3RhdGljIG1hcHBpbmcgX3NldF9leGl0cyggbWFwcGluZyBtYXBfbGRmaWVkICkgCit7CisgICAgaWYoIG1hcHBpbmdwKG1hcF9sZGZpZWQpICkKKyAgICAgICAgcmV0dXJuIFNldCggUF9FWElUUywgbWFwX2xkZmllZCApOworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBtYXBwaW5nIF9xdWVyeV9leGl0cygpIAoreworICAgIGlmKCAoIXByZXZpb3VzX29iamVjdCgpIHx8IG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSAhPSBET09SX01BU1RFUikKKyAgICAgICAgJiYgUXVlcnlQcm9wKFBfRE9PUl9JTkZPUykgKQorICAgICAgICBjYWxsX290aGVyKCBET09SX01BU1RFUiwgImluaXRfZG9vcnMiICk7CisKKyAgICBtYXBwaW5nIGV4aXRzID0gUXVlcnkoUF9FWElUUykgfHwgcmVzY3VlRXhpdCgpOworCisgICAgcmV0dXJuIGZpbHRlcihleGl0cywgZnVuY3Rpb24gaW50IChzdHJpbmcga2V5LCBtaXhlZCB2YWwpCisgICAgICAgIHtyZXR1cm4gc3RyaW5ncCh2YWxbMF0pO30gKTsKK30KKworCitzdGF0aWMgaW50IF9zZXRfc3BlY2lhbF9leGl0cyggbWFwcGluZyBtYXBfbGRmaWVkICkKK3sKKyAgICByZXR1cm4gLTE7Cit9CisKKworc3RhdGljIG1hcHBpbmcgX3F1ZXJ5X3NwZWNpYWxfZXhpdHMoKSAKK3sKKyAgICBtYXBwaW5nIGV4aXRzID0gUXVlcnkoUF9FWElUUykgfHwgcmVzY3VlRXhpdCgpOworCisgICAgcmV0dXJuIGZpbHRlcihleGl0cywgZnVuY3Rpb24gaW50IChzdHJpbmcga2V5LCBtaXhlZCB2YWwpCisgICAgICAgIHtyZXR1cm4gY2xvc3VyZXAodmFsWzBdKTt9ICk7Cit9CisKKwordm9pZCByZXNldCgpCit7fQorCisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgIG9mZmVySG9vayhIX0hPT0tfRVhJVF9VU0UsIDEpOworICBTZXRQcm9wKCBQX0VYSVRTLCAoWzoyXSkgKTsKK30KKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlX3N1cGVyKCkgeworICBzZXRfbmV4dF9yZXNldCgtMSk7Cit9CisKK3Byb3RlY3RlZCB2b2lkIF9BZGRFeGl0KHN0cmluZ3xzdHJpbmcqIGNtZCwgc3RyaW5nfGNsb3N1cmUgcm9vbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtZXNzYWdlKQoreworICBtYXBwaW5nIGV4aXRhOworCisgIGV4aXRhID0gUXVlcnkoUF9FWElUUykgfHwgcmVzY3VlRXhpdCgpOworCisgIGlmICggIWNsb3N1cmVwKHJvb20pICkKKyAgeworICAgIG9iamVjdCByb3V0ZXI7CisKKyAgICByb29tID0gX01ha2VQYXRoKHJvb20pOworCisgICAgaWYgKCAhY2xvbmVwKHRoaXNfb2JqZWN0KCkpICYmIG9iamVjdHAocm91dGVyID0gZmluZF9vYmplY3QoUk9VVEVSKSkgKQorICAgIHsKKyAgICAgIHJvdXRlci0+UmVnaXN0ZXJFeGl0KCBvYmplY3RfbmFtZSh0aGlzX29iamVjdCgpKSwgY21kLCByb29tICk7CisgICAgfQorICB9CisKKyAgaWYoIHN0cmluZ3AoY21kKSApCisgIHsKKyAgICBleGl0YSArPSAoWyBjbWQgOiByb29tOyBtZXNzYWdlIF0pOworICB9CisgIGVsc2UKKyAgeworICAgIGZvcmVhY2goc3RyaW5nIGMgOiBjbWQpCisgICAgeworICAgICAgaWYgKHN0cmluZ3AoYykpCisgICAgICAgIGV4aXRhICs9IChbIGMgOiByb29tOyBtZXNzYWdlIF0pOworICAgIH0KKyAgfQorCisgIFNldCggUF9FWElUUywgZXhpdGEgKTsKK30KKwordm9pZCBBZGRFeGl0KHN0cmluZ3xzdHJpbmcqIGNtZCwgY2xvc3VyZXxzdHJpbmcgZGVzdCkKK3sKKyAgc3RyaW5nIG1zZzsKKyAgaWYgKCBzdHJpbmdwKGRlc3QpICkKKyAgeworICAgIGludCBzOworICAgIGlmKCAocyA9IG1lbWJlcihkZXN0LCAnIycpKSAhPSAtMSApCisgICAgeworICAgICAgbXNnICA9IGRlc3RbMC4ucy0xXTsKKyAgICAgIGRlc3QgPSBkZXN0W3MrMS4uXTsKKyAgICB9CisgIH0KKyAgX0FkZEV4aXQoY21kLCBkZXN0LCBtc2cpOworfQorCit2b2lkIFJlbW92ZUV4aXQoc3RyaW5nfHN0cmluZyogY21kICkKK3sKKyAgICBtYXBwaW5nIGV4aXRhOworCisgICAgaWYgKCAhY21kICkgeworICAgICAgICBTZXRQcm9wKFBfRVhJVFMsIChbOjJdKSApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCBzdHJpbmdwKGNtZCkgKQorICAgICAgICBjbWQgPSAoeyBjbWQgfSk7CisKKyAgICBleGl0YSA9IFF1ZXJ5KFBfRVhJVFMsIEZfVkFMVUUpIHx8IHJlc2N1ZUV4aXQoKTsKKyAgICBmb3JlYWNoKHN0cmluZyBjIDogY21kKQorICAgICAgbV9kZWxldGUoIGV4aXRhLCBjICk7CisKKyAgICBTZXQoIFBfRVhJVFMsIGV4aXRhLCBGX1ZBTFVFICk7Cit9CisKKwordm9pZCBBZGRTcGVjaWFsRXhpdChzdHJpbmd8c3RyaW5nKiBjbWQsIHN0cmluZ3xjbG9zdXJlIGZ1bmN0aW9ubmFtZSApCit7CisKKyAgICBpZiAoIHN0cmluZ3AoZnVuY3Rpb25uYW1lKSApCisgICAgICAgIGZ1bmN0aW9ubmFtZSA9IHN5bWJvbF9mdW5jdGlvbiggZnVuY3Rpb25uYW1lLCB0aGlzX29iamVjdCgpICk7CisKKyAgICBpZiAoICFjbG9zdXJlcChmdW5jdGlvbm5hbWUpICkKKyAgICB7CisgICAgICAgIGNhdGNoKHJhaXNlX2Vycm9yKHNwcmludGYoICJtZXRob2QgJU8gZG9lc24ndCBleGlzdFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25uYW1lKSk7IHB1Ymxpc2gpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQWRkRXhpdCggY21kLCBmdW5jdGlvbm5hbWUgKTsKK30KKworCit2b2lkIFJlbW92ZVNwZWNpYWxFeGl0KHN0cmluZ3xzdHJpbmcqIGNtZCkKK3sKKyAgICBSZW1vdmVFeGl0KCBjbWQgKTsKK30KKworCit2YXJhcmdzIHN0cmluZyBHZXRFeGl0cyggb2JqZWN0IHZpZXdlciApIAoreworICAgIHN0cmluZyAqaW5kaWNlcywgKmhpZGRlbjsKKyAgICBzdHJpbmcgZXhpdHM7CisKKyAgICBpZiAoIFF1ZXJ5UHJvcChQX0RPT1JfSU5GT1MpICkKKyAgICAgICAgY2FsbF9vdGhlciggRE9PUl9NQVNURVIsICJpbml0X2Rvb3JzIiApOworCisgICAgaW5kaWNlcyA9IG1faW5kaWNlcyggUXVlcnkoUF9FWElUUykgfHwgcmVzY3VlRXhpdCgpICk7CisgICAgCisgICAgaWYgKCBwb2ludGVycChoaWRkZW4gPSBRdWVyeVByb3AoUF9ISURFX0VYSVRTKSkgKQorICAgICAgICBpbmRpY2VzIC09IGhpZGRlbjsKKworICAgIGludCBuPXNpemVvZihpbmRpY2VzKTsKKyAgICBzd2l0Y2ggKG4pIHsKKyAgICBjYXNlIDA6CisgICAgICAgIHJldHVybiAiRXMgZ2lidCBrZWluZSBzaWNodGJhcmVuIEF1c2dhZW5nZS5cbiI7CisgICAgICAgIAorICAgIGNhc2UgMToKKyAgICAgICAgcmV0dXJuICJFcyBnaWJ0IGVpbmVuIHNpY2h0YmFyZW4gQXVzZ2FuZzogIiArIGluZGljZXNbMF0gKyAiLlxuIjsKKyAgICAgICAgCisgICAgY2FzZSAyOiBjYXNlIDM6IGNhc2UgNDogY2FzZSA1OiBjYXNlIDY6IGNhc2UgNzogY2FzZSA4OgorICAgICAgICBleGl0cyA9ICJFcyBnaWJ0ICIgKyBOVU1CRVJTW24tMl0gKyAiIHNpY2h0YmFyZSBBdXNnYWVuZ2U6ICI7CisgICAgICAgIGJyZWFrOworICAgICAgICAKKyAgICBkZWZhdWx0OgorICAgICAgICBleGl0cyA9ICJFcyBnaWJ0IHZpZWxlIHNpY2h0YmFyZSBBdXNnYWVuZ2U6ICI7CisgICAgfQorICAgIGV4aXRzICs9IENvdW50VXAoaW5kaWNlcyk7CisgICAgcmV0dXJuIGJyZWFrX3N0cmluZyggZXhpdHMrIi4iLCA3OCApOworfQorCisKKy8vIFJpY2h0dW5nc2JlZmVobGUgbnVyIGludGVycHJldGllcmVuLCB3ZW5uIGRlciBTcGllbGVyICppbSogUmF1bSBzdGVodCB1bmQKKy8vIG5pY2h0IGRhdm9yIChUcmFuc3BvcnRlciBldGMuKS9vCit2b2lkIGluaXQoKQoreworICAgIGlmICggZW52aXJvbm1lbnQodGhpc19wbGF5ZXIoKSkgPT0gdGhpc19vYmplY3QoKSApCisgICAgICAgIGFkZF9hY3Rpb24oICJfbm9ybWFsZnVuY3Rpb24iLCAiIiwgMSApOworfQorCisKKy8qIG5vdCBvbmx5IG5vcm1hbCBleGl0cyBhcmUgaGFuZGxlZCBoZXJlICovCisKK2ludCBfbm9ybWFsZnVuY3Rpb24oKQoreworICBpbnQgcmV0OworICBtYXBwaW5nIGV4aXRzID0gUXVlcnkoUF9FWElUUywgRl9WQUxVRSkgfHwgKFs6M10pOworICBpZiAoIW1lbWJlcihleGl0cyxxdWVyeV92ZXJiKCkpKQorICAgIHJldHVybiAwOworCisgIHN0cmluZyB2ZXJiID0gcXVlcnlfdmVyYigpOworICBzdHJpbmcgZGVzdHJvb20gPSBleGl0c1txdWVyeV92ZXJiKCksMF07CisgIHN0cmluZyBtZXNzYWdlID0gZXhpdHNbcXVlcnlfdmVyYigpLDFdOworCisgIG1peGVkIGhyZXMgPSBIb29rRmxvdyhIX0hPT0tfRVhJVF9VU0UsICh7dmVyYiwgZGVzdHJvb20sIG1lc3NhZ2V9KSk7CisgIGlmKGhyZXMgJiYgcG9pbnRlcnAoaHJlcykgJiYgc2l6ZW9mKGhyZXMpPkhfUkVUREFUQSkKKyAgeworICAgIGlmKGhyZXNbSF9SRVRDT0RFXT09SF9DQU5DRUxMRUQpCisgICAgeworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UgaWYoaHJlc1tIX1JFVENPREVdPT1IX0FMVEVSRUQKKyAgICAgICAgICAgICYmIHBvaW50ZXJwKGhyZXNbSF9SRVREQVRBXSkKKyAgICAgICAgICAgICYmIHNpemVvZihocmVzW0hfUkVUREFUQV0pID49IDMpCisgICAgeworICAgICAgPHN0cmluZ3xjbG9zdXJlPiogaGRhdGEgPSBocmVzW0hfUkVUREFUQV07CisgICAgICBpZiAoIXN0cmluZ3AoaGRhdGFbMF0pCisgICAgICAgICAgfHwgKCFzdHJpbmdwKGhkYXRhWzFdKSAmJiAhY2xvc3VyZXAoaGRhdGFbMV0pKQorICAgICAgICAgIHx8IChoZGF0YVsyXSAmJiAhc3RyaW5ncChoZGF0YVsyXSkpICkKKyAgICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiSW52YWxpZGUgRGF0ZW4gYXVzIEhfSE9PS19FWElUX1VTRTogJS4xNTBPXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkYXRhKSk7CisgICAgICB2ZXJiID0gaGRhdGFbMF07CisgICAgICBkZXN0cm9vbSA9IGhkYXRhWzFdOworICAgICAgbWVzc2FnZSA9IGhkYXRhWzJdOworICAgIH0KKyAgfQorCisgIGlmKCBjbG9zdXJlcChkZXN0cm9vbSkgKQorICB7CisgICAgcmV0ID0gZnVuY2FsbCggZGVzdHJvb20sIHZlcmIgKTsKKworICAgIGlmKHJldD09TU9WRV9PSykKKyAgICB7CisgICAgICBHaXZlRVAoIEVQX0VYSVQsIHZlcmIgKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgaWYgKCFzdHJpbmdwKG1lc3NhZ2UpKQorICB7CisgICAgaWYoIG1lbWJlciggKHsgInN1ZWRlbiIsICJzdWVkd2VzdGVuIiwgIndlc3RlbiIsIm5vcmR3ZXN0ZW4iLCAibm9yZGVuIiwKKyAgICAgICAgIm5vcmRvc3RlbiIsICJvc3RlbiIsInN1ZWRvc3RlbiIgfSksIHZlcmIgKSAhPSAtMSApCisgICAgeworICAgICAgbWVzc2FnZSA9ICJuYWNoICIgKyBjYXBpdGFsaXplKHZlcmIpOworICAgIH0KKyAgICBlbHNlIGlmICggbWVtYmVyKCAoeyAib2JlbiIsICJ1bnRlbiIgfSksIHZlcmIgKSAhPSAtMSApCisgICAgeworICAgICAgbWVzc2FnZSA9ICJuYWNoICIgKyB2ZXJiOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgbWVzc2FnZSA9IHZlcmI7CisgICAgfQorICB9CisKKyAgcmV0ID0gdGhpc19wbGF5ZXIoKS0+bW92ZSggZGVzdHJvb20sIE1fR08sIG1lc3NhZ2UgKTsKKworICBpZiAocmV0PT1NT1ZFX09LKQorICB7CisgICAgR2l2ZUVQKCBFUF9FWElULCB2ZXJiICk7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RyaW5nIF9NYWtlUGF0aCggc3RyaW5nIHN0ciApCit7CisgIHN0cmluZyAqY29tcDsKKworICBjb21wID0gZXhwbG9kZSggb2JqZWN0X25hbWUodGhpc19vYmplY3QoKSksICIvIiApIC0gKHsiIn0pOworICAKKyAgIHN3aXRjaCggc3RyWzBdICl7CisgICBjYXNlICcuJzoKKyAgICAgICBzdHIgPSAiLyIgKyBpbXBsb2RlKCBjb21wWzAuLjwyXSwgIi8iICkgKyAiLyIgKyBzdHI7CisgICAgICAgYnJlYWs7CisgICAgICAgCisgICBjYXNlICd+JzoKKyAgICAgICBzdHIgPSAiLyIgKyBjb21wWzBdICsgIi8iICsgKGNvbXBbMF0gPT0gImQiID8gY29tcFsxXSArICIvIiA6ICIiKQorICAgICAgICAgICArUkVBTF9VSUQodGhpc19vYmplY3QoKSkgKyBzdHJbMS4uXTsKKyAgICAgICBicmVhazsKKyAgIH0KKyAgIAorICAgcmV0dXJuIE1BU1RFUi0+X2dldF9wYXRoKCBzdHIsIGdldHVpZCh0aGlzX29iamVjdCgpKSApOworfQorCmRpZmYgLS1naXQgYS9zdGQvcm9vbS9pdGVtcy5jIGIvc3RkL3Jvb20vaXRlbXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDQwMDVhCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3Jvb20vaXRlbXMuYwpAQCAtMCwwICsxLDQyIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gcm9vbS9pdGVtcy5jIC0tIGNyZWF0aW5nIGV4dHJhIGl0ZW1zIGluIHJvb20KKy8vCisvLyAkSWQ6IGl0ZW1zLmMgOTUzOCAyMDE2LTAzLTIwIDIzOjQ2OjQxWiBaZXNzdHJhICQKKworI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSBwZWRhbnRpYworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorCitpbmhlcml0ICJzdGQvY29udGFpbmVyL2l0ZW1zIjsKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlX3N1cGVyKCkgeworICBzZXRfbmV4dF9yZXNldCgtMSk7Cit9CisKK3ZvaWQgcmVzZXQoKSAKK3sKKyAgOjpyZXNldCgpOworCisgIG9iamVjdCAqaW5oID0gYWxsX2ludmVudG9yeSh0aGlzX29iamVjdCgpKTsKKyAgaWYgKCAhcG9pbnRlcnAoaW5oKSB8fCBzaXplb2YoaW5oKSA8IDEwICkKKyAgICByZXR1cm47CisgIC8vIG51ciB3ZW5uIGtlaW5lIFNwaWVsZXIgYW53ZXNlbmQgc2luZC4KKyAgaWYgKCAhc2l6ZW9mKGluaCAmIHVzZXJzKCkpICkKKyAgICByZW1vdmVfbXVsdGlwbGUoMyk7Cit9CisKKy8vIFBlciBEZWZhdWx0IG51ciBhbiBhbGxlIEl0ZW1zIGltIEludmVudGFyIHdlaXRlcmxlaXRlbi4KK3B1YmxpYyB2YXJhcmdzIGludCBSZWNlaXZlTXNnKHN0cmluZyBtc2csIGludCBtc2dfdHlwZSwgc3RyaW5nIG1zZ19hY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbXNnX3ByZWZpeCwgb2JqZWN0IG9yaWdpbikKK3sKKyAgaW50ICpyZXMgPSBhbGxfaW52ZW50b3J5KCktPlJlY2VpdmVNc2cobXNnLCBtc2dfdHlwZSwgbXNnX2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luIHx8IHByZXZpb3VzX29iamVjdCgpKTsKKyAgaWYgKHNpemVvZihyZXMpKQorICAgIHJldHVybiBtaW4ocmVzKTsKKyAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL3N0ZC9yb29tL2tyYWV1dGVyLmMgYi9zdGQvcm9vbS9rcmFldXRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZjUxOTMKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcm9vbS9rcmFldXRlci5jCkBAIC0wLDAgKzEsMjQwIEBACisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPHRoaW5nL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx0aGluZy9sYW5ndWFnZS5oPgorI2luY2x1ZGUgPHRoaW5nL2Rlc2NyaXB0aW9uLmg+CisjaW5jbHVkZSA8dGhpbmcvY29tbWFuZHMuaD4KKyN1bmRlZiBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDxpdGVtcy9rcmFldXRlci9rcmFldXRlci5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxsaXZpbmcvY29tYmF0Lmg+IC8vIEZ1ZXIgUF9GUkVFX0hBTkRTCisKKy8vIFN0YW5kYXJkd2VydCB2b24gMiBoIGZ1ZXIgdm9sbHN0YWVuZGlnZSBSZWdlbmVyYXRpb24gZGVzIEtyYXV0ZXMuIAorLy8gRWluZmFjaGVzIE5hY2h3YWNoc2VuIGlzdCB0eXBpc2NoZXJ3ZWlzZSBkaWUgSGFlbGZ0ZSBkYXZvbi4KKyNkZWZpbmUgU1REX1dBQ0hTVFVNICA3MjAwCisjZGVmaW5lIEJTKHgpICAgICAgICAgYnJlYWtfc3RyaW5nKHgsIDc4KQorCisvLyBTdHJ1a3R1ciAoNiBFaW50cmFlZ2UgcHJvIEtyYXV0KToKKy8vIChbIGZpbGVuYW1lIDogKHsgWmVpdF9iaXNfbmFjaGdld2FjaHNlbiwgWmVpdF9iaXNfa29tcGxldHRfcmVnZW5lcmllcnQsCisvLyAgICAgICAgICAgICAgICAgIEtyYXV0LUlEcywgS3JhdXQtQWRqZWt0aXZlLCBLcmF1dC0+TmFtZShXRVIsMSksCisvLyAgICAgICAgICAgICAgICAgIElEX2Rlc19CZXdhY2hlci1OUENzIH0pIF0pCittYXBwaW5nIHBsYW50TWFwID0gKFtdKTsKKworLy8ga2FubiBiZW51dHp0IHdlcmRlbiB1bSBzY2huZWxsIHVuZCBlaW5mYWNoIGVpbmUgUGZsYW56ZSBpbiBlaW5lbSBSYXVtCisvLyBoaW56dXp1ZnVlZ2VuLiBCZWlzcGllbDogQWRkUGxhbnQoQkFFUkVOS0xBVSk7CisvLyBEaWVzZSBGdW5rdGlvbiBlcnpldWd0IGF1dG9tYXRpc2NoIGVpbiBBZGRDbWQoKSBmdWVyIGRhcyBQZmx1ZWNrZW4gdW5kCisvLyAoZmFsbHMgbm9jaCBuaWNodCB2b3JoYW5kZW4pIERldGFpbHMgZnVlciBkaWUgUGZsYW56ZS4KKy8vIFJ1ZWNrZ2FiZXdlcnRlOgorLy8gMSAtPiBFcmZvbGc7IC0xIC0+IGZpbGVuYW1lIHVuZ3VlbHRpZwordmFyYXJncyBpbnQgQWRkUGxhbnQoc3RyaW5nIGZpbGVuYW1lLCBzdHJpbmd8c3RyaW5nKiBucGNJZCkKK3sKKyAgbWl4ZWQgYXJyOworCisgIC8vIERhdGVpbmFtZSBuaWNodCB1ZWJlcmdlYmVuPyBEYW5uIHR1biB3aXIgZXJzdG1hbCBnYXIgbml4LgorICBpZiAoIXN0cmluZ3AoZmlsZW5hbWUpKSAKKyAgICByZXR1cm4gLTE7CisgIG9iamVjdCBvYj1sb2FkX29iamVjdChmaWxlbmFtZSk7CisgICAKKyAgLy8gV2VubiB3aXIgenUgZGVtIEtyYXV0IHNjaG9uIERhdGVuIGhhYmVuIChlcmtlbm5iYXIgYW4gPjIgRWludHJhZWdlbiksCisgIC8vIHdlcmZlbiB3aXIgZWluZW4gRmVobGVyLCBkYW1pdCBkYXMgYmVpbSBMYWRlbiBkZXMgUmF1bWVzIHNjaG9uCisgIC8vIGVya2FubnQgd2lyZC4KKyAgaWYgKHBvaW50ZXJwKGFycj1wbGFudE1hcFtmaWxlbmFtZV0pICYmIHNpemVvZihhcnIpPjIpCisgICAgcmFpc2VfZXJyb3IoIkFkZFBsYW50KCk6ICIrZmlsZW5hbWUrIiBhbHJlYWR5IGV4aXN0cy5cbiIpOworCisgIC8vIElEcyB1bmQgQWRqZWt0aXZlIHBhcnNlbiB1bmQgZGVuIERhdGVuc2F0eiB6dXNhbW1lbnN0ZWxsZW4KKyAgc3RyaW5nICppZHMgPSBvYi0+UXVlcnkoUF9JRFMsIEZfVkFMVUUpLSh7ICJEaW5nIiB9KTsKKyAgc3RyaW5nICphZGogPSBvYi0+UXVlcnkoUF9BREpFQ1RJVkVTLCBGX1ZBTFVFKTsKKyAgCisgIGlmICghcG9pbnRlcnAoYXJyKSB8fCBzaXplb2YoYXJyKTwyKSAKKyAgICBhcnIgPSAoezAsMH0pOworICBpZiAoICFucGNJZCApCisgICAgbnBjSWQgPSAoe30pOworICBlbHNlIGlmIChzdHJpbmdwKG5wY0lkKSkKKyAgICBucGNJZCA9ICh7bnBjSWR9KTsKKyAgcGxhbnRNYXBbZmlsZW5hbWVdPSh7YXJyWzBdLCBhcnJbMV0sIGlkcywgYWRqLCBvYi0+TmFtZShXRVIsIDEpLCBucGNJZCB9KTsKKyAgIAorICAvLyBEZXRhaWxzIGVyemV1Z2VuIGF1cyBBZGpla3RpdmVuIHVuZCBJRHMKKyAgYWRqID0gb2ItPlF1ZXJ5UHJvcChQX05BTUVfQURKKTsKKyAgCisgIC8vIGFrdHVlbGxlcyBHZXNjaGxlY2h0IHp3aXNjaGVuc3BlaWNoZXJuLCB3aXJkIHNwYWV0ZXIgd2llZGVyaGVyZ2VzdGVsbHQKKyAgaW50IGdlbmRlciA9IFF1ZXJ5KFBfR0VOREVSLCBGX1ZBTFVFKTsKKyAgU2V0KFBfR0VOREVSLCBvYi0+UXVlcnkoUF9HRU5ERVIsIEZfVkFMVUUpLCBGX1ZBTFVFKTsKKyAgCisgIC8vIGVyemV1Z3QgZnVlciBqZWRlIG1vZWdsaWNoZSBLb21iaW5hdGlvbiBhdXMgQWRqZWt0aXYgaW0gQWtrdXNhdGl2CisgIC8vIHVuZCBJRCBkZXMgS3JhdXRlcyBlaW4gRGV0YWlsLgorICBhZGogPSBtYXAoYWRqLCAjJ0RlY2xBZGosIFdFTiwgMCk7CisKKyAgc3RyaW5nICpkZXQ9KHt9KTsKKyAgZm9yZWFjaChzdHJpbmcgX2lkIDogaWRzKSB7CisgICAgZm9yZWFjaChzdHJpbmcgX2FkaiA6IGFkaikgeworICAgICAgZGV0ICs9ICh7IF9hZGogKyBfaWQgfSk7CisgICAgfQorICB9CisKKyAgZGV0ICs9IGlkczsKKyAgLy8ga2VpbmUgZXhpc3RpZXJlbmRlbiBEZXRhaWxzIHVlYmVyc2NocmVpYmVuCisgIGRldCAtPSBtX2luZGljZXMoUXVlcnkoUF9ERVRBSUxTLCBGX1ZBTFVFKSB8fCAoW10pKTsKKyAgaWYgKHNpemVvZihkZXQpKSAKKyAgICBBZGREZXRhaWwoZGV0LCBvYi0+UXVlcnkoUExBTlRfUk9PTURFVEFJTCwgRl9WQUxVRSkpOworICAKKyAgLy8gRWluZSBCZWZlaGxzZnVua3Rpb24gYnJhdWNoZW4gd2lyIG5hdHVlcmxpY2ggYXVjaC4KKyAgQWRkQ21kKCh7InBmbHVlY2siLCAicGZsdWVja2UiLCAiZXJudGUifSksICJfcGZsdWVja2VuIik7CisgIAorICByZXR1cm4gMTsKK30KKworLy8gV2VubiBqZW1hbmQgcGVyIEhhbmQgZGFzIFBsYW50ZGV0YWlsIGhpbnp1ZnVlZ2VuIG1vZWNodGUuLi4KKy8vIHouQi4gYmVpIFZlcndlbmR1bmcgdm9uIEdldFBsYW50KCkgYW5zdGVsbGUgdm9uIEFkZFBsYW50KCkKK3ZvaWQgQWRkUGxhbnREZXRhaWwoc3RyaW5nIGZpbGVuYW1lKQoreworICAvLyBQZmFkIGluIE9iamVrdHBvaW50ZXIgd2FuZGVsbgorICBvYmplY3Qgb2I9bG9hZF9vYmplY3QoZmlsZW5hbWUpOworICAgCisgIC8vIERldGFpbHMgZXJ6ZXVnZW4KKyAgc3RyaW5nICpkZXQgPSAoe30pOworICBzdHJpbmcgKmlkcyA9IG9iLT5RdWVyeShQX0lEUywgRl9WQUxVRSktKHsgIkRpbmciIH0pOworICBzdHJpbmcgKmFkaiA9IG9iLT5RdWVyeVByb3AoUF9OQU1FX0FESik7CisgIC8vIGFrdHVlbGxlcyBHZXNjaGxlY2h0IHp3aXNjaGVuc3BlaWNoZXJuLCB3aXJkIHNwYWV0ZXIgd2llZGVyaGVyZ2VzdGVsbHQKKyAgaW50IGdlbmRlcj1RdWVyeShQX0dFTkRFUiwgRl9WQUxVRSk7CisgIFNldChQX0dFTkRFUiwgb2ItPlF1ZXJ5KFBfR0VOREVSLCBGX1ZBTFVFKSk7CisgIC8vIGVyemV1Z3QgZnVlciBqZWRlIG1vZWdsaWNoZSBLb21iaW5hdGlvbiBhdXMgQWRqZWt0aXYgaW0gQWtrdXNhdGl2CisgIC8vIHVuZCBJRCBkZXMgS3JhdXRlcyBlaW4gRGV0YWlsLgorICBhZGogPSBtYXAoYWRqLCAjJ0RlY2xBZGosIFdFTiwgMCk7CisgIGZvcmVhY2goc3RyaW5nIF9pZCA6IGlkcykgeworICAgIGZvcmVhY2goc3RyaW5nIF9hZGogOiBhZGopIHsKKyAgICAgIGRldCArPSAoeyBfYWRqICsgX2lkIH0pOworICAgIH0KKyAgfQorICBBZGREZXRhaWwoZGV0K2lkcywgb2ItPlF1ZXJ5KFBMQU5UX1JPT01ERVRBSUwsIEZfVkFMVUUpKTsKKyAgLy8gR2VzY2hsZWNodCB6dXJ1ZWNrc2V0emVuCisgIFNldChQX0dFTkRFUiwgZ2VuZGVyLCBGX1ZBTFVFKTsKK30KKworLy8gUHJ1ZWZ0LCBvYiBkaWUgUGZsYW56ZSB6dSAiZmlsZW5hbWUiIGluIGRpZXNlbSBSYXVtIHNjaG9uIG5hY2hnZXdhY2hzZW4KKy8vIGlzdC4KK3Byb3RlY3RlZCBpbnQgQ2hlY2tQbGFudChzdHJpbmcgZmlsZW5hbWUpCit7CisgIG1peGVkIGFycj1wbGFudE1hcFtmaWxlbmFtZV07CisgIGlmICghcG9pbnRlcnAoYXJyKSB8fCBzaXplb2YoYXJyKTwyKSB7CisgICAgYXJyPXBsYW50TWFwW2ZpbGVuYW1lXT0oeyAwLCAwIH0pOworICB9CisgIC8vIFNvbGFuZ2UgZGllIFplaXQgYXJyWzBdIG5vY2ggbmljaHQgZXJyZWljaHQgaXN0LCBpc3QgZGFzIEtyYXV0IG5pY2h0IAorICAvLyBuYWNoZ2V3YWNoc2VuLCBkYW5uIGdpYnQgZXMgZ2FyIG5peC4KKyAgcmV0dXJuICh0aW1lKCk+YXJyWzBdKTsKK30KKworLy8gTW9lY2h0ZSBtYW4gQWRkUGxhbnQoKSBuaWNodCBiZW51dHplbiwgd2VpbCBtYW4gZGllIFBmbGFuemUgbmljaHQgZWluZmFjaAorLy8gcGZsdWVja2VuLCBzb25kZXJuIHZpZWxsZWljaHQgYWJzY2huZWlkZW4sIG9kZXIgYXVzZ3JhYmVuIHNvbGwsIHNvIGthbm4KKy8vIG1hbiBzaWNoIG1pdHRlbHMgR2V0UGxhbnQoZmlsZW5hbWUpIGRhcyBPYmpla3QgZXJ6ZXVnZW4gbGFzc2VuLiBHaWJ0CisvLyBHZXRQbGFudCgpIDAgenVydWVjaywgaXN0IGRpZSBQZmxhbnplIG5vY2ggbmljaHQgd2llZGVyIHdlaXQgZ2VudWcKKy8vIG5hY2hnZXdhY2hzZW4uCitvYmplY3QgR2V0UGxhbnQoc3RyaW5nIGZpbGVuYW1lKQoreworICBpbnQgKmFycj1wbGFudE1hcFtmaWxlbmFtZV07CisgIGlmICghcG9pbnRlcnAoYXJyKSB8fCBzaXplb2YoYXJyKTwyKQorICB7CisgICAgIGFycj1wbGFudE1hcFtmaWxlbmFtZV09KHsgMCwgMCB9KTsKKyAgfQorICAvLyBhcnJbMF0gZW50aGFlbHQgZGVuIFplaXRwdW5rdCwgd2FubiBkYXMgS3JhdXQgbmFjaGdld2FjaHNlbiBpc3QsCisgIGludCBuYWNoZ2V3YWNoc2VuID0gYXJyWzBdOworICAvLyBhcnJbMV0gZGVuamVuaWdlbiwgd2FubiBlcyB2b2xsc3RhZW5kaWcgcmVnZW5lcmllcnQgaXN0LgorICBpbnQgcmVnZW5lcmllcnQgPSBhcnJbMV07CisKKyAgLy8gVm9yIGRlbSBOYWNoZ2V3YWNoc2VuLVplaXRwdW5rdCBrYW5uIG1hbiBnYXIgbml4IGVybnRlbi4KKyAgaWYgKHRpbWUoKTxuYWNoZ2V3YWNoc2VuKSByZXR1cm4gMDsgLy8gbm9jaCBuaWNodCBuYWNoZ2V3YWNoc2VuCisKKyAgLy8gUmVzdHplaXQgYmlzIHp1ciB2b2xsc3RhZW5kaWdlbiBSZWdlbmVyYXRpb24uCisgIHJlZ2VuZXJpZXJ0LT10aW1lKCk7CisgIAorICAvLyBXZW5uIHZvbGxzdGFlbmRpZyByZWdlbmVyaWVydCwgaXN0IFNURF9XQUNIU1RVTSBkaWUgbmV1ZSBaZWl0IGJpcyB6dXIKKyAgLy8gUmVnZW5lcmF0aW9uLiBXZW5uIG5vY2ggbmljaHQgdm9sbHN0YWVuZGlnIHJlZ2VucmllcnQsIFJlc3R6ZWl0CisgIC8vIHZlcmRvcHBlbG4gdW5kIFNURF9XQUNIU1RVTSBub2NobWFsIGRyYXVmIGFkZGllcmVuLgorICByZWdlbmVyaWVydCA9IChyZWdlbmVyaWVydDw9MCA/IFNURF9XQUNIU1RVTSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAocmVnZW5lcmllcnQqMikrU1REX1dBQ0hTVFVNKTsKKyAgLy8gbmFjaGdld2FjaHNlbiBpc3QgZGllIGhhbGJlIFJlZ2VuZXJhdGlvbnN6ZWl0CisgIGFyclswXT1uYWNoZ2V3YWNoc2VuPXRpbWUoKSsocmVnZW5lcmllcnQvMik7CisgIC8vIFplaXQgdm9lbGxpZ2VyIFJlZ2VuZXJhdGlvbgorICBhcnJbMV09cmVnZW5lcmllcnQrPXRpbWUoKTsKKyAgCisgIHJldHVybiBjbG9uZV9vYmplY3QoZmlsZW5hbWUpOworfQorCitzdGF0aWMgaW50IF9wZmx1ZWNrZW4oc3RyaW5nIHN0cikKK3sKKyAgaW50IHJlczsKKworICBpZiAoIW1hcHBpbmdwKHBsYW50TWFwKSkgcmV0dXJuIDA7CisgIF9ub3RpZnlfZmFpbCgiV0FTIG1vZWNodGVzdCBEdSBwZmx1ZWNrZW4/XG4iKTsKKworICAvLyBJRHMgdW5kIEFkamVrdGl2ZSB6d2lzY2hlbnNwZWljaGVybgorICBtaXhlZCBpZHMgPSBRdWVyeShQX0lEUywgRl9WQUxVRSk7CisgIG1peGVkIGFkaiA9IFF1ZXJ5KFBfQURKRUNUSVZFUywgRl9WQUxVRSk7CisKKyAgZm9yZWFjaChzdHJpbmcga2V5LCBtaXhlZCBrcmF1dGluZm8gOiBwbGFudE1hcCkgCisgIHsKKyAgICBpZiAoIHNpemVvZihrcmF1dGluZm8pICE9IDYgKQorICAgICAgY29udGludWU7CisgCisgICAgLy8gSURzIHVuZCBBZGpla3RpdmUgZGVzIEtyYXV0ZXMga29waWVyZW4gCisgICAgU2V0KFBfSURTLCBrcmF1dGluZm9bMl0sIEZfVkFMVUUpOworICAgIFNldChQX0FESkVDVElWRVMsIGtyYXV0aW5mb1szXSwgRl9WQUxVRSk7CisKKyAgICAvLyBTeW50YXhwcnVlZnVuZyB3aXJkIGRhbm4gbWl0IGlkKCkgZ2VtYWNodC4KKyAgICBpZiAoaWQoc3RyKSkgCisgICAgeworICAgICAgb2JqZWN0IG9iOworICAgICAgb2JqZWN0IGJld2FjaGVyOworICAgICAgcmVzPTE7CisKKyAgICAgIC8vIExpc3RlIGRlciBlaW5nZXRyYWdlbmVuIEJld2FjaGVyLUlEcyBkdXJjaGxhdWZlbiB1bmQgcHJ1ZWZlbiwgb2IKKyAgICAgIC8vIG1pbmRlc3RlbnMgZWluZXIgZGF2b24gYW53ZXNlbmQgaXN0LgorICAgICAgZm9yZWFjaCggc3RyaW5nIG5wY0lkIDoga3JhdXRpbmZvWzVdICkKKyAgICAgIHsKKyAgICAgICAgYmV3YWNoZXIgPSBwcmVzZW50KG5wY0lkLCBNRSk7CisgICAgICAgIGlmIChvYmplY3RwKGJld2FjaGVyKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKCAhUEwtPlF1ZXJ5UHJvcChQX0ZSRUVfSEFORFMpICkgCisgICAgICB7CisgICAgICAgIHRlbGxfb2JqZWN0KFBMLCBCUygiRHUgaGFzdCBrZWluZSBIYW5kIGZyZWksIHVtIGV0d2FzIHBmbHVlY2tlbiAiCisgICAgICAgICAgInp1IGtvZW5uZW4uIikpOworICAgICAgfQorICAgICAgLy8gSXN0IGRlciBCZXdhY2hlciBhbndlc2VuZD8gRGFubiBrYW5uIG1hbiBkYXMgS3JhdXQgbmljaHQgcGZsdWVja2VuLgorICAgICAgZWxzZSBpZiAoIG9iamVjdHAoYmV3YWNoZXIpICkKKyAgICAgIHsKKyAgICAgICAgdGVsbF9vYmplY3QoUEwsIEJTKGJld2FjaGVyLT5OYW1lKFdFUiwgMikrIiBsYWVzc3QgRGljaCAiCisgICAgICAgICAgImxlaWRlciBuaWNodCBuYWggZ2VudWcgaGVyYW4uIElyZ2VuZHdpZSBtdXNzdCBEdSBEaWNoIHdvaGwgIgorICAgICAgICAgICJ6dW5hZWNoc3QgdW0gIitiZXdhY2hlci0+UXVlcnlQcm9ub3VuKFdFTikrIiBrdWVtbWVybi4iKSk7CisgICAgICB9CisgICAgICAvLyBXZW5uIEdldFBsYW50KCkgZWluIE9iamVrdCBsaWVmZXJ0LCBrYW5uIHdhcyBnZXBmbHVlY2t0IHdlcmRlbi4KKyAgICAgIGVsc2UgaWYgKCBvYmplY3RwKG9iPUdldFBsYW50KGtleSkpICkgCisgICAgICB7CisgICAgICAgIGlmICggb2ItPm1vdmUoUEwsIE1fR0VUKSA9PSBNT1ZFX09LICkKKyAgICAgICAgeworICAgICAgICAgIHdyaXRlKEJTKCJWb3JzaWNodGlnIHBmbHVlY2tzdCBEdSAiK29iLT5uYW1lKFdFTiwgMSkrCisgICAgICAgICAgICAiIHVuZCBuaW1tc3QgIitvYi0+UXVlcnlQcm9ub3VuKFdFTikrIiBhbiBEaWNoLiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIAorICAgICAgICB7CisgICAgICAgICAgd3JpdGUoQlMoIlZvcnNpY2h0aWcgcGZsdWVja3N0IER1ICIrb2ItPm5hbWUoV0VOLCAxKSsiLCBrYW5uc3QgIisKKyAgICAgICAgICAgIG9iLT5RdWVyeVByb25vdW4oV0VOKSsiIGFiZXIgbmljaHQgbmVobWVuLiIpKTsKKyAgICAgICAgICBvYi0+bW92ZShlbnZpcm9ubWVudChQTCksIE1fR0VUKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLy8gV2VubiBhbGxlcyBuaWNodCwgZGFubiBpc3QgZGFzIEtyYXV0IG5vY2ggbmljaHQgd2llZGVyIGRhLgorICAgICAgZWxzZSAKKyAgICAgIHsKKyAgICAgICAgd3JpdGUoQlMoa3JhdXRpbmZvWzRdKyIgaXN0IG5vY2ggbmljaHQgcmVpZiBnZW51ZyAiCisgICAgICAgICAgKyJ1bmQgbXVzcyBlcnN0IG5vY2ggZXR3YXMgd2FjaHNlbi4iKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICAgLy8gSURzIHVuZCBBZGpla3RpdmUgenVydWVja3NldHplbi4KKyAgU2V0KFBfSURTLCBpZHMsIEZfVkFMVUUpOworICBTZXQoUF9BREpFQ1RJVkVTLCBhZGosIEZfVkFMVUUpOworCisgIHJldHVybiByZXM7Cit9CisKZGlmZiAtLWdpdCBhL3N0ZC9yb29tL2tyYWV1dGVybGFkZW4uYyBiL3N0ZC9yb29tL2tyYWV1dGVybGFkZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjk5NzkzCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3Jvb20va3JhZXV0ZXJsYWRlbi5jCkBAIC0wLDAgKzEsMTY3IEBACisvLyAoYykgMjAwMyBieSBQYWRyZWljIChwYWRyZWljQG1nLm11ZC5kZSkKKy8vIAorLy8gRXMga2FubiBiZXN0aW1tdGUgTGFlZGVuIHp1bSBIYW5kZWxuIHZvbiBLcmFldXRlcm4gZ2ViZW4uCisvLyBadW5hZWNoc3QgZWlubWFsIGdpYnQgZXMgZWluZW4gaW4gZGVyIER1bmtlbGVsZmVuZ2lsZGUuCisvLyBIaWVyIGtvZW5uZW4gS3JhZXV0ZXIgZ2UtIHVuZCB2ZXJrYXVmdCB3ZXJkZW4uCisvLyBHcnVuZHNhZXR6bGljaCBrYW5uIGVzIGJlbGllYmlnIHZpZWxlIGtyYWV1dGVya3VuZGlnZQorLy8gSGFlbmRsZXIgZ2ViZW4sIGVpbmUga3VyemUgQWJzcHJhY2hlIHdhZXJlIGplZG9jaCB2b24gVm9ydGVpbC4KKworLy8gRGVyIExhZGVuIGVyd2VpdGVydCBkaWUgcm9vbS9zaG9wIEZ1bmt0aW9uZW4uCisvLyBadXIgVmVyd2VuZHVuZyBtdXNzIGRpZXNlciBub2NoIG1pdCBlaW5lbSBzdGQvcm9vbSBrb21iaW5pZXJ0CisvLyB3ZXJkZW4uIERpZXMgZXJsYXVidCBkaWUgVmVyd2VuZHVuZyB2b24gZWlnZW5lbiBTdGFuZGFyZHJhZXVtZW4gb2RlcgorLy8gS29tYmluYXRpb24gbWl0IEtuZWlwZW4uCisKK2luaGVyaXQgIi9zdGQvcm9vbS9zaG9wIjsKKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKworI2luY2x1ZGUgPGl0ZW1zL2tyYWV1dGVyL2tyYWV1dGVyLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCisvLyBGbGFnLCBkYXMgaW0gcmVzZXQoKSBkYXMgU3BlaWNoZXJuIGF1c2xvZXN0LCB3ZW5uIGVzIGdlc2V0enQgaXN0Lgorc3RhdGljICBpbnQgbmVlZF9zYXZlOyAgCitzdGF0aWMgIGludCBiYXNpc3ZhbHVlPTQwMDsgLy8gZ2lidCBkZW4gX0R1cmNoc2Nobml0dHN3ZXJ0XyBlaW5lcyBLcmF1dHMgYW4KK3N0YXRpYyAgaW50IG1heHZhbHVlPTEwMDAwOyAvLyBiZXN0aW1tdCBkZW4gbWF4LiBXZXJ0IGFsbGVyIEtyYWV1dGVyCisKKy8vIEVudGhhZWx0IGZ1ZXIgamVkZSBQbGFudElEIGVpbmVuIFphZWhsZXIsIGRlciBhbmdpYnQsIHdpZXZpZWwgdm9uIGRlbQorLy8gamV3ZWlsaWdlbiBLcmF1dCB2ZXJrYXVmdCB3dXJkZS4KKy8vIHByaXZhdGUgaW50ICpjb3VudD0oe30pOworCisvLyBTdW1tZSB1ZWJlciBhbGxlIEVpbnRyYWVnZSBpbiBjb3VudAorLy8gcHJpdmF0ZSBpbnQgc3VtOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICBpZiAob2JqZWN0X25hbWUodGhpc19vYmplY3QoKSkgPT0gX19GSUxFX19bMC4uPDNdKQorICB7CisgICAgc2V0X25leHRfcmVzZXQoLTEpOworICAgIHJldHVybjsKKyAgfQorICA6OmNyZWF0ZSgpOworCisgIFNldFByb3AoUF9CVVlfT05MWV9QTEFOVFMsMSk7CisgIC8qCisgIHNldGV1aWQoZ2V0dWlkKCkpOyAvLyB3aXJkIHp1bSBzcGVpY2hlcm4gYmVu9nRpZ3QKKyAgaW50IHNpPXNpemVvZihjb3VudCk7CisgIC8vIGZ1ZXIgamVkZSBQbGFudElEIGVpbmVuIEVpbnRyYWcgYW5sZWdlbiwgZC5oLiB3ZW5uIGluIGNvdW50IG5vY2gKKyAgLy8gbmljaHQgZ2VudWcgdm9yaGFuZGVuIHNpbmQsIHdlcmRlbiBmZWhsZW5kZSBFaW50cmFlZ2UgZXJnYWVuenQuCisgIGlmIChzaTxQTEFOVENPVU5UKSAKKyAgICBjb3VudD1jb3VudCthbGxvY2F0ZShQTEFOVENPVU5ULXNpKTsKKyAgKi8KK30KKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlX3N1cGVyKCkKK3sKKyAgc2V0X25leHRfcmVzZXQoLTEpOworfQorCitzdGF0aWMgc3RyaW5nIHNlbGxfb2JqX29ubHlfcGxhbnRzKG9iamVjdCBvYiwgaW50IHNob3J0KQoreworICAgaWYgKCFJU19QTEFOVChvYikpCisgICAgICByZXR1cm4gIlR1dCBtaXIgbGVpZCwgZGFtaXQga2FubiBpY2ggbmljaHRzIGFuZmFuZ2VuLiI7CisgICAvLyBlcyB3ZXJkZW4gbnVyIEtyYWV1dGVyIGFuZ2VrYXVmdCwgZGllIGxlZ2FsIGdlY2xvbnQgd3VyZGVuLAorICAgLy8gZC5oLiBpbSBlbnRzcHJlY2hlbmRlbiBNYXN0ZXIgb3JkZW50bGljaCBlaW5nZXRyYWdlbiB3dXJkZW4hCisgICBpZiAob2ItPlF1ZXJ5UGxhbnRJZCgpPD0wKQorICAgICAgcmV0dXJuIG9iLT5OYW1lKFdFUiwgMikrIiBpc3QgaWxsZWdhbCBhdWYgZGllIFdlbHQgZ2Vrb21tZW4uIEljaCBkYXJmICIKKyAgICAgICAgICAgICtvYi0+UXVlcnlQcm9ub3VuKFdFTikrIiBsZWlkZXIgbmljaHQgYW5uZWhtZW4uIjsKKyAgIHJldHVybiA6OnNlbGxfb2JqKG9iLCBzaG9ydCk7Cit9CisKK3N0YXRpYyBzdHJpbmcgc2VsbF9vYmoob2JqZWN0IG9iLCBpbnQgc2hvcnQpCit7CisgICAvLyBlcyB3ZXJkZW4gbnVyIEtyYWV1dGVyIGFuZ2VrYXVmdCwgZGllIGxlZ2FsIGdlY2xvbnQgd3VyZGVuLAorICAgLy8gZC5oLiBpbSBlbnRzcHJlY2hlbmRlbiBNYXN0ZXIgb3JkZW50bGljaCBlaW5nZXRyYWdlbiB3dXJkZW4hCisgIGlmIChJU19QTEFOVChvYikgJiYgb2ItPlF1ZXJ5UGxhbnRJZCgpPD0wKQorICAgIHJldHVybiAiSG0sICIrb2ItPk5hbWUoV0VSLCAyKSsiIHN0YW1tdCBhYmVyIGF1cyBlaW5lciBzZWhyIGR1Ymlvc2VuICIKKyAgICAgICJRdWVsbGUuIEljaCBrYW5uICIrb2ItPlF1ZXJ5UHJvbm91bihXRU4pKyIgbGVpZGVyIG5pY2h0IGFubmVobWVuLiI7CisgIGlmIChRdWVyeVByb3AoUF9CVVlfT05MWV9QTEFOVFMpKQorICAgIHJldHVybiBzZWxsX29ial9vbmx5X3BsYW50cyhvYiwgc2hvcnQpOworICByZXR1cm4gOjpzZWxsX29iaihvYixzaG9ydCk7Cit9CisKKy8qCit2b2lkIHJlc2V0KCkKK3sKKyAgOjpyZXNldCgpOworICAvLyBEYXRlbiBzaW5kIG5pY2h0IHNvb28gd2ljaHRpZywgYWxzIGRhcyBiZWkgamVkZXIgQWVuZGVydW5nCisgIC8vIGdlc2F2ZXQgd2VyZGVuIG11ZXNzdGUuIERhaGVyIG51biBpbSByZXNldCBzcGVpY2hlcm4uCisgIGlmIChuZWVkX3NhdmUpIHsKKyAgICAvLyBiYXNpc3ZhbHVlL1BMQU5UQ09VTlQ6IER1cmNoc2Nobml0dHN3ZXJ0IGVpbmVzIGVpbnplbG5lbiBLcmF1dHMKKyAgICAvLyBzdW0gKyBQTEFOVENPVU5UOiBHZXNhbXR6YWhsIHZlcmthdWZ0ZXIgcGx1cyBaYWhsIGV4aXN0aWVyZW5kZXIKKyAgICAvLyAgICAgICAgICAgICAgICAgICBLcmFldXRlcgorICAgIC8vIFdlbm4gYWxzbyBkZXIgV2VydCBhbGwgZGllc2VyIEtyYWV1dGVyID4gMTBrIGlzdCwgd2lyZCBqZWRlcgorICAgIC8vIEVpbnplbHphZWhsZXIgYXVmIDkwJSBnZXN0dXR6dCwgZGFtaXQgZGllIFdlcnRlIG5pY2h0IGlucyBVZmVybG9zZQorICAgIC8vIHN0ZWlnZW4uCisgICAgaWYgKCgoc3VtK1BMQU5UQ09VTlQpKmJhc2lzdmFsdWUvUExBTlRDT1VOVCk+bWF4dmFsdWUpIHsKKyAgICAgIGludCBpLCBuZXdzdW07CisgICAgICBmb3IgKGk9c2l6ZW9mKGNvdW50KS0xOyBpPj0wOyBpLS0pIHsKKyAgICAgICAgY291bnRbaV0gPSBjb3VudFtpXSo5LzEwOworICAgICAgICBuZXdzdW0rPWNvdW50W2ldOworICAgICAgfQorICAgICAgc3VtPW5ld3N1bTsKKyAgICB9CisgICAgbmVlZF9zYXZlPTA7CisgIH0KK30KKworLy8gQWt0dWFsaXNpZXJ0IGRlbiBEYXRlbmJlc3RhbmQgYmVpbSBLYXVmZW4gb2RlciBWZXJrYXVmZW4gZWluZXMgT2JqZWt0cwordm9pZCBVcGRhdGVDb3VudGVyKG9iamVjdCBvYiwgaW50IG51bSkKK3sKKyAgIGludCBpZD1vYi0+UXVlcnlQbGFudElkKCk7CisgICBpZiAoaWQ+MCAmJiBpc19wbGFudChvYikpIHsKKyAgICAgIC8vIEthdWYgb2RlciBWZXJrYXVmIHZvbiBLcmFldXRlcm4sIHZlcmFlbmRlcnQgZGVuIFdlcnQgZGVyCisgICAgICAvLyBLcmFldXRlcgorICAgICAgLy8gWmFlaGxlciBpbiBkZXIgTGlzdGUgaG9jaHphZWhsZW4KKyAgICAgIGNvdW50W2lkXSs9bnVtOworICAgICAgaWYgKGNvdW50W2lkXTwwKSBjb3VudFtpZF09MDsgLy8gZGFyZiBhYmVyIGFuc2ljaCBuaWNoIHBhc3NpZXJlbgorICAgICAgLy8gR2VzYW10c3VtbWUgYWt0dWFsaXNpZXJlbgorICAgICAgc3VtKz1udW07CisgICAgICBuZWVkX3NhdmU9MTsKKyAgIH0KKyAgIDo6VXBkYXRlQ291bnRlcihvYiwgbnVtKTsKK30KKworLy8gRGllIFByZWlzZSBkaWUgaGllciBpbSBMYWJvciBmdWVyIEtyYWV1dGVyIGdlemFobHQgdW5kIHZlcmxhbmd0CisvLyB3ZXJkZW4sIHNpbmQgbmljaHQgZml4IHNvbmRlcm4gaGFlbmdlbiB2b24gQW5nZWJvdCB1bmQgTmFjaGZyYWdlIGFiLgorLy8gSGllciB3ZWlzcyBtYW4gdWViZXIgZGVuIHdhaHJlbiBXZXJ0IGRlciBlaW56ZWxuZW4gS3JhZXV0ZXIgYmVzY2hlaWQuCitzdGF0aWMgaW50IHJlYWxWYWx1ZShvYmplY3Qgb2IsIG9iamVjdCBwbGF5ZXIpCit7CisgICAvLyBQcmVpc2UgZnVlciBub3JtYWxlIEd1ZXRlciBnYW56IG5vcm1hbC4uLgorICAgaWYgKCFpc19wbGFudChvYikpCisgICAgICAgcmV0dXJuIG9iLT5RdWVyeVByb3AoUF9WQUxVRSk7CisKKyAgIC8vIGplZGUgS3JhZXV0ZXJrYXRlZ29yaWUgYmVrb21tdCBkZW4gZ2xlaWNoZW4gV2VydCB6dWdld2llc2VuLiAgIAorICAgLy8gdmFsIGVudHNwcmljaHQgZGVtIGFrdHVlbGxlbiAiRHVyY2hzY2huaXR0c3dlcnQiIGVpbmVzIEtyYXV0ZXMKKyAgIGludCB2YWw9KHN1bStQTEFOVENPVU5UKSpiYXNpc3ZhbHVlL1BMQU5UQ09VTlQ7CisKKyAgIC8vIGFiZXIgZGllc2VyIFdlcnQgdmVydGVpbHQgc2ljaCBhdWYgdW50ZXJzY2hpZWRsaWNoIHZpZWxlIEtyYWV1dGVyCisgICAvLyAoQU46IERpZXNlciBLb21tZW50YXIgZXJzY2hsaWVzc3Qgc2ljaCBtaXIgbmljaHQuKQorICAgaW50IGlkPW9iLT5RdWVyeVBsYW50SWQoKTsKKyAgIGlmIChpZDw9MCkgcmV0dXJuIDA7IC8vIGlsbGVnYWwgZ2VjbG9udCAtPiB3ZXJ0bG9zCisgICAvLyBnZ2YuIGRpZSBaYWVobGVybGlzdGUgdW0gZGllIGZlaGxlbmRlbiBFaW50cmFlZ2UgZXJ3ZWl0ZXJuLgorICAgaWYgKChpZC0xKT5zaXplb2YoY291bnQpKSAKKyAgICAgY291bnQ9Y291bnQrYWxsb2NhdGUoaWQtMS1zaXplb2YoY291bnQpKTsKKyAgIAorICAgLy8gIm1pdHRsZXJlbiBXZXJ0IiBkZXMgYWJnZWZyYWd0ZW4gS3JhdXRlcyBlcnJlY2huZW4gKERpdmlzaW9uIGR1cmNoCisgICAvLyBkZXNzZW4gdW1nZXNldHp0ZSBBbnphaGwpCisgICB2YWw9dmFsLyhjb3VudFtpZF0rMSk7CisgICAKKyAgIC8vIFdlcnQgcnVuZGVuIGF1ZiBuYWVjaHN0bmllZHJpZ2VyZW4gZ2xhdHQgZHVyY2ggMTAgdGVpbGJhcmVuIFdlcnQuCisgICByZXR1cm4gdmFsLXZhbCUxMDsgCit9CisKKy8vIGdpYnQgZGVuIFByZWlzIHp1cvxjaywgZGVyIHp1bSBBbmthdWYgZGVzIE9iamVrdGVzIHZlcndlbmRldCB3ZXJkZW4gc29sbAorc3RhdGljIHZhcmFyZ3MgaW50IFF1ZXJ5VmFsdWUob2JqZWN0IG9iLCBpbnQgdmFsdWUsIG9iamVjdCBwbGF5ZXIpCit7CisgICByZXR1cm4gOjpRdWVyeVZhbHVlKG9iLCByZWFsVmFsdWUob2IsIHBsYXllciksIHBsYXllcik7Cit9CisKKy8vIGdpYnQgZGVuIFByZWlzIGFuLCB6dSBkZW0gZGFzIE9iamVrdCB2ZXJrYXVmdCB3ZXJkZW4gc29sbC4KK3N0YXRpYyB2YXJhcmdzIGludCBRdWVyeUJ1eVZhbHVlKG1peGVkIG9iLCBvYmplY3QgcGxheWVyKQoreworICAgaWYgKG9iamVjdHAob2IpKQorICAgICAgcmV0dXJuIChyZWFsVmFsdWUob2IsIHBsYXllcikqUXVlcnlCdXlGYWN0KHBsYXllcikgKyA1MCkvMTAwOworICAgLy8gZml4ZWQgT2JqZWt0ZS4uLgorICAgcmV0dXJuIDo6UXVlcnlCdXlWYWx1ZShvYiwgcGxheWVyKTsKK30KKyovCmRpZmYgLS1naXQgYS9zdGQvcm9vbS9saWdodC5jIGIvc3RkL3Jvb20vbGlnaHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzcyMDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkL3Jvb20vbGlnaHQuYwpAQCAtMCwwICsxLDYxIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gY29udGFpbmVyL2xpZ2h0LmMgLS0gTGljaHRzeXN0ZW1rb21wb25lbnRlbiBmdWVyIFJhZXVtZQorLy8KKy8vICRJZDogZGVzY3JpcHRpb24uYyA2OTg2IDIwMDgtMDgtMjIgMjE6MzI6MTVaIFplc3N0cmEgJAorCitpbmhlcml0ICIvc3RkL2NvbnRhaW5lci9saWdodCI7CisKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMscnR0X2NoZWNrcworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPHRoaW5nL3Byb3BlcnRpZXMuaD4KKyN1bmRlZiBORUVEX1BST1RPVFlQRVMKKworI2luY2x1ZGUgPHRoaW5nL2Rlc2NyaXB0aW9uLmg+CisjaW5jbHVkZSA8cm9vbS9kZXNjcmlwdGlvbi5oPgorI2luY2x1ZGUgPGNvbnRhaW5lci5oPgorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfTElHSFRfQUJTT1JQVElPTiwgMSk7Cit9CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZV9zdXBlcigpIHtzZXRfbmV4dF9yZXNldCgtMSk7fQorCisvKgorICAgLy8gZGFzIHdpcmQgc2VsdGVuIGJlbnV0enQgdW5kIGlzdCB6dXIgemVpdCBmdW5rdGlvbnN1bmZhZWhpZywgZGEgZGllCisgICAvLyBpbnRlcm5lIFNwZWljaGVydW5nIGRlciBQcm9wIHNpY2ggZ2VhZW5kZXJ0IGhhdC4KK3N0YXRpYyBpbnQgX3NldF9pbnRfbGlnaHQoaW50ICpsaWdodCkKK3sKKyAgIGludCB0bXA7CisKKyAgIC8vIHp1ciBTaWNoZXJoZWl0CisgICBpZiAoIXBvaW50ZXJwKGxpZ2h0KSkgcmV0dXJuIC0xOworICAgaWYgKGxpZ2h0WzBdPlF1ZXJ5UHJvcChQX0xJR0hUKSkgeworICAgICAgLy8gTGljaHQgdmVybGFldWZ0IHNpY2ggaW4gZWluZW0gZ3Jvc3NlbiBSYXVtLCBkYWhlciBNb2RpZmllciBhYmZyYWdlbi4uLgorICAgICAgdG1wPWxpZ2h0WzBdLVF1ZXJ5UHJvcChQX0xJR0hUX0FCU09SUFRJT04pOworICAgICAgLy8gd2VubiBzaWNoIGRhcyBWb3J6ZWljaGVuIGdlYWVuZGVydCBoYXQsIGF1ZiAwIHNldHplbi4KKyAgICAgIGxpZ2h0WzBdPSgodG1wXmxpZ2h0WzBdKSAmIDB4ODAwMDAwMDAgPyAwIDogdG1wKTsKKyAgIH0KKyAgIGlmIChsaWdodFsxXTxRdWVyeVByb3AoUF9MSUdIVCkgJiYgbGlnaHRbMV08MCkgeworICAgICAgLy8gTGljaHQgdmVybGFldWZ0IHNpY2ggaW4gZWluZW0gZ3Jvc3NlbiBSYXVtLCBkYWhlciBNb2RpZmllciBhYmZyYWdlbi4uLgorICAgICAgdG1wPWxpZ2h0WzFdK1F1ZXJ5UHJvcChQX0xJR0hUX0FCU09SUFRJT04pOworICAgICAgLy8gd2VubiBzaWNoIGRhcyBWb3J6ZWljaGVuIGdlYWVuZGVydCBoYXQsIGF1ZiAwIHNldHplbi4KKyAgICAgIGxpZ2h0WzFdPSgodG1wXmxpZ2h0WzFdKSAmIDB4ODAwMDAwMDAgPyAwIDogdG1wKTsKKyAgIH0KKyAgIGxpZ2h0WzJdPWxpZ2h0WzBdK2xpZ2h0WzFdOworICAgU2V0KFBfSU5UX0xJR0hULCBsaWdodCwgRl9WQUxVRSk7CisgICAvLyBkaWVzZSBQcm9wIHNldHplbiBrYXVtIExldXRlIChvZmZpemllbGwgZ2VodHMgamEgYXVjaCBnYXIgbmljaHQuIEtlaW5lcgorICAgLy8gZGF2b24gZXJ3YXJ0ZXQgbmVuIFJ1ZWNrZ2FiZXdlcnQuIERhaGVyIHdpcmQgaGllciAwIHp1cnVlY2tnZWJlbiwgc3RhdHQKKyAgIC8vIGRlcyBhdWZ3YWVuZGlnIGJlcmVjaG5ldGVuIFF1ZXJ5UHJvcChQX0lOVF9MSUdIVCkuCisgICAvLyBBY2hqYS4gRGVyIFJ1ZWNrZ2FiZXdlcnQgdm9tIFNldCgpIHdhZXJlIGVpbiBpbnQqLCB3YXMgbmljaHQgZ2VodCwgd2VpbAorICAgLy8gZGllc2UgRnVua3Rpb24gbnVyIGludCB6dXJ1ZWNrZ2ViZW4gZGFyZi4KKyAgIHJldHVybiAwOworfQorKi8KZGlmZiAtLWdpdCBhL3N0ZC9yb29tL21vdmluZy5jIGIvc3RkL3Jvb20vbW92aW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY3YzJiMQotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9yb29tL21vdmluZy5jCkBAIC0wLDAgKzEsMTcgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyByb29tL21vdmluZy5jIC0tIEVudGZlcm5lbiB2b24gUmFldW1lbgorLy8KKy8vICRJZDogbW92aW5nLmMgODA0MSAyMDEyLTAzLTE5IDE4OjM4OjIxWiBaZXNzdHJhICQKKworI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSBwZWRhbnRpYworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorCitwdWJsaWMgdmFyYXJncyBpbnQgcmVtb3ZlKGludCBzaWxlbnQpCit7CisgIGRlc3RydWN0KCB0aGlzX29iamVjdCgpICk7CisgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvc3RkL3Jvb20vcGFyYS5jIGIvc3RkL3Jvb20vcGFyYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NjY3ODIKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcm9vbS9wYXJhLmMKQEAgLTAsMCArMSwxOCBAQAorLy8gVGhpcyBtYXkgbG9vayBsaWtlIEMgY29kZSwgYnV0IGl0IGlzIHJlYWxseSAtKi0gQysrIC0qLQorCisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gcm9vbS9wYXJhLmMgLS0gQmV0cmV0ZW4gZWluZXIgUGFyYWxsZWx3ZWx0CisvLworLy8gJElkOiBwYXJhLmMgNzUxMCAyMDEwLTAzLTI1IDIzOjM3OjE5WiBaZXNzdHJhICQKKworLy8gVmVyYWx0ZXQgLSB3aXJkIG5pY2h0IG1laHIgYmVub2V0aWd0LgorLy8gRGllIFp1b3JkbnVuZyBkZXIgJ3JpY2h0aWdlbicgV2VsdCB3aXJkIGpldHp0IGRpcmVrdCB2b24gbW92ZSgpIHVlYmVybm9tbWVuLgorCisjcHJhZ21hIHN0cm9uZ190eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIHBlZGFudGljCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisKK2RlcHJlY2F0ZWQgaW50IHBhcmFtb3ZlKCkgeyByZXR1cm4gMDsgfQpkaWZmIC0tZ2l0IGEvc3RkL3Jvb20vcHViLmMgYi9zdGQvcm9vbS9wdWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTVlMzNlCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3Jvb20vcHViLmMKQEAgLTAsMCArMSw5ODkgQEAKKy8vCisvLyBwdWIuYyAtLSBBbGxlcywgd2FzIGVpbmUgS25laXBlIGJyYXVjaHQuCisvLworLy8gJElkOiBwdWIuYyA4Nzc4IDIwMTQtMDQtMzAgMjM6MDQ6MDZaIFplc3N0cmEgJAorLy8gc3BlbmRpZXJlIHVlYmVyYXJiZWl0ZXQsIDIyLjA1LjIwMDcgLSBNaXJpbAorI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSBwZWRhbnRpYworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorCisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPHRoaW5nL2NvbW1hbmRzLmg+CisjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPgorCisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPHJvb21zLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHJvdXRpbmdkLmg+CisjaW5jbHVkZSA8YmFuay5oPgorI2luY2x1ZGUgPGV4cGxvcmF0aW9uLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8cHViLmg+CisKKy8vIEFsbGUgbmljaHQtcHJpdmF0ZW4gd2VyZGVuIGluIGVyYmVuZW4gT2JqZWt0ZW4gdmVyd2VuZGV0LgorcHJpdmF0ZSBub3NhdmUgaW50ICAgICBtYXhfbGlzdDsKK3ByaXZhdGUgbm9zYXZlIGludCAgICAgcmVmcmVzaF9jb3VudDsKK3ByaXZhdGUgbm9zYXZlIGludCAgICAgc3VtOworcHJpdmF0ZSBub3NhdmUgbWFwcGluZyByZWZyZXNoX2xpc3Q7Citub3NhdmUgbWFwcGluZyBpZF9saXN0Oworbm9zYXZlIG1hcHBpbmcgbWVudV9saXN0Oworbm9zYXZlIG9iamVjdCAgKndhaXRpbmc7CisKKyNkZWZpbmUgUE1fUkFURV9QVUJNQVNURVIgICJyYXRlIgorI2RlZmluZSBQTV9ERUxBWV9QVUJNQVNURVIgImRlbGF5IgorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreyBvYmplY3Qgcm91dGVyOworCisgIFNldFByb3AoIFBfUk9PTV9UWVBFLCBRdWVyeVByb3AoUF9ST09NX1RZUEUpIHwgUlRfUFVCICk7CisKKyAgU2V0UHJvcCggUF9QVUJfTk9UX09OX01FTlUsCisgICAgIlR1dCBtaXIgbGVpZCwgZGFzIGZ1ZWhyZW4gd2lyIG5pY2h0ISBXaXIgc2luZCBlaW4gYW5zdGFlbmRpZ2VzICIrCisgICAgIkxva2FsIVxuIiApOworICBTZXRQcm9wKCBQX1BVQl9VTkFWQUlMQUJMRSwKKyAgICAiRGF2b24gaXN0IGxlaWRlciBuaWNodHMgbWVociBkYS5cbiIgKTsKKyAgU2V0UHJvcChQX1BVQl9OT19NT05FWSwKKyAgICAiRGFzIGtvc3RldCAlZCBHb2xkc3R1ZWNrZSwgdW5kIER1IGhhc3QgbmljaHQgc28gdmllbCFcbiIgKTsKKyAgU2V0UHJvcChQX1BVQl9OT19LRUVQRVIsCisgICAgIkVzIGlzdCBuaWVtYW5kIGFud2VzZW5kLCBkZXIgRGljaCBiZWRpZW5lbiBrb2VubnRlLlxuIik7CisKKyAgQWRkQ21kKCAibWVudWUiLCJtZW51ZSIgKTsKKyAgQWRkQ21kKCAoeyJrYXVmIiwia2F1ZmUiLCJiZXN0ZWxsIiwiYmVzdGVsbGUifSksImJlc3RlbGxlIiApOworICBBZGRDbWQoICh7InNwZW5kaWVyIiwic3BlbmRpZXJlIn0pLCJzcGVuZGllcmUiICk7CisgIEFkZENtZCggInB1YmluaXQiLCJwdWJpbml0IiApOworCisgIG1heF9saXN0PTA7CisgIHJlZnJlc2hfY291bnQ9MDsKKyAgd2FpdGluZyA9ICh7IH0pOworICBpZF9saXN0PShbXSk7CisgIG1lbnVfbGlzdD0oW10pOworICByZWZyZXNoX2xpc3Q9KFtdKTsKKworICBpZiAoICFjbG9uZXAoTUUpICYmIG9iamVjdHAocm91dGVyPWZpbmRfb2JqZWN0KFJPVVRFUikpICkKKyAgICByb3V0ZXItPlJlZ2lzdGVyVGFyZ2V0KFRBUkdFVF9QVUIsb2JqZWN0X25hbWUoTUUpKTsKKworICBjYWxsX291dCgiYWRkX3N0ZF9kcmlua3MiLDEpOworfQorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGVfc3VwZXIoKSB7CisgIHNldF9uZXh0X3Jlc2V0KC0xKTsKK30KKworLyogWnVyIFN5bnRheDoKKyAqCisgKiBtZW51ZXRleHQgLSBEZXIgVGV4dCBzdGVodCBpbSBNZW51ZQorICoKKyAqIGlkcyAgICAgICAtIEFycmF5IGRlciBOYW1lbiwgbWl0IGRlbmVuIGJlc3RlbGx0IHdlcmRlbiBrYW5uCisgKgorICogbWluZm8gICAgIC0gTWFwcGluZyBtaXQgRWludHJhZWdlbiBmdWVyOgorICogICAgICAgICAgICAgICAgIFBfSFAgKEhQLUhlaWx1bmcpLAorICogICAgICAgICAgICAgICAgIFBfU1AgKFNQLUhlaWx1bmcpLAorICogICAgICAgICAgICAgICAgIFBfRk9PRCAoU2FldHRpZ3VuZyksCisgKiAgICAgICAgICAgICAgICAgUF9EUklOSyAoRmx1ZXNzaWdrZWl0KQorICogICAgICAgICAgICAgICAgIFBfQUxDT0hPTCAoQWxrb2hvbGlzaWVydW5nKQorICogICAgICAgICAgICAgICAgIFBfVkFMVUUgKFByZWlzKQorICogICAgICAgICAgICAgRGllIEVpbnRyYWVnZSB3ZXJkZW4gdWViZXIgZXZhbF9hbnl0aGluZyBhdXNnZXdlcnRldAorICogICAgICAgICAgICAgKHNpZWhlIGRhKQorICoKKyAqIHJhdGUgICAgICAtIEhlaWxyYXRlIChhdWNoIHVlYmVyIGVhdmxfYW55dGhpbmcpIGluIFB1bmt0ZSAvIGhlYXJ0X2JlYXQoKQorICoKKyAqIG1zZyAgICAgICAtIE1lbGR1bmcgYmVpbSBFc3Nlbi4KKyAqICAgICAgICAgICAgIGEpIGNsb3N1cmUgKHdpcmQgbWl0IGZ1bmNhbGwobXNnLHphaGxlcixlbXBmYWVuZ2VyKQorICogICAgICAgICAgICAgICAgYXVzZ2V3ZXJ0ZXQpCisgKiAgICAgICAgICAgICBiKSBzdHJpbmcgKHdpZSBjbG9zdXJlOiBjYWxsX290aGVyKHRoaXNfb2JqZWN0Li4uKSkKKyAqICAgICAgICAgICAgIGMpIGFycmF5IG1pdCAyIHN0cmluZ3M6IDEpIGZ1ZXIgRXNzZW5kZW4sIDIpIGZ1ZXIgYW5kZXJlCisgKiAgICAgICAgICAgICAgICBzaWVoZSBhdWNoIG1lc3MoKQorICoKKyAqIHJlZnJlc2ggICAtIE1hcHBpbmcgbWl0IGRlbiBtb2VnbGljaGVuIEVpbnRyYWVnZW46CisgKiAgICAgICAgICAgICAgICAgUFJfVVNFUiA6IDxLb250aW5nZW50PiA7IDxVcGRhdGU+IChwcm8gU3BpZWxlcikKKyAqICAgICAgICAgICAgICAgICBQUl9BTEwgIDogPEtvbnRpbmdlbnQ+IDsgPFVwZGF0ZT4gKGZ1ZXIgYWxsZSkKKyAqICAgICAgICAgICAgIEVzIHdpcmQgenVuYWVjaHN0IGdlcHJ1ZWZ0LCBvYiBub2NoIGV0d2FzIGZ1ZXIgZGVuCisgKiAgICAgICAgICAgICAoemFobGVuZGVuISkgU3BpZWxlciBzZWxic3Qgdm9yaGFuZGVuIGlzdCB3ZW5uIG5laW4gd2lyZAorICogICAgICAgICAgICAgZ2VzY2hhdXQsIG9iIGRhcyBLb250aW5nZW50IGZ1ZXIgYWxsZSBzY2hvbiBlcnNjaG9lcGZ0IGlzdC4KKyAqICAgICAgICAgICAgIFNpbmQgYmVpZGUgS29udGluZ2VudGUgZXJzY2hvZXBmdCwga2FubiBkZXIgU3BpZWxlciBkYXMKKyAqICAgICAgICAgICAgIEJlc3RlbGx0ZSBuaWNodCBiZWtvbW1lbi4KKyAqICAgICAgICAgICAgIERpZSBLb250aW5nZW50ZSB3aXJkIGFsbGUgPFVwZGF0ZT4gcmVzZXQoKXMgImF1ZmdlZnJpc2NodCIuCisgKiAgICAgICAgICAgICA8S29udGluZ2VudD4gd2lyZCB1ZWJlciBldmFsX2FueXRoaW5nKCkgYXVzZ2V3ZXJ0ZXQuCisgKiAgICAgICAgICAgICBBbHRlcm5hdGl2IGthbm4gbWFuIGVpbmVuIEludC1XZXJ0IGFuZ2ViZW4uIERpZXNlciB3aXJkIHdpZQorICogICAgICAgICAgICAgKFsgUFJfQUxMIDogPHdlcnQ+IDsgMSBdKSBiZWhhbmRlbHQuCisgKgorICogZGVsYXkgICAgIC0gWmFobCBkZXIgU2VrdW5kZW4sIHVtIGRpZSB2ZXJ6b2VnZXJ0IGRpZSBIZWlsdW5nIGVpbnRyaXR0CisgKiAgICAgICAgICAgICB6LkIuIHdlaWwgZGFzIEVzc2VuIGVyc3QgenViZXJlaXRldCB3ZXJkZW4gbXVzcy4KKyAqICAgICAgICAgICAgIEViZW5mYWxscyB1ZWJlciBldmFsX2FueXRoaW5nKCkKKyAqCisgKiBkX21zZyAgICAgLSBNZWxkdW5nIGJlaW0gYmVzdGVsbGVuLCBmYWxscyBEZWxheS4gV2llIG1zZy4KKyAqLwordmFyYXJncyBzdHJpbmcgQWRkVG9NZW51KHN0cmluZyBtZW51ZXRleHQsIG1peGVkIGlkcywgbWFwcGluZyBtaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICBtaXhlZCByYXRlLCBtaXhlZCBtc2csIG1peGVkIHJlZnJlc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZWQgZGVsYXksIG1peGVkIGRfbXNnKQoreyBzdHJpbmcgaWRlbnQ7CisgIGludCBpOworCisgIGlmICggIXN0cmluZ3AobWVudWV0ZXh0KSB8fCAhaWRzIHx8ICFtYXBwaW5ncChtaW5mbykgKQorICAgIHJldHVybiAwOworCisgIGlmICggc3RyaW5ncChpZHMpICkKKyAgICBpZHMgPSAoeyBpZHMgfSk7CisgIGVsc2UgaWYgKCAhcG9pbnRlcnAoaWRzKSApCisgICAgcmV0dXJuIDA7CisKKyAgaWRlbnQgPSBzcHJpbnRmKCJtZW51ZW50cnklZCIsbWF4X2xpc3QpOworICBtYXhfbGlzdCsrOworCisgIC8qIEZ1ZXIgc2NobmVsbGVzIE5hY2hzY2hsYWdlbiBlaW4gZWlnZW5lcyBNYXBwaW5nIGZ1ZXIgSWRzICovCisgIGZvciggaT1zaXplb2YoaWRzKS0xO2k+PTA7aS0tICkKKyAgICBpZF9saXN0ICs9IChbIGlkc1tpXSA6IGlkZW50IF0pOworCisgIGlmICggaW50cChyZWZyZXNoKSAmJiAocmVmcmVzaD4wKSApCisgICAgcmVmcmVzaCA9IChbIFBSX0FMTCA6IHJlZnJlc2g7IDEgXSk7CisgIGVsc2UgaWYgKCAhbWFwcGluZ3AocmVmcmVzaCkgKQorICAgIHJlZnJlc2ggPSAwOworCisgIG1lbnVfbGlzdCArPSAoWyBpZGVudCA6IG1lbnVldGV4dDsgbWluZm87IHJhdGU7IG1zZzsgcmVmcmVzaDsKKyAgICAgICAgICAgICAgICAgICBkZWxheTsgZF9tc2c7IGlkcyBdKTsKKyAgcmV0dXJuIGlkZW50OworfQorCisvLyBEaWVzZSBNZXRob2RlIGlzdCBudXIgbm9jaCBhdXMgS29tcGF0aWJpbGl0YWV0c2dydWVuZGVuIHZvcmhhbmRlbiB1bmQgZGFyZgorLy8gbmljaHQgbWVociB2ZXJ3ZW5kZXQgd2VyZGVuISEhCit2b2lkIEFkZEZvb2Qoc3RyaW5nIG5hbWVPZkZvb2QsIG1peGVkIGlkcywgaW50IHByaWNlLCBpbnQgaGVhbCwKKyAgICAgICAgICAgICBtaXhlZCBteUZ1bmN0aW9uKQoreworICBpZiAoICFuYW1lT2ZGb29kIHx8ICFpZHMgfHwgIXByaWNlKQorICAgIHJldHVybjsgLyogRm9vZCBub3QgaGVhbGluZyBpcyBvayAhICovCisKKyAgQWRkVG9NZW51KCBuYW1lT2ZGb29kLGlkcywKKyAgICAgICAgICAgICAoWyBQX1ZBTFVFIDogcHJpY2UsIFBfRk9PRCA6IGhlYWwsIFBfSFAgOiBoZWFsLCBQX1NQIDogaGVhbCBdKSwKKyAgICAgICAgICAgICAoKGhlYWw+NSk/NTpoZWFsKSwgbXlGdW5jdGlvbiwgMCwwLDApOworfQorCisvLyBEaWVzZSBNZXRob2RlIGlzdCBudXIgbm9jaCBhdXMgS29tcGF0aWJpbGl0YWV0c2dydWVuZGVuIHZvcmhhbmRlbiB1bmQgZGFyZgorLy8gbmljaHQgbWVociB2ZXJ3ZW5kZXQgd2VyZGVuISEhCit2b2lkIEFkZERyaW5rKHN0cmluZyBuYW1lT2ZEcmluaywgbWl4ZWQgaWRzLCBpbnQgcHJpY2UsIGludCBoZWFsLAorICAgICAgICAgICAgICBpbnQgc3RyZW5ndGgsIGludCBzb2FrLCBtaXhlZCBteUZ1bmN0aW9uKQoreworICBpZiAoICFuYW1lT2ZEcmluayB8fCAhaWRzIHx8ICFwcmljZSApCisgICAgcmV0dXJuOworCisgIGhlYWw9aGVhbC8yOworICAvKiBLbGVpbmUgS29ycmVrdHVyLCBkYW1pdCBtYW4gaW4gYWx0ZW4gUHVicyB1ZWJlcmhhdXB0IHRyaW5rZW4ga2FubiAqLworICBBZGRUb01lbnUobmFtZU9mRHJpbmssaWRzLAorICAgICAgICAgICAgIChbIFBfVkFMVUUgOiBwcmljZSwgUF9EUklOSyA6IHNvYWssIFBfQUxDT0hPTCA6IHN0cmVuZ3RoLAorICAgICAgICAgICAgICAgIFBfSFAgOiBoZWFsLCBQX1NQIDogaGVhbCBdKSwKKyAgICAgICAgICAgICAoKGhlYWw+NSk/NTpoZWFsKSwgbXlGdW5jdGlvbiwwLDAsMCk7Cit9CisKK2ludCBSZW1vdmVGcm9tTWVudShtaXhlZCBpZHMpIHsKKyAgaW50IHJldDsKKworICBpZiAoc3RyaW5ncChpZHMpKQorICAgIGlkcyA9ICh7aWRzfSk7CisKKyAgaWYgKHBvaW50ZXJwKGlkcykpIHsKKyAgICBmb3JlYWNoIChzdHJpbmcgaWQ6IGlkcykgeworICAgICAgLy8gbG9vayBpZiB0aGUgaWQgaGFzIGEgbWF0Y2hpbmcgaWRlbnQKKyAgICAgIHN0cmluZyBpZGVudCA9IGlkX2xpc3RbaWRdOworICAgICAgaWYgKHN0cmluZ3AoaWRlbnQpKSB7CisgICAgICAgIC8vIHJlbW92ZSB0aGlzIGlkZW50LWVudHJ5IGZyb20gdGhlIGlkLWxpc3QgLi4uCisgICAgICAgIG1fZGVsZXRlKGlkX2xpc3QsIGlkKTsKKyAgICAgICAgLy8gLi4uIGFuZCByZW1vdmUgYWxsIG90aGVycyBub3cgdG9vIChzbyBpdCB3b24ndCBidWcgbGF0ZXIsIGlmCisgICAgICAgIC8vICAgICB0aGUgd2l6YXJkIGNhbGxpbmcgdGhpcyBtZXRob2QgZm9yZ290IGFuIGlkKQorICAgICAgICBmb3JlYWNoIChzdHJpbmcgbGlzdGlkOiBtX2luZGljZXMoaWRfbGlzdCkpCisgICAgICAgICAgaWYgKGlkX2xpc3RbbGlzdGlkXSA9PSBpZGVudCkKKyAgICAgICAgICAgIG1fZGVsZXRlKGlkX2xpc3QsIGxpc3RpZCk7CisKKyAgICAgICAgLy8gbm93IHJlbW92ZSB0aGUgaWRlbnQgZnJvbSB0aGUgbWVudV9saXN0CisgICAgICAgIGlmIChtZW1iZXIobWVudV9saXN0LCBpZGVudCkpIHsKKyAgICAgICAgICByZXQrKzsKKyAgICAgICAgICBtX2RlbGV0ZShtZW51X2xpc3QsIGlkZW50KTsKKworICAgICAgICAgIC8vIGRlY3JlYXNlIHRoZSBpZGVudC1jb3VudGVyLCBpZiB0aGlzIGVudHJ5IHdhcyB0aGUgbGFzdCBvbmUKKyAgICAgICAgICBpbnQgb2xkbnVtOworICAgICAgICAgIGlmIChzc2NhbmYoaWRlbnQsICJtZW51ZW50cnklZCIsIG9sZG51bSkgPT0gMSAmJgorICAgICAgICAgICAgICBvbGRudW0gPT0gKG1heF9saXN0LTEpKQorICAgICAgICAgICAgbWF4X2xpc3QtLTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICAvLyByZXR1cm4gcmVtb3ZlZCBlbnRyaWVzCisgIHJldHVybiByZXQ7Cit9CisKKy8qIFp1bSBBdXN3ZXJ0ZW4gZGVyIEVpbnRyYWVnZSBmdWVyIFByZWlzLCBSYXRlLCBIUC4uLgorICogYSkgaW50ZWdlci1XZXJ0ICAgIC0+IHdpcmQgZGlyZWt0IHVlYmVybm9tbWVuCisgKiBiKSBtYXBwaW5nICAgICAgICAgLT4gV2lyZCBhbHMgUmFjZU1vZGlmaWVyZSB2ZXJzdGFuZGVuLiBFcyB3aXJkIGRlcgorICogICAgICAgICAgICAgICAgICAgICAgIEVpbnRyYWcgZ2V3YWVobHQsIGRlciBkZXIgUmFzc2UgZGVzIFNwaWVsZXJzCisgKiAgICAgICAgICAgICAgICAgICAgICAgZW50c3ByaWNodCwgZmFsbHMgdm9yaGFuZGVuLCBhbnNvbnN0ZW4gZGVyIEVpbnRyYWcKKyAqICAgICAgICAgICAgICAgICAgICAgICBmdWVyIDAuCisgKiBjKSBBcnJheSAgICAgICAgICAgLT4gSW4gZXJzdGVtIEVsZW1lbnQgKG11c3MgT2JqZWt0IG9kZXIgZGVzc2VuIEZpbGVuYW1lCisgKiAgICAgICAgICAgICAgICAgICAgICAgc2Vpbikgd2lyZCBkaWUgRnVua3Rpb24gbWl0IGRlbSBOYW1lbiBpbSAyLkVsZW1lbnQKKyAqICAgICAgICAgICAgICAgICAgICAgICBhdWZnZXJ1ZmVuLgorICogZCkgU3RyaW5nICAgICAgICAgIC0+IERpZSBnZW5hbm50ZSBGdW5rdGlvbiB3aXJkIGluIGRlciBLbmVpcGUgc2VsYnN0CisgKiAgICAgICAgICAgICAgICAgICAgICAgYXVmZ2VydWZlbi4KKyAqIGUpIENsb3N1cmUgICAgICAgICAtPiBEaWUgQ2xvc3VyZSB3aXJkIGF1c2dld2VydGV0LgorICogQWxsZSBGdW5rdGlvbnNhdWZydWZlIGJla29tbWVuIGRlbiBlc3NlbmRlbiBTcGllbGVyIChiZWkgUHJpY2UgdW5kIERlbGF5CisgKiBkZW4gYmVzdGVsbGVuZGVuIFNwaWVsZXIpIGFscyBBcmd1bWVudCB1ZWJlcmdlYmVuLiBEaWUgQXVzd2VydHVuZyBlcmZvbGd0CisgKiBpbiBkZXIgYW5nZWdlYmVuZW4gUmVpaGVuZm9sZ2UuIEFtIEVuZGUgbXVzcyBlaW4gSW50ZXJnZXJ3ZXJ0IGhlcmF1c2tvbW1lbgorICovCitpbnQgZXZhbF9hbnl0aGluZyhtaXhlZCB3aGF0LCBvYmplY3QgcGwpCit7IG1peGVkIHJlOworCisgIGlmIChpbnRwKHdoYXQpKQorICAgIHJldHVybiB3aGF0OworCisgIGlmIChtYXBwaW5ncCh3aGF0KSAmJiBwbCkKKyAgeworICAgIHJlID0gd2hhdFtwbC0+UXVlcnlQcm9wKFBfUkFDRSldfHx3aGF0WzBdOworICB9CisKKyAgaWYgKHJlKQorICAgIHdoYXQ9cmU7CisKKyAgaWYgKCBwb2ludGVycCh3aGF0KSAmJiAoc2l6ZW9mKHdoYXQpPj0yKQorICAgICAgJiYgKCBvYmplY3RwKHdoYXRbMF0pIHx8IHN0cmluZ3Aod2hhdFswXSkgKQorICAgICAgJiYgc3RyaW5ncCh3aGF0WzFdKSApCisgICAgd2hhdCA9IGNhbGxfb3RoZXIod2hhdFswXSx3aGF0WzFdLHBsKTsKKworICBpZiAoIHN0cmluZ3Aod2hhdCkgJiYgZnVuY3Rpb25fZXhpc3RzKHdoYXQsTUUpICkKKyAgICB3aGF0ID0gY2FsbF9vdGhlcihNRSx3aGF0LHBsKTsKKworICBpZiAoIGNsb3N1cmVwKHdoYXQpICkKKyAgICB3aGF0ID0gZnVuY2FsbCh3aGF0LHBsKTsKKworICBpZiAoIGludHAod2hhdCkgKQorICAgIHJldHVybiB3aGF0OworCisgIHJldHVybiAwOworfQorCisvKiBEaWVzZSBGdW5rdGlvbiB1ZWJlcnBydWVmdCwgb2IgZGFzIEtvbnRpbmdlbnQgZWluZXMgTWVudWVlaW50cmFncworICogZnVlciBlaW5lbiBTcGllbGVyIGVyc2Nob2VwZnQgaXN0LgorICovCitzdHJpbmcgQ2hlY2tBdmFpbGFiaWxpdHkoc3RyaW5nIGlkZW50LCBvYmplY3QgemFobGVyKQoreyBzdHJpbmcgdWlkOworCisgIGlmICggIXN0cmluZ3AoaWRlbnQpIHx8ICFtZW1iZXIobWVudV9saXN0LGlkZW50KSB8fCAhb2JqZWN0cCh6YWhsZXIpICkKKyAgICByZXR1cm4gMDsKKyAgaWYgKCAhbWFwcGluZ3AobWVudV9saXN0W2lkZW50LFBNX1JFRlJFU0hdKSApCisgICAgcmV0dXJuIFBSX05PTkU7CisKKyAgaWYgKCAhbWVtYmVyKHJlZnJlc2hfbGlzdCxpZGVudCkgKQorICAgIHJlZnJlc2hfbGlzdCArPSAoWyBpZGVudCA6IChbIF0pIF0pOworCisgIGlmICggcXVlcnlfb25jZV9pbnRlcmFjdGl2ZSh6YWhsZXIpICkKKyAgICB1aWQ9Z2V0dWlkKHphaGxlcik7CisgIGVsc2UKKyAgICB1aWQ9b2JqZWN0X25hbWUoemFobGVyKTsKKworICBpZiAoIG1lbWJlcihtZW51X2xpc3RbaWRlbnQsUE1fUkVGUkVTSF0sUFJfVVNFUikgKQorICB7CisgICAgaWYgKCAhbWVtYmVyKHJlZnJlc2hfbGlzdFtpZGVudF0sdWlkKSApCisgICAgeworICAgICAgcmVmcmVzaF9saXN0W2lkZW50XSArPSAoWyB1aWQgOiAwIDsgcmVmcmVzaF9jb3VudCBdKTsKKyAgICB9CisKKyAgICAvKiBLb250aW5nZW50IGRlcyBaYWhsZW5kZW4gcHJ1ZWZlbiAqLworICAgIGlmICggcmVmcmVzaF9saXN0W2lkZW50XVt1aWQsUFJWX0FNT1VOVF0gPAorICAgICAgICAgIGV2YWxfYW55dGhpbmcobWVudV9saXN0W2lkZW50LFBNX1JFRlJFU0hdW1BSX1VTRVIsUFJWX0FNT1VOVF0sCisgICAgICAgICAgICAgICAgICAgICAgICB6YWhsZXIpICkKKyAgICAgIHJldHVybiB1aWQ7CisgIH0KKworICBpZiAoIG1lbWJlcihtZW51X2xpc3RbaWRlbnQsUE1fUkVGUkVTSF0sUFJfQUxMKSApCisgIHsKKyAgICBpZiAoICFtZW1iZXIocmVmcmVzaF9saXN0W2lkZW50XSxQUl9ERUZBVUxUKSApCisgICAgeworICAgICAgcmVmcmVzaF9saXN0W2lkZW50XSArPSAoWyBQUl9ERUZBVUxUIDogMCA7IHJlZnJlc2hfY291bnQgXSk7CisgICAgfQorCisgICAgLyogS29udGluZ2VudCBkZXIgQWxsZ2VtZWluaGVpdCBwcnVlZmVuICovCisgICAgaWYgKCByZWZyZXNoX2xpc3RbaWRlbnRdW1BSX0RFRkFVTFQsUFJWX0FNT1VOVF0gPAorICAgICAgICAgIGV2YWxfYW55dGhpbmcobWVudV9saXN0W2lkZW50LFBNX1JFRlJFU0hdW1BSX0FMTCxQUlZfQU1PVU5UXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHphaGxlcikgKQorICAgICAgcmV0dXJuIFBSX0RFRkFVTFQ7CisgIH0KKworICByZXR1cm4gMDsKK30KKworLyogRGllc2UgRnVua3Rpb24gcmVkdXppZXJ0IGRhcyBLb250aW5nZW50IGRlcyBMZWJld2VzZW5zIHVpZCBiZWltCisgKiBNZW51ZWVpbnRyYWcgaWRlbnQgdW0gMQorICovCit2b2lkIERlY3JlYXNlQXZhaWxhYmlsaXR5KHN0cmluZyBpZGVudCwgc3RyaW5nIHVpZCkKK3sKKyAgaWYgKCAhc3RyaW5ncChpZGVudCkgfHwgIXN0cmluZ3AodWlkKSApCisgICAgcmV0dXJuOworICByZWZyZXNoX2xpc3RbaWRlbnRdW3VpZCxQUlZfQU1PVU5UXSsrOworfQorCisvKiBEaWVzZSBGdW5rdGlvbiBzb3JndCBkYWZ1ZXIsIGRhc3MgZGllIEtvbnRpbmdlbnRlIGFuIGxpbWl0aWVydGVuCisgKiBTYWNoZW4gaW4gcmVnZWxtYWVzc2lnZW4gQWJzdGFlbmRlbiB3aWVkZXJoZXJnZXN0ZWxsdCB3ZXJkZW4uCisgKi8KK3N0YXRpYyB2b2lkIFVwZGF0ZUF2YWlsYWJpbGl0eSgpCit7IGludCAgICBpMSxpMjsKKyAgc3RyaW5nICppbmQxLCppbmQyLGNoazsKKworICAvKiBLZWluZSBSZWZyZXNoLUVpbnRyYWVnZSwga2VpbiBVcGRhdGUgKi8KKyAgaWYgKCAhbWFwcGluZ3AocmVmcmVzaF9saXN0KQorICAgICAgfHwgKGkxPXNpemVvZihpbmQxPW1faW5kaWNlcyhyZWZyZXNoX2xpc3QpKSk8MSApCisgICAgcmV0dXJuOworCisgIC8qIEVzIG11c3MgamVkZXIgTWVudWVlaW50cmFnLCBkZXIgaW4gZGVyIHJlZnJlc2hfbGlzdCBzdGVodCwKKyAgICogZHVyY2hnZWdhbmdlbiB3ZXJkZW4uCisgICAqLworICBmb3IgKCAtLWkxIDsgaTE+PTAgOyBpMS0tICkKKyAgeworICAgIGlmICggIW1hcHBpbmdwKHJlZnJlc2hfbGlzdFtpbmQxW2kxXV0pCisgICAgICAgIHx8IChpMj1zaXplb2YoaW5kMj1tX2luZGljZXMocmVmcmVzaF9saXN0W2luZDFbaTFdXSkpKTwxICkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLyogRnVlciBqZWRlbiBNZW51ZWVpbnRyYWcgbXVzcyBqZWRlciBTcGllbGVyZWludHJhZyBkdXJjaGdlZ2FuZ2VuCisgICAgICogd2VyZGVuLCBkZXIgaW4gZGVtIGVudHNwci4gbWFwcGluZyBzdGVodC4KKyAgICAgKi8KKyAgICBmb3IgKCAtLWkyIDsgaTI+PTAgOyBpMi0tICkgLy8gQWxsZSBTcGllbGVyCisgICAgeworICAgICAgaWYgKCBpbmQyW2kyXT09UFJfREVGQVVMVCApCisgICAgICAgIGNoayA9IFBSX0FMTDsKKyAgICAgIGVsc2UKKyAgICAgICAgY2hrID0gUFJfVVNFUjsKKworICAgICAgaWYgKCAoIHJlZnJlc2hfbGlzdFtpbmQxW2kxXV1baW5kMltpMl0sUFJWX1JFRlJFU0hdCisgICAgICAgICAgICArIG1lbnVfbGlzdFtpbmQxW2kxXSxQTV9SRUZSRVNIXVtjaGssUFJWX1JFRlJFU0hdICkKKyAgICAgICAgICA8PSByZWZyZXNoX2NvdW50ICkKKyAgICAgIHsKKyAgICAgICAgcmVmcmVzaF9saXN0W2luZDFbaTFdXVtpbmQyW2kyXSxQUlZfQU1PVU5UXT0wOworICAgICAgICByZWZyZXNoX2xpc3RbaW5kMVtpMV1dW2luZDJbaTJdLFBSVl9SRUZSRVNIXT1yZWZyZXNoX2NvdW50OworICAgICAgfQorICAgIH0KKyAgfQorfQorCittaXhlZCBEQkcobWl4ZWQgbykgeworICBpZihmaW5kX3BsYXllcigicnVtYXRhIikpCisgICAgdGVsbF9vYmplY3QoCisgICAgICAgIGZpbmRfcGxheWVyKCJydW1hdGEiKSwKKyAgICAgICAgc3ByaW50ZigiREJHOiAlT1xuIiwgbykKKyAgICApOworICByZXR1cm4gMDsKK30KKworLyogRXJ3ZWl0ZXJ0IHVtIGRpZSBNb2VnbGljaGtlaXQsIFNwZWlzZS0gb2RlciBHZXRyYWVua2UtS2FydGUgenUgc2VoZW4uICovCitzdHJpbmcgbWVudWVfdGV4dChzdHJpbmcgc3RyKQoreyBpbnQgaSxzZHIsc2ZvOworICBzdHJpbmcgaWRlbnQscmVzOworICBzdHJpbmcgKmZvPSh7fSksKmRyPSh7fSk7CisKKyAgaWYgKCAhbWF4X2xpc3QgKQorICAgIHJldHVybiAiSGllciBzY2hlaW50IGVzIGRlcnplaXQgbmljaHRzIHp1IGdlYmVuLlxuIjsKKworICBpZiAoICFzdHJpbmdwKHN0cikgfHwgc3RyPT0iIiApCisgICAgc3RyPSJhbGxlcyI7CisKKyAgLyogRnVlcnMgTWVudWUgZW50c2NoZWlkZW4gb2IgRHJpbmsgb2RlciBGb29kICovCisgIGZvcmVhY2goc3RyaW5nIGlkLCBzdHJpbmcgbWVudWV0ZXh0LCBtYXBwaW5nIG1pbmZvOiBtZW51X2xpc3QpCisgIHsKKyAgICBpZiAoZXZhbF9hbnl0aGluZyhtaW5mb1tQX0ZPT0RdLHRoaXNfcGxheWVyKCkpKQorICAgICAgZm8rPSh7IGlkIH0pOworICAgIGVsc2UKKyAgICAgIGRyKz0oeyBpZCB9KTsKKyAgfQorCisgIHNkciA9IHNpemVvZihkcik7CisgIHNmbyA9IHNpemVvZihmbyk7CisKKyAgaWYgKCBtZW1iZXIoKHsiYWxsZSIsImFsbGVzIn0pLHN0cikhPS0xKQorICB7CisgICAgaWYgKCAhc2ZvICkKKyAgICAgIHN0cj0iZHJpbmtzIjsKKyAgICBlbHNlIGlmICggIXNkciApCisgICAgICBzdHI9InNwZWlzZSI7CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIEdlbWlzY2h0ZSBLYXJ0ZSAqLworICAgICAgcmVzID0gIkdldHJhZW5rZSAgICAgICAgICAgICAgICAgICAgUHJlaXMgYWxjIHwgIisKKyAgICAgICAgICAgICJTcGVpc2VuICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVpc1xuIisKKyAgICAgICAgICAgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLSIrCisgICAgICAgICAgICAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiI7CisKKyAgICAgIGZvciAoIGk9MCA7ICggaTxzZHIgfHwgaTxzZm8gKSA7IGkrKyApCisgICAgICB7CisgICAgICAgIGlmICggaTxzZHIgKQorICAgICAgICAgIHJlcyArPSBzcHJpbnRmKCIlLTI5LjI5cyU1LjVkICAlYyAgfCAiLAorICAgICAgICAgICAgICAgICAgIG1lbnVfbGlzdFtkcltpXSxQTV9URVhUXSwKKyAgICAgICAgICAgICAgICAgICBldmFsX2FueXRoaW5nKG1lbnVfbGlzdFtkcltpXSxQTV9JTkZPXVtQX1ZBTFVFXSxQTCksCisgICAgICAgICAgICAgICAgICAgKGV2YWxfYW55dGhpbmcobWVudV9saXN0W2RyW2ldLFBNX0lORk9dW1BfQUxDT0hPTF0sUEwpPjApID8gJ0onIDogJ04nKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJlcyArPSAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAiOworCisgICAgICAgIGlmICggaTxzZm8gKQorICAgICAgICAgIHJlcyArPSBzcHJpbnRmKCIlLTMzLjMzcyU1LjVkIiwKKyAgICAgICAgICAgICAgICAgICBtZW51X2xpc3RbZm9baV0sUE1fVEVYVF0sCisgICAgICAgICAgICAgICAgICAgZXZhbF9hbnl0aGluZyhtZW51X2xpc3RbZm9baV0sUE1fSU5GT11bUF9WQUxVRV0sUEwpKTsKKworICAgICAgICByZXMgKz0gIlxuIjsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgIH0KKworICAvKiBSZWluZSBHZXRyYWVua2VrYXJ0ZSAqLworICBpZiAoIG1lbWJlcigoeyJnZXRyYWVua2UiLCJkcmlua3MiLCJnZXRyYWVuayIsInRyaW5rZW4ifSksc3RyKSE9LTEgKQorICB7CisgICAgaWYgKCAhc2RyICkKKyAgICAgIHJldHVybiAiSGllciBnaWJ0IGVzIGxlaWRlciBuaWNodHMgenUgdHJpbmtlbi5cbiI7CisKKyAgICByZXMgPSAiR2V0cmFlbmtlICAgICAgICAgICAgICAgICAgICBQcmVpcyBhbGMgfCAiKworICAgICAgICAgICJHZXRyYWVua2UgICAgICAgICAgICAgICAgICAgIFByZWlzIGFsY1xuIisKKyAgICAgICAgICAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0iKworICAgICAgICAgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIjsKKworICAgIGZvciAoIGk9MCA7IGk8c2RyIDsgaSsrICkKKyAgICB7CisgICAgICBpZGVudCA9IGRyW2ldOworCisgICAgICBpZiAoICFldmFsX2FueXRoaW5nKG1lbnVfbGlzdFtpZGVudCxQTV9JTkZPXVtQX0ZPT0RdLCBQTCkgKQorICAgICAgICByZXMgKz0gc3ByaW50ZigiJS0yOS4yOXMlNS41ZCAgJWMlcyIsCisgICAgICAgICAgICAgICAgIG1lbnVfbGlzdFtpZGVudCxQTV9URVhUXSwKKyAgICAgICAgICAgICAgICAgZXZhbF9hbnl0aGluZyhtZW51X2xpc3RbaWRlbnQsUE1fSU5GT11bUF9WQUxVRV0sUEwpLAorICAgICAgICAgICAgICAgICAoZXZhbF9hbnl0aGluZyhtZW51X2xpc3RbaWRlbnQsUE1fSU5GT11bUF9BTENPSE9MXSxQTCk+MCkgPyAnSicgOiAnTicsCisgICAgICAgICAgICAgICAgICgoaSUyKT8iXG4iOiIgIHwgIikpOworICAgIH0KKworICAgIGlmICggcmVzWzwxLi48MV0hPSJcbiIgKQorICAgICAgcmVzICs9ICJcbiI7CisKKyAgICByZXR1cm4gcmVzOworICB9CisKKyAgLyogUmVpbmUgU3BlaXNla2FydGUgKi8KKyAgaWYgKCBtZW1iZXIoKHsic3BlaXNlIiwic3BlaXNlbiIsImVzc2VuIn0pLHN0cikhPS0xICkKKyAgeworICAgIGlmICggIXNmbyApCisgICAgICByZXR1cm4gIkhpZXIgZ2lidCBlcyBsZWlkZXIgbmljaHRzIHp1IGVzc2VuLlxuIjsKKworICAgIHJlcyA9ICJTcGVpc2VuICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVpcyB8ICIrCisgICAgICAgICAgIlNwZWlzZW4gICAgICAgICAgICAgICAgICAgICAgICAgIFByZWlzXG4iKworICAgICAgICAgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLSIrCisgICAgICAgICAgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iOworCisgICAgZm9yICggaT0wIDsgaTxzZm8gOyBpKysgKQorICAgIHsKKyAgICAgIGlkZW50ID0gZm9baV07CisgICAgICBpZiAoZXZhbF9hbnl0aGluZyhtZW51X2xpc3RbaWRlbnQsUE1fSU5GT11bUF9GT09EXSxQTCkgKQorICAgICAgICByZXMgKz0gc3ByaW50ZigiJS0zMy4zM3MlNS41ZCVzIiwKKyAgICAgICAgICAgICAgICAgbWVudV9saXN0W2lkZW50LFBNX1RFWFRdLAorICAgICAgICAgICAgICAgICBldmFsX2FueXRoaW5nKG1lbnVfbGlzdFtpZGVudCxQTV9JTkZPXVtQX1ZBTFVFXSxQTCksCisgICAgICAgICAgICAgICAgICgoaSUyKT8iXG4iOiIgfCAiKSk7CisgICAgfQorCisgICAgaWYgKCByZXNbPDEuLjwxXSE9IlxuIiApCisgICAgICByZXMgKz0gIlxuIjsKKworICAgIHJldHVybiByZXM7CisgIH0KKworICByZXR1cm4gMDsKK30KKworaW50IG1lbnVlKHN0cmluZyBzdHIpCit7IHN0cmluZyB0eHQ7CisKKyAgX25vdGlmeV9mYWlsKCJXZWxjaGVuIFRlaWwgZGVzIE1lbnVlcyBtb2VjaHRlc3QgRHUgc2VoZW4/XG4iKTsKKyAgaWYgKCAhc3RyaW5ncCh0eHQ9bWVudWVfdGV4dChzdHIpKSB8fCBzaXplb2YodHh0KTwxICkKKyAgICByZXR1cm4gMDsKKyAgd3JpdGUodHh0KTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qIERpZXNlIEZ1bmt0aW9uIGthbm4vc29sbCBiZWkgQmVkYXJmIHVlYmVybGFkZW4gd2VyZGVuLCB1bSBzaW11bHRhbmUKKyAqIEFlbmRlcnVuZ2VuIGRlcyBNYXBwaW5ncyB6dSBlcm1vZWdsaWNoZW4gKHp1IEJlaXNwaWVsIHdpZSBlcyBpbiBndXRlbgorICogVGFnZW4gZ3JvZXNzZXIgUG9ydGlvbmVuIGdpYiwgSG9iYml0cyBwZXIgc2UgbWVociBrcmllZ2VuLCAuLi4KKyAqLworbWFwcGluZyBhZGp1c3RfaW5mbyhzdHJpbmcgaWRlbnQsIG1hcHBpbmcgbWluZm8sIG9iamVjdCB6YWhsZXIsCisgICAgICAgICAgICAgICAgICAgIG9iamVjdCBlbXBmYWVuZ2VyKQoreworICByZXR1cm4gMDsKK30KKworLyogSGllciBoYXRzIGplZGUgTWVuZ2UgbmV1ZSBQbGF0emhhbHRlciAqLworc3RyaW5nIG1lc3Moc3RyaW5nIHN0cixvYmplY3QgcGwpCit7CisgIHN0cmluZyBkdW1teTEsIGR1bW15MjsKKworICBpZiAoICFwbCApCisgICAgcGw9UEw7CisKKyAgaWYgKCAhc3RyaW5ncChzdHIpIHx8IHN0cj09IiIgKQorICAgIHJldHVybiBzdHI7CisKKyAgc3RyPWltcGxvZGUoZXhwbG9kZShzdHIsIiYmIikscGwtPm5hbWUoV0VSLDIpKTsKKyAgc3RyPWltcGxvZGUoZXhwbG9kZShzdHIsIiYxJiIpLHBsLT5uYW1lKFdFUiwyKSk7CisgIHN0cj1pbXBsb2RlKGV4cGxvZGUoc3RyLCImMiYiKSxwbC0+bmFtZShXRVNTRU4sMikpOworICBzdHI9aW1wbG9kZShleHBsb2RlKHN0ciwiJjMmIikscGwtPm5hbWUoV0VNLDIpKTsKKyAgc3RyPWltcGxvZGUoZXhwbG9kZShzdHIsIiY0JiIpLHBsLT5uYW1lKFdFTiwyKSk7CisgIHN0cj1pbXBsb2RlKGV4cGxvZGUoc3RyLCImMSMiKSxjYXBpdGFsaXplKHBsLT5uYW1lKFdFUiwyKSkpOworICBzdHI9aW1wbG9kZShleHBsb2RlKHN0ciwiJjIjIiksY2FwaXRhbGl6ZShwbC0+bmFtZShXRVNTRU4sMikpKTsKKyAgc3RyPWltcGxvZGUoZXhwbG9kZShzdHIsIiYzIyIpLGNhcGl0YWxpemUocGwtPm5hbWUoV0VNLDIpKSk7CisgIHN0cj1pbXBsb2RlKGV4cGxvZGUoc3RyLCImNCMiKSxjYXBpdGFsaXplKHBsLT5uYW1lKFdFTiwyKSkpOworICBzdHI9aW1wbG9kZShleHBsb2RlKHN0ciwiJiEiKSxwbC0+UXVlcnlQcm9ub3VuKFdFUikpOworICBzdHI9aW1wbG9kZShleHBsb2RlKHN0ciwiJjUmIikscGwtPlF1ZXJ5UHJvbm91bihXRVIpKTsKKyAgc3RyPWltcGxvZGUoZXhwbG9kZShzdHIsIiY2JiIpLHBsLT5RdWVyeVByb25vdW4oV0VTU0VOKSk7CisgIHN0cj1pbXBsb2RlKGV4cGxvZGUoc3RyLCImNyYiKSxwbC0+UXVlcnlQcm9ub3VuKFdFTSkpOworICBzdHI9aW1wbG9kZShleHBsb2RlKHN0ciwiJjgmIikscGwtPlF1ZXJ5UHJvbm91bihXRU4pKTsKKyAgc3RyPWltcGxvZGUoZXhwbG9kZShzdHIsIiY1IyIpLGNhcGl0YWxpemUocGwtPlF1ZXJ5UHJvbm91bihXRVIpKSk7CisgIHN0cj1pbXBsb2RlKGV4cGxvZGUoc3RyLCImNiMiKSxjYXBpdGFsaXplKHBsLT5RdWVyeVByb25vdW4oV0VTU0VOKSkpOworICBzdHI9aW1wbG9kZShleHBsb2RlKHN0ciwiJjcjIiksY2FwaXRhbGl6ZShwbC0+UXVlcnlQcm9ub3VuKFdFTSkpKTsKKyAgc3RyPWltcGxvZGUoZXhwbG9kZShzdHIsIiY4IyIpLGNhcGl0YWxpemUocGwtPlF1ZXJ5UHJvbm91bihXRU4pKSk7CisKKyAgcmV0dXJuIGJyZWFrX3N0cmluZyhjYXBpdGFsaXplKHN0ciksNzgsIiIsIEJTX0xFQVZFX01ZX0xGUyk7Cit9CisKK3Byb3RlY3RlZCB2b2lkIF9jb3B5X21lbnVsaXN0X3ZhbHVlcyhtYXBwaW5nIGVudHJ5aW5mbywgc3RyaW5nIGlkZW50KSB7CisgIC8qIEtvcGllcmVuIGFsbGVyIFdlcnRlIGlucyBtaW5mby1NYXBwaW5nLCB1bSBQcm9ibGVtZW4gYmVpIExvZXNjaHVuZworICAgICBhdXMgZGVtIFdlZyB6dSBnZWhlbi4gU2xvdyBhbmQgZGlydHkgKi8KKyAgZW50cnlpbmZvW1BNX1RFWFRdICAgICAgPSBkZWVwX2NvcHkobWVudV9saXN0W2lkZW50LCBQTV9URVhUXSk7CisgIC8vIFBNX0lORk8gaXMgYWxyZWFkeSBmbGF0IGluIGVudHJ5aW5mbworICBlbnRyeWluZm9bUE1fUkFURV9QVUJNQVNURVJdCisgICAgICAgICAgICAgICAgICAgICAgICAgID0gZGVlcF9jb3B5KG1lbnVfbGlzdFtpZGVudCwgUE1fUkFURV0pOworICBlbnRyeWluZm9bUE1fU0VSVkVfTVNHXSA9IGRlZXBfY29weShtZW51X2xpc3RbaWRlbnQsIFBNX1NFUlZFX01TR10pOworICBlbnRyeWluZm9bUE1fUkVGUkVTSF0gICA9IGRlZXBfY29weShtZW51X2xpc3RbaWRlbnQsIFBNX1JFRlJFU0hdKTsKKyAgLy8gUE1fREVMQVkgaXMgYWxyZWFkeSBldmFsdWF0ZWQgaW4gZW50cnlpbmZvCisgIGVudHJ5aW5mb1tQTV9ERUxBWV9NU0ddID0gZGVlcF9jb3B5KG1lbnVfbGlzdFtpZGVudCwgUE1fREVMQVlfTVNHXSk7CisgIGVudHJ5aW5mb1tQTV9JRFNdICAgICAgID0gZGVlcF9jb3B5KG1lbnVfbGlzdFtpZGVudCwgUE1fSURTXSk7Cit9CisKK2ludCBkb19kZWxpdmVyKHN0cmluZyBpZGVudCwgb2JqZWN0IHphaGxlciwgb2JqZWN0IGVtcGZhZW5nZXIsCisgICAgICAgICAgICAgICBtYXBwaW5nIGVudHJ5aW5mbykgeworICB3YWl0aW5nIC09ICh7IGVtcGZhZW5nZXIsMCB9KTsKKworICAvKiBFbXBmYWVuZ2VyIG11c3MgbmF0dWVybGljaCBub2NoIGRhIHNlaW4gKi8KKyAgaWYgKCAhb2JqZWN0cChlbXBmYWVuZ2VyKSB8fCAhcHJlc2VudChlbXBmYWVuZ2VyKSApCisgICAgcmV0dXJuIDA7CisKKyAgLyogWmFobGVyIHdpcmQgbnVyIHdlZ2VuIGRlciBBYndhZXJ0c2tvbXBhdGliaWxpdGFldCBnZWJyYXVjaHQgKi8KKyAgaWYgKCAhb2JqZWN0cCh6YWhsZXIpICkKKyAgICB6YWhsZXIgPSBlbXBmYWVuZ2VyOworCisgIC8vIGFsdGUgUHVicywgZGllIGRvX2RlbGl2ZXIgaXJnZW5kd2llIHNlbGJzdCBhdWZydWZlbiwgc29sbHRlbgorICAvLyBtaXQgZGVyIFplaXQga29ycmlnaWVydCB3ZXJkZW4KKyAgaWYoIW1hcHBpbmdwKGVudHJ5aW5mbykpCisgICAgcmFpc2VfZXJyb3IoIlB1YiBydWZ0IGRvX2RlbGl2ZXIoKSBvaG5lIHNpbm52b2xsZSBBcmd1bWVudGUgYXVmLlxuIik7CisgIGlmKCFtZW1iZXIoZW50cnlpbmZvLCBQTV9SQVRFX1BVQk1BU1RFUikpIHsKKyAgICBpZighbWVtYmVyKG1lbnVfbGlzdCwgaWRlbnQpKQorICAgICAgcmFpc2VfZXJyb3IoIlB1YiBydWZ0IGRvX2RlbGl2ZXIoKSBtaXQgZ2Vsb2VzY2h0ZW0gR2V0cmFlbmsgdW5kICIKKyAgICAgICAgICAgICAgICAgICJ0ZWlsd2Vpc2VuIEFyZ3VtZW50ZW4gYXVmIVxuIik7CisKKyAgICBfY29weV9tZW51bGlzdF92YWx1ZXMoZW50cnlpbmZvLCBpZGVudCk7CisgICAgY2FsbF9vdXQoIydyYWlzZV9lcnJvciwgMSwKKyAgICAgICAgICAgICAiUHViIHJ1ZnQgZG9fZGVsaXZlcigpIG51ciBtaXQgdGVpbHdlaXNlbiBBcmd1bWVudGVuIGF1Zi5cbiIpOworICB9CisKKyAgZW50cnlpbmZvW1BNX1JBVEVfUFVCTUFTVEVSXSA9IGV2YWxfYW55dGhpbmcoZW50cnlpbmZvW1BNX1JBVEVfUFVCTUFTVEVSXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wZmFlbmdlcik7CisgIGVudHJ5aW5mb1tQX0hQXSAgICAgICAgICAgICAgPSBldmFsX2FueXRoaW5nKGVudHJ5aW5mb1tQX0hQXSwgZW1wZmFlbmdlcik7CisgIGVudHJ5aW5mb1tQX1NQXSAgICAgICAgICAgICAgPSBldmFsX2FueXRoaW5nKGVudHJ5aW5mb1tQX1NQXSwgZW1wZmFlbmdlcik7CisKKyAgLyogVWViZXJwcnVlZmVuLCBvYiBIZWlsbW9lZ2xpY2hrZWl0IGxlZ2FsICovCisgIGlmICggcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShlbXBmYWVuZ2VyKQorICAgICAgJiYgKChQVUJNQVNURVItPlJlZ2lzdGVySXRlbShlbnRyeWluZm9bUE1fVEVYVF0sIGVudHJ5aW5mbykpPDEpICkgeworICAgICB0ZWxsX29iamVjdChlbXBmYWVuZ2VyLAorICAgICAgICJNaXQgZGllc2VtIEdldHJhZW5rL0dlcmljaHQgc2NoZWludCBldHdhcyBuaWNodCBpbiBPcmRudW5nICIrCisgICAgICAgInp1IHNlaW4uXG5WZXJzdGFlbmRpZ2UgYml0dGUgZGVuIE1hZ2llciwgZGVyIGZ1ZXIgZGllc2VuICIrCisgICAgICAgIlJhdW0gdmVyYW50d29ydGxpY2ggaXN0LlxuIik7CisgICAgIHJldHVybiAtNDsKKyAgfQorCisgIGlmICggUXVlcnlQcm9wKFBfTlBDX0ZBU1RIRUFMKSAmJiAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShlbXBmYWVuZ2VyKSApIHsKKyAgICBlbnRyeWluZm9bSF9ESVNUUklCVVRJT05dID0gSERfSU5TVEFOVDsKKyAgfQorICBlbHNlIHsKKyAgICBlbnRyeWluZm9bSF9ESVNUUklCVVRJT05dID0gZW50cnlpbmZvW1BNX1JBVEVfUFVCTUFTVEVSXTsKKyAgfQorICBlbXBmYWVuZ2VyLT5jb25zdW1lKGVudHJ5aW5mbyk7CisKKyAgLyogTWVsZHVuZyBhdXNnZWJlbiAqLworICAvKiBIaW53ZWlzOiBEYSBkaWUgYXVzZnVlaHJlbmRlbiBGdW5rdGlvbmVuIGF1Y2ggaWRlbnQgdW5kIG1pbmZvCisgICAqIHVlYmVyZ2ViZW4gYmVrb21tZW4sIGthbm4gbWFuIGhpZXIgYXVjaCB1ZWJlciBhZGp1c3RfaW5mbyBvZGVyCisgICAqIGFuIGFuZGVyZXIgU3RlbGxlIHp1c2FldHpsaWNoZSBJbmZvcm1hdGlvbmVuIHVlYmVyZ2ViZW4uLi4KKyAgICovCisgIGlmIChjbG9zdXJlcChlbnRyeWluZm9bUE1fU0VSVkVfTVNHXSkgKQorICAgIGZ1bmNhbGwoZW50cnlpbmZvW1BNX1NFUlZFX01TR10sIHphaGxlciwgZW1wZmFlbmdlciwgaWRlbnQsIGVudHJ5aW5mbyk7CisgIGVsc2UgaWYgKHN0cmluZ3AoZW50cnlpbmZvW1BNX1NFUlZFX01TR10pICYmCisgICAgICAgICAgIGZ1bmN0aW9uX2V4aXN0cyhlbnRyeWluZm9bUE1fU0VSVkVfTVNHXSxNRSkpCisgICAgY2FsbF9vdGhlcihNRSwgZW50cnlpbmZvW1BNX1NFUlZFX01TR10sIHphaGxlciwgZW1wZmFlbmdlciwgaWRlbnQsCisgICAgICAgICAgICAgICAgICAgZW50cnlpbmZvKTsKKyAgZWxzZSBpZiAocG9pbnRlcnAoZW50cnlpbmZvW1BNX1NFUlZFX01TR10pICYmCisgICAgICAgICAgIHNpemVvZihlbnRyeWluZm9bUE1fU0VSVkVfTVNHXSk+PTIpICB7CisgICAgaWYgKHN0cmluZ3AoZW50cnlpbmZvW1BNX1NFUlZFX01TR11bMF0pICYmCisgICAgICAgIHNpemVvZihlbnRyeWluZm9bUE1fU0VSVkVfTVNHXVswXSkpCisgICAgICB0ZWxsX29iamVjdChlbXBmYWVuZ2VyLAorICAgICAgICBtZXNzKGVudHJ5aW5mb1tQTV9TRVJWRV9NU0ddWzBdKyJcbiIsIGVtcGZhZW5nZXIpKTsKKyAgICBpZiAoc3RyaW5ncChlbnRyeWluZm9bUE1fU0VSVkVfTVNHXVsxXSkgJiYKKyAgICAgICAgc2l6ZW9mKGVudHJ5aW5mb1tQTV9TRVJWRV9NU0ddWzFdKSkKKyAgICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudChlbXBmYWVuZ2VyKXx8TUUsCisgICAgICAgIG1lc3MoZW50cnlpbmZvW1BNX1NFUlZFX01TR11bMV0rIlxuIixlbXBmYWVuZ2VyKSwKKyAgICAgICAgKHtlbXBmYWVuZ2VyfSkgKTsKKyAgfQorCisgIHJldHVybiAxOworfQorCisvKiBUZXN0ZXQsIG9iIGdlbnVnIEdlbGQgenVyIFZlcmZ1ZWd1bmcgc3RlaHQuCisgKiBGYWxscyBkaWUgQm9uaXRhZXQgYW5kZXJlbiBCZXNjaHJhZW5rdW5nZW4gdW50ZXJsaWVndCwgYWxzCisgKiBkYXNzIGRlciBaYWhsZXIgZ2VudWcgR2VsZCBkYWJlaSBoYXQsIG11c3MgZGllc2UgTWV0aG9kZQorICogdWViZXJzY2hyaWViZW4gd2VyZGVuLgorICogUnVlY2tnYWJld2VydGU6CisgKiAtMiA6IE91dCBvZiBNb25leQorICogIDAgOiBBbGxlcyBPSy4KKyAqIFJ1ZWNrZ2FiZXdlcnRlICE9IDAgZnVlaHJlbiB6dSBlaW5lbSBBYmJydWNoIGRlciBCZXN0ZWxsdW5nCisgKi8KK2ludCBDaGVja1NvbHZlbmN5KHN0cmluZyBpZGVudCwgb2JqZWN0IHphaGxlciwgb2JqZWN0IGVtcGZhZW5nZXIsCisgICAgICAgICAgICAgICAgICAgbWFwcGluZyBlbnRyeWluZm8pCit7CisgIGlmICggKHphaGxlci0+UXVlcnlNb25leSgpKTxlbnRyeWluZm9bUF9WQUxVRV0gKQorICB7CisgICAgc3RyaW5nIHJlczsKKyAgICBpZiAoICFzdHJpbmdwKHJlcz1RdWVyeVByb3AoUF9QVUJfTk9fTU9ORVkpKSApCisgICAgICByZXMgPSAiRGFzIGtvc3RldCAlZCBHb2xkc3R1ZWNrZSwgdW5kIER1IGhhc3QgbmljaHQgc28gdmllbCFcbiI7CisgICAgdGVsbF9vYmplY3QoemFobGVyLHNwcmludGYocmVzLCBlbnRyeWluZm9bUF9WQUxVRV0pKTsKKyAgICByZXR1cm4gLTI7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIEZ1ZWhydCBkaWUgQmV6YWhsdW5nIGR1cmNoLgorICogRmFsbHMgZGllIEJlemFobHVuZyBhbmRlcnMgZXJmb2xndCwgYWxzIGR1cmNoIEFienVnIGRlcyBHZWxkZXMgdm9tIFphaGxlciwKKyAqIG11c3MgZGllc2UgTWV0aG9kZSB1ZWJlcnNjaHJpZWJlbiB3ZXJkZW4KKyAqIFJ1ZWNrZ2FiZXdlcnRlOgorICogQW56YWhsIGRlciBNdWVuemVuLCBkaWUgaW0gUHViIGxhbmRlbiB1bmQgYmVpIFJlc2V0IGluIGRpZSBaZW50cmFsYmFuaworICogZWluZ2V6YWhsdCB3ZXJkZW4KKyAqLworaW50IERvUGF5KHN0cmluZyBpZGVudCwgb2JqZWN0IHphaGxlciwgb2JqZWN0IGVtcGZhZW5nZXIsIG1hcHBpbmcgZW50cnlpbmZvKQoreworICB6YWhsZXItPkFkZE1vbmV5KC1lbnRyeWluZm9bUF9WQUxVRV0pOworICByZXR1cm4gZW50cnlpbmZvW1BfVkFMVUVdOworfQorCisvKiBSdWVja2dhYmV3ZXJ0ZToKKyAqIC02IDogTmljaHQgdm9ycmFldGlnCisgKiAtNSA6IFdpcnQgbmljaHQgYW53ZXNlbmQKKyAqIC00IDogSWxsZWdhbGVzIEdldHJhZW5rL0dlcmljaHQuIEF1c2dhYmUgdmVyd2VpZ2VydC4KKyAqICAgICAgTnVyIGJlaSBzb2ZvcnRpZ2VyIExpZWZlcnVuZy4uLgorICogLTMgOiBFbXBmYWVuZ2VyIGJlcmVpdHMgdm9sbAorICogLTIgOiBPdXQgb2YgTW9uZXkKKyAqIC0xIDogc3BlbmRpZXJlbiBpZ25vcmllcnQKKyAqICAwIDogRW1wZmFlbmdlciBhdXNnZWZsb2dlbiAoc29sbHRlIGVpZ2VudGxpY2ggbmljaHQgcGFzc2llcmVuKQorICogIDEgOiBBbGxlcyBPSy4KKyAqLworaW50IGNvbnN1bWVfc29tZXRoaW5nKHN0cmluZyBpZGVudCwgb2JqZWN0IHphaGxlciwgb2JqZWN0IGVtcGZhZW5nZXIpIHsKKyAgaWYgKCAhb2JqZWN0cCh6YWhsZXIpICkKKyAgICB6YWhsZXI9UEw7CisKKyAgaWYgKCAhb2JqZWN0cChlbXBmYWVuZ2VyKSApCisgICAgZW1wZmFlbmdlcj1QTDsKKworICAvKiBEaWUgQWJmcmFnZSBhdWYgYW53ZXNlbmRlbiBXaXJ0IGVyZm9sZ3QgTlVSIGFuIGRpZXNlciBTdGVsbGUsIGRhbWl0ICovCisgIC8qIGtlaW4gU3BpZWxlciBkYXJ1bnRlciBsZWlkZW4gbXVzcywgd2VubiBqZW1hbmQgYW5kZXJlcyB6d2lzY2hlbiAgICAgKi8KKyAgLyogQmVzdGVsbHVuZyB1bmQgTGllZmVydW5nIGRlbiBXaXJ0IG1ldWNoZWx0LiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpZiAoIHN0cmluZ3AoUXVlcnlQcm9wKFBfS0VFUEVSKSkgJiYgIXByZXNlbnQoUXVlcnlQcm9wKFBfS0VFUEVSKSwgTUUpKQorICB7CisgICAgc3RyaW5nIHJlcyA9IFF1ZXJ5UHJvcChQX1BVQl9OT19LRUVQRVIpOworICAgIGlmICggIXN0cmluZ3AocmVzKSApIHsKKyAgICAgIHJlcyA9ICJFcyBpc3QgbmllbWFuZCBhbndlc2VuZCwgZGVyIERpY2ggYmVkaWVuZW4ga29lbm50ZS5cbiI7CisgICAgfQorICAgIHRlbGxfb2JqZWN0KHphaGxlcixyZXMpOworICAgIHJldHVybiAtNTsKKyAgfQorCisgIC8qIFNwZW5kaWVydCB1bmQgaWdub3JpZXJ0PyAqLworICBpZiAoIHphaGxlciE9ZW1wZmFlbmdlciApCisgIHsKKyAgICBtaXhlZCByZXMgPSAoeyJzcGVuZGllcmUifSk7CisgICAgaWYgKCBldmFsX2FueXRoaW5nKG1lbnVfbGlzdFtpZGVudCxQTV9JTkZPXVtQX0RSSU5LXSxlbXBmYWVuZ2VyKSApCisgICAgICByZXMgKz0gKHsic3BlbmRpZXJlLmdldHJhZW5rZSJ9KTsKKyAgICBpZiAoIGV2YWxfYW55dGhpbmcobWVudV9saXN0W2lkZW50LFBNX0lORk9dW1BfRk9PRF0sZW1wZmFlbmdlcikgKQorICAgICAgcmVzICs9ICh7InNwZW5kaWVyZS5lc3NlbiJ9KTsKKyAgICBpZiAoIGV2YWxfYW55dGhpbmcobWVudV9saXN0W2lkZW50LFBNX0lORk9dW1BfQUxDT0hPTF0sZW1wZmFlbmdlcikgKQorICAgICAgcmVzICs9ICh7InNwZW5kaWVyZS5hbGtvaG9sIn0pOworICAgIGlmICggZW1wZmFlbmdlci0+VGVzdElnbm9yZVNpbXBsZShyZXMpICkKKyAgICB7CisgICAgICB0ZWxsX29iamVjdCh6YWhsZXIsCisgICAgICAgIGVtcGZhZW5nZXItPk5hbWUoV0VSKSsiIHdpbGwgZGFzIG5pY2h0LlxuIik7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICB9CisKKyAgLyogSGllciBrYW5uIGRhcyBJbmZvLU1hcHBpbmcgZXJzdCBtYWwgYWxzIGdhbnplcyBhbmdlcGFzc3Qgd2VyZGVuLiAqLworICBtYXBwaW5nIHhpbmZvOworICBtYXBwaW5nIGVudHJ5aW5mbyA9IGRlZXBfY29weShtZW51X2xpc3RbaWRlbnQsIFBNX0lORk9dKTsKKyAgaWYgKCAoeGluZm89YWRqdXN0X2luZm8oaWRlbnQsZW50cnlpbmZvLHphaGxlcixlbXBmYWVuZ2VyKSkgJiYKKyAgICAgICBtYXBwaW5ncCh4aW5mbykgKQorICAgIGVudHJ5aW5mbyArPSB4aW5mbzsKKworICAvKiBHZW51ZyBHZWxkIHZvcmhhbmRlbj8gKi8KKyAgZW50cnlpbmZvW1BfVkFMVUVdID0gZXZhbF9hbnl0aGluZyhlbnRyeWluZm9bUF9WQUxVRV0sIHphaGxlcik7CisgIHsKKyAgICBpbnQgcmVzID0gQ2hlY2tTb2x2ZW5jeShpZGVudCwgemFobGVyLCBlbXBmYWVuZ2VyLCBlbnRyeWluZm8pOworICAgIGlmIChyZXMgIT0gMCkgcmV0dXJuIHJlczsKKyAgfQorCisgIHN0cmluZyBhdmI7CisgIGlmICggIXN0cmluZ3AoYXZiPUNoZWNrQXZhaWxhYmlsaXR5KGlkZW50LCB6YWhsZXIpKSApCisgIHsKKyAgICBzdHJpbmcgcmVzID0gUXVlcnlQcm9wKFBfUFVCX1VOQVZBSUxBQkxFKTsKKyAgICBpZiAoICFzdHJpbmdwKHJlcykgKQorICAgICAgcmVzID0gIkRhdm9uIGlzdCBsZWlkZXIgbmljaHRzIG1laHIgZGEuXG4iOworICAgIHRlbGxfb2JqZWN0KHphaGxlcixyZXMpOworICAgIHJldHVybiAtNjsKKyAgfQorCisgIC8qIFRleHRhdXNnYWJlIGJlaW0gc3BlbmRpZXJlbiAqLworICBpZiAoIGVtcGZhZW5nZXIhPXphaGxlcikKKyAgeworICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudChlbXBmYWVuZ2VyKXx8TUUsCisgICAgICB6YWhsZXItPk5hbWUoV0VSKSsiIHNwZW5kaWVydCAiK2VtcGZhZW5nZXItPm5hbWUoV0VNKSsiIGV0d2FzLlxuIiwKKyAgICAgICh7emFobGVyLCBlbXBmYWVuZ2VyfSkgKTsKKyAgICB0ZWxsX29iamVjdChlbXBmYWVuZ2VyLAorICAgICAgemFobGVyLT5OYW1lKFdFUikrIiBzcGVuZGllcnQgRGlyIGV0d2FzLlxuIik7CisgICAgdGVsbF9vYmplY3QoemFobGVyLAorICAgICAgIkR1IHNwZW5kaWVyc3QgIitlbXBmYWVuZ2VyLT5uYW1lKFdFTSkrIiBldHdhcy5cbiIpOworICB9CisKKyAgLyogVGVzdGVuLCBvYiBtYW5zIG5vY2ggZXNzZW4gLyB0cmlua2VuIGthbm4gKi8KKyAgLyogRGllIGludC1XZXJ0ZSB3ZXJkZW4gaW4gbWluZm8gdWViZXJub21tZW4gZnVlciBkaWUgQXVzd2VydHVuZyAqLworICAvKiBpbSBQdWJtYXN0ZXIuICovCisgIGVudHJ5aW5mb1tQX0ZPT0RdICAgID0gZXZhbF9hbnl0aGluZyhlbnRyeWluZm9bUF9GT09EXSwgICBlbXBmYWVuZ2VyKTsKKyAgZW50cnlpbmZvW1BfQUxDT0hPTF0gPSBldmFsX2FueXRoaW5nKGVudHJ5aW5mb1tQX0FMQ09IT0xdLGVtcGZhZW5nZXIpOworICBlbnRyeWluZm9bUF9EUklOS10gICA9IGV2YWxfYW55dGhpbmcoZW50cnlpbmZvW1BfRFJJTktdLCAgZW1wZmFlbmdlcik7CisKKyAgaW50IHJlc3VsdCA9IGVtcGZhZW5nZXItPmNvbnN1bWUoZW50cnlpbmZvLCAxKTsKKyAgaWYgKHJlc3VsdCA8IDApIHsKKyAgICBpZiAocmVzdWx0ICYgSENfTUFYX0ZPT0RfUkVBQ0hFRCkKKyAgICAgIHRlbGxfb2JqZWN0KGVtcGZhZW5nZXIsCisgICAgICAgICAgICAgICAgICAiRHUgYmlzdCB6dSBzYXR0LCBkYXMgc2NoYWZmc3QgRHUgbmljaHQgbWVoci5cbiIpOworICAgIGVsc2UgaWYgKHJlc3VsdCAmIEhDX01BWF9EUklOS19SRUFDSEVEKQorICAgICAgdGVsbF9vYmplY3QoZW1wZmFlbmdlciwKKyAgICAgICAgICAgICAgICAgICJTbyB2aWVsIGthbm5zdCBEdSBpbSBNb21lbnQgbmljaHQgdHJpbmtlbi5cbiIpOworICAgIGVsc2UgaWYgKHJlc3VsdCAmIEhDX01BWF9BTENPSE9MX1JFQUNIRUQpCisgICAgICB0ZWxsX29iamVjdChlbXBmYWVuZ2VyLAorICAgICAgICAgICAgICAgICAgIlNvdmllbCBBbGtvaG9sIHZlcnRyYWVnc3QgRHUgbmljaHQgbWVoci5cbiIpOworICAgIHJldHVybiAtMzsKKyAgfQorCisgIC8qIEdlemFobHQgd2lyZCBhdWNoIHNvZm9ydCAqLworICBzdW0gKz0gRG9QYXkoaWRlbnQsIHphaGxlciwgZW1wZmFlbmdlciwgZW50cnlpbmZvKTsKKworICAvKiBGUHMgZ2lidHMgYXVjaCBzb2ZvcnQgKi8KKyAgaWYgKHphaGxlciA9PSBlbXBmYWVuZ2VyKQorICAgIEdpdmVFUChFUF9QVUIsbWVudV9saXN0W2lkZW50LFBNX0lEU11bMF0pOworCisgIC8qIEZhbGxzIGRpZSBBbnphaGwgZGVzIEJlc3RlbGx0ZW4gYmVzY2hyYWVua3QgaXN0LCBtdXNzIGRpZXNlIG5hdHVlcmxpY2gKKyAgICogYW5nZXBhc3N0IHdlcmRlbi4KKyAgICovCisgIGlmICggYXZiIT1QUl9OT05FICkKKyAgICBEZWNyZWFzZUF2YWlsYWJpbGl0eShpZGVudCxhdmIpOworCisgIC8qIEdpYnQgZXMgZWluZSBaZWl0dmVyem9lZ2VydW5nIHp3aXNjaGVuIEJlc3RlbGxlbiB1bmQgU2VydmllcmVuPyAqLworICBlbnRyeWluZm9bUE1fREVMQVlfUFVCTUFTVEVSXSA9IGV2YWxfYW55dGhpbmcobWVudV9saXN0W2lkZW50LCBQTV9ERUxBWV0sIHphaGxlcik7CisKKyAgLy8gYWxsZSBmdWVyIGVpbmVuIERyaW5rIG5vdHdlbmRpZ2VuIFdlcnRlIGtvcGllcmVuCisgIF9jb3B5X21lbnVsaXN0X3ZhbHVlcyhlbnRyeWluZm8sIGlkZW50KTsKKworICBpZiAoZW50cnlpbmZvW1BNX0RFTEFZX1BVQk1BU1RFUl08PTApCisgICAgcmV0dXJuIGRvX2RlbGl2ZXIoaWRlbnQsemFobGVyLGVtcGZhZW5nZXIsZW50cnlpbmZvKTsKKworICAvKiBCZXN0ZWxsLU1lbGR1bmcgYXVzZ2ViZW4gKi8KKyAgaWYgKGNsb3N1cmVwKGVudHJ5aW5mb1tQTV9ERUxBWV9NU0ddKSkKKyAgICBmdW5jYWxsKGVudHJ5aW5mb1tQTV9ERUxBWV9NU0ddLCB6YWhsZXIsIGVtcGZhZW5nZXIsaWRlbnQsIGVudHJ5aW5mbyk7CisgIGVsc2UgaWYgKHN0cmluZ3AoZW50cnlpbmZvW1BNX0RFTEFZX01TR10pICYmCisgICAgICAgICAgIGZ1bmN0aW9uX2V4aXN0cyhlbnRyeWluZm9bUE1fREVMQVlfTVNHXSxNRSkpCisgICAgY2FsbF9vdGhlcihNRSwgZW50cnlpbmZvW1BNX0RFTEFZX01TR10sIHphaGxlciwgZW1wZmFlbmdlciwgaWRlbnQsCisgICAgICAgICAgICAgICBlbnRyeWluZm8pOworICBlbHNlIGlmIChwb2ludGVycChlbnRyeWluZm9bUE1fREVMQVlfTVNHXSkgJiYKKyAgICAgICAgICAgc2l6ZW9mKGVudHJ5aW5mb1tQTV9ERUxBWV9NU0ddKT49MikgeworICAgIGlmIChzdHJpbmdwKGVudHJ5aW5mb1tQTV9ERUxBWV9NU0ddWzBdKSAmJgorICAgICAgIHNpemVvZihlbnRyeWluZm9bUE1fREVMQVlfTVNHXVswXSkpCisgICAgICB0ZWxsX29iamVjdChlbXBmYWVuZ2VyLAorICAgICAgICBtZXNzKGVudHJ5aW5mb1tQTV9ERUxBWV9NU0ddWzBdKyJcbiIsZW1wZmFlbmdlcikpOworICAgIGlmIChzdHJpbmdwKGVudHJ5aW5mb1tQTV9ERUxBWV9NU0ddWzFdKSAmJgorICAgICAgICBzaXplb2YoZW50cnlpbmZvW1BNX0RFTEFZX01TR11bMV0pKQorICAgICAgdGVsbF9yb29tKGVudmlyb25tZW50KGVtcGZhZW5nZXIpfHxNRSwKKyAgICAgICAgbWVzcyhlbnRyeWluZm9bUE1fREVMQVlfTVNHXVsxXSsiXG4iLGVtcGZhZW5nZXIpLAorICAgICAgICAoe2VtcGZhZW5nZXJ9KSApOworICB9CisKKyAgd2FpdGluZyArPSAoeyBlbXBmYWVuZ2VyIH0pOworICBjYWxsX291dCgiZG9fZGVsaXZlciIsIGVudHJ5aW5mb1tQTV9ERUxBWV9QVUJNQVNURVJdLAorICAgICAgICAgICBpZGVudCwgemFobGVyLCBlbXBmYWVuZ2VyLCBlbnRyeWluZm8pOworCisgIHJldHVybiAxOworfQorCisvKiBSdWVja2dhYmV3ZXJlOiAwOiBOaWNodCBpbSBNZW51ZSBnZWZ1bmRlLCAxIHNvbnN0ICovCitpbnQgc2VhcmNoX3doYXQoc3RyaW5nIHN0cixvYmplY3QgemFobGVyLG9iamVjdCBlbXBmYWVuZ2VyKQoreyBzdHJpbmcgaWRlbnQ7CisKKyAgaWYgKCBtZW1iZXIod2FpdGluZyxlbXBmYWVuZ2VyKSE9LTEgKQorICB7CisgICAgaWYgKCBQTD09ZW1wZmFlbmdlciApCisgICAgICB3cml0ZSgiRHUgd2FydGVzdCBkb2NoIG5vY2ggYXVmIGV0d2FzIVxuIik7CisgICAgZWxzZQorICAgICAgd3JpdGUoZW1wZmFlbmdlci0+TmFtZShXRVIsMikrIiB3YXJ0ZXQgbm9jaCBhdWYgZXR3YXMuXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHN0ciA9IGxvd2VyX2Nhc2Uoc3RyKTsKKyAgaWYgKCBpZGVudD1pZF9saXN0W3N0cl0gKQorICB7CisgICAgY29uc3VtZV9zb21ldGhpbmcoaWRlbnQsemFobGVyLGVtcGZhZW5nZXIpOworICAgIHJldHVybiAxOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8vIE5ldWUgVmVyc2lvbiB2b24gTWVzaToKK2ludCBzcGVuZGllcmUoc3RyaW5nIHN0cikKK3sKKyAgIF9ub3RpZnlfZmFpbCgic3BlbmRpZXJlIDxzcGllbGVyPiA8ZHJpbms+XG4iKTsKKworICAgaWYgKCAhc3RyaW5ncChzdHIpIHx8IHN0cj09IiIgKQorICAgICByZXR1cm4gMDsKKworICAgc3RyaW5nIHdobyx3aGF0OworICAgaW50IHdob2lkeDsKKworICAgaWYgKHNzY2FuZihzdHIsIiVzICVkICVzIix3aG8sd2hvaWR4LHdoYXQpIT0zCisgICAgJiYgc3NjYW5mKHN0ciwiJXMgJXMiLHdobyx3aGF0KSE9MikKKyAgICAgIHJldHVybiAwOworICBvYmplY3QgdGFyZ2V0PXByZXNlbnQod2hvLCB3aG9pZHgpOworICBpZighdGFyZ2V0ICYmIHRoaXNfcGxheWVyKCkpIHRhcmdldD1wcmVzZW50KHdobywgd2hvaWR4LCB0aGlzX3BsYXllcigpKTsKKyAgIGlmICggIXRhcmdldCB8fCAhbGl2aW5nKHRhcmdldCkgKQorICAgeworICAgICB3cml0ZSgiRGFzIExlYmV3ZXNlbiBpc3QgbmljaHQgaGllci4uLlxuIik7CisgICAgIHJldHVybiAxOworICAgfQorCisgICBub3RpZnlfZmFpbCgoc3RyaW5nKVF1ZXJ5UHJvcChQX1BVQl9OT1RfT05fTUVOVSl8fCJTbyBldHdhcyBnaWJ0IGVzIGhpZXIgbmljaHQhXG4iKTsKKworICAgcmV0dXJuIHNlYXJjaF93aGF0KHdoYXQsUEwsdGFyZ2V0KTsKK30KKworaW50IGJlc3RlbGxlKHN0cmluZyBzdHIpCit7CisgIG5vdGlmeV9mYWlsKChzdHJpbmcpUXVlcnlQcm9wKFBfUFVCX05PVF9PTl9NRU5VKSk7CisKKyAgaWYgKCAhc3RyaW5ncChzdHIpICkKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gc2VhcmNoX3doYXQoc3RyLFBMLFBMKTsKK30KKworaW50IHB1YmluaXQoKQoreyBzdHJpbmcgICpsaXN0ZSxpZGVudCxmbjsKKyAgaW50ICAgICBzaSxlcmcsbWF4OworICBtYXBwaW5nIG1pbmZvLHhpbmZvOworCisgIGlmICggIVBMIHx8ICFJU19XSVpBUkQoUEwpICkKKyAgICByZXR1cm4gMDsKKworICBzaT1zaXplb2YobGlzdGU9c29ydF9hcnJheShtX2luZGljZXMobWVudV9saXN0KSwjJzwpKTsKKyAgaWYgKCBzaTwxICkKKyAgICByZXR1cm4gbm90aWZ5X2ZhaWwoIktlaW5lIEdlcmljaHRlL0dldHJhZW5rZSB2b3JoYW5kZW4uXG4iKSwwOworCisgIGZuPW9sZF9leHBsb2RlKG9iamVjdF9uYW1lKE1FKSwiIyIpWzBdOworICBwcmludGYoIlxuJSdfJ3wzMHMgJTNzICUzcyAlM3MgJTVzICUycyAlMnMgJTNzICUzcyAlNHMgJTNzXG4iLAorICAgICJJVEVNIiwiQUxDIiwiRFJJIiwiRk9PIiwiVkFMVUUiLCJSVCIsIkRMIiwiX0hQIiwiX1NQIiwiVEVTVCIsIk1BWCIpOworICBmb3IgKCAtLXNpIDsgc2k+PTAgOyBzaS0tICkKKyAgeworICAgIGlkZW50PWxpc3RlW3NpXTsKKyAgICBtaW5mbz1kZWVwX2NvcHkobWVudV9saXN0W2lkZW50LFBNX0lORk9dKTsKKworICAgIGlmICggKHhpbmZvPWFkanVzdF9pbmZvKGlkZW50LG1pbmZvLFBMLFBMKSkgJiYgbWFwcGluZ3AoeGluZm8pICkKKyAgICAgIG1pbmZvKz14aW5mbzsKKworICAgIG1pbmZvW1BfVkFMVUVdICAgPSBldmFsX2FueXRoaW5nKG1pbmZvW1BfVkFMVUVdLCAgICAgICAgICAgIFBMKTsKKyAgICBtaW5mb1tQX0ZPT0RdICAgID0gZXZhbF9hbnl0aGluZyhtaW5mb1tQX0ZPT0RdLCAgICAgICAgICAgICBQTCk7CisgICAgbWluZm9bUF9BTENPSE9MXSA9IGV2YWxfYW55dGhpbmcobWluZm9bUF9BTENPSE9MXSwgICAgICAgICAgUEwpOworICAgIG1pbmZvW1BfRFJJTktdICAgPSBldmFsX2FueXRoaW5nKG1pbmZvW1BfRFJJTktdLCAgICAgICAgICAgIFBMKTsKKyAgICBtaW5mb1tQTV9ERUxBWV9QVUJNQVNURVJdCisgICAgICAgICAgICAgICAgICAgICA9IGV2YWxfYW55dGhpbmcobWVudV9saXN0W2lkZW50LFBNX0RFTEFZXSwgUEwpOworICAgIG1pbmZvW1BNX1JBVEVfUFVCTUFTVEVSXQorICAgICAgICAgICAgICAgICAgICAgPSBldmFsX2FueXRoaW5nKG1lbnVfbGlzdFtpZGVudCxQTV9SQVRFXSwgIFBMKTsKKyAgICBtaW5mb1tQX0hQXSAgICAgID0gZXZhbF9hbnl0aGluZyhtaW5mb1tQX0hQXSwgICAgICAgICAgICAgICBQTCk7CisgICAgbWluZm9bUF9TUF0gICAgICA9IGV2YWxfYW55dGhpbmcobWluZm9bUF9TUF0sICAgICAgICAgICAgICAgUEwpOworICAgIGVyZz1QVUJNQVNURVItPlJlZ2lzdGVySXRlbShtZW51X2xpc3RbaWRlbnQsMF0sbWluZm8pOworICAgIG1heD1QVUJNQVNURVItPkNhbGNNYXgobWluZm8sZm4pOworCisgICAgcHJpbnRmKCIlLScuLiczMC4zMHMgJTNkICUzZCAlM2QgJTVkICUyZCAlMmQgJTNkICUzZCAlfDRzICUzZFxuIiwKKyAgICAgIG1lbnVfbGlzdFtpZGVudCxQTV9URVhUXSwKKyAgICAgIG1pbmZvW1BfQUxDT0hPTF0sIG1pbmZvW1BfRFJJTktdLCBtaW5mb1tQX0ZPT0RdLAorICAgICAgbWluZm9bUF9WQUxVRV0sCisgICAgICBtaW5mb1tQTV9SQVRFX1BVQk1BU1RFUl0sCisgICAgICBtaW5mb1tQTV9ERUxBWV9QVUJNQVNURVJdLAorICAgICAgbWluZm9bUF9IUF0sIG1pbmZvW1BfU1BdLAorICAgICAgKCBlcmcgPyAiT0siIDogIkZBSUwiICksbWF4KTsKKyAgfQorICB3cml0ZSgiRG9uZS5cbiIpOworICByZXR1cm4gMTsKK30KKwordm9pZCByZXNldCgpCit7CisgIGlmICggc3VtPjAgKQorICAgIFpFTlRSQUxCQU5LLT5QYXlJbihzdW0pOworICBzdW09MDsKKyAgcmVmcmVzaF9jb3VudCsrOworICBVcGRhdGVBdmFpbGFiaWxpdHkoKTsKK30KKwordm9pZCBhZGRfZ2x1ZWh3ZWluKCkKK3sKKyAgaWYgKCBjdGltZSh0aW1lKCkpWzQuLjZdPT0iRGVjIiApCisgICAgQWRkVG9NZW51KCAiR2x1ZWh3ZWluIiwoeyJnbHVlaHdlaW4ifSksKFsKKyAgICAgIFBfVkFMVUUgICA6IDgwLAorICAgICAgUF9EUklOSyAgIDogIDUsCisgICAgICBQX0FMQ09IT0wgOiAyMCwKKyAgICAgIFBfSFAgICAgICA6IDE1LAorICAgICAgUF9TUCAgICAgIDogMTUgXSksMiwoeworICAgICAgKCJEdSB0cmlua3N0IGVpbiBHbGFzIEdsdWVod2VpbiwgYW4gZGVtIER1IERpciBiZWluYWhlIGRpZSBadW5nZSAiKworICAgICAgICJ2ZXJicmVubnN0LlxuIiksCisgICAgICAoIiYmIGJlc3RlbGx0IGVpbiBHbGFzIEdsdWVod2VpbiB1bmQgdmVyYnJlbm50IHNpY2ggYmVpbVxuIisKKyAgICAgICAiVHJpbmtlbiBiZWluYWhlIGRpZSBadW5nZS5cbiIpIH0pLCAwLCAwLCAwKTsKK30KKwordm9pZCBhZGRfc3RkX2RyaW5rcygpCit7CisgIGlmICggUXVlcnlQcm9wKFBfTk9fU1REX0RSSU5LKSApCisgICAgcmV0dXJuIDsKKyAgYWRkX2dsdWVod2VpbigpOworfQorCittYXBwaW5nIHF1ZXJ5X21lbnVsaXN0KCkKK3sKKyAgcmV0dXJuIGRlZXBfY29weShtZW51X2xpc3QpOworfQorCitzdHJpbmcgKnF1ZXJ5X2RyaW5rcygpCit7CisgIHN0cmluZyAqZHI9KHt9KTsKKyAgZm9yZWFjaCggc3RyaW5nIGlkZW50LCBzdHJpbmcgbWVudWV0ZXh0LCBtYXBwaW5nIG1pbmZvOiBtZW51X2xpc3QpIHsKKyAgICBpZiAoZXZhbF9hbnl0aGluZyhtaW5mb1tQX0RSSU5LXSwgMCkpCisgICAgICBkciArPSAoeyBpZGVudCB9KTsKKyAgfQorICByZXR1cm4gZHI7Cit9CisKK3N0cmluZyAqcXVlcnlfZm9vZCgpCit7CisgIHN0cmluZyAqZm89KHt9KTsKKyAgZm9yZWFjaCggc3RyaW5nIGlkZW50LCBzdHJpbmcgbWVudWV0ZXh0LCBtYXBwaW5nIG1pbmZvOiBtZW51X2xpc3QpIHsKKyAgICBpZiAoZXZhbF9hbnl0aGluZyhtaW5mb1tQX0ZPT0RdLCAwKSkKKyAgICAgIGZvICs9ICh7IGlkZW50IH0pOworICB9CisgIHJldHVybiBmbzsKK30KZGlmZiAtLWdpdCBhL3N0ZC9yb29tL3Jlc3RyaWN0aW9ucy5jIGIvc3RkL3Jvb20vcmVzdHJpY3Rpb25zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE1MGM5ZQotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9yb29tL3Jlc3RyaWN0aW9ucy5jCkBAIC0wLDAgKzEsNjEgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyByb29tL3Jlc3RyaWN0aW9ucy5jIC0tIHdlaWdodCBwcm9wZXJ0eSBoYW5kbGluZyBmb3Igcm9vbXMKKy8vCisvLyAkSWQ6IHJlc3RyaWN0aW9ucy5jIDkwMjAgMjAxNS0wMS0xMCAyMTo0OTo0MVogWmVzc3RyYSAkCisKK2luaGVyaXQgInN0ZC9jb250YWluZXIvcmVzdHJpY3Rpb25zIjsKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgcGVkYW50aWMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKworLy8jZGVmaW5lIE5FRURfUFJPVE9UWVBFUworCisjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKworc3RhdGljIGludCBfc2V0X3dlaWdodChpbnQgdyk7CitzdGF0aWMgaW50IF9xdWVyeV93ZWlnaHQoKTsKK3N0YXRpYyBpbnQgX3NldF90b3RhbF93ZWlnaHQoaW50IHcpOworc3RhdGljIGludCBfcXVlcnlfdG90YWxfd2VpZ2h0KCk7CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgU2V0KFBfV0VJR0hULFBST1RFQ1RFRCxGX01PREUpOworICBTZXQoUF9UT1RBTF9XRUlHSFQsUFJPVEVDVEVELEZfTU9ERSk7Cit9CisKK2ludCBNYXlBZGRXZWlnaHQoaW50IHcpCit7CisgIHJldHVybiAwOworfQorCitpbnQgTWF5QWRkT2JqZWN0KG9iamVjdCBvYikKK3sgIHJldHVybiAxOyAgfQorCitpbnQgUHJldmVudEluc2VydChvYmplY3Qgb2IpCit7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9zZXRfd2VpZ2h0KGludCB3KQoreworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfcXVlcnlfd2VpZ2h0KCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX3NldF90b3RhbF93ZWlnaHQoaW50IHcpCit7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9xdWVyeV90b3RhbF93ZWlnaHQoKQoreworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3N0ZC9yb29tL3Nob3AuYyBiL3N0ZC9yb29tL3Nob3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDI5MTI3Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkL3Jvb20vc2hvcC5jCkBAIC0wLDAgKzEsMTExMCBAQAorI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSBwZWRhbnRpYworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorCitpbmhlcml0ICIvc3RkL3RyYWRpbmdfcHJpY2UiOworCisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPHRoaW5nL2NvbW1hbmRzLmg+CisjaW5jbHVkZSA8dGhpbmcvZGVzY3JpcHRpb24uaD4KKyN1bmRlZiBORUVEX1BST1RPVFlQRVMKKworI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8cm9vbXMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPHJvdXRpbmdkLmg+CisjaW5jbHVkZSA8YmFuay5oPgorI2luY2x1ZGUgPGNvbWJhdC5oPgorI2luY2x1ZGUgPGlucHV0X3RvLmg+CisjaW5jbHVkZSA8dW5pdC5oPgorI2luY2x1ZGUgPG1vbmV5Lmg+CisKKy8vIFRPRE86IHBydWVmZW4sIHVtIGRpZSBWYXJpYWJsZW4gcHJpdmF0ZSBzZWluIGtvZW5uZW4uCisKKy8vIGFsbGdlbWVpbiBiZW5vZXRpZ2UgVmFyaWFibGVuCitub3NhdmUgc3RyaW5nIHN0b3JhZ2U7IC8vIEZpbGVuYW1lIGRlcyBTdG9yZXMgaW4gZGVtIGRpZSBPYmpla3RlIGxhZ2Vybi4uLgorbm9zYXZlIG1hcHBpbmcgb2JfYW56OyAvLyB3aWUgb2Z0IGlzdCBlaW4gT2JqZWt0IGltIExhZGVuIHZvcmhhbmRlbj8KKworLy8gSmV0enQgVmFyaWFibGVuIGZ1ZXIgc3RhZW5kaWcgdmVyZnVlZ2JhcmUgT2JqZWt0ZToKK25vc2F2ZSBzdHJpbmcgKmZpeGVkX29iajsgLy8gTGlzdGUgZGVyIHN0YWVuZGlnIHZlcmZ1ZWdiYXJlbiBPYmpla3RlCitub3NhdmUgbWFwcGluZyBmaXhlZF92YWx1ZTsgLy8gUHJlaXNlIGJlaSBTb25kZXJhbmdlYm90ZW4KK25vc2F2ZSBtYXBwaW5nIGZpeGVkX2lkczsgICAvLyBJZHMKKwordmFyYXJncyB2b2lkIEFkZEZpeGVkT2JqZWN0KHN0cmluZyBzdHIsIGludCB2YWwsIHN0cmluZ3xzdHJpbmcqIGlkcykKK3sKKyAgaW50IGk7CisKKyAgLy8gQWNodHVuZywgYmVpIHNvbGNoZW4gT2JqZWt0ZW4gbXVzcyBkaWUgQmx1ZXByaW50IGluaXRpYWxpc2llcnQgd2VyZGVuIQorICBpZiAoIXN0cikgcmV0dXJuOworICBpZiAoIXZhbCkgdmFsPXN0ci0+UXVlcnlQcm9wKFBfVkFMVUUpOworICBpZiAoIWlkcykKKyAgeworICAgIGlmIChzdHItPlF1ZXJ5UHJvcCgidV9pZHMiKSkgLy8gdW5pdHMgaGFiZW4ga2VpbmUgUF9JRFMKKyAgICAgIGlkcz1zdHItPlF1ZXJ5UHJvcCgidV9pZHMiKVswXTsKKyAgICBlbHNlCisgICAgICBpZHM9c3RyLT5RdWVyeVByb3AoUF9JRFMpOworICB9CisgIGlmICghcG9pbnRlcnAoaWRzKSkKKyAgeworICAgIGlmIChzdHJpbmdwKGlkcykpCisgICAgICBpZHM9KHtpZHN9KTsKKyAgICBlbHNlCisgICAgICBpZHM9KHt9KTsKKyAgfQorCisgIGZpeGVkX29iaiArPSAoe3N0cn0pOworICBmaXhlZF92YWx1ZVtzdHJdID0gdmFsOworICAvLyBBbGxlIElEcyBlbnRmZXJuZW4sIGRpZSBTb25kZXJ6ZWljaGVuIGVudGhhbHRlbi4gRGllIGtvZW5udGUgZWluIFNwaWVsZXIKKyAgLy8gYmVpICJrYXVmZSIgb2huZWhpbiBuaWNodCBlaW5nZWJlbi4KKyAgaWRzIC09IHJlZ2V4cChpZHMsICJbXGJcblxyXHRdIik7CisgIGZvcmVhY2goc3RyaW5nIGlkIDogaWRzKQorICB7CisgICAgLy8gTnVyIElEcyBhdWZuZWhtZW4sIGRpZSBrZWluZSBHcm9zc2J1Y2hzdGFiZW4gZW50aGFsdGVuLCBkYSBTcGllbGVyCisgICAgLy8gZGllc2UgZWJlbmZhbGxzIG5pY2h0IGVpbmdlYmVuIGtvZW5udGUuCisgICAgaWYgKCBsb3dlcnN0cmluZyhpZCkgPT0gaWQgKQorICAgICAgZml4ZWRfaWRzW2lkXT1zdHI7CisgIH0KK30KKwordm9pZCBSZW1vdmVGaXhlZE9iamVjdChzdHJpbmcgZmlsZW5hbWUpCit7CisgIGlmKCAhc3RyaW5ncChmaWxlbmFtZSkgfHwgIXNpemVvZihmaXhlZF9vYmopKQorICAgIHJldHVybjsKKyAgaWYoIG1lbWJlcihmaXhlZF9vYmosIGZpbGVuYW1lKT09LTEgKQorICAgIHJldHVybjsKKworICBmaXhlZF9vYmogLT0gKHsgZmlsZW5hbWUgfSk7CisgIG1fZGVsZXRlKGZpeGVkX3ZhbHVlLCBmaWxlbmFtZSk7CisKKyAgZm9yZWFjaChzdHJpbmcgaWQsIHN0cmluZyBmaWxlIDogZml4ZWRfaWRzKQorICB7CisgICAgaWYgKCBmaWxlID09IGZpbGVuYW1lICkKKyAgICAgIG1fZGVsZXRlKGZpeGVkX2lkcywgaWQpOworICB9Cit9CisKK3N0YXRpYyBzdHJpbmcgU2V0U3RvcmFnZVJvb20oc3RyaW5nIHN0cikKK3sKKyAgaWYgKHN0ciAmJiBzdHJpbmdwKHN0cikpIHJldHVybiBzdG9yYWdlPXN0cjsKKyAgcmV0dXJuIDA7Cit9CisKK3N0cmluZyBRdWVyeVN0b3JhZ2VSb29tKCkKK3sgICByZXR1cm4gc3RvcmFnZTsgICB9CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgIG9iamVjdCByb3V0ZXI7CisgIAorICBpZiAob2JqZWN0X25hbWUodGhpc19vYmplY3QoKSkgPT0gX19GSUxFX19bMC4uPDNdKQorICB7CisgICAgc2V0X25leHRfcmVzZXQoLTEpOworICAgIHJldHVybjsKKyAgfQorCisgIHRyYWRpbmdfcHJpY2U6OmNyZWF0ZSgpOworCisgIFNldFByb3AoIFBfTkFNRSwgIkhhZW5kbGVyIiApOworICBTZXRQcm9wKCBQX0dFTkRFUiwgTUFMRSApOworICBTZXRQcm9wKCBQX1JPT01fVFlQRSwgUXVlcnlQcm9wKFBfUk9PTV9UWVBFKSB8IFJUX1NIT1AgKTsKKworICBBZGRDbWQoInplaWdlIiwibGlzdCIpOworICBBZGRDbWQoKHsia2F1ZiIsImthdWZlIiwiYmVzdGVsbCIsImJlc3RlbGxlIn0pLCJidXkiKTsKKyAgQWRkQ21kKCh7InZlcmthdWYiLCJ2ZXJrYXVmZSIsInZlcmsifSksInNlbGwiKTsKKyAgQWRkQ21kKCh7InZlcnNldHoiLCJ2ZXJzZXR6ZSJ9KSwiZm9yY2Vfc2VsbCIpOworICBBZGRDbWQoKHsic2NoYWV0eiIsInNjaGFldHplIn0pLCJldmFsdWF0ZSIpOworICBBZGRDbWQoKHsidW50ZXJzdWNoZSIsInVudCJ9KSwgInNob3dfb2JqIik7CisKKyAgU2V0VHJhZGluZ0RhdGEoNTAwMDAsMzAwLDMpOworCisgIG9iX2Fuej0oW10pOworICBmaXhlZF9vYmo9KHt9KTtmaXhlZF92YWx1ZT0oW10pO2ZpeGVkX2lkcz0oW10pOworCisgIEFkZEZpeGVkT2JqZWN0KEJPRVJTRSwgODAsKHsgImJvZXJzZSIsImdlbGRib2Vyc2UifSkpOworCisgIGlmICghY2xvbmVwKE1FKSAmJiBvYmplY3RwKHJvdXRlcj1maW5kX29iamVjdChST1VURVIpKSkKKyAgICByb3V0ZXItPlJlZ2lzdGVyVGFyZ2V0KFRBUkdFVF9TSE9QLG9iamVjdF9uYW1lKE1FKSk7Cit9CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZV9zdXBlcigpIHsKKyAgc2V0X25leHRfcmVzZXQoLTEpOworfQorCisvLyBMZWdhY3ktVmVyc2lvbiB2b24gR2V0U2hvcEl0ZW1zKCkgZnVlciBkaWUgZXJiZW5kZW4gTGFlZGVuLCBkaWUgYXVmCisvLyBkaWUgRnVua3Rpb24gaW4gZGllc2VyIEZvcm0gYW5nZXdpZXNlbiBzaW5kLgorc3RhdGljIG1peGVkICpHZXRMaXN0KCkKK3sKKyAgb2JqZWN0IHN0b3JlID0gbG9hZF9vYmplY3Qoc3RvcmFnZSk7CisgIHN0b3JlLT5fcmVnaXN0ZXJfc2hvcChNRSk7CisKKyAgbWl4ZWQgKm91dHB1dD0oe30pOworICBpZiAoIW9iamVjdHAoc3RvcmUpKQorICAgIHJldHVybiBvdXRwdXQ7CisKKyAgbWl4ZWQgdG1wID0gbWFwKGZpeGVkX29iaiwgIydsb2FkX29iamVjdCkrYWxsX2ludmVudG9yeShzdG9yZSk7CisgIG1hcHBpbmcgdG1wMiA9IChbXSk7CisgIG1peGVkIHN0cjsKKyAgc3RyaW5nIGNvbXA7CisgIGludCBpOworICBpbnQgcz0xOworCisgIGZvciAoaT1zaXplb2YodG1wKS0xIDsgaT49MCA7IGktLSkKKyAgeworICAgIHN0ciA9ICh7ICh7IHNwcmludGYoIiUtMjUuMjVzJTcuN2QiLAorICAgICAgICAgICAgICAgICAgICAgICAgKHRtcFtpXS0+c2hvcnQoKXx8Ij8/PyIpWzAuLjwzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFF1ZXJ5QnV5VmFsdWUodG1wW2ldLCBQTCkpLAorICAgICAgICAgICAgICAgIHRtcFtpXSB9KSB9KTsKKyAgICBjb21wPXN0clswXVswXVswLi4yNV07CisgICAgaWYgKCF0bXAyW2NvbXBdKQorICAgIHsKKyAgICAgIHRtcDJbY29tcF0gPSBzKys7CisgICAgICBvdXRwdXQgKz0gc3RyOworICAgIH0KKyAgICBlbHNlIG91dHB1dFt0bXAyW2NvbXBdLTFdWzBdID0gc3RyWzBdWzBdOworICB9CisgIHJldHVybiBvdXRwdXQ7Cit9CisKKy8vIExlZ2FjeS1WZXJzaW9uIHZvbiBQcmludExpc3QoKSBmdWVyIGRpZSBlcmJlbmRlbiBMYWVkZW4sIGRpZSBhdWYKKy8vIGRpZSBGdW5rdGlvbiBpbiBkaWVzZXIgRm9ybSBhbmdld2llc2VuIHNpbmQuCitzdGF0aWMgaW50IERvTGlzdChzdHJpbmcgcXVlcnlfZnVuKQoreworICBtaXhlZCogb3V0cHV0PUdldExpc3QoKTsKKyAgaW50IHNpID0gc2l6ZW9mKG91dHB1dCk7CisgIGlmICghc2kpCisgIHsKKyAgICB3cml0ZSgiSW0gTW9tZW50IHNpbmQgd2lyIGxlaWRlciBWT0VMTElHIGF1c3ZlcmthdWZ0IVxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgc3RyaW5nIG91dD0iIjsKKyAgaW50IGk7CisgIGludCBpbmRlbnQ7CisgIGZvciAoaT0wOyBpPHNpOyBpKyspCisgIHsKKyAgICBpZiAoY2FsbF9vdGhlcihNRSwgcXVlcnlfZnVuLCBvdXRwdXRbaV1bMV0pKQorICAgIHsKKyAgICAgIGluZGVudCA9ICFpbmRlbnQ7CisgICAgICBvdXQgKz0gc3ByaW50ZigiJTNkLiAlcyIsIGkrMSwgb3V0cHV0W2ldWzBdKTsKKyAgICAgIGlmICghaW5kZW50KQorICAgICAgICBvdXQgKz0gIlxuIjsKKyAgICAgIGVsc2Ugb3V0ICs9ICIgfCAiOworICAgIH0KKyAgfQorICBpZiAoaW5kZW50KQorICAgIG91dCs9IlxuIjsKKyAgUEwtPk1vcmUob3V0KTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIExpZWZlcnQgZWluZSBMaXN0ZSBkZXIgT2JqZWt0ZSB6dXJ1ZWNrLCBkaWUgZ2VyYWRlIGltIFN0b3JhZ2UgbGllZ2VuLAorLy8gcHJvIEJsdWVwcmludCBqZXdlaWxzIGVpbnMuCitwcm90ZWN0ZWQgb2JqZWN0KiBHZXRTaG9wSXRlbXMoKQoreworICBvYmplY3Qgc3RvcmUgPSBsb2FkX29iamVjdChzdG9yYWdlKTsKKyAgc3RvcmUtPl9yZWdpc3Rlcl9zaG9wKE1FKTsKKyAgb2JqZWN0KiBvdXRwdXQgPSAoe30pOworICBvYmplY3QqIGFsbF9pdGVtcyA9IGFsbF9pbnZlbnRvcnkoc3RvcmUpOworCisgIC8vIFdpciBicmF1Y2hlbiBlaW5lIExpc3RlLCBkaWUgdm9uIGplZGVyIEJsdWVwcmludCBudXIgZWluZW4gQ2xvbmUKKyAgLy8gZW50aGFlbHQuIERhaGVyIHdlcmRlbiBkaWUgTGFkZW5hbWVuIGRlciBPYmpla3RlIGFscyBLZXlzIGltIE1hcHBpbmcKKyAgLy8gPGl0ZW1zPiB2ZXJ3ZW5kZXQgdW5kIGpld2VpbHMgZGVyIGFrdHVlbGxlIENsb25lIGFscyBWYWx1ZSB6dWdlb3JkbmV0LgorICBtYXBwaW5nIGl0ZW1zID0gbV9hbGxvY2F0ZShzaXplb2YoYWxsX2l0ZW1zKSk7CisgIGZvcmVhY2gob2JqZWN0IG9iOiBhbGxfaXRlbXMpCisgIHsKKyAgICBpdGVtc1tsb2FkX25hbWUob2IpXSA9IG9iOworICB9CisgIC8vIERpZSBGaXhlZCBPYmplY3RzIHdlcmRlbiBhbnMgRW5kZSBhbmdlaGFlbmd0LCBkYW1pdCBpbiBkZW0gRmFsbCwgZGFzcworICAvLyBlaW4gQ2xvbmUgZWluZXMgc29sY2hlbiBPYmpla3RlcyBpbSBMYWdlciBsaWVndCwgZGllc2VyIHp1ZXJzdCB2ZXJrYXVmdAorICAvLyB3aXJkIHVuZCBuaWNodCBpbW1lciB3aWVkZXIgZWluIG5ldWVyIGVyc3RlbGx0IHdpcmQuCisgIHJldHVybiBtX3ZhbHVlcyhpdGVtcykgKyBtYXAoZml4ZWRfb2JqLCAjJ2xvYWRfb2JqZWN0KTsKK30KKworI2RlZmluZSBMSVNUX0xPTkcgIDEKKyNkZWZpbmUgTElTVF9TSE9SVCAwCisKKy8vIEt1ZW1tZXJ0IHNpY2ggdW0gZGllIExpc3RlbmF1c2dhYmUgZnVlciBkZW4gQmVmZWhsICJ6ZWlnZSIKK3ZhcmFyZ3MgcHJvdGVjdGVkIGludCBQcmludExpc3Qoc3RyaW5nIGZpbHRlcl9mdW4sIGludCBsaXN0c3R5bGUpCit7CisgIC8vIEFsbGUgSXRlbXMgaW0gTGFnZXIgaG9sZW4uIFdlbm4ga2VpbmUgdm9yaGFuZGVuLCB0dXQgdW5zIGRhcyBsZWlkLgorICBvYmplY3QgKml0ZW1zX2luX3N0b3JlID0gR2V0U2hvcEl0ZW1zKCk7CisgIGlmICggIXNpemVvZihpdGVtc19pbl9zdG9yZSkgKSB7CisgICAgd3JpdGUoIkltIE1vbWVudCBzaW5kIHdpciBsZWlkZXIgVk9FTExJRyBhdXN2ZXJrYXVmdCFcbiIpOworICAgIHJldHVybiAxOworICB9CisKKyAgLy8gRGFzIExpc3RlbmZvcm1hdCBpc3Qgdm9uIGRlciBTcGllbGVyZWluZ2FiZSBhYmhhZW5naWcuIFd1cmRlICJsYW5nIgorICAvLyBhbmdlZm9yZGVydCwgZ2ViZW4gd2lyIGVpbnNwYWx0aWcgYXVzIG1pdCBncm9lc3NlcmVyIFNwYWx0ZW5icmVpdGUuCisgIC8vIERpZSBTcGFsdGVuYnJlaXRlIHdpcmQgZGFiZWkgdm9uIGRlbSBJdGVtIG1pdCBkZW0gbGFlbmdzdGVuIE5hbWVuIGltCisgIC8vIGdlc2FtdGVuIFNob3AtSW52ZW50YXIgYmVzdGltbXQsIGRhbWl0IG5pY2h0IGJlaSBqZWRlciBUZWlsbGlzdGUKKyAgLy8gKFdhZmZlbiwgUnVlc3R1bmdlbiwgVmVyc2NoaWVkZW5lcykgdW50ZXJzY2hpZWRsaWNoZSBCcmVpdGVuIHJhdXNrb21tZW4uCisgIC8vCisgIC8vIERlciBlcnN0ZSBQYXJhbWV0ZXIgZW50aGFlbHQgZGllIEthdGFsb2dudW1tZXIgZGVzIEl0ZW1zLCBkZXIgendlaXRlCisgIC8vIGRpZSBLdXJ6YmVzY2hyZWlidW5nLCBkZXIgZHJpdHRlIGRlbiBQcmVpcy4KKyAgc3RyaW5nIGxpc3Rmb3JtYXQgPSAiJTNkLiAlLTI1LjI1cyAlNi42ZCI7CisgIGlmICggbGlzdHN0eWxlID09IExJU1RfTE9ORyApCisgIHsKKyAgICBzdHJpbmcqIG5hbWVzID0gc29ydF9hcnJheSgKKyAgICAgICAgICAgICAgICAgICAgICBpdGVtc19pbl9zdG9yZS0+c2hvcnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpbnQgKHN0cmluZyBzMSwgc3RyaW5nIHMyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHNpemVvZihzMSkgPCBzaXplb2YoczIpKTsKKyAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAvLyBXZW5uIGVpbnNwYWx0aWcgYXVzZ2VnZWJlbiB3aXJkLCBzb2xsIGRpZSBMaXN0ZSBuaWNodCBiZWxpZWJpZyBicmVpdAorICAgIC8vIHdlcmRlbi4gRGFoZXIgd2lyZCBkaWUgU2hvcnQgYXVmIDY1IFplaWNoZW4gbGltaXRpZXJ0LgorICAgIGludCBsZW4gPSA2NTsKKyAgICBpZiAoIHNpemVvZihuYW1lcykgKQorICAgICAgbGVuID0gbWluKGxlbiwgc2l6ZW9mKG5hbWVzWzBdKSk7CisgICAgbGlzdGZvcm1hdCA9ICIlM2QuICUtIitsZW4rIi4iK2xlbisicyAlNi42ZCI7CisgIH0KKworICBzdHJpbmcgb3V0PSIiOworICAvLyBWYXJpYWJsZW4sIGRpZSBpbm5lcmhhbGIgZGVyIFNjaGxlaWZlIGJlbm9ldGlndCB3ZXJkZW4uCisgIHN0cmluZyBrdXJ6OworICBpbnQgaW5kZW50LCBwcmVpczsKKyAgb2JqZWN0IGl0ZW07CisgIC8vIFVlYmVyIGRpZSBMaXN0ZSBsYXVmZW4uIDxpPiB3aXJkIGJlbm9ldGlndCwgdW0gZGllIGF1c2dlZ2ViZW5lIExpc3RlCisgIC8vIGtvbnNpc3RlbnQgbnVtZXJpZXJlbiB6dSBrb2VubmVuLCBkYW1pdCBrYXVmZSA8bnI+IGZ1bmt0aW9uaWVydC4KKyAgZm9yZWFjaChpbnQgaSA6IHNpemVvZihpdGVtc19pbl9zdG9yZSkpCisgIHsKKyAgICBpdGVtID0gaXRlbXNfaW5fc3RvcmVbaV07CisgICAgaWYgKCBjYWxsX290aGVyKE1FLCBmaWx0ZXJfZnVuLCBpdGVtKSApCisgICAgeworICAgICAgLy8gS3VyemJlc2NocmVpYnVuZyB1bmQgUHJlaXMgZXJtaXR0ZWxuLiBJdGVtcyBvaG5lIFNob3J0IHdlcmRlbgorICAgICAgLy8gYWxzICI/IiBhbmdlemVpZ3QuCisgICAgICBrdXJ6ID0gKGl0ZW0tPnNob3J0KCkgfHwgIj8/PyIpWzAuLjwzXTsKKyAgICAgIHByZWlzID0gUXVlcnlCdXlWYWx1ZShpdGVtLCBQTCk7CisgICAgICAvLyBCZXNjaHJlaWJ1bmcgZGVzIEl0ZW1zIGFuZnVlZ2VuLgorICAgICAgb3V0ICs9IHNwcmludGYobGlzdGZvcm1hdCwgaSsxLCBrdXJ6LCBwcmVpcyk7CisgICAgICBpbmRlbnQgPSAhaW5kZW50OworICAgICAgLy8gV2VubiBpbmRlbnQgZ2VzZXR6dCBpc3QsIGhhbmRlbHQgZXMgc2ljaCB1bSBkYXMgbGlua2UgSXRlbSBpbiBkZXIKKyAgICAgIC8vIHp3ZWlzcGFsdGlnZW4gTGlzdGUsIGRhbm4gZnVlZ2VuIHdpciBlaW5lbiBTcGFsdGVudHJlbm5lciBhbiwKKyAgICAgIC8vIGFuc29uc3RlbiBpc3QgZXMgZGFzIHJlY2h0ZSwgZGFubiBicmVjaGVuIHdpciB1bS4KKyAgICAgIC8vIEdpbHQgbmF0dWVybGljaCBudXIgZnVlciBrdXJ6ZSBMaXN0ZW4uCisgICAgICBvdXQgKz0gKChpbmRlbnQgJiYgbGlzdHN0eWxlPT1MSVNUX1NIT1JUKT8gIiB8ICIgOiAiXG4iKTsKKyAgICB9CisgIH0KKyAgLy8gV2VubiBkaWUgTGlzdGUgZWluZSB1bmdlcmFkZSBaYWhsIEl0ZW1zIGVudGhhZWx0LCBpc3QgaW4gZGVyIGxldHp0ZW4KKyAgLy8gWmVpbGUgbGlua3MgZWluIEl0ZW0gYXVmZ2VmdWVocnQsIGRhaGVyIG11c3MgZGFuYWNoIHVtYnJvY2hlbiB3ZXJkZW4uCisgIC8vIEdpbHQgbmF0dWVybGljaCBudXIgZnVlciBrdXJ6ZSBMaXN0ZW4KKyAgaWYgKGluZGVudCAmJiBsaXN0c3R5bGU9PUxJU1RfU0hPUlQpCisgICAgb3V0Kz0iXG4iOworCisgIC8vIFZvciBkZW4gTGlzdGVuIHdpcmQgZWluZSBJbmZvLVplaWxlIGF1c2dlZ2ViZW4sIHVtIGdlZmlsdGVydGUgTGlzdGVuCisgIC8vIGtlbm50bGljaCB6dSBtYWNoZW4uIFdpcmQgbmFjaCBkZXIgRmlsdGVydW5nIGRlcyBJbnZlbnRhcnMgZXJ6ZXVndCwKKyAgLy8gdW0gZWluZSBsZWVyZSBNZWxkdW5nIGF1c2dlYmVuIHp1IGtvZW5uZW4sIHdlbm4gbmFjaCBGaWx0ZXJ1bmcgbmljaHRzCisgIC8vIG1laHIgdWVicmlnYmxlaWJ0LgorICBzdHJpbmcgd2FzOworICBzd2l0Y2goZmlsdGVyX2Z1bikKKyAgeworICAgIGNhc2UgIklzQXJtb3VyIjogd2FzID0gIlJ1ZXN0dW5nZW4iOyBicmVhazsKKyAgICBjYXNlICJJc1dlYXBvbiI6IHdhcyA9ICJXYWZmZW4iOyBicmVhazsKKyAgICBjYXNlICJOb1dlYXBvbk5vQXJtb3VyIjoKKyAgICAgICAgIHdhcyA9IChvdXQ9PSIiPyJzb25zdGlnZW4gV2FyZW4iOiJzb25zdGlnZSBXYXJlbiIpOyBicmVhazsKKyAgICBkZWZhdWx0OiB3YXMgPSAiV2FyZW4iOyBicmVhazsKKyAgfQorICAvLyA8b3V0PiBpc3QgZWluIExlZXJzdHJpbmcsIHdlbm4ga2VpbmUgV2FyZW4gZGEgc2luZCwgZGllIGRlbSBGaWx0ZXJrcmktCisgIC8vIHRlcml1bSBlbnRzcHJlY2hlbi4gRGFubiBnaWJ0J3MgZWluZSBlbnRzcHJlY2hlbmRlIE1lbGR1bmcuCisgIGlmICggb3V0ID09ICIiICkKKyAgICBvdXQgPSBzcHJpbnRmKCJMZWlkZXIgc2luZCBtb21lbnRhbiBrZWluZSAlcyBpbSBBbmdlYm90LlxuIiwgd2FzKTsKKyAgZWxzZQorICAgIG91dCA9IHNwcmludGYoIkZvbGdlbmRlICVzIGthbm5zdCBEdSBoaWVyIGthdWZlbjpcbiIsd2FzKSArIG91dDsKKworICBQTC0+TW9yZShvdXQpOworICByZXR1cm4gMTsKK30KKworLy8gSGlsZnNmdW5rdGlvbmVuIHp1bSBGaWx0ZXJuIGRlcyBMYWRlbmludmVudGFycyBmdWVyIGRlbiAiemVpZ2UiLUJlZmVobAorc3RhdGljIGludCBBbHdheXNUcnVlKG9iamVjdCBvYikKK3sgICByZXR1cm4gMTsgICB9CisKK3N0YXRpYyBzdHJpbmcgSXNXZWFwb24ob2JqZWN0IG9iKQoreyAgcmV0dXJuIG9iLT5RdWVyeVByb3AoUF9XRUFQT05fVFlQRSk7ICB9CisKK3N0YXRpYyBzdHJpbmcgSXNBcm1vdXIob2JqZWN0IG9iKQoreyAgcmV0dXJuIG9iLT5RdWVyeVByb3AoUF9BUk1PVVJfVFlQRSk7ICB9CisKK3N0YXRpYyBpbnQgTm9XZWFwb25Ob0FybW91cihvYmplY3Qgb2IpCit7IHJldHVybiAoIW9iLT5RdWVyeVByb3AoUF9XRUFQT05fVFlQRSkgJiYgIW9iLT5RdWVyeVByb3AoUF9BUk1PVVJfVFlQRSkpOyB9CisKKworLy8gRGllc2UgRnVua3Rpb24gaXN0IG9lZmZlbnRsaWNoLCBmYWxscyBNYWdpZXIgYWJmcmFnZW4gd29sbGVuLCBvYiBlaW4gbGFkZW4KKy8vIGVpbiBPYmpla3QgemVyc3RvZXJlbiB3dWVyZGUuIEFiZXI6IEJlbnV0enVuZyBhdWYgZWlnZW5lcyBSaXNpa28hIEVzIHdpcmQKKy8vIG5pY2h0IGdhcmFudGllcnQsIGRhc3MgZGllc2UgRnVua3Rpb24gYnp3LiBpaHIgSW50ZXJmYWNlIHNpY2ggbmljaHQKKy8vIGFlbmRlcnQuCitwdWJsaWMgaW50IENoZWNrRm9yRGVzdHJ1Y3Qob2JqZWN0IG9iKSAvLyBQcnVlZmVuLCBvYiB6ZXJzdG9lcnQgd2VyZGVuIHNvbGwKK3sKKyAgc3RyaW5nIHN0cjsKKyAgLyoKKyAgICogUF9OT0JVWSAtIE9iamVrdGUgYXVmIGplZGVuIEZhbGwgemVyc3RvZXJlbgorICAgKi8KKyAgaWYob2ItPlF1ZXJ5UHJvcChQX05PQlVZKSkgcmV0dXJuIDE7CisgIC8qCisgICAqIEJlc2NoYWVkaWd0ZSBPYmpla3RlIHdlcmRlbiBlYmVuZmFsbHMgemVyc3RvZXJ0CisgICAqLworICBpZihvYi0+UXVlcnlQcm9wKFBfREFNQUdFRCkpIHJldHVybiAxOworICAvKgorICAgKiBSdWVzdHVuZ2VuIHdlbm4gc2llIGEpIGVpbmUgRGVmZW5kRnVuYyBkZWZpbmllcnQgaGFiZW4gb2RlcgorICAgKiAgICAgICAgICAgICAgICAgICAgIGIpIHVlYmVyIGRlciBpbiBLRUVQX0FSTU9VUl9DTEFTUyBkZWZpbmllcnRlbiBBQworICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGxpZWdlbiAoc2llaGUgL3N5cy9jb21iYXQuaCkKKyAgICovCisgIGlmKHN0ciA9IElzQXJtb3VyKG9iKSkKKyAgeworICAgIGlmKG9iamVjdHAob2ItPlF1ZXJ5UHJvcChQX0RFRkVORF9GVU5DKSkpIHJldHVybiAxOworICAgIGlmKG9iLT5RdWVyeVByb3AoUF9BQykgPj0gS0VFUF9BUk1PVVJfQ0xBU1Nbc3RyXSkgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgLyoKKyAgICogV2FmZmVuIHdlbm4gc2llIGEpIDEtaGFlbmRpZyBzaW5kIHVuZCBlaW5lIFdDID4gMTIwIGJlc2l0emVuIG9kZXIKKyAgICogICAgICAgICAgICAgICAgIGIpIDItaGFlbmRpZyBzaW5kIHVuZCBlaW5lIFdDID4gMTUwIGJlc2l0emVuIG9kZXIgYWJlcgorICAgKiAgICAgICAgICAgICAgICAgYykgZWluZSBIaXRGdW5jIGRlZmluaWVydCBoYWJlbgorICAgKi8KKyAgaWYoc3RyID0gSXNXZWFwb24ob2IpKQorICB7CisgICAgaWYob2ItPlF1ZXJ5UHJvcChQX05SX0hBTkRTKSA+IDEgJiYgb2ItPlF1ZXJ5UHJvcChQX1dDKSA+IDE1MCkgcmV0dXJuIDE7CisgICAgaWYob2ItPlF1ZXJ5UHJvcChQX05SX0hBTkRTKSA8IDIgJiYgb2ItPlF1ZXJ5UHJvcChQX1dDKSA+IDEyMCkgcmV0dXJuIDE7CisgICAgaWYob2JqZWN0cChvYi0+UXVlcnlQcm9wKFBfSElUX0ZVTkMpKSkgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGlzdChzdHJpbmcgc3RyKQoreworICBfbm90aWZ5X2ZhaWwoCisgICAgIkJpdHRlICd6ZWlnZScsICd6ZWlnZSB3YWZmZW4nLCAnemVpZ2UgcnVlc3R1bmdlbicgb2RlclxuIgorICAgICInemVpZ2UgdmVyc2NoaWVkZW5lcycgZWluZ2ViZW4uIFdlbm4gRHUgZGFzIFNjaGx1ZXNzZWx3b3J0ICdsYW5nJ1xuIgorICAgICJvZGVyICctMScgYW5oYWVuZ3N0LCB3aXJkIGRpZSBMaXN0ZSBlaW5zcGFsdGlnIGF1c2dlZ2ViZW4uXG4iKTsKKworICBpZiAoIXN0cmluZ3Aoc3RyKSB8fCAhc2l6ZW9mKHN0cikgKQorICAgIHJldHVybiBQcmludExpc3QoIkFsd2F5c1RydWUiKTsKKyAgaWYgKCBzdHIgPT0gImxhbmciIHx8IHN0ciA9PSAiLTEiICkKKyAgICByZXR1cm4gUHJpbnRMaXN0KCJBbHdheXNUcnVlIiwgTElTVF9MT05HKTsKKworICBzdHJpbmcgKnBhcmFtcyA9IGV4cGxvZGUoc3RyLCIgIik7CisgIGlmIChzaXplb2YocGFyYW1zWzBdKTwzKQorICAgIHJldHVybiAwOworCisgIGludCBsaXN0c3R5bGUgPSBMSVNUX1NIT1JUOworICBpZiAoIHNpemVvZihwYXJhbXMpPjEgJiYgcGFyYW1zWzFdID09ICJsYW5nIiApCisgICAgbGlzdHN0eWxlID0gTElTVF9MT05HOworCisgIHN0cj1wYXJhbXNbMF1bMC4uMl07CisgIGlmIChzdHI9PSJ3YWYiKQorICAgIHJldHVybiBQcmludExpc3QoIklzV2VhcG9uIiwgbGlzdHN0eWxlKTsKKyAgaWYgKHN0cj09InZlciIpCisgICAgcmV0dXJuIFByaW50TGlzdCgiTm9XZWFwb25Ob0FybW91ciIsIGxpc3RzdHlsZSk7CisgIGlmIChzdHI9PSJydWUiKQorICAgIHJldHVybiBQcmludExpc3QoIklzQXJtb3VyIiwgbGlzdHN0eWxlKTsKKyAgcmV0dXJuIDA7Cit9CisvKgorc3RhdGljIHZhcmFyZ3MgaW50IFF1ZXJ5QnV5VmFsdWUobWl4ZWQgb2IsIG9iamVjdCBjbGllbnQpCit7CisgIGlmIChvYmplY3RwKG9iKSkKKyAgICByZXR1cm4gdHJhZGluZ19wcmljZTo6UXVlcnlCdXlWYWx1ZShvYiwgY2xpZW50KTsKKyAgcmV0dXJuIChmaXhlZF92YWx1ZVtvYl0qUXVlcnlCdXlGYWN0KGNsaWVudCkpLzEwMDsKK30KKyovCisKK3N0YXRpYyB2YXJhcmdzIGludCBRdWVyeUJ1eVZhbHVlKG9iamVjdCBvYiwgb2JqZWN0IGNsaWVudCkKK3sKKyAgaW50IGZwcmljZSA9IGZpeGVkX3ZhbHVlW2xvYWRfbmFtZShvYildOworCisgIHJldHVybiAoZnByaWNlPjApID8gCisgICAgICAgICBmcHJpY2UqUXVlcnlCdXlGYWN0KGNsaWVudCkvMTAwIDogCisgICAgICAgICB0cmFkaW5nX3ByaWNlOjpRdWVyeUJ1eVZhbHVlKG9iLCBjbGllbnQpOworfQorCitzdGF0aWMgdm9pZCBVcGRhdGVDb3VudGVyKG9iamVjdCBvYiwgaW50IG51bSkKK3sKKyAgc3RyaW5nIHRtcDsKKworICBpZiAoIW51bSB8fCAhb2JqZWN0cChvYikpIHJldHVybjsKKyAgdG1wPUJMVUVfTkFNRShvYik7CisgIGlmICh0bXBbMC4uMl0hPSIvZC8iICYmIHRtcFswLi44XSE9Ii9wbGF5ZXJzLyIpCisgICAgdG1wPW9iLT5zaG9ydCgpK3RtcDsKKyAgb2JfYW56W3RtcF0gKz0gbnVtOworICBpZiAob2JfYW56W3RtcF0gPD0gMCkKKyAgICBtX2RlbGV0ZShvYl9hbnosdG1wKTsKK30KKworcHJvdGVjdGVkIG9iamVjdCBGaW5kSW5TdG9yZShzdHJpbmd8aW50IHgpCit7CisgIG9iamVjdCogbGlzdCA9IEdldFNob3BJdGVtcygpOworICBpZiAoIGludHAoeCkgJiYgeD4wICYmIHg8PXNpemVvZihsaXN0KSApIHsKKyAgICByZXR1cm4gbGlzdFt4LTFdOworICB9CisgIGlmIChzdHJpbmdwKHgpKQorICB7CisgICAgaWYgKCBmaXhlZF9pZHNbeF0gKQorICAgICAgcmV0dXJuIGxvYWRfb2JqZWN0KGZpeGVkX2lkc1t4XSk7CisgICAgbGlzdCA9IGZpbHRlcl9vYmplY3RzKGxpc3QsICJpZCIsIHgpOworICAgIGlmICggc2l6ZW9mKGxpc3QpICkKKyAgICAgIHJldHVybiBsaXN0WzBdOworICAgIC8vIFdlbm4gbml4IGltIFN0b3JlIGdlZnVuZGVuIChkYXMgc2NobGllc3N0IGVpZ2VudGxpY2h0IHNjaG9uIGRpZSBCUHMgZGVyCisgICAgLy8gZml4ZW4gT2JqZWt0ZSBlaW4sIGFiZXIgbmljaHQsIHdlbm4gZGllc2UgbmljaHQga29uZmlndXJpZXJ0IHNpbmQuIEQuaC4KKyAgICAvLyBkaWVzZSBQcnVlZnVuZyBpc3QgZnVlciBuaWNodC1rb25maWd1cmllcnRlIEJQcyksIExpc3RlIGRlcgorICAgIC8vIEZpeGVkT2JqZWN0cyBwcnVlZmVuIHVuZGUgc28gZGllIGV2ZW50dWVsbCBtYW51ZWxsIGluCisgICAgLy8gQWRkRml4ZWRPYmplY3QoKSBhbmdlZ2ViZW5lIExpc3RlIHZvbiBJRHMgYmVydWVja3NpY2h0aWdlbi4KKyAgICBlbHNlIGlmICggZml4ZWRfaWRzW3hdICkKKyAgICAgIHJldHVybiBsb2FkX29iamVjdChmaXhlZF9pZHNbeF0pOworICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RyaW5nIGJ1eV9vYmoobWl4ZWQgb2IsIGludCBzaG9ydCkKK3sgcmV0dXJuIDA7IH0KKworcHJpdmF0ZSB2b2lkIHJlYWxseV9idXkoaW50IHZhbCwgb2JqZWN0IHBsLCBvYmplY3Qgb2IsIGludCB1X3JlcSkKK3sKKyAgLy8gU3RhZW5kaWcgdmVyZnVlZ2JhcmUgT2JqZWt0ZSAoZml4ZWRfb2JqKSBzaW5kIGRhcmFuIGVya2VubmJhciwgZGFzcyBzaWUKKyAgLy8gbmljaHQgaW0gTGFnZXIgbGllZ2VuLiBEYWhlciBoaWVyIGVpbmVuIENsb25lIGVyc3RlbGxlbiwgZGVyIGRhbm4gCisgIC8vIHN0YXR0ZGVzc2VuIHJhdXNnZWdlYmVuIHdpcmQuCisgIGlmICggIXByZXNlbnQob2IsIGZpbmRfb2JqZWN0KHN0b3JhZ2UpKSApCisgICAgb2IgPSBjbG9uZV9vYmplY3Qob2IpOworCisgIC8vIEluIFVuaXRvYmpla3RlbiBVX1JFUSAod2llZGVyKSBzZXR6ZW4gKHdlZ2VuIGlucHV0X3RvIChiZWkgZGVtIHNpY2ggZGFzCisgIC8vIEtvbW1hbmRvdmVyYiBhZW5kZXJ0IHVuZCBkZXN3ZWdlbiBVX1JFUSBnZWxvZXNjaHQgd2lyZCksIHVuZCB3ZWdlbgorICAvLyBLYXVmZW5zIHZvbiBGaXhlZC1PYmpla3QtVW5pdG9iamVrdGVuIChiZWkgZGllc2VuIG11c3MgVV9SRVEgX25hY2hfIGRlbQorICAvLyBDbG9uZW4gaW0gQ2xvbmUgZ2VzZXR6dCB3ZXJkZW4sIG5pY2h0IGF1dG9tYWdpc2NoIGluIGRlciBCUCBkdXJjaCBkZW4KKyAgLy8gQXVmcnVmIHZvbiBpZCgpIHdlaXRlciB2b3JoZXIpLgorICBpZiAodV9yZXE+MCkKKyAgeworICAgIC8vIERhcyBRdWVyeVByb3AoKSBpc3QgbmljaHQgdW5ub2V0aWcuIEJlaSBkZXIgQWJmcmFnZSB2b24gVV9SRVEgd2lyZAorICAgIC8vIFVfUkVRIGdlbnVsbHQsIHdlbm4gZGFzIGFrdHVlbGxlIHF1ZXJ5X3ZlcmIoKSAhPSBkZW0gbGV0enRlbiBpc3QuCisgICAgLy8gQmVpIGRlciBlcnN0ZW4gQWJmcmFnZSB3dWVyZGUgYWxzIGRhcyBoaWVyIGdlc2V0enQgVV9SRVEgd2llZGVyCisgICAgLy8gZ2Vsb2VzY2h0LiBEYWhlciBtdXNzIGRhcyBqZXR6dCBoaWVyIGFscyBlcnN0ZXMgZWlubWFsIGFiZ2VmcmFndAorICAgIC8vIHdlcmRlbi4uLgorICAgICAgb2ItPlF1ZXJ5UHJvcChVX1JFUSk7CisgICAgICBvYi0+U2V0UHJvcChVX1JFUSwgdV9yZXEpOworICB9CisKKyAgcGwtPkFkZE1vbmV5KC12YWwpOworICBfYWRkX21vbmV5KHZhbCk7CisKKyAgaWYgKG9iLT5tb3ZlKHBsLE1fR0VUKSAhPSBNT1ZFX09LKSAvLyBLYW5uIGRlciBTcGllbGVyIGRhcyBPYmpla3QgdHJhZ2VuPworICB7CisgICAgd3JpdGUoYnJlYWtfc3RyaW5nKCJEdSBrYW5uc3QgIitvYi0+bmFtZShXRU4sMSkrIiBuaWNodCBtZWhyIHRyYWdlbi4gIgorICAgICAiSWNoIGxlZ2UgIitvYi0+UXVlcnlQcm9ub3VuKFdFTikrIiBoaWVyIGF1ZiBkZW4gQm9kZW4uIiw3OCwKKyAgICAgTmFtZShXRVIpKyIgc2FndDogIikpOworICAgIG9iLT5tb3ZlKE1FLE1fTk9DSEVDSyk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5laW4gOi0pCisgIH0KKyAgZWxzZQorICB7CisgICAgLy8gRmFsbHMgZGFzIE9iamVrdCBzaWNoIHZlcmVpbmlndCBoYXQsIG11c3MgamV0enQgd2llZGVyIFVfUkVRCisgICAgLy8gcmVzdGF1cmllcnQgd2VyZGVuLgorICAgIG9iLT5TZXRQcm9wKFVfUkVRLCB1X3JlcSk7CisgICAgd3JpdGUoYnJlYWtfc3RyaW5nKCJEdSBrYXVmc3QgIitvYi0+bmFtZShXRU4sMSkrIi4iLCA3OCkpOworICB9CisKKyAgc2F5KGJyZWFrX3N0cmluZyhQTC0+TmFtZShXRVIpKyIga2F1ZnQgIitvYi0+bmFtZShXRU4pKyIuIiw3OCksICh7UEx9KSk7CisgIFVwZGF0ZUNvdW50ZXIob2IsLTEpOworfQorCitzdGF0aWMgdm9pZCBhc2tfYnV5KHN0cmluZyBzdHIsIGludCB2YWwsIG9iamVjdCBwbCwgb2JqZWN0IG9iLCBpbnQgdV9yZXEpCit7CisgIF9ub3RpZnlfZmFpbChicmVha19zdHJpbmcoIkd1dCwgRHUga2FubnN0IGVzIERpciBqYSBqZWRlcnplaXQgIgorICAgIm5vY2ggYW5kZXJzIHVlYmVybGVnZW4uIiw3OCxOYW1lKFdFUikrIiBzYWd0OiAiKSk7CisKKyAgaWYoIXN0ciB8fCAhc3RyaW5ncChzdHIpIHx8IHN0ciA9PSAibmVpbiIgfHwgc3RyID09ICJuIikKKyAgeworICAgIHJldHVybjsKKyAgfQorICBpZihzdHIgIT0gImphIiAmJiBzdHIgIT0gImoiKQorICB7CisgICAgcmV0dXJuOworICB9CisgIHJlYWxseV9idXkodmFsLCBwbCwgb2IsIHVfcmVxKTsKK30KKworc3RhdGljIGludCBidXkoc3RyaW5nIHN0cikKK3sKKyAgaW50IGksIHZhbCwgcGFyLCBkZXg7CisgIG1peGVkIG9iLCByZXM7CisgIHN0cmluZyBkdW1teTsKKworICBpZiAoIXN0cikgeworICAgIHdyaXRlKCJXYXMgd2lsbHN0IER1IGthdWZlbj9cbiIpOworICAgIHJldHVybiAxOworICB9CisKKyAgaWYgKHN0cmluZ3AoUXVlcnlQcm9wKFBfS0VFUEVSKSkgJiYgIXByZXNlbnQoUXVlcnlQcm9wKFBfS0VFUEVSKSwgTUUpKSB7CisgICAgd3JpdGUoIkVzIGlzdCBuaWVtYW5kIGRhLCBkZXIgRGljaCBiZWRpZW5lbiBrb2VubnRlLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBfbm90aWZ5X2ZhaWwoYnJlYWtfc3RyaW5nKCJEYXMga2FubiBpY2ggaW4gbWVpbmVtIExhZ2VyIG5pY2h0IGZpbmRlbi4iLDc4LAorICAgTmFtZShXRVIpKyIgc2FndDogIikpOworCisgIC8vIFVtIGF1Y2ggVGVpbGUgdm9uIFVuaXQtU3RhY2tzIGthdWZlbiB6dSBrb2VubmVuLCB6LkIuICJrYXVmZSA1IHBoaW9sZW4iLAorICAvLyBkYXJmIGhpZXIgenVzYWV0emxpY2ggPGR1bW15PiBudXIgZWluIExlZXJzdHJpbmcgc2Vpbiwgc29uc3QgdmVyendlaWd0CisgIC8vIGRpZSBTeW50YXhwcnVlZnVuZyBoaWVyaGluIHVuZCBlcyB3aXJkIGRhcyA1LiBJdGVtIGRlciBMaXN0ZSBnZWthdWZ0LgorICBpZiAoc3NjYW5mKHN0ciwiJWQlcyIsaSxkdW1teSk+MCAmJiBpPjAgJiYgIXNpemVvZihkdW1teSkpIHsKKyAgICBvYj1GaW5kSW5TdG9yZShpKTsKKyAgfQorICBlbHNlIG9iPUZpbmRJblN0b3JlKHN0cik7CisKKyAgaWYgKCFvYikgcmV0dXJuIDA7CisKKyAgaWYgKHN0ciA9IGJ1eV9vYmoob2IsMCkpIAorICB7CisgICAgd3JpdGUoYnJlYWtfc3RyaW5nKHN0ciw3OCxOYW1lKFdFUikrIiBzYWd0OiAiKSk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICB2YWwgPSBRdWVyeUJ1eVZhbHVlKG9iLFBMKTsKKworICBpZiAoUEwtPlF1ZXJ5TW9uZXkoKSA8IHZhbCkKKyAgeworICAgIHdyaXRlKGJyZWFrX3N0cmluZyhjYXBpdGFsaXplKG9iLT5RdWVyeVByb25vdW4oV0VSKSkrIiB3dWVyZGUgIit2YWwrCisgICAgICIgTXVlbnplbiBrb3N0ZW4sIHVuZCBEdSBoYXN0IG51ciAiK1BMLT5RdWVyeU1vbmV5KCkrIi4iLDc4LAorICAgICBOYW1lKFdFUikrIiBiZWRhdWVydDogIikpOworICAgIHJldHVybiAxOworICB9CisKKyAgLy8gQW56YWhsIGRlciBhbmdlZm9yZGVydGVuIEVpbmhlaXRlbiB2b3IgZGVtIEJld2VnZW4gendpc2NoZW5zcGVpY2hlcm4uCisgIC8vIFdlaWwgZGFiZWkgaW0gRmFsbCB2b24gVW5pdHMgZWluZSBWZXJlaW5pZ3VuZyBtaXQgYmVyZWl0cyBpbSBJbnZlbnRhcgorICAvLyBiZWZpbmRsaWNoZW4gRWluaGVpdGVuIHN0YXR0ZmluZGV0LCBtdXNzIGRhcyBnZ2YuIG5hY2ggQmV3ZWdlbgorICAvLyB6dXJ1ZWNrZ2VzZXR6dCB3ZXJkZW4uCisgIGludCB1X3JlcSA9IG9iLT5RdWVyeVByb3AoVV9SRVEpOworCisgIGlmICgocmVzID0gb2ItPlF1ZXJ5UHJvcChQX1JFU1RSSUNUSU9OUykpICYmIG1hcHBpbmdwKHJlcykgJiYKKyAgICAgIChyZXMgPSBjYWxsX290aGVyKCIvc3RkL3Jlc3RyaWN0aW9uX2NoZWNrZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgImNoZWNrX3Jlc3RyaWN0aW9ucyIsUEwscmVzKSkgJiYKKyAgICAgIHN0cmluZ3AocmVzKSkKKyAgeworICAgIF9ub3RpZnlfZmFpbChicmVha19zdHJpbmcoIkR1IGtvZW5udGVzdCAiK29iLT5uYW1lKFdFTiwyKSsiIG5pY2h0ICIKKyAgICAgInZlcndlbmRlbi4gR3J1bmQ6ICIrcmVzKyJNb2VjaHRlc3QgRHUgIitvYi0+UXVlcnlQcm9ub3VuKFdFTikrCisgICAgICIgZGVubm9jaCBrYXVmZW4/Iiw3OCxOYW1lKFdFUikrIiBzYWd0OiAiKSk7CisKKyAgICBpbnB1dF90bygiYXNrX2J1eSIsSU5QVVRfUFJPTVBULCAiKGphL25laW4pICIsIHZhbCxQTCxvYix1X3JlcSk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBwYXIgPSAoaW50KW9iLT5RdWVyeVByb3AoUF9QQVJSWSk7CisgIGRleCA9IChpbnQpUEwtPlF1ZXJ5QXR0cmlidXRlKEFfREVYKTsKKworICBpZiAoKCgocGFyIDwgUEFSUllfT05MWSkgJiYgKChkZXggKyA4KSAqIDEwKSA8IG9iLT5RdWVyeVByb3AoUF9XQykpIHx8CisgICAgICAgKChwYXIgPiBQQVJSWV9OT1QpICAmJiAoKGRleCArIDUpICogIDIpIDwgb2ItPlF1ZXJ5UHJvcChQX0FDKSkpICYmCisgICAgICBWQUxJRF9XRUFQT05fVFlQRShvYikpCisgIHsKKyAgICBfbm90aWZ5X2ZhaWwoYnJlYWtfc3RyaW5nKCJEdSBrb2VubnRlc3QgIitvYi0+bmFtZShXRU4sMikrIiBuaWNodCAiCisgICAgICJ6dWVja2VuLCBkYSBEZWluZSBHZXNjaGlja2xpY2hrZWl0IGRhZnVlciBuaWNodCBhdXNyZWljaHQuIE1vZWNodGVzdCAiCisgICAgICJEdSAiK29iLT5RdWVyeVByb25vdW4oV0VOKSsiIGRlbm5vY2gga2F1ZmVuPyIsNzgsCisgICAgIE5hbWUoV0VSKSsiIHNhZ3Q6ICIpKTsKKworICAgIGlucHV0X3RvKCJhc2tfYnV5IixJTlBVVF9QUk9NUFQsICIoamEvbmVpbikgIiwgdmFsLFBMLG9iLHVfcmVxKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJlYWxseV9idXkodmFsLCBQTCwgb2IsIHVfcmVxKTsKKworICByZXR1cm4gMTsKK30KKworcHJpdmF0ZSB2b2lkIGdpdmVfbW9uZXkoaW50IHZhbHVlKQorLy8gR2VsZCBndXRzY2hyZWliZW4uLi4KK3sKKyAgaWYgKCF2YWx1ZSkgcmV0dXJuOworICB3cml0ZShicmVha19zdHJpbmcoTmFtZShXRVIsIDEpKyIgemFobHQgRGlyICIrdmFsdWUrIiBHb2xkc3R1ZWNrIgorICAgICAgICAgICAgICAgICAgICArKHZhbHVlPT0xPyIuIjoiZS4iKSwgNzgpKTsKKyAgaWYgKChQTC0+QWRkTW9uZXkodmFsdWUpKTw9MCkgeworICAgICBvYmplY3QgbW9uOworCisgICAgIHdyaXRlKCJEdSBrYW5uc3QgZGFzIEdlbGQgbmljaHQgbWVociB0cmFnZW4hXG4iKTsKKyAgICAgbW9uPWNsb25lX29iamVjdChHRUxEKTsKKyAgICAgbW9uLT5TZXRQcm9wKFBfQU1PVU5ULHZhbHVlKTsKKyAgICAgbW9uLT5tb3ZlKE1FLE1fTU9WRV9BTEx8TV9OT0NIRUNLKTsKKyAgfQorfQorCitzdGF0aWMgaW50IG1ha2VfdG9fbW9uZXkob2JqZWN0IG9iLCBpbnQgdmFsdWUpCisvLyBJbnRlcm5lIEZ1bmt0aW9uLCBkaWUgb2IgdmVyc3VjaHQgaW4gZGFzIExhZ2VyIHp1IHVlYmVyZnVlaHJlbiB1bmQgZGFzCisvLyBHZWxkIGRhcyBkYWJlaSBmdWVyIGRlbiBTcGllbGVyIGFiZmFlbGx0IHp1cnVlY2tsaWVmZXJ0LgoreworICBzdHJpbmcgc3RyOworICBpbnQgcmV0OworCisgIGlmICghb2JqZWN0cChvYikgfHwgZW52aXJvbm1lbnQob2IpPT1maW5kX29iamVjdChzdG9yYWdlKSkgeworICAgIHdyaXRlKGJyZWFrX3N0cmluZyhOYW1lKFdFUiwgMSkrIiB3dW5kZXJ0IHNpY2ggdWViZXIgRGljaC4iLCA3OCkpOworICAgIHJldHVybiAwOworICB9CisgIGlmICh2YWx1ZT5RdWVyeVByb3AoUF9DVVJSRU5UX01PTkVZKSkgeworICAgIHdyaXRlKGJyZWFrX3N0cmluZygiSWNoIGhhYiBkYXMgR2VsZCBsZWlkZXIgbmljaHQgbWVoci4iLCA3OCwKKyAgICAgICAgICAgICAgICAgICAgICAgTmFtZShXRVIsIDEpKyIgc2FndDogIikpOworICAgIHJldHVybiAwOworICB9CisgIC8vIFVfUkVRIG1lcmtlbiwgZmFsbHMgc2ljaCBPYmpla3RlIHZlcmVpbmlnZW4uIFNvbnN0IHN0aW1tdCBuaWNodCBudXIgZGVyCisgIC8vIE5hbWUsIHNvbmRlcm4gZXMgd2VyZGVuIGdnZi4gYXVjaCBkaWUgZmFsc2NoZSBBbnphaGwgemVyc3RvZXJ0LgorICAvL1RPT086IE9kZXIgVW5pdHMgZW50c29yZ2VuIHVuZCBhbHMgRmVhdHVyZSBkZWtsYXJpZXJlbj8KKyAgaW50IHJlcSA9IG9iLT5RdWVyeVByb3AoVV9SRVEpOworICBpZiAoQ2hlY2tGb3JEZXN0cnVjdChvYikgPiAwKSAgLy8gc29sbCBvYiB6ZXJzdG9lcnQgd2VyZGVuPworICB7CisgICAgcmV0ID0gb2ItPm1vdmUoc3RvcmFnZSxNX1BVVHxNX0dFVCk7CisgICAgLy8gRmFsbHMgZGFzIE9iamVrdCBzaWNoIHZlcmVpbmlndCBoYXQgKFVuaXRzKSwgbXVlc3NlbiBkaWUgZ2V3dWVuc2NodGVuCisgICAgLy8gRWluaGVpdGVuIHJlc3RhdXJpZXJ0IHdlcmRlbi4KKyAgICAvLyBQcm9ibGVtOiBmYWxscyBkYXMgdmVya2F1ZnRlIE9iamVrdCBVbml0cyBoYXQsIGJlc2NoYWVkaWd0IGlzdCB1bmQgc2ljaAorICAgIC8vIHZlcmVpbmlndCBoYXQsIHNpbmQgamV0enQgbGVpZGVyIGFsbGUgRWluaGVpdGVuIGltIExhZ2VyIGJlc2NoYWVkaWd0LgorICAgIC8vIERhcyBpc3QgdW5zY2hvZW4gLSBhYmVyIG1pciBqZXR6dCB6dXZpZWwgQVVmd2FuZCwgZGFzIGtvcnJla3QgenUgYmF1ZW4sCisgICAgLy8gd2VpbCBlcyBudXIgc2VociBzZWx0ZW4gdm9ya29tbXQuIChIaW50OiBzZXBhcmF0ZXIgTXVlbGxyYXVtKQorICAgIG9iLT5TZXRQcm9wKFVfUkVRLCByZXEpOworICAgIGlmIChyZXQgPiAwKSAvLyBTb25zdCB3ZXJkZW4gYXVjaCBTYWNoZW4gemVyc3RvZXJ0LCBkaWUgbWFuIG5pY2h0CisgICAgeyAgICAgICAgICAgICAgICAgLy8gd2VnbGVnZW4ga2FubgorICAgICAgc2F5KGJyZWFrX3N0cmluZyhQTC0+TmFtZSgpKyIgdmVya2F1ZnQgIitvYi0+bmFtZShXRU4pKyIuIiwgNzgpKTsKKyAgICAgIGlmKG9iLT5RdWVyeVByb3AoUF9EQU1BR0VEKSkgIC8vIEFuZGVyZSBNZWxkdW5nIGJlaSBiZXNjaGFlZGlndGVuCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPYmpla3RlbiAuLi4KKyAgICAgICAgd3JpdGUoYnJlYWtfc3RyaW5nKE5hbWUoV0VSLDEpKyIgZmluZGV0IHp3YXIga2VpbmVuIEdlZmFsbGVuIGFuICIKKyAgICAgICAgICtvYi0+bmFtZShXRU0sMSkrIiwgbmltbXQgIitvYi0+UXVlcnlQcm9ub3VuKFdFTikrIiBEaXIgenVsaWViZSAiCisgICAgICAgICAiYWJlciB0cm90emRlbS4iLDc4KSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHdyaXRlKGJyZWFrX3N0cmluZyhOYW1lKFdFUiwgMSkrIiBmaW5kZXQgR2VmYWxsZW4gYW4gIgorICAgICAgICAgICArb2ItPm5hbWUoV0VNLCAxKSArICIgdW5kIGxlZ3QgIitvYi0+UXVlcnlQcm9ub3VuKFdFTikKKyAgICAgICAgICAgKyIgenUgIisoUXVlcnlQcm9wKFBfR0VOREVSKT09RkVNQUxFPyJpaHJlbiI6InNlaW5lbiIpCisgICAgICAgICAgICsiIFByaXZhdHNhY2hlbi4iLCA3OCkpOworICAgICAgfQorICAgICAgLyogRXIgemFobHQgRGlyICIrdmFsdWUrIiBNdWVuemUiKyh2YWx1ZT09MT8iIjoibiIpKyIgZGFmdWVyLiIsIDc4KSk7ICovCisgICAgICBfYWRkX21vbmV5KC12YWx1ZSk7CisgICAgICBfYWRkX21vbmV5KHZhbHVlKlF1ZXJ5UHJvcChQX1NIT1BfUEVSQ0VOVF9MRUZUKS8xMDApOyAvLyBXZWdlbiBaZXJzdG9lcnVuZyBkZXMgT2JqZWt0ZXMKKyAgICAgIFVwZGF0ZUNvdW50ZXIob2IsMSk7CisgICAgICBvYi0+cmVtb3ZlKDEpOworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKyAgICBlbHNlIGlmIChyZXQgPT0gTUVfQ0FOVF9CRV9EUk9QUEVEKSB7CisgICAgICBpZiAoKHN0cj1vYi0+UXVlcnlQcm9wKFBfTk9EUk9QKSkgJiYgc3RyaW5ncChzdHIpKSB7CisgICAgICAgIHdyaXRlKHN0cik7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgd3JpdGUoYnJlYWtfc3RyaW5nKCJEdSBrYW5uc3QgIitvYi0+bmFtZShXRU4sMSkrIiBuaWNodCB2ZXJrYXVmZW4hIiwgNzgpKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlCisgICAgICB3cml0ZShicmVha19zdHJpbmcob2ItPk5hbWUoV0VSKSsiIGludGVyZXNzaWVydCBtaWNoIG5pY2h0LiIsIDc4LAorICAgICAgICAgICAgICAgTmFtZShXRVIsIDEpKyIgc2FndDogIikpOworICB9CisgIGVsc2UgaWYgKChyZXQ9KG9iLT5tb3ZlKHN0b3JhZ2UsTV9QVVR8TV9HRVQpKSk+MCkKKyAgeworICAgIC8vIEZhbGxzIGRhcyBPYmpla3Qgc2ljaCB2ZXJlaW5pZ3QgaGF0IChVbml0cyksIG11ZXNzZW4gZGllIGdld3VlbnNjaHRlbgorICAgIC8vIEVpbmhlaXRlbiByZXN0YXVyaWVydCB3ZXJkZW4uCisgICAgb2ItPlNldFByb3AoVV9SRVEsIHJlcSk7CisgICAgc2F5KGJyZWFrX3N0cmluZyhQTC0+TmFtZShXRVIpKyIgdmVya2F1ZnQgIitvYi0+bmFtZShXRU4pKyIuIiwgNzgpKTsKKyAgICBfYWRkX21vbmV5KC12YWx1ZSk7CisgICAgVXBkYXRlQ291bnRlcihvYiwxKTsKKyAgICByZXR1cm4gdmFsdWU7CisgIH0KKyAgZWxzZSBpZiAocmV0ID09IE1FX0NBTlRfQkVfRFJPUFBFRCkgeworICAgIGlmICgoc3RyPW9iLT5RdWVyeVByb3AoUF9OT0RST1ApKSAmJiBzdHJpbmdwKHN0cikpCisgICAgICAgd3JpdGUoc3RyKTsKKyAgICBlbHNlIHdyaXRlKGJyZWFrX3N0cmluZygiRHUga2FubnN0ICIrb2ItPm5hbWUoV0VOLDEpKyIgbmljaHQgdmVya2F1ZmVuISIsIDc4KSk7CisgIH0KKyAgZWxzZSB3cml0ZShicmVha19zdHJpbmcoIkR1IGthbm5zdCAiK29iLT5uYW1lKFdFTiwxKSsiIG5pY2h0IHZlcmthdWZlbiEiLCA3OCkpOworICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXNrX3NlbGwoc3RyaW5nIHN0ciwgb2JqZWN0IG9iLCBpbnQgdmFsLCBpbnQgdV9yZXEpCisvLyBXZW5uIGVpbiBlaW56ZWxuZW4gU3R1ZWNrIHVudGVyIFdlcnQgdmVya2F1ZnQgd2VyZGVuIHNvbGwsIHdpcmQgbmFjaGdlZnJhZ3QKKy8vIHVfcmVxIGlzdCBiZWkgVW5pdG9iamVrdGVuIGRpZSBBbnphaGwgYW4genUgdmVya2F1ZmVuZGVuIEVpbmhlaXRlbi4gQmVpCisvLyBub3JtYWxlbiBPYmpla3RlbiBpc3QgdV9yZXEgMC4KK3sKKyAgc3RyPWxvd2VyX2Nhc2Uoc3RyfHwiIik7CisgIGlmIChzdHI9PSJqYSJ8fHN0cj09ImoiKQorICB7CisgICAgIC8vIEluIFVuaXRvYmpla3RlbiBVX1JFUSAod2llZGVyKSBzZXR6ZW4uCisgICAgIGlmICh1X3JlcT4wKQorICAgICB7CisgICAgICAgLy8gRGFzIFF1ZXJ5UHJvcCgpIGlzdCBuaWNodCB1bm5vZXRpZy4gQmVpIGRlciBBYmZyYWdlIHZvbiBVX1JFUSB3aXJkCisgICAgICAgLy8gVV9SRVEgZ2VudWxsdCwgd2VubiBkYXMgYWt0dWVsbGUgcXVlcnlfdmVyYigpICE9IGRlbSBsZXR6dGVuIGlzdC4KKyAgICAgICAvLyBCZWkgZGVyIGVyc3RlbiBBYmZyYWdlIHd1ZXJkZSBhbHMgZGFzIGhpZXIgZ2VzZXR6dCBVX1JFUSB3aWVkZXIKKyAgICAgICAvLyBnZWxvZXNjaHQuIERhaGVyIG11c3MgZGFzIGpldHp0IGhpZXIgYWxzIGVyc3RlcyBlaW5tYWwgYWJnZWZyYWd0CisgICAgICAgLy8gd2VyZGVuLi4uCisgICAgICAgICBvYi0+UXVlcnlQcm9wKFVfUkVRKTsKKyAgICAgICAgIG9iLT5TZXRQcm9wKFVfUkVRLCB1X3JlcSk7CisgICAgIH0KKyAgICAgZ2l2ZV9tb25leShtYWtlX3RvX21vbmV5KG9iLHZhbCkpOworICB9CisgIGVsc2UKKyAgICAgd3JpdGUoYnJlYWtfc3RyaW5nKCJPaywgZGFubiBiZWhhbHRzISIsIDc4LAorICAgICAgICAgICAgIE5hbWUoV0VSLCAxKSsiIHNhZ3Q6ICIpKTsKK30KKworc3RhdGljIHN0cmluZyBzZWxsX29iaihvYmplY3Qgb2IsIGludCBzaG9ydCkKKy8vIElzdCBkZXIgSGFlbmRsZXIgYmVyZWl0IG9iIHp1IGthdWZlbj8gd2VubiBuZWluLCBSdWVja2dhYmUgZWluZXIgTWVsZHVuZywKKy8vIGRpZSBkZXIgSGFlbmRsZXIgc2FnZW4gc29sbC4KK3sgIG1peGVkIG5vc2VsbDsKKworICAgaWYgKEJMVUVfTkFNRShvYik9PUdFTEQpCisgICAgICByZXR1cm4gIkRhcyB3YWVyZSBqYSB3b2hsIFVuc2lubiwgb2RlciAuLi4/IjsKKyAgIGlmIChub3NlbGw9b2ItPlF1ZXJ5UHJvcChQX05PU0VMTCkpCisgICB7CisgICAgIGlmIChzdHJpbmdwKG5vc2VsbCkpCisgICAgICAgcmV0dXJuIG5vc2VsbDsKKyAgICAgcmV0dXJuICgiRHUga2FubnN0ICIrb2ItPm5hbWUoV0VOLDEpKyIgbmljaHQgdmVya2F1ZmVuISIpOworICAgfQorICAgaWYgKG9iLT5RdWVyeVByb3AoUF9DVVJTRUQpKQorICAgICByZXR1cm4gb2ItPk5hbWUoV0VSLDEpCisgICAgICAgICArIiBpc3QgbWlyIGlyZ2VuZHdpZSB1bmdlaGV1ZXIhIERhcyBrYW5uc3QgRHUgbmljaHQgdmVya2F1ZmVuISI7CisgICAvLyBtYW4gc29sbHRlIGtlaW5lIENPbnRhaW5lciBtaXQgSW5oYWx0IHZlcmthdWZlbiBrb2VubmVuLCBnZ2YuIGthdWZ0IHNpZQorICAgLy8gZGFubiBlaW4gYW5kZXJlciBTcGllbGVyLgorICAgaWYgKGZpcnN0X2ludmVudG9yeShvYikpCisgICB7CisgICAgIHJldHVybiBvYi0+TmFtZShXRVIsIDEpICsgIiBpc3QgbmljaHQgbGVlciEiOworICAgfQorICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2YXJhcmdzIGludCBzZWxsKHN0cmluZyBzdHIsIGludCBmKQoreworICBpbnQgaSwgdmFsLCBvdmFsLCB0bXA7CisgIG9iamVjdCAqb2JzOworCisgIGlmIChzdHJpbmdwKFF1ZXJ5UHJvcChQX0tFRVBFUikpICYmICFwcmVzZW50KFF1ZXJ5UHJvcChQX0tFRVBFUiksTUUpKSB7CisgICAgIHdyaXRlKCJFcyBpc3QgbmllbWFuZCBkYSwgZGVyIERpY2ggYmVkaWVuZW4ga29lbm50ZS5cbiIpOworICAgICByZXR1cm4gMTsKKyAgfQorICAKKyAgaWYgKCFzdHIpIHsKKyAgICAgbm90aWZ5X2ZhaWwoIldhcyBtb2VjaHRlc3QgRHUgZGVubiB2ZXJrYXVmZW4/XG4iKTsKKyAgICAgcmV0dXJuIDA7CisgIH0KKyAgCisgIC8qIEVyZ2VibmlzIHZvbiBmaW5kX29icygpIHNvbGx0ZSB1bmlmaXppZXJ0IHdlcmRlbiwgZGFtaXQgZWluIG1laHJmYWNoCisgICAgIGdlZnVuZGVuZXMgT2JqZWt0IG5pY2h0IG1laHJmYWNoIHZlcnN1Y2h0IHdpcmQgenUgdmVya2F1ZmVuLgorICAgICBCZWlzcGllbDogT2JqZWt0IGhhdCBQX05PQlVZIGdlc2V0enQgdW5kIG1laHJlcmUgSURzIGdlc2V0enQuIFdlbm4KKyAgICAgZWluIFNwaWVsZXIgZXMgbWl0ICJ2ZXJrYXVmZSBJRDEgdW5kIElEMiIgdmVyc3VjaHQgenUgdmVya2F1ZmVuLAorICAgICB3dWVyZGUgZGFzIGVpbmVuIEJ1ZyBhdXNsb2VzZW4uIERlcnNlbGJlIEJ1ZyBlbnRzdGVodCwgd2VubiBtYW4gbWl0CisgICAgICJ2ZXJrYXVmZSBJRDEgdW5kIElEMSIgdmVya2F1ZnQuICovCisgIG9icyA9IFBMLT5maW5kX29icyhzdHIsIFBVVF9HRVRfRFJPUCk7CisgIC8qIEVyc3QgaW0gSW52ZW50YXIgc2NoYXVlbiwgZGFubiBpbSBFbnZpcm9ubWVudC4gZmluZF9vYnMoKSBvaG5lIDIuCisgICAgIFBhcmFtZXRlciBtYWNodCBkYXMgc3RhbmRhcmRtYWVzc2lnIGFuZGVyc2hlcnVtLgorICAgICBUT0RPOiBBZW5kZXJ1bmcgdWViZXJwcnVlZmVuLCBzb2JhbGQgZGFzIG5ldWUgcHV0X2FuZF9nZXQuYyAKKyAgICAgZWluZ2ViYXV0IHd1cmRlLiAqLworICBpZiAoICFzaXplb2Yob2JzKSApCisgICAgb2JzID0gUEwtPmZpbmRfb2JzKHN0ciwgUFVUX0dFVF9UQUtFKSB8fCAoe30pOworICBvYnMgPSBtX2luZGljZXMobWttYXBwaW5nKG9icykpOworICBpZiAoIWk9c2l6ZW9mKG9icykpIHsKKyAgICAgbm90aWZ5X2ZhaWwoIldhcyBtb2VjaHRlc3QgRHUgZGVubiB2ZXJrYXVmZW4/XG4iKTsKKyAgICAgcmV0dXJuIDA7CisgIH0KKyAgY2FsbF9vdGhlcihzdG9yYWdlLCAiX3JlZ2lzdGVyX3Nob3AiLCBNRSk7CisgIGlmIChpPT0xKSB7CisgICAgIGlmIChzdHI9c2VsbF9vYmoob2JzWzBdLCAwKSkgeworICAgICAgICB3cml0ZShicmVha19zdHJpbmcoc3RyLCA3OCwgTmFtZShXRVIsIDEpKyIgc2FndDogIikpOworICAgICAgICByZXR1cm4gMTsKKyAgICAgfQorICAgICBpZiAoKG92YWw9b2JzWzBdLT5RdWVyeVByb3AoUF9WQUxVRSkpPD0wKSB7CisgICAgICAgIHdyaXRlKGJyZWFrX3N0cmluZyhvYnNbMF0tPk5hbWUoV0VSKQorICAgICAgICAgICAgICArKG9ic1swXS0+UXVlcnlQcm9wKFBfUExVUkFMKSA/ICIgaGFiZW4iIDogIiBoYXQiKQorICAgICAgICAgICAgICArIiBrZWluZW4gbWF0ZXJpZWxsZW4gV2VydCwgdHV0IG1pciBsZWlkLiIsIDc4LAorICAgICAgICAgICAgICBOYW1lKFdFUiwgMSkrIiBzYWd0OiAiKSk7CisgICAgICAgIHJldHVybiAxOworICAgICB9CisgICAgIHZhbD1RdWVyeVNlbGxWYWx1ZShvYnNbMF0sIFBMKTsKKyAgICAgaWYgKCF2YWwpIHsKKyAgICAgICAgd3JpdGUoYnJlYWtfc3RyaW5nKCJJY2ggYmluIGFic29sdXQgcGxlaXRlLiBUdXQgbWlyIGF1ZnJpY2h0aWcgbGVpZC4iLAorICAgICAgICAgICAgICA3OCwgTmFtZShXRVIsIDEpKyIgc2FndDogIikpOworICAgICAgICByZXR1cm4gMTsKKyAgICAgfQorICAgICBpZiAodmFsPT1vdmFsIHx8IGYpIHsKKyAgICAgICAgZ2l2ZV9tb25leShtYWtlX3RvX21vbmV5KG9ic1swXSwgdmFsKSk7CisgICAgICAgIHJldHVybiAxOworICAgICB9CisgICAgIGlmIChzdHI9b2JzWzBdLT5RdWVyeVByb3AoUF9OT0RST1ApKSB7CisgICAgICAgIGlmIChzdHJpbmdwKHN0cikpCisgICAgICAgICAgIHdyaXRlKHN0cik7CisgICAgICAgIGVsc2Ugd3JpdGUoYnJlYWtfc3RyaW5nKCJEdSBrYW5uc3QgIitvYnNbMF0tPm5hbWUoV0VOLDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyIgbmljaHQgdmVya2F1ZmVuISIsIDc4KSk7CisgICAgICAgIHJldHVybiAxOworICAgICB9CisKKyAgICAgaWYgKG9ic1swXS0+UXVlcnlQcm9wKFBfREFNQUdFRCkpICAvLyBCZWkgYmVzY2hhZWRpZ3RlbiBPYmpla3RlbiBnaWJ0CisgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXMgYXVjaCBoaWVyIGVpbmUgYW5kZXJlIE1lbGR1bmcKKyAgICAgICB3cml0ZShicmVha19zdHJpbmcoIkRhICIrb2JzWzBdLT5uYW1lKFdFUikrIiBiZXNjaGFlZGlndCAiCisgICAgICAgICsob2JzWzBdLT5RdWVyeVByb3AoUF9QTFVSQUwpPyJzaW5kIjoiaXN0IikrIiwga2FubiBpY2ggRGlyICIKKyAgICAgICAgIm51ciAiK3ZhbCsiIE11ZW56ZSIrKHZhbCA9PSAxPyIiOiJuIikrIiBkYWZ1ZXIgYmlldGVuLiBVbmQgIgorICAgICAgICAiZGFtaXQgbWFjaGUgaWNoIG5vY2ggVmVybHVzdCEgTmltbXN0IER1IG1laW4gQW5nZWJvdCBhbj8gIgorICAgICAgICAiKGphL25laW4pIiw3OCxOYW1lKFdFUiwxKSsiIHNhZ3Q6ICIpKTsKKyAgICAgfQorICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVmYXVsdAorICAgICB7CisgICAgICAgd3JpdGUoYnJlYWtfc3RyaW5nKE5hbWUoV0VSLCAxKSsiIHNhZ3Q6ICIKKyAgICAgICAgICArIk5hY2ggZGVyIGFrdHVlbGxlbiBNYXJrdGxhZ2Uga2FubiBpY2ggRGlyIGRhZnVlciBudXIgIgorICAgICAgICAgICt2YWwrIiBNdWVuemUiKyh2YWw9PTE/IiI6Im4iKSsiIGJpZXRlbiwgb2J3b2hsICIKKyAgICAgICAgICArb2JzWzBdLT5uYW1lKFdFUikrIiBlaWdlbnRsaWNoICIrb3ZhbCsiIE11ZW56ZSIKKyAgICAgICAgICArKG92YWw9PTE/IiI6Im4iKSsiIHdlcnQgd2FlcmUuIFdpbGxzdCBEdSAiCisgICAgICAgICAgKyhRdWVyeVByb3AoUF9QTFVSQUwpID8gInNpZSIgOiAiZXMiKQorICAgICAgICAgICsiIG1pciBkYWZ1ZXIgdWViZXJsYXNzZW4/IiwgNzgpKTsKKyAgICAgfQorICAgICAvLyBpbiBhc2tfc2VsbCgpIGdpYnQgZXMgZGFzIHF1ZXJ5X3ZlcmIoKSBuaWNodCBtZWhyLCB3ZXN3ZWdlbiBVX1JFUSBpbgorICAgICAvLyBVbml0b2JqZWt0ZW4genVydWVja2dlc2V0enQgd2lyZC4gRGFtaXQgZ2VodCBkaWUgaW5mbyB2ZXJsb3JlbiwKKyAgICAgLy8gd2lldmllbGUgT2JqZWt0ZSBkZXIgU3BpZWxlciBhbmdlZ2ViZW4gaGF0LiBEaWVzZSBtdXNzIGdlcmV0dGV0IHVuZAorICAgICAvLyB2aWEgYXNrX3NlbGwoKSBpbiBtYWtlX3RvX21vbmV5KCkgYW5rb21tZW4uIEluIG5vcm1hbGVuIE9iamVrdGVuIGlzdAorICAgICAvLyBVX1JFUSAwLgorICAgICBpbnB1dF90bygiYXNrX3NlbGwiLElOUFVUX1BST01QVCwgIihqYS9uZWluKSAiLG9ic1swXSwgdmFsLAorICAgICAgICAgICAgICAob2JzWzBdKS0+UXVlcnlQcm9wKFVfUkVRKSApOworICAgICByZXR1cm4gMTsKKyAgfQorICBmb3IgKC0taTsgaT49MCAmJiBnZXRfZXZhbF9jb3N0KCk+NTAwMDA7IGktLSkgeworICAgICBpZiAob3ZhbD1vYnNbaV0tPlF1ZXJ5UHJvcChQX1ZBTFVFKSkgeworICAgICAgICBpZiAob2JzW2ldLT5RdWVyeVByb3AoUF9LRUVQX09OX1NFTEwpPT1nZXR1aWQoUEwpCisgICAgICAgICAgICB8fCBvYnNbaV0tPlF1ZXJ5UHJvcChQX1dPUk4pIHx8IG9ic1tpXS0+UXVlcnlQcm9wKFBfV0lFTERFRCkpCisgICAgICAgICAgIHdyaXRlKGJyZWFrX3N0cmluZyhvYnNbaV0tPk5hbWUoV0VSKSsiOiBEdSBiZWhhZWx0c3QgIgorICAgICAgICAgICAgICAgICtvYnNbaV0tPm5hbWUoV0VOKSsiLiIsIDc4KSk7CisgICAgICAgIGVsc2UgaWYgKHN0cj1zZWxsX29iaihvYnNbaV0sIDEpKQorICAgICAgICAgICB3cml0ZShicmVha19zdHJpbmcob2JzW2ldLT5OYW1lKFdFUikrIjogIitzdHIsIDc4KSk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICB0bXA9UXVlcnlTZWxsVmFsdWUob2JzW2ldLCBQTCk7CisgICAgICAgICAgIGlmICghdG1wKSB7CisgICAgICAgICAgICAgIHdyaXRlKGJyZWFrX3N0cmluZygKKyAgICAgICAgICAgICAgICAgICAgIkljaCBiaW4gYWJzb2x1dCBwbGVpdGUuIFR1dCBtaXIgYXVmcmljaHRpZyBsZWlkLiIsIDc4LAorICAgICAgICAgICAgICAgICAgICBOYW1lKFdFUiwgMSkrIiBzYWd0OiAiKSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICB9CisgICAgICAgICAgIGVsc2UgaWYgKCFmICYmIHRtcCoxMDxvdmFsKQorICAgICAgICAgICAgICB3cml0ZShicmVha19zdHJpbmcob2JzW2ldLT5OYW1lKFdFUikrIjogIitOYW1lKFdFUiwgMSkKKyAgICAgICAgICAgICAgICAgICAgKyIgYmlldGV0IERpciBhYmVyIG51ciAiK3RtcCsiIEdvbGRzdHVlY2siCisgICAgICAgICAgICAgICAgICAgICsodG1wPjEgPyAiZSIgOiAiIikrIiBkYWZ1ZXIuIiwgNzgpKTsKKyAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgIHN0cj0ob2JzW2ldLT5OYW1lKFdFUikpOworICAgICAgICAgICAgICBpZiAodG1wPW1ha2VfdG9fbW9uZXkob2JzW2ldLCB0bXApKSB7CisgICAgICAgICAgICAgICAgIHdyaXRlKGJyZWFrX3N0cmluZyhzdHIrIjogIitOYW1lKFdFUiwgMSkKKyAgICAgICAgICAgICAgICAgICAgICArIiBnaWJ0IERpciBkYWZ1ZXIgIit0bXArIiBHb2xkc3R1ZWNrIgorICAgICAgICAgICAgICAgICAgICAgICsodG1wPT0xPyIuIjoiZS4iKSwgNzgpKTsKKyAgICAgICAgICAgICAgICAgdmFsKz10bXA7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgfQorICAgICAgICB9CisgICAgIH0KKyAgfQorICBpZiAoIXZhbCkKKyAgICAgd3JpdGUoYnJlYWtfc3RyaW5nKCJIbW1tLCBEdSBoYXN0IGFiZXIgbmljaHQgYmVzb25kZXJzIHZpZWwgenUgYmlldGVuLi4uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDc4LCBOYW1lKFdFUikrIiBzYWd0OiAiKSk7CisgIGVsc2UgZ2l2ZV9tb25leSh2YWwpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBmb3JjZV9zZWxsKHN0cmluZyBzdHIpCit7ICByZXR1cm4gc2VsbChzdHIsIDEpOyAgfQorCitzdGF0aWMgaW50IGV2YWx1YXRlKHN0cmluZyBzdHIpCit7CisgIG9iamVjdCBvYjsKKyAgaW50IHZhbCxydmFsOworCisgIGlmICghc3RyKSByZXR1cm4gMDsKKyAgaWYoc3RyaW5ncChRdWVyeVByb3AoUF9LRUVQRVIpKSAmJiAhcHJlc2VudChRdWVyeVByb3AoUF9LRUVQRVIpLCBNRSkpIHsKKyAgICB3cml0ZSgiRXMgaXN0IG5pZW1hbmQgZGEsIGRlciBEaWNoIGJlZGllbmVuIGtvZW5udGUuXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIG9iPXByZXNlbnQoc3RyLCBNRSk7CisgIGlmICghb2IpIG9iPWRlZXBfcHJlc2VudChzdHIsUEwpOworICBpZiAoIW9iKSB7CisgICAgd3JpdGUoIkhtPyAiK2NhcGl0YWxpemUoc3RyKSsiPyBXb3ZvbiByZWRlc3QgRHU/XG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAobGl2aW5nKG9iKSkgeworICAgIF9ub3RpZnlfZmFpbCgiTmFudSwgc2VpdCB3YW5uIHdlcmRlbiBoaWVyIExlYmV3ZXNlbiB2ZXJrYXVmdD9cbiIpOworICAgIHJldHVybiAwOworICB9CisgIGlmIChzdHI9c2VsbF9vYmoob2IsIDApKSB7CisgICAgd3JpdGUoYnJlYWtfc3RyaW5nKHN0ciwgNzgsIE5hbWUoV0VSKSsiIHNhZ3Q6ICIpKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBydmFsPW9iLT5RdWVyeVByb3AoUF9WQUxVRSk7CisgIGlmIChydmFsKSB7CisgICAgdmFsPVF1ZXJ5U2VsbFZhbHVlKG9iLCBQTCk7CisgICAgaWYgKHJ2YWw9PXZhbCkgeworICAgICAgdGVsbF9vYmplY3QodGhpc19wbGF5ZXIoKSxicmVha19zdHJpbmcoCisgICAgICAgICAiTmFqYSwgaWNoIGRlbmtlLCAiICt2YWwrICIgTXVlbnplIgorICAgICAgICAgKyAodmFsPT0xID8gIiIgOiAibiIpCisgICAgICAgICArICIgd2FlcmUiKyhvYi0+UXVlcnlQcm9wKFBfQU1PVU5UKT4xPyJuICI6IiAiKQorICAgICAgICAgKyAob2ItPlF1ZXJ5UHJvbm91bihXRVIpKSsiIHNjaG9uIHdlcnQuXG4iLDc4KSk7CisgICAgfQorICAgIGVsc2UgaWYgKHZhbCkgeworICAgICAgICB0ZWxsX29iamVjdCh0aGlzX3BsYXllcigpLGJyZWFrX3N0cmluZygKKyAgICAgICAgICAiT2gsIG5hY2ggZGVyIGFrdHVlbGxlbiBNYXJrdGxhZ2Uga2FubiBpY2ggbnVyICIrdmFsKyIgTXVlbnplIisKKyAgICAgICAgICAodmFsPT0xPyIiOiJuIikrIiBiZXphaGxlbiwgb2J3b2hsICIKKyAgICAgICAgICArIChRdWVyeVByb3AoUF9QTFVSQUwpID8gInNpZSIgOiAiZXMiKQorICAgICAgICAgICsgIiBlaWdlbnRsaWNoICIrcnZhbAorICAgICAgICAgICsgIiBNdWVuemUiKyhydmFsPT0xPyIiOiJuIikrIiB3ZXJ0IGlzdC5cbiIsNzgpKTsKKyAgICB9CisgICAgZWxzZSB3cml0ZSgiSWNoIGJpbiB2b2xsa29tbWVuIHBsZWl0ZS4gVHV0IG1pciBsZWlkLlxuIik7CisgIH0KKyAgZWxzZSB3cml0ZSgiRGFzIGlzdCB2b2VsbGlnIHdlcnRsb3MuXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc2hvd19vYmooc3RyaW5nIHN0cikKK3sKKyAgaW50IGk7CisgIHN0cmluZyB3YXM7CisgIG1peGVkIG9iOworCisgIGlmICghc3RyKSByZXR1cm4gMDsKKyAgaWYgKHNzY2FuZihzdHIsIiVzIGltIGxhZGVuIix3YXMpPjAgfHwgc3NjYW5mKHN0ciwiJXMgaW4gbGFkZW4iLHdhcyk+MCkgeworICAgIF9ub3RpZnlfZmFpbCgiRGFzIGthbm4gaWNoIGltIExhZ2VyIG5pY2h0IGZpbmRlbi5cbiIpOworICAgIG9iPUZpbmRJblN0b3JlKHdhcyk7CisgIH0gZWxzZSBpZiAoc3NjYW5mKHN0ciwiJWQiLGkpPjAgJiYgaT4wKSB7CisgICAgX25vdGlmeV9mYWlsKCJEYXMga2FubiBpY2ggaW0gTGFnZXIgbmljaHQgZmluZGVuLlxuIik7CisgICAgb2I9RmluZEluU3RvcmUoaSk7CisgIH0KKyAgaWYgKCFvYikgcmV0dXJuIDA7CisgIHdyaXRlKG9iLT5OYW1lKFdFUikrIjpcbiIrb2ItPmxvbmcoKStjYXBpdGFsaXplKG9iLT5RdWVyeVByb25vdW4oKSkKKyAgICAgICArIiBrb3N0ZXQgIitRdWVyeUJ1eVZhbHVlKG9iLFBMKSsiIE11ZW56ZW4uXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIGJlbnV0enQgdm9uIHRyYWRpbmdfcHJpY2U6OlF1ZXJ5VmFsdWUob2JqZWN0LCBpbnQsIG9iamVjdCkKK3N0YXRpYyBpbnQgT2JqZWN0Q291bnQob2JqZWN0IG9iKQoreworICBzdHJpbmcgdG1wOworCisgIGlmICghb2JqZWN0cChvYikpIHJldHVybiAwOworICB0bXAgPSBCTFVFX05BTUUob2IpOworICBpZiAodG1wWzAuLjJdIT0iL2QvIiAmJiB0bXBbMC4uOF0hPSIvcGxheWVycy8iKSB0bXA9b2ItPnNob3J0KCkrdG1wOworICByZXR1cm4gb2JfYW56W3RtcF07Cit9CisKKy8vIGJlbnV0enQgdm9uIHRyYWRpbmdfcHJpY2U6OlF1ZXJ5U2VsbFZhbHVlKG9iamVjdCwgb2JqZWN0KQorc3RhdGljIHZhcmFyZ3MgaW50IFF1ZXJ5VmFsdWUob2JqZWN0IG9iLCBpbnQgdmFsdWUsIG9iamVjdCBjbGllbnQpCit7CisgIGludCBuZXdfdmFsdWUsIG15bW9uZXk7CisKKyAgaWYgKCFvYmplY3RwKG9iKSkgcmV0dXJuIDA7CisgIGlmIChRdWVyeSgibGFkZW46OmNvbXBhdCIpKSB7CisgICAgbmV3X3ZhbHVlPSh2YWx1ZT4xMDAwPzEwMDA6dmFsdWUpOworICAgIG15bW9uZXkgPSBRdWVyeVByb3AoUF9DVVJSRU5UX01PTkVZKTsKKyAgICBpZiAobmV3X3ZhbHVlPm15bW9uZXkpCisgICAgICByZXR1cm4gKG15bW9uZXk+MD9teW1vbmV5OjApOworICAgIGVsc2UgcmV0dXJuIG5ld192YWx1ZTsKKyAgfQorICByZXR1cm4gOjpRdWVyeVZhbHVlKG9iLCB2YWx1ZSwgY2xpZW50KTsKK30KKwordm9pZCByZXNldCgpCit7CisgIG1peGVkICprZXlzOworICBpbnQgaTsKKworICB0cmFkaW5nX3ByaWNlOjpyZXNldCgpOworCisgIGlmICghbWFwcGluZ3Aob2JfYW56KSkKKyAgICByZXR1cm47CisgIGtleXM9bV9pbmRpY2VzKG9iX2Fueik7CisgIGZvciAoaT1zaXplb2Yoa2V5cyktMTtpPj0wO2ktLSkgeworICAgIG9iX2FueltrZXlzW2ldXT1vYl9hbnpba2V5c1tpXV0qNy84OworICAgIGlmICghb2JfYW56W2tleXNbaV1dKQorICAgICAgIG1fZGVsZXRlKG9iX2FueixrZXlzW2ldKTsKKyAgfQorfQorCit2YXJhcmdzIGludCBDaGVja0ZpbmRSZXN0cmljdGlvbnMob2JqZWN0IG9iLCBtaXhlZCByZXN0ciwgY2xvc3VyZSBxcCkgeworICByZXR1cm4gMDsKK30KKworaW50IEV2YWxXZWFwb24ob2JqZWN0IG9iLCBjbG9zdXJlIHFwKSB7CisgIGludCB3Yyx2YWw7CisKKyAgd2M9ZnVuY2FsbChxcCxQX1dDKTsKKyAgdmFsPWZ1bmNhbGwocXAsUF9FRkZFQ1RJVkVfV0MpOworICBpZiAodmFsPndjKSB3Yz12YWw7CisgIHJldHVybiB3YzsKK30KKwordmFyYXJncyBvYmplY3QgRmluZEJlc3RXZWFwb24obWl4ZWQgdHlwZSwgaW50IG1heG1vbiwgaW50IG1heHcsIGludCBoYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiZXN0d2MsIG1peGVkIHJlc3RyKSB7CisgIG9iamVjdCBiZXN0b2Isb2I7CisgIHN0cmluZyBvdHlwZTsKKyAgaW50IHdjLGJlc3R2YWwsdmFsLHcsYmVzdHc7CisgIGNsb3N1cmUgcXA7CisKKyAgaWYgKCFzdHJpbmdwKHN0b3JhZ2UpIHx8ICFvYmplY3RwKG9iPWZpbmRfb2JqZWN0KHN0b3JhZ2UpKSkgcmV0dXJuIDA7CisgIGlmICghbWF4bW9uKSBtYXhtb249MTAwMDAwOworICBpZiAoIW1heHcpIG1heHc9NzUwMDA7CisgIGlmICghaGFuZHMpIGhhbmRzPTI7CisgIGlmICh2YWw9UXVlcnlCdXlGYWN0KCkpIG1heG1vbj0obWF4bW9uKjEwMCkvdmFsOworICBpZiAodHlwZSAmJiAhcG9pbnRlcnAodHlwZSkgJiYgIW1hcHBpbmdwKHR5cGUpKSB0eXBlPSh7dHlwZX0pOworCisgIGZvciAob2I9Zmlyc3RfaW52ZW50b3J5KG9iKTtvYjtvYj1uZXh0X2ludmVudG9yeShvYikpIHsKKyAgICBxcD1zeW1ib2xfZnVuY3Rpb24oIlF1ZXJ5UHJvcCIsb2IpOworICAgIGlmICghb3R5cGU9ZnVuY2FsbChxcCxQX1dFQVBPTl9UWVBFKSkgY29udGludWU7CisgICAgaWYgKHR5cGUgJiYgbWVtYmVyKHR5cGUsb3R5cGUpPDApIGNvbnRpbnVlOworICAgIHdjPUV2YWxXZWFwb24ob2IscXApOworICAgIGlmICh3YzxiZXN0d2MpIGNvbnRpbnVlOworICAgIGlmIChmdW5jYWxsKHFwLFBfTlJfSEFORFMpPmhhbmRzKSBjb250aW51ZTsKKyAgICB3PWZ1bmNhbGwocXAsUF9XRUlHSFQpOworICAgIGlmICh3Pm1heHcpIGNvbnRpbnVlOworICAgIHZhbD1mdW5jYWxsKHFwLFBfVkFMVUUpOworICAgIGlmICh2YWw+bWF4bW9uKSBjb250aW51ZTsKKyAgICBpZiAoYmVzdG9iICYmIHdjPD1iZXN0d2MpIHsKKyAgICAgIGlmICh2YWw+YmVzdHZhbCkgY29udGludWU7CisgICAgICBlbHNlIGlmICh2YWw9PWJlc3R2YWwgJiYgdz5iZXN0dykgY29udGludWU7CisgICAgfQorICAgIGlmICh2YWw+YmVzdHZhbCAmJiBiZXN0b2IgJiYgd2M8PWJlc3R3YykgY29udGludWU7CisgICAgaWYgKENoZWNrRmluZFJlc3RyaWN0aW9ucyhvYixyZXN0cixxcCkpIGNvbnRpbnVlOworICAgIGJlc3RvYj1vYjsKKyAgICBiZXN0d2M9d2M7CisgICAgYmVzdHZhbD12YWw7CisgICAgYmVzdHc9dzsKKyAgfQorICByZXR1cm4gYmVzdG9iOworfQorCitpbnQgRXZhbEFybW91cihvYmplY3Qgb2IsY2xvc3VyZSBxcCkgeworICBpbnQgYWMsdmFsOworCisgIGFjPWZ1bmNhbGwocXAsUF9BQyk7CisgIHZhbD1mdW5jYWxsKHFwLFBfRUZGRUNUSVZFX0FDKTsKKyAgaWYgKHZhbD5hYykgYWM9dmFsOworICByZXR1cm4gYWM7Cit9CisKK3ZhcmFyZ3MgbWFwcGluZyBGaW5kQmVzdEFybW91cnNUKG1peGVkIHR5cGUsIGludCBtYXhtb24sIGludCBtYXh3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyBiZXN0YWMsIG1peGVkIHJlc3RyKSB7CisgIG9iamVjdCBvYjsKKyAgc3RyaW5nIG90eXBlOworICBpbnQgYWMsdmFsLHN1bSx3LHdzdW07CisgIG1hcHBpbmcgYmVzdG9iLGJlc3R2YWwsYmVzdHc7CisgIGNsb3N1cmUgcXA7CisKKyAgaWYgKCFzdHJpbmdwKHN0b3JhZ2UpIHx8ICFvYmplY3RwKG9iPWZpbmRfb2JqZWN0KHN0b3JhZ2UpKSkgcmV0dXJuIChbXSk7CisgIGlmICghbWF4bW9uKSBtYXhtb249MTAwMDAwOworICBpZiAoIW1heHcpIG1heHc9NzUwMDA7CisgIGlmICh2YWw9UXVlcnlCdXlGYWN0KCkpIG1heG1vbj0obWF4bW9uKjEwMCkvdmFsOworICBpZiAodHlwZSAmJiAhcG9pbnRlcnAodHlwZSkgJiYgIW1hcHBpbmdwKHR5cGUpKSB0eXBlPSh7dHlwZX0pOworICBpZiAoIW1hcHBpbmdwKGJlc3RhYykpIGJlc3RhYz0oW10pOworICBiZXN0b2I9KFtdKTtiZXN0dmFsPShbXSk7YmVzdHc9KFtdKTsKKworICBmb3IgKG9iPWZpcnN0X2ludmVudG9yeShvYik7b2I7b2I9bmV4dF9pbnZlbnRvcnkob2IpKSB7CisgICAgcXA9c3ltYm9sX2Z1bmN0aW9uKCJRdWVyeVByb3AiLG9iKTsKKyAgICBpZiAoIW90eXBlPWZ1bmNhbGwocXAsUF9BUk1PVVJfVFlQRSkpIGNvbnRpbnVlOworICAgIGlmICh0eXBlICYmIG1lbWJlcih0eXBlLG90eXBlKTwwKSBjb250aW51ZTsKKyAgICBhYz1FdmFsQXJtb3VyKG9iLHFwKTsKKyAgICBpZiAoYWM8YmVzdGFjW290eXBlXSkgY29udGludWU7CisgICAgdz1mdW5jYWxsKHFwLFBfV0VJR0hUKTsKKyAgICBpZiAod3N1bS1iZXN0d1tvdHlwZV0rdz5tYXh3KSBjb250aW51ZTsKKyAgICB2YWw9ZnVuY2FsbChxcCxQX1ZBTFVFKTsKKyAgICBpZiAoc3VtLWJlc3R2YWxbb3R5cGVdK3ZhbD5tYXhtb24pIGNvbnRpbnVlOworICAgIGlmIChiZXN0b2Jbb3R5cGVdICYmIGFjPD1iZXN0YWNbb3R5cGVdKSB7CisgICAgICBpZiAodmFsPmJlc3R2YWxbb3R5cGVdKSBjb250aW51ZTsKKyAgICAgIGVsc2UgaWYgKHZhbD09YmVzdHZhbFtvdHlwZV0gJiYgdz5iZXN0d1tvdHlwZV0pIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoQ2hlY2tGaW5kUmVzdHJpY3Rpb25zKG9iLHJlc3RyLHFwKSkgY29udGludWU7CisgICAgc3VtPXN1bS1iZXN0dmFsW290eXBlXSt2YWw7CisgICAgd3N1bT13c3VtLWJlc3R3W290eXBlXSt3OworICAgIGJlc3RvYltvdHlwZV09b2I7CisgICAgYmVzdGFjW290eXBlXT1hYzsKKyAgICBiZXN0dmFsW290eXBlXT12YWw7CisgICAgYmVzdHdbb3R5cGVdPXc7CisgIH0KKyAgcmV0dXJuIGJlc3RvYjsKK30KKwordmFyYXJncyBvYmplY3QgKkZpbmRCZXN0QXJtb3VycyhtaXhlZCB0eXBlLCBpbnQgbWF4bW9uLCBpbnQgbWF4dywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgYmVzdGFjLCBtaXhlZCByZXN0cikgeworICByZXR1cm4gbV92YWx1ZXMoRmluZEJlc3RBcm1vdXJzVCh0eXBlLG1heG1vbixtYXh3LGJlc3RhYyxyZXN0cikpOworfQpkaWZmIC0tZ2l0IGEvc3RkL3NlY3VyZV90aGluZy5jIGIvc3RkL3NlY3VyZV90aGluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMTk1MjkKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvc2VjdXJlX3RoaW5nLmMKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIHRoaW5nLmMgZnVlciBPYmpla3RlLCBkaWUgc2ljaGVyaGVpdHNyZWxldmFudCBzaW5kLgorICogU29sbHRlIHZvbiBEaW5nZW4gYXVzIC9zZWN1cmUgb2RlciBNYWdpZXJ0b29scyBhdWYgamVkZW4KKyAqIEZhbGwgc3RhdHQgL3N0ZC90aGluZyBpbmhlcml0ZWQgd2VyZGVuLgorICoKKyAqIERlciBVbnRlcnNjaGllZCB6dSAvc3RkL3RoaW5nIGJlc3RlaHQgZGFyaW4sIHBvdGVudGllbGwgdW5zaWNoZXJlCisgKiBBdXN3ZXJ0dW5nZW4gd2llIHByb2Nlc3Nfc3RyaW5nKCkgKEBAZnVuQEApIHp1IHZlcmhpbmRlcm4gLSBhbnNvbnN0ZW4KKyAqIGtvZW5udGUgamVtYW5kIE1hZ2llcm4gQ29kZSB1bnRlcnNjaGllYmVuLgorICoKKyAqLworI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBub19zaGFkb3cKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgcGVkYW50aWMKKworaW5oZXJpdCAiL3N0ZC90aGluZyI7CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCisvLyBpbnQgc2VjdXJlX2xldmVsKCkgLy8gaXN0IG51biBpbiBzaW11bF9lZnVuCisKK3ZhcmFyZ3Mgc3RyaW5nIGxvbmcoaW50IG1vZGUpCit7CisgIHJldHVybiBmdW5jYWxsKFF1ZXJ5UHJvcChQX0xPTkcpKTsKK30KKworc3RyaW5nIHNob3J0KCkKK3sKKyAgc3RyaW5nIHNoOworICBpZiggc2g9UXVlcnlQcm9wKFBfU0hPUlQpICkKKyAgICByZXR1cm4gZnVuY2FsbChzaCkrIi5cbiI7Cit9CisKZGlmZiAtLWdpdCBhL3N0ZC9zaGVsbHMvYmF1bS5jIGIvc3RkL3NoZWxscy9iYXVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIyZjNmZQotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9zaGVsbHMvYmF1bS5jCkBAIC0wLDAgKzEsMTEzIEBACisvLyBBdXRvcjogUnVtYXRhQGdteC5kZQorLy8gLi4uIHNvenVzYWdlbiBtZWluZSBwcml2YXRlIHJhc3NlIC4uLgorLy8KKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBzaGVsbHMvbWFnaWVyLmMgLS0gbWFnaWVyIHNoZWxsCisvLworLy8gJElkOiBiYXVtLmMgODY3NSAyMDE0LTAyLTE4IDIwOjM5OjU0WiBaZXNzdHJhICQKKworI3ByYWdtYSBzdHJvbmdfdHlwZXMsc2F2ZV90eXBlcworCitpbmhlcml0ICIvc3RkL3NoZWxscy9tYWdpZXIiOworCisvLyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisKKyNpbmNsdWRlIDx0aGluZy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8bW92aW5nLmg+CisjaW5jbHVkZSA8YXR0cmlidXRlcy5oPgorI2luY2x1ZGUgPGNvbWJhdC5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxhbnNpLmg+CisjaW5jbHVkZSA8dWRwLmg+CisjaW5jbHVkZSA8bmV3X3NraWxscy5oPgorCitzdGF0aWMgaW50IF93dXJ6ZWw7CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAoKSB8fCBvYmplY3RfbmFtZSh0aGlzX29iamVjdCgpKSA9PSBfX0ZJTEVfX1swLi48M10pIHsKKyAgICAgIHNldF9uZXh0X3Jlc2V0KC0xKTsgICAgCisgICAgICByZXR1cm47CisgIH0KKworICA6OmNyZWF0ZSgpOworCV93dXJ6ZWwgPSAtMTsKK30KKworc3RhdGljIGludCB3dXJ6ZWxfYW4oIHN0cmluZyBhcmcgKSB7CisJc3RyaW5nIG51bTsKKwlpbnQgY291bnQ7CisKKwlpZiggdGhpc19vYmplY3QoKSAhPSB0aGlzX2ludGVyYWN0aXZlKCkgKSByZXR1cm4gMDsKKwlub3RpZnlfZmFpbCggIldBUyB3aWxsc3QgRHUgc2NobGFnZW4/XG4iICk7CisJaWYoICFhcmcgfHwgc3NjYW5mKCBhcmcsICJ3dXJ6ZWwlcyIsIG51bSApID09IDAgKSByZXR1cm4gMDsKKworCWlmKCBzc2NhbmYoIG51bSwgIiAlZCIsIGNvdW50ICkgPT0gMCApIHsKKwkJbm90aWZ5X2ZhaWwoICJzY2hhZ2Ugd3VyemVsIDx6YWhsPlxuIiApOworCQlyZXR1cm4gMDsKKwl9CisKKwlfd3VyemVsID0gY291bnQ7CisJc2F5KCBOYW1lKFdFUikgKyAiIHNjaGxhZWd0IGhpZXIgV3VyemVsbi5cbiIgKTsKKwl3cml0ZSggIkR1IHNjaGxhZWdzdCBudW4gV3VyemVsbi5cbiIgKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCB3dXJ6ZWxfYXVzKCBzdHJpbmcgYXJnICkgeworCQorCWlmKCB0aGlzX29iamVjdCgpICE9IHRoaXNfaW50ZXJhY3RpdmUoKSApIHJldHVybiAwOworCW5vdGlmeV9mYWlsKCAiV0FTIHdpbGxzdCBkdSBsb2VzZW4/XG4iICk7CisJaWYoICFhcmcgKSByZXR1cm4gMDsKKwlpZiggbWVtYmVyKCAoeyJ3dXJ6ZWwiLCJ3dXJ6ZWxuIn0pLAlhcmcgKSA9PSAtMSApIHJldHVybiAwOworCQorCV93dXJ6ZWwgPSAtMTsKKwlzYXkoIE5hbWUoV0VSKSArICIgbG9lc3QgIiArIFF1ZXJ5UHJvbm91bihGRU1BTEUsV0VOLFBMVVJBTCkKKwkJCSArICIgV3VyemVsbiBhdXMgZGVtIEJvZGVuLlxuIiApOworCXdyaXRlKCAiRHUgbG9lc3QgRGVpbmUgV3VyemVsbiBhdXMgZGVtIEJvZGVuLlxuIiApOworCXJldHVybiAxOworfQorCitpbnQgd3VyemVsX2luZm8oIHN0cmluZyBhcmcgKSB7CisJaWYoIHRoaXNfb2JqZWN0KCkgIT0gdGhpc19pbnRlcmFjdGl2ZSgpICkgcmV0dXJuIDA7CisJc3dpdGNoKCBfd3VyemVsICkgeworCWNhc2UgLTE6CisJCXdyaXRlKCAiRGVpbmUgV3VyemVsbiBzaW5kIGxvc2UuXG4iICk7CisJCWJyZWFrOworCWNhc2UgMDoKKwkJd3JpdGUoICJEZWluZSBXdXJ6ZWxuIHNpdHplbiBmZXN0LlxuIiApOworCQlicmVhazsKKwljYXNlIDE6CisJCXdyaXRlKCAiTm9jaCBlaW5lIEJld2VndW5nIHVuZCBEdSBzaXR6dCBmZXN0LlxuIiApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYoICJOb2NoICVkIEJld2VndW5nZW4sIHVuZCBEdSBzaXR6dCBmZXN0LlxuIiwgX3d1cnplbCApOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIG1peGVkIF9xdWVyeV9sb2NhbGNtZHMoKSB7CisJcmV0dXJuIDo6X3F1ZXJ5X2xvY2FsY21kcygpICsgKHsKKwkJKHsgInNjaGxhZyIgICAgLCAid3VyemVsX2FuIiAgLDEsQVJDSF9MVkwgfSksCisJCSh7ICJsb2VzIiAgICAgICwgInd1cnplbF9hdXMiICwxLEFSQ0hfTFZMIH0pLAorCQkoeyAid3VyemVsaW5mbyIsICJ3dXJ6ZWxfaW5mbyIsMCxBUkNIX0xWTCB9KQorCX0pOworfQorCit2YXJhcmdzIGludCBtb3ZlKCBtaXhlZCBkZXN0LCBpbnQgbWV0aG9kLCBzdHJpbmcgZGlyLAorCQkJCQkJCQkJc3RyaW5nIHRleHRvdXQsIHN0cmluZyB0ZXh0aW4gKQoreworCWlmKCBfd3VyemVsID09IDAgKSB7CisJCXJldHVybiBNRV9UT09fSEVBVlk7CisJfQorCWlmKCBfd3VyemVsID4gMCApIHsgX3d1cnplbC0tOyB9CisJcmV0dXJuIDo6bW92ZSggZGVzdCwgbWV0aG9kLCBkaXIsIHRleHRvdXQsIHRleHRpbiApOworfQorCitzdGF0aWMgaW50IG5ld19xdWl0KCkgeworCV93dXJ6ZWwgPSAtMTsKKwlyZXR1cm4gOjpuZXdfcXVpdCgpOworfQpkaWZmIC0tZ2l0IGEvc3RkL3NoZWxscy9kYXJrZWxmLmMgYi9zdGQvc2hlbGxzL2RhcmtlbGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWUzN2ZiCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3NoZWxscy9kYXJrZWxmLmMKQEAgLTAsMCArMSwyNzAgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBzaGVsbHMvZGFya2VsZi5jIC0tIERhcmtlbGYgU2hlbGwKKy8vCisvLyAkSWQ6IGRhcmtlbGYuYyA4Njc1IDIwMTQtMDItMTggMjA6Mzk6NTRaIFplc3N0cmEgJAorCisjcHJhZ21hIHN0cm9uZ190eXBlcyxzYXZlX3R5cGVzCisKK2luaGVyaXQgIi9zdGQvcGxheWVyL2Jhc2UiOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGF0dHJpYnV0ZXMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxoZWFsdGguaD4KKyNpbmNsdWRlIDxuZXdfc2tpbGxzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8Y29tYmF0Lmg+CisjaW5jbHVkZSA8ZGVmdWVsLmg+CisjaW5jbHVkZSA8ZXJyb3JkLmg+CisKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAoKSB8fCBvYmplY3RfbmFtZSh0aGlzX29iamVjdCgpKSA9PSBfX0ZJTEVfX1swLi48M10pIHsKKyAgICBzZXRfbmV4dF9yZXNldCgtMSk7CisgICAgcmV0dXJuOworICB9CisgIGJhc2U6OmNyZWF0ZSgpOworICBTZXREZWZhdWx0SG9tZSgiL2dpbGRlbi9kdW5rZWxlbGZlbiIpOworICBTZXREZWZhdWx0UHJheVJvb20oIi9kL3VudGVyd2VsdC9jYWRyYS9yb29tL3Rvd24vdGVtcGxlbWFpbiIpOworICBTZXRQcm9wKFBfQVZFUkFHRV9TSVpFLDE3NSk7CisgIFNldFByb3AoUF9BVkVSQUdFX1dFSUdIVCw3MDAwMCk7CisgIFNldFByb3AoUF9BTElHTiwgLTUwMCk7CisgIFNldFByb3AoUF9TS0lMTF9BVFRSSUJVVEVfT0ZGU0VUUywoW1NBX0VORU1ZX1NBVkU6MTEwXSkpOworICBTZXRQcm9wKFBfQVRUUklCVVRFU19PRkZTRVRTLChbQV9JTlQ6NCxBX0RFWDoyXSkpOworICBTZXRQcm9wKFBfTUFURVJJQUxfS05PV0xFREdFLChbTUFUR1JPVVBfVU5IT0xZOiAxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVRHUk9VUF9NQUdJQzogICA3MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BVEdST1VQX0RFQUQ6ICAgIDUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFUR1JPVVBfTUVUQUw6ICAgMzBdKSApOworICBTZXRQcm9wKFBfUkVTSVNUQU5DRV9TVFJFTkdUSFMsCisgICAgICAgICAgICAoWyBEVF9IT0xZIDogICAgMC4yNSwKKyAgICAgICAgICAgICAgIERUX1VOSE9MWSA6IC0wLjE1LAorICAgICAgICAgICAgICAgRFRfVEVSUk9SIDogLTAuMDUgXSkpOworICBTZXRQcm9wKFBfTUFYX0ZPT0QsODApOworICBTZXRQcm9wKFBfTUFYX0RSSU5LLDE1MCk7CisgIFNldFByb3AoUF9NQVhfQUxDT0hPTCw3MCk7CisKKyAgU2V0UHJvcChQX1NQX0RFTEFZLCBIRUFMX0RFTEFZLTIpOyAvLyBkYWZ1ZXIgcmVnZW5lcmllcnQgbWFuIGltIGZyZWllbgorICBTZXRQcm9wKFBfSFBfREVMQVksIEhFQUxfREVMQVktMSk7IC8vIHdpcmtsaWNoIF9uaWNodHNfCisgIFNldFByb3AoUF9GT09EX0RFTEFZLEZPT0RfREVMQVkrMSk7CisgIFNldFByb3AoUF9EUklOS19ERUxBWSxEUklOS19ERUxBWS0yKTsKKyAgU2V0UHJvcChQX0FMQ09IT0xfREVMQVksQUxDT0hPTF9ERUxBWSsxKTsKKworICBTZXRQcm9wKFBfTUFHSUNfUkVTSVNUQU5DRV9PRkZTRVQsCisgICAgICAgIChbIE1UX0lMTFVTSU9OICAgIDogMjAwLAorICAgICAgICAgICBNVF9BTkdSSUZGICAgICA6IDUwMCwKKwkgICBNVF9CRUhFUlJTQ0hVTkc6IDUwMCwKKwkgICBNVF9QU1lDSE8gICAgICA6IDgwMCBdKSk7CisKKyAgLyogR3JvZXNzZSB3aXJkIG51ciBlaW5tYWwgZ2VzZXR6dCAqLworICBpZighUXVlcnlQcm9wKFBfU0laRSkpIHsKKyAgICBTZXRQcm9wKFBfU0laRSwxNTArcmFuZG9tKDUwKSk7CisgICAgU2V0KFBfU0laRSxTQVZFLEZfTU9ERV9BUyk7CisgIH0KKworICAvKiBEaXRvIEdld2ljaHQgKi8KKyAgaWYoIVF1ZXJ5UHJvcChQX1dFSUdIVCkgfHwgKFF1ZXJ5UHJvcChQX1dFSUdIVCkgPT0gNzUwMDApKXsKKyAgICBTZXRQcm9wKFBfV0VJR0hULDYwMDAwK3JhbmRvbSgyMDAwMSkpOworICAgIGlmKFF1ZXJ5UHJvcChQX0dFTkRFUik9PUZFTUFMRSkKKyAgICAgIFNldFByb3AoUF9XRUlHSFQsUXVlcnlQcm9wKFBfV0VJR0hUKS01MDAwKTsKKyAgICBTZXQoUF9XRUlHSFQsU0FWRSxGX01PREVfQVMpOworICB9CisgIFNldFByb3AoUF9ERUZVRUxfTElNSVRfRk9PRCw0MCk7CisgIFNldFByb3AoUF9ERUZVRUxfTElNSVRfRFJJTkssMzApOworICBTZXRQcm9wKFBfREVGVUVMX1RJTUVfRk9PRCw0MDApOworICBTZXRQcm9wKFBfREVGVUVMX1RJTUVfRFJJTkssMjUwKTsKKyAgU2V0UHJvcChQX0RFRlVFTF9BTU9VTlRfRk9PRCwwLjQ1KTsKKyAgU2V0UHJvcChQX0RFRlVFTF9BTU9VTlRfRFJJTkssMC40KTsKK30KKworc3RhdGljIHZvaWQgRmluYWxTZXR1cCgpCit7CisgICBpZiAoIVF1ZXJ5U2tpbGwoU0tfTklHSFRWSVNJT04pKQorICAgICAgTW9kaWZ5U2tpbGwoU0tfTklHSFRWSVNJT04sIDUwMDAsIDAsICJBTlkiKTsKK30KKworc3RyaW5nIF9xdWVyeV9yYWNlKCkKKy8vIG5pY2h0IHN0YXRpYywgZGEgc2llIG1hbmNobWFsIGF1Y2ggc28gYXVmZ2VydWZlbiB3aXJkLi4uCit7CisgIHJldHVybiAiRHVua2VsZWxmIjsKK30KKworc3RyaW5nIF9xdWVyeV9yZWFsX3JhY2UoKQoreworICByZXR1cm4gIkR1bmtlbGVsZiI7Cit9CisKK3N0YXRpYyBzdHJpbmcgX3F1ZXJ5X3JhY2VkZXNjcigpCit7CisJICByZXR1cm4KKyJcCitEYXMgVm9sayBkZXIgRHVua2VsZWxmZW4gbGVidCBpbiBlaW5lciBncm9zc2VuIEhvZWhsZW5zdGFkdCBndXQgdmVyc3RlY2t0XG5cCitoaW50ZXIgZWluZW0gV2Fzc2VyZmFsbC4gVWViZXIga2F1bSBlaW4gYW5kZXJlcyBWb2xrIGdpYnQgZXMgc292aWVsZVxuXAorVm9ydXJ0ZWlsZSB3aWUgdWViZXIgZGllIER1bmtlbGVsZmVuLCB1bmQgc28gd2VyZGVuIHNpZSB2b24gYWxsZW4gbWlzc3RyYXVpc2NoXG5cCitiZWFldWd0IG9kZXIgc29nYXIgYmVrYWVtcGZ0LiBJbiBkaWVzZW0gS2FtcGYsIGluc2Jlc29uZGVyZSBnZWdlbiBkaWUgRWxmZW4sXG5cCitzaW5kIHNpZSB2b2VsbGlnIGF1ZiBzaWNoIGFsbGVpbiBnZXN0ZWxsdCwgdW5kIHNvIGhhdCBzaWNoIGVpbmUgbWVociBvZGVyXG5cCittaW5kZXIgYXV0YXJrZSBHZXNlbGxzY2hhZnQgZW50d2lja2VsdC4gRGllIER1bmtlbGVsZmVuIGhhYmVuIGVpbmUgZWlnZW5lXG5cCitLdWx0dXIgdW5kIGVpbmUgZWlnZW5lIEdvZXR0aW4sIGRlciBzaWUgaHVsZGlnZW4uIFdpZSBhdWNoIGRpZSBFbGZlblxuXAordmVyZnVlZ2VuIHNpZSB1ZWJlciBhdXNzZXJvcmRlbmxpY2ggZ3Jvc3NlIG1hZ2lzY2hlIEZhZWhpZ2tlaXRlbiwgYXVjaCB3ZW5uXG5cCitzaWUgc2ljaCBtZWhyIGF1ZiBkaWUgc2Nod2FyemUgU2VpdGUgZGVyIE1hZ2llIHNwZXppYWxpc2llcnQgaGFiZW4uXG4iOworfQorCisvLyBpbnQgUXVlcnlBbGxvd1NlbGVjdCgpIHsgcmV0dXJuIDA7IH0KKy8vIEFrdGl2aWVydCBhbSAyOC4wNy4wMywgQXJrLgoraW50IFF1ZXJ5QWxsb3dTZWxlY3QoKSB7IHJldHVybiAxOyB9CisKK3N0cmluZyAqX3F1ZXJ5X3JhY2VzdHJpbmcoKQoreworICBpZiAoUXVlcnlQcm9wKFBfR0VOREVSKT09MikKKyAgICByZXR1cm4gKHsiRHVua2VsZWxmZSIsIkR1bmtlbGVsZmUiLCJEdW5rZWxlbGZlIiwiRHVua2VsZWxmZSJ9KTsKKyAgcmV0dXJuICh7IkR1bmtlbGVsZiIsIkR1bmtlbGVsZmVuIiwiRHVua2VsZWxmIiwiRHVua2VsZWxmIn0pOworfQorCitzdGF0aWMgc3RyaW5nIF9xdWVyeV9kZWZhdWx0X2d1aWxkKCkKK3sKKyAgcmV0dXJuICJkdW5rZWxlbGZlbiI7Cit9CisKK3N0YXRpYyBpbnQgc3VuX2luX3Jvb20ob2JqZWN0IHJvb20pCit7CisgIGlmICghcm9vbSkgcmV0dXJuIDA7CisgIGNsb3N1cmUgcXA9c3ltYm9sX2Z1bmN0aW9uKCJRdWVyeVByb3AiLCByb29tKTsKKyAgaW50IGx0PWZ1bmNhbGwocXAsIFBfTElHSFRfVFlQRSk7CisgIC8vIChsdCAmIExUX1NVTikgaXN0IGhpZXIgenVuYWVjaHN0IF90ZXN0d2Vpc2VfIGRyaW4uIERpZSBSYXNzZSB3dXJkZQorICAvLyBhbmRlcnMgZ2VuZWhtaWd0LiBTb2xsdGUgZGFzIGltIE1HIHVlYmVyaGFuZCBuZWhtZW4gdW5kIGplZGVyIEtlbGxlcgorICAvLyBudW4gc29ubmVuZHVyY2hmbHV0ZXQgc2VpbiwgZGFubiB3aXJkIGRhcyB3aWVkZXIgYXVzZ2ViYXV0IQorICAvLyAyNy4wNi4wNCBQYWRyZWljCisgIHJldHVybiAoIChmdW5jYWxsKHFwLCBQX0lOVF9MSUdIVCk+MCkgJiYKKyAgICAgICAgICAoKGx0ICYgTFRfU1VOKSB8fCAoKGx0PT1MVF9NSVNDKSAmJiAhZnVuY2FsbChxcCwgUF9JTkRPT1JTKSkpKTsKK30KKworcHJvdGVjdGVkIHZvaWQgaGVhcnRfYmVhdCgpCit7CisgIDo6aGVhcnRfYmVhdCgpOworICBpZiAoc3VuX2luX3Jvb20oZW52aXJvbm1lbnQoKSkgJiYKKyAgICAgIFF1ZXJ5UHJvcCgiRHVua2VsZWxmZW46T3V0ZG9vciIpPHJhbmRvbSgxMDApICYmICFRdWVyeVByb3AoUF9HSE9TVCkpIHsKKyAgICAgaW50IGhwOworICAgICBocD1RdWVyeVByb3AoUF9IUCktMTsKKyAgICAgU2V0UHJvcChQX0hQLCBocCk7CisgICAgIGlmIChocDwwKSB7CisgICAgICAgdGVsbF9vYmplY3QoTUUsCisgICAgICAgICAiRGFzIHdhciB3b2hsIHp1dmllbCBmdWVyIERpY2guIERhcyBuYWVjaHN0ZSBtYWwgc29sbHRlc3QgRHUgRGljaCAiCisgICAgICAgICsid29obCBiZXNzZXJcbmdlZ2VuIGRpZSBTb25uZSBzY2h1ZXR6ZW4uXG4iKTsKKyAgICAgICBTZXRQcm9wKFBfS0lMTF9OQU1FLCJadXZpZWwgU29ubmUiKTsKKyAgICAgICBkb19kYW1hZ2UoOTk5LE1FKTsKKyAgICAgICBTZXRQcm9wKFBfS0lMTF9OQU1FLDApOworICAgICB9CisgICAgIGVsc2UgdGVsbF9vYmplY3QoTUUsIC8qIGRpZSBJbmZvIG11c3N0ZSBpcmdlbmR3aWUgaW4gZWluZSBaZWlsZSAqLworICAgICAgICAgICAiRGllIFNvbm5lIHNjaGVpbnQgZ25hZGVubG9zIGF1ZiBEZWluIEhhdXB0IHVuZCBzY2h3YWVjaHQgRGljaC5cbiIpOworICB9Cit9CisKK3N0YXRpYyBpbnQgX3F1ZXJ5X25vX3JlZ2VuZXJhdGlvbigpCit7CisgIGlmIChzdW5faW5fcm9vbShlbnZpcm9ubWVudCgpKSkKKyAgICAgcmV0dXJuIE5PX1JFRzsKKyAgcmV0dXJuIFF1ZXJ5KFBfTk9fUkVHRU5FUkFUSU9OKTsKK30KKworaW50IFN0ZFNraWxsX05pZ2h0dmlzaW9uKG9iamVjdCBtZSwgc3RyaW5nIHNuYW1lLCBtaXhlZCBzaW5mbykKK3sKKyAgaW50IGxhc3QsIGxpZ2h0OworCisgIGlmICghc2luZm8gfHwgIWVudmlyb25tZW50KCkpIHJldHVybiAwOworICBpZiAoaW50cChzaW5mbykpIHNpbmZvPShbU0lfU0tJTExBQklMSVRZOnNpbmZvXSk7CisgIGlmICghbWFwcGluZ3Aoc2luZm8pKSByZXR1cm4gMDsKKyAgbGlnaHQ9KFF1ZXJ5UHJvcChQX1BMQVlFUl9MSUdIVCk8PTAgPyAtMSA6IDEpOworICBpZiAobGFzdD1zaW5mb1tTSV9VU1JdKSB7IC8vIGxldHp0ZXMgTGljaHRsZXZlbCAhPSAwCisgICAgIGlmIChsaWdodD09bGFzdCkgeworICAgICAgIGlmIChzaW5mb1tTSV9MQVNUTElHSFRdPD10aW1lKCkpCisgICAgICAgICAgcmV0dXJuIHNpbmZvW1NJX1NLSUxMQUJJTElUWV0rMTsKKyAgICAgICByZXR1cm4gLTE7CisgICAgIH0KKyAgICAgZWxzZSB7CisgICAgICAgbGFzdD0oIE1BWF9BQklMSVRZIC0gc2luZm9bU0lfU0tJTExBQklMSVRZXSApOworICAgICAgIGxhc3Q9KGxhc3QvMTAwMCkgKyAobGFzdCUxMDAwID4gcmFuZG9tKDEwMDEpID8gMSA6IDApOworICAgICAgIGlmIChsaWdodDwwKSBsYXN0Lz0yOyAvLyBhbiBEdW5rZWxrZWl0IHNjaG5lbGxlciBnZXdvZWhuZW4uLi4KKyAgICAgICBpZighdGhpc19pbnRlcmFjdGl2ZSgpIHx8IHRoaXNfaW50ZXJhY3RpdmUoKT09dGhpc19vYmplY3QoKSkKKyAgICAgICB7CisJICAgICAgIE1vZGlmeVNraWxsKHNuYW1lLCAoW1NJX1VTUjogbGlnaHQsIFNJX0xBU1RMSUdIVDogdGltZSgpK2xhc3RdKSwKKyAgICAgICAgCSAgICAgICAgICAgMCwgc2luZm9bU0lfR1VJTERdKTsKKyAgICAgICB9CisgICAgICAgaWYgKGxhc3Q8PTApCisgICAgICAgICAgcmV0dXJuIHNpbmZvW1NJX1NLSUxMQUJJTElUWV0rMTsKKyAgICAgICByZXR1cm4gLTE7CisgICAgIH0KKyAgfQorICBlbHNlIHsgLy8gU3RhcnR3ZXJ0Li4uCisgICAgaWYoIXRoaXNfaW50ZXJhY3RpdmUoKSB8fCB0aGlzX2ludGVyYWN0aXZlKCk9PXRoaXNfb2JqZWN0KCkpCisgICAgeworICAgIAlNb2RpZnlTa2lsbChzbmFtZSwgKFtTSV9VU1I6IGxpZ2h0LCBTSV9MQVNUTElHSFQ6IDBdKSwgMCwgc2luZm9bU0lfR1VJTERdKTsKKyAgICB9CisgICAgcmV0dXJuIHNpbmZvW1NJX1NLSUxMQUJJTElUWV0rMTsKKyAgfQorICByZXR1cm4gMDsKK30KKwordmFyYXJncyBpbnQgQ2Fubm90U2VlKGludCBzaWxlbnQpCit7CisgIHN0cmluZyBpc19ibGluZDsKKworICBpZiAoIGlzX2JsaW5kID0gUXVlcnlQcm9wKCBQX0JMSU5EICkgKSB7CisgICAgIGlmICghc2lsZW50KSB7CisgICAgICAgaWYgKHN0cmluZ3AoaXNfYmxpbmQpKSB3cml0ZShpc19ibGluZCk7CisgICAgICAgZWxzZSB3cml0ZSgiRHUgYmlzdCBibGluZCFcbiIpOworICAgICB9CisgICAgIHJldHVybiAxOworICB9CisgIGlmIChlbnZpcm9ubWVudCgpICYmICghSVNfTEVBUk5FUihNRSkgfHwgIVF1ZXJ5KFBfV0FOVFNfVE9fTEVBUk4pKSkgeworICAgICBpZiAoUXVlcnlQcm9wKFBfR0hPU1QpKSB7CisgICAgICAgIGlmIChTdGRTa2lsbF9OaWdodHZpc2lvbihNRSwgU0tfTklHSFRWSVNJT04sIFF1ZXJ5U2tpbGwoU0tfTklHSFRWSVNJT04pKT4wKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgIH0KKyAgICAgZWxzZSBpZiAoVXNlU2tpbGwoU0tfTklHSFRWSVNJT04pPjApIHJldHVybiAwOworICAgICBpZiAoIXNpbGVudCkgeworICAgICAgICBpZiAoUXVlcnlQcm9wKFBfUExBWUVSX0xJR0hUKTw9MCkKKyAgICAgICAgICB3cml0ZSgiRHUga2FubnN0IG5pY2h0cyBzZWhlbiwgZGEgc2ljaCBEZWluZSBBdWdlbiBub2NoIG5pY2h0IGFuIGRpZSBEdW5rZWxoZWl0XG4iCisgICAgICAgICAgICAgICArImdld29laG50IGhhYmVuIVxuIik7CisgICAgICAgIGVsc2Ugd3JpdGUoIkR1IGJpc3Qgdm9uIGRlbSBoZWxsZW4gTGljaHQgdG90YWwgZ2VibGVuZGV0IHVuZCBEdSBtdXNzdCBEaWNoIGVyc3QgbGFuZ3NhbVxuIgorICAgICAgICAgICAgICAgICAgKyJkYXJhbiBnZXdvZWhuZW4uXG4iKTsKKyAgICAgfQorICAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworCisvKgorICogMjAwMy0xMS0wNSwgWm9vazoKKyAqCisgKiAgIFRlbXBvcmFlcmUgRnVua3Rpb24sIGRpZSBkZW4gRGVsZmVuIGVzIGVybW9lZ2xpY2h0LCBlaW5lbgorICogICBtb2VnbGljaGVyd2Vpc2UgZmFsc2NoZW4gUmF1bSAoSW5kb29yL091dGRvb3IpIHp1IG1lbGRlbi4KKyAqCisgKi8KKworc3RhdGljIGludCBfaW5kb29yYnVnKHN0cmluZyBrZXkpCit7CisgIGlmICghc3RyaW5ncChrZXkpKQorICAgIGtleT0gIiI7CisKKyAgRVJST1JELT5Mb2dSZXBvcnRlZEVycm9yKAorICAgICAgKFsgRl9QUk9HOiAidW5iZWthbm50IiwKKyAgICAgICAgIEZfTElORTogMCwKKyAgICAgICAgIEZfTVNHOiAiU29ubmVuZmVobGVyOiAiICsga2V5LAorICAgICAgICAgRl9PQko6IGVudmlyb25tZW50KHRoaXNfb2JqZWN0KCkpCisgICAgICBdKQorICAgICAgKTsKKworICB3cml0ZSgiRHUgaGFzdCBlaW5lbiBmZWhsZXJoYWZ0ZW4gSW5uZW4tL0F1c3Nlbi0vU29ubmVubGljaHRyYXVtIGdlbWVsZGV0LlxuIik7CisKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBtaXhlZCBfcXVlcnlfbG9jYWxjbWRzKCkKK3sKKyAgcmV0dXJuICh7ICh7InNvbm5lbmZlaGxlciIsICJfaW5kb29yYnVnIiwgMCwgMCB9KSB9KQorICAgICAgICAgICAgKyBiYXNlOjpfcXVlcnlfbG9jYWxjbWRzKCk7Cit9CisKZGlmZiAtLWdpdCBhL3N0ZC9zaGVsbHMvZHdhcmYuYyBiL3N0ZC9zaGVsbHMvZHdhcmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTY5NmRjCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3NoZWxscy9kd2FyZi5jCkBAIC0wLDAgKzEsMTU2IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gc2hlbGxzL2R3YXJmLmMgLS0gRHdhcnZlbiBTaGVsbAorLy8KKy8vICRJZDogZHdhcmYuYyx2IDMuMTQgMjAwNC8xMi8xMyAxMjo1NDozMSBab29rIEV4cCAkCisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHNhdmVfdHlwZXMKKworaW5oZXJpdCAic3RkL3BsYXllci9iYXNlIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxhdHRyaWJ1dGVzLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8aGVhbHRoLmg+CisjaW5jbHVkZSA8bmV3X3NraWxscy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8Y29tYmF0Lmg+CisjaW5jbHVkZSA8ZGVmdWVsLmg+CisKKwordm9pZCBjcmVhdGUoKXsKKyAgaWYgKCFjbG9uZXAoKSB8fCBvYmplY3RfbmFtZSh0aGlzX29iamVjdCgpKSA9PSBfX0ZJTEVfX1swLi48M10pIHsKKyAgICAgIHNldF9uZXh0X3Jlc2V0KC0xKTsgICAgCisgICAgICByZXR1cm47CisgIH0KKworICBtaXhlZCByZXM7CisKKyAgYmFzZTo6Y3JlYXRlKCk7CisgIFNldERlZmF1bHRIb21lKCIvZC9nZWJpcmdlL3Jvb20vemthcGVsbGUiKTsKKyAgU2V0RGVmYXVsdFByYXlSb29tKCIvZC9nZWJpcmdlL3Jvb20vemthcGVsbGUiKTsKKyAgU2V0UHJvcChQX0FUVFJJQlVURVNfT0ZGU0VUUywoW0FfU1RSOjIsQV9ERVg6MSxBX0NPTjozXSkpOworICBTZXRQcm9wKFBfU0tJTExfQVRUUklCVVRFX09GRlNFVFMsKFtTQV9EVVJBVElPTjoxMTBdKSk7CisgIFNldFByb3AoUF9BVkVSQUdFX1NJWkUsMTIwKTsKKyAgU2V0UHJvcChQX0FWRVJBR0VfV0VJR0hULDc1MDAwKTsKKyAgU2V0UHJvcChQX01BVEVSSUFMX0tOT1dMRURHRSwoW01BVEdST1VQX1NUT05FOjMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFUR1JPVVBfTUVUQUw6MzAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFUR1JPVVBfUFJFQ0lPVVNfTUVUQUw6IDQwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BVF9HT0xEOjEwMF0pKTsKKyAgU2V0UHJvcChQX1JFU0lTVEFOQ0VfU1RSRU5HVEhTLAorCSAgKFsgRFRfRklSRSA6IC0wLjIsCisJICAgRFRfV0FURVIgOiAwLjQgXSkpOworICBTZXRQcm9wKFBfTUFYX0FMQ09IT0wsMjAwKTsKKyAgU2V0UHJvcChQX01BWF9GT09ELDE2MCk7CisKKyAgU2V0UHJvcChQX1NQX0RFTEFZLEhFQUxfREVMQVkrMSk7CisgIFNldFByb3AoUF9QT0lTT05fREVMQVksUE9JU09OX0RFTEFZKzEpOworICBTZXRQcm9wKFBfRk9PRF9ERUxBWSxGT09EX0RFTEFZLTEpOworICBTZXRQcm9wKFBfQUxDT0hPTF9ERUxBWSxBTENPSE9MX0RFTEFZLTEpOworCisgIFNldFByb3AoUF9NQUdJQ19SRVNJU1RBTkNFX09GRlNFVCwKKyAgICAgICAgICAoWyBNVF9BTkdSSUZGIDogMjAwLAorCSAgIE1UX0lMTFVTSU9OIDogLTUwMCwKKyAgICAgICAgICAgTVRfQkVIRVJSU0NIVU5HIDogMTAwMCwKKwkgICBNVF9WRVJXQU5ETFVORyA6IDUwMCBdKSk7CisKKyAgaWYoIUlTX1NFRVIodGhpc19vYmplY3QoKSkpeworICAgIFNldFByb3AoUF9NU0dJTiwic3RhcGZ0IGhlcmVpbiIpOworICAgIFNldFByb3AoUF9NU0dPVVQsInN0YXBmdCIpOworICB9CisKKyAgaWYoIShyZXM9UXVlcnlQcm9wKFBfSEFORFMpKSB8fCAhcG9pbnRlcnAocmVzKSB8fCAoc2l6ZW9mKHJlcyk8MykpCisgICAgcmVzPSh7IiBtaXQgYmxvc3NlbiBIYWVuZGVuIiwzNSwoe0RUX0JMVURHRU9OfSkgfSk7CisgIHJlc1sxXT0zNTsKKyAgU2V0UHJvcChQX0hBTkRTLHJlcyk7CisgIFNldFByb3AoUF9CT0RZLDEwKTsKKworICAvKiBHcm9lc3NlIHdpcmQgbnVyIGVpbm1hbCBnZXNldHp0ICovCisgIGlmKCFRdWVyeVByb3AoUF9TSVpFKSl7CisgICAgU2V0UHJvcChQX1NJWkUsMTEwK3JhbmRvbSgyMSkpOworICAgIFNldChQX1NJWkUsU0FWRSxGX01PREVfQVMpOworICB9CisKKyAgLyogRGl0byBHZXdpY2h0ICovCisgIGlmKCFRdWVyeVByb3AoUF9XRUlHSFQpIHx8IChRdWVyeVByb3AoUF9XRUlHSFQpID09IDc1MDAwKSl7CisgICAgU2V0UHJvcChQX1dFSUdIVCw2NTAwMCtyYW5kb20oMjAwMDEpKTsKKyAgICBpZihRdWVyeVByb3AoUF9HRU5ERVIpPT1GRU1BTEUpCisgICAgICBTZXRQcm9wKFBfV0VJR0hULFF1ZXJ5UHJvcChQX1dFSUdIVCktNTAwMCk7CisgICAgU2V0KFBfV0VJR0hULFNBVkUsRl9NT0RFX0FTKTsKKyAgfQorCisgIFNldFByb3AoUF9ERUZVRUxfTElNSVRfRk9PRCw3MCk7CisgIFNldFByb3AoUF9ERUZVRUxfTElNSVRfRFJJTkssNTApOworICBTZXRQcm9wKFBfREVGVUVMX1RJTUVfRk9PRCw1MzUpOworICBTZXRQcm9wKFBfREVGVUVMX1RJTUVfRFJJTkssNTAwKTsKKyAgU2V0UHJvcChQX0RFRlVFTF9BTU9VTlRfRk9PRCwwLjgpOworICBTZXRQcm9wKFBfREVGVUVMX0FNT1VOVF9EUklOSywwLjYpOworCit9CisKK3N0cmluZyBfcXVlcnlfcmFjZSgpCit7CisgIHJldHVybiAiWndlcmciOworfQorCitzdHJpbmcgX3F1ZXJ5X3JlYWxfcmFjZSgpCit7CisgIHJldHVybiAiWndlcmciOworfQorCitzdHJpbmcgX3F1ZXJ5X3JhY2VkZXNjcigpCit7CisgIHJldHVybgorICAiWndlcmdlIHNpbmQga2xlaW5lIGFiZXIga3JhZWZ0aWdlIEdlYmlyZ3NiZXdvaG5lciwgbmljaHQgc2VociBnZXNwcmFlY2hpZyxcbiIKKyAgICArImxlaWNodCBlcnp1ZXJudCwgYWJlciBlaW5lIHNjaGxhZ2tyYWVmdGlnZSBVbnRlcnN0dWV0enVuZyBmdWVyIGlocmUgRnJldW5kZS4iCisgICAgKyJcbiIKKyAgICArIklociBNdXQgdW5kIGlocmUgU3RhbmRmZXN0aWdrZWl0IGlzdCB3ZWl0IHVuZCBicmVpdCBiZXJ1ZWhtdCwgYXVjaCBpaHJcbiIKKyAgICArIkdlc2NoaWNrIGltIFVtZ2FuZyBtaXQgWndlcmdlbndhZmZlbiB2ZXJsZWlodCBpaG5lbiB6dXNhZXR6bGljaGUgS3JhZnQuXG4iCisgICAgKyJMZWlkZXIgc2luZCBad2VyZ2UgbmljaHQgYWxsenUgc2NobGF1LCBzaWUgdmVybGFzc2VuIHNpY2ggbGllYmVyIGF1ZlxuIgorICAgICsiaWhyZSBLcmFmdCBhbHMgYXVmIGlociBHZWhpcm4uXG4iOworfQorCitpbnQgUXVlcnlBbGxvd1NlbGVjdCgpIHsgcmV0dXJuIDE7IH0KKworc3RyaW5nICpfcXVlcnlfcmFjZXN0cmluZygpCit7CisgIGlmIChRdWVyeVByb3AoUF9HRU5ERVIpPT0yKQorICAgIHJldHVybiAoeyJad2VyZ2luIiwiWndlcmdpbiIsIlp3ZXJnaW4iLCJad2VyZ2luIn0pOworICByZXR1cm4gKHsiWndlcmciLCJad2VyZ2VzIiwiWndlcmciLCJad2VyZyJ9KTsKK30KK2ludCBfcXVlcnlfaHBfZGVsYXkoKXsKKyAgaW50IHJlOworICByZSA9IFF1ZXJ5KFBfSFBfREVMQVkpOworICBpZiAoZW52aXJvbm1lbnQoKSAmJiBlbnZpcm9ubWVudCgpLT5RdWVyeVByb3AoUF9JTkRPT1JTKSkKKyAgICByZS0tOworICBlbHNlCisgICAgcmUrKzsKKyAgcmV0dXJuIHJlOworfQoraW50IF9xdWVyeV9zcF9kZWxheSgpeworICBpbnQgcmU7CisgIHJlID0gUXVlcnkoUF9TUF9ERUxBWSk7CisgIGlmIChlbnZpcm9ubWVudCgpICYmIGVudmlyb25tZW50KCktPlF1ZXJ5UHJvcChQX0lORE9PUlMpKQorICAgIHJlLS07CisgIGVsc2UKKyAgICByZSsrOworICByZXR1cm4gcmU7Cit9CisKK3N0cmluZyBfcXVlcnlfZGVmYXVsdF9ndWlsZCgpeworICByZXR1cm4gImFiZW50ZXVyZXIiOworfQorCittaXhlZCBSYWNlRGVmYXVsdChzdHJpbmcgYXJnKQoreworICBpZiAoIWFyZykKKyAgICByZXR1cm4gMDsKKyAgc3dpdGNoKGFyZykKKyAgeworICAgIGNhc2UgUF9IQU5EUyA6CisgICAgICByZXR1cm4gKHsiIG1pdCBibG9zc2VuIEhhZW5kZW4iLDM1LCh7RFRfQkxVREdFT059KSB9KTsKKyAgICBjYXNlIFBfQk9EWSA6CisgICAgICByZXR1cm4gMTA7CisgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zdGQvc2hlbGxzL2VsZi5jIGIvc3RkL3NoZWxscy9lbGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWM0MTE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkL3NoZWxscy9lbGYuYwpAQCAtMCwwICsxLDE1NCBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHNoZWxscy9lbGYuYyAtLSBFbHZlbiBTaGVsbAorLy8KKy8vICRJZDogZWxmLmMgODkyOCAyMDE0LTA5LTA4IDE2OjE4OjQxWiBaZXNzdHJhICQKKworI3ByYWdtYSBzdHJvbmdfdHlwZXMsc2F2ZV90eXBlcworCitpbmhlcml0ICJzdGQvcGxheWVyL2Jhc2UiOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGF0dHJpYnV0ZXMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxoZWFsdGguaD4KKyNpbmNsdWRlIDxuZXdfc2tpbGxzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxjb21iYXQuaD4KKyNpbmNsdWRlIDxkZWZ1ZWwuaD4KKworCisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAoKSB8fCBvYmplY3RfbmFtZSh0aGlzX29iamVjdCgpKSA9PSBfX0ZJTEVfX1swLi48M10pIHsKKyAgICAgIHNldF9uZXh0X3Jlc2V0KC0xKTsgICAgCisgICAgICByZXR1cm47CisgIH0KKworICBiYXNlOjpjcmVhdGUoKTsKKyAgU2V0RGVmYXVsdEhvbWUoIi9kL3dhbGQvcm9vbS9lc19taXR0ZSIpOworICBTZXREZWZhdWx0UHJheVJvb20oIi9kL3dhbGQvcm9vbS9lc19taXR0ZSIpOworICBTZXRQcm9wKFBfQVZFUkFHRV9TSVpFLDE5NSk7CisgIFNldFByb3AoUF9BVkVSQUdFX1dFSUdIVCw3MDAwMCk7CisgIFNldFByb3AoUF9TS0lMTF9BVFRSSUJVVEVfT0ZGU0VUUywoW1NBX0VORU1ZX1NBVkU6MTEwXSkpOworICBTZXRQcm9wKFBfQVRUUklCVVRFU19PRkZTRVRTLChbQV9JTlQ6MyxBX0RFWDoyLEFfQ09OOjFdKSk7CisgIFNldFByb3AoUF9NQVRFUklBTF9LTk9XTEVER0UsKFtNQVRHUk9VUF9XT09EOjMwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BVEdST1VQX0hFUkJBTDozMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVRHUk9VUF9MSVZJTkc6MjBdKSk7CisKKyAgU2V0UHJvcChQX01BWF9GT09ELDgwKTsKKyAgU2V0UHJvcChQX01BWF9EUklOSywxNTApOworICBTZXRQcm9wKFBfTUFYX0FMQ09IT0wsNzApOworCisgIFNldFByb3AoUF9TUF9ERUxBWSxIRUFMX0RFTEFZLTEpOworICBTZXRQcm9wKFBfRk9PRF9ERUxBWSxGT09EX0RFTEFZKzEpOworICBTZXRQcm9wKFBfRFJJTktfREVMQVksRFJJTktfREVMQVktMik7CisgIFNldFByb3AoUF9BTENPSE9MX0RFTEFZLEFMQ09IT0xfREVMQVkrMSk7CisKKyAgU2V0UHJvcChQX01BR0lDX1JFU0lTVEFOQ0VfT0ZGU0VULAorICAgICAgICAgIChbIE1UX0lMTFVTSU9OIDogODAwLAorICAgICAgICAgICBNVF9BTkdSSUZGIDogMjAwLAorCSAgIE1UX1ZFUldBTkRMVU5HIDogNDAwLAorCSAgIE1UX1BTWUNITyA6IDUwMCBdKSk7CisKKyAgLy8gRWxmZW4ga3JpZWdlbiBkaWUgRWJlbmUgZGVyIFdpcGZlbGxhZXVmZXIgcGVyIGRlZmF1bHQuIChadSBkaWVzZW0KKyAgLy8gWmVpdHB1bmt0IHN0ZWhlbiBpbiBQX0NIQU5ORUxTIG51ciBkaWUgZGVmYXVsdCBjaGFubmVsIGRyaW4sIHdpcmQgZGFubgorICAvLyB1ZWJlciBkYXMgRWlubGVzZW4gZGVzIFNhdmVmaWxlcyBnZ2YuIHVlYmVyc2NocmllYmVuLikKKyAgU2V0UHJvcChQX0NIQU5ORUxTLCBRdWVyeVByb3AoUF9DSEFOTkVMUykgKyAoeyJ3aXBmZWxsYWV1ZmVyIn0pKTsKKworICBpZighSVNfU0VFUih0aGlzX29iamVjdCgpKSl7CisgICAgU2V0UHJvcChQX01TR0lOLCJ3YW5kZWx0IGhlcmVpbiIpOworICAgIFNldFByb3AoUF9NU0dPVVQsIndhbmRlbHQiKTsKKyAgfQorCisgIC8qIEdyb2Vzc2Ugd2lyZCBudXIgZWlubWFsIGdlc2V0enQgKi8KKyAgaWYoIVF1ZXJ5UHJvcChQX1NJWkUpKXsKKyAgICBTZXRQcm9wKFBfU0laRSwxODUrcmFuZG9tKDIxKSk7CisgICAgU2V0KFBfU0laRSxTQVZFLEZfTU9ERV9BUyk7CisgIH0KKworICAvKiBEaXRvIEdld2ljaHQgKi8KKyAgaWYoIVF1ZXJ5UHJvcChQX1dFSUdIVCkgfHwgKFF1ZXJ5UHJvcChQX1dFSUdIVCkgPT0gNzUwMDApKXsKKyAgICBTZXRQcm9wKFBfV0VJR0hULDYwMDAwK3JhbmRvbSgyMDAwMSkpOworICAgIGlmKFF1ZXJ5UHJvcChQX0dFTkRFUik9PUZFTUFMRSkKKyAgICAgIFNldFByb3AoUF9XRUlHSFQsUXVlcnlQcm9wKFBfV0VJR0hUKS01MDAwKTsKKyAgICBTZXQoUF9XRUlHSFQsU0FWRSxGX01PREVfQVMpOworICB9CisgIFNldFByb3AoUF9ERUZVRUxfTElNSVRfRk9PRCw0MCk7CisgIFNldFByb3AoUF9ERUZVRUxfTElNSVRfRFJJTkssMjApOworICBTZXRQcm9wKFBfREVGVUVMX1RJTUVfRk9PRCw0MDApOworICBTZXRQcm9wKFBfREVGVUVMX1RJTUVfRFJJTkssMjAwKTsKKyAgU2V0UHJvcChQX0RFRlVFTF9BTU9VTlRfRk9PRCwwLjQpOworICBTZXRQcm9wKFBfREVGVUVMX0FNT1VOVF9EUklOSywwLjM1KTsKKworfQorCitzdHJpbmcgX3F1ZXJ5X3JhY2UoKQoreworICByZXR1cm4gIkVsZiI7Cit9CisKK3N0cmluZyBfcXVlcnlfcmVhbF9yYWNlKCkKK3sKKyAgcmV0dXJuICJFbGYiOworfQorCitzdHJpbmcgX3F1ZXJ5X3JhY2VkZXNjcigpCit7CisgIHJldHVybiAKKyJcCitBbHMgRWxmZW4gYmV6ZWljaG5ldCBtYW4gaW4gZGVyIFJlZ2VsIGplbmUgaGFnZXJlbiBIaW50ZXJ3YWVsZGxlciwgZGVyZW5cblwKK2RlbW9uc3RyYXRpdmVzIE5hdHVyZ2VoYWJlIGluIGRlciBSZWdlbCBudXIgZHVyY2ggaWhyZSBMaWViZSB6dSBraXRzY2hpZ2VuXG5cCitHZWRpY2h0ZW4gdW5kIGF1c3NjaHdlaWZlbmRlbSBHZXNjaGxlY2h0c2xlYmVuIGluIGRlbiBTY2hhdHRlbiBnZXN0ZWxsdCB3aXJkLlxuXAorRWluZW4gRWxmIGthbm4gbWFuIGltIGFsbGdlbWVpbmVuIG5pY2h0IG51ciBhbiBhZXVzc2VyZW4gTWlzc2JpbGR1bmdlblxuXAorKHNwaXR6ZSBPaHJlbiwgc3BpbmRlbGR1ZXJyZSBHZXN0YWx0LCBibG9uZGUgSGFhcmUpIGVya2VubmVuLCBzb25kZXJuIGF1Y2hcblwKK2FuIHNlaW5lciBhdWZkcmluZ2xpY2hlbiBBcnQsIHVlYmVyIGplZGVuIHVuZCBhbGxlcyBoZW1tdW5nc2xvcyBpbnMgR3J1ZW5lXG5cCitsb3N6dXBoaWxvc29waGllcmVuLlxuIjsKKworfQorCitpbnQgUXVlcnlBbGxvd1NlbGVjdCgpIHsgcmV0dXJuIDE7IH0KKworc3RyaW5nICpfcXVlcnlfcmFjZXN0cmluZygpCit7CisgIGlmIChRdWVyeVByb3AoUF9HRU5ERVIpPT0yKQorICAgIHJldHVybiAoeyJFbGZlIiwiRWxmZSIsIkVsZmUiLCJFbGZlIn0pOworICByZXR1cm4gKHsiRWxmIiwiRWxmZW4iLCJFbGYiLCJFbGYifSk7Cit9CitpbnQgX3F1ZXJ5X2hwX2RlbGF5KCl7CisgIGludCByZTsKKyAgcmUgPSBRdWVyeShQX0hQX0RFTEFZKTsKKyAgaWYgKGVudmlyb25tZW50KCkgJiYgZW52aXJvbm1lbnQoKS0+UXVlcnlQcm9wKFBfSU5ET09SUykpCisgICAgcmUrKzsKKyAgZWxzZQorICAgIHJlLS07CisgIHJldHVybiByZTsKK30KK2ludCBfcXVlcnlfc3BfZGVsYXkoKXsKKyAgaW50IHJlOworICByZSA9IFF1ZXJ5KFBfU1BfREVMQVkpOworICBpZiAoZW52aXJvbm1lbnQoKSAmJiBlbnZpcm9ubWVudCgpLT5RdWVyeVByb3AoUF9JTkRPT1JTKSkKKyAgICByZSsrOworICBlbHNlCisgICAgcmUtLTsKKyAgcmV0dXJuIHJlOworfQorCitzdHJpbmcgX3F1ZXJ5X2RlZmF1bHRfZ3VpbGQoKXsKKyAgcmV0dXJuICJ3aXBmZWxsYWV1ZmVyIjsKK30KKworc3RhdGljIHZvaWQgRmluYWxTZXR1cCgpCit7CisgIGlmKFF1ZXJ5UHJvcChQX0dVSUxEKSAhPSAiY2hhb3MiKQorICAgIFNldFByb3AoUF9SRVNJU1RBTkNFX1NUUkVOR1RIUywKKyAgICAgICAgICAgIChbIERUX01BR0lDIDogLTAuMiwKKyAgICAgICAgICAgICAgIERUX0hPTFkgOiAwLjEsCisgICAgICAgICAgICAgICBEVF9VTkhPTFkgOiAwLjMgXSkpOworICBlbHNlCisgICAgU2V0UHJvcChQX1JFU0lTVEFOQ0VfU1RSRU5HVEhTLAorICAgICAgICAgICAgKFsgRFRfTUFHSUMgOiAtMC4yLAorICAgICAgICAgICAgICAgRFRfVU5IT0xZIDogMC4xLAorICAgICAgICAgICAgICAgRFRfSE9MWSA6IDAuMyBdKSk7Cit9CmRpZmYgLS1naXQgYS9zdGQvc2hlbGxzL2ZlbGluZS5jIGIvc3RkL3NoZWxscy9mZWxpbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTkwZmFiCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3NoZWxscy9mZWxpbmUuYwpAQCAtMCwwICsxLDI1OSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHNoZWxscy9mZWxpbmUuYyAtLSBGZWxpbmUgU2hlbGwKKy8vCisvLyAkSWQ6IGZlbGluZS5jIDg0ODcgMjAxMy0wNS0yMSAxOToxNTo1MlogWmVzc3RyYSAkCisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHNhdmVfdHlwZXMKKworaW5oZXJpdCAiL3N0ZC9wbGF5ZXIvYmFzZSI7CisKKyNpbmNsdWRlIDxhdHRyaWJ1dGVzLmg+CisjaW5jbHVkZSA8Y29tYmF0Lmg+CisjaW5jbHVkZSA8aGVhbHRoLmg+CisjaW5jbHVkZSA8bmV3X3NraWxscy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPGRlZnVlbC5oPgorCisKK3ZvaWQgY3JlYXRlKCkKK3sgICAKKyAgICBpZiAoIWNsb25lcCgpIHx8IG9iamVjdF9uYW1lKHRoaXNfb2JqZWN0KCkpID09IF9fRklMRV9fWzAuLjwzXSkgeworICAgICAgc2V0X25leHRfcmVzZXQoLTEpOyAgICAKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQgICBpLGc7CisgICAgbWl4ZWQgaDsKKworICAgIGJhc2U6OmNyZWF0ZSgpOworCisvLyBTdGFydHJhdW0vS2FwZWxsZSBzZXR6ZW4KKyAgICBTZXREZWZhdWx0SG9tZSgiL2QvZHNjaHVuZ2VsL3BhcmFjZWxzdXMvcm9vbS9ma2FwZWxsZSIpOworICAgIFNldERlZmF1bHRQcmF5Um9vbSgiL2QvZHNjaHVuZ2VsL3BhcmFjZWxzdXMvcm9vbS9ma2FwZWxsZSIpOworCisvLyBCZXNvbmRlcmUgcmFzc2Vuc3BlemlmaXNjaGUgUHJvcGVydGllcyAoYmVpIGRlbmVuIGVzIG5pY2h0cyBtYWNodCwgd2VubgorLy8gc2llIG5hY2ggamVkZW0gRWlubG9nZ2VuIG5ldSBnZXNldHp0IHdlcmRlbik6CisKKyAgICBTZXRQcm9wKFBfQVRUUklCVVRFU19PRkZTRVRTLCAvLyBTdW1tZSA0IHN0YXR0IDYgd2cuIFNBX1NQRUVECisgICAgKFsKKyAgICAgICAgQV9TVFIgOiAgMSwKKyAgICAgICAgQV9JTlQgOiAgMiwKKyAgICAgICAgQV9ERVggOiAgMiwKKyAgICAgICAgQV9DT04gOiAtMSAKKyAgICBdKSApOworICAgIFNldFByb3AoUF9BVkVSQUdFX1NJWkUsMjAwKTsKKyAgICBTZXRQcm9wKFBfQVZFUkFHRV9XRUlHSFQsODUwMDApOworICAgIFNldFByb3AoUF9CT0RZLDE1KTsKKyAgICBTZXRQcm9wKFBfU0tJTExfQVRUUklCVVRFX09GRlNFVFMsKFtTQV9TUEVFRDoxMjBdKSk7CisgICAgU2V0UHJvcChQX01BVEVSSUFMX0tOT1dMRURHRSwKKyAgICAoWworICAgICAgICBNQVRHUk9VUF9XT09EICAgIDogIDYwLAorICAgICAgICBNQVRHUk9VUF9KRVdFTCAgIDogMTAwLAorICAgICAgICBNQVRHUk9VUF9FQVRBQkxFIDogIDMwCisgICAgXSkgKTsKKworICAgIFNldFByb3AoUF9NQUdJQ19SRVNJU1RBTkNFX09GRlNFVCwKKyAgICAoWworICAgICAgICBNVF9BTkdSSUZGICAgICA6ICAyMDAsCisgICAgICAgIE1UX0lMTFVTSU9OICAgIDogLTUwMCwKKyAgICAgICAgTVRfVkVSV0FORExVTkcgOiAgNTAwLAorICAgICAgICBNVF9QU1lDSE8gICAgICA6IDEwMDAgCisgICAgXSkgKTsKKworICAgIFNldFByb3AoUF9SRVNJU1RBTkNFX1NUUkVOR1RIUywKKyAgICAoWworICAgICAgICBEVF9XQVRFUiA6IC0wLjEsCisgICAgICAgIERUX0FDSUQgIDogIDAuMSwKKyAgICAgICAgRFRfQ09MRCAgOiAgMC4xIAorICAgIF0pICk7CisKKy8vIExlYmVuc3B1bmt0ZSB3ZXJkZW4gbGFuZ3NhbWVyIGFscyBub3JtYWwgcmVnZW5lcmllcnQKKyAgICBTZXRQcm9wKFBfSFBfREVMQVksSEVBTF9ERUxBWSsxKTsKKworLy8gTWFnaWVwdW5rdGUgd2VyZGVuIHNjaG5lbGxlciBhbHMgbm9ybWFsIHJlZ2VuZXJpZXJ0CisgICAgU2V0UHJvcChQX1NQX0RFTEFZLEhFQUxfREVMQVktMSk7CisKKy8vIEdpZnQgd2lya3QgZXR3YXMgbGFuZ3NhbWVyIGFscyBub3JtYWwKKyAgICBTZXRQcm9wKFBfUE9JU09OX0RFTEFZLFBPSVNPTl9ERUxBWSsxKTsKKworLy8gR2V0cmFlbmtlIHdlcmRlbiBldHdhcyBzY2huZWxsZXIgYWxzIG5vcm1hbCBhYmdlYmF1dAorICAgIFNldFByb3AoUF9EUklOS19ERUxBWSxEUklOS19ERUxBWS0xKTsKKworLy8gRXNzZW4gd2lyZCBldHdhcyBzY2huZWxsZXIgYWxzIG5vcm1hbCBhYmdlYmF1dCAuLi4KKyAgICBTZXRQcm9wKFBfRk9PRF9ERUxBWSxGT09EX0RFTEFZLTEpOworICAgIFNldFByb3AoUF9NQVhfRk9PRCwxNDApOworCisvLyBFcyBnaWJ0IGVpbmlnZSBTYWNoZW4sIGRpZSBzb2xsZW4gbnVyIGJlaW0gZXJzdGVuIEVpbmxvZ2dlbiBnZXNldHp0IHdlcmRlbi4KKy8vIEFuZGVyZSBtdWVzc2VuIG5hY2h0cmFlZ2xpY2ggLSBhYmVyIG51ciBlaW5tYWwgLSBnZW1hY2h0IHdlcmRlbiwgd2VpbCBzaWNoCisvLyBldHdhcyBnZWFlbmRlcnQgaGF0LgorICAgIHN3aXRjaCggUXVlcnlQcm9wKFBfU0hFTExfVkVSU0lPTikgKQorICAgIHsKKyAgICAgICAgY2FzZSAwIDoKKworICAgICAgICAgICAgZz1RdWVyeVByb3AoUF9HRU5ERVIpOworCisgICAgICAgICAgICBpZiAoICEoaT1RdWVyeVByb3AoUF9TSVpFKSkgfHwgKGk8KGc9PUZFTUFMRT8xNjU6MTcwKSkgCisgICAgICAgICAgICAgICAgfHwgKGk+KGc9PUZFTUFMRT8yMjU6MjMwKSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFByb3AoUF9TSVpFLCAoZz09RkVNQUxFPzE5NToyMDApCisgICAgICAgICAgICAgICAgICAgICsgcmFuZG9tKDE2KSAtIHJhbmRvbSgxNikgKyByYW5kb20oMTYpIC0gcmFuZG9tKDE2KSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggIShpPVF1ZXJ5UHJvcChQX1dFSUdIVCkpIHx8IChpPChnPT1GRU1BTEU/NzAwMDA6NzcwMDApKSAKKyAgICAgICAgICAgICAgIHx8IChpPihnPT1GRU1BTEU/ODgwMDA6OTUwMDApKSB8fCAoaT09NzUwMDApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRQcm9wKFBfV0VJR0hULCAoZz09RkVNQUxFPzcwMDAwOjc3MDAwKQorICAgICAgICAgICAgICAgICAgICArIHJhbmRvbSg0NTAxKSArIHJhbmRvbSg0NTAxKSArIHJhbmRvbSg0NTAxKSArIHJhbmRvbSg0NTAxKSApOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIFNldFByb3AoUF9NQVRFUklBTCwoWworICAgICAgICAgICAgICAgIE1BVF9NSVNDX0xJVklORyA6IDkwLAorICAgICAgICAgICAgICAgIE1BVF9QRUxUICAgICAgICA6ICA4LAorICAgICAgICAgICAgICAgIE1BVF9IT1JOICAgICAgICA6ICAyCisgICAgICAgICAgICBdKSApOworCisgICAgICAgICAgICBpZiAoICFJU19TRUVSKHRoaXNfb2JqZWN0KCkpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRQcm9wKFBfTVNHSU4sInNjaGxlaWNodCBoZXJlaW4iKTsKKyAgICAgICAgICAgICAgICBTZXRQcm9wKFBfTVNHT1VULCJzY2hsZWljaHQiKTsKKyAgICAgICAgICAgICAgICBTZXRQcm9wKFBfTU1TR0lOLCJlcnNjaGVpbnQgbWl0IGVpbmVtIGdyZWxsZW4gQmxpdHoiKTsKKyAgICAgICAgICAgICAgICBTZXRQcm9wKFBfTU1TR09VVCwidmVyc2Nod2luZGV0IG1pdCBlaW5lbSBncmVsbGVuIEJsaXR6Iik7CisgICAgICAgICAgICAgICAgU2V0UHJvcChQX0hBTkRTLCh7IiBtaXQgc2NoYXJmZW4gS3JhbGxlbiIsNDAsICh7RFRfUklQfSkgfSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggIXBvaW50ZXJwKGg9UXVlcnlQcm9wKFBfSEFORFMpKSB8fCAoc2l6ZW9mKGgpPDEpICkKKyAgICAgICAgICAgICAgICAgICAgaCA9ICh7IiBtaXQgc2NoYXJmZW4gS3JhbGxlbiIsNDAsICh7RFRfUklQfSkgfSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBoID0gKHtoWzBdLDQwLCAoe0RUX1JJUH0pIH0pOworICAgICAgICAgICAgICAgIFNldFByb3AoUF9IQU5EUywgaCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggIXBvaW50ZXJwKGg9UXVlcnlQcm9wKFBfQ0hBTk5FTFMpKSApCisgICAgICAgICAgICAgICAgU2V0UHJvcChQX0NIQU5ORUxTLCh7ImthdHplbmtyaWVnZXIifSkpOworICAgICAgICAgICAgZWxzZSBpZiAoIG1lbWJlcihoLCJrYXR6ZW5rcmllZ2VyIik9PS0xICkKKyAgICAgICAgICAgICAgICBTZXRQcm9wKFBfQ0hBTk5FTFMsIGggKyAoeyJrYXR6ZW5rcmllZ2VyIn0pICk7CisKKyAgICAgICAgICAgIFNldChQX1NJWkUsU0FWRSxGX01PREVfQVMpOworICAgICAgICAgICAgU2V0KFBfTUFURVJJQUwsU0FWRSxGX01PREVfQVMpOworICAgICAgICAgICAgU2V0KFBfV0VJR0hULFNBVkUsRl9NT0RFX0FTKTsKKworICAgICAgICBkZWZhdWx0IDoKKworICAgICAgICAgICAgU2V0UHJvcChQX1NIRUxMX1ZFUlNJT04sMSk7CisgICAgfQorICBTZXRQcm9wKFBfREVGVUVMX0xJTUlUX0ZPT0QsNzApOworICBTZXRQcm9wKFBfREVGVUVMX0xJTUlUX0RSSU5LLDQwKTsKKyAgU2V0UHJvcChQX0RFRlVFTF9USU1FX0ZPT0QsNDAwKTsKKyAgU2V0UHJvcChQX0RFRlVFTF9USU1FX0RSSU5LLDMwMCk7CisgIFNldFByb3AoUF9ERUZVRUxfQU1PVU5UX0ZPT0QsMC41NSk7CisgIFNldFByb3AoUF9ERUZVRUxfQU1PVU5UX0RSSU5LLDAuNCk7CisKK30KKworLy8gRGllc2UgUmFzc2Uga2FubiBkZXJ6ZWl0IGdld2FlaGx0IHdlcmRlbjoKK2ludCBRdWVyeUFsbG93U2VsZWN0KCkgeyByZXR1cm4gMTsgfQorCisvLyBSYXNzZW5iZXplaWNobnVuZworc3RyaW5nIF9xdWVyeV9yYWNlKCkKK3sKKyAgICByZXR1cm4gIkZlbGluZSI7Cit9CisKK3N0cmluZyBfcXVlcnlfcmVhbF9yYWNlKCkKK3sKKyAgICByZXR1cm4gIkZlbGluZSI7Cit9CisKKy8vIERpZSBSYXNzZW5iZXNjaHJlaWJ1bmcsIGRpZSBtYW4gYmVpbSBlcnN0ZW4gRWlubG9nZ2VuIGFicnVmZW4ga2Fubi4KK3N0cmluZyBfcXVlcnlfcmFjZWRlc2NyKCkKK3sKKyAgICByZXR1cm4gYnJlYWtfc3RyaW5nKAorICAgICAgICAiRmVsaW5lbiBzaW5kIGF1ZnJlY2h0IGdlaGVuZGUgS2F0emVud2VzZW4uXG4iKworICAgICAgICAiSWhyZSBIZWltYXQgaXN0IGRlciBEc2NodW5nZWwuIEthdW0gamVtYW5kIGR1ZXJmdGUgc2ljaCBkb3J0ICIrCisgICAgICAgICJiZXNzZXIgenVyZWNodGZpbmRlbiBhbHMgc2llLiBCZWRpbmd0IGR1cmNoIGRpZXNlIFVtZ2VidW5nICIrCisgICAgICAgICJoYWJlbiBzaWUgaW0gTGF1ZmUgZGVyIFplaXQgZWluZSBWb3JsaWViZSBmdWVyIGVsZWdhbnRlIEhvZWx6ZXIgIisKKyAgICAgICAgInVuZCBmdW5rZWxuZGUgRWRlbHN0ZWluZSBlbnR3aWNrZWx0LiBTaWUgc2luZCB6d2FyIG5pY2h0IHNvICIrCisgICAgICAgICIncmFmZmdpZXJpZycgd2llIFp3ZXJnZSwgYWJlciBkZW5ub2NoIHNvbGx0ZSBtYW4gYmVzc2VyIG5pY2h0ICIrCisgICAgICAgICJ2ZXJzdWNoZW4sIGVpbmVtIEZlbGluZW4gZWluZW4gRWRlbHN0ZWluIHdlZ3p1bmVobWVuLiBTaWUgIisKKyAgICAgICAgImJlbnV0emVuIGRpZSBFZGVsc3RlaW5lIHNlaHIgZ2VybmUsIHVtIHNpY2ggZGFtaXQgenUgc2NobXVlY2tlbi4gIisKKyAgICAgICAgIkZlbGluZW4gYmV0cmVpYmVuIHNvZ2FyIGVpbmVuIHJlZ2VscmVjaHRlbiBLb2VycGVya3VsdCwgIisKKyAgICAgICAgImluc2Jlc29uZGVyZSB3ZW5uIGVzIGRhcnVtIGdlaHQsIGRhcyBGZWxsIG9kZXIgZGllIEtyYWxsZW4genUgIisKKyAgICAgICAgImZhZXJiZW4uIEVkZWxzdGVpbmUga29tbWVuIGRhIGFscyBBY2Nlc3NvaXJlcyBnZXJhZGUgcmVjaHQuXG4iKworICAgICAgICAiQXVjaCBpbSBLYW1wZiBnZWdlbiBlaW5lbiBGZWxpbmVuIHNvbGx0ZSBtYW4gc2VociB2b3JzaWNodGlnICIrCisgICAgICAgICJzZWluLCBkYSBGZWxpbmVuIGlocmUgZ2VyaW5nZSBBdXNkYXVlciBkdXJjaCBlaW5lIGhvaGUgIisKKyAgICAgICAgIkdlc2Nod2luZGlna2VpdCBzb3dpZSBHZXNjaGljayB1bmQgSW50ZWxsaWdlbnogd2V0dG1hY2hlbi4gIisKKyAgICAgICAgIkF1Y2ggZGllIFNwaXR6ZW4gS3JhbGxlbiBzaW5kIGRhIG5pY2h0IHp1IHZlcmFjaHRlbiB1bmQgc28gIisKKyAgICAgICAgIm1hbmNoZXIgR2VnbmVyIG11c3N0ZSBzY2hvbiBhbHMgRXJzYXR6IGZ1ZXIgZWluZW4gS3JhdHpiYXVtICIrCisgICAgICAgICJoZXJoYWx0ZW4uIiw3OCwwLDEpOworfQorCisvLyBHZXNjaGxlY2h0c2FiaGFlbmdpZ2VzIFJhc3NlbmJlemVpY2hudW5ncy1BcnJheQorc3RyaW5nICpfcXVlcnlfcmFjZXN0cmluZygpCit7CisgICAgaWYgKFF1ZXJ5UHJvcChQX0dFTkRFUik9PTIpCisgICAgICAgIHJldHVybiAoeyJGZWxpbmluIiwiRmVsaW5pbiIsIkZlbGluaW4iLCJGZWxpbmluIn0pOworICAgIHJldHVybiAoeyJGZWxpbmUiLCJGZWxpbmVuIiwiRmVsaW5lbiIsIkZlbGluZW4ifSk7Cit9CisKKy8vIFJlZ2VuZXJhdGlvbiBkZXIgTGViZW5zcHVua3RlIGlzdCB2b24gZGVyIFVtZ2VidW5nIGFiaGFlbmdpZworLy8gSW0gV2FsZCB1bmQgRHNjaHVuZ2VsIGdlaHQgZXMgc2NobmVsbGVyLCBpbiBkZXIgV3Vlc3RlIHVuZCBpbQorLy8gUG9sYXJnZWJpZXQgZGFnZWdlbiBsYW5nc2FtZXIuCitpbnQgX3F1ZXJ5X2hwX2RlbGF5KCkKK3sKKyAgICBpbnQgcmU7CisgICAgc3RyaW5nIGZuOworCisgICAgcmUgPSBRdWVyeShQX0hQX0RFTEFZKTsKKyAgICBpZiAoZW52aXJvbm1lbnQoKSAmJiAhKGVudmlyb25tZW50KCktPlF1ZXJ5UHJvcChQX0lORE9PUlMpKSAmJgorICAgICAgICBmbj1vYmplY3RfbmFtZShlbnZpcm9ubWVudCgpKSkKKyAgICB7CisgICAgICAgIGlmIChmblswLi4xMl09PSIvZC9kc2NodW5nZWwvIiB8fCBmblswLi43XT09Ii9kL3dhbGQvIikKKyAgICAgICAgICAgIHJlLS07CisgICAgICAgIGVsc2UgaWYgKGZuWzAuLjldPT0iL2Qvd3Vlc3RlLyIgfHwgZm5bMC4uOF09PSIvZC9wb2xhci8iKQorICAgICAgICAgICAgcmUrKzsKKyAgICB9CisgICAgcmV0dXJuIHJlOworfQorCisvLyBSZWdlbmVyYXRpb24gZGVyIE1hZ2llcHVua3RlIGlzdCB2b24gZGVyIFVtZ2VidW5nIGFiaGFlbmdpZworLy8gSW0gV2FsZCB1bmQgRHNjaHVuZ2VsIGdlaHQgZXMgc2NobmVsbGVyLCBpbiBkZXIgV3Vlc3RlIHVuZCBpbQorLy8gUG9sYXJnZWJpZXQgZGFnZWdlbiBsYW5nc2FtZXIuCitpbnQgX3F1ZXJ5X3NwX2RlbGF5KCkKK3sKKyAgICBpbnQgcmU7CisgICAgc3RyaW5nIGZuOworCisgICAgcmUgPSBRdWVyeShQX1NQX0RFTEFZKTsKKyAgICBpZiAoZW52aXJvbm1lbnQoKSAmJiAhKGVudmlyb25tZW50KCktPlF1ZXJ5UHJvcChQX0lORE9PUlMpKSAmJgorICAgICAgICBmbj1vYmplY3RfbmFtZShlbnZpcm9ubWVudCgpKSkKKyAgICB7CisgICAgICAgIGlmIChmblswLi4xMl09PSIvZC9kc2NodW5nZWwvIiB8fCBmblswLi43XT09Ii9kL3dhbGQvIikKKyAgICAgICAgICAgIHJlLS07CisgICAgICAgIGVsc2UgaWYgKGZuWzAuLjldPT0iL2Qvd3Vlc3RlLyIgfHwgZm5bMC4uOF09PSIvZC9wb2xhci8iKQorICAgICAgICAgICAgcmUrKzsKKyAgICB9CisgICAgcmV0dXJuIHJlOworfQorCitzdHJpbmcgX3F1ZXJ5X2RlZmF1bHRfZ3VpbGQoKXsKKyAgcmV0dXJuICJrYXR6ZW5rcmllZ2VyIjsKK30KKworbWl4ZWQgUmFjZURlZmF1bHQoc3RyaW5nIGFyZykKK3sKKyAgICBpZiAoIWFyZykKKyAgICAgIHJldHVybiAwOworICAgIHN3aXRjaChhcmcpCisgICAgeworICAgICAgICBjYXNlIFBfSEFORFMgOgorICAgICAgICAgICAgcmV0dXJuICh7IiBtaXQgc2NoYXJmZW4gS3JhbGxlbiIsNDAsICh7RFRfUklQfSkgfSk7CisgICAgICAgIGNhc2UgUF9CT0RZIDoKKyAgICAgICAgICAgIHJldHVybiAxNTsKKyAgICB9CisgICAgcmV0dXJuIGJhc2U6OlJhY2VEZWZhdWx0KGFyZyk7Cit9CmRpZmYgLS1naXQgYS9zdGQvc2hlbGxzL2dvYmxpbi5jIGIvc3RkL3NoZWxscy9nb2JsaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDY5NGIzCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3NoZWxscy9nb2JsaW4uYwpAQCAtMCwwICsxLDIxMyBAQAorLyoKKyAqIEdvYmxpbi1SYXNzZW5zaGVsbAorICogWy9zdGQvc2hlbGxzL2dvYmxpbi5jXQorICogKGMpIDIwMDcgbmliZWxAbWcubXVkLmRlCisgKgorICogV2VydGUgdm9uIEFyayBhYmdlc2VnbmV0IGFtIDExLjEyLjIwMDcKKyAqLworCisjcHJhZ21hIHN0cm9uZ190eXBlcyxzYXZlX3R5cGVzCisKKyNpbmNsdWRlIDxhdHRyaWJ1dGVzLmg+CisjaW5jbHVkZSA8aGVhbHRoLmg+CisjaW5jbHVkZSA8bmV3X3NraWxscy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxkZWZ1ZWwuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKworaW5oZXJpdCAiL3N0ZC9wbGF5ZXIvYmFzZS5jIjsKKworc3RhdGljIHZhcmFyZ3MgaW50IEdvYmxpbkNtZFdhYWFnaChzdHJpbmcgYXJnKTsKKworcHVibGljIHZvaWQgY3JlYXRlKCkgeworICBtaXhlZCByZXM7CisgIGJhc2U6OmNyZWF0ZSgpOworCisgIFNldERlZmF1bHRIb21lKCIvZC93YWxkL2tlc3NhL3dhYWFnaC9yb29tL3N0YXJ0aHV0L2h1dFsiICsgCisgICAgZ2V0dWlkKHRoaXNfb2JqZWN0KCkpICsiXSIpOworICBTZXREZWZhdWx0UHJheVJvb20oIi9kL3dhbGQvbmliZWwvbGljaHR1bmcvcm9vbS9saWNodHVuZ180NSIpOworICAKKyAgU2V0UHJvcChQX0FWRVJBR0VfU0laRSwgODApOworICBTZXRQcm9wKFBfQVZFUkFHRV9XRUlHSFQsIDMyMDAwKTsKKyAgU2V0UHJvcChQX01BVEVSSUFMX0tOT1dMRURHRSwgKFtNQVRHUk9VUF9FQVRBQkxFOjIwLCBNQVRHUk9VUF9EUlVHOjQwLAorICAgIE1BVEdST1VQX1BSRUNJT1VTX01FVEFMOjI1LCBNQVRHUk9VUF9KRVdFTDoyNV0pKTsKKworICBTZXRQcm9wKFBfQk9EWSwgMTUpOworICBTZXRQcm9wKFBfQVRUUklCVVRFU19PRkZTRVRTLCAoW0FfU1RSOjAsIEFfSU5UOjEsIEFfREVYOjIsIEFfQ09OOjJdKSk7CisgIFNldFByb3AoUF9SRVNJU1RBTkNFX1NUUkVOR1RIUywgKFtEVF9GSVJFOi0wLjE1LCBEVF9MSUdIVE5JTkc6LTAuMTUsCisgICAgRFRfU09VTkQ6MC4xLCBEVF9IT0xZOjAuMSwgRFRfQUlSOjAuMSwgRFRfQUNJRDowLjFdKSk7CisgIFNldFByb3AoUF9NQUdJQ19SRVNJU1RBTkNFX09GRlNFVCwgKFtNVF9BTkdSSUZGOjYwMCwgTVRfSUxMVVNJT046NTAwLAorICAgIE1UX1ZFUldBTkRMVU5HOi0zMDAsIE1UX0hFTExTSUNIVDotNzUwLCBNVF9CRUhFUlJTQ0hVTkc6MjUwXSkpOworICBTZXRQcm9wKFBfU0tJTExfQVRUUklCVVRFX09GRlNFVFMsIChbU0FfRU5FTVlfU0FWRToxMDMsIFNBX0RBTUFHRToxMDddKSk7CisKKyAgU2V0UHJvcChQX1NQX0RFTEFZLCBIRUFMX0RFTEFZICsgMik7CisgIFNldFByb3AoUF9IUF9ERUxBWSwgSEVBTF9ERUxBWSAtIDEpOworICBTZXRQcm9wKFBfQUxDT0hPTF9ERUxBWSwgQUxDT0hPTF9ERUxBWSAtIDEpOworCisgIHN3aXRjaChRdWVyeVByb3AoUF9TSEVMTF9WRVJTSU9OKSkgeworICAgIGNhc2UgMDoKKyAgICAgIGlmKCFRdWVyeVByb3AoUF9TSVpFKSkgLy8gTWFlbm5sZWluIHVuZCBXZWlibGVpbiBzaW5kIGdsZWljaCAiZ3Jvc3MiCisgICAgICAgIFNldFByb3AoUF9TSVpFLCA3NSArIHJhbmRvbSgxMSkpOworICAgICAgaWYoUXVlcnlQcm9wKFBfV0VJR0hUKSA9PSA3NTAwMCkgLy8gRGl0byBHZXdpY2h0CisgICAgICAgIFNldFByb3AoUF9XRUlHSFQsIChRdWVyeVByb3AoUF9TSVpFKSAqIDM5MCkgKworICAgICAgICAgIHJhbmRvbShRdWVyeVByb3AoUF9TSVpFKSAqIDEwKSk7CisgICAgICBTZXRQcm9wKFBfTUFURVJJQUwsKFtNQVRfTUlTQ19MSVZJTkc6MTAwXSkpOworICAgICAgICAgIAorICAgICAgU2V0KFBfU0laRSwgU0FWRSwgRl9NT0RFX0FTKTsKKyAgICAgIFNldChQX1dFSUdIVCwgU0FWRSwgRl9NT0RFX0FTKTsKKyAgICAgIFNldChQX01BVEVSSUFMLCBTQVZFLCBGX01PREVfQVMpOworCisgICAgICBpZighcG9pbnRlcnAocmVzID0gUXVlcnlQcm9wKFBfSEFORFMpKSB8fCBzaXplb2YocmVzKSA8IDMpCisgICAgICAgIHJlcyA9ICh7IiBtaXQga2xlaW5lbiBGYWV1c3RjaGVuIiwgMzAsICh7IERUX0JMVURHRU9OIH0pfSk7CisgICAgICBTZXRQcm9wKFBfSEFORFMsIHJlcyk7CisKKyAgICAgIGlmKCFJU19TRUVSKHRoaXNfb2JqZWN0KCkpKSB7CisgICAgICAgIFNldFByb3AoUF9NU0dJTiwgImZsaXR6dCBoZXJlaW4iKTsKKyAgICAgICAgU2V0UHJvcChQX01TR09VVCwgImZsaXR6dCIpOworICAgICAgfQorICAgICAgU2V0UHJvcChQX1NIRUxMX1ZFUlNJT04sIDEpOworICAgIGNhc2UgMToKKyAgICAgIC8vIC9zdGQvcGxheWVyL2Jhc2Ugc2V0enQgamEgc2Nob24gUF9XRUlHSFQuLi4KKyAgICAgIGlmKFF1ZXJ5UHJvcChQX1dFSUdIVCkgPT0gNzUwMDApIHsKKyAgICAgICAgU2V0UHJvcChQX1dFSUdIVCwgKFF1ZXJ5UHJvcChQX1NJWkUpICogMzkwKSArCisgICAgICAgICAgcmFuZG9tKFF1ZXJ5UHJvcChQX1NJWkUpICogMTApKTsKKyAgICAgIH0KKyAgICAgIFNldFByb3AoUF9TSEVMTF9WRVJTSU9OLCAyKTsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgfQorICAKKyAgU2V0UHJvcChQX01BWF9GT09ELCAxMTApOworICBTZXRQcm9wKFBfTUFYX0RSSU5LLCA4MCk7CisgIFNldFByb3AoUF9NQVhfQUxDT0hPTCwgMTI1KTsKKyAgU2V0UHJvcChQX0RFRlVFTF9MSU1JVF9GT09ELCA2MCk7CisgIFNldFByb3AoUF9ERUZVRUxfTElNSVRfRFJJTkssIDYwKTsKKyAgU2V0UHJvcChQX0RFRlVFTF9USU1FX0ZPT0QsIDQwMCk7CisgIFNldFByb3AoUF9ERUZVRUxfVElNRV9EUklOSywgMzYwKTsKKyAgU2V0UHJvcChQX0RFRlVFTF9BTU9VTlRfRk9PRCwgMC41KTsKKyAgU2V0UHJvcChQX0RFRlVFTF9BTU9VTlRfRFJJTkssIDAuNCk7Cit9CisKK3N0YXRpYyB2b2lkIEZpbmFsU2V0dXAoKSB7CisgIG9iamVjdCBvOworICBpZihRdWVyeVByb3AoUF9MRVZFTCkgPiA1IHx8IHByZXNlbnQoIlxuaWJlbDp3YWxkbGljaHR1bmdza2FydGUiLAorICAgIHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgIGlmKCFjYXRjaChvID0gY2xvbmVfb2JqZWN0KCIvZC93YWxkL25pYmVsL2xpY2h0dW5nL29iai9rYXJ0ZSIpKSkKKyAgICBvLT5tb3ZlKHRoaXNfb2JqZWN0KCksIE1fTk9DSEVDSyk7Cit9CisKK3B1YmxpYyBpbnQgUXVlcnlBbGxvd1NlbGVjdCgpIHsgcmV0dXJuIDE7IH0KKworcHVibGljIHN0cmluZyBfcXVlcnlfcmFjZSgpIHsgcmV0dXJuICJHb2JsaW4iOyB9CitwdWJsaWMgc3RyaW5nIF9xdWVyeV9yZWFsX3JhY2UoKSB7IHJldHVybiAiR29ibGluIjsgfQorCitwdWJsaWMgc3RyaW5nIF9xdWVyeV9yYWNlZGVzY3IoKSB7CisgIHJldHVybiBicmVha19zdHJpbmcoIkdvYmxpbnMgc2luZCB3aW56aWdlLCBncnVlbmhhZXV0aWdlIFdlc2VuLCBzb2dhciAiCisgICAgIm5vY2gga2xlaW5lciBhbHMgSG9iYml0cy4gQW4gaWhyZW4genUgZGljayBnZXJhdGVuZW4gS29lcGZjaGVuICIKKyAgICAiYmVmaW5kZW4gc2ljaCBsYW5nZSwgc2VsdGVuIHJlZ2xvc2UsIE9ocmVuIHVuZCBlaW5lIGdyb3NzZSwga3J1bW1lICIKKyAgICAiTmFzZS4gSWhyZSBrbGVpbmUgU3RhdHVyIHNvbGx0ZSBqZWRvY2ggbmljaHQgdGFldXNjaGVuLCBkZW5uIGlocmUgIgorICAgICJmZWhsZW5kZSBLcmFmdCBtYWNoZW4gc2llIG1pdCBHZXNjaHdpbmRpZ2tlaXQsIFByYWV6aXNpb24gdW5kIG5pY2h0ICIKKyAgICAienVsZXR6dCBpaHJlciB1bmJlc3RyaXR0ZW5lbiBSdWNobG9zaWdrZWl0IGFsbGV3ZWlsIHdldHQuIE9id29obCAiCisgICAgImZ1ZXIgc2llIFBsdWVuZGVybiwgbGF1dGVzIEhlcnVtYnJ1ZWxsZW4gdW5kIGRpZSBnZW1laW5zdGVuIFN0cmVpY2hlICIKKyAgICAic3BpZWxlbiB6dW0gQWxsdGFnIGdlaG9lcnQsIHd1ZXJkZSBzaWUgbmllbWFuZCBhbHMgYm9lc2FydGlnICIKKyAgICAiYmV6ZWljaG5lbi4gRGVubiBHb2JsaW5zIHNpbmQgdmllbGVzLCBhYmVyIHNpY2hlcmxpY2ggbmljaHQgZGllICIKKyAgICAiaW50ZWxsaWdlbnRlc3RlbiBLcmVhdHVyZW4uIER1cmNoIGlocmVuIHphZWhlbiBXaWxsZW4gdW5kIGRpZSBkaWNrZSwgIgorICAgICJsZWRlcm5lIEhhdXQgc2luZCBzaWUgYXVzc2VyZ2V3b2VobmxpY2ggd2lkZXJzdGFuZHNmYWVoaWcsIHVuZCwgIgorICAgICJzb2Zlcm4gZnVua2VsbmRlIEJldXRlIHdpbmt0LCBmdWVyIGplZGVzIEFiZW50ZXVlciB6dSBoYWJlbi4iLCA3OCk7Cit9CisKK3B1YmxpYyBzdHJpbmcgKl9xdWVyeV9yYWNlc3RyaW5nKCkgeworICBpZihRdWVyeVByb3AoUF9HRU5ERVIpID09IEZFTUFMRSkKKyAgICByZXR1cm4gKHsiR29ibGluZnJhdSIsICJHb2JsaW5mcmF1IiwgIkdvYmxpbmZyYXUiLCAiR29ibGluZnJhdSJ9KTsKKyAgcmV0dXJuICh7IkdvYmxpbiIsICJHb2JsaW5zIiwgIkdvYmxpbiIsICJHb2JsaW4ifSk7Cit9CisKK3B1YmxpYyBzdHJpbmcgX3F1ZXJ5X2RlZmF1bHRfZ3VpbGQoKSB7cmV0dXJuICJhYmVudGV1cmVyIjt9CisKK3B1YmxpYyBzdHJpbmcgX3F1ZXJ5X3Zpc2libGVfZ3VpbGQoKSB7CisgIHN3aXRjaChsb3dlcl9jYXNlKFF1ZXJ5UHJvcChQX0dVSUxEKSkpIHsKKyAgICBjYXNlICJhYmVudGV1cmVyIjogcmV0dXJuICJhYmVudG9pcmEiOworICAgIGNhc2UgIndpcGZlbGxhZXVmZXIiOiByZXR1cm4gIndpZmZlbGxvaWZhIjsKKyAgICBjYXNlICJjaGFvcyI6IHJldHVybiAia2FvcyI7CisgICAgY2FzZSAiemF1YmVyZXIiOiByZXR1cm4gInphdWJhcmEiOworICAgIGNhc2UgImJpZXJzY2h1ZXR0bGVyIjogcmV0dXJuICJiaWFzY2h1ZXR0bGEiOworICAgIGNhc2UgImthdHplbmtyaWVnZXIiOiByZXR1cm4gImthem5rcmllZ2EiOworCSAgY2FzZSAidGFuamlhbiI6IHJldHVybiAidGFuc2NoYW4iOworCSAgY2FzZSAia2xlcnVzIjogcmV0dXJuICJrbGVyaWthZSI7CSAgCQorCSAgY2FzZSAiZHVua2VsZWxmZW4iOiByZXR1cm4gImR1bmtsZWxmbiI7CisJICBjYXNlICJrYWVtcGZlciI6IHJldHVybiAia2FlbXBmYSI7CisJICBjYXNlICJrYXJhdGUiOiByZXR1cm4gImthcmF0YWUiOworCSAgY2FzZSAid2Vyd29lbGZlIjogcmV0dXJuICJ3ZWF3b2VsZiI7CisJICBjYXNlICJtYWd1cyI6IHJldHVybiAibWFnaWEiOworICAgIGNhc2UgInVydWtoYWkiOiByZXR1cm4gInVydWdhaSI7CisgIH0KKyAgcmV0dXJuIFF1ZXJ5UHJvcChQX0dVSUxEKTsKK30KKworcHVibGljIG1peGVkIFJhY2VEZWZhdWx0KHN0cmluZyBhcmcpIHsKKyAgaWYoIWFyZykgcmV0dXJuIDA7CisgIHN3aXRjaChhcmcpIHsKKyAgICBjYXNlIFBfSEFORFM6CisgICAgICByZXR1cm4gKHsiIG1pdCBrbGVpbmVuIEZhZXVzdGNoZW4iLCAzMCwgKHsgIERUX0JMVURHRU9OIH0pfSk7CisgICAgY2FzZSBQX0JPRFk6CisgICAgICByZXR1cm4gMTU7CisgIH0KKyAgcmV0dXJuIGJhc2U6OlJhY2VEZWZhdWx0KGFyZyk7Cit9CisKK3N0YXRpYyBtaXhlZCBfcXVlcnlfbG9jYWxjbWRzKCkgeworICByZXR1cm4gKHsoeyJ3YWFhZ2giLCAiR29ibGluQ21kV2FhYWdoIiwgMCwgMH0pfSkgKworICAgIGJhc2U6Ol9xdWVyeV9sb2NhbGNtZHMoKTsKK30KKworLy8gImtudWRkZWwgYWxsZSIgaXN0IGRldXRsaWNoIHRldXJlciBhbHNvIHdobyBjYXJlcyA6LSkKK3N0YXRpYyB2YXJhcmdzIGludCBHb2JsaW5DbWRXYWFhZ2goc3RyaW5nIGFyZykgeworICBvYmplY3QgKm9iczsKKyAgc3RyaW5nIHMsIHc7CisgIAorICBpZighb2JqZWN0cChlbnZpcm9ubWVudCgpKSkgcmV0dXJuIDA7CisgIG9icyA9IGZpbHRlcihhbGxfaW52ZW50b3J5KGVudmlyb25tZW50KCkpIC0gKHt0aGlzX29iamVjdCgpfSksICMnbGl2aW5nKTsKKyAgb2JzID0gb2JzIC0gZmlsdGVyX29iamVjdHMob2JzLCAiUXVlcnlQcm9wIiwgUF9JTlZJUyk7CisgIC8vIGxldmVsYWJoYWVuZ2lnZSBBbnphaGwgYWFhYWFhYSdzCisgIHcgPSAiVyIrIHNwcmludGYoIiUnYSciKyAoUXVlcnlQcm9wKFBfTEVWRUwpIC8gMTAgKyAzKSArInMiLCAiYWFhIikgKyJnaCEiOworCisgIGZvcmVhY2gob2JqZWN0IG8gOiBvYnMpCisgIHsKKyAgICBzdHJpbmcgc3RyPShicmVha19zdHJpbmcoTmFtZShXRVIpICsiIGJhbGx0IGRpZSBGYWV1c3RjaGVuIHVuZCAiCisgICAgICAia3JlaXNjaHQgbGF1dDogIisgdyArIlxuIgorICAgICAgKyBjYXBpdGFsaXplKG8tPlF1ZXJ5RHUoV0VSKSkgKyAiIHp1Y2tzdCBlcnNjaHJvY2tlbiB6dXNhbW1lbi4iLAorICAgICAgNzgsIDAsIEJTX0xFQVZFX01ZX0xGUykpOworCisgICAgaW50IHJlcz1vLT5SZWNlaXZlTXNnKHN0cixNVF9MSVNURU4sTUFfRU1PVEUsMCx0aGlzX29iamVjdCgpKTsKKyAgICBpZiAocmVzPDApCisgICAgeworICAgICAgb2JzLT0oe299KTsgLy8gdW50ZW4gbmljaHQgbWVociBtaXQgYW56ZWlnZW4uCisgICAgICBpZiAocmVzPT1NU0dfU0VOU0VfQkxPQ0spCisgICAgICAgIFJlY2VpdmVNc2coby0+TmFtZShXRVIpICsiIGthbm4gRGljaCBuaWNodCBob2VyZW4uIiwKKyAgICAgICAgICAgICAgICAgICBNVF9OT1RJRklDQVRJT058TVNHX0RPTlRfSUdOT1JFfE1TR19ET05UX1NUT1JFLAorICAgICAgICAgICAgICAgICAgIE1BX0VNT1RFLDAsdGhpc19vYmplY3QoKSk7CisgICAgICBlbHNlCisgICAgICAgIFJlY2VpdmVNc2coby0+TmFtZShXRVIpICsiIGlnbm9yaWVydCBEaWNoIG9kZXIgZGllc2VuIEJlZmVobC4iLAorICAgICAgICAgICAgICAgICAgIE1UX05PVElGSUNBVElPTnxNU0dfRE9OVF9JR05PUkV8TVNHX0RPTlRfU1RPUkUsCisgICAgICAgICAgICAgICAgICAgTUFfRU1PVEUsMCx0aGlzX29iamVjdCgpKTsKKyAgICB9CisgIH0KKyAgaW50IGFuemFobD1zaXplb2Yob2JzKTsKKyAgaWYoIWFuemFobCkKKyAgeworICAgIFJlY2VpdmVNc2coIkR1IGJhbGxzdCBkaWUgRmFldXN0Y2hlbiB1bmQga3JlaXNjaHN0IGxhdXQ6ICIKKyAgICAgICAgICAgICAgICsgdywgTVRfTk9USUZJQ0FUSU9OfE1TR19ET05UX0lHTk9SRSxNQV9FTU9URSwwLHRoaXNfb2JqZWN0KCkpOworICB9CisgIGVsc2UKKyAgeworICAgIHMgPSBDb3VudFVwKG1hcF9vYmplY3RzKG9icywgIm5hbWUiLCBXRVIpKTsKKyAgICBSZWNlaXZlTXNnKGJyZWFrX3N0cmluZygiRHUgYmFsbHN0IGRpZSBGYWV1c3RjaGVuIHVuZCBrcmVpc2Noc3QgbGF1dDogIgorICAgICAgICAgICAgICAgKyB3ICsiXG4iKyBjYXBpdGFsaXplKHMpICsiIHp1Y2siCisgICAgICAgICAgICAgICArKGFuemFobCA+IDEgPyAiZW4iIDogInQiKSArIiBlcnNjaHJvY2tlbiB6dXNhbW1lbi4iLAorICAgICAgICAgICAgICAgNzgsIDAsIEJTX0xFQVZFX01ZX0xGUyksCisgICAgICAgICAgICAgICBNVF9OT1RJRklDQVRJT058TVNHX0RPTlRfU1RPUkV8TVNHX0RPTlRfSUdOT1JFLAorICAgICAgICAgICAgICAgTUFfRU1PVEUsMCx0aGlzX29iamVjdCgpKTsKKyAgfQorICByZXR1cm4gMTsKK30KKwpkaWZmIC0tZ2l0IGEvc3RkL3NoZWxscy9ob2JiaXQuYyBiL3N0ZC9zaGVsbHMvaG9iYml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYyNmIwNgotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9zaGVsbHMvaG9iYml0LmMKQEAgLTAsMCArMSwxMzkgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBzaGVsbHMvaG9iYml0LmMgLS0gSG9iYml0IFNoZWxsCisvLworLy8gICA5LkFwcmlsIDE5OTUgIFYxLjAgR3VuZHVyCisvLworLy8gICAxNS5KdW5pIHByYXlyb29tIHVuZCBkZWZIb21lIGF1ZiBIb2JiaXRkb3JmIGdlc2V0enQgdm9uIEd1bmR1cgorLy8KKy8vICRJZDogaG9iYml0LmMgODkyMCAyMDE0LTA5LTAyIDIwOjE4OjM4WiBaZXNzdHJhICQKKworI3ByYWdtYSBzdHJvbmdfdHlwZXMsc2F2ZV90eXBlcworCitpbmhlcml0ICJzdGQvcGxheWVyL2Jhc2UiOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGF0dHJpYnV0ZXMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxoZWFsdGguaD4KKyNpbmNsdWRlIDxuZXdfc2tpbGxzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxjb21iYXQuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDxkZWZ1ZWwuaD4KKworCisKK3ZvaWQgY3JlYXRlKCl7CisgIGlmICghY2xvbmVwKCkgfHwgb2JqZWN0X25hbWUodGhpc19vYmplY3QoKSkgPT0gX19GSUxFX19bMC4uPDNdKSB7CisgICAgICBzZXRfbmV4dF9yZXNldCgtMSk7ICAgIAorICAgICAgcmV0dXJuOworICB9CisKKyAgbWl4ZWQgcmVzOworCisgIGJhc2U6OmNyZWF0ZSgpOworICBTZXREZWZhdWx0SG9tZSgiL2Qvd2FsZC9ndW5kdXIvaG9iYml0ZG9yZi9zY2hyZWluIik7CisgIFNldERlZmF1bHRQcmF5Um9vbSgiL2Qvd2FsZC9ndW5kdXIvaG9iYml0ZG9yZi9zY2hyZWluIik7CisgIFNldFByb3AoUF9BVFRSSUJVVEVTX09GRlNFVFMsKFtBX0RFWDo0LEFfQ09OOjJdKSk7CisgIFNldFByb3AoUF9BVkVSQUdFX1NJWkUsIDEwNSk7CisgIFNldFByb3AoUF9BVkVSQUdFX1dFSUdIVCwgNjAwMDApOworICBTZXRQcm9wKFBfTUFURVJJQUxfS05PV0xFREdFLChbTUFUR1JPVVBfRUFUQUJMRTozMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVRHUk9VUF9EUlVHOjMwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BVEdST1VQX1BPSVNPTk9VUzoxMF0pKTsKKyAgU2V0UHJvcChQX1JFU0lTVEFOQ0VfU1RSRU5HVEhTLAorCSAgKFsgRFRfVEVSUk9SIDogLTAuMSwKKwkgICBEVF9NQUdJQyA6IC0wLjEsCisJICAgRFRfU09VTkQgOiAwLjIsCisJICAgRFRfTElHSFROSU5HIDogMC4xLAorCSAgIERUX1BPSVNPTiA6IDAuMSBdKSk7CisgIFNldFByb3AoUF9NQVhfRk9PRCwyNTApOworICBTZXRQcm9wKFBfTUFYX0RSSU5LLDEwMCk7CisgIFNldFByb3AoUF9NQVhfQUxDT0hPTCwxNTApOworCisgIFNldFByb3AoUF9TUF9ERUxBWSxIRUFMX0RFTEFZKzEpOworICBTZXRQcm9wKFBfUE9JU09OX0RFTEFZLFBPSVNPTl9ERUxBWS0xKTsKKyAgU2V0UHJvcChQX0ZPT0RfREVMQVksRk9PRF9ERUxBWS0yKTsKKyAgU2V0UHJvcChQX0FMQ09IT0xfREVMQVksQUxDT0hPTF9ERUxBWSsxKTsKKworICBTZXRQcm9wKFBfTUFHSUNfUkVTSVNUQU5DRV9PRkZTRVQsCisgICAgICAgICAgKFsgTVRfQU5HUklGRiA6IDUwMCwKKwkgICBNVF9IRUxMU0lDSFQgOiAtNTAwLAorCSAgIE1UX1BTWUNITyA6IC01MDAgXSkpOworCisgIGlmKCEocmVzPVF1ZXJ5UHJvcChQX0hBTkRTKSkgfHwgIXBvaW50ZXJwKHJlcykgfHwgKHNpemVvZihyZXMpPDMpKQorICAgIHJlcz0oeyIgbWl0IHBlbHppZ2VuIEhhZW5kZW4iLDI1LCh7RFRfQkxVREdFT059KX0pOworICByZXNbMV09MjU7CisgIFNldFByb3AoUF9IQU5EUyxyZXMpOworICBTZXRQcm9wKFBfQk9EWSwxNSk7CisKKyAgLyogR3JvZXNzZSB3aXJkIG51ciBlaW5tYWwgZ2VzZXR6dCAqLworICBpZighUXVlcnlQcm9wKFBfU0laRSkpeworICAgIFNldFByb3AoUF9TSVpFLDk1K3JhbmRvbSgyMSkpOworICAgIFNldChQX1NJWkUsU0FWRSxGX01PREVfQVMpOworICB9CisKKyAgLyogRGl0byBHZXdpY2h0ICovCisgIGlmKCFRdWVyeVByb3AoUF9XRUlHSFQpIHx8IChRdWVyeVByb3AoUF9XRUlHSFQpID09IDc1MDAwKSl7CisgICAgU2V0UHJvcChQX1dFSUdIVCw1MDAwMCtyYW5kb20oMjAwMDEpKTsKKyAgICBpZihRdWVyeVByb3AoUF9HRU5ERVIpPT1GRU1BTEUpCisgICAgICBTZXRQcm9wKFBfV0VJR0hULFF1ZXJ5UHJvcChQX1dFSUdIVCktNTAwMCk7CisgICAgU2V0KFBfV0VJR0hULFNBVkUsRl9NT0RFX0FTKTsKKyAgfQorICBTZXRQcm9wKFBfREVGVUVMX0xJTUlUX0ZPT0QsMTQwKTsKKyAgU2V0UHJvcChQX0RFRlVFTF9MSU1JVF9EUklOSyw1MCk7CisgIFNldFByb3AoUF9ERUZVRUxfVElNRV9GT09ELDg1MCk7CisgIFNldFByb3AoUF9ERUZVRUxfVElNRV9EUklOSyw0NTApOworICBTZXRQcm9wKFBfREVGVUVMX0FNT1VOVF9GT09ELDAuOCk7CisgIFNldFByb3AoUF9ERUZVRUxfQU1PVU5UX0RSSU5LLDAuNik7CisKK30KKworc3RyaW5nIF9xdWVyeV9yYWNlKCkKK3sKKyAgcmV0dXJuICJIb2JiaXQiOworfQorCitzdHJpbmcgX3F1ZXJ5X3JlYWxfcmFjZSgpCit7CisgIHJldHVybiAiSG9iYml0IjsKK30KKworc3RyaW5nIF9xdWVyeV9yYWNlZGVzY3IoKQoreworICByZXR1cm4gIkhvYmJpdHMgc2luZCBrbGVpbmUgV2VzZW4sIGRpZSBhbSBlaGVzdGVuIGRlbiBNZW5zY2hlbiBhZWhuZWxuLlxuIisKKyAgICAiU2llIHplaWNobmVuIHNpY2ggdHJvdHogSWhyZXIgR3JvZXNzZSBkdXJjaCBpaHJlbiBNdXQgdW5kIFN0YW5kZmVzdGlna2VpdCAiKworCSJhdXMuXG5PYndvaGwgc2llIHZpZWwgbGllYmVyIHp1aGF1c2Ugdm9ybSB3YXJtZW4gS2FtaW4gc2l0emVuLCBzaW5kIHNpZSAiKworCSJpbW1lclxuZnVlciBlaW4gQWJlbnRldWVyIHp1IGhhYmVuLlxuIjsKK30KKworaW50IFF1ZXJ5QWxsb3dTZWxlY3QoKSB7IHJldHVybiAxOyB9CisKK3N0cmluZyAqX3F1ZXJ5X3JhY2VzdHJpbmcoKXsKKyAgaWYgKFF1ZXJ5UHJvcChQX0dFTkRFUikgPT0gRkVNQUxFKQorICAgIHJldHVybiAoeyJIb2JiaXRmcmF1IiwiSG9iYml0ZnJhdSIsIkhvYmJpdGZyYXUiLCJIb2JiaXRmcmF1In0pOworICByZXR1cm4gKHsiSG9iYml0IiwiSG9iYml0cyIsIkhvYmJpdCIsIkhvYmJpdCJ9KTsKK30KKworc3RyaW5nIF9xdWVyeV9kZWZhdWx0X2d1aWxkKCl7CisgIHJldHVybiAiYWJlbnRldXJlciI7Cit9CisKK3ZvaWQgRmluYWxTZXR1cCgpIHsKKyAgaWYoIXByZXNlbnQoInBmZWlmY2hlbiIsdGhpc19vYmplY3QoKSkpCisgICAgY2xvbmVfb2JqZWN0KCIvaXRlbXMvcGZlaWZjaGVuIiktPm1vdmUodGhpc19vYmplY3QoKSxNX05PQ0hFQ0spOworfQorCittaXhlZCBSYWNlRGVmYXVsdChzdHJpbmcgYXJnKQoreworICBpZiAoIWFyZykKKyAgICByZXR1cm4gMDsKKyAgc3dpdGNoKGFyZykKKyAgeworICAgIGNhc2UgUF9IQU5EUyA6CisgICAgICByZXR1cm4gKHsiIG1pdCBwZWx6aWdlbiBIYWVuZGVuIiwyNSwoe0RUX0JMVURHRU9OfSkgfSk7CisgICAgY2FzZSBQX0JPRFkgOgorICAgICAgcmV0dXJuIDE1OworICB9CisgIHJldHVybiBiYXNlOjpSYWNlRGVmYXVsdChhcmcpOworfQpkaWZmIC0tZ2l0IGEvc3RkL3NoZWxscy9odW1hbi5jIGIvc3RkL3NoZWxscy9odW1hbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxOGRmMmQKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvc2hlbGxzL2h1bWFuLmMKQEAgLTAsMCArMSwxMTMgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBzaGVsbHMvaHVtYW4uYyAtLSBIdW1hbiBTaGVsbAorLy8KKy8vICRJZDogaHVtYW4uYyA5MDIyIDIwMTUtMDEtMTAgMjE6NTA6NTBaIFplc3N0cmEgJAorCisjcHJhZ21hIHN0cm9uZ190eXBlcyxzYXZlX3R5cGVzCisKK2luaGVyaXQgIi9zdGQvcGxheWVyL2Jhc2UiOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGF0dHJpYnV0ZXMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxoZWFsdGguaD4KKyNpbmNsdWRlIDxuZXdfc2tpbGxzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxkZWZ1ZWwuaD4KKworCisKK3ZvaWQgY3JlYXRlKCkgeworICBpZiAoIWNsb25lcCgpIHx8IG9iamVjdF9uYW1lKHRoaXNfb2JqZWN0KCkpID09IF9fRklMRV9fWzAuLjwzXSkgeworICAgICAgc2V0X25leHRfcmVzZXQoLTEpOyAgICAKKyAgICAgIHJldHVybjsKKyAgfQorCisgIGJhc2U6OmNyZWF0ZSgpOworICBTZXREZWZhdWx0SG9tZSgiL2dpbGRlbi9hYmVudGV1cmVyIik7CisgIFNldERlZmF1bHRQcmF5Um9vbSgiL2QvZWJlbmUvcm9vbS9Qb3J0VmFpbi9wcmF5X3Jvb20iKTsKKyAgU2V0UHJvcChQX0FUVFJJQlVURVNfT0ZGU0VUUywoW0FfSU5UOjEsQV9TVFI6MSxBX0NPTjoxLEFfREVYOjNdKSk7CisgIFNldFByb3AoUF9BVkVSQUdFX1NJWkUsMTcwKTsKKyAgU2V0UHJvcChQX0FWRVJBR0VfV0VJR0hULDc1MDAwKTsKKyAgU2V0UHJvcChQX01BVEVSSUFMX0tOT1dMRURHRSwoW01BVEdST1VQX1dPT0Q6MjAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFUR1JPVVBfTUVUQUw6MjAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFUR1JPVVBfRUxFTUVOVEFMOjIwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BVEdST1VQX0NMT1RIOjIwXSkpOworCisgIFNldFByb3AoUF9NQVhfRk9PRCwxMjApOworICBTZXRQcm9wKFBfTUFYX0RSSU5LLDEyMCk7CisgIFNldFByb3AoUF9NQVhfQUxDT0hPTCwxMjApOworCisgIFNldFByb3AoUF9NQUdJQ19SRVNJU1RBTkNFX09GRlNFVCwKKyAgICAgICAgICAoWyBNVF9BTkdSSUZGIDogNTAwLAorCSAgIE1UX0lMTFVTSU9OIDogNzAwLAorICAgICAgICAgICBNVF9CRUhFUlJTQ0hVTkcgOiA1MDAsCisJICAgTVRfSEVMTFNJQ0hUIDogMTAwMCwKKwkgICBNVF9WRVJXQU5ETFVORyA6IC01MDAsCisJICAgTVRfUFNZQ0hPIDogLTUwMCBdKSk7CisKKyAgLy8gWnVrdWVuZnRpZyAwLCBuaWNodCBtZWhyIC01LiBBcmssIDA0LjAxLjA4LgorICBTZXRQcm9wKFBfQk9EWSwwKTsKKworICAvKiBHcm9lc3NlIHdpcmQgbnVyIGVpbm1hbCBnZXNldHp0ICovCisgIGlmKCFRdWVyeVByb3AoUF9TSVpFKSl7CisgICAgU2V0UHJvcChQX1NJWkUsMTYwK3JhbmRvbSgyMSkpOworICAgIFNldChQX1NJWkUsU0FWRSxGX01PREVfQVMpOworICB9CisKKyAgLyogRGl0byBHZXdpY2h0ICovCisgIGlmKCFRdWVyeVByb3AoUF9XRUlHSFQpIHx8IChRdWVyeVByb3AoUF9XRUlHSFQpID09IDc1MDAwKSl7CisgICAgU2V0UHJvcChQX1dFSUdIVCw2NTAwMCtyYW5kb20oMjAwMDEpKTsKKyAgICBpZihRdWVyeVByb3AoUF9HRU5ERVIpPT1GRU1BTEUpCisgICAgICBTZXRQcm9wKFBfV0VJR0hULFF1ZXJ5UHJvcChQX1dFSUdIVCktNTAwMCk7CisgICAgU2V0KFBfV0VJR0hULFNBVkUsRl9NT0RFX0FTKTsKKyAgfQorICBTZXRQcm9wKFBfREVGVUVMX0xJTUlUX0ZPT0QsNjApOworICBTZXRQcm9wKFBfREVGVUVMX0xJTUlUX0RSSU5LLDUwKTsKKyAgU2V0UHJvcChQX0RFRlVFTF9USU1FX0ZPT0QsNTAwKTsKKyAgU2V0UHJvcChQX0RFRlVFTF9USU1FX0RSSU5LLDI0NSk7CisgIFNldFByb3AoUF9ERUZVRUxfQU1PVU5UX0ZPT0QsMC43NSk7CisgIFNldFByb3AoUF9ERUZVRUxfQU1PVU5UX0RSSU5LLDAuNSk7CisKK30KKworc3RyaW5nIF9xdWVyeV9yYWNlKCkKK3sKKyAgcmV0dXJuICJNZW5zY2giOworfQorCitzdHJpbmcgX3F1ZXJ5X3JlYWxfcmFjZSgpCit7CisgIHJldHVybiAiTWVuc2NoIjsKK30KKworc3RyaW5nICpfcXVlcnlfcmFjZXN0cmluZygpCit7CisgIGlmIChRdWVyeVByb3AoUF9HRU5ERVIpPT0yKQorICAgIHJldHVybiAoeyJNZW5zY2hlbmZyYXUiLCJNZW5zY2hlbmZyYXUiLCJNZW5zY2hlbmZyYXUiLCJNZW5zY2hlbmZyYXUifSk7CisgIHJldHVybiAoeyJNZW5zY2giLCJNZW5zY2hlbiIsIk1lbnNjaCIsIk1lbnNjaGVuIn0pOworfQorCitzdHJpbmcgX3F1ZXJ5X3JhY2VkZXNjcigpCit7CisgIHJldHVybiAiRGllIFN0YWVya2UgZGVzIE1lbnNjaGVuIGlzdCBzZWluZSBWaWVsc2VpdGlna2VpdC5cbiIrCisgICAgIkRlciBNZW5zY2gga2FubiB6d2FyIG5pY2h0cyBiZXNvbmRlcnMgZ3V0IC0gZGFmdWVyIGFiZXIgZWlnZW50bGljaCBhbGxlcy5cbiI7Cit9CisKK2ludCBRdWVyeUFsbG93U2VsZWN0KCkgeyByZXR1cm4gMTsgfQorCit2b2lkIEZpbmFsU2V0dXAoKQoreworICAvLyBJbSBNRyBnaWJ0IGZ1ZXIga2xlaW5lIFNwaWVsZXIgZWluZSBLYXJ0ZSB2b24gUG9ydCBWYWluLiBEaWUgZ2lidCBlcworICAvLyB3b2FuZGVycyBtZWlzdCBuaWNodC4KKyNpZiBNVUROQU1FID09ICJNb3JnZW5HcmF1ZW4iCisgIGlmIChRdWVyeVByb3AoUF9MRVZFTCk8PTMgJiYgIXByZXNlbnQoInBvcnR2YWlua2FydGUiLHRoaXNfb2JqZWN0KCkpKQorICAgIGNsb25lX29iamVjdCgiL2QvZWJlbmUvb2JqL3B2IiktPm1vdmUodGhpc19vYmplY3QoKSxNX05PQ0hFQ0spOworI2VuZGlmCit9CisKK3N0cmluZyBfcXVlcnlfZGVmYXVsdF9ndWlsZCgpeworICByZXR1cm4gImFiZW50ZXVyZXIiOworfQpkaWZmIC0tZ2l0IGEvc3RkL3NoZWxscy9tYWdpZXIuYyBiL3N0ZC9zaGVsbHMvbWFnaWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMyYTE1MAotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9zaGVsbHMvbWFnaWVyLmMKQEAgLTAsMCArMSwzMjYgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBzaGVsbHMvbWFnaWVyLmMgLS0gbWFnaWVyIHNoZWxsCisvLworLy8gJElkOiBtYWdpZXIuYyA5MjMxIDIwMTUtMDUtMjcgMjE6NTM6MzJaIFplc3N0cmEgJAorCisvLworLy8gTWFnaWVyc2hlbGwgQmFzaXNmaWxlCisvLworLy8gVWViZXJhcmJlaXR1bmcgYWJnZXNjaGxvc3NlbiBhbSAxOC4xMi4yMDAyCisvLworLy8gRGFuayBhbiBad2lyY2hAUEssIFJpa3VzQE1HLCBab3JhbkBQSywgVmFuaW9uQE1HCisvLyB1bmQgdmllbGUgYW5kZXJlLCBkaWUgaWNoIHZlcmdlc3NlbiBoYWJlLgorLy8KKy8vIEZyYWdlbiB1bmQgQnVnaGlud2Vpc2UgYW4gTWFuZHJhZ29uQE1HIG9kZXIgZWluZW4KKy8vIEVyem1hZ2llciBEZWluZXIgV2FobC4KKy8vCisvLyBadXIgU2hlbGwgZ2Vob2VyZW4gYXVzc2VyIGRpZXNlciBEYXRlaToKKy8vIGFkbWluLmM6ICAgICAgQWRtaW5pc3RyYXRpdmUgQmVmZWhsZQorLy8gY29tbS5jOiAgICAgICBLb21tdW5pa2F0aW9uc2JlZmVobGUKKy8vIGZpbGVlZGl0LmM6ICAgQmVmZWhsZSB6dW0gVmVyYWVuZGVybiB2b24gRGF0ZWllbgorLy8gZmlsZXZpZXcuYzogICBCZWZlaGxlIHp1bSBMZXNlbiB2b24gRGF0ZWllbgorLy8gbWFnaWVyX2V4dC5jOiBHZW5lcmVsbGUgTWFnaWVyYmVmZWhsZQorLy8gbW92aW5nLmM6ICAgICBCZXdlZ3VuZ3NiZWZlaGxlCisvLyBvYmplY3RzLmM6ICAgIEVyemV1Z2VuIHVuZCB6ZXJzdG9lcmVuIHZvbiBPYmpla3RlbgorLy8gcGFyc2luZy5jICAgICBBdXN3ZXJ0dW5nIHZvbiBQZmFkYW5nYWJlbiB1bmQgV2lsZGNhcmRzCisvLyBwbGF5ZXJzLmM6ICAgIEJlZmVobGUgenVyIEJlZWluZmx1c3N1bmcgdm9uIFNwaWVsZXJuCisvLyB0b2RvLmM6ICAgICAgIEltcGxlbWVudGF0aW9uIGRlciBUb2RvbGlzdGUKKy8vIHVwZC5jOiAgICAgICAgRGVyIEJlZmVobCB1cGQKKy8vIG1hZ2llci5oICAgICAgR2VuZXJlbGxlIEhlYWRlci1EYXRlaQorLy8KKworI3ByYWdtYSBzdHJpY3RfdHlwZXMsc2F2ZV90eXBlcworCitpbmhlcml0ICIvc3RkL3BsYXllci9iYXNlIjsKK2luaGVyaXQgIi9zdGQvc2hlbGxzL21hZ2llci9tYWdpZXJfZXh0IjsKKworI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxuZXdfc2tpbGxzLmg+CisjaW5jbHVkZSA8Y29uZmlnLmg+CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgIGlmICghY2xvbmVwKCkgfHwgb2JqZWN0X25hbWUodGhpc19vYmplY3QoKSkgPT0gX19GSUxFX19bMC4uPDNdKSB7CisgICAgICBzZXRfbmV4dF9yZXNldCgtMSk7CisgICAgICByZXR1cm47CisgIH0KKworICBiYXNlOjpjcmVhdGUoKTsKKworICBTZXQoUF9SQUNFLCBTQVZFLCBGX01PREUpOworICBTZXQoUF9aQVBfTVNHLCBTQVZFLCBGX01PREUpOworICBTZXQoUF9UUkFOS19GSU5ERU4sIFNBVkUsIEZfTU9ERSk7CisgIFNldChQX0hBTkRTLCBTQVZFLCBGX01PREUpOworICBTZXQoUF9SQUNFU1RSSU5HLCBTQVZFLCBGX01PREUpOworICBTZXREZWZhdWx0SG9tZSgiL2dpbGRlbi9hYmVudGV1cmVyIik7CisgIFNldFByb3AoUF9FTkVNWV9ERUFUSF9TRVFVRU5DRSwKKyAgICAoWzE3OiJEZXIgVG9kIHNjaHVldHRlbHQgdmVyc3RhZW5kbmlzbG9zIGRlbiBLb3BmLlxuXG4iLAorICAgICAgMTg6IkRlciBUb2Qgc2FndDogV0lFU08gTVVTU1RFU1QgRFUgRElDSCBBVUNIIFVOQkVESU5HVCAiCisgICAgICAiTUlUIEVJTkVNIE1BR0lFUiBBTkxFR0VOP1xuXG4iXSkpOworICBTZXRQcm9wKFBfQVRUUklCVVRFU19PRkZTRVRTLChbXSkpOworICBTZXRQcm9wKFBfQVZFUkFHRV9TSVpFLDE4NSk7CisgIGlmKCFRdWVyeVByb3AoUF9ERUZBVUxUX0dVSUxEKSkgU2V0UHJvcChQX0RFRkFVTFRfR1VJTEQsImFiZW50ZXVyZXIiKTsKK30KKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlX3N1cGVyKCkgeworICBzZXRfbmV4dF9yZXNldCgtMSk7Cit9CisKKworcHJvdGVjdGVkIHZvaWQgaGVhcnRfYmVhdCgpCit7CisgIG1peGVkICplbjsKKworICBpZiAoIVF1ZXJ5UHJvcChQX1dBTlRTX1RPX0xFQVJOKXx8KChlbj1RdWVyeUVuZW1pZXMoKSkmJnNpemVvZihlblswXSkpKQorICAgIGJhc2U6OmhlYXJ0X2JlYXQoKTsKKyAgZWxzZSBpZiAoIUNoZWNrVGVsbmV0S2VlcEFsaXZlKCkpIHsKKyAgICAvLyBXZW5uIGRlciBNYWdpZXIga2VpbiBUZWxuZXQgS2VlcC1BbGl2ZSB3dWVuc2NodCwga2FubiBkZXIgSEIgZ2FuegorICAgIC8vIGFiZ2VzY2hhbHRldCB3ZXJkZW4uIFNvbnN0IG11c3MgZXIgYWJlciB3ZWl0ZXJsYXVmZW4sIGRhbWl0CisgICAgLy8gQ2hlY2tUZWxuZXRLZWVwQWxpdmUoKSByZWdlbG1hZXNzaWcgZ2VydWZlbiB3aXJkLgorICAgIHNldF9oZWFydF9iZWF0KDApOworICB9Cit9CisKKworcHVibGljIHZhcmFyZ3MgaW50IHJlbW92ZShpbnQgc2lsZW50KQoreworICBzdHJpbmcgd29ya3Jvb207CisKKyAgaWYgKElTX1dJWkFSRCh0aGlzX29iamVjdCgpKSkKKyAgICB3b3Jrcm9vbSA9ICIvcGxheWVycy8iK2dldHVpZCgpKyIvd29ya3Jvb20iOworICBlbHNlCisgICAgd29ya3Jvb20gPSAiL3NlY3VyZS9tZXJsaW4iOworICBpZiggIWVudmlyb25tZW50KCkgfHwgb2JqZWN0X25hbWUoZW52aXJvbm1lbnQoKSkgIT0gd29ya3Jvb20gKQorICAgIGNhdGNoKG1vdmUod29ya3Jvb20sIE1fR08sICJuYWNoIEhhdXNlIikpOworICByZXR1cm4gYmFzZTo6cmVtb3ZlKHNpbGVudCk7Cit9CisKK3B1YmxpYyBzdHJpbmcgTm90aWZ5RGVzdHJ1Y3Qob2JqZWN0IGNhbGxlcikgeworCisgIGlmIChwcmV2aW91c19vYmplY3QoKSAhPSBtYXN0ZXIoKQorICAgICAgfHwgb2JqZWN0X25hbWUodGhpc19vYmplY3QoKSkgPT0gX19GSUxFX19bLi48M10pCisgICAgcmV0dXJuIDA7CisgIAorICAvLyBOaWNodC1FTXMgc29sbGVuIGtlaW5lIEVNcyB6ZXJzdG9lcmVuIGtvZW5uZW4sIHdvcmF1ZmhpbiBhdWNoIGV2dGwuCisgIC8vIEVNLVRvb2xzIHJ1bWxpZWdlbiBrb2VubnRlbi4KKyAgaWYgKCBJU19BUkNIKHRoaXNfb2JqZWN0KCkpICYmIGNhbGxlciAhPSB0aGlzX29iamVjdCgpIAorICAgICAgJiYgZ2V0dWlkKGNhbGxlcikgIT0gUk9PVElECisgICAgICAmJiAocHJvY2Vzc19jYWxsKCkgfHwgIUFSQ0hfU0VDVVJJVFkpICkKKyAgICByZXR1cm4gIkRhcyBaZXJzdG9lcmVuIHZvbiBFTXMgaXN0IGVpbiBGZWhsZXIuIDstKVxuIjsKKworICByZXR1cm4gOjpOb3RpZnlEZXN0cnVjdChjYWxsZXIpOworfQorCit2b2lkIHJlc2V0KCkKK3sKKyAgaWYgKCFpbnRlcmFjdGl2ZSh0aGlzX29iamVjdCgpKSkKKyAgeworICAgIHF1aXQoKTsKKyAgICBpZiAodGhpc19vYmplY3QoKSkKKyAgICAgIHJlbW92ZSgpOworICAgIGlmICh0aGlzX29iamVjdCgpKQorICAgICAgICBkZXN0cnVjdCh0aGlzX29iamVjdCgpKTsKKyAgICByZXR1cm47CisgIH0KK30KKworLy8gICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMgUXVlcnktRnVua3Rpb25lbiAjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK3ZhcmFyZ3MgaW50IGlkIChzdHJpbmcgc3RyKSB7CisgIGlmIChRdWVyeVByb3AoUF9JTlZJUykgJiYKKyAgICAgICghdGhpc19pbnRlcmFjdGl2ZSgpIHx8IUlTX0xFQVJORVIodGhpc19pbnRlcmFjdGl2ZSgpKSkpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiA6OmlkKHN0cik7Cit9CisKKworc3RhdGljIHN0cmluZyAqX3F1ZXJ5X3JhY2VzdHJpbmcoKQoreworICBpZiAocG9pbnRlcnAoUXVlcnkoUF9SQUNFU1RSSU5HKSkpCisgICAgcmV0dXJuIFF1ZXJ5KFBfUkFDRVNUUklORyk7CisgIGVsc2UKKyAgICByZXR1cm4KKyAgICAoe1F1ZXJ5UHJvcChQX1JBQ0UpLFF1ZXJ5UHJvcChQX1JBQ0UpLAorICAgICAgUXVlcnlQcm9wKFBfUkFDRSksUXVlcnlQcm9wKFBfUkFDRSl9KTsKK30KKworCitzdGF0aWMgc3RyaW5nIF9xdWVyeV9kZWZhdWx0X2d1aWxkKCkKK3sKKyAgICByZXR1cm4gKFF1ZXJ5KFBfREVGQVVMVF9HVUlMRCl8fCJhYmVudGV1cmVyIik7Cit9CisKKworc3RhdGljIHN0cmluZyBfcXVlcnlfcmFjZWRlc2NyKCkKK3sKKyAgcmV0dXJuICJNYWdpZXIga29lbm5lbiBlaW5mYWNoIGFsbGVzLiBBYmVyIG1hbmNoZSBNYWdpZXIga29lbm5lbiBtZWhyLlxuIjsKK30KKworCitzdGF0aWMgc3RyaW5nIF9xdWVyeV9yYWNlKCkKK3sKKyAgaWYgKHByZXZpb3VzX29iamVjdCgpICYmIHByZXZpb3VzX29iamVjdCgpLT5xdWVyeV9sb2dpbl9vYmplY3QoKSkKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gUXVlcnkoUF9SQUNFKSA/IFF1ZXJ5KFBfUkFDRSkgOiBTZXQoUF9SQUNFLCAiTWFnaWVyIik7Cit9CisKKworc3RhdGljIG1peGVkIF9xdWVyeV9sb2NhbGNtZHMoKQoreworICByZXR1cm4KKyAgICBiYXNlOjpfcXVlcnlfbG9jYWxjbWRzKCkKKyAgICArbWFnaWVyX2V4dDo6X3F1ZXJ5X2xvY2FsY21kcygpOworfQorCisKK3N0YXRpYyB2b2lkIHVwZF9teV9hZ2UoKQoreworICBhZ2U9X2FnZSthYnNvbHV0ZV9oYl9jb3VudCgpLV9oYnN0b3A7CisgIF9hZ2U9YWdlOworICBfaGJzdG9wPWFic29sdXRlX2hiX2NvdW50KCk7CisgIHJldHVybjsKK30KKworCitzdGF0aWMgaW50IF9xdWVyeV9hZ2UoKQoreworICB1cGRfbXlfYWdlKCk7CisgIHJldHVybiBhZ2U7Cit9CisKK3N0YXRpYyBpbnQgX3NldF9lYXJtdWZmcyhpbnQgbGV2ZWwpCit7CisgIGludCBtYXhsPTErcXVlcnlfd2l6X2xldmVsKHRoaXNfb2JqZWN0KCkpOworICBtYXhsID0gbWF4KG1heGwsOTkpOworICByZXR1cm4gU2V0KFBfRUFSTVVGRlMsbWluKG1heGwsbGV2ZWwpKTsKK30KKworCisvLyAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIEludGVybmUgU2hlbGwtRnVua3Rpb25lbiAjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpbnQgTWF5QWRkV2VpZ2h0KGludCB3KSB7IHJldHVybiAwO30KK2ludCBNYXlBZGRPYmplY3Qob2JqZWN0IG9iKSB7IHJldHVybiAxOyB9CisKKworc3RhdGljIHZvaWQgaW5pdGlhbGl6ZSgpCit7CisgIG1hZ2llcl9leHQ6OmluaXRpYWxpemUoKTsKKyAgcmV0dXJuOworfQorCisKK3N0YXRpYyB2b2lkIEZpbmFsU2V0dXAoKQoreworICBTZXRQcm9wKFBfQ1VSUkVOVERJUiwiL3BsYXllcnMvIitnZXR1aWQoKSk7CisgIGluaXRpYWxpemUoKTsKKyAgaWYgKElTX0xFQVJORVIodGhpc19wbGF5ZXIoKSkpIGNhdCgiL2V0Yy9XSVpORVdTIik7CisgIF9hZ2U9YWdlOworICBfaGJzdG9wPWFic29sdXRlX2hiX2NvdW50KCk7CisgIHJldHVybjsKK30KKworCit2b2lkIHNhdmVfbWUoaW50IGkpCit7CisgIHVwZF9teV9hZ2UoKTsKKyAgYmFzZTo6c2F2ZV9tZShpKTsKKyAgcmV0dXJuOworfQorCisKK3ZhcmFyZ3Mgdm9pZCBSZWNvbm5lY3QoaW50IHNpbGVudCxzdHJpbmcgbXlfaXApCit7CisgIGJhc2U6OlJlY29ubmVjdChzaWxlbnQsbXlfaXApOworICBtYWdpZXJfZXh0OjpyZWNvbm5lY3QoKTsKKyAgcmV0dXJuOworfQorCisKK3ZvaWQgbm90aWZ5X3BsYXllcl9jaGFuZ2Uoc3RyaW5nIHdobywgaW50IHJlaW4sIGludCBpbnZpcykKK3sKKyAgc3RyaW5nICpsaXN0LG5hbWU7CisgIG1peGVkIG1saXN0OworICBpbnQgdmlzX2NoYW5nZTsKKworICBpZiAoaW52aXMpIG5hbWU9IigiK3dobysiKSI7CisgICAgZWxzZSBuYW1lPXdobzsKKworICBpZihxdWVyeV92ZXJiKCkgJiYgKHF1ZXJ5X3ZlcmIoKT09InZpcyIgfHwgcXVlcnlfdmVyYigpPT0iaW52aXMiKSkKKyAgICB2aXNfY2hhbmdlPTE7CisKKyAgaWYgKFF1ZXJ5KFBfSU5GT1JNTUUpICYmICF2aXNfY2hhbmdlKQorICB7CisgICAgaWYgKHJlaW4pIAorICAgICAgdGVsbF9vYmplY3QodGhpc19vYmplY3QoKSwKKyAgICAgICAgICAgICAgICAgIHNwcmludGYoIiVzIGlzdCBnZXJhZGUgaW5zICJNVUROQU1FIiBnZWtvbW1lbi5cbiIsbmFtZSkpOworICAgIGVsc2UKKyAgICAgIHRlbGxfb2JqZWN0KHRoaXNfb2JqZWN0KCksCisgICAgICAgICAgICAgICAgICBzcHJpbnRmKCIlcyBoYXQgZ2VyYWRlIGRhcyAiTVVETkFNRSIgdmVybGFzc2VuLlxuIixuYW1lKSk7CisgIH0KKworICBpZihRdWVyeShQX1dBSVRGT1JfRkxBR1MpICYgKDB4MDEpKXJldHVybiA7CisKKyAgaWYgKHBvaW50ZXJwKGxpc3Q9UXVlcnkoUF9XQUlURk9SKSkmJnNpemVvZihsaXN0KSkKKyAgICBpZiAobWVtYmVyKGxpc3Qsd2hvKSE9LTEpCisgICAgICBkZWxheWVkX3dyaXRlKAorICAgICAgICAgKHsKKyAgICAgICAgICAgKHtzcHJpbnRmKCIlcyVzICAgSSBTIFQgICBKIEUgVCBaIFQgICAlcyAhISFcbiIsCisgICAgICAgICAgICAgICAgICAgICAoUXVlcnlQcm9wKFBfVklTVUFMQkVMTCkgPyAiIiA6IHNwcmludGYoIiVjIiw3KSksCisgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgKHZpc19jaGFuZ2U/CisgICAgICAgICAgICAgICAgICAgICAgIChyZWluPyJTIEkgQyBIIFQgQiBBIFIiOiJVIE4gUyBJIEMgSCBUIEIgQSBSIik6CisgICAgICAgICAgICAgICAgICAgICAgIChyZWluPyJEIEEiOiJOIEkgQyBIIFQgICBNIEUgSCBSICAgRCBBIikpKSwKKyAgICAgICAgICAgMH0pCisgICAgICAgICB9KSk7CisKKyAgaWYgKHJlaW4gJiYgKHNpemVvZihtbGlzdD1RdWVyeVByb3AoUF9XQUlURk9SX1JFQVNPTikpKSAmJgorICAgICAobWFwcGluZ3AobWxpc3QpKSAmJiAobWxpc3Rbd2hvXSkpCisgICAgICAgIFNob3dfV2FpdEZvcl9SZWFzb24od2hvLGludmlzKTsKKyAgcmV0dXJuOworfQorCittaXhlZCBtb2RpZnlfY29tbWFuZChzdHJpbmcgc3RyKSB7CisgIGlmIChwcmV2aW91c19vYmplY3QoKSAmJgorICAgICAgKHByZXZpb3VzX29iamVjdCgpIT10aGlzX29iamVjdCgpIHx8IHByb2Nlc3NfY2FsbCgpKSApCisgIHsKKyAgICBpZiAoSVNfQVJDSCh0aGlzX29iamVjdCgpKSkKKyAgICAgIHRlbGxfb2JqZWN0KHRoaXNfb2JqZWN0KCksCisgICAgICAgIHNwcmludGYoIklsbGVnYWwgbW9kaWZ5X2NvbW1hbmQoJXMpIGZyb20gJU9cbiIsCisgICAgICAgIHN0ciwgcHJldmlvdXNfb2JqZWN0KCkpKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgIC8vIE1hZ2llci1Fc2NhcGUtS29tbWFuZG9zIHdlcmRlbiBiZWhhbmRlbHQgCisgIGlmIChzdHI9PSJcXEVTQ0FQRSIgJiYgSVNfTE9SRCh0aGlzX29iamVjdCgpKSkKKyAgeworICAgIF9fc2V0X2Vudmlyb25tZW50KHRoaXNfb2JqZWN0KCksIi9yb29tL3ZvaWQiKTsKKyAgICBlbnZpcm9ubWVudCgpLT5pbml0KCk7CisgICAgcHJpbnRmKCJZb3UgZXNjYXBlZC5cbiIpOworICAgIHJldHVybiAiIjsKKyAgfQorICBpZiAoc3RyWzAuLjJdPT0iXFxcXFxcIiAmJiBJU19MT1JEKHRoaXNfb2JqZWN0KCkpKQorICB7CisgICAgc3RyID0gX3JldHVybl9hcmdzKHN0cik7CisgICAgc3RyaW5nKiBpbnB1dCA9IGV4cGxvZGUoc3RyWzMuLl0sIiAiKTsKKyAgICBzdHJpbmcgdmVyYiA9IGlucHV0WzBdOworICAgIGlmICh2ZXJiICYmIHZlcmIhPSIiKQorICAgIHsKKyAgICAgIHN0cmluZyBjbWQgPSBpbXBsb2RlKGlucHV0WzEuLl0sIiAiKTsKKyAgICAgIGlmICghX19hdXN3ZXJ0ZW4oY21kLHZlcmIpKQorICAgICAgICBTb3VsQ29tbShjbWQsdmVyYik7CisgICAgfQorICAgIHJldHVybiAxOworICB9CisgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICByZXR1cm4gOjptb2RpZnlfY29tbWFuZChzdHIpOworfQorCmRpZmYgLS1naXQgYS9zdGQvc2hlbGxzL21hZ2llci9hZG1pbi5jIGIvc3RkL3NoZWxscy9tYWdpZXIvYWRtaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDFkMWI3Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkL3NoZWxscy9tYWdpZXIvYWRtaW4uYwpAQCAtMCwwICsxLDQyOCBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGFkbWluLmMKKy8vCisvLyAkSWQ6IGFkbWluLmMgODc1NSAyMDE0LTA0LTI2IDEzOjEzOjQwWiBaZXNzdHJhICQKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKworI2luY2x1ZGUgPHVkcC5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPGlucHV0X3RvLmg+CisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8bWFnaWVyLmg+CisjaW5jbHVkZSA8cGxheWVyLmg+CisKK2luaGVyaXQgIi9zdGQvdXRpbC9jaWRyIjsKKworbWl4ZWQgX3F1ZXJ5X2xvY2FsY21kcygpCit7CisgIHJldHVybiAoeyh7InVkcHEiLCJfdWRwcSIsMCxMRUFSTkVSX0xWTH0pLAorICAgICAgICAgICAoeyJzaHV0ZG93biIsInNodXRfZG93bl9nYW1lIiwwLEFSQ0hfTFZMfSksCisgICAgICAgICAgICh7ImFkZG1hc3RlciIsIl9hZGRtYXN0ZXIiLDAsR09EX0xWTH0pLAorICAgICAgICAgICAoeyJyZW1vdmVtYXN0ZXIiLCJfcmVtb3ZlbWFzdGVyIiwwLEdPRF9MVkx9KSwKKyAgICAgICAgICAgKHsiYWRkZ3VpbGRtYXN0ZXIiLCAiX2FkZGd1aWxkbWFzdGVyIiwgMCwgR09EX0xWTH0pLAorICAgICAgICAgICAoeyJyZW1vdmVndWlsZG1hc3RlciIsICJfcmVtb3ZlZ3VpbGRtYXN0ZXIiLCAwLCBHT0RfTFZMfSksCisgICAgICAgICAgICh7InN1ZW5kZXIiLCJzaW5uZXJzIiwwLFdJWkFSRF9MVkx9KSwKKyAgICAgICAgICAgKHsiYmFuaXNoIiwiYmFuaXNoIiwgMCwgV0laQVJEX0xWTH0pLAorICAgICAgICAgICAoeyJtYmFuaXNoIiwibWJhbmlzaCIsIDAsIFdJWkFSRF9MVkx9KSwKKyAgICAgICAgICAgKHsidGJhbmlzaCIsInRiYW5pc2giLCAwLCBXSVpBUkRfTFZMfSksCisgICAgICAgICAgICh7InNiYW5pc2giLCJzYmFuaXNoIiwgMCwgV0laQVJEX0xWTH0pfSk7Cit9CisKK3N0YXRpYyBpbnQgX3VkcHEoc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIHJldCwgbXVkLCB0eXBlOworCisgIGlmICghKHN0cj1fdW5wYXJzZWRfYXJncygpKSB8fCBzdHI9PSIiIHx8IHNzY2FuZihzdHIsIiVzICVzIixtdWQsdHlwZSk8MikKKyAgeworICAgIHdyaXRlKCJTeW50YXg6IHVkcHEgbXVkIHR5cGVcbiIpOworICAgIHJldHVybiAxOworICB9CisgIGlmIChtZW1iZXIoKHsiY29tbWFuZHMiLCJlbWFpbCIsImhvc3RzIiwiaW5ldGQiLCJsaXN0IiwibXVkX3BvcnQiLCJ0aW1lIiwKKyAgICAgICAgICJ2ZXJzaW9uIn0pLHR5cGUpPT0tMSkKKyAgICB3cml0ZSgiVFlQRXM6IGNvbW1hbmRzLCBlbWFpbCwgaG9zdHMsIGluZXRkLCBsaXN0LCBtdWRfcG9ydCwgdGltZSwgdmVyc2lvblxuIik7CisgIGlmIChyZXQ9KHN0cmluZylJTkVURC0+X3NlbmRfdWRwKG11ZCwoW1NFTkRFUjpnZXR1aWQoKSwgUkVRVUVTVDpRVUVSWSwgREFUQTp0eXBlXSksMSkpCisgICAgd3JpdGUocmV0KTsKKyAgZWxzZQorICAgIHdyaXRlKCJBbmZyYWdlIGFiZ2VzY2hpY2t0LlxuIik7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHNodXRfZG93bl9nYW1lKHN0cmluZyBzdHIpCit7CisgIGlmICghSVNfQVJDSCh0aGlzX29iamVjdCgpKSB8fCB0aGlzX29iamVjdCgpIT10aGlzX2ludGVyYWN0aXZlKCkpCisgICAgcmV0dXJuIDA7CisgIF9ub3RpZnlfZmFpbCgiRHUgbXVzc3QgZWluZW4gR3J1bmQgZGFmdWVyIGFuZ2ViZW4uXG4iKTsKKyAgaWYgKCFzdHIpIHJldHVybiAwOworICB3cml0ZSggIkRpcmVrdGVyIHNodXRkb3duIG1pdCBHcnVuZCBcIiIrc3RyKyJcIj9cbiIgKTsKKyAgaW5wdXRfdG8oInNodXRfZG93bl9nYW1lXzIiLElOUFVUX1BST01QVCwgIihqYS9uZWluKSA6Iiwgc3RyKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc2h1dF9kb3duX2dhbWVfMihzdHJpbmcgYXJnLHN0cmluZyBzdHIpCit7CisgIGlmICghSVNfQVJDSCh0aGlzX29iamVjdCgpKSB8fCB0aGlzX29iamVjdCgpIT10aGlzX2ludGVyYWN0aXZlKCkpCisgICAgcmV0dXJuIDA7CisgIGlmKCBhcmchPSJqYSIgKSB7CisgICAgd3JpdGUoICJTaHV0ZG93biBhYmdlYnJvY2hlbi5cbiIgKTsKKyAgfSBlbHNlIHsKKyAgICBzaHV0ZG93bihzdHIpOworICB9CisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgX2FkZG1hc3RlcihzdHJpbmcgc3RyKQoreworICBzdHJpbmcgbWFzdGVyLCBkb21haW47CisKKyAgaWYgKCFHT0RfU0VDVVJJVFkpCisgIHsKKyAgICB3cml0ZSgiRGFzIGRhcmZzdCBEdSBuaWNodCFcbiIpOworICAgIHJldHVybiAxOworICB9CisgIF9ub3RpZnlfZmFpbCgiU3ludGF4OiBhZGRtYXN0ZXIgPHVzZXI+IDxkb21haW4+XG4iKTsKKyAgaWYgKCFzdHIpIHJldHVybiAwOworICBpZiAoc3NjYW5mKHN0ciwiJXMgJXMiLG1hc3Rlcixkb21haW4pIT0yKSByZXR1cm4gMDsKKyAgaWYgKCFtYXN0ZXIgfHwgIWRvbWFpbikgcmV0dXJuIDA7CisgIGlmICghIi9zZWN1cmUvbWFzdGVyIi0+YWRkX2RvbWFpbl9tYXN0ZXIobWFzdGVyLGRvbWFpbikpCisgICAgd3JpdGUoIkhhdCBuaWNodCBmdW5rdGlvbmllcnQuXG4iKTsKKyAgZWxzZQorICAgIHdyaXRlKCJPay5cbiIpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfcmVtb3ZlbWFzdGVyKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyBtYXN0ZXIsIGRvbWFpbjsKKworICBpZiAoIUdPRF9TRUNVUklUWSkKKyAgeworICAgIHdyaXRlKCJEYXMgZGFyZnN0IER1IG5pY2h0IVxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgX25vdGlmeV9mYWlsKCJTeW50YXg6IHJlbW92ZW1hc3RlciA8dXNlcj4gPGRvbWFpbj5cbiIpOworICBpZiAoIXN0cikgcmV0dXJuIDA7CisgIGlmIChzc2NhbmYoc3RyLCIlcyAlcyIsbWFzdGVyLGRvbWFpbikhPTIpIHJldHVybiAwOworICBpZiAoIW1hc3RlciB8fCAhZG9tYWluKSByZXR1cm4gMDsKKyAgaWYgKCEiL3NlY3VyZS9tYXN0ZXIiLT5yZW1vdmVfZG9tYWluX21hc3RlcihtYXN0ZXIsZG9tYWluKSkKKyAgICB3cml0ZSgiSGF0IG5pY2h0IGZ1bmt0aW9uaWVydC5cbiIpOworICBlbHNlCisgICAgd3JpdGUoIk9rLlxuIik7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9hZGRndWlsZG1hc3RlcihzdHJpbmcgc3RyKQoreworICBzdHJpbmcgbWFzdGVyLCBndWlsZDsKKyAgCisgIGlmICghR09EX1NFQ1VSSVRZKQorICB7CisgICAgd3JpdGUgKCJEYXMgZGFyZnN0IER1IG5pY2h0IVxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBfbm90aWZ5X2ZhaWwoIlN5bmF0eDogYWRkZ3VpbGRtYXN0ZXIgPHVzZXI+IDxndWlsZD5cbiIpOworICBpZiAoIXN0cikgcmV0dXJuIDA7CisgIGlmIChzc2NhbmYoc3RyLCAiJXMgJXMiLCBtYXN0ZXIsIGd1aWxkKSE9MikgcmV0dXJuIDA7CisgIGlmICghbWFzdGVyIHx8ICFndWlsZCkgcmV0dXJuIDA7CisgIGlmICghIi9zZWN1cmUvbWFzdGVyIi0+YWRkX2d1aWxkX21hc3RlcihtYXN0ZXIsZ3VpbGQpKQorICAgIHdyaXRlKCJIYXQgbmljaHQgZnVua3Rpb25pZXJ0LlxuIik7CisgIGVsc2UKKyAgICB3cml0ZSAoIk9rLlxuIik7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9yZW1vdmVndWlsZG1hc3RlcihzdHJpbmcgc3RyKQoreworICBzdHJpbmcgbWFzdGVyLCBndWlsZDsKKyAgCisgIGlmICghR09EX1NFQ1VSSVRZKQorICB7CisgICAgd3JpdGUgKCJEYXMgZGFyZnN0IER1IG5pY2h0IVxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgX25vdGlmeV9mYWlsKCJTeW50YXg6IHJlbW92ZWd1aWxkbWFzdGVyIDx1c2VyPiA8Z3VpbGQ+XG4iKTsKKyAgaWYgKCFzdHIpIHJldHVybiAwOworICBpZiAoc3NjYW5mKHN0ciwgIiVzICVzIiwgbWFzdGVyLCBndWlsZCkhPTIpIHJldHVybiAwOworICBpZiAoIW1hc3RlciB8fCAhZ3VpbGQpIHJldHVybiAwOworICBpZiAoISIvc2VjdXJlL21hc3RlciItPnJlbW92ZV9ndWlsZF9tYXN0ZXIobWFzdGVyLGd1aWxkKSkKKyAgICB3cml0ZSgiSGF0IG5pY2h0IGZ1bmt0aW9uaWVydC5cbiIpOworICBlbHNlCisgICAgd3JpdGUoIk9rLlxuIik7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHNpbm5lcnMoc3RyaW5nIGFyZykKK3sgICBzdHJpbmcgKnBhcnRzOworICAgIGludCAgICBpOworCisgICAgaWYgKCAhSVNfREVQVVRZKHRoaXNfb2JqZWN0KCkpICkKKyAgICAgIHJldHVybiAwOworCisgICAgYXJnPV91bnBhcnNlZF9hcmdzKCl8fGFyZzsKKworICAgIG5vdGlmeV9mYWlsKAorICAgICAgICAiU3ludGF4OiBzdWVuZGVyID8gICAgICAgICAgICAgID0+IExpc3RlIGFsbGVyIEVpbmdldHJhZ2VuZW5cbiIrCisgICAgICAgICIgICAgICAgIHN1ZW5kZXIgPG5hbWU+ICAgICAgICAgPT4gRWludHJhZWdlIGxlc2VuXG4iKworICAgICAgICAiICAgICAgICBzdWVuZGVyICs8bmFtZT4gPHRleHQ+ID0+IEVpbnRyYWcgaGluenVmdWVnZW5cbiIrCisgICAgICAgICIgICAgICAgIHN1ZW5kZXIgLTxuYW1lPiA8bnI+ICAgPT4gRWludHJhZyBsb2VzY2hlblxuIisKKyAgICAgICAgIiAgICAgICAgc3VlbmRlciAhICAgICAgICAgICAgICA9PiBBbGxlIEVpbnRyYWVnZSBkdW1wZW5cbiIrCisgICAgICAgICIgICAgICAgIHN1ZW5kZXIgKiAgICAgICAgICAgICAgPT4gQWxsZSBFaW50cmFlZ2UgYW56ZWlnZW5cbiIpOworCisgICAgaWYgKCAhc3RyaW5ncChhcmcpIHx8IChzaXplb2YoYXJnKTwxKSApCisgICAgICByZXR1cm4gMDsKKworICAgIGlmICggYXJnPT0iPyIgKQorICAgIHsKKyAgICAgICAgd3JpdGUoY2FsbF9vdGhlcigiL3NlY3VyZS9zaW5tYXN0ZXIiLCJMaXN0U2lubmVycyIpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmICggYXJnPT0iISIgKQorICAgIHsKKyAgICAgICAgd3JpdGUoY2FsbF9vdGhlcigiL3NlY3VyZS9zaW5tYXN0ZXIiLCJEdW1wIikpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKCBhcmc9PSIqIiApCisgICAgeworICAgICAgICBNb3JlKChzdHJpbmcpY2FsbF9vdGhlcigiL3NlY3VyZS9zaW5tYXN0ZXIiLCJEdW1wIiwxKSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGlmICggKGk9c2l6ZW9mKHBhcnRzPWV4cGxvZGUoYXJnLCIgIikpKTwxICkKKyAgICAgIHJldHVybiAwOworCisgICAgaWYgKCBwYXJ0c1swXVswLi4wXT09Ii0iICkKKyAgICB7CisgICAgICBpZiAoIGk8MiApCisgICAgICAgIHJldHVybiAwOworICAgICAgd3JpdGUoY2FsbF9vdGhlcigiL3NlY3VyZS9zaW5tYXN0ZXIiLCJSZW1vdmVTaW4iLAorICAgICAgICAgICAgbG93ZXJzdHJpbmcocGFydHNbMF1bMS4uXSksCisgICAgICAgICAgICB0b19pbnQocGFydHNbMV0pKSk7CisgICAgfQorICAgIGVsc2UgaWYgKCBwYXJ0c1swXVswLi4wXT09IisiICkKKyAgICB7CisgICAgICBpZiAoIGk8MiApCisgICAgICAgIHJldHVybiAwOworICAgICAgd3JpdGUoY2FsbF9vdGhlcigiL3NlY3VyZS9zaW5tYXN0ZXIiLCJBZGRTaW4iLAorICAgICAgICAgICAgbG93ZXJzdHJpbmcocGFydHNbMF1bMS4uXSksCisgICAgICAgICAgICBpbXBsb2RlKHBhcnRzWzEuLl0sIiAiKSkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaWYgKCBpPjEgKQorICAgICAgICByZXR1cm4gMDsKKyAgICAgIHdyaXRlKGNhbGxfb3RoZXIoIi9zZWN1cmUvc2lubWFzdGVyIiwiTGlzdFNpbnMiLAorICAgICAgICAgICAgbG93ZXJzdHJpbmcocGFydHNbMF0pKSk7CisgICAgfQorICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGJhbmlzaChzdHJpbmcgc3RyKQoreworICBzdHJpbmcgZ3J1bmQsIG5hbWU7CisgIGludCBmb3JjZTsKKworICBpZiAoICFMT1JEX1NFQ1VSSVRZICYmICFJU19ERVBVVFkoc2VjdXJlX2V1aWQoKSkgKQorICAgICAgcmV0dXJuIDA7CisKKyAgaWYgKCAhc3RyIHx8ICFzdHJpbmdwKHN0cikgfHwgIXNpemVvZihzdHIpICkgeworICAgICAgd3JpdGUoIlN5bnRheDogYmFuaXNoIFstZl0gPG5hbWU+IFs8Z3J1bmQ+XVxuIik7CisgICAgICByZXR1cm4gMTsKKyAgfQorCisgIHN0ciA9IF91bnBhcnNlZF9hcmdzKCk7CisKKyAgaWYgKCBleHBsb2RlKHN0ciwgIiAiKVswXSA9PSAiLWYiICl7CisgICAgICBzdHIgPSBpbXBsb2RlKCBleHBsb2RlKHN0ciwgIiAiKVsxLi5dLCAiICIgKTsKKyAgICAgIGZvcmNlID0gMTsKKyAgfQorCisgIGlmICggc3NjYW5mKCBzdHIsICIlcyAlcyIsIG5hbWUsIGdydW5kICkgIT0gMiApCisgICAgICBuYW1lPXN0cjsKKworICBpZiAoICFuYW1lIHx8ICFzaXplb2YobmFtZSkgKXsKKyAgICB3cml0ZSgiU3ludGF4OiBiYW5pc2ggWy1mXSA8bmFtZT4gWzxncnVuZD5dXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIG5hbWU9bG93ZXJfY2FzZShuYW1lKTsKKyAgIi9zZWN1cmUvbWFzdGVyIi0+QmFuaXNoTmFtZSggbmFtZSwgZ3J1bmQsIGZvcmNlICk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IG1iYW5pc2goc3RyaW5nIHN0cikKK3sKKyAgICBzdHJpbmcgZ3J1bmQsIG5hbWUsICpuYW1lbiwgdHh0LCAqZHVtbXk7CisgICAgbWFwcGluZyBsaXN0OworICAgIGludCBpOworCisgICAgaWYgKCAhSVNfREVQVVRZKHNlY3VyZV9ldWlkKCkpICkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBfbm90aWZ5X2ZhaWwoICJTeW50YXg6IG1iYW5pc2ggPG5hbWU+IFs8Z3J1bmQ+XVxuIiApOworCisgICAgaWYgKCAhc3RyIHx8ICFzdHJpbmdwKHN0cikgfHwgIXNpemVvZihzdHIpICl7CisgICAgICAgIGlmICggIW1hcHBpbmdwKGxpc3QgPSAobWFwcGluZykiL3NlY3VyZS9tZXJsaW4iLT5NQmFuaXNoTGlzdCgpKSB8fAorICAgICAgICAgICAgICEoaSA9IHNpemVvZihsaXN0KSkgKXsKKyAgICAgICAgICAgIHdyaXRlKCAiTW9tZW50YW4gaXN0IGtlaW4gU3BpZWxlciBhdWYgZGVyIG1iYW5pc2gtTGlzdGUuXG4iICk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgICAgIHR4dCA9ICIgICAgICBOYW1lICAgICB8IGdlYmFuaXNodCB2b24gfCAgICAgICAgICAgICAgICAgICAgR3J1bmRcbiIgKworICAgICAgICAgICAgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iICsKKyAgICAgICAgICAgICI9PT09PT09PT09PT09PT09PT1cbiI7CisKKyAgICAgICAgbmFtZW4gPSBzb3J0X2FycmF5KCBtX2luZGljZXMobGlzdCksICMnPC8qJyovICk7CisKKyAgICAgICAgZm9yICggOyBpLS07ICl7CisgICAgICAgICAgICBkdW1teSA9IGV4cGxvZGUoIGJyZWFrX3N0cmluZyggbGlzdFtuYW1lbltpXSwwXSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLSBrZWluZSBCZWdydWVuZHVuZyAtLSIsIDQ1ICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiIgKSAtICh7IiJ9KTsKKworICAgICAgICAgICAgdHh0ICs9IHNwcmludGYoICIgICUtMTFzICB8ICAlLTExcyAgfCAgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZSggbmFtZW5baV0gKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKCBsaXN0W25hbWVuW2ldLDFdIHx8ICIiICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZSggaW1wbG9kZSggZHVtbXksICJcbiAgICAgICAgICAgICAgIHwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgIHwgICIgKSApICk7CisgICAgICAgIH0KKworICAgICAgICBNb3JlKHR4dCk7CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgKCBzc2NhbmYoIHN0ciwgIiVzICVzIiwgbmFtZSwgZ3J1bmQgKSAhPTIgKQorICAgICAgICBuYW1lID0gc3RyOworCisgICAgaWYgKCAhbmFtZSB8fCAhc2l6ZW9mKG5hbWUpICkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBuYW1lID0gbG93ZXJfY2FzZShuYW1lKTsKKworICAgIGlmICggIWdydW5kIHx8ICFzdHJpbmdwKGdydW5kKSB8fCBsb3dlcl9jYXNlKGdydW5kKSAhPSAibG9lc2NoZW4iICl7CisgICAgICAgICIvc2VjdXJlL21lcmxpbiItPk1CYW5pc2hJbnNlcnQoIG5hbWUsIGdydW5kLCB0aGlzX2ludGVyYWN0aXZlKCkgKTsKKyAgICAgICAgd3JpdGUoICJEdSBzZXR6dCAiK2NhcGl0YWxpemUobmFtZSkrIiBhdWYgZGllIE1CYW5pc2gtTGlzdGUuXG4iICk7CisgICAgfQorICAgIGVsc2V7CisgICAgICAgIGlmICggIUFSQ0hfU0VDVVJJVFkgKXsKKyAgICAgICAgICAgIHdyaXRlKCAiRGFzIGR1ZXJmZW4gbnVyIEVyem1hZ2llci5cbiIgKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgICIvc2VjdXJlL21lcmxpbiItPk1CYW5pc2hEZWxldGUoIG5hbWUgKTsKKyAgICAgICAgd3JpdGUoICJEdSBsb2VzY2h0ICIrY2FwaXRhbGl6ZShuYW1lKSsiIHZvbiBkZXIgTUJhbmlzaC1MaXN0ZS5cbiIgKTsKKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IHRiYW5pc2goIHN0cmluZyBzdHIgKQoreworICBzdHJpbmcgbmFtZTsKKyAgaW50IGRheXM7CisKKyAgaWYgKCAhSVNfREVQVVRZKHNlY3VyZV9ldWlkKCkpICkKKyAgICAgIHJldHVybiAwOworCisgIF9ub3RpZnlfZmFpbCgiU3ludGF4OiB0YmFuaXNoIDxuYW1lPiA8dGFnZT5cbiIpOworCisgIGlmICggIXN0ciB8fCAhc3RyaW5ncChzdHIpIHx8ICFzaXplb2Yoc3RyKSApCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKCBzc2NhbmYoc3RyLCIlcyAlZCIsbmFtZSxkYXlzKSAhPSAyICkKKyAgICAgIHJldHVybiAwOworCisgIGlmICggIW5hbWUgfHwgIXNpemVvZihuYW1lKSApCisgICAgcmV0dXJuIDA7CisKKyAgbmFtZSA9IGxvd2VyX2Nhc2UobmFtZSk7CisKKyAgaWYgKCAhIi9zZWN1cmUvbWFzdGVyIi0+VEJhbmlzaE5hbWUoIG5hbWUsIGRheXMgKSApCisgICAgICByZXR1cm4gMTsKKworICBpZiAoICFkYXlzICkKKyAgICAgIHdyaXRlKCAiT2theSwga2VpbmUgU3BpZWxwYXVzZSBmdWVyICIrY2FwaXRhbGl6ZShuYW1lKSsiIG1laHIuXG4iICk7CisgIGVsc2UKKyAgICAgIHdyaXRlKCAiRHUgdmVycGFzc3QgIitjYXBpdGFsaXplKG5hbWUpKyIgZWluZSBTcGllbHBhdXNlIGZ1ZXIgIisKKyAgICAgICAgICAgICAoZGF5cz4wID8gZGF5cysiIFRhZ2UiIDogImxhYWFhbmdlIFplaXQiKSsiLlxuIiApOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBzYmFuaXNoKCBzdHJpbmcgc3RyICkKK3sKKyAgICBzdHJpbmcgaXA7CisgICAgaW50IGRheXM7CisgICAgbWFwcGluZyBzaXRlczsKKworICAgIC8vIE1pbmRlc3RlbnMgTDI2IGZ1ZXIgZGllc2VuIEJlZmVobAorICAgIGlmICggc2VjdXJlX2xldmVsKCkgPD0gRE9NQUlOTUVNQkVSX0xWTCApCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCAhc3RyIHx8ICFzdHJpbmdwKHN0cikgfHwgIXNpemVvZihzdHIpICl7CisgICAgICAgIGlmICggIXNpemVvZihzaXRlcyA9IChtYXBwaW5nKU1BU1RFUi0+U2l0ZUJhbmlzaCggMCwgMCApKSApeworICAgICAgICAgICAgd3JpdGUoICJFcyBzaW5kIHp1ciBaZWl0IGtlaW5lIEFkcmVzc2VuIGdlc3BlcnJ0IVxuIiApOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICBpcCA9ICIgICAgICBBZHJlc3NlICAgICAgfCAgZ2VzcGVycnQgYmlzICAgICAgICAgICAgICAgICB8ICBnZXNwZXJydCAiCisgICAgICAgICAgICArICJkdXJjaFxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCisgICAgICAgICAgICArICI9PT09PT09PT09PT09PVxuIjsKKworICAgICAgICBpbnQgKmtleXMgPSBzb3J0X2FycmF5KCBtX2luZGljZXMoc2l0ZXMpLCAjJzwvKicqLyApOworCisgICAgICAgIGZvcmVhY2goaW50IGtleSA6IGtleXMpIHsKKyAgICAgICAgICAgIGlwICs9IHNwcmludGYoICIgICU6MTUtcyAgfCAgJToyNy1zICB8ICAlLXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJUHY0X2ludDJhZGRyKGtleSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXRlc1trZXldID4gMCA/IGR0aW1lKHNpdGVzW2tleV0pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdC4gTmltbWVybGVpbnN0YWciLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoc2l0ZXNba2V5LCAxXSkgKTsKKyAgICAgICAgfQorICAgICAgICB3cml0ZSggaXAgKyAiXG4iICk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIF9ub3RpZnlfZmFpbCgiU3ludGF4OiBzYmFuaXNoIDxudW1lcmlzY2hlIGlwPiA8dGFnZT5cbiIpOworCisgICAgaWYgKCBzc2NhbmYoIHRoaXNfcGxheWVyKCktPl91bnBhcnNlZF9hcmdzKCksICIlcyAlZCIsIGlwLCBkYXlzICkgIT0gMiApCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCAhaXAgfHwgIXNpemVvZihpcCkgKQorICAgICAgICByZXR1cm4gMDsKKworLy8gICAgX25vdGlmeV9mYWlsKCAiVW5ndWVsdGlnZXMgQWRyZXNzLUZvcm1hdCFcbiIgKTsKKworICAgIGlmICggIWRheXMgKXsKKyAgICAgICAgaW50IHJlcz0oaW50KU1BU1RFUi0+U2l0ZUJhbmlzaChpcCwgMCk7CisgICAgICAgIGlmICggcmVzID09IDEgKQorICAgICAgICAgICAgIHByaW50ZiggIkRpZSBBZHJlc3NlICclcycgaXN0IGpldHp0IG5pY2h0IG1laHIgZ2VzcGVycnQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgaXAgKTsKKyAgICAgICAgZWxzZSBpZiAoIHJlcyA9PSAwICkKKyAgICAgICAgICAgICBwcmludGYoICJEaWUgQWRyZXNzZSAnJXMnIHdhciBnYXIgbmljaHQgZ2VzcGVycnQhXG4iLAorICAgICAgICAgICAgICAgICAgICAgaXAgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJpbnRmKCAiRHUgZGFyZnN0IG51ciBlaWdlbmUgU3BlcnJ1bmdlbiB3aWVkZXIgYXVmaGViZW4hXG4iICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpbnQgcmVzOworICAgICAgICBpZiAoIGRheXMgIT0gMSAmJiAhSVNfREVQVVRZKHNlY3VyZV9ldWlkKCkpICkKKyAgICAgICAgICAgIHdyaXRlKCAiRHUgZGFyZnN0IEFkcmVzc2VuIG51ciBmdWVyIGVpbmVuIFRhZyBzcGVycmVuIVxuIiApOworICAgICAgICBlbHNlIGlmICggKHJlcyA9IChpbnQpTUFTVEVSLT5TaXRlQmFuaXNoKGlwLCBkYXlzKSkgPT0gMSApCisgICAgICAgICAgICAgcHJpbnRmKCAiRGllIEFkcmVzc2UgJyVzJyBpc3QgamV0enQgZnVlciAlcyBnZXNwZXJydC5cbiIsCisgICAgICAgICAgICAgICAgICAgICBpcCwgKGRheXMgPiAxID8gc3ByaW50ZiggIiVkIFRhZ2UiLCBkYXlzICkgOgorICAgICAgICAgICAgICAgICAgICAgIChkYXlzID4gMCA/ICJlaW5lbiBUYWciIDogImltbWVyIikpICk7CisgICAgICAgIGVsc2UgaWYgKCByZXMgPT0gLTEgKQorICAgICAgICAgICAgd3JpdGUoICJEdSBkYXJmc3QgIiArIChMT1JEX1NFQ1VSSVRZID8gIjI1NSBJUC1BZHJlc3NlbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAibnVyIGVpbnplbG5lIElQLUFkcmVzc2VuIikgKyAiIHNwZXJyZW4hXG4iICk7CisgICAgICAgIGVsc2UgaWYgKCByZXMgPT0gLTIgKQorICAgICAgICAgICAgd3JpdGUoICJEdSBoYXN0IHNjaG9uIGdlbnVnIEFkcmVzc2VuIGdlc3BlcnJ0IVxuIiApOworICAgIH0KKworICAgIHJldHVybiAxOworfQorCmRpZmYgLS1naXQgYS9zdGQvc2hlbGxzL21hZ2llci9jb21tLmMgYi9zdGQvc2hlbGxzL21hZ2llci9jb21tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNiZDI2NgotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9zaGVsbHMvbWFnaWVyL2NvbW0uYwpAQCAtMCwwICsxLDE0OSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGNvbW0uYworLy8KKy8vICRJZDogY29tbS5jIDg3NTUgMjAxNC0wNC0yNiAxMzoxMzo0MFogWmVzc3RyYSAkCisjcHJhZ21hIHN0cmljdF90eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisKKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxtYWdpZXIuaD4KKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHRoaW5nL2Rlc2NyaXB0aW9uLmg+CisjaW5jbHVkZSA8cGxheWVyLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCisKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFQ0hPQUxMICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjCisKK3N0YXRpYyBpbnQgX2VjaG9hbGwoc3RyaW5nIHN0cikKK3sKKyAgaWYgKCEoc3RyPV91bnBhcnNlZF9hcmdzKCkpKQorICAgIHJldHVybiBVU0FHRSgiZWNob2FsbCA8dGV4dD5cbiIpOworICBzdHI9YnJlYWtfc3RyaW5nKHN0cik7CisgIHNob3V0KHN0cik7CisgIHByaW50ZihzdHIpOworICByZXR1cm4gMTsKK30KKworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRUNIT1RPICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjCisKK3N0YXRpYyBpbnQgX2VjaG90byhzdHJpbmcgc3RyKQoreworICBvYmplY3Qgb2I7CisgIHN0cmluZyB3aG87CisgIHN0cmluZyBtc2c7CisKKyAgaWYgKCEoc3RyPV91bnBhcnNlZF9hcmdzKCkpfHxzc2NhbmYoc3RyLCAiJXMgJXMiLCB3aG8sIG1zZykgIT0gMikKKyAgICByZXR1cm4gVVNBR0UoImVjaG90byA8c3BpZWxlcj4gPHRleHQ+XG4iKTsKKyAgb2IgPSBmaW5kX3BsYXllcihsb3dlcl9jYXNlKHdobykpOworICBpZiAoIW9iKQorICB7CisgICAgcHJpbnRmKCJlY2hvdG86IEVzIGlzdCBrZWluIFNwaWVsZXIgJyVzJyBlaW5nZWxvZ2d0LlxuIix3aG8pOworICAgIHJldHVybiAxOworICB9CisgIG1zZz1icmVha19zdHJpbmcobXNnLDc4KTsKKyAgdGVsbF9vYmplY3Qob2IsbXNnKTsKKyAgcHJpbnRmKCIlcy0+JXMiLG9iLT5OYW1lKFdFTiksbXNnKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgTUVDSE8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMKKworc3RhdGljIGludCBfbWVjaG8oc3RyaW5nIHN0cikgIHsKKyAgb2JqZWN0ICp3aG87CisgIGludCBpOworCisgIGlmICghc2l6ZW9mKHN0cj1fdW5wYXJzZWRfYXJncygpKSkKKyAgICByZXR1cm4gVVNBR0UoIm1lY2hvIDx0ZXh0PlxuIik7CisgIHdobz11c2VycygpOworICBpPXNpemVvZih3aG8pOworICB3aGlsZShpLS0paWYgKElTX0xFQVJORVIod2hvW2ldKSkKKyAgICAgIHRlbGxfb2JqZWN0KHdob1tpXSwgYnJlYWtfc3RyaW5nKHN0ciw3OCkpOworICByZXR1cm4gMTsKK30KKworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgUElORyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIworCitzdGF0aWMgaW50IF9waW5nKHN0cmluZyBzdHIpCit7CisgIG9iamVjdCBwbDsKKworICBpZiAoIXNpemVvZihzdHIpKQorICAgIHJldHVybiBVU0FHRSgicGluZyA8c3BpZWxlcm5hbWU+XG4iKTsKKyAgaWYgKCEocGw9ZmluZF9wbGF5ZXIobG93ZXJfY2FzZShzdHIpKSkpCisgICAgcmV0dXJuCisgICAgICBfbm90aWZ5X2ZhaWwoc3ByaW50ZigicGluZzogU3BpZWxlciAlcyBuaWNodCBnZWZ1bmRlbi5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKHN0cikpKSwwOworICB0ZWxsX29iamVjdChwbCxzcHJpbnRmKCIlcyBwaW5ndCBEaWNoIGFuLlxhXG4iLGNhcGl0YWxpemUoZ2V0dWlkKCkpKSk7CisgIHJldHVybiBwcmludGYoIlBJTkdHR0dHR0chIERBUyBzb2xsdGUgJXMgYXVmIERpY2ggYXVmbWVya3NhbSAiCisgICAgICAgICAgICAgICAgImdlbWFjaHQgaGFiZW4uXG4iLGNhcGl0YWxpemUoZ2V0dWlkKHBsKSkpLDE7Cit9CisKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIE9ST1BBWCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIworCitpbnQgX29yb3BheChzdHJpbmcgY21kbGluZSkKK3sKKyAgaW50IGxldmVsLG9sZCxuZXc7CisKKyAgY21kbGluZT1fdW5wYXJzZWRfYXJncygpOworICBvbGQ9UXVlcnlQcm9wKFBfRUFSTVVGRlMpOworICBpZiAoIXNpemVvZihjbWRsaW5lKXx8Y21kbGluZT09IjAiKQorICB7CisgICAgaWYgKG9sZCkKKyAgICB7CisgICAgICBwcmludGYoIkR1IG5pbW1zdCBkYXMgT3JvcGF4IGF1cyBEZWluZW4gT2hyZW4gdW5kIGhvZXJzdCAiCisgICAgICAgICAgICAgIndpZWRlciBhbGxlbiBhbmRlcmVuIHp1LlxuIik7CisgICAgICBTZXRQcm9wKFBfRUFSTVVGRlMsIDApOworICAgIH0KKyAgICBlbHNlCisgICAgICBwcmludGYoIkR1IGhhc3QgZG9jaCBnYXIga2VpbiBPcm9wYXggaW4gZGVuIE9ocmVuLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKHNzY2FuZihjbWRsaW5lLCAiJWQiLCBsZXZlbCkgPT0gMCB8fCBsZXZlbCA8IDEpCisgICAgcmV0dXJuIFVTQUdFKCJvcm9wYXggWzxtYWdpZXJsZXZlbD5dXG4iKTsKKyAgaWYgKChuZXc9U2V0UHJvcChQX0VBUk1VRkZTLCBsZXZlbCkpPT1sZXZlbCkKKyAgeworICAgIGlmIChuZXc9PW9sZCkKKyAgICAgIHJldHVybiBwcmludGYoIkR1IGhhdHRlc3QgRGVpbmUgT3JvcGF4bWVuZ2Ugc2Nob24gYXVmIE1hZ2llcmxldmVsICIKKyAgICAgICAgICAgICAgICAgICAgIiVkIGFuZ2VwYXNzdC5cbiIsbGV2ZWwpLDE7CisgICAgaWYgKG5ldz5vbGQpCisgICAgICByZXR1cm4gcHJpbnRmKCJEdSBzdG9wZnN0IERpciBzb3ZpZWwgT3JvcGF4IGluIGRpZSBPaHJlbiwgZGFzcyAiCisgICAgICAgICAgICAgICAgICAgICJEdSBudXIgbm9jaCAlcyBhYlxuTGV2ZWwgJWQgaG9lcnN0LlxuIiwKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWw+PUxFQVJORVJfTFZMPyJNYWdpZXIiOiJTZWhlciIsbGV2ZWwpLDE7CisgICAgcmV0dXJuIHByaW50ZigiRHUgbmltbXN0IHNvdmllbCBPcm9wYXggYXVzIGRlbiBPaHJlbiwgZGFzcyBEdSBhYiAiCisgICAgICAgICAgICAgICAgICAic29mb3J0IHdpZWRlciAlcyBhYlxuTGV2ZWwgJWQgdmVyc3RlaHN0LlxuIiwKKyAgICAgICAgICAgICAgICAgIGxldmVsPj1MRUFSTkVSX0xWTD8iTWFnaWVyIjoiU2VoZXIiLGxldmVsKSwxOworICB9CisgIHJldHVybiBwcmludGYoIkR1IHN0b3Bmc3QgdW5kIHN0b3Bmc3QsIGJpcyBEaXIgZGFzIE9yb3BheCB3aWVkZXIgenVyICIKKyAgICAgICAgICAgICAgICAiTmFzZSBoZXJhdXNrb21tdC5cbkxlaWRlciBtdXNzdCBEdSBkYW1pdCBNYWdpZXIgYWIgTGV2ZWwgIgorICAgICAgICAgICAgICAgICIlZCB3ZWl0ZXJoaW4gaG9lcmVuLlxuIixuZXcpLDE7Cit9CisKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgSU5JVElBTElTSUVSVU5HICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjCisKK3N0YXRpYyBtaXhlZCBfcXVlcnlfbG9jYWxjbWRzKCkKK3sKKyAgcmV0dXJuCisgICAgKHsoeyJvcm9wYXgiLCJfb3JvcGF4IiwwLExFQVJORVJfTFZMfSksCisgICAgICAoeyJlY2hvdG8iLCJfZWNob3RvIiwwLExFQVJORVJfTFZMfSksCisgICAgICAoeyJlY2hvYWxsIiwiX2VjaG9hbGwiLDAsTEVBUk5FUl9MVkx9KSwKKyAgICAgICh7Im1lY2hvIiwiX21lY2hvIiwwLExFQVJORVJfTFZMfSksCisgICAgICAoeyJwaW5nIiwiX3BpbmciLDAsTEVBUk5FUl9MVkx9KX0pOworfQpkaWZmIC0tZ2l0IGEvc3RkL3NoZWxscy9tYWdpZXIvZmlsZWVkaXQuYyBiL3N0ZC9zaGVsbHMvbWFnaWVyL2ZpbGVlZGl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRkZjBhNQotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9zaGVsbHMvbWFnaWVyL2ZpbGVlZGl0LmMKQEAgLTAsMCArMSw3MTggQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvL2ZpbGVlZGl0LmMKKy8vCisvLyAkSWQ6IGZpbGVlZGl0LmMgOTE0MiAyMDE1LTAyLTA0IDIyOjE3OjI5WiBaZXNzdHJhICQKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKy8vI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8aW5wdXRfdG8uaD4KKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDxtYWdpZXIuaD4KKyNpbmNsdWRlIDxwbGF5ZXIuaD4KKyNpbmNsdWRlIDxmaWxlcy5oPgorCisvLyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBJTklUSUFMSVNJRVJVTkcgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIworCittaXhlZCBfcXVlcnlfbG9jYWxjbWRzKCkKK3sKKyAgcmV0dXJuICh7ICh7ImNwIiwiX2NwIiwwLFdJWkFSRF9MVkx9KSwKKyAgICAgICAgICAgICh7Im12IiwiX2NwIiwwLFdJWkFSRF9MVkx9KSwKKyAgICAgICAgICAgICh7InJtIiwiX3JtIiwwLFdJWkFSRF9MVkx9KSwKKyAgICAgICAgICAgICh7InJtZGlyIiwiX3JtZGlyIiwwLFdJWkFSRF9MVkx9KSwKKyAgICAgICAgICAgICh7Im1rZGlyIiwiX21rZGlyIiwwLFdJWkFSRF9MVkx9KSwKKyAgICAgICAgICAgICh7ImVkIiwiX2VkIiwwLFdJWkFSRF9MVkx9KX0pOworfQorCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRUQgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIworCisKKy8vCisvLyBfZWRfZmlsZTogTWVocmVyZSBGaWxlcyBoaW50ZXJlaW5hbmRlciBlZGl0aWVyZW4KKy8vCisKK3ByaXZhdGUgbm9zYXZlIHN0cmluZyAqX2VkX2NhY2hlOworCitwcml2YXRlIHZvaWQgX2VkX2ZpbGUoKQoreworICBpZiAoIXNpemVvZihfZWRfY2FjaGUpKSByZXR1cm47CisgIHByaW50ZigiZWQ6IE5hZWNoc3RlIERhdGVpOiAlc1xuIixfZWRfY2FjaGVbMF0pOworICBlZChfZWRfY2FjaGVbMF0sIl9lZF9maWxlIik7CisgIF9lZF9jYWNoZT1fZWRfY2FjaGVbMS4uXTsKKyAgcmV0dXJuOworfQorCisjaWYgX19WRVJTSU9OX18gPCAiMy4yLjkiCitwcml2YXRlIG1peGVkIF9lZF9zaXplX2ZpbHRlcihtaXhlZCAqYXJnKQoreworICBpZiAoYXJnW0ZJTEVTSVpFXT49LTEpIHJldHVybiBhcmdbRlVMTE5BTUVdOworICBwcmludGYoIiVzIGlzdCBlaW4gVmVyemVpY2huaXMuXG4iLGFyZ1tGVUxMTkFNRV0pOworICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisvLworLy8gX21vcmU6IERhdGVpZW4gYW56ZWlnZW4KKy8vIGNtZGxpbmU6IEtvbW1hbmRvemVpbGUKKy8vCisKK3N0YXRpYyBpbnQgX2VkKHN0cmluZyBjbWRsaW5lKQoreworICBtaXhlZCAqYXJncywqYXJnczI7CisgIGludCBmbGFncyxpLGFyZ19zaXplOworICBjbWRsaW5lPV91bnBhcnNlZF9hcmdzKCk7CisgIGFyZ3M9cGFyc2VhcmdzKGNtZGxpbmUsJmZsYWdzLCIiLDEpOworICBpZiAoZmxhZ3M9PS0xfHwhKGFyZ19zaXplPXNpemVvZihhcmdzKSkpCisgICAgcmV0dXJuIFVTQUdFKCJlZCA8ZGF0ZWk+IFs8ZGF0ZWkyPi4uXSIpOworICB3aGlsZShhcmdfc2l6ZS0tKQorICB7CisgICAgaWYgKHNpemVvZihhcmdzMj1maWxlX2xpc3QoYXJnc1thcmdfc2l6ZS4uYXJnX3NpemVdLE1PREVfRUQsMCwiLyIpKSkKKyAgICAgIGFyZ3NbYXJnX3NpemUuLmFyZ19zaXplXT1hcmdzMjsKKyAgICBlbHNlCisgICAgICBhcmdzW2FyZ19zaXplXT0oeyAiIiAsIC0xLCAwICwgKHN0cmluZykKKyAgICAgICAgICAgICAgY2FsbF9vdGhlcihtYXN0ZXIoKSwiX2dldF9wYXRoIixhcmdzW2FyZ19zaXplXSwKKyAgICAgICAgICAgICAgICAgIGdldHVpZCgpKX0pOworICB9CisjaWYgX19WRVJTSU9OX18gPCAiMy4yLjkiCisgIGFyZ3M9bWFwKGFyZ3MsIydfZWRfc2l6ZV9maWx0ZXIpLSh7MH0pOworI2Vsc2UKKyAgYXJncz1tYXAoYXJncywoOgorICAgICAgICAgIGlmICgkMVtGSUxFU0laRV0+PS0xKSByZXR1cm4gJDFbRlVMTE5BTUVdOworICAgICAgICAgIHByaW50ZigiJXMgaXN0IGVpbiBWZXJ6ZWljaG5pcy5cbiIsJDFbRlVMTE5BTUVdKTsKKyAgICAgICAgICByZXR1cm4gMDsgOikpLSh7MH0pOworI2VuZGlmCisgIGlmIChmbGFncz09LTF8fCFzaXplb2YoYXJncykpIHJldHVybiBVU0FHRSgiZWQgPGRhdGVpPiBbPGRhdGVpMj4uLl0iKTsKKyAgX2VkX2NhY2hlPWFyZ3M7CisgIF9lZF9maWxlKCk7CisgIHJldHVybiAxOworfQorCisKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQ1AgJiBNViAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjCisKK3N0YXRpYyB2b2lkIF9jcF9hc2tfY29weShtaXhlZCAqZmlsZWRhdGEsaW50IGR1bW15LCBpbnQgZmxhZ3MpOworc3RhdGljIHZvaWQgX2NwX2Fza19vdmVyd3JpdGUobWl4ZWQgKmZpbGVkYXRhLCBpbnQgbW9kZSwgaW50IGZsYWdzKTsKK3N0YXRpYyB2b2lkIF9tdl9hc2tfb3ZlcndyaXRlKG1peGVkICpmaWxlZGF0YSwgaW50IG1vZGUsIGludCBmbGFncyk7CisKK3N0YXRpYyBtaXhlZCBjcF9maWxlKG1peGVkIGZpbGVkYXRhLGludCBtb3ZlLGludCBmbGFncywgbWl4ZWQgKmRvX2RlbGV0ZSkKK3sKKyAgc3RyaW5nIHNvdXJjZSxkZXN0OworICBzb3VyY2U9KHN0cmluZylmaWxlZGF0YVtGVUxMTkFNRV07CisgIGRlc3Q9KHN0cmluZylmaWxlZGF0YVtERVNUTkFNRV07CisgIGlmIChzb3VyY2U9PWRlc3QpIHJldHVybiBFUlJPUihTQU1FX0ZJTEUsc291cmNlLFJFVF9GQUlMKTsKKyAgaWYgKCFNQVlfUkVBRChzb3VyY2UpKSByZXR1cm4gRVJST1IoTk9fUkVBRCxzb3VyY2UsUkVUX0pVTVApOworICBpZiAoIU1BWV9XUklURShkZXN0KSkgcmV0dXJuIEVSUk9SKE5PX1dSSVRFLGRlc3QsUkVUX0pVTVApOworICBpZiAoZmlsZWRhdGFbRklMRVNJWkVdPT0tMSkgcmV0dXJuIEVSUk9SKERPRVNOVF9FWElTVCxzb3VyY2UsUkVUX0pVTVApOworICBpZiAoZmlsZWRhdGFbRklMRVNJWkVdPT0tMikgLy8gUXVlbGxlIGlzdCBWZXJ6ZWljaG5pcworICB7CisgICAgc3dpdGNoKGZpbGVfc2l6ZShkZXN0KSkKKyAgICB7CisgICAgICBjYXNlIC0xOgorICAgICAgICBpZiAobW92ZSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChyZW5hbWUoc291cmNlLGRlc3QpKSByZXR1cm4gRVJST1IoTk9fQ1JFQVRFX0RJUixkZXN0LFJFVF9KVU1QKTsKKyAgICAgICAgICBpZiAoZmxhZ3MmQ1BfVikgcHJpbnRmKEZJTEVfTU9WRUQsc291cmNlKTsKKyAgICAgICAgICByZXR1cm4gUkVUX0pVTVA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFta2RpcihkZXN0KSkgcmV0dXJuIEVSUk9SKE5PX0NSRUFURV9ESVIsZGVzdCxSRVRfSlVNUCk7CisgICAgICAgIGlmIChmbGFncyZDUF9WKSBwcmludGYoRElSX0NSRUFURUQsZGVzdCk7CisgICAgICBjYXNlIC0yOgorICAgICAgICBpZiAoIW1vdmUpIHJldHVybiBSRVRfT0s7CisgICAgICAgIGlmIChmaWxlZGF0YVtTVUJESVJTSVpFXT4wKSByZXR1cm4gUkVUX0RFTEVURTsKKyAgICAgICAgaWYgKCFybWRpcihzb3VyY2UpKSByZXR1cm4gRVJST1IoTk9fREVMRVRFLHNvdXJjZSxSRVRfRkFJTCk7CisgICAgICAgIGlmIChmbGFncyZNVl9WKSBwcmludGYoIm12OiAlczogUXVlbGx2ZXJ6ZWljaG5pcyB3dXJkZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdlbG9lc2NodC5cbiIsc291cmNlKTsKKyAgICAgICAgcmV0dXJuIFJFVF9PSzsgICAgCisgICAgICBkZWZhdWx0OiAgcmV0dXJuIEVSUk9SKE5PX0RJUlMsZGVzdCxSRVRfSlVNUCk7CisgICAgfQorICB9CisgIHN3aXRjaChmaWxlX3NpemUoZGVzdCkpCisgIHsKKyAgICBjYXNlIC0yOiByZXR1cm4gRVJST1IoREVTVF9JU19ESVIsZGVzdCxSRVRfRkFJTCk7CisgICAgZGVmYXVsdDoKKyAgICAgIGlmIChmbGFncyZDUF9GKQorICAgICAgeworICAgICAgICBpZiAoIXJtKGRlc3QpKSByZXR1cm4gRVJST1IoREVTVF9OT19ERUxFVEUsZGVzdCxSRVRfRkFJTCk7CisgICAgICAgIGlmIChmbGFncyZDUF9WKSBwcmludGYoRklMRV9ERUxFVEVELGRlc3QpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBpZiAobW92ZSkgcmV0dXJuICMnX212X2Fza19vdmVyd3JpdGU7CisgICAgICAgIGVsc2UgcmV0dXJuICMnX2NwX2Fza19vdmVyd3JpdGU7CisgICAgICB9CisgICAgY2FzZSAtMToKKyAgICAgIGlmIChtb3ZlKQorICAgICAgeworICAgICAgICBpZiAocmVuYW1lKHNvdXJjZSxkZXN0KSkgcmV0dXJuIEVSUk9SKE5PX01PVkUsc291cmNlLFJFVF9GQUlMKTsKKyAgICAgICAgaWYgKGZsYWdzJkNQX1YpIHByaW50ZihGSUxFX01PVkVELHNvdXJjZSk7CisgICAgICAgIHJldHVybiBSRVRfT0s7CisgICAgICB9CisgICAgICBpZiAoY29weV9maWxlKHNvdXJjZSxkZXN0KSkgcmV0dXJuIEVSUk9SKE5PX0NPUFksc291cmNlLFJFVF9GQUlMKTsKKyAgICAgIGlmIChmbGFncyZDUF9WKSBwcmludGYoRklMRV9DT1BJRUQsc291cmNlKTsKKyAgICAgIHJldHVybiBSRVRfT0s7CisgIH0KKyAgcmV0dXJuIDA7IC8vIG5vdC1yZWFjaGVkCit9CisKK3N0YXRpYyB2b2lkIF9jcF9hc2tfb3ZlcndyaXRlMihzdHJpbmcgaW5wdXQsIG1peGVkICpmaWxlZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW50ZXJhY3RpdmUsaW50IGZsYWdzLGludCBtb3ZlKQoreworICBpZiAoIXNpemVvZihpbnB1dCkpIGlucHV0PSIgIjsKKyAgaW5wdXQ9bG93ZXJfY2FzZShpbnB1dCk7CisgIHN3aXRjaChpbnB1dFswXSkKKyAgeworICAgIGNhc2UgJ3EnOgorICAgICAgcHJpbnRmKCIlcyBhYmdlYnJvY2hlbiFcbiIsbW92ZT8iQmV3ZWdlbiI6IktvcGllcmVuIik7CisgICAgICByZXR1cm47CisgICAgY2FzZSAnYSc6CisgICAgICBmbGFnc3w9Q1BfRjsKKyAgICAgIGlmICghKGZsYWdzJkNQX0kpKQorICAgICAgeworICAgICAgICBhc3luY2hyb24oZmlsZWRhdGEsIydjcF9maWxlLG1vdmUsZmxhZ3MsMCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICBjYXNlICd5JzoKKyAgICBjYXNlICdqJzoKKyAgICAgIGlmICghcm0oZmlsZWRhdGFbMF1bREVTVE5BTUVdKSkKKyAgICAgICAgcHJpbnRmKERFU1RfTk9fREVMRVRFICJVZWJlcmdlaGUgRGF0ZWkuLi5cbiIsZmlsZWRhdGFbMF1bREVTVE5BTUVdKTsKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaWYgKGZsYWdzJkNQX1YpIHByaW50ZihGSUxFX0RFTEVURUQsZmlsZWRhdGFbMF1bREVTVE5BTUVdKTsKKyAgICAgICAgaWYgKG1vdmUpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAocmVuYW1lKGZpbGVkYXRhWzBdW0ZVTExOQU1FXSxmaWxlZGF0YVswXVtERVNUTkFNRV0pKQorICAgICAgICAgICAgcHJpbnRmKE5PX01PVkUgIlVlYmVyZ2VoZSBEYXRlaS4uLlxuIixmaWxlZGF0YVswXVtGVUxMTkFNRV0pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmIChjb3B5X2ZpbGUoZmlsZWRhdGFbMF1bRlVMTE5BTUVdLGZpbGVkYXRhWzBdW0RFU1ROQU1FXSkpCisgICAgICAgICAgICBwcmludGYoTk9fQ09QWSAiVWViZXJnZWhlIERhdGVpLi4uXG4iLGZpbGVkYXRhWzBdW0ZVTExOQU1FXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICBjYXNlICduJzoKKyAgICAgIGlmIChmbGFncyZDUF9JKQorICAgICAgICBfY3BfYXNrX2NvcHkoZmlsZWRhdGFbMStmaWxlZGF0YVswXVtTVUJESVJTSVpFXS4uXSxtb3ZlLGZsYWdzKTsKKyAgICAgIGVsc2UKKyAgICAgICAgYXN5bmNocm9uKGZpbGVkYXRhWzErZmlsZWRhdGFbMF1bU1VCRElSU0laRV0uLl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIydjcF9maWxlLG1vdmUsZmxhZ3MsMCk7CisgICAgICByZXR1cm47CisgICAgZGVmYXVsdDoKKyAgICAgIHByaW50ZigiS29tbWFuZG8gbmljaHQgdmVyc3RhbmRlbi5cbiIpOworICAgICAgX2NwX2Fza19vdmVyd3JpdGUoZmlsZWRhdGEsaW50ZXJhY3RpdmUsZmxhZ3MpOworICAgICAgcmV0dXJuOworICB9CisKK30KKworc3RhdGljIHZvaWQgX2NwX2Fza19vdmVyd3JpdGUobWl4ZWQgKmZpbGVkYXRhLCBpbnQgaW50ZXJhY3RpdmUsIGludCBmbGFncykKK3sKKyAgcHJpbnRmKCJEaWUgRGF0ZWkgJyVzJyBleGlzdGllcnQgc2Nob24uXG4iLAorICAgICAgICAgZmlsZWRhdGFbMF1bREVTVE5BTUVdKTsKKyAgaW5wdXRfdG8oIl9jcF9hc2tfb3ZlcndyaXRlMiIsSU5QVVRfUFJPTVBULCJVZWJlcnNjaHJlaWJlbj8gKGosbixhLHEpOiAiLAorICAgICAgZmlsZWRhdGEsaW50ZXJhY3RpdmUsZmxhZ3MsMCk7CisgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQgX212X2Fza19vdmVyd3JpdGUobWl4ZWQgKmZpbGVkYXRhLCBpbnQgaW50ZXJhY3RpdmUsIGludCBmbGFncykKK3sKKyAgcHJpbnRmKCJEaWUgRGF0ZWkgJyVzJyBleGlzdGllcnQgc2Nob24uIiwKKyAgICAgICAgIGZpbGVkYXRhWzBdW0RFU1ROQU1FXSk7CisgIGlucHV0X3RvKCJfY3BfYXNrX292ZXJ3cml0ZTIiLElOUFVUX1BST01QVCwiVWViZXJzY2hyZWliZW4/IChqLG4sYSxxKTogIiwKKyAgICAgIGZpbGVkYXRhLGludGVyYWN0aXZlLGZsYWdzLDEpOworICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIF9jcF9hc2tfY29weTIoc3RyaW5nIGlucHV0LG1peGVkICpmaWxlZGF0YSxpbnQgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncyxpbnQgbW92ZSkKK3sKKyAgaWYgKCFzaXplb2YoaW5wdXQpKSBpbnB1dD0iICI7CisgIGlucHV0PWxvd2VyX2Nhc2UoaW5wdXQpOworICBzd2l0Y2goaW5wdXRbMF0pCisgIHsKKyAgICBjYXNlICd5JzoKKyAgICBjYXNlICdqJzoKKyAgICAgIGlmIChtb2RlPT0xKQorICAgICAgeworICAgICAgICBpZiAoIShmbGFncyZDUF9GKSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChtb3ZlKSBfbXZfYXNrX292ZXJ3cml0ZShmaWxlZGF0YSwxLGZsYWdzKTsKKyAgICAgICAgICBlbHNlICAgICAgX2NwX2Fza19vdmVyd3JpdGUoZmlsZWRhdGEsMSxmbGFncyk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghcm0oZmlsZWRhdGFbMF1bREVTVE5BTUVdKSkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZihERVNUX05PX0RFTEVURSAiVWViZXJnZWhlIERhdGVpLi4uXG4iLAorICAgICAgICAgICAgICAgICBmaWxlZGF0YVswXVtERVNUTkFNRV0pOworICAgICAgICAgIF9jcF9hc2tfY29weShmaWxlZGF0YVsxLi5dLG1vdmUsZmxhZ3MpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmxhZ3MmQ1BfVikgcHJpbnRmKEZJTEVfREVMRVRFRCxmaWxlZGF0YVswXVtERVNUTkFNRV0pOworICAgICAgfQorICAgICAgaWYgKG1vZGU8MikKKyAgICAgIHsKKyAgICAgICAgaWYgKG1vdmUpIHJlbmFtZShmaWxlZGF0YVswXVtGVUxMTkFNRV0sZmlsZWRhdGFbMF1bREVTVE5BTUVdKTsKKyAgICAgICAgZWxzZSBjb3B5X2ZpbGUoZmlsZWRhdGFbMF1bRlVMTE5BTUVdLGZpbGVkYXRhWzBdW0RFU1ROQU1FXSk7CisgICAgICAgIF9jcF9hc2tfY29weShmaWxlZGF0YVsxLi5dLG1vdmUsZmxhZ3MpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBpZiAobW9kZT09MikKKyAgICAgIHsKKyAgICAgICAgaWYgKG1vdmUpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAocmVuYW1lKGZpbGVkYXRhWzBdW0ZVTExOQU1FXSxmaWxlZGF0YVswXVtERVNUTkFNRV0pKQorICAgICAgICAgICAgcHJpbnRmKE5PX01PVkUgIlVlYmVyZ2VoZSBWZXJ6ZWljaG5pcy4uLlxuIiwKKyAgICAgICAgICAgICAgICAgICBmaWxlZGF0YVswXVtGVUxMTkFNRV0pOworICAgICAgICAgIF9jcF9hc2tfY29weShmaWxlZGF0YVsxK2ZpbGVkYXRhWzBdW1NVQkRJUlNJWkVdLi5dLG1vdmUsZmxhZ3MpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWtkaXIoZmlsZWRhdGFbMF1bREVTVE5BTUVdKSkKKyAgICAgICAgeworICAgICAgICAgIF9jcF9hc2tfY29weShmaWxlZGF0YVsxLi5dLDAsZmxhZ3MpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBwcmludGYoTk9fQ1JFQVRFX0RJUiAiVWViZXJnZWhlIFZlcnplaWNobmlzLi4uXG4iLAorICAgICAgICAgICAgICAgZmlsZWRhdGFbMF1bREVTVE5BTUVdKTsKKyAgICAgIH0KKyAgICBjYXNlICduJzoKKyAgICAgIF9jcF9hc2tfY29weShmaWxlZGF0YVsoMStmaWxlZGF0YVswXVtTVUJESVJTSVpFXSkuLl0sMCxmbGFncyk7CisgICAgICByZXR1cm47CisgICAgY2FzZSAncSc6CisgICAgICBwcmludGYoIktvcGllcmVuIGFiZ2Vicm9jaGVuIVxuIik7CisgICAgICByZXR1cm47CisgICAgY2FzZSAnYSc6CisgICAgICBmbGFncyY9fkNQX0k7CisgICAgICBhc3luY2hyb24oZmlsZWRhdGEsIydjcF9maWxlLG1vdmUsZmxhZ3MsMCk7CisgICAgICByZXR1cm47CisgICAgZGVmYXVsdDoKKyAgICAgIHByaW50ZigiS29tbWFuZG8gbmljaHQgdmVyc3RhbmRlbi5cbiIpOworICAgICAgX2NwX2Fza19jb3B5KGZpbGVkYXRhLDAsZmxhZ3MpOworICAgICAgcmV0dXJuOworICB9Cit9CisKK3N0YXRpYyB2b2lkIF9jcF9hc2tfY29weShtaXhlZCAqZmlsZWRhdGEsaW50IG1vdmUsIGludCBmbGFncykKK3sKKyAgbWl4ZWQgZGF0YTsKKyAgc3RyaW5nIGRlc3Qsc291cmNlOworICBpbnQgZGVsZXRlX3N1YnMsanVtcDsKKworICBpZighc2l6ZW9mKGZpbGVkYXRhKSkKKyAgeworICAgIHByaW50ZigiJXM6IGFiZ2VzY2hsb3NzZW4uXG4iLG1vdmU/Im12IjoiY3AiKTsKKyAgICByZXR1cm47IAorICB9CisgIGRlc3Q9ZmlsZWRhdGFbMF1bREVTVE5BTUVdOworICBzb3VyY2U9ZmlsZWRhdGFbMF1bRlVMTE5BTUVdOworICBzd2l0Y2goMCkgICAvLyBicmVhayB3aXJrdCBkYW1pdCB3aWUgZWluIGdvdG8gZW5kX29mX3N3aXRjaAorICB7CisgICAgZGVmYXVsdDoKKyAgICBjYXNlIDA6IC8vIFNpbm5sb3MsIGFiZXIgZXIgY29tcGlsaWVydCBzb25zdCBuaWNodCA6KAorICAgICAganVtcD1maWxlZGF0YVswXVtTVUJESVJTSVpFXTsKKyAgICAgIGlmIChzb3VyY2U9PWRlc3QpCisgICAgICB7CisgICAgICAgIHByaW50ZihTQU1FX0ZJTEUsc291cmNlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoIU1BWV9SRUFEKHNvdXJjZSkpCisgICAgICB7CisgICAgICAgIHByaW50ZihOT19SRUFELHNvdXJjZSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKCFNQVlfV1JJVEUoZGVzdCkpCisgICAgICB7CisgICAgICAgIHByaW50ZihOT19XUklURSxkZXN0KTsKKyAgICAgICAganVtcD0wOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChmaWxlZGF0YVswXVtGSUxFU0laRV09PS0xKQorICAgICAgeworICAgICAgICBwcmludGYoRE9FU05UX0VYSVNULHNvdXJjZSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKGZpbGVkYXRhWzBdW0ZJTEVTSVpFXT09LTIpIC8vIFF1ZWxsZSBpc3QgVmVyemVpY2huaXMKKyAgICAgIHsKKyAgICAgICAgaWYgKGZpbGVfc2l6ZShkZXN0KT4tMSkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZihOT19ESVJTLGRlc3QpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChmaWxlX3NpemUoZGVzdCk9PS0yKQorICAgICAgICB7CisgICAgICAgICAganVtcD0wOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHByaW50ZigiVmVyemVpY2huaXMgJyVzJyAlcz9cbiIsc291cmNlLAorICAgICAgICAgICAgICAgbW92ZT8iYmV3ZWdlbiI6ImtvcGllcmVuIik7CisgICAgICAgIGlucHV0X3RvKCJfY3BfYXNrX2NvcHkyIixJTlBVVF9QUk9NUFQsICIoaixuLGEscSkgIiwKKyAgICAgICAgICAgIGZpbGVkYXRhLDIsZmxhZ3MsbW92ZSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGlmIChmaWxlX3NpemUoZGVzdCk9PS0yKQorICAgICAgeworICAgICAgICBwcmludGYoREVTVF9JU19ESVIsZGVzdCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgcHJpbnRmKCInJXMnICVzP1xuIixzb3VyY2UsbW92ZT8iYmV3ZWdlbiI6ImtvcGllcmVuIik7CisgICAgICBpbnB1dF90bygiX2NwX2Fza19jb3B5MiIsSU5QVVRfUFJPTVBULCAiKGosbixhLHEpICIsCisgICAgICAgICAgZmlsZWRhdGEsKGZpbGVfc2l6ZShkZXN0KSE9LTEpLGZsYWdzLG1vdmUpOworICAgICAgcmV0dXJuOworICB9CisgIF9jcF9hc2tfY29weShmaWxlZGF0YVsxK2p1bXAuLl0sbW92ZSxmbGFncyk7CisgIHJldHVybjsKK30KKworCitzdGF0aWMgaW50IF9jcChzdHJpbmcgY21kbGluZSkKK3sKKyAgbWl4ZWQgKmFyZ3M7CisgIGludCBmbGFnczsKKyAgc3RyaW5nIG1hc2s7CisgIHN0cmluZyBkZXN0LCpkZXN0MjsKKyAgY21kbGluZT1fdW5wYXJzZWRfYXJncygpOworICBhcmdzPXBhcnNlYXJncyhjbWRsaW5lLCZmbGFncyxDUF9PUFRTLDApOworICBpZiAoZmxhZ3M9PS0xfHwhc2l6ZW9mKGFyZ3MpKQorICAgIHJldHVybiBVU0FHRShxdWVyeV92ZXJiKCkrIiBbLSIgQ1BfT1BUUworICAgICAgICAgICAgICAgICAiXSA8ZGF0ZWkvdmVyej4gWzxkYXRlaTIvdmVyejI+IC4uLiBdIDx6aWVsPiBbPG1hc2tlPl0iKTsKKyAgaWYgKGZsYWdzJkNQX00pCisgIHsKKyAgICBtYXNrPWFyZ3NbPDFdOworICAgIGFyZ3M9YXJnc1swLi48Ml07CisgIH0KKyAgaWYgKCFkZXN0PXRvX2ZpbGVuYW1lKGFyZ3NbPDFdKSkKKyAgICAgcmV0dXJuIFVTQUdFKHF1ZXJ5X3ZlcmIoKSsiIFstIiBDUF9PUFRTCisgICAgICAgICAgIl0gPGRhdGVpL3Zlcno+IFs8ZGF0ZWkyL3ZlcnoyPiAuLi4gXSA8emllbD4gWzxtYXNrZT5dIik7CisgIGlmIChmaWxlX3NpemUoZGVzdCk9PS0xKQorICB7CisgICAgZGVzdDI9ZXhwbG9kZShkZXN0LCIvIik7CisgICAgaWYgKGZpbGVfc2l6ZShpbXBsb2RlKGRlc3QyWzAuLjwyXSwiLyIpKT09LTIpCisgICAgeworICAgICAgaWYgKGRlc3QyWzwxXT09IioiKQorICAgICAgICBkZXN0PWltcGxvZGUoZGVzdDJbMC4uPDJdLCIvIik7CisgICAgICBlbHNlCisgICAgICAgIGlmIChtZW1iZXIoZGVzdDJbPDFdLCcqJyk+LTF8fAorICAgICAgICAgICAgbWVtYmVyKGRlc3QyWzwxXSwnPycpPi0xKQorICAgICAgICAgcmV0dXJuIG5vdGlmeV9mYWlsKAorICAgICAgICAgIHNwcmludGYoIiVzOiBLZWluZSAqIHVuZCA/IGltIFppZWxuYW1lbiBlcmxhdWJ0LlxuIixxdWVyeV92ZXJiKCkpKSwwOworICAgIH0KKyAgICBlbHNlCisgICAgICByZXR1cm4gbm90aWZ5X2ZhaWwoCisgICAgICAgIHNwcmludGYoIiVzOiBEZXIgYW5nZWdlYmVuZSBaaWVscGZhZCBleGlzdGllcnQgbmljaHQuXG4iLAorICAgICAgICAgICAgICAgIHF1ZXJ5X3ZlcmIoKSkpLDA7CisgIH0KKyAgYXJncz1hcmdzWzAuLjwyXTsKKyAgaWYgKGZpbGVfc2l6ZShkZXN0KSE9LTImJnNpemVvZihhcmdzKT4xKQorICAgIHJldHVybiBub3RpZnlfZmFpbCgKKyAgICAgICAgc3ByaW50ZigiJXM6IEJlaSBtZWhyZXJlbiBRdWVsbGVuIG11c3MgZGFzIFppZWwgZWluIFZlcnplaWNobmlzICIKKyAgICAgICAgICAgICAgICAic2Vpbi5cbiIscXVlcnlfdmVyYigpKSksMDsKKyAgaWYgKCFzaXplb2YoYXJncz1tYXAoYXJncywjJ3RvX2ZpbGVuYW1lKS0oezB9KSkpCisgICAgcmV0dXJuIFVTQUdFKHF1ZXJ5X3ZlcmIoKSsiIFstIiBDUF9PUFRTCisgICAgICAgICAgIl0gPGRhdGVpL3Zlcno+IFs8ZGF0ZWkyL3ZlcnoyPiAuLi4gXSA8emllbD4gWzxtYXNrZT5dIik7CisgIC8vIERFQlVHKCJERVNUOiAiICsgZGVzdCArICIgOiBGTEFHUzogIiArIGZsYWdzKTsKKyAgYXJncz1maWxlX2xpc3QoYXJncyxNT0RFX0NQLChmbGFncyZDUF9SKSxkZXN0KyIvIixtYXNrKTsKKyAgaWYgKCFzaXplb2YoYXJncykpCisgICAgcmV0dXJuIG5vdGlmeV9mYWlsKHNwcmludGYoIiVzOiBLZWluZSBwYXNzZW5kZW4gRGF0ZWllbiBnZWZ1bmRlbi5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlfdmVyYigpKSksMDsKKworICBpZiAoc2l6ZW9mKGFyZ3MpPjEmJihhcmdzWzBdW0ZJTEVTSVpFXT49MCkmJmZpbGVfc2l6ZShkZXN0KSE9LTIpCisgICAgICByZXR1cm4gbm90aWZ5X2ZhaWwoCisgICAgICAgIHNwcmludGYoIiVzOiBCZWkgbWVocmVyZW4gUXVlbGxlbiBtdXNzIGRhcyBaaWVsIGVpbiBWZXJ6ZWljaG5pcyAiCisgICAgICAgICAgICAgICAgInNlaW4uXG4iLHF1ZXJ5X3ZlcmIoKSkpLDA7CisgIGlmIChzaXplb2YoYXJncyk9PTEmJmZpbGVfc2l6ZShkZXN0KSE9LTIpCisgICAgYXJnc1swXVtERVNUTkFNRV09ZGVzdDsKKyAgaWYgKCEoZmxhZ3MmQ1BfSSkpCisgIHsKKyAgICBhc3luY2hyb24oYXJncywjJ2NwX2ZpbGUsKHF1ZXJ5X3ZlcmIoKT09Im12IiksZmxhZ3MsMCk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKHF1ZXJ5X3ZlcmIoKT09ImNwIikKKyAgICBfY3BfYXNrX2NvcHkoYXJncywwLGZsYWdzKTsKKyAgZWxzZQorICAgIF9jcF9hc2tfY29weShhcmdzLDEsZmxhZ3MpOworICByZXR1cm4gMTsKK30KKworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBSTURJUiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjCisKKworLy8KKy8vIF9ybWRpcjogVmVyemVpY2huaXMgbG9lc2NoZW4KKy8vIGNtZGxpbmU6IEtvbW1hbmRvemVpbGVuYXJndW1lbnRlCisvLworCisKKyNpZiBfX1ZFUlNJT05fXyA8ICIzLjIuOSIKKworcHJpdmF0ZSBpbnQgX2Rpcl9maWx0ZXIobWl4ZWQgYXJnKQoreworICByZXR1cm4gKGFyZ1tGSUxFU0laRV09PS0yKTsKK30KKworI2VuZGlmCisKK3N0YXRpYyBpbnQgX3JtZGlyKHN0cmluZyBjbWRsaW5lKQoreworICBzdHJpbmcgZGVzdCx0bXA7CisgIGludCBmbGFnczsKKyAgbWl4ZWQgKmFyZ3M7CisgIAorICBjbWRsaW5lPV91bnBhcnNlZF9hcmdzKCk7CisgIGFyZ3M9cGFyc2VhcmdzKGNtZGxpbmUsJmZsYWdzLFJNRElSX09QVFMsMSk7CisgIGlmIChmbGFncz09LTF8fCFzaXplb2YoYXJncykpCisgICAgcmV0dXJuIFVTQUdFKCJybWRpciBbLSIgUk1ESVJfT1BUUyAiXSA8VmVyemVpY2huaXM+Iik7CisgIGlmIChzaXplb2YoYXJncyk+MSkKKyAgICByZXR1cm4KKyAgICBub3RpZnlfZmFpbCgiTWl0ICdybWRpcicga2FubiBudXIgamV3ZWlscyBFSU4gVmVyemVpY2huaXMgZ2Vsb2VzY2h0ICIKKyAgICAgICAgICJ3ZXJkZW4uXG5EZXIgQmVmZWhsICdybScgYmlldGV0IGVyd2VpdGVydGUgTW9lZ2xpY2hrZWl0ZW4uXG4iKSwwOworICBkZXN0PWFyZ3NbMF07CisgIGlmIChkZXN0IT0iLyIpCisgIHsKKyAgICBhcmdzPWZpbGVfbGlzdCgoe2Rlc3R9KSxNT0RFX1JNRElSLDAsIi8iKTsKKyNpZiBfX1ZFUlNJT05fXyA8ICIzLjIuOSIKKyAgICBhcmdzPWZpbHRlcihhcmdzLCMnX2Rpcl9maWx0ZXIpOworI2Vsc2UKKyAgICBhcmdzPWZpbHRlcihhcmdzLCg6ICgkMVtGSUxFU0laRV09PS0yKSA6KSk7CisjZW5kaWYKKyAgICBpZiAoIXNpemVvZihhcmdzKSkKKyAgICAgIHJldHVybiBub3RpZnlfZmFpbCgKKyAgICAgICAgc3ByaW50Zigicm1kaXI6ICVzOiBLZWluIHNvbGNoZXMgVmVyemVpY2huaXMgZ2VmdW5kZW4uXG4iLGRlc3QpKSwwOworICAgIGlmIChzaXplb2YoYXJncyk+MSkKKyAgICAgIHJldHVybiBub3RpZnlfZmFpbCgKKyAgICAgICAgICAgICAgICBzcHJpbnRmKCJybWRpcjogJXM6IE1hc2tlIGlzdCBuaWNodCBlaW5kZXV0aWcuXG4iLGRlc3QpKSwwOworICAgIGRlc3Q9YXJnc1swXVtGVUxMTkFNRV07CisgICAgaWYgKCFNQVlfV1JJVEUoZGVzdCkpIHJldHVybiBFUlJPUihOT19XUklURSxkZXN0LDEpOworICAgIGlmICghcm1kaXIoZGVzdCkpCisgICAgeworICAgICAgaWYgKHNpemVvZigoZ2V0X2RpcihkZXN0KyIvKiIpfHwoe30pKS0oeyIuIiwiLi4ifSkpKQorICAgICAgICBwcmludGYoInJtZGlyOiAlczogVmVyemVpY2huaXMgaXN0IG5pY2h0IGxlZXIuXG4iLGRlc3QpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaWYgKGZsYWdzJiZSTURJUl9WKSBwcmludGYoRklMRV9ERUxFVEVELGRlc3QpOworICAgIH0KKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gRVJST1IoTk9fREVMRVRFLGRlc3QsMSk7Cit9CisKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgTUtESVIgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIworCisKKy8vCisvLyBfbWtkaXI6IFZlcnplaWNobmlzIGVyc3RlbGxlbgorLy8gY21kbGluZTogS29tbWFuZG96ZWlsZW5hcmd1bWVudGUKKy8vCisKK3N0YXRpYyBpbnQgX21rZGlyKHN0cmluZyBjbWRsaW5lKQoreworICBzdHJpbmcgZGVzdCx0bXA7CisgIGludCBmbGFncyxpOworICBzdHJpbmcgKmFyZ3M7CisgIAorICBjbWRsaW5lPV91bnBhcnNlZF9hcmdzKCk7CisgIGFyZ3M9cGFyc2VhcmdzKGNtZGxpbmUsJmZsYWdzLE1LRElSX09QVFMsMSk7CisgIGlmIChmbGFncz09LTEpIHJldHVybiAwOworICBpZiAoIXNpemVvZihhcmdzKSkKKyAgICByZXR1cm4gVVNBR0UoIm1rZGlyIFstIiBNS0RJUl9PUFRTICJdIDxWZXJ6ZWljaG5pcz4iKTsKKyAgaWYgKHNpemVvZihhcmdzKT4xKQorICAgIHJldHVybiBub3RpZnlfZmFpbCgiTWl0ICdta2Rpcicga2FubiBudXIgamV3ZWlscyBFSU4gVmVyemVpY2huaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAiZXJzdGVsbHQgd2VyZGVuLlxuIiksMDsKKyAgZGVzdD1hcmdzWzBdOworICAKKyAgaWYgKChpPWZpbGVfc2l6ZShpbXBsb2RlKChhcmdzPWV4cGxvZGUoZGVzdCwiLyIpKVswLi48Ml0sIi8iKSkpPT1GU0laRV9ESVIpCisgIHsKKyAgICBpZiAoIW1rZGlyKGRlc3QpKSByZXR1cm4gRVJST1IoTk9fQ1JFQVRFX0RJUixkZXN0LDEpOworICAgIGlmIChmbGFncyZNS0RJUl9WKSBwcmludGYoRElSX0NSRUFURUQsZGVzdCwxKTsKKyAgICBwcmludGYoIm1rZGlyOiBhYmdlc2NobG9zc2VuLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgCisgIGlmIChpPT1GU0laRV9OT0ZJTEUpCisgIHsKKyAgICBpZiAoZmxhZ3MmTUtESVJfUikKKyAgICB7CisgICAgICBpZiAobWtkaXJwKGRlc3QpICE9IDEpCisgICAgICAgIHJldHVybiBFUlJPUihOT19DUkVBVEVfRElSLGRlc3QsMSk7CisgICAgICBpZiAoZmxhZ3MmTUtESVJfVikKKyAgICAgICAgcHJpbnRmKERJUl9DUkVBVEVELGltcGxvZGUoYXJnc1swLi5pXSwiLyIpKTsKKyAgICAgIHByaW50ZigibWtkaXI6IGFiZ2VzY2hsb3NzZW4uXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gRVJST1IoRE9FU05UX0VYSVNULGltcGxvZGUoYXJnc1swLi48Ml0sIi8iKSwxKTsKKyAgfQorICByZXR1cm4gRVJST1IoQUxSRUFEWV9FWElTVFMsZGVzdCwxKTsKK30KKworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFJNICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMKKworcHJpdmF0ZSB2b2lkIF9ybV9hc2tfZGVsZXRlKG1peGVkICpmaWxlZGF0YSwgaW50IGZsYWdzKTsKKworc3RhdGljIHZvaWQgX3JtX2Fza19kZWxldGUyKHN0cmluZyBpbnB1dCxtaXhlZCAqZmlsZWRhdGEsaW50IGZsYWdzKQoreworICBpbnQgaTsKKyAgaWYgKCFzaXplb2YoaW5wdXQpKSBpbnB1dD0iICI7CisgIGlucHV0PWxvd2VyX2Nhc2UoaW5wdXQpOworICBzd2l0Y2goaW5wdXRbMF0pCisgIHsKKyAgICBjYXNlICdxJzoKKyAgICAgIHByaW50ZigiTG9lc2NoZW4gYWJnZWJyb2NoZW4hXG4iKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlICd5JzoKKyAgICBjYXNlICdqJzoKKyAgICAgIGlmIChmaWxlZGF0YVswXVtGSUxFU0laRV09PS0yKQorICAgICAgeworICAgICAgICBpZiAoaT1maWxlZGF0YVswXVtTVUJESVJTSVpFXSkgLy8gRGlyLUVpbnRyYWcgbmFjaCBoaW50ZW4gc2NoaWViZW4KKyAgICAgICAgeworICAgICAgICAgIG1peGVkIHRlbXA7CisgICAgICAgICAgaW50IGo7CisgICAgICAgICAgdGVtcD1maWxlZGF0YVswXTsKKyAgICAgICAgICB0ZW1wW1NVQkRJUlNJWkVdPTA7CisgICAgICAgICAgZm9yKGo9MDtqPGk7aisrKSBmaWxlZGF0YVtqXT1maWxlZGF0YVtqKzFdOworICAgICAgICAgIGZpbGVkYXRhW2pdPXRlbXA7CisgICAgICAgICAgX3JtX2Fza19kZWxldGUoZmlsZWRhdGEsZmxhZ3MpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXJtZGlyKGZpbGVkYXRhWzBdW0ZVTExOQU1FXSkpCisgICAgICAgICAgcHJpbnRmKE5PX0RFTEVURSxmaWxlZGF0YVswXVtGVUxMTkFNRV0pOworICAgICAgICBlbHNlIGlmIChmbGFncyZSTV9WKSBwcmludGYoRklMRV9ERUxFVEVELGZpbGVkYXRhWzBdW0ZVTExOQU1FXSk7CisgICAgICB9CisgICAgICBlbHNlIC8vIERhdGVpIGV4aXN0aWVydAorICAgICAgeworICAgICAgICBpZiAoIXJtKGZpbGVkYXRhWzBdW0ZVTExOQU1FXSkpCisgICAgICAgICAgcHJpbnRmKERFU1RfTk9fREVMRVRFICJVZWJlcmdlaGUgRGF0ZWkuLi5cbiIsCisgICAgICAgICAgICAgICAgIGZpbGVkYXRhWzBdW0ZVTExOQU1FXSk7CisgICAgICAgIGVsc2UgaWYgKGZsYWdzJlJNX1YpIHByaW50ZihGSUxFX0RFTEVURUQsZmlsZWRhdGFbMF1bRlVMTE5BTUVdKTsKKyAgICAgICAgCisgICAgICB9CisgICAgY2FzZSAnbic6CisgICAgICBfcm1fYXNrX2RlbGV0ZShmaWxlZGF0YVsxK2ZpbGVkYXRhWzBdW1NVQkRJUlNJWkVdLi5dLGZsYWdzKTsKKyAgICAgIHJldHVybjsKKyAgICBkZWZhdWx0OgorICAgICAgcHJpbnRmKCJLb21tYW5kbyBuaWNodCB2ZXJzdGFuZGVuLlxuIik7CisgICAgICBfcm1fYXNrX2RlbGV0ZShmaWxlZGF0YSxmbGFncyk7CisgICAgICByZXR1cm47CisgIH0KKyAgcmV0dXJuOworfQorCitwcml2YXRlIHZvaWQgX3JtX2Fza19kZWxldGUobWl4ZWQgKmZpbGVkYXRhLCBpbnQgZmxhZ3MpCit7CisgIGludCBpOworICBtaXhlZCB0ZW1wOworICBpZiAoIXNpemVvZihmaWxlZGF0YSkpCisgIHsKKyAgICBwcmludGYoInJtOiBhYmdlc2NobG9zc2VuLlxuIik7CisgICAgcmV0dXJuOworICB9CisgIHN3aXRjaChmaWxlZGF0YVswXVtGSUxFU0laRV0pCisgIHsKKyAgICBjYXNlIC0xOgorICAgICAgaWYgKGZsYWdzJlJNX1YpIHByaW50ZihET0VTTlRfRVhJU1QsZmlsZWRhdGFbMF1bRlVMTE5BTUVdKTsKKyAgICAgIF9ybV9hc2tfZGVsZXRlKGZpbGVkYXRhWzEuLl0sZmxhZ3MpOworICAgICAgcmV0dXJuOworICAgIGNhc2UgLTI6CisgICAgICBpZiAoaT1maWxlZGF0YVswXVtTVUJESVJTSVpFXSkKKyAgICAgICAgcHJpbnRmKCJJbnMgVmVyemVpY2huaXMgJyVzJyBoaW5hYnN0ZWlnZW4/XG4iLAorICAgICAgICAgIGZpbGVkYXRhWzBdW0ZVTExOQU1FXSk7CisgICAgICBlbHNlCisgICAgICAgIHByaW50ZigiVmVyemVpY2huaXMgJyVzJyBsb2VzY2hlbj9cbiIsCisgICAgICAgICAgICAgICBmaWxlZGF0YVswXVtGVUxMTkFNRV0pOworICAgICAgaW5wdXRfdG8oIl9ybV9hc2tfZGVsZXRlMiIsSU5QVVRfUFJPTVBULCAiKGosbixxKSAiLAorICAgICAgICAgIGZpbGVkYXRhLGZsYWdzKTsKKyAgICAgIHJldHVybjsKKyAgICBkZWZhdWx0OgorICAgICAgcHJpbnRmKCInJXMnIGxvZXNjaGVuPyAoaixuLHEpXG4iLAorICAgICAgICAgZmlsZWRhdGFbMF1bRlVMTE5BTUVdKTsKKyAgICAgIGlucHV0X3RvKCJfcm1fYXNrX2RlbGV0ZTIiLElOUFVUX1BST01QVCwgIihqLG4scSkgIiwKKyAgICAgICAgICBmaWxlZGF0YSxmbGFncyk7CisgICAgICByZXR1cm47CisgIH0KK30KKworCitwcml2YXRlIHZvaWQgcm1fZmlsZShtaXhlZCBmaWxlZGF0YSwgbWl4ZWQgbm90dXNlZCwgaW50IGZsYWdzKQoreworICBzdHJpbmcgZGVzdDsKKyAgZGVzdD1maWxlZGF0YVtGVUxMTkFNRV07CisgIGlmICghTUFZX1dSSVRFKGRlc3QpKQorICB7CisgICAgcHJpbnRmKE5PX1dSSVRFLGRlc3QpOworICAgIHJldHVybjsKKyAgfQorICBzd2l0Y2goZmlsZWRhdGFbRklMRVNJWkVdKQorICB7CisgICAgY2FzZSAtMToKKyAgICAgIGlmIChmbGFncyZSTV9WKSBwcmludGYoRE9FU05UX0VYSVNULGRlc3QpOworICAgICAgcmV0dXJuOworICAgIGNhc2UgLTI6CisgICAgICBpZiAoIXJtZGlyKGRlc3QpKSBwcmludGYoREVTVF9OT19ERUxFVEUsZGVzdCk7CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGlmIChmbGFncyZSTV9WKSBwcmludGYoRklMRV9ERUxFVEVELGRlc3QpOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIGRlZmF1bHQ6CisgICAgICBpZiAoIXJtKGRlc3QpKSBwcmludGYoREVTVF9OT19ERUxFVEUsZGVzdCk7CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGlmIChmbGFncyZSTV9WKSBwcmludGYoRklMRV9ERUxFVEVELGRlc3QpOworICAgICAgfQorICAgICAgcmV0dXJuOworICB9Cit9CisKK3N0YXRpYyBpbnQgX3JtKHN0cmluZyBjbWRsaW5lKQoreworICBtaXhlZCAqYXJncywqYXJnczI7CisgIGludCBmbGFncyxpOworICBzdHJpbmcgbWFzazsKKyAgCisgIGNtZGxpbmU9X3VucGFyc2VkX2FyZ3MoKTsKKyAgYXJncz1wYXJzZWFyZ3MoY21kbGluZSwmZmxhZ3MsUk1fT1BUUywwKTsKKyAgaWYgKGZsYWdzPT0tMXx8IXNpemVvZihhcmdzKSkKKyAgICByZXR1cm4gVVNBR0UoInJtIFstIiBSTV9PUFRTCisgICAgICAgICAgICAgICAgICJdIDxkYXRlaS92ZXJ6PiBbPGRhdGVpMi92ZXJ6Mj4gLi4uIF0gWzxtYXNrZT5dIik7CisgIGlmIChmbGFncyZSTV9NKQorICB7CisgICAgbWFzaz1hcmdzWzwxXTsKKyAgICBhcmdzPWFyZ3NbMC4uPDJdOworICB9CisgIGFyZ3M9bWFwKGFyZ3MsIyd0b19maWxlbmFtZSktKHswfSk7CisgIGFyZ3M9ZmlsZV9saXN0KGFyZ3MsTU9ERV9STSwoZmxhZ3MmUk1fUiksIi8iLG1hc2spOworICBpZiAoIShpPXNpemVvZihhcmdzKSkpCisgICAgcmV0dXJuIHByaW50ZigiS2VpbmUgcGFzc2VuZGUgRGF0ZWkgZ2VmdW5kZW4uXG4iKSwxOworICBpZiAoIShmbGFncyZSTV9JKSkKKyAgeworICAgIGlmIChpPjEpIC8vIFVtZHJlaGVuCisgICAgeworICAgICAgbWl4ZWQgdGVtcDsKKyAgICAgIGk+Pj0xOworICAgICAgd2hpbGUoaSkKKyAgICAgIHsKKyAgICAgICAgdGVtcD1hcmdzWzwoaS0tKV07CisgICAgICAgIGFyZ3NbPChpKzEpXT1hcmdzW2ldOworICAgICAgICBhcmdzW2ldPXRlbXA7CisgICAgICB9CisgICAgfQorICAgIGFzeW5jaHJvbihhcmdzLCMncm1fZmlsZSxhcmdzLGZsYWdzLDApOworICAgIHJldHVybiAxOworICB9CisgIF9ybV9hc2tfZGVsZXRlKGFyZ3MsZmxhZ3MpOworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL3N0ZC9zaGVsbHMvbWFnaWVyL2ZpbGV2aWV3LmMgYi9zdGQvc2hlbGxzL21hZ2llci9maWxldmlldy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMWRlNWEKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvc2hlbGxzL21hZ2llci9maWxldmlldy5jCkBAIC0wLDAgKzEsNzI4IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gZmlsZXZpZXcuYworLy8KKy8vICRJZDogZmlsZXZpZXcuYyA5MTQyIDIwMTUtMDItMDQgMjI6MTc6MjlaIFplc3N0cmEgJAorI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworLy8jcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisKKyNpbmNsdWRlIDxhbnNpLmg+CisjaW5jbHVkZSA8cGxheWVyL2Jhc2UuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxzaGVsbHMuaD4KKyNpbmNsdWRlIDxkYWVtb24vbWFuZC5oPgorI2luY2x1ZGUgPHVkcC5oPgorI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDxtYWdpZXIuaD4KKyNpbmNsdWRlIDx0aGluZy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8cGxheWVyLmg+CisKK3ByaXZhdGUgbm9zYXZlIG1hcHBpbmcgY29sb3JzdHJpbmdzOworcHJpdmF0ZSBub3NhdmUgbWFwcGluZyBvbGRtYW5fcmVzdWx0OworCisvLyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBJTklUSUFMSVNJRVJVTkcgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIworCittaXhlZCBfcXVlcnlfbG9jYWxjbWRzKCkKK3sKKyAgcmV0dXJuICh7KHsibHMiLCJfbHMiLDAsTEVBUk5FUl9MVkx9KSwKKyAgICAgICAgICAgKHsibW9yZSIsIl9tb3JlIiwwLExFQVJORVJfTFZMfSksCisgICAgICAgICAgICh7ImNhdCIsIl9jYXQiLDAsTEVBUk5FUl9MVkx9KSwKKyAgICAgICAgICAgKHsiaGVhZCIsIl9jYXQiLDAsTEVBUk5FUl9MVkx9KSwKKyAgICAgICAgICAgKHsidGFpbCIsIl9jYXQiLDAsTEVBUk5FUl9MVkx9KSwKKyAgICAgICAgICAgKHsibWFuIiwiX21hbiIsMCxMRUFSTkVSX0xWTH0pLAorICAgICAgICAgICAoeyJybWFuIiwiX3JtYW4iLDAsTEVBUk5FUl9MVkx9KSwKKyAgICAgICAgICAgKHsic2hvd3Byb3BzIiwiX3Nob3dwcm9wcyIsMCxXSVpBUkRfTFZMfSksCisgICAgICAgICAgICh7ImdyZXAiLCJfZ3JlcCIsMCxMRUFSTkVSX0xWTH0pfSk7Cit9CisKKworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIExTICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMKKworLy8KKy8vIF9sczogRGVyIGxzLUJlZmVobDogVmVyemVpY2huaXNzZSB1bmQgRGF0ZWllbiBhbnplaWdlbgorLy8gY21kbGluZTogS29tbWFuZG96ZWlsZQorLy8KKworLy8KKy8vIEZ1bmt0aW9uZW4genVtIFNvcnRpZXJlbiB1bmQgZnVlciBmaWx0ZXJfbGRmaWVkL21hcF9sZGZpZWQKKy8vCisKKworcHJpdmF0ZSBzdHJpbmcgX2dldF9jb2xvcihzdHJpbmcgY29sb3IpCit7CisgIHJldHVybiBDT0xPUlNbbG93ZXJfY2FzZShjb2xvcildOworfQorCisKK3ByaXZhdGUgdm9pZCBTZXRDb2xvcnN0cmluZ3MoKQoreworICBzdHJpbmcgdG1wLHRlcm07CisgIG1hcHBpbmcgdmFyczsKKyAgdmFycz1RdWVyeVByb3AoUF9WQVJJQUJMRVMpOworICBjb2xvcnN0cmluZ3M9bV9hbGxvY2F0ZSgwLDIpOworICBzd2l0Y2godGVybT1RdWVyeVByb3AoUF9UVFkpKQorICB7CisgICAgY2FzZSAidnQxMDAiOgorICAgIGNhc2UgImFuc2kiOgorICAgICAgaWYoc3RyaW5ncCh2YXJzWyJMU19ESVIiXSkpCisgICAgICAgIHRtcD1pbXBsb2RlKG1hcChleHBsb2RlKHZhcnNbIkxTX0RJUiJdLCIrIiksIydfZ2V0X2NvbG9yKSwKKyAgICAgICAgICAgICAgICAgICAgIiIpOworICAgICAgZWxzZQorICAgICAgICB0bXAgPSAodGVybSA9PSAiYW5zaSIpID8gQU5TSV9CTFVFK0FOU0lfQk9MRDogQU5TSV9CT0xEOworICAgICAgY29sb3JzdHJpbmdzW0RJUl0gPSB0bXArIiVzIisodGVybSA9PSAidnQxMDAiPyIvIjoiIikrQU5TSV9OT1JNQUw7CisgICAgICBpZih0ZXJtID09ICJ2dDEwMCIpIGNvbG9yc3RyaW5nc1tESVIsIDFdID0gMTsKKyAgICAgIGlmKHN0cmluZ3AodmFyc1siTFNfT0JKIl0pKQorICAgICAgICB0bXA9aW1wbG9kZShtYXAoZXhwbG9kZSh2YXJzWyJMU19PQkoiXSwiKyIpLCMnX2dldF9jb2xvciksCisgICAgICAgICAgICAgICAgICAgICIiKTsKKyAgICAgIGVsc2UKKyAgICAgICAgdG1wID0gKHRlcm0gPT0gImFuc2kiKSA/IEFOU0lfUkVEIDogQU5TSV9JTlZFUlM7CisgICAgICBjb2xvcnN0cmluZ3NbT0JKXSA9IHRtcCsiJXMiK0FOU0lfTk9STUFMOworICAgICAgaWYoc3RyaW5ncCh2YXJzWyJMU19WQyJdKSkKKyAgICAgICAgdG1wPWltcGxvZGUobWFwKGV4cGxvZGUodmFyc1siTFNfVkMiXSwiKyIpLCMnX2dldF9jb2xvciksCisgICAgICAgICAgICAgICAgICAgICIiKTsKKyAgICAgIGVsc2UKKyAgICAgICAgdG1wID0gKHRlcm0gPT0gImFuc2kiKSA/IEFOU0lfUFVSUExFIDogQU5TSV9JTlZFUlM7CisgICAgICBjb2xvcnN0cmluZ3NbVkNdID0gdG1wKyIlcyIrQU5TSV9OT1JNQUw7CisgICAgICBicmVhazsKKyAgICBjYXNlICJkdW1iIjoKKyAgICAgIGNvbG9yc3RyaW5nc1tESVJdID0gIiVzLyI7IGNvbG9yc3RyaW5nc1tESVIsIDFdID0gMTsKKyAgICAgIGNvbG9yc3RyaW5nc1tPQkpdID0gIiVzKiI7IGNvbG9yc3RyaW5nc1tPQkosIDFdID0gMTsKKyAgICAgIGNvbG9yc3RyaW5nc1tWQ10gID0gIiVzKiI7IGNvbG9yc3RyaW5nc1tWQyAsIDFdID0gMTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBjb2xvcnN0cmluZ3NbRElSXSA9ICIlcyI7CisgICAgICBjb2xvcnN0cmluZ3NbT0JKXSA9ICIlcyI7CisgICAgICBjb2xvcnN0cmluZ3NbVkNdICA9ICIlcyI7CisgIH0KKyAgcmV0dXJuOworfQorCisKK3ByaXZhdGUgc3RyaW5nIF9sc19vdXRwdXRfc2hvcnQobWl4ZWQgZmlsZWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhsZW4saW50IGNvdW50ZXIsaW50IG1heGNvdW50KQoreworICBzdHJpbmcgdG1wOworICB0bXA9ZmlsZWRhdGFbQkFTRU5BTUVdOworICBtYXhsZW4tPXNpemVvZih0bXApOworICBzd2l0Y2goZmlsZWRhdGFbRklMRVNJWkVdKQorICB7CisgICAgY2FzZSAtMjogdG1wPXNwcmludGYoY29sb3JzdHJpbmdzW0RJUl0sdG1wKTsKKyAgICAgICAgICAgICBtYXhsZW4tPWNvbG9yc3RyaW5nc1tESVIsMV07IGJyZWFrOworICAgIGNhc2UgLTE6IHRtcD1zcHJpbnRmKGNvbG9yc3RyaW5nc1tWQ10sdG1wKTsKKyAgICAgICAgICAgICBtYXhsZW4tPWNvbG9yc3RyaW5nc1tWQywxXTsgYnJlYWs7CisgICAgZGVmYXVsdDogaWYgKGZpbmRfb2JqZWN0KGZpbGVkYXRhW0ZVTExOQU1FXSkpCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgbWF4bGVuLT1jb2xvcnN0cmluZ3NbT0JKLDFdOworICAgICAgICAgICAgICAgdG1wPXNwcmludGYoY29sb3JzdHJpbmdzW09CSl0sdG1wKTsgYnJlYWs7CisgICAgICAgICAgICAgfQorICB9CisgIGlmICghbWF4Y291bnQpIHJldHVybiB0bXArIlxuIjsKKyAgcmV0dXJuIHNwcmludGYoIiUtKnMlcyIsKG1heGxlbitzaXplb2YodG1wKSksdG1wLAorCSgoY291bnRlcisrKT09bWF4Y291bnQ/KGNvdW50ZXI9MCwiXG4iKToiICAiKSk7Cit9CisKK3ByaXZhdGUgaW50IF9sc19tYXhsZW4obWl4ZWQgZmlsZWRhdGEsaW50IGZsYWdzLGludCBtYXhsZW4pCit7CisgIHN0cmluZyBiYXNlOworICBpbnQgc2l6ZTsKKyAgYmFzZT1maWxlZGF0YVtCQVNFTkFNRV07CisgIGlmICghKGZsYWdzJkxTX0EpJiYoYmFzZVswXT09Jy4nKSkgcmV0dXJuIDA7CisjaWYgX19WRVJTSU9OX18gPCAiMy4yLjkiCisgIGlmIChzaXplb2YoYmFzZSk+bWF4bGVuKSBtYXhsZW49c2l6ZW9mKGJhc2UpOworI2Vsc2UKKyAgbWF4bGVuPW1heChtYXhsZW4sc2l6ZW9mKGJhc2UpKTsKKyNlbmRpZgorICByZXR1cm4gMTsKK30KKworcHJpdmF0ZSBzdHJpbmcgX2xzX291dHB1dF9sb25nKG1peGVkIGZpbGVkYXRhLCBpbnQgZmxhZ3MsY2xvc3VyZSB2YWxpZF9yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3N1cmUgdmFsaWRfd3JpdGUsY2xvc3VyZSBjcmVhdG9yX2ZpbGUpCit7CisgIHN0cmluZyAqdG1wLGZ1bGwsYmFzZSxwYXRoLGRhdGUsY3JlYXRvcixncm91cDsKKyAgaW50IHNpemUsZGlyLGZ0aW1lOworICBvYmplY3Qgb2I7CisgIAorICBiYXNlPWZpbGVkYXRhW0JBU0VOQU1FXTsKKyAgaWYgKCEoc2l6ZW9mKGJhc2UpKXx8KCghKGZsYWdzJkxTX0EpKSYmKGJhc2VbMF09PScuJykpKQorICAgIHJldHVybiAwOworICBzaXplPWZpbGVkYXRhW0ZJTEVTSVpFXTsKKyAgcGF0aD1maWxlZGF0YVtQQVRITkFNRV07CisgIHRtcD0oc3RyaW5nICopY2FsbF9vdGhlcihtYXN0ZXIoKSwiZnVsbF9wYXRoX2FycmF5IiwKKyAgICAgICAgICAgICAgICAgZmlsZWRhdGFbRlVMTE5BTUVdLGdldHVpZCgpKTsKKyAgZnVsbD1zcHJpbnRmKCIvJXMiLGltcGxvZGUodG1wLCIvIikpOworICBkaXI9KHNpemU9PS0yKTsKKyAgb2I9ZmluZF9vYmplY3QoZnVsbCk7CisgIGZ0aW1lPWZpbGVkYXRhW0ZJTEVEQVRFXTsKKyAgZGF0ZT1kdGltZShmdGltZSk7CisgIGRhdGU9c3ByaW50ZigiJXMgJXMgJXMiLGRhdGVbOS4uMTFdLGRhdGVbNS4uNl0sCisgICAgICAgICAgICAgICAoKHRpbWUoKS1mdGltZSk8MzE1MzYwMDA/ZGF0ZVsxOS4uMjNdOigiICIrZGF0ZVsxMy4uMTZdKSkpOworICBjcmVhdG9yPSIiOworICBncm91cD0iIjsKKyAgaWYgKGZsYWdzJkxTX1UpCisgIHsKKyAgICBjcmVhdG9yPShzdHJpbmcpY2FsbF9vdGhlcihtYXN0ZXIoKSwiY3JlYXRvcl9maWxlIixmdWxsKTsKKyAgICBzd2l0Y2goY3JlYXRvcikKKyAgICB7CisgICAgICBjYXNlIFJPT1RJRDogY3JlYXRvcj0icm9vdCI7IGJyZWFrOworICAgICAgY2FzZSBCQUNLQk9ORUlEOiBjcmVhdG9yPSJkYWVtb24iOyBicmVhazsKKyAgICAgIGRlZmF1bHQ6IGlmKCFjcmVhdG9yKSBjcmVhdG9yPSJub25lIjsgYnJlYWs7CisgICAgfQorICB9CisgIGlmIChmbGFncyZMU19HKQorICB7CisgICAgaWYgKHNpemVvZih0bXApKQorICAgIHsKKyAgICAgIHN3aXRjaCh0bXBbMF0pCisgICAgICB7CisgICAgICBjYXNlIFdJWkFSRERJUjogZ3JvdXA9Im1hZ2llciI7IGJyZWFrOworICAgICAgY2FzZSAibmV3cyI6IGdyb3VwPSJuZXdzIjsgYnJlYWs7CisgICAgICBjYXNlICJtYWlsIjogZ3JvdXA9Im1haWwiOyBicmVhazsKKyAgICAgIGNhc2UgIm9wZW4iOiBncm91cD0icHVibGljIjsgYnJlYWs7CisgICAgICBjYXNlICJwIjogZ3JvdXA9InByb2plY3QiOyBicmVhazsKKyAgICAgIGNhc2UgRE9NQUlORElSOiBpZiAoc2l6ZW9mKHRtcCk+MSkgeyBncm91cD10bXBbMV07IGJyZWFrOyB9CisgICAgICBkZWZhdWx0OiBncm91cD0ibXVkIjsgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgZ3JvdXA9Im11ZCI7CisgIH0KKyAgaWYgKGRpcikgYmFzZT1zcHJpbnRmKGNvbG9yc3RyaW5nc1tESVJdLGJhc2UpOworICBlbHNlCisgIHsKKyAgICBpZiAob2IpCisgICAgeworICAgICAgaWYgKHNpemU9PS0xKQorICAgICAgICBiYXNlPXNwcmludGYoY29sb3JzdHJpbmdzW1ZDXSxiYXNlKTsKKyAgICAgIGVsc2UKKyAgICAgICAgYmFzZT1zcHJpbnRmKGNvbG9yc3RyaW5nc1tPQkpdLGJhc2UpOworICAgIH0KKyAgfQorICByZXR1cm4gc3ByaW50ZigoIiVjJWMlYyVjICUzZCIrKChmbGFncyZMU19VKT8iICUtMjQuMjRzIjoiJS0wLjFzIikrCisgICAgICAgICAgICAgICAgICgoZmxhZ3MmTFNfRyk/IiAlLTguOHMiOiIlMC4xcyIpKyIgJThzICVzICVzXG4iKSwKKyAgICAgICAgICAgICAgICAgKGRpcj8nZCc6Jy0nKSwKKyAgICAgICAgICAgICAgICAgKCFmdW5jYWxsKHZhbGlkX3JlYWQsZnVsbCxnZXR1aWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkX2ZpbGUiLHRoaXNfb2JqZWN0KCkpPyctJzoncicpLAorICAgICAgICAgICAgICAgICAoIWZ1bmNhbGwodmFsaWRfd3JpdGUsZnVsbCxnZXR1aWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3cml0ZV9maWxlIix0aGlzX29iamVjdCgpKT8nLSc6J3cnKSwKKyAgICAgICAgICAgICAgICAgKG9iPyd4JzonLScpLAorICAgICAgICAgICAgICAgICAoZGlyPyhzaXplb2YoKGdldF9kaXIoZnVsbCsiLyoiKXx8KHt9KSktKHsiLiIsIi4uIn0pKSk6MCksCisgICAgICAgICAgICAgICAgIGNyZWF0b3IsZ3JvdXAsKGRpcj8iLSI6c2l6ZT09LTE/Ijx2Yz4iOnRvX3N0cmluZyhzaXplKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlLGJhc2UpOworfQorCisKK3N0YXRpYyBpbnQgX2xzKHN0cmluZyBjbWRsaW5lKQoreworICBpbnQgZmxhZ3MsY21wLGksYXJnX3NpemUsc2l6ZTsKKyAgaW50IG1heGxlbixjb3VudGVyLG1heGNvdW50OworICBzdHJpbmcgKmFyZ3Msb3V0cHV0OworICBtaXhlZCAqdG1wOworICBjbG9zdXJlIG91dHB1dF9mdW4sdl9yZWFkLHZfd3JpdGUsY3JlYXRvcixzb3J0X2Z1bjsKKyAgCisgIGNtZGxpbmU9X3VucGFyc2VkX2FyZ3MoKXx8IiI7CisgIGFyZ3M9cGFyc2VhcmdzKGNtZGxpbmUsJmZsYWdzLExTX09QVFMsMSk7CisgIGlmIChmbGFncz09LTEpCisgICAgcmV0dXJuIFVTQUdFKCJscyBbLSIgTFNfT1BUUyAiXSBbPFZlcnplaWNobmlzPl0gWzxWZXJ6ZWljaG5pczI+IC4uXSIpOworICBTZXRDb2xvcnN0cmluZ3MoKTsKKyAgb3V0cHV0PSIiOworICBpZiAoIXNpemVvZihhcmdzKSkgYXJncz0oeyBRdWVyeVByb3AoUF9DVVJSRU5URElSKSB9KTsKKyAgaWYgKCFzaXplb2YoYXJncz1maWxlX2xpc3QoYXJncyxNT0RFX0xTQSwwLCIvIikpKQorICAgIHJldHVybiBub3RpZnlfZmFpbCgibHM6IEtlaW5lIHBhc3NlbmRlbiBWZXJ6ZWljaG5pc3NlIGdlZnVuZGVuLlxuIiksIDA7CisvLyBGaWxlcyBzb3J0aWVyZW4gZGllIGVyc3RlCisgIGlmIChmbGFncyZMU19UKSBjbXA9RklMRURBVEU7CisgIGVsc2UgaWYgKGZsYWdzJkxTX1MpIGNtcD1GSUxFU0laRTsKKyAgZWxzZSBjbXA9QkFTRU5BTUU7IC8vID0wIDotKQorICBzb3J0X2Z1bj1sYW1iZGEoKHsgJ2EsJ2IgfSksKHsKKyAgICAoKCFjbXAmJiEoZmxhZ3MmTFNfUikpfHwoY21wJiYoZmxhZ3MmTFNfUikpPyMnPjojJzwpLAorICAgICh7IydbLCdhLGNtcH0pLCh7IydbLCdiLGNtcH0pfSkpOworICBhcmdzPXNvcnRfYXJyYXkoYXJncyxzb3J0X2Z1bik7CisvLyBBdXNnYWJlZm9ybWF0IGJlc3RpbW1lbgorICBpZiAoZmxhZ3MmTFNfTCkKKyAgeworICAgIHZfcmVhZD1WQUxJRF9SRUFEX0NMOworICAgIHZfd3JpdGU9VkFMSURfV1JJVEVfQ0w7CisgICAgY3JlYXRvcj1DUkVBVE9SX0NMOworICB9CisgIGFyZ19zaXplPXNpemVvZihhcmdzKTsKKyAgaWYgKGFyZ19zaXplPjF8fChhcmdfc2l6ZSYmYXJnc1swXVtGSUxFU0laRV0+PTApKQorICB7CisgICAgaWYgKGZsYWdzJkxTX0wpCisgICAgICB0bXA9bWFwKGFyZ3MsIydfbHNfb3V0cHV0X2xvbmcsZmxhZ3Msdl9yZWFkLAorICAgICAgICAgICAgICAgICAgICB2X3dyaXRlLGNyZWF0b3IpLSh7MH0pOworICAgIGVsc2UKKyAgICB7CisgICAgICBjb3VudGVyPTA7bWF4bGVuPTA7CisgICAgICB0bXA9ZmlsdGVyKGFyZ3MsIydfbHNfbWF4bGVuLGZsYWdzLCZtYXhsZW4pOworICAgICAgaWYgKG1heGxlbj43NikgbWF4bGVuPTc2OworICAgICAgbWF4Y291bnQ9KDc4LyhtYXhsZW4rMikpLTE7CisgICAgICB0bXA9bWFwKHRtcCwjJ19sc19vdXRwdXRfc2hvcnQsbWF4bGVuLCZjb3VudGVyLG1heGNvdW50KTsKKyAgICB9CisgICAgb3V0cHV0PXNwcmludGYoIlxuJWQgRGF0ZWllbi9VbnRlcnZlcnplaWNobmlzc2U6XG4lc1xuIiwKKyAgICAgICAgICAgICAgICAgICBzaXplb2YodG1wKSxpbXBsb2RlKHRtcCwiIikpOworICB9CisgIGZvcihpPTA7aTxhcmdfc2l6ZTtpKyspCisgIHsKKyAgICB0bXA9KHt9KTsKKyAgICBzaXplPWFyZ3NbaV1bRklMRVNJWkVdOworICAgIGlmIChzaXplPT0tMikKKyAgICB7CisgICAgICB0bXA9ZmlsZV9saXN0KCh7YXJnc1tpXVtGVUxMTkFNRV0rIi8qIn0pLE1PREVfTFNCLDAsIi8iKTsKKyAgICAgIHRtcD1zb3J0X2FycmF5KHRtcCxzb3J0X2Z1bik7CisgICAgICBpZiAoZmxhZ3MmTFNfTCkKKyAgICAgICAgdG1wPW1hcCh0bXAsIydfbHNfb3V0cHV0X2xvbmcsZmxhZ3Msdl9yZWFkLAorICAgICAgICAgICAgICAgICAgICAgIHZfd3JpdGUsY3JlYXRvciktKHswfSk7CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGNvdW50ZXI9MDttYXhsZW49MDsKKyAgICAgICAgdG1wPWZpbHRlcih0bXAsIydfbHNfbWF4bGVuLGZsYWdzLCZtYXhsZW4pOworICAgICAgICBtYXhjb3VudD0oNzgvKG1heGxlbisyKSk7CisgICAgICAgIGlmIChtYXhjb3VudCkgbWF4Y291bnQtLTsKKyAgICAgICAgdG1wPW1hcCh0bXAsIydfbHNfb3V0cHV0X3Nob3J0LG1heGxlbiwmY291bnRlcixtYXhjb3VudCk7CisgICAgICB9CisgICAgICBpZiAoc2l6ZW9mKHRtcCkpCisgICAgICB7CisgICAgICAgIG91dHB1dCs9c3ByaW50ZigiXG4lczogVmVyemVpY2huaXMsICVkIERhdGVpZW4vVW50ZXJ2ZXJ6ZWljaG5pc3NlOlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBhcmdzW2ldW0ZVTExOQU1FXSxzaXplb2YodG1wKSk7CisgICAgICAgIG91dHB1dCs9KGltcGxvZGUodG1wLCIiKSsoKHN0cmluZykodG1wWzwxXVs8MS4uPDFdKT09IlxuIj8iIjoiXG4iKSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIG91dHB1dCs9c3ByaW50ZigiXG4lczogTGVlcmVzIFZlcnplaWNobmlzLlxuIixhcmdzW2ldW0ZVTExOQU1FXSk7CisgICAgICB9CisgICAgfQorICB9CisgIE1vcmUob3V0cHV0KTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBNT1JFICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjCisvLworLy8gX21vcmVfZmlsZTogTWVocmVyZSBGaWxlcyBoaW50ZXJlaW5hbmRlciBhdXNnZWJlbgorLy8KKworcHJpdmF0ZSB2b2lkIF9tb3JlX2ZpbGUoc3RyaW5nICphcmcpCit7CisgIGlmICghc2l6ZW9mKGFyZykpIHJldHVybjsKKyAgcHJpbnRmKCJtb3JlOiBOYWVjaHN0ZSBEYXRlaTogJXNcbiIsYXJnWzBdKTsKKyAgTW9yZShhcmdbMF0sMSwjJ19tb3JlX2ZpbGUsKHsgYXJnWzEuLl19KSk7CisgIHJldHVybjsKK30KKworCitwcml2YXRlIG1peGVkIF9zaXplX2ZpbHRlcihtaXhlZCAqYXJnKQoreworICBpZiAoYXJnW0ZJTEVTSVpFXT4wKSByZXR1cm4gYXJnW0ZVTExOQU1FXTsKKyAgaWYgKGFyZ1tGSUxFU0laRV09PTApCisgIHsKKyAgICBwcmludGYoIiVzOiAlczogTGVlcmUgRGF0ZWkuXG4iLHF1ZXJ5X3ZlcmIoKXx8Im1vcmUiLGFyZ1tGVUxMTkFNRV0pOworICAgIHJldHVybiAwOworICB9CisgIGlmIChhcmdbRklMRVNJWkVdPT0tMikKKyAgICBwcmludGYoIiVzOiAlcyBpc3QgZWluIFZlcnplaWNobmlzLlxuIixxdWVyeV92ZXJiKCl8fCJtb3JlIixhcmdbRlVMTE5BTUVdKTsKKyAgZWxzZQorICAgIHByaW50ZigiJXM6ICVzOiBEYXRlaSBleGlzdGllcnQgbmljaHQuXG4iLCBxdWVyeV92ZXJiKCl8fCJtb3JlIiwKKyAgICAgICAgICAgYXJnW0ZVTExOQU1FXSk7CisgIHJldHVybiAwOworfQorCisKKy8vCisvLyBfbW9yZTogRGF0ZWllbiBhbnplaWdlbgorLy8gY21kbGluZTogS29tbWFuZG96ZWlsZQorLy8KKworc3RhdGljIGludCBfbW9yZShzdHJpbmcgY21kbGluZSkKK3sKKyAgbWl4ZWQgKmFyZ3M7CisgIGludCBmbGFnczsKKyAgY21kbGluZT1fdW5wYXJzZWRfYXJncygpOworICBhcmdzPXBhcnNlYXJncyhjbWRsaW5lLCZmbGFncywiIiwxKTsKKyAgaWYgKGZsYWdzPT0tMXx8IXNpemVvZihhcmdzKSkgcmV0dXJuIFVTQUdFKCJtb3JlIDxkYXRlaT4gWzxkYXRlaTI+Li5dIik7CisgIGFyZ3M9ZmlsZV9saXN0KGFyZ3MsTU9ERV9NT1JFLDAsIi8iKTsKKyAgaWYgKCFzaXplb2YoYXJncykpCisgICAgcmV0dXJuIHByaW50ZigibW9yZTogJXM6IEtlaW5lIHBhc3NlbmRlIERhdGVpIGdlZnVuZGVuLlxuIixjbWRsaW5lKSwxOworICBhcmdzPW1hcChhcmdzLCMnX3NpemVfZmlsdGVyKS0oezB9KTsKKyAgaWYgKHNpemVvZihhcmdzKSkgX21vcmVfZmlsZShhcmdzKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgSEVBRCwgVEFJTCwgQ0FUICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjCisKK3N0YXRpYyBpbnQgX2NhdChzdHJpbmcgY21kbGluZSkKK3sKKyAgbWl4ZWQgKmFyZ3M7CisgIGludCBmbGFnczsKKyAgY21kbGluZT1fdW5wYXJzZWRfYXJncygpOworICBhcmdzPXBhcnNlYXJncyhjbWRsaW5lLCZmbGFncywiIiwxKTsKKyAgaWYoZmxhZ3M9PS0xfHwhc2l6ZW9mKGFyZ3MpKQorICAgIHJldHVybiBVU0FHRShxdWVyeV92ZXJiKCkrIiA8ZGF0ZWluYW1lPiBbPGRhdGVpMj4uLl0iKTsKKyAgYXJncz1maWxlX2xpc3QoYXJncyxNT0RFX0NBVCwwLCIvIik7CisgIGlmICghc2l6ZW9mKGFyZ3MpKQorICAgIHJldHVybiBwcmludGYoIiVzOiAlczogS2VpbmUgcGFzc2VuZGUgRGF0ZWkgZ2VmdW5kZW4uXG4iLHF1ZXJ5X3ZlcmIoKSwKKyAgICAgICAgICAgICAgICBjbWRsaW5lKSwxOworICBhcmdzPW1hcChhcmdzLCMnX3NpemVfZmlsdGVyKS0oezB9KTsKKyAgaWYgKCFzaXplb2YoYXJncykpIHJldHVybiAxOworICB3aGlsZShzaXplb2YoYXJncykpCisgIHsKKyAgICBzd2l0Y2gocXVlcnlfdmVyYigpKQorICAgIHsKKyAgICAgIGNhc2UgImNhdCI6CisgICAgICAgIGlmICghY2F0KGFyZ3NbMF0pKQorICAgICAgICAgIHByaW50ZigiY2F0OiAlcyBrb25udGUgbmljaHQgYW5nZXplaWd0IHdlcmRlbi5cbiIsYXJnc1swXSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAiaGVhZCI6CisgICAgICAgIGlmICghY2F0KGFyZ3NbMF0sMCwxMCkpCisgICAgICAgICAgcHJpbnRmKCJoZWFkOiAlcyBrb25udGUgbmljaHQgYW5nZXplaWd0IHdlcmRlbi5cbiIsYXJnc1swXSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAidGFpbCI6IHRhaWwoYXJnc1swXSk7IGJyZWFrOworICAgIH0KKyAgICBhcmdzPWFyZ3NbMS4uXTsKKyAgfQorICByZXR1cm4gMTsKK30KKworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgTUFOICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMKKworc3RhdGljIGludCBfbWFuKHN0cmluZyBjbWRsaW5lKQoreworICBtaXhlZCAqYXJnczsKKyAgaW50IGksIGZsYWdzOworICBzdHJpbmcgKnRtcCwgKnRtcDI7CisKKyAgY21kbGluZT1fdW5wYXJzZWRfYXJncygpOworICBhcmdzPXBhcnNlYXJncyhjbWRsaW5lLCZmbGFncyxNQU5fT1BUUywwKTsKKyAgCisgIGlmIChmbGFncz09LTEgfHwKKyAgICAgIChzaXplb2YoYXJncykhPTEgJiYKKyAgICAgICAoc2l6ZW9mKGFyZ3MpPDIgfHwgc2l6ZW9mKGFyZ3NbMV0pPjEgfHwgIShpPXRvX2ludChhcmdzWzFdKSkpKSkKKyAgICByZXR1cm4gVVNBR0UoIm1hbiBbLSIgTUFOX09QVFMgIl0gPGhpbGZlc2VpdGU+Iik7CisgIHRtcD1leHBsb2RlKGFyZ3NbMF0sIi8iKTsKKworICBpZiAob2xkbWFuX3Jlc3VsdCAmJiBzaXplb2YodG1wKT09MSAmJiBzaXplb2YoYXJncyk9PTEgJiYKKyAgICAgIHNpemVvZih0bXBbMF0pPT0xICYmIChpPXRvX2ludCh0bXBbMF0pKSAmJiBtZW1iZXIob2xkbWFuX3Jlc3VsdCxpKSkgeworICAgdG1wPSh7b2xkbWFuX3Jlc3VsdFtpLDBdLG9sZG1hbl9yZXN1bHRbaSwxXX0pOworICAgaT0wOworICB9CisgIGVsc2UgaWYgKCEoZmxhZ3MmKE1BTl9NfE1BTl9SKSkmJnNpemVvZih0bXApPjEpCisgIHsKKyAgICBpZiAoZmlsZV9zaXplKE1BTkRfRE9DRElSK2FyZ3NbMF0pPj0wKQorICAgICAgdG1wPSh7dG1wWzwxXSxhcmdzWzBdfSk7CisgICAgZWxzZQorICAgICAgdG1wPSh7fSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYgKGZsYWdzJk1BTl9SKQorICAgIHsKKyAgICAgIGZsYWdzJj0ofk1BTl9NKTsKKyAgICAgIGlmIChjYXRjaChyZWdleHAoKHsiIn0pLGFyZ3NbMF0pKXx8CisgICAgICAgICAgIXJlZ2V4cCgoeyIifSksYXJnc1swXSkpCisgICAgICAgIHJldHVybiBwcmludGYoIm1hbjogVW5ndWVsdGlnZXIgQXVzZHJ1Y2sgaW4gTWFza2UuXG4iKSwxOworICAgIH0KKyAgICB0bXA9KHN0cmluZyAqKWNhbGxfb3RoZXIoTUFORCwibG9jYXRlIixhcmdzWzBdLGZsYWdzJihNQU5fTXxNQU5fUikpOworICB9CisKKyAgb2xkbWFuX3Jlc3VsdD0obWFwcGluZykwOworICBpZihpICYmIHNpemVvZih0bXApPjIgJiYgc2l6ZW9mKHRtcCk+PShpPDwxKSkKKyAgICB0bXA9dG1wWygoaTw8MSktMikuLigoaTw8MSktMSldOworICBzd2l0Y2goc2l6ZW9mKHRtcCkpCisgIHsKKyAgICBjYXNlIDA6CisgICAgICBwcmludGYoIktlaW5lIEhpbGZlc2VpdGUgZ2VmdW5kZW4gZnVlciAnJXMnLlxuIixhcmdzWzBdKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAvKgorICAgICAgICAgaWYgKGZsYWdzJk1BTl9JKQorICAgICAgICAgeworICAgICAgICAgLy8gQlJBTkNIIFRPIE1BTlVBTEQKKyAgICAgICAgIHJldHVybiAxOworICAgICAgICAgfQorICAgICAgICovCisgICAgICBwcmludGYoIkZvbGdlbmRlIEhpbGZlc2VpdGUgd3VyZGUgZ2VmdW5kZW46ICVzXG4iLHRtcFsxXSk7CisgICAgICBNb3JlKE1BTkRfRE9DRElSK3RtcFsxXSwxKTsKKyAgICAgIHJldHVybiAxOworICAgIGRlZmF1bHQ6CisgICAgICBpPXNpemVvZih0bXApPj4xOworICAgICAgdG1wMj1hbGxvY2F0ZShpKTsKKyAgICAgIG9sZG1hbl9yZXN1bHQ9bV9hbGxvY2F0ZShpLDIpOworICAgICAgd2hpbGUoaSkKKyAgICAgIHsKKyAgICAgICAgdG1wMlsoaS0xKV09c3ByaW50ZigiJWQ6ICIsaSkrdG1wWyhpPDwxKS0yXTsKKwlvbGRtYW5fcmVzdWx0W2ksMF09dG1wWyhpPDwxKS0yXTsKKwlvbGRtYW5fcmVzdWx0W2ksMV09dG1wWyhpPDwxKS0xXTsKKyAgICAgICAgaS0tOworICAgICAgfQorICAgICAgcHJpbnRmKCJFcyB3dXJkZW4gZm9sZ2VuZGUgcG90ZW50aWVsbCBwYXNzZW5kZW4gU2VpdGVuIGdlZnVuZGVuOlxuIgorICAgICAgICAgICAgICIlJy0nNzguNzhzXG4lcyUnLSc3OC43OHNcbiIsIiIsCisgICAgICAgICAgICAgYnJlYWtfc3RyaW5nKGltcGxvZGUodG1wMiwiICIpLDc4KSwiIik7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gMTsKK30KKworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFJNQU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIworCitzdGF0aWMgaW50IF9ybWFuKHN0cmluZyBzdHIpCit7CisgIGludCBmbGFnczsKKyAgc3RyaW5nICphcmdzOworICAKKyAgc3RyPV91bnBhcnNlZF9hcmdzKCk7CisgIGFyZ3M9cGFyc2VhcmdzKHN0ciwmZmxhZ3MsIiIsMCk7CisgIGlmIChmbGFncz09LTF8fHNpemVvZihhcmdzKSE9MikKKyAgICByZXR1cm4gVVNBR0UoInJtYW4gPGhpbGZlc2VpdGU+IDxtdWRuYW1lPiIpOworICB3cml0ZSgibWFuOiAiICsKKyAgICAgICAgKHN0cmluZyljYWxsX290aGVyKFVEUF9DTURfRElSKyJtYW4iLCJzZW5kX3JlcXVlc3QiLGFyZ3NbMV0sYXJnc1swXSkpOworICByZXR1cm4gMTsKK30KKworCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFNIT1dQUk9QUyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjCisKKy8vCisvLyBfc2hvd3Byb3BzOiBaZWlndCBQcm9wZXJ0aWVzIHp1IGVpbmVtIE9iamVrdCBhbgorLy8KKworc3RhdGljIGludCBfc2hvd3Byb3BzKHN0cmluZyBzdHIpCit7CisgICBpbnQgaTsKKyAgIHN0cmluZyAqbGlzdCwgYXVzZ2FiZTsKKworICAgaWYgKHN0cikgeworICAgICAgaWYgKHN0clswXSE9Jy8nKSBzdHI9Ii8iK3N0cjsKKyAgICAgIGlmIChzdHJbMC4uNF0hPSIvc3RkLyIpCisgICAgICB7CisgICAgICAgICBwcmludGYoInNob3dwcm9wczogRXMga29lbm5lbiBudXIgUHJvcGVydGllcyB2b24gT2JqZWt0ZW4gIgorICAgICAgICAgICAgICAgICJhdXMgL3N0ZC8gYW5nZXplaWd0IHdlcmRlbi5cbiIpOworICAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgICBpZiAoc3RyWzwxXT09Jy4nKSBzdHIrPSJjIjsKKyAgICAgIGlmIChzdHJbPDIuLjwxXSE9Ii5jIikgc3RyKz0iLmMiOworICAgICAgaWYgKGZpbGVfc2l6ZShzdHIpPDApCisgICAgICB7CisgICAgICAgIHByaW50Zigic2hvd3Byb3BzOiAlczogRXMgZ2lidCBrZWluIE9iamVrdCBkaWVzZW4gTmFtZW5zLlxuIixzdHJbMC4uPDNdKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgICBpZiAoY2F0Y2goY2FsbF9vdGhlcihzdHJbMC4uPDNdLCAiPz8/IikpKQorICAgICAgeworICAgICAgICBwcmludGYoInNob3dwcm9wczogJXM6IERhdGVpIGtvbm50ZSBuaWNodCBnZWxhZGVuIHdlcmRlbi5cbiIsc3RyKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICB9CisgICBpZiAoIXN0ciB8fCAhZmluZF9vYmplY3Qoc3RyKSkgeworICAgICAgbm90aWZ5X2ZhaWwoIldlbGNoZSBQcm9wZXJ0aWVzIG1vZWNodGVzdCBEdSBzZWhlbj8iCisgICAgICAgICAgICAgICAgICAiIEJzcC46IDxzaG93cHJvcHMgL3N0ZC9ucGM+XG4iKTsKKyAgICAgIHJldHVybiAwOworICAgfQorICAgbGlzdD1pbmhlcml0X2xpc3QoZmluZF9vYmplY3Qoc3RyKSk7CisjaWYgX19WRVJTSU9OX18gPCAiMy4yLjkiCisgICBsaXN0PW1hcChsaXN0LGxhbWJkYSgoeyd4fSksKHsjJ2V4dHJhY3QsJ3gsNCwtMn0pKSk7CisgICBsaXN0Kz1tYXAobGlzdCxsYW1iZGEoKHsneH0pLCh7IydbPCwoeyMnb2xkX2V4cGxvZGUsJ3gsIi8ifSksMX0pKSk7CisgICBsaXN0PW1hcChtX2luZGljZXMobWttYXBwaW5nKGxpc3QpKSxsYW1iZGEoKHsneH0pLCh7IycrLCh7IycrLCIvc3lzLyIsJ3h9KSwiaCJ9KSkpOworICAgbGlzdD1maWx0ZXIobGlzdCxsYW1iZGEoKHsneH0pLCh7Iyc+LCh7IydmaWxlX3NpemUsJ3h9KSwwfSkpICk7CisjZWxzZQorICAgbGlzdD1tYXAobGlzdCwoOiByZXR1cm4gJDFbNS4uPDJdKyJoIjsgOikpOworICAgbGlzdCs9bWFwKGxpc3QsKDogcmV0dXJuIGV4cGxvZGUoJDEsIi8iKVs8MV07IDopKTsKKyAgIGxpc3Q9bWFwKG1faW5kaWNlcyhta21hcHBpbmcobGlzdCkpLCg6IHJldHVybiAiL3N5cy8iKyQxOyA6KSk7CisgICBsaXN0PWZpbHRlcihsaXN0LCg6IHJldHVybiBmaWxlX3NpemUoJDEpPjA7IDopKTsKKyNlbmRpZgorICAgbGlzdD1zb3J0X2FycmF5KGxpc3QsICMnPCk7CisgICBhdXNnYWJlPSIiOworICAgZm9yIChpPXNpemVvZihsaXN0KTtpLS07KQorICAgeworI2lmIF9fVkVSU0lPTl9fIDwgIjMuMi45IgorICAgICBzdHI9aW1wbG9kZShmaWx0ZXIob2xkX2V4cGxvZGUocmVhZF9maWxlKGxpc3RbaV0pLCAiXG4iKSwKKyAgICAgICAgbGFtYmRhKCAoeyAneCB9KSwgKHsjJz09LCAoeyMnZXh0cmFjdCwgJ3gsIDAsIDl9KSwgIiNkZWZpbmUgUF8ifSkgKSkKKyAgICAgICAgICAgICAgICAgLCAiXG4iKTsKKyNlbHNlCisgICAgIHN0cj1pbXBsb2RlKGZpbHRlcihleHBsb2RlKHJlYWRfZmlsZShsaXN0W2ldKSwiXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg6IHJldHVybiAkMVswLi45XT09IiNkZWZpbmUgUF8iOzopKSwiXG4iKTsKKyNlbmRpZgorICAgICBpZiAoc3RyIT0iIikgYXVzZ2FiZSs9c3ByaW50ZigiJXNcbiVzXG5cbiIsIGxpc3RbaV0sIHN0cik7CisgICB9CisgICBpZiAoYXVzZ2FiZSE9IiIpCisgICAgIE1vcmUoYXVzZ2FiZSk7CisgICBlbHNlCisgICAgIHByaW50ZigiS2VpbmUgUHJvcGVydHktRGVmaW5pdGlvbmVuIHp1IGRpZXNlbSBPYmpla3QgZ2VmdW5kZW4hXG4iKTsKKyAgIHJldHVybiAxOworfQorCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgR1JFUCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIworCisjaWYgX19WRVJTSU9OX18gPCAiMy4yLjkiCisKK3ByaXZhdGUgaW50IF9ncmVwX2ZpbHRlcihzdHJpbmcgZmlsZW5hbWUpCit7CisgIHJldHVybiAoY2FsbF9vdGhlcigidmFsaWRfd3JpdGUiLGZpbGVuYW1lLGdldHVpZCh0aGlzX29iamVjdCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAid3JpdGVfZmlsZSIsdGhpc19vYmplY3QoKSkhPTApOworfQorCisjZW5kaWYKKworLy8KKy8vIGdyZXBfZmlsZTogRGF0ZWkgZ3JlcHBlbgorLy8gcmV4cHI6IFJlZ3VsYXIgRXhwcmVzc2lvbgorLy8gZmxhZ3M6IEZsYWdzCisvLworCitwcml2YXRlIGludCBncmVwX2ZpbGUobWl4ZWQgZmlsZWRhdGEsIHN0cmluZyByZXhwciwgaW50IGZsYWdzKQoreworICBzdHJpbmcgZnVsbG5hbWUsZGF0YSxjYXJyeSwqbGluZXMsKmxpbmVzX29yaWcsKnRtcCwqcmVzdWx0OworICBpbnQgcHRyLGNvdW50LGksbm9sLG1hdGNoLGluZGV4OworICBmdWxsbmFtZT1maWxlZGF0YVtGVUxMTkFNRV07CisgIGlmICgoZmxhZ3MmR1JFUF9GKSYmZnVsbG5hbWU9PSIvcGxheWVycy8iK2dldHVpZCgpKyIvZ3JlcC5vdXQiKQorICB7CSAKKwl3cml0ZV9maWxlKCIvcGxheWVycy8iK2dldHVpZCgpKyIvZ3JlcC5vdXQiLAorICAgICAgICAgICAgICAgICAgICJVZWJlcmdlaGUgZ3JlcC5vdXQgLi4uXG4iKTsKKwlyZXR1cm4gUkVUX0ZBSUw7CisgIH0KKyAgc3dpdGNoKGZpbGVkYXRhW0ZJTEVTSVpFXSkKKyAgeworICAgIGNhc2UgLTI6IHJldHVybiBSRVRfRkFJTDsKKyAgICBjYXNlIC0xOiByZXR1cm4gRVJST1IoRE9FU05UX0VYSVNULGZ1bGxuYW1lLFJFVF9GQUlMKTsKKyAgICBjYXNlIDA6ICByZXR1cm4gUkVUX0ZBSUw7CisgICAgZGVmYXVsdDogYnJlYWs7CisgIH0KKyAgaWYgKCFNQVlfUkVBRChmdWxsbmFtZSkpIHJldHVybiBFUlJPUihOT19SRUFELGZ1bGxuYW1lLFJFVF9GQUlMKTsKKyAgY2Fycnk9IiI7IHJlc3VsdD0oe30pOworICBpZiAoZmxhZ3MmR1JFUF9JKQorICAgIHJleHByPWxvd2VyX2Nhc2UocmV4cHIpOworICBkbworICB7CisgICAgZGF0YT1yZWFkX2J5dGVzKGZ1bGxuYW1lLHB0cixNQVhMRU4pfHwiIjsKKyAgICBwdHIrPU1BWExFTjsKKyAgICBsaW5lcz1leHBsb2RlKGNhcnJ5K2RhdGEsIlxuIik7CisgICAgc3dpdGNoKHNpemVvZihsaW5lcykpCisgICAgeworICAgICAgY2FzZSAwOiBjb250aW51ZTsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgY2Fycnk9IiI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgY2Fycnk9bGluZXNbPDFdOworICAgICAgICBsaW5lcz1saW5lc1swLi48Ml07CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBsaW5lc19vcmlnPWxpbmVzOworICAgIGlmIChmbGFncyZHUkVQX0kpCisgICAgICBsaW5lcz1tYXAobGluZXMsIydsb3dlcl9jYXNlKTsKKyAgICBub2w9c2l6ZW9mKGxpbmVzKTsKKyAgICBmb3IgKGk9MDtpPG5vbDtpKyspCisgICAgeworICAgICAgbWF0Y2g9c2l6ZW9mKHJlZ2V4cChsaW5lc1tpLi5pXSxyZXhwcikpOworICAgICAgaWYgKGZsYWdzJkdSRVBfVikgbWF0Y2g9IW1hdGNoOworICAgICAgaWYgKG1hdGNoKQorICAgICAgeworICAgICAgICBpZiAoIShmbGFncyZHUkVQX0MpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGZsYWdzJkdSRVBfTikKKyAgICAgICAgICAgIHJlc3VsdCs9KHsgc3ByaW50ZigiJTRkICVzIixpbmRleCtpKzEsbGluZXNfb3JpZ1tpXSl9KTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICByZXN1bHQrPWxpbmVzX29yaWdbaS4uaV07CisgICAgICAgIH0KKyAgICAgICAgY291bnQrKzsKKyAgICAgIH0KKyAgICB9CisgICAgaW5kZXgrPW5vbDsKKyAgfQorICB3aGlsZShzaXplb2YoZGF0YSk9PU1BWExFTik7CisgIGlmIChjYXJyeSE9IiIpCisgIHsKKyAgICBpZiAoZmxhZ3MmR1JFUF9JKSBjYXJyeT1sb3dlcl9jYXNlKGNhcnJ5KTsKKyAgICBtYXRjaD1zaXplb2YocmVnZXhwKCh7IGNhcnJ5IH0pLHJleHByKSk7CisgICAgaWYgKGZsYWdzJkdSRVBfVikgbWF0Y2g9IW1hdGNoOworICAgIGlmIChtYXRjaCkKKyAgICB7CisgICAgICBpZighKGZsYWdzJkdSRVBfQykpCisgICAgICB7CisgICAgICAgIGlmKGZsYWdzJkdSRVBfTikKKyAgICAgICAgICAgcmVzdWx0Kz0oeyBzcHJpbnRmKCIlNGQgJXMiLGluZGV4KzEsY2FycnkpIH0pOworICAgICAgICBlbHNlCisgICAgICAgICAgIHJlc3VsdCs9KHtjYXJyeX0pOworICAgICAgfQorICAgICAgY291bnQrKzsKKyAgICB9CisgIH0KKyAgY2Fycnk9IiI7CisgIGlmIChjb3VudCkKKyAgeworICAgIGlmIChmbGFncyZHUkVQX0wpIGNhcnJ5PXNwcmludGYoIiVzXG4iLGZ1bGxuYW1lKTsKKyAgICBlbHNlIGlmIChmbGFncyZHUkVQX0gpIGRhdGE9IiI7CisgICAgZWxzZSBkYXRhPXNwcmludGYoIiAlczoiLGZ1bGxuYW1lKTsKKyAgICBpZiAoZmxhZ3MmR1JFUF9DKSBjYXJyeT1zcHJpbnRmKCIlcyAlZCBwYXNzZW5kZSBaZWlsZSVzLlxuIixkYXRhLGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY291bnQ9PTE/IiI6Im4iKSk7CisgICAgZWxzZQorICAgICAgY2Fycnk9KGRhdGErIlxuIitpbXBsb2RlKHJlc3VsdCwiXG4iKSsiXG4iKTsKKyAgfQorICBpZiAoZmxhZ3MmR1JFUF9GKQorICAgIHJldHVybiB3cml0ZV9maWxlKCIvcGxheWVycy8iK2dldHVpZCgpKyIvZ3JlcC5vdXQiLGNhcnJ5KTsKKyAgd3JpdGUoY2FycnkpOworICByZXR1cm4gUkVUX09LOworfQorCitzdGF0aWMgaW50IF9ncmVwKHN0cmluZyBjbWRsaW5lKQoreworICBzdHJpbmcgcmV4cHIsbWFzazsKKyAgbWl4ZWQgKmFyZ3M7CisgIGludCBmbGFnczsKKyAgY21kbGluZT1fdW5wYXJzZWRfYXJncygpOworICBhcmdzPXBhcnNlYXJncyhjbWRsaW5lLCZmbGFncyxHUkVQX09QVFMsMCk7CisgIGlmICgoZmxhZ3M9PS0xKXx8IXNpemVvZihhcmdzKSkKKyAgICByZXR1cm4gVVNBR0UoImdyZXAgWy0iIEdSRVBfT1BUUworICAgICAgICAgICJdIDxyZWdleHA+IDxkYXRlaS92ZXJ6PiBbPGRhdGVpMj4gLi4uIF0gWzxtYXNrZT5dIik7CisgIHJleHByPWFyZ3NbMF07CisgIGlmIChjYXRjaChyZWdleHAoKHsiIn0pLHJleHByKSl8fCFyZWdleHAoKHsiIn0pLHJleHByKSkKKyAgICByZXR1cm4gcHJpbnRmKCJncmVwOiBVbmd1ZWx0aWdlciBTdWNoYXVzZHJ1Y2s6ICVzXG4iLHJleHByKSAsMTsKKyAgYXJncz1hcmdzWzEuLl07CisgIGlmIChmbGFncyZHUkVQX00pCisgIHsKKyAgICBtYXNrPWFyZ3NbPDFdOworICAgIGFyZ3M9YXJnc1swLi48Ml07CisgIH0KKyAgaWYgKCFzaXplb2YoYXJncykpCisgICAgICByZXR1cm4gVVNBR0UoImdyZXAgWy0iIEdSRVBfT1BUUworICAgICAgICAgICJdIDxyZWdleHA+IDxkYXRlaS92ZXJ6PiBbPGRhdGVpMj4gLi4uIF0gWzxtYXNrZT5dIik7CisgIGFyZ3M9bWFwKGFyZ3MsIyd0b19maWxlbmFtZSktKHswfSk7CisgIC8qCisjaWYgX19WRVJTSU9OX18gPCAiMy4yLjkiCisgIGFyZ3M9ZmlsdGVyKGFyZ3MsIydfZ3JlcF9maWx0ZXIpOworI2Vsc2UKKyAgYXJncz1maWx0ZXIoYXJncywoOiByZXR1cm4gKHZhbGlkX3dyaXRlKCQxLAorICAgICAgICAgICAgZ2V0dWlkKHRoaXNfb2JqZWN0KCkpLCJ3cml0ZV9maWxlIix0aGlzX29iamVjdCgpKSE9MCk6KSk7CisjZW5kaWYKKyAgKi8KKyAgYXJncz1maWxlX2xpc3QoYXJncyxNT0RFX0dSRVAsKGZsYWdzJkdSRVBfUj8xOjApLCIvIixtYXNrKTsKKyAgaWYgKCFzaXplb2YoYXJncykpCisgICAgcmV0dXJuIHByaW50ZigiS2VpbmUgcGFzc2VuZGVuIERhdGVpZW4gZ2VmdW5kZW4uXG4iKSwxOworICBpZiAoZmxhZ3MmR1JFUF9JKSByZXhwcj1sb3dlcl9jYXNlKHJleHByKTsKKyAgaWYgKGZsYWdzJkdSRVBfRikKKyAgeworICAgIGlmIChmaWxlX3NpemUoIi9wbGF5ZXJzLyIrZ2V0dWlkKCkrIi9ncmVwLm91dCIpPT0tMnx8CisJICAhTUFZX1dSSVRFKCIvcGxheWVycy8iK2dldHVpZCgpKyIvZ3JlcC5vdXQiKSkKKyAgICAgIHJldHVybiBwcmludGYoImdyZXA6IERhdGVpIC9wbGF5ZXJzLyVzL2dyZXAub3V0IGthbm4gbmljaHQgIgorCQkgICAgICAiZ2VzY2hyaWViZW4gd2VyZGVuLlxuIixnZXR1aWQoKSksMTsKKyAgICBlbHNlCisgICAgICB3cml0ZV9maWxlKCIvcGxheWVycy8iK2dldHVpZCgpKyIvZ3JlcC5vdXQiLAorICAgICAgICAgICAgICAgICAiQXVzZ2FiZSB2b24gXCJncmVwICIgKyBfdW5wYXJzZWRfYXJncygpICsgIlwiOlxuIik7IAorICB9CisgIGFzeW5jaHJvbihhcmdzLCMnZ3JlcF9maWxlLHJleHByLGZsYWdzLDApOworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL3N0ZC9zaGVsbHMvbWFnaWVyL21hZ2llcl9leHQuYyBiL3N0ZC9zaGVsbHMvbWFnaWVyL21hZ2llcl9leHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWQzMGIyCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3NoZWxscy9tYWdpZXIvbWFnaWVyX2V4dC5jCkBAIC0wLDAgKzEsNzMzIEBACisvLyAkSWQ6IG1hZ2llcl9leHQuYyA5NTU1IDIwMTYtMDUtMDMgMjA6NDI6NDZaIFplc3N0cmEgJAorI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworLy8jcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisKKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxsb2dnaW5nLmg+CisjaW5jbHVkZSA8bWFnaWVyLmg+CisjaW5jbHVkZSA8c25vb3BpbmcuaD4KKyNpbmNsdWRlIDxkcml2ZXJfaW5mby5oPgorI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDxwbGF5ZXIvdGVsbmV0bmVnLmg+CisjaW5jbHVkZSA8cGxheWVyL2Jhc2UuaD4KKyN1bmRlZiBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8ZmlsZXMuaD4KKyNpbmNsdWRlIDxldmVudHMuaD4KKyNpbmNsdWRlIDxwbGF5ZXIvY29tbS5oPgorCitpbmhlcml0ICIvc3RkL3NoZWxscy9tYWdpZXIvcGFyc2luZyI7Citpbmhlcml0ICIvc3RkL3NoZWxscy9tYWdpZXIvdXBkIjsKK2luaGVyaXQgIi9zdGQvc2hlbGxzL21hZ2llci9maWxldmlldyI7Citpbmhlcml0ICIvc3RkL3NoZWxscy9tYWdpZXIvb2JqZWN0cyI7Citpbmhlcml0ICIvc3RkL3NoZWxscy9tYWdpZXIvZmlsZWVkaXQiOworLy9pbmhlcml0ICIvc3RkL3NoZWxscy9tYWdpZXIvdG9kbyI7Citpbmhlcml0ICIvc3RkL3NoZWxscy9tYWdpZXIvcGxheWVycyI7Citpbmhlcml0ICIvc3RkL3NoZWxscy9tYWdpZXIvYWRtaW4iOworaW5oZXJpdCAiL3N0ZC9zaGVsbHMvbWFnaWVyL21vdmluZyI7Citpbmhlcml0ICIvc3RkL3NoZWxscy9tYWdpZXIvY29tbSI7CisKKworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgU0VUICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjCisKKworLy8KKy8vIF9zZXQoKTogU2hlbGwtQmVmZWhsICdzZXQnCisvLyBhcmdzOiAgIEtvbW1hbmRvemVpbGVuYXJndW1lbnRlCisvLworCitzdGF0aWMgaW50IF9zZXQobWl4ZWQgYXJncykKK3sKKyAgaW50IHBvczsKKyAgc3RyaW5nIHZhcjsKKyAgbWl4ZWQgdmFsOworICBtYXBwaW5nIHZhcnM7CisKKyAgaWYoIWFyZ3M9X3VucGFyc2VkX2FyZ3MoKSkKKyAgeworICAgIGlmKCFzaXplb2YodmFycz1RdWVyeVByb3AoUF9WQVJJQUJMRVMpKSkgCisgICAgICBwcmludGYoIkR1IGhhc3Qgbm9jaCBrZWluZSBWYXJpYWJsZW4gZGVmaW5pZXJ0IVxuIik7CisgICAgZWxzZQorICAgIHsKKyAgICAgIHByaW50ZigiRHUgaGFzdCBkaWUgZm9sZ2VuZGVuIFZhcmlhYmxlbiBkZWZpbmllcnQ6XG4iKTsKKyAgICAgIHdhbGtfbWFwcGluZyh2YXJzLCgoOiBwcmludGYoIiAlLTIwcyA9ICVzXG4iLCQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcnAoJDIpP2ltcGxvZGUoJDIsIjoiKTokMikgOikpKTsKKworICAgIH0KKyAgICByZXR1cm4gMTsKKyAgfQorICBwb3MgPSBtZW1iZXIoYXJncywnICcpOworICBpZihwb3MgPT0gLTEpCisgICAgaWYoc2l6ZW9mKGFyZ3MpKQorICAgICAgeworICAgICAgICBtX2RlbGV0ZShRdWVyeVByb3AoUF9WQVJJQUJMRVMpLCBhcmdzKTsKKyAgICAgICAgcHJpbnRmKCJWYXJpYWJsZSAlcyB3dXJkZSBnZWxvZXNjaHQuXG4iLGFyZ3MpOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICBlbHNlIHJldHVybiBVU0FHRSgic2V0IDx2YXJpYWJsZT4gPHdlcnQ+Iik7CisgIHZhciA9IGFyZ3NbMC4ucG9zLTFdOworICB2YWwgPSAobWVtYmVyKGFyZ3NbcG9zKzEuLl0sJzonKT4tMT8KKyAgICAgICAgIGV4cGxvZGUoYXJnc1twb3MrMS4uXSwgIjoiKSA6CisgICAgICAgICBhcmdzW3BvcysxLi5dKTsKKyAgdmFycz1RdWVyeVByb3AoUF9WQVJJQUJMRVMpOworICB2YXJzKz0gKFt2YXIgOiB2YWxdKTsKKyAgcHJpbnRmKCJWYXJpYWJsZSBnZXNldHp0OiAlcyA9ICVzXG4iLHZhcixhcmdzW3BvcysxLi5dKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBDRCArIFBXRCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjCisKK3N0YXRpYyBpbnQgX3B3ZCgpCit7CisgIHByaW50ZigiQWt0dWVsbGVzIFZlcnplaWNobmlzOiAlc1xuIixRdWVyeVByb3AoUF9DVVJSRU5URElSKSk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9jZDIoc3RyaW5nIGNtZGxpbmUpCit7CisgIHN0cmluZyBkZXN0LHRtcDsKKyAgaW50IGZsYWdzOworICBtaXhlZCAqYXJnczsKKyAgCisgIGFyZ3M9cGFyc2VhcmdzKGNtZGxpbmUsJmZsYWdzLENEX09QVFMsMSk7CisgIGlmIChmbGFncz09LTEpIHJldHVybiAwOworICBpZihmbGFncyZDRF9CKQorICB7CisgICAgZGVzdD1RdWVyeVByb3AoUF9MQVNURElSKTsKKyAgfQorICBpZiAoc2l6ZW9mKGFyZ3MpPjEpCisgICAgcmV0dXJuIG5vdGlmeV9mYWlsKCJNYW4ga2FubiBzaWNoIChsZWlkZXIpIG51ciBpbiBlaW5lbSAiCisgICAgICAgICAgICAgICAgICAgICAgICJWZXJ6ZWljaG5pcyBnbGVpY2h6ZWl0aWcgYmVmaW5kZW4uXG4iKSwwOworICBpZighZGVzdCkKKyAgeworICAgIGlmICghc2l6ZW9mKGFyZ3MpKQorICAgIHsKKyAgICAgIGlmIChJU19XSVpBUkQodGhpc19vYmplY3QoKSkpCisgICAgICAgIGRlc3Q9Ii9wbGF5ZXJzLyIrZ2V0dWlkKHRoaXNfb2JqZWN0KCkpOworICAgICAgZWxzZQorICAgICAgICBkZXN0PSIvZG9jIjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGRlc3Q9YXJnc1swXTsKKyAgICB9CisgIH0KKyAgCisgIGlmIChkZXN0IT0iLyIpCisgIHsKKyAgICBhcmdzPWZpbGVfbGlzdCgoe2Rlc3R9KSxNT0RFX0NELDAsIi8iKTsKKyAgICBhcmdzID0gZmlsdGVyKGFyZ3MsIGZ1bmN0aW9uIGludCAobWl4ZWQgYXJyKQorICAgICAgICB7IHJldHVybiBhcnJbRklMRVNJWkVdID09IEZTSVpFX0RJUjsgfSApOworCisgICAgaWYgKCFzaXplb2YoYXJncykpCisgICAgICByZXR1cm4gbm90aWZ5X2ZhaWwoImNkOiAiK2Rlc3QrCisgICAgICAgICAgICAgICAgICAgICAgICI6IEtlaW4gc29sY2hlcyBWZXJ6ZWljaG5pcyBnZWZ1bmRlbi5cbiIpLDA7CisgICAgaWYgKHNpemVvZihhcmdzKT4xKQorICAgICAgcmV0dXJuIG5vdGlmeV9mYWlsKCJjZDogIitkZXN0KyI6IE1hc2tlIGlzdCBuaWNodCBlaW5kZXV0aWcuXG4iKSwwOworICAgIGRlc3Q9YXJnc1swXVtGVUxMTkFNRV07CisgIH0KKyAgaWYgKCFJU19XSVpBUkQodGhpc19vYmplY3QoKSkmJmRlc3RbMC4uM10hPSIvZG9jIikgZGVzdD0iL2RvYyI7CisgIFNldFByb3AoUF9MQVNURElSLFF1ZXJ5UHJvcChQX0NVUlJFTlRESVIpKTsKKyAgcHJpbnRmKCJBa3R1ZWxsZXMgVmVyemVpY2huaXMgaXN0IGpldHp0OiAlc1xuIixTZXRQcm9wKFBfQ1VSUkVOVERJUixkZXN0KSk7CisgIHRtcD0iIjsKKyAgaWYgKCgoZmxhZ3MmQ0RfTCl8fAorICAgICAgICgoIW1fY29udGFpbnMoJnRtcCxRdWVyeVByb3AoUF9WQVJJQUJMRVMpLCJDRF9TSE9SVCIpfHwKKyAgICAgICAgIHRtcCE9IjEiKSYmKCEoZmxhZ3MmQ0RfUykpKSkpCisgICAgdGVsbF9vYmplY3QodGhpc19vYmplY3QoKSwKKyAgICAgICAgICAgICAgICByZWFkX2ZpbGUoZGVzdCsoZGVzdFs8MV09PScvJz8iLnJlYWRtZSI6Ii8ucmVhZG1lIikpfHwiIik7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9jZChzdHJpbmcgY21kbGluZSkKK3sKKyAgcmV0dXJuIF9jZDIoX3VucGFyc2VkX2FyZ3MoKSk7Cit9CisKK3N0YXRpYyBzdHJpbmcgX3NldF9jdXJyZW50ZGlyKHN0cmluZyBwYXRoKQoreworICBTZXQoUF9DVVJSRU5URElSLCBwYXRoKTsKKyAgdGhpc19vYmplY3QoKS0+bW9kaWZ5X3Byb21wdCgpOyAgLy8gUHJvbXB0IG1pdCBuZXVlbSBQZmFkIHNldHplbiwgdGVsbmV0bmVnCisgIHJldHVybiBwYXRoOworfQorCitwcml2YXRlIHN0cmluZyBfcXVlcnlfY3VycmVudGRpcigpCit7CisgIHN0cmluZyBjOworICBpZighYz1RdWVyeShQX0NVUlJFTlRESVIpKQorICAgIHJldHVybiBTZXQoUF9DVVJSRU5URElSLCAiL3BsYXllcnMvIitnZXR1aWQodGhpc19vYmplY3QoKSksRl9WQUxVRSk7CisgIHJldHVybiBjOworfQorCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBQUk9NUFQgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMKKworLy8KKy8vIF9wcm9tcHRfc3Vic3Q6IE11ZG5hbWVuLCBVc2VybmFtZW4sIFplaWxlbnZvcnNjaHViIGluIEVpbmdhYmVhdWYtCisvLyAgICAgICAgICAgICAgICBmb3JkZXJ1bmcgZWluYmF1ZW4KKy8vIHN0cjogICAgICAgICAgIFVlYmVyZ2ViZW5lciBLb21tYW5kb3plaWxlbmFic2Nobml0dAorLy8KKworcHJpdmF0ZSBzdHJpbmcgX3Byb21wdF9zdWJzdChzdHJpbmcgc3RyKQoreworICBzd2l0Y2goc3RyKQorICB7CisgICAgY2FzZSAiXFxoIjogcmV0dXJuIHNpemVvZihNVUROQU1FKT9NVUROQU1FOiJNdWQgb2huZSBOYW1lbiI7CisgICAgY2FzZSAiXFx1IjogcmV0dXJuIGNhcGl0YWxpemUoZ2V0dWlkKHRoaXNfb2JqZWN0KCkpKTsKKyAgICBjYXNlICJcXG4iOiByZXR1cm4gIlxuIjsKKyAgICBjYXNlICJcXHQiOiByZXR1cm4gIlx0IjsKKyAgICBjYXNlICJcXHciOiByZXR1cm4gIlx3IjsKKyAgfQorICByZXR1cm4gc3RyOworfQorCisKKy8vCisvLyBfcHJvbXB0OiBFaW5nYWJlYXVmZm9yZGVydW5nIHNldHplbgorLy8gYXJnOiAgICAgS29tbWFuZG96ZWlsZQorLy8KKworc3RhdGljIGludCBfcHJvbXB0KHN0cmluZyBhcmdzKQoreworICBzdHJpbmcgKnBhcmdzOworCisgIGFyZ3M9KGV4dGVybl9jYWxsKCk/X3VucGFyc2VkX2FyZ3MoKTphcmdzKTsKKyAgaWYgKCFzaXplb2YoYXJncykpIGFyZ3M9Ij4gIjsKKyAgaWYgKGFyZ3NbMF09PSciJykgYXJncz1hcmdzWzEuLjwyXTsgICAgIC8vIik7CisgIGlmKCFzaXplb2YocGFyZ3MgPSByZWdleHBsb2RlKGFyZ3MsICJcXFxcW3RodXduXSIpKSkKKyAgICByZXR1cm4gVVNBR0UoInByb21wdCBcIjxFaW5nYWJlYXVmZm9yZGVydW5nc2RlZmluaXRpb24+XCIiKTsKKyAgcGFyZ3M9bWFwKHBhcmdzLCMnX3Byb21wdF9zdWJzdCk7CisKKyAgU2V0UHJvcChQX1BST01QVCxpbXBsb2RlKHBhcmdzLCIiKSk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgc3RyaW5nIF9zZXRfcHJvbXB0KHN0cmluZyBwcm9tcHQpIHsKKyAgU2V0KFBfUFJPTVBULCBwcm9tcHQsIEZfVkFMVUUpOworICB0aGlzX29iamVjdCgpLT5tb2RpZnlfcHJvbXB0KCk7IC8vIG5ldWVuIFByb21wdCBzZXR6ZW4gKHRlbG5ldG5lZy5jKQorICByZXR1cm4gcHJvbXB0OworfQorCisKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBTSE9XUFJFU0FZICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMKKworc3RhdGljIGludCBfc2hvd3ByZXNheShzdHJpbmcgY21kbGluZSkKK3sKKyAgaW50IHByZXNheTsKKyAgcHJlc2F5PVF1ZXJ5UHJvcChQX0NBTl9GTEFHUykmQ0FOX1BSRVNBWTsKKyAgY21kbGluZT1fdW5wYXJzZWRfYXJncygwKTsKKyAgaWYgKCFzaXplb2YoY21kbGluZSkpCisgIHsKKyAgICBwcmludGYoIkRlaW4gUHJlc2F5IHdpcmQgaW0gTW9tZW50ICVzYW5nZXplaWd0LlxuIgorICAgICAgICAgICAiJXNzY2hhbHRlbiBtaXQgXCdzaG93cHJlc2F5ICVzXCcuXG4iLAorICAgICAgICAgICBwcmVzYXk/IiI6Im5pY2h0ICIscHJlc2F5PyJBdXMiOiJFaW4iLAorICAgICAgICAgICBwcmVzYXk/ImF1cyI6ImVpbiIpOworICAgIHJldHVybiAxOworICB9CisgIGlmIChjbWRsaW5lPT0iZWluInx8Y21kbGluZT09ImFuIikKKyAgeworICAgIHByaW50ZigiRGVpbiBQcmVzYXkgd2lyZCBqZXR6dCBhbmdlemVpZ3QuXG4iKTsKKyAgICBTZXRQcm9wKFBfQ0FOX0ZMQUdTLFF1ZXJ5UHJvcChQX0NBTl9GTEFHUyl8Q0FOX1BSRVNBWSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKGNtZGxpbmU9PSJhdXMiKQorICB7CisgICAgcHJpbnRmKCJEZWluIFByZXNheSB3aXJkIGpldHp0IG5pY2h0IG1laHIgYW5nZXplaWd0LlxuIik7CisgICAgU2V0UHJvcChQX0NBTl9GTEFHUyxRdWVyeVByb3AoUF9DQU5fRkxBR1MpJn5DQU5fUFJFU0FZKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gVVNBR0UoInNob3dwcmVzYXkgW2VpbnxhbnxhdXNdIik7Cit9CisKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFWEVDICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMKKworc3RhdGljIGludCBfZXhlYyhzdHJpbmcgZmlsZW5hbWUpCit7CisgIG9iamVjdCBvYjsKKyAgaWYgKCFJU19MT1JEKHRoaXNfb2JqZWN0KCkpKSByZXR1cm4gMDsKKyAgaWYgKHRoaXNfcGxheWVyKCkhPXRoaXNfaW50ZXJhY3RpdmUoKSkgcmV0dXJuIDA7CisgIGlmICh0aGlzX3BsYXllcigpIT10aGlzX29iamVjdCgpKSByZXR1cm4gMDsKKyAgaWYgKCEoZmlsZW5hbWU9X3VucGFyc2VkX2FyZ3MoKSkpIHJldHVybiBVU0FHRSgiZXhlYyA8b2JqZWt0bmFtZT4iKTsKKyAgZmlsZW5hbWU9KHN0cmluZykic2VjdXJlL21hc3RlciItPl9nZXRfcGF0aChmaWxlbmFtZSxnZXR1aWQoKSk7CisgIGlmIChmaWxlX3NpemUoZmlsZW5hbWUpPDAmJighdG9fZmlsZW5hbWUoZmlsZW5hbWUrIi5jIikpfHwKKyAgICAgIGZpbGVfc2l6ZSh0b19maWxlbmFtZShmaWxlbmFtZSsiLmMiKSk8MCkKKyAgeworICAgIHByaW50ZigiZXhlYzogJXM6IERhdGVpIG5pY2h0IHZvcmhhbmRlbiBvZGVyIGVpbiBWZXJ6ZWljaG5pcy5cbiIsZmlsZW5hbWUpOworICAgIHJldHVybiAxOworICB9CisgIGlmIChjYXRjaChjYWxsX290aGVyKGZpbGVuYW1lLCI/Pz8/IikpKSAKKyAgeworICAgIHByaW50ZigiZXhlYzogRmVobGVyIGJlaW0gTGFkZW4gdm9uICVzLlxuIixmaWxlbmFtZSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKCEob2I9Y2xvbmVfb2JqZWN0KGZpbGVuYW1lKSkpIHJldHVybiAwOworICBpZiAoZ2V0dWlkKG9iKSAhPSBnZXR1aWQodGhpc19vYmplY3QoKSkpCisgIHsKKyAgICBwcmludGYoImV4ZWM6IFVJRC1Lb25mbGlrdDogJXMgPC0+ICVzLlxuIixnZXR1aWQob2IpLAorICAgICAgICAgICBnZXR1aWQodGhpc19vYmplY3QoKSkpOworICAgIGRlc3RydWN0KG9iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBsb2dfZmlsZShTSEVMTExPRygiRVhFQyIpLAorICAgICAgICAgc3ByaW50ZigiJTEyLjEycyAlNDAuNDBzICUyNS4yNXNcbiIsCisgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHRoaXNfb2JqZWN0KCkpKSxmaWxlbmFtZSxkdGltZSh0aW1lKCkpWzQuLl0pKTsKKyAgZGlzYWJsZV9jb21tYW5kcygpOworICBleGVjKG9iLHRoaXNfb2JqZWN0KCkpOworICBpZiAoaW50ZXJhY3RpdmUodGhpc19vYmplY3QoKSl8fCFpbnRlcmFjdGl2ZShvYikpCisgIHsKKyAgICBlbmFibGVfY29tbWFuZHMoKTsKKyAgICBwcmludGYoIkZlaGxlciBiZWkgRVhFQzogVWViZXJ0cmFndW5nIGRlciBTaGVsbCAiCisgICAgICAgICAgICJuaWNodCBtb2VnbGljaC5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIG9iLT5zdGFydF9wbGF5ZXIoY2FwaXRhbGl6ZShnZXR1aWQodGhpc19vYmplY3QoKSkpKTsKKyAgcmVtb3ZlKCk7CisgIHJldHVybiAxOworfQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFNOT09QSU5HICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIworCitwcml2YXRlIG5vc2F2ZSBzdHJpbmcgc25vb3BfYWxsb3dlZDsKK3ByaXZhdGUgbm9zYXZlIG9iamVjdCBzbm9vcGVlOworCitub21hc2sgaW50IFF1ZXJ5QWxsb3dTbm9vcChvYmplY3Qgd2hvKQoreworICByZXR1cm4gKGdldHVpZCh3aG8pID09IHNub29wX2FsbG93ZWQpOworfQorCitzdGF0aWMgaW50IF9zYWxsb3coc3RyaW5nIHN0cikKK3sKKyAgb2JqZWN0IG9iOworCisgIGlmICghc2l6ZW9mKHN0cikpCisgIHsKKyAgICBpZiAoIXNub29wX2FsbG93ZWQpIHJldHVybiBVU0FHRSgic2FsbG93IFs8bmFtZT5dXG4iKTsKKyAgICBzdHI9c25vb3BfYWxsb3dlZDsKKyAgICBzbm9vcF9hbGxvd2VkPTA7CisgICAgcHJpbnRmKCJEdSBlbnR6aWVoc3QgJXMgZGllIEVybGF1Ym5pcyB6dW0gU25vb3Blbi5cbiIsY2FwaXRhbGl6ZShzdHIpKTsKKyAgICBvYj1xdWVyeV9zbm9vcCh0aGlzX3BsYXllcigpKTsKKyAgICBpZiAoIW9ifHwoZ2V0dWlkKG9iKSE9c3RyKSkgcmV0dXJuIDE7CisgICAgdGVsbF9vYmplY3Qob2IsYnJlYWtfc3RyaW5nKHNwcmludGYoIiVzIGVudHppZWh0IERpciBkaWUgIgorICAgICAgICAgICAgIkVybGF1Ym5pcyB6dW0gc25vb3BlbiB1bmQgendpbmd0IERpY2ggc28gZGF6dSwgbWl0ICIKKyAgICAgICAgICAgICJkZW0gU25vb3BlbiBhdWZ6dWhvZXJlbi5cbiIsY2FwaXRhbGl6ZShnZXR1aWQoKSkpKSk7CisgICAgc25vb3Aob2IpOworICAgIHJldHVybiAxOworICB9CisgIGlmIChzbm9vcF9hbGxvd2VkKSBfc2FsbG93KCIiKTsgLy8gRXJzdG1hbCBhYnNjaGFsdGVuCisgIG9iPWZpbmRfcGxheWVyKGxvd2VyX2Nhc2Uoc3RyKSk7CisgIHN0cj1jYXBpdGFsaXplKHN0cik7CisgIGlmICghb2IpIHJldHVybgorICAgICAgcHJpbnRmKCJzYWxsb3c6IFNwaWVsZXIgJXMga29ubnRlIG5pY2h0IGdlZnVuZGVuIHdlcmRlbi5cbiIsc3RyKSwxOworICBpZiAocXVlcnlfd2l6X2dycChvYik+cXVlcnlfd2l6X2dycCh0aGlzX3BsYXllcigpKSkKKyAgICByZXR1cm4gcHJpbnRmKCJzYWxsb3c6ICVzIGhhdCBlaW5lbiBob2VoZXJlbiBSYW5nIGFscyBEdSB1bmQga2FubiAiCisgICAgICAgICAgICAgICAgICAiRGljaCBkYWhlciBvaG5laGluIHNub29wZW4uXG4iLHN0ciksMTsKKyAgc25vb3BfYWxsb3dlZD1nZXR1aWQob2IpOworICByZXR1cm4gcHJpbnRmKCJzYWxsb3c6IER1IGVybGF1YnN0ICVzLCBEaWNoIHp1IHNub29wZW4uXG4iLHN0ciksMTsKK30KKworc3RhdGljIGludCBfc25vb3Aoc3RyaW5nIGNtZGxpbmUpCit7CisgIG9iamVjdCBvYjsKKyAgaW50IGZsYWdzOworICBzdHJpbmcgKmFyZ3M7CisKKyAgaWYgKCFzaXplb2YoY21kbGluZT1fdW5wYXJzZWRfYXJncygpKXx8CisgICAgICBzaXplb2YoYXJncz1wYXJzZWFyZ3MoY21kbGluZSwmZmxhZ3MsU05PT1BfT1BUUywwKSkhPTF8fGZsYWdzPT0tMSkKKyAgeworICAgIGlmICghc25vb3AodGhpc19vYmplY3QoKSkpIHJldHVybiBVU0FHRSgic25vb3AgWy0iIFNOT09QX09QVFMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0gWzxzcGllbGVyPl1cbiIpOworICAgIGlmIChzbm9vcGVlKQorICAgICAgcHJpbnRmKCJEdSBzbm9vcHN0ICVzIGpldHp0IG5pY2h0IG1laHIuXG4iLGNhcGl0YWxpemUoZ2V0dWlkKHNub29wZWUpKSk7CisgICAgZWxzZQorICAgIHsKKyAgICAgIHByaW50ZigiRHUgaG9lcnN0IGF1ZiB6dSBzbm9vcGVuLlxuIik7CisgICAgLy8gZXZ0bC4gaXJnZW5kZXR3YXMgbG9nZ2VuIC4uLiBzb2xsdGUgZWlnZW50bGljaCBuaWNodCBwYXNzaWVyZW4uCisgICAgfQorICAgIHNub29wZWU9KG9iamVjdCkwOworICAgIHJldHVybiAxOworICB9CisgIFNldFByb3AoUF9TTk9PUEZMQUdTLGZsYWdzKTsgLy8gRlVOS1RJT05JRVJUIE5VUiwgV0VOTiBtYWdpZXIuaCB1bmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzbm9vcGluZy5oIGFiZ2VnbGljaGVuIHNpbmQKKyAgaWYgKCEob2IgPSBmaW5kX3BsYXllcihhcmdzWzBdKSkpCisgICAgcmV0dXJuIHByaW50Zigic25vb3A6IEtvbm50ZSBrZWluZW4gU3BpZWxlciAnJXMnIGZpbmRlbi5cbiIsCisgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGFyZ3NbMF0pKSwxOworICBpZiAoIXNub29wKHRoaXNfcGxheWVyKCksb2IpKQorICAgIHJldHVybiBwcmludGYoInNub29wOiBEZXIgVmVyc3VjaCwgJXMgenUgc25vb3BlbiwgaXN0ICIKKyAgICAgICAgICAgICAgICAgICJmZWhsZ2VzY2hsYWdlbi5cbiVzIixjYXBpdGFsaXplKGFyZ3NbMF0pLAorICAgICAgICAgICAgICAgICAgKCh+ZmxhZ3MpJlNOT09QX0YpPyJFdmVudHVlbGwgZnVua3Rpb25pZXJ0IGVzIG1pdCBkZW0gIgorICAgICAgICAgICAgICAgICAgIkZsYWcgJy1mJy5cbiI6IiIpLDE7CisgIHNub29wZWU9b2I7CisgIHJldHVybiBwcmludGYoIkR1IHNub29wc3QgamV0enQgJXMuXG4iLGNhcGl0YWxpemUoZ2V0dWlkKG9iKSkpLDE7Cit9CisKKworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgTVNDSEFVICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjCisKK3N0YXRpYyBpbnQgX21zY2hhdShzdHJpbmcgc3RyKQoreworICBpZiAodGhpc19pbnRlcmFjdGl2ZSgpIT10aGlzX29iamVjdCgpKSByZXR1cm4gMDsKKyAgaWYgKHN0cj09ImphInx8c3RyPT0iYW4ifHxzdHI9PSJlaW4iKQorICB7CisgICAgaWYgKCBRdWVyeVByb3AoUF9XQU5UU19UT19MRUFSTikgKQorICAgICAgcHJpbnRmKCJEdSBoYXN0IGRlbiBNYWdpZXItTW9kdXMgZG9jaCBzY2hvbiBlaW5nZXNjaGFsdGV0IVxuIik7CisgICAgZWxzZQorICAgIHsKKyAgICAgIHByaW50ZigiRHUgaGFzdCBqZXR6dCBkZW4gTWFnaWVyLU1vZHVzIGVpbmdlc2NoYWx0ZXQuXG4iICk7CisgICAgICBTZXRQcm9wKFBfV0FOVFNfVE9fTEVBUk4sIDEpOworICAgIH0KKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoc3RyPT0ibmVpbiJ8fHN0cj09ImF1cyIpCisgIHsKKyAgICBpZiAoUXVlcnlQcm9wKFBfV0FOVFNfVE9fTEVBUk4pKQorICAgIHsKKyAgICAgIHByaW50ZiggIkR1IHNjaGFsdGVzdCBkZW4gTWFnaWVyLU1vZHVzIGF1cy5cbiIpOworICAgICAgc2V0X2hlYXJ0X2JlYXQoMSk7CisgICAgICBTZXRQcm9wKFBfV0FOVFNfVE9fTEVBUk4sMCk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHByaW50ZigiRHUgaGFzdCBkZW4gTWFnaWVyLU1vZHVzIGRvY2ggc2Nob24gYXVzZ2VzY2hhbHRldC5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIGlmIChzdHI9PSIrZGVidWciKQorICB7CisgICAgcHJpbnRmKCJEdSBuaW1tc3QgamV0enQgRGVidWdhdXNnYWJlbiB3YWhyLlxuIik7CisgICAgU2V0UHJvcChQX1dJWl9ERUJVRywxKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoc3RyPT0iLWRlYnVnIikKKyAgeworICAgIHByaW50ZigiRHUgbmltbXN0IGpldHp0IGtlaW5lIERlYnVnYXVzZ2FiZW4gbWVociB3YWhyLlxuIik7CisgICAgU2V0UHJvcChQX1dJWl9ERUJVRywwKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gVVNBR0UoIm1zY2hhdSBbYW58ZWlufGphfGF1c3xuZWlufCtkZWJ1Z3wtZGVidWddXG4iKTsKK30KKworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFBST1RFQ1QgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMKKworc3RhdGljIGludCBfcHJvdGVjdChzdHJpbmcgc3RyKQoreworIAorICBpZiAodGhpc19vYmplY3QoKSE9dGhpc19pbnRlcmFjdGl2ZSgpKSByZXR1cm4gMDsKKyAgaWYgKCFzaXplb2Yoc3RyKSkKKyAgICByZXR1cm4gVVNBR0UoInByb3RlY3QgPHByb3BlcnR5bmFtZT5cbiIpOworICBTZXQoc3RyLCBQUk9URUNURUQsIEZfTU9ERSk7CisgIHJldHVybiBwcmludGYoIkRlaW5lIFByb3BlcnR5ICVzIGlzdCBqZXR6dCAlc2dlc2NodWV0enQuXG4iLAorICAgICAgICAgICAgICAgIHN0ciwoUXVlcnkoc3RyLEZfTU9ERSkgJiBQUk9URUNURUQ/IiI6Im5pY2h0IG1laHIgIikpLDE7Cit9CisKKworLy8gICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFZJUyArIElOVklTICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjCisKK3N0YXRpYyBpbnQgX2hic3RvcDsKK3N0YXRpYyBpbnQgX2FnZTsKKworc3RhdGljIGludCBfaW52aXMoc3RyaW5nIGluZm9ybSkKK3sKKworICBpZiAoUXVlcnlQcm9wKFBfSU5WSVMpKQorICAgIHJldHVybiBwcmludGYoIkR1IGJpc3QgZG9jaCBzY2hvbiB1bnNpY2h0YmFyIVxuIiksMTsKKyAgdGVsbF9yb29tKGVudmlyb25tZW50KCksc3ByaW50ZigiJXMgJXMuXG4iLGNhcGl0YWxpemUoTmFtZSgpKSwKKyAgICAgICAgICAgIFF1ZXJ5UHJvcChQX01NU0dPVVQpKSwoeyB0aGlzX29iamVjdCgpIH0pKTsKKyAgaWYgKGluZm9ybT09ImUiKSB7CisgICAgLy8gTG9nb3V0LWV2ZW50IGF1c2xvZXNlbgorICAgIEVWRU5URC0+VHJpZ2dlckV2ZW50KEVWVF9MSUJfTE9HT1VULCAoWworICAgICAgICAgICAgRV9PQkpFQ1Q6IHRoaXNfb2JqZWN0KCksCisgICAgICAgICAgICBFX1BMTkFNRTogZ2V0dWlkKHRoaXNfb2JqZWN0KCkpLAorICAgICAgICAgICAgRV9FTlZJUk9OTUVOVDogZW52aXJvbm1lbnQoKSBdKSApOworCisgICAgY2FsbF9ub3RpZnlfcGxheWVyX2NoYW5nZSgwKTsKKyAgfQorCisgIFNldFByb3AoUF9JTlZJUywgUXVlcnlQcm9wKFBfQUdFKSk7CisgIHByaW50ZigiRHUgYmlzdCBqZXR6dCB1bnNpY2h0YmFyLlxuIik7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IF92aXMoc3RyaW5nIGluZm9ybSkKK3sKKyAgaWYgKCFRdWVyeVByb3AoUF9JTlZJUykpCisgICAgcmV0dXJuIHByaW50ZigiRHUgYmlzdCBkb2NoIHNjaG9uIHNpY2h0YmFyLlxuIiksMTsKKyAgIHRlbGxfcm9vbShlbnZpcm9ubWVudCgpLHNwcmludGYoIiVzICVzLlxuIixjYXBpdGFsaXplKE5hbWUoKSksCisgICAgICAgICAgICBRdWVyeVByb3AoUF9NTVNHSU4pKSwoeyB0aGlzX29iamVjdCgpIH0pKTsKKyAgU2V0UHJvcChQX0lOVklTLCAwKTsKKyAgaWYgKGluZm9ybT09ImUiKSB7CisgICAgLy8gTG9naW4tZXZlbnQgYXVzbG9lc2VuCisgICAgRVZFTlRELT5UcmlnZ2VyRXZlbnQoRVZUX0xJQl9MT0dJTiwgKFsKKyAgICAgICAgICBFX09CSkVDVDogdGhpc19vYmplY3QoKSwKKyAgICAgICAgICBFX1BMTkFNRTogZ2V0dWlkKHRoaXNfb2JqZWN0KCkpLAorICAgICAgICAgIEVfRU5WSVJPTk1FTlQ6IGVudmlyb25tZW50KCkgXSkgKTsKKworICAgIGNhbGxfbm90aWZ5X3BsYXllcl9jaGFuZ2UoMSk7CisgIH0KKyAgcHJpbnRmKCJEdSBiaXN0IGpldHp0IHNpY2h0YmFyLlxuIik7CisgIHJldHVybiAxOworfQorCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBMT0NBTENNRCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjCisKKworc3RhdGljIGludCBfbG9jYWxjbWQoKQoreworICBpbnQgc2l6ZSxtb3JlOworICBzdHJpbmcgKnZlcmJzLHJlc3VsdDsKKworICAvLyBQZXIgVW13ZWcgdWViZXIgTWFwcGluZyBkb3BwZWx0ZSBXZXJ0ZSBlaW5zdGFtcGZlbgorICBzaXplPXNpemVvZih2ZXJicz1tX2luZGljZXMobWttYXBwaW5nKHF1ZXJ5X2FjdGlvbnModGhpc19vYmplY3QoKSkpKSk7CisgIHZlcmJzLT0oeyIifSk7CisgIG1vcmU9KHNpemU+c2l6ZW9mKHZlcmJzKSk7CisgIGlmICghc2l6ZW9mKHZlcmJzKSkKKyAgeworICAgIGlmIChtb3JlKQorICAgICAgcHJpbnRmKCJEaWUgdm9yaGFuZGVuZW4gQmVmZWhsZSBrb2VubmVuIG5pY2h0IGFuZ2V6ZWlndCB3ZXJkZW4sICIKKyAgICAgICAgICAgICAiZGEgc2llIHBlciAnYWRkX2FjdGlvbihcImZ1bmt0aW9uXCIsXCJcIiwxKScgZGVmaW5pZXJ0ICIKKyAgICAgICAgICAgICAid3VyZGVuLlxuIik7CisgICAgZWxzZQorICAgICAgcHJpbnRmKCJEaXIgc3RlaGVuIGtlaW5lIEJlZmVobGUgenVyIFZlcmZ1ZWd1bmcgLi4uIGVpZ2VuYXJ0aWchXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICB2ZXJicz1zb3J0X2FycmF5KHZlcmJzLCMnPik7CisgIHJlc3VsdD1icmVha19zdHJpbmcoc3ByaW50ZigiXCclc1wnIixpbXBsb2RlKHZlcmJzLCInICciKSksNzgpOworICByZXR1cm4gcHJpbnRmKCJcbiUnLSc3OC43OHNcbkRpZSBmdWVyIERpY2ggYWt0dWVsbCB2ZXJmdWVnYmFyZW4gIgorICAgICAgICAgICAgICAgICJCZWZlaGxlIHNpbmQ6XG5cbiVzXG4lcyUnLSc3OC43OHNcbiIsIiIscmVzdWx0LAorICAgICAgICAgICAgICAgIG1vcmU/Ilp1ZGVtIHd1cmRlbiBCZWZlaGxlIHBlciAnYWRkX2FjdGlvbigiCisgICAgICAgICAgICAgICAgIlwiZnVua3Rpb25cIixcIlwiLDEpJyBkZWZpbmllcnQuXG4iOiIiLCIiKSwxOworfQorCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgVFJBRU5LRSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIworCitzdGF0aWMgaW50IF90cmFlbmtlKHN0cmluZyBzdHIpCit7CisgIGlmKFNldFByb3AoUF9UUkFOS19GSU5ERU4sICFRdWVyeVByb3AoUF9UUkFOS19GSU5ERU4pKSkKKyAgICB3cml0ZSgiRHUga2FubnN0IGpldHp0IFphdWJlcnRyYWVua2UgZmluZGVuLlxuIik7CisgIGVsc2UKKyAgICB3cml0ZSgiRHUgZmluZGVzdCBqZXR6dCBrZWluZSBaYXViZXJ0cmFlbmtlIG1laHIuXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbm9ybV9ydXNhZ2UoKSB7CisJbWl4ZWQqIHI7CisgIHIgPSBydXNhZ2UoKTsKKyAgcmV0dXJuIHJbMF0vMTAwICsgclsxXS8xMDA7Cit9CisKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEFTWU5DSFJPTiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIworCisvLworLy8gYXN5bmNocm9uKCk6IEFzeW5jaHJvbmUgQWJhcmJlaXR1bmcgZWluZXMgQXJyYXlzCisvLyBhcnJheTogICAgIFp1IGJlYXJiZWl0ZW5kZXMgQXJyYXkKKy8vIGNtZDogICAgICAgQXVzenVmdWVocmVuZGUgQ2xvc3VyZQorLy8gZGF0YTogICAgICBFeHRyYWFyZ3VtZW50ZQorLy8gZmxhZ3M6ICAgICBadXNhdHpkYXRlbiAobm9ybWFsZXJ3ZWlzZSBGbGFncykKKy8vIGM6ICAgICAgICAgc2Nob24gYXN5bmNocm9uPworLy8KKworc3RhdGljIHZhcmFyZ3Mgdm9pZCBhc3luY2hyb24obWl4ZWQqIGFycmF5LCBjbG9zdXJlIGNtZCwgbWl4ZWQgZGF0YSwgbWl4ZWQgZmxhZ3MsaW50IGMpCit7CisgIGludCBpLCBqLCBrOworICBtaXhlZCByZXRfdmFsOworICBzdHJpbmcgY21kX3N0cmluZzsKKworICBrID0gbm9ybV9ydXNhZ2UoKSs1OworICBqID0gc2l6ZW9mKGFycmF5KTsKKyAgaT0wOworICAKKyAgc3dpdGNoIChjbWRfc3RyaW5nPWV4cGxvZGUoc3ByaW50ZigiJU8iLGNtZCksIi0+IilbMV0pCisgIHsKKyAgICBjYXNlICJfbWFrZSI6ICAgICBjbWRfc3RyaW5nPShkYXRhJlVQRF9MT0FEPyJsb2FkIjoidXBkIik7YnJlYWs7CisgICAgY2FzZSAiY3BfZmlsZSI6ICAgY21kX3N0cmluZyA9KGRhdGE/Im12IjoiY3AiKTsgYnJlYWs7CisgICAgY2FzZSAiZ3JlcF9maWxlIjogY21kX3N0cmluZyA9ICJncmVwIjsgYnJlYWs7CisgICAgY2FzZSAicm1fZmlsZSI6ICAgY21kX3N0cmluZyA9ICJybSI7IGJyZWFrOworICAgIGRlZmF1bHQ6IGJyZWFrOworICB9CisgIAorICB3aGlsZShpIDwgaiAmJiBnZXRfZXZhbF9jb3N0KCkgPiAyMDAwMDAgJiYgbm9ybV9ydXNhZ2UoKTxrKQorICAgIC8vIFNvd29obCBUb28tTG9uZy1FdmFsIGFscyBhdWNoIExhZyB2ZXJoaW5kZXJuCisgIHsKKyAgICByZXRfdmFsPWFwcGx5KGNtZCxhcnJheVtpXSxkYXRhLCBmbGFncyk7CisgICAgaWYgKGNsb3N1cmVwKHJldF92YWwpKQorICAgIHsKKyAgICAgIGlmKGMpIHRlbGxfb2JqZWN0KHRoaXNfb2JqZWN0KCksCisgICAgICAgICAgICAgICBzcHJpbnRmKCIlczogVmVybGFzc2UgQXN5bmNocm9uZW4gTW9kdXMuXG4iLGNtZF9zdHJpbmcpKTsKKyAgICAgIGZ1bmNhbGwocmV0X3ZhbCxhcnJheVtpLi5dLGRhdGEsZmxhZ3MpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAocmV0X3ZhbD09UkVUX0RFTEVURSkKKyAgICB7CisgICAgICBhcnJheVtpK2FycmF5W2ldW1NVQkRJUlNJWkVdKzEuLmkrYXJyYXlbaV1bU1VCRElSU0laRV1dPQorICAgICAgICAoeyAoYXJyYXlbaV1bMC4uNV0rKHswfSkpIH0pOworICAgIH0KKyAgICBpZiAocmV0X3ZhbD09UkVUX0pVTVApIGkrPWFycmF5W2ldW1NVQkRJUlNJWkVdOworICAgIGkrKzsKKyAgfQorICBpZihzaXplb2YoYXJyYXkgPSBhcnJheVtpLi5dKSkgCisgIHsgIAorICAgIGlmKCFjKSB0ZWxsX29iamVjdCh0aGlzX29iamVjdCgpLAorICAgICAgICAgICAgICBzcHJpbnRmKCIlczogQXN5bmNocm9uZXIgTW9kdXMgYWt0aXZpZXJ0IVxuIiwgY21kX3N0cmluZykpOworICAgIGNhbGxfb3V0KCMnYXN5bmNocm9uLCAxLCBhcnJheSwgY21kLCBkYXRhLGZsYWdzLCAxKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBpZihjKSB0ZWxsX29iamVjdCh0aGlzX29iamVjdCgpLAorICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoIiVzOiBhYmdlc2NobG9zc2VuLlxuIixjbWRfc3RyaW5nKSk7CisgICAgICBlbHNlIGlmIChxdWVyeV92ZXJiKCkpIHRlbGxfb2JqZWN0KHRoaXNfb2JqZWN0KCksCisgICAgICAgICAgICBzcHJpbnRmKCIlczogYWJnZXNjaGxvc3Nlbi5cbiIscXVlcnlfdmVyYigpKSk7CisgIH0KKyAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK30KKworLy8KKy8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBEcml2ZXIgU3RhdHVzIEluZm9zICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLworc3RhdGljIGludCBfZHJpdmVyX21hbGxvYyhzdHJpbmcgc3RyKQoreworICAgIGlmKCFzaXplb2Yoc3RyKSkKKyAgICB7CisgICAgICAgIHdyaXRlKGVmdW46OmRyaXZlcl9pbmZvKERJX1NUQVRVU19URVhUX01BTExPQykpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYoc3RyID09ICJleHRzdGF0cyIpCisgICAgeworICAgICAgICB3cml0ZShlZnVuOjpkcml2ZXJfaW5mbyhESV9TVEFUVVNfVEVYVF9NQUxMT0NfRVhURU5ERUQpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9kcml2ZXJfZHVtcGFsbG9iaihzdHJpbmcgc3RyKQoreworICAgIHdyaXRlKCJEdW1waW5nIHRvIC9PQkpfRFVNUCAuLi4gIik7CisgICAgZWZ1bjo6ZHVtcF9kcml2ZXJfaW5mbyhERElfT0JKRUNUUyk7CisgICAgZWZ1bjo6ZHVtcF9kcml2ZXJfaW5mbyhERElfT0JKRUNUU19ERVNUUlVDVEVEKTsKKyAgICB3cml0ZSgiZG9uZVxuIik7CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2RyaXZlcl9vcGNkdW1wKHN0cmluZyBzdHIpCit7CisgICAgZWZ1bjo6ZHVtcF9kcml2ZXJfaW5mbyhERElfT1BDT0RFUyk7CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2RyaXZlcl9zdGF0dXMoc3RyaW5nIHN0cikKK3sKKyAgICBpbnQgb3B0OworCisgICAgc3dpdGNoKHN0ciB8fCAiIikKKyAgICB7CisgICAgICAgIGNhc2UgIiI6CisgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9NRU1PUlk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJ0YWJsZXMiOgorICAgICAgICBjYXNlICIgdGFibGVzIjoKKyAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX1RBQkxFUzsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgInN3YXAiOgorICAgICAgICBjYXNlICIgc3dhcCI6CisgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9TV0FQOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAibWFsbG9jIjoKKyAgICAgICAgY2FzZSAiIG1hbGxvYyI6CisgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9NQUxMT0M7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJtYWxsb2MgZXh0c3RhdHMiOgorICAgICAgICBjYXNlICIgbWFsbG9jIGV4dHN0YXRzIjoKKyAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX01BTExPQ19FWFRFTkRFRDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgd3JpdGUoZWZ1bjo6ZHJpdmVyX2luZm8ob3B0KSk7CisgICAgcmV0dXJuIDE7Cit9CisKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgSU5JVElBTElTSUVSVU5HICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjCisKKy8vCisvLyBfcXVlcnlfbG9jYWxjbWRzOiBXZWxjaGUgS29tbWFuZG9zIHdlcmRlbiBpbiBkaWVzZXIgRGF0ZWkgaW1wbGVtZW50aWVydD8KKy8vCisKK3N0YXRpYyBtaXhlZCBfcXVlcnlfbG9jYWxjbWRzKCkKK3sKKyAgcmV0dXJuICh7CisgICAgKHsic2V0IiwiX3NldCIsMCxMRUFSTkVSX0xWTH0pLAorICAgICh7InB3ZCIsIl9wd2QiLDAsTEVBUk5FUl9MVkx9KSwKKyAgICAoeyJjZCIsIl9jZCIsMCxMRUFSTkVSX0xWTH0pLAorICAgICh7InByb21wdCIsIl9wcm9tcHQiLDAsTEVBUk5FUl9MVkx9KSwKKyAgICAoeyJzaG93cHJlc2F5IiwiX3Nob3dwcmVzYXkiLDAsTEVBUk5FUl9MVkx9KSwKKyAgICAoeyJleGVjIiwiX2V4ZWMiLDAsQVJDSF9MVkx9KSwKKyAgICAoeyJzYWxsb3ciLCJfc2FsbG93IiwwLExFQVJORVJfTFZMfSksCisgICAgKHsic25vb3AiLCJfc25vb3AiLDAsV0laQVJEX0xWTH0pLAorICAgICh7Im1zY2hhdSIsIl9tc2NoYXUiLDAsTEVBUk5FUl9MVkx9KSwKKyAgICAoeyJwcm90ZWN0IiwiX3Byb3RlY3QiLDAsV0laQVJEX0xWTH0pLAorICAgICh7ImludmlzIiwiX2ludmlzIiwwLExFQVJORVJfTFZMfSksCisgICAgKHsidmlzIiwiX3ZpcyIsMCxMRUFSTkVSX0xWTH0pLAorICAgICh7ImxvY2FsY21kIiwiX2xvY2FsY21kIiwwLExFQVJORVJfTFZMfSksCisgICAgKHsidHJhZW5rZSIsIl90cmFlbmtlIiwwLERPTUFJTk1FTUJFUl9MVkx9KSwKKyAgICAoeyJtYWxsb2MiLCJfZHJpdmVyX21hbGxvYyIsMCxMRUFSTkVSX0xWTH0pLAorICAgICh7ImR1bXBhbGxvYmoiLCJfZHJpdmVyX2R1bXBhbGxvYmoiLDAsQVJDSF9MVkx9KSwKKyAgICAoeyJvcGNkdW1wIiwiX2RyaXZlcl9vcGNkdW1wIiwwLEFSQ0hfTFZMfSksCisgICAgKHsic3RhdHVzIiwiX2RyaXZlcl9zdGF0dXMiLDAsTEVBUk5FUl9MVkx9KSwKKyAgfSkKKyAgICArZmlsZXZpZXc6Ol9xdWVyeV9sb2NhbGNtZHMoKQorICAgICt1cGQ6Ol9xdWVyeV9sb2NhbGNtZHMoKQorICAgICtvYmplY3RzOjpfcXVlcnlfbG9jYWxjbWRzKCkKKyAgICArZmlsZWVkaXQ6Ol9xdWVyeV9sb2NhbGNtZHMoKQorLy8gICAgK3RvZG86Ol9xdWVyeV9sb2NhbGNtZHMoKQorICAgICtwbGF5ZXJzOjpfcXVlcnlfbG9jYWxjbWRzKCkKKyAgICArYWRtaW46Ol9xdWVyeV9sb2NhbGNtZHMoKQorICAgICttb3Zpbmc6Ol9xdWVyeV9sb2NhbGNtZHMoKQorICAgICtjb21tOjpfcXVlcnlfbG9jYWxjbWRzKCk7Cit9CisKKy8vCisvLyBpbml0aWFsaXplOiBJbml0aWFsaXNpZXJ1bmcgZGVyIFNoZWxsCisvLworCitzdGF0aWMgdm9pZCBpbml0aWFsaXplKCkKK3sKKyAgU2V0KFBfUFJPTVBULCBTQVZFLCBGX01PREVfQVMpOworICBTZXQoUF9WQVJJQUJMRVMsU0FWRSxGX01PREVfQVMpOworICBTZXQoImZpbGVzeXMiLFNBVkUsRl9NT0RFX0FEKTsgICAvLyBQX0ZJTEVTWVMgaXN0IG9ic29sZXQKKyAgU2V0KCJzaG9ydF9jd2QiLFNBVkUsRl9NT0RFX0FEKTsgLy8gUF9TSE9SVF9DV0QgYXVjaAorICBpZighbWFwcGluZ3AoUXVlcnlQcm9wKFBfVkFSSUFCTEVTKSkpCisgICAgU2V0UHJvcChQX1ZBUklBQkxFUywgKFtdKSk7CisgIF9wcm9tcHQoUXVlcnlQcm9wKFBfUFJPTVBUKSk7CisvLyAgdG9kbzo6aW5pdGlhbGl6ZSgpOworICBfY2QyKCIiKTsKKyAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCByZWNvbm5lY3QoKSB7IF9jZChRdWVyeVByb3AoUF9DVVJSRU5URElSKSk7IH0KZGlmZiAtLWdpdCBhL3N0ZC9zaGVsbHMvbWFnaWVyL21vdmluZy5jIGIvc3RkL3NoZWxscy9tYWdpZXIvbW92aW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA5NWEzZgotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9zaGVsbHMvbWFnaWVyL21vdmluZy5jCkBAIC0wLDAgKzEsMjMyIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gbW92aW5nLmMKKy8vCisvLyAkSWQ6IG1vdmluZy5jIDkxNDIgMjAxNS0wMi0wNCAyMjoxNzoyOVogWmVzc3RyYSAkCisjcHJhZ21hIHN0cmljdF90eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8bWFnaWVyLmg+CisjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxpdmluZy9tb3ZpbmcuaD4KKyNpbmNsdWRlIDxwbGF5ZXIuaD4KKyN1bmRlZiBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisKK3ByaXZhdGUgbWl4ZWQgdmVyZm9sZ2VyKCkKK3sKKyAgbWl4ZWQgKnB1cjsKKworICBpZiAoIXBvaW50ZXJwKHB1cj1RdWVyeVByb3AoUF9QVVJTVUVSUykpKSByZXR1cm4gMDsKKyAgZWxzZSByZXR1cm4gcHVyWzBdOworfQorCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgSU4rQVQgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjCisKK3N0YXRpYyBpbnQgX21vdmVfYmFzZShvYmplY3QgdGFyZ2V0LCBvYmplY3Qgb2xkX3Jvb20sIHN0cmluZyBjbWQpCit7CisgIGlmIChlbnZpcm9ubWVudCgpIT10YXJnZXQpCisgICAgaWYgKElTX0FSQ0godGhpc19vYmplY3QoKSkpCisgICAgeworICAgICAgX19zZXRfZW52aXJvbm1lbnQodGhpc19vYmplY3QoKSx0YXJnZXQpOworICAgICAgcHJpbnRmKCIlczogQmV3ZWd1bmcgaGF0IG5pY2h0IGdla2xhcHB0LiBWZXJzdWNoZSBlcyBtaXQgIgorICAgICAgICAgICAgICJzZXRfZW52aXJvbm1lbnQuLi4gJXMuXG4uIixxdWVyeV92ZXJiKCksCisgICAgICAgICAgICAgZW52aXJvbm1lbnQoKT09dGFyZ2V0PyJoYXQgZ2VrbGFwcHQiOiJlcmZvbGdsb3MiKTsKKyAgICB9CisgIGVsc2UKKyAgICBwcmludGYoIiVzOiBCZXdlZ3VuZyBoYXQgbmljaHQgZ2VrbGFwcHQuXG4iLHF1ZXJ5X3ZlcmIoKSk7CisgIGlmIChlbnZpcm9ubWVudCgpIT10YXJnZXQpIHJldHVybiAxOworICBjb21tYW5kKGNtZCk7CisgIGlmIChvbGRfcm9vbSkgbW92ZV9vYmplY3Qob2xkX3Jvb20pOworICBlbHNlCisgICAgcmV0dXJuIHByaW50ZigiJXM6IFVyc3BydW5nc3JhdW0gd3VyZGUgemVyc3RvZXJ0LlxuIixxdWVyeV92ZXJiKCkpLDE7ICAKKyAgaWYgKGVudmlyb25tZW50KCkhPW9sZF9yb29tKQorICB7CisgICAgaWYgKElTX0FSQ0godGhpc19vYmplY3QoKSkpCisgICAgeworICAgICAgX19zZXRfZW52aXJvbm1lbnQodGhpc19vYmplY3QoKSxvbGRfcm9vbSk7CisgICAgICBwcmludGYoIiVzOiBadXJ1ZWNrYmV3ZWdlbiBoYXQgbmljaHQgZ2VrbGFwcHQuIFZlcnN1Y2hlIGVzIG1pdCAiCisgICAgICAgICAgICAgInNldF9lbnZpcm9ubWVudCAuLi4gJXMuXG4iLHF1ZXJ5X3ZlcmIoKSwKKyAgICAgICAgICAgICBlbnZpcm9ubWVudCgpPT1vbGRfcm9vbT8iaGF0IGdla2xhcHB0IjoiZXJmb2xnbG9zIik7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHByaW50ZigiYXQ6IFp1cnVlY2tiZXdlZ2VuIGhhdCBuaWNodCBnZWtsYXBwdC5cbiIpOworICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9pbl9yb29tKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyByb29tO2ludCBzaXplOworICBvYmplY3Qgb2xkX3Jvb207CisgIHN0cmluZyBjbWQsZXJyOworCisgIGlmICghc2l6ZW9mKHN0cj1fdW5wYXJzZWRfYXJncygpKSB8fAorICAgICAgIXNpemVvZihzdHI9cmVncmVwbGFjZShzdHIsIl4gKiIsIiIsMSkpIHx8CisgICAgICBzc2NhbmYoc3RyLCAiJXMgJXMiLCByb29tLCBjbWQpICE9IDIpCisgICAgcmV0dXJuIFVTQUdFKCJpbiA8cmF1bT4gPGJlZmVobD5cbiIpOworICBvbGRfcm9vbSA9IGVudmlyb25tZW50KCk7CisgIHJvb209KHN0cmluZyljYWxsX290aGVyKG1hc3RlcigpLCJfZ2V0X3BhdGgiLHJvb20sZ2V0dWlkKCkpOworICBpZiAoZXJyPWNhdGNoKG1vdmVfb2JqZWN0KHJvb20pKSkKKyAgeworICAgIGlmIChjYXRjaChzaXplPWZpbGVfc2l6ZShyb29tKyIuYyIpKXx8c2l6ZTwxKQorICAgICAgcHJpbnRmKCIlczogJXMuYzogRGF0ZWkgbmljaHQgdm9yaGFuZGVuLlxuIixxdWVyeV92ZXJiKCkscm9vbSk7CisgICAgZWxzZQorICAgICAgcHJpbnRmKCIlczogQmV3ZWd1bmcgbmFjaCAlcyBoYXQgbmljaHQgZnVua3Rpb25pZXJ0OiAlc1xuIiwKKyAgICAgICAgICAgICBxdWVyeV92ZXJiKCkscm9vbSxlcnIpOworICAgIHJldHVybiAxOworICB9CisgIHJldHVybiBfbW92ZV9iYXNlKGZpbmRfb2JqZWN0KHJvb20pLG9sZF9yb29tLGNtZCk7Cit9CisKK3N0YXRpYyBpbnQgX2F0X3BsYXllcihzdHJpbmcgZGVzdCkKK3sKKyAgb2JqZWN0IG9iLG9sZF9yb29tOworICBtaXhlZCB0bXA7CisgIHN0cmluZyBjbWQ7CisKKyAgaWYgKCFzaXplb2YoZGVzdD1fdW5wYXJzZWRfYXJncygpKSB8fAorICAgICAgIXNpemVvZihkZXN0PXJlZ3JlcGxhY2UoZGVzdCwiXiAqIiwiIiwxKSkgfHwKKyAgICAgIHNzY2FuZihkZXN0LCAiJXMgJXMiLCBkZXN0LCBjbWQpICE9IDIpCisgICAgcmV0dXJuIFVTQUdFKCJhdCA8bGViZXdlc2VuPiA8YmVmZWhsPlxuIik7CisgIGlmICghKG9iPWZpbmRfbGl2aW5nKGRlc3QpKSkKKyAgeworICAgIHRtcD1tYXRjaF9saXZpbmcoZGVzdCwxKTsKKyAgICBpZiAoc3RyaW5ncCh0bXApKSBvYiA9IGZpbmRfbGl2aW5nKHRtcCk7CisgIH0KKyAgaWYgKCFvYnx8IShvYj1lbnZpcm9ubWVudChvYikpKQorICAgIHJldHVybiBfbm90aWZ5X2ZhaWwoc3ByaW50ZigiYXQ6IExlYmV3ZXNlbiBcJyVzXCcgbmljaHQgZ2VmdW5kZW4uXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0KSksMDsKKyAgb2xkX3Jvb209ZW52aXJvbm1lbnQoKTsKKyAgbW92ZV9vYmplY3Qob2IpOworICByZXR1cm4gX21vdmVfYmFzZShvYixvbGRfcm9vbSxjbWQpOworfQorCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgR09UTyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjCisKK3N0YXRpYyBvYmplY3QgZmluZF9saXZpbmdfbnIoc3RyaW5nIHN0cikKK3sgc3RyaW5nIG5hbWUsY2hlY2s7CisgIGludCBucjsKKyAgb2JqZWN0KmxpdmluZ3M7CisgIGlmKHNzY2FuZihzdHIsIiVzICVkJXMiLG5hbWUsbnIsY2hlY2spPDJ8fHNpemVvZihjaGVjaykpCisgICAgcmV0dXJuIGZpbmRfbGl2aW5nKHN0cik7CisgIGlmKCFzaXplb2YobGl2aW5ncz1maWx0ZXIoKGZpbmRfbGl2aW5ncyhuYW1lKXx8KHt9KSksIydlbnZpcm9ubWVudCkpCisgICAgIHx8bnI8MXx8c2l6ZW9mKGxpdmluZ3MpPG5yKQorICAgIHJldHVybiAwOworICByZXR1cm4gbGl2aW5nc1tuci0xXTsKK30KKworc3RhdGljIGludCBfZ290byhzdHJpbmcgZGVzdCl7CisgIG1peGVkIHRhcmdldDsKKyAgc3RyaW5nIHRhcmdldDIsZXJyOworCisgIGlmICghc2l6ZW9mKGRlc3Q9X3VucGFyc2VkX2FyZ3MoKSkpCisgICAgcmV0dXJuIFVTQUdFKCJnb3RvIFtsZWJld2VzZW58ZmlsZW5hbWVdXG4iKTsKKyAgaWYgKCEoKHRhcmdldD1maW5kX2xpdmluZ19ucihkZXN0KSkgJiYgKHRhcmdldD1lbnZpcm9ubWVudCh0YXJnZXQpKSkpCisgIHsKKyAgICAgdGFyZ2V0Mj10YXJnZXQ9KG1peGVkKWNhbGxfb3RoZXIobWFzdGVyKCksIl9nZXRfcGF0aCIsZGVzdCxnZXR1aWQoKSk7CisgICAgIGlmICghZmluZF9vYmplY3QodGFyZ2V0KSkKKyAgICAgeworICAgICAgIGlmICh0YXJnZXQyWzwxXT09Jy4nKSB0YXJnZXQyKz0iYyI7CisgICAgICAgaWYgKHRhcmdldDJbPDIuLjwxXSE9Ii5jIikgdGFyZ2V0Mis9Ii5jIjsKKyAgICAgICBub3RpZnlfZmFpbChzcHJpbnRmKCJnb3RvOiBEYXRlaSAlTyBuaWNodCB2b3JoYW5kZW4uXG4iLHRhcmdldCkpOworICAgICAgIGlmICghKGZpbGVfc2l6ZSh0YXJnZXQyKT4tMXx8CisgICAgICAgICAgIGZpbGVfc2l6ZShpbXBsb2RlKGV4cGxvZGUodGFyZ2V0LCIvIilbMC4uPDJdLCIvIikrCisgICAgICAgICAgICAgICAiL3ZpcnR1YWxfY29tcGlsZXIuYyIpPi0xKXx8KGVycj1jYXRjaChjYWxsX290aGVyKHRhcmdldCwiPyIpKSkpCisgICAgICAgeworICAgICAgICAgaWYgKGVycikKKyAgICAgICAgICAgICAgbm90aWZ5X2ZhaWwoc3ByaW50ZigiZ290bzogRmVobGVyIGJlaW0gVGVsZXBvcnQgbmFjaCAlTzpcbiVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGRlc3QsaW1wbG9kZShleHBsb2RlKGVyciwiXG4iKSwiICIpKSk7CisgICAgICAgICB0YXJnZXQ9bWF0Y2hfbGl2aW5nKGRlc3QsMSk7CisgICAgICAgICBpZiAoIShzdHJpbmdwKHRhcmdldCkmJih0YXJnZXQ9ZmluZF9saXZpbmcodGFyZ2V0KSkmJgorICAgICAgICAgICAgICAgKHRhcmdldD1lbnZpcm9ubWVudCh0YXJnZXQpKSkpCisgICAgICAgICAgIHJldHVybiAwOworICAgICAgIH0KKyAgICAgfQorICB9CisgIGlmICh2ZXJmb2xnZXIoKSkgX3ZlcmZvbGdlKCIiKTsKKyAgaWYgKG1vdmUodGFyZ2V0LE1fVFBPUlR8TV9OT0NIRUNLKTwwKQorICAgIHByaW50ZigiQmV3ZWd1bmcgZmVobGdlc2NobGFnZW4hXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBIT01FICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMKKworc3RhdGljIGludCBfaG9tZSgpCit7CisgIHN0cmluZyBkZXN0OworICBpZiAodmVyZm9sZ2VyKCkpIF92ZXJmb2xnZSgiIik7CisgIGRlc3Q9Ii9wbGF5ZXJzLyIgKyBnZXR1aWQoKSArICIvd29ya3Jvb20iOworICBpZiAoZmlsZV9zaXplKGRlc3QrIi5jIik8MXx8Y2F0Y2goY2FsbF9vdGhlcihkZXN0LCI/Pz8iKSkpCisgIHsKKyAgICBwcmludGYoIkZlaGxlciBiZWltIExhZGVuIERlaW5lcyBXb3Jrcm9vbXMuXG4iCisgICAgICAgICAgICJHZWhlIHp1bSBNYWdpZXJ0cmVmZi5cbiIpOworICAgIGRlc3Q9Ii9zZWN1cmUvbWVybGluIjsKKyAgfQorICAKKyAgaWYgKG1vdmUoZGVzdCxNX1RQT1JUfE1fTk9DSEVDSyk8MCkKKyAgICBwcmludGYoIkJld2VndW5nIGZlaGxnZXNjaGxhZ2VuIVxuIik7CisgIHJldHVybiAxOworfQorCisvLyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICtNQUdJRVJOQU1FICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIworCitzdGF0aWMgaW50IF9nb193aXpfaG9tZShzdHJpbmcgc3RyKQoreworICBfbm90aWZ5X2ZhaWwoIlN5bnRheDogJyttYWdpZXJuYW1lJ1xuIik7CisgIGlmKHNpemVvZihxdWVyeV92ZXJiKCkpPjEpIHN0cj1xdWVyeV92ZXJiKClbMS4uXTsKKyAgaWYoIXNpemVvZihzdHIpKSByZXR1cm4gMDsKKyAgaWYocXVlcnlfdmVyYigpWzBdIT0nKycpIHJldHVybiAwOworICBzdHI9KG9sZF9leHBsb2RlKHN0ciwiICIpLSh7MH0pKVswXTsKKyAgaWYoIXNpemVvZihzdHIpKSByZXR1cm4gMDsKKyAgc3RyPWxvd2VyX2Nhc2Uoc3RyKTsKKyAgaWYgKHN0cj09Im1lcmxpbiIpCisgIHsKKyAgICBtb3ZlKCIvc2VjdXJlL21lcmxpbiIsTV9UUE9SVHxNX05PQ0hFQ0spOworICAgIHJldHVybiAxOworICB9CisgIGlmICgoIWNhbGxfb3RoZXIobWFzdGVyKCksImdldF91c2VyaW5mbyIsc3RyKSl8fAorICAgICAgIUlTX0xFQVJORVIoc3RyKSkKKyAgeworICAgIHByaW50ZigiRXMgZ2lidCBrZWluZW4gTWFnaWVyIG5hbWVucyAlcy5cbiIsCisgICAgICAgICAgIGNhcGl0YWxpemUoc3RyKSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKGZpbGVfc2l6ZSgiL3BsYXllcnMvIitzdHIrIi93b3Jrcm9vbS5jIik8MSkKKyAgeworICAgIHByaW50ZigiJXMgaGF0IGtlaW5lbiBXb3Jrcm9vbS5cbiIsY2FwaXRhbGl6ZShzdHIpKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoY2F0Y2goY2FsbF9vdGhlcigiL3BsYXllcnMvIitzdHIrIi93b3Jrcm9vbSIsIj8/PyIpKSkKKyAgeworICAgIHByaW50ZigiRGVyIFdvcmtyb29tIHZvbiAlcyBoYXQgRmVobGVyLlxuIixjYXBpdGFsaXplKHN0cikpOworICAgIHJldHVybiAxOworICB9CisgIG1vdmUoIi9wbGF5ZXJzLyIrc3RyKyIvd29ya3Jvb20iLE1fVFBPUlR8TV9OT0NIRUNLKTsKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIG1peGVkIF9xdWVyeV9sb2NhbGNtZHMoKQoreworICByZXR1cm4KKyAgICAoeyh7ImdvdG8iLCJfZ290byIsMCxMRUFSTkVSX0xWTH0pLAorICAgICAgKHsiaW4iLCJfaW5fcm9vbSIsMCxMRUFSTkVSX0xWTH0pLAorICAgICAgKHsiYXQiLCJfYXRfcGxheWVyIiwwLExFQVJORVJfTFZMfSksCisgICAgICAoeyJob21lIiwiX2hvbWUiLDAsV0laQVJEX0xWTH0pLAorICAgICAgKHsiKyIsIl9nb193aXpfaG9tZSIsMSxMRUFSTkVSX0xWTH0pfSk7Cit9CmRpZmYgLS1naXQgYS9zdGQvc2hlbGxzL21hZ2llci9vYmplY3RzLmMgYi9zdGQvc2hlbGxzL21hZ2llci9vYmplY3RzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ3NGY1NgotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9zaGVsbHMvbWFnaWVyL29iamVjdHMuYwpAQCAtMCwwICsxLDE2OCBAQAorLy8gJElkOiBvYmplY3RzLmMgODg0OCAyMDE0LTA2LTExIDIyOjA1OjA0WiBaZXNzdHJhICQKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKworI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDx0aGluZy9sYW5ndWFnZS5oPgorI2luY2x1ZGUgPHRoaW5nL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx0aGluZy9kZXNjcmlwdGlvbi5oPgorI2luY2x1ZGUgPGxpdmluZy9wdXRfYW5kX2dldC5oPgorI2luY2x1ZGUgPHBsYXllci5oPgorI2luY2x1ZGUgPG1hZ2llci5oPgorCisvLyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBJTklUSUFMSVNJRVJVTkcgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIworCisKK3N0YXRpYyBtaXhlZCBfcXVlcnlfbG9jYWxjbWRzKCkKK3sKKyAgcmV0dXJuICh7KHsiY2xvbmUiLCJfY2xvbmUiLDAsV0laQVJEX0xWTH0pLAorICAgICAgICAgICAoeyJzZXRjbXNnIiwiX3NldGNtc2ciLDAsV0laQVJEX0xWTH0pLAorICAgICAgICAgICAoeyJzZXRkbXNnIiwiX3NldGRtc2ciLDAsV0laQVJEX0xWTH0pLAorICAgICAgICAgICAoeyJkZXN0cnVjdCIsIl9kZXN0cnVjdCIsMCxXSVpBUkRfTFZMfSksCisgICAgICAgICAgfSk7Cit9CisKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQ0xPTkUgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIworCitzdGF0aWMgaW50IF9jbG9uZShzdHJpbmcgY21kbGluZSkKK3sKKyAgbWl4ZWQgKnRtcDsKKyAgaW50IGZsYWdzOworICBvYmplY3Qgb2I7CisgIHN0cmluZyAqYXJncywqYXJnczIsZXJyOworICAKKyAgY21kbGluZT1fdW5wYXJzZWRfYXJncygpOworICBhcmdzPXBhcnNlYXJncyhjbWRsaW5lLCZmbGFncyxDTE9ORV9PUFRTLDEpOworICBpZiAoZmxhZ3M9PS0xfHxzaXplb2YoYXJncykhPTEpCisgICAgcmV0dXJuIFVTQUdFKCJjbG9uZSBbLSIgQ0xPTkVfT1BUUyAiXSA8b2JqZWt0bmFtZT4iKTsKKyAgaWYgKGZsYWdzJkNMT05FX0YpCisgICAgY21kbGluZT1hcmdzWzBdOworICBlbHNlCisgIHsKKyAgICAvLyBldHdhcyB1bXN0YWVuZGxpY2gsIGFiZXIgc28ga2FubiBtYW4gYXVjaCBEYXRlaWVuIGNsb25lbiwKKyAgICAvLyB3ZW5uIG1hbiBrZWluZSBMZXNlcmVjaHRlIGhhdC4gTWFuIG11c3MgYWJlciBpbSBWZXJ6ZWljaG5pcworICAgIC8vIGxlc2VuIGtvZW5uZW4KKyAgICBhcmdzMj1leHBsb2RlKGFyZ3NbMF0sIi8iKTsKKyAgICBpZiAoYXJnczJbPDFdWzwxXT09Jy4nKSBhcmdzMls8MV0rPSJjIjsKKyAgICBlbHNlIGlmIChhcmdzMls8MV1bPDIuLjwxXSE9Ii5jIikgYXJnczJbPDFdKz0iLmMiOworICAgIHRtcD1maWxlX2xpc3QoKHtpbXBsb2RlKGFyZ3MyWzAuLjwyXSwiLyIpKyIvKiJ9KSxNT0RFX0NMT05FLDAsIiIsCisgICAgICAgICAgICAgICAgICBhcmdzMls8MV0pOworICAgIGlmICghc2l6ZW9mKHRtcCl8fHRtcFswXVtGSUxFU0laRV08MCkKKyAgICAgIHJldHVybiBwcmludGYoImNsb25lOiAlczogRGF0ZWkgZXhpc3RpZXJ0IG5pY2h0LlxuIixhcmdzWzBdKSwxOworICAgIGNtZGxpbmU9dG1wWzBdW0ZVTExOQU1FXTsKKyAgfQorCisgIGlmIChlcnI9Y2F0Y2gob2I9Y2xvbmVfb2JqZWN0KGNtZGxpbmUpKXx8IW9iKQorICAgIHJldHVybiBwcmludGYoImNsb25lOiAlczogT2JqZWt0IGtvbm50ZSBuaWNodCBlcnpldWd0IHdlcmRlbi5cbiIKKyAgICAgICAgICAgICAgICAgICJHcnVuZDogJU8iLAorICAgICAgICAgICAgICAgICAgYXJnc1swXSxlcnJ8fCJ1bmJla2FubnQiKSwxOworICBpZiAoIW9iamVjdHAob2IpKQorICAgIHJldHVybiBwcmludGYoImNsb25lOiAlczogT2JqZWt0IGJlaW0gRXJ6ZXVnZW4gemVyc3RvZXJ0LlxuIiwKKyAgICAgICAgICAgICAgICAgIGFyZ3NbMF0pLDE7CisgIGlmICgob2ItPm1vdmUodGhpc19vYmplY3QoKSxNX0dFVCk+MCkgfHwgCisgICAgICAoIW9iamVjdHAob2IpfHxvYi0+bW92ZShlbnZpcm9ubWVudCgpLE1fTk9DSEVDSyk+MCl8fCFvYmplY3RwKG9iKSkKKyAgeworICAgIGlmICghb2JqZWN0cChvYikpCisgICAgICByZXR1cm4gcHJpbnRmKCJjbG9uZTogJXM6IE9iamVrdCBiZWltIEVyemV1Z2VuIHplcnN0b2VydC5cbiIsCisgICAgICAgICAgICAgICAgICBhcmdzWzBdKSwxOworICAgIHByaW50ZigiQ2xvbmU6ICVzIGVyemV1Z3QuXG4iLG9iamVjdF9uYW1lKG9iKSk7CisgICAgdGVsbF9yb29tKGVudmlyb25tZW50KHRoaXNfb2JqZWN0KCkpLAorICAgICAgICAgICAgICBzcHJpbnRmKCIlcyAlcy5cbiIsTmFtZShXRVIsMSksUXVlcnlQcm9wKFBfQ0xPTkVfTVNHKSksCisgICAgICAgICAgICAgICAgICAgICAgKHsgdGhpc19vYmplY3QoKX0pKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQodGhpc19vYmplY3QoKSksCisgICAgICAgICAgICBzcHJpbnRmKCIlcyBtYWx0IHdpbGRlIFplaWNoZW4gaW4gZGllIEx1ZnQgdW5kICIKKyAgICAgICAgICAgICAgICAgICAgIm11cm1lbHQgdm9yIHNpY2ggaGluLCBhYmVyIG5pY2h0cyAiCisgICAgICAgICAgICAgICAgICAgICJwYXNzaWVydC4uLlxuIixOYW1lKFdFUiwxKSksCisgICAgICAgICAgICAoeyB0aGlzX29iamVjdCgpfSkpOworICBkZXN0cnVjdChvYik7CisgIHByaW50ZigiQ2xvbmU6ICVzOiBPYmpla3Qga29ubnRlIG5pY2h0IGJld2VndCB3ZXJkZW4uIixhcmdzWzBdKTsKKyAgcmV0dXJuIDE7Cit9CisKKworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIERFU1RSVUNUICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjCisKKy8vCisvLyBfZGVzdHJ1Y3Q6IE9iamVrdGUgemVyc3RvZXJlbgorLy8KKworc3RhdGljIGludCBfZGVzdHJ1Y3Qoc3RyaW5nIGNtZGxpbmUpCit7CisgIGludCBmbGFnczsKKyAgbWl4ZWQgKmFyZ3M7CisgIG9iamVjdCBvYjsKKworICBpZiAoIXNpemVvZihjbWRsaW5lPV91bnBhcnNlZF9hcmdzKCkpKQorICAgIHJldHVybiBVU0FHRShxdWVyeV92ZXJiKCkrIiA8b2JqZWt0bmFtZT4iKTsKKyAgYXJncz1maW5kX29icyhsb3dlcl9jYXNlKGNtZGxpbmUpLFBVVF9HRVRfTk9ORSk7CisgIGlmICghYXJnc3x8IXNpemVvZihhcmdzKSkKKyAgeworICAgIGlmICghKG9iPWZpbmRfb2JqZWN0KGNtZGxpbmUpKSkKKyAgICB7CisgICAgICBub3RpZnlfZmFpbChxdWVyeV92ZXJiKCkrIjogT2JqZWt0IFwiIiArY21kbGluZSsKKyAgICAgICAgICAgICAgICAgICJcIiBuaWNodCBnZWZ1bmRlbi5cbiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisgIGVsc2UKKyAgICBvYj1hcmdzWzBdOworICBjbWRsaW5lPWNhcGl0YWxpemUodG9fc3RyaW5nKG9iLT5uYW1lKFdFUikpKTsKKyAgZmxhZ3M9KGludClvYi0+UXVlcnlQcm9wKFBfUExVUkFMKTsgLy8gTWlzc2JyYXVjaCB2b24gZmxhZ3MgOm8pCisgIGlmIChxdWVyeV92ZXJiKCk9PSJkZXN0cnVjdCIpCisgIHsKKyAgICBpZiAoIW9iLT5yZW1vdmUoKSkKKyAgICB7CisgICAgICBub3RpZnlfZmFpbChjbWRsaW5lKyIgd2lsbCBuaWNodCB6ZXJzdG9lcnQgd2VyZGVuIVxuIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgZWxzZSBkZXN0cnVjdChvYik7CisgIGlmICghb2IpCisgIHsKKyAgICBpZiAoIVF1ZXJ5UHJvcChQX0lOVklTKSkKKyAgICB7CisgICAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQodGhpc19vYmplY3QoKSksCisgICAgICAgICAgICAgICAgc3ByaW50ZigiJXMgJXMuXG4iLGNtZGxpbmUsUXVlcnlQcm9wKFBfREVTVFJVQ1RfTVNHKSksCisgICAgICAgICAgICAgICAgKHsgdGhpc19vYmplY3QoKSB9KSk7CisgICAgfQorICAgIHByaW50ZigiJXMgdyVzIHZvbiBEaXIgemVyc3RhZXVidC5cbiIsY21kbGluZSwoZmxhZ3M/ImVyZGVuIjoiaXJkIikpOworICB9CisgIGVsc2UKKyAgICBwcmludGYoIiVzIGthbm4gbmljaHQgemVyc3RvZXJ0IHdlcmRlbi5cbiIsY21kbGluZSk7CisgIHJldHVybiAxOworfQorCisvLyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgU2V0Q01zZywgU2V0RE1zZyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK3N0YXRpYyBpbnQgX3NldGNtc2coc3RyaW5nIHN0cikKK3sKKyAgcHJpbnRmKCJCZWltIENsb25lbiB2b24gT2JqZWt0ZW4gc2VoZW4gZGllIEFuZGVyZW4gbnVuOlxuIgorICAgICAgICAgIjxEZWluIE5hbWU+ICVzLlxuIiwKKyAgICAgICAgIChTZXRQcm9wKFBfQ0xPTkVfTVNHLCBfdW5wYXJzZWRfYXJncygpfHwiemF1YmVydCBldHdhcyBhdXMgIgorICAgICAgICAgICsgUXVlcnlQb3NzUHJvbm91bihNQUxFLFdFTSkgKyAiIEFlcm1lbCBoZXJ2b3IiKSkpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfc2V0ZG1zZyhzdHJpbmcgc3RyKQoreworICBwcmludGYoIkJlaW0gWmVyc3RvZXJlbiB2b24gT2JqZWt0ZW4gc2VoZW4gZGllIEFuZGVyZW4gbnVuOlxuIgorICAgICAgICAgIjxPYmpla3Q+ICVzLlxuIiwKKyAgICAgICAgIFNldFByb3AoUF9ERVNUUlVDVF9NU0csIF91bnBhcnNlZF9hcmdzKCl8fCJ3aXJkIHZvbiAiICsgbmFtZShXRVIsMSkKKyAgICAgICAgICArICIgemVyc3RhZXVidCIpKTsKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9zdGQvc2hlbGxzL21hZ2llci9wYXJzaW5nLmMgYi9zdGQvc2hlbGxzL21hZ2llci9wYXJzaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU1MzMyZAotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9zaGVsbHMvbWFnaWVyL3BhcnNpbmcuYwpAQCAtMCwwICsxLDM3MCBAQAorLy8gJElkOiBwYXJzaW5nLmMgOTE0MiAyMDE1LTAyLTA0IDIyOjE3OjI5WiBaZXNzdHJhICQKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKy8vI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCisjaW5jbHVkZSA8ZmlsZXMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxsb2dnaW5nLmg+CisjaW5jbHVkZSA8cmVnZXhwLmg+CisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPG1hZ2llci5oPgorI2luY2x1ZGUgPHRoaW5nL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxwbGF5ZXIuaD4KKworLy8KKy8vIGdsb2IycmVnZXhwOiBBcmd1bWVudCB2b24gZ2xvYiBpbiBSZWdleHAgdW13YW5kZWxuCisvLyBzdHI6IEFyZ3VtZW50IChhbHMgUmVmZXJlbnopCisvLworCitzdGF0aWMgc3RyaW5nIGdsb2IycmVnZXhwKHN0cmluZyBzdHIpCit7CisgIHN0cj1yZWdyZXBsYWNlKHN0ciwiKFtcXC5cXF5cXCRcXFtcXF1cXChcXCldKSIsIlxcXFxcXDEiLFJFX1RSQURJVElPTkFMfDEpOworICBzdHI9cmVncmVwbGFjZShzdHIsIlxcKiIsIi4qIixSRV9UUkFESVRJT05BTHwxKTsKKyAgcmV0dXJuIHNwcmludGYoIl4lcyQiLHJlZ3JlcGxhY2Uoc3RyLCI/IiwiLiIsUkVfVFJBRElUSU9OQUx8MSkpOworfQorCisvLworLy8gdG9fZmlsZW5hbWU6IEFyZ3VtZW50IGluIERhdGVpbmFtZW4gdW13YW5kZWxuCisvLyBzdHI6ICBBcmd1bWVudAorLy8gUnVlY2tnYWJlOiBEYXRlaW5hbWUKKy8vCisKK3N0YXRpYyBtaXhlZCB0b19maWxlbmFtZShzdHJpbmcgc3RyKQoreworICBzdHJpbmcgKnRtcCxwLG5ld2ZuOworICBpbnQgaTsKKy8vIFRlc3RlbiBvYiAuLiBpbiBlaW5lbSBGaWxlbmFtZW5hYnNjaG5pdHQsIGZhbGxzIFZlcnNpb24gPDMuMi41CisgIHRtcD1leHBsb2RlKHN0ciwiLyIpOworLy8gVGVzdGVuIGF1ZiBQZmFkdmFyaWFibGUKKyAgaWYgKHNpemVvZih0bXBbMF0pICYmIHRtcFswXVswXT09JyQnIAorICAgICAgJiYgbV9jb250YWlucygmcCxRdWVyeVByb3AoUF9WQVJJQUJMRVMpLHRtcFswXVsxLi5dKSkKKyAgICB0bXBbMF09cDsKKy8vIFBmYWQgYWJzb2x1dCBtYWNoZW4gKEhhdCBkYW5hY2ggbm9jaCBXaWxkY2FyZHMgZHJpbm5lbikgb2RlciBhdWNoIG5pY2h0CisgIHJldHVybiBtYXN0ZXIoKS0+bWFrZV9wYXRoX2Fic29sdXRlKGltcGxvZGUodG1wLCIvIikpOworfQorCisKKy8vCisvLyBfcGFyc2VhcmdzKCk6IEtvbW1hbmRvemVpbGVuYWJzY2huaXR0IHBhcnNlbgorLy8gc3RyOiAgICAgICAgIEtvbW1hbmRvemVpbGVuYWJzY2huaXR0CisvLyBsaW5lOiAgICAgICAgQXJyYXkgdm9uIGdlcGFyc3RlbiBLb21tYW5kb3plaWxlbmFic2Nobml0dGVuIChSZWZlcmVueikKKy8vIGZsYWdzOiAgICAgICBBbHMgUmVmZXJlbnogdWViZXJnZWJlbmVyIEZsYWctV2VydAorLy8gb3B0czogICAgICAgIEVybGF1YnRlIEZsYWdzCisvLyBidWlsZF9mbjogICAgRmlsZW5hbWVuIGFlbmRlcm4KKy8vCisKK3ByaXZhdGUgdm9pZCBfcGFyc2VhcmdzKHN0cmluZyBzdHIsIHN0cmluZyAqbGluZSxpbnQgZmxhZ3Msc3RyaW5nIG9wdHMsCisgICAgICAgICAgICAgICAgICAgICBpbnQgYnVpbGRfZm4gKQoreworCisvLyBTdHJpbmdzIGluICIiIGVyaGFsdGVuCisgIGlmKHN0clswXSA9PSAiXCIiWzBdKSAgCisgIHsgCisgICAgbGluZSArPSAoeyBzdHJbMS4uPDJdIH0pOworICAgIHJldHVybjsgCisgIH0gIAorLy8gIEZsYWdzIHBhcnNlbgorICBpZihzdHJbMF0gPT0gJy0nKSAgCisgIHsgCisgICAgaW50IGksajsKKyAgICBpPXNpemVvZihzdHIpOworICAgIHdoaWxlKGktLSkKKyAgICAgIGlmIChzdHJbaV0hPSctJykKKyAgICAgIHsKKyAgICAgICAgaWYoKGogPSBtZW1iZXIob3B0cywgc3RyW2ldKSkgIT0gLTEpCisgICAgICAgICAgZmxhZ3MgfD0gKDEgPDwgaik7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGZsYWdzPS0xOworICAgICAgICAgIHByaW50ZigiRGFzIEZsYWcgJy0lYycgd2lyZCB2b24gZGVtIEJlZmVobCAnJXMnIG5pY2h0ICIKKyAgICAgICAgICAgICAgICAgInVudGVyc3R1ZXR6dC5cbiIsc3RyW2ldLHF1ZXJ5X3ZlcmIoKXx8IiIpOworICAgICAgICB9CisgICAgICB9CisgICAgcmV0dXJuOworICB9CisgIGlmIChidWlsZF9mbikKKyAgeworICAgIGlmIChzdHI9KHN0cmluZyl0b19maWxlbmFtZShzdHIpKSBsaW5lKz0oeyBzdHIgfSk7CisgIH0gCisgIGVsc2UKKyAgICBsaW5lKz0gKHsgc3RyIH0pOworfQorCisKKy8vCisvLyBwYXJzZWFyZ3MoKSAtIHplcmxlZ3QgS29tbWFuZG96ZWlsZSBpbiBlaW4gQXJyYXk6CisvLyBjbWRsaW5lOiAgICAgS29tbWFuZG96ZWlsZQorLy8gZmxhZ3M6ICAgICAgIEFscyBSZWZlcmVueiB1ZWJlcmdlYmVuZXIgbGVlcmVyIEludGVnZXJ3ZXJ0LiBFbnRoYWVsdCBkYW5hY2gKKy8vICAgICAgICAgICAgICBkaWUgRmxhZ3MKKy8vIG9wdHM6ICAgICAgICBTdHJpbmcgbWl0IGVybGF1YnRlbiBPcHRpb25lbgorLy8gYnVpbGRfZm46ICAgIEZpbGVuYW1lbiB1bWJhdWVuPworLy8gUnVlY2tnYWJlOiBBcnJheSBkZXIgS29tbWFuZG96ZWlsZW5hcmd1bWVudGUgKGF1c3NlciBGbGFncykKKy8vCisKK3N0YXRpYyBzdHJpbmcgKnBhcnNlYXJncyhzdHJpbmcgY21kbGluZSxpbnQgZmxhZ3MsIHN0cmluZyBvcHRzLGludCBidWlsZF9mbikKK3sKKyAgaW50IGk7CisgIHN0cmluZyAqbGluZTsKKyAgbGluZT0oe30pOworICBpZiAoIXNpemVvZihjbWRsaW5lKSkgcmV0dXJuICh7fSk7CisgIG1hcChyZWdleHBsb2RlKGNtZGxpbmUsIltcIl1bXlwiXSpbXCJdfCAiLCBSRV9UUkFESVRJT05BTCktKHsiICIsICIifSksCisgICAgICAgICAgICAjJ19wYXJzZWFyZ3MsICZsaW5lLCAmZmxhZ3Msb3B0cywgYnVpbGRfZm4pOworICByZXR1cm4gbGluZSAtICh7IiJ9KTsKK30KKworLy8KKy8vIF92Y19tYXA6IFZDLU9iamVrdG5hbWVuIHp1IEFycmF5cyB1bXdhbmRlbG4gKHsgbmFtZSwgLTEsIHByb2dyYW1fdGltZSgpIH0pCisvLworCitwcml2YXRlIGludCAqX3ZjX21hcChvYmplY3Qgb2IsbWl4ZWQgKmxpc3QpCit7CisgIGxpc3QrPSh7IGV4cGxvZGUob2JqZWN0X25hbWUob2IpLCIvIilbPDFdLC0xLHByb2dyYW1fdGltZShvYikgfSk7CisgIHJldHVybiAwOworfQorCisKKy8vCisvLyBfZ2V0X2ZpbGVzOiBGaWxlZGF0ZW4gYmVpbSBSZWt1cnNpdmVuIGtvcGllcmVuIGVyc3RlbGxlbgorLy8gZGlybmFtZTogICAgQmVhcmJlaXRldGVzIFZlcnplaWNobmlzCisvLyBtYXNrOiAgICAgICBNYXNrZSwgZGVyIERhdGVpbmFtZW4gZ2VudWVnZW4gbXVlc3NlbgorLy8gbW9kZTogICAgICAgV2VsY2hlIERhdGVuIHdlcmRlbiBiZW5vZXRpZ3Q/IChzaWVoZSBtYWdpZXIuaCkKKy8vIGRlc3Q6ICAgICAgIEluIHdlbGNoZXMgVmVyemVpY2huaXMgc29sbCBrb3BpZXJ0IHdlcmRlbj8KKy8vIFJ1ZWNrZ2FiZTogIEFsaXN0IG1pdCBkZW4gRGF0ZWlpbmZvcm1hdGlvbmVuCisvLworCitwcml2YXRlIHZhcmFyZ3MgbWl4ZWQgKl9nZXRfZmlsZXMoc3RyaW5nIGRpcm5hbWUsc3RyaW5nIG1hc2ssaW50IG1vZGUsc3RyaW5nIGRlc3QpCit7CisgIG1peGVkICpmaWxlcywqdG1wLCpkYXRhOworICBzdHJpbmcgZnVsbG5hbWUsYmFzZTsKKworICAvL0RFQlVHKCJfR0Y6IERJUk5BTUUgIiArIGRpcm5hbWUpOworICBkYXRhPWdldF9kaXIoZGlybmFtZSsiKiIsNyk7CisgIGlmKCFzaXplb2YoZGF0YSkpIHJldHVybiAoe30pOworICBmaWxlcz0oe30pOworIAorICB3aGlsZShzaXplb2YoZGF0YSkpCisgIHsKKyAgICB0bXA9KHt9KTsKKyAgICBiYXNlPWRhdGFbQkFTRU5BTUVdOworICAgIGZ1bGxuYW1lPWRpcm5hbWUrYmFzZTsKKyAgICBpZiAoYmFzZSE9Ii4iJiZiYXNlIT0iLi4iJiYoIShtb2RlPT1NT0RFX0dSRVAmJmJhc2U9PSJSQ1MiKSkmJgorICAgICAgICAoKGRhdGFbRklMRVNJWkVdPT0tMiYmCisgICAgICAgc2l6ZW9mKHRtcD1fZ2V0X2ZpbGVzKGZ1bGxuYW1lKyIvIixtYXNrLG1vZGUsCisgICAgICBkZXN0K2Jhc2UrIi8iKSkmJm1vZGUhPU1PREVfUk0pfHwhbWFza3x8c2l6ZW9mKHJlZ2V4cCgoeyBiYXNlIH0pLG1hc2ssIFJFX1RSQURJVElPTkFMKSkpKQorICAgIHsKKyAgICAgIC8vREVCVUcoIl9HRjogQURESU5HIEZJTEUgIiArIGZ1bGxuYW1lKTsKKyAgICAgIGZpbGVzKz0gKHsgZGF0YVswLi4yXSsoeyBmdWxsbmFtZSxkaXJuYW1lLGRlc3QrYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodG1wKSB9KSB9KTsKKyAgICB9CisgICAgaWYgKHNpemVvZihmaWxlcykrc2l6ZW9mKHRtcCk+TUFYX0FSUkFZX1NJWkUpCisgICAgICAgcmFpc2VfZXJyb3IoIlp1IHZpZWxlIEZpbGVzICg+MzAwMCkhISBBYmdlYnJvY2hlbiFcbiIpOworICAgIGZpbGVzKz10bXA7CisgICAgZGF0YT1kYXRhWzMuLl07CisgIH0KKyAgCisgIGlmKHNpemVvZihmaWxlcyk+MzAwJiYhSVNfQVJDSCh0aGlzX29iamVjdCgpKSkKKyAgICAvLyBUb2QgYWxsZW4gTGFnZ2VybiA6bykKKyAgICByYWlzZV9lcnJvcigiWnUgdmllbGUgRmlsZXMgKD4zMDApISEgQWJnZWJyb2NoZW4hXG4iKTsKKyAgcmV0dXJuIGZpbGVzOworfQorIAorCisvLworLy8gX2dldF9tYXRjaGluZzogUmVrdXJzaXZlIEZ1bmt0aW9uIHp1bSBlcm1pdHRlbG4gZGVyIEZpbGVzLCB3ZW5uIG1pdCBNYXNrZQorLy8gICAgICAgICAgICAgICAgZ2VhcmJlaXRldCB3aXJkICh6LkIuIGNwIC1tIC9ibGEvKi8qIC96aWVsICouYykKKy8vIHBhdGhtYXNrOiBBcnJheSwgZGFzIGRpZSBlaW56ZWxuZW4gRWxlbWVudGUgZGVyIE1hc2tlIChBcmcxKSBlbnRoYWVsdAorLy8gICAgICAgICAgICAgICAgICAgKHBlciBlZnVuOm9sZF9leHBsb2RlKGFyZzEsIi8iKSkKKy8vIGRlcHRoOiAgICAgQWt0dWVsbGVzIEVsZW1lbnQgdm9uIHBhdGhtYXNrCisvLyBwYXRoOiAgICAgIGltcGxvZGUocGF0aG1hc2tbMC4uZGVwdGhdLCIvIik7CisvLyBtb2RlOiAgICAgIFdlbGNoZSBEYXRlbiB3ZXJkZW4gYmVub2V0aWd0PyAoc2llaGUgbWFnaWVyLmgpCisvLyBmbGFnczogICAgIFdlbGNoZSBGbGFncyB3dXJkZW4gZ2VzZXR6dD8KKy8vIGRlc3Q6ICAgICAgWmllbHZlcnplaWNobmlzIChiZWltIGtvcGllcmVuL21vdmVuKQorLy8gZmlsZW1hc2s6ICBNYXNrZSwgZGVyIGRpZSBGaWxlcyBnZW51ZWdlbiBtdWVzc2VuCisvLyBSdWVja2dhYmU6IEFsaXN0IG1pdCBkZW4gRGF0ZWlpbmZvcm1hdGlvbmVuCisvLworCitwcml2YXRlIG1peGVkICpfZ2V0X21hdGNoaW5nKHN0cmluZyAqcGF0aG1hc2ssIGludCBkZXB0aCwgc3RyaW5nIHBhdGgsIAorICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZSwgaW50IHJlY3Vyc2l2ZSwgc3RyaW5nIGRlc3Qsc3RyaW5nIGZpbGVtYXNrKQoreworICBtaXhlZCAqZGF0YSwqdG1wLCpmaWxlczsKKyAgc3RyaW5nIGJhc2UsZnVsbDsKKworICAvL0RFQlVHKCJfR006IFBNOiAiICsgcGF0aG1hc2tbZGVwdGhdKTsKKyAgLy9ERUJVRygiX0dNOiBGTTogIiArIGZpbGVtYXNrKTsKKyAgZGF0YT1nZXRfZGlyKHBhdGgrcGF0aG1hc2tbZGVwdGgrK10sR0VURElSX05BTUVTfEdFVERJUl9TSVpFU3xHRVRESVJfREFURVMpfHwoe30pOworICBpZiAoIXNpemVvZihkYXRhKSkgcmV0dXJuICh7fSk7CisgIGZpbGVzPSh7fSk7CisgIHdoaWxlKHNpemVvZihkYXRhKSkKKyAgeworICAgIGlmICgoYmFzZT1kYXRhW0JBU0VOQU1FXSk9PSIuInx8YmFzZT09Ii4uIikKKyAgICB7CisgICAgICBkYXRhPWRhdGFbMy4uXTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBmdWxsPXBhdGgrYmFzZTsKKyAgICAvL0RFQlVHKCJfR006IEZVTEw6ICIgKyBmdWxsKTsKKyAgICBpZiAoKGRhdGFbRklMRVNJWkVdPT0tMikmJihzaXplb2YocGF0aG1hc2spPmRlcHRoKSYmCisgICAgICAgICghKG1vZGU9PU1PREVfR1JFUCYmYmFzZT09IlJDUyIpKSkKKyAgICB7CisgICAgICAvL0RFQlVHKCJERVNDRU5EIElOVE8gIiArIGZ1bGwpOworICAgICAgdG1wPV9nZXRfbWF0Y2hpbmcocGF0aG1hc2ssZGVwdGgsZnVsbCsiLyIsbW9kZSxyZWN1cnNpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAocmVjdXJzaXZlP2Rlc3QrYmFzZSsiLyI6ZGVzdCksZmlsZW1hc2spOworICAgIH0KKyAgICBlbHNlIHRtcD0oe30pOworICAgIC8vREVCVUcoIkRFUFRIOiAiICsgZGVwdGggKyAiIDogIiArIHNpemVvZihwYXRobWFzaykpOworICAgIGlmKCghZmlsZW1hc2smJihkZXB0aD09c2l6ZW9mKHBhdGhtYXNrKSkpfHwKKyAgICAgICAgKGZpbGVtYXNrJiYoZGVwdGgrMj5zaXplb2YocGF0aG1hc2spKSYmCisgICAgICAgIHNpemVvZihyZWdleHAoKHsgYmFzZSB9KSxmaWxlbWFzayxSRV9UUkFESVRJT05BTCkpKXx8CisgICAgICAgKChtb2RlPT1NT0RFX0NQfHxtb2RlPT1NT0RFX01WfHwoZmlsZW1hc2smJgorICAgICAgICAobW9kZT09TU9ERV9STSkmJnNpemVvZihyZWdleHAoKHsgYmFzZX0pLGZpbGVtYXNrLFJFX1RSQURJVElPTkFMKSkpKSYmCisgICAgICAgIHNpemVvZih0bXApKSkKKyAgICB7CisgICAgICAvL0RFQlVHKCJBRERJTkc6ICIgKyBiYXNlKyAiIDogIisgZnVsbCApOworICAgICAgZmlsZXMrPSh7IGRhdGFbMC4uMl0rKHsgZnVsbCwgcGF0aCwgZGVzdCtiYXNlLHNpemVvZih0bXApfSkgfSk7CisgICAgfQorICAgIGlmIChzaXplb2YoZmlsZXMpK3NpemVvZih0bXApPk1BWF9BUlJBWV9TSVpFKQorICAgICAgIHJhaXNlX2Vycm9yKCJadSB2aWVsZSBGaWxlcyAoPjMwMDApISEgQWJnZWJyb2NoZW4hXG4iKTsKKyAgICBmaWxlcys9dG1wOworICAgIGRhdGE9ZGF0YVszLi5dOworICB9CisgIGlmKHNpemVvZihmaWxlcyk+MzAwJiYhSVNfQVJDSCh0aGlzX29iamVjdCgpKSkKKyAgICAvLyBUb2QgYWxsZW4gTGFnZ2VybiEKKyAgICByYWlzZV9lcnJvcigiWnUgdmllbGUgRmlsZXMgKD4zMDApISEgQWJnZWJyb2NoZW4hXG4iKTsKKyAgcmV0dXJuIGZpbGVzOworfQorCisKKy8vCisvLyBnZXRfZmlsZXM6IEJhc2lzcm91dGluZSB6dW0gRXJtaXR0ZWxuIGRlciB6dSBiZWFyYmVpdGVuZGVuIERhdGVpZW4KKy8vIGZpbGVuYW1lOiAgUGZhZG1hc2tlLCBWZXJ6ZWljaG5pc25hbWUsIERhdGVpbmFtZSwgZGVyIGJlYXJiZWl0ZXQgd2VyZGVuCisvLyAgICAgICAgICAgIHNvbGwKKy8vIG1vZGU6ICAgICAgV2VsY2hlIERhdGVuIHdlcmRlbiBiZW5vZXRpZ3Q/IChzaWVoZSBtYWdpZXIuaCkKKy8vIHJlY3Vyc2l2ZTogQXVjaCBVbnRlcnZlcnplaWNobmlzc2UgYmVhcmJlaXRlbj8KKy8vIGRlc3Q6ICAgICAgV2VubiBrb3BpZXJ0IHdlcmRlbiBzb2xsOiB3b2hpbj8KKy8vIGZpbGVtYXNrOiAgTWFza2UsIGRlciBkaWUgRGF0ZWluYW1lbiBnZW51ZWdlbiBtdWVzc2VuCisvLyBSdWVja2dhYmU6IEFsaXN0IG1pdCBkZW4gRGF0ZWlpbmZvcm1hdGlvbmVuCisvLworCitzdGF0aWMgdmFyYXJncyBtaXhlZCAqZ2V0X2ZpbGVzKHN0cmluZyBmaWxlbmFtZSwgaW50IG1vZGUsIGludCByZWN1cnNpdmUsIHN0cmluZyBkZXN0LCBzdHJpbmcgZmlsZW1hc2spCit7IAorICBzdHJpbmcgZnVsbCxwYXRoLGJhc2UsKnBhdGhhcnJheSwqdnJvb21zLGRlc3QyOworICBvYmplY3QgdmNvbXBpbGVyOworICBtaXhlZCAqZmlsZXMsKmRhdGE7CisKKyAgLy8gREVCVUcoIkdGOiAiICsgZmlsZW5hbWUpOworICAvLyBERUJVRygiUkVDOiAiICsgcmVjdXJzaXZlICsgIiBNT0RFOiAiICsgbW9kZSk7CisgIC8vIGlmIChkZXN0WzwxLi48MV0hPSIvIikgREVCVUcoIkRFU1Q6ICIgKyBkZXN0KTsKKyAgaWYgKGZpbGVuYW1lPT0iLyIpCisgICAgeworICAgICAgc3dpdGNoIChtb2RlKQorICAgICAgeworICAgICAgICBjYXNlIE1PREVfTFNBOiByZXR1cm4gKHsoeyAiIiwgLTIsIDAsIiIsIiIsIiIsMCB9KX0pOworICAgICAgICBkZWZhdWx0OiBpZiAoIXJlY3Vyc2l2ZSkgcmV0dXJuICh7fSk7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgcGF0aGFycmF5PWV4cGxvZGUoZmlsZW5hbWUsIi8iKTsKKyAgaWYoIXNpemVvZihkYXRhPWdldF9kaXIoZmlsZW5hbWUsNyl8fCh7fSkpJiYKKyAgICAgKG1vZGU9PU1PREVfVVBEfHxtb2RlPT1NT0RFX01PUkV8fG1vZGU9PU1PREVfRUQpKQorICAgIGRhdGE9Z2V0X2RpcihmaWxlbmFtZSsiLmMiLDcpfHwoe30pOworICBpZiAoKG1vZGU9PU1PREVfTFNBfHxtb2RlPT1NT0RFX0xTQikmJgorICAgICAgKHZjb21waWxlciA9IGZpbmRfb2JqZWN0KGltcGxvZGUocGF0aGFycmF5WzAuLjwyXSwiLyIpKyIvdmlydHVhbF9jb21waWxlciIpKSAmJgorICAgICAgcG9pbnRlcnAodnJvb21zPShtaXhlZCAqKXZjb21waWxlci0+UXVlcnlPYmplY3RzKCkpKQorICAgIG1hcCh2cm9vbXMsIydfdmNfbWFwLCZkYXRhKTsKKyAgZmlsZXM9KHt9KTsKKyAgaWYgKHNpemVvZihkYXRhKSkgLy8gcGFzc2VuZGUgZmlsZXMKKyAgeworICAgIG1peGVkICpzdWJmaWxlczsKKyAgICBzdWJmaWxlcz0oe30pOworICAgIHBhdGg9aW1wbG9kZShwYXRoYXJyYXlbMC4uPDJdLCIvIikrIi8iOworICAgIHdoaWxlIChzaXplb2YoZGF0YSkpCisgICAgeworICAgICAgc3ViZmlsZXM9KHt9KTsKKyAgICAgIGJhc2U9ZGF0YVtCQVNFTkFNRV07CisgICAgICBpZiAobW9kZT09TU9ERV9MU0J8fChiYXNlIT0iLiImJmJhc2UhPSIuLiIpKQorICAgICAgeworICAgICAgICAvL0RFQlVHKCJQQVRIOiAiICsgcGF0aCsiIEJBU0U6ICIgKyBiYXNlICsgIiBNT0RFOiAiICsgbW9kZSk7CisgICAgICAgIGZ1bGw9cGF0aCtiYXNlOworICAgICAgICBkZXN0Mj0oKGRlc3Q9PSIvInx8ZmlsZV9zaXplKGRlc3RbMC4uPDJdKT09LTIpPworICAgICAgICAgICAgICAgKGRlc3QrYmFzZSk6KGRlc3Q9PSIvIj8iLyI6ZGVzdFswLi48Ml0pKTsKKyAgICAgICAgLy9ERUJVRygiREVTVDogIiArIGRlc3QpOworICAgICAgICBpZiAocmVjdXJzaXZlJiZkYXRhW0ZJTEVTSVpFXT09LTIpIC8vIFZlcnplaWNobmlzLCBSZWt1cnNpdgorICAgICAgICAgIHN1YmZpbGVzPV9nZXRfZmlsZXMoZnVsbCsiLyIsZmlsZW1hc2ssbW9kZSxkZXN0MisiLyIpOworICAgICAgICBpZiAoIShmaWxlbWFzayYmIXNpemVvZihzdWJmaWxlcykmJiFzaXplb2YocmVnZXhwKCh7IGJhc2UgfSksZmlsZW1hc2ssUkVfVFJBRElUSU9OQUwpKSkpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIWZpbGVtYXNrfHxtb2RlIT1NT0RFX1JNKQorICAgICAgICAgICAgZmlsZXMrPSh7IGRhdGFbMC4uMl0rKHsgZnVsbCwgcGF0aCwgZGVzdDIsc2l6ZW9mKHN1YmZpbGVzKX0pIH0pOworICAgICAgICAgIGlmIChzaXplb2YoZmlsZXMpK3NpemVvZihzdWJmaWxlcyk+TUFYX0FSUkFZX1NJWkUpCisgICAgICAgICAgICByYWlzZV9lcnJvcigiWnUgdmllbGUgRmlsZXMgKD4zMDAwKSEhIEFiZ2Vicm9jaGVuIVxuIik7CisgICAgICAgICAgZmlsZXMrPXN1YmZpbGVzOworICAgICAgICB9CisgICAgICB9CisgICAgICBkYXRhPWRhdGFbMy4uXTsKKyAgICB9CisgICAgcmV0dXJuIGZpbGVzOworICB9CisvLyBGaWxlIGV4aXN0aWVydCBuaWNodCAtPiBXaWxkY2FyZCBvZGVyIHRhdHNhZWNobGljaCBuaWNodCBleGlzdGVudAorLy8gQmVoYW5kZWxuIGplIG5hY2ggbW9kZQorICBzd2l0Y2gobW9kZSkKKyAgeworICAgIGNhc2UgTU9ERV9DUDoKKyAgICBjYXNlIE1PREVfTVY6CisgICAgY2FzZSBNT0RFX0NEOgorICAgIGNhc2UgTU9ERV9MU0E6CisgICAgICBmaWxlcz1fZ2V0X21hdGNoaW5nKHBhdGhhcnJheSsoZmlsZW1hc2s/KHsgIioiIH0pOih7fSkpLDEsIi8iLG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN1cnNpdmUsZGVzdCxmaWxlbWFzayk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiBicmVhazsgCisgIH0KKyAgcmV0dXJuIGZpbGVzOworfQorCisKKy8vCisvLyBmaWxlX2xpc3QoKTogTGlzdGUgZGVyIEZpbGVpbmZvcm1hdGlvbmVuCisvLyBmaWxlczogICAgIEFycmF5IGRlciBGaWxlbmFtZW4gTUlUIFdpbGRjYXJkcworLy8gbW9kZTogICAgICBXZWxjaGUgRGF0ZW4gd2VyZGVuIGJlbm9ldGlndAorLy8gcmVjdXJzaXZlOiBSZWt1cnNpdiBsaXN0ZW4/CisvLyBkZXN0OiAgICAgIFppZWx2ZXJ6ZWljaG5pcworLy8gbWFzazogICAgICBNYXNrZSAocmVnZXhwLCB3ZW5uIGRlZmluaWVydCkKKy8vIFJ1ZWNrZ2FiZTogTGlzdGUgZGVyIGJldHJvZmZlbmVuIEZpbGVzCisvLworCitzdGF0aWMgdmFyYXJncyBtaXhlZCAqZmlsZV9saXN0KHN0cmluZyAqZmlsZXMsIGludCBtb2RlLCBpbnQgcmVjdXJzaXZlLCBzdHJpbmcgZGVzdCwgc3RyaW5nIG1hc2spCit7CisgIHN0cmluZyAqbGlzdCxlcnIsKnJlc3VsdDsKKyAgaW50IGksajsKKyAgbGlzdD0oe30pOworICBpZiAobWFzaykgbWFzaz1nbG9iMnJlZ2V4cChtYXNrKTsKKyAgaj1zaXplb2YoZmlsZXMpOworICBmb3IoaT0wO2k8ajtpKyspCisgIHsKKyAgICAvLyBBYnNjaGxpZXNzZW5kZW4gLyB2b24gUGZhZG5hbWVuIGFic2NobmVpZGVuLCB3ZWlsIGluIGRpZXNlbSBGYWxsIAorICAgIC8vIGRpZSBJbmhhbHRlIGRlciBlcnN0ZW4gVW50ZXJ2ZXJ6ZWljaG5pc2ViZW5lIG1pdCBhdXNnZWdlYmVuCisgICAgLy8gd3VyZGVuLiBVcnNhY2hlIGhpZXJmdWVyIGlzdCBlaW4gRml4IGFuIGZ1bGxfcGF0aF9hcnJheSgpIGltIAorICAgIC8vIE1hc3Rlcm9iamVrdCwgZGVyIGRhenUgZnVlaHJ0ZSwgZGFzcyBnZXRfZGlyKCkgZGVuIGFic2NobGllc3NlbmRlbiAvCisgICAgLy8gZGVzIHVlYmVyZ2ViZW5lbiBQZmFkZXMgamV0enQga29ycmVrdCBiZWhhbmRlbHQuIFxvLworICAgIGlmICggc2l6ZW9mKGZpbGVzW2ldKSA+IDEgJiYgZmlsZXNbaV1bPDFdID09ICcvJyApCisgICAgeworICAgICAgZmlsZXNbaV0gPSBmaWxlc1tpXVswLi48Ml07CisgICAgICBpZiAoICFzaXplb2YoZmlsZXNbaV0pICkKKyAgICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChlcnI9Y2F0Y2gobGlzdCs9Z2V0X2ZpbGVzKGZpbGVzW2ldLG1vZGUscmVjdXJzaXZlLGRlc3QsbWFzaykpKQorICAgIHsKKyAgICAgIHByaW50ZigiRmVobGVyIGF1ZmdldHJldGVuOiAlc1xuIixlcnIpOworICAgICAgbG9nX2ZpbGUoU0hFTExMT0coIkZJTEVfTElTVCIpLAorICAgICAgICAgICAgICAgc3ByaW50ZigiJXMgZnVlaHJ0ZSBmb2xnZW5kZXMgS29tbWFuZG8gYXVzOiAoWmVpdDogJXMpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICIgID4+JXMgJXM8PFxuIgorICAgICAgICAgICAgICAgICAgICAgICAiICBGb2xnZW5kZXIgRmVobGVyIHRyYXQgZGFiZWkgYXVmOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAiICAlc1xuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZCgpKXx8IjxVbmJla2FubnQ+IixkdGltZSh0aW1lKCkpLAorICAgICAgICAgICAgICAgICAgICAgICBxdWVyeV92ZXJiKCl8fCIqIixfdW5wYXJzZWRfYXJncygpfHwiKiIsZXJyfHwiKiIpKTsKKyAgICAgIHJldHVybiAoe30pOworICAgIH0KKyAgfQorICAgcmV0dXJuIGxpc3Q7Cit9CmRpZmYgLS1naXQgYS9zdGQvc2hlbGxzL21hZ2llci9wbGF5ZXJzLmMgYi9zdGQvc2hlbGxzL21hZ2llci9wbGF5ZXJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU2M2Q5ZAotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9zaGVsbHMvbWFnaWVyL3BsYXllcnMuYwpAQCAtMCwwICsxLDUyOSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHBsYXllcnMuYworLy8KKy8vICRJZDogcGxheWVycy5jIDk1NTEgMjAxNi0wNC0yMCAyMjo1NDo1OFogQXJhdGhvcm4gJAorI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8YW5zaS5oPgorI2luY2x1ZGUgPGxvZ2dpbmcuaD4KKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8bWFnaWVyLmg+CisjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHRoaW5nL2Rlc2NyaXB0aW9uLmg+CisjaW5jbHVkZSA8bGl2aW5nL2NvbW0uaD4KKyNpbmNsdWRlIDxwbGF5ZXIuaD4KKyN1bmRlZiBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bW92aW5nLmg+CisKK3N0YXRpYyBtaXhlZCBfcXVlcnlfbG9jYWxjbWRzKCkKK3sKKyAgcmV0dXJuICh7KHsiemFwIiwiX3phcCIsMCxXSVpBUkRfTFZMfSksCisgICAgICAgICAgICh7InZlcmZvbGdlIiwiX3ZlcmZvbGdlIiwwLExFQVJORVJfTFZMfSksCisgICAgICAgICAgICh7InRyYW5zIiwiX3RyYW5zIiwwLExFQVJORVJfTFZMfSksCisgICAgICAgICAgICh7InBlYWNlIiwiX2ZyaWVkZW4iLDAsTEVBUk5FUl9MVkx9KSwKKyAgICAgICAgICAgKHsiZnJpZWRlbiIsIl9mcmllZGVuIiwwLExFQVJORVJfTFZMfSksCisgICAgICAgICAgICh7InB3aG8iLCJfcHdobyIsMCxXSVpBUkRfTFZMfSksCisgICAgICAgICAgICh7Inp3aW5nZSIsIl96d2luZ2UiLDAsV0laQVJEX0xWTH0pLAorICAgICAgICAgICAoeyJoZWFsIiwiX2hlaWxlIiwwLFdJWkFSRF9MVkx9KSwKKyAgICAgICAgICAgKHsiaGVpbCIsIl9oZWlsZSIsMSxXSVpBUkRfTFZMfSksCisgICAgICAgICAgICh7InBlb3BsZSIsIl9wZW9wbGUiLDAsTEVBUk5FUl9MVkx9KSwKKyAgICAgICAgICAgKHsic3BpZWxlciIsIl9zcGllbGVyIiwwLFdJWkFSRF9MVkx9KX0pOworfQorCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFpBUCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjCisKK3ByaXZhdGUgc3RyaW5nIF96YXBfbWVzc2FnZShzdHJpbmcgc3RyLCBvYmplY3Qgb2JqKQoreworICBzdHI9cmVncmVwbGFjZShzdHIsIkBAd2VyQEAiLChzdHJpbmcpb2JqLT5uYW1lKFdFUiwyKSwxKTsKKyAgc3RyPXJlZ3JlcGxhY2Uoc3RyLCJAQHdlc3NlbkBAIiwoc3RyaW5nKW9iai0+bmFtZShXRVNTRU4sMiksMSk7CisgIHN0cj1yZWdyZXBsYWNlKHN0ciwiQEB3ZW1AQCIsKHN0cmluZylvYmotPm5hbWUoV0VNLDIpLDEpOworICBzdHI9cmVncmVwbGFjZShzdHIsIkBAd2VuQEAiLChzdHJpbmcpb2JqLT5uYW1lKFdFTiwyKSwxKTsKKyAgc3RyPXJlZ3JlcGxhY2Uoc3RyLCJAQGljaEBAIixuYW1lKFdFUiwyKSwxKTsKKyAgcmV0dXJuIGNhcGl0YWxpemUoc3RyKTsKK30KKworc3RhdGljIGludCBfemFwKHN0cmluZyBzdHIpCit7CisgICAgb2JqZWN0IG9wZmVyOworICAgIHN0cmluZyAqbWVzc2FnZSwgZHVtbXk7CisgICAgaW50IHNwaWVsZXI7CisKKyAgICBpZiAoIXN0cikgcmV0dXJuIFVTQUdFKCJ6YXAgPG5hbWU+Iik7CisgICAgaWYgKHNzY2FuZiggc3RyLCAic3BpZWxlciAlcyIsIGR1bW15ICkpCisgICAgeworICAgICAgc3RyID0gZHVtbXk7CisgICAgICBzcGllbGVyID0gMTsKKyAgICB9CisgICAgaWYgKG9wZmVyPXByZXNlbnQoc3RyLGVudmlyb25tZW50KCkpKQorICAgIHsKKyAgICAgIGlmICggIWxpdmluZyhvcGZlcikgKQorICAgICAgeworICAgICAgICBwcmludGYoIiVzIGlzdCBkb2NoIGdhciBrZWluIExlYmV3ZXNlbiFcbiIsY2FwaXRhbGl6ZShzdHIpICk7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgICAgaWYgKHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob3BmZXIpJiYhc3BpZWxlciApCisgICAgICB7CisgICAgICAgIHByaW50ZiggIlNwaWVsZXIga2FubnN0IER1IG51ciBtaXQgZGVyIFN5bnRheCAnemFwIHNwaWVsZXIgPG5hbWU+JyAiCisgICAgICAgICAgICAgICAgInRvZXRlbiFcbiIgKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIGlmICggIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob3BmZXIpICYmIHNwaWVsZXIgKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmKCAiQWJlciAlcyBpc3QgZG9jaCBnYXIga2VpbiBTcGllbGVyIVxuIixjYXBpdGFsaXplKHN0cikpOworICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisKKyAgICAgIG1lc3NhZ2UgPSBRdWVyeVByb3AoUF9aQVBfTVNHKTsKKworICAgICAgaWYgKCAhcG9pbnRlcnAobWVzc2FnZSkgfHwgc2l6ZW9mKG1lc3NhZ2UpICE9IDMgKXsKKyAgICAgICAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSxzcHJpbnRmKCIlcyBiZXNjaHdvZXJ0IGVpbmVuIEJsaXR6ICIKKyAgICAgICAgICAgICAgICAidm9tIEhpbW1lbC5cbiIsY2FwaXRhbGl6ZShnZXR1aWQoKSkpLCh7IHRoaXNfb2JqZWN0KCkgfSkpOworICAgICAgICAgIHByaW50ZigiRHUgdG9ldGVzdCAlcy5cbiIsb3BmZXItPm5hbWUoIFdFTiwyKSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHByaW50ZihfemFwX21lc3NhZ2UobWVzc2FnZVswXSxvcGZlcikpOworICAgICAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSxfemFwX21lc3NhZ2UobWVzc2FnZVsxXSxvcGZlciksCisgICAgICAgICAgICAgKHt0aGlzX3BsYXllcigpLG9wZmVyfSkpOworICAgICAgICB0ZWxsX29iamVjdChvcGZlcixfemFwX21lc3NhZ2UobWVzc2FnZVsyXSxvcGZlcikpOworICAgICAgfQorCisgICAgICBvcGZlci0+ZGllKCk7CisgICAgICByZXR1cm4gMTsKKyAgfQorICBlbHNleworICAgICAgcHJpbnRmKCJTb3dhcyBzaWVoc3QgRHUgaGllciBuaWNodC5cbiIpOworICAgICAgcmV0dXJuIDE7CisgIH0KK30KKworCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBWRVJGT0xHRSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIworCitzdGF0aWMgaW50IF92ZXJmb2xnZShzdHJpbmcgc3RyKQoreworICAvLyBXZW5uIG5pY2h0cyBlaW5nZWdlYmVuIHd1cmRlLCB3aXJkIHZlciBWZXJmb2xndW5nc21vZHVzIGJlZW5kZXQsIHNvZmVybgorICAvLyBlciB6dXZvciBlaW5nZXNjaGFsdGV0IHdhci4gQW5zb25zdGVuIHdpcmQgZWluZSBGZWhsZXJtZWxkdW5nIAorICAvLyBhdXNnZWdlYmVuLgorICBpZiAoIXNpemVvZihzdHIpKQorICB7CisgICAgbWl4ZWQgKnB1ciA9IFF1ZXJ5KFBfUFVSU1VFUlMpOworICAgIGlmICggcG9pbnRlcnAocHVyKSAmJiBzaXplb2YocHVyKSAmJiBvYmplY3RwKHB1clswXSkgKQorICAgIHsKKyAgICAgIHB1clswXS0+UmVtb3ZlUHVyc3Vlcih0aGlzX29iamVjdCgpKTsKKyAgICAgIFJlY2VpdmVNc2coIlZlcmZvbGd1bmdzbW9kdXMgYWJnZXNjaGFsdGV0LiIsIE1UX05PVElGSUNBVElPTik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBSZWNlaXZlTXNnKCJEdSB2ZXJmb2xnc3QgZG9jaCB1ZWJlcmhhdXB0IG5pZW1hbmRlbi4iLCBNVF9OT1RJRklDQVRJT04pOworICAgIH0KKyAgICByZXR1cm4gMTsKKyAgfQorICBzdHI9bG93ZXJfY2FzZShzdHIpOworICAKKyAgLy8gbWF0Y2hfbGl2aW5nKCkgZXJsYXVidCBkaWUgUHJ1ZWZ1bmcsIG9iIGRpZSBBbmdhYmUgZWluZGV1dGlnIHdhci4KKyAgaW50fHN0cmluZyBsdiA9IG1hdGNoX2xpdmluZyhzdHIpOworICBpZiAoIGludHAobHYpICkKKyAgeworICAgIGlmICggbHYgPT0gLTIgKQorICAgICAgUmVjZWl2ZU1zZygiS2VpbiBzb2xjaGVzIFdlc2VuIGdlZnVuZGVuLiIsIE1UX05PVElGSUNBVElPTik7CisgICAgZWxzZQorICAgICAgUmVjZWl2ZU1zZyhzcHJpbnRmKCJ2ZXJmb2xnZTogJyVzJyBpc3QgbmljaHQgZWluZGV1dGlnLlxuIiwgc3RyKSwKKyAgICAgICAgTVRfTk9USUZJQ0FUSU9OKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICAKKyAgLy8gU3BpZWxlciB6dWVyc3QgYXVzd2FlaGxlbiwgZGFuYWNoIGltIFJhdW0gYW53ZXNlbmRlIExlYmV3ZXNlbi4KKyAgb2JqZWN0IHppZWwgPSBmaW5kX3BsYXllcihsdikgfHwgcHJlc2VudChsdiwgZW52aXJvbm1lbnQodGhpc19wbGF5ZXIoKSkpOworICAKKyAgLy8gV3VyZGUga2VpbiBMZWJld2VzZW4gZ2VmdW5kZW4sIHdpcmQgZGFzIGVyc3RlIEVsZW1lbnQgYXVzIGRlciBMaXN0ZSBkZXIKKyAgLy8gTGViZXdlc2VuIGRpZXNlcyBOYW1lbnMgZ2V3YWVobHQsIGZhbGxzIHZvcmhhbmRlbi4gTnVyIExlYmV3ZXNlbiBtaXQKKyAgLy8gRW52aXJvbm1lbnQga29tbWVuIGluIEZyYWdlLCBkZW5uIHNvbnN0IGdpYnQgZXMga2VpbmVuIFJhdW0sIGluIGRlbiBkZXIKKyAgLy8gbmV1ZSBWZXJmb2xnZXIgYmV3ZWd0IHdlcmRlbiBrb2VubnRlLgorICBpZiAoICFvYmplY3RwKHppZWwpICkgeworICAgIG9iamVjdCogZWxpZ2libGVfbGl2aW5ncyA9IGZpbHRlcihmaW5kX2xpdmluZ3MobHYpLCAjJ2Vudmlyb25tZW50KTsKKyAgICBpZiAoc2l6ZW9mKGVsaWdpYmxlX2xpdmluZ3MpKQorICAgICAgemllbCA9IGVsaWdpYmxlX2xpdmluZ3NbMF07CisgIH0KKyAgCisgIC8vIEVuZGxpY2ggZXR3YXMgZ2VmdW5kZW4/IERhbm4gVmVyZm9sZ2VyIGVpbnRyYWdlbiB1bmQgenVtIFppZWwgYmV3ZWdlbi4KKyAgaWYgKCBvYmplY3RwKHppZWwpICkKKyAgeworICAgIGlmICggemllbCA9PSB0aGlzX3BsYXllcigpICkgCisgICAgeworICAgICAgUmVjZWl2ZU1zZygiRHUga2FubnN0IERpY2ggbmljaHQgc2VsYnN0IHZlcmZvbGdlbi4iLCBNVF9OT1RJRklDQVRJT04pOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgUmVjZWl2ZU1zZyhzcHJpbnRmKAorICAgICAgICAiRHUgdmVyZm9sZ3N0IGpldHp0ICVzLiBbJXNdIiwgemllbC0+bmFtZShXRU4pLCBvYmplY3RfbmFtZSh6aWVsKSksCisgICAgICAgIE1UX05PVElGSUNBVElPTiwgTUFfTU9WRSk7CisgICAgICB6aWVsLT5BZGRQdXJzdWVyKHRoaXNfb2JqZWN0KCkpOworICAgICAgemllbC0+VGFrZUZvbGxvd2VycygpOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBSZWNlaXZlTXNnKCJLZWluIFdlc2VuIG1pdCBkZW0gTmFtZW4gJyIrbHYrIicgZ2VmdW5kZW4sIG9kZXIgbnVyICIKKyAgICAgICJzb2xjaGUgb2huZSBFbnZpcm9ubWVudC4iLCBNVF9OT1RJRklDQVRJT04sIDAsICJ2ZXJmb2xnZTogIik7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBUUkFOUyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjCisKK3N0YXRpYyBpbnQgX3RyYW5zKHN0cmluZyBzdHIpCit7CisgIG9iamVjdCBsaXZpbmc7CisKKyAgaWYgKCFzaXplb2Yoc3RyKSkKKyAgICByZXR1cm4gX25vdGlmeV9mYWlsKCJTeW50YXg6IHRyYW5zIDxzcGllbGVybmFtZT5cbiIpLDA7CisgIHN0cj1tYXRjaF9saXZpbmcoc3RyLDApOworICBpZiAoaW50cChzdHIpKQorICAgIHN3aXRjaCAoc3RyKQorICAgIHsKKyAgICAgIGNhc2UgLTE6IHdyaXRlKCJEYXMgd2FyIG5pY2h0IGVpbmRldXRpZy5cbiIpOyByZXR1cm4gMTsKKyAgICAgIGNhc2UgLTI6IHdyaXRlKCJTbyBlaW4gV2VzZW4gZ2lidCBlcyBuaWNodC5cbiIpOyByZXR1cm4gMTsKKyAgICB9CisgIGlmKGxpdmluZz1maW5kX2xpdmluZyhzdHIpKQorICB7CisgICAgaWYgKGxpdmluZy0+bW92ZShvYmplY3RfbmFtZShlbnZpcm9ubWVudCgpKSwKKyAgICAgICAgICAgICAgICAgICAgIE1fVFBPUlR8TV9OT0NIRUNLKTw9MCkKKyAgICB7CisgICAgICBwcmludGYoIlRlbGVwb3J0aWVyZW4gdm9uICVzIGZlaGxnZXNjaGxhZ2VuLlxuIixsaXZpbmctPk5hbWUoV0VNKSk7CisgICAgICBpZiAoSVNfTEVBUk5FUihsaXZpbmcpKQorICAgICAgICB0ZWxsX29iamVjdChsaXZpbmcsc3ByaW50ZigiJXMgd29sbHRlIERpY2ggdGVsZXBvcnRpZXJlbiwgIgorICAgICAgICAgICAgICJoYXQgYWJlciB2ZXJzYWd0IVxuIixjYXBpdGFsaXplKGdldHVpZCgpKSkpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHRlbGxfb2JqZWN0KGxpdmluZyxzcHJpbnRmKAorICAgICJFaW4gc2VsdHNhbWVzIEdlZnVlaGwgdWViZXJrb21tdCBEaWNoIC4uLlxuIgorICAgICJEdSB2ZXJsaWVyc3QgZGllIE9yaWVudGllcnVuZyAuLi5cbiIKKyAgICArKFF1ZXJ5UHJvcChQX0lOVklTKT8iIjoiJXMgaG9sdCBEaWNoIHp1IHNpY2guXG4iKSwKKyAgICBjYXBpdGFsaXplKGdldHVpZCgpKSkpOworICAgIHByaW50ZigiJXMgd3VyZGUgaGVyYmVpeml0aWVydC5cbiIsbGl2aW5nLT5OYW1lKFdFUikpOworICAgIHJldHVybiAxOworICB9CisgIHByaW50ZigiRGFzIExlYmV3ZXNlbiAnJXMnIGtvbm50ZSBuaWNodCBnZWZ1bmRlbiB3ZXJkZW4uXG4iLAorICAgICAgICAgY2FwaXRhbGl6ZShzdHIpKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRlJJRURFTiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIworCitzdGF0aWMgaW50IF9mcmllZGVuKHN0cmluZyBzbmFtZSkKK3sKKyAgb2JqZWN0ICplbmVtLG9iajsKKyAgaW50IGk7CisgIHN0cmluZyBoaW07CisgIAorICBpZiAoIXNuYW1lKQorICB7CisgICAgZW5lbT1hbGxfaW52ZW50b3J5KGVudmlyb25tZW50KCkpOworICAgIG1hcF9vYmplY3RzKGVuZW0sIlN0b3BIdW50aW5nTW9kZSIpOworICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudCgpLHNwcmludGYoIiVzIHN0aWZ0ZXQgRnJpZWRlbi5cbiIsY2FwaXRhbGl6ZShnZXR1aWQoKSkpLAorICAgICAgICAgICAgICAoeyB0aGlzX29iamVjdCgpfSkpOworICAgIHByaW50ZigiRHUgc3RpZnRlc3QgRnJpZWRlbi5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIGVsc2UKKyAgeworICAgIGlmICghb2JqPWZpbmRfbGl2aW5nKHNuYW1lKSkKKyAgICAgIHJldHVybiBwcmludGYoIktlaW4gc29sY2hlcyBMZWJld2VzZW4gaW0gU3BpZWwuXG4iKSwxOworICAgIGhpbT0oc3RyaW5nKW9iai0+bmFtZShXRU0pOworICAgIGk9c2l6ZW9mKGVuZW09KG9iamVjdCAqKSgoKG1peGVkICopb2JqLT5TdG9wSHVudGluZ01vZGUoKSlbMF0pKTsKKyAgICAvLyBNaXN0ZHJpdmVyIC4uLiBvYmplY3QqKiB3YWVyZSByaWNodGlnIGdld2VzZW4gLi4uICpzZXVmeioKKyAgICB3aGlsZShpLS0pCisgICAgeworICAgICAgZW5lbVtpXS0+U3RvcEh1bnRGb3Iob2JqKTsKKyAgICAgIHRlbGxfb2JqZWN0KG9iaixzcHJpbnRmKCIlcyBiZWVuZGV0IERlaW5lbiBLYW1wZiBtaXQgJXMuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoKSksZW5lbVtpXS0+TmFtZShXRU0pKSk7CisgICAgICB0ZWxsX29iamVjdChlbmVtWzBdLHNwcmludGYoIiVzIGJlZW5kZXQgRGVpbmVuIEthbXBmIG1pdCAlcy5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoKSksaGltKSk7CisgICAgfQorICB9CisgIHByaW50ZigiJXMgdW5kIGFsbGUgR2VnbmVyIHd1cmRlbiBiZWZyaWVkZXQuXG4iLG9iai0+TmFtZShXRVIpKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBQV0hPICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMKKworI2lmIF9fVkVSU0lPTl9fIDwgIjMuMi45IgorcHJpdmF0ZSBpbnQgX3B3aG9fbGVhcm5lcl90ZXN0KG9iamVjdCBvYikKK3sKKyAgcmV0dXJuICFJU19MRUFSTkVSKG9iKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IF9wd2hvKCkKK3sKKyAgbWl4ZWQqIHNwaWVsZXIsIHJlcywgKmhhbmRzOworICBpbnQgaTsKKyNpZiBfX1ZFUlNJT05fXyA8ICIzLjIuOSIKKyAgc3BpZWxlciA9IGZpbHRlcih1c2VycygpLCMnX3B3aG9fbGVhcm5lcl90ZXN0KTsKKyNlbHNlCisgIHNwaWVsZXIgPSBmaWx0ZXIodXNlcnMoKSwoOiByZXR1cm4gIUlTX0xFQVJORVIoJDEpOyA6KSk7CisjZW5kaWYKKyAgc3BpZWxlciA9IHNvcnRfYXJyYXkoc3BpZWxlciwgZnVuY3Rpb24gaW50IChvYmplY3QgYSwgb2JqZWN0IGIpCisgICAgICB7IHJldHVybiBhLT5RdWVyeVByb3AoUF9MRVZFTCkgPiBiLT5RdWVyeVByb3AoUF9MRVZFTCk7IH0gKTsKKyAgCisgIHJlcyA9ICJMdmwgTmFtZSAgICAgICAgIEVyZmFocnVuZyAgIFFQICBJbnQgU3RyIERleCBDb24gV0MgICAiCisgICAgIkFDICAgSEFORFMgSFAgIChtYXgpXG4iCisgICAgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorICAgICItLS0tLS0tLS0tLS0tLS0tLVxuIjsKKyAgZm9yIChpPXNpemVvZihzcGllbGVyKS0xOyBpPj0wOyBpLS0pCisgICAgcmVzICs9IHNwcmludGYoIiUzZCAlLTEycyAlOWQgJTVkICUzZCAlM2QgJTNkICUzZCAlNGQgJTRkICAlNWQgIgorICAgICAgICAgICAgICAgICAgICIlNGQgKCU0ZClcbiIsCisgICAgIHNwaWVsZXJbaV0tPlF1ZXJ5UHJvcChQX0xFVkVMKSwKKyAgICAgY2FwaXRhbGl6ZShnZXR1aWQoc3BpZWxlcltpXSkpLAorICAgICBzcGllbGVyW2ldLT5RdWVyeVByb3AoUF9YUCksCisgICAgIHNwaWVsZXJbaV0tPlF1ZXJ5UHJvcChQX1FQKSwKKyAgICAgc3BpZWxlcltpXS0+UXVlcnlBdHRyaWJ1dGUoQV9JTlQpLAorICAgICBzcGllbGVyW2ldLT5RdWVyeUF0dHJpYnV0ZShBX1NUUiksCisgICAgIHNwaWVsZXJbaV0tPlF1ZXJ5QXR0cmlidXRlKEFfREVYKSwKKyAgICAgc3BpZWxlcltpXS0+UXVlcnlBdHRyaWJ1dGUoQV9DT04pLAorICAgICBzcGllbGVyW2ldLT5RdWVyeVByb3AoUF9UT1RBTF9XQyksCisgICAgIHNwaWVsZXJbaV0tPlF1ZXJ5UHJvcChQX1RPVEFMX0FDKSwKKyAgICAgKHNpemVvZihoYW5kcz0oKGludCAqKXNwaWVsZXJbaV0tPlF1ZXJ5UHJvcChQX0hBTkRTKSkpP2hhbmRzWzFdOjApLAorICAgICBzcGllbGVyW2ldLT5RdWVyeVByb3AoUF9IUCksCisgICAgIHNwaWVsZXJbaV0tPlF1ZXJ5UHJvcChQX01BWF9IUCkpOworICBNb3JlKHJlcyk7CisgIHJldHVybiAxOworfQorCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgWldJTkdFICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMKKworc3RhdGljIGludCBfendpbmdlKHN0cmluZyBzdHIpCit7CisgIG9iamVjdCBsaXZpbmc7CisgIHN0cmluZyB3aGF0LCByZXN0OworICBzdHJpbmcgbGl2aW5nX25hbWU7CisKKyAgc3RyID0gX3VucGFyc2VkX2FyZ3MoKTsKKyAgaWYoIXN0cnx8IHNzY2FuZiggc3RyLCAiJXMgJXMiLCBsaXZpbmdfbmFtZSwgd2hhdCApICE9IDIgKQorICAgIHJldHVybiBfbm90aWZ5X2ZhaWwoIlp3aW5nZSBXRU4genUgV0FTP1xuIiksMDsKKyAgaWYoIHNzY2FuZiggd2hhdCwgInp1ICVzIiwgcmVzdCApID09IDEgKSB3aGF0ID0gcmVzdDsKKyAgaWYgKCEobGl2aW5nID0gZmluZF9saXZpbmcobGl2aW5nX25hbWUpKSkKKyAgICByZXR1cm4gcHJpbnRmICgiRWluIExlYmV3ZXNlbiBuYW1lbnMgJyVzJyBrb25udGUgbmljaHQgZ2VmdW5kZW4gd2VyZGVuIVxuIiwKKyAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGxpdmluZ19uYW1lKSksMTsKKyAgaWYgKGxpdmluZy0+Y29tbWFuZF9tZSh3aGF0KSkKKyAgeworICAgIHByaW50ZigiRHUgendpbmdzdCAlcyB6dSBcIiVzXCIuXG4iLGNhcGl0YWxpemUobGl2aW5nX25hbWUpLHdoYXQpOworICAgIGlmICghSVNfQVJDSCh0aGlzX29iamVjdCgpKSYmZ2V0dWlkKCkhPShzdHJpbmcpbGl2aW5nLT5RdWVyeVByb3AoUF9URVNUUExBWUVSKSkKKyAgICAgIGxvZ19maWxlKFNIRUxMTE9HKCJaV0lOR0UiKSwKKyAgICAgICAgICAgICAgIHNwcmludGYoIiVzIHp3aW5ndCAlcyAoJXMpIHp1ICVzIFslc11cbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKCkpLGxpdmluZy0+TmFtZSgpLGNhcGl0YWxpemUoZ2V0dWlkKGxpdmluZykpLAorICAgICAgICAgICAgICAgICAgICAgICB3aGF0LGR0aW1lKHRpbWUoKSkpKTsKKyAgfQorICBlbHNlCisgICAgd3JpdGUoIkhhdCBsZWlkZXIgbmljaHQgZ2VrbGFwcHQhXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgSEVJTEUgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIworCitzdGF0aWMgaW50IF9oZWlsZShzdHJpbmcgbmFtZSkKK3sKKyAgb2JqZWN0IG9iOworICBpbnQgbHB2LCBtcHY7CisKKyAgaWYgKCFuYW1lKSByZXR1cm4gVVNBR0UoImhlaWxlIDxuYW1lPiIpOworICBuYW1lID0gbG93ZXJfY2FzZShuYW1lKTsKKyAgaWYgKCghKG9iID0gcHJlc2VudChuYW1lLGVudmlyb25tZW50KCkpKSkKKyAgICAgIHx8IWxpdmluZyhvYikpCisgICAgb2IgPSBmaW5kX2xpdmluZyhuYW1lKTsKKyAgaWYgKCFvYikKKyAgeworICAgIHByaW50ZigiJyVzJyBpc3QgbW9tZW50YW4gbmljaHQgZGEuXG4iLGNhcGl0YWxpemUobmFtZSkpOworICAgIHJldHVybiAxOworICB9CisgIGxwdiA9IChpbnQpb2ItPlF1ZXJ5UHJvcChQX0hQKTsKKyAgbXB2ID0gKGludClvYi0+UXVlcnlQcm9wKFBfU1ApOworICBvYi0+aGVhbF9zZWxmKDEwMDAwMDApOworICBpZiAoIUlTX0xFQVJORVIob2IpICYmICghb2ItPlF1ZXJ5UHJvcChQX1RFU1RQTEFZRVIpfHwKKyAgICAgICAgICAoKChzdHJpbmcpb2ItPlF1ZXJ5UHJvcChQX1RFU1RQTEFZRVIpKVs8NS4uPDFdPT0iR2lsZGUiKSkpCisgICAgbG9nX2ZpbGUoU0hFTExMT0coIkhFQUwiKSwKKyAgICAgICBzcHJpbnRmKCIlcyBoZWlsdCAlcyAoJXMpICVzIChMUDogJWQgLT4gJWQsIE1QOiAlZCAtPiAlZClcbiIsCisgICAgICAgICBjYXBpdGFsaXplKGdldGV1aWQodGhpc19wbGF5ZXIoKSkpLAorICAgICAgICAgY2FsbF9vdGhlcihvYiwibmFtZSIpLCBjYXBpdGFsaXplKGdldGV1aWQob2IpKSwKKyAgICAgICAgIGR0aW1lKHRpbWUoKSksIGxwdiwgKGludClvYi0+UXVlcnlQcm9wKFBfSFApLAorICAgICAgICAgICAgICAgbXB2LChpbnQpb2ItPlF1ZXJ5UHJvcChQX1NQKSkpOworICB0ZWxsX29iamVjdChvYiwgUXVlcnlQcm9wKFBfTkFNRSkgKyAiIGhlaWx0IERpY2guXG4iKTsKKyAgcHJpbnRmKCJEdSBoZWlsc3QgJXMuXG4iLGNhcGl0YWxpemUobmFtZSkpOworICByZXR1cm4gMTsKK30KKworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFBFT1BMRSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjCisKK3ByaXZhdGUgc3RyaW5nIF9wZW9wbGVfZmlsZW5hbWUob2JqZWN0IG9iaikKK3sKKyAgc3RyaW5nIHN0cjsKKyAgc3RyPW9iamVjdF9uYW1lKGVudmlyb25tZW50KG9iaikpOworICBpZiAoIXN0cikgcmV0dXJuIDA7CisgIGlmIChzdHJbMC4uMl0gPT0gIi9kLyIpIHJldHVybiBzcHJpbnRmKCIrJXMiLHN0clszLi48MV0pOworICBpZiAoc3RyWzAuLjhdID09ICIvcGxheWVycy8iKSByZXR1cm4gc3ByaW50ZigifiVzIixzdHJbOS4uPDFdKTsKKyAgcmV0dXJuIHN0cjsKK30KKworc3RhdGljIGludCBfcGVvcGxlKCkKK3sKKyAgbWl4ZWQgKmxpc3QsIHJlczsKKyAgaW50IGksaiwgYTsKKyAgc3RyaW5nIGFfYWdlLGFfaXBudW0sYV9uYW1lLGFfbGV2ZWwsYV9pZGxlLGFfcm9vbSxhX2VuZCwgYV90aXRsZTsKKworICBzd2l0Y2goUXVlcnlQcm9wKCJ0dHkiKSkKKyAgeworICAgIGNhc2UgInZ0MTAwIjoKKyAgICAgIGFfaXBudW0gPSAiIjsgYV9uYW1lID0gQU5TSV9CT0xEOworICAgICAgYV9sZXZlbCA9IEFOU0lfTk9STUFMOyBhX2lkbGUgPSBBTlNJX0JMSU5LOworICAgICAgYV9yb29tID0gQU5TSV9OT1JNQUw7IGFfZW5kID0gQU5TSV9OT1JNQUw7CisgICAgICBhX3RpdGxlID0gQU5TSV9JTlZFUlM7IGFfYWdlID0gQU5TSV9OT1JNQUw7CisgICAgICBicmVhazsKKyAgICBjYXNlICJhbnNpIjoKKyAgICAgIGFfaXBudW0gPSBBTlNJX0JMVUU7IGFfbmFtZSA9IEFOU0lfQk9MRDsKKyAgICAgIGFfbGV2ZWwgPSBBTlNJX1JFRDsgYV9pZGxlID0gQU5TSV9CTEFDSytBTlNJX0JPTEQ7CisgICAgICBhX3Jvb20gPSBBTlNJX0JPTEQrQU5TSV9CTFVFOyBhX2VuZCA9IEFOU0lfTk9STUFMOworICAgICAgYV90aXRsZSA9IEFOU0lfSU5WRVJTOyBhX2FnZSA9IEFOU0lfUFVSUExFOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGFfdGl0bGUgPSBhX2lwbnVtID0gYV9uYW1lID0gYV9sZXZlbCA9IGFfaWRsZSA9IGFfcm9vbSA9IGFfZW5kID0gIiI7CisgICAgICBhX2FnZSA9ICIiOworICB9CisgIGxpc3QgPSBzb3J0X2FycmF5KHVzZXJzKCksIGZ1bmN0aW9uIGludCAob2JqZWN0IGEsIG9iamVjdCBiKSB7CisgICAgICByZXR1cm4gcXVlcnlfaXBfbnVtYmVyKGEpPnF1ZXJ5X2lwX251bWJlcihiKTt9ICk7IAorCisgIGo9c2l6ZW9mKGxpc3QpOworICBhPTA7cmVzPSIiOworICBmb3IoaT0wOyBpPHNpemVvZihsaXN0KTsgaSsrKSB7CisgICAgc3RyaW5nIG5hbWVfOyAKKyAgICBuYW1lXyA9IGNhcGl0YWxpemUobGlzdFtpXS0+cXVlcnlfcmVhbF9uYW1lKCl8fCI8bG9nb24+Iik7CisgICAgcmVzICs9IHNwcmludGYoICIlcyUtMTVzJXMgJXMlLTEzcyVzICVzJTNkJXMgJXMgJXMgJXMlcyVzJXMgJXMlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgYV9pcG51bSwgcXVlcnlfaXBfbnVtYmVyKGxpc3RbaV0pLGFfZW5kLGFfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgKGxpc3RbaV0tPlF1ZXJ5UHJvcChQX0lOVklTKT8iKCIrbmFtZV8rIikiOm5hbWVfKSwKKyAgICAgICAgICAgICAgICAgICAgYV9lbmQsYV9sZXZlbCwgTUFTVEVSLT5nZXRfd2l6X2xldmVsKGdldHVpZChsaXN0W2ldKSksCisgICAgICAgICAgICAgICAgICAgIGFfZW5kLGFfYWdlLAorICAgICAgICAgICAgICAgICAgICB0aW1lMnN0cmluZygiJTR4ICUwWCIsKChpbnQpbGlzdFtpXS0+UXVlcnlQcm9wKFBfQUdFKSkqMiksCisgICAgICAgICAgICAgICAgICAgIHF1ZXJ5X2lkbGUobGlzdFtpXSk+PTMwMD8oYSsrLChhX2lkbGUrIkkiKSk6IiAiLAorICAgICAgICAgICAgICAgICAgICBhX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgcXVlcnlfZWRpdGluZyhsaXN0W2ldKT9hX2lkbGUrIkUiK2FfZW5kOiIgIiwKKyAgICAgICAgICAgICAgICAgICAgcXVlcnlfaW5wdXRfcGVuZGluZyhsaXN0W2ldKT9hX2lkbGUrIk0iK2FfZW5kOiIgIiwKKyAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQobGlzdFtpXSk/YV9yb29tK19wZW9wbGVfZmlsZW5hbWUobGlzdFtpXSk6IiIsCisgICAgICAgICAgICAgICAgICAgIGFfZW5kKTsKKyAgfQorICBpZiAoYSkKKyAgICByZXMgPSBzcHJpbnRmKCIlcyVkIFNwaWVsZXIgYW53ZXNlbmQgKCVkIGFrdGl2KS4gJXMlc1xuIixhX3RpdGxlLGosCisgICAgICAgICAgICAgICAgICAoai1hKSxxdWVyeV9sb2FkX2F2ZXJhZ2UoKSxhX2VuZCkrcmVzOworICBlbHNlCisgICAgcmVzID0gc3ByaW50ZigiJXMlZCBTcGllbGVyIGFud2VzZW5kLiAlcyVzXG4iLGFfdGl0bGUsaiwKKyAgICAgICAgICAgICAgICAgIHF1ZXJ5X2xvYWRfYXZlcmFnZSgpLGFfZW5kKStyZXM7CisgIE1vcmUocmVzKTsKKworICByZXR1cm4gMTsKK30KKworCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFNQSUVMRVIgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMKKworcHJpdmF0ZSBzdHJpbmcgX3NwaWVsZXJfdGltZTJzdHJpbmcoaW50IHRpbWUpCit7CisgIHN0cmluZyByZXQ7CisKKyAgcmV0PSIiOworICBpZiAodGltZT49ODY0MDApCisgIHsKKyAgICByZXQrPXRpbWUvODY0MDArImQgIjsKKyAgICB0aW1lJT04NjQwMDsKKyAgfQorICBpZih0aW1lPDM2MDAwKSByZXQrPSIwIjsKKyAgcmV0Kz10aW1lLzM2MDArIjoiOworICB0aW1lJT0zNjAwOworICBpZih0aW1lPDYwMCkgcmV0Kz0iMCI7CisgIHJldCs9dGltZS82MCsiOiI7CisgIHRpbWUlPTYwOworICBpZih0aW1lPDEwKSByZXQrPSIwIjsKKyAgcmV0Kz10aW1lKyIiOworICByZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgX3NwaWVsZXIoc3RyaW5nIGFyZykKK3sKKyAgc3RyaW5nIGR1bW15LGlwOworICBvYmplY3QgKnNwaWVsZXIscGw7CisgIGludCBpOworICAKKyAgYXJnPV91bnBhcnNlZF9hcmdzKCk7CisgIGlmKCFzaXplb2YoYXJnKSB8fCBzc2NhbmYoYXJnLCJhdXMgaXAgJXMiLGR1bW15KSE9MSkKKyAgICByZXR1cm4gVVNBR0UoInNwaWVsZXIgYXVzIGlwIFt2b24gPHNwaWVsZXI+fDxpcD5dIik7CisgIGFyZz1kdW1teTsKKyAgaWYgKHNzY2FuZihhcmcsInZvbiAlcyIsZHVtbXkpPT0xKQorICB7CisgICAgZHVtbXk9bG93ZXJfY2FzZShkdW1teSk7CisgICAgaWYgKCEocGw9ZmluZF9wbGF5ZXIoZHVtbXkpKSkKKyAgICAgIHJldHVybiBub3RpZnlfZmFpbChzcHJpbnRmKCJTcGllbGVyICclcycga29ubnRlIG5pY2h0IGdlZnVuZGVuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZXJkZW4uXG4iLGNhcGl0YWxpemUoZHVtbXkpKSksMDsKKyAgICBpcD1xdWVyeV9pcF9udW1iZXIocGwpOworICB9CisgIGVsc2UgaXA9YXJnOworICBpcD1pbXBsb2RlKChleHBsb2RlKGlwLCIuIiktKHsiIn0pKyh7IioiLCIqIiwiKiIsIioifSkpWzAuLjNdLCIuIik7CitpZiAoY2F0Y2goCisgIHNwaWVsZXI9ZmlsdGVyKHVzZXJzKCksCisgICAgKDogcmV0dXJuIHNpemVvZihyZWdleHAoKHtxdWVyeV9pcF9udW1iZXIoJDEpfSksJDIpKTsgOiksIl4iK2dsb2IycmVnZXhwKGlwKSsiJCIpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKKyAgcmV0dXJuIHByaW50ZigiSW4gZGVyIElQIGR1ZXJmZW4gbnVyIFphaGxlbigwLTI1NSksIFB1bmt0ZSAoLikgdW5kICIKKyAgICAgICAgICAgICAgICAiU3Rlcm5lICgqKSB2b3Jrb21tZW4uXG4iKSwxOworICBpZiAoIXNpemVvZihzcGllbGVyKSkKKyAgICByZXR1cm4gcHJpbnRmKCJFcyBrb25udGUga2VpbiBTcGllbGVyIG1pdCBkZXIgSVAgJyVzJyBnZWZ1bmRlbiAiCisgICAgICAgICAgICAgICAgICAid2VyZGVuLlxuIixpcCksMTsKKyAgYXJnPXNwcmludGYoIlxuRm9sZ2VuZGUgU3BpZWxlciBoYWJlbiBkaWUgSVAgJXM6XG4iCisgICAgICAgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCisgICAgICAgICAgICAgICI9PT09PT09PT09PVxuIgorICAgICAgICJOYW1lOiAgICAgICBad2VpdGllIHZvbjogICAgICBFaW5nZWxvZ2d0OiAgICAgICAgICAgICAgICAgICIKKyAgICAgICAgICAgICAgIklkbGUgc2VpdDpcbiIKKyAgICAgICAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKyAgICAgICAgICAgICAgIi0tLS0tLS0tLS0tXG4iLGlwKTsKKyAgaT1zaXplb2Yoc3BpZWxlcik7CisgIHdoaWxlKGktLSkKKyAgeworICAgIGFyZys9c3ByaW50ZigiJS0xMXMgJS0xN3MgJTI2cyAgJS0xNXNcbiIsCisgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHNwaWVsZXJbaV0pKSwKKyAgICAgICAgICAgICAgICAgKChkdW1teT0oc3RyaW5nKXNwaWVsZXJbaV0tPlF1ZXJ5UHJvcChQX1NFQ09ORCkpPworICAgICAgICAgICAgICAgICAgKHNpemVvZigobWl4ZWQgKiljYWxsX290aGVyKG1hc3RlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZXRfdXNlcmluZm8iLGR1bW15KSk/CisgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShkdW1teSk6Iip1bmd1ZWx0aWcqIik6IiIpLAorICAgICAgICAgICAgICAgICBkdGltZShzcGllbGVyW2ldLT5RdWVyeVByb3AoUF9MQVNUX0xPR0lOKSksCisgICAgICAgICAgICAgICAgIF9zcGllbGVyX3RpbWUyc3RyaW5nKHF1ZXJ5X2lkbGUoc3BpZWxlcltpXSkpKTsKKyAgfQorICBhcmcrPSI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCisgICAgIj09PT09PT09PT09PVxuXG4iOworICBNb3JlKGFyZyk7CisgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvc3RkL3NoZWxscy9tYWdpZXIvdG9kby5jIGIvc3RkL3NoZWxscy9tYWdpZXIvdG9kby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MTIwZTcKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvc2hlbGxzL21hZ2llci90b2RvLmMKQEAgLTAsMCArMSwyMjIgQEAKKy8vICRJZDogdG9kby5jIDkxNDIgMjAxNS0wMi0wNCAyMjoxNzoyOVogWmVzc3RyYSAkCisjcHJhZ21hIHN0cmljdF90eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisKKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPG1hZ2llci5oPgorI2luY2x1ZGUgPHBsYXllci5oPgorCisjZGVmaW5lIFNBVkVGSUxFTkFNRSBzcHJpbnRmKCIvcGxheWVycy8lcy8udG9kb2xpc3RlIixnZXR1aWQoKSkKKworcHJpdmF0ZSBub3NhdmUgc3RhdHVzIHRvZG9faW5pdGlhbGl6ZWQ7Citwcml2YXRlIG5vc2F2ZSBtaXhlZCAqdG9kb19kYXRhOworbWl4ZWQgKnRvZG9fZGF0YV9wdWJsaWM7CitzdGF0aWMgbWl4ZWQgX3F1ZXJ5X2xvY2FsY21kcygpCit7CisgIHJldHVybiAoeworICAgICh7InRvZG8iLCJfdG9kbyIsMCxXSVpBUkRfTFZMfSl9KTsKK30KKworcHJpdmF0ZSB2b2lkIHRvZG9fc2F2ZSgpCit7CisKKyAgaW50IGksajsKKyAgc3RyaW5nIGEsYjsKKyAgYT1TQVZFRklMRU5BTUUrIi5vIjsKKyAgcm0oYSk7CisgIGlmIChqPXNpemVvZih0b2RvX2RhdGEpKQorICB7CisjaWYgIV9fRUZVTl9ERUZJTkVEX18oc2F2ZV92YWx1ZSkgICAKKyAgICB3cml0ZV9maWxlKGEsIiMwOjBcbnRvZG9fZGF0YV9wdWJsaWMgKHsiKTsKKyAgICBmb3IgKGk9MDtpPGo7aSsrKQorICAgIHsKKyAgICAgIGI9cmVncmVwbGFjZSh0b2RvX2RhdGFbaV1bMV0sIlwiIiwiXFxcIiIsMSk7CisgICAgICBiPXJlZ3JlcGxhY2UoYiwiXG4iLCJcXG4iLDEpOworICAgICAgd3JpdGVfZmlsZShhLHNwcmludGYoIih7JWQsXCIlc1wiLH0pLCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2RvX2RhdGFbaV1bMF0sYikpOworICAgIH0KKyAgICB3cml0ZV9maWxlKGEsIn0pXG4iKTsKKyNlbHNlCisgICAgdG9kb19kYXRhX3B1YmxpYz10b2RvX2RhdGE7CisgICAgd3JpdGVfZmlsZShhLHNhdmVfdmFsdWUodG9kb19kYXRhX3B1YmxpYykpOworICAgIHRvZG9fZGF0YV9wdWJsaWM9MDsKKyNlbmRpZgorICB9CisgIHJldHVybjsKKworfQorCitzdGF0aWMgdm9pZCBpbml0aWFsaXplKCkKK3sKKyAgaWYoIUlTX1dJWkFSRCh0aGlzX29iamVjdCgpKSkgcmV0dXJuOworICBpZiAoIXJlc3RvcmVfb2JqZWN0KFNBVkVGSUxFTkFNRSkpIHRvZG9fZGF0YT0oe30pOworICBlbHNlCisgICAgeworICAgICAgdG9kb19kYXRhPXRvZG9fZGF0YV9wdWJsaWM7CisgICAgICB0b2RvX2RhdGFfcHVibGljPTA7CisgICAgfQorICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIF90b2RvX25ldTIoc3RyaW5nIGlucHV0LHN0cmluZyBjYXJyeSkKK3sKKyAgaWYgKGlucHV0PT0icSJ8fChpbnB1dD09Ii4iJiYhc2l6ZW9mKGNhcnJ5KSkpCisgIHsKKyAgICBwcmludGYoIkFiYnJ1Y2ghIik7CisgICAgcmV0dXJuOworICB9CisgIGlmIChpbnB1dCE9Ii4iKQorICB7CisgICAgcHJpbnRmKCJdIik7CisgICAgaW5wdXRfdG8oIl90b2RvX25ldTIiLDAsY2FycnkraW5wdXQrIlxuIik7CisgICAgcmV0dXJuOworICB9CisgIHRvZG9fZGF0YSs9KHsgKHsgdGltZSgpLCBjYXJyeSB9KSB9KTsKKyAgdG9kb19zYXZlKCk7CisgIHByaW50ZigiRWludHJhZyBhbmdlbGVndC4gTGF1ZmVuZGUgTnVtbWVyIGlzdCAlZC5cbiIsc2l6ZW9mKHRvZG9fZGF0YSkpOworICByZXR1cm47Cit9CisKK3ByaXZhdGUgaW50IF90b2RvX25ldShzdHJpbmcgY21kbGluZSkKK3sKKyAgaWYgKGNtZGxpbmUhPSJuZXUiKSByZXR1cm4gMDsKKyAgcHJpbnRmKCJXYXMgbXVzc3QgRHUgbm9jaCBtYWNoZW4/IChBYmJydWNoIG1pdCAncScsICIKKyAgICAgICAgICJFbmRlIG1pdCAnLicpXG5dIik7CisgIGlucHV0X3RvKCJfdG9kb19uZXUyIiwwLCIiKTsKKyAgcmV0dXJuIDE7Cit9CisKK3ByaXZhdGUgaW50IF90b2RvX2xvZXNjaGVuKHN0cmluZyBjbWRsaW5lKQoreworICBpbnQgbnI7CisgIGlmICghc3NjYW5mKGNtZGxpbmUsImxvZXNjaGVuICVkIixucikpCisgICAgcmV0dXJuIG5vdGlmeV9mYWlsKCJXZWxjaGVuIEVpbnRyYWcgbW9lY2h0ZXN0IER1IGxvZXNjaGVuP1xuIiksMDsKKyAgaWYgKCFzaXplb2YodG9kb19kYXRhKSkKKyAgICByZXR1cm4gbm90aWZ5X2ZhaWwoIkRlaW5lIFRvZG8tTGlzdGUgaGF0IGphIHVlYmVyaGF1cHQga2VpbmVuICIKKyAgICAgICAgICAgICAgICAgICAgICAgIkVpbnRyYWchXG4iKSwwOworICBpZiAobnI+c2l6ZW9mKHRvZG9fZGF0YSkpCisgIHsKKyAgICBwcmludGYoIkRlaW5lIFRvZG8tTGlzdGUgaGF0IG51ciAlZCBFaW50cmElcy5cbiIsc2l6ZW9mKHRvZG9fZGF0YSksCisgICAgICAgICAgIChzaXplb2YodG9kb19kYXRhKT09MT8iZyI6ImVnZSIpKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICB0b2RvX2RhdGFbbnItMV09MDsKKyAgdG9kb19kYXRhLT0oezB9KTsKKyAgdG9kb19zYXZlKCk7CisgIHByaW50ZigiRWludHJhZyBOdW1tZXIgJWQgd3VyZGUgZ2Vsb2VzY2h0LiBEYSBoYXN0IER1IGphIG9yZGVudGxpY2ggIgorICAgICAgICAgIndhcyBnZXNjaGFmZnQuLi5cbm9kZXIgZ2VzY2hpY2t0IGRlbGVnaWVydCA7LSlcbiIsbnIpOworICByZXR1cm4gMTsKK30KKworcHJpdmF0ZSBpbnQgX3RvZG9fYW56ZWlnZW4oc3RyaW5nIGNtZGxpbmUpCit7CisgIGludCBucjEsbnIyOworICBzdHJpbmcgb3V0cHV0OworICBpZiAoIXNpemVvZih0b2RvX2RhdGEpKQorICAgIHJldHVybiBub3RpZnlfZmFpbCgiRGVpbmUgVG9kby1MaXN0ZSBoYXQga2VpbmUgRWludHJhZWdlLlxuIiksMDsKKyAgc3dpdGNoKHNzY2FuZihjbWRsaW5lLCJhbnplaWdlbiAlZCBiaXMgJWQiLG5yMSxucjIpKSAKKyAgeworICBjYXNlIDA6IG5yMT0xOyBucjI9c2l6ZW9mKHRvZG9fZGF0YSk7IGJyZWFrOworICBjYXNlIDE6IG5yMj1ucjE7IGJyZWFrOworICBjYXNlIDI6IGJyZWFrOworICB9CisgIGlmIChucjE8MCkgbnIxPXNpemVvZih0b2RvX2RhdGEpK25yMSsxOworICBpZiAobnIyPDApIG5yMj1zaXplb2YodG9kb19kYXRhKStucjIrMTsKKyAgaWYgKG5yMTwxfHxucjI8MXx8bnIxPnNpemVvZih0b2RvX2RhdGEpfHxucjI+c2l6ZW9mKHRvZG9fZGF0YSkpCisgICAgcmV0dXJuIG5vdGlmeV9mYWlsKHNwcmludGYoIkRlaW5lIFRvZG8tTGlzdGUgaGF0IChnbHVlY2tsaWNoZXJ3ZWlzZSkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJudXIgJWQgRWludHJhJXMuXG4iLHNpemVvZih0b2RvX2RhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplb2YodG9kb19kYXRhKT4xPyJlZ2UiOiJnIikpKSwwOworICBvdXRwdXQ9IlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiI7CisgIGlmIChucjE+bnIyKSAvLyBSdWVja3dhZXJ0cworICB7CisgICAgd2hpbGUobnIxPj1ucjIpCisgICAgICBvdXRwdXQrPXNwcmludGYoIkVpbnRyYWcgTnIuICVkIHZvbiAlczpcbiVzXG5cbiIsbnIxLS0sCisgICAgICAgICAgIGR0aW1lKHRvZG9fZGF0YVtucjFdWzBdKSxicmVha19zdHJpbmcodG9kb19kYXRhW25yMV1bMV0sNzgsNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJTX0xFQVZFX01ZX0xGUykpOworICB9CisgIGVsc2UKKyAgeworICAgIG5yMS0tOworICAgIHdoaWxlIChucjE8bnIyKQorICAgICAgb3V0cHV0Kz1zcHJpbnRmKCJcbkVpbnRyYWcgTnIuICVkIHZvbiAlczpcbiVzXG4iLChucjErMSksCisgICAgICAgICAgIGR0aW1lKHRvZG9fZGF0YVtucjFdWzBdKSxicmVha19zdHJpbmcodG9kb19kYXRhW25yMSsrXVsxXSw3OCw1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlNfTEVBVkVfTVlfTEZTKSk7CisgIH0KKyAgTW9yZShvdXRwdXQrIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK3ByaXZhdGUgaW50IF90b2RvX3ZlcnNjaGllYmVuKHN0cmluZyBjbWRsaW5lKQoreworICBpbnQgZnJvbTsKKyAgbWl4ZWQgdG8sZHVtbXk7CisgIGlmICghKHNzY2FuZihjbWRsaW5lLCJ2ZXJzY2hpZWJlbiAlZCBuYWNoICVkIixmcm9tLHRvKT09Mnx8CisgICAgICAgIHNzY2FuZihjbWRsaW5lLCJ2ZXJzY2hpZWJlbiAlZCBuYWNoICVzIixmcm9tLHRvKT09MikpCisgICAgcmV0dXJuIDA7CisgIGZyb20tLTsKKyAgaWYgKHN0cmluZ3AodG8pKQorICB7CisgICAgc3dpdGNoKHRvKQorICAgIHsKKyAgICAgIGNhc2UgIm9iZW4iOiB0bz1mcm9tLTE7IGJyZWFrOworICAgICAgY2FzZSAidW50ZW4iOiB0bz1mcm9tKzE7IGJyZWFrOworICAgICAgZGVmYXVsdDogcmV0dXJuIDA7CisgICAgfQorICB9CisgIGVsc2UgdG8tLTsKKyAgaWYgKHRvPT1mcm9tKSByZXR1cm4gbm90aWZ5X2ZhaWwoIkRhIGlzdCBkZXIgRWludHJhZyBqYSBzY2hvbiFcbiIpLDA7CisgIGlmIChmcm9tPDB8fGZyb20+PXNpemVvZih0b2RvX2RhdGEpKSByZXR1cm4gbm90aWZ5X2ZhaWwoCisgICAgICAgICJXaWUgd2lsbHN0IER1IGVpbmVuIG5pY2h0IGV4aXN0ZW50ZW4gRWludHJhZyB2ZXJzY2hpZWJlbj9cbiIpLDA7CisgIGlmICh0bzwwfHx0bz49c2l6ZW9mKHRvZG9fZGF0YSkpIHJldHVybiBub3RpZnlfZmFpbCgKKyAgICAgICAgIkRhaGluIGthbm5zdCBEdSBkZW4gRWludHJhZyBuaWNodCB2ZXJzY2hpZWJlbi5cbiIpLDA7CisgIGR1bW15PXRvZG9fZGF0YVtmcm9tXTsKKyAgaWYgKHRvPmZyb20pCisgICAgd2hpbGUgKGZyb20rKzx0bykgdG9kb19kYXRhW2Zyb20tMV09dG9kb19kYXRhW2Zyb21dOworICBlbHNlCisgICAgd2hpbGUoZnJvbS0tPnRvKSB0b2RvX2RhdGFbZnJvbSsxXT10b2RvX2RhdGFbZnJvbV07CisgIHRvZG9fZGF0YVt0b109ZHVtbXk7CisgIHByaW50ZigiRWludHJhZyB3dXJkZSB2ZXJzY2hvYmVuLlxuIik7CisgIHJldHVybiAxOworfQorCitwcml2YXRlIGludCBfdG9kb19oaWxmZSgpCit7CisgIHByaW50ZigKKyAgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuIgorICAiIERpZSBUb2RvLUxpc3RlIGxhZXNzdCBzaWNoIG1pdCBkZW4gZm9sZ2VuZGVuIEJlZmVobGVuIHN0ZXVlcm46XG5cbiIKKyAgIiB0b2RvIG5ldSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBMZWd0IGVpbmVuIG5ldWVuIEVpbnRyYWcgYW4uXG4iCisgICIgdG9kbyBsb2VzY2hlbiA8bnVtbWVyPiAgICAgICAgICAgICAgICAgIC0gTG9lc2NodCBlaW5lbiBFaW50cmFnLlxuIgorICAiIHRvZG8gYW56ZWlnZW4gWzxudW1tZXI+IFtiaXMgPG51bW1lcj5dXSAtIFplaWd0IGRpZSBUb2RvLUxpc3RlIGFuLlxuIgorICAiIHRvZG8gdmVyc2NoaWViZW4gPG51bW1lcj4gbmFjaCA8emllbD4gICAtIFZlcnNjaGllYnQgZWluZW4gRWludHJhZy5cblxuIgorICAiIDx6aWVsPiBrYW5uIGVpbmUgWmFobCBvZGVyIGRpZSBXb3J0ZSAnb2Jlbicgb2RlciAndW50ZW4nIHNlaW4uXG4iCisgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBfdG9kbyhzdHJpbmcgY21kbGluZSkKK3sKKyAgc3RyaW5nICphcmdzOworICAKKyAgY21kbGluZT1fdW5wYXJzZWRfYXJncygxKTsKKyAgbm90aWZ5X2ZhaWwoIkZhbHNjaGUgU3ludGF4LiAndG9kbyBoaWxmZScgemVpZ3QgZWluZSBIaWxmZSBhbi5cbiIpOworICBpZiAoc2l6ZW9mKGNtZGxpbmUpKQorICB7CisgICAgYXJncz1leHBsb2RlKGNtZGxpbmUsIiAiKTsKKyAgICBzd2l0Y2goYXJnc1swXSkKKyAgICB7CisgICAgICBjYXNlICJuZXUiOiAgICAgICAgIHJldHVybiBfdG9kb19uZXUoY21kbGluZSk7CisgICAgICBjYXNlICJsb2VzY2hlbiI6ICAgIHJldHVybiBfdG9kb19sb2VzY2hlbihjbWRsaW5lKTsKKyAgICAgIGNhc2UgImFuemVpZ2VuIjogICAgcmV0dXJuIF90b2RvX2FuemVpZ2VuKGNtZGxpbmUpOworICAgICAgY2FzZSAidmVyc2NoaWViZW4iOiByZXR1cm4gX3RvZG9fdmVyc2NoaWViZW4oY21kbGluZSk7CisgICAgICBjYXNlICJoaWxmZSI6ICAgICAgIHJldHVybiBfdG9kb19oaWxmZSgpOworICAgICBkZWZhdWx0OiAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3N0ZC9zaGVsbHMvbWFnaWVyL3VwZC5jIGIvc3RkL3NoZWxscy9tYWdpZXIvdXBkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA5ZWE5YQotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9zaGVsbHMvbWFnaWVyL3VwZC5jCkBAIC0wLDAgKzEsNTYzIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gdXBkLmMKKy8vCisvLyAkSWQ6IHVwZC5jIDg4NTAgMjAxNC0wNi0xMyAyMTozNDo0NFogWmVzc3RyYSAkCisjcHJhZ21hIHN0cmljdF90eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8bWFnaWVyLmg+CisjaW5jbHVkZSA8cGxheWVyLmg+CisjdW5kZWYgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8ZGVidWdfaW5mby5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxsb2dnaW5nLmg+CisjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPgorCit2YXJhcmdzIHN0YXRpYyBpbnQgX21ha2Uoc3RyaW5nIGZpbGUsIGludCBmbGFncywgaW50IHJlY3Vyc2l2ZSk7CisKK3N0YXRpYyBtaXhlZCBfcXVlcnlfbG9jYWxjbWRzKCkKK3sKKyAgcmV0dXJuICh7KHsidXBkIiwiX3VwZCIsMCxMRUFSTkVSX0xWTH0pLAorICAgICAgICAgICAoeyJsb2FkIiwiX2xvYWQiLDAsTEVBUk5FUl9MVkx9KX0pOworfQorCisvLworLy8gX3NhdmUoKTogU3BpZWxlciBpbiBSZXR0dW5nc3JhdW0gcmV0dGVuCisvLyBvYmo6ICAgICAgU3BpZWxlcm9iamVrdCg/KQorLy8gaW52X3NhdmU6IFJldHR1bmdzcmF1bW5hbWUgCisvLyBSdWVja2dhYmU6IDAgd2VubiBrZWluIFNwaWVsZXJvYmpla3QKKy8vICAgICAgICAgICAgU3BpZWxlcm9iamVrdCwgZmFsbHMgZG9jaAorLy8KKworc3RhdGljIG1peGVkIF9zYXZlKCBvYmplY3Qgb2JqLCBvYmplY3QgaW52X3NhdmVyICkKK3sgCisgICAgaWYgKCBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iaikgKQorICAgICAgeyAKKyAgICAgICAgb2JqLT5tb3ZlKCBpbnZfc2F2ZXIsIE5PX0NIRUNLICk7CisgICAgICAgIHJldHVybiBvYmo7CisgICAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKworLy8KKy8vIF9yZWxvYWQoKTogT2JqZWt0IGxhZGVuCisvLyBmaWxlOiAgRmlsZW5hbWUuIE11c3MgaW4gZGVyIEZvcm0gL3h4L3h4L3h4LmMgdm9ybGllZ2VuCisvLyBjbG9uZTogID4gMCAtPiBFcyBzb2xsIGdlY2xvbnQgd2VyZGVuLCBlbnRoYWVsdCBPYmpla3RudW1tZXIgZGVzCisvLyAgICAgICAgICAgICAgICBWb3JnYWVuZ2Vyb2JqZWt0ZXMKKy8vIGZsYWdzOiBLb21tYW5kb3plaWxlbm9wdGlvbmVuCisvLyBlcnI6ICAgTGVlcnN0cmluZyBhbHMgUmVmZXJlbnogdWViZXJnZWJlbi4gRW50aGFlbHQgbmFjaCBkZW0KKy8vICAgICAgICBBdWZydWYgdm9tIF9yZWxvYWQoKSBkaWUgRmVobGVybWVsZHVuZ2VuIGFscyBTdHJpbmcuCisvLyBSdWVja2dhYmU6IERhcyBuZXUgZXJ6ZXVndGUgT2JqZWt0IGJ6dy4gZGFzIHNjaG9uIHZvcmhhbmRlbmUgT2JqZWt0CisvLyAgICAgICAgICAgIGJ6dy4gMCwgd2VubiBGZWhsZXIgYXVmdHJhdC4KKy8vCisKK3ByaXZhdGUgb2JqZWN0IF9yZWxvYWQoc3RyaW5nIGZpbGUsIGludCBjbG9uZSwgaW50IGZsYWdzLCBzdHJpbmcgZXJyKQoreworICBvYmplY3Qgb2JqOworICAKKyAgaWYgKCFvYmo9ZmluZF9vYmplY3QoZmlsZVswLi48M10rKGNsb25lPygiIyIrY2xvbmUpOiIiKSkpCisgIHsKKyAgICBpbnQgcG9zLHBvczI7CisgICAgc3RyaW5nIGJ0OworCisgICAgaWYoZmlsZV9zaXplKGZpbGUpPDApCisgICAgeworICAgICAgaWYgKGZpbGVfc2l6ZShmaWxlKT09LTEpCisgICAgICAgIGVyciA9IHNwcmludGYoInVwZDogJXM6IERhdGVpIGV4aXN0aWVydCBuaWNodC5cbiIsIGZpbGUpOworICAgICAgZWxzZSAvLyBkaXJlY3RvcnkKKyAgICAgICAgZXJyID0gc3ByaW50ZigidXBkOiAlczogVmVyemVpY2huaXNzZSBrb2VubmVuIG5pY2h0IGdlbGFkZW4gIgorICAgICAgICAgICAgICAgICAgICAgICJ3ZXJkZW4uXG4iLGZpbGUpOworICAgICAgcmV0dXJuIG9iajsgLy8gMAorICAgIH0KKyAgICBwb3MgPSBtYXgoZmlsZV9zaXplKF9fREVCVUdfTE9HX18pLDApOworCisgICAgaWYgKChlcnIgPSAoY2xvbmU/Y2F0Y2gob2JqID0gY2xvbmVfb2JqZWN0KGZpbGUpKToKKyAgICAgICAgICAgICAgICBjYXRjaChsb2FkX29iamVjdChmaWxlKSkgKSkgJiYgKGZsYWdzICYgVVBEX0IpKSAgICAgICAgCisgICAgeyAgICAgCisgICAgICBpZiAoKCBwb3MyPWZpbGVfc2l6ZShfX0RFQlVHX0xPR19fKSkgPiBwb3MgKQorICAgICAgICBlcnIrPXNwcmludGYoIlxuQmFja3RyYWNlOlxuJXMiLAorICAgICAgICAgICAgICAgICAgICAgcmVhZF9ieXRlcyhfX0RFQlVHX0xPR19fLHBvcywgcG9zMi1wb3MgKSk7CisgICAgICBlbHNlCisgICAgICAgIGVycis9c3ByaW50ZigiXG5LRUlOIEJBQ0tUUkFDRSBWRVJGVUVHQkFSIVxuIik7CisgICAgfQorICAgIGlmICghZXJyJiYhb2JqJiYoIW9iaiA9IGZpbmRfb2JqZWN0KGZpbGVbMC4uPDNdKSkpCisgICAgICBlcnIgKz0gc3ByaW50ZiggInVwZDogJXM6IEJsdWVwcmludCBuYWNoIGRlbSBMYWRlbiB6ZXJzdG9lcnQuXG4iLGZpbGUgKTsKKyAgfQorICBlbHNlCisgICAgZXJyPXNwcmludGYoInVwZDogT2JqZWt0IGV4aXN0aWVydCBzY2hvbjogJU9cbiIsb2JqKTsKKyAgcmV0dXJuIG9iajsKK30KKworCisvLworLy8gX3VwZGF0ZSgpOiBGaWxlIHVwZGF0ZW4gLT4gQmx1ZXByaW50IGRlc3RydWN0ZW4KKy8vIGZpbGU6ICBGaWxlbmFtZQorLy8gZHVtbXk6IHNpbXVsaWVyZW4/ICgxLT53aXJkIG5pY2h0IGFrdHVhbGlzaWVydCkKKy8vIGZsYWdzOiBLb21tYW5kb3plaWxlbm9wdGlvbmVuCisvLyBSdWVja2dhYmU6IC0xOiBLZWluZSBWb2xsenVncmlmZgorLy8gICAgICAgICAgICAgMDogT2JqZWt0IGlzdCBuaWNodCBnZWxhZGVuCisvLyAgICAgICAgICAgICAxOiBPcGVyYXRpb24gd2lyZCBkdXJjaGdlZnVlaHJ0CisvLworCitwcml2YXRlIHZhcmFyZ3MgaW50IF91cGRhdGUoc3RyaW5nIGZpbGUsIGludCBkdW1teSwgaW50IGZsYWdzKQoreworICBvYmplY3Qgb2JqOworICBzdHJpbmcgZXJyOworICBpZiAoIWR1bW15ICYmICFvYmplY3RwKG9iaiA9IGZpbmRfb2JqZWN0KGZpbGUpKSkgcmV0dXJuIDA7CisgIGlmICghSVNfQVJDSCh0aGlzX29iamVjdCgpKSkKKyAgeworICAgIC8vIFNjaHJlaWJyZWNodGUgbnVyIHBydWVmZW4sIHdlbm4gZWNodCBha3R1YWxpc2llcnQgd2VyZGVuIHNvbGwuCisgICAgaWYoIWR1bW15ICYmICFNQVlfV1JJVEUoZmlsZSkpCisgICAgICByZXR1cm4gKHByaW50ZigidXBkOqAlczogS2VpbmUgU2NocmVpYnJlY2h0ZSFcbiIsZmlsZSksIC0xKTsKKyAgICBpZighTUFZX1JFQUQoZmlsZSkpIAorICAgICAgcmV0dXJuIChwcmludGYoInVwZDogJXM6IEtlaW5lIExlc2VyZWNodGUhXG4iLCBmaWxlKSwgLTEpOworICB9CisgIGlmIChkdW1teSkgcmV0dXJuIDE7CisgIAorICBpZiAoIGZsYWdzICYgVVBEX0QgKQorICB7CisgICAgb2JqZWN0ICppbnY7CisgICAgaWYgKHNpemVvZihpbnYgPSBkZWVwX2ludmVudG9yeShvYmopKSkKKyAgICB7CisgICAgICBwcmludGYoInVwZDogJXM6IEVudGZlcm5lIE9iamVrdGUgaW0gSW52ZW50YXJcbiIsIGZpbGUgKTsKKyAgICAgIGlmICghKGZsYWdzJlVQRF9IKSkKKyAgICAgIHsKKyAgICAgICAgaWYoZXJyPWNhdGNoKGZpbHRlcl9vYmplY3RzKCBpbnYsICJyZW1vdmUiLCAxICkpKQorICAgICAgICAgIHByaW50ZigidXBkOiAlczogRmVobGdlc2NobGFnZW4uIEdydW5kOlxuJXNcbiIsCisgICAgICAgICAgICAgICAgIGZpbGUsZXJyKTsKKyAgICAgIH0KKyAgICAgIGlmIChzaXplb2YoaW52ID0gZGVlcF9pbnZlbnRvcnkob2JqKSkpCisgICAgICAgIGZpbHRlcihpbnYsIGZ1bmN0aW9uIHZvaWQgKG9iamVjdCBvYikKKyAgICAgICAgICAgIHtkZXN0cnVjdChvYik7fSk7CisgICAgfQorICB9CisgIGlmICghKGZsYWdzJlVQRF9IKSkKKyAgeworICAgIGlmKGVyciA9IGNhdGNoKG9iai0+cmVtb3ZlKCkpKQorICAgICAgcHJpbnRmKCJ1cGQ6ICVzOiByZW1vdmUoKSBmZWhsZ2VzY2hsYWdlbi4gQXVmcnVmIHZvbiAiICsKKyAgICAgICAgICAgICAiZGVzdHJ1Y3QoKS5cbiIsZmlsZSk7CisgIH0KKyAgaWYob2JqZWN0cChvYmopKSBkZXN0cnVjdChvYmopOworICByZXR1cm4gMTsKK30KKworCisvLworLy8gX2luc3RhbmNlX3VwZCgpOiBBbGxlIE9iamVrdGUgbmFjaCBDbG9uZXMgZGVzIE9iamVrdHMgZHVyY2hzdWNoZW4KKy8vIGZpbGU6ICBGaWxlbmFtZSBkZXMgT2JqZWt0ZXMKKy8vIGZsYWdzOiBLb21tYW5kb3plaWxlbmFyZ3VtZW50ZQorLy8gb2JqOiAgIEFrdHVlbGxlcyBPYmpla3QKKy8vIGluc3RhbmNlczogWmFobCBkZXIgZ2VmdW5kZW5lbiBJbnN0YW56ZW4KKy8vCisKK3ByaXZhdGUgdm9pZCBfaW5zdGFuY2VfdXBkKHN0cmluZyBmaWxlLCBpbnQgZmxhZ3MsIG1peGVkIG9iaiwgaW50IGluc3RhbmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaXJzdGNhbGwpCit7CisgaW50IGk7CisgaWYgKGZpcnN0Y2FsbCkKKyAgICBwcmludGYoInVwZDogJXM6ICVzIEluc3Rhbnplbi5cbiIsZmlsZSxmbGFncyZVUERfQT8iQWt0dWFsaXNpZXJlIjoiU3VjaGUiKTsKKyAgCisgIHdoaWxlIChnZXRfZXZhbF9jb3N0KCk+MjIwMDAwICYmIGkgPCBzaXplb2Yob2JqKSkKKyAgeworICAgIGlmICghb2JqZWN0cChvYmpbaV0pKQorICAgICAgaW5zdGFuY2VzLS07CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmIChmbGFncyZVUERfRiYmIShmbGFncyZVUERfUykpCisgICAgICAgIHByaW50ZiggInVwZDogJU8gZ2VmdW5kZW4gaW4gJXNcbiIsIG9ialtpXSwKKyAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChvYmpbaV0pP29iamVjdF9uYW1lKGVudmlyb25tZW50KG9ialtpXSkpIAorICAgICAgICAgICAgICAgIDogImtlaW5lciBVbWdlYnVuZyIgKTsKKyAgICAgIGlmIChmbGFncyZVUERfQSkgX21ha2Uob2JqZWN0X25hbWUob2JqW2ldKSwgZmxhZ3MgJiB+KFVQRF9BfFVQRF9GKSwxICk7CisgICAgfQorICAgIGkrKzsKKyAgfQorICBpZiAoaSA8IHNpemVvZihvYmopKSAKKyAgICBjYWxsX291dCggIydfaW5zdGFuY2VfdXBkLyonKi8sMixmaWxlLGZsYWdzLG9ialtpLi5dLGluc3RhbmNlcywwKTsKKyAgZWxzZQorICAgIHByaW50ZiggInVwZDogJXM6ICVkIEluc3RhbnplbiAlc1xuIiwgZmlsZSwgaW5zdGFuY2VzLAorICAgICAgICAgICAgKGZsYWdzICYgVVBEX0EpID8gImFrdHVhbGlzaWVydCIgOiAiZ2VmdW5kZW4iICk7CisgIHJldHVybjsKK30KKyAgCisgIAorLy8KKy8vIF9kb19tYWtlKCk6IEFsbGUgZ2VlcmJ0ZW4gT2JqZWt0ZSBiZWFyYmVpdGVuIChmdWVyIC1tLy12KQorLy8gZmlsZTogIE5hbWUgZGVzIEZpbGVzCisvLyBjbG9uZTogMCwgd2VubiBibHVlcHJpbnQsIGFuc29uc3RlbiBDbG9uZW51bW1lcgorLy8gZmxhZ3M6IEtvbW1hbmRvemVpbGVucGFyYW1ldGVyCisvLyBkZXA6ICAgZ2VzY2hhY2h0ZWx0ZXMgQXJyYXkgbWl0IE1lbGR1bmdlbiAod2cuIFJla3Vyc2lvbikKKy8vIHJlYWR5OiBBcnJheSBkZXIgc2Nob24gYmVhcmJlaXRldGVuIE9iamVrdGUgKHdnLiBSZWt1cnNpb24pCisvLyBSdWVja2dhYmU6IEFycmF5IGRlciBPYmpla3RuYW1lbiwgZGllIGJlYXJiZWl0ZXQgd3VyZGVuCisvLyAgICAgICAgICAgIChBcnJheSBpbiBBcnJheSBpbiAuLi4pCisvLyAKKwordmFyYXJncyBwcml2YXRlIGludCBfZG9fbWFrZSggc3RyaW5nIGZpbGUsaW50IGNsb25lLGludCBmbGFncyxtaXhlZCBkZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgKnJlYWR5ICkKK3sKKyAgb2JqZWN0IG9iajsKKyAgc3RyaW5nIGVycjsKKyAgc3RyaW5nICppbGlzdDsKKyAgbWl4ZWQgZG93bmRlcHM7CisgIGludCByZXQ7CisgIAorICBpZiAoIXBvaW50ZXJwKHJlYWR5KSkgcmVhZHkgPSAoe30pOworICByZWFkeSArPSAoeyBmaWxlIH0pOworICAKKyAgaWYgKCAhKG9iaiA9IF9yZWxvYWQoZmlsZSxjbG9uZSxmbGFncywmZXJyKSkpCisgIHsKKyAgICBkZXAgKz0gKHsgZXJyIH0pOworICAgIHJldHVybiAwOworICB9CisgIAorICBpbGlzdCA9IGluaGVyaXRfbGlzdChvYmopLXJlYWR5OworICAKKyAgZG93bmRlcHMgPSAoe30pOworICAKKyAgd2hpbGUgKHNpemVvZihpbGlzdCkpCisgIHsKKyAgICByZXQgPSBfZG9fbWFrZSggaWxpc3RbMF0sMCxmbGFncywgJmRvd25kZXBzLCAmcmVhZHkgKXx8cmV0OworICAgIGlsaXN0WzAuLjBdID0gKHt9KTsKKyAgICBpbGlzdCAtPSByZWFkeTsKKyAgfQorICAKKyAgaWYgKCByZXR8fGZpbGVfdGltZShmaWxlKT5wcm9ncmFtX3RpbWUob2JqKXx8KGZsYWdzICZVUERfSSkpCisgICAgaWYgKCBfbWFrZSggZmlsZSwgZmxhZ3MgJiB+KFVQRF9NfFVQRF9JKSAsMSkgPCAwICkgCisgICAgICBkZXAgPSAoeyAieyIgKyBleHBsb2RlKGZpbGUsIi8iKVs8MV0gKyAifSIsIGRvd25kZXBzIH0pOworICAgIGVsc2V7CisgICAgICBkZXAgPSAoeyAiWyIgKyBleHBsb2RlKGZpbGUsIi8iKVs8MV0gKyAiXSIsIGRvd25kZXBzIH0pOworICAgICAgcmV0ID0gMTsKKyAgICB9CisgIGVsc2UgaWYgKGZsYWdzJlVQRF9WKSBkZXAgKz0gKHsgZXhwbG9kZShmaWxlLCIvIilbPDFdLCBkb3duZGVwcyB9KTsKKyAgcmV0dXJuIHJldDsKK30KKworCisvLworLy8gX21ha2VfZGVwKCk6IEF1c2dhYmUgZGVzIEVyZXJidW5nc2JhdW1lcworLy8gT2JqZWt0ZSBpbSBBcnJheSBkZXAKKy8vIHByZWZpeCBlbnRoYWVsdCBaZWlsZW5hbmZhbmcgKGZ1ZXIgUmVrdXJzaW9uKQorLy8gUnVlY2tnYWJlOiBTdHJpbmcgbWl0IGRlbSBWZXJlcmJ1bmdzYmF1bSBkZXMgT2JqZWt0ZXMKKy8vCisKK3ByaXZhdGUgc3RyaW5nIF9tYWtlX2RlcCggbWl4ZWQgZGVwLCBzdHJpbmcgcHJlZml4ICkKK3sKKyAgc3RyaW5nIHJldDsKKyAgaW50IGksIHNpemU7CisgIAorICByZXQ9IiI7CisgIHNpemU9c2l6ZW9mKGRlcCk7CisgIGZvciAoaT0wOyBpPHNpemU7aSsrKQorICAgIGlmIChwb2ludGVycChkZXBbaV0pKQorICAgICAgcmV0ICs9IF9tYWtlX2RlcChkZXBbaV0scHJlZml4ICsgKGkgPCAoc2l6ZS0xKSA/ICJ8ICI6IiAiKSk7CisgICAgZWxzZSAKKyAgICAgIHJldCArPSBwcmVmaXggKyAiKy0iICsgZGVwW2ldICsgIlxuIjsKKyAgcmV0dXJuIHJldDsKK30KKworCisvLworLy8gX2lsbGVnYWxfY2xvc3VyZSgpOiBpc3QgY2xvc3VyZSBpbiBhcmcgYW4gb2JqZWt0IGdlYnVuZGVuPworLy8gYXJnOiBjbG9zdXJlKC1hcnJheS9tYXBwaW5nKQorLy8gUnVlY2tnYWJlOiAwIHdlbm4gYWxsZXMgb2theQorLy8gICAgICAgICAgICAxIHdlbm4gY2xvc3VyZSBnZWxvZXNjaHQgd2VyZGVuIG11c3MKKy8vCisKK3ByaXZhdGUgaW50IF9pbGxlZ2FsX2Nsb3N1cmUoIG1peGVkIGFyZyApCit7CisgIGludCBpLCBqOworICBzdHJpbmcgKmluZGljZXM7CisgIAorICBpZiAoIGNsb3N1cmVwKGFyZykgJiYgIW9iamVjdHAocXVlcnlfY2xvc3VyZV9vYmplY3QoYXJnKSkgKQorICAgIHJldHVybiAxOworICAKKyAgaWYgKCBwb2ludGVycChhcmcpICl7CisgICAgZm9yICggaSA9IHNpemVvZihhcmcpOyBpLS07ICkKKyAgICAgIGlmICggX2lsbGVnYWxfY2xvc3VyZShhcmdbaV0pICkKKyAgICAgICAgcmV0dXJuIDE7CisgIH0KKyAgZWxzZSBpZiAoIG1hcHBpbmdwKGFyZykgKXsKKyAgICBpbmRpY2VzID0gbV9pbmRpY2VzKGFyZyk7CisgICAgZm9yICggaSA9IHNpemVvZihpbmRpY2VzKTsgaS0tOyApCisgICAgICBmb3IgKCBqID0gZ2V0X3R5cGVfaW5mbyggYXJnLCAxICk7IGotLTsgKQorICAgICAgICBpZiAoIF9pbGxlZ2FsX2Nsb3N1cmUoYXJnW2luZGljZXNbaV0sIGpdKSApCisgICAgICAgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vCisvLyBfbWFrZSgpOiBVcGRhdGUgZmlsZQorLy8gZmlsZTogIEZpbGVuYW1lCisvLyBmbGFnczogS29tbWFuZG96ZWlsZW5hcmd1bWVudGUKKy8vCisKK3ZhcmFyZ3Mgc3RhdGljIGludCBfbWFrZShzdHJpbmcgZmlsZSwgaW50IGZsYWdzLGludCByZWN1cnNpdmUpCit7CisgIHN0cmluZyBtc2csIGVyciwgYmx1ZTsKKyAgaW50IGluc3Q7CisgIG9iamVjdCBvYmosIGludl9zYXZlcjsKKyAgbWl4ZWQgdG1wOworICAKKyAgbXNnID0gIiI7CisKKyAgaWYgKCFmaWxlKSByZXR1cm4gcHJpbnRmKCAidXBkOiBLZWluIEZpbGVuYW1lIHVlYmVyZ2ViZW4hXG4iICksIFJFVF9GQUlMOworICAgIAorLy8gRmlsZW5hbWUgaW4gQmx1ZSwgT2JqZWt0bmFtZSBpbiBibHVlLCBJbnN0YW56bnVtbWVyIGluIGluc3QKKworICBpZiAoc3NjYW5mKGZpbGUsIiVzIyVkIixibHVlLGluc3QpPT0yKSBibHVlICs9ICIuYyI7CisgIGVsc2UgYmx1ZSA9IGZpbGUgKyAoZmlsZVs8Mi4uXT09Ii5jIiA/ICIiIDogIi5jIik7CisKKy8vIEFsbGUgSW5zdGFuemVuIGR1cmNoc3VjaGVuIGltIEZhbGxlIHZvbiAtYSBvZGVyIC1mIAorCisgIGlmICgoZmxhZ3MgJiBVUERfTE9BRCkmJmZpbmRfb2JqZWN0KGZpbGUpKQorICAgIHJldHVybiBwcmludGYoImxvYWQ6ICVzOiBPYmpla3QgaXN0IHNjaG9uIGdlbGFkZW4uXG4iLGZpbGUpLFJFVF9PSzsKKyAgCisgIGlmICggZmxhZ3MgJiAoVVBEX0Z8VVBEX0EpKQorICB7CisgICAgaWYgKGluc3QpIHJldHVybiBwcmludGYoICJ1cGQ6ICVzOiBFaW5lIEluc3Rhbnoga2FubiBrZWluZSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNsb25lcyBoYWJlbi5cbiIsZmlsZSApLCBSRVRfRkFJTDsKKyAgICBpZiAoKHRtcD1fdXBkYXRlKGZpbGUsIDEsZmxhZ3MpKT09LTEpIAorICAgICAgcmV0dXJuIHByaW50ZiggInVwZDogJXM6IEtlaW4gVm9sbHp1Z3JpZmYgYXVmIGRpZSAiICsKKyAgICAgICAgICAgICAgICAgICAgICJEYXRlaSBlcmxhdWJ0LlxuIixmaWxlKSwgUkVUX0ZBSUw7CisgICAgaWYgKHRtcD09MCkgcmV0dXJuIFJFVF9GQUlMOworCisgICB0bXA9Y2xvbmVzKGJsdWVbMC4uPDNdLDIpOworICAgIGlmIChzaXplb2YodG1wKSkKKyAgICAgIGNhbGxfb3V0KCAjJ19pbnN0YW5jZV91cGQvKicqLywgMCwgZmlsZSxmbGFncyx0bXAsc2l6ZW9mKHRtcCksMSk7CisgICAgZWxzZQorICAgICAgcHJpbnRmKCAidXBkOiAlczogS2VpbmUgQ2xvbmVzIHZvcmhhbmRlbiFcbiIsIGJsdWVbMC4uPDNdKTsKKworICAgIGlmICggKGZsYWdzICYgVVBEX0YpICYmICEoZmxhZ3MgJihVUERfUnxVUERfTHxVUERfTE9BRCkpKSByZXR1cm4gUkVUX09LOyAKKyAgICAvLyBOaWNodHMgbGFkZW4gLT4gQXVjaCBrZWluIEJhY2t1cAorICB9CisKKy8vIEJhY2t1cHJhdW0gZmVzdGxlZ2VuCisgICAKKyAgaWYoIGJsdWU9PUlOVl9TQVZFICkgeworICAgICAgICAgICAgICAgIHByaW50ZigidXBkOiBBY2h0dW5nOiBSYXVtIHp1bSBad2lzY2hlbnNwZWljaGVybiBzb2xsIGdlbGFkZW4gd2VyZGVuPyFcbiIpOworICAgICAgICB9IAorICBpZiAoICEoaW52X3NhdmVyPWxvYWRfb2JqZWN0KElOVl9TQVZFKSkgKQorICB7CisgICAgcHJpbnRmKCJ1cGQ6ICVzOiBSYXVtIHp1bSBad2lzY2hlbnNwZWljaGVybiBkZXMgIiArCisgICAgICAgICAgICJSYXVtaW5oYWx0cyBpc3QgbmljaHQgbGFkYmFyLlxuIiArCisgICAgICAgICAgICIgICAgICAgICAlc1xuIixmaWxlLElOVl9TQVZFKTsKKyAgICByZXR1cm4gUkVUX0ZBSUw7CisgIH0KKworLy8gV2VubiBkYXMgT2JqZWt0IGV4aXN0aWVydCBiencuIERlZXAgYWt0dWFsaXNpZXJ0IHdlcmRlbiBzb2xsCisKKyAgaWYgKCAoIShmbGFncyZVUERfTE9BRCkpJiYKKyAgICAgICAoKG9iaiA9IGZpbmRfb2JqZWN0KGZpbGUpKSB8fCAoZmxhZ3MgJiAoVVBEX018VVBEX0kpKSkpCisgIHsKKyAgICBvYmplY3QgKmludiwgZW52LCAqcGxfaW52OworICAgIG1hcHBpbmcgcHJvOworICAgIGludCBpOworICAgIG1peGVkIGNvbmZpZ2RhdGE7CisgICAgaW50IHJlc3RvcmVfY29uZmlnOworCisgICAgLy8gV2VubiBPYmpla3QgZXhpc3RpZXJ0LCBkYW5uIEluaGFsdCB1bmQgZ2dmLiBEYXRlbiBhdXMgQ29uZmlndXJlKCkgb2RlcgorICAgIC8vIFByb3BzIHNpY2hlcm46CisgICAgaWYgKG9iaikKKyAgICB7CisgICAgICAvLyBpbSBGYWxsIFVQRF9DIGVyZm9sZ3QgX2tlaW5fIEF1c2xlc2VuIHVuZCBfa2VpbmVfIFJlc3RhdXJhdGlvbgorICAgICAgLy8gbWl0dGVscyBDb25maWd1cmUoKQorICAgICAgaWYgKCAhIChmbGFncyAmIFVQRF9DICkgKQorICAgICAgeworICAgICAgICBjYXRjaChyZXN0b3JlX2NvbmZpZz0obWl4ZWQpY2FsbF9yZXNvbHZlZCgmY29uZmlnZGF0YSxvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb25maWd1cmUiLDApOworICAgICAgICAgICAgICBwdWJsaXNoKTsKKyAgICAgICAgLy8gV2VubiBVUERfQ09ORiBnZXNldHp0IHdpcmQsIF9tdXNzXyBkYXMgT2JqZWt0IGVpbiBvZWZmZW50bGljaGVzCisgICAgICAgIC8vIENvbmZpZ3VyZSgpIGRlZmluaWVyZW4sIHNvbnN0IGVyZm9sZ3QgQWJicnVjaC4KKyAgICAgICAgaWYgKChmbGFncyAmIFVQRF9DT05GKSAmJiAhcmVzdG9yZV9jb25maWcpCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGYoInVwZDogJXM6IGhhdCBrZWluIENvbmZpZ3VyZSgpLCBaZXJzdG9lcnVuZyBhYmdlYnJvY2hlbi5cbiIsZmlsZSk7CisgICAgICAgICAgcmV0dXJuIFJFVF9GQUlMOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoIShmbGFncyZVUERfRCkmJihmbGFncyYoVVBEX0x8VVBEX1IpKSkKKyAgICAgIHsKKyAgICAgICAgaWYgKGk9c2l6ZW9mKGludj0oYWxsX2ludmVudG9yeShvYmopLSh7MH0pKSkpCisgICAgICAgIHsKKyAgICAgICAgICBtaXhlZCBpdGVtczsKKyAgICAgICAgICAvLyBIZXJhdXNiZWtvbW1lbiwgb2IgaGllciBJdGVtcyBleGlzdGllcmVuLCBkaWUgcGVyIEFkZEl0ZW0gCisgICAgICAgICAgLy8gZXJ6ZXVndCB3ZXJkZW4uIERpZSBkdWVyZmVuIG5pY2h0IGdlc2ljaGVydCB3ZXJkZW4uCisgICAgICAgICAgaXRlbXM9KG1peGVkKW9iai0+UXVlcnlQcm9wKFBfSVRFTVMpOyAvLyBtaXhlZCwgZGEgYXJyYXkgb2YgYXJyYXlzCisgICAgICAgICAgaWYgKHBvaW50ZXJwKGl0ZW1zKSYmc2l6ZW9mKGl0ZW1zKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBpdGVtcz10cmFuc3Bvc2VfYXJyYXkoaXRlbXMpWzBdOworICAgICAgICAgICAgd2hpbGUgKGktLSkKKyAgICAgICAgICAgICAgaWYgKG1lbWJlcihpdGVtcywgaW52W2ldKT09LTEpCisgICAgICAgICAgICAgICAgICAgIGludltpXS0+bW92ZShpbnZfc2F2ZXIsTk9fQ0hFQ0spOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIC8vIEluIGRpZXNlbSBPYmpla3Qgc2luZCBrZWluZSBJdGVtcyBnZXNldHp0LgorICAgICAgICAgICAgd2hpbGUgKGktLSkgaW52W2ldLT5tb3ZlKGludl9zYXZlcixOT19DSEVDSyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaW52PW1hcCggZGVlcF9pbnZlbnRvcnkob2JqKSwgIydfc2F2ZS8qJyovLCBpbnZfc2F2ZXIgKS0oezB9KTsKKyAgICAgIH0KKyAgICAgIGVudiA9IGVudmlyb25tZW50KG9iaik7CisgICAgICBpZiAoIGZsYWdzICYgVVBEX0MgKQorICAgICAgeworICAgICAgICBwcm8gPSAobWFwcGluZykob2JqLT5RdWVyeVByb3BlcnRpZXMoKSk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaW52ID0gKHt9KTsKKworLy8gRXJlcmJ0ZSBPYmpla3RlIGR1cmNoc3VjaGVuLgorICAgIGlmICggZmxhZ3MgJiAoVVBEX018VVBEX0kpICkKKyAgICB7CisgICAgICBtaXhlZCBkZXA7CisgICAgICBkZXAgPSAoe30pOworICAgICAgX2RvX21ha2UoIGJsdWUsIGluc3QsIGZsYWdzICYgfihVUERfTXxVUERfTHxVUERfUnxVUERfRnxVUERfQSksICZkZXAgKTsKKyAgICAgIHByaW50ZiggX21ha2VfZGVwKCBkZXAsICIiICkgKyAiXG4iICk7CisgICAgfQorICAgCisvLyBUYXRzYWVjaGxpY2hlbiBVcGRhdGUgZHVyY2hmdWVocmVuCisgICAKKyAgICBpZiAoIF91cGRhdGUoZmlsZSwgMCwgZmxhZ3MpPCAwKSByZXR1cm4gUkVUX0ZBSUw7CisgICAgbXNnICs9IChpbnN0ID8gInplcnN0b2VydCIgOiAiYWt0dWFsaXNpZXJ0Iik7CisgICAgCisvLyBOZXUgbGFkZW4gPz8KKyAgICBpZiAoIGZsYWdzICYgKFVQRF9SfFVQRF9MKSApCisgICAgeworICAgICAgaWYgKCBvYmogPSBfcmVsb2FkKCBibHVlLGluc3QsZmxhZ3MsICZlcnIgKSApCisgICAgICAgIG1zZyArPSAiLCAiICsgKGluc3QgPyAibmV1IGdlY2xvbnQiIDogIm5ldSBnZWxhZGVuIik7CisgICAgIAorLy8gTmV1IGdlbGFkZW46IFByb3BlcnRpZXMgd2llZGVyaGVyc3RlbGxlbiwgQ2xvc3VyZXMgZmlsdGVybiAKKyAgICAgIGlmICghZXJyKQorICAgICAgeworICAgICAgICBpZiAoIW9iaikgb2JqID0gZmluZF9vYmplY3QoZmlsZSk7CisgICAgICAgIC8vIFdlbm4gZ2V3dWVuc2NodCwgUHJvcHMgenVydWVja3NjaHJlaWJlbiAoaGF0IFByaW9yaXRhZXQgdm9yCisgICAgICAgIC8vIENvbmZpZ3VyZSgpLCB3ZWlsIGV4cGxpeml0IHZvbSBNYWdpZXIgYW5nZWZvcmRlcnQpLgorICAgICAgICBpZiAoIHBybyAmJiAoZmxhZ3MgJiBVUERfQykgKQorICAgICAgICB7CisgICAgICAgICAgc3RyaW5nICpuYW1lczsKKyAgICAgICAgICAKKyAgICAgICAgICBuYW1lcyA9IG1faW5kaWNlcyhwcm8pOworICAgICAgICAgIAorICAgICAgICAgIC8vIENsb3N1cmVzIGluIChtaXR0bGVyd2VpbGUpIHplcnN0b2VydGVuIE9iamVrdGVuCisgICAgICAgICAgLy8gcmF1c2ZpbHRlcm4sIGRhbWl0IGRpZSAoaG9mZmVudGxpY2gga29ycmVrdGVuKSBDbG9zdXJlcworICAgICAgICAgIC8vIGltIG5ldSBnZWNsb250ZW4gT2JqZWt0IGVyaGFsdGVuIGJsZWliZW4KKyAgICAgICAgICBmb3IgKCBpID0gc2l6ZW9mKG5hbWVzKTsgaS0tOyApCisgICAgICAgICAgICBpZiAoIF9pbGxlZ2FsX2Nsb3N1cmUocHJvW25hbWVzW2ldLCBGX1ZBTFVFXSkgfHwKKyAgICAgICAgICAgICAgICAgX2lsbGVnYWxfY2xvc3VyZShwcm9bbmFtZXNbaV0sIEZfUVVFUllfTUVUSE9EXSkgfHwKKyAgICAgICAgICAgICAgICAgX2lsbGVnYWxfY2xvc3VyZShwcm9bbmFtZXNbaV0sIEZfU0VUX01FVEhPRF0pICkKKyAgICAgICAgICAgICAgbV9kZWxldGUoIHBybywgbmFtZXNbaV0gKTsKKyAgICAgICAgICAKKyAgICAgICAgICBvYmotPlNldFByb3BlcnRpZXMocHJvKTsKKyAgICAgICAgICBtc2cgKz0gIiwgUHJvcGVydGllcyBnZXNldHp0IjsKKyAgICAgICAgfQorICAgICAgICAvLyBXZW5uIGtlaW4gVVBEX0MsIHdpcmQgZ2dmLiBkYXMgRXJnZWJuaXMgdm9uIENvbmZpZ3VyZSgpIHdpZWRlcgorICAgICAgICAvLyB1ZWJlcmdlYmVuLgorICAgICAgICBlbHNlIGlmIChyZXN0b3JlX2NvbmZpZykKKyAgICAgICAgeworICAgICAgICAgIGludCBjb25mX3JlczsKKyAgICAgICAgICBpZiAoIWNhdGNoKGNvbmZfcmVzPShpbnQpb2JqLT5Db25maWd1cmUoY29uZmlnZGF0YSk7IHB1Ymxpc2gpCisgICAgICAgICAgICAgICYmIGNvbmZfcmVzID09IDEpCisgICAgICAgICAgeworICAgICAgICAgICAgbXNnICs9ICIsIChyZS0pa29uZmlndXJpZXJ0IjsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIG1zZyArPSAiLCAoUmUtKUtvbmZpZ3VyYXRpb24gZmVobGdlc2NobGFnZW4iOworICAgICAgICAgICAgaWYgKGZsYWdzICYgVVBEX0NPTkYpCisgICAgICAgICAgICAgIHByaW50ZigidXBkOiBEYXRlbiB2b24gJXMga29ubnRlbiBuaWNodCByZWtvbmZpZ3VyaWVydCB3ZXJkZW46ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlT1xuIiwgZmlsZSwgY29uZmlnZGF0YSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChlbnYpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIG9iai0+bW92ZSggZW52LCBOT19DSEVDSyApIDw9IDAgKQorICAgICAgICAgICAgcHJpbnRmKCAidXBkOiAvJU8ga29ubnRlIG5pY2h0IGluIC8lTyB6dXJ1ZWNrYmV3ZWd0IHdlcmRlblxuIiwKKyAgICAgICAgICAgICAgICAgICAgb2JqLCBlbnYgKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBtc2cgKz0gIiwgYmV3ZWd0IjsKKyAgICAgICAgfQorICAgICAgICBpZiAoaT1zaXplb2YoaW52KSkKKyAgICAgICAgeworICAgICAgICAgIHdoaWxlKGktLSkgaWYgKGludltpXSkgaW52W2ldLT5tb3ZlKG9iaiwgTk9fQ0hFQ0sgKTsKKyAgICAgICAgICBtc2cgKz0gIiwgSW5oYWx0IHp1cnVlY2tiZXdlZ3QiOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIAorICAgICAgICByZXR1cm4gcHJpbnRmKCAidXBkOiAlczogJXMiLCBmaWxlLCBlcnIgKSwgUkVUX0ZBSUw7CisgICAgfQorICB9CisgIGVsc2UgCisgICAgaWYgKCAhX3VwZGF0ZShmaWxlLCAwLCBmbGFncykgJiYgKGZsYWdzICYgKFVQRF9MfFVQRF9MT0FEKSkgKQorICAgICAgaWYgKCAhX3JlbG9hZCggYmx1ZSwgaW5zdCwgZmxhZ3MsICZlcnIgKSApCisgICAgICAgIHJldHVybiBwcmludGYoICIlczogJXM6ICVzIiwgKGZsYWdzJlVQRF9MT0FEPyJsb2FkIjoidXBkIiksZmlsZSwgZXJyICksCisgICAgICAgICAgUkVUX0ZBSUw7CisgICAgICBlbHNlCisgICAgICAgIG1zZyArPSAiZ2VsYWRlbiI7CisgIAorICBpZiAoIHNpemVvZihtc2cpJiYhKGZsYWdzJlVQRF9TJiZyZWN1cnNpdmUpICkKKyAgICBwcmludGYoIiVzOiAlczogJXMuXG4iLChmbGFncyZVUERfTE9BRD8ibG9hZCI6InVwZCIpLGZpbGUsbXNnKTsKKyAgcmV0dXJuIFJFVF9PSzsKK30KKworLy8KKy8vIF91cGQ6IE9iamVrdGUgbGFkZW4sIHplcnN0b2VyZW4gdW5kIGFrdHVhbGlzaWVyZW4KKy8vCisKK3N0YXRpYyBpbnQgX3VwZChzdHJpbmcgY21kbGluZSkKK3sKKyAgaW50IGZsYWdzOworICBtaXhlZCAqYXJnczsKKworICBjbWRsaW5lPV91bnBhcnNlZF9hcmdzKCk7CisgIGFyZ3M9cGFyc2VhcmdzKGNtZGxpbmUsJmZsYWdzLFVQRF9PUFRTLDEpOworICBpZihmbGFncz09LTF8fCFzaXplb2YoYXJncykpCisgICAgcmV0dXJuIFVTQUdFKCJ1cGQgWy0iK1VQRF9PUFRTKyJdIDxkYXRlaT4gWzxkYXRlaT4gLi5dIik7CisgIGlmICgoZmxhZ3MgJiBVUERfQykgJiYgKGZsYWdzICYgVVBEX0NPTkYpKQorICB7CisgICAgcHJpbnRmKCJ1cGQ6IC1jIHVuZCAtQyBnbGVpY2h6ZWl0aWcgd2VyZGVuIG5pY2h0IHVudGVyc3R1ZXR6dC5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIGFyZ3M9ZmlsZV9saXN0KGFyZ3MsTU9ERV9VUEQsMCwiLyIpOworICBpZighc2l6ZW9mKGFyZ3MpKSByZXR1cm4gcHJpbnRmKCJ1cGQ6IEtlaW5lIHBhc3NlbmRlIERhdGVpIGdlZnVuZGVuIVxuIiksMTsKKworICBhcmdzPW1hcChhcmdzLCg6ICQxW0ZVTExOQU1FXSA6KSktKHswfSk7CisKKyAgaWYoIXNpemVvZihhcmdzKSkKKyAgeworICAgIHByaW50ZigidXBkOiBWZXJ6ZWljaG5pc3NlIGtvZW5uZW4gbmljaHQgYWt0dWFsaXNpZXJ0IHdlcmRlbiFcbiIpOworICAgIHJldHVybiAxOworICB9CisgIGFzeW5jaHJvbihhcmdzLCMnX21ha2UsZmxhZ3MsMCwwKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vCisvLyBfbG9hZDogT2JqZWt0ZSBsYWRlbgorLy8KKworc3RhdGljIGludCBfbG9hZChzdHJpbmcgY21kbGluZSkKK3sKKyAgaW50IGZsYWdzOworICBtaXhlZCAqYXJnczsKKworICBjbWRsaW5lPV91bnBhcnNlZF9hcmdzKCk7CisgIGFyZ3M9cGFyc2VhcmdzKGNtZGxpbmUsJmZsYWdzLCIiLDEpOworICBpZihmbGFncz09LTF8fCFzaXplb2YoYXJncykpCisgICAgcmV0dXJuIFVTQUdFKCJsb2FkIDxkYXRlaT4gWzxkYXRlaT4gLi5dIik7CisgIGFyZ3M9ZmlsZV9saXN0KGFyZ3MsTU9ERV9VUEQsMCwiLyIpOworICBpZighc2l6ZW9mKGFyZ3MpKSByZXR1cm4gcHJpbnRmKCJsb2FkOiBLZWluZSBwYXNzZW5kZSBEYXRlaSBnZWZ1bmRlbiFcbiIpLDE7CisgIGFyZ3M9bWFwKGFyZ3MsKDogKCgkMVtGSUxFU0laRV0hPS0yfHxmaW5kX29iamVjdCgkMVtGVUxMTkFNRV0pKT8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgJDFbRlVMTE5BTUVdOjApIDopKS0oezB9KTsKKworICBpZighc2l6ZW9mKGFyZ3MpKQorICAgIHJldHVybiBwcmludGYoImxvYWQ6IFZlcnplaWNobmlzc2Uga29lbm5lbiBuaWNodCBnZWxhZGVuIHdlcmRlbiFcbiIpLDE7CisgIGFzeW5jaHJvbihhcmdzLCMnX21ha2UsVVBEX0xPQUQsMCwwKTsKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9zdGQvc2hlbGxzL29yYy5jIGIvc3RkL3NoZWxscy9vcmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWM3M2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkL3NoZWxscy9vcmMuYwpAQCAtMCwwICsxLDIwMyBAQAorI3ByYWdtYSBzdHJvbmdfdHlwZXMsc2F2ZV90eXBlcworCitpbmhlcml0ICJzdGQvcGxheWVyL2Jhc2UiOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGF0dHJpYnV0ZXMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxoZWFsdGguaD4KKyNpbmNsdWRlIDxuZXdfc2tpbGxzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxjb21iYXQuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8ZGVmdWVsLmg+CisKKy8qCisgKiBPcmtzOgorICogT3JrcyBzaW5kIGVpZ2VudGxpY2ggYm9lc2UgdW5kIGJsdXRydWVuc3RpZywgd2FzIGF1Y2ggb2Z0IGdlbnVnIHp1bSAKKyAqIFZvcnNjaGVpbiB0cml0dCA6KSBXZW5uIGVpbiBPcmsgenUgaGVmdGlnIGZvcnNjaHQsIHF1ZW5nZWx0IGVyIHJ1bSAKKyAqIHVuZCB3ZWlnZXJ0IHNpY2gsIGJpcyBlciBuaWNodCB3aWVkZXIgZWluIGJpc3NjaGVuIEJsdXQgdmVyc3ByaXR6dAorICogaGF0LAorKi8gCisjZGVmaW5lIEZfTUFYIDUwMAorI2RlZmluZSBGX0RFRyAzIAorI2RlZmluZSBOT19FWEFNSU5FICh7IFwKKyAgICAiRHUga251cnJzdDogSWNoIHdpbGwgQmx1dCwga2VpbmUgQmx1ZW1jaGVuLiIsIFwKKyAgICAiRHUgZ3J1bW1lbHN0OiBCaW4gaWNoIGVpbiBGb3JzY2hlciwgb2RlciB3YXM/IiBcCisgICAgfSkKKworc3RhdGljIGludCBmX2NudCwgZl9kZWc7CisKK2ludCAKK1F1ZXJ5RkNudCgpIHsKKyAgcmV0dXJuIGZfY250OworfQorCitpbnQgCitTZXRGQ250KGludCBmYykgeworICBpZihmYyA+IC0xICYmIGZjIDwgRl9NQVgpCisgICAgZl9jbnQgPSBmYzsKKyAgcmV0dXJuIGZfY250OworfQorICAKK2ludAorUXVlcnlGRGVnKCkgeworICByZXR1cm4gZl9kZWc7Cit9CisKK3ZvaWQgCitjcmVhdGUoKSB7CisgIGlmICghY2xvbmVwKCkgfHwgb2JqZWN0X25hbWUodGhpc19vYmplY3QoKSkgPT0gX19GSUxFX19bMC4uPDNdKSB7CisgICAgICBzZXRfbmV4dF9yZXNldCgtMSk7ICAgIAorICAgICAgcmV0dXJuOworICB9CisKKyAgbWl4ZWQgcmVzOworCisgIGJhc2U6OmNyZWF0ZSgpOworCisgIGZfY250PTA7CisgIGZfZGVnPUZfREVHOworICAKKyAgU2V0RGVmYXVsdEhvbWUoIi9kL3ZsYW5kL21vcmdvdGgvcm9vbS9jaXR5L3JhdGhhbGxlIik7CisgIFNldERlZmF1bHRQcmF5Um9vbSgiL2QvdmxhbmQvbW9yZ290aC9yb29tL2NpdHkvYzA2MDYiKTsKKyAgU2V0UHJvcChQX0FUVFJJQlVURVNfT0ZGU0VUUywoW0FfU1RSOjMsQV9JTlQ6LTEsQV9DT046Ml0pKTsKKyAgLyogS2xlaW5lIGFlaCBncm9zc2UgTXVza2VscGFrZXRlICovCisgIFNldFByb3AoUF9TS0lMTF9BVFRSSUJVVEVfT0ZGU0VUUywoW1NBX0RBTUFHRToxMTBdKSk7CisgIFNldFByb3AoUF9BVkVSQUdFX1NJWkUsMTk1KTsKKyAgU2V0UHJvcChQX0FWRVJBR0VfV0VJR0hULDEyNTAwMCk7IC8vIHppZW1saWNoIHNjaHdlciwgdmllbGUgTXVza2VsbgorICBTZXRQcm9wKFBfTUFURVJJQUxfS05PV0xFREdFLChbTUFUR1JPVVBfREVBRDo2MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BVEdST1VQX0JJTzo0MCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVRHUk9VUF9FTEVNRU5UQUw6IDIwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BVF9CTE9PRDoxMDBdKSk7CisgIFNldFByb3AoUF9DSEFOTkVMUywgUXVlcnlQcm9wKFBfQ0hBTk5FTFMpICsgKHsiVXJ1ay1IYWkifSkpOworICBTZXRQcm9wKFBfUkVTSVNUQU5DRV9TVFJFTkdUSFMsCisJICAoWyAKKyAgICAgRFRfRklSRSA6IC0wLjIsCisgICAgIERUX0hPTFkgOjAuMywKKyAgICAgRFRfVU5IT0xZIDogLTAuMiwKKwkgICBEVF9BQ0lEIDogMC4yIF0pKTsKKworICBTZXRQcm9wKFBfTUFYX0ZPT0QsMTEwKTsKKyAgU2V0UHJvcChQX01BWF9EUklOSywxMTApOworICBTZXRQcm9wKFBfTUFYX0FMQ09IT0wsMTUwKTsKKyAgU2V0UHJvcChQX0RFRlVFTF9MSU1JVF9GT09ELDUwKTsKKyAgU2V0UHJvcChQX0RFRlVFTF9MSU1JVF9EUklOSyw3MCk7CisgIFNldFByb3AoUF9ERUZVRUxfVElNRV9GT09ELDMwMCk7CisgIFNldFByb3AoUF9ERUZVRUxfVElNRV9EUklOSyw0MDApOworICBTZXRQcm9wKFBfREVGVUVMX0FNT1VOVF9GT09ELDAuNCk7CisgIFNldFByb3AoUF9ERUZVRUxfQU1PVU5UX0RSSU5LLDAuMzUpOworCisgIC8qIFNQIHJlZ2VuZXJpZXJlbiBzaWUgbmljaCBnYW56IHNvIHNjaG5lbGwsIGRhZnVlciBzaW5kIHNpZQorICAgKiBlaW4gYmlzY2hlbiBzY2huZWxsZXIgYmVpIEdpZnQgdW5kIEZ1dHRlciAqLworICBTZXRQcm9wKFBfU1BfREVMQVksSEVBTF9ERUxBWSsxKTsKKyAgU2V0UHJvcChQX1BPSVNPTl9ERUxBWSxQT0lTT05fREVMQVktMSk7CisgIFNldFByb3AoUF9GT09EX0RFTEFZLEZPT0RfREVMQVktMSk7CisKKyAgU2V0UHJvcChQX01BR0lDX1JFU0lTVEFOQ0VfT0ZGU0VULAorICAgICAgICAgIChbIE1UX0FOR1JJRkYgOiA1MDAsCisgICAgICAgIAkgICBNVF9JTExVU0lPTiA6IC0yNTAsCisgICAgICAgICAgICAgTVRfQkVIRVJSU0NIVU5HIDogLTI1MCwKKyAgICAgICAgCSAgIE1UX1ZFUldBTkRMVU5HIDogNTAwIF0pKTsKKworCisgIGlmKCEocmVzPVF1ZXJ5UHJvcChQX0hBTkRTKSkgfHwgIXBvaW50ZXJwKHJlcykgfHwgKHNpemVvZihyZXMpPDMpKQorICAgIHJlcz0oeyIgbWl0IHN0YXJrZW4gSGFlbmRlbiIsMzUsKHtEVF9CTFVER0VPTiwgRFRfUklQfSkgfSk7CisgIFNldFByb3AoUF9IQU5EUyxyZXMpOworICAvKiBPcmtzIGhhYmVuIGRpY2tlIEhhdXQgKi8KKyAgU2V0UHJvcChQX0JPRFksMjApOworCisgIC8qIEdyb2Vzc2Ugd2lyZCBudXIgZWlubWFsIGdlc2V0enQgKi8KKyAgaWYoIVF1ZXJ5UHJvcChQX1NJWkUpKXsKKyAgICBTZXRQcm9wKFBfU0laRSwxODArcmFuZG9tKDMxKSk7CisgICAgU2V0KFBfU0laRSxTQVZFLEZfTU9ERV9BUyk7CisgIH0KKworICAvKiBEaXRvIEdld2ljaHQgKi8KKyAgaWYoIVF1ZXJ5UHJvcChQX1dFSUdIVCkgfHwgKFF1ZXJ5UHJvcChQX1dFSUdIVCkgPT0gNzUwMDApKXsKKyAgICBTZXRQcm9wKFBfV0VJR0hULDEwMDAwMCtyYW5kb20oMjUwMDEpK3JhbmRvbSgyNTAwMSkpOworICAgIFNldChQX1dFSUdIVCxTQVZFLEZfTU9ERV9BUyk7CisgIH0KK30KKworc3RyaW5nIAorX3F1ZXJ5X3JhY2UoKSB7CisgIHJldHVybiAiT3JrIjsKK30KKworc3RyaW5nIAorX3F1ZXJ5X3JlYWxfcmFjZSgpIHsKKyAgcmV0dXJuICJPcmsiOworfQorCitzdHJpbmcgCitfcXVlcnlfcmFjZWRlc2NyKCkgeworICByZXR1cm4gYnJlYWtfc3RyaW5nKCJFaW4gT3JrLiBEaWUgYnJ1dGFsZSBNYWNodCBkZXMgQm9lc2VuLiBFaW4gIgorICAgICAgImVyYml0dGVydGVyIEthZW1wZmVyLCBvaG5lIEZ1cmNodCB2b3IgZGVtIFRvZC4gU28gc3RlbGxzdCBEdSAiCisgICAgICAiRGlyIGVpbmVuIE9yayB2b3IuXG5EaWVzZSBPcmtzIHNlaGVuIHZpZWxsZWljaHQgYXVzc2VybGljaCBzbyAiCisgICAgICAiYXVzOiBFaW5lIGRpY2tlIHVuZCBkdW5rbGUsIGxlZGVyYXJ0aWdlIEhhdXQsIGRpZSBzaWNoZXIgIgorICAgICAgImVpbmlnZXMgYW4gU2NobGFlZ2VuIGFiaGFlbHQuIExhbmdlIEVja3phZWhuZSwgZGllIHNpY2hlciBib2VzZSAiCisgICAgICAiV3VuZGVuIHJlaXNzZW4ga29lbm5lbi5cbkR1IHNwdWVyc3QsIGRhc3MgZGllc2UgT3JrcyBoaWVyIGVpbiAiCisgICAgICAid2VuaWcgYW5kZXJzIHNpbmQuIElocmVuIERyYW5nIG5hY2ggZGVtIEJsdXQgaWhyZXIgRmVpbmRlIHNjaGVpbmVuICIKKyAgICAgICJzaWUgcmVjaHQgZ3V0IHVudGVyIEtvbnRyb2xsZSB6dSBoYWJlbiwgZGllIG1laXN0ZSBaZWl0IHp1bWluZGVzdC4gIgorICAgICAgIlNpZSBzaW5kIGluIGRlciBMYWdlLCBmcmllZGxpY2ggendpc2NoZW4gZGVuIGFuZGVyZW4gUmFzc2VuIHp1ICIKKyAgICAgICJ3YW5kZWxuLiBEZW5ub2NoIHNpbmQgdm9yIGFsbGVtIGRpZSBVcnVrLUhhaSBPcmtzIGFscyBHZWduZXIgbmljaHQgIgorICAgICAgInp1IHVudGVyc2NoYWV0emVuLCBzb2xsdGUgZXMgZG9jaCBlaW5tYWwgenUgZWluZW0gS2FtcGYga29tbWVuLiIsCisgICAgICA3OCwwLEJTX0xFQVZFX01ZX0xGUyk7Cit9CisKK2ludCAKK1F1ZXJ5QWxsb3dTZWxlY3QoKSB7IAorICByZXR1cm4gMTsgCit9CisKK3N0cmluZyAKKypfcXVlcnlfcmFjZXN0cmluZygpIHsKKyAgaWYgKFF1ZXJ5UHJvcChQX0dFTkRFUik9PUZFTUFMRSkKKyAgICByZXR1cm4gKHsiT3JraW4iLCJPcmtpbiIsIk9ya2luIiwiT3JraW4ifSk7CisgIHJldHVybiAoeyJPcmsiLCJPcmtlcyIsIk9yayIsIk9yayJ9KTsKK30KKworc3RyaW5nIAorX3F1ZXJ5X2RlZmF1bHRfZ3VpbGQoKXsKKyAgcmV0dXJuICJ1cnVraGFpIjsKK30KKworbWl4ZWQgCitSYWNlRGVmYXVsdChzdHJpbmcgYXJnKSB7CisgIGlmICghYXJnKQorICAgIHJldHVybiAwOworICBzd2l0Y2goYXJnKSB7CisgICAgY2FzZSBQX0hBTkRTIDoKKyAgICAgIHJldHVybiAoeyIgbWl0IHN0YXJrZW4gSGFlbmRlbiIsMzUsKHtEVF9CTFVER0VPTixEVF9SSVB9KSB9KTsKKyAgICBjYXNlIFBfQk9EWSA6CisgICAgICByZXR1cm4gMjU7CisgIH0KKyAgcmV0dXJuIGJhc2U6OlJhY2VEZWZhdWx0KGFyZyk7Cit9CisKK3Byb3RlY3RlZCB2b2lkIGhlYXJ0X2JlYXQoKSB7CisgIDo6aGVhcnRfYmVhdCgpOworCisgIGlmKGZfY250ID4gMCAmJiAhLS1mX2RlZykgeworICAgIGZfY250LS07CisgICAgZl9kZWc9Rl9ERUc7CisgIH0KK30KKwordm9pZAorQXR0YWNrKG9iamVjdCBlbmVteSkgeworICBpZihmX2NudCA+IDApCisgICAgZl9jbnQtLTsKKyAgcmV0dXJuIDo6QXR0YWNrKGVuZW15KTsKK30KKwordmFyYXJncyBpbnQgCitfZXhhbWluZShzdHJpbmcgc3RyLCBpbnQgbW9kZSkgeworCisgIGlmKCsrZl9jbnQgPiBGX01BWCkgeworICAgIHRlbGxfb2JqZWN0KHRoaXNfb2JqZWN0KCksYnJlYWtfc3RyaW5nKE5PX0VYQU1JTkVbcmFuZG9tKHNpemVvZihOT19FWEFNSU5FKSldLDc4KSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDo6X2V4YW1pbmUoc3RyLG1vZGUpOworfQpkaWZmIC0tZ2l0IGEvc3RkL3NoZWxscy90ZXN0aWUuYyBiL3N0ZC9zaGVsbHMvdGVzdGllLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThjNDJhZgotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9zaGVsbHMvdGVzdGllLmMKQEAgLTAsMCArMSw2IEBACisjcHJhZ21hIHN0cm9uZ190eXBlcyxzYXZlX3R5cGVzCisKK2luaGVyaXQgIi9zdGQvc2hlbGxzL2h1bWFuIjsKKworaW50IFF1ZXJ5QWxsb3dTZWxlY3QoKSB7IHJldHVybiAwOyB9CisKZGlmZiAtLWdpdCBhL3N0ZC9zaG9wLmMgYi9zdGQvc2hvcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0Y2Y2OTAKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvc2hvcC5jCkBAIC0wLDAgKzEsMzggQEAKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKworaW5oZXJpdCAiL3N0ZC9yb29tIjsKK2luaGVyaXQgIi9zdGQvcm9vbS9zaG9wIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgaWYgKG9iamVjdF9uYW1lKHRoaXNfb2JqZWN0KCkpID09IF9fRklMRV9fWzAuLjwzXSkKKyAgeworICAgIHNldF9uZXh0X3Jlc2V0KC0xKTsKKyAgICByZXR1cm47CisgIH0KKyAgcm9vbTo6Y3JlYXRlKCk7CisgIHNob3A6OmNyZWF0ZSgpOworCisgIFNldFByb3AoUF9MSUdIVCwgMSk7CisgIFNldFByb3AoUF9JTkRPT1JTLDEpOworICBTZXRQcm9wKFBfSU5UX1NIT1JULCAiU3RkTGFkZW4iKTsKKyAgU2V0UHJvcChQX0lOVF9MT05HLAorICAgIkRlciBNYWdpZXIsIGRlciBkaWVzZW4gTGFkZW4gZXJzY2h1ZiwgZmFuZCBrZWluZSBCZXNjaHJlaWJ1bmcgZGFmdWVyLlxuIik7CisgIEFkZEl0ZW0oIi9vYmovZW50c29yZyIsUkVGUkVTSF9SRU1PVkUpOworfQorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGVfc3VwZXIoKSB7CisgIHNldF9uZXh0X3Jlc2V0KC0xKTsKK30KKwordm9pZCByZXNldCgpCit7CisgIHJvb206OnJlc2V0KCk7CisgIHNob3A6OnJlc2V0KCk7Cit9CmRpZmYgLS1naXQgYS9zdGQvc3BlbGxib29rLmMgYi9zdGQvc3BlbGxib29rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRmODI0ZgotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9zcGVsbGJvb2suYwpAQCAtMCwwICsxLDc4NSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHNwZWxsYm9vay5jIC0tIEdydW5kbGVnZW5kZSBGdW5rdGlvbmVuIGZ1ZXIgWmF1YmVyc3BydWVjaGUKKy8vCisvLyAkSWQ6IHNwZWxsYm9vay5jIDkxNDIgMjAxNS0wMi0wNCAyMjoxNzoyOVogWmVzc3RyYSAkCisjcHJhZ21hIHN0cmljdF90eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIG5vX3NoYWRvdworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworI3ByYWdtYSByYW5nZV9jaGVjaworCisvLyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCitpbmhlcml0ICIvc3RkL3RoaW5nIjsKK2luaGVyaXQgIi9zdGQvcmVzdHJpY3Rpb25fY2hlY2tlciI7Citpbmhlcml0ICIvc3RkL3BsYXllci9wa2xvZyI7CisKKyNpbmNsdWRlIDx0aGluZy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPG5ld19za2lsbHMuaD4KKyNpbmNsdWRlIDxzcGVsbGJvb2suaD4KKyNkZWZpbmUgTUUgdGhpc19vYmplY3QoKQorCit2b2lkIGNyZWF0ZSgpIHsKKyAgc2V0ZXVpZChnZXR1aWQoKSk7CisgIC8vIGRpZXNlIFByb3Agc29sbHRlIHZvbiBhdXNzZW4gbmljaHQgZGlyZWt0IGdlYWVuZGVydCB3ZXJkZW4ga29lbm5lbi4KKyAgU2V0KFBfU0JfU1BFTExTLChbXSksRl9WQUxVRSk7CisgIFNldChQX1NCX1NQRUxMUyxQUk9URUNURUQsRl9NT0RFX0FTKTsKKworICA6OmNyZWF0ZSgpOworfQorCittYXBwaW5nIF9xdWVyeV9zYl9zcGVsbHMoKSB7CisgICAgLy8gS29waWUgbGllZmVybiwgZGEgc29uc3QgdmVyc2VoZW50bGljaCBzY2huZWxsIGVpbmUgQWVuZGVydW5nIGRlcworICAgIC8vIG9yaWdpbmFsZW4gTWFwcGluZ3MgaGllciBwYXNzaWVyZW4ga2Fubi4KKyAgICByZXR1cm4oZGVlcF9jb3B5KFF1ZXJ5KFBfU0JfU1BFTExTLCBGX1ZBTFVFKSkpOworfQorCittYXBwaW5nIFF1ZXJ5U3BlbGwoc3RyaW5nIHNwZWxsKSB7CisgIG1hcHBpbmcgc3BpOworCisgIC8vUXVlcnktTWV0aG9kZSB1bWdlaGVuLCBkYW1pdCBudXIgZWluIFNwZWxsbWFwcGluZyBrb3BpZXJ0IHdlcmRlbiBtdXNzIHVuZAorICAvL25pY2h0IGRhcyBnYW56ZW4gTWFwcGluZyBtaXQgYWxsZW4gU3BlbGxzLgorICBpZiAoIXNwZWxsCisgICAgICB8fCAhKHNwaT1RdWVyeShQX1NCX1NQRUxMUykpCisgICAgICB8fCAhKHNwaT1zcGlbc3BlbGxdKSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIGRlZXBfY29weShzcGkpOworfQorCit2YXJhcmdzIGludAorQWRkU3BlbGwoc3RyaW5nIHZlcmIsIGludCBrb3N0ZW4sIG1peGVkIHNraSkgeworICBpbnQgbGV2ZWw7CisgIG1hcHBpbmcgc3BlbGxzOworCisgIGlmICghdmVyYiB8fCBrb3N0ZW48MCkKKyAgICByZXR1cm4gMDsKKyAgCisgIHZlcmI9bG93ZXJfY2FzZSh2ZXJiKTsKKyAgbGV2ZWw9KGludHAoc2tpKSk/c2tpOjA7CisKKyAgaWYgKCFtYXBwaW5ncChza2kpKSBza2k9KFtdKTsKKyAgLy8gWnVyIFNpY2hlcmhlaXQgZWluZSBLb3BpZSBtYWNoZW4sIHdlciB3ZWlzcywgd2FzIGRhIHVlYmVyZ2ViZW4gd2lyZCwgYnp3LgorICAvLyB3YXMgZGVyIFNldHplbmRlIG1pdCBza2kgaGludGVyaGVyIG5vY2ggbWFjaHQuCisgIGVsc2Ugc2tpPWRlZXBfY29weShza2kpOworCisgIHNraT1BZGRTa2lsbE1hcHBpbmdzKFF1ZXJ5UHJvcChQX0dMT0JBTF9TS0lMTFBST1BTKSxza2kpOworICBza2krPShbU0lfU1BFTExDT1NUOmtvc3Rlbl0pOworICAvLyBTSV9TUEVMTC1TdWJtYXBwaW5nIGhpbnp1ZnVlZ2VuLCB3ZW5uIG5pY2h0IGRhLgorICBpZiAoIW1lbWJlcihza2ksU0lfU1BFTEwpKQorICAgICAgc2tpKz0oW1NJX1NQRUxMOihbXSkgXSk7CisgIC8vIHNraVtTSV9TUEVMTF1bU1BfTkFNRV0gZXJnYWVuemVuLCBnZ2YuIGF1cyBza2kgdmVyc2NoaWViZW4KKyAgaWYgKCFzdHJpbmdwKHNraVtTSV9TUEVMTF1bU1BfTkFNRV0pICYmIHN0cmluZ3Aoc2tpW1NQX05BTUVdKSkgeworICAgICAgc2tpW1NJX1NQRUxMXVtTUF9OQU1FXSA9IHNraVtTUF9OQU1FXTsKKyAgICAgIG1fZGVsZXRlKHNraSwgU1BfTkFNRSk7CisgIH0KKyAgZWxzZSBpZiAoIXN0cmluZ3Aoc2tpW1NJX1NQRUxMXVtTUF9OQU1FXSkpIHsKKyAgICAgIHNraVtTSV9TUEVMTF1bU1BfTkFNRV0gPSB2ZXJiOworICB9CisgIGlmIChzdHJpbmdwKHNraVtTUF9OQU1FXSkpIHsKKyAgICAgIG1fZGVsZXRlKHNraSwgU1BfTkFNRSk7CisgIH0KKworICBpZiAobGV2ZWwpCisgICAgc2tpPUFkZFNraWxsTWFwcGluZ3Moc2tpLChbU0lfU0tJTExSRVNUUl9MRUFSTjooW1BfTEVWRUw6bGV2ZWxdKV0pKTsKKyAgCisgIC8vIEFiZnJhZ2UgcGVyIFF1ZXJ5KCksIHVtIGRhcyBNYXBwaW5nIGFscyBSZWZlcmVueiwgbmljaHQgYWxzIEtvcGllIHp1CisgIC8vIGJla29tbWVuLCBkYXMgc3BhcnQgZXR3YXMgWmVpdC4KKyAgaWYgKCEoc3BlbGxzPVF1ZXJ5KFBfU0JfU1BFTExTLEZfVkFMVUUpKSkgeworICAgIHNwZWxscz0oW10pOworICAgIFNldFByb3AoUF9TQl9TUEVMTFMsc3BlbGxzKTsKKyAgfQorICAvLyBTcGVsbCBzZXR6ZW4uLi4KKyAgc3BlbGxzW3ZlcmJdPXNraTsKKyAgLy8gU2V0KCkgbmljaHQgbm9ldGlnLCBkYSBRdWVyeSgpIGFuIHNwZWxsIGRhcyBPcmlnaW5hbG1hcHBpbmcgZ2VsaWVmZXJ0IGhhdAorICAvLyB1bmQgZGllc2VzIGJlcmVpdHMgamV0enQgZ2VhZW5kZXJ0IHd1cmRlLiA7LSkKKyAgLy9TZXQoUF9TQl9TUEVMTFMsc3BlbGxzKyhbdmVyYjpza2ldKSxGX1ZBTFVFKTsKKworICAvLyBoYXQgd29obCBnZWtsYXBwdC4uLgorICByZXR1cm4oMSk7Cit9CisKK2ludAorVHJ5QXR0YWNrU3BlbGwob2JqZWN0IHZpY3RpbSwgaW50IGRhbWFnZSwgbWl4ZWQgZHR5cGVzLAorICAgICAgICAgICAgICAgbWl4ZWQgaXNfc3BlbGwsIG9iamVjdCBjYXN0ZXIsIG1hcHBpbmcgc2luZm8pIHsKKyAgbWl4ZWQgbm9fYXR0YWNrOworICBpbnQgbm9tYWc7CisKKyAgaWYgKG5vX2F0dGFjayA9IChtaXhlZCl2aWN0aW0tPlF1ZXJ5UHJvcChQX05PX0FUVEFDSykpIHsKKyAgICBpZiAoc3RyaW5ncChub19hdHRhY2spKQorICAgICAgd3JpdGUobm9fYXR0YWNrKTsKKyAgICBlbHNlCisgICAgICB3cml0ZSh2aWN0aW0tPk5hbWUoV0VSLDEpKyIgbGFlc3N0IHNpY2ggbmljaHQgYW5ncmVpZmVuIVxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKHZpY3RpbS0+UXVlcnlQcm9wKFBfR0hPU1QpKSB7CisgICAgd3JpdGUodmljdGltLT5OYW1lKFdFUiwxKSsiIGlzdCBlaW4gR2Vpc3QhXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGRhbWFnZT0oZGFtYWdlKihpbnQpY2FzdGVyLT5RdWVyeVNraWxsQXR0cmlidXRlKFNBX0RBTUFHRSkpLzEwMDsKKworICAvLyBnZ2YuIExvZ2dlbiB2b24gUEstVmVyc3VjaGVuIHVuZCBnZ2YuIGF1c3NlcmRlbSBBbmdyaWZmIGFiYnJlY2hlbi4KKyAgLy8gQlRXOiBBdWZydWYgdm9uIEluc2VydEVuZW15KCkgZ2lidCAwIHp1cnVlY2ssIHdlbm4gZGVyIEdlZ25lciBuaWNodAorICAvLyBlaW5nZXRyYWdlbiB3dXJkZS4gQWxsZXJkaW5ncyB0dXQgZXMgZGFzIGF1Y2gsIHdlbm4gZGVyIEdlZ25lciBzY2hvbgorICAvLyBGZWluZCB3YXIuIERhaGVyIG11c3Mgbm9jaCBnZXBydWVmdCB3ZXJkZW4sIG9iIG5hY2ggZGVtIEluc2VydEVuZW15KCkgZGllCisgIC8vIGJlaWRlbiBTcGllbGVyIEZlaW5kZSBzaW5kLiBXZW5uIG5pY2h0LCB3aXJkIGRlciBTcGVsbCBhdWNoIGFiZ2Vicm9jaGVuCisgIC8vIHVuZCBlaW5lIE1lbGR1bmcgYXVzZ2VnZWJlbi4KKyAgaWYgKHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoY2FzdGVyKSAmJiBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHZpY3RpbSkKKyAgICAgICYmIENoZWNrUGxheWVyQXR0YWNrKGNhc3RlciwgdmljdGltLCAKKyAgICAgICAgc3ByaW50ZigiU3BlbGxib29rOiAlTywgU3BlbGw6ICVPXG4iLAorICAgICAgICAgICAgICAgIG9iamVjdF9uYW1lKHRoaXNfb2JqZWN0KCkpLAorICAgICAgICAgICAgICAgICgobWFwcGluZ3Aoc2luZm8pICYmIGlzX3NwZWxsKSA/IHNpbmZvW1NQX05BTUVdICA6ICIiKSkpCisgICAgICAmJiAhY2FzdGVyLT5Jc0VuZW15KHZpY3RpbSkKKyAgICAgICYmICFjYXN0ZXItPkluc2VydEVuZW15KHZpY3RpbSkKKyAgICAgICkKKyAgeworICAgIHRlbGxfb2JqZWN0KE1FLCAiRWluIGdvZXR0bGljaGVyIEVpbmZsdXNzIHNjaHVldHp0IERlaW5lbiBHZWduZXIuXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIG5vbWFnPShpbnQpdmljdGltLT5RdWVyeVByb3AoUF9OT01BR0lDKTsKKyAgaWYgKChzaW5mb1tTSV9OT01BR0lDXSA8IG5vbWFnKSAmJgorICAgICAgbm9tYWcqMTAwID4gcmFuZG9tKDEwMCkqKGludCljYXN0ZXItPlF1ZXJ5U2tpbGxBdHRyaWJ1dGUoU0FfRU5FTVlfU0FWRSkpIHsKKyAgICBwcmludGYoIiVzIHdlaHJ0IERlaW5lbiBaYXViZXIgYWIuXG4iLCBjYXBpdGFsaXplKChzdHJpbmcpdmljdGltLT5uYW1lKFdFUiwgMSkpKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBlbHNlIHsKKyAgICByZXR1cm4gKGludCl2aWN0aW0tPkRlZmVuZChkYW1hZ2UsIGR0eXBlcywgaXNfc3BlbGwsIGNhc3Rlcik7CisgIH0KK30KKwordmFyYXJncyBpbnQKK1RyeURlZmF1bHRBdHRhY2tTcGVsbChvYmplY3QgdmljdGltLCBvYmplY3QgY2FzdGVyLCBtYXBwaW5nIHNpbmZvLCAKKyAgICAgICAgICAgICAgICAgICAgICBtaXhlZCBzaV9zcGVsbCkgeworICBvYmplY3QgdGVhbTsKKyAgaW50IHJvdzsKKyAgCisgIGlmICghc2lfc3BlbGwpIHNpX3NwZWxsPXNpbmZvW1NJX1NQRUxMXTsKKyAgLy8gV2VubiBkZXIgU3BpZWxlciBpbiBlaW5lbSBUZWFtIGlzdCwgZGllIFRlYW1yZWloZW4tQm9uaQorICAvLyBiZXJ1ZWNrc2ljaHRpZ2VuLiBXZW5uIG5pY2h0LCBlYmVuIG5pY2h0LgorICBpZiAoIXRlYW09KChvYmplY3QpY2FzdGVyLT5RdWVyeVByb3AoUF9URUFNKSkpCisgIHJldHVybiBUcnlBdHRhY2tTcGVsbCh2aWN0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICBHZXRSYW5kRlZhbHVlTyhTSV9TS0lMTERBTUFHRSxzaW5mbyxjYXN0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgR2V0RGF0YShTSV9TS0lMTERBTUFHRV9UWVBFLHNpbmZvLGNhc3RlciksCisgICAgICAgICAgICAgICAgICAgICAgICBzaV9zcGVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpbmZvKTsKKyAgZWxzZQorICB7CisJICByb3c9KGludCljYXN0ZXItPlByZXNlbnRQb3NpdGlvbigpOworCSAgcmV0dXJuIFRyeUF0dGFja1NwZWxsKHZpY3RpbSwKKwkJICBHZXRSYW5kRlZhbHVlTyhTSV9TS0lMTERBTUFHRSxzaW5mbyxjYXN0ZXIpKworCQkgIC8vIE51ciB3ZW5uIFNJX1NLSUxMREFNQUdFX0JZX1JPVyBlaW4gbWFwcGluZyBpc3QsIAorCQkgIC8vIHJhbmRvbWlzaWVydCBhZGRpZXJlbgorCQkgIChtYXBwaW5ncChzaW5mb1tTSV9TS0lMTERBTUFHRV9CWV9ST1ddKT8KKwkJICAgcmFuZG9tKHNpbmZvW1NJX1NLSUxMREFNQUdFX0JZX1JPV11bcm93XSk6MCkrCisJCSAgLy8gTnVyIHdlbm4gZGFzIE9GRlNFVCBkYXZvbiBlaW4gbWFwcGluZyBpc3QsCisJCSAgLy8gbmljaHQgcmFuZG9taXNpZXJ0IGFkZGllcmVuLgorCQkgIChtYXBwaW5ncChzaW5mb1tPRkZTRVQoU0lfU0tJTExEQU1BR0VfQllfUk9XKV0pPworCQkgICBzaW5mb1tPRkZTRVQoU0lfU0tJTExEQU1BR0VfQllfUk9XKV1bcm93XSA6IDApLAorCQkgICBHZXREYXRhKFNJX1NLSUxMREFNQUdFX1RZUEUsc2luZm8sY2FzdGVyKSwKKwkJICAgc2lfc3BlbGwsY2FzdGVyLHNpbmZvKTsKKyAgIH0KK30KKworI2RlZmluZSBTTVVMKHgseSkgKCh4PDAgJiYgeTwwKT8oLTEqeCp5KTooeCp5KSkKK2ludAorU3BlbGxTdWNjZXNzKG9iamVjdCBjYXN0ZXIsIG1hcHBpbmcgc2luZm8pIHsKKyAgaW50IGN2YWwsYWJpbCxyZXM7CisKKyAgYWJpbD1zaW5mb1tTSV9TS0lMTEFCSUxJVFldOworICBjdmFsPShpbnQpY2FzdGVyLT5Vc2VTa2lsbChTS19DQVNUSU5HKTsKKyAgcmVzPWFiaWwgKyAoU01VTChhYmlsLGN2YWwpKSAvIE1BWF9BQklMSVRZIC0gcmFuZG9tKE1BWF9BQklMSVRZKTsKKyAgaWYgKGN2YWwgJiYgcmVzPk1BWF9BQklMSVRZKSAvLyBiZXNvbmRlcnMgZ3V0IGdlbHVuZ2VuPworICAgIGNhc3Rlci0+TGVhcm5Ta2lsbChTS19DQVNUSU5HLDErKHJlcy1NQVhfQUJJTElUWSkvMjAwMCk7CisgIHJldHVybiByZXM7Cit9CisKK2ludAorQ2FuVHJ5U3BlbGwob2JqZWN0IGNhc3RlciwgbWFwcGluZyBzaW5mbykgeworICBtYXBwaW5nIHJtYXA7CisgIHN0cmluZyByZXM7CisKKyAgaWYgKGNhc3Rlci0+UXVlcnlQcm9wKFBfR0hPU1QpKSB7CisgICAgd3JpdGUoIkFscyBHZWlzdCBrYW5uc3QgRHUgbmljaHQgemF1YmVybi5cbiIpOworICAgIHJldHVybiAwOworICB9CisgIGlmICgocm1hcD1zaW5mb1tTSV9TS0lMTFJFU1RSX1VTRV0pCisgICAgICAmJiAocmVzPWNoZWNrX3Jlc3RyaWN0aW9ucyhjYXN0ZXIscm1hcCkpKSB7CisgICAgd3JpdGUocmVzKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gMTsKK30KKwordm9pZAorTGVhcm4ob2JqZWN0IGNhc3Rlciwgc3RyaW5nIHNwZWxsLCBtYXBwaW5nIHNpbmZvKSB7CisgIGludCB2YWwsZGlmZixhdHR2YWw7CisgIG1hcHBpbmcgYXR0cjsKKyAKKyAgLy8gZ2FyIG5pY2h0IGxlcm5lbj8KKyAgaWYgKHNpbmZvW1NJX05PX0xFQVJOXSkKKyAgICByZXR1cm47CisKKyAvLyBBdHRyaWJ1dCBzb2xsdGUgaW50IHNlaW4sIHdlbm4gbmljaHQgYW5kZXJzIGFuZ2VnZWJlbgorIGlmIChtYXBwaW5ncChzaW5mb1tTSV9MRUFSTl9BVFRSSUJVVEVdKSkKKyB7CisJYXR0cj1zaW5mb1tTSV9MRUFSTl9BVFRSSUJVVEVdOworCS8vIERpcmVrdCBpbiBlaW5lbSBkdXJjaCBiZXJlY2huZW4uCisJLy8gSWNoIGdlaGUgZGF2b24gYXVzLCBkYXNzIHdpciBuaWUgbmllIG5pZQorCS8vIGVpbiB3ZWl0ZXJlcyBBdHRyaWJ1dCBpbnMgTUcgZWluZnVlZ2VuLgorCS8vIFdpciBiZXJlY2huZW4gZGVuIE1pdHRlbHdlcnQKKwlhdHR2YWw9KChpbnQpY2FzdGVyLT5RdWVyeUF0dHJpYnV0ZShBX0lOVCkqYXR0cltBX0lOVF0rCisJCShpbnQpY2FzdGVyLT5RdWVyeUF0dHJpYnV0ZShBX0RFWCkqYXR0cltBX0RFWF0rCisJCShpbnQpY2FzdGVyLT5RdWVyeUF0dHJpYnV0ZShBX1NUUikqYXR0cltBX1NUUl0rCisJCShpbnQpY2FzdGVyLT5RdWVyeUF0dHJpYnV0ZShBX0NPTikqYXR0cltBX0NPTl0pCisJCS8oYXR0cltBX0NPTl0rYXR0cltBX0lOVF0rYXR0cltBX1NUUl0rYXR0cltBX0RFWF0pOworCQkKKwkgCisgfSBlbHNlIHsKKwkgYXR0dmFsPShpbnQpY2FzdGVyLT5RdWVyeUF0dHJpYnV0ZShBX0lOVCk7CisgfQorCisgIAorICB2YWw9KChhdHR2YWwvMikqR2V0RlZhbHVlKFNJX1NLSUxMTEVBUk4sc2luZm8sY2FzdGVyKSsKKyAgICAgICBHZXRPZmZzZXQoU0lfU0tJTExMRUFSTixzaW5mbyxjYXN0ZXIpKTsKKyAgaWYgKCEoZGlmZj1HZXRGVmFsdWVPKFNJX0RJRkZJQ1VMVFksc2luZm8sY2FzdGVyKSkpCisgICAgZGlmZj1HZXRGVmFsdWVPKFNJX1NQRUxMQ09TVCxzaW5mbyxjYXN0ZXIpOworICBjYXN0ZXItPkxlYXJuU2tpbGwoc3BlbGwsdmFsLGRpZmYpOworfQorCit2b2lkCitFcmZvbGcob2JqZWN0IGNhc3Rlciwgc3RyaW5nIHNwZWxsLCBtYXBwaW5nIHNpbmZvKSB7CisgIG9iamVjdCBlbnY7CisgIGlmKGVudj1lbnZpcm9ubWVudChjYXN0ZXIpKQorICAgICBlbnYtPlNwZWxsSW5mb3JtKGNhc3RlcixzcGVsbCxzaW5mbyk7Cit9CisKK3ZvaWQKK01pc3NlcmZvbGcob2JqZWN0IGNhc3Rlciwgc3RyaW5nIHNwZWxsLCBtYXBwaW5nIHNpbmZvKSB7CisgIHdyaXRlKCJEZXIgWmF1YmVyc3BydWNoIGlzdCBtaXNzZ2x1ZWNrdC5cbiIpOworICB3cml0ZSgiRHUgbGVybnN0IGF1cyBEZWluZW0gRmVobGVyLlxuIik7CisgIExlYXJuKGNhc3RlcixzcGVsbCxzaW5mbyk7Cit9CisKK3N0cmluZworU2VsZWN0U3BlbGwoc3RyaW5nIHNwZWxsLCBtYXBwaW5nIHNpbmZvKSB7CisgIGlmIChzaW5mbyAmJiBzaW5mb1tTSV9TS0lMTEZVTkNdKQorICAgIHJldHVybiBzaW5mb1tTSV9TS0lMTEZVTkNdOworICByZXR1cm4gc3BlbGw7Cit9CisKK3ZhcmFyZ3Mgdm9pZAorcHJlcGFyZV9zcGVsbChvYmplY3QgY2FzdGVyLCBzdHJpbmcgc3BlbGwsIG1hcHBpbmcgc2luZm8pIHsKKyAgc3RyaW5nIHR4dDsKKworICBpZiAoIWNhc3RlciB8fCAhc3BlbGwpIHJldHVybiA7CisgIGlmICghbWFwcGluZ3Aoc2luZm8pIHx8ICFzdHJpbmdwKHR4dD1zaW5mb1tTSV9QUkVQQVJFX01TR10pKQorICAgIHR4dD0iRHUgYmVyZWl0ZXN0IERpY2ggYXVmIGRlbiBTcHJ1Y2ggYGAlcycnIHZvci5cbiI7CisgIHRlbGxfb2JqZWN0KGNhc3RlcixzcHJpbnRmKHR4dCxzcGVsbCkpOworfQorCit2YXJhcmdzIGludAorVXNlU3BlbGwob2JqZWN0IGNhc3Rlciwgc3RyaW5nIHNwZWxsLCBtYXBwaW5nIHNpbmZvKSB7CisgIG1hcHBpbmcgc2tpLHRtcDsKKyAgc3RyaW5nIHNwZWxsYm9vayxzbmFtZSxmbmFtZSx0eHQ7CisgIGludCByZXMsZmF0LGNvc3Q7CisgIG1peGVkIHBzOworCisgIGlmICghY2FzdGVyIHx8ICFzcGVsbCkKKyAgICByZXR1cm4gMDsKKyAgLy8gU3BlbGwga2FubiBpbiBkZXIgR2lsZGUgYW5kZXJlbiBOYW1lbiBoYWJlbgorICBzbmFtZT1TZWxlY3RTcGVsbChzcGVsbCxzaW5mbyk7CisgIGlmICghKHNraT1RdWVyeVNwZWxsKHNuYW1lKSkpIC8vIEV4aXN0aWVydCBkaWVzZXIgU3BlbGw/CisgICAgcmV0dXJuIDA7CisgIC8vIEdpbGRlbmVpZ2Vuc2NoYWZ0ZW4gc29sbGVuIFNwZWxsZWlnZW5zY2hhZnRlbiB1ZWJlcnNjaHJlaWJlbiBrb2VubmVuCisgIHNraT1BZGRTa2lsbE1hcHBpbmdzKHNraSxzaW5mbyk7CisgIC8vIEZ1ZXIgdmVyc2NoaWVkZW5lIFJhc3NlbiB1bnRlcnNjaGllZGxpY2hlIEVpZ2Vuc2NoYWZ0ZW4KKyAgc2tpPXJhY2VfbW9kaWZpZXIoY2FzdGVyLHNraSk7CisKKyAgLy8gcHJpbnRmKCJTcGVsbGluZm86ICVPXG4iLHNraSk7CisKKyAgaWYgKCFDYW5UcnlTcGVsbChjYXN0ZXIsIHNraSkpCisgICAgcmV0dXJuIDE7CisKKyAgaWYgKGNhc3Rlci0+UXVlcnlQcm9wKFBfU1ApIDwgKGNvc3Q9R2V0RlZhbHVlTyhTSV9TUEVMTENPU1Qsc2tpLGNhc3RlcikpKSB7CisgICAgaWYodHh0PXNraVtTSV9TUF9MT1dfTVNHXSl3cml0ZSh0eHQpOworICAgIGVsc2Ugd3JpdGUoIkR1IGhhc3QgenUgd2VuaWcgWmF1YmVycHVua3RlIGZ1ZXIgZGllc2VuIFNwcnVjaC5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIC8vIHByaW50ZigiY29zdDogJWRcbiIsY29zdCk7CisKKyAgaWYgKG1hcHBpbmdwKHNraVtTSV9YX1NQRUxMRkFUSUdVRV0pKSB7CisgICAgLy8gZnVlciBqZWRlbiBLZXkgZGllIFNwZWxsZmF0aWd1ZSBwcnVlZmVuLCB3ZW5uIGRhcyBNYXBwaW5nIGhpbnRlcmhlcgorICAgIC8vIG5pY2h0IGxlZXIgaXN0LCBpc3QgbWFuIHp1IGVyc2Nob2VwZnQuCisgICAgdG1wID0gZmlsdGVyKHNraVtTSV9YX1NQRUxMRkFUSUdVRV0sCisgICAgICAgIGZ1bmN0aW9uIGludCAoc3RyaW5nIGtleSwgaW50IHZhbCkKKyAgICAgICAgeyByZXR1cm4gKGludCljYXN0ZXItPkNoZWNrU3BlbGxGYXRpZ3VlKGtleSk7IH0gKTsKKyAgICBpZiAoc2l6ZW9mKHRtcCkpIHsKKyAgICAgICAgd3JpdGUoc2tpW1NJX1RJTUVfTVNHXSB8fAorICAgICAgICAgICAgIkR1IGJpc3Qgbm9jaCB6dSBlcnNjaG9lcGZ0IHZvbiBEZWluZW0gbGV0enRlbiBTcHJ1Y2guXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICBpZiAoY2FzdGVyLT5DaGVja1NwZWxsRmF0aWd1ZSgpKSB7CisgICAgICAgIHdyaXRlKHNraVtTSV9USU1FX01TR10gfHwKKyAgICAgICAgICAgICJEdSBiaXN0IG5vY2ggenUgZXJzY2hvZXBmdCB2b24gRGVpbmVtIGxldHp0ZW4gU3BydWNoLlxuIik7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKworICBpZiAoIShza2lbU0lfTk9fQVRUQUNLX0JVU1ldJk5PX0FUVEFDS19CVVNZX1FVRVJZKSAmJgorICAgICAgY2FzdGVyLT5RdWVyeVByb3AoUF9BVFRBQ0tfQlVTWSkpIHsKKyAgICBpZiAodHh0PXNraVtTSV9BVFRBQ0tfQlVTWV9NU0ddKSB3cml0ZSh0eHQpOworICAgIGVsc2Ugd3JpdGUoIkR1IGJpc3Qgc2Nob24genUgc2VociBiZXNjaGFlZnRpZ3QuXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIC8vIFNwcnVjaHZvcmJlcmVpdHVuZworICBpZiAocG9pbnRlcnAocHM9KG1peGVkKWNhc3Rlci0+UXVlcnlQcm9wKFBfUFJFUEFSRURfU1BFTEwpKSAvLyBBdXNzdGVoZW5kZXIgU3BydWNoCisgICAgICAmJiBzaXplb2YocHMpPj0zICYmIGludHAocHNbMF0gJiYgc3RyaW5ncChwc1sxXSkpKSB7CisgICAgaWYgKHBzWzFdPT1zcGVsbCkgeyAvLyBEaWVzZXIgU3BydWNoIHdpcmQgbm9jaCB2b3JiZXJlaXRldAorICAgICAgaWYgKHRpbWUoKTxwc1swXSkgeworICAgICAgICBpZiAoIXN0cmluZ3AodHh0PXNraVtTSV9QUkVQQVJFX0JVU1lfTVNHXSkpCisgICAgICAgICAgdHh0PSJEdSBiaXN0IG5vY2ggbWl0IGRlciBTcHJ1Y2h2b3JiZXJlaXR1bmcgYmVzY2hhZWZ0aWd0LlxuIjsKKyAgICAgICAgd3JpdGUodHh0KTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeyAvLyBBbmRlcmUgU3BydWVjaGUgYnJlY2hlbiBkaWUgVm9yYmVyZWl0dW5nIGFiCisgICAgICBpZiAoIW1hcHBpbmdwKHRtcD1RdWVyeVNwZWxsKHBzWzFdKSkgfHwgLy8gcmljaHRpZ2UgTWVsZHVuZyBob2xlbi4uLgorICAgICAgICAgICFzdHJpbmdwKHR4dD10bXBbU0lfUFJFUEFSRV9BQk9SVF9NU0ddKSkKKyAgICAgICAgdHh0PSJEdSBicmljaHN0IGRpZSBTcHJ1Y2h2b3JiZXJlaXR1bmcgZnVlciBgJXMnIGFiLlxuIjsKKyAgICAgIHByaW50Zih0eHQscHNbMV0pOworICAgICAgaWYgKGZhdD1HZXRWYWx1ZShTSV9QUkVQQVJFX1RJTUUsc2tpLGNhc3RlcikpIHsKKyAgICAgICAgLy8gU3BydWNoIGJyYXVjaHQgdm9yYmVyZWl0dW5nc3plaXQKKyAgICAgICAgY2FzdGVyLT5TZXRQcm9wKFBfUFJFUEFSRURfU1BFTEwsKHt0aW1lKCkrZmF0LHNwZWxsLHNraVtTSV9TS0lMTEFSR119KSk7CisgICAgICAgIHByZXBhcmVfc3BlbGwoY2FzdGVyLHNwZWxsLHNraSk7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICBpZiAoZmF0PUdldFZhbHVlKFNJX1BSRVBBUkVfVElNRSxza2ksY2FzdGVyKSkgeworICAgICAgLy8gU3BydWNoIGJyYXVjaHQgdm9yYmVyZWl0dW5nc3plaXQKKyAgICAgIGNhc3Rlci0+U2V0UHJvcChQX1BSRVBBUkVEX1NQRUxMLCh7dGltZSgpK2ZhdCxzcGVsbCxza2lbU0lfU0tJTExBUkddfSkpOworICAgICAgcHJlcGFyZV9zcGVsbChjYXN0ZXIsc3BlbGwsc2tpKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorICBpZiAocHMpCisgICAgY2FzdGVyLT5TZXRQcm9wKFBfUFJFUEFSRURfU1BFTEwsMCk7CisgIAorICAvLyBGdW5rdGlvbiBrYW5uIGFuZGVyZW4gTmFtZW4gaGFiZW4gYWxzIFNwZWxsCisgIGlmICghKGZuYW1lPXNpbmZvW1NJX1NLSUxMRlVOQ10pKQorICAgIGZuYW1lPXNuYW1lOworCisgIGlmKChza2lbU0lfTk9NQUdJQ10gPCBlbnZpcm9ubWVudChjYXN0ZXIpLT5RdWVyeVByb3AoUF9OT01BR0lDKSkgJiYKKyAgICAgIHJhbmRvbSgxMDApIDwgZW52aXJvbm1lbnQoY2FzdGVyKS0+UXVlcnlQcm9wKFBfTk9NQUdJQykpIHsKKyAgICBpZiAodHh0PXNraVtTSV9OT01BR0lDX01TR10pCisgICAgICB3cml0ZSh0eHQpOworICAgIGVsc2UKKyAgICAgIHdyaXRlKCJEZWluIFphdWJlcnNwcnVjaCB2ZXJwdWZmdCBpbSBOaWNodHMuXG4iKTsKKyAgICByZXM9QUJHRVdFSFJUOworICB9CisgIGVsc2UgeworICAgIC8vIFNwcnVjaCBhdXNmdWVocmVuLgorICAgIHJlcz0oaW50KWNhbGxfb3RoZXIodGhpc19vYmplY3QoKSxmbmFtZSxjYXN0ZXIsc2tpKTsKKyAgfQorICAvLyBUT0RPOiBXZW5uIGRpZSBhdXNnZWZ1ZWhydGUgU3BlbGxmdW5rdGlvbiBlaW5lIDAgenVydWVja2dpYnQsIHNvbGxlbiBqZXR6dAorICAvLyBub2NoIG5vdGlmeV9mYWlscyB6dW0gWnVnZSBrb21tZW4ga29lbm5lbi4gRGFoZXIgaW4gZGllc2VtIEZhbGwgYXVjaCAwCisgIC8vIHp1cnVlY2tnZWJlbi4KKyAgaWYgKCFyZXMgfHwgIWNhc3RlcikKKyAgICByZXR1cm4gMTsKKworICBpZiAoIShza2lbU0lfTk9fQVRUQUNLX0JVU1ldJk5PX0FUVEFDS19CVVNZX1FVRVJZKSkKKyAgCXsKKwlpZiAoIXNraVtTSV9BVFRBQ0tfQlVTWV9BTU9VTlRdKSAgCisgICAgCQljYXN0ZXItPlNldFByb3AoUF9BVFRBQ0tfQlVTWSwxKTsKKwllbHNlCisJCWNhc3Rlci0+U2V0UHJvcChQX0FUVEFDS19CVVNZLHNraVtTSV9BVFRBQ0tfQlVTWV9BTU9VTlRdKTsKKyAgCX0KKworICBjYXN0ZXItPnJlc3RvcmVfc3BlbGxfcG9pbnRzKC0xKmNvc3QpOworCisgIGlmIChtYXBwaW5ncChza2lbU0lfWF9TUEVMTEZBVElHVUVdKSkgeworICAgIC8vIGZ1ZXIgamVkZW4gS2V5IGRpZSBTcGVsbGZhdGlndWUgc2V0emVuLiBLZXlzIG1pdCBEYXVlciAwIGxvZXNlbiBrZWluZQorICAgIC8vIFNwZWxsZmF0aWd1ZSBhdXMuCisgICAgZmlsdGVyKHNraVtTSV9YX1NQRUxMRkFUSUdVRV0sCisgICAgICAgIGZ1bmN0aW9uIGludCAoc3RyaW5nIGtleSwgaW50IHZhbCkKKyAgICAgICAgeyByZXR1cm4gKGludCljYXN0ZXItPlNldFNwZWxsRmF0aWd1ZSh2YWwsIGtleSk7IH0gKTsKKyAgfQorICBlbHNlIHsKKyAgICBpZiAoKGZhdD1HZXRGVmFsdWVPKFNJX1NQRUxMRkFUSUdVRSxza2ksY2FzdGVyKSk8MCkKKyAgICAgIGZhdD0xOworICAgIGNhc3Rlci0+U2V0U3BlbGxGYXRpZ3VlKGZhdCk7CisgIH0KKworCisgIGlmIChyZXM9PUVSRk9MRykKKyAgICBFcmZvbGcoY2FzdGVyLHNwZWxsLHNraSk7CisgIGVsc2UKKyAgaWYgKHJlcz09TUlTU0VSRk9MRykKKyAgICBNaXNzZXJmb2xnKGNhc3RlcixzcGVsbCxza2kpOworICByZXR1cm4gMTsKK30KKworb2JqZWN0ICoKK0ZpbmRHcm91cChvYmplY3QgcGwsIGludCB3aG8pIHsKKyAgb2JqZWN0ICpyZXMsb2IsZW52LHRlYW07CisgIGludCBwMSxwMjsKKyAgY2xvc3VyZSBxcDsKKworICByZXM9KHt9KTsKKyAgaWYgKCFwbCB8fCAhKGVudj1lbnZpcm9ubWVudChwbCkpKSByZXR1cm4gcmVzOworICBwMSA9IHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUocGwpID8gMSA6IC0xOworICB0ZWFtPShvYmplY3QpcGwtPlF1ZXJ5UHJvcChQX1RFQU0pOworICBmb3IgKG9iPWZpcnN0X2ludmVudG9yeShlbnYpO29iO29iPW5leHRfaW52ZW50b3J5KG9iKSkgeworICAgIGlmICghbGl2aW5nKG9iKSkgY29udGludWU7CisgICAgcXA9c3ltYm9sX2Z1bmN0aW9uKCJRdWVyeVByb3AiLG9iKTsKKyAgICBpZiAocGwtPklzRW5lbXkob2IpKSAvLyBGZWluZGUgc2luZCBpbW1lciBHZWduZXIKKyAgICAgIHAyPS0xKnAxOworICAgIGVsc2UgaWYgKG9iamVjdHAodGVhbSkgJiYgZnVuY2FsbChxcCxQX1RFQU0pPT10ZWFtKQorICAgICAgcDI9cDE7IC8vIFRlYW1taXRnbGllZGVyIHNpbmQgaW1tZXIgYXVmIFNlaXRlIGRlcyBTcGllbGVycworICAgIGVsc2UKKyAgICAgIHAyID0gKHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2IpfHxmdW5jYWxsKHFwLFBfRlJJRU5EKSkgPyAxIDogLTE7CisgICAgaWYgKHAyPjAgJiYgIWludGVyYWN0aXZlKG9iKSAmJiBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iKSkKKyAgICAgIGNvbnRpbnVlOyAvLyBrZWluZSBOZXR6dG90ZW4uCisgICAgaWYgKGZ1bmNhbGwocXAsUF9HSE9TVCkpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoIHdobzwwICYmIChmdW5jYWxsKHFwLFBfTk9fQVRUQUNLKSB8fCBmdW5jYWxsKHFwLFBfTk9fR0xPQkFMX0FUVEFDSykpICkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChJU19MRUFSTklORyhvYikgJiYKKyAgICAgICAgKGZ1bmNhbGwocXAsUF9JTlZJUykgfHwgKHdobzwwICYmICFwbC0+SXNFbmVteShvYikpKSkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChwMSpwMip3aG8gPj0wKQorICAgICAgcmVzKz0oe29ifSk7CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKworb2JqZWN0ICoKK0ZpbmRHcm91cE4ob2JqZWN0IHBsLCBpbnQgd2hvLCBpbnQgbikgeworICBpZiAoIXBsKSByZXR1cm4gKHt9KTsKKyAgbj0obiooaW50KXBsLT5RdWVyeVNraWxsQXR0cmlidXRlKFNBX0VYVEVOU0lPTikpLzEwMDsKKyAgaWYgKG48MSkgbj0xOworICByZXR1cm4gRmluZEdyb3VwKHBsLHdobylbMC4uKG4tMSldOworfQorCitvYmplY3QgKgorRmluZEdyb3VwUChvYmplY3QgcGwsIGludCB3aG8sIGludCBwcikgeworICBvYmplY3QgKnJlcywqbnJlczsKKyAgaW50IGk7CisKKyAgbnJlcz0oe30pOworICBpZiAoIXBsKSByZXR1cm4gbnJlczsKKyAgcHI9KHByKihpbnQpcGwtPlF1ZXJ5U2tpbGxBdHRyaWJ1dGUoU0FfRVhURU5TSU9OKSkvMTAwOworICBpZiAocHI8MCkgcmV0dXJuIG5yZXM7CisgIHJlcz1GaW5kR3JvdXAocGwsd2hvKTsKKyAgZm9yIChpPXNpemVvZihyZXMpLTE7aT49MDtpLS0pCisgICAgaWYgKHByPj1yYW5kb20oMTAwKSkKKyAgICAgIG5yZXMrPSh7cmVzW2ldfSk7CisgIHJldHVybiBucmVzOworfQorCisvLyBGaW5kZXQgZmVpbmRsaWNoZSB1bmQgZnJldW5kbGljaGUgR1JVUFBFTiBpbSBhbmdlZ2ViZW5lbiBCZXJlaWNoLgordmFyYXJncyBtaXhlZAorRmluZERpc3RhbnRHcm91cHMob2JqZWN0IHBsLCBpbnQgZGlzdCwgaW50IGR5LCBpbnQgZHgpIHsKKyAgbWFwcGluZyBwb3M7CisgIG9iamVjdCBvYixlbnRlYW0sbXl0ZWFtOworICBpbnQgcDEsbWluLG1heCxpOworICBtaXhlZCAqYl9yb3dzLHg7CisgIGNsb3N1cmUgaXNfZW5lbXksIHFwOworCisgIGlmICghb2JqZWN0cChwbCkgfHwgIWVudmlyb25tZW50KHBsKSkKKyAgICByZXR1cm4gKHsoe30pLCh7fSl9KTsKKyAgaWYgKCFkeSkgZHk9MTAwOworICBpZiAoIWR4KSBkeD1NQVhfVEVBTV9ST1dMRU4qMTAwOworICB4PShpbnQpcGwtPlF1ZXJ5U2tpbGxBdHRyaWJ1dGUoU0FfRVhURU5TSU9OKTsKKyAgZHg9KGR4KngpLzEwMDtkeT0oZHkqeCkvMTAwOworICBkaXN0PShkaXN0KihpbnQpcGwtPlF1ZXJ5U2tpbGxBdHRyaWJ1dGUoU0FfUkFOR0UpKS8xMDA7CisgIG1pbj1kaXN0LWR5LzI7CisgIG1heD1kaXN0K2R5LzI7CisKKyAgcG9zPShbXSk7CisgIHAxPXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUocGwpID8gMSA6IC0xOworICBpc19lbmVteT1zeW1ib2xfZnVuY3Rpb24oIklzRW5lbXkiLHBsKTsgLy8genVyIEJlc2NobGV1bmlndW5nCisgIG15dGVhbT0ob2JqZWN0KXBsLT5RdWVyeVByb3AoUF9URUFNKTsKKyAgZm9yIChvYj1maXJzdF9pbnZlbnRvcnkoZW52aXJvbm1lbnQocGwpKTtvYjtvYj1uZXh0X2ludmVudG9yeShvYikpIHsKKyAgICBpZiAoIWxpdmluZyhvYikpIGNvbnRpbnVlOworICAgIHFwPXN5bWJvbF9mdW5jdGlvbigiUXVlcnlQcm9wIixvYik7IC8vIHp1ciBCZXNjaGxldW5pZ3VuZworCisgICAgLy8gWnVlcnN0IG1hbCBkaWUgUG9zaXRpb24gZmVzdHN0ZWxsZW46CisgICAgaWYgKCFvYmplY3RwKGVudGVhbT1mdW5jYWxsKHFwLFBfVEVBTSkpKQorICAgICAgcG9zW29iXT0xOworICAgIGVsc2UgaWYgKCFwb3Nbb2JdICYmIG1hcHBpbmdwKHg9KG1hcHBpbmcpb2ItPlByZXNlbnRUZWFtUG9zaXRpb25zKCkpKQorICAgICAgcG9zKz14OworICAgIC8vIFByZXNlbnRUZWFtUG9zaXRpb25zIHdpcmQgbnVyIGVpbm1hbCBwcm8gVGVhbSBhdXNnZXJlY2huZXQsIHdlaWwKKyAgICAvLyBhbnNjaGxpZXNzZW5kIGplZGVzIGFud2VzZW5kZSBUZWFtbWl0Z2xpZWQgcG9zW29iXSE9MCBoYXQuCisKKyAgICBwb3Nbb2JdPSgyKnBvc1tvYl0pLTE7CisgICAgLy8gUmVpaGVuIHNvbGxlbiBBYnN0YW5kIDIgaGFiZW4sIGF1Y2ggUmVpaGVuIDEgdW5kIC0xIChuYWNoIFVtcmVjaG51bmcpCisKKyAgICAvLyBGZWluZGxpY2hlIFJlaWhlbiBhbiBZLUFjaHNlIHNwaWVnZWxuLCBhbHNvIGdlZ2VudWViZXIgaGluc3RlbGxlbjoKKyAgICBpZiAoZnVuY2FsbChpc19lbmVteSxvYikpCisgICAgICBwb3Nbb2JdKj0tMTsgLy8gSXN0IGF1ZiBqZWRlbiBGYWxsIEZlaW5kCisgICAgZWxzZSBpZiAob2JqZWN0cChteXRlYW0pICYmIG15dGVhbT09ZW50ZWFtKQorICAgICAgICA7ICAgICAgICAgICAgLy8gVGVhbW1pdGdsaWVkZXIgc2luZCBpbW1lciBhdWYgZWlnZW5lciBTZWl0ZQorICAgIGVsc2UKKyAgICAgIHBvc1tvYl0qPShwMSooKGludCkocXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYil8fAorICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jYWxsKHFwLFBfRlJJRU5EKSk/MTotMSkpOworCisgICAgLy8gRGVuIFNwaWVsZXIgYXVmIGtlaW5lbiBGYWxsIGVudGZlcm5lbgorICAgIGlmIChvYj09cGwpCisgICAgICBjb250aW51ZTsKKyAgICAvLyBOZXR6dG90ZSwgR2Vpc3RlciAgdW5kIHVuc2ljaHRiYXJlIE1hZ2llciBuaWNodCBiZXJ1ZWNrc2ljaHRpZ2VuLAorICAgIC8vIG5pY2h0IChnbG9iYWwpIGFuZ3JlaWZiYXJlIE1vbnN0ZXIgdW5kIG5pY2h0LWZlaW5kbGljaGUgTWFnaWVyCisgICAgLy8gdm9uIGZlaW5kbGljaGVyIFNlaXRlIGVudGZlcm5lbi4KKyAgICBpZiAoKCFpbnRlcmFjdGl2ZShvYikgJiYgcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYikpIC8vIE5ldHp0b3RlIHJhdXMKKyAgICAgICAgfHwgZnVuY2FsbChxcCxQX0dIT1NUKQorICAgICAgICB8fCAoSVNfTEVBUk5JTkcob2IpICYmIGZ1bmNhbGwocXAsUF9JTlZJUykpICAgLy8gQmluIG5pY2h0IGRhIDotKQorICAgICAgICB8fCAocG9zW29iXTwwICYmIChmdW5jYWxsKHFwLFBfTk9fR0xPQkFMX0FUVEFDSykgLy8gTmljaHQgYW5ncmVpZmVuCisgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGZ1bmNhbGwocXAsUF9OT19BVFRBQ0spCisgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChJU19MRUFSTklORyhvYikgJiYgIWZ1bmNhbGwoaXNfZW5lbXksb2IpKSkpKQorICAgICAgbV9kZWxldGUocG9zLG9iKTsKKyAgfQorCisgIC8vIFJlaWhlbiBhdWZzdGVsbGVuCisgIC8vIEthbXBmcmVpaGU6IHwgICA1ICAgICA0ICAgICAzICAgICAyICAgICAxIHx8ICAxICAgICAyICAgICAzICAgICA0ICAgICA1fAorICAvLyBBcnJheXM6ICAgICB8MCAgMSAgMiAgMyAgNCAgNSAgNiAgNyAgOCAgOSAxMCAxMSAxMiAxMyAxNCAxNSAxNiAxNyAxOCAxOXwKKyAgLy8gICAgICAgICAgICAgfDwtLS0tLS0tLS0tLSBGcmV1bmRlIC0tLS0tLS0+fHw8LS0tLS0tLS0tIEZlaW5kZSAtLS0tLS0tLT58CisgIGJfcm93cz1FTVBUWV9URUFNQVJSQVkrRU1QVFlfVEVBTUFSUkFZK0VNUFRZX1RFQU1BUlJBWStFTVBUWV9URUFNQVJSQVk7CisgIHg9bV9pbmRpY2VzKHBvcyk7CisgIGZvciAoaT1zaXplb2YoeCktMTtpPj0wO2ktLSkgeworICAgIHAxPTIqTUFYX1RFQU1ST1dTLXBvc1tvYj14W2ldXTsKKyAgICBwb3Nbb2JdPXAxOworICAgIGlmIChwMT49MCAmJiBwMTw0Kk1BWF9URUFNUk9XUykgeworICAgICAgaWYgKHJhbmRvbSgxMDApPDUwKSAgICAgICAgICAgICAvLyBEYW1pdCBndXQgZ2VtaXNjaHQgd2lyZC4uLgorICAgICAgICBiX3Jvd3NbcDFdPWJfcm93c1twMV0rKHtvYn0pOyAvLyB6dWZhZWxsaWcgaGludGVuIGFuZnVlZ2VuCisgICAgICBlbHNlCisgICAgICAgIGJfcm93c1twMV09KHtvYn0pK2Jfcm93c1twMV07IC8vIG9kZXIgdm9ybmUgYW5mdWVnZW4uCisgICAgfQorICB9CisKKyAgLy8gVW1yZWNobnVuZyB2b24gTWluLCBNYXggYXVmIFJlaWhlbgorICAvLyAuLi4gLTI6IC0xMjQuLi03NSwgLTE6LTc0Li4tMjUsIDA6LTI0Li4yNCwgMToyNS4uNzQgMjo3NS4uMTI0IC4uLgorICAvLyBEYXMgbXVzcyBtYW4gbWFjaGVuLCB3ZW5uIG1hbiBrZWluZSB2ZXJudWVuZnRpZ2UgUnVuZHVuZ3NmdW5rdGlvbiBoYXQ6CisgIGlmIChtaW48MCkgbWluPS0xKigoMjUtbWluKS81MCk7IGVsc2UgbWluPSgyNSttaW4pLzUwOworICBpZiAobWF4PDApIG1heD0tMSooKDI1LW1heCkvNTApOyBlbHNlIG1heD0oMjUrbWF4KS81MDsKKyAgLy8gUmVsYXRpdiB6dXIgUG9zaXRpb24gZGVzIFNwaWVsZXJzIHZlcnNjaGllYmVuOgorICBwMT1wb3NbcGxdO21pbis9cDE7bWF4Kz1wMTsKKyAgLy8gVW1yZWNobnVuZyB2b24gQnJlaXRlIGF1ZiBBbnphaGw6CisgIGR4PSgoZHgrNTApLzEwMCktMTtpZiAoZHg8MCkgZHg9MDsKKworICB4PSh7KHt9KSwoe30pfSk7CisgIGZvciAoaT0wO2k8MipNQVhfVEVBTVJPV1M7aSsrKQorICAgIGlmIChpPj1taW4gJiYgaTw9bWF4KQorICAgICAgeFsxXSs9Yl9yb3dzW2ldWzAuLmR4XTsgLy8gRnJldW5kZQorICBmb3IgKGk9MipNQVhfVEVBTVJPV1MrMTtpPDQqTUFYX1RFQU1ST1dTO2krKykKKyAgICBpZiAoaT49bWluICYmIGk8PW1heCkKKyAgICAgIHhbMF0rPWJfcm93c1tpXVswLi5keF07IC8vIEZlaW5kZQorCisgIHJldHVybiB4OworfQorCisvLyBGaW5kZXQgZmVpbmRsaWNoZSBvZGVyIGZyZXVuZGxpY2hlIEdydXBwZSAob2RlciBTdW1tZSBiZWlkZXIpIGltCisvLyBhbmdlZ2ViZW5lbiBCZXJlaWNoLgordmFyYXJncyBvYmplY3QgKgorRmluZERpc3RhbnRHcm91cChvYmplY3QgcGwsIGludCB3aG8sIGludCBkaXN0LCBpbnQgZHksIGludCBkeCkgeworICBtaXhlZCAqeDsKKworICB4PUZpbmREaXN0YW50R3JvdXBzKHBsLGRpc3QsZHksZHgpOworICBpZiAod2hvPDApCisgICAgcmV0dXJuIHhbMF07CisgIGVsc2UgaWYgKHdobz4wKQorICAgIHJldHVybiB4WzFdOworICByZXR1cm4geFswXSt4WzFdOworfQorCisKK3N0YXRpYyB2YXJhcmdzIG9iamVjdAorZmluZF92aWN0aW0oc3RyaW5nIHdlbiwgb2JqZWN0IHBsKSB7CisgIG9iamVjdCB2aWN0aW07CisKKyAgaWYgKCFwbCkgcmV0dXJuIDA7CisgIGlmICghc2l6ZW9mKHdlbikpIHsKKyAgICBpZiAodmljdGltID0gKG9iamVjdClwbC0+U2VsZWN0RW5lbXkoKSkKKyAgICAgIHJldHVybiB2aWN0aW07CisgICAgZWxzZQorICAgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKHZpY3RpbSA9IHByZXNlbnQod2VuLCBlbnZpcm9ubWVudChwbCkpKQorICAgIHJldHVybiB2aWN0aW07CisgIGVsc2UgaWYgKHZpY3RpbSA9IHByZXNlbnQod2VuLCBwbCkpCisgICAgcmV0dXJuIHZpY3RpbTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQordmFyYXJncyBvYmplY3QKK0ZpbmRWaWN0aW0oc3RyaW5nIHdlbiwgb2JqZWN0IHBsLCBzdHJpbmcgbXNnKSB7CisgIG9iamVjdCB2aWM7CisKKyAgaWYgKCEodmljPWZpbmRfdmljdGltKHdlbixwbCkpICYmIG1zZykKKyAgICB3cml0ZShtc2cpOworICByZXR1cm4gdmljOworfQordmFyYXJncyBvYmplY3QKK0ZpbmRMaXZpbmdWaWN0aW0oc3RyaW5nIHdlbiwgb2JqZWN0IHBsLCBzdHJpbmcgbXNnKSB7CisgIG9iamVjdCB2aWM7CisKKyAgaWYgKCEodmljPUZpbmRWaWN0aW0od2VuLHBsLG1zZykpKQorICAgIHJldHVybiAwOworICBpZiAoIWxpdmluZyh2aWMpIHx8IHZpYy0+UXVlcnlQcm9wKFBfR0hPU1QpKSB7CisgICAgcHJpbnRmKCIlcyBsZWJ0IGRvY2ggbmljaHQhXG4iLCBjYXBpdGFsaXplKChzdHJpbmcpdmljLT5uYW1lKCkpKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gdmljOworfQorCitwcml2YXRlIHZhcmFyZ3Mgb2JqZWN0CitEb0ZpbmRFbmVteVZpY3RpbShzdHJpbmcgd2VuLCBvYmplY3QgcGwsIHN0cmluZyBtc2csCisgICAgICAgICAgICAgICAgICBtaXhlZCBmdW5jLCBpbnQgbWluLCBpbnQgbWF4KSB7CisgIG9iamVjdCB2aWM7CisgIG1peGVkIG5vX2F0dGFjazsKKyAgaW50IHJvdzsKKworICBpZiAoISh2aWM9RmluZExpdmluZ1ZpY3RpbSh3ZW4scGwsbXNnKSkpIHsKKyAgICBpZiAoKHN0cmluZ3Aod2VuKSAmJiB3ZW4hPSIiKSB8fCAhb2JqZWN0cChwbCkpCisgICAgICByZXR1cm4gMDsKKyAgICBpZiAocG9pbnRlcnAoZnVuYykpIHsgLy8gU29sbCBlaW5lciBESUVTRVIgR2VnbmVyIGdlbm9tbWVuIHdlcmRlbj8KKyAgICAgIGlmICghKHZpYz0ob2JqZWN0KXBsLT5TZWxlY3RFbmVteShmdW5jKSkpIC8vIERhbm4gZGFyYXVzIGF1c3dhZWhsZW4KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghc3RyaW5ncChmdW5jKSkKKyAgICAgICAgZnVuYz0iU2VsZWN0RW5lbXkiOworICAgICAgaWYgKCEodmljPShvYmplY3QpY2FsbF9vdGhlcihwbCxmdW5jLDAsbWluLG1heCkpKQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZnVuYz0wOyAvLyBrZWluIHp3ZWl0ZXMgTWFsIHBydWVmZW4uCisgIH0KKyAgaWYgKG5vX2F0dGFjayA9IChtaXhlZCl2aWMtPlF1ZXJ5UHJvcChQX05PX0FUVEFDSykpIHsKKyAgICBpZiAoc3RyaW5ncChub19hdHRhY2spKQorICAgICAgd3JpdGUobm9fYXR0YWNrKTsKKyAgICBlbHNlCisgICAgICB3cml0ZSh2aWMtPk5hbWUoV0VSLDEpKyIgbGFlc3N0IHNpY2ggbmljaHQgYW5ncmVpZmVuLlxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKHZpYz09cGwpIHsKKyAgICB3cml0ZSgiRHUga29lbm50ZXN0IERpciBkYWJlaSB3ZWh0dW4uXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoc3RyaW5ncChmdW5jKSkgeworICAgIHN3aXRjaChmdW5jKSB7CisgICAgY2FzZSAiU2VsZWN0TmVhckVuZW15IjoKKyAgICAgIGlmIChwbC0+UHJlc2VudFBvc2l0aW9uKCk+MSkgeworICAgICAgICB3cml0ZSgiRHUgc3RlaHN0IG5pY2h0IGluIGRlciBlcnN0ZW4gS2FtcGZyZWloZS5cbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGlmICh2aWMtPlByZXNlbnRQb3NpdGlvbigpPjEpIHsKKyAgICAgICAgd3JpdGUodmljLT5OYW1lKFdFUiwxKSsiIGlzdCBpbiBlaW5lciBoaW50ZXJlbiBLYW1wZnJlaWhlLlxuIik7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAiU2VsZWN0RmFyRW5lbXkiOgorICAgICAgaWYgKHJvdz0oaW50KXZpYy0+UHJlc2VudFBvc2l0aW9uKCkpCisgICAgICAgIHJvdy0tOworICAgICAgaWYgKHJvdz49bWluICYmIHJvdzw9bWF4KQorICAgICAgICBicmVhazsKKyAgICAgIGlmIChyb3c8bWluKQorICAgICAgICB3cml0ZSh2aWMtPk5hbWUoV0VSLDEpKyIgaXN0IHp1IG5haGUuXG4iKTsKKyAgICAgIGVsc2UgaWYgKHJvdz5tYXgpCisgICAgICAgIHdyaXRlKHZpYy0+TmFtZShXRVIsMSkrIiBpc3QgenUgd2VpdCB3ZWcuXG4iKTsKKyAgICAgIGVsc2UKKyAgICAgICAgd3JpdGUodmljLT5OYW1lKFdFUiwxKSsiIGlzdCB1bmVycmVpY2hiYXIuXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIGRlZmF1bHQ6OworICAgIH0KKyAgfSBlbHNlIGlmIChwb2ludGVycChmdW5jKSkgeworICAgIGlmIChtZW1iZXIoZnVuYyx2aWMpPDApIHsKKyAgICAgIHdyaXRlKHZpYy0+TmFtZShXRVIsMSkrIiBpc3QgdW5lcnJlaWNoYmFyLlxuIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICBpZiAoIXBsLT5Jc0VuZW15KHZpYykpIC8vIFdhciBlcyBiaXNoZXIga2VpbiBGZWluZD8KKyAgICBwbC0+S2lsbCh2aWMpOyAgICAgICAvLyBEYW5uIGlzdCBlcyBqZXR6dCBlaW5lci4KKyAgcmV0dXJuIHZpYzsKK30KKwordmFyYXJncyBvYmplY3QKK0ZpbmRFbmVteVZpY3RpbShzdHJpbmcgd2VuLCBvYmplY3QgcGwsIHN0cmluZyBtc2cpIHsKKyAgcmV0dXJuIERvRmluZEVuZW15VmljdGltKHdlbixwbCxtc2csIlNlbGVjdEVuZW15Iik7Cit9CisKKy8vIFdpZSBGaW5kRW5lbXlWaWN0aW0sIGFiZXIgbnVyIGltIE5haGthbXBmIGVycmVpY2hiYXJlIEZlaW5kZSB3ZXJkZW4KKy8vIGdlZnVuZGVuLgordmFyYXJncyBvYmplY3QKK0ZpbmROZWFyRW5lbXlWaWN0aW0oc3RyaW5nIHdlbiwgb2JqZWN0IHBsLCBzdHJpbmcgbXNnKSB7CisgIHJldHVybiBEb0ZpbmRFbmVteVZpY3RpbSh3ZW4scGwsbXNnLCJTZWxlY3ROZWFyRW5lbXkiKTsKK30KKworLy8gV2llIEZpbmRFbmVteVZpY3RpbSwgYWJlciBudXIgRmVpbmRlIGltIEJlcmVpY2ggZGVyIGFuZ2VnZWJlbmVuIFJlaWhlbgorLy8gKG1pbixtYXgpIHdlcmRlbiBnZWZ1bmRlbi4KK3ZhcmFyZ3Mgb2JqZWN0CitGaW5kRmFyRW5lbXlWaWN0aW0oc3RyaW5nIHdlbiwgb2JqZWN0IHBsLCBzdHJpbmcgbXNnLAorICAgICAgICAgICAgICAgICAgIGludCBtaW4sIGludCBtYXgpIHsKKyAgcmV0dXJuIERvRmluZEVuZW15VmljdGltKHdlbixwbCxtc2csIlNlbGVjdEZhckVuZW15IixtaW4sbWF4KTsKK30KKworLy8gV2llIEZpbmRFbmVteVZpY3RpbSwgZmluZGV0IGFiZXIgbnVyIEZlaW5kZSBpbgorLy8gRmluZERpc3RhbnRHcm91cChHRUdORVIsZW50ZmVybnVuZyxhYndlaWNodW5nKQordmFyYXJncyBvYmplY3QKK0ZpbmREaXN0YW50RW5lbXlWaWN0aW0oc3RyaW5nIHdlbiwgb2JqZWN0IHBsLCBzdHJpbmcgbXNnLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlzdCwgaW50IGR5KSB7CisgIHJldHVybiBEb0ZpbmRFbmVteVZpY3RpbSh3ZW4scGwsbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRmluZERpc3RhbnRHcm91cChwbCwtMSxkaXN0LGR5LDEwMDAwKSk7Cit9CisKK3ZhcmFyZ3MgaW50CitUcnlHbG9iYWxBdHRhY2tTcGVsbChvYmplY3QgY2FzdGVyLCBtYXBwaW5nIHNpbmZvLCBpbnQgc3VjLAorICAgICAgICAgICAgICAgICAgICAgaW50IGRhbWFnZSwgbWl4ZWQgZHQsIG1peGVkIGlzX3NwZWxsLAorICAgICAgICAgICAgICAgICAgICAgaW50IGRpc3QsIGludCBkZXB0aCwgaW50IHdpZHRoKSB7CisgIGludCBpOworICBtaXhlZCB4LGNvbGRhbTsKKyAgb2JqZWN0ICpvYnMsb2I7CisKKyAgaWYgKCFzdWMpIHN1Yz1yYW5kb20oc2luZm9bU0lfU0tJTExBQklMSVRZXSk7CisgIGlmICghZHQpIGR0PUdldERhdGEoU0lfU0tJTExEQU1BR0VfVFlQRSxzaW5mbyxjYXN0ZXIpOworICBpZiAoIWlzX3NwZWxsKSBpc19zcGVsbD1HZXREYXRhKFNJX1NQRUxMLHNpbmZvLGNhc3Rlcik7CisgIGlmICghZGlzdCkgZGlzdD1HZXRSYW5kRlZhbHVlTyhTSV9ESVNUQU5DRSxzaW5mbyxjYXN0ZXIpOworICBpZiAoIWRlcHRoKSBkZXB0aD1HZXRSYW5kRlZhbHVlTyhTSV9ERVBUSCxzaW5mbyxjYXN0ZXIpOworICBpZiAoIXdpZHRoKSB3aWR0aD1HZXRSYW5kRlZhbHVlTyhTSV9XSURUSCxzaW5mbyxjYXN0ZXIpOworCisgIGlmICghZGVwdGggJiYgd2lkdGgpIGRlcHRoPXdpZHRoOworICBpZiAoIXdpZHRoICYmIGRlcHRoKSB3aWR0aD1kZXB0aDsKKyAgaWYgKCFtYXBwaW5ncChpc19zcGVsbCkpIGlzX3NwZWxsPShbXSk7CisgIGlzX3NwZWxsW1NQX0dMT0JBTF9BVFRBQ0tdPTE7CisKKyAgeD1GaW5kRGlzdGFudEdyb3VwcyhjYXN0ZXIsZGlzdCxkZXB0aCx3aWR0aCk7CisgIHNpbmZvW1NJX05VTUJFUl9FTkVNSUVTXT1zaXplb2YoeFswXSk7CisgIHNpbmZvW1NJX05VTUJFUl9GUklFTkRTXT1zaXplb2YoeFsxXSk7CisKKyAgb2JzPXhbMF07CisgIGZvciAoaT1zaXplb2Yob2JzKS0xO2k+PTA7aS0tKQorICAgIGlmIChvYmplY3RwKG9iPW9ic1tpXSkgJiYgc3VjPj1vYi0+U3BlbGxEZWZlbmQoY2FzdGVyLHNpbmZvKSkKKyAgICAgIFRyeUF0dGFja1NwZWxsKG9iLChkYW1hZ2U/cmFuZG9tKGRhbWFnZSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgR2V0UmFuZEZWYWx1ZU8oU0lfU0tJTExEQU1BR0Usc2luZm8sY2FzdGVyKSksCisgICAgICAgICAgICAgICAgICAgICBkdCxpc19zcGVsbCxjYXN0ZXIsc2luZm8pOworCisgIGlmICghaW50cChjb2xkYW09c2luZm9bU0lfQ09MTEFURVJBTF9EQU1BR0VdKSB8fCAhY29sZGFtKQorICAgIHJldHVybiAxOworICBvYnM9eFsxXTsKKyAgZm9yIChpPXNpemVvZihvYnMpLTE7aT49MDtpLS0pCisgICAgaWYgKG9iamVjdHAob2I9b2JzW2ldKSAmJiBzdWM+PW9iLT5TcGVsbERlZmVuZChjYXN0ZXIsc2luZm8pKQorICAgICAgb2ItPnJlZHVjZV9oaXRfcG9pbnRzKCgoZGFtYWdlP3JhbmRvbShkYW1hZ2UpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0UmFuZEZWYWx1ZU8oU0lfU0tJTExEQU1BR0Usc2luZm8sY2FzdGVyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbGRhbSkvMTApOworICAvLyAxMCBzdGF0dCAxMDAgaXN0IEFic2ljaHQsIHdlaWwgcmVkdWNlX2hpdF9wb2ludHMgc2Nob24gdW0gRmFrdG9yCisgIC8vIDEwIHN0YWVya2VyIHdpcmt0IGFscyBEZWZlbmQuCisKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9zdGQvc3RvcmUuYyBiL3N0ZC9zdG9yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MTExMDUKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvc3RvcmUuYwpAQCAtMCwwICsxLDE2NiBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHN0b3JlLmMgLS0gRGFzIExhZ2VyIGVpbmVzIExhZGVucworLy8KKy8vICRJZDogc3RvcmUuYyA3MTAwIDIwMDktMDItMDEgMDk6MjQ6NDNaIFplc3N0cmEgJAorI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCisjZGVmaW5lIEFOWiAzCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGJhbmsuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisKK2luaGVyaXQgIi9zdGQvdGhpbmcvcHJvcGVydGllcyI7Citpbmhlcml0ICIvc3RkL3Jvb20vaXRlbXMiOworCitwcml2YXRlIG5vc2F2ZSBvYmplY3QgKmFsbDsKK3ByaXZhdGUgbm9zYXZlIG1hcHBpbmcgYWxsMjsKK3ByaXZhdGUgbm9zYXZlIG9iamVjdCBzaG9wOworcHJpdmF0ZSBub3NhdmUgaW50IHN1bTsKK3ByaXZhdGUgbm9zYXZlIGludCBzdG9yZV9wZXJjZW50X2xlZnQ7CisKK3N0YXRpYyBpbnQgX3NldF9zdG9yZV9wZXJjZW50X2xlZnQoKQoreworICByZXR1cm4gc3RvcmVfcGVyY2VudF9sZWZ0PVpFTlRSQUxCQU5LLT5fcXVlcnlfc3RvcmVfcGVyY2VudF9sZWZ0KCk7Cit9CisKK3B1YmxpYyB2b2lkIF9yZWdpc3Rlcl9zaG9wKG9iamVjdCBvYikKK3sKKyAgc2hvcD1vYjsKK30KKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgc2V0ZXVpZChnZXR1aWQoKSk7CisgIHByb3BlcnRpZXM6OmNyZWF0ZSgpOworICBpdGVtczo6Y3JlYXRlKCk7CisgIF9zZXRfc3RvcmVfcGVyY2VudF9sZWZ0KCk7CisgIFNldFByb3AoUF9NSU5fU1RPQ0ssIDIwKTsgLy8gaW1tZXIgZWluZSBSZXNlcnZlIGZ1ZXIgdW5zZXJlIEFuZmFlbmdlci4uLgorfQorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGVfc3VwZXIoKSB7CisgICAgICBzZXRfbmV4dF9yZXNldCgtMSk7Cit9CisKK3B1YmxpYyBpbnQgTWF5QWRkT2JqZWN0KG9iamVjdCBvYikKK3sgICByZXR1cm4gMTsgICB9CisKK3Byb3RlY3RlZCB2YXJhcmdzIHZvaWQgcmVtb3ZlX211bHRpcGxlKGludCBsaW1pdCwgbWl4ZWQgZnVuKSB7fQorCitzdGF0aWMgaW50IF9xdWVyeV9zdG9yZV9jb25zdW1lKCkKKy8vIGRhIDAgPSAyMCBpc3QsIGlzdCBrZWluIGRlZmF1bHQgaW5pdGlhbGlzaWVyZW4gaW0gY3JlYXRlIG5vZXRpZyEhIQoreworICBpbnQgY29uc3VtOworICBjb25zdW09MTAwLVF1ZXJ5KFBfU1RPUkVfQ09OU1VNRSk7CisgIGlmIChjb25zdW08MCB8fCBjb25zdW0gPj0xMDApIC8vIGNvbnN1bSA9IDEwMCwgd2VubiBQX1NUT1JFX0NPTlNVTSA9IDAKKyAgICByZXR1cm4gNzA7CisgIHJldHVybiBjb25zdW07Cit9CisKK3N0YXRpYyBpbnQgX3NldF9zdG9yZV9jb25zdW1lKGludCBjb25zdW0pICAgICAvKiAxIDw9IGNvbnN1bSA8PSAxMDAgKi8KK3sKKyAgaWYgKGNvbnN1bTwxIHx8IGNvbnN1bT4xMDApIHJldHVybiAtMTsKKyAgcmV0dXJuICgxMDAtKGludClTZXQoUF9TVE9SRV9DT05TVU1FLCBjb25zdW0pKTsKK30KKworc3RhdGljIGludCBfcXVlcnlfbWluX3N0b2NrKCkKK3sKKyAgaW50IHN0b2NrOworICBzdG9jaz1RdWVyeShQX01JTl9TVE9DSyk7CisgIGlmIChzdG9jazwwKSByZXR1cm4gMDsKKyAgcmV0dXJuIHN0b2NrOworfQorCitwcml2YXRlIHZvaWQgdXBkYXRlX21vbmV5KCkgeworICBpZiAoc3VtKSB7CisgICAgaWYgKCFzaG9wKQorICAgICAgWkVOVFJBTEJBTkstPlBheUluKHN1bSk7CisgICAgZWxzZQorICAgICAgc2hvcC0+X2FkZF9tb25leShzdW0pOworICB9CisgIHN1bT0wOworfQorCitwcm90ZWN0ZWQgdm9pZCBSZW1vdmVPYmplY3RGcm9tU3RvcmUob2JqZWN0IG9iKSB7CisgIC8vIEFsbGUgRnVua3Rpb25lbiBkaWUgYXVzc2VyaGFsYiBhdWZnZXJ1ZmVuIHdlcmRlbiwgd2VyZGVuICJnZWNhdGNodCIKKyAgY2F0Y2goc3VtKz1vYi0+UXVlcnlQcm9wKFBfVkFMVUUpKnN0b3JlX3BlcmNlbnRfbGVmdC8xMDA7IHB1Ymxpc2gpOworICBjYXRjaChvYi0+cmVtb3ZlKCk7IHB1Ymxpc2gpOworICBpZiAob2IpIGRlc3RydWN0KG9iKTsgIC8vIE9iamVrdCBhdWYgamVkZW4gRmFsbCB6ZXJzdG9lcmVuCit9CisKK3Byb3RlY3RlZCB2b2lkIGF1ZnJhZXVtZW4oKSB7CisgIGludCBpLCBzaXplOworICBvYmplY3Qgb2I7CisgIHN0cmluZyBlbGVtZW50OworCisgIGlmICghcG9pbnRlcnAoYWxsKSkgcmV0dXJuOworICBpZiAoIW1hcHBpbmdwKGFsbDIpKSBhbGwyPShbXSk7CisgIHNpemU9c2l6ZW9mKGFsbCk7CisgIGZvciAoaT0oc2l6ZTw9NTAgPyAwIDogc2l6ZS01MCk7IGk8c2l6ZTsgaSsrKSB7CisgICAgaWYgKCFvYmplY3RwKG9iPWFsbFtpXSkpIGNvbnRpbnVlOworICAgIGlmIChvYmplY3RfbmFtZShvYilbMC4uMl09PSIvZC8iIHx8IG9iamVjdF9uYW1lKG9iKVswLi44XT09Ii9wbGF5ZXJzLyIpCisgICAgICBlbGVtZW50PUJMVUVfTkFNRShvYik7CisgICAgZWxzZQorICAgICAgY2F0Y2goZWxlbWVudD1vYi0+c2hvcnQoKStCTFVFX05BTUUob2IpOyBwdWJsaXNoKTsKKyAgICBpZiAoYWxsMltlbGVtZW50XSsrPkFOWikKKyAgICAgIFJlbW92ZU9iamVjdEZyb21TdG9yZShvYik7CisgIH0KKyAgaWYgKHNpemU8PTUwKSB7CisgICAgYWxsPTA7ICAvLyBTcGVpY2hlciBmcmVpZ2ViZW4uLi4KKyAgICBhbGwyPTA7CisgICAgdXBkYXRlX21vbmV5KCk7CisgIH0gZWxzZSB7CisgICAgYWxsPWFsbFswLi5zaXplLTUxXTsKKyAgICBjYWxsX291dCgjJ2F1ZnJhZXVtZW4sMik7CisgIH0KK30KKwordm9pZCByZXNldCgpIHsKKyAgaW50IGksIHRvLCBzdG9jazsKKyAgbWl4ZWQgKml0ZW1saXN0OworICAKKyAgaXRlbXM6OnJlc2V0KCk7CisgIF9zZXRfc3RvcmVfcGVyY2VudF9sZWZ0KCk7CisKKyAgaWYgKCEoYWxsPWFsbF9pbnZlbnRvcnkoKSkgfHwgIXNpemVvZihhbGwpKSB7CisgICAgYWxsPTA7IC8vIFNwZWljaGVyIGZyZWlnZWJlbgorICAgIHJldHVybjsKKyAgfQorICBpZiAoc2l6ZW9mKGl0ZW1saXN0PVF1ZXJ5UHJvcChQX0lURU1TKSkpIHsKKyAgICBpdGVtbGlzdD1maWx0ZXIoaXRlbWxpc3QsICMnWywgMCk7CisgICAgYWxsLT1pdGVtbGlzdDsKKyAgICBpZiAoIXNpemVvZihhbGwpKSB7CisgICAgICBhbGw9MDsgLy8gU3BlaWNoZXIgZnJlaWdlYmVuCisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgaT1zaXplb2YoYWxsKS0xOworICB0bz1pKlF1ZXJ5UHJvcChQX1NUT1JFX0NPTlNVTUUpLzEwMDsKKyAgaWYgKCB0byA8IChzdG9jaz1RdWVyeVByb3AoUF9NSU5fU1RPQ0spKSApCisgICAgdG89c3RvY2s7CisgIGVsc2UKKyAgICBzdG9jaz0wOworCisgIC8vIEhpbnRlcmVyIFRlaWwgZGVzIEludmVudG9yaWVzIHdpcmQgemVyc3RvZXJ0LCBhbHNvIGFsbGUgYWVsdGVyZW4KKyAgLy8gdW5kIHNvbWl0IHZlcm11dGxpY2ggc2VsdGVuIGdla2F1ZnRlIE9iamVrdGUKKyAgZm9yICg7aT49dG87aS0tKQorICAgIFJlbW92ZU9iamVjdEZyb21TdG9yZShhbGxbaV0pOworICBhbGwyPShbXSk7CisgIGNhbGxfb3V0KCMnYXVmcmFldW1lbixyYW5kb20oMTApKTsKKyAgdXBkYXRlX21vbmV5KCk7Cit9CisKKy8vZGllc2VyIFJhdW0gd2lyZCBzaWNoIG5pZSBwZXIgY2xlYW5fdXAoKSB6ZXJzdG9lcmVuLCBkYWhlciBnZWJlbiB3aXIKKy8vMCB6dXJ1ZWNrLCBkYW1pdCBkZXIgRHJpdmVyIGNsZWFuX3VwKCkgbmljaHQgbWVociBydWZ0LgoraW50IGNsZWFuX3VwKGludCByZWZjb3VudCkgeyByZXR1cm4gMDsgfQorCitzdGF0aWMgaW50IF9xdWVyeV9jdXJyZW50X21vbmV5KCkKK3sKKyAgcmV0dXJuIHN1bTsKK30KKwpkaWZmIC0tZ2l0IGEvc3RkL3RoaW5nLmMgYi9zdGQvdGhpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDhiNmMxCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3RoaW5nLmMKQEAgLTAsMCArMSw0NSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHRoaW5nLmMgLS0gc3RhbmRhcmQgb2JqZWN0CisvLworLy8gJElkOiB0aGluZy5jIDc4MDQgMjAxMS0wNy0xMCAyMDozNzo1MlogWmVzc3RyYSAkICAgICAgICAgICAgICAgICAgICAgIAorCisjcHJhZ21hIHN0cmljdF90eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIHBlZGFudGljCisjcHJhZ21hIHJhbmdlX2NoZWNrCisvLyNwcmFnbWEgbm9fY2xvbmUKKworaW5oZXJpdCAiL3N0ZC90aGluZy9wcm9wZXJ0aWVzIjsKK2luaGVyaXQgIi9zdGQvdGhpbmcvbGlnaHQiOworaW5oZXJpdCAiL3N0ZC90aGluZy9kZXNjcmlwdGlvbiI7Citpbmhlcml0ICIvc3RkL3RoaW5nL21vdmluZyI7Citpbmhlcml0ICIvc3RkL3RoaW5nL2xhbmd1YWdlIjsKK2luaGVyaXQgIi9zdGQvdGhpbmcvY29tbWFuZHMiOworaW5oZXJpdCAiL3N0ZC90aGluZy9yZXN0cmljdGlvbnMiOworaW5oZXJpdCAiL3N0ZC90aGluZy9lbnZjaGsiOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICBzZXRldWlkKGdldHVpZCgpKTsKKyAgcHJvcGVydGllczo6Y3JlYXRlKCk7CisgIGxpZ2h0OjpjcmVhdGUoKTsKKyAgY29tbWFuZHM6OmNyZWF0ZSgpOworICBkZXNjcmlwdGlvbjo6Y3JlYXRlKCk7CisgIHJlc3RyaWN0aW9uczo6Y3JlYXRlKCk7CisgIGVudmNoazo6Y3JlYXRlKCk7CisgIEFkZElkKCJEaW5nIik7CisKKyAgcmV0dXJuOworfQorCisvLyB3aXJkIGdlcnVmZW4sIHdlbm4gaW1wbGl6aXQgcGVyIGluaGVyaXQgZ2VsYWRlbi4gSW4gZGllc2VtIEZhbGwgd2lyZCBrZWluCisvLyBSZXNldCBiZW5vZXRpZ3QsIHdlaWwgZGFzIE9iamVrdCBuaWNodCBrb25maWd1cmllcnQgaXN0IHVuZCBudXIgZGFzCisvLyBQcm9ncmFtbSB3aWNodGlnIGlzdC4KK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZV9zdXBlcigpIHsKKyAgc2V0X25leHRfcmVzZXQoLTEpOworfQorCisvLyBEYW1pdCBtYW4gaW4gQUxMRU4gU3RhbmRhcmRvYmpla3RlbiA6OnJlc2V0IGF1ZnJ1ZmVuIGthbm4uCit2b2lkIHJlc2V0KCkge30KKwpkaWZmIC0tZ2l0IGEvc3RkL3RoaW5nL2NvbW1hbmRzLmMgYi9zdGQvdGhpbmcvY29tbWFuZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzQ1YjY3Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkL3RoaW5nL2NvbW1hbmRzLmMKQEAgLTAsMCArMSw1MzIgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyB0aGluZy9jb21tYW5kcy5jIC0tIHRoaW5nIGRlc2NyaXB0aW9uCisvLworLy8gJElkOiBjb21tYW5kcy5jIDk1MTQgMjAxNi0wMi0yMyAyMDozMzowOVogR2xvaW5zb24gJAorLy8KKy8vIEF1cyBSZWdlbmJvZ2VuIE1VRExpYgorLy8gYXVzIEd1ZWxkZW5sYW5kL1d1bmRlcmxhbmQgTVVEbGliIChNb3JnZW5ncmF1ZW4gTVVEbGliKQorLy8KKy8vIFBfQ09NTUFORFMgZGF0YS1zdHJ1Y3R1cmU6CisvLworLy8gQWRkQ21kKHZlcmIsZnVuMSwxKTsKKy8vIEFkZENtZCh2ZXJiK3N5bjFhfHN5bjFiJnN5bjJhfHN5bjJifHN5bjJjLGZ1bjIsCisvLwkgICBlcnJvcjFfbm90aWZ5fGVycm9yMl9ub3RpZnleZXJyb3IyX3dyaXRlKTsKKy8vIC0tPgorLy8gKFt2ZXJiOih7ZnVuMSxmdW4yfSk7CQkJCQkvLyBmdW5zCisvLwkgICh7MSwoe2Vycm9yMV9ub3RpZnksIGVycm9yMl93cml0ZV5lcnJvcjJfc2F5LCAxfSl9KTsgIC8vIGZsYWdzCisvLyAgICAgICAgKHswLCh7KHtzeW4xYSxzeW4xYn0pLCh7c3luMmEsc3luMmIsc3luMmN9KX0pfSk7CS8vIHJ1bGVzCisvLyAgICAgICAgMF0pCQkJCQkJCS8vIElEcworLy8KKy8vIFJ1bGVzOiAoezxSZWdlbHNhdHogZnVlciBmdW4xPiwgKHs8MS4gU3lub255bWdydXBwZT4sCisvLwkJCQkgICAgIDwyLiBTeW5vbnltZ3J1cHBlLCAuLi59KSwgLi4ufSkKKy8vIEZsYWdzOiAoezxGbGFnIGZ1ZXIgZnVuMT4sICh7PEZlaGxlcm1lbGR1bmcgMS4gU3lub255bWdydXBwZT4sIC4uLiAsCisvLwkJCQlbLCBJbmRleCBmdWVyIHdyaXRlIGFuc3RhdHQgbm90aWZ5X2ZhaWxdfSksCisvLwkgICAgLi4uIH0pCisvLyBJRHM6ICAgMCBvZGVyICh7PElEIGZ1ZXIgZnVuMT59KSBvZGVyICh7MCwgPElEIGZ1ZXIgZnVuMj59KSAuLi4KKy8vCisvLyBJREVBOiBzYXZlIG5vIDBzIGluIHJ1bGVzL2ZsYWdzIGlmIHBvc3NpYmxlIChhcyBpbiBJRHMpCisvLyAgICAgICAoYWRyZXNzaW5nIGVzcGVjaWFsbHkgb2xkLXN0eWxlLUFkZENtZC1NVURzKQorI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCisjaW5jbHVkZSA8bW92aW5nLmg+CisjaW5jbHVkZSA8dGhpbmcvbGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxleHBsb3JhdGlvbi5oPgorCisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPHRoaW5nL2Rlc2NyaXB0aW9uLmg+CisjaW5jbHVkZSA8dGhpbmcvY29tbWFuZHMuaD4KKyN1bmRlZiBORUVEX1BST1RPVFlQRVMKKworI2lmZGVmIERCRworI3VuZGVmIERCRworI2VuZGlmCisjZGVmaW5lIERCRyh4KSBwcmludGYoIk9iamVjdCAlTyB0bXBzdHI9JXNcbiIsIGV4cGxvZGUob2JqZWN0X25hbWUodGhpc19vYmplY3QoKSksIiMiKVsxXSwgeCk7CisKK3ByaXZhdGUgbm9zYXZlIG1hcHBpbmcgYWRkZWRfY21kczsKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKK30KKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlX3N1cGVyKCkgeworICBzZXRfbmV4dF9yZXNldCgtMSk7Cit9ICAgICAKKwordmFyYXJncyB2b2lkIEFkZENtZChtaXhlZCBjbWQsIG1peGVkIGZ1bmMsIG1peGVkIGZsYWcsIG1peGVkIGNtZGlkKSB7CisgaW50IGksajsKKyBjbG9zdXJlIGNsOworIG1peGVkICpydWxlOworCisgLy8gcG90ZW50aWVsbGUgQWRkQ21kIG1pdCBSZWdlbD8KKyBpZihzdHJpbmdwKGNtZCkpIHsKKyAgLy8gZWluZSBSZWdlbD8gLSBhdWZzcGxpdHRlbgorICBpZigoaT1tZW1iZXIoY21kLCcmJykpPjApIHsKKyAgIC8vIC4uLiBpbiBBcnJheSBtaXQgVmVya251ZXBmdW5nc2VsZW1lbnRlbgorICAgcnVsZT1leHBsb2RlKGNtZFsoaSsxKS4uXSwiJiIpOworICAgaj1zaXplb2YocnVsZSk7CisgICAvLyAuLi4gaW4gQXJyYXkgbWl0IEFycmF5cyBtaXQgQWx0ZXJuYXRpdmVsZW1lbnRlbjoKKyAgIC8vICJwfHEmcnxzIiAtPiAoeyAoeyJwIiwicSJ9KSwgKHsiciIsInMifX0gfSkKKyAgIHdoaWxlKGotLSkKKyAgICBydWxlW2pdPWV4cGxvZGUocnVsZVtqXSwifCIpOworCisgICAvLyBSZWdlbG4gdm9uIEtvbW1hbmRvdmVyYmVuIGFic2NobmVpZGVuCisgICBjbWQ9Y21kWzAuLihpLTEpXTsKKyAgfQorICAvLyBLb21tYW5kb3ZlcmJlbiBleHRyYWhpZXJlbgorICBjbWQ9ZXhwbG9kZShjbWQsInwiKTsKKworICAvLyBTYXR6IHZvbiBSZWdlbG4gZXhpc3RpZXJ0OiBBdWZzcGxpdHRlbiB2b24gRmVobGVybWVsZHVuZ2VuCisgIGlmKHJ1bGUpCisgICBpZihzdHJpbmdwKGZsYWcpKSB7CisgICAgbWl4ZWQgKmZhaWw7CisgICAgLy8gaW4gZWluZmFjaGVzIEFycmF5IG1pdCBqZXdlaWxpZ2VuIEZlaGxlcm1lbGR1bmdlbgorICAgIGZhaWw9ZXhwbG9kZShmbGFnLCJ8Iik7CisgICAgaj0wOworICAgIGk9c2l6ZW9mKGZhaWwpOworICAgIHdoaWxlKGo8aSkgeworICAgICAvLyB3cml0ZSAtIEZlaGxlcm1lbGR1bmcgZW50ZGVja3QgLSBQb3NpdGlvbiBnZ2YuIGVpbnRyYWdlbgorICAgICBpZihtZW1iZXIoZmFpbFtqXSwnXicpPj0wICYmICFpbnRwKGZhaWxbPDFdKSkKKyAgICAgIGZhaWwrPSh7an0pOworICAgICBpZihtZW1iZXIoZmFpbFtqXSwnQCcpPj0wKSB7CisgICAgICBpbnQgczsKKyAgICAgIGZsYWc9cmVnZXhwbG9kZShmYWlsW2pdLCAiQFdFW0EtU1VdKlswLTldIik7CisgICAgICBzPXNpemVvZihmbGFnKTsKKyAgICAgIHdoaWxlKChzLT0yKT4wKSB7CisgICAgICAgaW50IHRtcGludDsKKyAgICAgICB0bXBpbnQ9ZmxhZ1tzXVs8MV0tJzEnOworICAgICAgIGlmKHRtcGludDwwIHx8IHRtcGludD5qKQorICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKAorICAgICAgICAgIkFkZENtZDogZXJyb3ItbWVzc2FnZSAlZCBjb250YWlucyBvdXQtb2YtYm91bmRzIEBXRXh4LXJ1bGUuXG4iLGorMSkpOworICAgICAgfQorICAgICB9CisgICAgIGorKzsKKyAgICB9CisgICAgLy8gIldhcz98V2llIGRhcz8iIC0+ICh7Ildhcz8iLCJXaWUgZGFzPyJ9KQorICAgIC8vICJXYXM/fFdpZSBkYXM/XnxXb21pdCBkYXM/fFdvcmF1ZiBkYXM/XkBXRVIxIG1hY2h0IHdhcy4iIC0+CisgICAgLy8gICh7Ildhcz8iLAorICAgIC8vICAgICJXaWUgZGFzP15Xb21pdCBkYXM/IiwKKyAgICAvLwkgICJXb3JhdWYgZGFzP15AV0VSMSBtYWNodCB3YXMuIiwxfSkKKyAgICBmbGFnPXNpemVvZihmYWlsKTsKKyAgICBpZihmbGFnICYmIGZsYWc8c2l6ZW9mKHJ1bGUpKQorICAgICByYWlzZV9lcnJvcigKKyAgICAgICJBZGRDbWQ6IG51bWJlciBvZiBlcnJvci1tZXNzYWdlcyBkb2VzIG5vdCBtYXRjaCBudW1iZXIgb2YgcnVsZXMuXG4iKTsKKyAgICBmbGFnPWZhaWw7IC8vIHVlYmVyc2NocmVpYmVuIG1pdCBkZW4gcGFyc2VmcmV1bmRsaWNoZW4gRm9ybWF0CisgIH0gZWxzZSBpZihmbGFnKQorICAgcmFpc2VfZXJyb3IoIkFkZENtZDogcnVsZXMgZXhpc3QgYnV0IGZsYWdzIGFyZSBub3QgYW4gZXJyb3Itc3RyaW5nLlxuIik7CisgfSAvLyBlbmQgaWYoc3RyaW5ncChjbWQpKSAuLi4ga2VpbiBSZWdlbHN0cmluZyB2b3JoYW5kZW4KKworIC8vIGtlaW4gS29tbWFuZG9hcnJheSBnZXdlc2VuIG5vY2ggZXJ6ZXVndD8KKyBpZighcG9pbnRlcnAoY21kKSkKKyAgIHJhaXNlX2Vycm9yKCJBZGRDbWQ6IG1pc3Npbmcgc3RyaW5nL3BvaW50ZXItcGFyYW1ldGVyIGZvciBjb21tYW5kLlxuIik7CisKKyAvLyBDbG9zdXJlIGF1cyBlaW5lbSBTdHJpbmcgZXJ6ZXVnZW4sIHdlbm4gbW9lZ2xpY2ggdW5kIHNpY2hlcgorIC8vIChmdW5jdGlvbl9leGlzdHMoKSBmaWx0ZXJ0IHVubm9ldGlnZXJ3ZWlzZSBhdWNoIHJlaW5lICJzdGF0aWMiIGZ1bnMsCisgLy8gIGRpZSBnZW5hdWUgUHJ1ZWZ1bmcgdWViZXIgZnVuY3Rpb25saXN0KCkga29zdGV0IGplZG9jaCB6dXZpZWwpCisgaWYoc3RyaW5ncChmdW5jKSAmJgorICAgICghZXh0ZXJuX2NhbGwoKSB8fCBmdW5jdGlvbl9leGlzdHMoZnVuYyx0aGlzX29iamVjdCgpKSkgJiYKKyAgICBjbG9zdXJlcChjbD1zeW1ib2xfZnVuY3Rpb24oZnVuYyx0aGlzX29iamVjdCgpKSkpCisgIGZ1bmM9Y2w7CisKKyAvLyBqZWRlcyBlaW56ZWxuZSBWZXJiIG1pdCBzZWluZW4gUmVnZWxuIHVuZCBGdW5rdGlvbmVuIGVpbnRyYWdlbgorIGk9c2l6ZW9mKGNtZCk7CisgaWYoIWFkZGVkX2NtZHMpIGFkZGVkX2NtZHM9bV9hbGxvY2F0ZShpLDQpOworIHdoaWxlKGktLSkgeworICBzdHJpbmcgc3RyOworICBzdHI9Y21kW2ldOworICBpZighZnVuYykKKyAgIGlmKGV4dGVybl9jYWxsKCkpIGZ1bmM9cHJldmlvdXNfb2JqZWN0KCk7CisgICBlbHNlIGZ1bmM9dGhpc19vYmplY3QoKTsKKyAgaWYoIW1lbWJlcihhZGRlZF9jbWRzLHN0cikpCisgICBhZGRlZF9jbWRzKz0oW3N0cjphbGxvY2F0ZSgwKTthbGxvY2F0ZSgwKTthbGxvY2F0ZSgwKTswXSk7CisgIC8vIGV4aXN0aWVyZW5kZXMgVmVyYiBlcmdhZW56ZW4KKyAgYWRkZWRfY21kc1tzdHIsMF0rPSh7ZnVuY30pOworICBhZGRlZF9jbWRzW3N0ciwxXSs9KHtmbGFnfSk7CisgIGFkZGVkX2NtZHNbc3RyLDJdKz0oe3J1bGV9KTsKKyAgLy8gZ2dmLiBpZCBpbiBkYXMgSUQtTWFwcGluZyBlaW50cmFnZW4KKyAgaWYoY21kaWQpIHsKKyAgIG1peGVkICp0bXA7CisgICBqPXNpemVvZigoc3RyaW5nKilhZGRlZF9jbWRzW3N0ciwwXSk7CisgICB0bXA9YWRkZWRfY21kc1tzdHIsM118fGFsbG9jYXRlKGopOworICAgaWYoc2l6ZW9mKHRtcCk8aikgdG1wKz1hbGxvY2F0ZShqLXNpemVvZih0bXApKTsKKyAgIHRtcFs8MV09Y21kaWQ7CisgICBhZGRlZF9jbWRzW3N0ciwzXT10bXA7CisgIH0KKyB9Cit9CisKKy8vIEF1c3dlcnR1bmcgZnVlciBlaW4gVmVyYiBsb2VzY2hlbgordmFyYXJncyBpbnQgUmVtb3ZlQ21kKG1peGVkIGNtZCwgaW50IGRlbF9ub3J1bGUsIG1peGVkIG9ubHlpZCkgeworIGludCByZXQ7CisKKyAvLyBGYWxscyBNYWdpZXIgZGFzIFJlbW92ZUNtZCBmYWxzY2ggbnV0emVuICh6LkIuIGFuYWxvZyB6dSBBZGRDbWQpCisgLy8gd2lyZCBkYXMgUmVnZWxzeXN0ZW0gdmVyd2lycnQuIERhIGRhcyBkZWxfbm9ydWxlIG51ciBpbnQgc2VpbiBkYXJmLAorIC8vIGdpYnQgZXMgaGllciBlaW5lIGd1dGUgQ2hhbmNlIGRlbiBGZWhsZXIgYWJ3YWVydHNrb21wYXRpYmVsIHp1IGVudC0KKyAvLyBkZWNrZW4uIERhbWl0IFNwaWVsZXIgZGVuIEZlaGxlciBuaWNodCBtaXRiZWtvbW1lbiwgd2lyZCBoaWVyIGF1ZgorIC8vIGVpbiByYWlzZV9lcnJvciB2ZXJ6aWNodGV0LCB1bmQgc3RhdHQgZGVzc2VuIGluIGVpbiBMb2dmaWxlIGdlLQorIC8vIHNjaHJpZWJlbi4KKyBpZiAoIWludHAoZGVsX25vcnVsZSkpCisgeworICAgbG9nX2ZpbGUoIlJFTU9WRV9DTUQiLAorICAgICBzcHJpbnRmKCJcbi0tICVzIC0tXG5JbGxlZ2FsIFJlbW92ZUNvbW1hbmQoKSBpbiBPYmplY3QgWyVPXTpcbiAlT1xuIiwKKyAgICAgICBkdGltZSh0aW1lKCkpLCB0aGlzX29iamVjdCgpLCBjbWQpKTsKKyAgIGRlbF9ub3J1bGU9MDsKKyAgIG9ubHlpZD0wOworIH0KKyAKKyBpZighYWRkZWRfY21kcyB8fCAoIWNtZCAmJiAhZGVsX25vcnVsZSAmJiAhb25seWlkKSkKKyAgYWRkZWRfY21kcz0obWFwcGluZykwOyAKKyBlbHNlIHsKKyAgaW50IGksIGo7CisgIG1peGVkICpydWxlLCAqZmxhZywgKmZ1biwgKmRlbHJ1bGUsICppZHM7CisKKyAgaWYoc3RyaW5ncChjbWQpKSB7CisgICAvLyBSZWdlbG4gZW50ZGVja3QgLSBaZXJsZWdlbiAod2llIEFkZENtZCkKKyAgIGlmKChpPW1lbWJlcihjbWQsJyYnKSk+MCkgeworICAgIGRlbHJ1bGU9ZXhwbG9kZShjbWRbKGkrMSkuLl0sIiYiKTsKKyAgICBqPXNpemVvZihkZWxydWxlKTsKKyAgICB3aGlsZShqLS0pCisgICAgIGRlbHJ1bGVbal09ZXhwbG9kZShkZWxydWxlW2pdLCJ8Iik7CisgICAgY21kPWNtZFswLi4oaS0xKV07CisgICB9CisgICBjbWQ9ZXhwbG9kZShjbWQsInwiKTsKKyAgfSBlbHNlIGlmKGRlbF9ub3J1bGUgfHwgb25seWlkKSBjbWQ9bV9pbmRpY2VzKGFkZGVkX2NtZHMpOworCisgIGlmKCFwb2ludGVycChjbWQpKQorICAgcmFpc2VfZXJyb3IoIlJlbW92ZUNtZDogbWlzc2luZyBzdHJpbmcvcG9pbnRlci1wYXJhbWV0ZXIuXG4iKTsKKyAgaT1zaXplb2YoY21kKTsKKworICB3aGlsZShpLS0pIHsKKyAgIC8vIGtlaW5lIFJlZ2VsbiBkYSB1bmQgUmVnZWxuIGxvZXNjaGVuIGVybGF1YnQ6IGFsbGVzIGxvZXNjaGVuCisgICBpZighZGVscnVsZSAmJiAhZGVsX25vcnVsZSAmJiAhb25seWlkKSBtX2RlbGV0ZShhZGRlZF9jbWRzLGNtZFtpXSk7CisgICBlbHNlIGlmKG1fY29udGFpbnMoJmZ1biwgJmZsYWcsICZydWxlLCAmaWRzLCBhZGRlZF9jbWRzLCBjbWRbaV0pKSB7CisgICAgaj1zaXplb2YoZnVuKTsKKyAgICB3aGlsZShqLS0pIHsKKyAgICAgaW50IGs7CisgICAgIC8vIERCRyhydWxlW2pdKTsKKyAgICAJLy8gUmVnZWxuIG5pY2h0IGz2c2NoZW4gdW5kIFJlZ2VsPworICAgICBpZighKGRlbF9ub3J1bGUgJiYgcG9pbnRlcnAocnVsZVtqXSkpICYmCisgICAgICAgIC8vIG51ciBiZXN0aW1tdGUgSUQgbPZzY2hlbiB1bmQgSUQgcGFzc3QgbmljaHQ/CisgICAgICAgICEob25seWlkICYmICghcG9pbnRlcnAoaWRzKSB8fCBzaXplb2YoaWRzKTw9aiB8fCBpZHNbal0hPW9ubHlpZCkpICYmCisgICAgICAgIC8vIEz2c2NocmVnZWwgZXhpc3RpZXJ0IHVuZCBwYXNzdCBuaWNodCBhdWYgUmVnZWw/CisgICAgICAgICEoZGVscnVsZSAmJiAoaz1zaXplb2YocnVsZVtqXSkpIT1zaXplb2YoZGVscnVsZSkpKSB7CisgICAgICAvLyBwYXJ0aWVsbGVzIFRlc3RlbiBlaW5lciBM9nNjaHJlZ2VsIC4uLgorICAgICAgaWYoZGVscnVsZSkgeworICAgICAgIHdoaWxlKGstLSkKKyAgICAgICAgaWYoIXNpemVvZihydWxlW2pdW2tdJmRlbHJ1bGVba10pKSBicmVhazsKKyAgICAgICBpZihrPj0wKSBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIC8vIGFsbGVzIGtvcnJla3Q6IEz2c2NoZW4hCisgICAgICAvLyAoQXJyYXliZXJlaWNoIGR1cmNoIGxlZXJlcyBBcnJheSBsb2VzY2hlbikKKyAgICAgIGZsYWdbai4ual0gID0gYWxsb2NhdGUoMCk7CisgICAgICBmdW5bai4ual0gICA9IGFsbG9jYXRlKDApOworICAgICAgcnVsZVtqLi5qXSAgPSBhbGxvY2F0ZSgwKTsKKyAgICAgIGlmKGlkcykgeworICAgICAgIGlkc1tqLi5qXSA9IGFsbG9jYXRlKDApOworICAgICAgIGlmKCFzaXplb2YoaWRzLWFsbG9jYXRlKDEpKSkgaWRzPShtaXhlZCopMDsKKyAgICAgIH0KKyAgICAgIHJldCsrOworICAgICB9CisgICAgfSAvLyBlbmQgd2hpbGUoai0tKSB7CisgICB9CisgICAvLyBGdW5rdGlvbnMvUmVnZWxsaXN0ZSB1cGRhdGUgb2RlciBnZ2YuIEtvbW1hbmRvIHZvZWxsaWcgbG9lc2NoZW4KKyAgIGlmKHNpemVvZihydWxlKSkgeworICAgIGFkZGVkX2NtZHNbY21kW2ldLDBdPWZ1bjsKKyAgICBhZGRlZF9jbWRzW2NtZFtpXSwxXT1mbGFnOworICAgIGFkZGVkX2NtZHNbY21kW2ldLDJdPXJ1bGU7CisgICAgYWRkZWRfY21kc1tjbWRbaV0sM109aWRzOworICAgfSBlbHNlIG1fZGVsZXRlKGFkZGVkX2NtZHMsY21kW2ldKTsKKyAgfQorICBpZighc2l6ZW9mKGFkZGVkX2NtZHMpKSBhZGRlZF9jbWRzPShtYXBwaW5nKTA7CisgfQorIHJldHVybiByZXQ7Cit9CisKKy8vIEF1c2Z1ZWhyZW4gc2FtdCBnZXBhcnN0ZW0gSW5wdXRzdHJpbmcgdW5kIGdldHJpZ2dlcnRlbiBQYXJzZXJlcmdlYm5pc3Nlbgorc3RhdGljIGludCBfZXhlY3V0ZShtaXhlZCBmdW4sIHN0cmluZyBzdHIsIG1peGVkICpwYXJzZWQpIHsKKyBpZihjbG9zdXJlcChmdW4pKQorICByZXR1cm4gKChpbnQpZnVuY2FsbChmdW4sc3RyLCZwYXJzZWQpKTsKKyBpZihzdHJpbmdwKGZ1bikpCisgIHJldHVybiAoKGludCljYWxsX290aGVyKHRoaXNfb2JqZWN0KCksZnVuLHN0ciwmcGFyc2VkKSk7CisgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgQ0hFQ0tfUFJFU0VOVCAgICAgMQorI2RlZmluZSBDSEVDS19JRCAgICAgICAgICAyCisjZGVmaW5lIENIRUNLX1BVVEdFVE5PTkUgIDQKKyNkZWZpbmUgQ0hFQ0tfUFVUR0VURFJPUCAgOAorI2RlZmluZSBDSEVDS19QVVRHRVRUQUtFICAxNgorI2RlZmluZSBDSEVDS19QVVRHRVQgICAgICAoQ0hFQ0tfUFVUR0VUTk9ORXxDSEVDS19QVVRHRVREUk9QfENIRUNLX1BVVEdFVFRBS0UpCisKKy8vIFdlcnQgZnVlciBGZWhsc2NobGFnLCBGYWxsYmFjay1XZXJ0IGRlciBiZW51dHp0ZW4gd2hpbGUtLSAtIFNjaGxlaWZlbgorI2RlZmluZSBOT01BVENIRk9VTkQgICAgICAtMQorCisvLyBSZWdlbG4gZnVlciBlaW4gKG51biB1bndpY2h0aWdlcykgVmVyYiB0cmlnZ2Vybgorc3RhdGljIGludCBfcHJvY2Vzc19jb21tYW5kKHN0cmluZyBzdHIsIHN0cmluZyAqbm9wYXJzZXN0ciwKKwkJCSAgICAgbWl4ZWQgZnVuLCBtaXhlZCBmbGFnLCBtaXhlZCBydWxlKSB7CisgbWl4ZWQgKnBhcnNlZCwgKm9iam1hdGNoZXM7CisKKyAvLyBlaW5lIFJlZ2VsIC4uLiBhdXN3ZXJ0ZW4gLi4uCisgaWYocG9pbnRlcnAocnVsZSkpIHsKKyAgaW50IG5ydWw7CisgIHBhcnNlZD1vYmptYXRjaGVzPWFsbG9jYXRlKDApOworICBpbnQgbGFzdG1hdGNocG9zPU5PTUFUQ0hGT1VORDsKKworICAvLyBBYmdsZWljaGVuIGRlciBnZXNwbGl0dGV0ZW4gRWluZ2FiZSBtaXQgUmVnZWxuOgorICAvLyB2b3J3YWVydHMgZHVyY2ggZGllIFN5bm9ueW1ncnVwcGVuCisgIGludCBycz1zaXplb2YocnVsZSk7CisgIHdoaWxlKG5ydWw8cnMpIHsKKyAgIGludCBtYXRjaHBvczsKKyAgIHN0cmluZyAqc3lub255bTsKKyAgIG1peGVkIG1hdGNoc3RyOworCisgICBtYXRjaHBvcz1OT01BVENIRk9VTkQ7CisgICBtYXRjaHN0cj0wOworCisgICAvLyBTeW5vbnltZSBleHRyYWhpZXJlbgorICAgaW50IG5yc3lub255bXM9c2l6ZW9mKHN5bm9ueW09cnVsZVtucnVsXSk7CisKKyAgIC8vIGVnYWwgd2llIGR1cmNoIFN5bm9ueW1lIGJpcyBNYXRjaCAtIEFiZ2xlaWNoIG1pdCBFaW5nYWJlCisgICB3aGlsZShucnN5bm9ueW1zLS0pIHsKKyAgICBpbnQgdG1wcG9zID0gbWVtYmVyKG5vcGFyc2VzdHIsc3lub255bVtucnN5bm9ueW1zXSk7CisgICAgLy8gaXN0IFN5bm9ueW0gaW0gRWluZ2FiZXN0cmluZyB1bmQga29tbXQgc3BhZXRlciBhbHMgdm9yaGVyaWdlcyBTeW5vbnltPworICAgIGlmKHRtcHBvcz49MCAmJiB0bXBwb3M+bGFzdG1hdGNocG9zKSB7CisgICAgIC8vIEVyZm9sZzogbWVya2VuIGRlciBQb3NpdGlvbiBpbSBFaW5nYWJlc3RyaW5nIHVuZCBkZW4gbWF0Y2hlbmRlbiBTdHJpbmcKKyAgICAgbWF0Y2hwb3M9dG1wcG9zOworICAgICBtYXRjaHN0cj1ub3BhcnNlc3RyW3RtcHBvc107CisgICAgIGJyZWFrOworICAgIH0KKyAgIH0KKworICAgLy8ga2VpbiBNYXRjaCBkdXJjaCBTeW5vbnltZT8gUHJ1ZWZlIGRpZSBALVNwZXppYWx2YXJpYWJsZW4uCisgICBpZihtYXRjaHBvcyA9PSBOT01BVENIRk9VTkQpIHsKKyAgICBpbnQgY2hlY2tfcHJlc2VudDsKKyAgICAvLyBpc3QgQWJwcnVlZmVuIHZvbiBJRC9QUkVTRU5UIGluIGRlciBTeW5vbnltZ3J1cHBlIHZlcmxhbmd0CisgICAgLy8gYmVpIHByZXNlbnQoKS9maW5kX29icyBnbGVpY2ggVm9yYXVzc2V0enVuZyBndWVsdGlnZXIgVFAgbWl0cHJ1ZmVuCisgICAgaWYobWVtYmVyKHN5bm9ueW0sIkBJRCIpPj0wKSBjaGVja19wcmVzZW50PUNIRUNLX0lEOworICAgIGlmKHRoaXNfcGxheWVyKCkpIHsKKyAgICAgaWYobWVtYmVyKHN5bm9ueW0sIkBQUkVTRU5UIik+PTApIGNoZWNrX3ByZXNlbnR8PUNIRUNLX1BSRVNFTlQ7CisgICAgIGVsc2UgaWYobWVtYmVyKHN5bm9ueW0sIkBQVVRfR0VUX05PTkUiKT49MCkKKwkJY2hlY2tfcHJlc2VudHw9Q0hFQ0tfUFVUR0VUTk9ORTsKKyAgICAgZWxzZSBpZihtZW1iZXIoc3lub255bSwiQFBVVF9HRVRfVEFLRSIpPj0wKQorCQljaGVja19wcmVzZW50fD1DSEVDS19QVVRHRVREUk9QOworICAgICBlbHNlIGlmKG1lbWJlcihzeW5vbnltLCJAUFVUX0dFVF9EUk9QIik+PTApCisJCWNoZWNrX3ByZXNlbnR8PUNIRUNLX1BVVEdFVFRBS0U7CisgICAgfQorCisgICAgaWYoY2hlY2tfcHJlc2VudCkgeworICAgICAvLyB3aXIgZmFuZ2VuIGhpbnRlciBkZW0gbGV0enRlbiBNYXRjaCBhbgorICAgICBpbnQgcV9zdGFydD1sYXN0bWF0Y2hwb3MrMTsKKyAgICAgaW50IHJfZW5kPXNpemVvZihub3BhcnNlc3RyKS0xOworCisgICAgIGludCByYW5nZTsKKyAgICAgd2hpbGUoKHJhbmdlPXJfZW5kLXFfc3RhcnQpPj0wKSB7CisgICAgICBtaXhlZCB0bXBvYmo7CisKKyAgICAgIC8vIHdpZSB3ZWl0IHdvbGxlbiB3aXIgenVy/GNrZ2VoZW4/CisgICAgICBpZihyYW5nZSkKKyAgICAgICAgaWYoIShjaGVja19wcmVzZW50JkNIRUNLX1BVVEdFVCkpCisgICAgICAgICAgcmFuZ2U9cmFuZ2U+Mj8yOnJhbmdlOyAvLyAzIEZyYWdtZW50ZSBmdWVyIEBJRC9AUFJFU0VOVCAoQWR2ZXJiL05yKQorICAgICAgICBlbHNlIGlmKHJhbmdlPjQpCisgICAgICAgICAgcmFuZ2U9NDsgICAgICAgICAgICAgICAvLyA1IEZyYWdtZW50ZSBmdWVyIEBQVVRfWFhYIAorCisgICAgICAvLyB1bmQgamV0enQgZGllIFN1YnN0cmluZ3MgcHJ1ZWZlbgorICAgICAgd2hpbGUocmFuZ2U+PTAgJiYgIW1hdGNoc3RyKSB7CisgICAgICAgc3RyaW5nIHRtcHN0cjsKKworICAgICAgIC8vIHp1IHBydWVmZW5kZW4gU3RyaW5nIGF1cyBkZW4gVGVpbGVuIHp1c2FtbWVuc2V0emVuCisgICAgICAgaWYocmFuZ2UpIHRtcHN0cj1pbXBsb2RlKG5vcGFyc2VzdHJbcV9zdGFydC4uKHFfc3RhcnQrcmFuZ2UpXSwiICIpOworICAgICAgIGVsc2UgdG1wc3RyPW5vcGFyc2VzdHJbcV9zdGFydF07CisKKyAgICAgICAvL0RCRyh0bXBzdHIpOworICAgICAgIGlmKGNoZWNrX3ByZXNlbnQmQ0hFQ0tfUFJFU0VOVCAmJgkJCS8vIFBSRVNFTlQgPworICAgICAgICAgICgodG1wb2JqPXByZXNlbnQodG1wc3RyLHRoaXNfcGxheWVyKCkpKSB8fAorICAgICAgICAgICAodG1wb2JqPXByZXNlbnQodG1wc3RyLGVudmlyb25tZW50KHRoaXNfcGxheWVyKCkpKSkpKQorICAgICAgICBtYXRjaHN0cj10bXBvYmo7CisgICAgICAgZWxzZSBpZihjaGVja19wcmVzZW50JkNIRUNLX0lEICYmIGlkKHRtcHN0cikpCS8vIElEID8KKyAgICAgICAgbWF0Y2hzdHI9dGhpc19vYmplY3QoKTsKKyAgICAgICBlbHNlIGlmKChjaGVja19wcmVzZW50JkNIRUNLX1BVVEdFVCkgJiYJLy8gUFVUX0dFVF8/Pz8gPworICAgICAgICAgICAgICAgKHRtcG9iaj0ob2JqZWN0KikKKyAgICAgICAgICAgICAgICAgIHRoaXNfcGxheWVyKCktPmZpbmRfb2JzKHRtcHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAoW0NIRUNLX1BVVEdFVE5PTkU6UFVUX0dFVF9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfUFVUR0VURFJPUDpQVVRfR0VUX1RBS0UsCisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19QVVRHRVRUQUtFOlBVVF9HRVRfRFJPUF0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0NIRUNLX1BVVEdFVCZjaGVja19wcmVzZW50XSkpICYmCisgICAgICAgICAgICAgICBzaXplb2YodG1wb2JqKSkgeworICAgICAgICBpZihzaXplb2YodG1wb2JqKT09MSkgbWF0Y2hzdHI9dG1wb2JqWzBdOworICAgICAgICBlbHNlIHsJLy8gQXJyYXlzIHdlcmRlbiB6d2lzY2hlbmdlc3BlaWNoZXJ0IC4uLgorICAgICAgICAgb2JqbWF0Y2hlcys9KHtzaXplb2YocGFyc2VkKSx0bXBvYmp9KTsKKyAgICAgICAgIG1hdGNoc3RyPXRtcHN0cjsKKyAgICAgICAgfQorICAgICAgIH0gZWxzZSB7IC8vIGRpZXNlciBTdWJzdHJpbmcgaGF0IG5pY2h0IGdlbWF0Y2h0CisgICAgICAgIC8vIGFiIHdlbmlnZXIgYWxzIDMgVGVpbGVuIGlzdCBkYXMgTmljaHRtYXRjaGluZyBlaW5lcyBTdWJzdHJpbmdzIG1pdAorICAgICAgICAvLyBiZWVuZGVuZGVtIE51bWVyYWwgS3JpdGVyaXVtIGZ1ZXIgQWJicnVjaCAoIm9iamVrdCAyIiBzb2xsIG1hdGNoZW4pCisgICAgICAgIHN0cmluZyBudW1lcmFsY2hlY2s7CisgICAgICAgIGlmKHJhbmdlICYmIHJhbmdlPD0yICYmCisgICAgICAgICAgIHNpemVvZihudW1lcmFsY2hlY2s9bm9wYXJzZXN0cltxX3N0YXJ0K3JhbmdlXSkgJiYKKyAgICAgICAgICAgdG9fc3RyaW5nKHRvX2ludChudW1lcmFsY2hlY2spKT09bnVtZXJhbGNoZWNrKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8vIFN1YnN0cmluZ2xhZW5nZSB2ZXJrdWVyemVuIHVuZCB3ZWl0ZXIKKyAgICAgICAgcmFuZ2UtLTsKKyAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIE1hdGNoIGdlZnVuZGVuIQorICAgICAgaWYobWF0Y2hzdHIpIHsKKyAgICAgICBtYXRjaHBvcz1yYW5nZStxX3N0YXJ0OworICAgICAgIC8vIERCRyhtYXRjaHBvcyk7CisgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBxX3N0YXJ0Kys7CisgICAgIH0gLy8gZW5kIHdoaWxlCisgICAgfQorICAgfQorCisgICAvLyBGZWhsZXJtZWxkdW5nIGZ1ZXIgZGllc2UgZmVobGdlc2NobGFnZW5lIFN5bm9ueW1ncnVwcGUgc2V0emVuCisgICBpZihtYXRjaHBvcyA9PSBOT01BVENIRk9VTkQpIHsKKyAgICAvLyBGZWhsZXJtZWxkdW5nZW4gdW5kIGVpbiBFaW50cmFnIGFuIGRlciBGZWhsZXJzdGVsbGU/CisgICAgaWYocG9pbnRlcnAoZmxhZykgJiYgc2l6ZW9mKGZsYWcpPm5ydWwpIHsKKworICAgICBtYXRjaHN0cj1mbGFnW25ydWxdOworCisgICAgIGlmKHN0cmluZ3AobWF0Y2hzdHIpICYmIHNpemVvZihtYXRjaHN0cikpIHsKKyAgICAgIGlmKG1lbWJlcihtYXRjaHN0ciwnQCcpPj0wKSB7CisgICAgICAgbWF0Y2hzdHI9cmVwbGFjZV9wZXJzb25hbCgmbWF0Y2hzdHIsKHt0aGlzX3BsYXllcigpfSkrcGFyc2VkLDEpOworICAgICAgIHN0cmluZyBzdGFtbT0oKHF1ZXJ5X3ZlcmIoKVs8MV1eJ2UnKT9xdWVyeV92ZXJiKCk6cXVlcnlfdmVyYigpWzAuLjwyXSk7CisgICAgICAgbWF0Y2hzdHI9cmVncmVwbGFjZShtYXRjaHN0ciwiQFZFUkIiLGNhcGl0YWxpemUoc3RhbW0pLDEpOworICAgICAgIG1hdGNoc3RyPXJlZ3JlcGxhY2UobWF0Y2hzdHIsIkB2ZXJiIixzdGFtbSwxKTsKKyAgICAgIH0KKworICAgICAgLy8gaXN0IEZlaGxlcm1lbGR1bmcgZWluIFdSSVRFPworICAgICAgLy8gZGFubiByZXR1cm4gMSAhCisgICAgICBpZihpbnRwKGZsYWdbPDFdKSAmJiBmbGFnWzwxXTw9bnJ1bCkgeworICAgICAgIGlmKG1lbWJlcihtYXRjaHN0ciwnXicpPj0wKSB7CisgICAgICAgIG1hdGNoc3RyPWV4cGxvZGUobWF0Y2hzdHIsIl4iKTsKKyAgICAgICAgd3JpdGUoY2FwaXRhbGl6ZShicmVha19zdHJpbmcobWF0Y2hzdHJbMF0sNzgsMCwxKSkpOworICAgICAgICBpZihzaXplb2YobWF0Y2hzdHJbMV0pKQorICAgICAgICAgc2F5KGNhcGl0YWxpemUoYnJlYWtfc3RyaW5nKG1hdGNoc3RyWzFdLDc4LDAsMSkpLCh7dGhpc19wbGF5ZXIoKX0pICk7CisgICAgICAgfSBlbHNlIHdyaXRlKGNhcGl0YWxpemUoYnJlYWtfc3RyaW5nKG1hdGNoc3RyLDc4LDAsMSkpKTsKKyAgICAgICByZXR1cm4gMTsKKyAgICAgIH0gZWxzZSBub3RpZnlfZmFpbChjYXBpdGFsaXplKGJyZWFrX3N0cmluZyhtYXRjaHN0ciw3OCwwLDEpKSk7CisgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7CisgICB9CisKKyAgIC8vIFVwZGF0ZW4gZGVyIEhpbGZzdmFyaWFibGVuCisgICBwYXJzZWQrPSh7bWF0Y2hzdHJ9KTsKKyAgIGxhc3RtYXRjaHBvcz1tYXRjaHBvczsKKyAgIG5ydWwrKzsKKyAgfSAvLyBlbmQgd2hpbGUobnJ1bDxycykgLi4uIEVyZm9sZyAuLi4gYWIgenVtIG5hZWNoc3RlbiBSZWdlbHRlaWwKKyB9CisKKyAvLyBBcnJheXMgZGVyIEAtT2JqZWN0bWF0Y2hlcyBpbiBQYXJhbWV0ZXIgZnVlciBNZXRob2RlIHJlc3Vic3RpdHVpZXJlbgorIGludCBvYmpzaXplOworIGlmKChvYmpzaXplPXNpemVvZihvYmptYXRjaGVzKSkpCisgIHdoaWxlKChvYmpzaXplLT0yKT49MCkKKyAgIHBhcnNlZFtvYmptYXRjaGVzW29ianNpemVdXT1vYmptYXRjaGVzW29ianNpemUrMV07CisKKyAvLyBlcmZvbGdyZWljaCBNZXRob2RlIGdlZnVuZGVuL2VpbmUgUmVnZWwgYmlzIHp1bSBFbmRlIGR1cmNoZ2VwYXJzdDoKKyByZXR1cm4oX2V4ZWN1dGUoJmZ1biwmc3RyLCZwYXJzZWQpKTsKK30KKworLy8gQXVzd2VydHVuZyAtIGFkZF9hY3Rpb24tRnVuIAorcHVibGljIGludCBfY2woc3RyaW5nIHN0cikgeworIGludCBuaW5kZXg7Cisgc3RyaW5nICprZXlzOworIG1peGVkICpmbGFnOworIC8vIFZlcmIgZXhpc3RpZXJ0LCBLb21tYW5kb3MgYXVjaCwgRWludHJhZyBmdWVyIFZlcmIgZ2VmdW5kZW4KKyBpZihtYXBwaW5ncChhZGRlZF9jbWRzKSAmJiBxdWVyeV92ZXJiKCkpIHsKKyAgbWl4ZWQgKmZ1biwgKnJ1bGUsICppZHM7CisKKyAgLy8gaXN0IGRhcyBWZXJiIGVpbiBLZXkgaW0gS29tbWFuZG9tYXBwaW5nPworICBpZihtX2NvbnRhaW5zKCZmdW4sICZmbGFnLCAmcnVsZSwgJmlkcywgYWRkZWRfY21kcywgcXVlcnlfdmVyYigpKSkgeworICAgc3RyaW5nICpub3BhcnNlc3RyOworICAgbmluZGV4PXNpemVvZihmdW4pOworICAgbm9wYXJzZXN0cj1leHBsb2RlKChzdHJ8fCIiKSwiICIpLSh7IiJ9KTsKKyAgIC8vIGRhbm4gbWF0Y2hlIHVuZ2VwYXJzdGVuIElucHV0IGdlZ2VuIGV0d2FpZ2UgUmVnZWxuCisgICAvLyAtLSBuaWNodCBhZW5kZXJuOiBuZXVlIEtvbW1hbmRvcyBzb2xsZW4gYWx0ZSAidWViZXJzY2hyZWliZW4iIGtvZW5uZW4KKyAgIHdoaWxlKG5pbmRleC0tKQorICAgIGlmKF9wcm9jZXNzX2NvbW1hbmQoJnN0ciwgbm9wYXJzZXN0ciwKKwkJICAgICAgIGZ1bltuaW5kZXhdLCBmbGFnW25pbmRleF0sIHJ1bGVbbmluZGV4XSkpCisgICAgeworICAgICAgR2l2ZUVQKEVQX0NNRCwgcXVlcnlfdmVyYigpKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorCisgIC8vIGtlaW5lIFJlZ2VsIHBhc3N0ZSwgdW5zY2hhcmZlIEF1c3dlcnR1bmcgYXVmIGFsbGUKKyAgLy8gQWRkQ21kdmVyYmVuIGF1c2RlaG5lbgorICBrZXlzPW1faW5kaWNlcyhhZGRlZF9jbWRzKTsKKyAgbmluZGV4PXNpemVvZihrZXlzKTsKKyAgd2hpbGUobmluZGV4LS0pCisgICBpZighc3Ryc3RyKHF1ZXJ5X3ZlcmIoKSxrZXlzW25pbmRleF0pICYmCisgICAgICBtZW1iZXIoKGZsYWc9YWRkZWRfY21kc1trZXlzW25pbmRleF0sMV0pLDEpPj0wKSB7CisgICAgaW50IGkscmV0OworICAgIGk9c2l6ZW9mKGZsYWcpOworICAgIC8vIFJlaWhlbmZvbGdlIG5pY2h0IGFlbmRlcm4gIQorICAgIHdoaWxlKGktLSkKKyAgICAgIGlmKGZsYWdbaV09PTEpIHsKKyAgICAgICAgbWl4ZWQgKmV4ZWMgPSBhZGRlZF9jbWRzW2tleXNbbmluZGV4XSwwXTsKKyAgICAgICAgaWYoIXBvaW50ZXJwKGV4ZWMpIHx8IHNpemVvZihleGVjKTw9aSkKKyAgICAgICAgICBjYXRjaChyYWlzZV9lcnJvcigKKyAgICAgICAgICAgICJBZGRDbWQtQXVzd2VydHVuZzogQ2F0Y2hBbGwtS29tbWFuZG8gXCIiK2tleXNbbmluZGV4XSsiXCIiCisgICAgICAgICAgICAiIHd1cmRlIHdhZWhyZW5kIGRlciBBdXNmdWVocnVuZyB2ZXJhZW5kZXJ0IG9kZXIgZ2Vsb2VzY2h0LiAiCisgICAgICAgICAgICAiS2xhcnRleHQ6IERhcyBpc3Qgc2NobGVjaHQuIFN1Y2h0IGVpbiBSZW1vdmVDbWQ/ICIpOworICAgICAgICAgICAgcHVibGlzaCk7CisgICAgICAgIGVsc2UgaWYoX2V4ZWN1dGUoZXhlY1tpXSxzdHIsMCkpIHsKKyAgICAgICAgICBHaXZlRVAoRVBfQ01ELCBxdWVyeV92ZXJiKCkpOworICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICB9CisgICB9CisgfQorIHJldHVybiAwOworfQorCit2b2lkIGluaXQoKSB7CisgYWRkX2FjdGlvbigiX2NsIiwiIiwxKTsKK30KKworCitzdGF0aWMgdm9pZCBfY2hlY2tfY29weV9jb21tYW5kcyhzdHJpbmcgaW5kLCBtaXhlZCAqZnVuLAorCQkJCSAgbWl4ZWQgKmZsYWcsIG1peGVkICpydWxlKSB7CisgaWYocG9pbnRlcnAoZnVuKSkgYWRkZWRfY21kc1tpbmQsMF09ZnVuK2FsbG9jYXRlKDApOworIGVsc2UgYWRkZWRfY21kc1tpbmQsMF09KHtmdW59KTsKKyBpZihwb2ludGVycChmbGFnKSkgYWRkZWRfY21kc1tpbmQsMV09ZmxhZythbGxvY2F0ZSgwKTsKKyBlbHNlIGlmKGZsYWcpIGFkZGVkX2NtZHNbaW5kLDFdPSh7ZmxhZ30pOworIGVsc2UgYWRkZWRfY21kc1tpbmQsMV09YWxsb2NhdGUoc2l6ZW9mKGFkZGVkX2NtZHNbaW5kXSkpOworIGlmKHBvaW50ZXJwKHJ1bGUpKSBhZGRlZF9jbWRzW2luZCwyXT1ydWxlK2FsbG9jYXRlKDApOworIGVsc2UgYWRkZWRfY21kc1tpbmQsMl09YWxsb2NhdGUoc2l6ZW9mKGFkZGVkX2NtZHNbaW5kXSkpOworCisgaWYoc2l6ZW9mKGFkZGVkX2NtZHNbaW5kXSkhPXNpemVvZihhZGRlZF9jbWRzW2luZCwxXSkgfHwKKyAgICBzaXplb2YoYWRkZWRfY21kc1tpbmRdKSE9c2l6ZW9mKGFkZGVkX2NtZHNbaW5kLDJdKSkgeworICBhZGRlZF9jbWRzPShtYXBwaW5nKTA7CisgIHJhaXNlX2Vycm9yKCJTZXRQcm9wKFBfQ09NTUFORFMpOiBjb3JydXB0IGNvbW1hbmRzLW1hcHBpbmcuXG4iKTsKKyB9Cit9CisKK3N0YXRpYyBtYXBwaW5nIF9zZXRfY29tbWFuZHMobWFwcGluZyBjb21tYW5kcykgeworIGlmKCFjb21tYW5kcykgYWRkZWRfY21kcz0obWFwcGluZykwOworIGVsc2UgaWYobWFwcGluZ3AoY29tbWFuZHMpKSB7CisgIGFkZGVkX2NtZHM9bV9hbGxvY2F0ZShzaXplb2YoY29tbWFuZHMpLDQpOworICB3YWxrX21hcHBpbmcoY29tbWFuZHMsIydfY2hlY2tfY29weV9jb21tYW5kcyk7CisgfQorIGlmIChtYXBwaW5ncChhZGRlZF9jbWRzKSkKKyAgIHJldHVybihkZWVwX2NvcHkoYWRkZWRfY21kcykpOworIGVsc2UKKyAgIHJldHVybiAobWFwcGluZykwOworfQorCitzdGF0aWMgbWFwcGluZyBfcXVlcnlfY29tbWFuZHMoKSB7CisgaWYgKG1hcHBpbmdwKGFkZGVkX2NtZHMpKQorICAgcmV0dXJuKGRlZXBfY29weShhZGRlZF9jbWRzKSk7CisgZWxzZQorICAgcmV0dXJuIChtYXBwaW5nKTA7Cit9CisKZGlmZiAtLWdpdCBhL3N0ZC90aGluZy9kZXNjcmlwdGlvbi5jIGIvc3RkL3RoaW5nL2Rlc2NyaXB0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdiZmIwZQotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC90aGluZy9kZXNjcmlwdGlvbi5jCkBAIC0wLDAgKzEsODUxIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gdGhpbmcvZGVzY3JpcHRpb24uYyAtLSBkZXNjcmlwdGlvbiBoYW5kbGluZyBmb3Igc3RhbmRhcmQgb2JqZWN0cworLy8KKy8vICRJZDogZGVzY3JpcHRpb24uYyA5NTYxIDIwMTYtMDUtMjUgMTk6MzM6MjJaIFplc3N0cmEgJAorCisjcHJhZ21hIHN0cmljdF90eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisKKyNpbmNsdWRlIDx0bHMuaD4KKyNpbmNsdWRlIDx0aGluZy9kZXNjcmlwdGlvbi5oPgorI2luY2x1ZGUgPHRoaW5nL21hdGVyaWFsLmg+CisjaW5jbHVkZSA8dGhpbmcvbGlnaHR0eXBlcy5oPgorI2luY2x1ZGUgPGV4cGxvcmF0aW9uLmg+ICAgICAgICAgICAgICAgICAgLy8gd2VnZW4gRVBNQVNURVIKKyNpbmNsdWRlIDxjbGFzcy5oPgorCisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPHRoaW5nL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx0aGluZy9sYW5ndWFnZS5oPgorCisjdW5kZWYgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCisvLyBWYXJpYWJsZSB1bSBkZW4gRlAgYWJ6dXNwZWljaGVybiAKK3ByaXZhdGUgbm9zYXZlIG1peGVkICpleHBsb3JlOworCisvLyBQcm90b3R5cGVuCitwdWJsaWMgc3RyaW5nIHNob3J0KCk7CitwdWJsaWMgdmFyYXJncyBzdHJpbmcgbG9uZyhpbnQgbW9kZSk7CisKKy8vICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFN5c3RlbS1GdW5rdGlvbmVuICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworLy8gT2JqZWt0IGVyemV1Z2VuCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICBzdHJpbmcgcG9pZCwgdHBpZDsKKyAgb2JqZWN0IHRwOworCisgIFNldFByb3AoIFBfTkFNRSwgIkRpbmciICk7CisgIFNldFByb3AoIFBfU0hPUlQsICJOaWNodHMgYmVzb25kZXJlcyIgKTsKKyAgU2V0UHJvcCggUF9MT05HLCAwICk7CisKKyAgU2V0KCBQX0FESkVDVElWRVMsICh7fSkgKTsKKyAgU2V0KCBQX05BTUVfQURKLCAoe30pICk7CisgIFNldCggUF9JRFMsICh7fSkgKTsKKyAgU2V0KCBQX0NMQVNTLCAoe30pICk7CisKKyAgU2V0KCBQX1JFQURfREVUQUlMUywgKFtdKSwgRl9WQUxVRSk7CisgIFNldCggUF9SRUFEX0RFVEFJTFMsIFNFQ1VSRUR8Tk9TRVRNRVRIT0QsIEZfTU9ERV9BUyk7CisKKyAgU2V0KCBQX0RFVEFJTFMsIChbXSksIEZfVkFMVUUpOworICBTZXQoIFBfREVUQUlMUywgU0VDVVJFRHxOT1NFVE1FVEhPRCwgRl9NT0RFX0FTICk7CisKKyAgU2V0KCBQX1NNRUxMUywgKFtdKSwgRl9WQUxVRSk7CisgIFNldCggUF9TTUVMTFMsIFNFQ1VSRUR8Tk9TRVRNRVRIT0QsIEZfTU9ERV9BUyApOworCisgIFNldCggUF9TT1VORFMsIChbXSksIEZfVkFMVUUpOworICBTZXQoIFBfU09VTkRTLCBTRUNVUkVEfE5PU0VUTUVUSE9ELCBGX01PREVfQVMgKTsKKworICBTZXQoIFBfVE9VQ0hfREVUQUlMUywgKFtdKSwgRl9WQUxVRSk7CisgIFNldCggUF9UT1VDSF9ERVRBSUxTLCBTRUNVUkVEfE5PU0VUTUVUSE9ELCBGX01PREVfQVMgKTsKKworICAvLyBBZW5kZXJ1bmdlbiBhbiBkaWVzZXIgUHJvcCBzaW5kIHRhYnUuCisgIFNldCggUF9DTE9ORV9USU1FLCBOT1NFVE1FVEhPRHxTRUNVUkVELCBGX01PREVfQVMgKTsKKworICAvLyBJZCBkZXMgQ2xvbmVycyB1bmQgZGVzIEJlc2l0emVycyBrb21tZW4gbmFjaCBQX0NMT05FUgorICBpZiAob2JqZWN0cCggdHA9dGhpc19pbnRlcmFjdGl2ZSgpfHx0aGlzX3BsYXllcigpICkpCisgIHsKKyAgICB0cGlkPWdldGV1aWQodHApOworICAgIGlmICghKHRwaWQ9Z2V0ZXVpZCh0cCkpKSB0cGlkPWdldHVpZCh0cCk7CisgIH0KKyAgZWxzZQorICAgIHRwaWQ9IlVOS05PV04iOworCisgIGlmIChwcmV2aW91c19vYmplY3QoKSkKKyAgeworICAgIGlmICghKHBvaWQgPSBnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSkpCisgICAgICBwb2lkID0gZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKTsKKyAgfQorICBlbHNlCisgICAgcG9pZD0iVU5LTk9XTiI7CisKKyAgU2V0KCBQX0NMT05FUiwgKHBvaWQgIT0gdHBpZCA/IHBvaWQrIjoiK3RwaWQ6IHRwaWQpICk7CisgIFNldCggUF9DTE9ORVIsIE5PU0VUTUVUSE9EfFNFQ1VSRUQsIEZfTU9ERV9BUyApOworCisgIC8vIEdpYnQgZXMgRlBzID8KKyAgZXhwbG9yZSA9IChtaXhlZCAqKUVQTUFTVEVSLT5RdWVyeUV4cGxvcmUoKTsKKworICByZXR1cm47Cit9CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZV9zdXBlcigpIHsKKyAgc2V0X25leHRfcmVzZXQoLTEpOworfQorCisvLyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEZvcnNjaGVycHVua3RlICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMKKworLy8gRlAgdmVyZ2ViZW4KK3N0YXRpYyB2b2lkIEdpdmVFUCggaW50IHR5cGUsIHN0cmluZyBrZXkgKQoreworICAvL0FiYnJ1Y2gsIHdlbm4gdmVyZ2ViZW5kZXMgT2JqZWt0IHNjaG9uIHplcnN0b2VydCBpc3QuIEFDSFRVTkc6IEF1Y2gKKyAgLy9kaWVzZSBBYmZyYWdlIHd1ZXJkZSBrZWluIEZQIHZlcmdlYmVuIHdlcmRlbiwgd2VubiBzaWNoIGRhcyBPYmpla3QgaW0KKyAgLy92ZXJnZWJlbmRlbiBLb21tYW5kbyB6ZXJzdG9lcnQsIGRhIGRlciBEcml2ZXIgY2FsbF9vdGhlcigpIHZvbiB6ZXJzdG9lcnRlbgorICAvL09iamVrdGVuIGlnbm9yaWVydCEKKyAgaWYgKCFvYmplY3RwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgIGlmICh0aGlzX3BsYXllcigpKSB0aGlzX3BsYXllcigpLT5jb3VudENtZHMoIHR5cGUsIGtleSApOworICAKKyAgaWYgKGV4cGxvcmUmJiFleHRlcm5fY2FsbCgpJiYKKyAgICAgIChleHBsb3JlWzBdID09IHR5cGUpICYmIChtZW1iZXIoZXhwbG9yZVsxXSwga2V5KSA+PSAwKSApCisgICAgRVBNQVNURVItPkdpdmVFeHBsb3JhdGlvblBvaW50KGtleSk7CisgIHJldHVybjsKK30KKworLy8gTWFuY2hlIE9iamVrdGUga29lbm5lbiBtaXQgcmVuYW1lX29iamVjdCBlaW5lbiBuZXVlbiBGaWxlbmFtZW4gYmVrb21tZW4uCisvLyBEYW5hY2ggc29sbHRlIGRlciBFUE1BU1RFUiBuZXUgbmFjaCBkZW4gRGV0YWlscyBiZWZyYWd0IHdlcmRlbi4KK3ZvaWQgX19yZWxvYWRfZXhwbG9yZSgpCit7CisgIGV4cGxvcmUgPSAobWl4ZWQgKilFUE1BU1RFUi0+UXVlcnlFeHBsb3JlKCk7CisgIHJldHVybjsKK30KKworLy8gICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgSUQtTWFuYWdlbWVudCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjCisKKy8vIEdpYnQgZWluZSBJRCB6dXJ1ZWNrLCBkaWUgZGVuIExhZGVuYW1lbiwgZGllIGFrdHVlbGxlIEt1cnpiZXNjaHJlaWJ1bmcgdW5kCisvLyBkaWUgYWt0dWVsbGUgTGFuZ2Jlc2NocmVpYnVuZyBiZXJ1ZWNrc2ljaHRpZ3QuIERpZXNlIElEIGlzdCBlaW4gSGFzaHdlcnQuCitwdWJsaWMgc3RyaW5nIGRlc2NyaXB0aW9uX2lkKCkgeworICByZXR1cm4gaGFzaChUTFNfSEFTSF9NRDUsIGxvYWRfbmFtZSgpICsgc2hvcnQoKSArIGxvbmcoKSk7Cit9CisKKy8qIElkcyBtdWVzc2VuIHVlYmVyZ2ViZW4gd2VyZGVuLCBkYSB1bml0IG1hY2htYWwgbWl0IHBsdXJhbC1JZHMsICovCisvKiBhbHNvIGFuZGVyZW4gYWxzIGRlbiBub3JtYWxlbiBhcmJlaXRlbiBtdXNzLiAqLworaW50IG1hdGNoX2l0ZW0oIHN0cmluZyBzdHIsIHN0cmluZyAqaWRzICkKK3sKKyAgc3RyaW5nICpvYmosKmFkczsKKyAgaW50IGxlbiwgaTsKKyAgCisgIC8vIFBhcmFtZXRlciBmYWxzY2g/IFBhc3N0IG5pY2h0IC4uLgorICBpZighc3RyKSAgICAgICAgICAgcmV0dXJuIDA7CisgIGlmKCFwb2ludGVycChpZHMpKSByZXR1cm4gMDsKKyAgaWYoIXNpemVvZihpZHMpKSAgIHJldHVybiAwOworICAKKyAgLy8gSXN0IHNjaG9uIHNvIGRhYmVpPyBOYSBLbGFzc2UgOi0pCisgIGlmKG1lbWJlcihpZHMsc3RyKT4tMSkgcmV0dXJuIDE7CisgIAorICAvLyBLZWluZSBBZGpla3RpdmUgdm9yaGFuZGVuIC4uLiBwYXNzdCBuaWNodC4KKyAgaWYgKCEoYWRzPVF1ZXJ5UHJvcChQX0FESkVDVElWRVMpKSkgcmV0dXJuIDA7CisgIGlmICghc2l6ZW9mKGFkcykpICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAKKyAgLy8gTnVyIGVpbiBXb3J0PyBEYW5uIHBhc3N0IGVzIG5pY2h0CisgIG9iaj1leHBsb2RlKHN0ciwiICIpOworICBpZiAoIShsZW49c2l6ZW9mKG9iaiktMSkpIHJldHVybiAwOworICAKKyAgLy8gQWRqZWt0aXZlIHN0ZWhlbiBhbSBBbmZhbmcuIFNvYmFsZCBlcyBuaWNodCBtZWhyIHBhc3N0LAorICAvLyBtdXNzIGVzIGRhcyBPYmpla3RpdiBzZWluLgorICB3aGlsZShpPGxlbiYmbWVtYmVyKGFkcyxvYmpbaV0pPi0xKSBpKys7CisKKyAgcmV0dXJuIChtZW1iZXIoaWRzLGltcGxvZGUob2JqW2kuLmxlbl0sIiAiKSk+LTEpOworfQorCisvLyBXaXJkIHZvbSBHYW1lZHJpdmVyIGF1ZmdlcnVmZW4gKHByZXNlbnQpCisvLyBIYXQgZGllc2VyIEdlZ2Vuc3RhbmQgZGllIElEIHN0cj8KKy8vIGx2bCB3aXJkIGlnbm9yaWVydAordmFyYXJncyBpbnQgaWQoIHN0cmluZyBzdHIsIGludCBsdmwgKSAKK3sgCisgIHN0cmluZyBzdHIyLCB0bXA7CisgIGludCBjb3VudDsJCisgIHN0cmluZ3xzdHJpbmcqIGlkczsKKworICAvLyBLZWluIEFyZ3VtZW50PyBEYW5uIHBhc3N0IGVzIG5pY2h0IC4uLgorICBpZiAoIXN0cmluZ3Aoc3RyKSkgcmV0dXJuIDA7CisKKyAgLy8gS2VpbmUgSURzPyBBdWNoIG5pY2h0IGd1dCAuLi4KKyAgaWYgKCFwb2ludGVycChpZHM9UXVlcnlQcm9wKFBfSURTKSkpIHJldHVybiAwOworICBpZiAoIXNpemVvZihpZHMpKSByZXR1cm4gMDsKKworICBpZHMgKz0gKHsgKCJcbiIgKyBvYmplY3RfbmFtZSgpKSwKKyAgICAgICAgICAgICgiXG4iICsgZXhwbG9kZShvYmplY3RfbmFtZSgpLCIjIilbMF0pIH0pOworCisgIC8vIElkIHBhc3N0PyBBbGxlcyBrbGFyIDotKQorICBpZiAobWF0Y2hfaXRlbSggc3RyLCBpZHMgKSkgcmV0dXJuIDE7CisKKyAgLy8gRGllIGlkIGhhdCBlaW5lIFphaGwgZHJpbi4gV2VubiBaYWhsIGRpZSBSb2hpZCBwYXNzdCwKKyAgLy8gZGFubiBndWNrZW4sIG9iIG1hbiBzZWxiZXIgZGFzIG50ZSBFbGVtZW50IGlzdC4KKyAgaWYgKHNzY2FuZiggc3RyLCAiJXMgJWQlcyIsIHN0cjIsIGNvdW50LCB0bXApPDIpIHJldHVybiAwOworICBpZiAoY291bnQ8MSkgcmV0dXJuIDA7CisgIGlmIChzaXplb2YodG1wKSkgcmV0dXJuIDA7CisgIGlmICghbWF0Y2hfaXRlbSggc3RyMiwgaWRzICkpIHJldHVybiAwOworICBpZiAoIWVudmlyb25tZW50KCkpIHJldHVybiAwOworICByZXR1cm4gcHJlc2VudChzdHIyLGNvdW50LGVudmlyb25tZW50KCkpPT10aGlzX29iamVjdCgpOworfQorCisvLyBHbGVpY2ggZWluZSBnYW56ZSBMaXN0ZSB2b24gaWRzIHRlc3RlbgoraW50IG1hdGNoX2lkcyhzdHJpbmcgKmxpc3QpCit7CisgIHN0cmluZyAqaWRzOworCisgIC8vIFVuZ3VlbHRpZ2UgUGFyYW1ldGVyPyBXZWcgaGllciAuLi4gIAorICBpZiAoIXBvaW50ZXJwKGxpc3QpKSByZXR1cm4gMDsKKyAgaWYgKCFwb2ludGVycChpZHM9UXVlcnlQcm9wKFBfSURTKSkpIHJldHVybiAwOworCisgIGlkcyArPSAoeyAoIlxuIiArIG9iamVjdF9uYW1lKCkpLAorICAgICAgICAgICAgKCJcbiIgKyBleHBsb2RlKG9iamVjdF9uYW1lKCksIiMiKVswXSkgfSk7CisKKyAgcmV0dXJuIHNpemVvZiggbGlzdCAmIGlkcyApOworfQorCisvLyBJRCBoaW56dWZ1ZWdlbgordm9pZCBBZGRJZCggc3RyaW5nfHN0cmluZyogc3RyICkKK3sKKyAgaWYgKHN0cmluZ3Aoc3RyKSkgc3RyID0gKHsgc3RyIH0pOworICBpZiAocG9pbnRlcnAoc3RyKSkKKyAgICAvLyBEb3BwZWx0ZSBlbGltaW5pZXJlbgorICAgIFNldCggUF9JRFMsIFF1ZXJ5KFBfSURTLCBGX1ZBTFVFKS1zdHIrc3RyLCBGX1ZBTFVFKTsKKyAgcmV0dXJuOworfQorCisvLyBJRCBlbnRmZXJuZW4KK3ZvaWQgUmVtb3ZlSWQoc3RyaW5nfHN0cmluZyogc3RyKQoreworICBpZiAoc3RyaW5ncChzdHIpKSBzdHIgPSAoeyBzdHIgfSk7CisgIGlmIChwb2ludGVycChzdHIpKQorICAgIFNldChQX0lEUyxRdWVyeShQX0lEUywgRl9WQUxVRSktc3RyLCBGX1ZBTFVFKTsKKyAgcmV0dXJuOworfQorCisvLyBBbGxlIElkcyBhdWYgZWlubWFsIHNldHplbgorc3RhdGljIHN0cmluZyogX3NldF9pZHMoIHN0cmluZyogaWRzICkKK3sKKyAgICBTZXQoIFBfSURTLCh7fSkpOworICAgIEFkZElkKGlkcyk7CisgICAgcmV0dXJuIFF1ZXJ5KFBfSURTLCBGX1ZBTFVFKTsKK30KKworLy8gQWRqZWt0aXYgaGluenVmdWVnZW4KK3ZvaWQgQWRkQWRqZWN0aXZlKHN0cmluZ3xzdHJpbmcqIHN0cikKK3sKKyAgaWYgKHN0cmluZ3Aoc3RyKSkgc3RyID0gKHsgc3RyIH0pOworICBpZiAocG9pbnRlcnAoc3RyKSkKKyAgICAvLyBEb3BwZWx0ZSBlbGltaW5pZXJlbgorICAgICAgU2V0KCBQX0FESkVDVElWRVMsIFF1ZXJ5KFBfQURKRUNUSVZFUywgRl9WQUxVRSktc3RyK3N0ciwgRl9WQUxVRSApOworICByZXR1cm47Cit9CisKKy8vIEFkamVrdGl2IGVudGZlcm5lbgordm9pZCBSZW1vdmVBZGplY3RpdmUoc3RyaW5nfHN0cmluZyogc3RyKQoreworICBpZiAoc3RyaW5ncChzdHIpKSBzdHIgPSAoeyBzdHIgfSk7CisgIGlmIChwb2ludGVycChzdHIpKQorICAgIFNldCggUF9BREpFQ1RJVkVTLCBRdWVyeShQX0FESkVDVElWRVMsIEZfVkFMVUUpIC0gc3RyLCBGX1ZBTFVFICk7CisgIHJldHVybjsKK30KKworLy8gQWxsZSBBZGpla3RpdmUgYXVmIGVpbm1hbCBzZXR6ZW4KK3N0YXRpYyBzdHJpbmcqIF9zZXRfYWRqZWN0aXZlcyhzdHJpbmcqIGFkamVjdGl2ZXMpCit7CisgIFNldCggUF9BREpFQ1RJVkVTLCh7fSksIEZfVkFMVUUpOworICBBZGRBZGplY3RpdmUoYWRqZWN0aXZlcyk7CisgIHJldHVybiBRdWVyeShQX0FESkVDVElWRVMsIEZfVkFMVUUpOworfQorCisKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgTmFtZW5zZ2VidW5nICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMKKworLy8gSW0gRmFsbCB2b24gbWVocmVyZW4gQWRqZWt0aXZlbiBtdWVzc2VuIGRpZXNlIG1pdCBrb21tYQorLy8genVzYW1lbmdlYmF1dCB3ZXJkZW4sIGRhenUgbXVzcyBpY2ggZGFzIGxlZXJ6ZWljaGVuIGFiZXIgZXJzdG1hbAorLy8gYWJzY2huZWlkZW4gdW5kIHNvIHdlaXRlciAuLi4KK3ByaXZhdGUgc3RyaW5nIGRlcG9pbnRlcl9hZGooIHN0cmluZyogYWRqLCBpbnQgY2FzdXMsIGludCBkZW1vbiApIHsKKyAgc3RyaW5nIG1zZzsKKyAgaW50IHN0YXJ0OworICBzdHJpbmcgcmVzLGE7CisJYWRqID0gbWFwKCBhZGosICMnRGVjbEFkaiwgY2FzdXMsIGRlbW9uICk7CisgIHN0YXJ0ID0gMTsKKyAgcmVzID0gIiI7CisgIGZvcmVhY2goIGE6IGFkaiApIHsKKyAgICByZXMgKz0gKHN0YXJ0ID8gIiIgOiAiLCAiKSArIGFbMC4uPDJdOworICAgIHN0YXJ0ID0gMDsKKyAgfQorICByZXR1cm4gcmVzICsgIiAiOworfQorCisvLyBXaWUgbGF1dGV0IGRlciBOYW1lIGRlcyBPYmpla3RzPwordmFyYXJncyBzdHJpbmcgbmFtZShpbnQgY2FzdXMsaW50IGRlbW9uKQoreworICBtaXhlZCBzaCwgYWRqOworICBpbnQgYXJ0LCBwbHVyYWw7CisKKyAgYXJ0ID0gUXVlcnlQcm9wKFBfQVJUSUNMRSk7CisKKyAgLy8gUkFXOiBkaXJla3QgenVydWVja2dlYmVuIG9obmUgVmVyYXJiZWl0dW5nCisgIGlmIChjYXN1cyA9PSBSQVcgKQorICB7CisgICAgaWYocG9pbnRlcnAoUXVlcnlQcm9wKFBfTkFNRSkpKQorICAgICAgcmV0dXJuIFF1ZXJ5UHJvcChQX05BTUUpW1dFUl07CisgICAgcmV0dXJuIFF1ZXJ5UHJvcChQX05BTUUpOworICB9CisKKyAgLy8gVW5zaWNodGJhcjogRXR3YXMKKyAgaWYgKFF1ZXJ5UHJvcChQX0lOVklTKSkKKyAgICByZXR1cm4gKHsgImV0d2FzIiwgInZvbiBldHdhcyIsICJldHdhcyIsICJldHdhcyIgfSlbY2FzdXNdOworCisgIC8vIEtlaW4gTmFtZT8gU2NoYWRlIC4uLgorICBpZiAoIShzaD1RdWVyeVByb3AoUF9OQU1FKSkgfHwKKyAgICAgIChzdHJpbmdwKHNoKSAmJiAhc2l6ZW9mKHNoKSkpIHJldHVybiAwOworCisgIC8vIFBfTkFNRSBwcnVlZmVuLgorICBpZiAocG9pbnRlcnAoc2gpICYmIHNpemVvZihzaCkgIT0gNCkKKyAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIlVuZ3VlbHRpZ2UgQXJyYXlncm9lc3NlIGluIFBfTkFNRTogJWRcbiIsCisgICAgICAgICAgICBzaXplb2Yoc2gpKSk7CisKKyAgLy8gUGx1cmFsIC4uIE5hbWVuIHZlcnd1cnN0ZW4KKyAgaWYgKHBsdXJhbCA9IFF1ZXJ5UHJvcChQX1BMVVJBTCkpCisgIHsKKyAgICAvLyBTZWxiZXIgQXJ0aWtlbCBzdWNoZW4gaXN0IG5pY2h0IC4uLgorICAgIGlmIChkZW1vbj09Mnx8IWFydCkgZGVtb24gPSAwOworCisgICAgLy8gZmFsbHMgUF9OQU1FIGVpbiBBcnJheSBtaXQgRmFlbGxlbiBlbnRoYWVsdCwgZGVuIHJpY2h0aWdlbgorICAgIC8vIGV4dHJhaGllcmVuLi4uCisgICAgaWYgKHBvaW50ZXJwKHNoKSkgeworICAgICAgICBzaCA9IHNoW2Nhc3VzXTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8vIHNvbnN0IHZlcnN1Y2hlbiwgenUgZGVrbGluaWVyZW4uCisgICAgICAgIGludCBsYXN0ID0gc2hbPDFdOworICAgICAgICBpZiAoY2FzdXMgPT0gV0VNJiZsYXN0IT0ncycmJmxhc3QhPSduJykgc2ggPSBzaCArICJuIjsKKyAgICB9CisKKyAgICAvLyBTaW5kIEFkamVrdGl2ZSB2b3JoYW5kZW4/CisgICAgaWYgKCBwb2ludGVycChhZGogPSBRdWVyeVByb3AoUF9OQU1FX0FESikpICYmIHNpemVvZihhZGopKQorICAgICAgICBhZGogPSBkZXBvaW50ZXJfYWRqKGFkaixjYXN1cyxkZW1vbik7CisgICAgaWYgKCFzdHJpbmdwKGFkaikpIGFkaiA9ICIiOworCisgICAgcmV0dXJuIHNwcmludGYoIiVzJXMlcyVzIixRdWVyeUFydGljbGUoY2FzdXMsZGVtb24sMCksYWRqLAorICAgICAgICAgICAgICAgICAgIChwbHVyYWwgPCAyID8gIiI6KHBsdXJhbCA8IDggPworICAgICAgICAgICAgICAgICAgICAoeyAiendlaSAiLCAiZHJlaSAiLCAidmllciAiLCAiZnVlbmYgIiwgInNlY2hzICIsCisgICAgICAgICAgICAgICAgICAgICAgICJzaWViZW4gIiB9KVtwbHVyYWwtMl0gOiB0b19zdHJpbmcocGx1cmFsKSsiICIpKSxzaCk7CisgIH0KKworICAvLyBOYW1lIGlzdCBQb2ludGVyOiBFaW5mYWNoIGRlbiByaWNodGlnZW4gYXVzd2FlaGxlbgorICBpZiAocG9pbnRlcnAoc2gpKQorICAgIHNoID0gc2hbY2FzdXNdOworCisgIC8vIEFuc29uc3RlbiBkb2NoIHdpZWRlciB2ZXJ3dXJzdGVuIC4uLgorICBlbHNlIGlmIChzdHJpbmdwKHNoKSkKKyAgeworICAgIGludCBsYXN0ID0gc2hbPDFdOworCisgICAgc3dpdGNoKGNhc3VzKQorICAgIHsKKyAgICAgIGNhc2UgV0VNOgorICAgICAgY2FzZSBXRU46CisgICAgICAgIGlmICggYXJ0ICYmIGxhc3Q9PSdlJyYmUXVlcnlQcm9wKFBfR0VOREVSKSA9PSBNQUxFKQorICAgICAgICAgIHNoID0gKHN0cmluZylzaCArICJuIjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgV0VTU0VOOgorICAgICAgICBpZiggIWFydCApCisgICAgICAgIHsKKyAgICAgICAgICBzd2l0Y2gobGFzdCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlICd4JzoKKyAgICAgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICAgICAgY2FzZSAneic6CisgICAgICAgICAgICAgIHNoID0gKHN0cmluZylzaCArICInIjsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc2ggPSAoc3RyaW5nKXNoICsgInMiOworICAgICAgICAgIH0KKyAgICAgICAgfSAKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgc3dpdGNoKGxhc3QpCisgICAgICAgICAgeworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgaWYgKFF1ZXJ5UHJvcChQX0dFTkRFUikhPUZFTUFMRSkKKyAgICAgICAgICAgICAgICBzaD0oc3RyaW5nKXNoKyJzIjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdlJzoKKyAgICAgICAgICAgICAgaWYgKFF1ZXJ5UHJvcChQX0dFTkRFUik9PU1BTEUpCisgICAgICAgICAgICAgICAgc2g9KHN0cmluZylzaCsibiI7CisgICAgICAgICAgICBjYXNlICd4JzoKKyAgICAgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICAgICAgY2FzZSAneic6CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0gLyogc3dpdGNoIChsYXN0KSAqLworICAgICAgICB9IC8qIGlmKCAhYXJ0ICkgZWxzZSAqLworICAgIH0gLyogc3dpdGNoKCBjYXN1cyApICovCisgIH0gLyogcG9pbnRlcnAoc2gpICovCisKKyAgLy8gUkFXPyBEYW5uIG1hbCB6dXJ1ZWNrCisgIGlmIChkZW1vbiA9PSBSQVcpIHJldHVybiAoc3RyaW5nKXNoOworCisgIC8vIFNlbGJlciBBcnRpa2VsIHN1Y2hlbiAuLi4KKyAgaWYgKGRlbW9uPT0yKQorICB7CisgICAgaWYgKGFydCkKKyAgICAgIGRlbW9uID0gU3VnZ2VzdEFydGljbGUoKTsKKyAgICBlbHNlCisgICAgICBkZW1vbj0wOyAvLyBLZWluIEFydGlrZWw6IGVnYWwgKFN1Z2dlc3RBcnRpY2xlIGlzdCB6ZWl0YXVmd2VuZGlnKQorICB9CisKKyAgaWYgKHBvaW50ZXJwKGFkaiA9IFF1ZXJ5UHJvcChQX05BTUVfQURKKSkgJiYgc2l6ZW9mKGFkaikpCisgICAgYWRqID0gZGVwb2ludGVyX2FkaihhZGosY2FzdXMsZGVtb24pOworCisgIGlmICghc3RyaW5ncChhZGopKSAgYWRqID0gIiI7CisKKyAgcmV0dXJuIFF1ZXJ5QXJ0aWNsZSggY2FzdXMsIGRlbW9uICkrYWRqK3NoOworfQorCisvLyBHcm9zc2dlc2NocmllYmVuZW4gTmFtZW4genVydWVja2dlYmVuCit2YXJhcmdzIHN0cmluZyBOYW1lKCBpbnQgY2FzdXMsIGludCBkZW1vbiApCit7CisgICAgcmV0dXJuIGNhcGl0YWxpemUobmFtZSggY2FzdXMsIGRlbW9uICl8fCIiKTsKK30KKworLy8gTGFuZ2Jlc2NocmVpYnVuZyBhbnplaWdlbgorcHVibGljIHZhcmFyZ3Mgc3RyaW5nIGxvbmcoaW50IG1vZGUpCit7CisgICAgcmV0dXJuIHByb2Nlc3Nfc3RyaW5nKCBRdWVyeVByb3AoUF9MT05HKSApOworfQorCisvLyBLdXJ6YmVzY2hyZWlidW5nIGFuemVpZ2VuLCBmYWxscyBuaWNodCB1bnNpY2h0YmFyCitwdWJsaWMgc3RyaW5nIHNob3J0KCkKK3sKKyAgc3RyaW5nIHNoOworCisgIC8vIFVuc2ljaHRiYXI/IERhbm4gZ2lidHMgbmljaHRzIHp1IHNlaGVuIC4uLgorICBpZiAoUXVlcnlQcm9wKFBfSU5WSVMpfHwhKHNoPVF1ZXJ5UHJvcChQX1NIT1JUKSkpCisgICAgcmV0dXJuIDA7CisgIAorICByZXR1cm4gcHJvY2Vzc19zdHJpbmcoc2gpKyIuXG4iOworfQorCisvLyBOYW1lbnMtQWRqZWt0aXZlIHNldHplbgorc3RhdGljIHN0cmluZyogX3NldF9uYW1lX2FkaihzdHJpbmd8c3RyaW5nKiBhZGplY3RpdmVzKQoreworICBpZiAoIWFkamVjdGl2ZXMpCisgICAgICBhZGplY3RpdmVzPSh7fSk7CisgIC8vIEluIEFycmF5IHVtd2FuZGVsbgorICBlbHNlIGlmICggIXBvaW50ZXJwKGFkamVjdGl2ZXMpKSAKKyAgICAgIGFkamVjdGl2ZXMgPSAoeyB0b19zdHJpbmcoYWRqZWN0aXZlcykgfSk7CisgIHJldHVybiBTZXQoIFBfTkFNRV9BREosIGFkamVjdGl2ZXMgKTsKK30KKworLy8gICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyBEZXRhaWxzLCBHZXJ1ZWNoZSwgTGFlcm0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisvLyBMb3ctbGV2ZWwgRnVua3Rpb24genVtIEVyZ2FlbnplbiB2b24gRGV0YWlscywgd2lyZCB2b24gZGVuIGRpdi4gQWRkLi4uKCkKKy8vIGdlcnVmZW4sIGRpZSBkYXMgcmljaHRpZ2UgTWFwcGluZyB1ZWJlcmdlYmVuLgorLy8gQWVuZGVydCBkYXMgTWFwcGluZyA8ZGV0YWlscz4gZGlyZWt0LgorcHJpdmF0ZSB2b2lkIF9hZGRfZGV0YWlscyhzdHJpbmd8c3RyaW5nKiBrZXlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmd8c3RyaW5nKnxtYXBwaW5nfGNsb3N1cmUgZGVzY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgZGV0YWlscyApCit7CisgIGlmIChzdHJpbmdwKGtleXMpKQorICAgIGRldGFpbHNba2V5c109ZGVzY3I7CisgIGVsc2UgaWYgKHBvaW50ZXJwKGtleXMpKQorICB7CisgICAgZm9yZWFjaChzdHJpbmcga2V5IDoga2V5cykKKyAgICAgIGRldGFpbHNbbG93ZXJfY2FzZShrZXkpXT1kZXNjcjsKKyAgfQorICBlbHNlCisgICAgcmFpc2VfZXJyb3IoIldyb25nIHR5cGUgdG8gYXJndW1lbnQgMSwgZXhwZWN0ZWQgc3RyaW5nfHN0cmluZyouXG4iKTsKK30KKworLy8gTG93LWxldmVsIEZ1bmt0aW9uIHp1bSBFbnRmZXJuZW4gdm9uIERldGFpbHMsIHdpcmQgdm9uIGRlbiBkaXYuIFJlbW92ZS4uLigpCisvLyBnZXJ1ZmVuLCBkaWUgZGFzIHJpY2h0aWdlIE1hcHBpbmcgdWViZXJnZWJlbi4KKy8vIEFlbmRlcnQgZGFzIE1hcHBpbmcgPGRldGFpbHM+IGRpcmVrdC4KK3ByaXZhdGUgdm9pZCBfcmVtb3ZlX2RldGFpbHMoc3RyaW5nfHN0cmluZyoga2V5cywgbWFwcGluZyBkZXRhaWxzICkKK3sKKyAgaWYgKHN0cmluZ3Aoa2V5cykpCisgICAgZGV0YWlscyAtPSAoW2tleXNdKTsKKyAgZWxzZSBpZiAocG9pbnRlcnAoa2V5cykpCisgICAgZGV0YWlscyAtPSBta21hcHBpbmcoa2V5cyk7CisgIGVsc2UKKyAgICByYWlzZV9lcnJvcigiV3JvbmcgdHlwZSB0byBhcmd1bWVudCAxLCBleHBlY3RlZCBzdHJpbmd8c3RyaW5nKi5cbiIpOworfQorCisvLyBEZXRhaWwocykgaGluenVmdWVnZW4KK3ZvaWQgQWRkRGV0YWlsKHN0cmluZ3xzdHJpbmcqIGtleXMsIHN0cmluZ3xzdHJpbmcqfG1hcHBpbmd8Y2xvc3VyZSBkZXNjcikKK3sKKyAgICBpbnQgaTsKKyAgICBtYXBwaW5nIGRldGFpbHM7CisKKyAgICBkZXRhaWxzID0gUXVlcnkoUF9ERVRBSUxTLCBGX1ZBTFVFKTsKKworICAgIC8vIF9hZGRfZGV0YWlscygpIGFlbmRlcm4gZGFzIE1hcHBpbmcgZGlyZWt0LCBTZXQgZXRjLiBuaWNodCBub2V0aWcuCisgICAgcmV0dXJuIF9hZGRfZGV0YWlscyhrZXlzLCBkZXNjciwgZGV0YWlscyk7Cit9CisKKy8vIERldGFpbChzKSBlbnRmZXJuZW4KK3ZhcmFyZ3Mgdm9pZCBSZW1vdmVEZXRhaWwoc3RyaW5nfHN0cmluZyoga2V5cyApCit7CisgIC8vIEFsbGUgbG9lc2NoZW4gZ2VodCBkaXJla3QgLi4uCisgIGlmICgha2V5cyApCisgICAgU2V0KFBfREVUQUlMUywgKFtdKSwgRl9WQUxVRSk7CisgIGVsc2UKKyAgICAvLyBfcmVtb3ZlX2RldGFpbHMoKSBhZW5kZXJuIGRhcyBNYXBwaW5nIGRpcmVrdCwgU2V0IGV0Yy4gbmljaHQgbm9ldGlnLgorICAgIF9yZW1vdmVfZGV0YWlscyhrZXlzLCBRdWVyeShQX0RFVEFJTFMsIEZfVkFMVUUpKTsKK30KKworLy8gU3BlY2lhbERldGFpbCBoaW56dWZ1ZWdlbgordm9pZCBBZGRTcGVjaWFsRGV0YWlsKHN0cmluZ3xzdHJpbmcqIGtleXMsIHN0cmluZyBmdW5jdGlvbm5hbWUgKQoreworICAgIGNsb3N1cmUgY2w7CisKKyAgICAvLyBBYnNpY2hlcm4hIFNvbnN0IGtvZW5udGUgamVkZXIgaW50ZXJuZSBGdW5rdGlvbmVuIGF1ZnJ1ZmVuCisgICAgaWYgKGV4dGVybl9jYWxsKCkgJiYKKyAgICAgICAgKGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpICE9IGdldGV1aWQoKSB8fCBwcm9jZXNzX2NhbGwoKSkgJiYKKyAgICAgICAgIShvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSkgPT0gIi9vYmovZG9vcm1hc3RlciIgJiYKKyAgICAgICAgICBmdW5jdGlvbm5hbWUgPT0gInNwZWNpYWxfZGV0YWlsX2Rvb3JzIikgKQorICAgICAgcmFpc2VfZXJyb3IoICJJbGxlZ2FsIHVzZSBvZiBBZGRTcGVjaWFsRGV0YWlsIVxuIiApOworCisgICAgLy8gQ2xvc3VyZSBnZW5lcmllcmVuCisgICAgaWYgKCAhc3RyaW5ncChmdW5jdGlvbm5hbWUpfHwKKyAgICAgICAgICEoY2wgPSBzeW1ib2xfZnVuY3Rpb24oIGZ1bmN0aW9ubmFtZSwgdGhpc19vYmplY3QoKSkpICkKKyAgICAgIHJldHVybjsKKworICAgIC8vIERldGFpbCBoaW56dWZ1ZWdlbgorICAgIEFkZERldGFpbCgga2V5cywgY2wgKTsKKyAgICByZXR1cm47Cit9CisKKy8vIFNwZWNpYWxEZXRhaWwocykgZW50ZmVybmVuCit2b2lkIFJlbW92ZVNwZWNpYWxEZXRhaWwoc3RyaW5nfHN0cmluZyoga2V5cyApCit7CisgIC8vIFJlbW92ZVNwZWNpYWxEZXRhaWwoMCkgd3VlcmRlIHNvbnN0IEFMTEUgRGV0YWlscyAoYXVjaCBkaWUKKyAgLy8gJ25vcm1hbGVuJykgbG9lc2NoZW4KKyAgaWYgKHBvaW50ZXJwKGtleXMpfHxzdHJpbmdwKGtleXMpKQorICAgIFJlbW92ZURldGFpbChrZXlzKTsKKyAgcmV0dXJuOworfQorCisvLyBMZXNiYXJlcyBEZXRhaWwgZWluZnVlZ2VuCit2b2lkIEFkZFJlYWREZXRhaWwoc3RyaW5nfHN0cmluZyoga2V5cywKKyAgICAgICAgICAgICAgICAgICBzdHJpbmd8c3RyaW5nKnxtYXBwaW5nfGNsb3N1cmUgZGVzY3IgKQoreworICAvLyBfYWRkX2RldGFpbHMoKSBhZW5kZXJuIGRhcyBNYXBwaW5nIGRpcmVrdCwgU2V0IGV0Yy4gbmljaHQgbm9ldGlnLgorICByZXR1cm4gX2FkZF9kZXRhaWxzKGtleXMsIGRlc2NyLCBRdWVyeShQX1JFQURfREVUQUlMUywgRl9WQUxVRSkpOworfQorCisvLyBMZXNiYXJlKHMpIERldGFpbChzKSBlbnRmZXJuZW4KK3ZhcmFyZ3Mgdm9pZCBSZW1vdmVSZWFkRGV0YWlsKHN0cmluZ3xzdHJpbmcqIGtleXMgKQoreworICAvLyBBbGxlIGxvZXNjaGVuIGdlaHQgZGlyZWt0IC4uLgorICBpZiAoIWtleXMgKQorICAgIFNldChQX1JFQURfREVUQUlMUywgKFtdKSwgRl9WQUxVRSk7CisgIGVsc2UKKyAgICAvLyBfcmVtb3ZlX2RldGFpbHMoKSBhZW5kZXJuIGRhcyBNYXBwaW5nIGRpcmVrdCwgU2V0IGV0Yy4gbmljaHQgbm9ldGlnLgorICAgIF9yZW1vdmVfZGV0YWlscyhrZXlzLCBRdWVyeShQX1JFQURfREVUQUlMUywgRl9WQUxVRSkpOworfQorCisvLyBHZXJhZXVzY2goZSkgZGF6dWZ1ZWdlbgordm9pZCBBZGRTb3VuZHMoc3RyaW5nfHN0cmluZyoga2V5cywKKyAgICAgICAgICAgICAgIHN0cmluZ3xzdHJpbmcqfG1hcHBpbmd8Y2xvc3VyZSBkZXNjciApCit7CisgIC8vIF9hZGRfZGV0YWlscygpIGFlbmRlcm4gZGFzIE1hcHBpbmcgZGlyZWt0LCBTZXQgZXRjLiBuaWNodCBub2V0aWcuCisgIHJldHVybiBfYWRkX2RldGFpbHMoa2V5cywgZGVzY3IsIFF1ZXJ5KFBfU09VTkRTLCBGX1ZBTFVFKSk7Cit9CisKKy8vIEdlcmFldXNjaChlKSBlbnRmZXJuZW4KK3ZhcmFyZ3Mgdm9pZCBSZW1vdmVTb3VuZHMoc3RyaW5nfHN0cmluZyoga2V5cyApCit7CisgIC8vIEFsbGUgbG9lc2NoZW4gZ2VodCBkaXJla3QgLi4uCisgIGlmICgha2V5cyApCisgICAgU2V0KFBfU09VTkRTLCAoW10pLCBGX1ZBTFVFKTsKKyAgZWxzZQorICAgIC8vIF9yZW1vdmVfZGV0YWlscygpIGFlbmRlcm4gZGFzIE1hcHBpbmcgZGlyZWt0LCBTZXQgZXRjLiBuaWNodCBub2V0aWcuCisgICAgX3JlbW92ZV9kZXRhaWxzKGtleXMsIFF1ZXJ5KFBfU09VTkRTLCBGX1ZBTFVFKSk7Cit9CisKKy8vIEdlcnUoZSljaChlKSBoaW56dWZ1ZWdlbgordm9pZCBBZGRTbWVsbHMoc3RyaW5nfHN0cmluZyoga2V5cywKKyAgICAgICAgICAgICAgIHN0cmluZ3xzdHJpbmcqfG1hcHBpbmd8Y2xvc3VyZSBkZXNjciApCit7CisgIC8vIF9hZGRfZGV0YWlscygpIGFlbmRlcm4gZGFzIE1hcHBpbmcgZGlyZWt0LCBTZXQgZXRjLiBuaWNodCBub2V0aWcuCisgIHJldHVybiBfYWRkX2RldGFpbHMoa2V5cywgZGVzY3IsIFF1ZXJ5KFBfU01FTExTLCBGX1ZBTFVFKSk7Cit9CisKKy8vIEdlcnUoZSljaChlKSBlbnRmZXJuZW4KK3ZhcmFyZ3Mgdm9pZCBSZW1vdmVTbWVsbHMoc3RyaW5nfHN0cmluZyoga2V5cyApCit7CisgIC8vIEFsbGUgbG9lc2NoZW4gZ2VodCBkaXJla3QgLi4uCisgIGlmICgha2V5cyApCisgICAgU2V0KFBfU01FTExTLCAoW10pLCBGX1ZBTFVFKTsKKyAgZWxzZQorICAgIC8vIF9yZW1vdmVfZGV0YWlscygpIGFlbmRlcm4gZGFzIE1hcHBpbmcgZGlyZWt0LCBTZXQgZXRjLiBuaWNodCBub2V0aWcuCisgICAgX3JlbW92ZV9kZXRhaWxzKGtleXMsIFF1ZXJ5KFBfU01FTExTLCBGX1ZBTFVFKSk7Cit9CisKKy8vIFRhc3RiYXJlKHMpIERldGFpbChzKSBoaW56dWZ1ZWdlbgordm9pZCBBZGRUb3VjaERldGFpbChzdHJpbmd8c3RyaW5nKiBrZXlzLAorICAgICAgICAgICAgICAgICAgICBzdHJpbmd8c3RyaW5nKnxtYXBwaW5nfGNsb3N1cmUgZGVzY3IgKQoreworICAvLyBfYWRkX2RldGFpbHMoKSBhZW5kZXJuIGRhcyBNYXBwaW5nIGRpcmVrdCwgU2V0IGV0Yy4gbmljaHQgbm9ldGlnLgorICByZXR1cm4gX2FkZF9kZXRhaWxzKGtleXMsIGRlc2NyLCBRdWVyeShQX1RPVUNIX0RFVEFJTFMsIEZfVkFMVUUpKTsKK30KKworLy8gVGFzdGJhcmUocykgRGV0YWlsKHMpIGVudGZlcm5lbgordmFyYXJncyB2b2lkIFJlbW92ZVRvdWNoRGV0YWlscyhzdHJpbmd8c3RyaW5nKiBrZXlzICkKK3sKKyAgLy8gQWxsZSBsb2VzY2hlbiBnZWh0IGRpcmVrdCAuLi4KKyAgaWYgKCFrZXlzICkKKyAgICBTZXQoUF9UT1VDSF9ERVRBSUxTLCAoW10pLCBGX1ZBTFVFKTsKKyAgZWxzZQorICAgIC8vIF9yZW1vdmVfZGV0YWlscygpIGFlbmRlcm4gZGFzIE1hcHBpbmcgZGlyZWt0LCBTZXQgZXRjLiBuaWNodCBub2V0aWcuCisgICAgX3JlbW92ZV9kZXRhaWxzKGtleXMsIFF1ZXJ5KFBfVE9VQ0hfREVUQUlMUywgRl9WQUxVRSkpOworfQorCisvLyBEZXRhaWxpbmZvcyBmdWVyIERldGFpbCBrZXksIFNwaWVsZXIgaGF0IGRpZSBSYXNzZSByYWNlCisvLyB1bmQgYmVudXR6dCBzZWluZW4gU2lubiBzZW5zZQordmFyYXJncyBzdHJpbmcgR2V0RGV0YWlsKHN0cmluZyBrZXksIHN0cmluZyByYWNlLCBpbnQgc2Vuc2UpCit7CisgIHN0cmluZ3xzdHJpbmcqfG1hcHBpbmd8Y2xvc3VyZSBkZXRhaWw7CisgIAorICBpZiAoc3RyaW5ncChyYWNlKSkgcmFjZSA9IGxvd2VyX2Nhc2UocmFjZSk7CisgIAorICBzd2l0Y2goc2Vuc2UpCisgIHsKKyAgICBjYXNlIFNFTlNFX1NNRUxMOiBkZXRhaWw9UXVlcnkoUF9TTUVMTFMsIEZfVkFMVUUpW2tleV07CisgICAgICAgICAgICAgICAgICAgICAgc2Vuc2U9RVBfU01FTEw7IGJyZWFrOworICAgIGNhc2UgU0VOU0VfU09VTkQ6IGRldGFpbD1RdWVyeShQX1NPVU5EUywgRl9WQUxVRSlba2V5XTsKKyAgICAgICAgICAgICAgICAgICAgICBzZW5zZT1FUF9TT1VORDsgYnJlYWs7CisgICAgY2FzZSBTRU5TRV9UT1VDSDogZGV0YWlsPVF1ZXJ5KFBfVE9VQ0hfREVUQUlMUywgRl9WQUxVRSlba2V5XTsKKyAgICAgICAgICAgICAgICAgICAgICBzZW5zZT1FUF9UT1VDSDsgYnJlYWs7CisgICAgY2FzZSBTRU5TRV9SRUFEOiAgZGV0YWlsPVF1ZXJ5KFBfUkVBRF9ERVRBSUxTLCBGX1ZBTFVFKVtrZXldOworICAgICAgICAgICAgICAgICAgICAgIHNlbnNlPUVQX1JERVQ7CisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OiAgICAgICAgICBkZXRhaWw9UXVlcnkoUF9ERVRBSUxTLCBGX1ZBTFVFKVtrZXldOworICAgICAgICAgICAgICAgICAgICAgIHNlbnNlPUVQX0RFVEFJTDsgYnJlYWs7CisgIH0KKworICBpZiAoIXN0cmluZ3AoZGV0YWlsKSkKKyAgeworICAgIGlmIChjbG9zdXJlcChkZXRhaWwpKQorICAgICAgZGV0YWlsID0gKHN0cmluZylmdW5jYWxsKGRldGFpbCxrZXkpOworICAgIGVsc2UgaWYgKG1hcHBpbmdwKGRldGFpbCkpCisgICAgICBkZXRhaWwgPSAoc3RyaW5nKShkZXRhaWxbcmFjZV18fGRldGFpbFswXSk7CisgICAgZWxzZSBpZiAocG9pbnRlcnAoZGV0YWlsKSkKKyAgICAgIGRldGFpbCA9IChzdHJpbmcpKGRldGFpbFtyYW5kb20oc2l6ZW9mKGRldGFpbCkpXSk7CisgIH0KKworICAvLyBGUCB2ZXJnZWJlbiAoc28gdm9yaGFuZGVuIDstKSApCisgIGlmIChkZXRhaWwpIEdpdmVFUChzZW5zZSxrZXkpOworCisgIHJldHVybiBkZXRhaWw7Cit9CisKKy8vIFRPRE86IE9CU09MRVQgKExpYmdyZXAgbm90d2VuZGlnKQordm9pZCByZWFkKCBzdHJpbmcgc3RyICkgeworICByYWlzZV9lcnJvcigiRGllc2UgRnVua3Rpb24gZXhpc3RpZXJ0IG5pY2h0IG1laHIuXG4iKTsKK30KKworCisvLyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFp1Z3JpZmZzZnVua3Rpb25lbiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKy8vIERpZW5lbiBkYXp1LCBkaWUgZGlyZWt0ZSBNYW5pcHVsYXRpb24gZGVyIFByb3BzIHZvbiBhdXNzZW4genUgZXJzY2h3ZXJlbi4KKworLy8gRmlsdGVyLCB1bSBTcGVjaWFsZGV0YWlscyB6dSBlbGltaW5pZXJlbgorLy8gZXJzdGVsbHQgYXVzc2VyZGVtIG5lIEtvcGllIHZvbSBNYXBwaW5nLiAoV2ljaHRpZyEpCisvLyBXaXJkIHZvciBhbGxlbSBiZW5vZXRpZ3QsIHVtIFBfREVUQUlMUyBpbiBQX0RFVEFJTFMgdW5kIAorLy8gUF9TUEVDSUFMX0RFVEFJTFMgenUgdHJlZmZlbi4KK3ByaXZhdGUgaW50IF9jbG9zdXJlcyhzdHJpbmcgeCwgbWFwcGluZyBkZXRhaWxzLCBpbnQgeWVzICkgCit7IAorICAgIHJldHVybiB5ZXMgPyBjbG9zdXJlcChkZXRhaWxzW3hdKSA6ICFjbG9zdXJlcChkZXRhaWxzW3hdKTsgCit9CisKK3N0YXRpYyBtYXBwaW5nIF9xdWVyeV9kZXRhaWxzKCkKK3sKKyAgcmV0dXJuIGZpbHRlcl9pbmRpY2VzKFF1ZXJ5KFBfREVUQUlMUywgRl9WQUxVRSksICMnX2Nsb3N1cmVzLAorICAgICAgUXVlcnkoUF9ERVRBSUxTLCBGX1ZBTFVFKSwwKTsKK30KKworc3RhdGljIG1hcHBpbmcgX3F1ZXJ5X3NwZWNpYWxfZGV0YWlscygpCit7CisgIHJldHVybiBmaWx0ZXJfaW5kaWNlcyhRdWVyeShQX0RFVEFJTFMsIEZfVkFMVUUpLCMnX2Nsb3N1cmVzLAorICAgICAgUXVlcnkoUF9ERVRBSUxTLCBGX1ZBTFVFKSwxKTsKK30KKworc3RhdGljIG1hcHBpbmcgX3F1ZXJ5X3JlYWRfZGV0YWlscygpIHsKKyAgcmV0dXJuIGRlZXBfY29weShRdWVyeShQX1JFQURfREVUQUlMUywgRl9WQUxVRSkpOworfQorCitzdGF0aWMgbWFwcGluZyBfcXVlcnlfc291bmRfZGV0YWlscygpIHsKKyAgcmV0dXJuIGRlZXBfY29weShRdWVyeShQX1NPVU5EUywgRl9WQUxVRSkpOworfQorCitzdGF0aWMgbWFwcGluZyBfcXVlcnlfc21lbGxfZGV0YWlscygpIHsKKyAgcmV0dXJuIGRlZXBfY29weShRdWVyeShQX1NNRUxMUywgRl9WQUxVRSkpOworfQorCisKKy8vICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMgS2xhc3Nlbi1NaXRnbGllZHNjaGFmdCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKy8vIEtsYXNzZSBoaW56dWZ1ZWdlbgorcHVibGljIHZvaWQgQWRkQ2xhc3Moc3RyaW5nfHN0cmluZyogc3RyKQoreworICBpZiAoc3RyaW5ncChzdHIpKSAKKyAgICAgIHN0ciA9ICh7IHN0ciB9KTsKKyAgLy8gQWxpYXNlIGF1ZmxvZXNlbiB1bmQgaW1wbGl6aXRlIEtsYXNzZW4gYWRkaWVyZW4uCisgIHN0ciA9IChzdHJpbmcqKUNMQVNTREItPkFkZEltcGxpY2l0Q2xhc3NlcyhzdHIpOworICAvLyBTdW1tZSBtaXQgYWx0ZW4gS2xhc3NlbiBiaWxkZW4gdW5kIERvcHBlbHRlIGVsaW1pbmllcmVuCisgIHN0ciA9IHN0ciArIFF1ZXJ5KFBfQ0xBU1MsIEZfVkFMVUUpOworICBTZXQoIFBfQ0xBU1MsIG1faW5kaWNlcyhta21hcHBpbmcoc3RyKSksIEZfVkFMVUUpOworCisgIHJldHVybjsKK30KKworLy8gS2xhc3NlIGVudGZlcm5lbgordm9pZCBSZW1vdmVDbGFzcyhzdHJpbmd8c3RyaW5nKiBzdHIpCit7CisgaWYgKHN0cmluZ3Aoc3RyKSkgCisgICAgICBzdHIgPSAoeyBzdHIgfSk7CisKKyAgLy8gQWxpYXNlIGF1ZmxvZXNlbiB1bmQgaW1wbGl6aXRlIEtsYXNzZW4gYWRkaWVyZW4uCisgIHN0ciA9IChzdHJpbmcqKUNMQVNTREItPkFkZEltcGxpY2l0Q2xhc3NlcyhzdHIpOworCisgIC8vIFVuZCBhbGxlIC0gaW5rbHVzaXZlIGltcGxpeml0ZXIgS2xhc3NlbiAtIGVudGZlcm5lbgorICAvLyBUT0RPOiBQcnVlZmVuLCBvYiBkaWVzIGRpZSByaWNodGlnZSBFbnRzY2hlaWR1bmcgaXN0LgorICBTZXQoIFBfQ0xBU1MsIFF1ZXJ5KFBfQ0xBU1MsIEZfVkFMVUUpLXN0ciwgRl9WQUxVRSk7CisKKyAgcmV0dXJuOworfQorCisvLyBJc3QgZGFzIE9iamVrdCBNaXRnbGllZCBkZXIgS2xhc3NlIHN0cj8KK2ludCBpc19jbGFzc19tZW1iZXIoc3RyaW5nfHN0cmluZyogc3RyKQoreworICAvLyBLZWluZSBLbGFzc2UsIGtlaW5lIE1pdGdsaWVkc2NoYWZ0IC4uLgorICBpZiAoIXN0ciB8fCBzdHI9PSIiKSAKKyAgICAgIHJldHVybiAwOworCisgIC8vIEVzIHNvbGx0ZSBzY2hvbiBlaW4gQXJyYXkgc2VpbgorICBpZiAoc3RyaW5ncChzdHIpKSAKKyAgICAgIHN0ciA9ICh7IHN0ciB9KTsKKworICAvLyBLbGFzc2VuIHVuZCBJZHMgaW5zIEFycmF5CisgIHN0cmluZyAqY2xhc3Nlcz1RdWVyeVByb3AoUF9DTEFTUyk7CisgIGlmICghcG9pbnRlcnAoY2xhc3NlcykpCisgICAgcmV0dXJuIDA7CisKKyAgLy8gLi4gdW5kIHRlc3RlbgorICBmb3JlYWNoKHN0cmluZyBjbGFzcyA6IHN0cikKKyAgICBpZiAobWVtYmVyKGNsYXNzZXMsY2xhc3MpID4gLTEgKSByZXR1cm4gMTsKKworICByZXR1cm4gMDsKK30KKworLy8gS2xhc3NlIGRpcmVrdCBzZXR6ZW4gYWJmYW5nZW4KK3N0YXRpYyBzdHJpbmcqIF9zZXRfY2xhc3Moc3RyaW5nKiBjbGFzc2VzICkKK3sKKyAgU2V0KCBQX0NMQVNTLCAoe30pLCBGX1ZBTFVFICk7CisgIEFkZENsYXNzKGNsYXNzZXMpOworICByZXR1cm4gUXVlcnlQcm9wKFBfQ0xBU1MpOworfQorCisvLyAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBNYXRlcmlhbC1IYW5kbGluZyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKy8vIE1hdGVyaWFsIHNldHplbgorc3RhdGljIG1hcHBpbmcgX3NldF9tYXRlcmlhbChtYXBwaW5nfHN0cmluZ3xzdHJpbmcqIG1hdCApCit7CisgIG1hcHBpbmcgbWF0cyA9IChbXSk7CisgIAorICBpZiAobWFwcGluZ3AobWF0KSkgCisgIHsKKyAgICBpZiggIXNpemVvZihtYXQpIHx8ICF3aWR0aG9mKG1hdCkgKQorICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiUF9NQVRFUklBTDogZXhwZWN0ZWQgbWFwcGluZyB3aXRoIGF0IGxlYXN0IG9uZSAiCisgICAgICAgICJrZXkgYW5kIG9uZSB2YWx1ZSwgZ290ICUuNTBPXG4iLG1hdCkpOworICAgIGVsc2UgCisgICAgICBtYXRzID0gbWF0OworICB9CisgIGVsc2UgaWYgKHN0cmluZ3AobWF0KSkKKyAgICBtYXRzW21hdF09MTAwOworICBlbHNlCisgIHsKKyAgICBpbnQgc3ogPSBzaXplb2YobWF0KTsKKyAgICAvLyBLb21tdCBkYW5uIHZvciwgd2VubiA8bWF0PiAwIG9kZXIgKHt9KSBpc3QuCisgICAgaWYgKCAhc3ogKQorICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiUF9NQVRFUklBTDogZXhwZWN0ZWQgc3RyaW5nIG9yIG5vbi1lbXB0eSAiCisgICAgICAgICJtYXBwaW5nfHN0cmluZyosIGdvdCAlLjUwTy5cbiIsIG1hdCkpOworICAgIG1hdHMgPSBta21hcHBpbmcobWF0LCBhbGxvY2F0ZShzeiwgMTAwL3N6KSk7CisgIH0gCisgIHJldHVybiBTZXQoIFBfTUFURVJJQUwsIG1hdHMsIEZfVkFMVUUgKTsKK30KKworLy8gV29yYXVzIGJlc3RlaHQgZGFzIE9iamVrdD8KK3N0YXRpYyBtYXBwaW5nIF9xdWVyeV9tYXRlcmlhbCgpCit7CisgIG1peGVkIHJlczsKKyAgCisgIGlmICggIW1hcHBpbmdwKHJlcyA9IFF1ZXJ5KFBfTUFURVJJQUwsIEZfVkFMVUUpKSApCisgICAgcmV0dXJuIChbTUFUX01JU0M6MTAwXSk7CisgIAorICByZXR1cm4gcmVzOworfQorCisvLyBBbnRlaWwgdm9uIG1hdCBhbSBPYmpla3Q/CitpbnQgUXVlcnlNYXRlcmlhbCggc3RyaW5nIG1hdCApCit7CisgIG1hcHBpbmcgbWF0czsKKyAgCisgIGlmICggIW1hcHBpbmdwKG1hdHMgPSBRdWVyeVByb3AoUF9NQVRFUklBTCkpICkKKyAgICByZXR1cm4gMDsKKyAgCisgIHJldHVybiBtYXRzW21hdF07Cit9CisKKy8vIEFudGVpbCBkZXIgR3J1cHBlIGFtIE9iamVrdAoraW50IFF1ZXJ5TWF0ZXJpYWxHcm91cCggc3RyaW5nIG1hdGdyb3VwICkKK3sKKyAgcmV0dXJuIChpbnQpY2FsbF9vdGhlciggTUFURVJJQUxEQiwgIk1hdGVyaWFsR3JvdXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRdWVyeVByb3AoUF9NQVRFUklBTCksIG1hdGdyb3VwICk7Cit9CisKKworc3RyaW5nIE1hdGVyaWFsTGlzdCggaW50IGNhc3VzLCBtaXhlZCBpZGluZiApCit7CisgIHJldHVybiAoc3RyaW5nKWNhbGxfb3RoZXIoIE1BVEVSSUFMREIsICJDb252TWF0ZXJpYWxMaXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVlcnlQcm9wKFBfTUFURVJJQUwpLCBjYXN1cywgaWRpbmYgKTsKK30KKworc3RhdGljIGludCBfc2V0X3NpemUoaW50IHN6KSB7CisvL0dyb2Vzc2UgbXVzcyA+IDAgc2VpbiwgYWxsZXMgYW5kZXJlIGlzdCB1bnNpbm5pZyEgKDAgdW5kIG5lZy4gR3JvZXNzZW4KKy8vaGFiZW4ga2VpbmUgcGh5cy4gUmVsZXZhbnogdW5kIG1hY2hlbiB1LlUuIFByb2JsZW1lIG1pdCBPYmpla3RlbiwgZGllCisvL1NjaGFkZW4gaW4gQWJoYWVuZ2lna2VpdCBkZXIgR3JvZXNzZSBtYWNoZW4pCisgIGlmIChzej4wKQorICAgIFNldChQX1NJWkUsc3osRl9WQUxVRSk7CisgIHJldHVybihRdWVyeShQX1NJWkUsRl9WQUxVRSkpOworfQorCisvLyBQX0NMT05FX1RJTUUKK3N0YXRpYyBpbnQgX3F1ZXJ5X2Nsb25lX3RpbWUoKSB7IHJldHVybiBvYmplY3RfdGltZSgpOyB9CisKZGlmZiAtLWdpdCBhL3N0ZC90aGluZy9lbnZjaGsuYyBiL3N0ZC90aGluZy9lbnZjaGsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmNlMTNiCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3RoaW5nL2VudmNoay5jCkBAIC0wLDAgKzEsMzYgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBlbnZjaGsuYyAtLSB2ZXJoaW5kZXJuLCBkYXNzIG9iamVrdGUgb2huZSBlbnYgaGVydW1mbGllZ2VuCisvLworLy8gJElkOiB0aGluZy5jIDYyODMgMjAwNy0wNS0wOSAyMTozMDozM1ogWmVzc3RyYSAkICAgICAgICAgICAgICAgICAgICAgIAorCisjcHJhZ21hIHN0cmljdF90eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisKKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8dGhpbmcvbW92aW5nLmg+CisKK3Byb3RlY3RlZCB2b2lkIGNoZWNrX2Zvcl9lbnZpcm9ubWVudChzdHJpbmcgY2xvbmVyKQoreworICAvLyBDbG9uZXMsIGRpZSBpbm5lcmhhbGIgdm9uIDEwIFNla3VuZGVuIGtlaW4gRW52aXJvbm1lbnQgaGFiZW4sCisgIC8vIHNvbGxlbiBhdWYgLWRlYnVnIHNjcm9sbGVuLgorICBpZiAoIGNsb25lcCgpICYmICFlbnZpcm9ubWVudCgpICkgeworICAgIC8vIG1hbCBpbiBkZW4gTXVlbGxyYXVtIGJld2VnZW4sIGRhbWl0IGRpZXNlIE9iamVrdGUgendhciBuaWNodCB6ZXJzdG9lcnQKKyAgICAvLyB3ZXJkZW4sIGFiZXIgenVtaW5kZXN0IGhpbnRlcmhlciBub2NoIGVpbmZhY2ggYXVmZmluZGJhciBzaW5kLiAoVW5kCisgICAgLy8gZW50d2VkZXIgcGVyIGhhbmQgb2RlciBhdXRvbWF0aXNjaCBhdWZnZXJhZXVtdCB3ZXJkZW4ga29lbm5lbi4pCisgICAgbW92ZSgiL3Jvb20vbXVlbGxyYXVtIixNX05PQ0hFQ0t8TV9TSUxFTlQpOworICAgIGlmICggIXN0cmluZ3AoY2xvbmVyKSB8fCAhc2l6ZW9mKGNsb25lcikgKQorICAgICAgY2xvbmVyID0gIjxVbmJla2FubnQ+IjsKKyAgICByYWlzZV9lcnJvcigiT2JqZWt0IGhhdCBrZWluIEVudmlyb25tZW50LiBDbG9uZXI6IFsiK2Nsb25lcisiXSAiKTsKKyAgfQorfQorCit2b2lkIGNyZWF0ZSgpCit7CisJaWYoIGNsb25lcCgpICkgCisgICAgY2FsbF9vdXQoIydjaGVja19mb3JfZW52aXJvbm1lbnQsIDMsIG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSk7Cit9CmRpZmYgLS1naXQgYS9zdGQvdGhpbmcvbGFuZ3VhZ2UuYyBiL3N0ZC90aGluZy9sYW5ndWFnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhM2Q2ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvdGhpbmcvbGFuZ3VhZ2UuYwpAQCAtMCwwICsxLDE5OSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHRoaW5nL2xhbmd1YWdlLmMgLS0gbGFuZ3VhZ2UgaGFuZGxpbmcgb2JqZWN0CisvLworLy8gJElkOiBsYW5ndWFnZS5jIDgzNTkgMjAxMy0wMi0wOSAxMTo0MzozOVogWmVzc3RyYSAkCisKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKworI2luY2x1ZGUgPHRoaW5nL2xhbmd1YWdlLmg+CisjaW5jbHVkZSA8dGhpbmcvZGVzY3JpcHRpb24uaD4KKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDx0aGluZy9wcm9wZXJ0aWVzLmg+CisKKy8vIEtlaW4gY3JlYXRlKCkKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgcmV0dXJuOworfQorCisvL0ludmVyc2lvbiwgZGFtaXQgRGVmYXVsdHdlcnQgdm9uIDAgZWluZW4gQXJ0aWtlbCBhdXNnaWJ0CitzdGF0aWMgaW50IF9xdWVyeV9hcnRpY2xlKCkgeyByZXR1cm4gIVF1ZXJ5KFBfQVJUSUNMRSk7IH0KKworc3RhdGljIGludCBfc2V0X2FydGljbGUoaW50IGFydCkgeyByZXR1cm4gIVNldChQX0FSVElDTEUsIWFydCk7IH0KKworLy8gQmVzdGltbXRlbiBBcnRpa2VsIGJlc3RpbW1lbgorcHJpdmF0ZSBzdHJpbmcgcXVlcnlfY19hcnRpY2xlKGludCBjYXN1cykKK3sKKyAgaWYgKFF1ZXJ5UHJvcChQX1BMVVJBTCkpCisgICAgcmV0dXJuICh7ICJkaWUgIiwgImRlciAiLCAiZGVuICIsICJkaWUgIn0pW2Nhc3VzXTsKKworICByZXR1cm4gKHsgKHsgImRhcyAiLCAiZGVzICIsICJkZW0gIiwgImRhcyAiIH0pLAorICAgICAgICAgICAgKHsgImRlciAiLCAiZGVzICIsICJkZW0gIiwgImRlbiAiIH0pLAorICAgICAgICAgICAgKHsgImRpZSAiLCAiZGVyICIsICJkZXIgIiwgImRpZSAiIH0pIH0pCisgICAgWyhpbnQpUXVlcnlQcm9wKFBfR0VOREVSKV1bY2FzdXNdOworfQorCisvLyBFbmRlIGZ1ZXIgQXJ0aWtlbCB1bmQgQWRqZWt0aXZlCitwcml2YXRlIHZhcmFyZ3Mgc3RyaW5nIHF1ZXJ5X2dfc3VmZml4KGludCBnZW4sIGludCBjYXN1cywgaW50IGFuemFobCkKK3sKKyAgcmV0dXJuICh7ICh7ICh7ICIiLCJlIn0pLCAoeyJlcyIsImVyIn0pLCAoeyJlbSIsImVuIn0pLCAoeyAgIiIsImUifSkgfSksCisJICAgICh7ICh7ICIiLCJlIn0pLCAoeyJlcyIsImVyIn0pLCAoeyJlbSIsImVuIn0pLCAoeyJlbiIsImUifSkgfSksCisJICAgICh7ICh7ImUiLCJlIn0pLCAoeyJlciIsImVyIn0pLCAoeyJlciIsImVuIn0pLCAoeyAiZSIsImUifSkgfSkgfSkKKyAgICBbZ2VuXVtjYXN1c11bYW56YWhsXTsKK30KKworLy8gQXJ0aWtlbCB2b3JzY2hsYWdlbjogZ2lidCBlcyBub2NoIG1laHIgT2JqZWt0ZSBpbSBpbnY/Cit2YXJhcmdzIGludCBTdWdnZXN0QXJ0aWNsZShzdHJpbmcgaWQpCit7CisgIG9iamVjdCBvYiwqb2JzOworCisgIC8vIFJhdW0gb2RlciBNYXN0ZXI6IEJlc3RpbW10LgorICBpZiAoIWVudmlyb25tZW50KCkpIHJldHVybiAxOworCisgIC8vIEtlaW5lIGlkPyBEYW5uIHJhdXMKKyAgaWYgKCFpZCkgcmV0dXJuIDE7CisKKyAgLy8gT2JqZWt0IG1pdCBnbGVpY2hlbSBOYW1lbiBpbSBlbnY/IERhbm4gdW5iZXN0aW1tdAorICBmb3IgKCBvYj1maXJzdF9pbnZlbnRvcnkoZW52aXJvbm1lbnQoKSkgOyBvYiA7IG9iPW5leHRfaW52ZW50b3J5KG9iKSApCisgICAgaWYgKCBvYiE9dGhpc19vYmplY3QoKSYmIGlkPT0oc3RyaW5nKW9iLT5RdWVyeVByb3AoUF9OQU1FKSApCisgICAgICByZXR1cm4gMDsKKworICAvLyBzb25zdCBiZXN0aW1tdAorICByZXR1cm4gMTsKK30KKworLy8gQXJ0aWtlbCBiZXN0aW1tZW4KK3ZhcmFyZ3Mgc3RyaW5nIFF1ZXJ5QXJ0aWNsZShpbnQgY2FzdXMsIGludCBkZW0sIGludCBmb3JjZSkKK3sKKyAgLy8gS2VpbiBBcnRpa2VsCisgIGlmICghZm9yY2UgJiYhKFF1ZXJ5UHJvcChQX0FSVElDTEUpKSkgcmV0dXJuICIiOworCisgIC8vIEFydGlrZWxhcnQgYXVzc3VjaGVuCisgIGlmICggZGVtPT0yICkgZGVtID0gU3VnZ2VzdEFydGljbGUoUXVlcnlQcm9wKFBfTkFNRSkpOworCisgIC8vIEJlc3RpbW10ZXIgQXJ0aWtlbAorICBpZiAoZGVtKSByZXR1cm4gcXVlcnlfY19hcnRpY2xlKGNhc3VzKTsKKworICAvLyBVbmJlc3RpbW10ZXIgQXJ0aWtlbAorICBpZiAoUXVlcnlQcm9wKFBfUExVUkFMKSkgcmV0dXJuICIiOworICAKKyAgcmV0dXJuIHNwcmludGYoImVpbiVzICIscXVlcnlfZ19zdWZmaXgoKGludClRdWVyeVByb3AoUF9HRU5ERVIpLGNhc3VzKSk7Cit9CisKKy8vIEJlc2l0emFuemVpZ2VyIGZ1ZXIgT2JqZWt0IGJlc3RpbW1lbgordmFyYXJncyBzdHJpbmcgUXVlcnlPd24oaW50IGNhc3VzKQoreworICByZXR1cm4gc3ByaW50ZigiRGVpbiVzIixxdWVyeV9nX3N1ZmZpeChRdWVyeVByb3AoUF9HRU5ERVIpLGNhc3VzKSk7Cit9CisKKy8vIFBvc3Nlc3NpdnByb25vbWVuIGJlc3RpbW1lbgordmFyYXJncyBzdHJpbmcgUXVlcnlQb3NzUHJvbm91bihtaXhlZCB3aGF0LCBpbnQgY2FzdXMsIGludCBudW1iZXIpCit7CisgIGludCBnZW4yOworCisgIC8vIEdlc2NobGVjaHQgZXJtaXR0ZWxuCisgIGdlbjIgPSAob2JqZWN0cCh3aGF0KT8oaW50KXdoYXQtPlF1ZXJ5UHJvcChQX0dFTkRFUik6KGludCl3aGF0KTsKKworICAvLyBQbHVyYWwgaXN0IHNjaG9lbiBlaW5mYWNoCisgIGlmIChRdWVyeVByb3AoUF9QTFVSQUwpKSByZXR1cm4gImlociIrcXVlcnlfZ19zdWZmaXgoZ2VuMiwgY2FzdXMsIG51bWJlcik7CisKKyAgcmV0dXJuICgoKCgoaW50KVF1ZXJ5UHJvcCggUF9HRU5ERVIgKSk9PUZFTUFMRSApPyAiaWhyIjoic2VpbiIpKworICAgICAgICAgIHF1ZXJ5X2dfc3VmZml4KGdlbjIlMywgY2FzdXMsIG51bWJlcikpOworfQorCisvLyBQcm9ub21lbiBiZXN0aW1tZW4gbmFjaCBLTkcKK3ZhcmFyZ3Mgc3RyaW5nIFF1ZXJ5UHJvbm91bihpbnQgY2FzdXMpCit7CisgIGludCBnZW5kZXI7CisKKyAgLy8gUGx1cmFsIGlzdCBpbW1lciBlaW5mYWNoIC4uLgorICBpZiAoUXVlcnlQcm9wKFBfUExVUkFMKSkgCisgIHsKKyAgICAgaWYgKGNhc3VzPT1XRU0pIHJldHVybiAiaWhuZW4iOworICAgICByZXR1cm4gInNpZSI7CisgIH0KKworICBzd2l0Y2goUXVlcnlQcm9wKFBfR0VOREVSKSkKKyAgeworICAgIGNhc2UgRkVNQUxFOgorICAgICAgaWYgKGNhc3VzPT1XRVNTRU4pIHJldHVybiAiaWhyZXIiOworICAgICAgaWYgKGNhc3VzPT1XRU0pIHJldHVybiAiaWhyIjsKKyAgICAgIHJldHVybiAic2llIjsKKworICAgIGNhc2UgTUFMRToKKyAgICAgIGlmIChjYXN1cz09V0VSKSByZXR1cm4gImVyIjsKKyAgICAgIGlmIChjYXN1cz09V0VTU0VOKSByZXR1cm4gInNlaW5lciI7CisgICAgICBpZiAoY2FzdXM9PVdFTSkgcmV0dXJuICJpaG0iOworICAgICAgcmV0dXJuICJpaG4iOworICB9ICAgIAorICBpZiAoY2FzdXM9PVdFU1NFTikgcmV0dXJuICJzZWluZXIiOworICBpZiAoY2FzdXM9PVdFTSkgcmV0dXJuICJpaG0iOworICByZXR1cm4gImVzIjsgLy9mYWxsLXRocm91Z2gKK30KKworLy8gQW5yZWRlIGZ1ZXIgU3BpZWxlciBiZXN0aW1tZW4KK3ZhcmFyZ3Mgc3RyaW5nIFF1ZXJ5RHUoaW50IGNhc3VzLGludCBnZW5kZXIsaW50IHphaGwpCit7CisgIHJldHVybgorICAgICh7ICh7KHsgICAgImR1IiwgICAiaWhyIn0pLCh7ICAgICJkdSIsICAgImlociJ9KSwoeyAgICAiZHUiLCAgICJpaHIifSl9KSwKKyAgICAgICAoeyh7ImRlaW5lciIsICAiZXVlciJ9KSwoeyJkZWluZXIiLCAgImV1ZXIifSksKHsiZGVpbmVyIiwgICJldWVyIn0pfSksCisgICAgICAgKHsoeyAgICJkaXIiLCAgImV1Y2gifSksKHsgICAiZGlyIiwgICJldWNoIn0pLCh7ICAgImRpciIsICAiZXVjaCJ9KX0pLAorICAgICAgICh7KHsgICJkaWNoIiwgICJldWNoIn0pLCh7ICAiZGljaCIsICAiZXVjaCJ9KSwoeyAgImRpY2giLCAgImV1Y2gifSl9KQorICAgICB9KVtjYXN1c11bZ2VuZGVyXVt6YWhsXTsKK30KKworLy8gV2VsY2hlcyBHZXNjaGxlY2h0IGhhdCBkYXMgT2JqZWt0IGFscyBTdHJpbmc/CitzdHJpbmcgUXVlcnlHZW5kZXJTdHJpbmcoKQoreworICBzd2l0Y2goIChpbnQpUXVlcnlQcm9wKCBQX0dFTkRFUiApKQorICB7CisgICAgY2FzZSBNQUxFOiAgIHJldHVybiAibWFlbm5saWNoIjsKKyAgICBjYXNlIEZFTUFMRTogcmV0dXJuICJ3ZWlibGljaCI7CisgIH0KKyAgcmV0dXJuKCJzYWVjaGxpY2giKTsgLy9mYWxsLXRocm91Z2gKK30KKworLy8gQXJ0aWtlbCBkdXJjaGRla2xpbmllcmVuIG5hY2ggS2FzdXMsIE51bWVydXMsIEdlbnVzIHVuZCBBcnQKKy8vIGRlcyBBcnRpa2VscyAoZGVtb249PWJlc3RpbW10KQordmFyYXJncyBzdHJpbmcgRGVjbEFkaihtaXhlZCBhZGosIGludCBjYXN1cywgaW50IGRlbW9uKQoreworCS8vIFVucmVnZWxtYWVzc2lnZSBBZGpla3RpdmUKKwlpZiggcG9pbnRlcnAoYWRqKSApIHJldHVybiBhZGpbY2FzdXNdKyIgIjsKKworICAvLyBGYWxzY2hlciBUeXA/IFVuZCBUc2NodWVzcyAuLi4KKyAgaWYgKCFzdHJpbmdwKGFkaikpIHJldHVybiAiIjsKKworICAvLyBQbHVyYWwgaXN0IGVpbmZhY2gKKyAgaWYgKFF1ZXJ5UHJvcChQX1BMVVJBTCkpCisgIHsKKyAgICAvLyBCZXN0aW1tdAorICAgIGlmIChkZW1vbikgcmV0dXJuIGFkaisiZW4gIjsKKworICAgIC8vIFVuYmVzdGltbXQKKyAgICByZXR1cm4gYWRqICsgKHsgImUgIiwgImVyICIsICJlbiAiLCAiZSAiIH0pW2Nhc3VzXTsKKyAgfQorICAKKyAgaWYgKCBkZW1vbiApCisgICAgcmV0dXJuIGFkaiArICh7ICh7ICJlICIgLCAiZW4gIiwgImVuICIsICJlICIgIH0pLAorCQkgICAgKHsgImUgIiAsICJlbiAiLCAiZW4gIiwgImVuICIgfSksCisJCSAgICAoeyAiZSAiICwgImVuICIsICJlbiAiLCAiZSAiICB9KSB9KQorICAgICAgWyhpbnQpUXVlcnlQcm9wKCBQX0dFTkRFUiApXVtjYXN1c107CisgIGVsc2UKKyAgICByZXR1cm4gYWRqICsgKHsgKHsgImVzICIsICJlbiAiLCAiZW4gIiwgImVzICIgfSksCisJCSAgICAoeyAiZXIgIiwgImVuICIsICJlbiAiLCAiZW4gIiB9KSwKKwkJICAgICh7ICJlICIgLCAiZW4gIiwgImVuICIsICJlICIgIH0pIH0pCisgICAgICBbKGludClRdWVyeVByb3AoIFBfR0VOREVSICldW2Nhc3VzXTsKK30KKworLy8gUF9HRU5ERVIgc2V0emVuLiBFcyBzaW5kIG51ciAwLDEgdW5kIDIgKE1BTEUsRkVNQUxFLE5FVVRFUikgZXJsYXVidAorc3RhdGljIGludCBfc2V0X2dlbmRlcihpbnQgaSkKK3sKKyAgaWYgKGk+LTEmJmk8MykgcmV0dXJuIFNldChQX0dFTkRFUixpKTsKKyAgcmV0dXJuIFF1ZXJ5KFBfR0VOREVSKTsKK30KZGlmZiAtLWdpdCBhL3N0ZC90aGluZy9saWdodC5jIGIvc3RkL3RoaW5nL2xpZ2h0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY0MTFiNAotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC90aGluZy9saWdodC5jCkBAIC0wLDAgKzEsNjIgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyB0aGluZy9kZXNjcmlwdGlvbi5jIC0tIExpY2h0c3lzdGVta29tcG9uZW50ZW4gZnVlciBTdGFuZGFyZG9iamVrdGUKKy8vCisvLyAkSWQ6IGRlc2NyaXB0aW9uLmMgNzYzNSAyMDEwLTA4LTE5IDIxOjIxOjMwWiBaZXNzdHJhICQKKworI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcyxydHRfY2hlY2tzCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHRoaW5nL2xhbmd1YWdlLmg+CisjaW5jbHVkZSA8aG9vay5oPgorI3VuZGVmIE5FRURfUFJPVE9UWVBFUworCisjaW5jbHVkZSA8dGhpbmcvbGlnaHR0eXBlcy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKworLy8gICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgU3lzdGVtLUZ1bmt0aW9uZW4gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisvLyBPYmpla3QgZXJ6ZXVnZW4KK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgIFNldCggUF9MSUdIVCwgMCApOworICBTZXQoIFBfTElHSFRfVFlQRSwgTFRfTUlTQyk7Cit9CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZV9zdXBlcigpIHsKKyAgc2V0X25leHRfcmVzZXQoLTEpOworfSAgICAgCisKKy8vIExpY2h0c3kgLi4uIHN5cyAuLi4KK3N0YXRpYyBpbnQgX3F1ZXJ5X3RvdGFsX2xpZ2h0KCkgeyByZXR1cm4gUXVlcnlQcm9wKFBfTElHSFQpOyB9CisKK3N0YXRpYyBpbnQgX3NldF9saWdodCggaW50IGxpZ2h0ICkKK3sKKyAgICBvYmplY3QgZW52ID0gdGhpc19vYmplY3QoKTsKKworICAgIC8vIFRPRE86IFRlbXBvcmFlciBMaWNodGxldmVsIGluIGdlZWlnbmV0ZSBXZXJ0ZWZlbnN0ZXIgendpbmdlbi4KKyAgICBpZiAobGlnaHQgPiAxMDApCisgICAgICBsaWdodCA9IDEwMDsKKyAgICBlbHNlIGlmIChsaWdodCA8IC0xMDApCisgICAgICBsaWdodCA9IC0xMDA7CisgICAKKyAgICB3aGlsZSAoIG9iamVjdHAoZW52ID0gZW52aXJvbm1lbnQoZW52KSkgKQorICAgICAgICAvLyBKYS4gTWFuIHJ1ZnQgZGllIF9zZXRfeHh4KCktRnVua3Rpb25lbiBlaWdlbnRsaWNoIG5pY2h0IGRpcmVrdCBhdWYuCisgICAgICAgIC8vIEFiZXIgZGFzIExpY2h0c3lzdGVtIGlzdCBzY2hvbiAqc28qIHJlY2hlbmludGVuc2l2IHVuZCBnZXJhZGUgZGVyCisgICAgICAgIC8vIFBfTEFTVF9DT05URU5UX0NIQU5HRS1DYWNoZSB3aXJkICpzbyogb2Z0IGJlbm9ldGlndCwgZGFzcyBlcyBtaXIKKyAgICAgICAgLy8gZGEgdW0gamVkZXMgYmlzc2NoZW4gUmVjaGVuemVpdCBnZWh0LgorICAgICAgICAvLyBEZXIgWndlY2sgaGVpbGlndCBqYSBiZWthbm50bGljaCBkaWUgTWl0dGVsLiA7LSkKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGlhbWFrCisgICAgICAgIGVudi0+X3NldF9sYXN0X2NvbnRlbnRfY2hhbmdlKCk7CisgICAgCisgICAgcmV0dXJuIFNldCggUF9MSUdIVCwgbGlnaHQsIEZfVkFMVUUpOworfQorCmRpZmYgLS1naXQgYS9zdGQvdGhpbmcvbW92aW5nLmMgYi9zdGQvdGhpbmcvbW92aW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgwYWM0MQotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC90aGluZy9tb3ZpbmcuYwpAQCAtMCwwICsxLDIwMSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHRoaW5nL21vdmluZy5jIC0tIG9iamVjdCBtb3ZpbmcKKy8vCisvLyAkSWQ6IG1vdmluZy5jIDg4OTIgMjAxNC0wOC0wNCAxOTo0ODoyOFogWmVzc3RyYSAkCisKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKworI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPHRoaW5nL3Byb3BlcnRpZXMuaD4KKworLy8gRGFzIE9iamVrdCBiZXdlZ2VuLgorLy8gUnVlY2tnYWJlIDEgaXN0IEVyZm9sZywgPD0wIGlzdCBGZWhsZXIKKworLy8gYSkgUF9OT0RST1AvUF9OT0dFVC1CZWhhbmRsdW5nLgorLy8gYikgenVtIFVlYmVyc2NocmVpYmVuCitwcm90ZWN0ZWQgaW50IFByZXZlbnRNb3ZlKG9iamVjdCBkZXN0LCBvYmplY3Qgb2xkZW52LCBpbnQgbWV0aG9kKSB7CisgIGludCB0bXA7CisgIAorICAvLyBNX05PQ0hFQ0s/IC0+IEJld2VndW5nIGVoIGVybGF1YnQgKHVuZCBSdWVja2dhYmV3ZXJ0IHd1ZXJkZSBpZ25vcmllcnQpCisgIGlmICgobWV0aG9kJk1fTk9DSEVDSykpIHsKKyAgICAvLyBCZWkgTV9OT0NIRUNLIHp3YXIgUHJldmVudCogYXVmcnVmZW4sIGFiZXIgZGFzIFJlc3VsdGF0IGlnbm9yaWVyZW4KKyAgICBpZiAob2xkZW52KSBvbGRlbnYtPlByZXZlbnRMZWF2ZSh0aGlzX29iamVjdCgpLGRlc3QpOworICAgIGRlc3QtPlByZXZlbnRJbnNlcnQodGhpc19vYmplY3QoKSk7CisKKyAgICByZXR1cm4gMDsgLy8gZGFzIHdhcnMsIHJlc3QgaXN0IGVnYWwuCisgIH0KKworICAvLyBQX05PRFJPUCB2ZXJoaW5kZXJ0IHdlZ2dlYmVuCisgIGlmICgobWV0aG9kICYgKE1fUFVUfE1fR0lWRSkpICYmIFF1ZXJ5UHJvcChQX05PRFJPUCkpCisgICAgICByZXR1cm4gTUVfQ0FOVF9CRV9EUk9QUEVEOworCisgIC8vIFBfTk9HRVQgdmVyaGluZGVydCBuZWhtZW4KKyAgaWYgKChtZXRob2QgJiAoTV9HRVR8TV9HSVZFKSkgJiYgUXVlcnlQcm9wKFBfTk9HRVQpKQorICAgICAgcmV0dXJuIE1FX0NBTlRfQkVfVEFLRU47CisKKyAgLy8gR2V3aWNodCBlcm1pdHRlbG4KKyAgaWYgKCAhKHRtcCA9IChpbnQpUXVlcnlQcm9wKFBfVE9UQUxfV0VJR0hUKSkgKQorICAgICAgdG1wID0gKGludClRdWVyeVByb3AoUF9XRUlHSFQpOworICAgICAgICAKKyAgLy8gSXN0IGRhcyBPYmpla3QgbmljaHQgenUgc2Nod2VyPworICBpZiAoICh0bXAgPSAoaW50KWRlc3QtPk1heUFkZFdlaWdodCh0bXApKSA8IDApIHsKKyAgICAgIGlmICggdG1wID09IC0yICkgcmV0dXJuIE1FX1RPT19IRUFWWV9GT1JfRU5WOworICAgICAgcmV0dXJuIE1FX1RPT19IRUFWWTsKKyAgfQorCisgIC8vIElzdCBkYXMgWmllbG9iamVrdCBzY2hvbiB2b2xsPworICBpZiAoICFkZXN0LT5NYXlBZGRPYmplY3QodGhpc19vYmplY3QoKSkgKQorICAgICAgcmV0dXJuIFRPT19NQU5ZX09CSkVDVFM7CisKKyAgLy8gRGFyZiBoaW5hdXNiZXdlZ3Qgd2VyZGVuPworICBpZiAoIG9sZGVudiAmJiBvbGRlbnYtPlByZXZlbnRMZWF2ZSh0aGlzX29iamVjdCgpLCBkZXN0KSApCisgICAgICByZXR1cm4gTUVfQ0FOVF9MRUFWRV9FTlY7CisKKyAgLy8gRGFyZiBoaW5laW5iZXdlZ3Qgd2VyZGVuPworICBpZiAoIGRlc3QtPlByZXZlbnRJbnNlcnQodGhpc19vYmplY3QoKSkgKQorICAgICAgcmV0dXJuIE1FX0NBTlRfQkVfSU5TRVJURUQ7CisKKyAgcmV0dXJuKDApOworfQorCisvLyB6dW0gVWViZXJzY2hyZWliZW4uLi4KK3Byb3RlY3RlZCB2b2lkIE5vdGlmeU1vdmUob2JqZWN0IGRlc3QsIG9iamVjdCBvbGRlbnYsIGludCBtZXRob2QpIHsKK30KKwordmFyYXJncyBpbnQgbW92ZSggb2JqZWN0fHN0cmluZyBkZXN0LCBpbnQgbWV0aG9kICkKK3sKKyAgb2JqZWN0IG9sZGVudjsKKyAgaW50IHRtcDsKKyAgc3RyaW5nIGZuLHZjOworICBtaXhlZCBzZW5zOworCisgIGlmICghb2JqZWN0cChkZXN0KSAmJiAhc3RyaW5ncChkZXN0KSkKKyAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIldyb25nIGFyZ3VtZW50IDEgdG8gbW92ZSgpLiAnZGVzdCcgbXVzdCBiZSBhICIKKyAgICAgICAgICAgICJzdHJpbmcgb3Igb2JqZWN0ISBBcmd1bWVudCB3YXM6ICUuMTAwT1xuIiwKKyAgICAgICAgICAgIGRlc3QpKTsKKworICAvLyBKZXR6aWdlIFVtZ2VidW5nIG1lcmtlbgorICBvbGRlbnYgPSBlbnZpcm9ubWVudCgpOworCisgIC8vIEJld2VndW5nIGluIFBhcmEtV2VsdC1SYWV1bWU/CisgIC8vIHRtcCBpc3QgZGllIFppZWwtUGFyYWxsZWx3ZWx0bnVtbWVyCisgIGlmICghZW52aXJvbm1lbnQoKXx8IWxpdmluZyhlbnZpcm9ubWVudCgpKXx8CisgICAgICAhaW50cCh0bXAgPShpbnQpZW52aXJvbm1lbnQoKS0+UXVlcnkoUF9QQVJBKSkpCisgICAgdG1wPTA7CisgICAgCisgIC8vIFdlbm4gZGFzIE9iamVrdCB2b24gZWluZW0gaW4gZGVyIFBhcmF3ZWx0IGJlZmluZGxpY2hlbiBTcGllbGVyCisgIC8vIG9kZXIgTlBDIGJld2VndCB3aXJkLCBzb2xsdGUgZXMgYXVjaCB3aWVkZXIgaW4gZGVyIFBhcmF3ZWx0IGxhbmRlbi4KKyAgLy8gVW0gUmVjaGVuemVpdCB6dSBzcGFyZW4sIHdpcmQgYW5nZW5vbW1lbiwgZGFzcyBiZWkgQmV3ZWd1bmdlbiBpbgorICAvLyBkYXMgSW52IG9kZXIgRW52IGRlcyBTcGllbGVycyAnZGVzdCcgYWxzIE9iamVrdCB1ZWJlcmdlYmVuIHdpcmQsCisgIC8vIHdvaGluZ2VnZW4gYmVpIEJld2VndW5nZW4gaW4gTmFjaGJhcnJhZXVtZSAoZGllIGVpZ2VudGxpY2ggbnVyCisgIC8vIGludGVyZXNzYW50IHNpbmQpICdkZXN0JyBhbHMgRmlsZW5hbWUgYW5nZWdlYmVuIHdpcmQuCisgIGlmICh0bXAmJiFvYmplY3RwKGRlc3QpJiYhZW52aXJvbm1lbnQoZGVzdCkpIHsKKyAgICAgIC8vIEZhbGxzIGRlciBaaWVscmF1bSBuaWNodCBzY2hvbiBleHBsaXppdCBpbiBkZXIgUGFyYWxsZWx3ZWx0IGlzdCwKKyAgICAgIC8vIG5ldWVuIFppZWxyYXVtIHN1Y2hlbi4gQWJlciBudXIsIHdlbm4gZGFzIFppZWwga2VpbiBDbG9uZSBpc3QuIFNvbnN0CisgICAgICAvLyBidWdndCwgd2VubiBtYW4gdmVyc3VjaHQsIG5hY2ggcmF1bSM0Ml5wYXJhIHp1IGJld2VnZW4uCisgICAgICBpZiAoIUlTX1BBUkEoZGVzdCkgJiYgc3RycnN0cihkZXN0LCIjIik9PS0xKSB7CisgICAgICAgIGZuPWRlc3QrIl4iK3RtcDsKKworICAgICAgICAvLyBEZXIgUGFyYXdlbHQtUmF1bSB3aXJkIG51ciB6dW0gWmllbCwgd2VubiBlciBhKSBleGlzdGllcnQKKyAgICAgICAgLy8gdW5kIGIpIGF1Y2ggdm9uIFNwaWVsZXJuIGJldHJldGVuIHdlcmRlbiBkYXJmLiBMZXR6dGVyZXMKKyAgICAgICAgLy8gS3JpdGVyaXVtIGthbm4gbnVyIG1pdCBpbSBPYmpla3QgZ2VzZXR6dGVyIFByb3BlcnR5CisgICAgICAgIC8vIFBfVEVTVFBMQVlFUiB1bWdhbmdlbiB3ZXJkZW4uCisgICAgICAgICAgaWYgKCAoZmluZF9vYmplY3QoZm4pIHx8ICgoZmlsZV9zaXplKGZuKyIuYyIpPjB8fAorICAgICAgICAgICAgICAgICAgKGZpbGVfc2l6ZSh2Yz1pbXBsb2RlKGV4cGxvZGUoZm4sIi8iKVswLi48Ml0sIi8iKSsKKyAgICAgICAgICAgICAgICAgICIvdmlydHVhbF9jb21waWxlci5jIik+MCAmJgorICAgICAgICAgICAgICAgICAgIWNhdGNoKHRtcD0oaW50KWNhbGxfb3RoZXIodmMsIlF1ZXJ5VmFsaWRPYmplY3QiLGZuKTsKKyAgICAgICAgICAgICAgICAgICAgcHVibGlzaCkgJiYgdG1wPjApKSAmJgorICAgICAgICAgICAgICAgICAgIWNhdGNoKGxvYWRfb2JqZWN0KCBmbiApO3B1Ymxpc2gpKSkgJiYKKyAgICAgICAgICAgICAgKCFmbi0+UXVlcnlQcm9wKFBfTk9fUExBWUVSUykgfHwgUXVlcnlQcm9wKFBfVEVTVFBMQVlFUikpICkKKyAgICAgICAgICAgZGVzdCA9IGZuOworICAgICAgfQorICB9CisgICAgCisgIC8vIGRlc3QgYXVmIE9iamVrdCBub3JtaWVyZW4uCisgIGlmIChzdHJpbmdwKGRlc3QpKQorICAgICAgZGVzdCA9IGxvYWRfb2JqZWN0KGRlc3QpOworICAgIAorICAvLyB0ZXN0ZW4sIG9iIGRhcyBPYmpla3QgYmV3ZWd0IHdlcmRlbiB3aWxsCisgIGlmICh0bXA9UHJldmVudE1vdmUoZGVzdCwgb2xkZW52LCBtZXRob2QpKSB7CisgICAgICAvLyBhdWYgZ3VlbHRpZ2VuIEZlaGxlciBwcnVlZmVuLCB3ZXIgd2Vpc3MsIHdhcyBNYWdpZXIgZGEgZXZ0bC4KKyAgICAgIC8vIHZlcnNlaGVudGxpY2hlIHp1cnVlY2tnZWJlbi4KKyAgICAgIGlmIChWQUxJRF9NT1ZFX0VSUk9SKHRtcCkpCisgICAgICAgIHJldHVybih0bXApOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4oTUVfRE9OVF9XQU5UX1RPX0JFX01PVkVEKTsKKyAgfQorCisgIC8vIFNlbnNpdGl2ZSBPYmpla3RlIG11ZXNzZW4gZW50ZmVybnQgd2VyZGVuCisgIHNlbnMgPSBRdWVyeVByb3AoUF9TRU5TSVRJVkUpOworCisgIGlmIChzZW5zICYmIGVudmlyb25tZW50KCkpCisgIHsKKyAgICBlbnZpcm9ubWVudCgpLT5SZW1vdmVTZW5zaXRpdmVPYmplY3QoIHRoaXNfb2JqZWN0KCkgKTsKKyAgICBpZiAoIW9iamVjdHAoTUUpKQorICAgICAgcmV0dXJuIE1FX1dBU19ERVNUUlVDVEVEOworICB9CisgIC8vIEJld2VnZW4KKyAgbW92ZV9vYmplY3QoTUUsIGRlc3QpOworCisgIC8vZmFsbHMgKHNpY2gpIGRhcyBvYmpla3QgaW0gaW5pdCgpIHplcnN0b2VydCAod3VyZGUpLiAoRGllIHUuIHN0ZWhlbmRlbgorICAvL0Z1bmt0aW9uc2F1ZnJ1ZmUgd2VyZGVuIGRhbm4gdm9tIERyaXZlciBlaCBncm9lc3N0ZW50ZWlscyBpZ25vcmllcnQuKQorICBpZiAoIW9iamVjdHAodGhpc19vYmplY3QoKSkpIHJldHVybihNRV9XQVNfREVTVFJVQ1RFRCk7CisKKyAgLy8gT2JqZWt0IGluZm9ybWllcmVuLiA7LSkKKyAgTm90aWZ5TW92ZShlbnZpcm9ubWVudCgpLCBvbGRlbnYsIG1ldGhvZCk7CisKKyAgLy8gQWx0ZSBVbWdlYnVuZyBpbmZvcm1pZXJlbgorICBpZiAob2xkZW52KSBvbGRlbnYtPk5vdGlmeUxlYXZlKHRoaXNfb2JqZWN0KCksIGRlc3QpOworCisgIC8vIFdlbm4gZGFzIE9iamVrdCBlaW5lIFVtZ2VidW5nIGhhdCwgc2VsYmlnZSBpbmZvcm1pZXJlbgorICBpZiAoZW52aXJvbm1lbnQoKSkgeworICAgIGlmIChzZW5zKQorICAgIHsKKyAgICAgIGVudmlyb25tZW50KCktPkluc2VydFNlbnNpdGl2ZU9iamVjdCh0aGlzX29iamVjdCgpLHNlbnMpOworICAgICAgaWYgKCFvYmplY3RwKE1FKSkgcmV0dXJuIE1FX1dBU19ERVNUUlVDVEVEOworICAgIH0KKyAgICBlbnZpcm9ubWVudCgpLT5Ob3RpZnlJbnNlcnQodGhpc19vYmplY3QoKSwgb2xkZW52KTsKKyAgfQorICAvL3d1cmRlIGRhcyBPYmpla3QgdmllbGxlaWNodCBub2NoIHplcnN0b2VydD8KKyAgaWYgKCFvYmplY3RwKE1FKSkgcmV0dXJuKE1FX1dBU19ERVNUUlVDVEVEKTsKKyAgCisgIC8vc2NoZWludCB3b2hsIGFsbGVzIG9rIHp1IHNlaW4uCisgIHJldHVybiBNT1ZFX09LOworfQorCisvLyBEYXMgT2JqZWt0IHplcnN0b2VyZW4KK3ZhcmFyZ3MgaW50IHJlbW92ZShpbnQgc2lsZW50KQoreyAKKyAgICBpZiAoZW52aXJvbm1lbnQoKSApIHsKKyAgICAgICAgaWYoUXVlcnlQcm9wKFBfU0VOU0lUSVZFKSkKKyAgICAgICAgICAgICAgICBlbnZpcm9ubWVudCgpLT5SZW1vdmVTZW5zaXRpdmVPYmplY3QodGhpc19vYmplY3QoKSk7CisgICAgICAgIGVudmlyb25tZW50KCktPk5vdGlmeVJlbW92ZSh0aGlzX29iamVjdCgpKTsKKyAgICB9CisgICAgaWYgKG9iamVjdHAodGhpc19vYmplY3QoKSkpCisgICAgICAgIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOworICAgIHJldHVybiAxOworfQorCitwdWJsaWMgc3RyaW5nIE5vdGlmeURlc3RydWN0KG9iamVjdCBjYWxsZXIpIHsKKyAgLy8gTGljaHRzeXN0ZW0gbWl0IGRlciBhZW5kZXJ1bmcgdmVyc29yZ2VuLiA6LS8KKyAgZm9yZWFjaChvYmplY3QgZW52IDogYWxsX2Vudmlyb25tZW50KCkgfHwgKHt9KSkgeworICAgICAgLy8gSmEuIE1hbiBydWZ0IGRpZSBfc2V0X3h4eCgpLUZ1bmt0aW9uZW4gZWlnZW50bGljaCBuaWNodCBkaXJla3QgYXVmLgorICAgICAgLy8gQWJlciBkYXMgTGljaHRzeXN0ZW0gaXN0IHNjaG9uICpzbyogcmVjaGVuaW50ZW5zaXYgdW5kIGdlcmFkZSBkZXIKKyAgICAgIC8vIFBfTEFTVF9DT05URU5UX0NIQU5HRS1DYWNoZSB3aXJkICpzbyogb2Z0IGJlbm9ldGlndCwgZGFzcyBlcyBtaXIKKyAgICAgIC8vIGRhIHVtIGplZGVzIGJpc3NjaGVuIFJlY2hlbnplaXQgZ2VodC4KKyAgICAgIC8vIERlciBad2VjayBoZWlsaWd0IGphIGJla2FubnRsaWNoIGRpZSBNaXR0ZWwuIDstKQorICAgICAgLy8KKyAgICAgIC8vIFRpYW1haworICAgICAgZW52LT5fc2V0X2xhc3RfY29udGVudF9jaGFuZ2UoKTsKKyAgfQorICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvc3RkL3RoaW5nL3Byb3BlcnRpZXMuYyBiL3N0ZC90aGluZy9wcm9wZXJ0aWVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY1OTJiZgotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC90aGluZy9wcm9wZXJ0aWVzLmMKQEAgLTAsMCArMSwzMjYgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyB0aGluZy9wcm9wZXJ0aWVzLmMgLS0gbW9zdCBnZW5lcmFsIGNsYXNzIChwcm9wZXJ0eSBoYW5kbGluZykKKy8vCisvLyAkSWQ6IHByb3BlcnRpZXMuYyA2OTUxIDIwMDgtMDgtMDkgMjM6MDg6MzFaIFplc3N0cmEgJAorCisvLyBQcm9wZXJ0aWVzLmMgLS0gUHJvcGVydHl2ZXJ3YWx0dW5nCisvLyAoYykgMTk5MyBIYXRlQE1vcmdlbkdyYXVlbiwgTWF0ZWVzZUBOaWdodEZhbGwKKy8vICAgICAgICAgIElkZWEgYW5kIENvZGUgICAgICBGbGFtZXMgYW5kIERlc3RydWN0aW9ucworLy8gLT4gKmdyaW4qIHRoYXRzIHRoZSBwb2ludCBhY3R1YWxseSA6KSAKKy8vCisvLyBVZWJlcmFyYmVpdGV0IHZvbiBKb2YgICAgICAgYW0gMTIuMDYuMTk5NAorLy8gVWViZXJhcmJlaXRldCB2b24gTWFuZHJhZ29uIGFtIDExLjA1LjIwMDMKKworI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworCisjaW5jbHVkZSAiL3N5cy90aGluZy9wcm9wZXJ0aWVzLmgiCisjaW5jbHVkZSAiL3NlY3VyZS93aXpsZXZlbHMuaCIKKworCisvLyB0aGUgbWFwcGluZyB3aGVyZSB0aGUgYWN0dWFsIHByb3BlcnRpZXMgYXJlIHN0b3JlZC4gRGlyZWN0IGluaXRpYWxpemF0aW9uLgorcHJpdmF0ZSBub3NhdmUgbWFwcGluZyAqcHJvcCA9ICh7IChbXSksIChbXSksIChbXSksIChbXSkgfSk7CisKKy8vIHRoZSBtYXBwaW5nIHRoYXQgaXMgdXNlZCBmb3Igc2F2aW5nCitwcml2YXRlIG1hcHBpbmcgcHJvcGVydGllczsKKworLy8gc2VjdXJpdHktZmxhZworcHJpdmF0ZSBub3NhdmUgaW50IGNsb3N1cmVfY2FsbDsKKworLy8gSW5pdGlhbGlzaWVydW5nIGRlciBQcm9wcy4gS2FubiBsZWlkZXIgbW9tZW50YW4gbmljaHQgcHJpdmF0ZSBzZWluLCB3ZWlsCisvLyBQYWRyZWljIHNvbiBrb21pc2NoZXMgT2JqZWt0IGhhdCwgd2FzIGRpZSBGdW5rdGlvbiBoaWVyIHJ1ZnQuCisvLyBUT0RPOiBpcmdlbmR3YW5uIG1hbCBwcml2YXRlIG1hY2hlbi4KKy8vIFRPRE86IERhIHByb3BzIGpldHp0IGVpbmZhY2ggYmVpIGRlciBEZWtsYXJhdGlvbiBpbml0bGlzaWVydCB3aXJkLAorLy8gZXJ1ZWJyaWd0IHNpY2ggZGllc2UgRnVua3Rpb24gZWlnZW50bGljaC4gQmlzIGF1ZiBQYWRyZWljcyBPYmpla3QuLi4KK3Byb3RlY3RlZCB2b2lkIEluaXRpYWxpemVQcm9wZXJ0aWVzKCkgeworICBwcm9wID0gKHsgKFtdKSwgKFtdKSwgKFtdKSwgKFtdKSB9KTsKKyAgcmV0dXJuOworfQorCisvLyBQcm9wcyBudXIgZGFubiBpbml0aWFsaXNpZXJlbiwgd2VubiBzaWUgZXMgbm9jaCBuaWNodCBzaW5kCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSB7CisgIC8vIEJsdWVwcmludHMgaW4gL3N0ZCBiZW5vZXRpZ2Vua2VpbmVuIFJlc2V0IC4uLi4KKyAgaWYgKG9iamVjdF9uYW1lKCk9PSIvc3RkL3RoaW5nL3Byb3BlcnRpZXMiKQorICAgIHNldF9uZXh0X3Jlc2V0KC0xKTsKK30KKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlX3N1cGVyKCkgeworICBzZXRfbmV4dF9yZXNldCgtMSk7Cit9CisKKy8vIFdlbGNoZSBleHRlcm5lbiBPYmpla3RlIGR1ZXJmZW4genVncmVpZmVuPworbm9tYXNrIHByaXZhdGUgaW50IGFsbG93ZWQoKQoreworICAgIGlmICggKHByZXZpb3VzX29iamVjdCgpICYmIElTX0FSQ0goZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKSkgJiYKKyAgICAgICAgICB0aGlzX2ludGVyYWN0aXZlKCkgJiYgSVNfQVJDSCh0aGlzX2ludGVyYWN0aXZlKCkpKSB8fAorICAgICAgICAgKHByZXZpb3VzX29iamVjdCgpICYmIGdldHVpZChwcmV2aW91c19vYmplY3QoKSkgPT0gUk9PVElEICYmCisgICAgICAgICAgZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSkgPT0gUk9PVElEKSApCisgICAgICAgIHJldHVybiAxOworICAgIHJldHVybiAwOworfQorCisKKy8vIFNldCgpIC0tIHByb3ZpZGVzIGRpcmVjdCBhY2Nlc3MgdG8gYSBwcm9wZXJ0eSwgbm8gZmlsdGVycworcHVibGljIHZhcmFyZ3MgbWl4ZWQgU2V0KCBzdHJpbmcgbmFtZSwgbWl4ZWQgVmFsdWUsIGludCBUeXBlLCBpbnQgZXh0ZXJuICkKK3sKKworICBpZiAoIW9iamVjdHAodGhpc19vYmplY3QoKSkpCisgICAgcmV0dXJuIDA7CisKKyAgLy8gUHJvcGVydGllcywgZGllIFNFQ1VSRUQgb2RlciBQUk9URUNURUQgc2luZCwgZHVlcmZlbiBudXIgdm9tIE9iamVrdAorICAvLyBzZWxiZXIsIEVNKyBvZGVyIFJPT1QgdmVyYWVuZGVydCB3ZXJkZW4KKyAgaWYgKChwcm9wW0ZfTU9ERV1bbmFtZV0mKFBST1RFQ1RFRHxTRUNVUkVEKSkmJgorICAgICAgKGNsb3N1cmVfY2FsbHx8ZXh0ZXJufHxleHRlcm5fY2FsbCgpKSAmJgorICAgICAgIHByZXZpb3VzX29iamVjdCgpICE9IHRoaXNfb2JqZWN0KCkgJiYgIWFsbG93ZWQoKSkKKyAgICByZXR1cm4gLTE7CisgIAorICAvLyBEYXMgU0VDVVJFRC1GbGFnIGRhcmYgYmVpIFByb3BlcnRpZXMgbmljaHQgbWVociBnZWxvZXNjaHQgd2VyZGVuCisgIGlmICgocHJvcFtGX01PREVdW25hbWVdJlNFQ1VSRUQpJiYKKyAgICAgIChUeXBlPT1GX01PREV8fFR5cGU9PUZfTU9ERV9BRCkmJihWYWx1ZSAmIFNFQ1VSRUQpKQorICAgIHJldHVybiAtMjsKKyAgCisgIC8vIFNldHplbiBkdWVyZmVuIGRhcyBTRUNVUkVELUZsYWcgbnVyIGRhcyBPYmpla3Qgc2VsYmVyLCBFTSsgb2RlciBST09UCisgIGlmICgoVHlwZT09Rl9NT0RFfHxUeXBlPT1GX01PREVfQVMpJiYoVmFsdWUmU0VDVVJFRCkmJgorICAgICAgKGNsb3N1cmVfY2FsbCB8fGV4dGVybiB8fCBleHRlcm5fY2FsbCgpKSAmJgorICAgICAgIHByZXZpb3VzX29iamVjdCgpICE9IHRoaXNfb2JqZWN0KCkgJiYgIWFsbG93ZWQoKSApCisgICAgcmV0dXJuIC0zOworCisgIHN3aXRjaChUeXBlKQorICB7CisgICAgLy8gSmUgbmFjaCBNb2R1cyBGbGFncyB2ZXJhZW5kZXJuCisgICAgY2FzZSBGX01PREVfQVM6ICBwcm9wW0ZfTU9ERV1bbmFtZV18PSBWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9wW0ZfTU9ERV1bbmFtZV07CisgICAgY2FzZSBGX01PREVfQUQ6ICBwcm9wW0ZfTU9ERV1bbmFtZV0mPSB+VmFsdWU7CisgICAgICAgICAgICAgICAgICAgICBpZiAoIXByb3BbRl9NT0RFXVtuYW1lXSkgcHJvcFtGX01PREVdLT0oW25hbWVdKTsKKyAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9wW0ZfTU9ERV1bbmFtZV07CisgICAgY2FzZSBGX01PREU6ICAgICBwcm9wW0ZfTU9ERV1bbmFtZV1ePSBWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgIGlmICghcHJvcFtGX01PREVdW25hbWVdKSBwcm9wW0ZfTU9ERV0tPShbbmFtZV0pOworICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3BbRl9NT0RFXVtuYW1lXTsKKyAgICBjYXNlIEZfU0VUX01FVEhPRDoKKyAgICAgIC8vIC0xIGFscyBTZXR6LU1ldGhvZGU6IE5vc2V0bWV0aG9kIHNldHplbgorICAgICAgaWYgKFZhbHVlID09IC0xKQorICAgICAgeworICAgICAgICBwcm9wW0ZfU0VUX01FVEhPRF0tPShbbmFtZV0pOworICAgICAgICBwcm9wW0ZfTU9ERV1bbmFtZV0gfD0gTk9TRVRNRVRIT0Q7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgLy8gS2VpbiBicmVhayEKKyAgICBjYXNlIEZfUVVFUllfTUVUSE9EOgorICAgICAgLy8gVW5nZWJ1bmRlbmUgTGFtYmRhX0Nsb3N1cmU/IEJpbmRlbiEKKyAgICAgIGlmIChjbG9zdXJlcChWYWx1ZSkmJiFxdWVyeV9jbG9zdXJlX29iamVjdChWYWx1ZSkpCisgICAgICB7CisgICAgICAgIGlmIChleHRlcm5fY2FsbCgpICYmCisgICAgICAgICAgICAgKGdldHVpZChwcmV2aW91c19vYmplY3QoKSkgIT0gZ2V0dWlkKCl8fAorICAgICAgICAgICAgICBnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSAhPSBnZXRldWlkKCkpKQorICAgICAgICAgIHJldHVybiBwcm9wW1R5cGVdW25hbWVdOworICAgICAgICAKKyAgICAgICAgVmFsdWUgPSBiaW5kX2xhbWJkYSggVmFsdWUsdGhpc19vYmplY3QoKSk7CisgICAgICB9CisgICAgICAvLyBLZWluIGJyZWFrIQorICAgIGRlZmF1bHQ6CisgICAgICBpZiAoIVZhbHVlKSBwcm9wW1R5cGVdLT0oW25hbWVdKTsKKyAgICAgIGVsc2UgcHJvcFtUeXBlXVtuYW1lXSA9IFZhbHVlOworICB9CisKKyAgLy8gR2VzYW10d2VydCB6dXJ1ZWNrZ2ViZW4KKyAgcmV0dXJuIHByb3BbVHlwZV1bbmFtZV07Cit9CisKKworLy8gRGlyZWt0ZXMgQXVzbGVzZW4gZGVyIFByb3BlcnR5IG9obmUgRmlsdGVyIC4uLgorcHVibGljIHZhcmFyZ3MgbWl4ZWQgUXVlcnkoIHN0cmluZyBuYW1lLCBpbnQgVHlwZSApCit7CisgICAgaWYgKHBvaW50ZXJwKHByb3ApKSByZXR1cm4gcHJvcFtUeXBlXVtuYW1lXTsKKyAgICByZXR1cm4gMDsKK30KKworLy8gUHJvcGVydHkgc2V0emVuIHVudGVyIFZlcndlbmR1bmcgZXZ0bC4gdm9yaGFuZGVuZXIgWnVncmlmZnNmdW5rdGlvbmVuCitwdWJsaWMgbWl4ZWQgU2V0UHJvcCggc3RyaW5nIG5hbWUsIG1peGVkIFZhbHVlICkKK3sKKyAgY2xvc3VyZSBmdW5jOworICBtaXhlZCByZXN1bHQ7CisgICAKKyAgLy8gbnVyIGZ1ZXIgaGV1dGUKKyAgaWYgKCFvYmplY3RwKHRoaXNfb2JqZWN0KCkpKQorICAgIHJldHVybiAwOworCisgIC8vIE5PU0VUTUVUSE9EOiBEYXJmIG5pY2h0IGdlc2V0enQgd2VyZGVuCisgIGlmIChwcm9wW0ZfTU9ERV1bbmFtZV0gJiBOT1NFVE1FVEhPRCApIHJldHVybiAtMTsKKworICAvLyBTZXQtTWV0aG9kIGFiZnJhZ2VuLCBzbyB2b3JoYW5kZW4KKyAgaWYgKGZ1bmM9cHJvcFtGX1NFVF9NRVRIT0RdW25hbWVdKQorICB7CisgICAgaW50IGZsYWc7CisKKyAgICAvLyBXZXJ0IGFscyBTZXQtTWV0aG9kPyBnbGVpY2ggenVydWVja2dlYmVuCisgICAgaWYgKCFjbG9zdXJlcChmdW5jKSkgcmV0dXJuIGZ1bmM7CisKKyAgICAvLyBBbiBkaWVzZXIgU3RlbGxlIG11c3MgZnVuYyBlaW5lIENsb3N1cmUgc2Vpbi4gRGEgU2V0KCkgdW5nZWJ1bmRlbmUKKyAgICAvLyBMYW1iZGFzIGJpbmRldCwga2FubiBlcyBhdWNoIG51ciBlaW5lIGdlYnVuZGVuZSBDbG9zdXJlIHNlaW4gdW5kIGRhcworICAgIC8vIE9iamVrdCBleGlzdGllcnQgYXVjaCBub2NoIChzb25zdCB3YWVyZSBmdW5jID09IDApLgorCisgICAgLy8gY2xvc3VyZV9jYWxsIHNldHplbiwgZmFsbHMgbm9jaCBuaWNodCBnZXNldHp0CisgICAgaWYgKChmbGFnPWNsb3N1cmVfY2FsbDx0aW1lKCkpKQorICAgICAgY2xvc3VyZV9jYWxsID0gdGltZSgpKzU5OworCisgICAgLy8gRGFubiBtYWwgZGllIENsb3N1cmUgYXVmcnVmZW4uIEJlaSBGZWhsZXIgc2VsYmlnZSBsb2VzY2hlbgorICAgIGlmIChjYXRjaChyZXN1bHQ9ZnVuY2FsbChmdW5jLCBWYWx1ZSwgbmFtZSk7cHVibGlzaCkpCisgICAgeworICAgICAgcHJvcFtGX1NFVF9NRVRIT0RdLT0oW25hbWVdKTsKKyAgICB9CisgICAgICAKKyAgICAvLyBXZW5uIGNsb3N1cmVfY2FsbCBnZXNldHp0IHd1cmRlLCB3aWVkZXIgbG9lc2NoZW4KKyAgICBpZiAoZmxhZykgY2xvc3VyZV9jYWxsID0gMDsKKworICAgIC8vIFVuZCB6dXJ1ZWNrZ2ViZW4KKyAgICByZXR1cm4gcmVzdWx0OyAKKyAgfQorCisgIC8vIF9zZXRfKi1NZXRob2RlIHZvcmhhbmRlbj8gZmFsbHMgamEsIGF1ZnJ1ZmVuLmkKKyAgLy8gVE9ETzogQ2xvc3VyZWNhY2hlIGVpbmZ1ZWhyZW4gdW5kIEZ1bmt0aW9uYXVmcnVmIG51ciBub2NoIG1hY2hlbiwgd2VubiBlcworICAvLyBkaWUgX3NldF8qIGF1Y2ggZ2lidD8KKyAgaWYgKGNhbGxfcmVzb2x2ZWQoJnJlc3VsdCx0aGlzX29iamVjdCgpLCJfc2V0XyIrbmFtZSxWYWx1ZSApKQorICAgICAgICByZXR1cm4gcmVzdWx0OworCisgIC8vIExldHp0ZSBNb2VnbGljaGtlaXQ6IE11c3MgZWluZSAnbm9ybWFsZScgUHJvcGVydHkgc2VpbgorICByZXR1cm4gU2V0KCBuYW1lLCBWYWx1ZSwgRl9WQUxVRSwgZXh0ZXJuX2NhbGwoKSApOworfQorCisKKy8vIFByb3BlcnR5IGF1c2xlc2VuIHVudGVyIFZlcndlbmR1bmcgZXZ0bC4gdm9yaGFuZGVuZXIgWnVncmlmZnNmdW5rdGlvbmVuCitwdWJsaWMgbWl4ZWQgUXVlcnlQcm9wKCBzdHJpbmcgbmFtZSApCit7CisgIGNsb3N1cmUgZnVuYzsKKyAgbWl4ZWQgcmVzdWx0OworIAorICAvLyBudXIgZnVlciBoZXV0ZQorICBpZiAoIW9iamVjdHAodGhpc19vYmplY3QoKSkpCisgICAgcmV0dXJuOworCisgIC8vIFF1ZXJ5LU1ldGhvZGUgdm9yaGFuZGVuPworICBpZiAoIGZ1bmMgPSBwcm9wW0ZfUVVFUllfTUVUSE9EXVtuYW1lXSApCisgIHsKKyAgICBpbnQgZmxhZzsKKworICAgIC8vIFdlcnQgYWxzIFF1ZXJ5LU1ldGhvZD8gR2xlaWNoIHp1cnVlY2tnZWJlbiAuLi4KKyAgICBpZiAoIWNsb3N1cmVwKGZ1bmMpKSByZXR1cm4gZnVuYzsKKyAKKyAgICAvLyBBbiBkaWVzZXIgU3RlbGxlIG11c3MgZnVuYyBlaW5lIENsb3N1cmUgc2Vpbi4gRGEgU2V0KCkgdW5nZWJ1bmRlbmUKKyAgICAvLyBMYW1iZGFzIGJpbmRldCwga2FubiBlcyBhdWNoIG51ciBlaW5lIGdlYnVuZGVuZSBDbG9zdXJlIHNlaW4gdW5kIGRhcworICAgIC8vIE9iamVrdCBleGlzdGllcnQgYXVjaCBub2NoIChzb25zdCB3YWVyZSBmdW5jID09IDApLgorICAgCisgICAgLy8gY2xvc3VyZV9jYWxsIHNldHplbiwgZmFsbHMgbm9jaCBuaWNodCBnZXNldHp0CisgICAgaWYgKChmbGFnPWNsb3N1cmVfY2FsbDx0aW1lKCkpKQorICAgICAgY2xvc3VyZV9jYWxsID0gdGltZSgpKzU5OworICAgIAorICAgIC8vIERhbm4gTWFsIGRpZSBDbG9zdXJlIGF1ZnJ1ZmVuLiBCZWkgRmVobGVyIHNlbGJpZ2UgbG9lc2NoZW4KKyAgICBpZiAoY2F0Y2gocmVzdWx0PWZ1bmNhbGwoZnVuYyk7cHVibGlzaCkpCisgICAgeworICAgICAgcHJvcFtGX1FVRVJZX01FVEhPRF0tPShbbmFtZV0pOworICAgIH0KKyAgICAvLyBXZW5uIGNsb3N1cmVfY2FsbCBnZXNldHp0IHd1cmRlLCB3aWVkZXIgbG9lc2NoZW4gICAgCisgICAgaWYgKGZsYWcpIGNsb3N1cmVfY2FsbCA9IDA7CisgICAgCisgICAgLy8gVW5kIHp1cnVlY2tnZWJlbgorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKyAgCisgIC8vIF9xdWVyeV8qLU1ldGhvZGUgdm9yaGFuZGVuPyBmYWxscyBqYSwgYXVmcnVmZW4uCisgIC8vIFRPRE86IENsb3N1cmVjYWNoZSB1bmQgbnVyIHJ1ZmVuLCB3ZW5uIGVzIF9xdWVyeV8qIGF1Y2ggZ2lidD8KKyAgaWYgKGNhbGxfcmVzb2x2ZWQoJnJlc3VsdCx0aGlzX29iamVjdCgpLCJfcXVlcnlfIituYW1lKSkKKyAgICByZXR1cm4gcmVzdWx0OworICAKKyAgLy8gSGlsZnQgYWxsZXMgbmljaHRzLiBFcyBpc3QgZWluZSAnbm9ybWFsZScgUHJvcGVydHkgLi4uCisgIHJldHVybiBwcm9wW0ZfVkFMVUVdW25hbWVdOworfQorCisKKy8vIERhcyBnZXNhbXRlIFByb3BlcnR5LU1hcHBpbmcgYXVmIGVpbmVuIFNjaGxhZyBzZXR6ZW4KK3B1YmxpYyB2b2lkIFNldFByb3BlcnRpZXMoIG1hcHBpbmcgcHJvcHMgKQoreworICBzdHJpbmcgKm5hbWVzOworICBpbnQgaSwgaiwgc2FtZV9vYmplY3Q7CisgCisgIC8vIEtlaW4gTWFwcGluZz8gU2NobGVjaHQgLi4uCisgIGlmKCFtYXBwaW5ncChwcm9wcykpIHJldHVybjsKKworICAvLyBTZXR6ZW4gd2lyIHNlbGJlcj8KKyAgc2FtZV9vYmplY3QgPSAoIWNsb3N1cmVfY2FsbCAmJgorICAgICAgICAgICAgICAgICAoIWV4dGVybl9jYWxsKCl8fHByZXZpb3VzX29iamVjdCgpPT10aGlzX29iamVjdCgpfHwKKyAgICAgICAgICAgICAgICAgIGFsbG93ZWQoKSkpOworICBuYW1lcyA9IG1faW5kaWNlcyhwcm9wcyk7CisgIAorICAvLyBEYXMgU0VDVVJFRC1GbGFnIGRhcmYgbnVyIGR1cmNoIGRhcyBPYmpla3Qgc2VsYmVyIGdlc2V0enQgd2VyZGVuOgorICAvLyBBbGxlIFNFQ1VSRUQtRmxhZ3MgYXVzIHByb3BzIGxvZXNjaGVuCisgIGlmICghc2FtZV9vYmplY3QpCisgIHsKKyAgICBqPXNpemVvZihuYW1lcyk7CisgICAgd2hpbGUoai0tKSBwcm9wc1tuYW1lc1tqXSwgRl9NT0RFXSAmPSB+U0VDVVJFRDsKKyAgfQorCisgIGo9c2l6ZW9mKG5hbWVzKTsKKyAgd2hpbGUoai0tKQorICB7CisgICAgLy8gUHJvcGVydGllcywgZGllIHNjaG9uIFNFQ1VSRUQgb2RlciBQUk9URUNURUQgc2luZCwgZHVlcmZlbgorICAgIC8vIG51ciB2b20gT2JqZWt0IHNlbGJlciBtYW5pcHVsaWVydCB3ZXJkZW4KKyAgICBpZiAoc2FtZV9vYmplY3R8fCEocHJvcFtGX01PREVdW25hbWVzW2pdXSAmIChQUk9URUNURUR8U0VDVVJFRCkpICkKKyAgICB7CisgICAgICBpPTQ7CisgICAgICB3aGlsZShpLS0pCisgICAgICB7CisgICAgICAgIGlmKHByb3BzW25hbWVzW2pdLGldKQorICAgICAgICAgIHByb3BbaV1bbmFtZXNbal1dID0gcHJvcHNbbmFtZXNbal0sIGldOworICAgICAgICBlbHNlCisgICAgICAgICAgcHJvcFtpXS09KFtuYW1lc1tqXV0pOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm47Cit9CisKKworLy8gRWluIE1hcHBpbmcgbWl0IGFsbGVuIFByb3BlcnRpZXMgenVydWVja2dlYmVuCitwdWJsaWMgbWFwcGluZyBRdWVyeVByb3BlcnRpZXMoKQoreworICBtYXBwaW5nIHByb3BzOworICBpbnQgaSwgajsKKyAgc3RyaW5nICpuYW1lczsKKworICBwcm9wcyA9IG1fYWxsb2NhdGUoIDAsIDQgKTsKKyAgCisgIGlmIChwb2ludGVycChwcm9wKSkKKyAgeworICAgIGk9NDsKKyAgICB3aGlsZShpLS0pCisgICAgeworICAgICAgbmFtZXMgPSBtX2luZGljZXMocHJvcFtpXSk7CisgICAgICBqPXNpemVvZihuYW1lcyk7CisgICAgICB3aGlsZShqLS0pIHByb3BzW25hbWVzW2pdLCBpXSA9IHByb3BbaV1bbmFtZXNbal1dOworICAgIH0KKyAgfQorICByZXR1cm4gcHJvcHM7Cit9CisKKy8vIERpZSBQcm9wZXJ0aWVzIGFscyB1cnNwcnVlbmdsaWNoZXMgQXJyYXkgenVydWVja2dlYmVuCitwdWJsaWMgbWl4ZWQgKl9fcXVlcnlfcHJvcGVydGllcygpCit7CisgIGlmICggcG9pbnRlcnAocHJvcCkgKQorICAgIHJldHVybihkZWVwX2NvcHkocHJvcCkpOworICBlbHNlCisgICAgcmV0dXJuICh7IChbXSksKFtdKSwoW10pLChbXSkgfSk7Cit9CisKKworLy8gbWFwcGluZyBQcm9wZXJ0aWVzIHNldHplbiB6dW0gU3BlaWNoZXJuIChwZXIgc2F2ZV9vYmplY3QoKSkKKy8vIEF1ZnJ1ZiBudXIgYXVzIHNpbXVsX2VmdW4gaGVyYXVzCitwdWJsaWMgdm9pZCAgX3NldF9zYXZlX2RhdGEobWl4ZWQgZGF0YSkgeyBwcm9wZXJ0aWVzID0gZGF0YTsgfQorCisvLyBtYXBwaW5nIFByb3BlcnRpZXMgenVtIFJlc3RvcmVuIHp1cnVlY2tnZWJlbgorcHVibGljIG1peGVkIF9nZXRfc2F2ZV9kYXRhKCkgICAgICAgICAgIHsgcmV0dXJuIHByb3BlcnRpZXM7IH0KKwpkaWZmIC0tZ2l0IGEvc3RkL3RoaW5nL3Jlc3RyaWN0aW9ucy5jIGIvc3RkL3RoaW5nL3Jlc3RyaWN0aW9ucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZDBmODMKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvdGhpbmcvcmVzdHJpY3Rpb25zLmMKQEAgLTAsMCArMSwxNDIgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyB0aGluZy9yZXN0cmljdGlvbnMuYyAtLSBHZXdpY2h0IHUuYWUuIGVpbmVzIE9iamVrdHMKKy8vCisvLyAkSWQ6IHJlc3RyaWN0aW9ucy5jIDY4MDkgMjAwOC0wMy0yOSAyMTo1NDowNFogWmVzc3RyYSAkCisKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKworI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTIAorI2luY2x1ZGUgPHRoaW5nL3Byb3BlcnRpZXMuaD4KKworLy8gR2V3aWNodCBpc3QgMWtnLCB3ZW5uIG5pY2h0IGFuZGVycyBiZXN0aW1tdAorcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkgCit7ICAKKyAgU2V0UHJvcChQX1dFSUdIVCwgMTAwMCk7Cit9CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZV9zdXBlcigpIHsKKyAgc2V0X25leHRfcmVzZXQoLTEpOworfSAgICAgCisKKy8vIFBfVE9UQUxfV0VJR0hUIGJlaSBOaWNodC1Db250YWluZXJuIGF1ZiBQX1dFSUdIVCB1bWxlaXRlbgorc3RhdGljIGludCBfc2V0X3dlaWdodChpbnQgd2VpZ2h0KSB7CisgIHJldHVybiBTZXRQcm9wKFBfVE9UQUxfV0VJR0hULAorCSAgU2V0KFBfV0VJR0hULCB3ZWlnaHQsIEZfVkFMVUUpICk7Cit9CisKKy8vIFBfWF9BVFRSX01PRCBhZW5kZXJuIChBdHRyaWJ1dGFlbmRlcnVuZ2VuIGR1cmNoIEF1c3J1ZXN0dW5nKQorc3RhdGljIG1hcHBpbmcgX3NldF9leHRlcm5fYXR0cmlidXRlc19tb2RpZmllcihtYXBwaW5nIHhtb2QpIAoreworICBtYXBwaW5nIHJlczsKKworICAvLyB3ZW5uIE11ZWxsIG9kZXIgZWluIGxlZXJlcyBNYXBwaW5nIHVlYmVyZ2ViZW4gd3VyZGUsIHdpcmQgZGllIHByb3AKKyAgLy8gZ2Vsb2VzY2h0IHVuZCBnZ2YuIGRhcyBPYmpla3QgaW0gTGl2aW5nIGFiZ2VtZWxkZXQuCisgIGlmICghbWFwcGluZ3AoeG1vZCkpIHhtb2Q9KFtdKTsKKyAgCisgIGlmICghc2l6ZW9mKHhtb2QpKSB7CisgCisgICAgcmVzPVNldChQX1hfQVRUUl9NT0QsIHhtb2QpOworICAKKyAgICAvLyB3ZW5uIFByb3AgZ2Vsb2VzY2h0IHdpcmQsIGthbm4gbWFuIGRhcyBJdGVtIGF1Y2ggYXVzIGRlciBMaXN0ZSBkZXIKKyAgICAvLyBTdGF0bW9kaWZpemllcmVyIGRlcyBMZWJld2VzZW5zIGF1c3RyYWdlbi4KKyAgICBpZiAobGl2aW5nKGVudmlyb25tZW50KCkpKSB7ICAKKyAgICAgIGVudmlyb25tZW50KCktPmRlcmVnaXN0ZXJfbW9kaWZpZXIoTUUpOworICAgICAgZW52aXJvbm1lbnQoKS0+VXBkYXRlQXR0cmlidXRlcygpOworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICAvLyBvaywgUHJvcCB3aXJkIGF1ZiBuZW4gaW50ZXJlc3NhbnRlbiBXZXJ0IGdlc2V0enQuIDstKQorCisgICAgLy8gRGFtaXQgSW5zZXJ0L1JlbW92ZVNlbnNpdGl2ZU9iamVjdCBiZWltIE1vdmUgYXVmZ2VydWZlbiB3aXJkLAorICAgIC8vIG11c3MgUF9TRU5TSVRJVkUgZ2VzZXR6dCBzZWluCisgICAgaWYgKCFRdWVyeVByb3AoUF9TRU5TSVRJVkUpKSBTZXRQcm9wKFBfU0VOU0lUSVZFLCh7fSkpOworICAKKyAgICBpZiAobGl2aW5nKGVudmlyb25tZW50KCkpICYmIAorICAgICAgICAoIW1hcHBpbmdwKHJlcz1RdWVyeVByb3AoUF9YX0FUVFJfTU9EKSkgfHwgIXNpemVvZihyZXMpKSkgeworICAgICAgLy8gV2VubiBkaWVzZXMgT2JqZWt0IGluIGVpbmVtIExpdmluZyBpc3QgdW5kIGJpc2hlciBkaWUgcHJvcCBuaWNodAorICAgICAgLy8gZ2VzZXR6dCB3YXIsIG11c3Mgc2ljaCBkYXMgT2JqZWt0IG5vY2ggaW0gTGl2aW5nIGFscyBTdGF0bW9kaWZpemllcmVyCisgICAgICAvLyByZWdpc3RyaWVyZW4uCisgICAgICByZXM9U2V0KFBfWF9BVFRSX01PRCwgeG1vZCk7CisgICAgICBlbnZpcm9ubWVudCgpLT5yZWdpc3Rlcl9tb2RpZmllcihNRSk7CisgICAgICBlbnZpcm9ubWVudCgpLT5VcGRhdGVBdHRyaWJ1dGVzKE1FKTsKKyAgICB9CisgICAgZWxzZSBpZiAobGl2aW5nKGVudmlyb25tZW50KCkpKXsKKyAgICAgIC8vIHNvbnN0IHJlaWNodCBlaW4gZWluZmFjaGVzIFVwZGF0ZUF0dHJpYnV0ZXMoKSB1bSBkYXMgTGViZXdlc2VuIHp1CisgICAgICAvLyBpbmZvcm1pZXJlbi4KKyAgICAgIHJlcz1TZXQoUF9YX0FUVFJfTU9ELCB4bW9kKTsKKyAgICAgIGVudmlyb25tZW50KCktPlVwZGF0ZUF0dHJpYnV0ZXMoKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAvLyB3ZW5uIGtlaW4gbGViZW5kZXMgRW52LCByZWljaHQgZWluZmFjaGVzIFNldHplbi4KKyAgICAgIHJlcz1TZXQoUF9YX0FUVFJfTU9ELHhtb2QpOworICAgIH0KKyAgfQorCisgIHJldHVybiByZXM7Cit9CisKKy8vIFBfWF9IRUFMVEhfTU9EIGFlbmRlcm4gKExQL0tQLUFlbmRlcnVuZyBkdXJjaCBBdXNydWVzdHVuZykKK3N0YXRpYyBtYXBwaW5nIF9zZXRfZXh0ZXJuX2hlYWx0aF9tb2RpZmllcihtYXBwaW5nIHhtb2QpIHsKKyAgbWFwcGluZyByZXM7CisKKyAgLy8gd2VubiBNdWVsbCBvZGVyIGVpbiBsZWVyZXMgTWFwcGluZyB1ZWJlcmdlYmVuIHd1cmRlLCB3aXJkIGRpZSBwcm9wCisgIC8vIGdlbG9lc2NodCB1bmQgZ2dmLiBkYXMgT2JqZWt0IGltIExpdmluZyBhYmdlbWVsZGV0LgorICBpZiAoIW1hcHBpbmdwKHhtb2QpKSB4bW9kPShbXSk7CisgIAorICBpZiAoIXNpemVvZih4bW9kKSkgeworIAorICAgIHJlcz1TZXQoUF9YX0hFQUxUSF9NT0QsIHhtb2QpOworICAKKyAgICAvLyB3ZW5uIFByb3AgZ2Vsb2VzY2h0IHdpcmQsIGthbm4gbWFuIGRhcyBJdGVtIGF1Y2ggYXVzIGRlciBMaXN0ZSBkZXIKKyAgICAvLyBTdGF0bW9kaWZpemllcmVyIGRlcyBMZWJld2VzZW5zIGF1c3RyYWdlbi4KKyAgICBpZiAobGl2aW5nKGVudmlyb25tZW50KCkpKSB7ICAKKyAgICAgIGVudmlyb25tZW50KCktPmRlcmVnaXN0ZXJfbW9kaWZpZXIoTUUpOworICAgICAgZW52aXJvbm1lbnQoKS0+VXBkYXRlQXR0cmlidXRlcygpOworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICAvLyBvaywgUHJvcCB3aXJkIGF1ZiBuZW4gaW50ZXJlc3NhbnRlbiBXZXJ0IGdlc2V0enQuIDstKQorCisgICAgLy8gRGFtaXQgSW5zZXJ0L1JlbW92ZVNlbnNpdGl2ZU9iamVjdCBiZWltIE1vdmUgYXVmZ2VydWZlbiB3aXJkLAorICAgIC8vIG11c3MgUF9TRU5TSVRJVkUgZ2VzZXR6dCBzZWluCisgICAgaWYgKCFRdWVyeVByb3AoUF9TRU5TSVRJVkUpKSBTZXRQcm9wKFBfU0VOU0lUSVZFLCh7fSkpOworICAKKyAgICBpZiAobGl2aW5nKGVudmlyb25tZW50KCkpICYmIAorICAgICAgICAoIW1hcHBpbmdwKHJlcz1RdWVyeVByb3AoUF9YX0hFQUxUSF9NT0QpKSB8fCAhc2l6ZW9mKHJlcykpKSB7CisgICAgICAvLyBXZW5uIGRpZXNlcyBPYmpla3QgaW4gZWluZW0gTGl2aW5nIGlzdCB1bmQgYmlzaGVyIGRpZSBwcm9wIG5pY2h0CisgICAgICAvLyBnZXNldHp0IHdhciwgbXVzcyBzaWNoIGRhcyBPYmpla3Qgbm9jaCBpbSBMaXZpbmcgYWxzIFN0YXRtb2RpZml6aWVyZXIKKyAgICAgIC8vIHJlZ2lzdHJpZXJlbi4KKyAgICAgIHJlcz1TZXQoUF9YX0hFQUxUSF9NT0QsIHhtb2QpOworICAgICAgZW52aXJvbm1lbnQoKS0+cmVnaXN0ZXJfbW9kaWZpZXIoTUUpOworICAgICAgZW52aXJvbm1lbnQoKS0+VXBkYXRlQXR0cmlidXRlcyhNRSk7CisgICAgfQorICAgIGVsc2UgaWYgKGxpdmluZyhlbnZpcm9ubWVudCgpKSl7CisgICAgICAvLyBzb25zdCByZWljaHQgZWluIGVpbmZhY2hlcyBVcGRhdGVBdHRyaWJ1dGVzKCkgdW0gZGFzIExlYmV3ZXNlbiB6dQorICAgICAgLy8gaW5mb3JtaWVyZW4uCisgICAgICByZXM9U2V0KFBfWF9IRUFMVEhfTU9ELCB4bW9kKTsKKyAgICAgIGVudmlyb25tZW50KCktPlVwZGF0ZUF0dHJpYnV0ZXMoKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAvLyB3ZW5uIGtlaW4gbGViZW5kZXMgRW52LCByZWljaHQgZWluZmFjaGVzIFNldHplbi4KKyAgICAgIHJlcz1TZXQoUF9YX0hFQUxUSF9NT0QseG1vZCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJlczsKKworfQorCisvLyBQX1gvTV9BVFRSX01PRCB3ZXJkZW4gbmljaHQgYmVydWVja3NpY2h0aWd0LCBkYSBDVU1VTEFUSVZFX0FUVFJfTElNSVQKKy8vIHVlYmVyc2Nocml0dGVuIGlzdAordm9pZCBOb3RpZnlYTUF0dHJNb2RMaW1pdFZpb2xhdGlvbigpCit7Cit9CisgIApkaWZmIC0tZ2l0IGEvc3RkL3RoaW5nL3NvY2tldHMuYyBiL3N0ZC90aGluZy9zb2NrZXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRkOTg5OQotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC90aGluZy9zb2NrZXRzLmMKQEAgLTAsMCArMSwyNTQgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8qKiBAZmlsZQorKiBJbXBsZW1lbnRhdGlvbiBmdWVyIFNvY2tlbGl0ZW1zLgorKiBMYW5nYmVzY2hyZWlidW5nLi4uIFRPRE8KKyogQGF1dGhvciBaZXNzdHJhICsgQXJhdGhvcm4KKyogQGRhdGUgeHguMDUuMjAwOAorKiBAdmVyc2lvbiAkSWQkCisqLworCisvKiBDaGFuZ2Vsb2c6CisqLworI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBub19zaGFkb3cKKyNwcmFnbWEgcGVkYW50aWMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDx0aGluZy9zb2NrZXRzLmg+CisjdW5kZWYgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPGxwY3R5cGVzLmg+CisKKyNpZm5kZWYgREVCVUcKKy8qKiBPdXRwdXRzIGRlYnVnIG1lc3NhZ2UgdG8gTWFpbnRhaW5lciwgaWYgTWFpbnRhaW5lciBpcyBsb2dnZWQgaW4uIAorKi8KKyNkZWZpbmUgREVCVUcoeCkgX19kZWJ1Z19tc2dfXyh4KQorI2VuZGlmCisKKworcHJpdmF0ZSB2b2lkIF9fZGVidWdfbXNnX18oc3RyaW5nIHgpIHsKKyAgaWYgKGZpbmRfcGxheWVyKCJ6ZXNzdHJhIikpCisgICAgICB0ZWxsX29iamVjdChmaW5kX3BsYXllcigiemVzc3RyYSIpLCJTREJHOiAiK3grIlxuIik7Cit9CisKKy8qKiBTZXR6dCBcYSBpdGVtIGluIGVpbmVuIHBhc3NlbmRlbiBTb2NrZWwgZWluLgorICBXaXJkIHZvbSBIYW5kd2Vya2VyIGdlcnVmZW4uIFNvZmVybiBkaWUgUHJ1ZWZ1bmcgbWl0dGVscyBUZXN0U29ja2V0SXRlbSgpCisgIGVyZm9sZ3JlaWNoIGlzdCwgd2VyZGVuIGRpZSBQcm9wcyBkaWVzZXMgT2JqZWt0IGR1cmNoIGRpZSBpbSBJdGVtCisgIGdlc3BlaWNoZXJ0ZW4gaW4gUF9TT0NLRVRfUFJPUFMgZXJnYWVuenQsIGdnZi4gUF9SRVNUUklDVElPTiBnZWFlbmRlcnQgdW5kCisgIE5hbWUgZGVyIEJsdWVwcmludCwgTmFtZSB1bmQgUF9TT0NLRVRfUFJPUFMgaW4gUF9TT0NLRVRTIGdlc3BlaWNoZXJ0LCB1bQorICBzcGFldGVyIG5hY2h2b2xsemllaGVuIHp1IGtvZW5uZW4sIHdpZSBkaWVzZXMgT2JqZWt0IGJlcmVpdHMgbW9kaWZpemllcnQKKyAgd3VyZGUuCisgIEBhdHRlbnRpb24gQW0gRW5kZSBkZXIgRnVua3Rpb24gd2lyZCBcYSBpdGVtIHplcnN0b2VydCB1bmQgZGFyZiBuaWNodCBtZWhyCisgIGJlbnV0enQgd2VyZGVuIQorICBAcGFyYW1baW5dIGl0ZW0gT2JqZWt0LCB3ZWxjaGVzIGluIGVpbmVuIHBhc3NlbmRlbiBTb2NrZXQgZWluZ2VzZXR6dCB3ZXJkZW4KKyAgc29sbC4KKyAgQHJldHVybiAxLCBmYWxscyBFaW5zZXR6ZW4gZXJmb2xncmVpY2gsIDwwIHdlbm4gbmljaHQuCisgIEBzYSBUZXN0U29ja2V0SXRlbShvYmplY3QpCisgKi8KK3B1YmxpYyBpbnQgTW91bnRTb2NrZXRJdGVtKG9iamVjdCBpdGVtKSB7CisgIGlmICghb2JqZWN0cChpdGVtKSkgcmV0dXJuIFNPQ0tFVF9OT19PQkpFQ1Q7CisgIGlmICgoaW50IHJlcz1UZXN0U29ja2V0SXRlbShpdGVtKSkgIT0gU09DS0VUX09LKQorICAgIHJldHVybiByZXM7CisgIG1hcHBpbmcgaWRhdGE9KG1hcHBpbmcpaXRlbS0+UXVlcnlQcm9wKFBfU09DS0VUX1BST1BTKTsKKyAgLy8gVE9ETzogU3BlemlhbGJlaGFuZGx1bmcgZnVlciBQcm9wcywgYmVpIGRlbmVuIGRhcyBPYmpla3QgZXJoYWx0ZW4gYmxlaWJlbgorICAvLyBtdXNzLiAoei5CLiBQX0RFRkVORF9GVU5DKS4KKworICAvLyB6dSBtb2RpZml6aWVyZW5kZSBQcm9wcyBhZGRpZXJlbgorICBmb3JlYWNoKHN0cmluZyBwcm9wbmFtZSwgbWl4ZWQgcHZhbDogaWRhdGEpIHsKKyAgICBTZXRQcm9wKHByb3BuYW1lLCBBZGRUb0VudGl0eShRdWVyeVByb3AocHJvcG5hbWUpLCBwdmFsKSApOworICB9CisgIC8vIFJlc3RyaWN0aW9ucyBoaW56dWZ1ZWdlbi4KKyAgU2V0UHJvcChQX1JFU1RSSUNUSU9OUywgCisgICAgICBBZGRUb0VudGl0eShRdWVyeVByb3AoUF9SRVNUUklDVElPTlMpLCAKKwlpdGVtLT5RdWVyeVByb3AoUF9TT0NLRVRfUkVTVFJfVVNFKSkgKTsKKworICAvLyBEYXRlbiB1ZWJlciBkaWVzZXMgU29ja2V0aXRlbSBhYnNwZWljaGVybi4KKyAgbWl4ZWQgc29ja2V0cz1RdWVyeVByb3AoUF9TT0NLRVRTKVtpdGVtLT5RdWVyeVByb3AoUF9TT0NLRVRfVFlQRSldOworICAvLyBmcmVpZXIgU29ja2VsIG11c3MgZXhpc3RpZXJlbiAoLT5UZXN0U29ja2V0SXRlbSgpKQorICBpbnQgaW5kZXg9bWVtYmVyKHNvY2tldHMsIFNPQ0tFVF9GUkVFKTsKKyAgc29ja2V0c1tpbmRleF0gPSBpZGF0YSArIChbIkJMVUVfTkFNRSI6IGxvYWRfbmFtZShpdGVtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJERVNDUklQVElPTiI6IGl0ZW0tPm5hbWUoV0VSKSBdKTsKKworICAvLyBnZ2YuIEJlc2NocmVpYnVuZyBha3R1YWxpc2llcmVuPworICAvLyBnZ2YuIFNvbmRlcmJlaGFuZGx1bmcgZnVlciBQcm9wcywgYmVpIGRlbmVuIGRhcyBPYmpla3Qgbm9jaCBnZWJyYXVjaHQKKyAgLy8gd2lyZCAoei5CLiBQX0RFRkVORF9JTkZPKQorCisgIC8vIFByb3Agc2NodWV0emVuLCBzb2JhbGQgRGF0ZW4gZHJpbiBzdGVoZW4uCisgIFNldChQX1NPQ0tFVFMsIFBST1RFQ1RFRHxOT1NFVE1FVEhPRCwgRl9NT0RFX0FTKTsKKworICAvLyBpdGVtIGVudHNvcmdlbgorICBpZiAoIWl0ZW0tPnJlbW92ZSgxKSkKKyAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJNb3VudFNvY2tldEl0ZW0oKSBpbiAlTzogJU8gaGF0IEF1c2Z1ZWhydW5nIHZvbiAiCisJICAicmVtb3ZlKCkgdmVyd2VpZ2VydC5cbiIsIE1FLCBpdGVtKSk7CisgIHJldHVybiBTT0NLRVRfT0s7Cit9CisKKy8qKiBQcnVlZnQsIG9iIFxhIGl0ZW0gaW4gZWluZW4gU29ja2VsIGVpbmdlc2V0enQgd2VyZGVuIGthbm4uCisgIFBydWVmdCwgb2IgZXMgZnVlciBkYXMgSXRlbSBlaW5lbiBwYXNzZW5kZW4gU29ja2VsIGdpYnQgdW5kIG9iIAorICBlcyBkaWUgZm9ybWFsZW4gQW5mb3JkZXJ1bmdlbiBlcmZ1ZWxsdCwgZG9ydCBlaW5nZXNldHp0IHp1IHdlcmRlbi4gCisgIEthbm4gdm9tIEhhbmR3ZXJrZXIgdm9yIGRlbSBlY2h0ZW4gRWluc2V0emVuIGdlcnVmZW4gd2VyZGVuLgorICBXaXJkIGF1Y2ggdm9uIE1vdW50U29ja2V0SXRlbShvYmplY3QpIGdlcnVmZW4uCisgIEBwYXJhbVtpbl0gaXRlbSBPYmpla3QsIHdlbGNoZXMgYXVmIEVpZ251bmcgenVtIEVpbnNldHplbiBpbiBlaW5lbiBTb2NrZWwKKyAgZ2V0ZXN0ZXQgd2VyZGVuIHNvbGwuCisgIEByZXR1cm4gMSwgZmFsbHMgZWluIHBhc3NlbmRlciB1bmQgZnJlaWVyIFNvY2tlbCBleGlzdGllcnQsIDAgc29uc3QuCisgIEBzYSBNb3VudFNvY2tldChvYmplY3QpCisqLworcHVibGljIGludCBUZXN0U29ja2V0SXRlbShvYmplY3QgaXRlbSkgeworCisgIGlmICghb2JqZWN0cChpdGVtKSkgcmV0dXJuIFNPQ0tFVF9OT19PQkpFQ1Q7CisgIAorICAvLyBpc3QgZXMgZWluIFNvY2tlbGl0ZW0gdW5kIGhhdCBlcyBlaW5lbiBndWVsdGlnZW4gVHlwPworICBtYXBwaW5nIGlkYXRhID0gKG1hcHBpbmcpaXRlbS0+UXVlcnlQcm9wKFBfU09DS0VUX1BST1BTKTsKKyAgaWYgKCFtYXBwaW5ncChpZGF0YSkgfHwgIXNpemVvZihpZGF0YSkpCisgICAgcmV0dXJuIFNPQ0tFVF9OT19EQVRBOworICBzdHJpbmcgc3R5cD0oc3RyaW5nKWl0ZW0tPlF1ZXJ5UHJvcChQX1NPQ0tFVF9UWVBFKTsKKyAgaWYgKCFzdHJpbmdwKHN0eXApCisgICAgICB8fCBtZW1iZXIoVkFMSURfU09DS0VUX1RZUEVTLCBzdHlwKSA9PSAtMSkKKyAgICByZXR1cm4gU09DS0VUX0lOVkFMSURfVFlQRTsKKworICAvLyBIYXQgZGllc2VzIEl0ZW0gdWViZXJoYXVwdCBTb2NrZWw/IFVuZCB3ZW5uIGphLCBoYWJlbiB3aXIgbmVuIGZyZWllbgorICAvLyBTb2NrZSBmdWVyIGRlbiBiZXRyZWZmZW5kZW4gVHlwPworICBtYXBwaW5nIG15c29ja2V0cyA9IFF1ZXJ5UHJvcChQX1NPQ0tFVFMpOworICBpZiAoIW1hcHBpbmdwKG15c29ja2V0cykgfHwgIXNpemVvZihteXNvY2tldHMpKSAKKyAgICByZXR1cm4gU09DS0VUX05PX1NPQ0tFVFM7CisgIGlmICghbWVtYmVyKG15c29ja2V0cywgc3R5cCkKKyAgICAgIHx8ICFtZW1iZXIobXlzb2NrZXRzW3N0eXBdLCBTT0NLRVRfRlJFRSkgPT0gLTEgKQorICAgIHJldHVybiBTT0NLRVRfTk9ORV9BVkFJTEFCTEU7CisKKyAgLy8gSGFuZHdlcmtlciBwcnVlZmVuLgorICAvLyBUT0RPOiBTb2xsIGRpZSBGZWhsZXJtZWxkdW5nIGtvbXBsZXR0IHZvbSBBdWZydWZlciBlcmxlZGlndCB3ZXJkZW4gb2RlcgorICAvLyBzb2xsIGVzIGVpbmVuIEhlaW53ZWlzIGdlYmVuLCB3YXJ1bSBkZXIgSGFuZHdlcmtlciBuaWNodCBnZWVpZ25ldCBpc3Q/CisgIG9iamVjdCBjcmFmdHNtYW4gPSBwcmV2aW91c19vYmplY3QoKTsKKyAgbWFwcGluZyByZXN0ciA9IChtYXBwaW5nKWl0ZW0tPlF1ZXJ5UHJvcChQX1NPQ0tFVF9SRVNUUl9NT1VOVCk7CisgIGlmICghb2JqZWN0cChjcmFmdHNtYW4pCisgICAgICB8fCAobWFwcGluZ3AocmVzdHIpCisJJiYgIi9zdGQvcmVzdHJpY3Rpb25fY2hlY2tlciItPmNoZWNrX3Jlc3RyaWN0aW9ucyhjcmFmdHNtYW4sCisJICByZXN0cikpKQorICAgIHJldHVybiBTT0NLRVRfTk9fRVhQRVJUSVNFOworCisgIC8vIGRhIFBfUkVTVFJJQ1RJT04gbnVyIGJlaW0gQW56aWVoZW4vWnVlY2tlbiBnZXBydWVmdCB3aXJkLCBkYXJmIG1hbiBlaW4KKyAgLy8gSXRlbSBuaWNodCBpbiBnZXRyYWdlbmVtIFp1c3RhbmQgbW9kaWZpemllcmVuLgorICBpZiAob2JqZWN0cCgob2JqZWN0KWl0ZW0tPlF1ZXJ5UHJvcChQX1dJRUxERUQpKQorICAgICAgfHwgb2JqZWN0cCgob2JqZWN0KWl0ZW0tPlF1ZXJ5UHJvcChQX1dPUk4pKSkKKyAgICByZXR1cm4gU09DS0VUX0lURU1fSU5VU0U7CisKKyAgcmV0dXJuIFNPQ0tFVF9PSzsKK30KKworLyoqIExpZWZlcnQgSW5mb3MgdWViZXIgZGllIFNvY2tldHMgKFR5cCwgd2FzIGRyaW4gaXN0LCBldGMuXCApLgorICBQcmltYWVyIGZ1ZXIgR2lsZGVuIGdlZGFjaHQuCisqLworcHVibGljIG1peGVkIEdldFNvY2tldEluZm8oKSB7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKiogcHJpdmF0ZSAqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKy8qKiBBZGRpZXJ0IHp3ZWkgVmFyaWFibGVuLCBzb2Zlcm4gc2llIGtvbXBhdGliZWwgc2luZC4KKyAgTGFzc2VuIHNpY2ggZGllIGJlaWRlbiBEYXRlbnR5cGVuIG5pY2h0IHNpbm52b2xsIGFkZGllcmVuLCBlcmZvbGd0IGtlaW5lCisgIEFkZGl0aW9uIHVuZCBcYSBvbGQgd2lyZCB6dXJ1ZWNrIGdlbGllZmVydCAoei5CLiBiZWkgT2JqZWt0ZW4sIENsb3N1cmVzKS4KKyAgSGllcmJlaSBlcmZvbGd0IHouQi4gYmVpIE1hcHBpbmdzIGVpbmUgd2VydHdlaXNlIEFkZGl0aW9uLCBrZWluZSBibG9zc2UKKyAgRXJzZXR6dW5nIGRlciBLZXlzIHdpZSBiZWkgZGVyIG5vcm1hbGVuIE1hcHBpbmctQWRkaXRpb24uCisgIEBwYXJhbVtpbixvdXRdIG9sZCBEYXR1bSwgenUgZGVtIGFkZGllcnQgd2VyZGVuIHNvbGwuIFdpcmQgYmVpIE1hcHBpbmdzCisgIGdlYWVuZGVydC4KKyAgQHBhcmFtW2luXSBuZXcgRGF0dW0sIHdlbGNoZXMgYWRkaWVydGVuIHNvbGwuCisgIEByZXR1cm4gU3VtbWUgdm9uIG9sZCB1bmQgbmV3LCBmYWxscyBkaWUgRGF0ZW50eXBlbiBrb21wYXRpYmVsIHNpbmQuIEZhbGxzCisgIG5pY2h0LCBrYW5uIG9sZCB6dXJ1ZWNrZ2VnZWJlbiB3ZXJkZW4uIERlciBEYXRlbnR5cCB2b24gCisgIEBhdHRlbnRpb24gXGIgUmVrdXJzaXYhIEthbm4gdGV1ZXIgd2VyZGVuLlxuCisgICAgS2FubiAobW9kaWZpemllcnRlKSBcYSBvbGQgb2RlciBcYSBuZXcgb2RlciBnYW56IG5ldWVzIERhdHVtIAorICAgIHp1cnVlY2tsaWVmZXJuLCBkLmguIGRlciB6dXJ1ZWNrZ2VsaWVmZXJ0ZSBEYXRlbnR5cCBtdXNzIG5pY2h0IGRlbQorICAgIERhdGVudHlwIHZvbiBvbGQgZW50c3ByZWNoZW4uIEViZW5zbyBlcnpldWd0IHouQi4gZGllIEFkZGl0aW9uIHp3ZWllcgorICAgIEFycmF5cyBlaW4gbmV1ZXMgQXJyYXkuCisgICAgV2VubiBkaWUga29ycmVzcG9uZGllcmVuZGVuIFdlcnRlIG5pY2h0IGRlbiBnbGVpY2hlbiBEYXRlbnR5cCBoYWJlbiwKKyAgICBmaW5kZXQgdS5VLiBrZWluZSBBZGRpdGlvbiBzdGF0dCBvZGVyIGVzIHdpcmQgZWluZSBEYXRlbnR5cC1VbXdhbmRsdW5nCisgICAgZHVyY2hnZWZ1ZWhydCwgei5CLiBJbnQgKyBGbG9hdCA9PSBGbG9hdC5cbgorICAqLworcHJpdmF0ZSBtaXhlZCBBZGRUb0VudGl0eShtaXhlZCBvbGQsIG1peGVkIG5ldykgeworCisgIC8vIGVpbmZhY2hzdGUgRmFlbGxlOgorICBpZiAoIW9sZCkKKyAgICByZXR1cm4gbmV3OworICBlbHNlIGlmICghbmV3KQorICAgIHJldHVybiBvbGQ7CisKKyAgLy8gVHlwIGJlc3RpbW1lbgorICBpbnQgb2xkdHlwZSA9IHR5cGVvZihvbGQpOworICBpbnQgbmV3dHlwZSA9IHR5cGVvZihuZXcpOworICAvLyBWYXJpYWJsZW4gZ2xlaWNoZW4gVHlwcyBzaW5kIGVpbmZhY2guCisgIGlmIChvbGR0eXBlID09IG5ld3R5cGUpIHsKKyAgICBzd2l0Y2ggKG9sZHR5cGUpIHsKKyAgICAgIC8vIGVpbmlnZSBUeXBlbiB3ZXJkZW4gc3R1bXBmIGFkZGllcnQuCisgICAgICBjYXNlIFRfTlVNQkVSOgorICAgICAgY2FzZSBUX1NUUklORzoKKyAgICAgIGNhc2UgVF9GTE9BVDoKKyAgICAgIGNhc2UgVF9QT0lOVEVSOiAvLyBUT0RPOiBhbmRlcmVzIFZlcmhhbHRlbj8KKwlyZXR1cm4gb2xkK25ldzsKKyAgICAgIC8vIE1hcHBpbmdzIHdlcmRlbiB3ZXJ0d2Vpc2UgYWRkaWVydC4KKyAgICAgIGNhc2UgVF9NQVBQSU5HOgorCS8vIG51ciB3ZW5uIGRpZSBCcmVpdGUgZGVzIDIuIFN1bW1hbmRlbiA8PSBkZXIgZGVzIDEuIFN1bW1hbmRlbiBpc3QsCisJLy8gbGFzc2VuIHNpY2ggTWFwcGluZ3MgaGllcm1pdCBhZGRpZXJlbi4KKwlpZiAod2lkdGhvZihuZXcpID4gd2lkdGhvZihvbGQpKQorCSAgcmV0dXJuIG9sZDsKKwkvLyBuZXcgYXVmIG9sZCBhZGRpZXJlbi4gS2V5cyB3ZXJkZW4gbmljaHQgZXJzZXR6dCwgc29uZGVybiBuYWNoCisJLy8gTW9lZ2xpY2hrZWl0IGRpZSB3ZXJ0ZSB1bnRlciBkZW4ga2V5cyBqZXdlaWxzIGFkZGllcnQuCisJLy8gbWFwKCkgbnVyIHp1bSBVZWJlcmdlYmVuIGFsbGVyIEtleXMrVmFsdWUuIEFkZFRvTWFwcGluZyBhZW5kZXJ0CisJLy8gZGlyZWt0IGRhcyB1ZWJlcmdlYmVuZSBNYXBwaW5nIG9sZC4KKwltYXAobmV3LCAjJ0FkZFRvTWFwcGluZywgb2xkKTsgCisJLy8gYWxsZXMgaGllciBuaWNodCBhdWZnZWZ1ZWhydGUga2FubiBuaWNodCBhZGRpZXJ0IHdlcmRlbi4KKyAgICAgIGRlZmF1bHQ6IHJldHVybiBvbGQ7CisgICAgfQorICB9CisgIC8vIEludHMgdW5kIEZsb2F0cyBzaW5kIGF1Y2ggbm9jaCBndXQgYWRkaWVyYmFyLgorICBlbHNlIGlmICgob2xkdHlwZSA9PSBUX0ZMT0FUICYmIG5ld3R5cGUgPT0gVF9OVU1CRVIpIHx8CisgICAgICAgICAgIChvbGR0eXBlID09IFRfTlVNQkVSICYmIG5ld3R5cGUgPT0gVF9GTE9BVCkgKQorICAgIHJldHVybiBvbGQgKyBuZXc7CisgIC8vIEFycmF5cyBsYXNzZW4gc2ljaCBhdWNoIGd1dCB2ZXJ3dXJzdGVuIChuZXcga2FubiBrZWluIEFycmF5IHNlaW4pLgorICAvLyBVbWdla2VocnRlciBGYWxsIHdhZXJlIGF1Y2ggbWVvZ2xpY2gsIGFiZXIgZGVyIERhdGVudHlwIHZvbiBvbGQgd2FlcmUKKyAgLy8gc2VociBkZXV0bGljaCB1bnRlcnNjaGllZGxpY2ggdm9tIHVyc3BydWVuZ2xpY2hlbi4KKyAgZWxzZSBpZiAob2xkdHlwZSA9PSBUX1BPSU5URVIpCisgICAgcmV0dXJuIG9sZCsoe25ld30pOworICAvLyBTdHJpbmdzIHVuZCBaZWljaGVubGl0ZXJhbGUgKEludHMpIHNpbmQgQW5zaWNodHNzYWNoZS4KKyAgZWxzZSBpZiAob2xkdHlwZSA9PSBUX1NUUklORyAmJiBuZXd0eXBlID09IFRfTlVNQkVSKQorICAgIHJldHVybiBzcHJpbnRmKCIlcyVjIixvbGQsbmV3KTsKKyAgZWxzZSBpZiAob2xkdHlwZSA9PSBUX05VTUJFUiAmJiBuZXd0eXBlID09IFRfU1RSSU5HKQorICAgIHJldHVybiBzcHJpbnRmKCIlYyVzIixvbGQsbmV3KTsKKworICAvLyBGYWxsLXRocm91Z2gKKyAgcmV0dXJuIG9sZDsKK30KKworLyoqIEFkZGllcnQgZWluZW4gU2NobHVlc3NlbCB1bmQgc2VpbmUgV2VydGUgenUgZWluZW0gTWFwcGluZywgZ2dmLlwgYXVmIGRpZQorICogYmVzdGVoZW5kZW4gV2VydGUgZGVzIE1hcHBpbmdzIFxhIG9sZC4KKyAqIERlciBLZXkgdW5kIHNlaW5lIFdlcnRlIGVyc2V0emVuIGJlc3RlaGVuZGUgV2VydGUgaW4gXGEgb2xkIG5pY2h0LCB3aWUgZXMKKyAqIGRpZSBub3JtYWxlIE1hcHBpbmctQWRkaXRpb24gZGVzIERyaXZlciBtYWNodC4gU3RhdHRkZXNzZW4gd2lyZCB2ZXJzdWNodCwKKyAqIGRpZSBuZXVlbiBXZXJ0ZSBhdWYgZGllIGVudHNwcmVjaGVuZGVuIGFsdGVuIFdlcnRlIHp1IGFkZGllcmVuLiBGYWxscyBkaWUKKyAqIERhdGVudHlwZW4gendlaWVyIFdlcnRlIGlua29tcGF0aWJlbCBzaW5kLCBlcmZvbGd0IGtlaW5lIEFkZGl0aW9uIHVuZCBkZXIKKyAqIGFsdGUgV2VydGUgaGF0IEJlc3RhbmQuCisgIEBwYXJhbVtpbl0ga2V5IChtaXhlZCkgV2VydCwgZGVyIGluIGRhcyBNYXBwaW5nIGFkZGllcnQgd2lyZC4KKyAgQHBhcmFtW2luXSB2YWx1ZXMgKG1peGVkKQorICBAcGFyYW1baW4sb3V0XSBvbGQgTWFwcGluZywgaW4gZGFzIGFkZGllcnQgd2lyZC4KKyAgQGF0dGVudGlvbiBEaWUgQnJlaXRlcyBkZXMgMi4gU3VtbWFuZGVuIGRhcmYgXGIgbmljaHQgZ3JvZXNzZXIgc2VpbiBhbHMgZGllCisgIEJyZWl0ZSBkZXMgMSwgU3VtbWFuZGVuISBcbgorICAgIERpZSBrb3JyZXNwb25kaWVyZW4gV2VydGUgc29sbHRlbiBkZW4gZ2xlaWNoZW4gRGF0ZW50eXAgaGFiZW4sIHNvbnN0CisgICAgZmluZGV0IHUuVS4ga2VpbmUgQWRkaXRpb24gc3RhdHQgb2RlciBlcyB3aXJkIGVpbmUgRGF0ZW50eXAtVW13YW5kbHVuZworICAgIGR1cmNoZ2VmdWVocnQsIHouQi4gSW50ICsgRmxvYXQgPT0gRmxvYXQuXG4KKyAgKi8KK3ByaXZhdGUgdm9pZCBBZGRUb01hcHBpbmcobWl4ZWQga2V5LCBtaXhlZCB2YWx1ZXMsIG1hcHBpbmcgb2xkKSB7CisgIGlmICghbWFwcGluZ3Aob2xkKSkgcmV0dXJuOworICBpZiAoIXBvaW50ZXJwKHZhbHVlcykpIHZhbHVlcyA9ICh7dmFsdWVzfSk7CisKKyAgLy8gd2VubiBkZXIgS2V5IG5vY2ggbmljaHQgZXhpc3RpZXJ0LCBpc3RzIGVpbmZhY2guCisgIGlmICghbWVtYmVyKG9sZCwga2V5KSkKKyAgICBtX2FkZChvbGQsIGtleSwgdmFsdWVzLi4uKTsgLy8gZmxhdHRlbiBvcGVyYXRvciAuLi4gY29vbC4gOy0pCisgIGVsc2UgeworICAgIC8vIHNvbnN0IG11ZXNzZW4gd2lyIHRldXJlIGhhbmRhcmJlaXQgbWFjaGVuLiBJbnNiLiB3ZWlsIGRpZSBWYWx1ZXMgZWluZW4KKyAgICAvLyBiZWxpZWJpZ2VuIERhdGVudHlwIGhhYmVuIGtvZW5uZW4sIHUuYS4gTWFwcGluZ3MsIHdlc3dlZ2VuIHdpciB3aWVkZXIKKyAgICAvLyByZWt1cnNpdiBBZGRUb0VudGl0eSgpIHJ1ZmVuIG11ZXNzZW4uCisgICAgZm9yKGludCBpPXNpemVvZih2YWx1ZXMpIDsgaS0tIDsgKSB7CisgICAgICBvbGRba2V5LGldID0gQWRkVG9FbnRpdHkob2xkW2tleSxpXSwgdmFsdWVzW2ldKTsKKyAgICB9CisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvc3RkL3RoaW5nL3V0aWwuYyBiL3N0ZC90aGluZy91dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQzNDY0MgotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC90aGluZy91dGlsLmMKQEAgLTAsMCArMSwxMTEgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyB0aGluZy91dGlsLmMgLS0gVXRpbGl0aWVzCisvLworLy8gJElkOiB1dGlsLmMgNjM2NiAyMDA3LTA3LTE1IDIxOjA2OjI0WiBaZXNzdHJhICQKKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlICIvc3lzL3RoaW5nL3V0aWwuaCIKKyNpbmNsdWRlICIvc3lzL3RoaW5nL3Byb3BlcnRpZXMuaCIKKworI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCitwdWJsaWMgdm9pZCBTaG93UHJvcExpc3Qoc3RyaW5nICpwcm9wcykgCit7CisgIGludCBpLGo7CisKKyAgaj1zaXplb2YocHJvcHMpOworCisgIGZvciAoIGk9MDsgaTxqIDsgaSsrKSAKKyAgeworICAgIHdyaXRlKCIqIitwcm9wc1tpXSsiOiAiKTsKKyAgICBQcmV0dHlEdW1wKFF1ZXJ5UHJvcChwcm9wc1tpXSkpOworICAgIHdyaXRlKCJcbiIpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFByZXR0eUR1bXAobWl4ZWQgeCkgCit7CisgIGlmIChwb2ludGVycCh4KSkgCisgIHsKKyAgICBEdW1wQXJyYXkoeCk7CisgIH0KKyAgZWxzZSBpZiAobWFwcGluZ3AoeCkpCisgIHsKKyAgICBEdW1wTWFwcGluZyh4KTsKKyAgfQorICBlbHNlIGlmIChvYmplY3RwKHgpKSAKKyAgeworICAgIHdyaXRlICgiT0JKKCIrb2JqZWN0X25hbWUoeCkrIikiKTsKKyAgfQorICBlbHNlIGlmIChzdHJpbmdwKHgpKQorICB7CisgICAgd3JpdGUoIlwiIit4KyJcIiIpOworICB9CisgIGVsc2UKKyAgeworICAgIHdyaXRlICh4KTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBEdW1wQXJyYXkobWl4ZWQgKngpIAoreworICBpbnQgaSxqOworCisgIHdyaXRlICgiKHsgIik7CisgIGlmICggKGo9c2l6ZW9mKHgpKT4wICkKKyAgeworICAgIGZvciAoIGk9MCA7IGk8KGotMSkgOyBpKyspIAorICAgIHsKKyAgICAgIFByZXR0eUR1bXAoeFtpXSk7CisgICAgICB3cml0ZSgiLCAiKTsKKyAgICB9CisgICAgUHJldHR5RHVtcCh4W2ldKTsKKyAgICB3cml0ZSgiICIpOworICB9CisgIHdyaXRlICgifSkiKTsKK30KKworc3RhdGljIHZvaWQgRHVtcE1hcHBpbmcobWFwcGluZyB4KQoreworICBpbnQgICBpLCBjLCBzOworICBtaXhlZCAqaW5kOworCisgIHdyaXRlKCIoWyAiKTsKKworICBpZiAoIChjPXNpemVvZihpbmQ9bV9pbmRpY2VzKHgpKSk8MSApCisgIHsKKyAgICB3cml0ZSgiIF0pIik7CisgICAgcmV0dXJuOworICB9CisKKyAgcz1nZXRfdHlwZV9pbmZvKHgsMSk7CisKKyAgRHVtcEtleVZhbFBhaXIoeCwgaW5kWzBdLCBzKTsKKyAgZm9yICggaT0xIDsgaTxjIDsgaSsrICkKKyAgeworICAgIHdyaXRlKCIsICIpOworICAgIER1bXBLZXlWYWxQYWlyKHgsIGluZFtpXSwgcyk7CisgIH0KKyAgd3JpdGUoIiBdKSIpOworfQorCisvLyBMYWNodCBuaWNodCB1ZWJlciBkZW4gTmFtZW4hISEgLUJvaW5nCisvLyBOZWluLCB1ZWJlciBkZW4gTmFtZW4gbGFjaGUgaWNoIG5pY2h0IC4uLiAtUGFyYWNlbHN1cworc3RhdGljIHZvaWQgRHVtcEtleVZhbFBhaXIobWFwcGluZyB4LCBtaXhlZCBrZXksIGludCBzaXplKQoreyBpbnQgaiwgdmM7CisKKyAgUHJldHR5RHVtcChrZXkpOworICB3cml0ZSgiIDogIik7CisgIFByZXR0eUR1bXAoeFtrZXksMF0pOworCisgIGZvciAoIGo9MTsgajxzaXplOyBqKyspCisgIHsKKyAgICB3cml0ZSgiOyAiKTsKKyAgICBQcmV0dHlEdW1wKHhba2V5LCBqXSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3N0ZC90cmFkaW5nX3ByaWNlLmMgYi9zdGQvdHJhZGluZ19wcmljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZmM5NmMKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvdHJhZGluZ19wcmljZS5jCkBAIC0wLDAgKzEsMTc0IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gdHJhZGluZ19wcmljZS5jIC0tIFByZWlzdmVyaGFsdGVuIHZvbiBMYWVkZW4gdW5kIEhhZW5kbGVybgorLy8KKy8vICRJZDogdHJhZGluZ19wcmljZS5jLHYgMy4zIDIwMDIvMDYvMDkgMTk6NTE6NDAgVGlsbHkgRXhwICQKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDx0aGluZy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8YmFuay5oPgorCisjdW5kZWYgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCisvLyBUT0RPOiBsYW5nZnJpc3RpZyB6dSBwcml2YXRlIGFlbmRlcm4/Citub3NhdmUgaW50IGJ1eWZhY3QsIHNob3BfcGVyY2VudF9sZWZ0LCBteW1vbmV5LCB3YW50dG8sIGxhc3Q7Citwcml2YXRlIG5vc2F2ZSBpbnQgd2FudHRocmVzaCwgbWF4bnVtOworCit2YXJhcmdzIGludCBTZXRUcmFkaW5nRGF0YShpbnQgbW9uZXksIGludCBmYWN0b3IsIGludCBtYXhvYnMpCit7CisgIGlmIChleHRlcm5fY2FsbCgpICYmIHByZXZpb3VzX29iamVjdCgpICE9IHRoaXNfb2JqZWN0KCkpCisgICAgbG9nX2ZpbGUoIlpFTlRSQUxCQU5LIixzcHJpbnRmKCJJTklUSUFMSVpFOiAlTyBnb3QgKCVkLCVkLCVkKSBmcm9tICVPICglTylcbiIsCisJCQkJICAgdGhpc19vYmplY3QoKSwgbW9uZXksZmFjdG9yLG1heG9icywKKwkJCQkgICBwcmV2aW91c19vYmplY3QoKSx0aGlzX3BsYXllcigpKSk7CisKKyAgaWYgKG1vbmV5IDwgMTAwMCkKKyAgICBtb25leSA9IDEwMDA7CisKKyAgbGFzdD13YW50dG89bXltb25leT1tb25leTsKKyAgd2FudHRocmVzaD13YW50dG8vMjsKKyAgaWYgKHdhbnR0aHJlc2ggPCA1MDAwKQorICAgIHdhbnR0aHJlc2ggPSA1MDAwOworCisgIGlmIChmYWN0b3IgPCAxMDApCisgICAgYnV5ZmFjdCA9IDMwMDsKKyAgZWxzZQorICAgIGJ1eWZhY3QgPSBmYWN0b3I7CisgIAorICBpZiAobWF4b2JzIDwgMSkKKyAgICBtYXhudW09MzsKKyAgZWxzZQorICAgIG1heG51bT1tYXhvYnM7CisgIAorICByZXR1cm4gbXltb25leTsKK30KKwordm9pZCBTZXRCdXlGYWN0KGludCBpKQoreworICBidXlmYWN0PWkqMTAwOworfQorCit2YXJhcmdzIGludCBRdWVyeUJ1eUZhY3Qob2JqZWN0IGNsaWVudCkKK3sKKyAgcmV0dXJuIGJ1eWZhY3Q7Cit9CisKK2ludCBJbmZsYXRlU2VsbFZhbHVlKGludCB2YWx1ZSwgaW50IGNudCkKK3sKKyAgY250LT1tYXhudW07CisgIGlmIChjbnQ8MCkgY250PTA7CisgIHJldHVybiB2YWx1ZS0odmFsdWUqY250KS8oY250KzI1KTsKK30KKworaW50IFRydW5jYXRlU2VsbFZhbHVlKGludCB2YWx1ZSkKK3sKKyAgaWYgKHZhbHVlID4gNTAwKSB7CisgICAgdmFsdWUtPTUwMDsKKyAgICB2YWx1ZSA9ICgoMTAwMCp2YWx1ZSkvKHZhbHVlKzEwMDApKSs1MDA7CisgIH0KKyAgcmV0dXJuIHZhbHVlOworfQorCitpbnQgT2JqZWN0Q291bnQob2JqZWN0IG9iKQoreworICByZXR1cm4gb2JqZWN0cChvYik7IC8vIDAgb2RlciAxCit9CisKK3ZhcmFyZ3MgaW50IFF1ZXJ5VmFsdWUob2JqZWN0IG9iLCBpbnQgdmFsdWUsIG9iamVjdCBjbGllbnQpCit7CisgIHZhbHVlPVRydW5jYXRlU2VsbFZhbHVlKEluZmxhdGVTZWxsVmFsdWUodmFsdWUsT2JqZWN0Q291bnQob2IpKSk7CisgIGlmICgzKnZhbHVlPm15bW9uZXkpCisgIHsKKyAgICBsb2dfZmlsZSgiTEFERU4iLHNwcmludGYoIk91dCBvZiBtb25leTogJU8gZm9yICVPICglcylcbiIsdGhpc19vYmplY3QoKSwKKwkJCSAgICAgdGhpc19wbGF5ZXIoKSxkdGltZSh0aW1lKCkpWzUuLl0pKTsKKyAgICB2YWx1ZT1teW1vbmV5LzM7CisgIH0KKyAgaWYgKHZhbHVlPDApIHZhbHVlPTA7CisgIAorICAvKiAgIFByZWlzdmVyZmFsbCB2b24gYmVzY2hhZWRpZ3Rlbk9iamVrdGVuIGdsZWljaCBoaWVyIGZlc3RsZWdlbiAgKi8KKworICBpZih2YWx1ZSAmJiBvYi0+UXVlcnlQcm9wKFBfREFNQUdFRCkpICAKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgaWYob2ItPlF1ZXJ5UHJvcChQX1dDKSB8fCBvYi0+UXVlcnlQcm9wKFBfQUMpKQorICAgIHsKKyAgICAgIHZhbHVlID0gKDYgKiAodmFsdWUgLyAxMCkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgdmFsdWUgPSAoNCAqICh2YWx1ZSAvIDEwKSk7CisgICAgfQorICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgcmV0dXJuIHZhbHVlOworfQorCit2YXJhcmdzIGludCBRdWVyeVNlbGxWYWx1ZShvYmplY3Qgb2IsIG9iamVjdCBjbGllbnQpCit7CisgIHJldHVybiBRdWVyeVZhbHVlKG9iLG9iLT5RdWVyeVByb3AoUF9WQUxVRSksY2xpZW50KTsKK30KKwordmFyYXJncyBpbnQgUXVlcnlCdXlWYWx1ZShtaXhlZCBvYiwgb2JqZWN0IGNsaWVudCkKK3sKKyAgLy8gTWl0IFJ1bmRlbi4KKyAgcmV0dXJuIChvYi0+UXVlcnlQcm9wKFBfVkFMVUUpKlF1ZXJ5QnV5RmFjdChjbGllbnQpICsgNTApLzEwMDsKK30KKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgU2V0UHJvcChQX1NIT1BfUEVSQ0VOVF9MRUZULCAwKTsKKyAgU2V0VHJhZGluZ0RhdGEoNTAwMDAsMzAwLDMpOworfQorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGVfc3VwZXIoKSB7CisgIHNldF9uZXh0X3Jlc2V0KC0xKTsKK30KKwordm9pZCByZXNldCgpCit7CisgIFNldFByb3AoUF9TSE9QX1BFUkNFTlRfTEVGVCwgMCk7CisKKyAgaWYgKGxhc3QvMz5teW1vbmV5KQorICAgIHdhbnR0bz13YW50dG8qMTEwLzEwMDsKKyAgZWxzZQorICAgIGlmIChsYXN0LzI8bXltb25leSkKKyAgICAgIHdhbnR0bz13YW50dG8qODUvMTAwOworICBpZiAod2FudHRvPHdhbnR0aHJlc2gpIHdhbnR0bz13YW50dGhyZXNoKzUwMDsKKyAgaWYgKHdhbnR0bz4xNTAwMDAwKSB3YW50dG89MTUwMDAwMDsKKyAgaWYgKHdhbnR0bzxteW1vbmV5KQorICB7CisgICAgWkVOVFJBTEJBTkstPlBheUluKG15bW9uZXktd2FudHRvKTsKKyAgICBteW1vbmV5PXdhbnR0bzsKKyAgfSBlbHNlCisgICAgbXltb25leSs9WkVOVFJBTEJBTkstPldpdGhEcmF3KHdhbnR0by1teW1vbmV5KTsKKyAgbGFzdD1teW1vbmV5OworfQorCit2b2lkIF9hZGRfbW9uZXkoaW50IGkpIHsKKyAgaWYgKGV4dGVybl9jYWxsKCkgJiYgcHJldmlvdXNfb2JqZWN0KCkgIT0gdGhpc19vYmplY3QoKSkKKyAgICBsb2dfZmlsZSgiWkVOVFJBTEJBTksiLHNwcmludGYoIiVzOiBUUkFOU0ZFUjogJU8gZ290ICVkIGZyb20gJU9cbiIsCisJc3RyZnRpbWUoIiVIOiVNIiksIHRoaXNfb2JqZWN0KCksIGksIHByZXZpb3VzX29iamVjdCgpKSk7CisgIG15bW9uZXkrPWk7Cit9CisKK2ludCBfc2V0X3Nob3BfcGVyY2VudF9sZWZ0KGludCBkdW1teSkgeworICByZXR1cm4gc2hvcF9wZXJjZW50X2xlZnQ9WkVOVFJBTEJBTkstPl9xdWVyeV9zaG9wX3BlcmNlbnRfbGVmdCgpOworfQorCitpbnQgX3F1ZXJ5X3Nob3BfcGVyY2VudF9sZWZ0KCkgeworICByZXR1cm4gc2hvcF9wZXJjZW50X2xlZnQ7Cit9CisKK2ludCBfcXVlcnlfY3VycmVudF9tb25leSgpIHsKKyAgcmV0dXJuIG15bW9uZXk7Cit9CisKK2ludCBfcXVlcnlfd2FudHRvKCkgeworICByZXR1cm4gd2FudHRvOworfQorCisKZGlmZiAtLWdpdCBhL3N0ZC90cmFuc3BvcnQuYyBiL3N0ZC90cmFuc3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmZlMWUwCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3RyYW5zcG9ydC5jCkBAIC0wLDAgKzEsNTIxIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gdHJhbnNwb3J0LmMgLS0gQmFzaXNrbGFzc2UgZnVlciBTY2hpZmZlIHVuZCBhZWhubGljaGUgVHJhbnNwb3J0ZXIKKy8vCisvLyAkSWQ6IHRyYW5zcG9ydC5jIDk0MDAgMjAxNS0xMi0xMSAyMTo1NjoxNFogWmVzc3RyYSAkCisjcHJhZ21hIHN0cm9uZ190eXBlcworLy8jcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKworaW5oZXJpdCAiL3N0ZC90aGluZy9tb3ZpbmciOworaW5oZXJpdCAiL3N0ZC9yb29tIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDx0cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDxyZWdleHAuaD4KKworLyogdHJhbnNwb3J0LmMKKyAqIAorICogVWViZXJhcmJlaXRldGUgdW5kIAorICogZXJ3ZWl0ZXJ0ZSBWZXJzaW9uIDogVGlsbHlATW9yZ2VuR3JhdWVuLCAxMC4wMS4wMgorICogQmFzaWVyZW5kIGF1ZiAgICAgIDogdHJhbnNwb3J0LmNAU2lsYmVyTGFuZCAoV29vZHlAU2lsYmVyTGFuZCksIDA1LjEyLjk5CisgKiBCYXNpZXJlbmQgYXVmICAgICAgOiBIYXRlcyB1bmQgUnVtYXRhcyBnZW5lcmlzY2hlcyBUcmFuc3BvcnQgT2JqZWt0CisgKiAgICAgICAgICAgICAgICAgICAgICBNb3JnZW5HcmF1ZW4gMTUuMDIuOTMKKyAqLworICAgICAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqIFZhcmlhYmxlbiAqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvLyBUT0RPOiBsYW5nZnJpc3RpZyB3YWVyIGphIHByaXZhdGUgc2Nob2VuLi4uCisvLworLy8gRGF0ZW5zdHJ1a3R1ciB2b24gJ3JvdXRlJyAoYmVpIEhQX1JPT00pCisvLyAwICh7c3RyaW5nIElELCAgICAgIDogSFBfUk9PTQorLy8gMSAgIHN0cmluZyByb29tLCAgICA6IERhdGVpbmFtZSBaaWVscmF1bQorLy8gMiAgIGludCBzdGF5LCAgICAgICA6IERhdWVyIEhhbHRlemVpdAorLy8gMyAgIGludCBuZXh0LCAgICAgICA6IERhdWVyIG5hZWNoc3RlIEZhaHJ0emVpdAorLy8gNCAgIHN0cmluZyBjb2RlLCAgICA6IEhhbHRlc3RlbGxlbm5hbWUgZnVlciBRdWVyeUFycml2ZWQKKy8vIDUgICBtaXhlZCBkZXN0LCAgICAgOiBIYWx0ZXN0ZWxsZW4tSURzIGZ1ZXIgSGFzUm91dGUgKHJlaXNlIG5hY2gpCisvLyA2ICAgbWl4ZWQgZGVzdHN0ciB9KTogdW5iZW51dHp0LgorLy8KKy8vIERhdGVuc3RydWt0dXIgdm9uICdyb3V0ZScgKGJlaSBIUF9NU0csIEhQX0ZVTikKKy8vIDAgKHtzdHJpbmcgSUQsICAgICAgOiBIUF9NU0cKKy8vIDEgICBzdHJpbmcgbWVzc2FnZSwgOiBNZWxkdW5nICAgIG9kZXIgICAgc3RyaW5nIGZ1biA6IEZ1bmt0aW9uc25hbWUKKy8vIDIgICBpbnQgbmV4dH0pICAgICAgOiBEYXVlciBiaXMgenVtIG5hZWNoc3RlbiBFcmVpZ25pcworbm9zYXZlIG1peGVkICpyb3V0ZTsgICAgLyogTGlzdGUgZGVyIEhhbHRlcHVua3RlLiAqLworbm9zYXZlIGludCBycG9zOyAgICAgICAgLyogTW9tZW50YW5lIFBvc2l0aW9uIGluIG9iaWdlciBMaXN0ZS4gKi8KK25vc2F2ZSBzdHJpbmcgcm9vbUNvZGU7IC8qIENvZGUgZGVzIGFrdHVlbGxlbiBSYXVtZXMgKG9kZXIgMCkuICovCisKKy8qCisgKioqKioqKioqKiBNYW5hZ2VtZW50IGRlciBidWlsdGluLXByb3BlcnRpZXMgKioqKioqKioqKgorICovCisKK3N0cmluZyBfcXVlcnlfc2hvcnQoKQoreyAKKyAgaWYgKHJvb21Db2RlKSByZXR1cm4gUXVlcnkoUF9TSE9SVCk7IAorICByZXR1cm4gMDsgCit9CisKK21peGVkIF9xdWVyeV90cmFuc3BhcmVudCgpCit7IAorICBpZiAocm9vbUNvZGUpIHJldHVybiBRdWVyeShQX1RSQU5TUEFSRU5UKTsKKyAgcmV0dXJuIDA7IAorfQorCittaXhlZCAqX3NldF9yb3V0ZShtaXhlZCAqcikgeyByZXR1cm4gcm91dGUgPSByOyB9CittaXhlZCAqX3F1ZXJ5X3JvdXRlKCkgICAgICAgeyByZXR1cm4gcm91dGU7IH0KKworLyoKKyAqKioqKioqKioqKioqKioqIFp1Z3JpZmZzZnVua3Rpb25lbiAqKioqKioqKioqKioqKioKKyAqLworCit2b2lkIEhhbHQoKQoreworICB3aGlsZSAocmVtb3ZlX2NhbGxfb3V0KCAiY2hhbmdlSHAiICk+LTEpOworICB3aGlsZSAocmVtb3ZlX2NhbGxfb3V0KCAiZGlzY29ubmVjdCIgKT4tMSk7Cit9CisKKy8vIEFrdHVhbGlzaWVydC9TZXR6dCBkaWUgUm91dGUgaW0gVHJhdmVsRCwgd2VubiBlcmxhdWJ0IChkLmguIGtlaW4KKy8vIFBfTk9fVFJBVkVMSU5HKQorcHJpdmF0ZSB2b2lkIFJlcG9ydFJvdXRlKCkKK3sKKyAgaWYoIVF1ZXJ5UHJvcChQX05PX1RSQVZFTElORykpCisgIHsKKyAgICBtaXhlZCB0bXAgPSBmaWx0ZXIocm91dGUsIGZ1bmN0aW9uIGludCAobWl4ZWQgYXJyKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIGFyclswXSA9PSBIUF9ST09NOworICAgICAgICB9ICk7CisgICAgc3RyaW5nICpyb3V0ZSA9IG1hcCh0bXAsIGZ1bmN0aW9uIHN0cmluZyAobWl4ZWQgYXJyKQorICAgICAgICB7IHJldHVybiBhcnJbMV07IH0KKyAgICAgICAgKTsKKyAgICBUUkFWRUxELT5BZGRSb3V0ZShvYmplY3RfbmFtZSh0aGlzX29iamVjdCgpKSxyb3V0ZSk7CisgIH0KK30KKwordmFyYXJncyB2b2lkIFN0YXJ0KGludCBwb3MpCit7CisgIEhhbHQoKTsKKyAgcnBvcyA9IChwb3MgPj0gc2l6ZW9mKHJvdXRlKSk/LTE6cG9zLTE7CisgIGNhbGxfb3V0KCJjaGFuZ2VIcCIsMCk7CisgIC8vIFRlbGwgVFJBVkVMRCBvdXIgY3VycmVudCByb3V0ZQorICBSZXBvcnRSb3V0ZSgpOworfQorCit2b2lkIFNldFRyYXZlbENtZHMoKQoreworICBpZiAocG9pbnRlcnAoUXVlcnlQcm9wKFBfTEVBVkVDTURTKSkpCisgICAgIEFkZENtZChRdWVyeVByb3AoUF9MRUFWRUNNRFMpLCJHb091dHNpZGUiKTsKKyAgaWYgKHBvaW50ZXJwKFF1ZXJ5UHJvcChQX0VOVEVSQ01EUykpKQorICAgIEFkZENtZChRdWVyeVByb3AoUF9FTlRFUkNNRFMpLCJHb0luc2lkZSIpOworICBpZiAocG9pbnRlcnAoUXVlcnlQcm9wKFBfVFJBVkVMX0NNRFMpKSkKKyAgICBBZGRDbWQoUXVlcnlQcm9wKFBfVFJBVkVMX0NNRFMpLCJHb0luQW5kT3V0c2lkZSIpOworICByZXR1cm47Cit9CisKK21peGVkIEhhc1JvdXRlKG1peGVkIGRlc3QpCit7CisgIGludCBpLHMsejsKKyAgc3RyaW5nIHN0cjsKKyAgb2JqZWN0IG9iOworICBtaXhlZCBoYXJiOworICAKKyAgcyA9IHNpemVvZihyb3V0ZSk7CisKKyAgZm9yIChpID0gcnBvcztpIDw9IHJwb3Mrcy0xO2krKykKKyAgeworICAgIGlmIChyb3V0ZVtpJXNdWzBdID09IEhQX1JPT00pCisgICAgeworICAgICAgaWYgKG1lbWJlcihyb3V0ZVtpJXNdWzVdLGRlc3QpICE9IC0xICYmCisgICAgICAgICAgb2JqZWN0cChvYj1sb2FkX29iamVjdChyb3V0ZVtpJXNdWzFdKSkgJiYKKyAgICAgICAgICBwb2ludGVycChoYXJiPW9iLT5RdWVyeVByb3AoUF9IQVJCT1VSKSkgJiYKKyAgICAgICAgICBzaXplb2YoaGFyYikpCisgICAgICB7CisgICAgICAgIHJldHVybiAoeyByb3V0ZVtpJXNdWzFdLCBoYXJiWzBdIH0pOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworcHVibGljIHZhcmFyZ3Mgdm9pZCBBZGRSb3V0ZShzdHJpbmcgcm9vbSwgaW50IHN0YXksIGludCBuZXh0LCAKKyAgICBzdHJpbmcgaGFyYm91cl9kZXNjLCBzdHJpbmd8c3RyaW5nKiBkZXN0X2lkcywgc3RyaW5nIGRlc3RzdHIpCit7CisgIC8vIERhdGVuIGF1cyBkZW0gWmllbGFubGVnZXIgYWJmcmFnZW4uCisgIDxzdHJpbmd8c3RyaW5nKj4qIGhhcmJvdXIgPSByb29tLT5RdWVyeVByb3AoUF9IQVJCT1VSKXx8KHt9KTsKKyAgc3RyaW5nKiBoYXJib3VyX2lkcyA9ICh7fSk7CisKKyAgLy8gSURzIGRlcyBaaWVsYW5sZWdlcnMgZnVlciBTeW50YXhwcnVlZnVuZyAKKyAgaWYgKCBzaXplb2YoaGFyYm91cik9PTIgKQorICB7CisgICAgaWYgKCBwb2ludGVycChoYXJib3VyWzFdKSApCisgICAgICBoYXJib3VyX2lkcyA9IGhhcmJvdXJbMV07CisgICAgZWxzZQorICAgICAgaGFyYm91cl9pZHMgPSAoe2hhcmJvdXJbMV19KTsKKyAgfQorICAKKyAgLy8gPGRlc3RfaWRzPiBpbiBlaW4gQXJyYXkgdW13YW5kZWxuLCBpc3QgZGFubiBnZ2YuIGxlZXIKKyAgaWYgKCAhZGVzdF9pZHMgKQorICB7CisgICAgZGVzdF9pZHMgPSAoe30pOworICB9CisgIGlmICggc3RyaW5ncChkZXN0X2lkcykgKQorICB7CisgICAgZGVzdF9pZHMgPSAoe2Rlc3RfaWRzfSk7CisgIH0KKworICAvLyBleHBsaXppdCBhbmdlZ2ViZW5lIElEcyBzdGVoZW4gamV0enQgaW4gPGRlc3RfaWRzPiwgZGllIElEcyBkZXMgCisgIC8vIFppZWxoYWZlbnMgYXVzIFBfSEFSQk9VUiB3ZXJkZW4gYWRkaWVydC4KKyAgZGVzdF9pZHMgKz0gaGFyYm91cl9pZHM7CisKKyAgLy8gSXN0IDxkZXN0PiBpbW1lciBub2NoIGxlZXIsIHZlcnN1Y2hlbiB3aXIsIGF1cyA8aGFyYm91cl9kZXNjPiBlaW4gcGFhcgorICAvLyBTdGljaHdvZXJ0ZXIgenUgZXJ6ZXVnZW4sIGRpZSBtYW4gYWxzIFppZWxhbmdhYmUgaW4gZGVyIFN5bnRheCAKKyAgLy8gInJlaXNlIG5hY2ggPHppZWw+IiB2ZXJ3ZW5kZW4ga2Fubi4KKyAgaWYgKCAhc2l6ZW9mKGRlc3RfaWRzKSApCisgIHsKKyAgICAvLyBHcm9zc2dlc2NocmllYmVuZSBCZWdyaWZmZSBpbiA8aGFyYm91cl9kZXNjPiBpbiA8ZGVzdD4gZWludHJhZ2VuLiBEYXp1OgorICAgIC8vIDEpIDxjb2RlPiBlcnN0bWFsIHNvIHplcnNjaG5laWRlbiwgZGFzcyBhbGxlIHVlYmxpY2hlbiBTYXR6emVpY2hlbgorICAgIC8vIHJhdXNmbGllZ2VuIChlcyBnaWJ0IFRyYW5zcG9ydGVyLCBkaWUgc293YXMgaW4gPGhhcmJvdXJfZGVzYz4gCisgICAgLy8gdWViZXJnZWJlbikuCisgICAgZGVzdF9pZHMgPSByZWdleHBsb2RlKGhhcmJvdXJfZGVzYywgIlsoKSwuOzomXCtfIF0iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUkVfT01JVF9ERUxJTXxSRV9HTE9CQUwpOworICAgIC8vIDJhKSBTbyBmaWx0ZXJuLCBkYXNzIG51ciBncm9zc2dlc2NocmllYmVuZSBXb2VydGVyIHVlYnJpZyBibGVpYmVuLAorICAgIC8vICAgICB2b24gMSkgdWVicmlnZ2VibGllYmVuZSBMZWVyc3RyaW5ncyBnbGVpY2ggbWl0IHdlZ3dlcmZlbi4KKyAgICAvLyAyYikgRXJnZWJuaXMga2xlaW5zY2hyZWliZW4sIGRhbWl0IGRpZSBTeW50YXhwcnVlZnVuZyBkYW1pdCBhcmJlaXRlbgorICAgIC8vICAgICBrYW5uLgorICAgIGRlc3RfaWRzID0gbWFwKCBmaWx0ZXIoZGVzdF9pZHMsIGZ1bmN0aW9uIGludCAoc3RyaW5nIGtleSkgeyAKKyAgICAgICAgICAgICAgICAgIHJldHVybiAoa2V5IT0iIiAmJiBrZXlbMF0+PSdBJyAmJiBrZXlbMF08PSdaJyk7CisgICAgICAgICAgICAgICB9KSwgIydsb3dlcl9jYXNlKTsKKyAgfQorICAvLyBTb2xsdGUgPGRlc3Q+IGpldHp0IGltbWVyIG5vY2ggbGVlciBzZWluLCB3dXJkZSBhbiBhbGxlbiBkcmVpIFN0ZWxsZW4KKyAgLy8gbmljaHRzIG9kZXIgbnVyIE11ZWxsIHVlYmVyZ2ViZW4uCisgIGlmICggIXNpemVvZihkZXN0X2lkcykgKQorICB7CisgICAgcmFpc2VfZXJyb3IoIlRyYW5zcG9ydGVyZmVobGZ1bmt0aW9uIGluIEFkZFJvdXRlKCk6IElkZW50aWZpa2F0aW9ucyIKKyAgICAgICJtYXRyaXggdW56dXJlaWNoZW5kIGRlZmluaWVydC4gVHJhbnNwb3J0ZXIgdW5iZW51dHpiYXIgZnVlciAiCisgICAgICAiU3BpZWxlci4gQml0dGUgbWluZGVzdGVucyBlaW5lIFppZWwtSUQgdmlhIFBfSEFSQk9VUiBvZGVyIGFscyAiCisgICAgICAiQXJndW1lbnQgdG8gQWRkUm91dGUoKS4iKTsKKyAgfQorICByb3V0ZSArPSAoeyAoeyBIUF9ST09NLCByb29tLCBzdGF5LCBuZXh0LCBoYXJib3VyX2Rlc2MsIGRlc3RfaWRzLCAKKyAgICAgICAgICAgICAgICAgZGVzdHN0ciB9KSB9KTsKK30KKwordmFyYXJncyB2b2lkIEFkZE1zZyhzdHJpbmcgbXNnLCBpbnQgbmV4dCkgCit7CisgIHJvdXRlICs9ICh7ICh7IEhQX01TRywgbXNnLCBuZXh0IH0pIH0pOyAKK30KKwordm9pZCBBZGRGdW4oc3RyaW5nIGZ1biwgaW50IG5leHQpIHsgcm91dGUgKz0gKHsgKHsgSFBfRlVOLCBmdW4sIG5leHQgfSkgfSk7IH0KKworc3RyaW5nIFF1ZXJ5QXJyaXZlZCgpIHsgcmV0dXJuIHJvb21Db2RlOyB9CisKK21peGVkKiBRdWVyeVBvc2l0aW9uKCkKK3sKKyAgcmV0dXJuICh7IHJvdXRlW3Jwb3NdWzFdLHJvdXRlWyhycG9zKzEpPHNpemVvZihyb3V0ZSk/KHJwb3MrMSk6MF1bMV0gfSk7Cit9CisKK29iamVjdCogUXVlcnlQYXNzZW5nZXJzKCkKK3sKKyAgcmV0dXJuIGZpbHRlcihhbGxfaW52ZW50b3J5KCksIydxdWVyeV9vbmNlX2ludGVyYWN0aXZlKTsgCit9CisKK3ZhcmFyZ3Mgc3RyaW5nICpRdWVyeUhhcmJvdXJzKGludCB0ZXh0ZmxhZykKK3sKKyAgc3RyaW5nICpyZXQgPSAoe30pOworCisgIGZvcmVhY2goIG1peGVkKiBlbnRyeSA6IHJvdXRlICkKKyAgeworICAgIGlmICggZW50cnlbMF0gPT0gSFBfUk9PTSApCisgICAgeworICAgICAgaWYgKCB0ZXh0ZmxhZyApCisgICAgICB7CisgICAgICAgIHN0cmluZyAqaHBfaWRzID0gZW50cnlbMV0tPlF1ZXJ5UHJvcChQX0hBUkJPVVIpWzFdOworICAgICAgICBpZiAocG9pbnRlcnAoaHBfaWRzKSAmJiBzaXplb2YoaHBfaWRzKSkKKyAgICAgICAgeworICAgICAgICAgIHN0cmluZyAqaCA9IG1hcCggZXhwbG9kZShocF9pZHNbMF0sIiAiKSwgIydjYXBpdGFsaXplKTsKKyAgICAgICAgICByZXQgKz0gKHsgaW1wbG9kZShoLCAiICIpIH0pOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHJldCArPSAoeyBlbnRyeVsxXSB9KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworLy8gYmVpbSB6ZXJzdG9lcmVuIHNvbGx0ZSBhdWNoIGRpZSByb3V0ZSB1bmQgZGVyIFRyYW5zcG9ydGVyIGF1cyBkZW0gdHJhdmVsZAorLy8gYWJnZW1lbGRldCB3ZXJkZW4uCitwdWJsaWMgdmFyYXJncyBpbnQgcmVtb3ZlKGludCBzaWxlbnQpCit7CisgIFRSQVZFTEQtPlJlbW92ZVRyYW5zcG9ydGVyKHRoaXNfb2JqZWN0KCkpOworICByZXR1cm4gOjpyZW1vdmUoc2lsZW50KTsKK30KKwordm9pZCBSZW1vdmVSb3V0ZSgpCit7CisgIEhhbHQoKTsKKyAgcm91dGUgPSAoeyB9KTsKKyAgcnBvcyAgPSAgIDA7CisgIFRSQVZFTEQtPlJlbW92ZVRyYW5zcG9ydGVyKHRoaXNfb2JqZWN0KCkpOworfQorCit2YXJhcmdzIGludCBFbnRlcihvYmplY3Qgd2hvKQoreworICBzdHJpbmcgKmVtc2c7CisgIG1peGVkIGVmYWlsOworCisgIGlmICghb2JqZWN0cCh3aG8pKSB3aG8gPSB0aGlzX3BsYXllcigpOworICBpZiAoZW52aXJvbm1lbnQod2hvKSA9PSB0aGlzX29iamVjdCgpKQorICB7CisgICAgdGVsbF9vYmplY3Qod2hvLCJEYSBiaXN0IER1IGRvY2ggYmVyZWl0cywgc2Nob24gdmVyZ2Vzc2VuP1xuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKCFRdWVyeUFycml2ZWQoKSkgcmV0dXJuIDA7CisgIGlmIChRdWVyeVByb3AoUF9NQVhfUEFTU0VOR0VSUykgJiYgCisgICAgIChzaXplb2YoUXVlcnlQYXNzZW5nZXJzKCkpID49IFF1ZXJ5UHJvcChQX01BWF9QQVNTRU5HRVJTKSkpCisgIHsKKyAgICBpZiAocG9pbnRlcnAoZWZhaWw9UXVlcnlQcm9wKFBfRU5URVJGQUlMKSkpCisgICAgeworICAgICAgaWYgKHNpemVvZihlZmFpbCkgPT0gMikKKyAgICAgICAgdGVsbF9yb29tKHRoaXNfb2JqZWN0KCksd2hvLT5OYW1lKFdFUiwyKSsiICIrcHJvY2Vzc19zdHJpbmcoZWZhaWxbMV0pKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi5cbiIsKHt3aG99KSk7ICAgICAgCisgICAgICB0ZWxsX29iamVjdCh3aG8scHJvY2Vzc19zdHJpbmcoZWZhaWxbMF0pKyIuXG4iKTsKKyAgICB9CisgICAgZWxzZSBpZiAoc3RyaW5ncChlZmFpbCkpCisgICAgICAgdGVsbF9vYmplY3Qod2hvLHByb2Nlc3Nfc3RyaW5nKGVmYWlsKSsiLlxuIik7CisgICAgZWxzZSBpZiAoY2xvc3VyZXAoZWZhaWwpKSBmdW5jYWxsKGVmYWlsKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICAKKyAgdGVsbF9vYmplY3Qod2hvLCJEdSBiZXRyaXR0c3QgIituYW1lKFdFTiwxKSsiLlxuIik7CisgIGlmIChwb2ludGVycChlbXNnPVF1ZXJ5UHJvcChQX0VOVEVSTVNHKSkgJiYgc2l6ZW9mKGVtc2cpID09IDIpCisgICAgIHJldHVybiB3aG8tPm1vdmUodGhpc19vYmplY3QoKSxNX0dPLCIiLHByb2Nlc3Nfc3RyaW5nKGVtc2dbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc19zdHJpbmcoZW1zZ1sxXSkpOworICByZXR1cm4gd2hvLT5tb3ZlKHRoaXNfb2JqZWN0KCksTV9HTywKKyAgICAgICAgbmFtZShXRU4sMSksImJldHJpdHQiLCJrb21tdCBoZXJlaW4iKTsKK30KKwordmFyYXJncyBpbnQgTGVhdmUob2JqZWN0IHdobykKK3sKKyAgc3RyaW5nICpsbXNnOworICBtaXhlZCBsZmFpbDsKKworICBpZiAoIW9iamVjdHAod2hvKSkgd2hvID0gdGhpc19wbGF5ZXIoKTsKKyAgaWYgKGVudmlyb25tZW50KHdobykgIT0gdGhpc19vYmplY3QoKSkKKyAgeworICAgIGlmIChRdWVyeUFycml2ZWQoKSkKKyAgICB7CisgICAgICB0ZWxsX29iamVjdCh3aG8sIkRhZnVlciBtdWVzc3Rlc3QgRHUgZXJzdG1hbCBkb3J0IHNlaW4uXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoIVF1ZXJ5QXJyaXZlZCgpKQorICB7IAorICAgIGlmIChsZmFpbD1RdWVyeVByb3AoUF9MRUFWRUZBSUwpKQorICAgIHsKKyAgICAgIGlmIChwb2ludGVycChsZmFpbCkgJiYgc2l6ZW9mKGxmYWlsKSkKKyAgICAgIHsKKyAgICAgICAgaWYgKHNpemVvZihsZmFpbCkgPT0gMikKKyAgICAgICAgICAgdGVsbF9yb29tKHRoaXNfb2JqZWN0KCksd2hvLT5OYW1lKFdFUiwyKSsiICIrcHJvY2Vzc19zdHJpbmcoCisgICAgICAgICAgICAgICBsZmFpbFsxXSkrIi5cbiIsKHt3aG99KSk7CisgICAgICAgIHRlbGxfb2JqZWN0KHdobyxwcm9jZXNzX3N0cmluZyhsZmFpbFswXSkrIi5cbiIpOworICAgICAgfQorICAgICAgZWxzZSBpZiAoc3RyaW5ncChsZmFpbCkpCisgICAgICAgIHRlbGxfb2JqZWN0KHdobyxwcm9jZXNzX3N0cmluZyhsZmFpbCkrIi5cbiIpOworICAgICAgZWxzZSBpZiAoY2xvc3VyZXAobGZhaWwpKSBmdW5jYWxsKGxmYWlsKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICB0ZWxsX29iamVjdCh3aG8sIkZlaGxlciBiZWltIFZlcmxhc3NlbiBkZXMgVHJhbnNwb3J0ZXJzLlxuIgorICAgICAgICAgICAgICAgICAgICAiQml0dGUgenVzdGFlbmRpZ2VuIE1hZ2llciB2ZXJzdGFlbmRpZ2VuLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBpZiAod2hvLT5RdWVyeVByb3AoUF9UUkFWRUxfSU5GTykpIHdoby0+U2V0UHJvcChQX1RSQVZFTF9JTkZPLDApOworICB0ZWxsX29iamVjdCh3aG8sIkR1IHZlcmxhZXNzdCAiK25hbWUoV0VOLDEpKyIuXG4iKTsKKyAgaWYgKHBvaW50ZXJwKGxtc2c9UXVlcnlQcm9wKFBfTEVBVkVNU0cpKSAmJiBzaXplb2YobG1zZykgPT0gMikKKyAgICAgIHJldHVybiB3aG8tPm1vdmUoZW52aXJvbm1lbnQoKSxNX0dPLCIiLHByb2Nlc3Nfc3RyaW5nKGxtc2dbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc19zdHJpbmcobG1zZ1sxXSkpOworICByZXR1cm4gd2hvLT5tb3ZlKGVudmlyb25tZW50KCksTV9HTywKKyAgICAgICAgICAgbmFtZShXRU4sMSksInZlcmxhZXNzdCIsImtvbW10IGhlcmVpbiIpOworfQorCisvKgorICoqKioqKioqKioqKioqKioqKiBJbnRlcm5hbCBGdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqCisgKi8KKworc3RhdGljIGludCBHb0luc2lkZShzdHJpbmcgc3RyKQoreworICBfbm90aWZ5X2ZhaWwoIldhcyBtb2VjaHRlc3QgRHUgZGVubiBnZW5hdT9cbiIpOworICBpZiAoc3RyaW5ncChzdHIpICYmIGlkKHN0cikpIHsKKyAgICAgIEVudGVyKCk7CisgICAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBHb091dHNpZGUoc3RyaW5nIHN0cikKK3sKKyAgX25vdGlmeV9mYWlsKCJXYXMgbW9lY2h0ZXN0IER1IGRlbm4gZ2VuYXU/XG4iKTsKKyAgaWYgKHN0cmluZ3Aoc3RyKSAmJiBpZChzdHIpKSB7CisgICAgICBMZWF2ZSgpOworICAgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgR29JbkFuZE91dHNpZGUoc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIHRvOworCisgIF9ub3RpZnlfZmFpbCgiV2FzIG1vZWNodGVzdCBEdSBkZW5uIGdlbmF1P1xuIik7CisgIGlmICghc2l6ZW9mKHN0cikpIHJldHVybiAwOyAgCisgIGlmICgoc3NjYW5mKHN0ciwiYXVmICVzIix0bykgPT0gMSB8fCBzc2NhbmYoc3RyLCJpbiAlcyIsdG8pID09IDEpICYmIGlkKHRvKSkKKyAgICByZXR1cm4gRW50ZXIoKSwxOworICBpZiAoKHNzY2FuZihzdHIsInZvbiAlcyIsdG8pID09IDEgfHwgc3NjYW5mKHN0ciwiYXVzICVzIix0bykgPT0gMSkgJiYgaWQodG8pKQorICAgIHJldHVybiBMZWF2ZSgpLDE7CisgIHJldHVybiAwOworfQorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICA6OmNyZWF0ZSgpOworCisgIHJvdXRlID0gKHt9KTsKKworICBTZXRQcm9wKFBfTEVBVkVGQUlMLCJEYXMgaXN0IG1vbWVudGFuIHZpZWwgenUgZ2VmYWVocmxpY2giKTsKKyAgU2V0UHJvcChQX0VOVEVSRkFJTCwiRG9ydCBpc3Qga2VpbiBQbGF0eiBtZWhyIGZ1ZXIgRGljaCIpOworICBTZXRQcm9wKFBfVFJBTlNQQVJFTlQsMSk7CisKKyAgQWRkSWQoIlRyYW5zcG9ydGVyIik7CisgIAorICBjYWxsX291dCgiU2V0VHJhdmVsQ21kcyIsMSk7Cit9CisKK3N0YXRpYyB2YXJhcmdzIHZvaWQgZGlzY29ubmVjdChpbnQgY2hhbmdlLCBpbnQgY2hhbmdlX3RpbWUpCit7CisgIG9iamVjdCByb29tOworICBtaXhlZCAqZGVwYXJ0bXNnOworCisgIGRlcGFydG1zZyA9IFF1ZXJ5UHJvcChQX0RFUEFSVE1TRyk7CisKKyAgaWYgKChyb29tID0gZW52aXJvbm1lbnQoKSkgJiYgcG9pbnRlcnAoZGVwYXJ0bXNnKSkKKyAgeworICAgIHRlbGxfcm9vbSh0aGlzX29iamVjdCgpLHByb2Nlc3Nfc3RyaW5nKGRlcGFydG1zZ1swXSkpOworICAgIHRlbGxfcm9vbShyb29tLHByb2Nlc3Nfc3RyaW5nKGRlcGFydG1zZ1sxXSkpOworICB9CisKKyAgcm9vbUNvZGUgPSAwOworCisgIGlmIChjaGFuZ2UpIGNhbGxfb3V0KCJjaGFuZ2VIcCIsY2hhbmdlX3RpbWUpOworfQorCitzdGF0aWMgdmFyYXJncyB2b2lkIGNvbm5lY3Qoc3RyaW5nIHJvb20sIHN0cmluZyBjb2RlKQoreworICBtaXhlZCAqYXJyaXZlbXNnLCAqdDsKKyAgb2JqZWN0ICp0cmF2LCBvYjsKKyAgc3RyaW5nICp0cnMsICptc2dzOworICBpbnQgaTsKKworICBpZiAocm9vbUNvZGUpIGRpc2Nvbm5lY3QoKTsKKyAgCisgIHJvb21Db2RlID0gY29kZT9jb2RlOiIiOworCisgIGlmIChjYXRjaChtb3ZlKHJvb20sTV9TSUxFTlR8TV9OT0NIRUNLKTtwdWJsaXNoKSkKKyAgeworICAgIHJvb21Db2RlID0gMDsKKyAgICByZXR1cm47CisgIH0KKworICBhcnJpdmVtc2cgPSBRdWVyeVByb3AoUF9BUlJJVkVNU0cpOworCisgIGlmIChwb2ludGVycChhcnJpdmVtc2cpKQorICB7CisgICAgdGVsbF9yb29tKHRoaXNfb2JqZWN0KCkscHJvY2Vzc19zdHJpbmcoYXJyaXZlbXNnWzBdKSk7CisgICAgdGVsbF9yb29tKHJvb20scHJvY2Vzc19zdHJpbmcoYXJyaXZlbXNnWzFdKSk7CisgIH0KKworICB0cmF2ID0gZmlsdGVyKGFsbF9pbnZlbnRvcnkodGhpc19vYmplY3QoKSksIydsaXZpbmcpOworCisgIGkgPSBzaXplb2YodHJhdik7CisgIHdoaWxlKGktLSkKKyAgeworICAgIGlmIChwb2ludGVycCh0ID0gdHJhdltpXS0+UXVlcnlQcm9wKFBfVFJBVkVMX0lORk8pKSYmCisgICAgICAgIHRbMF09PXRoaXNfb2JqZWN0KCkmJnRbMl09PXJvb20pCisgICAgeyAKKyAgICAgIGlmICh0cmF2W2ldLT5JbkZpZ2h0KCkpCisgICAgICAgIHRlbGxfb2JqZWN0KHRyYXZbaV0sYnJlYWtfc3RyaW5nKCJEdSBzb2xsdGVzdCBEZWluZW4gS2FtcGYgIgorICAgICAgICAgICAgICAgICJzY2huZWxsIGJlZW5kZW4sZGVubiBlaWdlbnRsaWNoIHdvbGx0ZXN0IER1IGhpZXIgIgorICAgICAgICAgICAgICAgICJhdXNzdGVpZ2VuLiIsNzgpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgTGVhdmUodHJhdltpXSk7CisgICAgICBpZiAoZW52aXJvbm1lbnQodHJhdltpXSkhPXRoaXNfb2JqZWN0KCkpCisgICAgICAgIHRyYXZbaV0tPlNldFByb3AoUF9UUkFWRUxfSU5GTywwKTsKKyAgICB9CisgIH0KKyAgdHJhdiA9IGZpbHRlcihhbGxfaW52ZW50b3J5KGZpbmRfb2JqZWN0KHJvb20pKS10cmF2LCMnbGl2aW5nKTsKKyAgaT1zaXplb2YodHJhdik7CisgIHdoaWxlKGktLSkKKyAgeworICAgIGlmIChvYmplY3RwKHRyYXZbaV0pICYmIHBvaW50ZXJwKHQgPSB0cmF2W2ldLT5RdWVyeVByb3AoUF9UUkFWRUxfSU5GTykpJiYKKyAgICAgICAgdFswXSA9PSBlbnZpcm9ubWVudCh0cmF2W2ldKSAmJiB0WzFdID09IHRoaXNfb2JqZWN0KCkpCisgICAgeworICAgICAgaWYgKCB0cmF2W2ldLT5JbkZpZ2h0KCkgKQorICAgICAgICB0ZWxsX29iamVjdCh0cmF2W2ldLAorICAgICAgICAgICBicmVha19zdHJpbmcoIkR1IHNvbGx0ZXN0IERlaW5lbiBLYW1wZiBzY2huZWxsIGJlZW5kZW4sIGRlbm4gIgorICAgICAgICAgICAgICAgICAgICAgICAgImVpZ2VudGxpY2ggd29sbHRlc3QgRHUgbWl0ICIrbmFtZShXRU0sMSkrCisgICAgICAgICAgICAgICAgICAgICAgICAiIHJlaXNlbi4iLDc4KSk7CisgICAgICBlbHNlCisgICAgICAgIEVudGVyKHRyYXZbaV0pOworICAgICAgaWYgKGVudmlyb25tZW50KHRyYXZbaV0pID09IHRoaXNfb2JqZWN0KCkpIAorICAgICAgeworICAgICAgICB0WzBdID0gdGhpc19vYmplY3QoKTsKKyAgICAgICAgdHJhdltpXS0+U2V0UHJvcChQX1RSQVZFTF9JTkZPLHQpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisvLyB0aGlzIG9iamVjdCBuZXZlciBwZXJmb3JtcyBhbnkgY2xlYW4tdXAsIHRoZSBkcml2ZXIgc2hvdWxkIG5vdCBjYWxsIGl0CisvLyBhZ2Fpbi4KK2ludCBjbGVhbl91cChpbnQgYXJnKSB7IHJldHVybiAwOyB9CisKK3ZvaWQgY2hhbmdlSHAoKQoreworICBpZiAoKytycG9zID09IHNpemVvZihyb3V0ZSkpCisgIHsKKyAgICBycG9zID0gMDsKKyAgICAvL1RSQVZFTEQgZGllIGFrdHVlbGxlIFJvdXRlIHVlYmVybWl0dGVsbgorICAgIFJlcG9ydFJvdXRlKCk7CisgIH0KKyAgaWYgKHJvdXRlW3Jwb3NdWzBdID09IEhQX01TRykKKyAgeworICAgIGNhbGxfb3V0KCJjaGFuZ2VIcCIscm91dGVbcnBvc11bMl0pOworICAgIHRlbGxfcm9vbSh0aGlzX29iamVjdCgpLHJvdXRlW3Jwb3NdWzFdKTsKKyAgfQorICBlbHNlIGlmIChyb3V0ZVtycG9zXVswXSA9PSBIUF9GVU4pCisgIHsKKyAgICBjYWxsX291dCgiY2hhbmdlSHAiLHJvdXRlW3Jwb3NdWzJdKTsKKyAgICBjYWxsX290aGVyKHRoaXNfb2JqZWN0KCkscm91dGVbcnBvc11bMV0pOworICB9CisgIGVsc2UgCisgIHsKKyAgICBjYWxsX291dCgiZGlzY29ubmVjdCIscm91dGVbcnBvc11bMl0sMSxyb3V0ZVtycG9zXVszXSk7CisgICAgY29ubmVjdChyb3V0ZVtycG9zXVsxXSxyb3V0ZVtycG9zXVs0XSk7CisgIH0KK30KKwordm9pZCBfX3Jlc3RhcnQoc3RyaW5nIGZ1bm5hbWUpCit7CisgIGlmICghZnVubmFtZSB8fCBmdW5uYW1lID09ICIiIHx8IChmdW5uYW1lICE9ICJjaGFuZ2VIcCIgJiYgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5uYW1lICE9ICJkaXNjb25uZWN0IikpCisgICAgcmV0dXJuOworICB3aGlsZShyZW1vdmVfY2FsbF9vdXQoZnVubmFtZSkgIT0gLTEpOworICBjYWxsX291dChmdW5uYW1lLGZ1bm5hbWUgPT0gImNoYW5nZUhwIj8xNTo1KTsKK30KZGlmZiAtLWdpdCBhL3N0ZC90cmF5LmMgYi9zdGQvdHJheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNDc5NTUKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvdHJheS5jCkBAIC0wLDAgKzEsNjAgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIgICAgICAgICAgICAgICAKKy8vCisvLyB0cmF5LmMgLS0gY29udGFpbmVyIHN0YW5kYXJkIG9iamVjdAorLy8KKy8vICRJZDogdHJheS5jIDc4MDQgMjAxMS0wNy0xMCAyMDozNzo1MlogWmVzc3RyYSAkCisKKy8vIFRoZSBtb3N0IGdlbmVyYWwgb2JqZWN0IGNsYXNzLiBJdCBkZWZpbmVzIHRoZSByZWFsbHkgYmFzaWMgZnVuY3Rpb25zLgorLy8KKy8vIFRoaXMgb2JqZWN0IHNob3VsZCB1bmRlcnN0YW5kIHRoZSBwcm9wZXJ0aWVzIHNob3J0LCBsb25nLCBpbmZvLCByZWFkX21zZywKKy8vIHZhbHVlLCB3ZWlnaHQuCisvLworLy8gd2VpZ2h0IGlzIGdpdmVuIGluIGdyYW1zLCAxIGtpbG9ncmFtIChrZykgPSAxMDAwIGdyYW1zIChnKSA9IDEgb2xkIHdlaWdodAorLy8gdW5pdAorI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworI3ByYWdtYSByYW5nZV9jaGVjaworCitpbmhlcml0ICIvc3RkL3RoaW5nL3Byb3BlcnRpZXMiOworaW5oZXJpdCAiL3N0ZC90aGluZy9tb3ZpbmciOworaW5oZXJpdCAiL3N0ZC90aGluZy9jb21tYW5kcyI7Citpbmhlcml0ICIvc3RkL3RoaW5nL2xhbmd1YWdlIjsKK2luaGVyaXQgIi9zdGQvY29udGFpbmVyL2xpZ2h0IjsKK2luaGVyaXQgIi9zdGQvY29udGFpbmVyL3Jlc3RyaWN0aW9ucyI7Citpbmhlcml0ICIvc3RkL3RyYXkvZGVzY3JpcHRpb24iOworaW5oZXJpdCAiL3N0ZC90aGluZy9lbnZjaGsiOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgcHJvcGVydGllczo6Y3JlYXRlKCk7CisgIGNvbW1hbmRzOjpjcmVhdGUoKTsKKyAgbGlnaHQ6OmNyZWF0ZSgpOworICBkZXNjcmlwdGlvbjo6Y3JlYXRlKCk7CisgIHJlc3RyaWN0aW9uczo6Y3JlYXRlKCk7CisgIGVudmNoazo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9UUkFZLDEpOworICBTZXRQcm9wKFBfUFJFUE9TSVRJT04sICJhdWYiKTsKKyAgU2V0UHJvcChQX1NPVVJDRV9QUkVQT1NJVElPTiwgInZvbiIpOworICBTZXRQcm9wKFBfREVTVF9QUkVQT1NJVElPTiwgImF1ZiIpOworfQorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGVfc3VwZXIoKSB7CisgIHNldF9uZXh0X3Jlc2V0KC0xKTsKK30KKworLyoKK3ZvaWQgaW5pdCgpIAoreworICBjb21tYW5kczo6aW5pdCgpOworICBkZXNjcmlwdGlvbjo6aW5pdCgpOworfQorKi8KKwordm9pZCByZXNldCgpCit7fQpkaWZmIC0tZ2l0IGEvc3RkL3RyYXkvZGVzY3JpcHRpb24uYyBiL3N0ZC90cmF5L2Rlc2NyaXB0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA3OTcxMgotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC90cmF5L2Rlc2NyaXB0aW9uLmMKQEAgLTAsMCArMSwzNiBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHRyYXkvZGVzY3JpcHRpb24uYyAtLSBzdGFuZGFyZCBkZXNjcmlwdGlvbiBmb3IgY29udGFpbmVycworLy8KKy8vICRJZDogZGVzY3JpcHRpb24uYyA2MzcxIDIwMDctMDctMTcgMjI6NDY6NTBaIFplc3N0cmEgJAorI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworI3ByYWdtYSByYW5nZV9jaGVjaworCitpbmhlcml0ICJzdGQvY29udGFpbmVyL2Rlc2NyaXB0aW9uIjsKKworLy8jZGVmaW5lIE5FRURfUFJPVE9UWVBFUworCisjaW5jbHVkZSA8Y29udGFpbmVyLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorCit2b2lkIGNyZWF0ZSgpCit7IAorICA6OmNyZWF0ZSgpOworICBBZGRJZCgidHJheSIpOworfQorCit2YXJhcmdzIHN0cmluZyBsb25nKGludCBtb2RlKSB7CisgIHN0cmluZyBkZXNjciwgaW52X2Rlc2NyOworCisgIGRlc2NyID0gcHJvY2Vzc19zdHJpbmcoUXVlcnlQcm9wKFBfTE9ORykpOworICBpbnZfZGVzY3IgPSBtYWtlX2ludmxpc3QoUEwsIGFsbF9pbnZlbnRvcnkoTUUpLCBtb2RlICk7CisgIGlmICggaW52X2Rlc2NyICE9ICIiICkKKyAgICBkZXNjciArPSAiQXVmICIgKyBRdWVyeVByb25vdW4oV0VNKSArICIgbGllZ3Q6XG4iICsgaW52X2Rlc2NyOworICByZXR1cm4gZGVzY3I7Cit9CmRpZmYgLS1naXQgYS9zdGQvdW5pdC5jIGIvc3RkL3VuaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTcxNWYyCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3VuaXQuYwpAQCAtMCwwICsxLDc3MSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHVuaXQuYyAtLSBCYXNpc2tsYXNzZSBmdWVyIE1lbmdlbm9iamVrdGUKKy8vICAgICAgICAgICAobmV1ZSBWZXJzaW9uIHZvbiBQYWRyZWljKQorLy8KKy8vICRJZDogdW5pdC5jIDkwNzcgMjAxNS0wMS0xNiAyMzoyNjowMFogWmVzc3RyYSAkCisjcHJhZ21hIHN0cm9uZ190eXBlcyxzYXZlX3R5cGVzLHJ0dF9jaGVja3MKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKworaW5oZXJpdCAiL3N0ZC90aGluZyI7CisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8dW5pdC5oPgorI3VuZGVmIE5FRURfUFJPVE9UWVBFUworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHRoaW5nL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxkZWJ1Z19pbmZvLmg+CisKKy8vIHp1bSBkZWJ1Z2dlbiB1bmQgZXh0cmEgcHVibGljCitwdWJsaWMgc3RyaW5nIGRlYnVnbW9kZTsKK3B1YmxpYyBzdHJpbmcgX19zZXRfZGVidWcoc3RyaW5nIHJlY3YpIHtyZXR1cm4gZGVidWdtb2RlPXJlY3Y7fQorI2luY2x1ZGUgPGxpdmluZy9jb21tLmg+CisjZGVmaW5lIFpERUJVRyh4KSBpZiAoc3RyaW5ncChkZWJ1Z21vZGUpICYmIGZpbmRfcGxheWVyKGRlYnVnbW9kZSkpIFwKKyAgZmluZF9wbGF5ZXIoZGVidWdtb2RlKS0+UmVjZWl2ZU1zZyh4LE1UX0RFQlVHLDAsb2JqZWN0X25hbWUoKSsiOiAiLE1FKQorLy8jZGVmaW5lIFpERUJVRyh4KQorCitwcml2YXRlIHZvaWQgX2NhbGxfRG9EZWNheShvYmplY3QgKmtsb25lKTsKKworcHJpdmF0ZSBub3NhdmUgc3RyaW5nIGxhc3R2ZXJiOworcHJpdmF0ZSBub3NhdmUgaW50IGxhc3RldmFsbnVtYmVyOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFVfSURTLCh7KHt9KSwoe30pfSkpOworICBTZXRQcm9wKFBfR0VOREVSLCAxKTsKKyAgU2V0UHJvcChQX0FNT1VOVCwgMSk7CisgIC8vIFByb3BzIHNvbGx0ZW4gbmljaHQgZGlyZWt0IG1hbmlwdWxpZXJ0IHdlcmRlbiwgbnVyIHVlYmVyIFNldC1NZXRob2RlbgorICBTZXQoUF9VTklUX0RFQ0FZX0lOVEVSVkFMLCBQUk9URUNURUQsIEZfTU9ERV9BUyk7CisgIFNldChQX1VOSVRfREVDQVlfUVVPVEEsIFBST1RFQ1RFRCwgRl9NT0RFX0FTKTsKK30gCisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZV9zdXBlcigpIHsKKyAgc2V0X25leHRfcmVzZXQoLTEpOworfQorCisvLy8vIFF1ZXJ5IHVuZCBTZXQgRnVua3Rpb25lbiBmdWVyIGRpZSBQcm9wZXJ0eXMKKworc3RhdGljIHZvaWQgY2hlY2tfbGVhdmUoKQoreyAgaWYgKFF1ZXJ5KFBfQU1PVU5ULEZfVkFMVUUpPDEpIHJlbW92ZSgxKTsgIH0KKworc3RhdGljIGludCBfcXVlcnlfaW52aXMoKQoreworICBpZiAoUXVlcnlQcm9wKFBfQU1PVU5UKSA8IDEpCisgICAgcmV0dXJuIDE7CisgIHJldHVybiBRdWVyeShQX0lOVklTLCBGX1ZBTFVFKTsKK30KKworc3RhdGljIGludCBfc2V0X2Ftb3VudChpbnQgYW0pCit7CisgIGlmIChhbTwxKQorICAgIGNhbGxfb3V0KCJjaGVja19sZWF2ZSIsMSk7CisgIFNldFByb3AoVV9SRVEsIGFtKTsKKyAgcmV0dXJuIFNldChQX0FNT1VOVCxhbSwgRl9WQUxVRSk7Cit9CisKK3N0YXRpYyBpbnQgX3NldF91X3JlcShpbnQgdXJlcSkKK3sKKyAgbGFzdHZlcmIgPSBxdWVyeV92ZXJiKCk7CisgIGxhc3RldmFsbnVtYmVyID0gZGVidWdfaW5mbyhESU5GT19FVkFMX05VTUJFUik7CisgIHJldHVybiBTZXQoVV9SRVEsIHVyZXEsIEZfVkFMVUUpOworfQorCitzdGF0aWMgaW50IF9xdWVyeV91X3JlcSgpCit7CisgIC8vIFp3ZWkgRGluZ2UgYmVudXR6dGVuLCB1bSB6dSBlbnRzY2hlaWRlbiwgb2IgVV9SRVEgbm9jaCBndWVsdGlnIGlzdCBvZGVyCisgIC8vIGJlc3NlciBhdWYgUF9BTU9VTlQgenVydWVja2dlc2V0enQgd2VyZGVuIHNvbGx0ZTogZGllIERJTkZPX0VWQUxfTlVNQkVSCisgIC8vIHVuZCBkYXMgS29tbWFuZG92ZXJiLiBXZW5uIGVpbmVzIHZvbiBiZWlkZW4gc2ljaCBnZWFlbmRlcnQgaGF0LCB3aXJkCisgIC8vIFVfUkVRIGFscyB1bmd1ZWx0aWcgYmV0cmFjaHRldC4gKFVuZCBkaWVzIGJsZWlidCBlaW4gdWVibGVyIEhhY2suKQorICBpZiAobGFzdGV2YWxudW1iZXIgIT0gZGVidWdfaW5mbyhESU5GT19FVkFMX05VTUJFUikKKyAgICAgIHx8IGxhc3R2ZXJiICE9IHF1ZXJ5X3ZlcmIoKSkKKyAgeworICAgIHJldHVybiBTZXRQcm9wKFVfUkVRLCBRdWVyeShQX0FNT1VOVCwgRl9WQUxVRSkpOworICB9CisgIHJldHVybiBRdWVyeShVX1JFUSwgRl9WQUxVRSk7Cit9CisKKy8vIEdlc2FtdHdlcnQgZGVyIGdlcmFkZSBtaXQgVV9SRVEgYXVzZ2V3YWVobHRlbiB1bml0b2JqZWt0ZQorc3RhdGljIGludCBfcXVlcnlfdmFsdWUoKQoreworICBtaXhlZCBjcHU7CisgIGNwdT1RdWVyeShVX0NQVSk7CisgIGlmIChpbnRwKGNwdSkpIHJldHVybiBRdWVyeVByb3AoVV9SRVEpICogY3B1OworICBpZiAoIXBvaW50ZXJwKGNwdSkpIHJldHVybiAwOworICByZXR1cm4gKFF1ZXJ5UHJvcChVX1JFUSkgKiBjcHVbMF0pL2NwdVsxXTsKK30KKworc3RhdGljIGludCBfc2V0X3ZhbHVlKGludCBudW0pIHsKKy8vIFNldHp0IGRlbiBXZXJ0IGZ1ZXIgZGllIGRlcnplaXRpZ2UgQW56YWhsCisgIFNldENvaW5zUGVyVW5pdHMobnVtLCBRdWVyeVByb3AoVV9SRVEpKTsKKyAgcmV0dXJuIFF1ZXJ5UHJvcChQX1ZBTFVFKTsKK30KKworc3RhdGljIGludCBfcXVlcnlfd2VpZ2h0KCkKK3sKKyAgbWl4ZWQgZ3B1LCByZXE7CisgIGlmICgocmVxPVF1ZXJ5UHJvcChVX1JFUSkpPDEpIHJldHVybiAwOworICBncHU9UXVlcnkoVV9HUFUpOworICBpZiAoaW50cChncHUpKSByZXR1cm4gcmVxICogZ3B1OworICBpZiAoIXBvaW50ZXJwKGdwdSkpIHJldHVybiAwOworICByZXR1cm4gTUFYKDEsKHJlcSpncHVbMF0pL2dwdVsxXSk7Cit9CisKK3N0YXRpYyBpbnQgX3NldF93ZWlnaHQoaW50IG51bSkgeworLy8gU2V0enQgZGFzIEdld2ljaHQgZnVlciBkaWUgZGVyemVpdGlnZSBBbnphaGwKKyAgICBTZXRHcmFtc1BlclVuaXRzKG51bSwgUXVlcnlQcm9wKFVfUkVRKSk7CisgICAgcmV0dXJuIFF1ZXJ5UHJvcChQX1dFSUdIVCk7Cit9CisKK3N0YXRpYyBpbnQgX3F1ZXJ5X3RvdGFsX3dlaWdodCgpCit7CisgIG1peGVkIGdwdSwgYW1vdW50OworICBpZiAoKGFtb3VudD1RdWVyeShQX0FNT1VOVCkpPDEpIHJldHVybiAwOworICBncHU9UXVlcnkoVV9HUFUpOworICBpZiAoaW50cChncHUpKQorICAgIHJldHVybiBhbW91bnQqKGludClncHU7CisgIGlmICghcG9pbnRlcnAoZ3B1KSkgcmV0dXJuIDA7CisgIHJldHVybiBNQVgoMSwoYW1vdW50KmdwdVswXSkvZ3B1WzFdKTsKK30KKworc3RhdGljIGludCBfcXVlcnlfcGx1cmFsKCkKK3sKKyAgaW50IGk7CisgIGk9UXVlcnlQcm9wKFVfUkVRKTsgLy8gd2ljaHRpZyBfbmljaHRfIFF1ZXJ5UHJvcAorICByZXR1cm4gKGk8PTEgPyAwIDogaSk7Cit9CisKKy8vIGdpYnQgc3RyaW5nIHwgc3RyaW5nKiB6dXJ1ZWNrLgorc3RhdGljIHN0cmluZ3xzdHJpbmcqIF9xdWVyeV9uYW1lKCkKK3sKKyAgaWYgKFF1ZXJ5UHJvcChVX1JFUSk9PTEpCisgICAgcmV0dXJuICIlcyVzIisoKHN0cmluZyAqKVF1ZXJ5KFBfTkFNRSkpWzBdOworICByZXR1cm4gIiVkICVzIisoKHN0cmluZyAqKVF1ZXJ5KFBfTkFNRSkpWzFdOworfQorCisvLyBnaWJ0IHN0cmluZyB8IHN0cmluZyogenVydWVjay4KK3N0YXRpYyBzdHJpbmd8c3RyaW5nKiAgX3NldF9uYW1lKG1peGVkIG5hbWVzKQoreworICBpZighbmFtZXMpCisgICAgcmV0dXJuIFNldChQX05BTUUsKHsiIiwiIn0pKTsKKyAgaWYoc3RyaW5ncChuYW1lcykpCisgICAgcmV0dXJuIFNldChQX05BTUUsKHtuYW1lcyxuYW1lc30pKTsKKyAgaWYocG9pbnRlcnAobmFtZXMpKQorICAgIHN3aXRjaChzaXplb2YobmFtZXMpKSB7CisgICAgICBjYXNlIDA6ICByZXR1cm4gU2V0KFBfTkFNRSwoeyIiLCIifSkpOworICAgICAgY2FzZSAxOiAgaWYoIXN0cmluZ3AobmFtZXNbMF0pKQorICAgICAgICAgICAgICAgICBuYW1lc1swXT0iIjsKKyAgICAgICAgICAgICAgIHJldHVybiBTZXQoUF9OQU1FLCh7bmFtZXNbMF0sbmFtZXNbMF19KSk7CisgICAgICBkZWZhdWx0OiBpZighc3RyaW5ncChuYW1lc1swXSkpCisgICAgICAgICAgICAgICAgIG5hbWVzWzBdPSIiOworICAgICAgICAgICAgICAgaWYoIXN0cmluZ3AobmFtZXNbMV0pKQorICAgICAgICAgICAgICAgICBuYW1lc1sxXT0iIjsKKyAgICAgICAgICAgICAgIHJldHVybiBTZXQoUF9OQU1FLG5hbWVzWzAuLjFdKTsKKyAgICB9CisgIHJldHVybiBRdWVyeVByb3AoUF9OQU1FKTsKK30KKworLy8gZGllIEZ1bmt0aW9uZW4KKwordm9pZCBBZGRTaW5ndWxhcklkKG1peGVkIHN0cikKK3sKKyAgc3RyaW5nICppZHM7CisgIGlmICghcG9pbnRlcnAoc3RyKSkKKyAgICBzdHI9KHtzdHJ9KTsKKyAgaWRzPVF1ZXJ5KFVfSURTKTsKKyAgU2V0KFVfSURTLCh7aWRzWzBdK3N0cixpZHNbMV19KSk7Cit9CisKK3ZvaWQgUmVtb3ZlU2luZ3VsYXJJZChtaXhlZCBzdHIpCit7IAorICBpZihzdHJpbmdwKHN0cikpCisgICAgc3RyPSh7c3RyfSk7CisgIGlmKHBvaW50ZXJwKHN0cikpCisgICAgU2V0KFVfSURTLCh7UXVlcnkoVV9JRFMpWzBdLXN0cixRdWVyeShVX0lEUylbMV19KSk7Cit9CisgCit2b2lkIEFkZFBsdXJhbElkKG1peGVkIHN0cikKK3sKKyAgc3RyaW5nICppZHM7CisgIAorICBpZiAoIXBvaW50ZXJwKHN0cikpCisgICAgc3RyPSh7c3RyfSk7CisgIGlkcz1RdWVyeShVX0lEUyk7CisgIFNldChVX0lEUywoe2lkc1swXSxpZHNbMV0rc3RyfSkpOworfQorCit2b2lkIFJlbW92ZVBsdXJhbElkKG1peGVkIHN0cikKK3sgCisgIGlmKHN0cmluZ3Aoc3RyKSkKKyAgICBzdHI9KHtzdHJ9KTsKKyAgaWYocG9pbnRlcnAoc3RyKSkKKyAgICBTZXQoVV9JRFMsKHtRdWVyeShVX0lEUylbMF0sUXVlcnkoVV9JRFMpWzFdLXN0cn0pKTsKK30KKwordm9pZCBTZXRDb2luc1BlclVuaXRzKGludCBjb2lucyxpbnQgdW5pdHMpCit7CisgIGlmIChjb2luczwwfHx1bml0czw9MCkgcmV0dXJuOworICBpZiAodW5pdHM9PTEpCisgICAgU2V0KFVfQ1BVLCBjb2lucyk7CisgIGVsc2UgU2V0KFVfQ1BVLCh7Y29pbnMsdW5pdHN9KSk7Cit9CisKK3ZvaWQgU2V0R3JhbXNQZXJVbml0cyhpbnQgZ3JhbXMsIGludCB1bml0cykKK3sKKyAgaWYgKGdyYW1zPDB8fHVuaXRzPD0wKSByZXR1cm47CisgIGlmICh1bml0cz09MSkKKyAgICBTZXQoVV9HUFUsIGdyYW1zKTsKKyAgZWxzZSBTZXQoVV9HUFUsKHtncmFtcyx1bml0c30pKTsKK30KKworaW50ICpRdWVyeUNvaW5zUGVyVW5pdHMoKQoreworICBtaXhlZCBjcHU7CisgIGNwdT1RdWVyeShVX0NQVSk7CisgIGlmIChpbnRwKGNwdSkpIHJldHVybiAoeyBjcHUsIDEgfSk7CisgIHJldHVybiBjcHU7Cit9CisKK2ludCAqUXVlcnlHcmFtc1BlclVuaXRzKCkKK3sKKyAgbWl4ZWQgZ3B1OworICBncHU9UXVlcnkoVV9HUFUpOworICBpZiAoaW50cChncHUpKSByZXR1cm4gKHsgZ3B1LCAxIH0pOworICByZXR1cm4gZ3B1OworfQorCit2b2lkIEFkZEFtb3VudChpbnQgYW0pIHsKKyAgU2V0UHJvcChQX0FNT1VOVCwgYW0rUXVlcnkoUF9BTU9VTlQpKTsKK30KKworaW50IElzVW5pdCgpIHsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBJc0VxdWFsKG9iamVjdCBvYikKKy8vIGhhYmVuIG9iIHVuZCBkaWVzZXMgT2JqZWt0ZSBkaWUgZ2xlaWNoZSBCbHVlcHJpbnQ/Cit7CisgIGlmIChvYj09dGhpc19vYmplY3QoKSkgcmV0dXJuIDA7IC8vIGRhcyBpc3QgWlUgZ2xlaWNoIDopCisgIHJldHVybiAoQkxVRV9OQU1FKE1FKT09QkxVRV9OQU1FKG9iKSk7Cit9CisKKy8vIHVlYmVyc2NocmVpYmVuIHZvbiBTdGFuZGFyZG1ldGhvZGVuCisKK3ZhcmFyZ3Mgc3RyaW5nIG5hbWUoaW50IGZhbGwsIGludCBkZW1vKQoreworICBpbnQgcmVxOworICBtaXhlZCBuX2FkajsKKyAgc3RyaW5nIGFkajsKKworICBpZiAoKHJlcT1RdWVyeVByb3AoVV9SRVEpKTwxKSByZXR1cm4gMDsKKyAgaWYgKGZhbGwhPVJBVyAmJiAKKyAgICAgIHBvaW50ZXJwKG5fYWRqPVF1ZXJ5UHJvcChQX05BTUVfQURKKSkgJiYgc2l6ZW9mKG5fYWRqKSApCisgICAgYWRqID0gaW1wbG9kZShtYXAobl9hZGosICMnRGVjbEFkaiwgZmFsbCwgZGVtbyAmJiByZXE9PTEpLCAiIik7CisgIGVsc2UKKyAgICBhZGogPSAiIjsKKworICBpZiAocmVxPT0xKQorICAgIHJldHVybiBzcHJpbnRmKFF1ZXJ5UHJvcChQX05BTUUpLAorICAgICAgICAgICAgICAgICAgIChmYWxsPT1SQVcgfHwgIVF1ZXJ5UHJvcChQX0FSVElDTEUpIAorICAgICAgICAgICAgICAgICAgICA/ICIiIDogUXVlcnlBcnRpY2xlKGZhbGwsZGVtbywxKSksIGFkaikgLyogK2tvcnJla3R1ciAqLzsKKworICBpZiAoZmFsbCE9V0VNKQorICAgIHJldHVybiBzcHJpbnRmKFF1ZXJ5UHJvcChQX05BTUUpLCByZXEsIGFkaik7CisgIGVsc2UgeworICAgICBpbnQgbGFzdDsKKyAgICAgbGFzdD1RdWVyeShQX05BTUUpWzFdWzwxXTsKKyAgICAgcmV0dXJuIHNwcmludGYoUXVlcnlQcm9wKFBfTkFNRSksIHJlcSwgYWRqKQorICAgICAgICAgICAgICAgICAgKyhsYXN0IT0ncycgJiYgbGFzdCE9J24nID8gIm4iIDogIiIpOworICB9Cit9CisKK3ZhcmFyZ3Mgc3RyaW5nIFF1ZXJ5UHJvbm91bihpbnQgY2FzdXMpCit7CisgIGlmIChRdWVyeVByb3AoVV9SRVEpPT0xKQorICAgIHJldHVybiA6OlF1ZXJ5UHJvbm91bihjYXN1cyk7CisgIHN3aXRjaChjYXN1cykgeworICAgIGNhc2UgV0VTU0VOOiByZXR1cm4gImlocmVyIjsKKyAgICBjYXNlIFdFTTogICAgcmV0dXJuICJpaG5lbiI7CisgICAgLy9kZWZhdWx0OiAgICAgcmV0dXJuICJzaWUiOworICB9CisgIHJldHVybigic2llIik7IC8vZmFsbC10aHJvdWdoCit9CisKK3N0cmluZyBzaG9ydCgpCit7CisgIGlmIChRdWVyeVByb3AoVV9SRVEpPDEgfHwgUXVlcnlQcm9wKFBfSU5WSVMpKSByZXR1cm4gMDsKKyAgcmV0dXJuIGNhcGl0YWxpemUobmFtZShXRVIsMCkpKyIuXG4iOworICAvKgorICBpZiAocmVxPjEpIHJldHVybiBzcHJpbnRmKFF1ZXJ5UHJvcChQX05BTUUpLCByZXEpKyIuXG4iOworICByZXR1cm4gY2FwaXRhbGl6ZShzcHJpbnRmKFF1ZXJ5UHJvcChQX05BTUUpLCBRdWVyeUFydGljbGUoV0VSLDAsMSkpKSsiLlxuIjsKKyAgKi8KK30KKwordmFyYXJncyBzdHJpbmcgbG9uZygpCit7CisgIHJldHVybiAoUXVlcnlQcm9wKFBfTE9ORykgPyBwcm9jZXNzX3N0cmluZyhRdWVyeVByb3AoUF9MT05HKSkgOiAiIikrCisgICAgc3ByaW50ZigiRHUgc2llaHN0ICVzLlxuIixuYW1lKFdFTikpOworfQorCit2YXJhcmdzIGludCBpZChzdHJpbmcgc3RyLGludCBsdmwpCit7CisKKyAgc3RyaW5nIHMxLHMyLCppZHM7CisgIGludCBpOworCisgIGlmICghc3RyKSByZXR1cm4gMDsKKyAgCisgIC8vIFdlbm4ga2VpbiBwb3MuIEFtb3VudCwgaGF0IGRpZXNlcyBPYmpla3Qga2VpbmUgSURzIG1laHIsIGRhbWl0IGVzIG5pY2h0CisgIC8vIG1laHIgYW5zcHJlY2hiYXIgaXN0LgorICBpbnQgYW1vdW50PVF1ZXJ5UHJvcChQX0FNT1VOVCk7CisgIGlmIChhbW91bnQgPCAxKQorICAgIHJldHVybiAwOworCisgIGlmICg6OmlkKHN0cikpIHsKKyAgICBTZXRQcm9wKFVfUkVRLCBRdWVyeShQX0FNT1VOVCxGX1ZBTFVFKSk7CisgICAgcmV0dXJuIDE7CisgIH0KKworIGlkcz1RdWVyeShVX0lEUyk7CisgIGlmICghaWRzKQorICAgIHJldHVybiAwOworIAorICAvL2RpZSBjYXN0cyBhdWYgJ21peGVkJyBzaW5kIGFic2ljaHQuIFNvbnN0IGdlaHQgZGVyIERyaXZlciBvZmZlbmJhciBkYXZvbgorICAvL2F1cywgZGFzcyBpZHNbMV0gZWluIFN0cmluZyBpc3QuIEVzIGlzdCBhYmVyIGFiZXIgZWluIEFycmF5IHZvbiBTdHJpbmdzCisgIC8vdW5kIGdlbmF1IGRhcyB3aWxsIGF1Y2ggbWF0Y2hfaXRlbSgpIGhhYmVuLiA7LSkgWmVzc3RyYQorICBpZiAobWF0Y2hfaXRlbShzdHIsKG1peGVkKWlkc1sxXSApKSB7CisgICAgU2V0UHJvcChVX1JFUSwgYW1vdW50KTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAobWF0Y2hfaXRlbShzdHIsKG1peGVkKWlkc1swXSApKSB7CisgICAgU2V0UHJvcChVX1JFUSwxKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoc3NjYW5mKHN0ciwiJXMgJXMiLHMxLHMyKSAmJiBzMVswLi4zXT09ImFsbGUiICYmIAorICAgIG1hdGNoX2l0ZW0oczIsKG1peGVkKWlkc1sxXSApKSB7CisgICAgU2V0UHJvcChVX1JFUSwgYW1vdW50KTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoc3NjYW5mKHN0ciwiJWQgJXMiLGksczEpPT0yICYmIGk9PTEgJiYgbWF0Y2hfaXRlbShzMSwobWl4ZWQpaWRzWzBdICkpIHsKKyAgICBTZXRQcm9wKFVfUkVRLDEpOworICAgIHJldHVybiAxOworICB9CisgIGlmIChzc2NhbmYoc3RyLCIlZCAlcyIsaSxzMSk9PTIgJiYgbWF0Y2hfaXRlbShzMSwobWl4ZWQpaWRzWzFdICkgJiYgCisgICAgICBpPD1hbW91bnQgJiYgaT4wKSB7CisgICAgU2V0UHJvcChVX1JFUSxpKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworLy8gU3RhdHVzIGZ1ZXIgbW92ZS4uLiAqc2V1ZnoqCitpbnQgX29yaWdfYW1vdW50LCBfbW92ZV9yZXF1ZXN0ZWQ7CisKK3ZhcmFyZ3MgaW50IG1vdmUob2JqZWN0fHN0cmluZyBkZXN0LGludCBtZXRob2QpCit7CisgIF9vcmlnX2Ftb3VudCA9IFF1ZXJ5UHJvcChQX0FNT1VOVCk7CisgIC8vIFdlbm4gTV9NT1ZFX0FMTCBnZXNldHp0IGlzdCwgd2lyZCBJTU1FUiBBTExFUyBiZXdlZ3QuCisgIGlmIChtZXRob2QgJiBNX01PVkVfQUxMKQorICAgIF9tb3ZlX3JlcXVlc3RlZCA9IF9vcmlnX2Ftb3VudDsKKyAgZWxzZQorICAgIF9tb3ZlX3JlcXVlc3RlZCA9IFF1ZXJ5UHJvcChVX1JFUSk7CisKKyAgWkRFQlVHKHNwcmludGYoIm1vdmUgZnJvbSAlTyB0byAlTzogYW1vdW50ICVkLCByZXEgJWRcbiIsZW52aXJvbm1lbnQoKSxkZXN0LF9vcmlnX2Ftb3VudCxfbW92ZV9yZXF1ZXN0ZWQpKTsKKyAgLy8gV2VubiBuaWNodCBhbGxlcyBiZXdlZ3Qgd2VyZGVuIHNvbGwsIHdpcmQgZGllIE1lbmdlIGRpZXNlcyBPYmpla3RlcworICAvLyBlcnN0bWFsIHJlZHV6aWVydCB1bmQgYmV3ZWd0LiBFcnN0IG5hY2ggZGVyIEJld2VndW5nIHdpcmQgZGVyIFJlc3QgZGFubgorICAvLyBpbSBhbHRlbiBFbnZpcm9ubWVudCBuZXUgZXJ6ZXVndC4KKyAgaWYgKCBfb3JpZ19hbW91bnQgPiBfbW92ZV9yZXF1ZXN0ZWQgKQorICB7CisgICAgIC8vIHdlbm4gaW4gZWluZW0gYWx0ZW4gUGFrZXQgZGFzIEdld2ljaHQgbm9jaCBuaWNodCBuZXUgYmVyZWNobmV0CisgICAgIC8vIHd1cmRlIG11c3MgZGllcyBnZXNjaGVobiBzb2xhbmdlIGRpZSBNdWVuemVuIGltIFBha2V0IG5vY2ggZGFzCisgICAgIC8vIHZvbGxlIEdld2ljaHQgaGFiZW4uLi4KKyAgICAgaWYgKCBlbnZpcm9ubWVudCgpICkKKyAgICAgICAgIGVudmlyb25tZW50KCktPnF1ZXJ5X3dlaWdodF9jb250ZW50cygpOworICAgICAvLyBhYiBqZXR6dCBudXIgYXVmIDxfbW92ZV9yZXF1ZXN0ZWQ+IEVpbmhlaXRlbiBhcmJlaXRlbgorICAgICBTZXQoIFBfQU1PVU5ULCBfbW92ZV9yZXF1ZXN0ZWQsIEZfVkFMVUUpOworICAgICBaREVCVUcoc3ByaW50ZigibW92ZTogYW1vdW50IHNldCB0byAlZFxuIixfbW92ZV9yZXF1ZXN0ZWQpKTsKKyAgfQorCisgIGludCByZXMgPSA6Om1vdmUoIGRlc3QsIG1ldGhvZCApOworCisgIGlmICggcmVzICE9IE1PVkVfT0sgKQorICB7CisgICAgICAvLyBGZWhsZ2VzY2hsYWdlbmUgQmV3ZWd1bmcgaXN0IGRvb2YuCisgICAgICAvLyBnZ2YuIHZlcmZydWVodGUgQWVuZGVydW5nIChQX0FNT1VOVCBvYmVuIGF1ZiA8VV9SRVE+IEVpbmhlaXRlbgorICAgICAgLy8gcmVkdXppZXJ0KSBydWVja2dhZW5naWcgbWFjaGVuCisgICAgICBTZXQoIFBfQU1PVU5ULCBfb3JpZ19hbW91bnQsIEZfVkFMVUUgKTsKKyAgICAgIFpERUJVRyhzcHJpbnRmKCJtb3ZlOiBub3QgT0ssIGFtb3VudCByZXN0b3JlZCB0byAlZFxuIixfb3JpZ19hbW91bnQpKTsKKyAgICAgIHJldHVybiByZXM7CisgIH0KKworICAvLyBUT0RPOiBlaWdlbnRsaWNoIHNvbGx0ZSBlcyBuaWNodCBwYXNzaWVyZW4sIGRhc3MgZGllIE1lbmdlIGpldHp0IG5lZ2FndGl2CisgIC8vIGlzdC4gQWJlciBiZWkgR2VsZCBrYW5uIGVzIGR1cmNoIHZlcmVpbmlnZW4gbWl0IEdlbGRib2Vyc2UvR2VsZGthcnRlbgorICAvLyBwYXNzaWVyZW4gdW5kIGRhcyBpc3Qga2VpbiBGZWhsZXIuIEtvZW5udGUgbWFuIGV2dGwuIG1hbCBkaWZmZXJlbnppZXJ0CisgIC8vIHBydWVmZW4uCisgIGludCBmaW5hbGFtb3VudD0gUXVlcnlQcm9wKFBfQU1PVU5UKTsKKyAgLyppZiAoIGZpbmFsYW1vdW50IDwgMSApCisgIHsKKyAgICBaREVCVUcoc3ByaW50ZigibW92ZTogemVyc3RvZXJ1bmcsIGFtb3VudCAlZFxuIixmaW5hbGFtb3VudCkpOworICAgIHJlbW92ZSgxKTsKKyAgICByZXR1cm4gTUVfV0FTX0RFU1RSVUNURUQ7CisgIH0KKyAgKi8KKyAgWkRFQlVHKHNwcmludGYoIm1vdmU6IE9LLCBhbW91bnQgJWRcbiIsZmluYWxhbW91bnQpKTsKKyAgcmV0dXJuIHJlczsKK30KKworCitwcm90ZWN0ZWQgdm9pZCBOb3RpZnlNb3ZlKG9iamVjdCBkZXN0LCBvYmplY3Qgb2xkZW52LCBpbnQgbWV0aG9kKQoreworICAvLyBFcnN0IGVpbmVuIGV2dGwuIG5pY2h0IHp1IGJld2VnZW5kZW4gUmVzdCBpbSBhbHRlbiBFbnZpcm9ubWVudCB3aWVkZXIgZXJ6ZXVnZW4uCisgIGlmIChvbGRlbnYgJiYgX29yaWdfYW1vdW50ID4gX21vdmVfcmVxdWVzdGVkKQorICB7CisgICAgICBpZiAoIG9sZGVudiA9PSBkZXN0ICkKKyAgICAgIHsKKyAgICAgICAgICAvLyBPYmpla3Qgd3VyZGUgbnVyIGFuIGRlbiBBbmZhbmcgZGVzIGludmVudG9yeSBiZXdlZ3QsIHNvbnN0IG5pY2h0cy4KKyAgICAgICAgICAvLyBnZ2YuIHZlcmZydWVodGUgQWVuZGVydW5nIChvYmVuIGF1ZiA8cmVxPiBFaW5oZWl0ZW4gcmVkdXppZXJ0KQorICAgICAgICAgIC8vIHJ1ZWNrZ2FlbmdpZyBtYWNoZW4KKyAgICAgICAgICBaREVCVUcoc3ByaW50ZigibW92ZTogc2FtZSBlbnYsIGFtb3VudCByZXN0b3JlZCB0byAlZFxuIixfb3JpZ19hbW91bnQpKTsKKyAgICAgICAgICBTZXQoIFBfQU1PVU5ULCBfb3JpZ19hbW91bnQsIEZfVkFMVUUgKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLy8gdmVyYmxlaWJlbmRlIEVpbmhlaXRlbiBpbiBlaW5lbSBuZXVlbiBPYmpla3RlIHdpZWRlciB6dXJ1ZWNrIGlucworICAgICAgICAvLyBhbHRlIEVudmlyb25tZW50IHp1cnVlY2sgYmV3Z2VuCisgICAgICAgICAgb2JqZWN0IHRlbXA7CisgICAgICAgICAgdGVtcCA9IGNsb25lX29iamVjdChCTFVFX05BTUUoTUUpKTsKKyAgICAgICAgICB0ZW1wLT5TZXRQcm9wKCBQX0FNT1VOVCwgX29yaWdfYW1vdW50LV9tb3ZlX3JlcXVlc3RlZCApOworICAgICAgICAgIHRlbXAtPm1vdmUoIG9sZGVudiwgTV9OT0NIRUNLICk7CisgICAgICAgICAgWkRFQlVHKHNwcmludGYoIm1vdmU6IFJlc3RtZW5nZSBpbSBhbHRlbiBFbnYgZXJ6ZXVndCwgYW1vdW50ICVkXG4iLF9vcmlnX2Ftb3VudC1fbW92ZV9yZXF1ZXN0ZWQpKTsKKyAgICAgIH0KKyAgfQorCisgIC8vIFVuZCBqZXR6dCBnZ2YuIG1pdCBkZW4gYW5kZXJlbiBVbml0cyBnbGVpY2hlbiBUeXBzIGltIG5ldWVuIEVudmlyb25tZW50CisgIC8vIHZlcmVpbmlnZW4uCisgIGZvcmVhY2gob2JqZWN0IGl0ZW06IGFsbF9pbnZlbnRvcnkoZW52aXJvbm1lbnQoKSkpCisgIHsKKyAgICAgIGlmICggSVNfRVFVQUwoaXRlbSkgKQorICAgICAgeworICAgICAgICAvLyBFcyBpc3QgZWluIEZlYXR1cmUsIGRhc3MgYXVjaCBtaXQgT2JqZWt0ZW4gbWl0IG5lZ2F0aXZlbiBBbW91bnQKKyAgICAgICAgLy8gdmVyZWluaWd0IHdpcmQuCisgICAgICAgIFpERUJVRyhzcHJpbnRmKCJtb3ZlOiB2ZXJlaW5pZ2UgbWl0ICVPICglZClcbiIsCisgICAgICAgICAgICAgICBpdGVtLGl0ZW0tPlF1ZXJ5UHJvcChQX0FNT1VOVCkpKTsKKyAgICAgICAgaW50IG1lcmdlZGFtb3VudCA9IFF1ZXJ5UHJvcChQX0FNT1VOVCkgKyBpdGVtLT5RdWVyeVByb3AoUF9BTU9VTlQpOworICAgICAgICBpdGVtLT5TZXQoIFBfQU1PVU5ULCAwLCBGX1ZBTFVFKTsKKyAgICAgICAgaXRlbS0+cmVtb3ZlKDEpOworCisgICAgICAgIFNldFByb3AoIFBfQU1PVU5ULCBtZXJnZWRhbW91bnQpOworICAgICAgICAvLyBVX1JFUSBpc3QgamV0enQgYXVjaCB6dXJ1ZWNrZ2VzZXR6dC4KKworICAgICAgICBaREVCVUcoc3ByaW50ZigibW92ZTogbmFjaCB2ZXJlaW5pZ3VuZywgYW1vdW50ICVkXG4iLG1lcmdlZGFtb3VudCkpOworICAgICAgfQorICB9CisKKyAgLy8gd2VubiBtYW4gaW4gZnJpc2NoIGdlY2xvbnRlbiBVbml0cyBkaWUgbm9jaCBrZWluIGVudmlyb25tZW50IGhhYmVuCisgIC8vIHBlciBIYW5kIFVfUkVRIGF1ZiBlaW5lbiBXZXJ0ICE9IFBfQU1PVU5UIHNldHp0LCBzbyBnZWhlbiBkaWUKKyAgLy8gcmVzdGxpY2hlbiBFaW5oZWl0ZW4gIHZlcmxvcmVuIChlcyBnaWJ0IGtlaW4gRW52aXJvbm1lbnQsIGluIGRhcyBtYW4gZGllCisgIC8vIFJlc3RlaW5oZWl0ZW4genVydWVjayBiZXdlZ2VuIGtvZW5udGUpLgorCisgIC8vIFVuZCBqZXR6dCBtYWwgRGVjYXlrcmFtcyBtYWNoZW4uLi4KKworICAvLyB3ZW5uIE5PX0RFQ0FZX1VOVElMX01PVkUgYW4gaXN0IHVuZCBkaWVzZXMgZWluIE1vdmUgaXN0LCB3YXMgdm9uIGVpbmVtCisgIC8vIEVudiBpbiBlaW4gYW5kZXJlcyBFbnYgZ2VodCwgbG9lc2NoZW4uIE5pY2h0IGdlbG9lc2NodCB3aXJkCisgIC8vIGhpbmdlZ2VuLCB3ZW5uIGRhcyBtb3ZlKCkgaW4gZGFzIGFsbGVyZXJzdGUgRW52IGVyZm9sZ3QgKG5hY2ggZGVtIENsb25lbikKKyAgaWYgKCAoUXVlcnlQcm9wKFBfVU5JVF9ERUNBWV9GTEFHUykgJiBOT19ERUNBWV9VTlRJTF9NT1ZFKQorICAgICAgJiYgb2JqZWN0cChkZXN0KSAmJiBvYmplY3RwKG9sZGVudikgJiYgZGVzdCAhPSBvbGRlbnYpCisgICAgU2V0UHJvcChQX1VOSVRfREVDQVlfRkxBR1MsIAorICAgICAgICBRdWVyeVByb3AoUF9VTklUX0RFQ0FZX0ZMQUdTKSAmIH5OT19ERUNBWV9VTlRJTF9NT1ZFICk7CisgIDo6Tm90aWZ5TW92ZShkZXN0LCBvbGRlbnYsIG1ldGhvZCk7Cit9CisKKwordm9pZCByZXNldCgpIHsKKyAgaWYgKCFjbG9uZXAoTUUpKSB7CisgICAgLy8gQmx1ZXByaW50IGlzdCBNYXN0ZXIgZnVlciB6ZXJmYWxsZW5kZSBVbml0b2JqZWt0ZQorICAgIC8vIGRhcyBEZWNheSBzb2xsdGUgYmVzc2VyIG5pY2h0IGR1cmNoIG1hbnVlbGxlbiBBdWZydWYgaW4gZGVyIEJQCisgICAgLy8gYXVzZ2Vsb2VzdCB3ZXJkZW4sIGRhaGVyIFBydWVmdW5nIGhpZXIgKFBPID09IE1FLCBmYWxscyBkZXIgUmVzZXQgdm9tCisgICAgLy8gRHJpdmVyIGtvbW10KS4KKyAgICBpZiAocHJldmlvdXNfb2JqZWN0KCkgJiYgcHJldmlvdXNfb2JqZWN0KCkgIT0gTUUpCisgICAgICByZXR1cm47IAorICAgIGludCB6ZWl0ID0gUXVlcnlQcm9wKFBfVU5JVF9ERUNBWV9JTlRFUlZBTCk7CisgICAgaWYgKHplaXQgPiAwKQorICAgIHsKKyAgICAgIHNldF9uZXh0X3Jlc2V0KHplaXQpOworICAgICAgLy8gRGFzIENhbGxvdXQgbXVzcyBhdWYgamVkZW4gRmFsbCBnZW1hY2h0IHdlcmRlbiwgd2VubiBlaW4gRGVjYXkKKyAgICAgIC8vIEludGVydmFsbCBnZXNldHp0IGlzdCwgZGFtaXQgZGllIEJsdWVwcmludCBhdWNoIGRlbiBuYWVjaHN0ZW4gUmVzZXQKKyAgICAgIC8vIGtyaWVndCwgYXVjaCB3ZW5uIGVzIGpldHp0IGtlaW5lIENsb25lIGdpYnQuIFdlbm4gZXMga2VpbiBRdW90YSBnaWJ0LAorICAgICAgLy8ga2FubiBkZXIgQ2FsbG91dCB3ZWdmYWxsZW4sIGJlaW0gU2V0emVuIGVpbmVzIFF1b3RhIHdpcmQgamEgZWluZQorICAgICAgLy8gRnVua3Rpb24gYW4gZGllc2VtIE9iamVrdCBnZXJ1ZmVuLgorICAgICAgaWYgKFF1ZXJ5UHJvcChQX1VOSVRfREVDQVlfUVVPVEEpID4gMCkKKyAgICAgICAgY2FsbF9vdXQoIydfY2FsbF9Eb0RlY2F5LCAxLCAwKTsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgLy8gQ2xvbmVzCisgICAgaWYgKFF1ZXJ5KFBfQU1PVU5ULEZfVkFMVUUpPDEpIHJlbW92ZSgxKTsKKyAgICBlbHNlIDo6cmVzZXQoKTsKKyAgfQorfQorCit2YXJhcmdzIGludCByZW1vdmUoaW50IHNpbGVudCkKK3sKKyAgaW50IGFtb3VudCA9IFF1ZXJ5UHJvcChQX0FNT1VOVCk7CisgIGludCByZXEgPSBRdWVyeVByb3AoVV9SRVEpOworICBpZiAoYW1vdW50ID4gcmVxKQorICB7CisgICAgWkRFQlVHKHNwcmludGYoInJlbW92ZTogcmVkdXppZXJlIGFtb3VudCAlZCB1bSAlZCAtPiAlZFxuIiwKKyAgICAgICAgICAgYW1vdW50LCByZXEsIGFtb3VudC1yZXEgKSk7CisgICAgU2V0UHJvcChQX0FNT1VOVCwgYW1vdW50IC0gcmVxKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBaREVCVUcoc3ByaW50ZigicmVtb3ZlOiByZXN0bG9zIHdlZy5cbiIpKTsKKyAgcmV0dXJuIDo6cmVtb3ZlKHNpbGVudCk7Cit9CisKKy8vIHNvbGx0ZSBuaWNodCB2b24gYXVzc2VuIGdlcnVmZW4gd2VyZGVuLgorcHJpdmF0ZSB2b2lkIF9jYWxsX0RvRGVjYXkob2JqZWN0ICprbG9uZSkgeworICBaREVCVUcoc3ByaW50ZigiY2FsbF9Eb0RlY2F5KCkgaW4gJU9cbiIsTUUpKTsKKyAgLy8gQ2xvbmUgb2RlciBrZWluIERlY2F5IGtvbmZpZ3VyaWVydD8KKyAgaWYgKGNsb25lcCgpCisgICAgICB8fCBRdWVyeVByb3AoUF9VTklUX0RFQ0FZX0ZMQUdTKSAmIE5PX0RFQ0FZKQorICAgIHJldHVybjsKKworICBpZiAoIXBvaW50ZXJwKGtsb25lKSkKKyAgICBrbG9uZSA9IGNsb25lcygyKTsKKyAgLy8gS2xvbmUgZGE/CisgIGludCBpPXNpemVvZihrbG9uZSk7CisgIGlmICghaSkKKyAgICByZXR1cm47CisKKyAgLy8gaW4gYWxsZW4gS2xvbmVuIERvRGVjYXkgcnVmZW4KKyAgd2hpbGUoZ2V0X2V2YWxfY29zdCgpID4gX19NQVhfRVZBTF9DT1NUX18vMiAmJiBpLS0pIHsKKyAgICBpZiAob2JqZWN0cChrbG9uZVtpXSkpCisgICAgICBjYXRjaChjYWxsX290aGVyKGtsb25lW2ldLCJEb0RlY2F5IiwgMCk7cHVibGlzaCk7CisgIH0KKyAgLy8gZGFzIGkgaXN0IHNjaG9uIGFiZ2VhcmJlaXRldC4KKyAgaS0tOworICAvLyBub2NoIHdhcyB1ZWJyaWc/CisgIGlmIChpID49IDApCisgICAgY2FsbF9vdXQoIydfY2FsbF9Eb0RlY2F5LCA0LCBrbG9uZVswLi5pXSk7Cit9CisKKy8vIHplcnN0b2VydCBxdW90YSBQcm96ZW50IGRlciB2b3JoYW5kZW5lbiBVbml0cywgbGllZmVydCBkaWUgUmVzdG1lbmdlCisvLyB6dXJ1ZWNrLiBSdWZ0IGdnZi4gRG9EZWNheU1lc3NhZ2UoKQorcHVibGljIGludCBEb0RlY2F5KGludCBzaWxlbnQpIHsKKyAgLy8gbnVyIGZ1ZXIgQ2xvbmVzCisgIGlmICghY2xvbmVwKCkpCisgICAgcmV0dXJuIDA7CisgIFpERUJVRyhzcHJpbnRmKCJEb0RlY2F5KCkgaW4gJU9cbiIsTUUpKTsKKworICAvLyB3ZW5uIGRhcyBPYmpla3QgTk9fREVDQVkgb2RlciBOT19ERUNBWV9VTlRJTF9NT1ZFIGluIGRlbiBGbGFncworICAvLyB6ZXJmYWVsbHQgbml4LgorICBpbnQgZmxhZ3MgPSBRdWVyeVByb3AoUF9VTklUX0RFQ0FZX0ZMQUdTKTsKKyAgaWYgKChmbGFncyAmIE5PX0RFQ0FZKSB8fCAoZmxhZ3MgJiBOT19ERUNBWV9VTlRJTF9NT1ZFKSApCisgICAgcmV0dXJuIFF1ZXJ5UHJvcChQX0FNT1VOVCk7CisKKyAgaW50IHF1b3RhID0gUXVlcnlQcm9wKFBfVU5JVF9ERUNBWV9RVU9UQSk7CisKKyAgLy8gWnVnZXdpbm4gaXN0IG5pY2h0LiBBdXNzZXJkZW0ga2FubiBuaWNodCBtZWhyIHplcmZhbGxlbiwgYWxzIGRhIGlzdC4uLgorICAvLyBBbHNvIG9obmUgZ3VlbHRpZ2VzIFF1b3RhIHJhdXMuIE51ciBiZWkgYWJzLiBaZXJmYWxsIHNpbmQgWmFobGVuID4gMTAwMDAKKyAgLy8gZXJsYXVidCwgYmVpIHJlbGF0aXZlbiBaZXJmYWxsIHdhZXJlIGRhcyBzaW5ubG9zLgorICBpZiAocXVvdGEgPD0gMCB8fCAKKyAgICAgIChxdW90YSA+IDEwMDAwICYmICEoZmxhZ3MgJiBBQlNPTFVURV9ERUNBWSkgKSApIAorICAgIHJldHVybiBRdWVyeVByb3AoUF9BTU9VTlQpOworICAKKyAgaW50IGFtb3VudCA9IFF1ZXJ5UHJvcChQX0FNT1VOVCk7CisgIGludCBtaW5pbXVtID0gUXVlcnlQcm9wKFBfVU5JVF9ERUNBWV9NSU4pOworICAvLyBaZXJmYWxsIG51ciwgd2VubiBtYW4gbWVociBhbHMgZGFzIE1pbmltdW0gaGF0LgorICBpZiAoYW1vdW50ID4gbWluaW11bSkgeworICAgIGludCB6ZXJmYWxsOworICAgIGlmIChmbGFncyAmIEFCU09MVVRFX0RFQ0FZKSB7CisgICAgICAvLyBEZWNheSBRdW90YSBzb2xsIGVpbmZhY2ggYWxzIGFicy4gWmFobCBhdWZnZWZhc3N0IHdlcmRlbjoKKyAgICAgIHplcmZhbGwgPSBxdW90YTsKKyAgICB9CisgICAgZWxzZSBpZiAoZmxhZ3MgJiBJTkFDQ1VSQVRFX0RFQ0FZKSB7CisgICAgICAvLyBSdW5kdW5nc2ZlaGxlciBpZ25vcmllcmVuIHVuZCBkYWZ1ZXIgaW1tZXIgbWluLiBlaW5lIEVpbmhlaXQKKyAgICAgIC8vIHplcmZhbGxlbiBsYXNzZWluCisgICAgICB6ZXJmYWxsID0gKGFtb3VudCAqIHF1b3RhKSAvIDEwMDAwOworICAgICAgaWYgKHplcmZhbGwgPD0gMCkgemVyZmFsbCA9IDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgLy8gU3RhbmRhcmRmYWxsOgorICAgICAgLy8gbmljaHQtZ2FuenphaGxpZ2VuIFJlc3QgYWxzIFdhaHJzY2hlaW5saWNoa2VpdCBmdWVyIGRlbiBaZXJmYWxsIGVpbmVyCisgICAgICAvLyBFaW5oZWl0IGF1ZmZhc3NlbgorICAgICAgZmxvYXQgdG1wID0gYW1vdW50ICogcXVvdGEgLyAxMDAwMC4wOworICAgICAgemVyZmFsbCA9IHRvX2ludCh0bXApOworICAgICAgdG1wIC09IHplcmZhbGw7IC8vIFJlc3QgaW4gdG1wCisgICAgICAvLyB0bXAqbiBpc3QgZWluZSBaYWhsIHp3aXNjaGVuIDAgdW5kIG4sIHdlbm4gdG1wKm4gPiByYW5kb20obikrMSwKKyAgICAgIC8vIGRhbm4gemVyZmFlbGx0IGVpbmUgRWluaGVpdCBleHRyYS4gRGEgZGFzIFJhbmRvbSBmdWVyIGdyb3NzZSBaYWhsZW4KKyAgICAgIC8vIGJlc3NlciB2ZXJ0ZWlsdCBpc3QsIG5laG0gaWNoIG4gPSBfX0lOVF9NQVhfXworICAgICAgaWYgKGNlaWwodG1wICogX19JTlRfTUFYX18pID4gcmFuZG9tKF9fSU5UX01BWF9fKSArIDEpCisgICAgICAgIHplcmZhbGwrKzsKKyAgICB9CisKKyAgICAvLyBuaWNodCB1bnRlciBNaW5pbXVtIHplcmZhbGxlbgorICAgIGlmIChhbW91bnQgLSB6ZXJmYWxsIDwgbWluaW11bSkKKyAgICAgIHplcmZhbGwgPSBhbW91bnQgLSBtaW5pbXVtOworCisgICAgLy8gZXJzdCBnZ2YuIE1lbGR1bmcgYXVzZ2ViZW4uCisgICAgaWYgKCFzaWxlbnQgJiYgemVyZmFsbCA+IDApCisgICAgICBEb0RlY2F5TWVzc2FnZShhbW91bnQsIHplcmZhbGwpOworICAgIC8vIGRhbm4gcnVudGVyc2V0emVuLgorICAgIFNldFByb3AoUF9BTU9VTlQsIGFtb3VudCAtIHplcmZhbGwpOworICAgIFpERUJVRyhzcHJpbnRmKCIlTyBkZWNheWVkIGJ5ICVkXG4iLE1FLCB6ZXJmYWxsKSk7CisgICAgcmV0dXJuIGFtb3VudC16ZXJmYWxsOworICB9CisgIGVsc2UgaWYgKGFtb3VudCA8IDApCisgICAgcmV0dXJuIDA7IC8vIG5lZy4gQW56YWhsIGdpbHQgYWxzICIwIHVlYnJpZyIuCisgIAorICAvLyBzb25zdCBpc3RzIHdvaGwgendpc2NoZW4gMCB1bmQgbWluaW11bSwgbml4IGFlbmRlcnQgc2ljaC4KKyAgcmV0dXJuIGFtb3VudDsKK30KKworLy8gZ2lidCBkaWUgWmVyZmFsbHNtZWxkdW5nIGF1cy4gV2VubiBtYW4gbWl0IGRlciBTdGFuZGFyZG1lbGR1bmcgbmljaHQgenVmcmllZGVuCisvLyBpc3QgKGR1ZXJmdGUgZGVyIE5vcm1hbGZhbGwgc2VpbiksIHNvbGx0ZSBtYW4gZGllc2UgRnVua3Rpb24KKy8vIHVlYmVyc2NocmVpYmVuLiBCZWtvbW10IGJpc2hlcmlnZSB1bmQgamV0enQgZ2VyYWRlIHplcmZhbGxlbmUgTWVuZ2UKKy8vIHVlYmVyZ2ViZW4uIFdpY2h0aWc6IHp1IGRpZXNlbSBaZWl0cHVua3QgaGF0IHNpY2ggYW4gZGVyIFVuaXQgbm9jaCBuaXggKCEpCisvLyBnZWFlbmRlcnQhCitwcm90ZWN0ZWQgdm9pZCBEb0RlY2F5TWVzc2FnZShpbnQgb2xkYW1vdW50LCBpbnQgemVyZmFsbCkgeworICBzdHJpbmcgbXNnOworICBpZiAob2xkYW1vdW50ID09IHplcmZhbGwpIHsKKyAgICBpZiAobGl2aW5nKGVudmlyb25tZW50KCkpKSB7CisgICAgICB0ZWxsX29iamVjdChlbnZpcm9ubWVudCgpLCBicmVha19zdHJpbmcoc3ByaW50ZigKKyAgICAgICAgICAiQXVmIGVpbm1hbCAlcyVzIHp1IFN0YXViISIsCisgICAgICAgICAgKG9sZGFtb3VudD4xPyJ6ZXJmYWxsZW4gRGVpbmUgIjoiemVyZmFlbGx0IEQiKSwgbmFtZShXRVIpKSw3OCkpOworICAgIH0KKyAgICAvLyBkYXMgdGVsbF9yb29tKCkgbXVzcyBhdWYgamVkZW4gZmFsbCBzZWluLCB3ZWlsIGVzICJsZWJlbmRlIiBSYWV1bWUKKyAgICAvLyBnaWJ0LiBMaWVndCBkZXIgS1JhbSBpbiBlaW5lbSBzb2xjaGVuIHd1ZXJkZW4gZGllIExpdmluZ3MgaW4gZGllc2VtIFJhdW0KKyAgICAvLyBzb25zdCBrZWluZSBtZWxkdW5nIGtyaWVnZW4uCisgICAgdGVsbF9yb29tKGVudmlyb25tZW50KCksIGJyZWFrX3N0cmluZyhzcHJpbnRmKAorICAgICAgICAgICJBdWYgZWlubWFsICVzICVzIHp1IFN0YXViISIsCisgICAgICAgICAgKG9sZGFtb3VudD4xPyJ6ZXJmYWxsZW4iOiJ6ZXJmYWVsbHQiKSwgbmFtZShXRVIpKSw3OCksCisgICAgICAgICh7ZW52aXJvbm1lbnQoKX0pKTsKKyAgfQorICBlbHNlIHsKKyAgICAgaWYgKGxpdmluZyhlbnZpcm9ubWVudCgpKSkgeworICAgICAgdGVsbF9vYmplY3QoZW52aXJvbm1lbnQoKSwgYnJlYWtfc3RyaW5nKHNwcmludGYoCisgICAgICAgICAgIkF1ZiBlaW5tYWwgJXMgJWQgRGVpbmVyICVzIHp1IFN0YXViISIsCisgICAgICAgICAgKHplcmZhbGw+MT8iemVyZmFsbGVuIjoiemVyZmFlbGx0IiksCisgICAgICAgICAgemVyZmFsbCwgUXVlcnkoUF9OQU1FKVsxXSksNzgpKTsKKyAgICB9CisgICAgLy8gZGFzIHRlbGxfcm9vbSgpIG11c3MgYXVmIGplZGVuIGZhbGwgc2Vpbiwgd2VpbCBlcyAibGViZW5kZSIgUmFldW1lCisgICAgLy8gZ2lidC4gTGllZ3QgZGVyIEtSYW0gaW4gZWluZW0gc29sY2hlbiB3dWVyZGVuIGRpZSBMaXZpbmdzIGluIGRpZXNlbSBSYXVtCisgICAgLy8gc29uc3Qga2VpbmUgbWVsZHVuZyBrcmllZ2VuLgorICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudCgpLCBicmVha19zdHJpbmcoc3ByaW50ZigKKyAgICAgICAgICAiQXVmIGVpbm1hbCAlcyAlZCAlcyB6dSBTdGF1YiEiLAorICAgICAgICAgICh6ZXJmYWxsPjE/InplcmZhbGxlbiI6InplcmZhZWxsdCIpLAorICAgICAgICAgIHplcmZhbGwsIFF1ZXJ5KFBfTkFNRSlbMV0pLDc4KSwgKHtlbnZpcm9ubWVudCgpfSkgKTsgCisgIH0KK30KKworc3RhdGljIGludCBfcXVlcnlfdW5pdF9kZWNheV9pbnRlcnZhbCgpIHsKKyAgaWYgKGNsb25lcCgpKSB7CisgICAgLy8gZnVlciBjbG9uZXMgZGVuIFdlcnQgYXVzIGRlciBCUCBsaWVmZXJuLCBkZXIgV2VydCBpbiBDbG9uZXMgaXN0IGVoCisgICAgLy8gdW5pbnRlcmVzc2FudC4KKyAgICBpZiAob2JqZWN0cChibHVlcHJpbnQoKSkpCisgICAgICByZXR1cm4gYmx1ZXByaW50KCktPlF1ZXJ5UHJvcChQX1VOSVRfREVDQVlfSU5URVJWQUwpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBsb2FkX29iamVjdChsb2FkX25hbWUoKSktPlF1ZXJ5UHJvcChQX1VOSVRfREVDQVlfSU5URVJWQUwpOworICB9CisgIHJldHVybiBRdWVyeShQX1VOSVRfREVDQVlfSU5URVJWQUwpOworfQorCitzdGF0aWMgaW50IF9zZXRfdW5pdF9kZWNheV9pbnRlcnZhbChpbnQgemVpdCkgeworICAvLyBmdWVyIENsb25lcyBpc3QgZGllIFByb3Agc2lubmxvcyB1bmQga2FubiBuaWNodCBnZXNldHp0IHdlcmRlbi4KKyAgaWYgKGNsb25lcCgpKSB7CisgICAgaWYgKG9iamVjdHAoYmx1ZXByaW50KCkpKQorICAgICAgcmV0dXJuIGJsdWVwcmludCgpLT5RdWVyeVByb3AoUF9VTklUX0RFQ0FZX0lOVEVSVkFMKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gbG9hZF9vYmplY3QobG9hZF9uYW1lKCkpLT5RdWVyeVByb3AoUF9VTklUX0RFQ0FZX0lOVEVSVkFMKTsKKyAgfQorICAvLyB1ZWJlciBkaWVzZSBQcm9wIGxpZXNzZSBzaWNoIGRlciBSZXNldCByZWxhdGl2IGJlbGllYmlnIHZlcmFlbmRlcm4sCisgIC8vIHZlcmhpbmRlcm4sIGV0Yy4gRGFoZXIgZGFyZiBzaWUgbnVyIHZvbiBkaWVzZW0gT2JqZWt0IGdlc2V0enQgd2VyZGVuLCB2b24KKyAgLy8gV2Vpc2VuKyBvZGVyIGVpbmVzIE9iamVrdGVzLCBkYXMgZGllIGdsZWljaGUgVUlEIGhhdCB3aWUgZGllc2VzIGhpZXIgb2RlcgorICAvLyBkZXMgUHJvZ3JhbW1pZXJlcyBkaWVzZXMgT2JqZWt0cyBvZGVyIGVpbmVzIE1hZ2llcnMsIGRlciBiZXJlY2h0aWd0IGZ1ZXIKKyAgLy8gZGllIGpld2VpbGlnZSBVSUQgaXN0LiBMZXR6dGVyZSBiZWlkZW4gd2VyZGVuIHVlYmVyIGRlbiBSdWYgdm9uCisgIC8vIFF1ZXJ5VUlEc0ZvcldpemFyZCgpIGVybWl0dGVsdC4KKyAgLy8gZXJzdGVzIGZyZW1kZXMgT2JqZWt0IGZpbmRlbiB1bmQgcHJ1ZWZlbi4KKyAgZm9yZWFjaChvYmplY3QgcG86IGNhbGxlcl9zdGFjaygxKSkgeworICAgIGlmIChwbyAhPSBNRSkgeworICAgICAgLy8gZnJlbWRlbiBBdWZydWZlciBnZWZ1bmRlbgorICAgICAgaWYgKGdldHVpZChwbykgIT0gZ2V0dWlkKE1FKSAKKyAgICAgICAgICAmJiBtZW1iZXIobWFzdGVyKCktPlF1ZXJ5VUlEc0ZvcldpemFyZChnZXR1aWQocG8pKSxnZXR1aWQoTUUpKSA9PSAtMQorICAgICAgICAgICYmICghdGhpc19pbnRlcmFjdGl2ZSgpIHx8ICFJU19FTERFUih0aGlzX2ludGVyYWN0aXZlKCkpICkgKQorICAgICAgICAvLyB1bmJlcmVjaHRpZ3QsIEFiYnJ1Y2gKKyAgICAgICAgcmV0dXJuIFF1ZXJ5UHJvcChQX1VOSVRfREVDQVlfSU5URVJWQUwpOworICAgICAgZWxzZQorICAgICAgICAvLyBudXIgZGFzIGVyc3RlIGV4dC4gT2JqZWt0IGluIGRlciBDYWxsa2V0dGUgd2lyZCBnZXBydWVmdCwgcmF1cy4KKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHNldF9uZXh0X3Jlc2V0KHplaXQpOworICAvLyBmYWxscyBkaWVzIGF1cyBkZW0gY3JlYXRlKCkgZ2VzZXR6dCB3aXJkLCBtdXNzIHplaXR2ZXJ6b2VnZXJ0IGVpbmUKKyAgLy8gRnVua3Rpb24gdm9uIGF1c3NlbiBhbSBPYmpla3QgZ2VydWZlbiB3ZXJkZW4sIGRhIG5hY2ggZWluZW0gY3JlYXRlKCkgZGFzCisgIC8vIE9iamVrdCBhbHMgcmVzZXR0ZXQgZ2lsdCB1bmQgc29uc3Qga2VpbmVuIFJlc2V0IGtyaWVndC4KKyAgY2FsbF9vdXQoIl9xdWVyeV91bml0X2RlY2F5X2ludGVydmFsIiwxKTsKKyAgcmV0dXJuIFNldChQX1VOSVRfREVDQVlfSU5URVJWQUwsIHplaXQsIEZfVkFMVUUpOworfQorCitzdGF0aWMgaW50IF9xdWVyeV91bml0X2RlY2F5X3F1b3RhKCkgeworICBpZiAoY2xvbmVwKCkpIHsKKyAgICAvLyBoYXQgZGllc2VzIE9iamVrdCBlaW5lbiBlaWdlbmVuIHdlcnQgZ2VzcGVpY2hlcnQ/CisgICAgaW50IHF1b3RhPVF1ZXJ5KFBfVU5JVF9ERUNBWV9RVU9UQSwgRl9WQUxVRSk7CisgICAgaWYgKHF1b3RhKQorICAgICAgcmV0dXJuIHF1b3RhOworICAgIC8vIHNvbnN0IGRlbiBXZXJ0IGF1cyBkZXIgQmx1ZXByaW50CisgICAgaWYgKG9iamVjdHAoYmx1ZXByaW50KCkpKQorICAgICAgcmV0dXJuIGJsdWVwcmludCgpLT5RdWVyeVByb3AoUF9VTklUX0RFQ0FZX1FVT1RBKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gbG9hZF9vYmplY3QobG9hZF9uYW1lKCkpLT5RdWVyeVByb3AoUF9VTklUX0RFQ0FZX1FVT1RBKTsKKyAgfQorICByZXR1cm4gUXVlcnkoUF9VTklUX0RFQ0FZX1FVT1RBLCBGX1ZBTFVFKTsKK30KKworc3RhdGljIGludCBfc2V0X3VuaXRfZGVjYXlfcXVvdGEoaW50IHF1b3RhKSB7IAorICAvLyBtb21lbnRhbiBudXIgcXVvdGEgendpc2NoZW4gMCB1bmQgMTAwMDAKKyAgaWYgKHF1b3RhID49IDAgJiYgcXVvdGEgPD0xMDAwMCkKKyAgICByZXR1cm4gU2V0KFBfVU5JVF9ERUNBWV9RVU9UQSwgcXVvdGEsIEZfVkFMVUUpOworICBlbHNlCisgICAgcmV0dXJuIFF1ZXJ5KFBfVU5JVF9ERUNBWV9RVU9UQSwgRl9WQUxVRSk7Cit9CisKK3N0YXRpYyBpbnQgX3F1ZXJ5X3VuaXRfZGVjYXlfbWluKCkgeworICBpZiAoY2xvbmVwKCkpIHsKKyAgICAvLyBoYXQgZGllc2VzIE9iamVrdCBlaW5lbiBlaWdlbmVuIHdlcnQgZ2VzcGVpY2hlcnQ/CisgICAgaW50IG1pbmltdW09UXVlcnkoUF9VTklUX0RFQ0FZX01JTiwgRl9WQUxVRSk7CisgICAgaWYgKG1pbmltdW0pCisgICAgICByZXR1cm4gbWluaW11bTsKKyAgICAvLyBzb25zdCBkZW4gV2VydCBhdXMgZGVyIEJsdWVwcmludAorICAgIGlmIChvYmplY3RwKGJsdWVwcmludCgpKSkKKyAgICAgIHJldHVybiBibHVlcHJpbnQoKS0+UXVlcnlQcm9wKFBfVU5JVF9ERUNBWV9NSU4pOworICAgIGVsc2UKKyAgICAgIHJldHVybiBsb2FkX29iamVjdChsb2FkX25hbWUoKSktPlF1ZXJ5UHJvcChQX1VOSVRfREVDQVlfTUlOKTsKKyAgfQorICByZXR1cm4gUXVlcnkoUF9VTklUX0RFQ0FZX01JTiwgRl9WQUxVRSk7Cit9CisKK3N0YXRpYyBpbnQgX3F1ZXJ5X3VuaXRfZGVjYXlfZmxhZ3MoKSB7CisgIGlmIChjbG9uZXAoKSkgeworICAgIC8vIGhhdCBkaWVzZXMgT2JqZWt0IGVpbmVuIGVpZ2VuZW4gd2VydCBnZXNwZWljaGVydD8KKyAgICBpbnQgZmxhZ3M9UXVlcnkoUF9VTklUX0RFQ0FZX0ZMQUdTLCBGX1ZBTFVFKTsKKyAgICBpZiAoZmxhZ3MpCisgICAgICByZXR1cm4gZmxhZ3M7CisgICAgLy8gc29uc3QgZGVuIFdlcnQgYXVzIGRlciBCbHVlcHJpbnQKKyAgICBpZiAob2JqZWN0cChibHVlcHJpbnQoKSkpCisgICAgICByZXR1cm4gYmx1ZXByaW50KCktPlF1ZXJ5UHJvcChQX1VOSVRfREVDQVlfRkxBR1MpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBsb2FkX29iamVjdChsb2FkX25hbWUoKSktPlF1ZXJ5UHJvcChQX1VOSVRfREVDQVlfRkxBR1MpOworICB9CisgIC8vIERpZSBCUCBsaWVmZXJ0IGRlbiBXZXJ0IGF1ZiBqZWRlbiBGYWxsIG9obmUgTk9fREVDQVlfVU5USUxfTU9WRSB6dXJ1ZWNrLAorICAvLyB3ZWlsIGRpZXNlcyBGbGFnIGltIEZhbGxlIGRlciBCUCBuaWNodCB6dXJ1ZWNrZ2VzZXR6dCB3aXJkIHVuZCBiZWkgQ2xpZW50cyAKKyAgLy8gb2huZSBlaWdlbmUgRmxhZ3MgZGVyIFplcmZhbGwgc3RvcHBlbiB3dWVyZGUuCisgIHJldHVybiBRdWVyeShQX1VOSVRfREVDQVlfRkxBR1MsIEZfVkFMVUUpICYgfk5PX0RFQ0FZX1VOVElMX01PVkU7Cit9CisKZGlmZiAtLWdpdCBhL3N0ZC91c2VyX2ZpbHRlci5jIGIvc3RkL3VzZXJfZmlsdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQxOTBjOAotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC91c2VyX2ZpbHRlci5jCkBAIC0wLDAgKzEsNDM1IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gdXNlcl9maWx0ZXIuYyAtLSBIaWxmc21vZHVsIGZ1ZXIgZGllIHdlci1MaXN0ZQorLy8KKy8vICRJZDogdXNlcl9maWx0ZXIuYyA4NzU1IDIwMTQtMDQtMjYgMTM6MTM6NDBaIFplc3N0cmEgJAorI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworI3ByYWdtYSByYW5nZV9jaGVjaworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisKKyNkZWZpbmUgTUUgdGhpc19vYmplY3QoKQorCitzdGF0aWMgaW50IGlzX2luICggb2JqZWN0IG9iLCBtaXhlZCB4ICkKK3sKKyAgcmV0dXJuIChzdHJzdHIoIGxvd2VyX2Nhc2UoY291bnRyeShvYikpLCB4ICkgIT0gLTEgfHwKKyAgICAgICAgICBzdHJzdHIoIGxvd2VyX2Nhc2Uob2ItPlF1ZXJ5KFBfTE9DQVRJT04pIHx8ICIiKSwgeCApICE9IC0xKTsKK30KKworc3RhdGljIGludCBpc19hdCggb2JqZWN0IG9iLCBtaXhlZCB4ICkKK3sKKyAgcmV0dXJuIGVudmlyb25tZW50KG9iKSA9PSB4OworfQorCitzdGF0aWMgaW50IGlzX3dpel9sZXZlbF9sdCggb2JqZWN0IG9iLCBtaXhlZCB4ICkKK3sKKyAgcmV0dXJuIHF1ZXJ5X3dpel9sZXZlbChvYikgPCB4OworfQorCitzdGF0aWMgaW50IGlzX3dpel9sZXZlbF9nZSggb2JqZWN0IG9iLCBtaXhlZCB4ICkKK3sKKyAgcmV0dXJuIHF1ZXJ5X3dpel9sZXZlbChvYikgPj0geDsKK30KKworc3RhdGljIGludCBpc19wcm9wX3NldCggb2JqZWN0IG9iLCBtaXhlZCB4ICkKK3sKKyAgcmV0dXJuIChtaXhlZClvYi0+UXVlcnlQcm9wKHgpICE9IDA7Cit9CisKK3N0YXRpYyBpbnQgaXNfc2Vjb25kKCBvYmplY3Qgb2IsIG1peGVkIHggKQoreworICByZXR1cm4gb2ItPlF1ZXJ5UHJvcChQX1NFQ09ORCkgJiYgb2ItPlF1ZXJ5UHJvcChQX1NFQ09ORF9NQVJLKSA+IHg7Cit9CisKK3N0YXRpYyBpbnQgaXNfbWFnZV9zZWNvbmQoIG9iamVjdCBvYiApCit7CisgIHJldHVybiBvYi0+UXVlcnlQcm9wKFBfU0VDT05EKSAmJiBJU19MRUFSTkVSKG9iLT5RdWVyeVByb3AoUF9TRUNPTkQpKTsKK30KKworc3RhdGljIGludCBpc19pbl9naWxkZSggb2JqZWN0IG9iLCBtaXhlZCB4ICkKK3sKKyAgc3RyaW5nIHN0cjsKKworICAvLyBudXIgTWFnaWVyIGtvZW5uZW4gZWluZSBhbmRlcmUgR2lsZGUgcGVyIFBfVklTSUJMRV9HVUlMRCBpbiB3ZXJsaXN0ZW4KKyAgLy8gZXRjLiB2b3J0YWV1c2NoZW4uCisgIGlmIChJU19MRUFSTkVSKG9iKSkgeworICAgIC8vIFF1ZXJ5bWV0aG9kZSB2b24gUF9WSVNJQkxFX0dVSUxEIGZyYWd0IGdnZi4gYXVjaCBQX0dVSUxEIGFiLgorICAgIGlmICggIXN0cmluZ3Aoc3RyID0gKHN0cmluZylvYi0+UXVlcnlQcm9wKFBfVklTSUJMRV9HVUlMRCkpICkKKyAgICAgIHJldHVybiAwOworICB9CisgIGVsc2UgeworICAgICAgc3RyID0gKHN0cmluZylvYi0+UXVlcnlQcm9wKFBfR1VJTEQpOworICB9CisgIGlmICghc3RyaW5ncChzdHIpKSByZXR1cm4gMDsgLy8gbG9naW4gaGF0IHouQi4ga2VpbmUgR2lsZGUuCisgIHJldHVybiBzdHJzdHIobG93ZXJfY2FzZShzdHIpLHgpID09IDA7Cit9CisKK3N0YXRpYyBpbnQgaXNfaW5fdGVhbSggb2JqZWN0IG9iLCBtaXhlZCB4ICkKK3sKKyAgb2JqZWN0IHRlYW07CisgIAorICBpZiAoICFvYmplY3RwKHRlYW0gPSAob2JqZWN0KW9iLT5RdWVyeVByb3AoUF9URUFNKSkgKQorICAgIHJldHVybiB4ID09ICIiOworICAKKyAgcmV0dXJuIGxvd2VyX2Nhc2UoKHN0cmluZyl0ZWFtLT5OYW1lKCkpID09IHg7Cit9CisKK3N0YXRpYyBpbnQgaXNfbmFtZV9pbiggb2JqZWN0IG9iLCBtaXhlZCB4ICkKK3sKKyAgcmV0dXJuIG1lbWJlciggeCwgY2FwaXRhbGl6ZShnZXRldWlkKG9iKSkgKSA+PSAwOworfQorCitzdGF0aWMgaW50IGlzX2luX3JlZ2lvbiggb2JqZWN0IG9iLCBtaXhlZCB4ICkKK3sKKyAgcmV0dXJuIGVudmlyb25tZW50KG9iKSAmJgorICAgIChvYmplY3RfbmFtZShlbnZpcm9ubWVudChvYikpWzAuLihzaXplb2YoeCktMSldID09IHgpOworfQorCitzdGF0aWMgaW50IGlzX3JlZ2lvbl9tZW1iZXIoIG9iamVjdCBvYiwgbWl4ZWQgeCApCit7CisgIHJldHVybiAoaW50KW1hc3RlcigpLT5kb21haW5fbWVtYmVyKCBnZXRldWlkKG9iKSwgeCApOworfQorCitzdGF0aWMgaW50IGlzX3JlZ2lvbl9tYXN0ZXIoIG9iamVjdCBvYiwgbWl4ZWQgeCApCit7CisgIHJldHVybiAoaW50KW1hc3RlcigpLT5kb21haW5fbWFzdGVyKCBnZXRldWlkKG9iKSwgeCApOworfQorCitzdGF0aWMgaW50IGlzX2d1aWxkX21hc3RlcihvYmplY3Qgb2IsIG1peGVkIHgpCit7CisgIHJldHVybiAoaW50KW1hc3RlcigpLT5ndWlsZF9tYXN0ZXIoZ2V0ZXVpZChvYiksIHgpOworfQorCitzdGF0aWMgaW50IGlzX2dlbmRlciggb2JqZWN0IG9iLCBtaXhlZCB4ICkKK3sKKyAgcmV0dXJuIG9iLT5RdWVyeVByb3AoUF9HRU5ERVIpID09IHg7Cit9CisKK3N0YXRpYyBpbnQgaXNfcmFjZSggb2JqZWN0IG9iLCBtaXhlZCB4ICkKK3sKKyAgcmV0dXJuIG9iLT5RdWVyeVByb3AoUF9SQUNFKSA9PSB4OworfQorCitzdGF0aWMgaW50IGlzX3VubWFycmllZCggb2JqZWN0IG9iICkKK3sKKyAgcmV0dXJuIG9iLT5RdWVyeVByb3AoUF9NQVJSSUVEKSA9PSAwOworfQorCitzdGF0aWMgaW50IGlzX2lkbGUoIG9iamVjdCBvYiwgbWl4ZWQgeCApCit7CisgIHJldHVybiBxdWVyeV9pZGxlKG9iKSA+PSB4OworfQorCitzdGF0aWMgaW50IGlzX2hjKCBvYmplY3Qgb2IpCit7CisgIHJldHVybiBvYi0+cXVlcnlfaGNfcGxheSgpPjA7Cit9CisKK3N0YXRpYyBpbnQgaXNfZ2hvc3QoIG9iamVjdCBvYikKK3sKKyAgcmV0dXJuIChpbnQpb2ItPlF1ZXJ5UHJvcChQX0dIT1NUKTsKK30KKworc3RhdGljIGludCB1c2VzX3NzbChvYmplY3Qgb2IpCit7CisgIGlmKCF0aGlzX2ludGVyYWN0aXZlKCkgfHwgIUlTX0xFQVJORVIodGhpc19pbnRlcmFjdGl2ZSgpKSkKKyAgICByZXR1cm4gMDsKKyNpZiBfX0VGVU5fREVGSU5FRF9fKHRsc19xdWVyeV9jb25uZWN0aW9uX2luZm8pCisgIHJldHVybiB0bHNfcXVlcnlfY29ubmVjdGlvbl9pbmZvKG9iKSAhPSAwOworI2Vsc2UKKyAgcmV0dXJuIDA7CisjZW5kaWYKK30KKworcHJvdGVjdGVkIGludCBpc19hY3RpdmVfZ3VpZGUob2JqZWN0IG9iKSB7CisgICAgaW50IGNpYz0oaW50KW9iLT5RdWVyeVByb3AoUF9ORVdCSUVfR1VJREUpOworICAgIGlmICghaW50cChjaWMpIHx8IGNpYyA8PSAwKQorICAgICAgcmV0dXJuIDA7CisgICAgZWxzZSBpZiAoY2ljIDwgNjApCisgICAgICByZXR1cm4gMTsgLy8ga2xlaW5lciA2MHMgaW4gZGVyIFByb3AgLT4gaW1tZXIgYWt0aXYuCisgICAgZWxzZSBpZiAoY2ljIDw9IDg2NDAwKSB7CisgICAgICAvLyB3ZW5uIGxhZW5nZXIgaWRsZSBhbHMgY2ljIC0+IGluYWt0aXYKKyAgICAgIGlmIChxdWVyeV9pZGxlKG9iKSA+IGNpYykKKwlyZXR1cm4gMDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICAvLyB1bmd1ZWx0aWdlciBXZXJ0ZWJlcmVpY2ggLT4gaW5ha3Rpdi4KKyAgICByZXR1cm4gMDsKK30KKworb2JqZWN0ICpmaWx0ZXJfdXNlcnMoIHN0cmluZyBzdHIgKQoreworICBvYmplY3QgKnJlcywgKm9yaWcsICp6d2k7CisgIHN0cmluZyAqd29yZHM7CisgIGludCBpLCBzeiwgZiwgbCx0OworICBtaXhlZCB4OworICAKKyAgb3JpZyA9IHVzZXJzKCk7CisgIAorICBpZiAoIXN0cikKKyAgICByZXR1cm4gb3JpZzsKKyAgCisgIHJlcyA9ICh7fSk7CisgIHdvcmRzID0gb2xkX2V4cGxvZGUoIGxvd2VyX2Nhc2Uoc3RyKSwgIiAiICk7CisgIHN6ID0gc2l6ZW9mKHdvcmRzKTsKKyAgCisgIGZvciAoIGkgPSAwOyBpIDwgc3o7IGkrKyApeworICAgIHp3aSA9ICh7fSk7CisgICAgCisgICAgc3dpdGNoICh3b3Jkc1tpXSkgeworICAgIGNhc2UgImF1c3NlciI6CisgICAgY2FzZSAib2huZSI6CisgICAgY2FzZSAibmljaHQiOgorICAgICAgZj0tMTsKKyAgICAgIGlmICghaSkgcmVzPW9yaWc7CisgICAgICBjb250aW51ZTsKKyAgICAgIAorICAgIGNhc2UgIm9kZXIiOgorICAgICAgZj0wOworICAgICAgY29udGludWU7CisgICAgICAKKyAgICBjYXNlICJ1bmQiOgorICAgICAgZj0xOworICAgICAgY29udGludWU7CisgICAgICAKKyAgICBjYXNlICJhbGxlIjoKKyAgICAgIHp3aSA9IG9yaWc7CisgICAgICBicmVhazsKKworICAgIGNhc2UgImluIjoKKyAgICBjYXNlICJhdXMiOgorICAgICAgaWYgKCArK2kgPj0gc3ogKQorICAgICAgICBicmVhazsKKyAgICAgIHp3aSA9IGZpbHRlciggb3JpZywgImlzX2luIiwgTUUsIHdvcmRzW2ldICk7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgInJlZ2lvbiI6CisgICAgICBpZiAoICsraSA+PSBzeiApCisgICAgICAgIGJyZWFrOworICAgICAgendpID0gZmlsdGVyKCBvcmlnLCAiaXNfaW5fcmVnaW9uIiwgTUUsICIvZC8iICsgd29yZHNbaV0gKTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSAibWl0YXJiZWl0ZXIiOgorICAgIGNhc2UgInJlZ2lvbnNtaXRhcmJlaXRlciI6CisgICAgICBpZiAoICsraSA+PSBzeiApCisgICAgICAgIGJyZWFrOworICAgICAgendpID0gZmlsdGVyKCBvcmlnLCAiaXNfcmVnaW9uX21lbWJlciIsIE1FLCB3b3Jkc1tpXSApOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlICJyZWdpb25zbWFnaWVyIjoKKyAgICAgIGlmICggKytpID49IHN6ICkKKyAgICAgICAgYnJlYWs7CisgICAgICB6d2kgPSBmaWx0ZXIoIG9yaWcsICJpc19yZWdpb25fbWFzdGVyIiwgTUUsIHdvcmRzW2ldICk7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgImdpbGRlbm1hZ2llciI6CisgICAgICBpZiAoICsraSA+PSBzeiApCisJYnJlYWs7CisgICAgICB6d2kgPSBmaWx0ZXIgKG9yaWcsICJpc19ndWlsZF9tYXN0ZXIiLCBNRSwgd29yZHNbaV0gKTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSAiZ2lsZGUiOgorICAgICAgaWYgKCArK2kgPj0gc3ogKQorICAgICAgICBicmVhazsKKyAgICAgIHp3aSA9IGZpbHRlciggb3JpZywgImlzX2luX2dpbGRlIiwgTUUsIHdvcmRzW2ldICk7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgInRlYW0iOgorICAgICAgaWYgKCArK2kgPj0gc3ogKQorICAgICAgICBicmVhazsKKyAgICAgIHp3aSA9IGZpbHRlciggb3JpZywgImlzX2luX3RlYW0iLCBNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXJfY2FzZSgidGVhbSAiICsgd29yZHNbaV0pICk7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgImJlaSI6CisgICAgICBpZiAoICsraSA+PSBzeiApCisgICAgICAgIGJyZWFrOworICAgICAgaWYgKCAhb2JqZWN0cCh4ID0gZmluZF9wbGF5ZXIod29yZHNbaV0pICkgJiYKKyAgICAgICAgICAgIW9iamVjdHAoeCA9IGZpbmRfbGl2aW5nKHdvcmRzW2ldKSkgKQorICAgICAgICBicmVhazsKKyAgICAgIGlmICggeC0+UXVlcnlQcm9wKFBfSU5WSVMpICkKKyAgICAgICAgYnJlYWs7CisgICAgICB6d2kgPSBmaWx0ZXIoIG9yaWcsICJpc19hdCIsIE1FLCBlbnZpcm9ubWVudCh4KSApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICJnb2V0dGVyIjoKKyAgICAgIHp3aSA9IGZpbHRlciggb3JpZywgImlzX3dpel9sZXZlbF9nZSIsIE1FLCBHT0RfTFZMICk7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgImVyem1hZ2llciI6CisgICAgY2FzZSAiZXJ6aSI6CisgICAgY2FzZSAiZXJ6aXMiOgorICAgICAgendpID0gZmlsdGVyKCBvcmlnLCAiaXNfd2l6X2xldmVsX2dlIiwgTUUsIEFSQ0hfTFZMICk7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgIm1hZ2llciI6CisgICAgICB6d2kgPSBmaWx0ZXIoIG9yaWcsICJpc193aXpfbGV2ZWxfZ2UiLCBNRSwgTEVBUk5FUl9MVkwgKTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSAic3BpZWxlciI6CisgICAgICB6d2kgPSBmaWx0ZXIoIG9yaWcsICJpc193aXpfbGV2ZWxfbHQiLCBNRSwgU0VFUl9MVkwgKTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSAic2VoZXIiOgorICAgICAgendpID0gZmlsdGVyKCBmaWx0ZXIoIG9yaWcsICJpc193aXpfbGV2ZWxfbHQiLCBNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRUFSTkVSX0xWTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJpc193aXpfbGV2ZWxfZ2UiLCBNRSwgU0VFUl9MVkwgKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAibWFlbm5saWNoIjoKKyAgICAgIHp3aSA9IGZpbHRlciggb3JpZywgImlzX2dlbmRlciIsIE1FLCBNQUxFICk7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgIndlaWJsaWNoIjoKKyAgICAgIHp3aSA9IGZpbHRlciggb3JpZywgImlzX2dlbmRlciIsIE1FLCBGRU1BTEUgKTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSAibGVkaWciOgorICAgICAgendpID0gZmlsdGVyKCBvcmlnLCAiaXNfdW5tYXJyaWVkIiApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICJzc2wiOgorICAgIGNhc2UgInN0dW5uZWwiOgorICAgICAgendpID0gZmlsdGVyKG9yaWcsInVzZXNfc3NsIik7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgImhhcmRjb3JlIjoKKyAgICAgIHp3aSA9IGZpbHRlciggb3JpZywgImlzX2hjIiApOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlICJnZWlzdCI6CisgICAgY2FzZSAidG90IjoKKyAgICAgIHp3aSA9IGZpbHRlciggb3JpZywgImlzX2dob3N0IiApOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlICJtZW5zY2giOgorICAgICAgendpID0gZmlsdGVyKCBvcmlnLCAiaXNfcmFjZSIsIE1FLCAiTWVuc2NoIiApOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlICJ6d2VyZyI6CisgICAgICB6d2kgPSBmaWx0ZXIoIG9yaWcsICJpc19yYWNlIiwgTUUsICJad2VyZyIgKTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSAiZWxmIjoKKyAgICAgIHp3aSA9IGZpbHRlciggb3JpZywgImlzX3JhY2UiLCBNRSwgIkVsZiIgKTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSAiZmVsaW5lIiA6CisgICAgICB6d2kgPSBmaWx0ZXIoIG9yaWcsICJpc19yYWNlIiwgTUUsICJGZWxpbmUiICk7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgImhvYmJpdCI6CisgICAgICB6d2kgPSBmaWx0ZXIoIG9yaWcsICJpc19yYWNlIiwgTUUsICJIb2JiaXQiICk7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgImR1bmtlbGVsZiI6CisgICAgICB6d2kgPSBmaWx0ZXIoIG9yaWcsICJpc19yYWNlIiwgTUUsICJEdW5rZWxlbGYiICk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgImdvYmxpbiI6CisgICAgICB6d2kgPSBmaWx0ZXIoIG9yaWcsICJpc19yYWNlIiwgTUUsICJHb2JsaW4iICk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgIm9yayI6CisgICAgICB6d2kgPSBmaWx0ZXIoIG9yaWcsICJpc19yYWNlIiwgTUUsICJPcmsiICk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgImZyb3NjaCI6CisgICAgICB6d2kgPSBmaWx0ZXIoIG9yaWcsICJpc19wcm9wX3NldCIsIE1FLCBQX0ZST0cgKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAid2VnIjoKKyAgICAgIHp3aSA9IGZpbHRlciggb3JpZywgImlzX3Byb3Bfc2V0IiwgTUUsIFBfQVdBWSApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICJpZGxlIjoKKyAgICAgIHp3aSA9IGZpbHRlciggb3JpZywgImlzX2lkbGUiLCBNRSwgMTIwICk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgImlkbGV6ZWl0IjoKKyAgICAgIGlmICggKytpID49IHN6ICkKKyAgICAgICAgYnJlYWs7CisgICAgICBzc2NhbmYod29yZHNbaV0sIiVkIix0KTsKKyAgICAgIHp3aSA9IGZpbHRlciggb3JpZywgImlzX2lkbGUiLCBNRSwgNjAqdCApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICJjaWNlcm9uZSI6CisgICAgY2FzZSAiY2ljZXJvbmVzIjoKKyAgICAgIC8vIGlzX2FjdGl2ZV9ndWlkZSgpIGlzdCBpbiAvc3RkL3BsYXllci9ndWlkZS5jCisgICAgICB6d2kgPSBmaWx0ZXIoIG9yaWcsICMnaXNfYWN0aXZlX2d1aWRlKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAidGVzdGllIjoKKyAgICBjYXNlICJ0ZXN0aWVzIjoKKyAgICBjYXNlICJ0ZXN0c3BpZWxlciI6CisgICAgICB6d2kgPSBmaWx0ZXIoIG9yaWcsICJpc19wcm9wX3NldCIsIE1FLCBQX1RFU1RQTEFZRVIgKTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSAiendlaXRpZSI6CisgICAgY2FzZSAiendlaXRpZXMiOgorICAgIGNhc2UgInp3ZWl0c3BpZWxlciI6CisgICAgICAgIGlmIChJU19MRUFSTkVSKHRoaXNfcGxheWVyKCkpKQorICAgICAgICAgIHp3aSA9IGZpbHRlciggb3JpZywgImlzX3NlY29uZCIsIE1FLCAtMiApOworICAgICAgICBlbHNlCisgICAgICAgICAgendpID0gZmlsdGVyKCBvcmlnLCAiaXNfc2Vjb25kIiwgTUUsIC0xICk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgIm1hZ2llcnp3ZWl0aWUiOgorICAgIGNhc2UgIm1hZ2llcnp3ZWl0aWVzIjoKKyAgICBjYXNlICJtYWdpZXJ6d2VpdHNwaWVsZXIiOgorICAgICAgICBpZiAoSVNfQVJDSCh0aGlzX3BsYXllcigpKSkKKyAgICAgICAgICB6d2kgPSBmaWx0ZXIoIG9yaWcsICJpc19tYWdlX3NlY29uZCIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICJlcndhcnRldGUiOgorICAgICAgaWYgKCBpIDwgKHN6LTEpICYmIHdvcmRzW2krMV0gPT0gIndlZ2VuIiApIHsKKyAgICAgICAgaSsrOworCisgICAgICAgIGlmICggIW1hcHBpbmdwKHggPSAobWl4ZWQpdGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKFBfV0FJVEZPUl9SRUFTT04pKSB8fAorICAgICAgICAgICAgICFwb2ludGVycCh4ID0gbV9pbmRpY2VzKHgpKSApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIAorICAgICAgICB6d2kgPSBmaWx0ZXIoIG9yaWcsICJpc19uYW1lX2luIiwgTUUsIHggKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAKKyAgICAgIGlmICggIXBvaW50ZXJwKHggPSAobWl4ZWQpdGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKFBfV0FJVEZPUikpICkKKyAgICAgICAgYnJlYWs7CisgICAgICB6d2kgPSBmaWx0ZXIoIG9yaWcsICJpc19uYW1lX2luIiwgTUUsIHggKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAiaWNxIjoKKyAgICAgIHp3aSA9IGZpbHRlciggb3JpZywgImlzX3Byb3Bfc2V0IiwgTUUsIFBfSUNRICk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgInVybCI6CisgICAgY2FzZSAid3d3IjoKKyAgICAgIHp3aSA9IGZpbHRlciggb3JpZywgImlzX3Byb3Bfc2V0IiwgTUUsIFBfSE9NRVBBR0UgKTsKKyAgICAgIGJyZWFrOworICAgICAgICAgIAorICAgIGRlZmF1bHQ6CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgCisgICAgc3dpdGNoIChmKSB7CisgICAgY2FzZSAtMToKKyAgICAgIHJlcyAtPSB6d2k7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgMToKKyAgICAgIHJlcyAmPSB6d2k7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICByZXMgKz0gendpOworICAgIH0KKyAgfQorICAKKyAgcmV0dXJuIHJlczsKK30KKwpkaWZmIC0tZ2l0IGEvc3RkL3V0aWwvY2lkci5jIGIvc3RkL3V0aWwvY2lkci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YTAwZTUKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvdXRpbC9jaWRyLmMKQEAgLTAsMCArMSwyNiBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLyoqIFxmaWxlIC9zdGQvdXRpbC9jaWRyLmMKKyogRnVua3Rpb25lbiB6dXIgSW50ZXJwcmV0YXRpb24gdW5kIFVtcmVjaG51bmcgdm9uIElQLUFkcmVzc2VuIGluIENJRFItTm90YXRpb24uCisqIFxhdXRob3IgWmVzc3RyYQorKiBcZGF0ZSAwNS4wMi4yMDEwCisqIFx2ZXJzaW9uICRJZCQKKyovCisvKiBDaGFuZ2Vsb2c6CisqLworI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBub19zaGFkb3cKKyNwcmFnbWEgcGVkYW50aWMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKworLy8gTmV2ZXIgZG8gdGhpcyBhdCBob21lLiA7LSkKKy8vIERlciBIaW50ZXJncnVuZCBpc3QsIGRhc3MgZGVyIE1hc3RlciBtb2VnbGljaHN0IHdlbmlnIENvZGUgdm9uIGF1c3NlcmhhbGIKKy8vIC9zZWN1cmUvIGVyYmVuL2lua2x1ZGllcmVuIHNvbGx0ZSwgaWNoIGFiZXIgbnVyIGFuIGVpbmVyIFN0ZWxsZSBBZW5kZXJ1bmdlbgorLy8gdm9ybmVobWVuIG1vZWNodGUuLi4KKyNkZWZpbmUgcHJpdmF0ZSBwdWJsaWMKKyNpbmNsdWRlICIvc2VjdXJlL21hc3Rlci9jaWRyLmMiCisjdW5kZWYgcHJpdmF0ZQorCisvL3N0cmluZyBJUHY0X3Rlc3Qoc3RyaW5nIGFkZHIpIHtyZXR1cm4gKElQdjRfaW50MmFkZHIoSVB2NF9hZGRyMmludChhZGRyKSkpO30KKwpkaWZmIC0tZ2l0IGEvc3RkL3V0aWwvZXguYyBiL3N0ZC91dGlsL2V4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFlOWUyNwotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC91dGlsL2V4LmMKQEAgLTAsMCArMSwyOTMgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyB1dGlsL2V4LmMgLS0gZXggY29tcGF0aWJsZSBlZGl0b3IKKy8vCisvLyAkSWQ6IGV4LmMgOTE0MiAyMDE1LTAyLTA0IDIyOjE3OjI5WiBaZXNzdHJhICQKKworI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSBwZWRhbnRpYworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorCitpbmhlcml0ICIvc3RkL3V0aWwvaW5wdXQiOworCitwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIGN0cmwgPSAoW10pOworcHJpdmF0ZSBub3NhdmUgbWl4ZWQgYnVmOworCisjaW5jbHVkZSA8c3lzX2RlYnVnLmg+CisjdW5kZWYgQVJHUworI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPHBsYXllci5oPgorCisjZGVmaW5lIE1PREUJMAorIyAgZGVmaW5lIENNRAkJMAorIyAgZGVmaW5lIElOUAkJMQorI2RlZmluZSBURVhUCTEKKyNkZWZpbmUgTElORQkyCisjZGVmaW5lIEZVTkMJMworI2RlZmluZSBBUkdTCTQKKyNkZWZpbmUgRkxBRwk1CisjICBkZWZpbmUgTlVNCQkxCisjZGVmaW5lIENIRwk2CisKKyNkZWZpbmUgWUFOSwkiQFlBTksiCisKK2ludCBldmFsdWF0ZShzdHJpbmcgaW4pOworCit2YXJhcmdzIGludCBlcnJvcihzdHJpbmcgbXNnLCBzdHJpbmcgYXJnKQoreworICBpZihzdHJpbmdwKGFyZykpIHdyaXRlKGFyZysiOiAiK21zZysiXG4iKTsKKyAgZWxzZSB3cml0ZShtc2crIlxuIik7Cit9CisKK3N0cmluZyBzdWJzdGl0dXRlKHN0cmluZyBzLCBzdHJpbmcgcmVnZXgsIHN0cmluZyBuLCBzdHJpbmcgZXh0cmEpCit7CisgIG1peGVkIGRlbDsgaW50IGk7CisgIGlmKChpID0gc2l6ZW9mKGRlbCA9IHJlZ2V4cGxvZGUocywgcmVnZXgpKSkgPCAyKSByZXR1cm4gczsKKyAgaWYobWVtYmVyKGV4dHJhLCAnZycpID09IC0xKSBpID0gMTsKKyAgZWxzZSBpIC09IDI7CisgIHdoaWxlKGk+MCkgeworICAgIGRlbFtpXSA9IG47CisgICAgaSAtPSAyOworICB9CisgIHJldHVybiBpbXBsb2RlKGRlbCwgIiIpOworfQorCisvLyBzYXZlVGV4dCgpIC0tIHNhdmUgZWRpdGVkIHRleHQKKy8vCitpbnQgc2F2ZVRleHQoKQoreworICBzdHJpbmcgdGV4dDsKKyAgdGV4dCA9IGltcGxvZGUoY3RybFtidWZdW1RFWFRdWzEuLl0sICJcbiIpKyJcbiI7CisgIGVycm9yKHNwcmludGYoIiVPLCAlZCBaZWlsZW4sICVkIFplaWNoZW4iLCAKKwkgICAgICAgYnVmID8gYnVmIDogIiIsIHNpemVvZihjdHJsW2J1Zl1bVEVYVF0pLTEsCisJICAgICAgIHNpemVvZih0ZXh0KSkpOworICBpZihjdHJsW2J1Zl1bRlVOQ10pIGFwcGx5KGN0cmxbYnVmXVtGVU5DXSwgY3RybFtidWZdW0FSR1NdLCB0ZXh0KTsKKyAgY3RybCA9IG1fY29weV9kZWxldGUoY3RybCwgYnVmKTsKKyAgY3RybCA9IG1fY29weV9kZWxldGUoY3RybCwgYnVmKyIhIik7CisgIGJ1ZiA9IDA7CisgIHJldHVybiAxOworfQorCisvLyBjbWRQcm9tcHQoKSAtLSBjcmVhdGUgY29tbWFuZCBwcm9tcHQKKy8vCitzdHJpbmcgY21kUHJvbXB0KGludCBtb2RlLCBtaXhlZCB0ZXh0LCBpbnQgbGluZSwgaW50IG1heGwpCit7CisgIHJldHVybiAiOiI7Cit9CisKKy8vIGlucHV0UHJvbXB0KCkgLS0gY3JlYXRlIGlucHV0IHByb21wdAorLy8KK3N0cmluZyBpbnB1dFByb21wdCgpCit7CisgIGlmKGN0cmxbYnVmXVtGTEFHXSAmIE5VTSkgcmV0dXJuIHNwcmludGYoIlslMDJkXSAiLCBjdHJsW2J1Zl1bTElORV0pOworICByZXR1cm4gIiI7Cit9CisKK3N0cmluZyBBZGROdW0oc3RyaW5nIHMpCit7CisgIHN0cmluZyByOworICByID0gaW5wdXRQcm9tcHQoKStzOworICBjdHJsW2J1Zl1bTElORV0rKzsKKyAgcmV0dXJuIHI7Cit9CisKK3ZvaWQgc2hvd0xpbmVzKGludCBmcm9tLCBpbnQgdG8pCit7CisgIHdyaXRlKGltcGxvZGUobWFwKGN0cmxbYnVmXVtURVhUXVtmcm9tLi50b10sICMnQWRkTnVtKSwgIlxuIikrIlxuIik7CisgIGN0cmxbYnVmXVtMSU5FXSA9IGZyb207Cit9CisKKy8vIGNvbW1hbmRNb2RlKCkgLS0gaGFuZGxlIGNvbW1hbmRzCisvLworaW50IGNvbW1hbmRNb2RlKHN0cmluZyBpbikKK3sKKyAgaW50IGZyb20sIHRvLCBzd2FwOworICBzdHJpbmcgY21kOworCisgIGlmKCFpbikgcmV0dXJuIDA7CisgIGlmKGluWzAuLjFdID09ICJzZSIpIHsKKyAgICBjdHJsW2J1Zl1bRkxBR10gXj0gTlVNOworICAgIHJldHVybiAwOworICB9CisgICAgCisgIGlmKHNzY2FuZihpbiwgIiVkLCVkJXMiLCBmcm9tLCB0bywgY21kKSAhPSAzKQorICAgIGlmKHNzY2FuZihpbiwgIiVkJXMiLCBmcm9tLCBjbWQpICE9IDIpCisgICAgICBpZighc3RyaW5ncChpbikpIHJldHVybiBlcnJvcigiS2VpbiBFZGl0b3Jrb21tYW5kbyIsIGluKTsKKyAgICAgIGVsc2UgeyBjbWQgPSBpbjsgZnJvbSA9IHRvID0gY3RybFtidWZdW0xJTkVdOyB9CisgICAgZWxzZSB0byA9IGZyb207CisKKyAgaWYoZnJvbSA8IDApIGZyb20gPSBzaXplb2YoY3RybFtidWZdW1RFWFRdKS0xK2Zyb207CisgIGlmKHRvIDwgMSkgdG8gPSBzaXplb2YoY3RybFtidWZdW1RFWFRdKS0xK3RvOworICBpZih0byAmJiB0byA8IGZyb20pIHJldHVybiBlcnJvcigiRXJzdGUgQWRyZXNzZSBncm9lc3NlciBhbHMgZGllIFp3ZWl0ZSIpOworICBpZihmcm9tKSBjdHJsW2J1Zl1bTElORV0gPSBmcm9tOworICBpZihmcm9tID4gc2l6ZW9mKGN0cmxbYnVmXVtURVhUXSktMSB8fAorICAgICB0byA+IHNpemVvZihjdHJsW2J1Zl1bVEVYVF0pLTEpIAorICAgIHJldHVybiBlcnJvcigiTmljaHQgc28gdmllbGUgWmVpbGVuIGltIFNwZWljaGVyIik7CisgIGlmKCF0bykgdG8gPSBmcm9tOworICBzd2l0Y2goY21kWzBdKQorICB7CisgIGNhc2UgJ2gnOgorICAgIHdyaXRlKCJleDogS29tbWFuZG9oaWxmZVxuXG4iCisJICJBbGxlIEtvbW1hbmRvcyBmdW5rdGlvbmllcmVuIG5hY2ggZm9sZ2VuZGVtIFByaW56aXA6XG4iCisJICJBZHJlc3NlIEtvbW1hbmRvIEFyZ3VtZW50ZVxuIgorCSAiQWRyZXNzZW4gd2VyZGVuIGdlYmlsZGV0IGR1cmNoOiBaZWlsZVZvbixaZWlsZUJpc1xuIgorCSAiKFplaWxlQmlzIGthbm4gd2VnZ2VsYXNzZW4gd2VyZGVuLCBzYW10IEtvbW1hKVxuIgorCSAiS29tbWFuZG9zOlxuIgorCSAiICBxLHggLS0gRWRpdG9yIHZlcmxhc3NlblxuIgorCSAiICByICAgLS0gRGF0ZWkgZWluZnVlZ2VuXG4iCisJICIgICAgICAgICByPGRhdGVpPlxuIgorCSAiICBhICAgLS0gVGV4dCBoaW50ZXIgZGVyIGFrdHVlbGxlbiBaZWlsZSBlaW5mdWVnZW5cbiIKKwkgIiAgaSAgIC0tIFRleHQgdm9yIGRlciBha3R1ZWxsZW4gWmVpbGUgZWluZnVlZ2VuXG4iCisJICIgIGQgICAtLSBaZWlsZW4gbG9lc2NoZW5cbiIKKwkgIiAgeSAgIC0tIFplaWxlbiB6d2lzY2hlbnNwZWljaGVyblxuIgorCSAiICBwdSAgLS0gWndpc2NoZW5nZXNwZWljaGVydGUgWmVpbGVuIGVpbmZ1ZWdlblxuIgorCSAiICBzICAgLS0gU3Vic3RpdHV0aW9uIHZvbiBUZXh0IGluIFplaWxlblxuIgorCSAiICAgICAgICAgcy9BbHRlclRleHQvTmV1ZXJUZXh0L1xuIgorICAgICAgICAgICIgIHAsbCAtLSBaZWlsZW4gYW56ZWlnZW5cbiIKKwkgIiAgeiAgIC0tIEVpbmUgU2VpdGUgYW56ZWlnZW5cbiIpOworICAgIGJyZWFrOworICBjYXNlICdxJzoKKyAgICBpZihjdHJsW2J1Zl1bQ0hHXSkKKyAgICAgIGlmKCEoc2l6ZW9mKGNtZCkgPiAxICYmIGNtZFsxXT09JyEnKSkKKyAgICAgICAgcmV0dXJuIGVycm9yKCJEYXRlaSB3dXJkZSBnZWFlbmRlcnQhIEFiYnJlY2hlbiBtaXQgcSEiKTsKKyAgICAgIGVsc2UgY3RybFtidWZdID0gY3RybFtidWYrIiEiXTsKKyAgY2FzZSAneCc6CisgICAgaWYoc2F2ZVRleHQoKSkgcmV0dXJuIDE7CisgIGNhc2UgJ3InOgorICAgIGlmKCFJU19XSVpBUkQodGhpc19wbGF5ZXIoKSkpCisgICAgICByZXR1cm4gZXJyb3IoIktvbW1hbmRvIGdlc3BlcnJ0IiwgY21kWzAuLjBdKTsKKyAgICBpZihmaWxlX3NpemUoY21kWzEuLl0pIDwgMCkgCisgICAgICByZXR1cm4gZXJyb3IoIkRhdGVpIG5pY2h0IGdlZnVuZGVuIiwgIlwiIitjbWRbMS4uXSsiXCIiKTsKKyAgICBjdHJsW2J1Zl1bVEVYVF0gPSBjdHJsW2J1Zl1bVEVYVF1bMC4uZnJvbV0gCisJCSAgKyBleHBsb2RlKHJlYWRfZmlsZShjbWRbMS4uXSksICJcbiIpCisJICAgICAgICAgICArIGN0cmxbYnVmXVtURVhUXVsoZnJvbSA9PSB0byA/IHRvKzEgOiB0bykuLl07CisgICAgY3RybFtidWZdW0NIR10gPSAxOworICAgIGJyZWFrOworICBjYXNlICdhJzoKKyAgICBjdHJsW2J1Zl1bTU9ERV0gPSBJTlA7CisgICAgd3JpdGUoIlRleHRlaW5nYWJlOiAoLiBiZWVuZGV0IHp1bSBLb21tYW5kb21vZHVzLCAqKiBiZWVuZGV0IGdhbnopXG4iKTsKKyAgICBpbnB1dCgjJ2lucHV0UHJvbXB0LCAwLCAjJ2V2YWx1YXRlKTsgCisgICAgY3RybFtidWZdW0NIR10gPSAxOworICAgIHJldHVybiAxOworICBjYXNlICdpJzoKKyAgICBjdHJsW2J1Zl1bTU9ERV0gPSBJTlA7CisgICAgY3RybFtidWZdW0xJTkVdLS07CisgICAgd3JpdGUoIlRleHRlaW5nYWJlOiAoLiBiZWVuZGV0IHp1bSBLb21tYW5kb21vZHVzLCAqKiBiZWVuZGV0IGdhbnopXG4iKTsKKyAgICBpbnB1dCgjJ2lucHV0UHJvbXB0LCAwLCAjJ2V2YWx1YXRlKTsKKyAgICBjdHJsW2J1Zl1bQ0hHXSA9IDE7CisgICAgcmV0dXJuIDE7CisgIGNhc2UgJ2QnOgorICAgIGN0cmxbYnVmXVtURVhUXVtmcm9tLi50b10gPSAoe30pOworICAgIGN0cmxbYnVmXVtDSEddID0gMTsKKyAgICBicmVhazsKKyAgY2FzZSAneSc6CisgICAgY3RybFtZQU5LXSA9IGN0cmxbYnVmXVtURVhUXVtmcm9tLi50b107CisgICAgaWYodG8gLSBmcm9tKSBlcnJvcih0by1mcm9tKzErIiBaZWlsZW4gZ2VzcGVpY2hlcnQiKTsKKyAgICBicmVhazsKKyAgY2FzZSAncyc6CisgIHsKKyAgICBtaXhlZCByZWcsIG5ldywgZXh0cmEsIHNjbWQ7CisgICAgaWYoc2l6ZW9mKHNjbWQgPSBvbGRfZXhwbG9kZShjbWRbMS4uXSwgY21kWzEuLjFdKSkgPCAyKQorICAgICAgcmV0dXJuIGVycm9yKCJTdWJzdGl0dXRpb24gZmVobGdlc2NobGFnZW4iKTsKKyAgICByZWcgPSBzY21kWzBdOyBuZXcgPSBzY21kWzFdOworICAgIGlmKHNpemVvZihzY21kKSA+IDIpIGV4dHJhID0gc2NtZFsyXTsKKyAgICBlbHNlIGV4dHJhID0gIiI7CisgICAgY3RybFtidWZdW1RFWFRdW2Zyb20uLnRvXSA9IG1hcChjdHJsW2J1Zl1bVEVYVF1bZnJvbS4udG9dLCAKKwkJCQkgICAgICAjJ3N1YnN0aXR1dGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnLCBuZXcsIGV4dHJhKTsKKyAgICBzaG93TGluZXMoZnJvbSwgdG8pOworICAgIGN0cmxbYnVmXVtDSEddID0gMTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlICd6JzoKKyAgICBzaG93TGluZXMoY3RybFtidWZdW0xJTkVdLCAKKwkgICAgIGN0cmxbYnVmXVtMSU5FXSt0aGlzX3BsYXllcigpLT5RdWVyeVByb3AoUF9TQ1JFRU5TSVpFKSk7CisgICAgY3RybFtidWZdW0xJTkVdICs9IHRoaXNfcGxheWVyKCktPlF1ZXJ5UHJvcChQX1NDUkVFTlNJWkUpOworICAgIGJyZWFrOworICBjYXNlICdwJzoKKyAgICBpZihzaXplb2YoY21kKSA+IDEgJiYgY21kWzFdID09ICd1JykKKyAgICB7CisgICAgICBpZighcG9pbnRlcnAoY3RybFtZQU5LXSkpIHJldHVybiBlcnJvcigiS2VpbmUgWmVpbGVuIGltIFNwZWljaGVyIik7CisgICAgICBpZihmcm9tID49IGN0cmxbYnVmXVtMSU5FXSkgY3RybFtidWZdW1RFWFRdICs9IGN0cmxbWUFOS107CisgICAgICBlbHNlCisgICAgICAgIGN0cmxbYnVmXVtURVhUXVswLi5mcm9tXSArIGN0cmxbWUFOS10gKyBjdHJsW2J1Zl1bVEVYVF1bZnJvbSsxLi5dOworICAgICAgY3RybFtidWZdW0xJTkVdICs9IHNpemVvZihjdHJsW1lBTktdKTsKKyAgICAgIGN0cmxbWUFOS10gPSAwOworICAgICAgc2hvd0xpbmVzKGN0cmxbYnVmXVtMSU5FXSwgY3RybFtidWZdW0xJTkVdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgY2FzZSAnbCc6CisgIGRlZmF1bHQ6CisgICAgaWYoIWZyb20pIAorICAgIHsKKyAgICAgIGVycm9yKCJLZWluIEVkaXRvcmtvbW1hbmRvIiwgc3ByaW50ZigiJWMiLCBjbWRbMF0pKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBzaG93TGluZXMoZnJvbSwgdG8pOworICB9CisgIGlucHV0KCMnY21kUHJvbXB0LCAwLCAjJ2V2YWx1YXRlKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIGlucHV0TW9kZSgpIC0tIGhhbmRsZSBpbnB1dCBtb2RlIGNvbW1hbmRzCisvLworaW50IGlucHV0TW9kZShzdHJpbmcgaW4pCit7CisgIHN3aXRjaChpbikKKyAgeworICBjYXNlICIuIjogCisgICAgY3RybFtidWZdW01PREVdID0gQ01EOworICAgIGN0cmxbYnVmXVtMSU5FXS0tOworICAgIGlucHV0KCMnY21kUHJvbXB0LCAwLCAjJ2V2YWx1YXRlKTsKKyAgICBicmVhazsKKyAgY2FzZSAiKioiOgorICAgIHJldHVybiBzYXZlVGV4dCgpOworICBkZWZhdWx0OgorICAgIGlmKCFpbikgLyogZG8gbm90aGluZyBub3cgKi87CisgICAgaWYoY3RybFtidWZdW0xJTkVdIDwgc2l6ZW9mKGN0cmxbYnVmXVtURVhUXSktMSkKKyAgICAgIGN0cmxbYnVmXVtURVhUXSA9IGN0cmxbYnVmXVtURVhUXVswLi5jdHJsW2J1Zl1bTElORV0tMV0gKyAoeyBpbiB9KSAKKwkgICAgICAgICsgY3RybFtidWZdW1RFWFRdW2N0cmxbYnVmXVtMSU5FXS4uXTsKKyAgICBlbHNlIGN0cmxbYnVmXVtURVhUXSArPSAoeyBpbiB9KTsKKyAgICBjdHJsW2J1Zl1bTElORV0rKzsKKyAgICBpbnB1dCgjJ2lucHV0UHJvbXB0LCAwLCAjJ2V2YWx1YXRlKTsKKyAgICBicmVhazsKKyAgfQorICByZXR1cm4gMTsKK30KKworLy8gZXZhbHVhdGUoKSAtLSBldmFsdWF0ZSBpbnB1dCAoaW4pIGluIGNvbnRleHQgKGN0cmxbYnVmXSkKKy8vCitpbnQgZXZhbHVhdGUoc3RyaW5nIGluKQoreworICBzd2l0Y2goY3RybFtidWZdW01PREVdKQorICB7CisgICAgY2FzZSBJTlA6IHJldHVybiBpbnB1dE1vZGUoaW4pOworICAgIGNhc2UgQ01EOiByZXR1cm4gY29tbWFuZE1vZGUoaW4pOworICAgIGRlZmF1bHQgOiByZXR1cm4gMDsKKyAgfQorfQorCit2b2lkIFN0YXJ0RVgoc3RyaW5nIGluLCBtaXhlZCBjKQoreworICBpZighaW4gfHwgaW4gPT0gImoiIHx8IGluID09ICJKIikgY3RybFtidWZdID0gYzsKKyAgZWxzZSBpZihpbiAmJiAoaW4gIT0gIm4iICB8fCBpbiAhPSAiTiIpKQorICAgIHJldHVybiAwOworICBjdHJsW2J1ZisiISJdID0gY3RybFtidWZdOworICBpbnB1dCgjJ2NtZFByb21wdCwgMCwgIydldmFsdWF0ZSk7Cit9CisKK3ZhcmFyZ3MgaW50IGV4KG1peGVkIHRleHQsIGNsb3N1cmUgZnVuYywgbWl4ZWQgZmFyZ3MsIHN0cmluZyBidWZmZXIpCit7CisgIGludCBjLCBsOworICBtaXhlZCBjdDsKKyAgaWYoIXRleHQpIHRleHQgPSAiIjsKKyAgYyA9IHNpemVvZih0ZXh0KTsKKyAgbCA9IHNpemVvZih0ZXh0ID0gZXhwbG9kZSh0ZXh0LCAiXG4iKSkgLSAxOworICBjdCA9ICh7IENNRCwgdGV4dCwgMCwgZnVuYywgZmFyZ3MsIDAsIDB9KTsKKyAgaWYoIWN0cmxbYnVmZmVyXSkgU3RhcnRFWCgwLCBjdCk7CisgIGVsc2UgaW5wdXQoc3ByaW50ZigiRXMgZXhpc3RpZXJ0IGJlcmVpdHMgVGV4dCEgVmVyd2VyZmVuPyBbal0iKSwKKwkgICAgMCwgIydTdGFydEVYLCBjdCk7CisgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvc3RkL3V0aWwvZXhlY3V0ZXIuYyBiL3N0ZC91dGlsL2V4ZWN1dGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUwZjcwNwotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC91dGlsL2V4ZWN1dGVyLmMKQEAgLTAsMCArMSwzOSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHV0aWxzL2V4ZWN1dGVyLmMgLSBIZWxmZXIgenVtIEF1c2Z1ZWhyZW4gdm9tIEtyYW0KKy8vCisvLyAkSWQ6IHNraWxscy5jIDY2NzMgMjAwOC0wMS0wNSAyMDo1Nzo0M1ogWmVzc3RyYSAkCisjcHJhZ21hIHN0cmljdF90eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisKK3Byb3RlY3RlZCBtaXhlZCBleGVjdXRlX2FueXRoaW5nKG1peGVkIGZ1biwgdmFyYXJncyBtaXhlZCBhcmdzKQoreworICBpZiAoIGNsb3N1cmVwKGZ1bikgJiYgb2JqZWN0cChxdWVyeV9jbG9zdXJlX29iamVjdChmdW4pKSApCisgICAgcmV0dXJuIGFwcGx5KGZ1biwgYXJncyk7CisKKyAgaWYgKHN0cmluZ3AoZnVuKSkKKyAgICByZXR1cm4gY2FsbF9vdGhlcih0aGlzX29iamVjdCgpLCBmdW4sIGFyZ3MuLi4pOworCisgIGlmICggcG9pbnRlcnAoZnVuKSAmJiBzaXplb2YoZnVuKT09MiApCisgIHsKKyAgICBvYmplY3Qgb2I7CisgICAgaWYgKHNpemVvZihmdW4pPjIpCisgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJleGVjdXRlX2FueXRoaW5nKCk6IGZpcnN0IGFyZ3VtZW50IG1heSBvbmx5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaGF2ZSAyIGVsZW1lbnRzIGlmIGFycmF5LlxuIikpOworCisgICAgaWYgKCBzdHJpbmdwKGZ1blswXSkgKQorICAgICAgb2I9ZmluZF9vYmplY3QoZnVuWzBdKTsKKyAgICBlbHNlCisgICAgICBvYj1mdW5bMF07CisKKyAgICBpZiAoICFvYmplY3RwKG9iKSB8fCAhc3RyaW5ncChmdW5bMV0pICkKKyAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGNhbGxfb3RoZXIob2IsIGZ1blsxXSwgYXJncy4uLik7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL3N0ZC91dGlsL2lucHV0LmMgYi9zdGQvdXRpbC9pbnB1dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NWJjODQKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvdXRpbC9pbnB1dC5jCkBAIC0wLDAgKzEsMzEgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyB1dGlsL2lucHV0LmMgLS0gZ2VuZXJpYyBpbnB1dCBoYW5kbGluZworLy8KKy8vICRJZDogaW5wdXQuYyA4MzQ5IDIwMTMtMDItMDQgMjE6MTU6MjhaIFplc3N0cmEgJAorCisjaW5jbHVkZSA8aW5wdXRfdG8uaD4KKworI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSBwZWRhbnRpYworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorCit2YXJhcmdzIHZvaWQgaW5wdXQobWl4ZWQgcHJvbXB0LCBtaXhlZCBwYXJncywgbWl4ZWQgY3RybCwgbWl4ZWQgY3RybGFyZ3MpCit7CisgIG1peGVkIHByb21wdHRleHQ7CisgIGlmKGNsb3N1cmVwKHByb21wdCkpCisgICAgcHJvbXB0dGV4dCA9IGFwcGx5KHByb21wdCwgcG9pbnRlcnAocGFyZ3MpID8gcGFyZ3MgOiAoe30pKTsKKyAgZWxzZSBwcm9tcHR0ZXh0ID0gcHJvbXB0OworICBpZiAoIXN0cmluZ3AocHJvbXB0dGV4dCkpIHByb21wdHRleHQ9IiI7CisgIGlucHV0X3RvKCJkb25lIiwgSU5QVVRfUFJPTVBULCBwcm9tcHR0ZXh0LCBwcm9tcHQsIHBhcmdzLCBjdHJsLCBjdHJsYXJncyk7Cit9CisKK3ZvaWQgZG9uZShzdHJpbmcgaW4sIG1peGVkIHByb21wdCwgbWl4ZWQgcGFyZ3MsIG1peGVkIGN0cmwsIG1peGVkIGN0cmxhcmdzKQoreworICBpZihjbG9zdXJlcChjdHJsKSAmJgorICAgICBhcHBseShjdHJsLCAoeyBpbiB9KSArIChwb2ludGVycChjdHJsYXJncykgPyBjdHJsYXJncyA6ICh7fSkpKSkgCisgICAgcmV0dXJuOworICBpbnB1dChwcm9tcHQsIHBhcmdzLCBjdHJsLCBjdHJsYXJncyk7Cit9CmRpZmYgLS1naXQgYS9zdGQvdXRpbC9wYWdlci5jIGIvc3RkL3V0aWwvcGFnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDcxYjg1Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkL3V0aWwvcGFnZXIuYwpAQCAtMCwwICsxLDE0MiBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHV0aWwvcGFnZXIuYyAtLSBnZW5lcmljIHBhZ2VyCisvLworLy8gJElkOiBwYWdlci5jIDg3NTUgMjAxNC0wNC0yNiAxMzoxMzo0MFogWmVzc3RyYSAkCisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgcGVkYW50aWMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKworaW5oZXJpdCAiL3N0ZC91dGlsL2lucHV0IjsKKworI2luY2x1ZGUgPHBhZ2VyLmg+CisjaW5jbHVkZSA8c3lzX2RlYnVnLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisKK3N0cmluZyBwcm9tcHQobWl4ZWQgcGluZm8sIHN0cmluZyBhZGQpCit7CisgIHJldHVybiBzcHJpbnRmKE1TR19QUk9NUFQrIiVzIiwgc3RyaW5ncChhZGQpP2FkZDoiIik7Cit9CisKK3N0cmluZyBmcmVhZChtaXhlZCBwaW5mbywgaW50IGJlZ2luLCBpbnQgYykKK3sKKyAgaWYoYmVnaW4gPiBwaW5mb1tNQVhMXSB8fCBiZWdpbiA8IDEpIHJldHVybiAwOworICBpZihwaW5mb1tGSUxFXSkgcmV0dXJuIHJlYWRfZmlsZShwaW5mb1tURVhUXSwgYmVnaW4sIGMpOworICBlbHNlCisgIHsKKyAgICBpbnQgc3RhcnQsIGVuZCwgbCwgeDsKKworICAgIGlmKG1lbWJlcihwaW5mb1tKVU5LXSwgYmVnaW4pKSAKKyAgICB7CisgICAgICBzdGFydCA9IHBpbmZvW0pVTktdW2JlZ2luXTsKKyAgICAgIGlmKCEoZW5kID0gcGluZm9bSlVOS11bYmVnaW4rY10pKQorICAgICAgICBlbmQgPSBzaXplb2YocGluZm9bVEVYVF0pOworICAgICAgZWxzZSBlbmQtLTsKKyAgICAgIHJldHVybiBwaW5mb1tURVhUXVtzdGFydC4uZW5kXTsKKyAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KK30KKworbWl4ZWQgY2FsbChjbG9zdXJlIGN0cmwsIG1peGVkIGN0cmxhcmdzKQoreworICBpZiAoIWN0cmx8fCFjbG9zdXJlcChjdHJsKSkgcmV0dXJuIDA7CisgIGlmKCFwb2ludGVycChjdHJsYXJncykpIHJldHVybiBmdW5jYWxsKGN0cmwpOworICByZXR1cm4gYXBwbHkoY3RybCwgY3RybGFyZ3MpOworfQorCisgCit2YXJhcmdzIGludCBldmFsX2NvbW1hbmQobWl4ZWQgaW4sIG1peGVkIHBpbmZvKQoreworICBzdHJpbmcgY3Byb21wdCwgdG1wOworICBjcHJvbXB0ID0gIiI7CisgIGlmKGluID09ICJxIiB8fCBpbiA9PSAieCIpCisgIHsKKyAgICBpZihjbG9zdXJlcChwaW5mb1tDVFJMXSkpIGFwcGx5KHBpbmZvW0NUUkxdLCBwaW5mb1tDQVJHXSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgZWxzZQorICAgIGlmKCFpbiB8fCAoc3RyaW5ncChpbikgJiYgIXNpemVvZihpbikpKSBwaW5mb1tDVVJMXSArPSBwaW5mb1tQQUdFXTsKKyAgICBlbHNlIGlmKGluICE9IC0xKSByZXR1cm4gMDsKKworICBpZihwaW5mb1tDVVJMXSA+PSBwaW5mb1tNQVhMXSkgCisgICAgcmV0dXJuIChjYWxsKHBpbmZvW0NUUkxdLCBwaW5mb1tDQVJHXSksIDEpOyAKKyAgaWYocGluZm9bQ1VSTF0gPD0gMCkgcGluZm9bQ1VSTF0gPSAxOworICBpZihwaW5mb1tDVVJMXSA9PSAxKSBjcHJvbXB0ID0gTVNHX1RPUDsKKyAgaWYocGluZm9bQ1VSTF0gKyBwaW5mb1tQQUdFXSA+PSBwaW5mb1tNQVhMXSkgY3Byb21wdCA9IE1TR19CT1RUT007CisgIGlmKCF0bXAgPSBmcmVhZChwaW5mbywgcGluZm9bQ1VSTF0sIHBpbmZvW1BBR0VdKSkKKyAgICByZXR1cm4gMDsgLyogKHdyaXRlKE1TR19PT1BTKyJcbiIpLCAwKTsgKi8KKyAgaWYgKHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUodGhpc19vYmplY3QoKSkpCisgICAgIHRlbGxfb2JqZWN0KHRoaXNfb2JqZWN0KCksIHRtcCk7CisgIGVsc2Ugd3JpdGUodG1wKTsKKyAgaWYoIShwaW5mb1tGTEFHXSAmIEVfUFJPTVBUKSAmJgorICAgICAocGluZm9bQ1VSTF0gKyBwaW5mb1tQQUdFXSA+PSBwaW5mb1tNQVhMXSB8fCAhcGluZm9bUEFHRV0pKQorICAgIHJldHVybiAoY2FsbChwaW5mb1tDVFJMXSwgcGluZm9bQ0FSR10pLCAxKTsKKyAgaWYoIShwaW5mb1tGTEFHXSAmIEVfQ0FUKSAmJgorICAgICAocGluZm9bTUFYTF0gPiBwaW5mb1tQQUdFXSB8fCAocGluZm9bRkxBR10gJiBFX1BST01QVCkpKQorICAgIGlucHV0KCMncHJvbXB0LCAoeyBwaW5mbywgY3Byb21wdCB9KSwgIydldmFsX2NvbW1hbmQsICh7IHBpbmZvIH0pKTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZhcmFyZ3MgcHVibGljIHZvaWQgTW9yZShzdHJpbmcgdHh0LCBpbnQgZmlsZSwKKwkJCSBtaXhlZCBjdHJsLCBtaXhlZCBjdHJsYXJncywKKwkJCSBpbnQgZmxhZ3MpCit7CisgIGludCBqOworICBtaXhlZCB0bXAsIHBpbmZvOworICBpZighdHh0KSByZXR1cm4gY2FsbChjdHJsLCBjdHJsYXJncyk7CisgIC8vICAgICAgICAgVEVYVCwgRklMRSwgQ1VSTCwgTUFYTCwgUkVHWCwgUEFHRSwgQ1RSTCwgQ0FSRworICBwaW5mbyA9ICh7IHR4dCwgZmlsZSwgMSwgMSwgMjAsIDAsIGN0cmwsIGN0cmxhcmdzLCBmbGFncyB9KTsKKworICBpZiAocGluZm9bRklMRV0pCisgIHsgCisgICAgIGlmIChmaWxlX3NpemUocGluZm9bVEVYVF0pPDUwMDAwKQorICAgICB7CisgICAgICAgcGluZm9bVEVYVF09cmVhZF9maWxlKHBpbmZvW1RFWFRdKTsKKyAgICAgICBpZiAoIXBpbmZvW1RFWFRdKQorICAgICAgIHsgCisgICAgICAgICBjYWxsKGN0cmwsIGN0cmxhcmdzKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgICB9ICAKKyAgICAgICBwaW5mb1tGSUxFXT0wOworICAgICB9CisgICAgIGVsc2UgaWYgKGZpbGVfc2l6ZShwaW5mb1tURVhUXSk+MTA0ODU3NikKKyAgICAgeworCXRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCl8fHRoaXNfb2JqZWN0KCksYnJlYWtfc3RyaW5nKHNwcmludGYoCisgICAgICAgICAgICAgICAiRGllIERhdGVpICclcycga2FubiBuaWNodCBhbmdlemVpZ3Qgd2VyZGVuLCBkYSAiIAorICAgICAgICAgICAgICAgInNpZSBncm9lc3NlciBhbHMgMSBNQiBpc3QuICVzIixwaW5mb1tURVhUXSwKKyAgICAgICAgICAgICAgIElTX0xFQVJORVIodGhpc19wbGF5ZXIoKXx8dGhpc19vYmplY3QoKSk/IiI6IkJpdHRlIHZlcnN0YWVuZGlnZSAiCisgICAgICAgICAgICAgICAiZGllc2JlenVlZ2xpY2ggdW1nZWhlbmQgZWluZW4gTWFnaWVyLiIpLDc4KSk7CisJY2FsbChjdHJsLGN0cmxhcmdzKTsKKyAgICAgICAgcmV0dXJuOworICAgICB9CisgIH0KKworICBpZighcGluZm9bRklMRV0gJiYgcGluZm9bVEVYVF1bPDEuLjwxXSAhPSAiXG4iKSBwaW5mb1tURVhUXSArPSAiXG4iOworICBwaW5mbyArPSAoeyAoWzE6MF0pIH0pOworICBpZighcGluZm9bRklMRV0pIAorICAgIHdoaWxlKChqID0gc3Ryc3RyKHBpbmZvW1RFWFRdLCAiXG4iLCBqKzEpKSAhPSAtMSkKKyAgCXBpbmZvW0pVTktdWysrcGluZm9bTUFYTF1dID0gaisxOworICBlbHNlCisgICAgd2hpbGUodG1wID0gcmVhZF9maWxlKHBpbmZvW1RFWFRdLCBwaW5mb1tNQVhMXSwgTUFYX0xJTkVfUkVBRCkpCisgICAgICBwaW5mb1tNQVhMXSArPSBzaXplb2YoZXhwbG9kZSh0bXAsICJcbiIpKSsxOworICBwaW5mb1tQQUdFXSA9IFBBR0VMRU5HVEg7CisgIGlmKCFwaW5mb1tQQUdFXSkgcGluZm9bRkxBR10gfD0gRV9DQVQ7CisgIGlmICgodGhpc19pbnRlcmFjdGl2ZSgpICYmIChqPShpbnQpdGhpc19pbnRlcmFjdGl2ZSgpLT5RdWVyeVByb3AoUF9NT1JFX0ZMQUdTKSkpIHx8CisgICAgICAodGhpc19wbGF5ZXIoKSAmJiBpbnRlcmFjdGl2ZSh0aGlzX3BsYXllcigpKSAmJgorICAgICAgIChqPShpbnQpdGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKFBfTU9SRV9GTEFHUykpKSkKKyAgICBwaW5mb1tGTEFHXSB8PSBqOworICAKKyAgcGluZm9bQ1VSTF0gPSAxOworICBldmFsX2NvbW1hbmQoLTEsIHBpbmZvKTsKKyAgcmV0dXJuOworfQorCisKKworCisKKwpkaWZmIC0tZ2l0IGEvc3RkL3V0aWwvcGxfaXRlcmF0b3IuYyBiL3N0ZC91dGlsL3BsX2l0ZXJhdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU1YTc1ZQotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC91dGlsL3BsX2l0ZXJhdG9yLmMKQEAgLTAsMCArMSw1MyBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLyoqIFxmaWxlIC9maWxlLmMKKyogS3VyemJlc2NocmVpYnVuZy4KKyogTGFuZ2Jlc2NocmVpYnVuZy4uLgorKiBcYXV0aG9yIDxBdXRvcj4KKyogXGRhdGUgPGRhdGU+CisqIFx2ZXJzaW9uICRJZCQKKyovCisvKiBDaGFuZ2Vsb2c6CisqLworI3ByYWdtYSBzdHJvbmdfdHlwZXMsIHNhdmVfdHlwZXMsIHJ0dF9jaGVja3MKKyNwcmFnbWEgbm9fY2xvbmUsIG5vX3NoYWRvdworI3ByYWdtYSBwZWRhbnRpYywgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgd2Fybl9kZXByZWNhdGVkCisKK3ByaXZhdGUgdm9pZCBjaGVja19hbGxfcGxheWVyKG1hcHBpbmcgYWxscGxheWVyLCBjbG9zdXJlIGNoZWNrX2NsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zdXJlIGZpbmlzaF9jbCwgaW50IHJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyYXJncyBtaXhlZCBleHRyYSkKK3sKKyAgLy8gb2ZmZW5iYXIgZmVydGlnIG1pdCBhbGxlbiBTcGllbGVybiwgQXVmcnVmZXIgaW5mb3JtaWVyZW4uCisgIGlmICghc2l6ZW9mKGFsbHBsYXllcikpCisgIHsKKyAgICBmdW5jYWxsKGZpbmlzaF9jbCwgZXh0cmEuLi4pOworICAgIHJldHVybjsKKyAgfQorCisgIHN0cmluZyBkaXI9bV9pbmRpY2VzKGFsbHBsYXllcilbMF07CisgIHN0cmluZyAqcGxzPWFsbHBsYXllcltkaXJdOworICBmb3JlYWNoKHN0cmluZyBwbDogJnBscykKKyAgeworICAgIGlmIChnZXRfZXZhbF9jb3N0KCkgPCByZXMpCisgICAgICBicmVhazsgLy8gc3BhZXRlciB3ZWl0ZXJtYWNoZW4KKyAgICBjYXRjaChmdW5jYWxsKGNoZWNrX2NsLCBwbCwgZXh0cmEuLi4pIDsgcHVibGlzaCk7CisgICAgcGwgPSAwOworICB9CisgIHBscy09KHswfSk7CisgIGFsbHBsYXllcltkaXJdID0gcGxzOworCisgIGlmICghc2l6ZW9mKGFsbHBsYXllcltkaXJdKSkKKyAgICBtX2RlbGV0ZShhbGxwbGF5ZXIsZGlyKTsKKworICBjYWxsX291dCgjJ2NoZWNrX2FsbF9wbGF5ZXIsMiwgYWxscGxheWVyLCBjaGVja19jbCwgZmluaXNoX2NsLCByZXMsIGV4dHJhLi4uKTsKK30KKworcHJvdGVjdGVkIGludCBzdGFydF9wbGF5ZXJfY2hlY2soY2xvc3VyZSBjaGVja19jbCwgY2xvc3VyZSBmaW5pc2hfY2wsIGludCByZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmFyZ3MgbWl4ZWQgZXh0cmEpCit7CisgIHJlcyB8fD0gMTI1MDAwMDsKKyAgbWFwcGluZyBhbGxwbGF5ZXI9KG1hcHBpbmcpbWFzdGVyKCktPmdldF9hbGxfcGxheWVycygpOworICBjYWxsX291dCgjJ2NoZWNrX2FsbF9wbGF5ZXIsMiwgYWxscGxheWVyLCBjaGVja19jbCwgZmluaXNoX2NsLCByZXMsIGV4dHJhLi4uKTsKKyAgcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL3N0ZC91dGlsL3JhbmQtZ2xmc3IuYyBiL3N0ZC91dGlsL3JhbmQtZ2xmc3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmQ2MjRjCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3V0aWwvcmFuZC1nbGZzci5jCkBAIC0wLDAgKzEsMTU1IEBACisvKiBEaWVzZXMgRmlsZSBpbXBsZW1lbnRpZXJ0IGVpbmVuIFBzZXVkby1adWZhbGxzemFobGVuZ2VuZXJhdG9yIG1pdCBlaW5lbQorICogTGluZWFyIEZlZWRiYWNrIFNoaWZ0IFJlZ2lzdGVyIGluIGRlciBHYWxvaXMtVmFyaWFudGUuCisgKiBEaWVzZXMgUFJORyBpc3Qgc2NobGVjaHRlciB1bmQgdmllbCBpbmVmZml6aWVudGVyIGFscyBkZXIgaW0gRHJpdmVyCisgKiBlaW5nZWJhdXRlLgorICogRGllIGVpbnppZ2Ugc2lubnZvbGxlIEFud2VuZHVuZyBpc3QsIHdlbm4gbWFuIGF1cyBpcmdlbmRlaW5lbSBHcnVuZCBkYXMKKyAqIHNlZWQgc2VsYmVyIHdhZWhsZW4gbXVzcywgZGFtaXQgbWFuIGRpZSBTZXF1ZW56IHZvbiBQc2V1ZG96dWZhbGwgaW1tZXIKKyAqIHdpZWRlciByZXByb2R1emllcmVuIGthbm4uCisgKgorICogRGFzIFNlZWQgdm9uIGRlciBCbHVlcHJpbnQgd2lyZCB2ZXJtdXRsaWNoIHN0YWVuZGlnIHZlcmFlbmRlcnQgKGQuaC4KKyAqIHZlcmxhc3N0IGV1Y2ggbmljaHQgZHJhdWYsIGRhc3MgZXMga29uc3RhbnQgYmxlaWJ0KSwgd29sbHQgaWhyIGVpbmUKKyAqICdwcml2YXRlJyBJbnN0YW56IG1pdCBldXJlbSBTZWVkLCBjbG9udCBkYXMgT2JqZWt0IChhYmVyIHZlcmxpZXJ0IGRlbiBDbG9uZQorICogbmljaHQpLgorICoKKyAqIEVzIHdpcmQgc3RhbmRhcmRtYWVzc2lnIGVpbiBQb2x5bm9tIGZ1ZXIgZWluZSBQZXJpb2RlbmxhZW5nZSB2b24gMl4zMiAtIDEKKyAqIHZlcndlbmRldC4KKyAqIAorICogSW0gTmV0eiBmaW5kZW4gc2ljaCBJbmZvcyB1ZWJlciBMRlNScyB1bmQgVGFiZWxsZW4gZnVlciBtYXhpbXVtLWxlbmd0aAorICogZmVlZGJhY2sgcG9seW5vbWlhbHMgKE0tU2VxdWVuY2UgRmVlZGJhY2sgVGFwcyksIGZhbGxzIGplbWFuZCBicmF1Y2h0LgorICoKKyovCisjcHJhZ21hIHN0cm9uZ190eXBlcyxydHRfY2hlY2tzLHBlZGFudGljCisKKyNpbmNsdWRlIDx0bHMuaD4KKworLy8gRGVmYXVsdC1Qb2x5bm9tIGlzdCBkYXM6CisvLyB4XjMyICsgeF4zMSArIHheMjggKyB4XjI3ICsgeF4yNCArIHheMjMgKyB4XjIwICsgeF4xOSArIHheMTYgKyB4XjE1ICsgeF4xMgorLy8gICAgICArIHheMTEgKyB4XjggKyB4XjcgKyB4XjUgKyB4XjMgKyAxCisvLyBUYXBzOiAzMiwgMzEsIDI4LCAyNywgMjQsIDIzLCAyMCwgMTksIDE2LCAxNSwgMTIsIDExLCA4LCA3LCA1LCAzCisvLyBCaW5hcnk6IDExMDAxMTAwMTEwMDExMDAxMTAwMTEwMDExMDEwMTAwMAorI2RlZmluZSBERUZBVUxUUCAweDE5OTk5OTlhOAorLy8gQW5kZXJlIGdlYnJhZXVjaGxpY2hlOgorLy8geF4zMiArIHheMzAgKyB4XjI2ICsgeF4yNSArIDEsCisvLyBUYXBzIDMyLCAzMCwgMjYsIDI1CisvLyBCaW5hcnk6IDEwMTAwMDExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorLy8jZGVmaW5lIERFRkFVTFRQIDB4MTQ2MDAwMDAwCisvLyB4XjE2ICsgeF4xNCArIHheMTMgKyB4XjExICsgMQorLy8gVGFwcyAxNiwgMTQsIDEzLCAxMQorLy8gQmluYXJ5OiAxMDExMDEwMDAwMDAwMDAwCisvLyNkZWZpbmUgREVGQVVMVFAgMHhCNDAwCisKK3ByaXZhdGUgaW50IHBvbHlub20gPSBERUZBVUxUUDsKK3ByaXZhdGUgaW50IHN0YXRlID0gMjU1MzY0NzIyMzsKKy8vcHJpdmF0ZSBpbnQgcGVyaW9kOworCitwdWJsaWMgdmFyYXJncyB2b2lkIGluaXQoaW50IHNlZWQsIGludCBuZXdwKQoreworICBpZiAoIXNlZWQpCisgICAgcmFpc2VfZXJyb3IoIklsbGVnYWwgc2VlZCAwXG4iKTsKKyAgLy8gRXMgZGFyZiBudXIgZWluIDMyIGJpdCBicmVpdGVyIFNlZWQgdmVyd2VuZGV0IHdlcmRlbi4gRGllIG9iZXJlbiAzMiBiaXQKKyAgLy8gd2VyZGVuIG1pdCBkZW4gdW50ZXJlbiAzMiBiaXQgWE9SLXJ0IChhbHNvLCBlaW5tYWwgZGllIG9iZXJlbiAzMiBzaGlmdGVuCisgIC8vIHVuZCBlaW5tYWwgZGllIG9iZXJlbiAzMiB3ZWdtYXNraWVyZW4uCisgIHNlZWQgPSAoKHNlZWQ+PjMyKSAmIDB4ZmZmZmZmZmYpIF4gKHNlZWQgJiAweGZmZmZmZmZmKTsKKyAgLy9wcmludGYoIlNlZWQ6ICUwNjRiIC0gMHgleFxuIixzZWVkLHNlZWQpOworICAKKyAgaWYgKCFzZWVkKQorICAgIHJhaXNlX2Vycm9yKCJJbGxlZ2FsIHJlZHVjZWQgc2VlZDogMFxuIik7CisKKyAgc3RhdGUgPSBzZWVkOworICBwb2x5bm9tID0gbmV3cCB8fCBERUZBVUxUUDsKK30KKworcHVibGljIHZvaWQgSW5pdFdpdGhVVUlEKHN0cmluZyB1dWlkKQoreworICBzdHJpbmcgbWQ1aGFzaCA9IGhhc2goVExTX0hBU0hfTUQ1LCB1dWlkKTsKKyAgaW50IHNlZWQ7CisgIC8vIDggQnl0ZXMgYXVzIGRlbSBIYXNoIGVybWl0dGVsbgorICBmb3JlYWNoKGludCBiOiAxNikKKyAgeworICAgIC8vIEpld2VpbHMgendlaSBaZWljaGVuIGhlcmF1c3NjaG5laWRlbiB1bmQgYWxzIEhleGFkZXppbWFsemFobAorICAgIC8vIGludGVycHJldGllcmVuLCB3YXMgamV3ZWlscyBlaW4gYnl0ZSAoOCBiaXQpIGdpYnQuIAorICAgIGludCB0bXAgPSB0b19pbnQoIjB4IittZDVoYXNoW2IqMi4uYioyKzFdKTsKKyAgICAvLyBkaWVzZSB3ZXJkZW4gZGFubiBpbiBlaW5lIDY0IGJpdCBicmVpdGUgWmFobCB6dXNhbW1lbmdlZmFzc3QuIERhcworICAgIC8vIGdlcmFkZSBlcm1pdHRlbHRlIEJ5dGUgd2lyZCBuYWNoIGxpbmtzIGdlc2hpZnRldCB1bmQgbWl0IGRlbSwgd2FzIGRhCisgICAgLy8gZ2dmLiBzY2hvbiBzdGVodCwgWE9ScmVkLiBJc3QgZGVyIGludCB2b2xsLCBmYWVuZ3QgbWFuIHdlZ2VuIE1vZHVsbyA2NAorICAgIC8vIHdpZWRlciByZWNodHMgYW4uCisgICAgLy9wcmludGYoIlM6ICUwNjRiIC0gJTA4YlxuIixzZWVkLHRtcCk7CisgICAgc2VlZCA9IHNlZWQgXiAodG1wIDw8ICgoYio4KSU2NCkpOworICAgIC8vcHJpbnRmKCJTOiAlMDY0YiAtIDB4JXhcbiIsc2VlZCwgc2VlZCk7CisgIH0KKyAgLy9wcmludGYoIlNlZWQ6IDB4JXggLSAlYlxuIixzZWVkLHNlZWQpOworICBpbml0KHNlZWQpOworfQorCitwdWJsaWMgaW50IG5leHRiaXQoKQoreworICAvLyBHZXQgTFNCIChpLmUuLCB0aGUgb3V0cHV0IGJpdCkuCisgIGludCBsc2IgPSBzdGF0ZSAmIDE7CisgIC8vIFNoaWZ0IHJlZ2lzdGVyIGJ5IG9uZSBiaXQKKyAgc3RhdGUgPj49IDE7CisgIC8vIEFwcGx5IGEgdG9nZ2xlIG1hc2ssIHdoaWNoIGZsaXBzIGFsbCB0aGUgdGFwIGJpdHMsIF9pZl8gdGhlIG91dHB1dCBiaXQgaXMKKyAgLy8gMS4gVGhlIG1hc2sgaGFzIDEgYXQgYml0cyBjb3JyZXNwb25kaW5nIHRvIHRhcHMsIDAgZWxzZXdoZXJlLiBJbiBvdGhlcgorICAvLyB3b3JkcywgdGhlIHBvbHlub20gZnJvbSBhYm92ZS4KKyAgaWYgKGxzYikKKyAgICAgIHN0YXRlIF49IHBvbHlub207CisgIC8vIGRlYnVnIGNoZWNrIDstKQorICBpZiAoIXN0YXRlKQorICAgIHJhaXNlX2Vycm9yKCJTdGF0ZSBtdXN0IG5vdCBiZSB6ZXJvLCBidXQgaXQgaXMuXG4iKTsKKyAgLy8rK3BlcmlvZDsgCisgIC8vcHJpbnRmKCJTdGF0ZTogJTAzMmIgKFBlcmlvZDogJWQpXG4iLHN0YXRlLHBlcmlvZCk7CisgIHJldHVybiBsc2I7Cit9CisKK3B1YmxpYyBpbnQgbmV4dGJpdHMoaW50IGNvdW50KQoreworICBpbnQgcmVzdWx0OworICBpZiAoY291bnQ+NjQpCisgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiQ291bnQgaXMgJWQsIGJ1dCBtdXN0IGJlIDw9IDY0LlxuIixjb3VudCkpOworICBmb3JlYWNoKGludCBpOiBjb3VudCkKKyAgICByZXN1bHQgPSAocmVzdWx0IDw8IDEpIHwgbmV4dGJpdCgpOworICByZXR1cm4gcmVzdWx0OworfQorCitwdWJsaWMgaW50IG5leHRieXRlKCkKK3sKKyAgcmV0dXJuIG5leHRiaXRzKDgpOworfQorCitwdWJsaWMgaW50IHJhbmRvbShpbnQgbikKK3sKKyAgaW50IHJuZCA9IG5leHRiaXRzKDMyKTsKKyAgLy9nZW5lcmF0ZXMgYSByYW5kb20gbnVtYmVyIG9uIFswLDEpLXJlYWwtaW50ZXJ2YWwgCisgIGZsb2F0IHRtcCA9IHJuZCAqICgxLjAvNDI5NDk2NzI5Ni4wKTsKKyAgLy8gU2thbGllcmVuIGF1ZiBbMCxuKQorICByZXR1cm4gdG9faW50KHRtcCAqIG4pOworfQorCisvLyBKdXN0IHNraXAgc29tZSBiaXRzIGFuZCBkaXNjYXJkIHRoZW0uCitwdWJsaWMgdm9pZCBza2lwYml0cyhpbnQgY291bnQpCit7CisgIGZvcmVhY2goaW50IGk6IGNvdW50KQorICAgIG5leHRiaXQoKTsKK30KKworCitwdWJsaWMgdm9pZCBkdW1wc3RyZWFtKHN0cmluZyBmaWxlLCBpbnQgYnl0ZXMpCit7CisgIGludCAqc3RyZWFtID0gYWxsb2NhdGUoYnl0ZXMpOworICBmb3JlYWNoKGludCBpOiBieXRlcykKKyAgeworICAgIHN0cmVhbVtpXSA9IG5leHRiaXRzKDgpOworICB9CisgIHdyaXRlX2ZpbGUoZmlsZSwgc3ByaW50ZigiJUBjIixzdHJlYW0pKTsKK30KKworcHVibGljIGludCBDb25maWd1cmUoaW50IGRhdGEpCit7CisgIGlmICghZGF0YSkKKyAgICByZXR1cm4gc3RhdGU7CisgIAorICBpZiAoIWludHAoZGF0YSkpCisgICAgcmV0dXJuIDA7CisgIHN0YXRlID0gZGF0YTsKKyAgcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL3N0ZC91dGlsL3JpbmdidWZmZXIuYyBiL3N0ZC91dGlsL3JpbmdidWZmZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTMzOGUxCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3V0aWwvcmluZ2J1ZmZlci5jCkBAIC0wLDAgKzEsMjEwIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvKiogXGZpbGUgL3N0ZC91dGlsL3JpbmdidWZmZXIuYworKiBJbXBsbWVudGllcnQgZWluZW4gUmluZ2J1ZmZlciBpbiBMUEMuCisqIEFiIHVuZCBhbiBoYXQgbWFuIGRlbiBGYWxsLCBkYXNzIG1hbiBFcmVpZ25pc3NlL01lbGR1bmdlbiBvLmFlLiBoYXQsIHZvbgorKiBkZW5lbiBtYW4gaW1tZXIgZ2VuYXUgZGllIGxldHp0ZW4geCBnZXNwZWljaGVydCB1bmQgYWJydWZiYXIgdm9yaGFsdGVuCisqIG1vZWNodGUuIERpZXNlcyBGaWxlIHN0ZWxsdCBlaW5lIERhdGVuc3RydWt0dXIgdW5kIGRhenVnZWhvZXJpZ2UKKyogVmVyd2FsdHVuZ3NmdW5rdGlvbmVuIHp1IFZlcmZ1ZWd1bmcsIG1pdCBkZW5lbiBkaWVzIGVmZml6aWVudCBtb2VnbGljaCBpc3QuCisqIEluc2Jlc29uZGVyZSB1bWdlaGVuIGRpZXNlIGRhcyBzdGFlbmRpZ2UgU2xpY2luZyB2b24gQXJyYXlzLCBtaXQgZGVuZW4KKyogaGFldWZpZyBSaW5ncHVmZmVyIGdlYmF1dCB3ZXJkZW4uIEhpZXJiZWkgd2lyZCBkYXMgU2NocmVpYmVuIGluIGRlbiBQdWZmZXIKKyogYmlsbGlnZXIsIGRhcyBBYnJ1ZmVuIGRlciBEYXRlbiBhbGxlcmRpbmdzIHRldXJlci4gV2lyZCBkZXIgUHVmZmVyIGhhZXVmaWdlcgorKiBhYmdlZnJhZ3QgYWxzIGJlc2NocmllYmVuLCBpc3QgZGllcyBrZWluZSBlZmZpemllbnRlIExvZXN1bmcuCisqIAorKiBcYXV0aG9yIFplc3N0cmEKKyogXGRhdGUgMjIuMDUuMjAwOAorKiBcdmVyc2lvbiAkSWQkCisqLworLyogQ2hhbmdlbG9nOgorKi8KKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgbm9faW5oZXJpdAorI3ByYWdtYSBub19zaGFkb3cKKyNwcmFnbWEgcGVkYW50aWMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKworI2luY2x1ZGUgPHV0aWwvcmluZ2J1ZmZlci5oPgorCisvKiogU3RhbmRhcmRncm9lc3NlIGZ1ZXIgUmluZ2J1ZmZlci4KKyAgKi8KKyNkZWZpbmUgTUFYQ09VTlQgMzAKKworCisvKiogU3RydWt0dXIsIGRpZSBlaW5lbiBSaW5ncHVmZmVyIHNwZWljaGVydC4KKyAgRGVyIFB1ZmZlciBzZWxiZXIgaXN0IGltIHdlc2VudGxpY2hlbiBlaW4gQXJyYXkuIEhpbnp1IGtvbW10IG5vY2ggZWluCisgIFphZWhsZXIsIGRlciBkZW4gbmFlY2hzdGVuIHp1IHVlYmVyc2NocmVpYmVuZGVuIFdlcnQgaW5kaXppZXJ0IHNvd2llIGVpbmVuCisgIE1vZHVzLCBkZXIgZGllIFJlaWhlbmZvbGdlIGJlaW0gQWJydWZlbiBiZXNocmVpYnQ6CisgIE1PREVfRklGTzogRmlyc3QtaW4tRmlyc3Qtb3V0IChkZWZhdWx0KQorICBNT0RFX0xJRk86IExhc3QtaW4tRmlyc3Qtb3V0CisgICovCitzdHJ1Y3Qgc3RkX3JpbmdidWZmZXIgeworICAgIG1peGVkIHJidWZmZXI7CisgICAgaW50IG1vZGU7CisgICAgaW50IG5leHQ7Cit9OworCisvKiogRXJ6ZXVndCBlaW5lbiBuZXVlbiBSaW5nYnVmZmVyIHVuZCBsaWVmZXJ0IGlobiB6dXJ1ZWNrLgorICBEaWUgRnVua3Rpb24gZXJ6ZXVndCBlaW5lbiBuZXVlbiwgbGVlcmVuIFJpbmdidWZmZXIgZGVyIEdyb2Vzc2UgXGEgc2l6ZQorICB1bmQgbWl0IEF1c2dhYmVtb2R1cyBcYSBuZXdtb2RlIHVuZCBsaWVmZXJ0IGRpZSBlbnRzcHJlY2hlbmRlCisgIFJpbmdidWZmZXItU3RydWt0dXIgenVydWVjay4KKyAgXGF0dGVudGlvbiBEaWUgenVydWVja2dlbGllZmVydGUgRGF0ZW5zdHJ1a3R1ciBiaXR0ZSBuaWNodCBwZXIgSGFuZAorICBtYW5pcHVsaWVyZW4uCisgIFxwYXJhbVtpbl0gc2l6ZSBHcm9lc3NlIGRlcyB6dSBlcnpldWdlbmRlbiBSaW5nYnVmZmVycy4gRGVmYXVsdDogMzAKKyAgXHBhcmFtW2luXSBuZXdtb2RlIEF1c2dhYmVtb2R1cyBkZXMgUmluZ2J1ZmZlcnM6IFxhIE1PREVfRklGTyBvZGVyCisgIFxhIE1PREVfTElGTy4gRGVmYXVsdDogTU9ERV9GSUZPCisgIFxyZXR1cm4gRGVyIGVyemV1Z3RlIFJpbmdidWZmZXIgKHN0cnVjdCB2b20gVHlwIHN0ZF9yaW5nYnVmZmVyKS4KKyAgXHNhIFJlc2l6ZVJpbmdCdWZmZXIsIFJpbmdCdWZmZXJQdXQsIFJpbmdCdWZmZXJHZXQKKyAgKi8KK3Byb3RlY3RlZCBzdHJ1Y3Qgc3RkX3JpbmdidWZmZXIgQ3JlYXRlUmluZ0J1ZmZlcihpbnQgc2l6ZSwgaW50IG5ld21vZGUpIHsKKyAgCisgIHN0cnVjdCBzdGRfcmluZ2J1ZmZlciBidWZmZXIgPSAoPHN0ZF9yaW5nYnVmZmVyPgorICAgICAgIHJidWZmZXI6IGFsbG9jYXRlKHNpemV8fE1BWENPVU5ULCAwKSwgCisgICAgICAgbW9kZTogbmV3bW9kZSB8fCBNT0RFX0ZJRk8sIAorICAgICAgIG5leHQ6IDAgKTsKKworICAvLyBCZWkgTElGTyB2b24gb2JlbiBhbmZhbmdlbi4KKyAgaWYgKG5ld21vZGU9PU1PREVfTElGTykKKyAgICBidWZmZXItPm5leHQgPSBzaXplb2YoYnVmZmVyLT5yYnVmZmVyKTsKKyAgCisgIHJldHVybiBidWZmZXI7Cit9CisKKy8qKiBTY2hyZWlidCBlaW5lbiBuZXVlbiBXZXJ0IGluIGRlbiBSaW5nYnVmZmVyLgorICBEaWVzZSBGdW5rdGlvbiBzY2hyZWlidCBlaW5lbiBuZXVlbiBXZXJ0IGluIGRlbiBSaW5nYnVmZmVyIFxhIGJ1ZmZlciB1bmQKKyAgbG9lc2NodCBkYWJlaSBnZ2YuIGRlbiBhZWx0ZXN0ZW4gV2VydCBpbSBQdWZmZXIuCisgIFxwYXJhbVtpbixvdXRdIGJ1ZmZlciB6dSBhZW5kZXJuZGVyIFJpbmdidWZmZXIKKyAgXHBhcmFtW2luXSB2YWwgaGluenV6dWZ1ZWdlbmRlciBXZXJ0CisgIFxzYSBDcmVhdGVSaW5nQnVmZmVyLCBSZXNpemVSaW5nQnVmZmVyLCBSaW5nQnVmZmVyR2V0CisgICovCitwcm90ZWN0ZWQgdm9pZCBSaW5nQnVmZmVyUHV0KHN0cnVjdCBzdGRfcmluZ2J1ZmZlciBidWZmZXIsIG1peGVkIHZhbCkgeworICBpbnQgbmV4dCA9IGJ1ZmZlci0+bmV4dDsKKyAgLy8gamUgbmFjaCBBdXNnYWJlbW9kdXMgdm9uIG9iZW4gbmFjaCB1bnRlbiBvZGVyIHZvbiB1bnRlbiBuYWNoIG9iZW4gZGllCisgIC8vIFdlcnRlIHJlaW5zY2hyZWliZW4uCisgIHN3aXRjaChidWZmZXItPm1vZGUpIHsKKyAgICBjYXNlIE1PREVfTElGTzoKKyAgICAgIC8vIG5leHQgaXN0IGhpZXIgZWlnZW50bGljaCBlaW4gJ2xhc3QnLiBEZWtyZW1lbnRpZXJlbiB1bmQgZGFubiB6dW0KKyAgICAgIC8vIEluZGl6aWVyZW4gYmVudXR6ZW4uCisgICAgICBidWZmZXItPnJidWZmZXJbLS1uZXh0XSA9IHZhbDsKKyAgICAgIC8vIHdlbm4gbWFuIGdlcmFkZSBpbiBFbGVtZW50IDAgZ2VzY2hyaWViZW4gaGF0LCBpc3QgbmFlY2hzdGVzIEVsZW1lbnQKKyAgICAgIC8vIHNpemVvZigpLTEsIGQuaC4gc2l6ZW9mKCkgYWxzIG5leHQgdmVybWVya2VuLgorICAgICAgbmV4dCB8fD0gc2l6ZW9mKGJ1ZmZlci0+cmJ1ZmZlcik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgLy8gV2VydCBzY2hyZWliZW4gdW5kIG5leHQgaW5rcmVtZW50aWVyZW4uCisgICAgICBidWZmZXItPnJidWZmZXJbbmV4dCsrXSA9IHZhbDsKKyAgICAgIC8vIHdpcmQgc2l6ZW9mKCkgZXJyZWljaHQsIGlzdCBkYXMgbmFlY2hzdGUgRWxlbWVudCAwLiBFdHdhcyBzY2huZWxsZXIKKyAgICAgIC8vIHdhZXJlIGVpbiBNb2R1bG8gbWl0IGRlciBCdWZmZXJncm9lc3NlIGRpcmVrdCBiZWkgZGVyIEluZGl6aWVydW5nCisgICAgICAvLyBvYmVuLCBhYmVyIGRhbm4ga2FubiBlcyB1LlUuIGR1cmNoIGVpbmVuIG51bWVyaXNjaGVuIE92ZXJmbG93IGJ1Z2dlbi4KKyAgICAgIGlmIChuZXh0PT1zaXplb2YoYnVmZmVyLT5yYnVmZmVyKSkKKwluZXh0ID0gMDsKKyAgfQorICBidWZmZXItPm5leHQgPSBuZXh0OworfQorCisvKiogTGllZmVydCBlaW4gQXJyYXkgbWl0IGFsbGVuIFdlcnRlbiBkZXMgUmluZ2J1ZmZlcnMgXGEgYnVmZmVyLgorICBEYXMgenVydWVja2dlbGllZmVydGUgQXJyYXkgZW50aGFlbHQgYWxsZSBEYXRlbiBkZXMgUmluZ2J1ZmZlcnMgaW4gZGVyCisgIGJlaW0gRXJzdGVsbGVuIGRlcyBQdWZmZXJzIGdld3VlbnNjaHRlbiBSZWloZW5mb2xnZSAocy4gTU9ERV9GSUZPLAorICBNT0RFX0xJRk8pLgorICBJc3QgZGVyIFB1ZmZlciBub2NoIG5pY2h0IHZvbGxzdGFlbmRpZyBnZWZ1ZWxsdCwgZW50aGFsdGVuIGRpZSBiaXNoZXIgbm9jaAorICBuaWUgYmVzY2hyaWViZW5lbiBFbGVtZW50ZSAwLgorICBccGFyYW1baW5dIGJ1ZmZlciBSaW5ncHVmZmVyLCBkZXNzZW4gRGF0ZW4gYXVzZ2ViZW4gd2VyZGVuIHNvbGxlbi4KKyAgXHJldHVybiBBcnJheSBtaXQgRGF0ZW4gZGVzIFB1ZmZlcnMuCisgIFxzYSBDcmVhdGVSaW5nQnVmZmVyLCBSaW5nQnVmZmVyUHV0LCBSZXNpemVSaW5nQnVmZmVyCisgICovCitwcm90ZWN0ZWQgbWl4ZWQgUmluZ0J1ZmZlckdldChzdHJ1Y3Qgc3RkX3JpbmdidWZmZXIgYnVmZmVyKSB7CisgIGludCBzaXplID0gc2l6ZW9mKGJ1ZmZlci0+cmJ1ZmZlcik7CisgIGludCBuZXh0ID0gYnVmZmVyLT5uZXh0OworICBtaXhlZCByYnVmZmVyID0gYnVmZmVyLT5yYnVmZmVyOworCisgIHN3aXRjaChidWZmZXItPm1vZGUpIHsKKyAgICBjYXNlIE1PREVfTElGTzoKKyAgICAgIC8vIGRlciBoaW50ZXJlIFRlaWwgZW50aGFlbHQgZGllIG5ldWVyZW4gRGF0ZW4uIERpZSBrb21tZW4genVlcnN0LgorICAgICAgLy8gV2VubiBuZXh0ID09IHNpemVvZigpLCBkYW5uIGthbm4gZGFzIGludGVybmUgQXJyYXkgZWluZmFjaCBrb3BpZXJ0CisgICAgICAvLyB3ZXJkZW4uCisgICAgICBpZiAobmV4dCA9PSBzaXplKQorCXJldHVybiBjb3B5KHJidWZmZXIpOworICAgICAgZWxzZQorCXJldHVybiByYnVmZmVyW25leHQgLi4gc2l6ZS0xXSArIHJidWZmZXJbMCAuLiBuZXh0LTFdOworICAgIGRlZmF1bHQ6CisgICAgICAvLyBkZXIgdm9yZGVyZSBUZWlsIGVudGhhZWx0IGRpZSBuZXVlcmVuIERhdGVuLiBBbHNvIHp1ZXJzdCBkZW4gaGludGVyZW4KKyAgICAgIC8vIGF1c2dlYmVuLCBkYW5uIGRlbiB2b3JkZXJlbi4KKyAgICAgIC8vIFdlbm4gbmV4dCAwLCBrYW5uIGRhcyBpbnRlcm5lIEFycmF5IGVpbmZhY2gga29waWVydCB3ZXJkZW4uIFNvbnN0CisgICAgICAvLyBtdXNzIGVzIHp1c2FtbWVuZ2VzZXR6dCB3ZXJkZW4uCisgICAgICBpZiAobmV4dCkKKwlyZXR1cm4gcmJ1ZmZlcltuZXh0IC4uIHNpemUtMV0gKyByYnVmZmVyWzAgLi4gbmV4dC0xXTsKKyAgICAgIGVsc2UKKwlyZXR1cm4gY29weShyYnVmZmVyKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworLyoqIEVyemV1Z3QgZWluZW4gbmV1ZW4gUmluZ2J1ZmZlciBkZXIgR3JvZXNzZSBcYSBzaXplIHVuZCBkZW0gZ2xlaWNoZW4gTW9kdXMKKyAqIHdpZSBcYSBidWYsIGRlciBkaWVzZWxiZW4gRGF0ZW4gZW50aGFlbHQgd2llIFxhIGJ1Zi4KKyAqIERpZXNlIEZ1bmt0aW9uIGVyemV1Z3QgZWluZW4gbmV1ZW4gUmluZ2J1ZmZlciB1bmQga29waWVydCBhbGxlIERhdGVuIGF1cworICogZGVtIGFsdGVuIFB1ZmZlciBpbiBkZW4gbmV1ZW4gdW0uCisgXHBhcmFtW2luXSBidWYgYWx0ZXIgUmluZ2J1ZmZlcgorIFxwYXJhbVtpbl0gc2l6ZSBnZXd1ZW5zY2h0ZSBuZXVlIEdyb2Vzc2UKKyBccmV0dXJuIExpZWZlcnQgbmV1ZW4gUmluZ2J1ZmZlciBtaXQgZ2V3dWVuc2NodGVuIEdyb2Vzc2UuCisgXHNhIENyZWF0ZVJpbmdCdWZmZXIsIFJpbmdCdWZmZXJQdXQsIFJpbmdCdWZmZXJHZXQKKyBcYXR0ZW50aW9uIFdpcmQgZGVyIFJpbmdidWZmZXIgdmVya2xlaW5lcnQsIGtvbW10IGVzIHp1bSBWZXJsdXN0IGRlcgorIGFlbHRlc3RlbiBEYXRlbiwgZGllIG5pY2h0IG1laHIgaW4gZGVuIG5ldWVuIGhpbmVpbnBhc3Nlbi4KKyBcdG9kbyBFZmZpemllbnRlcmUgSW1wbGVtZW50YXRpb24uCisgKi8KK3Byb3RlY3RlZCBzdHJ1Y3Qgc3RkX3JpbmdidWZmZXIgUmVzaXplUmluZ0J1ZmZlcihzdHJ1Y3Qgc3RkX3JpbmdidWZmZXIgYnVmLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSkgeworICAvLyBuZXVlbiBSaW5nYnVmZmVyIGFubGVnZW4uCisgIHN0cnVjdCBzdGRfcmluZ2J1ZmZlciBuYnVmID0gQ3JlYXRlUmluZ0J1ZmZlcihzaXplLCBidWYtPm1vZGUpOworICAvLyB1bmQgYWxsZSBkYXRlbiBhdXMgZGVtIGFsdGVuIHdpZWRlciByZWluc3RvcGZlbi4KKyAgLy8gamEsIGRhcyBnZWh0IGVmZml6aWVudGVyLCBoYWIgaWNoIGdlcmFkZSBhYmVyIGtlaW5lbiBCb2NrIGRyYXVmLiBEaWUKKyAgLy8gRnVua3Rpb24gd2lyZCB2ZXJtdXRsaWNoIGVoIHNlaHIgc2VsdGVuIGdlcnVmZW4uCisgIGZvcmVhY2gobWl4ZWQgdmFsOiBSaW5nQnVmZmVyR2V0KGJ1ZikpCisgICAgUmluZ0J1ZmZlclB1dChuYnVmLCB2YWwpOworICAvLyBuZXVlbiBCdWZmZXIgenVydWVja2dlYmVuLiBEZXIgYWx0ZSBibGVpYnQgdW52ZXJhZW5kZXJ0IQorICByZXR1cm4gbmJ1ZjsKK30KKworLyogaGFsYmZlcnRpZ2UgSW1wbGVtZW50YXRpb24gbWl0IEFycmF5cy4KKyNkZWZpbmUgUkJVRkZFUiAgIDAKKyNkZWZpbmUgTU9ERSAgICAgIDEKKyNkZWZpbmUgQ09VTlRFUiAgIDIKKworcHJvdGVjdGVkIG1peGVkIENyZWF0ZVJpbmdCdWZmZXIoaW50IHNpemUsIGludCBtb2RlKSB7CisgIG1peGVkIGJ1ZmZlciA9ICh7IGFsbG9jYXRlKHNpemV8fE1BWENPVU5ULCAwKSwgCisgICAgICAgICAgICAgICAgICAgIG1vZGUgfHwgTU9ERV9GSUZPLCAKKwkgICAgICAgICAgICAwIH0pOworICBpZiAobW9kZT09TU9ERV9MSUZPKQorICAgIGJ1ZmZlcltDT1VOVEVSXSA9IHNpemVvZihidWZmZXJbUkJVRkZFUl0pOworICByZXR1cm4gYnVmZmVyOworfQorCitwcm90ZWN0ZWQgdm9pZCBSaW5nQnVmZmVyUHV0KG1peGVkIGJ1ZmZlciwgbWl4ZWQgdmFsKSB7CisgIGludCBjb3VudGVyID0gYnVmZmVyW0NPVU5URVJdOworICBzd2l0Y2gobW9kZSkgeworICAgIGNhc2UgTU9ERV9MSUZPOgorICAgICAgcmJ1ZmZlclstLWNvdW50ZXJdID0gdmFsOworICAgICAgY291bnRlciB8fD0gc2l6ZW9mKHJidWZmZXIpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJidWZmZXJbKGNvdW50ZXIrKyklc2l6ZW9mKHJidWZmZXIpXSA9IHZhbDsKKyAgfQorICBidWZmZXJbQ09VTlRFUl09Y291bnRlcjsKK30KKworcHJvdGVjdGVkIG1peGVkIFJpbmdCdWZmZXJHZXQobWl4ZWQgYnVmZmVyKSB7CisgIGludCBzaXplPXNpemVvZihyYnVmZmVyKTsKKworICBzd2l0Y2gobW9kZSkgeworICAgIGNhc2UgTU9ERV9MSUZPOgorICAgICAgcmV0dXJuIHJidWZmZXJbY291bnRlci4uc2l6ZV0gKyByYnVmZmVyWzAuLmNvdW50ZXItMV07CisgICAgZGVmYXVsdDoKKyAgICAgIGlmIChjb3VudGVyJXNpemUpCisJcmV0dXJuIHJidWZmZXJbKGNvdW50ZXIlc2l6ZSkgLi4gc2l6ZS0xXSAKKwkgICAgICAgKyByYnVmZmVyWzAuLihjb3VudGVyJXNpemUpLTFdOworICAgICAgZWxzZQorCXJldHVybiBjb3B5KHJidWZmZXIpOworICB9Cit9CisKK3Byb3RlY3RlZCBtaXhlZCB0ZXN0KCkge3JldHVybiByYnVmZmVyO30KKyovCmRpZmYgLS1naXQgYS9zdGQvdXRpbC90ZXN0ZWRpdC5jIGIvc3RkL3V0aWwvdGVzdGVkaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzFmNmVkCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3V0aWwvdGVzdGVkaXQuYwpAQCAtMCwwICsxLDI1IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gdXRpbC90ZXN0ZWRpdC5jIC0tIFRyYWdiYXJlciBFZGl0b3IKKy8vCisvLyAkSWQ6IHRlc3RlZGl0LmMgNjM3MSAyMDA3LTA3LTE3IDIyOjQ2OjUwWiBaZXNzdHJhICQKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgcGVkYW50aWMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKworaW5oZXJpdCAiL3N0ZC90aGluZyI7Citpbmhlcml0ICIvc3RkL3V0aWwvZXgiOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCit2b2lkIGNyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7CisgIEFkZElkKCJleCIpOworICBTZXRQcm9wKFBfTkFNRSwgIkVkaXRvciIpOworICBTZXRQcm9wKFBfU0hPUlQsICJFaW4gVGVzdGVkaXRvciIpOworICBTZXRQcm9wKFBfTE9ORywgIlRlc3RlZGl0b3I6IEtvbW1hbmRvOiBleFxuIik7CisgIEFkZENtZCgiZXgiLCAiZXgiKTsKK30KZGlmZiAtLWdpdCBhL3N0ZC92aXJ0dWFsL3ZfY29tcGlsZXIuYyBiL3N0ZC92aXJ0dWFsL3ZfY29tcGlsZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGViMzcwCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3ZpcnR1YWwvdl9jb21waWxlci5jCkBAIC0wLDAgKzEsMTY1IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gdmlydHVhbC92X2NvbXBpbGVyLmMgLS0gYSBnZW5lcmFsIHZpcnR1YWwgY29tcGlsZXIgb2JqZWN0CisvLworLy8gJElkOiB2X2NvbXBpbGVyLmMgOTE0MiAyMDE1LTAyLTA0IDIyOjE3OjI5WiBaZXNzdHJhICQKKworLy8gcHJpbmNpcGxlOgorLy8gIC0gaW5oZXJpdCB0aGlzIG9iamVjdCBpbnRvIHlvdXIgb3duICd2aXJ0dWFsX2NvbXBpbGVyLmMnCisvLyAgLSBjdXN0b21pemUgVmFsaWRhdGUoKSBhbmQgQ3VzdG9taXplT2JqZWN0KCkgZm9yIHlvdSBvd24gc2FrZQorLy8gIAorLy8gICogVmFsaWRhdGUoKSBjaGVja3MgaWYgYSByb29tIGZpbGVuYW1lIGdpdmVuIGFzIGFyZ3VtZW50ICh3aXRob3V0IHBhdGgpCisvLyAgICBpcyB2YWxpZCBhbmQgcmV0dXJucyB0aGlzIGZpbGVuYW1lIHdpdGggc3RyaXBwZWQgJy5jJyEhCisvLyAgKiBDdXN0b21pemVPYmplY3QoKSB1c2VzIHRoZSBwcmV2aW91c19vYmplY3QoKS0+RnVuY3Rpb24oKSBzdHJhdGVneSB0bworLy8gICAgY3VzdG9taXplIHRoZSBzdGFuZGFyZCBvYmplY3QgKGZvciBleGFtcGxlIHRvIHNldCBhIGRlc2NyaXB0aW9uKQorLy8KKy8vIFByb3BlcnRpZXM6IFBfU1REX09CSkVDVCwgUF9DT01QSUxFUl9QQVRICisKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKworaW5oZXJpdCAiL3N0ZC90aGluZy9wcm9wZXJ0aWVzIjsKKworLy8jZGVmaW5lIE5FRURfUFJPVE9UWVBFUworCisjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDx2X2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8ZXhwbG9yYXRpb24uaD4KKyNpbmNsdWRlIDxzeXNfZGVidWcuaD4KKyNpbmNsdWRlIDxsaXZpbmcvZGVzY3JpcHRpb24uaD4gLy9mdWVyIFBfUEFSQQorCisvLyBEZXIgVkMgYnJhdWNodCBkYXMgJ2FsdGUnIG9iamVjdF9uYW1lKCktYmFzaWVydGUgQkxVRV9OQU1FLCBkYSBzb25zdCBkYXMKKy8vIEtvbmZpZ3VyaWVyZW4gZGVyIHZvbiBlaW5lbSBWQy1PYmpla3QgZ2VjbG9udGVuIENsb25lcyB2aWEKKy8vIEN1c3RvbWl6ZU9iamVjdCgpIG5pY2h0IGZ1bmt0aW9uaWVydCAobG9hZF9uYW1lKCkgZXJtaXR0ZWx0IGRlbiBOYW1lbiBkZXMKKy8vIFZDLVN0YW5kYXJkb2JqZWt0ZXMpCisjaWZkZWYgQkxVRV9OQU1FCisjdW5kZWYgQkxVRV9OQU1FCisjZW5kaWYKKyNkZWZpbmUgQkxVRV9OQU1FKG9iKSAoZXhwbG9kZShvYmplY3RfbmFtZShvYiksIiMiKVswXSkKKworcHJpdmF0ZSBub3NhdmUgc3RyaW5nIGxhc3RfbG9hZGVkX2ZpbGU7Citwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIG9iamVjdHM7CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgOjpjcmVhdGUoKTsKKyAgc2V0ZXVpZChnZXR1aWQoKSk7CisgIFNldFByb3AoUF9TVERfT0JKRUNULCAiL3N0ZC9yb29tIik7CisgIFNldFByb3AoUF9DT01QSUxFUl9QQVRILCBzcHJpbnRmKCIvJXMvIiwKKyAgICAgICAgaW1wbG9kZShvbGRfZXhwbG9kZShvYmplY3RfbmFtZSh0aGlzX29iamVjdCgpKSwgIi8iKVswLi48Ml0sICIvIikpKTsKKyAgU2V0UHJvcChQX1BBUkEsICh7fSkgKTsgLy8ga2VpbmUgUGFyYS1WQy1PYmpla3RlCisgIG9iamVjdHMgPSAoW10pOworfQorCisvLyB2b24gZGVuIGVyYmVuZW4gVkNzIHp1IHVlYmVyc2NocmVpYmVuLi4uCisvLyBUT0RPOiBhdXMgU3RhbmRhcmRvYmpla3QgZW50ZmVybmVuLCB3ZWlsIGR1cmNoIFBfUEFSQSB1bmQgUXVlcnlWYWxpZE9iamVjdAorLy8gb2Jzb2xldC4gCitpbnQgTm9QYXJhT2JqZWN0cygpIHsgcmV0dXJuIDA7IH0KKworc3RyaW5nIFZhbGlkYXRlKHN0cmluZyBmaWxlKQoreworICBpZighZmlsZSkgcmV0dXJuIDA7CisgIGlmKGZpbGVbPDIuLl0gPT0gIi5jIikgZmlsZSA9IGZpbGVbMC4uPDNdOworICBFUE1BU1RFUi0+UHJlcGFyZVZDUXVlcnkoZmlsZSk7CisgIHJldHVybiBmaWxlOworfQorCisvLyBEaWUgRnVua3Rpb24gYmVrb21tdCBlaW5lbiBPYmpla3RuYW1lbiB1ZWJlcmdlYmVuIHVuZCBtdXNzIGVudHNjaGVpZGVuLCBvYgorLy8gZGllc2VyIFZDIGRhZnVlciB6dXN0YWVuZGlnIGlzdCwgZGFzIE9iamVrdCB6dSBnZW5lcmllcmVuLiBKZWRlciBXZXJ0ICE9IDAKKy8vIHphZWhsdCBhbHMgJ3p1c3RhZW5kaWcnLiBFcyBpc3QgZWluZSBBcnQgZ2VuZXJhbGlzaWVydGVtIFZhbGlkYXRlKCkuIEZ1ZXIKKy8vIG1heGltYWxlIE51ZXR6bGljaGtlaXQgbXVzcyBkaWVzZSBGdW5rdGlvbiB2b24gZGVuIGVyYmVuZGVuIFZDcworLy8gdWViZXJzY2hyaWViZW4gd2VyZGVuLgorcHVibGljIGludCBRdWVyeVZhbGlkT2JqZWN0KHN0cmluZyBvbmFtZSkgeworICAgIHN0cmluZyBmbmFtZSwgcGF0aCwgKnBlbGVtOworICAgIGludCBwYXJhOworICAgIG1peGVkIHBwYXJhOworCisgICAgLy9lcnN0bWFsIFZhbGlkYXRlIGZyYWdlbgorICAgIHBlbGVtPWV4cGxvZGUob25hbWUsIi8iKTsKKyAgICBmbmFtZT1wZWxlbVs8MV07CisgICAgaWYgKCFmbmFtZT1WYWxpZGF0ZShmbmFtZSkpCisgICAgICAgIHJldHVybigwKTsgLy9uaWNodCB6dXN0YWVuZGlnCisgICAgLy8gbmljaHQgaW0gcmljaHRpZ2VuIFBmYWQ/CisgICAgcGF0aD1zcHJpbnRmKCIlcy8iLGltcGxvZGUocGVsZW1bMC4uPDJdLCIvIikpOworICAgIGlmIChwYXRoIT1RdWVyeVByb3AoUF9DT01QSUxFUl9QQVRIKSkKKyAgICAgICAgcmV0dXJuKDApOworICAgIC8vIFBhcmEtT2JqZWt0PworICAgIGlmIChzc2NhbmYoZm5hbWUsIiVzXiVkIixmbmFtZSxwYXJhKSA+IDEpIHsKKyAgICAgICAgaWYgKE5vUGFyYU9iamVjdHMoKSkKKyAgICAgICAgICAgIHJldHVybigwKTsgLy9kaXJla3QgenVydWVjaywga2VpbmUgUGFyYS1PYmpla3RlCisgICAgICAgIC8vIGJlc3RpbW10ZSBQYXJhLURpbWVuc2lvbmVuIGV4cGxpeml0IGVybGF1YnQ/IChXZW5uIFBfUEFSQSBuaWNodAorICAgICAgICAvLyBnZXNldHp0IGlzdCwgc2luZCBhbGxlIGVybGF1YnQhKQorICAgICAgICBpZiAocHBhcmE9UXVlcnlQcm9wKFBfUEFSQSkpIHsKKyAgICAgICAgICAgIGlmIChwb2ludGVycChwcGFyYSkgJiYgbWVtYmVyKHBwYXJhLHBhcmEpIT0tMSkKKyAgICAgICAgICAgICAgICByZXR1cm4oMSk7CisgICAgICAgICAgICBlbHNlIGlmIChpbnRwKHBhcmEpICYmIHBwYXJhPT1wYXJhKQorICAgICAgICAgICAgICAgIHJldHVybigxKTsKKyAgICAgICAgICAgIC8vIFBfUEFSQSBnZXNldHp0LCBhYmVyIGdld3VlbnNjaHRlcyBQYXJhIG5pY2h0IGVudGhhbHRlbi4uLgorICAgICAgICAgICAgZWxzZSByZXR1cm4oMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuKDEpOyAvL2ZhbGwtdGhyb3VnaCwgb2ZmZW5iYXIgenVzdGFlbmRpZy4KK30KKworbWl4ZWQgQ3VzdG9taXplT2JqZWN0KCkKK3sKKyAgc3RyaW5nIGZpbGU7CisKKyAgaWYoIWNsb25lcChwcmV2aW91c19vYmplY3QoKSkpCisgICAgcmV0dXJuIFZhbGlkYXRlKGV4cGxvZGUoQkxVRV9OQU1FKHByZXZpb3VzX29iamVjdCgpKSwgIi8iKVs8MV0pOworICBpZihzdHJpbmdwKGxhc3RfbG9hZGVkX2ZpbGUpKSBmaWxlID0gbGFzdF9sb2FkZWRfZmlsZTsKKyAgZWxzZSBmaWxlID0gVmFsaWRhdGUoZXhwbG9kZShCTFVFX05BTUUocHJldmlvdXNfb2JqZWN0KCkpLCAiLyIpWzwxXSk7CisgIGlmKCFmaWxlKSByZXR1cm4gMDsKKyAgbGFzdF9sb2FkZWRfZmlsZSA9IDA7CisgIHJldHVybiBmaWxlOworfQorCisvLyBhZGQgYSBuZXcgb2JqZWN0IHRvIHRoZSBvYmplY3QgbGlzdCBpZiBpdCBjb21waWxlcworcHJpdmF0ZSBtaXhlZCBBZGRPYmplY3Qoc3RyaW5nIGZpbGUpCit7CisgIG9iamVjdCBvYjsKKyAgc3RyaW5nIGVycjsKKworICAvLyBjbGVhbiB1cCB0aGUgb2JqZWN0IGxpc3QKKyAgb2JqZWN0cyA9IGZpbHRlcl9pbmRpY2VzKG9iamVjdHMsIGZ1bmN0aW9uIGludCAoc3RyaW5nIGYpIHsKKyAgICAgIHJldHVybiAob2JqZWN0cChvYmplY3RzW2ZdKSk7IH0gKTsKKworICBsYXN0X2xvYWRlZF9maWxlID0gZmlsZTsKKyAgLy8gcmVnaXN0ZXIgbmV3IG9iamVjdAorICBpZihvYiA9IGNsb25lX29iamVjdChRdWVyeVByb3AoUF9TVERfT0JKRUNUKSkpCisgICAgb2JqZWN0c1tmaWxlXSA9IG9iOworICByZXR1cm4gb2I7Cit9CisKKy8vIHRyeSB0byBjcmVhdGUgYW4gb2JqZWN0IGZvciB0aGUgd2FudGVkIGZpbGUKK21peGVkIGNvbXBpbGVfb2JqZWN0KHN0cmluZyBmaWxlKQoreworICAvLyB2YWxpZGF0ZSBpZiB0aGUgZmlsZSBuYW1lIGlzIGEgY29ycmVjdCBvbmUKKyAgaWYoZmlsZSA9IFZhbGlkYXRlKGZpbGUpKQorICAgIHJldHVybiBBZGRPYmplY3QoZmlsZSk7CisgIHJldHVybiAwOworfSAgCisKKy8vIHJldHVybiBhbGwgY2xvbmVkIHZpcnR1YWwgb2JqZWN0cworbWl4ZWQgUXVlcnlPYmplY3RzKCkKK3sKKyAgcmV0dXJuIG1fdmFsdWVzKG9iamVjdHMpLSh7MH0pOworfQorCisvLyBjbGVhbiB1cCByb29tcyB0aGF0IGhhdmUgbm90IGJlZW4gZGVzdHJ1Y3RlZCB5ZXQKK2ludCByZW1vdmUoKSB7CisKKyAgaWYoIW1hcHBpbmdwKG9iamVjdHMpKSByZXR1cm4gMDsKKworICAvL2ZvcihvYiA9IFF1ZXJ5T2JqZWN0cygpOyBzaXplb2Yob2IpOyBvYiA9IG9iWzEuLl0pCisgIGZvcmVhY2gob2JqZWN0IG9iOiBRdWVyeU9iamVjdHMoKSkgeworICAgICAgb2ItPnJlbW92ZSgpOworICAgICAgaWYob2JqZWN0cChvYikpIGRlc3RydWN0KG9iKTsKKyAgfQorICByZXR1cm4gMTsKK30KKwpkaWZmIC0tZ2l0IGEvc3RkL3dlYXBvbi5jIGIvc3RkL3dlYXBvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMWY5N2MKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvd2VhcG9uLmMKQEAgLTAsMCArMSw1NCBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHdlYXBvbi5jIC0tIHdlYXBvbiBzdGFuZGFyZCBvYmplY3QKKy8vCisvLyAkSWQ6IHdlYXBvbi5jIDc4MDQgMjAxMS0wNy0xMCAyMDozNzo1MlogWmVzc3RyYSAkCisKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKy8vI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworI3ByYWdtYSByYW5nZV9jaGVjaworCitpbmhlcml0ICIvc3RkL3RoaW5nL3Byb3BlcnRpZXMiOworaW5oZXJpdCAiL3N0ZC90aGluZy9sYW5ndWFnZSI7Citpbmhlcml0ICIvc3RkL3RoaW5nL2NvbW1hbmRzIjsKK2luaGVyaXQgIi9zdGQvdGhpbmcvcmVzdHJpY3Rpb25zIjsKK2luaGVyaXQgIi9zdGQvdGhpbmcvbGlnaHQiOworaW5oZXJpdCAiL3N0ZC93ZWFwb24vbW92aW5nIjsKK2luaGVyaXQgIi9zdGQvd2VhcG9uL2NvbWJhdCI7Citpbmhlcml0ICIvc3RkL3dlYXBvbi9kZXNjcmlwdGlvbiI7Citpbmhlcml0ICIvc3RkL3RoaW5nL2VudmNoayI7CisKKy8vI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKworI2RlZmluZSA8dGhpbmcvcHJvcGVydGllcy5oPgorCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKwordm9pZCBjcmVhdGUoKQoreworICBzZXRldWlkKGdldHVpZCgpKTsKKyAgcHJvcGVydGllczo6Y3JlYXRlKCk7CisgIGNvbW1hbmRzOjpjcmVhdGUoKTsKKyAgbGlnaHQ6OmNyZWF0ZSgpOworICByZXN0cmljdGlvbnM6OmNyZWF0ZSgpOworICBjb21iYXQ6OmNyZWF0ZSgpOworICBkZXNjcmlwdGlvbjo6Y3JlYXRlKCk7CisgIGVudmNoazo6Y3JlYXRlKCk7CisgIEFkZElkKCh7IkRpbmciLCJ3YWZmZSJ9KSk7Cit9CisKKy8qCit2b2lkIGluaXQoKQoreworICBjb21tYW5kczo6aW5pdCgpOworICBkZXNjcmlwdGlvbjo6aW5pdCgpOworfQorKi8KKwordm9pZCByZXNldCgpICAvLyBNYW4ga2FubiBpbiBBTExFTiBTdGFuZGFyZG9iamVrdGVuIDo6cmVzZXQgYXVmcnVmZW4hCit7IH0KKwpkaWZmIC0tZ2l0IGEvc3RkL3dlYXBvbi9jb21iYXQuYyBiL3N0ZC93ZWFwb24vY29tYmF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IxMGZmNQotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC93ZWFwb24vY29tYmF0LmMKQEAgLTAsMCArMSw4MTkgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyB3ZWFwb24vY29tYmF0LmMgLS0gY29tYmF0IHBhcnQgb2YgdGhlIHdlYXBvbiBzdGFuZGFyZCBvYmplY3QKKy8vCisvLyAkSWQ6IGNvbWJhdC5jIDk0MjUgMjAxNi0wMS0wMiAxODoxOTo0MFogWmVzc3RyYSAkCisKKyNpbmNsdWRlIDxzeXNfZGVidWcuaD4KKworI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworI3ByYWdtYSByYW5nZV9jaGVjaworCisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworCisjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHRoaW5nL2NvbW1hbmRzLmg+CisjaW5jbHVkZSA8dGhpbmcvZGVzY3JpcHRpb24uaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxjb21iYXQuaD4KKyNpbmNsdWRlIDxhdHRyaWJ1dGVzLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPG5ld19za2lsbHMuaD4KKworLy8gR2xvYmFsZSBWYXJpYWJsZW4KKyAgICAgICAgICAgICAgIGludCAgICAgZnRpbWUsIGZsYXc7Citwcml2YXRlIG5vc2F2ZSBpbnQgICAgIGxvZ2dlZDsKK3ByaXZhdGUgbm9zYXZlIGNsb3N1cmUgZGVmZW5kX2NsLCBoaXRfY2w7CisKK3ZvaWQgY3JlYXRlKCkgCit7CisgICAgLy8gVmFyaWFibGVuIGluaXRpYWxpc2llcmVuCisgICAgbG9nZ2VkPWZ0aW1lPWZsYXc9MDsKKyAgICBkZWZlbmRfY2w9MDsKKyAgICBoaXRfY2w9MDsKKworICAgIC8vIEVpbmlnZSBHcnVuZHdlcnRlIHNldHplbgorICAgIFNldFByb3AoUF9XRUFQT05fVFlQRSwgV1RfQ0xVQik7CisgICAgU2V0UHJvcChQX0RBTV9UWVBFLCAoe0RUX0JMVURHRU9OfSkpOworICAgIFNldFByb3AoUF9OUl9IQU5EUywgMik7CisgICAgU2V0UHJvcChQX1BBUlJZLFBBUlJZX05PVCk7CisgICAgU2V0UHJvcChQX0FDLDApOworICAgIFNldChQX1JFU1RSSUNUSU9OUywoW10pLEZfVkFMVUUpOworICAgIFNldChQX0xBU1RfVVNFLHRpbWUoKSxGX1ZBTFVFKTsKKworICAgIC8vIEVpbmlnZSBQcm9wZXJ0aWVzIHNvbGx0ZW4gbmljaHQgdm9uIGF1c3NlbiBnZXNldHp0IHdlcmRlbiBrb2VubmVuCisgICAgU2V0KFBfUEFSUlksICAgUFJPVEVDVEVELCBGX01PREVfQVMpOworICAgIFNldChQX1dJRUxERUQsIFBST1RFQ1RFRCwgRl9NT0RFX0FTKTsKKyAgICBTZXQoUF9MQVNUX1VTRSxQUk9URUNURUQsIEZfTU9ERV9BUyk7CisgICAgCisgICAgLy8gRGllc2Uga2FubiB2b24gYXVzc2VuIGdlc2V0enQgd2VyZGVuIChub2NoKSwgYWJlciBiaXR0ZSBudXIgdWViZXIgZGllCisgICAgLy8gaGllciBkZWZpbmllcnRlIFNldG1ldGhvZGUuCisgICAgU2V0KFBfREFNQUdFRCwgUFJPVEVDVEVELCBGX01PREVfQVMpOworCisgICAgLy8gRWluZSBXYWZmZSBiZW5vZXRpZ3QgS29tbWFuZG9zLCBtaXQgZGVuZW4gbWFuIHNpZSB6dWVja2VuIAorICAgIC8vIHVuZCB3ZWdzdGVja2VuIGthbm4KKyAgICBBZGRDbWQoICh7Inp1ZWNrIiwienVlY2tlIiwiemllaCIsInppZWhlIn0pLCAid2llbGQiICk7CisgICAgQWRkQ21kKCAoeyJzdGVjayIsInN0ZWNrZSJ9KSwgInVud2llbGQiICk7Cit9CisKKy8vIGFrdHVlbGxlcyBMZWJld2VzZW4sIHdhcyBkaWVzZSBXYWZmZSB6dXIgWmVpdCBnZXp1ZWNrdCBoYXQuCitwdWJsaWMgb2JqZWN0IFF1ZXJ5VXNlcigpCit7CisgIHJldHVybiBRdWVyeVByb3AoUF9XSUVMREVEKTsKK30KKworLyoKKyAqIEF1c2dhYmUgZWluZXIgTWVsZHVuZyBiZWltIFp1ZWNrZW4gZ2VodCBudXIgYW4gU3BpZWxlciwgbmljaHQgYW4gTlBDLgorICogRGllIFVtZ2VidW5nIGJla29tbXQgbmF0dWVybGljaCBpbW1lciBlaW5lIE1lbGR1bmcuCisgKi8KK3ZvaWQgZG9XaWVsZE1lc3NhZ2UoKQoreworICBzdHJpbmcgKnN0ciwgczE7CisgIAorICBpZihRdWVyeVByb3AoUF9XSUVMRF9NU0cpKSAgLy8gSXN0IGVpbmUgV2llbGRNc2cgZ2VzZXR6dD8KKyAgeworICAgIGlmKGNsb3N1cmVwKFF1ZXJ5UHJvcChQX1dJRUxEX01TRykpKSAgLy8gU29nYXIgYWxzIGVpZ2VuZSBGa3QuPworICAgIHsKKyAgICAgIHN0ciA9IGZ1bmNhbGwoUXVlcnlQcm9wKFBfV0lFTERfTVNHKSx0aGlzX3BsYXllcigpKTsKKworICAgICAgaWYoaW50ZXJhY3RpdmUodGhpc19wbGF5ZXIoKSkpCisgICAgICB7CisgICAgICAgIHRoaXNfcGxheWVyKCktPlJlY2VpdmVNc2coc3RyWzBdLAorICAgICAgICAgICAgTVRfTk9USUZJQ0FUSU9OfE1TR19CU19MRUFWRV9MRlMsIE1BX1dJRUxELCAwLAorICAgICAgICAgICAgdGhpc19wbGF5ZXIoKSk7CisgICAgICB9CisgICAgCisgICAgICBpZiAoIG9iamVjdHAoZW52aXJvbm1lbnQoKSkgJiYgb2JqZWN0cChlbnZpcm9ubWVudChlbnZpcm9ubWVudCgpKSkgKQorICAgICAgICAgIHNlbmRfcm9vbShlbnZpcm9ubWVudChlbnZpcm9ubWVudCgpKSwKKyAgICAgICAgICAgICAgc3RyWzFdLAorICAgICAgICAgICAgICBNVF9MT09LfE1TR19CU19MRUFWRV9MRlMsCisgICAgICAgICAgICAgIE1BX1dJRUxELCAwLCAoe3RoaXNfcGxheWVyKCl9KSwgZW52aXJvbm1lbnQoKSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UgaWYoaW50ZXJhY3RpdmUodGhpc19wbGF5ZXIoKSkpCisgICAgeworICAgICAgczEgPSByZXBsYWNlX3BlcnNvbmFsKHNwcmludGYoUXVlcnlQcm9wKFBfV0lFTERfTVNHKVswXSwiQFdFTjIiKSwKKwkJICAgICAgKHt0aGlzX3BsYXllcigpLHRoaXNfb2JqZWN0KCl9KSwgMSk7CisKKyAgICAgIHRoaXNfcGxheWVyKCktPlJlY2VpdmVNc2coczEsCisgICAgICAgICAgTVRfTk9USUZJQ0FUSU9OfE1TR19CU19MRUFWRV9MRlMsIE1BX1dJRUxELCAwLAorICAgICAgICAgIHRoaXNfcGxheWVyKCkpOyAKKyAgICB9CisKKyAgICAvLyBBYndhZXJ0c2tvbXBhdGliZWw6IERhcyBlcnN0ZSAlcyB3aXJkIHp1IFdFTjEsIGRhcyB6d2VpdGUgenUgV0VOMgorICAgIHMxID0gcmVwbGFjZV9wZXJzb25hbChzcHJpbnRmKFF1ZXJ5UHJvcChQX1dJRUxEX01TRylbMV0sIkBXRU4xIiwiQFdFTjIiKSwKKwkJICAgICh7dGhpc19wbGF5ZXIoKSwgdGhpc19vYmplY3QoKX0pLCAxKTsKKyAgICAgICAgCisgICAgaWYgKCBvYmplY3RwKGVudmlyb25tZW50KCkpICYmIG9iamVjdHAoZW52aXJvbm1lbnQoZW52aXJvbm1lbnQoKSkpICkKKyAgICAgICAgc2VuZF9yb29tKGVudmlyb25tZW50KGVudmlyb25tZW50KCkpLAorICAgICAgICAgICAgICBzMSwKKyAgICAgICAgICAgICAgTVRfTE9PS3xNU0dfQlNfTEVBVkVfTEZTLAorICAgICAgICAgICAgICBNQV9XSUVMRCwgMCwgKHt0aGlzX3BsYXllcigpfSksIGVudmlyb25tZW50KCkpOworICAgIHJldHVybjsKKyAgfQorICAvKgorICAgKiBLZWluZSBXaWVsZE1zZyBnZXNldHp0LCBBdXNnYWJlIGRlciBEZWZhdWx0LU1lbGR1bmdlbi4KKyAgICovCisgIGVsc2UgaWYoaW50ZXJhY3RpdmUodGhpc19wbGF5ZXIoKSkpCisgIHsKKyAgICB0aGlzX3BsYXllcigpLT5SZWNlaXZlTXNnKAorICAgICAgICAiRHUgenVlY2tzdCAiK25hbWUoV0VOLDEpKyIuIiwKKyAgICAgICAgTVRfTk9USUZJQ0FUSU9OLCBNQV9XSUVMRCwgMCwgdGhpc19wbGF5ZXIoKSk7CisgIH0KKyAgCisgIC8vcy5vLiBlcnNldHp0IGR1cmNoIHRlbGxfcm9vbSgpCisgIC8vc2F5KGJyZWFrX3N0cmluZyh0aGlzX3BsYXllcigpLT5OYW1lKFdFUikrIiB6dWVja3QgIgorICAvLyArbmFtZShXRU4sMCkrIi4iLDc4KSwoeyB0aGlzX3BsYXllcigpIH0pKTsKKyAgaWYgKCBvYmplY3RwKGVudmlyb25tZW50KCkpICYmIG9iamVjdHAoZW52aXJvbm1lbnQoZW52aXJvbm1lbnQoKSkpICkKKyAgICAgIHNlbmRfcm9vbShlbnZpcm9ubWVudChlbnZpcm9ubWVudCgpKSwgICAgCisgICAgICAgICAgdGhpc19wbGF5ZXIoKS0+TmFtZShXRVIpKyIgenVlY2t0ICIrbmFtZShXRU4sMCkrIi4iLAorICAgICAgICAgIE1UX0xPT0ssCisgICAgICAgICAgTUFfV0lFTEQsIDAsICh7dGhpc19wbGF5ZXIoKX0pLCBlbnZpcm9ubWVudCgpKTsKK30KKworLyoKKyAqIEF1c2dhYmUgZWluZXIgTWVsZHVuZyBiZWltIFdlZ3N0ZWNrZW4gZ2VodCBudXIgYW4gU3BpZWxlciwgbmljaHQgYW4gTlBDLgorICogRGllIFVtZ2VidW5nIGJla29tbXQgaW1tZXIgZWluZSBNZWxkdW5nLgorICovCit2b2lkIGRvVW53aWVsZE1lc3NhZ2Uob2JqZWN0IHdpZWxkZWRfYnkpCit7CisgIHN0cmluZyAqc3RyLHMxOworCisgIGlmKCFvYmplY3RwKHdpZWxkZWRfYnkpKSAgLy8gSG9vcHMhIEdhciBuaWNodCBnZXp1ZWNrdD8gQWJicnVjaCEKKyAgeworICAgIHJldHVybjsKKyAgfQorCisgIGlmKFF1ZXJ5UHJvcChQX1VOV0lFTERfTVNHKSkgIC8vIEhpZXIgZ2lidCBlcyBlaW5lIFVud2llbGRNc2cuCisgIHsKKyAgICBpZihjbG9zdXJlcChRdWVyeVByb3AoUF9VTldJRUxEX01TRykpKSAgLy8gU29nYXIgYWxzIENsb3N1cmUsIHdvdyA6LSkKKyAgICB7CisgICAgICBzdHIgPSBmdW5jYWxsKFF1ZXJ5UHJvcChQX1VOV0lFTERfTVNHKSx3aWVsZGVkX2J5KTsKKworICAgICAgaWYoaW50ZXJhY3RpdmUod2llbGRlZF9ieSkpCisgICAgICB7IAorICAgICAgICB3aWVsZGVkX2J5LT5SZWNlaXZlTXNnKHN0clswXSwKKyAgICAgICAgICBNVF9OT1RJRklDQVRJT058TVNHX0JTX0xFQVZFX0xGUywgTUFfVU5XSUVMRCwgMCwgd2llbGRlZF9ieSk7CisgICAgICB9CisgICAgICBpZiAoIG9iamVjdHAoZW52aXJvbm1lbnQoKSkgJiYgb2JqZWN0cChlbnZpcm9ubWVudChlbnZpcm9ubWVudCgpKSkgKQorICAgICAgICAgIHNlbmRfcm9vbShlbnZpcm9ubWVudChlbnZpcm9ubWVudCgpKSwKKyAgICAgICAgICAgICAgc3RyWzFdLAorICAgICAgICAgICAgICBNVF9MT09LfE1TR19CU19MRUFWRV9MRlMsCisgICAgICAgICAgICAgIE1BX1VOV0lFTEQsIDAsICh7d2llbGRlZF9ieX0pLCBlbnZpcm9ubWVudCgpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIAorICAgIGVsc2UgaWYoaW50ZXJhY3RpdmUod2llbGRlZF9ieSkpCisgICAgeworICAgICAgczEgPSByZXBsYWNlX3BlcnNvbmFsKHNwcmludGYoUXVlcnlQcm9wKFBfVU5XSUVMRF9NU0cpWzBdLCJAV0VOMiIpLAorCQkgICAgICAoe3RoaXNfcGxheWVyKCksdGhpc19vYmplY3QoKX0pLCAxKTsgCisgICAgICB3aWVsZGVkX2J5LT5SZWNlaXZlTXNnKHMxLAorICAgICAgICAgIE1UX05PVElGSUNBVElPTnxNU0dfQlNfTEVBVkVfTEZTLCBNQV9VTldJRUxELCAwLCB3aWVsZGVkX2J5KTsKKyAgICB9CisKKyAgICBzMSA9IHJlcGxhY2VfcGVyc29uYWwoc3ByaW50ZihRdWVyeVByb3AoUF9VTldJRUxEX01TRylbMV0sIkBXRU4xIiwiQFdFTjIiKSwKKwkJICAgICh7d2llbGRlZF9ieSwgdGhpc19vYmplY3QoKX0pLCAxKTsKKyAgICAKKyAgICBpZiAoIG9iamVjdHAoZW52aXJvbm1lbnQoKSkgJiYgb2JqZWN0cChlbnZpcm9ubWVudChlbnZpcm9ubWVudCgpKSkgKQorICAgICAgICAgIHNlbmRfcm9vbShlbnZpcm9ubWVudChlbnZpcm9ubWVudCgpKSwKKyAgICAgICAgICAgICAgczEsCisgICAgICAgICAgICAgIE1UX0xPT0t8TVNHX0JTX0xFQVZFX0xGUywKKyAgICAgICAgICAgICAgTUFfVU5XSUVMRCwgMCwgKHt3aWVsZGVkX2J5fSksIGVudmlyb25tZW50KCkpOworICAgIHJldHVybjsKKyAgfQorICAvKgorICAgKiBLZWluZSBVbndpZWxkTXNnLCBhbHNvIERlZmF1bHQtTWVsZHVuZ2VuIGF1c2dlYmVuLgorICAgKi8KKyAgZWxzZSBpZihpbnRlcmFjdGl2ZSh3aWVsZGVkX2J5KSkKKyAgeworICAgIHdpZWxkZWRfYnktPlJlY2VpdmVNc2coCisgICAgICAgICJEdSBzdGVja3N0ICIrbmFtZShXRU4sMSkrIiB6dXJ1ZWNrLiIsCisgICAgICAgIE1UX05PVElGSUNBVElPTiwgTUFfVU5XSUVMRCwgMCwgd2llbGRlZF9ieSk7CisgIH0KKyAgaWYgKCBvYmplY3RwKGVudmlyb25tZW50KCkpICYmIG9iamVjdHAoZW52aXJvbm1lbnQoZW52aXJvbm1lbnQoKSkpICkKKyAgICAgIHNlbmRfcm9vbShlbnZpcm9ubWVudChlbnZpcm9ubWVudCgpKSwKKyAgICAgICAgICAgICAgd2llbGRlZF9ieS0+TmFtZShXRVIpICsiIHN0ZWNrdCAiK25hbWUoV0VOLDApKyIgenVydWVjay4iLAorICAgICAgICAgICAgICBNVF9MT09LLAorICAgICAgICAgICAgICBNQV9VTldJRUxELCAwLCAoe3dpZWxkZWRfYnl9KSwgZW52aXJvbm1lbnQoKSk7IAorfQorCisvLyBEaWVzZSBGdW5rdGlvbiB3aXJkIGF1ZmdlcnVmZW4sIHdlbm4gZGllIFdhZmZlIHdpcmtsaWNoIGdlenVlY2t0IHdpcmQKK3Byb3RlY3RlZCB2b2lkIEluZm9ybVdpZWxkKG9iamVjdCBwbCwgaW50IHNpbGVudCkKK3sKKyAgICByZXR1cm47Cit9CisgICAgIAorLy8gRGllc2UgRnVua3Rpb24gd2lyZCBhdWZnZXJ1ZmVuLCB3ZW5uIGRpZSBXYWZmZSB3aXJrbGljaCB3ZWdnZXN0ZWNrdAorLy8gd2lyZAorcHJvdGVjdGVkIHZvaWQgSW5mb3JtVW53aWVsZChvYmplY3QgcGwsIGludCBzaWxlbnQpIAoreworICAgIHJldHVybjsKK30KKworCisvLyB3aWVsZF9tZSBzb2xsIGtuYWxsZW4uIAordmFyYXJncyBpbnQgd2llbGRfbWUoaW50IHNpbGVudCkgCit7CisgIHJhaXNlX2Vycm9yKCJ3aWVsZF9tZSgpIGlzdCB2ZXJhbHRldC4gQml0dGUgbnV0emUgRG9XaWVsZCgpXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIERpZSBGdW5rdGlvbiwgZGllIGRhcyBlaWdlbnRsaWNoZSBadWVja2VuIGR1cmNoZnVlaHJ0LgordmFyYXJncyBpbnQgRG9XaWVsZChpbnQgc2lsZW50KSAKK3sgICBpbnQgICAgIGRleCwgcGFycnk7CisgICAgY2xvc3VyZSBjbDsKKyAgICBtaXhlZCAgIHJlczsKKyAgCisgICAgLy8gTWFuIGthbm4gbnVyIFdhZmZlbiB6dWVja2VuLCBkaWUgbWFuIGF1Y2ggaW0gSW52ZW50b3J5IGhhdC4KKyAgICBpZiAoZW52aXJvbm1lbnQoKSE9UEwpIAorICAgIHsKKyAgICAgICAgX25vdGlmeV9mYWlsKCBicmVha19zdHJpbmcoCisgICAgICAgICAgICAiRHUgbXVzc3QgIituYW1lKFdFTiwxKSsiIHNjaG9uIGVyc3QgbmVobWVuISIsNzgpICk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIEVpbmUgZ2V6dWVja3RlIFdhZmZlIGthbm4gbWFuIG5hdHVlcmxpY2ggbmljaHQgbm9jaG1hbCB6dWVja2VuCisgICAgaWYgKFF1ZXJ5UHJvcChQX1dJRUxERUQpKSAKKyAgICB7CisgICAgICAgIG5vdGlmeV9mYWlsKCJEYXMgaGFzdCBEdSBzY2hvbiBnZW1hY2h0IVxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIFdhZmZlbiwgZGllIGVpbiBvZGVyIG1laHJlcmUgQXR0cmlidXQgdmVyYWVuZGVybiB1bmQgZ2VnZW4KKyAgICAvLyBkYXMgZ2VzZXR6dGUgTGltaXQgdmVyc3Rvc3NlbiwgaGFiZW4ga2VpbmUgV2lya3VuZyBiZXp1ZWdsaWNoIGRlcgorICAgIC8vIEF0dHJpYnV0ZS4KKyAgICBpZiAoIG1hcHBpbmdwKHJlcz1RdWVyeVByb3AoUF9NX0FUVFJfTU9EKSkgJiYgUEwtPlRlc3RMaW1pdFZpb2xhdGlvbihyZXMpICkKKyAgICB7CisgICAgICAgIHdyaXRlKGJyZWFrX3N0cmluZygKKyAgICAgICAgICAgICJJcmdlbmRldHdhcyBhbiBEZWluZXIgQXVzcnVlc3R1bmcgdmVyaGluZGVydCwgZGFzcyBEdSBEaWNoIG1pdCAiKworICAgICAgICAgICAgbmFtZShXRU0sMSkrIiBzbyByaWNodGlnIHdvaGwgZnVlaGxzdC4iLDc4KSk7CisgICAgfQorCisgICAgLy8gVWViZXIgUF9SRVNUUklDVElPTlMga2FubiBtYW4gZWluaWdlIFJlc3RyaWt0aW9uZW4gZGVmaW5pZXJlbiwgb2huZQorICAgIC8vIGdsZWljaCBhdWYgZWluZSBXaWVsZEZ1bmMgenVydWVja2dyZWlmZW4genUgbXVlc3Nlbi4KKyAgICAvLyBEaWUgQXVzd2VydHVuZyBlcmZvbGd0IHVlYmVyIGRlbiBSZXN0cmljdGlvbkNoZWNrZXIKKyAgICBpZiAoIChyZXM9UXVlcnlQcm9wKFBfUkVTVFJJQ1RJT05TKSkgJiYgbWFwcGluZ3AocmVzKSAmJgorICAgICAgICAgKHJlcz0oc3RyaW5nKWNhbGxfb3RoZXIoIi9zdGQvcmVzdHJpY3Rpb25fY2hlY2tlciIsImNoZWNrX3Jlc3RyaWN0aW9ucyIsCisgICAgICAgICAgICAgUEwscmVzKSkgJiYgc3RyaW5ncChyZXMpICkgCisgICAgeworICAgICAgICBub3RpZnlfZmFpbChyZXMpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwYXJyeT0oaW50KVF1ZXJ5UHJvcChQX1BBUlJZKTsKKyAgICBkZXg9KGludClQTC0+UXVlcnlBdHRyaWJ1dGUoQV9ERVgpOworCisgICAgLy8gVGVzdGVuLCBvYiBkZXIgU3BpZWxlciBkaWUgbm9ldGlnZSBHZXNjaGlja2xpY2hrZWl0IGJlc2l0enQsIHVtCisgICAgLy8gbWl0IGRpZXNlciAoUGFyaWVyKVdhZmZlIHVtZ2VoZW4genUga29lbm5lbgorICAgIGlmICggKChwYXJyeTxQQVJSWV9PTkxZKSAmJiAoKGRleCs4KSoxMCk8UXVlcnlQcm9wKFBfV0MpKSB8fCAKKyAgICAgICAgICgocGFycnk+UEFSUllfTk9UKSAgJiYgKChkZXgrNSkqMiApPFF1ZXJ5UHJvcChQX0FDKSkgKQorICAgIHsKKyAgICAgICAgbm90aWZ5X2ZhaWwoCisgICAgICAgICAgICAiRHUgYmlzdCBuaWNodCBnZXNjaGlja3QgZ2VudWcsIHVtIG1pdCBkaWVzZXIgV2FmZmUgdW16dWdlaGVuLlxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIEVpbmUgR2V6dWVja3RlIFdhZmZlIG11c3MgbmF0dWVybGljaCBlcnN0IG1hbCB3ZWdnZXN0ZWNrdCB3ZXJkZW4uCisgICAgaWYgKCAocGFycnk8UEFSUllfT05MWSkgJiYgb2JqZWN0cChyZXM9KG9iamVjdClQTC0+UXVlcnlQcm9wKFBfV0VBUE9OKSkgKQorICAgIHsKKyAgICAgICAgaWYgKCAocmVzLT5Eb1Vud2llbGQoc2lsZW50KSkgJiYgISgob2JqZWN0KVBMLT5RdWVyeVByb3AoUF9XRUFQT04pKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFdlbm4gZGllIGFsdGUgV2FmZmUgd2VnZ2VzdGVja3Qgd2VyZGVuIGtvbm50ZSwgbm9jaG1hbAorICAgICAgICAgICAgLy8gdmVyc3VjaGVuIHp1IHp1ZWNrZW4KKyAgICAgICAgICAgIHJldHVybiBEb1dpZWxkKHNpbGVudCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAKKyAgICAgICAgeworICAgICAgICAgICAgLy8gU29uc3QgTWVsZHVuZyBhdXNnZWJlbgorICAgICAgICAgICAgbm90aWZ5X2ZhaWwoIkRhcyBnZWh0IG5pY2h0LCBzb2xhbmdlIER1IG5vY2ggZWluZSBhbmRlcmUgIisKKyAgICAgICAgICAgICAgICAgIldhZmZlIGdlenVlY2t0IGhhc3QuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIC8vIERhcyBnbGVpY2hlIGdpbHQgbmF0dWVybGljaCBmdWVyIFBhcmllcndhZmZlbgorICAgIGlmICggKHBhcnJ5PlBBUlJZX05PVCkgJiYgb2JqZWN0cChyZXM9KG9iamVjdClQTC0+UXVlcnlQcm9wKFBfUEFSUllfV0VBUE9OKSkgKQorICAgIHsKKyAgICAgICAgaWYgKCAocmVzLT5Eb1Vud2llbGQoc2lsZW50KSkgJiYgIShQTC0+UXVlcnlQcm9wKFBfUEFSUllfV0VBUE9OKSkgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBXZW5uIGRpZSBhbHRlIFBhcmllcndhZmZlIHdlZ2dlc3RlY2t0IHdlcmRlbiBrb25udGUsIG5vY2htYWwKKyAgICAgICAgICAgIC8vIHZlcnN1Y2hlbiB6dSB6dWVja2VuCisgICAgICAgICAgICByZXR1cm4gRG9XaWVsZChzaWxlbnQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFNvbnN0IE1lbGR1bmcgYXVzZ2ViZW4KKyAgICAgICAgICAgIG5vdGlmeV9mYWlsKCJEYXMgZ2VodCBuaWNodCwgc29sYW5nZSBEdSBub2NoIGVpbmUgYW5kZXJlICIrCisgICAgICAgICAgICAgICAgICJQYWllcndhZmZlIGdlenVlY2t0IGhhc3QuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSXN0IGVpbmUgV2llbGRGdW5jIGdlc2V0enQsIHdpcmQgZGllc2UgYXVmZ2VydWZlbi4KKyAgICBpZiAob2JqZWN0cChyZXM9UXVlcnlQcm9wKFBfV0lFTERfRlVOQykpIAorCSYmICEocmVzLT5XaWVsZEZ1bmMoTUUsc2lsZW50LGVudmlyb25tZW50KCkpKSkKKyAgICB7CisgICAgICAgIC8vIEVpbmUgTWVsZHVuZyBzb2xsdGUgc2Nob24gdm9uIGRlciBXaWVsZEZ1bmMgYXVzZ2VnZWJlbiB3ZXJkZW4uCisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIC8vIERpZSB6dWxhZXNzaWdlbiBIb2VjaHN0d2VydGUgZHVlcmZlbiBuYXR1ZXJsaWNoIG5pY2h0CisgICAgLy8gdWViZXJzY2hyaXR0ZW4gd2VyZGVuLgorICAgIGlmICggKHBhcnJ5PFBBUlJZX09OTFkpICYmIChRdWVyeVByb3AoUF9XQyk+TUFYX1dFQVBPTl9DTEFTUykgKQorICAgIHsKKyAgICAgICAgbm90aWZ5X2ZhaWwoCisgICAgICAgICAgICAiVW5ndWVsdGlnZSBXYWZmZW5rbGFzc2UsIGJpdHRlIEVyem1hZ2llciB2ZXJzdGFlbmRpZ2VuLlxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoIChwYXJyeT5QQVJSWV9OT1QpICYmIChRdWVyeVByb3AoUF9BQyk+TUFYX1BBUlJZX0NMQVNTKSApCisgICAgeworICAgICAgICBub3RpZnlfZmFpbCgKKyAgICAgICAgICAgICJVbmd1ZWx0aWdlIFBhcmllcmtsYXNzZSwgYml0dGUgRXJ6bWFnaWVyIHZlcnN0YWVuZGlnZW4uXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gVGVzdGVuLCBvYiBkZXIgWnVlY2tlciBnZW51ZyBIYWVuZGUgZnJlaSBoYXQuICAKKyAgICBpZiAoIShQTC0+VXNlSGFuZHMoTUUsUXVlcnlQcm9wKFBfTlJfSEFORFMpKSkpCisgICAgeworICAgICAgICBub3RpZnlfZmFpbCgiRHUgaGFzdCBrZWluZSBIYW5kIG1laHIgZnJlaS5cbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBPaywgamV0enQgaXN0IGFsbGVzIGtsYXIsIGRpZSAoUGFyaWVyKVdhZmZlIHdpcmQgZ2V6dWVja3QKKyAgICBTZXRQcm9wKFBfV0lFTERFRCwgUEwpOworICAgIFNldFByb3AoUF9FUVVJUF9USU1FLHRpbWUoKSk7CisKKyAgICBjbD1zeW1ib2xfZnVuY3Rpb24oIlNldFByb3AiLFBMKTsKKworICAgIGlmIChwYXJyeTxQQVJSWV9PTkxZKQorICAgIHsKKyAgICAgICAgLy8gRGllc2VzIE9iamVrdCBhbHMgV2FmZmUgc2V0emVuCisgICAgICAgIGZ1bmNhbGwoY2wsUF9XRUFQT04sIE1FICk7CisgICAgfQorICAgIGlmIChwYXJyeT5QQVJSWV9OT1QpCisgICAgeworICAgICAgICAvLyBEaWVzZXMgT2JqZWt0IGFscyBQYXJpZXJ3YWZmZSBzZXR6ZW4KKyAgICAgICAgZnVuY2FsbChjbCxQX1BBUlJZX1dFQVBPTiwgTUUgKTsKKyAgICB9CisKKyAgICAvLyBXYWZmZW4ga29lbm5lbiBBdHRyaWJ1dGUgYWVuZGVybi9ibG9ja2llcmVuLiBBbHNvIG11ZXNzZW4gZGllc2UKKyAgICAvLyBuYWNoIGRlbSBadWVja2VuIGFrdHVhbGlzaWVydCB3ZXJkZW4KKyAgICBQTC0+cmVnaXN0ZXJfbW9kaWZpZXIoTUUpOworICAgIFBMLT5VcGRhdGVBdHRyaWJ1dGVzKCk7CisKKyAgICAvLyBQX1RPVEFMX0FDL1BfVE9UQUxfV0MgaW0gU3BpZWxlciBha3R1YWxpc2llcmVuLiBEYSBkb3J0IEF0dHJpYnV0ZQorICAgIC8vIGVpbmdlaGVuLCBrYW5uIGRhcyBlcnN0IGhpZXIgZ2VtYWNodCB3ZXJkZW4uCisgICAgaWYgKHBhcnJ5PFBBUlJZX09OTFkpCisgICAgeworICAgICAgICBQTC0+UXVlcnlQcm9wKFBfVE9UQUxfV0MpOworICAgIH0KKyAgICBpZiAocGFycnk+UEFSUllfTk9UKQorICAgIHsKKyAgICAgICAgUEwtPlF1ZXJ5UHJvcChQX1RPVEFMX0FDKTsKKyAgICB9CisKKyAgICAvLyBadWVjay1NZWxkdW5nIGF1c2dlYmVuLCB3ZW5uIGRhcyBzaWxlbnQtRmxhZyBuaWNodCBnZXNldHp0IGlzdAorICAgIGlmICghc2lsZW50KQorICAgIHsKKyAgICAgICAgZG9XaWVsZE1lc3NhZ2UoKTsKKyAgICB9CisKKyAgICAvLyBBbGxlIFdhZmZlbiB3ZXJkZW4gaW0gYXdtYXN0ZXIgcmVnaXN0cmllcnQsIHNvYmFsZCBzaWUgdm9uIGVpbmVtCisgICAgLy8gU3BpZWxlciBnZXp1ZWNrdCB3ZXJkZW4KKyAgICBpZiAoIWxvZ2dlZCAmJiBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKFBMKSkgCisgICAgeworICAgICAgICBjYWxsX290aGVyKCIvc2VjdXJlL2F3bWFzdGVyIiwiUmVnaXN0ZXJXZWFwb24iLE1FKTsKKyAgICAgICAgbG9nZ2VkPTE7CisgICAgfQorCisgICAgLy8gSW5mb3JtLUZ1bmt0aW9uIGF1ZnJ1ZmVuCisgICAgSW5mb3JtV2llbGQoUEwsc2lsZW50KTsKKworICAgIC8vIEZlcnRpZyBtaXQgZGVtIFp1ZWNrZW4KKyAgICByZXR1cm4gMTsKK30KKworLy8gRGllIEZ1bmt0aW9uLCBkaWUgZGFzIGVpZ2VudGxpY2hlIFdlZ3N0ZWNrZW4gZHVyY2hmdWVocnQuCit2YXJhcmdzIGludCBEb1Vud2llbGQoaW50IHNpbGVudCkgCit7ICAgY2xvc3VyZSBjbDsKKyAgICBpbnQgICAgIHBhcnJ5OworICAgIG1peGVkICAgcmVzOworICAgIG9iamVjdCAgd2llbGRlZF9ieTsKKworICAgIC8vIFdhZmZlbiwgZGllIG5pY2h0IGdlenVlY2t0IHNpbmQsIGthbm4gbWFuIG5hdHVlcmxpY2ggbmljaHQKKyAgICAvLyB3ZWdzdGVja2VuCisgICAgaWYgKCFvYmplY3RwKHdpZWxkZWRfYnk9UXVlcnlQcm9wKFBfV0lFTERFRCkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gSXN0IGVpbmUgVW53aWVsZEZ1bmMgZ2VzZXR6dCwgd2lyZCBkaWVzZSBhdWZnZXJ1ZmVuCisgICAgaWYgKCBvYmplY3RwKHJlcz1RdWVyeVByb3AoUF9VTldJRUxEX0ZVTkMpKSAmJgorICAgICAgICAgIShyZXMtPlVud2llbGRGdW5jKE1FLHNpbGVudCx3aWVsZGVkX2J5KSkgKSAKKyAgICB7CisgICAgICAgIC8vIEVpbmUgTWVsZHVuZyBtdXNzIGRpZSBVbndpZWxkRnVuYyBzY2hvbiBzZWxic3QgYXVzZ2ViZW4uCisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIC8vIEVpbmUgdmVyZmx1Y2h0ZSBXYWZmZSBrYW5uIG1hbiBuYXR1ZXJsaWNoIG5pY2h0IHdlZ3N0ZWNrZW4gLSBhYmVyCisgICAgLy8gYXVjaCBkYSBnaWJ0cyBBdXNuYWhtZWZhZWxsZSwgd2llIHouQi4gZGVuIFRvZCBlaW5lcyBTcGllbGVycworICAgIGlmICgocmVzPVF1ZXJ5UHJvcChQX0NVUlNFRCkpICYmICEoc2lsZW50Jk1fTk9DSEVDSykpIAorICAgIHsKKyAgICAgICAgaWYgKHN0cmluZ3AocmVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gU3RhbmQgaW4gUF9DVVJTRUQgZWluIFN0cmluZz8gRGFubiBkaWVzZW4gYXVzZ2ViZW4KKyAgICAgICAgICAgIHRlbGxfb2JqZWN0KHdpZWxkZWRfYnksIAorICAgICAgICAgICAgICAgIChyZXNbPDFdPT0nXG4nID8gcmVzIDogYnJlYWtfc3RyaW5nKHJlcyw3OCkpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFNvbnN0IGVpbmUgU3RhbmRhcmQtTWVsZHVuZyBhdXNnZWJlbgorICAgICAgICAgICAgdGVsbF9vYmplY3Qod2llbGRlZF9ieSwgYnJlYWtfc3RyaW5nKAorICAgICAgICAgICAgICAgICJEdSBrYW5uc3QgIituYW1lKFdFTikrIiBuaWNodCB3ZWdzdGVja2VuLiIsNzgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvLyBPaywgamV0enQgaXN0IGFsbGVzIGtsYXIsIGRpZSAoUGFyaWVyKVdhZmZlIHdpcmQgd2VnZ2VzdGVja3QKKyAgICBwYXJyeT1RdWVyeVByb3AoUF9QQVJSWSk7CisgICAgY2w9c3ltYm9sX2Z1bmN0aW9uKCJTZXRQcm9wIix3aWVsZGVkX2J5KTsKKworICAgIGlmIChwYXJyeTxQQVJSWV9PTkxZKQorICAgIHsKKyAgICAgICAgLy8gRWludHJhZyBhbHMgV2FmZmUgaW0gU3BpZWxlciBsb2VzY2hlbgorICAgICAgICBmdW5jYWxsKGNsLFBfV0VBUE9OLCAwKTsKKyAgICB9CisgICAgaWYgKHBhcnJ5PlBBUlJZX05PVCkKKyAgICB7CisgICAgICAgIC8vIEVpbnRyYWcgYWxzIFBhcmllcndhZmZlIGltIFNwaWVsZXIgbG9lc2NoZW4KKyAgICAgICAgZnVuY2FsbChjbCxQX1BBUlJZX1dFQVBPTiwgMCk7CisgICAgfQorCisgICAgLy8gSW0gU3BpZWxlciBkaWUgWmVpdCBzZXR6ZW4sIHp1IGRlciBlciB6dWxldHp0IGVpbmUgV2FmZmUgd2VnZ2VzdGVja3QKKyAgICAvLyBoYXQuCisgICAgZnVuY2FsbChjbCxQX1VOV0lFTERfVElNRSx0aW1lKCkpOworCisgICAgLy8gTWVsZHVuZyBhdXNnZWJlbiwgd2VubiBzaWxlbnQtRmxhZyBuaWNodCBnZXNldHp0IGlzdAorICAgIGlmICghc2lsZW50KSAKKyAgICB7CisgICAgICAgIGRvVW53aWVsZE1lc3NhZ2Uod2llbGRlZF9ieSk7CisgICAgfSAKKworICAgIC8vIERpZSBIYWVuZGUsIGRpZSBiaXNoZXIgdm9uIGRlciBXYWZmZSBiZW51dHp0IHd1cmRlbiwgZnJlaWdlYmVuCisgICAgd2llbGRlZF9ieS0+RnJlZUhhbmRzKE1FKTsKKyAgICBTZXRQcm9wKFBfV0lFTERFRCwgMCk7CisKKyAgICAvLyBXYWZmZW4ga29lbm5lbiBBdHRyaWJ1dGUgYWVuZGVybi9ibG9ja2llcmVuLiBBbHNvIG11ZXNzZW4gZGllc2UKKyAgICAvLyBuYWNoIGRlbSBXZWdzdGVja2VuIGFrdHVhbGlzaWVydCB3ZXJkZW4KKyAgICB3aWVsZGVkX2J5LT5kZXJlZ2lzdGVyX21vZGlmaWVyKE1FKTsKKyAgICB3aWVsZGVkX2J5LT5VcGRhdGVBdHRyaWJ1dGVzKCk7CisKKyAgICAvLyBQX1RPVEFMX0FDL1BfVE9UQUxfV0MgaW0gU3BpZWxlciBha3R1YWxpc2llcmVuLiBEYSBkb3J0IEF0dHJpYnV0ZQorICAgIC8vIGVpbmdlaGVuLCBrYW5uIGRhcyBlcnN0IGhpZXIgZ2VtYWNodCB3ZXJkZW4uCisgICAgaWYgKHBhcnJ5PFBBUlJZX09OTFkpCisgICAgeworICAgICAgICB3aWVsZGVkX2J5LT5RdWVyeVByb3AoUF9UT1RBTF9XQyk7CisgICAgfQorICAgIGlmIChwYXJyeT5QQVJSWV9OT1QpCisgICAgeworICAgICAgICB3aWVsZGVkX2J5LT5RdWVyeVByb3AoUF9UT1RBTF9BQyk7CisgICAgfQorCisgICAgLy8gSW5mb3JtLUZ1bmt0aW9uIGF1ZnJ1ZmVuCisgICAgSW5mb3JtVW53aWVsZCh3aWVsZGVkX2J5LCBzaWxlbnQpOworCisgICAgLy8gRmVydGlnIG1pdCBkZW0gV2Vnc3RlY2tlbgorICAgIHJldHVybiAxOworfQorCisvLyBEaWUgRnVua3Rpb24sIGRpZSBkYXMgInp1ZWNrZW4iLUtvbW1hbmRvIGF1c3dlcnRldAordmFyYXJncyBpbnQgd2llbGQoc3RyaW5nIHN0ciwgaW50IHNpbGVudCkgCit7CisgICAgaWYgKCAhc3RyaW5ncChzdHIpIHx8CisgICAgICAgICAocXVlcnlfdmVyYigpWzAuLjNdPT0iemllaCIgJiYgc3NjYW5mKHN0ciwiJXMgaGVydm9yIixzdHIpIT0xKSApCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoIWlkKHN0cikpIAorICAgIHsKKyAgICAgICAgX25vdGlmeV9mYWlsKCJEdSBoYXN0IHNvd2FzIG5pY2h0LlxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiBEb1dpZWxkKHNpbGVudCk7Cit9CisKKy8vIERpZSBGdW5rdGlvbiwgZGllIGRhcyAid2Vnc3RlY2tlbiItS29tbWFuZG8gYXVzd2VydGV0CitpbnQgdW53aWVsZChzdHJpbmcgc3RyKSAKK3sgICBpbnQgICAgcGFycnk7CisgICAgc3RyaW5nIGR1bW15OworCisgICAgLy8gRXJzdG1hbCBkaWUgRWluZ2FiZSBhdXN3ZXJ0ZW4uIElzdCBkaWVzIHdpcmtsaWNoIGVpbiBLb21tYW5kbworICAgIC8vIHp1bSBXZWdzdGVja2VuPworICAgIGlmICggIXN0cmluZ3Aoc3RyKSB8fCAoc3NjYW5mKHN0ciwiJXMgd2VnIiwgICAgIGR1bW15KSE9MSAgJiYgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2NhbmYoc3RyLCIlcyBlaW4iLCAgICAgZHVtbXkpIT0xICAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NjYW5mKHN0ciwiJXMgenVydWVjayIsIGR1bW15KSE9MSApICkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHN0ciA9IGR1bW15OworICAgIHBhcnJ5PVF1ZXJ5UHJvcChQX1BBUlJZKTsKKworICAgIC8vIElzdCB3aXJrbGljaCBkaWVzZSBXYWZmZSBnZW1laW50PworICAgIGlmICggIXN0cmluZ3Aoc3RyKSB8fCAhaWQoc3RyKSB8fAorICAgICAgICAgKChwYXJyeTxQQVJSWV9PTkxZKSYmKChvYmplY3QpUEwtPlF1ZXJ5UHJvcChQX1dFQVBPTikhPU1FKSkgfHwKKyAgICAgICAgICgocGFycnk+UEFSUllfTk9UKSYmKChvYmplY3QpUEwtPlF1ZXJ5UHJvcChQX1BBUlJZX1dFQVBPTikhPU1FKSkgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gTWFuIGthbm4gbnVyIFdhZmZlbiB3ZWdzdGVja2VuLCBkaWUgbWFuIGF1Y2ggYmVpIHNpY2ggaGF0CisgICAgaWYgKGVudmlyb25tZW50KCkgIT0gUEwpIAorICAgIHsKKyAgICAgICAgX25vdGlmeV9mYWlsKCJEaWVzZSBXYWZmZSBnZWhvZXJ0IERpciBuaWNodCFcbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBVbmQgbmF0dWVybGljaCBnZWh0IGRhcyBhdWNoIG51ciwgd2VubiBkaWUgV2FmZmUgZ2V6dWVja3QgaXN0LgorICAgIGlmICghUXVlcnlQcm9wKFBfV0lFTERFRCkpIAorICAgIHsKKyAgICAgICAgX25vdGlmeV9mYWlsKCJEaWVzZSBXYWZmZSBoYXN0IER1IGdhciBuaWNodCBnZXp1ZWNrdCAuLi5cbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gRG9VbndpZWxkKCk7Cit9CisKKy8vIERpZSBGdW5rdGlvbiwgZGllIGRlbiBTY2hhZGVuIGJlcmVjaG5ldCwgZGVuIGRpZSBXYWZmZSB2ZXJ1cnNhY2h0CitpbnQgUXVlcnlEYW1hZ2Uob2JqZWN0IGVuZW15KQoreyAgIGludCAgICBkYW07CisgICAgbWl4ZWQgIGhpdF9mdW5jOworICAgIG9iamVjdCB3aWVsZGVyOworCisgICAgLy8gTnVyIGdlenVlY2t0ZSBXYWZmZW4gbWFjaGVuIFNjaGFkZW4KKyAgICBpZiAoIW9iamVjdHAod2llbGRlcj1RdWVyeVByb3AoUF9XSUVMREVEKSkpCisgICAgICAgIHJldHVybiAwOworCisgICAgLy8gRGVuIEJhc2lzLVNjaGFkZW4gYmVyZWNobmVuLiBEaWUgU3RhZXJrZSBkZXMgQmVudXR6ZXJzIHdpcmQKKyAgICAvLyBoaWVyIGJlcnVlY2tzaWNodGlndC4KKyAgICBkYW0gPSAoMipRdWVyeVByb3AoUF9XQykrMTAqKChpbnQpd2llbGRlci0+UXVlcnlBdHRyaWJ1dGUoQV9TVFIpKSkvMzsKKworICAgIC8vIFdpZSBndXQgbWFuIGdldHJvZmZlbiBoYXQsIHdpcmQgdWViZXIgZWluIHJhbmRvbSgpIHNpbXVsaWVydAorICAgIGRhbSA9IHJhbmRvbSgxK2RhbSk7CisKKyAgICAvLyBJc3QgZWluZSBIaXRGdW5jIGdlc2V0enQsIGRhbm4gd2lyZCBkaWVzZSBhdXNnZXdlcnRldC4gRGVyIAorICAgIC8vIFJ1ZWNrZ2FiZS1XZXJ0IHdpcmQgenVtIFNjaGFkZW4gYWRkaWVydAorICAgIGlmICghaGl0X2NsIHx8ICFnZXRfdHlwZV9pbmZvKGhpdF9jbCwyKSkKKyAgICB7CisgICAgICAgIGlmIChvYmplY3RwKGhpdF9mdW5jPVF1ZXJ5UHJvcChQX0hJVF9GVU5DKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGhpdF9jbD1zeW1ib2xfZnVuY3Rpb24oIkhpdEZ1bmMiLGhpdF9mdW5jKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaGl0X2NsICYmIGdldF90eXBlX2luZm8oaGl0X2NsLDIpKQorICAgIHsKKyAgICAgICAgZGFtICs9IGZ1bmNhbGwoaGl0X2NsLGVuZW15KTsKKyAgICB9CisKKyAgICAvLyBaZWl0cHVua3QgZGVyIGxldHp0ZW4gQmVudXR6dW5nIGF1c2dlYmVuCisgICAgU2V0UHJvcChQX0xBU1RfVVNFLHRpbWUoKSk7CisKKyAgICAvLyBCZXJlY2huZXRlbiBTY2hhZGVuIHp1cnVlY2tnZWJlbgorICAgIHJldHVybiBkYW07Cit9CisKKy8vIERpZSBGdW5rdGlvbiwgZGllIGJlaSBQYXJpZXJ3YWZmZW4gZGVuIFNjaHV0endlcnQgYmVyZWNobmV0LgoraW50IFF1ZXJ5RGVmZW5kKHN0cmluZyogZGFtX3R5cGUsIG1peGVkIHNwZWxsLCBvYmplY3QgZW5lbXkpIAoreyAgIGludCAgICAgcHJvdDsKKyAgICBtaXhlZCAgIGRlZl9mdW5jOworICAgIG9iamVjdCAgcGw7CisKKyAgICBwcm90ID0gMDsKKworICAgIC8vIFJ1ZXN0dW5nZW4gc2NodWV0emVuIG51ciBnZWdlbiBwaHlzaWthbGlzY2hlbiBTY2hhZGVuCisgICAgaWYgKCFzcGVsbCB8fCAobWFwcGluZ3Aoc3BlbGwpICYmIHNwZWxsW1NQX1BIWVNJQ0FMX0FUVEFDS10pKQorICAgIHsKKyAgICAgICAgaWYgKHNpemVvZihmaWx0ZXIoZGFtX3R5cGUsUEhZU0lDQUxfREFNQUdFX1RZUEVTKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByb3QgPSByYW5kb20oMStRdWVyeVByb3AoUF9BQykpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSXN0IGVpbmUgRGVmZW5kRnVuYyBnZXNldHp0LCB3aXJkIGRpZXNlIGF1c2dld2VydGV0CisgICAgaWYgKCFkZWZlbmRfY2wgfHwgIWdldF90eXBlX2luZm8oZGVmZW5kX2NsLDIpKQorICAgIHsKKyAgICAgICAgaWYgKG9iamVjdHAoZGVmX2Z1bmM9UXVlcnlQcm9wKFBfREVGRU5EX0ZVTkMpKSkgCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlZmVuZF9jbD1zeW1ib2xfZnVuY3Rpb24oIkRlZmVuZEZ1bmMiLGRlZl9mdW5jKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvL0JlaSBOZXR6dG90ZW4ga2VpbmUgKHp1cnVlY2tzY2hsYWdlbmRlKSBEZWZlbmRGdW5jCisgICAgaWYgKGRlZmVuZF9jbCAmJiBnZXRfdHlwZV9pbmZvKGRlZmVuZF9jbCwyKSAmJgorICAgICAgICBvYmplY3RwKHBsPVF1ZXJ5UHJvcChQX1dJRUxERUQpKSAmJiAoIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUocGwpIHx8CisgICAgICAgIGludGVyYWN0aXZlKHBsKSkgKQorICAgIHsKKyAgICAgICAgLy8gRGVyIFJ1ZWNrZ2FiZXdlcnQgZGVyIERlZmVuZEZ1bmMgd2lyZCB6dW0gU2NodXR6IGFkZGllcnQKKyAgICAgICAgcHJvdCArPSBmdW5jYWxsKGRlZmVuZF9jbCwgZGFtX3R5cGUsIHNwZWxsLCBlbmVteSk7CisgICAgfQorCisgICAgLy8gWmVpdHB1bmt0IGRlciBsZXR6dGVuIEJlbnV0enVuZyBhdXNnZWJlbgorICAgIFNldFByb3AoUF9MQVNUX1VTRSx0aW1lKCkpOworCisgICAgLy8gQmVyZWNobmV0ZW4gU2NodXR6IHp1cnVlY2tnZWJlbgorICAgIHJldHVybiBwcm90OworfQorCisvLyBEaWUgQW56YWhsIGRlciB2b24gZWluZXIgV2FmZmUgYmVub2V0aWd0ZW4gSGFlbmRlIGRhcmYgbmF0dWVybGljaCBuaWNodAorLy8ga2xlaW5lciBhbHMgMSBzZWluLgoraW50IF9zZXRfbnJfaGFuZHMoaW50IGFyZykKK3sKKyAgICBpZiAoIWludHAoYXJnKSB8fCAoYXJnPDEpICkKKyAgICAgICAgcmV0dXJuIFF1ZXJ5KFBfTlJfSEFORFMsIEZfVkFMVUUpOworICAgIHJldHVybiBTZXQoUF9OUl9IQU5EUywgYXJnLCBGX1ZBTFVFKTsKK30KKworLy8gRGVyIFNjaGFkZW5zdHlwIGVpbmVyIFdhZmZlIGRhcmYgendhciBhbHMgc3RyaW5nIGFuZ2VnZWJlbiB3ZXJkZW4sIHdpcmQKKy8vIGludGVybiBhYmVyIGltbWVyIGFscyBhcnJheSBnZXNwZWljaGVydAorbWl4ZWQgX3NldF9kYW1fdHlwZShtaXhlZCBhcmcpCit7CisgICAgaWYgKHBvaW50ZXJwKGFyZykpCisgICAgeworICAgICAgICByZXR1cm4gU2V0KFBfREFNX1RZUEUsIGFyZywgRl9WQUxVRSk7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cmluZ3AoYXJnKSkKKyAgICB7CisgICAgICAgIHJldHVybiBTZXQoUF9EQU1fVFlQRSwgKHsgYXJnIH0pLCBGX1ZBTFVFKTsKKyAgICB9CisgICAgcmV0dXJuIFF1ZXJ5KFBfREFNX1RZUEUsIEZfVkFMVUUpOworfQorCisvLyBPYmpla3RlLCBkaWUgZGllIEJlc2NoYWVkaWd1bmcgZWluZXIgV2FmZmUgZHVyY2ggZGlyZWt0ZXMgU2V0emVuIHZvbgorLy8gUF9EQU1BR0VEIGR1cmNoZnVlaHJlbiwgd2VyZGVuIGltIGF3bWFzdGVyIGdlbG9nZ3QKK21peGVkIF9zZXRfaXRlbV9kYW1hZ2VkKG1peGVkIGFyZykKK3sKKyAgICBpZiAoYXJnICYmICFpbnRwKGFyZykpCisgICAgeworICAgICAgICByZXR1cm4gUXVlcnkoUF9EQU1BR0VELCBGX1ZBTFVFKTsKKyAgICB9CisKKyAgICBpZiAocHJldmlvdXNfb2JqZWN0KDEpKQorICAgICAgY2FsbF9vdGhlcigiL3NlY3VyZS9hd21hc3RlciIsIlJlZ2lzdGVyRGFtYWdlciIsCisgICAgICAgICAgICBwcmV2aW91c19vYmplY3QoMSksUXVlcnlQcm9wKFBfREFNQUdFRCksYXJnKTsKKyAgICAKKyAgICByZXR1cm4gU2V0KFBfREFNQUdFRCxhcmcsRl9WQUxVRSk7Cit9CisKKy8vIFdpcmQgZXR3YXMgYW4gUF9ISVRfRlVOQyBnZWFlbmRlcnQsIG11c3MgZGllIHp1Z2Vob2VyaWdlIGNsb3N1cmUKKy8vIGVyc3RtYWwgZ2Vsb2VzY2h0IHdlcmRlbi4KK21peGVkIF9zZXRfaGl0X2Z1bmMobWl4ZWQgYXJnKQoreworICAgIGhpdF9jbD0wOworICAgIHJldHVybiBTZXQoUF9ISVRfRlVOQywgYXJnLCBGX1ZBTFVFKTsKK30KKworLy8gV2lyZCBldHdhcyBhbiBQX0RFRkVORF9GVU5DIGdlYWVuZGVydCwgbXVzcyBkaWUgenVnZWhvZXJpZ2UgY2xvc3VyZQorLy8gZXJzdG1hbCBnZWxvZXNjaHQgd2VyZGVuLgorbWl4ZWQgX3NldF9kZWZlbmRfZnVuYyhtaXhlZCBhcmcpCit7CisgICAgZGVmZW5kX2NsPTA7CisgICAgcmV0dXJuIFNldChQX0RFRkVORF9GVU5DLCBhcmcsIEZfVkFMVUUpOworfQorCisvLyBEaWUgbWF4aW1hbGUgV2FmZmVua2xhc3NlIGVpbmVyIFdhZmZlIGJlcmVjaG5ldCBzaWNoIG5hdHVlcmxpY2ggYXVzCisvLyBkZXIgYWt0dWVsbGVuIFdhZmZlbmtsYXNzZSB1bmQgZGVyIEJlc2NoYWVkaWd1bmcuIEVpbmUgQXVzbmFobWUgYmlsZGVuCisvLyBoaWVyIFdhZmZlbiwgZGVyZW4gZWZmZWt0aXZlIFdhZmZlbmtsYXNzZSBncm9lc3NlciBpc3QgYWxzIGRpZXNlIFN1bW1lCitpbnQgIF9xdWVyeV9tYXhfd2MoKSAKK3sgICBpbnQgYSxiOworCisgICAgYT1RdWVyeVByb3AoUF9XQykrUXVlcnlQcm9wKFBfREFNQUdFRCk7CisgICAgYj1RdWVyeVByb3AoUF9FRkZFQ1RJVkVfV0MpOworICAgIGlmIChiPmEpCisgICAgICAgIHJldHVybiBiOworICAgIHJldHVybiBhOworfQorCisvLyBXaWxsIG1hbiBlaW5lIFdhZmZlIGJlc2NoYWVkaWdlbiBvZGVyIHJlcGFyaWVyZW4sIHNvIG1hY2h0IG1hbiBkYXMKKy8vIGFtIGJlc3RlbiB1ZWJlciBkaWUgRnVua3Rpb24gRGFtYWdlKGFyZ3VtZW50KS4gUG9zaXRpdmUgQXJndW1lbnRlCisvLyBiZWRldXRlbiBlaW5lIEJlc2NoYWVkaWd1bmcsIG5lZ2F0aXZlIGVpbmUgUmVwYXJhdHVyLiBEZXIgUnVlY2tnYWJld2VydAorLy8gaXN0IGRpZSB3aXJrbGljaCBkdXJjaGdlZnVlaHJ0ZSBBZW5kZXJ1bmcgZGVzIEJlc2NoYWVkaWd1bmdzd2VydGVzCitpbnQgRGFtYWdlKGludCBuZXdfZGFtKQoreyAgIGludCAgICB3YyxvbGRfZGFtOworICAgIG9iamVjdCB3OworCisgICAgLy8gVWViZXJnZWJlbmVzIEFyZ3VtZW50IHBydWVmZW4KKyAgICBpZiAoIW5ld19kYW0gfHwgIWludHAobmV3X2RhbSkpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBCZWkgV2FmZmVuLCBkaWUgbmljaHQgYXVzc2NobGllc3NsaWNoIHp1ciBQYXJhZGUgZWluZ2VzZXR6dCB3ZXJkZW4sCisgICAgLy8gZ2VodCBkaWUgQmVzY2hhZWRpZ3VuZyBhdWYgZGllIEthbXBma3JhZnQsIHNwcmljaDogUF9XQworICAgIGlmIChRdWVyeVByb3AoUF9QQVJSWSk8UEFSUllfT05MWSkKKyAgICB7CisgICAgICAgIGlmICgod2M9UXVlcnlQcm9wKFBfV0MpKTw9TUlOX1dFQVBPTl9DTEFTUyAmJiBuZXdfZGFtPjApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFNvbnN0IHd1ZXJkZSBCZXNjaGFlZGlndW5nIHp1ciBSZXBhcmF0dXIgZnVlaHJlbgorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICAvLyBNaW4tV0MgdW5kIE1heC1XQyBiZWFjaHRlbgorICAgICAgICBpZiAoKHdjLW5ld19kYW0pIDwgTUlOX1dFQVBPTl9DTEFTUykKKyAgICAgICAgeworICAgICAgICAgICAgbmV3X2RhbSA9IHdjLU1JTl9XRUFQT05fQ0xBU1M7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKHdjLW5ld19kYW0pID4gTUFYX1dFQVBPTl9DTEFTUykKKyAgICAgICAgeworICAgICAgICAgICAgbmV3X2RhbSA9IHdjLU1BWF9XRUFQT05fQ0xBU1M7CisgICAgICAgIH0KKworICAgICAgICAvLyBOaWUgbWVociBhbHMgMTAwJSByZXBhcmllcmVuCisgICAgICAgIGlmICgoKG9sZF9kYW09UXVlcnlQcm9wKFBfREFNQUdFRCkpPC1uZXdfZGFtKSAmJiBuZXdfZGFtPDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG5ld19kYW09LW9sZF9kYW07CisgICAgICAgIH0KKworICAgICAgICAvLyBBZW5kZXJ1bmdlbiBhbiBkZXIgV2FmZmVua2xhc3NlIHVuZCBkZXIgZGVtIEJlc2NoYWVkaWd1bmdzd2VydAorICAgICAgICAvLyBkdXJjaGZ1ZWhyZW4KKyAgICAgICAgU2V0UHJvcChQX1dDLCh3Yy1uZXdfZGFtKSk7CisgICAgICAgIC8vIEF1c25haG1ld2Vpc2UgU2V0LCB1bSBkaWUgbG9nZ2VuZGUgU2V0bWV0aG9kZSB6dSB1bWdlaGVuLgorCS8vIFRPRE86IFNldFByb3AsIHNvYmFsZCBkaXJla3RlcyBCZXNjaGFlZGlnZW4gcmF1cyBpc3QuCisJU2V0KFBfREFNQUdFRCwgb2xkX2RhbStuZXdfZGFtLCBGX1ZBTFVFKTsKKworICAgICAgICAvLyBQX1RPVEFMX1dDIGltIFRyYWVnZXIgdXBkYXRlbiwgc28gdm9yaGFuZGVuCisgICAgICAgIGlmIChvYmplY3RwKHc9UXVlcnlQcm9wKFBfV0lFTERFRCkpKQorICAgICAgICAgICAgdy0+UXVlcnlQcm9wKFBfVE9UQUxfV0MpOworCisgICAgICAgIC8vIFJ1ZWNrZ2FiZXdlcnQ6IER1cmNoZ2VmdWVocnRlIEFlbmRlcnVuZyBhbiBQX0RBTUFHRQorICAgICAgICByZXR1cm4gbmV3X2RhbTsKKyAgICB9CisKKyAgICAvLyBCZWkgcmVpbmVuIFBhcmllcndhZmZlbiBnZWh0IGRpZSBCZXNjaGFlZGlndW5nIGF1ZiBkaWUKKyAgICAvLyBTY2h1dHp3aXJrdW5nLCBzcHJpY2g6IFBfQUMKKworICAgIGlmICgod2M9UXVlcnlQcm9wKFBfQUMpKTw9MCAmJiBuZXdfZGFtPjApCisgICAgeworICAgICAgICAvLyBTb25zdCB3dWVyZGUgQmVzY2hhZWRpZ3VuZyB6dXIgUmVwYXJhdHVyIGZ1ZWhyZW4KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIAorICAgIC8vIE1pbi1BQz0wIHVuZCBNYXgtQUMgYmVhY2h0ZW4KKyAgICBpZiAoKHdjLW5ld19kYW0pIDwgTUlOX1BBUlJZX0NMQVNTKQorICAgIHsKKyAgICAgICAgbmV3X2RhbSA9IHdjLU1JTl9QQVJSWV9DTEFTUzsKKyAgICB9CisgICAgZWxzZSBpZiAoKHdjLW5ld19kYW0pID4gTUFYX1BBUlJZX0NMQVNTKQorICAgIHsKKyAgICAgICAgbmV3X2RhbSA9IHdjLU1BWF9QQVJSWV9DTEFTUzsKKyAgICB9CisgCisgICAgLy8gTmllIG1laHIgYWxzIDEwMCUgcmVwYXJpZXJlbgorICAgIGlmICgoKG9sZF9kYW09UXVlcnlQcm9wKFBfREFNQUdFRCkpPC1uZXdfZGFtKSAmJiBuZXdfZGFtPDApCisgICAgeworICAgICAgICBuZXdfZGFtPS1vbGRfZGFtOworICAgIH0KKworICAgIC8vIEFlbmRlcnVuZ2VuIGFuIGRlciBSdWVzdHVuZ3NrbGFzc2UgdW5kIGRlbSBCZXNjaGFlZGlndW5nc3dlcnQKKyAgICAvLyBkdXJjaGZ1ZWhyZW4KKyAgICBTZXRQcm9wKFBfQUMsd2MtbmV3X2RhbSk7CisgICAgLy8gQXVzbmFobWV3ZWlzZSBTZXQsIHVtIGRpZSBsb2dnZW5kZSBTZXRtZXRob2RlIHp1IHVtZ2VoZW4uCisgICAgLy8gVE9ETzogU2V0UHJvcCwgc29iYWxkIGRpcmVrdGVzIEJlc2NoYWVkaWdlbiByYXVzIGlzdC4KKyAgICBTZXQoUF9EQU1BR0VELG9sZF9kYW0rbmV3X2RhbSwgRl9WQUxVRSk7CisKKyAgICAvLyBQX1RPVEFMX0FDIGltIFRyYWVnZXIgdXBkYXRlbiwgc28gdm9yaGFuZGVuCisgICAgaWYgKG9iamVjdHAodz1RdWVyeVByb3AoUF9XSUVMREVEKSkpCisgICAgICAgIHctPlF1ZXJ5UHJvcChQX1RPVEFMX0FDKTsKKyAgICAKKyAgICAvLyBSdWVja2dhYmV3ZXJ0OiBEdXJjaGdlZnVlaHJ0ZSBBZW5kZXJ1bmcgYW4gUF9EQU1BR0UKKyAgICByZXR1cm4gbmV3X2RhbTsKK30KKworLy8gV2lyZCBkaWUgV2FmZmUgZWluZXIgQmVsYXN0dW5nIGF1c2dlc2V0enQgKHouQi4gd2VubiBtYW4gZGFtaXQKKy8vIHp1c2NobGFlZ3QpLCBkYW5uIHdpcmQgVGFrZUZsYXcoKSBhdWZnZXJ1ZmVuLgordmFyYXJncyB2b2lkIFRha2VGbGF3KG9iamVjdCBlbmVteSkKK3sgICBpbnQgYzsKKworICAgIC8vIEZsYXctV2VydCBlcmhvZWhlbgorICAgIGZsYXcrKzsKKworICAgIC8vIElzdCBkZXIgV2FmZmUgZWluZSBRdWFsaXRhZXQgZ2VzZXR6dCB3b3JkZW4sIHNvIGthbm4gZXMgenUgZWluZXIKKyAgICAvLyBhbGxtYWVobGljaGVuIEJlc2NoYWVkaWd1bmcgZGVyIFdhZmZlIGtvbW1lbgorICAgIGlmICgoYz1RdWVyeVByb3AoUF9RVUFMSVRZKSkgJiYgIShmbGF3JWMpKQorICAgICAgICBEYW1hZ2UoMSk7CisKKyAgICAvLyBaZWl0cHVua3QgZGVzIGVyc3RlbiBBdWZydWZlcyBmZXN0aGFsdGVuCisgICAgaWYgKCFmdGltZSkKKyAgICAgICAgZnRpbWU9dGltZSgpOworfQorCisvLyBEaWUgRmxhdy1EYXRlbiBrb2VubmVuIG5hdHVlcmxpY2ggYXVjaCBhYmdlcnVmZW4gd2VyZGVuCittaXhlZCAqUXVlcnlGbGF3KCkKK3sKKyAgICByZXR1cm4oe2ZsYXcsZnRpbWUsZHRpbWUoZnRpbWUpfSk7Cit9CisKZGlmZiAtLWdpdCBhL3N0ZC93ZWFwb24vZGVzY3JpcHRpb24uYyBiL3N0ZC93ZWFwb24vZGVzY3JpcHRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWQyOTM4Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkL3dlYXBvbi9kZXNjcmlwdGlvbi5jCkBAIC0wLDAgKzEsMTA4IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gd2VhcG9uL2Rlc2NyaXB0aW9uLmMgLS0gd2VhcG9uIGRlc2NyaXB0aW9uIGhhbmRsaW5nCisvLworLy8gJElkOiBkZXNjcmlwdGlvbi5jIDY0NzUgMjAwNy0wOS0xOSAyMDo1Njo0MFogWmVzc3RyYSAkCisKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKworLy8jZGVmaW5lIE5FRURfUFJPVE9UWVBFUworCisjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHRoaW5nL2Rlc2NyaXB0aW9uLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGNvbWJhdC5oPgorI2luY2x1ZGUgPHRoaW5nL21hdGVyaWFsLmg+CisKK2luaGVyaXQgIi9zdGQvdGhpbmcvZGVzY3JpcHRpb24iOworCit2b2lkIGNyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9EQU1fREVTQyxERkxUX0RBTV9ERVNDKTsKK30KKworc3RyaW5nIGRhbV9kZXNjcigpCit7ICAgc3RyaW5nIHJlOworICAgIG1peGVkIGRlc2M7CisgICAgaW50IG1heCxkYW0scG9zOworCisgICAgaWYgKCFRdWVyeVByb3AoUF9OQU1FKSB8fCAhUXVlcnlQcm9wKFBfREFNQUdFRCkgfHwgIVF1ZXJ5UHJvcChQX1NIT1JUKSB8fAorICAgICAgICAhKGRlc2M9UXVlcnlQcm9wKFBfREFNX0RFU0MpKSB8fCAoIXN0cmluZ3AoZGVzYykgJiYgIXBvaW50ZXJwKGRlc2MpKSkKKyAgICAgICAgcmV0dXJuICIiOworICAgIHJlID0gY2FwaXRhbGl6ZShuYW1lKFdFUiwyKSkrIiAiOworICAgIG1heCA9IFF1ZXJ5UHJvcChQX1dDKSsoZGFtPVF1ZXJ5UHJvcChQX0RBTUFHRUQpKTsKKyAgICAvLyBCZWkgcmVpbmVuIFBhcmllcndhZmZlbiBkZW4gQUMgYWxzIG1heCBuZWhtZW4hCisgICAgaWYgKFF1ZXJ5UHJvcChQX1BBUlJZKT09UEFSUllfT05MWSkKKyAgICB7CisJICAgIG1heD1RdWVyeVByb3AoUF9BQykrZGFtOworICAgIH0KKyAgICBpZiAoc3RyaW5ncChkZXNjKSkKKyAgICAgICAgcmV0dXJuIChkYW0+KG1heC8yKSk/KHJlK2Rlc2MrIi5cbiIpOiIiOworICAgIHBvcyA9IChzaXplb2YoZGVzYykqZGFtL21heCk7CisgICAgLy8gU29uc3Qga29lbm5lbiBQYXJpZXJ3YWZmZW4sIGRpZSBTY2hyb3R0IHNpbmQsIGJ1Z2dlbgorICAgIGlmIChwb3M9PXNpemVvZihkZXNjKSkgcG9zLS07CisgICAgaWYgKHN0cmluZ3AoZGVzY1twb3NdKSkKKyAgICAgICAgcmV0dXJuIChyZStkZXNjW3Bvc10rIi5cbiIpOworICAgIHJldHVybiAiIjsKK30KKworc3RyaW5nIHNob3J0KCkKK3sgICBzdHJpbmcgczsKKworICAgIGlmICghKHM9UXVlcnlQcm9wKFBfU0hPUlQpKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIHMgKyAoUXVlcnlQcm9wKFBfV0lFTERFRCk/IiAoZ2V6dWVja3QpLlxuIjoiLlxuIik7Cit9CisKK3ZhcmFyZ3Mgc3RyaW5nIGxvbmcoKQoreyAgIAorICAgIHJldHVybiAocHJvY2Vzc19zdHJpbmcoUXVlcnlQcm9wKFBfTE9ORyl8fCIiKSArIChkYW1fZGVzY3IoKXx8IiIpKTsKK30KKworbWl4ZWQgX3F1ZXJ5X3NpemUoKSB7CisgIG1peGVkIHJlcywgd3Q7CisgIGlmIChpbnRwKHJlcz1RdWVyeShQX1NJWkUpKSAmJiAocmVzPjApKQorICAgIHJldHVybiByZXM7CisgIHd0PVF1ZXJ5UHJvcChQX1dFQVBPTl9UWVBFKTsKKyAgc3dpdGNoICh3dCkgeworICAgIGNhc2UgV1RfU1dPUkQgIDogcmV0dXJuIDEwMDsgIC8vIGRlZmF1bHQ6IExhbmdzY2h3ZXJ0CisgICAgY2FzZSBXVF9BWEUgICAgOiByZXR1cm4gIDgwOworICAgIGNhc2UgV1RfQ0xVQiAgIDogcmV0dXJuICA4MDsKKyAgICBjYXNlIFdUX1NQRUFSICA6IHJldHVybiAxODA7CisgICAgY2FzZSBXVF9LTklGRSAgOiByZXR1cm4gIDIwOworICAgIGNhc2UgV1RfV0hJUCAgIDogcmV0dXJuIDIwMDsKKyAgICBjYXNlIFdUX1NUQUZGICA6IHJldHVybiAxNTA7CisgIH0KKyAgcmV0dXJuIDEwOyAgLy8gYWxsZXMgYW5kZXJlCit9CisKK21hcHBpbmcgX3F1ZXJ5X21hdGVyaWFsKCkgeworICBtaXhlZCByZXMsd3Q7CisKKyAgaWYgKG1hcHBpbmdwKHJlcz1RdWVyeShQX01BVEVSSUFMKSkpCisgICAgcmV0dXJuIHJlczsKKyAgd3Q9UXVlcnlQcm9wKFBfV0VBUE9OX1RZUEUpOworICBzd2l0Y2god3QpIHsKKyAgICBjYXNlIFdUX1NXT1JEOgorICAgIHJldHVybiAoW01BVF9NSVNDX01FVEFMOjEwMF0pOworICAgIGNhc2UgV1RfS05JRkU6CisgICAgcmV0dXJuIChbTUFUX01JU0NfTUVUQUw6ODAsTUFUX01JU0NfV09PRDoyMF0pOworICAgIGNhc2UgV1RfQVhFOgorICAgIHJldHVybiAoW01BVF9NSVNDX01FVEFMOjUwLE1BVF9NSVNDX1dPT0Q6NTBdKTsKKyAgICBjYXNlIFdUX1NQRUFSOgorICAgIHJldHVybiAoW01BVF9NSVNDX01FVEFMOjIwLE1BVF9NSVNDX1dPT0Q6ODBdKTsKKyAgICBjYXNlIFdUX1NUQUZGOgorICAgIGNhc2UgV1RfQ0xVQjoKKyAgICByZXR1cm4gKFtNQVRfTUlTQ19XT09EOjEwMF0pOworICB9CisgIHJldHVybiAoW01BVF9NSVNDX01FVEFMOjEwMF0pOworfQorCisvLyBQX0JBTEFOQ0VEX1dFQVBPTiB1bmQgUF9URUNITklRVUUgc2luZCBtYW5nZWxzIHVtZ2VzZXR6dGVtIEtvbnplcHQgZHVyY2gKKy8vIEVNLUJlc2NobHVzcyBmdWVyIG9ic29sZXQgZXJrbGFlcnQgd29yZGVuLiBaZXNzdHJhLiAyNi4wNi4yMDA3CisKZGlmZiAtLWdpdCBhL3N0ZC93ZWFwb24vbW92aW5nLmMgYi9zdGQvd2VhcG9uL21vdmluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlODE3NzAKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvd2VhcG9uL21vdmluZy5jCkBAIC0wLDAgKzEsMzYgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyB3ZWFwb24vbW92aW5nLmMgLS0gQmV3ZWdlbi9aZXJzdG9lcmVuIHZvbiBXYWZmZW4KKy8vCisvLyAkSWQ6IG1vdmluZy5jIDYzMTIgMjAwNy0wNS0yMCAyMjo0MDo1MVogWmVzc3RyYSAkCisKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKworaW5oZXJpdCAiL3N0ZC90aGluZy9tb3ZpbmciOworCisvLyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTIDEKKworI2luY2x1ZGUgPHRoaW5nL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bW92aW5nLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorCit2YXJhcmdzIGludCBEb1Vud2llbGQoaW50IHNpbGVudCk7CisKK3ZhcmFyZ3MgaW50IG1vdmUobWl4ZWQgZGVzdCwgaW50IG1ldGhvZCkKK3sKKyAgRG9VbndpZWxkKCBtZXRob2QgJiAoTV9TSUxFTlR8TV9OT0NIRUNLKSk7CisgIGlmICgobWV0aG9kICYgTV9OT0NIRUNLKSB8fCAoIVF1ZXJ5UHJvcChQX1dJRUxERUQpKSkKKyAgICByZXR1cm4gOjptb3ZlKGRlc3QsIG1ldGhvZCApOworfQorCit2YXJhcmdzIGludCByZW1vdmUoaW50IHNpbGVudCApCit7CisgIERvVW53aWVsZCggc2lsZW50ICk7CisgIGlmICghUXVlcnlQcm9wKFBfV0lFTERFRCkpCisgICAgcmV0dXJuIDo6cmVtb3ZlKCBzaWxlbnQgKTsKK30KZGlmZiAtLWdpdCBhL3N5cy9hbnNpLmggYi9zeXMvYW5zaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNGQyNDQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvYW5zaS5oCkBAIC0wLDAgKzEsMzUgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBhbnNpLmggLS0gU2VxdWVuemVuIGZ1ZXIgQU5TSS0gdW5kIFZUMTAwLVRlcm1pbmFscworLy8KKy8vICRJZDogYW5zaS5oLHYgMy4zIDIwMDAvMDIvMTIgMTY6MTg6NDIgUGFkcmVpYyBFeHAgJAorCisjaWZuZGVmIF9BTlNJXworI2RlZmluZSBfQU5TSV8KKworI2RlZmluZSBBTlNJX0JPTEQgIhtbMW0iCisjZGVmaW5lIEFOU0lfVU5ERVJMICIbWzRtIgorI2RlZmluZSBBTlNJX0JMSU5LICIbWzVtIgorI2RlZmluZSBBTlNJX0lOVkVSUyAiG1s3bSIKKworI2RlZmluZSBBTlNJX0JMQUNLICIbWzMwbSIKKyNkZWZpbmUgQU5TSV9SRUQgIhtbMzFtIgorI2RlZmluZSBBTlNJX0dSRUVOICIbWzMybSIKKyNkZWZpbmUgQU5TSV9ZRUxMT1cgIhtbMzNtIgorI2RlZmluZSBBTlNJX0JMVUUgIhtbMzRtIgorI2RlZmluZSBBTlNJX1BVUlBMRSAiG1szNW0iCisjZGVmaW5lIEFOU0lfQ1lBTiAiG1szNm0iCisjZGVmaW5lIEFOU0lfV0hJVEUgIhtbMzdtIgorCisjZGVmaW5lIEFOU0lfQkdfQkxBQ0sgIhtbNDBtIgorI2RlZmluZSBBTlNJX0JHX1JFRCAiG1s0MW0iCisjZGVmaW5lIEFOU0lfQkdfR1JFRU4gIhtbNDJtIgorI2RlZmluZSBBTlNJX0JHX1lFTExPVyAiG1s0M20iCisjZGVmaW5lIEFOU0lfQkdfQkxVRSAiG1s0NG0iCisjZGVmaW5lIEFOU0lfQkdfUFVSUExFICIbWzQ1bSIKKyNkZWZpbmUgQU5TSV9CR19DWUFOICIbWzQ2bSIKKyNkZWZpbmUgQU5TSV9CR19XSElURSAiG1s0N20iCisKKyNkZWZpbmUgQU5TSV9OT1JNQUwgIhtbMG0iCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzL2FybW91ci5oIGIvc3lzL2FybW91ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzM2U0M2UKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvYXJtb3VyLmgKQEAgLTAsMCArMSw0MSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGFybW91ci5oIC0tIGFybW91ciBoZWFkZXIKKy8vCisvLyAkSWQ6IGFybW91ci5oIDkwOTIgMjAxNS0wMS0xOSAyMzo1Nzo1MFogWmVzc3RyYSAkCisgCisjaWZuZGVmIF9fQVJNT1VSX0hfXworI2RlZmluZSBfX0FSTU9VUl9IX18KKworI2luY2x1ZGUgPGNsb3RoaW5nLmg+CisjaW5jbHVkZSA8Y29tYmF0Lmg+CisKKy8vIHByb3BlcnRpZXMKKyNpZm5kZWYgUF9OUl9IQU5EUworI2RlZmluZSBQX05SX0hBTkRTICAgICAgIm5yX2hhbmRzIiAgICAgLy8gYmVub2V0aWd0ZSBIYWVuZGUgenVtIHRyYWdlbiAoU2NoaWxkKQorI2VuZGlmCisKKyNkZWZpbmUgUF9BQyAgICAgICAgICAgICJhYyIgICAgICAgICAgIC8vIFJ1ZXN0dW5nc2tsYXNzZSAoYXJtb3VyIGNsYXNzKQorCisjZGVmaW5lIFBfQVJNT1VSX1RZUEUgICAiYXJtb3VyX3R5cGUiICAvLyBBcnQgZGVyIFJ1ZXN0dW5nIChIZWxtLCBSaW5nIHVzdy4pCisKKyNkZWZpbmUgUF9ERUZFTkRfRlVOQyAgICJkZWZlbmRfZnVuYyIgIC8vIE9iamVrdCBkYXMgZWluZSBEZWZlbmRGdW5jIGRlZmluaWVydAorCisjZW5kaWYgLy8gX19BUk1PVVJfSF9fCisKKyNpZmRlZiBORUVEX1BST1RPVFlQRVMKKworI2lmbmRlZiBfX0FSTU9VUl9IX1BST1RPX18KKyNkZWZpbmUgX19BUk1PVVJfSF9QUk9UT19fCisKKy8vIHByb3RvdHlwZXMKK2ludCBRdWVyeURlZmVuZCAoc3RyaW5nfHN0cmluZyogZGFtX3R5cGUsIGludHxtYXBwaW5nIHNwZWxsLCBvYmplY3QgZW5lbXkpOworCisvLyBUTyBCRSBSRU1PVkVECisKK3ZvaWQgU2V0RGVmZW5kRnVuYyhvYmplY3Qgb2IpOworb2JqZWN0IFF1ZXJ5RGVmZW5kRnVuYygpOworCisjZW5kaWYgLy8gX19BUk1PVVJfSF9QUk9UT19fCisKKyNlbmRpZgkvLyBORUVEX1BST1RPWVBFUwpkaWZmIC0tZ2l0IGEvc3lzL2F0dHJpYnV0ZXMuaCBiL3N5cy9hdHRyaWJ1dGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAwYjNkYwotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9hdHRyaWJ1dGVzLmgKQEAgLTAsMCArMSwxMiBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGF0dHJpYnV0ZXMuaCAtLSBsaXZpbmcgYXR0cmlidXRlcworLy8KKy8vICRJZDogYXR0cmlidXRlcy5oLHYgMy4xIDE5OTcvMDIvMTIgMTM6MDQ6NTkgV2FyZ29uIEV4cCAkCisKKyNpZm5kZWYgX19BVFRSSUJVVEVTX0hfXworI2RlZmluZSBfX0FUVFJJQlVURVNfSF9fCisKKyNpbmNsdWRlICIvc3lzL2xpdmluZy9hdHRyaWJ1dGVzLmgiCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzL2JhbmsuaCBiL3N5cy9iYW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM2MzA2ZQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9iYW5rLmgKQEAgLTAsMCArMSwzNiBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGJhbmsuaCAtLSBEZWZpbml0aW9uZW4gZnVlciBkaWUgWmVudHJhbGJhbmsgYnp3LiBMYWVkZW4KKy8vCisvLyAkSWQ6IGJhbmsuaCA2NzQ5IDIwMDgtMDMtMTIgMTk6NDU6MjdaIFplc3N0cmEgJAorCisjaWZuZGVmIF9fQkFOS19IX18KKyNkZWZpbmUgX19CQU5LX0hfXworCisjZGVmaW5lIFpFTlRSQUxCQU5LICIvcC9kYWVtb24vemVudHJhbGJhbmsiCisKKy8vIERpZXNlIFByb3BlcnRpZXMgbGFzc2VuIHNpY2ggbnVyIGFiZnJhZ2VuIQorI2RlZmluZSBQX1NIT1BfUEVSQ0VOVF9MRUZUICJzaG9wX3BlcmNlbnRfbGVmdCIgICAgLy8gQWt0dWVsbGUgUHJvemVudGUgaW4KKyNkZWZpbmUgUF9TVE9SRV9QRVJDRU5UX0xFRlQgInN0b3JlX3BlcmNlbnRfbGVmdCIgIC8vIExhZGVuIHVuZCBTcGVpY2hlcgorI2RlZmluZSBQX0NVUlJFTlRfTU9ORVkgImN1cnJlbnRfbW9uZXkiICAgICAgIC8vIFZlcm1vZWdlbiBkZXMgTGFkZW5zCisKKyNkZWZpbmUgUF9TVE9SRV9DT05TVU1FICAic3RvcmVfY29uc3VtZSIgICAgLyogZGVmYXVsdCAyMCUsIGltbWVyIG1pbmQuIDElICovCisjZGVmaW5lIFBfTUlOX1NUT0NLICAgICAgIm1pbl9zdG9jayIgICAgLyogbWluZGVzdCBWb3JyYXQgYW4gR2VnZW5zdGFlbmRlbiAqLworCisjZW5kaWYgLy8gX19CQU5LX0hfXworCisvLyBLb25zdGFudGVuIGZ1ZXIgZGllIEltcGxlbWVudGF0aW9uCisjaWZkZWYgTkVFRF9QUk9UT1RZUEVTCisjaWZuZGVmIF9fQkFOS19IX1BST1RPVFlQRVNfXworI2RlZmluZSBfX0JBTktfSF9QUk9UT1RZUEVTX18KKworI2RlZmluZSBCQU5LX0RFRkFVTFRfUEVSQ0VOVCAyMCAvLyBTbyB2aWVsZSAlIGRlciBFaW56YWhsdW5nIGdlaGVuIGF1ZnMgS29udG8KKyNkZWZpbmUgU0hPUF9QRVJDRU5UX0xFRlQgMzAgLy8gU28gdmllbGUgJSBrcmllZ3QgZGVyIExhZGVuIGZ1ZXIgT2JqZWt0ZQorCQkJICAgICAvLyBndXRnZXNjaHJpZWJlbiwgZGllIGVyIHplcnN0b2VydAorCisjZGVmaW5lIFNUT1JFX1BFUkNFTlRfTEVGVCAyNSAvLyBEaXRvIGZ1ZXIgZGVuIFN0b3JlCisKKyNlbmRpZiAvLyBfX0JBTktfSF9QUk9UT1RZUEVTX18KKworI2VuZGlmIC8vIE5FRURfUFJPVE9UWVBFUworCmRpZmYgLS1naXQgYS9zeXMvYnJlYWtfc3RyaW5nLmggYi9zeXMvYnJlYWtfc3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY0ZjIxYQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9icmVha19zdHJpbmcuaApAQCAtMCwwICsxLDIxIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gYnJlYWtfc3RyaW5nLmggLSBzeW0uIEtvbnN0YW50ZW4gZnVlciBicmVha19zdHJpbmcoKQorLy8KKy8vICRJZDogZGVmaW5lcy5oIDY0MTUgMjAwNy0wOC0xMCAxOToyNDowNFogWmVzc3RyYSAkCisKKyNpZm5kZWYgX0JSRUFLX1NUUklOR19IXworI2RlZmluZSBfQlJFQUtfU1RSSU5HX0hfCisKKyNkZWZpbmUgQlNfTEVBVkVfTVlfTEZTIAkxCisjZGVmaW5lIEJTX1NJTkdMRV9TUEFDRSAgICAgICAgIDIKKyNkZWZpbmUgQlNfQkxPQ0sJCTQKKyNkZWZpbmUgQlNfTk9fUEFSSU5ERU5UCQk4CisjZGVmaW5lIEJTX0lOREVOVF9PTkNFICAgICAgICAgMTYKKyNkZWZpbmUgQlNfUFJFUEVORF9JTkRFTlQgICAgICAzMgorLy8gRmFsbHMgaGllciBGbGFncyBlcmdhZW56dCB3ZXJkZW4sIHNvbGx0ZW4gc2llIGF1Y2ggaW4gbGl2aW5nL2NvbW0uaCBmdWVyCisvLyBSZWNlaXZlTXNnKCkgZWluZ2V0cmFnZW4gd2VyZGVuLiBSZWNlaXZlTXNnKCkga2FubiBwZXIgc2UgYXVjaCBudXIgMTAKKy8vIEJTLUZsYWdzIHZlcmFyYmVpdGVuLCBkYXMgc29sbHRlIGJlaW0gRXJnYWVuemVuIGJlYWNodGV0IHdlcmRlbi4KKworI2VuZGlmIC8qIF9CUkVBS19TVFJJTkdfSF8gKi8KKwpkaWZmIC0tZ2l0IGEvc3lzL2NsYXNzLmggYi9zeXMvY2xhc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGZjMzg5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL2NsYXNzLmgKQEAgLTAsMCArMSw4OSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGNsYXNzLmggLS0gRGVmaW5pdGlvbmVuIGZ1ZXIgS2xhc3NlbiB2b24gT2JqZWt0ZW4gdW5kIExlYmV3ZXNlbi4KKy8vICAgICAgICAgICAgU2llaGUgQWRkQ2xhc3MoKS9pc19jbGFzc19tZW1iZXIoKSBpbiAvc3RkL3RoaW5nL2Rlc2NyaXB0aW9uLmMKKy8vCisvLyAkSWQ6IGNsYXNzLmggOTU1MiAyMDE2LTA0LTI0IDA5OjUzOjEzWiBBcmF0aG9ybiAkCisKKyNpZm5kZWYgX19DTEFTU19IX18KKyNkZWZpbmUgX19DTEFTU19IX18KKworI2RlZmluZSBDTEFTU0RCICIvcC9kYWVtb24vY2xhc3NkYiIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gS2xhc3NlbiBmdWVyICJMZWJld2VzZW4iIC0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgQ0xfQU5JTUFMICJ0aWVyIgorI2RlZmluZSBDTF9BUkFDSE5JRCAic3Bpbm5lIiAgLy8gdW5kIFNwaW5uZW5hcnRpZ2UKKyNkZWZpbmUgQ0xfQklSRCAidm9nZWwiCisjZGVmaW5lIENMX0RBUktFTEYgImR1bmtlbGVsZiIKKyNkZWZpbmUgQ0xfREVNT04gImRhZW1vbiIKKyNkZWZpbmUgQ0xfRFJBR09OICJkcmFjaGUiCisjZGVmaW5lIENMX0RXQVJGICJ6d2VyZyIKKyNkZWZpbmUgQ0xfRUxGICJlbGYiCisjZGVmaW5lIENMX0VMRU1FTlRBTCAiZWxlbWVudGFyd2VzZW4iCisjZGVmaW5lIENMX0ZFTElORSAiZmVsaW5lIgorI2RlZmluZSBDTF9GSVNIICJmaXNjaCIKKyNkZWZpbmUgQ0xfRlJPRyAiZnJvc2NoIgorI2RlZmluZSBDTF9GVVJJRSAiZnVyaWUiCisjZGVmaW5lIENMX0hBUlBZICJoYXJweWllIgorI2RlZmluZSBDTF9HSE9TVCAiZ2Vpc3QiCisjZGVmaW5lIENMX0dIT1VMICAiZ2hvdWwiCisjZGVmaW5lIENMX0dJQU5UICJyaWVzZSIKKyNkZWZpbmUgQ0xfR05PTUUgImdub20iCisjZGVmaW5lIENMX0dPQkxJTiAiZ29ibGluIgorI2RlZmluZSBDTF9IT0JCSVQgImhvYmJpdCIKKyNkZWZpbmUgQ0xfSE9CR09CTElOICJob2Jnb2JsaW4iCisjZGVmaW5lIENMX0hVTUFOICJtZW5zY2giCisjZGVmaW5lIENMX0lMTFVTSU9OICJpbGx1c2lvbiIgLy8gQnNwLiBiZXNjaHdvcmVuZSBJbGx1c2lvbmVuCisjZGVmaW5lIENMX0lOU0VDVCAiaW5zZWt0IgorI2RlZmluZSBDTF9MSVZJTkcgImxlYmV3ZXNlbiIKKyNkZWZpbmUgQ0xfTUFNTUFMICJzYWV1Z2V0aWVyIgorI2RlZmluZSBDTF9NQU1NQUxfTEFORCAibGFuZHNhZXVnZXIiCisjZGVmaW5lIENMX01BTU1BTF9XQVRFUiAid2Fzc2Vyc2FldWdlciIgLy8gRGFtaXQgbWFuIERlbHBoaW5lbiBuaWNodCBkYXMgSGFhciB3dXNjaGVsdAorI2RlZmluZSBDTF9PUkMgIm9yayIKKyNkZWZpbmUgQ0xfUExBTlQgInBmbGFuemUiCisjZGVmaW5lIENMX1JFUFRJTEUgInJlcHRpbCIKKyNkZWZpbmUgQ0xfU0hBRE9XICJzY2hhdHRlbndlc2VuIgorI2RlZmluZSBDTF9TS0VMRVRPTiAic2tlbGV0dCIKKyNkZWZpbmUgQ0xfU0xJTUUgInNjaGxlaW13ZXNlbiIgLy8gRnVlciBFaW56ZWxsZXIgdW5kIGFlaG5saWNoZXMKKyNkZWZpbmUgQ0xfU05BS0UgInNjaGxhbmdlIgorI2RlZmluZSBDTF9UUk9MTCAidHJvbGwiCisjZGVmaW5lIENMX1VOREVBRCAidW50b3RlciIKKyNkZWZpbmUgQ0xfVkFNUElSRSAiX2NsX3ZhbXBpciIKKyNkZWZpbmUgQ0xfWk9NQklFICJ6b21iaWUiCisjZGVmaW5lIENMX1NIQVBFQ0hBTkdFUiAiZ2VzdGFsdHdhbmRsZXIiIC8vIEJzcC4gV2Vyd29lbGZlIGV0Yy4KKyNkZWZpbmUgQ0xfR09MRU0gImdvbGVtIgorI2RlZmluZSBDTF9DT05TVFJVQ1QgImtvbnN0cnVrdCIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tIEtsYXNzZW4gbmFjaCBCZXdlZ3VuZ3NtZXRob2RlbiAtLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIENMX1dBTEtJTkcgICJnZWhlbmQiCisjZGVmaW5lIENMX0NSQVdMSU5HICJrcmllY2hlbmQiCisjZGVmaW5lIENMX1NXSU1NSU5HICJzY2h3aW1tZW5kIgorI2RlZmluZSBDTF9GTFlJTkcgICAiZmxpZWdlbmQiCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tIEtsYXNzZW4gZnVlciBHZWdlbnN0YWVuZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBDTF9FWFBMT1NJVkUgInNwcmVuZ3N0b2ZmIgorI2RlZmluZSBDTF9ESVNFQVNFICJrcmFua2hlaXQiCisjZGVmaW5lIENMX0NVUlNFICJmbHVjaCIKKyNkZWZpbmUgQ0xfSU5PUkdBTklDICJhbm9yZ2FuaXNjaCIKKyNkZWZpbmUgQ0xfUE9JU09OICJnaWZ0IgorI2RlZmluZSBDTF9QT0lTT05PVVMgImdpZnRpZ2VzIgorI2RlZmluZSBDTF9BTU1VTklUSU9OICJtdW5pdGlvbiIKKy8vIEVzIGthbm4gYXVjaCBmdWVyIEdlZ2Vuc3RhZW5kZSBDTF9JTExVU0lPTiB2ZXJ3ZW5kZXQgd2VyZGVuLgorCisjZGVmaW5lIENMX0FMTCAoe0NMX0FOSU1BTCwgQ0xfQVJBQ0hOSUQsIENMX0JJUkQsIENMX0RFTU9OLCBDTF9EUkFHT04sIFwKKyAgICAgICAgICAgICAgICBDTF9EV0FSRiwgQ0xfRUxGLCBDTF9FTEVNRU5UQUwsIENMX0ZFTElORSwgQ0xfRklTSCwgQ0xfRlJPRywgXAorICAgICAgICAgICAgICAgIENMX0ZVUklFLCBDTF9IQVJQWSwgQ0xfVkFNUElSRSxcCisgICAgICAgICAgICAgICAgQ0xfR0hPU1QsIENMX0dIT1VMLCBDTF9HSUFOVCwgQ0xfR05PTUUsIENMX0dPQkxJTiwgQ0xfSE9CQklULCBcCisgICAgICAgICAgICAgICAgQ0xfSE9CR09CTElOLCBDTF9IVU1BTiwgQ0xfSU5PUkdBTklDLCBDTF9JTlNFQ1QsIENMX0xJVklORywgXAorICAgICAgICAgICAgICAgIENMX01BTU1BTCwgQ0xfTUFNTUFMX0xBTkQsIENMX01BTU1BTF9XQVRFUiwgQ0xfT1JDLCBDTF9QTEFOVCwgXAorICAgICAgICAgICAgICAgIENMX1JFUFRJTEUsIENMX1NIQURPVywgQ0xfU0tFTEVUT04sIENMX1NMSU1FLCBDTF9TTkFLRSwgXAorICAgICAgICAgICAgICAgIENMX1RST0xMLCBDTF9VTkRFQUQsIENMX1pPTUJJRSwgQ0xfU0hBUEVDSEFOR0VSLCBDTF9XQUxLSU5HLCBcCisgICAgICAgICAgICAgICAgQ0xfQ1JBV0xJTkcsIENMX1NXSU1NSU5HLCBDTF9GTFlJTkcsIENMX0VYUExPU0lWRSwgXAorICAgICAgICAgICAgICAgIENMX0RJU0VBU0UsIENMX0NVUlNFLCBDTF9QT0lTT04sIENMX1BPSVNPTk9VUywgXAorICAgICAgICAgICAgICAgIENMX0FNTVVOSVRJT04sIENMX0lMTFVTSU9OLCBDTF9HT0xFTSwgQ0xfQ09OU1RSVUNUIH0pCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9zeXMvY2xvdGhpbmcuaCBiL3N5cy9jbG90aGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNjE4NDEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvY2xvdGhpbmcuaApAQCAtMCwwICsxLDQ5IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gY2xvdGhpbmcuaCAtLSBjbG90aGluZyBoZWFkZXIKKy8vCisvLyAkSWQ6IGNsb3RoaW5nLmggNjA2NSAyMDA2LTA5LTI5IDIzOjIyOjUyWiBaZXNzdHJhICQKKyAKKyNpZm5kZWYgX19DTE9USElOR19IX18KKyNkZWZpbmUgX19DTE9USElOR19IX18KKworLy8gcHJvcGVydGllcworI2RlZmluZSBQX1dPUk4gICAgICAgICAgIndvcm4iICAgICAgICAgLy8gT2JqZWt0IG1pdCBkZW0gVHJhZWdlciBkZXIgUnVlc3R1bmcKKworI2RlZmluZSBQX1dFQVJfRlVOQyAgICAgIndlYXJfZnVuYyIgICAgLy8gT2JqZWt0IGRhcyBlaW5lIFdlYXJGdW5jIGRlZmluaWVydAorI2RlZmluZSBQX1JFTU9WRV9GVU5DICAgInJlbW92ZV9mdW5jIiAgLy8gT2JqZWt0IGRhcyBlaW5lIFJlbW92ZUZ1bmMgZGVmaW5pZXJ0CisKKyNkZWZpbmUgUF9XRUFSX01TRyAgICAgICJ3ZWFyX21zZyIgICAgIC8vIE1lbGR1bmdlbiBiZWltIEFuemllaGVuCisjZGVmaW5lIFBfVU5XRUFSX01TRyAgICAidW53ZWFyX21zZyIgICAvLyBNZWxkdW5nZW4gYmVpbSBBdXN6aWVoZW4KKworI2RlZmluZSBQX0xBU1RfV0VBUl9BQ1RJT04gImxhc3Rfd2Vhcl9hY3Rpb24iIC8vIExldHp0ZSBBa3Rpb24gZGVzIFNwaWVsZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQW4tIHVuZCBhdXN6aWVoZW4gYmV0cmVmZgorCisvLyBEaWUgV2Vhci1BY3Rpb25zIGltIGVpbnplbG5lbgorCisjZGVmaW5lIFdBX1dFQVIgICAgICAgICAgICAwCisjZGVmaW5lIFdBX1VOV0VBUiAgICAgICAgICAxCisKKyNlbmRpZiAvLyBfX0NMT1RISU5HX0hfXworCisjaWZkZWYgTkVFRF9QUk9UT1RZUEVTCisKKyNpZm5kZWYgX19DTE9USElOR19IX1BST1RPX18KKyNkZWZpbmUgX19DTE9USElOR19IX1BST1RPX18KKworLy8gcHJvdG90eXBlcworLy8gZnVuY3Rpb25zIHRoYXQgd2lsbCBiZSBjYWxsZWQgaWYgb25lIGlzc3VlcyBhIHdlYXIgY29tbWFuZCAob3IgdG8gbWFudWFsbHkKKy8vIHdlYXIgdGhpcyBhcm1vdXIKK3ZhcmFyZ3MgaW50IGRvX3dlYXIoc3RyaW5nIHN0ciwgaW50IHNpbGVudCk7CisKKy8vIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgaWYgb25lIGlzc3VlcyBhbiB1bndlYXIgY29tbWFuZCBvciB0byBtYW51YWxseQorLy8gdW53ZWFyIHRoZSBhcm1vdXIKK3ZhcmFyZ3MgaW50IGRvX3Vud2VhcihzdHJpbmcgc3RyLCBpbnQgc2lsZW50KTsKKy8vIGZ1bmN0aW9uIGlzIHRoZSByZXN0IG9mIGRvX3Vud2VhcigpIC0tIG1zZ3MgZXRjCit2YXJhcmdzIGludCBEb1Vud2VhcihpbnQgc2lsZW50LCBpbnQgYWxsKTsKKworaW50IHppZWhlKHN0cmluZyBzdHIpOworCisjZW5kaWYgLy8gX19DTE9USElOR19IX1BST1RPX18KKworI2VuZGlmCS8vIE5FRURfUFJPVE9ZUEVTCmRpZmYgLS1naXQgYS9zeXMvY29tYmF0LmggYi9zeXMvY29tYmF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAwY2JkMwotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9jb21iYXQuaApAQCAtMCwwICsxLDM2MCBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGNvbWJhdC5oIC0tIFNjaGFkZW5zdHlwZW4sIFdhZmZlbi0gdW5kIFJ1ZXN0dW5nc2tsYXNzZW4gdW5kIGVpbgorLy8gICAgICAgICAgICAgcGFhciBQcm9wZXJ0aWVzIGZ1ZXIgZGFzIEthbXBmc3lzdGVtCisvLworLy8gJElkOiBjb21iYXQuaCA3MTc4IDIwMDktMDMtMDkgMjA6NDI6NDlaIFplc3N0cmEgJAorCisjaWZuZGVmIF9DT01CQVRfSF8KKyNkZWZpbmUgX0NPTUJBVF9IXworCisjaW5jbHVkZSA8d2VhcG9uLmg+CisjaW5jbHVkZSA8YXJtb3VyLmg+CisjaW5jbHVkZSA8cmFuZ2VkX3dlYXBvbi5oPgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIC0tLS0tLS0tLS0gS2FtcGYgYWxsZ2VtZWluIC0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBQX0VOQUJMRV9JTl9BVFRBQ0tfT1VUICJlbmFibGVfaW5fYXR0YWNrX291dCIKKyNkZWZpbmUgUF9OT19HTE9CQUxfQVRUQUNLICAgICAibm9fZ2xvYmFsX2F0dGFjayIKKyNkZWZpbmUgUF9GUklFTkQgICAgICAgICAgICAgICAiZnJpZW5kIgorI2RlZmluZSBQX0xBU1RfQ09NQkFUX1RJTUUgICAgICJsYXN0X2NvbWJhdF90aW1lIgorCisvKiAtLS0tLS0tLS0tIEJlZnJpZWRlbiAtLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgUF9BQ0NFUFRfUEVBQ0UgICAgICAgICAiYWNjZXB0X3BlYWNlIgorCisvKiAtLS0tLS0tLS0tIFdhZmZlbiB1bmQgUnVlc3R1bmdlbiAtLS0tLS0tLS0tICovCisKKyNkZWZpbmUgUF9MQVNUX1VTRSAgICAgICAgICAgICAibGFzdF9vYmplY3RfdXNlIgorI2RlZmluZSBQX0RBTUFHRUQgICAgICAgICAgICAgICJpdGVtX2RhbWFnZWQiCisjZGVmaW5lIFBfRUZGRUNUSVZFX1dDICAgICAgICAgImVmZmVjdGl2ZV93YyIKKyNkZWZpbmUgUF9FRkZFQ1RJVkVfQUMgICAgICAgICAiZWZmZWN0aXZlX2FjIgorI2RlZmluZSBQX1FVQUxJVFkgICAgICAgICAgICAgICJxdWFsaXR5IgorI2RlZmluZSBQX1JFU1RSSUNUSU9OUyAgICAgICAgICJyZXN0cmljdGlvbnMiCisjZGVmaW5lIFBfRVFVSVBfVElNRSAgICAgICAgICAgImVxdWlwX3RpbWUiCisKKy8qIC0tLS0tLS0tLS0gQXJ0aWxsZXJpZSAtLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIFBfSVNfQVJUSUxMRVJZICAgICAgICAgImFydGlsbGVyeSIKKworLyogLS0tLS0tLS0tLSBGZXJua2FtcGZ3YWZmZW4gLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFBfU0hPT1RJTkdfV0MgICAgICAgICAgInNob290aW5nX3djIgorI2RlZmluZSBQX0FNTVVOSVRJT04gICAgICAgICAgICJtdW5pdGlvbiIKKyNkZWZpbmUgUF9TVFJFVENIX1RJTUUgICAgICAgICAic3RyZXRjaF90aW1lIgorI2RlZmluZSBQX1JBTkdFICAgICAgICAgICAgICAgICJyYW5nZSIKKyNkZWZpbmUgUF9TSE9PVElOR19BUkVBICAgICAgICAic2hvb3RpbmdfYXJlYSIKKyNkZWZpbmUgUF9UQVJHRVRfQVJFQSAgICAgICAgICAidGFyZ2V0X2FyZWEiCisKKy8qIC0tLS0tIERlZmluZXMgZnVlciBBcnJheS1Qb3NpdGlvbmVuIC0tLS0tICovCisKKyNkZWZpbmUgUldfU0laRSAgIDUKKyNkZWZpbmUgUldfRU5FTVkgIDAKKyNkZWZpbmUgUldfQU1NVSAgIDEKKyNkZWZpbmUgUldfV1JJVEUgIDIKKyNkZWZpbmUgUldfVklDVElNIDMKKyNkZWZpbmUgUldfU0FZICAgIDQKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2FmZmVudHlwZW4gLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBXVF9BTU1VICAgICAgICAgICJhbW11bml0aW9uIgorI2RlZmluZSBXVF9BWEUgICAgICAgICAgICJheGUiCisjZGVmaW5lIFdUX0NMVUIgICAgICAgICAgImNsdWIiCisjZGVmaW5lIFdUX0hBTkRTICAgICAgICAgImhhbmRzIgorI2RlZmluZSBXVF9LTklGRSAgICAgICAgICJrbmlmZSIKKyNkZWZpbmUgV1RfTUFHSUMgICAgICAgICAibWFnaWMiCisjZGVmaW5lIFdUX1JBTkdFRF9XRUFQT04gImZlcm53YWZmZSIKKyNkZWZpbmUgV1RfU1BFQVIgICAgICAgICAic3BlYXIiCisjZGVmaW5lIFdUX1NUQUZGICAgICAgICAgInN0YWZmIgorI2RlZmluZSBXVF9TV09SRCAgICAgICAgICJzd29yZCIKKyNkZWZpbmUgV1RfV0hJUCAgICAgICAgICAid2hpcCIKKworLy8gRnVlciBhbGxlcywgd2FzIHNpY2ggdW50ZXIgZGVuIG8uZy4gVHlwZW4gbmljaHQgZWlub3JkbmVuIGxhZXNzdAorI2RlZmluZSBXVF9NSVNDICAgICAgICAgICJtaXNjIgorCisvKiAtLS0tLS0tLS0tIExpc3RlIGFsbGVyIGVybGF1YnRlbiBXYWZmZW50eXBlbiAtLS0tLS0tLS0tICovCisKKyNkZWZpbmUgVkFMSURfV0VBUE9OX1RZUEUodCkgKG1lbWJlcigoe1wKKyAgICBXVF9TV09SRCwgV1RfQVhFLCAgV1RfQ0xVQiwgV1RfU1BFQVIsIFdUX0tOSUZFLCBXVF9BTU1VLCBXVF9NQUdJQyxcCisgICAgV1RfU1RBRkYsIFdUX1dISVAsICBXVF9NSVNDLCBXVF9SQU5HRURfV0VBUE9OIH0pLCB0ICkgIT0gLTEpCisKKy8qIC0tLS0tLS0tLS0gTWF4aW1hbCBlcmxhdWJ0ZSBXYWZmZW5zdGFlcmtlIC0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBNQVhfV0VBUE9OX0NMQVNTIDIwMAorCisjZGVmaW5lIE1BWF9UV09IQU5ERURfV0MgTUFYX1dFQVBPTl9DTEFTUworLyogRGllIEVpbmhhbHR1bmcgZGVyIEVpbmhhZW5kZXItR3JlbnplIHdpcmQgYmlzaGVyIG5pY2h0IGdhcmFudGllcnQgKi8KKyNkZWZpbmUgTUFYX09ORUhBTkRFRF9XQyAxNTAKKworLyogLS0tLS0tLS0tLSBNaW5kZXN0LVdhZmZlbnN0YWVya2UsIGRpZSBlaW5lIFdhZmZlCisgICAgICAgICAgICAgIGJlaSBlaW5lciBCZXNjaGFlZGlndW5nIGJlaGFlbHQgICAgICAgLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIE1JTl9XRUFQT05fQ0xBU1MgMzAKKworLyogLS0tLS0tLS0tLSBNYXhpbWFsIGVybGF1YnRlIFBhcmllcndhZmZlbnN0YWVya2UgLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIE1BWF9QQVJSWV9DTEFTUyA0MAorCisvKiAtLS0tLS0tLS0tIEF1Y2ggZnVlciBQYXJ1ZXJ3YWZmZW4gZ2lidCAKKyAgICAgICAgICAgICAgZXMgZWluZSBNaW5pbWFsc3RhZXJrZSAgICAgIC0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBNSU5fUEFSUllfQ0xBU1MgMAorCisvKiAtLS0tLS0tLS0tIERpdG8gZnVlciBSdWVzdHVuZ2VuIC0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBNSU5fQVJNT1VSX0NMQVNTIDAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gTXVuaXRpb24gZnVlciBGZXJua2FtcGZ3YWZmZW4gLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLy8gYWxzIHggYml0dGUgX2ltbWVyXyBkZW4gTmFtZW4gZGVyIE11bml0aW9uc2FydCBpbSBQbHVyYWwgYW5nZWJlbiwKKy8vIGRpZXNlcyBlcm1vZWdsaWNodCBlaW4gYXVzd2VydGVuIHZpYSBNVU5fTkFNRSgpIHouYi4gaW4gZ2lsZGVuCisKKyNkZWZpbmUgTVVOX01JU0MoeCkgIk11bml0aW9uOiIreAorCisvLyB1ZWJlciBkaWVzZXMgZGVmaW5lIHVuZCBiaXR0ZSBfbnVyXyB1ZWJlciBkaWVzZXMgZGVmaW5lIGtvZW5uZW4KKy8vIEdpbGRlbiBvZGVyIGFlaG5saWNoZXMgZGVuIE5hbWVuIGVpbmVyIE11bml0aW9uc2FydCBlcm1pdHRlbG4uIERpZXNlcworLy8gaXN0IHdpY2h0aWcgd2VubiBuYWVoZXJlIEluZm9zIHVlYmVyIGVpbmUgV2FmZmUgYXVzZ2VnZWJlbiB3ZXJkZW4gc29sbGVuLgorLy8gQnNwLiAgIkVpbiBCb2dlbiB3aWVndCAxNTAwIEdyYW1tIHVuZCBlcmxhdWJ0IGVzIERpciBQZmVpbGUgbWl0IGVpbmVyCisvLyAgICAgICAgUmVpY2h3ZWl0ZSB2b24gNTAgbSB6dSB2ZXJzY2hpZXNzZW4uIgorLy8gc3ByaW50ZigiJXMgd2llZ3QgJWQgR3JhbW0gdW5kIGVybGF1YnQgZXMgRGlyICVzIG1pdCBlaW5lciBSZWljaHdlaXRlICIKKy8vICAgICAgICArInZvbiAlZCBtIHp1IHZlcnNjaGllc3Nlbi4iLCBvYi0+TmFtZShXRVIpLCBvYi0+UXVlcnlQcm9wKFBfV0VJR0hUKSwKKy8vICAgICAgICBNVU5fTkFNRShvYi0+UXVlcnlQcm9wKFBfQU1NVU5JVElPTikpLCBvYi0+UXVlcnlQcm9wKFBfUkFOR0UpKQorCisjZGVmaW5lIE1VTl9OQU1FKHgpIHhbOS4uXQorCisjZGVmaW5lIE1VTl9BUlJPVyAgIE1VTl9NSVNDKCJQZmVpbGUiKQorI2RlZmluZSBNVU5fU1RPTkUgICBNVU5fTUlTQygiU3RlaW5lIikKKyNkZWZpbmUgTVVOX0JPTFQgICAgTVVOX01JU0MoIkJvbHplbiIpCisjZGVmaW5lIE1VTl9EQVJUICAgIE1VTl9NSVNDKCJrbGVpbmUgQmxhc3JvaHJwZmVpbGUiKQorCisvLyBGdWVyIGRpZSBoaWVyIGRlZmluaWVydGVuIE11bml0aW9uc3R5cGVuIGdpYnQgZXMgYXVjaCBlaW5lbiBTY2h1c3MtU2tpbGwKKworI2RlZmluZSBWQUxJRF9TSE9PVF9TS0lMTCAoW1wKKyAgTVVOX0FSUk9XIDogImFycm93IixcCisgIE1VTl9TVE9ORSA6ICJzdG9uZSIsXAorICBNVU5fQk9MVCAgOiAiYm9sdCIsXAorICBNVU5fREFSVCAgOiAiZGFydCIgXSkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2NoYWRlbnNhcnRlbiAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAtLS0tLS0tLS0tIHBoeXNpa2FsaXNjaCAtLS0tLS0tLS0gKi8KKworLy8gU2NobGFnc2NoYWRlbgorI2RlZmluZSBEVF9CTFVER0VPTiAiYmx1ZGdlb24iCisKKyNkZWZpbmUgRFRfRVhQTE9TSU9OICJleHBsb3Npb24iCisKKy8vIFN0aWNoc2NoYWRlbgorI2RlZmluZSBEVF9QSUVSQ0UgInBpZXJjZSIKKworLy8gcmVpc3NlbmRlciBTY2hhZGVuL0tyYWxsZW4KKyNkZWZpbmUgRFRfUklQICJyaXAiCisKKy8vIFNjaG5pdHRzY2hhZGVuCisjZGVmaW5lIERUX1NMQVNIICJzbGFzaCIKKworLy8gUXVldHNjaHVuZ3NzY2hhZGVuCisjZGVmaW5lIERUX1NRVUVFWkUgInNxdWVlemUiCisKKy8vIHBlaXRzY2hlbmRlciBTY2hhZGVuCisjZGVmaW5lIERUX1dISVAgIndoaXAiCisKKy8qIC0tLS0tLS0tLS0gTWFwcGluZyBhbGxlciBwaHlzaWthbGlzY2hlbiBTY2hhZGVuc2FydGVuIC0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBQSFlTSUNBTF9EQU1BR0VfVFlQRVMgKFtcCisgICAgRFRfQkxVREdFT04gIDogMSxcCisgICAgRFRfRVhQTE9TSU9OIDogMSxcCisgICAgRFRfUElFUkNFICAgIDogMSxcCisgICAgRFRfUklQICAgICAgIDogMSxcCisgICAgRFRfU0xBU0ggICAgIDogMSxcCisgICAgRFRfU1FVRUVaRSAgIDogMSxcCisgICAgRFRfV0hJUCAgICAgIDogMSBdKQorCisvKiAtLS0tLS0tLS0tLSBtYWdpc2NoIC0tLS0tLS0tLS0gKi8KKworLy8gU2FldXJlCisjZGVmaW5lIERUX0FDSUQgImFjaWQiCisKKy8vIEx1ZnQobWFuZ2VsKQorI2RlZmluZSBEVF9BSVIgImFpciIKKworLy8gS2FlbHRlIG9kZXIgRWlzCisjZGVmaW5lIERUX0NPTEQgImNvbGQiCisKKy8vIEZldWVyCisjZGVmaW5lIERUX0ZJUkUgImZpcmUiCisKKy8vIGhlaWxpZ2VyIFNjaGFkZW4KKyNkZWZpbmUgRFRfSE9MWSAiaG9seSIKKworLy8gQmxpdHogb2RlciBFbGVrdHJpeml0YWV0CisjZGVmaW5lIERUX0xJR0hUTklORyAibGlnaHRuaW5nIgorCisvLyAoYWxsZy4pIE1hZ2llCisjZGVmaW5lIERUX01BR0lDICJtYWdpYyIKKworLy8gR2lmdAorI2RlZmluZSBEVF9QT0lTT04gInBvaXNvbiIKKworLy8gTGFlcm0gYnp3LiBTY2hhbGwKKyNkZWZpbmUgRFRfU09VTkQgInNvdW5kIgorCisvLyBBbmdzdAorI2RlZmluZSBEVF9URVJST1IgInRlcnJvciIKKworLy8gc2F0YW5pc2NoZXIgU2NoYWRlbgorI2RlZmluZSBEVF9VTkhPTFkgInVuaG9seSIKKworLy8gV2Fzc2VyCisjZGVmaW5lIERUX1dBVEVSICJ3YXRlciIKKworLyogLS0tLS0tLS0tLSBNYXBwaW5nIGFsbGVyIG1hZ2lzY2hlbiBTY2hhZGVuc2FydGVuIC0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBNQUdJQ0FMX0RBTUFHRV9UWVBFUyAoW1wKKyAgICBEVF9BQ0lEICAgICAgOiAxLFwKKyAgICBEVF9BSVIgICAgICAgOiAxLFwKKyAgICBEVF9DT0xEICAgICAgOiAxLFwKKyAgICBEVF9GSVJFICAgICAgOiAxLFwKKyAgICBEVF9IT0xZICAgICAgOiAxLFwKKyAgICBEVF9MSUdIVE5JTkcgOiAxLFwKKyAgICBEVF9NQUdJQyAgICAgOiAxLFwKKyAgICBEVF9QT0lTT04gICAgOiAxLFwKKyAgICBEVF9TT1VORCAgICAgOiAxLFwKKyAgICBEVF9URVJST1IgICAgOiAxLFwKKyAgICBEVF9VTkhPTFkgICAgOiAxLFwKKyAgICBEVF9XQVRFUiAgICAgOiAxIF0pCisKKworLyogLS0tLS0tLS0tLSBMaXN0ZSBhbGxlciBTY2hhZGVuc2FydGVuIC0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBBTExfREFNQUdFX1RZUEVTICAgKHsgRFRfQkxVREdFT04sIERUX1NMQVNILCBEVF9QSUVSQ0UsIERUX01BR0lDLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEVF9GSVJFLCBEVF9DT0xELCBEVF9BQ0lELCBEVF9XQVRFUiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFRfTElHSFROSU5HLCBEVF9BSVIsIERUX1BPSVNPTiwgRFRfRVhQTE9TSU9OLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEVF9TUVVFRVpFLCBEVF9TT1VORCwgRFRfUklQLCBEVF9XSElQLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEVF9IT0xZLCBEVF9VTkhPTFksIERUX1RFUlJPUiB9KQorCisvKiBJc3QgeCBlaW4gZ3VlbHRpZ2VyIFNjaGFkZW5zdHlwIGRlciBNdWRsaWI/ICovCisjZGVmaW5lIFZBTElEX0RBTUFHRV9UWVBFKHgpIChtZW1iZXIoQUxMX0RBTUFHRV9UWVBFUywgeCkgPiAtMSkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gUnVlc3R1bmdzdHlwZW4gLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBBVF9BTVVMRVQgICAiQW11bGV0dCIKKyNkZWZpbmUgQVRfQVJNT1VSICAgIlJ1ZXN0dW5nIgorI2RlZmluZSBBVF9CRUxUICAgICAiR3VlcnRlbCIKKyNkZWZpbmUgQVRfQk9PVCAgICAgIlNjaHVoZSIKKyNkZWZpbmUgQVRfQ0xPQUsgICAgIlVtaGFuZyIKKyNkZWZpbmUgQVRfR0xPVkUgICAgIkhhbmRzY2h1aCIKKyNkZWZpbmUgQVRfSEVMTUVUICAgIkhlbG0iCisjZGVmaW5lIEFUX1FVSVZFUiAgICJLb2VjaGVyIgorI2RlZmluZSBBVF9SSU5HICAgICAiUmluZyIKKyNkZWZpbmUgQVRfU0hJRUxEICAgIlNjaGlsZCIKKyNkZWZpbmUgQVRfVFJPVVNFUlMgIkhvc2VuIgorCisvLyBGdWVyIGFsbGVzLCB3YXMgc2ljaCB1bnRlciBkZW4gby5nLiBUeXBlbiBuaWNodCBlaW5vcmRuZW4gbGFlc3N0CisjZGVmaW5lIEFUX01JU0MgICAgICJNaXNjIgorCisvLyBSdWVzdHVuZ2VuLCBkaWUgbmljaHQgYW5nZXpvZ2VuIHdlcmRlbiBrb2VubmVuL2R1ZXJmZW4KKyNkZWZpbmUgQVRfSUxMRUdBTCAgIklMTEVHQUwiCisKKy8qIC0tLS0tLS0tLS0gTGlzdGUgYWxsZXIgZXJsYXVidGVuIFJ1ZXN0dW5nc3R5cGVuIC0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBWQUxJRF9BUk1PVVJfVFlQRSh0KSAobWVtYmVyKCh7XAorICAgIEFUX0FSTU9VUiwgQVRfSEVMTUVULCBBVF9SSU5HLCBBVF9HTE9WRSwgQVRfQ0xPQUssIEFUX0JPT1QsXAorICAgIEFUX1RST1VTRVJTLCBBVF9TSElFTEQsIEFUX0FNVUxFVCwgQVRfTUlTQywgQVRfQkVMVCxcCisgICAgQVRfUVVJVkVSfSksIHQgKSAhPSAtMSkKKworLyogLS0tLS0tLS0tLSBNYXBwaW5nIG1pdCBkZW4gbWF4aW1hbCBlcmxhdWJ0ZW4gCisgICAgICAgICAgICAgIFJ1ZXN0dW5nc3dlcnRlbiBkZXIgZWluemVsbmVuIFJ1ZXN0dW5nc3R5cGVuIC0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBWQUxJRF9BUk1PVVJfQ0xBU1MgKFsgXAorICAgIEFUX0FNVUxFVCAgIDogIDIgLFwKKyAgICBBVF9BUk1PVVIgICA6IDUwICxcCisgICAgQVRfQkVMVCAgICAgOiAgMiAsXAorICAgIEFUX0JPT1QgICAgIDogIDYgLFwKKyAgICBBVF9DTE9BSyAgICA6IDEwICxcCisgICAgQVRfR0xPVkUgICAgOiAgNSAsXAorICAgIEFUX0hFTE1FVCAgIDogMTUgLFwKKyAgICBBVF9RVUlWRVIgICA6ICAwICxcCisgICAgQVRfUklORyAgICAgOiAgMiAsXAorICAgIEFUX1NISUVMRCAgIDogNDAgLFwKKyAgICBBVF9UUk9VU0VSUyA6IDE1ICxcCisgICAgQVRfTUlTQyAgICAgOiAgMCBdKQorCisvKiAtLS0tLS0tLS0tIE1hcHBpbmcgbWl0IGRlbiBSdWVzdHVuZ3N3ZXJ0ZW4sIGFiIGRlbmVuCisgICAgICAgICAgICAgIGRpZSBSdWVzdHVuZyBpbSBMYWRlbiBlaW5iZWhhbHRlbiB3ZXJkZW4gIC0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBLRUVQX0FSTU9VUl9DTEFTUyAoWyBcCisgICAgQVRfQU1VTEVUICAgOiAgMiAsXAorICAgIEFUX0FSTU9VUiAgIDogMzUgLFwKKyAgICBBVF9CRUxUICAgICA6ICAyICxcCisgICAgQVRfQk9PVCAgICAgOiAgNSAsXAorICAgIEFUX0NMT0FLICAgIDogIDcgLFwKKyAgICBBVF9HTE9WRSAgICA6ICA1ICxcCisgICAgQVRfSEVMTUVUICAgOiAxMiAsXAorICAgIEFUX1FVSVZFUiAgIDogIDEgLFwKKyAgICBBVF9SSU5HICAgICA6ICAyICxcCisgICAgQVRfU0hJRUxEICAgOiAyNiAsXAorICAgIEFUX1RST1VTRVJTIDogMTIgLFwKKyAgICBBVF9NSVNDICAgICA6ICAxIF0pCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tIERlZmluZXMgZnVlciBLYW1wZmtvbW1hbmRvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIENfQVZHICJhdmciCisjZGVmaW5lIENfTUFYICJtYXgiCisjZGVmaW5lIENfTUlOICJtaW4iCisjZGVmaW5lIENfRFRZUEVTICJkdHlwZXMiCisjZGVmaW5lIENfSEVBTCAiaGVhbCIKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBEZWZpbmVzIGZ1ZXIgZXJ3ZWl0ZXJ0ZSBEZWZlbmRpbmZvcm1hdGlvbmVuIC0tICovCisjZGVmaW5lIEVJTkZPX0RFRkVORAkJImVpbmZvX2RlZmVuZCIKKyNkZWZpbmUgT1JJR0lOQUxfREFNCQkib3JpZ2luYWxfZGFtIgorI2RlZmluZSBPUklHSU5BTF9EQU1UWVBFCSJvcmlnaW5hbF9kYW10eXBlIgorI2RlZmluZSBDVVJSRU5UX0RBTQkJImN1cnJlbnRfZGFtIgorI2RlZmluZSBDVVJSRU5UX0RBTVRZUEUJCSJjdXJyZW50X2RhbXR5cGUiCisjZGVmaW5lIE9SSUdJTkFMX0FJTkZPICAJIm9yaWdpbmFsX2FpbmZvIgorI2RlZmluZSBFTkVNWV9JTlNFUlRFRAkJImVuZW15X2luc2VydGVkIgorI2RlZmluZSBSRlJfUkVEVUNFCQkicmZyX3JlZHVjZSIKKyNkZWZpbmUgUFJFU0VOVF9ERUZFTkRFUlMgIAkicHJlc2VudF9kZWZlbmRlcnMiCisjZGVmaW5lIERFRkVORElOR19ERUZFTkRFUgkiZGVmZW5kaW5nX2RlZmVuZGVyIgorI2RlZmluZSBERUZFTkRfSE9PSwkJImRlZmVuZF9ob29rIgorI2RlZmluZSBERUZFTkRfQVJNT1VSUwkJImRlZmVuZF9hcm1vdXJzIgorI2RlZmluZSBERUZFTkRfR1VJTEQJCSJkZWZlbmRfZ3VpbGQiCisjZGVmaW5lIERFRkVORF9SRVNJCQkiZGVmZW5kX3Jlc2kiCisjZGVmaW5lIERFRkVORF9CT0RZCQkiZGVmZW5kX2JvZHkiCisjZGVmaW5lIERFRkVORF9MT1NUTFAJCSJkZWZlbmRfbG9zdGxwIgorI2RlZmluZSBERUZFTkRfQ1VSX0FSTU9VUl9QUk9UCSJkZWZlbmRfY3VyX2FybW91cl9wcm90IgorCisjZGVmaW5lIERFRl9ERUZFTkRFUgkJMAorI2RlZmluZSBERUZfREFNCQkJMQorI2RlZmluZSBERUZfREFNVFlQRQkJMgorI2RlZmluZSBERUZfU1BFTEwJCTMKKworI2RlZmluZSBIT09LX0RBTQkJMAorI2RlZmluZSBIT09LX0RBTVRZUEUJCTEKKyNkZWZpbmUgSE9PS19TUEVMTAkJMgorI2RlZmluZSBESV9OT0hPT0sJCTAKKyNkZWZpbmUgRElfSE9PSwkJCTEKKyNkZWZpbmUgRElfSE9PS0lOVEVSUlVQVAkyCisKKyNkZWZpbmUgREVGX0FSTU9VUl9EQU0JCTAKKyNkZWZpbmUgREVGX0FSTU9VUl9QUk9UCQkxCisKKyNkZWZpbmUgR1VJTERfREFNCQkwCisjZGVmaW5lIEdVSUxEX0RBTVRZUEUJCTEKKworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RvdHlwZW4tRGVrbGFyYXRpb25lbiAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIF9fQ09NQkFUX0hfUFJPVE9UWVBFU19fCisjZGVmaW5lIF9fQ09NQkFUX0hfUFJPVE9UWVBFU19fCisKKyNpZmRlZiBORUVEX1BST1RPVFlQRVMKKworI2VuZGlmIC8vIE5FRURfUFJPVE9UWVBFUworCisjZW5kaWYgLy8gX19DT01CQVRfSF9QUk9UT1RZUEVTX18KKwpkaWZmIC0tZ2l0IGEvc3lzL2NvbW0uaCBiL3N5cy9jb21tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZhZWIzMwotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9jb21tLmgKQEAgLTAsMCArMSwxNSBAQAorI2lmbmRlZiBMUENfQ09NTV9IXworI2RlZmluZSBMUENfQ09NTV9IXworCisvKiByZXR1cm4gdmFsdWVzIGZvciBuZXRfY29ubmVjdCgpICovCisKKyNkZWZpbmUgTkNfU1VDQ0VTUyAgICAgICAgIDAgIC8qIFN1Y2Nlc3MhICovCisjZGVmaW5lIE5DX0VVTktOT1dOSE9TVCAgICAxICAvKiBob3N0IGFkZHJlc3MgY291bGQgbm90IGJlIHJlc29sdmVkICovCisjZGVmaW5lIE5DX0VOT1NPQ0tFVCAgICAgICAyICAvKiBzb2NrZXQgY291bGQgbm90IGJlIGNyZWF0ZWQgKi8KKyNkZWZpbmUgTkNfRU5PQklORCAgICAgICAgIDMgIC8qIHNvY2tldCBjb3VsZCBub3QgYmUgYm91bmQgKi8KKyNkZWZpbmUgTkNfRU5PQ09OTkVDVCAgICAgIDQgIC8qIHNvY2tldCBjb3VsZCBub3QgYmUgY29ubmVjdGVkICovCisjZGVmaW5lIE5DX0VDT05OUkVGVVNFRCAgICA1ICAvKiB0YXJnZXQgYWRkcmVzcyBub3QgbGlzdGVuaW5nICovCisjZGVmaW5lIE5DX0VNQ09OTiAgICAgICAgICA2ICAvKiB0b28gbWFueSBwZW5kaW5nIGNvbm5lY3Rpb25zICovCisjZGVmaW5lIE5DX0VOT1JFU1NPVVJDRVMgICA3ICAvKiBpbnN1ZmZpY2llbnQgc3lzdGVtIHJlc3NvdXJjZXMgKi8KKworI2VuZGlmIC8qIExQQ19DT01NX0hfICovCmRpZmYgLS1naXQgYS9zeXMvY29tbWFuZHMuaCBiL3N5cy9jb21tYW5kcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ODIzNzIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvY29tbWFuZHMuaApAQCAtMCwwICsxLDUwIEBACisjaWZuZGVmIExQQ19DT01NQU5EU19IXworI2RlZmluZSBMUENfQ09NTUFORFNfSF8KKworLyogRmxhZ3MgYWNjZXB0ZWQgYnkgYWRkX2FjdGlvbihmdW4sIHZlcmIsIGZsYWcpLgorICogKEJlbG93LCBWRVJCIGlzIHdoYXQgdGhlIHBsYXllciBlbnRlcnMpLgorICogTmVnYXRpdmUgZmxhZyB2YWx1ZXMgYWxsb3cgVkVSQiB0byBiZSBqdXN0IHRoZSBmaXJzdCAtPGZsYWc+CisgKiBjaGFyYWN0ZXJzIG9mIDx2ZXJiPiAoYWJicmV2aWF0ZWQgdmVyYikuCisgKi8KKworI2RlZmluZSBBQV9WRVJCICAgICAwICAvKiBWRVJCIG11c3QgYmUgPHZlcmI+ICovCisjZGVmaW5lIEFBX1NIT1JUICAgIDEgIC8qIFZFUkIgbXVzdCBzdGFydCB3aXRoIDx2ZXJiPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICogYXJncyBkbyBub3QgaW5jbHVkZSBleHRyYSBjaGFyYWN0ZXJzICovCisjZGVmaW5lIEFBX05PU1BBQ0UgIDIgIC8qIFZFUkIgbXVzdCBzdGFydCB3aXRoIDx2ZXJiPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICogYXJncyBhbmQgdmVyYiBkbyBpbmNsdWRlIGV4dHJhIGNoYXJhY3RlcnMgKi8KKyNkZWZpbmUgQUFfSU1NX0FSR1MgMyAgLyogVkVSQiBtdXN0IHN0YXJ0IHdpdGggPHZlcmI+LAorICAgICAgICAgICAgICAgICAgICAgICAgKiBhcmdzIGRvIGluY2x1ZGUgZXh0cmEgY2hhcmFjdGVycyAqLworCisvKiBCaXRmbGFncyBhY2NlcHRlZCBieSAgcXVlcnlfYWN0aW9ucyhvYmplY3Qgb2IsIGludCBtYXNrKQorICovCisKKyNkZWZpbmUgUUFfVkVSQiAgICAgICAgIDEKKyNkZWZpbmUgUUFfVFlQRSAgICAgICAgIDIKKyNkZWZpbmUgUUFfU0hPUlRfVkVSQiAgIDQKKyNkZWZpbmUgUUFfT0JKRUNUICAgICAgIDgKKyNkZWZpbmUgUUFfRlVOQ1RJT04gICAgMTYKKworCisvKiBJbmRpY2VzIGluIHRoZSBhcnJheXMgcmV0dXJuZWQgZnJvbSBjb21tYW5kX3N0YWNrKCkKKyAqLworCisjZGVmaW5lIENNRF9WRVJCICAgICAgIDAKKyNkZWZpbmUgQ01EX1RFWFQgICAgICAgMQorI2RlZmluZSBDTURfT1JJR0lOICAgICAyCisjZGVmaW5lIENNRF9QTEFZRVIgICAgIDMKKyNkZWZpbmUgQ01EX0ZBSUwgICAgICAgNAorI2RlZmluZSBDTURfRkFJTE9CSiAgICA1CisKKyNkZWZpbmUgQ01EX1NJWkUgICAgICAgNgorCisKKy8qIEluZGljZXMgaW50byB0aGUgc3ViYXJyYXlzIHJldHVybmVkIGZyb20gbWF0Y2hfY29tbWFuZCgpCisgKi8KKyNkZWZpbmUgQ01ETV9WRVJCICAgICAwCisjZGVmaW5lIENNRE1fQVJHICAgICAgMQorI2RlZmluZSBDTURNX09CSkVDVCAgIDIKKyNkZWZpbmUgQ01ETV9GVU4gICAgICAzCisKKyNkZWZpbmUgQ01ETV9TSVpFICAgICA0CisKKyNlbmRpZiAvKiBMUENfQ09NTUFORFNfSF8gKi8KZGlmZiAtLWdpdCBhL3N5cy9jb25maWd1cmF0aW9uLmggYi9zeXMvY29uZmlndXJhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYzBiODgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvY29uZmlndXJhdGlvbi5oCkBAIC0wLDAgKzEsNDAgQEAKKyNpZm5kZWYgTFBDX0NPTkZJR1VSQVRJT05fSF8KKyNkZWZpbmUgTFBDX0NPTkZJR1VSQVRJT05fSF8KKworLyogRGVmaW5pdGlvbiBvZiBhcmd1bWVudCB2YWx1ZXMgZm9yIHRoZSBjb25maWd1cmVfKigpIGVmdW5zLgorICovCisKKy8qIFBvc3NpYmxlIG9wdGlvbnMgZm9yIGNvbmZpZ3VyZV9pbnRlcmFjdGl2ZSgpLgorICovCisjZGVmaW5lIElDX01BWF9XUklURV9CVUZGRVJfU0laRSAgICAgICAgIDAKKyNkZWZpbmUgSUNfU09DS0VUX0JVRkZFUl9TSVpFICAgICAgICAgICAgMQorI2RlZmluZSBJQ19DT01CSU5FX0NIQVJTRVRfQVNfU1RSSU5HICAgICAyCisjZGVmaW5lIElDX0NPTUJJTkVfQ0hBUlNFVF9BU19BUlJBWSAgICAgIDMKKyNkZWZpbmUgSUNfQ09OTkVDVElPTl9DSEFSU0VUX0FTX1NUUklORyAgNAorI2RlZmluZSBJQ19DT05ORUNUSU9OX0NIQVJTRVRfQVNfQVJSQVkgICA1CisjZGVmaW5lIElDX1FVT1RFX0lBQyAgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgSUNfVEVMTkVUX0VOQUJMRUQgICAgICAgICAgICAgICAgNworI2RlZmluZSBJQ19NQ0NQICAgICAgICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIElDX1BST01QVCAgICAgICAgICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgSUNfTUFYX0NPTU1BTkRTICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBJQ19NT0RJRllfQ09NTUFORCAgICAgICAgICAgICAgIDExCisKKy8qIFBvc3NpYmxlIG9wdGlvbnMgZm9yIGNvbmZpZ3VyZV9vYmplY3QoKS4KKyAqLworI2RlZmluZSBPQ19DT01NQU5EU19FTkFCTEVEICAgIDAKKyNkZWZpbmUgT0NfSEVBUlRfQkVBVCAgICAgICAgICAxCisKKy8qIFBvc3NpYmxlIG9wdGlvbnMgZm9yIGNvbmZpZ3VyZV9kcml2ZXIoKS4KKyAqLworI2RlZmluZSBEQ19NRU1PUllfTElNSVQgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERDX0VOQUJMRV9IRUFSVF9CRUFUUyAgICAgICAgICAgIDEKKyNkZWZpbmUgRENfTE9OR19FWEVDX1RJTUUgICAgICAgICAgICAgICAgMgorI2RlZmluZSBEQ19EQVRBX0NMRUFOX1RJTUUgICAgICAgICAgICAgICAzCisjZGVmaW5lIERDX1RMU19DRVJUSUZJQ0FURSAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgRENfVExTX0RIRV9QQVJBTUVURVIgICAgICAgICAgICAgNQorI2RlZmluZSBEQ19UTFNfQ0lQSEVSTElTVCAgICAgICAgICAgICAgICA2CisjZGVmaW5lIERDX0VYVFJBX1dJWklORk9fU0laRSAgICAgICAgICAgIDcKKyNkZWZpbmUgRENfREVGQVVMVF9SVU5USU1FX0xJTUlUUyAgICAgICAgOAorI2RlZmluZSBEQ19TV0FQX0NPTVBBQ1RfTU9ERSAgICAgICAgICAgICA5CisKKyNlbmRpZiAvKiBMUENfQ09ORklHVVJBVElPTl9IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzL2NvbnRhaW5lci5oIGIvc3lzL2NvbnRhaW5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NTU2MTAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvY29udGFpbmVyLmgKQEAgLTAsMCArMSw3MyBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGNvbnRhaW5lci5oIC0tIFByb3BlcnRpZXMgdW5kIERlZmluaXRpb25lbiBmdWVyIEJlaGFlbHRlcgorLy8KKy8vICRJZDogY29udGFpbmVyLmggOTAyMCAyMDE1LTAxLTEwIDIxOjQ5OjQxWiBaZXNzdHJhICQKKworI2lmbmRlZiBfX0NPTlRBSU5FUl9IX18KKyNkZWZpbmUgX19DT05UQUlORVJfSF9fCisKKyNpbmNsdWRlIDx0aGluZy9yZXN0cmljdGlvbnMuaD4KKworLy8gcHJvcGVydGllcworI2RlZmluZSBQX0NPTlRFTlRTICAgICAgICAgICAgImNvbnRlbnRzIiAgICAgICAgICAgIC8vIE9ic29sZXQhISEKKworI2RlZmluZSBQX0NPTlRBSU5FUiAgICAgICAgICAgImNvbnRhaW5lciIgICAgICAgICAgLy8gT2JqZWt0IGlzdCBlaW4gQ29udGFpbmVyCisjZGVmaW5lIFBfQ05UX1NUQVRVUyAgICAgICAgICAiY250X3N0YXR1cyIgICAgICAgICAvLyBTdGF0dXMgZGVzIENvbnRhaW5lcnMKKyNkZWZpbmUgUF9UUkFOU1BBUkVOVCAgICAgICAgICJ0cmFuc3BhcmVudCIgICAgICAgIC8vIGthbm4gbWFuIGhpbmVpbnNjaGF1bj8KKyNkZWZpbmUgUF9MSUdIVF9UUkFOU1BBUkVOQ1kgICJsaWdodF90cmFuc3BhcmVuY3kiIC8vIExpY2h0ZHVyY2hsYWVzc2lna2VpdAorCisjZGVmaW5lIFBfUFJFUE9TSVRJT04gICAgICAgICAicHJlcG9zaXRpb24iICAgICAgICAvLyBTYWNoZW4gSU4gZGVtIENvbnRhaW5lcgorI2RlZmluZSBQX1NPVVJDRV9QUkVQT1NJVElPTiAgInNvdXJjZV9wcmVwb3NpdGlvbiIgLy8ga2FubiBtYW4gQVVTIGlobSBuZWhtZW4KKyNkZWZpbmUgUF9ERVNUX1BSRVBPU0lUSU9OICAgICJkZXN0X3ByZXBvc2l0aW9uIiAgIC8vIC4uLndpZWRlciBJTiBpaG4gc3RlY2tlbgorCisjZGVmaW5lIFBfTUFYX1dFSUdIVCAgICAgICAgICAibWF4X3dlaWdodCIgICAgICAgICAvLyBtYXguIEdld2ljaHQKKyNkZWZpbmUgUF9XRUlHSFRfUEVSQ0VOVCAgICAgICJ3ZWlnaHRfcGVyY2VudCIgICAgIC8vIEdld2ljaHRzcmVkdWt0aW9uIGluICUKKworI2RlZmluZSBQX1RPVEFMX09CSkVDVFMgICAgICAgInRvdGFsX29iamVjdHMiICAgICAgLy8gIyBkZXIgbm9uLWludmlzIE9iamVrdGUKKyNkZWZpbmUgUF9NQVhfT0JKRUNUUyAgICAgICAgICJtYXhfb2JqZWN0cyIgICAgICAgIC8vIG1heC4gT2JqZWt0YW56YWhsCisKKyNkZWZpbmUgUF9JTlRfTElHSFQgICAgICAgICAgICJpbnRfbGlnaHQiCisKKyNkZWZpbmUgUF9JVEVNUyAgICAgICAgICAgICAgICJpdGVtcyIgICAgICAgICAgICAgIC8vIHNpZWhlIEFkZEl0ZW0oKQorCisjZGVmaW5lIFBfUFJFVkVOVF9QSUxFICAgICAgICAicHJldmVudF9waWxlIiAgICAgICAvLyBzaWVoZSAvc3RkL2NvcnBzZQorI2RlZmluZSBQX1BJTEVfTkFNRSAgICAgICAgICAgInBpbGVfbmFtZSIgICAgICAgICAgLy8gTmFtZSBkZXMgU3BpZWxlcnMgaW0gRGF0aXYKKworLy8gc3BlY2lhbCBkZWZpbmVzCisjZGVmaW5lIENOVF9TVEFUVVNfT1BFTiAgIDAKKyNkZWZpbmUgQ05UX1NUQVRVU19DTE9TRUQgMQorI2RlZmluZSBDTlRfU1RBVFVTX0xPQ0tFRCAyCisKKyNkZWZpbmUgUl9JTlNFUlQgImluc2VydCIKKworI2RlZmluZSBDTlRfQVJSQVkgICAgICAgMQorI2RlZmluZSBDTlRfQ09MTEVDVCAgICAgMgorCisjZW5kaWYgLy8gX19DT05UQUlORVJfSF9fCisKKyNpZmRlZiBORUVEX1BST1RPVFlQRVMKKworI2lmbmRlZiBfX0NPTlRBSU5FUl9IX1BST1RPX18KKyNkZWZpbmUgX19DT05UQUlORVJfSF9QUk9UT19fCisKKy8vIHByb3RvdHlwZXMKKy8vIGZyb206IGNvbnRhaW5lci9kZXNjcmlwdGlvbi5jCit2YXJhcmdzIG1peGVkIG1ha2VfaW52bGlzdChvYmplY3Qgdmlld2VyLCBtaXhlZCBpbnYsIGludCBhcnJheSk7CisKKy8vIGZyb206IGNvbnRhaW5lci9yZXN0cmljdGlvbnMuYworaW50IHF1ZXJ5X3dlaWdodF9jb250ZW50cygpOworc3RhdGljIGludCBfcXVlcnlfbGFzdF9jb250ZW50X2NoYW5nZSgpOworCitpbnQgTWF5QWRkV2VpZ2h0KGludCB3KTsKK2ludCBNYXlBZGRPYmplY3Qob2JqZWN0IG9iKTsKK3B1YmxpYyBpbnQgUHJldmVudEluc2VydChvYmplY3Qgb2IpOworcHVibGljIGludCBQcmV2ZW50TGVhdmUob2JqZWN0IG9iLCBtaXhlZCBkZXN0KTsKK29iamVjdCAqcHJlc2VudF9vYmplY3RzKHN0cmluZyBjb21wbGV4X2Rlc2MpOworb2JqZWN0ICpsb2NhdGVfb2JqZWN0cyhzdHJpbmcgY29tcGxleF9kZXNjLGludCBpbmZvKTsKKworLy8gY29udGFpbmVyL2l0ZW1zLmMKK3B1YmxpYyB2YXJhcmdzIG9iamVjdCAgICAgQWRkSXRlbSggbWl4ZWQgZmlsZW5hbWUsIGludCByZWZyZXNoLCBtaXhlZCBwcm9wcyk7CisjZW5kaWYgLy8gX19DT05UQUlORVJfSF9QUk9UT19fCisKKyNlbmRpZiAvLyBORUVEX1BST1RPVFlQRVMKZGlmZiAtLWdpdCBhL3N5cy9jb250YWluZXIvbW9uZXloYW5kbGVyLmggYi9zeXMvY29udGFpbmVyL21vbmV5aGFuZGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZGYzYjcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvY29udGFpbmVyL21vbmV5aGFuZGxlci5oCkBAIC0wLDAgKzEsMjAgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBjb250YWluZXIvbW9uZXloYW5kbGVyLmggLS0gRGFzIC1HZWxkLUludGVyZmFjZQorLy8KKy8vICRJZDogbW9uZXloYW5kbGVyLmgsdiAzLjEgMTk5Ny8wMi8xMiAxMzoyOTowOSBXYXJnb24gRXhwICQKKworI2lmbmRlZiBfX0NPTlRBSU5FUl9NT05FWUhBTkRMRVJfSF9fCisjZGVmaW5lIF9fQ09OVEFJTkVSX01PTkVZSEFORExFUl9IX18KKworI2VuZGlmCisKKyNpZmRlZiBORUVEX1BST1RPVFlQRVMKKyNpZm5kZWYgX19DT05UQUlORVJfTU9ORVlIQU5ETEVSX0hfUFJPVE9fXworI2RlZmluZSBfX0NPTlRBSU5FUl9NT05FWUhBTkRMRVJfSF9QUk9UT19fCisKK2ludCBBZGRNb25leShpbnQgYW1vdW50KTsKK2ludCBRdWVyeU1vbmV5KCk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9zeXMvZGFlbW9uLmggYi9zeXMvZGFlbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ3OWJjYQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9kYWVtb24uaApAQCAtMCwwICsxLDEwIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gZGFlbW9uLmggLS0gRGVmaW5pdGlvbmVuIGZ1ZXIgT2JqZWt0ZSBpbiAvcC9kYWVtb24vCisvLworLy8gJElkOiBkYWVtb24uaCA3NDE5IDIwMTAtMDItMDcgMjE6MDQ6NDBaIFplc3N0cmEgJAorCisjaW5jbHVkZSAiL3N5cy9kYWVtb24vY2hhbm5lbC5oIiAgICAvLyBjaGFubmVsIGhhbmRsaW5nCisjaW5jbHVkZSAiL3N5cy9kYWVtb24vb2JqZWN0LmgiICAgICAvLyBwZXJzaXN0ZW50IG9iamVjdCBoYW5kbGluZworI2luY2x1ZGUgIi9zeXMvZGFlbW9uL3RyYXZlbGQuaCIgICAgLy8gVFJBVkVMIGRhZW1vbgorI2luY2x1ZGUgIi9zeXMvZGFlbW9uL21hbmQuaCIgICAgICAgLy8gTUFOIGRhZW1vbgpkaWZmIC0tZ2l0IGEvc3lzL2RhZW1vbi9jaGFubmVsLmggYi9zeXMvZGFlbW9uL2NoYW5uZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjUxMmUwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL2RhZW1vbi9jaGFubmVsLmgKQEAgLTAsMCArMSw2IEBACisvLyBjaC5oIC0gY2hhbm5lbCBkYWVtb24gZGVmaW5lcworLy8gLS0KKy8vICR0aW1lc3RhbXA6OiQKKworI2luY2x1ZGUgIi9wL2RhZW1vbi9jaGFubmVsLmgiCisKZGlmZiAtLWdpdCBhL3N5cy9kYWVtb24vbWFuZC5oIGIvc3lzL2RhZW1vbi9tYW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA5ZjhkNQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9kYWVtb24vbWFuZC5oCkBAIC0wLDAgKzEsMjIgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBtYW5kLmgKKy8vCisvLyAkSWQ6IG1hbmQuaCA2Njk4IDIwMDgtMDEtMjkgMjM6MjY6MDhaIFplc3N0cmEgJAorCisKKyNpZm5kZWYgX19NQU5EX0hfXworI2RlZmluZSBfX01BTkRfSF9fCisKKyNkZWZpbmUgTUFORF9ET0NESVIgIi9kb2MvIgorI2RlZmluZSBNQU5EX0VYQ0xVREUgKHsgIjMuMCIsIktVUlMiLCJiZWlzcGllbGUiLCJvbGQiLCJuZXciLCAiaW5mb21haWxzIn0pCisjZGVmaW5lIE1BTkQgIi9wL2RhZW1vbi9tYW5kIgorCisjZW5kaWYKKworI2lmZGVmIE5FRURfUFJPVE9UWVBFUworI2lmbmRlZiBfX01BTkRfSF9QUk9UT1NfXworI2RlZmluZSBfX01BTkRfSF9QUk9UT1NfXworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzL2RhZW1vbi9vYmplY3QuaCBiL3N5cy9kYWVtb24vb2JqZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVjMDZhYwotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9kYWVtb24vb2JqZWN0LmgKQEAgLTAsMCArMSw0MSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIE9CSkVDVC5IIC0tIHBlcnNpc3RlbnQgb2JqZWN0IGhhbmRsaW5nCisvLworLy8gJERhdGU6IDIwMDIvMDgvMjggMTA6MDQ6MjggJAorLy8gJFJldmlzaW9uOiAxLjEgJAorLyogJExvZzogb2JqZWN0LmgsdiAkCisgKiBSZXZpc2lvbiAxLjEgIDIwMDIvMDgvMjggMTA6MDQ6MjggIFJpa3VzCisgKiBJbml0aWFsIHJldmlzaW9uCisgKgorICogUmV2aXNpb24gMS4xICAxOTk1LzAzLzMxICAxMzozMDozMyAgSGF0ZQorICogSW5pdGlhbCByZXZpc2lvbgorICoKKyAqIFJldmlzaW9uIDEuMSAgMTk5NC8wMy8yMCAgMTc6MDc6MjggIEhhdGUKKyAqIEluaXRpYWwgcmV2aXNpb24KKyAqCisgKi8KKyAKKyNpZm5kZWYgX19PQkpFQ1RfSF9fCisjZGVmaW5lIF9fT0JKRUNUX0hfXworCisvLyBkZWZpbmVzCisjZGVmaW5lIE9CSkVDVEQgICAgICAgIi9wL2RhZW1vbi9vYmplY3RkIgorI2RlZmluZSBPQkpFQ1REX1NBVkUgICIvcC9kYWVtb24vc2F2ZS9vYmplY3RkIgorCisjZW5kaWYgLy8gX19PQkpFQ1RfSF9fCisKKyNpZmRlZiBORUVEX1BST1RPVFlQRVMKKworI2lmbmRlZiBfX09CSkVDVF9IX1BST1RPX18KKyNkZWZpbmUgX19PQkpFQ1RfSF9QUk9UT19fCisKKy8vIHByb3RvdHlwZXMKK21peGVkIEFkZE9iamVjdChzdHJpbmcgb2JqLCBzdHJpbmcgZW52KTsKK21peGVkIFJlbW92ZU9iamVjdChzdHJpbmcgb2JqLCBzdHJpbmcgZW52KTsKK3ZhcmFyZ3Mgdm9pZCBRdWVyeU9iamVjdChtaXhlZCBlbnYpOworCisKKyNlbmRpZiAvLyBfX09CSkVDVF9IX1BST1RPX18KKworI2VuZGlmCS8vIE5FRURfUFJPVE9ZUEVTCmRpZmYgLS1naXQgYS9zeXMvZGFlbW9uL3RyYXZlbGQuaCBiL3N5cy9kYWVtb24vdHJhdmVsZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxN2E2MzcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvZGFlbW9uL3RyYXZlbGQuaApAQCAtMCwwICsxLDIyIEBACisjaWZuZGVmIF9fVFJBVkVMRF9IX18KKyNkZWZpbmUgX19UUkFWRUxEX0hfXworCisjZGVmaW5lIFRSQVZFTEQgICAgICAgICAgIi9wL2RhZW1vbi90cmF2ZWxkIgorI2RlZmluZSBUUkFWRUxEX1NBVkVGSUxFICIvcC9kYWVtb24vc2F2ZS90cmF2ZWxkIgorCisjaWZkZWYgTkVFRF9QUk9UT1RZUEVTCisjaWZuZGVmIF9fVFJBVkVMRF9IX1BST1RPX18KKyNkZWZpbmUgX19UUkFWRUxEX0hfUFJPVE9fXworCitwdWJsaWMgdm9pZCBBZGRTdG9wKHN0cmluZyBzaGlwLCBzdHJpbmcgaGFyYm91cik7CitwdWJsaWMgdm9pZCBSZW1vdmVUcmFuc3BvcnRlcihvYmplY3Qgc2hpcCk7CitwdWJsaWMgdmFyYXJncyBtaXhlZCBIYXNUcmFuc3BvcnRlcihvYmplY3QgaGFyYm91ciwgc3RyaW5nIHNoaXApOworcHVibGljIG1peGVkIFJvdXRlRXhpc3RzKG9iamVjdCBzaGlwLCBzdHJpbmcgZGVzdCk7CitwdWJsaWMgbWFwcGluZyBRdWVyeVNoaXBzKCk7CitwdWJsaWMgbWFwcGluZyBRdWVyeUFsbEhhcmJvdXJzKCk7CisKKyNlbmRpZiAvLyBfX1RSQVZFTERfSF9QUk9UT19fCisKKyNlbmRpZiAvLyBORUVEX1BST1RPVFlQRVMKKworI2VuZGlmIC8vIF9fVFJBVkVMRF9IX18KZGlmZiAtLWdpdCBhL3N5cy9kYWVtb24vd2hvaXMuaCBiL3N5cy9kYWVtb24vd2hvaXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjI2ODJjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL2RhZW1vbi93aG9pcy5oCkBAIC0wLDAgKzEsMjEgQEAKKyNpZm5kZWYgX19EQUVNT05fV0hPSVNfSF9fCisjZGVmaW5lIF9fREFFTU9OX1dIT0lTX0hfXworCisjZGVmaW5lIFdIT0lTICAgICAgICAgIi9wL2RhZW1vbi91ZHAvd2hvaXMiCisKKyNkZWZpbmUgREVTQ1IgICAwCisjZGVmaW5lIENPVU5UUlkgMQorI2RlZmluZSBEQVRFICAgIDIKKyNkZWZpbmUgTkVUTkFNRSAzCisKKworLy8gcHJvdG90eXBlcworI2lmZGVmIE5FRURfUFJPVE9UWVBFUworCittaXhlZCB3aG9pcyhzdHJpbmcgcXVlcnksIGludCB0eXBlKTsKK3N0cmluZyBjb3VudHJ5KHN0cmluZyBxdWVyeSk7CitzdHJpbmcgY2l0eShzdHJpbmcgcXVlcnkpOworc3RyaW5nIGxvY2F0ZShzdHJpbmcgcXVlcnksIHN0cmluZyBpcCk7CisKKyNlbmRpZiAvKiBORUVEX1BST1RPVFlQRVMgKi8KKyNlbmRpZiAvKiBfX0RBRU1PTl9XSE9JU19IX18gKi8KZGlmZiAtLWdpdCBhL3N5cy9kZWF0aF9yb29tLmggYi9zeXMvZGVhdGhfcm9vbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NWRiMWIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvZGVhdGhfcm9vbS5oCkBAIC0wLDAgKzEsOSBAQAorCisjaWZuZGVmIF9ERUFUSF9ST09NX0hfCisjZGVmaW5lIF9ERUFUSF9ST09NX0hfCisKKworLy8geCBtdXNzIGVpbiBTcGllbGVyb2JqZWt0IHNlaW4KKyNkZWZpbmUgSVNfSU5fREVBVEhfUk9PTSh4KSAoZW52aXJvbm1lbnQoeCkmJm9iamVjdF9uYW1lKGVudmlyb25tZW50KHgpKT09KCIvcm9vbS9kZWF0aC92aXJ0dWFsL2RlYXRoX3Jvb21fIitnZXR1aWQoeCkpKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5cy9kZWJ1Zy5oIGIvc3lzL2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg4MDQzYQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9kZWJ1Zy5oCkBAIC0wLDAgKzEsNjEgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBkZWJ1Zy5oIC0tIERlYnVnLU9wdGlvbmVuIGZ1ZXIgZGllIE1VRGxpYgorLy8KKy8vICRJZDogZGVidWcuaCx2IDMuMSAxOTk3LzAyLzEyIDEzOjA0OjU5IFdhcmdvbiBFeHAgJAorCisjaWZuZGVmIF9ERUJVR18KKyNkZWZpbmUgX0RFQlVHXworCisKKy8qCisgKiBMUEMgZGVidWcgb3B0aW9ucworICovCisKKworI2RlZmluZSBOT0RFQlVHCQkJLyogYWxsIGRlYnVnZ2luZyBtb2RlcyBkaXNhYmxlZCAqLworCisjaWZuZGVmIE5PREVCVUcKKworI2RlZmluZSBERUJVR19TVERfQ1JFQVRFICAgICAgICAvKiBkZWJ1ZyBvYmplY3QgY3JlYXRpb24gaW4gL3N0ZCBvYmplY3RzICovCisvKiAjZGVmaW5lIERFQlVHX1BST1BFUlRJRVMJLyogc29tZSBwcm9wZXJ0eSBkZWJ1ZyBmdW5jdGlvbnMgKi8KKy8qICNkZWZpbmUgREVCVUdfSUQJCS8qIGVjaG8gdGhlIG9iamVjdCBpZCBvcGVyYXRpb24gKi8KKyNkZWZpbmUgREVCVUdfUElDSwkJLyogb2JqZWN0IHBpY2t1cCAqLworI2RlZmluZSBERUJVR19DTURTCQkvKiBjb21tYW5kIGRlYnVnZ2luZyBmb3IgaW5pdCAqLworI2RlZmluZSBERUJVR19ET01BSU4JCS8qIGRlYnVnIGRvbWFpbiBmaWxlcyAqLworI2RlZmluZSBERUJVR19ET09SCQkvKiBkZWJ1ZyBkb29ycyAqLworI2RlZmluZSBXQVJOX1VOREVGUFJPUAkJLyogd2FybmluZ3MgaWYgdW5kZWYgcHJvcGVydGllcyBhcmUgc2V0ICovCisjZGVmaW5lIERFQlVHX0VWRU5UUwkJLyogZGVidWcgZXZlbnQgaGFuZGxlciBjYWxsICovCisjZGVmaW5lIERFQlVHX01PVkUJCS8qIGRlYnVnIGluIG9iamVjdCBtb3ZpbmcgKi8KKworI2RlZmluZSBERUJVR19SRVMJCS8qIGRlYnVnIHJlc3RyaWN0aW9uIGhhbmRsaW5nICovCisjZGVmaW5lIERFQlVHX1JFU19NQVgJCS8qIGRlYnVnIHJlc3RyaWN0aW9uIHxyZXNfbWF4fCAqLworI2RlZmluZSBERUJVR19SRVNfTElNSVQJCS8qIGRlYnVnIHJlc3RyaWN0aW9uIHxyZXNfbGltaXR8ICovCisjZGVmaW5lIERFQlVHX1JFU19QTEFZRVIJLyogcmVzdHJpY3Rpb24gb2YgbnVtYmVyIG9mIHNvbWV0aGluZyAqLworLyogI2RlZmluZSBERUJVR19GVU5DVElPTgkvKiBkZWJ1ZyBtZXNzYWdlIGZ1bmN0aW9ucyAqLworLyogI2RlZmluZSBERUJVR19BUlJBWQkJLyogZGVidWcgYXJyYXkgYW5kIG1lbWJlciBjb21wYXJpc29uICovCisjZGVmaW5lIERFQlVHX1BST1BBR0FUSU9OCS8qIGRlYnVnIGJhY2tncm91bmQgcHJvcGFnYXRpb24gbWVjaGFuaXNtICovCisjZGVmaW5lIERFQlVHX1JFU19HUk9VTkQJLyogZGVidWcgZ3JvdW5kIHR5cGUgcmVzdHJpY3Rpb25zICovCisjZGVmaW5lIERFQlVHX0ZFQVRVUkVTCSAgICAgICAgLyogZGVidWcgZmVhdHVyZSBtZWNoYW5pc20gKi8KKyNkZWZpbmUgREVCVUdfUkVTX0ZFQVRVUkVTCS8qIGRlYnVnIGZlYXR1cmUgbWVjaGFuaXNtICovCisjZGVmaW5lIERFQlVHX1ZJRVcJCS8qIGRlYnVnIHBsYXllcnMgdmlzaW9uICovCisjZGVmaW5lIERFQlVHX1BST1BBR0FUSU9OCS8qIGRlYnVnIGJhY2tncm91bmQgcHJvcGFnYXRpb24gbWVjaGFuaXNtICovCisjZGVmaW5lIERFQlVHX01TRwkJLyogbWVzc2FnZSBkZWJ1Z2dpbmcgKi8KKyNkZWZpbmUgREVCVUdfU0VMRUNUCQkvKiBkZWJ1ZyBzZWxlY3Rpb24gbWVjaGFuaXNtICovCisjZGVmaW5lIERFQlVHX1JFU09VUkNFUwkJLyogZGVidWcgbGl2aW5nIHJlc291cmNlcyAqLworI2RlZmluZSBERUJVR19JU01FCQkvKiBkZWJ1ZyB0aGUgaXNfbWUgb3BlcmF0aW9uICovCisjZGVmaW5lIERFQlVHX0ZPTExPVwkJLyogZGVidWcgZm9sbG93IG1vZGUgZm9yIHdhbGtlcnMgKi8KKyNkZWZpbmUgREVCVUdfUkVTT1VSQ0VTMgkvKiBkZWJ1ZyBsaXZpbmcgcmVzb3VyY2VzICovCisjZGVmaW5lIEFDQ0VTU19ERUJVRyAxCQkvKiBkZWJ1ZyBvZiBhY2Nlc3MgY29udHJvbCAqLworI2RlZmluZSBERUJVR19TQVZFCQkvKiBkZWJ1ZyBsb2FkaW5nIGFuZCBzYXZpbmcgb2Ygb2JqZWN0cyAqLworI2RlZmluZSBERUJVR19CT0FSRAkJLyogZGVidWcgYm9hcmQgc3lzdGVtICovCisjZGVmaW5lIERFQlVHX0FTRUUJCS8qIGRlYnVnICJ0byBzZWUiIGFiaWxpdHkgKi8KKyNkZWZpbmUgREVCVUdfU1BFTExTCQkvKiBkZWJ1ZyBzcGVsbHMgKi8KKyNkZWZpbmUgREVCVUdfQkFUVExFCQkvKiBkZWJ1ZyBiYXR0bGUgc3lzdGVtICovCisKKyNlbmRpZgorCisKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3N5cy9kZWJ1Z19pbmZvLmggYi9zeXMvZGVidWdfaW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZmI3ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvZGVidWdfaW5mby5oCkBAIC0wLDAgKzEsMjE4IEBACisjaWZuZGVmIExQQ19ERUJVR19JTkZPX0hfCisjZGVmaW5lIExQQ19ERUJVR19JTkZPX0hfIDEKKworI2luY2x1ZGUgIi9zeXMvZHJpdmVyX2luZm8uaCIKKworLyogUmVxdWVzdCB2YWx1ZXMgZm9yIGVmdW4gZGVidWdfaW5mbygpLgorICovCisKKyNkZWZpbmUgRElORk9fT0JKRUNUICAwICAvKiBQcmludCBpbmZvcm1hdGlvbiBhYm91dCBhbiBvYmplY3QgKi8KKyNkZWZpbmUgRElORk9fTUVNT1JZICAxICAvKiBQcmludCBtZW1vcnkgdXNhZ2Ugb2YgYW4gb2JqZWN0ICovCisjZGVmaW5lIERJTkZPX09CSkxJU1QgMiAgLyogUmV0dXJuIGFuIG9iamVjdCBmcm9tIHRoZSBnbG9iYWwgbGlzdCAqLworI2RlZmluZSBESU5GT19NQUxMT0MgIDMgIC8qIFByaW50IHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSAnbWFsbG9jJyBjbWQgKi8KKyNkZWZpbmUgRElORk9fU1RBVFVTICA0ICAvKiBSZXR1cm4gdGhlICdzdGF0dXMnIGluZm9ybWF0aW9uICovCisjZGVmaW5lIERJTkZPX0RVTVAgICAgNSAgLyogRHVtcCBzb21lIHNwZWNpYWwgaW5mb3JtYXRpb24gaW50byBmaWxlcyAqLworI2RlZmluZSBESU5GT19EQVRBICAgIDYgIC8qIFJldHVybiBpbnRlcm5hbCBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBESU5GT19UUkFDRSAgIDcgIC8qIFJldHVybiB0aGUgY3VycmVudCBjYWxsIHRyYWNlICovCisjZGVmaW5lIERJTkZPX0VWQUxfTlVNQkVSIDggLyogUmV0dXJuIHRoZSBjdXJyZW50IGV2YWwgbnVtYmVyICovCisKKy8qIFN1Yi1yZXF1ZXN0IHZhbHVlcyBmb3IgZGVidWdfaW5mbyhESU5GT19EQVRBKSAqLworCisjZGVmaW5lIERJRF9TVEFUVVMgIDAgIC8qIFJldHVybiB0aGUgJ3N0YXR1cycgYW5kICdzdGF0dXMgdGFibGVzJyBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBESURfU1dBUCAgICAxICAvKiBSZXR1cm4gdGhlICdzdGF0dXMgc3dhcCcgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgRElEX01FTU9SWSAgMiAgLyogUmV0dXJuIHRoZSAnc3RhdHVzIG1hbGxvYycgaW5mb3JtYXRpb24gKi8KKworLyogU3ViLXJlcXVlc3QgdmFsdWVzIGZvciBkZWJ1Z19pbmZvKERJTkZPX1RSQUNFKSAqLworCisjZGVmaW5lIERJVF9DVVJSRU5UICAgICAgICAwICAvKiBSZXR1cm4gdGhlIGN1cnJlbnQgY2FsbCBjaGFpbiBhcyBhbiBhcnJheSAqLworI2RlZmluZSBESVRfRVJST1IgICAgICAgICAgMSAgLyogUmV0dXJuIHRoZSBsYXN0IGVycm9yIGNhbGwgY2hhaW4gYXMgYW4gYXJyYXkgKi8KKyNkZWZpbmUgRElUX1VOQ0FVR0hUX0VSUk9SIDIgIC8qIFJldHVybiB0aGUgbGFzdCB1bmNhdWdodCBlcnJvciBjYWxsIGNoYWluICovCisjZGVmaW5lIERJVF9TVFJfQ1VSUkVOVCAgICAzICAvKiBSZXR1cm4gdGhlIGN1cnJlbnQgY2FsbCBjaGFpbiBhcyBhIHN0cmluZyAqLworI2RlZmluZSBESVRfQ1VSUkVOVF9ERVBUSCAgNCAgLyogUmV0dXJuIHRoZSBjdXJyZW50IGNvbnRyb2wgc3RhY2sgZGVwdGggKi8KKworLyogSW5kaWNlcyBpbnRvIHRoZSBhcnJheSByZXN1bHRpbmcgZnJvbSBkZWJ1Z19pbmZvKERJTkZPX0RBVEEsIERJRF9TVEFUVVMpCisgKi8KKworI2RlZmluZSBESURfU1RfQUNUSU9OUyAgICAgICAgICAgICAwCisjZGVmaW5lIERJRF9TVF9BQ1RJT05TX1NJWkUgICAgICAgIDEKKyNkZWZpbmUgRElEX1NUX1NIQURPV1MgICAgICAgICAgICAgMgorI2RlZmluZSBESURfU1RfU0hBRE9XU19TSVpFICAgICAgICAzCisKKyNkZWZpbmUgRElEX1NUX09CSkVDVFMgICAgICAgICAgICAgNAorI2RlZmluZSBESURfU1RfT0JKRUNUU19TSVpFICAgICAgICA1CisjZGVmaW5lIERJRF9TVF9PQkpFQ1RTX1NXQVBQRUQgICAgIDYKKyNkZWZpbmUgRElEX1NUX09CSkVDVFNfU1dBUF9TSVpFICAgNworI2RlZmluZSBESURfU1RfT0JKRUNUU19MSVNUICAgICAgICA4CisjZGVmaW5lIERJRF9TVF9PQkpFQ1RTX05FV0xZX0RFU1QgIDkKKyNkZWZpbmUgRElEX1NUX09CSkVDVFNfREVTVFJVQ1RFRCAxMAorI2RlZmluZSBESURfU1RfT0JKRUNUU19QUk9DRVNTRUQgIDExCisjZGVmaW5lIERJRF9TVF9PQkpFQ1RTX0FWR19QUk9DICAgMTIKKworI2RlZmluZSBESURfU1RfT1RBQkxFICAgICAgICAgICAgIDEzCisjZGVmaW5lIERJRF9TVF9PVEFCTEVfU0xPVFMgICAgICAgMTQKKyNkZWZpbmUgRElEX1NUX09UQUJMRV9TSVpFICAgICAgICAxNQorCisjZGVmaW5lIERJRF9TVF9IQkVBVF9PQkpTICAgICAgICAgMTYKKyNkZWZpbmUgRElEX1NUX0hCRUFUX0NBTExTICAgICAgICAxNworI2RlZmluZSBESURfU1RfSEJFQVRfQ0FMTFNfVE9UQUwgIDE4CisjZGVmaW5lIERJRF9TVF9IQkVBVF9TTE9UUyAgICAgICAgMTkKKyNkZWZpbmUgRElEX1NUX0hCRUFUX1NJWkUgICAgICAgICAyMAorI2RlZmluZSBESURfU1RfSEJFQVRfUFJPQ0VTU0VEICAgIDIxCisjZGVmaW5lIERJRF9TVF9IQkVBVF9BVkdfUFJPQyAgICAgMjIKKworI2RlZmluZSBESURfU1RfQ0FMTE9VVFMgICAgICAgICAgIDIzCisjZGVmaW5lIERJRF9TVF9DQUxMT1VUX1NJWkUgICAgICAgMjQKKworI2RlZmluZSBESURfU1RfQVJSQVlTICAgICAgICAgICAgIDI1CisjZGVmaW5lIERJRF9TVF9BUlJBWVNfU0laRSAgICAgICAgMjYKKworI2RlZmluZSBESURfU1RfTUFQUElOR1MgICAgICAgICAgIDI3CisjZGVmaW5lIERJRF9TVF9NQVBQSU5HU19TSVpFICAgICAgMjgKKyNkZWZpbmUgRElEX1NUX0hZQlJJRF9NQVBQSU5HUyAgICA1MQorI2RlZmluZSBESURfU1RfSEFTSF9NQVBQSU5HUyAgICAgIDU0CisKKyNkZWZpbmUgRElEX1NUX1NUUlVDVFMgICAgICAgICAgICAyOQorI2RlZmluZSBESURfU1RfU1RSVUNUU19TSVpFICAgICAgIDMwCisjZGVmaW5lIERJRF9TVF9TVFJVQ1RfVFlQRVMgICAgICAgMzEKKyNkZWZpbmUgRElEX1NUX1NUUlVDVF9UWVBFU19TSVpFICAzMgorCisjZGVmaW5lIERJRF9TVF9QUk9HUyAgICAgICAgICAgICAgMzMKKyNkZWZpbmUgRElEX1NUX1BST0dTX1NJWkUgICAgICAgICAzNAorCisjZGVmaW5lIERJRF9TVF9QUk9HU19TV0FQUEVEICAgICAgMzUKKyNkZWZpbmUgRElEX1NUX1BST0dTX1NXQVBfU0laRSAgICAzNgorCisjZGVmaW5lIERJRF9TVF9VU0VSX1JFU0VSVkUgICAgICAgMzcKKyNkZWZpbmUgRElEX1NUX01BU1RFUl9SRVNFUlZFICAgICAzOAorI2RlZmluZSBESURfU1RfU1lTVEVNX1JFU0VSVkUgICAgIDM5CisKKyNkZWZpbmUgRElEX1NUX0FERF9NRVNTQUdFICAgICAgICA0MAorI2RlZmluZSBESURfU1RfUEFDS0VUUyAgICAgICAgICAgIDQxCisjZGVmaW5lIERJRF9TVF9QQUNLRVRfU0laRSAgICAgICAgNDIKKyNkZWZpbmUgRElEX1NUX1BBQ0tFVFNfSU4gICAgICAgICA0MworI2RlZmluZSBESURfU1RfUEFDS0VUX1NJWkVfSU4gICAgIDQ0CisKKyNkZWZpbmUgRElEX1NUX0FQUExZICAgICAgICAgICAgICA0NQorI2RlZmluZSBESURfU1RfQVBQTFlfSElUUyAgICAgICAgIDQ2CisKKyNkZWZpbmUgRElEX1NUX1NUUklOR1MgICAgICAgICAgICA0NworI2RlZmluZSBESURfU1RfU1RSSU5HX1NJWkUgICAgICAgIDQ4CisjZGVmaW5lIERJRF9TVF9TVFJfVEFCTEVfU0laRSAgICAgNDkKKyNkZWZpbmUgRElEX1NUX1NUUl9PVkVSSEVBRCAgICAgICA1MAorI2RlZmluZSBESURfU1RfVU5UQUJMRUQgICAgICAgICAgIDUyCisjZGVmaW5lIERJRF9TVF9VTlRBQkxFRF9TSVpFICAgICAgNTMKKyNkZWZpbmUgRElEX1NUX1VOVVNFRDU0ICAgICAgICAgICA1NCAvKiBVTlVTRUQgKi8KKyNkZWZpbmUgRElEX1NUX1VOVVNFRDU1ICAgICAgICAgICA1NSAvKiBVTlVTRUQgKi8KKyNkZWZpbmUgRElEX1NUX1RBQkxFRCAgICAgICAgICAgICA1NgorI2RlZmluZSBESURfU1RfVEFCTEVEX1NJWkUgICAgICAgIDU3CisjZGVmaW5lIERJRF9TVF9TVFJfU0VBUkNIRVMgICAgICAgNTgKKyNkZWZpbmUgRElEX1NUX1NUUl9TRUFSQ0hMRU4gICAgICA1OQorI2RlZmluZSBESURfU1RfU1RSX1NFQVJDSEVTX0JZVkFMVUUgICA2MAorI2RlZmluZSBESURfU1RfU1RSX1NFQVJDSExFTl9CWVZBTFVFICA2MQorI2RlZmluZSBESURfU1RfU1RSX0NIQUlOUyAgICAgICAgIDYyCisjZGVmaW5lIERJRF9TVF9TVFJfQURERUQgICAgICAgICAgNjMKKyNkZWZpbmUgRElEX1NUX1NUUl9ERUxFVEVEICAgICAgICA2NAorI2RlZmluZSBESURfU1RfU1RSX0NPTExJU0lPTlMgICAgIDY1CisjZGVmaW5lIERJRF9TVF9TVFJfRk9VTkQgICAgICAgICAgNjYKKyNkZWZpbmUgRElEX1NUX1NUUl9GT1VORF9CWVZBTFVFICA2NworCisjZGVmaW5lIERJRF9TVF9SWF9DQUNIRUQgICAgICAgICAgNjgKKyNkZWZpbmUgRElEX1NUX1JYX1RBQkxFICAgICAgICAgICA2OQorI2RlZmluZSBESURfU1RfUlhfVEFCTEVfU0laRSAgICAgIDcwCisjZGVmaW5lIERJRF9TVF9SWF9SRVFVRVNUUyAgICAgICAgNzEKKyNkZWZpbmUgRElEX1NUX1JYX1JFUV9GT1VORCAgICAgICA3MgorI2RlZmluZSBESURfU1RfUlhfUkVRX0NPTEwgICAgICAgIDczCisKKyNkZWZpbmUgRElEX1NUX01CX0ZJTEUgICAgICAgICAgICA3NAorI2RlZmluZSBESURfU1RfTUJfU1dBUCAgICAgICAgICAgIDc1CisKKyNkZWZpbmUgRElEX1NUX0JPT1RfVElNRSAgICAgICAgICA3NgorCisjZGVmaW5lIERJRF9TVEFUVVNfTUFYICAgICAgICAgICAgNzcgLyogVG90YWwgbnVtYmVyIG9mIGVudHJpZXMgKi8KKworCisvKiBJbmRpY2VzIGludG8gdGhlIGFycmF5IHJlc3VsdGluZyBmcm9tIGRlYnVnX2luZm8oRElORk9fREFUQSwgRElEX1NXQVApCisgKi8KKworI2RlZmluZSBESURfU1dfUFJPR1MgICAgICAgICAgICAwCisjZGVmaW5lIERJRF9TV19QUk9HX1NJWkUgICAgICAgIDEKKyNkZWZpbmUgRElEX1NXX1BST0dfVU5TV0FQUEVEICAgMgorI2RlZmluZSBESURfU1dfUFJPR19VX1NJWkUgICAgICAzCisjZGVmaW5lIERJRF9TV19WQVJTICAgICAgICAgICAgIDQKKyNkZWZpbmUgRElEX1NXX1ZBUl9TSVpFICAgICAgICAgNQorI2RlZmluZSBESURfU1dfRlJFRSAgICAgICAgICAgICA2CisjZGVmaW5lIERJRF9TV19GUkVFX1NJWkUgICAgICAgIDcKKyNkZWZpbmUgRElEX1NXX0ZJTEVfU0laRSAgICAgICAgOAorI2RlZmluZSBESURfU1dfUkVVU0VEICAgICAgICAgICA5CisjZGVmaW5lIERJRF9TV19TRUFSQ0hFUyAgICAgICAgMTAKKyNkZWZpbmUgRElEX1NXX1NFQVJDSF9MRU4gICAgICAxMQorI2RlZmluZSBESURfU1dfRl9TRUFSQ0hFUyAgICAgIDEyCisjZGVmaW5lIERJRF9TV19GX1NFQVJDSF9MRU4gICAgMTMKKyNkZWZpbmUgRElEX1NXX0NPTVBBQ1QgICAgICAgICAxNAorI2RlZmluZSBESURfU1dfUkVDWUNMRV9GUkVFICAgIDE1CisKKyNkZWZpbmUgRElEX1NXQVBfTUFYICAgICAgICAgICAxNgorCisKKy8qIEluZGljZXMgaW50byB0aGUgYXJyYXkgcmVzdWx0aW5nIGZyb20gZGVidWdfaW5mbyhESU5GT19EQVRBLCBESURfTUVNT1JZKQorICovCisKKyNkZWZpbmUgRElEX01FTV9OQU1FICAgICAgICAgICAgMAorI2RlZmluZSBESURfTUVNX1NCUksgICAgICAgICAgICAxCisjZGVmaW5lIERJRF9NRU1fU0JSS19TSVpFICAgICAgIDIKKyNkZWZpbmUgRElEX01FTV9MQVJHRSAgICAgICAgICAgMworI2RlZmluZSBESURfTUVNX0xBUkdFX1NJWkUgICAgICA0CisjZGVmaW5lIERJRF9NRU1fTEZSRUUgICAgICAgICAgIDUKKyNkZWZpbmUgRElEX01FTV9MRlJFRV9TSVpFICAgICAgNgorI2RlZmluZSBESURfTUVNX0xXQVNURUQgICAgICAgICA3CisjZGVmaW5lIERJRF9NRU1fTFdBU1RFRF9TSVpFICAgIDgKKyNkZWZpbmUgRElEX01FTV9DSFVOSyAgICAgICAgICAgOQorI2RlZmluZSBESURfTUVNX0NIVU5LX1NJWkUgICAgIDEwCisjZGVmaW5lIERJRF9NRU1fU0xBQiAgICAgICAgICAgIChESURfTUVNX0NIVU5LKQorI2RlZmluZSBESURfTUVNX1NMQUJfU0laRSAgICAgICAoRElEX01FTV9DSFVOS19TSVpFKQorI2RlZmluZSBESURfTUVNX1NNQUxMICAgICAgICAgIDExCisjZGVmaW5lIERJRF9NRU1fU01BTExfU0laRSAgICAgMTIKKyNkZWZpbmUgRElEX01FTV9TRlJFRSAgICAgICAgICAxMworI2RlZmluZSBESURfTUVNX1NGUkVFX1NJWkUgICAgIDE0CisjZGVmaW5lIERJRF9NRU1fU1dBU1RFRCAgICAgICAgMTUKKyNkZWZpbmUgRElEX01FTV9TV0FTVEVEX1NJWkUgICAxNgorI2RlZmluZSBESURfTUVNX1NNQUxMX09WRVJIRUFEX1NJWkUgIChESURfTUVNX1NXQVNURURfU0laRSkKKyNkZWZpbmUgRElEX01FTV9NSU5DX0NBTExTICAgICAxNworI2RlZmluZSBESURfTUVNX01JTkNfU1VDQ0VTUyAgIDE5CisjZGVmaW5lIERJRF9NRU1fTUlOQ19TSVpFICAgICAgMTkKKyNkZWZpbmUgRElEX01FTV9QRVJNICAgICAgICAgICAyMAorI2RlZmluZSBESURfTUVNX1BFUk1fU0laRSAgICAgIDIxCisjZGVmaW5lIERJRF9NRU1fQ0xJQiAgICAgICAgICAgMjIKKyNkZWZpbmUgRElEX01FTV9DTElCX1NJWkUgICAgICAyMworI2RlZmluZSBESURfTUVNX09WRVJIRUFEICAgICAgIDI0CisjZGVmaW5lIERJRF9NRU1fQUxMT0NBVEVEICAgICAgMjUKKyNkZWZpbmUgRElEX01FTV9VU0VEICAgICAgICAgICAyNgorI2RlZmluZSBESURfTUVNX1RPVEFMX1VOVVNFRCAgIDI3CisjZGVmaW5lIERJRF9NRU1fREVGUkFHX0NBTExTICAgICAgICAgICAgIDI4CisjZGVmaW5lIERJRF9NRU1fREVGUkFHX0NBTExTX1JFUSAgICAgICAgIDI5CisjZGVmaW5lIERJRF9NRU1fU0xBQl9GUkVFICAgICAgICAgICAgICAgICAoRElEX01FTV9ERUZSQUdfQ0FMTFMpCisjZGVmaW5lIERJRF9NRU1fU0xBQl9GUkVFX1NJWkUgICAgICAgICAgICAoRElEX01FTV9ERUZSQUdfQ0FMTFNfUkVRKQorI2RlZmluZSBESURfTUVNX0RFRlJBR19SRVFfU1VDQ0VTUyAgICAgICAzMAorI2RlZmluZSBESURfTUVNX0RFRlJBR19CTE9DS1NfSU5TUEVDVEVEICAzMQorI2RlZmluZSBESURfTUVNX0RFRlJBR19CTE9DS1NfTUVSR0VEICAgICAzMgorI2RlZmluZSBESURfTUVNX0RFRlJBR19CTE9DS1NfUkVTVUxUICAgICAzMworI2RlZmluZSBESURfTUVNX0FWTF9OT0RFUyAgICAgIDM0CisjZGVmaW5lIERJRF9NRU1fRVhUX1NUQVRJU1RJQ1MgMzUKKworI2RlZmluZSBESURfTUVNT1JZX01BWCAgICAgICAgIDM2CisKKy8qIEluZGljZXMgaW50byB0aGUgc3ViYXJyYXlzIG9mIERJRF9NRU1fRVhUX1NUQVRJU1RJQ1MgKGlmIGdpdmVuKSAqLworCisjZGVmaW5lIERJRF9NRU1fRVNfTUFYX0FMTE9DICAgMAorI2RlZmluZSBESURfTUVNX0VTX0NVUl9BTExPQyAgIDEKKyNkZWZpbmUgRElEX01FTV9FU19NQVhfRlJFRSAgICAyCisjZGVmaW5lIERJRF9NRU1fRVNfQ1VSX0ZSRUUgICAgMworI2RlZmluZSBESURfTUVNX0VTX0FWR19YQUxMT0MgIDQKKyNkZWZpbmUgRElEX01FTV9FU19BVkdfWEZSRUUgICA1CisjZGVmaW5lIERJRF9NRU1fRVNfRlVMTF9TTEFCUyAgNgorI2RlZmluZSBESURfTUVNX0VTX0ZSRUVfU0xBQlMgIDcKKyNkZWZpbmUgRElEX01FTV9FU19UT1RBTF9TTEFCUyA4CisKKyNkZWZpbmUgRElEX01FTV9FU19NQVggIDkKKworI2VuZGlmIC8qIExQQ19ERUJVR19JTkZPX0hfICovCmRpZmYgLS1naXQgYS9zeXMvZGVidWdfbWVzc2FnZS5oIGIvc3lzL2RlYnVnX21lc3NhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTk0NGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL2RlYnVnX21lc3NhZ2UuaApAQCAtMCwwICsxLDE4IEBACisjaWZuZGVmIExQQ19ERUJVR19NRVNTQUdFX0hfCisjZGVmaW5lIExQQ19ERUJVR19NRVNTQUdFX0hfIDEKKworLyogRGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgdGhlIGRlYnVnX21lc3NhZ2UoKSAqLworCisjZGVmaW5lIERNU0dfREVGQVVMVCAwICAgICAgICAgLyogbG9nIHRvIHN0ZG91dCBhbmQgLmRlYnVnLmxvZyAqLworI2RlZmluZSBETVNHX1NURE9VVCAgKDEgPDwgMCkgIC8qIGxvZyB0byBzdGRvdXQgKi8KKyNkZWZpbmUgRE1TR19TVERFUlIgICgxIDw8IDEpICAvKiBsb2cgdG8gc3RkZXJyICovCisjZGVmaW5lIERNU0dfTE9HRklMRSAoMSA8PCAyKSAgLyogbG9nIHRvIC5kZWJ1Zy5sb2cgKi8KKworI2RlZmluZSBETVNHX1NUQU1QICAgKDEgPDwgMykgIC8qIFByZXBlbmQgdGhlIHRpbWVzdGFtcCAqLworCisvKiBEZXJpdmVkIG1hY3JvcyAqLworCisjZGVmaW5lIERNU0dfVEFSR0VUIChETVNHX1NURE9VVHxETVNHX1NUREVSUnxETVNHX0xPR0ZJTEUpCisgIC8qIE1hc2sgZm9yIGFsbCB0YXJnZXQgYml0ZmxhZ3MgKi8KKworI2VuZGlmIC8qIExQQ19ERUJVR19NRVNTQUdFX0hfICovCmRpZmYgLS1naXQgYS9zeXMvZGVmaW5lcy5oIGIvc3lzL2RlZmluZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODRiNjZmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL2RlZmluZXMuaApAQCAtMCwwICsxLDYzIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gZGVmaW5lcy5oIC0tIE51ZXR6bGljaGUgdW5kIG9mdCBnZWJyYXVjaHRlIERlZmluaXRpb25lbgorLy8KKy8vICRJZDogZGVmaW5lcy5oIDcyNjUgMjAwOS0wOC0yMSAxODoxMzoyMlogWmVzc3RyYSAkCisKKyNpZm5kZWYgX0RFRklORVNfSF8KKyNkZWZpbmUgX0RFRklORVNfSF8KKworLy8gZGVmaW5lcy5oIGRhcmYgbGVpZGVyIGtlaW5lIFN0YW5kYXJkLUluY2x1ZGV2ZXJ6ZWljaG5pc3NlIGJlbnV0emVuLCB3ZWlscworLy8gZXMgdm9tIE1hc3RlciBzZWxiZXIgYmVudXR6dCB3aXJkLgorI2luY2x1ZGUgIi9zeXMvYnJlYWtfc3RyaW5nLmgiCisKKyNpZm5kZWYgTUUKKyNkZWZpbmUgTUUgdGhpc19vYmplY3QoKQorI2VuZGlmCisKKyNpZm5kZWYgUEwKKyNkZWZpbmUgUEwgdGhpc19wbGF5ZXIoKQorI2VuZGlmCisKKyNpZm5kZWYgUlBMCisjZGVmaW5lIFJQTCB0aGlzX2ludGVyYWN0aXZlKCkKKyNlbmRpZgorCisjaWZuZGVmIENBUAorI2RlZmluZSBDQVAoc3RyKSBjYXBpdGFsaXplKHN0cikKKyNlbmRpZgorCisjaWZuZGVmIFFQUAorI2RlZmluZSBRUFAgUXVlcnlQb3NzUHJvbm91bgorI2VuZGlmCisKKyNkZWZpbmUgUkVBTF9VSUQoeCkgICAoZXhwbG9kZShnZXR1aWQoeCksICAiLiIpWzwxXSkKKyNkZWZpbmUgUkVBTF9FVUlEKHgpICAoZXhwbG9kZShnZXRldWlkKHgpLCAiLiIpWzwxXSkKKworLy8gb2Jzb2xldCwgbnVyIGF1cyBLb21wYXRpYmlsaXRhZXRzZ3J1ZW5kZW4gbm9jaCB2b3JoYW5kZW4KKyNpZm5kZWYgSVNfQ0xPTkUKKyNkZWZpbmUgSVNfQ0xPTkUob2IpIChjbG9uZXAob2IpKQorI2VuZGlmCisKKy8vIG9ic29sZXQsIG51ciBhdXMgS29tcGF0aWJpbGl0YWV0c2dydWVuZGVuIG5vY2ggdm9yaGFuZGVuCisjaWZuZGVmIElTX0JMVUUKKyNkZWZpbmUgSVNfQkxVRShvYikgKCFjbG9uZXAob2IpKQorI2VuZGlmCisKKyNpZm5kZWYgQkxVRV9OQU1FCisjZGVmaW5lIEJMVUVfTkFNRShvYikgbG9hZF9uYW1lKG9iKQorLy8jZGVmaW5lIEJMVUVfTkFNRShvYikgKGV4cGxvZGUob2JqZWN0X25hbWUob2IpLCIjIilbMF0pCisjZW5kaWYKKworI2lmbmRlZiBJU19QQVJBCisjZGVmaW5lIElTX1BBUkEob2IpIChzaXplb2YocmVnZXhwKCh7dG9fc3RyaW5nKG9iKX0pLCJcXF5bMS05XVswLTldKiQiKSkpCisKKyNlbmRpZgorCisvLyBvYnNvbGV0LCBudXIgYXVzIEtvbXBhdGliaWxpdGFldHNncnVlbmRlbiBub2NoIHZvcmhhbmRlbgorI2lmbmRlZiBNQVgKKyNkZWZpbmUgTUFYKGEsYikgbWF4KGEsYikKKyNlbmRpZgorCisjZW5kaWYgLyogX0RFRklORVNfSF8gKi8KKwpkaWZmIC0tZ2l0IGEvc3lzL2RlZnVlbC5oIGIvc3lzL2RlZnVlbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZjJmMGQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvZGVmdWVsLmgKQEAgLTAsMCArMSwzOSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGRlZnVlbC5oIC0tIEhlYWRlciBmdWVyIGRlZnVlbC5jIChFbnR0YW5rZW4pCisvLworLy8gJElkOiBkZWZ1ZWwuaCx2IDEuMyAyMDAzLzExLzExIDEwOjU5OjA2IE11YWRpYiBFeHAgJAorCisjaWZuZGVmIF9fREVGVUVMX0hfXworI2RlZmluZSBfX0RFRlVFTF9IX18KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICBTdGF0aXN0aWsKKyNkZWZpbmUgRlVFTFNUQVQJIi9kL2Vyem1hZ2llci9tdWFkaWIvZnVlbHN0YXQvZnVlbHN0YXQiICAgCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICBMaW1pdCAtICNkZWZpbmVzCisvLyAgIEFiIHdpZXZpZWwga2FubiBtYW4gdWViZXJoYXVwdCBlbnR0YW5rZW4/IChyYXNzZW5hYmhhZW5naWcpCisjZGVmaW5lICAgUF9ERUZVRUxfTElNSVRfRk9PRCAgICAgICAiZGVmdWVsX2xpbWl0X2Zvb2QiCisjZGVmaW5lICAgUF9ERUZVRUxfTElNSVRfRFJJTksgICAgICAiZGVmdWVsX2xpbWl0X2RyaW5rIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgIFRpbWUgLSAjZGVmaW5lcworLy8gICBXaWVsYW5nZSBtdXNzIG1hbiB6d2lzY2hlbiBkZW0gRW50dGFua2VuIHZlcmRhdWVuPyAocmFzc2VuYWJoYWVuZ2lnKQorI2RlZmluZSAgIFBfREVGVUVMX1RJTUVfRk9PRCAgICAgICAgImRlZnVlbF90aW1lX2Zvb2QiCisjZGVmaW5lICAgUF9ERUZVRUxfVElNRV9EUklOSyAgICAgICAiZGVmdWVsX3RpbWVfZHJpbmsiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgQW1vdW50IC0gI2RlZmluZXMKKy8vICAgV2lldmllbCBQcm96ZW50IGRlciBha3R1ZWxsZW4gUF9GT09EL1BfRFJJTksgV2VydGUga2FubiBtYW4gZW50dGFua2VuPworLy8gICAocmFzc2VuYWJoYWVuaGlnKQorI2RlZmluZSAgIFBfREVGVUVMX0FNT1VOVF9GT09EICAgICAgImRlZnVlbF9hbW91bnRfZm9vZCIKKyNkZWZpbmUgICBQX0RFRlVFTF9BTU9VTlRfRFJJTksgICAgICJkZWZ1ZWxfYW1vdW50X2RyaW5rIgorCisvLyBSZXR1cm53ZXJ0ZSBkZXIgenUgdmVyd2VuZGV0ZW4gSW50ZXJmYWNlcworI2RlZmluZSAgIE5PX0RFRlVFTCAgICAgICAgICAgICAgICAgIDAgIC8vIGxlZXIKKyNkZWZpbmUgICBERUZVRUxfVE9PX0xPVyAgICAgICAgICAgIC0xICAvLyBuaWNodCBsZWVyLCBhYmVyIHp1IHdlbmlnCisjZGVmaW5lICAgREVGVUVMX1RPT19TT09OICAgICAgICAgICAtMiAgLy8gbGV0enRlcyBlbnRhbmtlbiBpc3Qgbm9jaCBuaWNodCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsYW5nZSBnZW51ZyBoZXIKKyNlbmRpZiAvLyBfX0RFRlVFTF9IX18KZGlmZiAtLWdpdCBhL3N5cy9kb29ycm9vbS5oIGIvc3lzL2Rvb3Jyb29tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY2MzE0MwotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9kb29ycm9vbS5oCkBAIC0wLDAgKzEsNzMgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBkb29ycm9vbS5oIC0tIG5ldyBkb29ycywgbWFuYWdlZCBieSBkb29ybWFzdGVyCisvLworLy8gJElkOiBkb29ycm9vbS5oIDkxMjggMjAxNS0wMS0yNiAxNzo0MjoyMVogQXJhdGhvcm4gJAorCisjaWZuZGVmIF9ET09SUk9PTV9IXworI2RlZmluZSBfRE9PUlJPT01fSF8KKworI2RlZmluZSBET09SX01BU1RFUiAiL29iai9kb29ybWFzdGVyIgorI2RlZmluZSBQX0RPT1JfSU5GT1MgImRvb3JfaW5mb3MiICAgLy8gSW5mb3JtYXRpb25lbgorCisjZGVmaW5lIERPT1JfT1BFTiAgICAgMHgwMSAvLyBUdWVyIGluaXRpYWwgb2ZmZW4KKyNkZWZpbmUgRE9PUl9DTE9TRUQgICAweDAyIC8vIFR1ZXIgaW5pdGlhbCB6dQorI2RlZmluZSBET09SX05FRURLRVkgIDB4MDggLy8gTWFuIGJyYXVjaHQgZWluZW4gU2NobHVlc3NlbCB6dW0gT2VmZm5lbgorI2RlZmluZSBET09SX0NMT1NFS0VZIDB4MTAgLy8gTWFuIGJyYXVjaHQgZWluZW4gU2NobHVlc3NlbCB6dW0gU2NobGllc3NlbgorI2RlZmluZSBET09SX1JFU0VUX0NMIDB4MjAgLy8gVHVlciBzY2hsaWVzc3Qgc2ljaCBiZWkgamVkZW0gcmVzZXQoKQorI2RlZmluZSBET09SX1JFU0VUX09QIDB4NDAgLy8gVHVlciBvZWZmbmV0IHNpY2ggYmVpIGplZGVtIHJlc2V0KCkKKworI2RlZmluZSBEX0RFU1QgMAorI2RlZmluZSBEX0NNRFMgMQorI2RlZmluZSBEX0lEUyAyCisKKy8vIHByb3BlcnRpZXMKKy8vIEFiIGhpZXIgZGllIGFlbmRlcmJhcmVuIEVpZ2Vuc2NoYWZ0ZW4gZGVyIFR1ZXIKKyNkZWZpbmUgRF9GTEFHUyAzCisjZGVmaW5lIERfTE9ORyA0CisjZGVmaW5lIERfU0hPUlQgNQorI2RlZmluZSBEX05BTUUgNgorI2RlZmluZSBEX0dFTkRFUiA3CisjZGVmaW5lIERfRlVOQyA4CisvLyBGdW5rdGlvbiwgZGllIFZPUiBkZW0gRHVyY2hzY2hyZWl0ZW4gZGVyIFR1ZXIgYXVmZ2VydWZlbiB3aXJkIChpbSBTdGFydHJhdW0pCisjZGVmaW5lIERfTVNHUyA5CisvLyBNZXNzYWdlcyBmdWVyIE1vdmUKKyNkZWZpbmUgRF9GVU5DMiAxMAorLy8gRnVua3Rpb24sIGRpZSBOQUNIIGRlbSBEdXJjaHNjaHJlaXRlbiBkZXIgVHVlciBhdWZnZXJ1ZmVuIHdpcmQgKGltIFppZWxyYXVtKQorI2RlZmluZSBEX1RFU1RGVU5DIDExCisvLyBGdW5rdGlvbiwgZGllIHRlc3RldCwgb2IgZGllIFR1ZXIgZHVyY2hzY2hyaXR0ZW4gd2VyZGVuIGRhcmYgKGltIFN0YXJ0cmF1bSkKKyNkZWZpbmUgRF9SRVNFVF9NU0cgMTIKKy8vIE1lbGR1bmcgYmVpbSBUdWVyLVJlc2V0ICh0dWVyLT5uYW1lKFdFUiwwKStEX1JFU0VUX01TRykuCisjZGVmaW5lIERfT1BFTl9XSVRIX01PVkUgMTMKKy8vIEZhbGxzIGdlc2V0enQgd2lyZCBkaWUgVHVlciBhdWNoIG1pdCBkZW0gQmV3ZWd1bmdzYmVmZWhsIGdlb2VmZm5ldAorLy8gdW5kIGR1cmNoc2Nocml0dGVuLCBmYWxscyBvZWZmbmVuIGVyZm9sZ3JlaWNoCisKKyNkZWZpbmUgRF9NSU5QUk9QUyAzCisjZGVmaW5lIERfTUFYUFJPUFMgMTMKKworI2RlZmluZSBEX1NUQVRVU19MT0NLRUQgLTIKKyNkZWZpbmUgRF9TVEFUVVNfQ0xPU0VEIC0xCisjZGVmaW5lIERfU1RBVFVTX09QRU4gICAgMQorCisjZW5kaWYgLyogX0RPT1JST09NX0hfICovCisKKyNpZmRlZiBORUVEX1BST1RPVFlQRVMKKworI2lmbmRlZiBfX0RPT1JST09NX0hfUFJPVE9fXworI2RlZmluZSBfX0RPT1JST09NX0hfUFJPVE9fXworCisvLyBwcm90b3R5cGVzCittYXBwaW5nIFF1ZXJ5QWxsRG9vcnMoKTsKK3ZhcmFyZ3MgaW50IE5ld0Rvb3Ioc3RyaW5nfHN0cmluZyogY21kcywgc3RyaW5nIGRlc3QsIHN0cmluZ3xzdHJpbmcqIGlkcywKKyAgICAgICAgICAgICAgICAgICAgbWFwcGluZ3w8aW50fHN0cmluZ3xzdHJpbmcqPiogcHJvcHMpOwordm9pZCAgICBpbml0X2Rvb3JzICgpOworc3RyaW5nICBsb29rX2Rvb3JzICgpOwordm9pZCAgICByZXNldF9kb29ycyAoKTsKK3ZhcmFyZ3MgaW50IGdvX2Rvb3IgKHN0cmluZyBzdHIpOworLy9pbnQgICAgIG9lZmZuZW4gKHN0cmluZyBzdHIpOworLy9pbnQgICAgIHNjaGxpZXNzZW4gKHN0cmluZyBzdHIpOworaW50ICAgICBzZXRfZG9vcnMgKHN0cmluZyAqY21kcywgaW50IG9wZW4pOwordmFyYXJncyBzdHJpbmcgR2V0RXhpdHMob2JqZWN0IHZpZXdlcik7IAorCisjZW5kaWYgLyogX19ET09SUk9PTV9IX1BST1RPX18gKi8KKyNlbmRpZiAvKiBORUVEX1BST1RPVFlQRVMgKi8KZGlmZiAtLWdpdCBhL3N5cy9kcml2ZXJfaG9vay5oIGIvc3lzL2RyaXZlcl9ob29rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI5N2Y4MAotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9kcml2ZXJfaG9vay5oCkBAIC0wLDAgKzEsMzYgQEAKKyNpZm5kZWYgTFBDX0RSSVZFUl9IT09LX0hfCisjZGVmaW5lIExQQ19EUklWRVJfSE9PS19IXyAxCisKKy8qIC0tLSBEcml2ZXIgSG9va3MgLS0tCisgKi8KKworI2RlZmluZSBIX01PVkVfT0JKRUNUMCAgICAgICAgICAgMAorI2RlZmluZSBIX01PVkVfT0JKRUNUMSAgICAgICAgICAgMQorI2RlZmluZSBIX0xPQURfVUlEUyAgICAgICAgICAgICAgMgorI2RlZmluZSBIX0NMT05FX1VJRFMgICAgICAgICAgICAgMworI2RlZmluZSBIX0NSRUFURV9TVVBFUiAgICAgICAgICAgNAorI2RlZmluZSBIX0NSRUFURV9PQiAgICAgICAgICAgICAgNQorI2RlZmluZSBIX0NSRUFURV9DTE9ORSAgICAgICAgICAgNgorI2RlZmluZSBIX1JFU0VUICAgICAgICAgICAgICAgICAgNworI2RlZmluZSBIX0NMRUFOX1VQICAgICAgICAgICAgICAgOAorI2RlZmluZSBIX01PRElGWV9DT01NQU5EICAgICAgICAgOQorI2RlZmluZSBIX05PVElGWV9GQUlMICAgICAgICAgICAxMAorI2RlZmluZSBIX05PX0lQQ19TTE9UICAgICAgICAgICAxMQorI2RlZmluZSBIX0lOQ0xVREVfRElSUyAgICAgICAgICAxMgorI2RlZmluZSBIX1RFTE5FVF9ORUcgICAgICAgICAgICAxMworI2RlZmluZSBIX05PRUNITyAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBIX0VSUV9TVE9QICAgICAgICAgICAgICAxNQorI2RlZmluZSBIX01PRElGWV9DT01NQU5EX0ZOQU1FICAxNgorI2RlZmluZSBIX0NPTU1BTkQgICAgICAgICAgICAgICAxNworI2RlZmluZSBIX1NFTkRfTk9USUZZX0ZBSUwgICAgICAxOAorI2RlZmluZSBIX0FVVE9fSU5DTFVERSAgICAgICAgICAxOQorI2RlZmluZSBIX0RFRkFVTFRfTUVUSE9EICAgICAgICAyMAorI2RlZmluZSBIX0RFRkFVTFRfUFJPTVBUICAgICAgICAyMQorI2RlZmluZSBIX1BSSU5UX1BST01QVCAgICAgICAgICAyMgorI2RlZmluZSBIX1JFR0VYUF9QQUNLQUdFICAgICAgICAyMworI2RlZmluZSBIX01TR19ESVNDQVJERUQgICAgICAgICAyNAorCisjZGVmaW5lIE5VTV9EUklWRVJfSE9PS1MgICAgICAgIDI1ICAvKiBOdW1iZXIgb2YgaG9va3MgKi8KKworI2VuZGlmIC8qIExQQ19EUklWRVJfSE9PS18gKi8KKwpkaWZmIC0tZ2l0IGEvc3lzL2RyaXZlcl9pbmZvLmggYi9zeXMvZHJpdmVyX2luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzY5NzVjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL2RyaXZlcl9pbmZvLmgKQEAgLTAsMCArMSwyMzcgQEAKKyNpZm5kZWYgTFBDX0RSSVZFUl9JTkZPX0hfCisjZGVmaW5lIExQQ19EUklWRVJfSU5GT19IXworCisvKiBEZWZpbml0aW9uIG9mIGFyZ3VtZW50IHZhbHVlcyBmb3IgZHJpdmVyX2luZm8oKQorICovCisKKyNpbmNsdWRlICJjb25maWd1cmF0aW9uLmgiCisKKy8qIERyaXZlciBFbnZpcm9ubWVudCAqLworI2RlZmluZSBESV9CT09UX1RJTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMQorCisvKiBMUEMgUnVudGltZSBzdGF0dXMgKi8KKyNkZWZpbmUgRElfQ1VSUkVOVF9SVU5USU1FX0xJTUlUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTAKKyNkZWZpbmUgRElfRVZBTF9OVU1CRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTEKKworLyogTmV0d29yayBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIERJX01VRF9QT1JUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTIwCisjZGVmaW5lIERJX1VEUF9QT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTIxCisKKy8qIE1lbW9yeSBtYW5hZ2VtZW50ICovCisjZGVmaW5lIERJX01FTU9SWV9SRVNFUlZFX1VTRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTMwCisjZGVmaW5lIERJX01FTU9SWV9SRVNFUlZFX01BU1RFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTMxCisjZGVmaW5lIERJX01FTU9SWV9SRVNFUlZFX1NZU1RFTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTMyCisKKy8qIFRyYWNlcyAqLworI2RlZmluZSBESV9UUkFDRV9DVVJSRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00MAorI2RlZmluZSBESV9UUkFDRV9DVVJSRU5UX0RFUFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00MQorI2RlZmluZSBESV9UUkFDRV9DVVJSRU5UX0FTX1NUUklORyAgICAgICAgICAgICAgICAgICAgICAgICAgIC00MgorI2RlZmluZSBESV9UUkFDRV9MQVNUX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00MworI2RlZmluZSBESV9UUkFDRV9MQVNUX0VSUk9SX0FTX1NUUklORyAgICAgICAgICAgICAgICAgICAgICAgIC00NAorI2RlZmluZSBESV9UUkFDRV9MQVNUX1VOQ0FVR0hUX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgIC00NQorI2RlZmluZSBESV9UUkFDRV9MQVNUX1VOQ0FVR0hUX0VSUk9SX0FTX1NUUklORyAgICAgICAgICAgICAgIC00NgorCisvKiBMUEMgUnVudGltZSBzdGF0aXN0aWNzICovCisjZGVmaW5lIERJX05VTV9GVU5DVElPTl9OQU1FX0NBTExTICAgICAgICAgICAgICAgICAgICAgICAgICAtMTAwCisjZGVmaW5lIERJX05VTV9GVU5DVElPTl9OQU1FX0NBTExfSElUUyAgICAgICAgICAgICAgICAgICAgICAtMTAxCisjZGVmaW5lIERJX05VTV9GVU5DVElPTl9OQU1FX0NBTExfTUlTU0VTICAgICAgICAgICAgICAgICAgICAtMTAyCisKKyNkZWZpbmUgRElfTlVNX09CSkVDVFNfTEFTVF9QUk9DRVNTRUQgICAgICAgICAgICAgICAgICAgICAgIC0xMDMKKworI2RlZmluZSBESV9OVU1fSEVBUlRCRUFUX1RPVEFMX0NZQ0xFUyAgICAgICAgICAgICAgICAgICAgICAgLTEwNAorI2RlZmluZSBESV9OVU1fSEVBUlRCRUFUX0FDVElWRV9DWUNMRVMgICAgICAgICAgICAgICAgICAgICAgLTEwNQorI2RlZmluZSBESV9OVU1fSEVBUlRCRUFUU19MQVNUX1BST0NFU1NFRCAgICAgICAgICAgICAgICAgICAgLTEwNgorCisjZGVmaW5lIERJX05VTV9TVFJJTkdfVEFCTEVfU1RSSU5HU19BRERFRCAgICAgICAgICAgICAgICAgICAtMTEwCisjZGVmaW5lIERJX05VTV9TVFJJTkdfVEFCTEVfU1RSSU5HU19SRU1PVkVEICAgICAgICAgICAgICAgICAtMTExCisjZGVmaW5lIERJX05VTV9TVFJJTkdfVEFCTEVfTE9PS1VQU19CWV9WQUxVRSAgICAgICAgICAgICAgICAtMTEyCisjZGVmaW5lIERJX05VTV9TVFJJTkdfVEFCTEVfTE9PS1VQU19CWV9JTkRFWCAgICAgICAgICAgICAgICAtMTEzCisjZGVmaW5lIERJX05VTV9TVFJJTkdfVEFCTEVfTE9PS1VQX1NURVBTX0JZX1ZBTFVFICAgICAgICAgICAtMTE0CisjZGVmaW5lIERJX05VTV9TVFJJTkdfVEFCTEVfTE9PS1VQX1NURVBTX0JZX0lOREVYICAgICAgICAgICAtMTE1CisjZGVmaW5lIERJX05VTV9TVFJJTkdfVEFCTEVfSElUU19CWV9WQUxVRSAgICAgICAgICAgICAgICAgICAtMTE2CisjZGVmaW5lIERJX05VTV9TVFJJTkdfVEFCTEVfSElUU19CWV9JTkRFWCAgICAgICAgICAgICAgICAgICAtMTE3CisjZGVmaW5lIERJX05VTV9TVFJJTkdfVEFCTEVfQ09MTElTSU9OUyAgICAgICAgICAgICAgICAgICAgICAtMTE4CisKKyNkZWZpbmUgRElfTlVNX1JFR0VYX0xPT0tVUFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMjAKKyNkZWZpbmUgRElfTlVNX1JFR0VYX0xPT0tVUF9ISVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMjEKKyNkZWZpbmUgRElfTlVNX1JFR0VYX0xPT0tVUF9NSVNTRVMgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMjIKKyNkZWZpbmUgRElfTlVNX1JFR0VYX0xPT0tVUF9DT0xMSVNJT05TICAgICAgICAgICAgICAgICAgICAgIC0xMjMKKworLyogTmV0d29yayBzdGF0aXN0aWNzICovCisjZGVmaW5lIERJX05VTV9NRVNTQUdFU19PVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMjAwCisjZGVmaW5lIERJX05VTV9QQUNLRVRTX09VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMjAxCisjZGVmaW5lIERJX05VTV9QQUNLRVRTX0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMjAyCisjZGVmaW5lIERJX1NJWkVfUEFDS0VUU19PVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMjAzCisjZGVmaW5lIERJX1NJWkVfUEFDS0VUU19JTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMjA0CisKKy8qIExvYWQgKi8KKyNkZWZpbmUgRElfTE9BRF9BVkVSQUdFX0NPTU1BTkRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0zMDAKKyNkZWZpbmUgRElfTE9BRF9BVkVSQUdFX0xJTkVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0zMDEKKyNkZWZpbmUgRElfTE9BRF9BVkVSQUdFX1BST0NFU1NFRF9PQkpFQ1RTICAgICAgICAgICAgICAgICAgIC0zMDIKKyNkZWZpbmUgRElfTE9BRF9BVkVSQUdFX1BST0NFU1NFRF9PQkpFQ1RTX1JFTEFUSVZFICAgICAgICAgIC0zMDMKKyNkZWZpbmUgRElfTE9BRF9BVkVSQUdFX1BST0NFU1NFRF9IRUFSVEJFQVRTX1JFTEFUSVZFICAgICAgIC0zMDQKKworLyogTWVtb3J5IHVzZSBzdGF0aXN0aWNzICovCisjZGVmaW5lIERJX05VTV9BQ1RJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDAwCisjZGVmaW5lIERJX05VTV9DQUxMT1VUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDAxCisjZGVmaW5lIERJX05VTV9IRUFSVEJFQVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDAyCisjZGVmaW5lIERJX05VTV9TSEFET1dTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDAzCisjZGVmaW5lIERJX05VTV9PQkpFQ1RTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDA0CisjZGVmaW5lIERJX05VTV9PQkpFQ1RTX1NXQVBQRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDA1CisjZGVmaW5lIERJX05VTV9PQkpFQ1RTX0lOX0xJU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDA2CisjZGVmaW5lIERJX05VTV9PQkpFQ1RTX0lOX1RBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDA3CisjZGVmaW5lIERJX05VTV9PQkpFQ1RTX0RFU1RSVUNURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDA4CisjZGVmaW5lIERJX05VTV9PQkpFQ1RTX05FV0xZX0RFU1RSVUNURUQgICAgICAgICAgICAgICAgICAgICAtNDA5CisjZGVmaW5lIERJX05VTV9PQkpFQ1RfVEFCTEVfU0xPVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDEwCisjZGVmaW5lIERJX05VTV9QUk9HUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDExCisjZGVmaW5lIERJX05VTV9QUk9HU19TV0FQUEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDEyCisjZGVmaW5lIERJX05VTV9QUk9HU19VTlNXQVBQRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDEzCisjZGVmaW5lIERJX05VTV9BUlJBWVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDE0CisjZGVmaW5lIERJX05VTV9NQVBQSU5HUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDE1CisjZGVmaW5lIERJX05VTV9NQVBQSU5HU19DTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDE2CisjZGVmaW5lIERJX05VTV9NQVBQSU5HU19IQVNIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDE3CisjZGVmaW5lIERJX05VTV9NQVBQSU5HU19IWUJSSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDE4CisjZGVmaW5lIERJX05VTV9TVFJVQ1RTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDE5CisjZGVmaW5lIERJX05VTV9TVFJVQ1RfVFlQRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDIwCisjZGVmaW5lIERJX05VTV9WSVJUVUFMX1NUUklOR1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDIxCisjZGVmaW5lIERJX05VTV9TVFJJTkdTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDIyCisjZGVmaW5lIERJX05VTV9TVFJJTkdTX1RBQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDIzCisjZGVmaW5lIERJX05VTV9TVFJJTkdTX1VOVEFCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDI0CisjZGVmaW5lIERJX05VTV9TVFJJTkdfVEFCTEVfU0xPVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDI1CisjZGVmaW5lIERJX05VTV9TVFJJTkdfVEFCTEVfU0xPVFNfVVNFRCAgICAgICAgICAgICAgICAgICAgICAtNDI2CisjZGVmaW5lIERJX05VTV9SRUdFWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDI3CisjZGVmaW5lIERJX05VTV9SRUdFWF9UQUJMRV9TTE9UUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDI4CisKKyNkZWZpbmUgRElfU0laRV9BQ1RJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NTAKKyNkZWZpbmUgRElfU0laRV9DQUxMT1VUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NTEKKyNkZWZpbmUgRElfU0laRV9IRUFSVEJFQVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NTIKKyNkZWZpbmUgRElfU0laRV9TSEFET1dTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NTMKKyNkZWZpbmUgRElfU0laRV9PQkpFQ1RTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NTQKKyNkZWZpbmUgRElfU0laRV9PQkpFQ1RTX1NXQVBQRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NTUKKyNkZWZpbmUgRElfU0laRV9PQkpFQ1RfVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NTYKKyNkZWZpbmUgRElfU0laRV9QUk9HUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NTcKKyNkZWZpbmUgRElfU0laRV9QUk9HU19TV0FQUEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NTgKKyNkZWZpbmUgRElfU0laRV9QUk9HU19VTlNXQVBQRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NTkKKyNkZWZpbmUgRElfU0laRV9BUlJBWVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NjAKKyNkZWZpbmUgRElfU0laRV9NQVBQSU5HUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NjEKKyNkZWZpbmUgRElfU0laRV9TVFJVQ1RTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NjIKKyNkZWZpbmUgRElfU0laRV9TVFJVQ1RfVFlQRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NjMKKyNkZWZpbmUgRElfU0laRV9TVFJJTkdTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NjQKKyNkZWZpbmUgRElfU0laRV9TVFJJTkdTX1RBQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NjUKKyNkZWZpbmUgRElfU0laRV9TVFJJTkdTX1VOVEFCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NjYKKyNkZWZpbmUgRElfU0laRV9TVFJJTkdfVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NjcKKyNkZWZpbmUgRElfU0laRV9TVFJJTkdfT1ZFUkhFQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NjgKKyNkZWZpbmUgRElfU0laRV9SRUdFWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NjkKKyNkZWZpbmUgRElfU0laRV9CVUZGRVJfRklMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NzAKKyNkZWZpbmUgRElfU0laRV9CVUZGRVJfU1dBUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NzEKKworLyogTWVtb3J5IHN3YXBwZXIgc3RhdGlzdGljcyAqLworI2RlZmluZSBESV9OVU1fU1dBUF9CTE9DS1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTUwMAorI2RlZmluZSBESV9OVU1fU1dBUF9CTE9DS1NfRlJFRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTUwMQorI2RlZmluZSBESV9OVU1fU1dBUF9CTE9DS1NfUkVVU0VfTE9PS1VQUyAgICAgICAgICAgICAgICAgICAgLTUwMgorI2RlZmluZSBESV9OVU1fU1dBUF9CTE9DS1NfUkVVU0VfTE9PS1VQX1NURVBTICAgICAgICAgICAgICAgLTUwMworI2RlZmluZSBESV9OVU1fU1dBUF9CTE9DS1NfRlJFRV9MT09LVVBTICAgICAgICAgICAgICAgICAgICAgLTUwNQorI2RlZmluZSBESV9OVU1fU1dBUF9CTE9DS1NfRlJFRV9MT09LVVBfU1RFUFMgICAgICAgICAgICAgICAgLTUwNgorI2RlZmluZSBESV9TSVpFX1NXQVBfQkxPQ0tTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTUwNworI2RlZmluZSBESV9TSVpFX1NXQVBfQkxPQ0tTX0ZSRUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTUwOAorI2RlZmluZSBESV9TSVpFX1NXQVBfQkxPQ0tTX1JFVVNFRCAgICAgICAgICAgICAgICAgICAgICAgICAgLTUwOQorI2RlZmluZSBESV9TV0FQX1JFQ1lDTEVfUEhBU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTUxMAorCisvKiBNZW1vcnkgYWxsb2NhdG9yIHN0YXRpc3RpY3MgKi8KKyNkZWZpbmUgRElfTUVNT1JZX0FMTE9DQVRPUl9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgIC02MDAKKworI2RlZmluZSBESV9OVU1fU1lTX0FMTE9DQVRFRF9CTE9DS1MgICAgICAgICAgICAgICAgICAgICAgICAgLTYxMAorI2RlZmluZSBESV9OVU1fTEFSR0VfQkxPQ0tTX0FMTE9DQVRFRCAgICAgICAgICAgICAgICAgICAgICAgLTYxMQorI2RlZmluZSBESV9OVU1fTEFSR0VfQkxPQ0tTX0ZSRUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYxMgorI2RlZmluZSBESV9OVU1fTEFSR0VfQkxPQ0tTX1dBU1RFICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYxMworI2RlZmluZSBESV9OVU1fU01BTExfQkxPQ0tTX0FMTE9DQVRFRCAgICAgICAgICAgICAgICAgICAgICAgLTYxNAorI2RlZmluZSBESV9OVU1fU01BTExfQkxPQ0tTX0ZSRUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYxNQorI2RlZmluZSBESV9OVU1fU01BTExfQkxPQ0tTX1dBU1RFICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYxNgorI2RlZmluZSBESV9OVU1fU01BTExfQkxPQ0tfQ0hVTktTICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYxNworI2RlZmluZSBESV9OVU1fVU5NQU5BR0VEX0JMT0NLUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYxOAorI2RlZmluZSBESV9OVU1fRlJFRV9CTE9DS1NfQVZMX05PREVTICAgICAgICAgICAgICAgICAgICAgICAgLTYxOQorCisjZGVmaW5lIERJX1NJWkVfU1lTX0FMTE9DQVRFRF9CTE9DS1MgICAgICAgICAgICAgICAgICAgICAgICAtNjMwCisjZGVmaW5lIERJX1NJWkVfTEFSR0VfQkxPQ0tTX0FMTE9DQVRFRCAgICAgICAgICAgICAgICAgICAgICAtNjMxCisjZGVmaW5lIERJX1NJWkVfTEFSR0VfQkxPQ0tTX0ZSRUUgICAgICAgICAgICAgICAgICAgICAgICAgICAtNjMyCisjZGVmaW5lIERJX1NJWkVfTEFSR0VfQkxPQ0tTX1dBU1RFICAgICAgICAgICAgICAgICAgICAgICAgICAtNjMzCisjZGVmaW5lIERJX1NJWkVfTEFSR0VfQkxPQ0tfT1ZFUkhFQUQgICAgICAgICAgICAgICAgICAgICAgICAtNjM0CisjZGVmaW5lIERJX1NJWkVfU01BTExfQkxPQ0tTX0FMTE9DQVRFRCAgICAgICAgICAgICAgICAgICAgICAtNjM1CisjZGVmaW5lIERJX1NJWkVfU01BTExfQkxPQ0tTX0ZSRUUgICAgICAgICAgICAgICAgICAgICAgICAgICAtNjM2CisjZGVmaW5lIERJX1NJWkVfU01BTExfQkxPQ0tTX1dBU1RFICAgICAgICAgICAgICAgICAgICAgICAgICAtNjM3CisjZGVmaW5lIERJX1NJWkVfU01BTExfQkxPQ0tfT1ZFUkhFQUQgICAgICAgICAgICAgICAgICAgICAgICAtNjM4CisjZGVmaW5lIERJX1NJWkVfU01BTExfQkxPQ0tfQ0hVTktTICAgICAgICAgICAgICAgICAgICAgICAgICAtNjM5CisjZGVmaW5lIERJX1NJWkVfVU5NQU5BR0VEX0JMT0NLUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNjQwCisjZGVmaW5lIERJX1NJWkVfTUVNT1JZX1VTRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNjQxCisjZGVmaW5lIERJX1NJWkVfTUVNT1JZX1VOVVNFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNjQyCisjZGVmaW5lIERJX1NJWkVfTUVNT1JZX09WRVJIRUFEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNjQzCisKKyNkZWZpbmUgRElfTlVNX0lOQ1JFTUVOVF9TSVpFX0NBTExTICAgICAgICAgICAgICAgICAgICAgICAgIC02NTAKKyNkZWZpbmUgRElfTlVNX0lOQ1JFTUVOVF9TSVpFX0NBTExfU1VDQ0VTU0VTICAgICAgICAgICAgICAgIC02NTEKKyNkZWZpbmUgRElfU0laRV9JTkNSRU1FTlRfU0laRV9DQUxMX0RJRkZTICAgICAgICAgICAgICAgICAgIC02NTIKKyNkZWZpbmUgRElfTlVNX1JFUExBQ0VNRU5UX01BTExPQ19DQUxMUyAgICAgICAgICAgICAgICAgICAgIC02NTMKKyNkZWZpbmUgRElfU0laRV9SRVBMQUNFTUVOVF9NQUxMT0NfQ0FMTFMgICAgICAgICAgICAgICAgICAgIC02NTQKKyNkZWZpbmUgRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQ0FMTFNfRlVMTCAgICAgICAgICAgIC02NTUKKyNkZWZpbmUgRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQ0FMTFNfVEFSR0VURUQgICAgICAgIC02NTYKKyNkZWZpbmUgRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQ0FMTF9UQVJHRVRfSElUUyAgICAgIC02NTcKKyNkZWZpbmUgRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQkxPQ0tTX0lOU1BFQ1RFRCAgICAgIC02NTgKKyNkZWZpbmUgRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQkxPQ0tTX01FUkdFRCAgICAgICAgIC02NTkKKyNkZWZpbmUgRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQkxPQ0tTX1JFU1VMVElORyAgICAgIC02NjAKKworI2RlZmluZSBESV9NRU1PUllfRVhURU5ERURfU1RBVElTVElDUyAgICAgICAgICAgICAgICAgICAgICAgLTY3MAorCisvKiBTdGF0dXMgdGV4dHMgKi8KKyNkZWZpbmUgRElfU1RBVFVTX1RFWFRfTUVNT1JZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC03MDAKKyNkZWZpbmUgRElfU1RBVFVTX1RFWFRfVEFCTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC03MDEKKyNkZWZpbmUgRElfU1RBVFVTX1RFWFRfU1dBUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC03MDIKKyNkZWZpbmUgRElfU1RBVFVTX1RFWFRfTUFMTE9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC03MDMKKyNkZWZpbmUgRElfU1RBVFVTX1RFWFRfTUFMTE9DX0VYVEVOREVEICAgICAgICAgICAgICAgICAgICAgIC03MDQKKworLyogSW5kaWNlcyBpbnRvIHRoZSBzdWJhcnJheXMgb2YgRElfTUVNT1JZX0VYVEVOREVEX1NUQVRJU1RJQ1MgKGlmIGdpdmVuKSAqLworCisjZGVmaW5lIERJTV9FU19NQVhfQUxMT0MgICAwCisjZGVmaW5lIERJTV9FU19DVVJfQUxMT0MgICAxCisjZGVmaW5lIERJTV9FU19NQVhfRlJFRSAgICAyCisjZGVmaW5lIERJTV9FU19DVVJfRlJFRSAgICAzCisjZGVmaW5lIERJTV9FU19BVkdfWEFMTE9DICA0CisjZGVmaW5lIERJTV9FU19BVkdfWEZSRUUgICA1CisjZGVmaW5lIERJTV9FU19GVUxMX1NMQUJTICA2CisjZGVmaW5lIERJTV9FU19GUkVFX1NMQUJTICA3CisjZGVmaW5lIERJTV9FU19UT1RBTF9TTEFCUyA4CisKKyNkZWZpbmUgRElNX0VTX01BWCAgOQorCisKKy8qIERlZmluaXRpb24gb2YgYXJndW1lbnQgdmFsdWVzIGZvciBkdW1wX2RyaXZlcl9pbmZvKCkKKyAqLworCisjZGVmaW5lIERESV9PQkpFQ1RTICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERElfT0JKRUNUU19ERVNUUlVDVEVEICAgICAgICAgIDEKKyNkZWZpbmUgRERJX09QQ09ERVMgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIERESV9NRU1PUlkgICAgICAgICAgICAgICAgICAgICAgMworCisvKiBJbmRpY2VzIGludG8gdGhlIHN1YmFycmF5cyByZXN1bHRpbmcgZnJvbSBkcml2ZXJfaW5mbyhESV9UUkFDRV8qKQorICovCisKKyNkZWZpbmUgVFJBQ0VfVFlQRSAgICAwCisjZGVmaW5lIFRSQUNFX05BTUUgICAgMQorI2RlZmluZSBUUkFDRV9QUk9HUkFNIDIKKyNkZWZpbmUgVFJBQ0VfT0JKRUNUICAzCisjZGVmaW5lIFRSQUNFX0xPQyAgICAgNAorI2lmZGVmIF9fRVZBTF9DT1NUX1RSQUNFX18KKyNkZWZpbmUgVFJBQ0VfRVZBTENPU1QgNQorCisjZGVmaW5lIFRSQUNFX01BWCAgICAgNgorI2Vsc2UKKyNkZWZpbmUgVFJBQ0VfTUFYICAgICA1CisjZW5kaWYKKworLyogVmFsdWVzIGZvciBlbnRyeSBUUkFDRV9UWVBFICovCisKKyNkZWZpbmUgVFJBQ0VfVFlQRV9TWU1CT0wgIDAKKyNkZWZpbmUgVFJBQ0VfVFlQRV9TRUZVTiAgIDEKKyNkZWZpbmUgVFJBQ0VfVFlQRV9FRlVOICAgIDIKKyNkZWZpbmUgVFJBQ0VfVFlQRV9MQU1CREEgIDMKKyNkZWZpbmUgVFJBQ0VfVFlQRV9MRlVOICAgIDQKKworI2VuZGlmIC8qIExQQ19EUklWRVJfSU5GT19IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzL2VycS5oIGIvc3lzL2VycS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMGVkZmQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvZXJxLmgKQEAgLTAsMCArMSw1OSBAQAorLyogZXh0ZXJuYWwgcmVxdWVzdCBkZW1vbiBpbnRlcmZhY2UgZGVmaW5pdGlvbnMgKi8KKworI2lmbmRlZiBMUENfX0VSUV9IX18KKyNkZWZpbmUgTFBDX19FUlFfSF9fIDEKKworLyogc2Vydml2ZSByZXF1ZXN0IHR5cGVzICovCisKKyNkZWZpbmUgRVJRX1JMT09LVVAgICAgIDAgIC8qIExvb2t1cCBpcCAtPiBuYW1lICovCisjZGVmaW5lIEVSUV9FWEVDVVRFICAgICAxICAvKiBFeGVjdXRlIGEgcHJvZ3JhbSAqLworI2RlZmluZSBFUlFfRk9SSyAgICAgICAgMiAgLyogRm9yayBhIHByb2dyYW0gKi8KKyNkZWZpbmUgRVJRX0FVVEggICAgICAgIDMgIC8qIENvbm5lY3QgdG8gYSByZW1vdGUgYXV0aGQgKi8KKyNkZWZpbmUgRVJRX1NQQVdOICAgICAgIDQgIC8qIFNwYXduIGEgcHJvZ3JhbSAqLworI2RlZmluZSBFUlFfU0VORCAgICAgICAgNSAgLyogU2VuZCBkYXRhIHRvIGEgcHJvZ3JhbSBvciBjb25uZWN0aW9uICovCisjZGVmaW5lIEVSUV9LSUxMICAgICAgICA2ICAvKiBLaWxsIGEgcHJvZ3JhbSBvciBjb25uZWN0aW9uICovCisjZGVmaW5lIEVSUV9PUEVOX1VEUCAgICA3ICAvKiBPcGVuIGEgVURQIHNvY2tldCAqLworI2RlZmluZSBFUlFfT1BFTl9UQ1AgICAgOCAgLyogT3BlbiBhIFRDUCBjb25uZWN0aW9uICovCisjZGVmaW5lIEVSUV9MSVNURU4gICAgICA5ICAvKiBPcGVuIGEgVENQIGFjY2VwdC1zb2NrZXQgKi8KKyNkZWZpbmUgRVJRX0FDQ0VQVCAgICAgMTAgIC8qIEFjY2VwdCBhIGNvbm5lY3Rpb24gZnJvbSBhIGFjY2VwdC1zb2NrZXQgKi8KKyNkZWZpbmUgRVJRX0xPT0tVUCAgICAgMTEgIC8qIExvb2t1cCBuYW1lIC0+IGlwICovCisKKyNpZmRlZiBfX0lQVjZfXworI2RlZmluZSBFUlFfUkxPT0tVUFY2ICAxMiAgLyogTG9va3VwIG5hbWUvaXA2ICovCisjZW5kaWYKKworLyogQWRkaXRpb25hbCBzZXJ2aWNlIHJlcXVlc3QgdHlwZSBmbGFncyBldmFsdWF0ZWQgYnkgZWZ1biBzZW5kX2VycSgpLgorICogVGhlIEVSUSBpdHNlbGYgd29uJ3QgZ2V0IHRvIHNlZSBpdC4KKyAqLworCisjZGVmaW5lIEVSUV9DQl9TVFJJTkcgICgxIDw8IDMxKSAgLyogQ2FsbGJhY2sgY2xvc3VyZSB0YWtlcyBhIHN0cmluZyBhcmcgKi8KKworCisvKiBhbnN3ZXJzIGZyb20gRVJRX0VYRUNVVEUgLyBFUlFfRk9SSyAqLworCisjZGVmaW5lIEVSUV9PSwkJICAwCisjZGVmaW5lIEVSUV9TSUdOQUxFRAkgIDEKKyNkZWZpbmUgRVJRX0VfTk9URk9VTkQJICAyICAvKiBwcm9jZXNzIG5vdCBmb3VuZCBieSB3YWl0ICovCisjZGVmaW5lIEVSUV9FX1VOS05PV04JICAzICAvKiB1bmtub3duIGV4aXQgY29uZGl0aW9uIGZyb20gd2FpdCgpICovCisjZGVmaW5lIEVSUV9FX0FSR0xFTkdUSAkgIDQKKyNkZWZpbmUgRVJRX0VfQVJHRk9STUFUCSAgNQorI2RlZmluZSBFUlFfRV9BUkdOVU1CRVIJICA2CisjZGVmaW5lIEVSUV9FX0lMTEVHQUwJICA3CisjZGVmaW5lIEVSUV9FX1BBVEhMRU4JICA4CisjZGVmaW5lIEVSUV9FX0ZPUktGQUlMCSAgOQorI2RlZmluZSBFUlFfRV9USUNLRVQJIDExCisjZGVmaW5lIEVSUV9FX0lOQ09NUExFVEUgMTIKKyNkZWZpbmUgRVJRX0VfV09VTERCTE9DSyAxMworI2RlZmluZSBFUlFfRV9QSVBFCSAxNAorI2RlZmluZSBFUlFfU1RET1VUCSAxNSAgLyogTm9ybWFsIGRhdGEgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgRVJRX1NUREVSUgkgMTYKKyNkZWZpbmUgRVJRX0VYSVRFRAkgMTcgIC8qIENvbm5lY3Rpb24gY2xvc2VkIG9uIEVPRiAqLworI2RlZmluZSBFUlFfRV9OU0xPVFMJIDE4CisKKy8qIHJlc2VydmVkIGhhbmRsZXMgKi8KKworI2RlZmluZSBFUlFfSEFORExFX1JMT09LVVAgKC0xKQorI2RlZmluZSBFUlFfSEFORExFX0tFRVBfSEFORExFICgtMikKKyNkZWZpbmUgRVJRX0hBTkRMRV9STE9PS1VQVjYgKC0zKQorCisjZW5kaWYgLyogTFBDX19FUlFfSF9fICovCmRpZmYgLS1naXQgYS9zeXMvZXZlbnRzLmggYi9zeXMvZXZlbnRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVmNDVmNgotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9ldmVudHMuaApAQCAtMCwwICsxLDY0IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gL3N5cy9ldmVudHMuaCAtLSBTdGFuZGFyZC1FdmVudC1JRCB1bmQgUHJvdG90eXBlbiBkZXIgTXVkbGliCisvLworLy8gJElkJAorCisjaWZuZGVmIF9fRVZFTlRTX0hfXworI2RlZmluZSBfX0VWRU5UU19IX18KKworI2RlZmluZSBFVkVOVEQgIi9wL2RhZW1vbi9ldmVudGQiCisKKy8vIFN0YW5kYXJkbGliCisjZGVmaW5lIEVWVF9MSUJfTE9HSU4gICAgICAgICAgICAgICAiZXZ0X2xpYl9sb2dpbiIKKyNkZWZpbmUgRVZUX0xJQl9MT0dPVVQgICAgICAgICAgICAgICJldnRfbGliX2xvZ291dCIKKyNkZWZpbmUgRVZUX0xJQl9QTEFZRVJfREVBVEggICAgICAgICJldnRfbGliX3BsYXllcl9kZWF0aCIKKyNkZWZpbmUgRVZUX0xJQl9QTEFZRVJfREVMRVRJT04gICAgICJldnRfbGliX3BsYXllcl9kZWxldGlvbiIKKyNkZWZpbmUgRVZUX0xJQl9QTEFZRVJfQ1JFQVRJT04JICAgICJldnRfbGliX3BsYXllcl9jcmVhdGlvbiIKKyNkZWZpbmUgRVZUX0xJQl9OUENfREVBVEgoeCkgICAgICAgICgiZXZ0X2xpYl9ucGNfZGVhdGhfIit4KQorI2RlZmluZSBFVlRfTElCX0FEVkFOQ0UgICAgICAgICAgICAgImV2dF9saWJfYWR2YW5jZSIKKyNkZWZpbmUgRVZUX0xJQl9RVUVTVF9TT0xWRUQgICAgICAgICJldnRfbGliX3F1ZXN0X3NvbHZlZCIKKyNkZWZpbmUgRVZUX0xJQl9NSU5JUVVFU1RfU09MVkVEICAgICJldnRfbGliX21pbmlxdWVzdF9zb2x2ZWQiCisjZGVmaW5lIEVWVF9MSUJfUExBWUVSX0FUVFJfQ0hBTkdFICAiZXZ0X2xpYl9wbGF5ZXJfYXR0cl9jaGFuZ2UiCisjZGVmaW5lIEVWVF9MSUJfQ0xPQ0sgICAgICAgICAgICAgICAiZXZ0X2xpYl9jbG9jayIKKyNkZWZpbmUgRVZUX0xJQl9EQVRFQ0hBTkdFICAgICAgICAgICJldnRfbGliX2RhdGVjaGFuZ2UiCisjZGVmaW5lIEVWVF9MSUJfTkVXX0VSUk9SICAgICAgICAgICAiZXZ0X2xpYl9ldmVudGRfbmV3X2Vycm9yIgorCisvLyBHaWxkZW4KKyNkZWZpbmUgRVZUX0dVSUxEX0NIQU5HRSAgICAgICAgImV2dF9ndWlsZF9jaGFuZ2UiCisjZGVmaW5lIEVWVF9HVUlMRF9BRFZBTkNFICAgICAgICJldnRfZ3VpbGRfYWR2YW5jZSIKKworCisvLyBLb25zdGFudGVuIGZ1ZXIgRXZlbnQtRGF0ZW4uIHMuIE1hbnBhZ2VzIGRlciBlaW56ZWxuZW4gRXZlbnRzLCBkaWUKKy8vIEJlZGV1dHVuZ2VuIGRpZXNlciBLZXlzIGtvZW5uZW4gc2ljaCBqZXdlaWxzIGxlaWNodCB1bnRlcnNjaGVpZGVuIQorI2RlZmluZSBFX1RJTUUgICAgICAgICAgICAiZXZ0X3RpbWUiCisjZGVmaW5lIEVfT0JKRUNUICAgICAgICAgICJldnRfb2JqZWN0IgorI2RlZmluZSBFX09CTkFNRSAgICAgICAgICAiZXZ0X29iamVjdF9uYW1lIgorI2RlZmluZSBFX0VOVklST05NRU5UICAgICAiZXZ0X2Vudmlyb25tZW50IgorI2RlZmluZSBFX1BMTkFNRSAgICAgICAgICAiZXZ0X3BsYXllcl9uYW1lIgorI2RlZmluZSBFX0VYVEVSTkFMX0RFQVRIICAiZXZ0X2V4dGVybmFsX2RlYXRoIgorI2RlZmluZSBFX1BPSVNPTl9ERUFUSCAgICAiZXZ0X3BvaXNvbl9kZWF0aCIKKyNkZWZpbmUgRV9DT1JQU0UgICAgICAgICAgImV2dF9jb3Jwc2UiCisjZGVmaW5lIEVfR1VJTEROQU1FICAgICAgICJldnRfZ3VpbGRfbmFtZSIKKyNkZWZpbmUgRV9MQVNUX0dVSUxETkFNRSAgImV2dF9sYXN0X2d1aWxkX25hbWUiCisjZGVmaW5lIEVfUVVFU1ROQU1FICAgICAgICJldnRfcXVlc3RfbmFtZSIKKyNkZWZpbmUgRV9RUF9HUkFOVEVEICAgICAgImV2dF9xcF9ncmFudGVkIgorI2RlZmluZSBFX01JTklRVUVTVE5BTUUgICAiZXZ0X21pbmlxdWVzdF9uYW1lIgorI2RlZmluZSBFX01RUF9HUkFOVEVEICAgICAiZXZ0X21xcF9ncmFudGVkIgorCisjZW5kaWYgLy8gX19FVkVOVFNfSF9fCisKKyNpZmRlZiBORUVEX1BST1RPVFlQRVMKKworI2lmbmRlZiBfX0VWRU5UU19QUk9UT1RZUEVTX0hfCisjZGVmaW5lIF9fRVZFTlRTX1BST1RPVFlQRVNfSF8KKyAgICAgICAgaW50IENoZWNrRXZlbnRJRChzdHJpbmcgZWlkKTsKKyAgICAgICAgaW50IFJlZ2lzdGVyRXZlbnQoc3RyaW5nIGVpZCwgc3RyaW5nIGZ1biwgb2JqZWN0IG9iKTsKKyAgICAgICAgaW50IFVucmVnaXN0ZXJFdmVudChzdHJpbmcgZWlkLCBvYmplY3Qgb2IpOwordmFyYXJncyBpbnQgVHJpZ2dlckV2ZW50KHN0cmluZyBlaWQsIG1peGVkIGFyZ3MpOworCisjZW5kaWYgLy8gX19FVkVOVFNfUFJPVE9UWVBFU19IXworCisKKyNlbmRpZiAvLyBORUVEX1BST1RPVFlQRVMKKwpkaWZmIC0tZ2l0IGEvc3lzL2ZpbGVzLmggYi9zeXMvZmlsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDdlMmM4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL2ZpbGVzLmgKQEAgLTAsMCArMSwyOSBAQAorI2lmbmRlZiBMUENfRklMRVNfSF8KKyNkZWZpbmUgTFBDX0ZJTEVTX0hfIDEKKworLyogRGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgdGhlIHZhcmlvdXMgZmlsZSBlZnVucyAqLworCisvKiBTcGVjaWFsIHJldHVybiB2YWx1ZXMgb2YgZmlsZV9zaXplKCkgYW5kIHRoZSBzaXplIHBhcnQgb2YgZ2V0X2RpcigpLgorICovCisKKyNkZWZpbmUgRlNJWkVfTk9GSUxFICAtMSAgLyogRmlsZSBkb2Vzbid0IGV4aXN0IG9yIGlzIG5vdCByZWFkYWJsZSAqLworI2RlZmluZSBGU0laRV9ESVIgICAgIC0yICAvKiBUaGUgZmlsZSBpcyBhY3R1YWxseSBhIGRpcmVjdG9yeSAqLworCisKKy8qIEZsYWcgdmFsdWVzIGZvciBnZXRfZGlyKCkuCisgKi8KKworI2RlZmluZSBHRVRESVJfRU1QVFkgICAgICAgKDApICAvKiByZXR1cm4gYW4gZW1wdHkgYXJyYXkgKG5vdCB2ZXJ5IHVzZWZ1bCkgKi8KKyNkZWZpbmUgR0VURElSX05BTUVTICAgICAoMHgwMSkgIC8qIHJldHVybiB0aGUgZmlsZW5hbWVzICovCisjZGVmaW5lIEdFVERJUl9TSVpFUyAgICAgKDB4MDIpICAvKiByZXR1cm4gdGhlIGZpbGUgc2l6ZXMgKi8KKyNkZWZpbmUgR0VURElSX0RBVEVTICAgICAoMHgwNCkgIC8qIHJldHVybiB0aGUgZGF0ZXMgb2YgbGFzdCBtb2RpZmljYXRpb24gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAoMHgwOCkgdW51c2VkICovCisjZGVmaW5lIEdFVERJUl9BQ0NFU1MgICAgKDB4NDApICAvKiByZXR1cm4gdGhlIGRhdGVzIG9mIGxhc3QgYWNjZXNzICovCisjZGVmaW5lIEdFVERJUl9NT0RFUyAgICAgKDB4ODApICAvKiByZXR1cm4gdGhlIGZpbGUgbW9kZSAqLworCisjZGVmaW5lIEdFVERJUl9QQVRIICAgICAgKDB4MTApICAvKiB3aXRoIF9OQU1FUzogYWRkIHRoZSBwYXRoIHRvIHRoZSBmaWxlbmFtZXMgKi8KKyNkZWZpbmUgR0VURElSX1VOU09SVEVEICAoMHgyMCkgIC8qIHJldHVybiB0aGUgcmVzdWx0cyB1bnNvcnRlZCAqLworCisjZGVmaW5lIEdFVERJUl9BTEwgICAgICAgKDB4REYpICAvKiByZXR1cm4gYWxsICovCisKKyNlbmRpZiAvKiBMUENfRklMRVNfSF8gKi8KZGlmZiAtLWdpdCBhL3N5cy9maXNoaW5nLmggYi9zeXMvZmlzaGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNjYwZWIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvZmlzaGluZy5oCkBAIC0wLDAgKzEsNiBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vICRJZDogZmlzaGluZy5oIDg5MzAgMjAxNC0wOS0wOCAyMjowMDozMlogQXJhdGhvcm4gJAorCisjaW5jbHVkZSA8aXRlbXMvZmlzaGluZy9maXNoaW5nLmg+CisKZGlmZiAtLWdpdCBhL3N5cy9mb29kLmggYi9zeXMvZm9vZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NWM2Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvZm9vZC5oCkBAIC0wLDAgKzEsMTk4IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gL3N5cy9mb29kLnN5cyAgLSBEZWZpbmVzIHVuZCBQcm90b3R5cGVuIGZ1ZXIgTGViZW5zbWl0dGVsCisvLworLy8gJElkOiBmb29kLmggNzcwMiAyMDEwLTEwLTI2IDIxOjIyOjM3WiBaZXNzdHJhICQKKworI2lmbmRlZiBfRk9PRF9IXworI2RlZmluZSBfRk9PRF9IXworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCisvLyBGdWVsbGdyYWQgcHJvIFBvcnRpb24gRXNzZW4gKGRlZmluZWQgaW4gbGlmZS5oKQorLy8gI2RlZmluZSAgIFBfRk9PRAorCisvLyBGdWVsbGdyYWQgcHJvIFNjaGx1Y2sgZGVzIEdldHJhZW5rZXMgKGRlZmluZWQgaW4gbGlmZS5oKQorLy8gI2RlZmluZSAgIFBfRFJJTksKKworLy8gTWVuZ2UgYW4gQWxrb2hvbCwgZGllIGRpZSBTcGVpc2UgcHJvIFBvcnRpb24gaGF0IChkZWZpbmVkIGluIGxpZmUuaCkKKy8vICNkZWZpbmUgICBQX0FMQ09IT0wKKworLy8gSGVpbHdpcmt1bmcgZGVyIFNwZWlzZSAoZGVmaW5lZCBpbiBsaWZlLmgpCisvLyAjZGVmaW5lICAgUF9TUAorLy8gI2RlZmluZSAgIFBfSFAKKworLy8gR2V3aWNodCBwcm8gUG9ydGlvbiAoZGVmaW5lZCBpbiByZXN0cmljdGlvbnMuaCkKKy8vIGluIFBfRU1QVFlfUFJPUFMgaXN0IGVzIGRhcyBHZXdpY2h0IGRlcyBCZWhhZWx0ZXJzCisvLyBtaXQgYmVpZGVuIEFuZ2FiZW4gd2lyZCBkYXMgR2V3aWNodCBpbW1lciBrb3JyZWt0IGJlcmVjaG5ldAorLy8gI2RlZmluZSAgIFBfV0VJR0hUCisKKy8vIFdlcnQgcHJvIFBvcnRpb24gKGRlZmluZWQgaW4gcHJvcGVydGllcy5oKQorLy8gaW4gUF9FTVBUWV9QUk9QUyBpc3QgZXMgZGVyIFdlcnQgZGVzIEJlaGFlbHRlcnMKKy8vIG1pdCBiZWlkZW4gQW5nYWJlbiB3aXJkIGRlciBXZXJ0IGltbWVyIGtvcnJla3QgYmVyZWNobmV0CisvLyAjZGVmaW5lICAgUF9WQUxVRQorCisvLyBEaWUgTWVsZHVuZywgZGllIGRpZSBVbXN0ZWhlbmRlbiBlcmhhbHRlbiwgd2VubiBnZWdlc3Nlbi9nZXRydW5rZW4gd2lyZC4KKyNkZWZpbmUgICBQX0NPTlNVTUVfTVNHICAgICAgICAic3RkX2Zvb2RfY29uc3VtZV9tc2ciCisKKy8vIERpZSBNZWxkdW5nLCBkaWUgZGVyamVuaWdlIGtyaWVndCwgZGVyIGRhcyBEaW5nIGlzc3QvdHJpbmt0LgorI2RlZmluZSAgIFBfRUFURVJfTVNHICAgICAgICAgICJzdGRfZm9vZF9lYXRlcl9tc2ciCisKKy8vIE1lc3NhZ2UsIHdlbm4gbWFuIGRpZSBTcGVpc2UgYmVpbSBLb25zdW1pZXJlbiBnYXIgbmljaHQgaW4gZGVyIEhhbmQgaGF0CisvLyBXZW5uIG1hbiBkaWUgUHJvcCBsb2VzY2h0LCBrYW5uIGRpZSBTcGVpc2UgaW1tZXIgdmVydGlsZ3Qgd2VyZGVuCisjZGVmaW5lICAgUF9FTlZfTVNHICAgICAgICAgICAgInN0ZF9mb29kX2Vudl9tc2ciCisKKy8vIERpZSBNZWxkdW5nLCB3ZW5uIGRpZSBTcGVpc2UgbGVlciBpc3QKKyNkZWZpbmUgICBQX0VNUFRZX01TRyAgICAgICAgICAic3RkX2Zvb2RfZW1wdHlfbXNnIgorCisvLyBEaWUgTWVsZHVuZywgd2VubiBHZXRyYWVua2UgZ2VnZXNzZW4gd2VyZGVuCisjZGVmaW5lICAgUF9OT0ZPT0RfTVNHICAgICAgICAgInN0ZF9mb29kX25vZm9vZF9tc2ciCisKKy8vIERpZSBNZWxkdW5nLCB3ZW5uIFNwZWlzZW4gZ2V0cnVua2VuIHdlcmRlbgorI2RlZmluZSAgIFBfTk9EUklOS19NU0cgICAgICAgICJzdGRfZm9vZF9ub2RyaW5rX21zZyIKKworLy8gRGllIE1lbGR1bmcsIHdlbm4gZGllIFNwZWlzZSBnZXJhZGUgdmVyZGlyYnQKKyNkZWZpbmUgICBQX0JBRF9NU0cgICAgICAgICAgICAic3RkX2Zvb2RfYmFkX21zZyIKKworLy8gRGllIE1lbGR1bmcsIHdlbm4gbmljaHRzIG1laHIgZ2VnZXNzZW4gd2VyZGVuIGthbm4KKyNkZWZpbmUgICBQX0ZPT0RfRlVMTF9NU0cgICAgICAic3RkX2Zvb2RfZnVsbF9tc2ciCisvLyBEaWUgTWVsZHVuZywgd2VubiBuaWNodHMgbWVociBnZXRydW5rZW4gd2VyZGVuIGthbm4KKyNkZWZpbmUgICBQX0RSSU5LX0ZVTExfTVNHICAgICAic3RkX2Zvb2RfZHJpbmtfZnVsbF9tc2ciCisvLyBEaWUgTWVsZHVuZywgd2VubiBuaWNodHMgbWVociBhbGtvaG9saXNjaGVzIGdlaHQKKyNkZWZpbmUgICBQX0FMQ19GVUxMX01TRyAgICAgICAic3RkX2Zvb2RfYWxjX2Z1bGxfbXNnIgorLy8gRGllIE1lbGR1bmcsIHdlbm4gZWluZSB2ZXJkb3JiZW5lIFNwZWlzZSB6ZXJzdG9lcnQgd2lyZAorLy8gd2lyZCBudXIgdmVyd2VuZGV0LCB3ZW5uIFBfREVTVFJPWV9CQUQgPiAwIGlzdAorI2RlZmluZSAgIFBfUkVNT1ZFX01TRyAgICAgICAgICJzdGRfZm9vZF9yZW1vdmVfbWVzc2FnZSIKKworLy8gTWFwcGluZyBtaXQgUHJvcGVydGllcyBmdWVyIGRlbiBsZWVyZW4gQmVoYWVsdGVyLgorLy8gQWxsZSBlbnRoYWx0ZW5lbiBQcm9wZXJ0aWVzIHdlcmRlbiBnZXNldHp0LCB3ZW5uCisvLyBrZWluZSBQb3J0aW9uZW4gbWVociB2b3JoYW5kZW4gc2luZCwgYmVyZWl0cyBpbiBkaWVzZW4gUHJvcGVydGllcworLy8gZWluZ2V0cmFnZW5lIFdlcnRlIHdlcmRlbiB1ZWJlcnNjaHJpZWJlbiEKKy8vIFdlbm4gZGllc2UgUHJvcGVydHkgbmljaHQgZ2VzZXR6dCBpc3QsIHdpcmQgZGllIFNwZWlzZSB6ZXJzdG9lcnQsCisvLyB3ZW5uIGFsbGUgUG9ydGlvbmVuIGF1ZmdlYnJhdWNodCBpc3QuCisvLyBBY2h0dW5nOiBlcyB3ZXJkZW4ga2VpbmUgY2xvc3VyZXMgdW50ZXJzdHVldHp0IQorI2RlZmluZSAgIFBfRU1QVFlfUFJPUFMgICAgICAgICJzdGRfZm9vZF9lbXB0eV9wcm9wcyIKKworLy8gV2lldmllbGUgUG9ydGlvbmVuIGhhdCBkaWUgU3BlaXNlCisjZGVmaW5lICAgUF9QT1JUSU9OUyAgICAgICAgICAgInN0ZF9mb29kX3BvcnRpb25zIgorCisvLyBWZXJ0ZWlsdW5nIGRlciBIZWlsdW5nc3JhdGUgcHJvIFBvcnRpb24gKHNpZWhlIEhfRElTVFJJQlVUSU9OKQorI2RlZmluZSAgIFBfRElTVFJJQlVUSU9OICAgICAgICJzdGRfZm9vZF9kaXN0cmlidXRpb24iCisKKy8vIEFuemFobCBkZXIgU2VrdW5kZW4sIGJpcyBkaWUgU3BlaXNlIHZlcmRvcmJlbiBpc3QuCisvLyBFcyBtdXNzIGVpbiBXZXJ0IGdyb2Vzc2VyIDAgZWluZ2V0cmFnZW4gd2VyZGVuLgorLy8gV2VubiBrZWluIFdlcnQgZ2VzZXR6dCB3aXJkLCB2ZXJkaXJidCBkaWUgU3BlaXNlIGJlaW0gbmFlY2hzdGVuIFJlc2V0CisvLyBEZXIgVGltZXIgc3RhcnRldCBpbW1lciBlcnN0LCB3ZW5uIGVpbiBTcGllbGVyIGRpZSBTcGVpc2UgZGFzIGVyc3RlIE1hbAorLy8gaW4gZGllIEhhbmQgYmVrb21tdAorI2RlZmluZSAgIFBfTElGRVRJTUUgICAgICAgICAgICJzdGRfZm9vZF9saWZldGltZSIKKy8vIEFuemFobCBkZXIgUmVzZXRzLCBiaXMgZGllIFNwZWlzZSB2ZXJkb3JiZW4gaXN0LgorLy8gUF9SRVNFVF9MSUZFVElNRSB1bmQgUF9MSUZFVElNRSBzaW5kIGtvbXBsZW1lbnRhZXIsIGRhcyBoZWlzc3QsIGRhc3MKKy8vIGJlaW0gU2V0emVuIGRlciBlaW5lbiBkaWUgYW5kZXJlIGF1dG9tYXRpc2NoIGJlcmVjaG5ldCB3aXJkLiBNYW4gYnJhdWNodAorLy8gZGFoZXIgbmljaHQgYmVpZGUgenUgc2V0emVuLCBiencuIHNvbGx0ZSBkaWVzIGdhciBuaWNodCBlcnN0IHR1bi4KKyNkZWZpbmUgICBQX1JFU0VUX0xJRkVUSU1FICAgICAic3RkX2Zvb2RfbGlmZXRpbWVfcmVzZXQiCisKKy8vIEZsYWcsIG9iIGRpZSBTcGVpc2UgdmVyZGlyYnQKKy8vIFN0YW5kYXJkOiAwIC0+IERhcmYgbnVyIG1pdCBCYWxhbmNlZ2VuZWhtaWd1bmcgZ2VhZW5kZXJ0IHdlcmRlbiEKKyNkZWZpbmUgICBQX05PX0JBRCAgICAgICAgICAgICAic3RkX2Zvb2Rfbm9fYmFkIgorCisvLyBaZWl0IGluIFNla3VuZGVuLCB3YW5uIGRpZSBTcGVpc2UgbmFjaCBkZW0gU2NobGVjaHR3ZXJkZW4gemVyc3RvZXJ0IHdpcmQuCisvLyB3ZW5uIFBfRU1QVFlfUFJPUFMgZ2VzZXR6dCBpc3QsIHdpcmQgZGVyIEJlaGFlbHRlciBnZWxlZXJ0LgorLy8gU3RhbmRhcmQ6IC0xID0gc29mb3J0IGJlaW0gU2NobGVjaHR3ZXJkZW4KKy8vICAgICAgICAgICAgMCA9IHdpcmQgbmljaHQgemVyc3RvZXJ0CisvLyAgICAgICAgICAgPjAgPSBBbnphaGwgZGVyIFNla3VuZGVuCisjZGVmaW5lICAgUF9ERVNUUk9ZX0JBRCAgICAgICAgInN0ZF9mb29kX2Rlc3Ryb3lfYmFkIgorI2RlZmluZSAgIERFU1RST1lfTkVWRVIgICAgICAgICAwCisjZGVmaW5lICAgREVTVFJPWV9CQUQgICAgICAgICAgLTEKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBLb21wYXRpYmlsaXRhZXRzY29kZQorI2RlZmluZSAgIEZfSVNfRk9PRCAgICAgICAgICAgICJvbGRfaXNfZm9vZCIKKyNkZWZpbmUgICBGX0lTX0RSSU5LICAgICAgICAgICAib2xkX2lzX2RyaW5rIgorI2RlZmluZSAgIEZfSVNfRlVMTCAgICAgICAgICAgICJvbGRfaXNfZnVsbCIKKyNkZWZpbmUgICBGX01FU1NBR0UgICAgICAgICAgICAib2xkX21lc3MiCisjZGVmaW5lICAgRl9FQVRFUiAgICAgICAgICAgICAgIm9sZF9lYXRlciIKKyNkZWZpbmUgICBGX0VNUFRZX0NPTlRBSU5FUiAgICAib2xkX2VtcHR5X2NvbiIKKyNkZWZpbmUgICBGX0VNUFRZX0dFTkRFUiAgICAgICAib2xkX2VtcHR5X2dlbmRlciIKKyNkZWZpbmUgICBGX0VNUFRZX0lEICAgICAgICAgICAib2xkX2VtcHR5X2lkIgorI2RlZmluZSAgIEZfRU1QVFlfTE9ORyAgICAgICAgICJvbGRfZW1wdHlfbG9uZyIKKyNkZWZpbmUgICBGX0FMQyAgICAgICAgICAgICAgICAib2xkX2FsYyIKKyNkZWZpbmUgICBGX0xJUVVJRCAgICAgICAgICAgICAib2xkX3dhdGVyIgorI2RlZmluZSAgIEZfRk9PRF9TSVpFICAgICAgICAgICJvbGRfZm9vZF9zaXplIgorI2RlZmluZSAgIEZfUE9USU9OICAgICAgICAgICAgICJvbGRfcG90aW9uIgorI2RlZmluZSAgIEZfSEVBTF9TUCAgICAgICAgICAgICJvbGRfaGVhbF9zcCIKKyNkZWZpbmUgICBGX0hFQUxfSFAgICAgICAgICAgICAib2xkX2hlYWxfaHAiCisjZGVmaW5lICAgRl9OT19DT05UQUlORVIgICAgICAgIm9sZF9ub19jb24iCisjZGVmaW5lICAgRl9CQUQgICAgICAgICAgICAgICAgIm9sZF9iYWQiCisjZGVmaW5lICAgRl9QT0lTT04gICAgICAgICAgICAgIm9sZF9wb2lzb24iCisKKyNlbmRpZiAvLyBfRk9PRF9IXworCisjaWZkZWYgTkVFRF9QUk9UT1RZUEVTCisjaWZuZGVmIF9GT09EX0hfUFJPVE9UWVBFU18KKyNkZWZpbmUgX0ZPT0RfSF9QUk9UT1RZUEVTXworCitwdWJsaWMgaW50IGNtZF9lYXQoc3RyaW5nIHN0cik7CitwdWJsaWMgaW50IGNtZF9kcmluayhzdHJpbmcgc3RyKTsKK3B1YmxpYyBpbnQgaXNfZWF0YWJsZSgpOworcHVibGljIGludCBpc19kcmlua2FibGUoKTsKK3B1YmxpYyBpbnQgaXNfbm90X2VtcHR5KCk7CitwdWJsaWMgaW50IGlzX2JhZCgpOworCisvLyBBbnphaGwgZGVyIFNla3VuZGVuLCBkaWUgZGFzIExlYmVuc21pdHRlbCBiZXJlaXRzIGhpbnRlciBzaWNoIGhhdCwKKy8vIHNlaXQgZXMgbWl0IGVpbmVtIFNwaWVsZXIgaW4gQmVydWVocnVuZyBrYW0KKy8vIHdlbm4gMCB6dXJ1ZWNrZ2VnZWJlbiB3aXJkLCBpc3QgZGVyIFRpbWVyIHp1bSBTY2hsZWNodHdlcmRlbiBub2NoIG5pY2h0CisvLyBnZXN0YXJ0ZXQgd29yZGVuCitwdWJsaWMgaW50IGdldF9jdXJyZW50X2xpZmV0aW1lKCk7CisKKy8vIFN0YXJ0ZXQgZGVuIFRpbWVyIHp1bSBWZXJkZXJiZW4gZGVyIFNwZWlzZSwgZmFsbHMga2VpbmUgR3J1ZW5kZSBkYWdlZ2VuCisvLyBzcHJlY2hlbiwgd2lyZCB2b24gaW5pdCgpIHVuZCBOb3RpZnlNb3ZlIGF1ZmdlcnVmZW4sIGthbm4gaW4gc3BlemllbGxlbgorLy8gU2l0dWF0aW9uZW4gYWJlciBhdWNoIG1hbnVlbGwgYXVmZ2VydWZlbiB3ZXJkZW4gKHNpZWhlIG1hbiBmb29kKQorcHVibGljIHZvaWQgc3RhcnRfbGlmZXRpbWUoKTsKKworLy8gd2lyZCBhdWZnZXJ1ZmVuLCB3ZW5uIGRpZSBTcGVpc2UgdmVyZG9yYmVuIGlzdCB1bmQgZGllIFplaXQgYXVzCisvLyBQX0RFU1RST1lfQkFEIGFiZ2VsYXVmZW4gaXN0CisvLyByZXR1cm4gMSwgZmFsbHMgT2JqZWt0IHplcnN0b2VydCB3aXJkLCBzb25zdCAwCitwdWJsaWMgaW50IG1ha2VfZGVzdHJveSgpOworCisvLyB3aXJkIGF1ZmdlcnVmZW4sIHdlbm4gZGllIFNwZWlzZSBnZXJhZGUgdmVyZGlyYnQKKy8vIHJldHVybiAxLCBmYWxscyBPYmpla3QgZGFiZWkgemVyc3RvZXJ0IHdpcmQsIHNvbnN0IDAKK3B1YmxpYyBpbnQgbWFrZV9iYWQoKTsKKworLy8gd2lyZCBhdWZnZXJ1ZmVuLCBzb2JhbGQgZGllIGxldHp0ZSBQb3J0aW9uIGdlZ2Vzc2VuL2dldHJ1bmtlbiB3dXJkZQorLy8gRmFsbHMgUF9FTVBUWV9QUk9QUyAwIGlzdCwgd2lyZCBkYXMgT2JqZWt0IHplcnN0b2VydAorLy8gcmV0dXJuIDEsIGZhbGxzIE9iamVrdCBkYWJlaSB6ZXJzdG9lcnQgd2lyZCwgc29uc3QgMAorcHVibGljIGludCBtYWtlX2VtcHR5KCk7CisKKy8vIHdpcmQgamVkZXNtYWwgYXVmZ2VydWZlbiwgd2VubiBlaW5lIHZlcmRvcmJlbmUgU3BlaXNlIGtvbnN1bWllcnQgd2lyZC4KKy8vIEFscyBBcmd1bWVudCB3aXJkIGRhcyBNYXBwaW5nIHVlYmVyZ2ViZW4sIGRhcyBjb25zdW1lKCkgaW0gTGViZXdlc2VuCisvLyB1ZWJlcmdlYmVuIHdlcmRlbiBzb2xsLiBEaWVzZXMgTWFwcGluZyBrYW5uIHZlcmFlbmRlcnQgd2VyZGVuLgorLy8gU3RhbmRhcmQ6IERpZSBIZWlsd2lya3VuZyB3aXJkIGVudGZlcm50IHVuZCBzdGF0dGRlc3NlbiB3aXJkIGRhcyBMZWJld2VzZW4KKy8vICAgICAgICAgICB2ZXJnaWZ0ZXQuCitwcm90ZWN0ZWQgdm9pZCBjb25zdW1lX2JhZChtYXBwaW5nIGVudHJ5X2luZm8pOworCisvLyB3aXJkIGF1cyBjbWRfZWF0IHVuZCBjbWRfZHJpbmsgYXVmZ2VydWZlbiB1bmQgZnVlaHJ0IGRhcyBLb25zdW1pZXJlbiBkdXJjaAorcHJvdGVjdGVkIGludCBjb25zdW1lKCk7CisvLyB3aXJkIGF1cyBjb25zdW1lKCkgYXVmZ2VydWZlbiB1bmQgZnVlaHJ0IGRhcyBLb25zdW1pZXJlbiBkdXJjaAorLy8gaXN0IGF1c2dlbGFnZXJ0LCBkYW1pdCBtYW4gZGFzIHRlc3RmbGFnIGJlaSBCZWRhcmYgbnV0emVuIGthbm4KK3Byb3RlY3RlZCB2YXJhcmdzIGludCB0cnlfY29uc3VtZShpbnQgdGVzdG9ubHkpOworCisvLyBGdXR0ZXJuIGhhdCBnZWtsYXBwdAorcHJvdGVjdGVkIHZvaWQgc3VjY2Vzc19jb25zdW1lKCk7CisvLyBGdXR0ZXJuIGhhdCBuaWNodCBnZWtsYXBwdCAobGVlcmVyIEJlaGFlbHRlciBpc3QgaGllciBrZWluIEdydW5kISkKKy8vIFdpcmQgYXVzIHRyeV9jb25zdW1lKCkgZ2VydWZlbi4KKy8vIHJlYXNvbiBlbnRzcHJpY2h0IGRlbSBSdWVja2dhYmV3ZXJ0IHZvbiBjb25zdW1lKCkgaW0gTGViZXdlc2VuLgorcHJvdGVjdGVkIHZvaWQgZmFpbGVkX2NvbnN1bWUoaW50IHJlYXNvbik7CisKKy8vIE1ldGhvZGUsIGRpZSBNZWxkdW5nZW4genUgU3RhdHVzYWVuZGVydW5nZW4gdmVyYXJiZWl0ZXQgdW5kIGtvcnJla3QgYXVzZ2lidC4KKy8vIEVzIHdpcmQgZGVyIE5hbWUgZGVyIGF1c3p1Z2ViZW5lbiBQcm9wZXJ0eSB1ZWJlcmdlYmVuLgorLy8gRXMgd2VyZGVuIGFsbGUgbm90d2VuZGlnZW4gRXJzZXR6dW5nZW4gcGVyIHJlcGxhY2VfcGVyc29uYWwgZ2VtYWNodCB1bmQKKy8vIGdlcHJ1ZWZ0LCBvYiBkZW0gQmVzaXR6ZXIgb2RlciBkZW0gUmF1bSBkaWUgTWVsZHVuZyBhdXNnZWdlYmVuIHdlcmRlbgorLy8gbXVzcy4KKy8vIEhpZXJ1ZWJlciBzb2xsdGVuIG51ciBNZWxkdW5nZW4gYXVzZ2VnZWJlbiB3ZXJkZW4sIGRpZSBkdXJjaCBBZW5kZXJ1bmdlbgorLy8gYW4gZGVyIFNwZWlzZSBpbSBSZXNldCBhdXNnZWxvZXN0IHdlcmRlbiwgYWxzbyBpbSByZXNldCBzZWxic3QgdW5kIGluIGRlbgorLy8gbWFrZV8qLU1ldGhvZGVuLgorcHJvdGVjdGVkIHZvaWQgbWVzc2FnZShzdHJpbmcgcHJvcCk7CisKKyNlbmRpZiAvLyBfRk9PRF9IX1BST1RPVFlQRVNfCisjZW5kaWYgLy8gTkVFRF9QUk9UT1RZUEVTCisKZGlmZiAtLWdpdCBhL3N5cy9mdW5jdGlvbmxpc3QuaCBiL3N5cy9mdW5jdGlvbmxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWRjZDY0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL2Z1bmN0aW9ubGlzdC5oCkBAIC0wLDAgKzEsNjIgQEAKKyNpZm5kZWYgTFBDX0ZVTkNUSU9OTElTVF9ICisjZGVmaW5lIExQQ19GVU5DVElPTkxJU1RfSAorCisjaWZuZGVmIF9fRFJJVkVSX1NPVVJDRV9fCisjaW5jbHVkZSAibHBjdHlwZXMuaCIKKworI2RlZmluZSBOQU1FX0lOSEVSSVRFRCAgICAgIDB4ODAwMDAwMDAgLyogRGVmaW5lZCBieSBpbmhlcml0YW5jZSAgICAgICAgICovCisjZGVmaW5lIFRZUEVfTU9EX1NUQVRJQyAgICAgMHg0MDAwMDAwMCAvKiBTdGF0aWMgZnVuY3Rpb24gb3IgdmFyaWFibGUgICAgKi8KKyNkZWZpbmUgVFlQRV9NT0RfTk9fTUFTSyAgICAweDIwMDAwMDAwIC8qIFRoZSBub21hc2sgPT4gbm90IHJlZGVmaW5lYWJsZSAqLworI2RlZmluZSBUWVBFX01PRF9QUklWQVRFICAgIDB4MTAwMDAwMDAgLyogQ2FuJ3QgYmUgaW5oZXJpdGVkICAgICAgICAgICAgICovCisjZGVmaW5lIFRZUEVfTU9EX1BVQkxJQyAgICAgMHgwODAwMDAwMCAvKiBGb3JjZSBpbmhlcml0IHRocm91Z2ggcHJpdmF0ZSAgKi8KKyNkZWZpbmUgVFlQRV9NT0RfVkFSQVJHUyAgICAweDA0MDAwMDAwIC8qIFVzZWQgZm9yIHR5cGUgY2hlY2tpbmcgICAgICAgICAqLworI2RlZmluZSBUWVBFX01PRF9WSVJUVUFMICAgIDB4MDIwMDAwMDAgIC8qIGNhbiBiZSByZS0gYW5kIGNyb3NzLSBkZWZpbmVkICovCisjZGVmaW5lIFRZUEVfTU9EX1BST1RFQ1RFRCAgMHgwMTAwMDAwMCAvKiBjYW5ub3QgYmUgY2FsbGVkIGV4dGVybmFsbHkgICAgKi8KKyNkZWZpbmUgVFlQRV9NT0RfWFZBUkFSR1MgICAweDAwODAwMDAwICAvKiBhY2NlcHRzIG9wdGlvbmFsIGFyZ3VtZW50cyAgICAqLworI2RlZmluZSBUWVBFX01PRF9OT1NBVkUgICAgIFRZUEVfTU9EX1NUQVRJQyAgLyogdmFyczogY2FuJ3QgYmUgc2F2ZWQgICAgICovCisgIC8qIEludGVybmFsbHkgVFlQRV9NT0RfTk9TQVZFIGlzIDB4MDA0MDAwMDAsIGJ1dCB0aGF0IG5ldmVyIGxlYXZlcworICAgKiB0aGUgY29tcGlsZXIuCisgICAqLworI2RlZmluZSBOQU1FX0NST1NTX0RFRklORUQgIDB4MDAwODAwMDAgLyogZnVuY3Rpb24gZGVmaW5lZCBmcm9tIG90aGVyIHByb2dyYW0gKi8KKyNkZWZpbmUgTkFNRV9ISURERU4gICAgICAgICAweDAwMDIwMDAwIC8qIE5vdCB2aXNpYmxlIGZvciBpbmhlcml0YW5jZSAgICAqLworI2RlZmluZSBOQU1FX1BST1RPVFlQRSAgICAgIDB4MDAwMTAwMDAgLyogRGVmaW5lZCBieSBhIHByb3RvdHlwZSBvbmx5ICAgICovCisjZGVmaW5lIE5BTUVfVU5ERUZJTkVEICAgICAgMHgwMDAwODAwMCAvKiBOb3QgZGVmaW5lZCB5ZXQgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTkFNRV9UWVBFU19MT1NUICAgICAweDAwMDA0MDAwIC8qIGluaGVyaXRlZCwgbm8gc2F2ZV90eXBlcyAgICAgICAqLworCisjZW5kaWYgLyogIV9fRFJJVkVSX1NPVVJDRV9fICovCisKKworLyogUmV0dXJuIHZhbHVlIGZsYWcgdHlwZXMgZm9yIGZ1bmN0aW9ubGlzdCgpIGFuZCB2YXJpYWJsZV9saXN0KCkgKi8KKworI2RlZmluZSBSRVRVUk5fRlVOQ1RJT05fTkFNRQkweDAxCisjZGVmaW5lIFJFVFVSTl9GVU5DVElPTl9GTEFHUwkweDAyCisjZGVmaW5lIFJFVFVSTl9GVU5DVElPTl9UWVBFCTB4MDQKKworCisvKiBBZGRpdGlvbmFsIHJldHVybiB2YWx1ZSBmbGFnIHR5cGVzIGZvciBmdW5jdGlvbmxpc3QoKSAqLworCisjZGVmaW5lIFJFVFVSTl9GVU5DVElPTl9OVU1BUkcJMHgwOAorI2RlZmluZSBSRVRVUk5fRlVOQ1RJT05fQVJHVFlQRSAweDEwIC8qIG5vdCBpbXBsZW1lbnRlZCAqLworCisKKy8qIEFkZGl0aW9uYWwgcmV0dXJuIHZhbHVlIGZsYWcgdHlwZXMgZm9yIHZhcmlhYmxlX2xpc3QoKSAqLworCisjZGVmaW5lIFJFVFVSTl9WQVJJQUJMRV9WQUxVRQkweDA4CisKKworLyogTWFza3Mgb2YgdGhlIGZsYWcgdW5pb25zIGFsbG93ZWQgZm9yIHZhcmlvdXMgZWZ1bnM6ICovCisjZGVmaW5lIFJFVFVSTl9GVU5DVElPTl9NQVNLICAgIDB4MGYgIC8qIGZ1bmN0aW9ubGlzdCgpICovCisjZGVmaW5lIFJFVFVSTl9WQVJJQUJMRV9NQVNLICAgIDB4MGYgIC8qIHZhcmlhYmxlX2xpc3QoKSAqLworCisvKiBSZXR1cm4gdmFsdWUgZmxhZyB0eXBlcyBmb3IgZnVuY3Rpb25fZXhpc3RzKCkgKi8KKworI2RlZmluZSBGRVhJU1RTX1BST0dOQU1FICAoMCkKKyNkZWZpbmUgRkVYSVNUU19GSUxFTkFNRSAgKDEpCisjZGVmaW5lIEZFWElTVFNfTElORU5PICAgICgyKQorI2RlZmluZSBGRVhJU1RTX05VTUFSRyAgICAoMykKKyNkZWZpbmUgRkVYSVNUU19UWVBFICAgICAgKDQpCisjZGVmaW5lIEZFWElTVFNfRkxBR1MgICAgICg1KQorCisjZGVmaW5lIEZFWElTVFNfQUxMICAgICAgICgzKQorCisjZW5kaWYgLyogTFBDX0ZVTkNUSU9OTElTVF9IICovCmRpZmYgLS1naXQgYS9zeXMvZ3VhcmQuaCBiL3N5cy9ndWFyZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYzQ3N2YKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvZ3VhcmQuaApAQCAtMCwwICsxLDEyIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gZ3VhcmQuaCAtLSBEZWZpbml0aW9uIGZ1ZXIgUF9HVUFSRC1Qcm9wZXJ0eSB2b24gTlBDcy4KKy8vCisvLyAkSWQ6IGd1YXJkLmggNzcwMSAyMDEwLTEwLTI0IDIwOjM4OjM3WiBaZXNzdHJhICQKKworI2lmbmRlZiBfR1VBUkRfSF8KKyNkZWZpbmUgX0dVQVJEX0hfCisKKyNkZWZpbmUgUF9HVUFSRCAiZ3VhcmQiCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzL2hlYWRlci5oIGIvc3lzL2hlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjN2ExMDcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvaGVhZGVyLmgKQEAgLTAsMCArMSwyNCBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHh4eHguaCAtLSBoZWFkZXIKKy8vCisvLyAkSWQ6IGhlYWRlci5oLHYgMy4xIDE5OTcvMDIvMTIgMTM6MDQ6NTkgV2FyZ29uIEV4cCAkCisgCisjaWZuZGVmIF9fWFhYWF9IX18KKyNkZWZpbmUgX19YWFhYX0hfXworCisvLyBwcm9wZXJ0aWVzCisKKyNlbmRpZiAvLyBfX1hYWFhfSF9fCisKKyNpZmRlZiBORUVEX1BST1RPVFlQRVMKKworI2lmbmRlZiBfX1hYWFhfSF9QUk9UT19fCisjZGVmaW5lIF9fWFhYWF9IX1BST1RPX18KKworLy8gcHJvdG90eXBlcworLy8gbm8gcHJvdG90eXBlcworCisjZW5kaWYgLy8gX19YWFhYX0hfUFJPVE9fXworCisjZW5kaWYJLy8gTkVFRF9QUk9UT1lQRVMKZGlmZiAtLWdpdCBhL3N5cy9oZWFsdGguaCBiL3N5cy9oZWFsdGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDU3YmNiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL2hlYWx0aC5oCkBAIC0wLDAgKzEsNTAgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBoZWFsdGguaCAtLSBIZWlsc3RhZXJrZW4gdW5kIC1nZXNjaHdpbmRpZ2tlaXRlbgorLy8KKy8vICRJZDogaGVhbHRoLmggODM2OCAyMDEzLTAyLTEyIDIxOjAzOjA3WiBaZXNzdHJhICQKKworI2lmbmRlZiBfSEVBTFRIXworI2RlZmluZSBfSEVBTFRIXworCisvKgorICogaGVhbHRoLmgKKyAqCisgKiBBIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgYWxsIGZvb2QgYW5kIGRyaW5rIHN0dWZmCisgKi8KKworLyogVGhlc2UgYXJlIHR1bmUgbWFjcm9zIHRvIGRldGVybWluZSB0aGUgYWN0dWFsIGVmZmVjdCBvZiBmb29kLCAqLworLyogZHJpbmsgYW5kIGFsY29ob2wgKi8KKyNkZWZpbmUgQUxPQ0hPTF9WQUxVRShzdHJlbmd0aCkgc3RyZW5ndGgKKyNkZWZpbmUgRFJJTktfVkFMVUUoc3RyZW5ndGgpIHN0cmVuZ3RoCisjZGVmaW5lIEZPT0RfVkFMVUUoc3RyZW5ndGgpIHN0cmVuZ3RoCisKKy8qIEhvdyBmYXN0IGFsY29ob2wgd2VhcnMgb2ZmIGFuZCBkcmluayBhbmQgZm9vZCBhcmUgcmVkdWNlZCAqLworI2RlZmluZSBBTENPSE9MX0RFTEFZIDUgLyogcXVpdGUgZmFzdCAqLworI2RlZmluZSBEUklOS19ERUxBWSA3IC8qIHF1aXRlIG1lZGl1bSAqLworI2RlZmluZSBGT09EX0RFTEFZIDkgLyogcXVpdGUgc2xvdyAqLworI2RlZmluZSBIRUFMX0RFTEFZIDQgLyogcXVpdGUgZmFzdCAqLworCisjZGVmaW5lIFBPSVNPTl9ERUxBWSA0CisjZGVmaW5lIFBPSVNPTl9NRVJDWV9ERUxBWSAzCisKKyNkZWZpbmUgQUxDX0VGRkVDVF9ISUNLIDAKKyNkZWZpbmUgQUxDX0VGRkVDVF9SVUVMUFMgMQorI2RlZmluZSBBTENfRUZGRUNUX0xPT0tEUlVOSyAyCisjZGVmaW5lIEFMQ19FRkZFQ1RfU1RVTUJMRSAzCisKKyNkZWZpbmUgQUxDX0VGRkVDVF9BUkVBX0dVSUxEIDAKKyNkZWZpbmUgQUxDX0VGRkVDVF9BUkVBX0VOViAxCisKKy8qIEFueSByZWdlbmVyYXRpb24gcHJvaGliaXRlZCA/ICovCisjZGVmaW5lIE5PX1JFR19IUCAgICAgICAgIDB4MDEKKyNkZWZpbmUgTk9fUkVHX0JVRkZFUl9IUCAgMHgwMgorI2RlZmluZSBOT19SRUdfU1AgICAgICAgICAweDA0CisjZGVmaW5lIE5PX1JFR19CVUZGRVJfU1AgIDB4MDgKKyNkZWZpbmUgTk9fUkVHX0FMQ09IT0wgICAgMHgxMAorI2RlZmluZSBOT19SRUdfRFJJTksgICAgICAweDIwCisjZGVmaW5lIE5PX1JFR19GT09EICAgICAgIDB4NDAKKyNkZWZpbmUgTk9fUkVHICAgKE5PX1JFR19IUHxOT19SRUdfQlVGRkVSX0hQfE5PX1JFR19TUHxOT19SRUdfQlVGRkVSX1NQfCBcCisgICAgICAgICAgICAgICAgICBOT19SRUdfQUxDT0hPTHxOT19SRUdfRFJJTkt8Tk9fUkVHX0ZPT0QpCisgICAgICAgICAgICAgICAgICAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzL2hvb2suaCBiL3N5cy9ob29rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFlNjU1ZAotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9ob29rLmgKQEAgLTAsMCArMSw5NiBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIC9zeXMvaG9va3MuaCAgLSBIb29rc3lzdGVtCisvLworLy8gJElkOiBob29rLmggOTQ3NSAyMDE2LTAyLTE5IDIxOjE2OjE3WiBaZXNzdHJhICQKKworI2lmbmRlZiBfSE9PS1NfSF8KKyNkZWZpbmUgX0hPT0tTX0hfCisKKy8vIGdsb2JhbCBob29rcworI2RlZmluZSBIX0hPT0tfTU9WRSAgICAgICAgICAgMQorI2RlZmluZSBIX0hPT0tfRElFICAgICAgICAgICAgMgorI2RlZmluZSBIX0hPT0tfREVGRU5EICAgICAgICAgMworI2RlZmluZSBIX0hPT0tfQVRUQUNLICAgICAgICAgNAorI2RlZmluZSBIX0hPT0tfSFAgICAgICAgICAgICAgNQorI2RlZmluZSBIX0hPT0tfU1AgICAgICAgICAgICAgNgorI2RlZmluZSBIX0hPT0tfQVRUQUNLX01PRCAgICAgNworI2RlZmluZSBIX0hPT0tfQUxDT0hPTCAgICAgICAgOAorI2RlZmluZSBIX0hPT0tfRk9PRCAgICAgICAgICAgOQorI2RlZmluZSBIX0hPT0tfRFJJTksgICAgICAgICAgMTAKKyNkZWZpbmUgSF9IT09LX1BPSVNPTiAgICAgICAgIDExCisjZGVmaW5lIEhfSE9PS19DT05TVU1FICAgICAgICAxMgorI2RlZmluZSBIX0hPT0tfVEVBTVJPV0NIQU5HRSAgMTMKKyNkZWZpbmUgSF9IT09LX0lOU0VSVCAgICAgICAgIDE0CisjZGVmaW5lIEhfSE9PS19FWElUX1VTRSAgICAgICAxNQorCisvLyB0aGUgcG9zc2libGUgY29uc3VtZXIgdHlwZXMKKyNkZWZpbmUgSF9IT09LX1NVUlZFWU9SICAgICAgIDAKKyNkZWZpbmUgSF9IT09LX01PRElGSUNBVE9SICAgIDEKKyNkZWZpbmUgSF9EQVRBX01PRElGSUNBVE9SICAgIDIKKyNkZWZpbmUgSF9MSVNURU5FUiAgICAgICAgICAgIDMKKyNkZWZpbmUgSF9DT05TVU1FUkNIRUNLKHgpICAgICgoaW50cCh4KSYmIHg+PTAgJiYgeDw9SF9MSVNURU5FUik/eDotMSkKKyNkZWZpbmUgSF9DT05TVU1FUk5BTUVTICAgICAgICh7InN1cnZleW9ycyIsImhtb2RzIiwiZG1vZHMiLCJsaXN0ZW5lcnMifSkKKworLy8gcHJpb3JpdGllcworI2RlZmluZSBIX0hPT0tfUFJJT1JJVFlSQU5HRSAgMworI2RlZmluZSBIX0hPT0tfTElCQkFTRVBSSU8gICAgMAorI2RlZmluZSBIX0hPT0tfR1VJTERCQVNFUFJJTyAgKEhfSE9PS19MSUJCQVNFUFJJTytIX0hPT0tfUFJJT1JJVFlSQU5HRSkKKyNkZWZpbmUgSF9IT09LX09USEVSQkFTRVBSSU8gIChIX0hPT0tfR1VJTERCQVNFUFJJTytIX0hPT0tfUFJJT1JJVFlSQU5HRSkKKyNkZWZpbmUgSF9IT09LX1BSSU9DSEVDSyh4KSAgICgoaW50cCh4KSAmJiB4Pj0wICYmIHg8SF9IT09LX1BSSU9SSVRZUkFOR0UpP3g6LTEpCisjZGVmaW5lIEhfSE9PS19MSUJQUklPKHgpICAgICAoKEhfSE9PS19QUklPQ0hFQ0soeCkhPS0xKT8oSF9IT09LX0xJQkJBU0VQUklPK3gpOi0xKQorI2RlZmluZSBIX0hPT0tfR1VJTERQUklPKHgpICAgKChIX0hPT0tfUFJJT0NIRUNLKHgpIT0tMSk/KEhfSE9PS19HVUlMREJBU0VQUklPK3gpOi0xKQorI2RlZmluZSBIX0hPT0tfT1RIRVJQUklPKHgpICAgKChIX0hPT0tfUFJJT0NIRUNLKHgpIT0tMSk/KEhfSE9PS19PVEhFUkJBU0VQUklPK3gpOi0xKQorI2RlZmluZSBIX0hPT0tfVkFMSURQUklPKHgpICAgKChpbnRwKHgpICYmIHg+PTAgJiYgeDwoSF9IT09LX09USEVSQkFTRVBSSU8rSF9IT09LX1BSSU9SSVRZUkFOR0UpKT94Oi0xKQorCisvLyBtYXhpbXVtIGNvbnN1bWVyIHBlciB0eXBlCisjZGVmaW5lIE1BWF9TVVJWRVlPUiAgICAgICAgICAxCisjZGVmaW5lIE1BWF9IT09LX01PRElGSUNBVE9SICAyCisjZGVmaW5lIE1BWF9EQVRBX01PRElGSUNBVE9SICAzCisjZGVmaW5lIE1BWF9MSVNURU5FUiAgICAgICAgICA1CisjZGVmaW5lIE1BWF9IT09LX0NPVU5UUyAoe01BWF9TVVJWRVlPUiwgTUFYX0hPT0tfTU9ESUZJQ0FUT1IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX0RBVEFfTU9ESUZJQ0FUT1IsIE1BWF9MSVNURU5FUiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisKKy8vIGRhdGEgaW5kaWNlcyBmb3IgcmV0dXJuIHZhbHVlIG9mIEhvb2tDYWxsYmFjaygpICYgQ28uCisjZGVmaW5lIEhfUkVUQ09ERSAgICAgICAgICAgICAwCisjZGVmaW5lIEhfUkVUREFUQSAgICAgICAgICAgICAxCisKKy8vIHJldHVybiBjb2RlcyBmb3IgSG9va0Zsb3cgJiBDby4KKyNkZWZpbmUgSF9OT19NT0QgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSF9DQU5DRUxMRUQgICAgICAgICAgIDEKKyNkZWZpbmUgSF9BTFRFUkVEICAgICAgICAgICAgIDIKKworLy8gZGVidWdnaW5nCisjZGVmaW5lIEhfRE1TRyh4KSAgICAgICAgICAgICAoaF9kYmcoKSAmJiAoZmluZF9wbGF5ZXIoInplc3N0cmEiKSkgPyBcCisgICAgdGVsbF9vYmplY3QoZmluZF9wbGF5ZXIoInplc3N0cmEiKSx4KTowKQorCisjZW5kaWYgLy9fSE9PS1NfSF8KKworLy8gcHJvdG90eXBlcyAKKyNpZmRlZiBORUVEX1BST1RPVFlQRVMKKy8vIHByb3ZpZGVyCisjaWZuZGVmIF9fSE9PS19QUk9WSURFUl9QUk9UTworI2RlZmluZSBfX0hPT0tfUFJPVklERVJfUFJPVE8KKworLy8gbGlzdCBvZiBvZmZlcmVkIGhvb2tzCitpbnQqIEhMaXN0SG9va3MoKTsKKworLy8gcmVnaXN0ZXIgdG8gaG9vaworaW50IEhSZWdpc3RlclRvSG9vayhpbnQgaG9va2lkLCBtaXhlZCBjb25zdW1lciwgaW50IGhvb2twcmlvLAorICAgIGludCBjb25zdW1lcnR5cGUsIGludCB0aW1lSW5TZWNvbmRzKTsKKworLy8gdW5yZWdpc3RlciBmcm9tIGhvb2sKK2ludCBIVW5yZWdpc3RlckZyb21Ib29rKGludCBob29raWQsIG1peGVkIGNvbnN1bWVyKTsKKworLy8gY2hlY2sgd2V0aGVyIG9iamVjdCBpcyBhIGNvbnN1bWVyIGZvciBhIGdpdmVuIGhvb2sKK2ludCBISXNIb29rQ29uc3VtZXIoaW50IGhvb2tpZCwgbWl4ZWQgY29uc3VtZXIpOworCisvLyBvZmZlciBhIGhvb2sgb3Igc3RvcCBvZmZlcmluZyBpdAorcHJvdGVjdGVkIHZvaWQgb2ZmZXJIb29rKGludCBob29raWQsIGludCBvZmZlcnN0YXRlKTsKKworLy8gdHJpZ2dlciBhIGhvb2sKK3Byb3RlY3RlZCBtaXhlZCBIb29rRmxvdyhpbnQgaG9va2lkLCBtaXhlZCBob29rZGF0YSk7CisKKyNlbmRpZiAvLyBfX0hPT0tfUFJPVklERVJfUFJPVE8KKyNlbmRpZiAvLyBORUVEX1BST1RPVFlQRVMKZGlmZiAtLWdpdCBhL3N5cy9pZG4uaCBiL3N5cy9pZG4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODgyM2I1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL2lkbi5oCkBAIC0wLDAgKzEsMjYgQEAKKyNpZm5kZWYgTFBDX0lETl9IXworI2RlZmluZSBMUENfSUROX0hfIDEKKworLyogLS0tIElETkEgQ29uc3RhbnRzIC0tLQorICovCisKKy8qIGlkbmFfc3RyaW5ncHJlcCgpIHByb2ZpbGVzLiAqLworCisjZGVmaW5lIFNUUklOR1BSRVBfTkFNRVBSRVAgMQorI2RlZmluZSBTVFJJTkdQUkVQX1NBU0xQUkVQIDIKKyNkZWZpbmUgU1RSSU5HUFJFUF9QTEFJTiAzCisjZGVmaW5lIFNUUklOR1BSRVBfVFJBQ0UgNAorI2RlZmluZSBTVFJJTkdQUkVQX0tFUkJFUk9TNSA1CisjZGVmaW5lIFNUUklOR1BSRVBfWE1QUF9OT0RFUFJFUCA2CisjZGVmaW5lIFNUUklOR1BSRVBfWE1QUF9SRVNPVVJDRVBSRVAgNyAKKyNkZWZpbmUgU1RSSU5HUFJFUF9JU0NTSSA4CisKKy8qIGlkbmFfc3RyaW5ncHJlcCgpIGZsYWdzICovCisKKyNkZWZpbmUgU1RSSU5HUFJFUF9OT19ORktDX0ZMQUcgICAgICAgICgxPDwwKQorI2RlZmluZSBTVFJJTkdQUkVQX05PX0JJRElfRkxBRyAgICAgICAgKDE8PDEpCisjZGVmaW5lIFNUUklOR1BSRVBfTk9fVU5BU1NJR05FRF9GTEFHICAoMTw8MikKKworI2RlZmluZSBTVFJJTkdQUkVQX0ZMQUdfTUFYICAoMTw8MikKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXMvaW5jbHVkZV9saXN0LmggYi9zeXMvaW5jbHVkZV9saXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ4NmYyNAotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9pbmNsdWRlX2xpc3QuaApAQCAtMCwwICsxLDkgQEAKKyNpZm5kZWYgTFBDX0lOQ0xVREVfTElTVF9ICisjZGVmaW5lIExQQ19JTkNMVURFX0xJU1RfSAorCisvKiBSZXR1cm4gdmFsdWUgZmxhZyB0eXBlcyBmb3IgaW5jbHVkZV9saXN0KCkgKi8KKworI2RlZmluZSBJTkNMSVNUX0ZMQVQgICAgICAgICAweDAwCisjZGVmaW5lIElOQ0xJU1RfVFJFRSAgICAgICAgIDB4MDEKKworI2VuZGlmIC8qIExQQ19JTkNMVURFX0xJU1RfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzL2luaGVyaXRfbGlzdC5oIGIvc3lzL2luaGVyaXRfbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNmIxZTkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvaW5oZXJpdF9saXN0LmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBMUENfSU5IRVJJVF9MSVNUX0gKKyNkZWZpbmUgTFBDX0lOSEVSSVRfTElTVF9ICisKKy8qIFJldHVybiB2YWx1ZSBmbGFnIHR5cGVzIGZvciBpbmhlcml0X2xpc3QoKSAqLworCisjZGVmaW5lIElOSExJU1RfRkxBVCAgICAgICAgIDB4MDAKKyNkZWZpbmUgSU5ITElTVF9UUkVFICAgICAgICAgMHgwMQorI2RlZmluZSBJTkhMSVNUX1RBR19WSVJUVUFMICAweDAyCisKKyNlbmRpZiAvKiBMUENfSU5IRVJJVF9MSVNUX0ggKi8KZGlmZiAtLWdpdCBhL3N5cy9pbnBjLmggYi9zeXMvaW5wYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZmNlZDkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvaW5wYy5oCkBAIC0wLDAgKzEsMTUgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBpbnBjLmggLS0gSGVhZGVyZmlsZSBmdWVyIGludGVsbGlnZW50ZSBOUENzCisvLworLy8gJElkOiBpbnBjLmgsdiAzLjQgMjAwMy8wOC8wNiAxOTowNjoxMSBWYW5pb24gRXhwICQKKworI2lmbmRlZiBfX0lOUENfSF9fCisjZGVmaW5lIF9fSU5QQ19IX18KKworI2luY2x1ZGUgIi9zeXMvaW5wYy9zZWxlY3QuaCIKKyNpbmNsdWRlICIvc3lzL2lucGMvZXZhbC5oIgorI2luY2x1ZGUgIi9zeXMvaW5wYy93YWxraW5nLmgiCisjaW5jbHVkZSAiL3N5cy9pbnBjL2Jvb3ppbmcuaCIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXMvaW5wYy9ib296aW5nLmggYi9zeXMvaW5wYy9ib296aW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ5MDllYgotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9pbnBjL2Jvb3ppbmcuaApAQCAtMCwwICsxLDIyIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gaW5wYy9ib296aW5nLmggLS0gSW50ZWxsaWdlbnQgU2F1ZmVuCisvLworLy8gJElkOiBib296aW5nLmgsdiAxLjIgMTk5Ny8wMi8xMiAxMzoxNzoxNCBXYXJnb24gRXhwICQKKworI2lmbmRlZiBfX0lOUENfQk9PWklOR19IX18KKyNkZWZpbmUgX19JTlBDX0JPT1pJTkdfSF9fCisKKyNkZWZpbmUgUF9JX0hBVEVfQUxDT0hPTCAiaV9oYXRlX2FsY29ob2wiCisKKyNlbmRpZgorCisjaWZkZWYgTkVFRF9QUk9UT1RZUEVTCisjaWZuZGVmIF9fSU5QQ19CT09aSU5HX1BST1RPX18KKyNkZWZpbmUgX19JTlBDX0JPT1pJTkdfUFJPVE9fXworCitpbnQgRHJpbmsoKTsKK3ZvaWQgRHJpbmtMb29wKCk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9zeXMvaW5wYy9ldmFsLmggYi9zeXMvaW5wYy9ldmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGExMGE0MgotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9pbnBjL2V2YWwuaApAQCAtMCwwICsxLDEzIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gaW5wYy9ldmFsLmggLS0gRGVmaW5pdGlvbmVuIHp1bSBFaW5zY2hhZXR6ZW4KKy8vCisvLyAkSWQ6IGV2YWwuaCx2IDMuMSAxOTk3LzAyLzEyIDEzOjE3OjE0IFdhcmdvbiBFeHAgJAorCisjaWZuZGVmIF9fSU5QQ19FVkFMX0hfXworI2RlZmluZSBfX0lOUENfRVZBTF9IX18KKworI2RlZmluZSBQX0VWQUxfT0ZGU0VUUyAiaW5wY19ldmFsX29mZnNldHMiCisjZGVmaW5lIFBfRVZBTF9GQUNUT1JTICJpbnBjX2V2YWxfZmFjdG9ycyIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXMvaW5wYy9zZWxlY3QuaCBiL3N5cy9pbnBjL3NlbGVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMmRjZjIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvaW5wYy9zZWxlY3QuaApAQCAtMCwwICsxLDQwIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gaW5wYy9zZWxlY3QuaCAtLSBEZWZpbml0aW9uZW4genVyIE9iamVrdGF1c3dhaGwKKy8vCisvLyAkSWQ6IHNlbGVjdC5oLHYgMy4zIDIwMDMvMDgvMDYgMTg6NDA6MDUgVmFuaW9uIEV4cCAkCisKKyNpZm5kZWYgX19JTlBDX1NFTEVDVF9IX18KKyNkZWZpbmUgX19JTlBDX1NFTEVDVF9IX18KKworI2RlZmluZSBPVF9XRUFQT04gIndlYXBvbiIKKyNkZWZpbmUgT1RfQ09NQkFUX09CSkVDVCAiY29tYmF0X29iamVjdCIKKyNkZWZpbmUgT1RfTUlTQyAibWlzY19vYmplY3RzIgorI2RlZmluZSBJTlBDX0JFU1RfV0VBUE9OX0lEICJpbnBjX2Jlc3Rfd2VhcG9uIgorI2RlZmluZSBJTlBDX0JFU1RfU0hJRUxEX0lEICJpbnBjX2Jlc3Rfc2hpZWxkIgorCisvLyBpZiBucGMgZG9lcyBub3QgbGlrZSB3ZWFwb25zLCBpLmUuIEthcmF0ZW9yYworI2RlZmluZSBJTlBDX0RPTlRfV0lFTERfV0VBUE9OUyAiaW5wY19kb250X3dpZWxkX3dlYXBvbnMiCisKKyNlbmRpZgorCisjaWZkZWYgTkVFRF9QUk9UT1RZUEVTCisjaWZuZGVmIF9fSU5QQ19TRUxFQ1RfUFJPVE9fXworI2RlZmluZSBfX0lOUENfU0VMRUNUX1BST1RPX18KKworaW50IGV2YWxfd2Vwb24ob2JqZWN0IG9iKTsKK2ludCBldmFsX2FybW91cihvYmplY3Qgb2IpOworaW50IGV2YWxfY29tYmF0X29iamVjdChvYmplY3Qgb2IsIG1hcHBpbmcgdmFscywgb2JqZWN0IGVuZW15KTsKKworb2JqZWN0IGZpbmRfYmVzdF93ZWFwb24obWl4ZWQgZnJvbSk7CitvYmplY3QgZmluZF9iZXN0X2FybW91cihtaXhlZCBmcm9tLCBtaXhlZCB0eXApOworb2JqZWN0ICpmaW5kX2Jlc3RfYXJtb3VycyhtaXhlZCBmcm9tKTsKK3ZhcmFyZ3Mgc3RyaW5nIGZpbmRfYmVzdF9jb21iYXRfY29tbWFuZChtaXhlZCBmcm9tLCBvYmplY3QgZW5lbXksIG1hcHBpbmcgcHJlZik7CisKK3ZhcmFyZ3MgaW50IHdpZWxkX2Jlc3Rfd2VhcG9uKG1peGVkIGZyb20pOwordmFyYXJncyBpbnQgd2Vhcl9iZXN0X2FybW91cnMobWl4ZWQgZnJvbSk7Cit2YXJhcmdzIGludCB1c2VfYmVzdF9jb21iYXRfY29tbWFuZChtaXhlZCBlbmVteSwgbWl4ZWQgZnJvbSwgbWFwcGluZyBwcmVmKTsKKworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzL2lucGMvd2Fsa2luZy5oIGIvc3lzL2lucGMvd2Fsa2luZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMTQzY2YKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvaW5wYy93YWxraW5nLmgKQEAgLTAsMCArMSw0MyBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHdhbGtpbmcuaCAtLSBEZWZpbml0aW9uZW4gdW5kIFByb3BlcnRpZXMgZnVlciBsYXVmZW5kZSBJTlBDcworLy8KKy8vICRJZDogd2Fsa2luZy5oLHYgMy4xIDE5OTcvMDIvMTIgMTM6MTc6MTQgV2FyZ29uIEV4cCAkCisKKyNpZm5kZWYgX19JTlBDX1dBTEtJTkdfSF9fCisjZGVmaW5lIF9fSU5QQ19XQUxLSU5HX0hfXworCisvLyBQcm9wZXJ0aWVzIGFuZCB0eXBlcworI2RlZmluZSBQX0lOUENfTEFTVF9QTEFZRVJfQ09OVEFDVCAiaW5wY19sYXN0X3BsYXllcl9jb250YWN0IgorI2RlZmluZSBQX0lOUENfTEFTVF9FTlZJUk9OTUVOVCAiaW5wY19sYXN0X2Vudmlyb25tZW50IgorI2RlZmluZSBQX0lOUENfV0FMS19NT0RFICJpbnBjX3dhbGtfbW9kZSIKKyNkZWZpbmUgUF9JTlBDX1dBTEtfREVMQVlTICJpbnBjX3dhbGtfZGVsYXkiCisjZGVmaW5lIFBfSU5QQ19XQUxLX0ZMQUdTICJpbnBjX3dhbGtfZmxhZ3MiCisjZGVmaW5lIFBfSU5QQ19XQUxLX0FSRUEgImlucGNfd2Fsa19hcmVhIgorI2RlZmluZSBQX0lOUENfV0FMS19ST1VURSAiaW5wY193YWxrX3JvdXRlIgorI2RlZmluZSBQX0lOUENfSE9NRSAiaW5wY19ob21lIgorCisjZGVmaW5lIFdGX01BWV9MT0FEIDB4MDEKKyNkZWZpbmUgV0ZfTUFZX0ZPTExPVyAweDAyCisjZGVmaW5lIFdGX01BWV9VU0VfU1BFQ0lBTCAweDA0CisjZGVmaW5lIFdGX01BWV9XQUxLX0JBQ0sgMHgwOAorCisjZGVmaW5lIFdNX1NUT1AgMAorI2RlZmluZSBXTV9SQU5ET00gMQorI2RlZmluZSBXTV9ST1VURSAyCisjZGVmaW5lIFdNX1dBTEtUTyAzCisjZGVmaW5lIFdNX0ZPTExPVyA0CisjZGVmaW5lIFdNX0ZMRUUgNQorCisjZW5kaWYgLy8gX19JTlBDX1dBTEtJTkdfSF9fCisKKyNpZmRlZiBORUVEX1BST1RPVFlQRVMKKyNpZm5kZWYgX19JTlBDX1dBTEtJTkdfSF9QUk9UT1RZUEVTX18KKyNkZWZpbmUgX19JTlBDX1dBTEtJTkdfSF9QUk9UT1RZUEVTX18KKworLy8gUHJvdG90eXBlbgoraW50IG1heV9lbnRlcl9yb29tKG1peGVkIHJvb20pOworCisjZW5kaWYgLy8gX19JTlBDX1dBTEtJTkdfSF9QUk9UT1RZUEVTX18KKyNlbmRpZiAvLyBORUVEX1BST1RPVFlQRVMKKwpkaWZmIC0tZ2l0IGEvc3lzL2lucHV0X3RvLmggYi9zeXMvaW5wdXRfdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2YwOTRmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL2lucHV0X3RvLmgKQEAgLTAsMCArMSwxNyBAQAorI2lmbmRlZiBMUENfSU5QVVRfVE9fSF8KKyNkZWZpbmUgTFBDX0lOUFVUX1RPX0hfCisKKy8qIE1vZGUgdmFsdWVzIHJlY29nbml6ZWQgYnkgdGhlIGVmdW4gaW5wdXRfdG8oKSAqLworCisjZGVmaW5lIElOUFVUX05PRUNITyAgICAgICAgIDEgIC8qIERvbid0IGVjaG8gdGhlIG5leHQgbGluZSB0eXBlZCAqLworI2RlZmluZSBJTlBVVF9DSEFSTU9ERSAgICAgICAyICAvKiBTd2l0Y2ggaW50by9vdXQgb2YgY2hhcm1vZGUgKi8KKyNkZWZpbmUgSU5QVVRfUFJPTVBUICAgICAgICAgNCAgLyogVXNlIGEgY3VzdG9tIHByb21wdCAqLworI2RlZmluZSBJTlBVVF9OT19URUxORVQgICAgICA4ICAvKiBTd2l0Y2ggaW50by9vdXQgb2YgY2hhcm1vZGUgb24gdGhlIGRyaXZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaWRlIG9ubHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBJTlBVVF9BUFBFTkQgICAgICAgIDE2ICAvKiBBcHBlbmQgdGhlIGlucHV0X3RvIHRvIHRoZSBsaXN0IG9mIGFscmVhZHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcGVuZGluZyBpbnB1dF90bydzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSU5QVVRfSUdOT1JFX0JBTkcgIDEyOCAgLyogRGlzYWxsb3cgdGhlICchJyBlc2NhcGUgKi8KKworI2VuZGlmIC8qIExQQ19JTlBVVF9UT19IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzL2ludGVyYWN0aXZlX2luZm8uaCBiL3N5cy9pbnRlcmFjdGl2ZV9pbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIwYWM5MgotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9pbnRlcmFjdGl2ZV9pbmZvLmgKQEAgLTAsMCArMSwyOSBAQAorI2lmbmRlZiBMUENfSU5URVJBQ1RJVkVfSU5GT19IXworI2RlZmluZSBMUENfSU5URVJBQ1RJVkVfSU5GT19IXworCisvKiBEZWZpbml0aW9uIG9mIGFyZ3VtZW50IHZhbHVlcyBmb3IgaW50ZXJhY3RpdmVfaW5mbygpCisgKi8KKworI2luY2x1ZGUgImNvbmZpZ3VyYXRpb24uaCIKKworLyogQ29ubmVjdGlvbiBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBJSV9JUF9OQU1FICAgICAgICAgICAgICAgICAgICAgIC0xCisjZGVmaW5lIElJX0lQX05VTUJFUiAgICAgICAgICAgICAgICAgICAgLTIKKyNkZWZpbmUgSUlfSVBfUE9SVCAgICAgICAgICAgICAgICAgICAgICAtMworI2RlZmluZSBJSV9JUF9BRERSRVNTICAgICAgICAgICAgICAgICAgIC00CisjZGVmaW5lIElJX01VRF9QT1JUICAgICAgICAgICAgICAgICAgICAgLTUKKworLyogVGVsbmV0IHJlbGF0ZWQgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgSUlfTUNDUF9TVEFUUyAgICAgICAgICAgICAgICAgICAtMTAKKworLyogSW5wdXQgaGFuZGxpbmcgKi8KKyNkZWZpbmUgSUlfSU5QVVRfUEVORElORyAgICAgICAgICAgICAgICAtMjAKKyNkZWZpbmUgSUlfRURJVElORyAgICAgICAgICAgICAgICAgICAgICAtMjEKKyNkZWZpbmUgSUlfSURMRSAgICAgICAgICAgICAgICAgICAgICAgICAtMjIKKworLyogT3V0cHV0IGhhbmRsaW5nICovCisjZGVmaW5lIElJX1NOT09QX05FWFQgICAgICAgICAgICAgICAgICAgLTMwCisjZGVmaW5lIElJX1NOT09QX1BSRVYgICAgICAgICAgICAgICAgICAgLTMxCisjZGVmaW5lIElJX1NOT09QX0FMTCAgICAgICAgICAgICAgICAgICAgLTMyCisKKyNlbmRpZiAvKiBMUENfSU5URVJBQ1RJVkVfSU5GT19IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzL2l0ZW1zL2Zpc2hpbmcvYXF1YXJpdW0uaCBiL3N5cy9pdGVtcy9maXNoaW5nL2FxdWFyaXVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFjNzAwZAotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9pdGVtcy9maXNoaW5nL2FxdWFyaXVtLmgKQEAgLTAsMCArMSwxNSBAQAorI2lmbmRlZiBfQVFVQVJJVU1fCisjZGVmaW5lIF9BUVVBUklVTV8KKworI2RlZmluZSBTVERGSVNITElTVCAoWyBcCisgIFdfQkVBQ0g6ICAoeyJzY2hvbGxlIiwiZmx1bmRlciIsInJvY2hlbiIsInN6dW5nZSIsImtoYWkifSksXAorICBXX0hBUkJPUjogKHsicm9jaGVuIiwiZG9yc2NoIiwic3p1bmdlIiwiaGVyaW5nIiwia2hhaSJ9KSxcCisgIFdfT0NFQU46ICAoeyJ0aHVuIiwiaGFpIiwia2phdSIsInNjaHdlcnQiLCJzZWVoYXNlIiwic2VldGV1ZmVsIiwgXAorICAgICAgICAgICAgICAic2Vld29sZiJ9KSxcCisgIFdfUklWRVI6ICAoeyJwaXJhbmhhIiwibGFjaHMiLCJmb3JlbGxlIiwiYnNhaWIifSksIFwKKyAgV19QT09MOiAgICh7InN0aWNobGluZyIsImdmaXNjaCIsInNjaGxlaSIsImthcnBmZW4iLCJnb3JmZSJ9KSwgXAorICBXX0xBS0U6ICAgKHsic3NhaWIiLCJiYXJzY2giLCJoZWNodCIsImthcnBmZW4ifSksIFwKKyAgV19ST0NLOiAgICh7ImxhY2hzIiwiZm9yZWxsZSIsImJzYWliIn0pLCBcCisgIFdfU1RSRUFNOiAoeyJzdGljaGxpbmciLCJiZm9yZWxsZSIsIm5ldW4iLCJic2FpYiJ9KSBdKSBcCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzL2l0ZW1zL2Zpc2hpbmcvZmlzaGluZy5oIGIvc3lzL2l0ZW1zL2Zpc2hpbmcvZmlzaGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4OTcwZmMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvaXRlbXMvZmlzaGluZy9maXNoaW5nLmgKQEAgLTAsMCArMSw3MiBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGZpc2hpbmcuaCAtLSBEZWZpbml0aW9uZW4gZnVlciBhbGxlcywgd2FzIHNpY2ggdW1zIEFuZ2VsbiBkcmVodAorLy8gICAgICAgICAgICAgIEZyYWdlbiwgVm9yc2NobGFlZ2UgZXRjLiBhbiBBcmF0aG9ybgorLy8KKy8vICRJZDogZmlzaGluZy5oLHYgMy4yIDIwMDIvMTIvMTcgMTA6MDE6NDMgUmlrdXMgRXhwICQKKworI2lmbmRlZiBfX0ZJU0hJTkdfSF9fCisjZGVmaW5lIF9fRklTSElOR19IX18KKworLy8gU3RhbmRhcmRvYmpla3RlLy1wZmFkZQorI2RlZmluZSBBTkdFTEJBU0UoeCkgKCIvc3RkL2l0ZW1zL2Zpc2hpbmcvIit4KQorI2RlZmluZSBTVERfQU5HRUwgICAgQU5HRUxCQVNFKCJhbmdlbCIpCisjZGVmaW5lIFNURF9GSVNDSCAgICBBTkdFTEJBU0UoImZpc2giKQorI2RlZmluZSBTVERfSEFLRU4gICAgQU5HRUxCQVNFKCJoYWtlbiIpCisjZGVmaW5lIFNURF9LT0VERVIgICBBTkdFTEJBU0UoImtvZWRlciIpCisKKyNkZWZpbmUgQU5HRUxPQkooeCkgICgiL2l0ZW1zL2Zpc2hpbmcvIit4KQorCisvLyAqKioqKioqKioqKioqKioqKioKKy8vICogR2V3YWVzc2VydHlwZW4gKgorLy8gKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIFBfV0FURVIgICJ3YXRlciIKKworLy8gR2V3YWVzc2VydHlwZW4KKy8vIFNhbHp3YXNzZXIKKyNkZWZpbmUgV19CRUFDSCAgICAgMSAgICAvLyBTdHJhbmQKKyNkZWZpbmUgV19IQVJCT1IgICAgMiAgICAvLyBIYWZlbgorI2RlZmluZSBXX09DRUFOICAgICA0ICAgIC8vIE96ZWFuCisvLyBTdWVzc3dhc3NlcgorI2RlZmluZSBXX1JJVkVSICAgICA4ICAgIC8vIEZsdXNzCisjZGVmaW5lIFdfUE9PTCAgICAgMTYgICAgLy8gVGVpY2gKKyNkZWZpbmUgV19MQUtFICAgICAzMiAgICAvLyBTZWUKKyNkZWZpbmUgV19ST0NLICAgICA2NCAgICAvLyBCZXJnYmFjaAorI2RlZmluZSBXX1NUUkVBTSAgIDI1NiAgIC8vIEJhY2gKKy8vIFNvbnN0aWdlCisjZGVmaW5lIFdfVVNFUiAgICAgMTI4ICAgLy8gaGllciBrYW5uIG1hbiBlaW4gZWlnZW5lcyBBcXVhcml1bSBhbmhhZW5nZW4hCisjZGVmaW5lIFdfREVBRCAgICAgNTEyICAgLy8gTGVibG9zZXMgV2Fzc2VyL2VudGhhZWx0IGtlaW5lIEZpc2NoZS9tYW4ga2FubgorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFiZXIgZGllIFN0ZGZsYXNjaGUgZnVlbGxlbi4KKyNkZWZpbmUgV19PVEhFUiAgIDEwMjQgICAvLyBGbGFzY2hlIGVudGhhZWx0IEZsdWVzc2lna2VpdCE9V2Fzc2VyCisKKy8vIHZvcmRlZmluaWVydGUgS29tYmluYXRpb25lbiBmdWVyIEFuZ2VsbjoKKyNkZWZpbmUgV19TSE9SVCAoV19IQVJCT1J8V19SSVZFUnxXX1BPT0x8V19MQUtFfFdfUk9DS3xXX1VTRVJ8V19PQ0VBTnxXX1NUUkVBTSkKKyNkZWZpbmUgV19MT05HICAoV19CRUFDSHxXX1VTRVIpCisjZGVmaW5lIFdfU0FMVCAgKFdfSEFSQk9SfFdfT0NFQU58V19CRUFDSCkgICAgICAgICAgICAgICAvLyBTYWx6d2Fzc2VyCisjZGVmaW5lIFdfU1dFRVQgKFdfUklWRVJ8V19QT09MfFdfTEFLRXxXX1JPQ0t8V19TVFJFQU0pICAvLyBTdWVzc3dhc3NlcgorI2RlZmluZSBXX1VOSVZFUlNBTCAoV19TSE9SVHxXX0xPTkcpCisKKy8vICoqKioqKioqKioKKy8vICogRmlzY2hlICoKKy8vICoqKioqKioqKioKKyNkZWZpbmUgUF9GSVNIICAgICAiZmlzaCIKKyNkZWZpbmUgUF9GSVNIX0FHRSAiZmlzaF9hZ2UiCisKKy8vIEZsYWdzIGZ1ZXIgRmlzY2hlCisjZGVmaW5lIEZfTk9ST1RURU4gIDEgICAvLyBGaXNjaCBmYXVsdCBuaWNodC4KKyNkZWZpbmUgRl9OT1RIVU5HUlkgMiAgIC8vIGlzc3QgS29lZGVyIG5pY2h0IGF1ZiwgZmFsbHMgenUgc2Nod2VyIGZ1ZXIgQW5nZWwKKyNkZWZpbmUgRl9SRVBMQUNFICAgNCAgIC8vIFNvbGwgc2ljaCBiZWltIEVudGZlcm5lbiB2b24gQW5nZWwgdmVyd2FuZGVsbi4KKyNkZWZpbmUgRl9OT0hFQUwgICAgOCAgIC8vIEZpc2NoIGhlaWx0IG5pY2h0IGJlaSBWZXJ6ZWhyCisKKy8vIFBmYWQgenVtICJBcXVhcml1bSIsIGRvcnQgZmluZGVuIHNpY2ggZGllIFN0YW5kYXJkZmlzY2hlLiBadW9yZG51bmcKKy8vIHp1IGRlbiBHZXdhZXNzZXJ0eXBlbiBzaWVoZSAvc3lzL2l0ZW1zL2Zpc2hpbmcvYXF1YXJpdW0uaAorI2RlZmluZSBGSVNIKHgpIEFOR0VMT0JKKCJhcXVhcml1bS8iK3gpCisKKy8vIElEcyBmdWVyIEFuZ2VsLEhha2VuLFd1cm0sRmlzY2gKKyNkZWZpbmUgQU5HRUxfSUQgIlxuZl9hbmdlbCIKKyNkZWZpbmUgSEFLRU5fSUQgIlxuZl9rb2VkZXIiCisjZGVmaW5lIFdVUk1fSUQgICJcbmZfd29ybSIKKyNkZWZpbmUgRklTQ0hfSUQgIlxuZl9maXNoIgorCisjZW5kaWYgLy8gX19GSVNISU5HX0hfXworCmRpZmYgLS1naXQgYS9zeXMvaXRlbXMvZmxhc2NoZS5oIGIvc3lzL2l0ZW1zL2ZsYXNjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTkwMWFiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL2l0ZW1zL2ZsYXNjaGUuaApAQCAtMCwwICsxLDIzIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gZmxhc2NoZS5oIC0tIERlZmluaXRpb25lbiBmdWVyIGVpbmUgU3RhbmRhcmRmbGFzY2hlCisvLworLy8gJElkOiBmaXNoaW5nLmgsdiAzLjIgMjAwMi8xMi8xNyAxMDowMTo0MyBSaWt1cyBFeHAgJAorCisjaWZuZGVmIF9fRkxBU0NIRV9IX18KKyNkZWZpbmUgX19GTEFTQ0hFX0hfXworCisvLyAqKioqKioqKioqKioqCisvLyAqIEJlaGFlbHRlciAqCisvLyAqKioqKioqKioqKioqCisvLyBadXIgRXJrbGFlcnVuZyBzaWVoZSBhbSBiZXN0ZW4gL2QvZWJlbmUvZnJhZ2dsZS90eHQvZmxhc2NoZS50eHQKKy8vIEZhc3N1bmdzdmVybW9lZ2VuIGRlcyBCZWhhZWx0ZXJzIGluIG1sCisjZGVmaW5lIFBfTElRVUlEICAgICAid19tYXhfd2Fzc2VyZnVlbGxtZW5nZSIKKworLy8gWnVzYXR6IHp1IFBfTE9ORyBmdWVyIGxlZXJlbiBadXN0YW5kIGRlcyBTdGRoYWtlbnMKKyNkZWZpbmUgUF9MT05HX0VNUFRZICJ3X2xvbmdkZXNjX2VtcHR5IgorCisvLyBadXNhdHogenUgUF9MT05HIGZ1ZXIgZ2VmdWVsbHRlbiBadXN0YW5kIGRlciBTdGRmbGFzY2hlCisjZGVmaW5lIFBfTE9OR19GVUxMICAid19sb25nZGVzY19mdWxsIgorCisjZW5kaWYgLy8gX19GTEFTQ0hFX0hfXwpkaWZmIC0tZ2l0IGEvc3lzL2l0ZW1zL2tyYWV1dGVyL2tyYWV1dGVyLmggYi9zeXMvaXRlbXMva3JhZXV0ZXIva3JhZXV0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTY2MDZmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL2l0ZW1zL2tyYWV1dGVyL2tyYWV1dGVyLmgKQEAgLTAsMCArMSw0MCBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGtyYWV1dGVyLmggLS0gRGVmaW5pdGlvbiBmdWVyIEtyYWV1dGVyIAorLy8KKy8vICRJZDogZmlzaGluZy5oLHYgMy4yIDIwMDIvMTIvMTcgMTA6MDE6NDMgUmlrdXMgRXhwICQKKworI2lmbmRlZiBfX0tSQUVVVEVSX0hfXworI2RlZmluZSBfX0tSQUVVVEVSX0hfXworCisjZGVmaW5lIEtSQUVVVEVSTElTVEUgICAgICAiL3N5cy9pdGVtcy9rcmFldXRlci9rcmFldXRlcmxpc3RlLmgiCisKKyNkZWZpbmUgUExBTlRESVIgICAgICAgICAgICIvaXRlbXMva3JhZXV0ZXIvIgorCisjZGVmaW5lIFNFQ1VSRSh4KSAoIi9zZWN1cmUvIit4KQorI2RlZmluZSBLUkFFVVRFUlZDU0FWRUZJTEUgU0VDVVJFKCJBUkNIL2tyYWV1dGVyVkMiKQorI2RlZmluZSBQTEFOVE1BU1RFUiAgICAgICAgKFNFQ1VSRSgia3JhdXRtYXN0ZXIiKSkKKyNkZWZpbmUgS1JBRVVURVJWQyAgICAgICAgIFBMQU5URElSInZpcnR1YWxfY29tcGlsZXIiCisKKyNkZWZpbmUgU1REUExBTlQgICAgICAgICAgICIvc3RkL2l0ZW1zL2tyYWV1dGVyL2tyYXV0IgorI2RlZmluZSBQTEFOVElURU0gICAgICAgICAgUExBTlRESVIia3JhdXQiCisjZGVmaW5lIFNURFRSQU5LICAgICAgICAgICAiL3N0ZC9pdGVtcy9rcmFldXRlci90cmFuayIKKyNkZWZpbmUgVFJBTktJVEVNICAgICAgICAgIFBMQU5URElSInRyYW5rIgorCisjZGVmaW5lIEtFU1NFTElEICAgICAgICAgICAiX2xpYlxua3JhZXV0ZXJrZXNzZWwiCisKKyNkZWZpbmUgSU5HUkVESUVOVF9JRCAgICAgICAgICAgMAorI2RlZmluZSBJTkdSRURJRU5UX0RFTU9OICAgICAgICAxCisjZGVmaW5lIElOR1JFRElFTlRfR0VOREVSICAgICAgIDIKKyNkZWZpbmUgSU5HUkVESUVOVF9OQU1FICAgICAgICAgMworI2RlZmluZSBJTkdSRURJRU5UX0FESiAgICAgICAgICA0CisjZGVmaW5lIElOR1JFRElFTlRfTE9ORyAgICAgICAgIDUKKyNkZWZpbmUgSU5HUkVESUVOVF9ST09NREVUQUlMICAgNgorCisjZGVmaW5lIFBMQU5UX1JPT01ERVRBSUwgICAiX2xpYl9wX3BsYW50cm9vbWRldGFpbCIKKworI2RlZmluZSBJU19QTEFOVCh4KSAobWVtYmVyKGluaGVyaXRfbGlzdCh4KSwgXAorICAgICAgICAgICAgICAgICAgICAgIi9zdGQvaXRlbXMva3JhZXV0ZXIva3JhdXQuYyIpPj0wKQorCisjZW5kaWYgLy8gX19LUkFFVVRFUl9IX18KKwpkaWZmIC0tZ2l0IGEvc3lzL2l0ZW1zL2tyYWV1dGVyL2tyYWV1dGVybGlzdGUuaCBiL3N5cy9pdGVtcy9rcmFldXRlci9rcmFldXRlcmxpc3RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU5ZDUzZgotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9pdGVtcy9rcmFldXRlci9rcmFldXRlcmxpc3RlLmgKQEAgLTAsMCArMSwyNTYgQEAKKy8vIEF1dG9tYXRpc2NoIGdlbmVyaWVydGVzIEZpbGUsIG5pY2h0IHZvbiBIYW5kIGVkaXRpZXJlbiEKKy8vIEVyemV1Z2VuZGVzIEZpbGU6IC9zZWN1cmUva3JhdXRtYXN0ZXIKKworI2RlZmluZSBQTEFOVENPVU5UIDI0OQorCisjZGVmaW5lIFBMQU5UKHgpICIvaXRlbXMva3JhZXV0ZXIvIit4CisKKyNkZWZpbmUgWllQUkVTU0VOV09MRlNNSUxDSCAgICAgICAgICAgIFBMQU5UKCJ6eXByZXNzZW53b2xmc21pbGNoIikKKyNkZWZpbmUgWldPRUxGRklOR0VSS1JBVVQgICAgICAgICAgICAgIFBMQU5UKCJ6d29lbGZmaW5nZXJrcmF1dCIpCisjZGVmaW5lIFpXSVJCRUxXVVJaICAgICAgICAgICAgICAgICAgICBQTEFOVCgiendpcmJlbHd1cnoiKQorI2RlZmluZSBaV0VSR1dVUlogICAgICAgICAgICAgICAgICAgICAgUExBTlQoInp3ZXJnd3VyeiIpCisjZGVmaW5lIFpXRVJHRU5IVVQgICAgICAgICAgICAgICAgICAgICBQTEFOVCgiendlcmdlbmh1dCIpCisjZGVmaW5lIFpXQUNLRUxLUkFVVCAgICAgICAgICAgICAgICAgICBQTEFOVCgiendhY2tlbGtyYXV0IikKKyNkZWZpbmUgWk9PS1pXSUVCRUwgICAgICAgICAgICAgICAgICAgIFBMQU5UKCJ6b29rendpZWJlbCIpCisjZGVmaW5lIFpJQ0taQUNLX0tMRUUgICAgICAgICAgICAgICAgICBQTEFOVCgiemlja3phY2tfa2xlZSIpCisjZGVmaW5lIFpFU1NUUkFaV0lFQkVMICAgICAgICAgICAgICAgICBQTEFOVCgiemVzc3RyYXp3aWViZWwiKQorI2RlZmluZSBaQVBQRVJMSUxJRSAgICAgICAgICAgICAgICAgICAgUExBTlQoInphcHBlcmxpbGllIikKKyNkZWZpbmUgV1VSWkVMU0lMSUUgICAgICAgICAgICAgICAgICAgIFBMQU5UKCJ3dXJ6ZWxzaWxpZSIpCisjZGVmaW5lIFdVUk1LUkFVVCAgICAgICAgICAgICAgICAgICAgICBQTEFOVCgid3VybWtyYXV0IikKKyNkZWZpbmUgV1VOREtMRUUgICAgICAgICAgICAgICAgICAgICAgIFBMQU5UKCJ3dW5ka2xlZSIpCisjZGVmaW5lIFdVRVNURU5ST1NFICAgICAgICAgICAgICAgICAgICBQTEFOVCgid3Vlc3RlbnJvc2UiKQorI2RlZmluZSBXVUVTVEVORU5aSUFOICAgICAgICAgICAgICAgICAgUExBTlQoInd1ZXN0ZW5lbnppYW4iKQorI2RlZmluZSBXVUVSR0VSS1JBVVQgICAgICAgICAgICAgICAgICAgUExBTlQoInd1ZXJnZXJrcmF1dCIpCisjZGVmaW5lIFdPTFBJVFJPRVNURVIgICAgICAgICAgICAgICAgICBQTEFOVCgid29scGl0cm9lc3RlciIpCisjZGVmaW5lIFdJTkRXVVJaICAgICAgICAgICAgICAgICAgICAgICBQTEFOVCgid2luZHd1cnoiKQorI2RlZmluZSBXSU5ETkVTU0VMICAgICAgICAgICAgICAgICAgICAgUExBTlQoIndpbmRuZXNzZWwiKQorI2RlZmluZSBXSUxIRUxNU0JVUkdFUl9TSUVCRU5TVEVSTiAgICAgUExBTlQoIndpbGhlbG1zYnVyZ2VyX3NpZWJlbnN0ZXJuIikKKyNkZWZpbmUgV0lFU0VOU0NIQVVNS1JBVVQgICAgICAgICAgICAgIFBMQU5UKCJ3aWVzZW5zY2hhdW1rcmF1dCIpCisjZGVmaW5lIFdJRVNFTlJJU1BFICAgICAgICAgICAgICAgICAgICBQTEFOVCgid2llc2VucmlzcGUiKQorI2RlZmluZSBXSUVTRU5SRVRUSUNIICAgICAgICAgICAgICAgICAgUExBTlQoIndpZXNlbnJldHRpY2giKQorI2RlZmluZSBXSUVTRU5NRUxERSAgICAgICAgICAgICAgICAgICAgUExBTlQoIndpZXNlbm1lbGRlIikKKyNkZWZpbmUgV0lFU0VOTElDSFRORUxLRSAgICAgICAgICAgICAgIFBMQU5UKCJ3aWVzZW5saWNodG5lbGtlIikKKyNkZWZpbmUgV0lFU0VOS1VDS1VDS1NCTFVNRSAgICAgICAgICAgIFBMQU5UKCJ3aWVzZW5rdWNrdWNrc2JsdW1lIikKKyNkZWZpbmUgV0lFU0VOS0VSQkVMICAgICAgICAgICAgICAgICAgIFBMQU5UKCJ3aWVzZW5rZXJiZWwiKQorI2RlZmluZSBXSUVTRU5HTE9DS0VOQkxVTUUgICAgICAgICAgICAgUExBTlQoIndpZXNlbmdsb2NrZW5ibHVtZSIpCisjZGVmaW5lIFdJRVNFTkJVVFRFUkJMVU1FICAgICAgICAgICAgICBQTEFOVCgid2llc2VuYnV0dGVyYmx1bWUiKQorI2RlZmluZSBXRVJXT0xGU01JTENIX0dSVUVOICAgICAgICAgICAgUExBTlQoIndlcndvbGZzbWlsY2hfZ3J1ZW4iKQorI2RlZmluZSBXRUlTU1dVUlpfVklFTEJMVUVUSUcgICAgICAgICAgUExBTlQoIndlaXNzd3Vyel92aWVsYmx1ZXRpZyIpCisjZGVmaW5lIFdFSVNTV1VSWl9RVUlSTEJMQUVUVFJJRyAgICAgICBQTEFOVCgid2Vpc3N3dXJ6X3F1aXJsYmxhZXR0cmlnIikKKyNkZWZpbmUgV0VJU1NXVVJaX0dFTUVJTiAgICAgICAgICAgICAgIFBMQU5UKCJ3ZWlzc3d1cnpfZ2VtZWluIikKKyNkZWZpbmUgV0VJU1NLTEVFICAgICAgICAgICAgICAgICAgICAgIFBMQU5UKCJ3ZWlzc2tsZWUiKQorI2RlZmluZSBXRUlERU5LTEVFICAgICAgICAgICAgICAgICAgICAgUExBTlQoIndlaWRlbmtsZWUiKQorI2RlZmluZSBXQVNTRVJXVVJaICAgICAgICAgICAgICAgICAgICAgUExBTlQoIndhc3Nlcnd1cnoiKQorI2RlZmluZSBXQVNTRVJSRVRUSUNIICAgICAgICAgICAgICAgICAgUExBTlQoIndhc3NlcnJldHRpY2giKQorI2RlZmluZSBXQVNTRVJLTEVFICAgICAgICAgICAgICAgICAgICAgUExBTlQoIndhc3NlcmtsZWUiKQorI2RlZmluZSBXQVNTRVJfSEFITkVORlVTU19XRUlTUyAgICAgICAgUExBTlQoIndhc3Nlcl9oYWhuZW5mdXNzX3dlaXNzIikKKyNkZWZpbmUgV0FSWkVOV09MRlNNSUxDSCAgICAgICAgICAgICAgIFBMQU5UKCJ3YXJ6ZW53b2xmc21pbGNoIikKKyNkZWZpbmUgV0FMRFNDSEFUVEVOUkFVVEVOV0lDS0UgICAgICAgIFBMQU5UKCJ3YWxkc2NoYXR0ZW5yYXV0ZW53aWNrZSIpCisjZGVmaW5lIFdBTERSRVRUSUNIICAgICAgICAgICAgICAgICAgICBQTEFOVCgid2FsZHJldHRpY2giKQorI2RlZmluZSBXQUxEUkVCRV9XRUlTUyAgICAgICAgICAgICAgICAgUExBTlQoIndhbGRyZWJlX3dlaXNzIikKKyNkZWZpbmUgV0FMRFJFQkVfU0NIV0FSWiAgICAgICAgICAgICAgIFBMQU5UKCJ3YWxkcmViZV9zY2h3YXJ6IikKKyNkZWZpbmUgV0FMRFJFQkVfUk9UICAgICAgICAgICAgICAgICAgIFBMQU5UKCJ3YWxkcmViZV9yb3QiKQorI2RlZmluZSBXQUxEUkVCRV9HRU1FSU4gICAgICAgICAgICAgICAgUExBTlQoIndhbGRyZWJlX2dlbWVpbiIpCisjZGVmaW5lIFdBTERNT09TX0xBTkdMRUJJRyAgICAgICAgICAgICBQTEFOVCgid2FsZG1vb3NfbGFuZ2xlYmlnIikKKyNkZWZpbmUgV0FMRE1PT1MgICAgICAgICAgICAgICAgICAgICAgIFBMQU5UKCJ3YWxkbW9vcyIpCisjZGVmaW5lIFdBTERMSUNIVE5FTEtFICAgICAgICAgICAgICAgICBQTEFOVCgid2FsZGxpY2h0bmVsa2UiKQorI2RlZmluZSBXQUxERU5aSUFOICAgICAgICAgICAgICAgICAgICAgUExBTlQoIndhbGRlbnppYW4iKQorI2RlZmluZSBWT0dFTEhBTkYgICAgICAgICAgICAgICAgICAgICAgUExBTlQoInZvZ2VsaGFuZiIpCisjZGVmaW5lIFZBSU5FUlBJTFogICAgICAgICAgICAgICAgICAgICBQTEFOVCgidmFpbmVycGlseiIpCisjZGVmaW5lIFRZUE9OSUEgICAgICAgICAgICAgICAgICAgICAgICBQTEFOVCgidHlwb25pYSIpCisjZGVmaW5lIFRST1BFTkVOWklBTiAgICAgICAgICAgICAgICAgICBQTEFOVCgidHJvcGVuZW56aWFuIikKKyNkZWZpbmUgVFJPTExUUk9FU1RFUiAgICAgICAgICAgICAgICAgIFBMQU5UKCJ0cm9sbHRyb2VzdGVyIikKKyNkZWZpbmUgVFJPTExTQ0hNQVJPVFpFUiAgICAgICAgICAgICAgIFBMQU5UKCJ0cm9sbHNjaG1hcm90emVyIikKKyNkZWZpbmUgVFJBRVVNRVJTQ0hMSU5HRSAgICAgICAgICAgICAgIFBMQU5UKCJ0cmFldW1lcnNjaGxpbmdlIikKKyNkZWZpbmUgVE9SRk1PT1JSQVVURU5XSUNLRV9HTEFUVCAgICAgIFBMQU5UKCJ0b3JmbW9vcnJhdXRlbndpY2tlX2dsYXR0IikKKyNkZWZpbmUgVE9SRk1PT1JSQVVURU5XSUNLRV9HRVpBSE5UICAgIFBMQU5UKCJ0b3JmbW9vcnJhdXRlbndpY2tlX2dlemFobnQiKQorI2RlZmluZSBUT1JGTU9PUlJBVVRFTldJQ0tFX0dFRlJBTlNUICAgUExBTlQoInRvcmZtb29ycmF1dGVud2lja2VfZ2VmcmFuc3QiKQorI2RlZmluZSBURVVGRUxTS1JBTExFX1NDSFdBUlogICAgICAgICAgUExBTlQoInRldWZlbHNrcmFsbGVfc2Nod2FyeiIpCisjZGVmaW5lIFRFVUZFTFNLUkFMTEVfUk9UICAgICAgICAgICAgICBQTEFOVCgidGV1ZmVsc2tyYWxsZV9yb3QiKQorI2RlZmluZSBURVVGRUxTS1JBTExFX1JJU1BJRyAgICAgICAgICAgUExBTlQoInRldWZlbHNrcmFsbGVfcmlzcGlnIikKKyNkZWZpbmUgVEVVRkVMU0tSQUxMRV9LT1BGSUcgICAgICAgICAgIFBMQU5UKCJ0ZXVmZWxza3JhbGxlX2tvcGZpZyIpCisjZGVmaW5lIFRFVUZFTFNLUkFMTEVfRFJFSUtBTlRJRyAgICAgICBQTEFOVCgidGV1ZmVsc2tyYWxsZV9kcmVpa2FudGlnIikKKyNkZWZpbmUgVEVVRkVMU0tSQUxMRV9CVVNDSElHICAgICAgICAgIFBMQU5UKCJ0ZXVmZWxza3JhbGxlX2J1c2NoaWciKQorI2RlZmluZSBURVVGRUxTS1JBTExFX0FFSFJJRyAgICAgICAgICAgUExBTlQoInRldWZlbHNrcmFsbGVfYWVocmlnIikKKyNkZWZpbmUgVEVVRkVMU0FCQklTU19HRU1FSU4gICAgICAgICAgIFBMQU5UKCJ0ZXVmZWxzYWJiaXNzX2dlbWVpbiIpCisjZGVmaW5lIFNVTVBGUkVUVElDSCAgICAgICAgICAgICAgICAgICBQTEFOVCgic3VtcGZyZXR0aWNoIikKKyNkZWZpbmUgU1VNUEZSRUJFX1NDSFdBUlogICAgICAgICAgICAgIFBMQU5UKCJzdW1wZnJlYmVfc2Nod2FyeiIpCisjZGVmaW5lIFNVTVBGUkFVVEVOV0lDS0UgICAgICAgICAgICAgICBQTEFOVCgic3VtcGZyYXV0ZW53aWNrZSIpCisjZGVmaW5lIFNVTVBGTElDSFRORUxLRSAgICAgICAgICAgICAgICBQTEFOVCgic3VtcGZsaWNodG5lbGtlIikKKyNkZWZpbmUgU1VFU1NLTEVFICAgICAgICAgICAgICAgICAgICAgIFBMQU5UKCJzdWVzc2tsZWUiKQorI2RlZmluZSBTVFVQU0tSQVVUICAgICAgICAgICAgICAgICAgICAgUExBTlQoInN0dXBza3JhdXQiKQorI2RlZmluZSBTVEVSTk1JRVJFICAgICAgICAgICAgICAgICAgICAgUExBTlQoInN0ZXJubWllcmUiKQorI2RlZmluZSBTVEVSTkVORkxFQ0hURSAgICAgICAgICAgICAgICAgUExBTlQoInN0ZXJuZW5mbGVjaHRlIikKKyNkZWZpbmUgU1RFSU5CRUlTU0VSS05PTExFICAgICAgICAgICAgIFBMQU5UKCJzdGVpbmJlaXNzZXJrbm9sbGUiKQorI2RlZmluZSBTUElUWldFR0VSSUNIICAgICAgICAgICAgICAgICAgUExBTlQoInNwaXR6d2VnZXJpY2giKQorI2RlZmluZSBTT05ORU5XRU5EV09MRlNNSUxDSCAgICAgICAgICAgUExBTlQoInNvbm5lbndlbmR3b2xmc21pbGNoIikKKyNkZWZpbmUgU09OTkVOUElMWiAgICAgICAgICAgICAgICAgICAgIFBMQU5UKCJzb25uZW5waWx6IikKKyNkZWZpbmUgU09NTUVSRklORExJTkcgICAgICAgICAgICAgICAgIFBMQU5UKCJzb21tZXJmaW5kbGluZyIpCisjZGVmaW5lIFNJQ0hFTE5FTEtFICAgICAgICAgICAgICAgICAgICBQTEFOVCgic2ljaGVsbmVsa2UiKQorI2RlZmluZSBTQ0hXQVJaV1VSWl9XSUxEICAgICAgICAgICAgICAgUExBTlQoInNjaHdhcnp3dXJ6X3dpbGQiKQorI2RlZmluZSBTQ0hXQVJaV1VSWl9LUklFQ0hFTkQgICAgICAgICAgUExBTlQoInNjaHdhcnp3dXJ6X2tyaWVjaGVuZCIpCisjZGVmaW5lIFNDSFdBUlpXVVJaX0dFWkFDS1QgICAgICAgICAgICBQTEFOVCgic2Nod2Fyend1cnpfZ2V6YWNrdCIpCisjZGVmaW5lIFNDSFdBUlpXVVJaX0dFTUVJTiAgICAgICAgICAgICBQTEFOVCgic2Nod2Fyend1cnpfZ2VtZWluIikKKyNkZWZpbmUgU0NIV0FSWlNDSEFUVEVOTU9PUyAgICAgICAgICAgIFBMQU5UKCJzY2h3YXJ6c2NoYXR0ZW5tb29zIikKKyNkZWZpbmUgU0NIV0FMQkVOV1VSWl9FTlpJQU4gICAgICAgICAgIFBMQU5UKCJzY2h3YWxiZW53dXJ6X2VuemlhbiIpCisjZGVmaW5lIFNDSFVFVFRFTEtSQVVUICAgICAgICAgICAgICAgICBQTEFOVCgic2NodWV0dGVsa3JhdXQiKQorI2RlZmluZSBTQ0hJTEZSQVVURU5XSUNLRSAgICAgICAgICAgICAgUExBTlQoInNjaGlsZnJhdXRlbndpY2tlIikKKyNkZWZpbmUgU0NIQVRURU5LUkFVVCAgICAgICAgICAgICAgICAgIFBMQU5UKCJzY2hhdHRlbmtyYXV0IikKKyNkZWZpbmUgU0NIQU5ES1JBVVQgICAgICAgICAgICAgICAgICAgIFBMQU5UKCJzY2hhbmRrcmF1dCIpCisjZGVmaW5lIFNBVUVSS0xFRSAgICAgICAgICAgICAgICAgICAgICBQTEFOVCgic2F1ZXJrbGVlIikKKyNkZWZpbmUgUklFU0VOT1JLU0NIT1JGTElOR19MSUxBX0dFUFVOS1RFVCBQTEFOVCgicmllc2Vub3Jrc2Nob3JmbGluZ19saWxhX2dlcHVua3RldCIpCisjZGVmaW5lIFJFR0VOV1VSWiAgICAgICAgICAgICAgICAgICAgICBQTEFOVCgicmVnZW53dXJ6IikKKyNkZWZpbmUgUkFVVEVOV0lDS0VfRkVVUklHICAgICAgICAgICAgIFBMQU5UKCJyYXV0ZW53aWNrZV9mZXVyaWciKQorI2RlZmluZSBSQVVDSEtSRVNTRSAgICAgICAgICAgICAgICAgICAgUExBTlQoInJhdWNoa3Jlc3NlIikKKyNkZWZpbmUgUkFUU0hFUlJFTktSRVNTRSAgICAgICAgICAgICAgIFBMQU5UKCJyYXRzaGVycmVua3Jlc3NlIikKKyNkZWZpbmUgUkFTQ0hFTEtSQVVUICAgICAgICAgICAgICAgICAgIFBMQU5UKCJyYXNjaGVsa3JhdXQiKQorI2RlZmluZSBQT1RURVJSQVVURU5XSUNLRV9HTEFUVCAgICAgICAgUExBTlQoInBvdHRlcnJhdXRlbndpY2tlX2dsYXR0IikKKyNkZWZpbmUgUE9UVEVSUkFVVEVOV0lDS0VfR0VGUkFOU1QgICAgIFBMQU5UKCJwb3R0ZXJyYXV0ZW53aWNrZV9nZWZyYW5zdCIpCisjZGVmaW5lIFBPTEFSV09MRlNNSUxDSCAgICAgICAgICAgICAgICBQTEFOVCgicG9sYXJ3b2xmc21pbGNoIikKKyNkZWZpbmUgUE9MQVJCSVJLRU5HRVNFTExFICAgICAgICAgICAgIFBMQU5UKCJwb2xhcmJpcmtlbmdlc2VsbGUiKQorI2RlZmluZSBPUkFOR1VUQU5IQU5GICAgICAgICAgICAgICAgICAgUExBTlQoIm9yYW5ndXRhbmhhbmYiKQorI2RlZmluZSBORUJFTFJBVVRFTldJQ0tFX0dMQVRUICAgICAgICAgUExBTlQoIm5lYmVscmF1dGVud2lja2VfZ2xhdHQiKQorI2RlZmluZSBORUJFTFJBVVRFTldJQ0tFX0dFWkFITlQgICAgICAgUExBTlQoIm5lYmVscmF1dGVud2lja2VfZ2V6YWhudCIpCisjZGVmaW5lIE5FQkVMUkFVVEVOV0lDS0VfR0VGUkFOU1QgICAgICBQTEFOVCgibmViZWxyYXV0ZW53aWNrZV9nZWZyYW5zdCIpCisjZGVmaW5lIE5FQkVMTU9PU19UUlVFR0VSSVNDSCAgICAgICAgICBQTEFOVCgibmViZWxtb29zX3RydWVnZXJpc2NoIikKKyNkZWZpbmUgTkVBTkRFUlRBTEVSX0tOT0NIRU5NT09TICAgICAgIFBMQU5UKCJuZWFuZGVydGFsZXJfa25vY2hlbm1vb3MiKQorI2RlZmluZSBOQUNIVFNDSEFUVEVOX1NDSFdBUlogICAgICAgICAgUExBTlQoIm5hY2h0c2NoYXR0ZW5fc2Nod2FyeiIpCisjZGVmaW5lIE1PVUxPS0lORVJfU0lFQkVOU1RFUk4gICAgICAgICBQTEFOVCgibW91bG9raW5lcl9zaWViZW5zdGVybiIpCisjZGVmaW5lIE1PUk9ORVJfU0lFQkVOU1RFUk4gICAgICAgICAgICBQTEFOVCgibW9yb25lcl9zaWViZW5zdGVybiIpCisjZGVmaW5lIE1PT1JSRVRUSUNIICAgICAgICAgICAgICAgICAgICBQTEFOVCgibW9vcnJldHRpY2giKQorI2RlZmluZSBNSVJJTFNaV0lFQkVMICAgICAgICAgICAgICAgICAgUExBTlQoIm1pcmlsc3p3aWViZWwiKQorI2RlZmluZSBNRUVSUkVUVElDSCAgICAgICAgICAgICAgICAgICAgUExBTlQoIm1lZXJyZXR0aWNoIikKKyNkZWZpbmUgTUFMVEVLUkVTU0UgICAgICAgICAgICAgICAgICAgIFBMQU5UKCJtYWx0ZWtyZXNzZSIpCisjZGVmaW5lIE1BRVVTRUhBTkYgICAgICAgICAgICAgICAgICAgICBQTEFOVCgibWFldXNlaGFuZiIpCisjZGVmaW5lIExVTkdFTl9FTlpJQU5fRFVOS0VMQkxBVSAgICAgICBQTEFOVCgibHVuZ2VuX2Vuemlhbl9kdW5rZWxibGF1IikKKyNkZWZpbmUgTE9FV0VOSEFORiAgICAgICAgICAgICAgICAgICAgIFBMQU5UKCJsb2V3ZW5oYW5mIikKKyNkZWZpbmUgTElDSFRORUxLRV9ST1QgICAgICAgICAgICAgICAgIFBMQU5UKCJsaWNodG5lbGtlX3JvdCIpCisjZGVmaW5lIExFSU1LUkFVVF9XRUlTUyAgICAgICAgICAgICAgICBQTEFOVCgibGVpbWtyYXV0X3dlaXNzIikKKyNkZWZpbmUgTEVJTUtSQVVUX1JPVCAgICAgICAgICAgICAgICAgIFBMQU5UKCJsZWlta3JhdXRfcm90IikKKyNkZWZpbmUgTEVJTUtSQVVUX05JQ0tFTkQgICAgICAgICAgICAgIFBMQU5UKCJsZWlta3JhdXRfbmlja2VuZCIpCisjZGVmaW5lIExFSU1LUkFVVF9LTEVCUklHICAgICAgICAgICAgICBQTEFOVCgibGVpbWtyYXV0X2tsZWJyaWciKQorI2RlZmluZSBMRUlNS1JBVVRfQVVGR0VCTEFTRU4gICAgICAgICAgUExBTlQoImxlaW1rcmF1dF9hdWZnZWJsYXNlbiIpCisjZGVmaW5lIExFQkVSTU9PUyAgICAgICAgICAgICAgICAgICAgICBQTEFOVCgibGViZXJtb29zIikKKyNkZWZpbmUgTEFVQ0hLUkVTU0UgICAgICAgICAgICAgICAgICAgIFBMQU5UKCJsYXVjaGtyZXNzZSIpCisjZGVmaW5lIExBVUJNT09TICAgICAgICAgICAgICAgICAgICAgICBQTEFOVCgibGF1Ym1vb3MiKQorI2RlZmluZSBMQU5HRklOR0VSS1JBVVRfQVVGUkVDSFQgICAgICAgUExBTlQoImxhbmdmaW5nZXJrcmF1dF9hdWZyZWNodCIpCisjZGVmaW5lIEtVQ0tVQ0tTTElDSFRORUxLRSAgICAgICAgICAgICBQTEFOVCgia3Vja3Vja3NsaWNodG5lbGtlIikKKyNkZWZpbmUgS1JPTkVOWldJRUJFTCAgICAgICAgICAgICAgICAgIFBMQU5UKCJrcm9uZW56d2llYmVsIikKKyNkZWZpbmUgS1JJRVNFTFpXSUVCRUwgICAgICAgICAgICAgICAgIFBMQU5UKCJrcmllc2VsendpZWJlbCIpCisjZGVmaW5lIEtPQk9MRFNXVVJaX0dFVFVFUEZFTFQgICAgICAgICBQTEFOVCgia29ib2xkc3d1cnpfZ2V0dWVwZmVsdCIpCisjZGVmaW5lIEtOVVJSUElMWiAgICAgICAgICAgICAgICAgICAgICBQTEFOVCgia251cnJwaWx6IikKKyNkZWZpbmUgS0xFSU5CVUdFUklDSCAgICAgICAgICAgICAgICAgIFBMQU5UKCJrbGVpbmJ1Z2VyaWNoIikKKyNkZWZpbmUgS0xFRUZBUk4gICAgICAgICAgICAgICAgICAgICAgIFBMQU5UKCJrbGVlZmFybiIpCisjZGVmaW5lIEtMRUVfV0VJU1MgICAgICAgICAgICAgICAgICAgICBQTEFOVCgia2xlZV93ZWlzcyIpCisjZGVmaW5lIEtMRUVfVFJPUEZJRyAgICAgICAgICAgICAgICAgICBQTEFOVCgia2xlZV90cm9wZmlnIikKKyNkZWZpbmUgS0xFRV9ST1QgICAgICAgICAgICAgICAgICAgICAgIFBMQU5UKCJrbGVlX3JvdCIpCisjZGVmaW5lIEtMRUVfUEVSU0lTQ0ggICAgICAgICAgICAgICAgICBQTEFOVCgia2xlZV9wZXJzaXNjaCIpCisjZGVmaW5lIEtMRUVfS1JJRUNIRU5EICAgICAgICAgICAgICAgICBQTEFOVCgia2xlZV9rcmllY2hlbmQiKQorI2RlZmluZSBLTEVFX0tPUEZJRyAgICAgICAgICAgICAgICAgICAgUExBTlQoImtsZWVfa29wZmlnIikKKyNkZWZpbmUgS0xFRV9ET0xESUcgICAgICAgICAgICAgICAgICAgIFBMQU5UKCJrbGVlX2RvbGRpZyIpCisjZGVmaW5lIEtJQ0hFUlBJTFogICAgICAgICAgICAgICAgICAgICBQTEFOVCgia2ljaGVycGlseiIpCisjZGVmaW5lIEtJQ0hFUktSRVNTRSAgICAgICAgICAgICAgICAgICBQTEFOVCgia2ljaGVya3Jlc3NlIikKKyNkZWZpbmUgS0FUWkVOV1VSWiAgICAgICAgICAgICAgICAgICAgIFBMQU5UKCJrYXR6ZW53dXJ6IikKKyNkZWZpbmUgS0FUWkVOSEFORiAgICAgICAgICAgICAgICAgICAgIFBMQU5UKCJrYXR6ZW5oYW5mIikKKyNkZWZpbmUgSk9GU1dVUlogICAgICAgICAgICAgICAgICAgICAgIFBMQU5UKCJqb2Zzd3VyeiIpCisjZGVmaW5lIElOS0FSTkFUS0xFRSAgICAgICAgICAgICAgICAgICBQTEFOVCgiaW5rYXJuYXRrbGVlIikKKyNkZWZpbmUgSFlEUkFaQUhOICAgICAgICAgICAgICAgICAgICAgIFBMQU5UKCJoeWRyYXphaG4iKQorI2RlZmluZSBIWURSQUJBTFNBTUtSQVVUX0dST1NTICAgICAgICAgUExBTlQoImh5ZHJhYmFsc2Fta3JhdXRfZ3Jvc3MiKQorI2RlZmluZSBIVU5HRVJLUkFVVCAgICAgICAgICAgICAgICAgICAgUExBTlQoImh1bmdlcmtyYXV0IikKKyNkZWZpbmUgSFVOREVIQU5GICAgICAgICAgICAgICAgICAgICAgIFBMQU5UKCJodW5kZWhhbmYiKQorI2RlZmluZSBIVU1OSVpXSUVCRUwgICAgICAgICAgICAgICAgICAgUExBTlQoImh1bW5pendpZWJlbCIpCisjZGVmaW5lIEhVRVBGRVJMSVNMICAgICAgICAgICAgICAgICAgICBQTEFOVCgiaHVlcGZlcmxpc2wiKQorI2RlZmluZSBIT05JR0tMRUUgICAgICAgICAgICAgICAgICAgICAgUExBTlQoImhvbmlna2xlZSIpCisjZGVmaW5lIEhFWEVOVFJBVU1fUVVJRVRTQ0hHUlVFTiAgICAgICBQTEFOVCgiaGV4ZW50cmF1bV9xdWlldHNjaGdydWVuIikKKyNkZWZpbmUgSEVYRU5LUkFVVF9XSUxEICAgICAgICAgICAgICAgIFBMQU5UKCJoZXhlbmtyYXV0X3dpbGQiKQorI2RlZmluZSBIRVhFTktSQVVUX1ZFUkJSQU5OVCAgICAgICAgICAgUExBTlQoImhleGVua3JhdXRfdmVyYnJhbm50IikKKyNkZWZpbmUgSEVYRU5LUkFVVF9LUkVVWkJMQUVUVFJJRyAgICAgIFBMQU5UKCJoZXhlbmtyYXV0X2tyZXV6YmxhZXR0cmlnIikKKyNkZWZpbmUgSEVYRU5LUkFVVF9LTEVJTiAgICAgICAgICAgICAgIFBMQU5UKCJoZXhlbmtyYXV0X2tsZWluIikKKyNkZWZpbmUgSEVYRU5LUkFVVF9HUk9TUyAgICAgICAgICAgICAgIFBMQU5UKCJoZXhlbmtyYXV0X2dyb3NzIikKKyNkZWZpbmUgSEVYRU5LUkFVVF9HRU1FSU4gICAgICAgICAgICAgIFBMQU5UKCJoZXhlbmtyYXV0X2dlbWVpbiIpCisjZGVmaW5lIEhFWEVOS1JBVVRfQlJBVU4gICAgICAgICAgICAgICBQTEFOVCgiaGV4ZW5rcmF1dF9icmF1biIpCisjZGVmaW5lIEhFWEVOS1JBVVRfMTNfRklOR1JJRyAgICAgICAgICBQTEFOVCgiaGV4ZW5rcmF1dF8xM19maW5ncmlnIikKKyNkZWZpbmUgSEFTRU5LTEVFICAgICAgICAgICAgICAgICAgICAgIFBMQU5UKCJoYXNlbmtsZWUiKQorI2RlZmluZSBIQU5HUkFVVEVOV0lDS0VfV0VJU1NfR0VQVU5LVEVUIFBMQU5UKCJoYW5ncmF1dGVud2lja2Vfd2Vpc3NfZ2VwdW5rdGV0IikKKyNkZWZpbmUgSEFOR1JBVVRFTldJQ0tFICAgICAgICAgICAgICAgIFBMQU5UKCJoYW5ncmF1dGVud2lja2UiKQorI2RlZmluZSBIQU1NRVJLUkFVVCAgICAgICAgICAgICAgICAgICAgUExBTlQoImhhbW1lcmtyYXV0IikKKyNkZWZpbmUgSEFMVEVLUkVTU0UgICAgICAgICAgICAgICAgICAgIFBMQU5UKCJoYWx0ZWtyZXNzZSIpCisjZGVmaW5lIEhBSE5FTkZVU1NfV09MTElHICAgICAgICAgICAgICBQTEFOVCgiaGFobmVuZnVzc193b2xsaWciKQorI2RlZmluZSBIQUhORU5GVVNTX1NQUkVJWkVORCAgICAgICAgICAgUExBTlQoImhhaG5lbmZ1c3Nfc3ByZWl6ZW5kIikKKyNkZWZpbmUgSEFITkVORlVTU19TQ0hBUkYgICAgICAgICAgICAgIFBMQU5UKCJoYWhuZW5mdXNzX3NjaGFyZiIpCisjZGVmaW5lIEhBSE5FTkZVU1NfS1JJRUNIRU5EICAgICAgICAgICBQTEFOVCgiaGFobmVuZnVzc19rcmllY2hlbmQiKQorI2RlZmluZSBIQUhORU5GVVNTX0tOT0xMSUcgICAgICAgICAgICAgUExBTlQoImhhaG5lbmZ1c3Nfa25vbGxpZyIpCisjZGVmaW5lIEhBSE5FTkZVU1NfR0VMQiAgICAgICAgICAgICAgICBQTEFOVCgiaGFobmVuZnVzc19nZWxiIikKKyNkZWZpbmUgSEFITkVORlVTU19HQUNLRVJORCAgICAgICAgICAgIFBMQU5UKCJoYWhuZW5mdXNzX2dhY2tlcm5kIikKKyNkZWZpbmUgSEFITkVORlVTU19GTFVURU5EICAgICAgICAgICAgIFBMQU5UKCJoYWhuZW5mdXNzX2ZsdXRlbmQiKQorI2RlZmluZSBIQUhORU5GVVNTX0VJU0VOSFVUQkxBRVRUUklHICAgUExBTlQoImhhaG5lbmZ1c3NfZWlzZW5odXRibGFldHRyaWciKQorI2RlZmluZSBIQUhORU5GVVNTX0VGRVVCTEFFVFRSSUcgICAgICAgUExBTlQoImhhaG5lbmZ1c3NfZWZldWJsYWV0dHJpZyIpCisjZGVmaW5lIEhBSE5FTkZVU1NfQlJFTk5FTkQgICAgICAgICAgICBQTEFOVCgiaGFobmVuZnVzc19icmVubmVuZCIpCisjZGVmaW5lIEdPTERIQUhORU5GVVNTICAgICAgICAgICAgICAgICBQTEFOVCgiZ29sZGhhaG5lbmZ1c3MiKQorI2RlZmluZSBHTE9DS0VOQkxVTUUgICAgICAgICAgICAgICAgICAgUExBTlQoImdsb2NrZW5ibHVtZSIpCisjZGVmaW5lIEdMRVRTQ0hFUl9IQUhORU5GVVNTX1JPVCAgICAgICBQTEFOVCgiZ2xldHNjaGVyX2hhaG5lbmZ1c3Nfcm90IikKKyNkZWZpbmUgR0lQRkVMUkFVVEVOV0lDS0VfV0lMRCAgICAgICAgIFBMQU5UKCJnaXBmZWxyYXV0ZW53aWNrZV93aWxkIikKKyNkZWZpbmUgR0VTRUxMRU5LUkVTU0UgICAgICAgICAgICAgICAgIFBMQU5UKCJnZXNlbGxlbmtyZXNzZSIpCisjZGVmaW5lIEdFQklSR1NSRVRUSUNIICAgICAgICAgICAgICAgICBQTEFOVCgiZ2ViaXJnc3JldHRpY2giKQorI2RlZmluZSBHRUJJUkdTRU5aSUFOICAgICAgICAgICAgICAgICAgUExBTlQoImdlYmlyZ3NlbnppYW4iKQorI2RlZmluZSBHQUVOU0VGSU5HRVJLUkFVVCAgICAgICAgICAgICAgUExBTlQoImdhZW5zZWZpbmdlcmtyYXV0IikKKyNkZWZpbmUgR0FFTlNFQkxVRU1DSEVOICAgICAgICAgICAgICAgIFBMQU5UKCJnYWVuc2VibHVlbWNoZW4iKQorI2RlZmluZSBGVVRURVJLUkVTU0UgICAgICAgICAgICAgICAgICAgUExBTlQoImZ1dHRlcmtyZXNzZSIpCisjZGVmaW5lIEZSVUVITElOR1NGSU5HRVJLUkFVVCAgICAgICAgICBQTEFOVCgiZnJ1ZWhsaW5nc2ZpbmdlcmtyYXV0IikKKyNkZWZpbmUgRlJVRUhMSU5HU19FTlpJQU5fUE9MU1RFUldVRUNIU0lHIFBMQU5UKCJmcnVlaGxpbmdzX2Vuemlhbl9wb2xzdGVyd3VlY2hzaWciKQorI2RlZmluZSBGUlVFSExJTkdTX0VOWklBTl9ISU1NRUxCTEFVICAgUExBTlQoImZydWVobGluZ3NfZW56aWFuX2hpbW1lbGJsYXUiKQorI2RlZmluZSBGUlVFSExJTkdTX0VOWklBTl9GVUVORlpJUEZMSUcgUExBTlQoImZydWVobGluZ3NfZW56aWFuX2Z1ZW5memlwZmxpZyIpCisjZGVmaW5lIEZSVUVITElOR1NfRU5aSUFOICAgICAgICAgICAgICBQTEFOVCgiZnJ1ZWhsaW5nc19lbnppYW4iKQorI2RlZmluZSBGUk9TVFJFQkVfUk9UICAgICAgICAgICAgICAgICAgUExBTlQoImZyb3N0cmViZV9yb3QiKQorI2RlZmluZSBGUk9TVEVOWklBTiAgICAgICAgICAgICAgICAgICAgUExBTlQoImZyb3N0ZW56aWFuIikKKyNkZWZpbmUgRlJBTlNFTkVOWklBTiAgICAgICAgICAgICAgICAgIFBMQU5UKCJmcmFuc2VuZW56aWFuIikKKyNkZWZpbmUgRklOU1RFUk1PT1MgICAgICAgICAgICAgICAgICAgIFBMQU5UKCJmaW5zdGVybW9vcyIpCisjZGVmaW5lIEZJTkdFUktSQVVUX0tSSUVDSEVORCAgICAgICAgICBQTEFOVCgiZmluZ2Vya3JhdXRfa3JpZWNoZW5kIikKKyNkZWZpbmUgRklOR0VSS1JBVVRfR1JPU1NCTFVFVElHICAgICAgIFBMQU5UKCJmaW5nZXJrcmF1dF9ncm9zc2JsdWV0aWciKQorI2RlZmluZSBGSU5HRVJLUkFVVF9BVUZSRUNIVCAgICAgICAgICAgUExBTlQoImZpbmdlcmtyYXV0X2F1ZnJlY2h0IikKKyNkZWZpbmUgRkVVRVJUVUxQRSAgICAgICAgICAgICAgICAgICAgIFBMQU5UKCJmZXVlcnR1bHBlIikKKyNkZWZpbmUgRkVVRVJFTlpJQU4gICAgICAgICAgICAgICAgICAgIFBMQU5UKCJmZXVlcmVuemlhbiIpCisjZGVmaW5lIEZFTERLTEVFICAgICAgICAgICAgICAgICAgICAgICBQTEFOVCgiZmVsZGtsZWUiKQorI2RlZmluZSBGRUxEX0VOWklBTl9CTEFVVklPTEVUVCAgICAgICAgUExBTlQoImZlbGRfZW56aWFuX2JsYXV2aW9sZXR0IikKKyNkZWZpbmUgRVJEQkVFUkZJTkdFUktSQVVUICAgICAgICAgICAgIFBMQU5UKCJlcmRiZWVyZmluZ2Vya3JhdXQiKQorI2RlZmluZSBFTlpJQU5fU1RFTkdFTExPUyAgICAgICAgICAgICAgUExBTlQoImVuemlhbl9zdGVuZ2VsbG9zIikKKyNkZWZpbmUgRU5aSUFOX0dFTEIgICAgICAgICAgICAgICAgICAgIFBMQU5UKCJlbnppYW5fZ2VsYiIpCisjZGVmaW5lIEVMRkVOT0hSV1VSWiAgICAgICAgICAgICAgICAgICBQTEFOVCgiZWxmZW5vaHJ3dXJ6IikKKyNkZWZpbmUgRUxFRkFOVEVOSEFORiAgICAgICAgICAgICAgICAgIFBMQU5UKCJlbGVmYW50ZW5oYW5mIikKKyNkZWZpbmUgRUlTWldJRUJFTCAgICAgICAgICAgICAgICAgICAgIFBMQU5UKCJlaXN6d2llYmVsIikKKyNkZWZpbmUgRUlTWkFITiAgICAgICAgICAgICAgICAgICAgICAgIFBMQU5UKCJlaXN6YWhuIikKKyNkZWZpbmUgRUlTV1VSWiAgICAgICAgICAgICAgICAgICAgICAgIFBMQU5UKCJlaXN3dXJ6IikKKyNkZWZpbmUgRUlTU1RFUk4gICAgICAgICAgICAgICAgICAgICAgIFBMQU5UKCJlaXNzdGVybiIpCisjZGVmaW5lIEVJU05FU1NFTCAgICAgICAgICAgICAgICAgICAgICBQTEFOVCgiZWlzbmVzc2VsIikKKyNkZWZpbmUgRUlTS1JBVVQgICAgICAgICAgICAgICAgICAgICAgIFBMQU5UKCJlaXNrcmF1dCIpCisjZGVmaW5lIEVJU0VOWldJRUJFTCAgICAgICAgICAgICAgICAgICBQTEFOVCgiZWlzZW56d2llYmVsIikKKyNkZWZpbmUgRUlTRE9STiAgICAgICAgICAgICAgICAgICAgICAgIFBMQU5UKCJlaXNkb3JuIikKKyNkZWZpbmUgRUlTRElTVEVMICAgICAgICAgICAgICAgICAgICAgIFBMQU5UKCJlaXNkaXN0ZWwiKQorI2RlZmluZSBEVU5LRUxQSUxaICAgICAgICAgICAgICAgICAgICAgUExBTlQoImR1bmtlbHBpbHoiKQorI2RlZmluZSBEVU5LRUxNT09TICAgICAgICAgICAgICAgICAgICAgUExBTlQoImR1bmtlbG1vb3MiKQorI2RlZmluZSBEVUVTVEVSWldJRUJFTF9GSU5TVEVSICAgICAgICAgUExBTlQoImR1ZXN0ZXJ6d2llYmVsX2ZpbnN0ZXIiKQorI2RlZmluZSBEUkVJRklOR0VSS1JBVVRfR1JPU1NCTFVFVElHICAgUExBTlQoImRyZWlmaW5nZXJrcmF1dF9ncm9zc2JsdWV0aWciKQorI2RlZmluZSBEUkVJRklOR0VSS1JBVVRfR0VNRUlOICAgICAgICAgUExBTlQoImRyZWlmaW5nZXJrcmF1dF9nZW1laW4iKQorI2RlZmluZSBEUkFDSEVOWklOTkVORE9STl9HRVNDSEVDS1QgICAgUExBTlQoImRyYWNoZW56aW5uZW5kb3JuX2dlc2NoZWNrdCIpCisjZGVmaW5lIERSQUNIRU5IT1JURVJfU0lFQkVOU1RFUk4gICAgICBQTEFOVCgiZHJhY2hlbmhvcnRlcl9zaWViZW5zdGVybiIpCisjZGVmaW5lIERSQUNIRU5IQU5GICAgICAgICAgICAgICAgICAgICBQTEFOVCgiZHJhY2hlbmhhbmYiKQorI2RlZmluZSBCVVNDSFJFQkVfTklFREVSICAgICAgICAgICAgICAgUExBTlQoImJ1c2NocmViZV9uaWVkZXIiKQorI2RlZmluZSBCVVNDSFJFQkVfR1JPU1MgICAgICAgICAgICAgICAgUExBTlQoImJ1c2NocmViZV9ncm9zcyIpCisjZGVmaW5lIEJSVU5ORU5LUkVTU0UgICAgICAgICAgICAgICAgICBQTEFOVCgiYnJ1bm5lbmtyZXNzZSIpCisjZGVmaW5lIEJSRUlUV0VHRVJJQ0ggICAgICAgICAgICAgICAgICBQTEFOVCgiYnJlaXR3ZWdlcmljaCIpCisjZGVmaW5lIEJPQ0tTSE9STktMRUUgICAgICAgICAgICAgICAgICBQTEFOVCgiYm9ja3Nob3Jua2xlZSIpCisjZGVmaW5lIEJMVVRORUxLRSAgICAgICAgICAgICAgICAgICAgICBQTEFOVCgiYmx1dG5lbGtlIikKKyNkZWZpbmUgQklUVEVSS0xFRSAgICAgICAgICAgICAgICAgICAgIFBMQU5UKCJiaXR0ZXJrbGVlIikKKyNkZWZpbmUgQkVSR1JFVFRJQ0ggICAgICAgICAgICAgICAgICAgIFBMQU5UKCJiZXJncmV0dGljaCIpCisjZGVmaW5lIEJFUkdSQVVURU5XSUNLRV9HRVpBSE5UICAgICAgICBQTEFOVCgiYmVyZ3JhdXRlbndpY2tlX2dlemFobnQiKQorI2RlZmluZSBCRVJHUkFVVEVOV0lDS0VfR0VNRUlOICAgICAgICAgUExBTlQoImJlcmdyYXV0ZW53aWNrZV9nZW1laW4iKQorI2RlZmluZSBCRVJHTU9PUyAgICAgICAgICAgICAgICAgICAgICAgUExBTlQoImJlcmdtb29zIikKKyNkZWZpbmUgQkVSR0tMRUUgICAgICAgICAgICAgICAgICAgICAgIFBMQU5UKCJiZXJna2xlZSIpCisjZGVmaW5lIEJBRVJMQVBQTU9PUyAgICAgICAgICAgICAgICAgICBQTEFOVCgiYmFlcmxhcHBtb29zIikKKyNkZWZpbmUgQkFFUkVOS0xBVSAgICAgICAgICAgICAgICAgICAgIFBMQU5UKCJiYWVyZW5rbGF1IikKKyNkZWZpbmUgQVVHRU5UUk9TVF9HRU1FSU4gICAgICAgICAgICAgIFBMQU5UKCJhdWdlbnRyb3N0X2dlbWVpbiIpCisjZGVmaW5lIEFSS1pXSUVCRUwgICAgICAgICAgICAgICAgICAgICBQTEFOVCgiYXJrendpZWJlbCIpCisjZGVmaW5lIEFSQVRIT1JOU0lMSUtVTV9XRUlTICAgICAgICAgICBQTEFOVCgiYXJhdGhvcm5zaWxpa3VtX3dlaXMiKQorI2RlZmluZSBBQ0tFUkxJQ0hUTkVMS0UgICAgICAgICAgICAgICAgUExBTlQoImFja2VybGljaHRuZWxrZSIpCisjZGVmaW5lIEFDS0VSS0xFRV9HRUxCICAgICAgICAgICAgICAgICBQTEFOVCgiYWNrZXJrbGVlX2dlbGIiKQorI2RlZmluZSBBQ0tFUl9SRVRUSUNIICAgICAgICAgICAgICAgICAgUExBTlQoImFja2VyX3JldHRpY2giKQpkaWZmIC0tZ2l0IGEvc3lzL2l0ZW1zL2tyYWV1dGVyL3RyYW5rYXR0cmlidXRlLmggYi9zeXMvaXRlbXMva3JhZXV0ZXIvdHJhbmthdHRyaWJ1dGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODQzNDdjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL2l0ZW1zL2tyYWV1dGVyL3RyYW5rYXR0cmlidXRlLmgKQEAgLTAsMCArMSw1OSBAQAorI2lmbmRlZiBfX0tSQUVVVEVSX1RSQU5LQVRUUklCVVRFX0hfXworI2RlZmluZSBfX0tSQUVVVEVSX1RSQU5LQVRUUklCVVRFX0hfXworCisjZGVmaW5lIFRfQ0FSUlkgICAgICAgICAgICAgICAgICJhdHRyX3RyYWdlbiIKKyNkZWZpbmUgVF9EQU1BR0VfQU5JTUFMUyAgICAgICAgImF0dHJfZGFtX2FuaW1hbHMiCisjZGVmaW5lIFRfREFNQUdFX01BR0lDICAgICAgICAgICJhdHRyX2RhbV9tYWdpY2FsIgorI2RlZmluZSBUX0RBTUFHRV9VTkRFQUQgICAgICAgICAiYXR0cl9kYW1fdW5kZWFkIgorI2RlZmluZSBUX1BST1RFQ1RJT05fQU5JTUFMUyAgICAiYXR0cl9wcm90X2FuaW1hbHMiCisjZGVmaW5lIFRfUFJPVEVDVElPTl9NQUdJQyAgICAgICJhdHRyX3Byb3RfbWFnaWNhbCIKKyNkZWZpbmUgVF9QUk9URUNUSU9OX1VOREVBRCAgICAgImF0dHJfcHJvdF91bmRlYWQiCisjZGVmaW5lIFRfRlJPRyAgICAgICAgICAgICAgICAgICJhdHRyX2RlZnJvZyIKKyNkZWZpbmUgVF9GTEVFX1RQT1JUICAgICAgICAgICAgImF0dHJfZmxlZV90cG9ydCIKKyNkZWZpbmUgVF9IRUFMX0xQICAgICAgICAgICAgICAgImF0dHJfaGVhbF9scCIKKyNkZWZpbmUgVF9IRUFMX1NQICAgICAgICAgICAgICAgImF0dHJfaGVhbF9zcCIKKyNkZWZpbmUgVF9IRUFMX1BPSVNPTiAgICAgICAgICAgImF0dHJfaGVhbF9wb2lzb24iCisjZGVmaW5lIFRfSEVBTF9ESVNFQVNFICAgICAgICAgICJhdHRyX2hlYWxfZGlzZWFzZSIKKyNkZWZpbmUgVF9DSEFOR0VfRElNRU5TSU9OICAgICAgImF0dHJfY2hhbmdlX2RpbWVuc2lvbiIKKyNkZWZpbmUgVF9TQV9TUEVFRCAgICAgICAgICAgICAgImF0dHJfY2hhbmdlX3NhX3NwZWVkIgorI2RlZmluZSBUX1NBX0RVUkFUSU9OICAgICAgICAgICAiYXR0cl9jaGFuZ2Vfc2FfZHVyYXRpb24iCisjZGVmaW5lIFRfU0FfU1BFTExfUEVORVRSQVRJT04gICJhdHRyX2NoYW5nZV9zYV9zcGVsbF9wZW5ldHJhdGlvbiIKKyNkZWZpbmUgVF9FRkZFQ1RfRFVSQVRJT04gICAgICAgImF0dHJfZWZmZWN0X2R1cmF0aW9uIgorI2RlZmluZSBUX1NVUFBPUlRFUiAgICAgICAgICAgICAiYXR0cl9zdXBwb3J0ZXIiCisjZGVmaW5lIFRfQkxPQ0tJTkcgICAgICAgICAgICAgICJhdHRyX2Jsb2NraW5nIgorI2RlZmluZSBUX0FCVU5EQU5DRSAgICAgICAgICAgICAiYXR0cl9hYnVuZGFuY2UiCisjZGVmaW5lIFRfRVhQSVJFICAgICAgICAgICAgICAgICJiZXN0X2JlZm9yZSIKKworI2RlZmluZSBUX0tSQVVUX0VGRkVDVFMgKHsgXAorICAgIFRfQ0FSUlksIFRfREFNQUdFX0FOSU1BTFMsIFRfREFNQUdFX01BR0lDLCBcCisgICAgVF9EQU1BR0VfVU5ERUFELCBUX1BST1RFQ1RJT05fQU5JTUFMUywgVF9QUk9URUNUSU9OX01BR0lDLCBcCisgICAgVF9QUk9URUNUSU9OX1VOREVBRCwgVF9GUk9HLCBUX0ZMRUVfVFBPUlQsIFRfSEVBTF9MUCwgVF9IRUFMX1NQLCBcCisgICAgVF9IRUFMX1BPSVNPTiwgVF9IRUFMX0RJU0VBU0UsIFRfQ0hBTkdFX0RJTUVOU0lPTiwgXAorICAgIFRfU0FfU1BFRUQsIFRfU0FfRFVSQVRJT04sIFRfU0FfU1BFTExfUEVORVRSQVRJT04sIH0pCisKKyNkZWZpbmUgVF9LUkFVVF9NQVAgXAorICAoWyJjYXIiOiBUX0NBUlJZLCBcCisgICAgImRhIjogIFRfREFNQUdFX0FOSU1BTFMsIFwKKyAgICAiZG0iOiAgVF9EQU1BR0VfTUFHSUMsIFwKKyAgICAiZHUiOiAgVF9EQU1BR0VfVU5ERUFELCBcCisgICAgImRuIjogIFRfRUZGRUNUX0RVUkFUSU9OLCBcCisgICAgImZsdCI6IFRfRkxFRV9UUE9SVCwgXAorICAgICJmcm8iOiBUX0ZST0csIFwKKyAgICAiaEkiOiAgVF9IRUFMX0RJU0VBU0UsIFwKKyAgICAiaFAiOiAgVF9IRUFMX1BPSVNPTiwgXAorICAgICJoSyI6ICBUX0hFQUxfU1AsIFwKKyAgICAiaEwiOiAgVF9IRUFMX0xQLCBcCisgICAgInBhIjogIFRfUFJPVEVDVElPTl9BTklNQUxTLCBcCisgICAgInBtIjogIFRfUFJPVEVDVElPTl9NQUdJQywgXAorICAgICJwdSI6ICBUX1BST1RFQ1RJT05fVU5ERUFELCBcCisgICAgInNzIjogIFRfU0FfU1BFRUQsIFwKKyAgICAic3AiOiAgVF9TQV9TUEVMTF9QRU5FVFJBVElPTiwgXAorICAgICJzZCI6ICBUX1NBX0RVUkFUSU9OIF0pCisKKy8vIG5lZ2F0aXZlIEVmZmVrdGUgbXVlc3NzZW4gYWJzLiBncm9lc3NlciBhbHMgZGllcyBzZWluLCBkYW1pdCBzaWUgYmVpIGRlciBXaXJrdW5nCisvLyBiZXJ1ZWNrc2ljaHRpZ3Qgd2VyZGVuLgorI2RlZmluZSBUX01JTklNVU1fVEhSRVNIT0xECTE1MAorLy8gRGllcyBpc3QgZGVyIG1heC4gRWZmZWt0LiBBbGxlcywgd2FzIGhpZXJ1ZWJlciBnZWJ0LCB3aXJkIGdlZGVja2VsdC4KKyNkZWZpbmUgVF9NQVhJTVVNX1RIUkVTSE9MRAkyMDAwCisKKyNlbmRpZiAvLyBfX0tSQUVVVEVSX1RSQU5LQVRUUklCVVRFX0hfXwpkaWZmIC0tZ2l0IGEvc3lzL2xhbmd1YWdlLmggYi9zeXMvbGFuZ3VhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWQ2YTQxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL2xhbmd1YWdlLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPHRoaW5nL2xhbmd1YWdlLmg+CmRpZmYgLS1naXQgYS9zeXMvbGlnaHRzb3VyY2UuaCBiL3N5cy9saWdodHNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMDkyOGIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvbGlnaHRzb3VyY2UuaApAQCAtMCwwICsxLDE1IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gbGlnaHRzb3VyY2UuaCAtLSBsaWdodHNvdXJjZXMgaGVhZGVyIGZpbGUKKy8vCisvLyAkSWQ6IGxpZ2h0c291cmNlLmgsdiAxLjEgMjAwMC8wMi8wOSAxNTo1Mjo0OCBQYWRyZWljIEV4cCAkCisgCisjaWZuZGVmIF9fTElHSFRTT1VSQ0VfSF9fCisjZGVmaW5lIF9fTElHSFRTT1VSQ0VfSF9fCisKKyNkZWZpbmUgUF9GVUVMICAgICAgICAgImZ1ZWwiICAgICAgICAvLyBCcmVubnplaXQgaW4gU2VrdW5kZW4KKyNkZWZpbmUgUF9MSUdIVERFU0MgICAgImxpZ2h0ZGVzYyIgICAvLyBCZXNjaHJlaWJ1bmcgZGVzIExpY2h0cworI2RlZmluZSBQX0RPX0RFU1RSVUNUICAiZG9fZGVzdHJ1Y3QiIC8vIFNvbGwgc2ljaCBkaWUgTGljaHRxdWVsbGUgYXVmbG9lc2VuPworI2RlZmluZSBQX0xJR0hURUQgICAgICAibGlnaHRlZCIgICAgIC8vIEZsYWcgb2IgZGllIExpY2h0cXVlbGxlIGluIEJldHJpZWIgaXN0CisKKyNlbmRpZiAvLyBfX0xJR0hUU09VUkNFX0hfXwpkaWZmIC0tZ2l0IGEvc3lzL2xpdmluZy5oIGIvc3lzL2xpdmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZjUzODAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvbGl2aW5nLmgKQEAgLTAsMCArMSwzMSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGxpdmluZy5oIC0tIEhlYWRlciBmdWVyIExlYmV3ZXNlbgorLy8KKy8vICRJZDogbGl2aW5nLmggNjUxMyAyMDA3LTEwLTA2IDE1OjU1OjI3WiBaZXNzdHJhICQKKworI2luY2x1ZGUgIi9zeXMvbGl2aW5nL2xpZmUuaCIKKyNpbmNsdWRlICIvc3lzL2xpdmluZy9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAiL3N5cy9saXZpbmcvcHV0X2FuZF9nZXQuaCIKKyNpbmNsdWRlICIvc3lzL2xpdmluZy9jb21iYXQuaCIKKyNpbmNsdWRlICIvc3lzL2xpdmluZy90ZWFtLmgiCisjaW5jbHVkZSAiL3N5cy9saXZpbmcvc2tpbGxzLmgiCisvLyNpbmNsdWRlICIvc3lzL2xpdmluZy9tb3ZpbmcuaCIKKworI2lmbmRlZiBfX0xJVklOR19IX18KKyNkZWZpbmUgX19MSVZJTkdfSF9fCisKKyNkZWZpbmUgSU5URVJWQUxfQkVUV0VFTl9IRUFMSU5HCTEwCisjZGVmaW5lIFdFQVBPTl9DTEFTU19PRl9IQU5EUwkJKDMpCisjZGVmaW5lIEFSTU9VUl9DTEFTU19PRl9CQVJFCQkwCisjZGVmaW5lIEtJTExfTkVVVFJBTF9BTElHTk1FTlQJCTEwCisjZGVmaW5lIEFESl9BTElHTk1FTlQoYWwpCQkoKC1hbCAtIEtJTExfTkVVVFJBTF9BTElHTk1FTlQpLzQpCisjZGVmaW5lIE1BWF9MSVNUCQkJMjAKKyNkZWZpbmUgTkFNRV9PRl9HSE9TVAkJCSJzb21lIG1pc3QiCisKKy8qIEhhbmRzICovCisjZGVmaW5lIEhBTkRfU0hPUlQgMAorI2RlZmluZSBIQU5EX1dFQVBPTiAxCisjZGVmaW5lIEhBTkRfV0MgMgorCisjZW5kaWYgLy8gX19MSVZJTkdfSF9fCmRpZmYgLS1naXQgYS9zeXMvbGl2aW5nL2F0dHJpYnV0ZXMuaCBiL3N5cy9saXZpbmcvYXR0cmlidXRlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMjgyOTkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvbGl2aW5nL2F0dHJpYnV0ZXMuaApAQCAtMCwwICsxLDk2IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gbGl2aW5nL2F0dHJpYnV0ZXMuaCAtLSBsaXZpbmcgYXR0cmlidXRlcworLy8KKy8vICRJZDogYXR0cmlidXRlcy5oIDYyODIgMjAwNy0wNS0wOSAyMDo1NToxN1ogWmVzc3RyYSAkCisgCisjaWZuZGVmIF9fTElWSU5HX0FUVFJJQlVURVNfSF9fCisjZGVmaW5lIF9fTElWSU5HX0FUVFJJQlVURVNfSF9fCisKKy8vIHByb3BlcnRpZXMKKworI2RlZmluZSBQX0FUVFJJQlVURVMgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIgorI2RlZmluZSBQX0FUVFJJQlVURVNfT0ZGU0VUUyAgICAgICJhdHRyaWJ1dGVzX29mZnNldHMiCisjZGVmaW5lIFBfQVRUUklCVVRFU19NT0RJRklFUiAgICAgImF0dHJpYnV0ZXNfbW9kaWZpZXIiCisjZGVmaW5lIFBfWF9BVFRSX01PRCAgICAgICAgICAgICAgImV4dGVybl9hdHRyaWJ1dGVzX21vZGlmaWVyIgorI2RlZmluZSBQX1hfSEVBTFRIX01PRCAgICAgICAgICAgICJleHRlcm5faGVhbHRoX21vZGlmaWVyIgorI2RlZmluZSBQX01fQVRUUl9NT0QgICAgICAgICAgICAgICJtYWdpY19hdHRyaWJ1dGVzX21vZGlmaWVyIgorI2RlZmluZSBQX01fSEVBTFRIX01PRCAgICAgICAgICAgICJtYWdpY19oZWFsdGhfbW9kaWZpZXIiCisjZGVmaW5lIFBfQUJJTElUSUVTICAgICAgICAgICAgICAgImFiaWxpdGllcyIKKyNkZWZpbmUgUF9USU1FRF9BVFRSX01PRAkJICAidGltZWRfYXR0cl9tb2QiCisKKy8vIHNwZWNpYWwgZGVmaW5lcworCisvKiBzdGFuZGFyZCBhdHRyaWJ1dGVzICovCisjZGVmaW5lIEFfU1RSICJzdHIiCisjZGVmaW5lIEFfSU5UICJpbnQiCisjZGVmaW5lIEFfREVYICJkZXgiCisjZGVmaW5lIEFfQ09OICJjb24iCisKKy8qIGVycm9yY29kZXMgZm9yIFBfVElNRURfQVRUUl9NT0QgKi8KKyNkZWZpbmUgVEFUVFJfT0sJCQkJMAorI2RlZmluZSBUQVRUUl9OT19TVUNIX01PRElGSUVSCTEKKyNkZWZpbmUgVEFUVFJfSU5WQUxJRF9BUkdTICAJMgorCisvKiBpbmRpY2VzIHVzZWQgZm9yIFBfVElNRURfQVRUUl9NT0QgKi8KKyNkZWZpbmUgVEFUVFJfT1VUREFURQkJMAorI2RlZmluZSBUQVRUUl9ERVBFTkRFTlRTCTEKKyNkZWZpbmUgVEFUVFJfRU5UUklFUwkJMgkKKyNkZWZpbmUgVEFUVFJfTU9EIAkJMAorI2RlZmluZSBUQVRUUl9PVVREQVRFRCAJCTEKKyNkZWZpbmUgVEFUVFJfREVQRU5ERU5UIAkyCisjZGVmaW5lIFRBVFRSX05PVElGWSAJCTMKKworLyogbWF4aW11bSBvZiBjdW11bGF0aXZlIGF0dHJpYnV0ZSBtb2RpZmllcnMgKi8KKyNkZWZpbmUgQ1VNVUxBVElWRV9BVFRSX0xJTUlUCTQKKworI2VuZGlmIC8vIF9fTElWSU5HX0FUVFJJQlVURVNfSF9fCisKKyNpZmRlZiBORUVEX1BST1RPVFlQRVMKKworI2lmbmRlZiBfX0xJVklOR19BVFRSSUJVVEVTX0hfUFJPVE9fXworI2RlZmluZSBfX0xJVklOR19BVFRSSUJVVEVTX0hfUFJPVE9fXworCisvLyBwcm90b3R5cGVzCisKK25vbWFzayBwdWJsaWMgaW50IFNldFRpbWVkQXR0ck1vZGlmaWVyKHN0cmluZyBrZXksIG1hcHBpbmcgbW9kaWZpZXIsIGludCBvdXRkYXRlZCwgb2JqZWN0IGRlcGVuZGVudCwgbWl4ZWQgbm90aWZ5KTsgIAorbm9tYXNrIHB1YmxpYyBtYXBwaW5nIFF1ZXJ5VGltZWRBdHRyTW9kaWZpZXIoc3RyaW5nIGtleSk7Citub21hc2sgcHVibGljIGludCBEZWxldGVUaW1lZEF0dHJNb2RpZmllcihzdHJpbmcga2V5KTsKKworcHVibGljIGludCBTZXRBdHRyKHN0cmluZyBhdHRyLCBpbnQgdmFsKTsKK25vbWFzayBwdWJsaWMgdm9pZCByZWdpc3Rlcl9tb2RpZmllcihvYmplY3QgbW9kaWZpZXIpOworbm9tYXNrIHB1YmxpYyB2b2lkIGRlcmVnaXN0ZXJfbW9kaWZpZXIob2JqZWN0IG1vZGlmaWVyKTsKKworcHVibGljIGludCBTZXRBdHRyaWJ1dGUoc3RyaW5nIGF0dHIsIGludCB2YWwpOworcHVibGljIGludCBTZXRSZWFsQXR0cmlidXRlKHN0cmluZyBhdHRyLCBpbnQgdmFsKTsKK3B1YmxpYyBpbnQgUXVlcnlBdHRyaWJ1dGUoc3RyaW5nIGF0dHIpOworcHVibGljIGludCBRdWVyeVJlYWxBdHRyaWJ1dGUoc3RyaW5nIGF0dHIpOworcHVibGljIGludCBRdWVyeUF0dHJpYnV0ZU9mZnNldChzdHJpbmcgYXR0cik7CisKK3B1YmxpYyB2b2lkIFVwZGF0ZUF0dHJpYnV0ZXMoKTsKKworcHVibGljIHN0YXR1cyBUZXN0TGltaXRWaW9sYXRpb24obWFwcGluZyBjaGVjayk7CisKKy8vIFNldC0gdW5kIFF1ZXJ5LU1ldGhvZGVuCitzdGF0aWMgbWFwcGluZyBfc2V0X2F0dHJpYnV0ZXMobWFwcGluZyBhcnIpOworc3RhdGljIG1hcHBpbmcgX3F1ZXJ5X2F0dHJpYnV0ZXMoKTsKK3N0YXRpYyBtYXBwaW5nIF9zZXRfYXR0cmlidXRlc19vZmZzZXRzKG1hcHBpbmcgYXJyKTsKK3N0YXRpYyBtYXBwaW5nIF9xdWVyeV9hdHRyaWJ1dGVzX29mZnNldHMoKTsKK3N0YXRpYyBtaXhlZCAgIF9zZXRfYXR0cmlidXRlc19tb2RpZmllcihtaXhlZCBhcnIpOworc3RhdGljIG1hcHBpbmcgX3F1ZXJ5X2F0dHJpYnV0ZXNfbW9kaWZpZXIoKTsKK3N0YXRpYyBtaXhlZCBfcXVlcnlfdGltZWRfYXR0cl9tb2QoKTsKKworLy8gaW50ZXJuYWwKK25vbWFzayBwcm90ZWN0ZWQgdm9pZCBhdHRyaWJ1dGVfaGIoKTsKK3Byb3RlY3RlZCB2b2lkIGFkZF9vZmZzZXRzKG1hcHBpbmcgYXJyKTsKK3Byb3RlY3RlZCBub21hc2sgdm9pZCBjYWxjdWxhdGVfdmFsaWRfbW9kaWZpZXJzKCk7Citwcm90ZWN0ZWQgbm9tYXNrIHZvaWQgbm90aWZ5SW52YWxpZE1vZGlmaWVycygpOworcHJvdGVjdGVkIGludCBfZmlsdGVyYXR0cl9zdHIoaW50IHZhbCk7Citwcm90ZWN0ZWQgaW50IF9maWx0ZXJhdHRyX2RleChpbnQgdmFsKTsKK3Byb3RlY3RlZCBpbnQgX2ZpbHRlcmF0dHJfaW50KGludCB2YWwpOworcHJvdGVjdGVkIGludCBfZmlsdGVyYXR0cl9jb24oaW50IHZhbCk7Citub21hc2sgcHJvdGVjdGVkIHZvaWQgbm90aWZ5RXhwaXJlZE1vZGlmaWVycyhtYXBwaW5nIG5vdHMpOworCisjZW5kaWYgLy8gX19MSVZJTkdfQVRUUklCVVRFU19IX1BST1RPX18KKworI2VuZGlmIC8vIE5FRURfUFJPVE9ZUEVTCmRpZmYgLS1naXQgYS9zeXMvbGl2aW5nL2Nsb3RoaW5nLmggYi9zeXMvbGl2aW5nL2Nsb3RoaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg3NWM2MQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9saXZpbmcvY2xvdGhpbmcuaApAQCAtMCwwICsxLDEyIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gbGl2aW5nL2Nsb3RoaW5nLmggLS0gS29uc3RhbnRlbiB1bmQgUGZhZGUgcnVuZCB1bSBCZWtsZWlkdW5nIHZvbiBMZWJld2VzZW4KKy8vCisvLyAkSWQ6IG1vbmV5aGFuZGxlci5oLHYgMy4xIDE5OTcvMDIvMTIgMTM6Mjk6MDkgV2FyZ29uIEV4cCAlCisKKyNpZm5kZWYgX19MSVZJTkdfQ0xPVEhJTkdfSF9fCisjZGVmaW5lIF9fTElWSU5HX0NMT1RISU5HX0hfXworCisjZGVmaW5lIFBfQ0xPVEhJTkcgICAgICAgICAgICAgICAgInN0ZDpjbG90aGluZyIKKworI2VuZGlmIC8vIF9fTElWSU5HX0NMT1RISU5HX0hfXwpkaWZmIC0tZ2l0IGEvc3lzL2xpdmluZy9jb21iYXQuaCBiL3N5cy9saXZpbmcvY29tYmF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI4ZjQ0NgotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9saXZpbmcvY29tYmF0LmgKQEAgLTAsMCArMSwxNjYgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBsaXZpbmcvY29tYmF0LmggLS0gY29tYmF0IGhlYWRlcgorLy8KKy8vICRJZDogY29tYmF0LmggOTAwOCAyMDE1LTAxLTA2IDE3OjIwOjE3WiBaZXNzdHJhICQKKworI2lmbmRlZiBfX0xJVklOR19DT01CQVRfSF9fCisjZGVmaW5lIF9fTElWSU5HX0NPTUJBVF9IX18KKworLy8gcHJvcGVydGllcworI2RlZmluZSBQX0RJU0FCTEVfQVRUQUNLICAgICAgICAgICJkaXNhYmxlX2F0dGFjayIKKyNkZWZpbmUgUF9ORVhUX0RJU0FCTEVfQVRUQUNLICAgICAibmV4dF9kaXNhYmxlX2F0dGFjayIKKworI2RlZmluZSBQX0NPUlBTRSAgICAgICAgICAgICAgICAgICJjb3Jwc2UiCisjZGVmaW5lIFBfTk9DT1JQU0UgICAgICAgICAgICAgICAgIm5vY29ycHNlIgorCisvLyBiaXR0ZSBQX0FSTU9VUlMgYXVjaCBpbiAvc2VjdXJlL21hc3Rlci5oIGFlbmRlcm4sIGZhbGxzIGRhcyBtYWwgZ2VhZW5kZXJ0CisvLyB3aXJkLgorI2RlZmluZSBQX0FSTU9VUlMgICAgICAgICAgICAgICAgICJhcm1vdXJzIgorI2RlZmluZSBQX0JPRFkgICAgICAgICAgICAgICAgICAgICJib2R5IgorCisjZGVmaW5lIFBfUkVTSVNUQU5DRV9TVFJFTkdUSFMgICAgInJlc2lzdGFuY2Vfc3RyZW5ndGhzIgorI2RlZmluZSBQX1JFU0lTVEFOQ0VfTU9ESUZJRVIgICAgICJyc3RyOm1vZCIKKyNkZWZpbmUgUF9SRVNJU1RBTkNFICAgICAgICAgICAgICAicmVzaXN0YW5jZSIKKyNkZWZpbmUgUF9WVUxORVJBQklMSVRZICAgICAgICAgICAidnVsbmVyYWJpbGl0eSIKKyNkZWZpbmUgUF9UT1RBTF9BQyAJICAgICAgICAgICJ0b3RhbF9hYyIKKyNkZWZpbmUgUF9UT1RBTF9XQyAgICAgICAgICAgICAgICAidG90YWxfd2MiCisKKyNkZWZpbmUgUF9IQU5EUyAgICAgICAgICAgICAgICAgICAiaGFuZHMiCisjZGVmaW5lIFBfTUFYX0hBTkRTICAgICAgICAgICAgICAgIm1heF9oYW5kcyIKKyNkZWZpbmUgUF9VU0VEX0hBTkRTICAgICAgICAgICAgICAidXNlZF9oYW5kcyIKKyNkZWZpbmUgUF9GUkVFX0hBTkRTICAgICAgICAgICAgICAiZnJlZV9oYW5kcyIKKyNkZWZpbmUgUF9IQU5EU19VU0VEX0JZICAgICAgICAgICAiaGFuZHNfdXNlZF9ieSIKKworI2RlZmluZSBQX0FUVEFDS19CVVNZCSAgICAgICAgICAiYXR0YWNrX2J1c3kiCisjZGVmaW5lIFBfTk9fQVRUQUNLICAgICAgICAgICAgICAgIm5vX2F0dGFjayIKKworI2RlZmluZSBQX1BSRUZFUkVEX0VORU1ZICAgICAgICAgICJwcmVmX2VuZW15IgorI2RlZmluZSBQX1NIT1dfQVRUQUNLX01TRyAgICAgICAgICJzaG93X2F0dGFja19tc2ciCisKKyNkZWZpbmUgUF9MQVNUX0RBTUFHRSAgICAgICAgICAgICAibGFzdF9kYW1hZ2UiCisjZGVmaW5lIFBfTEFTVF9EQU1UWVBFUyAgICAgICAgICAgImxhc3RfZGFtdHlwZXMiCisjZGVmaW5lIFBfTEFTVF9EQU1USU1FICAgICAgICAgICAgImxhc3RfZGFtdGltZSIKKworI2RlZmluZSBQX0RFQVRIX1NQT05TT1JFRF9CWSAgICAgICJyZXNwb25zaWJsZV93aXphcmRfZm9yX2RlYXRoIgorI2RlZmluZSBQX0tJTExFUiAgICAgICAgICAgICAgICAgICJraWxsZXIiCisjZGVmaW5lIFBfTVVSREVSX01TRyAgICAgICAgICAgICAgIm11cmRlcl9tc2ciCisjZGVmaW5lIFBfRk9SQ0VfTVVSREVSX01TRyAgICAgICAgImZvcmNlX211cmRlcl9tc2ciCisjZGVmaW5lIFBfRU5FTVlfREVBVEhfU0VRVUVOQ0UgICAgImVuZW15X2RlYXRoX3NlcXVlbmNlIgorI2RlZmluZSBQX05FWFRfREVBVEhfU0VRVUVOQ0UgICAgICJwX2xpYl9uZXh0X2RlYXRoX3NlcXVlbmNlIgorI2RlZmluZSBQX0RFQVRIX01TRyAgICAgICAgICAgICAgICJkZWF0aF9tc2ciCisKKyNkZWZpbmUgUF9IVU5UVElNRSAgICAgICAgICAgICAgICAicF9saWJfaHVudHRpbWUiCisKKy8vIEJlZnJpZWRlOiBHaWxkZW56YWVobGVyCisjZGVmaW5lIFBfUEVBQ0VfSElTVE9SWSAgICAgICAgICAgIl9wZWFjZV9oaXN0b3J5IgorCisjZGVmaW5lIERJU0FCTEVfVE9PX0VBUkxZIAkgIC0xMDAxMTEKKworI2RlZmluZSBFTkVNWV9IVU5UVElNRQkJMAorCisvLyBIZWxmZXItTlBDCisvLyBhKSBOUEM6IHdlbGNoZW0gU3BpZWxlciBpc3QgZGllc2VyIE5QQyB6dWdlb3JkbmV0LCBkLmguIGZ1ZXIgd2VuIGthZW1wZnQKKy8vICAgICAgICAgZXI/IEFycmF5OiAoeyBzcGllbGVyb2JqZWN0LCBmbGFncyB9KQorLy8gYikgU3BpZWxlcjogd2VsY2hlIE5QQyBzaW5kIGRpZXNlbSBTcGllbGVyIHp1Z2VvcmRuZXQuIE1hcHBpbmcgbWl0IE9iamVrdGVuCisvLyAgICAgICAgICAgICB1bmQgRmxhZ3MuCisjZGVmaW5lIFBfSEVMUEVSX05QQyAgICAgICAgICAgICAgInN0ZDpoZWxwZXJfbnBjIgorLy8gRmxhZ3M6CisvLyAyIEtsYXNzZW4gdm9uIEhlbGZlcm4gbW9tZW50YW46IEdpbGRlbi1OUEMgdW5kIHNvbnN0aWdlLgorI2RlZmluZSBHVUlMRF9IRUxQRVIgICAgIDB4MQorI2RlZmluZSBNSVNDX0hFTFBFUiAgICAgIDB4MgorLy8gV2VubiBnZXNldHp0LCBpc3QgZGVyIEhlbGZlciBleGtsdXNpdiB1bmQgbGFlc3N0IGtlaW5lbiBhbmRlcmVuIGluIGRlcgorLy8gZGVyc2VsYmVuIEtsYXNzZSB6dS4KKyNkZWZpbmUgRVhDTFVTSVZFX0hFTFBFUiAweDQwMDAwMDAwCisvLyBXZW5uIGdlc2V0enQsIGlzdCBkZXIgSGVsZmVyICdha3RpdicsIGQuaC4gbmljaHQgbnVyIFNjaGxhZ2ZhZW5nZXIKKyNkZWZpbmUgQUNUSVZFX0hFTFBFUiAgICAweDIwMDAwMDAwCisKKy8vIGluZGl2aWR1ZWxsZSBTY2hhZGVuc21lbGR1bmdlbiBlaW5lcyBMZWJld2VzZW5zCisjZGVmaW5lIFBfREFNQUdFX01TRyAgICAgInN0ZF9wX2RhbV9tc2ciCisKKyNlbmRpZiAvLyBfX0xJVklOR19DT01CQVRfSF9fCisKKyNpZmRlZiBORUVEX1BST1RPVFlQRVMKKworI2lmbmRlZiBfX0xJVklOR19DT01CQVRfSF9QUk9UT19fCisjZGVmaW5lIF9fTElWSU5HX0NPTUJBVF9IX1BST1RPX18KKworLy8gcHJvdG90eXBlcworcHVibGljIGludCBLaWxsKG9iamVjdCBvYik7CitwdWJsaWMgdm9pZCBBdHRhY2syKG9iamVjdCBlbmVteSk7CitwdWJsaWMgdm9pZCBBdHRhY2sob2JqZWN0IGVuZW15KTsKK3B1YmxpYyB2b2lkIEFkZERlZmVuZGVyKG9iamVjdCBmcmllbmQpOworcHVibGljIHZvaWQgUmVtb3ZlRGVmZW5kZXIob2JqZWN0IGZyaWVuZCk7CitwdWJsaWMgdm9pZCBJbmZvcm1EZWZlbmQob2JqZWN0IGVuZW15KTsKK3B1YmxpYyBtaXhlZCBEZWZlbmRPdGhlcihpbnQgZGFtLCBzdHJpbmd8c3RyaW5nKiBkYW1fdHlwZSwgaW50fG1hcHBpbmcgc3BlbGwsIG9iamVjdCBlbmVteSk7CitwdWJsaWMgaW50IERlZmVuZChpbnQgZGFtLCBzdHJpbmd8c3RyaW5nKiBkYW1fdHlwZSwgaW50fG1hcHBpbmcgc3BlbGwsIG9iamVjdCBlbmVteSk7CitwdWJsaWMgdm9pZCBDaGVja1dpbXB5QW5kRmxlZSgpOworcHVibGljIHZhcmFyZ3Mgdm9pZCBGbGVlKG9iamVjdCBvbGRlbnYsIGludCBmb3JjZSk7CisKK3B1YmxpYyB2YXJhcmdzIGludCBTdG9wSHVudEZvcihvYmplY3QgYXJnLCBpbnQgc2lsZW50KTsKK3B1YmxpYyB2YXJhcmdzIG1hcHBpbmcgU3RvcEh1bnRpbmdNb2RlKGludCBzaWxlbnQpOworCitwdWJsaWMgdm9pZCBVcGRhdGVSZXNpc3RhbmNlU3RyZW5ndGhzKCk7CitwdWJsaWMgdmFyYXJncyBpbnQgQWRkUmVzaXN0YW5jZU1vZGlmaWVyKG1hcHBpbmcgbW9kLCBzdHJpbmcgYWRkKTsKK3B1YmxpYyB2YXJhcmdzIHZvaWQgUmVtb3ZlUmVzaXN0YW5jZU1vZGlmaWVyKHN0cmluZyBhZGQpOworcHVibGljIGZsb2F0IENoZWNrUmVzaXN0YW5jZShzdHJpbmcqIGRhbV90eXBlKTsKKworcHVibGljIGludCBJbnNlcnRTaW5nbGVFbmVteShvYmplY3Qgb2IpOworcHVibGljIGludCBJbnNlcnRFbmVteShvYmplY3Qgb2IpOworcHVibGljIGludCBJc0VuZW15KG9iamVjdCB3ZXIpOworcHVibGljIG9iamVjdCAqUHJlc2VudEVuZW1pZXMoKTsKK3B1YmxpYyBvYmplY3QgUXVlcnlQcmVmZXJlZEVuZW15KCk7CitwdWJsaWMgdmFyYXJncyBvYmplY3QgU2VsZWN0RW5lbXkob2JqZWN0ICpoZXJlKTsKK3B1YmxpYyA8b2JqZWN0KnxpbnQqPiogUXVlcnlFbmVtaWVzKCk7CitwdWJsaWMgbWFwcGluZyBHZXRFbmVtaWVzKCk7CisjaWYgX19WRVJTSU9OX01BSk9SX18+PTMgJiYgX19WRVJTSU9OX01JTk9SX18+PTUgJiYgKF9fVkVSU0lPTl9NSUNST19fPjAgfHwgKF9fVkVSU0lPTl9NSUNST19fPT0wICYmIF9fVkVSU0lPTl9QQVRDSF9fPj0yKSkKK3B1YmxpYyBtYXBwaW5nIFNldEVuZW1pZXMoPG9iamVjdCp8aW50Kj4qIG15ZW5lbWllcyk7CisjZWxzZQorcHVibGljIG1hcHBpbmcgU2V0RW5lbWllcyhtaXhlZCAqbXllbmVtaWVzKTsKKyNlbmRpZgorcHVibGljIG1peGVkIEVuZW15UHJlc2VudCgpOworcHVibGljIG1peGVkIEluRmlnaHQoKTsKK3B1YmxpYyBpbnQgQ2hlY2tFbmVteShvYmplY3Qgb2IpOworCitwdWJsaWMgaW50IFNwZWxsRGVmZW5kKG9iamVjdCBjYXN0ZXIsIG1hcHBpbmcgc2luZm8pOworCitwdWJsaWMgb2JqZWN0fG9iamVjdCogUXVlcnlBcm1vdXJCeVR5cGUoc3RyaW5nIHR5cGUpOworCitwdWJsaWMgdmFyYXJncyBpbnQgVXNlSGFuZHMob2JqZWN0IG9iLCBpbnQgbnVtKTsKK3B1YmxpYyB2YXJhcmdzIGludCBGcmVlSGFuZHMob2JqZWN0IG9iKTsKKworcHVibGljIHZvaWQgSW5pdEF0dGFjaygpOworcHVibGljIHZvaWQgRXhpdEF0dGFjaygpOworCitwdWJsaWMgaW50IFBhY2lmeShvYmplY3QgY2FzdGVyKTsKKworcHVibGljIHZhcmFyZ3MgaW50IFN0b3BIdW50SUQoc3RyaW5nIHN0ciwgaW50IHNpbGVudCk7CitwdWJsaWMgdm9pZCBTdG9wSHVudFRleHQob2JqZWN0IGFyZyk7CitwdWJsaWMgdmFyYXJncyB2b2lkIEV4ZWN1dGVNaXNzaW5nQXR0YWNrcyhvYmplY3QgKnJlbW92ZV9hdHRhY2tlcnMpOworCisvLyBRdWVyeS0gdW5kIFNldC1NZXRob2Rlbgorc3RhdGljIGludCAgICAgX3F1ZXJ5X2F0dGFja19idXN5KCk7CitzdGF0aWMgaW50ICAgICBfcXVlcnlfZnJlZV9oYW5kcygpOworc3RhdGljIG1peGVkICAgX3F1ZXJ5X2hhbmRzKCk7CitzdGF0aWMgbWl4ZWQgICpfcXVlcnlfaGFuZHNfdXNlZF9ieSgpOworc3RhdGljIG1hcHBpbmcgX3F1ZXJ5X3Jlc2lzdGFuY2Vfc3RyZW5ndGhzKCk7CitzdGF0aWMgaW50ICAgICBfcXVlcnlfdG90YWxfYWMoKTsKK3N0YXRpYyBpbnQgICAgIF9xdWVyeV90b3RhbF93YygpOworc3RhdGljIGludCAgICAgX3F1ZXJ5X3VzZWRfaGFuZHMoKTsKK3N0YXRpYyBpbnQgICAgIF9zZXRfYXR0YWNrX2J1c3kobWl4ZWQgdmFsKTsKK3N0YXRpYyBpbnQgICAgIF9zZXRfZGlzYWJsZV9hdHRhY2soaW50IHZhbCk7CitzdGF0aWMgbWl4ZWQgICBfc2V0X2hhbmRzKG1peGVkIGgpOworc3RhdGljIG1peGVkICAgX3NldF9yZXNpc3RhbmNlKG1peGVkIGFyZyk7CitzdGF0aWMgaW50ICAgICBfc2V0X3VzZWRfaGFuZHMoaW50IG5ld19udW0pOworc3RhdGljIG1peGVkICAgX3NldF92dWxuZXJhYmlsaXR5KG1peGVkIGFyZyk7CitzdGF0aWMgaW50ICAgICBfc2V0X3dpbXB5KGludCBpKTsKKworLy8gSW50ZXJuYWwKK3Byb3RlY3RlZCB2b2lkIFNraWxsUmVzVHJhbnNmZXIobWFwcGluZyBmcm9tX00sIG1hcHBpbmcgdG9fTSk7Citwcm90ZWN0ZWQgdm9pZCBJbnRlcm5hbE1vZGlmeUF0dGFjayhtYXBwaW5nIGFpbmZvKTsKK3Byb3RlY3RlZCB2b2lkIEludGVybmFsTW9kaWZ5RGVmZW5kKGludCBkYW0sIHN0cmluZyogZHQsIG1hcHBpbmcgc3BlbGwsIG9iamVjdCBlbmVteSk7Citwcm90ZWN0ZWQgc3RyaW5nIG1lc3Moc3RyaW5nIG1zZyxvYmplY3QgbWUsb2JqZWN0IGVuZW15KTsKKyAKKyNlbmRpZiAvLyBfX0xJVklOR19DT01CQVRfSF9QUk9UT19fCisKKyNlbmRpZgkvLyBORUVEX1BST1RPWVBFUwpkaWZmIC0tZ2l0IGEvc3lzL2xpdmluZy9jb21tLmggYi9zeXMvbGl2aW5nL2NvbW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTUwNjIyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL2xpdmluZy9jb21tLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBsaXZpbmcvY29tbS5oIC0tIGNvbW11bmljYXRpb24gbW9kdWxlIHByb3BlcnRpZXMgZm9yIExpdmluZ3MKKy8vCisvLyAkSWQ6IGNvbW0uaCx2IDMuMyAyMDAwLzAyLzA5IDE1OjU2OjI1IFBhZHJlaWMgRXhwICQKKworI2lmbmRlZiBfX0xJVklOR19DT01NX0hfXworI2RlZmluZSBfX0xJVklOR19DT01NX0hfXworCisjaW5jbHVkZSA8YnJlYWtfc3RyaW5nLmg+CisKKy8vIEZsYWdzIGZ1ZXIgUmVjZWl2ZU1zZygpLgorLy8gVGhlIEJTLUZsYWdzIE1VU1QgYWx3YXlzIGJlIGVxdWFsIHRvIHRoZSBvbmUgZGVmaW5lZCBmb3IgYnJlYWtfc3RyaW5nIQorI2RlZmluZSBNU0dfQlNfTEVBVkVfTEZTICAgIEJTX0xFQVZFX01ZX0xGUyAgICAvLzEKKyNkZWZpbmUgTVNHX0JTX1NJTkdMRV9TUEFDRSBCU19TSU5HTEVfU1BBQ0UgICAgLy8yCisjZGVmaW5lIE1TR19CU19CTE9DSyAgICAgICAgQlNfQkxPQ0sgICAgICAgICAgIC8vNAorI2RlZmluZSBNU0dfQlNfTk9fUEFSSU5ERU5UIEJTX05PX1BBUklOREVOVCAgICAvLzgKKyNkZWZpbmUgTVNHX0JTX0lOREVOVF9PTkNFICBCU19JTkRFTlRfT05DRSAgICAgLy8xNgorI2RlZmluZSBNU0dfQlNfUFJFUF9JTkRFTlQgIEJTX1BSRVBFTkRfSU5ERU5UICAvLzMyCisvLyBGbGFncyA8IDEwMjQgKDJeMTApIHJlc2VydmllcnQgZnVlciBCUworI2RlZmluZSBNU0dfRE9OVF9CVUZGRVIgIDEwMjQKKyNkZWZpbmUgTVNHX0RPTlRfU1RPUkUgICAyMDQ4CisjZGVmaW5lIE1TR19ET05UX1dSQVAgICAgNDA5NgorI2RlZmluZSBNU0dfRE9OVF9JR05PUkUgIDgxOTIKKy8vIEZsYWdzIDwgMTA0ODU3NiAoMl4yMCkgcmVzZXJ2aWVydCBmdWVyIEZsYWdzCisjZGVmaW5lIE1TR19BTExfQlNfRkxBR1MgKEJTX0xFQVZFX01ZX0xGUyB8IEJTX1NJTkdMRV9TUEFDRSB8IEJTX0JMT0NLXAorICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJTX05PX1BBUklOREVOVCB8IEJTX0lOREVOVF9PTkNFXAorICAgICAgICAgICAgICAgICAgICAgICAgICB8QlNfUFJFUEVORF9JTkRFTlQpCisjZGVmaW5lIE1TR19BTExfRkxBR1MgKE1TR19ET05UX0JVRkZFUiB8IE1TR19ET05UX1NUT1JFIHwgTVNHX0RPTlRfV1JBUFwKKyAgICAgICAgICAgICAgICAgICAgICB8IE1TR19ET05UX0lHTk9SRSB8IE1TR19BTExfQlNfRkxBR1MpCisKKy8vIE5hY2hyaWNodGVudHlwZW4sIFdlcnRlIGFiIDJeMjAKKyNkZWZpbmUgTVRfVU5LTk9XTiAgICAwCisjZGVmaW5lIE1UX0xPT0sgICAgICAgMTA0ODU3NgorI2RlZmluZSBNVF9MSVNURU4gICAgIDIwOTcxNTIKKyNkZWZpbmUgTVRfRkVFTCAgICAgICA0MTk0MzA0CisjZGVmaW5lIE1UX1RBU1RFICAgICAgODM4ODYwOAorI2RlZmluZSBNVF9TTUVMTCAgICAgIDE2Nzc3MjE2CisjZGVmaW5lIE1UX01BR0lDICAgICAgMzM1NTQ0MzIKKyNkZWZpbmUgTVRfTk9USUZJQ0FUSU9OIDY3MTA4ODY0CisjZGVmaW5lIE1UX0NPTU0gICAgICAgMTM0MjE3NzI4CisjZGVmaW5lIE1UX0ZBUiAgICAgICAgMjY4NDM1NDU2CisjZGVmaW5lIE1UX0RFQlVHICAgICAgNTM2ODcwOTEyCisjZGVmaW5lIE1UX05FV1MgICAgICAgMTA3Mzc0MTgyNAorCisvLyBBa3Rpb25lbgorLy8gQmVpIE1BX1VOS05PV04gd2lyZCBkaWUgQWt0aW9uIGF1cyBxdWVyeV92ZXJiKCkgZ2VyYXRlbi4gV2VubiBkYXMgbmljaHQKKy8vIGV4aXN0aWVydCwgYmxlaWJ0IGRpZSBBa3Rpb24gTUFfVU5LTk9XTi4KKyNkZWZpbmUgTUFfVU5LTk9XTiAgICAwCisjZGVmaW5lIE1BX1BVVCAgICAgICAgIndpcmYiCisjZGVmaW5lIE1BX1RBS0UgICAgICAgIm5pbW0iCisjZGVmaW5lIE1BX01PVkVfSU4gICAgIm1vdmVfaW4iCisjZGVmaW5lIE1BX01PVkVfT1VUICAgIm1vdmVfb3V0IgorI2RlZmluZSBNQV9NT1ZFICAgICAgICJtb3ZlIgorI2RlZmluZSBNQV9GSUdIVCAgICAgICJ0b2V0ZSIKKyNkZWZpbmUgTUFfV0lFTEQgICAgICAienVlY2tlIgorI2RlZmluZSBNQV9VTldJRUxEICAgICJzdGVja2UiCisjZGVmaW5lIE1BX1dFQVIgICAgICAgInRyYWdlIgorI2RlZmluZSBNQV9VTldFQVIgICAgICJ6aWVoZSIKKyNkZWZpbmUgTUFfRUFUICAgICAgICAiaXNzIgorI2RlZmluZSBNQV9EUklOSyAgICAgICJ0cmlua2UiCisjZGVmaW5lIE1BX1NQRUxMICAgICAgInphdWJlcmUiCisjZGVmaW5lIE1BX0xPT0sgICAgICAgInVudGVyc3VjaGUiCisjZGVmaW5lIE1BX0xJU1RFTiAgICAgImxhdXNjaGUiCisjZGVmaW5lIE1BX0ZFRUwgICAgICAgInRhc3RlIgorI2RlZmluZSBNQV9TTUVMTCAgICAgICJyaWVjaGUiCisjZGVmaW5lIE1BX1NFTlNFICAgICAgImVyc3B1ZXJlbiIKKyNkZWZpbmUgTUFfUkVBRCAgICAgICAibGllcyIKKyNkZWZpbmUgTUFfVVNFICAgICAgICAiYmVudXR6ZSIKKyNkZWZpbmUgTUFfU0FZICAgICAgICAic2FnZSIKKyNkZWZpbmUgTUFfUkVNT1ZFICAgICAicmVtb3ZlIgorI2RlZmluZSBNQV9DSEFOTkVMICAgICJlYmVuZW4iCisjZGVmaW5lIE1BX0VNT1RFICAgICAgImVtb3RlIgorI2RlZmluZSBNQV9TSE9VVCAgICAgICJydWZlIgorI2RlZmluZSBNQV9TSE9VVF9TRUZVTiAic2hvdXQiCisjZGVmaW5lIE1BX1RFTEwgICAgICAgInRlaWxlbWl0IgorCisvLyBSdWVja2dhYmV3ZXJ0ZSB2b24gUmVjZWl2ZU1zZygpCisjZGVmaW5lIE1TR19ERUxJVkVSRUQgICAgMQorI2RlZmluZSBNU0dfQlVGRkVSRUQgICAgIDIKKyNkZWZpbmUgTVNHX0ZBSUxFRCAgICAgIC0xCisjZGVmaW5lIE1TR19JR05PUkVEICAgICAtMgorI2RlZmluZSBNU0dfVkVSQl9JR04gICAgLTMKKyNkZWZpbmUgTVNHX01VRF9JR04gICAgIC00CisjZGVmaW5lIE1TR19TRU5TRV9CTE9DSyAtNQorI2RlZmluZSBNU0dfQlVGRkVSX0ZVTEwgLTYKKworI2VuZGlmIC8vIF9fTElWSU5HX0NPTU1fSF9fCisKKyNpZmRlZiBORUVEX1BST1RPVFlQRVMKKworI2lmbmRlZiBfX0xJVklOR19DT01NX0hfUFJPVE9fXworI2RlZmluZSBfX0xJVklOR19DT01NX0hfUFJPVE9fXworCitwdWJsaWMgdmFyYXJncyBpbnQgUmVjZWl2ZU1zZyhzdHJpbmcgbXNnLCBpbnQgbXNnX3R5cGUsIHN0cmluZyBtc2dfYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1zZ19wcmVmaXgsIG9iamVjdCBvcmlnaW4pOworCisjZW5kaWYgLy8gX19MSVZJTkdfQ09NTV9IX1BST1RPX18KKworI2VuZGlmIC8vIE5FRURfUFJPVE9ZUEVTCisKZGlmZiAtLWdpdCBhL3N5cy9saXZpbmcvZGVzY3JpcHRpb24uaCBiL3N5cy9saXZpbmcvZGVzY3JpcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzA3ZmJmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL2xpdmluZy9kZXNjcmlwdGlvbi5oCkBAIC0wLDAgKzEsNDggQEAKKyNpZm5kZWYgX19MSVZJTkdfREVTQ1JJUFRJT05fSF9fCisjZGVmaW5lIF9fTElWSU5HX0RFU0NSSVBUSU9OX0hfXworCisvLyBwcm9wZXJ0aWVzCisKKyNkZWZpbmUgUF9HVUlMRCAgICAgICAgICAgICAgICAgICAiZ3VpbGQiCisjZGVmaW5lIFBfVklTSUJMRV9HVUlMRCAgICAgICAgICAgInZpc2libGVfZ3VpbGQiCisKKyNkZWZpbmUgUF9FWFRSQV9MT09LICAgICAgICAgICAgICAiZXh0cmFsb29rIgorI2RlZmluZSBQX0lOVEVSTkFMX0VYVFJBX0xPT0sgICAgICJpbnRlcm5hbF9leHRyYWxvb2siCisKKyNkZWZpbmUgUF9QTEFZRVJfTElHSFQgICAgICAgICAgICAicGxheWVyX2xpZ2h0IgorI2RlZmluZSBQX0xJR0hUX01PRElGSUVSICAgICAgICAgICJsaWdodF9tb2RpZmllciIKKworI2RlZmluZSBQX0xFVkVMICAgICAgICAgICAgICAgICAgICJsZXZlbCIKKworI2RlZmluZSBQX1JBQ0UgICAgICAgICAgICAgICAgICAgICJyYWNlIgorI2RlZmluZSBQX1JFQUxfUkFDRSAgICAgICAgICAgICAgICJyZWFsX3JhY2UiCisKKy8vIGJpdHRlIGF1Y2ggaW4gL3NlY3VyZS9tYXN0ZXIuaCBhZW5kZXJuLCBmYWxscyBkYXMgbWFsIGdlYWVuZGVydCB3aXJkLgorI2RlZmluZSBQX1dFQVBPTiAgICAgICAgICAgICAgICAgICJ3ZWFwb24iCisKKyNkZWZpbmUgUF9QQVJBICAgICAgICAgICAgICAgICAgICAicGFyYSIKKyNkZWZpbmUgUF9TSVpFICAgICAgICAgICAgICAgICAgICAic2l6ZSIKKworI2RlZmluZSBQX0RJRV9NU0cgICAgICAgICAgICAgICAgICJkaWVfbXNnIgorCisjZGVmaW5lIFBfV0lNUFkgICAgICAgICAgICAgICAgICAgIndpbXB5IgorI2RlZmluZSBQX1dJTVBZX0RJUkVDVElPTiAgICAgICAgICJ3aW1weV9kaXIiCisKKyNkZWZpbmUgUF9BVkFUQVJfVVJJICAgICAgICAgICAgICAicF9saWJfYXZhdGFydXJpIgorCisjZW5kaWYgLy8gX19MSVZJTkdfREVTQ1JJUFRJT05fSF9fCisKKworI2lmZGVmIE5FRURfUFJPVE9UWVBFUworCisjaWZuZGVmIF9fTElWSU5HX0RFU0NSSVBUSU9OX0hfUFJPVE9fXworI2RlZmluZSBfX0xJVklOR19ERVNDUklQVElPTl9IX1BST1RPX18KKwordmFyYXJncyBpbnQgICAgICAgICBDYW5ub3RTZWUoaW50IHNpbGVudCk7CitwdWJsaWMgdmFyYXJncyBpbnQgIEFkZEV4dHJhTG9vayhzdHJpbmcgbG9vaywgaW50IGR1cmF0aW9uLCBzdHJpbmcga2V5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBsb29rZW5kZSwgb2JqZWN0IG9iKTsKK3B1YmxpYyBpbnQgICAgICAgICAgUmVtb3ZlRXh0cmFMb29rKHN0cmluZyBrZXkpOworCisjZW5kaWYgLy8gX19MSVZJTkdfREVTQ1JJUFRJT05fSF9QUk9UT19fCisKKyNlbmRpZiAvLyBORUVEX1BST1RPWVBFUwpkaWZmIC0tZ2l0IGEvc3lzL2xpdmluZy9oZWxwZXJzLmggYi9zeXMvbGl2aW5nL2hlbHBlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTM3OTNhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL2xpdmluZy9oZWxwZXJzLmgKQEAgLTAsMCArMSw0MiBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGxpdmluZy9oZWxwZXJzLmggLS0gS29uc3RhbnRlbiB1bmQgTWV0aG9kZW4gZnVlciBIaWxmc29iamVrdGUKKy8vCisvLyAkSWQ6IG1vbmV5aGFuZGxlci5oLHYgMy4xIDE5OTcvMDIvMTIgMTM6Mjk6MDkgV2FyZ29uIEV4cCAlCisKKyNpZm5kZWYgX19MSVZJTkdfSEVMUEVSU19IX18KKyNkZWZpbmUgX19MSVZJTkdfSEVMUEVSU19IX18KKworLy8gUHJvcGVydGllcworCisjZGVmaW5lIFBfSEVMUEVSX09CSkVDVFMgICAgImxpYl9wX2hlbHBlcl9vYmplY3RzIgorCisjZGVmaW5lIFBfQVFVQVRJQ19IRUxQRVJTICAgImxpYl9wX2FxdWF0aWNfaGVscGVycyIKKyNkZWZpbmUgUF9BRVJJQUxfSEVMUEVSUyAgICAibGliX3BfYWVyaWFsX2hlbHBlcnMiCisKKy8vIERlZmluZXMgZnVlciBIZWxmZXJvYmpla3QtVHlwZW4gdW5kIFJ1ZWNrZ2FiZXdlcnRlCisKKyNkZWZpbmUgSEVMUEVSX1RZUEVfQVFVQVRJQyAxCisjZGVmaW5lIEhFTFBFUl9UWVBFX0FFUklBTCAgMgorCisjZGVmaW5lIEhFTFBFUl9OT19DQUxMQkFDS19PQkpFQ1QgICAgLTEKKyNkZWZpbmUgSEVMUEVSX0FMUkVBRFlfTElTVEVEICAgICAgICAtMgorI2RlZmluZSBIRUxQRVJfTk9USElOR19UT19VTlJFR0lTVEVSIC0zCisjZGVmaW5lIEhFTFBFUl9TVUNDRVNTICAgICAgICAgICAgICAgIDEKKworI2VuZGlmIC8vIF9fTElWSU5HX0hFTFBFUlNfSF9fCisKKy8vIFByb3RvdHlwZXMKKworI2lmZGVmIE5FRURfUFJPVE9UWVBFUworCisjaWZuZGVmIF9fTElWSU5HX0hFTFBFUlNfSF9QUk9UT19fCisjZGVmaW5lIF9fTElWSU5HX0hFTFBFUlNfSF9QUk9UT19fCisKK2ludCBSZWdpc3RlckhlbHBlck9iamVjdChvYmplY3QgaGVscGVyLCBpbnQgdHlwZSwgbWl4ZWQgY2FsbGJhY2spOworaW50IFVucmVnaXN0ZXJIZWxwZXJPYmplY3Qob2JqZWN0IGhlbHBlciwgaW50IHR5cGUpOworCisjZW5kaWYgLy8gX19MSVZJTkdfSEVMUEVSU19IX1BST1RPX18KKworI2VuZGlmIC8vIE5FRURfUFJPVE9ZUEVTCisKZGlmZiAtLWdpdCBhL3N5cy9saXZpbmcvbGlmZS5oIGIvc3lzL2xpdmluZy9saWZlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFiYTNkZAotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9saXZpbmcvbGlmZS5oCkBAIC0wLDAgKzEsMTI1IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gbGl2aW5nL2xpZmUuaCAtLSBsaXZpbmcgbGlmZSBoZWFkZXIKKy8vCisvLyAkSWQ6IGxpZmUuaCA5MDQ4IDIwMTUtMDEtMTEgMTg6MjE6MzJaIFplc3N0cmEgJAorCisjaWZuZGVmIF9fTElWSU5HX0xJRkVfSF9fCisjZGVmaW5lIF9fTElWSU5HX0xJRkVfSF9fCisKKy8vIHByb3BlcnRpZXMKKworI2RlZmluZSBQX0FHRSAgICAgICAgICAgICAgICAgICAgICJhZ2UiCisjZGVmaW5lIFBfQUxJR04gICAgICAgICAgICAgICAgICAgImFsaWduIgorCisjZGVmaW5lIFBfREVBRFMgICAgICAgICAgICAgICAgICAgImRlYWRzIgorI2RlZmluZSBQX0dIT1NUICAgICAgICAgICAgICAgICAgICJnaG9zdCIKKyNkZWZpbmUgUF9GUk9HICAgICAgICAgICAgICAgICAgICAiZnJvZyIKKworI2RlZmluZSBQX0ZPT0QgICAgICAgICAgICAgICAgICAgICJmb29kIgorI2RlZmluZSBQX01BWF9GT09EICAgICAgICAgICAgICAgICJtYXhfZm9vZCIKKyNkZWZpbmUgUF9EUklOSyAgICAgICAgICAgICAgICAgICAiZHJpbmsiCisjZGVmaW5lIFBfTUFYX0RSSU5LICAgICAgICAgICAgICAgIm1heF9kcmluayIKKyNkZWZpbmUgUF9BTENPSE9MICAgICAgICAgICAgICAgICAiYWxjb2hvbCIKKyNkZWZpbmUgUF9NQVhfQUxDT0hPTCAgICAgICAgICAgICAibWF4X2FsY29ob2wiCisKKyNkZWZpbmUgUF9IUCAgICAgICAgICAgICAgICAgICAgICAiaHAiCisjZGVmaW5lIFBfTUFYX0hQICAgICAgICAgICAgICAgICAgIm1heF9ocCIKKyNkZWZpbmUgUF9TUCAgICAgICAgICAgICAgICAgICAgICAic3AiCisjZGVmaW5lIFBfTUFYX1NQICAgICAgICAgICAgICAgICAgIm1heF9zcCIKKyNkZWZpbmUgUF9YUCAgICAgICAgICAgICAgICAgICAgICAieHAiCisjZGVmaW5lIFBfTk9fWFAgICAgICAgICAgICAgICAgICAgIm5vX3hwIgorI2RlZmluZSBQX0xBU1RfWFAgICAgICAgICAgICAgICAgICJsYXN0X3hwIgorCisjZGVmaW5lIFBfRk9PRF9ERUxBWSAgICAgICAgICAgICAgImZvb2RfZGVsYXkiCisjZGVmaW5lIFBfRFJJTktfREVMQVkgICAgICAgICAgICAgImRyaW5rX2RlbGF5IgorI2RlZmluZSBQX0FMQ09IT0xfREVMQVkgICAgICAgICAgICJhbGNvaG9sX2RlbGF5IgorI2RlZmluZSBQX0hQX0RFTEFZICAgICAgICAgICAgICAgICJocF9kZWxheSIKKyNkZWZpbmUgUF9TUF9ERUxBWSAgICAgICAgICAgICAgICAic3BfZGVsYXkiCisjZGVmaW5lIFBfUE9JU09OX0RFTEFZICAgICAgICAgICAgInBvaXNvbl9kZWxheSIKKworI2RlZmluZSBQX1BPSVNPTiAgICAgICAgICAgICAgICAgICJwb2lzb24iCisjZGVmaW5lIFBfTUFYX1BPSVNPTiAgICAgICAgICAgICAgIm1heF9wb2lzb24iCisKKyNkZWZpbmUgUF9OT19SRUdFTkVSQVRJT04gICAgICAgICAibm9fcmVnZW5lcmF0aW9uIgorCisjZGVmaW5lIFBfRU5FTVlfREFNQUdFICAgICAgICAgICAgImVuZW15X2RhbWFnZSIKKyNkZWZpbmUgUF9USU1JTkdfTUFQICAgICAgICAgICAgICAidGltaW5nX21hcCIKKyNkZWZpbmUgUF9MQVNUX0RFQVRIX1RJTUUgICAgICAgICAibGFzdF9kZWF0aF90aW1lIgorI2RlZmluZSBQX0xBU1RfREVBVEhfUFJPUFMgICAgICAgICJsYXN0X2RlYXRoX3Byb3BzIgorI2RlZmluZSBQX0NPUlBTRV9ERUNBWV9USU1FICAgICAgICJjb3Jwc2VfZGVjYXkiCisKKy8vIC0tLS0tIERlZmluaXRpb25lbiBmdWVyIEJlZWluZmx1c3N1bmcgZGVyIEdlc3VuZGhlaXQgZHVyY2ggY29uc3VtZSAtLS0tLQorCisvLyBIX0VGRkVDVFMgLSBadSBhZW5kZXJuZGUgUHJvcGVydGllcyBmdWVyIGRlbiBFZmZla3QKKyNkZWZpbmUgSF9FRkZFQ1RTICJlZmZlY3RzIgorLy8gSF9DT05ESVRJT05TIC0gWnUgcHJ1ZWZlbmRlIFByb3BlcnRpZXMgZvxyIGRlbiBFZmZla3QgKFNhZXR0aWd1bmcsIC4uLikKKyNkZWZpbmUgSF9DT05ESVRJT05TICJjb25kaXRpb25zIgorLy8gSF9ESVNUUklCVVRJT04gLSBXaWUgZGllIEFlbmRlcnVuZyBhbiBIUC9TUCBhdXN0ZWlsZW4sIHNvZm9ydCwgemVpdGxpY2gKKy8vIHZlcnNldHp0LCAuLi4KKyNkZWZpbmUgSF9ESVNUUklCVVRJT04gImRpc3RyaWJ1dGlvbiIKKy8vIEhfSU5HUkVESUVOVFMgLSBCZXN0YW5kdGVpbGUsIGRpZSBkaWUgQWVuZGVydW5nIHZlcnVyc2FjaGVuCisjZGVmaW5lIEhfSU5HUkVESUVOVFMgImluZ3JlZGllbnRzIgorCisvLyBWZXJ0ZWlsdW5nZW4sCisvLyAwICAgIFNvZm9ydHdpcmt1bmcKKy8vIDEtNTAgZ2xlaWNodmVydGVpbHRlIFB1ZmZlcnVuZyBtaXQgYW5nZWdlYmVuZXIgUmF0ZSBmdWVyIFNQL0hQCisvLyA+PSA1MSBzcGV6aWVsbGUgVmVydGVpbHVuZ2VuIChUT0RPKQorI2RlZmluZSBIRF9JTlNUQU5UICAgICAgMAorI2RlZmluZSBIRF9TVEFOREFSRCAgICAgNQorCisjZGVmaW5lIEhfQUxMT1dFRF9DT05ESVRJT05TICh7UF9GT09ELCBQX0RSSU5LLCBQX0FMQ09IT0x9KQorI2RlZmluZSBIX0FMTE9XRURfRUZGRUNUUyAgICAoe1BfU1AsIFBfSFAsIFBfUE9JU09OfSkKKworI2RlZmluZSBIQ19NQVhfRk9PRF9SRUFDSEVEICAgICAgICAxCisjZGVmaW5lIEhDX01BWF9EUklOS19SRUFDSEVEICAgICAgIDIKKyNkZWZpbmUgSENfTUFYX0FMQ09IT0xfUkVBQ0hFRCAgICAgNAorI2RlZmluZSBIQ19IT09LX0NBTkNFTExBVElPTiAgICAgICA4CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VuZGlmIC8vIF9fTElWSU5HX0xJRkVfSF9fCisKKyNpZmRlZiBORUVEX1BST1RPVFlQRVMKKworI2lmbmRlZiBfX0xJVklOR19MSUZFX0hfUFJPVE9fXworI2RlZmluZSBfX0xJVklOR19MSUZFX0hfUFJPVE9fXyAgICAgICAgIAorCisvLyBwcm90b3R5cGVzCisKKy8vIC0tLS0tIHplbnRyYWxlIEZ1bmt0aW9uLCB1bSBkaWUgR2VzdW5kaGVpdCBkZXMgTGViZXdlc2VucyB6dSBiZWVpbmZsdXNzZW4gLS0tLS0KK3B1YmxpYyB2YXJhcmdzIGludCBjb25zdW1lKG1hcHBpbmcgY2luZm8sIGludCB0ZXN0b25seSk7CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3B1YmxpYyBpbnQgZG9fZGFtYWdlKGludCBkYW0sIG9iamVjdCBlbmVteSk7CitwdWJsaWMgaW50IHJlZHVjZV9oaXRfcG9pbnRzKGludCBkYW0pOworcHVibGljIGludCByZXN0b3JlX2hpdF9wb2ludHMoaW50IGhlYWwpOworCitwdWJsaWMgaW50IHJlZHVjZV9oaXRfcG9pbnQoaW50IGRhbSk7ICAvL051ciBhbHMgVWViZXJnYW5zbG9lc3VuZyAoUmlrdXMpCisKK3B1YmxpYyB2b2lkIHJlc3RvcmVfc3BlbGxfcG9pbnRzKGludCBoKTsKK3B1YmxpYyB2b2lkIHJlZHVjZV9zcGVsbF9wb2ludHMoaW50IGgpOworCitwdWJsaWMgdm9pZCBoZWFsX3NlbGYoaW50IGgpOworCitwdWJsaWMgdmFyYXJncyB2b2lkIGRpZSggaW50IHBvaXNvbmRlYXRoLCBpbnQgZXh0ZXJuICk7CisKK3B1YmxpYyB2YXJhcmdzIHZvaWQgdHJhbnNmZXJfYWxsX3RvKCBzdHJpbmd8b2JqZWN0IGRlc3QsIGludCBjaGVjayApOworCitwdWJsaWMgdmFyYXJncyBpbnQgZHJpbmtfYWxjb2hvbChpbnQgc3RyZW5ndGgsIGludCB0ZXN0b25seSwgc3RyaW5nIG15dGV4dCk7CitwdWJsaWMgdmFyYXJncyBpbnQgZHJpbmtfc29mdChpbnQgc3RyZW5ndGgsIGludCB0ZXN0b25seSwgc3RyaW5nIG15dGV4dCk7CitwdWJsaWMgdmFyYXJncyBpbnQgZWF0X2Zvb2QoaW50IHN0cmVuZ3RoLCBpbnQgdGVzdG9ubHksIHN0cmluZyBteXRleHQpOworCitwdWJsaWMgaW50IGJ1ZmZlcl9ocChpbnQgdmFsLGludCByYXRlKTsKK3B1YmxpYyBpbnQgYnVmZmVyX3NwKGludCB2YWwsaW50IHJhdGUpOworCitwdWJsaWMgdm9pZCBzaG93X2FnZSgpOworCitwdWJsaWMgaW50IEFkZEV4cChpbnQgZSk7CisKKy8vIGludGVybmFsCitwcm90ZWN0ZWQgdm9pZCBSZXNldEVuZW15RGFtYWdlKCk7CisKKyNlbmRpZiAvLyBfX0xJVklOR19MSUZFX0hfUFJPVE9fXworCisjZW5kaWYgLy8gTkVFRF9QUk9UT1lQRVMKZGlmZiAtLWdpdCBhL3N5cy9saXZpbmcvbW92aW5nLmggYi9zeXMvbGl2aW5nL21vdmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MTQ0NjYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvbGl2aW5nL21vdmluZy5oCkBAIC0wLDAgKzEsNDAgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBsaXZpbmcvbW92aW5nLmggLS0gUHJvcHMvUHJvdG90eXBlbiBmdWVyIGxpdmluZy9tb3ZpbmcuYworLy8KKy8vICRJZDogbW92aW5nLmggODg5MiAyMDE0LTA4LTA0IDE5OjQ4OjI4WiBaZXNzdHJhICQKKworI2lmbmRlZiBfX0xJVklOR19NT1ZJTkdfSF9fCisjZGVmaW5lIF9fTElWSU5HX01PVklOR19IX18KKworI2RlZmluZSBQX1BVUlNVRVJTICAgICAgICJwdXJzdWVycyIKKworI2VuZGlmIC8vIF9fTElWSU5HX01PVklOR19IX18KKworI2lmZGVmIE5FRURfUFJPVE9UWVBFUworCisjaWZuZGVmIF9fTElWSU5HX01PVklOR19IX1BST1RPX18KKyNkZWZpbmUgX19MSVZJTkdfTU9WSU5HX0hfUFJPVE9fXworCitwdWJsaWMgdm9pZCBBZGRQdXJzdWVyKG9iamVjdCBvYik7CitwdWJsaWMgdm9pZCBSZW1vdmVQdXJzdWVyKG9iamVjdCBvYik7CisKK3B1YmxpYyB2b2lkIFRha2VGb2xsb3dlcnMoKTsKKworI2lmZGVmIF9fVEhJTkdfTU9WSU5HX0hfUFJPVE9fXworLy8gZGFzIGRhcmYgbmljaHQgcGFzc2llcmVuLCB3ZWlsIG1vdmUgaW4gdGhpbmcgYW5kZXJzIGlzdCBhbHMgaGllci4gKnNldWZ6KgoraW5jb25zaXN0ZW50X21vdmVfcHJvdG95cF9lcnJvcgorI2VuZGlmCitwdWJsaWMgdmFyYXJncyBpbnQgbW92ZSggb2JqZWN0fHN0cmluZyBkZXN0LCBpbnQgbWV0aG9kcywgc3RyaW5nIGRpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGV4dG91dCwgc3RyaW5nIHRleHRpbiApOworcHVibGljIHZhcmFyZ3MgaW50IHJlbW92ZShpbnQgc2lsZW50KTsKKworLy8gaW50ZXJuYWwKK3B1YmxpYyB2b2lkIF9TZXRQdXJzdWVkKG9iamVjdCBvYik7CitwdWJsaWMgdm9pZCBfUmVtb3ZlUHVyc3VlZChvYmplY3Qgb2IpOworCisKKyNlbmRpZiAvLyBfX0xJVklOR19NT1ZJTkdfSF9QUk9UT19fCisKKyNlbmRpZiAvLyBORUVEX1BST1RPVFlQRVMKKwpkaWZmIC0tZ2l0IGEvc3lzL2xpdmluZy9wdXRfYW5kX2dldC5oIGIvc3lzL2xpdmluZy9wdXRfYW5kX2dldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMmFkMjMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvbGl2aW5nL3B1dF9hbmRfZ2V0LmgKQEAgLTAsMCArMSwzNyBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGxpdmluZy9wdXRfYW5kX2dldC5oIC0tIGxpdmluZyBwdXQgYW5kIGdldCBoZWFkZXIKKy8vCisvLyAkSWQ6IHB1dF9hbmRfZ2V0LmggNjkzMCAyMDA4LTA4LTA5IDA5OjIwOjE2WiBaZXNzdHJhICQKKyAKKyNpZm5kZWYgX19MSVZJTkdfUFVUX0FORF9HRVRfSF9fCisjZGVmaW5lIF9fTElWSU5HX1BVVF9BTkRfR0VUX0hfXworCisvLyBwcm9wZXJ0aWVzCisjZGVmaW5lIFBfRFJPUF9NU0cgICAgICAgICJkcm9wX21lc3NhZ2UiIAorI2RlZmluZSBQX1BVVF9NU0cgICAgICAgICAicHV0X21lc3NhZ2UiCisjZGVmaW5lIFBfUElDS19NU0cgICAgICAgICJwaWNrX21lc3NhZ2UiCisjZGVmaW5lIFBfR0lWRV9NU0cgICAgICAgICJnaXZlX21lc3NhZ2UiCisjZGVmaW5lIFBfU0hPV19NU0cgICAgICAgICJzaG93X21lc3NhZ2UiCisKKy8vIElmIHlvdSBkb24ndCB3YW50IHB1dF9hbmRfZ2V0IHNlbmQgYSBtZXNzYWdlLCBzZXQgdGhlIHByb3BlcnR5IHRvCisjZGVmaW5lIE5PX1BOR19NU0cgICAgICAgLTEKKworLy8gRm9yIHVzZXIgZGVmaW5lZCBkcm9wIG1lc3NhZ2VzIGxvb2sgZm9yIG1hbiBQX0RST1BfTVNHCisKKyNlbmRpZiAvLyBfX0xJVklOR19QVVRfQU5EX0dFVF9IX18KKworLy8gcHJvdG90eXBlcworI2lmZGVmIE5FRURfUFJPVE9UWVBFUworCisjaWZuZGVmIF9fTElWSU5HX1BVVF9BTkRfR0VUX0hfUFJPVE9fXworI2RlZmluZSBfX0xJVklOR19QVVRfQU5EX0dFVF9IX1BST1RPX18KKworb2JqZWN0ICpmaW5kX29icyhzdHJpbmcgc3RyLCBpbnQgbWV0aCk7CisKK3ZvaWQgYWRkX3B1dF9hbmRfZ2V0X2NvbW1hbmRzKCk7CisKKyNlbmRpZiAvLyBfX0xJVklOR19QVVRfQU5EX0dFVF9IX1BST1RPX18KKworI2VuZGlmCS8vIE5FRURfUFJPVE9ZUEVTCisKZGlmZiAtLWdpdCBhL3N5cy9saXZpbmcvc2tpbGxfYXR0cmlidXRlcy5oIGIvc3lzL2xpdmluZy9za2lsbF9hdHRyaWJ1dGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM5Y2ExNQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9saXZpbmcvc2tpbGxfYXR0cmlidXRlcy5oCkBAIC0wLDAgKzEsMTAwIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gRmlsZU5hbWUuYyAtLSBCZXNjaHJlaWJ1bmcKKy8vCisvLyAkSWQkCisKKyNpZm5kZWYgX19TS0lMTF9BVFRSSUJVVEVTX0hfXworI2RlZmluZSBfX1NLSUxMX0FUVFJJQlVURVNfSF9fCisKKy8vID09PT09IFByb3BlcnRpZXMgZnVlciBTa2lsbC1BdHRyaWJ1dGU6ID09PT09CisKKyNkZWZpbmUgUF9TS0lMTF9BVFRSSUJVVEVTICAgICAgICAgICJza2lsbF9hdHRyIgorI2RlZmluZSBQX1NLSUxMX0FUVFJJQlVURV9PRkZTRVRTICAgInNraWxsX2F0dHJfb2Zmc2V0cyIKKworLy8gPT09PT0gU2tpbGwgQXR0cmlidXRlOiA9PT09PSAgCisvLyBBbGxnZW1laW5lIFF1YWxpdGFldAorI2RlZmluZSBTQV9RVUFMSVRZICAgICAgICAgICAgICAgICAgInNhX3F1YWwiCisgIAorLy8gU2NoYWRlbgorI2RlZmluZSBTQV9EQU1BR0UgICAgICAgICAgICAgICAgICAgInNhX2RhbSIKKyAgCisvLyBHZXNjaHdpbmRpZ2tlaXQKKyNkZWZpbmUgU0FfU1BFRUQgICAgICAgICAgICAgICAgICAgICJzYV9zcGVlZCIKKworLy8gRGF1ZXIKKyNkZWZpbmUgU0FfRFVSQVRJT04gICAgICAgICAgICAgICAgICJzYV9kdXIiCisKKy8vIEF1c2RlaG51bmcKKyNkZWZpbmUgU0FfRVhURU5TSU9OICAgICAgICAgICAgICAgICJzYV9leHQiCisKKy8vIFJlaWNod2VpdGUKKyNkZWZpbmUgU0FfUkFOR0UgICAgICAgICAgICAgICAgICAgICJzYV9yYW5nZSIKKworLy8gSmUgaG9laGVyLCBkZXN0byBncm9lc3NlciBkaWUgQ2hhbmNlLCBkYXNzIG5lbiB2b20gTGViZXdlc2VuIGdlY2FzdGV0ZXIKKy8vIFNwZWxsIGR1cmNoIGRhcyBnZWduZXJpc2NoZSBQX05PTUFHSUMgZHVyY2hzY2hsYWVndC4KKy8vIChTQV9FTkVNWV9TQVZFIG9ic29sZXQhKQorI2RlZmluZSBTQV9FTkVNWV9TQVZFICAgICAgICAgICAgICAgInNhX3NhdmUiCisjZGVmaW5lIFNBX1NQRUxMX1BFTkVUUkFUSU9OICAgICAgICAic2Ffc2F2ZSIKKworLy8gd2VsY2hlIFNraWxsLUF0dHJpYnV0ZSBnaWJ0IGVzPworI2RlZmluZSBWQUxJRF9TS0lMTF9BVFRSSUJVVEVTICh7IFNBX1FVQUxJVFksIFNBX0RBTUFHRSwgU0FfU1BFRUQsXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBX0RVUkFUSU9OLCBTQV9FWFRFTlNJT04sIFNBX1JBTkdFLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQV9FTkVNWV9TQVZFIH0pCisKKy8vIEluZGl6ZXMgZnVlciBkaWUgVmVyd2FsdHVuZyBkZXIgU2tpbGwtQXR0cmlidXRlCisjZGVmaW5lIFNBTV9DQUNIRSAgICAgICAgICAgICAgMAorI2RlZmluZSBTQU1fU1RBVElDICAgICAgICAgICAgIDEKKyNkZWZpbmUgU0FNX0RZTkFNSUMgICAgICAgICAgICAyCisKKyNkZWZpbmUgU0FNX1NVTSAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFNBTV9DQUNIRV9USU1FT1VUICAgICAgMQorI2RlZmluZSBTQU1fQ09VTlQgICAgICAgICAgICAgIDIKKworI2RlZmluZSBTQU1fRFVSQVRJT04gICAgICAgICAgIDAKKyNkZWZpbmUgU0FNX1ZBTFVFICAgICAgICAgICAgICAxCisKKworLy8gZWluaWdlIEtvbnN0YW50ZW4KKyNkZWZpbmUgU0FNX01BWF9NT0RTICAgICAgICAgICA1CisjZGVmaW5lIFNBTV9NQVhfQ0FDSEVfVElNRU9VVCAgNjAKKworLy8gcnVlY2tnYWJld2VydGUgZGVyIFZlcndhbHR1bmdzZnVua3Rpb25lbjoKKyNkZWZpbmUgU0FfTU9EX09LICAgICAgICAgICAgICAxCisjZGVmaW5lIFNBX01PRF9SRU1PVkVEICAgICAgICAgMQorI2RlZmluZSBTQV9UT09fTUFOWV9NT0RTICAgICAgIC0xCisjZGVmaW5lIFNBX01PRF9UT09fU01BTEwgICAgICAgLTIKKyNkZWZpbmUgU0FfTU9EX1RPT19CSUcgICAgICAgICAtMworI2RlZmluZSBTQV9NT0RfSU5WQUxJRF9BVFRSICAgIC00CisjZGVmaW5lIFNBX01PRF9JTlZBTElEX09CSkVDVCAgLTUKKyNkZWZpbmUgU0FfTU9EX05PVF9GT1VORCAgICAgICAtNgorI2RlZmluZSBTQV9NT0RfSU5WQUxJRF9WQUxVRSAgIC03CisKKy8vIFN0YXRpc3Rpaz8KKyNkZWZpbmUgU0FTVEFURCAiL3AvZGFlbW9uL3Nhc3RhdGQiCisKKyNlbmRpZiAvLyBfX1NLSUxMX0FUVFJJQlVURVNfSF9fCisKKworI2lmZGVmIE5FRURfUFJPVE9UWVBFUworCisjaWZuZGVmIF9fU0tJTExfQVRUUklCVVRFU19IX1BST1RPX18KKyNkZWZpbmUgX19TS0lMTF9BVFRSSUJVVEVTX0hfUFJPVE9fXworCisvLyBwcm90b3R5cGVzCisKK3B1YmxpYyBpbnQgICAgTW9kaWZ5U2tpbGxBdHRyaWJ1dGUoc3RyaW5nIGF0cm5hbWUsIG1peGVkIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGR1cmF0aW9uKTsKK3B1YmxpYyBpbnQgICAgUmVtb3ZlU2tpbGxBdHRyaWJ1dGVNb2RpZmllcihvYmplY3QgY2FzdGVyLCBzdHJpbmcgYXR0cm5hbWUpOworcHVibGljIGludCAgICBRdWVyeVNraWxsQXR0cmlidXRlKHN0cmluZyBhdHRyKTsKK3B1YmxpYyB2YXJhcmdzIG1hcHBpbmcgUXVlcnlTa2lsbEF0dHJpYnV0ZU1vZGlmaWVyKG9iamVjdCBjYXN0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgKmF0dHIpOworCisvLyBLb21wYXRpYmlsaXRhZXRzZnVua3Rpb24gbWl0IGFsdGVtIEludGVyZmFjZS4KK3B1YmxpYyBpbnQgICAgTW9kaWZ5U2tpbGxBdHRyaWJ1dGVPbGQob2JqZWN0IGNhc3Rlciwgc3RyaW5nIGF0cm5hbWUsIGludCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGR1cmF0aW9uLCBtaXhlZCBmdW4pOworCisjZW5kaWYgLy8gX19TS0lMTF9BVFRSSUJVVEVTX0hfUFJPVE9fXworCisjZW5kaWYgLy8gTkVFRF9QUk9UT1lQRVMKKwpkaWZmIC0tZ2l0IGEvc3lzL2xpdmluZy9za2lsbHMuaCBiL3N5cy9saXZpbmcvc2tpbGxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYyNTcyYwotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9saXZpbmcvc2tpbGxzLmgKQEAgLTAsMCArMSwzMyBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHNraWxscy5oIC0tIERlZmluZXMgYW5kIHByb3RvdHlwZXMgZm9yIC9zdGQvbGl2aW5nL3NraWxscy5jCisvLworLy8gJElkOiBza2lsbHMuaCA4Njk0IDIwMTQtMDItMjAgMjM6MDY6NTBaIFplc3N0cmEgJAorCisjaWZuZGVmIF9MSVZJTkdfU0tJTExTX0hfCisjZGVmaW5lIF9MSVZJTkdfU0tJTExTX0hfCisKKyNlbmRpZiAvLyBfTElWSU5HX1NLSUxMU19IXworCisjaWZkZWYgTkVFRF9QUk9UT1RZUEVTCisjaWZuZGVmIF9MSVZJTkdfU0tJTExTX0hfUFJPVE9fCisjZGVmaW5lIF9MSVZJTkdfU0tJTExTX0hfUFJPVE9fCitwdWJsaWMgICAgdmFyYXJncyBpbnQgICAgIFVzZVNwZWxsKHN0cmluZyBzdHIsIHN0cmluZyBzcGVsbCk7CisKK3B1YmxpYyAgICB2YXJhcmdzIG1hcHBpbmcgUXVlcnlTa2lsbChzdHJpbmcgc25hbWUsIHN0cmluZyBnaWxkZSk7CitwdWJsaWMgICAgdmFyYXJncyBpbnQgICAgIFF1ZXJ5U2tpbGxBYmlsaXR5KG1peGVkIHNuYW1lLCBtaXhlZCBhcmdsKTsKKworcHJvdGVjdGVkIHZhcmFyZ3MgbWl4ZWQgICBMaW1pdEFiaWxpdHkobWl4ZWQgc2luZm8sIGludCBkaWZmKTsKK3B1YmxpYyAgICB2YXJhcmdzIG1peGVkICAgVXNlU2tpbGwoc3RyaW5nIHNraWxsLCBtYXBwaW5nIGFyZ3MpOworCitwdWJsaWMgICAgdmFyYXJncyB2b2lkICAgIExlYXJuU2tpbGwoc3RyaW5nIHNuYW1lLCBpbnQgYWRkLCBpbnQgZGlmZik7CitwdWJsaWMgICAgdmFyYXJncyB2b2lkICAgIE1vZGlmeVNraWxsKHN0cmluZyBzbmFtZSwgbWl4ZWQgdmFsLCBpbnQgZGlmZiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBnaWxkZSk7CitwdWJsaWMgICAgdmFyYXJncyBpbnQgICAgIFNldFNwZWxsRmF0aWd1ZShpbnQgZHVyYXRpb24sIHN0cmluZyBrZXkpOworcHVibGljICAgIHZhcmFyZ3MgaW50ICAgICBDaGVja1NwZWxsRmF0aWd1ZShzdHJpbmcga2V5KTsKK3B1YmxpYyAgICAgICAgICAgIHZvaWQgICAgRGVsZXRlU3BlbGxGYXRpZ3VlKHN0cmluZyBrZXkpOworCisjZW5kaWYgLy8gX0xJVklOR19TS0lMTFNfSF9QUk9UT18KKworI2VuZGlmIC8vIE5FRURfUFJPVE9UWVBFUworCmRpZmYgLS1naXQgYS9zeXMvbGl2aW5nL3RlYW0uaCBiL3N5cy9saXZpbmcvdGVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MmUwYzMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvbGl2aW5nL3RlYW0uaApAQCAtMCwwICsxLDUwIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gbGl2aW5nL3RlYW0uaCAtLSB0ZWFtIGhlYWRlcgorLy8KKy8vICRJZDogdGVhbS5oIDg0NDkgMjAxMy0wMy0wNCAyMTowNjozOFogWmVzc3RyYSAkCisKKyNpZm5kZWYgX19MSVZJTkdfVEVBTV9IX18KKyNkZWZpbmUgX19MSVZJTkdfVEVBTV9IX18KKworI2RlZmluZSBQX1RFQU0gICAgICAgICAgICAgICAgICAgICJ0ZWFtIgorI2RlZmluZSBQX1RFQU1fTkVXTUVNQkVSICAgICAgICAgICJwb3RlbnRpYWxfdGVhbV9tZW1iZXIiCisjZGVmaW5lIFBfVEVBTV9BVFRBQ0tfQ01EICAgICAgICAgInRlYW1fYXR0YWNrX2NtZCIKKyNkZWZpbmUgUF9URUFNX0FVVE9GT0xMT1cgICAgICAgICAidGVhbV9hdXRvZm9sbG93IgorI2RlZmluZSBQX1RFQU1fV0FOVEVEX1JPVyAgICAgICAgICJ0ZWFtX3dhbnRlZF9yb3ciCisjZGVmaW5lIFBfVEVBTV9XSU1QWV9ST1cgICAgICAgICAgInRlYW1fd2ltcHlfcm93IgorI2RlZmluZSBQX1RFQU1fTEVBREVSICAgICAgICAgICAgICJ0ZWFtX2xlYWRlciIKKyNkZWZpbmUgUF9URUFNX0FTU09DX01FTUJFUlMgICAgICAidGVhbV9hc3NvY19tZW1iZXJzIgorI2RlZmluZSBQX1RFQU1fQ09MT1JTICAgICAgICAgICAgICJ0ZWFtX2NvbG9ycyIKKworI2RlZmluZSBURUFNX09CSkVDVCAiL29iai90ZWFtIgorI2RlZmluZSBURUFNX01BU1RFUiAiL3AvZGFlbW9uL3RlYW1tYXN0ZXIiCisjZGVmaW5lIEVNUFRZX1RFQU1BUlJBWSAoeyh7fSksKHt9KSwoe30pLCh7fSksKHt9KX0pCisjZGVmaW5lIE1BWF9URUFNUk9XUyA1CisjZGVmaW5lIE1BWF9URUFNX1JPV0xFTiA2CisjZGVmaW5lIE1BWF9URUFNX01FTUJFUlMgMTIKKworI2VuZGlmIC8vIF9fTElWSU5HX1RFQU1fSF9fCisKKyNpZmRlZiBORUVEX1BST1RPVFlQRVMKKyNpZm5kZWYgX19MSVZJTkdfVEVBTV9IX1BST1RPX18KKyNkZWZpbmUgX19MSVZJTkdfVEVBTV9IX1BST1RPX18KKworc3RyaW5nIFRlYW1QcmVmaXgoKTsKK29iamVjdCBJc1RlYW1MZWFkZXIoKTsKK29iamVjdCBJc1RlYW1Nb3ZlKCk7CitvYmplY3QgKlRlYW1NZW1iZXJzKCk7Cit2YXJhcmdzIGludCBQcmVzZW50UG9zaXRpb24obWl4ZWQgcG1hcCk7Cit2YXJhcmdzIG1hcHBpbmcgUHJlc2VudFRlYW1Qb3NpdGlvbnMobWl4ZWQgcHJlc19yb3dzKTsKK21peGVkICpQcmVzZW50VGVhbVJvd3MoKTsKK3ZhcmFyZ3MgbWl4ZWQgKlByZXNlbnRFbmVteVJvd3Mob2JqZWN0ICpoZXJlKTsKK3ZhcmFyZ3Mgb2JqZWN0IFNlbGVjdE5lYXJFbmVteShvYmplY3QgKmhlcmUsIGludCBmb3JjZWZyb20pOwordmFyYXJncyBvYmplY3QgU2VsZWN0RmFyRW5lbXkob2JqZWN0ICpoZXJlLCBpbnQgbWluLCBpbnQgbWF4LCBpbnQgZm9yY2Vmcm9tKTsKK3ZhcmFyZ3Mgdm9pZCBJbnNlcnRFbmVteVRlYW0obWl4ZWQgZW5zLCBpbnQgcmVrKTsKK2ludCBBc3NvY01lbWJlcihvYmplY3QgbnBjKTsKK2ludCBEZUFzc29jTWVtYmVyKG9iamVjdCBucGMpOworaW50IFRlYW1GbGVlKCk7Cit2YXJhcmdzIHZvaWQgSW5mb3JtUm93Q2hhbmdlKGludCBmcm9tLCBpbnQgdG8sIG9iamVjdCBjYXN0ZXIpOworIAorI2VuZGlmIC8vIF9fTElWSU5HX1RFQU1fSF9QUk9UT19fCisjZW5kaWYgLy8gLy8gTkVFRF9QUk9UT1lQRVMKZGlmZiAtLWdpdCBhL3N5cy9sb2dnaW5nLmggYi9zeXMvbG9nZ2luZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZDRhMTEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvbG9nZ2luZy5oCkBAIC0wLDAgKzEsMzEgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBsb2dnaW5nLmgKKy8vCisvLyAkSWQ6IGxvZ2dpbmcuaCA3MTE2IDIwMDktMDItMDYgMjE6NDk6NDJaIFplc3N0cmEgJAorCisjaWZuZGVmIF9fTE9HR0lOR19IX18KKyNkZWZpbmUgX19MT0dHSU5HX0hfXworCisjZGVmaW5lIFNZU0xPR1BBVEggICAgInN5c2xvZy8iCisjZGVmaW5lIFNZU0xPRyh4KSAgICAgKFNZU0xPR1BBVEgreCkKKworI2RlZmluZSBTSEVMTExPR1BBVEggIFNZU0xPRygic2hlbGwvIikKKyNkZWZpbmUgU0hFTExMT0coeCkgICAoU0hFTExMT0dQQVRIK3gpCisKKyNkZWZpbmUgREFFTU9OTE9HUEFUSCBTWVNMT0coImRhZW1vbi8iKQorI2RlZmluZSBEQUVNT05MT0coeCkgIChEQUVNT05MT0dQQVRIK3gpCisKKyNkZWZpbmUgSU5URVJNVURMT0dQQVRIIFNZU0xPRygiaW50ZXJtdWQvIikKKyNkZWZpbmUgSU5URVJNVURMT0coeCkgKElOVEVSTVVETE9HUEFUSCt4KQorCisjZGVmaW5lIEdVSUxETE9HUEFUSCAgImdpbGRlbi8iCisjZGVmaW5lIEdVSUxETE9HKHgpICAgKEdVSUxETE9HUEFUSCt4KQorCisjZGVmaW5lIFJFUEZJTEVQQVRIICAgInJlcG9ydC8iCisjZGVmaW5lIFJFUEZJTEUoeCkgICAgKFJFUEZJTEVQQVRIK3gpCisKKyNkZWZpbmUgRVJST1JMT0dQQVRIICAiZXJyb3IvIgorI2RlZmluZSBFUlJPUkxPRyh4KSAgIChFUlJPUkxPR1BBVEgreCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXMvbHBjdHlwZXMuaCBiL3N5cy9scGN0eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxODdkNmIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvbHBjdHlwZXMuaApAQCAtMCwwICsxLDY0IEBACisjaWZuZGVmIExQQ19MUENUWVBFU19ICisjZGVmaW5lIExQQ19MUENUWVBFU19ICisKKy8qIGNvbXBpbGUgdGltZSB0eXBlcywgZnJvbSBmdW5jdGlvbmxpc3QoKSAqLworCisjZGVmaW5lIFRZUEVfVU5LTk9XTiAgICAwICAgICAgIC8qIFRoaXMgdHlwZSBtdXN0IGJlIGNhc3RlZCAqLworI2RlZmluZSBUWVBFX05VTUJFUiAgICAgMQorI2RlZmluZSBUWVBFX1NUUklORyAgICAgMgorI2RlZmluZSBUWVBFX1ZPSUQgICAgICAgMworI2RlZmluZSBUWVBFX09CSkVDVCAgICAgNAorI2RlZmluZSBUWVBFX01BUFBJTkcgICAgNQorI2RlZmluZSBUWVBFX0ZMT0FUICAgICAgNgorI2RlZmluZSBUWVBFX0FOWSAgICAgICAgNyAgICAgICAvKiBXaWxsIG1hdGNoIGFueSB0eXBlICovCisjZGVmaW5lIFRZUEVfQ0xPU1VSRSAgICA4CisjZGVmaW5lIFRZUEVfU1lNQk9MICAgICA5CisjZGVmaW5lIFRZUEVfUVVPVEVEX0FSUkFZIDEwCisjZGVmaW5lIFRZUEVfU1RSVUNUICAgICAxMQorCisjZGVmaW5lIFRZUEVfTU9EX1BPSU5URVIgICAgICAgIDB4MDA0MCAgLyogUG9pbnRlciB0byBhIGJhc2ljIHR5cGUgICAgICAgICovCisKKy8qIHJ1bnRpbWUgdHlwZXMsIGZyb20gdHlwZW9mKCkgKi8KKworI2RlZmluZSBUX0lOVkFMSUQgICAgICAgMHgwCisjZGVmaW5lIFRfTFZBTFVFICAgICAgICAweDEKKyNkZWZpbmUgVF9OVU1CRVIgICAgICAgIDB4MgorI2RlZmluZSBUX1NUUklORyAgICAgICAgMHgzCisjZGVmaW5lIFRfUE9JTlRFUiAgICAgICAweDQKKyNkZWZpbmUgVF9PQkpFQ1QgICAgICAgIDB4NQorI2RlZmluZSBUX01BUFBJTkcgICAgICAgMHg2CisjZGVmaW5lIFRfRkxPQVQgICAgICAgICAweDcKKyNkZWZpbmUgVF9DTE9TVVJFICAgICAgIDB4OAorI2RlZmluZSBUX1NZTUJPTCAgICAgICAgMHg5CisjZGVmaW5lIFRfUVVPVEVEX0FSUkFZICAweGEKKyNkZWZpbmUgVF9TVFJVQ1QgICAgICAgIDB4YgorCisvKiBDbG9zdXJlIHR5cGVzLCBzdG9yZWQgYXMgc2Vjb25kYXJ5IHR5cGUgaW5mbyAqLworCisjaWZuZGVmIF9fRFJJVkVSX1NPVVJDRV9fCisKKyNkZWZpbmUgQ0xPU1VSRV9MRlVOICAgICAgICAgICAgMCAgLyogbGZ1biBpbiBhbiBvYmplY3QgKi8KKyAgLyogQ29kZSAxOiBjdXJyZW50bHkgdW51c2VkLCB1c2VkIHRvIGJlIENMT1NVUkVfQUxJRU5fTEZVTiAqLworI2RlZmluZSBDTE9TVVJFX0lERU5USUZJRVIgICAgICAyICAvKiB2YXJpYWJsZSBpbiB0aGlzIG9iamVjdCAqLworI2RlZmluZSBDTE9TVVJFX1BSRUxJTUlOQVJZICAgICAzCisgICAgLyogRWZ1biBjbG9zdXJlIHVzZWQgaW4gYSBzdGF0aWMgaW5pdGlhbGl6YXRpb24gKi8KKyNkZWZpbmUgQ0xPU1VSRV9CT1VORF9MQU1CREEgICAgNCAgLyogQm91bmQgdW5ib3VuZC1sYW1iZGEgY2xvc3VyZSAqLworI2RlZmluZSBDTE9TVVJFX0xBTUJEQSAgICAgICAgICA1ICAvKiBub3JtYWwgbGFtYmRhIGNsb3N1cmUgKi8KKyNkZWZpbmUgQ0xPU1VSRV9VTkJPVU5EX0xBTUJEQSAgNiAgLyogdW5ib3VuZCBsYW1iZGEgY2xvc3VyZS4gKi8KKworI2RlZmluZSBDTE9TVVJFX09QRVJBVE9SICAgICAgICAoMHhlODAwKQorI2RlZmluZSBDTE9TVVJFX0VGVU4gICAgICAgICAgICAoMHhmMDAwKQorI2RlZmluZSBDTE9TVVJFX1NJTVVMX0VGVU4gICAgICAoMHhmODAwKQorCisjZGVmaW5lIENMT1NVUkVfSVNfTEZVTih4KQkJKCgoeCkmfjEpID09IDApCisjZGVmaW5lIENMT1NVUkVfSVNfSURFTlRJRklFUih4KQkoKHgpID09IENMT1NVUkVfSURFTlRJRklFUikKKyNkZWZpbmUgQ0xPU1VSRV9JU19CT1VORF9MQU1CREEoeCkJKCh4KSA9PSBDTE9TVVJFX0JPVU5EX0xBTUJEQSkKKyNkZWZpbmUgQ0xPU1VSRV9JU19MQU1CREEoeCkJCSgoeCkgPT0gQ0xPU1VSRV9MQU1CREEpCisjZGVmaW5lIENMT1NVUkVfSVNfVU5CT1VORF9MQU1CREEoeCkJKCh4KSA9PSBDTE9TVVJFX1VOQk9VTkRfTEFNQkRBKQorI2RlZmluZSBDTE9TVVJFX0lTX1NJTVVMX0VGVU4oeCkgKCgoeCkgJiAweGY4MDApID09IENMT1NVUkVfU0lNVUxfRUZVTikKKyNkZWZpbmUgQ0xPU1VSRV9JU19FRlVOKHgpCSAoKCh4KSAmIDB4ZjgwMCkgPT0gQ0xPU1VSRV9FRlVOKQorI2RlZmluZSBDTE9TVVJFX0lTX09QRVJBVE9SKHgpCSAoKCh4KSAmIDB4ZjgwMCkgPT0gQ0xPU1VSRV9PUEVSQVRPUikKKworI2VuZGlmIC8qIF9fRFJJVkVSX1NPVVJDRV9fICovCisKKyNlbmRpZiAvKiBMUENfTFBDVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzL21hZ2llci5oIGIvc3lzL21hZ2llci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzY2Q5OGYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvbWFnaWVyLmgKQEAgLTAsMCArMSwyMjUgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBtYWdpZXIuaCAtLSBNYWdpZXJlcndlaXRlcnVuZyBkZXIgU2hlbGwKKy8vCisvLyAkSWQ6IG1hZ2llci5oIDk1NTMgMjAxNi0wNS0wMyAyMDoyMjo0N1ogWmVzc3RyYSAkCisKKyNpZm5kZWYgX01BR0lFUl9IXworI2RlZmluZSBfTUFHSUVSX0hfCisKKyNkZWZpbmUgU0hFTExERUJVR0dFUiAiemVzc3RyYSIKKworI2RlZmluZSBNQVhfQVJSQVlfU0laRSAgIDMwMDAgLy8gTVVTUyBFSUdFTlRMSUNIIE5BQ0ggL3N5cy9jb25maWcuaCBvZGVyIHNvCisKKyNkZWZpbmUgRVJST1IobXNnLCBhcmcsIHJlcykgICAocHJpbnRmKG1zZywgYXJnKSxyZXMpCisKKyNkZWZpbmUgTk9fUkVBRCAgICAgICAgICIlczogS2VpbmUgTGVzZXJlY2h0ZSFcbiIKKyNkZWZpbmUgTk9fV1JJVEUgICAgICAgICIlczogS2VpbmUgU2NocmVpYnJlY2h0ZSFcbiIKKyNkZWZpbmUgRE9FU05UX0VYSVNUICAgICIlczogRGF0ZWkgZXhpc3RpZXJ0IG5pY2h0IVxuIgorI2RlZmluZSBBTFJFQURZX0VYSVNUUyAgIiVzOiBEYXRlaSBleGlzdGllcnQgc2Nob24uXG4iCisjZGVmaW5lIE5PX0RJUlMgICAgICAgICAgIiVzIGlzdCBlaW4gVmVyemVpY2huaXMuXG4iCisjZGVmaW5lIFNBTUVfRklMRSAgICAgICAgIiVzOiBHbGVpY2hlcyBRdWVsbC0gdW5kIFppZWxmaWxlOiB1ZWJlcmdhbmdlbi5cbiIKKyNkZWZpbmUgTk9fQ1JFQVRFX0RJUiAgICIlczogVmVyemVpY2huaXMga29ubnRlIG5pY2h0IGVyc3RlbGx0IHdlcmRlbi5cbiIKKyNkZWZpbmUgREVTVF9JU19ESVIgICAgICIlczogWmllbGRhdGVpIGlzdCBlaW4gVmVyemVpY2huaXMuXG4iCisjZGVmaW5lIERFU1RfTk9fREVMRVRFICAiJXM6IFppZWxkYXRlaSBrb25udGUgbmljaHQgZ2Vsb2VzY2h0IHdlcmRlbi5cbiIKKyNkZWZpbmUgTk9fTU9WRSAgICAgICAgICIlczogRGF0ZWkga29ubnRlIG5pY2h0IHZlcnNjaG9iZW4gd2VyZGVuLlxuIgorI2RlZmluZSBOT19DT1BZICAgICAgICAgIiVzOiBEYXRlaSBrb25udGUgbmljaHQga29waWVydCB3ZXJkZW4uXG4iCisjZGVmaW5lIEZJTEVfQ09QSUVEICAgICAiJXM6IGtvcGllcnQuXG4iCisjZGVmaW5lIERJUl9DUkVBVEVEICAgICAiJXM6IFZlcnplaWNobmlzIGVyemV1Z3QuXG4iCisjZGVmaW5lIEZJTEVfTU9WRUQgICAgICAiJXM6IHZlcnNjaG9iZW4uXG4iCisjZGVmaW5lIEZJTEVfREVMRVRFRCAgICAiJXMgd3VyZGUgZ2Vsb2VzY2h0LlxuIgorI2RlZmluZSBOT19ERUxFVEUgICAgICAgIiVzIGtvbm50ZSBuaWNodCBnZWxvZXNjaHQgd2VyZGVuLlxuIgorCisjZGVmaW5lIE1BWV9SRUFEKHgpICAgY2FsbF9vdGhlcihfX01BU1RFUl9PQkpFQ1RfXywidmFsaWRfcmVhZCIseCxnZXR1aWQodGhpc19vYmplY3QoKSkpCisjZGVmaW5lIE1BWV9XUklURSh4KSAgY2FsbF9vdGhlcihfX01BU1RFUl9PQkpFQ1RfXywidmFsaWRfd3JpdGUiLHgsZ2V0dWlkKHRoaXNfb2JqZWN0KCkpKQorI2RlZmluZSBNQVlfREVMRVRFKHgpIGNhbGxfb3RoZXIoX19NQVNURVJfT0JKRUNUX18sInJlbW92ZV9maWxlIix4LGdldHVpZCh0aGlzX29iamVjdCgpKSkKKworI2RlZmluZSBNQVhMRU4gIDUwMDAwCisKKyNkZWZpbmUgUF9WQVJJQUJMRVMgInZhcmlhYmxlcyIKKworI2RlZmluZSBNQU5fT1BUUyAgICJtcmkiCisjZGVmaW5lIE1BTl9NICAgICAgICAgICAgMSAgICAgICAgICAgLy8gTWF0Y2hlbiBkZXMgQmVncmlmZnMKKyNkZWZpbmUgTUFOX1IgICAgICAgICAgICAyICAgICAgICAgICAvLyBSZWdleHAtTWF0Y2hlbgorI2RlZmluZSBNQU5fSSAgICAgICAgICAgIDQgICAgICAgICAgIC8vIEludGVyYWt0aXZlIEhpbGZlIChkZWFrdGl2aWVydCkKKworI2RlZmluZSBNS0RJUl9PUFRTICJ2cnAiCisjZGVmaW5lIE1LRElSX1YgICAgICAgICAgMSAgICAgICAgICAgLy8gVmVyYm9zZTogQXVzZ2ViZW4sIHdhcyBnZW1hY2h0IHdpcmQKKyNkZWZpbmUgTUtESVJfUiAgICAgICAgICAyICAgICAgICAgICAvLyBSZWt1cnNpdiBhbGxlIGhvZWhlcmVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmVyemVpY2huaXNzZSBlcnN0ZWxsZW4KKyNkZWZpbmUgTUtESVJfUCAgICAgICAgICAyICAgICAgICAgICAvLyBkYXMgZ2xlaWNoZSB3aWUgTUtESVJfUgorCisjZGVmaW5lIFJNRElSX09QVFMgInYiCisjZGVmaW5lIFJNRElSX1YgICAgICAgICAgMSAgICAgICAgICAgLy8gVmVyYm9zZTogQXVzZ2ViZW4sIHdhcyBnZW1hY2h0IHdpcmQKKworI2RlZmluZSBSTV9PUFRTICAgInZybWkiCisjZGVmaW5lIFJNX1YgICAgICAgICAgICAxICAgICAgICAgICAgLy8gVmVyYm9zZTogQXVzZ2ViZW4sIHdhcyBnZW1hY2h0IHdpcmQKKyNkZWZpbmUgUk1fUiAgICAgICAgICAgIDIgICAgICAgICAgICAvLyBWZXJ6ZWljaG5pc3NlIHJla3Vyc2l2IGxvZXNjaGVuCisjZGVmaW5lIFJNX00gICAgICAgICAgICA0ICAgICAgICAgICAgLy8gRGF0ZWlNQVNLRSBiZWFjaHRlbgorI2RlZmluZSBSTV9JICAgICAgICAgICAgOCAgICAgICAgICAgIC8vIEludGVyYWt0aXYgbG9lc2NoZW4gKGltbWVyIGZyYWdlbikKKworI2RlZmluZSBVUERfT1BUUyAgImFmaWxybWJ2Y2Roc0MiCisjZGVmaW5lIFVQRF9BICAgICAgICAgICAgMSAgICAgICAgICAgLy8gQWxsZSBJbnN0YW56ZW4gYmVhcmJlaXRlbgorI2RlZmluZSBVUERfRiAgICAgICAgICAgIDIgICAgICAgICAgIC8vIEFsbGUgSW5zdGFuemVuIGZpbmRlbiB1bmQgYW56ZWlnZW4KKyNkZWZpbmUgVVBEX0kgICAgICAgICAgICA0ICAgICAgICAgICAvLyBHZWVyYnRlIEtsYXNzZW4gYWt0dWFsaXNpZXJlbgorI2RlZmluZSBVUERfTCAgICAgICAgICAgIDggICAgICAgICAgIC8vIHplcnN0b2VyZW4gdW5kIG5ldSBsYWRlbgorI2RlZmluZSBVUERfUiAgICAgICAgICAgMTYgICAgICAgICAgIC8vIG5ldSBsYWRlbiwgZmFsbHMgemVyc3RvZXJ0CisjZGVmaW5lIFVQRF9NICAgICAgICAgICAzMiAgICAgICAgICAgLy8gYWxsZSBnZWVyYnRlbiBLbGFzc2VuIGF1ZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFrdHVhbGl0YWV0IFRlc3RlbiB1bmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZ2YuIGFrdHVhbGlzaWVyZW4KKyNkZWZpbmUgVVBEX0IgICAgICAgICAgIDY0ICAgICAgICAgICAvLyBCYWNrdHJhY2UgYmVpIEZlaGxlcm4KKyNkZWZpbmUgVVBEX1YgICAgICAgICAgMTI4ICAgICAgICAgICAvLyBFcmJzY2hhZnRzbGlzdGVuIG1pdCBhdXNnZWJlbgorI2RlZmluZSBVUERfQyAgICAgICAgICAyNTYgICAgICAgICAgIC8vIFByb3BlcnRpZXMgZXJoYWx0ZW4KKyNkZWZpbmUgVVBEX0QgICAgICAgICAgNTEyICAgICAgICAgICAvLyBPYmpla3RpbmhhbHQga29tcGxldHQgZGVzdHJ1Y3RlbgorI2RlZmluZSBVUERfSCAgICAgICAgIDEwMjQgICAgICAgICAgIC8vIEhhcmQtRGVzdHJ1Y3QgKGtlaW4gcmVtb3ZlKCkpCisjZGVmaW5lIFVQRF9TICAgICAgICAgMjA0OCAgICAgICAgICAgLy8gU2lsZW50CisjZGVmaW5lIFVQRF9DT05GICAgICAgNDA5NiAgICAgICAgICAgLy8gQ29uZmlndXJlKCkgZXJ6d2luZ2VuIChkLmguIGtlaW4gVXBkYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlbm4gQ29uZmlndXJlKCkgbmljaHQgZGVmaW5pZXJ0IGlzdCkKKyNkZWZpbmUgVVBEX0xPQUQgICAgICA4MTkyICAgICAgICAgICAvLyBsYWRlbiwgZmFsbHMgbmljaHQgZ2VsYWRlbiAobnVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50ZXJuIGZ1ZXIgJ2xvYWQpCisKKyNkZWZpbmUgQ1BfT1BUUyAgICAgICAgICJ2cmZtaSIKKyNkZWZpbmUgQ1BfViAgICAgICAgICAgIDEgICAgICAgICAgICAvLyBWZXJib3NlOiBBdXNnZWJlbiwgd2FzIGdlbWFjaHQgd2lyZAorI2RlZmluZSBDUF9SICAgICAgICAgICAgMiAgICAgICAgICAgIC8vIFJla3Vyc2l2IGtvcGllcmVuCisjZGVmaW5lIENQX0YgICAgICAgICAgICA0ICAgICAgICAgICAgLy8gRm9yY2UgKG5pZSBmcmFnZW4pCisjZGVmaW5lIENQX00gICAgICAgICAgICA4ICAgICAgICAgICAgLy8gRGF0ZWlNQVNLRSBiZWFjaHRlbgorI2RlZmluZSBDUF9JICAgICAgICAgICAxNiAgICAgICAgICAgIC8vIEludGVyYWt0aXYga29waWVyZW4gKGltbWVyIGZyYWdlbikKKworI2RlZmluZSBNVl9PUFRTICAgICAgICAgInZyZm1pIgorI2RlZmluZSBNVl9WICAgICAgICAgICAgMSAgICAgICAgICAgIC8vIFZlcmJvc2U6IEF1c2dlYmVuLCB3YXMgZ2VtYWNodCB3aXJkCisjZGVmaW5lIE1WX1IgICAgICAgICAgICAyICAgICAgICAgICAgLy8gSW1tZXIgYXVjaCBEYXRlaWVuIGltIERpciBtb3ZlbgorI2RlZmluZSBNVl9GICAgICAgICAgICAgNCAgICAgICAgICAgIC8vIEZvcmNlIChuaWUgZnJhZ2VuKQorI2RlZmluZSBNVl9NICAgICAgICAgICAgOCAgICAgICAgICAgIC8vIERhdGVpTUFTS0UgYmVhY2h0ZW4KKyNkZWZpbmUgTVZfSSAgICAgICAgICAgMTYgICAgICAgICAgICAvLyBJbnRlcmFrdGl2IGJld2VnZW4gKGltbWVyIGZyYWdlbikKKworI2RlZmluZSBDRF9PUFRTICAgICAgICAgImxzIgorI2RlZmluZSBDRF9MICAgICAgICAgICAgMSAgICAgICAgICAgIC8vIC5yZWFkbWUgYXVzZ2ViZW4KKyNkZWZpbmUgQ0RfUyAgICAgICAgICAgIDIgICAgICAgICAgICAvLyAucmVhZG1lIHVudGVyZHJ1ZWNrZW4KKyNkZWZpbmUgQ0RfQiAgICAgICAgICAgIDQgICAgICAgICAgICAvLyBadXJ1ZWNrIHp1bSBsZXR6dGVuIFZlcnplaWNobmlzCisKKyNkZWZpbmUgTFNfT1BUUyAgICAgICAgICJhbHJ0c3VnIgorI2RlZmluZSBMU19BICAgICAgICAgICAgMSAgICAgICAgICAgIC8vIEFMTEUgRmlsZXMgYW56ZWlnZW4KKyNkZWZpbmUgTFNfTCAgICAgICAgICAgIDIgICAgICAgICAgICAvLyBMYW5nZSBBdXNnYWJlCisjZGVmaW5lIExTX1IgICAgICAgICAgICA0ICAgICAgICAgICAgLy8gUnVlY2t3YWVydHMgYXVzZ2ViZW4KKyNkZWZpbmUgTFNfVCAgICAgICAgICAgIDggICAgICAgICAgICAvLyBOYWNoIFplaXQgb3JkbmVuCisjZGVmaW5lIExTX1MgICAgICAgICAgICAxNiAgICAgICAgICAgLy8gTmFjaCBHcvbfZSBvcmRuZW4KKyNkZWZpbmUgTFNfVSAgICAgICAgICAgIDMyICAgICAgICAgICAvLyBVSUQgYW56ZWlnZW4KKyNkZWZpbmUgTFNfRyAgICAgICAgICAgIDY0ICAgICAgICAgICAvLyBHcnVwcGUgYW56ZWlnZW4KKworI2RlZmluZSBDTE9ORV9PUFRTICAgICAgImYiCisjZGVmaW5lIENMT05FX0YgICAgICAgICAxICAgICAgICAgICAgLy8gQXVmIGplZGVuIEZhbGwgdmVyc3VjaGVuIHp1IGNsb25lbgorCisjZGVmaW5lIEdSRVBfT1BUUyAgICAgICAiY2hpbG52cm1mIgorI2RlZmluZSBHUkVQX0MgICAgICAgICAgMSAgICAgICAgICAgIC8vIE51ciBaYWhsIGRlciBaZWlsZW4gYXVzZ2ViZW4KKyNkZWZpbmUgR1JFUF9IICAgICAgICAgIDIgICAgICAgICAgICAvLyBEYXRlaW5hbWVuIG5pY2h0IG1pdCBhdXNnZWJlbgorI2RlZmluZSBHUkVQX0kgICAgICAgICAgNCAgICAgICAgICAgIC8vIEdyb3NzLS9LbGVpbnNjaHJlaWJ1bmcgaWdub3JpZXJlbgorI2RlZmluZSBHUkVQX0wgICAgICAgICAgOCAgICAgICAgICAgIC8vIERhdGVpbmFtZW4gaW1tZXIgbWl0IGF1c2dlYmVuCisjZGVmaW5lIEdSRVBfTiAgICAgICAgICAxNiAgICAgICAgICAgLy8gWmVpbGVubnVtbWVybiBtaXQgYXVzZ2ViZW4KKyNkZWZpbmUgR1JFUF9WICAgICAgICAgIDMyICAgICAgICAgICAvLyBOdXIgWmVpbGVuIG1hdGNoZW4sIGRpZSBOSUNIVCBwYXNzZW4KKyNkZWZpbmUgR1JFUF9SICAgICAgICAgIDY0ICAgICAgICAgICAvLyBSZWt1cnNpdiBzdWNoZW4KKyNkZWZpbmUgR1JFUF9NICAgICAgICAgIDEyOCAgICAgICAgICAvLyBEYXRlaW1hc2tlIGFuZ2VnZWJlbgorI2RlZmluZSBHUkVQX0YgICAgICAgICAgMjU2ICAgICAgICAgIC8vIEF1c2dhYmUgaW4gRGF0ZWkKKworI2RlZmluZSBBQ0NFU1NfT1BUUyAgICAgImFybGZnbSIKKyNkZWZpbmUgQUNDRVNTX0EgICAgICAgIDEgICAgICAgICAgICAvLyBCZXJlY2h0aWd1bmcgaGluenVmdWVnZW4KKyNkZWZpbmUgQUNDRVNTX1IgICAgICAgIDIgICAgICAgICAgICAvLyBCZXJlY2h0aWd1bmcgZW50ZmVybmVuCisjZGVmaW5lIEFDQ0VTU19MICAgICAgICA0ICAgICAgICAgICAgLy8gQmVyZWNodGlndW5nZW4gYW56ZWlnZW4KKyNkZWZpbmUgQUNDRVNTX0YgICAgICAgIDggICAgICAgICAgICAvLyBCZXJlY2h0aWd1bmcgZnVlciBEYXRlaWVuIGFuemVpZ2VuCisjZGVmaW5lIEFDQ0VTU19HICAgICAgICAxNiAgICAgICAgICAgLy8gRGFzIGdhbnplIGZ1ZXIgR3J1cHBlbgorI2RlZmluZSBBQ0NFU1NfTSAgICAgICAgMzIgICAgICAgICAgIC8vIERhcyBnYW56ZSBmdWVyIEdydXBwZW5sZWl0ZXIKKworLy8gRnVua3Rpb25pZXJ0IG51ciwgd2VubiBTTk9PUF9MID09IFNGX0xPQ0tFRCB1bmQgU05PT1BfRiA9PSBTRl9GT1JDRQorLy8gKERlZmluaXRpb25lbiBhdXMgL3N5cy9zbm9vcGluZy5oKQorI2RlZmluZSBTTk9PUF9PUFRTICAgICAgImxmIgorI2RlZmluZSBTTk9PUF9MICAgICAgICAgMSAgICAgICAgICAgIC8vIE5pZWRyaWdlciBNYWdpZXIga2FubiBzaWNoIG5pY2h0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGF6d2lzY2hlbmtsaW5rZW4KKyNkZWZpbmUgU05PT1BfRiAgICAgICAgIDIgICAgICAgICAgICAvLyBTbm9vcGUgc25vb3BlbmRlbiBNYWdpZXIsIHdlbm4gZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hhcmFrdGVyIHNjaG9uIGdlc25vb3B0IHdpcmQKKworI2RlZmluZSBOT19DSEVDSyAgICAgICAgTV9HT3xNX1NJTEVOVHxNX05PX1NIT1d8TV9OT19BVFRBQ0t8TV9OT0NIRUNLCisKKyNkZWZpbmUgSU5WX1NBVkUgICAgICAgICIvcm9vbS92b2lkLmMiCisKKyNkZWZpbmUgVVNBR0Uoc3RyKSAgICAgIChfbm90aWZ5X2ZhaWwoYnJlYWtfc3RyaW5nKHNwcmludGYoIlN5bnRheDogJXNcbiIsIHN0ciksNzcpKSwgMCkKKworI2RlZmluZSBCQVNFTkFNRSAwCisjZGVmaW5lIEZJTEVTSVpFIDEKKyNkZWZpbmUgRklMRURBVEUgMgorI2RlZmluZSBGVUxMTkFNRSAzCisjZGVmaW5lIFBBVEhOQU1FIDQKKyNkZWZpbmUgREVTVE5BTUUgNQorI2RlZmluZSBTVUJESVJTSVpFIDYKKworI2RlZmluZSBSRVRfT0sgMQorI2RlZmluZSBSRVRfRkFJTCAwCisjZGVmaW5lIFJFVF9KVU1QIC0xCisjZGVmaW5lIFJFVF9ERUxFVEUgLTIKKworI2RlZmluZSBNT0RFX0xTQSAgIDAKKyNkZWZpbmUgTU9ERV9MU0IgICAxCisjZGVmaW5lIE1PREVfQ1AgICAgMgorI2RlZmluZSBNT0RFX01WICAgIDMKKyNkZWZpbmUgTU9ERV9STSAgICA0CisjZGVmaW5lIE1PREVfQ0QgICAgNQorI2RlZmluZSBNT0RFX0NBVCAgIDYKKyNkZWZpbmUgTU9ERV9HUkVQICA3CisjZGVmaW5lIE1PREVfRUQgICAgOAorI2RlZmluZSBNT0RFX1VQRCAgIDkKKyNkZWZpbmUgTU9ERV9NT1JFICAxMAorI2RlZmluZSBNT0RFX1JNRElSIDExCisjZGVmaW5lIE1PREVfQ0xPTkUgMTIKKworI2RlZmluZSBDT0xPUlMgKFsgIm5vbmUiOiBBTlNJX05PUk1BTCwgXAorICAgICAgICAgICAgICAgICAgImJvbGQiOiBBTlNJX0JPTEQsIFwKKyAgICAgICAgICAgICAgICAgICJibGluayI6IEFOU0lfQkxJTkssIFwKKyAgICAgICAgICAgICAgICAgICJpbnZlcnMiOiBBTlNJX0lOVkVSUywgXAorICAgICAgICAgICAgICAgICAgImJsYWNrIjogQU5TSV9CTEFDSywgXAorICAgICAgICAgICAgICAgICAgInJlZCI6IEFOU0lfUkVELCBcCisgICAgICAgICAgICAgICAgICAiZ3JlZW4iOiBBTlNJX0dSRUVOLCBcCisgICAgICAgICAgICAgICAgICAieWVsbG93IjogQU5TSV9ZRUxMT1csIFwKKyAgICAgICAgICAgICAgICAgICJibHVlIjogQU5TSV9CTFVFLCBcCisgICAgICAgICAgICAgICAgICAicHVycGxlIjogQU5TSV9QVVJQTEUsIFwKKyAgICAgICAgICAgICAgICAgICJjeWFuIjogQU5TSV9DWUFOLCBcCisgICAgICAgICAgICAgICAgICAid2hpdGUiOiBBTlNJX1dISVRFLCBcCisgICAgICAgICAgICAgICAgICAiYmJsYWNrIjogQU5TSV9CR19CTEFDSywgXAorICAgICAgICAgICAgICAgICAgImJyZWQiOiBBTlNJX0JHX1JFRCwgXAorICAgICAgICAgICAgICAgICAgImJncmVlbiI6IEFOU0lfQkdfR1JFRU4sIFwKKyAgICAgICAgICAgICAgICAgICJieWVsbG93IjogQU5TSV9CR19ZRUxMT1csIFwKKyAgICAgICAgICAgICAgICAgICJiYmx1ZSI6IEFOU0lfQkdfQkxVRSwgXAorICAgICAgICAgICAgICAgICAgImJwdXJwbGUiOiBBTlNJX0JHX1BVUlBMRSwgXAorICAgICAgICAgICAgICAgICAgImJjeWFuIjogQU5TSV9CR19DWUFOLCBcCisgICAgICAgICAgICAgICAgICAiYndoaXRlIjogQU5TSV9CR19XSElURSwgXAorICAgICAgICAgICAgICAgIF0pCisKKyNkZWZpbmUgVkFMSURfUkVBRF9DTCAgc3ltYm9sX2Z1bmN0aW9uKCJ2YWxpZF9yZWFkIixfX01BU1RFUl9PQkpFQ1RfXykKKyNkZWZpbmUgVkFMSURfV1JJVEVfQ0wgc3ltYm9sX2Z1bmN0aW9uKCJ2YWxpZF93cml0ZSIsX19NQVNURVJfT0JKRUNUX18pCisjZGVmaW5lIENSRUFUT1JfQ0wgIHN5bWJvbF9mdW5jdGlvbigiY3JlYXRvcl9maWxlIixfX01BU1RFUl9PQkpFQ1RfXykKKworI2RlZmluZSBESVIgImRpcmVjdG9yeSIKKyNkZWZpbmUgT0JKICJsb2FkZWQiCisjZGVmaW5lIFZDICAidmlydHVhbCIKKworI2lmZGVmIERFQlVHCisjdW5kZWYgREVCVUcKKyNlbmRpZgorI2RlZmluZSBERUJVRyh4KSBpZiAoZmluZF9wbGF5ZXIoU0hFTExERUJVR0dFUikpIFwKKyAgICAgICAgICAgICAgICAgICAgIHRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKFNIRUxMREVCVUdHRVIpLHgrIlxuIikKKworI2VuZGlmIC8vIF9NQUdJRVJfSF8KKworCisjaWZkZWYgTkVFRF9QUk9UT1RZUEVTCisjaWZuZGVmIF9NQUdJRVJfSF9QUk9UT1NfCisjZGVmaW5lIF9NQUdJRVJfSF9QUk9UT1NfCitzdGF0aWMgc3RyaW5nICpwYXJzZWFyZ3Moc3RyaW5nIGNtZGxpbmUsaW50IGZsYWdzLHN0cmluZyBvcHRzLGludCBidWlsZF9mbik7CitzdGF0aWMgdmFyYXJncyB2b2lkIGFzeW5jaHJvbihtaXhlZCogYXJyYXksIGNsb3N1cmUgY21kLCBtaXhlZCBkYXRhLCBtaXhlZCBmbGFncywgaW50IGMpOworc3RhdGljIHZhcmFyZ3MgbWl4ZWQgKmZpbGVfbGlzdChzdHJpbmcgKmZpbGVzLCBpbnQgbW9kZSwgaW50IHJlY3Vyc2l2ZSwgc3RyaW5nIGRlc3QsIHN0cmluZyBtYXNrKTsKK3N0YXRpYyBtaXhlZCB0b19maWxlbmFtZShzdHJpbmcgc3RyKTsKK3N0YXRpYyBpbnQgX3ZlcmZvbGdlKHN0cmluZyBzdHIpOworc3RhdGljIHN0cmluZyBnbG9iMnJlZ2V4cChzdHJpbmcgc3RyKTsKKwordmFyYXJncyBwdWJsaWMgdm9pZCBNb3JlKHN0cmluZyB0eHQsIGludCBmaWxlLG1peGVkIGN0cmwsIG1peGVkICpjdHJsYXJncywgaW50IGZsYWdzKTsKKyNlbmRpZiAvLyBfTUFHSUVSX0hfUFJPVE9TXworI2VuZGlmIC8vIE5FRURfUFJPVE9UWVBFUworCisKZGlmZiAtLWdpdCBhL3N5cy9tYWlsLmggYi9zeXMvbWFpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYjFjY2MKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvbWFpbC5oCkBAIC0wLDAgKzEsNDMgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBtYWlsLmggLS0gRGVmaW5pdGlvbmVuIGZ1ZXIgZGllIFBvc3QKKy8vCisvLyAkSWQ6IG1haWwuaCx2IDMuNCAyMDAwLzAxLzIwIDE1OjEzOjI1IFRpYW1hayBFeHAgJAorCisjaWZuZGVmIF9NQUlMXworI2RlZmluZSBfTUFJTF8KKy8qCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRGVmaW5pdGlvbnMgb2YgZmllbGRzIHVzZWQgaW4gbWFpbCBtZXNzYWdlcworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKglBIG1lc3NhZ2UgaXMgcmVwcmVzZW50ZWQgYXMgYW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIGZpZWxkczoKKyAqLworI2RlZmluZSBNU0dfRlJPTSAwCisjZGVmaW5lIE1TR19TRU5ERVIgMQorI2RlZmluZSBNU0dfUkVDSVBJRU5UIDIKKyNkZWZpbmUgTVNHX0NDIDMKKyNkZWZpbmUgTVNHX0JDQyA0CisjZGVmaW5lIE1TR19TVUJKRUNUIDUKKyNkZWZpbmUgTVNHX0RBVEUgNgorI2RlZmluZSBNU0dfSUQgNworI2RlZmluZSBNU0dfQk9EWSA4CisKKyNkZWZpbmUgTk9fVVNFUl9BTElBU0VTICAgIDEKKyNkZWZpbmUgTk9fU1lTVEVNX0FMSUFTRVMgIDIKKyNkZWZpbmUgTk9fQ0FSQk9OX0NPUElFUyAgIDQKKworI2luY2x1ZGUgIi9tYWlsL3Bvc3QuaCIKKworLyoKKyAqCURlbGl2ZXJNYWlsKG1peGVkICptZXNzYWdlKQorICoJICBIYW5kIGEgbWFpbCBtZXNzYWdlIG92ZXIgdG8gdGhlIG1haWxlciBkZW1vbi4gVGhlIG1haWxlcgorICoJICBkZW1vbiBleHRyYWN0cyByZWNpcGllbnRzIGZyb20gdGhlIHJlY2lwaWVudCwgY2MgYW5kIGJjYworICoJICBmaWVsZHMgYW5kIHJlbW92ZXMgdGhlIGJjYyBpbmZvcm1hdGlvbi4gSXQgdGhlbiBkZXBvc2l0cworICoJICB0aGUgbWVzc2FnZSB0byB0aGUgbWFpbCBmaWxlcyBvZiBhbGwgcmVjaXBpZW50cy4gQSB2YWxpZAorICoJICBtZXNzYWdlIGlzIHNob3duIGFib3ZlLgorICoKKyAqCWludCBGaW5nZXJNYWlsKHN0cmluZyB1c2VyKQorICoJICBHaXZlcyB0aGUgbnVtYmVyIG9mIHVucmVhZCBtZXNzYWdlcyBhIHVzZXIgaGFzLgorICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5cy9tb25leS5oIGIvc3lzL21vbmV5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMwNDQ4MQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9tb25leS5oCkBAIC0wLDAgKzEsMzIgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBtb25leS5oIC0tIEtvbnN0YW50ZW4gdW5kIFBmYWRlIHJ1bmQgdW1zIEdlbGQKKy8vCisvLyAkSWQ6IG1vbmV5aGFuZGxlci5oLHYgMy4xIDE5OTcvMDIvMTIgMTM6Mjk6MDkgV2FyZ29uIEV4cCAkCisKKyNpZm5kZWYgX19MSUJfTU9ORVlfSF9fCisjZGVmaW5lIF9fTElCX01PTkVZX0hfXworCisjaW5jbHVkZSA8Y29udGFpbmVyL21vbmV5aGFuZGxlci5oPgorI2luY2x1ZGUgPGJhbmsuaD4KKworI2RlZmluZSBHRUxEICAgICAgICIvaXRlbXMvbW9uZXkiCisjZGVmaW5lIEJPRVJTRSAgICAgIi9pdGVtcy9ib2Vyc2UiCisjZGVmaW5lIFNFSEVSS0FSVEUgIi9pdGVtcy9zZWVyY2FyZCIKKworI2RlZmluZSBHRUxESUQgICAgICAgIlxuZ2VsZCIKKyNkZWZpbmUgQk9FUlNFSUQgICAgICJcbmdlbGRib2Vyc2UiCisjZGVmaW5lIFNFSEVSS0FSVEVJRCAiXG5nZWxka2FydGUiCisvLyBJZCBmdWVyIGVpbmUgQm9lcnNlIG1pdCBHZWxkIGRyaW4uLi4KKyNkZWZpbmUgR0VMREJPRVJTRV9NSVRfR0VMRCAiXG5nZWxkYm9lcnNlX21pdF9nZWxkIgorLy8gSUQgZnVlciBha3RpdmUgR2VsZGthcnRlCisjZGVmaW5lIFNFSEVSS0FSVEVJRF9BS1RJViAiXG5nZWxka2FydGVfYWt0aXYiCisKKyNlbmRpZgorCisjaWZkZWYgTkVFRF9QUk9UT1RZUEVTCisjaWZuZGVmIF9fTElCX01PTkVZX0hfUFJPVE9fXworI2RlZmluZSBfX0xJQl9NT05FWV9IX1BST1RPX18KKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5cy9tb3ZpbmcuaCBiL3N5cy9tb3ZpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjczYmNjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL21vdmluZy5oCkBAIC0wLDAgKzEsODMgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBtb3ZpbmcuaCAtLSBNZXRob2RlbiB1bmQgUnVlY2tnYWJld2VydGUgZnVlci92b24gbW92ZSgpCisvLyAgICAgICAgICAgICBEaWVzZXIgSGVhZGVyIHNvbGx0ZSBJTU1FUiBiZW51dHp0IHdlcmRlbiwgd2VubiBlaW4gT2JqZWt0CisvLyAgICAgICAgICAgICBtb3ZlKCkgYmVudXR6dCEKKy8vCisvLyAkSWQ6IG1vdmluZy5oIDg4MDEgMjAxNC0wNS0wNCAyMTozMDo1OVogWmVzc3RyYSAkCisKKyNpZm5kZWYgX01PVklOR18KKyNkZWZpbmUgX01PVklOR18KKworLy8gbGVpZGVyIG5pY2h0IHZpYSA8PiBtb2VnbGljaCwgZGEgZGllc2VzIEZpbGUgYmVudXR6dCB3aXJkLCBiZXZvciBkZXIgTWFzdGVyCisvLyBkZW4gSW5jbHVkZS1EaXItSG9vayBnZXNldHp0IGhhdC4KKyNpbmNsdWRlICIvc3lzL2xpdmluZy9tb3ZpbmcuaCIKKyNpbmNsdWRlICIvc3lzL3BsYXllci9tb3ZpbmcuaCIKKworLyoKKyAqIG1vdmluZy5oCisgKgorICogSG93IG9iamVjdHMgYXJlIG1vdmluZyBhcm91bmQgYW5kIHJlYXNvbnMgd2h5IHRoZXkgY2FudCBkbyBpdC4KKyAqLworCisvKiBNZXRob2RzIHRvIG1vdmUgb2JqZWN0cyAqLworI2RlZmluZSBNX0dPICAgICAgMSAgLyogd2Ugd2FsayBhcm91bmQgKi8KKyNkZWZpbmUgTV9UUE9SVCAxMjggIC8qIFdlIHRlbGVwb3J0IHRvIGFub3RoZXIgcGxhY2UgKi8KKyNkZWZpbmUgTV9OT0NIRUNLIDIgIC8qIGp1c3QgcGxhaW4gbW92ZSBpdCB3aXRob3V0IGFueSBjaGVja3MgKi8KKyNkZWZpbmUgTV9HRVQgICAgIDQgIC8qIG9iaiBnZWh0IHZvbiBub25saXZpbmcgenUgbGl2aW5nICovCisjZGVmaW5lIE1fUFVUICAgICA4ICAvKiBvYmogZ2VodCB2b24gbGl2aW5nIHp1IG5vbmxpdmluZyAqLworI2RlZmluZSBNX0dJVkUgICAxNiAgLyogb2JqIGdlaHQgdm9uIGxpdmluZyB6dSBsaXZpbmcgKi8KKyNkZWZpbmUgTV9TSUxFTlQgMzIgIC8qIG9iaiBzb2xsIG9obmUgbWVsZHVuZyBhdXNnZXpvZ2VuIHdlcmRlbiAqLworI2RlZmluZSBNX05PX0FUVEFDSyA1MTIgLyogS2VpbiBCZWdydWVzc3VuZ3NzY2hsYWcgKi8KKyNkZWZpbmUgTV9OT19TSE9XIDI1NiAvKiBaZWlnZSBuaWNodCBkaWUgUm9vbS1EZXNjciBiZWltIGFua29tbWVuICovCisKKy8qIEhpZXIgZm9sZ3Qgbm9jaCB3YXMgZnVlciBkaWUgVW5pdCAqLworI2RlZmluZSBNX01PVkVfQUxMIDMyCisKKy8qIEVycm9ycyB3aGVuIG1vdmluZyB0aGluZ3MgKi8KKyNkZWZpbmUgTU9WRV9PSyAgICAgICAgICAgICAgICAgICAxIC8vIGdhciBrZWluIEZlaGxlci4gOy0pCisvKiBIZXksIEknbSBhIHBsYXllciBhbmQgY2FudCBiZSBzaW1wbHkgY2FycmllZCBhd2F5ICovCisjZGVmaW5lIE1FX1BMQVlFUiAJICAgICAgICAgLTEKKy8qIENhbnQgbW92ZSBpbnRvIGNvbnRhaW5lciBiZWNhdXNlIEknbSB0b28gaGVhdnkgKi8KKyNkZWZpbmUgTUVfVE9PX0hFQVZZICAgICAgICAgICAgIC0yCisjZGVmaW5lIE1FX0NBTlRfVFBPUlRfSU4gICAgICAgICAtMyAvKiBDYW50IHRlbGVwb3J0IHRoZXJlICEgKi8KKyNkZWZpbmUgTUVfQ0FOVF9UUE9SVF9PVVQgICAgICAgIC00IC8qIENhbnQgdGVsZXBvcnQgZnJvbSBoZXJlICEgKi8KKyNkZWZpbmUgTUVfQ0FOVF9CRV9EUk9QUEVEICAgICAgIC01IC8qIFlvdSBjYW50IGRyb3AgdGhlIGZlZWwuLi4gdGhpcyB0aGluZyAqLworI2RlZmluZSBNRV9DQU5UX0JFX1RBS0VOICAgICAgICAgLTYgLyogTm9wZSwgeW91IGNhbm5vdCB0YWtlIG1lICovCisjZGVmaW5lIE1FX0NBTlRfQkVfSU5TRVJURUQgICAgICAtNyAvKiBDb250YWluZXIgcHJldmVudHMgbWUgZnJvbSBpbnNlcnRpbmcgKi8KKyNkZWZpbmUgTUVfQ0FOVF9MRUFWRV9FTlYgICAgICAgIC04IC8qIENvbnRhaW5lciBwcmV2ZW50cyBtZSBmcm9tIGxlYXZpbmcgKi8KKy8qIENhbid0IG1vdmUgaW50byBjb250YWluZXIsIGl0cyBFbnYgd291bGQgZ2V0IHRvbyBoZWF2eSAqLworI2RlZmluZSBNRV9UT09fSEVBVllfRk9SX0VOViAgICAgLTkKKyNkZWZpbmUgVE9PX01BTllfT0JKRUNUUyAgICAgICAgIC0xMCAvKiB0b28gbWFueSBvYmplY3RzIGluIG5ldyBlbnZpcm9ubWVudCAqLworI2RlZmluZSBNRV9OT1RfQUxMT1dFRCAgICAgICAgICAgLTExIC8qIFNvcnJ5IC0gb2ZmIGxpbWl0cyBmb3IgcGxheWVycyAqLworLy8gT2JqZWN0IHdhcyBkZXN0cnVjdGVkIGR1cmluZyBtb3ZlL2luIGluaXQoKQorI2RlZmluZSBNRV9XQVNfREVTVFJVQ1RFRCAgICAgICAgLTEyCisvLyBvYmplY3QgaXRzZWxmIGRvZXMgbm90IHdhbnQgdG8gYmUgbW92ZWQgZm9yIHVuZGVmaW5lZCByZWFzb24KKyNkZWZpbmUgTUVfRE9OVF9XQU5UX1RPX0JFX01PVkVEIC0xMworCisvLyBjaGVjayBmb3IgdmFsaWQgbW92ZSBlcnJvciAtIG1haW5seSBmb3IgaW50ZXJuYWwgdXNlIQorI2RlZmluZSBBTExfTU9WRV9FUlJPUlMgKHtNRV9QTEFZRVIsTUVfVE9PX0hFQVZZLE1FX0NBTlRfVFBPUlRfSU4sXAorICAgICAgICAgICAgICAgICAgICAgICAgICBNRV9DQU5UX1RQT1JUX09VVCxNRV9DQU5UX0JFX0RST1BQRUQsXAorICAgICAgICAgICAgICAgICAgICAgICAgICBNRV9DQU5UX0JFX1RBS0VOLE1FX0NBTlRfQkVfSU5TRVJURUQsXAorICAgICAgICAgICAgICAgICAgICAgICAgICBNRV9DQU5UX0xFQVZFX0VOVixNRV9UT09fSEVBVllfRk9SX0VOVixcCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRPT19NQU5ZX09CSkVDVFMsTUVfTk9UX0FMTE9XRUQsXAorICAgICAgICAgICAgICAgICAgICAgICAgICBNRV9XQVNfREVTVFJVQ1RFRCxNRV9ET05UX1dBTlRfVE9fQkVfTU9WRUR9KQorI2RlZmluZSBWQUxJRF9NT1ZFX0VSUk9SKHgpIChtZW1iZXIoQUxMX01PVkVfRVJST1JTLHgpICE9IC0xKQorCisjZGVmaW5lIE5PX1RQT1JUIDEKKyNkZWZpbmUgTk9fVFBPUlRfSU4gMgorI2RlZmluZSBOT19UUE9SVF9PVVQgNAorCisvKiBBYmxlaG5yZWFrdGlvbmVuIHZvbiBOUENzICovCisjZGVmaW5lIFJFSkVDVF9MSUdIVF9NT0RJRklFUiAicmVqZWN0X2xpZ2h0X21vZGlmaWVyIgorI2RlZmluZSBSRUpFQ1RfRFJPUCAgICAgICAgICAgInJlamVjdF9kcm9wIgorI2RlZmluZSBSRUpFQ1RfR0lWRSAgICAgICAgICAgInJlamVjdF9naXZlIgorI2RlZmluZSBSRUpFQ1RfS0VFUCAgICAgICAgICAgInJlamVjdF9rZWVwIgorCisvKiBadWdyaWZmc21ldGhvZGVuIGZ1ZXIgZmluZF9vYnMgKi8KKworI2RlZmluZSBQVVRfR0VUX05PTkUgMHgwMAorI2RlZmluZSBQVVRfR0VUX1RBS0UgMHgwMQorI2RlZmluZSBQVVRfR0VUX0RST1AgMHgwMgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5cy9uZXdfc2tpbGxzLmggYi9zeXMvbmV3X3NraWxscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZjVjYmMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvbmV3X3NraWxscy5oCkBAIC0wLDAgKzEsNDE1IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gbmV3X3NraWxscy5oIC0tIEFsbGUgbm9ldGlnZW4gRGVmaW50aW9uZW4gZnVlciBTa2lsbHMgKEZhZWhpZ2tlaXRlbiksCisvLyAgICAgICAgICAgICAgICAgU3BlbGxzIChaYXViZXJzcHJ1ZWNoZSkgdW5kIEdpbGRlbi4KKy8vCisvLyAkSWQ6IG5ld19za2lsbHMuaCA4NjEwIDIwMTQtMDEtMDYgMjA6NTk6MTNaIFplc3N0cmEgJAorCisjaWZuZGVmIF9ORVdfU0tJTExTX0hfCisjZGVmaW5lIF9ORVdfU0tJTExTX0hfCisKKyNpbmNsdWRlIDxjb21iYXQuaD4KKyNpbmNsdWRlIDxsaXZpbmcvc2tpbGxfYXR0cmlidXRlcy5oPgorCisvLyA9PT09PSBBa3R1ZWxsZSBWZXJzaW9uIGRlciBTa2lsbHMgPT09PQorI2RlZmluZSBDVVJSRU5UX1NLSUxMX1ZFUlNJT04gICAgICAgMgorCisvLyA9PT09PSBBbGxnZW1laW5lIERlZmluZXM6ID09PT09CisKKyNkZWZpbmUgREVGQVVMVF9HVUlMRCAgICAgICAgICAgICAgICJhYmVudGV1cmVyIgorI2RlZmluZSBHVUlMRF9ESVIgICAgICAgICAgICAgICAgICAgIi9naWxkZW4vIgorI2RlZmluZSBHVUlMRF9TQVZFRklMRSAgICAgICAgICAgICAgIi9ldGMvZ2lsZGVubWFzdGVyIgorI2RlZmluZSBHVUlMRE1BU1RFUiAgICAgICAgICAgICAgICAgIi9zZWN1cmUvZ2lsZGVubWFzdGVyIgorI2RlZmluZSBTUEVMTEJPT0tfRElSICAgICAgICAgICAgICAgIi9zcGVsbGJvb2tzLyIKKworI2RlZmluZSBNQVhfQUJJTElUWSAgICAgICAgICAgICAgICAgMTAwMDAKKyNkZWZpbmUgTUFYX1NLSUxMRUFSTiAgICAgICAgICAgICAgIDIwMAorCisvLyA9PT09PSBNb2VnbGljaGUgUmVzdWx0YXRlIGVpbmUgU3BlbGxzOiA9PT09PQorCisjZGVmaW5lIEVSRk9MRyAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1JU1NFUkZPTEcgICAgICAgICAgICAgICAgICAtMQorI2RlZmluZSBBQkdFV0VIUlQgICAgICAgICAgICAgICAgICAgMgorCisvLyA9PT09PSBQcm9wZXJ0aWVzIGRlcyBHaWxkZW4tTWFzdGVyczogPT09PT0KKworI2RlZmluZSBQX1ZBTElEX0dVSUxEUyAgICAgICAgICAgICAgInZhbGlkX2d1aWxkcyIKKworLy8gPT09PT0gUHJvcGVydGllcyBkZXIgR2lsZGU6ID09PT09PQorCisjZGVmaW5lIFBfR1VJTERfU0tJTExTICAgICAgICAgICAgICAiZ3VpbGRfc2tpbGxzIgorI2RlZmluZSBQX0dVSUxEX1JFU1RSSUNUSU9OUyAgICAgICAgImd1aWxkX3Jlc3QiCisvL2JpdHRlIGRpZXNlcyBEZWZpbmUgYXVjaCBpbiAvc2N1cmUvbWFzdGVyL3VzZXJpbmZvLmMgYWVuZGVybi4uLgorI2RlZmluZSBQX0dVSUxEX0RFRkFVTFRfU1BFTExCT09LICAgImd1aWxkX3NiIgorI2RlZmluZSBQX0dVSUxEX01BTEVfVElUTEVTICAgICAgICAgImd1aWxkX21hbGVfdGl0bGVzIgorI2RlZmluZSBQX0dVSUxEX0ZFTUFMRV9USVRMRVMgICAgICAgImd1aWxkX2ZlbWFsZV90aXRsZXMiCisjZGVmaW5lIFBfR1VJTERfTEVWRUxTICAgICAgICAgICAgICAiZ3VpbGRfbGV2ZWxzIgorI2RlZmluZSBQX0dVSUxEX1BSRVBBUkVCTE9DSyAgICAgICAgImd1aWxkX3ByZXBhcmVibG9jayIKKyNkZWZpbmUgUF9HVUlMRF9ERUFDVElWQVRFX1NLSUxMUyAgICJndWlsZF9kZWFjdGl2YXRlX3NraWxscyIKKworLy8gPT09PT0gUHJvcGVydGllcyBkZXMgU3BlbGxib29rczogPT09PT0KKworI2RlZmluZSBQX1NCX1NQRUxMUyAgICAgICAgICAgICAgICAgInNiX3NwZWxscyIKKworLy8gPT09PT0gUHJvcGVydGllcyBkZXIgR2lsZGUgVU5EIGRlcyBTcGVsbGJvb2tzOiA9PT09PQorI2RlZmluZSBQX0dMT0JBTF9TS0lMTFBST1BTICAgICAgICAgInNtX2dsb2JhbCIKKworLy8gPT09PT0gUHJvcGVydGllcyBkZXMgU3BpZWxlcnM6ID09PT09CisKKy8vICNkZWZpbmUgUF9HVUlMRCAgICAgICAgICAgICAgICAgICAgICJndWlsZCIKKyNkZWZpbmUgUF9ERUZBVUxUX0dVSUxEICAgICAgICAgICAgICJkZWZhdWx0X2d1aWxkIgorI2RlZmluZSBQX0RFRkVOREVSUyAgICAgICAgICAgICAgICAgImRlZmVuZGVycyIKKyNkZWZpbmUgUF9HVUlMRF9MRVZFTCAgICAgICAgICAgICAgICJndWlsZF9sZXZlbCIKKyNkZWZpbmUgUF9HVUlMRF9SQVRJTkcgICAgICAgICAgICAgICJndWlsZF9yYXRpbmciCisjZGVmaW5lIFBfR1VJTERfVElUTEUgICAgICAgICAgICAgICAiZ3VpbGRfdGl0bGUiCisjZGVmaW5lIFBfU1VCR1VJTERfVElUTEUgICAgICAgICAgICAic3ViZ3VpbGRfdGl0bGUiCisjZGVmaW5lIFBfVklTSUJMRV9TVUJHVUlMRF9USVRMRSAgICAidmlzaWJsZV9zdWJndWlsZF90aXRsZSIKKyNkZWZpbmUgUF9NQUdJQ19SRVNJU1RBTkNFX09GRlNFVCAgICJtYWdfcmVzX29mZnNldCIKKyNkZWZpbmUgUF9ORVdTS0lMTFMgICAgICAgICAgICAgICAgICJuZXdza2lsbHMiCisjZGVmaW5lIFBfTkVYVF9TUEVMTF9USU1FICAgICAgICAgICAibmV4dF9zcGVsbCIKKyNkZWZpbmUgUF9QUkVQQVJFRF9TUEVMTCAgICAgICAgICAgICJwcmVwYXJlZF9zcGVsbCIKKyNkZWZpbmUgUF9UTVBfQVRUQUNLX0hPT0sgICAgICAgICAgICJhdHRhY2tfaG9vayIKKyNkZWZpbmUgUF9UTVBfQVRUQUNLX01PRCAgICAgICAgICAgICJhdHRhY2tfbW9kIgorI2RlZmluZSBQX1RNUF9ERUZFTkRfSE9PSyAgICAgICAgICAgImRlZmVuZF9ob29rIgorI2RlZmluZSBQX1RNUF9ESUVfSE9PSyAgICAgICAgICAgICAgImRpZV9ob29rIgorI2RlZmluZSBQX1RNUF9NT1ZFX0hPT0sgICAgICAgICAgICAgIm1vdmVfaG9vayIKKyNkZWZpbmUgUF9XRUFQT05fVEVBQ0hFUiAgICAgICAgICAgICJ3ZWFwb25fdGVhY2hlciIKKyNkZWZpbmUgUF9TS0lMTFNWRVJTSU9OICAgICAgICAgICAgICJwX2xpYl9za2lsbHN2ZXJzaW9uIgorCisvLyA9PT09PSBTdGFuZGFyZC1Ta2lsbHM6ID09PT09CisKKyNkZWZpbmUgRklHSFQoeCkgICAgICAgICAgICAgICAgICAgICgiRmlnaHRfIit4KQorI2RlZmluZSBTSE9PVCh4KSAgICAgICAgICAgICAgICAgICAgKCJTaG9vdF8iK3gpCisjZGVmaW5lIFNLX0JPT1pFICAgICAgICAgICAgICAgICAgICAiQm9vemUiCisjZGVmaW5lIFNLX0NBUlJZICAgICAgICAgICAgICAgICAgICAiQ2FycnlTa2lsbCIKKyNkZWZpbmUgU0tfQ0FTVElORyAgICAgICAgICAgICAgICAgICJDYXN0IgorI2RlZmluZSBTS19ERUZFTkRfT1RIRVIgICAgICAgICAgICAgIkRlZmVuZE90aGVyIgorI2RlZmluZSBTS19GSUdIVCAgICAgICAgICAgICAgICAgICAgIkZpZ2h0IgorI2RlZmluZSBTS19JTkZPUk1fREVGRU5EICAgICAgICAgICAgIkluZm9ybURlZmVuZCIKKyNkZWZpbmUgU0tfTUFHSUNfQVRUQUNLICAgICAgICAgICAgICJNYWdpY0F0dGFjayIKKyNkZWZpbmUgU0tfTUFHSUNfREVGRU5TRSAgICAgICAgICAgICJNYWdpY0RlZmVuc2UiCisjZGVmaW5lIFNLX05JR0hUVklTSU9OICAgICAgICAgICAgICAiTmlnaHR2aXNpb24iCisjZGVmaW5lIFNLX1NIT09UICAgICAgICAgICAgICAgICAgICAiU2hvb3QiCisjZGVmaW5lIFNLX1NQRUxMX0RFRkVORCAgICAgICAgICAgICAiU3BlbGxEZWZlbmQiCisjZGVmaW5lIFNLX1NXT1JERklHSFRJTkcgICAgICAgICAgICBGSUdIVChXVF9TV09SRCkKKyNkZWZpbmUgU0tfVFdPSEFOREVEICAgICAgICAgICAgICAgICJCaWhhbmQiCisjZGVmaW5lIFNLX1dFQVBPTkxFU1MgICAgICAgICAgICAgICBGSUdIVChXVF9IQU5EUykKKworLy8gPT09PT0gU2tpbGwgSW5mb3M6ID09PT09CisKKyNkZWZpbmUgRkFDVE9SKHgpICAgICAgICAgICAgICAgICAgICgiZmFjXyIreCkKKyNkZWZpbmUgT0ZGU0VUKHgpICAgICAgICAgICAgICAgICAgICgib2ZmXyIreCkKKworI2RlZmluZSBTSV9TS0lMTEZVTkMgICAgICAgICAgICAgICAgInNpX2Z1bmMiCisgIC8vIEZ1bmt0aW9uLCBkaWUgYXVmZ2VydWZlbiB3aXJkCisKKyNkZWZpbmUgU0lfQ0xPU1VSRSAgICAgICAgICAgICAgICAgICJzaV9jbG9zdXJlIgorICAvLyBOdXIgZnVlciBkZW4gaW50ZXJuZW4gR2VicmF1Y2gKKyAgLy8gKEdlc2Nod2luZGlna2VpdHNvcHRpbWllcnVuZykKKworI2RlZmluZSBTSV9TUEVMTEJPT0sgICAgICAgICAgICAgICAgInNpX3NwZWxsYm9vayIKKyAgLy8gU3BlbGxib29rLCBpbiBkZW0gZGVyIFNwZWxsCisgIC8vIHN0ZWh0CisKKyNkZWZpbmUgU0lfU1BFTExDT1NUICAgICAgICAgICAgICAgICJzaV9jb3N0IgorICAvLyBLb3N0ZW4gZGVzIFNwZWxscworCisjZGVmaW5lIFNJX1RJTUVfTVNHICAgICAgICAgICAgICAgICAidGltZV9tc2ciCisgIC8vIERpZSBNZWxkdW5nIHdpcmQgYW5zdGVsbGUgdm9uCisgIC8vICJEdSBiaXN0IG5vY2ggenUgZXJzY2hvZXBmdAorICAvLyAgdm9uIERlaW5lbSBsZXR6dGVuIFNwcnVjaC4iCisgIC8vIGF1c2dlZ2ViZW4uCisKKyNkZWZpbmUgU0lfU1BfTE9XX01TRyAgICAgICAgICAgICAgICJzcF9sb3dfbXNnIgorICAvLyBEaWUgTWVsZHVuZyB3aXJkIGFuc3RlbGxlIHZvbgorICAvLyAiRHUgaGFzdCB6dSB3ZW5pZyBaYXViZXJwdW5rdGUKKyAgLy8gIGZ1ZXIgZGllc2VuIFNwcnVjaC4iCisgIC8vIGF1c2dlZ2ViZW4uCisKKyNkZWZpbmUgU0lfUFJFUEFSRV9NU0cgICAgICAgICAgICAgICJzaV9wcmVwYXJlX21zZyIKKyNkZWZpbmUgU0lfUFJFUEFSRV9BQk9SVF9NU0cgICAgICAgICJzaV9wcmVwYXJlX2Fib3J0X21zZyIKKyNkZWZpbmUgU0lfUFJFUEFSRV9CVVNZX01TRyAgICAgICAgICJzaV9wcmVwYXJlX2J1c3lfbXNnIgorICAvLyBNZWxkdW5nZW4gZnVlciBTcHJ1Y2gtCisgIC8vIHZvcmJlcmVpdHVuZywgQWJicnVjaCB1bmQKKyAgLy8gc2Nob24gYmVzY2hhZWZ0aWd0CisKKyNkZWZpbmUgU0lfTk9NQUdJQyAgICAgICAgICAgICAgICAgICJzaV9ub21hZ2ljIgorICAvLyBQcm96ZW50d2VydCwgbWl0IGRlbSBQX05PTUFHSUMKKyAgLy8gdW1nYW5nZW4gd2VyZGVuIGthbm4KKworI2RlZmluZSBTSV9OT01BR0lDX01TRyAgICAgICAgICAgICAgInNpX25vbWFnaWNfbXNnIgorICAvLyBNZWxkdW5nLCBkaWUgQW5zdGVsbGUgdm9uCisgIC8vICJEZWluIFphdWJlcnNwcnVjaCB2ZXJwdWZmdAorICAvLyAgaW0gTmljaHRzIiBhdXNnZWdlYmVuIHdlcmRlbgorICAvLyBzb2xsLgorCisjZGVmaW5lIFNJX1NQRUxMRkFUSUdVRSAgICAgICAgICAgICAic2lfZmF0aWd1ZSIKKyAgLy8gRXJzY2hvZXBmdW5nIC0gWmVpdCwgaW4gZGVyCisgIC8vIGtlaW5lIHdlaXRlcmVuIFNwZWxscworICAvLyBhdWZnZXJ1ZmVuIHdlcmRlbiBrb2VubmVuCisjZGVmaW5lIFNJX1hfU1BFTExGQVRJR1VFICAgICAgICAgICAic3RkOnNpOnhmYXRpZ3VlIgorCisjZGVmaW5lIFNJX1NLSUxMTEVBUk4gICAgICAgICAgICAgICAic2lfbGVhcm4iCisgIC8vIExlcm5nZXNjaHdpbmRpZ2tlaXQgaW4gMC4wMSUKKyAgLy8gcHJvIEFfSU5ULzIKKworI2RlZmluZSBTSV9MRUFSTl9BVFRSSUJVVEUgICAgICAgICAgInNpX2xlYXJuX2F0dHJpYnV0ZSIKKyAgLy8gV2VubiBtYW4gbmljaHQgd2lsbCwgZGFzcyBtYW4gaW4gQWJoYWVuZ2lna2VpdCB2b24KKyAgLy8gSU5UIGxlcm50CisKKyNkZWZpbmUgU0lfTk9fTEVBUk4gICAgICAgICAgICAgICAgICJzaV9ub19sZWFybiIKKyAgLy8gV2VubiBtYW4gKHRlbXBvcmFlciEpIG5pY2h0IHdpbGwsIGRhc3MgZGllc2VyIFNraWxsIGdlbGVybnQgd2lyZC4KKyAgLy8gTXVzcyB2b24gZGVuIFNwZWxsYm9va3MgYmVhY2h0ZXQgd2VyZGVuLgorICAvLyBTb2xsdGUgbmllbWFscyBpbSBTcGllbGVyIGFiZ2VzcGVpY2hlcnQgd2VyZGVuLiBPZGVyIHBlcm1hbmVudCBpbgorICAvLyBHaWxkZS9TcGVsbGJvb2sgZ2VzZXR6dCBzZWluLiBTb25kZXJuIGltIExhdWZlIGVpbmVzciBOdXR6dW5nIGluIGRlciBqZXcuCisgIC8vIEtvcGllIHZvbiBzaW5mbyBnZXNldHp0IHdlcmRlbiwgZGllIGdlcmFkZSBnZW51dHp0IHdpcmQuCisKKyNkZWZpbmUgU0lfU0tJTExBQklMSVRZICAgICAgICAgICAgICJzaV9hYmlsIgorICAvLyBGYWVoaWdrZWl0LCBkaWVzZW4gU3BydWNoIHp1CisgIC8vIGJlbnV0emVuCisKKyNkZWZpbmUgU0lfU0tJTExBUkcgICAgICAgICAgICAgICAgICJzaV9hcmciCisgIC8vIEFyZ3VtZW50ZSwgZGllIHVlYmVyZ2ViZW4KKyAgLy8gd3VyZGVuCisKKyNkZWZpbmUgU0lfU0tJTExSRVNUUl9VU0UgICAgICAgICAgICJzaV9yZXN0cl91IgorICAvLyBCZXNjaHJhZW5rdW5nZW4gYmVpbSBHZWJyYXVjaAorCisjZGVmaW5lIFNJX1NLSUxMUkVTVFJfTEVBUk4gICAgICAgICAic2lfcmVzdHJfbCIKKyAgLy8gQmVzY2hyYWVua3VuZ2VuIGJlaW0gTGVybmVuCisKKyNkZWZpbmUgU0lfU0tJTExJTkZPICAgICAgICAgICAgICAgICJzaV9pbmZvIgorICAvLyBLdXJ6ZXIgSW5mb3JtYXRpb25zdGV4dAorCisjZGVmaW5lIFNJX1NLSUxMSU5GT19MT05HICAgICAgICAgICAic2lfaW5mb19sIgorICAvLyBMYW5nZXIgSW5mb3JtYXRpb25zdGV4dAorCisjZGVmaW5lIFNJX1NLSUxMREFNQUdFICAgICAgICAgICAgICAic2lfZGFtYWdlIgorICAvLyBTY2hhZGVuCisKKyNkZWZpbmUgU0lfU0tJTExEQU1BR0VfQllfUk9XICAgICAgICJzaV9kYW1hZ2VfYnlfcm93IgorICAvLyBTY2hhZGVuIGR1cmNoIFRlYW1yZWloZW4KKworI2RlZmluZSBTSV9TS0lMTERBTUFHRV9UWVBFICAgICAgICAgInNpX2RhbXR5cCIKKyAgLy8gQXJ0IGRlcyBTY2hhZGVucworCisjZGVmaW5lIFNJX1NLSUxMREFNQUdFX01TRyAgICAgICAgICAic2lfZGFtbXNnIgorICAvLyBNZWxkdW5nIGRpZSBhbnN0ZWxsZSBlaW5lcgorICAvLyBXYWZmZSBrb21tZW4gc29sbAorCisjZGVmaW5lIFNJX1NLSUxMREFNQUdFX01TRzIgICAgICAgICAic2lfZGFtbXNnMiIKKyAgLy8gZGl0byBmdWVyIGRlbiBUZXh0IGZ1ZXIKKyAgLy8gYW5kZXJlIGltIFJhdW0KKworI2RlZmluZSBTSV9TUEVMTCAgICAgICAgICAgICAgICAgICAgInNpX3NwZWxsIgorICAvLyBTcGVsbCwgbWl0IGRlbSBhbmdlZ3JpZmZlbgorICAvLyB3dXJkZQorCisjZGVmaW5lIFNJX0NPTExBVEVSQUxfREFNQUdFICAgICAgICAic2lfY29sbGF0ZXJhbF9kYW1hZ2UiCisgIC8vIFNjaGFkZW5zYW50ZWlsIGJlaSBGbGFlY2hlbi0KKyAgLy8gc3BlbGxzLCBkZW4gRnJldW5kZSBhYmJla29tbWVuLAorICAvLyBpbiBQcm96ZW50CisKKyNkZWZpbmUgU0lfTlVNQkVSX0VORU1JRVMgICAgICAgICAgICJzaV9udW1fZW5lbWllcyIKKyAgLy8gQW56YWhsIEZlaW5kZSBiZWkKKyAgLy8gRmxhZWNoZW5zcHJ1Y2gKKworI2RlZmluZSBTSV9OVU1CRVJfRlJJRU5EUyAgICAgICAgICAgInNpX251bV9mcmllbmRzIgorICAvLyBBbnphaGwgRnJldW5kZSBiZWkKKyAgLy8gRmxhZWNoZW5zcHJ1Y2gKKworI2RlZmluZSBTSV9ESVNUQU5DRSAgICAgICAgICAgICAgICAgInNpX2Rpc3RhbmNlIgorICAvLyBFbnRmZXJudW5nCisKKyNkZWZpbmUgU0lfV0lEVEggICAgICAgICAgICAgICAgICAgICJzaV93aWR0aCIKKyAgLy8gQnJlaXRlIGRlcyBGbGFlY2hlbmFuZ3JpZmZzCisKKyNkZWZpbmUgU0lfREVQVEggICAgICAgICAgICAgICAgICAgICJzaV9kZXB0aCIKKyAgLy8gVGllZmUgZGVzIEZsYWVjaGVuYW5ncmlmZnMKKworI2RlZmluZSBTSV9JTkhFUklUICAgICAgICAgICAgICAgICAgInNpX2luaGVyaXQiCisgIC8vIFNraWxsLCB2b24gZGVtIGV0d2FzCisgIC8vIHVlYmVybm9tbWVuIHdlcmRlbiBzb2xsCisKKyNkZWZpbmUgU0lfRElGRklDVUxUWSAgICAgICAgICAgICAgICJzaV9kaWZmaWN1bHR5IgorICAvLyBXZXJ0LCBkZXIgZGllIE9iZXJncmVuemUgZGVyCisgIC8vIEZhZWhpZ2tlaXQgYWJncmVuenQKKworI2RlZmluZSBTSV9MQVNUTElHSFQgICAgICAgICAgICAgICAgInNpX2xhc3RsaWdodCIKKyAgLy8gRnVlciBOYWNodHNpY2h0OiBXYW5uIGhhdAorICAvLyBkZXIgU3BpZWxlciB6dW0gbGV0enRlbiBtYWwKKyAgLy8gTGljaHQgZ2VzZWhlbi4KKworI2RlZmluZSBTSV9TS0lMTEhFQUwgICAgICAgICAgICAgICAgInNpX2hlYWwiCisgIC8vIEhlaWx1bmcKKworI2RlZmluZSBTSV9VU1IgICAgICAgICAgICAgICAgICAgICAgInNpX3VzciIKKyAgLy8gc2VsYnN0IGRlZmluaWVydGUgSW5mb3MKKworI2RlZmluZSBTSV9URVNURkxBRyAgICAgICAgICAgICAgICAgInNpX3Rlc3RmbGFnIgorICAvLyBUZXN0ZmxhZworCisjZGVmaW5lIFNJX0dVSUxEICAgICAgICAgICAgICAgICAgICAic2lfZ3VpbGQiCisgIC8vIEdpbGRlLCBmYWxscyBBdXN3YWhsIGF1cworICAvLyBtZWhyZXJlbiBtb2VnbGljaAorCisjZGVmaW5lIFNJX0VORU1ZICAgICAgICAgICAgICAgICAgICAic2lfZW5lbXkiCisgIC8vIEZlaW5kIGJlaSBLYW1wZnNwcnVlY2hlbgorCisjZGVmaW5lIFNJX0ZSSUVORCAgICAgICAgICAgICAgICAgICAic2lfZnJpZW5kIgorICAvLyBEZXIgenUgdmVydGVpZGlnZW5kZSBGcmV1bmQKKyAgLy8gYmVpIERlZmVuZE90aGVyIHVuZAorICAvLyBJbmZvcm1EZWZlbmQKKworI2RlZmluZSBTSV9NQUdJQ19UWVBFICAgICAgICAgICAgICAgInNpX21hZ2ljX3R5cGUiCisgIC8vIFZvbiB3YXMgZnVlciBlaW5lciBBcnQgaXN0CisgIC8vIGRpZSBNYWdpZSAocy51LikKKworI2RlZmluZSBTSV9QUkVQQVJFX1RJTUUgICAgICAgICAgICAgInNpX3ByZXBhcmVfdGltZSIKKyAgLy8gWmVpdCBkaWUgenVyIFZvcmJlcmVpdHVuZworICAvLyBiZW5vZXRpZ3Qgd2lyZC4KKworI2RlZmluZSBTSV9BVFRBQ0tfQlVTWV9NU0cgICAgICAgICAgInNpX2F0dGFja19idXN5X21zZyIKKyAgLy8gTWVsZHVuZywgd2VubiBkZXIgU3BpZWxlciB6dQorICAvLyBiZXNjaGFlZnRpZ3QgaXN0CisKKyNkZWZpbmUgU0lfTk9fQVRUQUNLX0JVU1kgICAgICAgICAgICJzaV9ub19hdHRhY2tfYnVzeSIKKyAgLy8gV2VubiBkZXIgU3BlbGwgbmljaHQgYWxzCisgIC8vIFRhZXRpZ2tlaXQgemFlaGxlbi9nZXphZWhsdAorICAvLyB3ZXJkZW4gc29sbCwga2FubiBtYW4gaGllcgorICAvLyBOT19BVFRBQ0tfQlVTWVtfU0VUfF9RVUVSWV0KKyAgLy8gKHMudS4pIHNldHplbgorCisjZGVmaW5lIFNJX0FUVEFDS19CVVNZX0FNT1VOVCAgICAgICAic2lfYXR0YWNrX2J1c3lfYW1vdW50IgorICAvLyBEZXIgU3BlbGwgaGF0IGVpbiBnZXdpc3NlcworICAvLyBBdHRhY2tCdXN5LCBhYmVyIGRhcyB3ZWljaHQKKyAgLy8gdm9tIFN0YW5kYXJkd2VydCAxIGFiLiBEZXIKKyAgLy8gV2VydCBrYW5uIGhpZXIgZ2VzZXR6dAorICAvLyB3ZXJkZW4uCisKKyNkZWZpbmUgU0lfTEFTVF9VU0UgICAgICAgICAgICAgICAgICJzaV9sYXN0X3VzZSIKKyAgLy8gTGV0enRlIGJlbnV0enVuZyBlaW5lcworICAvLyBTa2lsbHMgKGZ1ZXIgUmFzc2Vuc2tpbGxzKQorCisjZGVmaW5lIFNJX0xFQVJOX1BST0IgICAgICAgICAgICAgICAic2lfbGVhcm5fcHJvYiIKKyAgLy8gTGVybndhaHJzY2hlaW5saWNoa2VpdAorICAvLyAoZnVlciBSYXNzZW5za2lsbHMpCisKKyNkZWZpbmUgU0lfU0tJTExEVVJBVElPTiAgICAgICAgICAgICJzaV9kdXJhdGlvbiIKKyAgLy8gV2llIHNvbGwgd2lyZCBkZXIgU2tpbGwgYW5oYWx0ZW4/CisgIC8vIChmdWVyIFNwZWxscyBtaXQgZWluZXIgRGF1ZXIpCisKKy8vID09PT09IFBhcmFtZXRlciBmdWVyIFNwZWxsLU1hcHBpbmc6ID09PT09CisKKyNkZWZpbmUgU1BfTkFNRSAgICAgICAgICAgICAgICAgICAgICJzcF9uYW1lIgorICAvLyBOYW1lIGRlcyBTcGVsbHMKKworI2RlZmluZSBTUF9TSE9XX0RBTUFHRSAgICAgICAgICAgICAgInNwX3Nob3dkYW1hZ2UiCisgIC8vIFRyZWZmZXJtZWxkdW5nIHNvbGwgZ2V6ZWlndAorICAvLyB3ZXJkZW4uCisKKyNkZWZpbmUgU1BfUkVEVUNFX0FSTU9VUiAgICAgICAgICAgICJzcF9yZWR1Y2VfYWMiCisgIC8vIEFDIHNvbGwgVHlwYWJoYWVuZ2lnCisgIC8vIHJlZHV6aWVydCB3ZXJkZW4uCisKKyNkZWZpbmUgU1BfUEhZU0lDQUxfQVRUQUNLICAgICAgICAgICJzcF9waHlzaWNhbCIKKyAgLy8gS29lcnBlcmxpY2hlciBBbmdyaWZmCisKKyNkZWZpbmUgU1BfUkVDVVJTSVZFICAgICAgICAgICAgICAgICJzcF9yZWN1cnNpdmUiCisgIC8vIFJla3Vyc2lvbmVuCisKKyNkZWZpbmUgU1BfTk9fRU5FTVkgICAgICAgICAgICAgICAgICJub19lbmVteSIKKyAgLy8gSXN0IGtlaW4gcmljaHRpZ2VyIEFuZ3JpZmYKKworI2RlZmluZSBTUF9OT19BQ1RJVkVfREVGRU5TRSAgICAgICAgInNwX25vX2FjdGl2ZV9kZWZlbnNlIgorICAvLyBFcyBpc3Qga2VpbmUgYWt0aXZlIEFid2VociBlcnd1ZW5zY2h0CisKKyNkZWZpbmUgU1BfR0xPQkFMX0FUVEFDSyAgICAgICAgICAgICJzcF9nbG9iYWxfYXR0YWNrIgorICAvLyBJc3QgRmxhZWNoZW5hbmdyaWZmCisKKy8vID09PT09IFNraWxsIFJlc3RyaWN0aW9uczogPT09PT0KKworI2RlZmluZSBTUl9GVU4gICAgICAgICAgICAgICAgICAgICAgInJlc3RyX2Z1biIKKyAgLy8gRnVua3Rpb24sIGRpZSB3ZWl0ZXJlCisgIC8vIEVpbnNjaHJhZW5rdW5nZW4gcHJ1ZWZ0CisKKyNkZWZpbmUgU1JfRVhDTFVERV9SQUNFICAgICAgICAgICAgICJyZXN0cl9yYWNlX2V4IgorICAvLyBBdXNnZXNjaGxvc3NlbmUgUmFzc2VuCisKKyNkZWZpbmUgU1JfSU5DTFVERV9SQUNFICAgICAgICAgICAgICJyZXN0cl9yYWNlX2luIgorICAvLyBFaW5nZXNjaGxvc3NlbmUgUmFzc2VuCisKKyNkZWZpbmUgU1JfRVhDTFVERV9HVUlMRCAgICAgICAgICAgICJyZXN0cl9ndWlsZF9leCIKKyAgLy8gQXVzZ2VzY2hsb3NzZW5lIEdpbGRlbgorCisjZGVmaW5lIFNSX0lOQ0xVREVfR1VJTEQgICAgICAgICAgICAicmVzdHJfZ3VpbGRfaW4iCisgIC8vIEVpbmdlc2NobG9zc2VuZSBHaWxkZW4KKworI2RlZmluZSBTUl9HT09EICAgICAgICAgICAgICAgICAgICAgInJlc3RyX2dvb2QiCisgIC8vIEFsaWduIDwKKworI2RlZmluZSBTUl9CQUQgICAgICAgICAgICAgICAgICAgICAgInJlc3RyX2JhZCIKKyAgLy8gQWxpZ24gPgorCisjZGVmaW5lIFNSX0ZSRUVfSEFORFMgICAgICAgICAgICAgICAicmVzdHJfaGFuZHMiCisgIC8vIEJlbm9ldGlndGUgZnJlaWUgSGFlbmRlCisKKyNkZWZpbmUgU1JfU0VFUiAgICAgICAgICAgICAgICAgICAgICJyZXN0cl9zZWVyIgorICAvLyBNdXNzIFNlaGVyIHNlaW4KKworI2RlZmluZSBTUl9NSU5fU0laRSAgICAgICAgICAgICAgICAgIm1pbl9zaXplIgorICAvLyBNaW5kZXN0Z3JvZXNzZQorCisjZGVmaW5lIFNSX01BWF9TSVpFICAgICAgICAgICAgICAgICAibWF4X3NpemUiCisgIC8vIE1heGltYWxncm9lc3NlCisKKyNkZWZpbmUgU1JfUFJPUCAgICAgICAgICAgICAgICAgICAgICJyZXN0cl9wcm9wZXJ0aWVzIgorICAvLyBXZXJ0ZSBiZWxpZWJpZ2VyIFByb3BlcnRpZXMKKworI2RlZmluZSBTUl9RVUVTVCAgICAgICAgICAgICAgICAgICAgInJlc3RyX3F1ZXN0cyIKKyAgLy8gUXVlc3QgYmVzdGFuZGVuCisKKyNkZWZpbmUgU1JfTUlOSVFVRVNUICAgICAgICAgICAgICAgICJyZXN0cl9taW5pcXVlc3RzIgorICAvLyBNaW5pcXVlc3QgZ2Vsb2VzdAorCisvLyA9PT09PSBTa2lsbCBNb2RpZmllcjogPT09PT0KKworI2RlZmluZSBTTV9SQUNFICAgICAgICAgICAgICAgICAgICAgIm1vZGlmeV9yYWNlIgorICAvLyBSYXNzZW5zcGV6aWZpc2NoZQorICAvLyBCZXNvbmRlcmhlaXRlbgorCisvLyA9PT09PSBGdWVyIGRhcyBBdHRhY2stQnVzeS1IYW5kbGluZzogPT09PT0KKworI2RlZmluZSBOT19BVFRBQ0tfQlVTWV9TRVQgICAgICAgICAgMHgwMDEKKyNkZWZpbmUgTk9fQVRUQUNLX0JVU1lfUVVFUlkgICAgICAgIDB4MDAyCisjZGVmaW5lIE5PX0FUVEFDS19CVVNZICAgICAgICAgICAgICAweDAwMworCisvLyA9PT09PSBNYWdpZS1BcnRlbjogPT09PT0KKworI2RlZmluZSBNVF9BTkdSSUZGICAgICAgICAgICAgICAgICAgIm10X2FuZ3JpZmYiCisjZGVmaW5lIE1UX0JFSEVSUlNDSFVORyAgICAgICAgICAgICAibXRfYmVoZXJyc2NodW5nIgorI2RlZmluZSBNVF9CRVNDSFdPRVJVTkcgICAgICAgICAgICAgIm10X2Jlc2Nod29lcnVuZyIKKyNkZWZpbmUgTVRfQkVXRUdVTkcgICAgICAgICAgICAgICAgICJtdF9iZXdlZ3VuZyIKKyNkZWZpbmUgTVRfQ1JFQVRJT04gICAgICAgICAgICAgICAgICJtdF9jcmVhdGlvbiIKKyNkZWZpbmUgTVRfSEVJTFVORyAgICAgICAgICAgICAgICAgICJtdF9oZWlsdW5nIgorI2RlZmluZSBNVF9IRUxMU0lDSFQgICAgICAgICAgICAgICAgIm10X2hlbGxzaWNodCIKKyNkZWZpbmUgTVRfSUxMVVNJT04gICAgICAgICAgICAgICAgICJtdF9pbGx1c2lvbiIKKyNkZWZpbmUgTVRfUFNZQ0hPICAgICAgICAgICAgICAgICAgICJtdF9wc3ljaG8iCisjZGVmaW5lIE1UX1NBS1JBTCAgICAgICAgICAgICAgICAgICAibXRfc2FrcmFsIgorI2RlZmluZSBNVF9TQ0hVVFogICAgICAgICAgICAgICAgICAgIm10X3NjaHV0eiIKKyNkZWZpbmUgTVRfVkVSV0FORExVTkcgICAgICAgICAgICAgICJtdF92ZXJ3YW5kbHVuZyIKKworI2RlZmluZSBNVF9NSVNDICAgICAgICAgICAgICAgICAgICAgIm10X21pc2MiCisKKy8vID09PT09IERlZmluZXMgZnVlciBGaW5kR3JvdXAoKSA9PT09PQorCisjZGVmaW5lIEZHX0VORU1JRVMgICAgICAgICAgICAgICAgICAtMQorI2RlZmluZSBGR19GUklFTkRTICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBGR19BTEwgICAgICAgICAgICAgICAgICAgICAgMAorCisvLyA9PT09PT09PSBPQlNPTEVURSBQcm9wZXJ0aWVzIC8gRGVmaW5lcyA9PT09PT09PT09PT09CisvLyBQcm9wIHdpcmQgbmljaHQgbWVociBnZW51dHp0LCBpc3QgYWJlciBub2NoIGZ1ZXIgL3N0ZC9wbGF5ZXIvYmFzZS5jIG5vZXRpZywKKy8vIHVtIGRlbiBTQVZFLVN0YXR1cyBpbiBkZW4gU3BpZWxlci1Qcm9wcyB6dSBsb2VzY2hlbi4KKyNkZWZpbmUgUF9HVUlMRF9QUkVWRU5UU19SQUNFU0tJTEwgICJndWlsZF9wcmV2ZW50c19yYWNlc2tpbGwiCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzL25ld3MuaCBiL3N5cy9uZXdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgwODVhMQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9uZXdzLmgKQEAgLTAsMCArMSwzNiBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIG5ld3MuaCAtLSBEZWZpbml0aW9uZW4gZnVlciBkaWUgWmVpdHVuZworLy8KKy8vICRJZDogbmV3cy5oIDg4MDkgMjAxNC0wNS0wOCAxOTo1Mjo0OFogWmVzc3RyYSAkCisKKyNkZWZpbmUgR19OQU1FIDAKKyNkZWZpbmUgR19PV05FUiAxCisjZGVmaW5lIEdfU0FWRUZJTEUgMgorI2RlZmluZSBHX0VYUElSRSAzCisjZGVmaW5lIEdfREVMRVRFUlMgNCAKKyNkZWZpbmUgR19XUklURVJTIDUKKyNkZWZpbmUgR19SRUFERVJTIDYKKyNkZWZpbmUgR19ETEVWRUwgNworI2RlZmluZSBHX1dMRVZFTCA4CisjZGVmaW5lIEdfUkxFVkVMIDkKKyNkZWZpbmUgR19NQVhfTVNHIDEwCisjaWZkZWYgVEVTVElORworI2RlZmluZSBHX01BWF9OVU0gMTEKKyNkZWZpbmUgR19NRVNTQUdFUyAxMgorI2Vsc2UKKyNkZWZpbmUgR19NRVNTQUdFUyAxMQorI2VuZGlmCisKKyNkZWZpbmUgTV9CT0FSRCAwCisjZGVmaW5lIE1fV1JJVEVSIDEKKyNkZWZpbmUgTV9JRCAyCisjZGVmaW5lIE1fVElNRSAzCisjZGVmaW5lIE1fVElUTEUgNAorI2RlZmluZSBNX01FU1NBR0UgNQorCitzdGF0aWMgc3RyaW5nIHVzZXJfZXVpZCgpOworc3RhdGljIHZvaWQgc2F2ZV9ncm91cF9saXN0KCk7CitzdGF0aWMgdm9pZCBzYXZlX2dyb3VwKHN0cmluZyBncnAsbWl4ZWQgZ3JvdXApOworc3RhdGljIG1peGVkIGxvYWRfZ3JvdXAoc3RyaW5nIG5hbWUpOworICAgICAgICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzL25vdGlmeV9mYWlsLmggYi9zeXMvbm90aWZ5X2ZhaWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2QxNzg2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL25vdGlmeV9mYWlsLmgKQEAgLTAsMCArMSwyMCBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIG5vdGlmeV9mYWlsaCAtLSBzeW0uIEtvbnN0YW50ZW4gZnVlciBub3RpZnlfZmFpbCgpCisvLworLy8gJElkOiBkZWZpbmVzLmggNjQxNSAyMDA3LTA4LTEwIDE5OjI0OjA0WiBaZXNzdHJhICQKKworI2lmbmRlZiBfTk9USUZZX0ZBSUxfSF8KKyNkZWZpbmUgX05PVElGWV9GQUlMX0hfCisKKy8vIFByaW9yaXRhZXRlbiAvICdOaWNlIGxldmVscycgdm9uIG5vdGlmeV9mYWlsKClzOgorLy8gV2llICduaWNlJyBiaW4gaWNoPyBKZSBncm9lc3NlcmUgWmFobC9Qcmlvcml05HQsIGRlc3RvIHdlbmlnIGxpZWIuIDstKQorI2RlZmluZSBORl9OTF9OT05FICAgLTEgICAvL21heCAnbmljZW5lc3MnLCB3aXJkIHZvbiBhbGxlbSB1ZWJlcnNjaHJpZWJlbgorI2RlZmluZSBORl9OTF9PV04gICAgMTAwICAvL2VpZ2VuZXMgT2JqZWt0IChzb3VsIHZlcmJlbikgdWViZXJzY2hyZWliZW4ga2F1bSB3YXMKKyNkZWZpbmUgTkZfTkxfVEhJTkcgIDEwMDAwMAorI2RlZmluZSBORl9OTF9ST09NICAgMTAwMDAwMCAvLyBSYWV1bWUgdWViZXJzY2hyZWliZW4gc29uc3RpZ2VuIEtyYW1zCisjZGVmaW5lIE5GX05MX0xJVklORyAxMDAwMDAwMCAvLyBMZWJld2VzZW4gdWViZXJzY2hyZWliZW4gYXVjaCBSYWV1bWUKKyNkZWZpbmUgTkZfTkxfTUFYICAgIF9fSU5UX01BWF9fIC8vaG9lY2hzdGUgUHJpb3JpdGFldCwgdWViZXJzY2hyZWlidCBhbGxlcworCisjZW5kaWYgLyogX05PVElGWV9GQUlMX0hfICovCisKZGlmZiAtLWdpdCBhL3N5cy9ucGMuaCBiL3N5cy9ucGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTY1OTMwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL25wYy5oCkBAIC0wLDAgKzEsNjAgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBucGMuaCAtLSBEZWZpbml0b25lbiBmdWVyIE5QQ3MKKy8vCisvLyAkSWQ6IG5wYy5oIDY3MDkgMjAwOC0wMi0wMiAyMjoxNDowOFogWmVzc3RyYSAkCisKKyNpZm5kZWYgX05QQ19IXworI2RlZmluZSBfTlBDX0hfCisKKyNkZWZpbmUgREVGQVVMVF9JTkZPICJcbmRlZmF1bHQgaW5mbyIKKyNkZWZpbmUgREVGQVVMVF9OT0lORk8gIlxuZGVmYXVsdCBub2luZm8iCisjZGVmaW5lIFBfUFJFX0lORk8gICAgICAgICAgICJucGNfcHJlX2luZm8iCisjZGVmaW5lIFBfTlBDX0lORk8gICAgICAgICAgICJucGNfaW5mbyIKKworI2RlZmluZSBQX05QQyAgICAgICAgICAgICAgICAiaXNfbnBjIgorCisjZGVmaW5lIFBfSEIgICAgICAgICAgICAgICAgICJoYiIKKyNkZWZpbmUgUF9JTkZPICAgICAgICAgICAgICAgImluZm8iCisKKyNkZWZpbmUgUF9BR0dSRVNTSVZFICAgICAgICAgImFnZ3Jlc3NpdmUiCisKKyNkZWZpbmUgUF9TUEVMTFMgICAgICAgICAgICAgInNwZWxscyIKKyNkZWZpbmUgUF9TUEVMTFJBVEUgICAgICAgICAgInNwZWxscmF0ZSIKKworI2RlZmluZSBQX0NIQVRTICAgICAgICAgICAgICAiY2hhdHMiCisjZGVmaW5lIFBfQ0hBVF9DSEFOQ0UgICAgICAgICJjaGF0X2NoYW5jZSIKKyNkZWZpbmUgUF9BQ0hBVFMgICAgICAgICAgICAgImFjaGF0cyIKKyNkZWZpbmUgUF9BQ0hBVF9DSEFOQ0UgICAgICAgImFjaGF0X2NoYW5jZSIKKworI2RlZmluZSBQX1JFSkVDVCAgICAgICAgICAgICAicmVqZWN0IgorCisjZGVmaW5lIFBfREVGQVVMVF9JTkZPICAgICAgICJkZWZhdWx0X2luZm8iIC8vIFN0YW5kYXJkYW50d29ydCBmdWVyIEZyYWdlbgorI2RlZmluZSBQX0xPR19JTkZPICAgICAgICAgICAibG9nX2luZm8iCisKKyNkZWZpbmUgQ0xPTkVfTkVXICAgMHgxMDAwMDAwMCAgLyogVkVSQUxURVQhICovCisjZGVmaW5lIENMT05FX1dFQVIgIDB4MjAwMDAwMDAgIC8qIGFuemllaGVuICovCisjZGVmaW5lIENMT05FX1dJRUxEIDB4NDAwMDAwMDAgIC8qIHp1ZWNrZW4gKi8KKyNkZWZpbmUgQ0xPTkVfTk9fQ0hFQ0sgMHgwODAwMDAwMCAgLyogenVlY2tlbiBvZGVyIGFuemllaGVuIG9obmUgY2hlY2tzICovCisKKyNkZWZpbmUgTlBDX05FRURTX0lURU1fSU5JVCAibnBjOm5lZWQgaXRlbSBpbml0IgorCisjZW5kaWYKKworI2lmZGVmIE5FRURfUFJPVE9UWVBFUworI2lmbmRlZiBfTlBDX0hfUFJPVE9UWVBFU18KKyNkZWZpbmUgX05QQ19IX1BST1RPVFlQRVNfCisvLyBhdXMgbnBjL2luZm8uYworcHVibGljIHZhcmFyZ3Mgdm9pZCAgICBBZGRJbmZvKG1peGVkIGtleSwgbWl4ZWQgaW5mbywgc3RyaW5nIGluZGVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZWQgc2lsZW50LCBtaXhlZCBjYXNlYmFzZWQpOworcHVibGljIHZhcmFyZ3Mgdm9pZCAgICBBZGRTcGVjaWFsSW5mbyhtaXhlZCBrZXlzLCBzdHJpbmcgZnVuY3Rpb25uYW1lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGluZGVudCwgbWl4ZWQgc2lsZW50LCBtaXhlZCBjYXNlYmFzZWQgKTsKK3B1YmxpYyBpbnQgICAgICAgICAgICAgZnJhZ2Uoc3RyaW5nIHN0cik7CitwdWJsaWMgaW50ICAgICAgICAgICAgIGRvX2ZyYWdlKHN0cmluZyB0ZXh0KTsKK3B1YmxpYyB2b2lkICAgICAgICAgICAgUmVtb3ZlSW5mbyggc3RyaW5nIGtleSApOworcHVibGljIHZhcmFyZ3MgbWl4ZWQgICBHZXRJbmZvKHN0cmluZyBzdHIpOworLy8gYXVzIG5wYy9pdGVtcy5jCitwdWJsaWMgdmFyYXJncyBvYmplY3QgIEFkZEl0ZW0obWl4ZWQgZmlsZW5hbWUsIGludCByZWZyZXNoLCBtaXhlZCBwcm9wcyk7CisjZW5kaWYgLy8gX05QQ19IX1BST1RPVFlQRVNfCisjZW5kaWYgLy8gTkVFRF9QUk9UT1RZUEVTCisKZGlmZiAtLWdpdCBhL3N5cy9vYmplY3RfaW5mby5oIGIvc3lzL29iamVjdF9pbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU3ODc0NwotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9vYmplY3RfaW5mby5oCkBAIC0wLDAgKzEsNzAgQEAKKyNpZm5kZWYgTFBDX09CSkVDVF9JTkZPX0hfCisjZGVmaW5lIExQQ19PQkpFQ1RfSU5GT19IXworCisvKiBEZWZpbml0aW9uIG9mIGFyZ3VtZW50IHZhbHVlcyBmb3Igb2JqZWN0X2luZm8oKQorICovCisKKyNpbmNsdWRlICJjb25maWd1cmF0aW9uLmgiCisKKy8qIE9iamVjdCBmbGFncyAqLworI2RlZmluZSBPSV9PTkNFX0lOVEVSQUNUSVZFICAgICAgICAgICAgIC0xCisjZGVmaW5lIE9JX1JFU0VUX1NUQVRFICAgICAgICAgICAgICAgICAgLTIKKyNkZWZpbmUgT0lfV0lMTF9DTEVBTl9VUCAgICAgICAgICAgICAgICAtMworI2RlZmluZSBPSV9MQU1CREFfUkVGRVJFTkNFRCAgICAgICAgICAgIC00CisjZGVmaW5lIE9JX1JFUExBQ0VEICAgICAgICAgICAgICAgICAgICAgLTUKKworLyogUHJvZ3JhbSBmbGFncyAqLworI2RlZmluZSBPSV9OT19JTkhFUklUICAgICAgICAgICAgICAgICAgIC0xMAorI2RlZmluZSBPSV9OT19DTE9ORSAgICAgICAgICAgICAgICAgICAgIC0xMQorI2RlZmluZSBPSV9OT19TSEFET1cgICAgICAgICAgICAgICAgICAgIC0xMgorI2RlZmluZSBPSV9TSEFSRV9WQVJJQUJMRVMgICAgICAgICAgICAgIC0xMworCisvKiBTd2FwcGluZyAqLworI2RlZmluZSBPSV9TV0FQUEVEICAgICAgICAgICAgICAgICAgICAgIC0yMAorI2RlZmluZSBPSV9QUk9HX1NXQVBQRUQgICAgICAgICAgICAgICAgIC0yMQorI2RlZmluZSBPSV9WQVJfU1dBUFBFRCAgICAgICAgICAgICAgICAgIC0yMgorI2RlZmluZSBPSV9TV0FQX05VTSAgICAgICAgICAgICAgICAgICAgIC0yMworCisvKiBUaW1pbmcgKi8KKyNkZWZpbmUgT0lfTkVYVF9SRVNFVF9USU1FICAgICAgICAgICAgICAtMzAKKyNkZWZpbmUgT0lfTkVYVF9DTEVBTlVQX1RJTUUgICAgICAgICAgICAtMzEKKyNkZWZpbmUgT0lfTEFTVF9SRUZfVElNRSAgICAgICAgICAgICAgICAtMzIKKworLyogT2JqZWN0IGxpc3QgKi8KKyNkZWZpbmUgT0lfT0JKRUNUX05FWFQgICAgICAgICAgICAgICAgICAtNDAKKyNkZWZpbmUgT0lfT0JKRUNUX1BSRVYgICAgICAgICAgICAgICAgICAtNDEKKyNkZWZpbmUgT0lfT0JKRUNUX1BPUyAgICAgICAgICAgICAgICAgICAtNDIKKworLyogU2hhZG93cyAqLworI2RlZmluZSBPSV9TSEFET1dfTkVYVCAgICAgICAgICAgICAgICAgIC01MAorI2RlZmluZSBPSV9TSEFET1dfUFJFViAgICAgICAgICAgICAgICAgIC01MQorI2RlZmluZSBPSV9TSEFET1dfQUxMICAgICAgICAgICAgICAgICAgIC01MgorCisvKiBTdGF0aXN0aWNzIGFib3V0IHRoZSBvYmplY3QgKi8KKyNkZWZpbmUgT0lfT0JKRUNUX1JFRlMgICAgICAgICAgICAgICAgICAtNjAKKyNkZWZpbmUgT0lfVElDS1MgICAgICAgICAgICAgICAgICAgICAgICAtNjEKKyNkZWZpbmUgT0lfR0lHQVRJQ0tTICAgICAgICAgICAgICAgICAgICAtNjIKKyNkZWZpbmUgT0lfREFUQV9TSVpFICAgICAgICAgICAgICAgICAgICAtNjMKKyNkZWZpbmUgT0lfREFUQV9TSVpFX1RPVEFMICAgICAgICAgICAgICAtNjQKKworLyogU3RhdGlzdGljcyBhYm91dCB0aGUgcHJvZ3JhbSAqLworI2RlZmluZSBPSV9QUk9HX1JFRlMgICAgICAgICAgICAgICAgICAgIC03MAorCisjZGVmaW5lIE9JX05VTV9GVU5DVElPTlMgICAgICAgICAgICAgICAgLTcxCisjZGVmaW5lIE9JX05VTV9WQVJJQUJMRVMgICAgICAgICAgICAgICAgLTcyCisjZGVmaW5lIE9JX05VTV9TVFJJTkdTICAgICAgICAgICAgICAgICAgLTczCisjZGVmaW5lIE9JX05VTV9JTkhFUklURUQgICAgICAgICAgICAgICAgLTc0CisjZGVmaW5lIE9JX05VTV9JTkNMVURFRCAgICAgICAgICAgICAgICAgLTc1CisKKyNkZWZpbmUgT0lfU0laRV9GVU5DVElPTlMgICAgICAgICAgICAgICAtNzYKKyNkZWZpbmUgT0lfU0laRV9WQVJJQUJMRVMgICAgICAgICAgICAgICAtNzcKKyNkZWZpbmUgT0lfU0laRV9TVFJJTkdTICAgICAgICAgICAgICAgICAtNzgKKyNkZWZpbmUgT0lfU0laRV9TVFJJTkdTX0RBVEEgICAgICAgICAgICAtNzkKKyNkZWZpbmUgT0lfU0laRV9TVFJJTkdTX0RBVEFfVE9UQUwgICAgICAtODAKKyNkZWZpbmUgT0lfU0laRV9JTkhFUklURUQgICAgICAgICAgICAgICAtODEKKyNkZWZpbmUgT0lfU0laRV9JTkNMVURFRCAgICAgICAgICAgICAgICAtODIKKworI2RlZmluZSBPSV9QUk9HX1NJWkUgICAgICAgICAgICAgICAgICAgIC04MworI2RlZmluZSBPSV9QUk9HX1NJWkVfVE9UQUwgICAgICAgICAgICAgIC04NAorCisjZW5kaWYgLyogTFBDX09CSkVDVF9JTkZPX0hfICovCmRpZmYgLS1naXQgYS9zeXMvb2JqZWN0aW5mby5oIGIvc3lzL29iamVjdGluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTJjMzNiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL29iamVjdGluZm8uaApAQCAtMCwwICsxLDgyIEBACisjaWZuZGVmIExQQ19PQkpFQ1RJTkZPX0hfCisjZGVmaW5lIExQQ19PQkpFQ1RJTkZPX0hfCisKKy8qIERlZmluaXRpb24gb2YgYXJndW1lbnQgdmFsdWVzIGZvciBvYmplY3RfaW5mbygpIGFuZAorICogb2YgdGhlIGluZGljZXMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgcmVzdWx0IGFycmF5cy4KKyAqLworCisvKiBQb3NzaWJsZSB0eXBlcyBvZiBpbmZvcm1hdGlvbiByZXF1ZXN0ZWQgZnJvbSBvYmplY3RfaW5mbygpCisgKi8KKyNkZWZpbmUgT0lORk9fQkFTSUMgICAgIDAKKyNkZWZpbmUgT0lORk9fUE9TSVRJT04gIDEKKyNkZWZpbmUgT0lORk9fTUVNT1JZICAgIDIKKworCisvKiBJbmRpY2VzIGluIHRoZSBhcnJheSByZXN1bHRpbmcgZnJvbSBPSU5GT19CQVNJQworICovCisKKyNkZWZpbmUgT0lCX0hFQVJUX0JFQVQgICAgICAgICAgMAorI2RlZmluZSBPSUJfSVNfV0laQVJEICAgICAgICAgICAxCisjZGVmaW5lIE9JQl9FTkFCTEVfQ09NTUFORFMgICAgIDIKKyNkZWZpbmUgT0lCX0NMT05FICAgICAgICAgICAgICAgMworI2RlZmluZSBPSUJfREVTVFJVQ1RFRCAgICAgICAgICA0CisjZGVmaW5lIE9JQl9TV0FQUEVEICAgICAgICAgICAgIDUKKyNkZWZpbmUgT0lCX09OQ0VfSU5URVJBQ1RJVkUgICAgNgorI2RlZmluZSBPSUJfUkVTRVRfU1RBVEUgICAgICAgICA3CisjZGVmaW5lIE9JQl9XSUxMX0NMRUFOX1VQICAgICAgIDgKKyNkZWZpbmUgT0lCX0xBTUJEQV9SRUZFUkVOQ0VEICAgOQorI2RlZmluZSBPSUJfU0hBRE9XICAgICAgICAgICAgIDEwCisjZGVmaW5lIE9JQl9SRVBMQUNFRCAgICAgICAgICAgMTEKKyNkZWZpbmUgT0lCX05FWFRfUkVTRVQgICAgICAgICAxMgorI2RlZmluZSBPSUJfVElNRV9PRl9SRUYgICAgICAgIDEzCisjZGVmaW5lIE9JQl9SRUYgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgT0lCX0dJR0FUSUNLUyAgICAgICAgICAxNQorI2RlZmluZSBPSUJfVElDS1MgICAgICAgICAgICAgIDE2CisjZGVmaW5lIE9JQl9TV0FQX05VTSAgICAgICAgICAgMTcKKyNkZWZpbmUgT0lCX1BST0dfU1dBUFBFRCAgICAgICAxOAorI2RlZmluZSBPSUJfVkFSX1NXQVBQRUQgICAgICAgIDE5CisjZGVmaW5lIE9JQl9OQU1FICAgICAgICAgICAgICAgMjAKKyNkZWZpbmUgT0lCX0xPQURfTkFNRSAgICAgICAgICAyMQorI2RlZmluZSBPSUJfTkVYVF9BTEwgICAgICAgICAgIDIyCisjZGVmaW5lIE9JQl9QUkVWX0FMTCAgICAgICAgICAgMjMKKyNkZWZpbmUgT0lCX05FWFRfQ0xFQU5VUCAgICAgICAyNAorCisjZGVmaW5lIE9JQl9NQVggMjUgIC8qIE51bWJlciBvZiBPSUJfIHJlc3VsdCBlbGVtZW50cyAqLworCisKKy8qIEluZGljZXMgaW4gdGhlIGFycmF5IHJlc3VsdGluZyBmcm9tIE9JTkZPX1BPU0lUSU9OCisgKi8KKyNkZWZpbmUgT0lQX05FWFQgIDAKKyNkZWZpbmUgT0lQX1BSRVYgIDEKKyNkZWZpbmUgT0lQX1BPUyAgIDIKKworI2RlZmluZSBPSVBfTUFYIDMgIC8qIE51bWJlciBvZiBPSVBfIHJlc3VsdCBlbGVtZW50cyAqLworCisKKy8qIEluZGljZXMgaW4gdGhlIGFycmF5IHJlc3VsdGluZyBmcm9tIE9JTkZPX01FTU9SWQorICovCisjZGVmaW5lIE9JTV9SRUYgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE9JTV9OQU1FICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE9JTV9QUk9HX1NJWkUgICAgICAgICAgICAyCisjZGVmaW5lIE9JTV9OVU1fRlVOQ1RJT05TICAgICAgICAzCisjZGVmaW5lIE9JTV9TSVpFX0ZVTkNUSU9OUyAgICAgICA0CisjZGVmaW5lIE9JTV9OVU1fVkFSSUFCTEVTICAgICAgICA1CisjZGVmaW5lIE9JTV9TSVpFX1ZBUklBQkxFUyAgICAgICA2CisjZGVmaW5lIE9JTV9OVU1fU1RSSU5HUyAgICAgICAgICA3CisjZGVmaW5lIE9JTV9TSVpFX1NUUklOR1MgICAgICAgICA4CisjZGVmaW5lIE9JTV9TSVpFX1NUUklOR1NfREFUQSAgICA5CisjZGVmaW5lIE9JTV9TSVpFX1NUUklOR1NfVE9UQUwgIDEwCisjZGVmaW5lIE9JTV9OVU1fSU5IRVJJVEVEICAgICAgIDExCisjZGVmaW5lIE9JTV9TSVpFX0lOSEVSSVRFRCAgICAgIDEyCisjZGVmaW5lIE9JTV9UT1RBTF9TSVpFICAgICAgICAgIDEzCisjZGVmaW5lIE9JTV9EQVRBX1NJWkUgICAgICAgICAgIDE0CisjZGVmaW5lIE9JTV9UT1RBTF9EQVRBX1NJWkUgICAgIDE1CisjZGVmaW5lIE9JTV9OT19JTkhFUklUICAgICAgICAgIDE2CisjZGVmaW5lIE9JTV9OT19DTE9ORSAgICAgICAgICAgIDE3CisjZGVmaW5lIE9JTV9OT19TSEFET1cgICAgICAgICAgIDE4CisjZGVmaW5lIE9JTV9OVU1fSU5DTFVERVMgICAgICAgIDE5CisjZGVmaW5lIE9JTV9TSEFSRV9WQVJJQUJMRVMgICAgIDIwCisKKyNkZWZpbmUgT0lNX01BWCAyMSAgLyogTnVtYmVyIG9mIE9JTV8gcmVzdWx0IGVsZW1lbnRzICovCisKKyNlbmRpZiAvKiBMUENfT0JKRUNUSU5GT19IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzL29sZHByb3BzIGIvc3lzL29sZHByb3BzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMjAyYTkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvb2xkcHJvcHMKQEAgLTAsMCArMSw0IEBACisKKy8vIHdlcmRlbiBhbGxlIGJlaWRlIGluIGtlaW5lbSAuYyBGaWxlIGJlbnV0enQuLi4KK1BfTUFYX1dDCitQX0NPTlRFTlQKZGlmZiAtLWdpdCBhL3N5cy9wYWdlci5oIGIvc3lzL3BhZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVmNjUyYQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9wYWdlci5oCkBAIC0wLDAgKzEsNjMgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBwYWdlci5oIC0tIGdlbmVyaWMgcGFnZXIgaGVhZGVyCisvLworLy8gJElkOiBwYWdlci5oIDYxNDIgMjAwNy0wMS0zMSAyMDozNDozOVogWmVzc3RyYSAkCisKKyNpZm5kZWYgX19QQUdFUl9IX18KKyNkZWZpbmUgX19QQUdFUl9IX18KKworLy8gc2VsZWN0IGxhbmd1YWdlCisjZGVmaW5lIEdFUk1BTgorLy8jZGVmaW5lIEVOR0xJU0gKKworLy8gc2VsZWN0IG9wdGltaXphdGlvbgorI2RlZmluZSBPX1NQRUVECQkJLy8gc3BlZWQgb3B0aW1pemF0aW9uCisjZGVmaW5lIE9fU1BFRURfVVAJCS8vIGFkZGl0aW9uYWwgc3BlZWQgdXAgCisJCQkJLy8gKHdvcmtzIG9ubHkgd2l0aCBPX1NQRUVEKQorI2RlZmluZSBNQVhfTElORV9SRUFECTYyNQkvLyBtYXguIGxpbmVzIHRvIGJlIHJlYWQgYnkKKwkJCQkvLyByZWFkX2ZpbGUoKSA1MGsvODBjCisKKy8vIHRoZSBwYWdlciBpbmZvIHN0cnVjdHVyZQorI2RlZmluZSBURVhUICAgIDAJCS8vIHRoZSBmaWxlbmFtZSBvciBzdHJpbmcKKyNkZWZpbmUgRklMRSAgICAxCQkvLyAxID09IGZpbGUsIDAgPSBzdHJpbmcKKyNkZWZpbmUgQ1VSTCAgICAyCQkvLyBjdXJyZW50IGxpbmUKKyNkZWZpbmUgTUFYTCAgICAzCQkvLyBsYXN0IGxpbmUKKyNkZWZpbmUgUEFHRSAgICA0CQkvLyBwYWdlIGxlbmd0aAorI2RlZmluZSBSRUdYCTUJCS8vIGxhc3QgcmVndWxhciBleHByZXNzaW9uCisjZGVmaW5lIENUUkwJNgkJLy8gZnVuY3Rpb24gdG8gZ2l2ZSBjb250cm9sCisjZGVmaW5lIENBUkcJNwkJLy8gYXJyYXkgb2YgYXJncyB0byBDVFJMCisjZGVmaW5lIEZMQUcJOAkJLy8gc3BlY2lhbCBmbGFncworIyBkZWZpbmUgRV9QUk9NUFQgMSAgICAgICAgICAgICAvLyAgIHByb21wdCBhdCBlbmQgb2YgZmlsZQorIyBkZWZpbmUgRV9DQVQgICAgMiAgICAgICAgICAgICAvLyAgIGRvIG5vdCBwcm9tcHQgZm9yIG1vcmUKKyMgZGVmaW5lIEVfQUJTICAgIDQgICAgICAgICAgICAgLy8gICBzaG93IGxpbmUgbnVtYmVycyBhdCBwcm9tcHQKKyNpZmRlZiBPX1NQRUVECisjIGRlZmluZSBKVU5LCQk5CS8vIGp1bmsgaW5kZXgKKyMgZGVmaW5lIEpVTktTSVpFCTEwCS8vIHNpemUgb2Ygc3RyaW5nIGp1bmtzCisjZW5kaWYKKworI2lmZGVmIEdFUk1BTgorIyBkZWZpbmUgTVNHX1BST01QVAkiLS1tZWhyLS0iCisjIGRlZmluZSBNU0dfVE9QCSJBTkZBTkcgIgorIyBkZWZpbmUgTVNHX0JPVFRPTQkiRU5ERSAiCisjIGRlZmluZSBNU0dfT09QUwkiT2hoLCBkYSBsaWVmIGV0d2FzIHNjaGllZiEiCisjZWxzZQorIyBkZWZpbmUgTVNHX1BST01QVAkiLS1tb3JlLS0iCisjIGRlZmluZSBNU0dfVE9QCSJUT1AgIgorIyBkZWZpbmUgTVNHX0JPVFRPTQkiQk9UVE9NICIKKyMgZGVmaW5lIE1TR19PT1BTCSJPb3BzLCBzb21ldGhpbmcgd2VudCB3cm9uZyEiCisjZW5kaWYKKworI2luY2x1ZGUgPHBsYXllci9iYXNlLmg+CisKKyNkZWZpbmUgUEFHRUxFTkdUSAkodGhpc19pbnRlcmFjdGl2ZSgpID8gXAorCQkJICAgdGhpc19pbnRlcmFjdGl2ZSgpLT5RdWVyeVByb3AoUF9TQ1JFRU5TSVpFKSA6IFwKKwkJCSAgIChpbnRlcmFjdGl2ZSh0aGlzX3BsYXllcigpKSA/IFwKKwkJCSAgICAgdGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKFBfU0NSRUVOU0laRSkgOiAyMCkpCisKKy8vIG9sZF9leHBsb2RlKCkgbXVzdCBjcmVhdGUgYW4gYXJyYXkgdGhhdCBpbXBsb2RlKCkncyB0byB0aGUgc2FtZSBzdHJpbmcKKyNkZWZpbmUgRXhwbG9kZShzLHgpCShleHBsb2RlKHMseCkpCisKKyNlbmRpZiAvLyBfX1BBR0VSX0hfXworCisKZGlmZiAtLWdpdCBhL3N5cy9wYXRoZC5oIGIvc3lzL3BhdGhkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc1ZmNlYgotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9wYXRoZC5oCkBAIC0wLDAgKzEsMTMgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBwYXRoZC5oIC0gc3ltLiBLb25zdGFudGVuIGZ1ZXIgZGVuIFBBVEhECisvLworLy8gJElkOiBwYXRoZC5oIDY0MTUgMjAwNy0wOC0xMCAxOToyNDowNFogWmVzc3RyYSAkCisKKyNpZm5kZWYgX1BBVEhEX0hfCisjZGVmaW5lIF9QQVRIRF9IXworCisjZGVmaW5lIFBBVEhEICIvcC9kYWVtb24vcGF0aGQiCisKKyNlbmRpZiAvKiBfUEFUSERfSF8gKi8KKwpkaWZmIC0tZ2l0IGEvc3lzL3Bnc3FsLmggYi9zeXMvcGdzcWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTdjZGY2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL3Bnc3FsLmgKQEAgLTAsMCArMSwyMyBAQAorI2lmbmRlZiBfUEdTUUxfSAorI2RlZmluZSBfUEdTUUxfSAorCisvKiBEZWZpbml0aW9ucyBmb3IgdGhlIFBvc3RncmVTUUwgZWZ1bnMgKi8KKworI2RlZmluZSBQR1JFU19FTVBUWV9RVUVSWSAgICAwICAvKiBVbmltcGxlbWVudGVkICovCisjZGVmaW5lIFBHUkVTX0NPTU1BTkRfT0sgICAgIDEKKyNkZWZpbmUgUEdSRVNfVFVQTEVTX09LICAgICAgMgorI2RlZmluZSBQR1JFU19DT1BZX09VVCAgICAgICAzICAvKiBVbmltcGxlbWVudGVkICovCisjZGVmaW5lIFBHUkVTX0NPUFlfSU4gICAgICAgIDQgIC8qIFVuaW1wbGVtZW50ZWQgKi8KKyNkZWZpbmUgUEdSRVNfQkFEX1JFU1BPTlNFICAgNQorI2RlZmluZSBQR1JFU19OT05GQVRBTF9FUlJPUiA2CisjZGVmaW5lIFBHUkVTX0ZBVEFMX0VSUk9SICAgIDcKKyNkZWZpbmUgUEdSRVNfTk9USUNFICAgICAgICA5OQorCisjZGVmaW5lIFBHQ09OTl9TVUNDRVNTIDEwMAorI2RlZmluZSBQR0NPTk5fRkFJTEVEICAxMDEKKyNkZWZpbmUgUEdDT05OX0FCT1JURUQgMTAyCisKKyNkZWZpbmUgUEdfUkVTVUxUX0FSUkFZIDAKKyNkZWZpbmUgUEdfUkVTVUxUX01BUCAgIDEKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXMvcGxheWVyLmggYi9zeXMvcGxheWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRiNDBkMQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9wbGF5ZXIuaApAQCAtMCwwICsxLDU4IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gcGxheWVyLmggLS0gcGxheWVyIG9iamVjdCBkZWZpbmVzCisvLworLy8gJElkOiBwbGF5ZXIuaCA3Mzg2IDIwMTAtMDEtMjIgMTQ6NTk6MDVaIFplc3N0cmEgJAorCisjaWZuZGVmIF9QTEFZRVJfSF8KKyNkZWZpbmUgX1BMQVlFUl9IXworCisjaWZkZWYgTkVFRF9QUk9UT1RZUEVTCisjdW5kZWYgTkVFRF9QUk9UT1RZUEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgb25seSB0aGUgcHJvcGVydGllcyBoZXJlISEKKyNkZWZpbmUgUExBWUVSX1RNUF9ORUVEX1BST1RPVFlQRVMKKyNlbmRpZgorCisjaW5jbHVkZSAiL3N5cy9wbGF5ZXIvYmFzZS5oIgorI2luY2x1ZGUgIi9zeXMvcGxheWVyL2Rlc2NyaXB0aW9uLmgiCisjaW5jbHVkZSAiL3N5cy9wbGF5ZXIvbW92aW5nLmgiCisjaW5jbHVkZSAiL3N5cy9wbGF5ZXIvZmlsZXN5cy5oIgorI2luY2x1ZGUgIi9zeXMvcGxheWVyL3BvdGlvbi5oIgorI2luY2x1ZGUgIi9zeXMvcGxheWVyL3F1ZXN0LmgiCisjaW5jbHVkZSAiL3N5cy9wbGF5ZXIvc2tpbGxzLmgiCisjaW5jbHVkZSAiL3N5cy9wbGF5ZXIvdmlld2NtZC5oIgorI2luY2x1ZGUgIi9zeXMvcGxheWVyL2NvbW0uaCIKKyNpbmNsdWRlICIvc3lzL3BsYXllci9mYW8uaCIKKyNpbmNsdWRlIDxwbGF5ZXIvdXNlcl9maWx0ZXIuaD4KKyNpbmNsdWRlIDxkYWVtb24uaD4KKworI2lmZGVmIFBMQVlFUl9UTVBfTkVFRF9QUk9UT1RZUEVTCisjdW5kZWYgUExBWUVSX1RNUF9ORUVEX1BST1RPVFlQRVMKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisjZW5kaWYKKworI2RlZmluZSBQX0xBU1RfQ09NTUFORF9FTlYgICAgICAibGFzdF9jb21tYW5kX2VudiIKKyNkZWZpbmUgUF9ISVNUTUlOICAgICAgICAgICAgICAgImhpc3RtaW4iCisjZGVmaW5lIFBfU0hPV19BTElBU19QUk9DRVNTSU5HICJzaG93X2FsaWFzX3Byb2Nlc3NpbmciCisjZGVmaW5lIFBfREVGQVVMVF9OT1RJRllfRkFJTCAgICJkZWZhdWx0X25vdGlmeV9mYWlsIgorI2RlZmluZSBQX05FVERFQURfSU5GTyAgICAgICAgICAibmV0ZGVhZF9pbmZvIgorI2RlZmluZSBQX05FVERFQURfRU5WICAgICAgICAgICAibmV0ZGVhZF9lbnYiCisjZGVmaW5lIFBfSVBfTkFNRSAgICAgICAgICAgICAgICJpcF9uYW1lIgorI2RlZmluZSBQX0xBU1RfS0lMTEVSICAgICAgICAgICAibGFzdF9raWxsZXIiCisjZGVmaW5lIFBfQUNUVUFMX05PVElGWV9GQUlMICAgICJhY3R1YWxfbm90aWZ5X2ZhaWwiCisjZGVmaW5lIFBfTEVQICAgICAgICAgICAgICAgICAgICJsZXAiCisjZGVmaW5lIFBfTkVXQklFX0dVSURFICAgICAgICAgICJuZXdiaWVfZ3VpZGUiCisKKyNkZWZpbmUgRGVjbGFyZUF1dG9sb2FkKG5hbWUscGFyYW0pIFwKKyAgbWxmcF9jcmVhdGUoKHtQX0FVVE9MT0FELG5hbWV9KSxwYXJhbSkKKworI2RlZmluZSBVbmRlY2xhcmVBdXRvbG9hZChuYW1lKSBcCisgIG1sZnBfcmVtb3ZlKCh7UF9BVVRPTE9BRH0pLG5hbWUpCisKKyNkZWZpbmUgUXVlcnlBdXRvbG9hZChuYW1lKSBcCisgIG1sZnBfcXVlcnkoKHtQX0FVVE9MT0FELG5hbWV9KSkKKworI2lmZGVmIE5FRURfUFJPVE9UWVBFUwordmFyYXJncyBzdHJpbmcgX3VucGFyc2VkX2FyZ3MoaW50IGxldmVsKTsKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5cy9wbGF5ZXIvYmFzZS5oIGIvc3lzL3BsYXllci9iYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YyOGNiNAotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9wbGF5ZXIvYmFzZS5oCkBAIC0wLDAgKzEsMTI0IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gcGxheWVyL2Jhc2UuaCAtLSBwbGF5ZXIgYmFzZSBoZWFkZXIKKy8vCisvLyAkSWQ6IGJhc2UuaCA4NDg3IDIwMTMtMDUtMjEgMTk6MTU6NTJaIFplc3N0cmEgJAorCisjaWZuZGVmIF9fUExBWUVSX0JBU0VfSF9fCisjZGVmaW5lIF9fUExBWUVSX0JBU0VfSF9fCisKKy8vIGRhIGRpZXNlcyBGaWxlIHZvbSBNYXN0ZXIgaW5rbHVkaWVydCB3aXJkIHVuZCBkYW5uIGRpZSBTdGFuZGFyZC1JbmNsdWRlLQorLy8gdmVyemVpY2huaXNzZSBub2NoIG5pY2h0IGdlc2V0enQgc2luZCwgZGFyZiBkaWVzZXMgRmlsZSBhdWNoIG51ciBkaWUgYWJzLgorLy8gTmFtZW4gdmVyd2VuZGVuLiAqc2V1ZnoqCisjaW5jbHVkZSAiL3N5cy9wbGF5ZXIvY2FuLmgiCisjaW5jbHVkZSAiL3N5cy9wbGF5ZXIvdGVsbmV0bmVnLmgiCisKKyNkZWZpbmUgSEFVU1ZFUldBTFRFUiAgICIvZC9zZWhlci9oYWV1c2VyL2hhdXN2ZXJ3YWx0ZXIiCisKKy8vIHByb3BlcnRpZXMKKworI2RlZmluZSBQX0tJTExTICAgICAgICAgICAgICAicGxheWVya2lsbHMiCisKKyNkZWZpbmUgUF9aQVBfTVNHICAgICAgICAgICAgInphcF9tc2ciCisjZGVmaW5lIFBfQVdBWSAgICAgICAgICAgICAgICJhd2F5IgorI2RlZmluZSBQX05PX1RPUExJU1QgICAgICAgICAibm9fdG9wbGlzdCIKKyNkZWZpbmUgUF9DQUxMRURfRlJPTV9JUCAgICAgImNhbGxlZF9mcm9tX2lwIgorI2RlZmluZSBQX01BUlJJRUQgICAgICAgICAgICAibWFycmllZCIKKyNkZWZpbmUgUF9TSUJMSU5HUyAgICAgICAgICAgInNpYmxpbmdzIgorI2RlZmluZSBQX1JBQ0VfREVTQ1JJUFRJT04gICAicmFjZWRlc2NyIgorI2RlZmluZSBQX1JBQ0VTVFJJTkcgICAgICAgICAicmFjZXN0cmluZyIKKworI2RlZmluZSBQX1dBSVRGT1IgICAgICAgICAgICAid2FpdGZvciIKKyNkZWZpbmUgUF9XQUlURk9SX1JFQVNPTiAgICAgIndhaXRmb3JfcmVhc29uIgorI2RlZmluZSBQX1dBSVRGT1JfRkxBR1MgICAgICAid2FpdGZvcl9mbGFncyIKKyNkZWZpbmUgUF9WSVNVQUxCRUxMICAgICAgICAgInZpc3VhbGJlbGwiCisjZGVmaW5lIFBfTE9DQUxDTURTICAgICAgICAgICJsb2NhbGNtZHMiCisjZGVmaW5lIFBfQ0xPQ0tNU0cgICAgICAgICAgICJjbG9ja21zZyIKKyNkZWZpbmUgUF9USU1FWk9ORSAgICAgICAgICAgInRpbWV6b25lIgorI2RlZmluZSBQX1NIT1dFTUFJTCAgICAgICAgICAic2hvd2VtYWlsIgorCisjZGVmaW5lIFBfTEFTVF9MT0dJTiAgICAgICAgICJsYXN0X2xvZ2luIgorI2RlZmluZSBQX0xBU1RfTE9HT1VUICAgICAgICAibGFzdF9sb2dvdXQiCisjZGVmaW5lIFBfREFJTFlfUExBWVRJTUUgICAgICJkYWlseV9wbGF5dGltZSIKKyNkZWZpbmUgUF9JR05PUkUgICAgICAgICAgICAgImlnbm9yZSIKKyNkZWZpbmUgUF9TSE9XX0VYSVRTICAgICAgICAgInNob3dfZXhpdHMiCisjZGVmaW5lIFBfV0FOVFNfVE9fTEVBUk4gICAgICJ3YW50c190b19sZWFybiIKKyNkZWZpbmUgUF9BVVRPTE9BRE9CSiAgICAgICAgImF1dG9sb2Fkb2JqIgorI2RlZmluZSBQX0FVVE9MT0FEICAgICAgICAgICAiYXV0b2xvYWQiCisjZGVmaW5lIFBfTUFJTEFERFIgICAgICAgICAgICJtYWlsYWRkciIKKyNkZWZpbmUgUF9IT01FUEFHRSAgICAgICAgICAgImhvbWVwYWdlIgorI2RlZmluZSBQX0lDUSAgICAgICAgICAgICAgICAiaWNxIgorI2RlZmluZSBQX01FU1NFTkdFUiAgICAgICAgICAibWVzc2VuZ2VyIgorI2RlZmluZSBQX0xPQ0FUSU9OICAgICAgICAgICAibG9jYXRpb24iCisKKyNkZWZpbmUgUF9GT0xMT1dfU0lMRU5UICAgICAgImZvbGxvd19zaWxlbnQiCisKKyNpZm5kZWYgUF9JTlZJUworI2RlZmluZSBQX0lOVklTICAgICAgICAgICAgICAiaW52aXMiCisjZW5kaWYKKworI2RlZmluZSBQX1NFQ09ORCAgICAgICAgICAgICAic2Vjb25kIgorI2RlZmluZSBQX1NFQ09ORF9NQVJLICAgICAgICAic2Vjb25kX21hcmsiCisjZGVmaW5lIFBfU0VDT05EX0xJU1QgICAgICAgICJzZWNvbmRfbGlzdCIKKyNkZWZpbmUgUF9NVURfTkVXQklFICAgICAgICAgIl9saWJfbXVkX25ld2JpZSIgIC8vIG5vdCBwbGF5ZWQgYSBtdWQgYmVmb3JlPworCisjZGVmaW5lIFBfVEVTVFBMQVlFUiAgICAgICAgICJ0ZXN0cGxheWVyIgorI2RlZmluZSBQX0FMTE9XRURfU0hBRE9XICAgICAiYWxsb3dlZF9zaGFkb3ciCisKKyNkZWZpbmUgUF9TVEFSVF9IT01FICAgICAgICAgInN0YXJ0X2hvbWUiCisjZGVmaW5lIFBfUFJBWV9ST09NICAgICAgICAgICJfbGliX3BfcHJheXJvb20iCisKKyNkZWZpbmUgUF9TSEVMTF9WRVJTSU9OICAgICAgInNoZWxsX3ZlcnNpb24iCisKKyNkZWZpbmUgUF9DTVNHICAgICAgICAgICAgICAgImNsb25lbXNnIgorI2RlZmluZSBQX0RNU0cgICAgICAgICAgICAgICAiZGVzdG1zZyIKKyNkZWZpbmUgUF9DTE9ORV9NU0cgICAgICAgICAgImNsb25lX21zZyIKKyNkZWZpbmUgUF9ERVNUUlVDVF9NU0cgICAgICAgImRlc3RydWN0X21zZyIKKworI2RlZmluZSBQX0NBUlJJRURfVkFMVUUgICAgICAiY2FycmllZCIKKworI2RlZmluZSBQX1BST01QVCAgICAgICAgICAgICAicHJvbXB0IgorCisjZGVmaW5lIFBfU0NSRUVOU0laRSAgICAgICAgICJzY3JlZW5zaXplIgorI2RlZmluZSBQX01PUkVfRkxBR1MgICAgICAgICAibW9yZV9mbGFncyIKKworI2RlZmluZSBQX05PX0FTQ0lJX0FSVCAgICAgICAibm9fYXNjaWlfYXJ0IgorCisjZGVmaW5lIFBfTEFTVF9RVUlUICAgICAgICAgICJsYXN0X3F1aXQiCisKKyNkZWZpbmUgUF9SRUFEX05FV1MgICAgICAgICAgInJlYWRfbmV3cyIKKworI2RlZmluZSBQX05FRURFRF9RUCAgICAgICAgICAibmVlZGVkX3FwIgorCisvL1RPRE86IFJlbW92ZSAtIFByb3BlcnR5IGlzIG5vdCBuZWVkZWQgYW55IG1vcmUuCisjZGVmaW5lIFBfVEVMTkVUX0tFRVBfQUxJVkUgICJzZW5kX3RlbG5ldF9rZWVwX2FsaXZlIgorCisjZW5kaWYgLy8gX19QTEFZRVJfQkFTRV9IX18KKworI2lmZGVmIE5FRURfUFJPVE9UWVBFUworCisjaWZuZGVmIF9fUExBWUVSX0JBU0VfSF9QUk9UT19fCisjZGVmaW5lIF9fUExBWUVSX0JBU0VfSF9QUk9UT19fCisKKy8vIHByb3RvdHlwZXMKKwordm9pZCBzbWFydF9sb2coc3RyaW5nIG15bmFtZSwgc3RyaW5nIHN0cik7CitpbnQgUXVlcnlHdWVzdCgpOworaW50IGludmlzKHN0cmluZyBpbmZvcm0pOworaW50IHZpcyhzdHJpbmcgaW5mb3JtKTsKKwordmFyYXJncyBzdGF0aWMgdm9pZCBzdG9wX2hlYXJ0X2JlYXRzKG1peGVkIG9icyk7CitzdGF0aWMgdm9pZCByZXN0YXJ0X2hlYXJ0X2JlYXRzKCk7CisKK25vbWFzayBpbnQgcXVlcnlfaGNfcGxheSgpOwordmFyYXJncyBub21hc2sgdm9pZCBzZXRfaGNfcGxheShzdHJpbmcgc3RyLCBpbnQgdmFsKTsKK3N0cmluZyBTZXREZWZhdWx0SG9tZShzdHJpbmcgc3RyKTsKK3Byb3RlY3RlZCBzdHJpbmcgU2V0RGVmYXVsdFByYXlSb29tKHN0cmluZyBzdHIpOworCit2b2lkIHNhdmVfbWUobWl4ZWQgdmFsdWVfaXRlbXMpOworbm9tYXNrIG1peGVkIHF1ZXJ5X3JlYWxfbmFtZSgpOworcHJvdGVjdGVkIHZvaWQgY2FsbF9ub3RpZnlfcGxheWVyX2NoYW5nZShpbnQgcmVpbik7CisKKyNlbmRpZiAvLyBfX1BMQVlFUl9CQVNFX0hfUFJPVE9fXworCisjZW5kaWYvLyBORUVEX1BST1RPWVBFUwpkaWZmIC0tZ2l0IGEvc3lzL3BsYXllci9jYW4uaCBiL3N5cy9wbGF5ZXIvY2FuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNjZTY5MwotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9wbGF5ZXIvY2FuLmgKQEAgLTAsMCArMSwzNCBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHBsYXllci9jYW4uaCAtLSB2YXJpb3VzIGFiaXRsaXRpZXMKKy8vCisvLyAkSWQ6IGNhbi5oIDc5MjQgMjAxMS0wOS0yNiAxMDowMjoyNlogWmVzc3RyYSAkCisKKyNpZm5kZWYgX19DQU5fSF9fCisjZGVmaW5lIF9fQ0FOX0hfXworCisvLyBwcm9wZXJ0aWVzCisjZGVmaW5lIFBfQ0FOX0ZMQUdTICAgICAgICAgICJjYW5fZmxhZ3MiCisKKy8vIGJpdG1hc2tzCisjZGVmaW5lIENBTl9FTU9URSAgMHgwMQorI2RlZmluZSBDQU5fRUNITyAgIDB4MDIKKyNkZWZpbmUgQ0FOX1JFTU9URSAweDA0CisjZGVmaW5lIENBTl9QUkVTQVkgMHgwOAorI2RlZmluZSBDQU5fUkVQT1JUX1NQICAgICAweDEwICAgICAvLyBTdGF0dXN1cGRhdGVzIGZ1ZXIgS1AKKyNkZWZpbmUgQ0FOX1JFUE9SVF9QT0lTT04gMHgyMCAgICAgLy8gU3RhdHVzdXBkYXRlcyBmdWVyIEdpZnQKKyNkZWZpbmUgQ0FOX1JFUE9SVF9XSU1QWSAgMHg0MCAgICAgLy8gU3RhdHVzdXBkYXRlcyBmdWVyIFZvcnNpY2h0CisjZGVmaW5lIENBTl9SRVBPUlRfV0lNUFlfRElSIDB4ODAgIC8vIFN0YXR1c3VwZGF0ZXMgZnVlciBWb3JzaWNodHJpY2h0dW5nCisKKyNlbmRpZiAvLyBfX0NBTl9IX18KKworI2lmZGVmIE5FRURfUFJPVE9UWVBFUworCisjaWZuZGVmIF9fQ0FOX0hfUFJPVE9fXworI2RlZmluZSBfX0NBTl9IX1BST1RPX18KKworLy8gbm8gcHJvdG90eXBlcworCisjZW5kaWYgLy8gX19DQU5fSF9QUk9UT19fCisKKyNlbmRpZgkvLyBORUVEX1BST1RPWVBFUwpkaWZmIC0tZ2l0IGEvc3lzL3BsYXllci9jb21iYXQuaCBiL3N5cy9wbGF5ZXIvY29tYmF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFhYjJmYQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9wbGF5ZXIvY29tYmF0LmgKQEAgLTAsMCArMSwxNiBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHBsYXllci9jb21iYXQuaCAtLSBwcm90b3R5cGVzIGZvciBwbGF5ZXIgc3BlY2lmaWMgaXNzdWVzIG9mIGNvbWJhdAorLy8KKy8vICRJZDogY29tbS5oLHYgMy4zIDIwMDAvMDIvMDkgMTU6NTY6MjUgUGFkcmVpYyBFeHAgJAorCisjaWZuZGVmIF9fUExBWUVSX0NPTUJBVF9IX18KKyNkZWZpbmUgX19QTEFZRVJfQ09NQkFUX0hfXworCitwdWJsaWMgaW50IFF1ZXJ5UGxBdHRhY2tlZChvYmplY3QgcGwpOworCitwdWJsaWMgaW50IFJlZ2lzdGVySGVscGVyTlBDKG9iamVjdCBucGMsIGludCBmbGFncyk7CitwdWJsaWMgaW50IFVucmVnaXN0ZXJIZWxwZXJOUEMob2JqZWN0IG5wYyk7CisKKyNlbmRpZiAvLyBfX1BMQVlFUl9DT01CQVRfSF9fCisKZGlmZiAtLWdpdCBhL3N5cy9wbGF5ZXIvY29tbS5oIGIvc3lzL3BsYXllci9jb21tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAzYjMxOQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9wbGF5ZXIvY29tbS5oCkBAIC0wLDAgKzEsODUgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBwbGF5ZXIvY29tbS5oIC0tIGNvbW11bmljYXRpb24gbW9kdWxlIHByb3BlcnRpZXMKKy8vCisvLyAkSWQ6IGNvbW0uaCx2IDMuMyAyMDAwLzAyLzA5IDE1OjU2OjI1IFBhZHJlaWMgRXhwICQKKworI2lmbmRlZiBfX1BMQVlFUl9DT01NX0hfXworI2RlZmluZSBfX1BMQVlFUl9DT01NX0hfXworCisvLyBsaXZpbmcvY29tbS5oIGJyYXVjaGVuIHdpciBhdWNoLgorI2luY2x1ZGUgPGxpdmluZy9jb21tLmg+CisKKy8vIHByb3BlcnRpZXMKKworI2RlZmluZSBQX0lOVEVSTVVEICAgICAgICAgICAiaW50ZXJtdWQiIC8vIERvZXMgc2hlIGxpc3RlbiB0byBpdCA/CisjZGVmaW5lIFBfQlVGRkVSICAgICAgICAgICAgICJidWZmZXIiICAgLy8gaWdub3JlLSwgdGVsbC1idWZmZXIKKyNkZWZpbmUgUF9ERUFGICAgICAgICAgICAgICAgImRlYWYiICAgICAvLyBUYXViaGVpdAorI2RlZmluZSBQX1BFUk1fU1RSSU5HICAgICAgICAicGVybV9zdHJpbmciIC8vIEZ1ZXIgU3ByYWNoZmx1ZWNoZQorI2RlZmluZSBQX01FU1NBR0VfQkVFUCAgICAgICAibWVzc2FnZV9iZWVwIiAvLyB3ZW5uIGdlc2V0enQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFuemFobCBkZXIgU2VrdW5kZW4gZGF6d2lzY2hlbgorI2RlZmluZSBQX01FU1NBR0VfUFJFUEVORCAgIm1lc3NhZ2VfcHJlcGVuZCIKKy8vIFdpbGwgZGVyIE1hZ2llciBNVF9ERUJVRyBzZWhlbj8KKyNkZWZpbmUgUF9XSVpfREVCVUcgICAgICAgICAgInN0ZF9wX3dpemRlYnVnIgorCisjZGVmaW5lIE1FU1NBR0VfQkVFUCAiXDAwNyIKKworLy8gZGVmaW5pdGlvbnMgZm9yIE1lc3NhZ2UoKQorCisjZGVmaW5lIE1TR0ZMQUdfQ0hBTk5FTCAweDAwMDEJLy8gbWVzc2FnZXMgZnJvbSBjaGFubmVsZC5jCisjZGVmaW5lIE1TR0ZMQUdfQ0hJU1QJMHgwMDAyCisjZGVmaW5lIE1TR0ZMQUdfU09VTAkweDAwMDQJLy8gbWVzc2FnZXMgZnJvbSBzb3VsLmMKKyNkZWZpbmUgTVNHRkxBR19SRU1PVEUJMHgwMDA4CS8vIHJlbW90ZSBlbW90ZXMKKyNkZWZpbmUgTVNHRkxBR19TSE9VVAkweDAwMTAJLy8gY29tbXVuaWNhdGlvbiBjb21tYW5kcworI2RlZmluZSBNU0dGTEFHX1RFTEwJMHgwMDIwCisjZGVmaW5lIE1TR0ZMQUdfU0FZCTB4MDA0MAorI2RlZmluZSBNU0dGTEFHX1dISVNQRVIgMHgwMDgwCisjZGVmaW5lIE1TR0ZMQUdfTUVDSE8JMHgwMTAwCisjZGVmaW5lIE1TR0ZMQUdfUlRFTEwJMHgwMjAwCS8vIHRlbGwgZnJvbSBvdGhlciBtdWQKKworI2RlZmluZSBNQVhfU0FWRURfTUVTU0FHRVMgIDUwCisjZGVmaW5lIE1BWF9TQVZFRF9DSEFUUyAgICAgMjAKKworLy8gV2FzIGdlaHQgaW4gZGVuIEtvYm9sZD8KKyNkZWZpbmUgTVNHRkxBR19DQUNIRQkoTVNHRkxBR19URUxMIHwgTVNHRkxBR19SRU1PVEUgfCBNU0dGTEFHX1dISVNQRVIgfCBNU0dGTEFHX1JURUxMKQorCisjZGVmaW5lIE1TR0ZMQUdfREVBRkNISyAoTVNHRkxBR19TSE9VVCB8IE1TR0ZMQUdfVEVMTCB8IE1TR0ZMQUdfU0FZIHwgTVNHRkxBR19XSElTUEVSIHwgTVNHRkxBR19DSEFOTkVMIHwgTVNHRkxBR19SVEVMTCkKKworLy8gUnVlY2tnYWJld2VydGUgdm9uIE1lc3NhZ2UoKQorI2RlZmluZSBNRVNTQUdFX09LCSAgICAgMQkvLyBhbGxlcyBrbGFyCisjZGVmaW5lIE1FU1NBR0VfQ0FDSEUJICAgICAwCS8vIE1lbGR1bmcgc3RlaHQgaW0gS29ib2xkCisjZGVmaW5lIE1FU1NBR0VfSUdOT1JFX1lPVSAgLTEJLy8gTWVsZHVuZy9TZW5kZXIgd2lyZCBpZ25vcmllcnQKKyNkZWZpbmUgTUVTU0FHRV9JR05PUkVfVkVSQiAtMgorI2RlZmluZSBNRVNTQUdFX0lHTk9SRV9NVUQgIC0zCisjZGVmaW5lIE1FU1NBR0VfREVBRgkgICAgLTQJLy8gRW1wZmFlbmdlciBob2VydCBuaWNodCB6dQorI2RlZmluZSBNRVNTQUdFX0NBQ0hFX0ZVTEwgIC01CS8vIEtvYm9sZCBrYW5uIG5pY2h0cyBtZWhyIG1lcmtlbgorCisvLyBGbGFncyBmdWVyIFN0YXR1c3JlcG9ydHMKKyNkZWZpbmUgRE9fUkVQT1JUX0hQICAgICAgICAgMHgxCisjZGVmaW5lIERPX1JFUE9SVF9TUCAgICAgICAgIDB4MgorI2RlZmluZSBET19SRVBPUlRfUE9JU09OICAgICAweDQKKyNkZWZpbmUgRE9fUkVQT1JUX1dJTVBZICAgICAgMHg4CisjZGVmaW5lIERPX1JFUE9SVF9XSU1QWV9ESVIgIDB4MTAKKworI2VuZGlmIC8vIF9fUExBWUVSX0NPTU1fSF9fCisKKyNpZmRlZiBORUVEX1BST1RPVFlQRVMKKworI2lmbmRlZiBfX1BMQVlFUl9DT01NX0hfUFJPVE9fXworI2RlZmluZSBfX1BMQVlFUl9DT01NX0hfUFJPVE9fXworCisvLyBwcm90b3R5cGVzCisKK3Byb3RlY3RlZCB2YXJhcmdzIGludCBfcmVjdihvYmplY3Qgb2IsIHN0cmluZyBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnLCBzdHJpbmcgaW5kZW50KTsKKwordmFyYXJncyBpbnQgTWVzc2FnZShzdHJpbmcgbXNnLCBpbnQgZmxhZywgc3RyaW5nIGluZGVudCwKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNuYW1lLCBtaXhlZCBzZW5kZXIpOworCitwcm90ZWN0ZWQgdm9pZCBzdGF0dXNfcmVwb3J0KGludCB0eXBlLCBtaXhlZCB2YWwpOworcHJvdGVjdGVkIHZvaWQgX25vdGlmeShzdHJpbmcgbXNnLCBzdHJpbmcgYWN0aW9uKTsKKworI2VuZGlmIC8vIF9fUExBWUVSX0NPTU1fSF9QUk9UT19fCisKKyNlbmRpZiAvLyBORUVEX1BST1RPWVBFUworCmRpZmYgLS1naXQgYS9zeXMvcGxheWVyL2NvbW1hbmQuaCBiL3N5cy9wbGF5ZXIvY29tbWFuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNDFiNTYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvcGxheWVyL2NvbW1hbmQuaApAQCAtMCwwICsxLDM5IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gcGxheWVyL2NvbW1hbmQuaCAtIENvbW1hbmRzICYgQ28KKy8vCisvLyAkSWQ6IGF0dHJpYnV0ZXMuaCA2MjgyIDIwMDctMDUtMDkgMjA6NTU6MTdaIFplc3N0cmEgJAorIAorI2lmbmRlZiBfX1BMQVlFUl9DT01NQU5EX0hfXworI2RlZmluZSBfX1BMQVlFUl9DT01NQU5EX0hfXworCisvLyBwcm9wZXJ0aWVzCisjZGVmaW5lIFBfRElTQUJMRV9DT01NQU5EUyAicF9saWJfZGlzYWJsZWNvbW1hbmRzIgorCisvLyBJbmRpemVzIGZ1ZXJzIEFycmF5IHZvbiBjb21tYW5kYmxvY2sKKyNkZWZpbmUgQl9PQkpFQ1QgIDAKKyNkZWZpbmUgQl9USU1FICAgIDEKKyNkZWZpbmUgQl9WQUxVRSAgIDIKKyNkZWZpbmUgQl9FWENFUFRJT05TIDMKKworI2VuZGlmIC8vIF9fUExBWUVSX0NPTU1BTkRfSF9fCisKKworI2lmZGVmIE5FRURfUFJPVE9UWVBFUworCisjaWZuZGVmIF9fUExBWUVSX0NPTU1BTkRfSF9QUk9UT19fCisjZGVmaW5lIF9fUExBWUVSX0NPTU1BTkRfSF9QUk9UT19fCisKKy8vIHByb3RvdHlwZXMKK21peGVkIG1vZGlmeV9jb21tYW5kKHN0cmluZyBzdHIpOworaW50IGNvbW1hbmRfbWUoc3RyaW5nIGNtZCk7Cit2YXJhcmdzIHN0cmluZyBfdW5wYXJzZWRfYXJncyhpbnQgbGV2ZWwpOworCisvLyBTZXQtIHVuZCBRdWVyeS1NZXRob2Rlbgorc3RhdGljIG1peGVkIF9zZXRfcF9saWJfZGlzYWJsZWNvbW1hbmRzKG1peGVkIGRhdGEpOworc3RhdGljIG1peGVkIF9xdWVyeV9wX2xpYl9kaXNhYmxlY29tbWFuZHMoKTsKKworI2VuZGlmIC8vIF9fUExBWUVSX0FUVFJJQlVURVNfSF9QUk9UT19fCisKKyNlbmRpZiAvLyBORUVEX1BST1RPWVBFUworCmRpZmYgLS1naXQgYS9zeXMvcGxheWVyL2Rlc2NyaXB0aW9uLmggYi9zeXMvcGxheWVyL2Rlc2NyaXB0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc4ZTE2OQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9wbGF5ZXIvZGVzY3JpcHRpb24uaApAQCAtMCwwICsxLDM0IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gcGxheWVyL2Rlc2NyaXB0aW9uLmggLS0gcGxheWVyIGRlc2NyaXB0aW9uIGhlYWRlcgorLy8KKy8vICRJZDogZGVzY3JpcHRpb24uaCx2IDMuNiAyMDAwLzAyLzA5IDE1OjU2OjI1IFBhZHJlaWMgRXhwICQKKworI2luY2x1ZGUgPGxpdmluZy9kZXNjcmlwdGlvbi5oPgorIAorI2lmbmRlZiBfX1BMQVlFUl9ERVNDUklQVElPTl9IX18KKyNkZWZpbmUgX19QTEFZRVJfREVTQ1JJUFRJT05fSF9fCisKKy8vIHByb3BlcnRpZXMKKworI2RlZmluZSBQX1BSRVNBWSAgICAgICAgICAgICAicHJlc2F5IgorI2RlZmluZSBQX1RJVExFICAgICAgICAgICAgICAidGl0bGUiCisjZGVmaW5lIFBfQVZFUkFHRV9TSVpFICAgICAgICJhdmVyYWdlX3NpemUiCisjZGVmaW5lIFBfQVZFUkFHRV9XRUlHSFQgICAgICJhdmVyYWdlX3dlaWdodCIKKyNkZWZpbmUgUF9SRUZFUkVOQ0VfT0JKRUNUICAgInJlZmVyZW5jZV9vYmplY3QiCisKKyNkZWZpbmUgUF9ERVNDUklQVElPTiAgICAgICAgImRlc2NyaXB0aW9uIgorCisjZW5kaWYgLy8gX19QTEFZRVJfREVTQ1JJUFRJT05fSF9fCisKKyNpZmRlZiBORUVEX1BST1RPVFlQRVMKKworI2lmbmRlZiBfX1BMQVlFUl9ERVNDUklQVElPTl9IX1BST1RPX18KKyNkZWZpbmUgX19QTEFZRVJfREVTQ1JJUFRJT05fSF9QUk9UT19fCisKKy8vIHByb3RvdHlwZXMKKy8vIG5vIHByb3RvdHlwZXMKKworI2VuZGlmIC8vIF9fUExBWUVSX0RFU0NSSVBUSU9OX0hfUFJPVE9fXworCisjZW5kaWYJLy8gTkVFRF9QUk9UT1lQRVMKZGlmZiAtLWdpdCBhL3N5cy9wbGF5ZXIvZmFvLmggYi9zeXMvcGxheWVyL2Zhby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMDE2YTQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvcGxheWVyL2Zhby5oCkBAIC0wLDAgKzEsNDcgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisKKyNpZm5kZWYgX19QTEFZRVJfRkFPX0hfXworI2RlZmluZSBfX1BMQVlFUl9GQU9fSF9fCisKKyNkZWZpbmUgRkFPX01BU1RFUiAgICAgICIvZC9lYmVuZS9taXJpbC9mcmF0ZXJuaXRhcy9zZWN1cmUvZmFvbWFzdGVyIiAvLyBkaWUgemVudHJhbGUgc3RlbGxlIGRlcyBmYW8KKworLy8gZGllIExpc3RlIGRlciB2ZXJm/GdiYXJlbiBQb3J0YWxlIGZ1ZXIgZGFzIGVyc3RlIHBvcnRhbGdlc2NoZW5rCisjZGVmaW5lIEZBT19QT1JUQUxTMV9MSVNUICh7MiwzLDQsNSw2LDcsOCw5LDEwLDEzLDE0LDE1LDE2LDE5LDIwLDIxLDI1LDI5LDMzfSkKKy8vIGRpZSBMaXN0ZSBkZXIgdmVyZvxnYmFyZW4gUG9ydGFsZSBmdWVyIGRhcyB6d2VpdGUgcG9ydGFsZ2VzY2hlbmsKKyNkZWZpbmUgRkFPX1BPUlRBTFMyX0xJU1QgRkFPX1BPUlRBTFMxX0xJU1QrKHsxLDExLDEyLDE3LDE4LDI0LDI2LDI3LDI4LDMxLDM0LDM2LDM3LDM4fSkKKy8vIGRpZSBhbnphaGwgZGVyIHp1IHdhZWhsZW5kZW4gcG9ydGFsZSBmdWVyIGRhcyBlcnN0ZSBwb3J0YWxnZXNjaGVuaworI2RlZmluZSBGQU9fUE9SVEFMUzFfTlVNICA1CisvLyBkaWUgYW56YWhsIGRlciB6dSB3YWVobGVuZGVuIHBvcnRhbGUgZnVlciBkYXMgendlaXRlIHBvcnRhbGdlc2NoZW5rCisjZGVmaW5lIEZBT19QT1JUQUxTMl9OVU0gIDUKKworLy8gcHJvcGVydGllcworI2RlZmluZSBQX0ZBTyAgICAgICAgICAgImZyYXRlcm5pdGFzZG9ub2FyY2htYWdvcnVtIiAgLy8gZW50aGFlbHQgZGllIGRvbmkKKyNkZWZpbmUgUF9GQU9fUE9SVEFMUyAgIFBfRkFPKyJQT1JUQUxTIiAvLyBlbnRoYWVsdCBkaWUgZGVtIHNwaWVsZXIgdWViZXJnZWJlbmVuIHBvcnRhbGUKKworLy8gYml0bWFza3MKKyNkZWZpbmUgRkFPX1RJVExFICAgMHgwMQorI2RlZmluZSBGQU9fUE9SVEFMUzEgICAgMHgwMgorI2RlZmluZSBGQU9fUE9SVEFMUzIgIDB4MDQKKyNkZWZpbmUgRkFPX1NFRVJfUE9SVEFMIDB4MDgKKyNkZWZpbmUgRkFPX01FTUJFUiAweDEwCisKKy8vIGhpbGZyZWljaGUgbWFrcm9zCisjZGVmaW5lIEZBT19IQVNfVElUTEVfR0lGVCh4KSAgICh4IT0wICYmIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoeCkgXAorICAgICYmICgoaW50KXgtPlF1ZXJ5UHJvcChQX0ZBTykmRkFPX1RJVExFKSE9MCkKKyNkZWZpbmUgRkFPX0hBU19QT1JUQUxTMV9HSUZUKHgpICAoeCE9MCAmJiBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHgpIFwKKyAgICAmJiAoKGludCl4LT5RdWVyeVByb3AoUF9GQU8pJkZBT19QT1JUQUxTMSkhPTApCisjZGVmaW5lIEZBT19IQVNfUE9SVEFMUzJfR0lGVCh4KSAgKHghPTAgJiYgcXVlcnlfb25jZV9pbnRlcmFjdGl2ZSh4KSBcCisgICAgJiYgKChpbnQpeC0+UXVlcnlQcm9wKFBfRkFPKSZGQU9fUE9SVEFMUzIpIT0wKQorI2RlZmluZSBGQU9fSEFTX1BPUlRBTFNfR0lGVCh4KSAgIChGQU9fSEFTX1BPUlRBTFMxX0dJRlQoeCkgfHwgRkFPX0hBU19QT1JUQUxTMl9HSUZUKHgpKQorI2RlZmluZSBGQU9fTUFZX1VTRV9QT1JUQUwoeCxwKSAgIChpbnRwKHApICYmICgoRkFPX0hBU19QT1JUQUxTMV9HSUZUKHgpICYmIFwKKyAgICAgICAgbWVtYmVyKEZBT19QT1JUQUxTMV9MSVNULHApIT0tMSApfHwoRkFPX0hBU19QT1JUQUxTMl9HSUZUKHgpICYmIFwKKyAgICAgICAgbWVtYmVyKEZBT19QT1JUQUxTMl9MSVNULHApIT0tMSkgKSAmJiBcCisgICAgKHBvaW50ZXJwKChpbnQqKXgtPlF1ZXJ5UHJvcChQX0ZBT19QT1JUQUxTKSkgXAorICAgICAmJiBtZW1iZXIoKGludCopeC0+UXVlcnlQcm9wKFBfRkFPX1BPUlRBTFMpLHApIT0tMSkgKQorI2RlZmluZSBGQU9fSEFTX1NFRVJfUE9SVEFMX0dJRlQoeCkgICAgICh4IT0wICYmIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoeCkgXAorICAgICYmICgoaW50KXgtPlF1ZXJ5UHJvcChQX0ZBTykmRkFPX1NFRVJfUE9SVEFMKSE9MCkKKyNkZWZpbmUgRkFPX0lTX01FTUJFUih4KSAoeCE9MCAmJiBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHgpIFwKKyAgICAmJiAoKGludCl4LT5RdWVyeVByb3AoUF9GQU8pJkZBT19NRU1CRVIpIT0wKQorI2VuZGlmIC8vIF9fUExBWUVSX0ZBT19IX18KKwpkaWZmIC0tZ2l0IGEvc3lzL3BsYXllci9maWxlc3lzLmggYi9zeXMvcGxheWVyL2ZpbGVzeXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmZjYWRiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL3BsYXllci9maWxlc3lzLmgKQEAgLTAsMCArMSwyNSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHBsYXllci9maWxlc3lzLmggLS0gZmlsZSBzeXN0ZW0gc2VydmljZXMKKy8vCisvLyAkSWQ6IGZpbGVzeXMuaCx2IDMuMSAxOTk3LzAyLzEyIDEzOjI5OjA5IFdhcmdvbiBFeHAgJAorIAorI2lmbmRlZiBfX1BMQVlFUl9GSUxFU1lTX0hfXworI2RlZmluZSBfX1BMQVlFUl9GSUxFU1lTX0hfXworCisvLyBwcm9wZXJ0aWVzCisKKyNlbmRpZiAvLyBfX1BMQVlFUl9GSUxFU1lTX0hfXworCisjaWZkZWYgTkVFRF9QUk9UT1RZUEVTCisKKyNpZm5kZWYgX19QTEFZRVJfRklMRVNZU19IX1BST1RPX18KKyNkZWZpbmUgX19QTEFZRVJfRklMRVNZU19IX1BST1RPX18gICAgICAKKworLy8gcHJvdG90eXBlcworCit2YXJhcmdzIHN0cmluZyBmaW5kX2ZpbGUoc3RyaW5nIHN0ciwgc3RyaW5nIHN1ZmZpeCk7CisKKyNlbmRpZiAvLyBfX1BMQVlFUl9GSUxFU1lTX0hfUFJPVE9fXworCisjZW5kaWYgLy8gTkVFRF9QUk9UT1lQRVMKZGlmZiAtLWdpdCBhL3N5cy9wbGF5ZXIvZ21jcC5oIGIvc3lzL3BsYXllci9nbWNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVlMzdjZQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9wbGF5ZXIvZ21jcC5oCkBAIC0wLDAgKzEsMjYgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBwbGF5ZXIvZ21jcC5oIC0tIFN0dWZmIGZvciBHTUNQIGhhbmRsaW5nCisvLworLy8gJElkJAorCisjaWZuZGVmIF9fR01DUF9IX18KKyNkZWZpbmUgX19HTUNQX0hfXworCisvLyBwcm9wZXJ0aWVzCisKKyNlbmRpZiAvLyBfX0dNQ1BfSF9fCisKKyNpZmRlZiBORUVEX1BST1RPVFlQRVMKKworI2lmbmRlZiBfX0dNQ1BfSF9QUk9UT19fCisjZGVmaW5lIF9fR01DUF9IX1BST1RPX18KKworLy8gcHJvdG90eXBlcworLypwcm90ZWN0ZWQqLyBpbnQgR01DUF9DaGFyKG1hcHBpbmcgZGF0YSk7CisvKnByb3RlY3RlZCovIGludCBHTUNQX0NoYW5uZWwoc3RyaW5nIG1zZywgc3RyaW5nIGNoYW5uZWwsIHN0cmluZyBzZW5kZXIpOworCisjZW5kaWYgLy8gX19HTUNQX0hfUFJPVE9fXworCisjZW5kaWYgIC8vIE5FRURfUFJPVE9ZUEVTCisKZGlmZiAtLWdpdCBhL3N5cy9wbGF5ZXIvbGlmZS5oIGIvc3lzL3BsYXllci9saWZlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNhOTg3NwotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9wbGF5ZXIvbGlmZS5oCkBAIC0wLDAgKzEsMjUgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBwbGF5ZXIvbGlmZS5oIC0tIHBsYXllciBsaWZlICBoZWFkZXIKKy8vCisvLyAkSWQ6IGRlc2NyaXB0aW9uLmgsdiAzLjYgMjAwMC8wMi8wOSAxNTo1NjoyNSBQYWRyZWljIEV4cCAkCisgCisjaWZuZGVmIF9fUExBWUVSX0xJRkVfSF9fCisjZGVmaW5lIF9fUExBWUVSX0xJRkVfSF9fCisKKy8vIHByb3BlcnRpZXMKKworI2VuZGlmIC8vIF9fUExBWUVSX0xJRkVfSF9fCisKKyNpZmRlZiBORUVEX1BST1RPVFlQRVMKKworI2lmbmRlZiBfX1BMQVlFUl9MSUZFX0hfUFJPVE9fXworI2RlZmluZSBfX1BMQVlFUl9MSUZFX0hfUFJPVE9fXworCisvLyBwcm90b3R5cGVzCitwdWJsaWMgICAgdm9pZCAgICBmb3JjZV9zYXZlKCk7Citwcm90ZWN0ZWQgaW50ICAgICBkZWF0aF9zdWZmZXJpbmcoKTsKKworI2VuZGlmIC8vIF9fUExBWUVSX0xJRkVfSF9QUk9UT19fCisKKyNlbmRpZgkvLyBORUVEX1BST1RPWVBFUwpkaWZmIC0tZ2l0IGEvc3lzL3BsYXllci9tb25leWhhbmRsZXIuaCBiL3N5cy9wbGF5ZXIvbW9uZXloYW5kbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk0MmI2MgotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9wbGF5ZXIvbW9uZXloYW5kbGVyLmgKQEAgLTAsMCArMSwxMiBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHBsYXllci9tb25leWhhbmRsZXIuaCAtLSBXcmFwcGVyIGZ1ZXIgL3N5cy9jb250YWluZXIvbW9uZXloYW5kbGVyLmgKKy8vIEV4aXN0aWVydCBhdXMgR3J1ZW5kZW4gZGVyIEFid2FlcnRza29tcGF0aWJpbGl0YWV0LgorLy8KKy8vICRJZDogbW9uZXloYW5kbGVyLmggODM5NiAyMDEzLTAyLTE4IDIxOjU2OjM3WiBaZXNzdHJhICQKKworI2lmbmRlZiBfX1BMQVlFUl9NT05FWUhBTkRMRVJfSF9fCisjZGVmaW5lIF9fUExBWUVSX01PTkVZSEFORExFUl9IX18KKyNpbmNsdWRlIDxjb250YWluZXIvbW9uZXloYW5kbGVyLmg+CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvc3lzL3BsYXllci9tb3ZpbmcuaCBiL3N5cy9wbGF5ZXIvbW92aW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQyYWI1OQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9wbGF5ZXIvbW92aW5nLmgKQEAgLTAsMCArMSwyOSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHBsYXllci9tb3ZpbmcuaCAtLSBwbGF5ZXIgbW92aW5nIGhlYWRlcgorLy8KKy8vICRJZDogbW92aW5nLmgsdiAzLjIgMjAwMC8wMi8wOSAxNTo1NjoyNSBQYWRyZWljIEV4cCAkCisgCisjaWZuZGVmIF9fUExBWUVSX01PVklOR19IX18KKyNkZWZpbmUgX19QTEFZRVJfTU9WSU5HX0hfXworCisvLyBwcm9wZXJ0aWVzCisKKyNkZWZpbmUgUF9NU0dJTiAgICAgICAgICAgICAgIm1zZ2luIgorI2RlZmluZSBQX01TR09VVCAgICAgICAgICAgICAibXNnb3V0IgorI2RlZmluZSBQX01NU0dJTiAgICAgICAgICAgICAibW1zZ2luIgorI2RlZmluZSBQX01NU0dPVVQgICAgICAgICAgICAibW1zZ291dCIKKworI2VuZGlmIC8vIF9fUExBWUVSX01PVklOR19IX18KKworI2lmZGVmIE5FRURfUFJPVE9UWVBFUworCisjaWZuZGVmIF9fUExBWUVSX01PVklOR19IX1BST1RPX18gICAKKyNkZWZpbmUgX19QTEFZRVJfTU9WSU5HX0hfUFJPVE9fXworCisvLyBwcm90b3R5cGVzCisvLyBubyBwcm90b3R5cGVzCisKKyNlbmRpZiAvLyBfX1BMQVlFUl9NT1ZJTkdfSF9QUk9UT19fCisKKyNlbmRpZiAvLyBORUVEX1BST1RPWVBFUwpkaWZmIC0tZ2l0IGEvc3lzL3BsYXllci9wa2xvZy5oIGIvc3lzL3BsYXllci9wa2xvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNWFjYmEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvcGxheWVyL3BrbG9nLmgKQEAgLTAsMCArMSwxNSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHBsYXllci9wa2xvZy5oIC0tIG1vZHVsZSBmb3IgbG9nZ2luZyBwbGF5ZXIgdnMgcGxheWVyIGF0dGFja3MKKy8vCisvLyAkSWQ6IGNvbW0uaCx2IDMuMyAyMDAwLzAyLzA5IDE1OjU2OjI1IFBhZHJlaWMgRXhwICQKKworI2lmbmRlZiBfX1BMQVlFUl9QS0xPR19IX18KKyNkZWZpbmUgX19QTEFZRVJfUEtMT0dfSF9fCisKK25vbWFzayBpbnQgQ2hlY2tBcmVuYUZpZ2h0KG9iamVjdCB2aWN0aW0pOworbm9tYXNrIHByb3RlY3RlZCBpbnQgQ2hlY2tQbGF5ZXJBdHRhY2sob2JqZWN0IGF0dGFja2VyLCBvYmplY3QgdmljdGltLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBhbmdyaWZmc21zZyk7CisKKyNlbmRpZiAvLyBfX1BMQVlFUl9QS0xPR19IX18KKwpkaWZmIC0tZ2l0IGEvc3lzL3BsYXllci9wb3Rpb24uaCBiL3N5cy9wbGF5ZXIvcG90aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhiODFiMQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9wbGF5ZXIvcG90aW9uLmgKQEAgLTAsMCArMSwzNCBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHBsYXllci9wb3Rpb24uaCAtLSBwb3Rpb24gc2VydmljZXMKKy8vCisvLyAkSWQ6IHBvdGlvbi5oIDkxMTcgMjAxNS0wMS0yNSAxMToyNToxNFogWmVzc3RyYSAkCisKKyNpZm5kZWYgX19QTEFZRVJfUE9USU9OX0hfXworI2RlZmluZSBfX1BMQVlFUl9QT1RJT05fSF9fCisKKy8vIHByb3BlcnRpZXMKKworI2RlZmluZSBQX1BPVElPTlJPT01TICAgICAgICAgInBvdGlvbnJvb21zIgorI2RlZmluZSBQX0tOT1dOX1BPVElPTlJPT01TICAgImtub3duX3BvdGlvbnJvb21zIgorI2RlZmluZSBQX1RSQU5LX0ZJTkRFTiAgICAgICAgInRyYW5rX2ZpbmRlbiIKKworLy8gdmVyYWx0ZXRlIFByb3BzLCBsYW5nIHVuYmVudXR6dC4KKyNkZWZpbmUgUF9WSVNJVEVEX1BPVElPTlJPT01TICJ2aXNpdGVkX3BvdGlvbnJvb21zIgorI2RlZmluZSBQX0JPTlVTX1BPVElPTlMgICAgICAgImJvbnVzX3BvdGlvbnMiCisKKyNlbmRpZiAvLyBfX1BMQVlFUl9QT1RJT05fSF9fCisKKyNpZmRlZiBORUVEX1BST1RPVFlQRVMKKworI2lmbmRlZiBfX1BMQVlFUl9QT1RJT05fSF9QUk9UT19fCisjZGVmaW5lIF9fUExBWUVSX1BPVElPTl9IX1BST1RPX18gCisKKy8vIHByb3RvdHlwZXMKKwordmFyYXJncyBpbnQgRmluZFBvdGlvbihzdHJpbmcgcyk7CisKKyNlbmRpZiAvLyBfX1BMQVlFUl9QT1RJT05fSF9QUk9UT19fCisKKyNlbmRpZiAvLyBORUVEX1BST1RPWVBFUworCmRpZmYgLS1naXQgYS9zeXMvcGxheWVyL3F1ZXN0LmggYi9zeXMvcGxheWVyL3F1ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg3MGZjNwotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9wbGF5ZXIvcXVlc3QuaApAQCAtMCwwICsxLDI5IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gcGxheWVyL3F1ZXN0cy5oIC0tIHBsYXllciBxdWVzdCBoYW5kbGluZworLy8KKy8vICRJZDogcXVlc3QuaCx2IDMuMiAyMDAwLzAyLzA5IDE1OjU2OjI1IFBhZHJlaWMgRXhwICQKKyAKKyNpZm5kZWYgX19QTEFZRVJfUVVFU1RTX0hfXworI2RlZmluZSBfX1BMQVlFUl9RVUVTVFNfSF9fCisKKy8vIHByb3BlcnRpZXMKKworI2RlZmluZSBQX1FVRVNUUyAgICAgICAgICAgICAicXVlc3RzIgorI2RlZmluZSBQX1FQICAgICAgICAgICAgICAgICAicXVlc3Rwb2ludHMiCisKKyNlbmRpZiAvLyBfX1BMQVlFUl9RVUVTVFNfSF9fCisKKyNpZmRlZiBORUVEX1BST1RPVFlQRVMKKworI2lmbmRlZiBfX1BMQVlFUl9RVUVTVFNfSF9QUk9UT19fCisjZGVmaW5lIF9fUExBWUVSX1FVRVNUU19IX1BST1RPX18gCisKKy8vIHByb3RvdHlwZXMKKwordmFyYXJncyBpbnQgR2l2ZVF1ZXN0KHN0cmluZyBxdWVzdG5hbWUsIHN0cmluZyBtZXNzYWdlKTsKK2ludCBRdWVyeVF1ZXN0KHN0cmluZyBxdWVzdG5hbWUpOworCisjZW5kaWYgLy8gX19QTEFZRVJfUVVFU1RTX0hfUFJPVE9fXworCisjZW5kaWYgLy8gTkVFRF9QUk9UT1lQRVMKZGlmZiAtLWdpdCBhL3N5cy9wbGF5ZXIvc2tpbGxzLmggYi9zeXMvcGxheWVyL3NraWxscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NDNjYWQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvcGxheWVyL3NraWxscy5oCkBAIC0wLDAgKzEsMjUgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBza2lsbHMuaCAtLSBQcm90b3R5cGVuIGZ1ZXIgU2tpbGxmdW5rdGlvbiBhdXMgU3BpZWxlcm4uCisvLworLy8gJElkOiBza2lsbHMuaCA2NTU5IDIwMDctMTAtMjAgMTM6MDA6MjBaIFplc3N0cmEgJAorCisjaWZuZGVmIF9fUExBWUVSX1NLSUxMU19IX18KKyNkZWZpbmUgX19QTEFZRVJfU0tJTExTX0hfXworCisvLyBwcm9wZXJ0aWVzCisKKyNlbmRpZiAvLyBfX1BMQVlFUl9TS0lMTFNfSF9fCisKKyNpZmRlZiBORUVEX1BST1RPVFlQRVMKKworI2lmbmRlZiBfX1BMQVlFUl9TS0lMTFNfSF9QUk9UT19fCisjZGVmaW5lIF9fUExBWUVSX1NLSUxMU19IX1BST1RPX18KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLy8gcHJvdG90eXBlcworcHJvdGVjdGVkIHZvaWQgIHNldF93ZWFwb25fc2tpbGxzKCk7Citwcm90ZWN0ZWQgdm9pZCAgRml4U2tpbGxzKCk7Citwcm90ZWN0ZWQgdm9pZCAgSW5pdFNraWxscygpOworCisjZW5kaWYgLy8gX19QTEFZRVJfU0tJTExTX0hfUFJPVE9fXworI2VuZGlmIC8vIE5FRURfUFJPVE9ZUEVTCmRpZmYgLS1naXQgYS9zeXMvcGxheWVyL3RlbG5ldG5lZy5oIGIvc3lzL3BsYXllci90ZWxuZXRuZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTVlZDkwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL3BsYXllci90ZWxuZXRuZWcuaApAQCAtMCwwICsxLDE5IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gdGVsbmV0bmVnLmggLS0gRGVmaW5pdGlvbmVuIHVuZCBQcm90b3R5cGVzIGZ1ZXIgVGVsbmV0LU5lZ290aWF0aW9ucworLy8KKy8vICRJZDogdGVsbmV0bmVnLmggODM0OCAyMDEzLTAyLTAzIDIyOjE0OjM5WiBaZXNzdHJhICQKKworI2luY2x1ZGUgIi9zZWN1cmUvdGVsbmV0bmVnLmgiCisKKyNpZm5kZWYgX1RFTE5FVE5FR19IXworI2RlZmluZSBfVEVMTkVUTkVHX0hfCisKKyNlbmRpZgorCisjaWZkZWYgTkVFRF9QUk9UT1RZUEVTCisjaWZuZGVmIF9URUxORVRORUdfSF9QUk9UT1NfCisjZGVmaW5lIF9URUxORVRORUdfSF9QUk9UT1NfCisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9zeXMvcGxheWVyL3VzZXJfZmlsdGVyLmggYi9zeXMvcGxheWVyL3VzZXJfZmlsdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTllODAzNgotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9wbGF5ZXIvdXNlcl9maWx0ZXIuaApAQCAtMCwwICsxLDI3IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gcGxheWVyL3VzZXJfZmlsdGVyLmggLS0gdXNlcl9maWx0ZXJtb2R1bGUgcHJvdG90eXBlcy9wcm9wZXJ0aWVzCisvLworLy8gJElkOiBjb21tLmgsdiAzLjMgMjAwMC8wMi8wOSAxNTo1NjoyNSBQYWRyZWljIEV4cCAkCisKKyNpZm5kZWYgX19QTEFZRVJfVVNFUl9GSUxURVJfSF9fCisjZGVmaW5lIF9fUExBWUVSX1VTRVJfRklMVEVSX0hfXworCisvLyBwcm9wZXJ0aWVzCisKKyNlbmRpZiAvLyBfX1BMQVlFUl9VU0VSX0ZJTFRFUl9IX18KKworI2lmZGVmIE5FRURfUFJPVE9UWVBFUworCisjaWZuZGVmIF9fUExBWUVSX1VTRVJfRklMVEVSX0hfUFJPVE9fXworI2RlZmluZSBfX1BMQVlFUl9VU0VSX0ZJTFRFUl9IX1BST1RPX18KKworLy8gcHJvdG90eXBlcworCitwcm90ZWN0ZWQgaW50IGlzX2FjdGl2ZV9ndWlkZShvYmplY3Qgb2IpOworb2JqZWN0ICpmaWx0ZXJfdXNlcnMoc3RyaW5nIHN0cik7CisKKyNlbmRpZiAvLyBfX1BMQVlFUl9VU0VSX0ZJTFRFUl9IX1BST1RPX18KKworI2VuZGlmIC8vIE5FRURfUFJPVE9ZUEVTCisKZGlmZiAtLWdpdCBhL3N5cy9wbGF5ZXIvdXRpbC5oIGIvc3lzL3BsYXllci91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM3ZGM1ZgotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9wbGF5ZXIvdXRpbC5oCkBAIC0wLDAgKzEsMjUgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBzeXMvcGxheWVyL3V0aWwuaCAtLSBIZWFkZXJmaWxlIGZ1ZXIgL3N0ZC9wbGF5ZXIvdXRpbC5jCisvLworLy8gJElkOiB1dGlsLmgsdiAxLjEgMjAwNC8wNC8wOSAyMTowMjo0MSBWYW5pb24gRXhwICQKKworI2lmbmRlZiBfX1RISU5HX1VUSUxfSF9fCisjZGVmaW5lIF9fVEhJTkdfVVRJTF9IX18KKworI2VuZGlmIC8vIF9fVEhJTkdfVVRJTF9IX18KKworI2lmZGVmIE5FRURfUFJPVE9UWVBFUworCisjaWZuZGVmIF9fVEhJTkdfVVRJTF9IX1BST1RPX18KKyNkZWZpbmUgX19USElOR19VVElMX0hfUFJPVE9fXworCitwdWJsaWMgdm9pZCBTaG93UHJvcExpc3Qoc3RyaW5nICpwcm9wcyk7CitzdGF0aWMgdm9pZCBQcmV0dHlEdW1wKG1peGVkIHgpOworc3RhdGljIHZvaWQgRHVtcEFycmF5KG1peGVkICp4KTsKK3N0YXRpYyB2b2lkIER1bXBNYXBwaW5nKG1hcHBpbmcgeCk7CitzdGF0aWMgdm9pZCBEdW1wS2V5VmFsUGFpcihtYXBwaW5nIHgsIG1peGVkIGtleSwgaW50IHNpemUpOworCisjZW5kaWYgLy8gX19USElOR19VVElMX0hfUFJPVE9fXworCisjZW5kaWYgLy8gTkVFRF9QUk9UT1RZUEVTClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzL3BsYXllci92aWV3Y21kLmggYi9zeXMvcGxheWVyL3ZpZXdjbWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODJjY2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL3BsYXllci92aWV3Y21kLmgKQEAgLTAsMCArMSwyNyBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHBsYXllci92aWV3Y21kLmggLS0gdmlldyBjb21tYW5kIGhhbmRsaW5nCisvLworLy8gJElkOiB2aWV3Y21kLmggNjQwOCAyMDA3LTA4LTA3IDIzOjAyOjE4WiBaZXNzdHJhICQKKworI2lmbmRlZiBfX1BMQVlFUl9WSUVXQ01EX0hfXworI2RlZmluZSBfX1BMQVlFUl9WSUVXQ01EX0hfXworCisvLyBwcm9wZXJ0aWVzCisKKyNkZWZpbmUgUF9CTElORCAgICAgICAgICAgICAgImJsaW5kIgorI2RlZmluZSBQX0JSSUVGICAgICAgICAgICAgICAiYnJpZWYiCisKKyNlbmRpZiAvLyBfX1BMQVlFUl9WSUVXQ01EX0hfXworCisjaWZkZWYgTkVFRF9QUk9UT1RZUEVTCisKKyNpZm5kZWYgX19QTEFZRVJfVklFV0NNRF9IX1BST1RPX18gICAgIAorI2RlZmluZSBfX1BMQVlFUl9WSUVXQ01EX0hfUFJPVE9fXworCisvLyBwcm90b3R5cGVzCit2YXJhcmdzIHN0cmluZyBlbnZfZGVzY3IoaW50IGFsbG93X3Nob3J0LGludCBmbGFncywgaW50IGZvcmNlX3Nob3J0ICk7CisKKyNlbmRpZiAvLyBfX1BMQVlFUl9WSUVXQ01EX0hfUFJPVE9fXworCisjZW5kaWYgLy8gTkVFRF9QUk9UT1lQRVMKZGlmZiAtLWdpdCBhL3N5cy9wcm9wZXJ0aWVzLmggYi9zeXMvcHJvcGVydGllcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YmVjMzkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvcHJvcGVydGllcy5oCkBAIC0wLDAgKzEsNTAgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBwcm9wZXJ0aWVzLmggLS0gcHJvcGVydGllcyBoZWFkZXIgZmlsZQorLy8KKy8vICRJZDogcHJvcGVydGllcy5oIDcxNjkgMjAwOS0wMy0wOCAxODowOTo1M1ogWmVzc3RyYSAkCisgCisjaWZuZGVmIF9fUFJPUEVSVElFU19IX18KKyNkZWZpbmUgX19QUk9QRVJUSUVTX0hfXworCisjaWZkZWYgTkVFRF9QUk9UT1RZUEVTCisjdW5kZWYgTkVFRF9QUk9UT1RZUEVTCQkvLyB3ZSBuZWVkIG9ubHkgdGhlIHByb3BlcnRpZXMgaGVyZSEhCisjZGVmaW5lIFRNUF9ORUVEX1BST1RPVFlQRVMKKyNlbmRpZgorCisjaW5jbHVkZSA8c25vb3BpbmcuaD4KKyNpbmNsdWRlIDx0aGluZy5oPgorI2luY2x1ZGUgPGNsb3RoaW5nLmg+CisjaW5jbHVkZSA8YXJtb3VyLmg+CisjaW5jbHVkZSA8Y29udGFpbmVyLmg+CisjaW5jbHVkZSA8bGl2aW5nLmg+CisjaW5jbHVkZSA8bnBjLmg+CisjaW5jbHVkZSA8cGxheWVyLmg+CisjaW5jbHVkZSA8cm9vbXMuaD4KKyNpbmNsdWRlIDxzaGVsbHMuaD4KKyNpbmNsdWRlIDx3ZWFwb24uaD4KKyNpbmNsdWRlIDx0cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDxsaWdodHNvdXJjZS5oPgorI2luY2x1ZGUgPHF1ZXN0X2l0ZW1zLmg+CisjaW5jbHVkZSA8bW92aW5nLmg+CisKKyNpZmRlZiBUTVBfTkVFRF9QUk9UT1RZUEVTCisjdW5kZWYgVE1QX05FRURfUFJPVE9UWVBFUworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNlbmRpZgorCisjZGVmaW5lIFBfT1JJR19OQU1FICAgICAgIm9yaWdpbmFsX25hbWUiCisjZGVmaW5lIFBfT1JJR19GSUxFX05BTUUgIm9yaWdpbmFsX2ZpbGVfbmFtZSIKKworI2RlZmluZSBQX0NBUF9OQU1FICJjYXBfbmFtZSIKKyNkZWZpbmUgUF9FQVJNVUZGUyAiZWFybXVmZnMiCisjZGVmaW5lIFBfVkFMVUVfUEVSX1VOSVQgInZhbHVlX3Blcl91bml0IgorI2RlZmluZSBQX1dFSUdIVF9QRVJfVU5JVCAid2VpZ2h0X3Blcl91bml0IgorI2RlZmluZSBQX0ZXX1VOREVSU1RBTkQgImZ3X3VuZGVyc3RhbmQiIC8qIGthbm4gZGllIHNwcmFjaGUgYXVzIGZlcm53ZXN0ICovCisjZGVmaW5lIFBfVFJBWSAidHJheSIgLyogbWFuIGthbm4gd2FzIGF1ZiB1bnMgZHJhdWZsZWdlbiAqLworI2RlZmluZSBQX0FNT1VOVCAiYW1vdW50IgorI2RlZmluZSBQX0hQX0hPT0tTICJocF9ob29rcyIKKworI2RlZmluZSBQX0lORk9STU1FICJpbmZvcm1tZSIKKworI2VuZGlmIC8vIF9fUFJPUEVSVElFU19IX18KZGlmZiAtLWdpdCBhL3N5cy9wdWIuaCBiL3N5cy9wdWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWZlOWRiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL3B1Yi5oCkBAIC0wLDAgKzEsODAgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBwdWIuaCAtLSBIZWFkZXJmaWxlIGZvciBwdWJzIGFuZCBwdWJtYXN0ZXIKKy8vCisvLyAkSWQ6IHB1Yi5oIDQ0OTQgMjAwNi0wOS0yMyAxMDoxNDozNlogcm9vdCAkCisKKyNpZm5kZWYgX1BVQl9IXworI2RlZmluZSBfUFVCX0hfCisKKy8qIERlciBQdWJtYXN0ZXIgKi8KKyNkZWZpbmUgUFVCTUFTVEVSICIvc2VjdXJlL3B1Ym1hc3RlciIKKworLyogV2VydGUgZnVlciBkaWUgS25laXBlbmZvcm1lbDoKKworICBBbGMqQWxjZGVsYXkrRHJpbmsqRHJpbmtkZWxheStGb29kKkZvb2RkZWxheSAgICAgICAgIFZhbHVlCisoIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICArICAtLS0tLS0tLS0tLS0tCisgICAgICAgICAgQWxjZGVsYXkrRHJpbmtkZWxheStGb29kZGVsYXkgICAgICAgICAgICBWQUxVRURJVitSYXRlCisKKyAgICAgICAgIFJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWxheQorICAgZXhwKC0tLS0tLS0tKSAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cCgtLS0tLS0tLSkKKyAgICAgICBSQVRFRElWMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0FJVERJVjEKKy0gIC0tLS0tLS0tLS0tLS0gKSAqIEZhY3RvciAqICggV0FJVE9GRlMgKyAtLS0tLS0tLS0tLS0tLS0gKQorICAgICBSQVRFRElWMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdBSVRESVYyCisKKyovCisKKyNkZWZpbmUgUFVCX1NPQUtNVUxUIDE4LjAKKyNkZWZpbmUgUFVCX1ZBTFVFRElWIDEwLjAKKyNkZWZpbmUgUFVCX1JBVEVESVYxICAzLjUKKyNkZWZpbmUgUFVCX1JBVEVESVYyICAyLjUKKyNkZWZpbmUgUFVCX1dBSVRPRkZTICAwLjkKKyNkZWZpbmUgUFVCX1dBSVRESVYxIDEwLjAKKyNkZWZpbmUgUFVCX1dBSVRESVYyICA3LjUKKyNkZWZpbmUgUFVCX01BWERFTEFZIDE1LjAKKworLyogUHJvcGVydGllcyAqLworCisvLyBOUENzIHRhbmtlbiBoaWVyIGF1ZiBkaWUgInNjaG5lbGxlIiBBcnQKKyNkZWZpbmUgUF9OUENfRkFTVEhFQUwgICAgIm5wY19mYXN0aGVhbCIKKworLy8gS2VpbmUgU3RhbmRhcmQtR2V0cmFlbmtlCisjZGVmaW5lIFBfTk9fU1REX0RSSU5LICAgICJub19zdGRfZHJpbmsiCisKKy8vIE1lbGR1bmcsIHdlbm4gZXR3YXMgbmljaHQgbWVociB2b3JoYW5kZW4gaXN0CisjZGVmaW5lIFBfUFVCX1VOQVZBSUxBQkxFICJwdWJfdW5hdmFpbGFibGUiCisKKy8vIE1lbGR1bmcsIHdlbm4gZXR3YXMgbmljaHQgaW0gTWVudWUgc3RlaHQKKyNkZWZpbmUgUF9QVUJfTk9UX09OX01FTlUgInB1Yl9ub3Rfb25fbWVudSIKKworLy8gTWVsZHVuZywgd2VubiBTcGllbGVyIG5pY2h0IGdlbnVnIEdlbGQgaGF0CisjZGVmaW5lIFBfUFVCX05PX01PTkVZICAgICJwdWJfbm9fbW9uZXkiCisKKy8vIE1lbGR1bmcsIHdlbm4gZGVyIEJhcmtlZXBlciBuaWNodCBhbndlc2VuZCBpc3QKKyNkZWZpbmUgUF9QVUJfTk9fS0VFUEVSICAgInB1Yl9ub19rZWVwZXIiCisKKy8qIFNvbnN0aWdlIERlZmluZXMgKi8KKworLy8gSW5kaWNlcyBmdWVyIGRhcyBNZW51ZS1NYXBwaW5nCisjZGVmaW5lIFBNX1RFWFQgICAgICAwCisjZGVmaW5lIFBNX0lORk8gICAgICAxCisjZGVmaW5lIFBNX1JBVEUgICAgICAyCisjZGVmaW5lIFBNX1NFUlZFX01TRyAzCisjZGVmaW5lIFBNX1JFRlJFU0ggICA0CisjZGVmaW5lIFBNX0RFTEFZICAgICA1CisjZGVmaW5lIFBNX0RFTEFZX01TRyA2CisjZGVmaW5lIFBNX0lEUyAgICAgICA3CisKKy8vIEtleXMgZnVlciBkZW4gUmVmcmVzaC1QYXJhbWV0ZXIKKyNkZWZpbmUgUFJfQUxMICAgICAgICJBbGwiCisjZGVmaW5lIFBSX1VTRVIgICAgICAiVXNlciIKKworLy8gRGVmYXVsdC1EZWZpbmVzIGZ1ZXIgZGVuIEF2YWlsYWJpbGl0eS1DaGVjaworI2RlZmluZSBQUl9ERUZBVUxUICAgIkRFRiIKKyNkZWZpbmUgUFJfTk9ORSAgICAgICJOL0EiCisKKy8vIEluZGljZXMgZnVlciBkZW4gUmVmcmVzaC1QYXJhbWV0ZXIKKyNkZWZpbmUgUFJWX0FNT1VOVCAgIDAKKyNkZWZpbmUgUFJWX1JFRlJFU0ggIDEKKworI2VuZGlmIC8vIF9QVUJfSF8KZGlmZiAtLWdpdCBhL3N5cy9xdWVzdF9pdGVtcy5oIGIvc3lzL3F1ZXN0X2l0ZW1zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZkOTZjZgotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9xdWVzdF9pdGVtcy5oCkBAIC0wLDAgKzEsMTggQEAKKy8qCisgKiBRVUVTVF9JVEVNUy5IIC0tIGlkZW50aWZpZXMgcXVlc3QgaXRlbXMKKyAqCisgKiAkTG9nOiBxdWVzdF9pdGVtcy5oLHYgJAorICogUmV2aXNpb24gMS4xICAyMDAzLzEyLzMwIDEyOjQxOjE0ICBWYW5pb24KKyAqIEluaXRpYWwgcmV2aXNpb24KKyAqCisgKiBSZXZpc2lvbiAxLjAgIDE5OTcvMDEvMjAgMTU6MzM6NDcgIG11ZAorICogSW5pdGlhbCByZXZpc2lvbgorICoKKyAqLworCisjaWZuZGVmIF9fX1FVRVNUX0lURU1TX0hfXworI2RlZmluZSBfX19RVUVTVF9JVEVNU19IX18KKworI2RlZmluZSBQX1FVRVNUX0lURU0JInF1ZXN0X2l0ZW0iCisKKyNlbmRpZiAvLyBfX1FVRVNUX0lURU1TX0hfXwpkaWZmIC0tZ2l0IGEvc3lzL3JhbmdlZF93ZWFwb24uaCBiL3N5cy9yYW5nZWRfd2VhcG9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBiY2Q5YgotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9yYW5nZWRfd2VhcG9uLmgKQEAgLTAsMCArMSwyNiBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHJhbmdlZF93ZWFwb24uaCAtLSBIZWFkZXJmaWxlIGZ1ZXIgRmVybmthbXBmd2FmZmVuCisvLworLy8gJElkOiByYW5nZWRfd2VhcG9uLmggOTAxNiAyMDE1LTAxLTEwIDE4OjI5OjI2WiBaZXNzdHJhICQKKworI2lmbmRlZiBfX1JBTkdFRF9XRUFQT05fSF9fCisjZGVmaW5lIF9fUkFOR0VEX1dFQVBPTl9IX18KKworLy8gUHJvcGVydGllcworCisjZW5kaWYgLy8gX19SQU5HRURfV0VBUE9OX0hfXworCisjaWZkZWYgTkVFRF9QUk9UT1RZUEVTCisKKyNpZm5kZWYgX19SQU5HRURfV0VBUE9OX0hfUFJPVE9fXworI2RlZmluZSBfX1JBTkdFRF9XRUFQT05fSF9QUk9UT19fCisKKy8vIFByb3RvdHlwZXMKK3N0YXRpYyBpbnQgc2hvb3RfZGFtKG1hcHBpbmcgc2hvb3QpOworc3RhdGljIHN0cmluZyBGaW5kUmFuZ2VkVGFyZ2V0KHN0cmluZyBzdHIsIG1hcHBpbmcgc2hvb3QpOworc3RhdGljIGludCBjbWRfc2hvb3Qoc3RyaW5nIHN0cik7CisKKyNlbmRpZiAvLyBfX1JBTkdFRF9XRUFQT05fSF9QUk9UT19fCisKKyNlbmRpZiAvLyBORUVEX1BST1RPVFlQRVMKZGlmZiAtLWdpdCBhL3N5cy9yZWdleHAuaCBiL3N5cy9yZWdleHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzBmMTBjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL3JlZ2V4cC5oCkBAIC0wLDAgKzEsNDIgQEAKKyNpZm5kZWYgTFBDX1JFR0VYUF9IXworI2RlZmluZSBMUENfUkVHRVhQX0hfIDEKKworLyogRGVmaW5pdGlvbnMgb2YgcmVnZXhwIG9wdGlvbiB2YWx1ZXMgKi8KKworLyogTm90IHJlYWxseSBhbiBSRSBvcHRpb24sIGJ1dCB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggc29tZSBSRSBmdW5jdGlvbnM6ICovCisKKyNkZWZpbmUgUkVfR0xPQkFMICAgICAgICAgIDB4MDAwMSAgLyogQXBwbHkgUkUgZ2xvYmFsbHkgKGlmIHBvc3NpYmxlKSAqLworCisvKiBPcHRpb25zIHN1cHBvcnRlZCBieSB0aGUgb2xkIHJlZ2V4cCBwYWNrYWdlOiAqLworCisjZGVmaW5lIFJFX0VYQ09NUEFUSUJMRSAgICAweDAwMDIgIC8qIFJFIGlzIGNvbXBhdGlibGUgd2l0aCBleCAqLworCisvKiBPcHRpb25zIHN1cHBvcnRlZCBieSB0aGUgUENSRSByZWdleHAgcGFja2FnZTogKi8KKworI2RlZmluZSBSRV9DQVNFTEVTUyAgICAgICAgMHgwMDA0CisjZGVmaW5lIFJFX01VTFRJTElORSAgICAgICAweDAwMDgKKyNkZWZpbmUgUkVfRE9UQUxMICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBSRV9FWFRFTkRFRCAgICAgICAgMHgwMDIwCisjZGVmaW5lIFJFX0FOQ0hPUkVEICAgICAgICAweDAwNDAKKyNkZWZpbmUgUkVfRE9MTEFSX0VORE9OTFkgIDB4MDA4MAorI2RlZmluZSBSRV9OT1RCT0wgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFJFX05PVEVPTCAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgUkVfVU5HUkVFRFkgICAgICAgIDB4MDQwMAorI2RlZmluZSBSRV9OT1RFTVBUWSAgICAgICAgMHgwODAwCisKKy8qIE9wdGlvbnMgc3BlY2lmaWMgZm9yIHJlZ21hdGNoKCk6ICovCisKKyNkZWZpbmUgUkVfTUFUQ0hfU1VCUyAgICAgIDB4MTAwMCAgLyogUmV0dXJuIG1hdGNoZWQgc3ViZXhwcmVzc2lvbnMgKi8KKworLyogT3B0aW9ucyBzcGVjaWZpYyBmb3IgcmVnZXhwbG9kZSgpOiAqLworCisjZGVmaW5lIFJFX09NSVRfREVMSU0gICAgICAweDEwMDAgIC8qIE9taXQgdGhlIGRlbGltaXRlcnMgKi8KKworLyogUmVnZXhwIHBhY2thZ2Ugc2VsZWN0aW9uIG9wdGlvbnM6ICovCisKKyNkZWZpbmUgUkVfVFJBRElUSU9OQUwgICAgIDB4MDQwMDAwMDAKKyNkZWZpbmUgUkVfUENSRSAgICAgICAgICAgIDB4MDIwMDAwMDAKKworI2RlZmluZSBSRV9QQUNLQUdFX01BU0sgICAgKFJFX1RSQURJVElPTkFMIHwgUkVfUENSRSkKKworI2VuZGlmIC8qIExQQ19SRUdFWFBfSF8gKi8KZGlmZiAtLWdpdCBhL3N5cy9yZXB1dGF0aW9uLmggYi9zeXMvcmVwdXRhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NmIyZDgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvcmVwdXRhdGlvbi5oCkBAIC0wLDAgKzEsMzIgQEAKKyNpZm5kZWYgX1JFUFVUQVRJT05fSF8KKyNkZWZpbmUgX1JFUFVUQVRJT05fSF8KKworI2RlZmluZSBSRVBNQVNURVIgICAgICAgICIvc2VjdXJlL3JlcG1hc3RlciIKKyNkZWZpbmUgUkVQX1NBVkVGSUxFICAgICAiL3NlY3VyZS9BUkNIL3JlcG1hc3RlciIKKworLy8gR3Jlbnp3ZXJ0ZQorI2RlZmluZSBSRVBfTUFYSU1VTSAgICAgIDEwMDAwCisjZGVmaW5lIFJFUF9NSU5JTVVNICAgICAtMTAwMDAKKworLy8gWndpc2NoZW5zdHVmZW4KKyNkZWZpbmUgUkVQX1RSVVNURUQgICAgICA3NTAwCisjZGVmaW5lIFJFUF9MSUtFRCAgICAgICAgNTAwMAorI2RlZmluZSBSRVBfRkFNSUxJQVIgICAgIDI1MDAKKyNkZWZpbmUgUkVQX05FVVRSQUwgICAgICAwCisjZGVmaW5lIFJFUF9VTkZBTUlMSUFSICAtMjUwMAorI2RlZmluZSBSRVBfRElTTElLRUQgICAgLTUwMDAKKyNkZWZpbmUgUkVQX0RJU1RSVVNURUQgIC03NTAwCisKKy8vIFJldHVybmNvZGVzCisjZGVmaW5lIFJFUF9SRVRfV1JPTkdBUkdTICAtMSAvLyBGYWxzY2hlIEFyZ3VtZW50ZSBmdWVyIENoYW5nZVJlcCgpCisjZGVmaW5lIFJFUF9SRVRfSU5WQUxJRFVJRCAtMiAvLyBVbnp1bGFlc3NpZ2UgVUlECisjZGVmaW5lIFJFUF9SRVRfQUxSRUFEWU1BWCAtMyAvLyBSZXB1dGF0aW9uIGJlcmVpdHMgTWF4IC8gTWluCisjZGVmaW5lIFJFUF9SRVRfSU5BQ1RJVkUgICAtNCAvLyBSZXB1dGF0aW9uIGF1ZiBpbmFrdGl2IGdlc2V0enQKKyNkZWZpbmUgUkVQX1JFVF9JTlZBTElEUkVQIC01IC8vIFJlcHV0YXRpb24gbmljaHQgdm9yaGFuZGVuCisjZGVmaW5lIFJFUF9SRVRfU1VDQ0VTUyAgICAgMSAvLyBSZXB1dGF0aW9uIHd1cmRlIHZlcmFlbmRlcnQKKyNkZWZpbmUgUkVQX1JFVF9TVUNDRVNTQ1VUICAyIC8vIFJlcHV0YXRpb24gd3VyZGUgYXVmIE1pbiAvIE1heCB2ZXJhZW5kZXJ0CisKKy8vIEZsYWdzIGZ1ZXIgZGllIEVpbnRyYWVnZSBpbSBNYXN0ZXIKKyNkZWZpbmUgUkVQX0ZMQUdfQUNUSVZFICAgICAxCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzL3Jvb20vZGVzY3JpcHRpb24uaCBiL3N5cy9yb29tL2Rlc2NyaXB0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU3MTM0MQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9yb29tL2Rlc2NyaXB0aW9uLmgKQEAgLTAsMCArMSw1MSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHJvb20vZGVzY3JpcHRpb24uaCAtLSBzdGFuZGFyZCByb29tIGhlYWRlcgorLy8KKy8vICRJZDogZGVzY3JpcHRpb24uaCA5MTkwIDIwMTUtMDQtMDIgMTQ6Mjk6MzZaIEFyYXRob3JuICQKKyAKKyNpZm5kZWYgX19ST09NX0RFU0NSSVBUSU9OX0hfXworI2RlZmluZSBfX1JPT01fREVTQ1JJUFRJT05fSF9fCisKKy8vIHByb3BlcnRpZXMKKworI2RlZmluZSBQX0lOVF9TSE9SVCAgICAgICAgICAiaW50X3Nob3J0IgorI2RlZmluZSBQX0lOVF9MT05HICAgICAgICAgICAiaW50X2xvbmciCisKKyNkZWZpbmUgUF9ST09NX01TRyAgICAgICAgICAgInJvb21fbXNnIgorI2RlZmluZSBQX0ZVTkNfTVNHICAgICAgICAgICAiZnVuY19tc2ciCisjZGVmaW5lIFBfTVNHX1BST0IgICAgICAgICAgICJtc2dfcHJvYiIKKworI2RlZmluZSBQX0hBVVNfRVJMQVVCVCAgICAgICAiaGF1c19lcmxhdWJ0IgorCisjZGVmaW5lIFBfTk9fVFBPUlQgICAgICAgICAgICJ0cG9ydCIKKyNkZWZpbmUgUF9UUE9SVF9DT1NUX0lOICAgICAgInRwb3J0X2Nvc3RfaW4iCisjZGVmaW5lIFBfVFBPUlRfQ09TVF9PVVQgICAgICJ0cG9ydF9jb3N0X291dCIKKyNkZWZpbmUgUF9JTkRPT1JTICAgICAgICAgICAgImluZG9vcnMiCisKKyNkZWZpbmUgUF9ORVZFUl9DTEVBTiAgICAgICAgIiBuZXZlciBjbGVhbiAiCisjZGVmaW5lIFBfUk9PTV9UWVBFICAgICAgICAgICJyb29tX3R5cGUiCisjZGVmaW5lIFBfTk9fUExBWUVSUyAgICAgICAgICJub19wbGF5ZXJzIgorCisjZGVmaW5lIFBfTk9fUEFSQV9UUkFOUyAgICAgICJub19wYXJhX3RyYW5zIgorI2RlZmluZSBQX0tFRVBFUiAgICAgICAgICAgICAic2hvcF9rZWVwZXIiICAgIC8vIEVpZ2VudHVlbWVyIHZvbiBQdWIgb2RlciBTaG9wCisjZGVmaW5lIFBfQlVZX09OTFlfUExBTlRTICAgICJsaWJfcF9idXlfb25seV9wbGFudHMiCisjZGVmaW5lIFBfT1JBS0VMICAgICAgICAgICAgICJvcmFrZWwiCisKKyNkZWZpbmUgUF9MSUdIVF9BQlNPUlBUSU9OICAgImxpZ2h0X2Fic29ycHRpb24iIC8vIExpY2h0IGRhcyBkZXIgUmF1bSBzY2hsdWNrdAorCisjZGVmaW5lIFBfRE9NQUlOICAgICAgICAgICAgICJsaWJfcF9kb21haW4iICAgLy8gRG9tYWluLCBpbiBkZXIgZGVyIFJhdW0gaXN0LgorCisjZW5kaWYgLy8gX19ST09NX0RFU0NSSVBUSU9OX0hfXworCisjaWZkZWYgTkVFRF9QUk9UT1RZUEVTCisKKyNpZm5kZWYgX19ST09NX0RFU0NSSVBUSU9OX0hfUFJPVE9fXworI2RlZmluZSBfX1JPT01fREVTQ1JJUFRJT05fSF9QUk9UT19fCisKKy8vIHByb3RvdHlwZXMKKy8vIG5vIHByb3RvdHlwZXMKKworI2VuZGlmIC8vIF9fUk9PTV9ERVNDUklQVElPTl9IX1BST1RPX18KKworI2VuZGlmCS8vIE5FRURfUFJPVE9ZUEVTCmRpZmYgLS1naXQgYS9zeXMvcm9vbS9leGl0cy5oIGIvc3lzL3Jvb20vZXhpdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2YwODk2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL3Jvb20vZXhpdHMuaApAQCAtMCwwICsxLDQyIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gcm9vbS9leGl0cy5oIC0tIGV4aXQgc3BlY2lmaWMgZGVmaW5lcworLy8KKy8vICRJZDogZXhpdHMuaCA5NDc3IDIwMTYtMDItMTkgMjE6MTc6NTFaIFplc3N0cmEgJAorCisjaWZuZGVmIF9fUk9PTV9FWElUU19IX18KKyNkZWZpbmUgX19ST09NX0VYSVRTX0hfXworCisvLyBQcm9wZXJ0aWVzCisKKyNkZWZpbmUgUF9FWElUUyAgICAgICAgICAgICAgImV4aXRzIgorI2RlZmluZSBQX1NQRUNJQUxfRVhJVFMgICAgICAic3BlY2lhbF9leGl0cyIKKyNkZWZpbmUgUF9ISURFX0VYSVRTICAgICAgICAgImhpZGVfZXhpdHMiCisKKyNkZWZpbmUgUF9CTE9DS19NU0cgICAgICAgICAgImJsb2NrX21zZyIKKworI2VuZGlmIC8vIF9fUk9PTV9FWElUU19IX18KKworLy8gUHJvdG90eXBlcworI2lmZGVmIE5FRURfUFJPVE9UWVBFUworCisjaWZuZGVmIF9fUk9PTV9FWElUU19IX1BST1RPX18KKyNkZWZpbmUgX19ST09NX0VYSVRTX0hfUFJPVE9fXworCitzdGF0aWMgbWFwcGluZyBfc2V0X2V4aXRzKG1hcHBpbmcgbWFwX2xkZmllZCkgOworc3RhdGljIG1hcHBpbmcgX3F1ZXJ5X2V4aXRzKCk7CitzdGF0aWMgaW50IF9zZXRfc3BlY2lhbF9leGl0cyhtYXBwaW5nIG1hcF9sZGZpZWQpOworc3RhdGljIG1hcHBpbmcgX3F1ZXJ5X3NwZWNpYWxfZXhpdHMoKTsKK3N0YXRpYyBzdHJpbmcgX01ha2VQYXRoKHN0cmluZyBzdHIpOwordm9pZCBBZGRFeGl0KHN0cmluZ3xzdHJpbmcqIGNtZCwgY2xvc3VyZXxzdHJpbmcgZGVzdCk7Citwcm90ZWN0ZWQgdm9pZCBfQWRkRXhpdChzdHJpbmd8c3RyaW5nKiBjbWQsIHN0cmluZ3xjbG9zdXJlIHJvb20sCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbWVzc2FnZSk7Cit2b2lkIFJlbW92ZUV4aXQoc3RyaW5nfHN0cmluZyogY21kKTsKK3ZvaWQgQWRkU3BlY2lhbEV4aXQoc3RyaW5nfHN0cmluZyogY21kLCBzdHJpbmd8Y2xvc3VyZSBmdW5jdGlvbm5hbWUpOwordm9pZCBSZW1vdmVTcGVjaWFsRXhpdChzdHJpbmd8c3RyaW5nKiBjbWQpOwordmFyYXJncyBzdHJpbmcgR2V0RXhpdHMoIG9iamVjdCB2aWV3ZXIgKTsKK2ludCBfbm9ybWFsZnVuY3Rpb24oKTsKKworI2VuZGlmIC8vIF9fUk9PTV9FWElUU19IX1BST1RPX18KKworI2VuZGlmIC8vIE5FRURfUFJPVE9UWVBFUwpkaWZmIC0tZ2l0IGEvc3lzL3Jvb21zLmggYi9zeXMvcm9vbXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTUxMDM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL3Jvb21zLmgKQEAgLTAsMCArMSw2MyBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHJvb21zLmggLS0gc3RhbmRhcmQgcm9vbSBoZWFkZXIKKy8vCisvLyAkSWQ6IHJvb21zLmggODQyNSAyMDEzLTAyLTIzIDE4OjQ5OjA5WiBaZXNzdHJhICQKKworI2lmbmRlZiBfX1JPT01fSF9fCisjZGVmaW5lIF9fUk9PTV9IX18KKworI2luY2x1ZGUgPHJvb20vZGVzY3JpcHRpb24uaD4KKyNpbmNsdWRlIDxyb29tL2V4aXRzLmg+CisjaW5jbHVkZSA8ZG9vcnJvb20uaD4KKworLy8gcHJvcGVydGllcworLy8gRmxhZ3MgZnVlciBFaW5zY2hyYWVua3VuZyBkZXIgRGF0ZW4gZnVlciBNYXBwaW5nendlY2tlIGFuIGRlbiBDbGllbnQKKyNkZWZpbmUgUF9NQVBfUkVTVFJJQ1RJT05TICAibGliX3BfbWFwX3Jlc3RyaWN0aW9ucyIKKworLy8gcmFpc2UgZXJyb3IgbWVzc2FnZQorI2RlZmluZSBBZGREb29yKGEsYixjLGQsZSxmKSByYWlzZV9lcnJvcigiVXNlIE5ld0Rvb3IgaW5zdGVhZCBvZiBBZGREb29yIVxuIikKKyNkZWZpbmUgQWRkRG9vcjIoYSxiLGMsZCxlLGYsZykgcmFpc2VfZXJyb3IoIlVzZSBOZXdEb29yIGluc3RlYWQgb2YgQWRkRG9vcjIhXG4iKQorI2RlZmluZSBBZGRSb29tQ21kKGEsYikgcmFpc2VfZXJyb3IoIlVzZSBBZGRDbWQgaW5zdGVhZCBvZiBBZGRSb29tQ21kIVxuIikKKyNkZWZpbmUgUmVtb3ZlUm9vbUNtZChhLGIpIHJhaXNlX2Vycm9yKCJVc2UgUmVtb3ZlQ21kIGluc3RlYWQgb2YgUmVtb3ZlUm9vbUNtZCFcbiIpCisvLyBkZWZpbmVzCisKKy8qIGVudHJpZXMgaW4gaXRlbSBhcnJheSAqLworI2RlZmluZSBSSVRFTV9PQkpFQ1QgIDAKKyNkZWZpbmUgUklURU1fRklMRSAgICAxCisjZGVmaW5lIFJJVEVNX1JFRlJFU0ggMgorI2RlZmluZSBSSVRFTV9QUk9QUyAgIDMKKworLyogcmVmcmVzaCBmb3IgZXh0cmEgaXRlbXMgKi8KKyNkZWZpbmUgUkVGUkVTSF9OT05FICAgICAgMAorI2RlZmluZSBSRUZSRVNIX0RFU1RSVUNUICAxCisjZGVmaW5lIFJFRlJFU0hfUkVNT1ZFICAgIDIKKyNkZWZpbmUgUkVGUkVTSF9BTFdBWVMgICAgMworI2RlZmluZSBSRUZSRVNIX01PVkVfSE9NRSA0CisKKy8qIHZhbHVlcyBmb3IgdGVsZXBvcnQgZm9yYmlkIHByb3BlcnR5ICovCisjZGVmaW5lIFRQT1JUX0lOICAgMQorI2RlZmluZSBUUE9SVF9PVVQgIDIKKyNkZWZpbmUgVFBPUlRfQk9USCAoVFBPUlRfSU4gfCBUUE9SVF9PVVQpCisKKy8qIHZhbHVlcyBmb3IgZGlmZmVyZW50IHJvb210eXBlcyAqLworI2RlZmluZSBSVF9TSE9QICAgIDEKKyNkZWZpbmUgUlRfUFVCICAgICAyCisKKy8vIFdlcnRlIGZ1ZXIgUF9NQVBfUkVTVFJJQ1RJT05TCisjZGVmaW5lIE1SX05PVUlEICAweDEKKyNkZWZpbmUgTVJfTk9JTkZPIDB4MgorCisjZW5kaWYgLy8gX19ST09NX0hfXworCisjaWZkZWYgTkVFRF9QUk9UT1RZUEVTCisKKyNpZm5kZWYgX19ST09NX0hfUFJPVE9fXworI2RlZmluZSBfX1JPT01fSF9QUk9UT19fCisKKy8vIHByb3RvdHlwZXMKKy8vIG5vIHByb3RvdHlwZXMKKworI2VuZGlmIC8vIF9fUk9PTV9IX1BST1RPX18KKworI2VuZGlmCS8vIE5FRURfUFJPVE9ZUEVTCmRpZmYgLS1naXQgYS9zeXMvcm91dGluZ2QuaCBiL3N5cy9yb3V0aW5nZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MzA2NzkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvcm91dGluZ2QuaApAQCAtMCwwICsxLDE1IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gcm91dGluZ2QuaCAtLSBEZWZpbml0aW9uZW4gZnVlciBkZW4gUm91dGluZ0RhZW1vbgorLy8KKy8vICRJZDogcm91dGluZ2QuaCx2IDMuMSAxOTk3LzAyLzEyIDEzOjA0OjU5IFdhcmdvbiBFeHAgJAorCisjaWZuZGVmIF9ST1VUSU5HRF9IXworI2RlZmluZSBfUk9VVElOR0RfSF8KKworI2RlZmluZSBST1VURVIgIi9wL2RhZW1vbi9yb3V0aW5nZCIKKworI2RlZmluZSBUQVJHRVRfUFVCICIjI3B1YiIKKyNkZWZpbmUgVEFSR0VUX1NIT1AgIiMjc2hvcCIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXMvcnRsaW1pdHMuaCBiL3N5cy9ydGxpbWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMzZhYTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvcnRsaW1pdHMuaApAQCAtMCwwICsxLDM5IEBACisjaWZuZGVmIExQQ19SVExJTUlUU19IXworI2RlZmluZSBMUENfUlRMSU1JVFNfSF8KKworLyogUnVudGltZSBsaW1pdCBpbmRleC90YWcgdmFsdWVzICovCisKKyNkZWZpbmUgTElNSVRfRVZBTCAgICAgICAgICAgKDApCisjZGVmaW5lIExJTUlUX0FSUkFZICAgICAgICAgICgxKQorI2RlZmluZSBMSU1JVF9NQVBQSU5HICAgICAgICAoMikKKyNkZWZpbmUgTElNSVRfTUFQUElOR19LRVlTICAgTElNSVRfTUFQUElORworI2RlZmluZSBMSU1JVF9NQVBQSU5HX1NJWkUgICAoMykKKyNkZWZpbmUgTElNSVRfQllURSAgICAgICAgICAgKDQpCisjZGVmaW5lIExJTUlUX0ZJTEUgICAgICAgICAgICg1KQorI2RlZmluZSBMSU1JVF9DQUxMT1VUUyAgICAgICAoNikKKyNkZWZpbmUgTElNSVRfQ09TVCAgICAgICAgICAgKDcpCisjZGVmaW5lIExJTUlUX01FTU9SWSAgICAgICAgICg4KQorCisjZGVmaW5lIExJTUlUX01BWCAgICAgICg5KSAgLyogTnVtYmVyIG9mIHJlY29nbml6ZWQgbGltaXRzICovCisKKy8qIFNwZWNpYWwgbGltaXQgdmFsdWVzICovCisKKyNkZWZpbmUgTElNSVRfVU5MSU1JVEVEICAgIDAgICAvKiBObyBsaW1pdCAqLworI2RlZmluZSBMSU1JVF9LRUVQICAgICAgICgtMSkgIC8qIEtlZXAgdGhlIG9sZCBsaW1pdCBzZXR0aW5nICovCisjZGVmaW5lIExJTUlUX0RFRkFVTFQgICAgKC0yKSAgLyogVXNlIHRoZSBkZWZhdWx0IHNldHRpbmcgKi8KKworLyogbWVtb3J5IGxpbWl0cyAqLworI2RlZmluZSBNQUxMT0NfU09GVF9MSU1JVCAgICAxCisjZGVmaW5lIE1BTExPQ19IQVJEX0xJTUlUICAgIDIKKworLyogbG93IG1lbW9yeSBjb25kaXRpb25zICovCisjZGVmaW5lIE5PX01BTExPQ19MSU1JVF9FWENFRURFRCAgICAgMAorI2RlZmluZSBTT0ZUX01BTExPQ19MSU1JVF9FWENFRURFRCAgIE1BTExPQ19TT0ZUX0xJTUlUCisjZGVmaW5lIEhBUkRfTUFMTE9DX0xJTUlUX0VYQ0VFREVEICAgTUFMTE9DX0hBUkRfTElNSVQKKworLyogRmxhZ3MgZm9yIGF2YWlsYWJsZSByZXNlcnZlcyAqLworI2RlZmluZSBVU0VSX1JFU0VSVkVfQVZBSUxBQkxFICAgICAweDEKKyNkZWZpbmUgTUFTVEVSX1JFU0VSVkVfQVZBSUxBQkxFICAgMHgyCisjZGVmaW5lIFNZU1RFTV9SRVNFUlZFX0FWQUlMQUJMRSAgIDB4NAorCisjZW5kaWYgLyogTFBDX1JUTElNSVRTX0hfICovCmRpZmYgLS1naXQgYS9zeXMvc2VpbC5oIGIvc3lzL3NlaWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDU5ODMwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL3NlaWwuaApAQCAtMCwwICsxLDggQEAKKyNkZWZpbmUgUF9USUVEICJ0aWVkIgkJLy8gd2lyZCBpbSBnZWJ1bmRlbm4gb2JqZWN0IGdlc2V0enQgdW5kIGJlaGluYWx0ZXQgZWluIG1hcHBpbmcKKyNkZWZpbmUgUF9USUVfVVNFUiAidGllX3VzZXIiCS8vIGhpZXIgc3RlaHQgZGVyIHVzZXIgZHJpbiwgZGVyIGRpZSBsZXR6dGUgCisJCQkJLy8gYWt0aW9uIG1pdCBkZW0gc2VpbCBnZW1hY2h0IGhhdAorCQkJCS8vIFByb3Aga2FubiBpbiB0aWUoKSBhdXNnZWxlc2VuIHdlcmRlbi4KKyNkZWZpbmUgUF9USUVfVkVSQiAidGllX3ZlcmIiCS8vIHdpcmQgZnVlciBhdXRvbWF0aXNjaGVzIGJpbmRlbi9sb2VzZW4gYmVub2V0aWd0LgorI2RlZmluZSBQX1RJRV9NRVNTQUdFICJ0aWVfbWVzc2FnZSIgLy8gQXVzZ2FiZSBiZWltIGZlc3RiaW5kZW4gZGVzIHNlaWxlcyBhdXMgZWluZW0gb2JqZWN0L3JhdW0gaGVyYXVzCisjZGVmaW5lIFBfVU5USUVfTUVTU0FHRSAidW50aWVfbWVzc2FnZSIgLy8gTVNHIHp1bSBsb2VzZW4gZGVzIFNlaWxlcworI2RlZmluZSBQX1RJRV9BVVRPCSJ0aWVfYXV0byIgCmRpZmYgLS1naXQgYS9zeXMvc2Vuc2l0aXZlLmggYi9zeXMvc2Vuc2l0aXZlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM1MWRjNgotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9zZW5zaXRpdmUuaApAQCAtMCwwICsxLDQ0IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gc2Vuc2l0aXZlLmggLS0gRGVmaW5pdGlvbmVuIGZ1ZXIgc2Vuc2l0aXZlIE9iamVrdGUuCisvLyAgICAgICAgICAgICAgICBTaWVoZSBhdWNoIC9zdGQvY29udGFpbmVyL2ludmVudG9yeS5jIHVuZAorLy8gICAgICAgICAgICAgICAgL3N0ZC9saXZpbmcvaW52ZW50b3J5LmMKKy8vCisvLyAkSWQ6IHNlbnNpdGl2ZS5oLHYgMy4xIDE5OTcvMDIvMTIgMTM6MDQ6NTkgV2FyZ29uIEV4cCAkCisKKyNpZm5kZWYgX19TRU5TSVRJVkVfSF9fCisjZGVmaW5lIF9fU0VOU0lUSVZFX0hfXworCisjZGVmaW5lIFBfU0VOU0lUSVZFX0lOVkVOVE9SWSAic2Vuc2l0aXZlX2ludiIKKyNkZWZpbmUgUF9TRU5TSVRJVkVfSU5WRU5UT1JZX1RSSUdHRVIgInNlbnNpdGl2ZV9pbnZfdHJpZ2dlciIKKyNkZWZpbmUgUF9TRU5TSVRJVkVfQVRUQUNLICJzZW5zaXRpdmVfYXR0YWNrIgorCisjZGVmaW5lIFNFTlNJVElWRV9JTlZFTlRPUlkgImludiIKKyNkZWZpbmUgU0VOU0lUSVZFX0lOVkVOVE9SWV9UUklHR0VSICJpbnZfdHJpZ2dlciIKKyNkZWZpbmUgU0VOU0lUSVZFX0FUVEFDSyAiYXR0YWNrIgorCisjZGVmaW5lIFNFTlNfT0JKRUNUIDAKKyNkZWZpbmUgU0VOU19DTE9TVVJFIDEKKyNkZWZpbmUgU0VOU19LRVkgMgorI2RlZmluZSBTRU5TX1RIUkVTSE9MRCAzCisjZGVmaW5lIFNFTlNfT1BUIDQKKworI2RlZmluZSBTRU5TX1BST1BfUFJFRklYICJzZW5zaXRpdmVfIgorI2RlZmluZSBTRU5TX0lOU0VSVF9QUkVGSVggImluc2VydF9zZW5zaXRpdmVfIgorI2RlZmluZSBTRU5TX1RSSUdHRVJfUFJFRklYICJ0cmlnZ2VyX3NlbnNpdGl2ZV8iCisKKyNlbmRpZgorCisjaWZkZWYgTkVFRF9QUk9UT1RZUEVTCisjaWZuZGVmIF9fU0VOU0lUSVZFX0hfUFJPVE9fXworI2RlZmluZSBfX1NFTlNJVElWRV9IX1BST1RPX18KKwordm9pZCBSZW1vdmVTZW5zaXRpdmVPYmplY3RGcm9tTGlzdChvYmplY3Qgb2IsIHN0cmluZyBsaXN0KTsKK3ZvaWQgUmVtb3ZlU2Vuc2l0aXZlT2JqZWN0KG9iamVjdCBvYik7Cit2YXJhcmdzIHZvaWQgSW5zZXJ0U2Vuc2l0aXZlT2JqZWN0VG9MaXN0KG9iamVjdCBvYiwgc3RyaW5nIGxpc3QsIHN0cmluZyBrZXksCisJCQkJCSBpbnQgdGhyZXNob2xkLCBtaXhlZCAqb3B0KTsKK3ZvaWQgSW5zZXJ0U2Vuc2l0aXZlT2JqZWN0KG9iamVjdCBvYiwgbWl4ZWQgYXJnKTsKK3ZvaWQgQ2hlY2tTZW5zaXRpdmVBdHRhY2soaW50IGRhbSwgbWl4ZWQgZGFtX3R5cGUsIG1peGVkIHNwZWxsLCBvYmplY3QgZW5lbXkpOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzL3NlbnQuaCBiL3N5cy9zZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc5YmVmMgotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9zZW50LmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBMUENfU0VOVF9IXworI2RlZmluZSBMUENfU0VOVF9IXworCisjZGVmaW5lIFNFTlRfUExBSU4JMAorI2RlZmluZSBTRU5UX1NIT1JUX1ZFUkIJMQorI2RlZmluZSBTRU5UX05PX1NQQUNFCTIKKyNkZWZpbmUgU0VOVF9OT19WRVJCCTMKKyNkZWZpbmUgU0VOVF9NQVJLRVIJNAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5cy9zaGVsbHMuaCBiL3N5cy9zaGVsbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzkyY2NhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL3NoZWxscy5oCkBAIC0wLDAgKzEsMjcgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBzaGVsbHMuaCAtLSBzaGVsbCBoZWFkZXIKKy8vCisvLyAkSWQ6IHNoZWxscy5oIDk1NTUgMjAxNi0wNS0wMyAyMDo0Mjo0NlogWmVzc3RyYSAkCisKKyNpZm5kZWYgX19TSEVMTFNfSF9fCisjZGVmaW5lIF9fU0hFTExTX0hfXworCisvLyBwcm9wZXJ0aWVzCisKKyNkZWZpbmUgUF9DVVJSRU5URElSICJjdXJyZW50ZGlyIgorI2RlZmluZSBQX0xBU1RESVIgInBfbGliX2xhc3RkaXIiCisKKyNlbmRpZiAvLyBfX1NIRUxMU19IX18KKworI2lmZGVmIE5FRURfUFJPVE9UWVBFUworCisjaWZuZGVmIF9fU0hFTExTX0hfUFJPVE9fXworI2RlZmluZSBfX1NIRUxMU19IX1BST1RPX18KKworLy8gcHJvdG90eXBlcworLy8gbm8gcHJvdG90eXBlcworCisjZW5kaWYgLy8gX19TSEVMTFNfSF9QUk9UT19fCisKKyNlbmRpZgkvLyBORUVEX1BST1RPWVBFUwpkaWZmIC0tZ2l0IGEvc3lzL3NpZ25hbHMuaCBiL3N5cy9zaWduYWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU0NDEyZQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9zaWduYWxzLmgKQEAgLTAsMCArMSwyMyBAQAorI2lmbmRlZiBMUENfU0lHTkFMU19IXworI2RlZmluZSBMUENfU0lHTkFMU19IXyAxCisKKy8vIE91ciBkZWZpbmVzIGZvciBzb21lIFBPU0lYIHNpZ25hbHMgdGhlIGRyaXZlciBkZWZlcnMgdG8gdGhlIG11ZGxpYi4KKy8vIFRoaXMgYWJzdHJhY3Rpb24gaXMgaW50ZW50aW9uYWwuCisjZGVmaW5lIExQQ19TSUdIVVAgICAgMQorI2RlZmluZSBMUENfU0lHSU5UICAgIDIKKyNkZWZpbmUgTFBDX1NJR1RFUk0gICAxNQorI2RlZmluZSBMUENfU0lHVVNSMSAgIDE2CisjZGVmaW5lIExQQ19TSUdVU1IyICAgMTcKKworLy8gX19TVERfXyBpcyBkZWZpbmVkIGR1cmluZyB0aGUgZHJpdmVyIGNvbXBpbGF0aW9uICh0aGUgZHJpdmVyIGluY2x1ZGVzIHRoaXMKKy8vIGZpbGUgYXMgd2VsbCkgYnV0IG5vdCBpbiBMUEMgcHJvZ3JhbXMuIEluIExQQyB3ZSBtYXkgc2FmZWx5IGRlZmluZSB0aGUKKy8vIHNpZ25hbHMgbmFtZSB3aXRob3V0IHRoZSBMUENfIHByZWZpeC4KKyNpZiAhZGVmaW5lZChfX1NURENfXykKKyNkZWZpbmUgU0lHSFVQICAgICAgIExQQ19TSUdIVVAKKyNkZWZpbmUgU0lHSU5UICAgICAgIExQQ19TSUdJTlQKKyNkZWZpbmUgU0lHVEVSTSAgICAgIExQQ19TSUdURVJNCisjZGVmaW5lIFNJR1VTUjEgICAgICBMUENfU0lHVVNSMQorI2RlZmluZSBTSUdVU1IyICAgICAgTFBDX1NJR1VTUjIKKyNlbmRpZiAvLyBfX1NURF9fCisKKyNlbmRpZiAvKiBMUENfU0lHTkFMU19IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzL3Nub29waW5nLmggYi9zeXMvc25vb3BpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWVkY2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL3Nub29waW5nLmgKQEAgLTAsMCArMSwxNSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHNub29waW5nLmggLS0gRGVmaW5pdGlvbmVuIHJ1bmQgdW1zIFNub29wZW4KKy8vCisvLyAkSWQ6IHNub29waW5nLmgsdiAzLjEgMTk5Ny8wMi8xMiAxMzowNDo1OSBXYXJnb24gRXhwICQKKworI2lmbmRlZiBfU05PT1BJTkdfSF8KKyNkZWZpbmUgX1NOT09QSU5HX0hfCisKKyNkZWZpbmUgU0ZfTE9DS0VEICAgICAgICAxCisjZGVmaW5lIFNGX0ZPUkNFICAgICAgICAgMgorCisjZGVmaW5lIFBfU05PT1BGTEFHUyAgICAgInNub29wZmxhZ3MiCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzL3NwZWxsYm9vay5oIGIvc3lzL3NwZWxsYm9vay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NjMwMWUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvc3BlbGxib29rLmgKQEAgLTAsMCArMSw1NiBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHNwZWxsYm9vay5oIC0tIEZ1bmt0aW9ucy1Qcm90b3R5cGVuIGZ1ZXIgZGFzIC9zdGQvc3BlbGxib29rLmgKKy8vCisvLyAkSWQ6IHNwZWxsYm9vay5oIDg4MjIgMjAxNC0wNS0xNyAwOTo0OTo0OVogWmVzc3RyYSAkCisKKyNpZm5kZWYgX19TUEVMTEJPT0tfSF9fCisjZGVmaW5lIF9fU1BFTExCT09LX0hfXworCisvLyBubyBkZWZpbmVzCisKKyNlbmRpZiAvLyBfX1NQRUxMQk9PS19IX18KKworI2lmZGVmIE5FRURfUFJPVE9UWVBFUworCisjaWZuZGVmIF9fU1BFTExCT09LX0hfUFJPVE9fXworI2RlZmluZSBfX1NQRUxMQk9PS19IX1BST1RPX18KKwordmFyYXJncyBpbnQgICAgICBBZGRTcGVsbChzdHJpbmcgdmVyYiwgaW50IGtvc3RlbiwgbWl4ZWQgc2tpKTsKKyAgICAgICAgaW50ICAgICAgQ2FuVHJ5U3BlbGwob2JqZWN0IGNhc3RlciwgbWFwcGluZyBzaW5mbyk7CisgICAgICAgIGludCAgICAgIFNwZWxsU3VjY2VzcyhvYmplY3QgY2FzdGVyLCBtYXBwaW5nIHNpbmZvKTsKKyAgICAgICAgaW50ICAgICAgVHJ5QXR0YWNrU3BlbGwob2JqZWN0IHZpY3RpbSwgaW50IGRhbWFnZSwgbWl4ZWQgZHR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXhlZCBpc19zcGVsbCwgb2JqZWN0IGNhc3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyBzaW5mbyk7Cit2YXJhcmdzIGludCAgICAgIFRyeURlZmF1bHRBdHRhY2tTcGVsbChvYmplY3QgdmljdGltLCBvYmplY3QgY2FzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyBzaW5mbywgbWl4ZWQgc3RyKTsKK3ZhcmFyZ3MgaW50ICAgICAgVHJ5R2xvYmFsQXR0YWNrU3BlbGwob2JqZWN0IGNhc3RlciwgbWFwcGluZyBzaW5mbywgaW50IHN1YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRhbWFnZSwgbWl4ZWQgZHQsIG1peGVkIGlzX3NwZWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlzdCwgaW50IGRlcHRoLCBpbnQgd2lkdGgpOwordmFyYXJncyBpbnQgICAgICBVc2VTcGVsbChvYmplY3QgY2FzdGVyLCBzdHJpbmcgc3BlbGwsIG1hcHBpbmcgc2luZm8pOworICAgICAgICBtYXBwaW5nICBRdWVyeVNwZWxsKHN0cmluZyBzcGVsbCk7Cit2YXJhcmdzIG1peGVkICAgIEZpbmREaXN0YW50R3JvdXBzKG9iamVjdCBwbCwgaW50IGRpc3QsIGludCBkeSwgaW50IGR4KTsKK3ZhcmFyZ3Mgb2JqZWN0ICAgRmluZERpc3RhbnRFbmVteVZpY3RpbShzdHJpbmcgd2VuLCBvYmplY3QgcGwsIHN0cmluZyBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpc3QsIGludCBkeSk7Cit2YXJhcmdzIG9iamVjdCAgKkZpbmREaXN0YW50R3JvdXAob2JqZWN0IHBsLCBpbnQgd2hvLCBpbnQgZGlzdCwgaW50IGR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkeCk7Cit2YXJhcmdzIG9iamVjdCAgIEZpbmRFbmVteVZpY3RpbShzdHJpbmcgd2VuLCBvYmplY3QgcGwsIHN0cmluZyBtc2cpOwordmFyYXJncyBvYmplY3QgICBGaW5kRmFyRW5lbXlWaWN0aW0oc3RyaW5nIHdlbiwgb2JqZWN0IHBsLCBzdHJpbmcgbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1pbiwgaW50IG1heCk7CisgICAgICAgIG9iamVjdCAgKkZpbmRHcm91cChvYmplY3QgcGwsIGludCB3aG8pOworICAgICAgICBvYmplY3QgICpGaW5kR3JvdXBOKG9iamVjdCBwbCwgaW50IHdobywgaW50IG4pOworICAgICAgICBvYmplY3QgICpGaW5kR3JvdXBQKG9iamVjdCBwbCwgaW50IHdobywgaW50IHByKTsKK3ZhcmFyZ3Mgb2JqZWN0ICAgRmluZExpdmluZ1ZpY3RpbShzdHJpbmcgd2VuLCBvYmplY3QgcGwsIHN0cmluZyBtc2cpOwordmFyYXJncyBvYmplY3QgICBGaW5kTmVhckVuZW15VmljdGltKHN0cmluZyB3ZW4sIG9iamVjdCBwbCwgc3RyaW5nIG1zZyk7CitzdGF0aWMKK3ZhcmFyZ3Mgb2JqZWN0ICAgZmluZF92aWN0aW0oc3RyaW5nIHdlbiwgb2JqZWN0IHBsKTsKK3ZhcmFyZ3Mgb2JqZWN0ICAgRmluZFZpY3RpbShzdHJpbmcgd2VuLCBvYmplY3QgcGwsIHN0cmluZyBtc2cpOworICAgICAgICBzdHJpbmcgICBTZWxlY3RTcGVsbChzdHJpbmcgc3BlbGwsIG1hcHBpbmcgc2luZm8pOworICAgICAgICB2b2lkICAgICBFcmZvbGcob2JqZWN0IGNhc3Rlciwgc3RyaW5nIHNwZWxsLCBtYXBwaW5nIHNpbmZvKTsKKyAgICAgICAgdm9pZCAgICAgTGVhcm4ob2JqZWN0IGNhc3Rlciwgc3RyaW5nIHNwZWxsLCBtYXBwaW5nIHNpbmZvKTsKKyAgICAgICAgdm9pZCAgICAgTWlzc2VyZm9sZyhvYmplY3QgY2FzdGVyLCBzdHJpbmcgc3BlbGwsIG1hcHBpbmcgc2luZm8pOwordmFyYXJncyB2b2lkICAgICBwcmVwYXJlX3NwZWxsKG9iamVjdCBjYXN0ZXIsIHN0cmluZyBzcGVsbCwgbWFwcGluZyBzaW5mbyk7CisKKyNlbmRpZiAvLyBfX1NQRUxMQk9PS19IX1BST1RPX18KKworI2VuZGlmIC8vIC8vIE5FRURfUFJPVE9ZUEVTCmRpZmYgLS1naXQgYS9zeXMvc3RyaW5ncy5oIGIvc3lzL3N0cmluZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzhhZTFlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL3N0cmluZ3MuaApAQCAtMCwwICsxLDEwIEBACisjaWZuZGVmIExQQ19TVFJJTkdTX0hfCisjZGVmaW5lIExQQ19TVFJJTkdTX0hfIDEKKworLyogJ3doZXJlJyBhcmd1bWVudCB2YWx1ZXMgZm9yIHRyaW0oKSAqLworCisjZGVmaW5lIFRSSU1fTEVGVCAgMHgwMQorI2RlZmluZSBUUklNX1JJR0hUIDB4MDIKKyNkZWZpbmUgVFJJTV9CT1RIICAoVFJJTV9MRUZUfFRSSU1fUklHSFQpCisKKyNlbmRpZiAvKiBMUENfU1RSSU5HU19IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzL3N0cnVjdF9pbmZvLmggYi9zeXMvc3RydWN0X2luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGUwMGU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL3N0cnVjdF9pbmZvLmgKQEAgLTAsMCArMSwzOCBAQAorI2lmbmRlZiBMUENfU1RSVUNUSU5GT19IXworI2RlZmluZSBMUENfU1RSVUNUSU5GT19IXworCisjaWZuZGVmIF9fRFJJVkVSX1NPVVJDRV9fCisjaW5jbHVkZSAibHBjdHlwZXMuaCIKKyNlbmRpZgorCisvKiBEZWZpbml0aW9uIG9mIGFyZ3VtZW50IHZhbHVlcyBmb3Igc3RydWN0X2luZm8oKSBhbmQKKyAqIG9mIHRoZSBpbmRpY2VzIGluIHRoZSBjb3JyZXNwb25kaW5nIHJlc3VsdCBhcnJheXMuCisgKi8KKworLyogUG9zc2libGUgdHlwZXMgb2YgaW5mb3JtYXRpb24gcmVxdWVzdGVkIGZyb20gc3RydWN0X2luZm8oKQorICovCisjZGVmaW5lIFNJTkZPX0ZMQVQgICAgMAorI2RlZmluZSBTSU5GT19ORVNURUQgIDEKKworCisvKiBJbmRpY2VzIGluIHRoZSByZXN1bHQgYXJyYXkKKyAqLworCisjZGVmaW5lIFNJX05BTUUgICAgICAgICAwCisjZGVmaW5lIFNJX1BST0dfTkFNRSAgICAxCisjZGVmaW5lIFNJX1BST0dfSUQgICAgICAyCisjZGVmaW5lIFNJX0JBU0UgICAgICAgICAzCisjZGVmaW5lIFNJX01FTUJFUiAgICAgICA0CisKKyNkZWZpbmUgU0lfTUFYIDUgIC8qIE1pbiBOdW1iZXIgb2YgU0lfIHJlc3VsdCBlbGVtZW50cyAqLworCisvKiBJbmRpY2VzIGluIHRoZSBTSV9NRU1CRVIgYXJyYXlzCisgKi8KKworI2RlZmluZSBTSU1fTkFNRSAgIDAKKyNkZWZpbmUgU0lNX1RZUEUgICAxCisjZGVmaW5lIFNJTV9FWFRSQSAgMgorCisjZGVmaW5lIFNJTV9NQVggMyAvKiBOdW1iZXIgb2YgU0lNXyBlbGVtZW50cyAqLworCisjZW5kaWYgLyogTFBDX1NUUlVDVElORk9fSF8gKi8KZGlmZiAtLWdpdCBhL3N5cy9zeXNfZGVidWcuaCBiL3N5cy9zeXNfZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjgyNzY0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL3N5c19kZWJ1Zy5oCkBAIC0wLDAgKzEsMjQgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBzeXNfZGVidWcuaCAtLSBEZWZpbml0aW9uZW4gZnVlciBEZWJ1Z3p3ZWNrZQorLy8KKy8vICRJZDogc3lzX2RlYnVnLmggNjA4MSAyMDA2LTEwLTIzIDE0OjEyOjM0WiBaZXNzdHJhICQKKworI2lmbmRlZiBfX1NZU19ERUJVR19IX18KKyNkZWZpbmUgX19TWVNfREVCVUdfSF9fCisKKyNkZWZpbmUgREVCVUcoeCkgcHJpbnRmKCJERUJVRzogT0JKKC8lTykgJU9cbiIsIHRoaXNfb2JqZWN0KCksICh4KSkKKworI2RlZmluZSBEQkdfT04oYykgKHRyYWNlcHJlZml4KG9iamVjdF9uYW1lKHRoaXNfb2JqZWN0KCkpWzEuLl0pLCB0cmFjZShjP2M6MjM5KSkKKyNkZWZpbmUgREJHX09GRigpICh0cmFjZXByZWZpeCgiIiksIHRyYWNlKDApKQorCisjZGVmaW5lIExGVU4gICAgMSAgIC8vIGRlYnVnIGxmdW5jIGNhbGxzCisjZGVmaW5lIENBTEwgICAgMiAgIC8vIGRlYnVnIGNhbGxfb3RoZXIgY2FsbHMKKyNkZWZpbmUgUkVUICAgICA0ICAgLy8gZGVidWcgcmV0dXJuIHZhbHVlcworI2RlZmluZSBBUkdTICAgIDggICAvLyBzaG93IGFyZ3VtZW50cyB3aGVuIGNhbGxpbmcgYSBmdW5jdGlvbgorI2RlZmluZSBTVEFDSyAgIDE2ICAvLyBzaG93IGFsbCBzdGFjayBtYWNoaW5lIGNvZGUgKERPTidUIFVTRSEpCisjZGVmaW5lIEhCICAgICAgMzIgIC8vIHNob3cgY2FsbHMgdG8gaGVhcnRfYmVhdCgpCisjZGVmaW5lIEFQUExZICAgNjQgIC8vIGRlYnVnIGNhbGxzIHRvIGFwcGx5CisjZGVmaW5lIE5BTUUgICAgMTI4IC8vIHNob3cgbmFtZSBvZiBmaWxlIHdoZW4gZGVidWdnaW5nIChkb24ndCB1c2UpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzL3RlbG5ldC5oIGIvc3lzL3RlbG5ldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YTJiMTQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdGVsbmV0LmgKQEAgLTAsMCArMSwyNjEgQEAKKyNpZm5kZWYgVEVMTkVUX0hfXworI2RlZmluZSBURUxORVRfSF9fIDEKKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggYXJlCisgKiBkdXBsaWNhdGVkIGluIGFsbCBzdWNoIGZvcm1zIGFuZCB0aGF0IGFueSBkb2N1bWVudGF0aW9uLAorICogYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzLCBhbmQgb3RoZXIgbWF0ZXJpYWxzIHJlbGF0ZWQgdG8gc3VjaAorICogZGlzdHJpYnV0aW9uIGFuZCB1c2UgYWNrbm93bGVkZ2UgdGhhdCB0aGUgc29mdHdhcmUgd2FzIGRldmVsb3BlZAorICogYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkuICBUaGUgbmFtZSBvZiB0aGUKKyAqIFVuaXZlcnNpdHkgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiAgICAgICAgQCgjKXRlbG5ldC5oICAgICAgICA1LjcgKEJlcmtlbGV5KSAxMS8xNC84OQorICovCisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgdGhlIFRFTE5FVCBwcm90b2NvbC4KKyAqLworI2RlZmluZSAgSUFDICAgICAyNTUgICAgICAvKiBpbnRlcnByZXQgYXMgY29tbWFuZDogKi8KKyNkZWZpbmUgIERPTlQgICAgMjU0ICAgICAgLyogeW91IGFyZSBub3QgdG8gdXNlIG9wdGlvbiAqLworI2RlZmluZSAgRE8gICAgICAyNTMgICAgICAvKiBwbGVhc2UsIHlvdSB1c2Ugb3B0aW9uICovCisjZGVmaW5lICBXT05UICAgIDI1MiAgICAgIC8qIEkgd29uJ3QgdXNlIG9wdGlvbiAqLworI2RlZmluZSAgV0lMTCAgICAyNTEgICAgICAvKiBJIHdpbGwgdXNlIG9wdGlvbiAqLworI2RlZmluZSAgU0IgICAgICAyNTAgICAgICAvKiBpbnRlcnByZXQgYXMgc3VibmVnb3RpYXRpb24gKi8KKyNkZWZpbmUgIEdBICAgICAgMjQ5ICAgICAgLyogeW91IG1heSByZXZlcnNlIHRoZSBsaW5lICovCisjZGVmaW5lICBFTCAgICAgIDI0OCAgICAgIC8qIGVyYXNlIHRoZSBjdXJyZW50IGxpbmUgKi8KKyNkZWZpbmUgIEVDICAgICAgMjQ3ICAgICAgLyogZXJhc2UgdGhlIGN1cnJlbnQgY2hhcmFjdGVyICovCisjZGVmaW5lICBBWVQgICAgIDI0NiAgICAgIC8qIGFyZSB5b3UgdGhlcmUgKi8KKyNkZWZpbmUgIEFPICAgICAgMjQ1ICAgICAgLyogYWJvcnQgb3V0cHV0LS1idXQgbGV0IHByb2cgZmluaXNoICovCisjZGVmaW5lICBJUCAgICAgIDI0NCAgICAgIC8qIGludGVycnVwdCBwcm9jZXNzLS1wZXJtYW5lbnRseSAqLworI2RlZmluZSAgQlJFQUsgICAyNDMgICAgICAvKiBicmVhayAqLworI2RlZmluZSAgRE0gICAgICAyNDIgICAgICAvKiBkYXRhIG1hcmstLWZvciBjb25uZWN0LiBjbGVhbmluZyAqLworI2RlZmluZSAgTk9QICAgICAyNDEgICAgICAvKiBub3AgKi8KKyNkZWZpbmUgIFNFICAgICAgMjQwICAgICAgLyogZW5kIHN1YiBuZWdvdGlhdGlvbiAqLworI2RlZmluZSAgRU9SICAgICAyMzkgICAgICAvKiBlbmQgb2YgcmVjb3JkICh0cmFuc3BhcmVudCBtb2RlKSAqLworI2RlZmluZSAgQUJPUlQgICAyMzggICAgICAvKiBBYm9ydCBwcm9jZXNzICovCisjZGVmaW5lICBTVVNQICAgIDIzNyAgICAgIC8qIFN1c3BlbmQgcHJvY2VzcyAqLworI2RlZmluZSAgeEVPRiAgICAyMzYgICAgICAvKiBFbmQgb2YgZmlsZTogRU9GIGlzIGFscmVhZHkgdXNlZC4uLiAqLworCisjZGVmaW5lICBTWU5DSCAgIDI0MiAgICAgIC8qIGZvciB0ZWxmdW5jIGNhbGxzICovCisKKyNpZmRlZiBfX0RSSVZFUl9TT1VSQ0VfXworCisjaWZkZWYgVEVMQ01EUworY2hhciAqdGVsY21kc1tdID0geworICAgICAgICAiRU9GIiwgIlNVU1AiLCAiQUJPUlQiLCAiRU9SIiwKKyAgICAgICAgIlNFIiwgIk5PUCIsICJETUFSSyIsICJCUksiLCAiSVAiLCAiQU8iLCAiQVlUIiwgIkVDIiwKKyAgICAgICAgIkVMIiwgIkdBIiwgIlNCIiwgIldJTEwiLCAiV09OVCIsICJETyIsICJET05UIiwgIklBQyIsCit9OworI2RlZmluZSAgVEVMQ01EX0ZJUlNUICAgeEVPRgorI2RlZmluZSAgVEVMQ01EX0xBU1QgICAgSUFDCisjZGVmaW5lICBURUxDTURfT0soeCkgICAoKHgpIDw9IFRFTENNRF9MQVNUICYmICh4KSA+PSBURUxDTURfRklSU1QpCisjZGVmaW5lICBURUxDTUQoeCkgICAgICB0ZWxjbWRzWyh4KS1URUxDTURfRklSU1RdCisjZW5kaWYKKworI2VuZGlmIC8qIF9fRFJJVkVSX1NPVVJDRV9fICovCisKKy8qIHRlbG5ldCBvcHRpb25zICovCisjZGVmaW5lICBURUxPUFRfQklOQVJZICAgICAgICAgMCAgICAgICAgLyogOC1iaXQgZGF0YSBwYXRoICovCisjZGVmaW5lICBURUxPUFRfRUNITyAgICAgICAgICAgMSAgICAgICAgLyogZWNobyAqLworI2RlZmluZSAgVEVMT1BUX1JDUCAgICAgICAgICAgIDIgICAgICAgIC8qIHByZXBhcmUgdG8gcmVjb25uZWN0ICovCisjZGVmaW5lICBURUxPUFRfU0dBICAgICAgICAgICAgMyAgICAgICAgLyogc3VwcHJlc3MgZ28gYWhlYWQgKi8KKyNkZWZpbmUgIFRFTE9QVF9OQU1TICAgICAgICAgICA0ICAgICAgICAvKiBhcHByb3hpbWF0ZSBtZXNzYWdlIHNpemUgKi8KKyNkZWZpbmUgIFRFTE9QVF9TVEFUVVMgICAgICAgICA1ICAgICAgICAvKiBnaXZlIHN0YXR1cyAqLworI2RlZmluZSAgVEVMT1BUX1RNICAgICAgICAgICAgIDYgICAgICAgIC8qIHRpbWluZyBtYXJrICovCisjZGVmaW5lICBURUxPUFRfUkNURSAgICAgICAgICAgNyAgICAgICAgLyogcmVtb3RlIGNvbnRyb2xsZWQgdHJhbnNtaXNzaW9uIGFuZCBlY2hvICovCisjZGVmaW5lICBURUxPUFRfTkFPTCAgICAgICAgICAgOCAgICAgICAgLyogbmVnb3RpYXRlIGFib3V0IG91dHB1dCBsaW5lIHdpZHRoICovCisjZGVmaW5lICBURUxPUFRfTkFPUCAgICAgICAgICAgOSAgICAgICAgLyogbmVnb3RpYXRlIGFib3V0IG91dHB1dCBwYWdlIHNpemUgKi8KKyNkZWZpbmUgIFRFTE9QVF9OQU9DUkQgICAgICAgIDEwICAgICAgICAvKiBuZWdvdGlhdGUgYWJvdXQgQ1IgZGlzcG9zaXRpb24gKi8KKyNkZWZpbmUgIFRFTE9QVF9OQU9IVFMgICAgICAgIDExICAgICAgICAvKiBuZWdvdGlhdGUgYWJvdXQgaG9yaXpvbnRhbCB0YWJzdG9wcyAqLworI2RlZmluZSAgVEVMT1BUX05BT0hURCAgICAgICAgMTIgICAgICAgIC8qIG5lZ290aWF0ZSBhYm91dCBob3Jpem9udGFsIHRhYiBkaXNwb3NpdGlvbiAqLworI2RlZmluZSAgVEVMT1BUX05BT0ZGRCAgICAgICAgMTMgICAgICAgIC8qIG5lZ290aWF0ZSBhYm91dCBmb3JtZmVlZCBkaXNwb3NpdGlvbiAqLworI2RlZmluZSAgVEVMT1BUX05BT1ZUUyAgICAgICAgMTQgICAgICAgIC8qIG5lZ290aWF0ZSBhYm91dCB2ZXJ0aWNhbCB0YWIgc3RvcHMgKi8KKyNkZWZpbmUgIFRFTE9QVF9OQU9WVEQgICAgICAgIDE1ICAgICAgICAvKiBuZWdvdGlhdGUgYWJvdXQgdmVydGljYWwgdGFiIGRpc3Bvc2l0aW9uICovCisjZGVmaW5lICBURUxPUFRfTkFPTEZEICAgICAgICAxNiAgICAgICAgLyogbmVnb3RpYXRlIGFib3V0IG91dHB1dCBMRiBkaXNwb3NpdGlvbiAqLworI2RlZmluZSAgVEVMT1BUX1hBU0NJSSAgICAgICAgMTcgICAgICAgIC8qIGV4dGVuZGVkIGFzY2ljIGNoYXJhY3RlciBzZXQgKi8KKyNkZWZpbmUgIFRFTE9QVF9MT0dPVVQgICAgICAgIDE4ICAgICAgICAvKiBmb3JjZSBsb2dvdXQgKi8KKyNkZWZpbmUgIFRFTE9QVF9CTSAgICAgICAgICAgIDE5ICAgICAgICAvKiBieXRlIG1hY3JvICovCisjZGVmaW5lICBURUxPUFRfREVUICAgICAgICAgICAyMCAgICAgICAgLyogZGF0YSBlbnRyeSB0ZXJtaW5hbCAqLworI2RlZmluZSAgVEVMT1BUX1NVUERVUCAgICAgICAgMjEgICAgICAgIC8qIHN1cGR1cCBwcm90b2NvbCAqLworI2RlZmluZSAgVEVMT1BUX1NVUERVUE9VVFBVVCAgMjIgICAgICAgIC8qIHN1cGR1cCBvdXRwdXQgKi8KKyNkZWZpbmUgIFRFTE9QVF9TTkRMT0MgICAgICAgIDIzICAgICAgICAvKiBzZW5kIGxvY2F0aW9uICovCisjZGVmaW5lICBURUxPUFRfVFRZUEUgICAgICAgICAyNCAgICAgICAgLyogdGVybWluYWwgdHlwZSAqLworI2RlZmluZSAgVEVMT1BUX0VPUiAgICAgICAgICAgMjUgICAgICAgIC8qIGVuZCBvciByZWNvcmQgKi8KKyNkZWZpbmUgIFRFTE9QVF9UVUlEICAgICAgICAgIDI2ICAgICAgICAvKiBUQUNBQ1MgdXNlciBpZGVudGlmaWNhdGlvbiAqLworI2RlZmluZSAgVEVMT1BUX09VVE1SSyAgICAgICAgMjcgICAgICAgIC8qIG91dHB1dCBtYXJraW5nICovCisjZGVmaW5lICBURUxPUFRfVFRZTE9DICAgICAgICAyOCAgICAgICAgLyogdGVybWluYWwgbG9jYXRpb24gbnVtYmVyICovCisjZGVmaW5lICBURUxPUFRfMzI3MFJFR0lNRSAgICAyOSAgICAgICAgLyogMzI3MCByZWdpbWUgKi8KKyNkZWZpbmUgIFRFTE9QVF9YM1BBRCAgICAgICAgIDMwICAgICAgICAvKiBYLjMgUEFEICovCisjZGVmaW5lICBURUxPUFRfTkFXUyAgICAgICAgICAzMSAgICAgICAgLyogd2luZG93IHNpemUgKi8KKyNkZWZpbmUgIFRFTE9QVF9UU1BFRUQgICAgICAgIDMyICAgICAgICAvKiB0ZXJtaW5hbCBzcGVlZCAqLworI2RlZmluZSAgVEVMT1BUX0xGTE9XICAgICAgICAgMzMgICAgICAgIC8qIHJlbW90ZSBmbG93IGNvbnRyb2wgKi8KKyNkZWZpbmUgIFRFTE9QVF9MSU5FTU9ERSAgICAgIDM0ICAgICAgICAvKiBMaW5lbW9kZSBvcHRpb24gKi8KKyNkZWZpbmUgIFRFTE9QVF9YRElTUExPQyAgICAgIDM1ICAgICAgICAvKiBYIERpc3BsYXkgTG9jYXRpb24gKi8KKyNkZWZpbmUgIFRFTE9QVF9FTlZJUk9OCSAgICAgIDM2ICAgICAgICAvKiBFbnZpcm9ubWVudCBvcHQgZm9yIFBvcnQgSUQgKi8KKyNkZWZpbmUgIFRFTE9QVF9BVVRIRU5USUNBVElPTiAzNyAgICAgICAvKiBhdXRoZW50aWNhdGlvbiAqLworI2RlZmluZSAgVEVMT1BUX0VOQ1JZUFQgICAgICAgMzggICAgICAgIC8qIGF1dGhlbnRpY2F0aW9uICovCisjZGVmaW5lICBURUxPUFRfTkVXRU5WICAgICAgICAzOSAgICAgICAgLyogRW52aXJvbm1lbnQgb3B0IGZvciBQb3J0IElEICovCisjZGVmaW5lICBURUxPUFRfU1RBUlRUTFMgICAgICA0NiAgICAgICAgLyogVHJhbnNwb3J0IExheWVyIFNlY3VyaXR5ICovCisjZGVmaW5lICBURUxPUFRfS0VSTUlUICAgICAgICA0NyAgICAgICAgLyogVGVsbmV0IEtFUk1JVCAqLworI2RlZmluZSAgVEVMT1BUX1NFTkRfVVJMICAgICAgNDggICAgICAgIC8qIFNlbmQgVVJMICovCisjZGVmaW5lICBURUxPUFRfRVhPUEwgICAgICAgIDI1NSAgICAgICAgLyogZXh0ZW5kZWQtb3B0aW9ucy1saXN0ICovCisKKy8qIElub2ZmaWNpYWwsIG11ZCBzcGVjaWZpYyB0ZWxuZXQgb3B0aW9ucyAqLworI2RlZmluZSAgVEVMT1BUX01TU1AgICAgICAgICAgNzAgICAgICAgIC8qIE11ZCBTZXJ2ZXIgU3RhdHVzIFByb3RvY29sICovCisjZGVmaW5lICBURUxPUFRfQ09NUFJFU1MgICAgICA4NSAgICAgICAgLyogTXVkIENvbXByZXNzaW9uIFByb3RvY29sLCB2LjEgKi8KKyNkZWZpbmUgIFRFTE9QVF9DT01QUkVTUzIgICAgIDg2ICAgICAgICAvKiBNdWQgQ29tcHJlc3Npb24gUHJvdG9jb2wsIHYuMiAqLworI2RlZmluZSAgVEVMT1BUX01TUCAgICAgICAgICAgOTAgICAgICAgIC8qIE11ZCBTb3VuZCBQcm90b2NvbCAqLworI2RlZmluZSAgVEVMT1BUX01YUCAgICAgICAgICAgOTEgICAgICAgIC8qIE11ZCBFeHRlbnNpb24gUHJvdG9jb2wgKi8KKyNkZWZpbmUgIFRFTE9QVF9aTVAgICAgICAgICAgIDkzICAgICAgICAvKiBaZW5pdGggTXVkIFByb3RvY29sICovCisjZGVmaW5lICBURUxPUFRfTVVTSENMSUVOVCAgIDEwMiAgICAgICAgLyogTXVzaGNsaWVudC9BYXJkd29sZiBQcm90b2NvbCAqLworI2RlZmluZSAgVEVMT1BUX0FUQ1AgICAgICAgICAyMDAgICAgICAgIC8qIEFjaGFlYSBUZWxuZXQgQ2xpZW50IFByb3RvY29sICovCisjZGVmaW5lICBURUxPUFRfR01DUCAgICAgICAgIDIwMSAgICAgICAgLyogR2VuZXJhbCBNdWQgQ29tbXVuaWNhdGlvbiBQcm90b2NvbCovCisKKyNkZWZpbmUgIE5URUxPUFRTICAgICAgICAgICAgMjU2ICAgICAgICAvKiB3YXM6ICgxK1RFTE9QVF9ORVdFTlYpICovCisKKyNpZmRlZiBfX0RSSVZFUl9TT1VSQ0VfXworCisjaWZkZWYgVEVMT1BUUworY2hhciAqdGVsb3B0c1tOVEVMT1BUU10KKyA9IHsgIkJJTkFSWSIsICJFQ0hPIiwgIlJDUCIsICJTVVBQUkVTUyBHTyBBSEVBRCIKKyAgICwgIk5BTUUiLCAiU1RBVFVTIiwgIlRJTUlORyBNQVJLIiwgIlJDVEUiCisgICAsICJOQU9MIiwgIk5BT1AiLCAiTkFPQ1JEIiwgIk5BT0hUUyIKKyAgICwgIk5BT0hURCIsICJOQU9GRkQiLCAiTkFPVlRTIiwgIk5BT1ZURCIKKyAgICwgIk5BT0xGRCIsICJFWFRFTkQgQVNDSUkiLCAiTE9HT1VUIiwgIkJZVEUgTUFDUk8iCisgICAsICJEQVRBIEVOVFJZIFRFUk1JTkFMIiwgIlNVUERVUCIsICJTVVBEVVAgT1VUUFVUIiwgIlNFTkQgTE9DQVRJT04iCisgICAsICJURVJNSU5BTCBUWVBFIiwgIkVORCBPRiBSRUNPUkQiLCAiVEFDQUNTIFVJRCIsICJPVVRQVVQgTUFSS0lORyIKKyAgICwgIlRUWUxPQyIsICIzMjcwIFJFR0lNRSIsICJYLjMgUEFEIiwgIk5BV1MiCisgICAsICJUU1BFRUQiLCAiTEZMT1ciLCAiTElORU1PREUiLCAiWERJU1BMT0MiCisgICAsICJFTlZJUk9OIiwgIkFVVEgiLCAiRU5DUllQVCIsICJORVdFTlYiCisgICAsICJURUxPUFQgNDAiLCAiVEVMT1BUIDQxIiwgIlRFTE9QVCA0MiIsICJURUxPUFQgNDMiCisgICAsICJURUxPUFQgNDQiLCAiVEVMT1BUIDQ1IiwgIlNUQVJUVExTIiwgIktFUk1JVCIKKyAgICwgIlNFTkRfVVJMIiwgIlRFTE9QVCA0OSIsICJURUxPUFQgNTAiLCAiVEVMT1BUIDUxIgorICAgLCAiVEVMT1BUIDUyIiwgIlRFTE9QVCA1MyIsICJURUxPUFQgNTQiLCAiVEVMT1BUIDU1IgorICAgLCAiVEVMT1BUIDU2IiwgIlRFTE9QVCA1NyIsICJURUxPUFQgNTgiLCAiVEVMT1BUIDU5IgorICAgLCAiVEVMT1BUIDYwIiwgIlRFTE9QVCA2MSIsICJURUxPUFQgNjIiLCAiVEVMT1BUIDYzIgorICAgLCAiVEVMT1BUIDY0IiwgIlRFTE9QVCA2NSIsICJURUxPUFQgNjYiLCAiVEVMT1BUIDY3IgorICAgLCAiVEVMT1BUIDY4IiwgIlRFTE9QVCA2OSIsICJNU1NQIiwgIlRFTE9QVCA3MSIKKyAgICwgIlRFTE9QVCA3MiIsICJURUxPUFQgNzMiLCAiVEVMT1BUIDc0IiwgIlRFTE9QVCA3NSIKKyAgICwgIlRFTE9QVCA3NiIsICJURUxPUFQgNzciLCAiVEVMT1BUIDc4IiwgIlRFTE9QVCA3OSIKKyAgICwgIlRFTE9QVCA4MCIsICJURUxPUFQgODEiLCAiVEVMT1BUIDgyIiwgIlRFTE9QVCA4MyIKKyAgICwgIlRFTE9QVCA4NCIsICJNVUQgQ09NUFJFU1MiLCAiTVVEIENPTVBSRVNTMiIsICJURUxPUFQgODciCisgICAsICJURUxPUFQgODgiLCAiVEVMT1BUIDg5IiwgIk1VRCBTT1VORCIsICJNVUQgRVhURU5TSU9OIgorICAgLCAiVEVMT1BUIDkyIiwgIlpNUCIsICJURUxPUFQgOTQiLCAiVEVMT1BUIDk1IgorICAgLCAiVEVMT1BUIDk2IiwgIlRFTE9QVCA5NyIsICJURUxPUFQgOTgiLCAiVEVMT1BUIDk5IgorICAgLCAiVEVMT1BUIDEwMCIsICJURUxPUFQgMTAxIiwgIk1VU0hDTElFTlQiLCAiVEVMT1BUIDEwMyIKKyAgICwgIlRFTE9QVCAxMDQiLCAiVEVMT1BUIDEwNSIsICJURUxPUFQgMTA2IiwgIlRFTE9QVCAxMDciCisgICAsICJURUxPUFQgMTA4IiwgIlRFTE9QVCAxMDkiLCAiVEVMT1BUIDExMCIsICJURUxPUFQgMTExIgorICAgLCAiVEVMT1BUIDExMiIsICJURUxPUFQgMTEzIiwgIlRFTE9QVCAxMTQiLCAiVEVMT1BUIDExNSIKKyAgICwgIlRFTE9QVCAxMTYiLCAiVEVMT1BUIDExNyIsICJURUxPUFQgMTE4IiwgIlRFTE9QVCAxMTkiCisgICAsICJURUxPUFQgMTIwIiwgIlRFTE9QVCAxMjEiLCAiVEVMT1BUIDEyMiIsICJURUxPUFQgMTIzIgorICAgLCAiVEVMT1BUIDEyNCIsICJURUxPUFQgMTI1IiwgIlRFTE9QVCAxMjYiLCAiVEVMT1BUIDEyNyIKKyAgICwgIlRFTE9QVCAxMjgiLCAiVEVMT1BUIDEyOSIsICJURUxPUFQgMTMwIiwgIlRFTE9QVCAxMzEiCisgICAsICJURUxPUFQgMTMyIiwgIlRFTE9QVCAxMzMiLCAiVEVMT1BUIDEzNCIsICJURUxPUFQgMTM1IgorICAgLCAiVEVMT1BUIDEzNiIsICJURUxPUFQgMTM3IiwgIlRFTE9QVCAxMzgiLCAiVEVMT1BUIDEzOSIKKyAgICwgIlRFTE9QVCAxNDAiLCAiVEVMT1BUIDE0MSIsICJURUxPUFQgMTQyIiwgIlRFTE9QVCAxNDMiCisgICAsICJURUxPUFQgMTQ0IiwgIlRFTE9QVCAxNDUiLCAiVEVMT1BUIDE0NiIsICJURUxPUFQgMTQ3IgorICAgLCAiVEVMT1BUIDE0OCIsICJURUxPUFQgMTQ5IiwgIlRFTE9QVCAxNTAiLCAiVEVMT1BUIDE1MSIKKyAgICwgIlRFTE9QVCAxNTIiLCAiVEVMT1BUIDE1MyIsICJURUxPUFQgMTU0IiwgIlRFTE9QVCAxNTUiCisgICAsICJURUxPUFQgMTU2IiwgIlRFTE9QVCAxNTciLCAiVEVMT1BUIDE1OCIsICJURUxPUFQgMTU5IgorICAgLCAiVEVMT1BUIDE2MCIsICJURUxPUFQgMTYxIiwgIlRFTE9QVCAxNjIiLCAiVEVMT1BUIDE2MyIKKyAgICwgIlRFTE9QVCAxNjQiLCAiVEVMT1BUIDE2NSIsICJURUxPUFQgMTY2IiwgIlRFTE9QVCAxNjciCisgICAsICJURUxPUFQgMTY4IiwgIlRFTE9QVCAxNjkiLCAiVEVMT1BUIDE3MCIsICJURUxPUFQgMTcxIgorICAgLCAiVEVMT1BUIDE3MiIsICJURUxPUFQgMTczIiwgIlRFTE9QVCAxNzQiLCAiVEVMT1BUIDE3NSIKKyAgICwgIlRFTE9QVCAxNzYiLCAiVEVMT1BUIDE3NyIsICJURUxPUFQgMTc4IiwgIlRFTE9QVCAxNzkiCisgICAsICJURUxPUFQgMTgwIiwgIlRFTE9QVCAxODEiLCAiVEVMT1BUIDE4MiIsICJURUxPUFQgMTgzIgorICAgLCAiVEVMT1BUIDE4NCIsICJURUxPUFQgMTg1IiwgIlRFTE9QVCAxODYiLCAiVEVMT1BUIDE4NyIKKyAgICwgIlRFTE9QVCAxODgiLCAiVEVMT1BUIDE4OSIsICJURUxPUFQgMTkwIiwgIlRFTE9QVCAxOTEiCisgICAsICJURUxPUFQgMTkyIiwgIlRFTE9QVCAxOTMiLCAiVEVMT1BUIDE5NCIsICJURUxPUFQgMTk1IgorICAgLCAiVEVMT1BUIDE5NiIsICJURUxPUFQgMTk3IiwgIlRFTE9QVCAxOTgiLCAiVEVMT1BUIDE5OSIKKyAgICwgIkFUQ1AiLCAiVEVMT1BUIDIwMSIsICJURUxPUFQgMjAyIiwgIlRFTE9QVCAyMDMiCisgICAsICJURUxPUFQgMjA0IiwgIlRFTE9QVCAyMDUiLCAiVEVMT1BUIDIwNiIsICJURUxPUFQgMjA3IgorICAgLCAiVEVMT1BUIDIwOCIsICJURUxPUFQgMjA5IiwgIlRFTE9QVCAyMTAiLCAiVEVMT1BUIDIxMSIKKyAgICwgIlRFTE9QVCAyMTIiLCAiVEVMT1BUIDIxMyIsICJURUxPUFQgMjE0IiwgIlRFTE9QVCAyMTUiCisgICAsICJURUxPUFQgMjE2IiwgIlRFTE9QVCAyMTciLCAiVEVMT1BUIDIxOCIsICJURUxPUFQgMjE5IgorICAgLCAiVEVMT1BUIDIyMCIsICJURUxPUFQgMjIxIiwgIlRFTE9QVCAyMjIiLCAiVEVMT1BUIDIyMyIKKyAgICwgIlRFTE9QVCAyMjQiLCAiVEVMT1BUIDIyNSIsICJURUxPUFQgMjI2IiwgIlRFTE9QVCAyMjciCisgICAsICJURUxPUFQgMjI4IiwgIlRFTE9QVCAyMjkiLCAiVEVMT1BUIDIzMCIsICJURUxPUFQgMjMxIgorICAgLCAiVEVMT1BUIDIzMiIsICJURUxPUFQgMjMzIiwgIlRFTE9QVCAyMzQiLCAiVEVMT1BUIDIzNSIKKyAgICwgIlRFTE9QVCAyMzYiLCAiVEVMT1BUIDIzNyIsICJURUxPUFQgMjM4IiwgIlRFTE9QVCAyMzkiCisgICAsICJURUxPUFQgMjQwIiwgIlRFTE9QVCAyNDEiLCAiVEVMT1BUIDI0MiIsICJURUxPUFQgMjQzIgorICAgLCAiVEVMT1BUIDI0NCIsICJURUxPUFQgMjQ1IiwgIlRFTE9QVCAyNDYiLCAiVEVMT1BUIDI0NyIKKyAgICwgIlRFTE9QVCAyNDgiLCAiVEVMT1BUIDI0OSIsICJURUxPUFQgMjUwIiwgIlRFTE9QVCAyNTEiCisgICAsICJURUxPUFQgMjUyIiwgIlRFTE9QVCAyNTMiLCAiVEVMT1BUIDI1NCIsICJFWE9QTCIKK307CisjZW5kaWYKKworI2VuZGlmIC8qIF9fRFJJVkVSX1NPVVJDRV9fICovCisKKy8qIHN1Yi1vcHRpb24gcXVhbGlmaWVycyAqLworI2RlZmluZSAgVEVMUVVBTF9JUyAgICAgMCAgICAgICAgLyogb3B0aW9uIGlzLi4uICovCisjZGVmaW5lICBURUxRVUFMX1NFTkQgICAxICAgICAgICAvKiBzZW5kIG9wdGlvbiAqLworCisvKgorICogTElORU1PREUgc3Vib3B0aW9ucworICovCisKKyNkZWZpbmUgIExNX01PREUgICAgICAgICAgICAxCisjZGVmaW5lICBMTV9GT1JXQVJETUFTSyAgICAgMgorI2RlZmluZSAgTE1fU0xDICAgICAgICAgICAgIDMKKworI2RlZmluZSAgTU9ERV9FRElUICAgICAgIDB4MDEKKyNkZWZpbmUgIE1PREVfVFJBUFNJRyAgICAweDAyCisjZGVmaW5lICBNT0RFX0FDSyAgICAgICAgMHgwNAorCisjZGVmaW5lICBNT0RFX01BU0sgICAgICAgKE1PREVfRURJVHxNT0RFX1RSQVBTSUd8TU9ERV9BQ0spCisKKy8qIE5vdCBwYXJ0IG9mIHByb3RvY29sLCBidXQgbmVlZGVkIHRvIHNpbXBsaWZ5IHRoaW5ncy4uLiAqLworI2RlZmluZSAgTU9ERV9GTE9XICAgICAgIDB4MDEwMAorI2RlZmluZSAgTU9ERV9FQ0hPICAgICAgIDB4MDIwMAorI2RlZmluZSAgTU9ERV9JTkJJTiAgICAgIDB4MDQwMAorI2RlZmluZSAgTU9ERV9PVVRCSU4gICAgIDB4MDgwMAorI2RlZmluZSAgTU9ERV9GT1JDRSAgICAgIDB4MTAwMAorCisjZGVmaW5lICBTTENfU1lOQ0ggICAxCisjZGVmaW5lICBTTENfQlJLICAgICAyCisjZGVmaW5lICBTTENfSVAgICAgICAzCisjZGVmaW5lICBTTENfQU8gICAgICA0CisjZGVmaW5lICBTTENfQVlUICAgICA1CisjZGVmaW5lICBTTENfRU9SICAgICA2CisjZGVmaW5lICBTTENfQUJPUlQgICA3CisjZGVmaW5lICBTTENfRU9GICAgICA4CisjZGVmaW5lICBTTENfU1VTUCAgICA5CisjZGVmaW5lICBTTENfRUMgICAgIDEwCisjZGVmaW5lICBTTENfRUwgICAgIDExCisjZGVmaW5lICBTTENfRVcgICAgIDEyCisjZGVmaW5lICBTTENfUlAgICAgIDEzCisjZGVmaW5lICBTTENfTE5FWFQgIDE0CisjZGVmaW5lICBTTENfWE9OICAgIDE1CisjZGVmaW5lICBTTENfWE9GRiAgIDE2CisjZGVmaW5lICBTTENfRk9SVzEgIDE3CisjZGVmaW5lICBTTENfRk9SVzIgIDE4CisKKyNkZWZpbmUgIE5TTEMgICAgICAgMTgKKworI2RlZmluZSAgU0xDX05BTUVTICAiMCIsICJTWU5DSCIsICJCUksiLCAiSVAiLCAiQU8iLCAiQVlUIiwgIkVPUiIsIFwKKyAgICAgICAgICAgICAgICAgICAgIkFCT1JUIiwgIkVPRiIsICJTVVNQIiwgIkVDIiwgIkVMIiwgIkVXIiwgIlJQIiwgXAorICAgICAgICAgICAgICAgICAgICAiTE5FWFQiLCAiWE9OIiwgIlhPRkYiLCAiRk9SVzEiLCAiRk9SVzIiCisKKyNkZWZpbmUgIFNMQ19OT1NVUFBPUlQgICAgIDAKKyNkZWZpbmUgIFNMQ19DQU5UQ0hBTkdFICAgIDEKKyNkZWZpbmUgIFNMQ19WQVJJQUJMRSAgICAgIDIKKyNkZWZpbmUgIFNMQ19ERUZBVUxUICAgICAgIDMKKyNkZWZpbmUgIFNMQ19MRVZFTEJJVFMgICAgMHgwMworCisjZGVmaW5lICBTTENfRlVOQyAgICAgICAgICAwCisjZGVmaW5lICBTTENfRkxBR1MgICAgICAgICAxCisjZGVmaW5lICBTTENfVkFMVUUgICAgICAgICAyCisKKyNkZWZpbmUgIFNMQ19BQ0sgICAgICAgICAgMHg4MAorI2RlZmluZSAgU0xDX0ZMVVNISU4gICAgICAweDQwCisjZGVmaW5lICBTTENfRkxVU0hPVVQgICAgIDB4MjAKKworI2VuZGlmICAvKiBURUxORVRfSF9fICovCmRpZmYgLS1naXQgYS9zeXMvdGVtcC9zdGRfaGVhZGVycy5oIGIvc3lzL3RlbXAvc3RkX2hlYWRlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTYwODBlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL3RlbXAvc3RkX2hlYWRlcnMuaApAQCAtMCwwICsxLDE1IEBACisjaWZuZGVmIF9TVERfSEVBREVSU18KKyNkZWZpbmUgX1NURF9IRUFERVJTXworCisvL0xBTkdVQUdFCit2b2lkIFNldEFydGljbGUoIGludCBmbCApOworc3RhdGljIGludCBRdWVyeUFGbGFnKCk7CitwdWJsaWMgdmFyYXJncyBzdHJpbmcgUXVlcnlBcnRpY2xlKCBpbnQgY2FzdXMsIGludCBkZW0sIGludCBmb3JjZSApOworcHVibGljIHZhcmFyZ3MgaW50IFN1Z2dlc3RBcnRpY2xlKCBzdHJpbmcgbXluYW1lICk7CitwdWJsaWMgdmFyYXJncyBzdHJpbmcgUXVlcnlQb3NzUHJvbm91biggaW50IHdoYXQsIGludCBjYXN1cywgaW50IG51bWJlciApOworcHVibGljIHN0cmluZyBRdWVyeVByb25vdW4oIGludCBjYXN1cyApOworcHVibGljIHZhcmFyZ3Mgc3RyaW5nIFF1ZXJ5RHUoaW50IGNhc3VzLGludCBnZW5kZXIsaW50IHphaGwpOworcHVibGljIHN0cmluZyBRdWVyeUdlbmRlclN0cmluZygpOworcHVibGljIHZhcmFyZ3Mgc3RyaW5nIERlY2xBZGooIHN0cmluZyBhZGosIGludCBjYXN1cywgaW50IGRlbW9uICk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzL3RlbXAvdXRpbC5oIGIvc3lzL3RlbXAvdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZmQyM2QKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdGVtcC91dGlsLmgKQEAgLTAsMCArMSwyNSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHN5cy90aGluZy91dGlsLmggLS0gSGVhZGVyZmlsZSBmdWVyIC9zdGQvdGhpbmcvdXRpbC5jCisvLworLy8gJElkOiB1dGlsLmgsdiAxLjEgMjAwMC8wOC8xNSAxMjowNzozMCBQYXJhY2Vsc3VzIEV4cCAkCisKKyNpZm5kZWYgX19USElOR19VVElMX0hfXworI2RlZmluZSBfX1RISU5HX1VUSUxfSF9fCisKKyNlbmRpZiAvLyBfX1RISU5HX1VUSUxfSF9fCisKKyNpZmRlZiBORUVEX1BST1RPVFlQRVMKKworI2lmbmRlZiBfX1RISU5HX1VUSUxfSF9QUk9UT19fCisjZGVmaW5lIF9fVEhJTkdfVVRJTF9IX1BST1RPX18KKworcHVibGljIHZvaWQgU2hvd1Byb3BMaXN0KHN0cmluZyAqcHJvcHMpOworc3RhdGljIHZvaWQgUHJldHR5RHVtcChtaXhlZCB4KTsKK3N0YXRpYyB2b2lkIER1bXBBcnJheShtaXhlZCAqeCk7CitzdGF0aWMgdm9pZCBEdW1wTWFwcGluZyhtYXBwaW5nIHgpOworc3RhdGljIHZvaWQgRHVtcEtleVZhbFBhaXIobWFwcGluZyB4LCBtaXhlZCBrZXksIGludCBzaXplKTsKKworI2VuZGlmIC8vIF9fVEhJTkdfVVRJTF9IX1BST1RPX18KKworI2VuZGlmIC8vIE5FRURfUFJPVE9UWVBFUwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5cy90ZXJtaW5hbC5oIGIvc3lzL3Rlcm1pbmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAzYWY2ZAotLS0gL2Rldi9udWxsCisrKyBiL3N5cy90ZXJtaW5hbC5oCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5cy90aGluZy5oIGIvc3lzL3RoaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ3ODAxNAotLS0gL2Rldi9udWxsCisrKyBiL3N5cy90aGluZy5oCkBAIC0wLDAgKzEsMTkgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyB0aGluZy5oIC0tIHN0YW5kYXJkIHRoaW5nIGRlZmluaXRpb25zCisvLworLy8gJElkOiB0aGluZy5oLHYgMy41IDIwMDQvMDUvMjAgMTk6MDA6MTIgVmFuaW9uIEV4cCAkCisKKyNpZm5kZWYgX19USElOR19IX18KKyNkZWZpbmUgX19USElOR19IX18KKworI2luY2x1ZGUgIi9zeXMvdGhpbmcvY29tbWFuZHMuaCIKKyNpbmNsdWRlICIvc3lzL3RoaW5nL2Rlc2NyaXB0aW9uLmgiCisjaW5jbHVkZSAiL3N5cy90aGluZy9sYW5ndWFnZS5oIgorI2luY2x1ZGUgIi9zeXMvdGhpbmcvcHJvcGVydGllcy5oIgorI2luY2x1ZGUgIi9zeXMvdGhpbmcvbW92aW5nLmgiCisjaW5jbHVkZSAiL3N5cy90aGluZy9yZXN0cmljdGlvbnMuaCIKKyNpbmNsdWRlICIvc3lzL3RoaW5nL21hdGVyaWFsLmgiCisjaW5jbHVkZSAiL3N5cy90aGluZy9saWdodHR5cGVzLmgiCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzL3RoaW5nL2NvbW1hbmRzLmggYi9zeXMvdGhpbmcvY29tbWFuZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmI4NzZkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL3RoaW5nL2NvbW1hbmRzLmgKQEAgLTAsMCArMSw0MSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHRoaW5nL2NvbW1hbmRzLmggLS0gY29tbWFuZCBoYW5kbGluZyBoZWFkZXIKKy8vCisvLyAkSWQ6IGNvbW1hbmRzLmggODcwNyAyMDE0LTAyLTIzIDIyOjM4OjM0WiBaZXNzdHJhICQKKworI2lmbmRlZiBfX1RISU5HX0NPTU1BTkRTX0hfXworI2RlZmluZSBfX1RISU5HX0NPTU1BTkRTX0hfXworCisvLyBwcm9wZXJ0aWVzCisKKyNkZWZpbmUgUF9DT01NQU5EUyAgICAgICAgICAgImNvbW1hbmRzIgorCisjZW5kaWYgLy8gX19USElOR19DT01NQU5EU19IX18KKworI2lmZGVmIE5FRURfUFJPVE9UWVBFUworCisjaWZuZGVmIF9fVEhJTkdfQ09NTUFORFNfSF9QUk9UT19fCisjZGVmaW5lIF9fVEhJTkdfQ09NTUFORFNfSF9QUk9UT19fCisKKy8vIHByb3RvdHlwZXMKKworLy8gYWRkIGNvbW1hbmRzIHRvIHRoZSBjb21tYW5kIGxpc3Qgb2YgdGhlIG9iamVjdAordmFyYXJncyB2b2lkIEFkZENtZChtaXhlZCBjbWQsIG1peGVkIGZ1bmMsIG1peGVkIGZsYWcsIG1peGVkIGNtZGlkKTsKKworLy8gcmVtb3ZlIGEgY29tbWFuZAordmFyYXJncyBpbnQgUmVtb3ZlQ21kKG1peGVkIGNtZCwgaW50IGRlbF9ub3J1bGUsIG1peGVkIG9ubHlpZCk7CisvLyBTZXQtIHVuZCBRdWVyeS1NZXRob2Rlbgorc3RhdGljIG1hcHBpbmcgX3NldF9jb21tYW5kcyhtYXBwaW5nIGNvbW1hbmRzKTsKK3N0YXRpYyBtYXBwaW5nIF9xdWVyeV9jb21tYW5kcygpOworCisKKy8vIGludGVybmFsCitzdGF0aWMgaW50IF9leGVjdXRlKG1peGVkIGZ1biwgc3RyaW5nIHN0ciwgbWl4ZWQgKnBhcnNlZCk7CitzdGF0aWMgaW50IF9wcm9jZXNzX2NvbW1hbmQoc3RyaW5nIHN0ciwgc3RyaW5nICpub3BhcnNlc3RyLG1peGVkIGZ1biwgbWl4ZWQgZmxhZywgbWl4ZWQgcnVsZSk7CisKK3B1YmxpYyBpbnQgX2NsKHN0cmluZyBzdHIpOworCisjZW5kaWYgLy8gX19USElOR19DT01NQU5EU19IX1BST1RPX18KKworI2VuZGlmCS8vIE5FRURfUFJPVE9ZUEVTCmRpZmYgLS1naXQgYS9zeXMvdGhpbmcvZGVzY3JpcHRpb24uaCBiL3N5cy90aGluZy9kZXNjcmlwdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyOWY0NDUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdGhpbmcvZGVzY3JpcHRpb24uaApAQCAtMCwwICsxLDEyOCBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHRoaW5nL2Rlc2NyaXB0aW9uLmggLS0gaGVhZGVyCisvLworLy8gJElkOiBkZXNjcmlwdGlvbi5oIDkyMDggMjAxNS0wNS0xMCAyMDo1NDowNlogWmVzc3RyYSAkCisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gdGhpbmcvZGVzY3JpcHRpb24uaCAtLSBoZWFkZXIKKy8vCisvLyAkSWQ6IGRlc2NyaXB0aW9uLmggOTIwOCAyMDE1LTA1LTEwIDIwOjU0OjA2WiBaZXNzdHJhICQKKyAKKyNpZm5kZWYgX19USElOR19ERVNDUklQVElPTl9IX18KKyNkZWZpbmUgX19USElOR19ERVNDUklQVElPTl9IX18KKworLy8gcHJvcGVydGllcworI2RlZmluZSBQX05BTUUgICAgICAgICAgICAgICAibmFtZSIgICAgICAgLy8gbmFtZSBvZiB0aGUgb2JqZWN0CisjZGVmaW5lIFBfTkFNRV9BREogICAgICAgICAgICJuYW1lX2FkaiIgICAvLyBhZGplY3RpdmUgb2YgdGhlIG5hbWUKKyNkZWZpbmUgUF9TSE9SVCAgICAgICAgICAgICAgInNob3J0IiAgICAgIC8vIHNob3J0IGRlc2NpcHRpb24gb2YgdGhlIG9iamVjdAorI2RlZmluZSBQX0xPTkcgICAgICAgICAgICAgICAibG9uZyIgICAgICAgLy8gbG9uZyBkZXNjcmlwdGlvbiBvZiB0aGUgb2JqZWN0CisjZGVmaW5lIFBfSURTICAgICAgICAgICAgICAgICJpZHMiICAgICAgICAvLyBpZGVudGlmaWVyIG9mIHRoZSBvYmplY3QKKyNkZWZpbmUgUF9BREpFQ1RJVkVTICAgICAgICAgImFkamVjdGl2ZXMiIC8vIGFkamVjdGl2ZXMgb2YgdGhlIG9iamVjdAorI2RlZmluZSBQX1NIT1dfSU5WICAgICAgICAgICAic2hvd19pbnYiICAgLy8gU2hvdyBpbiBpbnZlbnRvcnkgb2YgcGxheWVyCisjZGVmaW5lIFBfQ0xBU1MgICAgICAgICAgICAgICJjbGFzcyIgICAgICAvLyBjbGFzcywgbGlrZSB1bmRlYWQgb3IgZXhwbG9zaXZlCisKKyNkZWZpbmUgUF9LSUxMX01TRyAgICAgICAgICAgImtpbGxfbXNnIgorI2RlZmluZSBQX0tJTExfTkFNRSAgICAgICAgICAia2lsbF9uYW1lIgorCisjZGVmaW5lIFBfSEVBTCAgICAgICAgICAgICAgICJoZWFsIgorI2RlZmluZSBQX0NPTUJBVENNRFMgICAgICAgICAiY29tYmF0Y21kcyIKKworI2RlZmluZSBQX1ZBTFVFICAgICAgICAgICAgICAidmFsdWUiCisjZGVmaW5lIFBfTk9CVVkgICAgICAgICAgICAgICJub2J1eSIKKyNkZWZpbmUgUF9OT1NFTEwgICAgICAgICAgICAgIm5vc2VsbCIKKyNkZWZpbmUgUF9NQUdJQyAgICAgICAgICAgICAgIm1hZ2ljIgorI2RlZmluZSBQX05PTUFHSUMgICAgICAgICAgICAibm9tYWdpYyIKKworI2RlZmluZSBQX0xPR19GSUxFICAgICAgICAgICAibG9nX2ZpbGUiICAgLy8gYnVncyBpbiBhbmRlcmVzIHJlcGZpbGUgdW1sZWl0ZW4KKworI2RlZmluZSBQX0xJR0hUICAgICAgICAgICAgICAibGlnaHQiCisjZGVmaW5lIFBfVE9UQUxfTElHSFQgICAgICAgICJ0b3RhbF9saWdodCIKKworI2RlZmluZSBQX0NVUlNFRCAgICAgICAgICAgICAiY3Vyc2VkIgorI2RlZmluZSBQX0tFRVBfT05fU0VMTCAgICAgICAia2VlcF9vbl9zZWxsIgorCisjZGVmaW5lIFBfQ0xPTkVSICAgICAgICAgICAgICJjbG9uZXIiCisjZGVmaW5lIFBfQ0xPTkVfVElNRSAgICAgICAgICJjbG9uZV90aW1lIgorCisvKiByZWFkX21zZyBpc3QgYXVjaCBmdWVyIG5pY2h0IGZlcm53ZXN0LWt1bmRpZ2UgbGVzYmFyICovCisjZGVmaW5lIFBfUkVBRF9NU0cgICAgICAgICAgICJyZWFkX21zZyIKKyNkZWZpbmUgUF9GV19BTFdBWVNfUkVBREFCTEUgImZ3X2Fsd2F5c19yZWFkYWJsZSIKKyNkZWZpbmUgUF9ERVRBSUxTICAgICAgICAgICAgImRldGFpbHMiCisjZGVmaW5lIFBfU1BFQ0lBTF9ERVRBSUxTICAgICJzcGVjaWFsX2RldGFpbHMiCisjZGVmaW5lIFBfUkVBRF9ERVRBSUxTICAgICAgICJyZWFkX2RldGFpbHMiCisjZGVmaW5lIFBfU01FTExTICAgICAgICAgICAgICJzbWVsbF9kZXRhaWxzIgorI2RlZmluZSBQX1NPVU5EUyAgICAgICAgICAgICAic291bmRfZGV0YWlscyIKKyNkZWZpbmUgUF9UT1VDSF9ERVRBSUxTICAgICAgInBfbGliX3RvdWNoX2RldGFpbHMiCisjaWZuZGVmIFBfSU5WSVMKKyNkZWZpbmUgUF9JTlZJUyAgICAgICAgICAgICAgImludmlzIgorI2VuZGlmCisKKyNkZWZpbmUgU0VOU0VfREVGQVVMVCAiXG5kZWZhdWx0IgorI2RlZmluZSBTRU5TRV9WSUVXICAwCisjZGVmaW5lIFNFTlNFX1NNRUxMIDEKKyNkZWZpbmUgU0VOU0VfU09VTkQgMgorI2RlZmluZSBTRU5TRV9UT1VDSCAzCisjZGVmaW5lIFNFTlNFX1JFQUQgIDQKKworI2VuZGlmIC8vIF9fVEhJTkdfREVTQ1JJUFRJT05fSF9fCisKKyNpZmRlZiBORUVEX1BST1RPVFlQRVMKKworI2lmbmRlZiBfX1RISU5HX0RFU0NSSVBUSU9OX0hfUFJPVE9fXworI2RlZmluZSBfX1RISU5HX0RFU0NSSVBUSU9OX0hfUFJPVE9fXworCisvLyBwcm90b3R5cGVzCisvLyBjaGVjayBpZiB0aGUgb2JqZWN0cyBjYW4gYnkgaWRlbnRpZmllZCBieSBzdHIKK3ZhcmFyZ3MgaW50IGlkKHN0cmluZyBzdHIsIGludCBsdmwpOworCisvLyBjaGVjayBJRHMgdnMuIHN0cmluZyoKK2ludCBtYXRjaF9pZHMoc3RyaW5nICpsaXN0KTsKKworLy8gYWRkIGFuIGlkIHRvIHRoZSBjdXJyZW50IG9iamVjdAordm9pZCBBZGRJZChzdHJpbmd8c3RyaW5nKiBzdHIpOworCisvLyByZW1vdmUgYW4gaWQgZnJvbSB0aGUgb2JqZWN0Cit2b2lkIFJlbW92ZUlkKHN0cmluZ3xzdHJpbmcqIHN0cik7CisKKy8vIGFkZCBhbiBhZGplY3RpdmUgdG8gZGVzY3JpYmUgdGhlIG9iamVjdAordm9pZCBBZGRBZGplY3RpdmUoc3RyaW5nfHN0cmluZyogc3RyKTsKKworLy8gcmVtb3ZlIGFuIGFkamVjdGl2ZSBmcm9tIHRoZSBvYmplY3QKK3ZvaWQgUmVtb3ZlQWRqZWN0aXZlKHN0cmluZ3xzdHJpbmcqIHN0cik7CisKKy8vIGdldCB0aGUgbmFtZSB3aXRoIGNhc3VzIGFuZCBkZW1vbnN0cmF0aXZlCit2YXJhcmdzIHN0cmluZyBuYW1lKGludCBjYXN1cywgaW50IGRlbW9uKTsKK3ZhcmFyZ3Mgc3RyaW5nIE5hbWUoaW50IGNhc3VzLCBpbnQgZGVtb24pOworCisvLyBjaGVjayBpZiBvYmplY3QgaXMgbWVtYmVyIG9mIGEgY2xhc3MKK2ludCBpc19jbGFzc19tZW1iZXIoc3RyaW5nfHN0cmluZyogc3RyKTsKKworLy8gYWRkIG9iamVjdCB0byBhIGNsYXNzCit2b2lkIEFkZFRvQ2xhc3Moc3RyaW5nIHN0cik7CisKKy8vIGFkZCBhIGRldGFpbCB0byBvYmplY3QKK3B1YmxpYyB2b2lkIEFkZERldGFpbCggc3RyaW5nfHN0cmluZyoga2V5cywgc3RyaW5nfHN0cmluZyp8bWFwcGluZ3xjbG9zdXJlIGRlc2NyICk7CitwdWJsaWMgdm9pZCBBZGRSZWFkRGV0YWlsKCBzdHJpbmd8c3RyaW5nKiBrZXlzLCBzdHJpbmd8c3RyaW5nKnxtYXBwaW5nfGNsb3N1cmUgZGVzY3IgKTsKK3B1YmxpYyB2b2lkIEFkZFNtZWxscyggc3RyaW5nfHN0cmluZyoga2V5cywgc3RyaW5nfHN0cmluZyp8bWFwcGluZ3xjbG9zdXJlIGRlc2NyICk7CitwdWJsaWMgdm9pZCBBZGRTb3VuZHMoIHN0cmluZ3xzdHJpbmcqIGtleXMsIHN0cmluZ3xzdHJpbmcqfG1hcHBpbmd8Y2xvc3VyZSBkZXNjciApOworcHVibGljIHZvaWQgQWRkVG91Y2hEZXRhaWwoIHN0cmluZ3xzdHJpbmcqIGtleXMsIHN0cmluZ3xzdHJpbmcqfG1hcHBpbmd8Y2xvc3VyZSBkZXNjciApOworCisvLyByZW1vdmUgYSBkZXRhaWwgZnJvbSBvYmplY3QKK3B1YmxpYyB2YXJhcmdzIHZvaWQgUmVtb3ZlRGV0YWlsKCBzdHJpbmd8c3RyaW5nKiBrZXlzICk7CitwdWJsaWMgdmFyYXJncyB2b2lkIFJlbW92ZVNtZWxscyggc3RyaW5nfHN0cmluZyoga2V5cyApOworcHVibGljIHZhcmFyZ3Mgdm9pZCBSZW1vdmVTb3VuZHMoIHN0cmluZ3xzdHJpbmcqIGtleXMgKTsKK3B1YmxpYyB2YXJhcmdzIHZvaWQgUmVtb3ZlUmVhZERldGFpbCggc3RyaW5nfHN0cmluZyoga2V5cyApOworcHVibGljIHZhcmFyZ3Mgdm9pZCBSZW1vdmVUb3VjaERldGFpbCggc3RyaW5nfHN0cmluZyoga2V5cyApOworCisvLyBhZGQgYSBzcGVjaWFsIGRldGFpbCB0byBvYmplY3QKK3ZvaWQgQWRkU3BlY2lhbERldGFpbChzdHJpbmd8c3RyaW5nKiBrZXlzLCBzdHJpbmcgZnVuY3Rpb25uYW1lICk7CisKKy8vIHJlbW92ZSBhIHNwZWNpYWwgZGV0YWlsIHRvIG9iamVjdAordm9pZCBSZW1vdmVTcGVjaWFsRGV0YWlsKCBzdHJpbmd8c3RyaW5nKiBrZXlzICk7CisKK3N0YXRpYyB2b2lkIEdpdmVFUChpbnQgdHlwZSwgc3RyaW5nIGtleSk7CisKKyNlbmRpZiAvLyBfX1RISU5HX0RFU0NSSVBUSU9OX0hfUFJPVE9fXworCisjZW5kaWYJLy8gTkVFRF9QUk9UT1lQRVMKZGlmZiAtLWdpdCBhL3N5cy90aGluZy9sYW5ndWFnZS5oIGIvc3lzL3RoaW5nL2xhbmd1YWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFhZmQ4NgotLS0gL2Rldi9udWxsCisrKyBiL3N5cy90aGluZy9sYW5ndWFnZS5oCkBAIC0wLDAgKzEsNzkgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyB0aGluZy9sYW5ndWFnZS5oIC0tIGxhbmd1YWdlIGhhbmRsaW5nCisvLworLy8gJElkOiBsYW5ndWFnZS5oIDYzMzAgMjAwNy0wNS0yNiAxNzo1MzoyMVogWmVzc3RyYSAkCisgCisjaWZuZGVmIF9fVEhJTkdfTEFOR1VBR0VfSF9fCisjZGVmaW5lIF9fVEhJTkdfTEFOR1VBR0VfSF9fCisKKy8vIHByb3BlcnRpZXMKKyNkZWZpbmUgUF9BUlRJQ0xFICAgICAgICAgICAgImFydGljbGUiCisjZGVmaW5lIFBfR0VOREVSICAgICAgICAgICAgICJnZW5kZXIiCisjZGVmaW5lIFBfUExVUkFMICAgICAgICAgICAgICJwbHVyYWwiCisKKy8vIHNwZWNpYWwgZGVmaW5lcworCisjZGVmaW5lIFdFUiAJMAorI2RlZmluZSBXRVNTRU4gCTEKKyNkZWZpbmUgV0VNIAkyCisjZGVmaW5lIFdFTiAJMworI2RlZmluZSBSQVcgICAgIDk5ICAgLy8gbmFtZSB3aXRob3V0IGFydGljbGUKKworI2RlZmluZSBORVVURVIgCQkwCisjZGVmaW5lIE1BTEUgCQkxCisjZGVmaW5lIEZFTUFMRSAJCTIKKworI2RlZmluZSBTSU5HVUxBUiAJMAorI2RlZmluZSBQTFVSQUwgCQkxCisKKyNlbmRpZiAvLyBfX1RISU5HX0xBTkdVQUdFX0hfXworCisjaWZkZWYgTkVFRF9QUk9UT1RZUEVTCisKKyNpZm5kZWYgX19USElOR19MQU5HVUFHRV9IX1BST1RPX18KKyNkZWZpbmUgX19USElOR19MQU5HVUFHRV9IX1BST1RPX18KKworLy8gcHJvdG90eXBlcworCisvLyBBcnRpa2VsIGltIHBhc3NlbmRlbiBGYWxsIHNvd2llIGRlbW9uc3QuIGJ6dyB1bmRlbW9uc3QuIHp1cnVlY2stCisvLyBnZWJlbi4gZm9yY2UgdWViZXJzY2hyZWlidCBkYXMgU2V0QXJ0aWNsZS1GbGFnLgorcHVibGljIHZhcmFyZ3Mgc3RyaW5nIFF1ZXJ5QXJ0aWNsZShpbnQgY2FzdXMsIGludCBkZW0sIGludCBmb3JjZSk7CisKKy8vIEVtcGZlaGxlIGVpbmVuIEFydGlrZWwgZnVlciBkYXMgT2JqZWt0LCBnZXRlc3RldCB3aXJkLCBvYiBhdXNzZXIKKy8vIGRpZXNlbSBPYmpla3Qgc2ljaCBlaW4gYW5kZXJlcyBPYmpla3QgbWl0IGRlciBpZCBpbSBzZWxiZW4KKy8vIFJhdW0gYmVmaW5kZXQuCitwdWJsaWMgdmFyYXJncyBpbnQgU3VnZ2VzdEFydGljbGUoc3RyaW5nIGlkKTsKKworLy8gR2liIGVpbiBQcm9ub21lbiB6dXJ1ZWNrLCB3ZWxjaGVzIGF1c2RydWVja3QsIGRhcyBlaW4gT2JqZWt0IGRpZXNlbQorLy8gT2JqZWt0IGdlaG9lcnQuIERhYmVpIGlzdCB3aGF0IGRhcyBHZXNjaGxlY2h0IGRlcyBPYmpla3Rlcy4KK3B1YmxpYyB2YXJhcmdzIHN0cmluZyBRdWVyeVBvc3NQcm9ub3VuKG1peGVkIHdoYXQsIGludCBjYXN1cywgaW50IG51bWJlcik7CisKKy8vIEVyL1NpZS9FcyB1LmFlLiB6dXJ1ZWNrZ2ViZW4uCitwdWJsaWMgdmFyYXJncyBzdHJpbmcgUXVlcnlQcm9ub3VuKGludCBjYXN1cyk7CisKKy8vIER1IGltIHBhc3NlbmRlbiBGYWxsIHp1cnVlY2tnZWJlbi4KK3B1YmxpYyB2YXJhcmdzIHN0cmluZyBRdWVyeUR1KGludCBjYXN1cyxpbnQgZ2VuZGVyLCBpbnQgemFobCk7CisKKy8vIEdlc2NobGVjaHQgaW4gV29ydGVuIHp1cnVlY2tnZWJlbiAobWFlbm5saWNoLCB3ZWlibGljaCwgc2FlY2hsaWNoKQorcHVibGljIHN0cmluZyBRdWVyeUdlbmRlclN0cmluZygpOworCisvLyBEZWtsaW5hdGlvbiBlaW5lcyBBZGpla3RpdnMKK3B1YmxpYyB2YXJhcmdzIHN0cmluZyBEZWNsQWRqKG1peGVkIGFkaiwgaW50IGNhc3VzLCBpbnQgZGVtb24pOworCisvLyBRdWVyeS0gdW5kIFNldC1NZXRob2Rlbgorc3RhdGljIGludCBfc2V0X2FydGljbGUoaW50IGZsKTsKK3N0YXRpYyBpbnQgX3F1ZXJ5X2FydGljbGUoKTsKK3N0YXRpYyBpbnQgX3NldF9nZW5kZXIoaW50IGkpOworCisvLyBJbnRlcm5hCitzdGF0aWMgaW50IFF1ZXJ5QUZsYWcoKTsKKworI2VuZGlmIC8vIF9fVEhJTkdfTEFOR1VBR0VfSF9QUk9UT19fCisKKyNlbmRpZiAvLyBORUVEX1BST1RPWVBFUworCisKKworCisKZGlmZiAtLWdpdCBhL3N5cy90aGluZy9saWdodHR5cGVzLmggYi9zeXMvdGhpbmcvbGlnaHR0eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZTk1ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdGhpbmcvbGlnaHR0eXBlcy5oCkBAIC0wLDAgKzEsODMgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBsaWdodHR5cGVzLmggLS0gV2VsY2hlIFR5cGVuIHZvbiBMaWNodCBnaWJ0IGVzIGltIE1vcmdlbkdyYXVlbj8gCisvLworLy8gJElkOiBsaWdodHR5cGVzLmgsdiAxLjIgMjAwNC8wNi8xMiAxNDowMDo0OCBWYW5pb24gRXhwICQKKyAKKyNpZm5kZWYgX19USElOR19MSUdIVFRZUEVTX0hfXworI2RlZmluZSBfX1RISU5HX0xJR0hUVFlQRVNfSF9fCisKKyNkZWZpbmUgUF9MSUdIVF9UWVBFICAgImxpZ2h0X3R5cGUiICAvLyBXZWxjaGVzIExpY2h0IGhlcnJzY2h0IGhpZXIgdm9yPworCisvLyBNb2RlLVBhcmFtZXRlciBmdWVyIENoZWNrTGlnaHRUeXBlCisjZGVmaW5lIExUX0NIRUNLX0FOWSAgICAgMCAKKyNkZWZpbmUgTFRfQ0hFQ0tfQUxMICAgICAxCisjZGVmaW5lIExUX0NIRUNLX01BVENIICAgMgorI2RlZmluZSBMVF9DSEVDS19OT05FICAgIDMKKworLy8gQmFzaXNsaWNodHR5cGVuCisjZGVmaW5lIExUX01JU0MgICAgICAgICAgMCAgLy8gVW5iZXN0aW1tdAorCisvLyBOYXR1ZXJsaWNoZSBMaWNodHF1ZWxsZW4gKFRhZykKKyNkZWZpbmUgTFRfU1VOICAgICAgICAgICAxICAvLyBTb25uZW5zY2hlaW4KKyNkZWZpbmUgTFRfRElGRlVTRSAgICAgICAyICAvLyBJbmRpcmVrdGVzIFRhZ2VzbGljaHQKKworLy8gTmF0dWVybGljaGUgTGljaHRxdWVsbGVuIChOYWNodCkKKyNkZWZpbmUgTFRfTU9PTiAgICAgICAgICA0ICAvLyBNb25kbGljaHQKKyNkZWZpbmUgTFRfU1RBUlMgICAgICAgICA4ICAvLyBTdGVybmVubGljaHQKKworLy8gRHJlaSBiZXNvbmRlcnMgb2Z0IHZvcmtvbW1lbmRlIFR5cGVuIG9mZmVuZW4gTGljaHRzCisjZGVmaW5lIExUX0NBTkRMRSAgICAgICAxNiAgLy8gS2VyemVubGljaHQKKyNkZWZpbmUgTFRfVE9SQ0ggICAgICAgIDMyICAvLyBGYWNrZWxzY2hlaW4KKyNkZWZpbmUgTFRfT1BFTl9GSVJFICAgIDY0ICAvLyBMYWdlcmZldWVyIGV0Yy4KKworLy8gTWFnaXNjaGUgZXJ6ZXVndGVzIExldWNodGVuLCB3aXJkIG5pY2h0IG5hZWhlciBkZWZpbmllcnQuCisjZGVmaW5lIExUX01BR0lDICAgICAgIDEyOCAgLy8gTWFnaXNjaGUgTGljaHRxdWVsbGUKKworLy8gQWxsZXMgd2FzIHNvIGdsdWVoZW4ga2FubjogVm9uIEdsdWVoYmlybmUgYmlzIHp1IFBob3NwaG9yCisjZGVmaW5lIExUX0dMT1dJTkcgICAgIDI1NiAgLy8gU2VsYnN0bGV1Y2h0ZW5kZSBMaWNodHF1ZWxsZW4KKworLy8gRWluIFJhdW0ga2FubiBhdWNoIGV4cGxpeml0IGF1ZiBEdW5rZWwgZ2VzZXR6dCB3ZXJkZW4uCisvLyBFaW5lIE1pc2NodW5nIG1pdCBhbmRlcmVuIFR5cGVuIHNjaGVpbnQgYWJlciB3ZW5pZyBzaW5udm9sbC4KKyNkZWZpbmUgTFRfREFSS05FU1MgICAgNTEyICAvLyBEdW5rZWxoZWl0CisKKy8vIEdlbWlzY2h0ZSBUeXBlbiwgc2llIGRpZW5lbiBkYXp1LCBrb21mb3J0YWJlbCBBYmZyYWdlbiBhdWYgTGljaHR0eXBlbiAKKy8vIHp1IGltcGxlbWVudGllcmVuLiBCZWltIHNldHplbiBzb2xsdGUgaW1tZXIgYmVzc2VyIGF1ZiBkaWUgZ2VuYXVlcmVuIAorLy8gTGljaHR0eXBlbiB6dXJ1ZWNrZ2VncmlmZmVuIHdlcmRlbi4KKworLy8gVGFnZXNsaWNodCBpbSBhbGxnZW1laW5lbgorI2RlZmluZSBMVF9EQVlMSUdIVCAgICAoTFRfU1VOfExUX0RJRkZVU0UpCisKKy8vIERhIGVzIHZlcnNjaGllZGVuZSBUeXBlbiBvZmZlbmVuIEZldWVycyBnaWJ0LCB3aXJkIGhpZXIKKy8vIG5vY2ggZWluIEFiZnJhZ2V0eXAgZGVmaW5pZXJ0LgorI2RlZmluZSBMVF9GSVJFICAgICAgICAoTFRfQ0FORExFfExUX1RPUkNIfExUX09QRU5fRklSRSkKKworLy8gTmF0dWVybGljaGVzIExpY2h0CisjZGVmaW5lIExUX05BVFVSQUwgICAgIChMVF9EQVlMSUdIVHxMVF9TVEFSU3xMVF9NT09OKQorCisvLyBLdWVuc3RsaWNoZXMgTGljaHQKKyNkZWZpbmUgTFRfQVJUSUZJQ0lBTCAgIChMVF9NQUdJQ3xMVF9GSVJFfExUX0dMT1dJTkcpCisKKyNlbmRpZiAvLyBfVEhJTkdfTElHSFRUWVBFU19IX18KKworI2lmZGVmIE5FRURfUFJPVE9UWVBFUworCisjaWZuZGVmIF9fVEhJTkdfTElHSFRUWVBFU19IX1BST1RPX18KKyNkZWZpbmUgX19USElOR19MSUdIVFRZUEVTX0hfUFJPVE9fXworCisvLyBEaWVzZSBEb2t1IHdpcmQgbm9jaCBlbnRmZXJudCwgd2VubiBkaWUgTWFucGFnZSBlcnN0ZWxsdCB3b3JkZW4gaXN0LgorLy8gCisvLyBFaW5lIEZ1bmt0aW9uLCBtaXQgZGVyIGRhcyBBYmZhZ2VuIGVpbmVzIG9kZXIgbWVocmVyZXIgTGljaHR0eXBlbiAKKy8vIG1vZWdsaWNoIGlzdCwgaXN0IGltIHN0ZC90aGluZy9kZXNjcmlwdGlvbiBkZWZpbmllcnQuIEJlaXNwaWVsOiAKKy8vIAorLy8gdGhpbmctPkNoZWNrTGlnaHRUeXBlKExUX0RBWUxJR0hUKSAKKy8vICAgICAgIGdpYnQgdHJ1ZSB3ZW5uIGVpbiBUYWdlc2xpY2h0dHlwIGdlc2V0enQgaXN0LgorLy8KKy8vIHRoaW5nLT5DaGVja0xpZ2h0VHlwZShMVF9TVU58TFRfTU9PTikgCisvLyAgICAgICBnaWJ0IHRydWUsIHdlbm4gZWluZXIgZGVyIGJlaWRlbiBIaW1tZWxza29lcnBlciBsZXVjaHRldC4KKwordmFyYXJncyBpbnQgQ2hlY2tMaWdodFR5cGUoaW50IGxpZ2h0dHlwZSwgaW50IG1vZGUpOworCisjZW5kaWYgLy8gX19USElOR19MSUdIVFRZUEVTX0hfUFJPVE9fXworCisjZW5kaWYgLy8gTkVFRF9QUk9UT1RZUEVTCmRpZmYgLS1naXQgYS9zeXMvdGhpbmcvbWF0ZXJpYWwuaCBiL3N5cy90aGluZy9tYXRlcmlhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNzk2OWEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdGhpbmcvbWF0ZXJpYWwuaApAQCAtMCwwICsxLDMyIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gdGhpbmcvbWF0ZXJpYWwuaCAtLSBtYXRlcmlhbCBoYW5kbGluZyBoZWFkZXIKKy8vCisvLyAkSWQ6IG1hdGVyaWFsLmggNjkzMCAyMDA4LTA4LTA5IDA5OjIwOjE2WiBaZXNzdHJhICQKKworI2lmbmRlZiBfX1RISU5HX01BVEVSSUFMX0hfXworI2RlZmluZSBfX1RISU5HX01BVEVSSUFMX0hfXworCisjZGVmaW5lIFBfTUFURVJJQUwgICAgICAgICAgICAgICJtYXRlcmlhbCIKKyNkZWZpbmUgTUFURVJJQUxEQiAgICAgICAgICAgICAgIi9zZWN1cmUvbWF0ZXJpYWxkYiIKKyNkZWZpbmUgUF9NQVRFUklBTF9LTk9XTEVER0UgICAgIm1hdGVyaWFsX2tub3dsZWRnZSIKKyNkZWZpbmUgTUFURVJJQUxfU1lNTUVUUklDX1JFQ09HTklaQUJJTElUWSAibWF0X3N5bV9yZWNvYyIKKworLy8gTWF0ZXJpYWxpZW4gbmljaHQgYmVpbSBMYWRlbiBkdXJjaCBNYXREQiBpbmNsdWRlbgorLy8gVE9ETzogYmVzc2VyIHJlY29jLXByb3BlcnR5ZGVmaW5pdGlvbmVuIHdvYW5kZXJzIHJlaW4gdW5kIE1hdGVyaWFsaWVuIGhpZXIKKy8vIGltbWVyIGluY2x1ZGVuCisjaWZuZGVmIF9TS0lQX01BVEVSSUFMU18KKyNpbmNsdWRlIDxtYXRlcmlhbHMuaD4KKyNlbmRpZgorCisjaWZkZWYgTkVFRF9QUk9UT1RZUEVTCisjaWZuZGVmIF9fVEhJTkdfTUFURVJJQUxfSF9QUk9UT19fCisjZGVmaW5lIF9fVEhJTkdfTUFURVJJQUxfSF9QUk9UT19fCisKK2ludCBRdWVyeU1hdGVyaWFsKHN0cmluZyBtYXQpOworaW50IFF1ZXJ5TWF0ZXJpYWxHcm91cChzdHJpbmcgbWF0Z3JvdXApOworc3RyaW5nIE1hdGVyaWFsTGlzdChpbnQgY2FzdXMsIG1peGVkIGlkaW5mKTsKKworI2VuZGlmIC8vIF9fVEhJTkdfTUFURVJJQUxfSF9QUk9UT19fCisjZW5kaWYgLy8gTkVFRF9QUk9UT1RZUEVTCisjZW5kaWYgLy8gX19USElOR19NQVRFUklBTF9IX18KZGlmZiAtLWdpdCBhL3N5cy90aGluZy9tb3ZpbmcuaCBiL3N5cy90aGluZy9tb3ZpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmUxNGE3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL3RoaW5nL21vdmluZy5oCkBAIC0wLDAgKzEsNDMgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyB0aGluZy9tb3ZpbmcuaCAtLSBvYmplY3QgbW92aW5nCisvLworLy8gJElkOiBtb3ZpbmcuaCA4ODkyIDIwMTQtMDgtMDQgMTk6NDg6MjhaIFplc3N0cmEgJAorIAorI2lmbmRlZiBfX1RISU5HX01PVklOR19IX18KKyNkZWZpbmUgX19USElOR19NT1ZJTkdfSF9fCisKKy8vIHByb3BlcnRpZXMKKyNkZWZpbmUgUF9ORVZFUkRST1AgICAgICAgICAgICJuZXZlcmRyb3AiCisjZGVmaW5lIFBfTk9EUk9QICAgICAgICAgICAgICAibm9kcm9wIiAgICAvLyBjYW4ndCBiZSBkcm9wcGVkCisjZGVmaW5lIFBfTk9HRVQgICAgICAgICAgICAgICAibm9nZXQiICAgICAvLyBjYW4ndCBiZSB0YWtlbgorCisjZGVmaW5lIFBfTk9JTlNFUlRfTVNHICAgICAgICAibm9pbnNlcnRfbXNnIiAgICAgIC8vIEZlaGxlcm1lbGR1bmcgYmVpIE1FX0NBTlRfQkVfSU5TRVJURUQKKyNkZWZpbmUgUF9OT0xFQVZFX01TRyAgICAgICAgICJub2xlYXZlX21zZyIgICAgICAgLy8gRmVobGVybWVsZHVuZyBiZWkgTUVfQ0FOVF9MRUFWRV9FTlYKKyNkZWZpbmUgUF9FTlZfVE9PX0hFQVZZX01TRyAgICJlbnZfdG9vX2hlYXZ5X21zZyIgLy8gRmVobGVybWVsZHVuZyBiZWkgTUVfVE9PX0hFQVZZX0ZPUl9FTlYKKyNkZWZpbmUgUF9UT09fTUFOWV9NU0cgICAgICAgICJ0b29fbWFueV9tc2ciICAgICAgLy8gRmVobGVybWVsZHVuZyBiZWkgTUVfVE9PX01BTllfT0JKRUNUUworI2RlZmluZSBQX1RPT19IRUFWWV9NU0cgICAgICAgInRvb19oZWF2eV9tc2ciICAgICAvLyBGZWhsZXJtZWxkdW5nIGJlaSBNRV9UT09fSEVBVlkKKworI2RlZmluZSBQX0xBU1RfTU9WRSAgICAgICAgICAgImxhc3RfbW92ZSIKKyNkZWZpbmUgUF9MQVNUX0NPTlRFTlRfQ0hBTkdFICJsYXN0X2NvbnRlbnRfY2hhbmdlIgorCisjZGVmaW5lIFBfU0VOU0lUSVZFICAgICAic2Vuc2l0aXZlIiAvLyBzaG91bGQgYmUgcmVnaXN0ZXJlZCBhcyBzZW5zaXRpdmUgb2JqZWN0CisKKworI2VuZGlmIC8vIF9fVEhJTkdfTU9WSU5HX0hfXworCisjaWZkZWYgTkVFRF9QUk9UT1RZUEVTCisKKyNpZm5kZWYgX19USElOR19NT1ZJTkdfSF9QUk9UT19fCisjZGVmaW5lIF9fVEhJTkdfTU9WSU5HX0hfUFJPVE9fXworCisvLyBwcm90b3R5cGVzCisvLyBtb3ZlIHRoZSBvYmplY3QgZnJvbSBjdXJyZW50IHBvc2l0aW9uIHRvIGRlc3QgdXNpbmcgdGhlIG1ldGhvZAorcHVibGljIHZhcmFyZ3MgaW50IG1vdmUob2JqZWN0fHN0cmluZyBkZXN0LCBpbnQgbWV0aG9kKTsKKworLy8gcmVtb3ZlIHRoZSBvYmplY3QgcmV0dXJuIDEgZm9yIHN1Y2Nlc3NmdWwgZGVzdHJ1Y3Rpb24KK3B1YmxpYyB2YXJhcmdzIGludCByZW1vdmUoaW50IHNpbGVudCk7CisKKyNlbmRpZiAvLyBfX1RISU5HX01PVklOR19IX1BST1RPX18KKworI2VuZGlmIC8vICAvLyBORUVEX1BST1RPWVBFUwpkaWZmIC0tZ2l0IGEvc3lzL3RoaW5nL3Byb3BlcnRpZXMuaCBiL3N5cy90aGluZy9wcm9wZXJ0aWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE1OTUyMgotLS0gL2Rldi9udWxsCisrKyBiL3N5cy90aGluZy9wcm9wZXJ0aWVzLmgKQEAgLTAsMCArMSw2MyBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHRoaW5nL3Byb3BlcnRpZXMuaCAtLSBjb250YWlucyBwcm9wZXJ0eSBkZWZpbml0aW9ucyBhbmQgcHJvdG90eXBlcworLy8KKy8vICRJZDogcHJvcGVydGllcy5oLHYgMy41IDIwMDMvMDgvMDcgMTU6MDk6MzMgUmlrdXMgRXhwICQKKworI2lmbmRlZiBfX1RISU5HX1BST1BFUlRJRVNfSF9fCisjZGVmaW5lIF9fVEhJTkdfUFJPUEVSVElFU19IX18KKworLy8gc3BlY2lhbCBkZWZpbmVzCisKKyNkZWZpbmUgRl9WQUxVRSAgICAgICAgIDAKKyNkZWZpbmUgRl9NT0RFICAgICAgICAgIDEKKyNkZWZpbmUgRl9TRVRfTUVUSE9EICAgIDIKKyNkZWZpbmUgRl9RVUVSWV9NRVRIT0QgIDMKKyNkZWZpbmUgRl9NT0RFX0FTICAgICAgIDQKKyNkZWZpbmUgRl9NT0RFX0FEICAgICAgIDUKKworI2RlZmluZSBTQVZFICAgICAgICAgICAgNjQKKyNkZWZpbmUgUFJPVEVDVEVEICAgICAgIDEyOCAgLy8gb25seSB0aGlzX29iamVjdCgpIGNhbiBjaGFuZ2UgdGhlIHZhbHVlcworI2RlZmluZSBTRUNVUkVEICAgICAgICAgMjU2ICAvLyBsaWtlIFBST1RFQ1RFRCwgYnV0IG5ldmVyIHJlc2V0YWJsZQorI2RlZmluZSBOT1NFVE1FVEhPRCAgICAgNTEyICAvLyBLZWluZSBTZXQtTWV0aG9kZSA9PiBOaWNodCBtb2ZpZml6aWVyYmFyCisjZGVmaW5lIFNFVE1OT1RGT1VORAkxMDI0IC8vIEtlaW5lIFNldC1NZXRob2RlIGdlZnVuZGVuCisjZGVmaW5lIFFVRVJZTU5PVEZPVU5ECTIwNDggLy8gS2VpbmUgUXVlcnktTWV0aG9kZSBnZWZ1bmRlbgorI2RlZmluZSBRVUVSWUNBQ0hFRAk0MDk2CisjZGVmaW5lIFNFVENBQ0hFRAk4MTkyCisKKyNlbmRpZiAvLyBfX1RISU5HX1BST1BFUlRJRVNfSF9fCisKKyNpZmRlZiBORUVEX1BST1RPVFlQRVMKKworI2lmbmRlZiBfX1RISU5HX1BST1BFUlRJRVNfSF9QUk9UT19fCisjZGVmaW5lIF9fVEhJTkdfUFJPUEVSVElFU19IX1BST1RPX18KKworLy8gcHJvdG90eXBlcworCisvLyAoRSlVSUQtTWV0aG9kcworLy9zdGF0aWMgbWl4ZWQgX3F1ZXJ5X3VpZCgpOworLy9zdGF0aWMgbWl4ZWQgX3F1ZXJ5X2V1aWQoKTsKKworLy8gUHJvcGVydHktSW5pdGlhbGlzYXRpb24KK3Byb3RlY3RlZCB2b2lkIEluaXRpYWxpemVQcm9wZXJ0aWVzKCk7CisKKy8vIGRpcmVjdCBwcm9wZXJ0eSBhY2Nlc3MKK3B1YmxpYyB2YXJhcmdzIG1peGVkIFNldChzdHJpbmcgbmFtZSwgbWl4ZWQgVmFsdWUsIGludCBUeXBlLCBpbnQgZXh0ZXJuKTsKK3B1YmxpYyB2YXJhcmdzIG1peGVkIFF1ZXJ5KHN0cmluZyBuYW1lLCBpbnQgVHlwZSk7CisKKy8vIGZpbHRlcmVkIHByb3BlcnR5IGFjY2VzcworcHVibGljIG1peGVkIFNldFByb3Aoc3RyaW5nIG5hbWUsIG1peGVkIFZhbHVlKTsKK3B1YmxpYyBtaXhlZCBRdWVyeVByb3Aoc3RyaW5nIG5hbWUpOworCisvLyBnbG9iYWwgcHJvcGVydHkgaGFuZGxpbmcKK3B1YmxpYyB2b2lkIFNldFByb3BlcnRpZXMobWFwcGluZyBwcm9wcyk7CitwdWJsaWMgbWFwcGluZyBRdWVyeVByb3BlcnRpZXMoKTsKKworLy8gbWlzYy9pbnRlcm5hCitwdWJsaWMgbWl4ZWQgKl9fcXVlcnlfcHJvcGVydGllcygpOworcHVibGljIHZvaWQgX3NldF9zYXZlX2RhdGEobWl4ZWQgZGF0YSk7CitwdWJsaWMgbWl4ZWQgX2dldF9zYXZlX2RhdGEoKTsKKworI2VuZGlmIC8vIF9fVEhJTkdfUFJPUEVSVElFU19IX1BST1RPX18KKworI2VuZGlmIC8vIE5FRURfUFJPVE9UWVBFUwpkaWZmIC0tZ2l0IGEvc3lzL3RoaW5nL3Jlc3RyaWN0aW9ucy5oIGIvc3lzL3RoaW5nL3Jlc3RyaWN0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMTQ0MDEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdGhpbmcvcmVzdHJpY3Rpb25zLmgKQEAgLTAsMCArMSwyNyBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHRoaW5nL3Jlc3RyaWN0aW9ucy5oIC0tIHJlc3RyaWN0aW9ucyBvZiB0aGUgb2JqZWN0ICh3ZWlnaHQpCisvLworLy8gJElkOiByZXN0cmljdGlvbnMuaCx2IDMuMyAyMDAwLzA4LzE1IDEyOjI5OjIwIFBhcmFjZWxzdXMgRXhwICQKKyAKKyNpZm5kZWYgX19USElOR19SRVNUUklDVElPTlNfSF9fCisjZGVmaW5lIF9fVEhJTkdfUkVTVFJJQ1RJT05TX0hfXworCisvLyBwcm9wZXJ0aWVzCisjZGVmaW5lIFBfV0VJR0hUICAgICAgICAgICAgICJ3ZWlnaHQiICAgICAgIC8vIHdlaWdodCBvZiBhbiBvYmplY3QKKyNkZWZpbmUgUF9UT1RBTF9XRUlHSFQgICAgICAgInRvdGFsX3dlaWdodCIgLy8gd2VpZ2h0IHdpdGggYWxsIG9iamVjdHMgaW5zaWRlCisKKyNlbmRpZiAvLyBfX1RISU5HX1JFU1RSSUNUSU9OU19IX18KKworI2lmZGVmIE5FRURfUFJPVE9UWVBFUworCisjaWZuZGVmIF9fVEhJTkdfUkVTVFJJQ1RJT05TX0hfUFJPVE9fXworI2RlZmluZSBfX1RISU5HX1JFU1RSSUNUSU9OU19IX1BST1RPX18KKworc3RhdGljIHZvaWQgX3NldF93ZWlnaHQoaW50IHdlaWdodCk7CitzdGF0aWMgbWFwcGluZyBfc2V0X2V4dGVybl9hdHRyaWJ1dGVzX21vZGlmaWVyKG1hcHBpbmcgeG1vZCk7CitzdGF0aWMgbWFwcGluZyBfc2V0X2V4dGVybl9oZWFsdGhfbW9kaWZpZXIobWFwcGluZyB4bW9kKTsKKworI2VuZGlmIC8vIF9fVEhJTkdfUkVTVFJJQ1RJT05TX0hfUFJPVE9fXworCisjZW5kaWYJLy8gTkVFRF9QUk9UT1lQRVMKZGlmZiAtLWdpdCBhL3N5cy90aGluZy9zb2NrZXRzLmggYi9zeXMvdGhpbmcvc29ja2V0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1YTljYmIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdGhpbmcvc29ja2V0cy5oCkBAIC0wLDAgKzEsNzkgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8qKiBAZmlsZQorICBLb25zdGFudGVuLCBQcm90b3R5cGVuIHVuZCBQcm9wZXJ0aWVzIGZ1ZXIgc29ja2VsYmFyZSBJdGVtcy4KKyogTGFuZ2Jlc2NocmVpYnVuZy4uLgorKiBAYXV0aG9yIFplc3N0cmEgKyBBcmF0aG9ybgorKiBAZGF0ZSB4eC4wNS4yMDA4CisqIEB2ZXJzaW9uICRJZCQKKyovCisKKy8qIENoYW5nZWxvZzoKKyovCisKKyNpZm5kZWYgX1NPQ0tFVFNfSF8KKyNkZWZpbmUgX1NPQ0tFVFNfSF8KKworLyoqIFNwZWljaGVydCBkaWUgU29ja2VsIHVuZCBkZXJlbiBJbmhhbHQsIGRpZSBlaW4gSXRlbSBoYXQuCisgIChbIFRZUDE6ICh7SVRFTTEsIElURU0yfSksCisgICAgIFRZUDI6ICh7LTF9KSBdKSBcbgorICAgICBJVEVNMSA9IChbIFBfU09DS0VUX1BST1BTLCAKKyAgICAgICAgICAgICAgICBCTFVFX05BTUU6IGxvYWRfbmFtZSgpLAorICAgICAgICAgICAgICAgIERFU0NSSVBUSU9OOiBuYW1lKFdFUikgXSkKKyAgQGludGVybmFsCisgKi8KKyNkZWZpbmUgUF9TT0NLRVRTICAgICAgIl9zb2NrZXRzIgorCisvKiogU3BlaWNoZXJ0IGVpbiBNYXBwaW5nIHZvbiBQcm9wLU1vZGlmaWthdG9yZW4uCisgIERpZSBpbiBkaWVzZW0gTWFwcGluZyBlbnRoYWx0ZW5lbiBQcm9wcyB3ZXJkZW4gYmVpbSBFaW5zZXR6ZW4gaW0gSXRlbSBtaXQKKyAgZGVtIFNvY2tlbCB1bSBkZW4gYW5nZWdlYmVuZW4gV2VydCBtb2RpZml6aWVydC4KKyAgKi8KKyNkZWZpbmUgUF9TT0NLRVRfUFJPUFMgIl9zb2NrZXRfcHJvcHMiCisKKy8qKiBTb2NrZWx0eXAsIGluIGRlbiBkYXMgSXRlbSBlaW5nZXNldHp0IHdlcmRlbiBrYW5uLgorICBBbGxlIGFuZGVyZW4gU29ja2VsIHNpbmQgaW5rb21wYXRpYmVsLgorICAqLworI2RlZmluZSBQX1NPQ0tFVF9UWVBFICAiX3NvY2tldF90eXBlIgorCisvKiogRWluc2NocmFlbmt1bmdlbiwgZGVuZW4gZGVyIGdlc29ja2VsdGUgR2VnZW5zdGFuZCBuYWNoIGRlbSBFaW5zZXR6ZW4KKyAgICB6dXNhZXR6bGljaCB1bnRlcmxpZWd0LiAKKyAgICBXaXJkIFBfUkVTVFJJQ1RJT05TIGhpbnp1Z2VmdWVndC4gTWFwcGluZyBhIGxhIFBfUkVTVFJJQ1RJT05TLgorICovCisjZGVmaW5lIFBfU09DS0VUX1JFU1RSX1VTRSAgICAiX3NvY2tldF9yZXN0cl91c2UiCisKKy8qKiBFaW5zY2hyYWVua3VuZ2VuLCBkZW5lbiBkYXMgTGViZXdlc2VuIHVudGVybGllZ3QsIHdlbGNoZXMgZGFzIEl0ZW0gaW4gCisgIGRlbiBTb2NrZWwgZWluYmF1ZW4gc29sbC93aWxsLgorICBNYXBwaW5nIGEgbGEgUF9SRVNUUklDVElPTlMuCisgICovCisjZGVmaW5lIFBfU09DS0VUX1JFU1RSX01PVU5UICAiX3NvY2tldF9yZXN0cl9tb3VudCIKKworLy8gU29ja2VsdHlwZW4KKy8vIFRPRE86IGd1ZWx0aWdlIFNvY2tlbHR5cGVuIGRlZmluaWVyZW4gZmVzdGxlZ2VuLCB3ZWxjaGUgUHJvcHMgc2llIGFlbmRlcm4KKy8vIGR1ZXJmZW4uCisjZGVmaW5lIFZBTElEX1NPQ0tFVF9UWVBFUyAoe30pCisKKy8vIFJ1ZWNrZ2FiZXdlcnRlCisjZGVmaW5lIFNPQ0tFVF9PSyAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFNPQ0tFVF9OT19PQkpFQ1QgICAgICAgIC0xCisjZGVmaW5lIFNPQ0tFVF9OT19EQVRBICAgICAgICAgIC0yCisjZGVmaW5lIFNPQ0tFVF9JTlZBTElEX1RZUEUgICAgIC0zCisjZGVmaW5lIFNPQ0tFVF9OT19TT0NLRVRTICAgICAgIC00CisjZGVmaW5lIFNPQ0tFVF9OT05FX0FWQUlMQUJMRSAgIC01CisjZGVmaW5lIFNPQ0tFVF9OT19FWFBFUlRJU0UgICAgIC02CisjZGVmaW5lIFNPQ0tFVF9JVEVNX0lOVVNFICAgICAgIC03CisKKy8vIHN5bS4gS29uc3RhbnRlIGZ1ZXIgZnJlaWVuIFNvY2tlbAorI2RlZmluZSBTT0NLRVRfRlJFRSAgICAgICAgICAgICAtMQorCisjZW5kaWYgLy8gX1NPQ0tFVFNfSF8KKworI2lmZGVmIE5FRURfUFJPVE9UWVBFUworI2lmbmRlZiBfU09DS0VUU19IX1BST1RPVFlQRVNfCisjZGVmaW5lIF9TT0NLRVRTX0hfUFJPVE9UWVBFU18KKy8vIHB1YmxpYyBJbnRlcmZhY2UgCitwdWJsaWMgaW50ICAgTW91bnRTb2NrZXRJdGVtKG9iamVjdCBpdGVtKTsKK3B1YmxpYyBpbnQgICBUZXN0U29ja2V0SXRlbShvYmplY3QgaXRlbSk7CitwdWJsaWMgbWl4ZWQgR2V0U29ja2V0SW5mbygpOworCisjZW5kaWYgLy8gX1NPQ0tFVFNfSF9QUk9UT1RZUEVTXworI2VuZGlmIC8vIE5FRURfUFJPVE9UWVBFUworCmRpZmYgLS1naXQgYS9zeXMvdGhpbmcvdXRpbC5oIGIvc3lzL3RoaW5nL3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTNmNDk5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL3RoaW5nL3V0aWwuaApAQCAtMCwwICsxLDI1IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gc3lzL3RoaW5nL3V0aWwuaCAtLSBIZWFkZXJmaWxlIGZ1ZXIgL3N0ZC90aGluZy91dGlsLmMKKy8vCisvLyAkSWQ6IHV0aWwuaCA0NzA3IDIwMDYtMDktMjMgMTA6MTg6MTVaIHJvb3QgJAorCisjaWZuZGVmIF9fVEhJTkdfVVRJTF9IX18KKyNkZWZpbmUgX19USElOR19VVElMX0hfXworCisjZW5kaWYgLy8gX19USElOR19VVElMX0hfXworCisjaWZkZWYgTkVFRF9QUk9UT1RZUEVTCisKKyNpZm5kZWYgX19USElOR19VVElMX0hfUFJPVE9fXworI2RlZmluZSBfX1RISU5HX1VUSUxfSF9QUk9UT19fCisKK3B1YmxpYyB2b2lkIFNob3dQcm9wTGlzdChzdHJpbmcgKnByb3BzKTsKK3N0YXRpYyB2b2lkIFByZXR0eUR1bXAobWl4ZWQgeCk7CitzdGF0aWMgdm9pZCBEdW1wQXJyYXkobWl4ZWQgKngpOworc3RhdGljIHZvaWQgRHVtcE1hcHBpbmcobWFwcGluZyB4KTsKK3N0YXRpYyB2b2lkIER1bXBLZXlWYWxQYWlyKG1hcHBpbmcgeCwgbWl4ZWQga2V5LCBpbnQgc2l6ZSk7CisKKyNlbmRpZiAvLyBfX1RISU5HX1VUSUxfSF9QUk9UT19fCisKKyNlbmRpZiAvLyBORUVEX1BST1RPVFlQRVMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXMvdGltZS5oIGIvc3lzL3RpbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmVhNjU3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL3RpbWUuaApAQCAtMCwwICsxLDE4IEBACisjaWZuZGVmIExQQ19USU1FX0hfCisjZGVmaW5lIExQQ19USU1FX0hfIDEKKworLyogSW5kaWNlcyBpbnRvIHRoZSBhcnJheSByZXR1cm5lZCBmcm9tIGdtdGltZSgpIGFuZCBsb2NhbHRpbWUoKS4gKi8KKworI2RlZmluZSBUTV9TRUMgICAgMCAgLyogU2Vjb25kcyAoMC4uNTkpICovCisjZGVmaW5lIFRNX01JTiAgICAxICAvKiBNaW51dGVzICgwLi41OSkgKi8KKyNkZWZpbmUgVE1fSE9VUiAgIDIgIC8qIEhvdXJzICgwLi4yMykgKi8KKyNkZWZpbmUgVE1fTURBWSAgIDMgIC8qIERheSBvZiB0aGUgbW9udGggKDEuLjMxKSAqLworI2RlZmluZSBUTV9NT04gICAgNCAgLyogTW9udGggb2YgdGhlIHllYXIgKDAuLjExKSAqLworI2RlZmluZSBUTV9ZRUFSICAgNSAgLyogWWVhciAoZS5nLiAgMjAwMSkgKi8KKyNkZWZpbmUgVE1fV0RBWSAgIDYgIC8qIERheSBvZiB0aGUgd2VlayAoU3VuZGF5ID0gMCkgKi8KKyNkZWZpbmUgVE1fWURBWSAgIDcgIC8qIERheSBvZiB0aGUgeWVhciAoMC4uMzY1KSAqLworI2RlZmluZSBUTV9JU0RTVCAgOCAgLyogVFJVRTogRGF5bGlnaHQgc2F2aW5nIHRpbWUgKi8KKworI2RlZmluZSBUTV9NQVggOSAgLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGFycmF5ICovCisKKyNlbmRpZiAvKiBMUENfVElNRV9IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzL3Rscy5oIGIvc3lzL3Rscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5YjUwZWMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdGxzLmgKQEAgLTAsMCArMSw4NiBAQAorI2lmbmRlZiBMUENfVExTX0gKKyNkZWZpbmUgTFBDX1RMU19ICisKKy8qIEZpZWxkIGluZGljZXMgZm9yIHRoZSByZXN1bHQgb2YgdGxzX3F1ZXJ5X2Nvbm5lY3Rpb25faW5mbygpICovCisKKyNkZWZpbmUgVExTX0NJUEhFUiAgMAorI2RlZmluZSBUTFNfQ09NUCAgICAxCisjZGVmaW5lIFRMU19LWCAgICAgIDIKKyNkZWZpbmUgVExTX01BQyAgICAgMworI2RlZmluZSBUTFNfUFJPVCAgICA0CisKKyNkZWZpbmUgVExTX0lORk9fTUFYIDUgIC8qIFRvdGFsIG51bWJlciBvZiByZXN1bHQgZmllbGRzICovCisKKy8qIEludGVycHJldGF0aW9uIG9mIHRoZSBjaXBoZXIgaW5mb3JtYXRpb24gKi8KKworI2RlZmluZSBUTFNfQ0lQSEVSX1RBQkxFICh7IFwKKyJUTFNfQ0lQSEVSX05PTkUiLCBcCisiVExTX0NJUEhFUl9OVUxMIiwgXAorIlRMU19DSVBIRVJfQVJDRk9VUl8xMjgiLCBcCisiVExTX0NJUEhFUl8zREVTX0NCQyIsIFwKKyJUTFNfQ0lQSEVSX1JJSk5EQUVMXzEyOF9DQkMiLCBcCisiVExTX0NJUEhFUl9SSUpOREFFTF8yNTZfQ0JDIiwgXAorIlRMU19DSVBIRVJfQVJDRk9VUl80MCIgXAorfSkKKworI2RlZmluZSBUTFNfQ0lQSEVSX05BTUUoeCkgVExTX0NJUEhFUl9UQUJMRVsoeCldCisKKy8qIEludGVycHJldGF0aW9uIG9mIHRoZSBrZXktZXhjaGFuZ2UgaW5mb3JtYXRpb24gKi8KKworI2RlZmluZSBUTFNfS1hfVEFCTEUgKHsgXAorIlRMU19LWF9OT05FIiwgXAorIlRMU19LWF9SU0EiLCBcCisiVExTX0tYX0RIRV9EU1MiLCBcCisiVExTX0tYX0RIRV9SU0EiLCBcCisiVExTX0tYX0FOT05fREgiLCBcCisiVExTX0tYX1NSUCIsIFwKKyJUTFNfS1hfUlNBX0VYUE9SVCIsIFwKKyJUTFNfS1hfU1JQX1JTQSIsIFwKKyJUTFNfS1hfU1JQX0RTUyIgXAorfSkKKworI2RlZmluZSBUTFNfS1hfTkFNRSh4KSBUTFNfS1hfVEFCTEVbKHgpXQorCisvKiBJbnRlcnByZXRhdGlvbiBvZiB0aGUgTUFDIGluZm9ybWF0aW9uICovCisKKyNkZWZpbmUgVExTX01BQ19UQUJMRSAoeyBcCisiVExTX01BQ19OT05FIiwgXAorIlRMU19NQUNfTlVMTCIsIFwKKyJUTFNfTUFDX01ENSIsIFwKKyJUTFNfTUFDX1NIQSIgXAorfSkKKworI2RlZmluZSBUTFNfTUFDX05BTUUoeCkgVExTX01BQ19UQUJMRVsoeCldCisKKy8qIEludGVycHJldGF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBpbmZvcm1hdGlvbiAqLworCisjZGVmaW5lIFRMU19DT01QX1RBQkxFICh7IFwKKyJUTFNfQ09NUF9OT05FIiwgXAorIlRMU19DT01QX05VTEwiLCBcCisiVExTX0NPTVBfWkxJQiIsIFwKKyJUTFNfQ09NUF9MWk8iIFwKK30pCisKKyNkZWZpbmUgVExTX0NPTVBfTkFNRSh4KSBUTFNfQ09NUF9UQUJMRVsoeCldCisKKy8qIEludGVycHJldGF0aW9uIG9mIHRoZSBwcm90b2NvbCBpbmZvcm1hdGlvbiAqLworCisjZGVmaW5lIFRMU19QUk9UX1RBQkxFICh7IFwKKyJUTFNfUFJPVF9OT05FIiwgXAorIlRMU19QUk9UX1NTTDMiLCBcCisiVExTX1BST1RfVExTMSIgXAorfSkKKworI2RlZmluZSBUTFNfUFJPVF9OQU1FKHgpIFRMU19QUk9UX1RBQkxFWyh4KV0KKworLyogUmVjb2duaXplZCBoYXNoKCkgYWxnb3JpdGhtcyAobm90IGFsbCBtYXkgYmUgc3VwcG9ydGVkIGF0IHJ1bnRpbWUpICovCisKKyNkZWZpbmUgVExTX0hBU0hfU0hBMSAgICAgICgxKQorI2RlZmluZSBUTFNfSEFTSF9TSEEyMjQgICAgKDIpCisjZGVmaW5lIFRMU19IQVNIX1NIQTI1NiAgICAoMykKKyNkZWZpbmUgVExTX0hBU0hfU0hBMzg0ICAgICg0KQorI2RlZmluZSBUTFNfSEFTSF9TSEE1MTIgICAgKDUpCisjZGVmaW5lIFRMU19IQVNIX01ENSAgICAgICAoNikKKyNkZWZpbmUgVExTX0hBU0hfUklQRU1EMTYwICg3KQorCisjZW5kaWYgLyogTFBDX1RMU19IICovCmRpZmYgLS1naXQgYS9zeXMvdHJhY2UuaCBiL3N5cy90cmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMWM0NzMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdHJhY2UuaApAQCAtMCwwICsxLDE4IEBACisjaWZuZGVmIExQQ19UUkFDRV9IXworI2RlZmluZSBMUENfVFJBQ0VfSF8KKworLyogQXJndW1lbnQgdmFsdWVzIGZvciB0aGUgdHJhY2UoKSBlZnVuLgorICovCisKKyNkZWZpbmUgVFJBQ0VfTk9USElORyAgICAgICAwICAvKiBTdG9wIHRyYWNpbmcgKi8KKworI2RlZmluZSBUUkFDRV9DQUxMICAgICAgICAgIDEgIC8qIFRyYWNlIGFsbCBsZnVuIGNhbGxzICovCisjZGVmaW5lIFRSQUNFX0NBTExfT1RIRVIgICAgMiAgLyogVHJhY2UgaW50ZXItb2JqZWN0IGNhbGxzICovCisjZGVmaW5lIFRSQUNFX1JFVFVSTiAgICAgICAgNCAgLyogVHJhY2UgZnVuY3Rpb24gcmV0dXJucyAqLworI2RlZmluZSBUUkFDRV9BUkdTICAgICAgICAgIDggIC8qIFByaW50IGZ1bmN0aW9uIGFyZ3VtZW50cyBhbmQgcmVzdWx0cyAqLworI2RlZmluZSBUUkFDRV9FWEVDICAgICAgICAgMTYgIC8qIFRyYWNlIGFsbCBleGVjdXRlZCBpbnN0cnVjdGlvbnMgKi8KKyNkZWZpbmUgVFJBQ0VfSEVBUlRfQkVBVCAgIDMyICAvKiBUcmFjZSBoZWFydGJlYXQgY29kZSAqLworI2RlZmluZSBUUkFDRV9BUFBMWSAgICAgICAgNjQgIC8qIFRyYWNlIChpbnRlcm5hbCkgYXBwbGllcyAqLworI2RlZmluZSBUUkFDRV9PQkpOQU1FICAgICAxMjggIC8qIFByaW50IHRoZSBvYmplY3QgbmFtZXMgKi8KKworI2VuZGlmIC8qIExQQ19UUkFDRV9IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzL3RyYW5zcG9ydC5oIGIvc3lzL3RyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YWM3MzUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdHJhbnNwb3J0LmgKQEAgLTAsMCArMSwyOSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHRyYW5zcG9ydC5oIC0tIERlZmluaXRpb25lbiBmdWVyIFNjaGlmZmUgdW5kIGFuZGVyZSBUcmFuc3BvcnRlcgorLy8KKy8vICRJZDogdHJhbnNwb3J0LmgsdiAzLjMgMjAwMi8wMi8wOSAxMTo1Njo1OSBUaWxseSBFeHAgJAorCisjaWZuZGVmIF9UUkFOU1BPUlRfSF8KKyNkZWZpbmUgX1RSQU5TUE9SVF9IXworCisjZGVmaW5lIFBfRU5URVJNU0cgICAgICAgICAgICJlbnRlcm1zZyIKKyNkZWZpbmUgUF9MRUFWRU1TRyAgICAgICAgICAgImxlYXZlbXNnIgorI2RlZmluZSBQX0xFQVZFRkFJTCAgICAgICAgICAibGVhdmVmYWlsIgorI2RlZmluZSBQX0VOVEVSRkFJTCAgICAgICAgICAiZW50ZXJmYWlsIgorI2RlZmluZSBQX0FSUklWRU1TRyAgICAgICAgICAiYXJyaXZlbXNnIgorI2RlZmluZSBQX0RFUEFSVE1TRyAgICAgICAgICAiZGVwYXJ0bXNnIgorI2RlZmluZSBQX0VOVEVSQ01EUyAgICAgICAgICAiZW50ZXJjbWRzIgorI2RlZmluZSBQX0xFQVZFQ01EUyAgICAgICAgICAibGVhdmVjbWRzIgorI2RlZmluZSBQX01BWF9QQVNTRU5HRVJTICAgICAibWF4cGFzcyIKKworI2RlZmluZSBQX1RSQVZFTF9JTkZPICAgICAgICAidHJhdmVsX2luZm8iCisjZGVmaW5lIFBfTk9fVFJBVkVMSU5HICAgICAgICJub190cmF2ZWxpbmciCisjZGVmaW5lIFBfVFJBVkVMX0NNRFMgICAgICAgICJ0cmF2ZWxfY21kcyIKKyNkZWZpbmUgUF9IQVJCT1VSICAgICAgICAgICAgImhhcmJvdXJfbmFtZSIKKworI2RlZmluZSBIUF9NU0cgICJocE1zZyIKKyNkZWZpbmUgSFBfUk9PTSAiaHBSb29tIgorI2RlZmluZSBIUF9GVU4gICJocEZ1biIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXMvdWRwLmggYi9zeXMvdWRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJmNzRjMAotLS0gL2Rldi9udWxsCisrKyBiL3N5cy91ZHAuaApAQCAtMCwwICsxLDk4IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gdWRwLmggLS0gRGVmaW5pdGlvbmVuIGZ1ZXJzIHVkcAorLy8KKy8vICRJZDogdWRwLmggOTUwMyAyMDE2LTAyLTIzIDE4OjI3OjQ1WiBaZXNzdHJhICQKKworI2lmbmRlZiBfVURQX0gKKyNkZWZpbmUgX1VEUF9ICisKKy8qIC0tLSBVc2VyIENvbmZpZ3VyYXRpb24uIC0tLSAqLworCisjaW5jbHVkZSAiL3NlY3VyZS9jb25maWcuaCIKKyNpbmNsdWRlIDxkcml2ZXJfaW5mby5oPgorCisjZGVmaW5lIElORVRECQkiL3NlY3VyZS9pbmV0ZCIKKyNkZWZpbmUgVURQX0NNRF9ESVIJIi9zZWN1cmUvdWRwLyIKKworI2lmICFkZWZpbmVkKF9fVEVTVE1VRF9fKSAmJiBNVUROQU1FPT0iTW9yZ2VuR3JhdWVuIgorIyAgZGVmaW5lIEhPU1RfRklMRQkiL2V0Yy9JTkVURF9IT1NUUyIKKyNlbHNlCisjICBkZWZpbmUgSE9TVF9GSUxFICIvZXRjL0lORVREX0hPU1RTLlRFU1RNVUQiCisjZW5kaWYKKworI2RlZmluZSBJTkVURF9MT0dfRklMRQkiSU5FVEQiCisKKyNkZWZpbmUgUkVQTFlfVElNRV9PVVQJMTIKKyNkZWZpbmUgUkVUUklFUwkJMgorCisvKiAjZGVmaW5lIExPQ0FMX05BTUUJU0VDVVJJVFktPmdldF9tdWRfbmFtZSgpCS8vIENEICovCisjaWYgKF9fSE9TVF9OQU1FX189PU1VREhPU1QpCisjZGVmaW5lIExPQ0FMX05BTUUgIE1VRE5BTUUKKyNlbHNlCisjZGVmaW5lIExPQ0FMX05BTUUgICJNRy1UZXN0LSIrX19IT1NUX05BTUVfXworI2VuZGlmCisKKy8qICNkZWZpbmUgTE9DQUxfVURQX1BPUlQJU0VDVVJJVFktPmRvX2RlYnVnKCJ1ZHBfcG9ydCIpOyAgLy8gQ0QgKi8KKyNkZWZpbmUgTE9DQUxfVURQX1BPUlQJZHJpdmVyX2luZm8oRElfVURQX1BPUlQpCisKKy8qIElmIHlvdSBhcmUgcnVubmluZyBhbm90aGVyIGludGVybXVkIHN5c3RlbSBjb25jdXJyZW50bHkgYW5kIHRoZXJlIGlzIGEKKyAqIGNsYXNoIHdpdGggdGhlIHVkcC5oIGZpbGVuYW1lLCByZW5hbWUgdGhlIG9sZCB1ZHAuaCBmaWxlIGFzIGFwcHJvcHJpYXRlCisgKiBhbmQgaW5jbHVkZSB0aGlzIGxpbmUuICovCisvKiAjaW5jbHVkZSA8Y2R1ZHAuaD4JLy8gQ0QgKi8KKworLyogSW5jbHVkZSB0aGVzZSBkZWZpbml0aW9ucyBmb3IgQ0QgbXVkcy4gKi8KKy8qICNkZWZpbmUgQ0RMSUIgKi8KKy8qICNkZWZpbmUgQ0RfVURQCQkiL2QvU3RhbmRhcmQvb2JqL3VkcCIgKi8KKworLyogLS0tIEVuZCBvZiBjb25maWcuIC0tLSAqLworCisjZGVmaW5lIElORVREX0RJQUdOT1NUSUNTCisKKyNkZWZpbmUgSU5FVERfVkVSU0lPTgkiMC43YSIKKworLyogLS0tIFN0YW5kYXJkIGhlYWRlciBtYWNyb3MuIC0tLSAqLworCisjZGVmaW5lIFJFQ0lQSUVOVAkiUkNQTlQiCisjZGVmaW5lIFJFUVVFU1QJCSJSRVEiCisjZGVmaW5lIFNFTkRFUgkJIlNORCIKKy8qIFRoZSBEQVRBIGZpZWxkIHNob3VsZCBiZSB1c2VkIHRvIHN0b3JlIHRoZSBtYWluIGJvZHkgb2YgYW55IHBhY2tldC4gKi8KKyNkZWZpbmUgREFUQQkJIkRBVEEiCisKKy8qIFRoZXNlIGhlYWRlcnMgYXJlIHJlc2VydmVkIGZvciBzeXN0ZW0gdXNlIG9ubHkuICovCisjZGVmaW5lIEhPU1QJCSJIU1QiCisjZGVmaW5lIElECQkiSUQiCisjaWZuZGVmIE5BTUUKKyNkZWZpbmUgTkFNRQkJIk5BTUUiCisjZW5kaWYKKyNkZWZpbmUgUEFDS0VUCQkiUEtUIgorI2RlZmluZSBVRFBfUE9SVAkiVURQIgorI2RlZmluZSBTWVNURU0JCSJTWVMiCisKKy8qIFJlc2VydmVkIGhlYWRlcnMgZm9yIGRpYWdub3N0aWNzLiAqLworI2RlZmluZSBQQUNLRVRfTE9TUwkiUEtUX0xPU1MiCisjZGVmaW5lIFJFU1BPTlNFX1RJTUUJIlRJTUUiCisKKy8qIC0tLSBTdGFuZGFyZCBSRVFVRVNUIG1hY3Jvcy4gLS0tICovCisKKyNkZWZpbmUgUElORwkJInBpbmciCisjZGVmaW5lIFFVRVJZCQkicXVlcnkiCisjZGVmaW5lIFJFUExZCQkicmVwbHkiCisKKy8qIC0tLSBTdGFuZGFyZCBTWVNURU0gbWFjcm9zLiAtLS0gKi8KKworI2RlZmluZSBGQUlMRUQJCSJGIgorI2RlZmluZSBSRVBFQVQJCSJSIgorI2RlZmluZSBUSU1FX09VVAkiVE8iCisjZGVmaW5lIFVOQVZBSUxBQkxFCSJVIgorCisvKiAtLS0gSW5kZXggbWFjcm9zIGZvciBob3N0IGFycmF5cy4gLS0tICovCisKKyNkZWZpbmUgSE9TVF9OQU1FCTAKKyNkZWZpbmUgSE9TVF9JUAkJMQorI2RlZmluZSBIT1NUX1VEUF9QT1JUCTIKKyNkZWZpbmUgTE9DQUxfQ09NTUFORFMJMworI2RlZmluZSBIT1NUX0NPTU1BTkRTCTQKKyNkZWZpbmUgSE9TVF9TVEFUVVMJNQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5cy91ZHBfbGFuZ3VhZ2UuaCBiL3N5cy91ZHBfbGFuZ3VhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDAzMDIzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL3VkcF9sYW5ndWFnZS5oCkBAIC0wLDAgKzEsNjQgQEAKKy8vIEtvbmZpZ3VyYXRpb25zZGF0ZWkgZnVlciBkaWUgU3ByYWNoYXVzZ2FiZSBkZXMgSU5FVEQKKworI2lmbmRlZiBfX1VEUF9MQU5HX0hfXworI2RlZmluZSBfX1VEUF9MQU5HX0hfXworCisvLyAqKioKKy8vICoqKiBpbmV0ZC5jCisvLyAqKioKKworI2RlZmluZSBJTkVURF9JTlZfQUNDRVNTX01TRyAiJXM6IElsbGVnYWxlciBadWdyaWZmIGF1ZiBkaWUgeC1GdW5rdGlvbi5cbiIKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24KKworLy8gKioqCisvLyAqKiogY2hhbm5lbC5jCisvLyAqKioKKworI2RlZmluZSBJTkVURF9JTlZfQ0hBTl9NU0cgIlxuJXM6ICVzQCVzIHZlcnN1Y2h0LCBhdWYgS2FuYWwgXCclc1wnIHp1IHNlbmRlbi5cbiIKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lIHdobyBtdWQgICAgICAgICAgICAgICAgICBjaGFubmVsCisjZGVmaW5lIElORVREX05PX1NVQ0hfQ0hBTiAiW1Jvb3RAJXNdIEVzIGdpYnQgaGllciBrZWluZW4gSW50ZXJtdWQtS2FuYWwgJXMuXG4iCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwKKyNkZWZpbmUgSU5FVERfQ0hBTl9MSVNURU4gICJbJXNAJXNdIEF1ZiBkZW0gS2FuYWwgYmVmaW5kZSVzIHNpY2g6ICVzXG4iCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgbXVkICAgICAgICAgICAgICAgIHBsdXJhbCAgICBuYW1lcworI2RlZmluZSBJTkVURF9DSEFOX05PX0xJU1QgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJbJXNAJXNdIEVzIGJlZmluZGV0IHNpY2ggbmllbWFuZCBhdWYgZGllc2VtIEthbmFsLlxuIgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCBtdWQKKyNkZWZpbmUgSU5FVERfQ0hBTl9OT19ISVNUICJbJXNAJXNdIEVzIGlzdCBrZWluZSBHZXNjaGljaHRlIHZlcmZ1ZWdiYXIuXG4iCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCBtdWQKKyNkZWZpbmUgSU5FVERfQ0hBTl9ISVNUICAgICJbJXNAJXNdIEhpc3Rvcnk6XG4iCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCBtdWQKKworLy8gKioqCisvLyAqKiogbG9jYXRlLmMKKy8vICoqKgorCisvLyAqKioKKy8vICoqKiBtYW4uYworLy8gKioqCisKKyNkZWZpbmUgSU5FVERfTUFOUEFHRV9GT1VORCAiW01hbkRAJXNdIEZvbGdlbmRlIFNlaXRlIHd1cmRlIGdlZnVuZGVuOiAlc1xuIgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlCisjZGVmaW5lIElORVREX05PX01BTlBBR0UgICAgIltNYW5EQCVzXSBLZWluZSBIaWxmZXNlaXRlIGdlZnVuZGVuIGZ1ZXIgJyVzJy5cbiIKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZQorI2RlZmluZSBJTkVURF9NQU5QQUdFUyAgICAgICJbTWFuREAlc10gRGllIGZvbGdlbmRlbiBTZWl0ZW4gcGFzc2VuOlxuIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlJy0nNzguNzhzXG4lcyUnLSc3OC43OHNcbiIKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWQgICIiIHBhZ2VsaXN0ICIiCisjZGVmaW5lIElORVREX01BTl9SRVFVRVNURUQgIiVzQCVzOiBBYmZyYWdlIGFiZ2VzY2hpY2t0LlxuIgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgIG11ZAorCisvLyAqKioKKy8vICoqKiBuZXdob3N0LmMKKy8vICoqKgorCisKKy8vICoqKgorLy8gKioqIHF1ZXJ5LmMKKyNkZWZpbmUgSU5FVERfUVVFUllfUkVRVUVTVEVEICIlc0AlczogQWJmcmFnZSBhYmdlc2NoaWNrdC5cbiIKKy8vICoqKgorCisKKy8vICoqKgorLy8gKioqIHJlcGx5LmMKKy8vICoqKgorCisjZW5kaWYgLy8gX19VRFBfTEFOR19IX18KZGlmZiAtLWdpdCBhL3N5cy91ZHBfbWFpbC5oIGIvc3lzL3VkcF9tYWlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU3NjIzMgotLS0gL2Rldi9udWxsCisrKyBiL3N5cy91ZHBfbWFpbC5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyB1ZHBfbWFpbC5oIC0tIFBvc3QgcGVyIHVkcAorLy8KKy8vICRJZDogdWRwX21haWwuaCx2IDMuMSAxOTk3LzAyLzEyIDEzOjA0OjU5IFdhcmdvbiBFeHAgJAorCisvKgorICogVkVSU0lPTiAxLjAKKyAqIEluY2x1ZGUgZmlsZSBmb3IgdGhlIFVEUCBNQUlMIHN5c3RlbSAoQXV0aG9yOiBBbHZpbkBTdXNoaSkKKyAqIFJlcXVpcmVzIElORVREIFYwLjYwIG9yIGhpZ2hlciAoSU5FVEQgQXV0aG9yOiBOb3N0cmFkYW11c0BaZWJlZGVlKQorICovCisKKy8qCisgKiBZb3VyIGxvY2FsIG1haWwgZGVsaXZlcnkgc3lzdGVtCisgKiBOZWVkcyB0byBoYXZlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIDotCisgKiB2b2lkIGRlbGl2ZXJfbWFpbChzdHJpbmcgdG8sc3RyaW5nIGZyb20sc3RyaW5nIHN1YmpjdCxzdHJpbmcgbWFpbF9ib2R5KQorICogaW50IHF1ZXJ5X3JlY2lwaWVudF9vayhzdHJpbmcgbmFtZSkKKyAqLworI2RlZmluZSBMT0NBTF9NQUlMRVIJCQkiL3NlY3VyZS9tYWlsZXIiCisKKy8qCisgKiBUaGUgZGlyZWN0b3J5IGluIHdoaWNoIG1haWwgaXMga2VwdCBpZiB0aGUgaW5pdGlhbCBhdHRlbXB0IHRpbWVzIG91dAorICogVGhlIG1haWwgd2lsbCBiZSByZWNlbnQgZXZlcnkgVURQTV9SRVRSWV9TRU5EIG1pbnV0ZXMgdW50aWwKKyAqIFVEUE1fU0VORF9GQUlMIG1pbnV0ZXMgaGF2ZSBwYXNzZWQKKyAqIE5PVEU6IFVEUE1fU1BPT0xfRElSIG11c3QgZW5kIHdpdGggLyBhbmQgbXVzdCBiZSB3cml0YWJsZQorICovCisjZGVmaW5lIFVEUE1fU1BPT0xfRElSCQkJIm1haWwvc3Bvb2wvIgorCisvKiBUaGUgZm9sbG93aW5nIHR3byB0aW1lcyBhcmUgaW4gTUlOVVRFUyAqLworI2RlZmluZSBVRFBNX1JFVFJZX1NFTkQJCQkzMAorI2RlZmluZSBVRFBNX1NFTkRfRkFJTAkJCTE0NDAJIC8qIDI0IEhvdXJzICovCisKKy8qIFBMRUFTRSBETyBOT1QgQUxURVIgVEhFIEZPTExPV0lORyAqLworCisjZGVmaW5lIFVEUE1fV1JJVEVSCQkJInVkcG1fd3JpdGVyIgorI2RlZmluZSBVRFBNX1NVQkpFQ1QJCQkidWRwbV9zdWJqZWN0IgorI2RlZmluZSBVRFBNX1NUQVRVUwkJCSJ1ZHBtX3N0YXR1cyIKKyNkZWZpbmUgVURQTV9TUE9PTF9OQU1FCQkJInVkcG1fc3Bvb2xfbmFtZSIKKworI2RlZmluZSBVRFBNX1NUQVRVU19USU1FX09VVAkJMAorI2RlZmluZSBVRFBNX1NUQVRVU19ERUxJVkVSRURfT0sJMQorI2RlZmluZSBVRFBNX1NUQVRVU19VTktOT1dOX1BMQVlFUgkyCisjZGVmaW5lIFVEUE1fU1RBVFVTX0lOX1NQT09MCQkzCisKKy8qIHRoaW5ncyB0byBkbyB3aXRoIHRoZSBzcG9vbCBkaXJlY3RvcnkgKi8KKworI2RlZmluZSBVRFBNU19USU1FCQkJInVkcG1fc3Bvb2xfdGltZSIKKyNkZWZpbmUgVURQTVNfVE8JCQkidWRwbV9zcG9vbF90byIKKyNkZWZpbmUgVURQTVNfREVTVAkJCSJ1ZHBtX3Nwb29sX2Rlc3QiCisjZGVmaW5lIFVEUE1TX0ZST00JCQkidWRwbV9zcG9vbF9mcm9tIgorI2RlZmluZSBVRFBNU19TVUJKRUNUCQkJInVkcG1fc3Bvb2xfc3ViamVjdCIKKyNkZWZpbmUgVURQTVNfQk9EWQkJCSJ1ZHBtX3Nwb29sX2JvZHkiCmRpZmYgLS1naXQgYS9zeXMvdW5pdC5oIGIvc3lzL3VuaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2E4YTJjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL3VuaXQuaApAQCAtMCwwICsxLDg2IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gdW5pdC5oIC0tIERlZmluZXMgZnVlciBVbml0cworLy8KKy8vICRJZDogdW5pdC5oIDkwMTcgMjAxNS0wMS0xMCAxOToyMDoxNFogWmVzc3RyYSAkCisKKyNpZm5kZWYgX1VOSVRfSF8KKyNkZWZpbmUgX1VOSVRfSF8KKworI2RlZmluZSBQX1VOSVRfREVDQVlfSU5URVJWQUwgICAgICAidW5pdF9kZWNheV9pbnRlcnZhbCIKKyNkZWZpbmUgUF9VTklUX0RFQ0FZX1FVT1RBICAgICAgICAgInVuaXRfZGVjYXlfcXVvdGEiCisjZGVmaW5lIFBfVU5JVF9ERUNBWV9GTEFHUyAgICAgICAgICJ1bml0X2RlY2F5X2ZsYWdzIgorI2RlZmluZSBQX1VOSVRfREVDQVlfTUlOICAgICAgICAgICAidW5pdF9kZWNheV9taW4iCisKKy8vIEZsYWdzIGZ1ZXIgUF9VTklUX0RFQ0FZX0ZMQUdTIAorLy8gdmVyaGluZGVydCBkYXMgWmVyZmFsbGVuIGVpbnplbG5lciBVbml0LU9iamVrdGUuCisjZGVmaW5lIE5PX0RFQ0FZICAgICAgICAgICAgIDB4MQorLy8ga2VpbiBEZWNheSBiaXMgenVtIGVyc3RlbiBtb3ZlKCkgdm9uIGVpbmVtIEVudiBpbiBlaW4gRW52LiAoZC5oLiBkYXMgZXJzdGUKKy8vIG1vdmUoKSBpbiBlaW4gRW52IChDbG9uZW4gaW0gY3JlYXRlIHZvbSBOUEMpIGlzdCB1bmJlcnVlY2tzaWNodGlndC4pCisjZGVmaW5lIE5PX0RFQ0FZX1VOVElMX01PVkUgIDB4MgorLy8gdW5nZW5hdWVyZW4gWmVyZmFsbCBiZW51dHp0LCBkYWJlaSBhYmVyIGltbWVyIG1pbi4gZWluZSBFaW5oZWl0IHplcmZhbGxlbgorLy8gbGFzc2VuLgorI2RlZmluZSBJTkFDQ1VSQVRFX0RFQ0FZICAgICAweDQKKy8vIGtlaW4gcHJvemVudHVhbGVyIFplcmZhbGwsIHNvbmRlcm4gUF9VTklUX0RFQ0FZX1FVT1RBIGdpYnQgZWluZSBhYnMuIE1lbmdlCisvLyBhbiBFaW5oZWl0ZW4gYW4uCisjZGVmaW5lIEFCU09MVVRFX0RFQ0FZICAgICAgIDB4OAorCisjZGVmaW5lIFVfR1BVICAgInVfZ3B1IgorI2RlZmluZSBVX0NQVSAgICJ1X2NwdSIKKyNkZWZpbmUgVV9JRFMgICAidV9pZHMiCisjZGVmaW5lIFVfUkVRICAgInVfcmVxIgorCisjZGVmaW5lIElTX0VRVUFMKHgpIChvYmplY3RwKHgpICYmIChJc0VxdWFsKHgpICYmIHgtPklzRXF1YWwoTUUpKSkKKworI2VuZGlmIC8vIF9VTklUX0hfCisKKyNpZmRlZiBORUVEX1BST1RPVFlQRVMKKyNpZm5kZWYgX1VOSVRfSF9QUk9UWVBFU18KKyNkZWZpbmUgX1VOSVRfSF9QUk9UWVBFU18KKy8vIHB1YmxpYyBmdW5jdGlvbnMKK3ZhcmFyZ3MgaW50ICAgIGlkKHN0cmluZyBzdHIsaW50IGx2bCk7CisgICAgICAgIGludCAgICBJc0VxdWFsKG9iamVjdCBvYik7CisgICAgICAgIGludCAgICBJc1VuaXQoKTsKK3ZhcmFyZ3MgaW50ICAgIG1vdmUob2JqZWN0fHN0cmluZyBkZXN0LCBpbnQgbWV0aG9kKTsKKyAgICAgICAgaW50ICAgICpRdWVyeUNvaW5zUGVyVW5pdHMoKTsKKyAgICAgICAgaW50ICAgICpRdWVyeUdyYW1zUGVyVW5pdHMoKTsKK3ZhcmFyZ3MgaW50IHJlbW92ZShpbnQgc2lsZW50KTsKK3ZhcmFyZ3Mgc3RyaW5nIGxvbmcoKTsKK3ZhcmFyZ3Mgc3RyaW5nfDxzdHJpbmc+KiBuYW1lKGludCBmYWxsLCBpbnQgZGVtbyk7Cit2YXJhcmdzIHN0cmluZyBRdWVyeVByb25vdW4oaW50IGNhc3VzKTsKKyAgICAgICAgc3RyaW5nIHNob3J0KCk7CisgICAgICAgIHZvaWQgICBBZGRBbW91bnQoaW50IGFtKTsKKyAgICAgICAgdm9pZCAgIEFkZFBsdXJhbElkKG1peGVkIHN0cik7CisgICAgICAgIHZvaWQgICBBZGRTaW5ndWxhcklkKG1peGVkIHN0cik7CisgICAgICAgIHZvaWQgICBSZW1vdmVQbHVyYWxJZChtaXhlZCBzdHIpOworICAgICAgICB2b2lkICAgUmVtb3ZlU2luZ3VsYXJJZChtaXhlZCBzdHIpOworICAgICAgICB2b2lkICAgcmVzZXQoKTsKKyAgICAgICAgdm9pZCAgIFNldENvaW5zUGVyVW5pdHMoaW50IGNvaW5zLGludCB1bml0cyk7CisgICAgICAgIHZvaWQgICBTZXRHcmFtc1BlclVuaXRzKGludCBncmFtcyxpbnQgdW5pdHMpOworcHVibGljICBpbnQgICAgRG9EZWNheShpbnQgc2lsZW50KTsKKworLy8gaW50ZXJuYWwgZnVuY3Rpb25zCitzdGF0aWMgICAgdm9pZCAgICBjaGVja19sZWF2ZSgpOworcHJvdGVjdGVkIHZvaWQgICAgRG9EZWNheU1lc3NhZ2UoaW50IG9sZGFtb3VudCwgaW50IHplcmZhbGwpOworCisvLyBRdWVyeS0gdW5kIFNldC1NZXRob2Rlbgorc3RhdGljICBpbnQgICAgX3F1ZXJ5X3BsdXJhbCgpOworc3RhdGljICBpbnQgICAgX3F1ZXJ5X3RvdGFsX3dlaWdodCgpOworc3RhdGljICBpbnQgICAgX3F1ZXJ5X3VfcmVxKCk7CitzdGF0aWMgIGludCAgICBfcXVlcnlfdmFsdWUoKTsKK3N0YXRpYyAgaW50ICAgIF9xdWVyeV93ZWlnaHQoKTsKK3N0YXRpYyAgc3RyaW5nfHN0cmluZyogX3F1ZXJ5X25hbWUoKTsKK3N0YXRpYyAgaW50ICAgIF9zZXRfYW1vdW50KGludCBhbSk7CitzdGF0aWMgIHN0cmluZ3xzdHJpbmcqIF9zZXRfbmFtZShtaXhlZCBuYW1lcyk7CitzdGF0aWMgIGludCAgICBfc2V0X3dlaWdodChpbnQgbnVtKTsKK3N0YXRpYyAgaW50ICAgIF9zZXRfdmFsdWUoaW50IG51bSk7CitzdGF0aWMgIGludCAgICBfcXVlcnlfdW5pdF9kZWNheV9pbnRlcnZhbCgpOworc3RhdGljICBpbnQgICAgX3NldF91bml0X2RlY2F5X2ludGVydmFsKGludCB6ZWl0KTsKK3N0YXRpYyAgaW50ICAgIF9xdWVyeV91bml0X2RlY2F5X3F1b3RhKCk7CitzdGF0aWMgIGludCAgICBfc2V0X3VuaXRfZGVjYXlfcXVvdGEoaW50IHF1b3RhKTsKK3N0YXRpYyAgaW50ICAgIF9xdWVyeV91bml0X2RlY2F5X21pbigpOworc3RhdGljICBpbnQgICAgX3F1ZXJ5X3VuaXRfZGVjYXlfZmxhZ3MoKTsKKworI2VuZGlmIC8vIF9VTklUX0hfUFJPVFlQRVNfCisjZW5kaWYgLy8gTkVFRF9QUk9UT1RZUEVTCisKZGlmZiAtLWdpdCBhL3N5cy91c2VyaW5mby5oIGIvc3lzL3VzZXJpbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU1NDhiZQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy91c2VyaW5mby5oCkBAIC0wLDAgKzEsNTMgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyB1c2VyaW5mby5oIC0tIERhdGVuIGltIFNwaWVsZXItQ2FjaGUgKHNpZWhlIC9zZWN1cmUvbWFzdGVyL3VzZXJpbmZvLmMpCisvLworLy8gJElkOiB1c2VyaW5mby5oIDYyMDcgMjAwNy0wMi0xOCAyMzozMjozNVogWmVzc3RyYSAkCisKKyNpZm5kZWYgX1VTRVJJTkZPXworI2RlZmluZSBfVVNFUklORk9fCisKKy8qCisgKiB1c2VyaW5mbzogd2hhdCBlYWNoIGZpZWxkIG9mIC9zZWN1cmUvUEFTU1dEIGlzCisgKi8KKworLyogcGFzc3dvcmQgKGVuY3J5cHRlZCkgKi8KKyNkZWZpbmUgVVNFUl9QQVNTV09SRCAwCisKKy8qIHdpemFyZCBsZXZlbCAob3IgcHJvZ3JhbW1pbmcgbGV2ZWwpICgwIGZvciBzaW1wbGUgdXNlcnMpICovCisjZGVmaW5lIFVTRVJfTEVWRUwgMQorCisvKiBkb21haW4gKGlmIGFueSkgbWFzdGVyID09ICpkb21haW5uYW1lICovCisjZGVmaW5lIFVTRVJfRE9NQUlOIDIKKworLyogcGxheWVyIG9iamVjdCB0byBiZSBsb2FkZWQgYnkgL3NlY3VyZS9sb2dpbiAqLworI2RlZmluZSBVU0VSX09CSkVDVCAzCisKKy8qIHRpbWUgb2YgZmlyc3QgbG9naW4gKi8KKyNkZWZpbmUgVVNFUl9DUkVBVElPTl9EQVRFIDQKKworLyogVGltZSB1c2VyaW5mbyBoYXMgYmVlbiB0b3VjaGVkIGxhc3QgKi8KKyNkZWZpbmUgVVNFUl9UT1VDSCA1CisKKy8qIGV4cGxvcmF0aW9uIHBvaW50cyBvZiBwbGF5ZXIgKi8KKyNkZWZpbmUgVVNFUl9FUCA2CisKKy8qIG5wY3Mga2lsbGVkIGJ5IHBsYXllciAqLworI2RlZmluZSBVU0VSX0VLIDcKKworLyogbWluaXF1ZXN0cyBzb2x2ZWQgYnkgcGxheWVyICovCisjZGVmaW5lIFVTRVJfTVEgOAorCisvKiBndWlsZHMgKGlmIGFueSkgbWFzdGVyID09ICpndWlsZG5hbWUgKi8KKyNkZWZpbmUgVVNFUl9HVUlMRCA5IAorCisvKiB0aXBzIGZvciBla3MgZ2l2ZW4gdG8gcGxheWVyICovCisjZGVmaW5lIFVTRVJfRUtUSVBTIDEwCisKKy8qIHRpcHMgZm9yIGZwcyBnaXZlbiB0byBwbGF5ZXIgKi8KKyNkZWZpbmUgVVNFUl9GUFRJUFMgMTEKKworLyogVUlEcyBmdWVyIGRlbiBlaW4gTWFnaWVyIHUuVS4gZXhwbGl6aXQgdmVyYW50d29ydGxpY2ggaXN0ICovCisjZGVmaW5lIFVTRVJfVUlEU19UT19UQUtFX0NBUkUgMTIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXMvdXRpbC5oIGIvc3lzL3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTlmMDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL3V0aWwuaApAQCAtMCwwICsxLDE1IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gdXRpbC5oIC0tIEhlYWRlciBmdWVyIC9zdGQvdXRpbC8qLmMKKy8vCisvLyAkSWQ6IHV0aWwuaCA2NDA0IDIwMDctMDgtMDYgMjA6MzE6MjJaIFplc3N0cmEgJAorCisjaWZuZGVmIF9VVElMX0gKKyNkZWZpbmUgX1VUSUxfSAorCit2YXJhcmdzIHB1YmxpYyB2b2lkIE1vcmUoc3RyaW5nIHR4dCwgaW50IGZpbGUsIG1peGVkIGN0cmwsIAorICAgICAgICAgICAgICAgICAgICAgICAgIG1peGVkIGN0cmxhcmdzLCBpbnQgZmxhZ3MpOworCisKKyNlbmRpZiAvLyBfVVRJTF9ICisKZGlmZiAtLWdpdCBhL3N5cy91dGlsL3JpbmdidWZmZXIuaCBiL3N5cy91dGlsL3JpbmdidWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTBkMDA0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL3V0aWwvcmluZ2J1ZmZlci5oCkBAIC0wLDAgKzEsMjggQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyByaW5nYnVmZmVyLmggLS0gSGVhZGVyIGZ1ZXIgL3N0ZC91dGlsL3JpbmdidWZmZXIuYworLy8KKy8vICRJZDogdXRpbC5oIDY0MDQgMjAwNy0wOC0wNiAyMDozMToyMlogWmVzc3RyYSAkCisKKyNpZm5kZWYgX1JJTkdCVUZGRVJfSAorI2RlZmluZSBfUklOR0JVRkZFUl9ICisKKyNkZWZpbmUgTU9ERV9GSUZPIDEKKyNkZWZpbmUgTU9ERV9MSUZPIDIKKworI2VuZGlmIC8vIF9SSU5HQlVGRkVSX0gKKworI2lmbmRlZiBfUklOR0JVRkZFUl9IX0lNUExFTUVOVEFUSU9OCisjaWZkZWYgTkVFRF9QUk9UT1RZUEVTCisKKyNkZWZpbmUgX1JJTkdCVUZGRVJfSF9JTVBMRU1FTlRBVElPTgorCitwcm90ZWN0ZWQgc3RydWN0IHN0ZF9yaW5nYnVmZmVyIENyZWF0ZVJpbmdCdWZmZXIoaW50IHNpemUsIGludCBuZXdtb2RlKTsKK3Byb3RlY3RlZCB2b2lkIFJpbmdCdWZmZXJQdXQoc3RydWN0IHN0ZF9yaW5nYnVmZmVyIGJ1ZmZlciwgbWl4ZWQgdmFsKTsKK3Byb3RlY3RlZCBtaXhlZCBSaW5nQnVmZmVyR2V0KHN0cnVjdCBzdGRfcmluZ2J1ZmZlciBidWZmZXIpOworcHJvdGVjdGVkIHN0cnVjdCBzdGRfcmluZ2J1ZmZlciBSZXNpemVSaW5nQnVmZmVyKHN0cnVjdCBzdGRfcmluZ2J1ZmZlciBidWYsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplKTsKKworI2VuZGlmIC8vIE5FRURfUFJPVE9UWVBFUworI2VuZGlmIC8vIF9SSU5HQlVGRkVSX0hfSU1QTEVNRU5UQVRJT04KKwpkaWZmIC0tZ2l0IGEvc3lzL3ZfY29tcGlsZXIuaCBiL3N5cy92X2NvbXBpbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE2ZTliOQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy92X2NvbXBpbGVyLmgKQEAgLTAsMCArMSwzNCBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHZfY29tcGlsZXIuaCAtLSBhIGdlbmVyYWwgdmlydHVhbCBjb21waWxlciBvYmplY3QKKy8vCisvLyAkSWQ6IHZfY29tcGlsZXIuaCA2MDgxIDIwMDYtMTAtMjMgMTQ6MTI6MzRaIFplc3N0cmEgJAorCisjaWZuZGVmIF9fVl9DT01QSUxFUl9IX18KKyNkZWZpbmUgX19WX0NPTVBJTEVSX0hfXworCisjZGVmaW5lIFBfU1REX09CSkVDVCAgICAgICAgICJzdGRfb2JqZWN0IgorI2RlZmluZSBQX0NPTVBJTEVSX1BBVEggICAgICAiY29tcGlsZXJfcGF0aCIKKworI2VuZGlmIC8vIF9fVl9DT01QSUxFUl9IX18KKworI2lmZGVmIE5FRURfUFJPVE9UWVBFUworCisjaWZuZGVmIF9fVl9DT01QSUxFUl9IX1BST1RPX18KKyNkZWZpbmUgX19WX0NPTVBJTEVSX0hfUFJPVE9fXworCisvLyB0byB2YWxpZGF0ZSBpZiB0aGUgZmlsZSBuYW1lIGlzIGluIG91ciByYW5nZQorc3RyaW5nIFZhbGlkYXRlKHN0cmluZyBmaWxlKTsKKworLy8gc2V0cyBjb3N0dW1pemF0aW9uIGRhdGEgaW4gdGhlIGNsb25lZCBvYmplY3QKK21peGVkIEN1c3RvbWl6ZU9iamVjdCgpOworCisvLyB0aGlzIGZ1bmN0aW9ucyBpcyBjYWxsZWQgd2hlbiBhIGZpbGUgaXMgbm90IGZvdW5kIGFuZCBtYXkgYmUgdmlydHVhbAorbWl4ZWQgY29tcGlsZV9vYmplY3Qoc3RyaW5nIGZpbGUpOworCisvLyB0byBnZXQgYWxsIHlldCBjbG9uZWQgKGFuZCBub3QgY2xlYW5lZCB1cCkgb2JqZWN0cworbWl4ZWQgUXVlcnlPYmplY3RzKCk7CisKKyNlbmRpZiAvLyBfX1ZfQ09NUElMRVJfSF9QUk9UT19fCisKKyNlbmRpZiAvL05FRURfUFJPVE9UWVBFUwpkaWZmIC0tZ2l0IGEvc3lzL3dlYXBvbi5oIGIvc3lzL3dlYXBvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZWIzYjMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvd2VhcG9uLmgKQEAgLTAsMCArMSw3NyBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHdlYXBvbi5oIC0tIFByb3BlcnRpZXMgZnVlciBXYWZmZW4gKFNjaGRlbnN0eXBlbiBzaWVoZSA8Y29tYmF0Lmg+KQorLy8KKy8vICRJZDogd2VhcG9uLmgsdiAzLjggMjAwMi8wOS8yMCAwNzoxNDoxMSBUaWxseSBFeHAgJAorIAorI2luY2x1ZGUgIi9zeXMvd2VhcG9uL2Rlc2NyaXB0aW9uLmgiCisKKyNpZm5kZWYgX19XRUFQT05fSF9fCisjZGVmaW5lIF9fV0VBUE9OX0hfXworCisjaW5jbHVkZSA8Y29tYmF0Lmg+CisKKy8qIC0tLS0tLS0tLS0gUHJvcGVydGllcyAtLS0tLS0tLS0tICovCisKKyNpZm5kZWYgUF9OUl9IQU5EUworI2RlZmluZSBQX05SX0hBTkRTICAgICAgIm5yX2hhbmRzIiAgICAgLy8gYmVub2V0aWd0ZSBIYWVuZGUgenVtIHp1ZWNrZW4KKyNlbmRpZgorCisjZGVmaW5lIFBfV0MgICAgICAgICAgICAid2MiICAgICAgICAgICAvLyBXYWZmZW5rbGFzc2UgKHdlYXBvbiBjbGFzcykKKyNkZWZpbmUgUF9NQVhfV0MgICAgICAgICJtYXhfd2MiICAgICAgIC8vIG9ic29sZXQsIG5pY2h0IG1laHIgaW4gQmVudXR6dW5nCisjZGVmaW5lIFBfV0VBUE9OX1RZUEUgICAid2VhcG9uX3R5cGUiICAvLyBXYWZmZW50eXAgKFNjaHdlcnQsIEtldWxlIHVzdy4pCisjZGVmaW5lIFBfREFNX1RZUEUgICAgICAiZGFtX3R5cGUiICAgICAvLyBTY2hhZGVuc2FydCBkZXIgV2FmZmUKKyNkZWZpbmUgUF9XSUVMREVEICAgICAgICJ3aWVsZGVkIiAgICAgIC8vIE9iamVrdCBtaXQgZGVtIFRyYWVnZXIgZGVyIFdhZmZlCisKKyNkZWZpbmUgUF9ISVRfRlVOQyAgICAgICJoaXRfZnVuYyIgICAgIC8vIE9iamVrdCBkYXMgZWluZSBIaXRGdW5jIGRlZmluaWVydAorI2RlZmluZSBQX1dJRUxEX0ZVTkMgICAgIndpZWxkX2Z1bmMiICAgLy8gT2JqZWt0IGRhcyBlaW5lIFdpZWxkRnVuYyBkZWZpbmllcnQKKyNkZWZpbmUgUF9VTldJRUxEX0ZVTkMgICJ1bndpZWxkX2Z1bmMiIC8vIE9iamVrdCBkYXMgZWluZSBVbndpZWxkRnVuYyBkZWZpbmllcnQKKworI2RlZmluZSBQX1dJRUxEX01TRyAgICAgIndpZWxkX21zZyIgICAgLy8gTWVsZHVuZ2VuIGJlaW0gWnVlY2tlbgorI2RlZmluZSBQX1VOV0lFTERfTVNHICAgInVud2llbGRfbXNnIiAgLy8gTWVsZHVuZ2VuIGJlaW0gV2Vnc3RlY2tlbgorCisvLyBXYW5uIGRlciBTcGllbGVyIGRhcyBsZXR6dGUgTWFsIGVpbmUgV2FmZmUgd2VnZ2VzdGVja3QgaGF0CisjZGVmaW5lIFBfVU5XSUVMRF9USU1FICAidW53aWVsZF90aW1lIgorCisvLyBNaXQgd2FzIGZ1ZXIgVGVjaG5pa2VuIGthbm4gZGllIFdhZmZlIGVpbmdlc2V0enQgd2VyZGVuPworI2RlZmluZSBQX1RFQ0hOSVFVRSAgICAgICAidGVjaG5pcXVlIgorCisvLyBJc3QgZGllIFdhZmZlIGJhbGFuY2llcnQgb2RlciBuaWNodD8KKyNkZWZpbmUgUF9CQUxBTkNFRF9XRUFQT04gImJhbGFuY2VkX3dlYXBvbiIKKworLyogLS0tLS0tLS0tLSBadWdlaG9lcmlnZSBEZWZpbmVzIC0tLS0tLS0tLS0gKi8KKworLy8gVGVjaG5pa2VuIGZ1ZXIgUF9URUNITklRVUUKKyNkZWZpbmUgVFFfVEhSQVNIICAgICAgICAgIlNjaGxhZ3RlY2huaWsiCisjZGVmaW5lIFRRX1RIUlVTVCAgICAgICAgICJTdG9zc3RlY2huaWsiCisjZGVmaW5lIFRRX1NUUk9LRSAgICAgICAgICJTdHJlaWNodGVjaG5payIKKyNkZWZpbmUgVFFfV0hJUCAgICAgICAgICAgIlBlaXRzY2h0ZWNobmlrIgorCisvLyBEZWZpbmVzIGZ1ZXIgYmFsYW5jaWVydC91bmJhbGFuY2llcnQKKyNkZWZpbmUgV1BfQkFMQU5DRUQgICAgICAgMQorI2RlZmluZSBXUF9VTkJBTEFOQ0VEICAgICAtMQorCisvKiAtLS0tLS0tLS0tIFBhcmllcndhZmZlbiAtLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFBfUEFSUlkgICAgICAgICAicGFycnkiICAgICAgICAvLyBkZWZpbmllcnQgZWluZSBQYXJpZXJ3YWZmZQorI2RlZmluZSBQX1BBUlJZX1dFQVBPTiAgInBhcnJ5X3dlYXBvbiIgLy8gV2VsY2hlIFBhcmllcndhZmZlIHdpcmQgYmVudXR6dD8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gRGVmaW5lcyBmdWVyIFBhcmllcndhZmZlbiAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFBBUlJZX05PVCAgMAorI2RlZmluZSBQQVJSWV9UT08gIDEKKyNkZWZpbmUgUEFSUllfT05MWSAyCisKKyNlbmRpZiAvLyBfX1dFQVBPTl9IX18KKworI2lmZGVmIE5FRURfUFJPVE9UWVBFUworCisjaWZuZGVmIF9fV0VBUE9OX0hfUFJPVE9fXworI2RlZmluZSBfX1dFQVBPTl9IX1BST1RPX18KKworLy8gcHJvdG90eXBlcworLy8gbm8gcHJvdG90eXBlcworCisjZW5kaWYgLy8gX19XRUFQT05fSF9QUk9UT19fCisKKyNlbmRpZgkvLyBORUVEX1BST1RPWVBFUwpkaWZmIC0tZ2l0IGEvc3lzL3dlYXBvbi9kZXNjcmlwdGlvbi5oIGIvc3lzL3dlYXBvbi9kZXNjcmlwdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5OWU0NjAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvd2VhcG9uL2Rlc2NyaXB0aW9uLmgKQEAgLTAsMCArMSwzNiBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHdlYXBvbi9kZXNjcmlwdGlvbi5oIC0tIERlc2NyaXB0aW9uIGZvciBkYW1hZ2VkIFdlYXBvbnMKKy8vCisvLyAkSWQ6IGRlc2NyaXB0aW9uLmggNjA4MSAyMDA2LTEwLTIzIDE0OjEyOjM0WiBaZXNzdHJhICQKKworI2lmbmRlZiBfX1dFQVBPTl9ERVNDUklQVElPTl9IX18KKyNkZWZpbmUgX19XRUFQT05fREVTQ1JJUFRJT05fSF9fCisKKy8vIHByb3BlcnRpZXMKKyNkZWZpbmUgUF9EQU1fREVTQyAgICAgICAgICAgImRhbV9kZXNjIgorCisvLyBEZWZhdWx0LU1lc3NhZ2VzCisjZGVmaW5lIERGTFRfREFNX0RFU0MgKHsiaXN0IGluIGVpbmVtIGhlcnZvcnJhZ2VuZGVuIFp1c3RhbmQiLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpc3QgaW4gZWluZW0gc2VociBndXRlbiBadXN0YW5kIixcCisgICAgICAgICAgICAgICAgICAgICAgICAiaXN0IGluIGVpbmVtIGd1dGVuIFp1c3RhbmQiLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaWVodCBub2NoIGdhbnogYnJhdWNoYmFyIGF1cyIsXAorICAgICAgICAgICAgICAgICAgICAgICAgIndpcmt0IGV0d2FzIGFiZ2VudXR6dCIsXAorICAgICAgICAgICAgICAgICAgICAgICAgIndpcmt0IHN0YXJrIGFiZ2VudXR6dCIsXAorICAgICAgICAgICAgICAgICAgICAgICAgImlzdCBnZXJhZGUgbm9jaCB6dSBnZWJyYXVjaGVuIixcCisgICAgICAgICAgICAgICAgICAgICAgICAid2lyZCBiYWxkIHNjaHJvdHRyZWlmIHNlaW4iLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpc3QgbnVyIG5vY2ggU2Nocm90dCIgfSkKKworI2VuZGlmIC8vIF9fV0VBUE9OX0RFU0NSSVBUSU9OX0hfXworCisjaWZkZWYgTkVFRF9QUk9UT1RZUEVTCisKKyNpZm5kZWYgX19XRUFQT05fREVTQ1JJUFRJT05fSF9QUk9UT19fCisjZGVmaW5lIF9fV0VBUE9OX0RFU0NSSVBUSU9OX0hfUFJPVE9fXworCisvLyBwcm90b3R5cGVzCitzdHJpbmcgZGFtX2Rlc2NyKCk7CisKKyNlbmRpZiAvLyBfX1dFQVBPTl9ERVNDUklQVElPTl9IX1BST1RPX18KKworI2VuZGlmIC8vIC8vIE5FRURfUFJPVE9ZUEVTCmRpZmYgLS1naXQgYS9zeXMvd2VybGlzdGUuaCBiL3N5cy93ZXJsaXN0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZjE4MTAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvd2VybGlzdGUuaApAQCAtMCwwICsxLDExIEBACisjaWZuZGVmIF9fX1dFUl9MSVNURV9IX18KKyNkZWZpbmUgX19fV0VSX0xJU1RFX0hfXworCisjZGVmaW5lIFdIT19TSE9SVCAgICAgMHgwMQorI2RlZmluZSBXSE9fVkVSVElDQUwgIDB4MDIKKyNkZWZpbmUgV0hPX0FMUEhBICAgICAweDA0CisKKy8vIEF1cyBTcGllbGVyc2ljaHQgZGFyc3RlbGxlbiwgYXVjaCB3ZW5uIGRlciBBdWZydWZlbmRlIE1hZ2llciBpc3QKKyNkZWZpbmUgV0hPX1BMQVlFUl9WSUVXICAgMHgwOAorCisjZW5kaWYgLy8gX19XRVJfTElTVEVfSF9fCmRpZmYgLS1naXQgYS9zeXMvd2l6bGlzdC5oIGIvc3lzL3dpemxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjliYWM3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL3dpemxpc3QuaApAQCAtMCwwICsxLDIyIEBACisjaWZuZGVmIExQQ19XSVpMSVNUX0hfCisjZGVmaW5lIExQQ19XSVpMSVNUX0hfIDEKKworLyogSW5kaWNlcyByZXR1cm5lZCBieSB3aXpsaXN0X2luZm8oKQorICovCisKKyNkZWZpbmUgV0xfTkFNRSAgICAgICAgICAgMCAgLyogV2l6YXJkIG5hbWUgKi8KKyNkZWZpbmUgV0xfQ09NTUFORFMgICAgICAgMSAgLyogTnVtYmVyIG9mIGNvbW1hbmRzIGV4ZWN1dGVkICovCisjZGVmaW5lIFdMX0NPU1QgICAgICAgICAgIDIgIC8qIFdlaWdodGVkIGV2YWxjb3N0IHNwZW50IG9uIHRoaXMgd2l6YXJkICovCisjZGVmaW5lIFdMX0dJR0FDT1NUICAgICAgIDMgIC8qIFdlaWdodGVkIGdpZ2EtZXZhbGNvc3Qgc3BlbnQgb24gdGhpcyB3aXphcmQgKi8KKyNkZWZpbmUgV0xfVE9UQUxfQ09TVCAgICAgNCAgLyogVG90YWwgZXZhbGNvc3Qgc3BlbnQgb24gdGhpcyB3aXphcmQgKi8KKyNkZWZpbmUgV0xfVE9UQUxfR0lHQUNPU1QgNSAgLyogVG90YWwgZ2lnYS1ldmFsY29zdCBzcGVudCBvbiB0aGlzIHdpemFyZCAqLworI2RlZmluZSBXTF9IRUFSVF9CRUFUUyAgICA2ICAvKiBIZWFydGJlYXRzIHNwZW50IG9uIHRoaXMgd2l6YXJkICovCisjZGVmaW5lIFdMX0NBTExfT1VUICAgICAgIDcgIC8qIHVuaW1wbGVtZW50ZWQgKi8KKyNkZWZpbmUgV0xfQVJSQVlfVE9UQUwgICAgOCAgLyogQXJyYXlzIGFjY291bnRlZCBmb3IgKi8KKyNkZWZpbmUgV0xfTUFQUElOR19UT1RBTCAgOSAgLyogTWFwcGluZ3MgYWNjb3VudGVkIGZvciAqLworI2RlZmluZSBXTF9TVFJVQ1RfVE9UQUwgIDEwICAvKiBTdHJ1Y3QgZWxlbWVudHMgYWNjb3VudGVkIGZvciAqLworI2RlZmluZSBXTF9FWFRSQSAgICAgICAgIDExICAvKiBFeHRyYSBXaXppbmZvLCBpZiBzZXQgKi8KKworI2RlZmluZSBXTF9TSVpFICAxMiAgLyogTnVtYmVyIG9mIGVudHJpZXMgKi8KKworI2VuZGlmIC8qIExQQ19XSVpMSVNUX0hfICovCmRpZmYgLS1naXQgYS9zeXMvd3d3LmggYi9zeXMvd3d3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgzYTY1OQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy93d3cuaApAQCAtMCwwICsxLDkwIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gd3d3LmggLS0gV29ybGQgV2lkZSBXZWIgU2VydmljZXMKKy8vCisvLyAkSWQ6IHd3dy5oIDc3MjQgMjAxMS0wMS0wNSAyMjozMjoyNlogWmVzc3RyYSAkCisKKy8vIGhvdyBkbyB5b3Ugc3BlbGwgeW91ciBtdWQgbmFtZQorI2lmbmRlZiBNVUROQU1FCisjIGRlZmluZSBNVUROQU1FICAgICAgICAiTW9yZ2VuR3JhdWVuIgorI2VuZGlmCisKKy8vIFBhdGhuYW1lcyB0byBkaWZmZXJlbnQgc2VydmljZXMKKy8vIElORVREIC0tIHRoZSBpbmV0IGRhZW1vbgorI2lmbmRlZiBJTkVURAorIyBkZWZpbmUgSU5FVEQgICAgICAgICAgIi9zZWN1cmUvaW5ldGQiCisjZW5kaWYKKworI2RlZmluZSBGSU5HRVIobikgICAgICAgICAgICAgICAiL3AvZGFlbW9uL2ZpbmdlciItPmZpbmdlcl9zaW5nbGUobikKKyNkZWZpbmUgV0hPICAgICAgICAgICAgICIvb2JqL3dlcmxpc3RlIi0+UXVlcnlXaG9MaXN0ZSgwLDAsMSkKKworLy8gVURQUEFUSCAtLSB3aGVyZXRoZSB1ZHAgcHJvZ3JhbXMgYXJlCisjZGVmaW5lIFVEUFBBVEggICAgICAgICAiL3NlY3VyZS91ZHAiCisKKy8vIHRoZSBXV1cgcmVxdWVzdCBzY2hlZHVsZXIKKyNkZWZpbmUgV1dXICAgICAgICAgICAgIChVRFBQQVRIKyIvd3d3IikKKyNkZWZpbmUgVElNRU9VVCAgICAgICAgIDUKKworLy8gd2hlciB0byBsb2cgYWxsIFdXVyBVRFAgUmVxdWVzdHMKKyNkZWZpbmUgV1dXTE9HICIvV1dXIiAgICAgICAgICAgICAgICAgICAvLyB1c2VkIGluIGxvZ19maWxlKCkKKworLy8gZGVmaW5lIE1VREhPU1QsIFdXVyBTRVJWRVIgYWRkcmVzcyBhbmQgdGhlIElDT04gVVJMCisjaWZuZGVmIE1VREhPU1QKKyMgZGVmaW5lIE1VREhPU1QgICAgICAgICAgICAgICAgIk1HLk11ZC5ERSIKKyNlbHNlCisjIHVuZGVmIE1VREhPU1QKKyMgZGVmaW5lIE1VREhPU1QgICAgICAgICAgICJNRy5NdWQuREUiCisjZW5kaWYKKyNkZWZpbmUgTVVEVVNFUiAgICAgICAgICJtdWQiCisjZGVmaW5lIFNFUlZFUiAgICAgICAgICAibWcubXVkLmRlIgorI2RlZmluZSBJQ09OUyAgICAgICAgICAgIi9pY29ucyIKKyNkZWZpbmUgTVVEV1dXICAgICAgICAgICIvY2dpLWJpbi9tdWR3d3ciCisKKy8vIGRlZmluZSB0aGUgYWRkcmVzcyBvZiB0aGUgTVVEIEhvc3QKKyNkZWZpbmUgSE9NRVBBR0UgICAgICAgICJodHRwOi8vIitTRVJWRVIrIi8iCisjZGVmaW5lIE1VRE1BSUwgICAgICAgICAibWFpbHRvOiIrTVVEVVNFUisiQCIrTVVESE9TVAorCisvLyBSZXF1ZXN0IFN5bnRheCB0b2tlbnMKKyNkZWZpbmUgUkVRICAgICAiUkVRIiAgICAgICAgICAgLy8gVFlQRSBvZiBSRVF1ZXN0CisKKy8vIFRoZSBXV1cgTmV3c3JlYWRlcgorIyBkZWZpbmUgUl9ORVdTICAgICAibmV3cyIgICAgICAgICAgICAgIC8vIC0gd2Ugd291bGQgbGlrZSB0byByZWFkIG5ld3MKKyMgIGRlZmluZSBHUk9VUCAgICAgICAiR1JPVVAiICAgLy8gICAqIHdoaWNoIG5ld3Nncm91cAorIyAgZGVmaW5lIEFSVElDTEUgICAgICJBUlRJQ0xFIiAvLyAgICogd2hpY2ggYXJ0aWNsZQorCisvLyBUaGUgV1dXIE1VRCBXYWxrZXIKKyMgZGVmaW5lIFJfV0FMSyAgICAgIndhbGsiICAgICAgICAgICAgICAvLyAtIG9yIG1heWJlIHdhbGsgYXJvdW5kIGEgYml0CisjICBkZWZpbmUgUk9PTSAgICAgICAgIlJPT00iICAgIC8vICAgKiBST09NIHRvIGVudGVyCisjICBkZWZpbmUgREVUQUlMICAgICAgIkRFVEFJTCIgIC8vICAgKiBERVRBSUwgdG8gZXhhbWluZQorCisvLyBUaGUgV1dXIEZpbmdlciBSZXF1ZXN0CisjIGRlZmluZSBSX0ZJTkdFUiAgICJmaW5nZXIiICAgIC8vIC0gZmluZ2VyIHNvbWVvbmUKKyMgIGRlZmluZSBVU0VSICAgICAgICAiVVNFUiIgICAgLy8gICAqIFVTRVIgdG8gcmV0cmlldmUgaW5mbyBmcm9tCisKKy8vIFRoZSBXV1cgV2hvbGlzdCBSZXF1ZXN0CisjIGRlZmluZSBSX1dITyAgICAgICJ3aG8iICAgICAgICAgICAgICAgLy8gLSBnZXQgdGhlIHdob2xpc3QKKworLy8gVGhlIFdXVyBJbnRlcm11ZCBHYXRld2F5CisjIGRlZmluZSBSX0lOVEVSTVVEICJpbnRlcm11ZCIgIC8vIC0gaW50ZXJtdWQgY29tbXVuaWNhdGlvbiByZXF1ZXN0CisjICBkZWZpbmUgSU1VRCAgICAgICAgIklNVUQiICAgIC8vICAgKiBUaGUgTVVEIHRvIHJlcXVlc3QgaW5mbyBmcm9tCisjICBkZWZpbmUgVFlQRSAgICAgICAgIlRZUEUiICAgIC8vICAgKiBUaGUgVFlQRSBvZiBSZXF1ZXN0CisjICBkZWZpbmUgSURBVEEgICAgICAgIkRBVEEiICAgIC8vICAgKiBleHRyYSBEQVRBIHRvIGFpZCByZXF1ZXN0CisjICBkZWZpbmUgUEFHRSAgICAgICAgIlBBR0UiICAgIC8vICAgKiBBbHBoYWJldGljYWwgcGFnZXMgb2YgbXVkcworCisjZGVmaW5lIEJBQ0sgICAgIkJBQ0siICAgICAgICAgIC8vIFBBR0UgdG8gZ28gQkFDSyB0bworCisjaWZuZGVmIE1VRE5BTUUKKyMgZGVmaW5lIE1VRE5BTUUgIlRlc3RNVUQiCisjZW5kaWYgLyogTVVETkFNRSAqLworCisvLyBQcm9wZXJ0eSBzcGVjaWZpYyBkZWZpbmVzCisjZGVmaW5lIFBfV1dXSU5GTyAgICAgICJ3d3dpbmZvIgorCisvLyBUaGUgZXJyb3IgbWVzc2FnZSB0byB2aWV3IGluIGFueSBjYXNlCisjZGVmaW5lIEVSUk9SKHN0cikgICAgICAiPEgxPkVpbiBGZWhsZXIgaXN0IGF1ZmdldHJldGVuITwvSDE+PEhSPiIrc3RyCisKKy8vIGRlYnVnZ2luZyAoY2hhbmdlIG5hbWUgdG8geW91ciBvd24hKQorI2RlZmluZSBETkFNRSAgICJoYXRlIgorI2RlZmluZSBERUJVRyhzdHIpIGlmKGZpbmRfcGxheWVyKEROQU1FKSkgXAorICAgICAgICAgICAgICAgICAgICAgdGVsbF9vYmplY3QoZmluZF9wbGF5ZXIoRE5BTUUpLCBzcHJpbnRmKCIlT1xuIiwgc3RyKSkKKy8vI3VuZGVmIERFQlVHCmRpZmYgLS1naXQgYS9zeXMveG1sLmggYi9zeXMveG1sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYzMDYzOAotLS0gL2Rldi9udWxsCisrKyBiL3N5cy94bWwuaApAQCAtMCwwICsxLDEwIEBACisjaWZuZGVmIFhNTF9IX18KKyNkZWZpbmUgWE1MX0hfXyAxCisKKyNkZWZpbmUgWE1MX1RBR19OQU1FICAgICAgICAgICAgICAgICAgICAwIC8qIE5hbWUgb2YgdGhlIGN1cnJlbnQgdGFnICovCisjZGVmaW5lIFhNTF9UQUdfQVRUUklCVVRFUyAgICAgICAgICAgICAgMSAvKiBBdHR0cmlidXRlcyBvZiB0aGUgY3VycmVudCB0YWcgKi8KKyNkZWZpbmUgWE1MX1RBR19DT05URU5UUyAgICAgICAgICAgICAgICAyIC8qIENvbnRlbnRzIG9mIHRoZSBjdXJyZW50IHRhZyAqLworCisjZGVmaW5lIFhNTF9UQUdfU0laRSAgICAgICAgICAgICAgICAgICAgMworCisjZW5kaWYK